ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI2YzMyLi4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0qLWFsbAotKi1jbwotKi1kaXJzCi0qLWRvbmUKLSotaW5zdGFsbC1pbmZvCi0qLXNyYwotKi1zdGFtcC0qCi0qLXRhZ2dlZAotYmxvY2tpdAotY2ZnLXBhcGVyLmluZm8KLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZS5hdXgKLWNvbmZpZ3VyZS5jcAotY29uZmlndXJlLmNwcwotY29uZmlndXJlLmR2aQotY29uZmlndXJlLmZuCi1jb25maWd1cmUuZm5zCi1jb25maWd1cmUua3kKLWNvbmZpZ3VyZS5reXMKLWNvbmZpZ3VyZS5sb2cKLWNvbmZpZ3VyZS5wZwotY29uZmlndXJlLnBncwotY29uZmlndXJlLnRvYwotY29uZmlndXJlLnRwCi1jb25maWd1cmUudHBzCi1jb25maWd1cmUudnIKLWNvbmZpZ3VyZS52cnMKLWRpci5pbmZvCi1NYWtlZmlsZQotbG9zdCtmb3VuZApkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NPUFlJTkcuTElCIGIvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhMTljNC4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2NjIwICswLDAgQEAKLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIGZvciBwai4KLQotMTk5OS0wOC0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3IgY29uZmlndXJpbmcgZm9yIGZyMzAuIAotCi0xOTk5LTA4LTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvIG5vdCBjb25maWd1cmUgb3IgYnVpbGQgbGQgZm9yIEFJWAotCXBsYXRmb3Jtcy4gIGxkIGlzIGtub3duIHRvIGJlIGJyb2tlbiBvbiB0aGVzZSBwbGF0Zm9ybXMuCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTERGTEFHUyk6IERlZmluZS4KLQotMTk5OS0wOC0wOCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDU2XS0qLW1pbmd3MzIqKTogRG9uJ3QgcHV0IGdwcm9mIGluCi0Jbm9jb25maWdkaXJzLgotCSgqLSotY3lnd2luKik6IExpa2V3aXNlLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbWtkZXA6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMpOiBBZGQgbWtkZXAuCi0JKEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IEFkZCBta2RlcC4KLQotCUZyb20gRWxpIFphcmV0c2tpaSA8ZWxpekBpcy5lbHRhLmNvLmlsPjoKLQkqIGNvbmZpZ3VyZSAodG1wZmlsZSk6IENoYW5nZSBjT05mJCQgdG8gY05mJCQgdG8gYXZvaWQgYW4gb3Zlcmx5Ci0JbG9uZyBmaWxlIG5hbWUgd2hlbiB1c2luZyBESkdQUCBvbiBNUy1ET1MuCi0KLTE5OTktMDctMzAgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrLXRhcmdldC1saWJpbyk6IFJlbW92ZSBhbGwtdGFyZ2V0LWxpYnN0ZGMrKwotCWRlcGVuZGVuY3kgYXMgdGhpcyBjYXVzZXMgIm1ha2UgY2hlY2siIHRvIGdsb2JhbGx5ICJtYWtlIGFsbCIKLQotMTk5OS0wNy0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChiaW51dGlscy50YXIuYnoyKTogRG9uJ3QgcGFzcyBtYWtlYWxsLmJhdCBhbmQKLQljb25maWd1cmUuYmF0IGluIFNVUFBPUlRfRklMRVMuCi0JKGdhcytiaW51dGlscy50YXIuYnoyKTogTGlrZXdpc2UuCi0KLQkqIG1ha2VhbGwuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmU6IEFkZCAtVyAtV2FsbCB0byB0aGUgZGVmYXVsdCBDRkxBR1Mgd2hlbiBjb21waWxpbmcgd2l0aAotCWdjYy4KLQotVGh1IEp1bCAgOCAxMjozMjoyMyAxOTk5ICBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbGQsIGJpbnV0aWxzICYgZ2FzIGZvciBocHBhKi0qLWxpbnV4LWdudSouCi0KLTE5OTktMDYtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbGQgb24gSVJJWDYuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGRpc3RyaWJ1dGlvbiB0YXJnZXRzIHRvIHVzZSBiemlwMiBpbnN0ZWFkIG9mCi0JZ3ppcC4KLQkoVEVYSU5GT19TVVBQT1JUKTogU2V0IHRvIGp1c3QgdGV4aW5mby90ZXhpbmZvLnRleC4KLQkodGF6KTogRG9uJ3QgdXNlIHRleGluZm8vZ3BsLnRleGluZm8gb3IgdGV4aW5mby9sZ3BsLnRleGluZm8uCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBtY29yZSB0YXJnZXQuCi0KLVN1biBNYXkgMzAgMTY6MDM6MTYgMTk5OSAgQ29ydCBEb3VnYW4gIDxjb3J0QGNzLm5tdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzcyAocHBjLSotbGludXgtZ251KTogQWxzbyB1c2UgbGQgZW11bCBlbGYzMnBwY2xpbnV4LgotCi0xOTk5LTA1LTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBFR0NTIHZlcnNpb24uCi0KLTE5OTktMDQtMzAgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBbbW9kZSBsaW5rXSBBbHdheXMgdXNlIENDIGdpdmVuIGJ5IGx0Y29uZmlnLgotCi0xOTk5LTA0LTIzICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMmYuCi0KLTE5OTktMDQtMjAgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgbGlic3R1YiBmb3IgYXJtLWVsZiB0YXJnZXRzLgotCShub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBhbnkgYnNwIHN0dWZmIGZvciBmb3IgYXJtLW9hYmkgdGFyZ2V0cy4KLQlCYWQgbWVyZ2UgcmVtb3ZlZCB0aGVzZSB0d28gY2hhbmdlcy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpPzg2LSotYmVvcyopOiBEbyBjb25maWcgZ3BlcmY7IGRvbid0IGNvbmZpZwotCWdkYiwgbmV3bGliLCBvciBsaWJnbG9zcy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIG1jb3JlIHRhcmdldHMuCi0KLTE5OTktMDQtMDcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKik6IFVzZSBjb25maWcvbXQtZDMwdiBhcyBtYWtlZmlsZSBmcmFnbWVudCwKLQlub3QgbXQtb3NwYWNlLCBpbiBvcmRlciB0byBzaHV0IHVwIGFzc2VtYmxlciB3YXJuaW5nIGFib3V0IHVzaW5nCi0Jc3ltYm9scyB0aGF0IGFyZSBuYW1lZCB0aGUgc2FtZSBhcyByZWdpc3RlcnMuCi0KLTE5OTktMDQtMDcgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWN5Z21vbik6IEFkZGVkIGFsbC10YXJnZXQtYnNwIHRvIHRoZQotCWRlcGVuZGVuY3kgbGlzdCBmb3IgYWxsLXRhcmdldC1jeWdtb24uCi0KLTE5OTktMDQtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBDaGVjayAkaG9zdCwgbm90ICR0YXJnZXQsIGZvciBzZWxlY3RpdmUgbXVsdGlsaWJzLgotCShhcm0tKi0qKTogQWxsb3cgZGlzYWJsaW5nIG9mIGJpZW5kaWFuLCBoL3cgZnAsIDI2IGJpdCBhcGNzLAotCXRodW1iIGludGVyd29ya2luZywgYW5kIHVuZGVyc2NvcmUgcHJlZml4IG11bHRpbGlicy4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG1pc3Npbmc6IFVwZGF0ZSB0byB2ZXJzaW9uIGZyb20gY3VycmVudCBhdXRvbWFrZS4KLQotRnJpIEFwciAgMiAxNToxMTozMiAxOTk5ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogUmVtb3ZlZC4KLQotCSogY29uZmlndXJlLmluIChneHhfaW5jbHVkZV9kaXIpOiBIYW5kbGUgaXQuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLTE5OTktMDMtMjkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViIChtaXBzNjR2cjQxMTEsbWlwczY0dnI0MTExZWwpIEFkZC4KLQotMTk5OS0wMy0yMSAgQmVuIEVsbGlzdG9uICA8YmplQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IENvcnJlY3QgdHlwbyBmb3IgZGV0ZWN0aW5nIEVMRiBvbiBGcmVlQlNELgotCi1UaHUgTWFyIDE4IDAwOjE3OjUwIDE5OTkgIE1hcmsgRWxicmVjaHQgPHNub3diYWxsM0B1c2EubmV0PgotCi0JKiBjb25maWcvbWgtZ28zMjogRGVsZXRlLgotCSogY29uZmlnL21oLWRqZ3BwOiBOZXcuIFJlbmFtZWQgZnJvbSBtaC1nbzMyLgotCSogY29uZmlndXJlLmluIChwYy1tc2Rvc2RqZ3BwKTogU2V0IGhvc3RfbWFrZWZpbGVfZnJhZyB0bwotCWNvbmZpZy9taC1kamdwcC4KLQotVGh1IE1hciAxMSAxODozNzoyMyAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC1ic3ApOiBBZGRlZCBhbGwtZ2NjIGFsbC1iaW51dGlscyBhbmQKLQlhbGwtdGFyZ2V0LW5ld2xpYiB0byBkZXBlbmRlbmN5IGxpc3QgZm9yIGFsbC10YXJnZXQtYnNwLgotCi1UaHUgTWFyIDExIDAxOjE5OjMxIDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuc3ViOiBBZGQgaTM4Ni11d2luIHN1cHBvcnQuCi0JKiBjb25maWcuZ3Vlc3M6IExpa2V3aXNlLgotCi1UaHUgTWFyIDExIDAxOjA3OjU1IDE5OTkgIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgotCi0JKiBjb25maWd1cmUuaW46IGNsZWFudXAsIGFkZCBtaC0qcGljIGhhbmRsaW5nIGZvciBhcm0sIHNwZWNpYWwKLQljYXNlIHBvd2VycGMqLSotYWl4KgotCi1XZWQgTWFyIDEwIDE4OjM1OjA3IDE5OTkgIEplZmYgSm9obnN0b24gIDxqam9obnN0bkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZWQgdGFyZ2V0LWxpYmdsb3NzIHNvIGxpYm5vc3lzLmEKLQljYW4gYmUgYnVpbHQuCi0KLVdlZCBNYXIgMTAgMTc6Mzk6MDkgMTk5OSAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBic3Agc3VwcG9ydCB0byBhcm0tKi1jb2ZmIGFuZCBhcm0tKi1lbGYKLSAJdGFyZ2V0cy4KLQotMTk5OS0wMy0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVuYW1lIENZR05VUyBMT0NBTCB0byBFR0NTIExPQ0FMCi0KLVN1biBGZWIgMjggMDI6MjA6MDAgMTk5OSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQ2hlY2sgZm9yICJjeWd3aW4qIiByYXRoZXIgdGhhbiAiY3lnd2luMzIqIgotCi0xOTk5LTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBGaXggdHlwbyBpbiBhcm0gcmVjb2duaXRpb24uCi0KLVdlZCBGZWIgMjQgMTM6NTE6NDAgMTk5OSAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBDaGFuZ2VkIHRhcmdldF9jb25maWdkaXJzIHRvCi0JaW5jbHVkZSB0YXJnZXQtYnNwIG9ubHkgZm9yIG02OGstKi1lbGYqIGFuZCBtNjhrLSotY29mZioKLQlyYXRoZXIgdGhhbiBtNjhrLSotKiBzaW5jZSBpdCBpcyBub3Qga25vd24gdG8gd29yayBvbgotCW02OGstYW91dC4gRGl0dG8gZm9yIGFybS0qLSpvYWJpLgotCi1XZWQgRmViIDI0IDEyOjUyOjE3IDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotd2luZG93cyopOiBSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgotCSogY29uZmlnL21oLXdpbmRvd3M6IERpdHRvLgotCi0xOTk5LTAyLTE5ICBCZW4gRWxsaXN0b24gPGJqZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IEF1dG9tYXRpY2FsbHkgcmVjb2duaXNlIEVMRiBvbiBGcmVlQlNELiBGcm9tIE5pYWxsCi0JU21hcnQgYW5kIGltcHJvdmVkIGJ5IEFuZHJldyBDYWduZXkuCi0KLVRodSBGZWIgMTggMTk6NTU6MDkgMTk5OSAgTWFyYyBFc3BpZSA8ZXNwaWVAY3ZzLm9wZW5ic2Qub3JnPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBvcGVuYnNkLSotaHBwYS4KLQotV2VkIEZlYiAxNyAwMTozODo1OSAxOTk5ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIE1ha2VmaWxlLmluIChSRUFMTFlfU0VUX0xJQl9QQVRIKTogQXBwZW5kICQkJChSUEFUSF9FTlZWQVIpCi0Jb25seSBpZiBpdCBpcyBub3QgZW1wdHkuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBmcm9tOiBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQkKLQkqIGNvbmZpZy5ndWVzczogTW9kaWZpZWQgdG8gcmVjb2duaXplIHVuYW1lJ3MgYXJtdiogc3ludGF4LiAKLQotCSogY29uZmlnLnN1YjogTW9kaWZpZWQgdG8gcmVjb2duaXplIHVuYW1lJ3MgYXJtdiogc3ludGF4LgotCi0xOTk5LTAyLTE3ICBNYXJrIFNhbHRlciAgPG1zYWx0ZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCB0YXJnZXQtYnNwIGZvciBzcGFyY2xpdGUuCi0KLU1vbiBGZWIgIDggMTQ6MTc6MjQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGFscGhhcGNhNVs2N10gYW5kIHVwIHRvIGFscGhhZXY4LgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gcG9ydC4KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gdGFyZ2V0LgotCi1TdW4gRmViICA3IDE4OjAxOjU0IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCQotCSogY29uZmlndXJlLmluICgqLSotY3lnd2luMzIqKTogVXNlIGNvbmZpZy9taC1jeWd3aW4gaW5zdGVhZCBvZgotCXRoZSBvbGQgbmFtZSBjb25maWcvbWgtY3lnd2luMzIuCi0JRW5hYmxlIHRleGluZm8uCi0KLVRodSBGZWIgIDQgMjA6NDM6MjUgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvIGJ1aWxkIGxkIGZvciBpeDg2IFNvbGFyaXMuCi0KLVR1ZSBGZWIgIDIgMTk6NDY6NDAgMTk5OSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogIFNldCBBUiB0byAkQVIgaW5zdGVhZCBvZgotCSRBUl9GT1JfVEFSR0VULiAgTGlrZXdpc2UgZm9yIFJBTkxJQi4KLQotVHVlIEZlYiAgMiAyMDowNTowNSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcuc3ViIChvYWJpKTogIFJlY29nbml6ZS4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGFybS0qLW9hYmkpOiAgSGFuZGxlLgotCi1TYXQgSmFuIDMwIDA2OjA5OjAwIDE5OTkgIFJvYmVydCBMaXBlICAocm9iZXJ0bGlwZUB1c2EubmV0KQotCi0JKiBjb25maWcuZ3Vlc3M6IEltcHJvdmUgZGV0ZWN0aW9uIG9mIGk2ODYgb24gVW5peFdhcmUgNy4KLQotU2F0IEphbiAzMCAwODowNDowMCAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgaTM4Ni1wYy1pbnRlcml4LgotCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlnL21oLWludGVyaXg6IE5ldyBmaWxlLgotCi1Nb24gSmFuIDE4IDEzOjU5OjIwIDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgdW5uZWVkZWQgYWxsLXRhcmdldC1saWJpbyBmcm9tCi0JZnJvbSBhbGwtdGFyZ2V0LXdpbnN1cCB0YXJnZXQgc2luY2UgaXQgaXMgbm93IHVubmVlZGVkLgotCUFkZCBhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgaW4gaXRzIHBsYWNlIHNpbmNlIGl0IGlzIG5vdwotCW5lZWRlZC4KLQotV2VkIERlYyAzMCAyMDozNDo1MiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IG1ha2VmaWxlIHN0dWIgZm9yIGN5Z3dpbiB0YXJnZXQgaXMgcHJvYmFibHkKLQl1bm5lY2Vzc2FyeS4gIFJlbW92ZSBpdCBmb3Igbm93LgotCSogY29uZmlnL210LWN5Z3dpbjogUmVtb3ZlLgotCi1XZWQgRGVjIDMwIDAxOjEzOjAzIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogbGlidGVybWNhcC5hIHNob3VsZCBiZSBidWlsdCB3aGVuIGN5Z3dpbiBpcyB0aGUKLQl0YXJnZXQgYXMgd2VsbCBhcyB0aGUgaG9zdC4KLQkqIGNvbmZpZy5ndWVzczogQWxsb3cgbWl4ZWQgY2FzZSBpbiBjeWd3aW4gdW5hbWUgb3V0cHV0LgotCSogTWFrZWZpbGUuaW46IEFkZCBsaWJ0ZXJtY2FwIHRhcmdldC4KLQkqIGNvbmZpZy9tdC1jeWd3aW46IE5ldyBmaWxlLiAgbGlidGVybWNhcCB0YXJnZXQgaW5mby4KLQotVHVlIERlYyAxNSAxNzowMjo1OCAxOTk4ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY3lnbW9uIGZvciB4ODYtY29mZiBhbmQgeDg2LWVsZi4gQ29uZmlndXJlCi0gCWN5Z21vbiBmb3IgYWxsIHNwYXJjbGl0ZSB0YXJnZXRzLCByZWdhcmRsZXNzIG9mIG9iamVjdCBmb3JtYXQuCi0KLTE5OTgtMTItMTUgIE1hcmsgU2FsdGVyICA8bXNhbHRlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIHRhcmdldC1ic3AgZm9yIHNldmVyYWwgdGFyZ2V0IGFyY2hpdGVjdHVyZXMuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBydWxlcyBmb3IgYnNwLgotCi1XZWQgRGVjIDIzIDAwOjIwOjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQ2xlYW4gdXAgaGFuZGxpbmcgb2YgaHBwYTIuMC4KLQotVHVlIERlYyAyMiAyMzo1NjozMSAxOTk4ICBSb2RuZXkgQnJvd24gIChyb2RuZXlicm93bkBwbXNjLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgQyBjb2RlIHRvIGlkZW50aWZ5IG1vcmUgSFAgbWFjaGluZXMuCi0KLVRodSBEZWMgMTcgMDE6MjI6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgaHBwYTIuMC4KLQotRnJpIERlYyAgNCAwMTozNDowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogSW1wcm92ZSBkZXRlY3Rpb24gb2YgaHBwYTIuMCBwcm9jZXNzb3JzLgotCi1GcmkgRGVjICA0IDAxOjMzOjA1IDE5OTggIE5pYWxsIFNtYXJ0IDxuaWFsbHNAZXVyaXN0aXguaWU+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEZyZWVCU0QgdXNpbmcgRUxGIGF1dG9tYXRpY2FsbHkuCi0KLTE5OTgtMTEtMjYgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChza2lwLXRoaXMtZGlyKTogQWRkIGhhbmRsaW5nIGZvciBuZXcgc2hlbGwgc2NyaXB0LCB3aGljaAotCW1pZ2h0IGJlIGNyZWF0ZWQgYnkgYSBzdWItZGlyZWN0b3J5J3MgY29uZmlndXJlIHRvIGluZGljYXRlLCB0aGlzIHBhcnRpY3VsYXIKLQlkaXJlY3RvcnkgaXMgInVud2FudGVkIi4KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBMaWtld2lzZS4KLQotCi1XZWQgTm92IDE4IDE4OjI4OjQ1IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBpbXBvcnQgZnJvbSBsaWJ0b29sLCBhZnRlciBjaGFuZ2luZyBsaWJ0b29sIHRvCi0JYWNjb3VudCBmb3IgdGhlIGN5Z3dpbiBuYW1lIGNoYW5nZS4KLQotV2VkIE5vdiAxOCAxODowOToxNCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ0NfRk9SX1RBUkdFVCBhbmQgQ1hYX0ZPUl9UQVJHRVQgc2hvdWxkIGFsc28KLQlpbmNsdWRlIG5ld2xpYi9saWJjL3N5cy9jeWd3aW4gYW5kIG5ld2xpYi9saWJjL3N5cy9jeWd3aW4zMi4KLQotV2VkIE5vdiAxOCAyMDoxMzoyOSAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBsaWJ0ZXJtY2FwIHRvIGxpc3Qgb2YgY3lnd2luIGRlcGVuZGVuY2llcy4KLQotVHVlIE5vdiAxNyAxNjo1Nzo1MSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogTWFrZWZpbGUuaW46IG1vZGlmeSBDQ19GT1JfVEFSR0VUIGFuZCBDWFhfRk9SX1RBUkdFVCBzbyB0aGF0Ci0gICAgICAgIHRoZXkgaW5jbHVkZSB3aW5zdXAvaW5jbHVkZSB3aGVuIGl0J3MgYSBjeWd3aW4gdGFyZ2V0LgotCi0xOTk4LTExLTEyICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZGVkIHppcC4KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmphdmEpOiBEZXBlbmQgb24gYWxsLXppcC4KLQkoYWxsLXppcCk6IE5ldyB0YXJnZXQuCi0JKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLXppcC4KLQkoTkFUSVZFX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay16aXAuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtemlwLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4temlwLgotCi1UaHUgTm92IDEyIDE3OjI3OjIxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBsb3NlICIzMiIgZnJvbSBjb21tZW50IGFib3V0IGN5Z3dpbi4KLQotVGh1IE5vdiAgNSAxNTowMDozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAtT3MgdG8gYnVpbGQgdGFyZ2V0IGxpYnJhcmllcyBmb3IgdGhlIGZyMzAuCi0KLVdlZCBOb3YgIDQgMTg6NDk6NDMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgZnIzMC4KLQotTW9uIE5vdiAgMiAxNToxOTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkcm9wICIzMiIgZnJvbSBjb25maWcvbWgtY3lnd2luMzIuICBDaGVjawotCWN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0JKiBjb25maWcuc3ViOiBDaGVjayBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqLgotCi0xOTk4LTEwLTIwICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIGNvbmZpZ3VyZS5pbjogQWRkIHRoZSBhYmlsaXR5IHRvIHVzZSB0Y2w4LjEgYW5kIHRrOC4xCi0JaWYgZGVzaXJlZC4KLQotU3VuIE9jdCAxOCAxODozNDo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5pZiAoY3h4X2ludGVyZmFjZSwgbGlic3RkY3h4X2ludGVyZmFjZSk6IERvIG5vdCB0cnkgdG8gc2V0Ci0JdGhlc2UgaWYgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyB0byBub3QgZXhpc3QuCi0KLVdlZCBPY3QgMTQgMTA6Mjk6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGNvbmZpZy5pZi4KLQotVHVlIE9jdCAxMyAwOToxNzowNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEJyaW5nIGJhY2sgbG9zdCBzcGFyY3Y5LgotCi1XZWQgU2VwIDMwIDIyOjIwOjUwIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIGlbMzQ1NjddODYtcGMtdWRrLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotV2VkIFNlcCAzMCAxOToyMzo0OCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGJ6aXAyIHBhY2thZ2UgYnVpbGRpbmcgYml0cyBmb3IgdXNlcgotCXRvb2xzIG1vZHVsZQotCSogY29uZmlndXJlLmluOiBkaXR0bwotCi0xOTk4LTA5LTMwICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkgKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBSZW1vdmUgZHVwbGljYXRlIGxpbmUuCi0KLVR1ZSBTZXAgMjkgMjI6NDU6NDEgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWF1dG9tYWtlKTogZml4IGRlcGVuZGVuY2llcy4KLQotTW9uIFNlcCAyOCAwNDowNDoyNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWlub3IgY2xlYW51cHMgZm9yIGJ1aWxkaW5nIGluIHRoZSAkKHRhcmdldF9hbGlhcykKLQlzdWJkaXIuCi0KLTE5OTgtMDktMjIgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IFNldCByIGFuZCBzIGJlZm9yZSBtYWtlIGFsbC4gIFVzZQotCUJBU0VfRkxBR1NfVE9fUEFTUyBpbiBtYWtlIGFsbC4KLQkoY3Jvc3MpOiBMaWtld2lzZS4KLQotMTk5OC0wOS0yMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IFBhc3MgVEFSR0VUX0ZMQUdTX1RPX1BBU1MgdG8gYG1ha2UgYWxsJy4KLQotCi1TdW4gU2VwIDIwIDAwOjEzOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgotCi0xOTk4LTA5LTE5ICBNaWNoYWVsIEhheWVzICA8bS5oYXllc0BlbGVjLmNhbnRlcmJ1cnkuYWMubno+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBDNHggdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotMTk5OC0wOS0xMyAgRGF2aWQgUy4gTWlsbGVyICA8ZGF2ZW1AcGllcmRvbC5jb2JhbHRtaWNyby5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBzcGFyY3Y5IGp1c3QgbGlrZSBzcGFyYzY0LgotCi1XZWQgU2VwICA5IDE1OjQ0OjUyIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNYXRjaCAiUGVudCBJSSIgb3IgIlBlbnRJSSIgZm9yIE9wZW5TZXJ2ZXIuCi0KLVR1ZSBTZXAgIDggMDE6MTg6MzkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IENvcnJlY3RseSBpZGVudGlmeSBQZW50aXVtIElJIHNjbyBib3hlcy4KLQotCSogY29uZmlnLmd1ZXNzOiBGaXggInRyIiBjb2RlLiAgRnJvbSBXZWl3ZW4gTGl1LgotCi1TYXQgU2VwICA1IDEzOjU2OjUyIDE5OTggIEpvaG4gSHVnaGVzICA8am9obkBDYWx2YS5DT00+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbm90IGFzc3VtZSB4ODYtc3ZyNCBvciB4ODYtdW5peHdhcmUgY2FuIGhhbmRsZQotCXN0YWJzLgotCi1TYXQgU2VwICA1IDAyOjEyOjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTKTogQWRkIGxpYmNoaWxsLgotCShBTExfVEFSR0VUX01PRFVMRVMpOiBBZGQgYWxsLXRhcmdldC1saWJjaGlsbC4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTLCBDSEVDS19UQVJHRVRfTU9EVUxFUyk6IFNpbWlsYXJseS4KLQkoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUywgQ0xFQU5fVEFSR0VUX01PRFVMRVMpOiBTaW1pbGFybHkuCi0JKGFsbC10YXJnZXQtbGliY2hpbGwpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IEFkZCBsaWJjaGlsbC4KLQotU3VuIEF1ZyAzMCAyMjoyNzowMiAxOTk4ICBMdXR6IFdvaGxyYWIgPGx1dHoud29obHJhYkBpbmZvcm1hdGlrLnR1LWNoZW1uaXR6LmRlPgotCi0JKiBjb25maWcuZ3Vlc3M6IEF2b2lkIGFzc3VtcHRpb25zIGFib3V0ICJ0ciIgYmVoYXZlcyB3aGVuCi0JTEFORyBpcyBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gRW5nbGlzaC4KLQotU3VuIEF1ZyAzMCAyMjoxNDo0NCAxOTk4ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogQ2hhbmdlZCB0bwotCScke3ByZWZpeH0vaW5jbHVkZS9nKysnLSR7bGlic3RkY3h4X2ludGVyZmFjZX0uCi0KLQkqIGNvbmZpZy5pZjogTmV3IHRvIGRldGVybWluZSB0aGUgaW50ZXJmYWNlcy4KLQotU3VuIEF1ZyAzMCAyMToxNToxOSAxOTk4ICBNYXJrIEtsZWluIChta2xlaW5AZGlzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBEZXRlY3QgYW5kIGhhbmRsZSBNUEUvSVguCi0JKiBjb25maWcuc3ViOiBEZWFsIHdpdGggTVBFL0lYLgotCi1TYXQgQXVnIDI5IDE0OjMyOjU1IDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1haXg0My4KLQotMTk5OC0wNy0yOSAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmU6IEZpeCAtLXdpdGhvdXQvLS1kaXNhYmxlIGNhc2VzIGZvciBneHgtaW5jbHVkZS1kaXIuCi0KLUZyaSBBdWcgMjggMTI6Mjg6MjYgMTk5OCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+Ci0KLQkqIG1kYXRhLXNoOiAgSW1wb3J0ZWQuICBOZWVkZWQgZm9yIGF1dG9tYWtlIHN1cHBvcnQuCi0KLVRodSBBdWcgMTMgMTI6NDk6MjkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogVHJ5ICJjaG1vZCAtUiBvZz11IC4iIGJlZm9yZSAKLQkiY2htb2Qgb2c9dSBgZmluZCAuIC1wcmludGAiLgotCi1GcmkgSnVsIDMxIDA5OjM4OjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBBZGQgYXJtLWVsZiBhbmQgdGh1bWItZWxmIHN1cHBvcnQuCi0KLU1vbiBKdWwgMjcgMTY6MjM6NTggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVuZG8gcHJldmlvdXMgcGF0Y2guCi0KLUZyaSBKdWwgMjQgMTk6NTU6MjQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfVEFSR0VUKTogTW92ZSBFWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMKLQl0byBoZXJlIC4uLgotCShpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMpOiBhbmQgaGVyZQotCShJTlNUQUxMX01PRFVMRVMpOiAuLi4gZnJvbSBoZXJlLgotCi1GcmkgSnVsIDI0IDE3OjAxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBGU0YuCi0KLQkqIGNvbmZpZy5ndWVzczogTWVyZ2Ugd2l0aCBGU0YuCi0KLUZyaSBKdWwgMjQgMDg6NDM6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChleHRyYWNvbmZpZ2RpcnMpOiBOZXcgdmFyaWFibGUuCi0JKFNVQkRJUlMpOiBBZGQgZXh0cmFjb25maWdkaXJzIGFuZCByZWN1cnNlIG9uIHRoZW0gdG9vLgotCSogTWFrZWZpbGUuaW4gKGFsbCk6IE1vdmUgaGlnaGVyIGluIGZpbGUuCi0JKEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTKTogTmV3IHZhcmlhYmxlLgotCShFWFRSQV9UQVJHRVRfSE9TVF97SU5TVEFMTCxDSEVDS31fTU9EVUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKEFMTF9NT0RVTEVTKTogQWRkIEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkIEVYVFJBX1RBUkdFVF9IT1NUX0NIRUNLX01PRFVMRVMuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZCBFWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMuCi0KLTE5OTgtMDctMjMgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmphdmEpOiBEZXBlbmQgb24gYWxsLWdjYyBhbmQKLQlhbGwtdGFyZ2V0LW5ld2xpYi4KLQkoY29uZmlndXJlLXRhcmdldC1saWJqYXZhKTogRGVwZW5kIG9uICQoQUxMX0dDQykuCi0KLVNhdCBKdWwgMTggMTQ6MzI6NDMgQ0RUIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAoKi1wYy1zY28zLjJ2NSkgQWRkIGRldGVjdGlvbiBmb3IgUGVudGl1bSBJSS4KLQkoKi1wYy11bml4d2FyZTcpIEFkZCBkZXRlY3Rpb24gZm9yIFBlbnRpdW0gSUksIFBlbnRpdW0gUHJvLgotCi1GcmkgSnVsIDE3IDEzOjMwOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeWx3cmFwOiBDaGFuZ2UgYWJzb2x1dGUgcGF0aCBjaGVja3MgdG8gY2hlY2sgZm9yIERPUyBzdHlsZSBwYXRoCi0JbmFtZXMuCi0KLQkqIHlsd3JhcDogRG9uJ3QgdXNlIGEgZnVsbCBwYXRoIG5hbWUgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIGluIHRoZQotCXNhbWUgZGlyZWN0b3J5LiAgRnJvbSBoamxAbHVjb24ub3JnIChILkouIEx1KS4KLQotCSogY29uZmlnLW1sLmluOiBEZWZhdWx0IHRvIGJlaW5nIHZlcmJvc2UsIHRvIG1hdGNoIEZlYiAxOCBjaGFuZ2UgdG8KLQljb25maWd1cmUuCi0KLVRodSBKdWwgMTYgMTI6Mjk6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQnJvdWdodCBvdmVyIGZyb20gZWdjczoKLQotCVNhdCBKdW4gMjcgMjI6NDY6MzIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBTZXQgdG8gJHt0YXJnZXRfYWxpYXN9IGluc3RlYWQKLQlvZiAibGlicmFyaWVzIi4KLQotCU1vbiBTZXAgIDEgMTY6NDU6NDQgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBTZXQgdG8gbGlicmFyaWVzIGlmIGVuYWJsZV9tdWx0aWxpYi4KLQotV2VkIEp1bCAxNSAwMTowMDo1NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBJZiB0aGVyZSBhcmUgYW55Ci0JbXVsdGlsaWJzLCBmb3JjZSByZWNvbmZpZ3VyYXRpb24gdGhlIGZpcnN0IHRpbWUgd2UgY3JlYXRlCi0JbXVsdGlsaWIub3V0IGluIGEgc3ViZGlyZWN0b3J5LCBpbiBjYXNlIFRBUkdFVF9TVUJESVIgaXMgYC4nLgotCi1UdWUgSnVsIDE0IDIzOjQxOjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTdHJpcCBhbnkgLS1ubyBvcHRpb24gZnJvbSBDT05GSUdfQVJHVU1FTlRTLCB0bwotCWF2b2lkIGNvbmZ1c2lvbiB3aXRoIC0tbm8tcmVjdXJzaW9uLgotCi1UdWUgSnVsIDE0IDE1OjM3OjQxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogV2luMzIgaG9zdHMgc2hvdWxkbid0IHVzZSBpbnN0YWxsIC14Ci0JKiBpbnN0YWxsLXNoOiByZW1vdmUgLXggb3B0aW9uLCBhbmQgc3BlY2lhbCAuZXhlLWhhbmRsaW5nCi0JaGFjay4KLQotVHVlIEp1bCAxNCAxNToyODo0MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpNTg2LXBjLWJlb3MuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIHNvbWUgYml0cyBmb3IgYmVvcy4KLQotVHVlIEp1bCAxNCAxMzoyMjoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgQ0MgaXMgc2V0IGJ1dCBDRkxBR1MgaXMgbm90LCBhbmQgQ0MgaXMgZ2NjLCBtYWtlCi0JQ0ZMQUdTIGRlZmF1bHQgdG8gLU8yLgotCi0JKiBsdG1haW4uc2g6IEFkZCBzb21lIGhhY2tzIHRvIG1ha2UgU3VuT1MgLS1lbmFibGUtc2hhcmVkIHdvcmsKLQl3aGVuIHVzaW5nIEdOVSBsZC4KLQotRnJpIEp1bCAxMCAxMzoxODoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0bWFpbi5zaDogQ29ycmVjdCBpbnN0YWxsIHdoZW4gdXNpbmcgYSBkaWZmZXJlbnQgc2hlbGwuCi0KLVR1ZSBKdWwgIDcgMTU6MjQ6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgdG8gbGlidG9vbCAxLjJiLgotCi1UaHUgSnVsICAyIDEzOjU3OjM2IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcm1pLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSB0byBidWlsZCBiaW51dGlscy9tYWtlZmlsZS52bXMuICBBZGQgaW5zdGFsbAotCXRhcmdldC4KLQotV2VkIEp1bCAgMSAxNjo0NToyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgdG8gY29ycmVjdCBBSVggaGFuZGxpbmcuCi0KLVNhdCBKdW4gMjcgMjI6NDY6MzIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogQWRkIFRBUkdFVF9TVUJESVIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byAke3RhcmdldF9hbGlhc30gaW5zdGVhZAotCW9mICJsaWJyYXJpZXMiLgotCi0xOTk4LTA2LTI2ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBBZGQgZ2NjX3ZlcnNpb25fdHJpZ2dlci4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgb24gJChnY2NfdmVyc2lvbl90cmlnZ2VyKS4KLQotCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IENoYW5nZSBkZWZhdWx0IGluaXRpYWxpemVyIHRvIGVtcHR5Ci0Jc3RyaW5nLgotCShnY2NfdmVyc2lvbl90cmlnZ2VyKTogTmV3IHZhcmlhYmxlOyBwYXNzIHRoaXMgdmFyaWFibGUgZG93bgotCXRvIHN1YmRpciBjb25maWd1cmVzIHRvIGVuYWJsZSB0aGVtIGNoZWNraW5nIGdjYydzIHZlcnNpb24KLQl0aGVtc2VsdmVzLiBFbWl0IG1ha2UgbWFjcm9zIGZvciBib3RoIGdjY192ZXJzaW9uIHZhcnMuCi0JKHRvcHNyY2Rpcik6IEluaXRpYWxpemUgcmVsaWFibHkuCi0JKHJlY3Vyc2lvbiBsaW5lKTogUmVtb3ZlIC0td2l0aC1nY2MtdmVyc2lvbj0ke2djY192ZXJzaW9ufS4KLQotMTk5OC0wNi0yNCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyk6IEltcGxlbWVudCBuZXcgZmxhZwotCS0tZW5hYmxlLXZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzIHdoaWNoIGluc3RhbGxzIEMrKyBydW50aW1lIHN0dWZmCi0JaW4gJChsaWJzdWJkaXIpOyBlbWl0IGRlZmluaXRpb24gaW4gZWFjaCBnZW5lcmF0ZWQgTWFrZWZpbGUuCi0JKGd4eF9pbmNsdWRlX2Rpcik6IEluaXRpYWxpemUgZGVwZW5kaW5nIG9uCi0JJGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicy4KLQotMTk5OC0wNi0yNCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKGdjY192ZXJzaW9uKTogSW5pdGlhbGl6ZSBwcm9wZXJseSBkZXBlbmRpbmcgb24KLQlob3cgYW5kIHdoZXJlIGNvbmZpZ3VyZSBpcyBzdGFydGVkLgotCShyZWN1cnNpb24gbGluZSk6IFBhc3MgYSAtLXdpdGgtZ2NjLXZlcnNpb249JHtnY2NfdmVyc2lvbn0KLQl0byBjb25maWd1cmVzIGluIHN1YmRpcnMuCi0KLVdlZCBKdW4gMjQgMTY6MDE6NTkgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgY29uZmlndXJlIHBhdHRlcm4gZm9yIG1pcHMgdHgzOQotIAljeWdtb24KLQotVHVlIEp1biAyMyAyMjo0MjozMiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGN5Z21vbiBhbmQgbGlic3R1YiBzdXBwb3J0IGZvciBtbjEwMjAwLgotCi0xOTk4LTA2LTE5ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAoZ2NjX3ZlcnNpb24pOiBBZGQgbmV3IHZhcmlhYmxlIGRlc2NyaWJpbmcgdGhlCi0JcGFydGljdWxhciBnY2MgdmVyc2lvbiB3ZSdyZSBidWlsZGluZy4KLQkqIE1ha2VmaWxlLmluIChsaWJzdWJkaXIpOiBBZGQgbmV3IG1hY3JvIGZvciB0aGUgZGlyZWN0b3J5Ci0JaW4gd2hpY2ggdGhlIGNvbXBpbGVyIGZpbmRzIGV4ZWN1dGFibGVzLCBsaWJyYXJpZXMsIGV0Yy4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGdjY192ZXJzaW9uLCB0YXJnZXRfYWxpYXMKLQlhbmQgbGlic3ViZGlyLgotCi1GcmkgSnVuIDE5IDAyOjM2OjU5IDE5OTggIEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+Ci0KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1jbGVhbik6IHJlbW92ZSAqLmxvZwotCSh3YXJuaW5nLmxvZyk6IGJ1aWx0IHdpdGggd2Fybl9zdW1tYXJ5IGZyb20gYnVpbGQubG9nCi0JKG1haWwtcmVwb3J0LmxvZyk6IHJ1biB0ZXN0X3N1bW1hcnkKLQkobWFpbC1yZXBvcnQtd2l0aC13YXJuaW5ncy5sb2cpOiBydW4gdGVzdF9zdW1tYXJ5IGluY2x1ZGluZwotCXdhcm5pbmcubG9nIGluIHRoZSByZXBvcnQKLQotVGh1IEp1biAxOCAxMToyNjowMyAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogRGV0ZWN0aW9uIG9mIFBlbnRpdW0gSUkgZm9yICotc2NvLTMuMnY1Ki4KLQotTW9uIEp1biAxNSAxNDo1Mzo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChncmVwKTogR3JlcCBubyBsb25nZXIgZGVwZW5kcyBvbiBsaWJpYmVydHkuCi0KLUZyaSBKdW4gMTIgMTQ6MDM6MzQgMTk5OCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWxsLXNuYXZpZ2F0b3IgbmVlZHMgYWxsLWxpYmd1aS4KLQotVGh1IEp1biAxMSAxOTo0Mzo0NyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGN5Z21vbiBhbmQgbGlic3R1YiBzdXBwb3J0IGZvciBtbjEwMzAwLgotCi1XZWQgSnVuIDEwIDExOjE5OjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlzc2luZzogVXBkYXRlIHRvIHZlcnNpb24gZnJvbSBhdXRvbWFrZSAxLjMuCi0KLQkqIGx0bWFpbi5zaDogT24gaW5zdGFsbGF0aW9uLCBkb24ndCBnZXQgY29uZnVzZWQgaWYgdGhlIHNhbWUgbmFtZQotCWFwcGVhcnMgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGxpc3Qgb2YgbGlicmFyeSBuYW1lcy4KLQotV2VkIEp1biAgMyAxNDo1MTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBtNjgwNjAgYW5kIG01MjAwIGFzIENQVSBuYW1lcy4KLQotTW9uIEp1biAgMSAxNzoyNToxNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogVXNlICYmIHJhdGhlciB0aGFuIHVzaW5nIC1hIGluIHRlc3QsIGJlY2F1c2Ugb2RkCi0Jc3RyaW5ncyBjYW4gY29uZnVzZSB0ZXN0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotVGh1IE1heSAyOCAxOTozMToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEJyaW5nIGluIFZpc3VhbCBDKysgc3VwcG9ydC4KLQotU2F0IE1heSAyMyAyMzo0NDoxMyAxOTk4ICBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vc3RyYXAyLWxlYW4sIGJvb3RzdHJhcDMtbGVhbiwKLQlib290c3RyYXA0LWxlYW4pOiBuZXcgdGFyZ2V0cwotCi1Nb24gTWF5IDExIDIzOjExOjM0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogQ09QWUlORy5MSUI6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KLQotRnJpIE1heSAgOCAwMTozMDoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMmEuCi0KLQkqIE1ha2VmaWxlLmluIChHQVNCX1NVUFBPUlRfRElSUyk6IFJlbW92ZSBpbnRsOyBhbHJlYWR5IGluY2x1ZGVkIHZpYQotCUdBU19TVVBQT1JUX0RJUlMuCi0KLVRodSBNYXkgIDcgMTc6Mjc6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBBdm9pZCBwcm9kdWNpbmcgYSB2ZXJzaW9uIG51bWJlciBpZgotCS12ZXJzaW9uLWluZm8gd2FzIG5vdCB1c2VkLgotCi1UdWUgTWF5ICA1IDE4OjAyOjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgLS13aXRoLW5ld2xpYiB0byBDT05GSUdfQVJHVU1FTlRTIGlmIHdlIGFyZQotCWJ1aWxkaW5nIHdpdGggbmV3bGliLgotCi0xOTk4LTA0LTMwICBQYXVsIEVnZ2VydCAgPGVnZ2VydEB0d2luc3VuLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBSZW1vdmUgYmFja3NsYXNoIGF0IGVuZDsKLSAgICAgICAgU29sYXJpcyBgbWFrZScgY2F1c2VzIGl0IHRvIGNvbnRpbnVlIHRvIG5leHQgZGVmaW5pdGlvbi4gCi0KLVR1ZSBBcHIgMjggMTg6MTE6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBhbHBoYSB0byBhbHBoYSogaW4gc2V2ZXJhbCBwbGFjZXMuCi0KLVR1ZSBBcHIgMjggMDc6NDI6MDAgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgc3BhcmM4NnguCi0KLVR1ZSBBcHIgMjggMDc6MzU6MDIgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0gCi0JKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSk6IFJlbW92ZSBkZWJ1ZyBlY2hvLgotCi1UaHUgQXByIDIzIDIxOjMxOjE2IDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBTZXQgQ1hYRkxBR1MgZnJvbSBDWFhGTEFHUywgbm90IENGTEFHUy4KLQotVGh1IEFwciAyMyAxMjoyNjozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgY3lnd2luMzIgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMpOiBBZGQgaW50bC4KLQkoQklOVVRJTFNfU1VQUE9SVF9ESVJTLCBHQVNCX1NVUFBPUlRfRElSUyk6IExpa2V3aXNlLgotCShHREJfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMjIgMTI6MzA6MTAgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X21ha2VmaWxlX2ZyYWcpOiBJZiAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UsCi0JdXNlIC1PcyB0byBjb21waWxlIHRhcmdldCBsaWJyYXJpZXMgcmF0aGVyIHRoYW4gLU8yLiAgRGVmYXVsdCB0bwotCXVzaW5nIC1PcyBmb3IgZDEwdiBhbmQgbTMyciBpZiAtLXtlbmFibGUsZGlzYWJsZX0tdGFyZ2V0LW9wdHNwYWNlIGlzCi0Jbm90IHVzZWQuCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9jZmxhZ3MpOiBEaXR0byBmb3IgZDMwdi4KLQotVHVlIEFwciAyMSAyMzowNjo1NCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtYmZkKTogRGVwZW5kIG9uIGFsbC1pbnRsLgotCShhbGwtYmludXRpbHMpOiBMaWtld2lzZS4KLQkoYWxsLWdhcyk6IExpa2V3aXNlLgotCShhbGwtZ3Byb2YpOiBMaWtld2lzZS4KLQkoYWxsLWxkKTogTGlrZXdpc2UuCi0KLQotMTk5OC0wNC0xOSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogRml4IHR5cG8sIGxidG9vbCAtPiBsaWJ0b29sLgotCi1GcmkgQXByIDE3IDE2OjIwOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iZmQpOiBEZXBlbmQgdXBvbiBhbGwtbGliaWJlcnR5LgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBCcmluZyBpbiBuZXdlciBjeWd3aW4zMiBzdXBwb3J0LgotCi1GcmkgQXByIDE3IDEyOjIyOjIyIDE5OTggIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGxpYnN0dWIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uIEJ1aWxkIGxpYnN0dWIgZm9yIHRhcmdldHMgdGhhdCBoYXZlIGN5Z21vbgotCXN1cHBvcnQuCi0KLVR1ZSBBcHIgMTQgMTg6MDE6NTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBQSUNGTEFHIG9uIGl4ODYtY3lnd2luMzIuCi0KLVR1ZSBBcHIgMTQgMTI6MjQ6NDUgMTk5OCAgSi4gS2VhbiBKb2huc3RvbiAgPGprakBzY28uY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbmlzZSBpWzM0NTZdOTYtKi1zeXN2NSogYXMgYSB2YWxpZCBob3N0LCBhbmQKLQl1c2UgbWgtc3lzdjUgaWYgc3BlY2lmaWVkLiAgU3VwcG9ydCBncHJvZiBvbiBTQ08gT3BlbiBTZXJ2ZXIuCi0KLVR1ZSBBcHIgMTQgMTE6MzM6NTEgMTk5OCAgS3Jpc3RlciBXYWxmcmlkc3NvbiA8Y2F0b0BkZi5sdGguc2U+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmaW5lIERFRkFVTFRfTTQgYnkgc2VhcmNoaW5nIFBBVEguCi0JKiBNYWtmaWxlLmluOiBVc2UgREVGQVVMVF9NNC4KLQotTW9uIEFwciAxMyAxNTozNzoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBBZGQgY3lnd2luMzIgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQWRkIGxpYnRvb2wgYXMgYSBuYXRpdmUgb25seSBkaXJlY3RvcnkKLSAJdG8gY29uZmlndXJlIGFuZCBidWlsZC4KLQotV2VkIEFwciAgOCAxMzoxODo1NiAxOTk4ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IFhGT08gbGluZXMgc2hvcnRlbmVkLgotCi1UaHUgQXByICAyIDE0OjQ4OjQ0IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBhZGQgYXNoIG1ha2UgcnVsZXMKLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGFzaCB0byBuYXRpdmVfb25seSBhbmQgaG9zdF90b29scyBsaXN0cwotCi1UaHUgTWFyIDI2IDEyOjUzOjIwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZXR0ZXh0LCBhbGwtaW50bCk6IE5ldyB0YXJnZXRzLgotCShBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1nZXR0ZXh0LCBhbGwtaW50bC4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLWdldHRleHQsIGNoZWNrLWludGwuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtZ2V0dGV4dCwgaW5zdGFsbC1pbnRsLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4tZ2V0dGV4dCwgY2xlYW4taW50bC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkZWQgZ2V0dGV4dC4KLQkobmF0aXZlX29ubHkpOiBMaWtld2lzZS4KLQkobm9jb25maWdkaXJzKSBbdmFyaW91cyBjYXNlc106IExpa2V3aXNlLgotCShob3N0X2xpYnMpOiBBZGRlZCBpbnRsLgotCi1XZWQgTWFyIDI1IDExOjQ5OjEyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkoYWxsLXRhcmdldC13aW5zdXApOiAgYWxsLXRhcmdldC1saWJyeCBzdGF5cyBvdXQgb2YgaGVyZS4KLQotVHVlIE1hciAyNCAxNjo1ODoyOSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTLCBBTExfVEFSR0VUX01PRFVMRVMsIAotCUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUywgQ0hFQ0tfVEFSR0VUX01PRFVMRVMsIAotCUlOU1RBTExfVEFSR0VUX01PRFVMRVMsIENMRUFOX1RBUkdFVF9NT0RVTEVTLCBhbGwtdGFyZ2V0LXdpbnN1cCk6IAotCVJlbW92ZSByZWZlcmVuY2VzIHRvIGxpYnJ4IGFuZCBsaWJnKysuCi0KLVR1ZSBNYXIgMjQgMTg6Mjg6MTIgMTk5OCAgRXJpYyBNdW1wb3dlciAgPG5vY3R1cm5lQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzICQobGlzcGRpcikgZG93biB0bwotCXJlY3Vyc2l2ZSBtYWtlcwotCi1UdWUgTWFyIDI0IDExOjM3OjQ1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgJChUQVJHRVRfU1VCRElSKSB3aGVuIHBhc3NpbmcgLUIKLQlmb3IgbmV3bGliIGRpcmVjdG9yeS4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyMyAxMTozMDoyMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgYWZ0ZXIgbGlidG9vbC9sdGNvbmZpZy5pbiBjaGFuZ2UgZm9yCi0JaHB1eDExLgotCi1GcmkgTWFyIDIwIDE4OjUxOjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yLgotCi1GcmkgTWFyIDIwIDA5OjMyOjE0IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZ2NjKTogRG9uJ3Qgc3BlY2lmeSBMQU5HVUFHRVMgaGVyZS4KLQkoaW5zdGFsbC1nY2MtY3Jvc3MpOiBJbnN0ZWFkLCBvdmVycmlkZSBMQU5HVUFHRVMgaGVyZS4KLQotMTk5OC0wMy0xOCAgRGF2ZSBMb3ZlICA8ZC5sb3ZlQGRsLmFjLnVrPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogU2V0IENPTkZJR19TSVRFIHRvIGEKLQlub24tZXhpc3RlbnQgZmlsZSBzaW5jZSAvZGV2L251bGwgbG9zZXMgd2l0aCBiYXNoIDIuMC9hdXRvY29uZiAyLjEyLgotCi1XZWQgTWFyIDE4IDA5OjI0OjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIFRodW1iLXBlIHRhcmdldC4KLQotVHVlIE1hciAxNyAxNjo1OTowMCAxOTk4ICBTeWQgUG9sayA8c3BvbGtAY3lnbnVzLmNvbT4KLQkqIE1ha2VmaWxlLmluIC0gY2hhbmdlZCBzbiB0YXJnZXRzIHRvIHNuYXZpZ2F0b3IKLQkqIGNvbmZpZ3VyZS5pbiAtIGNoYW5nZWQgc24gdGFyZ2V0cyB0byBzbmF2aWdhdG9yCi0KLVR1ZSBNYXIgMTcgMTA6MzM6MjggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWctbWwuaW46IEFmdGVyIGJ1aWxkaW5nIHN5bWxpbmsgdHJlZSBjYWxsIG1ha2UgZGlzdGNsZWFuCi0JaWYgYSBNYWtlZmlsZSBnb3QgbGlua2VkIGludG8gJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgdGhpcyBoYXBwZW5zCi0JdG8gYmUgdGhlIGNhc2UgZm9yIGxpYmliZXJ0eS4KLQotVHVlIE1hciAxNyAxMDoyMjozNyAxOTk4ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWd1cmU6IFdoZW4gbWFraW5nIGxpbmssIGFsc28gY2hlY2sgdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuIFRoZSBjb25maWd1cmUgc2NyaXB0cyBtYXkgY3JlYXRlIG9uZS4KLQotRnJpIE1hciAgNiAwMTowMjowMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgYWxwaGFwY2E1NiBhbmQgYWxwaGFldjYgcHJvcGVybHkuCi0KLUZyaSBNYXIgIDYgMDA6MTQ6NTUgMTk5OCAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0IDMgSmFuIGNoYW5nZSBmb3IgcG93ZXJwYy1saW51eC1nbnVsaWJjMS4KLQotCi1Nb24gRmViIDIzIDE1OjA5OjE4IDE5OTggIEJydW5vIEhhaWJsZSA8YnJ1bm9AbGludWl4Lm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZQotCi0gICAgICAgICogY29uZmlnLnN1YiAoc2NvNSk6IEZpeCB0eXBvLgotCi1Nb24gRmViIDIzIDE0OjQ2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTU9EVUxFUyk6IE1vdmUgaW5zdGFsbC10Y2wgYmVmb3JlCi0JaW5zdGFsbC1pdGNsLgotCShpbnN0YWxsLWl0Y2wpOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBpbnN0YWxsLXRjbC4KLQotTW9uIEZlYiAyMyAwOTo1MzoyOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxpYmdsb3NzIGZyb20gbm9jb25maWdkaXJzIGZvciBNTjEwMzAwLgotCi1GcmkgRmViIDIwIDE2OjQ3OjI0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCBsZXQgYnVpbGRzIGJlIGRvbmUgaW4gc291cmNlIHRyZWUuCi0KLVRodSBGZWIgMTkgMTM6NDA6NDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxpYmd1aSBmb3IgYSBjeWd3aW4zMiB0YXJnZXQgd2hlbiBub3Qgb24KLQlhIGN5Z3dpbjMyIGhvc3QuCi0KLVdlZCBGZWIgMTggMTI6Mjk6MDAgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAocmVkaXJlY3QpOiBTZXQgdG8gbnVsbCwgc28gZGVmYXVsdCBiZWhhdmlvciBvZgotCWNvbmZpZ3VyZSBpcyBub3cgLS12ZXJib3NlLgotCi0xOTk4LTAyLTE2ICBEYXZlIExvdmUgIDxkLmxvdmVAZGwuYWMudWs+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBSdW4gY29uZmlndXJlIHdpdGgKLQlDT05GSUdfU0lURT0vZGV2L251bGwgdG8gZm9yZXN0YWxsIGxvc3NhZ2Ugd2l0aCBzaXRlIGNvbmZpZ3VyYXRpb24uCi0KLU1vbiBGZWIgMTYgMTI6MjM6NTMgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxNYW5mcmVkLkhvbGxzdGVpbkBrcy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUywgRVhUUkFfVEFSR0VUX0ZMQUdTKTogUmVhbGx5IGFkZAotCXRoaXMgY2hhbmdlIHRvIHN5bmMgTWFrZWZpbGUuaW4gd2l0aCBpdHMgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLVRodSBGZWIgMTIgMTU6MDM6MDggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsdG1haW4uc2ggKG1rZGlyKTogQ2hlY2sgdGhhdCB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QKLQliZWZvcmUgd2UgZXhpdCB3aXRoIGVycm9yLCBzbyB0aGF0IHdlIGRvbid0IGdldCByYWNlcyBkdXJpbmcKLQlwYXJhbGxlbCBidWlsZHMuCi0KLVNhdCBGZWIgIDcgMTU6MTk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGkuCi0KLUZyaSBGZWIgIDYgMDE6MzM6NTIgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogRG9uJ3QgcGFzcyBQSUNGTEFHIGFuZAotCVBJQ0ZMQUdfRk9SX1RBUkdFVC4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRG9uJ3QgcGFzcyBQSUNGTEFHX0ZPUl9UQVJHRVQuCi0KLQkqIGNvbmZpZ3VyZTogRW1pdCBhIGRlZmluaXRpb24gZm9yIHRoZSBuZXcgbWFjcm8gZW5hYmxlX3NoYXJlZAotCWludG8gZWFjaCBNYWtlZmlsZS4KLQotCSogY29uZmlnL21oLXNwYXJjcGljIChQSUNGTEFHKTogRGVmaW5lIHRvIHByb3Blcmx5IGFjY29yZGluZwotCXRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZy9tdC1zcGFyY3BpYyAoUElDRkxBR19GT1JfVEFSR0VUKTogRGVmaW5lIHRvIHByb3Blcmx5Ci0JYWNjb3JkaW5nIHRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQotVGh1IEZlYiAgNSAxNzowMToxMiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzLCBuYXRpdmVfb25seSk6IEFkZCBsaWJ0b29sLgotCi1XZWQgRmViICA0IDE2OjUzOjU4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHRhcmdldC1ncGVyZiB0byBub2NvbmZpZ2RpcnMgZm9yIEN5Z3dpbjMyLgotCUZpeCB0eXBvIGluIG1pbmcgY29uZmlnIGNvbW1lbnQuCi0KLVdlZCBGZWIgIDQgMTg6NTY6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGguCi0KLU1vbiBGZWIgIDIgMTk6Mzg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgdGljMzAgY2FzZXMsIGFuZCBtYXAgYzMwIHRvIHRpYzMwLgotCi1GcmkgSmFuIDMwIDE3OjE4OjMyIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFJlbW92ZSBleHBlY3QgZnJvbSBub2NvbmZpZ2RpcnMgd2hlbiB0YXJnZXQKLSAgICAgICAgaXMgY3lnd2luMzIuICBPSyB0byBidWlsZCBleHBlY3QgYW5kIGRlamFnbnUgd2l0aCBDYW5hZGlhbgotICAgICAgICBDcm9zcy4KLQotV2VkIEphbiAyOCAxMjo1ODo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZXhwZWN0LCBkZWphZ251LCBhbmQgY3Zzc3JjIGZvciBhIGN5Z3dpbjMyCi0JaG9zdC4KLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgJHtVTkFNRV9NQUNISU5FfSByYXRoZXIgdGhhbiBpMzg2IGZvciBjeWd3aW4zMgotCWFuZCBtaW5ndzMyLgotCi1XZWQgSmFuIDI4IDEwOjI2OjM3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBwYXNzaW5nICQobG9jYWxfcHJlZml4KQotCWhlcmUgYXMgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHRvcGxldmVsIE1ha2VmaWxlLgotCi1UdWUgSmFuIDI3IDIzOjI1OjA2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWcpOiBOZXcgdmFyaWFibGUsIHdoaWNoIG5hbWVzCi0JYSBmaWxlIHdpdGggZ2VuZXJpYyBydWxlcywgLi4uCi0JQ2hhbmdlIGNvbW1lbnQgdG8gbWVudGlvbiB3ZSBub3cgaGF2ZSBGSVZFIHBhcnRzLgotCSogY29uZmlndXJlOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1UdWUgSmFuIDI3IDIzOjE1OjU1IDE5OTggIExhc3NpIEEuIFR1dXJhICA8bGF0QGlraS5maT4KLQotCSogY29uZmlnLmd1ZXNzOiBNb3JlIGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgSFAgcHJvY2Vzc29yIHR5cGVzLgotCSogY29uZmlnLnN1YjogTW9yZSBhY2N1cmF0ZSBkZXRlcm1pbmF0aW9uIG9mIEhQIHByb2Nlc3NvciB0eXBlcy4KLQotU2F0IEphbiAyNCAwMTo1OTo0NSAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAocGFja2FnZV9tYWtlZmlsZV9mcmFnKTogTW92ZSBpbnNlcnRpbmcgdGhlCi0JJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IHRvIHdoZXJlIGl0IHNob3VsZCBiZSBhY2NvcmRpbmcKLQl0byB0aGUgY29tbWVudC4KLQotRnJpIEphbiAyMyAwMDozMDoyMSAxOTk4ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvQVJNLgotCi1UaHUgSmFuIDIyIDE1OjE0OjAxIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiAuY3ZzaWdub3JlOiBSZW1vdmUgKi1pbmZvIGFuZCAqLWluc3RhbGwgc2luY2UgdGhleSBtYXRjaAotCXJlbGVhc2UtaW5mbyBhbmQgbXB3LWluc3RhbGwsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8ganVzdCBpZ25vcmUuCi0KLVRodSBKYW4gMjIgMDE6Mzg6MzMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXZlcnQgMyBKYW4gY2hhbmdlIGZvciBhbHBoYS1saW51eC1nbnVsaWJjMS4KLQotU2F0IEphbiAxNyAyMToyODowOCAxOTk4ICBQaWV0ZXIgTmFnZWwgPHBuYWdlbEBlcGl1c2UuY28uemE+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGdjY19pbmNsdWRlX2RpciBhbmQKLQlsb2NhbF9wcmVmaXggdG8gc3ViLW1ha2UgaW52b2NhdGlvbnMuCi0KLVNhdCBKYW4gMTcgMjE6MDQ6NTkgMTk5OCBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgbWFrZWZpbGUgZnJhZ21lbnRzIGluIHRoZSBzb3VyY2UKLQlkaXJlY3RvcnkuCi0KLUZyaSBKYW4gMTYgMDA6NDE6MzcgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLQotCSogY29uZmlndXJlLmluOiBjaGVjayB3aGV0aGVyIGhvc3QgYW5kIHRhcmdldCBtYWtlZmlsZQotCWZyYWdtZW50cyBleGlzdCBiZWZvcmUgYWRkaW5nIHRoZW0gdG8gKl9tYWtlZmlsZV9mcmFnCi0KLVdlZCBKYW4gMTQgMjM6Mzk6MTAgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NvbmZpZ2RpcnMpOiBBZGQgY3lnbW9uIGZvciBzcGFyYzY0LWVsZi4KLQkKLVdlZCBKYW4gMTQgMTI6NDg6MDcgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgd2Ugb25seSByZXBsYWNlIFJQQVRIX0VOVlZBUiBvbgotCWxpbmVzIHdoaWNoIGJlZ2luIHdpdGggUlBBVEhfRU5WVkFSLCBpLmUuIGFkZCAiXiIgdG8gdGhlCi0JcmVnZXhwIHRvIHNlZC4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgUlJQQVRIX0VOVlZBUiBkb3duCi0JdG8gc3ViLW1ha2VzLgotCi0xOTk4LTAxLTEzICBMZWUgSXZlcnNvbiAgIChsZWVpQGFpLnNyaS5jb20pCi0KLQkqIGNvbmZpZy1tbC5pbiAobXVsdGktZG8pOiBMREZMQUdTIG11c3QgaW5jbHVkZSBtdWx0aWxpYgotCWRlc2lnbmF0b3IuCi0KLVR1ZSBKYW4gMTMgMDE6MTM6MjQgMTk5OCAgIFJvYmVydCBMaXBlIChyb2JlcnRsQGRnaWkuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpWzM0NTZdLWk1ODYtVW5peFdhcmU3LXN5c3Y1LgotCi1TdW4gSmFuICA0IDAxOjA2OjU1IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuc3ViOiBBZGQgbWluZ3czMiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIG1oLW1pbmd3MzI6IE5ldyBmaWxlLgotCi1TYXQgSmFuICAzIDEyOjExOjA1IDE5OTggRnJhbnogU2lybCA8ZnJhbnouc2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRmluYWxpemUgc3VwcG9ydCBmb3Ige2FscGhhfHBvd2VycGN9Ki0qLWxpbnV4LWdudWxpYmMxCi0KLVN1biBEZWMgMjggMTE6Mjg6NTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9UQVJHRVQpOiBEbyBpbnN0YWxsLWdjYyBmaXJzdC4KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogUHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIHN1YmRpcnMKLQl3aGljaCBkbyBub3QgdXNlIGF1dG9jb25mLgotCi1XZWQgRGVjIDI0IDIyOjQ2OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBTeW5jIHdpdGggZWdjcy4gIFBpY2tzIHVwIG5ldyBhbHBoYSBzdXBwb3J0LAotCUJlT1MgJiBzb21lIGFkZGl0aW9uYWwgbGludXggc3VwcG9ydC4KLQotVHVlIERlYyAyMyAxMjo0NTo1MCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogSFAgOTAwMC84MDMgaXMgYSBQQTEuMSBtYWNoaW5lLgotCi0KLVN1biBEZWMgMjEgMTY6NTM6MTIgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnLCB0YXJnZXRfbWFrZWZpbGVfZnJhZyk6Ci0gICAgICAgIEhhbmRsZSBtdWx0aXBsZSBjb25maWcgZmlsZXMuCi0gICAgICAgIChhbHBoYS0qLWxpbnV4Kik6IFRyZWF0IGFscGhhLSotbGludXgqIGFzIGFscGhhLSotbGludXgqIGFuZAotICAgICAgICBhbHBoYS0qLSouCi0KLVRodSBEZWMgMTggMTM6MTM6MDMgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWtkZXA6IE5ldyBmaWxlLgotCi1XZWQgRGVjIDE3IDA5OjUzOjAyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKi0qKTogQWxsb3cgY29uZmlndXJpbmcgb2YgbGliaWRlLCB2bWFrZSwgZXRjLgotCi1UdWUgRGVjIDE2IDE3OjM2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBsaWJndWkgZGlyZWN0b3J5LgotCShHREJfVEspOiBBZGQgYWxsLWxpYmd1aS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpYmd1aSBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IEFkZCBhbGwtbGliZ3VpIHRvIEdEQl9USy4KLQotTW9uIERlYyAxNSAxNjoxMjoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKG11bHRpZGlycyk6IEFkZCBtMzJyIHRvIG11bHRpbGliIGxpc3QuCi0KLUZyaSBEZWMgMTIgMTA6NDM6MzEgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWdwZXJmKTogQ2hhbmdlIGRlcGVuZGVuY3kgdG8KLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotVGh1IERlYyAxMSAyMzozMDo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgQmVPUyBzdXBwb3J0LgotCi1XZWQgRGVjIDEwIDE1OjEwOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNvdXJjZSBkaXJlY3RvcnkgY3ZzIHJlbmFtZWQgdG8gY3Zzc3JjOgotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQ2hhbmdlIGN2cyB0byBjdnNzcmMuCi0JKG5hdGl2ZV9vbmx5KTogTGlrZXdpc2UuCi0JKG5vY29uZmlnZGlycykgW3ZhcmlvdXMgY2FzZXNdOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IENoYW5nZSBhbGwtY3ZzIHRvIGFsbC1jdnNzcmMuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBDaGFuZ2UgY2hlY2stY3ZzIHRvIGNoZWNrLWN2c3NyYy4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQ2hhbmdlIGluc3RhbGwtY3ZzIHRvIGluc3RhbGwtY3Zzc3JjLgotCShDTEVBTl9NT0RVTEVTKTogQ2hhbmdlIGNsZWFuLWN2cyB0byBjbGVhbi1jdnNzcmMuCi0JKGFsbC1jdnNzcmMpOiBSZW5hbWUgdGFyZ2V0IGZyb20gYWxsLWN2cy4KLQotV2VkIERlYyAgMyAwNzo1NTo1OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogRml4IHRoaW5rby4KLQotVHVlIERlYyAgMiAxMDo1NTozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVF9DUk9TUyk6IERlZmluZS4KLQkoaW5zdGFsbC1jcm9zcywgaW5zdGFsbC1nY2MtY3Jvc3MpOiBOZXcgdGFyZ2V0cy4KLQotVHVlIERlYyAgMiAxMDowODozMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotU3VuIE5vdiAzMCAxNjoxMjoyNyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlcyBmb3IgY3lnbW9uLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGN5Z21vbiBmb3Igc3BhcmMtZWxmIGFuZCBzcGFyY2xpdGUtYW91dC4KLQotVGh1IE5vdiAyNyAwMTozMTozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IERvIGluc3RhbGwtZ2NjIGZpcnN0LgotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBQcm92aWRlIGEgZGVmaW5pdGlvbiBmb3Igc3ViZGlycwotCXdoaWNoIGRvIG5vdCB1c2UgYXV0b2NvbmYuCi0KLVdlZCBOb3YgMjYgMTE6NTM6MzMgMTk5NyAgS2VpdGggU2VpdHogIDxrZWl0aHNAb25pb25zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgQ2hhbmdlTG9nOiBtZXJnZSB3aXRoIGZvdW5kcnkncwotCTExLzE4Lzk3IGJ1aWxkIAotCi1XZWQgTm92IDI2IDE2OjA4OjUwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogRnJvbSBGcmFueiBTaXJsLgotCSogY29uZmlnLmd1ZXNzIChwb3dlcnBjKi0qLWxpbnV4KTogSGFuZGxlIGdsaWJjMiBiZXRhIHJlbGVhc2UKLQlmb3VuZCBvbiBSZWRIYXQgTGludXggc3lzdGVtcy4KLQotRnJpIE5vdiAyMSAwOTo1MTowMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoYWxwaGEgc3R1ZmYpOiBNZXJnZSB3aXRoIEZTRiB0byBhdm9pZCBpbmNvcnJlY3QKLQlndWVzc2VzLgotCi1UaHUgTm92IDEzIDExOjM4OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtbmNyLXN5c3Y0LjMqKTogVHdlYWsuCi0KLU1vbiBOb3YgMTAgMTU6MjM6MjEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbHRtYWluLnNoOiBJZiBta2RpciBmYWlscywgY2hlY2sgd2hldGhlciB0aGUgZGlyZWN0b3J5IHdhcyBjcmVhdGVkCi0JYW55aG93IGJ5IHNvbWUgb3RoZXIgcHJvY2Vzcy4KLQotTW9uIE5vdiAxMCAxNDozODowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBhbGwgZGlyZWN0b3JpZXMuCi0KLVN1biBOb3YgIDkgMTc6MzY6MjAgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgbmV3bGliLCBsaWJpYmVydHkgZGlyZWN0b3JpZXMKLQlmb3IgdGhlIEQzMFYuCi0KLVNhdCBOb3YgIDggMTQ6NDI6NTkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgdGFyZ2V0LWxpYmdsb3NzIG9uIHRoZSBEMzBWLgotCi1GcmkgTm92ICA3IDEwOjM0OjA5IDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGluY2x1ZGUvbGliaWJlcnR5Lmg6IEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3Jtcy4KLSAgICAgICAgKiBpbmNsdWRlL3JlbW90ZS1zaW0uaDogIEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3JhbXMuCi0KLVRodSBPY3QgMzAgMTE6MDk6MjkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgR0NDIG5vdy4KLQotTW9uIE9jdCAyNyAxMzoxNzoyNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGEgInNlY29uZCBwYXNzIiBvZiB0d2Vha2luZyBub2NvbmZpZ2RpcnMsCi0JaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotTW9uIE9jdCAyNyAxMjowMzo1MyAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBjaGVjay10YXJnZXQtbGliaW8gZGVwZW5kcyBvbiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotU3VuIE9jdCAyNiAxMTo0ODoyNyAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgKG1hbmZyZWRAcy1kaXJla3RuZXQuZGUpCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAtbGVhbik6IENvbWJpbmVkIHdpdGggYG5vcm1hbCcgYm9vdHN0cmFwCi0JdGFyZ2V0cyB1c2luZyAiJEAiIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3Igc2ltaWxhciBidXQgbm90IGlkZW50aWNhbAotCXRhcmdldHMgd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIGNvZGUuCi0KLU1vbiBPY3QgMjAgMTU6Mjg6NDkgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRml4IHRvIHdvcmsgd2l0aCBERUMgQy4KLQotVHVlIE9jdCAgNyAyMzo1ODo1NyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1pcHMtdHgzOS1lbGYgdG8gbWFya2V0aW5nIG5hbWVzLgotCi1UdWUgT2N0ICA3IDE0OjI0OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBIYW5kbGUgc3ltbGlua3MgaW4gZ2VuZXJhdGVkIHNjcmlwdC4KLQotV2VkIE9jdCAgMSAxMzoxMToyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIGF1dG9jb25mIHN0eWxlIGRpcmVjdG9yeSBvcHRpb25zOiAtLWJpbmRpciwKLQktLWRhdGFkaXIsIC0taW5jbHVkZWRpciwgLS1pbmZvZGlyLCAtLWxpYmRpciwgLS1saWJleGVjZGlyLAotCS0tbWFuZGlyLCAtLW9sZGluY2x1ZGVkaXIsIC0tc2JpbmRpciwgLS1zaGFyZWRzdGF0ZWRpciwKLQktLXN5c2NvbmZkaXIuCi0JKiBNYWtlZmlsZS5pbiAoc2JpbmRpciwgbGliZXhlY2Rpciwgc3lzY29uZmRpcik6IE5ldyB2YXJpYWJsZXMuCi0JKHNoYXJlZHN0YXRlZGlyLCBsb2NhbHN0YXRlZGlyLCBvbGRpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGJpbmRpciwgZGF0YWRpciwgaW5jbHVkZWRpciwKLQlpbmZvZGlyLCBsaWJkaXIsIGxpYmV4ZWNkaXIsIGxvY2Fsc3RhdGVkaXIsIG1hbmRpciwgb2xkaW5jbHVkZWRpciwKLQlzYmluZGlyLCBzaGFyZWRzdGF0ZWRpciwgYW5kIHN5c2NvbmZkaXIuCi0KLU1vbiBTZXAgMjkgMDA6Mzg6MDggMTk5NyBBYXJvbiBKYWNrc29uIDxqYWNrc29uQG5lZ3JpbC5tc3JjZS5ob3dhcmQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwLWxlYW4pOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDI0IDE4OjA2OjI3IDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYpOiAgUmVtb3ZlIHRjbCwgdGssIGV4cGVjdCwgZ2RiLCBpdGNsLCB0aXgsIGRiLAotIAlzbiwgYW5kIGdudXNlcnYgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVdlZCBTZXAgMjQgMTU6MTg6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IFR3ZWFrIHNoZWxsIHBhdHRlcm4gdG8gYXZvaWQgYnVnIGluIE5ldEJTRCAvYmluL3NoLgotCi1UaHUgU2VwIDE4IDIzOjU4OjI3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotKiBNYWtlZmlsZS5pbiAoY3Jvc3MpOiBOZXcgdGFyZ2V0LgotCi1UaHUgU2VwIDE4IDIxOjQzOjIzIDE5OTcgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCQkJICBKZWZmIExhdyAgICAgICAgIDxsYXdAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBOZXcgdGFyZ2V0cy4KLQkoYWxsLWJvb3RzdHJhcCk6IFJlbW92ZSBvdXRkYXRlZCBhbmQgY29uZnVzaW5nIHRhcmdldC4KLQkoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogRG9uJ3QgcGFzcyBCT09UX0NGTEFHUyBkb3duLgotCi0KLTE5OTctMDktMTUgMDI6MzcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtbGludXg6IERlZmluZSBDWFhGTEFHUyB0byBtYWtlIHN1cmUgLWZ2dGFibGUtdGh1bmtzIGlzCi0JdXNlZC4KLQkqIGNvbmZpZ3VyZS5pbjogTmFtZSBMaW51eCB0YXJnZXQgZnJhZ21lbnQuCi0KLQkqIGNvbmZpZ3VyZTogUmV3cml0ZSBzbyB0aGF0IHByb2plY3QgTWFrZWZpbGUgZnJhZ21lbnQgaXMgaW5zZXJ0ZWQKLQlmaXJzdCBhbmQgYXBwZWFycyBsYXN0IGluIHRoZSByZXN1bHRpbmcgTWFrZWZpbGUuCi0KLVR1ZSBTZXAgMTYgMDk6NTU6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pdGNsKTogSW5zdGFsbCB0Y2wgZmlyc3QuCi0KLVN1biBTZXAgMTQgMjA6NTM6NDIgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWN5Z3dpbjMyOiBvayB0byBidWlsZCBzcGxpdCB0ZXhpbmZvIGZpbGVzCi0KLUZyaSBTZXAgMTIgMTY6MTk6MjAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQkKLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIGJpc29uIGZyb20gbm9jb25maWdkaXJzIGZvciBDeWd3aW4zMiBob3N0Ci0KLVRodSBTZXAgMTEgMTY6NDA6NDYgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6IEFsc28gcmVtb3ZlIG1oLWZyYWcgbXQtZnJhZy4KLQotCSogY29uZmlndXJlLmluIChza2lwZGlycyk6IEFkZCB0YXJnZXQtbGlicnggZm9yIExpbnV4LgotCShhbHBoYS0qLWxpbnV4Kik6IFVzZSBjb25maWcvbWgtZWxmYWxwaGFwaWMgYW5kIGNvbmZpZy9tdC1lbGZhbHBoYXBpYy4KLQotV2VkIFNlcCAxMCAyMToyOTo1NCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXApOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDEwIDE1OjE5OjIyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0ICdhbWlnYWRvcycgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkuCi0KLU1vbiBTZXAgIDggMjA6NDY6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggRlNGLgotCi1TdW4gU2VwICA3IDE1OjU1OjI4IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgIm1hcmtldGluZy1uYW1lcyIgcGF0Y2guCi0KLUZyaSBTZXAgIDUgMTY6MTE6MjggMTk5NyAgSm9lbCBTaGVycmlsbCAgKGpvZWxAT0FSY29ycC5jb20pCi0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKCotKi1ydGVtcyopOiBEbyBub3QgYnVpbGQgbGliZ2xvc3MgZm9yIHJ0ZW1zLgotCi1GcmkgU2VwICA1IDEyOjI3OjE3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogSGFuZGxlIHY4NTAtZWxmLgotCi1XZWQgU2VwICAzIDEyOjE1OjI0IDE5OTcgIENocmlzIFByb3Zlbnphbm8gIDxwcm92ZW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IFNldCBDT05GSUdfU0hFTEwgaW4gbGlidG9vbC4KLQkqIGx0bWFpbi5zaDogVXNlIENPTkZJR19TSEVMTCBpbnN0ZWFkIG9mIC9iaW4vc2gKLQotTW9uIFNlcCAgMSAxNjo0NTo0NCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byBsaWJyYXJpZXMgaWYgZW5hYmxlX211bHRpbGliLgotCi1XZWQgQXVnIDI3IDE2OjE1OjExIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBVcGRhdGUgZnJvbSBnY2MgZGlyZWN0b3J5LgotCi1UdWUgQXVnIDI2IDE2OjQ2OjQ2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1zaW0pOiBEZXBlbmRzIG9uIGFsbC1yZWFkbGluZS4KLQotV2VkIEF1ZyAyMCAxOTo1NzozNyAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTiwgWUFDQyk6IFVzZSAkJHMuCi0JKGFsbC1iaXNvbik6IERlcGVuZCBvbiBhbGwtdGV4aW5mby4KLQotVHVlIEF1ZyAxOSAwMTo0MTozMiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IEFkZCAtTCBmbGFnLgotCShZQUNDKTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMTggMTE6MzA6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LiAKLQkKLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMTozMDo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LiAKLQkKLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMDk6MjQ6MDYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBtaXBzdHgzOS4gIERlbGV0ZSByMzkwMC4KLQotTW9uIEF1ZyAxOCAxNzoyMDoxMCAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWF1dG9jb25mKTogRGVwZW5kcyBvbiBhbGwtdGV4aW5mby4KLQotRnJpIEF1ZyAxNSAyMzowOToyNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluICh7cG93ZXJwYyxyczYwMDB9Ki0qLSopOiBVcGRhdGUgdG8gY3VycmVudCBBSVggYW5kCi0JZWFiaSB0YXJnZXRzLgotCi1UaHUgQXVnIDE0IDE0OjQyOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBHZXQgQ0ZMQUdTIGFuZCBDWFhGTEFHUyBmcm9tIE1ha2VmaWxlLCBpZiBwb3NzaWJsZS4KLQotCSogY29uZmlndXJlOiBXaGVuIGhhbmRsaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIGhhbmRsZSBZQUNDIGFzIHdlbGwgYXMKLQlCSVNPTi4gIEp1c3Qgc2V0IEJJU09OIHRvIGJpc29uLiAgV2hlbiBzZXR0aW5nIFlBQ0MsIHByZWZlciBiaXNvbi4KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoYWxsLWJpc29uKTogRGVwZW5kIHVwb24gYWxsLXRleGluZm8uCi0KLVR1ZSBBdWcgMTIgMjA6MDk6NDggMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBiaXNvbiwgbm90IGJ5YWNjIG9yIGJpc29uIC15LgotCShZQUNDKTogYmlzb24gLXkgb3IgYnlhY2Mgb3IgeWFjYy4KLQkodmFyaW91cyk6IEFkZCAqLWJpc29uIGFzIGFwcHJvcHJpYXRlLgotCSh0YXopOiBObyBuZWVkIHRvIG1lc3Mgd2l0aCBCSVNPTiBhbnltb3JlLgotCi1UdWUgQXVnIDEyIDIyOjMzOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBPU1RZUEUgbWF0Y2hlcyAqd2luMzIqLCB0cnkgdG8gZmluZCBhIGdvb2QgdmFsdWUgZm9yCi0JQ09ORklHX1NIRUxMLgotCi1TdW4gQXVnIDEwIDE0OjQxOjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSBBTV9JTklUX0FVVE9NQUtFIGluCi0JY29uZmlndXJlLmluIGlmIGl0IGlzIHByZXNlbnQuCi0KLVNhdCBBdWcgIDkgMDA6NTg6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTERfRk9SX1RBUkdFVCk6IENoYW5nZSBsZC5uZXcgdG8gbGQtbmV3LgotCi1GcmkgQXVnICA4IDE2OjMwOjEzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBgYXJjJyBjcHUuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlnLW1sLmluOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAgNyAxMTowMjozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKElOU1RBTExfWDExX01PRFVMRVMpKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuCi0KLVdlZCBBdWcgIDYgMTY6Mjc6MjkgMTk5NyAgQ2hyaXMgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IENoYW5nZWQgc2VkIGRlbGltaXRlciBmcm9tICc6JyB0byAnfCcgd2hlbgotCWF0dGVtcHRpbmcgdG8gc3Vic3RpdHV0ZSAke2NvbmZpZ19zaGVsbH0gZm9yIFNIRUxMLiBPbgotCU5UICR7Y29uZmlnX3NoZWxsfSBtYXkgY29udGFpbiBhICc6JyBpbiBpdC4KLQotV2VkIEF1ZyAgNiAxMjoyOTowNSAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBGaXggZm9yIG5vbi1iYXNoIHNoZWxscy4KLQotV2VkIEF1ZyAgNiAwMDo0MjozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBU19GT1JfVEFSR0VUKTogQ2hhbmdlIGFzLm5ldyB0byBhcy1uZXcuCi0KLVR1ZSBBdWcgIDUgMTQ6MDg6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTk1fRk9SX1RBUkdFVCk6IENoYW5nZSBubS5uZXcgdG8gbm0tbmV3LgotCi0JKiB5bHdyYXA6IElmIHRoZSBwcm9ncmFtIGlzIGEgcmVsYXRpdmUgcGF0aCwgZm9yY2UgaXQgdG8gYmUKLQlhYnNvbHV0ZS4KLQotVHVlIEF1ZyAgNSAxMjoxMjo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAodG9vbGRpcik6IFNldCBCSVNPTiB0byBgYmlzb24gLXknIGFuZCBub3QganVzdCBiaXNvbi4KLQotTW9uIEF1ZyAgNCAyMjo1OTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogV2hlbiB3aW5zdXAvTWFrZWZpbGUgcHJlc2VudCwKLSAJY29ycmVjdGx5IHNwZWNpZnkgdGhlIHRhcmdldCBidWlsZCBkaXJlY3RvcnkgJChUQVJHRVRfU1VCRElSKS93aW5zdXAKLSAJZm9yIGxpYnJhcmllcy4KLQotTW9uIEF1ZyAgNCAxMjo0MDoyNCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBGaXggaGFuZGxpbmcgb2YgbWFjcm9zIHdpdGggdmFsdWVzCi0gCXNlcGFyYXRlZCBieSBzcGFjZXMuCi0KLVRodSBKdWwgMzEgMTk6NDk6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB5bHdyYXA6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEFkZCB5bHdyYXAuCi0KLQkqIGx0bWFpbi5zaDogSGFuZGxlIC9iaW4vc2ggYXQgc3RhcnQgb2YgaW5zdGFsbCBwcm9ncmFtLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGx0Y29uZmlnLCBsdG1haW4uc2gsIGFuZCBtaXNzaW5nLgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBOZXcgZmlsZXMsIGZyb20gbGlidG9vbCAxLjAuCi0JKiBtaXNzaW5nOiBOZXcgZmlsZSwgZnJvbSBhdXRvbWFrZSAxLjIuCi0KLVRodSBKdWwgMjQgMTI6NTc6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVHJlYXQgdGl4IGxpa2UgdGssIHB1dHRpbmcgaXQgaW4gWDExX01PRFVMRVMuICBBZGQKLQljaGVjay10ayB0byBDSEVDS19YMTFfTU9EVUxFUy4KLQotV2VkIEp1bCAyMyAxNzowMzoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgotCi1UdWUgSnVsIDIyIDE5OjA4OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIEZTRi4KLQotVHVlIEp1bCAyMiAxNDo1MDo0MiAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGNvbmZpZ3VyZTogVHJlYXQgbXNkb3NkamdwcCBsaWtlIGdvMzIuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLiAgRG9uJ3QgcmVtb3ZlIGdwcm9mIGZvciBnbzMyLgotCi0JKiBjb25maWd1cmU6IENoYW5nZSBNYWtlZmlsZS50ZW0yIHRvIE1ha2VmaWxlLnRtMi4KLQotTW9uIEp1bCAyMSAxMDozMToyNiAxOTk3ICBTdGVwaGVuIFBldGVycyAgPHNwZXRlcnNAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBGb3IgYWxwaGEtZGVjLW9zZiosIGRvbid0IGlnbm9yZSBncmVwLgotCi1UdWUgSnVsIDE1IDE0OjMzOjAzIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogaW5zdGFsbC1zaCAoY2htb2RjbWQpOiBTZXQgdG8gbnVsbCBpZiB0aGUgRFNUIGRpcmVjdG9yeSBhbHJlYWR5Ci0JZXhpc3RzLiAgU2FtZSBhcyBOb3YgMTF0aCBjaGFuZ2UuCi0KLU1vbiBKdWwgMTQgMTE6MDE6MTUgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoR0RCX1RLKTogTmVlZHMgaXRjbCBhbmQgdGl4LiAKLQotTW9uIEp1bCAxNCAwMDozMjoxMCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogVXBkYXRlIGZyb20gRlNGLgotCi1GcmkgSnVsIDExIDExOjU3OjExIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoR0RCX1RLKTogRGVwZW5kIG9uIGl0Y2wgYW5kIHRpeC4KLQotRnJpIEp1bCAgNCAxMzoyNTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1BST0dSQU1fQVJHUyk6IE5ldyB2YXJpYWJsZS4KLQkoSU5TVEFMTF9QUk9HUkFNKTogVXNlICQoSU5TVEFMTF9QUk9HUkFNX0FSR1MpLgotCShJTlNUQUxMX1NDUklQVCk6IE5ldyB2YXJpYWJsZS4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIElOU1RBTExfU0NSSVBULgotCSogY29uZmlndXJlLmluOiBJZiBob3N0IGlzICotKi1jeWd3aW4zMiosIHNldCBJTlNUQUxMX1BST0dSQU1fQVJHUwotCXRvIC14LgotCSogaW5zdGFsbC1zaDogQWRkIHN1cHBvcnQgZm9yIC14IG9wdGlvbi4KLQotTW9uIEp1biAzMCAxNTo1MTozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IFRyZWF0IHRpeCBsaWtlIGl0Y2wuCi0KLVRodSBKdW4gMjYgMTM6NTk6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoV0lORFJFUyk6IE5ldyB2YXJpYWJsZS4KLQkoV0lORFJFU19GT1JfVEFSR0VUKTogTmV3IHZhcmlhYmxlLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBBZGQgV0lORFJFU19GT1JfVEFSR0VULgotCShFWFRSQV9IT1NUX0ZMQUdTKTogQWRkIFdJTkRSRVMuCi0JKEVYVFJBX1RBUkdFVF9GTEFHUyk6IEFkZCBXSU5EUkVTLgotCShFWFRSQV9HQ0NfRkxBR1MpOiBBZGQgV0lORFJFUy4KLQkoJChET19YKSk6IFBhc3MgZG93biBXSU5EUkVTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBTZXQgV0lORFJFUyB3aGVuIGNvbmZpZ3VyaW5nLgotCSogY29uZmlndXJlOiBUcmVhdCBXSU5EUkVTIGxpa2UgRExMVE9PTCwgYW5kIFdJTkRSRVNfRk9SX1RBUkdFVCBsaWtlCi0JRExMVE9PTF9GT1JfVEFSR0VULgotCi1XZWQgSnVuIDI1IDE1OjAxOjI2IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgc2ltIGJlZm9yZSBnZGIgZm9yIHdpbjMyLXgtcHBjCi0KLVdlZCBKdW4gMjUgMTI6MTg6NTQgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JTW92ZSBncGVyZiBpbnRvIHRoZSB0b3BsZXZlbCwgZnJvbSBsaWJnKysuCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF90b29scyk6IEFkZCB0YXJnZXQtZ3BlcmYuCi0JKG5hdGl2ZV9vbmx5KTogQWRkIHRhcmdldC1ncGVyZi4KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWdwZXJmKTogTmV3IHRhcmdldCwgZGVwZW5kIG9uCi0JYWxsLXRhcmdldC1saWJnKysuCi0JKGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYpOiBFbXB0eSBydWxlLgotCShBTExfVEFSR0VUX01PRFVMRVMpOiBBZGQgYWxsLXRhcmdldC1ncGVyZi4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogQWRkIGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYuCi0JKENIRUNLX1RBUkdFVF9NT0RVTEVTKTogQWRkIGNoZWNrLXRhcmdldC1ncGVyZi4KLQkoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBpbnN0YWxsLXRhcmdldC1ncGVyZi4KLQkoQ0xFQU5fVEFSR0VUX01PRFVMRVMpOiBBZGQgY2xlYW4tdGFyZ2V0LWdwZXJmLgotCi1Nb24gSnVuIDIzIDEwOjUxOjUzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLSAKLQkqIGNvbmZpZy5zdWIgKG1uMTAyMDApOiBSZWNvZ25pemUgbmV3IGJhc2ljIG1hY2hpbmUuCi0KLVRodSBKdW4gMTkgMTQ6MTY6NDIgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBFTkFCTEVfTVVMVElMSUIsIHNvIHdlJ2xsIGJlIHBhc3NpbmcKLQktLWVuYWJsZS1tdWx0aWxpYiBkb3duIHRvIHN1YmRpcnM7IHNldHRpbmcgVEFSR0VUX1NVQkRJUiB3YXMgZW5vdWdoLgotCi1UdWUgSnVuIDE3IDE1OjMxOjIwIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiB3ZSdyZSBidWlsZGluZyBtaXBzLXNnaS1pcml4NiogbmF0aXZlLCB0dXJuIG9uCi0JRU5BQkxFX01VTFRJTElCIGFuZCBzZXQgVEFSR0VUX1NVQkRJUi4KLQotVHVlIEp1biAxNyAxMjoyMDo1OSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtc24pOiBEZXBlbmQgb24gYWxsLWdyZXAuCi0KLU1vbiBKdW4gMTYgMTE6MTE6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1wcGNwaWMgYW5kIG10LXBwY3BpYyBmb3IgcG93ZXJwYyotKiB0YXJnZXRzLgotCi0JKiBjb25maWd1cmU6IFNldCBDRkxBR1MgYW5kIENYWEZMQUdTLCBhbmQgc3Vic3RpdHV0ZSB0aGVtIGludG8KLQlNYWtlZmlsZS4gIEZyb20gSmVmZiBNYWtleSA8amVmZkBjdHMuY29tPi4KLQkqIE1ha2VmaWxlLmluOiBBZGQgY29tbWVudCBmb3IgQ0ZMQUdTIGFuZCBDWFhGTEFHUy4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RCSVNPTkZJTEVTKTogUmVtb3ZlLgotCSh0YXopOiBEb24ndCBmdXR6IHdpdGggRElTVEJJU09ORklMRVMuICBDaGFuZ2UgQklTT04gdG8gdXNlCi0JJChERUZBVUxUX1lBQ0MpLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGl0bCwgZGIsIHNuLCBldGMuLCB3aGVuIGJ1aWxkaW5nIGZvciBuYXRpdmUKLSAJY3lnd2luMzIuCi0KLQkqIE1ha2VmaWxlLmluIChMRCk6IE5ldyB2YXJpYWJsZS4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFBhc3MgZG93biBMRC4KLQkoJChET19YKSk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDE2IDExOjEwOjM1IDE5OTcgIFBoaWxpcCBCbHVuZGVsbCAgPFBoaWxpcC5CbHVuZGVsbEBwb2JveC5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlICQoU0hFTEwpIHdoZW4gZXhlY3V0aW5nIGluc3RhbGwtc2guCi0KLUZyaSBKdW4gMTMgMTA6MjI6NTYgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2FyZ3MpOiBTdHJpcCBvdXQgYW55IHN1cHBsaWVkIC0tYnVpbGQgYXJndW1lbnQKLSAJYmVmb3JlIGFkZGluZyBvdXIgb3duLiBBbHdheXMgYWRkIC0tYnVpbGQuCi0KLVRodSBKdW4gMTIgMjE6MTI6MjggMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2FyZ3MpOiBQYXNzIC0tYnVpbGQgaWYgd2UncmUgZG9pbmcKLQlhIGNyb3NzLWNvbXBpbGUuCi0KLUZyaSBKdW4gIDYgMjE6Mzg6NDAgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBVc2UgJ3wnIGluc3RlYWQgb2YgIjoiIGFzIHRoZSBzZXBlcmF0b3IgaW4KLQlzZWQuIE90aGVyd2lzZSBzZWQgY2hva2VzIG9uIE5UIHBhdGggbmFtZXMgd2l0aCBkcml2ZQotCWRlc2lnbmF0b3JzLiBBbHNvIGxvb2sgZm9yICI/OioiIGFzIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgaW4gYW4KLQlhYnNvbHV0ZSBwYXRobmFtZS4KLQotTW9uIEp1biAgMiAxMzowNToyMCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogU3VwcG9ydCBmb3IgcjM5MDAuCi0KLVdlZCBNYXkgMjEgMTc6MzM6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBpbnN0YWxsLXNoLCBub3QgaW5zdGFsbC5zaC4KLQotV2VkIE1heSAxNCAxNjowNjo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBJbXByb3ZlIGNoZWNrIGZvciBCSVNPTiBzbyBpdCBkb2Vzbid0IHRyeSB0bwotCWFwcGx5IGl0IHR3aWNlLgotCi1GcmkgTWF5ICA5IDE3OjIyOjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTU9EVUxFUyk6IFB1dCBpbnN0YWxsLW9wY29kZXMgYmVmb3JlCi0JaW5zdGFsbC1iaW51dGlscy4KLQotVGh1IE1heSAgOCAxNzoyOTo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYXV0b21ha2UgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZCBhdXRvbWFrZS4KLQotVHVlIE1heSAgNiAxNTo0OTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmYXVsdCBDWFggdG8gYysrLCBub3QgZ2NjLgotCSogTWFrZWZpbGUuaW4gKENYWCk6IFNldCB0byBjKyssIG5vdCBnY2MuCi0JKENYWF9GT1JfVEFSR0VUKTogV2hlbiBjcm9zcywgdHJhbnNmb3JtIGMrKywgbm90IGdjYy4KLQotVGh1IE1heSAgMSAxMDoxMTo0MyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLXNoOiB0cnkgYXBwZW5kaW5nIGEgLmV4ZSBpZiBzb3VyY2UgZmlsZSBkb2Vzbid0Ci0JZXhpc3QKLQotV2VkIEFwciAzMCAxMjowNTozNiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVHVybiBvbiBtdWx0aWxpYiBieSBkZWZhdWx0LgotCShjcm9zc19vbmx5KTogUmVtb3ZlIHRhcmdldC1saWJpYmVydHkuCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogRG9uJ3QgZGVwZW5kIG9uIGxpYmliZXJ0eS4KLQotTW9uIEFwciAyOCAxODozOTo0NSAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IGltcHJvdmUgYWxnb3JpdGhtIGZvciByZWNvZ25pemluZyBHbnUgSHVyZCB4ODYuCi0KLVRodSBBcHIgMjQgMTk6MzA6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIG1wdy1pbnN0YWxsLgotCShESVNUQklTT05GSUxFUyk6IEFkZCBsZC9NYWtlZmlsZS5pbgotCi1UdWUgQXByIDIyIDE3OjE3OjI4IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaWYgdGFyZ2V0IGlzIGN5Z3dpbjMyIGJ1dCBob3N0IGlzbid0IGN5Z3dpbjMyLAotCWRvbid0IGNvbmZpZ3VyZSBnZGIgdGNsIHRrIGV4cGVjdCwgbm90IGp1c3QgZ2RiLgotCi1Nb24gQXByIDIxIDEzOjMzOjM5IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBnbnVzZXJ2IGV2ZXJ5d2hlcmUgc24gYXBwZWFycy4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWdudXNlcnYuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1nbnVzZXJ2LgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWdudXNlcnYuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1nbnVzZXJ2LgotCShhbGwtZ251c2Vydik6IE5ldyB0YXJnZXQuCi0KLVRodSBBcHIgMTcgMTM6NTc6MDYgMTk5NyAgUGVyIEZvZ2Vsc3Ryb20gIDxwZWZvQG9wZW5ic2Qub3JnPgotCi0JKiBjb25maWcuZ3Vlc3M6IEZpeGVzIGZvciBNSVBTIE9wZW5CU0Qgc3lzdGVtcy4KLQotVHVlIEFwciAxNSAxMjoyMTowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogUmVtb3ZlLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgSU5TVEFMTF9YRk9STS4KLQotCSogbWtpbnN0YWxsZGlyczogTmV3IGZpbGUsIGNvcGllZCBmcm9tIGF1dG9tYWtlLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxkaXJzKTogUmVuYW1lIGZyb20gaW5zdGFsbC1kaXJzLiAgVXNlCi0JbWtpbnN0YWxsZGlycy4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKERFVk9fU1VQUE9SVCk6IEFkZCBta2luc3RhbGxkaXJzLgotCi1Nb24gQXByIDE0IDExOjIxOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW5zdGFsbC1zaDogUmVuYW1lIGZyb20gaW5zdGFsbC5zaC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQkoREVWT19TVVBQT1JUKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZTogVXNlICR7Y29uZmlnX3NoZWxsfSB3aXRoICR7bW92ZWlmY2hhbmdlfS4gIEZyb20gVGhvbWFzCi0JR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+LgotCi1GcmkgQXByIDExIDE2OjM3OjEwIDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIE9wZW5CU0Qgc3lzdGVtcyBjb3JyZWN0bHkuCi0KLUZyaSBBcHIgMTEgMTc6MDc6MDQgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogUkVBRE1FLCBNYWtlZmlsZS5pbiAoRVRDX1NVUFBPUlQpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bwotCWNmZy1wYXBlciosIGNvbmZpZ3VyZS57dGV4aSxtYW4saW5mbyp9Ll8KLQotU3VuIEFwciAgNiAxODo0Nzo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC5ub3JtYWwpOiBFbnN1cmUgdGhhdCBnY2MgaXMgYnVpbHQgYWZ0ZXIgYWxsCi0JdGhlIHgxMSAtIGllIGdkYiAtIHRhcmdldHMuCi0KLVR1ZSBBcHIgIDEgMTY6Mjg6NTAgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRG9uJ3QgcnVuIGNvbmYtYS1nYXMuCi0KLU1vbiBNYXIgMzEgMTY6MjY6NTUgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGhwcGExLjEtKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KLQotU3VuIE1hciAzMCAxMjozODoyNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbm9jb25maWdkaXJzIGNhc2Ugc2luY2UgZ2RiIGFsc28KLQljb25maWd1cmVzIGFuZCBidWlsZHMgZm9yIHRpYzgwLWNvZmYuCi0KLUZyaSBNYXIgMjggMTg6Mjg6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBjYWNoZV9maWxlIHRvIGNvbmZpZy5jYWNoZS4KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1kaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi1XZWQgTWFyIDI2IDE4OjQ5OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1XZWQgTWFyIDI2IDEwOjM4OjI1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFJlbW92ZSBHKysgbGlicmFyaWVzIGFuZCBsaWJnbG9zcyBmcm9tCi0Jbm9jb25maWdkaXJzLgotCi1Nb24gTWFyIDI0IDE1OjAyOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGlycyk6IERvbid0IGNyYXNoIGlmIHByZWZpeCwgYW5kIGhlbmNlCi0JTUFLRURJUlMsIGlzIGVtcHR5LgotCi1Nb24gTWFyIDI0IDEyOjQwOjU1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFR3ZWFrIG1uMTAzMDAgZW50cnkuCi0KLUZyaSBNYXIgMjEgMTU6MzU6MjcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IFB1dCBzaW0gYmVmb3JlIGdkYiwgc28gZ2RiJ3MKLQljb25maWd1cmUudGd0IGNhbiBkZXRlcm1pbmUgaWYgdGhlIHNpbXVsYXRvciB3YXMgY29uZmlndXJlZC4KLQotU3VuIE1hciAxNiAxNjowNzowOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTW92ZSBCZU9TICRvcyBjYXNlIHRvIGJlIHdpdGggb3RoZXIgQ3lnbnVzCi0JbG9jYWwgY2FzZXMuCi0KLVN1biBNYXIgMTYgMDE6MzQ6NTUgMTk5NyAgTWFydGluIEh1bnQgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVtb3ZlIG1pc3BsYWNlZCBjb21tZW50IHRoYXQgYnJva2UgTGludXguCi0KLVNhdCBNYXIgMTUgMjI6NTA6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBCZU9TIHN1cHBvcnQuCi0KLU1vbiBNYXIgMTAgMTM6MzA6MTEgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tfWDExX01PRFVMRVMpOiBEb24ndCBydW4gY2hlY2stdGsuCi0KLVdlZCBNYXIgIDUgMTI6MDk6MjkgMTk5NyAgTWFydGluICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZSB0Y2wgYW5kIHRrIGZyb20KLQlub2NvbmZpZ2RpcnMgZm9yIGN5Z3dpbjMyIGJ1aWxkcy4KLQotRnJpIEZlYiAyOCAxODoyMDoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBSZW1vdmUgbGQgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVRodSBGZWIgMjcgMTQ6NTc6MjYgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChHQVNfU1VQUE9SVF9ESVJTLCBCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBSZW1vdmUKLQltYWtlLWFsbC5jb20sIHVzZSBtYWtlZmlsZS52bXMgaW5zdGVhZC4KLQotVHVlIEZlYiAyNSAxODo0NjoxNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtbG5ld3MqLgotCi1UdWUgRmViIDI1IDEzOjE5OjE0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIHRhcmdldC1uZXdsaWIsCi0gCXRhcmdldC1leGFtcGxlcyBhbmQgdGFyZ2V0LWxpYmliZXJ0eSBmb3IgZDMwdi4KLQotRnJpIEZlYiAyMSAxNzo1NjoyNSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBFbmFibGUgbGQgZm9yIGQzMHYuCi0KLUZyaSBGZWIgMjEgMjA6NTg6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogQnVpbGQgY29tcGlsZXIuCi0KLVN1biBGZWIgMTYgMTU6NDE6MDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKik6IFJlbW92ZSBzaW0gZGlyZWN0b3J5IGZyb20gbGlzdCBvZgotIAl1bnN1cHBvcnRlZCBkMzB2IGRpcmVjdG9yaWVzCi0KLVR1ZSBGZWIgMTggMTc6MzI6NDIgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbjogQWRkIGQzMHYgdGFyZ2V0IGNwdS4gCi0JCi1UaHUgRmViIDEzIDIyOjA0OjQ0IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCSogbWFrZS1hbGwuY29tOiBSZW1vdmUuCi0KLVdlZCBGZWIgMTIgMTI6NTQ6MTggMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogQWRkIExJQkdDQzJfREVCVUdfQ0ZMQUdTLgotCi1TYXQgRmViICA4IDIwOjM2OjQ5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWl0Y2wpOiBUaGUgcnVsZSBpcyBhbGwtaXRjbCwgbm90IGFsbC10Y2wuCi0KLVR1ZSBGZWIgIDQgMTE6Mzk6MjkgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtZGIuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlYyBjaGVjay1kYi4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1kYi4KLQkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLWRiLgotCi1Nb24gRmViICAzIDEzOjI5OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotVHVlIEphbiAyOCAwOToyMDozNyAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1pdGNsLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2staXRjbC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1pdGNsLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4taXRjbC4KLQotVGh1IEphbiAyMyAwMTo0NDoyNyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGJ1aWxkIGdkYiBmb3IgbW4xMDIwMAotCi1GcmkgSmFuIDE3IDE1OjMyOjE1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LXdpbnN1cCk6IERlcGVuZCBvbiBhbGwtdGFyZ2V0LWxpYmlvLgotCi1Nb24gSmFuIDEzIDIyOjQ2OjU0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBUdXJuIG9mZiBtb3N0IHRhcmdldHMgcmlnaHQgbm93LgotCi1GcmkgSmFuICAzIDE2OjA0OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1BS0VJTkZPKTogQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIE1ha2VmaWxlLAotCXJhdGhlciB0aGFuIHRoZSBtYWtlaW5mbyBwcm9ncmFtLgotCShkby1pbmZvKTogRGVwZW5kIHVwb24gYWxsLXRleGluZm8uCi0KLVR1ZSBEZWMgMzEgMTY6MDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSB1c2VzIG9mIGNvbmZpZy9taC1saW51eC4KLQotCSogY29uZmlnLnN1YiwgY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotRnJpIERlYyAyNyAyMzowNDozMyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoY2FzZSAkYmFzaWNfbWFjaGluZSk6IEFkZCB0aWM4MCBlbnRyaWVzLgotCi1GcmkgRGVjIDI3IDEyOjA3OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotV2VkIERlYyAxOCAyMjo0NjozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1idWlsZC5pbjogQnVpbGQgbGQgYmVmb3JlIGdjYywgdXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZS4KLQkqIG1wdy1jb25maWcuaW46IFRlc3QgZm9yIE5ld0ZvbGRlclJlY3Vyc2l2ZS4KLQkqIG1wdy1pbnN0YWxsOiBVc2Ugc3ltYm9saWMgbmFtZSBmb3Igc3RhcnR1cCBmaWxlbmFtZS4KLQkqIG1wdy1SRUFETUU6IEFkZCB2YXJpb3VzIGFkZGl0aW9uYWwgZGV0YWlscy4KLQotV2VkIERlYyAxOCAxMzoxMTo0NiAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6IFJlbW92ZSBiaW51dGlscyBmcm9tIG5vY29uZmlnZGlycy4KLQotV2VkIERlYyAxOCAxMDoyOTozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZ2NjIGFuZCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBmb3IKLQl0aGUgbW4xMDIwMC4KLQotV2VkIERlYyAgNCAxNjo1MzowNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGF2b2lkIGJ1aWxkaW5nIGdkYiBmb3IgbW4xMDMwMCBhbnkgbW9yZQotCSogTWFrZWZpbGUuaW46IGRvdWJsZS1xdW90ZSBHQ0NfRk9SX1RBUkdFVCBsaW5lIGluIEVYVFJBX0dDQ19GTEFHUwotCWluc3RlYWQgb2Ygc2luZ2xlLXF1b3RpbmcgaXQuCi0KLVR1ZSBEZWMgIDMgMjM6MjY6NTAgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSAtLXdpdGgtc3RhYnMgb24gSVJJWCA2LgotCi1UdWUgRGVjICAzIDA5OjA1OjI1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTMycik6IEJ1aWxkIGdkYiwgbGliZysrIG5vdy4KLQotU3VuIERlYyAgMSAwMDoxODo1OSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6ICBSZW1vdmUgZ2RiIGFuZCByZWxhdGVkCi0JZGlyZWN0b3JpZXMgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVR1ZSBOb3YgMjYgMTE6NDU6MzMgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGJhc2ljX21hY2hpbmUpOiBhZGRlZCBtaXBzMTYgY29uZmlndXJhdGlvbgotCi1TYXQgTm92IDIzIDE5OjI2OjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogSGFuZGxlIGQxMHYtdW5rbm93bi4KLQotU2F0IE5vdiAyMyAxMDoyMzowMSAxOTk2ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogSGFuZGxlIHY4NTAtdW5rbm93bi4KLQotVGh1IE5vdiAyMSAxNjoxOTo0NCAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGZpbmR1dGlscwotCSogY29uZmlndXJlLmluOiBhZGQgZmluZHV0aWxzIHRvIGxpc3Qgb2YgaG9zdF90b29scwotCi1XZWQgTm92IDIwIDEwOjA5OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogSGFuZGxlIG1uMTAyMDAgYW5kIG1uMTAzMDAuCi0KLVR1ZSBOb3YgMTkgMTY6MzU6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKik6IERvIG5vdCBidWlsZCBsaWJyeC4KLQotTW9uIE5vdiAxOCAxMzoyODo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobW4xMDMwMCk6IEJ1aWxkIGV2ZXJ5dGhpbmcgZXhjZXB0IGdkYiAmIGxpYmdsb3NzLgotCi1XZWQgTm92IDEzIDE0OjU5OjQ2IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBQYXRjaCBmb3IgRGFuc2sgRGF0YSBFbGVrdHJvbmlrIHNlcnZlcnMsCi0JZnJvbSBOaWVscyBTa291IE9sc2VuIDxuc29AZGRlLmRrPi4KLQotCUZvciBuY3IsIHVzZSAvYmluL3VuYW1lIHJhdGhlciB0aGFuIHVuYW1lLCBzaW5jZSBHTlUgdW5hbWUgZG9lcyBub3QKLQlzdXBwb3J0IC1wLiAgU3VnZ2VzdGVkIGJ5IE1hcmsgTWl0Y2hlbGwgPG1taXRjaGVsbEB1c2EubmV0Pi4KLQotCVBhdGNoIGZvciBNSVBTIFI0MDAwIHJ1bm5pbmcgU3lzdGVtIFYsCi0JZnJvbSBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4uCi0KLQlGaXggdGhpbmtvIGZvciBuZXh0c3RlcC4KLQotCVBhdGNoIGZvciBPU0YxIGluIGk/ODYsIGZyb20gRGFuIE11cnBoeSA8ZGxtQG9zZi5vcmc+IHZpYSBIYXJsYW4gU3Rlbm4uCi0KLQlTYXQgSnVuIDI0IDE4OjU4OjE3IDE5OTUgIE1vcnRlbiBXZWxpbmRlciAgPHRlcnJhK0Bjcy5jbXUuZWR1PgotCSogY29uZmlnLmd1ZXNzOiBHdWVzcyBtaXBzLWRlYy1tYWNoX2JzZDQuMy4KLQotCVRodSBPY3QgMTAgMDQ6MDc6MDQgMTk5NiAgSGFybGFuIFN0ZW5uIDxoYXJsYW5AcGZjcy5jb20+Ci0JKiBjb25maWcuZ3Vlc3MgKGk/ODYtbmNyLXN5c3YqKTogIEVtaXQganVzdCBlbm91Z2ggb2YgdGhlIG1pbm9yCi0JcmVsZWFzZSBudW1iZXJzLgotCSogY29uZmlnLmd1ZXNzIChtaXBzLW1pcHMtcmlzY29zKik6ICBFbWl0IGp1c3QgZW5vdWdoIG9mIHRoZQotCXJlbGVhc2UgbnVtYmVyLgotCi0JVHVlIE9jdCAgOCAxMDozNzoyMiAxOTk2ICBGcmFuayBWYW5jZSA8ZnZhbmNlQHdhaWkuY29tPgotCSogY29uZmlnLmd1ZXNzIChzcGFyYy1hdXNwZXgtc3Vub3MqKTogIEFkZGVkLgotCShmMzAwLWZ1aml0c3UtKik6IEFkZGVkLgotCi0JV2VkIFNlcCAyNSAyMjowMDozNSAxOTk2ICBKZWZmIFdvb2xzZXkgPHdvb2xzZXlAamx3LmNvbT4KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBhIFRhZHBvbGUgYXMgYSBzcGFyYy4KLQotV2VkIE5vdiAxMyAwMDo1MzowOSAxOTk2ICBEYXZpZCBKLiBNYWNLZW56aWUgIDxkam1AY2h1cmNoeS5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiBEb24ndCBhc3N1bWUgdGhhdCBOZXh0U3RlcCB2ZXJzaW9uIGlzIGVpdGhlciAyIG9yCi0JMy4gIE5leHRTdGVwIDQgKGFrYSBPcGVuU3RlcCA0KSBoYXMgY29tZSBvdXQgbm93LgotCi1Nb24gTm92IDExIDIzOjUyOjAzIDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBjaHVyY2h5LmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3M6IFN1cHBvcnQgQ3JheSBUOTAgdGhhdCByZXBvcnRzIGl0c2VsZiBhcyAiQ1JBWSBUUyIuCi0JRnJvbSBSaWsgRmFpdGggPGZhaXRoQGNzLnVuYy5lZHU+LgotCi1GcmkgTm92ICA4IDExOjM0OjU4IDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBnZWVjaC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLnN1YjogQ29udHJpYnV0aW9ucyBmcm9tIGJ1Zy1nbnUtdXRpbHMgdG86Ci0JU3VwcG9ydCBwbGFpbiAiaHBwYSIgKG5vIHZlcnNpb24gZ2l2ZW4pIGFyY2hpdGVjdHVyZSwgcmVwb3J0ZWQgYnkKLQlPcGVuU3RlcC4KLQlPcGVuQlNEIGxpa2UgTmV0QlNELgotCUx5bnhPcyBpcyBub3QgYSBoYXJkd2FyZSBzdXBwbGllci4KLQotCSogY29uZmlnLmd1ZXNzOiBDb250cmlidXRpb25zIGZyb20gYnVnLWdudS11dGlscyB0byBhZGQgc3VwcG9ydCBmb3I6Ci0gCU9wZW5CU0QgbGlrZSBOZXRCU0QuCi0JU3RyYXR1cyBzeXN0ZW1zLgotCU1vcmUgUHlyYW1pZCBzeXN0ZW1zLgotCWlbbj40XTg2IEludGVsIGNoaXBzLgotCU02ODBbbj40XTAgTW90b3JvbGEgY2hpcHMuCi0JVXNlIHVua25vd24gaW5zdGVhZCBvZiBseW54IGZvciBoYXJkd2FyZSBtYW51ZmFjdHVyZXIuCi0KLU1vbiBOb3YgMTEgMTA6MDk6MDggMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLnNoIChjaG1vZGNtZCk6IFNldCB0byBudWxsIGlmIHRoZSBEU1QgZGlyZWN0b3J5IGFscmVhZHkKLQlleGlzdHMuCi0KLU1vbiBOb3YgMTEgMTA6NDM6NDEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLXtlYWJpLGVsZixsaW51eCxydGVtLHN5c3Ysc29sYXJpc30qKTogRG8KLQlub3QgdXNlIG10LXBwYyB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnQgYW55IG1vcmUuCi0KLVN1biBOb3YgIDMgMTk6MTc6MDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotd2luZG93cyk6ICBFeGNsdWRlIGV2ZXJ5dGhpbmcgYnV0IHRob3NlIGRpcnMKLQluZWVkZWQgdG8gYnVpbGQgd2luZG93cy4KLQotVHVlIE9jdCAyOSAxNjo0MTozMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC13aW5zdXApOiBEZXBlbmQgb24gYWxsLXRhcmdldC1saWJyeC4KLQotTW9uIE9jdCAyOCAxNzozMjo0NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBFeGNsdWRlIG1tYWxsb2MgZnJvbSBpMzg2LXdpbmRvd3MuCi0JKiBjb25maWcvbWgtd2luZG93czogIEFkZCBydWxlcyBmb3IgYnVpbGRpbmcgTVNWQyBtYWtlZmlsZXMuCi0KLVRodSBPY3QgMjQgMDk6MjI6NDYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogVW5kbyBteSBwcmV2aW91cyBjaGFuZ2UuCi0KLVRodSBPY3QgMjQgMTI6MTI6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogUGFzcyBkb3duIEdDQ19GT1JfVEFSR0VUCi0JdW5jb25kaXRpb25hbGx5LgotCShNQUtFT1ZFUlJJREVTKTogRGVmaW5lIChyZXZlcnQgdGhpcyBwYXJ0IG9mIE9jdG9iZXIgMTggY2hhbmdlKS4KLQotVGh1IE9jdCAyNCAwOTowMjowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBBZGQgJChIT1NUX0ZMQUdTKSB0byBhbGxvdyB0aGUKLQlob3N0IHRvIGFkZCBpdCdzIG93biBmbGFncy4KLQkqIGNvbmZpZy9taC13aW5kb3dzIChIT1NUX0ZMQUdTKTogIFNldCBzcmNyb290LCB3aGljaCBpcyBuZWVkZWQKLQlmb3IgTVNWQyBidWlsZCBwcm9jZWR1cmUuCi0KLVR1ZSBPY3QgMjIgMTU6MjA6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEhhbmRsZSBHQ0NfRk9SX1RBUkdFVCBsaWtlIENDX0ZPUl9UQVJHRVQuCi0KLUZyaSBPY3QgMTggMTM6Mzc6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IENoZWNrIGZvciB4Z2NjLCBub3QgTWFrZWZpbGUuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0JKEdDQ19GT1JfVEFSR0VUKTogRGVmaW5lLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgR0NDX0ZPUl9UQVJHRVQuCi0JKEVYVFJBX0dDQ19GTEFHUyk6IERlZmluZSBHQ0NfRk9SX1RBUkdFVCBiYXNlZCBvbiB3aGV0aGVyCi0JQ0NfRk9SX1RBUkdFVCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0JKE1BS0VPVkVSUklERVMpOiBEb24ndCBkZWZpbmUuCi0KLVRodSBPY3QgMTcgMTA6Mjc6NTYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtMzJyKTogRml4IHNwZWxsaW5nIG9mIGxpYmcrKyBsaWJzLgotCi1UaHUgT2N0IDEwIDEwOjM3OjE3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoLWFwcGxlKik6IFJlbW92ZSwgbm93IHJlZHVuZGFudC4KLQotVGh1IE9jdCAxMCAxMjozMDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IENQVS1WRU5ET1ItbGludXgtZ251LgotCi0JKiBjb25maWd1cmU6IFJld29yayB5ZXN0ZXJkYXkncyBzZWQgc2NyaXB0IHBhdGNoLgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIEZTRi4KLQotV2VkIE9jdCAgOSAxNzoyNDo1OSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0YuCi0KLQkxOTk2LTA5LTEyICBSaWNoYXJkIFN0YWxsbWFuICA8cm1zQGV0aGFub2wuZ251LmFpLm1pdC5lZHU+Ci0gICAgICAgICogY29uZmlnLmd1ZXNzOiBVc2UgcGMgaW5zdGVhZCBvZiB1bmtub3duLCBmb3IgcGMgY2xvbmUgc3lzdGVtcy4KLSAgICAgICAgQ2hhbmdlIGxpbnV4IHRvIGxpbnV4LWdudS4KLQotCU1vbiBKdWwgMTUgMjM6NTE6MTEgMTk5NiAgS2FybCBIZXVlciAgPGt3emhAZ251LmFpLm1pdC5lZHU+Ci0gICAgICAgICogY29uZmlnLmd1ZXNzOiBBdm9pZCBub24tcG9ydGFibGUgdHIgc3ludGF4LgotCi1XZWQgT2N0ICA5IDA2OjA2OjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGQgInhhcmdzIiBmb3IgZ2RiLgotCi0JKiBjb25maWd1cmU6IEF2b2lkIGhwdXgxMC4yMCBzZWQgYnVnLgotCi1UdWUgT2N0ICA4IDA4OjMyOjQ4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiBjb25maWcvbWgtd2luZG93czogIEFkZCBzdXBwb3J0IGZvciB3aW5kb3dzIGhvc3QKLQkodGhhdCBpcyBhIGJ1aWxkIGRvbmUgdW5kZXIgdGhlIE1pY3Jvc29mdCBidWlsZCBlbnZpcm9ubWVudCkuCi0KLVR1ZSBPY3QgIDggMTA6Mzk6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSBhbGwgdXNlcyBvZiBzcmNyb290IHdpdGggcywgdG8gc2hyaW5rCi0JY29tbWFuZCBsaW5lIGxlbmd0aHMuCi0KLQlQYXRjaGVzIGZyb20gR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbjogSWYgY29uZmlndXJpbmcgZm9yIG5ld2xpYiwgcGFzcyAtLXdpdGgtbmV3bGliIHRvCi0Jc3ViZGlyZWN0b3JpZXMuCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IElmIHdpbnN1cC9NYWtlZmlsZSBleGlzdHMsIHBhc3MgYQotCS1CbmV3bGliLyBhbmQgLUx3aW5zdXAgdG8gZ2NjLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICA3IDEwOjU5OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVUQ19TVVBQT1JUKTogQWRkIGNvbmZpZ3VyZS4KLQotRnJpIE9jdCAgNCAxMjoyMjo1OCAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgY29uZmlnL21oLWRndXgzODYgZm9yIGlbMzQ1XTg2LWRnLWRndXggCi0JaG9zdCBjb25maWd1cmF0aW9uIGZpbGUuCi0KLVRodSBPY3QgIDMgMDk6Mjg6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJyZWFrIG1uMTB4MDAgc3VwcG9ydCBpbnRvIHNlcGFyYXRlCi0JbW4xMDIwMCBhbmQgbW4xMDMwMCBjb25maWd1cmF0aW9ucy4KLQkqIGNvbmZpZy5zdWI6IExpa2V3aXNlLgotCi1XZWQgT2N0ICAyIDIyOjI3OjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgbG90cyBvZiBzdHVmZiB0byBub2NvbmZpZ2RpcnMgZm9yCi0JdGhlIG1uMTB4MDAgdGFyZ2V0cy4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgbW4xMHgwMCBzdXBwb3J0LgotCi1XZWQgT2N0ICAyIDE1OjUyOjM2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlLWFsbC5jb206IENhbGwgY29uZi1hLWdhcywgbm90IGNvbmZpZy1hLWdhcy4KLQotVHVlIE9jdCAgMSAwMToyODo0MSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgbGliZ2xvc3MgZm9yIGFybS1jb2ZmCi0gCXRhcmdldHMuCi0KLU1vbiBTZXAgMzAgMTQ6MjQ6MDEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctUkVBRE1FOiBBZGQgbXVjaCBtb3JlIGRldGFpbCBmb3IgbmF0aXZlIFBvd2VyTWFjLgotCSogbXB3LWluc3RhbGw6IE5ldyBmaWxlLgotCSogbXB3LWNvbmZpZ3VyZTogQWRkIC0tbm9yZWN1cnNpb24gYW5kIC0taGVscCBvcHRpb25zLgotCSogbXB3LWNvbmZpZy5pbjogVHJhbnNsYXRlIHJlYWRtZSBhbmQgaW5zdGFsbCBmaWxlcyB3aGVuCi0JY29weWluZyB0byBvYmpkaXIuCi0JKiBtcHctYnVpbGQuaW46IERvbid0IGFsd2F5cyBkZXBlbmQgb24gYnlhY2MgYW5kIGZsZXguCi0JKGluc3RhbGwtb25seS10b3ApOiBOZXcgYWN0aW9uLgotCi1GcmkgU2VwIDI3IDE3OjM5OjQ0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFlvdSBjYW4gbm93IGNvbmZpZ3VyZSBHREIgZm9yIHRoZSB2ODUwLgotCi1UdWUgU2VwIDI0IDE5OjA1OjEyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBjb25maWd1cmUgYW55IEMrKyBkaXJzCi0JaWYgdGFyZ2V0aW5nIEQxMFYuCi0KLVR1ZSBTZXAgMTcgMTI6MTU6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbWlwczY0dnI1MDAwLgotCi1Nb24gU2VwIDE2IDE3OjAwOjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgYSBzaW5nbGUgbGluZSBmb3IgaG9zdF90b29scyBhbmQgbmF0aXZlX29ubHkuCi0KLU1vbiBTZXAgIDkgMTI6MjE6MzAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgZW50cmllcyBmb3IgbTMyci4KLQotVGh1IFNlcCAgNSAxMzo1Mjo0NyAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5ldC1pbnN0YWxsKTogRG9uJ3QgcnVuIGluc3RhbGwtZ3ppcC4KLQotV2VkIFNlcCAgNCAxNzoyNjoxMyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBEb24ndCBjb25maWcgbG90cyBvZiB0aGluZ3MgZm9yICotKi13aW5kb3dzKi4KLQotU2F0IEF1ZyAzMSAxMTo0NTo1NyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFRlc3QgZm9yIG1wdy10cnVlLCB0cnVlLCBhbmQgbnVsbC1jb21tYW5kIHNjcmlwdHMuCi0JKGhvc3RfbGlicywgaG9zdF90b29scyk6IENvcHkgZnJvbSBjb25maWd1cmUuaW4uCi0JKiBtcHctY29uZmlndXJlOiBEb24ndCBjb21wbGFpbiBhYm91dCBkaXJlY3RvcmllcyBub3QgZm91bmQuCi0KLVRodSBBdWcgMjkgMTY6NDQ6NTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2KTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCShpWzM0NTZdODYtKi1kZ3V4Kik6IFVzZSBjb25maWcvbWgtc3lzdiBmb3IgdGhlIGhvc3QgY29uZmlndXJhdGlvbgotCWZpbGUuCi0KLQkqIGNvbmZpZy5ndWVzcyAoaVszNDVdODYpOiBEaXR0by4KLQotTW9uIEF1ZyAyNiAxODozNDo0MiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBSZW1vdmVkIGdkYiBmb3IgRDEwVi4KLQotVGh1IEF1ZyAyMiAxNzoxMzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxkLCB0YXJnZXQtbGliaW8sIHRhcmdldC1saWJnKyssIGFuZAotCXRhcmdldC1saWJzdGRjKysgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVdlZCBBdWcgMjEgMTg6NTY6MzggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRml4IHRocmVlIGxvY2F0aW9ucyB3aGVyZSBzaGVsbCBzY3JpcHRzIHdlcmUKLQliZWluZyBydW4gZGlyZWN0bHkgcmF0aGVyIHRoYW4gd2l0aCBjb25maWdfc2hlbGwuCi0KLVR1ZSBBdWcgMjAgMTM6MDg6NDcgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodjg1MC0qLSopOiBTZXQgdXAgaW5pdGlhbCAkbm9jb25maWdkaXJzLgotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IFJlY29nbml6ZSB2ODUwLgotCi1UaHUgQXVnIDE1IDEyOjE5OjMzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSGFuZGxlIG11bHRpcGxlIGVuYWJsZS9kaXNhYmxlIG9wdGlvbnMgYW5kCi0JcGFzcyB0aGVtIGRvd24gcmVjdXJzaXZlbHksIGhhbmRsZSAtYyBhbmQgLXMgZmxhZ3MgYXBwcm9wcmlhdGVseQotCWRlcGVuZGluZyBvbiBjaG9pY2Ugb2YgY29tcGlsZXIsIGFkZCBlc2NhcGUgbWVjaGFuaXNtIGZvcgotCXF1b3RlZCBhcmd1bWVudHMgdG8gZ0MuCi0KLU1vbiBBdWcgMTIgMTM6MTU6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLSotKik6IEZvciBlYWJpLCBzeXN0ZW0gVi40LCBMaW51eCwgYW5kCi0Jc29sYXJpcyB0YXJnZXRzLCB1c2UgY29uZmlnL210LXBwYyB0byBzZXQgQ3ssWFh9RkxBR1NfRk9SX1RBUkdFVFMKLQlzbyB0aGF0IC1tcmVsb2NhdGFibGUtbGliIGFuZCAtbW5vLWVhYmkgYXJlIHVzZWQuCi0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBJZiB0YXJnZXQgY29tcGlsZXIgZG9lcwotCW5vdCBzdXBwb3J0IC0tcHJpbnQtbXVsdGktbGliLCBkb24ndCBhYm9ydC4KLQotU3VuIEF1ZyAxMSAyMDo1MTo1MCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtY3lnd2luMzIgKENGTEFHUyk6ICBEZWZpbmUgX1dJTjMyIHRvIGJlIGNvbXBhdGlibGUKLQl3aXRoIG5vcm1hbCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgotCi1UaHUgQXVnICA4IDEyOjE4OjU5IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlLWFsbC5jb206IFJ1biBjb25maWctYS1nYXMuCi0JKiBzZXR1cC5jb206IERvbid0IGNvcHkgc3ViZGlyZWN0b3J5IGZpbGVzIGFyb3VuZC4KLQotVHVlIEp1bCAzMCAxNzo0OTozMSAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1vc2UpOiBSZW1vdmUgZXhjbHVzaW9uIG9mIGxpYmdsb3NzIGZvciB0aGlzCi0JdGFyZ2V0LCBpdCBub3cgY29tcGlsZXMgY29ycmVjdGx5LgotCi1TYXQgSnVsIDI3IDE1OjEwOjQzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogR2VuZXJhdGUgTWFjIGluY2x1ZGUgZm9yIGVsZi9kd2FyZjIuaC4KLQotVHVlIEp1bCAyMyAxMDo0NzowNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IFJlbW92ZSBsZCBmcm9tICRub2NvbmZpZ2RpcnMuIAotCi1Nb24gSnVsIDIyIDEzOjI4OjUxIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChuYXRpdmVfb25seSk6IEFkZCBwcm1zLgotCi1Nb24gSnVsIDIyIDEyOjI3OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMpOiBBZGQgbWFrZS1hbGwuY29tIGFuZCBzZXR1cC5jb20uCi0JKEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IExpa2V3aXNlLgotCi1UaHUgSnVsIDE4IDEyOjU1OjQwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IERvbid0IGNvbmZpZ3VyZSBsZCBvciBnZGIgdW50aWwgdGhlCi0JZDEwdiBzdXBwb3J0IGlzIGFkZGVkLgotCi1XZWQgSnVsIDE3IDE0OjMzOjA5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogTmV3IHRhcmdldC4KLQotTW9uIEp1bCAxNSAxMTo1MzowMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoSFAgOTAwMC84MTEpOiBSZWNvZ25pemUgdGhpcyBhcyBhIFBBMS4xCi0JbWFjaGluZS4KLQotRnJpIEp1bCAxMiAyMzoyMToxNyAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvLXRhci1neik6IE5ldyB0YXJnZXQsIHNwbGl0IG91dCBmcm9tIHRhaWwgZW5kIG9mCi0JdGF6IHRhcmdldC4gIFJ1biBlYWNoIGNvbW1hbmQgc2VwYXJhdGVseSwgZG9uJ3QgdXNlIHBpcGVzLgotCSh0YXopOiBVc2UgaXQuCi0KLUZyaSBKdWwgMTIgMTI6MDg6MDQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBMb29rIGZvciBnLW1wdy1tYWtlLnNlZCBpbiBjb25maWcvbXB3LgotCSogbXB3LWJ1aWxkLmluOiBObyBidWlsZHMgc2hvdWxkIGRlcGVuZCBvbiBidWlsZGluZyBieWFjYyBvciBmbGV4LAotCXRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgaW5zdGFsbGVkIGFscmVhZHkuCi0KLUZyaSBKdWwgMTIgMDk6NTI6NTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogU2V0IHIgZW52aXJvbm1lbnQKLQl2YXJpYWJsZSB0aGF0IENDX0ZPUl9UQVJHRVQgbmVlZHMuCi0KLVRodSBKdWwgMTEgMTA6MDk6NDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogRGV0ZXJtaW5lIGlmIHRoZSBtdWx0bGliCi0Jb3B0aW9ucyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgc3ViZGlyZWN0b3J5IHdhcwotCWNvbmZpZ3VyZWQsIGFuZCBpZiBpdCBoYXMsIHJlY29uZmlndXJlLgotCShDTEVBTl9UQVJHRVRfTU9EVUxFUyk6IERlbGV0ZSBtdWx0aWxpYi5vdXQgYW5kIHRtcG11bHRpLm91dCwgd2hpY2gKLQlDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMgdXNlcyB0byByZW1lbWJlciB0aGUgb2xkIG11bHRpbGliIG9wdGlvbnMuCi0KLVdlZCBKdWwgMTAgMTg6NTY6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTLENST1NTX0NIRUNLX01PRFVMRVMsSU5TVEFMTF9NT0RVTEVTLAotCUNMRUFOX01PRFVMRVMpOiBBZGQgYmFzaC4KLQkoYWxsLWJhc2gpOiBOZXcgdGFyZ2V0LgotCi1Nb24gSnVsICA4IDE3OjMzOjE0IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLXNnaS1pcml4NiopOiBVc2UgbWgtaXJpeDYgaW5zdGVhZCBvZiBtaC1pcml4NS4KLQotTW9uIEp1bCAgMSAxMzozMTozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGJhc2ljX21hY2hpbmUpOiBSZWNvZ25pemUgZDEwdiBhcyBhIHZhbGlkIHByb2Nlc3Nvci4KLQotRnJpIEp1biAyOCAxMjoxNDozNSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciAtLWJpbmRpci4KLQkqIG1wdy1idWlsZC5pbjogVXNlIGEgR0NDLXNwZWNpZmljIGJ1aWxkIHNjcmlwdCBmb3IgR0NDIGFjdGlvbnMuCi0KLVdlZCBKdW4gMjYgMTc6MjA6MTIgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgYmFzaCwgdGltZSwgZ2F3ayB0byBsaXN0IG9mIGhvc3R0b29scyBhbmQgdGhpbmdzCi0JdG8gb25seSBidWlsZCBmb3IgbmF0aXZlIHRvb2xjaGFpbnMKLQotVHVlIEp1biAyNSAyMzowOTowMyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZG9jZGlyKTogUmVtb3ZlLgotCi1UdWUgSnVuIDI1IDE5OjAwOjA4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogU2V0IHRvICQocHJlZml4KS9zaGFyZS4KLQotTW9uIEp1biAyNCAyMzoyNjowNyAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGJ1aWxkIGRpZmYgYW5kIHBhdGNoIGZvciBjeWd3aW4zMi1ob3N0ZWQKLQl0b29sY2hhaW5zLgotCi1Nb24gSnVuIDI0IDE1OjAxOjEyIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtcnRlbXMqLgotCi1TdW4gSnVuIDIzIDIyOjQxOjU0IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGVuYWJsZSBkb3NyZWwgZm9yIGN5Z3dpbjMyLWhvc3RlZCBidWlsZHMsCi0gICAgICAgICAgICAgICAgcmVtb3ZlIGRpZmYgZnJvbSB0aGUgbGlzdCBvZiB0aGluZ3Mgbm90IGJ1aWxkYWJsZQotICAgICAgICAgICAgICAgIHZpYSBDYW5hZGlhbiBDcm9zcwotCi1TYXQgSnVuIDIyIDExOjM5OjAxIDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9TVUJESVIpOiBNb3ZlIGNvbW1lbnQgdG8gcHJldmlvdXMgbGluZSBzbyB3ZQotIAlkb24ndCBnZXQgIi4gIi4KLQotRnJpIEp1biAyMSAxNzoyNDo0OCAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6IFNldCBub2NvbmZpZ2RpcnMgYXBwcm9wcmlhdGVseS4KLQotVGh1IEp1biAyMCAxNjo1Nzo0MCAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEhhbmRsZSBjYXNlIHdoZXJlIHRleDNwYXRjaCBkaWRuJ3QgZXZlbiBnZXQKLQljaGVja2VkIG91dC4gIEFsc28sIGlmIGl0IHdhcyBmb3VuZCwgcHV0IHRoZSBzeW1saW5rIGluIGEgbmV3IHV0aWwKLQlzdWJkaXJlY3RvcnkuCi0KLVRodSBKdW4gMjAgMTI6MjA6MzMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogQWRkIHN1cHBvcnQgZm9yIFBvd2VyUEMgTGludXguCi0KLVR1ZSBKdW4gMTggMTQ6MjQ6MTIgMTk5NiAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtb3BlbnZtcy4KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotKnZtcyopOiBTZXQgbm9jb25maWdkaXJzLgotCSogbWFrZS1hbGwuY29tLCBzZXR1cC5jb206IE5ldyBmaWxlcy4KLQotTW9uIEp1biAxNyAxNjozNDo0NiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiB0ZXgzcGF0Y2ggbW92ZWQgdG8gdGV4aW5mby91dGlsLgotCi1TYXQgSnVuIDE1IDE3OjEzOjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgbWFrZSBmcm9tIGRpc2FibGUtaWYtQ2FuLUNyb3NzIGxpc3QKLQkJZW5hYmxlIGdkYiBpZiAke2hvc3R9IGFuZCAke3RhcmdldH0gYXJlIGN5Z3dpbjMyCi0KLUZyaSBKdW4gIDcgMTg6MTY6NTIgMTk5NiAgSGFybGFuIFN0ZW5uIDxoYXJsYW5AcGZjcy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoaT84Ni1uY3Itc3lzdiopOiAgRW1pdCBtaW5vciByZWxlYXNlIG51bWJlcnMuCi0JUmVjb2duaXplIHRoZSBOQ1IgNDg1MCBtYWNoaW5lIGFuZCBOQ1IgUGVudGl1bS1iYXNlZCBwbGF0Zm9ybXMuCi0KLVdlZCBKdW4gIDUgMDA6MDk6MTcgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHdvbWJhdC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiAgQ29tYmluZSBtaXBzLW1pcHMtcmlzY29zIGNhc2VzLCBhbmQgdXNlIGNwcCB0bwotCWRpc3Rpbmd1aXNoIHN5c3Yvc3ZyNC9ic2QgdmFyaWFudHMuCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEhhcmxhbiBTdGVubiA8aGFybGFuQHBmY3MuY29tPi4KLQotRnJpIEp1biAgNyAxNDoyNDo0OSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGNvcHlyaWdodCBub3RpY2UuCi0JKiBtb3ZlLWlmLWNoYW5nZTogQWRkZWQgY29weXJpZ2h0IG5vdGljZS4KLQotVGh1IEp1biAgNiAxNjoyNzowNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlLSotc29sYXJpcyopOiBVbnRpbCB3ZSBnZXQgc2hhcmVkCi0JbGlicmFyaWVzIHdvcmtpbmcsIGRvbid0IGJ1aWxkIGdkYiwgc2ltLCBtYWtlLCB0Y2wsIHRrLCBvcgotCWV4cGVjdC4KLQotVHVlIEp1biAgNCAyMDo0MTo0NSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0Y6Ci0KLQlNb24gSnVuICAzIDA4OjQ5OjE0IDE5OTYgIEthcmwgSGV1ZXIgIDxrd3poQGdudS5haS5taXQuZWR1PgotCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IEFkZCBndWVzcyBmb3Igc3BhcmMtdW5rbm93bi1saW51eC4KLQotCUZyaSBNYXkgMjQgMTg6MzQ6NTMgMTk5NiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAZGVsYXN5ZC5nbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy5ndWVzcyAoQVZpaU9OOmRndXg6KjoqKTogRml4IHR5cG8gaW4gcmVjb2duaXppbmcgbWM4ODExMC4KLQotCUZyaSBBcHIgMTIgMjA6MDM6NTkgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHNwaWZmLmdudS5haS5taXQuZWR1PgotCSogY29uZmlnLmd1ZXNzOiAgQ29tYmluZSB0d28gT1NGMSBydWxlcy4KLQlBbHNvIHJlY29nbml6ZSBmaWVsZCB0ZXN0IHZlcnNpb25zLiAgRnJvbSBtanJAemszLmRlYy5jb20uCi0JKiBjb25maWcuZ3Vlc3MgKGRndXgpOiAgVXNlIC91c3IvYmluL3VuYW1lIHJhdGhlciB0aGFuIHVuYW1lLAotCWJlY2F1c2UgR05VIHVuYW1lIGRvZXMgbm90IHN1cHBvcnQgLXAuICBGcm9tIHBtckBwYWphdG8uY29tLgotCi1UdWUgSnVuICA0IDExOjA3OjI1IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRURJUlMpOiBSZW1vdmVkICQodG9vbGRpcikuCi0KLVR1ZSBNYXkgMjggMTI6MzA6NTAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctUkVBRE1FOiBEb2N1bWVudCBHQ0NJbmNsdWRlcy4KLQotU3VuIE1heSAyNiAxNToxNjoyNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLWxpbnV4Kik6IFNldCBlbmFibGVfc2hhcmVkIHRvIHllcy4KLQotVHVlIE1heSAyMSAxNTo0MTozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEhhbmRsZSAtLWVuYWJsZS1GT08gYW5kIC0tZGlzYWJsZS1GT08uCi0KLU1vbiBNYXkgMjAgMTA6MTI6MjkgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotY3lnd2luMzIpOiBDb25maWd1cmUgbWFrZS4KLQotVHVlIE1heSAgNyAxNDoxOTo0MiAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNudWZmbGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluZXQtaW5zdGFsbCk6IFF1b3RlIHZhbHVlIG9mIElOU1RBTExfTU9EVUxFUy4KLQotRnJpIE1heSAgMyAwODo1NzoxNyAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGxpc2EuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC1wZXJsLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5ldC1pbnN0YWxsKTogTmV3IHRhcmdldC4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC10Y2wuCi0JKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC1zZW5kLXByLgotCi1UdWUgQXByIDMwIDEzOjU1OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUtKi1zb2xhcmlzKik6IFR1cm4gb2ZmIHRrIGFuZCB0Y2wKLQl0ZW1wb3JhcmlseS4KLQotVGh1IEFwciAyNSAxMTo0ODoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIC0td2l0aC1nbnUtbGQgb24gQUlYLgotCi1UaHUgQXByIDI1IDA2OjMzOjM2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlLSotc29sYXJpcyopOiBUdXJuIG9mZiBnZGIgdGVtcG9yYXJpbHkuCi0KLVR1ZSBBcHIgMjMgMDk6MDc6MzkgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWluZXQuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1pbmV0LgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWluZXQuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1pbmV0LgotCShhbGwtaW5kZW50KTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkZWQgaW5ldC4KLQkobmF0aXZlX29ubHkpOiBBZGRlZCBpbmV0LgotCShub2NvbmZpZ2RpcnMpOiBBZGRlZCBpbmV0LgotCi1GcmkgQXByIDE5IDE1OjM1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGliZ2xvc3MgaWYgd2UgYXJlIG5vdCBjb25maWd1cmluZwotCW5ld2xpYi4KLQotV2VkIEFwciAxNyAxOTozMDowMSAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsaWJnbG9zcyBmb3IgdW5zdXBwb3J0ZWQKLQlhcmNoaXRlY3R1cmVzLgotCi1UdWUgQXByIDE2IDExOjE3OjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENMRUFOX01PRFVMRVMpOiBBZGQgY2xlYW4tYXBhY2hlLgotCi1Nb24gQXByIDE1IDE1OjA5OjA1IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEluY2x1ZGUgYWxsLWFwYWNoZS4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stYXBhY2hlLgotCShJTlNUQUxMX01PRFVMRVMpOiBJbmNsdWRlIGluc3RhbGwtYXBhY2hlLgotCShhbGwtYXBhY2hlKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBhcGFjaGUgZXZlcnl3aGVyZSBwZXJsIGlzIHNlZW4uCi0KLU1vbiBBcHIgMTUgMTQ6NTk6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHN1cHBvcnQgZm9yIGNsZWFuLXttb2R1bGV9IGFuZAotCWNsZWFuLXRhcmdldC17bW9kdWxlfSBydWxlcy4KLQotV2VkIEFwciAxMCAyMTozNzo0MSBQRFQgMTk5NiAgTWFyaWx5biBFLiBTYW5kZXIgPG1zYW5kZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotb3NlKSBkbyBub3QgYnVpbGQgbGliZ2xvc3MuCi0KLU1vbiBBcHIgIDggMTY6MTY6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKHByZXAqOlN1bk9TOjUuKjoqKTogVHVybiBpbnRvCi0JcG93ZXJwZWxlLXVua25vd24tc29sYXJpczIuCi0KLU1vbiBBcHIgIDggMTQ6NDU6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQotRnJpIEFwciAgNSAwODoxNzo1NyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1zb2xhcmlzKTogUGFzcyBvbmx5IHRoZSBmaXJzdCB3b3JkIG9mICRDQwotCXRvIC91c3IvYmluL3doaWNoIHdoZW4gY2hlY2tpbmcgaWYgd2UncmUgdXNpbmcgL3Vzci9jY3MvYmluL2NjLgotCi1GcmkgQXByICA1IDAzOjE2OjEzIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogcGFzcyBkb3duICQoTUFLRSkuCi0KLVRodSBNYXIgMjggMTQ6MTE6MTEgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogSW5jbHVkZSBhbGwtcGVybC4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stcGVybC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogSW5jbHVkZSBpbnN0YWxsLXBlcmwuCi0JKEFMTF9YMTFfTU9EVUxFUyk6IEluY2x1ZGUgYWxsLWd1aWxlLgotCShDSEVDS19YMTFfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stZ3VpbGUuCi0JKElOU1RBTExfWDExX01PRFVMRVMpOiBJbmNsdWRlIGluc3RhbGwtZ3VpbGUuCi0JKGFsbC1wZXJsKTogTmV3IHRhcmdldC4KLQkoYWxsLWd1aWxlKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogSW5jbHVkZSBwZXJsIGFuZCBndWlsZS4KLQkobmF0aXZlX29ubHkpOiBJbmNsdWRlIHBlcmwgYW5kIGd1aWxlLgotCShub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBndWlsZSBhbmQgcGVybDsgbm8gcG9ydHMgaGF2ZSBiZWVuCi0JZG9uZS4KLQotVHVlIE1hciAyNiAyMToxODo1MCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0gICAgICAgICogY29uZmlndXJlICgtLWVuYWJsZS0qKTogSGFuZGxlIHF1b3RlZCBvcHRpb24gbGlzdHMgc3VjaCBhcwotICAgICAgICAtLWVuYWJsZS1zaW0tY2ZsYWdzPSctZzAgLU8nIGJldHRlci4KLQotVGh1IE1hciAyMSAxMTo1MzowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh7LGluc3R9YWxsLXRhcmdldCk6IE5ldyBydWxlIHNvIHdlIGNhbiBtYWtlIGFuZAotCWluc3RhbGwgYWxsIG9mIHRoZSB0YXJnZXQgZGlyZWN0b3JpZXMgZWFzaWx5LgotCi1XZWQgTWFyIDIwIDE4OjEwOjU3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtaXNzaW5nIGdsb2JhbCBmbGFnIGluIHNlZCBzdWJzdGl0dXRpb24gd2hlbgotCWRlbGV0aW5nIGB0YXJnZXQtJyBmcm9tICR7Y29uZmlnZGlyc30uCi0KLVRodSBNYXIgMTQgMTk6MTU6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRE9fWCk6IERvbid0IGdldCBjb25mdXNlZCBpZiBDQyBjb250YWlucyBgPScgaW4gYW4KLQlvcHRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotbmVjLXN5c3ZyNCopOiBVc2UgYSBob3N0X21ha2VmaWxlX2ZyYWcgb2YKLQljb25maWcvbWgtbmVjdjQuCi0KLQkqIGluc3RhbGwuc2g6IENvcnJlY3QgbWlzc3BlbGxpbmcgb2YgdHJhbnNmb3JtYmFzZW5hbWUuCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG1pcHMtKi1zeXN2Ki4KLQotTW9uIE1hciAxMSAxNTozNjo0MiAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBtb245NjAuCi0KLVN1biBNYXIgMTAgMTM6MTg6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlc3RvcmUgQ2FuYWRpYW4gQ3Jvc3MgaGFuZGxpbmcgb2YgQklTT04gYW5kIExFWCwKLQlyZW1vdmVkIGluIEZlYiAyMCBjaGFuZ2UuCi0KLUZyaSBNYXIgIDggMjA6MDc6MDkgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogIFN1Z2dlc3Rpb25zIGZyb20gVG9yYmpvcm4gR3Jhbmx1bmQgPHRlZ2VAbWF0ZW1hdGlrLnN1LnNlPjoKLQlNZW50aW9uIG1ha2UgaW5zdGFsbC4gIFJlbW92ZSB0aGUgb2xkIGNvcHlyaWdodCBkYXRlIGFzIHdlbGwgdGhlCi0JY2x1bXN5IGFuZCByYXRoZXIgcG9pbnRsZXNzIGNvcHlyaWdodCBvbiB0aGUgUkVBRE1FIGZpbGUuCi0KLUZyaSBNYXIgIDggMTc6NTE6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogSWYgdGhlcmUgaXMgYQotCU1ha2VmaWxlIGFmdGVyIHJ1bm5pbmcgc3ltbGluay10cmVlLCB0aGVuIHJ1biBgbWFrZSBkaXN0Y2xlYW4nIHRvCi0JYXZvaWQgY2xvYmJlcmluZyBhbnkgZ2VuZXJhdGVkIGZpbGVzIGluIHNyY2Rpci4KLQotVHVlIE1hciAgNSAwODoyMTo0NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLW5ldGJzZCopOiBCdWlsZCBldmVyeXRoaW5nIG5vdy4KLQotV2VkIEZlYiAyOCAxMjoyNTo0NiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBGaXggcXVvdGluZy4KLQotVHVlIEZlYiAyNyAxMTozMzo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyY2xldC0qLSopOiBCdWlsZCBldmVyeXRoaW5nIG5vdy4KLQotVHVlIEZlYiAyNyAxNDozMTo1MSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotbGludXgqKTogTmV3IGhvc3QuCi0KLU1vbiBGZWIgMjYgMTQ6MzI6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IENoZWNrIGZvciBiaXNvbiBiZWZvcmUgYnlhY2MuCi0KLVR1ZSBGZWIgMjAgMjM6MTI6MzUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gY29uZmlndXJlOiAgQ2hhbmdlIHRoZSB3YXkgTEVYIGFuZCBCSVNPTi9ZQUNDIGFyZQotCXNldC4gIGNvbmZpZ3VyZSBub3cgZGVmaW5lcyBERUZBVUxUX0xFWCBhbmQgREVGQVVMVF9ZQUNDIGJ5Ci0Jc2VhcmNoaW5nIFBBVEguICBUaGVzZSBhcmUgdXNlZCBhcyBmYWxsYmFja3MgYnkgTWFrZWZpbGUuaW4gaWYKLQlmbGV4L2Jpc29uL2J5YWNjIGFyZW4ndCBpbiBvYmpkaXIuCi0KLU1vbiBGZWIgMTkgMTE6NDU6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSBldmVyeXRoaW5nIHdoaWNoIGRlcGVuZHMgdXBvbiBhbGwtYmZkIGFsc28KLQlkZXBlbmQgdXBvbiBhbGwtb3Bjb2RlcywgaW4gY2FzZSAtLXdpdGgtY29tbW9uYmZkbGliIGlzIHVzZWQuCi0KLVRodSBGZWIgMTUgMTk6NTA6NTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgKi0qLWN5Z3dpbjMyKTogRG9uJ3QgYnVpbGQgZ2RiIGlmIHdlIGFyZQotCWJ1aWxkaW5nIE5UIG5hdGl2ZSBjb21waWxlcnMgb24gVW5peC4KLQotVGh1IEZlYiAxNSAxNzo0MjoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgZ2V0IENDIGZyb20gdGhlIGhvc3QgTWFrZWZpbGUgZnJhZ21lbnQgaWYgd2UKLQljYW4gZmluZCBnY2MgaW4gUEFUSCwgb3IgaWYgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzLiAgTW92ZSB0aGUKLQlTb2xhcmlzIHRlc3QgZm9yIC91c3IvdWNiL2NjIHRvIHRoZSBwb3N0IHRhcmdldCBzY3JpcHQsIGp1c3QgYWZ0ZXIKLQl0aGUgY29tcGlsZXIgc2FuaXR5IHRlc3QuCi0KLVdlZCBGZWIgMTQgMTY6NTc6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIEZTRi4KLQotVHVlIEZlYiAxMyAxNDoyNzo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCi0JKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBVc2UgaXQuCi0JKiBjb25maWd1cmUuaW46IE9uIEhQL1VYLCBzZXQgUlBBVEhfRU5WVkFSIHRvIFNITElCX1BBVEguCi0KLU1vbiBGZWIgMTIgMTU6Mjg6NDkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIHNwYXJjbGV0IGNwdS4KLQotTW9uIEZlYiAxMiAxNTozMzo1OSAxOTk2ICBDaHJpc3RpYW4gQmF1ZXJuZmVpbmQgPGNocmlzYmZkQHRoZW9yaWUzLnBoeXNpay51bmktZXJsYW5nZW4uZGU+Ci0KLQkqIGNvbmZpZy5ndWVzczogIFN1cHBvcnQgbTY4ay1jYm0tc3lzdjQuCi0KLVNhdCBGZWIgMTAgMTI6MDY6NDIgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBHdWVzcyBtNjhrLXVua25vd24tbGludXggYW5kCi0JbTY4ay11bmtub3duLWxpbnV4YW91dCBmcm9tIGxpbmtlciBoZWxwIHN0cmluZy4gIFB1dCBxdW90ZXMgYXJvdW5kCi0JJGxkX2hlbHBfc3RyaW5nLgotCi1UaHUgRGVjICA3IDA5OjAzOjI0IDE5OTUgIFRvbSBIb3JzbGV5ICA8VG9tLkhvcnNsZXlAbWFpbC5oY3NjLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgpOiBBZGQgZ3Vlc3MgZm9yIHBvcnQKLQl0byBuZXcgdGFyZ2V0LgotCi1UaHUgRmViICA4IDE1OjM3OjUyIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChVTkFNRV9WRVJTSU9OKTogUmVjb2duaXplIFg0LnggYXMgYW4gT1NGIHZlcnNpb24uCi0KLU1vbiBGZWIgIDUgMTY6MzY6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIC0tZW5hYmxlLXNoYXJlZCB3YXMgdXNlZCwgc2V0IFNFVF9MSUJfUEFUSCB0bwotCSQoUkVBTExZX1NFVF9MSUJfUEFUSCkgaW4gTWFrZWZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoU0VUX0xJQl9QQVRIKTogTmV3IHZhcmlhYmxlLgotCShSRUFMTFlfU0VUX0xJQl9QQVRIKTogTmV3IHZhcmlhYmxlLgotCSgkKERPX1gpKTogVXNlICQoU0VUX0xJQl9QQVRIKS4KLQkoaW5zdGFsbC5hbGwsIGdjYy1uby1maXhlZGluY2x1ZGVzLCAkKEFMTF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKE5BVElWRV9DSEVDS19NT0RVTEVTKSwgJChDUk9TU19DSEVDS19NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKElOU1RBTExfTU9EVUxFUyksICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKEFMTF9UQVJHRVRfTU9EVUxFUyksICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpKTogTGlrZXdpc2UuCi0JKCQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyksICQoQUxMX1gxMV9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKENIRUNLX1gxMV9NT0RVTEVTKSwgJChJTlNUQUxMX1gxMV9NT0RVTEVTKSk6IExpa2V3aXNlLgotCShhbGwtZ2NjLCBhbGwtYm9vdHN0cmFwLCBjaGVjay1nY2MsIGluc3RhbGwtZ2NjKTogTGlrZXdpc2UuCi0JKGluc3RhbGwtZG9zcmVsKTogTGlrZXdpc2UuCi0JKGFsbC1vcGNvZGVzKTogRGVwZW5kIHVwb24gYWxsLWxpYmliZXJ0eS4KLQotU3VuIEZlYiAgNCAxNjo1MToxMSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKCo6Q1lHV0lOKik6IE5ldwotCi1TYXQgRmViICAzIDEwOjQyOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtd2luc3VwKTogQWxsIGFsbC10YXJnZXQtbGliaWJlcnR5LgotCi1GcmkgRmViICAyIDE3OjU4OjU2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgbWlzc2luZyAjIGluIGZyb250IG9mIGNvbW1lbnQuCi0KLVRodSBGZWIgIDEgMTQ6Mzg6MTMgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgc2Vjb25kIHBhc3MgdG8gdGhpbmdzIGFkZGVkIHRvIG5vY29uZmlnZGlycwotCXNvICotZ20tbWFnaWMgY2FuIGV4Y2x1ZGUgbGliZ2xvc3MgcHJvcGVybHkuCi0KLVRodSBGZWIgIDEgMTE6MTA6MTYgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlIChleHRyYWxpYnNfbmFtZSwgcmV6X25hbWUpOiBTZXQgY29ycmVjdGx5Ci0JZm9yIE1XQzY4SyBjb21waWxlci4KLQotCSogbXB3LVJFQURNRTogQWRkIG1vcmUgaW5mbyBvbiB0aGUgbmVjZXNzYXJ5IGJ1aWxkIHRvb2xzLgotCi1UaHUgRmViICAxIDEwOjIyOjM4IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLnN1YjogUmVjb2duaXplIGN5Z3dpbjMyLgotCi1XZWQgSmFuIDMxIDE0OjE3OjEwIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBBL1VYLgotCi1XZWQgSmFuIDMxIDEzOjUyOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBnY2MvY29uZmlnLnN1Yi4KLQotVGh1IEphbiAyNSAxMTowMToxMCAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHctYnVpbGQuaW4gKGRvLWJpbnV0aWxzKTogQWRkIGJ1aWxkIG9mIHN0YW1wcy4KLQotVGh1IEphbiAyNSAxNzowNToyNiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCByZWNvZ25pdGlvbiBmb3IgbWlwczY0dnI0MTAwKi0qIHRhcmdldHMuCi0KLVdlZCBKYW4gMjQgMTI6NDc6NTUgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBBZGQgY2hlY2tpbmcgb2YgYGhwdXg5JyByYXRoZXIgdGhhbiBqdXN0IGBocHV4Jy4KLQlBZGQgY3JlYXRpb24gb2YgZ2NvbmZpZ2FyZ3Mgd2l0aCBgLS1lbmFibGUtc2hhcmVkJyB0dXJuZWQgb24uCi0JKCQoaG9zdCktc3RhbXAtc3RhZ2UyLWNvbmZpZ3VyZWQpOiBQYXNzICQoZ2NvbmZpZ2FyZ3MpLgotCSgkKGhvc3QpLXN0YW1wLXN0YWdlMy1jb25maWd1cmVkKTogTGlrZXdpc2UuCi0JKEhPTEVTKTogQWRkIGNoYXRyIGFuZCBsZGQuCi0JKGkzODYtbmNyLXN5c3Y0LjMqKTogQWRkIHVzZSBvZiAvdXNyL2Njcy9iaW4gaW4gdGhlIFBBVEggYW5kIEhPTEVfRElSUy4KLQotV2VkIEphbiAyNCAyMDozMjozMCAxOTk2ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAbm9pc3kubWF0ZW1hdGlrLnN1LnNlPgotCi0JKiBjb25maWd1cmU6IFBhc3MgLS1uZnAgdG8gcmVjdXJzaXZlIGNvbmZpZ3VyZXMuCi0KLU1vbiBKYW4gMjIgMTA6NDE6NTYgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERMTFRPT0wpOiBOZXcuCi0JKERMTFRPT0xfRk9SX1RBUkdFVCk6IE5ldy4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFBhc3MgZG93biBETExUT09MLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQkoRVhUUkFfR0NDX0ZMQUdTKTogRGl0dG8uCi0JKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IERpdHRvLgotCShET19YKTogRGl0dG8uCi0JKiBjb25maWd1cmU6IEFkZCBETExUT09MLgotCi1GcmkgSmFuIDE5IDEzOjMwOjE1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCVNDTyBPcGVuU2VydmVyIDUgY2hhbmdlcyBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1zY28zLjJ2NSopOiBVc2UgbWgtc3lzdiBpbnN0ZWFkIG9mCi0JbWgtc2NvLCBzaW5jZSBvbGQgd29ya2Fyb3VuZHMgbm8gbG9uZ2VyIG5lZWRlZCwgYW5kIGRvbid0Ci0JYnVpbGQgbGQsIHNpbmNlIGxpYnJhcmllcyBoYXZlIHdlYWsgc3ltYm9scyBpbiBDT0ZGLgotCi1TdW4gSmFuIDE0IDIzOjAxOjMxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogQWRkIG1pc3NpbmcgJzsnLgotCi1GcmkgSmFuIDEyIDE1OjI1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgdGhhdCAke0NDfSBjYW4gYmUgdXNlZCB0byBjb21waWxlIGFuCi0JZXhlY3V0YWJsZS4KLQotV2VkIEphbiAgMyAxNzo1NDo0MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobmV3bGliLnRhci5neik6IERlbGV0ZSBidWlsZGluZyBvZiBuZXdsaWIncyBpbmZvIGZpbGVzLgotCi1Nb24gSmFuICAxIDE5OjA5OjE0IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFB1dCBsZCBvciBnYXMgaW4gdGhpcyBlYXJseSwgaWYgdGhlCi0JdXNlciBzcGVjaWZpY2FsbHkgdXNlZCAtLXdpdGgtZ251LWxkPW5vIG9yIC0td2l0aC1nbnUtYXM9bm8uCi0KLVNhdCBEZWMgMzAgMTY6MDg6NTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBBZGQgc3VwcG9ydCBmb3IKLQktLWRpc2FibGUte3NvZnRmbG9hdCxtNjg4ODEsbTY4MDAwLG02ODAyMH0gb24gbTY4Ki0qLSouCi0JU2ltcGxpZnkgc2V0dGluZyBvZiBtdWx0aWRpcnMgZnJvbSAtLWRpc2FibGUtZm9vLgotCi1GcmkgRGVjIDI5IDA3OjU2OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IElmIGFueSBvZiB0aGUgbWFrZSB2YXJpYWJsZXMKLQlMQU5HVUFHRVMsIEJPT1RfQ0ZMQUdTLCBTVE1QX0ZJWFBST1RPLCBMSU1JVFNfSF9URVNULAotCUxJQkdDQzFfVEVTVCwgTElCR0NDMl9DRkxBR1MsIExJQkdDQzJfSU5DTFVERVMsIGFuZCBFTlFVSVJFIGFyZQotCW5vbi1lbXB0eSwgcGFzcyB0aGVtIG9uIHRvIHRoZSAJR0NDIG1ha2UuCi0JKGFsbC1ib290c3RyYXApOiBOZXcgcnVsZSB0aGF0IGlzIGxpa2UgYWxsLWdjYywgZXhjZXB0IGl0IGV4ZWN1dGVzCi0JdGhlIEdDQyBib290c3RyYXAgcnVsZSBpbnN0ZWFkIG9mIHRoZSBHQ0MgYWxsIHJ1bGUuCi0KLVdlZCBEZWMgMjcgMTU6NTE6NDggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluIChtbF9yZWFsc3JjZGlyKTogTmV3LCB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0KLVR1ZSBEZWMgMjYgMTE6NDU6MzEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IFVwZGF0ZSBmcm9tIEZTRiB0byBhZGQgcGVudGl1bQotCURHL1VYIHN1cHBvcnQuCi0KLUZyaSBEZWMgMTUgMTA6MDE6MjcgMTk5NSAgU3RhbiBDb3ggIDxjb3hzQGRnLXJ0cC5kZy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGkqODYqKSBDaGFuZ2UgWzM0NV0gdG8gWzM0NTZdCi0KLVdlZCBEZWMgMjAgMTc6NDE6NDAgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBnYXMgb3IgbGQgaWYgLS13aXRoLWdudS1hcz1ubyBvcgotCS0td2l0aC1nbnUtbGQ9bm8uCi0KLVdlZCBEZWMgMjAgMTU6MTU6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKHJzNjAwMCosIHBvd2VycGMqKTogQWRkIHN3aXRjaGVzIHRvIGNvbnRyb2wgd2hpY2gKLQlBSVggbXVsdGlsaWJzIGdldCBidWlsdC4KLQotTW9uIERlYyAxOCAxNzo1NTo0NiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LXdpbjMyKTogRG9uJ3QgYnVpbGQgZXhwZWN0IGlmIHdlJ3JlIG5vdAotCWJ1aWxkaW5nIHRoZSB0Y2wgc3ViZGlyLgotCi1Nb24gRGVjIDE4IDExOjQ3OjE5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IChjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzLCBhbGwtdGFyZ2V0LWV4YW1wbGVzKToKLQlOZXcgdGFyZ2V0cywgY29uZmlndXJlIGFuZCBidWlsZCBleGFtcGxlIHByb2dyYW1zLgotCi1GcmkgRGVjIDE1IDE2OjEzOjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSWYgYW4gbXB3LWNvbmZpZy5pbiBnZW5lcmF0ZWQgYSBmaWxlIG1rLnNlZCwKLQl1c2UgaXQgYXMgaW5wdXQgdG8gc2VkaXQgdGhlIGdlbmVyYXRlZCBNUFcgbWFrZWZpbGUuCi0JKiBtcHctUkVBRE1FOiBBZGQgYSBzdWdnZXN0aW9uIGFib3V0IEdlc3RhbHQuaC4KLQotV2VkIERlYyAxMyAxNjo0Mzo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAqLSotaWVlZSouCi0KLVR1ZSBEZWMgMTIgMTE6NTI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogUmVtb3ZlICQoVEFSR0VUX1NVQkRJUikuICBGcm9tCi0JUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotTW9uIERlYyAxMSAxNTozMTo1OCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1wb3dlcnBjLXBlKTogQWRkIG1hbnkgZGlyZWN0b3JpZXMgdG8gbm9jb25maWdkaXJzCi0JZm9yIHBvd2VycGMtcGUgbmF0aXZlLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgdGNsLCBtYWtlIHRvIG5vY29uZmlnZGlycyBpZiBjYW5hZGlhbiBjcm9zcy4KLQkodGFyZ2V0PT1wb3dlcnBjLXBlKTogZHVwbGljYXRlIGkzODYtd2luMzIgZW50cnkuCi0KLVNhdCBEZWMgIDkgMTQ6NTg6MjggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEV4Y2x1ZGUgdGFyZ2V0LW5ld2xpYiBmb3IgYWxsIHZlcnNpb25zCi0Jb2Ygdnh3b3Jrcywgbm90IGp1c3Qgdnh3b3JrczUuMS4KLQotTW9uIERlYyAgNCAxMjowNTo0MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciBleGVjLXByZWZpeC4KLQotTW9uIERlYyAgNCAxMDoyMjo1MCAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSFAgbW9kZWwgODE2IG1hY2hpbmVzIGFzIGhhdmluZwotCWEgUEExLjEgcHJvY2Vzc29yLgotCi1Nb24gRGVjICA0IDEyOjM4OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZ25vcmUgbmV3IGF1dG9jb25mIGNvbmZpZ3VyZSBvcHRpb25zLgotCi1UaHUgTm92IDMwIDE0OjQ1OjI1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXY4MTAgKENDX0ZPUl9UQVJHRVQpOiBBZGQgLWFuc2kgZmxhZy4gIE5FQyBjb21waWxlcgotIAlkZWZhdWx0cyB0byBLJlIgbW9kZSwgYnV0IGRvZXNuJ3QgaGF2ZSB2YXJhcmdzLmgsIHNvIHdlIGhhdmUgdG8gCi0JY29tcGlsZSBpbiBBTlNJIG1vZGUuCi0KLVRodSBOb3YgMzAgMTY6NTc6MzMgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHdvbWJhdC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIFBlbnRpdW0gdW5kZXIgU0NPLgotCUZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotV2VkIE5vdiAyOSAxMzo0OTowOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSB0YXJnZXQtbGliaW8gb24gdjgxMC0qLSouCi0JKiBjb25maWcvbXQtdjgxMCAoQ0NfRk9SX1RBUkdFVCwgQVNfRk9SX1RBUkdFVCwgQVJfRk9SX1RBUkdFVCwKLQlSQU5MSUJfRk9SX1RBUkdFVCk6IFNldCBhcyBhcHByb3ByaWF0ZSBmb3IgTkVDIHY4MTAgdG9vbGNoYWluLgotCi1XZWQgTm92IDI5IDEyOjEyOjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgZ2FzIGZvciBhbHBoYS1kZWMtb3NmKi4KLQotVHVlIE5vdiAyOCAxNzoxNjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmYXVsdCB0byAtLXdpdGgtc3RhYnMgZm9yIHNvbWUgdGFyZ2V0cyBmb3Igd2hpY2gKLQlpdCBtYWtlcyBzZW5zZTogbWlwcyotKi0qLCBhbHBoYSotKi1vc2YqLCBpWzM0NV04NiotKi1zeXN2NCogYW5kCi0JaVszNDVdODYqLSotdW5peHdhcmUqLgotCi1Nb24gTm92IDI3IDEzOjQ0OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBHZXQgbGlzdCBvZiBtdWx0aWRpcnMgdXNpbmcgZ2NjIC0tcHJpbnQtbXVsdGktbGliCi0JcmF0aGVyIHRoYW4gYmFzaW5nIGl0IG9uIHRoZSB0YXJnZXQuICBTaW1wbGlmeSBoYW5kbGluZyBvZiBvcHRpb25zCi0JY29udHJvbGxpbmcgd2hpY2ggZGlyZWN0b3JpZXMgdG8gY29uZmlndXJlLiAgUmVtb3ZlIGV4dHJhbmVvdXMKLQlzbGFzaCBpbiBtdWx0aS1jbGVhbiB0YXJnZXQuCi0KLUZyaSBOb3YgMjQgMTc6Mjk6MjkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IFByZWZpeCBtb3JlIHZhcmlhYmxlcyB3aXRoIG1sXyBzbyB0aGV5IGRvbid0IGNvbGxpZGUKLQl3aXRoIGNvbmZpZ3VyZSdzLgotCi1XZWQgTm92IDIyIDExOjI3OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCB0dXJuIC12IGludG8gLS12LgotCi1UdWUgTm92IDIxIDE2OjQ4OjAyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IEZpeCB0eXBvLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIHN5bWxpbmstdHJlZS4KLQotVHVlIE5vdiAyMSAxNDowODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RyaXAgLS1ob3N0IGFuZCAtLXRhcmdldCBvcHRpb25zIGZyb20KLQlDT05GSUdfQVJHVU1FTlRTLCBhbmQgYWx3YXlzIGNvbmZpZ3VyZSBmb3IgLS1ob3N0IG9ubHkuICBBZGQKLQktLXdpdGgtY3Jvc3MtaG9zdCBvcHRpb24gd2hlbiBidWlsZGluZyB3aXRoIGEgY3Jvc3MtY29tcGlsZXIuCi0JKiBjb25maWd1cmU6IENhbm9uaWNhbGl6ZSB0aGUgYXJndW1lbnRzIHB1dCBpbnRvIGNvbmZpZy5zdGF0dXMgYnkKLQlhbHdheXMgdXNpbmcgYD0nIGZvciBhbiBvcHRpb24gd2l0aCBhbiBhcmd1bWVudC4gIFBhc3MgYSBwcmVzdW1lZAotCS0taG9zdCBvciAtLXRhcmdldCBleHBsaWNpdGx5LgotCi1GcmkgTm92IDE3IDE3OjUwOjMwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2UgLW1hY29zKiwgLW1hZ2ljKiwgLXBlKiwgYW5kIC13aW4zMiBjYXNlcwotCWludG8gZ2VuZXJhbCBPUyByZWNvZ25pdGlvbiBjYXNlLgotCi1GcmkgTm92IDE3IDE3OjQyOjI1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9jb25maWdkaXJzKTogYWRkIHRhcmdldC13aW5zdXAgb25seQotCWZvciB3aW4zMiB0YXJnZXQgc3lzdGVtcy4KLQotVGh1IE5vdiAxNiAxNDowNDo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmdsb3NzKTogRGVwZW5kIHVwb24KLQljb25maWd1cmUtdGFyZ2V0LW5ld2xpYiwgc2luY2Ugd2hlbiBsaWJnbG9zcyBpcyBidWlsdCBpdCBsb29rcyB0bwotCXNlZSBpZiB0aGUgbmV3bGliIGRpcmVjdG9yeSBleGlzdHMuCi0KLVdlZCBOb3YgMTUgMTQ6NDc6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBVc2UgY29uZmlnLW1sLmluIGluc3RlYWQgb2YKLQljZmctbWwtKi5pbi4KLQotV2VkIE5vdiAxNSAxMTo0NToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIExEIGFuZCBMRF9GT1JfVEFSR0VUIHdoZW4gY29uZmlndXJpbmcgYQotCUNhbmFkaWFuIENyb3NzLgotCi1UdWUgTm92IDE0IDE1OjAzOjEyIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaTM4NndpbjMyOiBhZGQgTERfRk9SX1RBUkdFVC4KLQotVHVlIE5vdiAxNCAxNDo1NjoxMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IGFkZCB0YXJnZXQtd2luc3VwLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgcGF0Y2ggZGlmZiBmbGV4IG1ha2UgdG8gJG5vY29uZmlnZGlycy4KLQkodGFyZ2V0PT1wcGNsZS1wZSk6IHJlbW92ZSBsZCBmcm9tICRub2NvbmZpZ2RpcnMuCi0KLVR1ZSBOb3YgMTQgMDE6MjU6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IFBhc3MgLS13aXRoLXRhcmdldC1zdWJkaXIuCi0JUHJlc2VydmUgcmVsYXRpdmUgcGF0aCBuYW1lcyBpbiAkc3JjZGlyLiAgQnVpbGQgc3ltbGluayB0cmVlIGlmCi0JY29uZmlndXJpbmcgY3Jvc3MgdGFyZ2V0IGRpciBhbmQgc3JjZGlyPS4gKD0gbm8gVlBBVEggc3VwcG9ydCkuCi0JKGNvbmZpZ3VyZS10YXJnZXQtbGliZysrKTogRGVwZW5kIG9uIGNvbmZpZ3VyZS10YXJnZXQtbGlicnguCi0JKiBjZmctbWwtY29tLmluLCBjZmctbWwtcG9zLmluOiBEZWxldGVkLgotCSogY29uZmlnLW1sLmluOiBOZXcgZmlsZS4KLQkqIHN5bWxpbmstdHJlZTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IEVuc3VyZSBzcmNkaXI9Ii4iIGlmIHRoYXQncyB3aGF0IGl0IGlzLgotCi1Nb24gTm92IDEzIDEyOjM0OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LVJFQURNRTogQ2xhcmlmeSBzb21lIHBocmFzaW5nLCBhZGQgbm90ZXMgYWJvdXQgQ29kZVdhcnJpb3IKLQlpbmNsdWRlcyBhbmQgRkxFWF9TS0VMRVRPTiBzZXR0aW5nLgotCSogbXB3LWNvbmZpZ3VyZSAoLS13aXRoLWdudS1sZCk6IE5ldyBvcHRpb24sIGNvbnRyb2xzIHdoZXRoZXIKLQl0byB1c2UgUFBDTGluayBvciBsZCB3aXRoIFBvd2VyTWFjIEdDQy4KLQkqIG1wdy1idWlsZC5pbiAoYWxsLWdyZXosIGRvLWdyZXosIGluc3RhbGwtZ3Jleik6IE5ldyB0YXJnZXRzLgotCSogbXB3LWNvbmZpZy5pbjogQ29uZmlndXJlIGdyZXogaWYgdGFyZ2V0aW5nIE1hYy4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IHBtYWMgYW5kIHBtYWMtbXB3IGFzIG5hbWVzIGZvciBQb3dlck1hY3MsCi0gCWFjY2VwdCBtcHcgYW5kIG1hYy1tcHcgYXMgbmFtZXMgZm9yIG02OGsgTWFjcywgY2hhbmdlIG1hY29zNyB0bwotIAlqdXN0IG1hY29zLgotCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgZ3JleiByZXNvdXJjZSBjb21waWxlciBpZiB0YXJnZXRpbmcgTWFjLgotCSogTWFrZWZpbGUuaW4gKGFsbC1ncmV6LCBpbnN0YWxsLWdyZXopOiBOZXcgdGFyZ2V0cy4KLQotV2VkIE5vdiAgOCAxNzozMzo1MSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQ1hYIGRlZmF1bHRzIHRvIGdjYywgbm90IGcrKy4gIElmIHdlIGZpbmQKLSAJZ2NjIGluIHRoZSBwYXRoLCBzZXQgQ0MgdG8gZ2NjIC1PMi4KLQotVHVlIE5vdiAgNyAxNTo0NToxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmYXVsdCAke2J1aWxkfSBjb3JyZWN0bHkuICBBdm9pZCBwaWNraW5nIHVwIGV4dHJhCi0Jc3BhY2VzIHdoZW4gcmVhZGluZyBDQyBhbmQgQ1hYIGZyb20gTWFrZWZpbGUuICBXaGVuIGRvaW5nIGEKLQlDYW5hZGlhbiBDcm9zcywgdXNlIHBsYXVzaWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgbnVtZXJvdXMKLQl2YXJpYWJsZXMuCi0JKiBjb25maWd1cmUuaW46IFdoZW4gZG9pbmcgYSBDYW5hZGlhbiBDcm9zcywgZG9uJ3QgdHJ5IHRvCi0JY29uZmlndXJlIHRvb2xzIHdob3NlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgaGFuZGxlIGl0LgotCi1Nb24gTm92ICA2IDE5OjMyOjE3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoc2gtKi0qKTogQWRkIG0yIGFuZCBtbC9tMiB0byBtdWx0aWRpcnMuCi0KLVN1biBOb3YgIDUgMDA6MTU6NDEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogIFJlbW92ZSBkdWJpb3VzIGJ1ZyByZXBvcnRpbmcgYWRkcmVzcy4KLQotRnJpIE5vdiAgMyAwODoxNzo1NCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6ICBJZiBzdWJkaXIgaGFzCi0JY29uZmlndXJlIHNjcmlwdCwgcnVuIHRoYXQgaW5zdGVhZCBvZiB0aGlzIGRpcmVjdG9yeSdzIGNvbmZpZ3VyZS4KLQlJbiBlaXRoZXIgY2FzZSwgcHJpbnQgYSBtZXNzYWdlIHRoYXQgd2UncmUgY29uZmlndXJpbmcgdGhlIHN1Yi1kaXIuCi0KLVRodSBOb3YgIDIgMjM6MjM6MzYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQmVmb3JlIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHZhcmlvdXMgZmlsZXMsCi0JdXNlIHNlZCB0byBmaWx0ZXIgb3V0ICJ0YXJnZXQtIi4KLQotVGh1IE5vdiAgMiAxMzoyNDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChET19YKTogU3BsaXQgcnVsZSB0byBkZWNyZWFzZSBjb21tYW5kIGxpbmUgbGVuZ3RoCi0JZm9yIHN5c3RlbXMgd2l0aCBzbWFsbCBBUkdfTUFYIHZhbHVlcy4gIEZyb20gcGhkbUBpbmZvLnVjbC5hYy5iZQotCShQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDE1OjE4OjM1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXBhdGNoKTogZGVwZW5kIG9uIGFsbC1saWJpYmVydHkuCi0KLVdlZCBOb3YgIDEgMTI6MjM6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHRoZSBvbmx5IGRpcmVjdG9yeSBpbiB0YXJnZXRfY29uZmlnZGlycyB3aGljaAotCWFjdHVhbGx5IGV4aXN0cyBpcyBsaWJpYmVydHksIHRoZW4gc2V0IHRhcmdldF9jb25maWdkaXJzIHRvIGVtcHR5LAotCXRvIGF2b2lkIHRyeWluZyB0byBidWlsZCBhIHRhcmdldCBsaWJpYmVydHkgaW4gYSBnYXMgb3IgZ2RiCi0JZGlzdHJpYnV0aW9uLgotCi1UdWUgT2N0IDMxIDE3OjUyOjM5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BzbGF2ZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6IFVzZSBtNjhrLXN1bi1zdW5vcyogaW5zdGVhZAotIAlvZiBtNjhrLXN1bi0qIHdoZW4gc2VsZWN0aW5nIG1oLXN1bjMgdG8gYXZvaWQgbWF0Y2hpbmcgTmV0QlNEL3N1bjMKLSAJc3lzdGVtcy4KLQotVHVlIE9jdCAzMSAxNjo1NzozMiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY29weV9kaXJzKTogVXNlIHN5cy1pbmNsdWRlIGluc3RlYWQgb2YgaW5jbHVkZQotCWZvciAtLXdpdGgtaGVhZGVycyBvcHRpb24uCi0KLVR1ZSBPY3QgMzEgMTA6Mjk6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogTWFrZSB3aW5zdXAgYnVpbGRzIHdvcmsgd2l0aAotCW5ldyBzY2hlbWUuCi0KLU1vbiBPY3QgMzAgMTg6NTc6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIHRoZSBsaW5rZXIgb24gQUlYLgotCi1Nb24gT2N0IDMwIDEyOjI3OjE2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiAgQWRkICQoVEFSR0VUX1NVQkRJUikKLQl3aGVyZSBuZWVkZWQuCi0KLU1vbiBPY3QgMzAgMTI6NDU6MjUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEZpeCB0eXBvLgotCi1TYXQgT2N0IDI4IDEwOjI3OjU5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDSEVDS19UQVJHRVRfTU9EVUxFUykpOiAgRml4IHR5cG8uCi0KLUZyaSBPY3QgMjcgMjM6MTQ6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbmFtZSBsaWJGT08gdG8gdGFyZ2V0LWxpYkZPTywgYW5kIHhpYmVydHkKLQl0byB0YXJnZXQteGliZXJ0eSwgdG8gcHJvdmlkZSBtb3JlIGZsZXhpYmlsaXR5LgotCSh0YXJnZXRfc3ViZGlyKTogIERlZmluZS4gIENyZWF0ZSBpZiBjcm9zcy4KLQlTZXQgVEFSR0VUX1NVQkRJUiBpbiBNYWtlZmlsZSB0byAke3RhcmdldF9zdWJkaXJ9LgotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgYWxsLWxpYkZPTyAtPiBhbGwtdGFyZ2V0LWxpYkZPTywgYWxsLXhpYmVydHkKLQktPiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSwgY29uZmlndXJlLWxpYkZPTyAtPiBjb25maWd1cmUtdGFyZ2V0LWxpYkZPTywKLQljaGVjay1saWJGT08gLT4gY2hlY2stdGFyZ2V0LWxpYkZPTywgZXRjLgotCSgkKERPX1gpKTogIEl0ZXJhdGUgb3ZlciBUQVJHRVRfQ09ORklHRElSUyBhZnRlciBTVUJESVJTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyksICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpLAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSk6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkoY29uZmlndXJlLXRhcmdldC1YWFgpOiAgRGVwZW5kIG9uICQoQUxMX0dDQyksIG5vdCBhbGwtZ2NjLCB0bwotCWFsbG93IEFMTF9HQ0M9IiIgdG8gb25seSBjb25maWd1cmUuCi0JKERFVk9fU1VQUE9SVCk6ICBBZGQgY2ZnLW1sLWNvbS5pbiBhbmQgY2ZnLW1sLXBvcy5pbi4KLQkoRVRDX1NVUFBPUlQsIEVUQ19TVVBQT1JUX1BGWCk6ICBNZXJnZTsgIHVwZGF0ZSAndGF6JyBhY2NvcmRpbmdseS4KLQkoTElCR1hYX1NVUFBPUlRfRElSUyk6ICBSZW1vdmUgeGliZXJ0eS4KLQotU2F0IE9jdCAyOCAwMTo1Mzo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEJ1aWxkICJpbmZvIiBpbiBldGMgZXhwbGljaXRseS4KLQotRnJpIE9jdCAyNyAwOTozMjozMCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIHN1cmUgdGhhdCBDQyBpcyB1bmRlZmluZWQgKGFzIG9wcG9zZWQgdG8KLQludWxsKSBpZiB0b3BsZXZlbC9jb25maWcvbWgte2hvc3R9IGRvZXNuJ3QgZGVmaW5lIGl0LiAgRml4ZXMgYQotCXByb2JsZW0gd2l0aCBhdXRvY29uZiB0cnlpbmcgdG8gY29uZmlndXJlIG9uIGEgaG9zdCB3aXRob3V0IEdDQy4KLQotVGh1IE9jdCAyNiAyMjozNTowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IFNldCBob3N0IGFsaWFzIGZyb20gY2hvaWNlIG9mIGhvc3QgY29tcGlsZXIsCi0Jb25seSB1c2UgZ2VuZXJpYyBNUFcgTWFrZWZpbGUgc2VkIGlmIHByZXNlbnQsIGVkaXQgYSBmaWxlCi0JbmFtZWQgImhhY2tlZF9NYWtlZmlsZS5pbiIgaW5zdGVhZCBvZiAiTWFrZWZpbGUuaW4iIGlmIHByZXNlbnQuCi0JKiBtcHctUkVBRE1FOiBBZGQgcHJvYmxlbSBub3RlcyBhYm91dCBDVzYgYW5kIENXNy4KLQotVGh1IE9jdCAyNiAwNTo0NToxMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFVzZSAiOyIgaW5zdGVhZCBvZiAiOzsiLgotCi1XZWQgT2N0IDI1IDE1OjE4OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIEdyZXAgZm9yICdeZGlzdHN0dWZmOicgb3IgJ15pbmZvOicgaW4KLQlzdWItZGlyZWN0b3J5IE1ha2VmaWxlcywgaW5zdGVhZCBvZiB1c2luZyBESVNUU1RVRkZESVJTIGFuZAotCURJU1RET0NESVJTLgotCShESVNUU1RVRkZESVJTLCBESVNURE9DRElSUyk6ICBSZW1vdmVkIC0gbm8gbG9uZ2VyIHVzZWQuCi0JKG5ld2xpYi50YXIuZ3opOiAgRG9uJ3QgcGFzcyBESVNURE9DRElSUyB0byByZWN1cnNpdmUgbWFrZS4KLQotV2VkIE9jdCAyNSAxNDo0Mzo1NSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIFJlbW92ZSBsZCBncHJvZiBibnV0aWxzIGdhcyBsaWJnKysgZ2RiCi0JYW5kIGduYXRzLCBiZWNhdXNlIHRoZXkgYXJlIG5vdyBzdWJzdW1lZCBieSBESVNUU1RVRkZESVJTLgotCU1vdmUgYmZkIHRvIERJU1RTVFVGRkRJUlMuCi0KLVR1ZSBPY3QgMjQgMTg6MTk6MDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYMTFfTElCKTogUmVtb3ZlZC4KLQkoWDExX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIG9ubHkgWDExX0VYVFJBX0NGTEFHUyBhbmQgWDExX0VYVFJBX0xJQlMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogbWgtYWl4ICYgbWgtc3VuIHJlbW92ZWQuCi0KLVN1biBPY3QgMjIgMTM6MDQ6NDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKik6IFNob3J0ZW4gc29tZSBvZiB0aGUgbXVsdGlsaWIgZGlyZWN0b3J5Ci0JbmFtZXMuCi0KLUZyaSBPY3QgMjAgMTg6MDI6MTAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi1lYWJpKik6IEFkZCBtY2FsbC1haXhkZXNjIHZhcmllbnRzLgotCi1UaHUgT2N0IDE5IDEwOjQwOjU3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi13aW4zMik6IEFsd2F5cyBidWlsZCBuZXdsaWIuCi0JRG9uJ3QgY29uZmlndXJlIGN2cywgYXV0b2NvbmYgb3IgdGV4aW5mby4KLQkqIE1ha2VmaWxlLmluIChMRF9GT1JfVEFSR0VUKTogTmV3LgotCShCQVNFX0ZMQUdTX1RPX1BBU1MsIEVYVFJBX1RBUkdFVF9GTEFHUywgQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKToKLQlQYXNzIGRvd24gTERfRk9SX1RBUkdFVC4KLQotV2VkIE9jdCAxOCAxNTo1Mzo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3aW5zdXA6IE5ldyBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgd2luc3VwLgotCSogY29uZmlndXJlLmluOiBXaW5zdXAgaXMgY29uZmlndXJlZCB3aGVuIHRhcmdldCBpcyB3aW4zMi4KLQlDYW4gb25seSBidWlsZCB3aW4zMiB0YXJnZXQgR0RCIHdoZW4gbmF0aXZlLgotCQotTW9uIE9jdCAxNiAwOTo0MjozMSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEhQIG1vZGVsIDgxOSBtYWNoaW5lcyBhcyBoYXZpbmcKLQlhIFBBIDEuMSBwcm9jZXNzb3IuCi0KLU1vbiBPY3QgMTYgMTA6NDk6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEZpeCBzZWQgbG9vcCB3aGljaCBzdWJzdGl0dXRlcyBmb3IgQ0MgYW5kIENYWCB0bwotCWF2b2lkIGJ1ZyBmb3VuZCBpbiB2YXJpb3VzIHNlZCBpbXBsZW1lbnRhdGlvbnMuCi0KLVdlZCBPY3QgMTEgMTY6MTY6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjLSotZWFiaXNpbSk6IERlbGV0ZSBzZXBhcmF0ZSBydWxlIGZvcgotCXNpbXVsYXRvci4gIFVzZSBzdGFuZGFyZCBwb3dlcnBjLSotZWFiaSouCi0KLU1vbiBPY3QgIDkgMTc6MjE6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0b3AgcHV0dGluZyBnYXMgYW5kIGJpbnV0aWxzIGluIG5vY29uZmlnZGlycyBmb3IKLQlwb3dlcnBjLSotYWl4KiBhbmQgcnM2MDAwLSotKi4KLQotTW9uIE9jdCAgOSAxMjozODo0MCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZwotCS1tY2FsbC1haXhkZXNjIGxpYnJhcmllcy4KLQotRnJpIE9jdCAgNiAxNjoxNzo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy5zdWIgKGFybSB8IGFybWVsIHwgYXJtZWIpOiBGaXggc2hlbGwgc3ludGF4LgotCi1GcmkgT2N0ICA2IDE0OjQwOjI4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoe3Bvd2VycGMscnM2MDAwfS1pYm0tYWl4Kik6IEFkZCBtdWx0aWxpYnMgZm9yCi0JLW1zb2Z0LWZsb2F0IGFuZCAtbWNwdT1jb21tb24gc3VwcG9ydC4KLQkocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyAtbWNhbGwtYWl4Ci0JbGlicmFyaWVzLgotCi1UaHUgT2N0ICA1IDEzOjI2OjM3IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBbGxvdyBjb25maWd1cmF0aW9uIGFuZCBidWlsZCBvZiBlbWFjczE5IGZvciB0aGUgYWxwaGEuCi0KLVdlZCBPY3QgIDQgMjI6MDU6MzYgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQ0MpOiBHZXQgXkNDLCBub3QganVzdCBhbnkgb2xkIENDLCBmcm9tCi0JJHtob3N0X21ha2VmaWxlX2ZyYWd9LgotCi1XZWQgT2N0ICA0IDIxOjU1OjAwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKENDKTogVHJ5IHRvIGdldCBDQyBmcm9tIAotCSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30sIG5vdCAke2hvc3RfbWFrZWZpbGVfZnJhZ30uCi0KLVdlZCBPY3QgIDQgMjE6NDQ6MTIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IGNvbmZpZ3VyZSB0YXJnZXRkaXJzCi0Jb25seSBpZiBpdCBleGlzdHMgaW4gJChzcmNkaXIpLgotCi1XZWQgT2N0ICA0IDExOjUyOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBDQyBhbmQgQ1hYIGFyZSBub3Qgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgc2V0Ci0JdGhlbSwgYmFzZWQgb24gZWl0aGVyIGFuIGV4aXN0aW5nIE1ha2VmaWxlIG9yIG9uIHNlYXJjaGluZyBmb3IgZ2NjCi0JaW4gUEFUSC4gIFN1YnN0aXR1dGUgZm9yIENDIGFuZCBDWFggaW4gTWFrZWZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBsaWJtIGZyb20gdGFyZ2V0X2xpYnMuICBTZXBhcmF0ZQotCXRhcmdldF9jb25maWdkaXJzIGZyb20gY29uZmlnZGlycy4gIElmIENDIGlzIG5vdCBzZXQgaW4KLQllbnZpcm9ubWVudCwgdHJ5IHRvIGdldCBpdCBmcm9tIGEgaG9zdCBNYWtlZmlsZSBmcmFnbWVudC4gIFJld3JpdGUKLQljaGFuZ2VzIG9mIGNvbmZpZ2RpcnMgdG8gdXNlIHNraXBkaXJzIGluc3RlYWQuICBBIGZldyBtaW5vcgotCXR3ZWFrcy4gIFRha2UgZGlyZWN0b3JpZXMgb3V0IG9mIHRhcmdldF9jb25maWdkaXJzIGFzIHRoZXkgYXJlCi0JdGFrZW4gb3V0IG9mIGNvbmZpZ2RpcnMuICBSZW1vdmUgZXhpc3RpbmcgTWFrZWZpbGUgZmlsZXMgZnJvbQotCXN1YmRpcmVjdG9yaWVzLiAgU3Vic3RpdHV0ZSBmb3IgVEFSR0VUX0NPTkZJR0RJUlMgYW5kCi0JQ09ORklHX0FSR1VNRU5UUyBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IE5ldyB2YXJpYWJsZSwgYXV0b21hdGljYWxseSBzZXQKLQlieSBjb25maWd1cmUuaW4uCi0JKENPTkZJR19BUkdVTUVOVFMpOiBMaWtld2lzZS4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogTmV3IHZhcmlhYmxlLgotCSgkKERPX1gpKTogTG9vcCBvdmVyIFRBUkdFVF9DT05GSUdESVJTIGFzIHdlbGwgYXMgU1VCRElSUy4KLQkoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTmV3IHRhcmdldC4KLQkoY29uZmlndXJlLWxpYmcrKywgY29uZmlndXJlLWxpYmlvKTogTmV3IHRhcmdldHMuCi0JKGFsbC1saWJnKyspOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliZysrLgotCShhbGwtbGliaW8pOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliaW8uCi0JKGNvbmZpZ3VyZS1saWJnbG9zcywgYWxsLWxpYmdsb3NzKTogTmV3IHRhcmdldHMuCi0JKGNvbmZpZ3VyZS1saWJzdGRjKyspOiBOZXcgdGFyZ2V0LgotCShhbGwtbGlic3RkYysrKTogRGVwZW5kIHVwb24gY29uZmlndXJlLWxpYnN0ZGMrKy4KLQkoY29uZmlndXJlLWxpYnJ4LCBhbGwtbGlicngpOiBOZXcgdGFyZ2V0cy4KLQkoY29uZmlndXJlLW5ld2xpYik6IE5ldyB0YXJnZXQuCi0JKGFsbC1uZXdsaWIpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbmV3bGliCi0JKGNvbmZpZ3VyZS14aWJlcnR5KTogTmV3IHRhcmdldC4KLQkoYWxsLXhpYmVydHkpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUteGliZXJ0eS4KLQotU2F0IFNlcCAzMCAwNDozMjo1OSAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6ICBFeHBhbmQgdGhlCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1UaHUgU2VwIDI4IDIxOjE4OjQ5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogRml4IHNlZCBjb21tYW5kIGZpbGUgbmFtZS4KLQotVGh1IFNlcCAyOCAxNzozOTo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6IFJlZHVjZSB0aGUgCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1XZWQgU2VwIDI3IDEyOjI0OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGQgYW5kIGdkYiBmb3IgcG93ZXJwYyotKi13aW5udCoKLQlvciBwb3dlcnBjKi0qLXBlKiwgc2luY2UgdGhleSBhcmUgbm90IHlldCBzdXBwb3J0ZWQuCi0KLVR1ZSBTZXAgMjYgMTQ6MzA6MDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JQWRkIFBvd2VyTWFjIHN1cHBvcnQgYW5kIG1hbnkgb3RoZXIgZW5oYW5jZW1lbnRzLgotCSogbXB3LWNvbmZpZ3VyZTogTmV3IG9wdGlvbiAtLWNjIHRvIHNlbGVjdCBjb21waWxlciB0byB1c2UsCi0JcGFzdGUgb3B0aW9ucyBzZXQgYWNjb3JkaW5nIHRvIC0tY2MgaW50byB0aGUgZ2VuZXJhdGVkCi0JTWFrZWZpbGUsIGdlbmVyYXRlIHRoZSBNYWtlZmlsZSBieSBzZWQnaW5nIHRoZSBVbml4IE1ha2VmaWxlLmluCi0JaWYgbXB3LW1ha2Uuc2VkIGlzIHByZXNlbnQuCi0JKiBtcHctY29uZmlnLmluOiBEb24ndCB0ZXN0IGZvciBnQzEsIHRlc3QgZm9yIG1wdy10b3VjaCwKLQlhZGQgZm9yd2FyZCBpbmNsdWRlcyBmb3IgUG93ZXJQQyBpbmNsdWRlIGZpbGVzLgotCSogbXB3LWJ1aWxkLmluOiBCdWlsZCB1c2luZyBNYWtlZmlsZS5QUEMgaWYgcHJlc2VudC4KLQkoZG8tYnlhY2MsIGV0Yyk6IFJlbW92ZSBzZXBhcmF0ZSB2ZXJzaW9uIHJlc291cmNlIGJ1aWxkcy4KLQkoZG8tZ2FzKTogQnVpbGQgInN0YW1wcyIgYmVmb3JlICJhbGwiLgotCShkby1nY2MpOiBCdWlsZCAic3RhbXBzLWgiIGFuZCAic3RhbXBzLWMiIGJlZm9yZSAiYWxsIi4KLQkqIG1wdy1SRUFETUU6IFVwZGF0ZSB0byByZWZsZWN0IC0tY2Mgb3B0aW9uLCBQb3dlck1hYyBzdXBwb3J0LAotCWFuZCByZWNlbnRseS1yZXBvcnRlZCBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgotCi1GcmkgU2VwIDIyIDEyOjE1OjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAobTY4Ki0qLSopOiBPbmx5IGJ1aWxkIG11bHRpbGlicyBmb3IKLQllbWJlZGRlZCBtNjhrIHN5c3RlbXMgKC1hb3V0LCAtY29mZiwgLWVsZiwgLXZ4d29ya3MpLgotCSgtLXdpdGgtbXVsdGlsaWItdG9wKTogUGFzcyB0byByZWN1cnNpdmUgaW52b2NhdGlvbnMuCi0KLVR1ZSBTZXAgMTkgMTM6NTE6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSBsaWJnKysgYW5kIGxpYnN0ZGMrKyBvbgotCXY4MTAtKi0qLgotCi1Nb24gU2VwIDE4IDIzOjA4OjI2IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIGJmZCwgYmludXRpbHMsIGdhcywgZ2NjLAotCWdkYiwgbGQgYW5kIG9wY29kZXMgb24gdjgxMC0qLSouCi0KLVNhdCBTZXAgMTYgMTg6MzE6MDggUERUIDE5OTUgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgPGFuZ2VsYUBjeWdudXMuY29tPgotCQotCSogY29uZmlnL21oLW5jcnN2cjQzOiBSZW1vdmVkIEFSX0ZMQUdTCi0KLVR1ZSBTZXAgMTIgMTg6MDM6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRE9fWCk6IENoYW5nZSBkby1yZWFsY2xlYW4gdG8gZG8tbWFpbnRhaW5lci1jbGVhbi4KLQkobG9jYWwtbWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0JKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCShyZWFsY2xlYW4pOiBKdXN0IGRlcGVuZCB1cG9uIG1haW50YWluZXItY2xlYW4uCi0KLUZyaSBTZXAgIDggMTc6MTE6MTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgZ2RiIG9uIG02OGstKi1uZXRic2QqLgotCi1GcmkgU2VwICA4IDE2OjQ2OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCBpbiBtaXBzKi0qLWJzZCogY2FzZS4KLQotVGh1IFNlcCAgNyAyMDowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogT1MuICBGcm9tIElhbiBEYWxsLgotCi1GcmkgU2VwICAxIDA4OjA2OjU4IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiByZWNvZ25pc2UgbWlwczY0dnI0MzAwIGFuZCBtaXBzNjR2cjQzMDBlbCBhcyB2YWxpZAotIAl0YXJnZXRzLgotCi1XZWQgQXVnIDMwIDIxOjA2OjUwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHRyZWF0IGkzODYtd2luMzIgY2FuYWRpYW4gY3Jvc3MgdGhlIHNhbWUgYXMKLQlpMzg2LWdvMzIgY2FuYWRpYW4gY3Jvc3MuCi0KLVRodSBBdWcgMjQgMTQ6NTM6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi0qLWVhYmlzaW0pOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQwotCXJ1bm5pbmcgdW5kZXIgdGhlIHNpbXVsYXRvciB0byBidWlsZCBhIHJlZHVjZWQgc2V0IG9mIGxpYnJhcmllcy4KLQkocG93ZXJwYy0qLWVhYmlhaXgpOiBBZGQgZmluZSBncmFpbmVkIG11bHRpbGliIHN1cHBvcnQgYWRkZWQgdG8KLQlvdGhlciBwb3dlcnBjIHRhcmdldHMgeWVzdGVyZGF5LgotCi1XZWQgQXVnIDIzIDA5OjQxOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyopOiBBZGQgc3VwcG9ydCBmb3IgLWRpc2FibGUtYmllbmRpYW4sCi0JLWRpc2FibGUtc29mdGZsb2F0LCAtZGlzYWJsZS1yZWxvY2F0YWJsZSwgLWRpc2FibGUtYWl4LCBhbmQKLQktZGlzYWJsZS1zeXN2IHRvIGNvbnRyb2wgd2hpY2ggbXVsdGlsaWIgbGlicmFyaWVzIGdldCBidWlsdC4KLQotVGh1IEF1ZyAxNyAxNjowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIE1ha2VmaWxlLnRlbSB0byBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSBpbiB0cmFwCi0JaGFuZGxlci4KLQotTW9uIEF1ZyAxNCAxOToyNzo1NiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzICgqTGludXgqKTogIEFkZCBtaXNzaW5nICJleGl0InMuCi0JQWxzbywgbmVlZCBzcGVjaWZpYyBjaGVjayBmb3IgYWxwaGEtdW5rbm93bi1saW51eCAodXNlcyBDT0ZGKS4KLQotRnJpIEF1ZyAxMSAxNTozODoyMCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0Y6Ci0KLQlXZWQgSnVuIDI4IDE3OjU3OjI3IDE5OTUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCSogY29uZmlnLmd1ZXNzIChBSVg0KTogTW9yZSByb2J1c3QgcmVsZWFzZSBudW1iZXJpbmcgZGlzY292ZXJ5LgotCi0JVGh1IEp1biAyMiAxOTowMToyNCAxOTk1ICBLZW5uZXRoIFN0YWlsZXkgIChrc3RhaWxleUBlYWdsZS5kb2wtZXNhLmdvdikKLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni1zZXF1ZW50LXB0eCk6IFByb3Blcmx5IGdldCB2ZXJzaW9uIG51bWJlci4KLQotCVRodSBKdW4gMjIgMTg6MzY6NDIgMTk5NSAgVXdlIFNlaW1ldCAgKHNlaW1ldEBpcmlzMS5jaGVtaWUudW5pLWtsLmRlKQotCSogY29uZmlnLmd1ZXNzIChtaXBzOio6NCo6VU1JUFMpOiBOZXcgY2FzZS4KLQotTW9uIEF1ZyAgNyAwOToyMTozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtZ28zMiBob3N0KTogRml4IHR5cG8gKGRlamEtZ251IC0+IGRlamFnbnUpLgotCShpMzg2LXdpbjMyIGhvc3QpOiBMaWtld2lzZS4gIERvbid0IGJ1aWxkIHJlYWRsaW5lLgotCi1GcmkgQXVnICA0IDEzOjA0OjM2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoR0RCX1NVUFBPUlRfRElSUyk6IEFkZCB1dGlscy4KLQkoREVWT19TVVBQT1JUKTogQWRkIG1wdy1SRUFETUUsIG1wdy1idWlsZC5pbiwgbXB3LWNvbmZpZy5oIGFuZAotCW1wdy1jb25maWd1cmUuCi0KLVdlZCBBdWcgIDIgMTY6MzI6NDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYXBwZGlycyk6IFVzZSA9LCBub3QgPT0sIGluIHRlc3QgZXhwcmVzc2lvbiB3aGVuCi0JdHJ5aW5nIHRvIGJ1aWxkIHRoZSB0ZXh0IHRvIHByaW50IGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UgZm9yCi0JU29sYXJpcyB1c2Vycy4KLQotTW9uIEp1bCAzMSAwOTo1NjoxOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluICh6OGstKi1jb2ZmKTogQWRkICdzdGQnIG11bHRpbGliIGJ1aWxkLgotCi1GcmkgSnVsIDI4IDAwOjE2OjMxIDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBseW54LTIuMy4KLQotVGh1IEp1bCAyNyAxNTo0Nzo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViICh6OGtzaW0pOiBEZWxldGVkCi0JKHo4ay0qLWNvZmYpOiBOZXcsIHRoaXMgaXMgdGhlIG9uZSB0cnVlIG5hbWUgb2YgdGhlIHRhcmdldC4KLQotVGh1IEp1bCAyNyAxNDozMzozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtcG9zLmluIChkb3Rkb3QpOiBXb3JrIGFyb3VuZCBTdW5PUyBzZWQgYnVnLgotCi1UaHUgSnVsIDI3IDEzOjMxOjA1IDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogRmlyc3QgdHJ5IGFza2luZyB0aGUgbGlua2VyIHdoYXQgdGhlCi0JZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMgKGVsZiwgYW91dCwgb3IgY29mZikuICBUaGVuIGlmIHRoaXMKLQlmYWlscywgdHJ5IHByZXZpb3VzIG1ldGhvZHMuCi0KLVRodSBKdWwgMjcgMTE6Mjg6MTcgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5ld2xpYiBmb3IgKi0qLXZ4d29ya3M1LjEuCi0KLVRodSBKdWwgMjcgMTE6MTg6NDcgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5ld2xpYiBmb3IgYTI5ay0qLXZ4d29ya3M1LjEuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBBZGQgc2V0dGluZyBvZiAtLXdpdGgtaGVhZGVycyBmb3IgYTI5ay12eHdvcmtzNS4xLgotCi1UdWUgSnVsIDI1IDIxOjI1OjM5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1wb3MuaW4gKE1VTFRJVE9QKTogVHJpbSBleGNlc3MgdHJhaWxpbmcgIi8uIi4KLQotRnJpIEp1bCAyMSAxMDo0MToxMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluOiBOZXcgZmlsZS4KLQkqIGNmZy1tbC1wb3MuaW46IE5ldyBmaWxlLgotCi1XZWQgSnVsIDE5IDAwOjM3OjI3IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBDT1BZSU5HLk5FV0xJQjogQWRkIEhQIGZyZWUgY29weXJpZ2h0IHRvIGxpc3QuCi0KLVR1ZSBKdWwgMTggMTA6NTg6NTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgLWVhYmkqIGZvciB0aGUgc3lzdGVtLCBub3QganVzdCAtZWFiaS4KLQotTW9uIEp1bCAgMyAxMzo0NDo1MSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtmaWxlLmluIChETExUT09MX0ZPUl9UQVJHRVQpOiBOZXcgbmFtZSwgcGFzcyBpdCBkb3duLgotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluICh3aW4zMik6IE5ldyB0YXJnZXQgYW5kIGhvc3QuCi0KLVdlZCBKdW4gMjggMjM6NTc6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgaTM4Ni1wZSBjb25maWd1cmF0aW9uLgotCi1GcmkgSnVuIDIzIDE0OjI4OjQ0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWJ1aWxkLmluIChpbnN0YWxsKTogSW5zdGFsbCBHREIgYWZ0ZXIgTEQuCi0KLVRodSBKdW4gMjIgMTc6MTA6NTMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChlbGYvbWlwcy5oKTogQWx3YXlzIGZvcndhcmQtaW5jbHVkZSwgbmVlZGVkCi0JZm9yIEdEQiB0byBidWlsZC4KLQotV2VkIEp1biAyMSAxNToxNzozMCAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIHRlc3RzdWl0ZTogTmV3IGRpcmVjdG9yeSBmb3IgY3VzdG9tZXIgYWNjZXB0YW5jZSBhbmQgd2hvbGUgdG9vbAotCWNoYWluIHRlc3RzLgotCi1XZWQgSnVuIDIxIDE2OjUwOjI5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgcGVyLWhvc3QgbGluZSBpc24ndCBmb3VuZCwgYnV0IEFDX09VVFBVVCBpcyBmb3VuZAotCWFuZCBhIGNvbmZpZ3VyZSBzY3JpcHQgZXhpc3RzLCBydW4gaXQgaW5zdGVhZC4KLQotVGh1IEp1biAxNSAyMTowOToyNCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLCBmb3IgYWxwaGEtZGVjLXdpbm50My41IGFuZCAgQ3JheXMuCi0KLVR1ZSBKdW4gMTMgMjE6NDM6MjcgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBidWlsZF97Y3B1LHZlbmRvcixvcyxhbGlhc30gdG8gaG9zdCB2YWx1ZXMgd2hlbgotCS0tYnVpbGQgaXNuJ3Qgc3BlY2lmaWVkLgotCi1Nb24gSnVuICA1IDE4OjI2OjM2IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUElDRkxBRywgUElDRkxBR19GT1JfVEFSR0VUKTogTmV3IG1hY3Jvcy4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgdGhlbS4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRGl0dG8uCi0KLQkqIGNvbmZpZy9tPy0qcGljOiBEZWZpbmUgUElDRkxBRyogaW5zdGVhZCBvZiBMSUIqRkxBR1MqLgotCi1XZWQgTWF5IDMxIDIyOjI3OjQyIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1saWJnKyspOiBEZXBlbmQgb24gYWxsLWxpYnN0ZGMrKy4KLQotVGh1IE1heSAyNSAyMjo0MDo1OSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRW5hYmxlIGFsbCBwYWNrYWdlcyBmb3IKLQkgIGkzODYtdW5rbm93bi1uZXRic2QuCi0KLVNhdCBNYXkgMjAgMTM6MjI6MzEgMTk5NSAgQW5nZWxhIE1hcmllIFRob21hcyAgPGFuZ2VsYUBjaXJkYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBjb25maWd1cmUgdGsgZm9yIGkzODYtZ28zMgotCWhvc3RlZCBidWlsZHMgKERPUyBidWlsZHMpCi0KLVRodSBNYXkgMTggMTg6MDg6NDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmb3IgQVJNIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSaWNoYXJkIEVhcm5zaGF3OgotCSogY29uZmlnLnN1YjogSGFuZGxlIGFybWViIGFuZCBhcm1lbC4KLQkqIGNvbmZpZ3VyZS5pbjogT21pdCBhcm0gbGlua2VyIG9ubHkgZm9yIHJpc2NpeC4KLQotVGh1IE1heSAxMSAxNzoyMzoyNiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLgotCi1UdWUgTWF5ICA5IDE1OjUyOjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgcG93ZXJwY2xlIGFzIHRoZSBsaXR0bGUgZW5kaWFuIHZhcmllbnQgb2YKLQl0aGUgUG93ZXJQQy4gIFJlY2dvbml6ZSBwcGMgYXMgYSBQb3dlclBDIHZhcmlhbnQsIGFuZCBwcGNsZSBhcyBhCi0JcG93ZXJwY2xlIHZhcmlhbnQuICBDb252ZXJ0IHBlbnRpdW0gaW50byBpNTg2LCBub3QgaTQ4Ni4gIEFkZCBwNQotCWFsaWFzIGZvciBpNTg2LiAgTWFwIG5ldyB4ODYgdmFyaWFudHMgcDYsIGs1LCBuZXhnZW4gaW50byBpNTg2Ci0JdGVtcG9yYXJpbHkuCi0KLVR1ZSBNYXkgIDIgMTY6Mjk6NDEgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1saXRlcyopOiBUcmVhdCBsaWtlIGhwcGEqLSotKmVsZiouCi0KLVN1biBBcHIgMzAgMjE6Mzg6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtbGl0ZXMqIGFzIGEgYmFzaWMgc3lzdGVtIHR5cGUuCi0KLVRodSBBcHIgMjcgMTE6MzM6MjkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBDaGVjayBmb3Igd2hldGhlciB0aGUgcHJlLUJGRCBsaW5rZXIgaXMKLQlpbnN0YWxsZWQsIGFuZCBpZiBzbyByZXR1cm4gbGludXhvbGRsZCBhcyB0aGUgc3lzdGVtIG5hbWUuCi0KLVdlZCBBcHIgMjYgMTA6NTk6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIGhwcGExLjEtaHAtbGl0ZXMgc3VwcG9ydC4KLQotVHVlIEFwciAyNSAxMTowODoxMSAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciBtNjhrLXZ4d29ya3M1LjEuCi0KLVdlZCBBcHIgMTkgMTc6MDI6NDMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXg2KTogVXNlIG1oLWlyaXg1LgotCi1GcmkgQXByIDE0IDE1OjIxOjE3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nY2MpOiBEZXBlbmQgb24gYWxsLWxkIChmb3IgbGliZ2NjMS10ZXN0KS4KLQotV2VkIEFwciAxMiAxNjowNjowMSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogdGVzdC1idWlsZC5tazogRW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gSVJJWCA1IGFuZAotICAgICAgICBPU0YvMS4gIEZpeCBjb21waWxlciBmbGFncy4KLQkqIGJ1aWxkLWFsbC5tazogU3VwcG9ydCBMaW51eCBhbmQgT1NGLzEgMy4wLiAgRml4IGNvbXBpbGVyIGZsYWdzLgotCi1UdWUgQXByIDExIDE4OjU1OjQwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIC0td2l0aC1uZXdsaWIuCi0JKHNwYXJjLSotc3Vub3M0Kik6IEJ1aWxkIHNpbSwgZGVqYWdudSwgZXhwZWN0LCB0Y2wgaWYgY3Jvc3MgdGFyZ2V0LgotCi1Nb24gQXByIDEwIDExOjQyOjIyIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgotCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBnZW5lcmljIGluY2x1ZGUgZm9yd2FyZHMgZm9yIGNwdS1zcGVjaWZpYwotCWluY2x1ZGUgZmlsZXMgaW4gYW91dCBhbmQgZWxmIGRpcmVjdG9yaWVzLgotCi0JKiBtcHctY29uZmlndXJlOiBBZGRlZCBjb3B5cmlnaHQuCi0JKiBtcHctY29uZmlnLmluOiBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgcmVxdWlyZWQgYnVpbGQgdG9vbHMuCi0JKHRhcmdldF9saWJzKTogQWRkIG5ld2xpYi4KLQkodGFyZ2V0X3Rvb2xzKTogQWRkIGV4YW1wbGVzLgotCShSZWFkIE1lKTogR2VuZXJhdGUgYXMgIlJlYWQgTWUgZm9yIE1QVyIgaW5zdGVhZC4KLQkqIG1wdy1idWlsZC5pbjogQmFzZSBzdWItYnVpbGRzIG9uIGFsbC1mb28gaW5zdGVhZCBvZiBkby1mb28uCi0JKGFsbC1ieWFjYywgZG8tYnlhY2MsIGFsbC1mbGV4LCBkby1mbGV4LCBkby1uZXdsaWIpOiBOZXcgYWN0aW9ucy4KLQkoZG8tZ2FzLCBkby1nY2MsIGRvLWdkYiwgZG8tbGQpOiBCdWlsZCBWZXJzaW9uLnIgZmlyc3QuCi0KLQkqIG1wdy1jb25maWd1cmU6IFJlbW92ZSBzdWJkaXItc3BlY2lmaWMgbWFrZWZpbGUgaGFja2VyeSwKLQlkZWxldGUgbWsudG1wIGFmdGVyIHVzaW5nIGl0LgotCi0JKiBtcHctYnVpbGQuaW4gKGFsbCk6IERpc3BsYXkgc3RhcnQgYW5kIGVuZCB0aW1lcy4KLQotCSogbXB3LWNvbmZpZ3VyZSAoaG9zdF9jYW5vbmljYWwpOiBTZXQuCi0JKHRhcmdldF9jcHUpOiBBbHdheXMgYWRkIHRvIG1ha2VmaWxlcy4KLQkoQVJDSERFRlMsIEVNVUwpOiBBZGQgdG8gbWFrZWZpbGUgb25seSBpZiBub25lbXB0eS4KLQkoVE1fRklMRSwgWE1fRklMRSwgTk1fRklMRSk6IE5vIGxvbmdlciBhZGQgdG8gbWFrZWZpbGUuCi0JKG1wdy1taC1tcHcpOiBMb29rIGZvciBpbiBzcmNkaXIgYW5kIHNyY3Jvb3QuCi0JVXNlIHNlZCBpbnN0ZWFkIG9mIG1wdy1lZGl0LXByZWZpeCB0byBlZGl0IHByZWZpeCBkZWZpbml0aW9ucy4KLQotCSogbXB3LWJ1aWxkLmluOiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQotCSogbXB3LWNvbmZpZ3VyZSAoaG9zdF9hbGlhcywgdGFyZ2V0X2FsaWFzKTogUmVuYW1lIGZyb20gaG9zdGFsaWFzCi0JYW5kIHRhcmdldGFsaWFzLCBhZGQgaW50byBnZW5lcmF0ZWQgTWFrZWZpbGUuCi0JKG1rLnRtcCk6IElmIHByZXNlbnQsIGFkZCBpbnRvIGdlbmVyYXRlZCBNYWtlZmlsZS4KLQkqIG1wdy1idWlsZC5pbiAoYWxsLWdhcyk6IEJ1aWxkIGNvbmZpZy5oIGZpcnN0IGJlZm9yZSBnYXMgcHJvcGVyLgotCi0JKiBtcHctY29uZmlndXJlIChjb25maWcuc3RhdHVzKTogV3JpdGUgb25seSBpZiBjaGFuZ2VkLgotCSogbXB3LWNvbmZpZy5pbiAocmVhZGxpbmUpOiBDb25maWd1cmUgaXQgKG5vdCBidWlsdCwganVzdCB1c2VkIGZvcgotCWRlZmluaXRpb25zKS4KLQotCSogbXB3LWNvbmZpZy5pbiAoZWxmL21pcHMuaCk6IEFkZCBhIGZvcndhcmQgaW5jbHVkZS4KLQotCSogbXB3LWNvbmZpZy5pbjogRm9yd2FyZC1pbmNsdWRlIG1vc3QgLmggZmlsZXMgaW4gaW5jbHVkZSBpbnRvCi0JZXh0cmEtaW5jbHVkZS4KLQkocmVhZGxpbmUpOiBEb24ndCBidWlsZC4KLQltcHctYnVpbGQuaW4gKGluc3RhbGwpOiBJbnN0YWxsIEdEQi4KLQotCSogbXB3LWNvbmZpZ3VyZSAocHJlZml4LCBtcHdfcHJlZml4KTogSGFuZGxlIGl0LgotCSogbXB3LWNvbmZpZy5pbiAobW1hbGxvYywgcmVhZGxpbmUpOiBEb24ndCBjb25maWd1cmUuCi0JKiBtcHctYnVpbGQuaW4gKHRoaXNzY3JpcHQpOiBSZW5hbWUgdG8gVGhpc1NjcmlwdC4KLQlVc2UgbXB3LWJ1aWxkIGluc3RlYWQgb2YgQnVpbGRQcm9ncmFtIGV2ZXJ5d2hlcmUuCi0JKG1tYWxsb2MsIHJlYWRsaW5lKTogRG9uJ3QgYnVpbGQuCi0JKiBtcHctUkVBRE1FOiBOZXcgZmlsZSwgYmFzaWMgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgTVBXIHBvcnQuCi0KLQkqIG1wdy1jb25maWcuaW46IFVzZSBmb3J3YXJkLWluY2x1ZGUgdG8gY3JlYXRlIGluY2x1ZGUgZmlsZXMuCi0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBtb3JlIHRoaW5ncyB0byB0aGUgdG9wIG9mIGVhY2ggY29uZmlndXJlZAotCU1ha2VmaWxlLCBpbmNsdWRpbmcgY29udGVudHMgb2YgY29uZmlnL21wdy1taC1tcHcuCi0JKiBtcHctY29uZmlnLmluIChleHRyYS1pbmNsdWRlKTogQ3JlYXRlIHRoaXMgZGlyZWN0b3J5IGFuZCBmaWxsIGl0Ci0Jd2l0aCBQb3NpeC1saWtlIGluY2x1ZGUgZmlsZXMgd2hlbiBjb25maWd1cmluZy4KLQotCSogY29uZmlnLnN1YiAoYXBwbGUsIG1hYywgbXB3KTogQWRkIHZhcmlvdXMgYWxpYXNlcy4KLQotCSogbXB3LWJ1aWxkLmluOiBOZXcgZmlsZSwgdG9wLWxldmVsIGJ1aWxkIHNjcmlwdCBmcmFnbWVudCBmb3IgTVBXLgotCSogbXB3LWNvbmZpZ3VyZTogTmV3IGZpbGUsIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIE1QVy4KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBjb25maWcgZnJhZ21lbnQgZm9yIE1QVy4KLQotRnJpIEFwciAgNyAxOTozMzoxNiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X2xpYnMpOiBSZW1vdmUgZ2xvYiwgc2luY2UgaXQgaXMgZ29uZSBmcm9tIHRoZQotCXNvdXJjZXMuCi0KLUZyaSBNYXIgMzEgMTE6MzY6MTcgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgZW1wdHkgR0RCX05MTV9ERVBTIHZhci4KLQotCSogY29uZmlndXJlLmluKHRhcmdldF9tYWtlZmlsZV9mcmFnKTogdXNlIGNvbmZpZy9tdC1uZXR3YXJlCi0JZm9yIG5ldHdhcmUgdGFyZ2V0cy4KLQotVGh1IE1hciAzMCAxMzo1MTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIGluIHJlY2VudCBGU0YgY2hhbmdlcy4gIFJlbW92ZSBsaW51eCBzcGVjaWFsCi0JY2FzZXMuCi0KLVR1ZSBNYXIgMjggMTQ6NDc6MzQgMTk5NSAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCWJ1aWxkLWFsbC5tayxjb25maWcvbWgtc29sYXJpczogIHJldmVydCB0aGVzZSB0d28gY2hhbmdlczoKLQotCVR1ZSBNYXIgMzAgMTA6MDM6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JCSogYnVpbGQtYWxsLm1rOiBVc2UgQ0M9Y2MgLVhzIG9uIFNvbGFyaXMuCi0KLQlNb24gTWFyIDI5IDE5OjU5OjI2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCQkqIGNvbmZpZy9taC1zb2xhcmlzOiBTdW5QUk8gQyBuZWVkcyAtWHMgdG8gYmUgYWJsZSB0byBnZXQgYQotCQl3b3JraW5nIHhtYWtlZmlsZSBmb3IgRW1hY3MuCi0KLVR1ZSBNYXIgMjEgMTA6NDM6MzIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGdsb2IvKjogUmVtb3ZlZC4gIFNjaGF1ZXIncyAyNCBGZWIgMTk5NCByZWFkbGluZSBjaGFuZ2UgbWFkZSB1cwotCXN0b3AgdXNpbmcgaXQuCi0JKiBNYWtlZmlsZS5pbjogTnVrZSBhbGwgcmVmZXJlbmNlcyB0byBnbG9iIHN1YmRpcmVjdG9yeS4KLQotVGh1IE1hciAxNiAxMzozNTozMCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGaXggLS1lbmFibGUtc2hhcmVkIGxvZ2ljIGluIHBlci1ob3N0LgotCi1Nb24gTWFyIDEzIDEyOjMzOjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLWhwLWhwdXhbNzhdKik6IFVzZSBtaC1ocHV4OC4KLQotTW9uIE1hciAgNiAxMDoyMTo1OCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBnYXMgb24gQUlYLCBmb3IKLQlwb3dlcnBjKi0qLWFpeCogYXMgd2VsbCBhcyBmb3IgcnM2MDAwKi0qLWFpeCouCi0KLVdlZCBNYXIgIDEgMTI6NTE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEZpeCAtLWNhY2hlLWZpbGUgdG8gd29yayBpZiB0aGUgZmlsZSBhcmd1bWVudCBpcyBhCi0JcmVsYXRpdmUgcGF0aC4KLQotVHVlIEZlYiAyOCAxNzozNjowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgdGhlIC0tY2FjaGUtZmlsZSBpcyB1c2VkLCBwYXNzIGl0IGRvd24gdG8KLQljb25maWd1cmUgaW4gc3ViZGlyZWN0b3JpZXMuCi0KLU1vbiBGZWIgMjcgMTI6NTI6NDYgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogYWRkIHZ4d29ya3MyOWsgY29uZmlndXJhdGlvbi4KLQotRnJpIEZlYiAxMCAxNjoxMjoyNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogRG8gImRpc3RzdHVmZiIgcGFydCBxdWlldGx5LgotCi1TdW4gRmViICA1IDE0OjE2OjM1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1pbmktbWVyZ2Ugd2l0aCBnY2MvY29uZmlnLnN1Yi4KLQotU2F0IEZlYiAgNCAxMjoxMTozNSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoSVJJWCk6IFNlZCAtIHRvIF8uCi0KLUZyaSBGZWIgIDMgMTE6NTQ6NDIgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc291cmNlLXZhdWx0LCBiaW5hcnktdmF1bHQpOiBOZXcgdGFyZ2V0cy4KLQotVGh1IEphbiAyNiAxMzowMDoxMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIC1lYWJpIGFzIGEgYmFzaWMgc3lzdGVtIHR5cGUuCi0KLVRodSBKYW4gMTIgMTM6MTM6MjMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlX3NoYXJlZCBzdHVmZik6IEZpeCB0eXBvLgotCi1UaHUgSmFuIDEyIDAxOjM2OjUxIDE5OTUgIGRlYW5tQG1lZHVsbGEuTEFCUy5URUsuQ09NIChEZWFuIE1lc3NpbmcpCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBGaXggdHlwbyBpbiBwYXNzaW5nIExJQkNYWEZMQUdTKi4KLQotV2VkIEphbiAxMSAxNjoyOTo1MyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpOiBBZGQgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMuCi0KLU1vbiBKYW4gIDkgMTI6NDg6MDEgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwLSotKik6IERvbid0IGJ1aWxkIGdhcy4KLQotV2VkIEphbiAgNCAyMzo1Mzo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVc2UgL3gveC8gaW5zdGVhZCBvZiAvYnJva2Vuc2VkL2Jyb2tlbnNlZC8sIHRvCi0JcmVkdWNlIGNvbW1hbmQgbGluZSBsZW5ndGguCi0JKEFTX0ZPUl9UQVJHRVQpOiBDaGVjayBmb3IgYXMubmV3LCBub3QgTWFrZWZpbGUuCi0JKE5NX0ZPUl9UQVJHRVQpOiBDaGVjayBmb3Igbm0ubmV3LCBub3QgTWFrZWZpbGUuCi0KLVdlZCBKYW4gIDQgMTM6MDI6MzkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIGZyb20gRlNGLgotCi1UaHUgRGVjIDE1IDE3OjExOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCB1c2UgJCB3aGVuIGhhbmRsaW5nIHByb2dyYW1fc3VmZml4LgotCi1Nb24gRGVjIDEyIDEyOjA5OjM3IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENvbmZpZ3VyZSB0ayBmb3IgaHBwYS9ocHV4LgotCi1GcmkgRGVjICAyIDE1OjU1OjM4IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTElCR1hYX1NVUFBPUlRfRElSUyk6ICBBZGQgbGlic3RkYysrLgotCi1UdWUgTm92IDI5IDE5OjM3OjU2IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogIE1vdmUgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZSBmcm9tIENYWEZMQUdTCi0JdG8gTElCQ1hYRkxBR1MuICBUZXN0cyBhcmUgYmV0dGVyIHJ1biB3aXRob3V0IGl0LgotCi1XZWQgTm92IDIzIDEwOjI5OjI1IDE5OTQgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pc3BlbGwpOiBEZXBlbmQgb24gYWxsLWVtYWNzMTkgaW5zdGVhZCBvZiBhbGwtZW1hY3MuCi0KLU1vbiBOb3YgMjEgMTE6MTQ6MDEgMTk5NCAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlKik6IERvbid0IGNvbmZpZ3VyZSB4aWJlcnR5LgotCi1Nb24gTm92IDE0IDA4OjQ5OjE1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbW92ZSB0ayBmcm9tIG5hdGl2ZV9vbmx5IGxpc3QuCi0KLUZyaSBOb3YgMTEgMTU6MzE6MjYgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IEFkZCBtaXBzLW5jZC1lbGYgdGFyZ2V0IHRvIHN1bjQgdGFyZ2V0cwotCSAgZm9yIHNwZWNpYWwgTkNEIGJ1aWxkLgotCi1Nb24gTm92ICA3IDIwOjU4OjE3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBSZW1vdmUgY29uZmlndXJlLmJhdCBhbmQKLQltYWtlYWxsLmJhdCwgdGhleSdyZSBvbmx5IHVzZWZ1bCBmb3IgYmludXRpbHMgc25hcHNob3RzLgotCShiaW51dGlscy50YXIuZ3osIGdhcytiaW51dGlscy50YXIuZ3opOiBBZGQgY29uZmlndXJlLmJhdCBhbmQKLQltYWtlYWxsLmJhdCB0byBzcGVjaWZpZWQgU1VQUE9SVF9GSUxFUy4KLQotTW9uIE5vdiAgNyAxNzoyNToxOCAxOTk0ICBCaWxsIENveCAgKGJpbGxAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogQWRkIEVyaWNzc29uIHRhcmdldHMgdG8gc3VuNCBhbmQgc29sYXJpcwotCSAgaG9zdHMuICBBZGQgIEJOUidzIHN1bjQgdGFyZ2V0IHRvIHNvbGFyaXMgaG9zdCwgc28gdGhlaXIKLQkgIGJ1aWxkLWZyb20tc291cmNlIHdpbGwgYmUgdGVzdGVkIGluLWhvdXNlIGZpcnN0LgotCi1TYXQgTm92ICA1IDE4OjQzOjMwIDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTElCQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShDRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShMSUJDRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShMSUJDWFhGTEFHUyk6IERpdHRvLgotCShDWFhGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCi0JKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyB0aGVtLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbVt0aF0tKnBpYzogU3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQuCi0KLVNhdCBOb3YgIDUgMTU6NDQ6MDAgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiAgSW5jbHVkZSBsaWJzdGRjKysgYWdhaW4uCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YgKGZvciBGcmVlQlNEKS4KLQotVGh1IE5vdiAgMyAxNjozMjozMCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogSW5jbHVkZSBjb25maWd1cmUuYmF0IGFuZAotCW1ha2VhbGwuYmF0LgotCShESVNURE9DRElSUyk6IEFkZCBgZXRjJy4KLQkoRVRDX1NVUFBPUlRfUEZYKTogTmV3IHZhcmlhYmxlLgotCSh0YXopOiBJbmNsdWRlIGFueXRoaW5nIGZyb20gZXRjIHN0YXJ0aW5nIHdpdGggYSB3b3JkIGluCi0JRVRDX1NVUFBPUlRfUEZYLgotCi1XZWQgT2N0IDI2IDE2OjE5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogVXBkYXRlIGZvciByZWNlbnQgRlNGIGNoYW5nZXMuICBSZW1vdmUgb2Jzb2xldGUKLQloODMwMGhkcyBlbnRyeS4gIEFkZCAtd2luZG93cyogYW5kIC1vc3ggYXMgYmFzaWMgb3MuICBNaW5vcgotCXNwYWNpbmcgY2hhbmdlcy4KLQotVGh1IE9jdCAyMCAxODo0MTo1NiAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6ICBSZW1vdmUgbGlic3RkYysrIGZvciBsaWJnKystMi42LjEuCi0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIHdpdGggRlNGLgotCSogY29uZmlndXJlLmluOiAgTWF0Y2ggb24gaT84Ni1uY3Itc3lzdjQuMywgbm90IGk/ODYtbmNyLXN5c3Y0My4KLQotVGh1IE9jdCAyMCAxOToyNjo1NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNpbmNlIHRoZSAidHJhcCAwIiBoYW5kbGVyIHdpbGwgb3ZlcnJpZGUgdGhlIGV4aXQKLQlzdGF0dXMgb24gbWFueSBzeXN0ZW1zLCBvbmx5IHVzZSBpdCBmb3IgImV4aXQgMSIsIGFuZCBtYWtlIGl0IHNldAotCWEgbm9uLXplcm8gZXhpdCBzdGF0dXM7IHJlc2V0IGl0IGJlZm9yZSAiZXhpdCAwIi4gIEFsc28sIGNoZWNrCi0JZXhpdCBzdGF0dXMgb2YgY29uZmlnLnN1YiwgYW5kIGVycm9yIG91dCBpZiBpdCBmYWlsZWQuCi0KLVdlZCBPY3QgMTkgMTg6NDk6NTUgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogKEFMTF9UQVJHRVRfTU9EVUxFUyxJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBCdWlsZAotCWFuZCBpbnN0YWxsIGxpYmdsb3NzLgotCi1UdWUgT2N0IDE4IDE1OjI1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iaW51dGlscyk6IERlcGVuZCB1cG9uIGFsbC1ieWFjYy4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBlbWFjcyBvbiBJcml4IDUuCi0KLU1vbiBPY3QgMTcgMTY6MjI6MTIgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlKik6IEFkZCBsaWJpby4KLQotVGh1IE9jdCAxMyAxNTo1MToyMCAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBsaWJzdGRjKysuCi0JKENIRUNLX1RBUkdFVF9NT0RVTEVTKTogRGl0dG8uCi0JKElOU1RBTExfVEFSR0VUX01PRFVMRVMpOiBEaXR0by4KLQkoVEFSR0VUX0xJQlMpOiBEaXR0by4KLQkoYWxsLWxpYnN0ZGMrKyk6IE5vdGUgZGVwZW5kZW5jaWVzLgotCi1UaHUgT2N0IDEzIDAxOjQzOjA4IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBBZGQgZ2FzLgotCi1UdWUgT2N0IDExIDEyOjEyOjI5IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ1hYRkxBR1MpOiBVc2UgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMgaW5zdGVhZCBvZgotCS1mZXh0ZXJuYWwtdGVtcGxhdGVzLgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogQWRkIGxpYnN0ZGMrKy4KLQkobm9jb25maWdkaXJzKTogQWRkIGxpYnN0ZGMrKyBhcyBhcHByb3ByaWF0ZS4KLQotVGh1IE9jdCAgNiAxODowMDo1NCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLgotCi1UdWUgT2N0ICA0IDEyOjA1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBVc2UgJHtjb25maWdfc2hlbGx9IHdoZW4gcnVubmluZyAke2NvbmZpZ3N1Yn0uCi0KLU1vbiBPY3QgIDMgMTQ6Mjg6MzQgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTm8gbG9uZ2VyIHJlY29nbml6ZSBoODMwMGguCi0KLU1vbiBPY3QgIDMgMTI6NDA6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZW1vdmUgZXh0cmFuZW91cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbmZpZy5zdWIgYW5kCi0JZ2NjL2NvbmZpZy5zdWIuCi0KLVNhdCBPY3QgIDEgMDA6MjM6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRkRJUlMpOiBBZGQgZ2FzLgotCi1UaHUgU2VwIDIyIDE5OjA0OjU1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIENPUFlJTkcuTkVXTElCOiBOZXcgZmlsZS4KLQotTW9uIFNlcCAxOSAxODoyNTo0MCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChIUC1VWCk6ICBQYXRjaCBmcm9tIEhhcmxhbiBTdGVubgotCTxoYXJsYW5AbGFuZG1hcmsuY29tPiB0byBhbHNvIGVtaXQgcmVsZWFzZSBsZXZlbC4KLQotV2VkIFNlcCAgNyAxMzoxNToyNSAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoc3VuNCo6U3VuT1M6KjoqKTogQ2hhbmdlICctSkwnIHRvICdfSkwnLgotCi1UdWUgU2VwICA2IDIzOjIzOjE4IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgTWVyZ2UgbmV4dHN0ZXAgY2xlYW51cCBmcm9tIEZTRi4KLQotTW9uIFNlcCAgNSAwNTowMTozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhcm0tKi0qKTogRG9uJ3QgY29uZmlndXJlIGxkIGZvciB0aGlzIHRhcmdldC4KLQotVGh1IFNlcCAgMSAwOTozNTowMCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUpOiBkb24ndCBjb25maWd1cmUgbGliZysrLCBsaWJpbywKLQkgIGxpYnJ4LCBvciBuZXdsaWIuCi0KLVdlZCBBdWcgMzEgMTM6NTI6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLWRlYy1vc2YqKTogVXNlIG9zZiosIG5vdCBvc2YxKi4gIERvbid0Ci0JY29uZmlndXJlIGxkLS1pdCB3b3JrcywgYnV0IGl0IGRvZXNuJ3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi1TdW4gQXVnIDI4IDE4OjEzOjQ1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKCotdW5rbm93bi1mcmVlYnNkKik6ICBHZXQgcmlkIG9mIHBvc3NpYmxlCi0JdHJhaWxpbmcgIihSZWxlYXNlKSIgaW4gdmVyc2lvbiBzdHJpbmcuCi0JUGF0Y2ggZnJvbSBQYXVsIFJpY2hhcmRzIDxwYXVsQGlzbC5jZi5hYy51az4uCi0KLVNhdCBBdWcgMjcgMTU6MDA6NDkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEZpeCBpNDg2LW5jci1zeXN2NDMgLT4gaTQ4Ni1uY3Itc3lzdjQuMy4KLQlGaXggdHlwZTogKi1uZXh0LW5lc3RzdGVwIC0+ICotbmV4dC1uZXh0c3RlcC4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0Y6Ci0KLQlGcmkgQXVnIDI2IDE4OjQ1OjI1IDE5OTQgIFBoaWxpcHBlIERlIE11eXRlciAocGhkbUBpbmZvLnVjbC5hYy5iZSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgcG93ZXJwYy1pYm0tYWl4My4yLjUuCi0KLQlXZWQgQXByIDIwIDA2OjM2OjMyIDE5OTQgIFBoaWxpcHBlIERlIE11eXRlciAgKHBoZG1AaW5mby51Y2wuYWMuYmUpCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIFVuaXhXYXJlIDEuMSAoVU5BTUVfU1lTVEVNIGlzIFNZU1RFTV9WCi0JaW5zdGVhZCBvZiBVTklYX1NWIGZvciBVbml4V2FyZSAxLjApLgotCi1TYXQgQXVnIDI3IDAxOjU2OjMwIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2RiKTogIEFkZCBkZXBlbmRlbmNpZXMgb24gYWxsLWdjYyBhbmQgYWxsLWxkCi0JdG8gbWFrZSBnZGIvbmxtLyogYnVpbGQgYWZ0ZXIgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIuCi0KLUZyaSBBdWcgMjYgMTQ6MzA6MDUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAobmV0YnNkLCBmcmVlYnNkLCBsaW51eCk6ICBBY2NlcHQgYW55IG1hY2hpbmUsCi0Jbm90IGp1c3QgaVszNF04Ni4KLQkobTY4ay1hdGFyaS1zeXN2NCk6ICBSZWxvY2F0ZSB0byBtYXRjaCBGU0YgdmVyc2lvbi4KLQotCSogY29uZmlnLmd1ZXNzOiAgTW9yZSBtZXJnZXMgZnJvbSB0aGUgRlNGOgotCi0JQWRkIGEgc3BhY2UgYmVmb3JlIGZ1bmN0aW9uIGNhbGwgb3IgbWFjcm8gaW52b2NhdGlvbi4KLQotCVR1ZSBNYXkgMTAgMTY6NTM6NTUgMTk5NCAgUm9sYW5kIE1jR3JhdGggKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCB0cmFwIGNtZCB0byByZW1vdmUgZHVtbXkuYyBhbmQgZHVtbXkgd2hlbgotCWludGVycnVwdGVkLgotCi0JV2VkIEFwciAyMCAxODowNzoxMyAxOTk0ICBSb2xhbmQgTWNHcmF0aCAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzcyAoZHVtbXkuYyk6IFJlZGlyZWN0IHN0ZGVyciBmb3IgYGhvc3RpbmZvJyBjb21tYW5kLgotCShkdW1teSk6IFJlZGlyZWN0IHN0ZGVyciBmcm9tIGNvbXBpbGF0aW9uIG9mIGR1bW15LmMuCi0KLQlTYXQgQXByICA5IDE0OjU5OjI4IDE5OTQgIENocmlzdGlhbiBLcmFueiAgKGtyYW56QHNlbnQ1LnVuaS1kdWlzYnVyZy5kZSkKLQotCSogY29uZmlnLmd1ZXNzOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIE5lWFRTdGVwIDIuMSBhbmQgMy54LgotCi1GcmkgQXVnIDI2IDEzOjQyOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBY2NlcHQgYW5kIGlnbm9yZSAtLWNhY2hlKiwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotCW5ldyBhdXRvY29uZi4KLQotRnJpIEF1ZyAyNiAxMzowNToyNyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0Y6Ci0KLQlUaHUgQXVnIDI1IDIwOjI4OjUxIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIDxybXNAbW9sZS5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzIChQeXJhbWlkKjpPU3gqOio6Kik6IE5ldyBjYXNlLgotICAgICAgICAoUEFUSCk6IEFkZCAvLmF0dGJpbiBhdCBlbmQgZm9yIGZpbmRpbmcgdW5hbWUuCi0gICAgICAgIChkdW1teS5jKTogSGFuZGxlIGk4NjAtYWxsaWFudC1ic2QuICBGb2xsb3cgd2hpdGVzcGFjZSBjb252ZW50aW9ucy4KLQotCVdlZCBBdWcgMTcgMTg6MjE6MDIgMTk5NCAgVG9yIEVnZ2UgICh0ZWdnZUBwdnYudW5pdC5ubykKLQotICAgICAgICAqIGNvbmZpZy5ndWVzcyAoTTg4KjpEb2xwaGluT1M6KjoqKTogTmV3IGNhc2UuCi0KLQlUaHUgQXVnIDExIDE3OjAwOjEzIDE5OTQgIFN0YW4gQ294ICAoY294c0BkZy1ydHAuZGcuY29tKQotCi0gICAgICAgICogY29uZmlnLmd1ZXNzIChBVmlpT046ZGd1eDoqOiopOiBVc2UgVEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0UKLSAgICAgICAgdG8gc2VsZWN0IHdoZXRoZXIgdG8gdXNlIEVMRiBvciBDT0ZGLgotCi0JU3VuIEp1bCAyNCAxNjoyMDo1MyAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICA8cm1zQG1vbGUuZ251LmFpLm1pdC5lZHU+Ci0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpODYwLXN0YXJkZW50LXN5c3YgYW5kIGk4NjAtdW5rbm93bi1zeXN2LgotCi0JU3VuIE1heSAgMSAxMDoyMzoxMCAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogR3Vlc3MgdGhlIE9TIHZlcnNpb24gZm9yIEhQVVguCi0KLQlUdWUgTWFyICAxIDIxOjUzOjAzIDE5OTQgIEthcmwgSGV1ZXIgIChrd3poQGhhbC5nbnUuYWkubWl0LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzIChVTkFNRV9WRVJTSU9OKTogUmVjb2duaXplIGFpeDMuMi40IGFuZCBhaXgzLjIuNS4KLQotRnJpIEF1ZyAyNiAxMToxOTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIC0td2l0aC1oZWFkZXJzLCAtLXdpdGgtbGlicywgYW5kCi0JLS13aXRob3V0LW5ld2xpYi4KLQkqIE1ha2VmaWxlLmluIChhbGwteGliZXJ0eSk6IERlcGVuZCB1cG9uIGFsbC1sZC4KLQotV2VkIEF1ZyAyNCAxMjozNjo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLU1vbiBBdWcgMjIgMTA6NTg6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgKHZlcnNpb24pOiBBIGZldyBtb3JlIHR3ZWFrcyB0byBoZWxwIG1lc3NhZ2UuCi0KLUZyaSBBdWcgMTkgMTI6NDA6MjUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIChmb3Igbm93KSBsaWJyeCBhcyBhIGhvc3QgbGlicmFyeSwKLQlub3cgdGhhdCB3ZSdyZSBidWlsZGluZyBpdCBmb3IgdGFyZ2V0LgotCi1GcmkgQXVnIDE5IDEwOjQ5OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBGaXggdXAgaGVscCBtZXNzYWdlOyBmcm9tIGthcmxAb3dsLmhxLmlsZWFmLmNvbQotCShLYXJsIEJlcnJ5KS4KLQotVHVlIEF1ZyAxNiAxNjoxMTowOCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWxzbyBjb25maWd1cmUgbGlicnguCi0KLU1vbiBBdWcgMTUgMTY6NTE6NDUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIHZhcmlvdXMgcnVsZXMgdG8gcmVmbGVjdCB0aGF0IGxpYnJ4Ci0JaXMgbm93IG5lZWRlZCBmb3IgbGliZysrLgotCi1GcmkgQXVnIDEyIDE4OjA3OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IG1pcHM2NG9yaW9uIGFuZCBtaXBzNjRvcmlvbmVsIGFzIGEgQ1BVIG5hbWUuCi0KLU1vbiBBdWcgIDggMTE6MzY6MTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LgotCi1UaHUgQXVnICA0IDE2OjEyOjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBTaW1wbGlmeSBKdW4gMiAxOTk0IGNoYW5nZS4KLQotV2VkIEF1ZyAgMyAwNDo1ODoxNiAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNoYW5nZSBDQyB0byAvdXNyL2xhdGVzdC9iaW4vZ2NjIGZvciBseW54IGhvc3QgYnVpbGRzLCBzaW5jZQotCS9iaW4vZ2NjIGlzbid0IGdvb2QgZW5vdWdoIHRvIGJ1aWxkIGdjYy4KLQotV2VkIEp1bCAyNyAwOTowNzoxNCAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdEQl9TVVBQT1JUX0ZJTEVTKTogUmVtb3ZlCi0JKHNldHVwLWRpcnMtZ2RiLCBnZGIudGFyLmd6LCBtYWtlLWdkYi50YXIuZ3opOiAgUmVtb3ZlIG9sZCBydWxlcy4KLQkoZ2RiLnRhci5neik6IEFkZCBuZXcgcnVsZSB0byB1c2Ugc3RhbmRhcmQgZGlzdHJpYnV0aW9uIGJ1aWxkaW5nCi0JbWVjaGFuaXNtLgotCi1Nb24gSnVsIDI1IDExOjEwOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBXYXJuIGFib3V0IHVzZSBvZiAvdXNyL3VjYi9jYyBvbiBTb2xhcmlzLiAgRnJvbQotCUJpbGwgQ294IDxiaWxsQGN5Z251cy5jb20+LgotCi1TYXQgSnVsIDIzIDEyOjE5OjQ2IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgSVNDLiAgUGF0Y2ggZnJvbSBrd3poQGdudS5haS5taXQuZWR1LgotCi1GcmkgSnVsIDIyIDE3OjUzOjU5IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIFNlYXJjaCBjdXJyZW50IGRpciBmaXJzdCBpbiAuZ2RiaW5pdC4KLQotRnJpIEp1bCAyMiAxMToyODozMCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIFJlY29nbml6ZSBmcmVlYnNkIChtZXJnZWQgZnJvbSBnY2MgY29uZmlnLnN1YikuCi0KLVRodSBKdWwgMjEgMTQ6MTA6NTIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBSZWZlciB0byBOZVhUJ3Mgb3BlcmF0aW5nIHN5c3RlbSBhcyBuZXh0c3RlcC4KLQotCSogY29uZmlnLnN1YiAoY2FzZSAkYmFzaWNfbWFjaGluZSk6ICBSZS1vcmRlciB0aGUgY2FzZXMsIHRvIG1hdGNoCi0JdGhlIG9yZGVyIGluIHRoZSBGU0YgdmVyc2lvbiAod2hpY2ggaXMgbW9zdGx5IGFscGhhYmV0aGljYWwpLgotCU1lcmdlIGluIHNvbWUgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIGZyb20gdGhlIEZTRi4KLQotU2F0IEp1bCAxNiAxMjowMzowOCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG02OGstYXRhcmktc3lzdjQgYW5kIG04OGstaGFycmlzLWNzdXg3LgotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGN4dXg3LgotCSogY29uZmlndXJlLmluOiBVc2UgbWgtY3h1eCBmb3IgbTg4ay1oYXJyaXMtY3h1eCouCi0KLU1vbiBKdWwgMTEgMTQ6Mzc6MzkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBGaXggdHlwbyBwb3dlcnBjIC0+IHBvd2VycGMtKi4KLQotU2F0IEp1bCAgOSAxMzowMzo0MyAxOTk0ICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGJsdWVzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBgYWxsLWVtYWNzMTknIGRlcGVuZHMgb24gYGFsbC1ieWFjYycuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWVtYWNzMTkgYW5kIGluc3RhbGwtZW1hY3MxOSBydWxlcyAoaW4KLQlwYXJhbGxlbCB3aXRoIGFsbC1lbWFjcyBhbmQgaW5zdGFsbC1lbWFjcykuICBUb3AtbGV2ZWwgY29tbWFuZAotCWBtYWtlIGFsbC1lbWFjczE5IENDPWdjYycgbm93IGJlaGF2ZXMgYXMgYG1ha2UgYWxsLWVtYWNzIENDPWdjYycuCi0KLVRodSBKdW4gMzAgMTY6NTM6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rICgkKGhvc3QpLXN0YW1wLXN0YWdlMi1pbnN0YWxsZWQpOiBSZW1vdmUKLQkkKHJlbGJpbmRpcikvbWFrZSBiZWZvcmUgZG9pbmcgYGBtYWtlIGluc3RhbGwnJywgYW5kIHVzZQotCSQoR05VX01BS0UpIHdoaWxlIGRvaW5nIGl0LiAgQXZvaWRzIHByb2JsZW0gb24gU3VuT1Mgd2l0aAotCWluc3RhbGxpbmcgb3ZlciBydW5uaW5nIG1ha2UgYmluYXJ5LgotCSgkKGhvc3QpLXN0YW1wLXN0YWdlMy1pbnN0YWxsZWQpOiBMaWtld2lzZS4KLQotVHVlIEp1biAyOCAxMzo0MzoyNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgTWFjaC4KLQotTW9uIEp1biAyNyAxNjo0MToxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQ2hlY2sgJHtleGVjX3ByZWZpeG9wdGlvbn0sIG5vdCAke2V4ZWNfcHJlZml4fSwgdG8KLQlzZWUgd2hldGhlciAtLWV4ZWMtcHJlZml4IHdhcyB1c2VkLgotCi1TdW4gSnVuIDI2IDIxOjE1OjU0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBFeHBsaWNpdGx5IG1lbnRpb24gbGliZysrL1JFQURNRS4gIChab28ncyBpZGVhLikKLQotVHVlIEp1biAyMSAxMjo0NTo1NSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtbGlicnggdGFyZ2V0IHNpbWlsYXIgdG8gYWxsLWxpYnByb2MuCi0KLVdlZCBKdW4gIDggMjM6MTE6NTUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVhcnJhbmdlIHRlc3RzIGZvciBBbHBoYS1PU0YxIHRvIHByb3Blcmx5IGRlYWwKLQl3aXRoIHBvc3QgMS4yIHVuYW1lIGJvZ29zaXR5LgotCi1UaHUgSnVuICA5IDAwOjI3OjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBSZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIG9uIHJlY2VpcHQgb2YgYSBzaWduYWwuCi0KLVR1ZSBKdW4gIDcgMTI6MDY6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIHRoZXJlIGlzIGEgcGFja2FnZV9tYWtlZmlsZV9mcmFnLCByZW1vdmUKLQkke3N1YmRpcn0vTWFrZWZpbGUudGVtIGFmdGVyIGNvcHlpbmcgaXQgaW4uCi0KLU1vbiBKdW4gIDYgMjE6MzU6MDIgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBidWlsZF9hbGwubWs6IHN1cHBvcnQgcnM2MDAwIGx5bnggaWRlbnRpZmllcyBpdHNlbGYgYXMKLQlyczYwMDAtbHlueC1seW54b3MyLjIuMi4gIEFsc28sIHVzZSAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9iaW4vZ2NjCi0Jc2luY2UgL2Jpbi9nY2MgaXMgdG9vIGZlZWJsZSB0byBjb21waWxlIGEgbW9kZXJuIGdjYy4KLQotTW9uIEp1biAgNiAxNjowNjozNCAxOTk0ICBLYXJlbiBDaHJpc3RpYW5zZW4gKGthcmVuQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBicm91Z2h0IGRldm8vdGVzdC1idWlsZC5tayB1cGRhdGUtdG8tZGF0ZSB3aXRoIHByb2dyZXNzaXZlLwotCSAgdGVzdC1idWlsZC5tay4gQWRkIGx5bnggdGFyZ2V0cyBhbmQgaHBwYSBmbGFnIGluZm8uCi0KLVNhdCBKdW4gIDQgMTc6MjM6NTQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBtaC1uY3JzdnI0My4gIFBhdGNoIGZyb20KLQlUb20gTWNDb25uZWxsIDx0bWNjb25uZUBzZWRvbmEuaW50ZWwuY29tPi4KLQotRnJpIEp1biAgMyAxNzo0NzoyNCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChpMzg2LXVua25vd24tYnNkaSk6ICBObyBsb25nZXIgbmVlZCB0bwotCWNoZWNrICNpZiBkZWZpbmVkKF9fYnNkaV9fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKS4KLQotVGh1IEp1biAgMiAxODo1Njo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU2V0IHByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb24gY29ycmVjdGx5LgotCi1UaHUgSnVuICAyIDEwOjU3OjA2IDE5OTQgIEthcmVuIENocmlzdGlhbnNlbiAoa2FyZW5AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGJyb3VnaHQgYnVpbGQtYWxsLm1rIHVwZGF0ZS10by1kYXRlIHdpdGggcHJvZ3Jlc3NpdmUgYnVpbGQtYWxsLm1rLAotCSAgYWRkZWQgbmV3IHRhcmdldHMgYW5kIGhwcGEgaW5mby4KLQkKLVRodSBKdW4gIDIgMDA6MTI6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIGNvbmZpZy5ndWVzcyByZXN1bHQgaXMgYSBwcmVmaXggb2YgdGhlIHVzZXIKLQlzcGVjaWZpZWQgdGFyZ2V0LCBhc3N1bWUgYSBuYXRpdmUgYnVpbGQgYW5kIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQKLQl0YXJnZXQgYXMgdGhlIGhvc3QgYWxpYXMuICBSZW1vdmUgU3VuT1MgcGF0Y2ggc3VmZml4IHJlbW92YWwgaGFjay4KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIFN1bk9TIHBhdGNoIHN1ZmZpeCByZW1vdmFsIGhhY2suCi0KLQkqIE1ha2VmaWxlLmluIChDUk9TU19DSEVDS19NT0RVTEVTKTogUmVtb3ZlIGNoZWNrLWZsZXgsIHNpbmNlIGl0J3MKLQlpbiBOQVRJVkVfQ0hFQ0tfTU9EVUxFUy4KLQotV2VkIEp1biAgMSAxMDo0OTo0MSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW5hbWUgSE9TVF9PTkxZIHRvIE5BVElWRS4KLQkqIGNvbmZpZ3VyZTogRGVsZXRlIFN1bk9zIHBhdGNoIHN1ZmZpeCBmcm9tIGhvc3RfY2Fub25pY2FsCi0JICBhbmQgYnVpbGRfY2Fub25pY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSBwcmVwZW5kZWQgdG8gTWFrZWZpbGVzLgotCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudHMgZm9yIGVhc2llciBtYWludGVuYW5jZS4KLQotVHVlIE1heSAzMSAxOTozOTo0NyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtbGlicHJvYyB0YXJnZXQgc2ltaWxhciB0byBhbGwtZ3VpLgotCi1UdWUgTWF5IDMxIDE3OjE2OjMzIDE5OTQgIFRvbSBMb3JkICAobG9yZEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tfTU9EVUxFUyk6IHNwbGl0IGludG8KLQlIT1NUX09OTFlfQ0hFQ0tfTU9EVUxFUyBhbmQgQ1JPU1NfQ0hFQ0tfTU9EVUxFUy4KLQotVHVlIE1heSAzMSAxNjozNjozNiAxOTk0ICBQYXVsIEVnZ2VydCAgKGVnZ2VydEB0d2luc3VuLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChpMzg2LXVua25vd24tYnNkaSk6IE5ldyBzeXN0ZW0gdG8gZ3Vlc3MuCi0KLVdlZCBNYXkgMjUgMTY6NDc6MTAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWd1aSB0YXJnZXQgKGJ1dCBub3QgeWV0IGJ1aWxkIGJ5ICJhbGwiKS4KLQotVGh1IE1heSAyNiAwODo1MzoxOSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IE1vdmUgZGVsZXRpb24gb2YgcGF0Y2ggc3VmZml4IGZyb20gaGVyZS4uLgotCSogY29uZmlndXJlLmluOiBUbyBoZXJlLCBhdCBJYW4ncyBzdWdnZXN0aW9uLiAgVGhlIHRvcC0KLQkgIGxldmVsIHNjcmlwdHMgbWlnaHQgbmVlZCB0byBrbm93IG9mIGEgcGF0Y2ggbGV2ZWwuCi0KLVdlZCBNYXkgMjUgMDk6MTU6NTQgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBTdHJpcCBvZmYgcGF0Y2ggc3VmZml4IHNvIHJ0bCBpcyByZWNvZ25pemVkCi0JICBhcyBhIHN1bm9zNC4xLjMgbWFjaGluZSwgZXZlbiB0aG91Z2ggaXQncyBiZWVuIHBhdGNoZWQuCi0KLUZyaSBNYXkgMjAgMDg6MjU6NDkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTEFTVCk6IERlbGV0ZS4KLQkoSU5TVEFMTF9ET1NSRUwpOiBOZXcuCi0KLVRodSBNYXkgMTkgMTc6MTI6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBsZCBmb3IgaVszNF04Ni0qLXN5c3Y0KiBhbmQgc3BhcmMtKi1zb2xhcmlzMiouCi0JRG9uJ3Qgc2V0IHVzZV9nbnVfbGQgdG8gbm8gZm9yICotKi1zeXN2NDsgdGhhdCBvbmx5IGNvbnRyb2xzCi0Jd2hldGhlciB3ZSBwYXNzIGRvd24gLS13aXRoLWdudS1sZCBhbnlob3cuCi0KLVRodSBNYXkgMTkgMDk6Mjk6MTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTEFTVCk6IENoYW5nZSBvcGVyYXRpb24gc28gaXQgd29ya3MKLQlvbiBtb3JlIGZsYXZvcnMgb2YgbWFrZS4KLQkqIGNvbmZpZ3VyZS5pbiAoZ28zMik6IERvbid0IGJ1aWxkIGxpYmcrKyBvciBsaWJpby4KLQotRnJpIE1heSAxMyAxMzoyODozNCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTW92ZSBIT1NUX1BSRUZJWF8xIGFuZCBmcmllbmRzIHVwIHNvCi0JdGhleSBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHRlbXBsYXRlcy4KLQotU2F0IE1heSAgNyAxNjo0Njo0NCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldD09Z28zMik6IERvbid0IGJ1aWxkIGdkYi4KLQkqIGRvc3JlbDogTmV3IGRpcmVjdG9yeS4KLQotRnJpIE1heSAgNiAxNDoxOToyNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PWdvMzIpOiBDb25maWd1cmUgZG9zcmVsIHRvby4KLQkqIE1ha2VmaWxlLmluIChJTlRBTExfVEFSR0VUKTogQ2FsbCBJTlNUQUxMX0xBU1QgbGFzdC4KLQkoSE9TVF9DQywgSE9TVF9QUkVGSVgsIEhPU1RfUFJFRklYXzEpOiBVbmRlZmluZSwgdGhleSBzaG91bGQKLQliZSBzZXQgYnkgaW5jb21pbmcgbmFtZXMgb3IgdGVtcGxhdGVzLgotCShJTlNUQUxMX0xBU1QpOiBOZXcgcnVsZS4KLQkqIGNvbmZpZy9taC1nbzMyOiBOZXcgZnJhZ21lbnQuCi0KLVRodSBNYXkgIDUgMTc6MzU6MDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChzcGFyY2xpdGVmcncsIHNwYXJjbGl0ZWZyd2NvbXBhdCk6IERvbid0IHNldCB0aGUgb3MuCi0KLVRodSBNYXkgIDUgMjA6MDY6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWx5bnhyczZrOiBSZW5hbWVkIGZyb20gbWgtbHlueG9zcnM2aywgdG8gbWFrZSBpdAotCXVuaXF1ZSBpbiA4LjMgbmFtaW5nIHNjaGVtZXMuCi0JKiBjb25maWd1cmUuaW4gKGFwcGRpcnMpOiBOZXcgdmFyaWFibGUuICBDdXJyZW50bHkgZW1wdHksIGJ1dCB3aWxsCi0JYmUgdXNlZCBpbiBnYXMgZGlzdHJpYnV0aW9uLiAgSWYgbm9uZW1wdHksIGxpc3RzIGEgc2V0IG9mCi0JZGlyZWN0b3JpZXMgYXQgbGVhc3Qgb25lIG9mIHdoaWNoIG11c3QgZ2V0IGNvbmZpZ3VyZWQsIG9yIHRvcAotCWxldmVsIGNvbmZpZ3VyYXRpb24gaXMgY29uc2lkZXJlZCB0byBoYXZlIGZhaWxlZC4KLQkocnM2MDAwLSotbHlueG9zKik6IFVzZSBuZXcgZmlsZSBuYW1lLgotCi1UaHUgTWF5ICA1IDEzOjM4OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUVsaW1pbmF0ZSBYVFJBRkxBR1MuCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IElmIG5ld2xpYiBleGlzdHMsIHJlZmVyIHRvIHRoZQotCW5ld2xpYiBpbmNsdWRlIGZpbGVzIHVzaW5nIC1pZGlyYWZ0ZXIsIGFuZCBhbHNvIHVzZSAtbm9zdGRpbmMuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0JKFhUUkFGTEFHUyk6IFJlbW92ZWQuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBYVFJBRkxBR1NfRk9SX1RBUkdFVC4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFJlbW92ZSBYVFJBRkxBR1MuCi0JKEVYVFJBX1RBUkdFVF9GTEFHUywgRVhUUkFfR0NDX0ZMQUdTKTogTGlrZXdpc2UuCi0JKCQoRE9fWCkpOiBEb24ndCBwYXNzIGRvd24gWFRSQUZMQUdTLgotCi1UaHUgTWF5ICA1IDAwOjE2OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLWRlYy1ic2QqKTogTmV3IHRhcmdldDsgZG8gYnVpbGQgbGlua2VyLgotCShtaXBzKi0qLWJzZCopOiBOZXcgdGFyZ2V0OyBkb24ndCBidWlsZCBsaW5rZXIuCi0KLVdlZCBNYXkgIDQgMjA6MTA6MTAgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHN1cHBvcnQgcnM2MDAwLSotbHlueG9zKiBjb25maWd1cmF0aW9uLgotCXN1cHBvcnQgc3Vub3M0IGFzIGEgY3Jvc3MgdGFyZ2V0LgotCi0JKiBjb25maWcuc3ViOiBsb29rIGZvciBseW54Kiwgbm90IGx5bnggc2luY2UgdGhlIE9TIHZlcnNpb24gbWF5Ci0JbGVnaXRpbWF0ZWx5IGJlIHBhcnQgb2YgdGhlIG5hbWUuCi0KLVR1ZSBNYXkgIDMgMjE6NDg6MTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc2NvKik6IE1vdmUgdG8gYmUgd2l0aCBvdGhlciBpMzg2Ci0JdGFyZ2V0cy4KLQkocm9tcC0qLSopOiBOZXcgdGFyZ2V0LiAgU2tpcCB2YXJpb3VzIGJpbmFyeSB1dGlsaXRpZXMuCi0JKHZheC0qLSopOiBOZXcgdGFyZ2V0LiAgRG9uJ3QgYnVpbGQgbmV3bGliLgotCSh2YXgtKi12bXMpOiBSZW5hbWVkIGZyb20gKi0qLXZtcy4gIERvbid0IGJ1aWxkIG9wY29kZXMgb3IgbmV3bGliLgotCi1UaHUgQXByIDI4IDE1OjAzOjA1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBPbmx5IHNldCBob3N0X21ha2VmaWxlX2ZyYWcgaWYgY29uZmlnCi0JZGlyZWN0b3J5IGV4aXN0cy4KLQotV2VkIEFwciAyNyAxMjoxNDozMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IElmICRkc3RkaXIgZXhpc3RzLCBkb24ndCBjaGVjayB3aGV0aGVyIGVhY2gKLQljb21wb25lbnQgZG9lcy4KLQotVHVlIEFwciAyNiAxODoxMTozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkIHNsZWVwOyB1c2VkIGJ5IHJjcy9zcmMvY29uZi5zaC4KLQotTW9uIEFwciAyNSAxNTowNjozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLSAJKiBjb25maWd1cmUuaW4gKCotKi1seW54b3MqKTogRG9uJ3QgY29uZmlndXJlIG5ld2xpYiBmb3IgZWl0aGVyCi0gCW5hdGl2ZSBvciBjcm9zcyBMeW54LgotCi1TYXQgQXByIDE2IDExOjU4OjE2IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKHNwYXJjNjQtZWxmKTogRml4IG9zLgotCSh6OGspOiBSZW1vdmUgZHVwbGljYXRlLgotCi1UaHUgQXByIDE0IDIzOjMzOjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdjYy1uby1maXhlZGluY2x1ZGVzKTogVG91Y2ggZ2NjL2luY2x1ZGUvZml4ZWQsIG5vdAotCWdjYy9zdG1wLWZpeHByb3RvLCB0byB0cnkgdG8gcHJldmVudCBmaXhwcm90byBmcm9tIGJlaW5nIHJ1bi4KLQotV2VkIEFwciAxMyAxNToxNDo1MiAxOTk0ICBCaWxsIENveCAgKGJpbGxAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBNYWtlIGZpbGUgbGlua3MgY2xlYW5seSBldmVuIGlmIEx5bnggZmFpbHMgb24KLSAgICAgICAgICBhbiBORlMgc3ltbGluayAoYXQgbGVhc3QgZmFpbCBjbGVhbmx5KS4KLQotTW9uIEFwciAxMSAxMDo1ODo1NiAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKENDKTogRm9yIG1pcHMtc2dpLWlyaXg0LCBjaGFuZ2UgLVhOaDE1MDAgdG8KLQktWE5oMjAwMC4KLQotU2F0IEFwciAgOSAxNToxMDo0NSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogVW5rbm93biBvcHRpb25zIGFyZSBmYXRhbCBhZ2Fpbi4KLQotRnJpIEFwciAgOCAxMjowMTo0MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZ25vcmUgLS14LWluY2x1ZGVzIGFuZCAtLXgtbGlicmFyaWVzLCBmb3IgQXV0b2NvbmYKLQljb21wYXRpYmlsaXR5LiAKLQotVGh1IEFwciAgNyAxNzozMTo0MyAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IEFkZCBgY2xlYW4nIHRhcmdldC4KLQotV2VkIEFwciAgNiAyMDo0NDo1NiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZy5ndWVzczogIEFkZCBTSU5JWCBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiAgQWRkIG1pcHMtKi1zeXN2NCogc3VwcG9ydC4KLQotTW9uIEFwciAgNCAxNzo0MTo0NCAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IERvY3VtZW50IGFsbCB1c2VmdWwgdGFyZ2V0cy4KLQlJZiBjYW5vbmhvc3QgaXMgc3BhcmMtc3VuLXNvbGFyaXMyLjMsIGNoYW5nZSBpdCB0byBzcGFyYy1zdW4tc29sYXJpczIuCi0JSWYgY2Fub25ob3N0IGlzIG1pcHMtc2dpLWlyaXg0LjAuNUgsIGNoYW5nZSBpdCB0byBtaXBzLXNnaS1pcml4NC4KLQotVGh1IE1hciAzMSAwNDo1NTo1NyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU3VwcG9ydCAtLXNpbGVudCwgLS1xdWlldC4KLQotV2VkIE1hciAzMCAyMTozNzozOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU3VwcG9ydCAtLWRpc2FibGUtRkVBVFVSRS4KLQotVHVlIE1hciAyOSAxOToxNTowNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgTkNSIHJ1bm5pbmcgU1ZSNC4zLgotCi1Nb24gTWFyIDI4IDE0OjU1OjE1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBNYWtlIEJTREkgZ2VuZXJhdGUgaTM4Ni11bmtub3duLWJzZDM4Ni4KLQlQYXRjaCBmcm9tIFBhdWwgRWdnZXJ0IDxlZ2dlcnRAdHdpbnN1bi5jb20+LgotCi1Nb24gTWFyIDI4IDEyOjU0OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotYWl4Kik6IFRyZWF0IGxpa2UgcnM2MDAwLSotKi4KLQotU2F0IE1hciAyNiAxMToyNTo0OCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogTWFrZSB1bnJlY29nbml6ZWQgb3B0aW9ucyBnaXZlIG5vbmZhdGFsIHdhcm5pbmdzCi0JaW5zdGVhZCBvZiBmYXRhbCBlcnJvcnMsIGFuZCBwYXNzIHRoZW0gdG8gYW55IHN1YmRpcmVjdG9yeQotCWNvbmZpZ3VyZXMgaW4gY2FzZSB0aGV5IHJlY29nbml6ZSB0aGVtLgotCU1ha2UgLS14IGVxdWl2YWxlbnQgdG8gLS13aXRoLXguCi0KLUZyaSBNYXIgMjUgMjE6NTI6MTAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFkZCAtLWVuYWJsZS0qIG9wdGlvbnMuICBDbGVhbiB1cCB1c2FnZSBtZXNzYWdlIGFuZAotCXNvbWUgY29tbWVudHMuCi0KLVRodSBNYXIgMjQgMDk6MTI6NTMgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE5NX0ZPUl9UQVJHRVQpOiBCdWlsZCB0cmVlIHZlcnNpb24gaXMgbm93IG5tLm5ldy4KLQotU3VuIE1hciAyMCAxMToyODoyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLSopOiBFbmFibGUgYmludXRpbHMuCi0KLVNhdCBNYXIgMTkgMTE6NTA6MTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBjaXNjby4KLQotRnJpIE1hciAxOCAxNjo0MjozMiAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENYWEZMQUdTKTogQWRkIC1mZXh0ZXJuYWwtdGVtcGxhdGVzLgotCi1UdWUgTWFyIDE1IDExOjI1OjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFib3V0IHRhcmdldCAqLWhpdGFjaGktaGl1eHdlMiwgZG9uJ3QgcHJpbnQgbW9yZQotCXRoYW4gb25lIGNvbmZpZ3VyYXRpb24gbmFtZS4gIEFkZCBjb21tZW50LgotCi1TdW4gTWFyICA2IDIzOjEzOjM4IDE5OTQgIEhpc2FzaGkgTUlOQU1JTk8gIChtaW5hbWlub0BzcmEuY28uanApCi0KLQkqIGNvbmZpZy5ndWVzczogYWJvdXQgdGFyZ2V0ICotaGl0YWNoaS1oaXV4d2UyLCBmaXhlZAotCW1hY2hpbmUgZ3Vlc3Npbmcgb3JkZXIuICBbSGl0YWNoaSdzIENQVV9JU19IUF9NQzY4SwotCW1hY3JvIGlzIGluY29ycmVjdC5dCi0KLVN1biBNYXIgMTMgMDk6MTA6MDggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogSnVzdCBidWlsZCBUQUdTIGluIGVhY2ggc3ViZGlyZWN0b3J5LCByYXRoZXIKLQl0aGFuIHRoZSAibWFrZSBscyIgc3R1ZmYgd2hpY2ggdXNlZCB0byBiZSBoZXJlLgotCi1GcmkgTWFyIDExIDEyOjUyOjM5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaVszNF04Ni11bmtub3duLWZyZWVic2QuCi0JRnJvbSBTaGF3biBNIENhcmV5IDxzbWNhcmV5QHJvZGFuLnN5ci5lZHU+LgotCi1UaHUgTWFyICAzIDE0OjI0OjIxIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyBmb3IgYWxwaGEpOiBSZW1vdmUgbGliZysrIGFuZCBsaWJpby4KLQotV2VkIE1hciAgMiAxMzoyODo0OCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBDaGVjayBmb3IgcHR4LgotCi1Nb24gRmViIDI4IDE2OjQ2OjUwIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFkZCBvczlrIGNoZWNraW5nLgotCi1UaHUgRmViIDI0IDA3OjA5OjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEhhbmRsZSBPU0YxIHJ1bm5pbmcgb24gSFBQQSBwcm9jZXNzb3JzCi0KLUZyaSBGZWIgMTggMTQ6MTQ6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIHN1YmRpciBjb25maWd1cmUgZmFpbHMsIHByaW50IG91dCBhIG1lc3NhZ2Ugd2l0aAotCXN1YmRpcmVjdG9yeSBuYW1lLCBpbiBjYXNlIHN1YmRpcidzIGNvbmZpZ3VyZSBjb2RlIGRpZG4ndCBpZGVudGlmeQotCWl0c2VsZi4KLQotRnJpIEZlYiAxOCAxMjo1MDoxNSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGVtYmVkZGVkIG5ld2xpbmVzIGZyb20gY29uZmlnZGlycy4KLQlBdm9pZCBtaXNtYXRjaGVzIG9mIHN1YnN0cmluZ3MuICBGaXggbWF0Y2hpbmcgc3RyaW5ncyBhdCBlbmQKLQlvZiBjb25maWdkaXJzLgotCi1GcmkgRmViIDExIDE1OjMzOjMzIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEFkZCBMeW54L3JzNjAwMCBjb25maWcgc3VwcG9ydC4KLQotVHVlIEZlYiAgOCAxMzo0MTowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtZGVjLW9zZjEqLCBhbHBoYSotKi0qKTogQnVpbGQgZ2FzLgotCi1Nb24gRmViICA3IDE1OjQyOjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1vc2YqKTogVHJlYXQgdGhpcyBqdXN0IGxpa2UgbW9zdCBvdGhlcgotCVBBIGNvbmZpZ3VyYXRpb25zIChlZyBubyBiaW51dGlscyBvciBsZCkuCi0JKGhwcGEqLSotKmVsZiopOiBUaGVzZSBjb25maWd1cmF0aW9ucyBoYXZlIGJpbnV0aWxzIGFuZCBsZC4KLQotU3VuIEZlYiAgNiAxNjozNTowNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLnN1YiAoaGl1eCk6IEZpeCB0eXBvLiAgRnJvbSBtLWthc2FockBzcmFtaGMuc3JhLmNvLkpQLgotCi1TYXQgRmViICA1IDAxOjAwOjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChyczYwMDAtKi0qKTogQnVpbGQgZ2FzLgotCi1XZWQgRmViICAyIDEzOjU3OjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogTWFrZWZpbGUuaW46ICBBdm9pZCBidWcgaW4gbG9zaW5nIGhwdXggc2VkLgotCi1XZWQgRmViICAyIDE0OjUzOjA1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgdGVzdC1idWlsZC5tazogUmVtb3ZlIE1VTkNIX05NOyBpdCB3YXMgb25seSBuZWVkZWQKLQlmb3IgR0RCIGFuZCBHREIgaGFzIGJlZW4gZml4ZWQgdG8gbm90IG5lZWQgaXQuCi0KLU1vbiBKYW4gMzEgMTg6NDA6NTUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWx5bnhvc3JzNms6ICBBY2NvdW50IGZvciBsYWNrIG9mIHJhbmxpYiEKLQotU3VuIEphbiAzMCAxNzo1ODowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSB2YXggaG9zdHMuCi0KLUZyaSBKYW4gMjggMTU6Mjk6MzggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh3aGlsZSBsb29wKTogRG9uJ3QgdXNlICJicmVhayAyIiBpbnNpZGUgY2FzZQotCXN0YXRlbWVudCAtLSB0aGUgY2FzZSBzdGF0ZW1lbnQgaXNuJ3QgYW4gZW5jbG9zaW5nIGxvb3AuCi0KLU1vbiBKYW4gMjQgMTg6NDA6MDYgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIENsZWFuIHVwIE5lWFQgc3VwcG9ydCwgdG8gYWxsb3cgbmV4dHN0ZXAKLQlvbiBJbnRlbCBtYWNoaW5lcy4gIE1ha2UgT1MgYmUgbmV4dHN0ZXAuCi0KLVN1biBKYW4gMjMgMTg6NDc6MjIgMTk5NCAgUmljaGFyZCBLZW5uZXIgIChrZW5uZXJAdmxzaTEudWx0cmEubnl1LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgYWx0ZXJuYXRlIGZvcm1zIGZvciBDb252ZXguCi0KLVRodSBKYW4gMjAgMTY6MTM6NDEgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQ29tcGxldGVseSByZXdyaXRlIG9wdGlvbiBwcm9jZXNzaW5nLiAgVGFrZQotCWFkdmFudGFnZSBvZiBwYXR0ZXJuLW1hdGNoaW5nIHRvIGF2b2lkIGludm9raW5nIHRlc3QgZnJlcXVlbnRseS4KLQlBbHNvIGNsZWFuIHVwIGhvc3QgYW5kIHRhcmdldCBkZWZhdWx0aW5nIGxvZ2ljLgotCi1Nb24gSmFuIDE3IDE1OjA2OjU2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGFsbCBvY2N1cnJhbmNlcyBvZiAicm9vdG1lIiB3aXRoICJyIiBhbmQKLQkiJCR7cm9vdG1lfSIgd2l0aCAiJCRyIiwgdG8gaW5jcmVhc2UgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgZG8tKgotCWNvbW1hbmRzIChwbHVzIHVzZXIgZW52aXJvbm1lbnQpIHdpbGwgZml0IFNDTyBsaW1pdHMuCi0KLVRodSBKYW4gIDYgMTE6MjA6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGlzc3VlIHdhcm5pbmdzIGFib3V0IGRpcmVjdG9yaWVzIHdoaWNoIGFyZQotCW5vdCBiZWluZyBjb25maWd1cmVkIGlmIC1ub3JlY3Vyc2lvbiBpcyBzZXQuICBDb3JyZWN0IHRlc3QgZm9yCi0JLS13aXRoLWdudS1hcyBhbmQgLS13aXRoLWdudS1sZCB0byBub3QgZ2V0IGNvbmZ1c2VkIGJ5IHN1YnN0cmluZwotCW1hdGNoZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgZ2FzIGZvciBhbHBoYS1kZWMtb3NmMSouCi0KLVR1ZSBKYW4gIDQgMTc6MTA6MTkgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQmFjayBvdXQgUGVyJ3MgY2hhbmdlIG9mIDEyLzE5LzE5OTMuICBJdCBjaGFuZ2VzIHRoZQotCWJlaGF2aW9yIG9mIGNvbmZpZ3VyZSBpbiB1bmV4cGVjdGVkIGFuZCBjb25mdXNpbmcgd2F5cy4KLQotCUFsc28sIHVzZSBkaWZmZXJlbnQgZGVsaW0gY2hhciB3aGVuIGNhbGN1bGF0aW5nCi0JcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBzbyB0aGF0IHRoZSBuYW1lIGNhbiBjb250YWluIHNsYXNoZXMuCi0KLVNhdCBKYW4gIDEgMTM6NDU6MzEgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBWU1RhIG1pY3JvLWtlcm5lbC4KLQotU2F0IERlYyAyNSAyMDowMDo0NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluOiBOdWtlIGhhY2tzIHdoaWNoIHdlcmUgdXNlZCB0byBnZXQgYSBzcGVjaWFsCi0JdmVyc2lvbiBvZiBHQVMgZm9yIEhQUEEgY29uZmlndXJhdGlvbnMuCi0KLVN1biBEZWMgMTkgMjA6NDA6NDQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIElmIG9ubHkgJHt0YXJnZXRfYWxpYXN9IGlzIGdpdmVuLCB1c2UgdGhhdAotCWFzIHRoZSBkZWZhdWx0IGZvciAke2hvc3RfYWxpYXN9LgotCSogY29uZmlndXJlOiAgQWRkIG1pc3NpbmcgYmFjay1zbGFzaGVzIGJlZm9yZSBuZXN0ZWQgcXVvdGVzLgotCi1XZWQgRGVjIDE1IDE4OjA3OjE4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IGFkZCBZQUNDPSQoQklTT04pCi0KLVR1ZSBEZWMgMTQgMjE6MjU6MzMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBzb21lIFRla3Ryb25peCBjb25maWd1cmF0aW9ucy4KLQlGcm9tIEthdmVoIFIuIEdoYXppIDxnaGF6aUBub2MucnV0Z2Vycy5lZHU+LgotCi1TYXQgRGVjIDExIDExOjE4OjAwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBNYXRjaCBhbnkgZmxhdm9yIG9mIFNILgotCi1UaHUgRGVjICAyIDE3OjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdHJ5IHRvIGNvbmZpZ3VyZSBuZXdsaWIgZm9yIEFscGhhLgotCi1UaHUgRGVjICAyIDE0OjM1OjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBsZCBmb3IgSXJpeCA1LiAgRG9uJ3QgYnVpbGQgZ2FzLAotCWxpYmcrKyBvciBsaWJpbyBmb3IgYW55IEFscGhhIHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDUqKTogTmV3IHRhcmdldDsgdXNlIG1oLWlyaXg1LgotCSogY29uZmlnL21oLWlyaXg1LiBOZXcgZmlsZSBmb3IgSXJpeCA1LgotCi1XZWQgRGVjICAxIDE3OjAwOjMzIDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR1pJUFBST0cpOiBSZW5hbWVkIGZyb20gR1pJUCwgd2hpY2ggZ3ppcCB1c2VzIGZvcgotCWRlZmF1bHQgYXJndW1lbnRzIC0tIHNvIGl0IHRyaWVkIHRvIGNvbXByZXNzIGl0c2VsZi4KLQotVHVlIE5vdiAzMCAxMzo0NToxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobm90c3VwcCk6IGVuc3VyZSB0aGF0IGEgc3BhY2UgaXMgYWx3YXlzIGF0IHRoZSBlbmQKLQkgIG9mIHRoZSBjb25maWdkaXJzIGxpc3QsIHNpbmNlIHRoZSBncmVwIGNoZWNrcyBmb3IgYW4gZXhwbGljaXQgc3BhY2UKLQotVHVlIE5vdiAxNiAxNTowNDoyNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGkzODYtc3lzdjQuMik6IGRvbid0IGJ1aWxkIGxkLCBzaW5jZSBzdGF0aWMKLQkgIHZlcnNpb25zIG9mIG1hbnkgbGlicmFyaWVzIGFyZSBub3QgYXZhaWxhYmxlLgotCi1UdWUgTm92IDE2IDE0OjI4OjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBBcG9sbG9zICh1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLgotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGQsIGJpbnV0aWxzLCBvciBncHJvZiBmb3IgQXBvbGxvLgotCi1UaHUgTm92IDExIDEyOjAzOjUwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBTb255IG5ld3MgbWlwcyBydW5uaW5nIG5ld3Nvcy4KLQotV2VkIE5vdiAxMCAxNjo1NzowMCAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWN5Z251cywgYnVpbGQtY3lnbnVzKTogImZpIGVsc2UiIG5lZWRzIHRvIGJlCi0JImZpIDsgZWxzZSIgZm9yIGJhc2guCi0KLVR1ZSBOb3YgIDkgMTU6NTQ6MDEgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IHBhc3MgU0hFTEwuCi0KLUZyaSBOb3YgIDUgMDg6MDc6MjcgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhY2NlcHQgdW5peHdhcmUgYXMgYW4gYWxpYXMgZm9yIHN2cjQuMi4KLQlGaXggc29tZSBpbmNvbnNpc3RhbmNpZXMgd2l0aCB0aGUgZ2NjIHZlcnNpb24uCi0KLUZyaSBOb3YgIDUgMTU6MTQ6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNURE9DRElSUyk6ICBBZGQgZ2RiLgotCi1GcmkgTm92ICA1IDExOjU5OjQyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiAgQWRkIGxpYmcrKyBhbmQgbGliaW8uCi0KLUZyaSBOb3YgIDUgMTA6MzU6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBPbmx5IGJ1aWxkICJpbmZvIiBpbiBESVNURE9DRElSUy4KLQkoRElTVERPQ0RJUlMpOiBEb24ndCBhc3N1bWUgbGliZysrIGFuZCBnZGIgZm9sa3MgbmVjZXNzYXJpbHkgd2FudAotCXRoaXMgbm93LgotCi1UaHUgTm92ICA0IDE4OjU4OjIzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgaGl1eCogYXMgYW4gT1MgbmFtZS4KLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNUX0ZMQUdTIGJhY2sgdG8gUlVOVEVTVEZMQUdTIHBlcgotCWV0Yy9tYWtlLXN0ZHMudGV4aS4gIFRoZSB1bmRlcnNjb3JlIGNhbWUgZnJvbSBnY2MsIGFuZCBkamUgbm93Ci0JYWdyZWVzIHRoYXQgUlVOVEVTVEZMQUdTIGlzIHRoZSBjb3JyZWN0IG5hbWUuCi0KLVRodSBOb3YgIDQgMTA6NDk6MDEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6ICBSZW1vdmUgJ3NldCAtZScuICBJdCBtYWtlcyBhbnkgY29uZGl0aW9uYWxzCi0JaW4gdGhlIHNjcmlwdCB1c2VsZXNzLgotCi0JKiBjb25maWcuZ3Vlc3M6IEF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGFybS1hY29ybi1yaXNjaXgKLQlQYXRjaCBmcm9tIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZTExQGNsLmNhbS5hYy51aykuCi0KLVRodSBOb3YgMDQgMDg6MDg6MDQgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUwotCi1XZWQgTm92ICAzIDIyOjA5OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogTmV3IHZhcmlhYmxlLgotCSh0YXopOiBFZGl0IGxvY2FsIE1ha2VmaWxlLmluIHNvb25lciwgaW5zdGVhZCBvZiBwcm90by10b3BsZXYKLQlNYWtlZmlsZS5pbiBsYXRlci4gIEJ1aWxkICJpbmZvIiBhbmQgImR2aSIgaW4gRElTVERPQ0RJUlMuICAKLQotV2VkIE5vdiAgMyAyMTozMTo1MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSB0YXJnZXQpOiBjaGVjayB0aGUgc291cmNlIGRpcmVjdG9yeSBmb3IgdGhlCi0JICBwYWdhcyBzdWItZGlyZWN0b3J5Ci0KLVdlZCBOb3YgIDMgMTE6MTI6MjIgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWxsb3cgLWFvdXQqIGFuZCAtZWxmKi4KLQotV2VkIE5vdiAgMyAxMTowODozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbGQgb24gaTM4Ni1zb2xhcmlzMiwgc2FtZSBhcyBmb3IKLQlzcGFyYy1zb2xhcmlzMi4KLQotVHVlIE5vdiAgMiAxNDoyMToyNSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEFkZCB0ZXhpbmZvL2xncGwudGV4aW5mbyAoZm9yIGxpYmcrKykuCi0KLVR1ZSBOb3YgIDIgMTM6Mzg6MzAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBDb25maWd1cmUgZ2RiIGZvciBhbHBoYS4KLQotTW9uIE5vdiAgMSAxMDo0Mjo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENYWEZMQUdTKTogQWRkIC1PLgotCi1XZWQgT2N0IDI3IDEwOjQ1OjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGRlZCBzdXBwb3J0IGZvciBERyBBdmlpb24KLQotVHVlIE9jdCAyNiAxNDozNzozNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBQcm9kdWNlIHdhcm5pbmcgbWVzc2FnZSBmb3Igc3ViZGlyZWN0b3JpZXMgbm90Ci0JY29uZmlndXJhYmxlIGZvciB0aGlzIGhvc3QvdGFyZ2V0IGNvbWJpbmF0aW9uLiAgRG9uJ3QgdHJ5IHRvCi0JY29uZmlndXJlIGdkYiBmb3Igdm1zLgotCi1Nb24gT2N0IDI1IDExOjIyOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogUmVwbGFjZSAiYnlhY2MiIHdpdGggImJpc29uIC15IiBpbiB0aGUKLQlhcHByb3ByaWF0ZSBmaWxlcyBiZWZvcmUgbWFraW5nICJkaXN0c3R1ZmYiLgotCShESVNUQklTT05GSUxFUyk6IE5ldyB2YXI6IGxpc3Qgb2YgZmlsZXMgdG8gYmUgZWRpdGVkLgotCShESVNUU1RVRkZESVJTKTogQWRkIGJpbnV0aWxzLgotCi1GcmkgT2N0IDIyIDIwOjMyOjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWxzbyBoYW5kbGUgbWlwc2VsIGFuZCBtaXBzNjRlbCAoZm9yIGxpdHRsZSBlbmRpYW4gbWlwcykKLQotRnJpIE9jdCAyMiAwNzo1OToyMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UaHUgT2N0IDIxIDExOjM4OjI4IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBuZXdsaWIgZm9yIEx5bnhPUyBuYXRpdmUuCi0KLVdlZCBPY3QgMjAgMDk6NTY6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIHN1cHBvcnQgZm9yIGRlbHRhIDg4ayBydW5uaW5nIFNWUjMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnQgYWJvdXQgSFAgY29tcGlsZXIgdnMuIGVtYWNzLgotCi1UdWUgT2N0IDE5IDE2OjAyOjIyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCBidWlsZCBsZCBvbiBzb2xhcmlzMiAobm90IGEgdmlhYmxlIG9wdGlvbgotCSAgZHVlIHRvIGJ1Z3MgaW4gZ2V0cHduYW0gJiBnZXRwd3VpZCkKLQotVHVlIE9jdCAxOSAxNToxMzo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IGFscGhhLWRlYy1vc2YxKiwgbm90IGp1c3QgLW9zZjEsIHNpbmNlCi0JY29uZmlnLmd1ZXNzIHdpbGwgcHJvZHVjZSBhIGZ1bGwgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBPY3QgMTkgMTU6NTg6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGxpbmtlciBhbmQgYmludXRpbHMgZm9yIGFscGhhLWRlYy1vc2YxLgotCi1UdWUgT2N0IDE5IDExOjQxOjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIC1PIGZyb20gQ1hYRkxBR1MgZm9yIGNvbnNpc3RlbmN5IHdpdGggQ0ZMQUdTLAotCWFuZCBnZGIvdGVzdHN1aXRlL01ha2VmaWxlLmluLgotCi1TYXQgT2N0ICA5IDE4OjM5OjA3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbWlwcyotIGluc3RlYWQgb2YgbWlwcy0KLQotRnJpIE9jdCAgOCAxNDoxNTozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IGxpbnV4KmNvZmYgYW5kIGxpbnV4KmVsZiBhcyBvcGVyYXRpbmcKLQlzeXN0ZW1zLgotCi1UaHUgT2N0ICA3IDEyOjU3OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIG1pcHM2NCwgYW5kIG1pcHMzIGFzIGFuIGFsaWFzIGZvciBpdC4KLQotV2VkIE9jdCAgNiAxMzo1NDoyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGFscGhhLWRlYy1vc2YqLCBubyBsb25nZXIgbmVjZXNzYXJ5IG5vdyB0aGF0Ci0JZ2RiIGtub3dzIGhvdyB0byBoYW5kbGUgT1NGLzEgc2hhcmVkIGxpYnJhcmllcy4KLQotVHVlIE9jdCAgNSAxMTo1NTowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaHBwYSotKi1oaXV4KiAoY3VycmVudGx5IHN5bm9ueW0gZm9yIGhwdXgpLgotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSGl0YWNoaSdzIEhJVVguCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgaDMwNTByKiBhbmQgaHBwYWhpdGFjaGkuCi0JUmVtb3ZlIHJlZHVuZGFudCBjYXNlcyBmb3IgaHA5a1syM10qLgotCi1Nb24gT2N0ICA0IDE2OjE1OjA5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkZWZhdWx0IHRvICctLXdpdGgtZ251LWFzJyBhbmQgJy0td2l0aC1nbnUtbGQnCi0JaWYgZ2FzIGFuZCBsZCBhcmUgaW4gdGhlIHNvdXJjZSB0cmVlIGFuZCBhcmUgaW4gJHtjb25maWdkaXJzfS4KLQlJZiAke3VzZV9nbnVfYXN9IG9yICR7dXNlX2dudV9sZH0gYXJlICdubycsIHRoZW4gZG9uJ3Qgc2V0IHRoZQotCXRoZSAtLXdpdGggb3B0aW9ucyAoYnV0IHN0aWxsIHBhc3MgdGhlbSBkb3duIG9uIHRoZSBjb21tYW5kIGxpbmUsCi0JaWYgdGhleSB3ZXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkKS4KLQotRnJpIFNlcCAyNCAxOToxMToxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogc3Vic3RpdHV0ZSBTSEVMTCB2YWx1ZSBpbiBNYWtlZmlsZS5pbiB3aXRoCi0JJHtDT05GSUdfU0hFTEx9Ci0KLVRodSBTZXAgMjMgMTg6MDU6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGdhcywgbGQsIGFuZCBiaW51dGlscyBmb3IgKi0qLXN5c3Y0KiBhbmQKLQkqLSotc29sYXJpczIqIHRhcmdldHMuCi0KLVN1biBTZXAgMTkgMTc6MDE6NDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIE00LCBhbmQgcGFzcyBpdCBkb3duIHRvIHN1Yi1tYWtlczsKLQlhbGwtYXV0b2NvbmYgbm93IGRlcGVuZHMgb24gYWxsLW00Ci0KLVNhdCBTZXAgMTggMDA6Mzg6MjMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoe0FSLFJBTkxJQn1fRk9SX1RBUkdFVCk6IG1ha2UgY29udGluZ2VudCBvbgotCXByZXNlbmNlIG9mIHthcixyYW5saWJ9IGluc3RlYWQgb2YgYSBjb25maWd1cmVkIGRpcmVjdG9yeQotCi1XZWQgU2VwIDE1IDA4OjQxOjQ0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBBY2NlcHQgMzQ/PyBhcyB3ZWxsIGFzIDMzPz8gZm9yIE5DUi4KLQotTW9uIFNlcCAxMyAxMjoyODo0MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZ3JhYiBtdC1ocHBhIGZvciBIUFBBIHRhcmdldHM7IHVzZSAnZ2FzICcgaW5zdGVhZAotCW9mICdnYXMnIGluIHNlZCBjb21tYW5kcywgc2luY2UgJ2dhc2gnIGlzIG5vdyBpbiB0aGUgdHJlZSBhcyB3ZWxsLgotCi1GcmkgU2VwIDEwIDExOjIzOjUyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBncmFiIHZhbHVlcyBmb3IgJChDQykgYW5kICQoQ1hYKSBmcm9tIHRoZQotCWVudmlyb25tZW50LCBzbyB0aGF0IHNvbWVvbmUgY2FuIGRvICJDQz1nY2MgY29uZmlndXJlOyBtYWtlIiBhbmQKLQloYXZlIGl0IHdvcmsgcmlnaHQgKG1hdGNoaW5nIHRoZSB3YXkgdGhhdCBhdXRvY29uZiB3b3JrcyBub3cpCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGFkZCBzdXBwb3J0IGZvciBnYXNoLCB0aGUgdGNsCi0JaW50ZXJmYWNlIHRvIEdhbGF4eQotCi0JKiBjb25maWcuZ3Vlc3M6IGFkZCBOZXRCU0QgdmFyaWFudHMgKGhwMzAwLCB4ODYpCi0KLVRodSBTZXAgIDkgMTY6NDg6NTIgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IFN1cHBvcnQgLWQgb3B0aW9uIChpbiB0aGUgbWFubmVyIG9mIFN1bk9TIDQgaW5zdGFsbCwKLQlhcyBpdCBpcyBtb3JlIGRldGVybWluaXN0aWMgdGhhbiB0aGF0IG9mIEdOVSBpbnN0YWxsKQotCShjaG1vZGNtZCk6IFNldCBmaWxlIHRvIG1vZGUgNzU1IGJ5IGRlZmF1bHQgKHNob3VsZCBhbHNvIGRvIGRlZmF1bHQKLQljaGdycCBhbmQgY2hvd24sIGJ1dCBJIGRvbid0IGZlZWwgbGlrZSBkZWFsaW5nIHdpdGggdGhhdCBub3cpCi0KLVR1ZSBTZXAgIDcgMTE6NTk6MzkgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVtb3ZlIGg4MzAwaGhtcyBhbGlhcy4KLQotVHVlIEF1ZyAzMSAxMTowMDowOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNYXRjaCAqLSotc29sYXJpczIqIG5vdCAqLXN1bi1zb2xhcmlzMiouCi0KLU1vbiBBdWcgMzAgMTg6Mjk6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiB0b3VjaCBzdG1wLWZpeHByb3RvIGFzIHdlbGwKLQlhcyBzdG1wLWZpeGluYwotCi1XZWQgQXVnIDI1IDE2OjM1OjU5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVjb2duaXplIG04ODExMC1idWctY29mZi4KLQotVHVlIEF1ZyAyNCAxMDoyMzoyNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtbGliaW8pOiBhbGwgZGVwZW5kZW5jaWVzIG9uIHRoZSB0b29sY2hhaW4gdXNlZAotCXRvIGJ1aWxkIHRoaXMgKGdjYywgZ2FzLCBsZCwgZXRjKQotCi1GcmkgQXVnIDIwIDE3OjI0OjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IERlYWwgd2l0aCBPU0YvMSAxLjMgb24gYWxwaGEuCi0KLVRodSBBdWcgMTkgMTE6NDM6MDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBhZGQgc29tZSAnZWxzZSB0cnVlJyBjbGF1c2VzIGZvciBwb3J0YWJpbGl0eQotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGJ1aWxkIGxpYmlvIGZvciBoOFszNV0wMC0qLSogdGFyZ2V0cwotCi1UdWUgQXVnIDE3IDE5OjAyOjMxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBzdXBwb3J0IGZvciBuZXcgbGliaW8uCi0KLVN1biBBdWcgMTUgMjA6NDg6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IElmIG9uZSBjb21tYW5kIGZhaWxzLCBkb24ndCB0cnkgdGhlIHJlc3QuICBEb24ndCB0cnkKLQl0byByZW1vdmUgJGRzdHRtcCAodmlhIHRyYXApIHVubGVzcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBpdC4KLQlJZiAkc3JjIGRvZXNuJ3QgZXhpc3QsIGRldGVjdCBpdCBhbmQgZXhpdCB3aXRoIGFuIGVycm9yLgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBCU0Qgb24gaHAzMDAuCi0KLVdlZCBBdWcgMTEgMTg6MzU6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIE1hcCAoOTAwMC9bMzRdPz86SFAtVVg6KjoqKSB0byBtNjhrLWhwLWhwdXguCi0JQnVnIHJlcG9ydCBmcm9tICJIYW1pc2ggKEguSS4pIE1hY2RvbmFsZCIgPGhhbWlzaEBibnIuY2E+LgotCi1XZWQgQXVnIDExIDE1OjM3OjUxIDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXNlbmQtcHIpOiBkZXBlbmRzIG9uIGFsbC1wcm1zCi0KLVdlZCBBdWcgMTEgMTY6NTY6MDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRml4IHR5cG8gKDkwMDAvOD8/OjQuM2JzZCAtPiA5MDAwLzc/Pzo0LjNic2QpLgotCi1GcmkgQXVnICA2IDE0OjQ1OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBGcm9tIG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2EgKE1pY2hhZWwgUmVuZGVsbCk6Ci0JQWRkZWQgdGVzdCBmb3IgbWlwcy1taXBzLXJpc2NvczUuCi0KLVRodSBBdWcgIDUgMTU6NDU6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBtaC1ocDMwMCBmb3IgNjhrIEhQIGhvc3RzCi0KLU1vbiBBdWcgIDIgMTE6NTY6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZCBzdXBwb3J0IGZvciBDT05GSUdfU0hFTEwsIHNvIHRoYXQgeW91IGNhbiB1c2UKLQlzb21lIGFsdGVybmF0ZSBzaGVsbCBmb3IgZXZhbHVhdGluZyBjb25maWd1cmUgc2NyaXB0cwotCi1TdW4gQXVnICAxIDExOjM2OjI3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLmd6KTogIFNlZCBidWcgcmVwb3J0aW5nIGFkZHJlc3MKLQlpbiBjb25maWd1cmUgc2NyaXB0IHRvIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1IHdoZW4gYnVpbGRpbmcKLQlkaXN0cmlidXRpb24gYXJjaGl2ZS4KLQkqIE1ha2VmaWxlLmluIChDT01QUkVTUyk6ICBSZW1vdmUgZGVmLgotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuZ3osIG1ha2UtZ2RiLnRhci5neik6ICBSZW5hbWVkIGZyb20KLQlnZGIudGFyLlogYW5kIG1ha2UtZ2RiLnRhci5aIHJlc3BlY3RpdmVseS4KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuZ3opOiAgTm93IG9ubHkgYnVpbGQgZ3ppcCdkIGFyY2hpdmUuCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLmd6KTogIE1pbm9yIGNoYW5nZXMgdG8gbW92ZSBjbG9zZXIKLQl0byBjb252ZXJnZW5jZSB3aXRoICd0YXonIHRhcmdldCBpbiBNYWtlZmlsZS5pbi4KLQotRnJpIEp1bCAzMCAxMjozNDo1NyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2ggKGRzdHRtcCk6IHVzZSB0cmFwIHRvIGVuc3VyZSB0aGF0IHRtcCBmaWxlcyBnbwotCWF3YXkgb24gZXJyb3IgY29uZGl0aW9ucwotCi1XZWQgSnVsIDI4IDExOjU3OjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IHJlbW92ZSBMT0FETElCRVMKLQotVHVlIEp1bCAyNyAxMjo0Mzo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGlycyk6IERlYWwgd2l0aCBhIHByZWZpeCBsaWtlIC9nbnU7Ci0JaXRzIHBhcmVudCBpcyAnLycgbm90ICcnLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGNvbW1lbnRzIGFib3V0IENoYW5nZUxvZy4KLQotRnJpIEp1bCAyMyAwOTo1MzozNyAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25Ad2FoaW5pLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogaWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZSBkb2Vzbid0IGV4aXN0LCBkb24ndCBhc3N1bWUKLQl0aGF0ICR7bmV3c3JjZGlyfS9jb25maWd1cmUuaW4gZG9lcy4KLQotVHVlIEp1bCAyMCAxMToyODo1MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHN1cHBvcnQgZm9yIENPTkZJR19TSEVMTAotCi1Nb24gSnVsIDE5IDIxOjU0OjQ2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChuZXR3YXJlKTogIEFkZCBhcyBhIGJhc2ljIHN5c3RlbSB0eXBlLgotCi1XZWQgSnVsIDE0IDEyOjAzOjExIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogZGVwZW5kIG9uIGNvbmZpZ3VyZS5pbi4gIEFsc28gZHJvcCB0aGUKLQkgICQoc3JjZGlyKS8gZnJvbSB0aGUgZGVwZW5kZW5jeSBvbiBNYWtlZmlsZS5pbi4KLQotVHVlIEp1bCAxMyAyMDoxMDo1OCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgaDgzMDBoaG1zIGFzIGg4MzAwaC1oaXRhY2hpLWhtcy4KLQkoaDgzMDBoaG1zIGlzIHRlbXBvcmFyeSB1bnRpbCBtdWx0aS1saWJyYXJpZXMgYXJlIGltcGxlbWVudGVkKS4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGg4MzAwaCB0b28uCi0KLVN1biBKdWwgMTEgMTc6MzU6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGRweC8yIGFzIG02OGstYnVsbC1zeXN2My4KLQotVGh1IEp1bCAgOCAxODoyNjoxMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgUmVtb3ZlIGV4dHJhbmVvdXMgb3V0cHV0IHdoZW4gZ3Vlc3NpbmcgaG9zdCB0eXBlLgotCSogY29uZmlnLmd1ZXNzOiAgUmVtb3ZlIGV4dHJhbmVvdXMgb3V0cHV0IHdoZW4gZ3Vlc3NpbmcgdXNpbmcgQwotCWNvbXBpbGVyIHJhdGhlciB0aGFuIHVuYW1lLCBvciB3aGVuIGd1ZXNzaW5nIGZhaWxzLgotCi1XZWQgSnVsICA3IDE3OjU4OjE0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBhbGwuY3Jvc3MgYW5kIGluc3RhbGwuY3Jvc3MgdGFyZ2V0cwotCi0JKiBjb25maWd1cmU6IHJlbW92ZSBDUk9TUz0tRENST1NTX0NPTVBJTEUgYW5kIEFMTD1hbGwuY3Jvc3MKLQkgIGRlZmluaXRpb25zCi0KLVR1ZSBKdWwgIDYgMTA6Mzk6NDQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXQgc2gpOiBCdWlsZCBncHJvZi4KLQotVGh1IEp1bCAgMSAxNjo1Mjo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGNoYW5nZSAtc29sYXJpcyB0byAtc29sYXJpczIKLQotVGh1IEp1bCAgMSAxNTo0NjoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgY29uZmlnL21oLXJpc2NvcyBmb3IgbWlwcy0qLXN5c3YqLgotCi1XZWQgSnVuIDMwIDA5OjMxOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDb3JyZWN0IGVycm9yIG1lc3NhZ2UgZm9yIG1pc3NpbmcgTWFrZWZpbGUuaW4gdG8KLQlwcmludCBjb3JyZWN0IGRpcmVjdG9yeS4KLQotVHVlIEp1biAyOSAxMzo1MjoxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IGtsdWRnZSBhcm91bmQgMzg2QlNEIHNoZWxsIGJ1ZwotCi1UdWUgSnVuIDI5IDEzOjA2OjQ5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIE5lWFQuCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaTQ4Ni1uY3Itc3lzdjQuCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIHJtICQoVE9PTCktJCRWRVIgYmVmb3JlIGxpbmtpbmcuCi0KLVR1ZSBKdW4gMjkgMTI6NTA6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRUlORk9GTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgTUFLRUlORk8gYXMgTUFLRUlORk8gTUFLRUlORk9GTEFHUy4KLQkqIGJ1aWxkLWFsbC5taywgdGVzdC1idWlsZC5tazogUGFzcyBkb3duIC0tbm8tc3BsaXQgYXMKLQlNQUtFSU5GT0ZMQUdTIHdoZW4gaG9zdGVkIG9uIERPUy4gIENvbXBpbGUgRE9TIGhvc3RlZCB3aXRob3V0IC1nLgotCi1UaHUgSnVuIDI0IDEzOjM5OjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6ICBBZGQgQ09QWUlORyBDT1BZSU5HLkxJQiBpbnN0YWxsLnNoLgotCi1XZWQgSnVuIDIzIDEyOjU5OjIxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxpYmcrKy50YXIueik6ICBOZXcgcnVsZS4KLQkqIE1ha2VmaWxlLmluICh0YXopOiAgUmVwbGFjZSAnY29uZmlndXJlIC1ybScgYnkgJ21ha2UgZGlzdGNsZWFuJy4KLQkqIE1ha2VmaWxlLmluICh0YXopOiAgT25seSBkbyBhIHNpbmdsZSBjaG1vZC4KLQotRnJpIEp1biAxOCAxMjowMzoxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgbWFqaXBvb3IuY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogZG9uJ3QgdXNlIGRpcm5hbWUgYW55bW9yZSAocmVwbGFjZWQgd2l0aCBzZWQgdXNhZ2UpCi0KLVRodSBKdW4gMTcgMTg6NDM6NDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGV4dGVuc2lvbiBmb3IgZ3ppcCdkIGZpbGVzIGZyb20gJy56JyB0bwotCScuZ3onIHBlciBuZXcgRlNGIHN0YW5kYXJkIHVzYWdlLgotCi1UaHUgSnVuIDE3IDE2OjU4OjUwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBtYWppcG9vci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBmaW5hbCB2YWx1ZSBvZiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0KLVR1ZSBKdW4gMTUgMTY6NDg6NTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IGluc3RhbGwuc2ggc3VwcG9ydDsgdXBkYXRlIGluc3RhbGwtaW5mbyBydWxlcwotCi1XZWQgSnVuICA5IDEyOjMxOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBkaWZmIGZvciBjcm9zc2VzLCBidXQgbm90IGZvciBnbzMyIGhvc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZ3Byb2Ygb25seSBmb3IgbmF0aXZlLCBhbmQgZG9uJ3QgYnVpbGQgaXQKLQlmb3IgbWlwcy0qLSosIHJzNjAwMC0qLSosIG9yIGlbMzRdODYtKi1zY28qLgotCi1Nb24gSnVuICA3IDEzOjEyOjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGJ1aWxkIGdhcyxsZCxiaW51dGlscyBvbiBmb3IgKi0qLXN5c3Y0Ci0KLU1vbiBKdW4gIDcgMTE6NDA6MTEgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGQgcHJtcy4KLQotRnJpIEp1biAgNCAxMzozMDo0MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIGdjYywgZG8gaW5zdGFsbGF0aW9uIG9mICQoSU5TVEFMTF9NT0RVTEVTKQotCXdpdGggJChGTEFHU19UT19QQVNTKSBvbiB0aGUgY29tbWFuZCBsaW5lCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBseW54IGFuZCBseW54b3MKLQotRnJpIEp1biAgNCAxMDo1OTo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtZWNvZmYqLCBub3QganVzdCAtZWNvZmYuCi0KLVRodSBKdW4gIDMgMTc6Mzg6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogVXNlIC5neiBzdWZmaXggaW5zdGVhZCBvZiAuei4KLQkoYmludXRpbHMudGFyLmd6LCBnYXMrYmludXRpbHMudGFyLmd6LCBnYXMudGFyLmd6KTogRml4ZWQgdGFyZ2V0Ci0JbmFtZXMuCi0KLVRodSBKdW4gIDMgMDA6Mjc6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodmF1bHQtaW5zdGFsbCk6IGFkZCBhbiAnZWxzZSB0cnVlJyAoZm9yIFVsdHJpeCkKLQotV2VkIEp1biAgMiAxODoxOToxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMpOiAgaW5zdGFsbCBnY2MgbGFzdCwgc28KLQl0aGF0IHJlYnVpbGRzIHRoYXQgbWlnaHQgaGFwcGVuIGR1cmluZyAnbWFrZSBpbnN0YWxsJyBkb24ndCBnZXQKLQlib2d1cyBnY2MgaW5jbHVkZSBmaWxlcwotCi1XZWQgSnVuICAyIDE2OjE0OjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUNoYW5nZSBmcm9tIFV0YWggZm9yIEhQUEEgc3VwcG9ydDoKLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGhwcGExLngtaHAtYnNkLgotCi1XZWQgSnVuICAyIDExOjUzOjMzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgQWRkIHN1cHBvcnQgZm9yIE1vdG9yb2xhIERlbHRhIDY4aywgdXAgdG8gcjN2Ny4KLQlQYXRjaCBmcm9tIHBvdEBmbHkuY251Y2UuY25yLml0IChGcmFuY2VzY28gUG90b3J0aWApLgotCi1UdWUgSnVuICAxIDE3OjQ4OjQyIDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIHJvbTY4ayBhbmQgYnVnIGJvb3QgbW9uaXRvcnMuCi0KLU1vbiBNYXkgMzEgMDk6MzY6MzcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlIGFsbC1vcGNvZGVzIGRlcGVuZCBvbiBhbGwtYmZkLgotCi1UaHUgTWF5IDI3IDA4OjA1OjMxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGRlZCBzcGVjaWFsIGNoZWNrIGZvciBpWzM0XTg2LXVuaXZlbC1zeXN2NCouCi0KLVdlZCBNYXkgMjYgMTY6MzM6NDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEZvciBpWzM0XTg2LXVua25vd24tc3lzdjQgdXNlIFVOQU1FX01BQ0hJTkUgZm9yCi0JdGhlIHByb2Nlc3NvciByYXRoZXIgdGhhbiBhc3N1bWluZyBpNDg2LgotCi1XZWQgTWF5IDI2IDA5OjQwOjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBTdW5PUzYgYXMgU29sYXJpczMuCi0KLVR1ZSBNYXkgMjUgMjM6MDM6MTEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEZpeCB0eXBvLiAgQXZvaWQgI2VsaWYgKG5vdCBpbiBLJlIgMSkuCi0JUmVjb2duaXplIFN1bk9TIDUuKiBvbmx5IChhbmQgbm90IFs2LTldLiopIGFzIGJlaW5nIFNvbGFyaXMyLgotCi1UdWUgTWF5IDI1IDEyOjQ0OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rIChhbGwtY3Jvc3MpOiBOZXcgdGFyZ2V0IGZvciBDYW5hZGlhbiBDcm9zcy4KLQlBZGRlZCBRMiBnbzMyIHRhcmdldHMuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBDb25maWd1cmUgZ28zMiBjcm9zcyBzcGFyY2xpdGUtYW91dCBhbmQKLQltaXBzLWlkdC1lY29mZiAtd2l0aC1nbnUtbGQuICBNb3ZlZCBidWlsZCBiaW5hcnkgZGlyZWN0b3J5IGZyb20KLQlQQVJUSUFMX0hPTEVfRElSUyB0byBCVUlMRF9IT0xFU19ESVJTLgotCi1Nb24gTWF5IDI0IDE1OjMwOjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBmaXggQWxwaGEgR0RCIHR5cG87IGFsc28sIGRvbid0IGJ1aWxkIERlamFHbnUgZm9yCi0JR08zMiBob3N0ZWQgdG9vbGNoYWlucwotCi1Nb24gTWF5IDI0IDE0OjE4OjQxIDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBjaGFuZ2UgIHNvICItZXhlYy1wcmVmaXgiIGdldHMgcGFzc2VkIGRvd24gcmF0aGVyCi0JdGhhbiAiLWV4ZWNfcHJlZml4IiBzbyBhdXRvY29uZiBnZW5lcmF0ZWQgTWFrZWZpbGVzIGdldCB0aGUKLQlleGVjX3ByZWZpeCBzZXQgcmlnaHQuCi0KLUZyaSBNYXkgMjEgMTA6NDI6MjUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGdldCB0aGUgU29sYXJpczIgbWlub3IgdmVyc2lvbiBudW1iZXIKLQotCSogTWFrZWZpbGUuaW46IGFkZCBzdGFuZGFyZHMudGV4aSBhbmQgbWFrZS1zdGRzLnRleGkgdG8gRVRDX1NVUFBPUlQKLQotRnJpIE1heSAyMSAwNjoyMDo1MiAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIHNvbWUgU2VxdWVudCBwbGF0Zm9ybXMuCi0KLVRodSBNYXkgMjAgMTQ6MzM6NDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdGhlIHZhdWx0LWluc3RhbGwgdGFyZ2V0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWN0dWFsbHkgdXNlIHRoZSBTdW4zIG1ha2VmaWxlIGZyYWdtZW50IHRoYXQncyBpbgotCWNvbmZpZywgYWxzbyBhZGRlZCB0aGUgcmVsZWFzZSBkaXIgdG8gY29uZmlnZGlycwotCi1UaHUgTWF5IDIwIDE0OjE5OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEZpeCBtb2RlcyBvbiBzdHVmZiBpbiAkKFRPT0wpIGRpciBhbHNvLgotCi1UdWUgTWF5IDE4IDIwOjI2OjQxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgc29tZSBwcm9ncmFtIGZyb20gQWxwaGEgdGFyZ2V0dGVkIHRvb2xjaGFpbnMKLQotVHVlIE1heSAxOCAxNToyMzoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRkRJUlMpOiBSZW5hbWVkIGZyb20gUFJPVE9ESVJTLiAgQWRkIGxkIGFuZAotCWdwcm9mLgotCSh0YXopOiBSdW4gIm1ha2UgZGlzdHN0dWZmIiBpbiB0aG9zZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mICJtYWtlCi0JcHJvdG8tZGlyIi4gIExvb2sgZm9yICJWRVJTSU9OPSIgb25seSBhdCBzdGFydCBvZiBsaW5lIGluIHN1YmRpcgotCU1ha2VmaWxlLiAgVXNlICJnemlwIC05IiBmb3IgY29tcHJlc3Npb24uCi0JKFRFWElORk9fU1VQUE9SVCwgRElTVF9TVVBQT1JULCBCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBOZXcgdmFycy4KLQkoYmludXRpbHMudGFyLnopOiBOZXcgdGFyZ2V0LgotCi1Nb24gTWF5IDE3IDE3OjAxOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogSW5jbHVkZSBncGwudGV4aW5mby4KLQotRnJpIE1heSAxNCAwNjo0ODozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMpOiBNZXJnZWQgaW50byAidGF6IiB0YXJnZXQuCi0JKHRheik6IE9ubHkgZG8gYHByb3RvLWRpcicgc3R1ZmYgaWYgYSBkaXJlY3RvcnkgaXMgYWN0dWFsbHkgbmVlZGVkCi0JZm9yIHRoaXMgdGFyZ2V0LgotCi1XZWQgTWF5IDEyIDEzOjA5OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1VTkNIX05NKTogTmV3IHZhcmlhYmxlLCBkZWZpbmVkIHRvIGJlICQoTk0pLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIE1VTkNIX05NLgotCShIT1NUX0NDLCBIT1NUX1BSRUZJWCwgSE9TVF9QUkVGSVhfMSk6IE5ldyB2YXJpYWJsZXMuCi0JKEVYVFJBX0dDQ19GTEFHUyk6IFBhc3MgZG93biBIT1NUXyogdmFyaWFibGVzLgotCShnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IENvcnJlY3QgZm9yIGN1cnJlbnQgZ2NjIE1ha2VmaWxlLgotCi1UdWUgTWF5IDExIDEwOjE0OjI1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgQWRkIGNvbmZpZ3VyZSwgY29uZmlnLmd1ZXNzLAotCWNvbmZpZy5zdWIsIGFuZCBtb3ZlLWlmLWNoYW5nZSB0byBnZGIgdGVzdHN1aXRlIGRpc3RyaWJ1dGlvbgotCWFyY2hpdmUsIHNvIHRoZSB0ZXN0c3VpdGUgY2FuIGJlIGV4dHJhY3RlZCwgY29uZmlndXJlZCwgYW5kCi0JcnVuIHNlcGFyYXRlbHkgZnJvbSB0aGUgZ2RiIGRpc3RyaWJ1dGlvbi4gIEJsb3cgYXdheSB0aGUgQ2hpbGwKLQl0ZXN0cyB0aGF0IHJlcXVpcmUgYSBDaGlsbCBjb21waWxlZCBleGVjdXRhYmxlLCBzaW5jZSBHTlUgQ2hpbGwKLQlpcyBub3QgeWV0IHB1YmxpY2FsbHkgYXZhaWxhYmxlLgotCi1Nb24gTWF5IDEwIDE3OjIyOjI2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHNpbmdsZSBjb21tYW5kLAotCWluc3RlYWQgb2YgYSBsaXN0IG9mIGFzc2lnbm1lbnRzIGFuZCBleHBvcnRzCi0KLQkqIGNvbmZpZy5ndWVzczogcmVjb2duaXplIEFscGhhL09TRjEgc3lzdGVtcwotCi1Nb24gTWF5IDEwIDE0OjU1OjUxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDaGFuZ2UgaGVscCBtZXNzYWdlIHRvIHByZWZlciAtLW9wdGlvbnMgcmF0aGVyIHRoYW4KLQkgIC1vcHRpb25zLgotCi1Nb24gTWF5IDEwIDA1OjU4OjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBDb252ZXJnZW50IFRlY2guICJtaW5pZnJhbWUiIHVzZXMgbTY4MDEwLCBzZXoKLQl6aXBweUBlY3N0LmNzdWNoaWNvLmVkdS4KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG1pbmlmcmFtZS4KLQotU3VuIE1heSAgOSAxNzo0Nzo1NyAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLSAgICAgICAqIE1ha2VmaWxlLmluOiBVc2Ugc3Jjcm9vdCB0byBmaW5kIHJ1bnRlc3QgcmF0aGVyIHRoYW4gcm9vdG1lLgotICAgICAgIFBhc3MgUlVOVEVTVEZMQUdTIGFuZCBFWFBFQ1QgZG93biBpbiBCQVNFX0ZMQUdTX1RPX1BBU1MuCi0KLUZyaSBNYXkgIDcgMTQ6NTU6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIHN1cHBvcnQgYnVpbGRpbmcgb24gYQotCW1hY2hpbmUgb3RoZXIgdGhhbiB0aGUgaG9zdC4KLQotV2VkIE1heSAgNSAwODozNTowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh0b29sZGlyKTogRml4IGZvciBpMzg2LWFpeCBhZ2Fpbi4KLQotTW9uIE1heSAgMyAxOTowMDoyNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogIENoYW5nZSBkZWZpbml0aW9uIG9mICQodG9vbGRpcikKLQl0byBtYXRjaCB0aGUgRlNGLgotCi1GcmkgQXByIDMwIDE1OjU1OjIxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaVszNF04Ni9TVlI0LgotCi1GcmkgQXByIDMwIDE1OjUyOjQ2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdkYik6IGdkYiBkZXBlbmRzIG9uIHNpbS4KLQotVGh1IEFwciAyOSAyMzozMDo0OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuWik6ICBNYWtlIHByb3RvdHlwZSBnZGIgdGVzdHN1aXRlIGRpcmVjdG9yeQotCWF0IHRoZSBzYW1lIHRpbWUgd2UgbWFrZSB0aGUgcHJvdG90eXBlIGdkYiBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgTWFrZSB0aGUgdGVzdHN1aXRlIGRpc3RyaWJ1dGlvbgotCWZpbGVzIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGdkYiBiYXNlIHJlbGVhc2UgZGlzdHJpYnV0aW9uLgotCi1UaHUgQXByIDI5IDEyOjUwOjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogVXNlIGluZGl2aWR1YWwgY2hlY2sgdGFyZ2V0cyByYXRoZXIgdGhhbgotCURPX1ggcnVsZS4KLQkoY2hlY2stZ2NjKTogQWRkZWQuCi0KLVRodSBBcHIgMjkgMDk6NTA6MDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFVzZSBzeXN2My4yIG5vdCBzeXN2MzIgZm9yIGNhbm9uaWNhbCBPUwotCWZvciBTeXN0ZW0gViByZWxlYXNlIDMuMi4KLQotVGh1IEFwciAyOSAxMDozMzoyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBocHBhb3NmLgotCSogY29uZmlndXJlLmluOiBEbyBjb25maWd1cmUgbGQvYmludXRpbHMvZ2FzIGZvciBpdC4KLQotVHVlIEFwciAyNyAwNjoyNTozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh0b29sZGlyKTogQWx0ZXIgc3ludGF4IHVzZWQgdG8gc2V0IHRoaXMsIGZvciBzeXN0ZW1zCi0Jd2hlcmUgIlwkIiBpc24ndCBoYW5kbGVkIHJpZ2h0LCBsaWtlIGkzODYtYWl4LgotCi1UaHUgQXByIDIyIDA4OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBQYXNzIHByb2dyYW0tdHJhbnNmb3JtLW5hbWUsIG5vdAotCXByb2dyYW1fdHJhbnNmb3JtX25hbWUsIHRvIHJlY3Vyc2l2ZSBjb25maWd1cmVzLgotCi1UaHUgQXByIDIyIDAyOjU4OjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2FzK2JpbnV0aWxzLnRhci56KTogTmV3IHJ1bGUgZm9yIGJ1aWxkaW5nIHNuYXBzaG90cwotCW9mIGdhcytsZCtiaW51dGlscy4KLQotTW9uIEFwciAxOSAxNzo0MTozMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIEFJWDMuMiBhcyBkaXN0aW5jdCBmcm9tIDMuMS4KLQotU2F0IEFwciAxNyAxNzoxOTo1MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVuYW1lIG04OGstbW90b3JvbGEtbTg4a2JjcyB0byBtODhrLW1vdG9yb2xhLXN5c3YKLQotCSogY29uZmlnL21oLWRlbHRhODg6IHJlbW92ZSBleHRyYW5lb3VzIEdDQyByZWZlcmVuY2VzCi0KLVR1ZSBBcHIgMTMgMTY6NTI6MTYgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUFJNUyk6IFNldCBiYWNrIHRvIGFsbC1wcm1zLgotCi1TYXQgQXByIDEwIDEyOjA0OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogUGFzcyAtd2l0aC1nbnUtYXMgZm9yIGtub3duIE1JUFMgbmF0aXZlIGFuZCBNSVBTCi0JdGFyZ2V0cywgcmF0aGVyIHRoYW4gZm9yIE1JUFMgaG9zdHMuCi0KLUZyaSBBcHIgIDkgMTM6NTE6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBjb21tZW50IGZvciAtLXdpdGgteCBkZWZhdWx0IHZhbHVlcwotCi0JKiBjb25maWcuZ3Vlc3M6IGhhbmRsZSBNb3Rvcm9sYSBEZWx0YTg4IGJveCBmb3IgU1ZSMyBhbmQgU1ZSNC4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBjaGVjay0qIHRhcmdldHMgZm9yIGVhY2ggb2YgdGhlIGRpcmVjdG9yaWVzIGluCi0JdGhlIHRyZWUuICBBZGQgYSBkZWZpbml0aW9uIG9mIFJVTlRFU1QgdGhhdCB3aWxsIHVzZSB0aGUgb25lIHdlCi0JanVzdCBidWlsdCwgaWYgaXQgZXhpc3RzLiAgUGFzcyB0aGlzIGRvd24gdmlhIEZMQUdTX1RPX1BBU1MuCi0KLVRodSBBcHIgIDggMDk6MjE6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZWQgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBiZmRfdGFyZ2V0IGFuZAotCXRhcmdldF9tYWtlZmlsZV9mcmFnLgotCi0JKiBidWlsZC1hbGwubWs6IFNldCBhc3NvcnRlZCB0YXJnZXRzIGZvciBRMi4KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSB6OGstc2ltIGFuZCBoODMwMC1obXMuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBSZWFsbHkgZG9uJ3QgcGFzcyBob3N0IHRvIGNvbmZpZ3VyZS4KLQkoSE9MRVMpOiBBZGRlZCB1bmFtZS4KLQotV2VkIEFwciAgNyAxNTo0ODoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIGFuIGVtcHR5IHByb2dyYW0tcHJlZml4LCBwcm9ncmFtLXN1ZmZpeCBvcgotCXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgY29ycmVjdGx5LgotCi1UdWUgQXByICA2IDEzOjQ4OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiAtRyA4IG5vIGxvbmdlciByZXF1aXJlZCBmb3IgTUlQUyB0YXJnZXRzLgotCSogdGVzdC1idWlsZC5tazogRG9uJ3QgcGFzcyBob3N0IGFyZ3VtZW50IHRvIGNvbmZpZ3VyZTsgbWFrZSBpdAotCWd1ZXNzLgotCi1UdWUgQXByICA2IDEwOjM2OjUzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5aKTogIEZpeCBmb3IgYnVpbGRpbmcgZ3ppcCdkIGRpc3RyaWJ1dGlvbi4KLQkqIE1ha2VmaWxlLmluIChDT01QUkVTUyk6ICBOZXcgbWFjcm8sIGxpa2UgR1pJUC4KLQotRnJpIEFwciAgMiAwOTowMjozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IFVzZSAtd2l0aC1nbnUtYXMgZm9yIG1pcHMtc2dpLWlyaXg0IGFzIHdlbGwuCi0KLQkqIGJ1aWxkLWFsbC5tazogU2V0IEdDQyB0byBnY2MgLU8gLUcgOCBmb3IgTUlQUyB0YXJnZXRzLCBzaW5jZSBnY2MKLQl3aXRoIGdhcyBjdXJyZW50bHkgZGVmYXVsdHMgdG8gLUcgMC4KLQotVGh1IEFwciAgMSAwODoyNTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZmxleCk6IGZsZXggZGVwZW5kcyBvbiBieWFjYy4KLQotCSogYnVpbGQtYWxsLm1rOiBJZiBob3N0IG5vdCBzcGVjaWZpZWQsIHVzZSBjb25maWcuZ3Vlc3MuICBQYXNzIFRBRwotCXRvIHRlc3QtYnVpbGQubWsgYXMgUkVMRUFTRV9UQUcuCi0JKiB0ZXN0LWJ1aWxkLm1rIChjb25maWdhcmdzKTogTmV3IHZhcmlhYmxlIGNvbnRhaW5pbmcgYXJndW1lbnRzIHRvCi0JcGFzcyB0byBjb25maWd1cmUuICBTZXQgdG8gLXdpdGgtZ251LWFzIG9uIG1pcHMtZGVjLXVsdHJpeC4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBSRUxFQVNFX1RBRy4KLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgL2Jpbi91bmFtZSB3aGVuIGNoZWNraW5nIC1YIGFyZ3VtZW50IG9uIFNDTywKLQl0byBhdm9pZCBpbnZva2luZyBHTlUgdW5hbWUgd2hpY2ggZG9lc24ndCB1bmRlcnN0YW5kIC1YLgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBEb24ndCB1c2UgL3Vzci91bnN1cHBvcnRlZC9iaW4vYXMgb24gQUlYLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGdhcyBmb3IgbWlwcy0qLSouCi0KLVdlZCBNYXIgMzEgMjE6MjA6NTggMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLm5vcm1hbCk6IGluc2VydCBtaXNzaW5nIGJhY2tzbGFzaC4KLQotV2VkIE1hciAzMSAxMjozMTo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5taywgY29uZmlnL21oLWlyaXg0OiBCdW1wIC1YTmggdmFsdWUgdG8gMTUwMCB0byBtYXRjaAotCWdjYyByZXF1aXJlbWVudHMuCi0KLQkqIE1ha2VmaWxlLmluOiBDb21wbGV0ZSBvdmVyaGF1bCB0byBtZXJnZSBtYW55IGFsbW9zdCBpZGVudGljYWwKLQl0YXJnZXRzLgotCi1UdWUgTWFyIDMwIDIwOjE3OjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMtZ2RiKTogUmVuYW1lZCBmcm9tIHNldHVwLWRpcnMuCi0JKGdkYi50YXIuWik6IEFkanVzdGVkLgotCi0JKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycywgdGF6KTogTmV3IHRhcmdldHM7IHNob3VsZCBiZSBnZW5lcmFsCi0JZW5vdWdoIHRvIGFkYXB0IGZvciBnZGIgc29tZXRpbWUuICBCdWlsZCBvbmx5IC56IGZpbGUuCi0JKGdhcy50YXIueik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBNYXIgMzAgMTA6MDM6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IFVzZSBDQz1jYyAtWHMgb24gU29sYXJpcy4KLQotTW9uIE1hciAyOSAxOTo1OToyNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zdW4zOiBjYyBuZWVkcyAtSiB0byBjb21waWxlIGNwLXBhcnNlLmMgY29ycmVjdGx5Ci0KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiBTdW5QUk8gQyBuZWVkcyAtWHMgdG8gYmUgYWJsZSB0byBnZXQgYQotCXdvcmtpbmcgeG1ha2VmaWxlIGZvciBFbWFjcy4KLQotVGh1IE1hciAyNSAxNToxNDozMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBJbmNvcnBvcmF0ZSBjaGFuZ2VzIHN1Z2dlc3RlZCBieSB3aWxzb25AY3lnbnVzLmNvbQotCWZvciBoYW5kbGluZyBCSVNPTiBmb3IgRlNGIHJlbGVhc2VzLgotCi1UaHUgTWFyIDI1IDA2OjE5OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFjdHVhbGx5IGltcGxlbWVudCB0aGUgY2hhbmdlIHpvbyBqdXN0IGRvY3VtZW50ZWQuCi0KLVdlZCBNYXIgMjQgMTM6MDI6NDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogd2hlbiB1c2luZyBjb25maWcuZ3Vlc3MsIG9ubHkgc2V0IHRhcmdldF9hbGlhcyB3aGVuCi0JaXQncyBub3QgYWxyZWFkeSBiZWVuIHNldCAoaWUsIG9uIHRoZSBjb21tYW5kIGxpbmUpCi0KLU1vbiBNYXIgMjIgMjM6MDc6MzkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayB0YXJnZXQsIHNldCBQUk1TIHRvIGluc3RhbGwtcHJtcwotCi1TdW4gTWFyIDIxIDE2OjQ2OjEyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGQgc3VwcG9ydCBmb3IgcGFja2FnZV9tYWtlZmlsZV9mcmFnbWVudCwgaGFuZGxlIHRoZQotCWNhc2Ugd2hlcmUgYSBkaXJlY3RvcnkgaGFzIGEgY29uZmlndXJlLmluIGZpbGUgYnV0IG5vIE1ha2VmaWxlLmluCi0JbW9yZSBncmFjZWZ1bGx5ICh3aXRoIGFuIGFjdHVhbCB1bmRlcnN0YW5kYWJsZSBlcnJvciBtZXNzYWdlLCBldmVuKTsKLQlhZGQgc3VwcG9ydCBmb3IgLS13aXRob3V0IChhbmQgYWRkIHRoaXMgdG8gdGhlIHVzYWdlIG1lc3NhZ2UpOyBhbHNvCi0JZXhwbGljaXRseSBhZGQgYSAtLWhvc3Q9JHtob3N0X2FsaWFzfSB0byB0aGUgY29tbWFuZCBsaW5lIHdoZW4KLQljb25maWcuZ3Vlc3MgaXMgdXNlZAotCi1TdW4gTWFyIDIxIDEyOjExOjU4IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBNdXN0IHVzZSBib3RoIC0taG9zdCBhbmQgLS10YXJnZXQgaW4gcmVjdXJzaXZlIGNhbGxzLgotCi1UaHUgTWFyIDE4IDEyOjMxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBkZWphLWdudSB0byBkZWphZ251LgotCi1Nb24gTWFyIDE1IDE1OjQ0OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChoODMwMC0qLSosIGg4NTAwLSotKik6IERvbid0IGJ1aWxkIGxpYmcrKy4KLQotRnJpIE1hciAxMiAxODozMDoxNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogY2Fub25pY2FsaXplIGFsbCBpbnN0YW5jZXMgdG8gKi0qLXNvbGFyaXMyKiwKLQlhbHNvIHN0cmlwIG91dCBhIG51bWJlciBvZiB0b29scyB0byBub3QgYnVpbGQgZm9yIGdvMzIgaG9zdAotCi1XZWQgTWFyIDEwIDEyOjA4OjI3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGQgR1BMLgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmd1ZXNzLCBjb25maWcuc3ViLCBjb25maWd1cmU6IGJ1bXAKLQkgIGNvcHlyaWdodHMgdG8gOTMuCi0KLVdlZCBNYXIgMTAgMDc6MTI6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZG8taW5mbyk6IFJlbW92ZWQgb2Jzb2xldGUgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZgotCWxvY2FsZW52IGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCi1XZWQgTWFyIDEwIDAzOjExOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGEgY291cGxlIG9mICdlbHNlIHRydWUnIGZvciBkZWNzdGF0aW9uLAotCXN1cHBvcnQgZm9yIFRjbFgKLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgdGNsWCB0b287IGRvbid0IHJlbW92ZSBUayBvbiBSUy82MDAwIGFueW1vcmUKLQotVHVlIE1hciAgOSAxNjowNjoxMiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMpOiBjaGFuZ2UgaW52b2NhdGlvbiBvZiBtYWtlIHRvICQoTUFLRSkuCi0KLU1vbiBNYXIgIDggMTQ6NTI6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaTM4Ni1pYm0tYWl4IChQUy8yKS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGNvbmZpZy9taC1haXgzODYgZmlsZSBmb3IgaXQuCi0KLU1vbiBNYXIgIDggMTE6MTI6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR0NDX0ZPUl9UQVJHRVQpOiBFbGltaW5hdGVkIGRlZmluaXRpb247IHVzZQotCUNDX0ZPUl9UQVJHRVQgaW5zdGVhZC4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBHQ0NfRk9SX1RBUkdFVD0kKENDX0ZPUl9UQVJHRVQpLgotCi1XZWQgTWFyICAzIDE2OjAwOjI4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQG9rLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc2ltIHRvIGxpc3Qgb2YgZGlyZWN0b3JpZXMgc2VudCB3aXRoIGdkYgotCi1XZWQgTWFyICAzIDExOjQyOjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFB1dCBiYWNrIG1pcHMtZGVjLWJzZCogY2FzZS4KLQotVHVlIE1hciAgMiAyMToxNTo1OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCShVbHRyaXggMi4yIHN1cHBvcnQgZnJvbSBNaWNoYWVsIFJlbmRlbGwgPG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2E+KQotCSogY29uZmlndXJlLmluICh2YXgtKi11bHRyaXgyKik6ICBBZGQgVWx0cml4IDIuMiB0cmlwbGV0LgotCSogY29uZmlnLmd1ZXNzOiAgQ2hhbmdlICdWQVgqOlVMVFJJWDoqOionIHRvICdWQVgqOlVMVFJJWCo6KjoqJy4KLQkqIGNvbmZpZy9taC12YXh1bHQyOiAgTmV3IGZpbGUuCi0KLVR1ZSBNYXIgIDIgMTg6MTE6MDMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBuby1vcCBtaXBzLWRlYy1ic2QqIGluICJjYXNlICR0YXJnZXQiCi0KLQkqIE1ha2VmaWxlLmluIChkaXIuaW5mbyk6IG9ubHkgcnVuIGdlbi1pbmZvLWRpciBpZiBpdCBleGlzdHMsCi0JKGluc3RhbGwtaW5mbyk6IGluc3RhbGwgZGlyLmluZm8gb25seSBpZiBpdCBleGlzdHMsCi0JKGFsbC1leHBlY3QsIGluc3RhbGwtZXhwZWN0KTogcGFzcyBhbG9uZyBYMTFfRkxBR1NfVE9fUEFTUwotCi1UdWUgTWFyICAyIDA5OjAxOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciB2bXMgdGFyZ2V0LCBza2lwIGJmZCwgbGQsIGJpbnV0aWxzLiAgRG8gYnVpbGQKLQlnYXMgZm9yIG1pcHMtZGVjLWJzZC4KLQotVHVlIE1hciAgMiAwODozNToyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAobWFrZXNyY2Rpcik6IElmICR7c3JjZGlyfSBpcyByZWxhdGl2ZSBhbmQgbm90ICIuIiwKLQlhbmQgJHtzdWJkaXJ9IGlzIG5vdCAiLiIsIHNldCBtYWtlc3JjZGlyIGJhc2VkIG9uICR7aW52c3ViZGlyfS4KLQotVHVlIEZlYiAyMyAxNDoxODoyOCAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkICJkZWphZ251IiB0byBob3N0dG9vbHMgbGlzdC4KLQotTW9uIEZlYiAyMiAyMzoyODozOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbiwgY29uZmlnLmd1ZXNzOiAgQWRkIHN1cHBvcnQKLQlmb3IgQm9zeCwgYW4gQUlYIHZhcmlhbnQgZnJvbSBCdWxsLgotCVBhdGNoZXMgZnJvbSBGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIuCi0KLVN1biBGZWIgMjEgMTE6MTU6MjIgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZGV2by9kZWphZ251OiBJbml0aWFsIGNyZWF0aW9uIG9mIGRldm8vZGVqYWdudS4KLQlNaWdyYXRlZCBkZWphZ251IHRlc3RjYXNlcyBhbmQgc3VwcG9ydCBmaWxlcyBmb3IgdGVzdGluZyBzb2Z0d2FyZQotCXRvb2xzIHRvIHJlc2lkZSBhcyBzdWJkaXJlY3RvcmllcywgY3VycmVudGx5IGNhbGxlZCAidGVzdHN1aXRlIiwKLQl3aXRoaW4gdGhlIGRpcmVjdG9yeSBvZiB0aGUgc29mdHdhcmUgdG9vbC4gIE1pZ3JhdGVkIGFsbCBwcm9ncmFtcywKLQlzdXBwb3J0IGxpYnJhcmllcywgZXRjLiBiZWxvZ2luZyB0byBkZWphZ251IHByb3BlciBmcm9tCi0JZGV2by9kZWphLWdudSB0byBkZXZvL2RlamFnbnUuCVRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgotCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4JVGhlIGNoYW5nZXMgdG8gdGhlc2UgZmlsZXMgd2hpY2ggd2lsbAotCWFsbG93IHRoZW0gdG8gY29uZmlndXJlLCBidWlsZCwgYW5kIGV4ZWN1dGUgcHJvcGVybHkgd2lsbCBiZSBtYWRlCi0JaW4gYSBmdXR1cmUgdXBkYXRlLgotCi1GcmkgRmViIDE5IDIwOjE5OjM5IDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBzZW5kX3ByIHRvIHNlbmQtcHIuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogc2VuZF9wcjogUmVuYW1lZCBkaXJlY3RvcnkgdG8gc2VuZC1wci4KLQotRnJpIEZlYiAxOSAxOTowMDoxMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgc29tZSBleHRyYSBzZW1pLWNvbG9ucyAobmVlZGVkIGlmIFNIRUxMPWJhc2gpLgotCi1GcmkgRmViIDE5IDAwOjU5OjMzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBVcGRhdGUgZm9yIGdkYi00LjggcmVsZWFzZS4KLQkqIE1ha2VmaWxlLmluIChnZGIudGFyLlopOiAgQWRkIHRleGluZm8vdGV4M3BhdGNoLiAgQnVpbGQKLQlnZGIteHh4LnRhci56IChnemlwJ2QpIGZpbGUgYWxzby4KLQotVGh1IEZlYiAxOCAwOToxNjoxNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWtlIGFsbC1kaWZmIGRlcGVuZCBvbiBhbGwtbGliaWJlcnR5Ci0KLVR1ZSBGZWIgMTYgMTY6MDY6MzEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogYWRkIHZheC11bHRyaXggaW4gdGhlIHNwaXJpdCBvZiBtaXBzLXVsdHJpeC4KLQotVHVlIEZlYiAxNiAwNTo1NzoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGFkZCBoZWxsbywgdGFyLCBnemlwLCByZWNvZGUsIGluZGVudAotCi1UdWUgRmViIDE2IDAwOjU4OjIwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogIFJlbW92ZSBldGMgZGlyZWN0b3J5Ci0JKEVUQ19TVVBQT1JUKTogIE9ubHkgYWRkIHRoZSBmaWxlcyBHREIgd2FudHMgZnJvbSBldGMvLgotCShnZGIudGFyLlopOiAgVXNlIEVUQ19TVVBQT1JULiAgVXNlIGJ5YWNjIHdoZW4gYnVpbGRpbmcgdGhlIGZpbGUuCi0KLVRodSBGZWIgMTEgMjA6MTQ6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIG1ha2VpbmZvIGJpbmFyeSBpcyBpbiBhIG5ldyBsb2NhdGlvbgotCi1UdWUgRmViICA5IDEyOjQyOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1lY29mZiBhcyBhbiBPUy4KLQotCSogTWFrZWZpbGUuaW46IFZhcmlvdXMgY2hhbmdlcyB0byBlbGltaW5hdGUgYSBsZXZlbCBvZiBtYWtlCi0JcmVjdXJzaW9uIGFuZCByZWR1Y2UgdGhlIHJlcXVpcmVkIGNvbW1hbmQgbGluZSBsZW5ndGguCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IE5ldyB2YXJpYWJsZSBob2xkaW5nIGZsYWdzIHBhc3NlZCB0byBhbGwKLQlzdWItbWFrZXMuCi0JKEVYVFJBX0hPU1RfRkxBR1MsIEVYVFJBX1RBUkdFVF9GTEFHUywgRVhUUkFfR0NDX0ZMQUdTKTogTmV3Ci0JdmFyaWFibGVzIGhvbGRpbmcgc2V0dGluZ3MgZm9yIHNwZWNpZmljIHN1Yi1tYWtlcy4KLQkoRkxBR1NfVE9fUEFTUywgVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIEdDQ19GTEFHU19UT19QQVNTKTogUmV3cm90ZQotCWluIHRlcm1zIG9mIEJBU0VfRkxBR1NfVE9fUEFTUy4KLQkoVEFSR0VUX0xJQlMpOiBOZXcgdmFyaWFibGUgbGlzdGluZyBkaXJlY3RvcmllcyB3aGljaCB1c2UKLQlUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLQkoc3ViZGlyX2RvKTogRWxpbWluYXRlZC4KLQkoZG8tKik6IE5ldyBzZXQgb2YgdGFyZ2V0cyB0byByZXBsYWNlIHN1YmRpcl9kby4KLQkodmFyaW91cyk6IEFsbCB0YXJnZXRzIHdoaWNoIHVzZWQgc3ViZGlyX2RvIG5vdyBkZXBlbmQgb24gZG8tKi4KLQkobG9jYWwtY2xlYW4pOiBSZW5hbWVkIGZyb20gZG9fY2xlYW4uCi0JKGxvY2FsLWRpc3RjbGVhbik6IE5ldyB0YXJnZXQsIGRlcGVuZGVuY3kgb2YgZGlzdGNsZWFuIGFuZAotCXJlYWxjbGVhbi4KLQkoaW5zdGFsbC1pbmZvKTogRG9uJ3QgY3JlYXRlIGRpcmVjdG9yaWVzLiAgRGVwZW5kIG9uIGRpci5pbmZvCi0JcmF0aGVyIHRoYW4gY2FsbGluZyBtYWtlIHJlY3Vyc2l2ZWx5LgotCShpbnN0YWxsLWRpci5pbmZvKTogRWxpbWluYXRlZC4KLQkoaW5zdGFsbC1pbmZvLWRpcnMpOiBDcmVhdGUgYWxsIGluZm8gZGlyZWN0b3JpZXMgaGVyZS4KLQkoZGlyLmluZm8pOiBEZXBlbmQgdXBvbiBkby1pbnN0YWxsLWluZm8uCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkZWQgZmFsc2UuCi0KLVNhdCBGZWIgIDYgMTQ6MDU6MDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgQlNESSBhbmQgQlNESiAoSm9saXR6IDM4NmJzZCkuCi0KLVRodSBGZWIgIDQgMjA6NDk6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5mbyk6IHJlbW92ZSBkZXBlbmRlbmN5IG9uIGFsbC10ZXhpbmZvLiAgVGhlCi0JcHJvYmxlbSB3YXMgcmVhbGx5IGluIHRleGluZm8vQywgbm90IGF0IHRoaXMgbGV2ZWwuCi0KLVRodSBGZWIgIDQgMTM6Mzg6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5mbyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYWxsLXRleGluZm8gKFBSIDIxMTIpLgotCi1UaHUgRmViICA0IDAxOjUwOjUzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgQ2hhbmdlIEJJU09OIHRvICdiaXNvbiAteScgZm9yCi0JR0RCIHJlbGVhc2VzLgotCi1XZWQgRmViICAzIDE3OjIyOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJbmNsdWRlIHNyY2RpciBpbiBtZXNzYWdlIGFib3V0IHRhcmdldCBvZiBsaW5rIG5vdAotCWJlaW5nIGZvdW5kLiAgRG9uJ3QgY29udmVydCBgLScgdG8gYF8nIGluIGB3aXRoJyBvcHRpb25zIGJlaW5nCi0JcGFzc2VkIHRvIHN1YmRpcnMuCi0KLVR1ZSBGZWIgIDIgMTg6NTc6NTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCB1dWRlY29kZSB0byBob3N0X3Rvb2xzCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB7YWxsLGluc3RhbGx9LXV1ZGVjb2RlIHRhcmdldHMsIGFkZGVkIHRoZW0gdG8KLQl0aGUgYXBwcm9wcmlhdGUgbGlzdHMKLQotVHVlIEZlYiAgMiAxMTo0NTo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogQWRkZWQgZGVwZW5kZW5jeSBvbiBhbGwtZ2FzLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi0qKTogQnVpbGQgbGQgYW5kIGJpbnV0aWxzLgotCi1Nb24gRmViICAxIDEyOjM1OjQxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBjaGVjayByZXR1cm4gY29kZSBmcm9tIG1rZGlyLCBwcmludCBlcnJvciBtZXNzYWdlIGFuZAotCSAgZXhpdCBvbiBmYWlsdXJlLgotCi1TYXQgSmFuIDMwIDE2OjQwOjI4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgTmV3IGxvY2F0aW9uIGZvciB0ZXhpbmZvLnRleC4KLQotVGh1IEphbiAyOCAxNTowOTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkZWQgdGFyLCBjcGlvIGFuZCB1dWRlY29kZS4KLQotV2VkIEphbiAyNyAxNjo1MDozMiAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKGg4NTAwKTogIFJlY29nbml6ZSB0aGlzIGFzIGEgY3B1IHR5cGUuCi0KLVNhdCBKYW4gMjMgMjA6MzI6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHNvdXJjZSBkaXJlY3RvcnkgbWlzc2luZyBpcyBubyBsb25nZXIgYSB3YXJuaW5nCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGlyaXhbMzRdKiBpbnN0ZWFkIG9mIGlyaXhbMzRdCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgYW5kIHBhc3MgZG93biBYMTFfTElCCi0KLQkqIGNvbmZpZy9taC1zY286IGRlZmluZSBYMTFfTElCIHRvIHRoZSBtZXNzIHRoYXQgU0NPIE9EVCByZXF1aXJlcwotCi1TYXQgSmFuIDIzIDEzOjQ5OjQwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBndWVzcy1zeXN0eXBlOiBSZW5hbWVkIHRvIC4uLgotCSogY29uZmlnLmd1ZXNzOiAgLi4uIGJ5IHBvcHVsYXIgcmVxdWVzdC4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46ICBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLVRodSBKYW4gMjEgMTI6MjA6NTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGd1ZXNzLXN5c3R5cGU6ICBQYXRjaGVzIGZyb20gSm9obiBFYXRvbiA8andlQGNoZS51dGV4YXMuZWR1PjoKLQkrIEFkZCBDb252ZXgsIENyYXkvVW5pY29zLCBhbmQgRW5jb3JlL011bHRpbWF4IHN1cHBvcnQuCi0JKyBFeGVjdXRlIC4vZHVtbXkgaW5zdGVhZCBvZiBhc3N1bWluZyAuIGlzIGluIFBBVEguCi0KLVR1ZSBKYW4gMTkgMTc6MTg6MDYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGd1ZXNzLXN5c3R5cGU6ICBOZXcgc2hlbGwgc2NyaXB0LiAgQXR0ZW1wdHMgdG8gZ3Vlc3MgdGhlCi0JY2Fub25pY2FsIGhvc3QgbmFtZSBvZiB0aGUgZXhlY3V0aW5nIGhvc3QuCi0JT25seSBhIGZldyBob3N0cyBhcmUgc3VwcG9ydGVkIHNvIGZhci4KLQkqIGNvbmZpZ3VyZTogIENhbGwgZ3Vlc3Mtc3lzdHlwZSBpZiBubyBob3N0IGlzIHNwZWNpZmllZC4KLQotVHVlIEphbiAxOSAwODoyNjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IE1hZGUgdG8gd29yayB3aXRoIGN1cnJlbnQKLQlnY2MgTWFrZWZpbGUuCi0KLQotRnJpIEphbiAxNSAxMDoyNzowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHQ0NfRkxBR1NfVE9fUEFTUyk6IE5ldyB2YXJpYWJsZS4KLQkoYWxsLWdjYywgaW5zdGFsbC1nY2MsIHN1YmRpcl9kbyk6IFVzZSBpdC4KLQotV2VkIEphbiAxMyAxNzowNjo0NSAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW5hbWUgdW5pbnN0YWxsZWQgZ2NjIGRyaXZlciBmcm9tIGdjYyB0byB4Z2NjLgotCi1XZWQgSmFuICA2IDIwOjI5OjE2IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlZCBleHBsaWNpdCBzZXR0aW5nIG9mIFNVQkRJUlMuIFNVQkRJUlMgaXMgbm93Ci0JICBzZXQgZXhjbHVzaXZlbHkgYnkgY29uZmlndXJlLCB1c2luZyBjb25maWd1cmUuaW4gLgotCi1XZWQgSmFuICA2IDEzOjQ0OjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogc2V0ICRQQVRIIGZvciBhbGwgYnVpbGRzCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIFRBUkdFVF9GTEFHU19UT19QQVNTIGZvciB4aWJlcnR5IGFuZCBsaWJtCi0KLVdlZCBKYW4gIDYgMTE6MDI6MTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHQ0NfRk9SX1RBUkdFVCk6ICBTdXBwbHkgYSBkZWZhdWx0IHRoYXQgbWF0Y2hlcwotCXRoZSBvbmUgdXNlZCBpbiBnY2MvTWFrZWZpbGUuaW4sIHNvIHRoYXQgYSBudWxsIGV4cGFuc2lvbiBkb2Vzbid0Ci0Jb3ZlcnJpZGUgdGhlIG9uZSBuZWVkZWQgdG8gYnVpbGQgZ2NjIHdpdGggYSBuYXRpdmUgY2MuCi0KLQotVHVlIEphbiAgNSAwNzo1NToxMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWNjZXB0IC13aXRoIGFyZ3VtZW50cy4KLQotU3VuIEphbiAgMyAxNToxNTowOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGg4MzAwc2ltCi0KLVR1ZSBEZWMgMjkgMTU6MDY6MDAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc2NvOiBEb24ndCBvdmVycmlkZSBCSVNPTiBkZWZpbml0aW9uLgotCi0JKiBidWlsZC1hbGwubWs6IElmIGNhbm9uaG9zdCBpcyBpMzg2LXVua25vd24tc2NvMy4ydjQsIGNoYW5nZSBpdAotCXRvIGkzODYtc2NvMy4ydjQuICBTZXQgVEFSR0VUUyBhbmQgQ0ZMQUdTIGZvciBpMzg2LXNjbzMuMnY0LgotCShhbGwtY3lnbnVzLCBuYXRpdmUsIGJ1aWxkLWN5Z251cyk6IE1ha2UKLQkkKGNhbm9uaG9zdCktc3RhbXAtM3N0YWdlLWRvbmUsIG5vdCAkKGhvc3QpLi4uLgotCSogdGVzdC1idWlsZC5tayAoc3RhbXAtM3N0YWdlLWNvbXBhcmVkKTogVXNlIHRhaWwgKzEwYyBmb3IKLQlpMzg2LXNjbzMuMnY0LiAgQWRkZWQgZWxzZSB0cnVlIHRvIGlmIGNvbW1hbmQuCi0KLU1vbiBEZWMgMjggMTI6MDg6NTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IChmcm9tIEZTRikgU2VxdWVudCB1c2VzIGEgQlNELWxpa2UgT1MuCi0KLU1vbiBEZWMgMjggMDg6MzI6MDYgMTk5MiAgTWluaCBUcmFuLUxlICAobXRyYW5sZUBwYXJpcy5pbnRlbGxpY29ycC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLWlzYyopOiBhZGRlZDsgdXNlcyBtaC1zeXN2LgotCi1UaHUgRGVjIDI0IDE3OjI2OjI0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCByZW1vdmUgYmludXRpbHMgZnJvbSBTb2xhcmlzIGJ1aWxkcwotCi1UaHUgRGVjIDI0IDE0OjA4OjM4IDE5OTIgZGF2aWQgZGB6b28nIHp1aG4gICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGdldCByaWQgb2YgZWFybGllciBkZWZpbml0aW9ucyBmb3IgKmNsZWFuLAotCWFsc28gaGFuZGxlIHRoZSByZWN1cnNpdmUgaW5mbyBydWxlIGJldHRlcgotCi1UaHUgRGVjIDI0IDEyOjQwOjIxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4sIHJlYWxjbGVhbik6ICBGaXggdG8KLQlkbyBtb3JlLW9yLWxlc3MgdGhlIHJpZ2h0IHRoaW5nLgotCi1XZWQgRGVjIDE2IDEwOjI1OjMxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBsaW5lcyBkZWZpbmluZyBDQyBhbmQgQ1hYLCBhbmQgdXNlIENYWCByYXRoZXIKLQl0aGFuIGdjYyBpbiBkZWZpbml0aW9ucyBvZiBDWFhfRk9SX0JVSUxEIGFuZCBDWFhfRk9SX1RBUkdFVC4KLQotVHVlIERlYyAxNSAwMDozNDozMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGFuZ2UgYWxsICQoaG9zdF9jcHUpLSQoaG9zdF92ZW5kb3IpLSQoaG9zdF9vcykgdG8KLQkkKGhvc3RfY2Fub25pY2FsKS4KLQotCSogY29uZmlndXJlLmluOiBzcGxpdCB0aGUgY29uZmlnZGlycyBsaXN0IGludG8gNCBjYXRlZ29yaWVzIChuYXRpdmUKLQl2LiBjcm9zcywgbGlicmFyeSB2LiB0b29sKSBhbmQgaGFuZGxlIHRoZSBjcm9zcy1vbmx5IGFuZCBuYXRpdmUtCi0Jb25seSBpbiBtb3JlIHJlYXNvbmFibGUgKGFuZCBjb3JyZWN0ISkgd2F5LgotCi1Nb24gRGVjIDE0IDE3OjA0OjIyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qKTogIERvbid0IHJlbW92ZSBiZmQgYW5kIGdkYiBmcm9tCi0JY29uZmlnZGlycyBhbnltb3JlLgotCi1TdW4gRGVjIDEzIDAwOjM3OjI2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGV4dGVuc2l2ZSBjbGVhbnVwOjogIHJlbW92ZWQgYWxsIG9mIHRoZSBleHBsaWNpdAotCWNsZWFuLSogdGFyZ2V0cywgY29sbGFwc2VkIG1hbnkgd3JhcHBlcnMgYXJvdW5kIHN1YmRpcl9kbyBpbnRvCi0Jb25lLCBhZGRlZCBhZGRpdGlvbmFsIHRhcmdldHMgdG8gc2F0aXNmeSBzdGFuZGFyZHMudGV4aSwgZGVsZXRlZAotCXNvbWUgb2xkIHRhcmdldHMsIHNvbWUgY2hhbmdlcyBmb3IgY29uc2lzdGVuY3kKLQotRnJpIERlYyAxMSAyMDoxODowMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIHNvbWUgcHJvZ3JhbXMgYXMgY3Jvc3Mtb25seSwgYW5kIG90aGVycyBhcwotCW5hdGl2ZSBvbmx5Ci0KLQkqIHRlc3QtYnVpbGQubWs6IGhhbmRsZSBwYXJ0aWFsIGhvbGVzIGluIGEgbW9yZSBnZW5lcmljIG1hbm5lcgotCi0JKiBNYWtlZmlsZS5pbjogbTQgZGVwZW5kcyBvbiBsaWJpYmVydHkKLQotTW9uIERlYyAgNyAwNjo0MzoyNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zY286IGRvbid0IGRlZmF1bHQgJChDQykgdG8gZ2NjCi0KLVRodSBEZWMgIDMgMjE6NTI6MTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBtNCwgdGV4dHV0aWxzLCBmaWxldXRpbHMsIHNlZCwgc2hlbGx1dGlscywKLQl0aW1lLCB3ZGlmZiwgYW5kIGZpbmQgdG8gY29uZmlnZGlycwotCi0JKiBNYWtlZmlsZS5pbjogYWxsLCBjbGVhbiwgYW5kIGluc3RhbGwgcnVsZXMgZm9yIHRoZSBuZXcgcHJvZ3JhbXMKLQlhZGRlZCB0byBjb25maWd1cmUuaW4KLQotTW9uIE5vdiAzMCAxNDo1NDozNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIG1oLXN1biBmb3IgYWxsICotc3VuLSogaG9zdHMKLQotCSogY29uZmlnL21oLXNvbGFyaXM6IHJld29yayBzdGFuZGFyZCBYIGxvY2F0aW9uIHRvIHVzZQotCSRPUEVOV0lOSE9NRSwgaWYgZGVmaW5lZC4KLQotCSogY29uZmlnL21oLXN1bjogaGFuZGxlIFgxMSBpbmNsdWRlIGxvY2F0aW9ucwotCi0JKiBjb25maWcvbWgtZGVjc3RhdGlvbjogZGVmaW5lIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgdG8gMCwgdG8KLQl3b3JrIGFyb3VuZCBkYWluLWJyYW1hZ2VkIERFQ3dpbmRvd3MgaW5jbHVkZSBmaWxlcwotCi1GcmkgTm92IDI3IDE4OjM1OjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBmbGFncyBmb3IgWDExIGluY2x1ZGUgZmlsZXMgYW5kIGxpYnJhcnkgZmlsZQotCWxvY2F0aW9ucywgcGFzcyB0aGVtIGRvd24gdG8gdGhlIHByb2dyYW1zIHRoYXQgbmVlZCB0aGlzIGluZm8KLQotCSogYnVpbGQtYWxsLm1rOiBhZGRlZCBhICduYXRpdmUnIHRhcmdldCwgdG8gM3N0YWdlIHRoZSBuYXRpdmUgdG9vbGNoYWluCi0KLQkqIGNvbmZpZy97bWgtaHB1eCxtaC1zb2xhcmlzfTogZGVmaW5lIHRoZSAic3RhbmRhcmQiIGxvY2F0aW9ucyBmb3IKLQl0aGUgdmVuZG9yIHN1cHBsaWVkIFgxMSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMKLQotU3VuIE5vdiAyMiAxODo1OToxMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogc3RhcnQgYnVpbGRpbmcgbGliZysrIGZvciBIUC1VWCB0YXJnZXRzCi0KLVdlZCBOb3YgMTggMTk6MzM6MTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIFVwZGF0ZSByZWZlcmVuY2VzIHRvIGZpbGVzIG1vdmVkIGludG8gZXRjLy4KLQotU3VuIE5vdiAxNSAwOTozNjowOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoaTM4NnNvbDIsIGk0ODZzb2wyKTogIGlbMzRdODYtdW5rbm93bi1zb2xhcmlzMi4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNvbGFyaXMyKik6ICBVc2UgY29uZmlnL21oLXN5c3Y0LgotCi1UaHUgTm92IDEyIDA4OjUwOjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhY2NlcHQgZGFzaCBhcyB3ZWxsIGFzIHVuZGVyc2NvcmUgaW4gbG9uZyBvcHRpb24KLQluYW1lcyBmb3IgRlNGIGNvbXBhdGliaWxpdHkuCi0KLVdlZCBOb3YgMTEgMDg6MDQ6MzcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhZGRlZCAtc2NvMy4ydjQgc3VwcG9ydCBmcm9tIEZTRi4KLQotU3VuIE5vdiAgOCAyMToxNDozMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZXhwYW5kIHRoZSBzZWN0aW9uIHRoYXQgYWRkcyBvciByZW1vdmVzCi0JZGlyZWN0b3JpZXMgZnJvbSB0aGUgbGlzdCBvZiBwcm9ncmFtcyB0byBidWlsZCwgdG8gaGFuZGxlIG5hdGl2ZQotCXZzLiBjcm9zcyBpbiBhZGRpdGlvbiB0byBob3N0IHYuIG5hdGl2ZQotCi1TYXQgTm92ICA3IDE4OjUyOjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZXBsYWNlIEMrKyBpbiBtYWNybyBuYW1lcyB3aXRoIENYWC4KLQlUaGlzIGlzIGxlc3MgbGlrZWx5IHRvIGJyZWFrIC4uLgotCi1TYXQgTm92ICA3IDE1OjE2OjU4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogYWRkIC13IHRvIEdOVV9NQUtFCi0KLUZyaSBOb3YgIDYgMjM6MTA6MzcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiByZW1vdmUgJ3NwYXJjJy0tPidzcGFyYy1zdW4nIGRlZmF1bHQgdHJhbnNmb3JtYXRpb24sCi0JYWRkICdzcGFyYycgdG8gbGlzdCBvZiByZWNvZ25pemVkIGNwdXMuICBUaGlzIG5lZWRlZCB0byBtYWtlCi0JJ3NwYXJjLWFvdXQnIGV4cGFuZCB0byAnc3BhcmMtdW5rbm93bi1hb3V0JyBpbnN0ZWFkIG9mICdzcGFyYy1zdW4tYW91dCcuCi0JRGVsZXRlIHNvbWUgcmVkdW5kYW50IG9zZTY4IHZhcmlhbnRzLiAgUmVjb2duaXplIC13cnMgYXMgYW4gb3MsCi0JdGhlbiBjaGFuZ2VzIHRoYXQgaW50byAkQ1BVLXdycy12eHdvcmtzLgotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBtb3N0IHJlZmVyZW5jZXMgdG8gZ2RidGVzdCwgcmVndWxhcml6ZQotCXRhcmdldCBiYXNlZCBwcm9ncmFtIHJlbW92YWwKLQotCSogdGVzdC1idWlsZC5tazogaW1wb3J0IGZyb20gcDMgdHJlZSAobWFueSBmaXhlcyBhbmQgY2hhbmdlcykKLQotRnJpIE5vdiAgNiAyMDo1OTowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHJ1bGVzIHRvIGhhbmRsZSB0Y2wsIHRrLCBhbmQgZXhwZWN0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIHRob3NlIGRpcmVjdG9yaWVzIGlmIHRoZXkgZXhpc3QKLQotVGh1IE5vdiAgNSAxNDozNTo0MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IHJlbW92ZWQgYm9ndXMgaHBwYWJzZCBhbmQgaHBwYWhwdXggbmFtZXMsIHNpbmNlCi0JImhwcGEiIGlzIG5vdCBhIHZhbGlkIGNwdSAoaHBwYTEuMSBvciBocHBhMS4wIGFyZSwgdGhvdWdoKQotCi1UaHUgT2N0IDI5IDAwOjEyOjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsbC1nY2Mgbm93IGRlcGVuZHMgb24gYWxsLWJpbnV0aWxzLiAgYWxsLWxpYmcrKwotCWRlcGVuZHMgdXBvbiBhbGwteGliZXJ0eQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlcyBmcm9tIHAzLCBpbmNsdWRpbmc6Ci0KLQlUaHUgT2N0ICA4IDE1OjAwOjE3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFhUUkFGTEFHUyk6IGluY2x1ZGUgbmV3bGliIGRpcmVjdG9yaWVzIGlmCi0JbmV3bGliL01ha2VmaWxlIGV4aXN0cywgcmF0aGVyIHRoYW4gaWYgaG9zdCAhPSB0YXJnZXQuCi0KLQlGcmkgU2VwIDI1IDEzOjQxOjUyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1ub3N0ZGluYyB0byBYVFJBRkxBR1MgaWYgd2UgYXJlIHVzaW5nIGdjYwotCWZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUgYW5kIG5vdCBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyLiAgVGhpcwotCW1hdHRlcnMgZm9yIHRoZSBsaWJnKysgY29uZmlndXJhdGlvbiBpZiByZWNvbmZpZ3VyaW5nIGEgdHJlZSB0aGF0Ci0JaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQuCi0KLQlUaHUgU2VwIDEwIDEwOjM1OjUxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1JIGZvciBuZXdsaWIvdGFyZy1pbmNsdWRlIHRvIFhUUkFGTEFHUywgdG8KLQlwaWNrIHVwIHRoZSBtYWNoaW5lIGFuZCBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgQVNfRk9SX1RBUkdFVCwgcGFzc2VkIGRvd24gaW4KLQlUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIEFkZGVkIENDX0ZPUl9CVUlMRCwgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUKLQl0aGUgQyBjb21waWxlciB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIGFyZSBydW4gaW4gdGhlCi0JYnVpbGQgZW52aXJvbm1lbnQsIHNldCBpdCB0byBkZWZhdWx0IHRvICQoQ0MpLCBhbmQgcGFzc2VkIGl0IGRvd24KLQlpbiBGTEFHU19UT19QQVNTIGFuZCBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLQotCU1vbiBTZXAgIDcgMjI6MzQ6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCAkKGhvc3QpID0gJCh0YXJnZXQpIHRlc3RzIGJhY2sgdG8gKl9GT1JfVEFSR0VULgotCVdlIG5lZWQgdGhlbSBmb3IgdW51c3VhbCBuYXRpdmUgYnVpbGRzLCBsaWtlIHN5c3RlbXMgd2l0aG91dAotCXJhbmxpYi4KLQotCSogY29uZmlndXJlOiBhbHNvIGRlZmluZSAkKGhvc3RfY2Fub25pY2FsKSBhbmQKLSAgICAgICAgJCh0YXJnZXRfY2Fub25pY2FsKSwgd2hpY2ggYXJlIHRoZSBmdWxsLCBjYW5vbmljYWwgbmFtZXMgZm9yIHRoZQotICAgICAgICBnaXZlbiBob3N0IGFuZCB0YXJnZXQKLQotU3VuIE5vdiAgMSAxNjozODoxNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBzZXBhcmF0ZSBkZWZpbml0aW9ucyBmb3IgQysrLgotCi1GcmkgT2N0IDMwIDExOjM3OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiAgQWRkIGRlamEtZ251LgotCi1GcmkgT2N0IDIzIDAwOjM5OjE4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBVcGRhdGUgZm9yIGNvbmZpZ3VyZS50ZXhpIGFuZCBnZGItNC43IHJlbGVhc2UuCi0KLVdlZCBPY3QgMjEgMjE6NTQ6MjcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTW92ZSAiYWxsIiB0YXJnZXQgdG8gdG9wIG9mIGZpbGUuCi0JUHJldmlvdXNseSwgZmlyc3QgdGFyZ2V0IHdhcyAiLlBIT05ZIiB3aGljaCBjYXVzZWQgQlNENC40IG1ha2UKLQl0byBidWlsZCAuUEhPTlkgd2hlbiBtYWtlIHdhcyBydW4gd2l0aG91dCBhcmd1bWVudHMuCi0KLU1vbiBPY3QgMTkgMDE6MTc6NTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIENPUFlJTkcuTElCIHRvIEdEQiByZWxlYXNlcywgbm93IHRoYXQgdGhlcmUncwotCUxpYnJhcnktY29weWxlZnRlZCBjb2RlIGluIGxpYmliZXJ0eS4KLQotVHVlIE9jdCAxMyAwMToyMjozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIFJlcGxhY2UgbTY4a21vdGUgd2l0aCBwbGFpbiBvbGQgbTY4ay4KLQotRnJpIE9jdCAgOSAwMzoxNDoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgc3BhY2UgZnJvbSBibGFuayBsaW5lLCBhdm9pZCBNYWtlIGNvbXBsYWludHMuCi0KLVRodSBPY3QgIDggMTg6NDE6NDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IENvbXBsYWluIGlmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLiAgQWRkZWQgc3VwcG9ydCBmb3IKLQkzODZic2QgYXMgT1MgYW5kIHRhcmdldCBhbGlhcy4KLQotVGh1IE9jdCAgOCAxNTowNzoyMiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYVFJBRkxBR1MpOiBpbmNsdWRlIG5ld2xpYiBkaXJlY3RvcmllcyBpZgotCW5ld2xpYi9NYWtlZmlsZSBleGlzdHMsIHJhdGhlciB0aGFuIGlmIGhvc3QgIT0gdGFyZ2V0LgotCi1Nb24gT2N0ICA1IDAzOjAwOjA5IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVjb2duaXplIHNwYXJjbGl0ZS13cnMtdnh3b3Jrcy4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwteGliZXJ0eSk6IGFkZGVkICoteGliZXJ0eSBtYWtlIHJ1bGVzIChmcm9tCi0JcDMuKSBBZGRlZCBjbGVhbi14aWJlcnR5IHRvIGNsZWFuLgotCi1UaHUgT2N0ICAxIDE3OjU5OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgKi0qLSogaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMgZm9yIGhvc3QgYW5kIHRhcmdldAotCi1UdWUgU2VwIDI5IDE0OjExOjE4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1ub3N0ZGluYyB0byBYVFJBRkxBR1MgaWYgd2UgYXJlIHVzaW5nIGdjYwotCWZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUgYW5kIG5vdCBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyLiAgVGhpcwotCW1hdHRlcnMgZm9yIHRoZSBsaWJnKysgY29uZmlndXJhdGlvbiBpZiByZWNvbmZpZ3VyaW5nIGEgdHJlZSB0aGF0Ci0JaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQuCi0KLVNlcCAyMCAwODo1MzoxMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoaTQ4NnYvaTQ4NnY0KTogIE1lcmdlIGluIGZyb20gRlNGIHZlcnNpb24uCi0KLUZyaSBTZXAgMTggMDA6MzI6MDAgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBvbmx5IHNldCBQV0QgaWYgaXQgaXMgYWxyZWFkeSBzZXQuCi0KLVRodSBTZXAgMTcgMjM6MDU6NTMgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBqdXN0IHNldCBQV0Q9YHB3ZGAgYXQgdGhlIHRvcCwgc2luY2UgVWx0cml4IHNoCi0JZG9lc24ndCBoYXZlIHVuc2V0IGFuZCBhbGwgc3VjY2VzcyBwYXRocyAoYW5kIG1vc3QgZXJyb3IgcGF0aHMpCi0Jb3V0IHNldCBpdCBhbnl3YXkuIChOb3RlOiBzaG91bGQgY2hhbmdlIGFsbCB1c2VzIG9mICR7UFdEPWBwd2RgfQotCXRvIGp1c3QgJHtQV0R9IHRvIGF2b2lkIGNvbmZ1c2lvbi4pCi0KLVR1ZSBTZXAgMTUgMTY6MDA6NTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFsd2F5cyBzZXQgJCh0b29sZGlyKSB0byAkKGxpYmRpcikvJCh0YXJnZXRfYWxpYXMpLAotCWV2ZW4gZm9yIGEgbmF0aXZlIGNvbXBpbGF0aW9uLgotCi1UdWUgU2VwIDE1IDAyOjIyOjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBtYWtlIHRoZSBnZGIudGFyLlogcnVsZSB3b3JrIGJldHRlci4KLQotCSogTWFrZWZpbGUuaW4gKEdEQl9TVVBQT1JUX0RJUlMpOiAgQWRkIG9wY29kZXMuCi0JKERFVk9fU1VQUE9SVCk6ICBBZGQgY29uZmlndXJlLnRleGkuCi0JKGJmZC1pbHJ0LnRhci5aKTogIFJlbW92ZSBhbmNpZW50IHJ1bGUuCi0KLVRodSBTZXAgMTAgMTA6NDM6MTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLUkgZm9yIG5ld2xpYi90YXJnLWluY2x1ZGUgdG8gWFRSQUZMQUdTLCB0bwotCXBpY2sgdXAgdGhlIG1hY2hpbmUgYW5kIHN5c3RlbSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLnN1YjogYWRkZWQgbmV3IHRhcmdldCBtNjgwMTAtYWRvYmUtc2NvdXQsCi0Jd2l0aCBhbGlhcyBvZiBhZG9iZTY4ay4gIENoYW5nZWQgY29uZmlndXJlLmluIHRvIGNoZWNrIGZvcgotCS1zY291dCBiZWZvcmUgLXNjbyogdG8gYXZvaWQgYSBmYWxzZSBtYXRjaC4KLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIEFTX0ZPUl9UQVJHRVQsIHBhc3NlZCBkb3duIGluCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MuICBBZGRlZCBDQ19GT1JfQlVJTEQsIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlCi0JdGhlIEMgY29tcGlsZXIgdG8gdXNlIHRvIGNyZWF0ZSBwcm9ncmFtcyB3aGljaCBhcmUgcnVuIGluIHRoZQotCWJ1aWxkIGVudmlyb25tZW50LCBzZXQgaXQgdG8gZGVmYXVsdCB0byAkKENDKSwgYW5kIHBhc3NlZCBpdCBkb3duCi0JaW4gRkxBR1NfVE9fUEFTUyBhbmQgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0KLVdlZCBTZXAgIDkgMTI6MjE6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIENDX0ZPUl9UQVJHRVQsCi0JQVJfRk9SX1RBUkdFVCwgUkFOTElCX0ZPUl9UQVJHRVQsIE5NX0ZPUl9UQVJHRVQuICBQYXNzCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIHdoaWNoIGRlZmluZXMgQ0MsIEFSLCBSQU5MSUIgYW5kIE5NIGFzIHRoZQotCUZPUl9UQVJHRVQgdmFyaWFudHMsIHRvIG5ld2xpYiBhbmQgbGliZysrLgotCi1UdWUgU2VwICA4IDE3OjI4OjMwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nYXMsIGFsbC1nZGIpOiBSZXF1aXJlIGFsbC1vcGNvZGVzIHRvIGJlIGJ1aWx0Ci0JZmlyc3QuCi0KLVdlZCBTZXAgIDIgMDI6NTA6MDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBY2NlcHQgYGVsZicgYXMgYW4gZW52aXJvbm1lbnQuCi0KLVR1ZSBTZXAgIDEgMTU6NDg6MzAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtb3Bjb2Rlcyk6ICBjZCBpbnRvIHRoZSByaWdodCBkaXJlY3RvcnkKLQotU3VuIEF1ZyAzMCAyMToxMjoxMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgb3B0aW9uLCB1c2VkIGFzCi0JYXJndW1lbnQgdG8gc2VkIHdoZW4gaW5zdGFsbGluZyBwcm9ncmFtcy4KLQljb25maWd1cmUudGV4aTogYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgLXByb2dyYW1fcHJlZml4LAotCS1wcm9ncmFtX3N1ZmZpeCBhbmQgLXByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLVRodSBBdWcgMjcgMjE6NTk6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBY2NlcHQgaTQ4NiB3aGVyZSBpMzg2IG9rLgotCi1UaHUgQXVnIDI3IDEzOjA0OjQyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhY2NlcHQgd2UzMmsKLQotTW9uIEF1ZyAyNCAxNDowNToxNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLSAJKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IGFjY2VwdCBPU0U2ODAwMCBhbmQgT1NFNjhrLgotCi0JKiBNYWtlZmlsZS5pbjogZG9uJ3QgY3JlYXRlIGFsbCBkaXJlY3RvcmllcyBmb3IgYGBtYWtlIGluc3RhbGwnJzsKLQlsZXQgdGhlIHN1YmRpcmVjdG9yaWVzIGNyZWF0ZSB0aGUgb25lcyB0aGV5IG5lZWQuCi0KLVR1ZSBBdWcgMTEgMjM6MTM6MTcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0gICAgICAgICogQ09QWUlORzogbmV3IGZpbGUsIEdQTCB2MgotCi1UdWUgQXVnICA0IDAxOjEyOjQzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSB0aGUgbmV3IGdlbi1pbmZvLWRpciwgd2hpY2ggbmVlZHMgYSB0ZW1wbGF0ZQotCWFyZ3VtZW50ICh3aGljaCBhbHNvIGxpdmVzIGluIHRleGluZm8pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpLCBzdGFuZGFyZHMudGV4aTogZml4IElORk8tRElSLUVOVFJZCi0KLU1vbiBBdWcgIDMgMTU6NDE6MjggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc29sYXJpczogcmVtb3ZlZCB0aGUgLXhzIGZyb20gQ0ZMQUdTIChsZXQgdGhlIHBlb3BsZQotCXdpdGggU3VuJ3MgQyBjb21waWxlciBkZWFsIHdpdGggaXQgdGhlbXNlbHZlZCkKLQotTW9uIEF1ZyAgMyAwMDozNDoxNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAobmNyMzAwMCk6ICBDaGFuZ2UgaTM4NiB0byBpNDg2LgotCi1UaHUgSnVsIDIzIDAwOjEyOjE3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsLXJjcywgaW5zdGFsbC1ncmVwIHRvCi0JaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzLCByZW1vdmVkIGluc3RhbGwtYmlzb24gYW5kIGluc3RhbGwtbGliZ2NjCi0KLVR1ZSBKdWwgMjEgMDE6MDE6NTAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBncmFiIHRoZSBIUFVYIG1ha2VmaWxlIGZyYWdtZW50IGlmIG9uIEhQVVgKLQotTW9uIEp1bCAyMCAxMTowMjowOSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBlcmFkaWNhdGUgYmlzb24gc3Bvb3IgKGRpdHRvIGxpYmdjYykuCi0JIGNvbmZpZ3VyZS5pbjogcmVjb2duaXNlIG02OHtrLDAwMH0tZXJpY3Nzb24tT1NFLgotCSBlczE4MDAgaXMgYWxpYXMgZm9yIG02OGstZXJpY3Nzb24tT1NFCi0KLVN1biBKdWwgMTkgMTc6NDk6MDIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlYXJyYW5nZSB0aGUgcGFydHMgdGhhdCByZW1vdmUgcHJvZ3JhbXMgZnJvbQotCWNvbmZpZ2RpcnMsIGJhc2VkIG5vdyBvbiBIT1NUPT1UQVJHRVQgb3IgYnkgY2Fub25pY2FsIHRyaXBsZS4KLQotRnJpIEp1bCAxNyAyMjo1Mjo0OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHJlY3Vyc2UgZXhwbGljaXRseSB3aXRoIC1mIHRlc3QtYnVpbGQubWsgd2hlbgotCSAgYXBwcm9wcmlhdGUuICBwcmVkaWNhdGUgc3RhZ2UzIGFuZCBjb21wYXJpc29uIG9uIHRoZSBleGlzdGVuY2UKLQkgIG9mIGdjYy4gIFRoYXQgaXMsIGlmIGdjYyBpc24ndCBhcm91bmQsIHdlIGFyZW4ndCB0aHJlZS1zdGFnaW5nLgotCSAgT24gdmVyeSBjbGVhbiwgYWxzbyByZW1vdmUgLi4uc3RhbXAtY28uICBCdWlsZCBpbi1wbGFjZSBiZWZvcmUKLQkgIGRvaW5nIG90aGVyIGJ1aWxkcy4KLQotVGh1IEp1bCAxNiAxODozMzowOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogYWRkIHRnYXMKLQotVGh1IEp1bCAxNiAxNjowNToyOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhIG51bWJlciBvZiBjaGFuZ2VzIG1lcmdlZCBpbiBmcm9tIHByb2dyZXNzaXZlLgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBsaWJtLgotCi0JKiAuY3ZzaWdub3JlOiBpZ25vcmUgc29tZSBzdHVmZiB0aGF0IGNvbWVzIGZyb20gdGVzdC1idWlsZC5tay4KLQotV2VkIEp1bCAgOCAwMDowMTozMCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc29sYXJpczogIFVzZSAteHMgd2hlbiBjb21waWxpbmcgc28gdGhhdCBTdW4tQyBwdXRzCi0JYSBzeW1ib2wtdGFibGUgaW50byB0aGUgZXhlY3V0YWJsZS4KLQotVHVlIEp1bCAgNyAwMDoyNDo1MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFkZCBlczE4MDAgKG02OGstZXJpY3Nzb24tZXMxODAwKS4KLQotVHVlIEp1biAzMCAyMDoyNDo0MSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKLQkqIE1ha2VmaWxlLmluOiBhZGp1c3QgZGlyZWN0b3J5LWNyZWF0aW5nIHNjcmlwdCBmb3IgbG9zaW5nIGRlY3N0YXRpb24KLQotTW9uIEp1biAyMiAyMzo0Mzo0OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgTWlub3IgJHN1YmRpci1yZWxhdGVkIGZpeGVzLgotCi1Nb24gSnVuIDIyIDE4OjMwOjI2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGZpeCB2YXJpb3VzIHByb2JsZW1zIHdpdGggcHJvcG9nYXRpbmcKLQltYWtlZmlsZV90YXJnZXRfZnJhZyBpbiBzdWJkaXJzLgotCSogY29uZmlndXJlLmluOiBjb25maWcgbGliZ2NjIGlmIGl0cyB0aGVyZQotCi1GcmkgSnVuIDE5IDE1OjE5OjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBIUFBBIG1lcmdlLgotCi1Nb24gSnVuIDE1IDEyOjMxOjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoSU5TVEFMTCk6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCBpcyBicm9rZW4gb24gbmNyIDMwMDAncy4KLQotU3VuIEp1biAxNCAxMDoyOToxOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZXBsYWNlIGFsbC1iaXNvbiB3aXRoIGFsbC1ieWFjYyBpbiBhbGwKLQlkZXBlbmRlbmN5IGxpbmVzIGZvciBvdGhlciB0b29scyAod2hpY2ggbm93IHVzZSBieWFjYykuCi0KLUZyaSBKdW4gMTIgMjI6MjE6NTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3VuNHNvbDIgPT4gc3BhcmMtc3VuLXNvbGFyaXMyLgotCi1UdWUgSnVuICA5IDE3OjE4OjExIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIEFkZCBJTlNUQUxMLgotCi1UaHUgSnVuICA0IDEyOjA3OjMyIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWtlIGdwcm9mIHJ1bGVzIHNpbWlsYXIgdG8gYnlhY2MgcnVsZXMgKGluc3RlYWQgb2YKLQl2ZXN0aWdhbCAkKHVuc3ViZGlyKSB0aGF0IGRpZG4ndCB3b3JrLi4uKQotCi1UaHUgSnVuICA0IDAwOjM3OjA1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFkZCBzdXBwb3J0IGZvciBMaW51eC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlICQoRkxBR1NfVE9fUEFTUykgbW9yZSBjb25zaXN0ZW50bHkKLQkoYXQgbGVhc3QgZm9yIGxpYmcrKykuCi0KLVR1ZSBKdW4gMDIgMjA6MDM6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IGZpeCBkb2MgZm9yIHRoZSAtbmZwIG9wdGlvbiB0byBjb25maWd1cmUKLQotVHVlIEp1biAgMiAxNzoyMDo1MiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtYmludXRpbHMpOiBhciBuZWVkcyBmbGV4LCBzbyBkZXBlbmQgb24gYWxsLWZsZXguCi0KLVN1biBNYXkgMzEgMTU6MDQ6MDggMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogY2hhbmdlZCBbXi1dKyB0byBbXi1dW14tXSogc28gdGhhdCBpdCB3b3JrcyB1bmRlcgotCVN1biBzZWQuIChCU0QgNC4zIHNlZCBkb2Vzbid0IGhhbmRsZSBbXi1dKyBlaXRoZXIuKQotCSogY29uZmlndXJlLmluOiBhZGRlZCBzb2xhcmlzKiBob3N0X21ha2VmaWxlX2ZyYWcgaG9vay4KLQotU3VuIE1heSAzMSAwMToxMDozNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGNoYW5nZWQgcmVjb2duaXRpb24gb2YgbTY4MDAwIHNvIHRoYXQgdmFyaW91cwotCW02OGsgdHlwZXMgY2FuIGJlIHNwZWNpZmllZCB2aWEgbTY4MFswMTIzNF0wCi0KLVNhdCBNYXkgMzAgMjE6MDE6MDYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChiYXNpY19tYWNoaW5lKTogZml4IHNlZCBzbyB0aGF0ICctZm9vJyBpc24ndAotCWNvbXBsZXRlbHkgc3Vic3RpdHV0ZWQgb3V0IHdoaWxlIC4rJy1mb28nIGxvc2VzIHRoZSAnLWZvbycKLQotV2VkIE1heSAyNyAyMzoxODo1MiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViICgkb3MpOiBBZGQgLWFvdXQuCi0KLUZyaSBNYXkgMjIgMTQ6MDA6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIElmIGhvc3RfbWFrZWZpbGVfZnJhZyBpcyBhYnNvbHV0ZSwgZG9uJ3QKLQlwcmVmaXggJHtpbnZzdWJkaXJ9IChyZWxldmFudCB0byBsaWJnKysgYXV0by1jb25maWd1cmUpLgotCi1UaHUgTWF5IDIxIDE4OjAwOjA5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0b29sZGlyKTogRGVmaW5lIGl0LgotCShhbGwtbGQpOiBEZXBlbmQgb24gYWxsLWZsZXguCi0KLVN1biBNYXkgMTAgMjE6NDU6NTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiAgRml4IGxpYmcrKyBzcGVjaWFsIGNhc2UuCi0KLUZyaSBNYXkgIDggMDg6MzE6NDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZG8gbm90IGJ1cnkgYHB3ZGAgaW50byBjb25maWcuc3RhdHVzLCB0aHVzIGRvIGZld2VyCi0JICBwd2Qncy4KLQotCSogY29uZmlndXJlOiBwcmludCB0aGUgIkJ1aWxkaW5nIGluIiBtZXNzYWdlIG9ubHkgd2hlbiBidWlsZGluZyBpbgotCSAgb3RoZXIgdGhhbiAiLiIgQU5EIHZlcmJvc2UuCi0KLQkqIGNvbmZpZ3VyZTogcmVtb3ZlIC1zLCByZXdvcmsgLXYgdG8gYmV0dGVyIGFjY29tb2RhdGUgZ3Vlc3RlZAotCSAgY29uZmlndXJlcy4KLQotCSogc3RhbmRhcmRzLnRleGk6IHVwZGF0ZWQgdG8gMyBtYXksIGZpeGVkIGxpYnJpZCA8LT4gbGliZGlyIHR5cG8uCi0KLUZyaSBNYXkgIDEgMTg6MDA6NTAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWNyb2l6ZSBmbGFncyBwYXNzZWQgb24gcmVjdXJzaW9uLiAgcmVtb3ZlCi0JICBmaWxldXRpbHMuCi0KLVRodSBBcHIgMzAgMDg6NTY6MjAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZ2V0IG1ha2VzcmNkaXIgcmlnaHQgZm9yIHN1YmRpcnMgZGVlcGVyIHRoYW4gMS4KLQotCSogTWFrZWZpbGUuaW46IHBhc3MgSU5TVEFMTCwgSU5TVEFMTF9EQVRBLCBJTlNUQUxMX1BST0dSQU0gb24KLQkgIGluc3RhbGwuCi0KLUZyaSBBcHIgMjQgMTU6NTE6NTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkb24ndCBwcmludCBzdWJkaXJfZG8gb3IgcmVjdXJzaW9uIGxpbmVzLgotCi1GcmkgQXByIDI0IDE1OjIyOjA0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogYWRkZWQgbWVudSBpdGVtLgotCi0JKiBNYWtlZmlsZS5pbjogYnVpbGQgYW5kIGluc3RhbGwgc3RhbmRhcmRzLmluZm8uCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBuZXcgZmlsZS4KLQotV2VkIEFwciAyMiAxODowNjo1NSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogdGVzdCBmb3IgYW5kIG1vdmUgY29uZmlnLnN0YXR1cyBwaWVjZXMgZnJvbQotCSAgJHtzdWJkaXJ9Ly4KLQotV2VkIEFwciAyMiAxNDozODozNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWRlbHRhODgsIGNvbmZpZy9taC1uY3IzMDAwOiAgUmVwbGFjZSBNSU5VU19HIHdpdGgKLQlDRkxBR1MgcGVyIG5ldyBjb25maWd1cmF0aW9uIHN0cmF0ZWd5LgotCSogY29uZmlndXJlOiAgVGVzdCBmb3IgZXhpc3RhbmNlIG9mIGZpbGVzIGJlZm9yZSB0cnlpbmcgdG8gbXYKLQl0aGVtLCB0byBhdm9pZCBudW1lcm91cyBub24tZXhpc3RhbmNlIG1lc3NhZ2VzLgotCi1UdWUgQXByIDIxIDEyOjMxOjMzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGNvcnJlY3QgZmluYWwgbGluZSBvZiBjb25maWcuc3RhdHVzLgotCi0JKiBjb25maWd1cmU6IHBhdGNoIGZyb20gZWdnZXJ0LiAgQXZvaWRzIGEgcHJvdGVjdGlvbiBwcm9ibGVtIGlmCi0JICB0aGUgb3JpZ2luYWwgTWFrZWZpbGUuaW4gaXMgcmVhZCBvbmx5LgotCi0JKiBjb25maWd1cmU6IHVzZSBtb3ZlLWlmLWNoYW5nZSBmcm9tIGdjYyB0byBjcmVhdGUgY29uZmlnLnN0YXR1cy4KLQkgIFNvbWUgbWFrZWZpbGVzIGRlcGVuZCBvbiBjb25maWcuc3RhdHVzIHRvIHRlbGwgaWYgYSBkaXJlY3RvcnkKLQkgIGhhcyBiZWVuIHJlY29uZmlndXJlZCBmb3IgYSBkaWZmZXJlbnQgaG9zdC4gIFRoaXMgY2hhbmdlCi0JICBwcmV2ZW50cyB0aG9zZSBkaXJlY3RvcmllcyBmcm9tIHJlbWFraW5nIGV2ZXJ5dGhpbmcgaW4gdGhlIGNhc2UKLQkgIHdoZXJlIHRoZSByZWNvbmZpZyB3YXMgb25seSBpbnRlbmRlZCB0byByZWJ1aWxkIGEgTWFrZWZpbGUuCi0KLQkqIGNvbmZpZ3VyZTogdGVzdCBmb3IgY29uZmlnLnN1YiB3aXRoICJjb25maWcuc3ViIHN1bjQiIHJhdGhlcgotCSAgdGhhbiAiY29uZmlnLnN1YiAke2hvc3RfYWxpYXN9Ii4gIE90aGVyd2lzZSB3ZSBjYW4ndCB0ZWxsIGEgYmFkCi0JICBob3N0IGFsaWFzIGZyb20gYSBtaXNzaW5nIGNvbmZpZy5zdWIuCi0KLU1vbiBBcHIgMjAgMTg6MTY6MzYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZXhwbGljaXRseSBwYXNzIENGTEFHUyBvbiByZWN1cnNpb24uIG5vIGxvbmdlciBwYXNzCi0JICBNSU5VU19HICh0aGlzIGNhbiBiZSBkb25lIHdpdGggQ0ZMQUdTKS4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1GcmkgQXByIDE3IDE4OjI3OjUxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IG1rZGlyICR7c3ViZGlyfSBhcyBuZWVkZWQuCi0KLVdlZCBBcHIgMTUgMTc6Mzc6MjIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLGNvbmZpZ3VyZS5pbjogYWRkZWQgYXV0b2NvbmYuCi0KLVdlZCBBcHIgMTUgMTc6Mjc6MzQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbm8gbG9uZ2VyIHBhc3MgYWdhaW5zdCBvbiByZWN1cnNpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAuTk9FWFBPUlQ6IHNvIHRoYXQgc3RyYXkgbWFrZWZpbGVfZnJhZwotCSAgZGVmaW5pdGlvbnMgYXJlIG5vdCBpbmhlcml0ZWQuCi0KLQkqIGNvbmZpZ3VyZTogY29ycmVjdCBtYWtlc3JjZGlyIHdoZW4gc3ViZGlyIGlzIC4KLQotVHVlIEFwciAxNCAxMTo1NjowOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQWRkIHN1cHBvcnQgZm9yICdzdWJkaXJzJyB2YXJpYWJsZSwgd2hpY2ggaXMKLQlsaWtlICdjb25maWdkaXJzJywgZXhjZXB0IHRoYXQgY29uZmlndXJlIGRvZXNuJ3QgcmUtaW52b2tlCi0JaXRzZWxmIGZvciBzdWJkaXJzLCBpdCBqdXN0IGNyZWF0ZXMgYSBNYWtlZmlsZSBmb3IgZWFjaCBzdWJkaXIuCi0JKiBjb25maWd1cmUudGV4aTogIERvY3VtZW50IHN1YmRpcnMuCi0KLU1vbiBBcHIgMTMgMTg6NTA6MTYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGZsZXggdG8gY29uZmlnZGlycwotCi1Nb24gQXByIDEzIDE4OjQzOjU1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGNsZWFuLXN0YW1wcyBmcm9tIGNsZWFuLgotCi1TYXQgQXByIDExIDAzOjUyOjAzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgZ2RidGVzdCB0byBjb25maWdkaXJzLgotCi1GcmkgQXByIDEwIDIzOjExOjQ5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBBZGQgbWFjcm8sIGRlZmF1bHQgdG8gLWcsIHBhc3Mgb24KLQl0byByZWN1cnNpdmUgbWFrZXMuCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmV3IG5jcjMwMDAgY29uZmlnLgotCi1XZWQgQXByICA4IDIzOjA4OjEyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHJlZmVyZW5jZXMgdG8gZ2RibS4KLQotVHVlIEFwciAgNyAxNjo0ODoyMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIERvbid0IGNhbm9uaWNhbGl6ZSBvcyB2YWx1ZQotCW5ld3NvcyogdG8gYnNkIChyZWFkbGluZSBuZWVkcyB0byBjaGVjayBmb3IgbmV3c29zKS4KLQkoVGhpcyBmaXggd2FzIGVhcmxpZXIgbWFkZSBKYW4gMzEsIGJ1dCBnb3QgcmUtYnJva2VuLikKLQotTW9uIEFwciAgNiAxNDozNDowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBzY28gaXMgYW4gb3MsIG5vdCBhIHZlbmRvciEKLQotCSogY29uZmlndXJlOiAgUXVvdGUgJCggYmV0dGVyLiAgS2VlcCB2YXJpb3VzIHNoZWxscyBoYXBweS4KLQotVHVlIE1hciAzMSAxNjozMjo1NyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGVsaW1pbmF0ZSBzdGFtcC1maWxlcy4KLQotTW9uIE1hciAzMCAyMjoyMDoyMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBzZW5kX3ByLiAgcmVtb3ZlICJmb3JjZSIgZnJvbSAuc3RtcC1ncHJvZiBydWxlLgotCSAgU3VwcmVzcyBlY2hvaW5nIG9mIGFsbCB0aGUgImlmIFsgLWQgLi4uICQoTUFLRSkiIGxpbmVzLgotCi1XZWQgTWFyIDI1IDE1OjIwOjA0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBmaXggaXJpcy9pcmlzMy4KLQotV2VkIE1hciAyNSAxMDozNDoxOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiByZS1hZGQgLXJtLgotCi1UdWUgTWFyIDI0IDIzOjUwOjE2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYXNrZWZpbGUuaW46IGFkZCAuc3RtcC1yY3MgdG8gYWxsLgotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBnYXMgZnJvbSByczYwMDAgYnVpbGQsIHVzZSBhaXggaG9zdCBmcmFnbWVudC4KLQotTW9uIE1hciAyMyAxOTo0MzozNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBwYXNzIGRvd24gc2l0ZV9vcHRpb24gZHVyaW5nIHJlY3Vyc2lvbi4KLQotVGh1IE1hciAxOSAxNjo0OTozNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLmNyb3NzKTogIEFkZCAuc3RtcC1iZmQgLnN0bXAtcmVhZGxpbmUuCi0KLVdlZCBNYXIgMTggMTU6Mjk6MzMgMTk5MiAgTWlrZSBTdHVtcCAgKG1yc0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IENoYW5nZSBleGVjX3ByZWZpeCBzbyB0aGF0IGl0IHJlYWxseSBkZWZhdWx0cyB0byBwcmVmaXguCi0KLVNhdCBNYXIgMTQgMTc6MjA6MzggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46ICBBZGQgc3VwcG9ydCBmb3IgbW1hbGxvYyBsaWJyYXJ5LgotCi1GcmkgTWFyIDEzIDE4OjQ0OjE4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIHN0bXAgZGVwZW5kZW5jaWVzIGZvciBhIGZldyBtb3JlIHRoaW5ncy4KLQotVGh1IE1hciAxMiAwNDo1NjoyNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGp1c3RlZCBlcnJvciBtZXNzYWdlIG9uIG9iamRpci9zcmNkaXIgY29uZmlndXJlCi0JICBjb2xsaXNpb24sIHBlciBqb2huJ3Mgc3VnZ2VzdGlvbi4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBsaWJpYmVydHkgc3RtcCB0byBhbGwgYW5kIGFsbC5jcm9zcy4KLQotV2VkIE1hciAxMSAwMjowNzo1MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBmb3JjZSBkZXBlbmRlbmNpZXMsIGFkZCBncmVwIHRvIGFsbC4KLQotVHVlIE1hciAxMCAyMTo0OToxOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAbWFycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZHJvcCBmbGV4LiAgbWFrZSBzdGFtcCBmaWxlcyB3b3JrLgotCi0JKiBjb25maWd1cmU6IGFkZGVkIHRlc3QgZm9yIGNvbmZsaWN0aW5nIGNvbmZpZ3VyYXRpb24gaW4gc3JjZGlyLAotCSAgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuICBPdGhlcndpc2UgZW1hY3MgZ2RiIG1vZGUKLQkgIGdldHMgY3Jhbmt5LiAgdXNlIHJlbGF0aXZlIHBhdGhzIGZvciBjb25maWd1cmUgYW5kIHNyY2RpcgotCSAgd2hlbmV2ZXIgcG9zc2libGUuICBTZW5kIHNvbWUgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyIHRoYXQgd2VyZQotCSAgZ29pbmcgdG8gc3Rkb3V0LgotCi1UdWUgTWFyIDEwIDE4OjAxOjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEZpeCBsaWJnKysgcnVsZSB0byBjaGVjayBmb3IgZ2NjIGRpcmVjdG9yeQotCWJlZm9yZSB1c2luZyBnY2MvZ2NjLiAgQWxzbyBwYXNzIFhUUkFGTEFHUy4KLQotVGh1IE1hciAgNSAyMTo0NTowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3RtcC1maWxlcyBzbyB0aGF0IGRpcmVjdG9yaWVzIGFyZW4ndCBwb2xsZWQKLQkgIHdoZW4gdGhleSBhcmUgYWxyZWFkeSBidWlsdC4KLQotCSogY29uZmlndXJlLnRleGk6IGZpeGVkIGEgbm9kZSBwb2ludGVyIHByb2JsZW0uCi0KLVRodSBNYXIgIDUgMTI6MDU6NTggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiBjb25maWd1cmUuaW4gY29uZmlnL21oLWlyaXg0IGdkYi9jb25maWd1cmUuaW4KLQlnZGIvbWlwcy10ZGVwLmMgZ2RiL21pcHNyZWFkLmMgZ2RiL3Byb2Nmcy5jIGdkYi9zaWduYW1lLmgKLQlnZGIvdG0taXJpeDMuaCBnZGIvdG0tbWlwcy5oIGdkYi94bS1pcml4NC5oIGdkYi9jb25maWcvbXQtaXJpeDMKLQlnZGIvY29uZmlnL21oLWlyaXg0IHRleGluZm8vY29uZmlndXJlLmluOiAgUG9ydCB0byBTR0kgSXJpeC00LnguCi0KLVdlZCBNYXIgIDQgMDI6NTc6NDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IC1yZWN1cnJpbmcgYmVjb21lcyAtc2lsZW50LiAgY29ycmVjdGVkIGhlbHAgbWVzc2FnZQotCSAgZm9yIC1zaXRlPSBvcHRpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBta2RpciAkKGV4ZWNfcHJlZml4KSBhbmQgJCh0b29sZGlyKS4KLQotVHVlIE1hciAgMyAxNDo1MToyMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogd2hlbiBidWlsZGluZyBNYWtlZmlsZSBmb3IgY3Jvc3NlcywgcmVwbGFjZQotCSAgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguICBkZWZhdWx0IHNyY2RpciBmcm9tIGxvY2F0aW9uIG9mCi0JICBjb25maWcuc3ViLiAgcmVtb3ZlICJmb3IgaG9zdCBpbiBob3N0cyIgYW5kICJmb3IgdGFyZ2V0IGluCi0JICB0YXJnZXRzIiBsb29wcy4KLQotV2VkIEZlYiAyNiAxOTo0ODoyNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBEbyBub3QgcGFzcyBiaW5kaXIgb3IgbWFuZGlyIHRvIGN2cy4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiByZW1vdmUgbW9zdCByZWZlcmVuY2VzIHRvIG11bHRpcGxlIGhvc3RzLAotCSAgbXVsdGlwbGUgdGFyZ2V0cywgc3ViZGlycywgZXRjLgotCi0JKiBjb25maWd1cmUubWFuOiByZW1vdmVkIHJjc2lkLiByZWZlcmVuY2UgY29uZmlnLnN1YiBub3QKLQkgIGNvbmZpZy5zdWJyLgotCi0JKiBNYWtlZmlsZS5pbjogbWtkaXIgJChpbmZvZGlyKSBvbiBpbnN0YWxsLWluZm8uCi0KLVdlZCBGZWIgMTkgMTU6NDE6MTMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiAgRXhwbGFpbiBiZXR0ZXIgYWJvdXQgLmdkYmluaXQgYW5kIGFib3V0Ci0JdGhlIGVudmlyb25tZW50IHRoYXQgY29uZmlndXJlLmluIHNlY3Rpb25zIHJ1biBpbi4KLQotRnJpIEZlYiAgNyAwNzo1NTowMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgVWx0cml4IGlzIG9ubHkgYSBkZWNzdGF0aW9uIGlmIGl0J3MgYSBNSVBTLgotCi1GcmkgSmFuIDMxIDIxOjU0OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBET0MuY29uZmlndXJlID0+IGNmZy1wYXBlci50ZXhpLgotCi1GcmkgSmFuIDMxIDIxOjQ4OjE4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKG5lYXIgY2FzZSAkb3MpOiAgRG9uJ3QgY29udmVydCBuZXdzb3MqIHRvIGJzZCEKLQotRnJpIEphbiAzMSAwMjoyNzozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZWluc3RhbGwgY2hhbmdlIGZyb20gZ2RiLTQuMyB0aGF0IHJlZHVjZXMKLQl0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiBDT1BZSU5HIHRoYXQgZ28gaW50byB0aGUgR0RCIHRhciBmaWxlLgotCi1UaHUgSmFuIDMwIDE2OjE3OjMwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC9jb25maWd1cmUuaW4sIGNvbmZpZy9taC1zY28sIGdkYi9jb25maWcvbWgtaTM4NnNjbywKLQlnZGIvY29uZmlnL210LWkzODZ2MzIsIGdkYi9jb25maWd1cmUuaW4sIHJlYWRsaW5lL2NvbmZpZ3VyZS5pbjoKLQlGaXggU0NPIGNvbmZpZ3VyYXRpb24gc3R1ZmYuCi0KLVR1ZSBKYW4gMjggMjM6NTE6MDcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgRm9yIGxpYmcrKywgbWFrZSBzdXJlIHRoZSAtSSBwb2ludGluZwotCXRvIHRoZSBnY2MgZGlyZWN0b3J5IGdvZXMgKmFmdGVyKiBhbGwgdGhlIGxpYmcrKy1sb2NhbCAtSSBmbGFncy4KLQlBbHNvLCBtb3ZlIGp1c3QtZ2NjIGRlcGVuZGVuY3kgZnJvbSBqdXN0LWxpYmcrKyB0byBhbGwtbGliZysrLgotCi1UdWUgSmFuIDI4IDEyOjU2OjI0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIENoYW5nZSAteCB0byAtZiB0byBrZWVwIFVsdHJpeCAvYmluL3Rlc3QgaGFwcHkuCi0KLVNhdCBKYW4gMTggMTc6NDU6MTEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIFJlbW92ZSB0ZXhpbmZvIHRhcmdldHMuCi0KLVNhdCBKYW4gMTggMTc6MDM6MjEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3RyYXR1cyBjb25maWd1cmF0aW9uIGZyYWdzLiAgQWxzbwotCXN1Ym1pdHRlZCB0byBGU0YuCi0KLVNhdCBKYW4gMTggMTU6MzU6MjkgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVl9TVVBQT1JUKTogIGFkZCBjb25maWd1cmUubWFuLgotCi0JKiBjb25maWcuc3ViKERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMpOiAgYWRkIC1ub25lKi4KLQotRnJpIEphbiAxNyAxNzo1ODowNSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIHJlbW92ZSBmb3JtIGZlZWRzIHRvIG1ha2UgU3VuJ3MgbWFrZSBoYXBweS4KLQkoREVWT19TVVBQT1JUKTogIERPQy5jb25maWd1cmUgPT4gY2ZnLXBhcGVyLnRleGkuCi0KLVNhdCBKYW4gIDQgMTY6MTE6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBNYWtlIHF1aWV0ZXIuCi0KLVRodSBKYW4gIDIgMjI6NTc6MTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBsaWJnKysuCi0JKiBjb25maWd1cmU6ICBXaGVuIHZlcmJvc2UsIGRvbid0IG91dHB1dCB0aGUgY29tbWFuZCBsaW5lIGF0IGVhY2gKLQlsZXZlbDsgaXQgd2lsbCBiZSB1bnJlbWFya2FibHkgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24sCi0Jd2hpY2ggd2lsbCBiZSB0aGUgc2FtZSBhcyB3aGF0IHRoZSB1c2VyIHR5cGVkLgotCi1GcmkgRGVjIDI3IDE2OjI2OjQ3IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBmaXggY2xlYW4taW5mbywgYWRkIGZsZXguICBhZGQKLQkgIGZpbGV1dGlscy4KLQotCSogY29uZmlndXJlOiBiZSBsZXNzIHNlbnNpdGl2ZSB0byBzcGFjZXMgaW4gTWFrZWZpbGUuaW4uICBEbyBub3QKLQkgIGxvb2sgZm9yIHNvdXJjZXMgaW4gIi4uIi4gIERvaW5nIHNvIGJyZWFrcyBzdWJkaXJlY3RvcmllcyB0aGF0Ci0JICBtaWdodCBoYXZlIHRoZWlyIG93biBjb25maWd1cmUuICBJZiBhIHN1YmRpciBoYXMgaXQncyBvd24KLQkgIGNvbmZpZ3VyZSBzY3JpcHQsIHVzZSBpdC4KLQotVGh1IERlYyAyNiAxNjozMDoyNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY2ZnLXBhcGVyLnRleGk6IHNvbWUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgcm1zLgotCi1UaHUgRGVjIDI2IDEwOjEzOjM2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgTWVyZ2UgaW4gc29tZSBzbWFsbCBhZGRpdGlvbnMgZnJvbSB0aGUgRlNGIHZlcnNpb24sCi0JdGFrZW4gZnJvbSB0aGUgZ2NjIGRpc3RyaWJ1dGlvbiwgdG8gYnJpbmcgdGhlIEN5Z251cyBhbmQgRlNGCi0JdmVyc2lvbnMgaW50byBjbG9zZXIgc3luYy4KLQotRnJpIERlYyAyMCAxMTozNDoxOCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlZCBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLVRodSBEZWMgMTkgMTU6NTQ6MjkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgLVYgZm9yIHZlcnNpb24gbnVtYmVyIG9wdGlvbi4KLQotV2VkIERlYyAxOCAxNTozOTozNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogRE9DLmNvbmZpZ3VyZSwgY2ZnLXBhcGVyLnRleGk6IHJldmlzZWQsIHVwZGF0ZWQsIGFuZCB0ZXhpbmZvJ2QuCi0JICByZW5hbWVkIGZyb20gRE9DLmNvbmZpZ3VyZSB0byBjZmctcGFwZXIudGV4aS4KLQotTW9uIERlYyAxNiAyMzowNToxOSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLnN1YnIsIGNvbmZpZy5zdWI6IGNvbmZpZy5zdWJyIGlzIG5vdwotCSAgY29uZmlnLnN1YiBhZ2Fpbi4KLQotRnJpIERlYyAxMyAwMToxNzowNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IG5ldyBmaWxlLCBpbiBwcm9ncmVzcy4KLQotCSogTWFrZWZpbGUuaW46IGJ1aWxkIGluZm8gZmlsZSBhbmQgaW5zdGFsbCB0aGUgbWFuIHBhZ2UgZm9yCi0JICBjb25maWd1cmUuCi0KLQkqIGNvbmZpZ3VyZS5tYW46IG5ldyBmaWxlLCBmaXJzdCBjdXQuCi0KLQkqIGNvbmZpZ3VyZTogZmluZCBjb25maWcuc3ViciBhZ2FpbiBub3cgdGhhdCBjb25maWd1cmF0aW9uICJub25lIgotCSAgaGFzIGdvbmUuICByZW1vdmVkIGFsbCB0cmFjZXMgb2YgdGhlIC1hbnNpIG9wdGlvbi4gIHJlbW92ZWQgYWxsCi0JICB0cmFjZXMgb2YgdGhlIC1sYW5ndWFnZXMgb3B0aW9uLgotCi0JKiBjb25maWcuc3VicjogcmVzeW5jIGZyb20gcm1zLgotCi1XZWQgRGVjIDExIDIyOjI1OjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLCBjb25maWcuc3ViLCBjb25maWcuc3VicjogbWVyZ2UgY29uZmlnLnN1YiBpbnRvCi0JICBjb25maWcuc3ViciwgY2FsbCB0aGUgcmVzdWx0IGNvbmZpZy5zdWJyLCByZW1vdmUgY29uZmlnLnN1YiwgdXNlCi0JICBjb25maWcuc3Vici4KLQotCSogTWFrZWZpbGUuaW46IHJldmlzZWQgaW5zdGFsbCBmb3IgZGlyLmluZm8uCi0KLVR1ZSBEZWMgMTAgMDA6MDQ6MzUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBkZWNzdGF0aW9uIGhvc3QgbWFrZWZpbGUgZnJhZy4KLQotCSogTWFrZWZpbGUuaW46IEJJU09OIG5vdyBiaXNvbiAteSBhZ2Fpbi4gIGFsc28gaW5zdGFsbC1nY2Mgb24KLQkgIGluc3RhbGwuICBjbGVhbi1nZGJtIG9uIGNsZWFuLiAgaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0JICBNYWtlIGRpcmVjdG9yaWVzIGZvciBpbmZvIGluc3RhbGwuICBCdWlsZCBkaXIuaW5mbyBoZXJlIHRoZW4KLQkgIGluc3RhbGwgaXQuCi0KLU1vbiBEZWMgIDkgMTY6NDg6MzMgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IGZvciBiYWQgZGlyZWN0b3J5IHRlc3RzLgotCi1TYXQgRGVjICA3IDAwOjE3OjAxIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBcezEsMlx9IGFwcGVhcnMgdG8gYmUgYSBzeXN2J2lzbS4gIFVzZSBhIGRpZmZlcmVudAotCSAgcmVnZXhwLiAgLXNyY2RpciByZWxhdGl2ZSB3YXMgYmVpbmcgaGFuZGxlZCBpbmNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW46IHVud3JhcHBlZCBzb21lIGZvciBsb29wcyBzbyB0aGF0IHBhcmFsbGVsIG1ha2VzCi0JICB3b3JrIGFnYWluIGFuZCBzbyBvbmUgY2FuIGZvY3VzIG9uZSdzIGF0dGVudGlvbiBvbiBhIHBhcnRpY3VsYXIKLQkgIHBhY2thZ2UuCi0KLUZyaSBEZWMgIDYgMDA6MjI6MDggMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZGVkIFBXRCBhcyBhIHN0YW5kIGluIGZvciBgcHdkYCAoZm9yIHNwZWVkKS4gdXNlCi0JICBlbGlmIHdoZXJldmVyIHBvc3NpYmxlLiAgbWFrZSAtc3JjZGlyIHdvcmsgd2l0aG91dCAtb2JqZGlyLgotCSAgLW9iamRpcj0gY29tbWVudGVkIG91dC4KLQotVGh1IERlYyAgNSAyMjo0Njo1MiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogK29wdGlvbnMgYmVjb21lIC0tb3B0aW9ucy4gIC1zdWJkaXJzIGNvbW1lbnRlZCBvdXQuCi0JICBhZGRlZCAtaG9zdCwgLWRhdGFkaXIuICBSZW5hbWVkIC1kZXN0ZGlyIHRvIC1wcmVmaXguICBDb21tZW50IGluCi0JICBNYWtlZmlsZSBub3cgYXQgdG9wIG9mIGdlbmVyYXRlZCBNYWtlZmlsZS4gIFJlbW92ZWQgY3ZzIGxvZwotCSAgZW50cmllcy4gIGFkZGVkIC1zcmNkaXIuICBjcmVhdGUgLmdkYmluaXQgb25seSBpZiB0aGVyZSBpcyBvbmUKLQkgIGluICR7c3JjZGlyfS4KLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAwNzozODoxMSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIEZyZXNobHkgY3JlYXRlZCBDaGFuZ2VMb2cuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzYKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZTM0YTQuLjAwMDAwMDAKLS0tIGEvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODE4ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIHN1YmRpcnMgdG8gYnVpbGQuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0KLXNyY2RpciA9IC4KLQotcHJlZml4ID0gL3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAkKHByZWZpeCkKLQotYmluZGlyPSR7ZXhlY19wcmVmaXh9L2Jpbgotc2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9zYmluCi1saWJleGVjZGlyPSR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKLWRhdGFkaXI9JHtwcmVmaXh9L3NoYXJlCi1zeXNjb25mZGlyPSR7cHJlZml4fS9ldGMKLXNoYXJlZHN0YXRlZGlyPSR7cHJlZml4fS9jb20KLWxvY2Fsc3RhdGVkaXI9JHtwcmVmaXh9L3ZhcgotbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgotaW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQotb2xkaW5jbHVkZWRpcj0vdXNyL2luY2x1ZGUKLWluZm9kaXI9JHtwcmVmaXh9L2luZm8KLW1hbmRpcj0ke3ByZWZpeH0vbWFuCi1neHhfaW5jbHVkZV9kaXI9JHtpbmNsdWRlZGlyfS9nKysKLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0KQotCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0KLQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9ICQocHJlZml4KS9pbmZvCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLSMgRGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlciBmaW5kcyBleGVjdXRhYmxlcywgbGlicmFyaWVzLCBldGMuCi1saWJzdWJkaXIgPSAkKGxpYmRpcikvZ2NjLWxpYi8kKHRhcmdldF9hbGlhcykvJChnY2NfdmVyc2lvbikKLUdEQl9OTE1fREVQUyA9IAotCi1TSEVMTCA9IC9iaW4vc2gKLQotIyBJTlNUQUxMX1BST0dSQU1fQVJHUyBpcyBjaGFuZ2VkIGJ5IGNvbmZpZ3VyZS5pbiB0byB1c2UgLXggZm9yIGEKLSMgY3lnd2luIGhvc3QuCi1JTlNUQUxMX1BST0dSQU1fQVJHUyA9Ci0KLUlOU1RBTEwgPSAkKFNIRUxMKSAkJHMvaW5zdGFsbC1zaCAtYwotSU5TVEFMTF9QUk9HUkFNID0gJChJTlNUQUxMKSAkKElOU1RBTExfUFJPR1JBTV9BUkdTKQotSU5TVEFMTF9TQ1JJUFQgPSAkKElOU1RBTEwpCi1JTlNUQUxMX0RBVEEgPSAkKElOU1RBTEwpIC1tIDY0NAotCi1JTlNUQUxMX0RPU1JFTCA9IGluc3RhbGwtZG9zcmVsLWZha2UKLQotQVMgPSBhcwotQVIgPSBhcgotQVJfRkxBR1MgPSByYwotQ0MgPSBjYwotCi0jIFNwZWNpYWwgdmFyaWFibGVzIHBhc3NlZCBkb3duIGluIEVYVFJBX0dDQ19GTEFHUy4gIFRoZXkgYXJlIGRlZmluZWQKLSMgaGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnkgTWFrZWZpbGUgZnJhZ21lbnRzLgotSE9TVF9DQyA9ICQoQ0NfRk9SX0JVSUxEKQotSE9TVF9QUkVGSVggPSAKLUhPU1RfUFJFRklYXzEgPSBsb3Nlci0KLQotIyBUaGVzZSBmbGFnIHZhbHVlcyBhcmUgbm9ybWFsbHkgb3ZlcnJpZGRlbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KLUNGTEFHUyA9IC1nCi1DWFhGTEFHUyA9IC1nIC1PMgotCi1MREZMQUdTID0gCi1MSUJDRkxBR1MgPSAkKENGTEFHUykKLUNGTEFHU19GT1JfVEFSR0VUID0gJChDRkxBR1MpCi1MREZMQUdTX0ZPUl9UQVJHRVQgPSAKLUxJQkNGTEFHU19GT1JfVEFSR0VUID0gJChDRkxBR1NfRk9SX1RBUkdFVCkKLVBJQ0ZMQUcgPSAKLVBJQ0ZMQUdfRk9SX1RBUkdFVCA9IAotCi1DSElMTEZMQUdTID0gJChDRkxBR1MpCi1DSElMTF9MSUIgPSAtbGNoaWxsCi1DWFggPSBjKysKLQotIyBVc2UgLU8yIHRvIHN0cmVzcyB0ZXN0IHRoZSBjb21waWxlci4KLUxJQkNYWEZMQUdTID0gJChDWFhGTEFHUykgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMgLWZleGNlcHRpb25zCi1DWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHUykKLUxJQkNYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTX0ZPUl9UQVJHRVQpIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIC1mZXhjZXB0aW9ucwotCi1SQU5MSUIgPSByYW5saWIKLQotRExMVE9PTCA9IGRsbHRvb2wKLVdJTkRSRVMgPSB3aW5kcmVzCi0KLU5NID0gbm0KLQotTEQgPSBsZAotCi1CWklQUFJPRyA9IGJ6aXAyCi0KLSMgVGhlc2UgdmFsdWVzIGFyZSBzdWJzdGl0dXRlZCBieSBjb25maWd1cmUuCi1ERUZBVUxUX1lBQ0MgPSB5YWNjCi1ERUZBVUxUX0xFWCA9IGxleAotREVGQVVMVF9NNCA9IG00Ci0KLUJJU09OID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLUwgJCRzL2Jpc29uLyA7IFwKLQkgZWxzZSBcCi0JICAgIGVjaG8gYmlzb24gOyBcCi0JIGZpYAotCi1ZQUNDID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLXkgLUwgJCRzL2Jpc29uLyA7IFwKLQllbGlmIFsgLWYgJCRyL2J5YWNjL2J5YWNjIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYnlhY2MvYnlhY2MgOyBcCi0JZWxzZSBcCi0JICAgIGVjaG8gJHtERUZBVUxUX1lBQ0N9IDsgXAotCWZpYAotCi1MRVggPSBgaWYgWyAtZiAkJHIvZmxleC9mbGV4IF0gOyBcCi0JdGhlbiBlY2hvICQkci9mbGV4L2ZsZXggOyBcCi0JZWxzZSBlY2hvICR7REVGQVVMVF9MRVh9IDsgZmlgCi0KLU00ID0gYGlmIFsgLWYgJCRyL200L200IF0gOyBcCi0JdGhlbiBlY2hvICQkci9tNC9tNCA7IFwKLQllbHNlIGVjaG8gJHtERUZBVUxUX000fSA7IGZpYAotCi1NQUtFSU5GTyA9IGBpZiBbIC1mICQkci90ZXhpbmZvL21ha2VpbmZvL01ha2VmaWxlIF0gOyBcCi0JdGhlbiBlY2hvICQkci90ZXhpbmZvL21ha2VpbmZvL21ha2VpbmZvIDsgXAotCWVsc2UgZWNobyBtYWtlaW5mbyA7IGZpYAotCi0jIFRoaXMganVzdCBiZWNvbWVzIHBhcnQgb2YgdGhlIE1BS0VJTkZPIGRlZmluaXRpb24gcGFzc2VkIGRvd24gdG8KLSMgc3ViLW1ha2VzLiAgSXQgbGV0cyBmbGFncyBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIHdoaWxlIHN0aWxsCi0jIHVzaW5nIHRoZSBtYWtlaW5mbyBmcm9tIHRoZSBvYmplY3QgdHJlZS4KLU1BS0VJTkZPRkxBR1MgPQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvZXhwZWN0L2V4cGVjdCBdIDsgXAotCXRoZW4gZWNobyAkJHIvZXhwZWN0L2V4cGVjdCA7IFwKLQllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHMvZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQkcy9kZWphZ251L3J1bnRlc3QgOyBcCi0JZWxzZSBlY2hvIHJ1bnRlc3QgOyBmaWAKLQotCi0jIGNvbXBpbGVycyB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIG11c3QgYmUgcnVuIGluIHRoZSBidWlsZAotIyBlbnZpcm9ubWVudC4KLUNDX0ZPUl9CVUlMRCA9ICQoQ0MpCi1DWFhfRk9SX0JVSUxEID0gJChDWFgpCi0KLVNVQkRJUlMgPSAidGhpcyBpcyBzZXQgdmlhIGNvbmZpZ3VyZSwgZG9uJ3QgZWRpdCB0aGlzIgotT1RIRVJTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hpY2gKLSMgc2hvdWxkIGJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCi0KLQotVEFSR0VUX0NPTkZJR0RJUlMgPSBsaWJpYmVydHkgbGliZ2xvc3MgJChTUEVDSUFMX0xJQlMpIG5ld2xpYiBsaWJpbyBsaWJyeCBsaWJzdGRjKysgbGliZysrIHdpbnN1cCBvcGNvZGVzIGJzcCBsaWJzdHViIGN5Z21vbgotCi0jIFRhcmdldCBsaWJyYXJpZXMgYXJlIHB1dCB1bmRlciB0aGlzIGRpcmVjdG9yeToKLSMgQ2hhbmdlZCBieSBjb25maWd1cmUgdG8gJCh0YXJnZXRfYWxpYXMpIGlmIGNyb3NzLgotVEFSR0VUX1NVQkRJUiA9IC4KLQotIyBUaGlzIGlzIHNldCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBjb25maWd1cmUuCi1DT05GSUdfQVJHVU1FTlRTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgY29uZmlndXJlIHRvIFJFQUxMWV9TRVRfTElCX1BBVEggaWYgLS1lbmFibGUtc2hhcmVkCi0jIHdhcyB1c2VkLgotU0VUX0xJQl9QQVRIID0KLQotIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2VkIGZvciB0aGUgcGF0aCB0bwotIyB0aGUgbGlicmFyaWVzLiAgVGhpcyBtYXkgYmUgY2hhbmdlZCBieSBjb25maWd1cmUuaW4uCi1SUEFUSF9FTlZWQVIgPSBMRF9MSUJSQVJZX1BBVEgKLQotIyBjb25maWd1cmUuaW4gc2V0cyBTRVRfTElCX1BBVEggdG8gdGhpcyBpZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHVzZWQuCi1SRUFMTFlfU0VUX0xJQl9QQVRIID0gXAotICBpZiBbIHgiJCQkKFJQQVRIX0VOVlZBUikiICE9IHggXTsgdGhlbiBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM6JCQkKFJQQVRIX0VOVlZBUik7IFwKLSAgZWxzZSBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM7IFwKLSAgZmk7IFwKLSAgZXhwb3J0ICQoUlBBVEhfRU5WVkFSKTsKLQotQUxMID0gYWxsLm5vcm1hbAotSU5TVEFMTF9UQVJHRVQgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotSU5TVEFMTF9UQVJHRVRfQ1JPU1MgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MtY3Jvc3MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgY2FzZSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgaW4gXAotICAgICAgICBpWzM0NTZdODYtKi1jeWd3aW4qKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtQiQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi8gLUwkJHIvJChUQVJHRVRfU1VCRElSKS93aW5zdXAgLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL3dpbnN1cC9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luMzIgLW5vc3RkaW5jOyBcCi0gICAgICAgICAgOzsgXAotICAgICAgICAqKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLQkgIDs7IFwKLSAgICAgIGVzYWMgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLSMgSWYgQ0NfRk9SX1RBUkdFVCBpcyBub3Qgb3ZlcnJpZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gdGhpcwotIyB2YXJpYWJsZSBpcyBwYXNzZWQgZG93biB0byB0aGUgZ2NjIE1ha2VmaWxlLCB3aGVyZSBpdCBpcyB1c2VkIHRvCi0jIGJ1aWxkIGxpYmdjYzIuYS4gIFdlIGRlZmluZSBpdCBoZXJlIHNvIHRoYXQgaXQgY2FuIGl0c2VsZiBiZQotIyBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1HQ0NfRk9SX1RBUkdFVCA9ICQkci9nY2MveGdjYyAtQiQkci9nY2MvCi0KLUNISUxMX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLUwkJHIvZ2NjL2NoL3J1bnRpbWUvOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUNYWF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBjYXNlICIkKHRhcmdldF9jYW5vbmljYWwpIiBpbiBcCi0gICAgICAgIGlbMzQ1Nl04Ni0qLWN5Z3dpbiopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1CJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliLyAtTCQkci8kKFRBUkdFVF9TVUJESVIpL3dpbnN1cCAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvd2luc3VwL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4zMiAtbm9zdGRpbmM7IFwKLSAgICAgICAgICA7OyBcCi0gICAgICAgICopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotCSAgOzsgXAotICAgICAgZXNhYyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBjKysgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUFTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2FzL2FzLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvZ2FzL2FzLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUyk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhcyB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUxEX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvbGQvbGQtbmV3IF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9sZC9sZC1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoTEQpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gbGQgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1ETExUT09MX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvZGxsdG9vbCBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvZGxsdG9vbCA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChETExUT09MKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGRsbHRvb2wgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1XSU5EUkVTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvd2luZHJlcyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvd2luZHJlcyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChXSU5EUkVTKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHdpbmRyZXMgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1BUl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL2FyIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy9hciA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhciB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLVJBTkxJQl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL3JhbmxpYiBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvcmFubGliIDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKFJBTkxJQik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyByYW5saWIgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1OTV9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL25tLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvbm0tbmV3IDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKE5NKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIG5tIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotIyBUaGUgZmlyc3QgcnVsZSBpbiB0aGUgZmlsZSBoYWQgYmV0dGVyIGJlIHRoaXMgb25lLiAgRG9uJ3QgcHV0IGFueSBhYm92ZSBpdC4KLSMgVGhpcyBsaXZlcyBoZXJlIHRvIGFsbG93IG1ha2VmaWxlIGZyYWdtZW50cyB0byBjb250YWluIGRlcGVuZGVuY2llcy4KLWFsbDogYWxsLm5vcm1hbAotLlBIT05ZOiBhbGwKLQotIyBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb25maWcvbXQtKi4KLSMgVGhlIF9UQVJHRVRfIGlzIGJlY2F1c2UgdGhleSdyZSBzcGVjaWZpZWQgaW4gbXQtZm9vLgotIyBUaGUgX0hPU1RfIGlzIGJlY2F1c2UgdGhleSdyZSBwcm9ncmFtcyB0aGF0IHJ1biBvbiB0aGUgaG9zdC4KLUVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTID0KLUVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUyA9Ci1FWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTID0KLQotIyMjIyBob3N0IGFuZCB0YXJnZXQgc3BlY2lmaWMgbWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLSMjIwotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBhbGwgc3ViLW1ha2VzLgotIyBQbGVhc2Uga2VlcCB0aGVzZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi1CQVNFX0ZMQUdTX1RPX1BBU1MgPSBcCi0JIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCi0JIkFSX0ZPUl9UQVJHRVQ9JChBUl9GT1JfVEFSR0VUKSIgXAotCSJBU19GT1JfVEFSR0VUPSQoQVNfRk9SX1RBUkdFVCkiIFwKLQkiQklTT049JChCSVNPTikiIFwKLQkiQ0NfRk9SX0JVSUxEPSQoQ0NfRk9SX0JVSUxEKSIgXAotCSJDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAotCSJDRkxBR1NfRk9SX1RBUkdFVD0kKENGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKLQkiQ0hJTExfRk9SX1RBUkdFVD0kKENISUxMX0ZPUl9UQVJHRVQpIiBcCi0JIkNISUxMX0xJQj0kKENISUxMX0xJQikiIFwKLQkiQ1hYX0ZPUl9CVUlMRD0kKENYWF9GT1JfQlVJTEQpIiBcCi0JIkNYWEZMQUdTPSQoQ1hYRkxBR1MpIiBcCi0JIkNYWEZMQUdTX0ZPUl9UQVJHRVQ9JChDWFhGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDWFhfRk9SX1RBUkdFVD0kKENYWF9GT1JfVEFSR0VUKSIgXAotCSJETExUT09MX0ZPUl9UQVJHRVQ9JChETExUT09MX0ZPUl9UQVJHRVQpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCi0JIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLQkiSU5TVEFMTF9TQ1JJUFQ9JChJTlNUQUxMX1NDUklQVCkiIFwKLQkiTERGTEFHUz0kKExERkxBR1MpIiBcCi0JIkxFWD0kKExFWCkiIFwKLQkiTERfRk9SX1RBUkdFVD0kKExEX0ZPUl9UQVJHRVQpIiBcCi0JIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKLQkiTElCQ0ZMQUdTX0ZPUl9UQVJHRVQ9JChMSUJDRkxBR1NfRk9SX1RBUkdFVCkiIFwKLQkiTElCQ1hYRkxBR1M9JChMSUJDWFhGTEFHUykiIFwKLQkiTElCQ1hYRkxBR1NfRk9SX1RBUkdFVD0kKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpIiBcCi0JIk00PSQoTTQpIiBcCi0JIk1BS0U9JChNQUtFKSIgXAotCSJNQUtFSU5GTz0kKE1BS0VJTkZPKSAkKE1BS0VJTkZPRkxBR1MpIiBcCi0JIk5NX0ZPUl9UQVJHRVQ9JChOTV9GT1JfVEFSR0VUKSIgXAotCSJSQU5MSUJfRk9SX1RBUkdFVD0kKFJBTkxJQl9GT1JfVEFSR0VUKSIgXAotCSJSUEFUSF9FTlZWQVI9JChSUEFUSF9FTlZWQVIpIiBcCi0JIlNIRUxMPSQoU0hFTEwpIiBcCi0JIkVYUEVDVD0kKEVYUEVDVCkiIFwKLQkiUlVOVEVTVD0kKFJVTlRFU1QpIiBcCi0JIlJVTlRFU1RGTEFHUz0kKFJVTlRFU1RGTEFHUykiIFwKLQkiVEFSR0VUX1NVQkRJUj0kKFRBUkdFVF9TVUJESVIpIiBcCi0JIldJTkRSRVNfRk9SX1RBUkdFVD0kKFdJTkRSRVNfRk9SX1RBUkdFVCkiIFwKLQkiWUFDQz0kKFlBQ0MpIiBcCi0JImJpbmRpcj0kKGJpbmRpcikiIFwKLQkiZGF0YWRpcj0kKGRhdGFkaXIpIiBcCi0JImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCi0JImluY2x1ZGVkaXI9JChpbmNsdWRlZGlyKSIgXAotCSJpbmZvZGlyPSQoaW5mb2RpcikiIFwKLQkibGliZGlyPSQobGliZGlyKSIgXAotCSJsaWJleGVjZGlyPSQobGliZXhlY2RpcikiIFwKLQkibGlzcGRpcj0kKGxpc3BkaXIpIiBcCi0JImxvY2Fsc3RhdGVkaXI9JChsb2NhbHN0YXRlZGlyKSIgXAotCSJtYW5kaXI9JChtYW5kaXIpIiBcCi0JIm9sZGluY2x1ZGVkaXI9JChvbGRpbmNsdWRlZGlyKSIgXAotCSJwcmVmaXg9JChwcmVmaXgpIiBcCi0JInNiaW5kaXI9JChzYmluZGlyKSIgXAotCSJzaGFyZWRzdGF0ZWRpcj0kKHNoYXJlZHN0YXRlZGlyKSIgXAotCSJzeXNjb25mZGlyPSQoc3lzY29uZmRpcikiIFwKLQkidG9vbGRpcj0kKHRvb2xkaXIpIiBcCi0JImd4eF9pbmNsdWRlX2Rpcj0kKGd4eF9pbmNsdWRlX2RpcikiIFwKLQkiZ2NjX3ZlcnNpb249JChnY2NfdmVyc2lvbikiIFwKLQkiZ2NjX3ZlcnNpb25fdHJpZ2dlcj0kKGdjY192ZXJzaW9uX3RyaWdnZXIpIiBcCi0JInRhcmdldF9hbGlhcz0kKHRhcmdldF9hbGlhcykiIFwKLQkibGlic3ViZGlyPSQobGlic3ViZGlyKSIKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbW9zdCBzdWItbWFrZXMsIGluIHdoaWNoIHdlJ3JlIGJ1aWxkaW5nIHdpdGgKLSMgdGhlIGhvc3QgZW52aXJvbm1lbnQuCi0jIElmIGFueSB2YXJpYWJsZXMgYXJlIGFkZGVkIGhlcmUsIHRoZXkgbXVzdCBiZSBhZGRlZCB0byBkby0qLCBiZWxvdy4KLUVYVFJBX0hPU1RfRkxBR1MgPSBcCi0JJ0FSPSQoQVIpJyBcCi0JJ0FTPSQoQVMpJyBcCi0JJ0NDPSQoQ0MpJyBcCi0JJ0NYWD0kKENYWCknIFwKLQknRExMVE9PTD0kKERMTFRPT0wpJyBcCi0JJ0xEPSQoTEQpJyBcCi0JJ05NPSQoTk0pJyBcCi0JJ1JBTkxJQj0kKFJBTkxJQiknIFwKLQknV0lORFJFUz0kKFdJTkRSRVMpJwotCi1GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfSE9TVF9GTEFHUykKLQotIyBGbGFncyB0aGF0IGFyZSBjb25jZXJuZWQgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIFgxMSBpbmNsdWRlIGZpbGVzCi0jIGFuZCBsaWJyYXJ5IGZpbGVzCi0jCi0jIE5PVEU6IHVudGlsIHRoZSB0b3AtbGV2ZWwgaXMgZ2V0dGluZyB0aGUgdmFsdWVzIHZpYSBhdXRvY29uZiwgaXQgb25seQotIyBjYXVzZXMgcHJvYmxlbXMgdG8gaGF2ZSB0aGlzIHRvcC1sZXZlbCBNYWtlZmlsZSBvdmVycmlkaW5nIHRoZSBhdXRvY29uZi1zZXQKLSMgdmFsdWVzIGluIGNoaWxkIGRpcmVjdG9yaWVzLiAgT25seSB2YXJpYWJsZXMgdGhhdCBkb24ndCBjb25mbGljdCB3aXRoCi0jIGF1dG9jb25mJ2VkIG9uZXMgc2hvdWxkIGJlIHBhc3NlZCBieSBYMTFfRkxBR1NfVE9fUEFTUyBmb3Igbm93LgotIwotWDExX0ZMQUdTX1RPX1BBU1MgPSBcCi0JJ1gxMV9FWFRSQV9DRkxBR1M9JChYMTFfRVhUUkFfQ0ZMQUdTKScgXAotCSdYMTFfRVhUUkFfTElCUz0kKFgxMV9FWFRSQV9MSUJTKScKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbWFrZXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGggdGhlIHRhcmdldCBlbnZpcm9ubWVudC4KLSMgVGhlIGRvdWJsZSAkIGRlY3JlYXNlcyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGxpbmU7IHRoZSB2YXJpYWJsZXMKLSMgYXJlIHNldCBpbiBCQVNFX0ZMQUdTX1RPX1BBU1MsIGFuZCB0aGUgc3ViLW1ha2Ugd2lsbCBleHBhbmQgdGhlbS4KLSMgSWYgYW55IHZhcmlhYmxlcyBhcmUgYWRkZWQgaGVyZSwgdGhleSBtdXN0IGJlIGFkZGVkIHRvIGRvLSosIGJlbG93LgotRVhUUkFfVEFSR0VUX0ZMQUdTID0gXAotCSdBUj0kJChBUl9GT1JfVEFSR0VUKScgXAotCSdBUz0kJChBU19GT1JfVEFSR0VUKScgXAotCSdDQz0kJChDQ19GT1JfVEFSR0VUKScgXAotCSdDRkxBR1M9JCQoQ0ZMQUdTX0ZPUl9UQVJHRVQpJyBcCi0JJ0NYWD0kJChDWFhfRk9SX1RBUkdFVCknIFwKLQknQ1hYRkxBR1M9JCQoQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknRExMVE9PTD0kJChETExUT09MX0ZPUl9UQVJHRVQpJyBcCi0JJ0xEPSQkKExEX0ZPUl9UQVJHRVQpJyBcCi0JJ0xJQkNGTEFHUz0kJChMSUJDRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTElCQ1hYRkxBR1M9JCQoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTk09JCQoTk1fRk9SX1RBUkdFVCknIFwKLQknUkFOTElCPSQkKFJBTkxJQl9GT1JfVEFSR0VUKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknCi0KLVRBUkdFVF9GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfVEFSR0VUX0ZMQUdTKQotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBnY2MuICBnY2MgYnVpbGRzIGEgbGlicmFyeSwgbGliZ2NjLmEsIHNvIGl0Ci0jIHVuZm9ydHVuYXRlbHkgbmVlZHMgdGhlIG5hdGl2ZSBjb21waWxlciBhbmQgdGhlIHRhcmdldCBhciBhbmQKLSMgcmFubGliLgotIyBJZiBhbnkgdmFyaWFibGVzIGFyZSBhZGRlZCBoZXJlLCB0aGV5IG11c3QgYmUgYWRkZWQgdG8gZG8tKiwgYmVsb3cuCi0jIFRoZSBIT1NUXyogdmFyaWFibGVzIGFyZSBhIHNwZWNpYWwgY2FzZSwgd2hpY2ggYXJlIHVzZWQgZm9yIHRoZSBnY2MKLSMgY3Jvc3MtYnVpbGRpbmcgc2NoZW1lLgotRVhUUkFfR0NDX0ZMQUdTID0gXAotCSdBUj0kKEFSKScgXAotCSdBUz0kKEFTKScgXAotCSdDQz0kKENDKScgXAotCSdDWFg9JChDWFgpJyBcCi0JJ0RMTFRPT0w9JCQoRExMVE9PTF9GT1JfVEFSR0VUKScgXAotCSdIT1NUX0NDPSQoQ0NfRk9SX0JVSUxEKScgXAotCSdIT1NUX1BSRUZJWD0kKEhPU1RfUFJFRklYKScgXAotCSdIT1NUX1BSRUZJWF8xPSQoSE9TVF9QUkVGSVhfMSknIFwKLQknTk09JChOTSknIFwKLQknUkFOTElCPSQoUkFOTElCKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknIFwKLQkiR0NDX0ZPUl9UQVJHRVQ9JChHQ0NfRk9SX1RBUkdFVCkiIFwKLQkiYGVjaG8gJ0xBTkdVQUdFUz0kKExBTkdVQUdFUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnU1RNUF9GSVhQUk9UTz0kKFNUTVBfRklYUFJPVE8pJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJTUlUU19IX1RFU1Q9JChMSU1JVFNfSF9URVNUKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSUJHQ0MxX1RFU1Q9JChMSUJHQ0MxX1RFU1QpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfQ0ZMQUdTPSQoTElCR0NDMl9DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfREVCVUdfQ0ZMQUdTPSQoTElCR0NDMl9ERUJVR19DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfSU5DTFVERVM9JChMSUJHQ0MyX0lOQ0xVREVTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdFTlFVSVJFPSQoRU5RVUlSRSknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnQk9PVF9DRkxBR1M9JChCT09UX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIKLQotR0NDX0ZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9HQ0NfRkxBR1MpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUgY29tcGlsZWQKLSMgdXNpbmcgJChGTEFHU19UT19QQVNTKS4KLUFMTF9NT0RVTEVTID0gXAotCWFsbC1hcGFjaGUgXAotCWFsbC1hc2ggXAotCWFsbC1hdXRvY29uZiBcCi0JYWxsLWF1dG9tYWtlIFwKLQlhbGwtYmFzaCBcCi0JYWxsLWJmZCBcCi0JYWxsLWJpbnV0aWxzIFwKLQlhbGwtYmlzb24gXAotCWFsbC1ieWFjYyBcCi0JYWxsLWJ6aXAyIFwKLQlhbGwtY3Zzc3JjIFwKLQlhbGwtZGIgXAotCWFsbC1kZWphZ251IFwKLQlhbGwtZGlmZiBcCi0JYWxsLWRvc3V0aWxzIFwKLQlhbGwtZXRjIFwKLQlhbGwtZmlsZXV0aWxzIFwKLQlhbGwtZmluZHV0aWxzIFwKLQlhbGwtZmluZCBcCi0JYWxsLWZsZXggXAotCWFsbC1nYXMgXAotCWFsbC1nYXdrIFwKLQlhbGwtZ2V0dGV4dCBcCi0JYWxsLWdudXNlcnYgXAotCWFsbC1ncHJvZiBcCi0JYWxsLWdyZXAgXAotCWFsbC1ncmV6IFwKLQlhbGwtZ3ppcCBcCi0JYWxsLWhlbGxvIFwKLQlhbGwtaW5kZW50IFwKLQlhbGwtaW5ldCBcCi0JYWxsLWludGwgXAotCWFsbC1pc3BlbGwgXAotCWFsbC1pdGNsIFwKLQlhbGwtbGQgXAotCWFsbC1saWJndWkgXAotCWFsbC1saWJpYmVydHkgXAotCWFsbC1saWJ0b29sIFwKLQlhbGwtbTQgXAotCWFsbC1tYWtlIFwKLQlhbGwtbW1hbGxvYyBcCi0JYWxsLW9wY29kZXMgXAotCWFsbC1wYXRjaCBcCi0JYWxsLXBlcmwgXAotCWFsbC1wcm1zIFwKLQlhbGwtcmNzIFwKLQlhbGwtcmVhZGxpbmUgXAotCWFsbC1yZWxlYXNlIFwKLQlhbGwtcmVjb2RlIFwKLQlhbGwtc2VkIFwKLQlhbGwtc2VuZC1wciBcCi0JYWxsLXNoZWxsdXRpbHMgXAotCWFsbC1zaW0gXAotCWFsbC10YXIgXAotCWFsbC10Y2wgXAotCWFsbC10Y2w4LjEgXAotCWFsbC10ZXhpbmZvIFwKLQlhbGwtdGV4dHV0aWxzIFwKLQlhbGwtdGdhcyBcCi0JYWxsLXRpbWUgXAotCWFsbC11dWRlY29kZSBcCi0JYWxsLXdkaWZmIFwKLQlhbGwtemlwIFwKLQkkKEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoRkxBR1NfVE9fUEFTUykuCi0jCi0jIFRoZSBsaXN0IGlzIGluIHR3byBwYXJ0cy4gIFRoZSBmaXJzdCBsaXN0cyB0aG9zZSB0b29scyB3aGljaAotIyBhcmUgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIGhvc3QncyBuYXRpdmUgdG9vbC1jaGFpbiwgYW5kIG5vdAotIyB0ZXN0ZWQgaW4gYSBjcm9zcyBjb25maWd1cmF0aW9uLgotTkFUSVZFX0NIRUNLX01PRFVMRVMgPSBcCi0JY2hlY2stYmlzb24gXAotCWNoZWNrLWJ5YWNjIFwKLQljaGVjay1mbGV4IFwKLQljaGVjay16aXAKLQotQ1JPU1NfQ0hFQ0tfTU9EVUxFUyA9IFwKLQljaGVjay1hcGFjaGUgXAotCWNoZWNrLWFzaCBcCi0JY2hlY2stYXV0b2NvbmYgXAotCWNoZWNrLWF1dG9tYWtlIFwKLQljaGVjay1iYXNoIFwKLQljaGVjay1iZmQgXAotCWNoZWNrLWJpbnV0aWxzIFwKLQljaGVjay1iemlwMiBcCi0JY2hlY2stY3Zzc3JjIFwKLQljaGVjay1kYiBcCi0JY2hlY2stZGVqYWdudSBcCi0JY2hlY2stZGlmZiBcCi0JY2hlY2stZXRjIFwKLQljaGVjay1maWxldXRpbHMgXAotCWNoZWNrLWZpbmR1dGlscyBcCi0JY2hlY2stZmluZCBcCi0JY2hlY2stZ2FzIFwKLQljaGVjay1nYXdrIFwKLQljaGVjay1nZXR0ZXh0IFwKLQljaGVjay1nbnVzZXJ2IFwKLQljaGVjay1ncHJvZiBcCi0JY2hlY2stZ3JlcCBcCi0JY2hlY2stZ3ppcCBcCi0JY2hlY2staGVsbG8gXAotCWNoZWNrLWluZGVudCBcCi0JY2hlY2staW5ldCBcCi0JY2hlY2staW50bCBcCi0JY2hlY2staXNwZWxsIFwKLQljaGVjay1pdGNsIFwKLQljaGVjay1sZCBcCi0JY2hlY2stbGliZ3VpIFwKLQljaGVjay1saWJpYmVydHkgXAotCWNoZWNrLWxpYnRvb2wgXAotCWNoZWNrLW00IFwKLQljaGVjay1tYWtlIFwKLQljaGVjay1tbWNoZWNrb2MgXAotCWNoZWNrLW9wY29kZXMgXAotCWNoZWNrLXBhdGNoIFwKLQljaGVjay1wZXJsIFwKLQljaGVjay1wcm1zIFwKLQljaGVjay1yY3MgXAotCWNoZWNrLXJlYWRsaW5lIFwKLQljaGVjay1yZWNvZGUgXAotCWNoZWNrLXNlZCBcCi0JY2hlY2stc2VuZC1wciBcCi0JY2hlY2stc2hlbGx1dGlscyBcCi0JY2hlY2stc2ltIFwKLQljaGVjay10YXIgXAotCWNoZWNrLXRjbCBcCi0JY2hlY2stdGV4aW5mbyBcCi0JY2hlY2stdGV4dHV0aWxzIFwKLQljaGVjay10Z2FzIFwKLQljaGVjay10aW1lIFwKLQljaGVjay11dWRlY29kZSBcCi0JY2hlY2std2RpZmYgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfQ0hFQ0tfTU9EVUxFUykKLQotQ0hFQ0tfTU9EVUxFUz0kKE5BVElWRV9DSEVDS19NT0RVTEVTKSAkKENST1NTX0NIRUNLX01PRFVMRVMpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKEZMQUdTX1RPX1BBU1MpLgotIyBXZSBwdXQgaW5zdGFsbC1vcGNvZGVzIGJlZm9yZSBpbnN0YWxsLWJpbnV0aWxzIGJlY2F1c2UgdGhlIGluc3RhbGxlZAotIyBiaW51dGlscyBtaWdodCBiZSBvbiBQQVRILCBhbmQgdGhleSBtaWdodCBuZWVkIHRoZSBzaGFyZWQgb3Bjb2RlcwotIyBsaWJyYXJ5LgotIyBXZSBwdXQgaW5zdGFsbC10Y2wgYmVmb3JlIGluc3RhbGwtaXRjbCBiZWNhdXNlIGl0Y2wgd2FudHMgdG8gcnVuIGEKLSMgcHJvZ3JhbSBvbiBpbnN0YWxsYXRpb24gd2hpY2ggdXNlcyB0aGUgVGNsIGxpYnJhcmllcy4KLUlOU1RBTExfTU9EVUxFUyA9IFwKLQlpbnN0YWxsLWFwYWNoZSBcCi0JaW5zdGFsbC1hc2ggXAotCWluc3RhbGwtYXV0b2NvbmYgXAotCWluc3RhbGwtYXV0b21ha2UgXAotCWluc3RhbGwtYmFzaCBcCi0JaW5zdGFsbC1iZmQgXAotCWluc3RhbGwtYnppcDIgXAotCWluc3RhbGwtb3Bjb2RlcyBcCi0JaW5zdGFsbC1iaW51dGlscyBcCi0JaW5zdGFsbC1iaXNvbiBcCi0JaW5zdGFsbC1ieWFjYyBcCi0JaW5zdGFsbC1jdnNzcmMgXAotCWluc3RhbGwtZGIgXAotCWluc3RhbGwtZGVqYWdudSBcCi0JaW5zdGFsbC1kaWZmIFwKLQlpbnN0YWxsLWRvc3V0aWxzIFwKLQlpbnN0YWxsLWV0YyBcCi0JaW5zdGFsbC1maWxldXRpbHMgXAotCWluc3RhbGwtZmluZHV0aWxzIFwKLQlpbnN0YWxsLWZpbmQgXAotCWluc3RhbGwtZmxleCBcCi0JaW5zdGFsbC1nYXMgXAotCWluc3RhbGwtZ2F3ayBcCi0JaW5zdGFsbC1nZXR0ZXh0IFwKLQlpbnN0YWxsLWdudXNlcnYgXAotCWluc3RhbGwtZ3Byb2YgXAotCWluc3RhbGwtZ3JlcCBcCi0JaW5zdGFsbC1ncmV6IFwKLQlpbnN0YWxsLWd6aXAgXAotCWluc3RhbGwtaGVsbG8gXAotCWluc3RhbGwtaW5kZW50IFwKLQlpbnN0YWxsLWluZXQgXAotCWluc3RhbGwtaW50bCBcCi0JaW5zdGFsbC1pc3BlbGwgXAotCWluc3RhbGwtdGNsIFwKLQlpbnN0YWxsLXRjbDguMSBcCi0JaW5zdGFsbC1pdGNsIFwKLQlpbnN0YWxsLWxkIFwKLQlpbnN0YWxsLWxpYmd1aSBcCi0JaW5zdGFsbC1saWJpYmVydHkgXAotCWluc3RhbGwtbGlidG9vbCBcCi0JaW5zdGFsbC1tNCBcCi0JaW5zdGFsbC1tYWtlIFwKLQlpbnN0YWxsLW1tYWxsb2MgXAotCWluc3RhbGwtcGF0Y2ggXAotCWluc3RhbGwtcGVybCBcCi0JaW5zdGFsbC1wcm1zIFwKLQlpbnN0YWxsLXJjcyBcCi0JaW5zdGFsbC1yZWFkbGluZSBcCi0JaW5zdGFsbC1yZWNvZGUgXAotCWluc3RhbGwtc2VkIFwKLQlpbnN0YWxsLXNlbmQtcHIgXAotCWluc3RhbGwtc2hlbGx1dGlscyBcCi0JaW5zdGFsbC1zaW0gXAotCWluc3RhbGwtdGFyIFwKLQlpbnN0YWxsLXRleGluZm8gXAotCWluc3RhbGwtdGV4dHV0aWxzIFwKLQlpbnN0YWxsLXRnYXMgXAotCWluc3RhbGwtdGltZSBcCi0JaW5zdGFsbC11dWRlY29kZSBcCi0JaW5zdGFsbC13ZGlmZiBcCi0JaW5zdGFsbC16aXAgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGNvbXBpbGVkCi0jIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQUxMX1gxMV9NT0RVTEVTID0gXAotCWFsbC1lbWFjcyBcCi0JYWxsLWVtYWNzMTkgXAotCWFsbC1nZGIgXAotCWFsbC1leHBlY3QgXAotCWFsbC1nYXNoIFwKLQlhbGwtZ3VpbGUgXAotCWFsbC10Y2xYIFwKLQlhbGwtdGsgXAotCWFsbC10azguMSBcCi0JYWxsLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQ0hFQ0tfWDExX01PRFVMRVMgPSBcCi0JY2hlY2stZW1hY3MgXAotCWNoZWNrLWdkYiBcCi0JY2hlY2stZ3VpbGUgXAotCWNoZWNrLWV4cGVjdCBcCi0JY2hlY2stZ2FzaCBcCi0JY2hlY2stdGNsWCBcCi0JY2hlY2stdGsgXAotCWNoZWNrLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBpbnN0YWxsIHRhcmdldHMgZm9yIGFsbCB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCi1JTlNUQUxMX1gxMV9NT0RVTEVTID0gXAotCWluc3RhbGwtZW1hY3MgXAotCWluc3RhbGwtZW1hY3MxOSBcCi0JaW5zdGFsbC1nZGIgXAotCWluc3RhbGwtZ3VpbGUgXAotCWluc3RhbGwtZXhwZWN0IFwKLQlpbnN0YWxsLWdhc2ggXAotCWluc3RhbGwtdGNsWCBcCi0JaW5zdGFsbC10ayBcCi0JaW5zdGFsbC10azguMSBcCi0JaW5zdGFsbC10aXgKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBjb21waWxlZAotIyB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUFMTF9UQVJHRVRfTU9EVUxFUyA9IFwKLQlhbGwtdGFyZ2V0LWxpYmlvIFwKLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JYWxsLXRhcmdldC1saWJyeCBcCi0JYWxsLXRhcmdldC1saWJnKysgXAotCWFsbC10YXJnZXQtbmV3bGliIFwKLQlhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWFsbC10YXJnZXQtd2luc3VwIFwKLQlhbGwtdGFyZ2V0LWxpYmdsb3NzIFwKLQlhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JYWxsLXRhcmdldC1ncGVyZiBcCi0JYWxsLXRhcmdldC1leGFtcGxlcyBcCi0JYWxsLXRhcmdldC1saWJzdHViIFwKLQlhbGwtdGFyZ2V0LWJzcCBcCi0JYWxsLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY29uZmlndXJlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaAotIyBhcmUgY29tcGlsZWQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyA9IFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmlvIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJyeCBcCi0JY29uZmlndXJlLXRhcmdldC1saWJnKysgXAotCWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmdsb3NzIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY29uZmlndXJlLXRhcmdldC1ncGVyZiBcCi0JY29uZmlndXJlLXRhcmdldC1leGFtcGxlcyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJzdHViIFwKLQljb25maWd1cmUtdGFyZ2V0LWJzcCBcCi0JY29uZmlndXJlLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY2hlY2sgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUNIRUNLX1RBUkdFVF9NT0RVTEVTID0gXAotCWNoZWNrLXRhcmdldC1saWJpbyBcCi0JY2hlY2stdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY2hlY2stdGFyZ2V0LWxpYmcrKyBcCi0JY2hlY2stdGFyZ2V0LW5ld2xpYiBcCi0JY2hlY2stdGFyZ2V0LXdpbnN1cCBcCi0JY2hlY2stdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY2hlY2stdGFyZ2V0LWdwZXJmCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUlOU1RBTExfVEFSR0VUX01PRFVMRVMgPSBcCi0JaW5zdGFsbC10YXJnZXQtbGliaW8gXAotCWluc3RhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JaW5zdGFsbC10YXJnZXQtbGliZysrIFwKLQlpbnN0YWxsLXRhcmdldC1uZXdsaWIgXAotCWluc3RhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWluc3RhbGwtdGFyZ2V0LXdpbnN1cCBcCi0JaW5zdGFsbC10YXJnZXQtbGliZ2xvc3MgXAotCWluc3RhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JaW5zdGFsbC10YXJnZXQtYnNwIFwKLQlpbnN0YWxsLXRhcmdldC1ncGVyZgotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciB3aGljaCB3ZSBjYW4gZG8gYSBjbGVhbi17dGFyZ2V0fS4KLUNMRUFOX01PRFVMRVMgPSBcCi0JY2xlYW4tYXBhY2hlIFwKLQljbGVhbi1hc2ggXAotCWNsZWFuLWF1dG9jb25mIFwKLQljbGVhbi1hdXRvbWFrZSBcCi0JY2xlYW4tYmFzaCBcCi0JY2xlYW4tYmZkIFwKLQljbGVhbi1iaW51dGlscyBcCi0JY2xlYW4tYmlzb24gXAotCWNsZWFuLWJ5YWNjIFwKLQljbGVhbi1iemlwMiBcCi0JY2xlYW4tY3Zzc3JjIFwKLQljbGVhbi1kYiBcCi0JY2xlYW4tZGVqYWdudSBcCi0JY2xlYW4tZGlmZiBcCi0JY2xlYW4tZG9zdXRpbHMgXAotCWNsZWFuLWV0YyBcCi0JY2xlYW4tZmlsZXV0aWxzIFwKLQljbGVhbi1maW5kdXRpbHMgXAotCWNsZWFuLWZpbmQgXAotCWNsZWFuLWZsZXggXAotCWNsZWFuLWdhcyBcCi0JY2xlYW4tZ2F3ayBcCi0JY2xlYW4tZ2V0dGV4dCBcCi0JY2xlYW4tZ251c2VydiBcCi0JY2xlYW4tZ3Byb2YgXAotCWNsZWFuLWdyZXAgXAotCWNsZWFuLWdyZXogXAotCWNsZWFuLWd6aXAgXAotCWNsZWFuLWhlbGxvIFwKLQljbGVhbi1pbmRlbnQgXAotCWNsZWFuLWluZXQgXAotCWNsZWFuLWludGwgXAotCWNsZWFuLWlzcGVsbCBcCi0JY2xlYW4taXRjbCBcCi0JY2xlYW4tbGQgXAotCWNsZWFuLWxpYmd1aSBcCi0JY2xlYW4tbGliaWJlcnR5IFwKLQljbGVhbi1saWJ0b29sIFwKLQljbGVhbi1tNCBcCi0JY2xlYW4tbWFrZSBcCi0JY2xlYW4tbW1hbGxvYyBcCi0JY2xlYW4tb3Bjb2RlcyBcCi0JY2xlYW4tcGF0Y2ggXAotCWNsZWFuLXBlcmwgXAotCWNsZWFuLXBybXMgXAotCWNsZWFuLXJjcyBcCi0JY2xlYW4tcmVhZGxpbmUgXAotCWNsZWFuLXJlbGVhc2UgXAotCWNsZWFuLXJlY29kZSBcCi0JY2xlYW4tc2VkIFwKLQljbGVhbi1zZW5kLXByIFwKLQljbGVhbi1zaGVsbHV0aWxzIFwKLQljbGVhbi1zaW0gXAotCWNsZWFuLXRhciBcCi0JY2xlYW4tdGNsIFwKLQljbGVhbi10ZXhpbmZvIFwKLQljbGVhbi10ZXh0dXRpbHMgXAotCWNsZWFuLXRnYXMgXAotCWNsZWFuLXRpbWUgXAotCWNsZWFuLXV1ZGVjb2RlIFwKLQljbGVhbi13ZGlmZiBcCi0JY2xlYW4temlwCi0KLSMgQWxsIG9mIHRoZSB0YXJnZXQgbW9kdWxlcyB0aGF0IGNhbiBiZSBjbGVhbmVkCi1DTEVBTl9UQVJHRVRfTU9EVUxFUyA9IFwKLQljbGVhbi10YXJnZXQtbGliaW8gXAotCWNsZWFuLXRhcmdldC1saWJzdGRjKysgXAotCWNsZWFuLXRhcmdldC1saWJyeCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmcrKyBcCi0JY2xlYW4tdGFyZ2V0LW5ld2xpYiBcCi0JY2xlYW4tdGFyZ2V0LXdpbnN1cCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmdsb3NzIFwKLQljbGVhbi10YXJnZXQtbGliaWJlcnR5IFwKLQljbGVhbi10YXJnZXQtZ3BlcmYgXAotCWNsZWFuLXRhcmdldC1leGFtcGxlcyBcCi0JY2xlYW4tdGFyZ2V0LWxpYnN0dWIgXAotCWNsZWFuLXRhcmdldC1ic3AgXAotCWNsZWFuLXRhcmdldC1jeWdtb24KLQotIyBBbGwgb2YgdGhlIHgxMSBtb2R1bGVzIHRoYXQgY2FuIGJlIGNsZWFuZWQKLUNMRUFOX1gxMV9NT0RVTEVTID0gXAotCWNsZWFuLWVtYWNzIFwKLQljbGVhbi1lbWFjczE5IFwKLQljbGVhbi1nZGIgXAotCWNsZWFuLWV4cGVjdCBcCi0JY2xlYW4tZ2FzaCBcCi0JY2xlYW4tZ3VpbGUgXAotCWNsZWFuLXRjbFggXAotCWNsZWFuLXRrIFwKLQljbGVhbi10aXgKLQotIyBUaGUgdGFyZ2V0IGJ1aWx0IGZvciBhIG5hdGl2ZSBidWlsZC4KLS5QSE9OWTogYWxsLm5vcm1hbAotYWxsLm5vcm1hbDogXAotCSQoQUxMX01PRFVMRVMpIFwKLQkkKEFMTF9YMTFfTU9EVUxFUykgXAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JYWxsLWdjYwotCi0jIERvIGEgdGFyZ2V0IGZvciBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzLiAgQSBgYG1ha2UgZG8tWCcnIHdpbGwgZG8gYQotIyBgYG1ha2UgWCcnIGluIGFsbCBzdWJkaXJlY3RvcmllcyAoYmVjYXVzZSwgaW4gZ2VuZXJhbCwgdGhlcmUgaXMgYQotIyBkZXBlbmRlbmN5IChiZWxvdykgb2YgWCB1cG9uIGRvLVgsIGEgYGBtYWtlIFgnJyB3aWxsIGFsc28gZG8gdGhpcywKLSMgYnV0IGl0IG1heSBkbyBhZGRpdGlvbmFsIHdvcmsgYXMgd2VsbCkuCi0jIFRoaXMgdGFyZ2V0IGVuc3VyZXMgdGhhdCAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYXBwZWFycyBvbmx5IG9uY2UsCi0jIGJlY2F1c2UgaXQgaXMgc28gbGFyZ2UgdGhhdCBpdCBjYW4gZWFzaWx5IG92ZXJmbG93IHRoZSBjb21tYW5kIGxpbmUKLSMgbGVuZ3RoIGxpbWl0IG9uIHNvbWUgc3lzdGVtcy4KLURPX1ggPSBcCi0JZG8tY2xlYW4gXAotCWRvLWRpc3RjbGVhbiBcCi0JZG8tZHZpIFwKLQlkby1pbmZvIFwKLQlkby1pbnN0YWxsLWluZm8gXAotCWRvLWluc3RhbGxjaGVjayBcCi0JZG8tbW9zdGx5Y2xlYW4gXAotCWRvLW1haW50YWluZXItY2xlYW4gXAotCWRvLVRBR1MKLS5QSE9OWTogJChET19YKQotJChET19YKToKLQlAdGFyZ2V0PWBlY2hvICRAIHwgc2VkIC1lICdzL15kby0vLydgOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQlmb3IgaSBpbiAkKFNVQkRJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgLi8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGNhc2UgJCRpIGluIFwKLQkgICAgZ2NjKSBcCi0JICAgICAgZm9yIGZsYWcgaW4gJChFWFRSQV9HQ0NfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgICopIFwKLQkgICAgICBmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgIGVzYWMgOyBcCi0JICAgIGV4cG9ydCBBUiBBUyBDQyBDWFggTEQgTk0gUkFOTElCIERMTFRPT0wgV0lORFJFUzsgXAotCSAgICBpZiAoY2QgLi8kJGk7IFwKLQkgICAgICAgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKLQkJCSJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAotCQkJIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCi0JCQkiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKLQkJCSQke3RhcmdldH0pOyBcCi0JICAgIHRoZW4gdHJ1ZTsgZWxzZSBleGl0IDE7IGZpOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCUB0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXmRvLS8vJ2A7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWZvciBpIGluICQoVEFSR0VUX0NPTkZJR0RJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAotCQlldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMid8ImA7IFwKLQkgICAgZG9uZTsgXAotCSAgICBleHBvcnQgQVIgQVMgQ0MgQ1hYIExEIE5NIFJBTkxJQiBETExUT09MIFdJTkRSRVM7IFwKLQkgICAgaWYgKGNkICQoVEFSR0VUX1NVQkRJUikvJCRpOyBcCi0JICAgICAgICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCi0JCQkiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKLQkJCSJSQU5MSUI9JCR7UkFOTElCfSIgXAotCQkJIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCi0JCQkkJHt0YXJnZXR9KTsgXAotCSAgICB0aGVuIHRydWU7IGVsc2UgZXhpdCAxOyBmaTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQotIyBIZXJlIGFyZSB0aGUgdGFyZ2V0cyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBkby1YIHRhcmdldHMuCi0KLS5QSE9OWTogaW5mbyBpbnN0YWxsY2hlY2sgZHZpIGluc3RhbGwtaW5mbwotLlBIT05ZOiBjbGVhbiBkaXN0Y2xlYW4gbW9zdGx5Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4KLS5QSE9OWTogbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuIGxvY2FsLW1haW50YWluZXItY2xlYW4KLWluZm86IGRvLWluZm8KLWluc3RhbGxjaGVjazogZG8taW5zdGFsbGNoZWNrCi1kdmk6IGRvLWR2aQotCi0jIE1ha2Ugc3VyZSBtYWtlaW5mbyBpcyBidWlsdCBiZWZvcmUgd2UgZG8gYSBgbWFrZSBpbmZvJy4KLWRvLWluZm86IGFsbC10ZXhpbmZvCi0KLWluc3RhbGwtaW5mbzogZG8taW5zdGFsbC1pbmZvIGRpci5pbmZvCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCWlmIFsgLWYgZGlyLmluZm8gXSA7IHRoZW4gXAotCSAgJChJTlNUQUxMX0RBVEEpIGRpci5pbmZvICQoaW5mb2RpcikvZGlyLmluZm8gOyBcCi0JZWxzZSB0cnVlIDsgZmkKLQotbG9jYWwtY2xlYW46Ci0JLXJtIC1mICouYSBURU1QIGVycnMgY29yZSAqLm8gKn4gXCMqIFRBR1MgKi5FICoubG9nCi0KLWxvY2FsLWRpc3RjbGVhbjoKLQktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgbWgtZnJhZyBtdC1mcmFnCi0JLWlmIFsgIiQoVEFSR0VUX1NVQkRJUikiICE9ICIuIiBdOyB0aGVuIFwKLQkgIHJtIC1yZiAkKFRBUkdFVF9TVUJESVIpOyBcCi0JZWxzZSB0cnVlOyBmaQotCi1sb2NhbC1tYWludGFpbmVyLWNsZWFuOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1jbGVhbjogZG8tY2xlYW4gbG9jYWwtY2xlYW4KLW1vc3RseWNsZWFuOiBkby1tb3N0bHljbGVhbiBsb2NhbC1jbGVhbgotZGlzdGNsZWFuOiBkby1kaXN0Y2xlYW4gbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1tYWludGFpbmVyLWNsZWFuIGRvLW1haW50YWluZXItY2xlYW4gbG9jYWwtY2xlYW4gCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1kaXN0Y2xlYW4KLXJlYWxjbGVhbjogbWFpbnRhaW5lci1jbGVhbgotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNsZWFuIHNwZWNpZmljIG1vZHVsZXMuCi0uUEhPTlk6ICQoQ0xFQU5fTU9EVUxFUykgJChDTEVBTl9YMTFfTU9EVUxFUykgY2xlYW4tZ2NjCi0kKENMRUFOX01PRFVMRVMpICQoQ0xFQU5fWDExX01PRFVMRVMpIGNsZWFuLWdjYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NsZWFuLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2xlYW4pOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotLlBIT05ZOiAkKENMRUFOX1RBUkdFVF9NT0RVTEVTKQotJChDTEVBTl9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jbGVhbi10YXJnZXQtLy8nYDsgXAotCXJtIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBjbGVhbik7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi1jbGVhbi10YXJnZXQ6ICQoQ0xFQU5fVEFSR0VUX01PRFVMRVMpCi0KLSMgQ2hlY2sgdGFyZ2V0LgotCi0uUEhPTlk6IGNoZWNrCi1jaGVjazogJChDSEVDS19NT0RVTEVTKSBcCi0JJChDSEVDS19UQVJHRVRfTU9EVUxFUykgXAotCSQoQ0hFQ0tfWDExX01PRFVMRVMpIFwKLQljaGVjay1nY2MKLQotIyBBdXRvbWF0ZWQgcmVwb3J0aW5nIG9mIHRlc3QgcmVzdWx0cy4KLQotd2FybmluZy5sb2c6IGJ1aWxkLmxvZwotCSQoc3JjZGlyKS9jb250cmliL3dhcm5fc3VtbWFyeSBidWlsZC5sb2cgPiAkQAotCi1tYWlsLXJlcG9ydC5sb2c6Ci0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotbWFpbC1yZXBvcnQtd2l0aC13YXJuaW5ncy5sb2c6IHdhcm5pbmcubG9nCi0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCAtaSB3YXJuaW5nLmxvZyA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotIyBJbnN0YWxsYXRpb24gdGFyZ2V0cy4KLQotLlBIT05ZOiBpbnN0YWxsIGluc3RhbGwtY3Jvc3MgdW5pbnN0YWxsIHNvdXJjZS12YXVsdCBiaW5hcnktdmF1bHQgdmF1bHQtaW5zdGFsbAotaW5zdGFsbDogJChJTlNUQUxMX1RBUkdFVCkgCi1pbnN0YWxsLWNyb3NzOiAkKElOU1RBTExfVEFSR0VUX0NST1NTKSAKLQotdW5pbnN0YWxsOgotCUBlY2hvICJ0aGUgdW5pbnN0YWxsIHRhcmdldCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdHJlZSIKLQotc291cmNlLXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSBzb3VyY2UtdmF1bHQKLQotYmluYXJ5LXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSB0YXJnZXQ9JCh0YXJnZXRfYWxpYXMpCi0KLXZhdWx0LWluc3RhbGw6Ci0JQGlmIFsgLWYgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgXSA7IHRoZW4gXAotCSAgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgJChob3N0X2FsaWFzKSAkKHRhcmdldF9hbGlhcykgOyBcCi0JZWxzZSBcCi0JICB0cnVlIDsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC5hbGwKLWluc3RhbGwuYWxsOiBpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JCXI9YHB3ZGAgOyBleHBvcnQgciA7IFwKLQkJJChTRVRfTElCX1BBVEgpIFwKLQkJKGNkIC4vZ2NjOyBcCi0JCSQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsLWhlYWRlcnMpIDsgXAotCWVsc2UgXAotCQl0cnVlIDsgXAotCWZpCi0KLSMgaW5ldC1pbnN0YWxsIGlzIHVzZWQgYmVjYXVzZSB0aGUgSSpOZXQgd2FudHMgRGVqYUdOVSBpbnN0YWxsZWQgYnV0Ci0jIG5vdCBidWlsdC4gIFNpbWlsYXJseSwgZ3ppcCBpcyBidWlsdCBidXQgbm90IGluc3RhbGxlZC4KLWluZXQtaW5zdGFsbDoKLQkkKE1BS0UpIElOU1RBTExfTU9EVUxFUz0iYGVjaG8gJChJTlNUQUxMX01PRFVMRVMpIHwgc2VkIC1lICdzL2luc3RhbGwtZGVqYWdudS8vJyAtZSAncy9pbnN0YWxsLWd6aXAvLydgIiBpbnN0YWxsCi0KLSMgaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzIGlzIHVzZWQgYmVjYXVzZSBDeWdudXMgY2FuIG5vdCBkaXN0cmlidXRlCi0jIHRoZSBmaXhlZCBoZWFkZXIgZmlsZXMuCi0uUEhPTlk6IGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcwotaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzOiBcCi0JaW5zdGFsbGRpcnMgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JZ2NjLW5vLWZpeGVkaW5jbHVkZXMgCi0KLSMgSW5zdGFsbCB0aGUgZ2NjIGhlYWRlcnMgZmlsZXMsIGJ1dCBub3QgdGhlIGZpeGVkIGluY2x1ZGUgZmlsZXMsCi0jIHdoaWNoIEN5Z251cyBpcyBub3QgYWxsb3dlZCB0byBkaXN0cmlidXRlLiAgVGhpcyBydWxlIGlzIHZlcnkKLSMgZGVwZW5kZW50IG9uIHRoZSB3b3JraW5ncyBvZiB0aGUgZ2NjIE1ha2VmaWxlLmluLgotLlBIT05ZOiBnY2Mtbm8tZml4ZWRpbmNsdWRlcwotZ2NjLW5vLWZpeGVkaW5jbHVkZXM6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICBybSAtcmYgZ2NjL3RtcC1pbmNsdWRlOyBcCi0JICBtdiBnY2MvaW5jbHVkZSBnY2MvdG1wLWluY2x1ZGUgMj4vZGV2L251bGw7IFwKLQkgIG1rZGlyIGdjYy9pbmNsdWRlOyBcCi0JICBjcCAkKHNyY2RpcikvZ2NjL2dzeXNsaW1pdHMuaCBnY2MvaW5jbHVkZS9zeXNsaW1pdHMuaDsgXAotCSAgdG91Y2ggZ2NjL3N0bXAtZml4aW5jIGdjYy9pbmNsdWRlL2ZpeGVkOyBcCi0JICBybSAtZiBnY2Mvc3RtcC1oZWFkZXJzIGdjYy9zdG1wLWludC1oZHJzOyBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgIDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgLi9nY2M7IFwKLQkgICAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JICBybSAtcmYgZ2NjL2luY2x1ZGU7IFwKLQkgIG12IGdjYy90bXAtaW5jbHVkZSBnY2MvaW5jbHVkZSAyPi9kZXYvbnVsbDsgXAotCWVsc2UgdHJ1ZTsgZmkKLQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLiAgVG8KLSMgYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0jCi0jIGFsbC1ndWksIGFuZCBhbGwtbGlicHJvYyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZQotIyB0aGV5IGFyZSBzdGlsbCBleHBlcmltZW50YWwsIGFuZCBpZiB0aGV5IGZhaWwgdG8gYnVpbGQsIHRoYXQKLSMgc2hvdWxkbid0IHN0b3AgIm1ha2UgYWxsIi4KLS5QSE9OWTogJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYwotJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2FsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoZXNlIHJ1bGVzIGFyZSB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBjaGVjay1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgY2hlY2suICBTb21lCi0jIG1vZHVsZXMgYXJlIG9ubHkgdGVzdGVkIGluIGEgbmF0aXZlIHRvb2xjaGFpbi4KLQotLlBIT05ZOiAkKENIRUNLX01PRFVMRVMpICQoTkFUSVZFX0NIRUNLX01PRFVMRVMpICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykKLSQoTkFUSVZFX0NIRUNLX01PRFVMRVMpOgotCUBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotCSAgZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQkgIGlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCSAgZWxzZSBcCi0JICAgIHRydWU7IFwKLQkgIGZpOyBcCi0JZmkKLQotJChDUk9TU19DSEVDS19NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKElOU1RBTExfTU9EVUxFUykKLSQoSU5TVEFMTF9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBidWlsdCB3aXRoIHRoZQotIyB0YXJnZXQgdG9vbHMuCi0uUEhPTlk6ICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKQotJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgJChDQ19GT1JfVEFSR0VUKSAtLXByaW50LW11bHRpLWxpYiA+ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgMj4gL2Rldi9udWxsOyBcCi0JICBpZiBbIC1zICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgXTsgdGhlbiBcCi0JICAgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCBdOyB0aGVuIFwKLQkgICAgICBpZiBjbXAgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ID4gL2Rldi9udWxsOyB0aGVuIFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCSAgICAgIGVsc2UgXAotCQllY2hvICJNdWx0aWxpYnMgY2hhbmdlZCBmb3IgJCR7ZGlyfSwgcmVjb25maWd1cmluZyI7IFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGU7IFwKLQkJbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgICAgZmk7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWZpOyBleGl0IDAJIyBicmVhayBjb21tYW5kIGludG8gdHdvIHBpZWNlcwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAhIC1kICQoVEFSR0VUX1NVQkRJUikgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBlY2hvICIgJChUQVJHRVRfQ09ORklHRElSUykgIiB8IGdyZXAgIiAkJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlmIFsgLWQgJChzcmNkaXIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICAgIFsgLWQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9IF0gfHwgbWtkaXIgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9O1wKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICBBUj0iJChBUl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUjsgXAotCSAgICBBUz0iJChBU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUzsgXAotCSAgICBDQz0iJChDQ19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDQzsgXAotCSAgICBDRkxBR1M9IiQoQ0ZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENGTEFHUzsgXAotCSAgICBDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENYWDsgXAotCSAgICBDWFhGTEFHUz0iJChDWFhGTEFHU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDWFhGTEFHUzsgXAotCSAgICBETExUT09MPSIkKERMTFRPT0xfRk9SX1RBUkdFVCkiOyBleHBvcnQgRExMVE9PTDsgXAotCSAgICBMRD0iJChMRF9GT1JfVEFSR0VUKSI7IGV4cG9ydCBMRDsgXAotICAgICAgICAgICAgTERGTEFHUz0iJChMREZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IExERkxBR1M7IFwKLQkgICAgTk09IiQoTk1fRk9SX1RBUkdFVCkiOyBleHBvcnQgTk07IFwKLQkgICAgUkFOTElCPSIkKFJBTkxJQl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBSQU5MSUI7IFwKLQkgICAgV0lORFJFUz0iJChXSU5EUkVTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IFdJTkRSRVM7IFwKLQkgICAgZWNobyBDb25maWd1cmluZyBpbiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKLQkgICAgY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgIGNhc2UgJChzcmNkaXIpIGluIFwKLQkgICAgLyopIFwKLQkgICAgICB0b3BkaXI9JChzcmNkaXIpIDs7IFwKLQkgICAgKikgXAotCSAgICAgIGNhc2UgIiQoVEFSR0VUX1NVQkRJUikiIGluIFwKLQkgICAgICAuKSB0b3BkaXI9Ii4uLyQoc3JjZGlyKSIgOzsgXAotCSAgICAgICopIHRvcGRpcj0iLi4vLi4vJChzcmNkaXIpIiA7OyBcCi0JICAgICAgZXNhYyA7OyBcCi0JICAgIGVzYWM7IFwKLQkgICAgaWYgWyAiJChzcmNkaXIpIiA9ICIuIiBdIDsgdGhlbiBcCi0JICAgICAgaWYgWyAiJChUQVJHRVRfU1VCRElSKSIgIT0gIi4iIF0gOyB0aGVuIFwKLQkJaWYgJChTSEVMTCkgJCRzL3N5bWxpbmstdHJlZSAkJHt0b3BkaXJ9LyQke2Rpcn0gIm5vLXN1Y2gtZmlsZSIgOyB0aGVuIFwKLQkJICBpZiBbIC1mIE1ha2VmaWxlIF07IHRoZW4gXAotCQkgICAgaWYgJChNQUtFKSBkaXN0Y2xlYW47IHRoZW4gXAotCQkgICAgICB0cnVlOyBcCi0JCSAgICBlbHNlIFwKLQkJICAgICAgZXhpdCAxOyBcCi0JCSAgICBmaTsgXAotCQkgIGVsc2UgXAotCQkgICAgdHJ1ZTsgXAotCQkgIGZpOyBcCi0JCWVsc2UgXAotCQkgIGV4aXQgMTsgXAotCQlmaTsgXAotCSAgICAgIGVsc2UgXAotCQl0cnVlOyBcCi0JICAgICAgZmk7IFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPS4iOyBcCi0JICAgICAgbGlic3JjZGlyPSIuIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSQke3RvcGRpcn0vJCR7ZGlyfSI7IFwKLQkgICAgICBsaWJzcmNkaXI9IiQkcy8kJHtkaXJ9IjsgXAotCSAgICBmaTsgXAotCSAgICBpZiBbIC1mICQke2xpYnNyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHtsaWJzcmNkaXJ9L2NvbmZpZ3VyZSBcCi0JCSQoQ09ORklHX0FSR1VNRU5UUykgJCR7c3JjZGlyb3B0aW9ufSBcCi0JCS0td2l0aC10YXJnZXQtc3ViZGlyPSIkKFRBUkdFVF9TVUJESVIpIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHMvY29uZmlndXJlIFwKLQkJJChDT05GSUdfQVJHVU1FTlRTKSAkJHtzcmNkaXJvcHRpb259IFwKLQkJLS13aXRoLXRhcmdldC1zdWJkaXI9IiQoVEFSR0VUX1NVQkRJUikiOyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIFsgLWYgc2tpcC10aGlzLWRpciBdIDsgdGhlbiBcCi0JICAgICAgc2ggc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIHJtIC1mIHNraXAtdGhpcy1kaXI7IFwKLQkgICAgICBjZCAuLjsgcm1kaXIgJCR7ZGlyfSB8fCB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGVsc2UgXAotCSAgICB0cnVlOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChBTExfVEFSR0VUX01PRFVMRVMpCi0kKEFMTF9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9hbGwtdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07ICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKENIRUNLX1RBUkdFVF9NT0RVTEVTKQotJChDSEVDS19UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay10YXJnZXQtLy8nYDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTskKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTtcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZQotIyBUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYCi0jIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6ICQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykKLSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IGluc3RhbGxkaXJzCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9pbnN0YWxsLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0uUEhPTlk6ICQoQUxMX1gxMV9NT0RVTEVTKQotJChBTExfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvYWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyBcCi0JICAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgY2hlY2stWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChDSEVDS19YMTFfTU9EVUxFUykKLSQoQ0hFQ0tfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogJChJTlNUQUxMX1gxMV9NT0RVTEVTKQotJChJTlNUQUxMX1gxMV9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIGdjYyBpcyB0aGUgb25seSBtb2R1bGUgd2hpY2ggdXNlcyBHQ0NfRkxBR1NfVE9fUEFTUy4KLS5QSE9OWTogYWxsLWdjYwotYWxsLWdjYzoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgQnVpbGRpbmcgR0NDIHVzZXMgc29tZSB0b29scyBmb3IgcmVidWlsZGluZyAic291cmNlIiBmaWxlcwotIyBsaWtlIHRleGluZm8sIGJpc29uL2J5YWNjLCBldGMuICBTbyB3ZSBtdXN0IGRlcGVuZCBvbiB0aG9zZS4KLSMKLSMgV2hpbGUgYnVpbGRpbmcgR0NDLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJ1biB2YXJpb3VzIHRhcmdldAotIyBwcm9ncmFtcyBsaWtlIHRoZSBhc3NlbWJsZXIsIGxpbmtlciwgZXRjLiAgU28gd2UgZGVwZW5kIG9uCi0jIHRob3NlIHRvby4KLSMKLSMgSW4gdGhlb3J5LCBvbiBhbiBTTVAgYWxsIHRob3NlIGRlcGVuZGVuY2llcyBjYW4gYmUgcmVzb2x2ZWQKLSMgaW4gcGFyYWxsZWwuCi0jCi0uUEhPTlk6IGJvb3RzdHJhcCBib290c3RyYXAtbGVhbiBib290c3RyYXAyIGJvb3RzdHJhcDItbGVhbiBib290c3RyYXAzIGJvb3RzdHJhcDMtbGVhbiBib290c3RyYXA0IGJvb3RzdHJhcDQtbGVhbgotYm9vdHN0cmFwIGJvb3RzdHJhcC1sZWFuIGJvb3RzdHJhcDIgYm9vdHN0cmFwMi1sZWFuIGJvb3RzdHJhcDMgYm9vdHN0cmFwMy1sZWFuIGJvb3RzdHJhcDQgYm9vdHN0cmFwNC1sZWFuOiBhbGwtdGV4aW5mbyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIkJvb3RzdHJhcHBpbmcgdGhlIGNvbXBpbGVyIjsgXAotCWNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSAkQAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQljYXNlICIkQCIgaW4gXAotCSAgKmJvb3RzdHJhcDQtbGVhbiApIFwKLQkJCW1zZz0iQ29tcGFyaW5nIHN0YWdlMyBhbmQgc3RhZ2U0IG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlMy1sZWFuIDs7IFwKLQkgICpib290c3RyYXA0ICkgbXNnPSJDb21wYXJpbmcgc3RhZ2UzIGFuZCBzdGFnZTQgb2YgdGhlIGNvbXBpbGVyIjsgXAotCSAgCQljb21wYXJlPWNvbXBhcmUzIDs7IFwKLQkgICotbGVhbiApCW1zZz0iQ29tcGFyaW5nIHN0YWdlMiBhbmQgc3RhZ2UzIG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlLWxlYW4gOzsgXAotCSAgKiApCQltc2c9IkNvbXBhcmluZyBzdGFnZTIgYW5kIHN0YWdlMyBvZiB0aGUgY29tcGlsZXIiOyBcCi0JICAJCWNvbXBhcmU9Y29tcGFyZSA7OyBcCi0JZXNhYzsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiJCRtc2ciOyBcCi0JY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpICQkY29tcGFyZQotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYCA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICJCdWlsZGluZyBydW50aW1lIGxpYnJhcmllcyI7IFwKLQkkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSBhbGwKLQotLlBIT05ZOiBjcm9zcwotY3Jvc3M6IGFsbC10ZXhpbmZvIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgdGhlIEMgYW5kIEMrKyBjb21waWxlciI7IFwKLQljZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgTEFOR1VBR0VTPSJjIGMrKyIKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGAgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgcnVudGltZSBsaWJyYXJpZXMiOyBcCi0JJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYWxsIExBTkdVQUdFUz0iYyBjKysiCi0KLS5QSE9OWTogY2hlY2stZ2NjCi1jaGVjay1nY2M6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MKLWluc3RhbGwtZ2NjOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MtY3Jvc3MKLWluc3RhbGwtZ2NjLWNyb3NzOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBMQU5HVUFHRVM9ImMgYysrIiBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0jIEVYUEVSSU1FTlRBTCBTVFVGRgotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiBpbnN0YWxsLWRvc3JlbAotaW5zdGFsbC1kb3NyZWw6IGluc3RhbGxkaXJzIGluZm8KLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLWluc3RhbGwtZG9zcmVsLWZha2U6Ci0KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiBpbnRlci1kZXBlbmRlbmNpZXMgYW1vbmcgbW9kdWxlcy4KLWFsbC1hcGFjaGU6Ci1hbGwtYXNoOgotYWxsLWF1dG9jb25mOiBhbGwtbTQgYWxsLXRleGluZm8KLWFsbC1hdXRvbWFrZTogYWxsLW00IGFsbC10ZXhpbmZvCi1hbGwtYmFzaDoKLWFsbC1iZmQ6IGFsbC1saWJpYmVydHkgYWxsLWludGwKLWFsbC1iaW51dGlsczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1mbGV4IGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWludGwKLWFsbC1iaXNvbjogYWxsLXRleGluZm8KLWNvbmZpZ3VyZS10YXJnZXQtYnNwOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWJzcDogY29uZmlndXJlLXRhcmdldC1ic3AgYWxsLWdjYyBhbGwtYmludXRpbHMgYWxsLXRhcmdldC1uZXdsaWIKLWFsbC1ieWFjYzoKLWFsbC1iemlwMjoKLWFsbC1jdnNzcmM6Ci1jb25maWd1cmUtdGFyZ2V0LWN5Z21vbjogJChBTExfR0NDKQotYWxsLXRhcmdldC1jeWdtb246IGNvbmZpZ3VyZS10YXJnZXQtY3lnbW9uIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbyBhbGwtdGFyZ2V0LWxpYnN0dWIgYWxsLXRhcmdldC1ic3AKLWFsbC1kYjoKLWFsbC1kZWphZ251OiBhbGwtdGNsIGFsbC1leHBlY3QgYWxsLXRrCi1hbGwtZGlmZjogYWxsLWxpYmliZXJ0eQotYWxsLWVtYWNzOgotYWxsLWVtYWNzMTk6IGFsbC1iaXNvbiBhbGwtYnlhY2MKLWFsbC1ldGM6Ci1jb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWV4YW1wbGVzOiBjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzCi1hbGwtZXhwZWN0OiBhbGwtdGNsIGFsbC10awotYWxsLWZpbGV1dGlsczogYWxsLWxpYmliZXJ0eQotYWxsLWZpbmR1dGlsczoKLWFsbC1maW5kOgotYWxsLWZsZXg6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYwotYWxsLWdhczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1pbnRsCi1hbGwtZ2FzaDogYWxsLXRjbAotYWxsLWdhd2s6Ci1BTExfR0NDID0gYWxsLWdjYwotYWxsLWdjYzogYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLWFsbC1ib290c3RyYXA6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLUdEQl9USyA9IGFsbC10ayBhbGwtdGNsIGFsbC1pdGNsIGFsbC10aXggYWxsLWxpYmd1aQotYWxsLWdkYjogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1tbWFsbG9jIGFsbC1yZWFkbGluZSBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1zaW0gJChnZGJubG1yZXF1aXJlbWVudHMpICQoR0RCX1RLKQotYWxsLWdldHRleHQ6Ci1hbGwtZ251c2VydjoKLWNvbmZpZ3VyZS10YXJnZXQtZ3BlcmY6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtZ3BlcmY6IGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1saWJzdGRjKysKLWFsbC1ncHJvZjogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1pbnRsCi1hbGwtZ3JlejogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzCi1hbGwtZ3VpOiBhbGwtZ2RiIGFsbC1saWJwcm9jIGFsbC10YXJnZXQtbGlicngKLWFsbC1ndWlsZToKLWFsbC1nemlwOiBhbGwtbGliaWJlcnR5Ci1hbGwtaGVsbG86IGFsbC1saWJpYmVydHkKLWFsbC1pbmRlbnQ6Ci1hbGwtaW5ldDogYWxsLXRjbCBhbGwtc2VuZC1wciBhbGwtcGVybAotYWxsLWludGw6Ci1hbGwtaXNwZWxsOiBhbGwtZW1hY3MxOQotYWxsLWl0Y2w6IGFsbC10Y2wgYWxsLXRrIGFsbC10Y2w4LjEgYWxsLXRrOC4xCi1hbGwtbGQ6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1mbGV4IGFsbC1pbnRsCi1jb25maWd1cmUtdGFyZ2V0LWxpYmcrKzogJChBTExfR0NDKSBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1hbGwtdGFyZ2V0LWxpYmcrKzogY29uZmlndXJlLXRhcmdldC1saWJnKysgYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvIGFsbC10YXJnZXQtbGlicnggYWxsLXRhcmdldC1saWJzdGRjKysKLWNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3M6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliZ2xvc3M6IGNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3MgY29uZmlndXJlLXRhcmdldC1uZXdsaWIKLWNvbmZpZ3VyZS10YXJnZXQtbGliaW86ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaW86IGNvbmZpZ3VyZS10YXJnZXQtbGliaW8gYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYgotY2hlY2stdGFyZ2V0LWxpYmlvOgotYWxsLWxpYmd1aTogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEgYWxsLWl0Y2wKLWFsbC1saWJpYmVydHk6Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnJ4OiAkKEFMTF9HQ0MpIGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliCi1hbGwtdGFyZ2V0LWxpYnJ4OiBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKzogJChBTExfR0NDKQotYWxsLXRhcmdldC1saWJzdGRjKys6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbwotY29uZmlndXJlLXRhcmdldC1saWJzdHViOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYnN0dWI6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3R1YgotYWxsLWxpYnRvb2w6Ci1hbGwtbTQ6IGFsbC1saWJpYmVydHkKLWFsbC1tYWtlOiBhbGwtbGliaWJlcnR5Ci1hbGwtbW1hbGxvYzoKLWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliOiAkKEFMTF9HQ0MpCi1jb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXA6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbmV3bGliOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYiBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtdGFyZ2V0LWxpYnRlcm1jYXA6IGNvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcCBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtb3Bjb2RlczogYWxsLWJmZCBhbGwtbGliaWJlcnR5Ci1hbGwtcGF0Y2g6IGFsbC1saWJpYmVydHkKLWFsbC1wZXJsOgotYWxsLXBybXM6IGFsbC1saWJpYmVydHkKLWFsbC1yY3M6Ci1hbGwtcmVhZGxpbmU6Ci1hbGwtcmVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VkOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VuZC1wcjogYWxsLXBybXMKLWFsbC1zaGVsbHV0aWxzOgotYWxsLXNpbTogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1yZWFkbGluZQotYWxsLXRhcjogYWxsLWxpYmliZXJ0eQotYWxsLXRjbDoKLWFsbC10Y2w4LjE6Ci1hbGwtdGNsWDogYWxsLXRjbCBhbGwtdGsKLWFsbC10azogYWxsLXRjbAotYWxsLXRrOC4xOiBhbGwtdGNsOC4xCi1hbGwtdGV4aW5mbzogYWxsLWxpYmliZXJ0eQotYWxsLXRleHR1dGlsczoKLWFsbC10Z2FzOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMKLWFsbC10aW1lOgotYWxsLXRpeDogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEKLWFsbC13ZGlmZjoKLWFsbC10YXJnZXQtd2luc3VwOiBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgY29uZmlndXJlLXRhcmdldC13aW5zdXAKLWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgotYWxsLXV1ZGVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtemlwOgotY29uZmlndXJlLXRhcmdldC1saWJpYmVydHk6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaWJlcnR5OiBjb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtZ2NjIGFsbC1sZCBhbGwtdGFyZ2V0LW5ld2xpYgotYWxsLXRhcmdldDogJChBTExfVEFSR0VUX01PRFVMRVMpCi1pbnN0YWxsLXRhcmdldDogJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKQotIyMjIG90aGVyIHN1cHBvcnRpbmcgdGFyZ2V0cwotCi1NQUtFRElSUz0gXAotCSQocHJlZml4KSBcCi0JJChleGVjX3ByZWZpeCkKLS5QSE9OWTogaW5zdGFsbGRpcnMKLWluc3RhbGxkaXJzOiBta2luc3RhbGxkaXJzCi0JJChTSEVMTCkgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChNQUtFRElSUykKLQotZGlyLmluZm86IGRvLWluc3RhbGwtaW5mbwotCWlmIFsgLWYgJChzcmNkaXIpL3RleGluZm8vZ2VuLWluZm8tZGlyIF0gOyB0aGVuIFwKLQkgICQoc3JjZGlyKS90ZXhpbmZvL2dlbi1pbmZvLWRpciAkKGluZm9kaXIpICQoc3JjZGlyKS90ZXhpbmZvL2Rpci5pbmZvLXRlbXBsYXRlID4gZGlyLmluZm8ubmV3IDsgXAotCSAgbXYgLWYgZGlyLmluZm8ubmV3IGRpci5pbmZvIDsgXAotCWVsc2UgdHJ1ZSA7IFwKLQlmaQotCi1kaXN0OgotCUBlY2hvICJCdWlsZGluZyBhIGZ1bGwgZGlzdHJpYnV0aW9uIG9mIHRoaXMgdHJlZSBpc24ndCBkb25lIgotCUBlY2hvICJ2aWEgJ21ha2UgZGlzdCcuICBDaGVjayBvdXQgdGhlIGV0Yy8gc3ViZGlyZWN0b3J5IiAKLQotZXRhZ3MgdGFnczogVEFHUwotCi0jIFJpZ2h0IG5vdyB0aGlzIGp1c3QgYnVpbGRzIFRBR1MgaW4gZWFjaCBzdWJkaXJlY3RvcnkuICBlbWFjczE5IGhhcyB0aGUKLSMgYWJpbGl0eSB0byB1c2Ugc2V2ZXJhbCB0YWdzIGZpbGVzIGF0IG9uY2UsIHNvIHRoZXJlIGlzIHByb2JhYmx5IG5vIG5lZWQKLSMgdG8gY29tYmluZSB0aGVtIGludG8gb25lIGJpZyBUQUdTIGZpbGUgKGxpa2UgQ1ZTIDEuMyBkb2VzKS4gIFdlIGNvdWxkCi0jIChpZiB3ZSBmZWx0IGxpa2UgaXQpIGhhdmUgdGhpcyBNYWtlZmlsZSB3cml0ZSBhIHBpZWNlIG9mIGVsaXNwIHdoaWNoCi0jIHRoZSB1c2VyIGNvdWxkIGxvYWQgdG8gdGVsbCBlbWFjczE5IHdoZXJlIGFsbCB0aGUgVEFHUyBmaWxlcyB3ZSBqdXN0Ci0jIGJ1aWx0IGFyZS4KLVRBR1M6IGRvLVRBR1MKLQotIyB3aXRoIHRoZSBnbnUgbWFrZSwgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWd1cmUuaW4gJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpICQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIwotIyBTdXBwb3J0IGZvciBidWlsZGluZyBuZXQgcmVsZWFzZXMKLQotIyBGaWxlcyBpbiBkZXZvIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1ERVZPX1NVUFBPUlQ9IFJFQURNRSBNYWtlZmlsZS5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKLQljb25maWcuZ3Vlc3MgY29uZmlnLmlmIGNvbmZpZy5zdWIgY29uZmlnIG1vdmUtaWYtY2hhbmdlIFwKLQltcHctUkVBRE1FIG1wdy1idWlsZC5pbiBtcHctY29uZmlnLmluIG1wdy1jb25maWd1cmUgbXB3LWluc3RhbGwgXAotCUNPUFlJTkcgQ09QWUlORy5MSUIgaW5zdGFsbC1zaCBjb25maWctbWwuaW4gc3ltbGluay10cmVlIFwKLQlta2luc3RhbGxkaXJzIGx0Y29uZmlnIGx0bWFpbi5zaCBtaXNzaW5nIHlsd3JhcAotCi0jIEZpbGVzIGluIGRldm8vZXRjIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1FVENfU1VQUE9SVD0gTWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBzdGFuZGFyZHMudGV4aSBcCi0JbWFrZS1zdGRzLnRleGkgc3RhbmRhcmRzLmluZm8qCi0KLSMgV2hlbiB5b3UgdXNlIGBtYWtlIHNldHVwLWRpcnMnIG9yIGBtYWtlIHRheicgeW91IHNob3VsZCBhbHdheXMgcmVkZWZpbmUKLSMgdGhpcyBtYWNyby4KLVNVUFBPUlRfRklMRVMgPSBsaXN0LW9mLXN1cHBvcnQtZmlsZXMtZm9yLXRvb2wtaW4tcXVlc3Rpb24KLQotLlBIT05ZOiB0YXoKLQotdGF6OiAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSB0ZXhpbmZvL3RleGluZm8udGV4Ci0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gYSBmZXcgcGxhY2VzLgotCXNlZCAtZSAnL15hbGxcLm5vcm1hbDogL3MvXGFsbC10ZXhpbmZvIC8vJyBcCi0JICAgIC1lICcvXglpbnN0YWxsLXRleGluZm8gL2QnIFwKLQk8TWFrZWZpbGUuaW4gPnRtcAotCW12IC1mIHRtcCBNYWtlZmlsZS5pbgotCSMKLQkuL2NvbmZpZ3VyZSBzdW40Ci0JWyAteiAiJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIiBdIFwKLQkgIHx8ICQoTUFLRSkgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIEFMTF9HQ0M9IiIgXAotCSAgICBDQ19GT1JfVEFSR0VUPSIkKENDKSIgQ1hYX0ZPUl9UQVJHRVQ9IiQoQ1hYKSIKLQkjIE1ha2UgbGlua3MsIGFuZCBydW4gIm1ha2UgZGlzdHN0dWZmIiBvciAibWFrZSBpbmZvIiB3aGVuIG5lZWRlZC4KLQlybSAtcmYgcHJvdG8tdG9wbGV2IDsgbWtkaXIgcHJvdG8tdG9wbGV2Ci0Jc2V0IC1lIDsgZGlycz0iJChUT09MKSAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSIgOyBcCi0JZm9yIGQgaW4gJCRkaXJzIDsgZG8gXAotCSAgaWYgWyAtZCAkJGQgXTsgdGhlbiBcCi0JICAgIGlmIFsgISAtZiAkJGQvTWFrZWZpbGUgXSA7IHRoZW4gdHJ1ZSA7IFwKLQkgICAgZWxpZiBncmVwICdeZGlzdHN0dWZmOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkJKGNkICQkZCA7ICQoTUFLRSkgZGlzdHN0dWZmICkgfHwgZXhpdCAxIDsgXAotCSAgICBlbGlmIGdyZXAgJ15pbmZvOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkgICAgICAgIChjZCAkJGQgOyAkKE1BS0UpIGluZm8gKSB8fCBleGl0IDEgOyBcCi0JICAgIGZpIDsgXAotCSAgICBpZiBbIC1kICQkZC9wcm90by0kJGQuZGlyIF07IHRoZW4gXAotCSAgICAgIGxuIC1zIC4uLyQkZC9wcm90by0kJGQuZGlyIHByb3RvLXRvcGxldi8kJGQgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGxuIC1zIC4uLyQkZCBwcm90by10b3BsZXYvJCRkIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgbG4gLXMgLi4vJCRkIHByb3RvLXRvcGxldi8kJGQgOyBmaSA7IFwKLQlkb25lCi0JY2QgZXRjIDsgJChNQUtFKSBpbmZvCi0JJChNQUtFKSBkaXN0Y2xlYW4KLQkjCi0JbWtkaXIgcHJvdG8tdG9wbGV2L2V0YwotCShjZCBwcm90by10b3BsZXYvZXRjOyBcCi0JIGZvciBpIGluICQoRVRDX1NVUFBPUlQpOyBkbyBcCi0JCWxuIC1zIC4uLy4uL2V0Yy8kJGkgLiA7IFwKLQkgZG9uZSkKLQkjCi0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gY29uZmlndXJhYmxlIGRpcnMKLQlybSBwcm90by10b3BsZXYvY29uZmlndXJlLmluCi0Jc2VkIC1lICcvXmhvc3RfdG9vbHM9L3MvdGV4aW5mbyAvLycgXAotCSAgICA8Y29uZmlndXJlLmluID5wcm90by10b3BsZXYvY29uZmlndXJlLmluCi0JIwotCW1rZGlyIHByb3RvLXRvcGxldi90ZXhpbmZvCi0JbG4gLXMgLi4vLi4vdGV4aW5mby90ZXhpbmZvLnRleAkJcHJvdG8tdG9wbGV2L3RleGluZm8vCi0JaWYgdGVzdCAtciB0ZXhpbmZvL3V0aWwvdGV4M3BhdGNoIDsgdGhlbiBcCi0JICBta2RpciBwcm90by10b3BsZXYvdGV4aW5mby91dGlsICYmIFwKLQkgIGxuIC1zIC4uLy4uLy4uL3RleGluZm8vdXRpbC90ZXgzcGF0Y2gJcHJvdG8tdG9wbGV2L3RleGluZm8vdXRpbCA7IFwKLQllbHNlIHRydWU7IGZpCi0JY2htb2QgLVIgb2c9dSAuIHx8IGNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgCi0JaWYgZ3JlcCBBTV9JTklUX0FVVE9NQUtFICQoVE9PTCkvY29uZmlndXJlLmluID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICB2ZXI9YHNlZCA8ICQoVE9PTCkvY29uZmlndXJlLmluIC1uICdzL0FNX0lOSVRfQVVUT01BS0VbXixdKiwgKlwoW14pXSpcKSkvXDEvcCdgOyBcCi0JZWxzZSBcCi0JICB2ZXI9YHNlZCA8JChUT09MKS9NYWtlZmlsZS5pbiAtbiAncy9eVkVSU0lPTiAqPSAqLy9wJ2A7IFwKLQlmaTsgXAotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gZG8tdGFyLWJ6MiBUT09MPSQoVE9PTCkgVkVSPSQkdmVyCi0KLWRvLXRhci1iejI6Ci0JZWNobyAiPT0+IE1ha2luZyAkKFRPT0wpLSQoVkVSKS50YXIuYnoyIgotCS1ybSAtZiAkKFRPT0wpLSQoVkVSKQotCWxuIC1zIHByb3RvLXRvcGxldiAkKFRPT0wpLSQoVkVSKQotCXRhciBjZmggJChUT09MKS0kKFZFUikudGFyICQoVE9PTCktJChWRVIpCi0JJChCWklQUFJPRykgLXYgLTkgJChUT09MKS0kKFZFUikudGFyCi0KLVRFWElORk9fU1VQUE9SVD0gdGV4aW5mby90ZXhpbmZvLnRleAotRElTVF9TVVBQT1JUPSAkKERFVk9fU1VQUE9SVCkgJChURVhJTkZPX1NVUFBPUlQpCi0KLS5QSE9OWTogZ2FzLnRhci5iejIKLUdBU19TVVBQT1JUX0RJUlM9IGJmZCBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcyBta2RlcAotZ2FzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdBU19TVVBQT1JUX0RJUlMpIGdhcwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2FzIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHQVNfU1VQUE9SVF9ESVJTKSIKLQotIyBUaGUgRlNGICJiaW51dGlscyIgcmVsZWFzZSBpbmNsdWRlcyBncHJvZiBhbmQgbGQuCi0uUEhPTlk6IGJpbnV0aWxzLnRhci5iejIKLUJJTlVUSUxTX1NVUFBPUlRfRElSUz0gYmZkIGdhcyBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGxkIGdwcm9mIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcyBta2RlcAotYmludXRpbHMudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoQklOVVRJTFNfU1VQUE9SVF9ESVJTKSBiaW51dGlscwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9YmludXRpbHMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEJJTlVUSUxTX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZ2FzK2JpbnV0aWxzLnRhci5iejIKLUdBU0JfU1VQUE9SVF9ESVJTPSAkKEdBU19TVVBQT1JUX0RJUlMpIGJpbnV0aWxzIGxkIGdwcm9mCi1nYXMrYmludXRpbHMudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoR0FTQl9TVVBQT1JUX0RJUlMpIGdhcwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2FzIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHQVNCX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogbGliZysrLnRhci5iejIKLUxJQkdYWF9TVVBQT1JUX0RJUlM9aW5jbHVkZSBsaWJzdGRjKysgbGliaW8gbGlicnggbGliaWJlcnR5Ci1saWJnKysudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpIGxpYmcrKwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9bGliZysrIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChMSUJHWFhfU1VQUE9SVF9ESVJTKSIKLQotR05BVFNfU1VQUE9SVF9ESVJTPWluY2x1ZGUgbGliaWJlcnR5IHNlbmQtcHIKLWduYXRzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdOQVRTX1NVUFBPUlRfRElSUykgZ25hdHMKLQkkKE1BS0UpIC1mICBNYWtlZmlsZS5pbiB0YXogVE9PTD1nbmF0cyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR05BVFNfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBnZGIudGFyLmJ6MgotR0RCX1NVUFBPUlRfRElSUz0gYmZkIGluY2x1ZGUgbGliaWJlcnR5IG1tYWxsb2Mgb3Bjb2RlcyByZWFkbGluZSBzaW0gdXRpbHMgaW50bAotZ2RiLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdEQl9TVVBQT1JUX0RJUlMpIGdkYgotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2RiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHREJfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBuZXdsaWIudGFyLmJ6MgotTkVXTElCX1NVUFBPUlRfRElSUz1saWJnbG9zcwotIyB0YXogY29uZmlndXJlcyBmb3IgdGhlIHN1bjQgdGFyZ2V0IHdoaWNoIHdvbid0IGNvbmZpZ3VyZSBuZXdsaWIuCi0jIFdlIG5lZWQgbmV3bGliIGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgLmluZm8gZmlsZXMgYXJlIG1hZGUuCi0jIFVuZm9ydHVuYXRlbHksIGl0IGlzIG5vdCBlbm91Z2ggdG8ganVzdCBjb25maWd1cmUgbmV3bGliIHNlcGFyYXRlbHk6Ci0jIHRheiB3aWxsIGJ1aWxkIHRoZSAuaW5mbyBmaWxlcyBidXQgc2luY2UgU1VCRElSUyB3b24ndCBjb250YWluIG5ld2xpYiwKLSMgZGlzdGNsZWFuIHdvbid0IGJlIHJ1biAobGVhdmluZyBNYWtlZmlsZSwgY29uZmlnLnN0YXR1cywgYW5kIHRoZSB0bXAgZmlsZXMKLSMgdXNlZCBpbiBidWlsZGluZyB0aGUgLmluZm8gZmlsZXMsIGVnOiAqLmRlZiwgKi5yZWYpLgotIyBUaGUgcHJvYmxlbSBpc24ndCBzb2x2YWJsZSBob3dldmVyIHdpdGhvdXQgYSBsb3Qgb2YgZXh0cmEgd29yayBiZWNhdXNlCi0jIHRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIHN1YmRpciAkKHRhcmdldF9hbGlhcykgd2hpY2ggZ2V0cyBudWtlZCBkdXJpbmcKLSMgdGhlIG1ha2UgZGlzdGNsZWFuLiAgRm9yIG5vdyBwdW50IG9uIHRoZSBpc3N1ZSBvZiBzaGlwcGluZyBuZXdsaWIgaW5mbyBmaWxlcwotIyB3aXRoIG5ld2xpYiBuZXQgcmVsZWFzZXMgYW5kIHdhaXQgZm9yIGEgZGF5IHdoZW4gc29tZSBuYXRpdmUgdGFyZ2V0IChzdW40PykKLSMgc3VwcG9ydHMgbmV3bGliIChpZiBvbmx5IG1pbmltYWxseSkuCi1uZXdsaWIudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoTkVXTElCX1NVUFBPUlRfRElSUykgbmV3bGliCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1uZXdsaWIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKE5FV0xJQl9TVVBQT1JUX0RJUlMpIiBcCi0JCURFVk9fU1VQUE9SVD0iJChERVZPX1NVUFBPUlQpIENPUFlJTkcuTkVXTElCIiBuZXdsaWIKLQotLk5PRVhQT1JUOgotTUFLRU9WRVJSSURFUz0KLQotIyBlbmQgb2YgTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwZTQzNi4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0JCSAgIFJFQURNRSBmb3IgR05VIGRldmVsb3BtZW50IHRvb2xzCi0KLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHZhcmlvdXMgR05VIGNvbXBpbGVycywgYXNzZW1ibGVycywgbGlua2VycywgCi1kZWJ1Z2dlcnMsIGV0Yy4sIHBsdXMgdGhlaXIgc3VwcG9ydCByb3V0aW5lcywgZGVmaW5pdGlvbnMsIGFuZCBkb2N1bWVudGF0aW9uLgotCi1JZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGFzIHBhcnQgb2YgYSBHREIgcmVsZWFzZSwgc2VlIHRoZSBmaWxlIGdkYi9SRUFETUUuCi1JZiB3aXRoIGEgYmludXRpbHMgcmVsZWFzZSwgc2VlIGJpbnV0aWxzL1JFQURNRTsgIGlmIHdpdGggYSBsaWJnKysgcmVsZWFzZSwKLXNlZSBsaWJnKysvUkVBRE1FLCBldGMuICBUaGF0J2xsIGdpdmUgeW91IGluZm8gYWJvdXQgdGhpcwotcGFja2FnZSAtLSBzdXBwb3J0ZWQgdGFyZ2V0cywgaG93IHRvIHVzZSBpdCwgaG93IHRvIHJlcG9ydCBidWdzLCBldGMuCi0KLUl0IGlzIG5vdyBwb3NzaWJsZSB0byBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBhbmQgYnVpbGQgYSB2YXJpZXR5IG9mCi10b29scyB3aXRoIG9uZSBjb21tYW5kLiAgVG8gYnVpbGQgYWxsIG9mIHRoZSB0b29scyBjb250YWluZWQgaGVyZWluLAotcnVuIHRoZSBgYGNvbmZpZ3VyZScnIHNjcmlwdCBoZXJlLCBlLmcuOgotCi0JLi9jb25maWd1cmUgCi0JbWFrZQotCi1UbyBpbnN0YWxsIHRoZW0gKGJ5IGRlZmF1bHQgaW4gL3Vzci9sb2NhbC9iaW4sIC91c3IvbG9jYWwvbGliLCBldGMpLAotdGhlbiBkbzoKLQltYWtlIGluc3RhbGwKLQotKElmIHRoZSBjb25maWd1cmUgc2NyaXB0IGNhbid0IGRldGVybWluZSB5b3VyIHR5cGUgb2YgY29tcHV0ZXIsIGdpdmUgaXQKLXRoZSBuYW1lIGFzIGFuIGFyZ3VtZW50LCBmb3IgaW5zdGFuY2UgYGAuL2NvbmZpZ3VyZSBzdW40JycuICBZb3UgY2FuCi11c2UgdGhlIHNjcmlwdCBgYGNvbmZpZy5zdWInJyB0byB0ZXN0IHdoZXRoZXIgYSBuYW1lIGlzIHJlY29nbml6ZWQ7IGlmCi1pdCBpcywgY29uZmlnLnN1YiB0cmFuc2xhdGVzIGl0IHRvIGEgdHJpcGxldCBzcGVjaWZ5aW5nIENQVSwgdmVuZG9yLAotYW5kIE9TLikKLQotSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb21waWxlciBvbiB5b3VyIHN5c3RlbSwgaXQgaXMgb2Z0ZW4gYmVzdCB0bwotZXhwbGljaXRseSBzZXQgQ0MgaW4gdGhlIGVudmlyb25tZW50IGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZSwgYW5kIHRvCi1hbHNvIHNldCBDQyB3aGVuIHJ1bm5pbmcgbWFrZS4gIEZvciBleGFtcGxlIChhc3N1bWluZyBzaC9iYXNoL2tzaCk6Ci0KLQlDQz1nY2MgLi9jb25maWd1cmUKLQltYWtlCi0KLUEgc2ltaWxhciBleGFtcGxlIHVzaW5nIGNzaDoKLQotCXNldGVudiBDQyBnY2MKLQkuL2NvbmZpZ3VyZQotCW1ha2UKLQotTXVjaCBvZiB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBlbmNsb3NlZCBpcyBjb3B5cmlnaHQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIG9yCi1DT1BZSU5HLkxJQiBpbiB0aGUgdmFyaW91cyBkaXJlY3RvcmllcywgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0ZXJtcyB1bmRlciB3aGljaCB5b3UgY2FuIGNvcHkgdGhlIGZpbGVzLgotCi1SRVBPUlRJTkcgQlVHUzogQWdhaW4sIHNlZSBnZGIvUkVBRE1FLCBiaW51dGlscy9SRUFETUUsIGV0Yy4sIGZvciBpbmZvCi1vbiB3aGVyZSBhbmQgaG93IHRvIHJlcG9ydCBwcm9ibGVtcy4KZGlmZiAtLWdpdCBhL2JmZC9DT1BZSU5HIGIvYmZkL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvYmZkL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nIGIvYmZkL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNjk0Ni4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2OCArMCwwIEBACi0xOTk5LTEyLTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IERpdmlkZSBSX01JUFNfUEMxNgotCXZhbHVlIGJ5IDQgYmVmb3JlIHN0b3JpbmcgaXQgYmFjayBpbiB0aGUgZmllbGQuICBGcm9tCi0JS291bmRpbnlhLiBLIDxra0BkZGVvcmcuc29mdC5uZXQ+LgotCi1UdWUgTm92IDMwIDIyOjQxOjE0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfYW0zMyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNwdS1tMTAzMDAuYyAoYmZkX2FtMzNfYXJjaCk6IEFkZCB0byB0aGUgbW4xMDMgYXJjaGl0ZWN0dXJlIGxpc3QKLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSBhbTMzIGluc3RydWN0aW9ucy4KLQkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogSGFuZGxlIGFkZGl0aW9uYWwgcmVnaXN0ZXJzIHNhdmVkIGJ5Ci0JbW92bSBvbiB0aGUgYW0zMy4KLQkoZWxmX21uMTAzMDBfbWFjaCk6IEhhbmRsZSBFX01OMTAzMDBfTUFDSF9BTTMzLgotCShfYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBIYW5kbGUgYmZkX21hY2hfYW0zMy4KLQotMTk5OS0xMS0yOSAgSmltIEJsYW5keSAgPGppbWJAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9nZXRfZWxmX3BoZHJzLCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kKTogTmV3Ci0JZnVuY3Rpb25zLgotCSogYmZkLWluMi5oIChiZmRfZ2V0X2VsZl9waGRycywgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCk6IE5ldwotCWRlY2xhcmF0aW9ucy4KLQotMTk5OS0xMS0yNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwpOiBOZXcgcmVsb2NhdGlvbiBmb3IKLQlpbnRlcm5hbCB1c2Ugd2l0aGluIGdhcyBmb3IgYWxwaGEgZXhwbGljaXQgcmVsb2NhdGlvbnMuCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFKTogRGl0dG8uCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYpOiBEaXR0by4KLQkoQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUik6IERpdHRvLgotCShCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1ApOiBEaXR0by4KLQkoQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIKTogRGl0dG8uCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XKTogRGl0dG8uCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jX21hcCk6IEFkZCBtYXBwaW5ncyBmb3IKLQlCRkRfUkVMT0NfQUxQSEFfVVNFUl8qLgotCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotMTk5OS0xMS0yNiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZjb3JlX3JlYWRfbm90ZXMpOiBBZGQgcHJvdG90eXBlIGZvciBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZW5hbWVkIGZyb20gYmZkX3NlY3Rpb25fZnJvbV9waGRyLgotCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZXBsYWNlbWVudCBmdW5jdGlvbiB0aGF0IGNhbGxzCi0JX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciBmb3IgZ2VuZXJpYyBzZWdtZW50IHR5cGVzIGFuZAotCWJhY2tlbmQgZnVjbnRpb24gcG9pbnRlZCB0byBieSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkciBmb3IKLQliYWNrZW5kIHNwZWNpZmljIHNlZ21lbnQgdHlwZXMuCi0JKF9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkcik6IFJlbW92ZSBjYWxsIHRvIGVsZmNvcmVfcmVhZF9ub3RlcywKLQlub3cgY2FsbGVkIGJ5IF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIuICBOb3RlIHRoYXQgdGhpcyBmdW5jCi0JaXMgbm93IGp1c3QgYSBzdHViIGJldHdlZW4gdGhlIGNhbGxlciBhbmQgYmZkX3NlY3Rpb25fZnJvbV9waGRyLgotCQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZnVuY3Rpb24gcG9pbnRlcgotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyLgotCShlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkcik6IEFkZCBwcm90b3R5cGUuCi0JCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBEZWZpbmUgZGVmYXVsdC4KLQkoZWxmTk5fYmVkKTogQWRkIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyLgotCi0xOTk5LTExLTI1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6ICBBZGQKLQlTRUNfQ09ERSBhbmQgU0VDX1JFQURPTkxZIGZsYWdzIHRvIGdsdWUgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLWFybS5oIChiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IEFkZAotCVNFQ19DT0RFIGFuZCBTRUNfUkVBRE9OTFkgZmxhZ3MgdG8gZ2x1ZSBzZWN0aW9ucy4KLQotMTk5OS0xMS0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwbyBpbiBwcmV2aW91cwotCWRlbHRhLiAKLQotMTk5OS0xMS0xOSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX2NwdTMyX3BsdDBfZW50cnkpOiBGaXggZW5jb2RpbmcuCi0JKGVsZl9jcHUzMl9wbHRfZW50cnkpOiBMaWtld2lzZS4KLQotMTk5OS0xMS0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nCi0JZm9yIFJWQSByZWxvY3MuCi0JKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IEluaXRpYWxpc2UgYWRkZW5kIHRvIDAuCi0JU3BlY2lhbCBjYXNlIHByb2Nlc3Npbmcgb2YgUlZBIHJlbG9jLgotCi0xOTk5LTExLTE3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVvcmRlciBjb2xsZWN0IGFuZAotCXR5cGVfY2hhbmdlX29rOyBhZGQgc2lnbl9leHRlbmRfdm1hLgotCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF9zaWduX2V4dGVuZF92bWEpOiBEZWZpbmUuCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3N5bWJvbF9pbik6IE1pbmQgYmUtPnNpZ25fZXh0ZW5kX3ZtYS4KLQkoZWxmX3N3YXBfc2hkcl9pbiwgZWxmX3N3YXBfcGhkcl9pbik6IExpa2V3aXNlLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3NpZ25fZXh0ZW5kX3ZtYSk6IERlZmF1bHQuCi0JKGVsZk5OX2JlZCk6IEZvbGxvdyBzdHJ1dHVyZSBjaGFuZ2VzLgotCi0xOTk5LTExLTA5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9yZWFkKTogQ2hlY2sgcmVzdWx0IG9mIHJlYWQgYWdhaW5zdCBkZXNpcmVkIHJlc3VsdAotCXVzaW5nICE9LCBub3QgPC4KLQkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IGJmZF9lcnJvciBpZiB0aGUgc2VlayBpcwotCWludmFsaWQgY29tcGFyZWQgdG8gdGhlIHNlY3Rpb24gc2l6ZS4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2RlYnVnKTogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGRlYnVnCi0JaW5mb3JtYXRpb24gcmlnaHQgaWYgdGhlcmUgaXMgbm8gZGF0YSBwYXJ0LgotCi1UdWUgTm92ICAyIDAxOjQ0OjQxIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogSW1wcm92ZSBoYW5kbGluZyBvZiBSX0FVWF9VTldJTkQsCi0JUl9MSU5FVEFCLCBSX0xJTkVUQUJfRVNDLCBhbmQgUl9DT01NRU5ULgotCi0xOTk5LTEwLTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBNYWtlIGxhc3RfbG9jYWwgc2lnbmVkLgotCi0xOTk5LTEwLTI3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBNYWtlIHN1cmUgLnN0YWJzdHIgc2VjdGlvbgotCXN0YXJ0cyB3aXRoIGEgemVyby4KLQotU2F0IE9jdCAyMyAxNzozNjoxMiAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmM6IEFkZCBkZWZpbml0aW9ucyBiZmRfbWFjaF9kMTB2LCBiZmRfbWFjaF9kMTB2X3RzMiBhbmQKLSAJYmZkX21hY2hfZDEwdl90czMuCi0JKiBjcHUtZDEwdi5jIChkMTB2X3RzM19pbmZvLCBkMTB2X3RzMl9pbmZvKTogQWRkLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCQotMTk5OS0xMC0xNSAgQW5kcmV3IEhhbGV5ICA8YXBoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMS5jIChwYXJzZV9kaWUpOiBGYWlsIHRvIHBhcnNlIGEgZGllIGlmIGl0cyBsZW5ndGggaXMgemVyby4KLQotU3VuIE9jdCAxNyAxNzoxOTowMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoYmZkX2hwcGFfaW5zbjJmbXQpOiBDaGFuZ2UgdG8gcmV0dXJuIGFuIGludC4KLQotMTk5OS0xMC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IFdoZW4gb3ZlcnJpZGluZyBhIHdlYWsgc3ltYm9sIHdpdGgKLQlhIGRlZmluZWQgc3ltYm9sIGluIGEgc2hhcmVkIGxpYnJhcnksIGNsZWFyIHRoZSBERUZfRFlOQU1JQyBmbGFnCi0JdG9vLgotCi1GcmkgT2N0ICA4IDEzOjAzOjQ1IDE5OTkgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IFJfTUlQU19MSVRFUkFMCi0JcmVsb2NzIGFsc28gbmVlZCB0aGUgR1AgdmFsdWUuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSB1bnBhaXJlZCBMTzE2IHJlbG9jcwotIAlwcm9wZXJseS4gIEhhbmRsZSBzaWduLWV4dGVuc2lvbiBmb3IgUl9NSVBTXzY0IGNvcnJlY3RseS4gIENvcnJlY3QKLSAJdGhlIEdQIHZhbHVlIGZvciBSX01JUFNfTElURVJBTCByZWxvY3MgdG9vLiAgSGFuZGxlCi0JUl9NSVBTXzY0IHJlbG9jcyBwcm9wZXJseSBvbiBiaWctZW5kaWFuIE1JUFMuCi0JKG1pcHNfZWxmX3NpZ25fZXh0ZW5kKTogQmVoYXZlIHByb3Blcmx5IHdpdGggJ2xvbmcgbG9uZycuCi0JKG1pcHNfZWxmX2hpZ2hlc3QpOiBDb3JyZWN0IHR5cG8uCi0KLU1vbiBPY3QgIDQgMTc6NDk6NDUgMTk5OSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LW0zMnIuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IE5ldyBzdGF0aWMgZ2xvYmFsLgotCShiZmRfbTMycl9hcmNoKTogUmVmZXIgdG8gaXQuCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX29iamVjdF9wKTogUmVjb2duaXplIEVfTTMyUlhfQVJDSC4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCShtMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogSGFuZGxlIGJmZF9tYWNoX20zMnJ4LgotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbTMycngpOiBEZWZpbmUgaXQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTE5OTktMDktMjggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGNpc2NvX2NvcmVfdmVjKTogUmVwbGFjZWQgd2l0aCB0d28gbmV3IHZlY3MgLi4uCi0JKGNpc2NvX2NvcmVfYmlnX3ZlYyk6IEFkZCBuZXcgYmlnZW5kaWFuIHZlYy4KLQkoY2lzY29fY29yZV9saXR0bGVfdmVjKTogQWRkIG5ldyBsaXR0bGUgZW5kaWFuIHZlYy4KLQotCSogY2lzY28tY29yZS5jIChDUkFTSF9JTkZPKTogRml4ZWQgb2Zmc2V0IHJlcGxhY2VkIHdpdGggLi4uCi0JKGNyYXNoX2luZm9fbG9jcyk6IEFkZCBhcnJheSBvZiBwb3NzaWJsZSBvZmZzZXRzLgotCShNQVNLX0FERFIpOiBNYXNrIHRvIGFwcGx5IHRvIGNyYXNoIGluZm8gb2Zmc2V0LgotCShjcmFzaGluZm9fZXh0ZXJuYWwpOiBBZGQgdGV4dGJhc2UsIGRhdGFiYXNlLCBic3NiYXNlIGFuZAotCXR1cm4gaW50byBhIHR5cGVkZWYuCi0JKGNpc2NvX2NvcmVfZmlsZV92YWxpZGF0ZSk6IFJlbmFtZWQgZnJvbSBjaXNjb19jb3JlX2ZpbGVfcC4KLQlNYW55IHNtYWxsIGNoYW5nZXMgdG8gYWNjb3VudCBmb3IgYWRkaXRpb25hbCBoYXJkd2FyZSB2ZXJzaW9ucy4KLQlQaWNrIGEgcmVhc29uYWJsZSBzaXplIGZvciAiLnJlZyIgc2VjdGlvbi4gIEFkZCBhICIuY3Jhc2giCi0Jc2VjdGlvbiB0byBhbGxvdyBhY2Nlc3MgdG8gY3Jhc2hpbmZvX2V4dGVybmFsIHN0cnVjdC4KLQkoY2lzY29fY29yZV9maWxlX3ApOiBOZXcgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIHRoYXQKLQlpdGVyYXRlcyBvdmVyIGNyYXNoX2luZm9fbG9jcywgY2FsbGluZyBjaXNjb19jb3JlX2ZpbGVfdmFsaWRhdGUuCi0JKGNpc2NvX2NvcmVfdmVjKTogT2xkIGJpZyBlbmRpYW4gb25seSB2ZWMgcmVwbGFjZWQgd2l0aCAuLi4KLQkoY2lzY29fY29yZV9iaWdfdmVjKTogQWRkIGJpZyBlbmRpYW4gdmVyc2lvbi4KLQkoY2lzY29fY29yZV9saXR0bGVfdmVjKTogQWRkIGxpdHRsZSBlbmRpYW4gdmVyc2lvbi4KLQotCSogY29uZmlndXJlLmluIChjaXNjb19jb3JlX3ZlYyk6IFNwbGl0IHRvIHR3byBuZXcgdmVjdG9ycyAuLi4KLQkoY2lzY29fY29yZV9iaWdfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGNpc2NvX2NvcmVfbGl0dGxlX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY29uZmlnLmJmZCAodGFyZyk6IEZvciBtNjgqLSotYW91dCogdGFyZywgY2hhbmdlIGNpc2NvX2NvcmVfdmVjCi0JdG8gY2lzY29fY29yZV9iaWdfdmVjIGluIHRhcmdfc2VsdmVjcy4KLQotMTk5OS0wOS0yOCAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYpOiBVbnVzZWQsIGRlbGV0ZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsKTogVW51c2VkLCBkZWxldGUuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2dsb2JhbF9nb3QpOiBVbnVzZWQsIGRlbGV0ZS4KLQotMTk5OS0wOS0yNCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBBZGQgdHlwZW5hbWUgdmFyaWFibGUuICBVc2UgcF90eXBlCi0JdG8gaW5pdGlhbGl6ZSBpdCB0byBzb21ldGhpbmcgbWVhbmluZ2Z1bC4gIFRoZW4gdXNlIGl0IHRvIGdlbmVyYXRlCi0JbW9yZSB1c2VmdWwgc2VnbWVudCBuYW1lcy4KLQotU3VuIFNlcCAxOSAxMjoxNjo0NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChOT19QQ1JFTF9NT0RFUyk6IERlZmluZSBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IGRlZmluZQotCVJfU0hPUlRfUENSRUxfTU9ERS4KLQkoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgYm90aCBzaG9ydCBhbmQgbG9uZyBwY3JlbCBicmFuY2hlcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEVsaW1pbmF0ZSByZWR1bmRhbnQgcGNyZWwgbW9kZSByZWxvY3MuICBIYW5kbGUKLQlSX0xPTkdfUENSRUxfTU9ERSBhbmQgUl9TSE9SVF9QQ1JFTF9NT0RFCi0JKiBsaWJocHBhLmggKGRpc19hc3NlbWJsZV8yMik6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2hwcGFfaW5zbjJmbXQpOiBIYW5kbGUgbG9uZyBicmFuY2guCi0KLQkqIGxpYmhwcGEuaCAoYmZkX2hwcGFfaW5zbjJmbXQpOiBEZWNvZGUgYW5kIGhhbmRsZSBmb3JtYXRzIGZvdW5kCi0JaW4gUEEyLjAuCi0KLTE5OTktMDktMTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IFN1cHBvcnQgQkZEX1JFTE9DXzE2LAotCUJGRF9SRUxPQ18xNl9QQ1JFTCwgQkZEX1JFTE9DXzgsIEJGRF9SRUxPQ184X1BDUkVMIHJlbG9jcy4KLQkocmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZSk6IFRpZHkgY29tbWVudHMgYW5kIHdoaXRlc3BhY2UuCi0KLTE5OTktMDktMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IFVuZG8KLQlwcmV2aW91cyBkZWx0YS4gIFNldCBzZWMtPmdjX21hcmsgaW5zdGVhZC4KLQotVGh1IFNlcCAxNiAxMToyMToxMyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfY3B1MzJfcGx0MF9lbnRyeSk6IFVzZSBhMSBpbnN0ZWFkIG9mIGEwLgotCShlbGZfY3B1MzJfcGx0X2VudHJ5KTogTGlrZXdpc2UuCi0KLVRodSBTZXAgMTYgMTA6NDg6MTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVHVybiBvbiBUUkFQTklMLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rKTogSWYgdW5hYmxlIHRvIGZpbmQgX19ncCBpbiB0aGUKLQlzeW1ib2wgdGFibGUsIHRoZW4ganVzdCBjb21wdXRlIGEgc3VpdGFibGUgdmFsdWUgKGJ1dCBkbyBub3QKLQljcmVhdGUgYSBfX2dwIHN5bWJvbCkuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBBbGxvdyB1bmRlZmluZWQKLQlzeW1ib2xzIHdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IENvcnJlY3QgaGFuZGxpbmcgb2YgUENSRUwKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IHVuZGVmaW5lZCBzeW1ib2xzLgotCi0xOTk5LTA5LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBNYXJrCi0JaW50ZXJ3b3JraW5nIHNlY3Rpb25zIGFzIGxpbmtlciBjcmVhdGVkIHNvIHRoYXQgdGhleSB3aWxsIG5vdAotCWJlIHJlbW92ZWQgYnkgZ2FyYmFnZSBjb2xsZWN0aW9uLgotCi1XZWQgU2VwIDE1IDAyOjMxOjU3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGluayk6IFJldmFtcCBfX2dwIGhhbmRsaW5nLgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogQ29uc2lzdGVudGx5IGNyZWF0ZSBhbiBhYnNvbHV0ZQotCWFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLgotCi0xOTk5LTA5LTE0ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChDYW5vbmljYWxpemF0aW9uIG9mIHRhcmdldCBuYW1lcyk6IFJlbW92ZSBhZGRpbmcKLQkke0NPTkZJR19TSEVMTH0gaW4gZnJvbnQgb2YgJGFjX2NvbmZpZ19zdWIsIHNpbmNlIGF1dG9jb25maWcgMi4xNAotCWdlbmVyYXRlcyAkYWNfY29uZmlnX3N1YiB3aXRoIGEgJHtDT05GSUdfU0hFTEx9IGFscmVhZHkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDktMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAoRUxGX01BWFBBR0VTSVpFKTogQ2hhbmdlIHRvIDB4MSAoYXQgcmVxdWVzdCBvZgotCU1pdHN1YmlzaGkpLiAKLQotTW9uIFNlcCAxMyAyMDowMTo0NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3JlY29yZF9zZWdtZW50X2FkZHJzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaHBwYV9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSB0ZXh0X3NlZ21lbnRfYmFzZSBhbmQKLQlkYXRhX3NlZ21lbnRfYmFzZS4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBTRUdSRUwgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIEhPV1RPLgotCi0xOTk5LTA5LTEzICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgQ09NREFUCi0JaGFuZGxpbmcgdG8gc3VwcG9ydCBib3RoIEdOVSBhbmQgTVMgb2JqZWN0cy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjaGVjayByZWxvY19jb3VudAotCXdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byBzZXQgRl9SRUxGTEcuCi0KLTE5OTktMDktMTMgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEb24ndCByYW5nZS1jaGVjawotCVBDMjQgcmVsb2NzIGlmIHRoZSB0YXJnZXQgaXMgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCShhcm1fYWRkX3RvX3JlbCk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCShlbGYzMl9hcm1fcGx0MF9lbnRyeSk6IENvcnJlY3QgY29tbWVudHMuCi0JCi0xOTk5LTA5LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogQ2hlY2sgZm9yIHRoZV9iZmQgTlVMTCB3aGVuIGhhbmRsaW5nCi0JYW4gYWJzb2x1dGUgc3ltYm9sIGluIFJFTCByZWxvY3MuCi0KLVN1biBTZXAgMTIgMjM6NDc6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIFNFQ1JFTDMyLgotCVN0dWIgU0VHUkVMMzIuICBSZXR1cm4gYW4gZXJyb3IgZm9yIGFueSByZWxvY2F0aW9uIG5vdCBoYW5kbGVkLgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTG9vayBmb3Igc3BlY2lhbCBNU1ZDIHN0cmluZwotCWNvbnN0YW50IHN5bWJvbHMsIGFuZCBhdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9ycyBvbiB0aGVtLgotCi0xOTk5LTA5LTEyICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogUmV3cml0ZSB0byBhdm9pZCBpbmZpbml0ZSBsb29wIGlmIG1vc3QKLQlzaWduaWZpY2FudCBiaXQgaXMgc2V0LgotCi0xOTk5LTA5LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZi1wcGMuYyAoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEhhbmRsZSBhbiBhYnNvbHV0ZSBzeW1ib2wgaW4gUkVMCi0JcmVsb2NzIGFzIHdlIGRvIGZvciBSRUxBIHJlbG9jcy4KLQotMTk5OS0wOS0xMSAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGxpYnBlaS5oIChfYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBEZWNsYXJlLgotCShjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IERlZmluZS4KLQkqIHBlaWdlbi5jIChfYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0KTogRG9uJ3Qgc2V0IHZhbHVlIGZvciBkYXRhCi0JZGlyZWN0b3J5IGVudHJpZXMgaGVyZS4KLQkoX2JmZF9wZWlfZmluYWxfbGlua19wb3N0c2NyaXB0KTogTmV3IGZ1bmN0aW9uLgotCi0JKiBwZWlnZW4uYyAoX2JmZF9wZWlfc3dhcF9zY25oZHJfb3V0KTogUmVtb3ZlIGNvZGUgd2hpY2ggc2V0cwotCXNlY3Rpb24gZmxhZ3MgYmFzZWQgb24gdGhlIHNlY3Rpb24gbmFtZS4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCB0aGUKLQlnZXQgdGhlIG92ZXJmbG93IG9mIHRoZSBzX25sbm5vIGZpZWxkIGZyb20gdGhlIHNfbnJlbG9jIGZpZWxkLgotCSogcGVpZ2VuLmMgKF9iZmRfcGVpX3N3YXBfc2NuaGRyX291dCk6IElmIGRvaW5nIGEgZmluYWwgbGluaywgc3dhcAotCXRoZSBzX25sbm5vIG92ZXJmbG93IG9mIHRoZSAudGV4dCBzZWN0aW9uIGludG8gdGhlIHNfbnJlbG9jCi0JZmllbGQuCi0KLQkqIHBlaWdlbi5jIChhZGRfZGF0YV9lbnRyeSk6IERlY2xhcmUuCi0JKHBlaV9zd2FwX2FvdXRoZHJfb3V0KTogR2V0IGltYWdlIHNpemUgcmlnaHQuICBTZXQgbGlua2VyIHZlcnNpb24KLQltb3JlIGludHVpdGl2ZWx5LgotCShwZWlfc3dhcF9zY25oZHJfb3V0KTogVGVzdCBmb3IgVU5JTklUIHNlY3Rpb24sIG5vdCAuYnNzLgotCShwZV9wcmludF9pZGF0YSk6IENvZGUgY2xlYW51cCwgcHJpbnQgbW9yZSBpbmZvLCBnZXQgcmlkIG9mIChub3cpCi0JZXh0cmFuZW91cyBJbWFnZUJhc2UuCi0JKHBlX3ByaW50X2VkYXRhKTogTGlrZXdpc2UuCi0JKHBlX3ByaW50X3BkYXRhKTogTGlrZXdpc2UuICBQcmludCBleGNlcHRpb24gZW50cmllcy4KLQkocGVfcHJpbnRfcmVsb2MpOiBMaWtld2lzZS4gIFByaW50IE1JUFNfSk1QQUREUi4KLQkodGJsKTogTWFrZSBjb25zdCwgYWRkICJVTktOT1dOIi4KLQkoX2JmZF9wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbik6IFByaW50IHRpbWVzdGFtcC4KLQkoX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbik6IERvbid0IGNvcHkgZGVsZXRlZAotCXNlY3Rpb24gZGF0YSBkaXJlY3RvcnkuCi0JKF9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHBlX2ZsYWdzLgotCi0JKiBsaWJwZWkuaCAoX2JmZF9wZV9iZmRfZ2V0X3N5bWJvbF9pbmZvKTogRGVjbGFyZS4KLQkqIHBlaWdlbi5jIChfYmZkX3BlX2JmZF9nZXRfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKiBwZWljb2RlLmggKGNvZmZfZ2V0X3N5bWJvbF9pbmZvKTogRGVmaW5lLgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1pbnRlcml4Kik6IFNldCB0YXJnX2NmbGFncyB0bwotCS1EU1RSSUNUX1BFX0ZPUk1BVC4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogQ2hlY2sgU1RSSUNUX1BFX0ZPUk1BVCByYXRoZXIKLQl0aGFuIF9fSU5URVJJWC4KLQkoY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBSZS1yZXZlcnQgMTk5OS0wOC0wOCBwYXRjaCBpZgotCVNUUklDVF9QRV9GT1JNQVQuCi0KLQkqIGxpYnBlaS5oOiBOZXcgZmlsZSwgYnJva2VuIG91dCBvZiBwZWljb2RlLmguCi0JKiBwZWlnZW4uYzogTmV3IGZpbGUsIGJyb2tlbiBvdXQgb2YgcGVpY29kZS5oLgotCSogcGVpY29kZS5oOiBBIGJ1bmNoIG9mIGNvZGUgbW92ZWQgb3V0IHRvIGxpYnBlaS5oIGFuZCBwZWlnZW4uYy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHBlaWdlbi5sbyB0byBsaXN0IG9mIGZpbGVzIHJlcXVpcmVkIGZvciBlYWNoCi0JUEUgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBwZWlnZW4ubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBwZWlnZW4uYy4KLQkoU09VUkNFX0hGSUxFUyk6IEFkZCBsaWJwZWkuaC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9pbik6IERvbid0IGNoZWNrIGZvciBhIHNwZWNpYWwKLQlzZWN0aW9uIG5hbWUgb2YgX0JTUzsgY2hlY2sgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEKLQlpbnN0ZWFkLiAgRG9uJ3QgY2xlYXIgdGhlIHNfcGFkZHIgZmllbGQgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YQotCXNlY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IFNldCB0aW1lc3RhbXAgZmllbGQgaW4KLQljb2ZmX2RhdGFfdHlwZSB0byBmX3RpbWRhdC4KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3RfaG9vayk6IExpa2V3aXNlLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogQ2hlY2sgdGhlIE5UIGV4ZWN1dGFibGUgbWFnaWMKLQludW1iZXIgaWYgQ09GRl9JTUFHRV9XSVRIX1BFLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBDT0ZGX1dJVEhfUEUsIHNldCBIQVNfREVCVUcKLQl0byB0aGUgcmV2ZXJzZSBvZiBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVELgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEIGlmCi0JdGhlcmUgaXMgbm8gU0VDX0RFQlVHR0lORyBzZWN0aW9uLgotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogU2V0IEhBU19ERUJVRyB0byB0aGUgcmV2ZXJzZSBvZgotCUlNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQuCi0KLQkqIHBlLWkzODYuYyAoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQkoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCSogcGVpLWkzODYuYyAoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQkoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCi0JKiBjb2Zmc3dhcC5oIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLWFybS5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLWkzODYuYyAoSU1BR0VfQkFTRSk6IERvbid0IGRlZmluZS4KLQkqIHBlaS1tY29yZS5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLXBwYy5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBXaGVuIHdyaXRpbmcgb3V0IGEKLQlzeW1ib2wsIHN3aXRjaCBvbiB0aGUgY2xhc3Mgd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIG1vZGlmeSB0aGUKLQl2YWx1ZS4gIEZvciBQRSwgZG9uJ3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiBhIENfRkNOIHN5bWJvbCBub3QgbmFtZWQKLQkuYmYuCi0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Fib3J0KTogRGVjbGFyZS4KLQkoYWJvcnQpOiBEZWZpbmUuCi0JKiBiZmQuYyAoX2JmZF9hYm9ydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IERlbGV0ZSBQT1dFUlBDX0xFX1BFCi0Jc3BlY2lhbCBoYW5kbGluZy4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgYSBzeW1ib2wgaXMgc3RyaXBwZWQsCi0JZG9uJ3Qgd3JpdGUgb3V0IHRoZSBhc3NvY2lhdGVkIGxpbmUgbnVtYmVycy4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBIYW5kbGUgc2VjdGlvbiBzeW1ib2wKLQlhdXggZW50cmllcy4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3Qgd2FybiBhYm91dCBzeW1ib2wgdHlwZQotCWNoYW5nZXMgd2hlbiB0aGUgYmFzZSB0eXBlIGlzIHVua25vd24uCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBGaXggcHJpbnRpbmcgb2YgYXV4IHJlY29yZCBmb3IKLQlmdW5jdGlvbiBzeW1ib2xzLgotCi0JKiBzeW1zLmMgKEJTRl9ERUJVR0dJTkdfUkVMT0MpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIFBFLCBzZXQgQlNGX0RFQlVHR0lORwotCWZvciBDX0ZDTi9DX0VGQ04gc3ltYm9scywgYW5kIHNldCBCU0ZfREVCVUdHSU5HX1JFTE9DIGZvciBzdWNoCi0Jc3ltYm9scyBuYW1lZCAuYmYuCi0JKiBjb2ZmZ2VuLmMgKGZpeHVwX3N5bWJvbF92YWx1ZSk6IFJlbG9jYXRlIGEgc3ltYm9sIHdoaWNoIGhhcwotCUJTRl9ERUJVR0dJTkdfUkVMT0Mgc2V0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWNvZmYuYyAoYmZkX2RlYnVnX3NlY3Rpb24pOiBVcGRhdGUgaW5pdGlhbGl6YXRpb24gZm9yIG5ldwotCWNvbWRhdF9pbmZvIGZpZWxkLgotCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIHNlY3Rpb24gcGFyYW1ldGVyLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotMTk5OS0wOS0xMCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgdGhlIG5ldwotCV9iZmRfZmlsbm1sZW4gZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotRnJpIFNlcCAxMCAwMDozNToxNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDcmVhdGUgLm9wZCBlbnRyaWVzCi0JZm9yIEZQVFIgcmVsb2NzIGludm9sdmluZyBsb2NhbCBzeW1ib2xzLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogR2V0IHRoZSByaWdodAotCXZhbHVlIGZvciB0aGUgc3R1YiBhZGRyZXNzIGluIGEgY2FsbCB0aHJvdWdoIGEgc3R1Yi4KLQlJbnN0YWxsIHRoZSB2YWx1ZSBmb3IgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHkgaW50byB0aGUgRExUCi0JaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgcmVsb2MuICBDb3JyZWN0bHkgaGFuZGxlIEZQVFI2NCByZWxvY3MuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9maW5hbF9saW5rKTogQ2FsbCB0aGVtLgotCi0xOTk5LTA5LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZml4X3N5bWJvbF9mbGFncyk6IE1vdmUgd2Vha2RlZiBoYW5kbGluZyBoZXJlLi4uCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiAuLi5mcm9tIGhlcmUuCi0KLVdlZCBTZXAgIDggMTc6NTY6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9ob3d0b190YWJsZSk7IFRoZXJlIGlzIG5vIERJUjY0V1IsIERJUjY0RFIKLQlyZWxvY2F0aW9uLCByZW1vdmUgdGhlbS4gIFNFQ1JFTDY0LT5MVE9GRjE2V0YuCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgTFRPRkYqIHJlbG9jYXRpb25zLiAgSGFuZGxlCi0JRElSKiByZWxvY2F0aW9ucy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBQTFRPRkYqIHJlbG9jcy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBEUFJFTCogYW5kCi0JR1BSRUwqIHJlbG9jYXRpb25zLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9saW5rX2ZpbmFsX3JlbG9jYXRlKTogRml4IHR5cG9zLgotCUhhbmRsZSBMVE9GRl9UUCogcmVsb2NzLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIFBDUkVMKiByZWxvY3MuCi0JQ29uc2lzdGVudGx5IGRlYWwgd2l0aCBhZGRlbmRzLiAgSGFuZGxlIERMVElORDE0RiBhbmQgRExUUkVMMTRGLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogSGFuZGxlIFBDUkVMKiByZWxvY3MuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgTFRfT0ZGX0ZQVFIqLAotCURJUjMyLCBESVI2NCBhbmQgRlBUUjY0IHJlbG9jYXRpb25zLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rKTogU2V0IHRoZSB2YWx1ZSBvZiBfX2dwIHRvIHRoZSAgICAgICAgCi0JYWRkcmVzcyBvZiB0aGUgLlBBUklTQy5nbG9iYWwgc2VjdGlvbi4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExvb2t1cCBhbmQgcGFzcyB0aGUgUEE2NCBoYXNoCi0JdGFibGUgZW50cnkgZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZS4gIERvIG5vdCBnaXZlIGEgd2FybmluZwotCWZvciBhIHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGhhcyBhIFBBNjQgaGFzaAotCXRhYmxlIGVudHJ5LgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogU2lnbmlmaWNhbnRseSByZXdvcmsuICBIYW5kbGUgICAKLQlETFRJTkQgcmVsb2NhdGlvbnMuICBDb21wdXRlIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgcmVsb2NhdGlvbgotCWJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZSBvZiBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogUmV2YW1wIHRvIGhhbmRsZSBqdXN0IGJpdCB0aXdpZGRsaW5nCi0JcmVsb2NhdGlvbiBzdXBwb3J0LiAgSGFuZGxlIERMVElORCByZWxvY2F0aW9uIHJlcXVlc3RzIGp1c3QgbGlrZQotCURMVFJFTCByZWxvY2F0aW9uIHJlcXVlc3RzLiAgU2ltcGxpZnkgYnJhbmNoIGhhbmRsaW5nLgotCi0xOTk5LTA5LTA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IENhdGNoIHByb2JsZW1zIHdpdGgKLQlub24tYWxsb2NhdGVkIHNlY3Rpb24gYXMgZG9uZSBpbiBpMzg2IHZlcnNpb24uCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVbmNvbW1lbnQgUl9QQVJJU0NfMTRGIGluIHN3aXRjaAotCXN0YXRlbWVudCBzaW5jZSB0aGlzIGlzIG5vIGtub3cgcmVsb2NhdGlvbi4KLQotVHVlIFNlcCAgNyAxNzoyNToxMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgRExUUkVMMTRGCi0JcmVsb2NzLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIERMVFJFTDE0V1IgYW5kCi0JRExUUkVMMTRXRCByZWxvY3MuICAKLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBETFRSRUwxNFIgYW5kCi0JRExUUkVMMjFMIHJlbG9jcy4gIFBhc3MgdGhlIG91dHB1dCBiZmQgdG8gZWxmX2hwcGFfcmVsb2NhdGVfaW5zbi4KLQlQYXNzIHRoZSByZWxvY2F0ZSB0eXBlIHJhdGhlciB0aGFuIHRoZSBpbnNuIGZvcm1hdCB0bwotCWVsZl9ocHBhX3JlbG9jYXRlX2luc24uCi0JKGVsZl9ocHBhX3JlbG9jYXRlX2luc24pOiBNYWtlIHN3aXRjaCBkZXBlbmRlbnQgb24gcmVsb2NhdGlvbiB0eXBlCi0JcmF0aGVyIHRoYW4gdGhlIG9wY29kZS4gIEhhbmRsZSBETFRSRUwyMUwgYW5kIERMVFJFTDE0UiByZWxvY3MuCi0KLTE5OTktMDktMDcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgX2JmZF9maWxubWxlbiBmaWVsZC4KLQkoYmZkX2NvZmZfZmlsbm1sZW4pOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogVXNlIGJmZF9jb2ZmX2ZpbG5tbGVuIHJhdGhlcgotCXRoYW4gRklMTk1MRU4uCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IExpa2V3aXNlLgotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLTE5OTktMDktMDYgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBjb2ZmY29kZS5oIChzb3J0X2J5X3NlY2FkZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwgc29ydAotCXNlY3Rpb25zIGJ5IFZNQSB3aGVuIGFzc2lnbmluZyB0YXJnZXRfaW5kZXggdmFsdWVzLiAgQWx3YXlzIHNldAotCXZpcnRfc2l6ZS4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpOiBBZGQgcGVfZmxhZ3MgZmllbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaykgW0NPRkZfV0lUSF9QRSB2ZXJzaW9uXTogU2V0Ci0JcGVfZmxhZ3MgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2N1c3RvbV9zZWN0aW9uX2FsaWdubWVudCk6IEFkZCBjb25zdCB0bwotCWRlY2xhcmF0aW9uIHRvIG1hdGNoIGRlZmluaXRpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IEZfQVIzMlcoUik/IGlmCi0JQ09GRl9XSVRIX1BFLgotCi0JKiBjb2ZmLWkzODYuYyAoaW5fcmVsb2NfcCk6IEFkZCBkZWNsYXJhdGlvbi4KLQkoaTM4NmNvZmZfdmVjKTogU2ltcGxpZnkgaW5pdGlhbGl6YXRpb24gb2YKLQlhcHBsaWNhdGlvbl9zZWN0aW9uX2ZsYWdzLgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IFdyaXRlIHNlcGFyYXRlIENPRkZfV0lUSF9QRQotCXZlcnNpb24uICBNb3ZlIENPRkZfV0lUSF9QRSBzcGVjaWZpYyBjb2RlIHRvIG5ldyB2ZXJzaW9uLgotCShzdHlwZV90b19zZWNfZmxhZ3MpOiBMaWtld2lzZS4gIEFkZCBzZWN0aW9uIHBhcmFtZXRlci4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogU2V0IHRhcmdldF9pbmRleCBiZWZvcmUKLQljYWxsaW5nIHN0eXBfdG9fc2VjX2ZsYWdzLiAgUGFzcyBzZWN0aW9uIHRvIHN0eXBfdG9fc2VjX2ZsYWdzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBzeW1zLmMgKHN0dCk6IEFkZCBzb21lIFBFL1BFSSBzZWN0aW9uIG5hbWVzLgotCShiZmRfZGVjb2RlX3N5bWNsYXNzKTogUmV0dXJuICd3Jywgbm90ICdVJywgZm9yIGEgd2VhayB1bmRlZmluZWQKLQlzeW1ib2wuCi0JKGJmZF9zeW1ib2xfaW5mbyk6IENoZWNrIGZvciAndycuCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IGJmZF9jb21kYXRfaW5mbyk6IERlZmluZS4KLQkoYXNlY3Rpb24pOiBBZGQgY29tZGF0IGZpZWxkLgotCShTVERfU0VDVElPTik6IEluaXRpYWxpemUgY29tZGF0IGZpZWxkLgotCShiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTA2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENvcHkgTk9OX0dPVF9SRUYgZmxhZwotCXRvIHZlcnNpb24gc3ltYm9scy4KLQotMTk5OS0wOS0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBVc2UgYmZkX3ptYWxsb2MgYW5kCi0JYmZkX3JlYWxsb2MgaW5zdGVhZCBvZiBjYWxsb2MgYW5kIHJlYWxsb2MuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY3B1LXBqLmM6IE5ldyBmaWxlLgotCSogZWxmMzItcGouYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChwaiopOiBOZXcgY3B1LgotCShwai0qLSosIHBqbC0qLSopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3BqX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShiZmRfZWxmMzJfcGpsX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotIAkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX3BqKTogRGVmaW5lLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9wai4KLQkqIHJlbG9jLmM6IERlZmluZSBCRkRfUkVMT0NfUEpfKiByZWxvY2F0aW9ucy4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3BqX3ZlYywgYmZkX2VsZjMyX3BqbF92ZWMpOiBEZWNsYXJlIGFuZCBhZGQKLQl0byB0YXJnZXQgdmVjdG9yIGxpc3QuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtcGoubG8uCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LXBqLmMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLXBqLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItcGouYy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLTE5OTktMDktMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX05PTl9HT1RfUkVGKTogRGVmaW5lLgotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ29weSBSRUZfUkVHVUxBUl9OT05XRUFLCi0JYW5kIE5PTl9HT1RfUkVGIGZyb20gd2VhayBkZWZpbmVkIHN5bWJvbCB0byByZWFsIHN5bWJvbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogU2V0IE5PTl9HT1RfUkVGLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBOT05fR09UX1JFRiBpcyBub3Qgc2V0LCBkb24ndAotCWNyZWF0ZSBhIENPUFkgcmVsb2MuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBTZXQgTk9OX0dPVF9SRUYuCi0JKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIE5PTl9HT1RfUkVGIGlzIG5vdCBzZXQsCi0JZG9uJ3QgY3JlYXRlIGEgQ09QWSByZWxvYy4KLQotMTk5OS0wOS0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogV2hlbiBjb3VudGluZyByZWxvY2F0aW9ucywgZG9uJ3QKLQljb3VudCB0aG9zZSBpbiBzZWN0aW9ucyB3ZSBhcmUgbm90IGluY2x1ZGluZyBpbiB0aGUgbGluay4KLQotVGh1IFNlcCAgMiAxNzo0MToyMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV29yayBhcm91bmQgYm9ndXMgU0hfTElOSwotCWZpZWxkIGluIGhwdXgxMSBzaGFyZWQgbGlicmFyaWVzLgotCi0xOTk5LTA5LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IEZpeCBtZW1vcnkgbGVhay4KLQotV2VkIFNlcCAgMSAxMzozNDoyOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2FkZF9zeW1ib2xfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2hwcGFfZmluYWxfbGluaywgZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlLCBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogTGlrZXdpc2UuCi0KLTE5OTktMDgtMzEgIEFsZXhhbmRyZSBQZXRpdC1CaWFuY28gIDxhcGJpYW5jb0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBXaGVuIHBvc3NpYmxlLCBrZWVwIHRoZQotCW9yaWdpbmFsIHR5cGUgb2YgdGhlIHN5bWJvbC4KLQotTW9uIEF1ZyAzMCAxNToyNjo0OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUpOiBBbGxvdyBib3RoCi0JUl9QQVJJU0NfRElSMzIgYW5kIFJfUEFSSVNDX0RJUjY0IHJlZ2FyZGxlc3Mgb2YgaG93IHRoZQotCXRvb2xzIHdlcmUgY29uZmlndXJlZC4KLQkqIGVsZjMyLWhwcGEuaCAoX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlKTogRGVjbGFyZS4KLQotMTk5OS0wOC0yNiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IERvbid0IGFsbG9jYXRlIGxvY2FsCi0JR09UIGVudHJpZXMgZm9yIEdPVDE2IHJlbG9jYXRpb25zOyB0aGV5J3JlIG5vdCByZXF1aXJlZC4KLQotMTk5OS0wOC0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCUZyb20gYSBwYXRjaCBzdWJtaXR0ZWQgYnkgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAYmFhbHBlcmF6aW0uZnJvYi5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGFybS0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChhcm1uZXRic2RfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUKLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmFybW5ldGJzZF92ZWMuCi0KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBhcm1uZXRic2QubG8uCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgYXJtbmV0YnNkLmMuCi0JKGFybW5ldGJzZC5sbyk6IE5ldyBydWxlIHdpdGggZGVwcy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCQotCSogYXJtbmV0YnNkLmM6IE5ldyBmaWxlOiAgRGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gYXJtLW5ldGJzZAotCXRhcmdldC4gCi0KLVR1ZSBBdWcgMjQgMDA6MjU6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0KLUZyaSBBdWcgMjAgMTc6MDE6MjMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9mYWtlX3NlY3Rpb25zKTogQ29tcHV0ZSBzZWN0aW9uIGluZGljZXMKLQloZXJlIGluc3RlYWQgb2YgdXNpbmcgZWxmX3NlY3Rpb25fZGF0YS4uLgotCi0xOTk5LTA4LTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKG1jb3JlX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogTmV3IGZ1bmN0aW9uOiAgRW1pdAotCXJlbG9jYXRpb25zIGludG8gdGhlIGJhc2UgZmlsZS4KLQkoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbCBtY29yZV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSBpZgotCXdlIGFyZSBidWlsZGluZyBhIGJhc2UgZmlsZS4KLQotMTk5OS0wOC0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGFybV9hZGRfdG9fcmVsKTogTmV3IGZ1bmN0aW9uLiAgQWRkIGEgdmFsdWUgdG8KLQlhIFJFTCBzdHlsZSByZWxvYy4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgYXJtX2FkZF90b19yZWwgdG8gaW5jcmVtZW50Ci0JUkVMIHJlbG9jcyB3aGVuIHBlcmZvcm1pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uCi0KLTE5OTktMDgtMTggIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBjb2ZmbGluay5jOiBNb3ZlIGRlZmluaXRpb25zIG9mIE5fVE1BU0ssIGV0LiBhbC4sIG91dCBvZgotCV9iZmRfY29mZl9saW5rX2lucHV0X2JmZCBpbnRvIHRvcCBsZXZlbC4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IEhhbmRsZSBSX0lNQUdFQkFTRS4KLQkoUlRZUEUySE9XVE8pOiBSZXR1cm4gTlVMTCBpZiByZWxvYyB0eXBlIGlzIG91dCBvZiByYW5nZS4KLQkoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZSBhIC0yIHRvIE5fREVCVUcuCi0JQ29tcGxldGVseSBpZ25vcmUgc3ltYm9scyB3aGljaCBhcmUgYWxsIHplcm8uCi0JKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBBZGQgcmV0dXJuIDAuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBSZW5hbWUgaW5uZXIgc2NvcGUKLQl2YXJpYWJsZSBjb3B5IHRvIG5hbWVfY29weSB0byBhdm9pZCBzaGFkb3dpbmcgb3V0ZXIgc2NvcGUKLQl2YXJpYWJsZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUpOiBDaGFuZ2UgcmF3X3N5bWVudF9jb3VudCBmaWVsZAotCWZyb20gdW5zaWduZWQgaW50IHRvIHVuc2lnbmVkIGxvbmcuICBBZGQgdGltZXN0YW1wIGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTE3ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWhwcGEuYyAoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRml4IHR5cG8gaW4KLQltYWNybyBkZWZpbml0aW9uLgotCi0xOTk5LTA4LTE3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IFNldCBCU0ZfRFlOQU1JQwotCWZvciBzcGVjaWFsIHNlY3Rpb24gc3ltYm9scy4KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IElmIHdlIGhhdmUgbm8gb2xkIEJGRCwgY2hlY2sKLQlCU0ZfRFlOQU1JQyBvbiB0aGUgc2VjdGlvbiBzeW1ib2wgdG8gc2VlIHdoZXRoZXIgdGhlIG9sZCBCRkQgaXMKLQlkeW5hbWljLgotCi0xOTk5LTA4LTE1ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogRml4IHVuZm9ydHVuYXRlCi0JY29pbmNpZGVuY2Ugb2YgdmFyaWFibGUgbmFtZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyBjb2RlLgotCi0xOTk5LTA4LTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIpOiAgTWFrZSAnb2Zmc2V0JyBwYXJhbWV0ZXIKLQlpbnRvIGEgYmZkX3ZtYSBhbmQgJ2FkZGVuZCcgcGFyYW1ldGVyIGEgJ2JmZF9zaWduZWRfdm1hJy4KLQkoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIpOiAgTWFrZSAnb2Zmc2V0JyBwYXJhbWV0ZXIgaW50byBhIGJmZF92bWEKLQlhbmQgJ2FkZGVuZCcgcGFyYW1ldGVyIGEgJ2JmZF9zaWduZWRfdm1hJy4KLQkoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEbyBub3QgaW52b2x2ZSBzdHVicyBpbgotCVJfQVJNX1RITV9QQzIyIHJlbG9jcyByZWxhdGl2ZSB0byBzZWN0aW9uIHN5bWJvbHMsIHRoZXkgYXJlIGxvbmcKLQlqdW1wcywgbm90IGZ1bmN0aW9uIGNhbGxzLgotCi0xOTk5LTA4LTExICBSb2JpbiBGYXJpbmUgPGFkdmFuY0BkaWFsLmV1bmV0LmNoPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDaGVjayBmb3Igb3ZlcmZsb3cKLQlpbiBSX0FSTV9QQzI0IHJlbG9jcy4KLQotVHVlIEF1ZyAxMCAxMjo0ODowOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2Zha2Vfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBEZWZpbmUuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBVcGRhdGUgZm9yCi0JcmVjZW50IGNoYW5nZXMgdG8gdGhlIGFyY2hfaW5mbyBzdHJ1Y3R1cmUuCi0KLQkqIGVsZi1ocHBhLmggKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUKLQlSX0hQUEFfU0VHQkFTRSBhbmQgUl9IUFBBX1NFR1JFTDMyLgotCSogY3B1LWhwcGEuYyAoYmZkX2hwcGEyMHdfYXJjaCk6IE5ldyBlbnRyeSBpbiBhcmNoaXRlY3R1cmUgaW5mbwotCWxpc3QuCi0KLVR1ZSBBdWcgMTAgMDA6MzQ6MjkgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQkgICAgICAgICAgICAgICAgICBSYWxmIEJhZWNobGUgPHJhbGZAdW5pLWtvYmxlbnouZGU+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBbHdheXMKLQlvdXRwdXQgRFRfTUlQU19HT1RTWU0uCi0JKF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgdGhlIHNhbWUgdmFsdWUgYXMKLQlEVF9NSVBTX1NZTVRBQk5PIGlmIHRoZXJlIGFyZSBubyBnbG9iYWwgR09UIHN5bWJvbHMuCi0KLVR1ZSBBdWcgMTAgMDA6MjE6MDggMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uKTogQ2hhbmdlCi0JcHJvdG90eXBlLiAgSGFuZGxlIGxvY2FsIHN5bWJvbHMuICBBZGQgY29tbWVudGFyeS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMgaW4gUl9NSVBTXzMyCi0JcmVsb2NhdGlvbnMuIAotCQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBUd2VhayBsYXN0IGNoYW5nZS4KLQotMTk5OS0wOC0wOSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24pOiBVc2UgdGhlIGNvdW50cyBpbiB0aGUKLQllbGYtc2VjdGlvbiBkYXRhIHRvIGFsbG9jYXRlIGp1c3QgdGhlIHJpZ2h0IGFtb3VudCBvZiByZWxvY2F0aW9uCi0Jc3BhY2UuICBEb24ndCBhbGxvY2F0ZSB0aGUgaGFzaCBzcGFjZSB0d2ljZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gYWxsb2NhdGUgaW4KLQllYWNoIHJlbG9jYXRpb24gc2VjdGlvbi4KLQotTW9uIEF1ZyAgOSAxNzozNzozMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUsIGNhc2UgMzIpOiBXaGVuIGluCi0JNjRiaXQgbW9kZSwgZ2VuZXJhdGUgYSBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIGEgMzJiaXQKLQl3aWRlIHJlbG9jYXRpb24uCi0JKGVsZl9ocHBhX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWxldGVkLiAgVG8gYmUKLQlzaGFyZWQgYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQgcG9ydC4KLQotMTk5OS0wOC0wOSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IEZpeCBzcmNfbWFzayBmb3IKLQlSX01JUFNfR09UMTYgYW5kIFJfTUlQU19DQUxMMTYuCi0JKG1pcHNfZWxmX2dvdDE2X2VudHJ5KTogVXNlIG1pcHNfZWxmX2hpZ2ggdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZQotCXRvIHVzZSB3aGVuIGxvb2tpbmcgZm9yIGEgcHJlZXhpc3RpbmcgR09UIGVudHJ5LgotCi0xOTk5LTA4LTA5ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBCYWNrIG91dCBwYXJ0IG9mCi0JdGhlIFNlcC4gNHRoLCAxOTk4IGNoYW5nZS4gIGdsaWJjIDIuMC54IGR5bmFtaWMgbGlua2VyIGhhZCBidWcsCi0Jbm90IGJpbnV0aWxzLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0xOTk5LTA4LTA5ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IG91dHB1dCBhIHdlYWsKLQlyZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCBqdXN0IGJlY2F1c2UgaXQgd2FzIGRlZmluZWQgd2VhawotCWluIGEgc2hhcmVkIG9iamVjdC4KLQotMTk5OS0wOC0wOSAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogV2hlbiBsb29raW5nIGZvciBmaWxlLCB1c2UKLQlsYXN0IGJlc3QgbWF0Y2ggcmF0aGVyIHRoYW4gZmlyc3QuICBJZiBhZGRyZXNzIGlzIGJleW9uZCBsYXN0IGxpbmUKLQludW1iZXIgcmVjb3JkLCBkb24ndCByZXR1cm4gdGhlIGxhc3QgbGluZSBhcyB0aGUgY29ycmVjdCB2YWx1ZS4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX1NNQUxMX0RBVEEpOiBSZW5hbWUgZnJvbSBTRUNfU0hPUlQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAYmlnZm9vdC5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQpOiBOZXcgc3RhdGljCi0JZnVuY3Rpb24uCi0JKGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfdGFibGUpOiBOZXcgc3RhdGljIGFycmF5LgotCShjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBVc2UgY29mZl9zZXRfY3VzdG9tZXJfc2VjdGlvbl9hbGlnbm1lbnQuCi0JKiBjb2ZmLWdvMzIuYyAoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCSogY29mZi1zdGdvMzIuYyAoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbmFtZSAuZGVwKiBmaWxlcyB0byBERVAqLiAgQ2hhbmdlIERFUCB2YXJpYWJsZSB0bwotCU1LREVQLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBzZWN0aW9uLmMgKFNFQ19TSEFSRUQpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IEhhbmRsZSBTRUNfU0hBUkVELgotCShzdHlwX3RvX3NlY19mbGFncyk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBDb21tZW50IG91dCBwYXJ0IG9mCi0JMTk5OS0wOC0wNSBjaGFuZ2Ugd2hpY2ggYnJlYWtzIGN5Z3dpbiBETExzLgotCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9CSU5BUllfRk9QRU4pOiBDaGFuZ2UgLXdpbmRvd3MgdG8gLXdpbmRvd3MqLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc2VjdGlvbi5jIChnbG9iYWxfc3ltcyk6IE9ubHkgaW5pdGlhbGl6ZSB1bmlvbiBmaWVsZCBpZgotCV9fU1REQ19fLgotCi0xOTk5LTA4LTA0ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2dvdDE2X2VudHJ5KTogRG9uJ3QgbXVsdGlwbHkgR09UIGluZGV4IGJ5Ci0JdGhlIHNpemUgb2YgYSBHT1QgZW50cnkgaGVyZS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBEb24ndCBjcmVhdGUgYSBsb2NhbCBHT1QgZW50cnkKLQlmb3IgdGhlIHN5bWJvbCBpbiBhIEdPVDE2IHJlbG9jYXRpb247IGp1c3QgZm9yIGl0J3MgaGlnaC1vcmRlciBiaXQKLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHRoaW5rby4KLQotMTk5OS0wOC0wNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRG9ubiBUZXJyeSA8ZG9ubkBpbnRlcml4LmNvbT46Ci0JKiBjb2ZmY29kZS5oIChlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uKTogRGVmaW5lLgotCShiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBSZW5hbWUgX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwgdG8KLQlfYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sLiAgQ2hhbmdlIHJldHVybiB0eXBlLgotCShiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBSZW5hbWUgZnJvbSBiZmRfY29mZl9zeW1faXNfZ2xvYmFsLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBjb2ZmX2NsYXNzaWZ5X3N5bWJvbC4KLQkoY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3N5bV9pc19nbG9iYWwpOiBOZXZlciBkZWZpbmUuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSB3aXRoIGNvZmZfY2xhc3NpZnlfc3ltYm9sLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBVc2UKLQliZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wgcmF0aGVyIHRoYW4gYmZkX2NvZmZfc3ltX2lzX2dsb2JhbC4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSB3aXRoCi0JY29mZl9jbGFzc2lmeV9zeW1ib2wuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDQgMTg6MDg6MDcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKFJfSFBQQV9MVFBTRUwsIFJfSFBQQV9SVFBTRUwpOiBOZXcgZmllbGQgc2VsZWN0b3JzCi0JKGVfbHRwc2VsLCBlX3J0cHNlbCk6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSAyMWJpdCBlX2x0cHNlbAotCWFuZCAxNGJpdCBlcnRwc2VsLiAgSGFuZGxlIDY0Yml0IHBzZWwuCi0KLTE5OTktMDgtMDQgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVHdlYWsgSEkxNi9MTzE2Ci0JaGFuZGxpbmcgZm9yIFJFTCByZWxvY2F0aW9ucy4gIEFuZCBvbmx5IGxlZnQtc2hpZnQgUl9NSVBTMjYKLQlyZWxvY2F0aW9uIGFkZGVuZHMgd2hlcmUgbmVjZXNzYXJ5LgotCi0xOTk5LTA4LTAzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBSZW5hbWUgdG8gLi4uCi0JKG1pcHNfZWxmX25leHRfbG8xNl9yZWxvY2F0aW9uKTogRG9uJ3QgY29tcHV0ZSB0aGUgYWRkZW5kIGhlcmUuCi0JSnVzdCByZXR1cm4gdGhlIHJlbG9jYXRpb24gZm91bmQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQdWxsIHRoZSBMTzE2IGFkZGVuZCBvdXQgb2YgdGhlCi0Jc2VjdGlvbiBpdHNlbGYgd2hlbiB1c2luZyBSRUwgcmVsb2NhdGlvbnMuCi0JCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogUmVzdG9yZQotCV9EWU5BTUlDX0xJTksgaGFuZGxpbmcgYW5kIGhhbmRsaW5nIG9mIHVuZGVmaW5lZCBzeW1ib2xzIGluIHNoYXJlZAotCWxpYnJhcmllcy4KLQotMTk5OS0wOC0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB1c2UgdGhlIHJlbG9jYXRpb24KLQl2YWx1ZSBvZiBhIHN5bWJvbCBpbiBhIFNFQ19ERUJVR0dJTkcgc2VjdGlvbi4gIFdhcm4gd2hlbiBkb2luZyBhCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGluIGFuIGlucHV0IHNlY3Rpb24gd2l0aCBubyBvdXRwdXQKLQlzZWN0aW9uLiAgRnJvbSBEYW5pZWwgSmFjb2Jvd2l0eiA8ZHJvd0BmYWxzZS5vcmc+LgotCi0JKiBjb2ZmLXN0Z28zMi5jIChnbzMyX3N0dWJiZWRfY29mZl9vYmplY3RfcCk6IFJlbW92ZTsgbm90IHVzZWQuCi0KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IENoYW5nZSB0byB1c2UgY29uZnRlc3QsIGFuZCB0bwotCWxvb2sgZm9yIGdlbmVyYXRlZCBmaWxlIGNvcnJlY3RseS4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wOC0wMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTXzI2Ci0JYW5kIFJfTUlQUzE2XzI2IHJlbG9jYXRpb25zIGNvcnJlY3RseSB3aGVuIHJlbG9jYXRpbmcuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgYXNzdW1lIHRoYXQgUl9NSVBTX0NBTExfSEkxNgotCWFuZCBSX01JUFNfQ0FMTF9MTzE2IGFyZSBmb3IgZ2xvYmFsIHN5bWJvbHMuCi0JCi0xOTk5LTA4LTAyICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogQ29weSB0aGUgd2hvbGUgaXN5bSwgbm90IGp1c3QKLQlzb21lIGZpZWxkcy4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX291dHB1dF9hcmNoX3N5bXMpOiBEZWNsYXJlIHVzZWQKLQl2YXJpYWJsZXMgYW5kIGluaXRpYWxpemUgdGhlbS4KLQotMTk5OS0wOC0wMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUKLQl0aGVyZSBhcmUgbm8gZ2xvYmFsIHN5bWJvbHMgcmVxdWlyaW5nIEdPVCBlbnRyaWVzLgotCShfYmZkX21pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBVbmRlZmluZWQgd2VhawotCXN5bWJvbHMgYXJlIGNvbnNpZGVyZWQgdG8gaGF2ZSB0aGUgdmFsdWUgemVyby4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdHJ5IHRvIHBlcmZvcm0gYQotCXJlbG9jYXRpb24gZm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogQWxsb2NhdGUgbG9jYXRlIEdPVCBzcGFjZSBmb3IgbG9jYWwKLQlHT1QxNiByZWxvY2F0aW9ucy4KLQotMTk5OS0wNy0zMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9idWlsZF9wbHQpOiBDb3NtZXRpYyBjaGFuZ2UgLSBBQkkKLQl3YW50cyBiYSxhLHB0ICV4Y2MgaW5zdGVhZCBvZiAlaWNjLgotCUVtaXQgY29ycmVjdCAuUExUMC0oLlBMVE4rNCkgaW5pdGlhbCB2YWx1ZSBpbnRvIHRoZSBwb2ludGVyIHNsb3RzCi0Jb2YgbGFyZ2UgUExUIGVudHJpZXMuCi0JKHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0KTogRml4IGNhbGN1bGF0aW9uLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBOZWdhdGl2ZSB2YWx1ZSBvZiBSX1NQQVJDX0pNUF9TTE9UCi0JYWRkZW5kIHNob3VsZCBiZSByZWxhdGl2ZSB0byBsb2FkIGFkZHJlc3MsIG5vdCAucGx0IHNlY3Rpb24gc3RhcnQuCi0JKHNwYXJjNjRfZWxmX3NpemVfaW5mbyk6IFNwYXJjNjQgdXNlcyAzMmJpdCAuaGFzaCBlbnRyaWVzLgotCi0xOTk5LTA3LTMwICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQKLQlwcmludF9zeW1ib2xfYWxsIGFuZCBvdXRwdXRfYXJjaF9zeW1zIGJhY2tlbmQgbWV0aG9kcy4KLQkqIGVsZnh4LXRhcmdldC5oOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLAotCXNwYXJjNjRfZWxmX2FkZF9zeW1ib2xfaG9vaywgc3BhcmM2NF9lbGZfb3V0cHV0X2FyY2hfc3ltcywKLQlzcGFyYzY0X2VsZl9nZXRfc3ltYm9sX3R5cGUsIHNwYXJjNjRfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogTmV3Ci0JZnVuY3Rpb25zLgotCShzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMZWF2ZSBzcGFjZSBmb3IgU1RUX1JFR0lTVEVSCi0Jc3ltYm9scyBpbiAuZHluc3ltLCBhZGQgdGhlaXIgbmFtZXMgaW50byAuZHluc3RyLiBQdXQgdGhvc2Ugc3ltYm9scwotCWludG8gZHlubG9jYWwuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRml4IHVwIERUX1NQQVJDX1JFR0lTVEVSCi0JcG9pbnRlcnMgdG8gU1RUX1JFR0lTVEVSIHN5bWJvbHMgaW4gZHluc3ltIHNlY3Rpb24uCi0JKHNwYXJjNjRfZWxmX3ByaW50X3N5bWJvbF9hbGwpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBBbGxvdyBzcGVjaWFsIGJhY2tlbmQgc3ltYm9sCi0JcHJpbnRpbmcgdXNpbmcgdGhlIHByaW50X3N5bWJvbF9hbGwgaG9vay4KLQotMTk5OS0wNy0zMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fY2hlY2tfcmVsb2NzKTogIFVzZSByX29mZnNldCBmb3IKLQlSX0FSTV9HTlVfVlRFTlRSWS4KLQotMTk5OS0wNy0yOSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBPbmx5IHJlLXNvcnQgZHluc3ltcyBpZgotCWR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZC4KLQotMTk5OS0wNy0yOSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2luZm9fdG9faG93dG9fcmVsKTogU3BsaXQgb3V0IHN3aXRjaCB0byAuLi4KLQkobWlwc19ydHlwZV90b19ob3d0byk6IC4uLiBuZXcgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBpdC4KLQotMTk5OS0wNy0yOCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwby4KLQotMTk5OS0wNy0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIGdlbmVyYXRlZCBieSBCZXJuZCBTY2htaWR0LiA8YmVybmRzQGN5Z251cy5jby51az4KLQkKLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBDaGFuZ2UgdG8gc3RyaXAKLQlvdXQgb25seSBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCBMT0NBTF9MQUJFTF9QUkVGSVggZm9sbG93ZWQgYnkgJ0wnLgotCi0xOTk5LTA3LTIzICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogbGliY29mZi1pbi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBjb2ZmX2xpbmtfaGFzaF9mbGFncwotCWZpZWxkLCBhbmQgZGVmaW5lIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogSWYgUEUsIGhhbmRsZSBzZWN0aW9uCi0Jc3ltYm9scyBzcGVjaWFsbHkuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWludGVyaXgqKTogTmV3IHRhcmdldC4KLQotMTk5OS0wNy0yMSAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0BiaWdmb290LmNvbT4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBJZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyBhbmQKLQlDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFLCBtYXJrIHNlY3Rpb25zIHdob3NlIG5hbWVzIGJlZ2luIHdpdGgKLQkuZ251LmxpbmtvbmNlIHdpdGggU0VDX0xJTktPTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQuCi0JKiBjb2ZmLWdvMzIuYzogKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCShDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFKTogRGVmaW5lLgotCSogY29mZi1zdGdvMzIuYzogKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCShDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFKTogRGVmaW5lLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIG1ha2VmaWxlLmRvczogUmVtb3ZlOyBvYnNvbGV0ZS4KLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMjEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotdnh3b3JrcyopOiBBZGQgdGFyZ191bmRlcnNjb3JlPXllcy4KLQotMTk5OS0wNy0yMSAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJc3N1ZSBhbiBlcnJvcgotCW1lc3NhZ2UJYW5kIGZhaWwgaWYgYSBzeW1ib2wgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEdldCB0aGUgR1AgdmFsdWUKLQl3aGVuIGxvb2tpbmcgYXQgYSBSX01JUFNfR09UMTYgcmVsb2NhdGlvbi4KLQotMTk5OS0wNy0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tODhrLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQotTW9uIEp1bCAxOSAxNDowMzo0NCAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IFJlc3RvcmUgc2V0dGluZyBvZiBHUAotIAlyZW1vdmVkIGluIHByZXZpb3VzIGNoYW5nZS4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IEdQIHJlbGF0aXZlIHJlbG9jYXRpb25zCi0gCWluIHJlbG9jYXRlYWJsZSBvdXRwdXQuCi0KLTE5OTktMDctMTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb2ZmLW04OGsuYyAobTg4a2Jjc192ZWMpOiBJbml0aWFsaXplIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0Ci0Jc3RydWN0dXJlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEbyBtZXJnZSBzeW1ib2xzIGZyb20gdGhlIHNhbWUgQkZECi0JaWYgdGhleSBhcHBlYXIgdG8gYmUgc3BlY2lhbGx5IGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4KLQotMTk5OS0wNy0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChhbHRlcm5hdGl2ZV90YXJnZXQpOiBOZXcgZmllbGQgaW4gYmZkX3RhcmdldAotCXN0cnVjdHVyZS4KLQkoYmZkX3NlYXJjaF9mb3JfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uOiAgRmluZCBhIHRhcmdldCB0aGF0Ci0Jc2F0aXNpZmllcyBhIHNlYXJjaCBmdW5jdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmeHgtdGFyZ2V0Lmg6IEluaXRpYWxpc2UgdGhlIGFsdGVybmF0aXZlX3RhcmdldCBmaWVsZCBvZgotCXRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZXMgdG8gcG9pbnQgdG8gdGhlIG90aGVyIHRhcmdldCAoaWYKLQlkZWZpbmVkKS4KLQkqIG5sbS10YXJnZXQuaDogSW5pdGlhbGlzZSB0aGUgYWx0ZXJuYXRpdmVfdGFyZ2V0IGZpZWxkIG9mCi0JdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlcyB0byBwb2ludCB0byB0aGUgb3RoZXIgdGFyZ2V0IChpZgotCWRlZmluZWQpLgotCQotCSogY29mZmNvZGUuaCAoQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMpOiBOZXcgbWFjcm8uCi0JKENSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDKTogTmV3IG1hY3JvLgotCQotCSogYWl4Mzg2LWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYW91dC1hZG9iZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBhb3V0LWFybS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBhb3V0LXRhcmdldC5oOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBhb3V0LXRpYzMwLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGJpbmFyeS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBib3V0LmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNpc2NvLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1hMjlrLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtYWxwaGEuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1hcG9sbG8uYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1hcm0uYzogVXNlIENSRUFURV97QklHfExJVFRMRX1fQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1oODMwMC5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLWg4NTAwLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtaTM4Ni5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjb2ZmLWk4NjAuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1pOTYwLmM6IFVzZSBDUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtbTY4ay5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLW1jb3JlLmM6IFVzZSBDUkVBVEVfe0JJR3xMSVRUTEV9X0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtbWlwcy5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjb2ZmLXBwYy5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjb2ZmLXJzNjAwMC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjb2ZmLXNoLmM6ICBVc2UgQ1JFQVRFX3tCSUd8TElUVExFfV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLXNwYXJjLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtdGljMzAuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi10aWM4MC5jOiBVc2UgQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLXc2NS5jOiAgIFVzZSBDUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtd2UzMmsuYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi16OGsuYzogICBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBocHBhYnNkLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogaHB1eC1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGkzODZtc2Rvcy5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBpMzg2b3M5ay5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBpZWVlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGloZXguYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogaXJpeC1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIG1pcHNic2QuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogbmV0YnNkLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogb2FzeXMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogb3NmLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogcHBjYm9vdC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBwdHJhY2UtY29yZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBzY281LWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogc29tLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHNyZWMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogdGVraGV4LmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHRyYWQtY29yZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiB2ZXJzYWRvcy5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiB2bXMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCi0xOTk5LTA3LTE5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHJlbF9oYXNoCi0JYW5kIHJlbF9oZHIuCi0KLVNhdCBKdWwgMTcgMDI6Mjg6MjggMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGp1c3RfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBVc2UgaXQuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IERlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IHRoZXJlIGNhbiBiZSAKLQl0d28gcmVsb2NhdGlvbiBzZWN0aW9ucyBmb3IgYSBzaW5nbGUgc2VjdGlvbi4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgR1AgZm9yIAotCWEgcmVsb2NhdGVhYmxlIG9iamVjdC4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHJlbG9jYXRlYWJsZSBsaW5rcy4KLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvKTogVXNlIEVMRjY0X1JfVFlQRV9JRC4KLQkoc3BhcmM2NF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLAotCXNwYXJjNjRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLAotCXNwYXJjNjRfZWxmX3NsdXJwX29uZV9yZWxvY190YWJsZSwgc3BhcmM2NF9lbGZfc2x1cnBfcmVsb2NfdGFibGUsCi0Jc3BhcmM2NF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIHNwYXJjNjRfZWxmX3dyaXRlX3JlbG9jcyk6Ci0JTmV3IGZ1bmN0aW9ucy4KLQkoc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzLCBzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlCi0JRUxGNjRfUl9UWVBFX0lEL0RBVEEgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogUmVtb3ZlCi0JRFRfU1BBUkNfUExURk1ULgotCi0xOTk5LTA3LTE2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9sb2NhbF9yZWxvY2F0aW9uX3ApOiBOZXcgc3RhdGljCi0JZnVuY3Rpb24uCi0JKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBDYWxsIGJmZF9zZXRfZXJyb3Igb24gZmFpbHVyZS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBVc2UgbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wLgotCUFsd2F5cyBzZXQgKnJlcXVpcmVfamFseHAuCi0JKG1pcHNfZWxmX3N0dWJfc2VjdGlvbl9wKTogTWFyayBhYmZkIHBhcmFtZXRlciBhcyB1bnVzZWQuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE9ubHkgbG9vayBmb3IgTE8xNiBmb2xsb3dpbmcKLQlHT1QxNiBpZiB0aGUgR09UMTYgaXMgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gIERvbid0IHJldHVybiBmYWxzZQotCWZvciBhbiB1bmRlZmluZWQgc3ltYm9sLiAgSWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3csIGFzc2VydCB0aGF0IHdlCi0JaGF2ZSBhIG5hbWUuCi0KLTE5OTktMDctMTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlcyBgbGluaycgYW5kIGBlbGZzZWMnLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBvcycuCi0KLVRodSBKdWwgMTUgMTc6NTU6MzEgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCk6IERvbid0IHJlcXVpcmUKLQlhIFBUX1BIRFIgcHJvZ3JhbSBoZWFkZXJzLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCBhc3N1bWUgdGhlcmUgYXJlIGdvaW5nIHRvIGJlCi0Jc2VjdGlvbiBzeW1ib2xzIHdoZW4gd2UncmUgbm90IGJ1aWxkaW5nIGEgc2hhcmVkIG9iamVjdC4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBNYWtlIHN1cmUgd2UgaGF2ZSBhIEdPVCB3aGVuCi0Jd2UgbmVlZCBvbmUuCi0KLTE5OTktMDctMTUgIEouVC4gQ29ua2xpbiAgPGp0Y0ByZWRiYWNrLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotdnh3b3JrcyopOiBOZXcgdGFyZ2V0LgotCi0xOTk5LTA3LTE1ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3N0dWJfc2VjdGlvbl9wKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEhhbmRsZSBNSVBTMTYgc3R1YiBmdW5jdGlvbnMuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgY2FsbGluZyBzZXF1ZW5jZSBmb3IKLQltaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbiBhbmQgbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLgotCShtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBUdXJuIGBqYWwnIGludG8gYGphbHgnIHdoZXJlCi0JcmVxdWlyZWQuCi0KLTE5OTktMDctMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi45LjUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBKdWwgMTUgMDI6NTY6MTUgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlLCBjYXNlIFJfSFBQQSk6IEhhbmRsZQotCTY0Yml0IGZvcm1hdC4KLQkoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSwgY2FzZSBSX0dPVE9GRik6IFVzZSBiYXNlIHJlbG9jIHR5cGUKLQl0byBkZXJpdmUgZmluYWwgdHlwZSBpbnN0ZWFkIG9mIGhhcmR3aXJpbmcgYSBzZWxlY3Rpb24uCi0KLTE5OTktMDctMTQgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogU3dhcCAxNi1iaXQgaGFsdmVzIG9mCi0JdGhpbmdzIHJlbG9jYXRlZCBieSBSX01JUFMxNl9HUFJFTC4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMTQgMTU6MjM6MTkgMTk5OSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmTk5fYmVkKTogQWRkIGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzLgotCi0xOTk5LTA3LTE0ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2dvdF9pbmZvKTogQWRkIGdsb2JhbF9nb3Ruby4KLQkoX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgaXQuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IFJlLXNvcnQ7IHZlcmlmeSB0aGUgZ290IGRpZCBub3QgZ3Jvdy4KLQkobWlwc19lbGZfc29ydF9oYXNoX3RhYmxlKTogU2V0IG1heF9ub25fZ290X2R5bmluZGV4IGJhc2VkIG9mZgotCW5ldyBhcmd1bWVudCBtYXhfbG9jYWwuCi0KLTE5OTktMDctMTQgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogU3dhcCB0aGUgMTYtYml0Ci0Jc3Vid29yZHMgd2hlbiBoYW5kbGluZyBhbiBSX01JUFMxNl8yNiByZWxvY2F0aW9uLgotCShtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCBiZSBwYXJhbm9pZCBhYm91ciByaWdodC1zaGlmdAotCXNlbWFudGljcy4KLQkKLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHMxNl9ncHJlbF9ob3d0byk6IEFkanVzdCBzcmNfbWFzayBhbmQKLQlkc3RfbWFzayB0byBtYXRjaCByZWFsaXR5LgotCShfYmZkX21pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogSGFuZGxlIFJfTUlQUzE2X0dQUkVMLgotCShtaXBzX2VsZl9vYnRhaW5fY29udGVudHMpOiBVc2UgYmZkX2dldC4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIFJfTUlQUzE2X0dQUkVMLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTE5OTktMDctMTMgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBIYW5kbGUgUl9NSVBTMTZfMjYuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgY2FsbGluZyBzZXF1ZW5jZSBmb3IgCi0JbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLgotCShtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBUYWtlIGFkZGl0aW9uYWwgYXJndW1lbnQuICBIYW5kbGUKLQlSX01JUFMxNl8yNi4gIFVzZSBiZmRfcHV0IGZvciBjb252ZW5pZW5jZS4KLQotMTk5OS0wNy0xMyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBUaGlua28gbGFzdCBjaGFuZ2UuCi0JQWx3YXlzIG92ZXJ3cml0ZSBwX2ZsYWdzLgotCi0xOTk5LTA3LTEzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIHdhbnRfZHluYnNzLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgY3JlYXRlCi0JLmR5bmJzcyBhbmQgLnJlbFthXS5ic3MgaWYgd2FudF9keW5ic3MuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9keW5ic3MpOiBQcm92aWRlIGRlZmF1bHQuCi0KLTE5OTktMDctMTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRG9uJ3Qgb3ZlcndyaXRlIHBfZmxhZ3MuCi0KLTE5OTktMDctMTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkpOiBOZXcuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGR5bmxvY2FsLgotCShfYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4KTogUHJvdG90eXBlLgotCShfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4KTogRGVsZXRlLgotCShfYmZkX2VsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMpOiBQcm90b3R5cGUuCi0JKF9iZmRfZWxmLGxpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKTogUHJvdG90eXBlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wpOiBOZXcgYWxpYXMuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgpOiBEZWxldGUuCi0JKF9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHgpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9saW5rX3JlbnVtYmVyX2hhc2hfdGFibGVfZHluc3ltcyk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmbGluay5oIChlbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8pOiBEZWxldGUgcmVtb3ZlZF9keW5hbWljLgotCShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLQlpbnN0ZWFkIG9mIGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcy4KLQlSZW1vdmUgcmVtb3ZlZF9keW5hbWljIGNvZGUuICBVc2UgX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBSZW1vdmUgcmVtb3ZlZF9keW5hbWljIGNvZGUuCi0JKGVsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMpOiBEZWxldGUuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IEluc3RhbGwgc2VjdGlvbiBhbmQgbG9jYWwgc3ltYm9scyBpbnRvIC5keW5zeW0uCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmluZHgpOiBEZWxldGUuCi0JKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCBzZWN0aW9uIGR5bmluZGljaWVzLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHdyaXRlIHNlY3Rpb24gZHluc3ltcy4KLQkqIGVsZjMyLW1pcHMuYzogU2ltaWxhcmx5LgotCSogZWxmMzItcHBjLmM6IFNpbWlsYXJseS4KLQkqIGVsZjMyLXNwYXJjLmM6IFNpbWlsYXJseS4KLQkqIGVsZjY0LWFscGhhLmM6IFNpbWlsYXJseS4KLQkqIGVsZjY0LXNwYXJjLmM6IFNpbWlsYXJseS4KLQotMTk5OS0wNy0xMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IERvIG5vdCBjb21wbGFpbgotCXdoZW4gX2dwX2Rpc3AgaXMgdW5kZWZpbmVkLiAgRG8gbm90IGNoZWNrIFJfTUlQU19MTzE2IGZvciBvdmVyZmxvdwotCXdoZW4gdGhlIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBfZ3BfZGlzcC4KLQotMTk5OS0wNy0xMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZHdhcmYyLmMgKHJlYWRfYXR0cmlidXRlKTogU3VwcG9ydCBEV19GT1JNX3JlZjguCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSBtaXBzXzMyX3JlbG9jcwotCXRvIHBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzLiAgQWRqdXN0IHVzYWdlIHRocm91Z2hvdXQgY29kZS4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBIYW5kbGUgUl9NSVBTXzY0IGNvcnJlY3RseS4KLQkoZWxmX21pcHNfY3RvcjY0X2hvd3RvKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogSGFuZGxlIFJfTUlQU182NCBsaWtlIFJfTUlQU18zMi4KLQlBZGp1c3QgaW5kZW50YXRpb24uCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTXzY0IGluIDMyLWJpdCBtb2RlLgotCShfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSBSX01JUFNfNjQgbGlrZSBSX01JUFNfMzIuCi0JVXNlIE1JUFNfRUxGX0dPVF9TSVpFIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBHT1QgZW50cmllcy4KLQkqIGVsZjY0LW1pcHMuYyAoZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxfcCk6IERlZmluZS4KLQotMTk5OS0wNy0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4uaDogUmVtb3ZlIHRlc3RzIG9mIENPRkZfSU1BR0VfV0lUSF9QRS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogTWFueSBmaWxlczogQ2hhbmdlcyB0byBhdm9pZCBnY2Mgd2FybmluZ3M6IEFkZCBBVFRSSUJVVEVfVU5VU0VECi0JYXMgYXBwcm9wcmlhdGUuICBVc2UgRU1QVFlfSE9XVE8gYXMgYXBwcm9wcmlhdGUuICBGaWxsIGluCi0Jc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucy4gIEFkZCBjYXN0cy4KLQkqIHJlbG9jLmMgKEVNUFRZX0hPV1RPKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogUmVtb3ZlIHVzZWxlc3MKLQljb21wYXJpc29ucyBhZ2FpbnN0IDAuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlCi0JcHJldmlvdXNfaWJmZF9lX2ZsYWdzIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiB2bXMuaCAoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0KTogQ2hhbmdlIHNlY3Rpb25fY291bnQgdG8KLQl1bnNpZ25lZC4KLQkqIHZtcy1nc2QuYyAoX2JmZF92bXNfc2x1cnBfZ3NkKTogQ2hhbmdlIHBzZWN0X2lkeCB0byB1bnNpZ25lZC4KLQkoX2JmZF92bXNfd3JpdGVfZ3NkKTogQ2hhbmdlIHN5bW51bSB0byB1bnNpZ25lZC4KLQkqIHZtcy1oZHIuYyAoX2JmZF92bXNfd3JpdGVfaGRyKTogQ2hhbmdlIHN5bW51bSB0byB1bnNpZ25lZC4KLQkqIHZtcy10aXIuYyAoZXRpcl9zdGEpOiBDaGFuZ2UgcHNlY3QgdG8gdW5zaWduZWQuCi0JKGFsbG9jX3NlY3Rpb24pOiBDaGFuZ2UgaWR4IHRvIHVuc2lnbmVkLgotCSh0aXJfc3RhLCB0aXJfY3RsKTogQ2hhbmdlIHBzZWN0IHRvIHVuc2lnbmVkLgotCShfYmZkX3Ztc193cml0ZV90aXIpOiBDaGFuZ2UgbGVuIGFuZCBiZWZvcmUgdG8gYmZkX3NpemVfdHlwZS4KLQkqIHZtcy5jIChwcml2X3NlY3Rpb25fY291bnQpOiBDaGFuZ2UgdG8gdW5zaWduZWQuCi0KLTE5OTktMDctMTIgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYzogQWRkIHNvbWUgQVRUUklCVVRFX1VOVVNFRC4KLQkqIG02OGtsaW51eC5jOiBMaWtld2lzZS4KLQotMTk5OS0wNy0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBSZW1vdmUgdW51c2VkIGxvY2FsCi0JdmFyaWFibGVzLiAgQWRkIGRlZmF1bHQgY2FzZSB0byBlbnVtIHN3aXRjaGVzLgotCSogY29mZi1hcm0uYyAoYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiBPbmx5Ci0JY29tcGlsZSBpZiBub3QgQ09GRl9JTUFHRV9XSVRIX1BFLgotCShyZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUsIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6IExpa2V3aXNlLgotCShiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IExpa2V3aXNlLgotCShiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGVwb2MtcGVpLWFybS5jOiBEb24ndCByZW5hbWUgYmZkX2FybSBmdW5jdGlvbnMuCi0JKiBwZWktYXJtLmM6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRG9uJ3QgZGVjbGFyZS4KLQkoTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkpOiBDb3JyZWN0IGxhc3QgY2hhbmdlLgotCShtaXBzX2VsZl9nb3QxNl9lbnRyeSk6IFB1dCBwYXJlbnMgYXJvdW5kICYgaW4gYm9keSBvZiA9PS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBDb3JyZWN0IHRlc3QgZm9yIGVtcHR5IHN0cmluZy4KLQkqIHZtcy1nc2QuYzogVXNlIF9iZmRfZXJyb3JfaGFuZGxlciByYXRoZXIgdGhhbiBmcHJpbnRmIHRvCi0Jc3RkZXJyLgotCSogdm1zLW1pc2MuYyAoX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sKTogQ29ycmVjdCBzcHJpbnRmCi0JZm9ybWF0LgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFueSBmaWxlczogQ2hhbmdlcyB0byBhdm9pZCBnY2Mgd2FybmluZ3M6IEFkZCBBVFRSSUJVVEVfVU5VU0VECi0JYXMgYXBwcm9wcmlhdGUuICBGaWxsIGluIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMuICBBZGQgdmFyaWFibGUKLQlpbml0aWFsaXphdGlvbnMuICBBZGQgY2FzdHMuCi0JKiBkd2FyZjEuYyAocGFyc2VfbGluZV90YWJsZSk6IENoYW5nZSBlYWNoTGluZSB0byB1bnNpZ25lZCBsb25nLgotCShkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGxvbmcuCi0KLQkqIGVsZi5jIChiZmRfZWxmX2hhc2gpOiBDaGFuZ2UgcGFyYW1ldGVyIGZyb20gdW5zaWduZWQgY2hhciAqIHRvCi0JY2hhciAqLgotCSogZWxmLWJmZC5oIChiZmRfZWxmX2hhc2gpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogUmVtb3ZlIGNhc3RzCi0Jd2hlbiBjYWxsaW5nIGJmZF9lbGZfaGFzaC4KLQotMTk5OS0wNy0xMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9wdXRfOCk6IE1ha2UgaXQgb2YgdHlwZSBgdm9pZCcuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbWlwcy5jIChNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSk6IENvbmRpdGlvbmFsaXplCi0JZm9yIDMyLWJpdCBob3N0cy4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uKTogQmUgdHlwZS1jb3JyZWN0LgotCi1UaHUgSnVsICA4IDEyOjMyOjIzIDE5OTkgIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4KLQotCSogY29uZmlnLmJmZCAoaHBwYSotKi1saW51eC1nbnUqKTogTmV3IHRhcmdldAotCi0xOTk5LTA3LTA3ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYtYmZkLmggKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBDb25zdGlmeS4KLQkoX2JmZF9taXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4JCi0JKF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9nY19tYXJrX2hvb2spOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9nY19zd2VlcF9ob29rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9kYXRhKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmMzJfb2JqZWN0X3ApOiBNb3ZlIGNvbnRlbnRzIGludG8KLQlfYmZkX21pcHNfZWxmX29iamVjdF9wLgotCShtaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMuCi0JKG1pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwLgotCShlbGZfbWlwc19hYmlfbmFtZSk6IENoYW5nZSBwcm90b3R5cGUuCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIpOiBNZXJnZSBpbnRvCi0JX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkci4KLQkobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBNZXJnZSBpbnRvCi0JX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZW5hbWUgdG8gX2JmZF9taXBzX2VsZl9maW5hbF9saW5rLiAgSW52b2tlCi0JdGhlIHJpZ2h0IGJhY2stZW5kIEVMRiBsaW5rZXIuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICBDbGVhbiB1cC4gIEFkanVzdCBmb3IgNjQtYml0IGNvZGUuCi0JKG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vay4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbik6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbi4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogUmVuYW1lIHRvIF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzLgotCUFkanVzdCBmb3IgNjQtYml0IGNvZGUuICBVc2UgbWlwc19lbGZfZ290X3NlY3Rpb24uCi0JKG1pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLiAgVXNlCi0JbWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wuICBVc2UgbWlwc19lbGZfZ290X3NlY3Rpb24uCi0JQWRqdXN0IGZvciA2NC1iaXQgY29kZS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLiAgQWRqdXN0IGZvciA2NC1iaXQgY29kZS4KLQkobWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zLgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vay4KLQkobWlwc19lbGZfbmV4dF9sbzE2X2FkZGVuZCk6IENvbnN0aWZ5LgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9vYnRhaW5fY29udGVudHMpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUpOiBOZXcgbWFjcm8uCi0JKE1JUFNfRUxGX1JFTF9TSVpFKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0RZTl9TSVpFKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0dPVF9TSVpFKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX1NZTV9TSVpFKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0dFVF9XT1JEKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX1BVVF9XT1JEKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZKTogTGlrZXdpc2UuCi0JKFNUVUJfTFcpOiBDb25kaXRpb25hbGl6ZSBmb3IgNjQtYml0IHZhbHVlLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBSX01JUFNfSElHSEVSIGFuZCBSX01JUFNfSElHSEVTVAotCWVudHJpZXMuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE1lcmdlIGVfaWRlbnRbRUlfQ0xBU1NdLgotCUNoZWNrIGl0IGZvciBpbmNvbnNpc3RlbmN5LgotCShfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQcmludCBBQkk9NjQgZm9yIDY0LWJpdAotCUFCSS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogUmVtb3ZlIGR1cGxpY2F0ZSBoYW5kbGluZyBvZgotCS5tc3ltLiAKLQkobWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleCk6IFVzZSBNSVBTX0VMRl9HT1RfU0laRS4KLQkobWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4KTogVXNlIG1pc3BfZWxmX2dvdF9zZWN0aW9uLgotCShtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5KTogVXNlIE1JUFNfRUxGX0dPVF9TSVpFLgotCShtaXBzX2VsZl9sb2NhbF9nb3RfaW5kZXgpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X3BhZ2UpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X2luZm8pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbik6IEhhbmRsZSAzMi1iaXQvNjQtYml0IHNwbGl0LgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IEhhbmRsZSA2NC1iaXQgY29kZS4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04sCi0JaW5zdGVhZCBvZiBjb25zdGFudCBgMicuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFRpZHkuICBVc2UgTUlQU19FTEZfR09UX1NJWkUuCi0JKG1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24pOiBVc2UgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04uCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZQotCU1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FLCBNSVBTX0VMRl9HT1RfU0laRSwKLQlNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWS4gIFJlbW92ZSAjaWYgMCdkIGNvZGUuCi0JQWRqdXN0IGFsbCByZWxldmVhbnQgZW50cmllcyBpbiBlbGYgYmFja2VuZCB0YWJsZS4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbW92ZS4KLQkobWlwc19lbGY2NF9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQlBZGp1c3QgZWxmIGJhY2tlbmQgZW50cmllcyB0byB1c2UgX2JmZF9taXBzX2VsZiB2YXJpYW50cyBub3cKLQlwdWJsaWNseSBhdmFpbGFibGUuCi0JCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSGFuZGxlIG5vbi1zdGFuZGFyZAotCWhhc2gtZW50cnkgc2l6ZXMuCi0JKHNpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBlbGYuYzogKGVsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBsaWJiZmQuYyAoYmZkX2dldCk6IE5ldyBtYWNyby4KLQkoYmZkX3B1dCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotMTk5OS0wNy0wNyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmLWJmZC5oIChlbGZfc2l6ZV9pbmZvKTogQWRkIGhhc2hfZW50cnlfc2l6ZSwKLQlpbnRfcmVsc19wZXJfZXh0X3JlbCwgc3dhcF9keW5fb3V0LCBzd2FwX3JlbG9jX2luLCBzd2FwX3JlbG9jX291dCwKLQl3YXBfcmVsb2NhX2luLCBhbmQgc3dhcF9yZWxvY2Ffb3V0LiAKLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uKTogQWRqdXN0IHRvIGhhbmRsZQotCW11bHRpcGxlIGludGVybmFsIHJlbG9jYXRpb25zIHBlciBleHRlcm5hbCByZWxvY2F0aW9uLgotCShsaW5rX3JlYWRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoZWxmX2djX21hcmspOiBMaWtld2lzZS4KLQkoZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9keW5fb3V0KTogQWRqdXN0IHR5cGUgdG8gbWF0Y2gKLQllbGZfc3dhcF9keW5faW4uCi0JKHNpemVfaW5mbyk6IEFkZCBlbnRyaWVzIGZvciBuZXcgZmllbGRzLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogRW5hYmxlLgotCShtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkobWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9pbik6IExpa2V3aXNlLgotCShtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShtaXBzX2VsZjY0X3NpemVfaW5mbyk6IEFkZCBlbnRyaWVzIGZvciBuZXcgZmllbGRzLgotCQotMTk5OS0wNy0wNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogQXNzZXJ0IHRoYXQgc2VjdGlvbiByZWxvY19jb3VudAotCWZpZWxkIGVxdWFscyB0aGUgbmV3IHJlbF9jb3VudCBmaWVsZC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB1c2UgdGhlIG5ldwotCXJlbF9jb3VudCBmaWVsZCByYXRoZXIgdGhhbiB0aGUgcmVsb2NfY291bnQgZmllbGQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBQZXJtaXQgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEKLQlzaGFyZWQgbGlicmFyeSB0byBvdmVycmlkZSBhIHdlYWsgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotCi1UdWUgSnVsICA2IDEwOjIzOjM5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oOiBSZXZlcnQgSnVseSAyLCAxOTk5IHBhdGNoLgotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlKTogVCBtb2RlIHNlbGVjdG9ycwotCW5lZWQgdG8gZ2VuZXJhdGUgRExUSU5EIHJlbG9jYXRpb25zLCBub3QgRExUUkVMIHJlbG9jYXRpb25zLgotCi0xOTk5LTA3LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlY29nbmlzZSBhcm0gNQotCWFyY2hpdGVjdHVyZXMuIAotCShjb2ZmX3NldF9mbGFncyk6IFJlY29nbmlzZSBhcm0gNSBhcmNoaXRlY3R1cmVzLgotCi0JKiBjcHUtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gYW5kIGFybTkgY3B1cy4KLQlBZGQgc3VwcG9ydCBmb3IgYXJtdjUgYXJjaGl0ZWN0dXJlLgotCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX21hY2hfYXJtXzUgYW5kIGJmZF9tYWNoX2FybV81VC4KLQkKLQkqIHJlbG9jLmM6IEFkZCBuZXcsIGFzc2VtYmxlciBvbmx5LCBBUk0gcmVsb2M6Ci0JQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURS4KLQkKLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotMTk5OS0wNy0wMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZHdhcmYyLmMgKHBhcnNlX2NvbXBfdW5pdCk6IEFkZCBBQkJSRVZfTEVOR1RIIHBhcmFtZXRlci4KLQkoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBBZGQgQUREUl9TSVpFIHBhcmFtZXRlci4KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFBhc3MgaXQuCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKEFCSV82NF9QKTogTmV3IG1hY3JvLgotCShJUklYX0NPTVBBVCk6IFdlIGFyZSBJUklYNi1jb21wYXRpYmxlIGlmIEFCSV82NF9QLgotCShfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRqdXN0IGNhbGwgdG8KLQlfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDctMDIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgKiBhdCB0aGUgZW5kIG9mIGlbMzQ1Nl04Ni0qLXVuaXh3YXJlLgotCi1GcmkgSnVsICAyIDEyOjIxOjEwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChIUFBBX1JfQVJHX1JFTE9DKTogRGVsZXRlLgotCShIUFBBX1JfQ09OU1RBTlQsIEhQUEFfUl9BRERFTkQpOiBMaWtld2lzZS4KLQotMTk5OS0wNy0wMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmLWJmZC5oIChiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCByZWxfY291bnQgYW5kIHJlbF9jb3VudDIKLQlmaWVsZHMuCi0JKF9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkcik6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi5jIChfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rKTogVXNlIGJmZF96YWxsb2MsIHJhdGhlciB0aGFuCi0JYmZkX2FsbG9jIGZvbGxvd2VkIGJ5IG1lbXNldC4KLQkoX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbSAuLi4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBIZXJlLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogQXNzaWduIHNlY3Rpb24gbnVtYmVycyBmb3IgdGhlIHNlY29uZAotCXJlbG9jYXRpb24gc2VjdGlvbiwgaWYgcmVxdWlyZWQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBVc2UgZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBVc2UgZWxmX2xpbmtfb3V0cHV0X3JlbG9jcy4KLQkKLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogVXNlCi0JX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyIHRvIGluaXRpYWxpemUgcmVsX2hkcjIuCi0KLVRodSBKdWwgIDEgMTM6NTg6NDggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIFJfUENSRUxfQ0FMTAotCXdpdGggMjJiaXQgZm9ybWF0LgotCi0xOTk5LTA2LTI4ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2dvdF9pbmZvKTogTW92ZSBkZWNsYXJhdGlvbiBiZWZvcmUKLQlwcm90b3R5cGVzLiAgQ2hhbmdlIGdsb2JhbF9nb3RzeW0gdG8gYmUgYSBwb2ludGVyIHRvIGEgaGFzaCBlbnRyeSwKLQlyYXRoZXIgdGhhbiBhIG51bWJlciBpbmRleC4KLQkobWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogTW92ZSBkZWNsYXJhdGlvbiBiZWZvcmUgcHJvdG90eXBlcy4KLQkobWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9zaWduX2V4dGVuZCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9oaWdoKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2hpZ2hlcik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9oaWdoZXN0KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXgpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfbG9jYWxfZ290X2luZGV4KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleCk6IExpa2Vpd3NlLgotCShtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X3BhZ2UpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfbmV4dF9sbzE2X2FkZGVuZCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9vYnRhaW5fY29udGVudHMpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2Fzc2lnbl9ncCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X2luZm8pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nb3QxNl9lbnRyeSk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIGRlc2NyaXB0aW9uIG9mIFJfTUlQU19TQ05fRElTUC4KLQkobWlwc19lbGZfZmluYWxfZ3ApOiBVc2UgbWlwc19lbGZfYXNzaWduX2dwLgotCShfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogRG9uJ3QgbW92ZSBTSE5fQ09NTU9OIHN5bWJvbHMKLQlpbnRvIFNITl9TQ09NTU9OIGF1dG9tYXRpY2FsbHkgb24gSVJJWDYuCi0JKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV3cml0ZSwgdXNpbmcKLQltaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbiBhbmQgbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9uKTogVXNlIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FLgotCURvbid0IGRlYWwgd2l0aCAucmxkX21hcCBvbiBJUklYNi4KLQkobWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogQWRqdXN0IHVzZSBvZiBnbG9iYWxfZ290c3ltLiAgU2V0Ci0Jc2VjdGlvbiBmbGFncyBhcHByb3ByaWF0ZWx5IGZvciAuZ290LgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBIYW5kbGUgSVJJWDYgcmVsb2NhdGlvbnMgbWFraW5nIHVzZSBvZgotCXRoZSBnb3QuICBDYWxsIG1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCBhbmQgYWxsb2NhdGUKLQlsb2NhbCBnb3Qgc3BhY2UgYXBwcm9wcmlhdGVseS4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIGJmZF9ieXRlICosIG5vdCB1bnNpZ25lZAotCWNoYXIgKi4gIFJld29yayBjYWxjdWxhdGlvbiBvZiBHT1Qgc2l6ZS4gIFNvcnQgZHluYW1pYyBzeW1ib2wKLQl0YWJsZSBlbnRyaWVzIHNvIGVudHJpZXMgdGhhdCBkbyBub3QgcmVxdWlyZSBHT1QgZW50cmllcyBhcHBlYXIgYXQKLQl0aGUgYmVnaW5uaW5nLiAgRG9uJ3QgdXNlIERUX01JUFNfSElQQUdFTk8gb24gSVJJWDYuICBSZW1vdmUgZGVhZAotCWNvZGUgZGVhbGluZyB3aXRoIERUX0lOSVQgYW5kIERUX0ZJTkkuICBSZW1vdmUgZmlkZGxpbmcgd2l0aAotCWdsb2JhbF9nb3RzeW0uCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEFkanVzdCBjcmVhdGlvbiBvZiBnbG9iYWwgR09UCi0JZW50cmllcy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlCi0JbWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENvcnJlY3Qgb2ZmLWJ5LW9uZSBlcnJvcgotCXNldHRpbmcgRFRfTUlQU19VTlJFRkVYVE5PLiAgQWRqdXN0IHNldHRpbmcgb2YgRFRfTUlQU19HT1RTWU0gZm9yCi0JY2hhbmdlIHRvIGdsb2JhbF9nb3RzeW0uICBTZXQgRFRfTUlQU19PUFRJT05TIG9uIElSSVg2LgotCQkKLTE5OTktMDYtMzAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgQ1BJQyB3aGVuIGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluay4gIEZyb20gUmFsZiBCYWVjaGxlIDxyYWxmQHVuaS1rb2JsZW56LmRlPi4KLQotMTk5OS0wNi0wNCAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZWxmMzItYXJtLmggKGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplKTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMjggIEppbSBQaWNrICA8amltQGppbXBpY2suY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBNaW5kIG5vX3VuZGVmaW5lZAotCi1UdWUgSnVuIDI5IDAyOjI1OjAzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuYyAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBVc2UgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGFzCi0JcmVsb2NhdGlvbiBmdW5jdGlvbi4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBLaWxsIHVudXNlZC91bndhbnRlZCBmdW5jdGlvbi4KLQotMTk5OS0wNi0yNyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FKTogTmV3IG1hY3JvLgotCShNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIHRoZW0uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLiAgQWRkIC5zcmRhdGEgdG8gdGhlIGxpc3QKLQlvZiBHUC1yZWxhdGl2ZSBzZWN0aW9ucy4KLQkoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFVzZSB0aGVtLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFNoYXJlIGNvZGUgYmV0d2VlbiAuc2RhdGEgYW5kCi0JLmxpdDQvLmxpdDggc2VjdGlvbnMuICBTZXQgYXBwcm9wcmlhdGUgZmxhZ3MgZm9yIC5zcmRhdGEuCi0JKG1pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogQWRkIGhhbmRsaW5nIGZvcgotCVBUX01JUFNfT1BUSU9OUyBzZWdtZW50IG9uIElSSVg2LgotCShtaXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBMaWtlaXdzZS4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IFNldCBFRl9NSVBTX0NQSUMgd2hlbiByZXF1aXJlZCBieSB0aGUgQUJJLgotCUluY2x1ZGUgdGhlIG9wdGlvbnMgc2VjdGlvbnMgb24gSVJJWDYuICBEb24ndCBsb29rIGZvciBHUC1yZWxhdGl2ZQotCXNlY3Rpb25zIGJ5IG5hbWU7IHVzZSBTSEZfTUlQU19HUFJFTCBpbnN0ZWFkLgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IEFkanVzdCB0byB1c2UgL3Vzci9saWIzMi9saWJjLnNvLjEgZm9yCi0JdGhlIE4zMiBBQkkuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgbXVjayBhYm91dCB3aXRoIHNlY3Rpb24KLQlhbGlnbm1lbnRzIGFuZCBzdWNoIG9uIElSSVg2LgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLiBBZGp1c3QgdG8gaGFuZGxlIHRoZQotCWZhY3QgdGhhdCBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiBpcyBubyBsb25nZXIgYSBjb25zdGFudC4gIFVzZQotCWJmZF96YWxsb2MgcmF0aGVyIHRoYW4gYmZkX2FsbG9jIGFuZCBtZW1zZXQuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRS4KLQlEb24ndCBhc3NlcnQgdGhlIGV4aXN0ZW5jZSBvZiAucmxkX21hcCBvbiBJUklYNi4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JCQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9hZGp1c3RfZHluaW5keCk6IFJlbW92ZS4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgKLQlpbnN0ZWFkLgotCi0xOTk5LTA2LTI2ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3N3YXBfbXN5bV9pbik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfc3dhcF9tc3ltX291dCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfY3JlYXRlX21zeW1fc2VjdGlvbik6IExpa2V3aXNlLgotCShNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSk6IE5ldyBtYWNyby4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IHNoX2xpbmsgZm9yIC5tc3ltLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVqZWN0IGFuIFNIVF9NSVBTX01TWU0KLQlzZWN0aW9uIG5vdCBuYW1lZCAubXN5bS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogVXNlIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FLCBub3QKLQkubXN5bSBkaXJlY3RseS4gIFNldCBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGZvciB0aGUgLm1zeW0KLQlzZWN0aW9uLgotCShtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgbWluX2R5bl9yZWxvY19pbmRleCBmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBDbGVhciBpdC4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgdGhlIC5tc3ltIHNlY3Rpb24KLQlvbiBJUklYNi4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUKLQkubXN5bSBzZWN0aW9uLiAgQWRkIGEgRFRfTUlQU19NU1lNIGVudHJ5LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBXcml0ZSBvdXQgYSAubXN5bSBlbnRyeSBmb3IKLQl0aGUgc3ltYm9sLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEFzc2lnbiBhIHZhbHVlIGZvcgotCURUX01JUFNfTVNZTS4gIEFkZCAubXN5bSBlbnRyaWVzIGZvciB0aGUgc2VjdGlvbiBzeW1ib2xzIGFzIHdlbGwuCi0KLQkqIGVsZjMyLW1pcHMuYyAoaXJpeF9jb21wYXRfdCk6IE5ldyBlbnVtZXJhdGlvbi4KLQkoQUJJX04zMl9QKTogTmV3IG1hY3JvLgotCShJUklYX0NPTVBBVCk6IExpa2V3aXNlLgotCShTR0lfQ09NUEFUKTogSW1wbGVtZW50IGluIHRlcm1zIG9mIElSSVhfQ09NUEFULgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8uCi0JCi0xOTk5LTA2LTI2ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IE1hcmsgbm9uIHJlYWRvbmx5IEJGRCBzZWN0aW9ucwotCWFzIHdyaXRhYmxlIFBFIHNlY3Rpb25zLgotCi0xOTk5LTA2LTI2ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBhcmFuZ2UpOiBOZXcgdHlwZS4KLQkoc3RydWN0IGNvbXBfdW5pdCk6IFJlcGxhY2UgTE9XIGFuZCBISUdIIGJ5IG1lbWJlciBBUkFOR0UuCi0JKGFyYW5nZV9hZGQpOiBOZXcgZnVuY3Rpb24uCi0JKGRlY29kZV9saW5lX2luZm8pOiBLZWVwIHRyYWNrIG9mIGFkZHJlc3MgcmFuZ2VzIHRoYXQgYSBjb21waWxhdGlvbgotCXVuaXQgY292ZXJzLgotCShjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyk6IFJldHVybiB0cnVlIGlmIGFkZHJlc3MgaXMgY29udGFpbmVkCi0JaW4gX2FueV8gb2YgdGhlIGFkZHJlc3MgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbXBpbGF0aW9uIHVuaXQuCi0JKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2FsbCBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUKLQlvbiB0aGUgZmlyc3QgY29tcF91bml0IHRoYXQgY29udGFpbnMgdGhlIGFkZHJlc3MuCi0KLTE5OTktMDYtMjYgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBkd2FyZjIuYyAoc3RydWN0IGR3YXJmMl9kZWJ1Zyk6IEFkZCBtZW1iZXIgZHdhcmZfbGluZV9idWZmZXIuCi0JKGRlY29kZV9saW5lX2luZm8pOiBBZGQgdmFyaWFibGUgU1RBU0ggYW5kIGluaXRpYWxpemUgaXQgdG8gcG9pbnQKLQl0byB0aGUgcGVyLWJmZCBkd2FyZjJfZGVidWcgaW5mby4gIFJlbW92ZSBzdGF0aWMgdmFyaWFibGUKLQlkd2FyZl9saW5lX2J1ZmZlciBhbmQgdXNlIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlciBpbiBpdHMgcGxhY2UuCi0KLTE5OTktMDYtMjYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBJdCdzIE9LIGZvciBhIC1Cc3ltYm9saWMKLQlzaGFyZWQgbGlicmFyeSB0byBoYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLQlGcm9tIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPjoKLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggbGFzdCBwYXRjaC4KLQotVGh1IEp1biAyNCAyMDo1OToxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmMgKGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmM6IFJlbW92ZSBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gc3ltYm9sIGV4dGVuc2lvbgotCXNlY3Rpb25zICYgcmVjb3Jkcy4gIFVzZSB0aGUgY29tbW9uIGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0KLTE5OTktMDYtMjIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIHVzZXItc3BlY2lmaWVkIGluaXQvZmluaQotCWZ1bmN0aW9ucyBpbnN0ZWFkIG9mIF9pbml0L19maW5pIGlmIHJlcXVlc3RlZC4KLQotMTk5OS0wNi0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBdm9pZCBjcmFzaGluZyBvbiBhIGJvZ3VzIHNoX2xpbmsKLQlmaWVsZC4KLQotMTk5OS0wNi0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPjoKLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB1bnVzZWQgZHluaW5keAotCWZpZWxkIHRvIDAsIG5vdCAtMS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENoZWNrIGZvciBwb3NpdGl2ZSBzZWN0aW9uCi0JZHluaW5keCBmaWVsZCwgcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgLTEuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE9ubHkgcmV0dXJuIGZhbHNlIGlmIHVuZGVmaW5lZF9zeW1ib2wKLQlvciByZWxvY19vdmVyZmxvdyBmYWlsLCBub3QgYWx3YXlzIHVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yLgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGxpbmtfcmVhZF9yZWxvY3MpOiBFeHBsaWNpdGx5IGNhc3QgZXh0ZXJuYWxfcmVsb2NzIHRvCi0JYmZkX2J5dGUgKiBiZWZvcmUgcGVyZm9ybWluZyBwb2ludGVyIGFyaXRobWV0aWMuCi0KLVR1ZSBKdW4gMjIgMTM6MDY6MjUgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oOiBOZXcgZmlsZS4gIENvbW1vbiBzdHVmZiBmb3IgZWxmMzIgYW5kIGVsZjY0IFBBCi0Jc3VwcG9ydC4KLQkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBlbGYtaHBwYS5oLgotCShBUkNIX1NJWkUpOiBEZWZpbmUuCi0JKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlLiAgRm91bmQgaW4gdGhlIGNvbW1vbiBjb2RlCi0Jbm93LgotCShlbGYzMl9ocHBhX2luZm9fdG9faG93dG8pOiBTaW1pbGFybHkuCi0JKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IFNpbWlsYXJseS4KLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBTaW1pbGFybHkuCi0JKiBlbGYzMi1ocHBhLmggKEVMRl9IT1dUT19UQUxCRSwgTl9QQVJJU0NfUkVMT0NTKTogRGVsZXRlLgotCi0xOTk5LTA2LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDYXRjaCBvdmVyZmxvdwotCWhhbmRsaW5nIFJfVjg1MF8yMl9QQ1JFTCByZWxvY2F0aW9uLgotCi0xOTk5LTA2LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogRXhwbGljaXRseSBkZWNsYXJlIHJldHVybgotCXR5cGUuCi0KLVN1biBKdW4gMjAgMTQ6MTM6NTcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBJZ25vcmUgc2VjdGlvbnMKLQlESVNDQVJEZWQgYnkgdGhlIGxpbmsgc2NyaXB0LgotCi0xOTk5LTA2LTE5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMpOgotCVJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgc3BwLgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyYXNoIGlmCi0JdGhlIGVudHJ5IHN5bWJvbCBpcyBub3Qgc2V0LgotCi1GcmkgSnVuIDE4IDA0OjI0OjU3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBhZGp1c3QKLQlHUERJU1Agb3IgTElUVVNFIGluIGEgcmVsb2NhdGFibGUgbGluay4KLQotVGh1IEp1biAxNyAyMToyNDo0MyAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGR3YXJmMS5jIChhbGxvY19kd2FyZjFfdW5pdCk6IEFsbG9jYXRlIHVzaW5nIGJmZF96YWxsb2MuCi0JKiAoYWxsb2NfZHdhcmYxX2Z1bmMpOiBMaWtld2lzZS4KLQotV2VkIEp1biAxNiAwMzowOTo1NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogRml4IHZhcmlvdXMgZm9ybWF0dGluZyBlcnJvcnMuCi0JKGFzc2VtYmxlXzMpOyBSZXdyaXRlIHVzaW5nIENBVEVOQVRFLgotCShhc3NlbWJsZV8xNyk6IEZpeCB2YXJpb3VzIGJ1Z3MuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1jb3JlLmMgKFJfTUNPUkVfUkFXKTogRml4IGRlZmluaXRpb24uCi0KLTE5OTktMDYtMTUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX1NIT1JUKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyk6Ci0JUmVtb3ZlIGFiZmQgcGFyYW1ldGVyLiAgVXNlIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dC4KLQkoYmZkX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGp1c3QgY2FsbGVycyBhY2NvcmRpbmdseS4KLQkKLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCk6IERlZmluZSBpdC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVtb3ZlX3NlY3Rpb25fYW5kX2FkanVzdF9keW5pbmRpY2VzKTogTmV3Ci0JZnVuY3Rpb24uCi0JKGJmZF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIGl0LgotCi0xOTk5LTA2LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfMzg2X1BDOCBmcm9tCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQgdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi0xOTk5LTA2LTEzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwKLQlzcGxpdCBvdXQgZnJvbSAuLi4KLQkoZWxmX2xpbmtfcmVhZF9yZWxvY3MpOiBIZXJlLiAgVXNlIGl0IGZvciBib3RoIHJlbG9jYXRpb24KLQlzZWN0aW9ucy4KLQotMTk5OS0wNi0xMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uKTogRG9uJ3QgYXNzdW1lCi0JYXNlY3QtPnJlbG9jX2NvdW50IGlzIHZhbGlkLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFBlcm1pdCBhCi0JU0hUX01JUFNfUkVHSU5GTyBzZWN0aW9uIHRvIGhhdmUgYSBzaXplIG9mIDAuCi0KLTE5OTktMDYtMTIgIERhdmlkIE8nQnJpZW4gIDxvYnJpZW5AZnJlZWJzZC5vcmc+Ci0KLQkqIGNvbmZpZy5iZmQgKGFscGhhKi0qLWZyZWVic2QqKTogTmV3IHRhcmdldC4KLQkoaVszNDU2XTg2LSotZnJlZWJzZCopOiBOb3cgZGVmYXVsdHMgdG8gRUxGLgotCi0xOTk5LTA2LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVsb2MuYyAoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IFBlcm1pdCBiaXRmaWVsZCByZWxvY2F0aW9ucyB0bwotCXdyYXAgaWYgdGhlIHJlbG9jYXRpb24gY292ZXJzIHRoZSBoaWdoIGJpdCBvZiBhbiBhZGRyZXNzLgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgZmlyc3RfdGltZS4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGY2NF9zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIFJfU1BBUkNfbWF4X3N0ZAotCWluc3RlYWQgb2YgUl9TUEFSQ19tYXguCi0JKHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8pOiBMaWtld2lzZS4KLQkqIGVsZjMyX3NwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfaW5mb190b19ob3d0byk6IExpa2V3aXNlOyBoYW5kbGUgdnRhYmxlIHJlbG9jYXRpb25zLgotCi0xOTk5LTA2LTA3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IFJlbW92ZSBvdXRwdXQKLQlzZWN0aW9ucyB3aXRoIG5vIGluaXRpYWwgbGlua19vcmRlci4KLQotMTk5OS0wNi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTg4ay5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLU1vbiBKdW4gIDcgMTE6NDk6NDMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoU09VUkNFX0hGSUxFUyk6IEFkZCBtaXNzaW5nIGhlYWRlcnMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDYtMDYgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2RhdGEpOiBSZWNvZ25pemUKLQl0aGUgTjMyIEFCSS4KLQotMTk5OS0wNi0wNCAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBiYXJmIG9uIG91dCBvZgotCXJhbmdlIHVuZGVmd2VhayBzeW1ib2xzLgotCSogaGFzaC5jOiBBZGQgbWlzc2luZyBjb21tYSBhZnRlciBAeHJlZnt9Ci0JKiBsaW5rZXIuYzogTGlrZXdpc2UuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZnh4LXRhcmdldC5oIChFTEZfTUFYUEFHRVNJWkUpOiBQcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UKLQlpZiBub3QgZGVmaW5lZC4KLQkqIGVsZjMyLWdlbi5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKiBlbGYzMi1pODYwLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQkqIGVsZjMyLWk5NjAuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCSogZWxmNjQtZ2VuLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotMTk5OS0wNi0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZHdhcmYxLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZHdhcmYxLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBlcG9jLWFybS1wZSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIHBlLWFybS5jOiBPbmx5IHJlZGVmaW5lIGludGVyd29ya2luZyBmdW5jdGlvbiBuYW1lcyBpZiB0aGV5IGhhdmUKLQlub3QgYWxyZWFkeSBiZWVuIHJlZGVmaW5lZC4KLQkqIHBlaS1hcm0uYzogT25seSByZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgaWYgdGhleSBoYXZlCi0Jbm90IGFscmVhZHkgYmVlbiByZWRlZmluZWQuCi0JKiBlcG9jLXBlLWFybS5jOiBSZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgdG8gYXZvaWQgYQotCW5hbWUgc3BhY2UgY2xhc2guCi0JKiBlcG9jLXBlaS1hcm0uYzogUmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIHRvIGF2b2lkIGEKLQluYW1lIHNwYWNlIGNsYXNoLgotCi0xOTk5LTA2LTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoRUxGX01BWFBBR0VTSVpFKTogRGVmYXVsdCB0byAweDEwMDAgbm90IDEuCi0KLUZyaSBKdW4gIDQgMTA6MDU6MTEgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBVbmRvIGNoYW5nZSBvZiAxOTk5LTA1LTEwLgotCi1GcmkgSnVuICA0IDAzOjEwOjQ5IDE5OTkgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEZpeCBzZXR0aW5nIG9mCi0Jc3RhcnQgLyBzdG9wIGZvciByZWNhbGN1bGF0aW5nIG9mIHJfYWRkZW5kIG9mIFJfU0hfU1dJVENIKi4KLQotRnJpIEp1biAgNCAwMjo1MzoxMyAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBIYW5kbGUgUl9TSF9TV0lUQ0gzMgotCWluIG90aGVyIHRleHQgc2VjdGlvbnMuCi0KLUZyaSBKdW4gIDQgMDI6Mjk6MzQgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBsaWJiZmQuYyAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmLXNoLmMgKHNoX21lcmdlX3ByaXZhdGVfZGF0YSk6IERlbGV0ZS4KLQkoY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSB0bwotCV9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoLgotCShlbGYzMi1zaC5jKTogYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhOiBEZWZpbmUuCi0KLTE5OTktMDYtMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaDogRml4IHR5cG86IGNoYW5nZSBFTEZfTUFYUEFHRV9TSVpFIHRvIEVMRl9NQVhQQUdFU0laRS4KLQotMTk5OS0wNi0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6IENvcnJlY3QKLQlwcm90b3R5cGUuCi0JKGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTAzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBsaW5lX2luZm8pOiBBZGQgbWVtYmVyIEVORF9TRVFVRU5DRSB0byBrZWVwCi0JdHJhY2sgb2YgZW5kX3NlcXVlbmNlIG1hcmtlcnMuCi0JKGFkZF9saW5lX2luZm8pOiBBZGQgRU5EX1NFUVVFTkNFIGFyZy4KLQkoZGVjb2RlX2xpbmVfaW5mbyk6IERvbid0IHRyeSB0byBpbmZlciBsb19wYyBhbmQgaGlfcGMgZnJvbSB0aGUKLQlkZWJ1Zy1saW5lIGluZm8tLS1pdCBkb2Vzbid0IHdvcmsgcmlnaHQgaWYgYSBjb21waWxhdGlvbiB1bml0Ci0JY29uc2lzdHMgb2YgbXVsdGlwbGUgZGlzY29udGlndW91cyBjb2RlLXNlcXVlbmNlcy4gIEl0IHdvdWxkIGJlCi0Jd29ydGh3aGlsZSB0byBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGEgY29tcGlsYXRpb24KLQl1bml0IHJlc3VsdHMgaW4gYSBjb250aWd1b3VzIHNldCBvZiBjb2RlIHNlcXVlbmNlcywgYnV0IHRoaXMgaXMKLQlxdWl0ZSB0cmlja3kgdG8gZ2V0IHJpZ2h0IGZvciBhcmJpdHJhcnkgRFdBUkYyIGZpbGVzLgotCShsb29rdXBfYWRkcmVzc19pbl9saW5lX2luZm9fdGFibGUpOiBEb24ndCB1c2UgdGhlIGxhc3QgbGluZSBlbnRyeQotCWZvciBhIGNvbXBpbGF0aW9uIHVuaXQgZm9yIGFueXRoaW5nIHdpdGggYW4gYWRkcmVzcyBoaWdoZXIgdGhhbgotCXRoaXMgbGluZSBlbnRyeS4gIEFsc28sIGNoZWNrIGZvciBlbmRfc2VxdWVuY2UgbWFya2VycyB0bwotCWNvcnJlY3RseSBoYW5kbGUgZGlzY29udGludWl0aWVzLgotCShfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IFdoZW4gY2hlY2tpbmcgcHJldmlvdXNseSBsb2FkZWQKLQljb21waWxhdGlvbiB1bml0cywgY2hlY2sgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggZWFjaC0+aGlnaD09MAotCWp1c3QgbGlrZSB3aGVuIHJlYWRpbmcgY29tcGlsYXRpb24gdW5pdHMuCi0KLQkqIGR3YXJmMi5jIChkZWNvZGVfbGluZV9pbmZvKTogSW5pdGlhbGl6ZSB0YWJsZS0+ZmlsZXMgYW5kCi0JdGFibGUtPmxhc3RfbGluZSB0byBOVUxMIHRvIGF2b2lkIHNlZ2ZhdWx0cyBkdWUgdG8gcmFuZG9tCi0JdmFsdWVzIGluIHRoZXNlIG1lbWJlcnMuCi0JKGNvbmNhdF9maWxlbmFtZSk6IENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgZmlsZSBudW1iZXIgYmVmb3JlCi0JaW5kZXhpbmcgZmlsZW5hbWUgdGFibGUuICBTZWdmYXVsdHMgc3Vjay4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnVuY2F0ZSBhZGRyZXNzIHRvIGxlYXN0Ci0Jc2lnbmlmaWNhbnQgMzIgYml0cyAoYnJlYWtzIDY0IGJpdCB0YXJnZXRzKS4KLQkobG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUpOiBEaXR0by4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBEaXR0by4KLQotMTk5OS0wNi0wMiAgTWFyayBNaXRjaGVsbCAgPE1hcmsgTWl0Y2hlbGwgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgUl9NSVBTX0pBTFIuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsYSk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sCi0Jc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IEhlcmUuICBVc2UgaXQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEKLQlzaW5nbGUgc2VjdGlvbiBoYXMgdHdvIGFzc29jaWF0ZWQgcmVsb2NhdGlvbiBzZWN0aW9ucy4KLQotMTk5OS0wNi0wMiAgTWFyayBTYWx0ZXIgIDxtc2FsdGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogU2V0IGxtYSBmcm9tIHNfdmFkZHIgaWYKLQlDT0ZGX1dJVEhfUEUgZGVmaW5lZC4KLQotMTk5OS0wNi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGUtYXJtLmM6IFJlbmFtZSBnbG9iYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMgdG8gYXZvaWQgbmFtZQotCWNvbGxpc2lvbiB3aGVuIGFsbCB0YXJnZXRzIEJGRCBpcyBidWlsdC4KLQkqIHBlaS1hcm0uYzogRGl0dG8uCi0KLTE5OTktMDUtMzEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSB1c2VfcmVsYV9wLiAgQWRkCi0JbWF5X3VzZV9yZWxfcCwgbWF5X3VzZV9yZWxhX3AsIGRlZmF1bHRfdXNlX3JlbGFfcC4KLQkoYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgdXNlX3JlbGFfcC4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBTZXQgdXNlX3JlbGFfcCBhcHByb3ByaWF0ZWx5LgotCShfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rKTogTGlrZXdpc2UuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogVXNlIG1heV91c2VfcmVsYV9wLCBldGMuLCBpbnN0ZWFkIG9mCi0JdXNlX3JlbGFfcC4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENvcHkgdXNlX3JlbGFfcC4KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHVzZSByZWxhCi0JcmVsb2NzIGJhc2VkIG9uIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gaGVhZGVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBkZWZhdWx0X3VzZV9yZWxhX3AKLQlpbnN0ZWFkIG9mIHVzZV9yZWxhX3AuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxwKTogTmV3IG1hY3JvLgotCShlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcCk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9kZWZhdWx0X3VzZV9yZWxhX3ApOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogVXNlIHRoZW0uCi0KLVdlZCBKdW4gIDIgMTI6Mzg6NDkgMTk5OSAgTWlvZHJhZyBWYWxsYXQgPG1pb2RyYWdAbXVsdGltYW5pYS5jb20+Ci0KLQkqIGhvc3RzL2FscGhhbGludXguaCAoVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRCk6IEV4cGFuZCB0byA0MDk2LgotCi1UdWUgSnVuICAxIDE3OjU3OjU4IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtaXRjaGVsbEBuMDIuYWNsLmxhbmwuZ292PgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQU19TVUIpOiBOZXcgcmVsb2NhdGlvbi4KLQkoQkZEX1JFTE9DX01JUFNfR09UX1BBR0UpOiBMaWtld2lzZS4KLQkoQkZEX1JFTE9DX01JUFNfR09UX09GU1QpOiBMaWtld2lzZS4KLQkoQkZEX1JFTE9DX01JUFNfR09UX0RJU1ApOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBsaWJiZmQuaDogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfaW5mb190b19ob3d0b19yZWxhKTogTmV3IGZ1bmN0aW9uLgotCShVU0VfUkVMKTogQWRqdXN0IGZvciBuZXcgY29udmVudGlvbnMuCi0JKE1JTlVTX09ORSk6IE5ldyBtYWNyby4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgUl9NSVBTX1NVQi4KLQkobWlwc19yKTogQWRkIGVudHJpZXMgZm9yIE1JUFNfU1VCLCBNSVBTX0dPVF9QQUdFLCBNSVBTX0dPVF9PRlNULAotCWFuZCBNSVBTX0dPVF9ESVNQLgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IHNoX2xpbmssIG5vdCBzaF9pbmZvLCBmb3IgYQotCS5NSVBTLmNvbnRlbnQgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogVHJlYXQgYWxsIHNlY3Rpb25zIHRoYXQgYmVnaW4KLQl3aXRoIC5NSVBTLmNvbnRlbnQgYXMgLk1JUFMuY29udGVudCBzZWN0aW9ucy4gIFNldAotCVNIRl9NTklQU19OT1NUUklQIGZvciBzdWNoIHNlY3Rpb24uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIHRvIG1pcHNfaW5mb190b19ob3d0b19yZWxhLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX3IpOiAgQWRkIGVudHJpZXMgZm9yIE1JUFNfU1VCLCBNSVBTX0dPVF9QQUdFLAotCU1JUFNfR09UX09GU1QsIGFuZCBNSVBTX0dPVF9ESVNQLgotCi1XZWQgSnVuICAyIDExOjUxOjEyIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdm1zLW1pc2MuYyAoX2JmZF92bXNfaGFzaF9uZXdmdW5jKTogRml4IHVzZSBvZiB1bmluaXRpYWxpemVkCi0JdmFyaWFibGUuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQXZvaWQgYW1iaWdvdXMKLQlgZWxzZScuCi0KLTE5OTktMDUtMzAgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFJlaW5zdGF0ZSBjaGFuZ2Ugb2YKLQkxOTkzLTAzLTI1ICghISkuICBUYWtlIGludG8gYWNjb3VudCB0aGUgYml0bWFza3MgZm9yIHRoZSByZWxvYyBzbwotCXRoZSBhZGRlbmQgZG9lcyBub3Qgb3ZlcmZsb3cgaW50byB0aGUgcmVzdCBvZiB0aGUgd29yZC4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6IEFtZW5kIHByb3RvdHlwZSBmb3IKLQliZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gLgotCSogYmZkLWluLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZmFybS1vYWJpLmMgKE5VTV9FTEVNKTogTmV3IG1hY3JvOiBDb21wdXRlIHRoZSBudW1iZXIgb2YKLQllbGVtZW50cyBpbiBhIGZpeGVkIHNpemVkIGFycmF5LgotCShBUk1fRUxGX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShBUk1fRUxGX09TX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShSX0FSTV9USE1fQUJTNSk6IEZpeCByaWdodHNoaWZ0IGFuZCBzaXplLgotCShSX0FSTV9USE1fUEMyMik6IEZpeCBzaXplLgotCShSX0FSTV9QTFQzMik6IERlZmluZSBIb3d0by4KLQkoZmluZF9ob3d0byk6IE5ldyBmdW5jdGlvbjogTG9jYXRlIGEgaG93dG8gYmFzZWQgb24gYSByZWxvYwotCW51bWJlci4KLQkoZWxmMzJfYXJtX2luZm9fdG9faG93dG8pOiBVc2UgZmluZF9ob3d0byBpZiBuZWNlc3NhcnkuCi0JKGVsZjMyX2FybV9yZWxvY19tYXApOiBDaGFuZ2UgdHlwZSBvZiBmaWVsZCBiZmRfcmVsb2NfdmFsIHRvCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCShlbGYzMl9hcm1fcmVsb2NfbWFwW10pOiBBZGQgZW50cmllcyBmb3IgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0JYW5kIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkuCi0JKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6IFVzZSBmaW5kX2hvd3RvIGlmIG5lY2Vzc2FyeS4KLQotCSogZWxmYXJtLW5hYmkuYyAoTlVNX0VMRU0pOiBOZXcgbWFjcm86IENvbXB1dGUgdGhlIG51bWJlciBvZgotCWVsZW1lbnRzIGluIGEgZml4ZWQgc2l6ZWQgYXJyYXkuCi0JKEFSTV9FTEZfQUJJX1ZFUlNJT04pOiBEZWZpbmUuCi0JKEFSTV9FTEZfT1NfQUJJX1ZFUlNJT04pOiBEZWZpbmUuCi0JKFJfQVJNX1RITV9BQlM1KTogRml4IHJpZ2h0c2hpZnQgYW5kIHNpemUuCi0JKFJfQVJNX1RITV9QQzIyKTogRml4IHNpemUuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvX3JlbCk6IFJlbmFtZSB0byBlbGYzMl9hcm1faW5mb190b19ob3d0by4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcCk6IENoYW5nZSB0eXBlIG9mIGZpZWxkIGJmZF9yZWxvY192YWwgdG8KLQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUuCi0KLQkqIGVsZjMyLWFybS5oIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZXcgZmllbGQ6Ci0Jbm9fcGlwZWxpbmVfa25vd2xlZGdlLgotCShlbGYzMl9hcm1fbGlua19oYXNoX2NyZWF0ZSk6IEluaXRpYWxpc2UgbmV3IGZpZWxkIHRvIHplcm8uCi0JKGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IEFkZCBuZXcgcGFyYWVtdGVyOgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZS4gIFVzZSB0aGlzIHBhcmFtZXRlciB0byBpbml0aWFsaXNlIHRoZSBmaWVsZAotCWluIHRoZSBnbG9iYWxzIGRhdGEgc3RydWN0dXJlLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IE9ubHkgYWRkIGluIHBpcGVsaW5lIG9mZnNldCBpZgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZSBpcyBmYWxzZSBhbmQgdGhlIGJpbmFyeSBpcyBmcm9tIGFuIG9sZAotCXRvb2xjaGFpbi4KLQkoZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfZGF0YSk6IEdlbmVyYXRlIGFuIGVycm9yIGlmIGFuIGF0dGVtcHQgaXMKLQltYWRlIHRvIGxpbmwgdG9nZXRoZXIgYmlnIGVuZGlhbiBhbmQgbGl0dGxlIGVuZGlhbiBjb2RlLgotCShlbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBOZXcgZnVuY3Rpb246ICBJbml0aWFsaXNlIHRoZQotCUVJX09TQUJJIGFuZCBFSV9BQklWRVJTSU9OIGZpZWxkcyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBFTEYgcHJvZ3JhbQotCWhlYWRlci4KLQkoZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBEZWZpbmUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkOgotCWVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBEZWZpbmUgdG8KLQlOVUxMIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKGVsZk5OX2JlZCk6IEluaXRpYWxpc2UgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMgZmllbGQuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBTZXQgdGhlIEVJX09TQUJJIGFuZCBFSV9BQklWRVJTSU9OIGZpZWxkcwotCXRvIHplcm8uCi0JKF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENhbGwKLQllbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycyBpZiBkZWZpbmVkLgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayB3aGV0aGVyIGdldHVpZCBhbmQgZ2V0Z2lkIGV4aXN0LgotCSogYXJjaGl2ZS5jOiBEZWZpbmUgZ2V0dWlkIGFuZCBnZXRnaWQgYXMgbWFjcm9zIGlmIEhBVkVfR0VUVUlEIG9yCi0JSEFWRV9HRVRHSUQgYXJlIG5vdCBkZWZpbmVkLCByZXNwZWN0aXZlbHkuCi0JKGJmZF93cml0ZV9hcm1hcCk6IERvbid0IHNwZWNpYWwgY2FzZSBvbiBfV0lOMzIgZm9yIGdldHVpZCBhbmQKLQlnZXRnaWQuCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IGFjX2N2X2Z1bmNfZ2V0e3VnfWlkIGZvciAqLSotd2luZG93cyouCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNS0yOCAgTWFydGluIERvcmV5ICA8bWRvcmV5QG1hZGdlLmNvbT4KLQotCSogZWxmMzItaTk2MC5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgYmZkX2FyY2hfaTk2MC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmJmZF9lbGYzMl9pOTYwX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKGk5NjAtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX2k5NjBfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItaTk2MC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLWk5NjAuYy4KLQkqIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDUtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1vYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IKLQlSX0FSTV9QTFQzMi4KLQkoZmluZF9ob3d0byk6IE5ldyBmdW5jdGlvbjogRmluZCBlbnRyaWVzIGluIHRoZQotCWVsZjMyX2FybV9ob3d0b190YWJsZS4KLQkoZWxmMzJfYXJtX2luZm9fdG9faG93dG8pOiBVc2UgZmluZF9ob3d0byBpZiB0aGUgZW50cnkgY2Fubm90IGJlCi0JY29tcHV0ZWQgc2ltcGx5LgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgbG9va3VwIGZvcgotCUJGRF9SRUxPQ19BUk1fUExUMzIuCi0KLTE5OTktMDUtMjUgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBiZmQvZWxmMzItYXJtLmggKGVsZjMyX2FybV9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UgYWJvdmUgZnVuY3Rpb24gYXMgdGhlCi0JY29uc3RydWN0b3IgZm9yIGhhc2ggdGFibGUgZW50cmllcy4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBBdm9pZCBjcmFzaCB3aGVuIHRoZXJlIGlzIG5vIG91dHB1dAotCXNlY3Rpb24uCi0JKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IHBhcmFtZXRlciBoLgotCShlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFBhc3Mgc3ltYm9sIGhhc2ggZW50cnkgdG8gYWJvdmUKLSAJcm91dGluZS4KLQkoZWxmMzJfYXJtX2djX3N3ZWVwX2hvb2ssIGVsZjMyX2FybV9jaGVjayByZWxvY3MpOiBDb3JyZWN0Ci0JY29tbWVudHMuCi0KLTE5OTktMDUtMjUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdAotCWJhc2UgZmlsZSBlbnRyaWVzIGZvciBwYy1yZWxhdGl2ZSB2YWx1ZXMuCi0KLTE5OTktMDUtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBXaGVuIHdlIGNyZWF0ZSB0aGUgYWN0dWFsIHNlY3Rpb24KLQl0byByZWZsZWN0IHRoZSBub3QtdGhlcmUgc2VjdGlvbiBDX1NFQ1RJT04gc3ltYm9scyByZWZlciB0bywKLQljaGFuZ2UgdGhlIHN5bWJvbCBjbGFzcyB0byBDX1NUQVQgYXMgdGhlIHNlY3Rpb24gaXMgbm93IHJlYWxseQotCXRoZXJlLgotCi0xOTk5LTA1LTI0ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVW5kbyBjaGFuZ2Ugb2YKLSAJMTk5OS0wMy0yNS4KLQotTW9uIE1heSAxNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyk6IENoYW5nZWQKLQlGX1BJQ19JTlQgdG8gRl9QSUMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZGVkIEZfQVJNXzJhLCBhbmQKLQlGX0FSTV8zTSBsYWJlbHMuICBDaGFuZ2VkIEZfUElDX0lOVCB0byBGX1BJQy4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChpbl9yZWxvY19wKTogUmVpbnN0YXRlLgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUNPUkVfUlZBKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29mZi1tY29yZS5jIChpbl9yZWxvY19wKTogUmVtb3ZlIGRlZmludGlvbi4KLQkobWNvcmVfY29mZl9ob3d0byk6IEFkZCBJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShtY29yZV9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogTWFwIEJGRF9SRUxPQ19SVkEgdG8KLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvKTogQWRkIHNwZWNpYWwgcHJvY2Vzc2luZyBmb3IKLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgc3VwcG9ydCBmb3IKLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCSogZWxmMzItbWNvcmUgKG1jb3JlX2VsZl9ob3d0b18pOiBBZGQgUl9NQ09SRV9SRUxBVElWRS4KLQkobWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTWFwIEJGRF9SRUxPQ19SVkEgdG8KLQlSX01DT1JFX1JFTEFUSVZFLgotCShtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERlbGV0ZSByZWR1bmRhbnQgY2FzZSBsYWJlbHMuCi0KLUZyaSBNYXkgMTQgMTA6NTk6NTUgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggb3BlcmF0b3IKLSAJcHJlY2VkZW5jZSBiZXR3ZWVuIGJpdC1hbmQgYW5kIGNvbXBhcmlzb24uCi0KLVRodSBNYXkgMTMgMDk6NDU6MjMgMTk5OSAgSm9lbCBTaGVycmlsbCAoam9lbEBPQVJjb3JwLmNvbSkKLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2Ki0qLXJ0ZW1zKiwgbTY4ayotKi1ydGVtcyopOiBBZGRlZCB0bwotCWxpc3Qgb2YgdGFyZ2V0IGZvcm1hdHMgKHRhcmdfc2VsdmVjcykuCi0JKGlbMzQ1Nl04NiotKi1ydGVtc2VsZiosIG1pcHMqZWwtKi1ydGVtcyopOiBOZXcgdGFyZ2V0cy4KLQkocG93ZXJwY2xlKi0qcnRlbXMqLCBzaC0qLXJ0ZW1zZWxmKik6IE5ldyB0YXJnZXRzLgotCi0xOTk5LTA1LTEwICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9hcm1hcCk6IGdpdmUgdGhlIHN5bXRhYiBlbGVtZW50IGEKLQlyZWFzb25hYmxlIG1vZGUgdW50aWwgImFyIHgiIGlzIHNtYXJ0IGVub3VnaCB0byBza2lwIGl0IChmaXhlcwotCWdjYy9saWJnY2MuYSBidWlsZHMgb24gbWlwcy1lY29mZiB0YXJnZXRzCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRXhwbGFpbiBob3cgQ09NREFUcyBhcmUgc3VwcG9zZWQKLQl0byB3b3JrLiAgSGFjayB0byBzdXBwb3J0IE1TIGltcG9ydCBsaWJyYXJpZXMsIHdoaWNoIHVzZSBkaWZmZXJlbnQKLQlDT01EQVQgdHlwZXMgdGhhbiBHTlUuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ19TRUNUSU9OIHN5bWJvbHMgYXJlIGxvY2FsOyB0aGV5IHJlZmVyCi0JdG8gaW1wbGllZCB6ZXJvLWxlbmd0aCBzZWN0aW9ucyAoc2VlIHBlaWNvZGUgYmVsb3cpCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogUHJvcGVybHkgcmVhZCBsb25nIE1TCi0JZmlsZW5hbWUgc3ltYm9scywgd2hpY2ggdXNlIG9uZSAqb3IgbW9yZSogYXV4ZW50cy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBkaXR0bwotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQnVpbGQgdGhlIGltcGxpZWQgemVyby1sZW5ndGgKLQlzZWN0aW9ucwotCi1UdWUgTWF5IDExIDE1OjUxOjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSk6IE1ha2UgcGFydGlhbF9pbnBsYWNlIGZhbHNlCi0JZm9yIGFsbCByZWxvY2F0aW9ucy4KLQotMTk5OS0wNS0xMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6ICBTdGF0aWMKLQlpZiBDT0ZGX0lNQUdFX1dJVEhfUEUuCi0JKGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCShiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IExpa2V3aXNlLgotCSogY29mZi1hcm0uYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW4gKGFybXBlX2xpdHRsZV92ZWMpOiBSZW1vdmUgY29mZi1hcm0ubG8uCi0JKGFybXBlX2JpZ192ZWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNS0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgZm9yIC5yZWwuIGFzIHN0YXJ0IG9mIHJlbAotCXNlY3Rpb24sIG5vdCBqdXN0IC5yZWwuICBTYW1lIGZvciAucmVsYS4KLQotMTk5OS0wNS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXBsYWNlIGFzc2VydCBhYm91dAotCWVuZGlhbmlzbSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBNYXkgIDYgMTc6MDk6MDkgMTk5OSAgRnJlZCBGaXNoICA8Zm5mQGJlLmNvbT4KLQotCSogZHdhcmYyLmMgKHJlYWRfYWJicmV2cyk6IENoYW5nZSBjYXN0IG9mIGR3YXJmX2FiYnJldl9idWZmZXIKLQlhc3NpZ25tZW50IGZyb20gInVuc2lnbmVkIGNoYXIgKiIgdG8gImNoYXIgKiIuCi0JKGRlY29kZV9saW5lX2luZm8pOiBMaWtld2lzZSBmb3IgZHdhcmZfbGluZV9idWZmZXIgYXNzaWdubWVudC4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgQWRkIG9uZSB0bwotCWFkZHJlc3Mgb2YgQVJNX1JWQTMyIHRodW1iIGZ1bmN0aW9ucy4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmMzJfbTY4a19zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldy4KLQkoZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCShDUFUzMl9GTEFHKTogRGVmaW5lLgotCShQTFRfQ1BVMzJfRU5UUllfU0laRSk6IERlZmluZS4KLQkoZWxmX2NwdTMyX3BsdDBfZW50cnkpOiBEZWNsYXJlLgotCShlbGZfY3B1MzJfcGx0X2VudHJ5KTogRGVjbGFyZS4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgY3B1MzIgcGx0IGVudHJpZXMuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUpOiBSZW1vdmUgZGVmaW5pdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCi1Nb24gTWF5ICAzIDA5OjI0OjQ5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogRml4IGNvbW1lbnRzIGZvciBSX1NIT1JUX1BDUkVMX01PREUKLQlhbmQgUl9MT05HX1BDUkVMX01PREUuCi0KLTE5OTktMDQtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG9zLgotCi1GcmkgQXByIDI4IDE2OjM2OjE5IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluY2x1ZGUgcmVsb2NhdGlvbiBhZGRlbmQKLQlpbiByZWxvY2F0aW9uIGNhbGN1bGF0aW9uLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgcmVsb2NzLgotCi0xOTk5LTA0LTIwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBTY3JhcCB0aGUKLQlpbmNvcnJlY3QgdXNlIEVGX01JUFNfeHhCSVRQVFJTLgotCi0xOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwKLQl2YXJpYWJsZSBpbnNuLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotU2F0IEFwciAxNyAyMDo1NToxNSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBSZW1vdmUgQVJNMjZEIHRyYW5zZm9ybS4KLQkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBBZGQgQVJNMjZEIHRyYW5zZm9ybS4gIE9ubHkKLQljaGFuZ2UgdG8gQVJNMjZEIGZvciByZWxvY2F0ZWFibGUgbGlua3MuCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCi0xOTk5LTA0LTE1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBGb3IgUl9BUk1fVEhNX0FCUzUsCi0JcmVmZXRjaCBhZGRlbmQgaWYgVVNFX1JFTCwgYWRkIG1hbnkgY29tbWVudHMgcmVnYXJkaW5nIGN1cnJlbnQgc3RhdGUuCi0JRm9yIFJfQVJNX1RITV9QQzIyLCByZWZldGNoIGFkZGVuZCBpZiBVU0VfUkVMLCBzaW1wbGlmeS4KLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEZvciBSX0FSTV9USE1fQUJTNSwgZml4Ci0Jc2l6ZSBhbmQgcmlnaHRzaGlmdC4gIEZvciBSX0FSTV9USE1fUEMyMiwgZml4IGJpdHNpemUuCi0JKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBEaXR0by4KLQotV2VkIEFwciAxNCAxNDozMzowOCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogWmVybyBgZGVidWcnLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvKTogTGlrZXdpc2UuCi0KLTE5OTktMDQtMTMgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IERvbid0IHRydW5jYXRlIGFkZHJlc3MgdG8gbGVhc3QKLQlzaWduaWZpY2FudCAzMiBiaXRzIChicmVha3MgNjQgYml0IHRhcmdldHMpLgotCShsb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSk6IERpdHRvLgotCShjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyk6IERpdHRvLgotCi1UdWUgQXByIDEzIDIxOjI3OjE5IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkpOiBOZXcgcm91dGluZS4KLQkoQTJUM19PRkZTRVQpOiBEZWZpbmUuCi0JKFQyQTNfT0ZGU0VUKTogRGVmaW5lLgotCShjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIEVtaXQgYmFzZSBmaWxlIGVudHJpZXMgZm9yIGludGVyd29ya2luZwotCXN0dWJzLgotCi0xOTk5LTA0LTEzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZHVtbXkgZW50cmllcyBmb3IKLQlyZWxvY3MgMTcgdGhyb3VnaCAxOS4KLQotU3VuIEFwciAxMSAwMToyNToxNyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmg6IFJlbW92ZSBmbm1hdGNoLmguCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IENhbGwgYmFjayB0byBsZAotCWluc3RlYWQgb2YgY2FsbGluZyBmbm1hdGNoLgotCi0JKiBjb25maWcuYmZkIChpPzg2LSotYmVvc2VsZik6IEluY2x1ZGUgcGUgdmVjcy4KLQotU3VuIEFwciAxMSAwMToxNDowNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQWxsb3cgLnBsdAotCXRvIGdvIG1pc3NpbmcuCi0KLTE5OTktMDQtMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE1pbmQgbm9fdW5kZWZpbmVkCi0Jd2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSBkeW5hbWljIHN5bWJvbCByZWZlcmVuY2VzLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCi1TYXQgQXByIDEwIDE1OjEyOjA5IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogTmV3IGZ1bmN0aW9uIG1vdmVkIGZyb20KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiAuLi4gaGVyZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIGl0LgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZS4KLQotMTk5OS0wNC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjY0LXNwYXJjLmM6IEZpeCBpbmNvcnJlY3QgY2FsbHMgdG8gYmZkX2NoZWNrX292ZXJmbG93LgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXRzLgotCSogY3B1LW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZSB0YXJnZXRzLgotCSogZWxmMzItbWNvcmUuYzogTmV3IEZpbGU6IFN1cHBvcnQgZm9yIG1jb3JlLWVsZiB0YXJnZXQuCi0JKiBwZS1tY29yZS5jOiBOZXcgRmlsZTogRGVmaW5pdGlvbnMgZm9yIG1jb3JlLXBlIHRhcmdldC4KLQkqIHBlaS1tY29yZS5jOiBOZXcgRmlsZTogRGVmaW5pdGlvbnMgZm9yIG1jb3JlLXBlaSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSBhcmNoaXRlY3R1cmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmY29kZS5oOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUtcGUgdGFyZ2V0cy4KLQkqIGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUtZWxmIHRhcmdldC4KLQkqIHJlbG9jLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSByZWxvY3MuCi0JKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCi0xOTk5LTA0LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IKLQlSX0FSTV9YUEMyNSBhbmQgUl9BUk1fVEhNX1hQQzIyLgotCShlbGYzMl9hcm1fcmVsb2NfbWFwKTogUmVtb3ZlIHJlZHVuZGFudCBlbnRyaWVzLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3lzZGVwLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCi0xOTk5LTA0LTA2ICBDaHJpcyBUb3JlayAgPHRvcmVrQGJzZGkuY29tPgotCi0JKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBBZGQgYWRkcnNpemUgcGFyYW1ldGVyLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuICBSZXdyaXRlIGNvbXBsZXRlbHkuCi0JKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBSZXdyaXRlIG92ZXJmbG93IGNoZWNraW5nLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA0LTA1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gR2FicmllbCBQYXViZXJ0IDxwYXViZXJ0QGlyYW0uZXM+OgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogU2V0IFJfUFBDX0dPVDE2X0xPLAotCVJfUFBDX1BMVDE2X0xPIGFuZCBSX1BQQ19TRUNUT0ZGX0xPIHRvIGJlIGNvbXBsYWluX292ZXJmbG93X2RvbnQuCi0JU2V0IFJfUFBDX1BMVDE2X0hBLCBSX1BQQ19TRUNUT0ZGX0hBIGFuZCBSX1BQQ19FTUJfTkFERFIxNl9IQSB0bwotCWhhdmUgYSByaWdodHNoaWZ0IG9mIDE2IGFuZCB1c2UgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MuCi0JKiBwcGNib290LmMgKHBwY2Jvb3RfdmVjKTogVXNlIGxpdHRsZSBlbmRpYW4gcm91dGluZXMgZm9yCi0JaGVhZGVycy4KLQotCSogZWxmLmMgKGVsZmNvcmVfc3RybmR1cCk6IE9ubHkgZGVmaW5lIGlmIGl0IHdpbGwgYmUgdXNlZC4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbGF4X3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FscyBpcmVsCi0JYW5kIGlyZWxlbmQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBpLgotCShwcGNfZWxmX2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCi0JRnJvbSBCZXJuZCBOaXR6bGVyIDxuaXR6bGVyQGthZ2NwZDAxLmFnMDEua29kYWsuQ09NPjoKLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogQWNjZXB0IFxyIGluIHN5bWJvbCBkZWZpbml0aW9ucy4KLQkoc3JlY19vYmplY3RfcCk6IFNldCBIQVNfU1lNUyBpZiB3ZSBzYXcgYW55IHN5bWJvbHMuCi0JKHN5bWJvbHNyZWNfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQotMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtaXBzKmVsLSotdnh3b3JrcyogYW5kIG1pcHMqLSotdnh3b3JrcyouCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkd2FyZjEuYyAocGFyc2VfbGluZV90YWJsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGxhc3RfcGMgYW5kCi0JbGFzdF9saW5lLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIpOiBEZWNsYXJlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9nY19tYXJrX2hvb2spOiBBZGQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoLgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCBpLgotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCB2YWwuCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb2ZmLWFybS5jOiBBbGxvdyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZgotCVRBUkdFVF9VTkRFUlNDT1JFIGFuZCBVU0VSX0xBQkVMX1BSRUZJWC4KLQkqIHBlLWFybS5oOiBBbGxvdyBwcmV2aW91cyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZgotCVRBUkdFVF9MSVRUTEVfU1lNIGFuZCBUQVJHRVRfQklHX1NZTS4KLQkqIHBlaS1hcm0uaDogQWxsb3cgcHJldmlvdXMgaGVhZGVyIGZpbGVzIHRvIG92ZXJyaWRlIGRlZmluaXRpb24gb2YKLQlUQVJHRVRfTElUVExFX1NZTSBhbmQgVEFSR0VUX0JJR19TWU0uCi0JKiBlcG9jLXBlLWFybS5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogZXBvYy1wZWktYXJtLmM6IE5ldyBmaWxlLiAgU3VwcG9ydCBhcm0tZXBvYy1wZWkgdGFyZ2V0LgotCi0xOTk5LTAzLTMwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoZWxmX21hcF9zeW1ib2xzKTogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHNlY3Rpb24KLQlzeW1ib2xzIGFyZSBnZW5lcmF0ZWQgZm9yIGNvbnRlbnQtbGVzcyBzZWN0aW9ucyB3aGljaCBhcmUKLQlub3QgbWFwcGVkIHRvIHRoZSBvdXRwdXQgZmlsZS4KLQotCSogbGlua2VyLmM6IFJlcGxhY2UgZGlyZWN0IHJlZmVyZW5jZXMgdG8gZmllbGRzIGluIEJGRCBzdHJ1Y3R1cmUKLQl3aXRoIGFjY2Vzc29yIG1hY3Jvcy4KLQotCSogZWxmbGluay5oOiBSZXBsYWNlIGRpcmVjdCByZWZlcmVuY2VzIHRvIGZpZWxkcyBpbiBCRkQgc3RydWN0dXJlCi0Jd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0KLTE5OTktMDMtMjUgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBjb25maWcuYmZkOiBFbGltaW5hdGUgcmVkdW5kYW5jeSBpbiBjaGVja3MgZm9yIExpbnV4L0FSTS4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVGFrZSB0aGUgcmlnaHRzaGlmdCBpbnRvCi0JYWNjb3VudCB3aGVuIGFkanVzdGluZyBzZWN0aW9uIHN5bWJvbHMgZHVyaW5nIGEgcGFydGlhbCBsaW5rLgotCi0xOTk5LTAzLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNwYXJjLmMgKHN0cnVjdCBjb2ZmX3JlbG9jX21hcCk6IENoYW5nZSB0eXBlIG9mIGZpZWxkCi0JICAnYmZkX3JlbG9jX3ZhbCcgdG8gYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCSogZWxmLW0xMDIwMC5jIChzdHJ1Y3QgbW4xMDIwMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZi1tMTAzMDAuYyAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1hcmMuYyAoc3RydWN0IGFyY19yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLWQxMHYuYyAoc3RydWN0IGQxMHZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1kMzB2LmMgKHN0cnVjdCBkMzB2X3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItZnIzMC5jIChzdHJ1Y3QgZnIzMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLW0zMnIuYyAoc3RydWN0IG0zMnJfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1zaC5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItc3BhcmMuYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLXY4NTAuYyAoc3RydWN0IHY4NTBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGY2NC1zcGFyYy5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmYXJtLW5hYmkuYyAoc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZmFybS1vYWJpLmMgKHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwKTogRGl0dG8uCi0KLTE5OTktMDMtMTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2hhbmdlZCB0aGlzCi0JZnVuY3Rpb24gc28gc291cmNlLWxldmVsIGFzc2VtYmx5IHdvcmtzLiAgSWYgbXVsdGlwbGUgTl9TT3MKLQlhcmUgc2VlbiB3aXRob3V0IGFuZCBOX0ZVTnMsIGNyZWF0ZSBhbiBpbmRleHRhYmxlIGVudHJ5IHdpdGgKLQlhIE5VTEwgZnVuY3Rpb24gbmFtZS4KLQotMTk5OS0wMy0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSBBbGxvdyBtZXJnaW5nCi0Jb2YgY2VydGlhbiBzaW1pbGFyIGNwdXMuCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JQWRkIHRoZSA1MDAwLiAgQ2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoZSA1NDAwIHRvIG1pcHM0LgotCShlbGZfbWlwc19tYWNoKTogQWRkIHI1MDAwLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS1pOTYwLmMgKHNjYW5faTk2MF9tYWNoKTogUmVjb2duaXplIGk5NjA6a2Ffc2EgYW5kIGk5NjA6a2Jfc2IuCi0KLTE5OTktMDMtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBHZW5lcmF0ZSB3YXJuaW5nIGFib3V0Ci0JaHVnZSBmaWxlIG9mZnNldHMgZm9yIGFueSBzZWN0aW9uIHRoYXQgd2lsbCBvY2N1cHkgZmlsZSBzcGFjZSwgbm90Ci0JanVzdCB0aG9zZSB0aGF0IGFyZSBsb2FkYWJsZS4KLQotMTk5OS0wMi0yNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZSBhZnRlciBOaWNrIENsaWZ0b24ncyBGZWIgMTcgY2hhbmdlcy4KLQotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jOiBBZGQgcHBjX2VsZl9yZWxheF9zZWN0aW9uKCkgZm9yIHRoZSBsZCBvcHRpb24gbXBjODYwYzAuCi0KLU1vbiBGZWIgMjIgMTg6MjY6NTEgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyk6IERlZmluZS4KLQkqIGVsZmxpbmsuaDogUmV2ZXJ0IGFsbCBjaGFuZ2VzIHNpbmNlIEZlYiAxNi4gIEluc3RlYWQ6Ci0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZsYWcgaWYKLQlhcHByb3ByaWF0ZS4gIENvcHkgaXQgdG8gdmVyc2lvbiBzeW1ib2xzLgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciBub24gRUxGCi0Jc3ltYm9scyBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciB3ZWFrZGVmCi0Jc3ltYm9sIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSWYgc3ltYm9sIGlzIG1hcmtlZCBhcyB1bmRlZmluZWQsIGFuZAotCWhhcyBubyBub253ZWFrIHJlZmVyZW5jZXMsIG1hcmsgaXQgYXMgd2VhayB1bmRlZmluZWQuCi0KLUZyaSBGZWIgMTkgMTY6MDE6MTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSBkeW5hbWljCi0JZGVmaW5pdGlvbiB3aXRoIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLCBzZXQgTkVFRFNfUExUIGlmIGl0IGlzIGEKLQlmdW5jdGlvbi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY29weSB0aGUgb3RoZXIgZmllbGQgaWYgd2UKLQlhcmUgb3ZlcnJpZGRpbmcuCi0KLVRodSBGZWIgMTggMTg6MDc6NDMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEbyBub3QgbWVyZ2UgYW55IHN5bWJvbCBmcm9tIGEKLQlzaGFyZWQgb2JqZWN0IHdpdGggYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuCi0KLTE5OTktMDItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1uYWJpLmM6IFNldCBwYXJ0aWFsX2lucGxhY2UgYmFjayB0byBmYWxzZS4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBSZS1lbmFibGUuCi0JKFVTRVJfTEFCRUxfUFJFRklYKTogU2V0IHRvICJfIi4KLQotCVRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgZnJvbTogU2NvdHQgQmFtYnJvdWdoCi0JPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQotCSogbGliYW91dC5oIChNX0FSTTZfTkVUQlNEKTogU2V0IHRvIDE0My4KLQotCSogcmVsb2MuYzogQWRkIEFSTSBQSUMgcmVsb2NzOiAgIEJGRF9SRUxPQ19BUk1fR09UMTIsCi0JQkZEX1JFTE9DX0FSTV9HT1QzMiwgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsIEJGRF9SRUxPQ19BUk1fQ09QWSwKLQlCRkRfUkVMT0NfQVJNX0dMT0JfREFULCBCRkRfUkVMT0NfQVJNX1BMVDMyLAotCUJGRF9SRUxPQ19BUk1fUkVMQVRJVkUsIEJGRF9SRUxPQ19BUk1fR09UT0ZGLCBCRkRfUkVMT0NfQVJNX0dPVFBDLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBTZXQgcGFydGlhbF9pbnBsYWNlIHRvCi0JJ3RydWUnIGFzIFJFTCByZWxvY3MgYXJlIG5vdyBiZWluZyB1c2VkLiAgQWRkIG5ldyBQSUMgcmVsb2NzOgotCVJfQVJNX0NPUFksIFJfQVJNX0dMT0JfREFULCBSX0FSTV9KVU1QX1NMT1QsIFJfQVJNX1JFTEFUSVZFLAotCVJfQVJNX0dPVE9GRiwgUl9BUk1fR09UUEMsIFJfQVJNX0dPVDMyLCBSX0FSTV9QTFQzMi4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgYnl0ZSBvcmRlcgotCW9mIHRhcmdldHMuCi0JKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2hhbmdlIHBhcmFtZXRlcnMgc28gdGhhdCBlbnRpcmUKLQlyZWxvYyBpcyBwYXNzZWQuICBBZGQgc3VwcG9ydCBmb3IgUElDIHJlbG9jcy4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQYXNzIGVudGlyZSByZWxvYyB0bwotCWVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlLgotCShlbGYzMl9hcm1fY2hlY2tfcmVsb2NzKTogSGFuZGxlIG5ldyBQSUMgcmVsb2NzLgotCShlbGYzMl9hcm1fYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoRUxGX01BWFBBR0VfU0laRSk6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltKTogRGVmaW5lLgotCi1XZWQgRmViIDE3IDEyOjAyOjI2IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIHJlZ2luZm8KLQlzZWN0aW9ucyBTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTcgMTI6MDc6MjMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZhcm0tb2FiaS5jIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucywKLQliZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZywKLQliZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBEZWZpbmUgdG8gYXZvaWQgY2xhc2gKLQl3aXRoIGVsZmFybS1uYWJpLmMuCi0KLQkqIGVsZjMyLWFybS5oOiBEb24ndCBkZWNsYXJlIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvLgotCShlbGYzMl90aHVtYl90b19hcm1fc3R1YiwgZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIsCi0JZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lKTogTWFrZSB0aGVtIHN0YXRpYy4KLQotVHVlIEZlYiAxNiAyMjo0NDozNyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IEFkZCBwZmxhZ3MgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBEbyBub3QgbWVyZ2UgYSBkZWZpbml0aW9uIGZyb20gYSBzaGFyZWQgb2JqZWN0IHdpdGggYQotCXdlYWsgdW5kZWZpbmVkIHN5bWJvbC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG8gbm90IGNoYW5nZSB0aGUgc3ltYm9sIHR5cGUgb3IKLQlzaXplIGlmIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlcyB0aGUgbmV3IG9uZS4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSB0YXJnZXQuCi0KLU1vbiBGZWIgIDggMTE6MTg6MTQgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKHJlbG9jX21hcCk6IFVzZSB0aGUgY29ycmVjdCB0eXBlcyBmb3IgdGhlIHN0cnVjdAotCWZpZWxkcyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBGZWIgIDUgMDA6MjI6MzYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEZlYiAgNCAyMjozMDoxMyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgUmVtb3ZlIEFNX0NZR1dJTjMyLgotCUNoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhUIGFuZCBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuICBBZGQgY29tbWVudHMgdG8gdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2luY2x1ZGUubTQ6IEFkZCBjb21tZW50cyB0byB1c2VzIG9mIEFDX0RFRklORS4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIGNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLTE5OTktMDItMDQgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogZG9uJ3QgY2FsbCBmcmVhZCBmb3IgemVybyBieXRlcy4gIFRoaXMKLQljb3ZlcnMgdXAgYSBidWcgKG9yIG1pc3VzZSBvZiBiZmQpIHRoYXQncyBleHBvc2VkIGJ5IFNvbGFyaXMuCi0KLVRodSBGZWIgIDQgMTI6Mzg6MTAgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluc3VyZSB0aGF0IHRoZSB0YXJnZXQKLQlvZiBhIGp1bXAgaXMgaW4gdGhlIGN1cnJlbnQgMjU2IE1CIHJlZ2lvbi4KLQotVGh1IEZlYiAgNCAxMjoxNTozOCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBDaGFuZ2UgbGFzdCBwYXRjaCB0byBvbmx5Ci0JdGFrZSBlZmZlY3QgZm9yIHRoZSBiaW5hcnkgdGFyZ2V0LgotCi1XZWQgRmViICAzIDE5OjQwOjEyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfQ1RPUi4KLQotV2VkIEZlYiAgMyAxNTowMjo0NCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3IHJvdXRpbmUuCi0KLVR1ZSBGZWIgIDIgMjE6Mzg6MjggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogSWYgdGhlIHRhcmdldCB3YXMKLQlwcmV2aW91c2x5IHNwZWNpZmllZCwgZG9uJ3QgY2hlY2sgb3RoZXIgdGFyZ2V0cyB3aGVuIGNoZWNraW5nIGZvcgotCWFuIGFyY2hpdmUgZmlsZS4KLQotVHVlIEZlYiAgMiAxODoxNjo0MyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY19tYXApOiAgUmVtb3ZlZC4KLQkoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogIFJlbW92ZWQKLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9yZWxvY19tYXApOiAgTmV3LgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiAgTmV3LgotCSogZWxmYXJtLW9hYmkuYyAoZWxmMzJfYXJtX3JlbG9jX21hcCk6ICBOZXcuCi0JKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6ICBOZXcuCi0KLU1vbiBGZWIgIDEgMTk6NDk6MjEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1uYWJpLmM6ICBSZW5hbWVkIGZyb20gZWxmMzItYXJtLW5ld2FiaS5jLgotCSogZWxmYXJtLW9hYmkuYzogIFJlbmFtZWQgZnJvbSBlbGYzMi1hcm0tb2xkYWJpLmMKLQkqIE1ha2VmaWxlLmFtOiAgVXNlIG5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiAgUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBuZXcgZmlsZXMuCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotCi0xOTk5LTAyLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX2djX21hcmtfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1Nb24gRmViICAxIDEyOjIxOjQ3IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogIEFkZCBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCi0JYW5kIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMuCi0KLU1vbiBGZWIgIDEgMTE6NDY6MzEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChlbGYzMi1hcm0tb2xkYWJpLmxvKTogIE5ldy4KLQkoZWxmMzItYXJtLW5ld2FiaS5sbyk6ICBOZXcuCi0JKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0JKiBjb25maWcuYmZkICh0aHVtYi0qLWVsZik6ICBSZW1vdmUgZGVmaW5pdGlvbiBvZiB0YXJnX3VuZGVyc2NvcmUuCi0JKGFybS0qLWVsZik6ICBMaWtld2lzZS4KLQkoYXJtLSotb2FiaSk6ICBOZXcuCi0JKHRodW1iLSotb2FiaSk6ICBOZXcuCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKTogIE5ldy4KLQkoYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYyk6ICBOZXcuCi0JKiBlbGYzMi1hcm0tbmV3YWJpLmM6ICBOZXcuCi0JKiBlbGYzMi1hcm0tb2xkYWJpLmM6ICBOZXcuCi0JKiBlbGYzMi1hcm0uYzogIFJlbW92ZWQuCi0JKiBlbGYzMi1hcm0uaDogIE5ldy4KLQotTW9uIEZlYiAgMSAxMTo1MjoxMiAxOTk5ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogT21pdCB3YXJuaW5ncyBmb3IKLQl1bmxvYWRhYmxlIHNlY3Rpb25zLgotCi0xOTk5LTAxLTMxICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwY3ssbGV9LSotdnh3b3JrcyopOiBBZGQgYWxpYXNlcyB0bwotCXBvd2VycGN7LGxlfS0qLWVhYmkuCi0KLTE5OTktMDEtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5jIChyZWFkX3Vuc2lnbmVkX2xlYjEyOCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCSogZHdhcmYyLmMgKHJlYWRfc2lnbmVkX2xlYjEyOCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi1GcmkgSmFuIDI5IDAwOjQ3OjIxIDE5OTkgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBPbmx5IGFkanVzdAotCXBfYWxpZ24gd2hlbiBuZWVkZWQuCi0KLVRodSBKYW4gMjggMjA6MDU6MjIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgcmV0dXJuIGVhcmx5IGZvciBhCi0gCW5vbi1sb2FkYWJsZSBzZWN0aW9uLCBpbiBjYXNlIHRoZSBmaXJzdCBzZWN0aW9uIGlzIG5vbi1sb2FkYWJsZS4KLSAgCURvbid0IHNldCB0aGUgbG93IGxtYSBmb3IgYSBTRUNfTkVWRVJfTE9BRCBzZWN0aW9uLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQotMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX3JlbG9jX21hcCk6IEFkZCBSX0ZSMzBfR05VX1ZUSU5IRVJJVCBhbmQKLQlSX0ZSMzBfR05VX1ZURU5UUlkgcmVsb2NzLgotCi1UaHUgSmFuIDI4IDExOjA4OjE2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9zeW0pOiAgWmVybyBzeW1zIHdoaWNoIGFyZQotICAgICAgIHBhcnQgb2Ygc2VjdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIGV4Y2x1ZGVkLgotCi1XZWQgSmFuIDI3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzKTogQ2hhbmdlZCBGX1BJQwotCXRvIEZfUElDX0lOVC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogUmVtb3ZlZCBGX0FSTV8yYSBhbmQKLQlGX0FSTV8zTSBsYWJlbHMuICBDaGFuZ2VkIEZfUElDIHRvIEZfUElDX0lOVC4KLQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IEZpeCBuYW1lIG9mIFJfRlIzMF80OAotCXJlbG9jYXRpb24uCi0JKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IFVzZSBjb21wdXRlZCB2YWx1ZSBhcyByZXN1bHQgb2YKLQlyZWxvY2F0aW9uLgotCi0xOTk5LTAxLTI2ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRW1pdCB3YXJuaW5nIGZvcgotCWh1Z2UgZmlsZSBvZmZzZXRzIGR1ZSB0byB3aWRlbHktZGlzcGVyc2VkIHNlY3Rpb24gTE1Bcy4KLQotTW9uIEphbiAxOCAwMzozNTozNSAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgbm90IERfUEFHRUQsCi0JYWxpZ24gZmlyc3Qgc2VjdGlvbiB0byBsYXJnZXN0IHNlY3Rpb24gYWxpZ25tZW50LCBub3QgZmlyc3QKLQlzZWN0aW9uIGFsaWdubWVudC4KLQotMTk5OS0wMS0wNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMi4xIG9yIGhpZ2hlci4KLQotVHVlIERlYyAyMiAxNToyMTo0MSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCk6ICBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6ICBMaWtld2lzZS4KLQkqIGNwdS1pMzg2LmMgKGJmZF9pMzg2X2FyY2hfaW50ZWxfc3ludGF4KTogIE5ldy4KLQotMTk5OC0xMi0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMsYmZkLWluMi5oIChiZmRfbWFjaF9taXBzNDExMSk6IE5ldy4KLQkqIGNwdS1taXBzLmM6IEFkZCBzdXBwb3J0IGZvciBhbmQgaW5kZXBlbmRlbnQgNDExMS4KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfbWFjaCk6IEVfTUlQU19NQUNIXzQxMTEgLT4gYmZkX21hY2hfbWlwczQxMTEuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JYmZkX21hY2hfbWlwczQxMTEgLT4gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQxMTEuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2FiaV9uYW1lKTogTmV3LgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDb21wYXJlIEVGX01JUFNfQUJJIGZsYWdzLgotCi0xOTk4LTEyLTEyICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCUhhbmRsZSBiZmRfbWFjaF9taXBzNDMwMC4KLQotMTk5OC0xMi0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYzogUmVtb3ZlIGxlYWtlZCBkZXZlbG9wbWVudCBjb2RlIGZyb20gcGF0Y2gKLQkxOTk4LTEyLTEwIGJ5IFJpY2hhcmQgSGVuZGVyc29uLgotCi0xOTk4LTEyLTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBmYWlsIHJlbG9jYXRpb25zCi0JaW4gZGVidWcgc2VjdGlvbnMgZm9yIHN5bWJvbCBkZWZpbmVkIGV4dGVybmFsbHkuCi0KLVRodSBEZWMgMTAgMTA6NTg6MzggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyeSBmb3IKLQl0ZWtoZXhfdmVjLgotCi0xOTk4LTEyLTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX2hvd3RvX3RhYmxlKTogU2V0IHNyY19tYXNrIGZpZWxkcyB0byAwCi0Jc2luY2Ugd2UgYXJlIHVzaW5nIFJFTEFzLgotCi1UdWUgRGVjICA4IDIyOjE1OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNDTyBPcGVuIFNlcnZlciBSZWxlYXNlIDUgY29yZSBmaWxlIHN1cHBvcnQsIGZyb20gSm91a2UgTnVtYW4KLQk8am51bWFuQGhpc2NvbS5ubD46Ci0JKiBzY281LWNvcmUuYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1Nl04Ni0qLXNjbzMuMnY1Kik6IFVzZSBzY281LWNvcmUubG8uCi0JKHNjbzUtY29yZS5sbyk6IERlZmluZSBTQ081X0NPUkUgaW4gQ09SRUZMQUcuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKE9QVElPTkFMX0JBQ0tFTkRTKTogQWRkIHNjbzUtY29yZS5sby4KLQkoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHNjbzUtY29yZS5jLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIHNjbzVfY29yZV9kYXRhIGZpZWxkIHRvIHRkYXRhLgotCSogdGFyZ2V0cy5jIChzY281X2NvcmVfdmVjKTogQWRkIHRvIHRhcmdldCBsaXN0IGlmIFNDTzVfQ09SRS4KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIERlYyAgOCAxOTozODo0MiAxOTk4ICBNYXJrIEtsZWluICA8bWtsZWluQGRpcy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqLSotbXBlaXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0hFQURFUl9ESVJFTlQuCi0JKGhwcGEqLSotbXBlaXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0IChocHBhKi0qLW1wZWl4Kik6IE5ldyBob3N0LgotCSogaHB1eC1jb3JlLmM6IENoZWNrIEhPU1RfSFBQQU1QRUlYLiAgVXNlIEhBVkVfRElSRU5UX0ggYW5kCi0JZnJpZW5kcyByYXRoZXIgdGhhbiBqdXN0IGluY2x1ZGluZyA8c3lzL2Rpci5oPi4KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX3N5bWJvbCk6IEFkZCBocHBhX3ByaXZfbGV2ZWwgYW5kIGFwdG8KLQl0Y19kYXRhLiAgQ2hhbmdlIGFsbCB1c2Vycy4KLQkoc3RydWN0IHNvbWRhdGEpOiBBZGQgY29tcF91bml0IGZpZWxkLgotCShvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQpOiBEZWZpbmUuCi0JKGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXgpOiBEZWNsYXJlLgotCSogc29tLmM6IENoZWNrIEhPU1RfSFBQQU1QRUlYLgotCShzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pOiBBZGQgbmV3IGZpZWxkIHByaXZfbGV2ZWwuCi0JKHNvbV9vYmplY3Rfc2V0dXApOiBBZGQgY3VycmVudF9vZmZzZXQgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHNldHVwX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKHNvbV9vYmplY3RfcCk6IEZvciBFWEVDTElCTUFHSUMsIHJlYWQgdGhlIGxzdCBoZWFkZXIuCi0JKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyk6IEFkZCBjb21waWxhdGlvbl91bml0IHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IFdyaXRlIG91dCBjb21waWxhdGlvbl91bml0LgotCShzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogU2V0IHByaXZfbGV2ZWwuCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogU2V0IHhsZWFzdCBmaWVsZCB0byAzLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHN5bWJvbCBwcml2X2xldmVsLgotCShiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0KTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IFNldCB4bGVhc3QgZmllbGQgdG8gMy4gIFNldAotCXByaXZfbGV2ZWwgaW50byBzeW1ib2xfdmFsdWUuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotVHVlIERlYyAgOCAxNjoyMTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiBDaGFuZ2UgY2FsbCB0byBub25leGlzdGVudAotCXdhcm5pbmcgZnVuY3Rpb24gdG8gY2FsbCBfYmZkX2Vycm9yX2hhbmRsZXIgaW5zdGVhZC4KLQotCSogbGliYmZkLmMgKENPRVJDRTMyKTogQ2FzdCB0aHJvdWdoIHVuc2lnbmVkIGxvbmcgYW5kIGxvbmcgdG8KLQlhdm9pZCBidWcgaW4gb2xkIHZlcnNpb24gb2YgZ2NjLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IFJlbW92ZS4KLQkoZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBEb24ndCBkZWZpbmUuCi0KLTE5OTgtMTItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogRml4IFBDIHJlbGF0aXZlCi0JcmVsb2NhdGlvbnMgdG8gaW5jbHVkZSBvZmZzZXQgb2YgMiBpbmNsdWRlZCBpbiB0aGUgaW5zbnMsIGFuZCB0aGUKLQlvZmZzZXQgb2YgdGhlIHJlbG9jcyB3aXRoaW4gdGhlIHNlY3Rpb24uCi0KLVdlZCBEZWMgIDIgMTU6MDM6NTkgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IERhdmlkIFRheWxvcgotIAk8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+LCBFZGl0aCBFcHN0ZWluCi0gCTxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT4sIEppbSBCbGFuZHkKLSAJPGppbWJAendpbmdsaS5jeWdudXMuY29tPiwgYW5kIEVsZW5hIFphbm5vbmkKLSAJPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IHRvIG1lcmdlIGluCi0gCWNoYW5nZXMgb3JpZ2luYWxseSBtYWRlIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cKLSAJZW50cmllcy4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsdCB1c2luZyBsYXRlc3QKLSAJYXV0b21ha2UgbWFjcm8gbGlicmFyeS4KLQotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IHRoaXMgZnVuY3Rpb24gbm93Ci0gCXVuZGVyc3RhbmRzIEhQVVggMTAuMzAgdGhyZWFkIGluZm8uIFllcywgdGhlIHRocmVhZCBzdGFja3MgY2FuIGJlCi0gCWZvdW5kIGluIHRoZSBjb3JlZmlsZSEgQWxzbywgaW4gaHB1eF9jb3JlX2NvcmVfZmlsZV9wLCBpZiB3ZQotIAllbmNvdW50ZXIgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLCBkb24ndCBwdW50LiAgSW5zdGVhZCwKLSAJanVzdCBza2lwIGl0LiAgQWxzbywgY291bnQgdGhlIG51bWJlciBvZiBzZWN0aW9ucyBvZiBrbm93biB0eXBlCi0gCXRoYXQgd2UgZW5jb3VudGVyLiAgSWYgd2UgZW5jb3VudGVyIGF0IGxlYXN0IG9uZSBnb29kIG9uZSwgdGhlbgotIAl3ZSdsbCBkZWNsYXJlIHRoYXQgdGhlIGZpbGUgaXMgYSBjb3JlIGZpbGUuICBJZiB3ZSBlbmNvdW50ZXIgYW55Ci0gCXVua25vd24gb25lcyBidXQgc29tZSBrbm93biBvbmVzLCB0aGVuIHdlJ2xsIGlzc3VlIGEgd2FybmluZyAoYnV0Ci0gCXN0aWxsIGRlY2xhcmUgaXQgdG8gYmUgYSBjb3JlIGZpbGUpLiBBbHNvLCBjb3JyZWN0bHkgZGVjaWRlIHdoZW4gYQotIAlmaWxlIGlzIG5vdCBhIGNvcmUuCi0JKFBST0NfSU5GT19IQVNfVEhSRUFEX0lEKTogZGVmaW5lIGlmIENPUkVfQU5PTl9TSE1FTSBkZWZpbmVkLgotCShDT1JFX0FOT05fU0hNRU0pOiBkZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGhwdXhfY29yZV9zdHJ1Y3QpOiBhZGQgbWVtYmVycyBsd3BpZCBhbmQgdXNlcl90aWQuCi0JKGNvcmVfa2VybmVsX3RocmVhZF9pZCwgY29yZV91c2VyX3RocmVhZF9pZCk6IG5ldyBtYWNyb3MuCi0JKG1ha2VfYmZkX2FzZWN0aW9uKTogdXNlIGJmZF9hbGxvYyB0byBhbGxvY2F0ZSByb29tIGZvciBhIGNvcHkgb2YKLSAJdGhlIG5hbWUgYmVmb3JlIHN0b3JpbmcgaXQgaW4gdGhlIGJmZC4KLQkoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogaGFuZGxlIHRocmVhZHMuCi0KLQkqIGxpYmhwcGEuaCAoR0VUX0ZJRUxEKTogcHJvdGVjdCBhZ2FpbnN0IHJlZGVmaW5pdGlvbi4KLQkoSFBQQV9XSURFKTogZGVmaW5lLgotCShHRVRfRklFTEQpOiBkZWZpbmUuCi0JKEdFVF9CSVQpOiBkZWZpbmUuCi0JKE1BU0spOiBkZWZpbmUuCi0JKENBVEVOQVRFKTogZGVmaW5lLgotCShFTEVWRU4pOiBkZWZpbmUuCi0JKHNpZ25fZXh0ZW5kKTogcmVkZWZpbmUuCi0JKGFzc2VtYmxlXzYpOiBkZWZpbmUuCi0JKGFzc2VtYmxlXzEyKTogcmV3cml0ZS4KLQkoYXNzZW1ibGVfMTYpOiBkZWZpbmUuCi0JKGFzc2VtYmxlXzE2YSk6IGRlZmluZS4KLQkoYXNzZW1ibGVfMTcpOiByZXdyaXRlLgotCShhc3NlbWJsZV8yMik6IGRlZmluZS4KLQotMTk5OC0xMi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVc2luZyBzaWduZWQKLQlyZWxvY2F0aW9ucyBmb3Igc2lnbmVkIHZhbHVlcy4KLQotU3VuIERlYyAgNiAxNjozMDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHNic2QuYyAoTVkoc2V0X2FyY2hfbWFjaCkpOiBNYWtlIHN0YXRpYy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogRm9yIGJmZF9hcmNoX21pcHMsIHVzZQotCWJmZF9tYWNoX21pcHMqIG1hY3JvcyByYXRoZXIgdGhhbiBzaW1wbGUgbnVtYmVycy4KLQotCUNPRkYgd2VhayBzeW1ib2wgc3VwcG9ydCwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tIE1hcmsgRWxicmVjaHQKLQk8c25vd2JhbGwzQHVzYS5uZXQ+OgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBIYW5kbGUgQ19XRUFLRVhULgotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IExpa2V3aXNlLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSk6IExpa2V3aXNlLgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogQWx3YXlzIGluaXRpYWxpemUgdGhlCi0JaW5jbHVkZXNfcGhkcnMgZmllbGQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBDaGVjayBmb3IgY2FzZSB3aGVyZSBhIG5vbi1FTEYKLQlmaWxlIGRlZmluZXMgYSBzeW1ib2wgZmlyc3QgbWVudGlvbmVkIGluIGFuIEVMRiBmaWxlLgotCi0JKiBiZmQtaW4uaDogQWx3YXlzIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgYW5kIEJGRF9IT1NUX1VfNjRfQklUIGlmCi0JcG9zc2libGUsIHJhdGhlciB0aGFuIG9ubHkgaWYgQkZENjQuCi0JKiBlbGZsaW5rLmggKGNvbXB1dGVfYnVja2V0X2NvdW50KTogSnVzdCBjaGVjayBCRkRfSE9TVF9VXzY0X0JJVCwKLQlub3QgX19HTlVDX18uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENvcnJlY3QgdGVzdCB0byBhdm9pZAotCXN3aXRjaGluZyB0byA0IGJ5dGUgYWRkcmVzc2VzIGFmdGVyIHNlZWluZyBhIHNlY29uZCBzZWN0aW9uIHdoaWNoCi0JcmVxdWlyZXMgMyBieXRlIGFkZHJlc3Nlcy4gIEZyb20gSm9lbCBTY2hhbnR6Ci0JPGpvZWwuc2NoYW50ekBhcmdvc3lzLmJvZWluZy5jb20+LgotCi0JKiBjb25maWcuYmZkIChtNjgqLSotZ251Kik6IE5ldyB0YXJnZXQuICBGcm9tIEF5bWVyaWMgVmluY2VudAotCTxheW1lcmljLnZpbmNlbnRAZW1pLnUtYm9yZGVhdXguZnI+LgotCi0xOTk4LTEyLTA0ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggbG9naWMgdG8KLQlkZWNpZGUgd2hldGhlciB0aGUgb3V0cHV0IGZpbGUgaXMgLW1yZWxvY2F0YWJsZS1saWIsCi0JLW1yZWxvY2F0YWJsZSwgb3IgbmVpdGhlci4gIChnZGIuYmFzZS9ub2RlYnVnLmV4cCkKLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jOiBBZGQgc3VwcG9ydCBmb3IgUl9GUjMwXzQ4IHJlbG9jLgotCSogcmVsb2MuYzogQWRkIEJGRF9SRUxPQ19GUjMwXzQ4IHJlbG9jYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZQotCi1XZWQgRGVjICAyIDAwOjU4OjM3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogV2FybiBvbiBhbiBhdHRlbXB0IHRvCi0JbGluayBhZ2FpbnN0IGEgZHluYW1pYyBzeW1ib2wgd2l0aCBubyB0eXBlIG9yIHNpemUuCi0KLTE5OTgtMTItMDEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGkzODZfY2hlY2tfcmVsb2NzKSBbUl8zODZfMzJdOiBEb24ndCBlbWl0Ci0JcmVsb2NhdGlvbiBmb3Igc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBnZXQgbG9hZGVkLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKSBbUl8zODZfMzJdOiBMaWtld2lzZS4KLQotVHVlIERlYyAgMSAxMTozMzozMyAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBNYWtlIHJlbG9jX3NpemUsCi0JcmVsb2NfY291bnQgYW5kIGkgbG9uZyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuICBIYW5kbGUgZXJyb3IKLQlyZXR1cm4gZnJvbSBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCi0xOTk4LTEyLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZXRlY3QgdGhlIGFic2VuY2Ugb2YKLQlhIGhhc2ggdGFibGUuCi0KLU1vbiBOb3YgMzAgMTU6Mjg6MDkgMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYzMi1zaC5jIChlbGYvc2guaCk6IEluY2x1ZGUuCi0Jc2hfcmVsb2NfdHlwZTogRGVsZXRlLiAgQ2hhbmdlZCBhbGwgcmVmZXJlbmNlcyB0byBlbGZfc2hfcmVsb2NfdHlwZS4KLQkoc2hfZWxmX2hvd3RvX3RhYik6IEFkZCBIT1dUTyBmb3IgUl9TSF9TV0lUQ0g4LgotCShzaF9yZWxvY19tYXApOiBNYXAgQkZEX1JFTE9DXzhfUENSRUwgdG8gUl9TSF9TV0lUQ0g4LgotCShzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogSGFuZGxlIFJfU0hfU1dJVENIOC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeSBvZiBlbGYzMi1zaC5sbyBvbiAkKElOQ0RJUikvZWxmL3NoLmguCi0KLUZyaSBOb3YgMjcgMTc6NTE6MzggMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmbGluay5oIChjb21wdXRlX2J1Y2tldF9jb3VudCk6IERvbid0IGFsbG93IG1pbnNpemU9PTAsIGl0Ci0JY2F1c2VzIGRpdmlzaW9uIGJ5IHplcm8gbGF0ZXIgb24uCi0KLVRodSBOb3YgMjYgMTE6MTk6MzUgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX3BjOV9yZWxvYyxmcjMwX2VsZl9wYzEyX3JlbG9jKTogTm90Ci0JbmVlZGVkLgotCi0xOTk4LTExLTI1ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGkzY29mZl9vYmplY3RfcCk6IFJlbW92ZSBoYWNrLiAgVXNlIG5ldyBlbXVsYXRpb24KLQlob29rIG5vdy4KLQotVHVlIE5vdiAyNCAxMDoyNToyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDYWxsCi0JZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlLgotCShmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb246IEhhbmRsZSBJMjAgYW5kIEkzMgotCXJlbG9jcy4KLQkoZnIzMF9lbGZfaTMyX3JlbG9jKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgSTMyIHJlbG9jcy4KLQkoZnIzMF9lbGZfcGM5X3JlbG9jKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgOV9QQ1JFTCByZWxvY3MuCi0JKGZyMzBfZWxmX3BjMTJfcmVsb2MpOiBOZXcgZnVuY3Rpb246IEhhbmRsZSAxMl9QQ1JFTCByZWxvY3MuCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlc2V0IGhpMTZzIHJlbG9jCi0JY2hhaW4gdG8gZW1wdHkuCi0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgYXJlIGJhc2VkIG9uIGEgcGF0Y2ggc3VibWl0dGVkIGJ5IEdpYW5sdWNhCi0JTW9ybyA8Z2xjdHJAYWJjLml0PjoKLQotCSh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBPbmx5IHVwZGF0ZSBhIGhpMTZzIHJlbG9jIGlmIGl0IGhhcwotCW5vdCBhbHJlYWR5IGJlZW4gdXBkYXRlZC4KLQkoZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jKTogTmV3IHBhcmFtZXRlciAnYWxyZWFkeV9mb3VuZCcKLQlyZXR1cm5zIHN0YXRlIG9mIHJlbWVtYmVyZWQgaGkxNnMgcmVsb2MuCi0JKHJlbWVtYmVyX2hpMTZzX3JlbG9jKTogU2V0ICdmb3VuZCcgZmllbGQgdG8gZmFsc2UuCi0JKGhpMTZzX2xvY2F0aW9uKTogQWRkICdmb3VuZCcgZmllbGQuCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoYmZkX3BlX2RsbF9ub3RfcmVjb2duaXplZF9oYWNrKTogdGhlIGxpbmtlciB3YW50cwotCXRvIHNlZSAuRExMIGZpbGVzIGFzIHVucmVjb2duaXplZC4KLQkoaTNjb2ZmX29iamVjdF9wKTogU29ycnksIGhhZCB0byBoYWNrIGl0IHRvIG5vdCByZWNvZ25pemUgdGhlc2UKLQlmaWxlcyAocGVpLWkzODYpIG9uIHJlcXVlc3QuCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBvcG5jbHMuYyAoYmZkX21ha2VfcmVhZGFibGUpOiBuZWVkIG1vcmUgY2xlYW51cCBmb3Igc3ltYm9scyBhbmQKLQlyZWxlbnRzLiAgQ2FsbCBiZmRfY2hlY2tfZm9ybWF0IHRvIHJlaW5pdGlhbGl6ZS4KLQotRnJpIE5vdiAyMCAxNDoyMTozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgc3B1cmlvdXMKLQl3YXJuaW5ncy4KLQotVGh1IE5vdiAxOSAxNDo0MjoxNSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiByZWdlbmVyYXRlCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIE5vdiAxNyAyMDoyMzozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIHZ0YWJsZV9lbnRyaWVzX3NpemUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBDbGVhciBpdC4KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkKTogQ29weSBpdCwgYW5kCi0JcmVzcGVjdCBpdCBhcyBhbiB1cHBlciBib3VuZCBvbiB3aGF0IG1lbW9yeSB0byByZWZlcmVuY2UuCi0JKGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MpOiBMaWtld2lzZS4KLQkoZWxmX2djX3JlY29yZF92dGVudHJ5KTogSGFuZGxlIGFzLXlldCB1bmRlZmluZWQgdnRhYmxlcy4gIFNldCBhbmQKLQl1cGRhdGUgdnRhYmxlX2VudHJpZXNfc2l6ZSBhcHByb3ByaWF0ZWx5LgotCi1UdWUgTm92IDE3IDE1OjI4OjMxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9yZWxvY190eXBlX2xvb2t1cCk6IFVzZWQgaW50ZWdlcnMgdG8gaG9sZAotCXJlbG9jIG51bWJlci4KLQotTW9uIE5vdiAxNiAyMjoxOToyMSAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSk6IHN1cHBvcnQgQkZEX0lOX01FTU9SWQotIAliZmRzOyB0aGV5IGhhdmUgbm8gImZpbGUiIHNvIHdlIGZha2UgaXQuCi0JKiBiZmQtaW4yLmg6IGFkZCBiZmRfbWFrZV93cml0YWJsZSBhbmQgYmZkX21ha2VfcmVhZGFibGUgKHJlZ2VuKQotCSogbGliYmZkLmMgKGJmZF93cml0ZSk6IEFsbG93IHdyaXRpbmcgdG8gQkZEX0lOX01FTU9SWSBiZmRzIGJ5Ci0gCXJlc2l6aW5nIHRoZSBtZW1vcnkgYnVmZmVyLgotCSogb3BuY2xzLmMgKGJmZF9tYWtlX3dyaXRhYmxlKTogTmV3IGZ1bmN0aW9uOyBsZXRzIHlvdSB3cml0ZSBhCi0gCWJmZF9jcmVhdGUnZCBiZmQgdG8gYW4gaW4tbWVtb3J5IGJ1ZmZlci4KLQkoYmZkX21ha2VfcmVhZGFibGUpOiBOZXcgZnVuY3Rpb247IGxldHMgeW91IHJlYWQgYmFjayB0aGF0IGJ1ZmZlcgotIAlhcyBpZiBpdCB3ZXJlIGZyb20gYmZkX29wZW5yLiAgVXNlZCB0byBidWlsZCBnZW5lcmF0ZWQgYXJjaGl2ZQotIAltZW1iZXJzICh3aW5zdXAncyBsZCdzIGRsbHRvb2wpCi0KLU1vbiBOb3YgMTYgMTk6MTU6MTkgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9iZmQucG90OiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAxNiAxMDo1NzowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKGhpMTZzX2xvY2F0aW9uKTogUmVwbGFjZWQgZml4ZWQgc2l6ZSBhcnJheSB3aXRoCi0JbGlua2VkIGxpc3QuCi0KLVN1biBOb3YgMTUgMjA6Mjg6MjUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFNlYXJjaCBmb3IgdGhlIHByb3BlcgotCWVsZW1lbnQgb2YgdGhlIGdvdGVudHJ5IGxpc3QgZm9yIGxvY2FsIHN5bWJvbHMgdG9vLgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVW5pZnkgbG9jYWwgYW5kIGdsb2JhbCBoYW5kbGluZy4KLQlBc3NlcnQgdGhhdCBnb3RlbnQtPnVzZV9jb3VudCA+IDAuCi0KLVNhdCBOb3YgMTQgMTU6MTY6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHZtc19hbHBoYV92ZWMpOiBSZW5hbWUgZnJvbSBldmF4X2FscGhhX3ZlYywgYW5kCi0JdXBkYXRlIGZvciBmaWxlIG5hbWUgY2hhbmdlcyBvZiBKdWx5IDIsIDE5OTguCi0JKHZtc192YXhfdmVjKTogTmV3LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTm92IDEyIDE5OjE5OjU0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vYmZkLnBvdDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMTAgMTY6MTc6MDYgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00LCBjb25maWcuYmZkOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgTm92IDEwIDE1OjEzOjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3IgYmZkX2FyY2hfZnIzMC4KLQotVHVlIE5vdiAxMCAxMzozNzozNiAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotIAlCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKTogZGlkbid0IGRlZmluZSBtYWNybyB3aGVuIHZhbHVlCi0gCXdhcyBjYWNoZWQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IHJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDEwIDE0OjMxOjAxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKHJlbG9jX3R5cGUpOiAgQWRkIFJfRDEwVl9HTlVfVlRJTkhFUklUIGFuZAotCVJfRDEwVl9HTlVfVlRFTlRSWSByZWxvY3MuCi0JKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogIExpa2V3aXNlLgotCShkMTB2X3JlbG9jX21hcCBkMTB2X3JlbG9jX21hcCk6ICBMaWtld2lzZS4KLQkoZWxmMzJfZDEwdl9nY19tYXJrX2hvb2spOiAgTmV3LgotCShlbGYzMl9kMTB2X2djX3N3ZWVwX2hvb2spOiAgTmV3LgotCShlbGYzMl9kMTB2X2NoZWNrX3JlbG9jcyk6ICBOZXcuCi0JKGVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbik6ICBOZXcuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiAgRGVmaW5lLgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCi1TYXQgTm92ICA3IDE4OjA3OjUxIDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXRlci5zY2hhdWVyQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IE1vdmUgdm1zIGZpbGVzIGhlcmUuLi4KLQkoQkZENjRfQkFDS0VORFMpOiAuLi5mcm9tIGhlcmUuCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IE1vdmUgdm1zIGZpbGVzIGhlcmUuLi4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogLi4uZnJvbSBoZXJlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBOb3YgIDQgMTU6NTg6NDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBGUjMwIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgRlIzMCB0YXJnZXQuCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3IgRlIzMC4KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBGUjMwLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgRlIzMC4KLQkqIHJlbG9jLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHJlbG9jYXRpb25zLgotCSogdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCByZWxvY2F0aW9ucy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiAgUmVnZW5lcmF0ZS4KLQkqIGNwdS1mcjMwLmM6IE5ldyBmaWxlLgotCSogZWxmMzItZnIzMC5jOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgMiAxNDo1OTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotU3VuIE5vdiAgMSAxOTozMjoyOCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IERvIG5vdCB1c2UgYWxsb2NhLAotCXVzZSBiZmRfbWFsbG9jIGFuZCBmcmVlIGluc3RlYWQgYW5kIGNoZWNrIHJldHVybiB2YWx1ZSBmcm9tIGJmZF9tYWxsb2MuCi0KLVN1biBOb3YgIDEgMTY6MjA6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZHluc3ltX3NlY19uYW1lcyk6IENvbW1lbnQgb3V0LgotCShTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVMpOiBMaWtld2lzZS4KLQkoTUlQU19URVhUX0RZTlNZTV9TRUNOKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IERvbid0IHNldCBzaF9pbmZvIGZpZWxkIG9mIGEgLmhhc2gKLQlzZWN0aW9uLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogUmVtb3ZlIGR5bnN5bV9zZWNfc3RyaW5kZXgKLQlmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERvbid0IGluaXRpYWxpemUKLQlkeW5zeW1fc2VjX3N0cmluZGV4LgotCShtaXBzX2VsZl9nY19tYXJrX2hvb2spOiBBZGQgZGVmYXVsdCBjYXNlIHRvIGF2b2lkIHdhcm5pbmcuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEdlbmVyYXRlIGEgc2VjdGlvbiBzeW1ib2wgZm9yCi0JZXZlcnkgb3V0cHV0IHNlY3Rpb24uCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQ291bnQgYWxsIHNlY3Rpb25zIGZvcgotCURUX01JUFNfVU5SRUZFWFROTy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgZHluYW1pYyBzeW1ib2xzIGZvciBhbGwKLQlvdXRwdXQgc2VjdGlvbnMuCi0KLVN1biBOb3YgIDEgMTI6NDY6NTMgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQWxsb2NhdGUgdHdvIHNsb3RzCi0JZm9yIGxhdGVyIFBMVCBlbnRyaWVzIGluIGxhcmdlIFBMVHMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQWxsb3cgZm9yIHRoZSBleHRyYSBzbG90cy4KLQotU2F0IE9jdCAzMSAyMDoxMDowOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9hZF9zZWN0aW9uKTogRml4IHR5cG8uCi0KLTE5OTgtMTAtMjYgMTU6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZCBlbGZfaGFzaF92YWx1ZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2NvbGxlY3RfaGFzaF9jb2Rlcyk6IE5ldyBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMKLQljYWxsZWQgZm9yIGVhY2ggZXhwb3J0ZWQgc3ltYm9sIGFuZCB3ZSBjb21wdXRlIHRoZSBFTEYgaGFzaCB2YWx1ZSBmb3IKLQlpdC4KLQkoY29tcHV0ZV9idWNrZXRfdmFsdWUpOiBOZXcgZnVuY3Rpb24uICBJdCBpcyBjYWxsZWQgZnJvbQotCXNpemVfZHluYW1pY19zZWN0aW9ucyB0byBkZXRlcm1pbmUgdGhlIGhhc2ggdGFibGUgc2l6ZS4gIFdoZW4gd2UgYXJlCi0Jb3B0aW1pemluZyBhIGJldHRlciwgYnV0IHNsb3dlciwgYWxnb3JpdGhtIGlzIHVzZWQuCi0JKHNpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgY29tcHV0ZV9idWNrZXRfdmFsdWUuCi0KLQkqIGVsZi5jIChiZmRfZWxmX2hhc2gpOiBPcHRpbWl6ZSB0aGUgaGFzaCBmdW5jdGlvbiBhIGJpdC4KLQotTW9uIE9jdCAxOSAyMDowMzoyMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc2guYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1NIX0dOVV9WVElOSEVSSVQgYW5kCi0JUl9TSF9HTlVfVlRFTlRSWS4KLQkoc2hfZWxmX2djX21hcmtfaG9vayk6ICBOZXcuCi0JKHNoX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldy4KLQkoc2hfZWxmX2NoZWNrX3JlbG9jcyk6ICBOZXcuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLU1vbiBPY3QgMTkgMTY6NTc6MDUgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IHVuZG8gcHJldmlvdXMgZ2V0dGV4dCBjaGFuZ2UKLQkqIGFjbG9jYWwubTQ6IHJlYnVpbGQgd2l0aCByaWdodCB2ZXJzaW9uIG9mIGFjbG9jYWwuCi0KLU1vbiBPY3QgMTkgMDE6NDc6MjEgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQsIGFjbG9jYWwubTQ6IG1vdmUgZ2V0dGV4dC1yZWxhdGVkIGZyYWdtZW50cyBmcm9tCi0gCWFjbG9jYWwubTQgdG8gYWNpbmNsdWRlLm00LCBzbyB0aGV5IGRvbid0IGdldCBsb3N0LgotCi0JKiBlbGZjb3JlLmg6IHJld3JpdGUgZm9yIGJldHRlciBjb3JlZmlsZSBzdXBwb3J0LgotCSogZWxmLmMgKGVsZmNvcmVfKik6IG5ldyBmdW5jdGlvbnMuCi0JKiBlbGYtYmZkLmggKGVsZl9vYmpfdGRhdGEpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCi0JKiBhY2NvbmZpZy5oLCBhY2luY2x1ZGUubTQsIGNvbmZpZ3VyZS5pbjogYWRkIGZlYXR1cmUtdGVzdHMgZm9yCi0gCWZsYXZvciBvZiBwcm9jZnMuCi0JKiBhY2xvY2FsLm00LCBjb25maWcuaW4sIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGVkLgotCi1GcmkgT2N0IDE2IDE0OjA3OjQ1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9NMzJSX0dOVV9WVElOSEVSSVQKLQlhbmQgUl9NMzJSX0dOVV9WVEVOVFJZLgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCShtMzJyX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgotCShtMzJyX2VsZl9nY19tYXJrX2hvb2spOiAgTmV3LgotCShtMzJyX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldy4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBIYW5kbGUgVlQgcmVsb2NzLgotCi1Nb24gT2N0IDEyIDE0OjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHJlZHVuZGFudCB0ZXN0LgotCi0JKiBiZmQtaW4yLmggKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBJbXByb3ZlIGNvbW1lbnQgdG8gbWFrZQotCWNsZWF0IHRoYXQgdGhlICdiaXRzaXplJyBmaWVsZCBpcyB0aGUgc2l6ZSBvZiB0aGUgYml0ZmllbGQgQUZURVIKLQlyZWxvY2F0aW9uIG5vdCBiZWZvcmUuCi0KLQkqIGVsZjMyLW0zMnIuYyAoUl9NMzJSXzE4X1BDUkVMKTogRml4IHNpemUgb2YgYml0ZmllbGQuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX2hpKTogQ29wZSB3aXRoIG1pc3NpbmcgcmVmaGkgb3IgcmVmbG8KLQlyZWxvY3MuCi0KLVR1ZSBPY3QgIDYgMDk6MjA6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9TUEFSQ19HTlVfVlRJTkhFUklUIGFuZAotCVJfU1BBUkNfR05VX1ZURU5UUlkuCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgdGhlbS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXApOiAgTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiAgTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX2djX21hcmtfaG9vayk6ICBOZXcuCi0JKGVsZjMyX3NwYXJjX2djX3N3ZWVwX2hvb2spOiAgTmV3LgotCi1Nb24gT2N0ICA1IDE0OjU1OjMwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maW5pc2hfd3JpdGluZyk6IFBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzIHdoZW4KLQl3cml0aW5nIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0KLU1vbiBPY3QgIDUgMTI6MDI6MzEgMTk5OCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMS5jIDogTmV3IGZpbGUuICBBZGRzIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lLgotCSogY29uZmlndXJlLmluIChlbGYpOiBBZGQgZHdhcmYxLmxvLgotCSogZWxmX2JmZC5oIChlbGZfb2JfdGRhdGEpOiBBZGQgZHdhcmYxX2ZpbmRfbGluZV9pbmZvLgotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkIGNhbGwgdG8KLQlfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZS4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6Ci0JQWRkIGNhbGwgdG8gX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBPY3QgIDUgMTA6MDY6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3NlY3Rpb25zKTogIERvIG5vdCBhbGxvdyBnYXJiYWdlCi0JY29sbGVjdGlvbiBpZiBkeW5hbWljIHNlY3Rpb25zIGhhdmUgYmVlbiBjcmVhdGVkLgotCi1Nb24gT2N0ICA1IDA5OjA3OjM3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmM6IEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1Y4NTBfR05VX1ZUSU5IRVJJVCBhbmQKLQlSX1Y4NTBfR05VX1ZURU5UUlkuCi0JKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgVlRJTkhFUklUIGFuZCBWVEVOVFJZIHJlbG9jcy4KLQkodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogIExpa2V3aXNlLgotCSh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIExpa2V3aXNlLgotCSh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIExpa2V3aXNlLgotCSh2ODUwX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldyByb3V0aW5lLgotCSh2ODUwX2VsZl9nY19tYXJrX2hvb2spOiAgTmV3IHJvdXRpbmUuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLU1vbiBPY3QgIDUgMDk6MDQ6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfZ2Nfc3dlZXBfaG9vayk6ICBEb24ndCBhc3N1bWUKLQl0aGF0IGR5bm9iaiBleGlzdHMuCi0KLVN1biBPY3QgIDQgMjM6Mjk6MzQgMTk5OCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKToKLQlEZWNsYXJlIHNpemUgYXMgYmZkX3NpemVfdHlwZS4KLQkocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlY2xhcmUgY291bnQgYXMgYmZkX3NpemVfdHlwZS4KLQotU3VuIE9jdCAgNCAyMDozODoyOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNwdS1ocHBhLmMgKGJmZF9ocHBhMjBfYXJjaCk6IERlZmluZS4gIExpbmsgaXQgaW50byB0aGUgYmZkX2hwcGFfYXJjaAotCXN0cnVjdHVyZS4KLQkqIHNvbS5jIChDUFVfUEFfUklTQzJfMCk6IERlZmluZS4KLQkoX1BBX1JJU0MyXzBfSUQpOiBMaWtld2lzZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogVXNlIENQVV9QQV9SSVNDMl8wIGZvciB0aGUgc3lzdGVtX2lkIGFzIG5lZWRlZC4KLQotU3VuIE9jdCAgNCAyMToxOTowOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBhIHZlcnNpb25lZCBzeW1ib2wKLQloYXMgYSBiYXNlIHdoaWNoIGlzIGFscmVhZHkgZGVmaW5lZCwgb25seSBhZGQgdGhlIHJlZmVyZW5jZWQKLQlzeW1ib2wgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGl0IGlzIGRlZmluZWQgb3IgcmVmZXJlbmNlZAotCWJ5IGEgcmVndWxhciBmaWxlLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogSGFuZGxlIHZ0YWJsZSByZWxvY3MKLQljb3JyZWN0bHkuCi0KLTE5OTgtMDktMjcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVuZG8gbGFzdCBjaGFuZ2UuCi0KLVdlZCBTZXAgMjMgMTY6MDk6MzEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCByZWNvcmQgYSBkeW5hbWljCi0Jc3ltYm9sIGZvciB0aGUgaW5kaXJlY3QgYWxpYXMgdG8gYSB2ZXJzaW9uZWQgc3ltYm9sLgotCi1Nb24gU2VwIDIxIDEyOjE1OjIyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvKTogTmV3LgotCShlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG8pOiBOZXcuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogIFJldHVybiBlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG8KLQlvciBlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byAgb24gbG9va3VwLgotCi1TdW4gU2VwIDIwIDAwOjQ4OjA3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEluY2x1ZGUgImVsZi9tNjhrLmgiLiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgZW51bQotCXJlbG9jX3R5cGUuICBSZW5hbWUgUl82OEtfX21heCB0byBSXzY4S19tYXguCi0JKGhvd3RvX3RhYmxlKTogVXNlIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4gZm9yIGEgVlRFTlRSWQotCXJlbG9jLgotCi1TdW4gU2VwIDIwIDAwOjA5OjI1IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0YjMyKTogUmV3cml0ZSBleHByZXNzaW9uIHRvIGdldCBiZXR0ZXIgY29kZS4KLQkoYmZkX2dldGwzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfZ2V0bF9zaWduZWRfMzIpOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogQ2FzdCB0byBiZmRfdm1hIGJlZm9yZSBzaGlmdGluZywgbm90Ci0JYWZ0ZXIuCi0KLVNhdCBTZXAgMTkgMjI6NDI6MjMgMTk5OCAgRG91ZyBSYWJzb24gIDxkZnJAbmxzeXN0ZW1zLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBFbnN1cmUgdGhhdCB0aGUgd2FybmluZwotCW1lc3NhZ2UgaGFzIGEgbnVsbCBieXRlIHRlcm1pbmF0b3IuCi0KLUZyaSBTZXAgMTggMTQ6MzU6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBJZ25vcmUgY29udGVudHMgb2YKLQl3b3JkIHN1YmplY3QgdG8gUl9WODUwXzMyIHJlbG9jYXRpb24uCi0KLVRodSBTZXAgMTcgMTc6MjA6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmM6IEFkZCBjb21tZW50IGRlc2NyaWJpbmcgcHJvYmxlbSBjb21wdXRpbmcgbGluZSBudW1iZXJzCi0JZm9yIHVuZGVmaW5lZCBzeW1ib2xzIGF0IGxpbmsgdGltZS4KLQotVGh1IFNlcCAxNyAxNjowMzoyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndAotCXRyYW5zZm9ybSBhIGRlZndlYWsgaW50byBhIHBsdCBlbnRyeS4KLQkoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyByb29tIGZvciBzZWNvbmRhcnkKLQlwbHQgZW50cnkgcmVmZXJlbmNlcyB0byByZWNlaXZlIGEgUkVMQVRJVkUgcmVsb2MuCi0JKGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpbGwgdGhlbSBpbi4KLQkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEFzc2VydCB3ZSBkb24ndCBvdmVycnVuCi0JdGhlIGFsbG9jYXRlZCByZWxvY2F0aW9uIHNwYWNlLgotCi1XZWQgU2VwIDE2IDE4OjAzOjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogQWx3YXlzIHRyZWF0IHNlY3Rpb24gc3ltYm9scyBhcwotCXNwZWNpYWwsIGV2ZW4gaWYgdGhleSBhcmUgYXR0YWNoZWQgdG8gYSBjb21tb24gc2VjdGlvbi4KLQotV2VkIFNlcCAxNiAxMDozNDoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogTW92ZSBzeW1ib2xzIGluCi0Jc2VjdGlvbnMgd2l0aCB2ODUwIGNvbW1vbiBzZWN0aW9uIGF0dHJpYnV0ZXMgaW50byBuYW1lZCB2ODUwCi0JY29tbW9uIHNlY3Rpb25zLgotCSh2ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBNb3ZlIHN5bWJvbHMgaW4gc2VjdGlvbnMgd2l0aCB2ODUwCi0JY29tbW9uIHNlY3Rpb24gYXR0cmlidXRlcyBpbnRvIG5hbWVkIHY4NTAgY29tbW9uIHNlY3Rpb25zLgotCi1XZWQgU2VwIDE2IDExOjI2OjQ5IENEVCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9nY19tYXJrX2hvb2spOiAgUmVtb3ZlIHByaW50Ci0Jc3RhdGVtZW50LgotCi0xOTk4LTA5LTE1ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV2ZXJzZSBvdXRwdXRfb2Zmc2V0Ci0JcGFydCBvZiBWbGFkaW1pcidzIGNoYW5nZSBvZiAxOTk4LTA4LTE5LiAgTWFrZSBhIFJfUFBDX1NEQVJFTDE2Ci0JcmVsb2MgdG8gdGhlIHdyb25nIHNlY3Rpb24gYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IuICAuZHluc2JzcwotCWlzIG5vdCBhbiBvdXRwdXQgc2VjdGlvbiwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgaXQuCi0KLVR1ZSBTZXAgMTUgMTI6NDA6MDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZi1iZmQuaDogIEFkZCBhcmd1bWVudCB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0KLVR1ZSBTZXAgMTUgMDg6MzQ6NDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIFBhc3MgdHlwZSB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0gICAgICAgKiBlbGYzMi1hcm0uYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX0FSTV9HTlVfVlRJTkhFUklUIGFuZAotICAgICAgIFJfQVJNX0dOVV9WVEVOVFJZLgotICAgICAgIChlbGYzMl9hcm1fZ2NfbWFya19ob29rKTogTmV3LgotICAgICAgIChlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgSGFuZGxlIFZUSU5IRVJJVCBhbmQgVlRFTlRSWQotICAgICAgIHJlbG9jYXRpb25zLgotICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBWVElOSEVSSVQgYW5kIFZURU5UUlkKLSAgICAgICByZWxvY2F0aW9ucy4KLQotMTk5OC0wOS0xMCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IElmIGR5bm9iaiBpcyBOVUxMLAotCWFzc3VtZSB0aGVyZSBpcyBubyBQTFQgb3IgR09ULgotCi1XZWQgU2VwICA5IDE0OjI0OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUpOiBOZXcgZnVuY3Rpb246ICBqdXN0Ci0JbGlrZSBfZWxmX2JmZF9maW5kX25lYXJlc3RfbGluZSgpIGV4Y2VwdCB0aGF0IFNUVF9BUk1fVEZVTkMgaXMKLQlhbHNvIGFjY2VwdGVkIGFzIGEgZnVuY3Rpb24gc3ltYm9sIHR5cGUuCi0KLU1vbiBTZXAgIDcgMTM6MjQ6MDMgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiByczYwMDAtY29yZS5jIChfTE9OR19MT05HKTogIERlZmluZSBmb3IgQUlYIDQueCBvbmx5LgotCi1TYXQgU2VwICA1IDIwOjQwOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyk6IENvcnJlY3QgZGVmaW5pdGlvbiB0bwotCW1hdGNoIGRlZmluaXRpb24gb2YgX2JmZF9nY19zZWN0aW9ucyBmaWVsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1GcmkgU2VwICA0IDEzOjU0OjIzIDE5OTggIERhdmlkIE1pbGxlciAgPGRhdmVtQGRtLmNvYmFsdG1pY3JvLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFByb3Blcmx5IGFkanVzdAotCXRoZSBhZGRlbmQgb2YgYSBkeW5hbWljIHJlbG9jYXRpb24gcmVmZXJlbmNpbmcgYSBzZWN0aW9uLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaXggdGhlIFBMVCByZWxvY2F0aW9uIG9mZnNldC4KLQotVGh1IFNlcCAgMyAxNzoyODo1MCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGJmZF9lbGZOTl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBWZXJpZnkgdGhhdCB0aGUKLQliZWQgaGFzIGEgc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJvdXRpbmUgYmVmb3JlIHRyeWluZyB0byB1c2UgaXQuCi0KLU1vbiBBdWcgMzEgMTQ6NDk6MjIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byk6IFVzZQotCV9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4uCi0KLU1vbiBBdWcgMzEgMTA6MjM6NDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiAgQWRkIGVsZjMyLWFybS5jLgotCSogTWFrZWZpbGUuaW46ICBSZWJ1aWxkLgotCSogZWxmLWJmZC5oOiAgQWRkIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIElmIGRlZmluZWQsIGNhbGwKLQllbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0JKiBlbGYzMi1hcm0uYzogRGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQkoZWxmMzJfYXJtX2dldF9zeW1ib2wtdHlwZSk6ICBOZXcgcm91dGluZS4KLQkocmVjb3JkX3RodW1iX3RvX2FybV9nbHVlKTogIENoYW5nZSB0byB1c2UgU1RUX0FSTV9URlVOQy4KLQkoYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogIENoYW5nZSB0bwotCWNoZWNrIGZvciBTVFRfQVJNX1RGVU5DLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBMaWtld2lzZS4KLQkqIGVsZnh4LXRhcmdldC5oOiAgQWRkIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQotRnJpIEF1ZyAyOCAxOTo0NDowNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9hbHBoYV9ldls0NTZdKTogTmV3LgotCSogY3B1LWFscGhhLmM6IFJld29yayB0byBtYXRjaCB0aGVzZSB0eXBlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIEF1ZyAyOCAxOTozODo1MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4pOiBEZWNsYXJlLgotCSogZWxmLmMgKF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4pOiBOZXcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWRkIHZ0YWJsZSByZWxvY3MuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogUmVjb2duaXplIHRoZW0uCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IFBhc3MgdGhlbSBvZmYgdG8gZ2VuZXJpYyBjb2RlLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZW0uCi0JKGVsZl9pMzg2X2djX21hcmtfaG9vaywgZWxmX2kzODZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogVHJ1ZS4KLQotVGh1IEF1ZyAyMCAxNTowMzo0NSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYyAoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIpOiBDaGVjayBzeW1fc2VjIGlzIG5vdCBOVUxMCi0JYmVmb3JlIGxvb2tpbmcgYXQgb3duZXIgZmllbGQuCi0JKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogRGl0dG8uCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQ29tcHV0ZSBuYW1lIGJlZm9yZSBjYWxsaW5nCi0JZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUoKS4KLQotVGh1IEF1ZyAyMCAxMTozMDoxNyAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBlbGYuYzogY29tbWVudCBhbmQgZm9ybWF0dGluZyBjbGVhbnVwcy4KLQkqIGVsZmNvcmUuaDogZGl0dG8uCi0KLVdlZCBBdWcgMTkgMTU6NDM6MjYgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSZWplY3QgZmlsZXMgb2YgaGVhZGVyIHR5cGUgRVRfQ09SRQotCShjb3JlIGZpbGVzIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IHRoYW4gb2JqZWN0IGZpbGVzKS4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMsCi0JYmZkX2VsZl9ta2NvcmVmaWxlKTogZGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oIChfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLQliZmRfZWxmX21rY29yZWZpbGUpOiBhZGQgdG8gYmZkX3RhcmdldCB2ZWN0b3IuCi0JKiBlbGZjb3JlLmggKGVsZl9jb3JlX2ZpbGVfcCk6IHNhdmUgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLAotCWFuZCBzZXQgdGhlIGJmZCBhcmNoaXRlY3R1cmUgZnJvbSB0aGUgZWxmIGZpbGUgaGVhZGVyLgotCSogZWxmLmMgKGJmZF9lbGZfbWtjb3JlZmlsZSk6IG5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMpOiBuZXcgZnVuY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBhZGQgY2FzZXMgZm9yIGhhbmRsaW5nCi0JUFRfTk9URSBzZWdtZW50cy4gIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6Ci0JY29yZSBmaWxlcyBzaG91bGQgYmUgaGFuZGxlZCB0aGUgc2FtZSBhcyBleGVjIGZpbGVzLgotCShwcmVwX2hlYWRlcnMpOiBpZGVudGlmeSBjb3JlIGZpbGVzIGFzIHR5cGUgRVRfQ09SRS4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogaWRlbnRpZnkgdGhlIHNlY3Rpb25zIGJlbG9uZ2luZyB0bwotCXRoZSBQVF9OT1RFIHNlZ21lbnQuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCWFkZCBicmVhayBzdGF0ZW1lbnQgdG8gZGVmYXVsdCBjYXNlLgotCi0xOTk4LTA4LTE5ICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHRoYXQgb3V0cHV0Ci0Jc2VjdGlvbiAobm90IGlucHV0KSB3aWxsIGJlIGluIHNlY3Rpb25zICIuc2JzcyIsICIuc2JzczIiLAotCSIuc2RhdGEiLCBhbmQgIi5zZGF0YSIgZm9yIFJfUFBDX1NEQVJFTDE2LCBSX1BQQ19FTUJfU0RBMlJFTCwKLQlSX1BQQ19FTUJfU0RBMjEsIFJfUFBDX0VNQl9SRUxTREEuICBJbiBhbGwgdGhlc2UgY2FzZXMgYWxzbyBpZ25vcmUKLQlvdXRwdXRfb2Zmc2V0IGZvciBjb3JyZWN0IGV2YWx1YXRpb24gb2YgYWRkZW5kLgotCi1UdWUgQXVnIDE4IDExOjQ4OjEyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYzogQWRkIHByZWZpeCBiZmRfIHRvIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0JZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBhbmQKLQllbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLQotVHVlIEF1ZyAxOCAxMTo0NjowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogQW1tZW5kIHByb3RvdHlwZSBmb3IKLQllbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiB0byByZW1vdmUgc3VycGx1cyB0aGlyZAotCWFyZ3VtZW50LgotCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLVNhdCBBdWcgMTUgMjA6NTU6MDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSBpbmRpcmVjdCBzeW1ib2xzLgotCi1GcmkgQXVnIDE0IDA5OjEyOjI4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBVc2UgdGhlIHJlbG9jYXRpb24gYWxyZWFkeQotCWNhbGN1bGF0ZWQgZm9yIFJFTE9DX1NQQVJDX1JFVjMyIGNhc2UuCi0KLVRodSBBdWcgMTMgMTQ6MDI6MDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGJmZC1pbi5oOiAgQWRkIHByb3RvdHlwZXMgZm9yIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBhbmQKLSAgICAgICBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLSAgICAgICAqIGJmZC1pbjIuaDogIFJlZ2VuZXJhdGVkLgotICAgICAgICogZWxmMzItYXJtLmMgRGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUuCi0gICAgICAgKGluc2VydF90aHVtYl9icmFuY2gpOiBOZXcgcm91dGluZS4KLSAgICAgICAoZmluZF90aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGZpbmRfYXJtX2dsdWUpOiBOZXcgcm91dGluZS4KLSAgICAgICAocmVjb3JkX2FybV90b190aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpIE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbikgTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggdHlwby4KLSAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgQWRkIGFyZ3VtZW50IHN5bV9zZWMuCi0gICAgICAgQ2hlY2sgZm9yIGJyYW5jaGVzIHRvIHRodW1iIHN5bWJvbHMgaW4gY2FzZSBSX0FSTV9QQzI0LgotICAgICAgIENoZWNrIGZvciBicmFuY2hlcyB0byBhcm0gc3ltYm9scyBpbiBjYXNlIFJfQVJNX1RITV9QQzIyLgotICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBQYXNzIHN5bWJvbCBzZWN0aW9uIHRvCi0gICAgICAgZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0KLVdlZCBBdWcgMTIgMTk6MDA6MzkgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgUExUCi0JZW50cmllcyB1bmxlc3MgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxlOyBpbgotCXBhcnRpY3VsYXIsIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbHMgZ2V0IGEgUExUIGVudHJ5LgotCi1XZWQgQXVnIDEyIDE0OjQ4OjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQgdG8gYXZvaWQgd2FybmluZy4KLQotV2VkIEF1ZyAxMiAwODoxMDoxMSAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmV3b3JrCi0gICAgICAgUl9BUk1fUEMyNCByZWxvY2F0aW9uLgotCi1UdWUgQXVnIDExIDE0OjQyOjI2IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmVtb3ZlIHVudXNlZAotICAgICAgIGFyZ3VtZW50IGlzX2xvY2FsLiAgQWRkIGFyZ3VtZW50IHN5bV9mbGFncy4gIENoZWNrIHN5bV9mbGFncwotICAgICAgIGluIFJfQVJNX0FCUzMyIGNhc2UuICBJbmNsdWRlIGFkZGVuZCBmb3IgUl9BUk1fVEhNX1BDMjIgY2FzZS4KLSAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3QgcGFzcyBsb2NhbCBzeW0gYW5kIHBhc3MKLSAgICAgICBzeW1fZmxhZ3MgdG8gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0KLU1vbiBBdWcgMTAgMjA6Mzg6MzkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBDb3JyZWN0IGxhc3QgY2hhbmdlCi0JdG8gbm90IGNvdW50IHRvbyBmZXcgcmVsb2NzIGZvciBkeW5hbWljbHkgbGlua2VkIGV4ZWN1dGFibGVzLgotCi1Nb24gQXVnIDEwIDE1OjM1OjM0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogTmV2ZXIgY29uc2lkZXIKLQlzeW1ib2xzIHdpdGhvdXQgYSBkeW5hbWljIGluZGV4IGR5bmFtaWMuICBDb25zaWRlciBhbGwgd2VhawotCXN5bWJvbHMgZHluYW1pYy4KLQkoZWxmNjRfYWxwaGFfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IERvbid0IGFzc3VtZSAxLTEKLQljb3JyZXNwb25kYW5jZSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgc2VjdGlvbnMuCi0KLU1vbiBBdWcgMTAgMTU6MzE6MzkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEZvciBiYWNrZW5kcwotCXRoYXQgdXNlIGEgLmdvdC5wbHQgc2VjdGlvbiBzdGFydCB0aGUgZ290IG9mZnNldCBhdCB6ZXJvLgotCi1Nb24gQXVnIDEwIDE3OjMxOjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX3Byb2Nlc3Nvcik6IENvcnJlY3QgdGhlIHByb2Nlc3NvciBJRCB3cml0dGVuCi0Jb3V0IGZvciBiZmRfYXJjaF9tNjhrLCBhY2NvbW1vZGF0aW5nIGNoYW5nZSBvZiBNYXJjaCAyNS4KLQotU3VuIEF1ZyAgOSAyMDo1NTo0NCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIFJld29yawotCVJfQVJNX1RITV9SUEMyMiByZWxvY2F0aW9ucy4KLQotU2F0IEF1ZyAgOCAxNToxNTozMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IFVuZGVmIHdlYWsgc3ltYm9scwotCWFyZSBhbHdheXMgZHluYW1pYy4KLQkoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyBlbm91Z2ggcm9vbSBmb3IgUkVMQVRJVkUKLQkuZ290IHJlbG9jcyBpbiAtQnN5bWJvbGljIHNoYXJlZCBvYmplY3RzLgotCi1XZWQgQXVnICA1IDE1OjQ4OjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jOiBBZGQgcHJpdmF0ZSBmbGFncyB0byBFTEYgaGVhZGVyLgotCShlbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBGdW5jdGlvbi4KLQkoZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fY29weV9wcml2YXRlX2ZsYWdzKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBGdW5jdGlvbi4KLQotTW9uIEF1ZyAgMyAxNzoxMDoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IFBlcm1pdCBXUExUMzAgYWdhaW5zdAotCWEgbG9jYWwgc3ltYm9sLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVN1biBBdWcgIDIgMDM6MTk6MjMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogSW5pdCBzZ290IHRvIE5VTEwuICBDcmVhdGUgdGhlCi0JLmdvdCBpZiBhbnkgcmVsb2NhdGlvbiByZWZlcnJzIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUHVsbCBzZ290IGFuZCBzcGx0IHNlYXJjaCB0byB0aGUgc3RhcnQKLQlvZiB0aGUgZnVuY3Rpb24uICBSZWNvZ25pemUgbm8gLnBsdCBhcyBzdGF0aWMgbGlua2luZy4KLQotMTk5OC0wOC0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IHBhc3MKLQkiLmxpYmxpc3QiIHN0cmluZyB0aHJvdWdoIGdldHRleHQuCi0KLUZyaSBKdWwgMzEgMTY6Mzg6MTQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgZWxmMzItYXJtLmxvLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWcuYmZkIChhcm0tKi1lbGYpOiAgRGVmaW5lIHRhcmdfZGVmdmVjIGFuZCB0YXJnX3NlbHZlY3MuCi0JKHRodW1iLSotZWxmKTogRGVmaW5lIHRhcmdfZGVmdmVjIGFuZCB0YXJnX3NlbHZlY3MuCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMgYW5kIGJmZF9lbGYzMl9iaWdhcm1fdmVjLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogZWxmLmM6IChwcmVwX2hlYWRlcnMpOiAgU3VwcG9ydCBhcmNoX3R5cGUgb2YgRU1fQVJNLgotCSogdGFyZ2V0cy5jOiAgU3VwcG9ydCBuZXcgdGFyZ2V0cyBiZmRfZWxmMzJfYmlnYXJtX3ZlYyBhbmQKLQliZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjLgotCSogZWxmMzItYXJtLmM6ICBOZXcgZmlsZS4KLQotVHVlIEp1biAyOCAxOTowNToyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChNX1NQQVJDTElURV9MRSk6IE5ldyBtYWNoaW5lLgotCSogc3Vub3MuYyAoTUFDSFRZUEVfT0spOiBBZGQgbWFjaGluZSBNX1NQQVJDTElURV9MRS4KLQkqIGFvdXRmMS5oIChzdW5vc19zZXRfYXJjaF9tYWNoKTogQWRkIG1hY2hpbmUgTV9TUEFSQ0xJVEVfTEUuCi0JKHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQWRkIHJlbG9jYXRpb24gUl9TUEFSQ19SRVYzMi4KLQkoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpIEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBBZGQgUkVMT0NfU1BBUkNfUkVWMzIgc3VwcG9ydC4KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlLCBzcGFyY19yZWxvY19tYXAsCi0JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSBSX1NQQVJDXzMyTEUgdG8gYmUgUl9TUEFSQ19SRVYzMgotCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBSZW5hbWUgQkZEX1JFTE9DX1NQQVJDXzMyTEUgdG8KLQliZSBCRkRfUkVMT0NfU1BBUkNfUkVWMzIuCi0JKiByZWxvYy5jOiBEaXR0by4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjODZ4LSotYW91dCk6IE5ldwotCi1GcmkgSnVsIDI0IDEzOjU0OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEFsbG9jYXRlIE5VTEwgc3ltYm9sIGJlZm9yZQotCWFjdHVhbGx5IG1hcHBpbmcgdGhlIG91dHB1dCBzZWN0aW9ucy4KLQotRnJpIEp1bCAyNCAxMToyNDoyOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9ob3d0byk6IEFkZCBSX01OMTAzMDBfMjQgZW50cnkuCi0JKG1uMTAzMDBfZWxmX3JlbG9jX21hcCk6IFNpbWlsYXJseS4KLQkobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBSX01OMTAzMDBfMjQuCi0KLUZyaSBKdWwgMjQgMTI6MzY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIHJlbG9jIHR5cGVzIHVzZWQgb24KLQlJcml4IDYuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgZGVmYXVsdCBjYXNlLgotCSogZWxmNjQtbWlwcy5jOiBSZXBsYWNlIGFsbCB1c2VzIG9mIG1pcHNfZWxmNjRfcmVsb2NfdHlwZSB3aXRoCi0JZWxmX21pcHNfcmVsb2NfdHlwZSBkZWZpbmVkIGluIGVsZi9taXBzLmguCi0KLTE5OTgtMDctMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IFJlbW92ZSByZWxvY190eXBlIGRlZmluaXRpb24gY29tcGxldGVseS4gIEl0J3Mgbm93Ci0JaW4gZWxmL21pcHMuaC4KLQotVGh1IEp1bCAyMyAxMzozMzoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfcmVsb2NfdHlwZSk6ICNpZiAwIG91dCBtb3JlIHJlbG9jYXRpb25zCi0JYXMgdGhleSBhcmUgZGVmaW5lZCBpbiBlbGYvbWlwcy5oIG5vdy4KLQotVGh1IEp1bCAyMyAxMToyOTo0MyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQotCSogUmUtYWRkIGxvc3QgY2hhbmdlOgotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGQKLQkibW92bV9zdGFja19zaXplIi4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluY2x1ZGUgc3RhY2sgc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzCi0JaW4gdGhlIGltbTggZmllbGQgb2YgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbyk6IERldGVybWluZSBob3cgbXVjaCBzdGFjayBpcyBhbGxvY2F0ZWQgYnkKLQl0aGUgbW92bSBpbnN0cnVjdGlvbi4gIEZpeCB0eXBvLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBtb3ZtX3N0YWNrX3NpemUuCi0KLVRodSBKdWwgMjMgMTE6Mzg6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUgYXMgNC4KLQkqIGVsZjY0LXNwYXJjLmMgKGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSk6IERlZmluZSBhcyA4LgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmM6IENoYW5nZSB1c2Ugb2YgcHBfcmVsb2NfdHlwZSB0byBlbGZfcHBjX3JlbG9jX3R5cGUuCi0KLVdlZCBKdWwgMjIgMTY6Mjc6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaHBwYS5oOiBMZXQgRUxGIGhlYWRlciBkZWZpbmUgdGhlIGVudW0gY29udGFpbmluZyB0aGUKLQlleHRlcm5hbCByZWxvYyBudW1iZXJzLgotCSogZWxmMzItaTM4Ni5oOiBMaWtld2lzZS4KLQotMTk5OC0wNy0yMiAxNDo1NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1tMTAzMDAuYzogTGV0IEVMRiBoZWFkZXIgbm93IGRlZmluZSB0aGUgbWFjcm9zIHRvIGdldCB0aGUgZW51bS4KLQkqIGVsZjMyLW1pcHMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYzogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMjIgMTM6NTM6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluMi5oOiBDaGFuZ2UgdHlwZSBvZiAnY2xhc3MnIHBhcmFtZXRlciB0byAndW5zaWduZWQgaW50JyBpbgotCWJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MoKSwgaW4gb3JkZXIgdG8gYXZvaWQgSyZSIGNvbXBhdGFiaWxpdHkKLQlwcmJsZW1zLgotCSogYmZkLWluLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MpOiBDaGFuZ2UgdHlwZSBvZiAnY2xhc3MnCi0JcGFyYW1ldGVyIHRvICd1bnNpZ25lZCBpbnQnIHRvIGF2b2lkIEsmUiBjb21wYXRhYmlsaXR5IHByb2JsZW1zLgotCi1XZWQgSnVsIDIyIDE2OjQzOjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2hhbmdlIGZpbGVuYW1lX3B0ciBhbmQKLQlmdW5jdGlvbm5hbWVfcHRyIHRvIGJlIGNvbnN0LiAgQ2hhbmdlIGxpbmVfcHRyIHRvIGJlIHVuc2lnbmVkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bik6IFNpbXBsaWZ5IGhhbmRsaW5nIHdoZW4KLQltYWNybyBpcyBub3QgZGVmaW5lZC4gIENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIGZyb20gYmZkX2xpbmtfaW5mbwotCXRvIGNvZmZfZmluYWxfbGlua19pbmZvLiAgQWRkIHByb3RvdHlwZS4KLQkoY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBTaW1wbGlmeSBoYW5kbGluZyB3aGVuIG1hY3JvIGlzIG5vdAotCWRlZmluZWQuICBBZGQgcHJvdG90eXBlLgotCi0xOTk4LTA3LTIyIDEzOjA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLW1uMTAzMDAuYzogQmVmb3JlIGluY2x1ZGUgc3lzdGVtIHNwZWNpZmljIEVMRiBoZWFkZXIgZGVmaW5lCi0JU1RBUlRfUkVMT0NfTlVNQkVSUywgUkVMT0NfTlVNQkVSLCBhbmQgRU5EX1JFTE9DX05VTUJFUlMuCi0JKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmM6IExpa2V3aXNlLgotCi1XZWQgSnVsIDIyIDEzOjQ2OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3JlbG9jX3R5cGUpOiBDb3B5IFVscmljaCdzIGVsZjMyLW1pcHMuYwotCXRlbXBvcmFyeSBwYXRjaCBvdmVyIHRvIGVsZjY0LW1pcHMuYyBhcyB3ZWxsLgotCi0xOTk4LTA3LTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChyZWxvY190eXBlKTogVGVtcG9yYXJpbHkgZGlzYWJsZSBkZWZpbml0aW9uIG9mCi0Jc3RhbmRhcmQgcmVsb2NhdGlvbiBzaW5jZSB0aGV5IGFyZSBub3cgZGVmaW5lZCBpbiBlbGYvbWlwcy5oLgotCi1UdWUgSnVsIDIxIDA5OjQ3OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYtbTEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOgotCU1vZGlmeSByYW5nZSB0ZXN0IGZvciBjYXNlIFJfTU4xMDIwMF84LgotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOgotCU1vZGlmeSByYW5nZSB0ZXN0IGZvciBjYXNlIFJfTU4xMDMwMF84LgotCi1Nb24gSnVsIDIwIDE4OjUwOjU0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZ290XyAmIHBsdF9oZWFkZXJfc2l6ZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKiBlbGYzMi1tNjhrLmMsIGVsZjMyLW1pcHMuYywgZWxmMzItcHBjLmM6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYywgZWxmNjQtYWxwaGEuYywgZWxmNjQtc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBlbGZ4eC10YXJnZXQuaDogUHJvdmlkZSBhIGRlZmF1bHQgb2YgemVyby4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogVXNlIGdvdF9oZWFkZXJfc2l6ZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCByZW1vdmUgYSBQTFQKLQllbnRyeSBmcm9tIGFuIGV4ZWN1dGFibGUsIGV2ZW4gaWYgdGhlIHBsdCByZWZjb3VudCBnb2VzIHRvIDAuCi0KLU1vbiBKdWwgMjAgMTI6NDc6MjYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBBbHNvIHJlbWVtYmVyIHRoZQotCWRpcmVjdG9yeSBuYW1lIGF0IHRoZSBsaW5lIG51bWJlci4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWxzbyBjb25zaWRlciBzeW1ib2xzCi0Jd2l0aCBhbiB1bnNwZWNpZmllZCB0eXBlLgotCi1XZWQgSnVsIDE1IDExOjIwOjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYzogQWRkIHVuZGVmIG9mIHZhbGlkIHRvIGF2b2lkIHByb2JsZW0gb24gU3VuT1MuCi0KLVR1ZSBKdWwgMTQgMTU6MzA6NTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaT84Ni1wYy1iZW9ze3BlLGVsZix9Kik6IFJlY29nbml6ZS4KLQotVHVlIEp1bCAxNCAxMToyMjoyMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MpOiBBbHNvIHJlZmVyZW5jZSBjb3VudAotCVJfNjhLX1BDeHggYW5kIFJfNjhLX3h4IHJlbG9jYXRpb25zLiAgTWFrZSBzdXJlIHRoYXQKLQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBpcyBhbHdheXMgc2V0IGZvciBhIFBMVCByZWxvYyByZWZlcmVuY2UuCi0JKGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiBBbHNvIHJlZmVyZW5jZSBjb3VudCBSXzY4S19QQ3h4IGFuZAotCVJfNjhLX3h4IHJlbG9jYXRpb25zLgotCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXNldCB0aGUgcGx0IG9mZnNldCBvZiBhIHN5bWJvbAotCXRoYXQgaGFzIG5vIHBsdCBlbnRyeS4KLQkoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IElnbm9yZSB0aGUgcGx0IG9mZnNldCBpbiBhIHN0YXRpYwotCWxpbmsuCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXNldCB0aGUgcGx0IG9mZnNldCBmb3IKLQlhbiBpZ25vcmVkIHN5bWJvbC4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IFNldCB0aGUgZ290IG9mZnNldHMgYWxzbyBpbgotCWEgc3RhdGljIGxpbmsuCi0KLQkqIGVsZjMyLW02OGsuYyAoUl82OEtfR05VX1ZUSU5IRVJJVCwgUl82OEtfR05VX1ZURU5UUlkpOiBOZXcgcmVsb2MKLQl0eXBlcy4KLQkoaG93dG9fdGFibGUsIHJlbG9jX21hcCk6IEFkZCBlbnRyaWVzIGZvciB0aGVtLgotCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBIYW5kbGUgdGhlbS4gIEltcGxlbWVudCByZWZlcmVuY2UKLQljb3VudGluZyBmb3IgZ290IGFuZCBwbHQgZW50cmllcy4KLQkoZWxmX202OGtfZ2NfbWFya19ob29rLCBlbGZfbTY4a19nY19zd2VlcF9ob29rKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSGFuZGxlIHVucmVmZXJlbmNlZCBwbHQKLQlzeW1ib2xzLgotCShydHlwZV90b19ob3d0b19yZWwsIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCk6IERlbGV0ZS4KLQkoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSB0aGUgbmV3IHJlbG9jIHR5cGVzLgotCShiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmssIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vaywKLQllbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLCBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gY3JlYXRpbmcgYW4KLQlpbmRpcmVjdCByZWZlcmVuY2UgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nIGFsc28gY29weSB0aGUgcGx0Ci0Jb2Zmc2V0LgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IFdoZW4gY2xlYXJpbmcgdGhlIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUCi0JZmxhZyBhbHNvIHJlc2V0IHRoZSBwbHQgb2Zmc2V0LgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBMaWtld2lzZS4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEluY3JlbWVudCB0aGUgZ290IG9mZnNldCBieQotCXRoZSBzaXplIG9mIHRoZSBlbnRyeSBpbiBieXRlcy4KLQkoZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzKTogTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMTQgMTE6MTg6MTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19zZWN0aW9ucyk6IFJldHVybiB0cnVlIHJhdGhlciB0aGFuIGZhbGxpbmcgb2ZmCi0JdGhlIGJvdHRvbS4KLQotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogQ2FsbCBiZmRfYWxsb2MsIG5vdAotCXhtYWxsb2MuCi0KLU1vbiBKdWwgMTMgMTE6MDY6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogU3VwcmVzcyBkZWZpbml0aW9uIG9mIFRBUkdFVF9VTkRFUlNDT1JFIGFuZCBhZGQgYQotCWNvbW1lbnQgZGVzY3JpYmluZyB3aGVuIGl0IHNob3VsZCBiZSBlbmFibGVkLgotCUNoYW5nZWQgZGVmaW5pdGlvbiBvZiBVU0VSX0xBQkVMX1BSRUZJWCB0byAiIiwgdG8gZmFsbCBpbnRvIGxpbmUKLQl3aXRoIEdDQyBzb3VyY2VzLgotCi1Nb24gSnVsIDEzIDEzOjA2OjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBIYW5kbGUgY2FsbCBvcHRpbWl6YXRpb24KLQlpbmZvcm1hdGlvbiBBVE4gcmVjb3Jkcy4KLQotRnJpIEp1bCAxMCAxNjozMTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogU2VsZWN0IGFuIGFwcHJvcHJpYXRlCi0Jc2VjdGlvbiBmb3IgYW4gYWJzb2x1dGUgc3ltYm9sIGluIGEgZnVsbHkgbGlua2VkIGZpbGUuICBCYXNlZCBvbgotCXBhdGNoIGZyb20gQ2hyaXN0aWFuIEhvbGxhbmQgPENIb2xsYW5kQGRlLmx1Y2VudC5jb20+LgotCi1XZWQgSnVsICA4IDExOjI5OjU2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29mZi1tODhrLmMgKG04OGtfc3BlY2lhbF9yZWxvYyk6IERvbid0IGxvc2UgdGhlIGluZm9ybWF0aW9uCi0JdGhhdCBhIHN5bWJvbCBpcyB1bmRlZmluZWQuCi0KLVR1ZSBKdWwgIDcgMjE6NDc6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2JmZF9nY19zZWN0aW9ucyk6IERlZmluZS4KLQotTW9uIEp1bCAgNiAxMTozNTo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IERvIG5vdCBjb21wbGFpbiBhYm91dAotCW92ZXJmbG93cyBpbiBBUk1fMjZEIHBhdGNoZXMsIHNpbmNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4KLQlpbXBsbWVudGVkLiAgUGF0Y2ggc3VibWl0dGVkIGJ5IERyLiBSLkouIEJsYWNrIDxyamJAZGNzLmdsYS5hYy51az4KLQotU2F0IEp1bCAgNCAxMjoyNTozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgd2UgaGF2ZSBhbnkgbG9uZwotCXNlY3Rpb24gbmFtZXMsIGNhbGwgY29mZl93cml0ZV9zeW1ib2xzIGV2ZW4gaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scy4KLQotRnJpIEp1bCAgMyAxMzoxMTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBPbmx5IHNldCBwaGRyX2luY2x1ZGVkIG9uY2UgZm9yIGEKLQlQVF9MT0FEIHNlZ21lbnQsIHJhdGhlciB0aGFuIG9ubHkgc2V0dGluZyBpdCBvbmNlIGZvciB0aGUgZW50aXJlCi0JZmlsZS4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBXaGVuIHNldHRpbmcgdGhlIExNQSwKLQlyYXRoZXIgdGhhbiBpZ25vcmluZyBldmVyeSBwaGRyIHdpdGggYSBwX3BhZGRyIG9mIDAsIGlnbm9yZSBhbGwKLQl0aGUgcGhkcnMgaWYgdGhleSBhbGwgaGF2ZSBhIHBfcGFkZHIgb2YgMC4KLQotCSogc3RhYnMuYyAoX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MpOiBDaGVjayB3aGV0aGVyIHRoZSAuc3RhYnN0cgotCXNlY3Rpb24gd2FzIGRpc2NhcmRlZCBmcm9tIHRoZSBsaW5rLgotCi1GcmkgSnVsICAzIDE0OjM5OjA1IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi1zaC5jIChzaF9pbnNuX3VzZXNfZnJlZyk6IElnbm9yZSBsb3dlc3QgYml0IG9mIHJlZ2lzdGVyIG51bWJlci4KLQotRnJpIEp1bCAgMyAxNDozNTo0OCAxOTk4ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYtc2guYyAoc2hfaW5zbnNfY29uZmxpY3QpOiBMb2FkIG9mIGZwc2NyIGNvbmZsaWN0cyB3aXRoCi0JZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucy4KLQotVGh1IEp1bCAgMiAxODozNzoyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFNraXAgdW5kZWZpbmVkIGdsb2JhbAotCWZ1bmN0aW9uIHN5bWJvbHMuCi0KLVRodSBKdWwgIDIgMTQ6NTk6NDIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLQlNZXJnZSBvZiB2YXgvdm1zIChyZWFkLW9ubHkpIHN1cHBvcnQKLQkqIGNvbmZpZ3VyZS5jb206IFN1cHBvcnQgVmF4IHRhcmdldC4KLQkqIG1ha2VmaWxlLnZtczogU3VwcG9ydCBWYXggdGFyZ2V0LgotCSogdm1zLmg6IFJlbmFtZWQgZnJvbSBldmF4LmgsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpIHN1cHBvcnQuCi0JKiB2bXMuYzogUmVuYW1lZCBmcm9tIGV2YXgtYWxwaGEuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLWhkci5jOiBSZW5hbWVkIGZyb20gZXZheC1lbWguYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLWdzZC5jOiBSZW5hbWVkIGZyb20gZXZheC1lZ3NkLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy10aXIuYzogUmVuYW1lZCBmcm9tIGV2YXgtZXRpci5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiB2bXMtbWlzYy5jOiBSZW5hbWVkIGZyb20gZXZheC1taXNjLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIGxpYmJmZC5jIChyZWFsX3JlYWQpOiBVc2UgdW5idWZmZXJlZCByZWFkIG9uIFZNUy9WYXguCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyKTogTmV3IGZsYXZvdXIuCi0JKHZtc19hbHBoYV92ZWMpOiBSZW5hbWVkIGZyb20gZXZheF9hbHBoYV92ZWMuCi0JKHZtc192YXhfdmVjKTogTmV3LgotCSh0YXJnZXRfdmVjdG9yKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCSogY29uZmlnLmJmZCAoYWxwaGEqLSotKnZtcyopOiBVc2Ugdm1zX2FscGhhX3ZlYywgbm90Ci0JZXZheF9hbHBoYV92ZWMuCi0JKHZheCotKi0qdm1zKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIGZvciByZW5hbWVkIGZpbGVzLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCi1UaHUgSnVsICAyIDEzOjMxOjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gTWF0dCBTZW1lcnNreSA8bWF0dHNAc2NkLmhwLmNvbT46Ci0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBGb3JjZSBhIHRyYWlsaW5nIE5VTEwKLQlwb2ludGVyIG9uIGFiZmQtPm91dHN5bWJvbHMuCi0JKGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wpOiBIYW5kbGUgTlVMTCBzeW0gcGFyYW1ldGVyLgotCi1XZWQgSnVsICAxIDE3OjA1OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+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+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMqLSotKik6IFJlbW92ZSBQb3dlclBDIE5UIHN1cHBvcnQgZnJvbSBFTEYKLQlzeXN0ZW1zLgotCi1UdWUgQXByICA3IDE2OjI1OjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAoY29tcF91bml0KTogTW92ZSBpdCBlYXJsaWVyIGluIHRoZSBzb3VyY2UuIEFkZAotCWFkZHJfc2l6ZS4KLQkocmVhZF9hZGRyZXNzKTogUmVwbGFjZSAnYmRmKicgYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0JVXNlIGFkZHJfc2l6ZSBmb3IgYWRkcmVzcyBzaXplLCByYXRoZXIgdGhhbiBzaXplb2YoYmZkX3ZtYSkuCi0JKHJlYWRfYXR0cmlidXRlKTogUmVwbGFjZSBiZGYqIGFyZ3VtZW50IHdpdGggJ2NvbXBfdW5pdConIGFyZ3VtZW50LgotCUZpeCBjYWxsIHRvIHJlYWRfYWRkcmVzcy4KLQkoZGVjb2RlX2xpbmVfaW5mbyk6IFJlcGxhY2UgYmRmKiBhcmd1bWVudCB3aXRoICdjb21wX3VuaXQqJyBhcmd1bWVudC4KLQlTY3JhcCBvdGhlciB1bm5lZWRlZCBhcmd1bWVudHMuICBGaXggY2FsbCB0byByZWFkX2FkZHJlc3MuCi0JKHNjYW5fdW5pdF9mb3JfZnVuY3Rpb25zKTogRml4IGNhbGwgdG8gcmVhZF9hdHRyaWJ1dGUuCi0JKHBhcnNlX2NvbXBfdW5pdCk6IFdlIG5vdyBoYW5kbGUgbW9yZSB2YWx1ZXMgZm9yIGFkZHJfc2l6ZS4KLQlTZXQgYWRkcl9zaXplIGluIHVuaXQuICBGaXggY2FsbCB0byByZWFkX2F0dHJpYnV0ZSBhbmQKLQlkZWNvZGVfbGluZV9pbmZvLgotCi1UdWUgQXByICA3IDE1OjQ0OjQ3IDE5OTggIEdhdmluIFJvbWlnLUtvY2ggPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5jIChwYXJzZV9jb21wX3VuaXQpOiBEcm9wIHVzZSBvZiB1bml0LT5uYW1lIHdoZW4gaXQgaXMgbnVsbC4KLQotVHVlIEFwciAgNyAxMjozNToxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBBZGQgbTY4ayBjYXNlcyBiYWNrIHRvIGRlZmF1bHQKLQlzd2l0Y2gsIHJldmVydGluZyBwYXRjaCBvZiBNYXJjaCAyNSwgc2luY2UgSUVFRSBzdXBwb3J0IGRlcGVuZHMKLQl1cG9uIHRoZW0uCi0KLU1vbiBBcHIgIDYgMTQ6MDY6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TdW4gQXByICA1IDE2OjIxOjQ0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogRml4IGNvbXB1dGF0aW9uIG9mCi0Jc29tX29mZnNldCB3aGVuIHdlIGhhdmUgYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotU3VuIEFwciAgNSAxNjowNDozOSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChzdGFtcC1saWIpOiBDaGVjayB0aGF0IC5saWJzL2xpYmJmZC5hIGV4aXN0cyBiZWZvcmUKLQl0cnlpbmcgdG8gY29weSBpdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXByICAzIDExOjA5OjQyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEdlbmVyYXRlIHNlY3Rpb24KLQlzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmluZHgpOiBOZXcgZnVuY3Rpb24sIHVzZWQgYnkgYWJvdmUgY29kZS4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBJbml0aWFsaXplIHRoZSBzZWN0aW9uCi0Jc3ltYm9scy4KLQkoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IENoYW5nZSBhYm9ydCB0byBCRkRfQVNTRVJULgotCi1XZWQgQXByICAxIDE2OjA0OjAyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGluX3JlbG9jX3ApOiBVc2UgQVJNX1JWQTMyIGluIHBsYWNlIG9mIGNvbnN0YW50Ci0JdmFsdWUgMTEuCi0KLVdlZCBBcHIgIDEgMTM6MzY6NTggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbiwgY2FzZSBSXzY4S19QTFQqTyk6IEZpeAotCWFzc2VydGlvbi4KLQotVHVlIE1hciAzMSAwMDoxMjoxMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IENvcnJlY3RseSBoYW5kbGUKLQlhYnNvbHV0ZSBzeW1ib2xzLgotCi1Nb24gTWFyIDMwIDEyOjQ2OjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi1Nb24gTWFyIDMwIDEyOjIwOjUwIDE5OTggIEJyZW50IEJhY2NhbGEgIDxiYWNjYWxhQGZyZWVzb2Z0Lm9yZz4KLQotCSogc3ltcy5jIChFTkFCTEVfQ0FDSElORyk6IERlZmluZS4KLQkoc3RydWN0IGluZGV4ZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdGFiX2NhY2hlKTogUmVtb3ZlLgotCShjbXBpbmRleGVudHJ5KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogQWRkIG5ldyBmaWVsZHM6IGluZGV4dGFibGUsCi0JaW5kZXh0YWJsZXNpemUsIGNhY2hlZF9pbmRleGVudHJ5LCBjYWNoZWRfb2Zmc2V0LCBjYWNoZWRfc3RhYiwgYW5kCi0JY2FjaGVkX2ZpbGVfbmFtZS4gIFJlbW92ZSBmaWVsZHM6IGZpbGVfY2FjaGUsIGZ1bmN0aW9uX2NhY2hlLCBhbmQKLQlsaW5lX2NhY2hlLgotCShfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IFJld3JpdGUgdG8gYnVpbGQgYSBzb3J0ZWQKLQlpbmRleCB0YWJsZSBhbmQgc2VhcmNoIGl0LgotCi1Nb24gTWFyIDMwIDEwOjM5OjM0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDYWxsCi0JY29weV9wcml2YXRlX2JmZF9kYXRhIG9uY2Ugd2UndmUgc2VlbiB0aGUgbGFzdCBTRUNfQUxMT0Mgc2VjdGlvbi4KLQotCSogY3B1LW1pcHMuYzogUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGF0IGVuZCBvZiBlbnVtZXJhdGlvbiBsaXN0LgotCi1TYXQgTWFyIDI4IDE2OjMzOjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogRGVmaW5lIGFsbCBnbG9iYWxseSB2aXNpYmxlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zCi0Jb25seSB3aGVuIENPRkZfV0lUSF9QRSBpcyBub3QgZGVmaW5lZC4KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtcGVfbGl0dGxlX3ZlYywgYXJtcGVfYmlnX3ZlYyk6IEFkZAotCWNvZmYtYXJtLmxvLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDE2OjA2OjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIGFvdXQtYXJtLmMgKE1ZKGZpeF9wY3JlbF8yNikpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBMaWtld2lzZS4KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBMaWtld2lzZS4KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBMaWtld2lzZS4KLQkqIGJpbmFyeS5jIChtYW5nbGVfbmFtZSk6IExpa2V3aXNlCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX2ZpeF9wY3JlbF8yNik6IExpa2V3aXNlLgotCSogY29mZi1zaC5jIChzaF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXN0Z28zMi5jIChjcmVhdGVfZ28zMl9zdHViKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX2xpbmVfdGFibGUpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfYXJtYXApOiBMaWtld2lzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogTGlrZXdpc2UuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogcHBjYm9vdC5jIChwcGNib290X29iamVjdF9wKTogTGlrZXdpc2UuCi0JKG1hbmdsZV9uYW1lKTogTGlrZXdpc2UuCi0JKiByaXNjaXguYyAocmlzY2l4X2ZpeF9wY3JlbF8yNik6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBMaWtld2lzZS4KLQkqIHN0YWJzLmMgKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IExpa2V3aXNlLgotCSogYW91dC1uczMyay5jIChfYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzKTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4gIERlY2xhcmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogQWRkIGJyYWNlcyB0byBhdm9pZCBhbWJpZ3VvdXMgaWYKLQl3YXJuaW5nLgotCSogZWxmLmMgKGVsZl9zb3J0X3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbik6IEluaXRpYWxpemUgcmVsb2NhdGlvbi4KLQlBZGQgZGVmYXVsdCBjYXNlcyB0byBzd2l0Y2hlcy4KLQkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCUFsd2F5cyBzZXQgcnN0YXQuCi0JKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IENoYW5nZSBmbGFnIHZhcmlhYmxlIHRvIHR5cGUKLQlmbGFnd29yZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIHVzZV9sby4KLQkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCShkdW1wX3RvYyk6IENoYW5nZSBjYXQgdG8gY29uc3QsIGFuZCBpbml0aWFsaXplIGl0LgotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBJbml0aWFsaXplIHN0YXJ0IGFuZCB2b2ZmLgotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCShzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluaXRpYWxpemUgcl9zeW1uZHguCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE9ubHkgZGVjbGFyZQotCW9sZF9zb2ZhciBpZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWxpemUgY3N5bS4KLQkqIGNvZmZnZW4uYyAoY29mZl9wb2ludGVyaXplX2F1eCk6IE1ha2UgdHlwZSBhbmQgY2xhc3MgdW5zaWduZWQuCi0JKiBjcHUtbnMzMmsuYyAoX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50KTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4KLQkqIGR3YXJmMi5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShyZWFkXzJfc2lnbmVkX2J5dGVzLCByZWFkXzRfc2lnbmVkX2J5dGVzKTogQ29tbWVudCBvdXQuCi0JKGRlY29kZV9saW5lX2luZm8pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfc2RhMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IExpa2V3aXNlLgotCSh2ODUwX2VsZl9yZWxvYyk6IExpa2V3aXNlLgotCSogZWxmLWJmZC5oIChlbGZfbGlua2VyX3NlY3Rpb25fdCk6IE1ha2UgYWxpZ25tZW50IHVuc2lnbmVkLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE1ha2UgY3ZlcmRlZnMgYW5kIGN2ZXJyZWZzIHVuc2lnbmVkLgotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBBbHdheXMgc2V0IGFkanVzdC4KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogSW5pdGlhbGl6ZSB0bXBfYWRkci4gIEZ1bGx5Ci0JcGFyZW50aGVzaXplIGV4cHJlc3Npb24uCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBbHdheXMgaW5pdGlhbGl6ZSBoLgotCShtMzJyX2VsZl9vYmplY3RfcCk6IFJldHVybiBhIHZhbHVlLgotCShtMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlIGZwcmludGYgZm9ybWF0IHN0cmluZy4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IEluaXRpYWxpemUgbGFzdC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBJbml0aWFsaXplIGxhc3QgYW5kIGRpbmR4LgotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9vYmplY3RfcCk6IFJldHVybiBhIHZhbHVlLgotCSh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlIGZwcmludGYgZm9ybWF0IHN0cmluZy4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZSBzeW1jb3VudCBhbmQgaSB0bwotCXVuc2lnbmVkIGxvbmcuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENoYW5nZSB2ZXJudW0gdG8KLQl1bnNpZ25lZCBpbnQsIGFuZCBpbml0aWFsaXplIGl0LiAgQ2hhbmdlIGZwcmludGYgZm9ybWF0IHN0cmluZy4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDYXN0IC0xIHRvIGJmZF9zaXplX3R5cGUKLQl3aGVuIHNldHRpbmcgb3IgY29tcGFyaW5nIHRvIHNvbmFtZV9pbmR4LgotCShlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBDaGFuZ2UgbnVtX3N5bWJvbHMgdG8KLQl1bnNpZ25lZCBpbnQuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZGF0YV90eXBlKTogQ2hhbmdlIGZsYWdzIHRvIGZsYWd3b3JkLgotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IEluaXRpYWxpemUgaWR4LiAgQ2hhbmdlIGogdG8KLQliZmRfc2l6ZV90eXBlLiAgSW5pdGlhbGl6ZSBoaW50X21lbWJlci4gIFJlbW92ZSB1c2VsZXNzIHRlc3QgdG8KLQl0aW1lX3N0YW1wLgotCShwZV9wcmludF9lZGF0YSk6IENoYW5nZSBudW1fZnVuY3Rpb25zIGFuZCBudW1fbmFtZXMgaW4gc3RydWN0Ci0JRURUX3R5cGUgdG8gdW5zaWduZWQgbG9uZy4gIFJlbW92ZSBjYXN0LiAgQ2hhbmdlIGZwcmludGYgZm9ybWF0Ci0Jc3RyaW5nLgotCSogcHBjYm9vdC5jIChwcGNib290X29iamVjdF9wKTogQ2hhbmdlIGkgdG8gc2l6ZV90LgotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIHVuc2lnbmVkCi0JaW50LgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2Ugc2hyaW5rcyB0bwotCWludCAqLiAgVXBkYXRlIHVzZXMuICBDaGFuZ2UgaiB0byBsb25nLgotCSogYmZkLWluMi5oLCBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjcgMTA6MTA6NDYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIFJlbW92ZSBkZWZpbml0aW9uIG9mIFVTRV9SRUwuCi0JKHY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsYSk6IE5ldyBmdW5jdGlvbi4KLQkodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogIFJlbmFtZWQgZnJvbQotCXY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuLiAgUmVtb3ZlZCByZXBsYWNlIGFyZ3VtZW50LgotCSh2ODUwX2VsZl9yZWxvYyk6IHN0b3JlIHRoZSByZWxvY2F0aW9uIGluIHRoZSBhZGRlbmQgZmllbGQgaW5zdGVhZAotCW9mIHRoZSBpbnNuLgotCSh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIE5vdyBjYWxscwotCXY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBSZW1vdmUgY29kZSB0byBnZW5lcmF0ZSBSRUwKLQlyZWxvY2F0aW9ucy4KLQotVGh1IE1hciAyNiAxMzozMjoxNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCB0aGUgdHlwZSBhbmQgc3RvcmFnZQotCWNsYXNzIGluIHRoZSBuYXRpdmUgc3ltYm9sIGluZm9ybWF0aW9uIGFsbG9jYXRlZCBmb3IgYSBuZXcgc2VjdGlvbgotCXN5bWJvbC4KLQotVGh1IE1hciAyNiAxMDoxMzo0MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmg6IENoYWluIHRvZ2V0aGVyIGNhbGxzIHRvCi0JY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIGFuZAotCWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQkqIGNvZmYtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvcgotCWNvZmZfYXJtX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIGFuZAotCWNvZmZfYXJtX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0KLVdlZCBNYXIgMjUgMTU6NDU6NTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogU2V0IHByaXZhdGUgZmFsZ3MgZXZlbiBmb3IgYSBQRQotCWJ1aWxkLgotCi0JKiBwZWljb2RlLmg6IENhbGwgYXJtLWNvZmYgcHJpdmF0ZSBkYXRhIGZ1bmN0aW9ucyBhZnRlciBoYW5kbGluZwotCXBlIHByaXZhdGUgZGF0YS4KLQotCSogY29mZi1hcm0uYzogVHVybiBzdGF0aWNzIGludG8gZ2xvYmFscyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNoYXJlZAotCWJvdGggcGUgYW5kIHBlaSBiYWNrZW5kcy4KLQotV2VkIE1hciAyNSAxNToxOTozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChzdW5vc19zZXRfYXJjaF9tYWNoKTogVXNlIGJmZF9tYWNoX202OCogcmF0aGVyIHRoYW4KLQlwbGFpbiBudW1iZXJzLgotCShzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDI1IDEzOjU5OjI0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9tNjgqKTogQWRkIGRlZmluaXRpb25zIGZvciB2YXJpb3VzIG02OGsKLQl2YXJpYW50cy4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IFJlbW92ZSBtNjhrIHNwZWNpYWwgY2FzZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBtaXBzYnNkLmMgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBVc2UgYmZkX21hY2hfbTY4KiByYXRoZXIKLQl0aGFuIHBsYWluIG51bWJlcnMuCi0JKiBzcGFyY2x5bnguYyAoTkFNRShseW54LHNldF9hcmNoX21hY2gpKTogTGlrZXdpc2UuCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogTGlrZXdpc2UuICBBZGQgZW50cnkgZm9yCi0JbTY4azo2ODAwMC4KLQkoYmZkX202OGtfYXJjaCk6IFNldCBtYWNoIGZpZWxkIHRvIHplcm8gdG8gc2lnbmFsIG5vIGV4cGxpY2l0Ci0Jc2VsZWN0aW9uLCBjaGFuZ2UgcHJpbnRhYmxlX25hbWUgdG8ganVzdCAibTY4ayIgYW5kIG1ha2UgdGhhdCB0aGUKLQlkZWZhdWx0IGluc3RlYWQgb2YgbTY4azo2ODAyMC4KLQotCSogYW91dC10aWMzMC5jIChOQU1FKTogRGVmaW5lIHRoaXMgdG8gYXZvaWQgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLQlmcm9tIGFvdXR4LmguCi0JKE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lIGFzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQlyYXRoZXIgdGhhbiBOQU1FKGFvdXQsZ2V0X3NlY3Rpb25fY29udGVudHMpLgotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEZpeCBjYXN0LgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfc2V0X2FyY2hfbWFjaCk6IE9ubHkgYWNjZXB0IGJmZF9hcmNoX2FscGhhCi0JYW5kIGNhbGwgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCB0byBkbyB0aGUgcmVhbCB3b3JrLgotCi1XZWQgTWFyIDI1IDEwOjQxOjM1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoQkFMWCk6IEluY2x1ZGUgcmV0dXJuIHJlZ2lzdGVyIGcxNCBhcyBwYXJ0IG9mIHRoZSBpbnNuLgotCShCQUxYX01BU0spOiBOZXcuCi0JKGNhbGxqeF9jYWxsYmFjayk6IFVzZSBpdC4KLQotV2VkIE1hciAyNSAxMToxOToyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChCRkRfQUxJR04pOiBDYXN0IHRoaXMgcGFyYW1ldGVyIHRvIGJmZF92bWEuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5KTogQ2hhbmdlCi0JYnl0ZV9jb3VudCB0byB1bnNpZ25lZCBpbnQuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBJbml0aWFsaXplIGludGVybmFsX3JlbG9jcy4gIFJlbW92ZQotCXVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9jbG9zZV9hbmRfY2xlYW51cCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwKLQl2YXJpYWJsZXMgZXIgYW5kIGVyMS4KLQotCSogY3B1LXY4NTAuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKHNjYW4pOiBDYXNlIGlzZGlnaXQgYXJndW1lbnQgdG8gdW5zaWduZWQgY2hhci4KLQotCUZyb20gWWFuIE1lcm90aCA8WUFOLk1FUk9USEBzdC5jb20+OgotCSogaWhleC5jIChpaGV4X3NjYW4pOiBBZGQgZXh0YmFzZSB2YXJpYWJsZSBzbyB0aGF0IGdldHRpbmcgYW4KLSAJZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGRvZXMgbm90IGlnbm9yZSBhbnkgcHJldmlvdXMKLSAJZXh0ZW5kZWQgYWRkcmVzcy4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBXaGVuIHdyaXRpbmcgb3V0IGFuIGV4dGVuZGVkIGxpbmVhcgotIAlhZGRyZXNzIHJlY29yZCwgemVybyBvdXQgYW55IHByZXZpb3VzIGV4dGVuZGVkIGFkZHJlc3MuCi0KLVR1ZSBNYXIgMjQgMTY6MDk6NDMgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBpZWVlLmMgKGRvX29uZSk6IENoZWNrIHNlY3Rpb24gYmVmb3JlIGRlcmVmZXJlbmNpbmcgaXQuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2Ugd2l0aCBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ci4KLQkoaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBMaWtld2lzZSB3aXRoIGFiZmQtPm15X2FyY2hpdmUuCi0KLU1vbiBNYXIgMjMgMTg6NTE6NDcgMTk5OCAgSm9lbCBTaGVycmlsbCAgPGpvZWxAT0FSY29ycC5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IChzaCotKi1ydGVtcyopOiBTd2l0Y2hlZCBmcm9tIEVMRiB0byBDT0ZGLgotCi1Nb24gTWFyIDIzIDE0OjIzOjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IEFkZCBpbnRlcndvcmtpbmcgZnVuY3Rpb25zIHRvIHBlIGJhY2tlbmRzLgotCi1GcmkgTWFyIDIwIDE4OjQ3OjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQU1fRElTQUJMRV9TSEFSRUQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotRnJpIE1hciAyMCAxMToyNTo0MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQmV0dGVyIGVycm9yIG1lc3NhZ2VzCi0Jd2hlbiBpbnRlcm93cmtpbmcgY29uZmx1Y3RzIG9jY3VyLiAgQ291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uCi0JYW5kIFRvbnkgVGhvbXBzb24uCi0JKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogRml4ZWQgYml0c2l6ZSBmaWVsZHMgb2YgcmlnaHRzaGlmdGVkCi0JcmVsb2NhdGlvbnMuICBQYXRjaCBjb3VydGVzeSBvZiBKb25hdGhhbiBXYWx0b24gYW5kIFRvbnkKLQlUaG9tcHNvbi4KLQotRnJpIE1hciAyMCAwMjoyNjo0MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXZlcnQKLQlwYXJ0IG9mIEZlYiAyMiBjaGFuZ2UgY29udHJvbGluZyB3aGVuIHRvIG92ZXJyaWRlIHRoZSBleGlzdGluZwotCXN5bWJvbCB3aXRoIHRoZSAucGx0IGVudHJ5LgotCi1XZWQgTWFyIDE4IDA5OjI2OjI1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogQWRkIHRodW1iLXBlIHRhcmdldC4KLQotCSogY29mZmNvZGUuaCAoT1RIRVJfR0xPQkFMX0NMQVNTKTogU3VwcG9ydCB0aHVtYiBleHRlcm5hbAotCWZ1bmN0aW9ucyBpbiBQRSBidWlsZC4KLQotU3VuIE1hciAgOCAyMzozNzoyNiAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChzcGFyY2xpdGUtKi1lbGYqKTogQWRkZWQuCi0KLU1vbiBGZWIgMjMgMTk6MzE6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBlbGYubG8gdG8gZWxmIHNoZWxsIHZhcmlhYmxlLgotCSogTWFrZWZpbGUuYW0gKEJGRF9MSUJTKTogUmVtb3ZlIGVsZi5sby4KLQkoQkZEX0xJQlNfQ0ZJTEVTKTogUmVtb3ZlIGVsZi5jLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYuYy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTgtMDItMjMgMTU6NTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEEgcGMtcmVsYXRpdmUKLQlyZWxvY2F0aW9uIGFnYWluc3QgYSBub3ctbG9jYWwgc3ltYm9sIHNob3VsZCBub3QgaGF2ZSBhIGR5bmFtaWMKLQlyZWxvY2F0aW9uLgotCi1Nb24gRmViIDIzIDE2OjE3OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IERvbid0IHNldCBCRkQgZmxhZyBIQVNfU1lNUyBpbgotCUNPRkYgZmlsZWhkciBmbGFncy4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFByaW50IFBFIGZsYWdzLiAgRnJvbSBNaWtleQotCTxqZWZmZGJAbmV0em9uZS5jb20+LgotCi1TdW4gRmViIDIyIDIwOjM5OjAwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IGNyZWF0ZQotIAlhIHBsdCBlbnRyeSB3aGVuIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB3ZSBhdXRob3JpdGF0aXZlbHkgZGVmaW5lCi0gCXRoZSBzeW1ib2wuCi0KLVN1biBGZWIgMjIgMjA6MzM6MDUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChDT1JFRklMRSBzZWxlY3Rpb24pOiBSZW1vdmUgc3BhcmMtKi1saW51eCouICBUaGV5Ci0JZG9uJ3QgYWN0dWFsbHkgdXNlIHRyYWQtY29yZSwgYnV0IGEgU3VuT1Mtc3R5bGUgY29yZSBmaWxlIGhhbmRsZWQKLQlieSBnZGIgZGlyZWN0bHkuCi0JKiBob3N0cy9zcGFyY2xpbnV4Lmg6IFJlbW92ZS4KLQotV2VkIEZlYiAxOCAxNTozMTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBJZiB0aGVyZSBpcyBubyAuaWRhdGEgc2VjdGlvbiwgbG9vawotCWZvciB0aGUgaW1wb3J0IHRhYmxlcyBpbiBzb21lIG90aGVyIHNlY3Rpb24uICBNYWtlIHRoZSBpbml0aWFsCi0JbGFiZWwgbGluZSB1cCBiZXR0ZXIgd2l0aCB0aGUgZGF0YS4gIFByaW50IHRoZSBpbXBvcnQgYWRkcmVzcwotCXRhYmxlIGV2ZW4gaWYgdGhlcmUgaXMgbm8gaW1wb3J0IG5hbWUgdGFibGUuICBJZiB0aGUgaW1wb3J0Ci0JYWRkcmVzcyB0YWJsZSBob2xkcyBhY3R1YWwgYWRkcmVzc2VzLCBwcmludCB0aGVtLgotCi1UdWUgRmViIDE3IDEyOjU4OjM0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogSWYgZnNlZWsgZmFpbHMsIHNhdmUgZXJybm8gYXJvdW5kIGNhbGwgdG8KLQliZmRfdGVsbC4gIElmIGVycm5vIGlzIEVJTlZBTCwgc2V0IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwgbm90Ci0JYmZkX2Vycm9yX3N5c3RlbV9jYWxsLgotCi1GcmkgRmViIDEzIDEzOjExOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKGxpYmJmZF9sYV9MREZMQUdTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBGZWIgMTIgMTc6MzE6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBuZXRic2QuaCAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0JKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBVc2UgREVGQVVMVF9BUkNIIGFuZCBERUZBVUxUX01JRCB3aGVuCi0JY2FsbGluZyBOX1NFVF9NQUNIVFlQRSwgcmF0aGVyIHRoYW4gaGF2aW5nIGEgc3dpdGNoLgotCSogbGliYW91dC5oIChlbnVtIG1hY2hpbmVfdHlwZSk6IEFkZCBNX1BNQVhfTkVUQlNELCBNX1ZBWF9ORVRCU0QsCi0JYW5kIE1fQUxQSEFfTkVUQlNELgotCSogaTM4Nm5ldGJzZC5jIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0JKiBtNjhrNGtuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCShNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0JKiBtNjhrbmV0YnNkLmM6IChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0JKiBuczMya25ldGJzZC5jIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0JKiBzcGFyY25ldGJzZC5jIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0KLQlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIHZheG5ldGJzZC5jOiBOZXcgZmlsZS4KLQkqIG5ldGJzZC1jb3JlLmM6IENsZWFuIHVwLiAgUmVtb3ZlIHVudXNlZCBtYWNyb3MuICBVc2UgbmV0YnNkCi0JcmF0aGVyIHRoYW4gbmV0YnNkX2NvcmUuCi0JKiB0YXJnZXRzLmMgKHZheG5ldGJzZF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCB2YXhuZXRic2RfdmVjLiAgSWYgTkVUQlNEX0NPUkUgaXMKLQlkZWZpbmVkLCBhZGQgbmV0YnNkX2NvcmVfdmVjLgotCSogY29uZmlndXJlLmluOiBTZXQgQ09SRUZJTEUgZm9yIGFscGhhKi0qLW5ldGJzZCogYW5kCi0JcG93ZXJwYy0qLW5ldGJzZCogdG8gbmV0YnNkLWNvcmUubG8uICBJZiBDT1JFRklMRSBpcwotCW5ldGJzZC1jb3JlLmxvLCBzZXQgQ09SRUZMQUcgdG8gLURORVRCU0RfQ09SRS4KLQkqIGNvbmZpZy5iZmQgKGFscGhhKi0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgdmF4bmV0YnNkLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgdmF4bmV0YnNkLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVtb3ZlIHRoZSBvbGQgc2hhcmVkIGxpYnJhcnkgYnVpbGQgc3R1ZmYuICBXZQotCW5vdyB1c2UgbGlidG9vbCBpbnN0ZWFkLgotCi1XZWQgRmViIDExIDE3OjEzOjA5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRla2hleC5jICh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCB0ZWtoZXhfaW5pdC4KLQotVHVlIEZlYiAxMCAxOToyMzoyOCAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVGFrZSBzdGFiLXN5bXMubG8gb3V0IG9mIHNwYXJjbGludXhfdmVjIGxpc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBGZWIgMTAgMTU6MTY6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQkqIGVsZjMyLXY4NTAuYyAocmVtZW1iZXJfaGkxNnNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBVc2UgdGhlIGFib3ZlIG5ldyBmdW5jdGlvbnMgdG8KLQltYXRjaCB1cCBISTZTIHJlbG9jcyB3aXRoIExPMTYgcmVsb2NzLgotCi1UdWUgRmViIDEwIDE1OjAxOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLWxpbnV4KiB0byAtbGludXgtZ251Ki4KLQkqIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0OiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEZlYiAgOSAxOTo0MDo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogRml4IGFub3RoZXIKLQlMTzE2L0hJMTZTIGJ1ZyBhbmQgaW1wcm92ZSBjb21tZW50cyBhYm91dCB3aGF0IGlzIGdvaW5nIG9uLgotCi1TYXQgRmViICA3IDE1OjI3OjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBGZWIgIDYgMTQ6NDg6MjAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG8gbm90IGNvbXBsYWluCi0Jd2hlbiBtZXJnaW5nIHY4NTAgY29kZSBpbnRvIHY4NTBlL3Y4NTBlYSBjb2RlLiAgRG8gbm90IGluaXRpYWxpc2UKLQlvdXRwdXQgZmxhZ3MgaWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZS4KLQotRnJpIEZlYiAgNiAxMTo1MDoyMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1pcHMuYyAoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEZvciBCRkRfUkVMT0NfQ1RPUgotCWdldCB0aGUgc2l6ZSBmcm9tIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgaW5zdGVhZCBvZiBkaXJlY3RseQotCWZyb20gdGhlIGlzYS4KLQotVGh1IEZlYiAgNSAxNDoyMTozNCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKEJGRF9BTElHTik6IElmIHJvdW5kaW5nIHVwIHdvdWxkIGNhdXNlIHRoZSBhZGRyZXNzCi0JdG8gd3JhcCwganVzdCByZXR1cm4gYWxsIDEncyBiaXRzIGluc3RlYWQuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAgNSAxMTo1MTowNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24KLQlpZiBDT0ZGX1dJVEhfUEUuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IElmIENPRkZfV0lUSF9QRSwgZGVmaW5lIGFzCi0JY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwKLQlza2lwIGVtcHR5IHNlY3Rpb25zLCB0byBtYXRjaCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cy4KLQotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCk6IFN3YXAgb3V0IHJfYWRkZW5kLAotIAlyYXRoZXIgdGhhbiBzd2FwcGluZyBvdXQgcl9vZmZzZXQgdHdpY2UuICBGcm9tIEx1a2UgRGVsbGVyCi0gCTxsdWtlZEBjc2UudW5zdy5lZHUuYXU+LgotCi1XZWQgRmViICA0IDE5OjExOjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbGlidG9vbF9lbmFibGVfc2hhcmVkIHJhdGhlciB0aGFuCi0JbGlidG9vbF9zaGFyZWQuICBSZW1vdmUgZGl2ZXJzaW9uIGhhY2suCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQKLQl3aXRoIG5ldyBsaWJ0b29sLgotCi1XZWQgRmViICA0IDE2OjEwOjIxIDE5OTggIEJyZW50IEJhY2NhbGEgIDxiYWNjYWxhQGZyZWVzb2Z0Lm9yZz4KLQotCSogc3ltcy5jIChzdHJ1Y3Qgc3RhYl9jYWNoZSk6IERlZmluZS4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogUmVtb3ZlIGNhY2hlZF9vZmZzZXQsIGNhY2hlZF9zdGFiLAotCWNhY2hlZF9zdHIsIGFuZCBjYWNoZWRfc3Ryb2ZmIGZpZWxkcy4gIEFkZCBmaWxlX2NhY2hlLAotCWZ1bmN0aW9uX2NhY2hlLCBhbmQgbGluZV9jYWNoZSBmaWVsZHMuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogVXNlIGV4dGVuc2l2ZSBjYWNoaW5nIHRvCi0Jc3BlZWQgdXAgc2VhcmNoZXMuCi0KLVdlZCBGZWIgIDQgMTM6MzQ6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogQ2hlY2sgZm9yIGltcG9ydCBvZiBvcmRpbmFsIHJhdGhlcgotCXRoYW4gbmFtZS4KLQkocGVfcHJpbnRfZWRhdGEpOiBJZiB0aGVyZSBpcyBubyAuZWRhdGEgc2VjdGlvbiwgbG9vayBmb3IgdGhlCi0JZXhwb3J0IGRhdGEgaW4gc29tZSBvdGhlciBzZWN0aW9uLgotCi1Nb24gRmViICAyIDIwOjA1OjQyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIHRvIDIuOC40LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIEZlYiAgMiAxNzozOTozOSAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JQWRkIHRtczMyMGMzMCBzdXBwb3J0OgotCSogY3B1LXRpYzMwLmM6IE5ldyBmaWxlLgotCSogYW91dC10aWMzMC5jOiBOZXcgZmlsZS4KLQkqIGNvZmYtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaF90aWMzMCk6IERlZmluZS4KLQkoYmZkX3RpYzMwX2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfdGljMzBfYXJjaC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdGljMzBfYW91dF92ZWMgYW5kCi0JdGljMzBfY29mZl92ZWMuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfVElDMzBfTERQKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBZGQgdGljMzAgY2FzZS4KLQkoY29mZl9zZXRfZmxhZ3MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQgKHRpYzMwLSotKmFvdXQqLCB0aWMzMC0qLSpjb2ZmKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluICh0aWMzMF9hb3V0X3ZlYywgdGljMzBfY29mZl92ZWMpOiBOZXcgdmVjdG9ycy4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS10aWMzMC5sby4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtdGljMzAuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dC10aWMzMC5sbyBhbmQgY29mZi10aWMzMC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGFvdXQtdGljMzAuYyBhbmQgY29mZi10aWMzMC5jLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIEZlYiAgMiAxMjoyNToxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogQWxsb3cgSEkxNl9TIHJlbG9jCi0JdG8gbGFnIGJlaGluZCBMTzE2IHJlbG9jIGJ5IGEgY291cGxlIG9mIGluc3RydWN0aW9ucy4KLQotTW9uIEZlYiAgMiAxNDowOTo0NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICgkKHNyY2RpcikvYmZkLWluMi5oKTogQWRkIGR1bW15IGNvbW1hbmQgdG8gZm9yY2UKLQltYWtlIHRvIHJlZXhhbWluZSB0aGUgZmlsZSB0aW1lc3RhbXAuCi0JKCQoc3JjZGlyKS9saWJiZmQuaCwgJChzcmNkZGlyKS9saWJjb2ZmLmgpOiBMaWtld2lzZS4KLQotCSogZWxmNjQtYWxwaGEuYyAoRUxGX01BWFBBR0VTSVpFKTogQ2hhbmdlIHRvIDB4MTAwMDAgZnJvbQotCTB4MTAwMDAwLgotCi1GcmkgSmFuIDMwIDE5OjA3OjA3IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IHByb2NlZHVyZQotCXRvIGNyZWF0ZSAuZHluc2JzcyBhbmQgLnJlbGEuc2JzcyBzZWN0aW9ucy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBQdXQgc3BhY2UgZm9yIHNtYWxsIGRhdGEgdG8gYmUKLQljb3BpZWQgZnJvbSBkeW5hbWljIG9iamVjdHMgaW50byAuc2Jzcy4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTdHJpcCAucmVsYS5zYnNzIGlmIHdlIGRvbid0Ci0JdXNlIGl0LiAgQ29ycmVjdCB0eXBvIG9mIC5yZWxhLnNkYXRhMi4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBHZW5lcmF0ZSByZWxvYyB0byB3aGVyZSB3ZQotCXB1dCB0aGUgZGF0YSwgd2hpY2ggbWF5IG5vdyBiZSBpbiAuc2Jzcy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQSBTREFSRUwxNiByZWxvYyBjYW4gYmUgaW4gZHluc2Jzcy4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUgYXMKLQlwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBEb24ndCBlbWl0IFJfUFBDX1JFTCogcmVsb2NzCi0JYWdhaW5zdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8uCi0gCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBlbWl0IFJfUFBDX1JFTDMyIHJlbG9jcyBpbgotCXNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggcmVmZXIgdG8gbG9jYWwgc3ltYm9scy4gIE1ha2Ugc3VyZSB0aGF0IHRoZQotCXRlc3QgZm9yIGFsbG9jYXRpbmcgc3BhY2UgZm9yIGEgcmVsb2MgaW4gYSBzaGFyZWQgb2JqZWN0IGlzIHRoZQotCXNhbWUgYXMgdGhlIHRlc3QgZm9yIGVtaXR0aW5nIGEgcmVsb2MuCi0KLVRodSBKYW4gMjkgMTU6NTU6MzUgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl0tKi1taW5ndzMyKik6IE5ldyB0YXJnZXQuCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9CSU5BUllfT1BFTik6IENoZWNrIGZvciBtaW5ndzMyLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDI4IDEzOjQxOjI2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwKTogT25seSBjaGVjayB0aGUgc3RydGFiIGlmIHdlCi0JaGF2ZSBhIGJmZF9vYmplY3QuCi0KLVR1ZSBKYW4gMjcgMjE6NDM6NTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCVNwYXJjIHY5IEFCSSBjb21wbGlhbnQgUExUOgotCSogZWxmNjQtc3BhcmMuYyAoUExUX0hFQURFUl9TSVpFKTogVjkgQUJJIHVzZXMgNCBlbnRyaWVzLgotCShwbHRfdGVtcGxhdGVzLCBzcGFyYzY0X2VsZl9idWlsZF9wbHRfZW50cnkpOiBEZWxldGUuCi0JKExBUkdFX1BMVF9USFJFU0hPTEQpOiBOZXcgZGVmaW5lLgotCShHT1RfUkVTRVJWRURfRU5UUklFUyk6IFY5IEFCSSBvbmx5IHVzZXMgMS4KLQkoc3BhcmM2NF9lbGZfYnVpbGRfcGx0KTogTmV3IGZ1bmN0aW9uLgotCShzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0KTogTGlrZXdpc2UuCi0JKHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0KTogTGlrZXdpc2UuCi0JKHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENoYW5nZSBoLT5wbHRfb2Zmc2V0IHRvCi0JY29udGFpbiB0aGUgaW5kZXggZm9yIGNvbnZlbmllbmNlLiAgU2tpcCB0aGUgaW5pdGlhbCBlbnRyaWVzCi0JaW4gLnJlbGEucGx0LgotCShzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBaZXJvIHRoZSBhbGxvY2F0ZWQgY29udGVudHMKLQltZW1vcnkgZm9yIHRoZSBiZW5lZml0IG9mIC5yZWxhLnBsdC4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldC4KLQkoc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogS2lsbCB0ZW1wbGF0ZSBzdHVmZi4gIFVzZQotCXNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgJiBzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCBmb3IgcmVsb2MuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRFRfUExUR09UIHBvaW50cyB0byAucGx0LgotCUNhbGwgc3BhcmM2NF9lbGZfYnVpbGRfcGx0LgotCShlbGZfYmFja2VuZF93YW50X2dvdF9wbHQpOiBOby4KLQkoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogTm8uCi0JKGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQpOiA4LgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXApOiBOZXcgZnVuY3Rpb247IGZyZWUgdGhlIHNoc3RydGFiLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCk6IERlY2xhcmUgaXQuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2Nsb3NlX2FuZF9jbGVhbnVwKTogQXJyYW5nZSBmb3IgaXQKLQl0byBiZSBjYWxsZWQuCi0KLVR1ZSBKYW4gMjcgMjE6NDU6MTUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9taXBzKik6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBNSVBTCi0JcHJvY2Vzc29ycy4KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbWlwcyB2YXJpYW50cy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotVHVlIEphbiAyNyAxNTowNjowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogUHJlc2VydmUgdGhlIGNvbnRlbnRzIG9mCi0JdDJhM19iX2luc24uCi0KLVR1ZSBKYW4gMjcgMTI6NDc6MjcgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtc2NvMy4ydjUqKTogRUxGIG5vdyB0aGUgZGVmYXVsdC4KLQkoaVszNDU2XTg2c2NvMy4ydjUqY29mZik6IE5ldyB0YXJnZXQuCi0KLU1vbiBKYW4gMjYgMTU6NDE6MzAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQgd2l0aCBjaGFuZ2VzIHRvIGNoZXctLXRhYiBleHBhbnNpb24uCi0KLVRodSBKYW4gMjIgMjE6MjY6NDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9nZXRfZXJyb3JfaGFuZGxlcik6IEFkZCBvcnRob2dvbmFsIGZ1bmN0aW9uLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi1UaHUgSmFuIDIyIDIxOjEzOjM5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRla2hleC5jICh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgZm9yIG5vIHN5bWJvbHMuCi0KLVdlZCBKYW4gMjEgMjE6MTk6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogSWYgQ09GRl9XSVRIX1BFLCBkb24ndAotIAlhZGp1c3QgYWRkZW5kIGZvciBhbiBvdXRwdXQgY29tbW9uIHN5bWJvbCAoZnJvbSBKaW1teSBCbGFpcgotIAk8amltbXliQHdycy5jb20+KS4gIElmIENPRkZfV0lUSF9QRSwgYWRqdXN0IGFkZGVuZCBmb3IgUEMgcmVsYXRpdmUKLSAJZGVmaW5lZCBzeW1ib2wgdG8gY291bnRlcmFjdCBhZGp1c3RtZW50IG1hZGUgaW4gZ2VuZXJpYyByZWxvY2F0aW9uCi0gCWNvZGUuCi0KLQkqIGR3YXJmMi5jOiBJbmNsdWRlIHN5c2RlcC5oLCBub3Qgc3RkaW8uaCBhbmQgc3RkbGliLmguCi0KLVdlZCBKYW4gMjEgMjE6MTY6MDYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb2ZmLW04OGsuYyAoR0VUX1NDTkRIUl9OUkVMT0MpOiBGaXggdHlwbyBpbiBtYWNybyBuYW1lLgotCShHRVRfU0NOREhSX05MTk5PKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMTkgMTI6NDk6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENvcnJlY3QgbmV4dCBmaWVsZCBvZiBzaDNlLgotCi1XZWQgSmFuIDE0IDE3OjIzOjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogQWRkIG1hY3JvcyB0byBoYW5kbGUgTk9QIGluc2VydGlvbi4KLQotV2VkIEphbiAxNCAxNjoxNToyMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFya19zeW1ib2wpOiBEb24ndCBtYXJrIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCSh4Y29mZl9tYXJrKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IE1hcmsgYWJzb2x1dGUgc3ltYm9scy4KLQotV2VkIEphbiAxNCAxNjowMzoxMSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNvcnQgc3ltYm9scyBiZWZvcmUgb3V0cHV0Ci0JdG8ga2VlcCB7Q0FMTCxCQUx9TkFNRSBzeW1ib2xzIGFkamFjZW50LgotCShiX291dF9zeW1ib2xfY21wKTogTmV3IGZ1bmN0aW9uLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTk2OTcKLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2ctOTE5MyBiL2JmZC9DaGFuZ2VMb2ctOTE5MwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhZjkzMS4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nLTkxOTMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODUxICswLDAgQEAKLUZyaSBEZWMgMzEgMTY6MjM6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JTWlub3IgY2xlYW51cHMgc3VnZ2VzdGVkIGJ5IENvZGVDZW50ZXIuCi0JKiBhb3V0eC5oLCBjb2ZmZ2VuLmMsIGVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlbGYuYywgbGliYmZkLmMsCi0JbGlua2VyLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgc3JlYy5jOiBBZGRlZCAvKkFSR1NVU0VEKi8gYXMKLQlhcHByb3ByaWF0ZS4KLQkqIGFvdXR4LmggKHN0cnVjdCBleHRlcm5hbF9leGVjKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBkZWNsYXJhdGlvbi4KLQkoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBTZXQgc29tZSB0ZGF0YSBwb2ludGVycyB0byBOVUxMLgotCShhZGp1c3Rfel9tYWdpYyk6IFJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZSBkYXRhX3ZtYS4KLQkoc3RyaW5ndGFiX2luaXQpOiBJbml0aWFsaXplIGhhc2hfemVyby4KLQkoYWRkX3RvX3N0cmluZ3RhYik6IFJlbW92ZWQgdW51c2VkIGZvdXJ0aCBhcmd1bWVudC4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUKLQlyX2FkZGVuZC4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBBZGRlZCBzb21lIGNhc3RzLgotCSogYXJjaGl2ZS5jIChnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUsIGRvX3NsdXJwX2NvZmZfYXJtYXAsCi0JYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0sIGJzZF93cml0ZV9hcm1hcCwgY29mZl93cml0ZV9hcm1hcCk6Ci0JTWlub3IgY29kZSByZXdyaXRpbmcgdG8gbWFrZSBpdCBtb3JlIEMgbGlrZS4KLQkoZG9fc2x1cnBfYnNkX2FybWFwKTogQWRkZWQgc29tZSBjYXN0cy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZQotCXNjbl9iYXNlLgotCShlY29mZl93cml0ZV9hcm1hcCk6IEFkZGVkIHNvbWUgY2FzdHMuICBVc2UgIiIgcmF0aGVyIHRoYW4gIlwwIi4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfd3JpdGVfZGVidWcpOiBBZGRlZCBhIGNhc3QuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBpbnRlcm5hbF9leGVjKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeQotCWRlY2xhcmF0aW9uLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19pbmRpcmVjdF9saW5rX29yZGVyKTogQWRkZWQgYSBjYXN0LgotCSogb3BuY2xzLmMgKG5ld19iZmQpOiBSZW1vdmVkIGEgY2FzdC4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCi0Jc29tZSBjYXN0cy4KLQkqIHNyZWMuYyAoaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIHVzZWxlc3MKLQl2YXJpYWJsZSBieXRlc193cml0dGVuLgotCi1GcmkgRGVjIDMxIDExOjQ2OjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Nm1hY2gzLmMgKE5fVFhUQUREUik6IERvbid0IGRlZmluZSBhZnRlciBhbGwuCi0JKFRFWFRfU1RBUlRfQUREUik6IERvbid0IGluY2x1ZGUgZXhlYyBoZWFkZXIgc2l6ZSBpbiB2YWx1ZS4KLQotVGh1IERlYyAzMCAxNTo0Nzo1NCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGkzODZtYWNoMy5jIChOX1RYVEFERFIpOiBEZWZpbmUuCi0KLVRodSBEZWMgMzAgMTM6Mzc6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRXh0ZW5zaXZlIGNoYW5nZXMgdG8gbW92ZSB0aGUgYnVsayBvZiB0aGUgbGlua2VyIGludG8gQkZEIHNvIHRoYXQKLQltb3JlIGVmZmljaWVudCBiYWNrZW5kIGNvZGUgY2FuIGJlIHdyaXR0ZW4gZm9yIHNwZWNpZmljIG9iamVjdAotCWZpbGVzLiAgT25seSBleGlzdGluZyBlZmZpY2llbnQgYmFja2VuZCBpcyBhLm91dC4KLQkqIHNlY2xldC5jLCBzZWNsZXQuaDogUmVtb3ZlZC4KLQkqIGhhc2guYywgbGlua2VyLmMsIGdlbmxpbmsuaDogTmV3IGZpbGVzLgotCSogYmZkLWluLmg6IFJlbW92ZWQgYmZkX2Vycm9yX3ZlY3Rvci4gIERlY2xhcmVkIGhhc2ggdGFibGUKLQlzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMuCi0JKEpVTVBfVEFCTEUpOiBSZW1vdmVkIGJmZF9zZWNsZXRfbGluaywgYWRkZWQKLQliZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgYW5kCi0JYmZkX2ZpbmFsX2xpbmsuCi0JKiBBbGwgYmFja2VuZHM6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGRlZCBsaW5rX25leHQgYW5kIGFyY2hpdmVfcGFzcyBmaWVsZHMuCi0JUmVtb3ZlZCBsZF9zeW1ib2xzIGZpZWxkLgotCShiZmRfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLCBiZmRfdW5kZWZpbmVkX3N5bWJvbCwKLQliZmRfcmVsb2NfdmFsdWVfdHJ1bmNhdGVkLCBiZmRfcmVsb2NfaXNfZGFuZ2Vyb3VzLAotCWJmZF9lcnJvcl92ZWN0b3IpOiBSZW1vdmVkLgotCShiZmRfZGVmYXVsdF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdHJhcCwKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsdHJhcCk6IFJlbW92ZWQuCi0JKGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBQYXNzIGxpbmtfaW5mby4gIFBhc3MKLQlsaW5rX29yZGVyIGluc3RlYWQgb2Ygc2VjbGV0LiAgUGFzcyBzeW1ib2xzLgotCShiZmRfcmVsYXhfc2VjdGlvbik6IFBhc3MgbGlua19pbmZvLgotCShiZmRfc2VjbGV0X2xpbmspOiBSZW1vdmVkLgotCShiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgYmZkX2xpbmtfYWRkX3N5bWJvbHMsCi0JYmZkX2ZpbmFsX2xpbmspOiBOZXcgbWFjcm9zLgotCSogbGliYmZkLWluLmg6IElmIF9fR05VQ19fIGlzIGRlZmluZWQgYW5kIGFsbG9jYSBpcyBub3QsIGRlZmluZQotCWFsbG9jYSBhcyBfX2J1aWx0aW5fYWxsb2NhLiAgRGVjbGFyZSBpbnRlcm5hbCBsaW5raW5nIGZ1bmN0aW9ucy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogQ29tbWVudCBvdXQgZnNlZWsgYXNzZXJ0aW9uLiAgSXQncyB3b3JrZWQKLQlmb3IgbW9udGhzLgotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6IEFkZGVkIGVycm9yX21lc3NhZ2UgYXJndW1lbnQgdG8KLQlzcGVjaWFsX2Z1bmN0aW9uIGZpZWxkLiAgQ2hhbmdlZCBhbGwgY2FsbGVycyBhbmQgYWxsIGRlZmluaXRpb25zLgotCShiZmRfZ2V0X3JlbG9jX3NpemUpOiBNYWtlIGFyZ3VtZW50IGEgY29uc3QgcG9pbnRlci4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50IHRvIGhvbGQKLQlzdHJpbmcgc2V0IGlmIHJldHVybiB2YWx1ZSBpZiBiZmRfcmVsb2NfZGFuZ2Vyb3VzLiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzLgotCShfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBOZXcgZnVuY3Rpb25zLgotCSogc2VjdGlvbi5jIChhc2VjdGlvbik6IFJlbmFtZWQgc2VjbGV0c19oZWFkIGFuZCBzZWNsZXRzX3RhaWwgdG8KLQlsaW5rX29yZGVyX2hlYWQgYW5kIGxpbmtfb3JkZXJfdGFpbC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlcGxhY2VkIHNlY2xldCBhcmd1bWVudCB3aXRoIGxpbmtfaW5mbwotCWFuZCBsaW5rX29yZGVyIGFuZCBzeW1ib2xzIGFyZ3VtZW50cyBpbgotCWJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBBZGRlZCBzeW1ib2xzIGFyZ3VtZW50IHRvCi0JYmZkX3JlbGF4X3NlY3Rpb24uICBSZW1vdmVkIGJmZF9zZWNsZXRfbGluay4gIEFkZGVkCi0JYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzIGFuZAotCWJmZF9maW5hbF9saW5rLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGRlZCBleHRlcm5hbF9zeW1zLAotCWV4dGVybmFsX3N5bV9jb3VudCwgZXh0ZXJuYWxfc3RyaW5ncywgc3ltX2hhc2hlcyBmaWVsZHMuCi0JKG9ial9hb3V0X2V4dGVybmFsX3N5bXMsIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCwKLQlvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzLCBvYmpfYW91dF9zeW1faGFzaGVzKTogTmV3IGFjY2Vzc29yCi0JbWFjcm9zLgotCShXUklURV9IRUFERVJTKTogT25seSBvdXRwdXQgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIG5vdCBOVUxMLgotCSogYW91dHguaDogV3JvdGUgbmV3IGJhY2sgZW5kIGxpbmtlciByb3V0aW5lcy4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4gIERvbid0IHVzZQotCWJmZF9lcnJvcl92ZWN0b3IuCi0JKE5BTUUoYW91dCx3cml0ZV9zeW1zKSk6IFJldHVybiBib29sZWFuIHZhbHVlLiAgQ2hlY2sgcmV0dXJuIHZhbHVlCi0Jb2YgdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgYW5kIGJmZF93cml0ZS4KLQkqIGFvdXQtdGFyZ2V0LmggKGZpbmFsX2xpbmtfY2FsbGJhY2spOiBOZXcgZnVuY3Rpb24uCi0JKE1ZX2JmZF9maW5hbF9saW5rKTogTmV3IGZ1bmN0aW9uLgotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybgotCXZhbHVlIG9mIGFvdXRfMzJfd3JpdGVfc3ltcy4KLQkqIGhwMzAwaHB1eC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jIChXUklURV9IRUFERVJTKTogTGlrZXdpc2UuCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUlMpOiBMaWtld2lzZS4KLQkqIGJvdXQuYzogQ2hhbmdlZCBmdW5jdGlvbnMgdG8gdXNlIGxpbmtfaW5mby0+Y2FsbGJhY2tzIHJhdGhlcgotCXRoYW4gYmZkX2Vycm9yX3ZlY3RvciwgYW5kIGxpbmtfb3JkZXJzIHJhdGhlciB0aGFuIHNlY2xldHMuCi0JKiBjb2ZmLWFscGhhLmM6IExpa2V3aXNlLgotCSogY29mZi1oODMwMC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtaDg1MDAuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXNoLmM6IExpa2V3aXNlLgotCSogY29mZi16OGsuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmM6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jOiBMaWtld2lzZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTG9vawotCXVwIF9ncCBpbiB0aGUgaGFzaCB0YWJsZSByYXRoZXIgdGhhbiBpbiBvdXRzeW1ib2xzLgotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBQYXNzIGVycm9ycyBiYWNrIGluIG5ldyBlcnJvcl9tZXNzYWdlCi0JYXJndW1lbnQgcmF0aGVyIHRoYW4gcHJpbnRpbmcgdGhlbS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBUYWtlIGxpbmtfaW5mbyBhbmQKLQlsaW5rX29yZGVyIGFyZ3VtZW50cyByYXRoZXIgdGhhbiBzZWNsZXQuICBDaGFuZ2VkIGFsbCB1c2VzIGFuZAotCWRlZmluaXRpb25zLgotCShiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKTogUGFzcyBsaW5rX2luZm8gYXJndW1lbnRzLiAgQ2hhbmdlZAotCWFsbCB1c2VzIGFuZCBkZWZpbml0aW9ucy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9leHRyKTogSWYgc3ltYm9sIGlzIGRlZmluZWQgYnkgbGlua2VyLCBidXQKLQlub3QgYnkgRUNPRkYsIG1ha2UgaXQgc2NBYnMuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogUmVuYW1lZCBmcm9tIGVjb2ZmX2JmZF9zZWNsZXRfbGluayBhbmQKLQlyZXdyaXR0ZW4uCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZW5hbWVkIGZyb20KLQltaXBzX2VsZl9zZWNsZXRfbGluayBhbmQgcmV3cml0dGVuLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBsaW5rX2luZm8KLQlmaWVsZC4KLQkobmV3X3N0dWIsIGFkZF9zdHViX2J5X25hbWUsIGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViLAotCWhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIsIGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6Ci0JQWRkZWQgbGlua19pbmZvIGFyZ3VtZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBxdWl0IGlmIG91dHN5bWJvbHMgaXMKLQlub3QgTlVMTC4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUgcmF0aGVyIHRoYW4KLQl1c2luZyBiZmRfZXJyb3JfdmVjdG9yLgotCShvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlvYXN5c193cml0ZV9zZWN0aW9ucy4KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IERvbid0IGRlY2xhcmUgcXNvcnQgb3Igc3RydG9sLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IFJlbW92ZWQgc2VjbGV0Lm8uICBBZGRlZCBoYXNoLm8gYW5kIGxpbmtlci5vLgotCShDRklMRVMpOiBSZW1vdmVkIHNlY2xldC5jLiAgQWRkZWQgaGFzaC5jIGFuZCBsaW5rZXIuYy4KLQkoSEZJTEVTKTogUmVtb3ZlZCBzZWNsZXQuaC4gIEFkZGVkIGdlbmxpbmsuaC4KLQotVGh1IERlYyAzMCAwNzo0MTozNiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogIFJldHVybiB6ZXJvIGZpbGxlZCBidWZmZXIKLQlpZiBzZWN0aW9uIGhhcyBubyBjb250ZW50cy4KLQotVHVlIERlYyAyOCAxMjo0Mzo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfZWxmX2dlbmVyaWNfcmVsb2MpOiBJZiB0aGlzIGlzIG5vdCBhbiBpbnBsYWNlIHJlbG9jLAotCXRoZW4gc2tpcCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGV2ZW4gaWYgdGhlIGFkZGVuZCBpcyBub24temVyby4KLQotVHVlIERlYyAyMSAwOToyMjoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKSBbU1dBUF9PVVRfUkVMT0NfT0ZGU0VUXTogQ29weQotCWFkZGVuZCB0byByX29mZnNldCBmaWVsZC4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZGVkIGNvZmYtc3BhcmMuYy4gIFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBjb2ZmLXNwYXJjLmMgKFNXQVBfSU5fUkVMT0NfT0ZGU0VULCBTV0FQX09VVF9SRUxPQ19PRkZTRVQsCi0JQ0FMQ19BRERFTkQpOiBEZWZpbmUuCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKGFpeDM4Nl9jb3JlX2ZpbGVfcCk6IFVzZSBjZF9yZWdzWzBdIGZvciBjb21wdXRpbmcKLQl0aGUgb2Zmc2V0b2YgYmVjYXVzZSBBSVggL2Jpbi9jYyBkb2VzIG5vdCBsaWtlIHRvIHRha2UgdGhlIGFkZHJlc3MKLQlvZiBhbiBhcnJheS4gIChGcm9tIE1pbmggVHJhbi1MZS4pCi0KLVRodSBEZWMgMTYgMTM6MDY6MzIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIFRodSBEZWMgMTYgMTU6NDE6MDYgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBjcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IE1ha2Ugc3VyZSB0byBjb3B5Ci0JdGhlIHJldHVybiBwb2ludGVyIGludG8gJXIyIGlmIG5vIGp1bXAtaW4tY2FsbC1kZWxheS1zbG90Ci0Jb3B0aW1pemF0aW9uIHdhcyBkb25lLgotCi0JKiBob3N0cy9ocDMwMGJzZC5oOiBDb3JyZWN0bHkgaWRlbnRpZnkgNC4zQlNEIHZzIDQuNEJTRC4KLQotV2VkIERlYyAxNSAwODowNDoxNiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6ICh0aW1lKTogRG9uJ3QgZGVjbGFyZTsgY29uZmxpY3RzIG9uIE1hY2gzLgotCi0JKiBob3N0cy9pMzg2bWFjaDMuaCAoSE9TVF9QQUdFX1NJWkUpOiBTZXQgdG8gMSB0byBhdm9pZCBwYWRkaW5nLgotCShIT1NUX1NFR01FTlRfU0laRSk6IFNldCB0byAwIGZvciBzYW1lIHJlYXNvbi4KLQotCSogaTM4Nm1hY2gzLmMgKFBBR0VfU0laRSwgU0VHTUVOVF9TSVpFKTogU2FtZSBjaGFuZ2VzIGFzIGFib3ZlLgotCShURVhUX1NUQVJUX0FERFIpOiBDb3JyZWN0LgotCShNWV9iYWNrZW5kX2RhdGEpOiBEZWZpbmUuCi0KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljLCBhZGp1c3Rfel9tYWdpYywgYWRqdXN0X25fbWFnaWMpOgotCU5ldyBmdW5jdGlvbnM7IGNvZGUgbW92ZWQgZnJvbSBhb3V0XzxzaXplPl9hZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMuCi0KLVR1ZSBEZWMgMTQgMjE6NDg6MzMgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAgICAgICAgKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGaXggdGhpbmtvcyBpbiBhdXhpbGlhcnkgaGVhZGVyCi0Jc3VwcG9ydC4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IExpa2V3aXNlLgotCi1Nb24gRGVjIDEzIDIzOjM0OjQ4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogSGFuZGxlICdUJyBmaWVsZAotCXNlbGVjdG9ycyBmb3IgUElDIGNvZGUuCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSAnVCcgZmllbGQgc2VsZWN0b3JzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfRExUX1JFTCwgUl9GU0VMLCBSX1JTRUwsIFJfTFNFTAotCXJlbG9jYXRpb25zIG5lZWRlZCBieSBQSUMuCi0KLVR1ZSBEZWMgIDcgMTU6NDc6NTEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oOiAgRml4ZXMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuLi4KLQotVHVlIERlYyAgNyAxNToxMDo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYm5sbS5oIChubG1fYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBtYWNybyBkZWZpbml0aW9uLgotCShubG1fYWxwaGFfYmFja2VuZF9kYXRhKTogQWRqdXN0ZWQgYWNjb3JkaW5nbHkuCi0KLVN1biBEZWMgIDUgMTk6MzI6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZsZXNoIG91dCBjb2RlIGZvciBoYW5kbGluZyBzaW1wbGUKLQlhdXhpbGlhcnkgaGVhZGVycy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmggKHN0cnVjdCBzb21kYXRhKTogQWRkIGZpZWxkcyBmb3IgYXR0YWNoaW5nIHZlcnNpb24gYW5kCi0JY29weXJpZ2h0IGhlYWRlcnMuICBBZGQgYWNjZXNzb3IgbWFjcm9zLgotCi0JKiBzb20uYyAoUl9ETFRfUkVMLCBSX0FVWF9VTldJTkQsIFJfU0VDX1NUTVQpOiBBZGQgcHJvdGVjdGVkCi0JZGVmaW5pdGlvbnMgZm9yIG9sZCB2ZXJzaW9ucyBvZiBIUFVYIHdoaWNoIGZhaWwgdG8gZGVmaW5lIHRoZW0uCi0JKHNvbV9ocHBhX2hvd3RvX3RhbGJlKTogQWRkIFJfRExUX1JFTCwgUl9BVVhfVU5XSU5ELCBhbmQgUl9TRUNfU1RNVAotCW5vdyB0aGF0IHRoZXkncmUgc2FmZS4gIERlbGV0ZSBib2d1cyBSX1NUQVRFTUVOVCByZWxvY2F0aW9ucy4KLQotCSogc29tLmMgKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogQWRkIG1pc3NpbmcgUl9FTkRfVFJZLiAgRGVsZXRlIAotCWV4dHJhIFJfREFUQV9PVkVSUklERS4KLQkoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBHZW5lcmF0ZSBhIHJlbG9jYXRpb24gZm9yIHRoZSByb3VuZGluZwotCW1vZGUgc2VsZWN0b3IgaWYgbmVlZGVkLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIHJlcXVlc3RzIGZvciBhIGNoYW5nZSBpbiB0aGUgZGVmYXVsdAotCXJvdW5kaW5nIG1vZGUuICBSb3VuZGluZyBtb2RlcyBkbyBub3QgY29uc3VtZSBpbnB1dCBieXRlcywgYnV0Ci0JYXJlIGp1c3QgbWFya2VycyBtdWNoIGxpa2UgUl9FTlRSWSBhbmQgUl9FWElULgotCi1TYXQgRGVjICA0IDE5OjQwOjMyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JRnJpIERlYyAgMyAwOTo1NToxNyAxOTkzICBQZXRlIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jKTogIERvIG5vdCBkbyBjb2RlIHJlb3JkZXJpbmcgd2hlbgotCXRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gYXMgb3JpZ2luYWxseSBiZWVuIG51bGxpZmllZC4KLQlocHBhX2VsZl9yZWxvYyk6ICBBdm9pZCB1c2VsZXNzIGNhbGwgdG8gYmZkX3B1dF8zMiAoKSBpbiB0aGUKLQljYXNlIG9mIG5vIGNvZGUgcmVvcmRlcmluZyBkdWUgdG8gYW4gTERPIGluc3RydWN0aW9uIGluIHRoZQotCWRlbGF5IHNsb3Qgb2YgdGhlIGJyYW5jaC4gIE1ha2Ugc3VyZSB0byByZWxvY2F0ZSB0aGUgY29ycmVjdAotCWluc3RydWN0aW9uLiAgRG8gbm90IHBlcmZvcm0gaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZyBmb3IgbWlsbGljb2RlCi0JY2FsbHMuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogIENoYW5nZSB0aGUgcmVsb2NhdGlvbiB0eXBlCi0JdG8gUl9IUFBBX1NUVUJfQ0FMTF8xNyB3aGVuIHNwZWNpYWwgcHJvY2Vzc2luZyBtaWdodCBiZSBuZWVkZWQuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBQcmV2ZW50IGNvZGUgcmVvcmRlcmluZyBvbgotCWEgY2FsbCBmcm9tIGEgbGlua2VyIHN0dWIgdG8gYW5vdGhlciBsaW5rZXIgc3R1YiBhbmQgZm9yIG1pbGxpY29kZQotCWNhbGxzLiAgRG8gbm90IHRyYXNoIHRoZSByZXR1cm4gcmVnaXN0ZXIgZm9yIGNhbGxzIGZyb20gb25lIGxpbmtlcgotCXN0dWIgdG8gYSBzZWNvbmQgbGlua2VyIHN0dWIuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogIFBMQUJFTCBhbmQgRExUCi0JcmVsb2NhdGlvbnMgYXJlIG5vdCBwYy1yZWxhdGl2ZS4KLQotCSogaHBwYV9zdHVicy5oOiAoQkxFX05fWFhYXzBfMzEpOiAgTmV3IGluc3RydWN0aW9uIHVzZWQgaW4KLQlsaW5rZXIgc3R1YiBjb2RlLiAKLQkoQ09QWV8yXzMxKTogIExpa2V3aXNlLgotCi1GcmkgRGVjICAzIDE4OjQwOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NvbGFyaXMyLm1oIChIREVGSU5FUyk6IFJlbW92ZSAtRGNvbnN0PQotCSogaG9zdHMvc29sYXJpcy5oOiBJZiBub3QgX19HTlVDX18sIGRlZmluZSBjb25zdCBhcyBlbXB0eS4KLQotVGh1IERlYyAgMiAxNTo0MzozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmM6IEFkZGVkIHZhcmlvdXMgY2FzdHMgZm9yIDMyLzY0IGJpdCBjcm9zcyB0YXJnZXRpbmcuCi0JKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvciB0aGUgLnJlZ2luZm8KLQlzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBpZ25vcmVzIGl0LgotCSogZWNvZmZsaW5rLmM6IEFkZGVkIHZhcmlvdXMgY2FzdHMgZm9yIDMyLzY0IGJpdCBjcm9zcyB0YXJnZXRpbmcuCi0JKGVjb2ZmX2FkZF9ieXRlcyk6IENoYW5nZWQgbmVlZCBhcmd1bWVudCB0byBzaXplX3QuCi0JKGJmZF9lY29mZl9kZWJ1Z19saW5rX290aGVyKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JZWNvZmZfYWRkX3N0cmluZy4KLQotCSogbGliYmZkLWluLmggKG5ld19iZmQpOiBVc2Ugdm9pZCByYXRoZXIgdGhhbiBhbiBlbXB0eSBwYXJhbWV0ZXIKLQlsaXN0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IE5ldyBmaWVsZCBiYWNrZW5kX2RhdGEuCi0JKG5sbV9iYWNrZW5kX2RhdGEsIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEpOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZCBub191bmluaXRpYWxpemVkX2RhdGEuCi0JKG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBubG1jb2RlLmggKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUKLQlub191bmluaXRpYWxpemVkX2RhdGEuCi0JKG5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlKTogU29ydCByZWxvY3MgYnkgYWRkcmVzcyBmb3IgYQotCXBhcnRpY3VsYXIgc3ltYm9sLCB0byBtYWtlIHRoZSBzb3J0IG1vcmUgc3RhYmxlLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FzdCB0aGUgYXJndW1lbnRzIHRvIHFzb3J0LiAgR2V0IHRoZQotCXZhbHVlIG9mIGEgZGVidWdnaW5nIHN5bWJvbCB0aGUgc2FtZSB3YXkgd2UgZ2V0IHRoZSB2YWx1ZSBvZiBhCi0Jbm9ybWFsIHN5bWJvbC4KLQkqIG5sbTMyLWFscGhhLmM6IFZhcmlvdXMgY2hhbmdlcy4gIFdyaXRlIG91dCBHUCBhbmQgLmxpdGEgcmVsb2NzLgotCVNldCBub191bmluaXRpYWxpemVkX2RhdGEgdG8gdHJ1ZS4KLQkqIG5sbTMyLWkzODYuYyAobmxtMzJfaTM4Nl9iYWNrZW5kKSwgbmxtMzItc3BhcmMuYwotCShubG0zMl9zcGFyY19iYWNrZW5kKTogU2V0IG5vX3VuaW5pdGlhbGl6ZWRfZGF0YSBmaWVsZCBmYWxzZS4KLQkqIG5sbXN3YXAuaCAobmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCk6IFplcm8gb3V0IGRlc3RpbmF0aW9uCi0JYmVmb3JlIGZpbGxpbmcgaXQgaW4uCi0KLVdlZCBEZWMgIDEgMjE6NDc6NTggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2VjdGlvbl90eXBlLCBzb21fZGVjb2RlX3N5bWNhbHNzKTogTmV3IGZ1bmN0aW9ucy4KLQkoc29tX2dldF9zeW1ib2xfaW5mbyk6IFVzZSB0aGVtLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHRoZSBzZWN0aW9uIG9mIGNvbW1vbiBhbmQgdW5kZWZpbmVkCi0Jc3ltYm9scyBjb3JyZWN0bHkuCi0KLVdlZCBEZWMgIDEgMTQ6MTU6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXIgTEFTVF9TWU1fSURYLCB0bwotCW1ha2UgZ2NjIGhhcHB5LgotCi0JKiBtaXBzYnNkLmM6IENoYW5nZXMgZnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkobWlwc19ob3d0b190YWJsZV9leHQpOiBNSVBTX1JFTE9DX0xPMTYgc2hvdWxkIHVzZQotCWNvbXBsYWluX292ZXJmbG93X2RvbnQuCi0JKGFvdXRfbWlwc18qX3ZlYyk6IE1ha2UgbmFtZSB1c2UgImEub3V0IiBpbnN0ZWFkIG9mICJhb3V0IiwgdG8KLQltYWtlIGdkYiBoYXBweS4KLQotCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogUmV3b3JkIGludmFsaWQtdGFyZ2V0IG1lc3NhZ2UuCi0KLQkqIGNvbmZpZy5iZmQ6IEZvciBzcGFyYyotKi1jb2ZmLCB1c2Ugc3BhcmMtY29mZi4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHNwYXJjY29mZl92ZWMuCi0JKiB0YXJnZXRzLmMgKHNwYXJjY29mZl92ZWMpOiBEZWNsYXJlLgotCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCByZWxvY19ob3d0b190eXBlKTogVXBkYXRlIGRvY3VtZW50YXRpb24gb2Ygc2l6ZSBmaWVsZC4KLQotV2VkIERlYyAgMSAxNDozOTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbTMyLWFscGhhLmM6IE5ldyBmaWxlOyBwcmVsaW1pbmFyeSBBbHBoYSBOZXRXYXJlIHN1cHBvcnQuCi0JKiBjb25maWcuYmZkIChhbHBoYS0qLW5ldHdhcmUqKTogTmV3IHRhcmdldDsgdXNlIGFscGhhLW5sbS4KLQkqIGNvbmZpZy9hbHBoYS1ubG0ubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChubG0zMl9hbHBoYV92ZWMpOiBOZXcgdmVjdG9yOyB1c2UgbmxtMzItYWxwaGEubywKLQlubG0zMi5vLCBhbmQgbmxtLm8uCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGRlZCBubG0zMi1hbHBoYS5vLgotCShDRklMRVMpOiBBZGRlZCBubG0zMi1hbHBoYS5jLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCSogdGFyZ2V0cy5jIChubG0zMl9hbHBoYV92ZWMpOiBEZWNsYXJlLgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGRzCi0Jb3B0aW9uYWxfcHJlZml4X3NpemUsIG5sbV9iYWNrZW5kX29iamVjdF9wLCBubG1fd3JpdGVfcHJlZml4LAotCW5sbV9zZXRfcHVibGljX3NlY3Rpb24sIG5sbV9nZXRfcHVibGljX29mZnNldC4gIFJlbW92ZWQgdW51c2VkCi0JbmxtX3dyaXRlX3JlbG9jIGZpZWxkLiAgQ2hhbmdlZCBubG1fd3JpdGVfaW1wb3J0IHRvIHJlbW92ZQotCXVubmVjZXNzYXJ5IHN5bWJvbCBhcmd1bWVudC4gIFJlbmFtZWQgbmxtX3dyaXRlX2V4dGVybmFscyB0bwotCW5sbV93cml0ZV9leHRlcm5hbCwgYW5kIGNoYW5nZWQgY291bmQgYXJndW1lbnQgZnJvbSBiZmRfdm1hIHRvCi0JYmZkX3NpemVfdHlwZS4KLQkobmxtX29wdGlvbmFsX3ByZWZpeF9zaXplLCBubG1fYmFja2VuZF9vYmplY3RfcF9mdW5jLAotCW5sbV93cml0ZV9wcmVmaXhfZnVuYywgbmxtX3NldF9wdWJsaWNfc2VjdGlvbl9mdW5jLAotCW5sbV9nZXRfcHVibGljX29mZnNldF9mdW5jKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkobmxtX3dyaXRlX3JlbG9jX2Z1bmMpOiBSZW1vdmVkLgotCShubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyk6IEFkanVzdGVkIGZvciBmaWVsZCByZW5hbWluZy4KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfaW1wb3J0KTogUmVuYW1lZCBmcm9tCi0JbmxtX2kzODZfd3JpdGVfcmVsb2MuICBSZW1vdmVkIG9sZCBubG1faTM4Nl93cml0ZV9pbXBvcnQgd2hpY2gKLQlqdXN0IGNhbGxlZCBvbGQgbmxtX2kzODZfd3JpdGVfcmVsb2MuCi0JKG5sbV9pMzg2X3dyaXRlX2V4dGVybmFsKTogUmVuYW1lZCBmcm9tIG5sbV9pMzg2X3dyaXRlX2V4dGVybmFscy4KLQlEZWNsYXJlZC4gIENoYW5nZWQgc2Vjb25kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYSB0byBiZmRfc2l6ZV90eXBlLgotCShubG0zMl9pMzg2X2JhY2tlbmQpOiBBZGp1c3RlZCBmb3IgY2hhbmdlcyB0byBmaWVsZHMgYW5kIG5hbWVzLgotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX21hbmdsZV9yZWxvY3MpOiBSZW1vdmVkIHVudXNlZCwKLQlpZmRlZmZlZCBvdXQgY29kZS4KLQkobmxtX3NwYXJjX3dyaXRlX2ltcG9ydCk6IFJlbW92ZWQgc2Vjb25kIGFyZ3VtZW50LgotCShubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwpOiBSZW5hbWVkIGZyb20KLQlubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWxzLiAgQ2hhbmdlZCBzZWNvbmQgYXJndW1lbnQgZnJvbSBiZmRfdm1hCi0JdG8gYmZkX3NpemVfdHlwZS4KLQkobmxtMzJfc3BhcmNfYmFja2VuZCk6IEFkanVzdGVkIGZvciBjaGFuZ2VzIHRvIGZpZWxkcyBhbmQgbmFtZXMuCi0JKiBubG1jb2RlLmg6IFJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KLQkobmxtX29iamVjdF9wKTogRG9uJ3QgZGVzdHJveSB0ZGF0YSBwb2ludGVyLiAgQ2FsbAotCWJhY2tlbmRfb2JqZWN0X3AgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgcmNvdW50LiAgQ2FsbAotCXNldF9wdWJsaWNfc2VjdGlvbl9mdW5jIGlmIGl0IGV4aXN0cyBpbnN0ZWFkIG9mIGNoZWNraW5nCi0JTkxNX0hJQklULgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWNjb3VudCBmb3IKLQlvcHRpb25hbF9wcmVmaXhfc2l6ZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFjY291bnQgZm9yIG9wdGlvbmFsX3ByZWZpeF9zaXplLgotCVJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZSB3cml0ZV9yZWxvY19mdW5jLiAgQ2hhbmdlZCBkZWNsYXJhdGlvbgotCWFuZCBjYWxsIG9mIHdyaXRlX2ltcG9ydF9mdW5jLiAgQ2FsbCB3cml0ZV9wcmVmaXhfZnVuYyBpZiBpdAotCWV4aXN0cy4gIFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcyBsZW4gYW5kIHRlbXAuICBDYWxsCi0JZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyBpZiBpdCBleGlzdHMgcmF0aGVyIHRoYW4gc2V0dGluZyBOTE1fSElCSVQuCi0JKiBubG1zd2FwLmg6IERlY2xhcmUgZnVuY3Rpb25zLgotCi0JKiBiZmQtaW4uaCAodWludDY0X3R5cGVMT1csIHVpbnQ2NF90eXBlSElHSCk6IEZ1bGx5IHBhcmVudGhlc2l6ZQotCWZvciBjbGFyaXR5LgotCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBVc2UgJWx4LCBub3QgJXguCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBob3N0cy9hbHBoYW9zZi5oICh1aW50NjRfdHlwZUxPVywgdWludDY0X3R5cGVISUdIKTogQ2FzdCByZXN1bHRzCi0JdG8gdW5zaWduZWQgbG9uZy4KLQotCSogY29uZmlnLmJmZDogRG9uJ3Qgc2V0IHRhcmdldDY0IGhlcmUsIGFzIHRoZSBzZXR0aW5nIGlzIGlnbm9yZWQuCi0JKiBjb25maWd1cmUuaW4gKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IFNldCB0YXJnZXQ2NC4KLQotCSogY29uZmlnL2FscGhhb3NmLm10IChUREVGSU5FUyk6IFJlbW92ZWQ7IHNldHRpbmcgaG9zdCBwYXJhbWV0ZXJzCi0JaW4gVERFRklORVMgaXMgd3JvbmcuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlSZW1vdmUgdW51c2VkIHZhcmlhYmxlIG91dHB1dF9zZWN0aW9uLgotCi1UdWUgTm92IDMwIDE2OjQ1OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaXJpeC1jb3JlLmM6IE5ldyBmaWxlIGZvciBJcml4IDQgYW5kIElyaXggNSBjb3JlIHN1cHBvcnQuCi0JRnVuY3Rpb25zIHRha2VuIG91dCBvZiBjb2ZmLW1pcHMuYy4gIEhhbmRsZSB2bWFwIHR5cGUgVk1BUEZJTEUuCi0JKiBjb2ZmLW1pcHMuYzogSXJpeCA0IGNvcmUgZmlsZSBzdXBwb3J0IG1vdmVkIHRvIGlyaXgtY29yZS5jLgotCSogdGFyZ2V0cy5jOiBJZiBJUklYX0NPUkUgZGVmaW5lZCwgaW5jbHVkZSBpcml4X2NvcmVfdmVjIGluCi0JdGFyZ2V0X3ZlY3Rvci4KLQkqIGNvbmZpZy9pcml4NC5taCAoSERFRklORVMpOiBBZGQgLURJUklYX0NPUkUuCi0JKEhERVBGSUxFUyk6IERlZmluZSB0byBiZSBpcml4LWNvcmUuby4KLQkqIGNvbmZpZy9pcml4NS5taCAoSERFRklORVMpOiBEZWZpbmUgdG8gYmUgLURJUklYX0NPUkUuCi0JKEhERVBGSUxFUyk6IERlZmluZSB0byBiZSBpcml4LWNvcmUuby4KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6IEFkZGVkIGlyaXgtY29yZS5vLiAgUmVtb3ZlZAotCXNjby1jb3JlLm8sIHdoaWNoIG5vIGxvbmdlciBleGlzdHMuCi0JKENGSUxFUyk6IEFkZGVkIGFsbCAqLWNvcmUuYyBmaWxlcy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotV2VkIE5vdiAyNCAwMjowMjo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBSZXN0b3JlIGNoZWNrIG9mIGZpbGVfc2l6ZSAhPQotCW1lbV9zaXplLCBidXQgb25seSBpZiBTSFRfUFJPR0JJVFMuCi0KLQkqIGVjb2ZmbGluay5jOiBOZXcgZmlsZSB0byBob2xkIEVDT0ZGIGRlYnVnIGluZm9ybWF0aW9uIGxpbmtpbmcKLQlyb3V0aW5lcy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NsZWFyX291dHB1dF9mbGFncywgZWNvZmZfcmVsLCBlY29mZl9kdW1wX3NlY2xldCwKLQllY29mZl9hZGRfc3RyaW5nLCBlY29mZl9nZXRfZGVidWcpOiBSZW1vdmVkLiAgRnVuY3Rpb25hbGl0eSBub3cgaW4KLQllY29mZmxpbmsuYy4KLQkoZWNvZmZfZ2V0X2V4dHIsIGVjb2ZmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBEb24ndCBzYXZlIHJhd19zaXplLgotCShlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBSZXdyb3RlIHRvIHVzZSBlY29mZmxpbmsuYyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IHNldCBFWEVDX1AganVzdAotCWJlY2F1c2UgdGhlcmUgaXMgYSBzdGFydCBhZGRyZXNzLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgZXh0ZXJuYWwgc3ltYm9scyBoZXJlLiAgVXNlCi0JZWNvZmZsaW5rLmMgZnVuY3Rpb25zIHRvIHdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbywgbWlwc19lbGZfZ2V0X2V4dHIsCi0JbWlwc19lbGZfc2V0X2luZGV4KTogTmV3IGZ1bmN0aW9ucy4KLQkobWlwc19lbGZfc2VjbGV0X2xpbmspOiBEaXNjYXJkIGVtcHR5IHNlY3Rpb25zLCB0aGUgLm9wdGlvbnMKLQlzZWN0aW9uIGFuZCAuZ3B0YWIgc2VjdGlvbnMuICBIYW5kbGUgbGlua2luZyAubWRlYnVnIHNlY3Rpb24uCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBSZW1vdmVkIHJhd19zaXplIGFuZCBpZmRiYXNlLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IEFkZGVkIG1pcHNfZXh0ciB0byB0Y19kYXRhIHVuaW9uLgotCSogYmZkLWluLmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIHJvdXRpbmVzIGluIGVjb2ZmbGluay5jIChzb21lIGFyZQotCWNhbGxlZCBieSBnYXMsIHNvIHRoZXkgYXJlIHB1YmxpYykuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBZGRlZCBlY29mZmxpbmsuby4KLQkoQ0ZJTEVTKTogQWRkZWQgZWNvZmZsaW5rLmMuCi0JKGVjb2ZmbGluay5vKTogTmV3IHRhcmdldC4gIFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1Nb24gTm92IDIyIDIyOjI2OjQyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9vYmplY3RfcCk6IEFsc28gcmVjb2duaXplIFNIQVJFRF9NQUdJQ19DTlggYXMKLQlhIHZhbGlkIG1hZ2ljIG51bWJlciBpZiBpdCdzIGJlZW4gZGVmaW5lZC4KLQotTW9uIE5vdiAyMiAxNDoxNzozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogRG9uJ3QgY3JlYXRlIC5zY29tbW9uIHNlY3Rpb247IGxpbmtlcgotCW5vIGxvbmdlciByZXF1aXJlcyBpdC4KLQkoZWNvZmZfYmZkX3NlY2xldF9saW5rLCBlY29mZl9zaXplb2ZfaGVhZGVycywKLQllY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB0cmVhdCAuc2NvbW1vbiBzZWN0aW9uCi0Jc3BlY2lhbGx5LgotCi1Nb24gTm92IDIyIDEwOjU0OjI3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBrZXZAc3B1ZHMuZ2VnLm1vdC5jb20gKEtldmluIEEuIEJ1ZXR0bmVyKToKLQkqIGJmZC9jb25maWcvZGVsdGE4OC5taCAoSERFRklORVMpOiBEZWZpbmUgdGhpcyB0byBiZSAtRFBUUkFDRV9DT1JFLgotCSogYmZkL2NvbmZpZy9kZWx0YTg4Lm1oIChIREVQRklMRVMpOiBEZWZpbmVkIHRvIGJlIHB0cmFjZS1jb3JlLm8uCi0JKiBiZmQvcHRyYWNlLWNvcmUuYzogIE5ldyBmaWxlIGZvciBkZWFsaW5nIHdpdGggY29yZSBmaWxlcyB3aXRoCi0Jc3RhcnQgd2l0aCB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlIGZvdW5kIG9uIEJDUyBjb21wbGlhbnQgc3lzdGVtcy4KLQkqIGJmZC90YXJnZXRzLmMgKHB0cmFjZV9jb3JlX3ZlYyk6ICBOZXcgdmVjdG9yLgotCi1Nb24gTm92IDIyIDAyOjMzOjEyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNaW5pbWFsIHN1cHBvcnQgZm9yIHJlYWRpbmcgU09NIGZpeHVwIHN0cmVhbXMuICBBbGxvd3MKLQlvYmpkdW1wIC1yIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlLgotCSogc29tLmMgKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBJbXBsZW1lbnQuCi0JKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBJbXBsZW1lbnQuCi0JKHNvbV9zZXRfcmVsb2NfaW5mbywgc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogTmV3IGZ1bmN0aW9ucy4KLQotU3VuIE5vdiAyMSAxMzo0Njo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2x5bnguaCAoRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVEKTogRGVmaW5lLgotCSogaG9zdHMvc3BhcmNseW54Lmg6IEluY2x1ZGUgbHlueC5oIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQuCi0KLUZyaSBOb3YgMTkgMTQ6MzQ6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IEZvciBSX0lSRUwsIGRvbid0IGxlZnQgc2hpZnQKLQlzaWduZWRfdmFsdWUgYmVmb3JlIHNpZ24gZXh0ZW5kaW5nIGl0LiAgRG9uJ3Qgc3VidHJhY3Qgb3V0Ci0JcmVsb2NfZW50cnktPmFkZHJlc3MuICBUaGlzIG1ha2VzIGl0IGNvbXBhdGlibGUgd2l0aCB3aGF0IGdhcyBpcwotCWdlbmVyYXRpbmcuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBBY2NlcHQgLnNic3MgYXMgdGhlIG5hbWUgZm9yIGEKLQlTSFRfTk9CSVRTIHNlY3Rpb25zLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IERvbid0IGxlYXZlIHRoZSBsb29wIGFmdGVyIHRoZSBmaXJzdAotCVNIVF9OT0JJVFMgc2VjdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBPbmx5IGZvcmNlIHNoX29mZnNldCBhbmQKLQlzaF9hZGRyIHRvIG1hdGNoIG1vZHVsbyBtYXhwYWdlc2l6ZSBmb3IgYSBzZWN0aW9uIHdoaWNoIGlzIG5vdAotCVNIVF9OT0JJVFMuICBDaGFuZ2VkIHRoZSBtZXRob2QgdXNlZCB0byBmb3JjZSBwYWdlIGFsaWdubWVudCBhZnRlcgotCWEgU0hUX05PQklUUyBzZWN0aW9uIHRvIG9ubHkgZG8gaXQgZm9yIHRoZSBsYXN0IHN1Y2ggY29uc2VjdXRpdmUKLQlzZWN0aW9uLCBhbmQgdG8gcmVhbGx5IGZvcmNlIHBhZ2UgYWxpZ25tZW50LgotCi1GcmkgTm92IDE5IDA0OjAyOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQcmludCBtb3JlIHZlcmJvc2UgbWVzc2FnZQotCWluIHRoZSBjYXNlIG9mIGFuIHVua25vd24gKG9yIHVuaGFuZGxlZCkgc3RvcmFnZSBjbGFzcy4KLQotCSogY29uZmlnL2kzODYtbHlueC5tdCAoVERFRklORVMpOiBGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQgc2hvdWxkCi0Jbm90IGJlIGRlZmluZWQgaGVyZSwgc2luY2UgaXQgaXMgYSBob3N0IGF0dHJpYnV0ZSwgbm90IGEgdGFyZ2V0Ci0Jb25lLgotCSogY29uZmlnL202OGstbHlueC5tdCwgY29uZmlnL3NwYXJjLWx5bngubXQ6IERpdHRvLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5Ci0JZGVmaW5lZC4KLQotCSogY29mZi1zcGFyYy5jOiBEZWZpbmUgc29tZSByZWxvY2F0aW9ucywgYmFzZWQgb24gRUxGIHJlbG9jYXRpb25zLgotCShlbnVtIHJlbG9jX3R5cGUsIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIGNvZmZfc3BhcmNfaG93dG9fdGFibGUsCi0Jc3RydWN0IGNvZmZfcmVsb2NfbWFwLCBzcGFyY19yZWxvY19tYXAsCi0JY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCk6IEJvcnJvd2VkIGZyb20gZWxmMzItc3BhcmMuYyBhbmQKLQllbGYuYywgcmVuYW1lZC4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUgdG8gYmUgY29mZl9zcGFyY19yZWxvY18uLi4uCi0JKHJ0eXBlMmhvd3RvKTogSW5kZXggaW50byBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlIHVzaW5nCi0JZHN0LT5yX3R5cGUuCi0KLVRodSBOb3YgMTggMTE6NDU6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLWlyaXg1Kik6IE5ldyB0YXJnZXQ7IHVzZSBtaXBzYmVsZi4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLXNnaS1pcml4NSopIE5ldyBob3N0OyB1c2UgaXJpeDUgKG5vCi0JaG9zdHMvaXJpeDUuaCBjcmVhdGVkOyBqdXN0IHVzZSBzdGQtaG9zdC5oKS4KLQkqIGNvbmZpZy9pcml4NS5taDogTmV3IGZpbGU7IGxpa2UgaXJpeDQubWgsIGJ1dCBkb24ndCB1c2UgLUcgb3IKLQktbG1hbGxvYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWNvZmZzd2FwLmg6IENoYW5nZWQgdHlwZSBvZiBpbnRlcm5hbCBwb2ludGVycyBmb3Igc3dhcCBvdXQKLQlmdW5jdGlvbnMgdG8gY29uc3QgKi4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9nb3QxNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4gIEhhbmRsZSBHT1QxNgotCWNvcnJlY3RseSBmb3IgYXNzZW1ibGVyLCBidXQgbGlua2VyIHN1cHBvcnQgbm90IGltcGxlbWVudGVkLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IFVzZSBtaXBzX2VsZl9nb3QxNl9yZWxvYyBmb3IgR09UMTYuCi0JKG1pcHNfZWxmX3N5bV9pc19nbG9iYWwpOiBOZXcgZnVuY3Rpb247IGF0IGxlYXN0IG9uIElyaXggNSwgYWxsCi0Jbm9uIHNlY3Rpb24gc3ltYm9scyBhcmUgY29uc2lkZXJlZCBnbG9iYWwuCi0JKGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpOiBEZWZpbmUuCi0JKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24uICBTZXQgdGhlIE1JUFMKLQlhcmNoaXRlY3R1cmUgbGV2ZWwgY29ycmVjdGx5LgotCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19PUFRJT05TLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogU2V0IGVudHNpemUgb2YgLm1kZWJ1ZyBvciAucmVnaW5mbwotCXNlY3Rpb24gdG8gMS4gIEhhbmRsZSAub3B0aW9ucyBzZWN0aW9uLgotCShtaXBzX2VsZl9hY29tX3NlY3Rpb24sIG1pcHNfZWxmX2Fjb21fc3ltYm9sLAotCW1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0cik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLCB1c2VkIHRvIGJ1aWxkIGEKLQlnZW5lcmljIC5hY29tbW9uIHNlY3Rpb24gdG8gaG9sZCBTSE5fTUlQU19BQ09NTU9OIHN5bWJvbHMuCi0JKG1pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogSGFuZGxlIFNITl9NSVBTX0FDT01NT04gc3ltYm9scyBieQotCXB1dHRpbmcgdGhlbSBhbGwgaW4gYSBnbG9iYWwgLmFjb21tb24gc2VjdGlvbi4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCBkdW1wIGNvcmUgaWYgdGFyZ2V0Ci0Jc2VjdGlvbiBoYXMgbm8gRUxGIHNlY3Rpb24gZGF0YS4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBTZXQgYWRkcmFsaWduIG9mIHJlbG9jIHNlY3Rpb24gdG8gNC4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOglEb24ndCBjb25zaWRlciBzZWN0aW9uIDAuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgotCUluIHRoZSBtYWluIGxvb3AsIHNraXAgdGhlIHN5bXRhYiBhbmQgc3RydGFiIHNlY3Rpb25zLCBzaW5jZSB0aGVpcgotCXBvc2l0aW9ucyBhcmUgc2V0IGVsc2V3aGVyZS4KLQkoc3dhcF9vdXRfc3ltcyk6IFNldCBhZGRyYWxpZ24gb2Ygc3ltdGFiIHNlY3Rpb24gdG8gNC4gIFNldAotCWFkZHJhbGlnbiBvZiBzdHJ0YWIgc2VjdGlvbnMgdG8gMS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBEb24ndCBjb25zaWRlciBzZWN0aW9uIDAuCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHdyaXRlIG91dCBzZWN0aW9uIDAuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGZpZWxkcwotCWVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwgYW5kIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmMzJfYmVkKTogQWRkZWQgY29ycmVzcG9uZGluZyBpbml0aWFsaXplcnMuCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmNjRfYmVkKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKHN5bV9pc19nbG9iYWwpOiBUYWtlIGFiZmQgYXJndW1lbnQuICBDYWxsCi0JZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCBpZiBpdCBpcyBub3QgTlVMTC4KLQkoZWxmX21hcF9zeW1ib2xzKTogUGFzcyBhYmZkIHRvIHN5bV9pc19nbG9iYWwuCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotCWlmIGl0IGlzIGRlZmluZWQuCi0KLVdlZCBOb3YgMTcgMTg6NDM6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJlY29mZi5oOiBJbmNsdWRlIGNvZmYvZWNvZmYuaC4KLQkoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IE1vdmUgZXh0ZXJuYWwgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0JZmllbGRzIGludG8gYSBzaW5nbGUgZmllbGQgcG9pbnRpbmcgdG8gYW4gZWNvZmZfZGVidWdfc3dhcAotCXN0cnVjdHVyZS4KLQkoZWNvZmZfZGF0YV90eXBlKTogTW92ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmllbGRzIGludG8gYSBzaW5nbGUKLQlmaWVsZCBwb2ludGluZyB0byBhbiBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4KLQkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmMsIGVjb2ZmLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotV2VkIE5vdiAxNyAxNzozODo1OCAxOTkzICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtc3dhcC5oOiBOZXcgZmlsZSB0byBzd2FwIGZpeGVkIGhlYWRlci4gIEluY2x1ZGVkIGJ5IE5MTQotCWJhY2tlbmRzLgotCSogbGlibmxtLmggKHN0cnVjdCByZWxvY19hbmRfc2VjKTogRGVmaW5lLgotCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgZml4ZWRfaGVhZGVyX3NpemUsCi0JbmxtX3JlYWRfaW1wb3J0LCBubG1fd3JpdGVfaW1wb3J0LCBubG1fc3dhcF9maGRyX2luLAotCW5sbV9zd2FwX2ZoZHJfb3V0LgotCShubG1fZml4ZWRfaGVhZGVyX3NpemUsIG5sbV9yZWFkX2ltcG9ydF9mdW5jLAotCW5sbV93cml0ZV9pbXBvcnRfZnVuYywgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luX2Z1bmMsCi0JbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dF9mdW5jLCBubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyk6IE5ldwotCWFjY2Vzc29yIG1hY3Jvcy4KLQkqIG5sbWNvZGUuaDogVXNlIG5ldyBmdW5jdGlvbnMuCi0JKiBubG0zMi1pMzg2LmM6IFByb3ZpZGUgbmV3IGZ1bmN0aW9ucy4KLQkqIG5sbTMyLXNwYXJjLmM6IE5ldyBmaWxlOyBTUEFSQyBOTE0gYmFja2VuZC4KLQotV2VkIE5vdiAxNyAxMzo1NjoxMCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmMgKHN3YXBfc3RkX3JlbG9jX2luLCBzd2FwX2V4dF9yZWxvY19pbik6IElnbm9yZQotCWdhcmJhZ2UgYml0cyBhcHBlYXJpbmcgaW4gdGhlIHVwcGVyIGVuZCBvZiBzeW1ib2xudW1zLgotCi0JKiBjb25maWcvc3BhcmMtbHlueC5tdCAoVERFRklORVMpOiBBZGQgLURGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQuCi0KLVR1ZSBOb3YgMTYgMTc6MDM6NDEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbHlueC1jb3JlLmMgKGx5bnhfY29yZV9maWxlX3ApOiAgQ2hhbmdlIGJmZF96YWxsb2MgdG8gYmZkX2FsbG9jLgotCSogbTY4a2x5bnguYzogIERlZmluZSBjb3JlIGZpbGUgbWFjcm9zLgotCSogaG9zdHMvaTM4Nmx5bnguaCwgaG9zdHMvbTY4a2x5bnguaCwgaG9zdHMvbHlueC5oOiAgTW92ZSBhbGwKLQlub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHN0dWZmIGludG8gbHlueC5oLgotCi1UdWUgTm92IDE2IDE1OjQ1OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpMzg2bGludXguYzogRGVmaW5lIG5ldyBtYWNybyBaTUFHSUNfRElTS19CTE9DS19TSVpFIHRvIDEwMjQsIGFuZAotCWNoYW5nZSBQQUdFX1NJWkUgdG8gNDA5Ni4KLQotTW9uIE5vdiAxNSAxMTo0ODowOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCi0JKiBWRVJTSU9OOiBVcGRhdGVkLgotCi1TdW4gTm92IDE0IDIzOjMzOjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IERvIG5vdCBjcmVhdGUgZHVtbXkgIi50ZXh0IiwgIi5kYXRhIiwKLQlhbmQgIi5ic3MiIHNlY3Rpb25zLgotCShzZXR1cF9zZWN0aW9ucyk6IERvIG5vdCBzZXQgU0VDX0hBU19DT05URU5UUyBpZiBhIHNlY3Rpb24ncyBzaXplCi0JaXMgemVyby4gIFJlY29nbml6ZSBCU1MgdHlwZSBzZWN0aW9ucyBhbmQgdHVybiBvZmYgU0VDX0xPQUQgYW5kCi0JU0VDX0RBVEEgKHNvIGJpbnV0aWxzL3NpemUgd29ya3MpLiAgU2V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvcgotCWEgc2VjdGlvbidzIF9yYXdfc2l6ZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFByb2dyYW0gZW50cnkgcG9pbnRzLCBhbmQgbWlsbGljb2RlIGFyZQotCWFsc28gZnVuY3Rpb25zLiAgTWFyayB0aGVtIGFzIHN1Y2guICBBbHNvIG1hcmsgTCQqIHN5bWJvbHMgYXMKLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1TYXQgTm92IDEzIDE1OjI3OjE1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBtaXNzaW5nIHByb3RvdHlwZS4gIFJldHVybnMKLQlhIHBvaW50ZXIgdG8gY29uc3RhbnQgZGF0YS4gIERlbGV0ZSBib2d1cyAjZGVmaW5lIHdoaWNoIG1hZGUgdGhlIAotCWZ1bmN0aW9uIHVzZWxlc3MuCi0KLQkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfZml4dXBzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmVnaW5fd3JpdGluZyk6IE5ldyBmdW5jdGlvbi4KLQotRnJpIE5vdiAxMiAxNToyOTozNiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEbyBub3QgYWJvcnQuICBGbGVzaCBvdXQuCi0JKHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvIG5vdCBhYm9ydC4gIEZsZXNoIG91dC4KLQotCSogc29tLmMgKHNvbV93cml0ZV9oZWFkZXJzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcHJlcF9oZWFkZXJzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHNvbV9zaXplb2ZfaGVhZGVycyk6IEFkZCBtaXNzaW5nIHByb3RvdHlwZS4KLQkoc29tX3NldF9hcmNoX21hY2gpOiBEbyBub3QgYWJvcnQuCi0KLQkqIHNvbS5jIChzb21fY291bnRfc3BhY2VzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fY291bnRfc3Vic3BhY2VzKTogTmV3IGZ1bmN0aW9uLgotCShjb21wYXJlX3N5bXMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9jb21wdXRlX2NoZWNrc3VtKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jICh0cnlfcHJldl9maXh1cCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX3NraXApOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19hZGRlbmQpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19jYWxsKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQpOiBMaWtld2lzZS4KLQkoc29tX3JlbG9jX3F1ZXVlX2ZpeCk6IExpa2V3aXNlLgotCShzb21fcmVsb2NfcXVldWVfZmluZCk6IExpa2V3aXNlLgotCi0JKiBzb20uYyAoc29tX2hwcGFfaG93dG9fdGFibGUpOiBTT00gaG93dG8gcmVsb2NhdGlvbiB0YWJsZS4KLQkoaHBwYV9zb21fcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChzdHJ1Y3QgcmVsb2NfcXVldWUpOiBOZXcgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YKLQl0aGUgbGFzdCBmb3VyIG11bHRpYnl0ZSByZWxvY2F0aW9ucyBlbWl0dGVkLgotCShlbnVtIHBhX3N5bWJvbF90eXBlKTogVHlwZSB0byBmdWxseSBkZXNjcmliZSB0aGUgc3ltYm9sIHR5cGVzCi0JYXNzb2NpYXRlZCB3aXRoIC5pbXBvcnQvLmV4cG9ydCBhc3NlbWJsZXIgZGlyZWN0aXZlcy4KLQotCSogc29tLmM6IEluY2x1ZGUgbGliaHBwYS5oCi0KLQkqIHNvbS5jIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyk6IExpa2V3aXNlLgotCShiZmRfc29tX3NldF9zeW1ib0xfdHlwZSk6IExpa2V3aXNlLgotCShiZmRfc29tX2F0dGFjaF91bndpbmRfaW5mbyk6IExpa2V3aXNlLgotCSogc29tLmg6IERlY2xhcmUgbmV3IGV4cG9ydGVkIGZ1bmN0aW9ucy4KLQotCSogc29tLmggKHN0cnVjdCBzb21fc3ltYm9sKTogQWRkIG5ldyBmaWVsZHMgdG8gaG9sZCBhZGRpdGlvbmFsCi0JaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkL3dyaXRlIHN5bWJvbCB0YWJsZXMgYW5kIGZpeHVwIHN0cmVhbXMuCi0JKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IEFkZCBuZXcgZmllbGRzIHRvIGhvbGQgYWRkaXRpb25hbAotCWluZm9ybWF0aW9uIG5lZWRlZCB0byBidWlsZC93cml0ZSBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycy4KLQkoc29tX3N5bWJvbF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3JvIGZvciBTT00gc3ltYm9sIGluZm9ybWF0aW9uLgotCShSX0hQUEFfKik6IEJhc2ljIHJlbG9jYXRpb24gdHlwZXMgdG8gYmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyLgotCi1GcmkgTm92IDEyIDExOjAwOjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogSWYgbmV3IGhvb2sKLQlUUkFEX0NPUkVfQUxMT1dfQU5ZX0VYVFJBX1NJWkUgZGVmaW5lZCwgdGhlbiBza2lwIHRoZSBjaGVjayBmb3IgdGhlCi0JY29yZWZpbGUgYmVpbmcgdG9vIGJpZy4KLQkqIGhvc3RzL2kzODZzY28uaDogRGVmaW5lIGl0LgotCi1UaHUgTm92IDExIDE1OjE2OjI4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgaHBwYWJzZF9jb3JlX2RhdGEuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBBZGQgaHBwYWJzZF9jb3JlX3ZlYy4KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiBGYWlsIGlmIGFuIHVua25vd24gY29yZQotCXNlY3Rpb24gaXMgZW5jb3VudGVyZWQgZHVyaW5nIGNvcmUgc2VjdGlvbiBzY2FubmluZy4KLQkqIGhwcGFic2QtY29yZS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oOiBFbmFibGUgSFBQQSBCU0QgY29yZSBmaWxlcy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvYyk6IFJlbW92ZSBERUZVTiBjcnVkLiAgUmVtb3ZlIGNvZGUKLQl3aGljaCBpcyBlaXRoZXIgY29tbWVudGVkIG91dCBvciBpZmRlZidkIG91dC4gIEFkZCwgdXBkYXRlIGFuZAotCWNsZWFuIGNvbW1lbnRzLiAgRml4IHZhcmlvdXMgaW5kZW50aW9uIGFuZCBzcGFjaW5nIHByb2JsZW1zLiAgSGFuZGxlCi0JcHJvYmxlbXMgcmVsYXRlZCB0byB1c2luZyAiYmxlIiB0byBqdW1wIHRvIGEgc3R1YiByYXRoZXIgdGhhbiAiYmwiCi0JKCVyMzEgaXMgdHJhc2hlZCBieSAiYmxlIiwgYnV0IG5vdCBieSAiYmwiKS4KLQkoTkVXX0lOU1RSVUNUSU9OKTogUHV0IGluc2lkZSBjdXJseSBicmFjZXMuCi0JKENVUlJFTlRfU1RVQl9PRkZTRVQpOiBGaXggaW5kZW50aW9uIHByb2JsZW1zLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IEZpeCBpbmRlbnRpb24gYW5kIHNwYWNpbmcgcHJvYmxlbXMuCi0JQWRkLCB1cGRhdGUgYW5kIGNsZWFuIGNvbW1lbnRzLiAgSGFuZGxlICJibGUiICVyMzEgbG9zc2FnZSBwcm9ibGVtcy4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IExpa2V3aXNlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoaHBwYV9lbGZfc3R1Yl9jaGVjayk6IFJlbW92ZSBvYnNvbGV0ZSBmdW5jdGlvbi4KLQotCSogaHBwYV9zdHVicy5oOiBBZGQgbmV3IGluc3RydWN0aW9ucyB0byBkZWFsIHdpdGggJXIzMSBsb3NzYWdlCi0JcHJvYmxlbXMuICBEZWxldGUgdW51c2VkIGluc3RydWN0aW9ucy4KLQkKLVR1ZSBOb3YgIDkgMTE6NDA6MjcgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtNjhrbHlueC5jIChUQVJHRVRfSVNfQklHX0VORElBTl9QKTogRGVmaW5lLgotCi1UdWUgTm92ICA5IDExOjI2OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2ggYW4gYXJyYXkKLQlvZiBhcmNoaXRlY3R1cmVzLCBnZXQgdGhlIEVMRiBFTV94eHggY29kZSBmcm9tIHRoZSBiYWNrZW5kCi0JaW5mb3JtYXRpb24uICBMZXQgdGhlIGdlbmVyaWMgRUxGIHRhcmdldCBtYXRjaCBhbnkgRU1feHh4IGNvZGUgbm90Ci0JbWF0Y2hlZCBieSBhbm90aGVyIEVMRiB0YXJnZXQuICBDYWxsIGVsZl9iYWNrZW5kX29iamVjdF9wIHRvIGxldAotCXRoZSBiYWNrZW5kIGRvIG1vcmUgY2hlY2tzIGFuZCBzZXQgZ2xvYmFsIGluZm9ybWF0aW9uLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkZWQgZWxmX21hY2hpbmVfY29kZSBhbmQKLQllbGZfYmFja2VuZF9vYmplY3RfcCBmaWVsZHMuCi0JKHN0cnVjdCBiZmRfZWxmX2FyY2hfbWFwKTogUmVtb3ZlZC4KLQkoYmZkX2VsZl9hcmNoX21hcCwgYmZkX2VsZl9hcmNoX21hcF9zaXplKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogSW5pdGlhbGl6ZSBlbGZfbWFjaGluZV9jb2RlCi0JZmllbGQgd2l0aCBFTEZfTUFDSElORV9DT0RFLiAgSW5pdGlhbGl6ZSBlbGZfYmFja2VuZF9vYmplY3RfcAotCWZpZWxkIHdpdGggZWxmX2JhY2tlbmRfb2JqZWN0X3AgKGlmIGl0IGlzIGRlZmluZWQpLgotCSogZWxmMzItZ2VuLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItaTM4Ni5jLCBlbGYzMi1pODYwLmMsCi0JZWxmMzItbTY4ay5jLCBlbGYzMi1tODhrLmMsIGVsZjMyLW1pcHMuYywgZWxmMzItc3BhcmMuYywKLQllbGY2NC1nZW4uYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmluZWQuCi0JKiBlbGYzMi1taXBzLmM6IEluY2x1ZGUgZWNvZmZzd2FwLmggdG8gZ2V0IEVDT0ZGIHN3YXBwaW5nCi0Jcm91dGluZXMuCi0JKG1pcHNfZWxmX29iamVjdF9wKTogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4KLQkobWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcCk6IERlZmluZWQuCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wKTogRGVmaW5lZCB0byBiZSBtaXBzX2VsZl9vYmplY3RfcC4KLQkoZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCk6IERlZmluZWQgdG8gYmUKLQltaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwLgotCSogZWxmLmMgKGJmZF9lbGZfYXJjaF9tYXAsIGJmZF9lbGZfYXJjaF9tYXBfc2l6ZSk6IFJlbW92ZWQuCi0KLQkqIGxpYmJmZC1pbi5oICh0YXJnZXRfdmVjdG9yLCBkZWZhdWx0X3ZlY3Rvcik6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGZvcm1hdC5jICh0YXJnZXRfdmVjdG9yLCBkZWZhdWx0X3ZlY3Rvcik6IERvbid0IGRlY2xhcmUuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBEb24ndCBjb21wbGFpbiBvbiBvdmVyZmxvdwotCWZvciBSX01JUFNfMjYuICBDb3JyZWN0IG92ZXJmbG93IGRldGVjdGlvbiByZXF1aXJlcyBtYXRjaGluZyB0aGUKLQl1cHBlciBmb3VyIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFnYWluc3QgdGhlIFBDLiAgRnJvbSBUZWQgTGVtb24KLQk8bWVsbG9uQHBlcHBlci5uY2QuY29tPi4KLQotCSogYm91dC5jIChiX291dF9yZWxvY190eXBlX2xvb2t1cCk6IFJldHVybiB0eXBlIHNob3VsZCBwb2ludCB0bwotCWNvbnN0IGRhdGEuCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKSk6IExpa2V3aXNlLgotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IE1hZGUgaG93dG8gY29uc3QuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9kYXRhKTogTWFkZSBob3cgY29uc3QuCi0KLQkqIGxpYmVsZi5oOiBBZGRlZCBzb21lIGNvbW1lbnRzLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAKLQlmaWVsZC4gIFJlbW92ZWQgdW51c2VkIHdyaXRlX3JlbG9jcyBmaWVsZC4KLQkqIGVsZjMyLXRhcmdldC5oOiBBZGp1c3RlZCBlbGZfYmFja2VuZF9kYXRhIGluaXRpYWxpemF0aW9uCi0JYWNjb3JkaW5nbHkuCi0JKiBlbGY2NC10YXJnZXQuaDogQ29ycmVjdGVkIGVsZl9iYWNrZW5kX2RhdGEgaW5pdGlhbGl6YXRpb24gdG8KLQlmaWxsIGluIGFsbCBmaWVsZHMgYW5kIHRvIHNldCBlbGZfNjRfcCB0byAxLgotCi1Nb24gTm92ICA4IDE4OjEzOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUgZHVwbGljYXRlIGFzc2lnbm1lbnQKLQl0byBmaWxlcG9zIGluIFNIVF9TVFJUQUIgY2FzZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBTZXQgQkZEIHNlY3Rpb24gZmlsZXBvcyBhcwotCXdlbGwgYXMgRUxGIHNlY3Rpb24gc2hfb2Zmc2V0LgotCi0JKiByZWxvYy5jOiBVc2UgY29uc3QgaW5zdGVhZCBvZiBDT05TVC4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IE1ha2UgdmFyaWFibGUgaG93dG8gYSBjb25zdCBwb2ludGVyLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotTW9uIE5vdiAgOCAxMjoxOToxNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHJlYWxjbGVhbik6IERvbid0IHJlbW92ZSBnZW5lcmF0ZWQgaGVhZGVycy4gIFJldmVydHMKLQljaGFuZ2Ugb2YgMiBKdWwgMTk5My4KLQotTW9uIE5vdiAgOCAwNjowODozMSAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuYmZkOiBtYWtlIHVuaXh3YXJlIGVxdWl2YWxlbnQgdG8gc3lzdjQuCi0KLQkqIGNvbmZpZy9pMzg2LW5sbS5tdDogYnJpbmcgaW4gZWxmIGNvbmZpZzsgbWFrZSBpdCB0aGUgZGVmYXVsdC4KLQotU3VuIE5vdiAgNyAyMDoyMTozOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliYmZkLmMgKGJmZF9wdXRfOCk6IEFkZCBwYXJlbnMgYXJvdW5kIHJlZmVyZW5jZSB0byAidmFsIgotCWFyZ3VtZW50LgotCi1GcmkgTm92ICA1IDIxOjQ1OjA5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4Nm1hY2gzLmggKEhPU1RfU0VHTUVOVF9TSVpFKSwKLQlpMzg2bWFjaDMuYyAoU0VHTUVOVF9TSVpFLCBURVhUX1NUQVJUX0FERFIpOiBDb3JyZWN0IHZhbHVlcyAoPykuCi0KLUZyaSBOb3YgIDUgMTU6MTc6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFplcm8gb3V0IGludGVybmFsX2EuCi0KLUZyaSBOb3YgIDUgMTA6NDE6MDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGJmZC5jLCBjYWNoZS5jLCBjb2ZmY29kZS5oLAotCWNvcmUuYywgY3Rvci5jLCBmb3JtYXQuYywgaW5pdC5jLCBsaWJiZmQuYywgb3BuY2xzLmMsIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzoKLQlEb2MgY2xlYW51cCAoc3BlbGxpbmcsIHB1bmN0dWF0aW9uLCBncmFtbWFyLCBmb3JtYXR0aW5nKS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLVRodSBOb3YgIDQgMTQ6NDY6MTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9jYWNoZWFibGUsIGJmZF9zZXRfY2FjaGVhYmxlKTogIE5ldyBhY2Nlc3NvcnMuCi0JKiBiZmQuYywgb3BuY2xzLmM6ICBJbXByb3ZlIGNvbW1lbnRzIG9uIGZpbGUgZGVzY3JpcHRvciBjYWNoZWluZy4KLQotVGh1IE5vdiAgNCAwODo1NDozMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogRnJvbSBQZXRlIEhvb2dlbmJvb20gKGhvb2dlbkBjcy51dGFoLmVkdSkKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBGaXggbG9naWMgZXJyb3IKLQlpbiBsYXN0IGNoYW5nZS4gIEFsd2F5cyByZWJ1aWxkIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiB0aGUgZmlyc3QKLQl0aW1lIHRob3VnaCBpZiBvdXRwdXQgc2VjdGlvbnMgZXhpc3QgKGZpeGVzIGxkIC1yIHByb2JsZW1zKS4KLQotVGh1IE5vdiAwNCAwODowODo0NiAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIC5QSE9OWSBmb3IgY2hlY2sgYW5kIGluc3RhbGxjaGVjayBydWxlcy4KLQotVHVlIE5vdiAgMiAxNDo0MjoyNyAxOTkzICBCaWxsIENveCAoYmlsbEB0YXJrYXMuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGFydGRhdGEpOiBVc2UgbG9uZywgbm90IHRpbWVfdCBmb3IgcG9ydGFiaWxpdHksIGF0Ci0JICBsZWFzdCB0byBIUFVYLiAgRmlsZSBiZWxvdyBpcyBhIGRlcml2ZWQgZmlsZS4KLQotVHVlIE5vdiAgMiAxNDo0MjoyNyAxOTkzICBCaWxsIENveCAoYmlsbEB0YXJrYXMuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmggKGFydGRhdGEpOiBVc2UgbG9uZywgbm90IHRpbWVfdCBmb3IgcG9ydGFiaWxpdHksIGF0Ci0JICBsZWFzdCB0byBIUFVYLgotCi1UdWUgTm92ICAyIDA5OjMyOjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgYmlnbWlwcyBmb3IgbWlwcyotKi1ic2QqLgotCi1Nb24gTm92ICAxIDE0OjMwOjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NhX3RhYmxlLCBlbGZfc2x1cnBfcmVsb2NfdGFibGUpOgotCUhhbmRsZSBzeW1ib2wgbnVtYmVyIG9mIHplcm8uCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkCi0JQkZEX1JFTE9DX01JUFNfTElURVJBTCwgQkZEX1JFTE9DX01JUFNfR09UMTYsCi0JQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlCi0JQkZEX1JFTE9DX01JUFNfTElURVJBTC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBIYW5kbGUgbmV3IHJlbG9jcy4KLQkobWlwc19lbGZfaGkxNl9yZWxvYywgbWlwc19lbGZfbG8xNl9yZWxvYyk6IFJlYXJyYW5nZSBfZ3BfZGlzcAotCWNoZWNrcyBzbGlnaHRseS4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQsIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZCwKLQlNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXQgW3NpY10pOiBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zLgotCShNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBNWV9iZmRfcmVsYXhfc2VjdGlvbiwKLQlNWV9iZmRfc2VjbGV0X2xpbmspOiBEZWZpbmUuCi0JKE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSBmcm9tCi0JTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXAuCi0JKE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IFJlbmFtZSBmcm9tIE1ZX21ha2VfZGVidWdfc3ltYm9sLgotCShNWSh2ZWMpKTogVXNlIEpVTVBfVEFCTEUgcmF0aGVyIHRoYW4gbGlzdGluZyBmdW5jdGlvbnMuCi0JKiBocDMwMGhwdXguYyAoTVlfZ2V0X3N5bXRhYiwgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwKLQlNWV9jYW5vbmljYWxpemVfcmVsb2MsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGRlZmluZSBpbgotCXRlcm1zIG9mIE1ZLCBiZWNhdXNlIHRoYXQgY2F1c2VzIGEgcmVjdXNpdmUgaW52b2NhdGlvbiBvZiBDQVQgd2hlbgotCWV4cGFuZGVkIHdpdGhpbiBKVU1QX1RBQkxFLCBhbmQgQU5TSSBjb21waWxlcnMgZG9uJ3QgZXhwYW5kCi0JcmVjdXJzaXZlIG1hY3Jvcy4KLQkqIG1pcHNic2QuYyAoTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KLQlNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCwgYW5kIGRvbid0IGRlZmluZSBpbiB0ZXJtcyBvZiBNWS4KLQkoTVlfY2Fub25pY2FsaXplX3JlbG9jKTogRG9uJ3QgZGVmaW5lIGluIHRlcm1zIG9mIE1ZLgotCShhb3V0X21pcHNfbGl0dGxlX3ZlYywgYW91dF9taXBzX2JpZ192ZWMpOiBVc2UgSlVNUF9UQUJMRSByYXRoZXIKLQl0aGFuIGxpc3RpbmcgZnVuY3Rpb25zLgotCi1Nb24gTm92ICAxIDA5OjEyOjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgbTY4ay1lbGYgZm9yIG02OCotKi1zeXN2NCouCi0KLVN1biBPY3QgMzEgMDk6MzU6NDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogTW92ZSBlbnVtIHRhcmdldF9mbGF2b3VyIG91dHNpZGUgb2Ygc3RydWN0IGFuZCBjaGFuZ2UKLQl0aGUgbmFtZSB0byBlbnVtIGJmZF9mbGF2b3VyLiAgVGhpcyBtZWFucyBiZmQgY2xpZW50cyBjYW4gdXNlIGl0LgotCSogYmZkLWluLmg6IEFkZCBtYWNybyBiZmRfZ2V0X2ZsYXZvdXIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIHNvbS5jOiBBZGQgY29tbWVudCBhYm91dCBob3cgYWJvcnQoKSBvbiBjb3JydXB0IGV4ZWN1dGFibGUgaXMgZXZpbC4KLQotU2F0IE9jdCAzMCAxMjoyNzowOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpOiBBdm9pZCBhIGdvdG8uCi0KLUZyaSBPY3QgMjkgMTY6MDQ6MzMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZW4tYW91dC5jLCBsaWJiZmQuYzogZXhpdCgxKSBpbnN0ZWFkIG9mIGV4aXQoLTEpLgotCi1GcmkgT2N0IDI5IDEzOjE3OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IEFkZGVkIGNvbW1hbmRzIGZvciBvYmplY3QgZmlsZSBmbGFnIHZhbHVlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgdHlwZSBpcyBFVF9EWU4sIHNldCBEWU5BTUlDIGZsYWcsCi0Jbm90IEVYRUNfUC4KLQkqIGJvdXQuYywgY29mZi1oODMwMC5jLCBjb2ZmLXNoLmM6IEFkZCBCRkRfSVNfUkVMQVhBQkxFIHRvCi0Jb2JqZWN0X2ZsYWdzIGZpZWxkIGZvciB0YXJnZXQgdmVjdG9yLgotCSogYWl4Mzg2LWNvcmUuYywgYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBib3V0LmMsIGNvZmYtYTI5ay5jLAotCWNvZmYtYWxwaGEuYywgY29mZi1hcG9sbG8uYywgY29mZi1oODMwMC5jLCBjb2ZmLWg4NTAwLmMsCi0JY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsIGNvZmYtbWlwcy5jLAotCWNvZmYtcnM2MDAwLmMsIGNvZmYtc2guYywgY29mZi13ZTMyay5jLCBjb2ZmLXo4ay5jLCBocHV4LWNvcmUuYywKLQlpZWVlLmMsIG1pcHNic2QuYywgbmxtLXRhcmdldC5oLCBvYXN5cy5jLCBvc2YtY29yZS5jLCBzb20uYywKLQlzcmVjLmMsIHRla2hleC5jLCB0cmFkLWNvcmUuYzoJUmVtb3ZlIERZTkFNSUMgZnJvbSBvYmplY3RfZmxhZ3MKLQlmaWVsZCBmb3IgdGFyZ2V0IHZlY3Rvci4KLQotVGh1IE9jdCAyOCAyMDowMjozMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IERvbid0IGRlY2xhcmUgdGltZTsgY2F1c2VzIGVycm9yIG9uIG1hY2gzLgotCSogY29uZmlndXJlLmluIChpMzg2bWFjaDNfdmVjKTogUmVxdWlyZSBhb3V0MzIubyBzdGFiLXN5bXMuby4KLQotVGh1IE9jdCAyOCAxNjozMzoyNiAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQlMeW54T1MgYW5kIFNwYXJjIEx5bnhPUyBjaGFuZ2VzOgotCSogY29uZmlnLmJmZDogUmVjb2duaXplIHNwYXJjLSotbHlueG9zKi4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgc3BhcmMtKi1seW54b3MqLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgU3BhcmMgTHlueCB2ZWN0b3JzLgotCSogdGFyZ2V0cy5jIChzcGFyY2x5bnhfYW91dF92ZWMpOiBEZWNsYXJlLgotCShzcGFyY2x5bnhfY29mZl92ZWMpOiBEZWNsYXJlLgotCSh0YXJnZXRfdmVjdG9yKTogQWRkIHRoZW0uCi0JKiBjZi1pMzg2bHlueC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIGkzODZseW54LWNmLmMuCi0JKiBjZi1tNjhrbHlueC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG02OGtseW54LWNmLmMuCi0JKiBjZi1zcGFyY2x5bnguYzogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIGNvZmYgaW4gU3BhcmMgTHlueE9TLgotCSogY29mZi1zcGFyYy5jOiBOZXcgZmlsZSwgYmFzaWMgU3BhcmMgY29mZiBzdXBwb3J0LgotCSogc3BhcmNseW54LmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBhLm91dCBpbiBTcGFyYyBMeW54T1MuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGZpbGVuYW1lcyBhcHByb3ByaWF0ZWx5LCBhZGQgU3BhcmMgcnVsZXMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlY29nbml6ZSBTcGFyYyBtYWdpYwotCW51bWJlci4KLQkoY29mZl9zZXRfZmxhZ3MpOiBVc2UgTHlueE9TIG1hZ2ljIG51bWJlciBmb3IgaTM4NiwgbTY4aywgYW5kCi0JU3BhcmMgTHlueE9TLCBzZXQgU3BhcmMgbWFnaWMgbnVtYmVyIGZvciBTcGFyY3MuCi0JKiBjb25maWcvbTY4ay1seW54Lm10IChTRUxFQ1RfVkVDUyk6IFJlbW92ZSByZWR1bmRhbnQgdmVjdG9yLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQ6IE5ldyBmaWxlLgotCSogaG9zdHMvaTM4Nmx5bnguaDogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgotCSogaG9zdHMvbTY4a2x5bnguaDogQWRkIGlmZGVmcywgI2RlZmluZSBvZiBjZnJlZS4KLQkqIGhvc3RzL3NwYXJjbHlueC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyOCAxNjoyMzo0MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlnY2MgLVdhbGwgbGludDoKLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IERlY2xhcmUgcmV0dXJuIHR5cGUuCi0JUmVtb3ZlIHVzZWxlc3Mgc3RhdGVtZW50IHByb2JhYmx5IGxlZnQgYnkgY29kZSBjb3B5LgotCSogY3B1LWk5NjAuYyAoY29tcGF0aWJsZSk6IEZ1bGx5IGJyYWNrZXQgbWF0cml4IGluaXRpYWxpemVyLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFVzZSBiZmRfeG1hbGxvYwotCXJhdGhlciB0aGFuIHhtYWxsb2MuICBVc2UgcmVhbGxvYyBhbmQgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQotCXJhdGhlciB0aGFuIHhyZWFsbG9jLgotCShocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IEFkZCBzb21lIGNhc3RzLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZS4gIEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCSogaHAzMDBocHV4LmM6IERlY2xhcmUgYW91dF8zMl93cml0ZV9zeW1zLgotCSogaTM4NmJzZC5jLCBpMzg2bGludXguYywgbmV0YnNkMzg2LmMgKE5fU0hBUkVEX0xJQik6IERlZmluZSBhcyAwCi0JKGRlZmluaXRpb24gZnJvbSBhb3V0L2FvdXQ2NC5oIGlzIGFsd2F5cyAwIGFueWhvdykuCi0JKiBpMzg2bHlueC5jIChzd2FwX3N0ZF9yZWxvY19pbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfaWQpOiBsZW5ndGggY2FuIG5ldmVyIGJlIG5lZ2F0aXZlLgotCShyZWFkX2lkKTogTGlrZXdpc2UuCi0JKGllZWVfYXJjaGl2ZV9wKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQkqIGxpYmNvZmYtaW4uaCAoYmZkX3BlcmZvcm1fc2xpcCk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IFJlbW92ZSB6ZXJvIGluaXRpYWxpemF0aW9uIG9mCi0Jc3RhdGljIHN0cnVjdHVyZS4KLQkqIHJlbG9jMTYuYzogSW5kZW50YXRpb24gY2hhbmdlLgotCi1XZWQgT2N0IDI3IDE2OjUxOjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9pMzg2LW1hY2gzLm10OiBVcGRhdGUgZm9yIG5ldyBjb25maWd1cmF0aW9uCi0JKC0td2l0aC10YXJnZXRzCWFuZCBzbyBvbikuCi0JKiBob3N0cy9pMzg2bWFjaDMuaDogRGVjbGFyZSBlcnJuby4KLQkqIHRhcmdldHMuYzogRGVjbGFyZSBpMzg2bWFjaDNfdmVjLgotCi1XZWQgT2N0IDI3IDEyOjE4OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbiwKLQlubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBIYW5kbGUgc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQKLQlhbmQgc2hhcmVkRGVidWdSZWNvcmRDb3VudCBmaWVsZHMuCi0KLVR1ZSBPY3QgMjYgMTY6MjE6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZSBTQ09fQ09SRS4gIE9uIFNlcCAxMSAxOTkzLAotCXdlIHN0YXJ0ZWQgdXNpbmcgdHJhZC1jb3JlLmMgZm9yIFNDTyBpbnN0ZWFkLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZS1lbmFibGUgZ2VuZXJpYyBFTEYgYW5kIE5MTSB0YXJnZXRzLgotCi1UdWUgT2N0IDI2IDE2OjUzOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IEFsaWduIHNoX29mZnNldCB0bwotCXNoX2FkZHJhbGlnbiAodGhpcyBpcyB3aGF0IFVuaXhXYXJlIGRvZXMsIGFuZCBpdCBzaG91bGRuJ3QgaHVydCkuCi0KLVR1ZSBPY3QgMjYgMTA6MTY6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlGcm9tIEplZmYgTGF3IGFuZCBQZXRlIEhvb2dlbmJvb20gYXQgVXRhaDoKLQotCSogZWxmMzItaHBwYS5oIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IEFkZCBwcm90b3R5cGUuCi0JKEVMRjMyX0hQUEFfUl9BUkdfUkVMT0MpOiBSZW5hbWVkIHdpdGhvdXQgdGhlIEVMRjMyIHByZWZpeAotCWFuZCBtb3ZlZCBpbnRvIGxpYmhwcGEuaC4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKEVMRjMyX0hQUEFfUl9DT05TVEFOVCwgRUxGMzJfSFBQQV9SX0FEREVORCk6IExpa2V3aXNlLgotCShnZXRfb3Bjb2RlIGFuZCBvcGNvZGUgZGVmaW5lcyk6IE1vdmUgaW50byBsaWJocHBhLmgKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfaW5zbjJmbXQpOiBSZW5hbWUgYW5kIG1vdmUgaW5mbwotCWxpYmhwcGEuaC4KLQkqIGxpYmhwcGEuaCAoSFBQQV9SXyopOiBNb3ZlZCBoZXJlLiAgUmVmb3JtYXR0ZWQgc2xpZ2h0bHkgdG8gbWFrZQotCWZvciBlYXNpZXIgcmVhZGluZy4KLQkoZ2V0X29wY29kZSk6IE1vdmVkIGhlcmUuICBGSVhNRSEgdGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgQyBmdW5jdGlvbgotCWluc2lkZSB0aGUgb3Bjb2RlIGxpYnJhcnkhCi0JKGJmZF9ocHBhX2luc24yZm10KTogTGlrZXdpc2UuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEVuYWJsZSBlbGYzMi1ocHBhIHZlY3Rvci4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IEFkZCBuZXcgY29tbWVudHMKLQlhbmQgY2xhcmlmeSBleGlzdGluZyBjb21tZW50cy4gIERvIG5vdCB1c2UgREVGVU4gdG8gZGVjbGFyZSB0aGlzCi0JZnVuY3Rpb24uICBGaXggbnVtZXJvdXMgaW5kZW50aW9uIHByb2JsZW1zLiAgQ29ycmVjdGx5IGhhbmRsZSBjYXNlcwotCXdoZXJlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBtYXkgbmVlZCB0byBiZSByZWFkIGZyb20gZGlzaywgCi0JcmVhZCBmcm9tIG1lbW9yeSwgb3IgYnVpbHQgdGhlbiByZWFkIGZyb20gbWVtb3J5LgotCi0JKiBlbGYzMi1ocHBhLmg6IFJlZm9ybWF0IHdpdGggZ251LWluZGVudCBhbmQgaGFuZCBmaXggbnVtZXJvdXMKLQlmb3JtYXR0aW5nIGFuZCBpbmRlbnRpb24gcHJvYmxlbXMgZ251LWluZGVudCBjYW4gbm90IGhhbmRsZS4KLQlDbGFyaWZ5IHNvbWUgY29tbWVudHMgYWJvdXQgcmVsb2NhdGlvbiB0eXBlcy4gIENvbW1lbnQgYmFzaWMKLQlyZWxvY2F0aW9uICJjbGFzc2VzIi4gIEdyb3VwIFBBUkFNIGRlY2xhcmF0aW9ucyB0b2dldGhlci4KLQkoSFBQQV9TWFRfe05VTEwsIFNZTU5EWCwgUkdfUkVMT0N9KTogTWFrZSBtZW1iZXJzIG9mIGEgbmV3IAotCWVudW1lcmF0ZWQgdHlwZSByYXRoZXIgdGhhbiAjZGVmaW5lcy4KLQotVHVlIE9jdCAyNiAwMjo0MDo0NiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzb20uYyAoaHBwYV9vYmplY3Rfc2V0dXApOiAgU2V0IFNFQ19DT0RFIGZvciAudGV4dCBzZWN0aW9uIHNvCi0JdGhhdCBHREIgY2FuIGZpZ3VyZSBvdXQgdGV4dF9zdGFydCBhbmQgdGV4dF9lbmQuCi0KLU1vbiBPY3QgMjUgMTY6MDU6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRml4IHVwIHdhcm5pbmdzIGZyb20gZ2NjIC1XYWxsOgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IFVzZSAlbHggYW5kIGNhc3Qgbl92YWx1ZSB0bwotCXVuc2lnbmVkIGxvbmcuICBVc2UgJWxkIGZvciB0YWduZHguICBVc2UgJWx4IGZvciBvZmZzZXQgKyB2bWEgYW5kCi0JY2FzdCBpdCB0byB1bnNpZ25lZCBsb25nLgotCSogZWNvZmYuYyAoZWNvZmZfZW1pdF9hZ2dyZWdhdGUpOiBVc2UgJWxkLgkKLQkoZWNvZmZfcHJpbnRfc3ltYm9sKTogVXNlICVsZCwgYW5kIGNhc3QgaW5keCBhbmQgc3ltX2Jhc2UgdG8gbG9uZy4KLQkqIGNvZmZjb2RlLmggKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBTcGVjaWZ5IHJldHVybiB0eXBlLgotCi0JKiBsaWJiZmQuYyAoYmZkX3dyaXRlKTogSWYgbm90IGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiBvdXQsIHNldAotCWJmZF9lcnJvciB0byBzeXN0ZW1fY2FsbF9lcnJvci4gIElmIHRoZSByZXR1cm4gdmFsdWUgaXMKLQlub24tbmVnYXRpdmUsIHNldCBlcnJubyB0byBFTk9TUEMgKGlmIEVOT1NQQyBpcyBkZWZpbmVkKS4KLQkoYmZkX3NlZWspOiBJZiB0aGUgc2VlayBmYWlscywgc2V0IGJmZF9lcnJvciB0byBzeXN0ZW1fY2FsbF9lcnJvci4KLQkoYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBGb3IgYSBiYWQgb2Zmc2V0ICsgY291bnQsIHNldAotCWJmZF9lcnJvciB0byBiYWRfdmFsdWUuCi0JKiBzZWNsZXQuYyAocmVsKTogRG9uJ3QgYWJvcnQuICBJbnN0ZWFkLCByZXR1cm4gZmFsc2UuCi0KLU1vbiBPY3QgMjUgMDk6NTk6MzcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLgotCi1GcmkgT2N0IDIyIDIwOjM1OjU0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogaGFuZGxlIG1pcHMqLSogaW5zdGVhZCBvZiBtaXBzLSosIHVzZSBtaXBzKmVsCi0JICBpbnN0ZWFkIG9mIG1pcHMtKi0qbAotCi1GcmkgT2N0IDIyIDE0OjAzOjMzIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIG02OGstbHlueC5tdCwgaTM4Ni1seW54Lm10IChUREVGSU5FUyk6IHNldAotCUZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRCBiZWNhdXNlIHRoZSBvYmpkdW1wLmMgZGVjbGFyYXRpb24gb2YKLQlmcHJpbnRmIGNvbGxpZGVzIHdpdGggdGhlIG5hdGl2ZSBvbmUuCi0KLUZyaSBPY3QgMjIgMTE6NTA6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBFbmFibGUgTUlQUyBFTEYgdmVjdG9ycy4KLQotRnJpIE9jdCAyMiAwNzo1MTo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIGJpZ21pcHMgZm9yIG1pcHMtc29ueS1ic2QqLgotCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlnLmJmZDogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVGh1IE9jdCAyMSAxMjoxNjoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChGSUxFX0FMSUdOKTogUmVuYW1lZCBmcm9tIEVBTElHTiwgdG8gYXZvaWQgY29uZmxpY3QKLQl3aXRoIFVsdHJpeCBoZWFkZXIgZmlsZXMuCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBSZW5hbWVkIGZyb20KLQlzb21fc2VjdGlvbl9kYXRhIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggbWFjcm8gYnkgdGhhdCBuYW1lLgotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlciBIb29nZW5ib29tIGF0IFV0YWg6Ci0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiAgVGFyZ2V0IHJlZ2lzdGVyIGZvciBhICdqdW1wCi0JaW4gZGVsYXkgc2xvdCcgb3B0aW1pemF0aW9uIGluIGNvbWJpbmF0aW9uIHdpdGggYSBsb25nIGNhbGwKLQlzdHViIHNob3VsZCBhbHdheXMgYmUgcjMxLgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogVG8gYmUgY29uc2lzdGVudAotCWFjcm9zcyBhbGwgcmVsb2NhdGlvbiB0eXBlcywgcmV0cmlldmUgaW5zdHJ1Y3Rpb24gYWRkZW5kcyBmcm9tCi0JdGhlIHJlbG9jYXRpb24gZW50cnkgcmF0aGVyIHRoYW4gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogRml4IGEgcmVsb2NhdGlvbgotCWVycm9yIHRoYXQgb25seSBvY2N1cnJlZCB3aGVuIHRoZSBhZGRlbmQgb2YgYW4gJ2FkZGlsJyBvcgotCSdsZGlsJyB3YXMgbGFyZ2VyIHRoYW4gMjEgYml0cyBhbmQgdmVyeSBjbG9zZSB0byBhIDJLIGJ5dGUKLQlib3VuZGFyeS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2MpOiAgSGFuZGxlIHRoZSBvcHRpbWl6YXRpb24gaW4KLQl3aGljaCBhIGp1bXAgaXMgcGxhY2VkIGluIHRoZSBkZWxheSBzbG90IG9mIGEgZnVuY3Rpb24gY2FsbC4KLQlUaGUganVtcCB3YXMgYmVpbmcgYWNjb21wbGlzaGVkIHZpYSBhbiBhZGp1c3RtZW50IHRvIHRoZQotCXJldHVybiBwb2ludGVyLiAgVGhpcyBvcHRpbWl6YXRpb24gd291bGQgYnJlYWsgdGhlIGxvbmcgY2FsbAotCXN0dWIgY29kZSwgaWYgdGhlcmUgd2FzIGFueS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IENvcnJlY3Rpb25zCi0JdG8gbG9uZyBicmFuY2ggc3R1YnMgdG8gYXZvaWQgdXNlIG9mIGdlbmVyYWwgcmVnaXN0ZXIgMi4KLQotCSogaHBwYV9zdHVicy5oOiBOZXcgc3R1YiBpbnN0cnVjdGlvbnMuCi0KLQkqIGVsZmNvZGUuaDogRGVjbGFyZSBiZmRfZWxmX2ZpbmRfc2VjdGlvbi4KLQotCSogc29tLmggKHNvbV9zZWN0aW9uX2RhdGEpOiBBZGQgbmV3ICJzdWJzcGFjZV9pbmRleCIgZmllbGQuCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IFNhdmUgdGhlIG9yaWdpbmFsIFNPTSBzdWJzcGFjZSBpbmRleAotCWluIHRoZSBCRkQgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhhdCBzdWJzcGFjZS4gIAotCShzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IEltcGxlbWVudC4KLQkoc29tX2dldF9zeW10YWIpOiBJbXBsZW1lbnQuCi0JKHNvbV9wcmludF9zeW1ib2wpOiBJbXBsZW1lbnQuCi0JKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCBhIHN0cmluZyB0YWJsZQotCWZyb20gYSBTT00gb2JqZWN0IGZpbGUuCi0JKHNvbV9zZWN0aW9uX2Zyb21fc3Vic3BhY2VfaW5kZXgpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZQotCXNlY3Rpb24gd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBTT00gc3Vic3BhY2UgaW5kZXguCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCB0aGUgc3ltYm9sCi0JdGFibGUgZnJvbSBhIFNPTSBvYmplY3QgZmlsZS4KLQkoc29tX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF96YWxsb2MuCi0JKHNvbV9uZXdfc2VjdGlvbl9ob29rKTogSW5pdGlhbGl6ZSBzdWJzcGFjZV9pbmRleCBmaWVsZCB0bwotCS0xIGluc3RlYWQgb2YgMC4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBGaXggcG9sYXJpdHkgb2YgdGVzdCB0byBzZXQgSEFTX1JFTE9DLgotCVNldCBFWEVDX1AgZm9yIGV4ZWN1dGFibGVzLgotCShzZXR1cF9zZWN0aW9ucyk6IENvcnJlY3RseSBpZGVudGlmeSB3aGVuIGEgc2VjdGlvbiBoYXMKLQlyZWxvY2F0aW9ucy4KLQkobG9nMik6IE5ldyBmdW5jdGlvbi4KLQkoc2V0dXBfc2VjdGlvbnMpOiBDb3JyZWN0bHkgY29udmVydCBiZXR3ZWVuIFNPTSBhbGlnbm1lbnRzIGFuZCBCRkQKLQlhbGlnbm1lbnRzLgotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBEbyBub3Qgc2V0IFNFQ19BTExPQyBvciBTRUNfTE9BRAotCWZvciBzZWN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvIFNPTSBzcGFjZXMsIGRvaW5nIHNvIGNvbmZ1c2VzCi0JbWFueSB1dGlsaXRpZXMuICBTZXQgYXNzb3J0ZWQgU0VDXyogZmxhZ3MgZm9yIFNPTSBzdWJzcGFjZXMKLQl3aGljaCBjb3JyZXNwb25kIHRvIEJGRCBzZWN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBUaGUgc3RhYgotCXN0cmluZyB0YWJsZSBzaG91bGQgaGF2ZSBzaF90eXBlID09IFNIVF9TVFJUQUIuICBBZGQKLQlwcm9jZXNzaW5nIHRvIG1ha2UgaXQgc28uCi0KLQkqIGVsZmNvZGUuaDogKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFN0cmluZyB0YWJsZXMgKG90aGVyCi0JdGhhbiAuc3RydGFiKSB3ZXJlIG5vdCBnZXR0aW5nIHRoZSBmaWxlIG9mZnNldHMgcmVjb3JkZWQsIHNvCi0JdGhleSBjb3VsZCBub3QgYmUgcmVhZCBmcm9tIGRpc2suCi0KLQkqIGVsZmNvZGUuaDogKGVsZl9tYWtlX3NlY3Rpb25zKTogIExlYXZlIHRoZSBzaF9hZGRyIGZpZWxkIG9mCi0JdGhlIHNlY3Rpb24gaGVhZGVyIGFuZCB0aGUgdm1hIGZpZWxkIG9mIGEgc2VjdGlvbiBhdCAwIGlmIHRoZQotCXNlY3Rpb24gaXMgbm90IHBhcnQgb2YgdGhlIHByb2dyYW0gZXhlY3V0aW9uIGltYWdlLiAoZS5nLiwKLQkuc3RhYikKLQotCSogc29tLltoY106IENoYW5nZSB0YXJnZXQgdmVjdG9yIHByZWZpeCBmcm9tICJocHBhIiB0byAic29tIi4KLQlDb25zaXN0ZW50bHkgdXNlIG9ial9zb20gcHJlZml4IHRvIGFjY2VzcyBmaWVsZHMgaW4gYmFja2VuZCBkYXRhCi0Jc3RydWN0dXJlcy4gIEZpeCBhbGwgY2FsbGVycy9yZWZlcmVuY2VzLgotCi0JKiBzb20uaDogRG8gbm90IGluY2x1ZGUgZmlsZXMgb25seSBuZWVkZWQgZm9yIGNvcmUgZmlsZSByZWFkaW5nIGhlcmUuCi0JSW5jbHVkZSBhLm91dCBmb3IgYm90aCBIT1NUX0hQUEFIUFVYIGFuZCBIT1NUX0hQUEFCU0QuICBEZWxldGUKLQlmb3J3YXJkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMsIHRoZXkgYXJlIHVubmVjZXNzYXJ5LgotCShzdHJ1Y3Qgc29tZGF0YSk6IERlbGV0ZSBhdXhfaGRyLCBhbmQgaHBfc3ltYm9sX2VudHJ5X3NpemUgZmllbGRzLgotCUNoYW5nZSAic3ltYm9scyIgdG8gInN5bXRhYiIuICBBZGQgInN0cmluZ3RhYiIgYW5kICJyZWxvY19maWxlcG9zIgotCWZpZWxkcyBmb3IgZnV0dXJlIHVzZS4gIENoYW5nZSBvYmpfc29tXyogbWFjcm9zIGFzIGFwcHJvcHJpYXRlLgotCShzb21fc2VjdGlvbl9kYXRhKTogTmV3IHN0cnVjdHVyZSB0byBrZWVwIFNPTSBzcGVjaWZpYyBpbmZvcm1hdGlvbgotCWFib3V0IEJGRCBzZWN0aW9ucyAoZm9yIGZ1dHVyZSB1c2UpLgotCi0JKiBzb20uYzogUHJvdmlkZSBQQVJBTVMgZGVjbGFyYXRpb25zIGZvciBhbGwgZnVuY3Rpb25zIGN1cnJlbnRseQotCWluIHRoaXMgZmlsZS4KLQkoc3RydWN0IGNvbnRhaW5lcik6IERlbGV0ZSB1bndhbnRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLQkoc29tX29iamVjdF9zZXR1cCk6IEFkZCBjb21tZW50cy4gIFVzZSBzb21fbWtvYmplY3QgdG8gYWxsb2NhdGUKLQlTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24gaW4gdGhlIEJGRDsgdXNlIGluZm9ybWF0aW9uIGZyb20gdGhlCi0JZmlsZSBhbmQgKHBvc3NpYmx5IGVtcHR5KSBhdXhpbGlhcnkgaGVhZGVycyB0byBpbml0aWFsaXplIHRoaXMKLQlpbmZvcm1hdGlvbi4gIERlbGV0ZSByZWR1bmRhbnQgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgImNhbGxzIi4KLQkoc2V0dXBfc2VjdGlvbnMpOiBSZXR1cm4gdHlwZSBpcyBub3cgYm9vbGVhbiwgZml4IHJldHVybiBzdGF0ZW1lbnRzLgotCSJGaXgiIGhhbmRsaW5nIG9mIEJTUyBsaWtlIHN1YnNwYWNlcyBpbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlCi0JY29udGFpbmluZyBzcGFjZSdzIHNpemUuICBJZiB0aGUgc3Vic3BhY2UgaGFzIHJlbG9jYXRpb25zLCBzZXQgdGhlCi0JYXBwcm9wcmlhdGUgQkZEIHNlY3Rpb24gZmxhZ3MgYW5kIHJlY29yZCB0aGUgaW5kZXggaW50byBhbmQgdGhlCi0Jc2l6ZSBvZiB0aGUgZml4dXAgc3RyZWFtLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShzb21fb2JqZWN0X3ApOiBTZXQgYmZkX2Vycm9yIGFwcHJvcHJpYXRlbHkgaWYgZXJyb3JzIGFyZSBkZXRlY3RlZAotCWZyb20gYmZkX3tyZWFkLHNlZWt9IGZ1bmN0aW9ucy4gIEhhbmRsZSBFWEVDTElCTUFHSUMgdHlwZSBmaWxlcy4KLQlEbyBub3QgdHJ5IHRvIHJlYWQgYSBub24tZXhpc3RhbnQgYXV4aWxpYXJ5IGhlYWRlci4KLQkoc29tX21rb2JqZWN0KTogRmxlc2ggb3V0LgotCShzb21fc2VjdGlvbl9ob29rKTogQWxsb2NhdGUgc3BhY2UgdG8gaG9sZCBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24KLQlhYm91dCBzZWN0aW9ucy4KLQotVGh1IE9jdCAyMSAxMjo0MTozNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogY29mZi1oODMwMC5jLCBjb2ZmY29kZS5oOiBDaGFuZ2Ugc2hyaW5rIHBhcmFtZXRlcgotCWluICpfcmVsb2MxNl9lc3RpbWF0ZSB0byB1bnNpZ25lZCB0byBtYXRjaCBwcm90b3R5cGUuCi0JKiBhcmNoaXZlLmM6IEF2b2lkICIvKiIgaW4gY29tbWVudC4KLQotVGh1IE9jdCAyMSAxMzowNToxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRlcC1pbi5zZWQ6IENyZWF0ZSBvdXIgb3duIGxpbmUgYnJlYWtzIGZvciBhIG1vcmUgYWVzdGhldGljCi0JTWFrZWZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZjMyLW1pcHMuYzogSW5jbHVkZSAic2VjbGV0LmgiLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRm9yY2Ugc2l6ZSBvZiAucmVnaW5mbyBzZWN0aW9uIHRvIHNpemVvZgotCUVsZjMyX0V4dGVybmFsX1JlZ0luZm8uCi0JKG1pcHNfZWxmX3NlY2xldF9saW5rKTogTmV3IGZ1bmN0aW9uLiAgTGluayB0aGUgLnJlZ2luZm8gc2VjdGlvbgotCXNwZWNpYWxseSwgYW5kIHBhc3MgZXZlcnl0aGluZyBlbHNlIHRvIHRoZSBnZW5lcmljIHJvdXRpbmUuCi0JKGJmZF9lbGYzMl9iZmRfc2VjbGV0X2xpbmspOiBEZWZpbmUgbWFjcm8uCi0JKiBlbGYzMi10YXJnZXQuaDogSWYgYmZkX2VsZjMyX2JmZF9zZWNsZXRfbGluayBpcyBhbHJlYWR5IGRlZmluZWQsCi0JZG9uJ3Qgb3ZlcnJpZGUgaXQuCi0KLVdlZCBPY3QgMjAgMTI6MjI6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIHNpZ25hdHVyZSBmaWVsZC4KLQkobmxtX3NpZ25hdHVyZSk6IE5ldyBtYWNyby4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wLCBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIHRoZSBOTE0KLQlzaWduYXR1cmUgZnJvbSB0aGUgYmFja2VuZCByYXRoZXIgdGhhbiB0aGUgY29uc3RhbnQgTkxNX1NJR05BVFVSRS4KLQkqIG5sbTMyLWkzODYuYyAobmxtMzJfaTM4Nl9iYWNrZW5kKTogSW5pdGlhbGl6ZSBzaWduYXR1cmUgZmllbGQuCi0KLQkqIGFvdXRmMS5oIChNQUNIVFlQRV9PSyk6IEFjY2VwdCBNX1VOS05PV04uCi0JKE5BTUUoc3Vub3Msc2V0X2FyY2hfbWFjaCkpOiBUcmVhdCBNX1VOS05PV04gYXMgNjgwMDAsIG5vdCA2ODAyMC4KLQotV2VkIE9jdCAyMCAxMDoyODoyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmJzZC5oIFtfX2JzZGlfX106IERlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUi4KLQotV2VkIE9jdCAyMCAxMDoxMDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6IE5ldyB2YXJpYWJsZSwgZm9yIHVzZSBpbiAibWFrZSBkZXAiLgotCSguZGVwKTogRGVwZW5kIG9uICQoQ0ZJTEVTKSBhbmQgJChIRklMRVMpLiAgRGVsZXRlIC5kZXAxIGFuZAotCXJlbWFrZSBpdCwgc28gdGhhdCAiJD8iIGlzIGNvbXBsZXRlLgotCSguZGVwMSk6IERvbid0IG5lZWQgdG8gcmVtb3ZlIC5kZXAxIGZpcnN0LgotCShkZXAuc2VkKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMsIG5vdCBNYWtlZmlsZS4KLQkoQ0ZJTEVTKTogQWRkIG5sbS5jLgotCi1UdWUgT2N0IDE5IDE1OjI2OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jOiBJbXBsZW1lbnRlZCByZWxvYyBoYW5kbGluZyBmb3IgdGhlIGxpbmtlciwgbWFkZQotCXZhcmlvdXMgb3RoZXIgcmVsYXRlZCBjaGFuZ2VzLgotCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgcmRhdGFfaW5fdGV4dCBmaWVsZC4KLQlSZW5hbWVkIGZpbmlzaF9yZWxvYyB0byBhZGp1c3RfcmVsb2NfaW4uICBBZGRlZCBhZGp1c3RfcmVsb2Nfb3V0Ci0JZmllbGQuCi0JKGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndCBkZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncywgZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOgotCUhhbmRsZSAubGl0YSBzZWN0aW9uLgotCShlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IEhhbmRsZSBSRUxPQ19TRUNUSU9OX0ZJTkkuCi0JZmluaXNoX3JlbG9jIGJhY2tlbmQgZmllbGQgcmVuYW1lZCB0byBhZGp1c3RfcmVsb2NfaW4uCi0JKGVjb2ZmX2JmZF9zZWNsZXRfbGluayk6IEFkanVzdCBudW1iZXIgb2YgYXV4IGVudHJpZXMgdG8KLQlkZWJ1Z19hbGlnbiBib3VuZGFyeS4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgcmRhdGFfaW5fdGV4dCBwdXQKLQkucmRhdGEgc2VjdGlvbiBpbiB0ZXh0IHNlZ21lbnQsIG5vdCBkYXRhIHNlZ21lbnQuICBQdXQgLnBkYXRhCi0Jc2VjdGlvbiBpbiB0ZXh0IHNlZ21lbnQuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgQWxzbywgY2FsbAotCWFkanVzdF9yZWxvY19vdXQsIGFuZCBoYW5kbGUgLmxpdGEsIC54ZGF0YSwgLnBkYXRhLCAuZmluaSBhbmQKLQlhYnNvbHV0ZSBzZWN0aW9ucyB3aGVuIHdyaXRpbmcgb3V0IHJlbG9jcy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEZvciBBTFBIQUVDT0ZGLCBvdXRwdXQgMiBmb3IKLQlibGRyZXYgZmllbGQsIGFzIG9uIEFscGhhIE9TRi8xLiAgUGFkZGluZyBmaWVsZCBpcyBub3cgMiBieXRlcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogQWRkZWQgYXNzZXJ0aW9uLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IFJlbmFtZWQgZnJvbSBtaXBzX2ZpbmlzaF9yZWxvYy4KLQkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogTmV3IGZ1bmN0aW9uIChkb2VzIG5vdGhpbmcpLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoZWNvZmZfYmZkX2dldF9yZWxvY2F0aW9uX3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUgdG8gYmUKLQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGRlZCBjYXN0cyB0byBhdm9pZCBBbHBoYQotCU9TRi8xIGNjIGJ1Zy4KLQotVGh1IE9jdCAxNCAwMToxMDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGQgY29tbWVudHMgYXR0ZW1wdGluZyB0bwotCWV4cGxhaW4gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRG9uJ3Qgc2V0IFNFQ19ERUJVR0dJTkcgdW50aWwgaXQKLQlpcyBtYWRlIHRvIHdvcmsuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmVtb3ZlIGNoZWNrIGZvcgotCVVTRV9ESVNDQVJERURfU0VDVElPTlNfQ09VTlQuCi0JKiBjb2ZmLWkzODYuYzogRG9uJ3QgZGVmaW5lIFVTRV9ESVNDQVJERURfU0VDVElPTlNfQ09VTlQuICBCYXNpbmcKLQlpdCBvbiBob3N0IGRlZmluZXMgaXMgd3JvbmcuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9zZWNsZXRfbGluayk6IERvbid0IGxpbmsgYSAucmVnaW5mbyBzZWN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCByZXF1aXJlIHRoZSAucmVnaW5mbyBzZWN0aW9uCi0JdG8gYmUgYSBwYXJ0aWN1bGFyIHNpemUuCi0KLVdlZCBPY3QgMTMgMTg6Mzk6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGVwLWluKTogTmV3IHJ1bGUsIGZvciBlZGl0aW5nIGRlcGVuZGVuY2llcyBpbnRvCi0JTWFrZWZpbGUuaW4gaW4gJChzcmNkaXIpLiAgVXNlIG1vdmUtaWYtY2hhbmdlLgotCSguZGVwMSwgZGVwKTogVXNlIG1vdmUtaWYtY2hhbmdlLgotCShDRklMRVMpOiBBZGQgY29mZi1hcG9sbG8uYy4KLQotCVN1biBPY3QgMTAgMTg6MDI6NTYgMTk5MyAgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuRURVLkFVKQotCi0JKiBNYWtlZmlsZS5pbjogUmVjb2duaXNlIG5ldyBmaWxlLCBjb2ZmLWFwb2xsby5vCi0KLQkqIGNvZmYtYXBvbGxvLmM6IE5ldyBmaWxlCi0KLQkqIGNvZmZjb2RlLmg6IFJlY29nbmlzZSBhcG9sbG8gbWFnaWMgbnVtYmVycyBhbmQgd3JpdGFibGUgdGV4dAotCi0JKiBjb2Zmc3dhcC5oOiBTd2FwIEFwb2xsbyBvcHRpb25hbCBoZWFkZXIgZW50cmllcwotCi0JKiBjb25maWcuYmZkOiBBZGQgbGluZSBmb3IgQXBvbGxvCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZXBsYWNlIGFwb2xsbzY4YiBhbmQgYXBvbGxvNjh2IHdpdGggQXBvbGxvCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXNlIGFwb2xsb2NvZmZfdmVjCi0KLQkqIHRhcmdldHMuYzogTGlrZXdpc2UKLQotCSogY29uZmlnL2Fwb2xsby5taCwgY29uZmlnL2Fwb2xsby5tdDogTmV3IGZpbGVzCi0KLQkqIGhvc3RzL2Fwb2xsbzY4Lmg6IFJlbW92ZSBpbmNsdXNpb24gb2Ygc3RyaW5ncy5oCi0KLVdlZCBPY3QgMTMgMTQ6Mjg6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogTm93IHN0YXRpYy4KLQotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgZGVwZW5kZW5jaWVzLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCk6IE5ldyB0YXJnZXRzLCB0byBtYWtlICJtYWtlIGRlcCIgd29yawotCWJldHRlci4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi0JKiBtNjhrbHlueC1jZi5jIChPTkxZX0RFQ0xBUkVfUkVMT0NTKTogRGVmaW5lLCB0byBhdm9pZCBuYW1lCi0JY29uZmxpY3RzIHdoZW4gIi0td2l0aC10YXJnZXRzPWFsbCIuCi0JKiBjb2ZmLW02OGsuYyAobTY4a2NvZmZfaG93dG9fdGFibGUsIG02OGtfcnR5cGUyaG93dG8sCi0JbTY4a19ob3d0bzJydHlwZSk6IFJlbmFtZSB2aWEgbWFjcm9zIHRvIGtlZXAgbmFtZXNwYWNlIGNsZWFuLgotCSogY29uZmlndXJlLmluOiBGb3IgbTY4a2x5bnhfY29mZl92ZWMsIGluY2x1ZGUgY29mZi1tNjhrLm8gZm9yCi0Jbm93LgotCi1UdWUgT2N0IDEyIDE3OjAzOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIGRvIHJlbG9jYXRpb25zIGFuZCB0bwotCWhhbmRsZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLgotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBQYXNzIGZvdXJ0aCBhcmd1bWVudCB0bwotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiB0byBwZXJtaXQgaXQgdG8gY29udHJvbCB0aGUKLQlzZWN0aW9uIGluZGV4IHRvIHVzZS4KLQkoZWxmX29ial90ZGF0YSk6IEFkZCBncCBhbmQgZ3Bfc2l6ZSBmaWVsZHMuCi0JKGVsZl9ncCwgZWxmX2dwX3NpemUpOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCSogZWxmY29kZS5oOiBSZW1vdmVkIGEgbnVtYmVyIG9mIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2xlYXIgc2VjdGlvbiBoZWFkZXIgYmVmb3JlIGNhbGxpbmcKLQllbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLCBub3QgYWZ0ZXIuCi0JKHByZXBfaGVhZGVycyk6IFJldHVybiB0cnVlIGF0IGVuZC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFBhc3MgcmV0dmFsIGFyZ3VtZW50IHRvCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKToKLQlBY2NlcHQgYW5kIGlnbm9yZSBuZXcgcmV0dmFsIGFyZ3VtZW50LgotCSogYmZkLmM6IEluY2x1ZGUgbGliZWxmLmguCi0JKGJmZF9zZXRfZ3Bfc2l6ZSk6IEhhbmRsZSBFTEYgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluIChiZmQubyk6IERlcGVuZHMgdXBvbiBsaWJlbGYuaC4KLQkoZWxmMzItbWlwcy5vKTogRGVwZW5kcyB1cG9uICQoSU5DRElSKS9lbGYvbWlwcy5oLgotCi1Nb24gT2N0IDExIDE3OjI1OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3QpOiBDaGVjayBiZmRfbWFrZV9zZWN0aW9uIHJldHVybiB2YWx1ZS4KLQkoZWNvZmZfbWtvYmplY3RfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfbmV3X3NlY3Rpb25faG9vaywgZWNvZmZfc2l6ZW9mX2hlYWRlcnMsCi0JZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cywKLQllY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgZHVtbXkgUkVHSU5GTyBzZWN0aW9uLgotCShlY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgcmVhZGluZwotCVJFR0lORk8gc2VjdGlvbi4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIGZyb20gbWFjcm8KLQlkZWZpbml0aW9uIHRvIGZ1bmN0aW9uIHByb3RvdHlwZS4KLQkoZWNvZmZfbWtvYmplY3RfaG9vayk6IE5ldyBwcm90b3R5cGUuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiBSZW1vdmVkLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgZWNvZmZfbWtvYmplY3RfaG9vay4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiBSZW1vdmVkLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFVzZSBlY29mZl9ta29iamVjdF9ob29rLgotCi1GcmkgT2N0ICA4IDE1OjI1OjMzIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbGliYmZkLmMgKGJmZF9nZXQqMzIsIGJmZF9nZXQqNjQpOiAgUHJldmVudCBBTlNJIHNpZ24gZXh0ZW5zaW9uCi0JYnkgY2FzdGluZyB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIHRvIGJmZF92bWEuCi0KLUZyaSBPY3QgIDggMDI6MzQ6MjEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBEbyBub3QgZGVmaW5lIFNFTEVDVF9WRUNTLCBTRUxFQ1RfQVJDSElURUNUVVJFUwotCWlmIGNvbmZpZ3VyaW5nIC0td2l0aC10YXJnZXRzPWFsbC4KLQotVGh1IE9jdCAgNyAxNzozNDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6IENvcnJlY3QgdGhlICJzaXplIiBmaWVsZCBpbiBzb21lCi0JZW50cmllcy4KLQotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6IENoYW5nZSBkb2N1bWVudGF0aW9uIHRvIGRpc3BlbCBhbnkKLQlub3Rpb24gdGhhdCB0aGUgInNpemUiIGZpZWxkIGlzIGEgcG93ZXItb2YtdHdvIGluZGljYXRvci4KLQotVGh1IE9jdCAgNyAxMDo1MDozOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0gICAgICAgKiBjb2Zmc3dhcC5oOiAoYmZkX3N3YXBfcmVsb2NfaW4pOiBhIHN5bW5keCBpcyBzaWduZWQuCi0KLQlNYWtlIHN1cHBvcnQgZm9yIHJlbGF4aW5nIG1vcmUgZ2VuZXJpYy4KLQkqIHJlbG9jMTYuYzogQWRkIG5ldyB0YXJnZXQgZW50cnkgLSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlLAotCWZpeCBiaXQgcm90LgotCSogbGliY29mZi5oLCBsaWJjb2ZmLWluLmg6IGRlY2xhcmF0aW9ucy4gUHJvdG90eXBlcwotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBBZGQgY2FsbHMgdG8KLQljb2ZmX3JlbG9jXzE2X2V4dHJhX2Nhc2VzIGFuZCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUuCi0JKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBOZXcgZnVuY3Rpb24KLQotVGh1IE9jdCAgNyAxNDoyNDoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoRUFMSUdOKTogRGVmaW5lLCBkZXBlbmRlbnQgb24gQVJDSF9TSVpFLgotCShhbGlnbl9maWxlX3Bvc2l0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbG9jYXRlX3NoKTogRGlzYWJsZWQgZnVuY3Rpb24gZGVsZXRlZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBBbGlnbiBwb3NpdGlvbiwKLQl0aGVuIHBsYWNlIHN5bXRhYiwgdGhlbiBkbyBvdGhlciBzZWN0aW9ucy4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBBbGlnbiBwcm9ncmFtIGhlYWRlci4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBbGlnbiBzZWN0aW9uIGhlYWRlcnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogQWxpZ24gcmVsb2NhdGlvbiBzZWN0aW9ucy4KLQotVHVlIE9jdCAgNSAxMDo0NDozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCi0JQ2hhbmdlIG90aGVyIGhwcGEgZW50cmllcyB0byB1c2UgLSotIG5vdCAtaHAtLgotCSogY29uZmlnLmJmZDogUmVjb2duaXplIGhwcGEqLSotaGl1eCogKGN1cnJlbnRseSBzeW5vbnltIGZvciBocHV4KS4KLQotCSogY29mZi1yczYwMDAuYywgY3B1LXJzNjAwMC5jLCByczYwMDAtY29yZS5jOiBDaGFuZ2Ugbm9uLUFTQ0lJCi0JY2hhcmFjdGVycyBpbiBjb21tZW50IHRvIG9jdGFsIGVzY2FwZXMuCi0KLVN1biBPY3QgIDMgMTI6MzU6MTUgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODZseW54LmM6IFJlbW92ZWQsIG5hbWUgdG9vIGxvbmcuCi0JKiBpMzg2bHlueC1jZi5jOiBOZXcgZmlsZSwgd2FzIGNvZmYtaTM4Nmx5bnguYy4KLQkqIGNvbmZpZ3VyZS5pbjogUmVmbGVjdCBmaWxlIG5hbWUgY2hhbmdlcy4KLQkqIE1ha2VmaWxlLmluOiBNZW50aW9uIEx5bngtcmVsYXRlZCBmaWxlcy4KLQotCSogaTM4Nmx5bnguYyAobHlueF8zMl9zd2FwX2V4dF9yZWxvY19pbik6IGdldCByZWxvYyBiaXRzIGluIGkzODYKLQlMeW54LXNwZWNpZmljIHdheS4KLQotCSogbTY4a2x5bngtY2YuYzogTmV3IGZpbGUsIGRlZmluZXMgY29mZiBmb3JtYXQgZm9yIE02OEsgTHlueE9TLgotCSogbTY4a2x5bnguYzogUmVtb3ZlIGNvZmYgdmVjdG9yIGRlZmluaXRpb24sIG5vdyBpbiBtNjhrbHlueC1jZi5jLgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IFNldCBzZWN0aW9uIGZsYWcgdG8gU1RZUF9JTkZPCi0JZm9yIC5zdGFiLCAuc3RhYnN0ciBhbmQgLmRlYnVnIHNlY3Rpb25zLCBhbmQgc2V0IFNFQ19ERUJVR0dJTkcgZm9yCi0Jc2VjdGlvbnMgb2YgdHlwZSBTVFlQX0lORk8uICAoZnJvbSBNaW5oIFRyYW4tTGUpCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIGRpc2NhcmRlZF9zZWN0aW9uc19jb3VudAotCXRvIGFiZmQtPnNlY3Rpb25fY291bnQsIHdoaWNoIGhlbHBzIGBzdHJpcCcga2VlcCB0aGUgc2l6ZQotCW9mIHRoZSBleGVjdXRhYmxlIGhlYWRlciBjb25zdGFudC4KLQkqIGNvZmYtaTM4Ni5jIChkaXNjYXJkZWRfc2VjdGlvbnNfY291bnQpOiBOZXcgdmFyaWFibGUsIGluaXRpYWxpemVkCi0JdG8gemVyby4gIEZvciB1c2UgYnkgYHN0cmlwJy4gIEN1cnJlbnRseSBiZWluZyB1c2VkIG9ubHkgaW4gYWl4Mzg2Ci0JY29mZiwgYnV0IG1heSBiZSB1c2VmdWwgZm9yIG90aGVyIGNvZmYgc3lzdGVtcy4gIChmcm9tIE1pbmggVHJhbi1MZSkKLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogQWRkZWQgYSBtaXNzaW5nIGNhc3QuCi0KLQkqIGFyY2hpdmUuYzogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgotCSogb3BuY2xzLmM6IENvc21ldGljIGltcHJvdmVtZW50cy4KLQkobmV3X2JmZCk6IFJlbW92ZWQgcmVkdW5kYW50IHN0cnVjdHVyZSBzbG90IGluaXQuCi0KLVNhdCBPY3QgIDIgMTg6NDg6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9uZXdzLW1pcHMubWgsIGhvc3RzL25ld3MtbWlwcy5oOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIG5ld3MtbWlwcyBmb3IgbWlwcy1zb255LWJzZCouCi0KLUZyaSBPY3QgIDEgMTM6MTQ6MTcgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGkzODZseW54X2NvZmZfdmVjIHJlcXVpcmVzIGNvZmYtaTM4Nmx5bnguby4KLQkqIGNvZmYtaTM4Nmx5bnguYzogTmV3IGZpbGUsIGRlZmluZXMgTHlueCB0YXJnZXQgdmVjdG9yIGFuZCBuYW1lLAotCWluY2x1ZGVzIGNvZmYtaTM4Ni5jLgotCSogY29mZi1pMzg2LmMgKGkzODZjb2ZmX3ZlYyk6IEFsbG93IHJlZGVmaW5pdGlvbiBvZiB0YXJnZXQgdmVjdG9yCi0Jc3ltYm9sIGFuZCBuYW1lLCBpZiBUQVJHRVRfU1lNIGFuZC9vciBUQVJHRVRfTkFNRSBhcmUgZGVmaW5lZC4KLQkqIGkzODZseW54LmM6IFJlbW92ZSBjb2ZmIHZlY3RvciBkZWZpbml0aW9uIGVudGlyZWx5LgotCShseW54XzMyX3N3YXBfZXh0X3JlbG9jX2luKTogRGVmaW5lLgotCShseW54XzMyX3N3YXBfc3RkX3JlbG9jX2luKTogRGVmaW5lLCBnZXQgcmVsb2MgYml0cyBpbiBpMzg2Ci0JTHlueC1zcGVjaWZpYyB3YXkuCi0JKGx5bnhfMzJfc3dhcF9leHRfcmVsb2Nfb3V0KTogRGVmaW5lLgotCShseW54XzMyX3N3YXBfc3RkX3JlbG9jX291dCk6IERlZmluZS4KLQkobHlueF8zMl9zbHVycF9yZWxvY190YWJsZSk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQkobHlueF8zMl9zcXVpcnRfb3V0X3JlbG9jcyk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQkobHlueF8zMl9jYW5vbmljYWxpemVfcmVsb2MpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0JKFdSSVRFX0hFQURFUlMpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQgKFNFTEVDVF9WRUNTKTogUmVtb3ZlIHJlZHVuZGFudCB2ZWN0b3IuCi0KLVRodSBTZXAgMzAgMTc6NTA6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV90eXBlKTogQWRkIGxpbmthZ2UtdGFibGUgcmVsYXRpdmUKLQlyZWxvY2F0aW9ucyBvZiBzaXplIDgsIDE2LCAzMi4gIFNvcnQgZ2VuZXJpYyByZWxvY3MgYnkgdHlwZSByYXRoZXIKLQl0aGFuIHNpemUuICBBZGRlZCBhIGxpdHRsZSBkb2N1bWVudGF0aW9uIHRvby4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkKTogQWRkIEJBU0UxNiBhbmQgQkFTRTMyIHJlbG9jcy4KLQkoVEFCTEVfU0laRSk6IE5ldyBtYWNyby4KLQkocmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX3sxNiwzMn1fQkFTRVJFTCBmb3Igc3RkCi0JcmVsb2NzLgotCShzd2FwX3N0ZF9yZWxvY19vdXQpOiBXcml0ZSBiYXNlcmVsIHJlbG9jcyBjb3JyZWN0bHkuCi0JKHN3YXBfc3RkX3JlbG9jX2luKTogSGFuZGxlIHJfYmFzZXJlbCBmaWVsZC4gIEFzc2VydCB0aGF0Ci0Jcl9qbXB0YWJsZSBhbmQgcl9yZWxhdGl2ZSBmaWVsZHMgYXJlIGNsZWFyLCBhbmQgdGhhdCB0aGUgY29tcHV0ZWQKLQlpbmRleCBkb2VzIHJlZmVyIHRvIGEgZGVmaW5lZCBlbnRyeSBvZiB0aGUgaG93dG8gdGFibGUuCi0KLVR1ZSBTZXAgMjggMTQ6NDc6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBOZXcgZnVuY3Rpb24uCi0JKiBzZWN0aW9uLmM6IENoYW5nZSBjb21tZW50cyB0byBzYXkgc2V2ZXJhbCBzZWN0aW9ucyBjYW4gaGF2ZQotCXRoZSBzYW1lIG5hbWUuCi0JKiBiZmQtaW4yLmg6IFJlLWdlbmVyYXRlIHRvIHJlZmxlY3QgYWJvdmUgY2hhbmdlLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBDYWxsIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5Ci0JaWYgc3RpbGwgbm8gc2VjdGlvbiBhZnRlciB0aGUgYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2suCi0JKiBjb2ZmY29kZS5oOiBBZGQgY29tbWVudCBhYm91dCBUV09fREFUQV9TRUNTLgotCi1UdWUgU2VwIDI4IDAzOjIyOjI0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6ICBBbHdheXMgZGV0ZXJtaW5lIHJhd19zaXplCi0JZXhwbGljaXRseS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzLCBlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6ICBIYW5kbGUKLQkuZmluaSBzZWN0aW9uLgotCi1Nb24gU2VwIDI3IDE4OjI5OjE4IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCBjb25maWd1cmUuaG9zdDogTWF0Y2ggb24gKi1seW54b3MqIGZvciBMeW54T1MsCi0JYWRkIG02OCotKi1seW54b3MqLgotCSogY29uZmlndXJlLmluIDogUmVwbGFjZWQgaTM4Nmx5bnhfdmVjIHdpdGggaTM4Nmx5bnhfYW91dF92ZWMKLQlhbmQgaTM4Nmx5bnhfY29mZl92ZWMuCi0JQWRkZWQgbTY4a2x5bnhfYW91dF92ZWMgYW5kIG02OGtseW54X2NvZmZfdmVjLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmVtb3ZlZCBpMzg2bHlueF92ZWMsIGFkZGVkCi0Je2kzODYsbTY4a31seW54X3thb3V0LGNvZmZ9X3ZlYy4KLQkqIGkzODZseW54LmM6IEFkZGVkIGNvcHkgb2YgaTM4NmNvZmYuYywgcmVuYW1lZCBiZmQgdGFyZ2V0IHRvCi0JaTM4Nmx5bnhfY29mZl92ZWMuCi0JKiBtNjhrbHlueC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQ6IFJlcGxhY2VkIGkzODZseW54X3ZlYyB3aXRoIGkzODZseW54X2FvdXRfdmVjCi0JYW5kIGkzODZseW54X2NvZmZfdmVjLgotCSogY29uZmlnL202OGstbHlueC5tdDogTmV3IGZpbGUuCi0JKiBob3N0cy9pMzg2bHlueC5oOiBBZGRlZCBkZWZpbml0aW9uIG9mIGNmcmVlIGFzIGZyZWUgKGZyb20gRWljaGluKS4KLQkqIGhvc3RzL202OGtseW54Lmg6IE5ldyBmaWxlLgotCi1Nb24gU2VwIDI3IDE4OjAwOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6IERlZmluZSBvZmZzZXRvZiBoZXJlLgotCSogaG9zdHMvKi5oOiBEb24ndCBkZWZpbmUgaXQgaGVyZS4KLQotTW9uIFNlcCAyNyAxOTowOToyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogU2V0IGZpbGVwb3MgZm9yIFNIVF9TVFJUQUIKLQlzZWN0aW9uLgotCi1GcmkgU2VwIDI0IDE1OjQ3OjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHV4LWNvcmUuYzogQWRkIGNvbW1lbnQgYWJvdXQgaHB1eCB2ZXJzaW9uIDcuCi0KLUZyaSBTZXAgMjQgMTY6NTA6MjYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbHlueC1jb3JlLmMgKGx5bnhfY29yZV9maWxlX3ApOiAgQ2hhbmdlIHBlci10aHJlYWQgcmVnaXN0ZXIKLQlzZWN0aW9uIG5hbWVzIGZyb20gLnJlZ1hYWCB0byAucmVnL1hYWCB0byBhdm9pZCBwYXJzaW5nIGFtYmlndWl0eQotCWluIGdkYi9jb3JlbG93LmMuICBDcmVhdGUgYWxpYXMgLnJlZyBzZWN0aW9uIGZvciB0aGUgY3VycmVudGx5Ci0JcnVubmluZyB0aHJlYWQuCi0KLUZyaSBTZXAgMjQgMTM6MjI6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJlY29mZi5oIChlY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGJpZ19tYWdpYyBhbmQKLQlsaXR0bGVfbWFnaWMgZmllbGRzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGluaXRpYWxpemF0aW9uCi0Jb2YgYmlnX21hZ2ljIGFuZCBsaXR0bGVfbWFnaWMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWRfZm9ybWF0X2hvb2spOiBNYWtlIHN1cmUgbWFnaWMgbnVtYmVyCi0JbWF0Y2hlcyBlbmRpYW5lc3Mgb2YgYmZkLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgaW5pdGlhbGl6YXRpb24gb2YgYmlnX21hZ2ljIGFuZAotCWxpdHRsZV9tYWdpYy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFNldCBNSVBTIG1hY2hpbmUgbnVtYmVyCi0JYmFzZWQgb24gbWFnaWMgbnVtYmVyLiAgU3VwcG9ydCByNDAwMCBtYWdpYyBudW1iZXJzLgotCShlY29mZl9nZXRfbWFnaWMpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBlY29mZl9nZXRfbWFnaWMsIG5vdCBmaWVsZHMgaW4KLQl0aGUgYmFja2VuZCBzdHJ1Y3R1cmUuCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkZWQgY2FzZSBmb3IgcjYwMDAuCi0KLQlGb3IgTUlQUyBjb25maWd1cmF0aW9ucyBwdXQgYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gdmVyc2lvbnMgaW4KLQl0aGUgbGlzdCBvZiB0YXJnZXRzOyB0aGUgY29kZSBpcyBnZXR0aW5nIGNvbXBpbGVkIGluIGFueWhvdy4KLQkqIGJpZ21pcHMubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGVjb2ZmX2xpdHRsZV92ZWMuCi0JKiBkZWNzdGF0aW9uLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9iaWdfdmVjLgotCSogbWlwc2JlbGYubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYy4KLQkqIG1pcHNsZWxmLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBiZmRfZWxmMzJfYml0bWlwc192ZWMuCi0JKiByaXNjb3MubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGVjb2ZmX2xpdHRsZV92ZWMuCi0KLUZyaSBTZXAgMjQgMDA6NDI6MjMgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBvc2YtY29yZS5jOiAgTmV3IGZpbGUgZm9yIE9TRi8xIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogY29uZmlnL2FscGhhb3NmLm1oIChIREVGSU5FUyk6ICBBZGQgLURPU0ZfQ09SRS4KLQkoSERFUEZJTEVTKTogIFNldCB0byBvc2YtY29yZS5vLgotCSogYmZkLWluMi5oICh1bmlvbiB0ZGF0YSk6ICBBZGQgb3NmX2NvcmVfZGF0YSBtZW1iZXIuCi0JKiB0YXJnZXRzLmM6ICBJZiBPU0ZfQ09SRSBpcyBkZWZpbmVkLCBhZGQgb3NmX2NvcmVfdmVjIHRvIHRhcmdldCBsaXN0LgotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogIEFkZCBvc2YtY29yZS5vLgotCShvc2YtY29yZS5vKTogIE5ldyBkZXBlbmRlbmN5LgotCi1UaHUgU2VwIDIzIDIxOjA0OjUzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBUT0RPOiBSZW1vdmUgbm90ZSBhYm91dCBtYWtpbmcgLS13aXRoLWJmZC10YXJnZXRzIHVzZSBjYW5vbmljYWwKLQl0YXJnZXQgY29uZmlndXJhdGlvbiBuYW1lIChhbHJlYWR5IGRvbmUpOyByZXdvcmQgaXRlbSBhYm91dAotCXNlcGFyYXRpbmcgcmVhZGluZyBhbmQgd3JpdGluZyBzdHVmZiB0byBub3QgcmVmZXIgdG8gYQotCW5vbi1leGlzdGVudCBpdGVtLgotCi0JKiBlY29mZi5oIChlY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBY2NlcHQgTUlQU19NQUdJQ19MSVRUTEUyCi0JYW5kIE1JUFNfTUFHSUNfQklHMi4KLQotVGh1IFNlcCAyMyAxMTowNjozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGdlbi1hb3V0LmMgKG1haW4pOiBPdXRwdXQgbmV3bGluZSBhZnRlciBlbmQgb2YgY29tbWVudCwgbm90Ci0JYmVmb3JlLiAgKFJlcG9ydGVkIGJ5IEpvbmF0aGFuIFN0b25lLAotCWpvbmF0aGFuQG9zY2FyLnN0YW5mb3JkLmVkdSkuCi0KLVRodSBTZXAgMjMgMTA6NDg6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUHV0IHdlYWsgc3ltYm9scyBpbiB0aGUKLQlhcm1hcC4KLQotCSogZWxmY29kZS5oIChmaXhfdXBfc3RydGFicyk6IFNldCBzaF9lbnRzaXplIGZvciB0aGUgLnN0YWIKLQlzZWN0aW9uLCBub3QgdGhlIC5zdGFic3RyIHNlY3Rpb24uICBTZXQgdGhlIHR5cGUgb2YgdGhlIC5zdGFic3RyCi0Jc2VjdGlvbiB0byBTSFRfU1RSVEFCLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogSGFuZGxlIFNIVF9TVFJUQUIgc2VjdGlvbnMuCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0RFQlVHR0lORyk6IE5ldyBzZWN0aW9uIGZsYWcuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIHNlY3Rpb24gaXMgU0hUX1BST0dCSVRTLAotCWFuZCB0aGUgbmFtZSBzdGFydHMgd2l0aCAuZGVidWcsIC5saW5lIG9yIC5zdGFiLCBzZXQKLQlTRUNfREVCVUdHSU5HLiAgSWYgU0hUX1NUUlRBQiwgY2hlY2sgZm9yIC5kZWJ1ZyBhbmQgLnN0YWIuCi0JKiBlbGYzMi10YXJnZXQuaCAoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQKLQlTRUNfREVCVUdHSU5HIHRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBlbGY2NC10YXJnZXQuaCAoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQKLQlTRUNfREVCVUdHSU5HIGFuZCBTRUNfQ09ERSB0byBzZWN0aW9uX2ZsYWdzLgotCSogYmZkLWluMi5oOiBVcGRhdGVkLgotCi1XZWQgU2VwIDIyIDE2OjM0OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKHRkYXRhKTogQWRkIGx5bnhfY29yZV9kYXRhLgotCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgZmlsZXBvcyBmb3IKLQlzZWN0aW9ucyB3aXRoIFNFQ19MT0FEIHNldCwgZXZlbiBpZiBTRUNfSEFTX0NPTlRFTlRTIGlzIGNsZWFyLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBzZXQgc2NucHRyIHRvIHplcm8ganVzdAotCWJlY2F1c2Ugc2l6ZSBvZiBzZWN0aW9uIGlzIHplcm8uICBOZWVkZWQgZm9yIElyaXggNC4wLjVGLgotCi1XZWQgU2VwIDIyIDA5OjQ5OjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgaTk2MC1ib3V0LCBub3QgaTk2MC1jb2ZmIGZvciBpOTYwLSotbmluZHkqLgotCi1XZWQgU2VwIDIyIDA3OjM0OjA5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6ICBBZGQgbHlueC1jb3JlLm8uCi0JKiBiZmQtaW4yLmggKHRkYXRhKTogIEFkZCBseW54X2NvcmVfZGF0YTsKLQkqIGNvbmZpZy5iZmQgY29uZmlndXJlLmhvc3Q6ICBHZXQgcmlkIG9mIHN1cGVyZmx1b3VzIG5ldGJzZCBhbmQKLQlseW54b3MgZW50cmllcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBseW54LWNvcmUubyB0byBMeW54IGNvbmZpZy4KLQkqIGkzODZseW54LmM6ICBBZGQgZGVmcyBmb3IgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBseW54LWNvcmUuYzogIE5ldyBmaWxlIHdpdGggTHlueCBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL2kzODZseW54Lmg6ICBNb3ZlIGxvdHMgb2YgaG9zdCBzcGVjaWZpYyBpbmNsdWRlcyB0byBoZXJlLgotCUFkZCBkZWYgb2YgSE9TVF9MWU5YLiAgUmVtb3ZlIHVubmVjZXNzYXJ5IGRlZnMuCi0KLU1vbiBTZXAgMjAgMTk6MTg6MTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE9ubHkgc2V0IFNFQ19EQVRBIGZvciBhCi0JU0hGX1BST0dCSVRTIG9yIFNIVF9TVFJUQUIgc2VjdGlvbiBpZiBTRUNfQUxMT0MgaXMgc2V0LiAgTmV2ZXIgc2V0Ci0JU0VDX0RBVEEgZm9yIGEgU0hGX05PQklUUyBzZWN0aW9uLgotCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X21hbmdsZV9yZWxvY3MpOiBDaGVjayBTRUNfTE9BRCByYXRoZXIKLQl0aGFuIFNFQ19DT0RFIHwgU0VDX0RBVEEuICBBZGQgc29tZSBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIG5sbWNvZGUuaDogQWRkIHNvbWUgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZ25vcmUgcmVsb2NzIGZvciBzZWN0aW9ucyB0aGF0IGFyZQotCW5laXRoZXIgY29kZSBub3IgZGF0YS4gIEp1c3QgdXNlIHRoZSBzeW1ib2wgdmFsdWUgZm9yIGRlYnVnZ2luZwotCXN5bWJvbHM7IGRvbid0IG9mZnNldCBieSB0aGUgc2VjdGlvbiB2bWEuCi0KLUZyaSBTZXAgMTcgMTg6MDg6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIHdoZW4KLQlwZXJmb3JtaW5nIGEgcmVsb2MgYWdhaW5zdCBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0JKiBzeW1zLmMgKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBTaG93IHZhbHVlIG9mIEJTRl9XRUFLIHJhdGhlcgotCXRoYW4gb2Jzb2xldGUgQlNGX0VYUE9SVC4KLQotRnJpIFNlcCAxNyAwMjowNDozMSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaG9zdHMve2FscGhhb3NmLmgsIGFtaXguaCwgYXBvbGxvNjguaCwgYXBvbGxvdjY4LmgsCi0JZGVjc3RhdGlvbi5oLCBkZWx0YTg4LmgsIGRndXguaCwgZG9zZS5oLCBnbzMyLmgsIGhhcnJpcy5oLAotCWhwMzAwLmgsIGhwMzAwYnNkLmgsIGhwcGFic2QuaCwgaHBwYWhwdXguaCwgaTM4NmFpeC5oLCBpMzg2YnNkLmgsCi0JaTM4NmxpbnV4LmgsIGkzODZseW54LmgsIGkzODZ2LmgsIGkzODZ2NC5oLCBpcml4My5oLCBpcml4NC5oLAotCW1pcHNic2QuaCwgbmNyMzAwMC5oLCByczYwMDAuaCwgcnRic2QuaCwgc29sYXJpczIuaCwgc3BhcmMtbGwuaCwKLQlzdGQtaG9zdC5oLCBzdHJhdHVzLmgsIHN1bjMuaCwgc3lzdjQuaCwgdGFob2UuaCwgdWx0cmEzLmgsCi0JdmF4dWx0LmgsIHZheHVsdDIuaCwgd2UzMmsuaH06ICBNYWtlIHN1cmUgdGhhdCAib2Zmc2V0b2YiIGlzCi0JZGVmaW5lZCBvbiBhbGwgaG9zdHMsIG5vdyB0aGF0IGFyY2hpdmUuYyB1c2VzIGl0LgotCi1UaHUgU2VwIDE2IDE4OjIwOjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBDcmVhdGUgc2VjdGlvbiBzeW1ib2xzIGZvciBhbGwKLQlzZWN0aW9ucywgbm90IGp1c3QgYWxsb2NhdGVkIHNlY3Rpb25zOyBkZWJ1Z2dpbmcgc2VjdGlvbnMgY2FuIGhhdmUKLQlyZWxvY3MuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogSWYgdGhlcmUgaXMgYW4gb3V0cHV0IHNlY3Rpb24sIHVzZQotCXRoZSBzZWN0aW9uIGluZGV4IGZyb20gdGhhdCByYXRoZXIgdGhhbiB0aGUgaW5wdXQgc2VjdGlvbi4KLQotVGh1IFNlcCAxNiAxMjoyMDo1MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGJmZF9mbHVzaCwgYmZkX3N0YXQpOiBSZWZsZWN0IEpvaG4ncyBjaGFuZ2VzIHRvCi0JbGliYmZkLmgsIHdoaWNoIGlzIHJlZ2VuZXJhdGVkIGZyb20gdGhpcyBmaWxlLgotCi0JKiBiZmQtaW4uaCAoc3ltdHlwZSk6IERlbGV0ZWQgdHlwZWRlZi4KLQotV2VkIFNlcCAxNSAxMTo0ODozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0V4eCk6IENhc3QgeCB0byBiZmRfc2lnbmVkX3ZtYSBiZWZvcmUgZG9pbmcgdGhlCi0JeG9yIGFuZCBzdWJ0cmFjdC4gIE90aGVyd2lzZSBpdCB3aWxsIG5vdCBzaWduIGV4dGVuZCBpZiB0aGUgdHlwZQotCW9mIGJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gaW50LgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4pOiBHZXQgcmVnb2Zmc2V0LCBpb3B0LCBmcmVnb2Zmc2V0Ci0JYW5kIGZyYW1lb2Zmc2V0IGFzIHNpZ25lZCBudW1iZXJzLiAgRnJvbSBQZXRlciBTY2hhdWVyLgotCi1UdWUgU2VwIDE0IDE4OjIwOjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBZGQgYmZkX2VsZl9nZW5lcmljX3JlbG9jCi0Jc3BlY2lhbCBmdW5jdGlvbiBmb3IgYWxsIHJlbG9jIGVudHJpZXMuCi0JKiBlbGYzMi10YXJnZXQuaCAoVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGQgU0VDX0NPREUgdG8KLQlzZWN0aW9uX2ZsYWdzLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IFJlbW92ZSBkZXNjLCB0eXBlIGFuZCBvdGhlciBmaWVsZHMuCi0JKiBNYWtlZmlsZS5pbiAoZWxmMzItKi5vKTogVGhlc2UgZGVwZW5kIHVwb24gZWxmMzItdGFyZ2V0LmguCi0KLVR1ZSBTZXAgMTQgMTQ6MzQ6NDUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHN0cnVjdCBhcnRkYXRhKTogIEFkZCBhcm1hcF90aW1lc3RhbXAgYW5kCi0JYXJtYXBfZGF0ZXBvcyBoZXJlIHRvby4KLQotTW9uIFNlcCAxMyAyMTowMzoxOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY2Fjb3Bob255LmN5Z251cy5jb20pCi0KLQlJbXByb3ZlIHRpbWVzdGFtcCBzdXBwb3J0IGluIEJTRCBhcmNoaXZlIGZpbGVzIHRvIGF2b2lkIGxpbmtlcgotCXdhcm5pbmdzLgotCi0JKiBsaWJiZmQuaCAoc3RydWN0IGFydGRhdGEpOiAgQWRkIGFybWFwX3RpbWVzdGFtcCBhbmQgYXJtYXBfZGF0ZXBvcy4KLQkoYmZkX2ZsdXNoLCBiZmRfc3RhdCk6ICBBZGQgcHJvdG90eXBlcy4KLQkqIGxpYmJmZC5jIChiZmRfZmx1c2gpOiAgQWRkLCBkb2VzIGZmbHVzaCBvbiBhIEJGRC4KLQkoYmZkX3N0YXQpOiAgQWRkLCBkb2VzIGZzdGF0IG9uIGEgQkZELgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IEF0IGVuZCBvZiBmaWxlIHdyaXRpbmcsCi0JdmVyaWZ5IGFuZCBwb3NzaWJseSB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUgYXJtYXAsIGlmIGEgQlNECi0JYXJjaGl2ZS4gIEZJWE1FISAgS2x1ZGdlIHJlY29nbml6ZXMgQlNEIGFyY2hpdmUsIHJhdGhlciB0aGFuCi0JdmVjdG9yaW5nIHByb3Blcmx5LiAgU2hvdWxkIGFkZCB0byB4dmVjLgotCShjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6ICBNb3ZlIHByb3RvdHlwZSB0byB0b3AsIGF2b2lkIFBST1RPLgotCShic2Rfd3JpdGVfYXJtYXApOiBTYXZlIHRpbWVzdGFtcCBhbmQgZmlsZSBsb2NhdGlvbiB0aGVyZW9mLCB3aGVuCi0Jd3JpdGluZyB0aGUgYXJtYXAgaW4gYSBCU0QgZmlsZS4KLQkoYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiAgTmV3IGZ1bmN0aW9uIHRvIGNoZWNrIGFuZAotCXJld3JpdGUgdGhlIHRpbWVzdGFtcC4KLQotCSogaG9zdHMvc3RkLWhvc3QuaCAob2Zmc2V0b2YpOiAgRGVmaW5lLCBpZiBub3QgYWxyZWFkeSwgZm9yIGFyY2hpdmUuYy4KLQotU2F0IFNlcCAxMSAxODoxMzo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NnNjby5oOiBEZWZpbmUgYSBidW5jaCBvZiBzdHVmZiBmb3IgY29yZSBmaWxlcy4KLQkqIHNjby1jb3JlLmM6IFJlbW92ZSwgcmVwbGFjZSBieSB0cmFkLWNvcmUuYy4KLQkqIHRyYWQtY29yZS5jOiBJZiBIT1NUX1NUQUNLX1NUQVJUX0FERFIgaXMgZGVmaW5lZCwgdXNlIGl0LgotCSogY29uZmlnL2kzODZzY28ubWg6IFVzZSB0cmFkLWNvcmUgbm90IHNjby1jb3JlLgotCSogaG9zdHMvaTM4NmlzYy5oLCBjb25maWcvaTM4NmlzYy5taDogUmVtb3ZlLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBpMzg2c2NvIGZvciBpc2MuCi0JKiBjb25maWcvaTM4Ni1zY28ubXQ6IFJlbW92ZSwgaWRlbnRpY2FsIHRvIGkzODYtY29mZi5tdC4KLQkqIGNvbmZpZy5iZmQ6IFVzZSBpMzg2LWNvZmYgbm90IGkzODYtc2NvLgotCi0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgaVszNF04Ni0qLXNvbGFyaXMyKiBzcGVjaWZpY2FsbHkgcmF0aGVyCi0JdGhhbiB1c2luZyAqLSotc29sYXJpczIqIChpNDg2LXVua25vd24tc29sYXJpczIgaXMgaTM4Ni1lbGYsIG5vdAotCWk0ODYtZWxmIHdoaWNoIGRvZXNuJ3QgZXhpc3QpLgotCi1GcmkgU2VwIDEwIDEyOjU2OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRm9yIEFMUEhBRUNPRkYsIGZvcmNlCi0JcGFkZGluZyBmaWVsZCB0byB6ZXJvLgotCi0JKiBjb25maWcuYmZkIChpWzM0XTg2LSotbmV0YnNkKik6IE5ldyB0YXJnZXQ7IHVzZSBpMzg2LW5ldGJzZC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGJvZ3VzIG5ldGJzZDM4NiBoYW5kbGluZy4KLQotCSogY29mZi1taXBzLmM6IERvbid0IHdhcm4gYWJvdXQgb3ZlcmZsb3cgZm9yIE1JUFNfUl9KTVBBRERSIHJlbG9jLgotCUNvcnJlY3Qgb3ZlcmZsb3cgZGV0ZWN0aW9uIHJlcXVpcmVzIG1hdGNoaW5nIHRoZSB1cHBlciBmb3VyIGJpdHMKLQlvZiB0aGUgZGVzdGluYXRpb24gYWdhaW5zdCB0aGUgUEMuCi0KLVRodSBTZXAgIDkgMTY6NTc6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgNjQtYml0IHN0dWZmIHdvcmsgd2l0aCAiLS13aXRoLXRhcmdldHM9YWxsIi4KLQotVHVlIFNlcCAgNyAxNDoxNzowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oOiBSZW1vdmVkIHN3YXBwaW5nIHJvdXRpbmVzIGRlY2xhcmF0aW9ucy4KLQkqIGJmZC1pbi5oOiBBZGRlZCBzd2FwcGluZyByb3V0aW5lIGRlY2xhcmF0aW9ucywgYW5kIHJlbmFtZWQgdGhlbQotCWZyb20gX2RvXyogdG8gYmZkXyouCi0JKiBsaWJiZmQuYzogUmVuYW1lZCBzd2FwcGluZyByb3V0aW5lcyBmcm9tIF9kb18qIHRvIF9iZmRfKi4KLQkqIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1Nb24gU2VwICA2IDE1OjI4OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBTZXQgcGNyZWxfb2Zmc2V0IHRvIHRydWUgZm9yCi0JUl8zODZfUEMzMi4KLQotRnJpIFNlcCAgMyAxMzowNjoxMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVvcmdhbml6ZWQgc2V0dGluZyBvZiBtYWtlZmlsZSB2YXJpYWJsZXMgc28KLQk2NC1iaXQgc3R1ZmYgd29ya3MgYWdhaW4uCi0KLQkqIGxpYmJmZC1pbi5oIChfZG9fZ2V0KiwgX2RvX3B1dCopOiBSZW5hbWVkIHZpYSBtYWNyb3MgdG8gY2xlYW4gdXAKLQluYW1lc3BhY2UuCi0KLQkqIGxpYmVsZi5oIChlbGYzMl9zeW1ib2xfdHlwZSwgZWxmNjRfc3ltYm9sX3R5cGUpOiBEZWxldGVkCi0JIm5hdGl2ZV9lbGZfc3ltIiBmaWVsZCwgbWVyZ2VkIHRvIG1ha2UgbmV3IHR5cGUgImVsZl9zeW1ib2xfdHlwZSIuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogRmllbGQgc3ltYm9scyBpcyBub3cgZWxmX3N5bWJvbF90eXBlKi4KLQlEZWxldGVkIGZpZWxkIHJhd19zeW1zLgotCShvYmpfc3ltYm9scyk6IFJlbW92ZSBjYXN0LgotCShvYmpfcmF3X3N5bXMpOiBEZWxldGVkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3Qgc2V0IHJhd19zeW1zIG9yCi0JbmF0aXZlX2VsZl9zeW0gZmllbGRzLgotCSogZWxmMzItaHBwYS5jOiBDaGFuZ2VkIHVzZXMgb2YgZWxmMzJfc3ltYm9sX3R5cGUgdG8KLQllbGZfc3ltYm9sX3R5cGUuCi0KLQlGcm9tIFBldGUgSG9vZ2VuYm9vbSBhbmQgSmVmZiBMYXc6Ci0KLQkqIGVsZjMyLWhwcGEuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3RjX3N5bWJvbCk6IElmIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0JYml0cyBhcmUgemVybyAoZS5nLiwgdGhleSBzcGVjaWZ5IG5vIHJlbG9jYXRpb25zKSwgdGhlbiBkbyBub3QKLQlldmVuIGJvdGhlciBhZGRpbmcgdGhlaXIgZW50cmllcyB0byB0aGUgc3ltZXh0biBzZWN0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3RjX3N5bWJvbCk6IEFueSBmdW5jdGlvbiwgcmVnYXJkbGVzcwotCW9mIHNjb3BlIGNhbiBoYXZlIGFuIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1Yi4KLQotCSogZWxmMzItaHBwYS5jOiAoRWxmMzJfaHBwYV9TdHViX2Rlc2NyaXB0aW9uKTogIFJlbmFtZSB0aGlzCi0Jc3RydWN0dXJlIGFuZCB0eXBlIHRvIGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbi4gIFRoaXMgbWFrZXMKLQlpdCBjb25zaXN0ZW50IHdpdGggdGhlIEdOVSBjb2RpbmcgY29udmVudGlvbnMuCi0JKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbik6IEFkZGVkIGEgJ25leHQnIGZpZWxkIHRvIGFsbG93Ci0JbGlua2luZyBvZiBzdHViIGRlc2NyaXB0aW9uIHN0cnVjdHVyZXMuCi0JKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbik6IEFkZGVkIGEgJ3N0dWJfbGlzdFAnIGZpZWxkIHRvCi0Ja2VlcCB0cmFjayBvZiBpbmRpdmlkdWFsIHN0dWJzLgotCShFbGYzMl9ocHBhX1N0dWJfbGlzdCwgRWxmMzJfaHBwYV9TdHViX2xpc3Rfc3RydWN0KTogIFJlbW92ZWQuCi0JQ29tYmluZWQgd2l0aCB0aGUgZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uIHN0cnVjdHVyZS4KLQkoZWxmMzJfaHBwYV9zdHViX25hbWVfbGlzdCk6ICBOZXcgdHlwZSB0byBrZWVwIHRyYWNrIG9mCi0JaW5kaXZpZHVhbCBzdHVicy4KLQkoYWRkX3N0dWIpOiAgUmVtb3ZlZC4KLQkoYWRkX3N0dWJfYnlfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZmluZF9zdHViX2J5X25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogQWxsb3cgcmV1c2luZyBzdHVicyB0aGF0Ci0JYWxyZWFkeSBleGlzdC4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IEFsbG93IHJldXNpbmcgc3R1YnMgdGhhdAotCWFscmVhZHkgZXhpc3QuCi0KLQkqIGVsZjMyLWhwcGEuYzogKHJldHZhbF9taXNtYXRjaGVzKTogIFRoZSBkaXJlY3Rpb24gb2YgYXJndW1lbnQKLQlyZWxvY2F0aW9uIHdhcyByZXZlcnNlZC4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBSZXR1cm4gYWRkcmVzcyB3YXMgbm90IGJlaW5nCi0JcmVzdG9yZWQuCi0JKGhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCk6IEFkZCBhcmd1bWVudCBjb250YWluaW5nIGNhbGxlcgotCWFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBzbyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIHRoZSBjaGVjawotCWZvciBwbGFiZWwgc3R1YnMuCi0JKGhwcGFfZWxmX3N0dWJfY2hlY2spOiBQYXNzIGNhbGxlciBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaW50bwotCWhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCgpLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBBZGQgY2hlY2sgZm9yIHBsYWJlbCBzdHVicyBhbmQKLQlwYXNzIGNhbGxlciBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaW50bwotCWhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCgpLgotCi1UaHUgU2VwICAyIDAwOjU5OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKGhwcGFfZmllbGRfYWRqdXN0KTogUmVtb3ZlIHVudXNlZCBgaW5pdF92YWx1ZScgdmFyaWFibGUuCi0KLQkqIGhvc3RzL2RlbHRhODh2NC5oOiBOZXcgZm9yIFNWUjQuCi0JKiBjb25maWd1cmUuaG9zdHM6IFVzZSBpdC4KLQotV2VkIFNlcCAgMSAxNDoyMzozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oLCBuZXRic2QzODYuYzogQ2hhbmdlIE1fSTM4NiB0byBNXzM4Nl9ORVRCU0QuICBNX0kzODYKLQlpcyBhbiBTQ08gcHJlLWRlZmluZS4KLQotVHVlIEF1ZyAzMSAxMjo1MDoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogU2V0IEhBU19TWU1TIGlmIHRoZXJlIGFyZSBleHRlcm5hbAotCXJlZmVyZW5jZXMuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX3tpbixvdXR9KTogVGhlIGNvcHlyaWdodCBsZW5ndGggaXMKLQlvbmx5IG9uZSBieXRlLgotCShubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IEluY2x1ZGUgZGVidWdnaW5nIHN5bWJvbHMgaW4gc3ltYm9sCi0JY291bnQuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBNYWtlIHN5bWxlbmd0aCB1bnNpZ25lZC4gIFJlYWQgZGVidWdnaW5nCi0Jc3ltYm9scyBhcyBCRkQgbG9jYWwgc3ltYm9scy4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGJvdGhlciB3cml0aW5nIG91dCBleHBvcnRlZAotCXN5bWJvbHMgbW9yZSB0aGFuIG9uY2U7IHRoZXkgbm93IGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlIG1vcmUKLQl0aGFuIG9uY2UgKHdpdGggYW5kIHdpdGhvdXQgYSBwcmVmaXgpIGlmIG5lY2Vzc2FyeS4gIFNldCBvZmZzZXQKLQl2YWx1ZXMgdG8gYmUgbm9uLXplcm8gYXMgTkxNTElOSyBkb2VzLgotCi1UdWUgQXVnIDMxIDEyOjA3OjQzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IFJlc3RvcmUgI3VuZGVmcyBvZiBlX2ZzZWwgYW5kIG90aGVyIGVfKiBzeW1ib2xzLgotCi1GcmkgQXVnIDI3IDE2OjQzOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogTW92ZSBwb3NpdGlvbiBvZiB1c2VyX3NldF92bWEsIGFuZAotCWRvY3VtZW50IGl0LgotCShTRUNfQkFMSUdOKTogRGlzYWJsZSBmb3Igbm93LiAgSSBkb24ndCB0aGluayBpdCdzIGN1cnJlbnRseSB1c2VkLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogTm93IHN0YXRpYy4KLQkoc3ltZXh0X3Jvb3RQLCBzeW1leHRfbGFzdFAsIGdsb2JhbF92YWx1ZSwgR09UX3ZhbHVlLAotCWdsb2JhbF9zeW1ib2wsIGdsb2JhbF9zeW1fZGVmaW5lZCwgc3ltZXh0bl9jb250ZW50cywKLQlzeW1leHRuX2NvbnRlbnRzX3JlYWxfc2l6ZSwgZWxmX2hwcGFfc3R1Yl9yb290UCwKLQllbGYzMl9ocHBhX3N5bWV4dG5fbWFwLCBlbGYzMl9ocHBhX3N5bWV4dG5fbWFwX3NpemUpOiBSZWx5IG9uCi0JZGVmYXVsdCBpbml0aWFsaXphdGlvbi4KLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBNYWNybyAiVU5ERUZJTkVEIiBkb2Vzbid0IG5lZWQgYQotCXRyYWlsaW5nIHNlbWljb2xvbi4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogSW50cm9kdWNlIHRlbXBvcmFyaWVzIHRvIG1ha2UKLQljb2RlIG1vcmUgcmVhZGFibGUgaW4gODAgY29sdW1ucy4KLQotCSogbGliaHBwYS5oIChhbGwgZnVuY3Rpb25zKTogTm93IGlubGluZSB1bmRlciBHTlUgQy4KLQotCU1vcmUgcGF0Y2hlcyBmcm9tIEplZmYgTGF3OgotCi0JKiBlbGYzMi1ocHBhLmMgKEFSX1dBUk4pOiBHaXZlIGFyZ3VtZW50IHdoaWNoIGNhdXNlZCB0aGUKLQlpbnZhbGlkIGFyZ3VtZW50IHJlbG9jYXRpb24uCi0JKEFSX1VOSU1QKTogRGVsZXRlIHVudXNlZCBtYWNyby4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF90YWJsZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3Npbmc6IExpa2V3aXNlLgotCi0JKiBzb20uYzogTmV3IGZpbGUgY29udGFpbmluZyBTT00gc3BlY2lmaWMgY29kZSBleHRyYWN0ZWQKLQlmcm9tIGhwcGEuYwotCi0JKiBzb20uaDogTmV3IGZpbGUgY29udGFpbmluZyBTT00gc3BlY2lmaWMgY29kZSBleHRyYWN0ZWQKLQlmcm9tIGxpYmhwcGEuaAotCi0JKiBocHBhLmM6IERlbGV0ZWQuCi0KLQkqIGxpYmhwcGEuaDogRGVsZXRlIFNPTSBzcGVjaWZpYyBjb2RlLiAgQWRkIGdlbmVyaWMgUEEKLQljb2RlIHdoaWNoIGNhbiBiZSBzaGFyZWQgYnkgYm90aCBTT00gYW5kIEVMRiBiYWNrZW5kcy4KLQotCSogTWFrZWZpbGUuaW46IFJlcGxhY2UgaHBwYS5jIHdpdGggc29tLmMuICBlbGYzMi1ocHBhLm8KLQlkZXBlbmRzIG9uIGxpYmhwcGEuaCBub3cuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYV92ZWMpOiBOZWVkcyBzb20ubyBtb2R1bGUgaW5zdGVhZCBvZgotCWhwcGEuby4KLQotCSogZWxmMzItaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4gIERvIG5vdCBkZWZpbmUKLQlCWVRFU19JTl9XT1JELgotCi0JKiBlbGYzMi1ocHBhLmggKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSk6IERlbGV0ZQotCW5vdyBsaXZlcyBpbiBsaWJocHBhLmguCi0JKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQpOiBMaWtld2lzZS4KLQotCSogaG9zdHMvaHBwYWJzZC5oOiBJbmNsdWRlIDxzdGRsaWIuaD4gYW5kIDx1bmlzdGQuaD4uICBEbyBub3QKLQlkZWZpbmUgbWFsbG9jIG9yIGZyZWUuCi0KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoU0VMRUNUX0FSQ0hJVEVDVFVSRVMpOiBEb24ndCBkZWZpbmUKLQlTRUxFQ1RfVkVDUy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV91bndpbmRfdGFibGUpOiBEZWxldGUgdW51c2VkCi0JdmFyaWFibGVzLgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCk6IExpa2V3aXNlLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogTGlrZXdpc2UuCi0JKGVsZl9yZWxvY19tYXApOiBEZWxldGUsIG5vIGxvbmdlciB1c2VkLgotCShlbGZfaHBwYV9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9zeW1leHRuX21hcF9tYXhfc2l6ZSk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX2dldF9zeW1fZXh0bik6IEFib3J0IGlmIHR5cGUgaXMgYm9ndXMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBBZGQgcHJvY2Vzc2luZwotCW9mIHRoZSAuaHBwYV91bndpbmQgc2VjdGlvbi4KLQotV2VkIEF1ZyAyNSAxNjoxMzo0OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IHJlY29nbml6ZSBtODgxMTAuCi0KLVR1ZSBBdWcgMjQgMTY6MzI6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBKZWZmIExhdyBhbmQgUGV0ZSBIb29nZW5ib29tIGF0IFV0YWg6Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEFkZCBkZXRlY3Rpb24gb2YKLQlTSFRfTk9URSBzZWN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jOgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViLGhwcGFfZWxmX2xvbmdfYnJhbmNoX25lZWRlZF9wKToKLQlOZXcgZnVuY3Rpb25zIGZvciBzdXBwb3J0IG9mIGxvbmcgYnJhbmNoIHN0dWJzLgotCShocHBhX2VsZl9zdHViX2NoZWNrLGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6ICBBZGQKLQljaGVjayBmb3IgbG9uZyBicmFuY2ggc3R1YnMuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnMpOiAgVW51c2VkIGZ1bmN0aW9uLiAgUmVtb3ZlZC4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJbXBsZW1lbnQgYSBQQS9FTEYtc3BlY2lmaWMKLQl2ZXJzaW9uIG9mIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cy4KLQkoaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOiBPbmx5IG91dHB1dCBkZWJ1Z2dpbmcgZGlhZ25vc3RpY3MKLQl3aGVuIEJGRCBpcyBjb25maWd1cmVkIGZvciBkZWJ1Z2dpbmcuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZjMyX2hwcGFfZ2V0X3N5bWV4dG5fY2hhaW4pOiAgTmV3IGZ1bmN0aW9uCi0JdG8gcmV0dXJuIGEgbGlzdCBvZiBzeW1ib2xzIHRoYXQgaGF2ZSBub24temVybyBhcmd1bWVudAotCXJlbG9jYXRpb24gYml0cy4KLQkoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBNYWtlIHN1cmUgc3R1YiBnZW5lcmF0aW9uIGlzIGRvbmUgb25seQotCW9uY2UuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiAgTmV3IGZ1bmN0aW9uIGZvcgotCWdlbmVyYXRpb24gcmVsb2NhdGlvbiBlbnRyaWVzIHdpdGhpbiBhIHN0dWIuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogQ29ycmVjdGlvbnMgdG8gYXJndW1lbnQKLQlyZWxvY2F0aW9uIHN0dWJzLgotCi0JKiBlbGYzMi1ocHBhLmM6IE5ldyAjZGVmaW5lJ3MgZm9yIGFyZ3VtZW50IHJlbG9jYXRpb24gdHlwZXMuCi0JKG1pc21hdGNoZXMsIHJldHZhbF9taXNtYXRjaGVzKTogVXBkYXRlZCB0byByZWZsZWN0IG5ldwotCWFyZ3VtZW50IHJlbG9jYXRpb24gdHlwZXMuCi0JKENVUlJFTlRfU1RVQl9PRkZTRVQpOiBOZXcgbWFjcm8uCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBTZXQgdGhlIFBGX1ggYml0IGZvciBkYXRhCi0Jc2VnbWVudHMuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogQWRkCi0JUl9IUFBBX1NUVUJfQ0FMTF8xNyBmb3Igc3VwcG9ydCBvZiBsaW5rZXIgc3R1YiBnZW5lcmF0aW9uLgotCShocHBhX2VsZl9yZWxvYyk6IEFkZCBzdXBwb3J0IG9mIFJfSFBQQV9TVFVCX0NBTExfMTcKLQlyZWxvY2F0aW9uIHR5cGUuCi0KLQkqIGVsZjMyLWhwcGEuaDogKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IEFkZAotCVJfSFBQQV9TVFVCX0NBTExfMTcgZm9yIHN1cHBvcnQgb2YgbGlua2VyIHN0dWIgZ2VuZXJhdGlvbi4KLQotCSogaHBwYV9zdHVicy5oOiBBZGQgbmV3IGluc3RydWN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIGxpbmtlcgotCXN0dWIgZ2VuZXJhdGlvbi4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV91bndpbmRfdGFibGUpOiBUaGUgb2Zmc2V0cyBpbiBhbgotCXVud2luZCBkZXNjcmlwdG9yIHdlcmUgaW5jb3JyZWN0LgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBEZWNsYXJlLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpOiAgTmV3Ci0JZnVuY3Rpb24gaW4gcGxhY2Ugb2YgZ2xvYmFsX3N5bSBmaWVsZCBpbiBlbGZfYmFja2VuZF9kYXRhCi0Jc3RydWN0dXJlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZywKLQllbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywKLQllbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6ICBOZXcgZnVuY3Rpb25zIHRvCi0JcHJvdmlkZSBzdXBwb3J0IG9mIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMgYW5kIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiBzdHVicy4KLQkoZWxmX2luZm9fdG9faG93dG8pOiAgUmVtb3ZlIGNhbGwgdG8gYWJvcnQoKS4KLQotCSogZWxmMzItdGFyZ2V0Lmg6ICBTdXBwb3J0IGZvciBzcGVjaWFsIHByb2Nlc3NpbmcgYnkgdGhlIGJhY2tlbmQuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogIEFkZGVkIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAotCWVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nLAotCWVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZywgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIsCi0JZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywgYW5kCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGZpZWxkcy4KLQkqIGVsZmNvZGUuaDogKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEFkZCBhIGNoZWNrIGZvcgotCXByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6ICBBZGQgYSBjaGVjayBmb3IgcHJvY2Vzc29yLXNwZWNpZmljCi0Jc2VjdGlvbiB0eXBlcy4KLQkoYmZkX2VsZjMyX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBBZGQgYSBjaGVjayB0byBzZWUgaWYKLQl0aGVyZSBpcyBhbnkgZmluYWwgc2VjdGlvbiBwcm9jZXNzaW5nIHRvIGJlIGRvbmUgYnkgdGhlCi0JYmFja2VuZC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6ICBBZGQgYSBjaGVjayBmb3IKLQlwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBSZW1vdmUgcmVmZXJlbmNlIHRvIGdsb2JhbF9zeW0gaW4gdGhlCi0JZWxmX2JhY2tlbmRfZGF0YSBzdHJ1Y3R1cmUuICBSZXBsYWNlIGl0IHdpdGggYSBjYWxsIHRvCi0JZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcuCi0JKiBsaWJlbGYuaDogUmVtb3ZlIGdsb2JhbF9zeW0gZmllbGQgaW4gdGhlIGVsZl9iYWNrZW5kX2RhdGEKLQlzdHJ1Y3R1cmUuICBSZXBsYWNlIGl0IHdpdGggYSBzZXJpZXMgb2YgYmFja2VuZC1zcGVjaWZpYwotCWZ1bmN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2JyYW5jaF9yZWxvYyk6IFRoZSBmb3JtYWwgYXJndW1lbnQKLQlzdHViX3N5bSBzaG91bGQgYmUgY2FsbGVkIHRhcmdldF9zeW0uCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogUmVmZXIgdG8gdGhlIHN0dWIgYmZkIChhYmZkKQotCXJhdGhlciB0aGFuIHRoZSBvdXRwdXQgYmZkIChvdXRwdXRfYmZkKS4KLQkoaHBwYV9lbGZfcmVsb2MpOiBHZXQgcmlkIG9mIHJlZmVyZW5jZXMgdG8gdGhlIGdsb2JhbF9zeW0gZmllbGQgaW4KLQl0aGUgZWxmX2JhY2tlbmRfZGF0YSBzdHJ1Y3R1cmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayB0aGUgY29ycmVjdCBjb25kaXRpb24gZm9yCi0JLmJzcy4gIEFsc28sIGRldGVjdCB0aGUgZXhpc3RlbmNlIG9mIGEgLm5vdGUgc2VjdGlvbi4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogcl9mb3JtYXQgYXJndW1lbnQgc2hvdWxkCi0JaGF2ZSBiZWVuIHJfZmllbGQuCi0KLQkqIGhvc3RzL2hwcGFic2QuaCAoSE9TVF9NQUNISU5FX0FSQ0gpOiBSZWZlcmVuY2UgdG8gYmZkX2FyY2hfbTY4awotCXNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBiZmRfYXJjaF9ocHBhLgotCi0JKiBocHBhLmMgKGhwcGFfdmVjKTogUmVwbGFjZSBiZmRfZmFsc2Ugd2l0aCBfYmZkX2R1bW15X3RhcmdldCBpbgotCXRoZSBiZmRfY2hlY2tfZm9ybWF0IHN0cnVjdHVyZSB0byBhdm9pZCBhIHR5cGUgbWlzbWF0Y2guCi0KLU1vbiBBdWcgMjMgMTk5MyAgU2VhbiBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCQkgYW5kIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JQWRkIE5ldEJTRCBzdXBwb3J0OgotCSogbmV0YnNkMzg2LmM6IE5ldyBmaWxlLgotCSogYW91dHguaDogTWFrZSBzeW1faXNfZGVidWdnZXJfaW5mbyB0cnVlIGZvciBOX0ZOLgotCSogTWFrZWZpbGUuaW4sIGFvdXQtdGFyZ2V0LmgsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUuaW4sCi0JbGliYW91dC5oLCB0YXJnZXRzLmM6IE90aGVyIGNoYW5nZXMuCi0KLUZyaSBBdWcgMjAgMTc6MDQ6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLWVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkOiBVc2UgaXQgZm9yIG04OCotKi1zeXN2NCouCi0KLUZyaSBBdWcgMjAgMTU6MTY6NTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9idWlsZF9waGRycyk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLgotCShiZmRfc2hkcl9mcm9tX3NlY3Rpb24pOiBEaXR0by4KLQkod3JpdGVfcmVsb2NzKTogRG9uJ3QgY2hhbmdlIHNlY3Rpb24gY29udGVudHMgZm9yIGFkZGVuZC4KLQkoZWxmX2xvY2F0ZV9zaCk6IFJldHVybiB0eXBlIGlzIG5vdyBhbHdheXMgZWxmX2ludGVybmFsX3NoZHIsCi0Jc2luY2UgdGhlIG90aGVyIHR5cGVzIHdlcmUgcmVhbGx5IGFsaWFzZXMgZm9yIHRoaXMgdHlwZSBhbnl3YXlzLgotCURvbid0IGNvbXBpbGUgdGhpcyBmdW5jdGlvbiwgc2luY2UgaXQgaXMgc3RhdGljIGFuZCBkb2Vzbid0IGFwcGVhcgotCXRvIGJlIHVzZWQgaW4gdGhpcyBmaWxlLgotCShzeW1faXNfZ2xvYmFsKTogUmV0dXJuIG5vbi16ZXJvIGZvciB3ZWFrIHN5bWJvbHMuICBBYm9ydCBpZgotCXNlY3Rpb24gcG9pbnRlciBpcyBudWxsLgotCShzd2FwX291dF9zeW1zKTogUmVvcmRlciB0ZXN0cyBzbyBmdW5jdGlvbiBzeW1ib2xzIGNhbiBiZSB3ZWFrLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgdXNlIEJTRl9FWFBPUlQuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBNYWtlIFJFTE9DX1BST0NFU1NJTkcgc2VjdGlvbiBzbWFsbGVyIGJ5Ci0JZXh0cmFjdGluZyBvdXQgc29tZSBjb21tb24gY29kZS4gIEFib3J0IGlmIEJGRCBzZWN0aW9uIHN5bWJvbCBoYXMKLQludWxsIG5hbWUuCi0JKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IFRyYW5zbGF0ZSBFTEYgc2VjdGlvbiBzeW1ib2xzIGludG8gQkZECi0Jc2VjdGlvbiBzeW1ib2xzLiAgRG9uJ3QgcmVhZCBzZWN0aW9uIGNvbnRlbnRzIHRvIGZpbGwgaW4gYWRkZW5kCi0JZmllbGQuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWxsIHBhcnRpYWxfaW5wbGFjZSBmaWVsZHMKLQlzaG91bGQgYmUgInRydWUiLgotCi0JKiBNZXJnZWQgZnJvbSBPU0Y6Ci0KLQlUdWUgSnVuIDE1IDE0OjM4OjMyIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IEVsZl9TeW1fRXh0cmEpOiBOZXcgc3RydWN0dXJlIHRvIGNvbnRhaW4gRUxGCi0Jc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgUHV0IGluIGVsZl9zeW1fbnVtLCB3aGljaAotCWdpdmVzIHRoZSBleHRlcm5hbCBzeW1ib2wgbnVtYmVyIGluIHRoZSBlbGYgb2JqZWN0IGZpbGUsIHNpbmNlCi0JbG9jYWwgc3ltYm9scyBtdXN0IGNvbWUgYmVmb3JlIGdsb2JhbCBzeW1ib2xzLgotCShlbGZfc3ltX2V4dHJhKTogTmV3IG1hY3JvLgotCShlbGZfc3ltdGFiX21hcCk6IERlbGV0ZSwgaW4gZmF2b3Igb2YgdXNpbmcgRWxmX1N5bV9FeHRyYS4KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogVXNlIEVsZl9TeW1fRXh0cmEgdG8gbWFwIGludGVybmFsCi0Jc3ltYm9sIG51bWJlciB0byBleHRlcm5hbCBudW1iZXIuICBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUKLQlFbGZfU3ltX0V4dHJhIGZpZWxkIGZvciB0aGUgc3ltYm9sIGluIHRoZSB1ZGF0YSBmaWVsZC4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBFbGZfU3ltX0V4dHJhIHRvIG1hcCBvdXQgc3ltYm9scy4KLQotCVN1biBKdW4gMjAgMTY6MzA6MTEgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZCB0byBjb3VudCB0aGUgc2l6ZSBvZiB0aGUKLQlhcnJheSBvZiBwb2ludGVycyB0byBzZWN0aW9uIHN5bWJvbHMuCi0JKGVsZl9tYXBfc3ltYm9scyk6IEJ1bXAgdGhlIG1heCBpbmRleCBvZiB0aGUgc2VjdGlvbiBzeW1ib2xzIHNvCi0JdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgbWVtb3J5LiAgU3RvcmUgdGhlIG1heCBpbmRleCBpbnRvIHRoZQotCWVsZl9vYmpfdGRhdGEgZmllbGQuCi0KLQlTYXQgSnVuIDE5IDEwOjEyOjI3IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmpfdGRhdGEpOiBBZGQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycwotCXRvIHRoZSBzZWN0aW9uIHN5bWJvbHMgd2UgY3JlYXRlZC4gIFJlbW92ZSB1bnVzZWQgZmllbGQKLQlpbnRlcm5hbF9zeW1zLgotCShlbGZfbWFwX3N5bWJvbHMpOiBGaWxsIGluIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNlY3Rpb24gc3ltYm9scy4KLQlPbmx5IGNyZWF0ZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHNlY3Rpb25zIHRoYXQgaGF2ZSBTRUNfQUxMT0Mgc2V0LAotCWFuZCBoYXZlIG5vbi16ZXJvIHNpemUuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogSWYgdWRhdGEgaXMgTlVMTCwgYW5kIHRoaXMgaXMgYQotCXNlY3Rpb24gc3ltYm9sLCBsb29rIHVwIHRoZSBzZWN0aW9uIGluIHRoZSBsaXN0IG9mIHNlY3Rpb24KLQlzeW1ib2xzLCBhbmQgc2V0IHRoZSB1ZGF0YSBwb2ludGVyIGFwcHJvcHJpYXRlbHkuICBPdGhlcndpc2UsIGlmCi0JdWRhdGEgaXMgc3RpbGwgTlVMTCwgZmFpbCBhbiBhc3NlcnRpb24sIGFuZCB1c2UgMCwgaW5zdGVhZCBvZgotCWRyb3BwaW5nIGNvcmUuCi0KLUZyaSBBdWcgMjAgMTI6MTg6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtaXBzLSotZWxmbCosIG1pcHMtKi1lbGYqKTogTmV3IHRhcmdldHMsIHVzaW5nCi0JbWlwc2xlbGYgYW5kIG1pcHNiZWxmIHJlc3BlY3RpdmVseS4KLQkqIGNvbmZpZy9taXBzbGVsZi5tdCwgY29uZmlnL21pcHNiZWxmLm10OiBOZXcgZmlsZXMuCi0JKiBlbGYzMi1taXBzLmM6IEFkZGVkIHNvbWUgcmVsb2MgaW5mb3JtYXRpb24uCi0JKiBjb25maWd1cmUuaW46IEZpeGVkIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGVjb2ZmLmMgKEVDT0ZGX0xPTkdfU0laRSk6IFJlbW92ZWQuICBKdXN0IHVzZSBjb25zdGFudHMuCi0KLVRodSBBdWcgMTkgMDk6NDU6NTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMsIEFMTF9NQUNISU5FUywgQkZEMzJfQkFDS0VORFMsIEJGRDY0X0JBQ0tFTkRTLAotCU9QVElPTkFMX0JBQ0tFTkRTKTogQWxwaGFiZXRpemUgZW50cmllcyBhbmQgYWRkIGEgZmV3IG1pc3Npbmcgb25lcy4KLQkqIGFyY2h1cmVzLmM6IEFscGhhYmV0aXplIGRlY2xzLgotCi0JKiBjb25maWd1cmUuaW4sIHRhcmdldHMuYzogQWRkIG1pc3NpbmcgdmVjdG9ycyB0byB0aGUgdGFibGVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKSBbIVNFTEVDVF9WRUNTXTogQWRkIERFRkFVTFRfVkVDVE9SLgotCVJlbW92ZSBocDMwMGJzZF92ZWMgZHVlIHRvIGNsYXNoIHdpdGggc3Vub3NfYmlnX3ZlYy4KLQotVHVlIEF1ZyAxNyAxODoxMjozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NnttYWNoMyxvc2YxbWt9Lmg6IE5ldyBmaWxlcywgZm9yIE1hY2ggaG9zdGluZy4KLQkqIGhvc3RzL2kzODZtYWNoLmg6IHJlbW92ZWQsIHJlcGxhY2VkIGJ5IGkzODZvc2YxbWsuaC4KLQkqIGNvbmZpZy9pMzg2bWFjaDMubXQsIGkzODZtYWNoMy5jOiBOZXcgZmlsZXMsIGZvciBNYWNoIGEub3V0IGZvcm1hdC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaG9zdCwgY29uZmlnLmJmZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogaG9zdHMvZGVjc3RhdGlvbi5oOiBJbmNsdWRlIDxzeXMvcGFyYW0uaD4gbm90IDxtYWNoaW5lL3BhcmFtLmg+LgotCi1UdWUgQXVnIDE3IDE1OjE5OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogSWYgc2VjdGlvbidzIG91dHB1dF9zZWN0aW9uIGlzCi0Jbm90IHlldCBzZXQsIHBvaW50IHRvIGl0c2VsZi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhpcyBpcwotCWNhbGxlZCBvbiB0aGUgb3V0cHV0IGZpbGUsIG5vdCB0aGUgaW5wdXQgZmlsZS4KLQotCSogY29mZi1yczYwMDAuYyAoZHVtbXlfcmVsb2MsIFJUWVBFMkhPV1RPKTogU2V0IGhvd3RvIGZpZWxkIHRvIGEKLQlkdW1teSB2YWx1ZSwgcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBOVUxMLgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKTogU2V0IGJmZF9lcnJvciBvbgotCWZhaWx1cmUuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLgotCi1UdWUgQXVnIDE3IDA5OjQyOjE2IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAoY3B1KTogRXh0cmFjdCBmcm9tIGNhbm9uaWNhbCBuYW1lIHdpdGggc2VkLgotCSogY29uZmlndXJlLmluOiBEb24ndCBwYXNzIGl0LgotCi1TdW4gQXVnIDE1IDIwOjQ1OjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogUmVtb3ZlIHtCWVRFLFdPUkQsTE9OR31fU0laRTsgdGhleSBhcmUgcG9pbnRsZXNzIGFuZAotCUJZVEVfU0laRSBjb25mbGljdHMgd2l0aCBhIE1hY2ggaGVhZGVyLgotCSogZWNvZmYuYzogQ2hhbmdlIExPTkdfU0laRSB0byBFQ09GRl9MT05HX1NJWkUgYW5kIGRlZmluZSBpdC4KLQotCSogY29uZmlndXJlLmhvc3Q6IE1ha2Ugc3VyZSBhbGwgT1MgZmllbGRzIGVuZCBpbiAqLgotCi1GcmkgQXVnIDEzIDE2OjMzOjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBVc2UgYmZkX2Fic19zZWN0aW9uIGZvcgotCVJFTE9DX1NFQ1RJT05fTk9ORSBhbmQgUkVMT0NfU0VDVElPTl9BQlMuICBJZiBhIHJlbG9jIHNlY3Rpb24KLQlkb2Vzbid0IGV4aXN0LCBkb24ndCB0cnkgdG8gY3JlYXRlIGl0LgotCi0JKiBubG1jb2RlLmggKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBwcm9jZWR1cmUgb2Zmc2V0cyBhcmUKLQlmcm9tIHN0YXJ0IG9mIGNvZGUgc2VnbWVudCwgbm90IHN0YXJ0IG9mIGZpbGUuCi0JKiBjb25maWcvaTM4Ni1ubG0ubXQgKERFRkFVTFRfVkVDVE9SKTogSXQncyBubG0zMl9pMzg2X3ZlYywgbm90Ci0JYmZkX25sbTMyX2kzODZfdmVjLgotCSogY29uZmlndXJlLmluIChTRUxFQ1RfVkVDUyBzd2l0Y2gpOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAxMiAxMDozMjo0NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0KTogSWYgdGhlIHRhcmdldCBtYXRjaGVzIHRoZSBkZWZhdWx0Ci0JdGFyZ2V0LCBzZXQgbWF0Y2hfY291bnQgdG8gMSwgdG8gaWdub3JlIGFueSBwcmV2aW91cyBtYXRjaGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgc3JlYy5vLCBhZGQgcmVsb2MxNi5vLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCByZWxvYzE2Lm8gd2hlbiB3ZSBhZGQKLQljb2ZmLWg4MzAwLm8sIGNvZmYtaDg1MDAubywgY29mZi1zaC5vLCBjb2ZmLXo4ay5vLgotCU1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZSByZWxvYzE2Lm8uCi0KLQkqIGNvbmZpZy91NjhrLWNvZmYubXQ6IEZpeCB0eXBvLCBERUZBVUxUX1RBUkdFVCBmb3IKLQlERUZBVUxUX1ZFQ1RPUi4KLQotCSogY29uZmlnL2g4MzAwLWNvZmYubXQsIGg4NTAwLWNvZmYubXQsIHNoLWNvZmYubXQsIHN0MjAwMC5tdCwKLQl6OGstY29mZi5tdCAoREVGQVVMVF9WRUNUT1IpOiBEZWZpbmUuICBEb24ndCBleHBsaWNpdGx5IGFkZAotCVMtcmVjb3JkcyB2aWEgU0VMRUNUX1ZFQ1MuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3RvciksIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFsd2F5cwotCXN1cHBvcnQgUy1yZWNvcmRzLCBmb3IgY29udmVuaWVuY2UuCi0KLVRodSBBdWcgMTIgMDg6MzA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2hvd3RvX3RhYmxlLCBhbHBoYV9maW5pc2hfcmVsb2MsCi0JYWxwaGFfZWNvZmZfc3dhcF9yZWxvY197aW4sb3V0fSwgYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwKToKLQlSZWFkIGFuZCB3cml0ZSBBbHBoYSByZWxvY3MuICBDYW4ndCBwcm9jZXNzIHRoZW0geWV0LgotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZWNvZ25pemUgbmV3IHJlbG9jIHNlY3Rpb25zLgotCUlmIHRoZSBzZWN0aW9uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGNyZWF0ZSBpdC4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX3tpbixvdXR9KTogSGFuZGxlIG5ldyBmaWVsZHMgZGVmaW5lZAotCW9uIHRoZSBBbHBoYS4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgY29uc3RydWN0b3JfcmVsb2MgYW5kCi0JZmluaXNoX3JlbG9jIGZpZWxkcy4KLQkqIGVjb2ZmLmM6IE1vdmUgTUlQUyByZWxvYyBzdXBwb3J0IGZyb20gaGVyZS4uLgotCSogY29mZi1taXBzLmM6IHRvIGhlcmUuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBHZXQgY29uc3RydWN0b3IgcmVsb2MgaG93dG8KLQlmcm9tIGJhY2tlbmQuCi0JKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIHN0dWZmLiAgQ2FsbAotCWZpbmlzaF9yZWxvYyBiYWNrZW5kIGZ1bmN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIE1JUFMgc3BlY2lmaWMgYXNzZXJ0aW9ucy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2ZpbmlzaF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBGaWxsIGluIG5ldyBmaWVsZHMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFVzZSBOVUxMIGZvciBuZXcKLQlmaWVsZHMuCi0JKiB0YXJnZXRzLmM6IEFkZGVkIGV4dGVybiBmb3IgZWNvZmZhbHBoYV9saXR0bGVfdmVjLgotCi0JKiBiZmQuYyAoX2JmZF9ob3N0X2JpZ19lbmRpYW4pOiBSZW1vdmVkLgotCSogYmZkLWluLmggKEhPU1RfQllURV9PUkRFUl9CSUdfUCwgYmZkX2hlYWRlcl90d2lkZGxlX3JlcXVpcmVkKToKLQlSZW1vdmVkLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotV2VkIEF1ZyAxMSAxMjoxMToyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IE5ldyBmaWxlLCBicm9rZW4gb3V0IG9mIGNvbmZpZ3VyZS5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGl0LCBhbmQgdXNlIHN0YW5kYXJkIHRhcmdldCBuYW1lcyBmb3IKLQktLXdpdGgtdGFyZ2V0cywgcmVwbGFjaW5nIC0td2l0aC1iZmQtdGFyZ2V0cy4KLQotCSogYXJjaHVyZXMuYyAoYXJjaHVyZXNfaW5pdF90YWJsZSk6IEFkZCBiZmRfc2hfYXJjaC4KLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGNvZmYtbTY4ay5vIGZvciBtNjhrY29mZnVuX3ZlYy4KLQlJbmNsdWRlIG5sbTMyLm8gYW5kIG5sbS5vIGZvciBiZmRfbmxtMzJfaTM4Nl92ZWMuCi0JRml4IGVycm9yIGluIGVycm9yIG1lc3NhZ2UuCi0KLQkqIG9hc3lzLmM6IE1ha2UgYmZkX2Vycm9yX3ZlY3RvciBleHRlcm4uCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBzdGFiLXN5bXMubyBmb3IgYS5vdXQvYi5vdXQgdGFyZ2V0cwotCWFuZCBocDMwMHtic2QsaHB1eH0uCi0KLVdlZCBBdWcgMTEgMDY6NDA6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGQgdGhlIC5ic3MKLQlzZWN0aW9uIGJlZm9yZSBzZXR0aW5nIG91dHB1dF9oYXNfYmVndW4uCi0JKG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFJlbW92ZSBhcmd1bWVudCBuYW1lcyBmcm9tCi0JbWFuZ2xlX3JlbG9jc19mdW5jIHByb3RvdHlwZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBzaGFkb3dpbmcgbG9jYWwgdmFyaWFibGUuCi0JRG9uJ3Qgd3JpdGUgb3V0IGRlYnVnZ2luZyBzeW1ib2xzIGlmIGRlYnVnSW5mb09mZnNldCBpcyAtMS4gIEFkZAotCXRoZSBjb2RlSW1hZ2VPZmZzZXQgdG8gdGhlIHN0YXJ0LCBleGl0LCBhbmQgY2hlY2sgcHJvY2VkdXJlCi0Jb2Zmc2V0cy4KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfcmVsb2MsIG5sbV9pMzg2X21hbmdsZV9yZWxvY3MpOgotCURvbid0IGNoZWNrIHBhcnRpYWxfaW5wbGFjZSBmaWVsZDsgaXRzIHZhbHVlIGlzIGlycmVsZXZhbnQuCi0KLQkqIEJhc2UgdXNlIG9mIHNjby1jb3JlIG9uIGhvc3QsIG5vdCB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNF04Ni0qLXNjbyopOiBVc2UgaTM4NnNjbyByYXRoZXIgdGhhbiBpMzg2di4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdCAoVERFRklORVMpOiBSZW1vdmVkLgotCSogY29uZmlnL2kzODZzY28ubWg6IE5ldyBmaWxlIHRvIHVzZSBzY28tY29yZS4KLQkqIGhvc3RzL2kzODZzY28uaDogTmV3IGZpbGU7IGp1c3QgaW5jbHVkZXMgaG9zdHMvaTM4NnYuaC4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfe2hkcixleHR9X3tpbixvdXR9KTogVXNlIHNpZ25lZAotCWNvbnZlcnNpb25zIGZvciBzb21lIGZpZWxkcy4KLQotVHVlIEF1ZyAxMCAxMzozMjoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dwcmVsX3JlbG9jKTogSWYgX2dwIGlzIG5vdCBkZWZpbmVkLCBnaXZlIGFuCi0JZXJyb3IgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIG1hY2ggZmllbGQuCi0JKG5sbV9tYWNoaW5lKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogbmxtLmMgKG5sbV9ta29iamVjdCk6IFNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgZnJvbSBiYWNrZW5kCi0JaW5mb3JtYXRpb24uCi0JKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCk6IEluaXRpYWxpemUgbmV3IG1hY2ggZmllbGQuCi0KLVR1ZSBBdWcgMTAgMDk6MzE6MTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcGxhY2UgY2FsbHMgdG8gc29ydCB3aXRoIHNoZWxsIGNvZGUKLQl0byB1bmlxIHRoZSBsaXN0cy4KLQotVHVlIEF1ZyAxMCAwNjoyMzoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBhb3V0MzIubyBmb3IgYW55IGEub3V0L2Iub3V0IGZvcm1hdHMuCi0KLU1vbiBBdWcgIDkgMDk6Mzc6MTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGJmZF9lbGYzMl9pMzg2X3ZlYy4KLQkqIGNvbmZpZy9tNjhrLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IG02OGtjb2ZmX3ZlYy4KLQkqIGNvbmZpZy9pMzg2LWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGkzODZjb2ZmX3ZlYy4KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGhwcGFfdmVjLgotCSogY29uZmlnL3NwYXJjLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IHN1bm9zX2JpZ192ZWMuCi0JKiBjb25maWcvaTM4Ni1zY28ubXQgKFNFTEVDVF9WRUNTKTogRG9uJ3QgZGVmaW5lOyBJYW4gc2F5cyBpdCB3YXMKLQlqdXN0IGEgaGFjay4KLQotTW9uIEF1ZyAgOSAxMzoxNTowMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLWNvZmYubXQgKERFRkFVTFRfVkVDIC0+IERFRkFVTFRfVkVDVE9SKTogcmVuYW1lZC4KLQotTW9uIEF1ZyAgOSAxNDoyNjo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHN5bXMuYyAoQlNGX0VYUE9SVCk6IE5vdyBzYW1lIGFzIEJTRl9HTE9CQUwuCi0KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBOZXcgZnVuY3Rpb24uCi0KLU1vbiBBdWcgIDkgMTE6Mjk6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9hcmNoaXRlY3R1cmUsIGJmZF9nZXRfbWFjaGluZSk6IFJlbW92ZWQKLQlvYnNvbGV0ZSBtYWNyb3MuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX2FybWFwKTogQ29ycmVjdCBidWcgaW4gaW5pdGlhbGl6YXRpb24gb2YKLQlzdHJpbmdiYXNlLgotCi1TdW4gQXVnICA4IDEyOjIxOjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgdW5uZWVkZWQgdGVzdC4KLQotU3VuIEF1ZyAgOCAxMjo0MToyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHtkaXN0LHJlYWx9Y2xlYW4pOiBVc2UgJChNQUtFKSwgbm90IG1ha2UuCi0KLVNhdCBBdWcgIDcgMDk6MTQ6MjEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc3QyMDAwLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBNUkk7IG5vdCB1c2VkLgotCi0JKiBQT1JUSU5HLCBUT0RPLCBjb25maWcvUkVBRE1FOiBVcGRhdGUgdG8gcmVmbGVjdCBiZWxvdyBjaGFuZ2VzLgotCi0JKiBjb25maWd1cmUuaW46IFJlcGxhY2UgTUlOSU1JWkUgYW5kIC0td2l0aC1taW5pbWFsLWJmZCB3aXRoCi0JLS13aXRoLWJmZC10YXJnZXRzPSJ0YXJnZXQxLHRhcmdldDIsLi4uIiBhbmQgdGhlIHNwZWNpYWwgdGFyZ2V0Ci0JImFsbCIgdG8gZ2V0IHRoZSBwcmV2aW91cyBkZWZhdWx0IGJlaGF2aW9yLgotCUZpZ3VyZSBvdXQgd2hpY2ggYXJjaGl0ZWN0dXJlIGFuZCBiYWNrZW5kIC5vIGZpbGVzIGFyZSBuZWVkZWQgZnJvbQotCURFRkFVTFRfVkVDVE9SLCBTRUxFQ1RfVkVDUywgYW5kIFNFTEVDVF9BUkNISVRFQ1RVUkVTIGFzIHNldCBpbgotCXRoZSAubXQgZmlsZXMuICBEZWZpbmUgVERFRkFVTFRTIGJhc2VkIG9uIHRoZW0sIGFsc28uCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBNSU5JTUlaRS4KLQkqIGFyY2h1cmVzLmMsIHRhcmdldHMuYzogRGl0dG8uCi0KLQkqIGNvbmZpZy8qLm10OiBEZWZpbmUgREVGQVVMVF9WRUNUT1IsIFNFTEVDVF9WRUNTLCBhbmQKLQlTRUxFQ1RfQVJDSElURUNUVVJFUyBhcyB2YXJpYWJsZXMgcmF0aGVyIHRoYW4gYXMgLUQgYXJndW1lbnRzIHRvCi0JVERFRkFVTFRTLgotCi0JKiBjb25maWcvYTI5ay1jb2ZmLm10LGFscGhhb3NmLm10LCBpMzg2LXNjby5tdCwgaTk2MC1ib3V0Lm10LAotCWk5NjAtY29mZi5tdCAoVERFRkFVTFRTKTogRG9uJ3QgcHV0IHRoZSBkZWZhdWx0IHZlY3RvciBpbgotCVNFTEVDVF9WRUNTIG1hbnVhbGx5OyBpdCdzIGF1dG9tYXRpYyBub3cuCi0KLQkqIGNvbmZpZy9pMzg2LXNjby5tdCAoVERFRkFVTFRTKTogRG9uJ3QgcHV0ICZzY29fY29yZV92ZWMgaW4KLQlTRUxFQ1RfVkVDUyBtYW51YWxseTsgLURTQ09fQ09SRSBkb2VzIGl0IGF1dG9tYXRpY2FsbHkgbm93LgotCi0JKiBjb25maWcvaDgzMDAtY29mZi5tdCxoODUwMC1jb2ZmLm10LHNoLWNvZmYubXQsc3QyMDAwLm10LHo4ay1jb2ZmLm10Ci0JKFRERUZBVUxUUyk6IERvbid0IGRlZmluZSBCRkQ7IG5vdCB1c2VkLgotCi0JKiBjb25maWcvaHBwYW9zZi5taCAoSERFRklORVMpOiBEb24ndCBkZWZpbmUgU0VMRUNUX0FSQ0hJVEVDVFVSRVM7Ci0JdGhpcyBpcyBhIGhvc3QsIG5vdCBhIHRhcmdldC4KLQotU2F0IEF1ZyAgNyAwNToyODowMyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiAgQWRkIGNvbW1lbnQgYWJvdXQgd2hhdCB0aGlzIGZ1bmN0aW9uCi0JZG9lcyBhbmQgdG8gd2F0Y2ggb3V0IGZvciBzaWRlIGVmZmVjdHMuICBBZGQgRklYTUUgZm9yIG1lbW9yeSBsZWFrcy4KLQlGaXggY29tbWVudCBhYm91dCBjaGVja2luZyBmb3IgbWF0Y2hpbmcgYnl0ZSBvcmRlci4gIFByZXNlcnZlCi0JcG9pbnRlciB0byBvbGQgdGRhdGEgKGlmIGFueSksIGFuZCByZXN0b3JlIGl0IGlmIHdlIGRvbid0IG1hdGNoCi0JZmlsZSB3aXRoIHRhcmdldCB2ZWN0b3IuICBJZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGdvdG8ncywgdXNlIHRoZW0KLQljb25zaXN0ZW50bHkgYW5kIG1haW50YWluYWJseS4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogIEV4cGFuZCBjb21tZW50cyBhYm91dCBsZWFrZWQgbWVtb3J5Ci0JdG8gbm90ZSB0aGF0IHRoZSBwcm9ibGVtIGlzIGV2ZW4gbW9yZSBzZXJpb3VzIHRoYW4ganVzdCBsZWFrZWQKLQltZW1vcnkuICBSZXBsYWNlIGdvdG8gd2l0aCBtb3JlIHRyYWRpdGlvbmFsIHJldHVybi4KLQotRnJpIEF1ZyAgNiAxMjowMDowMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlGaXggaW5jb3JyZWN0IG9yIHVzZWxlc3MgbWFrZWZpbGUgdmFyaWFibGUgZGVmaW5pdGlvbnM6Ci0JKiBjb25maWcvbmV3cy5tdCwgY29uZmlnL3U2OGstY29mZi5tdCAoVERFRkFVTFRTKTogVXNlIHRoaXMgdG8KLQlkZWZpbmUgREVGQVVMVF9WRUNUT1IsIGluc3RlYWQgb2YgVERFRklORVMuCi0JKiBjb25maWcvaTM4NmFpeC5taCAoTUlOSU1JWkUpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvaHBwYW9zZi5taCAoTUlOSU1JWkUpOiBEb24ndCBjb25kaXRpb25hbGl6ZS4KLQkqIGNvbmZpZy9yczYwMDAubWggKEFMTE9DQSksCi0JKiBjb25maWcvaTM4NnYubWggKEFMTE9DQSksCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oIChBTExPQ0EpLAotCSogY29uZmlnL2kzODZpc2MubWggKEFMTE9DQSksCi0JKiBjb25maWcvZ28zMi5taCAoRVhUUkFMSUJTKTogRG9uJ3QgZGVmaW5lOyBub3QgdXNlZC4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSERFRklORVMpOiBSZW5hbWVkIGZyb20gSF9ERUZJTkVTLgotCSogY29uZmlnL2FscGhhb3NmLm10IChUREVGSU5FUyk6IFNldCBpdCwgbm90IEhERUZJTkVTLgotCSogY29uZmlnL3o4ay1jb2ZmLm10IChDQyk6IERvbid0IGRlZmluZS4gIEl0J3MgYSB0YXJnZXQsIG5vdCBhIGhvc3QuCi0KLQkqIGNvbmZpZy9SRUFETUU6IE5ldyBmaWxlLCBleHBsYWluaW5nIHRoZSB2YXJpYWJsZXMuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZCBocDMwMF9ic2RfdmVjLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTLCBDRklMRVMpOiBBZGQgaHAzMDBic2QuCi0JKGhwMzAwYnNkLm8pOiBOZXcgcnVsZS4KLQotRnJpIEF1ZyAgNiAxNToxMzoyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChOQU1FKTogUHJvdmlkZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiwgdGhhdCdzIG5laXRoZXIKLQlmb3IgMzIgYml0cyBub3IgZm9yIDY0LgotCi0JVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogbGliZWxmLmggKGVsZl9oYXNoKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIGJmZF9lbGZfaGFzaCwgc2luY2UKLQl0aGF0IGlzIHdoYXQgaXMgaW4gZWxmLmMuCi0KLUZyaSBBdWcgIDYgMTI6Mjg6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBSZW1vdmVkIHNwZWNpYWwgaGFuZGxpbmcgZm9yCi0Jc2NCc3MgYW5kIHNjU0JzcyBzeW1ib2xzLCBzaW5jZSBpdCB3YXMgd3JvbmcuCi0KLQkqIE1ha2VmaWxlLmluIChjb2ZmLW1pcHMubywgY29mZi1hbHBoYS5vKTogRG9uJ3QgZGVwZW5kIG9uCi0JY29mZmNvZGUuaC4KLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJbnNwaXJlZCBieSBtYkB0dGkuQ09NIChNaWNoYWVsCi0JQmxvb20pOiBPbmx5IHNldCBTVFlQX0JTUyBmb3IgU0VDX0FMTE9DIHNlY3Rpb25zLgotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9hcm1hcCk6IEZyb20gQXJuZSBIZW5yaWsgSnV1bAotCTxhcm5lakBrYXJpLmZtLnVuaXQubm8+OiBIYW5kbGUgYSBDT0ZGIHN0eWxlIGFybWFwLgotCi1GcmkgQXVnICA2IDA5OjU5OjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHV4LWNvcmUuYzogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBiZmRfemFsbG9jLgotCi1UaHUgQXVnICA1IDEzOjIyOjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAobG9nMik6IERlbGV0ZSBpMzg3LXNwZWNpZmljIGNvZGUuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFsd2F5cyBpbmNsdWRlIGVsZi5vLgotCShCRkQzMl9CQUNLRU5EUyk6IERvbid0IGluY2x1ZGUgZWxmLm8gaGVyZS4KLQkob2ZpbGVzKTogRGVsZXRlIHJlZmVyZW5jZXMgdG8gb2ZpbGVzMiBhbmQgb2ZpbGVzMy4KLQkoZG9fY2xlYW4pOiBEZWxldGUgb2ZpbGVzLgotCShCRkRJTl9IKTogQ2hhbmdlZCByZWZlcmVuY2VzIHRvICQoc3JjZGlyKS9iZmQtaW4yLmguCi0JKHN0bXAtYmZkLmgpOiBVc2UgYmZkLmgtbmV3IGFzIHRlbXBvcmFyeSBuYW1lLCBub3QgYmZkLmgyLgotCShoZWFkZXJzKTogVXNlIGJmZC1pbjIuaC1uZXcgYXMgdGVtcG9yYXJ5IG5hbWUsIG5vdCBiZmQuaC1uZXcuCi0KLQkqIGJmZC1pbi5oOiBSZXdvcmRlZCBjb21tZW50IHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBiZmQtaW4yLmggaXMgYQotCWdlbmVyYXRlZCBmaWxlLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZCBpMzg2LWVsZiByZWxvYyB0eXBlcwotCShmcm9tIE1laXNzbmVyJ3MgYWRkaXRpb25zIHRvIGJmZC1pbjIuaCkuCi0KLQkqIGVsZjMyLWkzODYuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi0JTWVyZ2VkOgotCi0JV2VkIEp1biAyMyAwNjowNTo1OCAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgZHJvcCBjb3JlIGlmCi0JZWxmX3N5bWJvbF9mcm9tIHJldHVybnMgYSBOVUxMIHBvaW50ZXIgd2hlbiBwcm9jZXNzaW5nIGEgbm9uLWVsZgotCXN5bWJvbCwgdXNlIGEgMCBzaXplIGluc3RlYWQuCi0KLQlUdWUgSnVuIDE1IDE0OjM4OjMyIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9oYXNoKTogRGVsZXRlIG1hY3JvIG1hcHBpbmcgZWxmX2hhc2ggdG8KLQliZmRfZWxmMzJfaGFzaCwgc2luY2UgdGhlIGhhc2ggdGFibGUgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIDMyLzY0Ci0JYml0IHN5c3RlbS4KLQotCSogbGliZWxmLmggKGVsZl9oYXNoKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIGJmZF9lbGZfaGFzaCwgc2luY2UKLQl0aGF0IGlzIHdoYXQgaXMgaW4gZWxmLmMuCi0KLQlTYXQgSnVuIDE5IDEwOjEyOjI3IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGYzMi1pMzg2LmggKHJlbG9jX3R5cGUpOiBSZWZvcm1hdCBzcGFjaW5nLgotCShlbGZfaG93dG9fdGFibGUpOiBBZGQgdGhlIHJlc3Qgb2YgdGhlIDM4Ni9FTEYgcmVsb2NhdGlvbnMuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG8pOiBEaXR0by4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBEaXR0by4KLQotVGh1IEF1ZyAgNSAxMDowNzo0MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogIFRlc3QgcmV0dXJuIHZhbHVlCi0Jb2YgbmxtX3NsdXJwX3N5bWJvbF90YWJsZSBhcyBib29sZWFuLCBub3QgcG9pbnRlci4KLQkqIG5sbWNvZGUuaCAobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6ICBUZXN0IHJldHVybiB2YWx1ZQotCW9mIG5sbV9zbHVycF9yZWxvY19maXh1cHMgYXMgYm9vbGVhbiwgbm90IHBvaW50ZXIuCi0KLVdlZCBBdWcgIDQgMTY6MjI6NTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogcmVtb3ZlIEhERUZJTkVTOyBzaW5jZSBfX01TRE9TX18gYW5kIF9fR08zMl9fCi0JYXJlIG5vdyBwcmVkZWZpbmVkIGJ5IEdDQwotCi1XZWQgQXVnICA0IDE2OjA2OjI5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IEFkZCB0aGUgc2VjdGlvbiBvZmZzZXQgdG8gdGhlCi0JbGluZSBudW1iZXIgYWRkcmVzcywgc28gaXQncyBwcmludGVkIHRoZSBzYW1lIHdheSBhcyB0aGUgZnVuY3Rpb24KLQlhZGRyZXNzLiAgT25seSBzaG93ZWQgdXAgZm9yIGxpbmUgbnVtYmVycyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlyc3QKLQlzZWN0aW9uICgudGV4dCkuCi0KLVdlZCBBdWcgIDQgMDg6MzM6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIG5sbV9tYW5nbGVfcmVsb2NzLgotCShubG1fbWFuZ2xlX3JlbG9jc19mdW5jKTogTmV3IG1hY3JvLgotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl93cml0ZV9yZWxvYyk6IFJld3JvdGUgY29ycmVjdGx5LgotCShubG1faTM4Nl9tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTW92ZSBhbGwgY29tbW9uCi0Jc3ltYm9scyBpbnRvIHRoZSAuYnNzIHNlY3Rpb24uCi0JKG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENhbGwgdGhlIG1hbmdsZV9yZWxvY3MgZnVuY3Rpb24uCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYW55IGRlZmluZWQKLQlzeW1ib2wgYXMgYW4gaW50ZXJuYWwgcmVsb2MuICBGaXggYnVnIGluIGV4dGVybmFsIHJlbG9jIGNvdW50aW5nLgotCUdldCB0aGUgb2Zmc2V0IGFuZCBkZWJ1Z2dpbmcgdHlwZSByaWdodCBmb3IgLmJzcyBzeW1ib2xzLiAgT25seQotCW91dHB1dCBkZWJ1Z2dpbmcgc3ltYm9scyBmb3IgZGVmaW5lZCBzeW1ib2xzLgotCi0JKiBjb2ZmLWg4NTAwLmMgKHJ0eXBlMmhvd3RvKTogRG8gYW4gZnByaW50ZiB0byBzdGRlcnIgcmF0aGVyIHRoYW4KLQl1c2luZyBwcmludGYuCi0JKiBjb2ZmLXo4ay5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChUUkFDRSk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUsIHN3YXBfc3RkX3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogRG8gYW4gZnByaW50ZiB0byB0aGUgZmlsZQotCWFyZ3VtZW50IHJhdGhlciB0aGFuIHVzaW5nIHByaW50Zi4KLQotVHVlIEF1ZyAgMyAxODoxNzoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZzd2FwLmg6IEFkZGVkIG1hY3JvcyB1c2VkIHdoZW4gYWNjZXNzaW5nIHNldmVyYWwgZmllbGRzOwotCWRlZmF1bHQgaXMgdGhlIHNhbWUgYXMgYmVmb3JlLgotCShjb2ZmX3N3YXBfYW91dGhkcl97aW4sb3V0fSk6IEhhbmRsZSB0aGUgQWxwaGEgRUNPRkYgZmllbGRzLgotCSogY29mZi1hbHBoYS5jOiBEZWZpbmVkIG1hY3JvcyB0byB1c2UgdGhlIHJpZ2h0IHNpemVzIGluCi0JY29mZnN3YXAuaC4KLQkqIGxpYmVjb2ZmLmg6IEJhY2tlbmQgaW5mb3JtYXRpb24gaXMgbm93IGluIHRhcmdldCB2ZWN0b3IsIG5vdAotCUJGRC4gIFN0YXJ0IG9mIGJhY2tlbmQgaW5mb3JtYXRpb24gaXMgQ09GRiBiYWNrZW5kIGluZm9ybWF0aW9uLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYzogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogTmV3IGZ1bmN0aW9uLgotCShBUk1BUF9TVEFSVCk6IENoYW5nZWQgaW50byBiYWNrZW5kIGluZm9ybWF0aW9uLCBzaW5jZSBBbHBoYSB1c2VzCi0JYSBkaWZmZXJlbnQgbmFtZS4KLQkoZWNvZmZfc2x1cnBfYXJtYXApOiBEb24ndCBvdmVybGF5IGFyY2hpdmUgaGVhZGVyLgotCSogYmZkLmM6IEluY2x1ZGUgbGliY29mZi5oLgotCi1UdWUgQXVnICAzIDE2OjMzOjExIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBGaXggc2ggc3ludGF4IGVycm9yLgotCi0JKiBhb3V0ZjEuaDogTWFrZSBiZmRfZXJyb3JfdHJhcCBleHRlcm47IGl0J3MgZGVmaW5lZCBpbiBiZmQuYy4KLQotVHVlIEF1ZyAgMyAxNToxOTowOSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtX3NsdXJwX3N5bWJvbF90YWJsZTogRG9uJ3QgdXNlICcmJyBvbiBhcnJheXMuCi0KLVR1ZSBBdWcgIDMgMTE6MDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jOiBOZXcgZmlsZSBmb3IgZ2VuZXJpYyBFQ09GRiBmdW5jdGlvbnMuCi0JKiBlY29mZnN3YXAuaDogTmV3IGZpbGUgZm9yIEVDT0ZGIHN3YXBwaW5nIGZ1bmN0aW9ucyB3aGljaCBkaWZmZXIKLQlvbmx5IHNsaWdodGx5IGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KLQkqIGxpYmVjb2ZmLmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIGVjb2ZmLmMgZnVuY3Rpb25zLgotCShlY29mZl9iYWNrZW5kX2RhdGEpOiBOZXcgc3RydWN0dXJlLgotCShlY29mZl90ZGF0YSk6IEFkZGVkIGJhY2tlbmRfZGF0YSBmaWVsZC4gIENoYW5nZWQgZXh0ZXJuYWwgZGF0YQotCXBvaW50ZXJzIHRvIGJlIFBUUiByYXRoZXIgdGhhbiB0byBhIHBhcnRpY3VsYXIgc3RydWN0LgotCShlY29mZl9zeW1ib2xfc3RydWN0KTogTW92ZWQgaW4gZnJvbSBjb2ZmLW1pcHMuYy4KLQkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmM6IE1vdmVkIGNvbW1vbiBmdW5jdGlvbnMgaW50byBlY29mZi5jLgotCUFkZGVkIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlcy4gIEluY2x1ZGUgZWNvZmZzd2FwLmguCi0JKiBjb2ZmLW1zeW0uYzogUmVtb3ZlZDsgc3VwZXJzZWRlZCBieSBlY29mZnN3YXAuaC4KLQkqIGJmZC5jOiBJbmNsdWRlIGNvZmYvaW50ZXJuYWwuaC4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZWQgY29mZi1taXBzLm8gYW5kIGNvZmYtbXN5bS5vLgotCUFkZGVkIGVjb2ZmLm8uCi0JKEJGRDY0X0JBQ0tFTkRTKTogQWRkZWQgY29mZi1hbHBoYS5vLgotCShDRklMRVMpOiBSZW1vdmVkIGNvZmYtbXN5bS5jLiAgQWRkZWQgZWNvZmYuYy4KLQkoYmZkLm8pOiBBZGRlZCBkZXBlbmRlbmN5IG9uICQoSU5DRElSKS9jb2ZmL3N5bS5oLgotCShjb2ZmLW1pcHMubyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gZWNvZmZzd2FwLmggYW5kIGNvZmYvZWNvZmYuaC4KLQkoZWNvZmYubywgY29mZi1hbHBoYS5vKTogTmV3IHRhcmdldHMuCi0JKGNvZmYtbXN5bS5vKTogUmVtb3ZlZCB0YXJnZXQuCi0KLU1vbiBBdWcgIDIgMjM6MzM6MzggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuaCwgaG9zdHMvKjogIFJlbW92ZSAob25lIG1vcmUgdGltZSkgYWxsIG9jY3VycmFuY2VzCi0Jb2YgRVhGVU4gaW4gdGhlIEJGRCBzb3VyY2VzLiAgSGVhdmUgaG8hCi0KLU1vbiBBdWcgIDIgMTY6NDU6NTcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiAgQWRkIGNoZWNrIGZvciBJMzg2TFlOWE1BR0lDLgotCi1Nb24gQXVnICAyIDEyOjE4OjAzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiByZW1vdmUgc29tZSBtb3JlIGNvbmZsaWN0aW5nIGRlY2xzCi0KLU1vbiBBdWcgIDIgMTE6NDg6MjMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYzogIFJlbW92ZSB1bm5lY2Vzc2FyeSBkZWYgb2YgTl9IRUFERVJfSU5fVEVYVCwKLQlyZWRlZmluZSBURVhUX1NUQVJUX0FERFIgdG8gYmUgMC4KLQotU3VuIEF1ZyAgMSAyMjo1NDowOCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlndXJlLmluLCBob3N0cy9pMzg2bHlueC5oOiAgTHlueC8zODYKLQlob3N0IGFuZCB0YXJnZXQgaW5mby4KLQotRnJpIEp1bCAzMCAxODowODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbTMyLWkzODYuYzogTmV3IGZpbGUuICBGaXJzdCBjdXQgYXQgaTM4NiBOTE0gY29kZS4KLQkqIGxpYm5sbS5oOiBBZGRlZCBzb21lIG1vcmUgcHJvdG90eXBlcy4KLQkoc3RydWN0IG5sbV9yZWxlbnQpOiBOZXcgc3RydWN0dXJlLgotCShubG1OQU1FKHN5bWJvbF90eXBlKSk6IEFkZGVkIHJjbnQgYW5kIHJlbG9jcyBmaWVsZHMuCi0JKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogQWRkZWQgbmV3IGZpZWxkczogbmxtX3N5bWJvbHMsCi0JbmxtX3RleHRfbG93LCBubG1fZGF0YV9sb3csIG5sbV9yZWxvY19maXh1cHMsCi0JbmxtX3JlbG9jX2ZpeHVwX3NlY3MuCi0JKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogTmV3IHN0cnVjdHVyZSwgd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0JKiBubG1jb2RlLmg6IFVzZSBOTE1fSElCSVQgcmF0aGVyIHRoYW4gTVNCLgotCShubG1fb2JqZWN0X3ApOiBTZXQgU0VDX1JFTE9DIGZvciAudGV4dCBhbmQgLmRhdGEuICBEb24ndCBzZXQKLQlTRUNfREFUQSBmb3IgLmJzcy4gIFNldCBIQVNfUkVMT0MgYW5kIEhBU19TWU1TIGZvciBhYmZkLiAgU2V0IHRoZQotCWFyY2hpdGVjdHVyZS4KLQkobmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwgbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX291dCwKLQlmaW5kX25vbnplcm8sIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IE5ldyBvdXRib3VuZAotCXN3YXBwaW5nIGZ1bmN0aW9ucy4KLQkobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBJbmNsdWRlCi0JZXh0ZXJuYWwgcmVmZXJlbmNlcyBpbiBzeW1ib2wgdGFibGUgYXMgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKG5sbV9nZXRfc3ltdGFiLCBubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogRmlsbCBpbiBhbG9jYXRpb24KLQlhcmd1bWVudCBpbiBnZXRfc3ltdGFiIHJhdGhlciB0aGFuIGluIHNsdXJwX3N5bWJvbF90YWJsZS4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNhdmUgc3ltYm9sIGluZm9ybWF0aW9uIGluIHRkYXRhLgotCShubG1fcHJpbnRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShubG1fc2x1cnBfcmVsb2NfZml4dXBzLCBubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLAotCW5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiBOZXcgZnVuY3Rpb25zIHRvIHJlYWQgcmVsb2NzLgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBubG1fc2V0X3NlY3Rpb25fY29udGVudHMsCi0JbmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUsIG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBOZXcKLQlmdW5jdGlvbnMgdG8gY3JlYXRlIE5MTSBmaWxlcy4KLQkqIG5sbS10YXJnZXQuaDogRGVmaW5lIGFsbCB0aGUgbmxtIGZ1bmN0aW9ucyBoZXJlIGVpdGhlciBhcwotCWRlZmF1bHQgdmFsdWVzIG9yIGluIHRlcm1zIG9mIG5sbU5BTUUuICBVc2UgSlVNUF9UQUJMRShubG0pLiAgU2V0Ci0JdGhlIGJhY2tlbmRfZGF0YSBmaWVsZCB0byBUQVJHRVRfQkFDS0VORF9EQVRBLgotCSogbmxtMzItZ2VuLmMsIG5sbTY0LWdlbi5jOiBEb24ndCBkZWZpbmUgZnVuY3Rpb24gbWFjcm9zIGhlcmU7Ci0JdGhleSBhcmUgbm93IGluIG5sbS10YXJnZXQuaC4KLQkoVEFSR0VUX0JBQ0tFTkRfREFUQSk6IERlZmluZSBhcyBOVUxMLgotCSogbmxtLmMgKG5sbV9ta29iamVjdCk6IERvIGFsbG9jYXRlIHRoZSB0ZGF0YSBmaWVsZC4KLQkobmxtX3NldF9hcmNoX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKiB0YXJnZXRzLmM6IEFkZGVkIG5sbTMyX2kzODZfdmVjLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkZWQgbmxtMzItaTM4Ni5vLgotCShDRklMRVMpOiBBZGRlZCBubG0zMi1pMzg2LmMuCi0JKG5sbTMyLWdlbi5vLCBubG02NC1nZW4ubyk6IERlcGVuZCBvbiBubG0tdGFyZ2V0LmguCi0JKG5sbTMyLWkzODYubyk6IE5ldyB0YXJnZXQuCi0KLVRodSBKdWwgMjkgMjA6MjA6MzkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IHJlbW92ZSBzb21lIGZ1bmN0aW9uIGRlY2xzIHRoYXQgY29uZmxpY3Qgdy8gQU5TSQotCUMsIGFuZCBhcmVuJ3QgbmVlZGVkIGFueXdheSAocmV0dXJuIGludCkKLQotV2VkIEp1bCAyOCAxNTo0NjozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogVXNlIGNhc3RzIHdpdGggYmZkX2FsbG9jIGFuZCBhbGxvY2EuCi0KLVR1ZSBKdWwgMjcgMTI6NTE6NDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbXszMiw2NH0tZ2VuLmMgKEpVTVBfVEFCTEVfUFJFRklYKTogIERlbGV0ZS4KLQkqIG5sbXszMiw2NH0tZ2VuLmMgKEpVTVBfVEFCTEVfSU5JVCk6ICBOZXcgbWFjcm8gdGhhdCB3b3JrcyB3aXRoCi0Jb2xkZXIgY3BwJ3MsIHRoYXQgZG9uJ3QgZG8gYWRkaXRpb25hbCByZXBsYWNlbWVudCBvbiB0aGUgSlVNUF9UQUJMRQotCW1hY3JvJ3MgYXJndW1lbnQuCi0JKiBubG0tdGFyZ2V0LmggKEpVTVBfVEFCTEVfSU5JVCk6ICBVc2UgbmV3IG1hY3JvIGluIHBsYWNlIG9mCi0JSlVNUF9UQUJMRSBtYWNyby4KLQotTW9uIEp1bCAyNiAxNzozOTowMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCVlldCBhbm90aGVyIHRyYWQtY29yZSB2YXJpYW50OgotCSogY29uZmlnL2VzaXgubWgsIGhvc3RzL2VzaXguaDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmhvc3RzOiBVc2UgdGhlbS4KLQotTW9uIEp1bCAyNiAxMzoyMjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgdGhlIGNhc2Ugb2YKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgcmlnaHRzaGlmdCA+IGJpdHBvcywgYW5kIGEgbmVnYXRpdmUKLQludW1iZXIuCi0KLU1vbiBKdWwgMjYgMTQ6NDA6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IFJlaW1wbGVtZW50IHNlZ21lbnQgd3JpdGluZy4KLQkoZWxmX3dyaXRlX3BoZHJzKTogVXNlIHByZWNvbXB1dGVkIGVfcGhvZmYgcmF0aGVyIHRoYW4gbWFraW5nCi0JYXNzdW1wdGlvbnMuCi0JKGVsZl9idWlsZF9waGRycyk6IERpc2FibGVkLCBmb3Igbm93LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IERvbid0IGNoYW5nZSBmaWxlIG9mZnNldCBmb3IKLQlTSFRfTk9CSVRTLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3N5bXRhYl9hbmRfc3RydGFicyk6IE5ldyBmdW5jdGlvbi4KLQkoc3RydWN0IHNlZ19pbmZvKTogTmV3IHR5cGUuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogTmV3IGZ1bmN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEZvciBleGVjdXRhYmxlcywgbGVhdmUKLQlzZWN0aW9uIGhlYWRlcnMgJmMgZm9yIGxhc3QsIGFuZCBwcm9wZXJseSBhbGlnbiBhbGwgc2VjdGlvbnMgd2l0aAotCWZsYWcgU0hGX0FMTE9DIHNldC4KLQkocHJlcF9oZWFkZXJzKTogTm8gbG9uZ2VyIGFib3J0IHdoZW4gRVhFQ19QIGlzIHNldC4KLQkod3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWxldGVkIGFsbCBjb2RlIHJlbGF0aW5nIHRvIHByb2dyYW0KLQlzZWdtZW50cy4KLQotCSogZWxmY29kZS5oICh2YXJpb3VzKTogRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLCBhbmQgZGVidWdnaW5nCi0JIm1hbGxvYygwKSIgY2FsbHMuCi0JKHdyaXRlX3JlbG9jcyk6IENhY2hlIHZhbHVlIG9mIGxhc3Qgc3ltYm9sIGxvb2tlZCB1cCwgdG8gc2F2ZQotCXRpbWUgaWYgdGhlIHN5bWJvbCBpcyByZWZlcnJlZCB0byByZXBlYXRlZGx5LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIG9ubHkgU0VDX1JFTE9DIGZsYWcsIG5vdCBudW1iZXIgb2YKLQlyZWxvY3MuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKG9maWxlcyk6IFN0YXJzIGluIHdpbGRjYXJkcyBiZWxvbmcgb3V0c2lkZSBxdW90ZXMuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZCwgbWF4cGFnZXNpemUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IGZpZWxkLCBwaGRyLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgbWF4cGFnZXNpemUgZnJvbQotCUVMRl9NQVhQQUdFU0laRS4KLQkoRUxGX01BWFBBR0VTSVpFKTogRGVmYXVsdCB0byAxLgotCSogZWxmNjQtdGFyZ2V0LmggKGVsZjY0X2JlZCwgRUxGX01BWFBBR0VTSVpFKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IEFsbCByZWxvY3Mgc2hvdWxkIGhhdmUgcGNyZWxfb2Zmc2V0PXRydWUuCi0JTW9zdCBzaG91bGQgaGF2ZSBsZW5ndGggZmllbGQgb2YgYDInLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIDY0LWJpdCByZWxvY3MuCi0KLQkqIGNvbmZpZy9zcGFyYy1hb3V0Lm10IChUQVJHRVRfQkFDS0VORFMpOiBEZWZpbmUuCi0KLU1vbiBKdWwgMjYgMDg6NTY6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGxvb2sgaW4gJHtzcmNkaXJ9IGZvciAke3RhcmdldF9tYWtlZmlsZV9mcmFnfTsKLQl0aGUgdG9wIGxldmVsIHNjcmlwdCBoYXMgYWxyZWFkeSBhZGp1c3RlZCBmb3IgaXQuCi0KLU1vbiBKdWwgMjYgMDg6MDk6MTkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiAgR2V0IENSIExGIGluIHRoZSByaWdodCBvcmRlci4KLQotTW9uIEp1bCAyNiAwMjowODo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvdmF4YnNkLmg6IEluY2x1ZGUgc3RkLWhvc3QuaC4gIERvbid0IGluY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4uCi0KLVNhdCBKdWwgMjQgMTY6MTM6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIGNhc2Ugb2YgcmlnaHRzaGlmdCAhPQotCWJpdHBvcyB3aGVuIG92ZXJmbG93IGNoZWNraW5nLgotCi1GcmkgSnVsIDIzIDEwOjIwOjI3IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLCBiZmRfdW5kZWZpbmVkX3N5bWJvbCwKLQliZmRfcmVsb2NfdmFsdWVfdHJ1bmNhdGVkLCBiZmRfcmVsb2NfaXNfZGFuZ2Vyb3VzLCBiZmRfYXNzZXJ0KToKLQlTZW5kIGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyci4KLQotVGh1IEp1bCAyMiAxNTo1NzoyOSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtezMyLDY0fS10YXJnZXQuaDogIFJlbW92ZS4KLQkqIG5sbS10YXJnZXQuaDogIE5ldyBmaWxlLCBtZXJnZWQgZnJvbSBubG17MzIsNjR9LXRhcmdldC5oCi0JKiBsaWJubG0uaCAoTkxNX0FSQ0hfU0laRSk6ICBEZWZpbmUgdG8gQVJDSF9TSVpFLgotCSogbmxtLmMgKEFSQ0hfU0laRSk6ICBSZW1vdmUgZGVmaW5lIHRvIHplcm8uCi0JKiBubG0zMi1nZW4uYyAoQVJDSF9TSVpFKTogIERlZmluZSB0byAzMi4KLQkqIG5sbTMyLWdlbi5jIChKVU1QX1RBQkxFX1BSRUZJWCk6ICBEZWZpbmUgdG8gbmxtMzIuCi0JKiBubG17MzIsNjR9LWdlbi5jIChubG0tdGFyZ2V0LmgpOiAgSW5jbHVkZS4KLQkqIHRhcmdldHMuYywgbGlibmxtLmgsIG5sbS5jLCBubG17MzIsNjR9LWdlbi5jLCBubG17MzIsNjR9LmMsCi0JbmxtY29kZS5oOiAgQ29udmVydCBwcmVmaXhlcyBmcm9tIGJmZF9ubG08c2l6ZT4gdG8ganVzdAotCW5sbTxzaXplPiwgYW5kIHVzZSBtYWNyb3Mgc2VsZWN0IHNpemUuCi0KLVRodSBKdWwgMjIgMTU6NDA6MTQgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBhZGQgY29uZmlndXJlLmluLCBkcm9wIHJlZHVuZGFudAotCSAgJChzcmNkaXIpLCBkcm9wIHJlZHVuZGFudCAuLwotCi1UaHUgSnVsIDIyIDEzOjM0OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaHB1eC1jb3JlLmM6IE5ldyBmaWxlOyBiYWNrZW5kIGZvciBIUC9VWCBzdHlsZSBjb3JlIGZpbGVzLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogUmVuYW1lZCBocHBhX2NvcmVfZGF0YSBmaWVsZCB0bwotCWhwdXhfY29yZV9kYXRhLgotCSogYmZkLWluMi5oOiBVcGRhdGVkLgotCSogaHBwYS5jIChtYWtlX2JmZF9hc2VjdGlvbiwgaHBwYV9jb3JlX2ZpbGVfcCwKLQlocHBhX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQsIGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLAotCWhwcGFfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogTW92ZWQgaW50byBocHV4LWNvcmUuYy4KLQlSZW1vdmVkIGZyb20gdGFyZ2V0IHZlY3Rvci4KLQkqIGxpYmhwcGEuaCAoc3RydWN0IGhwcGFfY29yZV9zdHJ1Y3QgYW5kIGFjY2Vzc29yIG1hY3Jvcyk6IE1vdmVkCi0JaW50byBocHV4LWNvcmUuYy4KLQkqIHRhcmdldHMuYzogSWYgSFBVWF9DT1JFIGlzIGRlZmluZWQsIGFkZCBocHV4X2NvcmVfdmVjIHRvCi0JdGFyZ2V0IGxpc3QuCi0JKiBjb25maWcvaHAzMDAubWggKEhERUZJTkVTKTogU2V0IHRvIC1ESFBVWF9DT1JFLgotCShIREVQRklMRVMpOiBTZXQgdG8gaHB1eC1jb3JlLm8uCi0JKiBjb25maWcvaHBwYWJzZC5taCwgY29uZmlnL2hwcGFocHV4Lm1oOiBMaWtld2lzZS4KLQkqIGhvc3RzL2hwMzAwLmggKEhPU1RfSFAzMDBIUFVYKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogQWRkZWQgc2NvLWNvcmUubywKLQlhaXgzODYtY29yZS5vLCBocHV4LWNvcmUuby4KLQkoc2NvLWNvcmUubywgYWl4Mzg2LWNvcmUubywgaHB1eC1jb3JlLm8pOiBOZXcgZGVwZW5kZW5jaWVzLgotCi0JKiByZWxvYy5jIChlbnVtIGNvbXBsYWluX292ZXJmbG93KTogTmV3IGVudW1lcmF0aW9uIHdpdGggdGhlCi0JdmFyaW91cyBmbGF2b3VycyBvZiBvdmVyZmxvdyBjaGVja2luZy4KLQkoc3J0dWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IENoYW5nZWQgY29tcGxhaW5fb25fb3ZlcmZsb3cgZmllbGQKLQlmcm9tIGJvb2xlYW4gdG8gZW11bSBjb21wbGFpbl9vdmVyZmxvdy4gIFJlbW92ZWQgb2Jzb2xldGUgYWJzb2x1dGUKLQlmaWVsZC4KLQkoSE9XVE8pOiBSZW1vdmVkIGFic29sdXRlIGFyZ3VtZW50LgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gYWxsIHR5cGVzIG9mCi0JZmllbGRzLgotCSogYmZkLWluMi5oOiBVcGRhdGVkIGFjY29yZGluZ2x5LgotCSogYWxsIHRhcmdldHM6IFVwZGF0ZWQgaW5pdGlhbGl6YXRpb24gb2YgcmVsb2MgaG93dG8gdGFibGVzLgotCi1XZWQgSnVsIDIxIDIwOjM0OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9jcmVhdGUpOiBEb24ndCB1c2UgQysrIGtleXdvcmQgInRlbXBsYXRlIiBhcyBhIEMKLQl2YXJpYWJsZSBuYW1lLgotCi1UdWUgSnVsIDIwIDE1OjAyOjIzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19ob3d0bzJydHlwZSk6ICBNYWtlIGFyZyBDT05TVCB0byBtYXRjaCBjYWxsZXJzLgotCi0JKiBlbGZjb2RlLmg6ICBGaXggc2V2ZXJhbCBpbGxlZ2FsIHBvaW50ZXIgY29tYmluYXRpb24gd2FybmluZ3MgZm9yCi0JdXNhZ2VzIG9mIGJmZF9hbGxvYyBhbmQgYWxsb2NhLgotCi0JKiBsaWJubG0uaCAobmxtX29ial90ZGF0YSk6ICBSZW5hbWUgaGlkZGVuIHN0cnVjdCBtZW1iZXJzIHRvIGF2b2lkCi0JYXBwYXJlbnQgU3VuIEMgcHJlcHJvY2Vzc29yIHJlY3Vyc2lvbi4gIEZpeCBhY2Nlc3MgbWFjcm9zLgotCSogbmxtY29kZS5oOiAgUmVtb3ZlIHNwdXJpb3VzICcmJyBiZWZvcmUgc2V2ZXJhbCBhcnJheSByZWZlcmVuY2VzLgotCi1UdWUgSnVsIDIwIDE0OjM2OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBSZW5hbWUgZm9yIERPUyB1bmlxdWVuZXNzOiBjb2ZmLW02OGstdW4uYyAtPiBjb2ZmLXU2OGsuYwotCWNvbmZpZy9tNjhrLWNvZmZ1bi5tdCAtPiB1NjhrLWNvZmYubXQuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBKdWwgMjAgMTY6MjE6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEb24ndCB1c2UgIiYiIGJlZm9yZQotCWZ1bmN0aW9uIG5hbWU7IGl0J3MgdmFsaWQgd2l0aG91dCwgYW5kIHNvbWUgY29tcGlsZXJzIGdpdmUKLQl3YXJuaW5ncyB3aXRoIGl0IHRoZXJlLgotCi1UdWUgSnVsIDIwIDA4OjIxOjE1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIEFwcGx5IHNvbWUgb2YgdGhlIGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUgdG8gYmZkLWluMi5oLgotCSogYmZkLmMgKHVuaW9uIHRkYXRhKTogIEFkZCBubG1fb2JqX2RhdGE7Ci0JKiB0YXJnZXRzLmMgKGVudW0gdGFyZ2V0X2ZsYXZvdXIpOiAgQWRkIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIuCi0KLU1vbiBKdWwgMTkgMjA6NDY6MTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUsIGlbMzRdODYtKi1uZXR3YXJlKTogIE5ldyBjb25maWdzLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogIEFkZCBubG0ubywgbmxtMzIubywgbmxtMzItZ2VuLm8uCi0JKiBNYWtlZmlsZS5pbiAoQkZENjRfQkFDS0VORFMpOiAgQWRkIG5sbTY0Lm8sIG5sbTY0LWdlbi5vLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6ICBBZGQgbmxtezMyLDY0fS5jLCBubG17MzIsNjR9LWdlbi5jLgotCSogTWFrZWZpbGUuaW4gKG5sbS5vLCBubG17MzIsNjR9Lm8sIG5sbXszMiw2NH0tZ2VuLm86ICBOZXcgdGFyZ2V0cy4KLQkqIGJmZC1pbjIuaCAoSU5MSU5FKTogIERlZmluZXMgbW92ZWQgaGVyZS4KLQkqIHthb3V0eC5oLCBlbGYuYywgZWxmY29kZS5ofTogIE1vdmUgSU5MSU5FIGRlZmluZXMgdG8gYmZkLWluMi5oLgotCSogbGliZWxmLmggKENBVDQpOiAgTW92ZSBkZWZpbmUgdG8gYmZkLWluMi5oLgotCSogYmZkLWluMi5oIChDQVQ0KTogIE1lcmdlIENBVDQgbWFjcm8gd2l0aCBvdGhlciBDQVQgbWFjcm9zLgotCSogYmZkLWluMi5oICh1bmlvbiB0ZGF0YSk6ICBBZGQgbmxtX29ial9kYXRhLgotCSogYmZkLWluMi5oIChlbnVtIHRhcmdldF9mbGF2b3VyKTogIEFkZCBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLgotCSogdGFyZ2V0cy5jIChiZmRfbmxtezMyLDY0fV97YmlnLGxpdHRsZX1fdmVjKTogIEFkZCBwcm90b3R5cGVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIEFkZCBiZmRfbmxtezMyLDY0fV97YmlnLGxpdHRsZX1fdmVjLgotCSogKGxpYm5sbS5oLCBubG0uYywgbmxtY29kZS5oLCBubG17MzIsNjR9LWdlbi5jLAotCW5sbXszMiw2NH0tdGFyZ2V0LmgsIG5sbXszMiw2NH0uYywgY29uZmlnL2kzODYtbmxtLm10KTogIE5ldyBmaWxlcwotCWZvciBOTE0gc3VwcG9ydC4KLQotTW9uIEp1bCAxOSAxNTowOTowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS57aG9zdHMsaW59OiBhZGQgaVszNF04Ni0qLWx5bnhvcyogc3VwcG9ydAotCi1Nb24gSnVsIDE5IDE0OjUzOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMsIGVsZmNvZGUuaCwgbGliZWxmLmg6IFNlcmlvdXMgcmVvcmdhbml6YXRpb24uCi0JRGVsZXRlZCBgdGh1bmsnIHN0cnVjdHVyZSwgbWVyZ2VkIGludG8gdGRhdGEsIGR1cGxpY2F0ZSBkYXRhCi0JZWxpbWluYXRlZC4KLQlSZWFycmFuZ2VkIGZ1bmN0aW9ucywgZ3JvdXBpbmcgYnkgZnVuY3Rpb25hbGl0eS4KLQlCcm9rZSB1cCBtYW55IGZ1bmN0aW9ucyBpbiBlbGZjb2RlLmgsIHJlLW9yZGVyZWQgbWFueSBwYXJ0cyBvZgotCWZpbGUgd3JpdGluZyB0byBoYW5kbGUgdW5wcmVkaWN0YWJsZSBzdGF0ZSBvZiBzZWN0aW9uIHJlbG9jYXRpb24KLQl0YWJsZSBhcyBwcm92aWRlZCBieSB2YXJpb3VzIGFwcGxpY2F0aW9ucy4KLQlTdGlsbCBuZWVkcyBjbGVhbnVwOiBNZXJnZSBmdW5jdGlvbnMgYmFjayB0b2dldGhlciwgc3BsaXQgb3V0Ci0JZGF0YSBzdHJ1Y3R1cmUgd2l0aCBvbmx5IGRhdGEgdGhhdCBpcyB1c2VkIG9ubHkgd2hlbiB3cml0aW5nIG91dAotCW9iamVjdCBmaWxlLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9nZW5lcmljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLCB0YWtlbiBmcm9tCi0JY29mZi1taXBzLmMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBVc2UgaXQsIHRvIHdvcmsgYXJvdW5kCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBsb3NzYWdlLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBJbmNsdWRlIGNvZmYtbWlwcy5vIGFuZCBjb2ZmLW1zeW0ubywgc28KLQl0aGF0IGdkYiB3aWxsIGxpbmsuCi0JKG9maWxlcyk6IERvbid0IHVzZSBzb3J0IG9yIHVuaXE7IGRvIGl0IHdpdGggc2ggY29uc3RydWN0cy4KLQotU3VuIEp1bCAxOCAxOTo0MjoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IFJlY29nbml6ZSBJMzg2UFRYTUFHSUMuCi0JKiBhb3V0ZjEuaCwgbGliYW91dC5oOiBBZGQgTV8zODZfRFlOSVguCi0JKiB0cmFkLWNvcmUuYyAoVFJBRF9DT1JFX1VTRVJfT0ZGU0VULCBUUkFEX0NPUkVfU1RBQ0tfRklMRVBPUyk6Ci0JTmV3IG1hY3JvczsgdXNlIGl0IGlmIGRlZmluZWQuCi0JKiBjb25maWcvc3ltbWV0cnkubWgsIGhvc3RzL3N5bW1ldHJ5Lmg6IE5ldyBmaWxlcy4KLQotRnJpIEp1bCAxNiAxNDo1NjozMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBlbGZ7MzIsNjR9LWdlbmVyaWMuYyB0byAqLWdlbi5jIGZvciAxNCBjaGFyIGZpbGVuYW1lcy4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKENGSUxFUyk6IEFkZCBlbGY2NC1nZW4uYy4KLQotRnJpIEp1bCAxNiAwOTo1MzoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jOiBVc2UgTUlQU19BT1VUX3tPWn1NQUdJQyByYXRoZXIgdGhhbiB7T1p9TUFHSUMuCi0KLVRodSBKdWwgMTUgMTY6MDI6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYyAoaG93dG9fdGFibGUpOiBDb3JyZWN0ZWQgYml0c2l6ZSBmb3IgUl9QQ1IyNkwgZnJvbQotCTE2IHRvIDI2LgotCi1XZWQgSnVsIDE0IDE1OjI5OjU2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgW0hPU1RfSFBQQUJTRF06IFVzZSBocHV4LXN0eWxlIGNvcmUgZmlsZXMuCi0JKiBsaWJocHBhLmggW0hPU1RfSFBQQUJTRF06IEluY2x1ZGUgaHB1eCB2ZXJzaW9uIG9mIGNvcmUuaAotCi1XZWQgSnVsIDE0IDA5OjMwOjQ4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGg4MzAwaC0qLSouCi0KLVR1ZSBKdWwgMTMgMTI6MDM6MDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODUwMC5jIChyZWxvY19wcm9jZXNzaW5nLCBydHlwZTJob3d0byk6IE5ldyByZWxvY2F0aW9uCi0JdHlwZSBSX0g4NTAwX0hJR0hfMTYuCi0JKiBjb2ZmLXNoLmMgKHJfaW1tMzIpOiBHZXQgdGhlIHdpZHRoIG9mIHRoZSByZWxvYyByaWdodC4KLQotVHVlIEp1bCAxMyAxNjo0ODo1NiAxOTkzICBGcmVkZXJpYyBQaWVycmVzdGVndXkgKEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mcikKLQotCSogY29uZmlndXJlLmluOiBBZGQgbmV3IHRhcmdldCBtNjhrLWNvZmZ1biB0byB0aGUgZHB4LzIuCi0JKiBjb25maWcvbTY4ay1jb2ZmdW4ubXQ6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gY29uZmlnL2RweDIubXQuCi0KLU1vbiBKdWwgMTIgMTA6NDI6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IE1vdmUgU1BBUkNfQkFTRTEzIHJlbG9jIGludG8KLQlzcGFyYy1hb3V0LXNwZWNpZmljIGxpc3QuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZCBgdGh1bmsnLgotCi0JKiBjb25maWcvc3BhcmMtZWxmLm10IChUQVJHRVRfQkFDS0VORFMpOiBOZXcgbWFrZSB2YXJpYWJsZS4KLQotVGh1IEp1bCAgMSAxNDo1Mjo0NyAxOTkzICBGcmVkZXJpYyBQaWVycmVzdGVndXkgKEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mcikKLQkJCSAgYW5kIEppbSBLaW5nZG9uIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogVXNlIG1lbXNldCBub3QgYnplcm8uCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3lzL2ZpbGUuaD4uCi0JKiBpMzg2bGludXguaDogSW5jbHVkZSA8c3lzL2ZpbGUuaD4uCi0JKiBjb2ZmLW02OGstdW4uYzogbmV3IGZpbGUgdG8gaGFuZGxlIG5hbWVzIHdpdGggdW5kZXJzY29yZXMgb24KLQlzdnIzIG1hY2hpbmVzLgotCSogY29mZi1tNjhrLmMgKG02OGtfcnR5cGUyaG93dG8pOiBhZGRlZCAjaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotCXRvIG5vdCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uIGluIHRoZSBleGVjdXRhYmxlLgotCShUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgTkFNRVNfSEFWRV9VTkRFUlNDT1JFKTogbmV3IG1hY3JvcyBuZWVkZWQKLQlieSBjb2ZmLW02OGstdW4uYy4KLQkqIGNvZmZjb2RlLmggKE1DNjhLQkNTTUFHSUMpOiBjYXNlIGFkZGVkLgotCSogdGFyZ2V0cy5jOiBBZGQgbTY4a2NvZmZ1bl92ZWMuCi0JKiBjb25maWd1cmUuaG9zdDogYWRkZWQgc3VwcG9ydCBmb3IgQnVsbCBkcHgvMi4KLQkqIGNvbmZpZy9kcHgyLm1oLCBob3N0cy9kcHgyLmg6IG5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0YXJnZXQgY29mZi1tNjhrLXVuLgotCi1GcmkgSnVsICA5IDAwOjQzOjA2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaDogQWRkIGRlZmluaXRpb24gb2YgTUFDSFRZUEVfT0suCi0KLVRodSBKdWwgIDggMTQ6Mzc6NDQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3Qgc3VidHJhY3QgdGhlIGFkZGVuZAotCWFnYWluIGZvciBjb2ZmLgotCi0JKiBzeW1zLmMsIGJmZC1pbjIuaDogRG9jIGZpeC4KLQotCSogY29mZmNvZGUuaCAoQ0FMQ19BRERFTkQpOiBDaGVjayBmb3IgY29tbW9uIHNlY3Rpb24gdXNpbmcgdGhlCi0Jc2VjdGlvbiBmbGFnIGFzIHdlbGwgYXMgdGhlIHN5bWJvbCBmbGFnLgotCi1UaHUgSnVsICA4IDEzOjQzOjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2YnNkLmg6IENvbmRpdGlvbmFsaXplIEhPU1RfU1RBQ0tfRU5EX0FERFIgb24gX19ic2RpX18uCi0JaTM4NmJzZC5jOiBSZW1vdmUgZGVmaW5lcyBvZiBOX1RYVCo7IHRoZSB2ZXJzaW9ucyBpbiBhb3V0NjQuaCBzaG91bGQKLQliZSBzdWZmaWNpZW50LiAgRGVmaW5lIFRFWFRfU1RBUlRfQUREUi4KLQotV2VkIEp1bCAgNyAxMDo1NjoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZW1vdmVkIHN0YXRlcAotCWFyZ3VtZW50LiAgSnVzdCBsZXQgYW4gaW5kaXJlY3Qgc3ltYm9sIHBvaW50IHRvIHRoZSBuZXh0IHN5bWJvbAotCXdpdGhvdXQgZm9yY2luZyB0aGUgbmV4dCBzeW1ib2wgdG8gYmUgdW5kZWZpbmVkLiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzLgotCSogaHAzMDBocHV4LmMgKHNsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZWQgY2FsbCB0bwotCXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MuCi0JKiB0YXJnZXRzLmM6IEFkZGVkIGhwMzAwaHB1eF92ZWMuCi0JKiBNYWtlZmlsZS5pbiAoaHAzMDBocHV4Lm8pOiBBZGRlZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBKdWwgIDYgMTM6MjQ6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBQdXQgc2ltcGxlIHBvd2VyLW9mLXR3bwotCXJlbG9jcyB0b2dldGhlciwgYW5kIGFkZCA2NC1iaXQgdmVyc2lvbnMuCi0JKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFyZ3VtZW50IHRvIGFsbG9jYQotCWlzIHNpemVfdC4KLQotCSogbGliYmZkLmMgKGJmZF94bWFsbG9jX2J5X3NpemVfdCk6IE5ldyBmdW5jdGlvbi4KLQkqIG9wbmNscy5jIChiZmRfY2FjaGVfaW5pdCwgYmZkX29wZW5fZmlsZSk6IEFkZCBwcm90b3R5cGVzIHRvCi0JZGVjbGFyYXRpb25zLgotCShvYnN0YWNrX2NodW5rX2FsbG9jKTogVXNlIGJmZF94bWFsbG9jX2J5X3NpemVfdC4KLQkobmV3X2JmZCk6IFByb3RvdHlwZS1zdHlsZSBkZWZpbml0aW9uLCB1c2luZyBERUZVTi4KLQkoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvYywgYmZkX3phbGxvYywgYmZkX3JlYWxsb2MpOiBTaXplCi0JYXJndW1lbnQgaXMgdHlwZSBzaXplX3QsIG5vdCBiZmRfc2l6ZV90eXBlLgotCSogaWVlZS5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogVXNlIGJmZF94bWFsbG9jX2J5X3NpemVfdC4KLQkqIGJmZC5jIChiZmRfZGVmYXVsdF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdHJhcCwKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsdHJhcCk6IFByb3RvdHlwZXMuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jLCBiZmRfemFsbG9jLCBiZmRfcmVhbGxvYywKLQliZmRfYWxsb2NfZ3Jvdyk6IEFkanVzdGVkIHByb3RvdHlwZXMgZm9yIGFyZyB0eXBlIGNoYW5nZS4KLQkqIGFyY2hpdmUuYyAoZ2V0X2VsdF9hdF9maWxlcG9zLCBkb19zbHVycF9ic2RfYXJtYXAsIG5vcm1hbGl6ZSwKLQlkb19zbHVycF9jb2ZmX2FybWFwLCBiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOgotCVByb3RvdHlwZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiKTogUHJvdG90eXBlcy4KLQkqIGxpYmVsZi5oIChlbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24sIGVsZl9nZXRfc3RyX3NlY3Rpb24pOgotCVByb3RvdHlwZXMuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBSZW5hbWVkIGZyb20gQkZEX01BQ0hJTkVTLgotCShvZmlsZXMpOiBOZXcgdGFyZ2V0LiAgQnVpbGQgYSBsaXN0IG9mIHVuaXF1ZSBmaWxlIG5hbWVzLCBpbiBjYXNlCi0JYW55IGdvdCBkdXBsaWNhdGVkLgotCShUQVJHRVRMSUIpOiBVc2UgbGlzdCBvZiBmaWxlcyBmcm9tIG9maWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRF9NQUNISU5FUyBhbmQgQkZEX0JBQ0tFTkRTIGRlcGVuZGluZyBvbgotCW1pbmltYWwtYmZkIGZsYWcgYW5kIHRhcmdldCBtYWtlZmlsZSBmcmFnIGNvbnRlbnRzLgotCi0JKiBlbGZjb2RlLmggKGVsZl9yZWFkKTogRGVsZXRlIHN0YXRpYyBkZWNsYXJhdGlvbiwgc2luY2UgZnVuY3Rpb24KLQloYXMgbW92ZWQuCi0JKGVsZl9tYXBfc3ltYm9scyk6IFdyaXRlIG91dCBzZWN0aW9uIHN5bWJvbHMgZm9yIGFsbCBzZWN0aW9ucywgZm9yCi0Jbm93LgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IEFsbG93IG1hdGNoIGlmIGJvdGggc3ltYm9scyBhcmUKLQlzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHNlY3Rpb24uCi0JKGVsZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IHByaW50IG1lc3NhZ2UsIGp1c3QgcmV0dXJuIGZhbHNlLgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9sb2NhdGVfc2gpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgotCi1Nb24gSnVsICA1IDE2OjQ4OjExIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODMwMC5jIChoODMwMF9zY2FuKTogRml4IHBhcnNpbmcgb2YgYXJjaGl0ZWN0dXJlIHN0cmluZy4KLQotRnJpIEp1bCAgMiAxODoyNzowMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIGJmZC5oIGFuZCBzdG1wLWJmZC5oLgotCShyZWFsY2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGhlYWRlcnMuCi0KLUZyaSBKdWwgIDIgMTQ6NTE6NTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50KTogIERlbnkgaWYgZmlsZSBpcyBub3Qgb3BlbmVkIHdpdGgKLQl0aGUgcHJvcGVyIG1vZGUsIHNldCBvdXRwdXRfaGFzX2JlZ3VuIGlmIGZpbGUgaXMgb3BlbmVuZWQgZm9yIHVwZGF0ZS4KLQkqIGFvdXR4LmggKGFvdXRfKl9zZXRfc2VjdGlvbl9jb250ZW50KTogIFJlbW92ZSBjaGVja3MgdGhhdCBhcmUgbm93Ci0JZG9uZSBpbiBiZmRfc2V0X3NlY3Rpb25fY29udGVudC4KLQotRnJpIEp1bCAgMiAwOToyNToyMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IFJlbW92ZWQgZGVjbGFyYXRpb25zIG9mIHByaW50ZiwgZnByaW50ZiwKLQlmY250bCwgZnJlYWQgYW5kIGZ3cml0ZS4gIFRoZXkgYXJlIGFsbCBlcnJvciBwcm9uZSBmb3Igb25lIHJlYXNvbgotCW9yIGFub3RoZXIuICBDaGFuZ2VkIGRlY2xhcmF0aW9uIG9mIG1lbWNociBmcm9tIGNoYXIgKiB0byBQVFIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLXJpc2NvcyopOiBOZXcgdGFyZ2V0OyB1c2UgcmlzY29zLgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtKi1yaXNjb3MqKTogTmV3IGhvc3Q7IHVzZSByaXNjb3MuCi0JKiBjb25maWcvcmlzY29zLm1oIChIREVGSU5FUyk6IEFkZCAtRyA0LgotCi0JKiBsaWJhb3V0LmggKEdFVF9TV09SRCk6IFVzZSB0aGUgYmZkX2hfZ2V0X3NpZ25lZCBlbnRyeSBwb2ludHMKLQlyYXRoZXIgdGhhbiBjYXN0aW5nIHRoZSByZXN1bHQgb2YgYmZkX2hfZ2V0LgotCi1GcmkgSnVsICAyIDEwOjEzOjQ4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGhvc3RzL2RlbHRhNjguaCwgY29uZmlnL2RlbHRhNjgubWg6IEFkZCBzdHVmZiBmb3IKLQlNb3Rvcm9sYSBEZWx0YSA2OC4KLQotV2VkIEp1biAzMCAwNjowMjo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjY0X3tiaWcsbGl0dGxlfV9nZW5lcmljX3ZlYyk6IERlY2xhcmUsIGFuZAotCWluY2x1ZGUgaW4gc2VhcmNoIGxpc3QgaWYgQkZENjQgaXMgZGVmaW5lZC4KLQotCSogbGliZWxmLmggKENBVDQpOiBBZGRlZCBhIHZlcnNpb24gZm9yIFNhYmVyLUMsIEFOU0kgbW9kZS4KLQkoYmZkX2VsZjY0XyopOiBEZWNsYXJhdGlvbnMgZm9yIDY0LWJpdCB2ZXJzaW9ucyBvZiBtYW55IHJvdXRpbmVzLgotCi1UdWUgSnVuIDI5IDIyOjUwOjU5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmNjQtdGFyZ2V0LmgsIGVsZjY0LWdlbmVyaWMuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEJGRDY0X0JBQ0tFTkRTKTogSW5jbHVkZSBlbGY2NC1nZW5lcmljLm8uCi0JKGVsZjY0LWdlbmVyaWMubyk6IExpc3QgZGVwZW5kZW5jaWVzLgotCi0JKiBNYWtlZmlsZS5pbjogTGlzdCB0YXJnZXQgYGFsbCcgZXhwbGljaXRseSBiZWZvcmUgaG9zdC90YXJnZXQKLQltYWtlZmlsZSBmcmFnbWVudHMgYXJlIGluY2x1ZGVkLCBpbiBjYXNlIHRoZXkgZGVmaW5lIGFueSBuZXcKLQl0YXJnZXRzLgotCi0JKiBlbGZjb2RlLmggKEVMRl9SX0lORk8sIEVMRl9SX1NZTSk6IERlZmluZSBhcyAzMi0gb3IgNjQtYml0Ci0JdmVyc2lvbnMgYXMgYXBwcm9wcmlhdGUuICBVc2VzIHVwZGF0ZWQuCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRGVjbGFyZSBiZWZvcmUgdXNlLgotCShlbGZfZGVidWdfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBiZmRfc2hkcl9mcm9tX3NlY3Rpb24sIGVsZl9mYWtlX3NlY3Rpb25zKToKLQlBbGlnbm1lbnQgdmFsdWUgaW4gc2VjdGlvbiBoZWFkZXIgaXMgbl9ieXRlcywgbm90IGxvZzIuCi0JKG5ld19zZWN0aW9uX2hvb2spOiBEbyBub3RoaW5nIGZvciBub3cuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBFbGZfRXh0ZXJuYWxfUmVsW2FdLCBub3QgMzItYml0Ci0JdmVyc2lvbiBleHBsaWNpdGx5LgotCShlbGZfY29yZV9maWxlX3ApOiBTaW1wbGlmeSBjaGVjayBmb3IgY29ycmVjdCBjbGFzcyAod29yZCBzaXplKS4KLQkoZWxmX21ha2Vfc2VjdGlvbnMsIGVsZl9mYWtlX3NlY3Rpb25zLCBlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKLQlJbml0aWFsaXplIGFsbCBmaWVsZHMgd2hlbiBjcmVhdGluZyBkYXRhIHN0cnVjdHVyZXMuCi0JKGVsZl9sb2NhdGVfc2gpOiBSZW5hbWVkIGZyb20gYmZkX2VsZlhYX2xvY2F0ZV9zaCwgbWFkZSBzdGF0aWMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgY29ycmVjdCBjbGFzcyBpbiBvdXRwdXQKLQlmaWxlLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2VjdGlvbiBzeW1ib2xzIGhhdmUgZW1wdHkgbmFtZXMgaW4KLQlvdXRwdXQgZmlsZS4KLQotCSogbGliYmZkLmMgKGJmZF94bWFsbG9jLCB6YWxsb2MpOiBCZSBzdXJlIHRvIGNhc3QgbWFsbG9jLCBtZW1zZXQKLQlhcmdzIHRvIHNpemVfdCBiZWZvcmUgY2FsbC4KLQkoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpOiBDYXN0IHphbGxvYyBhcmcgdG8gYmZkX3NpemVfdHlwZS4KLQotVHVlIEp1biAyOSAxMDo0OTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHByb2NlZHVyZSBoYXMgbm8gbGluZQotCW51bWJlciBpbmZvcm1hdGlvbiwgcmV0dXJuIDAgZm9yIGxpbmUgbnVtYmVyLgotCi1Nb24gSnVuIDI4IDEwOjQ1OjAyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBJZiAqb2xkcmF3cHRyIGlzIG5vbi1OVUxMLCBjb3B5IGl0Ci0JaW50byAqcmF3cHRyLgotCi1TdW4gSnVuIDI3IDA5OjA1OjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9yaXNjb3MuaDogRGVmaW5lIE5CUEcgYW5kIFVQQUdFUy4KLQotU3VuIEp1biAyNyAxNjoyODoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgdXNlIG9ial9yYXdfc3ltcyBhcwotCWx2YWx1ZTsgaXQgY29udGFpbnMgYSBjYXN0LgotCi1GcmkgSnVuIDI1IDE3OjA5OjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoaGFzaCwgY29tcGFyZSwgc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgYWRkX3RvX3N0cmluZ3RhYik6Ci0JVXNlIHVuc2lnbmVkIGhhc2ggdmFsdWVzIGZvciBiZXR0ZXIgaGFzaGluZy4KLQkoaGFzaCk6IEhhc2ggaW4gdGhlIHN0cmluZyBsZW5ndGggZm9yIGxvbmcgc3RyaW5ncy4KLQotVGh1IEp1biAyNCAxNTo0Nzo1MSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGNvbXBhcmUpOiBSZXBsYWNlIDMgaWYncyB3aXRoIGEgc3VidHJhY3Rpb24uCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzLCBhZGRfdG9fc3RyaW5ndGFiKTogUmVvcmRlciB0ZXN0cwotCWluIGRlY3JlYXNpbmcgb3JkZXIgb2Ygc3VjY2VzcywgYXMgYW4gb3B0aW1pemF0aW9uLgotCShoYXNoKTogVGFrZSBhIGxlbmd0aCBhcmc7IGlnbm9yZSBjaGFycyBhZnRlciAjMjUsIGZvciBzcGVlZC4KLQkoYWRkX3RvX3N0cmluZ3RhYik6IFBhc3MgbGVuZ3RoIHRvIGhhc2guCi0KLVRodSBKdW4gMjQgMTc6MjU6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXNwYXJjLmMgKHNwYXJjX3JlbG9jX21hcCk6IEFkZCBTUEFSQ19XRElTUDIyIHJlbG9jLgotCi0JKiBlbGZjb2RlLmggKGVsZl9uZXdfc2VjdGlvbl9ob29rKTogRG8gbm90aGluZyBmb3Igbm93LgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT3V0cHV0IGNvbW1vbiBzeW1ib2xzIHRoZSB3YXkgRUxGCi0Jd2FudHMgdGhlbS4KLQotV2VkIEp1biAyMyAxNjoyMDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhIGFuZCBhc3NvY2lhdGVkIG1hY3Jvcyk6IE1vdmVkCi0JaGVyZSBmcm9tIGVsZmNvZGUuaC4gIEEgY291cGxlIG9mIHNpemUtc3BlY2lmaWMgc3RydWN0dXJlIHBvaW50ZXJzCi0Jd2VyZSBjaGFuZ2VkIHRvIFBUUjsgdXNlcyBmaXhlZCBhcHByb3ByaWF0ZWx5LgotCShlbGYzMl9zeW1ib2xfdHlwZSwgZWxmNjRfc3ltYm9sX3R5cGUpOiBTZXBhcmF0ZWQgZGVmaW5pdGlvbnMuCi0JKGJmZF9lbGZfbWtvYmplY3QpOiBSZW5hbWVkIGZyb20gYmZkX2VsZjMyX21rb2JqZWN0LgotCShiZmRfZWxmMzJfbWtvYmplY3QsIGJmZF9lbGY2NF9ta29iamVjdCwgZWxmX21rb2JqZWN0KTogTmV3Ci0JdGVtcG9yYXJ5IG1hY3JvcyB0byBlYXNlIG5hbWUgY2hhbmdlLgotCSogZWxmLmMgKGVsZl9yZWFkLCBlbGZfbWtvYmplY3QsIGVsZl9nZXRfc3RyX3NlY3Rpb24sCi0JZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uLCBiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IE1vdmVkIGhlcmUKLQlmcm9tIGVsZmNvZGUuaC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAobGliYmZkLmgpOiBQcm9jZXNzIGVsZi5jIHRvby4KLQkqIE1ha2VmaWxlLmluIChlbGYubyk6IE5vdGUgbmV3IGRlcGVuZGVuY2llcy4KLQotCSogZWxmY29kZS5oOiBMb3RzIG9mIHN0dWZmIG1vdmVkIGVsc2V3aGVyZS4gIERlbGV0ZWQgc29tZSB1bnVzZWQKLQljb2RlLCB0d2Vha2VkIHNvbWUgZGVidWcgaG9va3MuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBUcmFuc2xhdGUgRUxGIHNlY3Rpb24gc3ltYm9scyBpbnRvIEJGRAotCXNlY3Rpb24gc3ltYm9scy4KLQotV2VkIEp1biAyMyAxMTozNDoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvcmlzY29zLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVuIDIyIDE0OjM1OjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgY2FzZSBTSFRfUFJPR0JJVFMpOiBFdmVuIGlmCi0Jc2VjdGlvbiBhbHJlYWR5IGV4aXN0cywgdXNlIGl0cyBwb2ludGVyIHRvIGZpbGwgaW4gcmF3ZGF0YSBzbG90LgotCi1UdWUgSnVuIDIyIDE2OjM2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBSZXR1cm4gdmFsdWUgb2YgcHV0cyBhbmQgZnB1dHMgaXMgaW50IG5vdCB2b2lkLgotCi1UdWUgSnVuIDIyIDE0OjI1OjU4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQ29tbWVudCB0aGUgZmllbGQgbmFtZXMuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IG1heCBhbmQgbWluIHZhbHVlcy4KLQotTW9uIEp1biAyMSAxODoxOToxNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjMyLWhwcGEuYywgZWxmY29kZS5oOiBVc2UgbmV3Ci0Jc2l6ZS1pbmRlcGVuZGVudCBlbGYgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgotCSogZWxmY29kZS5oIChwdXRfd29yZCwgZ2V0X3dvcmQpOiBEZWZpbmUgYXMgYXBwcm9wcmlhdGUgZm9yCi0JYXJjaGl0ZWN0dXJlIHdvcmQgc2l6ZS4gIFN0cnVjdHVyZSBzd2FwcGluZyBmdW5jdGlvbnMgY2hhbmdlZCB0bwotCXVzZSB0aGVtIGFzIGFwcHJvcHJpYXRlLgotCi0JKiBjb25maWd1cmUuaW46IElmIGNvbXBpbGluZyA2NC1iaXQgYmFjayBlbmRzLCBkbyB0aGVtIGJlZm9yZQotCTMyLWJpdCBvbmVzLgotCi0JKiBsaWJlbGYuaDogVXNlIG5ldyBzaXplLWluZGVwZW5kZW50IHZlcnNpb25zIG9mIGVsZiBpbnRlcm5hbCBkYXRhCi0Jc3RydWN0dXJlcy4KLQkoc3ltYm9sX3R5cGUpOiBSZW9yZGVyZWQgdG8gcHV0IGFueSBmaWVsZHMgZGVwZW5kZW50IG9uIHRhcmdldAotCXNpemUgYXQgdGhlIGVuZC4KLQkoZWxmX2JhY2tlbmRfZGF0YSk6IFJlbmFtZWQgZnJvbSBlbGYjI19iYWNrZW5kX2RhdGEgYW5kIG1hZGUKLQlzaXplLWluZGVwZW5kZW50LgotCShlbGZfc2VjdF90aHVuayk6IE5vdyBzaXplLWluZGVwZW5kZW50LgotCi0JKiBsaWJiZmQuYyAoYmZkX2xvZzIpOiBOb3cgcmV0dXJucyB1bnNpZ25lZCBpbnQuCi0KLU1vbiBKdW4gMjEgMTI6MzA6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBjb25maWcvbTg4ay1hb3V0Lm10IHRvIGNvbmZpZy9ub29wLm10LgotCWNvbmZpZ3VyZS5pbjogVXNlIGl0IGZvciBtaXBzLSotYnNkKi4KLQotU3VuIEp1biAyMCAyMDozMjoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEVsaW1pbmF0ZSAicGFydGlhbGx5IGJyYWNrZXRlZAotCWluaXRpYWxpemVyIiB3YXJuaW5nIGZyb20gZ2NjLgotCSogY3B1LWg4NTAwLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBMaWtld2lzZS4KLQkqIGNwdS1zaC5jIChhcmNoX2luZm9fc3RydWN0KTogTGlrZXdpc2UuCi0KLQkqIGNwdS1oODMwMC5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGhvd3RvKl9jYWxsYmFjaywKLQlob3d0b18qKTogVW51c2VkIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGNvbW1lbnRlZCBvdXQuCi0JKiBjcHUtejhrLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgaG93dG8qX2NhbGxiYWNrLAotCWhvd3RvXyopOiBMaWtld2lzZS4KLQkqIGNwdS1oODUwMC5jIChjb21wYXRpYmxlKTogTGlrZXdpc2UuCi0JKiBjcHUtc2guYyAoY29tcGF0aWJsZSk6IExpa2V3aXNlLgotCi0JKiBocDMwMGhwdXguYyAoc3dhcF9zdGRfcmVsb2NfaW4pOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcy4KLQlBbHdheXMgc2V0IGEgdmFsaWQgbGVuZ3RoIHZhbHVlLCBldmVuIGZvciBpbnZhbGlkIGlucHV0LgotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfc3ltYm9scyk6IFVzZSBzcHJpbnRmX3ZtYS4KLQotCSogYmZkLWluLmggKHVpbnQ2NF90eXBlTE9XLCB1aW50NjRfdHlwZUhJR0gsIGludDY0X3R5cGUsCi0JdWludDY0X3R5cGUpOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMuCi0JKiBob3N0cy9zdGQtaG9zdC5oIChpbnQ2NCBzdHVmZik6IFJlbW92ZSB0aGVtIGZyb20gaGVyZS4KLQotCSogYmZkLWluLmggKHNwcmludGZfdm1hKTogRGVmaW5lIHBhcmFsbGVsIHRvIGZwcmludGZfdm1hLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlIHVudXNlZAotCXZhcmlhYmxlLiAgQWRkZWQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IEJlZm9yZSBjYXN0aW5nCi0JcG9pbnRlcnMgdG8gaW50ZWdlcnMsIG1ha2Ugc3VyZSB0aGUgaW50ZWdlciB0eXBlIGlzIHdpZGUgZW5vdWdoLgotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IERpdHRvLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbmNlIGBjb3VudCcgaXMgdW5zaWduZWQsCi0JZG9uJ3QgYm90aGVyIGNvbXBhcmluZyBmb3IgbGVzcy10aGFuLXplcm8uCi0JKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCi0JKiBlbGZjb2RlLmggKGJmZF9hZGRfdG9fc3RydGFiKTogTm93IHN0YXRpYy4KLQkoc3ltX2lzX2dsb2JhbCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX21hcF9zeW1ib2xzKTogQ2FsbCBpdC4gIE5vdyByZXR1cm5zIHZvaWQuICBSZW1vdmVkIHVudXNlZAotCWxvY2FsIHZhcmlhYmxlLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYXJrIHN0cmluZyB0YWJsZXMgb3RoZXIgdGhhbiBmb3Igc2VjdGlvbgotCWFuZCBzeW1ib2wgbmFtZXMgYXMgbm9ybWFsIHNlY3Rpb25zIGhhdmluZyBjb250ZW50cy4KLQkoZml4X3VwX3N0cnRhYnMpOiBOZXcgZnVuY3Rpb247IGZpeGVzIHVwIEVMRiBoZWFkZXIgZmllbGRzIGZvcgotCXN0YWIgc2VjdGlvbnMgd2l0aCBzdHJpbmcgdGFibGVzIGFzc29jaWF0ZWQuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYXAgZml4X3VwX3N0cnRhYnMgb3ZlciBhbGwgQkZECi0Jc2VjdGlvbnMuICBSZW9yZGVyZWQgY29uZGl0aW9uIHRlc3RzIGZvciBzeW1ib2wgZmxhZ3M7IGRlZmF1bHQgdG8KLQlsb2NhbC1vYmplY3QgdmFsdWUgaW5zdGVhZCBvZiBnbG9iYWwtb2JqZWN0LgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IEhpZCBjb25kaXRpb25hbGx5LXVzZWQgdmFyaWFibGUKLQlpbnNpZGUgY29uZGl0aW9uIHRlc3QuCi0JKGVsZl9wcmludF9zeW1ib2wpOiBVc2UgZnByaW50Zl92bWEuCi0JKGVsZl9pZHhfb2Zfc3ltLCBiZmRfc2hkcl9mcm9tX3NlY3Rpb24pOiBVbnVzZWQgZnVuY3Rpb25zCi0JY29tbWVudGVkIG91dC4KLQotCSogYmZkLWluLmggKGludDY0X3R5cGUsIHVpbnQ2NF90eXBlKTogRGVmaW5lIHRoZXNlIGlmIHdlIGZhbGwKLQliYWNrIHRvICJsb25nIGxvbmciIGZvciBIT1NUXzY0X0JJVC4KLQotCSogbGliZWxmLmggKGVsZk5BTUUsIEVsZk5BTUUpOiBOZXcgdmVyc2lvbnMgdG8gZ2V0IGRlc2lyZWQgcmVzdWx0cwotCXdpdGhvdXQgdXNpbmcgaW52YWxpZCBBTlNJIEMgcHJlcHJvY2Vzc2luZyB0b2tlbnMuCi0KLQkqIGVsZjMyLXRhcmdldC5oIChiZmRfZWxmMzJfbmV3X3NlY3Rpb25faG9vayk6IERlbGV0ZSBtYWNyby4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfbmV3X3NlY3Rpb25faG9vayk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKG5ld19zZWN0aW9uX2hvb2spOiBEZWZpbmUgaGVyZS4KLQotCSogaG9zdHMvc3BhcmMuaCwgaG9zdHMvc3RkLWhvc3QuaCwgaG9zdHMvaTM4NmJzZC5oOiBQcm90ZWN0Ci0JYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCi0JKiBob3N0cy9uZXdzLmg6IEluY2x1ZGUgaG9zdHMvc3RkLWhvc3QuaCwgbm90IHBsYWluIHN0ZC1ob3N0LmguCi0KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6IEdlbmVyYXRlIGludG8gY3VycmVudCBkaXJlY3RvcnkgYnkgZ3JhYmJpbmcKLQk2NC1iaXQgZGVmaW5pdGlvbiAoaWYgYW55KSBmcm9tIHN5c2RlcC5oLgotCSogYmZkLWluLmg6IFB1dCBpbiBtYXJrZXIgZm9yIHN5c2RlcC5oIGluY2x1c2lvbi4KLQotRnJpIEp1biAxOCAxOTo1NzoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBDaGVjayBmb3Igb3ZlcmZsb3cgb24KLQlwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBpZiB0aGUgaG93dG8gYXNrZWQgZm9yIGl0LgotCi1GcmkgSnVuIDE4IDE2OjAwOjIwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IElnbm9yZSBub256ZXJvIGV4aXQgc3RhdHVzIGZyb20gZ3JlcC4KLQotRnJpIEp1biAxOCAxNjo1NDoyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3Jpc2Nvcy5te2gsdH06IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS57aG9zdCxpbn06IFVzZSB0aGVtLgotCi1GcmkgSnVuIDE4IDEyOjU1OjEwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmM6IGNvbW1lbnQgY2hhbmdlLiAgVGhpcyBpcyBhIG1pcHMgZmlsZSwgbm90IDg4ay4KLQotTW9uIEp1biAxNCAxNDowMjo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY2FjaGUuYyAoYmZkX2NhY2hlX2luaXQpOiBJbmNyZW1lbnQgb3Blbl9maWxlcyBhbmQgY2FsbCBjbG9zZV9vbmUKLQlpZiBuZWNlc3NhcnkuCi0JKGJmZF9vcGVuX2ZpbGUpOiBEb24ndCBpbmNyZW1lbnQgb3Blbl9maWxlcyBoZXJlLgotCi1GcmkgSnVuIDE4IDEwOjAwOjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVsdGE4OC5taDogRG9uJ3Qgc2V0IENDLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVsZjMyLXttaXBzLG04OGssZ2VuZXJpY30uCi0JZWxmMzIte21pcHMsbTg4ayxnZW5lcmljfS5jOiBOZXcgZmlsZXMuCi0JdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogSW5jbHVkZSBiZmRfZWxmMzJfe21pcHMsbTg4ayxnZW5lcmljfV92ZWMuCi0JZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBNYXRjaCBlbGYzMi1nZW5lcmljIGZvciBhbGwgbWFjaGluZXMgd2hpY2gKLQlkb24ndCBtYXRjaCBhIGRpZmZlcmVudCB0YXJnZXQuCi0KLUZyaSBKdW4gMTggMDM6MTI6MTIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlFbGltaW5hdGUgImludDhfdHlwZSIsICJpbnQxNl90eXBlIiwgImludDMyX3R5cGUiLCBhbmQgdGhlaXIKLQl2YXJpYW50cyBmcm9tIHRoZSBCRkQgdW5pdmVyc2UuICBMZWF2ZSB0aGUgNjQtYml0IHR5cGVzIGZvciBub3csCi0Jc2luY2UgdGhleSBhcmUgaW4gZmx1eC4KLQotCSogYW91dHguaCwgaHAzMDBocHV4LmM6ICBFbGltaW5hdGUgbmVlZGxlc3MgKGludDMyX3R5cGUpIGNhc3RzLgotCSogbGliYW91dC5oIChHRVRfU1dPUkQpOiAgQ29udmVydCAoaW50MzJfdHlwZSkgdG8gKGludCkuCi0JKiBpZWVlLmM6ICBDb252ZXJ0IHVpbnQ4ZV90eXBlID0+IHVuc2lnbmVkIGNoYXIuCi0JKiBvYXN5cy5jOiAgRXh0ZW5zaXZlIGNoYW5nZXMgdG8gZWxpbWluYXRlIG9ic29sZXRlIHR5cGVzLgotCVRoZXNlIGRlcGVuZCBvbiBjaGFuZ2VzIGluIC4uL2luY2x1ZGUvb2FzeXMuaCBhcyB3ZWxsLgotCSogaG9zdHMvKi5oOiAgUmVtb3ZlIGRlY2xhcmF0aW9ucyBvZiBhbGwgdGhlc2UgdHlwZXMuCi0KLU1vbiBKdW4gMTQgMTQ6MDI6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2RlbHRhODguaDogI2lmIDAgb3V0IHNvbWUgZGVjbGFyYXRpb25zIHdoaWNoIGNvbmZsaWN0IHdpdGgKLQlzeXN0ZW0gaGVhZGVycy4KLQotTW9uIEp1biAxNCAxNzowODoxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogcmVtb3ZlIHBhcmVudGRpciBjcnVmdAotCi1Nb24gSnVuIDE0IDE5OjA0OjA5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9nZXRfc3ltYm9sX2luZm8pOiAgUmVtb3ZlIHJlZHVuZGFudCBjb3B5LgotCSogRXhwdXJnYXRlIHJhbmRvbSBERUZVTnMgdGhhdCBoYXZlIGNyZXB0IGluLgotCi1Nb24gSnVuIDE0IDEwOjIzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IENvbnN0cnVjdG9yIHNlY3Rpb25zIHNob3VsZAotCW9ubHkgYmUgYWxpZ25lZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4KLQotU2F0IEp1biAxMiAxNjoxMzoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaCAoc3RydWN0IGludDY0ZV9zdHJ1Y3QpOiBSZW1vdmUgbmVlZGxlc3MgdHlwZWRlZgotCWtleXdvcmQuCi0KLUZyaSBKdW4gMTEgMTQ6MjU6MzQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgZmxhZ3MgdG8gMSwgYnJlYWtpbmcKLQkxOTI3IGJ1dCBmaXhpbmcgc29tZSBvdGhlciBpbXBvcnRhbnQgdGhpbmdzLgotCi1UaHUgSnVuIDEwIDIwOjM2OjIyIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKGludDY0ZV90eXBlKTogRml4IGRlZmluaXRpb24uCi0KLVRodSBKdW4gMTAgMTE6NDg6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBVc2UgU1RZUF9NSVBTX0lOSVQgZm9yCi0Jc2VjdGlvbiBuYW1lZCBfSU5JVC4gIERvbid0IHNldCBTVFlQX1RFWFQgdW5sZXNzIFNFQ19DT0RFIGlzIHNldC4KLQkoZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBUcmVhdCBhIFNUWVBfTUlQU19JTklUIHNlY3Rpb24gbGlrZQotCWEgU1RZUF9URVhUIHNlY3Rpb24uCi0KLVdlZCBKdW4gIDkgMTY6NDg6MTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCwgaGVhZGVycyk6IGRvbid0IHB1dCBjb21tZW50cyBhZnRlciBhIHRhYgotCWluIHRoZSBhY3Rpb25zIHNlY3Rpb24gb2YgYSBydWxlCi0KLVdlZCBKdW4gIDkgMTU6MDA6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IE1hcmsgWk1BR0lDIGZpbGVzIGFzIERfUEFHRUQuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIG5vdCBEX1BBR0VELCBkb24ndCBhZGQgdGhlCi0Jc2VjdGlvbiBoZWFkZXJzIHRvIHRleHRfc2l6ZS4gIElmIG5vdCBEX1BBR0VELCBzZXQgdGhlIG1hZ2ljCi0JbnVtYmVyIHRvIE9NQUdJQyByYXRoZXIgdGhhbiBaTUFHSUMuICBJZiBjcmVhdGluZyBhIERfUEFHRUQKLQlleGVjdXRhYmxlLCB0aGUgZXhlY3V0YWJsZSBtdXN0IGZ1bGx5IG9jY3VweSBhbiBldmVuIG51bWJlciBvZgotCXBhZ2VzLgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8sIG1ha2VfYmZkX2FzZWN0aW9uLCBlY29mZl9saXR0bGVfdmVjLAotCWVjb2ZmX2JpZ192ZWMpOiBDb25zaXN0ZW50bHkgc2V0IHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyIHRvIDQsCi0Jc2luY2UgRUNPRkYgc2VjdGlvbnMgc2hvdWxkIGJlIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KLQkoZWNvZmZfbGl0dGxlX3ZlYywgZWNvZmZfYmlnX3ZlYyk6IEFkZGVkIERfUEFHRUQgdG8gb2JqZWN0X2ZsYWdzLgotCU1hZGUgYXJfcGFkX2NoYXIgYW5kIGFyX21heF9uYW1lbGVuIGFncmVlIGZvciBib3RoLgotCi1UdWUgSnVuICA4IDIwOjI4OjAyIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IHN1YnRyYWN0IHNlY3Rpb24gdm1hIGZyb20KLQlzeW1ib2wgdmFsdWUsIHNpbmNlIGJmZCBzeW1ib2xzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLCBidXQgRUxGCi0Jc3ltYm9scyBhcmVuJ3QuCi0KLVR1ZSBKdW4gIDggMTI6MDg6MjcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY3B1LWk5NjAuYywgY3B1LWg4MzAwLmMgKGNvbXBhdGlibGUpOiBNYWtlIHN0YXRpYy4KLQotVHVlIEp1biAgOCAxNDoyNzo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL25ld3MuaCwgY29uZmlnL25ld3MubWg6IE5ldyBmaWxlcy4KLQotVHVlIEp1biAgOCAxMjowODoyNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4yLmgsIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2g4MzAwW2hdKTogbmV3IGRlZmluZXMuCi0JKiBjb2ZmLWg4MzAwLmM6IE1vcmUgYWRkcmVzc2luZyBtb2Rlcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQ29wZSB3aXRoIEg4MzAwIG1hZ2ljCi0JbnVtYmVyLgotCSogY3B1LWg4MzAwLmM6IFJlbW92ZWQgZGlzYXNzZW1ibGUgc3R1ZmYuIChoODMwMF9zY2FuKTogUmVjb2duaXNlCi0JSDgvMzAwSCBuYW1lLiAoY29tcGF0aWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlYyk6IENvcGUgd2l0aCBtb3JlCi0JYWRkcmVzc2luZyBtb2Rlcy4KLQotVHVlIEp1biAgOCAxMDozMDoxMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT25seSByb3VuZCB0byBwYWdlIGJvdW5kYXJpZXMgaWYKLQlEX1BBR0VEIGZsYWcgaXMgc2V0IGZvciB0aGUgb3V0cHV0IEJGRC4KLQotRnJpIEp1biAgNCAxNTo0Nzo1MiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChnZXRfaW5kZXgsIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRml4IHBvaW50ZXIKLQljYXN0cyB0byB3b3JrIG9uIG1hY2hpbmUgd2hlcmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihpbnQpICE9Ci0Jc2l6ZW9mKGNoYXIgKikuCi0gICAgICAgICogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IERpdHRvLgotCSogY3B1LWg4MzAwLmMgY29mZi1oODMwMC5jOiBTdXBwb3J0IGZvciBIOC8zMDAtSC4KLQotRnJpIEp1biAgNCAxNToyNDoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9zeW1ib2xzKTogRm9yIGVtcHR5IHN0cmluZyB0YWJsZSwgd3JpdGUKLQlvdXQgNCBpbiBjb3JyZWN0IGJ5dGUgb3JkZXIuICAoZnJvbSBtaW55YXJkQGJuci5jYSkKLQotCSogZWxmMzItaHBwYS5jOiBEb24ndCBpbmNsdWRlIGxpYmhwcGEuaCBmb3Igbm93OyBkZWZpbmUKLQlCWVRFU19JTl9XT1JEIGluc3RlYWQsIHVudGlsIFV0YWggc2VuZHMgYSBiZXR0ZXIgZml4LgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFVzZSB4bWFsbG9jIGFuZCB4cmVhbGxvYyBpbnN0ZWFkCi0Jb2YgbWFsbG9jIGFuZCByZWFsbG9jLgotCi1GcmkgSnVuICA0IDA3OjQ5OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotZWNvZmZsKik6IE5ldyB0YXJnZXQ7IHVzZSBkZWNzdGF0aW9uLgotCShtaXBzLSotZWNvZmYqKTogQWRkZWQgdHJhaWxpbmcgJyonLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZ2V0X2RlYnVnKTogR2V0IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgUERSCi0JZm9yIHRoZSBGRFIsIG5vdCBmcm9tIHRoZSBmaXJzdCBQRFIgaW4gdGhlIGZpbGUuCi0KLVRodSBKdW4gIDMgMTY6NDE6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX2dldF9zeW1ib2xfaW5mbyk6ICBOZXcgZnVuYyBuZWVkZWQgZm9yIEpVTVBfVEFCTEUuCi0KLVRodSBKdW4gIDMgMTU6MzM6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfZ2V0X3N5bWJvbF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgSnVuICAzIDEzOjA3OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCBjcmFzaCBpZiBubyBzeW1ib2xzIGhhdmUgYmVlbgotCWFsbG9jYXRlZCB5ZXQuCi0KLQlGcm9tIFBldGVyIEhvb2dlbmJvb20gKGhvb2dlbkBzY2hhZmVyLmNzLnV0YWguZWR1KToKLQkqIGxpYmhwcGEuaCAoTUFYQ09NTEVOKTogRGVmaW5lIHVuY29uZGl0aW9uYWxseS4KLQkoX1BBX1JJU0NfSUQpOiBPbmx5IGRlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogZWxmMzItaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KLQotCUZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBob3N0cy9taXBzYnNkLmggKEhPU1RfREFUQV9TVEFSVF9BRERSKTogRGVsZXRlIGRlZmluaXRpb24uCi0KLQkqIGVsZjMyLWhwcGEuaCAoc3ltZXh0X3Jvb3RQLCBzeW1leHRfbGFzdFApOiBEZWxldGUgZGVjbHMuCi0KLVRodSBKdW4gIDMgMDA6MjM6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogZGVmaW5lIEVYVFJBTElCRVMgdG8gLWxtIChmb3IgYmludXRpbHMpLCBhbHNvCi0JcmVtb3ZlIGRlZmluZXMgb2YgX19NU0RPU19fIGFuZCBfX0dPMzJfXyAodGhlc2UgYXJlIGluIHRoZQotCWNvbXBpbGVyIG5vdykuCi0KLVdlZCBKdW4gIDIgMTc6NTc6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JRnJvbSBVdGFoOgotCSogaG9zdHMvaHBwYWJzZC5oOiBFbGltaW5hdGUgdXNlIG9mIG9ic29sZXRlIEVYRlVOLgotCSogY29uZmlnL2hwcGFic2QubWg6IERvbid0IHVzZSByYW5saWIuCi0KLVR1ZSBKdW4gIDEgMDQ6MTU6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiBOZXcgZmlsZSwgZm9yIHdvcmQtc2l6ZSBpbmRlcGVuZGVudCBjb2RlLgotCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IE1vdmVkIHRvIHRoZXJlLCByZW5hbWVkIGJmZF9lbGZfaGFzaC4KLQkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGVsZi5vIGluIHN0YW5kYXJkIG9iamVjdHMuCi0KLQkqIGJmZC1pbi5oIChDQVQzKTogRGVmaW5lIGhlcmUuCi0JKiBsaWJhb3V0LmgsIGxpYmVsZi5oOiBOb3QgaGVyZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBzdHJ0YWIpOiBEZWZpbmUgaGVyZS4KLQkoYmZkX2VsZl9sb2NhdGVfc2gpOiBEZWNsYXJlIGhlcmUuCi0JKiBlbGZjb2RlLmggKHN0cnVjdCBzdHJ0YWIpOiBEZWZpbml0aW9uIGRlbGV0ZWQuCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkIEhQUEFfUENSRUxfQ0FMTF8xMi4KLQotCSogTWFrZWZpbGUuaW46IE1ha2UgImFsbCIsIG5vdCAiYmZkLmgiLCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQuCi0JKHN0bXAtYmZkLmgpOiBOZXcgdGFyZ2V0OyBwcmV2ZW50cyByZWJ1aWxkaW5nIHdvcmxkIGlmIGJmZC5oCi0JaGFzbid0IHJlYWxseSBjaGFuZ2VkLgotCi0JVHVlIE1heSAyNSAxMjoxNToxNSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IFByb3ZpZGUgZWxmIHN0YW5kYXJkIGhhc2ggZnVuY3Rpb24uCi0JKHZhcmlvdXMpOiBLZXkgb2ZmIG9mIHRoZSBtYWNoaW5lcyB1c2VfcmVsYV9wIGZpZWxkIHRvIGRldGVybWluZQotCXdoZXRoZXIgdG8gdXNlIFJFTCBvciBSRUxBIHJlbG9jYXRpb25zLgotCShlbGZfc3dhcF9yZWxvY19vdXQsIGVsZl9zd2FwX3JlbG9jX2luKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBBbGxvY2F0ZSBhIHBvaW50ZXIgdG8gaG9sZCBhbGwgZGF0YSBmb3IgYQotCWdpdmVuIHNlY3Rpb24sIGFuZCBjb3B5IGVhY2ggZnJhZ21lbnQgaW50byB0aGUgZGF0YSByZWdpb24uCi0JVXBkYXRlIHRoZSBzZWN0aW9uJ3MgcG9pbnRlciB3aXRoIHRoZSBSRUwgaW1wbGljaXQgYWRkZW5kcyBpZiB0aGUKLQltYWNoaW5lIHVzZXMgUkVMIHJlbG9jYXRpb24uCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSB0bwotCWVsZl9pMzg2X2JmZF9yZWxvY190eXBlX2xvb2t1cCwgYW5kIHVzZSBjcHAgdG8gbWFwIHRoZSBuYW1lIGJhY2sKLQlpbnRvIHdhcyBlbGYzMi10YXJnZXQuaCBleHBlY3RzLgotCShlbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSB0byBlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaTM4Nl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgcmVsb2NhdGlvbiBzdXBwb3J0LgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogQWRkIG1pbmltYWwgcmVsb2NhdGlvbiBzdXBwb3J0LgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCB1c2VfcmVsYV9wLCBlbGZfNjRfcCwKLQllbGZfaW5mb190b19ob3d0b19yZWwgZmllbGRzLgotCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JlZCk6IEFkZCBzdXBwb3J0IGZvciBuZXcgZmllbGRzIGluCi0JZWxmX2JhY2tlbmRfZGF0YS4KLQotCVN1biBNYXkgMzAgMTY6Mzg6MjQgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBmYXN0LmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmM6IEFkZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gc3VwcG9ydCwgZml4Ci0JcmVsb2NhdGlvbiBob3d0byB0YWJsZSwgYWRkIHN0dWIgZ2VuZXJhdGlvbiBzdXBwb3J0LgotCi0JKiBlbGYzMi1ocHBhLmg6IEFkZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gc3VwcG9ydCwgZml4Ci0JcmVsb2NhdGlvbiBob3d0byB0YWJsZSwgYWRkIHN0dWIgZ2VuZXJhdGlvbiBzdXBwb3J0LgotCi0JKiBlbGZjb2RlLmggKGJmZF9lbGZfbG9jYXRlX3NoKTogTmV3IGZ1bmN0aW9uIHRvIGxvY2F0ZSBFTEYKLQlzZWN0aW9uIGhlYWRlci4KLQotCSogZWxmY29kZS5oIChiZmRfYWRkX3RvX3N0cnRhYik6IE1hZGUgbm9uLXN0YXRpYyBkdWUgdG8gYSBjYWxsCi0JZnJvbSBlbGYzMi1ocHBhLmMuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2lkeF9vZl9zeW0pOiBSZXR1cm4gU1ROX1VOREVGIGluc3RlYWQgb2YgMCB3aGVuCi0JdGhlIHN5bWJvbCBpcyBub3QgZm91bmQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE5vdCBhbGwgc2VjdGlvbgotCWZpbGUgcG9zaXRpb25zIHdlcmUgY29tcHV0ZWQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zZWN0X3RodW5rKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBocHBhLmMgKHNpZ25fZXh0KTogUmVpbXBsZW1lbnQuCi0KLQkqIGhwcGEuYyAocm91bmRfZG93bixyb3VuZCxyb3VuZF91cCxMLFIsTFMsUlMsTEQsUkQsTFIsUlIpOiBNYWtlCi0JdGhlc2UgZnVuY3Rpb25zIHN0YXRpYy4KLQotVHVlIEp1biAgMSAxNDo0MDo0MSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6ICBNb3ZlIGNsb3NlciB0byBoZWFkZXJzIC0gYW5kIGFmdGVyICdhbGwnIQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogIERvbid0IHNldAotCUJTRl9ERUJVR0dJTkcgZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMsIG9ubHkgQlNGX0NPTlNUUlVDVE9SLgotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiAgVHJhbnNsYXRlCi0JY29uc3RydWN0b3Igc3ltYm9scyBwcm9wZXJseS4KLQotVGh1IE1heSAyNyAxNjowOTowNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCk6IHVzZSA0IGJ5dGUgYWxpZ25tZW50IGFzIGEKLQltaW5pbXVtLgotCSogYW91dC10YXJnZXQuaCAobWluaW11bV9hbGlnbm1lbnQpOiA4IGJ5dGUgYWxpZ25tZW50IGlzIHJpZ2h0LgotCShmaXggbGQvMjY4MCkKLQotVGh1IE1heSAyNyAxMzozODo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IEJ1aWxkIGJmZC1pbjIuaCBpbiBzb3VyY2UgZGlyZWN0b3J5LAotCWZyb20gYmZkLWluLmggYW5kIC5jIGZpbGVzLiAgQnVpbGQgYmZkLmggaW4gYnVpbGQgZGlyZWN0b3J5LAotCXN1YnN0aXR1dGluZyBpbiByZXF1ZXN0ZWQgdGFyZ2V0IHdvcmQgc2l6ZS4gIEluc2VydCB3b3JkIHNpemUgaW50bwotCW1ha2VmaWxlLCBhbmQgbWF5YmUgZW5hYmxlIDY0LWJpdCB0YXJnZXRzLgotCi0JKiBiZmQtaW4uaCwgbGliYmZkLmMsIGRlbW82NC5jLCB0YXJnZXRzLmM6IERlZmluZSBCRkQ2NCBpZiA2NCBiaXRzCi0JYXJlIGF2YWlsYWJsZS4gIENvbmRpdGlvbmFsaXplIG9uIHRoaXMuICBBc3N1bWUgSE9TVF82NF9CSVQKLQl3aWxsIGJlIGRlZmluZWQgaWYgbmVlZGVkLCBzbyA2NC1iaXQgdGFyZ2V0cyBhcmUgY29uZGl0aW9uYWxpemVkCi0Jb25seSBpbiB0aGUgTWFrZWZpbGUuCi0KLVR1ZSBNYXkgMjUgMTQ6MDM6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoQ09FUkNFNjQpOiBSZXdyaXRlIHRvIGF2b2lkIG91dC1vZi1yYW5nZSB2YWx1ZXMuCi0KLQkqIGNvZmYtc2guYyAocnR5cGUyaG93dG8pOiBQdXQgZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIuCi0JKGV4dHJhX2Nhc2UpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfcHJpbnRfc3ltYm9sKTogQ2FzdCBiZmRfdm1hIHZhbHVlcyB0byBsb25nCi0JYmVmb3JlIGNhbGxpbmcgcHJpbnRmLgotCi0JKiBlbGZjb2RlLmg6IE5ldyBmaWxlLCBhbG1vc3QgY29tcGxldGVseSBkZXJpdmVkIGZyb20gb2xkIGVsZjMyLmMuCi0JKiBlbGYzMi5jOiBOb3cganVzdCBkZWZpbmUgQVJDSF9TSVpFIGFuZCBpbmNsdWRlIGVsZmNvZGUuaC4KLQkqIE1ha2VmaWxlLmluIChlbGY2NC5vKTogTGlzdCBkZXBlbmRlbmNpZXMsIGRvbid0IGJ1aWxkIGJ5Ci0JZGVmYXVsdC4KLQkoZWxmNjQuYyk6IEFkZCB0byBsaXN0IG9mIHNvdXJjZXMuCi0JKGVsZjMyLm8pOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogZWxmMzItKi5jOiBVcGRhdGVkIHR5cGUvbWFjcm8vc3RydWN0dXJlIG5hbWVzLiAgQ2xlYW5lZCB1cAotCW5hbWVzcGFjZSBwb2xsdXRpb247IHJlbmFtZSB2ZWN0b3JzLgotCSogdGFyZ2V0cy5jLCBjb25maWcvKi1lbGYubXQ6IFVwZGF0ZWQuCi0JKiBBbGwgdXNlcyBvZiAzMi1iaXQgdmVyc2lvbnMgb2Ygc3RydWN0dXJlcywgcm91dGluZXMsIGFuZCBtYWNyb3MKLQlyZW5hbWVkLgotCi0JKiBNYWtlZmlsZS5pbiAoYXJjaHVyZXMubywgdGFyZ2V0cy5vKTogRGVwZW5kIG9uIE1ha2VmaWxlLgotCi1Nb24gTWF5IDI0IDE1OjUzOjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVudW0gcmVsb2NfdHlwZSk6IE5vIGNvbW1hIGFmdGVyIGxhc3QgZW51bWVyYXRvci4KLQotCSogZWxmMzIuYyAoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogSGFuZGxlIGluZGV4IG9mIHplcm8KLQlzcGVjaWFsbHkuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IG5lZWQgdG8gZG8KLQlzbyBoZXJlLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVsZXRlZCBvbmUgdW51c2VkIHZhcmlhYmxlIGFuZAotCWluaXRpYWxpemVkIGFub3RoZXIgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzLgotCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlLgotCi1GcmkgTWF5IDIxIDE5OjA0OjIxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmM6ICBOZXcgbW9kdWxlIGZvciBMeW54IHZhcmlhbnQgb2YgYS5vdXQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0JBQ0tFTkRTIENGSUxFUyBkZXBlbmRzKTogIEFkZCBpMzg2bHlueC5jLgotCSogZ2VuLWFvdXQuYzogIEdldCByaWQgb2YgZGVmdW5jdCBlbmRpYW4gc3R1ZmYsIHByaW50IG91dCB0cnVlCi0JcGFnZXNpemUuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgQWRkIGkzODZseW54X3ZlYy4KLQotRnJpIE1heSAyMSAxNzowMjoyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgaTM4Ni1zY28ubXQgZm9yIGlbMzZdODYtKi1pc2MqLgotCi1GcmkgTWF5IDIxIDEzOjQ0OjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYWl4Mzg2LWNvcmUuYywgYW91dC10YXJnZXQuaCwgYW91dHguaCwgY29mZi1hbHBoYS5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmZ2VuLmMsIGVsZjMyLmMsIGllZWUuYywgbGliYW91dC5oLCBsaWJjb2ZmLWluLmgsCi0JbGliZWxmLmgsIG1pcHNic2QuYywgb2FzeXMuYywgc2NvLWNvcmUuYywgc3JlYy5jLCB0ZWtoZXguYywKLQl0cmFkLWNvcmUuYzogRGVmaW5lIGEgVEFSR0VUX2dldF9zeW1ib2xfaW5mbyBmdW5jdGlvbiBvciBtYWNyby4KLQlSZW1vdmUgdGhlIGJmZF9wcmludF9zeW1ib2xfbm0gY2FzZSBmcm9tIFRBUkdFVF9wcmludF9zeW1ib2wuCi0KLQkqIGJmZC1pbi5oOiBEb24ndCBkZWZpbmUgYmZkX3ByaW50X3N5bWJvbF9ubS4KLQlEZWZpbmUgc3ltYm9sX2luZm8gdHlwZS4KLQkoSlVNUF9UQUJMRSk6IFNldCBfZ2V0X3N5bWJvbF9pbmZvIGVsZW1lbnQuCi0KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUsIGJmZF9zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBVc2UgY29mZl9zZWN0aW9uX3R5cGUuCi0KLQkqIHRhcmdldHMuYzogQWRkIGJmZF9nZXRfc3ltYm9sX2luZm8gY2FsbC4KLQotV2VkIE1heSAxOSAxNTozMDo1MiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogIFVzZSB1bnNpZ25lZCBjaGFyIHRvIGF2b2lkCi0JY29tcGxhaW50cyBmcm9tIGFuY2llbnQgZ2NjJ3MuCi0KLVdlZCBNYXkgMTkgMTU6NTE6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jOiAgQ2hlY2sgbWFjcm8gVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRC4KLQlob3N0cy9pMzg2bGludXguaDogIERlZmluZSBpdC4KLQotTW9uIE1heSAxNyAxNTowMDozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogVkVSU0lPTiwgYmZkLWluLmg6IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi4yLgotCi0JKiBocHBhLmMgKGFzc2VtYmxlXzMsIGRpc19hc3NlbWJsZV8zLCBhc3NlbWJsZV8xMiwKLQlkaXNfYXNzZW1ibGVfMTIsIGFzc2VtYmxlXzE3LCBkaXNfYXNzZW1ibGVfMTcsIGFzc2VtYmxlXzIxLAotCWRpc19hc3NlbWJsZV8yMSwgc2lnbl9leHQsIG9uZXMsIHNpZ25fdW5leHQsIGxvd19zaWduX2V4dCwKLQlsb3dfc2lnbl91bmV4dCwgcm91bmRfZG93biwgcm91bmQsIHJvdW5kX3VwLCBMLCBSLCBMUywgUlMsIExELCBSRCwKLQlMUiwgUlIsIGhwcGFfZmllbGRfYWRqdXN0KTogTmV3IGZ1bmN0aW9ucy4KLQotTW9uIE1heSAxNyAxMDowNDoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBBZGRlZCBzdXBwb3J0IGZvciBpbmRpcmVjdAotCXN0YWJzIHN5bWJvbHMsIGluY2x1ZGluZyBuZXcgaW5kaXJlY3RfcHRyX3B0ciBhcmd1bWVudC4KLQkoZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUGFzcyBuZXcgYXJndW1lbnQgaW4gY2FsbHMgdG8KLQllY29mZl9zZXRfc3ltYm9sX2luZm8uCi0KLUZyaSBNYXkgMTQgMDA6MDU6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciBtNjhrIHN5c3Ygc3lzdGVtcywgdXNlIG02OGstY29mZi4KLQotCSogY29uZmlnL2hwcGEtZWxmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBERUZBVUxUX1ZFQ1RPUiBoZXJlLgotCShUREVGQVVMVFMpOiBEZWZpbmUgaXQgaGVyZS4gIFVzZSB0aGUgbmV3IG5hbWUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfYmFja2VuZF9kYXRhKTogRGVsZXRlOyByZWx5IG9uIGRlZmF1bHQKLQl2YWx1ZXMgaW5zdGVhZC4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkIHNvbWUgSFBQQSByZWxvYyB0eXBlcy4KLQotCSogYWl4Mzg2LWNvcmUuYyAoTk9fR0VUUyk6IEZpeCBQUk9UTyBpbnZvY2F0aW9uIHRvIGhhdmUgY29ycmVjdAotCW51bWJlciBvZiBhcmd1bWVudHMuCi0JKGFpeDM4Nl9jb3JlX2ZpbGVfcCk6IEluaXRpYWxpemUgY29yZV9zaXplIHRvIGNvcnJlY3QgdmFsdWUuCi0KLVdlZCBNYXkgMTIgMTQ6Mzk6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX0JVSUxEKTogTmV3IHZhcmlhYmxlLCBzZXQgdG8gJChDQykuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0NfRk9SX0JVSUxELgotCi0JKiBib3V0LmMgKGFvdXQzMl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lIHRvIGJlCi0JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIHJhdGhlciB0aGFuIGJmZF90cnVlLgotCi0JKiBjb2ZmLW1pcHMuYzogSW5jbHVkZSBsaWJhb3V0LmggYW5kIGFvdXQvYW91dDY0LmggdG8gZ2V0Ci0JZGVmaW5pdGlvbnMgZm9yIE5fU0VUW0FUREJdLgotCShlY29mZl9ob3d0b190YWJsZSk6IE1vdmVkIG5lYXIgdG9wIG9mIGZpbGUuCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IElmIGEgU1RBQlMgc3ltYm9sIG9mIHR5cGUgTl9TRVRbQVREQl0gaXMKLQlzZWVuLCBjb29rIHVwIGEgY29uc3RydWN0b3Igc2VjdGlvbiBvZiB0aGUgc2FtZSBuYW1lIGFuZCBwdXQgaW4gYQotCXJlbG9jIHBvaW50aW5nIHRvIHRoZSBzeW1ib2wuICBUaGlzIGxldHMgdGhlIEdOVSBsaW5rZXIgYnVpbGQKLQlnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyB3aXRob3V0IHVzaW5nIGNvbGxlY3QuCi0KLVR1ZSBNYXkgMTEgMDA6MzM6MzEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jIChtODhrYmNzX3ZlYyk6ICBTeW1ib2xzIGhhdmUgdW5kZXJiYXJzLgotCi1Nb24gTWF5IDEwIDA1OjU1OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBob3N0cy9taW5pZnJhbWUuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGl0LgotCi1TdW4gTWF5ICA5IDE2OjM2OjU5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotYnNkKTogIENoYW5nZSB0byBocHBhKi0qLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1ocHV4KTogIENoYW5nZSB0byBocHBhKi0qLWhwdXgqCi0JKiBjb25maWd1cmUuaW4gKG02OCotaHAtYnNkKTogIENoYW5nZSB0byBtNjgqLWhwLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki0qLWhwdXgpOiAgQ2hhbmdlIHRvIG02OCotKi1ocHV4KgotCSogY29uZmlndXJlLmluICgqLSotYnNkKTogIENoYW5nZSB0byAqLSotYnNkKgotCi1XZWQgTWF5ICA1IDE2OjA4OjMyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogIENhc3QgZW51bXMgdG8KLQlpbnQsIGZvciB0aGUgc2FrZSBvZiB0aGUgb2xkIFBvcnRhYmxlIEMgQ29tcGlsZXIuCi0KLU1vbiBNYXkgIDMgMTQ6Mzc6MDEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6ICBBZGQgY3B1LXNoLmMgYW5kIGNvZmYtc2guYy4KLQotTW9uIE1heSAgMyAxNDowMzoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBHZXQgdGFyZ2V0IG5hbWUgcmlnaHQgZm9yIG02OCotKi1ocHV4LgotCi1TdW4gTWF5ICAyIDExOjM5OjQ0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAoTk9fU0lHTkVEX0dFVCk6ICBOZXcgbWFjcm8uCi0JKiB0cmFkLWNvcmUuYyAodHJhZF9jb3JlX3ZlYyk6ICBVc2UgbmV3IE5PX1NJR05FRF9HRVQgaW5zdGVhZCBvZgotCXNpZ25lZCBOT19HRVQsIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1saW51eCopOiAgQWRkOyBiZmRfdGFyZ2V0ID0gaTM4Ni1saW51eC4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWxpbnV4Kik6ICBSZW1vdmUgdW50aWwgbGludXggcG9ydCBmb3IgYQotCW5vbi1pMzg2L2k0ODYgc3lzdGVtIGlzIGFjdHVhbGx5IGF2YWlsYWJsZS4KLQotRnJpIEFwciAzMCAyMDowNDoxMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6ICAjdW5kZWYgZV8qIHN5bWJvbHMgd2hpY2ggY29tZSBmcm9tIDxtYWNoaW5lL3NvbS5oPgotCXdoZW4gY29tcGlsaW5nIHVuZGVyIEhQVVguCi0KLUZyaSBBcHIgMzAgMTc6MjU6MjMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogVGhlIGZvbGxvd2luZyBwYXRjaGVzIGFyZSBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgotCSogaHBwYS5jIChocHBhX2NvcmVfZmlsZV9wKTogUHJvdmlkZSBhIHRlbXBvcmFyeSBkdW1teSByb3V0aW5lCi0JZm9yIEhPU1RfSFBQQUJTRC4KLQkqIGJmZC9ob3N0cy9ocHBhYnNkLmg6IEZpeCBkZWNsYXJhdGlvbnMgb2YgbWFsbG9jIGFuZCBmcmVlLgotCSogYmZkL2xpYmhwcGEuaDogSW5jbHVkZSBzeXNkZXAgaGVyZS4gIENvbmRpdGlvbmFsaXplCi0JaW5jbHVkZXMgYmFzZWQgb24gSE9TVF9IUFBBSFBVWCBvciBIT1NUX0hQUEFCU0QuCi0JUHJvdmlkZSBkZWZpbml0aW9ucyBmb3IgTUFYQ09NTEVOIGFuZCBfUEFfUklTQ19JRCBzdWl0YWJsZQotCWZvciBCU0QuCi0KLUZyaSBBcHIgMzAgMTc6MzQ6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmM6IERvbid0IGluY2x1ZGUgYS5vdXQuaC4gIEFwcGFyZW50bHkgbm90IGV2ZW4gdGhlCi0JR05VIHZlcnNpb24gaXMgbmVlZGVkLgotCi1GcmkgQXByIDMwIDA5OjM4OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiB1c2UgZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyByYXRoZXIgdGhhbiBjYXN0aW5nIGFib3J0LgotCi1UaHUgQXByIDI5IDExOjMwOjMyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgZWxmMzItaHBwYS5vLgotCi0JKiBzeW1zLmMgKEJTRl9GVU5DVElPTik6IE5ldyBzeW1ib2wgZmxhZy4KLQotCSogZWxmMzItaHBwYS5jOiBGaXhlZCB0byB3b3JrIHdpdGggZWxmMzItdGFyZ2V0LmguCi0KLQkqIGhwMzAwaHB1eC5jIChOQU1FLCBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBGaXggZm9yCi0JdHJhZGl0aW9uYWwgQy4KLQkqIGxpYmFvdXQuaCAoTkFNRSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGxpYmVsZi5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkoZWxmX3N5bWJvbF90eXBlKTogTW92ZWQgaGVyZSwgYWRkZWQgbmV3IGZpZWxkcy4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQgYGdsb2JhbF9zeW0nOyBJIHN1c3BlY3QgdGhpcwotCW1heSBiZSBtaXNwbGFjZWQuCi0JKiBlbGYzMi5jIChlbGZfc3ltYm9sX3R5cGUpOiBEZWxldGVkIGZyb20gaGVyZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgZmllbGRzIHJhd19zeW1zIGFuZCBpbnRlcm5hbF9zeW1zLCB0bwotCXBvaW50IHRvIGJhY2tlbmQgdmVyc2lvbnMgb2Ygc3ltYm9scy4KLQkob2JqX3N5bWJvbHMsIG9ial9yYXdfc3ltcywgb2JqX2ludGVybmFsX3N5bXMpOiBOZXcgbWFjcm9zLgotCShlbGZfc3dhcF9waGRyX291dCwgZWxmX2J1aWxkX3BoZHJzLCBlbGZfd3JpdGVfcGhkcnMpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBXcml0ZSBwcm9ncmFtIGhlYWRlcnMgaWYgYXBwcm9wcmlhdGUuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVubmFtZWQgc2VjdGlvbnMgZ2V0IGVtcHR5IHN0cmluZyBmb3IKLQluYW1lLCBub3QgInVubmFtZWQiLiAgSGFuZGxlIFNIVF9OT0JJVFMgc2VwYXJhdGVseSBmcm9tCi0JU0hUX1BST0dCSVRTLCBhbmQgc2V0IHNvbWUgZGlmZmVyZW50IGZsYWdzLgotCShlbGZfZmlsZV9wKTogTmV3IHJvdXRpbmUuCi0JKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogQ2FsbCBpdC4KLQkoZWxmX29iamVjdF9wKTogSGFuZGxlIEVNX0hQUEEuCi0JKGVsZl9zeW1ib2xfZnJvbSwgZWxmX2lkeF9vZl9zeW0pOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IEdldCBzeW1ib2wgbnVtYmVyIHJpZ2h0IGZvciByZWxvY2F0aW9ucy4gIFNldAotCVNIRl9BTExPQywgU0hGX1dSSVRFLCBTSEZfRVhFQ0lOU1RSIHdoZW4gYXBwcm9wcmlhdGUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQlNTIHNlY3Rpb24gc2hvdWxkIGJlIFNIVF9OT0JJVFMsIG5vdAotCVNIVF9QUk9HQklUUy4gIEFsd2F5cyBnZW5lcmF0ZSBzeW10YWIgYW5kIHN0cnRhYiwgbm90IG9ubHkgaWYKLQlyZWxvY2F0aW9ucyBhcmUgbmVlZGVkLiAgU2V0IFNIRl8qIGZsYWdzIGFzIGFwcHJvcHJpYXRlLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSGFuZGxlIGJmZF9hcmNoX2hwcGEuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBzeW1ib2wgY291bnQuCi0JU3RvcmUgYSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgc3ltYm9sOyB3cml0ZSB0aGUgc2l6ZSBmaWVsZAotCXByb3Blcmx5OyBtYWtlIHNvbWUgZ3Vlc3NlcyBhYm91dCB0aGUgdHlwZSBmaWVsZC4gIFNldCBzZWN0aW9uCi0JdHlwZSBjb3JyZWN0bHkgZm9yIHN0cmluZyB0YWJsZXMuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBDaGVjayBmb3IgYWJzb2x1dGUgYW5kIGNvbW1vbiBzZWN0aW9ucwotCWZpcnN0LgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGl0dG8uCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgZWxmX3N5bWJvbF90eXBlIGluc3RlYWQgb2YgYXN5bWJvbC4KLQlVc2UgZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgInVubmFtZWQiIGZvciBuYW1lbGVzcyBzeW1ib2xzLgotCUhhbmRsZSBTVFRZX0ZVTkMgdHlwZSwgYW5kIHdlaXJkbmVzcyB3aXRoICIkZ2xvYmFsJCIgc3ltYm9sIGZvcgotCUhQUEEgKG9ubHk/KS4gIERvbid0IGZyZWUgcmF3IHN5bWJvbHM7IGtlZXAgdGhlIHBvaW50ZXIgYXJvdW5kIGZvcgotCWxhdGVyLgotCShlbGZfc2V0X2FyY2hfbWFjaCk6IEhhbmRsZSBiZmRfYXJjaF9ocHBhLgotCShlbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBKdXN0IHJldHVybiBmYWxzZS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cywgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0Ci0Jb3V0cHV0X2hhc19iZWd1biBmaWVsZCBhZnRlciBjb21wdXRpbmcgZmlsZSBwb3NpdGlvbnMuCi0JKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFdyaXRlIHNlY3Rpb24gY29udGVudHMgaW1tZWRpYXRlbHksCi0JcmF0aGVyIHRoYW4gY2FjaGluZyB0aGUgd2hvbGUgZmlsZSBhbmQgd3JpdGluZyBpdCBhdCBjbG9zZSB0aW1lLgotCi0JKiBsaWJocHBhLmggKGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlLCBlbnVtCi0JaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBfYWx0LCBlbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlLCBlbnVtCi0JaHBwYV9yZWxvY19leHByX3R5cGVfYWx0KTogTmV3IGVudW1lcmF0b3IgdHlwZXMuCi0KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCwuIGNvbmZpZy9ocHBhb3NmLm1oOiBIUCBQQS9PU0Ygc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlLmhvc3Q6IFVzZSB0aGVtLgotCi1XZWQgQXByIDI4IDIzOjIxOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdGFyZ2V0Lmg6IEFsbG93IG92ZXJyaWRlcyBvZiBhcm1hcCBkZWZhdWx0cy4KLQotCSogZWxmMzItaHBwYS5jLCBlbGYzMi1ocHBhLmg6IE5ldyBmaWxlcy4KLQotCSogY29uZmlnL2hwMzAwaHB1eC5tdDogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMjcgMDU6Mzk6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKE5PX0dFVFMpOiBOZXcgbWFjcm87IE5PX0dFVCBmb3Igc2lnbmVkIHZhbHVlcy4KLQkoYWl4Mzg2X2NvcmVfdmVjKTogVXBkYXRlIGZvciBuZXcgZmllbGRzLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IENhbGwgdGFyZ2V0LXNwZWNpZmljCi0Jc2x1cnBfYXJtYXAgY29kZSwgaW5zdGVhZCBvZiBiZmRfc2x1cnBfYXJtYXAuCi0JKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IERlY2xhcmUgaXQuCi0JKiBhb3V0LXRhcmdldC5oIChBUl9QQURfQ0hBUik6IERlZmluZSBpdCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSh2ZWMpOiBVc2UgaXQuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IE5ldyBmaWVsZCBmb3Igc3ViZm9ybWF0LCBmb3IKLQlkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBoaWdobHkgc2ltaWxhciBhLm91dCBmb3JtYXRzLgotCSogYW91dHguaCAoTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luKTogTmV3IG1hY3JvLCBkZWZhdWx0cyB0byBsb2NhbAotCXZlcnNpb24gb2YgZnVuY3Rpb24uCi0JKHN3YXBfZXhlY19oZWFkZXJfaW4pOiBEb24ndCBkZWZpbmUgaWYgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luIGlzCi0JYWxyZWFkeSBkZWZpbmVkLgotCSogaHAzMDBocHV4LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IEluY2x1ZGUgaXQuCi0KLU1vbiBBcHIgMjYgMTM6MjQ6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCB0YXJnZXRzLmM6IFN1cHBvcnQgZm9yCi0JSGl0YWNoaSBTSC4KLQotTW9uIEFwciAyNiAxMzo1NTo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENoZWNrIHRoZSBmaWxlIHNpemUuCi0KLU1vbiBBcHIgMjYgMTM6MjQ6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYzogUmVtb3ZlIGR1cGxpY2F0ZSBmdW5jdGlvbiBhbmQgYWRkIHdhcm5pbmdzLgotCi1Nb24gQXByIDI2IDExOjI1OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2NvLWNvcmUuYyAoc2NvX2NvcmVfdmVjKTogQWRkIGluaXRpYWxpemVycyBmb3IgbmV3IHRhcmdldAotCWZpZWxkcy4KLQotU2F0IEFwciAyNCAyMTozMzo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCBbX0xJVF06IFJlY29nbml6ZSAubGl0IHNlY3Rpb24uCi0KLUZyaSBBcHIgMjMgMTk6MDA6MzYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYywgY3B1LWFscGhhLmMsIGNvbmZpZy9hbHBoYW9zZi5tdCwKLQljb25maWcvYWxwaGFvc2YubXQsIGhvc3RzL2FscGhhb3NmLmg6ICBOZXcgZmlsZXMuCi0KLUZyaSBBcHIgMjMgMTY6NDg6NDYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogTWVyZ2UgaW4gSFBQQS9CU0QgY2hhbmdlcyBmcm9tIFV0YWguCi0JKiBocHBhLmM6ICBVc2UgdGhpcyBmb3IgYm90aCBIUFVYICYgQlNELgotCSogdGFyZ2V0cy5jOiAgRW5hYmxlIGhwcGFfdmVjIGZvciBib3RoIEhQVVggJiBCU0QuCi0JKiBjb25maWcvaHBwYWJzZC5tdDogIFRERUZJTkVTID0+IFRERUZBVUxUUy4KLQkqIGhvc3RzL2hwcGFic2QuaDogICNkZWZpbmUgSE9TVF9IUFBBQlNELgotCi1XZWQgQXByIDIxIDAxOjUwOjEwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYzogIFdoaXRlc3BhY2UgY2hhbmdlcyBhcm91bmQgYnl0ZXN3YXAgbWFjcm9zLgotCSogbGliYmZkLWluLmg6ICBXaGl0ZXNwYWNlIGNoYW5nZXMgYXJvdW5kIGJ5dGVzd2FwIGRlY2xhcmF0aW9ucy4KLQotVHVlIEFwciAyMCAxNTo1OTowNyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2NvcmVfZmlsZV9wKTogIERvbid0IGRlZmF1bHQgYmZkX2Vycm9yIHRvCi0Jc3lzdGVtX2Vycm9yIGFueW1vcmUuICBJdCBjb25mdXNlcyBiZmRfY2hlY2tfZm9ybWF0KCkuCi0KLU1vbiBBcHIgMTkgMjM6MDM6MDggMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBBZGQgc2dpX2NvcmVfZGF0YSB0byB0ZGF0YSB1bmlvbi4KLQkqIGNvZmYtbWlwcy5jOiAgQWRkIElyaXggNC54IGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvaXJpeDQuaDogICNkZWZpbmUgSE9TVF9JUklYNC4KLQotTW9uIEFwciAxOSAxODo1Mjo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIHRoYXQgdGhlCi0Jc3ltYm9sJ3Mgc2VjdGlvbiBkb2VzIGdldCBzZXQuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFplcm8gaW5kZXggbWVhbnMgbnVsbC1zdHJpbmcgbmFtZS4KLQotCSogYW91dHguaCAoc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgc3RydWN0IHN0cmluZ3RhYl9kYXRhKTogTmV3Ci0JZGF0YSBzdHJ1Y3R1cmVzLgotCShoYXNoLCBzdHJpbmd0YWJfaW5pdCwgYWRkX3RvX3N0cmluZ3RhYiwgZW1pdF9zdHJ0YWIsIGNvbXBhcmUpOgotCU5ldyBmdW5jdGlvbnMuCi0JKHdyaXRlX3N5bXMpOiBVc2UgdGhlbSwgdG8gcmVkdWNlIHN0cmluZyB0YWJsZSBzaXplLgotCi1Nb24gQXByIDE5IDE2OjQ1OjEyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF9jb3JlX3ZlYyk6ICBBZGQgNiBuZXcgaW5pdGlhbGl6ZXJzIHRvIG1hdGNoCi0JICBuZXcgc2lnbmVkIGdldC9wdXQgZmllbGRzLiAgTWlub3IgcmVmb3JtYXR0aW5nIHRvIGxhYmVsCi0JICBzb21lIGZpZWxkcy4KLQotTW9uIEFwciAxOSAwNjowOTo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IEluc2VydCBjb21tZW50IGFib3V0IFNWUjMgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGhvc3RzL3tocDMwMCxpMzg2aXNjLGkzODZ2fS5oOiBSZW1vdmUgdW51c2VkICNkZWZpbmVzIG9mIHtyLH1pbmRleAotCShiZmQgdXNlcyBzdHJjaHIgYW5kIHRoZSBicm9rZW4gU1ZSMy4yIGNwcCBsb3NlcyB3aXRoIHRoZSBkZWZpbmVzKS4KLQotCSogbGliYmZkLmM6IGJmZF9wdXQqOiBSZW1vdmUgY2FzdHMgdG8gYmZkX3ZtYS4KLQotRnJpIEFwciAxNiAxNzo0OToyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKGludGVybmFsX3N1bm9zX2NvcmUpOiBNYWtlIGNfc3RhY2t0b3AgYSBiZmRfdm1hLgotCShzd2FwY29yZV9zcGFyYyk6IE1ha2Ugc3AgYSBiZmRfdm1hLgotCi1UaHUgQXByIDE1IDA5OjA5OjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYzogQWRkIHNpZ25lZCB2ZXJzaW9ucyBvZiBiZmRfe2hfLH17Z2V0LHB1dH1fc2lnbmVkXzxzaXplPi4KLQlsaWJiZmQuYywgbGliYmZkLWluLmg6IEFkZCBfZG8qc2lnbmVkKi4KLQl0YXJnZXRzLmMsIGFsbCB0YXJnZXRzOiBBZGQgYmZkKnNpZ25lZCouCi0JYmZkLWluLmg6IEFkZCBiZmRfc2lnbmVkX3ZtYS4gIEFkZCBjb21tZW50cy4KLQotCSogYmZkLWluLmggKGJmZF9lcnJvciksIGJmZC5jIChiZmRfZXJybXNncyk6IEFkZCBmaWxlX3RydW5jYXRlZC4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19lcnJvcik6IENoZWNrIGVycm9yIHJldHVybiBmcm9tCi0JX2JmZF9jaGVja19mb3JtYXQgcm91dGluZXMuCi0KLVdlZCBBcHIgMTQgMjM6NDg6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogSW1wcm92ZSBlcnJvciBjaGVja2luZyBhbmQKLQlyZWNvZ25pemUgLmRhdGEgc2VjdGlvbiBpZiBwcmVzZW50LgotCi1UaHUgQXByIDE1IDAxOjAwOjI5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0XypfYWRqdXN0X3NpemVzX2FuZF92bWFzKTogIEF2b2lkIGBzYW5pdHknCi0JY2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIHNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIEJTUwotCXNlY3Rpb24gKGFuZCB0aGUgZmlsZSBoZWFkZXIgY2FuJ3Qgc3BlY2lmeSB0aGlzKS4gIExldCB0aGUgdXNlcgotCXNldCBpdCB3aGVyZXZlciB0aGV5IHdhbnQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBnb2VzIGluIHRoZSBoZWFkZXIuCi0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9ucyk6ICBQYXNzIGFsbCBpZWVlIHNlY3Rpb24gbmFtZXMKLQlzdHJhaWdodCB0aHJvdWdoIGludG8gQkZEIHNlY3Rpb25zLiAgQWRkIGNvbW1lbnRzLgotCi1XZWQgQXByIDE0IDIwOjM0OjU0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW51cCBpbiBwcmVwYXJhdGlvbiBmb3IgYmV0dGVyIDY0LWJpdCBob3N0IHN1cHBvcnQuCi0KLQkqIGJmZC1pbi5oIChiZmRfNjRfdHlwZSk6ICBSZW1vdmUuCi0JKiBsaWJiZmQuYyAoX2RvX2dldGI2NCwgX2RvX3B1dGI2NCk6ICBVc2UgYmZkX3ZtYSwgbm90IGJmZF82NF90eXBlLgotCi0JKiBiZmQtaW4uaCAoYmZkX3NpemUpOiAgUmVtb3ZlLgotCi0JKiBiZmQtaW4uaCAoYmZkX29mZnNldCk6ICBSZW1vdmUsIGFmdGVyIGZpeGluZyBsZC9sZGxhbmcuW2NoXS4KLQotCSogYmZkLWluLmggKGJmZF93b3JkKTogIFJlbW92ZS4KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiAgUmVwbGFjZSBiZmRfd29yZCB3aXRoIGJmZF92bWEuCi0KLQkqIGJmZC1pbi5oIChyYXdkYXRhX29mZnNldCk6ICBSZW1vdmUuCi0JKiByZWxvYy5jIChhcmVsZW50KTogIFJlcGxhY2UgcmF3ZGF0YV9vZmZzZXQgd2l0aCBiZmRfc2l6ZV90eXBlLgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogIExpbnQuCi0JKGVudW0gYmZkX3JlbG9jX3N0YXR1cyk6ICBDb21tZW50IGNsZWFudXAuCi0KLQkqIGFvdXQtYWRvYmUuYywgY3B1LWg4MzAwLmMsIG1pcHNic2QuYywgc3JlYy5jOiBsaW50IC1XYWxsLgotCi1UdWUgQXByIDEzIDExOjE5OjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3dhcGNvcmVfc3BhcmMpOiBHdWVzcyB0aGUgcmlnaHQgdmFsdWUgb2YgVVNSU1RBQ0suCi0KLU1vbiBBcHIgMTIgMTQ6MTg6MDAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLmM6ICBDbGVhbiB1cCBvbGQgY29tbWVudHMuCi0KLUZyaSBBcHIgIDkgMTA6NDM6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3VuMy5oOiBTdHJpbmcgYXJndW1lbnQgdG8gZnByaW50ZiBpcyBjb25zdC4KLQotCSogY29mZi1taXBzLmM6IFJlbmFtZWQgUEFHRV9TSVpFIHRvIFJPVU5EX1NJWkUsIHRvIGF2b2lkIGNvbmZ1c2lvbgotCW9uIHN5c3RlbXMgd2hpY2ggZGVmaW5lIFBBR0VfU0laRSBpbiA8bGltaXRzLmg+LgotCi1UaHUgQXByICA4IDEwOjI4OjAwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiBVc2UgbmV3IG1hY3JvCi0JVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTCB0byBhbGxvdyBob3N0IGZpbGVzIHRvIHNwZWNpZnkKLQl0aGUgY29yZSBmaWxlIGZhaWxpbmcgc2lnbmFsLgotCSogaG9zdHMvZGVjc3RhdGlvbi5oIChUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKTogRGVmaW5lCi0JdG8gc3VwcGx5IHRoZSBjb3JlIGZpbGUgZmFpbGluZyBzaWduYWwuCi0KLVRodSBBcHIgIDggMDk6MTc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IE9ubHkgc2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IKLQlhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0JaXMgZGVmaW5lZC4gIE9uIG1hbnkgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIGFsd2F5cyBTVFlQX05PTE9BRC4KLQkqIGNvZmYtaTM4Ni5oIChCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZKTogRGVmaW5lLgotCi1XZWQgQXByICA3IDExOjMzOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKFBBR0VTSVpFKTogQ29ycmVjdCB2YWx1ZS4KLQotVHVlIEFwciAgNiAxMjowNTo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEFkZHJlc3Mgb2YgZmlyc3QgUERSIGlzCi0JYW4gb2Zmc2V0IChwYXRjaCBmcm9tIEplYW4tRGFuaWVsIEZla2V0ZSA8amRmQGxyaS5scmkuZnI+KS4KLQotTW9uIEFwciAgNSAxMjowNzoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgYQotCVNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbi4gIERvbid0IHNldCBTRUNfTkVWRVJfTE9BRCBmb3IgYQotCVNUWVBfSU5GTyBzZWN0aW9uLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvcmNlIHZtYSBhbmQgbG1hIG9mIF9MSUIKLQlzZWN0aW9uIHRvIGJlIHplcm8uCi0JKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDb3VudCBudW1iZXIgb2YgZW50cmllcyBpbiBuZXcgbG1hCi0JZmllbGQsIG5vdCBpbiB2bWEuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEZvcmNlIGxpbmVub19jb3VudCBvZgotCVNFQ19TSEFSRURfTElCUkFSWSBzZWN0aW9uIHRvIGJlIHplcm8sIHNpbmNlIGl0IGlzIG5vbi16ZXJvIG9uIHRoZQotCVNDTyAzLjJ2NCBzaGFyZWQgbGlicmFyeS4KLQkqIHNlY2xldC5jIChyZWwpOiBDb3B5IG92ZXIgYW55IHNlY3Rpb24gd2l0aCBjb250ZW50cywgbm90IGp1c3QKLQlsb2FkYWJsZSBzZWN0aW9ucy4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKTogWmVybyBvdXQgbmV3bHkgYWxsb2NhdGVkCi0Jc3ltYm9sLgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLCB0byBnZW5lcmF0ZQotCXJlbG9jYXRlYWJsZSBvdXRwdXQgY29ycmVjdGx5LgotCShob3d0b190YWJsZSk6IFVzZSBjb2ZmX2kzODZfcmVsb2MgZm9yIGFsbCByZWxvYyB0eXBlcy4KLQkoQ0FMQ19BRERFTkQpOiBVc2UgYSBtb3JlIGVmZmljaWVudCBoYWNrIHRvIGdldCB0aGUgY29ycmVjdCBhZGRlbmQKLQlmb3IgYSBjb21tb24gc3ltYm9sLgotCShpMzg2Y29tbV92YWx1ZSk6IFJlbW92ZWQ7IG5vIGxvbmdlciBuZWVkZWQuCi0KLVN1biBBcHIgIDQgMTU6MDg6NDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCB3cml0ZSBvdXQKLQlzZWN0aW9ucyB3aXRob3V0IGEgZmlsZXBvcy4KLQotRnJpIEFwciAgMiAxNDozNTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNlY2xldC5jIChzZWNsZXRfZHVtcF9zZWNsZXQpOiBDb3JyZWN0IFNFQ19IQVNfQ09OVEVOVFMgdGVzdC4KLQotV2VkIE1hciAzMSAxNzo0MTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZGVkIEJGRF9SRUxPQ19NSVBTX0dQUkVMLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogQWRkZWQgZ3Bfc2l6ZSBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBncF9zaXplIHRvIDguCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IENvbXBhcmUgYWdhaW5zdCBncF9zaXplLCBub3QgaGFyZGNvZGVkIDguCi0JU2V0IGZsYWdzIHRvIDAgZm9yIGxhcmdlIGNvbW1vbiBzeW1ib2xzLgotCShlY29mZl9ncHJlbF9yZWxvYyk6IEhhbmRsZSBub24temVybyBhZGRlbmQgZm9yIGV4dGVybmFsIHN5bWJvbHMsCi0Jd2hpY2ggY2FuIG9jY3VyIGZvciBnYXMtZ2VuZXJhdGVkIHJlbG9jcy4KLQkoZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkZWQgQkZEX1JFTE9DX01JUFNfR1BSRUwgY2FzZS4KLQkqIGJmZC5jIChiZmRfZ2V0X2dwX3NpemUsIGJmZF9zZXRfZ3Bfc2l6ZSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoYmZkLm8pOiBOb3cgZGVwZW5kcyBvbiBjb2ZmL3N5bS5oIGFuZCBsaWJlY29mZi5oLgotCi1UdWUgTWFyIDMwIDA5OjMzOjE2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBVc2UgbG1hIGZpZWxkIGZvciBsb2FkCi0JYWRkcmVzcy4KLQkqIHNlY3Rpb24uYzogQWRkIGRlY2xhcmF0aW9uIG9mIGxtYSBmaWVsZCB0byBzZWN0aW9uIHN0cnVjdHVyZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIGxtYSBmaWVsZCBmb3IgbG9hZAotCWFkZHJlc3MuCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IFNldCBsbWEgYWxvbmcgd2l0aCB2bWEuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBOb3cgaGFuZGxlcyBpbmRpcmVjdAotCXN5bWJvbHMgaW4gYSBiZXR0ZXIgd2F5LiAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZyk6IFNldCB0aGUKLQlOX0lORFIgYml0IHdoZW4gbmVjZXNzYXJ5LiAoYW91dDw+c2x1cnBfc3ltYm9sX3RhYmxlKTogTWFpbnRhaW4KLQlpbmRpcmVjdCBzdGF0ZS4KLQkqIHNlY3Rpb24uYzogQWRkZWQgQkZEX0lORF9TRUNUSU9OX05BTUUgYW5kIGJmZF9pbmRfc2VjdGlvbi4KLQkoYmZkX21ha2Vfc2VjdGlvbik6IENvcGUgd2l0aCBuZXcgYnVpbHRpbiBzZWN0aW9uLgotCSogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKTogQ2FuIG5vdyBwcmludCBpbmRpcmVjdCBzZWN0aW9uCi0JaW5mby4KLQotV2VkIE1hciAyNCAxMzozNjozMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKG9iamVjdF9wKSk6ICBGYWlsIGlmIE1BQ0hUWVBFX09LIGlzCi0JZGVmaW5lZCwgYW5kIHlpZWxkcyBmYWxzZS4KLQkqIGFvdXQtbWlwc2JzZC5jLCBpMzg2YnNkLmM6ICBEZWZpbmUgTUFDSFRZUEVfT0sgYXBwcm9wcmlhdGVseS4KLQotCSogYXJjaGl2ZS5jIChzbmFyZl9hcl9oZHIpOiAgQWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgKG9ubHksCi0Jc28gZmFyKSBCU0QtNC40LXN0eWxlIGV4dGVuZGVkIGhlYWRlcnMuCi0JKiBhcmNoaXZlLmM6ICBTb21lIG1vcmUgY29tbWVudHMuCi0KLVdlZCBNYXIgMjQgMDI6MDU6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggcnVsZSBmb3IgZHZpIGFuZCBpbmZvLCBzbyB0aGF0IHRoZSByZWN1cnNpdmUKLQltYWtlcyBkb2VzIHRoZSByaWdodCB0aGluZywgaW5zdGVhZCBvZiBhbHdheXMgaW5mbwotCi1XZWQgTWFyIDI0IDAyOjU2OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogRGlzYWJsZSBvcHRpbWl6ZWQgaGFuZGxpbmcgZm9yIGFyY2hpdmVzIGFuZAotCWFyY2hpdmUgbWVtYmVyczsgdGhleSBuZWVkIG1vcmUgc3BlY2lhbCByZWF0bWVudC4gIEZvciBub3csIHZlcmlmeQotCXRoYXQgY29tcHV0ZWQgYW5kIGFjdHVhbCBmaWxlIHBvc2l0aW9ucyBjb3JyZXNwb25kLgotCi1UdWUgTWFyIDIzIDA4OjQ1OjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWlwc2JzZC5jOiBSZW5hbWVkIGZyb20gYW91dC1taXBzYnNkLmMuCi0JKHNldF9hcmNoX21hY2gpOiBEZWxldGUgbm9uLU1JUFMgY29kZS4KLQkocmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEaXR0by4KLQkqIE1ha2VmaWxlLmluOiBBZGp1c3RlZC4KLQotCSogbGliYmZkLmMgKGJmZF90ZWxsKTogVXBkYXRlIGB3aGVyZScgZmllbGQuCi0JKGJmZF9zZWVrKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UncmUgbm90IGNoYW5naW5nIHRoZSBmaWxlCi0JcG9zaXRpb24uICBJZiBGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYIGlzIGRlZmluZWQsIGNoZWNrIGB3aGVyZScKLQlmaWVsZCBhZ2FpbnN0IGEgU0VFS19TRVQgcmVxdWVzdC4gIENhbGwgYmZkX3RlbGwgdG8gcmUtdXBkYXRlCi0JYHdoZXJlJyBmaWVsZCB3aGVuIGRvbmUuCi0JKGJmZF9yZWFkLCBiZmRfd3JpdGUpIFtGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYXTogTWFpbnRhaW4KLQlgd2hlcmUnIGZpZWxkLgotCSogaG9zdHMvc3BhcmMuaDogRGVmaW5lIEZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVguCi0KLU1vbiBNYXIgMjIgMjM6MTg6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1Nb24gTWFyIDIyIDE0OjU3OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbG9jYXRlIGVuY2Fwc3VsYXRlZCBzdGFicwotCWlmIHRoZSB0eXBlIGlzIG5vdCBzdE5pbC4KLQotVHVlIE1hciAxNiAxMDozNToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmMzIuYyAoZWxmX2xpdHRsZV92ZWMsIGVsZl9iaWdfdmVjKTogRGVsZXRlIG5vdy1pbnZhbGlkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IERvbid0IHVzZSBDT05TVCBoZXJlLAotCWl0J3MgaW1wbGllZCBieSB0aGUgdHlwZS4KLQotRnJpIE1hciAxMiAxODo1ODowOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiByZWNvZ25pemUgc3BhcmMtc3VuLXNvbGFyaXMyKiBpbnN0ZWFkIG9mIHNwYXJjLXN1bi1zb2xhcmlzKgotCi1UdWUgTWFyICA5IDA5OjIzOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jOiBBZGQgLmxkaW5mbyBzZWN0aW9uLgotCi1GcmkgTWFyIDEyIDExOjU3OjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCi0KLUZyaSBNYXIgMTIgMDg6MzI6MTEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogd2hpdGVzcGFjZQotCSogc2VjbGV0LmMgKHNlY2xldF9kdW1wX3NlY2xldCk6IERvbid0IHRyeSBhbmQgZmlsbCBzZWN0aW9ucyB3aXRoCi0Jbm8gY29udGVudHMuCi0KLVRodSBNYXIgMTEgMTk6MjY6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9nbzMyLmg6IGRvbid0IGRlZmluZSBQT1NJWF9VVElNRQotCi1UdWUgTWFyICA5IDEwOjUyOjAxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi5jIChlbGZfb2JqZWN0X3ApOiAgVXNlIEVMRl9BUkNIIHN0b3JlZCBpbiB4dmVjIHRvIG1hdGNoCi0JYWdhaW5zdCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBzdG9yZWQgaW4gdGhlIEVMRiBoZWFkZXIsIHRvIHJlc29sdmUKLQlhbWJpZ3VpdGllcy4KLQkqIGVsZjMyLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBCZmRfbWFrZV9zZWN0aW9uIGNhbiByZXR1cm4KLQlOVUxMLCBzbyBvbmx5IHVzZSByZXN1bHRzIHdoZW4gbm9uLU5VTEwuCi0JKiB0YXJnZXRzLmMgKGVsZjMyX202OGtfdmVjLCBlbGYzMl9pODYwX3ZlYyk6ICBBZGQgZXh0ZXJuIGRlY2xzCi0JYW5kIGFkZCB0byB2ZWN0b3Igb2YgdGFyZ2V0cy4KLQotTW9uIE1hciAgOCAxNToxMzo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBFbmNhcHN1bGF0ZWQgU1RBQlMgc3ltYm9scwotCWFyZSBhbHdheXMganVzdCBkZWJ1Z2dpbmcgc3ltYm9scy4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX1tnc11ldF9zeW1faW5kZXgpOiBNb3ZlZCBtYWNyb3MgZnJvbSBoZXJlLi4uCi0JbGliZWNvZmYuaCAoZWNvZmZfW2dzXWV0X3N5bV9pbmRleCk6IC4uLnRvIGhlcmUuCi0KLU1vbiBNYXIgIDggMTQ6NTU6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgKF9QQV9SSVNDX0lEKTogRGVmaW5lZCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkIChlLmcuLCBmb3IKLQlocHV4IDcpLiAgUGF0Y2ggZnJvbSBmcmllZG1hbkBnbnUuYWkubWl0LmVkdS4KLQkoaHBwYV9vYmplY3RfcCk6IE9ubHkgY2hlY2sgZm9yIERMX01BR0lDIGFuZCBTSExfTUFHSUMgaWYgdGhleSdyZQotCWRlZmluZWQsIHdoaWNoIHRoZXkgYXJlbid0IGluIGhwdXggNy4wLgotCi0JKiBhaXgzODYtY29yZS5jOiBJbmNsdWRlIHVpbmZvLmggYW5kIGNvcmVkdW1wLmguICBQYXRjaCBmcm9tIE1pbmgKLQlUcmFuLUxlLCB0cmFubGVAaW50ZWxsaWNvcnAuY29tLgotCi1GcmkgTWFyICA1IDE0OjU0OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2dlbmVyaWNfcmVsb2MpOiBJZiB0aGUgYWRkZW5kIGlzIG5vbi16ZXJvLCBnbwotCWFoZWFkIGFuZCBkbyB0aGUgcmVsb2NhdGlvbi4KLQkoZWNvZmZfcmVmaGlfcmVsb2MpOiBEb24ndCB0byB0aGUgcmVsb2NhdGlvbiBoZXJlLCBqdXN0IHJlbWVtYmVyCi0Jd2hhdCBuZWVkcyB0byBiZSBkb25lLgotCShlY29mZl9yZWZsb19yZWxvYyk6IERvIHRoZSBSRUZISSByZWxvY2F0aW9uIGhlcmUuCi0KLVRodSBNYXIgIDQgMTQ6NDQ6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBBZGRlZCBCRkRfQVNTRVJUIGNhbGxzIHRvIGVuc3VyZQotCXJlbG9jcyBhcmUgcmVhc29uYWJsZS4KLQkqIGNvZmYtbXN5bS5jOiBFbGltaW5hdGVkIHVzZXMgb2YgREVGVU4uCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIE1hciAgMiAxNzo1Mjo1OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCShVbHRyaXggMi4yIHN1cHBvcnQgZnJvbSBNaWNoYWVsIFJlbmRlbGwgPG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2E+KQotCSogY29uZmlndXJlLmhvc3QgKHZheC0qLXVsdHJpeDIqKTogIEFkZCB0cmlwbGV0LgotCSogaG9zdHMvdmF4dWx0Mi5oOiAgTmV3IGZpbGUuCi0JKiBjb25maWcvdmF4dWx0Mi5taDogIE5ldyBmaWxlLgotCi0JKiBhb3V0eC5oIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBzdHJjaHIgYW5kIGZyaWVuZHMuCi0JKiBhcmNoaXZlLmMgKHN0cmluZy5oKTogIEluY2x1ZGUgZm9yIG1lbWNociBhbmQgZnJpZW5kcy4KLQkqIGVsZjMyLmMgKHN0cmluZy5oKTogIEluY2x1ZGUgZm9yIHN0cnJjaHIgYW5kIGZyaWVuZHMuCi0KLVNhdCBGZWIgMjcgMDA6NDQ6MjQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuYyAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogVW51c2VkOyBkZWxldGVkLgotCShNWV9zZXRfc2l6ZXMpOiBVc2Ugc3Vub3M0X3NldF9zaXplcy4KLQotCSogZWxmMzIuYzogUmVuYW1lZCBmcm9tIGVsZi5jLiAgU2V2ZXJhbCBDUFUtc3BlY2lmaWMgZnVuY3Rpb25zCi0JZGVsZXRlZCwgYXMgd2VsbCBhcyBlbGYtYmlnIGFuZCBlbGYtbGl0dGxlIHRhcmdldHMuCi0JKiBsaWJlbGYuaDogTmV3IGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywgZWxmMzItbTY4ay5jOiBOZXcKLQlmaWxlcywgbmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLyotZWxmLm10LCB0YXJnZXRzLmM6IEFkanVzdGVkLgotCi0JKiBpMzg2bGludXguYyAoVEFSR0VUTkFNRSk6IFVzZSBoeXBoZW5zIGluc3RlYWQgb2YgcGFyZW50aGVzZXMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QgbmVlZAotCXZhcmlhYmxlICJvbGRfc29mYXIiIGlmIGNvbXBpbGluZyBmb3IgaTk2MC4KLQotCSogcmVsb2MuYyAoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiBGaXJzdCBhcmd1bWVudCBpcyBub3cgYQotCWJmZCBwb2ludGVyLgotCSogbGliYmZkLmg6IFVwZGF0ZWQuCi0KLQkqIGllZWUuYyAoZXh0ZW4sIGVudmkpOiAic3RhdGljIiBiZWxvbmdzIGZpcnN0IGluIGRlY2xhcmF0aW9uLgotCi1GcmkgRmViIDI2IDE3OjM3OjM0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmM6IGFkZCBzdXBwb3J0IGZvciBzeW1ib2xzcmVjLCBzcmVjb3JkcyB3aXRoIHN5bWJvbHMgaW4KLQl0aGVtLgotCi1UaHUgRmViIDI1IDExOjQzOjMwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjYWNvcGhvbnkuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jOiAgY2FzdCBhbGwgYXJndW1lbnRzIG9mIGllZWVfd3JpdGVfYnl0ZSB0byBiZmRfYnl0ZQotCXRvIGF2b2lkIGxpbnQgY29tcGxhaW50cy4KLQotVGh1IEZlYiAyNSAwMjoxNTo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2VjdGlvbiAiLnNoc3RydGFiIiBzaG91bGQgYmUKLQl0eXBlIFNIVF9TVFJUQUIuICBEb24ndCBhbHRlciBmaWxlIG9mZnNldCBmb3Igc2VjdGlvbiAwLgotCShyZWxvY190eXBlX25hbWVzKTogTm93IGFuIGFycmF5IGluc3RlYWQgb2YgYSBtYWNyby4gIFN0aWxsIGluc2lkZQotCSIjaWYgMCIsIHNpbmNlIGl0J3MgdXNlZCBvbmx5IGluIGRlYnVnZ2luZyBjb2RlIGFsc28gaW4gIiNpZiAwIi4KLQkoc3RydWN0IGVsZl9yZWxvY19tYXBfZWx0LCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IE5ldyB0eXBlcy4KLQkoc29ydF9yZWxvY19tYXApOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX3JlbG9jX21hcCk6IE5ldyB2YXJpYWJsZS4KLQkoZWxmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIEZlYiAyMyAxMjoxNzoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkZWQgYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFuZAotCWJmZF9tYWtlX2RlYnVnX3N5bWJvbDsgdGhleSB3ZXJlIGFscmVhZHkgaW4gdGhlIHRhcmdldCBzdHJ1Y3R1cmUuCi0JKiBBZGp1c3RlZCBhbGwgdXNlcyBvZiBKVU1QX1RBQkxFLgotCSogY29mZmdlbi5jLCBsaWJjb2ZmLWluLmggKGNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogUmVuYW1lZAotCWZyb20gY29mZl9tYWtlX2RlYnVnX3N5bWJvbC4KLQkqIGxpYmNvZmYuaDogVXBkYXRlZCBhY2NvcmRpbmdseS4KLQotCSogTWlub3IgY2xlYW51cHMgcHJvdm9rZWQgYnkgZ2NjIHdhcm5pbmdzOgotCSogYW91dHguaCAoTkFNRShhb3V0LCByZWxvY190eXBlX2xvb2t1cCkpLAotCWNwdS1oODMwMC5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXApLAotCWNwdS16OGsuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkZWQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoZXMuCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgZG9fc2x1cnBfY29mZl9hcm1hcCksCi0JaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSksCi0JZWxmLmMgKGVsZl9tYWtlX3NlY3Rpb25zLCBlbGZfZmFrZV9zZWN0aW9ucywKLQllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKLQlSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMuCi0JKiBhcmNodXJlcy5jOiBSZW1vdmVkIC8qIGZyb20gd2l0aGluIGNvbW1lbnQuCi0JKiBib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogSW5pdGlhbGl6ZSByX2V4dGVybi4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX2RhdGEpOiBJbml0aWFsaXplIGkuCi0KLU1vbiBGZWIgMjIgMTg6NDA6MDYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaWJjb2ZmLmggKG9ial9yYXdfc3ltZW50X2NvdW4pOiAgTmV3IG1hY3JvLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6ICBJbml0aWFsaXplCi0JcmF3X3N5bWVudF9jb3VudC4KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6ICBOdW1lcm91cyBsaXR0bGUgZml4ZXMuCi0KLU1vbiBGZWIgMjIgMTU6MDM6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogc3RCbG9jayBzeW1ib2xzIGFyZSBhbHdheXMKLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQkoZWNvZmZfZ2V0X2RlYnVnKTogT2Zmc2V0IHRoZSBmZHIgYWRyIGJ5IHRoZSBhZHIgb2YgdGhlIGZpcnN0IHBkciwKLQlmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRvb2xzIGZyb20gTUlQUy4KLQotCSogY29uZmlnL2JpZ21pcHMubXQ6IE5ldyBmaWxlOyBkZWZhdWx0IHZlY3RvciBpcyBlY29mZl9iaWdfdmVjLgotCSogY29uZmlnL2lyaXgzLm10LCBjb25maWcvaXJpeDQubXQ6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lY29mZik6IE5ldyB0YXJnZXQ7IHVzZXMgYmlnbWlwcy5tdC4KLQkobWlwcy1zZ2ktKiwgbWlwcy1iaWctKik6IFVzZSBiaWdtaXBzIHJhdGhlciB0aGFuIGlyaXgzLgotCi1XZWQgRmViIDE3IDIzOjQwOjQxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBob3N0cy9ocDMwMGJzZC5oOiAgQWRkIGdyb3NzIGhhY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UKLQlhcmUgcnVubmluZyBvbiBCU0QgNC4zIG9yIEJTRCA0LjQsIGFuZCB1c2UgYXBwcm9wcmlhdGUgaW5jbHVkZQotCWZpbGVzIChhbmQgc2V0IG90aGVyIHBhcmFtZXRlcnMpIHRvIG1hdGNoLgotCi1XZWQgRmViIDE3IDEyOjI4OjEzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X21ha2VfZW1wdHlfc3ltYm9sKTogd3JhcCBQQVJBTVMgYXJvdW5kIGFuCi0JICBhbnNpIGRlZmluaXRpb24gd2hpY2ggb3RoZXJ3aXNlIGNvbmZ1c2VzIG5vbi1hbnNpIGNvbXBpbGVycy4KLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogZWxpbWluYXRlIGEgd2FybmluZyBmcm9tIHZheAotCSAgdWx0cml4IGNjIGJ5IGZvcndhcmQgZGVjbGFyaW5nIGdldGVudiBhcyBpcyBkb25lIGluCi0JICBiZmRfZmluZF90YXJnZXQuCi0KLVR1ZSBGZWIgMTYgMTc6NTY6NTggMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfaW5mb190b19ob3d0byk6IGNhc3QgYW4gZW51bSBpbnRvIHVuc2lnbmVkIGNoYXIKLQkgIGF2b2lkaW5nIGEgZmF0YWwgZXJyb3IgaW4gdmF4IHVsdHJpeCA0LjIgY2MuCi0KLVR1ZSBGZWIgMTYgMDA6NDQ6NTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oLCBWRVJTSU9OOiAgUm9sbCB0byB2ZXJzaW9uIDIuMS4KLQotTW9uIEZlYiAxNSAyMDo0Mzo1MSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIExpbnQuCi0JKiBzcmVjLmM6ICBXaGl0ZXNwYWNlIGNsZWFudXAuCi0KLUZyaSBGZWIgMTIgMTQ6MjM6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogUHJpbnQgY29ycmVjdCB0YWduZHggdmFsdWU7Ci0JY2xlYW5lZCB1cCBvdXRwdXQgZm9ybWF0dGluZyBhIGJpdC4KLQotRnJpIEZlYiAxMiAwODoyODo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiAqRklYTUUqIHRoZSBIOC8zMDAgaXMgYWx3YXlzCi0JcmVsYXhhYmxlLiAgU2hvdWxkIGJlIG1vdmVkIHNvbWV3aGVyZSBlbHNlLgotCi1UaHUgRmViIDExIDE0OjA5OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dC1taXBzYnNkLmM6IEVsaW1pbmF0ZWQgdXNlcyBvZiBERUZVTi4KLQkoYW91dF9taXBzXypfdmVjKTogQWRkZWQgc2VjbGV0X2xpbmsgZWxlbWVudC4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9CQUNLRU5EUywgQ0ZJTEVTLCBhb3V0LW1pcHNic2Qubyk6IEFkZGVkCi0Jc3VwcG9ydCBmb3IgYW91dC1taXBzYnNkIHRhcmdldC4KLQotCSogYm91dC5jIChnZXRfdmFsdWUpOiBEb24ndCB0cnVuY2F0ZSAzMi1iaXQgYWRkZW5kIHRvIDE2IGJpdHMuCi0KLUZyaSBGZWIgIDUgMDg6MDg6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODUwMC5jIChzY2FuX21hY2gpOiByZXR1cm4gZmFsc2UgaWYgaXQncyBub3QgYW4gSDgvNTAwCi0KLVRodSBGZWIgIDQgMTI6NTI6NDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgdGhlIEg4LzUwMAotCi0JKiBjb2ZmLWg4NTAwLmMsIGNwdS1oODUwMC5jLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCB0YXJnZXRzLmMKLQotVGh1IEZlYiAgNCAxMjozNTowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYmVjb2ZmLmg6IE5ldyBmaWxlLiAgRGVmaW5lcyBFQ09GRiBiYWNrZW5kIGRhdGEgZm9yIGdkYi4KLQkqIGNvZmYtbWlwcy5jOiBOb3cgaW5jbHVkZXMgbGliZWNvZmYuaC4KLQkoZWNvZmZfZGF0YV90eXBlKTogTW92ZWQgdG8gbGliZWNvZmYuaC4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IE1hZGUgZ2xvYmFsbHkgdmlzaWJsZSBzbyB0aGF0IGdkYiBjYW4KLQljYWxsIGl0LiAgSWYgdGhlcmUgaXMgZXZlciBhbm90aGVyIEVDT0ZGIHRhcmdldCwgdGhpcyBhbmQgdGhlCi0Jc3dhcHBpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSBhY2Nlc3NlZCB2aWEgYW4gRUNPRkYgc3BlY2lmaWMgdGFyZ2V0Ci0JdmVjdG9yLgotCSogTWFrZWZpbGUuaW4gKGNvZmYtbWlwcy5vKTogRGVwZW5kcyBvbiBsaWJlY29mZi5oLgotCi1XZWQgRmViICAzIDA5OjE0OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIGluZm9ybWF0aW9uLCBzaW5jZSBjb2ZmLW1pcHMuYwotCW5vIGxvbmdlciBpbmNsdWRlcyB0aGlzIGZpbGUuCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX2Zkcl9pbiwgZWNvZmZfc3dhcF9leHRfaW4pOiBTZXQgcmVzZXJ2ZWQKLQliaXRzIHRvIDAgdG8gbWFrZSBjb21wYXJpc29uIHRlc3QgdXNlZnVsLgotCi0JKiBjb25maWcvaXJpeDMubWgsIGNvbmZpZy9pcml4NC5taCAoSERFRklORVMpOiBTZXQgdG8gLUcgNCB0bwotCWF2b2lkIG92ZXJmbG93aW5nIEdQIGFjY2Vzc2libGUgc2VjdGlvbnMgaW4gYmludXRpbHMvb2JqZHVtcC4KLQotVHVlIEZlYiAgMiAxNTozNjo1NSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiAgTWFkZSBzeW1ib2wKLQlyZWFkaW5nIG1vcmUgcm9idXN0OiAgRmFpbCBpZiBzdHJpbmcgaW5kZXggaXMgb3V0IG9mIHN0cmluZwotCXRhYmxlIHJhbmdlLgotCi1UdWUgRmViICAyIDExOjQzOjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIGNhc2VzIFBDUkVMMjQgYW5kCi0JUENSRUwxMyk6IERvbid0IHRha2UgZHN0X2FkZHJlc3MgaW50byBhY2NvdW50OyB0aGUgaW5wdXQgZmlsZSBoYXMKLQlhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhhdC4KLQotVHVlIEZlYiAgMiAxMTo0MTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jOiBDb21wbGV0ZWQgc3VwcG9ydCBmb3IgbGlua2VyIGFuZCBiaW51dGlscy4KLQotTW9uIEZlYiAgMSAxNDo0NTozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlIEFCUzMyKTogS2VlcAotCW9yaWdpbmFsIGFkZGVuZCBmcm9tIHNlY3Rpb24gY29udGVudHMuCi0KLVRodSBKYW4gMjggMjE6MDE6MzcgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlGaXggbWlub3IgYnVncyByZXBvcnRlZCBieSBDYXJsIEdyZWNvLCA8Y2dyZWNvQHBhcnJvdC5jcmVpZ2h0b24uZWR1PjoKLQkqIGhvc3RzL2RlbHRhODguaCAoc3RydG9sKTogIEZpeCBwcm90b3R5cGUuCi0JKiBjb25maWcvbTg4ay1jb2ZmLm10IChTRUxFQ1RfQVJDSElURUNUVVJFUyk6ICBGaXggbmFtZS4KLQotV2VkIEphbiAyNyAxNzoxNjo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiBHZXQgcmlkIG9mICIjaWZkZWYgc3BhcmMiLgotCShSRUxPQ19UWVBFX05BTUVTKTogTmV2ZXIgdXNlZCAoY3VycmVudGx5KSwgc28gZG9uJ3QgaW5jbHVkZSBpdC4KLQkoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogUmVuYW1lZCBmcm9tIGVsZl9ob3d0b190YWJsZSwgYW5kIGFsd2F5cwotCXVzZWQuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogVXNlIHJ1bnRpbWUgY29uZGl0aW9uYWxzIG9uIENQVSB0eXBlLCBub3QKLQljb21waWxlIHR5cGUgY29uZGl0aW9uYWxzIG9uIGhvc3QgQ1BVLgotCShlbGZfbGl0dGxlX3ZlYywgZWxmX2JpZ192ZWMpOiBVc2UgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAsCi0Jbm90IG51bGwgcG9pbnRlci4KLQkocmVsb2NfdHlwZSwgUkVMT0NfVFlQRV9OQU1FUyk6IEluY2x1ZGUgaTM4NiB2YWx1ZXMuCi0KLVR1ZSBKYW4gMjYgMTE6NDM6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNFQ19JU19DT01NT04pOiBOZXcgc2VjdGlvbiBmbGFnLCBuZWVkZWQgZm9yIE1JUFMKLQlFQ09GRiB3aGljaCBoYXMgdHdvIGNvbW1vbiBzZWN0aW9ucy4KLQkoYmZkX2NvbV9zZWN0aW9uKTogU2V0IFNFQ19JU19DT01NT04gZmxhZy4KLQkqIGJmZC1pbi5oIChiZmRfaXNfY29tX3NlY3Rpb24pOiBOZXcgbWFjcm8gdG8gdGVzdCBTRUNfSVNfQ09NTU9OLgotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBib3V0LmMsIGNvZmYtYTI5ay5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLW1pcHMuYywgY29mZmdlbi5jLCBpZWVlLmMsIG9hc3lzLmMsIHJlbG9jLmMsIHN5bXMuOiBVc2UKLQliZmRfaXNfY29tX3NlY3Rpb24gbWFjcm8gcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIGVxdWFsaXR5IHRvCi0JYmZkX2NvbV9zZWN0aW9uLgotCi1Nb24gSmFuIDI1IDE1OjI3OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoX2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spOiBQYXNzIGFvdXRoZHIgYXJndW1lbnQuCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IEFjY2VwdCBhb3V0aGRyIGFyZ3VtZW50LgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBQYXNzIGFvdXRoZHIgdG8gbWtvYmplY3RfaG9vay4KLQlIYW5kbGUgTlVMTCBhb3V0aGRyIGFyZ3VtZW50LgotCShjb2ZmX29iamVjdF9wKTogSWYgdGhlcmUgaXMgbm8gYW91dGhkciwgcGFzcyBpdCBhcyBOVUxMIHRvCi0JY29mZl9yZWFsX29iamVjdF9wLgotCSogbGliY29mZi5oOiBSZWJ1aWx0IGZvciBta29iamVjdF9ob29rIGNoYW5nZXMuCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luLCBjb2ZmX3N3YXBfYW91dGhkcl9pbik6IFN3YXAKLQlhZGRpdGlvbmFsIE1JUFMgRUNPRkYgZmllbGRzLgotCi1TYXQgSmFuIDIzIDE4OjM2OjIwIFBTVCAxOTkzICBSYWxwaCBDYW1wYmVsbCAgKHJhbHBoY0BweXJhbWlkLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IGFkZGVkIG1pcHMtZGVjLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgbWlwcy1kZWMtYnNkKgotCSogYW91dC1taXBzYnNkLmM6IG5ldyBmaWxlIGZvciBtaXBzLWRlYy1ic2QqCi0JKiBhb3V0LXRhcmdldC5oOiBkb24ndCBkZWZpbmUgJycgaWYgJ01ZX0JGRF9UQVJHRVQnIGlzIGRlZmluZWQuCi0JKiBhb3V0eC5oOiBhZGRlZCBtaXBzIHN1cHBvcnQuCi0JKiBhcmNodXJlcy5jOiBhZGRlZCBtaXBzIHN1cHBvcnQgdG8gYmZkX2RlZmF1bHRfc2NhbigpLgotCSogY3B1LW1pcHMuYzogYWRkZWQgc3VwcG9ydCBmb3IgUjQwMDAgKHVudGVzdGVkKS4KLQkqIGxpYmFvdXQuaDogYWRkZWQgTUlQUzEgJiBNSVBTMiBtYWdpYyBudW1iZXJzLgotCSogcmVsb2MuYzogZml4IHR5cG8ncyBpbiBjb21tZW50cy4gQWRkZWQgQkZEX1JFTE9DIGVudHJpZXMgd2hpY2ggSQotCQlob3BlIHdpbGwgbWFrZSBpdCBpbnRvIGluY2x1ZGUvYmZkLmguCi0JKiB0YXJnZXRzLmM6IGFkZGVkIGFvdXRfbWlwc18qX3ZlYy4KLQotV2VkIEphbiAyMCAxNzoxNTo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWNzdGF0aW9uLm10OiBTZXQgREVGQVVMVF9WRUNUT1IgdG8gZWNvZmZfbGl0dGxlX3ZlYy4KLQotVHVlIEphbiAxOSAwOTowNjoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfYXN5bWJvbF92YWx1ZSk6IEFkZCBuZWVkZWQgcGFyZW50aGVzZXMuCi0KLQkqIGxpYmNvZmYtaW4uaDogVXBkYXRlIHByb3RvdHlwZSBmb3IgY29mZl9jb3VudF9saW5lbnVtYmVycy4KLQotRnJpIEphbiAxNSAxODoxMzoxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX2hkcl9vdXQsIGVjb2ZmX3N3YXBfZmRyX291dCwKLQllY29mZl9zd2FwX3Bkcl9vdXQsIGVjb2ZmX3N3YXBfc3ltX291dCwgZWNvZmZfc3dhcF9leHRfb3V0LAotCWVjb2ZmX3N3YXBfcm5keF9vdXQsIGVjb2ZmX3N3YXBfcmZkX291dCwgZWNvZmZfc3dhcF9vcHRfaW4sCi0JZWNvZmZfc3dhcF9vcHRfb3V0LCBlY29mZl9zd2FwX2Rucl9pbiwgZWNvZmZfc3dhcF9kbnJfb3V0KTogTmV3Ci0JZnVuY3Rpb25zLgotCSogY29mZnN3YXAuaDogSWYgTk9fQ09GRl9SRUxPQ1MgaXMgZGVmaW5lZCwgZG9uJ3QgZGVmaW5lCi0JYmZkX3N3YXBfcmVsb2NfaW4gb3IgY29mZl9zd2FwX3JlbG9jX291dC4KLQkqIGNvZmYtbWlwcy5jOiBBZGRlZCBjb2RlIHRvIGxpbmsgYW5kIHdyaXRlIG91dCBzeW1ib2xpYyBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiwgYW5kIHRvIHN3YXAgcmVsb2NzIGluIGFuZCBvdXQuCi0KLVRodSBKYW4gMTQgMTU6NTE6NTggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxpYmNvZmYuaCwgY29mZmdlbi5jIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKSwgY29mZmNvZGUuaAotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IGNvZmZfY291bnRfbGluZW51bWJlcnMgcmV0dXJucyB0aGUKLQludW1iZXIgb2YgbGluZSBudW1iZXIgcmVjb3JkcyBpdCBmb3VuZC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogb25seSB3cml0ZSBvdXQgbGluZSBudW1iZXJzCi0JaW4gdGhlIHNlY3Rpb24gdGhleSBiZWxvbmcgdG8uCi0KLU1vbiBKYW4gMTEgMTg6MzI6MjIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGRlZCByZWxvY2F0ZWFibGUgYXJndW1lbnQgdG8KLQlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4gIEFkZGVkIF9iZmRfc2VjbGV0X2xpbmsKLQl0YXJnZXQgdmVjdG9yIGZvciBsaW5rZXIgdXNlLgotCSogYmZkLmMgKGJmZF9zZWNsZXRfbGluayk6IE5ldyBtYWNyby4KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkZWQgX2JmZF9zZWNsZXRfbGluay4KLQkqIHNlY2xldC5jIChyZWwsIHNlY2xldF9kdW1wX3NlY2xldCk6IEFkZGVkIHJlbG9jYXRlYWJsZSBhcmd1bWVudAotCWFuZCBib29sZWFuIHJldHVybiB2YWx1ZS4gIE1hZGUgc3RhdGljLgotCShiZmRfZ2VuZXJpY19zZWNsZXRfbGluayk6IFJlbmFtZWQgZnJvbSBzZWNsZXRfZHVtcC4gIEFkZGVkCi0JcmVsb2NhdGVhYmxlIGFyZ3VtZW50LgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkZWQKLQlyZWxvY2F0ZWFibGUgYXJndW1lbnQgKGlmIHJlbG9jYXRlYWJsZSwgc2F2ZXMgcmVsb2NzKS4KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSwKLQlyZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkZWQKLQlyZWxvY2F0ZWFibGUgYXJndW1lbnQgKGlmIHJlbG9jYXRlYWJsZSwganVzdCBjYWxscwotCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cykuCi0JKiBsaWJjb2ZmLWluLmggKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogQWRkZWQgcmVsb2NhdGVhYmxlCi0JYXJndW1lbnQgdG8gcHJvdG90eXBlLgotCSogQWxsIHRhcmdldHM6IFNldCBuZXcgX2JmZF9zZWNsZXRfbGluayB2ZWN0b3IgdG8KLQliZmRfZ2VuZXJpY19zZWNsZXRfbGluay4KLQotU2F0IEphbiAgOSAyMToyOTozMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmM6ICAjaW5jbHVkZSBzZWNsZXQuaC4KLQotU2F0IEphbiAgOSAxOTo0ODoxNCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfb2JqZWN0X3NldHVwKTogIEdldCByaWQgb2YgYWxsIGtub3dsZWRnZSBvZiBzdGFicwotCWRlYnVnIGluZm8uICBTZXR1cCBpbmZvIGFib3V0IGxpbmtlciBzeW1ib2xzIG9ubHksIGFuZCB1c2UKLQlzdGFuZGFyZCBiZmQgZmllbGRzIHRvIGhvbGQgdGhlIGluZm8uCi0JKiAoaHBwYV9vYmplY3RfcCk6ICBSZW1vdmUgdW5uZWVkZWQgZGVjbHMuCi0JKiAoaHBwYV9uZXdfc2VjdGlvbl9ob29rKTogIEdldCByaWQgb2YgbW9zdCBvZiB0aGlzLgotCSogbGliaHBwYS5oIChzdHJ1Y3QgaHBwYWRhdGEpOiAgUmVtb3ZlIHRlbiBwb3VuZHMgb2YgdXNlbGVzcyB1Z2x5Ci0JZmF0LiAgUmVtb3ZlIGFsbCBrbm93bGVkZ2Ugb2Ygc3RhYnMsIHJlbW92ZSByZWR1bmRhbnQga25vd2xlZGdlIG9mCi0JbGlua2VyIHN5bWJvbHMuCi0JKiBSZW1vdmUgbWFjcm9zIGZvciBhY2Nlc3NpbmcgZmllbGRzIHdoaWNoIGFyZSBub3cgZ29uZS4KLQotRnJpIEphbiAgOCAxNToyMDowMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBhbGxvdyBTRUNfTkVWRVJfTE9BRCB0byB0dXJuIG9uCi0JU1RZUF9OT0xPQUQgYml0LgotCSogY29mZi16OGsuYzogZGVsZXRlIHVudXNlZCByZWxvYyBmdW5jdGlvbnMKLQotRnJpIEphbiAgOCAxNTo0Nzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZGVkIGVjb2ZmX3RkYXRhIHRvIHRkYXRhIHVuaW9uLgotCSogdGFyZ2V0cy5jIChlbnVtIHRhcmdldF9mbGF2b3VyKTogQWRkZWQgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLgotCSogY29mZi1tc3ltLmM6IFVzZSBERUZVTiBmb3IgZnVuY3Rpb24gZGVmaW5pdG9ucy4KLQkqIGNvZmYtbWlwcy5jOiBBZGRlZCBjb2RlIHRvIHJlYWQgYW5kIHByaW50IHN5bWJvbHMsIGFuZCB0byBmaW5kCi0JbGluZSBudW1iZXJzLgotCi0JKiBjb2ZmY29kZS5oOiBNb3ZlZCBtYW55IGdlbmVyaWMgZnVuY3Rpb25zIGludG8gY29mZmdlbi5jLiAgTW92ZWQKLQlzd2FwcGluZyBmdW5jdGlvbnMgaW50byBjb2Zmc3dhcC5oIGZvciBFQ09GRiB1c2UuICBNb3ZlZAotCXJlbG9jYXRpb24gZnVuY3Rpb25zLCBvbmx5IHVzZWQgYnkgaDgzMDAgYW5kIHo4aywgaW50byByZWxvYzE2LmMuCi0JQWRkZWQgaG9va3MgZm9yIGNvZmZnZW4uYyBmdW5jdGlvbnMgdG8gYmFja2VuZCBkYXRhIHN0cnVjdHVyZSwgYW5kCi0JYWRkZWQgaG9vayBmdW5jdGlvbnMuICBTdGlsbCBtb3JlIGNvdWxkIGJlIGRvbmUuCi0JKiBjb2Zmc3dhcC5oOiBOZXcgZmlsZSB0byBob2xkIENPRkYgc3dhcHBpbmcgcm91dGluZXMuCi0JKiBjb2ZmZ2VuLmM6IE5ldyBmaWxlIHRvIGhvbGQgZ2VuZXJpYyBDT0ZGIGZ1bmN0aW9ucy4KLQkqIHJlbG9jMTYuYzogTmV3IGZpbGUgdG8gaG9sZCBoODMwMCBhbmQgejhrIHNwZWNpZmljIHJlbG9jYXRpb24KLQlmdW5jdGlvbnMuCi0JKiBsaWJjb2ZmLWluLmg6IEFkZGVkIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGluIGNvZmZnZW4uYy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdCB0byBpbmNvcnBvcmF0ZSBjaGFuZ2VzLgotCSogY29mZi1oODMwMC5jOiBGdW5jdGlvbiBuYW1lIGNoYW5nZXMuCi0JKiBjb2ZmLXo4ay5jOiBGdW5jdGlvbiBuYW1lIGNoYW5nZXMuICBVc2UgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0JaG9vayByYXRoZXIgdGhhbiBkZWZpbmluZyBFWFRSQV9DQVNFUy4KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBuZXcgZmlsZXMgY29mZmdlbiBhbmQgcmVsb2MxNi4gIEFkZGVkCi0JZGVwZW5kZW5jaWVzIG9mIGNvZmYtKi5vIG9uIGNvZmZzd2FwLmggYW5kIHNlY2xldC5oLgotCi1UaHUgSmFuICA3IDE2OjE2OjI2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbnMpOiAgQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZwotCWFib3V0IGRpc2NhcmRpbmcgY29uc3QuCi0KLVdlZCBKYW4gIDYgMDA6MTY6NDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMsIHNlY2xldC5jLCBlbGYuYyB1c2UgYmZkX3htYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MKLQotVHVlIEphbiAgNSAwOTozNTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG9zdC10YXJnZXQpOiBJZiAtLXdpdGgtbWluaW1hbC1iZmQgaXMgc3BlY2lmaWVkLAotCXNldCBNSU5JTUlaRT0xLgotCi1Nb24gSmFuICA0IDA3OjIwOjAxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3Jkcyk6IG9uZSBvZiBteSBib2FyZHMgd2FudHMgYSBDUiBiZXR3ZWVuCi0JcmVjb3Jkcy4KLQotV2VkIERlYyAzMCAxMjo0NjozMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6IHNldCBzeW1kZWZfY291bnQgY29ycmVjdGx5Ci0JKGl0IGJyb2tlIGEgY291cGxlIG9mIHdlZWtzIGFnbykuCi0KLVR1ZSBEZWMgMjkgMjE6NDE6MDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBTd2l0Y2ggYmFjayB0byAic3RydWN0IC4uLiIgZm9yCi0JcmV0dXJuIHR5cGUsIHNvIGxpYmJmZC5oIGRvZXNuJ3QgcmVmZXJlbmNlIHVuZGVmaW5lZCB0eXBlZGVmbmFtZXMuCi0KLVR1ZSBEZWMgMjkgMTM6NTQ6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiB1c2UgbmFtZSBJMzg2QUlYTUFHSUMgcmF0aGVyCi0JdGhhbiBJMzg2U1ZNQUdJQy4KLQkoY29mZl9wb2ludGVyaXplX2F1eCk6IGRvbid0IHBvaW50ZXJpemUgYSBuZWdhdGl2ZSB0YWduZHgKLQkoc29tZXRpbWVzIGdlbmVyYXRlZCBieSBTQ08gMy4ydjQgY2MpLgotCi0JKiBib3V0LmMgKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2ssCi0JYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogd2FybiBpZiByZWxvY2F0aW5nIGFnYWluc3QKLQlhbiB1bmRlZmluZWQgc3ltYm9sLgotCi1Nb24gRGVjIDI4IDE0OjMwOjU1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogIEdldCByaWQgb2YgREVGVU4sIHVzZSBtb3JlIGNvbnZlbnRpb25hbCBwcm9sb2cgc3R1ZmYuCi0JTWFrZSBhIGJ1bmNoIG1vcmUgcm91dGluZXMgYmUgc3RhdGljLgotCSogaHBwYS5jIChmaWxsX3NwYWNlcyk6ICBHZXQgcmlkIG9mIHRoaXMsIHJlcGxhY2Ugd2l0aCBtdWNoIGJldHRlcgotCXdyaXR0ZW4gc2V0dXBfc2VjdGlvbnMoKS4KLQkqIChzZXR1cF9zZWN0aW9ucyk6ICBOZXcgcm91dGluZSB0byBjcmVhdGUgQkZEIHNlY3Rpb25zIGZvciBlYWNoCi0Jc3BhY2UgYW5kIHN1YnNwYWNlIGluIFNPTSBmaWxlcy4KLQkqIChocHBhX29iamVjdF9zZXR1cCk6ICBVc2UgQkZEIHNlY3Rpb25zIGNyZWF0ZWQgYnkKLQlzZXR1cF9zZWN0aW9ucygpIHRvIGxvY2F0ZSBHREIgc3ltYm9sIHRhYmxlIGluZm8uCi0JKiAobWFrZV91bmlxdWVfc2VjdGlvbik6ICBOZXcgcm91dGluZSB0byBjcmVhdGUgYSBCRkQgc2VjdGlvbi4gIEl0Ci0JZW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBuYW1lIGlzIHVuaXF1ZSwgYW5kIHdpbGwgZ2VuZXJhdGUgYSB1bmlxdWUKLQlvbmUgaWYgbmVjZXNzYXJ5LgotCSogKGhwcGFfb2JqZWN0X3ApOiAgQmVjb21lIG11Y2ggbW9yZSBwYXJhbm9pZCBhYm91dCBmaWxlIGhlYWRlci4KLQkqIChtYWtlX2JmZF9hc2VjdGlvbik6ICBDYWxsIGJmZF9tYWtlX3NlY3Rpb24gdG8gZG8gdGhlIGRpcnR5Ci0Jd29yay4gIFNpbXBsaWZ5IGNvZGUgc29tZXdoYXQuCi0JKiAoaHBwYV9jb3JlX2ZpbGVfcCk6ICBVc2UgcHJvcGVyIG5hbWUgZm9yIHN0YWNrIHNlY3Rpb24uCi0JKiBsaWJocHBhLmg6ICBSZW1vdmUgbWlsbGljb2RlX3N0YXJ0LCBtaWxsaWNvZGVfZW5kIGRlY2xzLgotCi1Nb24gRGVjIDI4IDExOjAzOjIyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29mZi13ZTMyay5vLCBjb2ZmLXo4ay5vKTogTm90ZSBkZXBlbmRlbmNpZXMuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBGb3Igbm9ybWFsIDItIG9yIDQtYnl0ZQotCXJlbG9jcywgZG9uJ3QgYm90aGVyIGRvaW5nIHRoZSBhZGp1c3RtZW50IGlmIHRoZSB2YWx1ZSB0byBhZGQgaXMKLQl6ZXJvLgotCi1TdW4gRGVjIDI3IDE3OjQ1OjA1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9zaXplKTogIE5ldyBmdW5jdGlvbiB0aGF0IGdldHMgYW4gdXBwZXIgYm91bmQKLQlvbiB0aGUgcG9zc2libGUgc2l6ZSBvZiBhbnkgb2JqZWN0IGluIGEgYmZkLgotCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uLCBlbGZfZ2V0X3N0cl9zZWN0aW9uLAotCWVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogIFJld3JpdGUgdG8gYXZvaWQgTlVMTCBwb2ludGVyCi0JZGVyZWZlcmVuY2VzLgotCSogZWxmLmMgKGVsZl9iaWdfdmVjLCBlbGZfbGl0dGxlX3ZlYyk6ICBEb2N1bWVudCBsYXN0IHRocmVlCi0JbWVtYmVycyBpbml0aWFsaXplZCB0byBOVUxMLgotCi1UaHUgRGVjIDI0IDE3OjQ5OjA5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiBjaGFuZ2UgYSAnY29uc3QnIHRvICdDT05TVCcsIG9yIGVsc2UgSFAgQyBjb21waWxlciBkaWVzCi0KLU1vbiBEZWMgMjEgMTY6MzM6MzQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiAgTmV3IGZpbGUuICBBdHRlbXB0IGF0IGEgZ2VuZXJpYy9kZWZhdWx0Ci0Jc2V0IG9mIGRlZmluaXRpb25zLCB0byBkaXNjb3VyYWdlIHBvcnRpbmcgdG8gbmV3IGhvc3RzIGJ5IGNvcHlpbmcuCi0JKiBob3N0cy9uZXdzLmg6ICBSZW1vdmVkLgotCSogaG9zdHMvc3BhcmMuaDogIFVzZSBzdGQtaG9zdC5oLgotCSogYmZkLWluLmg6ICBOZXcgbWFjcm9zIGJmZF9hc3ltYm9sX2JmZCBhbmQgYmZkX2FzeW1ib2xfZmxhdm91cjsKLQlwZXJoYXBzIHdlIGNhbiBsYXRlciByZW1vdmUgdGhlIHRoZV9iZmQgZmllbGQgZnJvbSBlYWNoIHN5bWJvbC4KLQkqIHN5bXMuYyAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSk6ICBSZW1vdmUgdW51c2VkIGZpZWxkCi0JYXBwX2RhdGEuICBBZGQgY29tbWVudCBub3RpbmcgdGhhdCB0aGVfYmZkIGlzIGFsbW9zdCByZWR1bmRhbnQsCi0JYnV0IG5vdCBxdWl0ZS4KLQkqIGFvdXR4LmgsIGNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmZjb2RlLmg6Ci0JVXNlIG5ldyBtYWNyb3MgYmZkX2FzeW1ib2xfYmZkIGFuZCBiZmRfYXN5bWJvbF9mbGF2b3VyLgotCSogaHBwYS5jIChmaWxsX3NwYWNlcyk6ICBNYWtlIHNsaWdodGx5IG1vcmUgcmVidXN0LgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlICJkZWZhdWx0IiBob3N0LgotCi1Nb24gRGVjIDIxIDE3OjI0OjEzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgQWRkIHN0cnVjdCBocHBhX2NvcmVfZGF0YSB0byB0ZGF0YSB1bmlvbi4KLQkqIGhwcGEuYzogIENvbmRpdGlvbmFsaXplIG9uIEhPU1RfSFBQQUhQVVggaW5zdGVhZCBvZiBocDkwMDBzODAwLgotCUdldCByaWQgb2YgSFBQQS9CU0Qgc3BlY2lmaWMgY29kZS4gIFRoYXQgd2lsbCBnbyBzb21ld2hlcmUgZWxzZQotCXNvbWVkYXkuCi0JKiAoZmlsbF9zcGFjZXMpOiAgRG9uJ3Qgc3BpbiBmb3JldmVyIGFuZCBkaWUgaWYgeW91IGRvbid0IGZpbmQKLQkkTUlMTElDT0RFJCBzdWJzcGFjZS4KLQkqIChocHBhX29iamVjdF9wKTogIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSByZWFsIGhvbmVzdC10by1jdGh1bHUKLQlleGVjIGZpbGUhCi0JKiAoaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwsIGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6Ci0JTWFrZSB0aGVzZSB3b3JrIGZvciBIUFVYLgotCSogKG1ha2VfYmZkX2FzZWN0aW9uKTogIE5ldyByb3V0aW5lIHRvIG1ha2Ugc2VjdGlvbiBjcmVhdGlvbiBhCi0JbGl0dGxlIGVhc2llci4KLQkqIChocHBhX2NvcmVfZmlsZV9wKTogIENvbXBsZXRlbHkgcmV3cml0ZSwgbGVhdmUgb3V0IGJ1Z3MuCi0JKiBsaWJocHBhLmg6ICAjaW5jbHVkZSB0aGUgcmlnaHQgc3lzdGVtIGZpbGVzLiAgUmVkZWZpbmUgYWxsIG9mCi0JdGhlIHN0cnVjdHMvbWFjcm9zIGZvciBoYWNraW5nIGNvcmUgZmlsZXMgdG8gdXNlIG1vcmUgc2Vuc2libGUKLQlIUFVYIGNvcmUgZmlsZSBzdHJ1Y3R1cmVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIENvbmRpdGlvbmFsaXplIGhwcGFfdmVjIG9uCi0JSE9TVF9IUFBBSFBVWCwgbm90IGhwOTAwMHM4MDAuCi0JKiBob3N0cy9ocHBhaHB1eC5oOiAgI2luY2x1ZGUgc3RkbGliLmggdG8gZ2V0IGNvcnJlY3QgZGVjbHMgZm9yCi0JbWFsbG9jIGFuZCByZWFsbG9jLiAgI2RlZmluZSBIT1NUX0hQUEFIUFVYLgotCi1Nb24gRGVjIDIxIDEyOjQwOjEwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogUGF0Y2hlcyBmcm9tIE1pbmggVHJhbi1sZSA8bXRyYW5sZUBwYXJpcy5pbnRlbGxpY29ycC5jb20+LgotCSogY29uZmlndXJlLmluIChpMzg2LSotaXNjKiwgaTM4Ni0qLWFpeCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpMzg2LSotaXNjKiwgaTM4Ni0qLWFpeCopOiBOZXcgaG9zdHMuCi0JKiBob3N0cy9pMzg2aXNjLmgsIGNvbmZpZy9pMzg2aXNjLm1oOiBOZXcgZmlsZXMgZm9yIEludGVyYWN0aXZlCi0JVW5peC4KLQkqIGhvc3RzL2kzODZhaXguaCwgY29uZmlnL2kzODZhaXgubWg6IE5ldyBmaWxlcyBmb3IgQUlYIG9uIFBTLzIuCi0JKiBhaXgzODYtY29yZS5jOiBOZXcgZmlsZSBmb3IgaGFuZGxpbmcgY29yZSBmaWxlcyBvbiBBSVggb24gUFMvMi4KLQkqIHRhcmdldHMuYzogaWYgQUlYMzg2X0NPUkUsIHVzZSBhaXgzODZfY29yZV92ZWMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBjaGVjayBmb3IgSTM4NlNWTUFHSUMgYXMgd2VsbAotCWFzIEkzODZNQUdJQy4KLQotRnJpIERlYyAxOCAxMDoyMDoyNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgZmxhZ3MgdG8gMCwgZml4aW5nCi0JMTkyNy4KLQotVGh1IERlYyAxNyAxOTozNTozMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdmkgdGFyZ2V0Ci0KLVRodSBEZWMgMTcgMDA6MzY6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgVXNlIHJpZ2h0IG5hbWUgZm9yIHRla2hleCB0ZGF0YSBzdHJ1Y3QuCi0JKiB0ZWtoZXguYzogIEluc2VydCBsZWFkaW5nX2NoYXIgKDApIGludG8gYmZkX3RhcmdldCBzdHJ1Y3QuICBTdHlsZS4KLQkqIGxpYmNvZmYuaDogIFVwZGF0ZWQgdG8gZ2V0IHNwYWNpbmcgY2hhbmdlIGZyb20gY29mZmNvZGUuaC4KLQkqIHRyYWQtY29yZS5jOiAgbGVhZGluZ19jaGFyIGlzIDAgKG5vIHN5bWJvbHMhKSwgbm90ICdfJy4KLQotVHVlIERlYyAxNSAxNTo0MDozMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApOiAgTmV3Ci0JZnVuY3Rpb25zLCB3aXRoIHRoZSAiZ3V0cyIgb2YgdGhlIG9sZCBiZmRfc2x1cnBfYnNkX2FybWFwCi0JYW5kIGJmZF9zbHVycF9jb2ZmX2FybWFwLCBidXQgYXNzdW1pbmcgd2UndmUgYWxyZWFkeSBjaGVja2VkCi0JaWYgdGhlIGFybWFwIGlzIHByZXNlbnQgb3Igbm90LgotCUFsc28sIHJld3JpdGUgYSBiaXQgdG8gYXZvaWQga2VlcGluZyBhcm91bmQgb2JzdGFjayBkYXRhCi0JdGhhdCB3ZSBkb24ndCBuZWVkLgotCSogYXJjaGl2ZS5jIChzbmFyZl9hcl9oZWFkZXIsIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6Ci0JVmFyaW91cyBmaXhlcyB0byBjb3JyZWN0bHkgaGFuZGxlIENPRkZfc3R5bGUgYXJjaGl2ZXMgbmFtZXMuCi0JKE5vdGUgdGhhdCBiZWNhdXNlIHRoZXNlIGhhdmUgYSB0cmFpbGluZyAnLycsIHRoZSBuYW1lcyBjYW4KLQloYXZlIGVtYmVkZGVkIHNwYWNlcy4pCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9hcm1hcCk6ICBOZXcgZnVuY3Rpb24sIHJlcGxhY2VzIG9sZAotCWJmZF9zbHVycF9ic2RfYXJtYXAgYW5kIGJmZF9zbHVycF9jb2ZmX2FybWFwLiAgUmVjb2duaXplcwotCV9laXRoZXJfIGZvcm1hdCwgYW5kIGNhbGxzIGRvX3NsdXJwX2JzZF9hcm1hcCBvcgotCWRvX3NsdXJwX2NvZmZfYXJtYXAgaWYgZWl0aGVyIGZvcm0gb2YgbWFwIGlzIHNlZW4uCi0JKiBsaWJiZmQtaW4uaDogIENoYW5nZWQgYmZkX3NsdXJwX2JzZF9hcm1hcCBhbmQKLQliZmRfc2x1cnBfY29mZl9hcm1hcCBpbnRvIG1hY3JvIHN5bm9ueW1zIGZvciBiZmRfc2x1cnBfYXJtYXAuCi0JKiBlbGYuYyAoZWxmX3NsdXJwX2FybWFwLCBlbGZfd3JpdGVfYXJtYXApOiAgRml4LgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogIFVzZSByYyBpbnN0ZWFkIG9mIG5vbi1zdGFuZGFyZCBxYy4KLQotTW9uIERlYyAxNCAxNzowODowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmM6ICAjaW5jbHVkZSAic3lzZGVwLmgiLCBub3QgPHN5c2RlcC5oPi4KLQkqIGxpYmhwcGEuaDogIE1ha2UgbWlsbGljb2RlX3N0YXJ0IGFuZCBtaWxsaWNvZGVfZW5kIGJlIHVuc2lnbmVkCi0JaW50IHRvIGJlIHNhbWUgdHlwZSBhcyBDT1JFX0FERFIgaW4gR0RCLiAgV2h5IGFyZSB0aGVzZSBoZXJlPwotCi1TYXQgRGVjIDEyIDE1OjU0OjM2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2LmMgKENBTENfQURERU5EKTogaWYgcmVsb2MgaXMgUEMgcmVsYXRpdmUsIGFkZCB0aGUKLQl2YWRkciBvZiB0aGUgc2VjdGlvbiB0byB0aGUgYWRkZW5kLgotCSogdGFyZ2V0cy5jOiBpZiBNSU5JTUlaRSBpcyAxLCBhbmQgU0NPX0NPUkUgaXMgZGVmaW5lZCwgYWRkCi0JU0NPX0NPUkUgdG8gU0VMRUNUX1ZFQ1MuCi0JKHRhcmdldF92ZWN0b3IpOiBhZGQgc2NvX2NvcmVfdmVjLgotCSogc2NvLWNvcmUuYyAoc2NvX2NvcmVfdmVjKTogYWRkIGxlYWRpbmcgdW5kZXJzY29yZSBpbml0aWFsaXplci4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNjbyopOiB1c2UgdGFyZ2V0IGkzODYtc2NvLgotCSogY29uZmlnL2kzODYtc2NvLm10OiBuZXcgZmlsZTsgZGVmaW5lIFNDT19DT1JFLgotCi1UaHUgRGVjIDEwIDAyOjEzOjE1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfb2JqZWN0X3ApOiAgRml4ICFzdHJjbXAgdGhpbmtvLgotCi1GcmkgRGVjICA0IDE0OjAyOjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBOb3cgc3RhdGljIGFuZCBjb25zdC4KLQotVGh1IERlYyAgMyAxNjo1NDo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZsaW51eC5oOiBJbmNsdWRlIHVuaXN0ZC5oLgotCi0JKiBhb3V0eC5oIChwcmludF9zeW1ib2wpOiBhb3V0X3N0YWJfbmFtZSByZXR1cm5zIGEgY29uc3RhbnQKLQlzdHJpbmcuCi0JKiBsaWJhb3V0LmggKGFvdXRfc3RhYl9uYW1lKTogRml4IHByb3RvdHlwZS4KLQkqIHN0YWItc3ltcy5jIChhb3V0X3N0YWJfbmFtZXMpOiBBcnJheSBpcyBub3cgY29uc3QuCi0JKGFvdXRfc3RhYl9uYW1lKTogUmV0dXJuIHZhbHVlIGlzIG5vdyBwb2ludGVyIHRvIGNvbnN0LgotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIGN0b3IuYywgcmVsb2MuYywKLQlzeW1zLmM6IERvYyBmaXhlcy4KLQotCSogc3ltcy5jIChhc3ltYm9sKTogQWRkZWQgbmV3IGZpZWxkICJhcHBfZGF0YSIsIGZvciBkYXRhCi0JcGFydGljdWxhciB0byB0aGUgYXBwbGljYXRpb24uICBTb21lIG9mIHRoZSBsaW5rZXIgZmxhZ3Mgb3VnaHQgdG8KLQlnZXQgbW92ZWQgdG8gdGhpcyBmaWVsZCBzb21lZGF5LgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogUmVjb2duaXplIGEgZmV3IG1vcmUgbnVtYmVyczoKLQk4MDQ4NiwgODA5NjAsIGFuZCA5NjAuCi0KLQkqIGJmZC1pbi5oIChDT0ZGX1NXQVBfVEFCTEUpOiBOZXcgaXMganVzdCBhZGRyZXNzIG9mCi0JYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUsIGNhc3QgdG8gUFRSLgotCSogYmZkLmMgKGJmZF9jb2ZmX3N3YXBfKik6IERlbGV0ZWQgbWFjcm9zLgotCSogdGFyZ2V0cy5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6IERlbGV0ZWQgQ09GRi1zcGVjaWZpYyBzd2FwcGluZwotCXJvdXRpbmUgcG9pbnRlcnMuCi0JKiBjb2ZmY29kZS5oICh0eXBlIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdHlwZSwKLQljb250YWlucyBwb2ludGVycyB0byB0aGUgQ09GRi1zcGVjaWZpYyBzd2FwcGluZyByb3V0aW5lcy4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBOZXcgZGF0YSBzdHJ1Y3R1cmUsIHRvIGJlIHVzZWQgd2hlbgotCU5PX0NPRkZfU1lNQk9MUyBhbmQgTk9fQ09GRl9MSU5FTk9TIGFyZSBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3dhcF8qKTogTmV3IG1hY3Jvcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2NvZmZfc3dhcF90YWJsZSk6IE5ldyBkYXRhIHN0cnVjdHVyZS4KLQkoZWNvZmZfYmlnX3ZlYyk6IFVzZSBpdC4KLQkqIEFsbCBDT0ZGIHRhcmdldHM6IE1vdmVkIENPRkZfU1dBUF9UQUJMRSB0byB0YXJnZXQtc3BlY2lmaWMgZGF0YS4KLQkqIEFsbCBvdGhlciB0YXJnZXRzOiBEZWxldGVkIGNvZmYtc3BlY2lmaWMgdmVjdG9yIGVudHJpZXMuCi0KLQkqIHRyYWQtY29yZS5jOiBGaXhlZCBzb21lIGBQQVJBTVMnIHVzZXMgdGhhdCB3ZXJlIG1pc3NpbmcKLQlwYXJlbnRoZXNlcy4KLQotU3VuIE5vdiAyOSAwODozNzoxMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIFByb3RlY3QgYXJnIHByb3RvdHlwZSBpbgotCWNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3Agd2l0aCBQQVJBTVMgbWFjcm8gZm9yIG5vbi1BTlNJIGNvbXBpbGVycy4KLQotU2F0IE5vdiAyOCAwNDowMToyMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgYW91dGYxLmgsIHRyYWQtY29yZS5jLCBjb2ZmY29kZS5oLCBsaWJhb3V0LmgsCi0JbGliYmZkLWluLmgsIGJmZC1pbi5oOiBFbGltaW5hdGUgYWxsIFBST1RPIGNhbGxzLCByZXBsYWNlIHdpdGgKLQlQQVJBTVMgZm9yIHJlYWRhYmlsaXR5LgotCi0JKiBhb3V0eC5oOiAgQWRkIHR5cGUgdG8gY2FsbGJhY2sgcGFyYW1ldGVyLgotCSogY29mZi1taXBzLmM6ICBEb24ndCBjYWxsIHRyYWQtY29yZS5oLCBub3QgbmVlZGVkLgotCSogdHJhZC1jb3JlLmM6ICBJbmNvcnBvcmF0ZSB0cmFkLWNvcmUuaCBkZWNsYXJhdGlvbnMuICBGaXggY29tbWVudHMuCi0JKiB0cmFkLWNvcmUuaDogIEVsaW1pbmF0ZSwgdW51c2VkLgotCi1XZWQgTm92IDE4IDEzOjE2OjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IGlmIGRlZmF1bHQgdGFyZ2V0IGlzbid0IGZvdW5kCi0JdGhlbiBsb29rIHRocm91Z2ggdGhlIGVudGlyZSBsaXN0IHJhdGhlciB0aGFuIHJldHVybiBlYXJseS4KLQotTW9uIE5vdiAxNiAxNDozMzowMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pOTYwLWNvZmYubXQ6IHJlb3JkZXIgdmVjIHRvIG1hdGNoIGJmZF9jaGVja19mb3JtYXQgKGZyb20gUGVyKQotCi1UaHUgTm92IDEyIDE3OjAxOjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGluIEZMQUdTX1RPX1BBU1MKLQotVGh1IE5vdiAxMiAwOTo0Njo0NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi16OGsuYzogY2hlY2twb2ludCwgbW9yZSBhZGRyZXNzaW5nIG1vZGVzIGhhbmRsZWQKLQkqIGNvZmZjb2RlLmggKGdldF92YWx1ZSk6IGRvbid0IHRydW5jYXRlIHJlbG9jLT5hZGRlbmQgZmllbGQsIGl0J3MKLQlhIGxvbmcgbm93LgotCi1XZWQgTm92IDExIDIzOjU3OjU1IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLm10IChUREVGQVVMVFMpOiBVc2Ugd2UzMmtjb2ZmX3ZlYywgbm90IGkzODZjb2ZmX3ZlYy4KLQotVHVlIE5vdiAxMCAxNDowNDozOCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtaW5vciB0d2Vha3MgdG8gbWFrZSAkKENDKSBjb21tYW5kIGxpbmVzIG1vcmUgY29uc2lzdGVudAotCi1Nb24gTm92ICA5IDIzOjU4OjE3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIsIGJmZF9jbG9zZSk6ICBBZGQgZG9jIGFib3V0IGNhY2hlaW5nCi0JYW5kIGFib3V0IHdoZW4gZmlsZSBkZXNjcmlwdG9ycyBhcmUgY2xvc2VkLgotCi1TYXQgTm92ICA3IDAwOjQyOjIwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IE1ha2Ugc3VyZSBhbGlnbm1lbnQgcmVsb2NzIGdldAotCXdyaXR0ZW4gb3V0IGNvcnJlY3RseS4KLQotVGh1IE5vdiAgNSAxNTozNDoxOSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYzogTmV3IHNlY3Rpb24gYml0IFNFQ19TSEFSRURfTElCUkFSWS4KLQljb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IGlmIFNUWVBfTk9MT0FEICYmIChTVFlQX1RFWFQgfHwKLQlTVFlQX0RBVEEpLCBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZLiAgVGhpcyBzZWVtcyB0byBiZSBjb3JyZWN0IGZvcgotCWkzODYtc3lzdi4KLQotVGh1IE5vdiAgNSAwNDo0MzowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0LmMgKHN0cnVjdCBiZmRfdGFyZ2V0KTogIEVsaW1pbmF0ZSB0aGUgU0RFRiBhbmQgU0RFRl9GTVQKLQltYWNyb3M7IHVzZSBQQVJBTVMgdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaW52b2x2ZWQuCi0KLQkqIGJmZC1pbi5oLCBiZmQuYywgbGliYmZkLmgsIHJlbG9jLmMsIHNlY2xldC5oLCBzZWN0aW9uLmMsCi0JdGFyZ2V0cy5jOiBSZW5hbWUgc3RydWN0IGJmZF9zZWNsZXRfc3RydWN0IHRvIHN0cnVjdCBiZmRfc2VjbGV0LgotCi1UaHUgTm92ICA1IDAyOjU5OjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW51cDogIFJlcGxhY2UgYWxsIHVzZXMgb2YgRVhGVU4gaW4gdGhlIEJGRCBzb3VyY2VzLCB3aXRoIFBBUkFNUy4KLQotCSogYXJjaHVyZXMuYywgcmVsb2MuYywgc2VjdGlvbi5jLCB0ZWtoZXguYzogIFVzZSBQQVJBTVMgaW4KLQlkZWNsYXJpbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLgotCSogY2FjaGUuYywgZWxmLmM6ICBNb3ZlIHN0YXRpYyBmdW5jdGlvbiBkZWNscyB0byB0b3AsIHVzZSBQQVJBTVMuCi0JKiBzZWNsZXQuaDogIERlY2xhcmUgZXh0ZXJuYWwgZnVuY3Rpb24gd2l0aCBQQVJBTVMuCi0KLQkqIGRvYy9jaGV3LmMgKGV4ZnVuc3R1ZmYpOiAgRWxpbWluYXRlLgotCShwYXJhbXN0dWZmKTogIFJlcGxhY2UgZXhmdW5zdHVmZiB3aXRoIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIFBBUkFNUy4KLQkqIGRvYy9wcm90by5zdHI6ICBVc2UgcGFyYW1zdHVmZiByYXRoZXIgdGhhbiBleGZ1bnN0dWZmLgotCi0JKiBsaWJiZmQuaDogIFVwZGF0ZSwgYmFzZWQgb24gY2hhbmdlcyBpbiBzb3VyY2UgY29kZSBhbmQgY2hldy4KLQotV2VkIE5vdiAgNCAyMjo0NzoyOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGliaWVlZS5oOiAgQWRkIEZJWE1FIGFib3V0IHJlbW92aW5nIGxpbWl0IG9uIG51bWJlciBvZiBzZWN0aW9ucy4KLQkqIGJmZC1pbi5oOiAgSW1wcm92ZSBjb21tZW50cyB0byBtYWtlIGl0IGNsZWFyIHRoYXQgYmZkLmggaXMKLQl0aGUgd3JvbmcgcGxhY2UgdG8gZWRpdCB0aGlzIGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6ICBJbnN0YWxsIGFuc2lkZWNsLmggYW5kIG9ic3RhY2suaCBpbiB0aGUKLQlzYW1lIHBsYWNlcyB3aGVyZSB3ZSBpbnN0YWxsIGJmZC5oLgotCi1XZWQgTm92ICA0IDEzOjQwOjIzIDE5OTIgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCwgY29mZl9zd2FwX2F1eF9pbik6ICBjaGVjayBmb3IKLQlzeW1ib2wgdHlwZSBiZWZvcmUgYmxpbmRseSBtb2RpZnlpbmcgdGhlIGF1eGVudC4gIFNwZWNpZmljYWxseSwKLQlvbmx5IG1vZGlmeSB0aGUgZW5kbmR4IGZpZWxkcyBmb3IgdHlwZXMgdGhhdCBuZWVkIGl0LCBhbmQgZG9uJ3QKLQlzZXQgdGhlIGFycmF5IGluZm9ybWF0aW9uIGZvciBub24tYXJyYXlzLgotCi1XZWQgTm92ICA0IDA5OjMwOjUwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBTZWN0aW9uIGxpc3Qgc2hvdWxkIGJlIHNldCB1cAotCWNvcnJlY3RseSBhbnl3YXlzOyBkb24ndCBoYXZlIHRvIHNldCB1cCAibmV4dCIgcG9pbnRlcnMgbWFudWFsbHkuCi0KLU1vbiBOb3YgIDIgMTI6MzY6MTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVsdGE4OC5taCwgY29uZmlnL2hwMzAwLm1oLCBjb25maWcvaHBwYWhwdXgubWgsCi0JY29uZmlnL2kzODZ2Lm1oOiByZW1vdmVkIC1EVVNHIGZyb20gSERFRklORVMuCi0JaG9zdHMvZGVsdGE4OC5oLCBob3N0cy9ocDMwMC5oLCBob3N0cy9ocHBhaHB1eC5oLCBob3N0cy9pMzg2di5oOgotCWRlZmluZWQgVVNFX1VUSU1FLgotCWhvc3RzL2kzODZ2Lmg6IGRvbid0IGRlZmluZSBQT1NJWF9VVElNRS4KLQotRnJpIE9jdCAzMCAxNjoxMzo1MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25zKTogbWFrZSBhIHByaXZhdGUgY29weSBvZiB0aGUKLQlzZWN0aW9uJ3MgbmFtZSBiZWZvcmUgdHJ1bmNhdGluZyBpdC4KLQotVGh1IE9jdCAyOSAwODozMDo1MCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiBhZGQgc3ltYm9sX2xlYWRpbmdfY2hhciBlbnRyeSBpbiB0cmFuc2ZlciB2ZWMKLQotLFdlZCBPY3QgMjggMTY6MTE6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoZ2V0X3N5bWJvbCk6IGNhbiBub3cgY29wZSB3aGVuIHR3byBzeW1ib2xzIG9mIGEKLQlkaWZmZXJlbnQgY2xhc3MsIGJ1dCB0aGUgc2FtZSBpbmRleCBudW1iZXIgb2NjdXIgY29uc2VjdXRpdmVseS4KLQkoZ2V0X3NlY3Rpb25fZW50cnkpOiBuaWNlciBuYW1lIGZvciBzZWN0aW9ucyBiZWluZyBmb3J3YXJkCi0JcmVmZXJlbmNlZC4gKGllZWVfYXJjaGl2ZV9wKTogZG9uJ3QgZnJlZSB0aGUgZmlsZW5hbWUgc3RyaW5nLAotCXNpbmNlIGl0IHdhcyBuZXZlciBtYWxsb2NlZC4KLQotV2VkIE9jdCAyOCAxMzo0MjowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgWmVybyB0aW1lc3RhbXAgZmllbGQuCi0KLVR1ZSBPY3QgMjcgMTI6MjQ6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCk6IHNldCB0aGUgZmNuYXJ5IGluZm8gYmVmb3JlCi0Jb3B0aW9uYWxseSBzZXR0aW5nIHRoZSBkaW1lbiBpbmZvLCBzaW5jZSB0aGV5IGFyZSBpbiB0aGUgc2FtZQotCW1lbW9yeSBsb2NhdGlvbnMuICBBbHNvIHplcm8gb3V0IGV4dGVybmFsIGF1eGVudC4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBkb24ndCB6ZXJvIGV4dGVybmFsIGF1eGVudDsgbm93IGRvbmUgaW4KLQljb2ZmX3N3YXBfYXV4X291dC4KLQotRnJpIE9jdCAyMyAxMzo1NTozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIENoZWNrIGZjbG9zZSByZXR1cm4gdmFsdWUgZm9yIGVycm9ycy4KLQlsaWJiZmQuaDogYmZkX2NhY2hlX2Nsb3NlIG5vdyByZXR1cm5zIGEgYm9vbGVhbi4KLQljYWNoZS5jIChiZmRfY2FjaGVfZGVsZXRlKTogcmV0dXJuIGZjbG9zZSBzdWNjZXNzIHZhbHVlLgotCShiZmRfY2FjaGVfY2xvc2UpOiByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSByZXR1cm4gdmFsdWUuCi0Jb3BuY2xzLmMgKGJmZF9jbG9zZSwgYmZkX2Nsb3NlX2FsbF9kb25lKTogcmV0dXJuIHJlc3VsdCBvZgotCWJmZF9jYWNoZV9jbG9zZS4KLQotRnJpIE9jdCAyMyAxMDozMjozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IGxvYWQgc2VjdGlvbnMgd2l0aG91dCB0aGUgU0VDX0xPQUQgYml0LgotCi1UaHUgT2N0IDE1IDEwOjE2OjM1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19ob3d0bzJ0eXBlLCBTRUxFQ1RfUkVMT0MpOiBuZXcgZnVuY3Rpb24gdG8KLQl3b3JrIG91dCBhIGNvZmYgcmVsb2NhdGlvbiB0eXBlIGZyb20gYSBob3d0bydzIGF0dHJpYnV0ZXMgcmF0aGVyCi0JdGhhbiB1c2luZyB0aGUgaW5wdXQgcl90eXBlIGZpZWxkLiBUaGlzIGZpeGVzIFBSMTY3NyBhbmQgYWxsb3dzCi0JY29udmVyc2lvbiBvZiBhLm91dCByZWxvY3MgdG8gY29mZiByZWxvY3MuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogaWYgc3VwcGxpZWQgYSByZWxvY2F0aW9uCi0JcmVsYXRpdmUgdG8gYW4gYWJzb2x1dGUgc3ltYm9sLCB1c2UgdGhlIHJpZ2h0IHN5bWJvbCBpbmRleC4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IGRvIGEgcGFydGlhbCBsaW5rIGZvciBjb2ZmCi0JcmVsb2NzIHJpZ2h0LgotCi1GcmkgT2N0IDIzIDA4OjE1OjU2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY2hhbmdlcyB0byBzdXBwb3J0IGkzODYtc3lzdiB3aXRoIHNoYXJlZCBsaWJyYXJpZXM6Ci0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IGlmIFRXT19EQVRBX1NFQ1MgaXMgZGVmaW5lZCwKLQljaGVjayBmb3IgLmRhdGEyOyBpZiBfTElCIGlzIGRlZmluZWQsIGNoZWNrIGZvciBpdDsgbWFwCi0JU0VDX05FVkVSX0xPQUQgdG8gU1RZUF9OT0xPQUQuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogbWFwIFNUWVBfTk9MT0FEIHRvIFNFQ19ORVZFUl9MT0FELgotCShtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBpZiBUV09fREFUQV9TRUNTLCBhY2NlcHQgLmRhdGEyLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IGZvcmNlIHZhZGRyIG9mIC5saWIgdG8gMDsgc2V0IHNjbnB0cgotCWlmIHNlY3Rpb24gaGFzIGNvbnRlbnRzLCBub3QganVzdCBpZiBpdCBpcyBsb2FkYWJsZTsgaWYKLQlUV09fREFUQV9TRUNTLCBjaGVjayBmb3IgLmRhdGEyCi0JKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBzZXQgdm1hIG9mIC5saWIgc2VjdGlvbiB0byBudW1iZXIgb2YKLQkubGliIHNlY3Rpb25zLgotCSogY29mZi1pMzg2LmM6IGRlZmluZSBUV09fREFUQV9TRUNTOyB1c2UgYSBzcGVjaWFsIENBTENfQURERU5EOwotCWRvbid0IGRlZmluZSBjb2ZmX3dyaXRlX2FybWFwIHRvIGJzZF93cml0ZV9hcm1hcC4KLQkqIGhvc3RzL2kzODZ2Lmg6IGRvbid0IGluY2x1ZGUgPHV0aW1lLmg+LCBzaW5jZSBpdCBpcyBub3QgcHJvdmlkZWQKLQlieSBTVlIzLjIuCi0KLVRodSBPY3QgMjIgMjI6NDA6MjAgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBzb2xhcmlzMi5oOiBHZXQgdGhlIGRlZmluaXRpb24gb2YgYWxsb2NhIGZyb20gYWxsb2NhLmggaWYgd2UKLQlhcmVuJ3QgdXNpbmcgZ2NjLgotCi1UaHUgT2N0IDIyIDAzOjA3OjI4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi17YW91dCxib3V0fSk6ICBTdXBwb3J0IHRoZXNlLgotCi1XZWQgT2N0IDIxIDAzOjQ2OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvYTI5ay1hb3V0Lm10IChERUZBVUxUX1RBUkdFVCk6ICBTZXQgdG8gb25lIHRoYXQgZXhpc3RzLgotCi1UaHUgT2N0IDE1IDE1OjA1OjM5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcG9sbG82OC5oLCBhcG9sbG92NjguaCwgaHAzMDAuaCwgaTM4NnYuaCwgaXJpeDMuaDogUmVtb3ZlCi0Jbm8tbG9uZ2VyLXVzZWQgZGVmaW5pdGlvbnMgb2YgTF9TRVQgYW5kIExfSU5DUi4KLQkqIGkzODZsaW51eC5oOiAgVHdlYWtzIHRvIHNtb290aCBMaW51eCBidWlsZC4KLQotVGh1IE9jdCAxNSAwMTozMjoyMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc2VjbGV0Lmg6ICBBZGQgZW51bSB0YWcgdG8gYmZkX3NlY2xldF9lbnVtX3R5cGUuCi0KLQkqIGJmZC1pbi5oIChmaWxlX3B0cik6ICBVcGRhdGUgY29tbWVudHMsIG1ha2UgRklYTUUgcmUgb2ZmX3QuCi0KLQkqIGFvdXQtYWRvYmUuYywgYW91dGYxLmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLXJzNjAwMC5jLAotCWNvZmZjb2RlLmgsIGVsZi5jLCBpZWVlLmMsIGxpYmFvdXQuaCwgbGliYmZkLmMsIG9hc3lzLmMsCi0Jc2NvLWNvcmUuYzogIExpbnQ6ICBTZWNvbmQgYXJndW1lbnQgb2YgYmZkX3NlZWsgaXMgYWx3YXlzIGZpbGVfcHRyLgotCVRoaXJkIGFyZ3VtZW50IGlzIFNFRUtfU0VUIG9yIFNFRUtfQ1VSLiAgUmVzdWx0IGlzIGFsd2F5cyAwIG9yIC0xLgotCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXRmMS5oLCBhb3V0eC5oLCBib3V0LmMgY29mZi1tNjhrLmMsIGNvZmYtejhrLmMsCi0JY29mZmNvZGUuaCwgZWxmLmMsIGxpYmFvdXQuaCwgbGliYmZkLWluLmgsIHNyZWMuYzogIExpbnQuCi0KLUZyaSBPY3QgIDkgMDM6NDY6MzcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgTmV3IGZpbGUsIGNvbnRhaW5zIG1hcHBpbmcgb2YgaG9zdCBjb25maWdzCi0JdG8gaG9zdCBzdXBwb3J0IGZpbGUgbmFtZXMgZm9yIGJmZCwgYmludXRpbHMsIG9wY29kZXMuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgaXQuCi0JKiBpMzg2YW91dC5jOiAgQ2xlYW51cCwgZHVtcCBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QLgotCSogaTM4NmJzZC5jOiAgQ2xlYW51cCwgcmVmb3JtYXQuCi0JKiBjb25maWcvaTM4Ni1ic2QubXQ6ICBDb21tZW50IGNoYW5nZXMuCi0JKiBjb25maWcvaTM4NmJzZC5taDogIE5ldyBmaWxlIGZvciBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL2kzODZic2QuaDogIE1lcmdlIGNoYW5nZXMgZnJvbSBQZXRlciBTY2hhdWVyLgotCSogYm91dC5jIChBTElHTik6ICBSZW5hbWUgdG8gQUxJR05FUiwgc2luY2Ugc3lzdGVtIGhlYWRlciBmaWxlcwotCW9uIEJTRCA0LjQgZGVmaW5lIEFMSUdOIChzaWdoISkuCi0KLVRodSBPY3QgIDggMjI6MTg6MTAgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKGFvdXRfYmFja2VuZF9kYXRhKTogYWRkZWQgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLQlmaWVsZC4gRm9yIFpNQUdJQyBmaWxlcyBvbmx5LCB3aGVuIHRleHRfaW5jbHVkZXNfaGVhZGVyIGlzIHNldCwgYnkKLQlkZWZhdWx0IHRoZSBsZW5ndGggb2YgdGhlIGV4ZWMgaGVhZGVyIGlzIGNvdW50ZWQgaW4gdGhlIHRleHQKLQlzZWN0aW9uIHNpemUuIEZvciBnbzMyLCBleGVjIGhlYWRlciBpcyBtYXBwZWQgaW4gYnV0IGRvZXMgKm5vdCoKLQljb250cmlidXRlIHRvIHRoZSBzaXplIG9mIHNlY3Rpb24uCi0JKiBhb3V0eC5oIChhb3V0X2FkanVzdF9zaXplc19hbmRfdm1hcyk6IGlmIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0JaXMgbm90IHNldCwgYnV0IHp0aWggaXMsIGFkZCB0aGUgc2l6ZSBvZiB0aGUgZXhlYyBoZWFkZXIgdG8gdGhlCi0JcmVjb3JkZWQgc2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLgotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBjbGVhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZC4KLQkqIGkzODZhb3V0LmMgKGkzODZhb3V0X2JhY2tlbmRfZGF0YSk6IHNldCBleGVjX2hlYWRlcl9ub3RfY291bnRlZC4KLQlBbHNvIHNldCB0ZXh0X2luY2x1ZGVzX2hlYWRlci4KLQkqIGFvdXQtdGFyZ2V0LmggKCpfYmFja2VuZF9kYXRhKTogY2xlYXJlIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0JYnkgZGVmYXVsdCBpbiBNWShiYWNrZW5kX2RhdGEpLgotCi1UaHUgT2N0ICA4IDE4OjEyOjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChjYWxsYmFjayk6IERvbid0IGRlZmluZSB0aGlzIGZ1bmN0aW9uIGlmIGl0IHdvbid0IGJlCi0JdXNlZC4KLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogUmVzdG9yZSBvbGQgYW91dF9kYXRhIHZhbHVlIGlmIHRoaXMKLQl0eXBlIGRvZXNuJ3QgbWF0Y2guICBEb24ndCBsb3NlIGlmIGZpbGUgc2VjdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KLQljcmVhdGVkLgotCShzZXRfYXJjaF9tYWNoKTogU2V0IHJlbG9jX2VudHJ5X3NpemUuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBiZmRfaF9nZXRfezE2LDh9IGZvciByZWFlZGluZyBzeW1ib2wgZGF0YS4KLQotCSogaG9zdHMvaTM4NmJzZC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGlbMzRdODYtKi1ic2QgaG9zdC4KLQotCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2ssIHdyaXRlX29iamVjdF9jb250ZW50cyk6IERlbGV0ZSB1bnVzZWQKLQl2YXJpYWJsZXMuCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBVc2UgaXQgYXMgZGVmYXVsdC4KLQkqIGFvdXRmMS5oIChzdW5vczRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWxldGVkLgotCShNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IERvbid0IGRlZmluZSBpdC4KLQotCSogYW91dHguaCAoYWRqdXN0X3NpemVzX2FuZF92bWFzKTogRG9uJ3QgYm90aGVyIHdpdGggcGFkZGluZyBmb3IKLQlPTUFHSUMgZmlsZXMuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBoZWFkZXIgYnl0ZSBvcmRlciwgbm90IHRhcmdldCBieXRlCi0Jb3JkZXIsIGZvciByZWFkaW5nIHN5bWJvbCBkYXRhLgotCi1UaHUgT2N0ICA4IDE3OjMzOjM5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBVbmRvIHNvbWUgYnJhaW4gZGFtYWdlIGluIHRoZSBob3N0IHNlY3Rpb24uCi0JKiBjb25maWd1cmUuaW46ICBSZWZvcm1hdCB0aGUgdGFyZ2V0IHNlY3Rpb24sIHRlc3QgbWFueSBjb25maWdzLgotCSogTWFrZWZpbGUuaW4gKG1ha2UpOiAgUmVtb3ZlIG9ic29sZXRlIGBtYWtlIG1ha2UnLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIE1ha2UgZGVmaW5lcyBsaW5lIHVwLgotCi1UaHUgT2N0ICA4IDA4OjUyOjQ4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JTm93IGEgYmZkIGtub3dzIHdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIG5vcm1hbGx5IHByZXBlbmRlZAotCXRvIHN5bWJvbHMgaW4gaXRzIGZpbGUgZm9ybWF0LgotCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXQtdGFyZ2V0LmgsIGJvdXQuYywgY29mZi1hMjlrLmMsIGNvZmYtaDgzMDAuYywKLQljb2ZmLXo4ay5jOiB0YXJnZXRzIHNldCBzbyB0aGV5IGhhdmUgbGVhZGluZyB1bmRlcnNjb3JlCi0JKiBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW1pcHMuYywgY29mZi1tODhrLmMsCi0JY29mZi1yczYwMDAuYywgY29mZi13ZTMyay5jLCBlbGYuYywgaWVlZS5jLCBzcmVjLmM6IHRhcmdldHMgc2V0Ci0Jd2l0aG91dCBsZWFkaW5nIHVuZGVyc2NvcmUgZmxhZwotCSogdGFyZ2V0cy5jOiBhZGQgc3ltYm9sIGxlYWRpbmcgY2hhciB0byB4dmVjIGRlc2NyaXB0aW9uCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKTogbmV3IG1hY3JvLgotCi1Nb24gT2N0ICA1IDE0OjMyOjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6ICBNYWtlIGVycm5vIGdsb2JhbC4KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogIElmIHJlYWQgZmFpbHMgKGFuZAotCWVycm5vIT0wKSBzZXQgYmZkX2Vycm9yIHRvIG1hbGZvcm1lZF9hcmNoaXZlIChzaW5jZSB0aGlzIHByb2JhYmx5Ci0JaW5kaWNhdGVzIGEgdHJ1bmNhdGVkIGFyY2hpdmUpLCByYXRoZXIgdGhhbiBzeXN0ZW1fY2FsbF9lcnJvci4KLQotTW9uIE9jdCAgNSAwMzozMzozOSAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBydWxlcyBmb3IgaTM4NmJzZC5jCi0JKiBpMzg2YnNkLmM6IG5ldyBmaWxlLCBzdXBwb3J0aW5nIDM4NmJzZC4KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGkzODYtKi1ic2QgdGFyZ2V0LgotCSogY29uZmlnL2kzODYtYnNkLm10OiBuZXcgZmlsZSAtIDM4NmJzZCB0YXJnZXQgY29uZmlndXJhdGlvbi4KLQotVGh1IE9jdCAgMSAxNzo1MTowNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmUtYXJyYW5nZSBob3N0IHNlY3Rpb24gdG8gdXNlICotKi0qIG5vdGF0aW9uLAotCWNsZWFuIHVwIHNvbWUgb2YgdGhlIHRhcmdldCBzZWN0aW9uIGFzIHdlbGwKLQotCSogc2VjbGV0LmM6IGNhc3QgcmVzdWx0IG9mIGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgdG8KLQlhdm9pZCBjb21waWxlciB3YXJuaW5ncwotCi1UdWUgU2VwIDI5IDEzOjI0OjA5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogQ3JlYXRlIHNlY3Rpb24gaWYgaXQgZG9lc24ndAotCWFscmVhZHkgZXhpc3QuCi0KLQkqIGJvdXQuYzogUmVtb3ZlZCBzb21lIHVudXNlZCB2YXJpYWJsZXMuCi0KLVR1ZSBTZXAgMjkgMDg6MzA6MjEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBQb3J0YWJpbGl0eSBmaXhlcyBmcm9tIHAzOgotCWNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogcmVtb3ZlZCBzYW5pdHkgY2hlY2sgdW50aWwgaXQKLQl3b3JrcyBvbiBhbGwgdGFyZ2V0cyAocGVyIGFkdmljZSBmcm9tIHNhYykuCi0JY29uZmlnL2hwOTAwMC5taDogbmV3IGZpbGUgdG8gZGVmaW5lIFVTRy4KLQlocHBhLmM6ICN1bmRlZiBocHBhIGJlZm9yZSB0aGUgSlVNUF9UQUJMRS4KLQlob3N0cy9ocHBhaHB1eC5oOiAjZGVmaW5lIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUiBpZiBub3QKLQlfX1NURENfXy4KLQl0YXJnZXRzLmMgKGJmZF90YXJnZXRfbGlzdCk6IGlmIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUiwgbWFrZQotCWxvY2FsIHZhcmlhYmxlIHRhcmdldCB2b2xhdGlsZSB0byBhdm9pZCBteXN0ZXJpb3VzIGJ1ZyBpbgotCUhQOTAwMC83MDAgY2MuCi0KLVNhdCBTZXAgMjYgMDM6NTg6NDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9ocHBhYnNkLm1oLCBjb25maWcuaHBwYWhwdXgubWg6ICBSZW1vdmUgdmFyaW91cyBib2dvc2l0eS4KLQkqIGhvc3RzL2hwcGFocHV4Lmg6ICBSZW1vdmUgYmNvcHkgYW5kIGluZGV4IGNpcmN1bXZlbnRpb25zLgotCi1GcmkgU2VwIDI1IDIyOjM2OjUyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXo4ay5jIChmdW5jX2RhLCBmdW5jX2pyKTogIExpbnQuCi0JKiBjb2ZmY29kZS5oOiAgVXNlIG1lbXNldCByYXRoZXIgdGhhbiBiemVyby4KLQkqIGVsZi5jOiAgVXNlIG1lbWNweSByYXRoZXIgdGhhbiBiY29weS4KLQkqIHRla2hleC5jOiAgVXNlIG1lbXNldCByYXRoZXIgdGhhbiBiemVyby4KLQotRnJpIFNlcCAyNSAxOToxNDo0OCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUFkZCBBZG9iZSBhLm91dCBzdXBwb3J0LgotCi0JKiBhb3V0LWFkb2JlLmM6ICBOZXcgZmlsZS4gIFNvIGZhciwgb25seSByZWFkcyBhLm91dC5hZG9iZS4gIEZJWE1FLgotCSogY29uZmlnL2Fkb2JlLm10OiAgQWRkLgotCSogY29uZmlndXJlLmluICgqLWFkb2JlLSogdGFyZ2V0KTogIEFkZC4KLQkqIHRhcmdldHMuYyAoYV9vdXRfYWRvYmVfdmVjKTogIEFkZC4KLQkqIE1ha2VmaWxlLmluOiAgYWRkIGFvdXQtYWRvYmUuYy4KLQotCSogY29uZmlndXJlLmluOiAgUHV0IHR3byBkYXNoZXMgaW4gYWxsIGVudHJpZXMgdG8gYmUgbWF0Y2hlZC4KLQlBZGQgY29tbWVudHMgdG8gcmVtaW5kIHBlb3BsZSB0byBkbyB0aGlzLgotCVJlb3JkZXIgYWxsIGVudHJpZXMgdGhhdCBtYXRjaCBtYW51ZmFjdHVyZXIgbmFtZXMsIHRvIG9jY3VyCi0JbGFzdCwgc28gdGhleSB3aWxsIG9ubHkgYmUgbWF0Y2hlZCBpZiBubyBtb3JlIHNwZWNpZmljIG1hdGNoCi0Jb2NjdXJzLiAgUmVtb3ZlIG1hbnVmYWN0dXJlcnMgYGFvdXQnLCBgYm91dCcsIGBjb2ZmJywgYW5kIGBlbGYnLgotCi1GcmkgU2VwIDI1IDE1OjAzOjIyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IFJldHVybiBiZmRfYWJzX3NlY3Rpb24sIG5vdCAwLAotCXNpbmNlIHdlIHNob3VsZCBuZXZlciBoYXZlIGEgTlVMTCBzZWN0aW9uLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgc3Rfc2huZHggZG9lc24ndCBtYXRjaCBhbnkgb2Ygb3VyCi0JdGVzdHMsIHNldCB0aGUgc2VjdGlvbiB0byBiZmRfYWJzX3NlY3Rpb24uCi0KLUZyaSBTZXAgMjUgMTE6MTE6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtejhrLmM6IGdldHRpbmcgY2xvc2VyCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IGFsbG93Ci0JRVhUUkFfQ0FTRVMgaG9va3MgZm9yIGRpZmZlcmVudCBhcmNoZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgcmVsb2MKLQl0eXBlcy4KLQkqIHNlY2xldC5oOiAjaWZuZGVmIGFyb3VuZCBpdCB0byBhbGxvdyBtdWx0aXBsZSBpbmNsdXNpb24KLQkqIHNyZWMuYzogbWlub3IgZG9jIGZpeAotCi1Nb24gU2VwIDIxIDE0OjMzOjU4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaHA5MDAwLmgsIGhvc3RzL2lyaXgzLmg6IGNoYW5nZXMgZnJvbSBXUlMuCi0KLVN1biBTZXAgMjAgMDg6NDg6MjUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBpMzg2LWVsZiBmb3IgYWxsIGkzODYvaTQ4NiBzeXN2NCBob3N0cywgbm90Ci0JanVzdCBuY3IuCi0KLVRodSBTZXAgMTcgMDY6NDA6NDYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogQ2xlYXIgaG93dG8gZmllbGQgYmVmb3JlCi0JZmlsbGluZyBpbiByZWxvYywgaW4gY2FzZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY29kZSBkb2Vzbid0IHNldAotCWl0LgotCi1GcmkgU2VwIDExIDE1OjM3OjA2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogc2V0IHRoZSBsYXN0IHJlbnVtYmVyZWQKLQlzeW1ib2wgcG9pbnRlciB0byBOVUxMLCBhcyBleHBlY3RlZCBieSBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzLgotCShjb2ZmX3dyaXRlX3JlbG9jcyk6IGFwcGFyZW50bHkgYSBub24temVybyBhZGRlbmQgaXMgT0sgZm9yIHJlbG9jCi0JdHlwZSBSX0lIQ09OU1QgdXNlZCBvbiB0aGUgMjlrLgotCi1UaHUgU2VwIDEwIDEzOjI4OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgRGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmRvcGVuIGZvcgotCXVwZGF0ZSwgYmFzZWQgb24gaG93IHRoZSB1bmRlcmx5aW5nIGZpbGUgd2FzIG9wZW5lZC4gIE9ic29sZXRlcwotCUZBU0NJU1RfRkRPUEVOLgotCSogaG9zdHMvcnM2MDAwLmgsIGhvc3RzL3RhaG9lLmgsIGhvc3RzL3ZheGJzZC5oOiAgUmVtb3ZlCi0JYWxsIEZBU0NJU1RfRkRPUEVOIGNvbmZpZyBkZWZpbmVzLgotCi1UdWUgU2VwICA4IDIxOjM3OjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6IE1vdmVkIHRvIG9wY29kZXMgbGlicmFyeSwgbm93IHRoYXQgd2UgaGF2ZSBvbmUuCi0JKiBNYWtlZmlsZTogRG9uJ3QgY29tcGlsZSBpdC4KLQotVHVlIFNlcCAgOCAxMDoxMDozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4Lmg6IGFkanVzdF9zaXplc19hbmRfdm1hcyBkaWQgbm90IHJldHVybiBhbnl0aGluZy4KLQotVGh1IFNlcCAgMyAxOToyOTowNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2ZsYWdzKTogIFJlbW92ZSBhIHNhbml0eSBjaGVjay4KLQlJdCBpcyB1bmZvcnR1bmF0ZWx5IGJyb2tlbiwgYW5kIHByZXZlbnRzIHN0cmlwIGZyb20gd29ya2luZy4KLQotVGh1IFNlcCAgMyAxNjoxNDo0MCAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jIChjb25kcik6IFJlbW92ZSBleHRyYW5lb3VzLCBidXQgaGFybWxlc3MsIGJhY2tsYXNoCi0JY3JlYXRlZCBieSBsYXN0IGNoYW5nZS4KLQotVGh1IFNlcCAgMyAxMzo1MjozOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3N0cnVjdCk6ICBNYWtlIHNpemUgZmllbGQgYmUgdW5zaWduZWQuCi0JKiBiZmQtaW4uaDogIEJ1bXAgdG8gdmVyc2lvbiAyLjAuCi0KLVRodSBTZXAgIDMgMDk6MDU6MzcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYm91dC5jLCBjcHUtejhrLmM6ICBVc2UgZW51bXMgd2hlbiBpbml0aWFsaXppbmcgc3RydWN0cyB0byBrZWVwCi0JYnJhaW5kYW1hZ2VkIEhQL0Fwb2xsbyBjb21waWxlciBoYXBweS4KLQotV2VkIFNlcCAgMiAwMjo1MzoyOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmM6ICBGaXggZGVzY3JpcHRpb24gb2Ygc2VhcmNoIGZvciBtYXRjaGluZyB0YXJnZXQuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IFNFQ19DT0RFIGFuZCBTRUNfREFUQS4KLQkqIHRhcmdldHMuYzogIFVwZGF0ZSBkZXNjcmlwdGlvbiBvZiBzZWFyY2ggZm9yIG1hdGNoaW5nIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluIChkb19jbGVhbiwgY2xlYW4pOiAgRml4IGluZmFudCBtb3J0YWxpdHkgdHlwby4KLQkoZG9jZGlyKTogIFNldCB0byAuL2RvYywgbm90ICR7c3JjZGlyfS9kb2MsIHdoaWNoIGhhcyBubyBtYWtlZmlsZS4KLQkoejhrIGFuZCB3ZTMyayBmaWxlcyk6ICBgKi5vOiAqLmMnOiBhdm9pZCBTdW4gTWFrZSBidWcuCi0KLVdlZCBTZXAgIDIgMDA6MjY6MzIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZGVkIG1vc3RseWNsZWFuL2NsZWFuL2Rpc3RjbGVhbiBydWxlcy4KLQotVHVlIFNlcCAgMSAxMzozODo0MCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIFRha2Ugb3V0IG9hc3lzICh1bmxlc3MgdGhhdCBpcwotCXRoZSBkZWZhdWx0KTogIEJlY2F1c2UgdGhlcmUgaXMgbm8gbWFnaWMgbnVtYmVyIGluIGFyY2hpdmVzLAotCXRoZXJlIGNhbiBiZSBhbm5veWluZyB0YXJnZXQgbWlzLW1hdGNoZXMuCi0KLU1vbiBBdWcgMzEgMTA6MTE6MzcgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogUmlnb3JvdXNseSB1cGRhdGVkIHRvIG1hdGNoIGFyY2hpdGVjdHVyZSBtYW51YWwuCi0KLU1vbiBBdWcgMzEgMDg6MDc6NTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXQ8bj5zd2FwX2V4dF9yZWxvY19vdXQpLCBib3V0LmMKLQkoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBmaXggYnVnIDE1MDYgd2hlcmUgYWJzIHN5bWJvbHMgYXR0YWNoZWQKLQl0byB0aGUgYnVpbHQtaW4gYWJzX3NlY3Rpb24gd2VyZSBub3Qgd3JpdHRlbiBvdXQgY29ycmVjdGx5LgotCi1GcmkgQXVnIDI4IDE2OjI5OjE1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYnNkX2FybWFwKTogaWYgdGhlIHN5bWRlZl9jb3VudCBpcyB0b28KLQlsYXJnZSwgYXNzdW1lIHdlJ3JlIHVzaW5nIGEgc3dhcHBlZCBieXRlIG9yZGVyIGFuZCBmYWlsIHdpdGgKLQl3cm9uZ19mb3JtYXQgcmF0aGVyIHRoYW4gZHVtcGluZyBjb3JlLgotCi1GcmkgQXVnIDI4IDE1OjM4OjAzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBSZW5hbWVkIG9wYy1zcGFyYy5jIHRvIHNwYXJjLW9wYy5jIGZvciBzeXN0ZW1zIHdpdGggc2hvcnQKLQlmaWxlbmFtZSBjb25zdHJhaW50cy4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIHRvIHJlZmxlY3QgY2hhbmdlLgotCi1UaHUgQXVnIDI3IDEzOjA1OjI4IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQlBZGQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgdGhlIHdlMzJrOgotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZm9jb2RlLmgsIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jOgotCU1pbm9yIGVkaXRzLgotCSogY29mZi13ZTMyay5jLCBjcHUtd2UzMmsuYywgY29uZmlnL3dlMzJrLm10LCBob3N0cy93ZTMyay5oOiBOZXcgZmlsZXMuCi0KLVdlZCBBdWcgMjYgMTQ6MjA6MTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYzogYWRkZWQgc3VwcG9ydCBmb3IgcmVsYXhhYmxlIGFsaWdubWVudCByZWxvY3MuCi0KLQkqIHNlY2xldC5jIChyZWwsIHNlY2xldF9kdW1wX3NlY2xldCwgc2VjbGV0X2R1bXApOiBnZXQgdGhlIGFwcCB0bwotCXBhc3MgZG93biBwb2ludGVyIHRvIHBsYXkgYXJlYSByYXRoZXIgdGhhbiB1c2UgYWxsb2NhCi0KLQkqIGNwdS16OGsuYyAoY29tcGF0aWJsZSk6IG1hZGUgc3RhdGljIHRvIHJlZHVjZSBuYW1lIHNwYWNlCi0JcG9sdXRpb24uCi0KLVR1ZSBBdWcgMjUgMDg6Mzk6MTAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgQWRkIGJhc2ljIHN1cHBvcnQgZm9yIHRoZSB6OGs6Ci0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCBjb25maWd1cmUuaW4sIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCB0YXJnZXRzLmMsCi0KLQkqIHN5bXMuYzogbW92ZSBtaXMtaW5zZXJ0ZWQgcGF0Y2guCi0KLUZyaSBBdWcgMTQgMTU6Mzk6MjkgUERUIDE5OTIgIEhvd2FyZCBDaHUgIChoeWNAaGFuYXVtYS5qcGwubmFzYS5nb3YpCi0KLQlEb2N1bWVudGF0aW9uIGZpeGVzOgotCSogY3RvcnMuYywgZm9ybWF0LmMsIHNlY3Rpb24uYywgcmVsb2MuYzogYXBwZW5kICIgLSIgdG8gaXRlbSB0YWdzLgotCSogcmVsb2MuYywgc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzogYWRkIERPQ0REIGJlZm9yZSBAbm9kZQotCQljb21tZW50cy4KLQkqIHJlbG9jLmM6IGJyZWFrIG91dCBhZGRlbmQgaXRlbSBmcm9tIHN1cnJvdW5kaW5nIHRleHQuCi0KLQkqIGRvYy5zdHIgKERPQ0REKTogRGVmaW5lZC4gQWRkcyB0ZXh0IHRvIG91dHB1dC4KLQkoYm9keXRleHQpOiBQdXQgYnVsbGV0aXplIGJlZm9yZSBraWxsX2JvZ3VzX2xpbmVzLgotCSogY2hldy5jIChidWxsZXRpemUpOiBFbmQgaXRlbWl6YXRpb24gYWZ0ZXIgYSBibGFuayBsaW5lLCB0bwotCXByZXZlbnQgZm9sbG93aW5nIHRleHQgZnJvbSBiZWluZyBzd2FsbG93ZWQgdXAgaW4gYW4gaXRlbS4KLQotTW9uIEF1ZyAyNCAyMDo1MDoyMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgc3BhcmNsaXRlIGFzIGEgdGFyZ2V0LgotCi1Nb24gQXVnIDI0IDEyOjA2OjMxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfZ2V0X3N5bXRhYik6IGFsd2F5cyBudWxsIHRlcm1pbmF0ZSB0aGUgc3ltYm9sIGxpc3QsCi0JbGludC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogaWYgc3ltYm9scyBkb24ndCBjb21lCi0JZnJvbSBhIGNvZmYgZmlsZSAoY3N5bSBpcyBudWxsKSwgZG9udCBkZXJlZiB0aGVtCi0KLQkqIGllZWUuYyAocGFyc2VfZXhwcmVzc2lvbik6IGdldCB0aGUgYW5zd2VyIHJpZ2h0IHdoZW4gYWRkaW5nIGFuCi0JYWJzKyhzZWMrb2ZmKSwgKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogY2FsbCBpZWVlX29iamVjdF9wCi0Jb24gZWx0cyBzbyB0aGF0IGZpbGVuYW1lIGlzIGZpbGxlZCBpbi4KLQotVGh1IEF1ZyAyMCAxOTowNTo0OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChob3d0b19hbGlnbl90YWJsZSk6IE5ldyBzZXQgb2YgcmVsb2NzLCB3aXRoIGVub3VnaAotCWRhdGEgZm9yICJvYmpkdW1wIC1yIiB0byB3b3JrLgotCShiX291dF9yZWxvY190eXBlX2xvb2t1cCk6IFJlY29nbml6ZSBhbGlnbm1lbnQgcmVsb2NzLgotCi1UdWUgQXVnIDE4IDEyOjU3OjQ1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotIAkqIE1ha2VmaWxlLmluOiBhZGRlZCBGTEFHU19UT19QQVNTLCBhbmQgdXNlZCBpdCBmb3IgYWxsIHJlY3Vyc2l2ZQotCWludm9jYXRpb25zIG9mIG1ha2UuICBBbHNvLCBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbgotCWRpcmVjdG9yaWVzLgotCi0JKiBjb25maWcvYXBvbGxvdjY4Lm1oOiByZW1vdmVkIC1nIGZyb20gQ0MgZGVmaW5pdGlvbi4KLQotTW9uIEF1ZyAxNyAxMzo0MDowOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlY3N0YXRpb24ubWggKEhERUZJTkVTKTogU3BlY2lmeSAiLUcgNCIgdG8gYXZvaWQKLQlvdmVyZmxvd2luZyBncC1vZmZzZXQgcmFuZ2UuCi0KLU1vbiBBdWcgMTcgMTE6NDQ6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IGRvbid0IHdyaXRlIG91dCBzZWN0aW9ucwotCXdpdGhvdXQgdGhlIExPQUQgYW5kIEFMTE9DIGF0dHJpYnV0ZXMKLQotTW9uIEF1ZyAxNyAxMTo1NTowNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMsIGNwdS1tNjhrLmMsIGNwdS1zcGFyYy5jOiBVbmRvIDE2IEp1bmUgY2hhbmdlcy4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogTmV3IGNhbGxiYWNrICJzZXRfc2l6ZXMiLgotCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2spOiBEb24ndCBzZXQgcGFnZS9zZWcgc2l6ZXMuCi0JKG1rb2JqZWN0KTogRGl0dG8uCi0JKHNldF9zaXplcyk6IE5ldyByb3V0aW5lLgotCShiYWNrZW5kX2RhdGEpOiBQb2ludCB0byBpdC4KLQkqIGFvdXRmMS5oIChzdW5vczRfc2V0X3NpemVzKTogSGVlZCBhcmNoaXRlY3R1cmUgd2hlbiBzZXR0aW5nIHNpemVzLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogUG9pbnQgdG8gaXQuCi0JKiBhb3V0eC5oIChzZXRfYXJjaF9tYWNoKTogQ2FsbCBzZXRfc2l6ZXMgY2FsbGJhY2suCi0KLUZyaSBBdWcgMTQgMTk6MjI6MTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6ICBNYWtlIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZQotCXRoZSBkZWZhdWx0LiAgR2l2ZW4gdGhhdCB3ZSAqd3JpdGUqIHRoZSBzdWNrZXJzIChmb3IgbG9uZwotCWFyY2hpdmUgbWVtYmVyIG5hbWVzKSwgd2UgcmVhbGx5IG91Z2h0IHRvIGJlIGFibGUgdG8gcmVhZCB0aGVtIQotCSogdHJhZC1jb3JlLmM6ICBEb24ndCBpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPi4gIEl0IGRvZXNuJ3QKLQlzZWVtIHRvIGJlIG5lZWRlZCwgYW5kIG1hbnkgbWFjaGluZXMgZG9uJ3QgaGF2ZSBpdC4KLQotVGh1IEF1ZyAxMyAwOTo1MzozOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKHZlY3Rvcik6IHJlYWQgYW5kIHdyaXRlIGFyY2hpdmVzIGluIGNvZmYgZm9ybWF0LgotCi1UdWUgQXVnIDExIDEyOjE5OjQyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBvcGMtc3BhcmMuYzogTmV3IGZpbGUuCi0KLVNhdCBBdWcgIDggMjM6MTU6MzUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYmZkX3JlbG9jX3N0YXR1c190eXBlLCBjYWxsal9jYWxsYmFjayk6ICBDYXN0IHZvaWQqCi0JcG9pbnRlcnMgdG8gYmZkX2J5dGUqIGJlZm9yZSBwZXJmb3JtaW5nIGFyaXRobWV0aWMgb24gdGhlbS4gIFN1Y2gKLQl1c2Ugd2l0aCBiYXJlIHZvaWQqIHBvaW50ZXJzIGlzIGEgZ2NjIGV4dGVuc2lvbi4KLQkqIGNhY2hlLmMgKGJmZF9jYWNoZV9kZWxldGUpOiAgRm9yd2FyZCBkZWNsIHdpdGggcHJvdG90eXBlIGZvcm0uCi0JKiBhcmNoaXZlIChub3JtYWxpemUpOiAgQWRkIHRvIENPTlNUIHRvIG1hdGNoIGFjdHVhbCB1c2FnZXMgd2l0aAotCUNPTlNULgotCi1Nb24gQXVnICAzIDAwOjM1OjI5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgaTQ4NiBob3N0IGNwdSwgYW5kIHVzZSBpMzg2LWVsZgotCWZvciBpNDg2LW5jci1zeXN2NC4KLQotU2F0IEF1ZyAgMSAxMzo0OTo1OSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N0cmF0dXMubXQgKENDKTogIFJlbW92ZSBkZWZpbml0aW9uLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBUZXN0IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdAotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJucyBOVUxMIGFuZCBkb24ndCBkZXJlZmVyZW5jZSBpdC4KLQotTW9uIEp1bCAyMCAwMjo0NjowOSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGFkZCBocHBhX2RhdGEgdG8gYmZkIHRkYXRhIChpbmRpcmVjdGx5IHZpYSBzZWYpLgotCi0JKiBjb25maWcvaHBwYWhwdXgubWg6IGhwdXggaXMgLURVU0cgKHBhdGNoIGJ5IHNlZikKLQotU2F0IEp1bCAxOCAxNTo1MDoxMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyLCBub3Qgc3Rkb3V0Ci0KLUZyaSBKdWwgMTcgMTg6MzI6NDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQuYywgY2FjaGUuYywgY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywKLQkgIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywgZGVtbzY0LmMsIGxpYmFvdXQuaCwgbGliYmZkLmMsCi0JICBvYXN5cy5jLCBvcG5jbHMuYywgc3Vub3MuYywgdGFyZ2V0cy5jOiByZW1vdmVkIHJjc2lkJ3MuCi0KLUZyaSBKdWwgMTcgMTc6MDY6NTYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBocHBhKiBpbnN0ZWFkIG9mIGhwcGEKLQotVGh1IEp1bCAxNiAxNjozOToyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmM6IGFkZGVkIFJfUkVMTE9OR19ORUcgcmVsb2MgdHlwZSwgYW5kIGNoYW5nZWQKLQlSVFlQRTJIT1dUTyB0byBjb3BlIHdpdGggc2FtZS4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBhZGRlZCBzdXBwb3J0IGZvciBzaXplIG9mIC0yCi0JKHN1YnRyYWN0IGEgd29yZCByZWxvYyB0eXBlKS4gVXBkYXRlZCBkb2MuCi0KLVRodSBKdWwgMTYgMTY6Mjg6MDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWVyZ2VkIGNoYW5nZXMgZnJvbSBwcm9ncmVzc2l2ZSwgcmVtb3ZlZCByY3NpZC4KLQotCSogYXJjaHVyZXMuYywgYXJjaGl2ZS5jLCBNYWtlZmlsZS5kb3M6IHJlbW92ZWQgcmNzaWQuCi0KLVRodSBKdWwgMTYgMDg6MDg6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIDogYWRkIEJGRF9JU19SRUxBWEFCTEUgZmxhZwotCSogYm91dC5jIChib3V0X3N3YXBfZXhlY19oZWFkZXJfW2luX291dF0pOiBuZXcgZmllbGQgaW4gZXhlYwotCWhlYWRlciBlX3JlbGF4YWJsZSwgbWFqb3IgaGFja2VyeSBpbiBjYWxsYmFja3MKLQkqIGxpYmFvdXQuaCA6IGFkZCBzcGFjZSBmb3IgYV9yZWxheGFibGUuCi0JKiBzZWNsZXQuYyAocmVsKTogZG9uJ3QgcmVsYXggZW1wdHkgc2VjdGlvbnMKLQotCi1XZWQgSnVsIDE1IDA3OjU3OjQ2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogYWRkIHNvbWUgY2FzdHMgdG8gdGhlIGluaXRpYWxpemVycyBmb3IKLQlkdW1iIGNvbXBpbGVycwotCi1UdWUgSnVsIDE0IDE0OjA2OjI4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIEdyZWF0bHkgc2ltcGxpZnkgZXhwcmVzc2lvbiwKLQlhbmQgYWRkIGFwcHJvcHJpYXRlIGNhc3RzIHRvIGtlZXAgKHBpY2F5dW5lKSBhaXgtY2MgaGFwcHkuCi0KLU1vbiBKdWwgMTMgMDU6MDY6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIE5vdyAybmQgYXJnIGlzIHdoZXJlIHRvIHdyaXRlCi0Jc3ltYm9sIHBvaW50ZXJzLiAgUHVudCBleHBlbnNpdmUgJiB1c2VsZXNzIGJmZF9yZWFsbG9jLiAgVXNlCi0JbWFsbG9jIGZvciByYXcgc3ltYm9scywgYW5kIGZyZWUgaXQgYmVmb3JlIHJldHVybmluZy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIERvIG5vdCBzbHVycCBzeW1ib2wgdGFibGUgdW50aWwgcG9saXRlbHkKLQlhc2tlZC4gCURvIG5vdCBldmVuIHNsdXJwIHN0cmluZyB0YWJsZXMuCi0JKGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogIENvdW50ICdlbSB3aXRob3V0IHJlYWRpbmcgdGhlbS4KLQkoZWxmX2dldF9zeW10YWIpOiAgVGhpcyBpcyBob3cgdG8gcG9saXRlbHkgYXNrLiAgU2NobHVycCEKLQlUaGlzIHNob3VsZCBwcm9iYWJseSBqdXN0ICpiZWNvbWUqIGVsZl9zbHVycF9zeW1ib2xfdGFibGUsIEZJWE1FLgotCi1XZWQgSnVsICA4IDE2OjI0OjMzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6IHdyaXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlCi0JYXJjaGl2ZSBoZWFkZXIgdG8gYmUganVzdCBhIGxpdHRsZSBiaXQgbGF0ZXIgdGhhbiB0aGUgdGltZXN0YW1wIG9mCi0JdGhlIGZpbGUsIG90aGVyd2lzZSB0aGUgbGlua2VyIHdpbGwgY29tcGxhaW4gdGhhdCB0aGUgaW5kZXggaXMKLQlvdXQgb2YgZGF0ZS4KLQotVHVlIEp1bCAgNyAwMDoyMzoyMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgbTY4ay1lcmljc3Nvbi0qLgotCi1TYXQgSnVsICA0IDAzOjI5OjQxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzeW1zLmg6ICBEZWZpbmUgQlNGX0ZJTEUsIHVwZGF0ZSBCU0ZfU0VDVElPTl9TWU0gZGVzYy4KLQkqIGVsZi5jOiAgUmVtb3ZlIHVuY29uZGl0aW9uYWwgZGVidWcgcHJpbnRmJ3MuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgSGFuZGxlCi0JQlNGX1NFQ1RJT05fU1lNIDw9PiBTVFRfU0VDVElPTiwgQlNGX0ZJTEUgPD0+IFNUVF9GSUxFLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmQgb3V0IHN5bWJvbHMgaW4gZm9yd2FyZCwgbm90Ci0JcmV2ZXJzZSBvcmRlci4gIFNpbXBsaWZ5IGR1cGxpY2F0ZSBjb2RlLgotCi1GcmkgSnVsICAzIDIwOjIzOjM0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIFJlbW92ZSAiKHZvaWQpIiBjYXN0cyBmcm9tIGZ1bmN0aW9uIGNhbGxzIHdoZXJlIHRoZQotCXJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLCBpbiBhY2NvcmRhbmNlIHdpdGggR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLVR1ZSBKdW4gMzAgMTY6NDk6MTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogIEFwcGx5IEpvaG4ncyBzdGFuZGFyZCBmaXggdG8gYXZvaWQgImVtcHR5IHRyYW5zbGF0aW9uCi0JdW5pdCIgd2FybmluZ3MgZnJvbSBzb21lIEFOU0ktQyBjb21waWxlcnMuCi0KLVRodSBKdW4gMjUgMDQ6Mzk6MjUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3NvbGFyaXMyLmg6ICBDb25maWd1cmUgc2FtZSBhcyBzeXN2NC4KLQotVHVlIEp1biAyMyAyMTo1NDo0NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmgsIGxpYmJmZC1pbi5oIChiZmRfc2Vlayk6ICBNYWtlIHByb3RvdHlwZSBtYXRjaCBkZWZpbml0aW9uLgotCSogcmVsb2MuYyAoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiAgTWFrZSBjYXN0IG9uIHJldHVybgotCXR5cGUgbWF0Y2ggYWN0dWFsIHJldHVybiB0eXBlLgotCSogZWxmX3ByaW50X3N5bWJvbCAoc2VjdGlvbl9uYW1lKTogIE1ha2UgQ09OU1QuCi0KLU1vbiBKdW4gMjIgMTc6MzU6MjQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGkzODZsaW51eC5jLCBob3N0cy9pMzg2bGludXguaCwgY29uZmlnL2kzODYtbGludXgubXQ6Ci0JTmV3IGZpbGVzLCBmb3IgTGludXggKGEgZnJlZSBVbml4IGNsb25lIGZvciAzODYgbWFjaGluZXMpLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jOiAgVXBkYXRlIGFjY29yZGluZ2x5LgotCi1GcmkgSnVuIDE5IDIwOjIzOjIxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCUxpbnRzIGZvciBiZmRfcmVsb2NfY29kZV90eXBlLT5iZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGFuZAotCWNvcnJlY3QgY2FsbGluZyBvZiBob3d0byBzcGVjaWFsIGZ1bmN0aW9ucyBhbmQgZml4ZXMgZnJvbSBSYWVidXJuCi0JZm9yIGdhczw+YmZkbmVzcwotCSogYXJjaHVyZXMuYzogbnVrZSBiZmRfcmVsb2NfY29kZV90eXBlCi0JKiBib3V0LmMsIGNwdS1oODMwMC5jLCBjb2ZmLWk5NjAuYywgY29mZi1tODhrLmM6IHNwZWNpYWwgZnVuY3Rpb24gbGludAotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBTVFlQX0lORk8gaXMgbWFya2VkIGFzCi0JU0VDX05FVkVSX0xPQUQsIHZhcmlvdXMgb3RoZXIgYmZkZ2FzIG5ld25lc3MKLQkqIHJlbG9jLmMtPmxpYmJmZC5oOiBjaGFuZ2UgcHJvdHlwZSBvZiBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCSogdGFyZ2V0cy5jOiBjaGFuZ2UganVtcCB0YWJsZSB2ZWN0b3IgdG8gYWJvdmUKLQotCi1GcmkgSnVuIDE5IDE5OjAwOjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiAgTWFyayBhcyBJTlRFUk5BTF9GVU5DVElPTiBzbwotCWl0cyBwcm90b3R5cGUgd2lsbCBiZSBpbmNsdWRlZCBpbiBsaWJiZmQuaC4gIENoYW5nZSByZXN1bHQgdHlwZQotCXRvIHN0cnVjdCAqIChyYXRoZXIgdGhhbiBlcXVpdmFsZW50IHR5cGVkZWYpIHNvIGl0IGNhbiBiZSB1c2VkIGluCi0JdGhlIHByb3RvdHlwZSwgd2hlcmUgdGhleSB0eXBlZGVmIHdvbid0IGJlIGtub3duLgotCSogbGliYmZkLmg6ICBVcGRhdGVkIHZlcnNpb24uCi0KLUZyaSBKdW4gMTkgMTU6MjE6NTYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvbmZpZ3VyZS5pbiwgY3B1LWhwcGEuYywgaHBwYS5jLCBsaWJocHBhLmgsCi0JdGFyZ2V0cy5jOiAgSFBQQSBtZXJnZS4KLQotRnJpIEp1biAxOSAxMjoyMTozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgU2VwYXJhdGUgU29sYXJpczIgZnJvbSBTWVNWNCBvbiBTUEFSQy4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogIEtsdWRnZSBhcm91bmQgU3VuIGNvbXBpbGVyIGJ1Zy4KLQotV2VkIEp1biAxNyAxNDowMjo0NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKGFvdXRfYmFja2VuZF9kYXRhKTogIENoYW5nZSBkZWZzIG9mIHR3byBiaXRmaWVsZHMgdG8KLQliZSB1bnNpZ25lZCBjaGFycyBpbnN0ZWFkIHRvIGdldCBhcm91bmQgcnM2MDAwIGNvbXBpbGVyIHByb2JsZW0uCi0KLVdlZCBKdW4gMTcgMTM6NTU6MzEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOgotCUNvcnJlY3QgbWlzY29uY2VwdGlvbiB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBzeW1ib2wgdGFibGUuCi0JT25seSBjYWxsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUgb24gdGhlIGZ1bGwgc3ltYm9sIHRhYmxlLCBub3QKLQl0aGUgZHluYW1pYyBvbmUgd2hpY2ggaXMgb25seSBhIHN1YnNldCBvZiB0aGUgZnVsbCBvbmUuCi0KLVdlZCBKdW4gMTcgMTU6NTQ6NTcgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yIEk5NjAsCi0JZG9uJ3QgYWxpZ24gc2VjdGlvbnMgaW4gZmlsZS4KLQotVHVlIEp1biAxNiAwNjoyODoyMSAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogdGFyZ2V0cy5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6IEFkZGVkIGZpZWxkIGZvciB0YXJnZXQtc3BlY2lmaWMKLQkoYnV0IG5vdCBmaWxlLXNwZWNpZmljKSBkYXRhLCBmb3IgZGlzdGluZ3Vpc2hpbmcgbWlub3IKLQljaGFyYWN0ZXJpc3RpY3MgYmV0d2VlbiAoZS5nLikgYS5vdXQgZm9ybWF0cy4KLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogTmV3IGZpZWxkIHVzZXJfc2V0X3ZtYSBpbmRpY2F0ZXMgdm1hCi0JZmllbGQgc2hvdWxkIGJlIGhlZWRlZCwgbm90IGFzc3VtZWQgdG8gYmUgdW5zZXQuCi0JKFNURF9TRUNUSU9OKTogSW5pdGlhbGl6ZSB0aGF0IGZpZWxkIG9mIHN0YW5kYXJkIHNlY3Rpb25zIHRvIHplcm8uCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IFNldCB1c2VyX3NldF92bWEgdG8gdHJ1ZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBXcml0ZSBvdXQgc3dhcHBlZCByZWxvYywgbm90Ci0JcHJlLXN3YXBwZWQgdmVyc2lvbi4KLQotCSogYXJjaHVyZXMuYyAoc3RydWN0IGJmZF9hcmNoX2luZm8pOiBGaXhlZCBvcmRlciBvZiBjb21tZW50IGFuZAotCWZpZWxkIGRlY2wuICBOZXcgZmllbGRzIGluZGljYXRlIHNpemUgb2YgcGFnZSBhbmQgc2VnbWVudCBmb3IKLQlhcmNoaXRlY3R1cmUuCi0JKiBjcHUtbTY4ay5jIChOKTogRmlsbCBpbiB2YWx1ZXMuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IERpdHRvLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IFZhcmlvdXMgYml0cyBvZiBkYXRhIChub3QKLQlhbGwgdXNlZCBjdXJyZW50bHkpIHdpdGggY2hhcmFjdGVyaXN0aWNzIG9mIGEub3V0IGltcGxlbWVudGF0aW9uLgotCUltcG9ydGFudCBmaWVsZCBmb3Igbm93IGlzIHRleHRfaW5jbHVkZXNfaGVhZGVyLCBpbmRpY2F0aW5nIHRoYXQKLQl0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlsZSBoZWFkZXIsIHdoaWNoCi0JZ2V0cyBtYXBwZWQgaW4gd2l0aCBpdC4KLQkoc3RydWN0IGFvdXRfZGF0YSk6IE5ldyBmaWVsZHMgaW5kaWNhdGUgd2hldGhlciB2bWEgaGFzIGJlZW4KLQlhZGp1c3RlZCB5ZXQgKG5vdCB5ZXQgdXNlZCksIGFuZCB3aGF0IG1hZ2ljIG51bWJlciB3aWxsIGJlIHVzZWQgaW4KLQl0aGUgb3V0cHV0IGZpbGUgKHNob3VsZCBnbyBhd2F5IGluIGZhdm9yIG9mIHZtYV9hZGp1c3RlZCkuCi0JKFdSSVRFX0hFQURFUlMpOiBDb2RlIGZvciBkZWFsaW5nIHdpdGggc2VjdGlvbiBzaXplcyBhbmQgcmVsYXRlZAotCWhlYWRlciBmaWVsZHMgcmVwbGFjZWQgd2l0aCBjYWxsIHRvIGFkanVzdF9zaXplc19hbmRfdm1hcy4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IEZpbGwgaW4gbWFnaWMgbnVtYmVyIGZpZWxkLgotCVNldCBXUF9URVhUIGZsYWcgZm9yIFpNQUdJQyBhcyB3ZWxsIGFzIE5NQUdJQyBmaWxlcy4KLQkoc2V0X2FyY2hfbWFjaCk6IFNldCBwYWdlIHNpemUgYW5kIHNlZ21lbnQgc2l6ZSBvbmNlIENQVQotCXR5cGUgaXMga25vd24uCi0JKGFkanVzdF9zaXplc19hbmRfdm1hcyk6IE5ldyBmdW5jdGlvbjsgaGFzIG11Y2ggY29kZSBtb3ZlZAotCWZyb20gc2V0X3NlY3Rpb25fY29udGVudHMgYW5kIFdSSVRFX0hFQURFUlMuICBTZXRzIG9yIGFkanVzdHMgdm1hCi0JYW5kIHNpemUgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBtYW55IGhlYWRlciBmaWVsZHMsIGFmdGVyIGRlY2lkaW5nCi0Jb24gbWFnaWMgbnVtYmVyIGZvciBvdXRwdXQgZmlsZS4gIENoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGlzCi0JYWRqdXN0bWVudCBoYXMgb25seSBiZWVuIGRvbmUgb25jZS4KLQkoc2V0X3NlY3Rpb25fY29udGVudHMpOiBDYWxsIGFkanVzdF9zaXplc19hbmRfdm1hcyBpbnN0ZWFkIG9mCi0JZG9pbmcgbXVjaCBvZiB0aGUgd29yayBoZXJlLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9tYWtlX2RlYnVnX3N5bWJvbCwgTVlfYmFja2VuZF9kYXRhKTogUHJvdmlkZQotCWRlZmF1bHQgKG51bGwpIHZhbHVlcyBvZiB0aGVzZSBmaWVsZHMuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IG92ZXJyaWRlIGFfdGV4dAotCXZhbHVlIGluIGV4ZWMgaGVhZGVyLgotCShzdW5vczRfYW91dF9iYWNrZW5kLCBNWV9iYWNrZW5kX2RhdGEpOiBEZWZpbmUgYmFja2VuZCBkYXRhCi0JaW5kaWNhdGluZyBmaWxlIGhlYWRlciBpcyBpbmNsdWRlZCBpbiB0ZXh0IHNlY3Rpb24uCi0KLQkqIGFvdXRmMS5oIChNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IEZpeCB0eXBvLgotCi0JKiBob3N0cy9zcGFyYy5oIChhYm9ydCwgZXhpdCk6IEhpZGUgdGhlc2UgbmFtZXMgaWYgY29tcGlsaW5nIHdpdGgKLQlnY2MgdmVyc2lvbiAyLCB0byBhdm9pZCB3YXJuaW5ncy4KLQotTW9uIEp1biAxNSAxMjoyNjo1NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL25jcjMwMDAubWggKElOU1RBTEwsIFJBTkxJQik6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCdzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLiAgVXNlIHNpbXBsZSAidHJ1ZSIgZm9yIFJBTkxJQi4KLQotU2F0IEp1biAxMyAwOToxNjo0MyAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG02ODBbMDEyMzRdMC13cnMtKik6IEZpeCB0eXBvIGluIG1hdGNoIHBhdHRlcm4uCi0KLUZyaSBKdW4gMTIgMTk6NDg6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiAgUmVtb3ZlIGV4dHJhIHNlbWljb2xvbiBpbiBkZWNsYXJhdGlvbnMuCi0JKiBjb25maWd1cmUuaW46ICBSZXdyaXRlIHRhcmdldCBwYXJzaW5nIHRvIHVzZSBzaW1wbGUgZm9ybWF0LgotCUhhbmRsZSBzcGFyYy1zdW4tc29sYXJpczIgY29uZmlndXJhdGlvbi4KLQkqIGFvdXQ2NC5oOiAgQXZvaWQgQU5TSSBDIGJyYWluIGRlYXRoIHdhcm5pbmcuCi0JKiBlbGYuYzogIEF2b2lkIHRyaWdyYXBoICg/Pz8pIG9yIC8qIGluIGNvbW1lbnRzLgotCi1GcmkgSnVuIDEyIDE0OjUxOjE0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N5c3Y0Lm1oOiBuZXcgZmlsZSwgUkFOTElCPWVjaG8KLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgU29sYXJpczIgYXMgLXN5c3Y0IG9yIC1zb2xhcmlzMgotCi1UaHUgSnVuIDExIDAwOjUyOjAzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX29ial90ZGF0YSk6ICBNZXJnZSBlbGZfb2JqX3RkYXRhX3N0cnVjdCBhbmQKLQllbGZfY29yZV90ZGF0YV9zdHJ1Y3QgaW50byBhIHNpbmdsZSBjb21tb24gc3RydWN0LiAgQ29yZSBmaWxlcwotCXdvdWxkbid0IGhhdmUgd29ya2VkIGF0IGFsbCB3aXRob3V0IHRoaXMuCi0JKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogIE5ldyBmdW5jdGlvbiBmb3IgR0RCJ3MgdW5kZXJjb3ZlciB1c2UKLQl0byBmaW5kIHN0cmluZyBzZWN0aW9ucyB0aGF0IEJGRCBoaWRlcyBmcm9tIGl0LgotCShlbGZfZ2V0X3N0cl9zZWN0aW9uKTogIEF2b2lkIG11bHRpcGxlIGFsbG9jJnJlYWRzIGZvciBzYW1lIGRhdGE7Ci0JbGludC4KLQkoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgQWxsb2NhdGUgaW50ZXJuYWwgZmlsZSBoZWFkZXIKLQlzdG9yYWdlIGR5bmFtaWNhbGx5LgotCSogYmZkLmMgKHVuaW9uIHsuLi59IHRkYXRhKTogIFJlbW92ZSBlbGZfY29yZV90ZGF0YV9zdHJ1Y3QuCi0JKiBkZW1vNjQuYzogIFByZXZlbnQgImVtcHR5IHRyYW5zbGF0aW9uIHVuaXQiIHdhcm5pbmdzIGZyb20gaWRpb3RzLgotCi1UdWUgSnVuICA5IDE3OjE1OjI2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcve2kzODZ2NC5taCwgbmNyMzAwMC5taH06ICBVcGRhdGUgUkFOTElCLCBhZGQgSU5TVEFMTC4KLQotU2F0IEp1biAgNiAxNzowMjo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIFNvbGFyaXMyIGFzICotc3VuLXN5c3Y0IG9yIGFzICotc3VuLXN1bm9zNS4KLQotU3VuIE1heSAzMSAwNTo0NTowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSBtNjgwWzAxMjM0XTAgYXMgYWxpYXNlcyBmb3IgbTY4awotCi1UdWUgTWF5IDI2IDE2OjUwOjU5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYzogZG8gYnl0ZSByZWxvY3MgY29ycmVjdGx5Ci0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IG5ldmVyIGxvYWQgSU5GTyBzZWN0aW9ucwotCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IHJlbG9jYXRlIElORk8gc2VjdGlvbnMKLQotV2VkIE1heSAyMCAwODoxODoxOCAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogc2VjdGlvbi5jIChiZmRfKl9zeW1ib2wsIGJmZF8qX3NlY3Rpb24pOiBJbml0aWFsaXplIHN0YXRpY2FsbHkuCi0JTWFrZSB0aGUgc3ltYm9scyB1bm1vZGlmaWFibGUuCi0JKGJmZF9zZWN0aW9uX2luaXQpOiBEZWxldGVkLgotCSogaW5pdC5jIChiZmRfaW5pdCk6IERvbid0IGNhbGwgYmZkX3NlY3Rpb25faW5pdC4KLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBFbnN1cmUgdGhhdCByYW5nZSB0byBiZQotCXdyaXR0ZW4gaXMgd2l0aGluIHNlY3Rpb24gYm91bmRhcmllcy4KLQkoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuICBEb24ndCBib3RoZXIgZGlzcGF0Y2hpbmcgaWYKLQlzaXplIGlzIHplcm8uCi0KLQkqIGxpYmJmZC5jIChiZmRfeG1hbGxvYyk6IFRleHQgb2YgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgY29uc3QuCi0KLQkqIGNvZmYtaTk2MC5jIChob3d0b190YWJsZSk6IERlbGV0ZWQuCi0JKGhvd3RvX3JlbGxvbmcsIGhvd3RvX2lwcm1lZCwgaG93dG9fb3B0Y2FsbCk6IE5ldyB2YXJzOwotCWludGVyZXN0aW5nIGVudHJpZXMgZnJvbSBvbGQgaG93dG9fdGFibGUuCi0JKFJUWVBFMkhPV1RPKTogQWRqdXN0ZWQgdG8gdXNlIHN3aXRjaC4KLQkoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBhdXgKLQlyZWNvcmRzIGZvciBzZWN0aW9uIHN5bWJvbC4KLQkobWFrZV9hYnNfc2VjdGlvbik6IFVudXNlZDsgZGVsZXRlZC4KLQkocmVudW1iZXJfc3ltYm9scyk6IFJlLW9yZGVyIHN5bWJvbHMgc28gdW5kZWZpbmVkIHN5bWJvbHMgY29tZQotCWxhc3QsIGFzIENPRkYgZm9ybWF0IGRlc2lyZXMuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogUHV0IENfRklMRSBzeW1ib2xzIGluIGRlYnVnIHNlY3Rpb24gYWx3YXlzLgotCShjb2ZmX3NlY3Rpb25fc3ltYm9sKTogTmV3IGZ1bmN0aW9uOyBjcmVhdGVzIGEgc3ltYm9sIHdpdGggdGhlCi0Jc2FtZSBuYW1lIGFzIGEgc2VjdGlvbiwgYW5kIHNldHMgdXAgYXV4IHJlY29yZHMgZm9yIGl0LgotCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb247IGFkZHMgc2VjdGlvbiBzeW1ib2xzIHRvCi0Jc3ltYm9sIHRhYmxlIGlmIHRoZXkgYXJlbid0IHRoZXJlIGFscmVhZHkuICBTaG91bGQgc29tZWRheSBhbHNvCi0JYWRkIGEgZHVtbXkgQ19GSUxFIHN5bWJvbCBpZiBub25lIGlzIHByZXNlbnQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWRkIG1pc3Npbmcgc3ltYm9scyBiZWZvcmUgcHJlcGFyaW5nCi0Jc3ltYm9sIHRhYmxlIHRvIGJlIHdyaXR0ZW4uCi0JKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBWZXJpZnkgdGhhdCBzeW1ib2wgaW5kaWNlcyByZWFkIGluIGFyZQotCWluIGEgcmVhc29uYWJsZSByYW5nZS4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiBOZXcgZmllbGQgY29udl90YWJsZV9zaXplLgotCShvYmpfY29udl90YWJsZV9zaXplKTogQWNjZXNzb3IgbWFjcm8uCi0KLQkqIGJvdXQuYyAoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uICBIYW5kbGVzIHRocmVlCi0JcmVsb2MgdHlwZXMgb24gaTk2MC4KLQotCSogYmZkLWluLmggKGJmZF9nZXRfc2VjdGlvbl9uYW1lKTogTmV3IG1hY3JvLiAgTGlrZQotCWJmZF9zZWN0aW9uX25hbWUsIGJ1dCByZXR1cm5zIHJ2YWx1ZSwgbm90IGx2YWx1ZS4KLQkoYmZkX2dldF9zZWN0aW9uX3ZtYSwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCk6IFNpbWlsYXIuCi0JKGJmZF9nZXRfc2VjdGlvbl9mbGFncyk6IE5vdyByZXR1cm5zIHJ2YWx1ZS4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkIHNldmVyYWwgbmV3IHZhbHVlcywgc29tZQotCWdlbmVyYWwsIHNvbWUgc3BlY2lmaWMgdG8gc3BhcmMgb3IgaTk2MC4KLQotCSogYW91dHguaCAoc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQgVk1BIGZvciBlYWNoIHNlY3Rpb24gYmFzZWQKLQlvbiBwcmV2aW91cyBzZWN0aW9uLiAgSWYgdGV4dCBzZWN0aW9uIFZNQSBkb2Vzbid0IGFwcGVhciB0byBoYXZlCi0JYmVlbiBzZXQsIG1ha2UgYSBiZXN0IGd1ZXNzIGZyb20gdGhlIHR5cGUgb2YgZmlsZS4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEZWZpbmUgYXMgemVybyBpZgotCW5vdCBkZWZpbmVkLgotCShNWSh2ZWMpKTogSW5pdGlhbGl6ZSByZWxvY190eXBlX2xvb2t1cCBmaWVsZC4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfKik6IEV4cG9ydCBhcyBhb3V0XyNfKl9ob3d0b190YWJsZS4KLQkoYmZkX2Vycm9yX3RyYXAsIGJmZF9lcnJvcl92ZWN0b3IpOiBFeHRlcm4sIG5vdCBjb21tb24uCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uICBIYW5kbGVzIGEKLQlmZXcgdHlwZXMgb2YgcmVsb2NzIGZvciBzcGFyYzsgd2lsbCBuZWVkIGVuaGFuY2VtZW50LgotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKTogVXNlIERFRlVOIG1hY3JvIGluIGRlZmluaXRpb24uCi0JKiBjb2ZmLWk5NjAuYyAob3B0Y2FsbF9jYWxsYmFjayk6IExpa2V3aXNlLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGRlZCBmaWVsZHMgcmVsb2NfdHlwZV9sb29rdXAgYW5kCi0JX2JmZF9tYWtlX2RlYnVnX3N5bWJvbC4gIEFsc28gbWlub3IgY29tbWVudCBjaGFuZ2VzLgotCSogc3ltcy5jIChiZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBOZXcgZGlzcGF0Y2hpbmcgbWFjcm8uCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUYWtlIGEgQkZEIHB0ciBhcyBhcmcgcmF0aGVyCi0JdGhhbiBhcmNoIGluZm8sIGFuZCBkaXNwYXRjaCB3aXRoIEJGRF9TRU5ELiAgQ2FsbGVycyBjaGFuZ2VkLgotCSogYXJjaHVyZXMuYyAoc3RydWN0IGJmZF9hcmNoX2luZm8pOiBEZWxldGVkIGZpZWxkCi0JcmVsb2NfdHlwZV9sb29rdXAuCi0JKiBjcHUtKi5jOiBEb24ndCBpbml0aWFsaXplIHRoYXQgZmllbGQuCi0KLQkqIGJmZC1pbi5oIChlbnVtIGJmZF9lcnJvcik6IEFkZCBuZXcgdmFsdWUgImJhZF92YWx1ZSIuCi0JKiBiZmQuYyAoYmZkX2Vycm1zZ3MpOiBOb3cgY29uc3Q7IGFkZGVkIGVudHJ5IGZvciBiYWRfdmFsdWUuCi0JKGJmZF9lcnJtc2cpOiBOb3cgcmV0dXJucyBwdHIgdG8gY29uc3QuCi0JKiBiZmQtaW4uaCAoYmZkX2Vycm1zZyk6IEZpeCBwcm90b3R5cGUuCi0KLQkqIGNhY2hlLmMgKEJGRF9DQUNIRV9NQVhfT1BFTik6IEZpeCB0eXBvIGluIGRvYy4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24pOiBEaXR0by4KLQotCSogc2VjdGlvbi5jIChTZWN0aW9uIE91dHB1dCBkb2MpOiBJbXByb3ZlIGRlc2NyaXB0aW9uIG9mIHVzZSBvZgotCW91dHB1dF9zZWN0aW9uIGFuZCBvdXRwdXRfb2Zmc2V0LgotCi1UdWUgTWF5IDE5IDIzOjQyOjEwIDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogc2NvLWNvcmUuYzogbmV3IGZpbGUgZnJvbSBuZXQuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IGJ1Z2ZpeCBmcm9tIG5ldDoKLQkgIE5vdyB3ZSBoYXZlIHRoZSBoYWlyeSBsaW5rZXIsIGl0J3MgcG9zc2libGUgdG8gbW92ZSBzeW1ib2xzIGZyb20KLQkgIG9uZSBzZWN0aW9uIGludG8gYW5vdGhlci4gIEFjdHVhbGx5IG1ha2UgdGhhdCB3b3JrIQotCi1TYXQgTWF5IDE2IDE3OjU3OjU5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiBmaXggZGVjbGFyYXRpb24gb2YgZnJlZS4KLQotVHVlIE1heSAxMiAxNDowODo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmMgKHBlcmZvcm1fcmVsb2MpOiBmaXggYnVnIGluIGptcC9jYWxsIGV2YWx1YXRpb24KLQkqIGNvZmYtaDgzMDAuYyAocmVsb2NfcHJvY2Vzc2luZyk6IGFsbCByZWxvY3MgYXJlIHJlbGF0aXZlIHRvCi0Jc2VjdGlvbiBzdGFydC4KLQkqIG9wbmNscy5jOiBkb24ndCB1c2UgZmRvcGVuIG9uIERPUyBzeXN0ZW1zCi0KLQlzaG9ydCBwYXRjaGVzIGZyb20gR2xlbm4gS2FzdGVuIChnbGVubkByZWFkeS5jb20pCi0JKiB0YXJnZXQuYzogZW5hYmxlZCBvYXN5cyBzdXBwb3J0Ci0JKiBvYXN5cy5jOiAgSW5zZXJ0IC4gd2hlbiBVTkRFUlNDT1JFX0hBQ0sgaXMgZW5hYmxlZCwKLQlmaXggcHJvYmxlbSB3aGVyZSBhIHJlbG9jYXRpb24gd2hpY2ggY3Jvc3NlZCBhIG1vZGlmaWNhdGlvbiBieXRlCi0JYm91bmRhcnkgZGlkIG5vdCB3b3JrLiBGaXggcHJvYmxlbSB3aGVyZSBhIHJlbG9jYXRpb24gbmVhciB0aGUgZW5kCi0Jb2YgYSBkYXRhIHJlY29yZCBkaWQgbm90IHdvcmsuCi0KLQotVHVlIE1heSAgNSAxODoxMToyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfY29mZl9hcm1hcCk6IG9sZCB2ZXJzaW9ucyBvZiBCRkQgd3JvdGUKLQlhcmNodmllIGhlYWRlciBzdHJpbmcgY291bnRzIHRoZSBlbmRpYW4gd2F5LCB0aGlzIGhldXJpc3RpYyBzZWVzCi0JaG93IGJpZyBhbiBhcmNoaXZlIHN0cmluZyB0byByZWFkIGJ5IHRyeWluZyBpdCBvbmUgd2F5IGFuZCBpZiB0aGUKLQlzdHJpbmcgdGFibGUgaXMgdW5yZWFzb25hYmx5IGJpZywgdHJ5aW5nIGl0IHRoZSBvdGhlci4gKkZJWE1FKi4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IGNhbid0IGRvIGZkb3BlbnMgb24gVk1TCi0KLVR1ZSBNYXkgIDUgMTQ6MTg6MjQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIEluY3JlYXNlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTcsIGZvciBjb25zaXN0ZW5jeQotCXdpdGggLi4vYmludXRpbHMuCi0JKiBNYWtlZmlsZS5pbjogIGRvY2RpciBpcyAuL2RvYywgbm90ICR7c3JjZGlyfS9kb2MuCi0KLU1vbiBNYXkgIDQgMTE6NDk6MTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBiZmQtaW4uaDogYnVtcCB2ZXJzaW9uIHRvIDEuOTYKLSAgICAgICAgIE1ham9yIGNoYW5nZTsgY2hhbmdlZCBjYWxsaW5nIGNvbnZlbnRpb24gZm9yCi0JIGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgc28gdGhhdCBjYWxsZXIgYWxsb2NhdGVzCi0JIG1lbW9yeSBmb3Igc2VjdGlvbiBkYXRhLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSwgcmVsb2MuYywKLQlzZWNsZXQuYywgdGFyZ2V0cy5jLCBiZmQuYzogcmVmbGVjdCBuZXcgY29udmVudGlvbi4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogaWYgc3R5cF9mbGFncyBpcyBub3QgYSBzcGVjaWFsCi0JY2FzZSwgdGhlbiB1c2UgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgU0VDXyogZmxhZ3MuCi0KLUZyaSBNYXkgIDEgMTI6NTg6MzQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogdXNlIFJFTFNaIHRvIHdvcmsgb3V0Ci0Jc2l6ZSBvZiBvdXRwdXQgcmVsb2Mgc3RydWN0LgotCSogdGFyZ2V0cy5jLCBNYWtlZmlsZS5pbjogY29tbWVudCBvdXQgdGVraGV4IGZvciB0aGUgbW9tZW50LgotCSogaWVlZS5jOiBpZiBzb21lIHBsYWNlcyB3aGVyZSBudWxsIHBvaW50ZXJzIHdlcmUgdXNlZCBpbnN0ZWFkIG9mICZiZmRfYWJzX3NlY3Rpb24uCi0JKiBjb25maWd1cmUuaW46IHRhbmRlbSB0YXJnZXQgaXMgc3QyMDAwCi0JKiBjb2ZmLW02OGsuYzogcmVuYW1lIHN0YXRpYyBob3d0b190YWJsZSB0byBnbG9iYWwKLQltNjhrY29mZl9ob3d0b190YWJsZS4KLQkqIGJvdXQuYzogcmVtb3ZlIHVubmVjZXNzYXJ5IGFib3J0Ci0JKiBjb2ZmLWEyOWsuYzogdmFyaW91cyBjaGFuZ2VzIHRvIHRoZSB3YXkgcmVsb2NhdGlvbnMgd29yayB0byBjb3BlCi0Jd2l0aCB0aGUgIm5ldyBvcmRlciIgYW5kIGxhdGVudCBidWdzLgotCSogY29mZmNvZGUuaDogbGludAotCi1XZWQgQXByIDI5IDEyOjM3OjA3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X3N3YXBfZXh0X3JlbG9jX291dCwgYW91dF9zd2FwX3N0ZF9yZWxvY19vdXQpCi0JYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IHRyZWF0IGFicyBzdW1ib2xzIHRoZSByaWdodCB3YXkuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybS1yZWxvY2F0aW9uKTogZG9uJ3QgcmVsb2NhdGUgcmVmcyB0bwotCWFic29sdXRlIHN5bWJvbHMgaWYgZG9pbmcgYSBwYXJ0aWFsIGxpbmsuCi0KLUZyaSBBcHIgMjQgMDc6MzU6MjYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIGEyOWstYW1kLXVkaS4KLQotVGh1IEFwciAyMyAxODozNzo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF88Yml0cz5fc3dhcF9leGVjX2hlYWRlcl9pbik6ICBaZXJvIG91dCB0aGUKLQlpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgdGhhdAotCWFyZSB1c2VkLCBzbyB0aGF0IHRoZSB1bnVzZWQgZmllbGRzIGFyZSBpbiBhIGtub3duIHN0YXRlLgotCi1XZWQgQXByIDIyIDA5OjM2OjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0ZWtoZXguYyAoc3RydWN0IGRhdGFfc3RydWN0KTogIENvbnZlcnQgZnJvbSB0eXBlZGVmIHRoYXQKLQl0eXBlZGVmcyBub3RoaW5nIHRvIGEgbm9ybWFsIHN0cnVjdHVyZSBkZWNsYXJhdGlvbi4KLQkqIHRla2hleC5jIChwYXNzX292ZXIpOiAgUHJvdG90eXBlIGFyZ3MgZm9yIGZ1bmN0aW9uIHRoYXQKLQlzZWNvbmQgYXJnIHBvaW50cyB0by4KLQotTW9uIEFwciAyMCAyMjoyMjo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgb2xkIHN0eWxlIHN0YWdpbmcuICBEbyBub3QgcHJpbnQgcmVjdXJzaW9uCi0JICBsaW5lcy4KLQotCSogTWFrZWZpbGUuaW46IHJld29yayBDRkxBR1Mgc28gdGhhdCBDRkxBR1MgY2FuIGJlIHBhc3NlZCBmcm9tIHRoZQotCSAgTWFrZWZpbGUgY29tbWFuZCBsaW5lLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQkgIFBhc3MgQ0ZMQUdTLgotCi1GcmkgQXByIDE3IDA5OjE1OjMxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYywgTWFrZWZpbGUuaW46IGFkZGVkIHRla2hleAotCSogYW91dHguaCAoc2V0X3NlY3Rpb25fY29udGVudHMpOiBwYWdlcyBzaG91bGQgYmUgcGFkZGVkIHRvIHRoZQotCXNpemUgb2YgYSBwYWdlLCBub3QgdGhlIHNpemUgb2YgYSBzZWdtZW50LgotCSogY29uZmlndXJlLmluOiBhZGRlZCBnbzMyIGhvc3QgYW5kIGkzODYtYW91dCB0YXJnZXQuCi0JKiBpMzg2YW91dC5jLCBsaWJhb3V0Lmg6IG5vdyB3b3JrcyBmb3IgZ28zMiB0YXJnZXQKLQkqIGllZWUuYzogZml4IGJpdCByb3QuCi0JKiBzZWNsZXQuYzogc3VwcG9ydCBmb3IgcGFkZGluZyBzZWNsZXQgdHlwZS4KLQotV2VkIEFwciAxNSAxODoxMTo1OCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAuTk9FWFBPUlQ6Ci0KLVR1ZSBBcHIgMTQgMTQ6MzQ6NDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfYWRkX3N0cnRhYiwgYmZkX2FkZF8yX3RvX3N0cnRhYik6ICBDT05TVCBzcHJlYWRzCi0JbGlrZSBvb3plLgotCSogZWxmLmMgKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBSZXR1cm4gYm9vbGVhbiwgbm90IE5VTEwgKHdoaWNoCi0JY2FuIGJlIHZvaWQgKikuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIElmZGVmLW91dCBkZWJ1Z2dpbmcgY29kZS4KLQlBbHNvIGlmZGVmLW91dCBjb2RlIHRoYXQgYWJvcnRzIG9uIHVuaGFuZGxlZCBzZWN0aW9uIHR5cGVzLgotCi1GcmkgQXByIDEwIDIyOjI5OjE4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmNyMzAwMCBjb25maWcKLQkqIE1ha2VmaWxlLmluIChNSU5VU19HKTogIFBhc3Mgb24gdG8gcmVjdXJzaXZlIG1ha2VzLgotCSogaG9zdHMvbmNyMzAwMC5oLCBjb25maWcvbmNyMzAwMC5taDogIEFkZCBob3N0IGNvbmZpZyBmaWxlcy4KLQotVGh1IEFwciAgMiAxNzo0Mjo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBOb3cgdGhhdCB3ZSBoYXZlIHN5bS5oIGFuZCBzeW1jb25zdC5oLCBjb21waWxlCi0JY29mZi1tc3ltLmMgb24gYWxsIHN5c3RlbXMuCi0JKiBjb25maWcve2RlY3N0YXRpb24ubWgsIGlyaXgzLm1oLCBpcml4NC5taH06ICBSZW1vdmUgY29mZi1tc3ltLm8gZGVwLgotCSogY29mZi1tc3ltLmM6ICBVcGRhdGUgaW5jbHVkZSBmaWxlcyBhbmQgY29tbWVudHM7IGFkZCB3ZWFrZXh0IGJpdC4KLQotV2VkIEFwciAgMSAyMzoxNjozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jLCBiZmQuYywgYm91dC5jLCBjb2ZmY29kZS5oLCBpbml0LmMsIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCBzcmVjLmMsIHN5bXMuYywgY29mZi1oODMwMC5jOiAgTGludC4KLQotU3VuIE1hciAyOSAwOTozNzo1OSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYm91dC5jLCBjb2ZmLWEyOWsuYywgY29mZi1pOTYwLmM6ICBMaW50LgotCSogY29uZmlndXJlLmluOiAgQWRkIG5ldyBob3N0IGFuZCB0YXJnZXQgY29uZmlncy4KLQkqIGVsZi5jIChiZmRfcHJzdGF0dXMsIGJmZF9mcHJlZ3NldCk6ICBBdm9pZCB0eXBlbmFtZSBvZiByZWdpc3RlcgotCXN0cnVjdHMsIHdoaWNoIHZhcnk7IGp1c3QgdXNlIG1lbWJlciBuYW1lLgotCShlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBMaW50LCBmaXggY29tbWVudHMuCi0JKiBjb25maWcvc3BhcmMtZWxmLm10LCBob3N0cy9zeXN2NC5oOiAgTmV3IGNvbmZpZyBmaWxlcy4KLQotU2F0IE1hciAyOCAxMzowNzowMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIEZpeCB0byB1c2Ugb25seSBhIHNpbmdsZQotCWxvY2FsLCBkaXNwb3NhYmxlLCBjb3B5IG9mIHRoZSBleHRlcm5hbCBmb3JtIG9mIHNlY3Rpb24gaGVhZGVyCi0JdGFibGUgYW5kIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMuCi0KLVRodSBNYXIgMjYgMTY6NTk6NTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgU2V0IE1JTklNSVpFIGJhY2sgdG8gMCBmb3IgYSByZWFsIHJlbGVhc2UuCi0KLVR1ZSBNYXIgMjQgMTU6NTc6MDMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlnL2lyaXg0Lm1baHRdLCBob3N0cy9pcml4NC5oOiBhZGQgc3VwcG9ydCBmb3IKLQkgIGlyaXg0LgotCi1Nb24gTWFyIDIzIDIyOjM3OjM0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX3JmZF9pbik6ICByZW1vdmUgJiBmb3IgYXJyYXkgcmVmLgotCi1UdWUgTWFyIDE3IDE0OjEyOjI1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSk6ICBVc2UgQkZEX0FTU0VSVCBtYWNybywKLQlub3QgaW50ZXJuYWwgYmZkX2Fzc2VydCBmdW5jdGlvbiAodHdpY2UpLgotCi1UdWUgTWFyIDE3IDEwOjQ1OjEyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oOiBjaGFuZ2UgYXJfbWF4X25hbWVsZW4gdG8gMTUgKHRoZSByaWdodCB2YWx1ZSkKLQkqIGNvZmYtYTI5aywgY29mZmNvZGUuaDogbW9yZSBoYW5nb3ZlcnMgZnJvbSB0aGUgYmZkX2Fic19zZWN0aW9uCi0JY2hhbmdlCi0KLU1vbiBNYXIgMTYgMTQ6NTc6MjIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogY2hlY2sgZm9yIGJvdXQgYXJjaGl2ZXMgdG9vLgotCSogYm91dC5jOiBtYWtlIGl0IHdvcmsgYWdhaW4uCi0KLVNhdCBNYXIgMTQgMTc6MzA6NDAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfY29yZWZpbGVfbm90ZSk6ICBDYWxsIGJmZF94bWFsbG9jKCkgaW5zdGVhZCBvZiBiYXJlCi0JbWFsbG9jKCkuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiAgQ2FsbAotCWJmZF94bWFsbG9jKCkgaW5zdGVhZCBvZiBiYXJlIG1hbGxvYygpLgotCi1GcmkgTWFyIDEzIDE1OjQ0OjM3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIE1BS0VJTkZPIG9uIGluZm8uCi0KLUZyaSBNYXIgMTMgMDc6NDE6MTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC08Zm9vPiBub3cgPGZvbz4ubXQsIGNvbmZpZy9taC08Zm9vPiBub3cgPGZvbz4ubWguCi0JaG9zdC9oLTxmb28+IG5vdyBqdXN0IDxmb28+LgotCSogY29uZmlndXJlLmluOiByZWZsZWN0IGNoYW5nZXMKLQotVGh1IE1hciAxMiAxMToxNTowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHNldF90ZGF0YSk6ICBNYWtlIGNoYW5nZSBvZiBGZWIgMjcgaW4gdGhlCi0JYWN0dWFsIHNvdXJjZSBmaWxlLCBub3QganVzdCB0aGUgZ2VuZXJhdGVkIGxpYmJmZC5oLgotCi1TYXQgTWFyICA3IDEwOjMzOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoaWNvZmZfbGl0dGxlX3ZlYyk6IGFkZCBDT0ZGX1NXQVBfVEFCTEUgc28gd2UgY2FuIHJ1bgotCWdkYiBvbiBsaXR0bGUtZW5kaWFuIDk2MCBjb2RlLgotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IGluZGlyZWN0IHN5bWJvbHMgc2hvdWxkIGdvCi0JaW50byB0aGUgYXJjaGl2ZSBoZWFkZXIgdG9vLgotCi1GcmkgTWFyICA2IDIxOjU1OjE2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UaHUgTWFyICA1IDIzOjUxOjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1zeW0uYzogIE1vdmUgdGhpcyBmaWxlIGZyb20gZ2RiL2Vjb2ZmLmMuICBJdAotCWhhbmRsZXMgYnl0ZS1zd2FwcGluZyBmb3IgRUNPRkYgKE1JUFMgc3ltYm9sKSBmaWxlcy4KLQkqIGNvbmZpZy9taC1kZWNzdGF0aW9uLCBjb25maWcvbWgtaXJpeDM6ICBBZGQgY29mZi1tc3ltLm8KLQl0byB0aGUgZmlsZXMgYnVpbHQgb24gTUlQUy1iYXNlZCBob3N0cy4KLQkqIE1ha2VmaWxlLmluOiAgQWRkIHJ1bGUgZm9yIGNvZmYtbXN5bS4KLQotVGh1IE1hciAgNSAyMTozNjowNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNsZWFuLWluZm8gdGFyZ2V0LiAgTUlOSU1JWkU9MS4KLQotU3VuIE1hciAgMSAyMjozMjo1OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIE1vdmUgY29yZSBmaWxlIGZ1bmN0aW9ucyBpbnRvIHNlcGFyYXRlCi0JbmV3IGZpbGUgcnM2MDAwLWNvcmUuYy4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcmVhZGluZwotCWNvcmUgZmlsZXMgZGVwZW5kcyBvbiBuYXRpdmUgaW5jbHVkZSBmaWxlcyB0aGF0IGNvbmZsaWN0Ci0Jd2l0aCAuLi9pbmNsdWRlL2NvZmYvcnM2MDAwLmguCi0JKiBjb25maWcvbWgtcnM2MDAwOiAgQWRkIHJzNjAwMC1jb3JlLm8gdG8gSERFUEZJTEVTLgotCi1UaHUgRmViIDI3IDIyOjE5OjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6IERvbid0IHByaW50Ci0Jc3ltYm9sIGFkZHJlc3NzIGZvciB1bmRlZmluZWQgc3ltYm9scy4KLQkqIGNvZmYtcnM2MDAwLmM6ICBWYXJpb3VzIHVwZGF0ZXMgKGR1ZSB0byB0YXJnZXQtCi0JaW5kZXBlbmRlbnQgY2hhbmdlcykuCi0JKiBsaWJiZmQuaDogIERpdHRvICh0ZGF0YSBmaWVsZCBpcyBub3cgYSB1bmlvbikuCi0JKiBob3N0cy9oLXNwYXJjLmg6ICBSZW1vdmVkIHByb3RvdHlwZSBmb3IgYm9ndXMgZnVuY3Rpb24KLQknZW1zZXQnIChwcmVzdW1hYmx5IHNob3VsZCBoYXZlIGJlZW4gJ21lbXNldCcgLSB3aGljaCBpcyB0aGVyZSkuCi0KLVRodSBGZWIgMjcgMTE6NDY6MzMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1iaWctKiB0YXJnZXQpOiAgU2FtZSBpcyBJcmlzLgotCi1UaHUgRmViIDI3IDA5OjI0OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogd2hlbiBjcmVhdGluZyBhbgotCWFsaWFzIHN5bWJvbCwgZmlsbCBpbiB0aGUgc2VjdGlvbiBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuCi0JbGVhdmluZyBpdCBibGFuay4gSWYgYW4gb3V0cHV0IHNlY3Rpb24gY2FuJ3QgYmUgZm91bmQgZm9yIGEKLQlzeW1ib2wsIHRoZW4gZG9uJ3QgY29yZSBkdW1wLgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotV2VkIEZlYiAyNiAxOTo0MDo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6IGxpbnQKLQkqIGNvZmYtaDgzMDAuYzogZml4IHN0dXBpZCByZWxvYyBzdWJ0cmFjdGlvbiBidWcKLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfb3V0KTogb25seSBzd2FwIGEgdHZuZHggYnkgMiBieXRlcywKLQlzaW5jZSB0aGF0J3MgaG93IHdpZGUgaXQgaXMuIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IGFsd2F5cyB6ZXJvIG91dAotCXRoZSBzeW1ib2wuZmxhZ3MgYW5kIGRvbmVfbGluZW5vIGZpZWxkcy4KLQotVHVlIEZlYiAyNSAxNDoyOToyNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9zeW1ib2wpOiB3cml0ZSBvdXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mCi0JYXV4ZW50cy4KLQkqIGNwdS1oODMwMC5jOiBmaXggZGlzYXNzZW1ibHkgYnVnCi0KLUZyaSBGZWIgMjEgMjE6Mzk6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfZXJybXNnKSwgY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbiwKLQlzZWN0aW9uX2Zyb21fYmZkX2luZGV4KSwgY3B1LWg4MzAwLmMgKGhvd3RvKl9jYWxsYmFjayksCi0JcmVsb2MuYywgc2VjdGlvbi5jIChiZmRfbWFwX292ZXJfc2VjdGlvbnMpLCB0YXJnZXRzLmMKLQkoYmZkX3RhcmdldF9saXN0KTogIFByb3RvbGludC4KLQkqIGxpYmJmZC5oOiAgVXBkYXRlIHRvIG1hdGNoIGEgbGliYmZkLWluLmggZnJvbSBhIG1vbnRoIGFnby4KLQotRnJpIEZlYiAyMSAxMDo1Nzo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IGxpbnQsIChjb2ZmX3ByaW50X3N5bWJvbCk6IHByaW50cwotCW91dCB0YWduZHggdG9vLgotCSogYW91dHguaCAoc3dhcF9zdGRfcmVsb2Nfb3V0LCBzd2FwX2V4dF9yZWxvY19vdXQpOiB1c2UgdGhlIG91dHB1dAotCXNlY3Rpb24gb2YgYSBzeW1ib2wgcmF0aGVyIHRoYW4gdGhlIHNlY3Rpb24gb2YgYSByZWZmZWQgc3ltYm9sIHRvCi0JZGV0ZXJtaW5lIHRoZSByX2luZGV4IG9mIGFuIGVtbWl0dGVkIHJlbG9jLgotCi1UaHUgRmViIDIwIDE4OjEwOjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBQT1JUSU5HOiBOZXcgKHByZWxpbWluYXJ5KSBwb3J0aW5nIGd1aWRlLgotCi1XZWQgRmViIDE5IDIxOjM5OjM3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKSwgY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpLCBjb2ZmLW04OGsuYwotCShob3d0b19odnJ0MTYpOiAgbGludC4KLQotTW9uIEZlYiAxNyAxMjowMjoxNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogaHAzMDBic2QuYyAobmV3KSwgY29uZmlnL210LWhwMzAwYnNkOiAgTWFrZSBocDMwMGJzZAotCWEgZnVsbCBjb25maWd1cmF0aW9uICh3aXRoIHBvc3NpYmxlIGNyb3NzLWRldmVsb3BtZW50KSwKLQlpbnN0ZWFkIG9mIHVzaW5nIGhvc3QtYW91dC5jLgotCi1TdW4gRmViIDE2IDEzOjAxOjQ5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpOgotCVNldCBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkuCi0JKiBnZW4tYW91dC5jOiAgQ2hhbmdlIHRvIGVtaXQgYSAuYyBmaWxlcywgbm90IGEgLmggZmlsZS4KLQotVGh1IEZlYiAxMyAyMDoxMTo0NyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgUmVtb3ZlIG9ic29sZXRlIHVzZSBvZgotCUJTRl9BQlNPTFVURSBhbmQgcmVwbGFjZSB3aXRoIGJmZF9hYnNfc2VjdGlvbiByZWZlcmVuY2UuCi0KLVRodSBGZWIgMTMgMTc6MjI6NDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGdldF9ub3JtYWxpemVkX3N5bXRhYik6IGZpeGVkIGJ1ZyB3aGVyZSBzeW1ib2xzCi0Jd2l0aCBtb3JlIHRoYW4gb25lIGF1eGVudCBjYW4gY2F1c2UgbmFzdHkgY29yZSBkdW1wcy4KLQotCSogY29mZmNvZGUuaCwgbGliY29mZi5jOiBhZGRlZCBuZXcgZmllbGRlZCB0byBjb2ZmX3N5bWJvbF9zdHJ1Y3QKLQkiZG9uZV9saW5lbm8iIHNvIHRoYXQgYSBzeW1ib2wgd2hpY2ggYXBwZWFycyB0d2ljZSBpbiB0aGUgc3ltYm9sCi0JdGFibGUgb25seSBnZXRzIGl0J3MgbGluZW51bWJlcnMgcmVsb2NhdGVkIG9uY2UuIE1vZGlmZWQKLQkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKSBhbmQgKGNvZmZfbWFrZV9lbXB0eV9zeW1ib2wpIHRvIG1ha2UKLQl1c2Ugb2YgaXQuCi0KLVR1ZSBGZWIgIDQgMTU6Mzk6NTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4Lmg6ICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogZml4IGNvbnN0cnVjdG9yCi0Jc3R1ZmYgdG8gdXNlIHRoZSBOZXcgT3JkZXIuCi0KLUZyaSBKYW4gMzEgMDE6MzQ6NDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jOiAgQ2hhbmdlIHR5cGUgb2YgZW52aVtdIHRvIHVuc2lnbmVkIGNoYXIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIGZpeCB2YXggdWx0cml4IGNvbmZpZ3VyYXRpb24uCi0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgRGVhbCB3aXRoIG51bGwgcmV0dXJuIGZyb20KLQliZmRfbWFrZV9zZWN0aW9uKCkuICAoZWxmX29iamVjdF9wKTogIFNlbGVjdCBlbmRpYW5lc3MgcHJvcGVybHkuCi0KLUZyaSBKYW4gMzEgMDE6MTk6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtdGFob2UuaCwgaC12YXhic2QuaDogIEZpeCBzdGFjayBpbiBjb3JlIGZpbGVzLgotCi1UaHUgSmFuIDMwIDIzOjUxOjA3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIGhvc3QtYW91dC5jIGRvZXNuJ3QgZGVwZW5kIG9uIGFvdXQtcGFyYW1zLmguCi0JKiBhb3V0LXRhcmdldC5oOiAgVXNlIFRBUkdFVF9CSUdfRU5ESUFOX1AgdG8gc2V0IHVwIHZlY3Rvci4KLQkqIGhvc3QtYW91dC5jOiAgRG9uJ3QgdXNlIGFvdXQtcGFyYW1zLmg7IGNvbmZpZ3VyZSB0aGVzZSBzeXN0ZW1zCi0JaW4gdGhlaXIgeG0gZmlsZXMsIG5vdCBpbiBhIHJhbmRvbWx5IGdlbmVyYXRlZCBmaWxlLgotCSogaG9zdHMvaC1ocDMwMGJzZC5oLCBoLXRhaG9lLmgsIGgtdmF4YnNkLmgsIGgtdmF4dWx0Lmg6Ci0JU3BlY2lmeSBieXRlIG9yZGVyLgotCSogaG9zdHMvaC12YXhic2QuaDogIERlZmluZSB0aGUgZm9ybSBvZiBleGVjIGFuZCBjb3JlIGZpbGVzLgotCi1UaHUgSmFuIDMwIDEzOjAyOjQxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtdGFob2UsIGNvbmZpZy9tdC12YXg6ICBDaGFuZ2UgREVGQVVMVF9WRUNUT1IgdG8KLQlob3N0X2FvdXRfdmVjIGhlcmUgYXMgd2VsbC4KLQotVGh1IEphbiAzMCAxMTo0MTo0NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0LWFvdXQuYzogIENoYW5nZSBUQVJHRVROQU1FIHRvICJhLm91dCIgdG8gYmUgY29tcGF0aWJsZSB3aXRoCi0JZ2RiLiAgY29uZmlnL210LWhwMzAwYnNkOiAgQ2hhbmdlIERFRkFVTFRfVkVDVE9SIHRvIGhvc3RfYW91dF92ZWMKLQl0byBwcmV2ZW50IHVuZGVmaW5lZCBzeW1ib2wuCi0KLVRodSBKYW4gMzAgMDc6MjY6NTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQlWYXJpb3VzIGxpbnRzIGZvdW5kIG9uIFBlcnNTb255Ci0JKiBhb3V0eC5oOiBjYXN0IGFuIGVudW0KLQkqIGNvZmYtYTI5ay5jOiBtYW55IGludHMgaW4gcmVsb2Mgc3RydWN0dXJlIHR1cm5lZCB0byBlbnVtCi0JKiBjb2ZmY29kZS5oOiBtb3JlIGVudW1zCi0JKiBjcHUtaDgzMDAuYzogbW9yZSBlbnVtcwotCSogb3BuY2xzLmM6IG1vcmUgZW51bXMKLQotVGh1IEphbiAzMCAwMToxOTo1NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgTWFrZSBUYWhvZSBjb25maWd1cmF0aW9uIHdvcmsgYWdhaW4uCi0JKiBiZmQtaW4uaDogIFJlbW92ZSB0cmFpbGluZyBjb21tYSBmcm9tIGVudW0gZGVjbGFyYXRpb24uCi0JKiBpZWVlLmM6ICBDYW4ndCBwdXQgYnl0ZSB2YWx1ZXMgPjB4N0YgaW50byBhIHNpZ25lZCBjaGFyLgotCi1UdWUgSmFuIDI4IDIxOjEwOjUxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBkZXBlbmRlbmNpZXMgZm9yIHZhcmlvdXMgY29mZi0qLm8gZmlsZXMuCi0KLQkqIGVsZi5jOiAgUmVtb3ZlIGV4dHJhbmVvdXMgcGFyZW4gZnJvbSBjb3JlX3BycHNpbmZvIGFuZAotCWNvcmVfcHJwc3RhdHVzIG1hY3JvcywgcmVuYW1lIGNvcmVfcHJwc3RhdHVzIHRvIGNvcmVfcHJzdGF0dXMuCi0JUmVwbGFjZSByZWZlcmVuY2VzIHRvIG9sZCBzZWN0aW9uICJzaXplIiBtZW1iZXIgd2l0aCBuZXcKLQkiX3Jhd19zaXplIiBtZW1iZXIuICBJbXBsZW1lbnQgZWxmX21ha2VfZW1wdHlfc3ltYm9sLCB3aGljaAotCWlzIG5vdyB1c2VkLgotCi1UdWUgSmFuIDI4IDE0OjUxOjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jLCBiZmQuYywgLi4vaW5jbHVkZS9iZmQuaDogIFZhcmlvdXMgZml4ZXMgZm9yIFBNQVgKLQljb3JlIHJlYWRpbmcuCi0KLVR1ZSBKYW4gMjggMTA6NDY6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3JlbGF4X3NlY3Rpb24pOiBub3cgc3RhdGljLgotCShiZmRfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiB2YXJpb3VzIHR5cGUgbGludHMuCi0KLU1vbiBKYW4gMjcgMTk6NDQ6MDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQlOZXcgZW50cnkgcG9pbnQgaW4gdGhlIHRyYW5zZmVyIHZlY3RvciAtIGJmZF9yZWxheF9zZWN0aW9uLgotCi0JKiBhb3V0LXRhcmdldC5oOiBhZGQgdG8gdmVjdG9yLCBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIGJmZC1pbi5oOiBhZGQgdG8gdmVjdG9yCi0JKiBiZmQuYzogYWRkICNkZWZpbmUgZm9yIHZlY3RvcgotCSogYm91dC5jOiBhZGQgdG8gdmVjdG9yLCBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIGNvZmZjb2RlLmg6IGFkZCB0byB2ZWN0b3IsIGFsc28gbm93IGhhcyBjb2ZmIHNwZWNpZmljIHJlbGF4IGNvZGUKLQlmb3IgdGhlIHJlbGF4YWJsZSBIOC8zMDAgcmVsb2NzLiBBbHNvIGNsZWFuIHVwIGFicyBzZWN0aW9uIGNydWZ0LgotCSogZWxmLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogaWVlZS5jOiBjYWxsIG5ldyB2ZWN0b3IsIGNsZWFuIHVwIHNvbWUgYnVncyBkdWUgdG8gdGhlIGNyZWF0aW9uCi0Jb2YgYmZkX2Fic19zZWN0aW9uCi0JKiBsaWJiZmQuaDogYWRkIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24gRVhGVU4KLQkqIG9hc3lzLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogcmVsb2MuYzogaW1wbGVtZW50IGdlbmVyaWNfcmVsYXgKLQkqIHNlY2xldC5jOiBtb3ZlZCBtdWNoIG9mIHRoaXMgaW50byBjb2ZmY29kZS5oCi0JKiBzcmVjLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogdGFyZ2V0cy5jOiBkZWZpbmUgbmV3IHRyYW5zZmVyIHZlY3RvcgotCi1GcmkgSmFuIDI0IDE0OjQwOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBldmVyeXRoaW5nOiBub3cgbW9kaWZpZWQgdG8gdXNlIHNtYWxsZXIgcmVsb2MgdHlwZS4gU2VsZiBob3N0cwotCW9uIHN1bjMgJiBzdW40LgotCi1TYXQgSmFuIDE4IDE3OjAwOjE2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3RyYXR1cywgY29uZmlnL210LWk4NjAtZWxmLCBob3N0cy9oLXN0cmF0dXM6Ci0JTmV3IGZpbGVzIGZvciBzdHJhdHVzLgotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgY29uZmlndXJhdGlvbiBmcmFnbWVudHMgZm9yIHN0cmF0dXMuCi0KLVdlZCBKYW4gMTUgMTA6MDI6NDMgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBEZWNsYXJlIHZhcmlvdXMgZmlsZW5hbWUKLQl2YXJpYWJsZXMgYXMgQ09OU1Qgc2luY2UgdGhleSBhcmUgc2V0IHRvIHBvaW50IHRvIGEgY29uc3QgY2hhcgotCXN0cmluZy4gIEZpeGVzIGNvbXBpbGVyIGNvbXBsYWludHMuCi0KLUZyaSBKYW4gMTAgMTc6NDQ6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtYW1peC5oIGhvc3RzL2gtaTM4NnY0Lmg6ICBDaGFuZ2UgYWJvcnQoKSB0byBhIGZ1bmN0aW9uCi0JcmV0dXJuaW5nIHZvaWQuCi0KLUZyaSBKYW4gMTAgMTQ6MzM6MzIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiAgUmVjb2duaXplIE5fU09MCi0Jc3ltYm9scywgc28gdGhhdCB3ZSBjYW4gZW1pdCB0aGUgY29ycmVjdCBmaWxlIG5hbWUgZXZlbgotCWlmIGl0J3MgYW4gaW5jbHVkZSBmaWxlLgotCi1UaHUgSmFuICAyIDE2OjQzOjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYzogIEFkZCBDT0ZGX1NXQVBfVEFCTEUgdG8gbGl0dGxlX3ZlYyBhcyB3ZWxsIGFzIGJpZ192ZWMuCi0JKFJlcG9ydGVkIGJ5IGpvaG5AbGFidGFtLmxhYnRhbS5vei5hdSAoSm9obiBDYXJleSkpLgotCi1XZWQgSmFuICAxIDA0OjIzOjA2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIENoYW5nZSBhbGwgJyNpZiBIQVZFX1BST0NGUycgdG8gJyNpZmRlZiBIQVZFX1BST0NGUycuCi0KLQkqIGNvbmZpZy9taC1hbWl4LCBjb25maWcvbWgtaTM4NnY0OiAgUmVtb3ZlIEhERUZJTkVTIHRoYXQgd2FzCi0JYmVpbmcgdXNlZCB0byAtREhBVkVfUFJPQ0ZTLgotCi0JKiBob3N0cy9oLWFtaXgsIGhvc3RzL2gtaTM4NnY0OiAgQWRkICcjZGVmaW5lIEhBVkVfUFJPQ0ZTJy4gIE1vdmUKLQknI2luY2x1ZGUgImZvcGVuLXNhbWUuaCInIHRvIGVuZCBvZiBmaWxlIHRvIG1hdGNoIG90aGVyIGgtKiBmaWxlcy4KLQotRnJpIERlYyAyMCAxMjowNjoxNyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4gIEFkZCBjYXNlCi0JInVua25vd24iIGZvciB0YXJnZXQgdmVuZG9yIGFuZCBpbmZlciBzb21lIHRhcmdldHMgYmFzZWQKLQlvbiB0aGUgc3BlY2lmaWVkIG9wZXJhdGluZyBzeXN0ZW0uCi0KLVdlZCBEZWMgMTggMTc6MTc6NTkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmgsIGxpYmFvdXQuaDogIEFOU0lmeSBlbnVtcy4KLQotV2VkIERlYyAxOCAxNjoxMjoyNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChub3JtYWxpemUpOiBjcmVhdGVkIHZlcnNpb24gZm9yIFZNUyB3aGljaCByZW1vdmVzIHRoZQotCVZNUyBkaXJlY3RvcnkgY3JhcCBmcm9tIHRoZSBmcm9udCBhbmQgZW5kIG9mIGEgZmlsZW5hbWUsIGVnIHR1cm4KLQlbLS5mb29dYmFyLm9iajsxMjMgaW50byBiYXIub2JqCi0JKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IG5vdyB3cml0ZXMgaW5kZXggaW50byBhbgotCWV4dGVuZGVkIG5hbWUgdGFibGUgaW4gZGVjaW1hbCAtIHRoZSBzYW1lIGJhc2UgdXNlZCB0byByZWFkIGFuCi0JZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotV2VkIERlYyAxOCAxNDo0MDozOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC1lbmNhcC5jOiAgRml4IHRvIHVzZSBhb3V0LXRhcmdldC5oLgotCSogYW91dGYxLmg6ICBVc2Ugc3RhbmRhcmQgTVlfb2JqZWN0X3AgYW5kIE1ZX2NhbGxiYWNrCi0JaW4gYW91dC10YXJnZXQuaC4gIFJlbW92ZSB0YXJnZXQtc3BlY2lmaWMgdmVyc2lvbnMuCi0JKiBob3N0LWFvdXQuYzogIFJlLXdyaXRlIHRvIHVzZSBhb3V0LXRhcmdldC5oLgotCSogZ2VuLWFvdXQuYzogIE5ldyBmaWxlcyB1c2Ugd2l0aCBob3N0LWFvdXQuYyB0byBnZW5lcmF0ZQotCWhvc3Qtc3BlY2lmaWMgYS5vdXQtcmVsYXRlZCBwYXJhbWV0ZXJzLgotCSogTWFrZWZpbGUuaW46ICBob3N0LWFvdXQubyBkZXBlbmRzIG9uIGFvdXQtcGFyYW1zLmgsIHdoaWNoIGlzCi0JZ2VuZXJhdGVkIGJ5IGdlbi1hb3V0LgotCSogYW91dC10YXJnZXQuaDogIE1ha2UgYSBsaXR0bGUgbW9yZSBmbGV4aWJsZS4KLQkqIGxpYmFvdXQuaCwgYW91dC10YXJnZXQuaDogIFJlbW92ZWQgV09SS19PVVRfRklMRV9QT1NUSU9OUwotCW1hY3JvLiAgSW5zdGVhZCwgaW5saW5lIGl0IGluIGFvdXQtdGFyZ2V0LmguCi0JKiBuZXdzb3MzLmM6ICBEZWZpbmUgTl9TSEFSRURfTElCKHgpIGFzIDAgdG8gYXZvaWQKLQlhIGdjYyAtV2FsbCB3YXJuaW5nLgotCSogYXJjaGl2ZS5jOiAgQWRkIG1pc3NpbmcgY29tbWFzIGluIERFRlVOIG1hY3JvICgyIHBsYWNlcykuCi0JKiBlbGYuYywgY29mZmNvZGUuaCwgYW91dGYxLmg6ICBVc2UgQU5TSSBmdW5jdGlvbnMgaW5zdGVhZCBvZgotCUJlcmtlbGV5IG9uZXMsIG5vdyB0aGF0IGxpYmliZXJ0eSBoYXMgdGhlbToKLQliY29weS0+bWVtY3B5LCBiemVyby0+bWVtc2V0LCBiY21wLT5tZW1jbXAuCi0JKiBhb3V0eC5oOiAgVmFyaW91cyB0b3VjaC11cHM6ICBSZS1mb3JtYXR0aW5nLCBmaXggYSBjYXN0LAotCXJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0KLVR1ZSBEZWMgMTcgMTk6NDg6NTkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogIEVuY2xvc2UgY29yZW5hbWUKLQlhbmQgZXhlY25hbWUgaW5zaWRlIEhBVkVfUFJPQ0ZTIGlmZGVmIHNpbmNlIHRoZXkgYXJlIHVudXNlZAotCXdoZW4gaXQgaXMgbm90IGRlZmluZWQuCi0KLU1vbiBEZWMgMTYgMTI6MDA6MTAgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgRmxhZyBhbGwgc2VjdGlvbnMgYXMgZWl0aGVyIGNvZGUgb3IgZGF0YS4gIFdlIGNhbid0Ci0JYmUgc3VyZSB3aGF0IHRoZXkgYXJlIGFueXdheSwgc2luY2UgRUxGIGRvZXNuJ3QgZml0IHRoZQotCXRyYWRpdGlvbmFsIG1vZGVsIG9mIHRleHQrZGF0YStic3MgdmVyeSB3ZWxsLiAgQWRkIG5ldyBsb2NhbAotCWZ1bmN0aW9uIGVsZl9yZWFkKCkgdG8gc2ltcGxpZnkgY29kZS4gIFJlY29yZCBlbnRyeSBwb2ludCBpbgotCXRoZSBiZmQgc3RydWN0dXJlLgotCi1UaHUgRGVjIDEyIDIxOjAxOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLSouaDogIENvbmZpZ3VyZSBmb3BlbiB1c2luZyAuLi9pbmNsdWRlL2ZvcGVuLSouaAotCXJhdGhlciB0aGFuIE4gY29waWVzIG9mIHRoZSBzYW1lIGxpbmVzLgotCi1XZWQgRGVjIDExIDE2OjM5OjQ1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcHUtaDgzMDAuYzogZGlzYXNzZW1ibGUgYnJhbmNoIGRpc3BsYWNlbWVudHMgY29ycmVjdGx5Ci0JKiBjb2ZmLWg4MzAwLmM6IHB1dCByZWxvYyBvZmZzZXRzIG91dCBpbiAzMmJpdHMKLQotCSogbWFrZWZpbGUuZG9zLCBjb25maWdkai5iYXQ6IE5ldyBmaWxlcyBmcm9tIERKCi0JKiBjYWNoZS5jOiBmb3BlbiB3aXRoIG5ldyBtYWNyb3MgaXMgbmVlZGVkIGZvciBET1MuCi0JKiBpZWVlLmM6IGVudmlyb24gcmVuYW1lZCB0byBlbnZpIHRvIHN0b3AgYW4gaW5jbHVkZSBmaWxlCi0JY29uZmxpY3QuCi0JKiBvcG5jbHMuYywgY29mZi1yczYwMDAuYzogbW9yZSBmb3BlbnMgd2l0aCBtYWNyb3MuCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjQgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLVNhdCBEZWMgIDcgMTY6Mzk6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkgKiBNYWtlZmlsZS5pbjogZml4IHdoZXJlIGRvY2RpciBsaXZlcwotCi0JICogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBiZmQuYywgY2FjaGUuYywgY29mZi1tODhrLmMsCi0JIGNvZmZjb2RlLmgsIGNvcmUuYywgY3Rvci5jLCBlbGYuYywgZm9ybWF0LmMsIGllZWUuYywgaW5pdC5jLAotCSBsaWJiZmQuYywgbGliYmZkLmgsIGxpYmNvZmYuaCwgb3BuY2xzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywKLQkgc3JlYy5jLCBzeW1zLmMsIHRhcmdldHMuYyA6IGFsbCBuZXcgZG9jdW1lbnRhdGlvbiBhbmQgbGludAotCSByZW1vdmFsLgotCi0KLVNhdCBEZWMgIDcgMDc6MjI6MDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmgsIHNyZWMuYzogIExpbnQuCi0KLUZyaSBEZWMgIDYgMjI6NTg6NDggMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCB1c2luZyBJTlNUQUxMX0RBVEEsIGFkZGVkIHN0YW5kYXJkcy50ZXh0Ci0JICBzdXBwb3J0LgotCi0JKiBjb25maWd1cmUuaW46IG1hcmsgZGlyZWN0b3J5IGFzIHRhcmdldCBkZXBlbmRlbnQuICBjb25maWd1cmUKLQkgIG5vd3Mgd29ya3MgaW4gb2JqZGlyIGFsd2F5cyBzbyBtYWtlIGZpbGUgZXhpc3RlbmNlIGNoZWNrcwotCSAgYWdhaW5zdCAke3NyY2Rpcn0uCi0KLVRodSBEZWMgIDUgMjI6NDY6MTkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1XZWQgRGVjICA0IDEwOjE0OjE3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3NfPHNpemU+X29iamVjdF9wLCBzdW5vczRfY2FsbGJhY2spOiBtb3ZlZCB0aGUKLQljb21wdXRhdGlvbiBvZiBhcmNoIGFuZCBtYWNoaW5lIHR5cGUgc28gaXQncyB3b3JrZWQgb3V0IGJlZm9yZQotCXNvbWVfYW91dF9vYmplY3RfcCBpcyBjYWxsZWQuCi0JKiBhb3V0eC5oOiAoc29tZV9hb3V0X29iamVjdF9wKTogZG9uJ3Qgc2V0IGFyY2ggYW5kIG1hY2ggdG8KLQl1bmtub3duLgotCSogYXJjaHVyZXMuYzogYWRkIGV4dHJhIGZpZWxkICdzZWN0aW9uX2FsaWduX3Bvd2VyJyB0byBob2xkCi0JZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBpbiBvYmplY3QgZmlsZXMuCi0JKiBjcHUtYTI5ay5jLCBjcHUtaDgzMDAuYywgY3B1LWkzODYuYywgY3B1LWk5NjAuYywgY3B1LW02OGsuYywKLQljcHUtbTg4ay5jLCBjcHUtbWlwcy5jLCBjcHUtcnM2MDAwLmMsIGNwdS1zcGFyYy5jLCBjcHUtdmF4LmM6Ci0JaW5pdGlhbGl6ZSB0aGUgbmV3IGZpZWxkLgotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IHJlcGxhY2UgdGhlIHRleHQgc2l6ZSwgc2luY2UgYW91dAotCWZyaWVzIHRoZW0uCi0JKiBhb3V0eC5oOiBEb2N1bWVudGF0aW9uIGluIHRoZSBuZXcgc3R5bGUKLQotV2VkIERlYyAgNCAwMjowMDozMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfbXRpbWUpOiAgRG9uJ3QgY2FjaGUgbXRpbWUgYW55IG1vcmU7IG9ubHkKLQl1c2UgdGhlIHNhdmVkIHZhbHVlIGlmIG10aW1lX3NldCBpcyBhbHJlYWR5IHNldCAoaW50ZW5kZWQKLQlmb3IgYXJjaGl2ZSBmaWxlcywgdGhvdWdoIGFwcGFyZW50bHkgbm90IHVzZWQgeWV0KS4KLQotVHVlIERlYyAgMyAyMjo1NDo1MCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiAgUmV2aXNlIGNvbW1lbnRzIGFib3V0IGhvdyB0byBjb25maWd1cmUgdGhlIHRhcmdldAotCXZlY3RvciwgdG8gbWF0Y2ggcmVhbGl0eS4gIFJlbW92ZSBtZW50aW9uIG9mIG9ic29sZXRlIG1ldGhvZHMuCi0JUmVtb3ZlIGxvbmcgbGlzdHMgb2YgY2FwaXRhbGl6ZWQgbWFjcm9zIHRoYXQgdHVybiBpbnRvIHRoZSBzYW1lCi0JdGhpbmcgaW4gbG93ZXJjYXNlLiAgTm9ybWFsIHZlY3RvciBzaW1wbHkgbGlzdHMgYWxsIGtub3duCi0JbG93ZXJjYXNlIHh2ZWMgbmFtZXM7IGFsbCBvdGhlciBjYXNlcyBhcmUgaGFuZGxlZCBieSBTRUxFQ1RfVkVDUy4KLQotCSogY29uZmlnL210LWkzODYtY29mZjogIFNldCBERUZBVUxUX1ZFQ1RPUiB0byByZWFsIGlkZW50aWZpZXIsCi0Jbm90IG1hY3JvIG5hbWUuCi0KLQkqIGNvbmZpZy9tdC1pOTYwLXtjb2ZmLGJvdXR9OiAgVXNlIFNFTEVDVF9WRUNTIHRvIG1ha2UgYSBzaG9ydAotCWxpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldHMuCi0KLVR1ZSBEZWMgIDMgMTQ6MDY6MTUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogIFRoZSBwYWQgYnl0ZSBzb21ldGltZXMgYWRkZWQgdG8KLQl0aGUgc3RyaW5nIHRhYmxlIGluIGEgX18uU1lNREVGIG1lbWJlciBpcyBub3cKLQljb3VudGVkIGFzIHBhcnQgb2YgdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0YWJsZS4KLQlUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIHJhbmxpYiwgYXMgd2VsbCBhcyBTdW4ncy4KLQotVHVlIERlYyAgMyAxMDo1MzozMCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jOiBSZXdyb3RlIHRvIGZpeCBtYW55IGJ1Z3M7IG5vdyBnZXRzIHRoZSByZWNvcmQgdHlwZQotCXJpZ2h0LCBkb2Vzbid0IGNob2tlIG9uIGlucHV0LCBzZXRzIHRoZSBzdGFydCBhZGRyZXNzIGluIGFuIFM5IGFuZAotCWZpbGxzIGluIHRoZSBmaWxlbmFtZSBvbiBhbiBTMC4KLQotU2F0IE5vdiAzMCAyMToxOToxNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4MzAwLmM6IEFkZCBzdXBwb3J0IGZvciBNRU1JTkQgYWRkcmVzc2luZyBtb2RlCi0KLQkqIGNvZmYtYTI5ay5jOiBkZWZpbmVkIFJFTE9DX1BST0NFU1NJTkcgdG8gdGFrZSB0aGUgI2lmZGVmIG91dCBvZgotCWNvZmZjb2RlLmgKLQkqIGNvZmZjb2RlLmg6IHVzZSB0aGUgbmV3IG1hY3JvIGlmIGF2YWlsYWJsZQotCi0JKiBlbGYuYyAoZWxmX2NvcmVmaWxlX25vdGUpOiBjYXN0IG1hbGxvYyB0byBhdm9pZCB3YXJuaW5nLgotCSogTWFrZWZpbGUuaW46IEZpeGVkIGRlcGVuZGVuY2llcyBkdWUgdG8gZmlsZSByZW5hbWUKLQotCSogYW91dC1lbmNhcC5jLCBhb3V0ZjEuaCwgYW91dHguaCwgYXJjaGl2ZS5jLCBib3V0LmMsIGNvZmYtYTI5ay5jLAotCWNvZmYtaDgzMDAuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsCi0JY29mZi1taXBzLmMsIGNvZmYtcnM2MDAwLmMsIGNwdS1oMzAwLmMsIGVsZi5jLCBpMzg2YW91dC5jLAotCW5ld29zMy5jLCBzdGFiLXN5bXMuYywgc3ltcy5jOiBBbGwgdGhlc2UgZmlsZXMgaGF2ZSBoYWQgdGhlaXIKLQkjaW5jbHVkZXMgYWx0ZXJlZCB0byBwb2ludCB0byB0aGUgbmV3IHBsYWNlcy4KLQotRnJpIE5vdiAyOSAyMDowNDo0OSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWkzODZ2NCwgY29uZmlnL21oLWkzODYtZWxmLCBob3N0cy9oLWkzODZ2NC5oOiAgTmV3IGZpbGVzLgotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgdmVuZG9yICJuY3IiIGFzIHN1cHBvcnRlZCBwZXItdGFyZ2V0IHZlbmRvci4KLQlBZGQgc3ZyNCBjYXNlIGZvciBpMzg2IHBlci1ob3N0IGNhc2UuCi0KLQkqIGVsZi5jIChlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBBZGQgbWlzc2luZyAiYnJlYWsiIHRvCi0JRUxGREFUQTJMU0IgY2FzZXMuCi0KLUZyaSBOb3YgMjkgMTI6MTY6NTEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bXMuYyAoYmZkX2RlY29kZV9zeW1jbGFzcyk6ICBSZXR1cm4gJ0EnCi0JZm9yIHN5bWJvbHMgdGhhdCBhcmUgYm90aCBhYnNvbHV0ZSBhbmQgZ2xvYmFsLgotCSogYXJjaGl2ZS5jIChiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSk6ICBSZXR1cm4gTlVMTAotCWlmIGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIHJldHVybnMgTlVMTC4KLQotVHVlIE5vdiAyNiAwOToxMDo1NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY29mZi1oODMwMAotCSogY29uZmlndXJlLmluOiBub3cgaDggaXMgYSBjb2ZmIHRhcmdldAotCSogY3B1LWg4MzAwLmM6IGZpeCB2YXJpb3VzIGRpc2Fzc2VtYmx5IHByb2JsZW1zCi0JKiBsaWJjb2ZmLmg6IHRvb2sgb3V0IHNvbWUgY29kZSB3aGljaCBoYXMgYmVlbiAjMGVkIGZvciBhIGxvbmcKLQl0aW1lLgotCSogdGFyZ2V0cy5jOiBhZGRlZCBoOCBjb2ZmCi0JKiBjb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMKLQlhZGRlZCBuZXcgbWFjcm8gUlRZUEUySE9XVE8gdG8gdGFrZSBhIGxvYWQgb2YgI2lmZGVmcyBvdXQgb2YKLQljb2ZmY29kZS5oCi0JKiBjb2ZmY29kZS5oOiBTdGFydGVkIHRvIGNoYW5nZSB0aGUgd2F5IG1hY2hpbmUgZGVwZW5kZW5jaWVzIGFyZQotCWhhbmRsZWQsIGZyb20gdGhlIG5lc3Qgb2YgI2lmZGVmcyB0byBtYWNyb3MgZGVmaW5lZCBpbiB0aGUKLQlpbmNsdWRpbmcgY29mZi08Zm9vPi5jCi0KLUZyaSBOb3YgMjIgMDg6MTE6NDIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBTZXQgdGhlIGBleGVjdXRhYmxlJyBiaXQKLQlpZiB0aGUgZW50cnkgcG9pbnQgaXMgY29udGFpbmVkIGluIHRoZSB0ZXh0IHNlZ21lbnQsIGV2ZW4gaWYgdGhlCi0JdGV4dCBzZWdtZW50IGlzIGF0IGxvY2F0aW9uIDAuCi0KLQkqIGNvZmYtbWlwcy5jLCBjb2ZmY29kZS5oOiAgUGV0ZXIgU2NoYXVlcidzIHBhdGNoIHRvIGtsdWRnZSBpbgotCW5vbnN0YW5kYXJkIE1JUFMgc2VjdGlvbnMgKC5yZGF0YSwgLnNkYXRhLCBldGMpLgotCi0JKiBhb3V0eC5oLCBiZmQuYywgY29mZmNvZGUuaCwgaWVlZS5jLCBvYXN5cy5jLCB0YXJnZXRzLmM6IENPTlNUIGxpbnQuCi0JKiBsaWJiZmQtaW4uaCwgbGliYmZkLmgsIGFvdXR4LmgsIGNvZmZjb2RlLmgsIGVsZi5jLCBsaWJhb3V0Lmg6Ci0JUmVuYW1lIEFMSUdOIHRvIEJGRF9BTElHTiB0byBhdm9pZCBjb25mbGljdCB3aXRoIEJTRCA8c3lzL3BhcmFtLmg+LgotCSogbGliYmZkLmM6ICBMaW50LgotCSogaG9zdC1hb3V0LmMsIHRyYWQtY29yZS5jOiAgRml4IHdyaXRlX2FybWFwIHByb3RvdHlwZXMuICBMaW50LgotCi1UaHUgTm92IDIxIDE5OjU2OjQwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLXN5bXMuYywgc3ltcy5jOiAgTW92ZWQgYmZkX3N0YWJfbmFtZSgpIGFuZCBiZmRfc3RhYl9uYW1lc1tdCi0JZnJvbSBzeW1zLmMgdG8gbmV3IGZpbGUgc3RhYi1zeW1zLmMuICBBbHNvLCBzaW5jZSBHTlUgZXh0ZW5kZWQKLQl0eXBlIGNvZGVzIHN1Y2ggYXMgTl9TRVRUIGFyZSBubyBsb25nZXIgaW4gLi4vaW5jbHVkZS9zdGFiLmRlZiwKLQlpbmNsdWRlIHRoZW0gbWFudWFsbHkuCi0JKiBzdGFiLXN5bXMuYywgYW91dHguaDogUmVuYW1lZCBiZmRfc3RhYl9uYW1lKCkgYW5kCi0JYmZkX3N0YWJfbmFtZXNbXSB0byBhb3V0X3N0YWJfbmFtZSgpIGFuZCBhb3V0X3N0YWJfbmFtZXNbXS4KLQkqIGxpYmFvdXQuaDogQWRkZWQgcHJvdG90eXBlIGZvciBhb3V0X3N0YWJfbmFtZSgpLgotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgTWFrZWZpbGUgZm9yIG5ldyBzdGFiLXN5bXMuW2NvXS4KLQotVGh1IE5vdiAyMSAxMTo1MDo0OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXT1JLX09VVF9GSUxFX1BPU0lUSU9OUyk6ICBPbmUgbW9yZSB0cnkgYXQgdGhpcwotCXJhdGhlciBjb21wbGljYXRlZCBzZWVtaW5nIHByb2JsZW0uICBFbGltaW5hdGUgTE9HSUNBTF8gdmVyc2lvbnMsCi0JanVzdCBtYWtlIE5fWFhYIHdvcmsgYnkgZXhjbHVkaW5nIHRoZSBoZWFkZXIgZnJvbSB0aGUgdGV4dCBzZWdtZW50LgotCSogYW91dHguaDogIEZpeCBjb21tZW50cyB0byBtYXRjaC4KLQotVHVlIE5vdiAxOSAxODo0OTowMSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXT1JLX09VVF9GSUxFX1BPU0lUSU9OUyk6ICBVc2UgbmV3IExPR0lDQUxfVFhUQUREUiwKLQlMT0dJQ0FMX1RYVE9GRiwgTE9HSUNBTF9UWFRTSVpFIG1hY3JvcyB0byBmaWd1cmUgb3V0IG51bWJlcnMKLQlmb3IgdGhlICJsb2dpY2FsIiB0ZXh0IHNlZ21lbnQgKGkuZS4gbmV2ZXIgY29uc2lkZXIgdGhlIGV4ZWMKLQloZWFkZXIgdG8gYmUgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50KS4gIFRoaXMgY2hhbmdlIGlzCi0JbmVlZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHZhcmlvdXMgb3RoZXIgcGFydHMgb2YgYmZkIGFuZCBsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb2VfYW91dF9vYmplY3RfcCkpOiAgRml4IGNvbW1lbnQsCi0JYW5kIG1vdmUgY2FsY3VsYXRpb24gb2Ygb2JqX3RleHRzZWMoYWJmZCktPnNpemUgdG8gbGliYW91dC5oLgotCSogYmZkLWluLmg6ICBSZW1vdmVkIGJvZ3VzICc7Jy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgTUlOSU1JWkUgZmxhZyB0byBzZWxlY3QgbGVhbgotCW9yIGJsb2F0ZWQgdGFyZ2V0X3ZlY3Rvci4KLQkqIHRhcmdldHMuYzogIFVzZSBuZXcgTUlOSU1JWkUgbWFjcm8sIGFuZCBhZGQgdHJhZF9jb3JlIGlmIG5lZWRlZC4KLQkqIG5ld3NvczMuYzogIEZpeGVzIHRvIC4uL2luY2x1ZGUvYW91dDY0LmggcmVtb3ZlIG5lZWQKLQlmb3Igc3BlY2lhbCBOX1RYVE9GRiBtYWNybywgYnV0IHJlcXVpcmUgTl9IRUFERVJfSU5fVEVYVC4KLQotTW9uIE5vdiAxOCAxMjowMDo1OSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgYW91dGYxLmgsIG5ld3NvczMuYzogIE1ha2UgYW91dC10YXJnZXQuaAotCWhhbmRsZSBib3RoIGxpdHRsZSBhbmQgYmlnLWVuZGlhbiB0YXJnZXRzLCB3aXRoIGxpdHRsZQotCXRoZSBkZWZhdWx0IHVubGVzcyBUQVJHRVRfSVNfQklHX0VORElBTl9QIGlzIGRlZmluZWQuCi0JKiBob3N0LWFvdXQuYzogIEFkZCBGSVhNRSBub3RlLgotCi1TdW4gTm92IDE3IDEzOjI5OjM5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6ICBNYWtlIHRoZSBkZWZhdWx0IHRhcmdldF92ZWN0b3IgY29udGFpbgotCWp1c3QgJkRFRkFVTFRfVkVDVE9SLiAgVGhpcyBtYWtlcyBleGVjdXRhYmxlcyBhIGxvdCBzbWFsbGVyLgotCU9sZCBiZWhhdmlvciBjYW4gYmUgZ290dGVuIGJ5IGRlZmluaW5nIEFMTF9UQVJHRVRTLgotCSogYW91dGYxLmgsIGRlbW82NC5jLCBpMzg2YW91dC5jLCBuZXdzb3MzLmMsIHN1bm9zLmM6Ci0JRmFjdG9yZWQgb3V0IGNvbW1vbiBjb2RlIGludG8gbmV3IGZpbGUgYW91dC10YXJnZXQuaC4KLQlTYXZlcyBhIGxvdCBvZiBkdXBsaWNhdGUgY29kZSBmb3IgYS5vdXQgdmFyaWFudHMuCi0KLUZyaSBOb3YgMTUgMTM6MDA6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQlHZXQgJ21ha2UgaGVhZGVycycgdG8gd29yayB3aGVuIGNvbmZpZ3VyZWQgd2l0aCArc3ViZGlycy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgJChzdWJkaXIpIHRvIGRvY2RpciBwYXRoLgotCSogZG9jL01ha2VmaWxlLmluIChwcm90b3MpOiBBZGQgJChzcmNkaXIpIHByZWZpeAotCXRvIG5hbWUgb2Ygc2VkIHNjcmlwdHMuCi0KLVRodSBOb3YgMTQgMTk6NDk6MTAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxwcmludF9zeW1ib2wpKTogIEZpeCB0aGlua28uCi0JKiBzeW1zLmMgKGJmZF9zdGFiX25hbWVzKTogIFR1cm4gb24gbmV3IEdOVV9FWFRSQV9TVEFCUyBtYWNybwotCXRvIGluY2x1ZGUgbmFtZXMgb2YgTl9TRVRUIGV0Yy4KLQotVGh1IE5vdiAxNCAxOToxMToxMyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotICAgIAkqIGVsZi5jOiAgQWRkIG1pbmltYWwgc3VwcG9ydCBmb3IgRUxGIHN5bWJvbCB0YWJsZXMuICBHZW5lcmF0ZXMKLQljYW5vbmljYWwgYmZkIHN5bWJvbCB0YWJsZXMgZnJvbSBFTEYgc3ltYm9sIHRhYmxlcy4gIENoYW5nZSB0aGUKLQluYW1lIG9mIHNvbWUgZnVuY3Rpb25zIGZyb20gYmZkXzxuYW1lPiB0byBlbGZfPG5hbWU+LgotCi0JKiBzeW1zLmM6ICBUcml2aWFsIGZpeCB0byBjb21tZW50IHRvIHJlbW92ZSBhIHJlZHVuZGFudCAidG8iLgotCi1XZWQgTm92IDEzIDE3OjAyOjAxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXtpMzg2LG02OGssbTg4a30uYzogIENoYW5nZSBuYW1lIG9mIGZpbGUgZm9ybWF0IHRvIHN0YW5kYXJkCi0JZm9ybSB0aGF0IEdEQiByZWNvZ25pemVzIGFzIENPRkYuCi0KLVdlZCBOb3YgMTMgMDk6MDk6NDEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogIGNhc3QgTlVMTCBjb3JyZWN0bHkuCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGhhcnJpcyBob3N0Ci0KLQkqIGNvZmYtYTI5ay5jOiBMb3RzIG9mIGNoYW5nZXMsIG1vc3QgZnJvbSBEYXZpZCBXb29kLgotCi1UdWUgTm92IDEyIDA3OjIxOjQxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYyAoY29mZl93cml0ZV9hcm1hcCk6ICBKdXN0ICN1bmRlZiBpdC4KLQotTW9uIE5vdiAxMSAyMDozMDoxOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogc3RhbmRhcmRpemUgb24gTUlOVVNfRyB0byBkaXNhYmxlIGRlYnVnZ2luZwotCSogY29mZi1tODhrLmM6IGNyZWF0ZSBjb2ZmIGFybWFwcyBpbnN0ZWFkIG9mIGJzZCBvbmVzLgotCSogb3BuY2xzLmMgKGJmZF9jbG9zZV9hbGxfZG9uZSksIChiZmRfY2xvc2UpOiBNYXNrIG91dCByYW5kb20gYml0cwotCXdoZW4gY2FsbGluZyBjaG1vZC4KLQotTW9uIE5vdiAxMSAxOTowNzozMiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBBZGRpdGlvbnMgdG8gc3VwcG9ydCBFTEYgZm9ybWF0IGNvcmUgZmlsZXMuCi0JKiBjb25maWcvbWgtYW1peDogIEFkZCAtREhBVkVfUFJPQ0ZTIHRvIEhERUZJTkVTLCBzaW5jZSBob3N0Ci0JaGFzIHN1cHBvcnQgZm9yIC9wcm9jIChhbGwgdGhlIGluY2x1ZGUgZmlsZXMgaW4gcGFydGljdWxhcikuCi0KLU1vbiBOb3YgMTEgMTg6MzY6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiAgSGFuZGxlIHRoZSBjYXNlCi0Jb2YgdHdvIE5fU08gc3RhYnMsIG9uZSBmb3IgZGlyZWN0b3J5LCBhbmQgb25lIGZvciBmaWxlbmFtZS4KLQotCSogYmZkLWluLmggKHByaW50X3ZtYSk6ICBGYWN0b3Igb3V0IGR1cGxpY2F0ZSBkZWZpbml0aW9uLgotCi0JRXhpdCBhIGxpdHRsZSBtb3JlIGdyYWNlZnVsbHkgd2hlbiBtYWxsb2MgcmV0dXJucyBOVUxMLgotCSogbGliYmZkLmM6IE5ldyBmdW5jdGlvbiBiZmRfeG1hbGxvYyAobWFsbG9jIHdyYXBwZXIpLgotCSogb3BuY2xzLmMsIHN5bXMuYywgYm91dC5jLCBhb3V0eC5oOiAgUmVwbGFjZSBtYWxsb2MgYnkgYmZkX3htYWxsb2MuCi0JKiBsaWJiZmQuaDogUnJlLWdlbmVyYXRlZCBkdWUgdG8gbGliYmZkLmMgdXBkYXRlLgotCi1TYXQgTm92ICA5IDEzOjQ1OjAxIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtbTY4ay1lbGY6ICBEZWZpbmUgREVGQVVMVF9WRUNUT1IgYXMgZWxmX2JpZ192ZWMuCi0KLQkqIGVsZi5jIChlbGZfb2JqZWN0X3ApOiAgRG9uJ3QgdHJ5IHRvIGNyZWF0ZSBhIGJmZCBzZWN0aW9uIGZvcgotCXRoZSBmaXJzdCBFTEYgc2VjdGlvbiBoZWFkZXIuICBJdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIuCi0KLVNhdCBOb3YgIDkgMDM6MDQ6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmMsIGNvbmZpZy9taC1yczYwMDA6ICBNYWtlIGl0IHdvcmsgb24gYXJjaGl2ZSBhbmQKLQljb3JlIGZpbGVzLCB3aGVuIGNvbXBpbGluZyBuYXRpdmUuCi0JKiBob3N0cy9oLXJzNjAwMC5oOiAgRGVmaW5lIEZBU0NJU1RfRkRPUEVOIGZvciBiZmRfZmRvcGVuci4KLQotCUZJWE1FOiAgVGhlIGFvdXRmMS5oIGNoYW5nZSBiZWxvdyBuZWVkcyB0byBiZSByZXZlcnNlZCBiYWNrCi0JdG8gdGhlIHdheSBpdCB3YXMuCi0KLVRodSBOb3YgIDcgMTE6MDM6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IERlZmluZWQgbmV3IG1hY3JvcyBbUFVUfEdFVF1MSU5FTk9fTE5OTyBmb3IKLQltYW5pcHVsYXRpb24gb2YgbG5ubyBmaWVsZHMgaW4gbGluZW5vIHN0cnVjdHMgaW4gYSBjb2ZmLTxmPi5oCi0JaW5kZXBlbmRlbnQgd2F5LiBPdmVycmlkZSBpdCBpbiBjb2ZmLTxmPi5oIHRvIHlvdXIgZmF2b3VyaXRlCi0JbnVtYmVyIGlmIHlvdSBkb24ndCBoYXZlIGEgMTZiaXQgbG5ubyBmaWVsZC4gKGNvZmZfc3dhcF9saW5lbm9faW4pCi0JKGNvZmZfc3dhcF9saW5lbm9fb3V0KTogbW9kaWZpZWQgdG8gdXNlIHRoZSBuZXcgbWFjcm9zLgotCi1Nb24gTm92ICA0IDExOjM4OjMzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfY2FsbGJhY2spOiBOb3cgZGVmYXVsdHMgdG8gNjgwMjAgcmF0aGVyIHRoYW4KLQl1bmtub3duIGFyY2ggd2hlbiB0aGUgbWFnaWMgbnVtYmVyIGRvZXNuJ3Qgc3BlY2lmeSB0aGUKLQlhcmNoaXRlY3R1cmUsIHNpbmNlIHNvbWUgT1NzIChlZyBvbGQgc3VuM3MpIGRvbid0IHNldCB0aGUgbnVtYmVyLCBhbmQKLQkwMjAgaXMgcHJvYmFibHkgdGhlIHJpZ2h0IGFuc3dlciBhbnl3YXkuCi0KLVN1biBOb3YgIDMgMTI6MDc6MDggMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtbmV3cy5oLCBob3N0cy9oLXJ0YnNkLmg6Ci0JR2V0IHJpZCBvZiBNSVNTSU5HX1ZGUFJJTlRGLCBzaW5jZSBsaWJpYmVydHkgcHJvdmlkZXMgb25lLgotCSogYmZkLWluLmggKGJmZF9wcmludF9zeW1ib2xfdHlwZV9ob3B3IGVudW0pOiAgIEFkZCBuZXcgb3B0aW9uCi0JYmZkX3ByaW50X3N5bWJvbF9ubSwgZm9yIHVzZSBieSBubS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxwcmludF9zeW1ib2wpKTogIEFkZCBjb2RlIGZvciBuZXcKLQliZmRfcHJpbnRfc3ltYm9sX25tIG9wdGlvbiwgdG8gcHJpbnQgaW4gbm0gZm9ybWF0LgotCSogY29mZmNvZGUuaCAoY29mZl9wcmludF9zeW1ib2wpLCBpZWVlLmMgKGllZWVfcHJpbnRfc3ltYm9sKQotCW9hc3lzLmMgKG9hc3lzX3ByaW50X3N5bWJvbCk6ICBQcm92aWRlIHN0dWIgaW1wbGVtZW50YXRpb25zCi0JZm9yIGJmZF9wcmludF9zeW1ib2xfbm0uCi0JKiBzeW1zLmM6ICBOZXcgZnVuY3Rpb24gYmZkX2RlY29kZV9zeW1jbGFzcywgdXNlZCBieSBubSBwcmludGVyLgotCU5ldyBmdW5jdGlvbiBiZmRfc3RhYl9uYW1lIHRvIGxvb2sgdXAgc3RyaW5nIG5hbWUgb2Ygc3RhYiBjb2RlLgotCi1TYXQgTm92ICAyIDE0OjI2OjAzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIGN0b3IuYwotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QpIGFkZGVkCi0JYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAuCi0JKiBjb2ZmY29kZS5oOiByZW1vdmVkIGEgbG9hZCBvZiAjaWYgMGVkIGNvZGUuCi0JKGNvZmZfY29tcHV0ZV9maWxlX3NlY3Rpb25fcG9zaXRpb25zKTogbm93IHdvcmtzIG91dCB0aGUgc2VjdGlvbgotCWFsaWdubWVudCBhbmQgc2l6ZSBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLgotCShjb2ZmX2dldF9zeW10YWIpOiBsb29rcyBmb3IgY29uc3RydWN0b3Igc3ltYm9scyBhbmQgY2FsbHMgdGhlCi0JcmlnaHQgZnVuY3Rpb24gd2hlbiB0aGV5J3JlIGZvdW5kLiAoY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOgotCWtub3dzIHdoZW4gYSBzZWN0aW9uIGlzIGZ1bGwgb2YgY29uc3RydWN0b3JzIGFuZCBkb2VzIHRoZSByaWdodAotCXRoaW5nLgotCSogY3B1LW04OGsuYzogQWRkZWQgZGVmYXVsdF9yZWxvY190eXBlIGxvb2t1cCB0byB0aGUgYXJjaGl0ZWN0dXJlCi0JZGVzY3JpcHRpb24uCi0JKiBsaWJiZmQtaW4uaDogKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKSBkZWZ1biAgYWRkZWQuCi0JKiBsaWJjb2ZmLmg6IHJlbW92ZWQgI2lmIDBlZCBjb2RlCi0JKiByZWxvYy5jOiAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSBhZGRlZCBCRkRfUkVMT0NfQ1RPUiBmb3IKLQlhcmNoIGluZGVwZW5kZW50IGNvbnN0cnVjdG9yIHJlbG9jYXRpb24gdHlwZS4KLQkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogcmVtb3ZlZCB0aGUgY29tbWVudCAidGhpcyB3aWxsIGdvIGF3YXkiCi0Jc2luY2UgaXQgd29uJ3QuIChiZmRfaG93dG9fMzIpOiBzdG9sZW4gZnJvbSA4OGssIHRoaXMgaXMgYSAzMmJpdAotCXJlbG9jIHdoaWNoIGlzIHVzZWQgd2hlbiBCRkRfUkVMT0NfQ1RPUiBmYWxscyB0aHJvdWdoIHRvIGdpdmUgYQotCWRlZmF1bHQgMzJiaXQgcmVsb2MgZm9yIGNvbnN0cnVjdG9ycy4KLQkoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiBhZGRlZC4KLQkqIGFvdXRmMS5oOiBmaXhlZCBTRUdNRU5UX1NJWkUgdHlwby4KLQotVGh1IE9jdCAzMSAxODoyMzowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIENoYW5nZSBuYW1lIHRvICJhaXhjb2ZmLXJzNjAwMCIsIHRvIGF2b2lkCi0JbWF0Y2hpbmcgcHJlZml4ICJjb2ZmIi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4sIGNvZmZfc3dhcF9hdXhfb3V0KTogIEhhbmRsZQotCXJzLzYwMDAgY3NlY3QgcmVjb3Jkcy4KLQotU3VuIE9jdCAyNyAxNjo1Njo1OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jLCB0YXJnZXRzLmM6IGNoYW5nZSBuYW1lIG9mIG04OGtfYmNzIHRvIG04OGtiY3MKLQkqIGNvbmZpZ3VyZS5pbjogYWRkIG1vdG9yb2xhIGRlbHRhODggY2FzZXMKLQkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCwgYXJjaGl2ZS5jLCBpZWVlLmMsIGVsZi5jLCBzcmVjLmM6IGZpeAotCXdyaXRlX2FybWFwIHByb3RvdHlwZQotCSogbGliYmZkLmM6IGFkZCBkb2Mgb24gYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQKLQotRnJpIE9jdCAyNSAwMjo0ODoxOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIENPRkYtcmVsYXRlZCBmaWxlcyBpbiBgY29mZi1BUkNILmMnIGZvcm0uCi0JY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jIHRvIGJlIGV4YWN0LgotCi0JKiBNYWtlZmlsZS5pbjogIE9ubHkgc3VwcGx5IFRBUkdFVF9ERUZBVUxUUyB0byB0YXJnZXRzLmMsIHJlZHVjaW5nCi0JbWFrZSBvdXRwdXQgY2x1dHRlci4KLQkqIGNvbmZpZy9tdC0qOiAgRGl0dG8uCi0KLVRodSBPY3QgMjQgMjI6NDA6MDcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSUy82MDAwIHN1cHBvcnQsIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaPv0bmctVGjlbyBW9SwgYW5kCi0JSm9obiBHaWxtb3JlLiAgQXJjaGl2ZSBzdXBwb3J0IGZyb20gRGFtb24gQS4gUGVybWV6ZWwuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGNwdS1yczYwMDAuYyBhbmQgcnM2MDAwY29mZi5jLgotCSogY29uZmlndXJlLmluOiAgQWRkIHJzNjAwMCBjYXNlLgotCSogdGFyZ2V0cy5jOiAgQWRkIHJzNjAwMCB2ZWN0b3IuCi0JKiBhcmNodXJlcy5jOiAgQWRkIHJzNjAwMCwgZml4IGNvbW1lbnQgb24gcm9tcC4KLQkqIGJmZC1pbi5oIChlbnVtIGJmZF9lcnJvcik6ICBBZGQgbm9fZGVidWdfc2VjdGlvbiBlcnJvci4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiAgUmVtb3ZlIHVudXNlZCBzdHJpbmdfdGFibGUuCi0JKiBiZmQuYyAoYmZkX2Vycm1zZ3MpOiAgQWRkIG5vX2RlYnVnX3NlY3Rpb24gZXJyb3IgbWVzc2FnZS4KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbik6ICBSZXR1cm4gTlVMTCBvbiBhdHRlbXB0IHRvIGNyZWF0ZQotCWEgc2VjdGlvbiB0d2ljZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9zd2FwX3JlbG9jX2luKTogIEhhbmRsZSByX3R5cGUgYW5kIHJfc2l6ZS4KLQkoYmZkX3N3YXBfYW91dGhkcl9pbik6ICBIYW5kbGUgbG90cyBtb3JlIG1lbWJlcnMuCi0JKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6ICBJZiBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2VlbiwKLQlqdXN0IHJldHVybiBmYWxzZSByYXRoZXIgdGhhbiBvdmVyd3JpdGluZyBpdC4KLQkoY29mZl9yZWFsX29iamVjdF9wKTogIFVuZGVyc3RhbmQgaW5jb21pbmcgbWFnaWMgbnVtYmVycy4KLQkoY29mZl9zZXRfZmxhZ3MpOiAgVW5kZXJzdGFuZCBvdXRnb2luZyBtYWdpYyBudW1iZXJzLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6ICBvdXRnb2luZyBhb3V0aGRyIG1hZ2ljICMuCi0JKGJ1aWxkX2RlYnVnX3NlY3Rpb24pOiAgQWRkIGZuIGZvciByZWFkaW5nIGRlYnVnIHN0cmluZyBzZWN0aW9uLgotCShnZXRfbm9ybWFsaXplZF9zeW10YWIpOiAgSGFuZGxlIHN5bWJvbCBuYW1lcyBpbiBkZWJ1ZyBzdHJpbmcgc2VjdGlvbi4KLQlSZW1vdmUgdW51c2VkIG9ial9zdHJpbmdfdGFibGUuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmRsZSByczYwMDAtc3BlY2lmaWMgc3RvcmFnZSBjbGFzc2VzLgotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncywgTl9TRVQqKTogIENoZWNrIGZvcgotCWV4aXN0aW5nIHNlY3Rpb24gYmVmb3JlIG1ha2luZyBvbmUuCi0JKiBjcHUtcnM2MDAwLmM6ICBOZXcgZmlsZS4KLQkqIHJzNjAwMGNvZmYuYzogIE5ldyBmaWxlLgotCi1UaHUgT2N0IDI0IDAyOjAzOjI0IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogQWRkIHBhcnRpYWwgc3VwcG9ydCBmb3IgRUxGIGZvcm1hdCBjb3JlZmlsZXMuIFN0aWxsIG5lZWRzCi0Jc3VwcG9ydCBmb3IgZXh0cmFjdGluZyByZWdpc3RlcnMgZnJvbSBjb3JlZmlsZXMuCi0KLQkqIGNvbmZpZy90LW02OGstZWxmOiAgU2V0IERFRkFVTFRfVkVDVE9SIHRvIGVsZl9iaWdfdmVjLgotCi0JKiBjb25maWcve2gtYW1peCxoLWRndXgsaC1pcml4MyxoLXVsdHJhM306IEZvciBzeXN0ZW1zIHdoZXJlCi0JUkFOTElCIGlzIGRlZmluZWQgYXMgZWNobywgc2VuZCB0aGUgb3V0cHV0IHRvIC9kZXYvbnVsbCB0byBoZWxwCi0JcmVkdWNlIGNsdXR0ZXIgaW4gdGhlIG91dHB1dCBmcm9tIGRvaW5nIGEgbWFrZS4KLQotTW9uIE9jdCAyMSAxNzo0ODo0OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC12YXh1bHQuaDogIFJlbW92ZSBtYWxsb2MvZnJlZSBkZWNscyBjb3ZlcmVkIGluIHN0ZGxpYi5oLgotCUZpeCBIT1NUX1BBR0VfU0laRSBhbmQgSE9TVF9TRUdNRU5UX1NJWkUuICBGcm9tIERhdmlkIFRheWxvci4KLQotTW9uIE9jdCAyMSAwOTozNDoxMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IG1ha2UgaXQgcGFkCi0Jc2VjdGlvbiBzaXplIG91dCBpZiB0aGVyZSBhcmUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBzbyB0aGF0IHRoZQotCWltYWdlIHdpbGwgYmUgb2sgb24gYSBzeXN0ZW0gd2hlcmUgc2VjdGlvbiBwb3NpdGlvbnMgYXJlIHdvcmtlZAotCW91dCBieSBhY2N1bXVsYXRpbmcgc2l6ZXMgcmF0aGVyIHRoYW4gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzLgotCSogdGFyZ2V0cy5jIChwcm90byB3cml0ZV9hcm1hcCkuIENoYW5nZWQgb3JsX2NvdW50IHRvIHVuc2lnbmVkLgotCSogb3BuY2xzLmMgKGJmZF9jbG9zZV9hbGxfZG9uZSkuIEFkZGVkIHNvIHRoYXQgZ2VuZXJhdGl2ZQotCXByb2dyYW1zIGxpa2UgZ2FzIGNhbiBjbG9zZSBhIGJmZCB3aXRob3V0IGNhdXNpbmcgYmZkIGNvbmZ1c2lvbi4KLQkqIGxpYmJmZC5oIChjaGFuZ2VkIGJlY3Vhc2Ugb2YgcHJvdG9zKQotCSogYW1kY29mZi5jOiBtZXNzZWQgd2l0aCB0aGUgd2F5IHRoYXQgam1wIGRpc3BsYWNlbWVudHMgYXJlCi0JY2FsY3VhbGF0ZWQuIFRoaXMgbWF5IG5vdCB5ZXQgYmUgdG90YWxseSBjb3JyZWN0LgotCSogYXJjaGl2ZS5jIChjb2ZmX3dyaXRlX2FybWFwKTogcmV3cm90ZSB0aGUgd2F5IHRoYXQgcmFubGlicyBhcmUKLQl3cml0dGVuIG91dC4KLQkqIGNvZmZjb2RlLmggKGZpeHVwX3N5bWJvbF92YWx1ZSk6IG5vdyBkb2Vzbid0IGNvcmUgZHVtcCBpZiBhIG5vbgotCWFicyBzeW1ib2wgaGFzIG5vIHNlY3Rpb24gKGxpa2UgYSByZWdpc3RlciBzeW1ib2wpLgotCShjb2ZmX3dyaXRlX3N5bWJvbCkgbm93IHplcm9zIGF1eGVudCBiZWZvcmUgZmlsbGluZyBpdCB1cCB0byBoZWxwCi0Jd2l0aCBzZW5zaXRpdmUgYXBwbGljYXRpb25zLgotCSogbGliYmZkLmMgKGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50KTogYWRkZWQuCi0KLVdlZCBPY3QgMTYgMjI6NTg6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgTWFrZSBzdXJlIHdlIGRvbid0IGdldCBhIG1hY3JvIHN0cmVycm9yKCkuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgSWYgRkFTQ0lTVF9GRE9QRU4sIHVzZSAiciIsIG5vdCAicisiLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogIFN1cHByZXNzCi0JYXR0ZW1wdCB0byByZWNvdmVyIGNvbW1hbmQsIGlmZGVmIE5PX0NPUkVfQ09NTUFORC4KLQkqIGhvc3RzL2gtdGFob2UuaDogIEFkZCBGQVNDSVNUX0ZET1BFTiBhbmQgTk9fQ09SRV9DT01NQU5EOwotCXJldmFtcCBIT1NUXyosIGV0Yy4KLQkqIGhvc3RzL2gtaTM4NnYuaDogIFVzZSA8dXRpbWUuaD4sIG5vdCA8c3lzL3V0aW1lLmg+LCB1bmxpa2UgUE9TSVguCi0KLVdlZCBPY3QgMTYgMTI6NDM6NDkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FyZ21hcCk6IFRoZSBzaXplIG9mIHRoZSByYW5saWIgc3RydWN0dXJlcwotCXNob3VsZCBub3QgaW5jbHVkZSB0aGUgc2l6ZSBmaWVsZCBpdHNlbGYuCi0JKiBhb3V0eC5oLCBsaWJhb3V0LmggKE5BTUUoYW91dCwgc2l6ZW9mX2hlYWRlcnMpKTogIFVzZQotCWFkYXRhKGFiZmQpLT5leGVjX2J5dGVzX3NpemUgZmllbGQgaW5zdGVhZCBvZiBjb25zdGFudCBtYWNybywKLQliZWNhdXNlIGFvdXR4LmggY29tcGlsZXMgdG8gYSBzaW1wbGUgLm8gZmlsZSBzaGFyZWQgYnkKLQlhbGwgMzItYml0cyBhLm91dCB0YXJnZXRzLgotCi1XZWQgT2N0IDE2IDExOjExOjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBbGxvdyBpMzg2LXNjby1zeXN2LgotCSogYm91dC5jOiAgUmVtb3ZlIHVudXNlZCBpOTYwX2FsaWduOyBsaW50IGR1bW15IGNvcmUgZmlsZSBoYW5kbGVycy4KLQkqIGNwdS1oODMwMC5jOiAgbGludC4KLQotCSogaG9zdC1hb3V0LmM6ICBOZXcgc3RyYXRlZ3kuICBXZSB1c2UgY29tbW9uIGNvZGUsIGluY2x1ZGUgZmlsZXMsCi0JYW5kIGRhdGEgc3RydWN0dXJlcyB0byBoYW5kbGUgdGhlIGZpbGUsIGJ1dCBzZXQgYSBmZXcgcGFyYW1ldGVycwotCWZyb20gdGhlIGhvc3QncyBjb25maWcgZmlsZSAocGFnZSBzaXplLCB0ZXh0IHN0YXJ0IGFkZHIsIGV0YykuCi0JKiBsaWJhb3V0Lmg6ICBEZWZpbmUgSFAgQlNEIG1hY2hpbmUgdHlwZXMuCi0JKiBhb3V0ZjEuaDogIEhhbmRsZSByZWFkaW5nIGEub3V0cyB3aXRoIHRoZXNlIHR5cGVzLgotCi0JKiB0cmFkLWNvcmUuYzogIFBhc3MgdGhlIHUudV9hcjAgdmFsdWUgYXMgdGhlIG5lZ2F0aXZlIG9mIHRoZQotCXZpcnR1YWwtbWVtb3J5LWFkZHJlc3Mgb2YgdGhlIC5yZWcgc2VjdGlvbi4gIFdlIGNhbid0IGp1c3QgbWFrZSBhCi0Jc2VjdGlvbiBmb3IgImFsbCB0aGUgcmVncyBhbmQgbm90aGluZyBlbHNlIiBiZWNhdXNlIG9ubHkgR0RCIGtub3dzCi0JZXhhY3RseSB3aGVyZSB0aGUgcmVncyBhcmUgKHNjYXR0ZXJlZCBhcm91bmQgdGhlIHVwYWdlIGFuZCBzdGFjaykuCi0JQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRpb24uICBSZW1vdmUgYmlnLSBhbmQgbGl0dGxlLWVuZGlhbgotCXZlY3RvcnMsIHJlcGxhY2Ugd2l0aCBzaW5nbGUgdmVjdG9yOyB0aGlzIG9ubHkgcnVucyBvbiB0aGUgaG9zdCwKLQlpbiBob3N0IGJ5dGUgb3JkZXIuICBSZXBsYWNlIGJ5dGVzd2FwIHJvdXRpbmVzIHdpdGggYWJvcnRzIGluIGNhc2UKLQlhbnlvbmUgY2FsbHMgdGhlbS4KLQkqIHRhcmdldHMuYzogIFRoZXJlJ3Mgb25seSBvbmUgdHJhZF9jb3JlX3ZlYyBub3cuCi0JKiBhb3V0ZjEuaCAoc3Vub3NfY29yZV9maWxlX3ApOiAgVk1BIG9mIC5yZWcqIG5vdyBuZWVkcyB0byBiZSAwLgotCi1UdWUgT2N0IDE1IDA4OjI5OjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLWFtaXguaCAoZnJlZSk6ICBGaXggcHJvdG90eXBlLgotCi0JKiBhb3V0eC5oOiAgRG9uJ3QgdXNlIE5VTEwgYXMgYW4gaW50ZWdlciwgZm9yIGJyYWluZGVhZCBzeXN0ZW1zCi0JdGhhdCBkZWNsYXJlIGl0IGFzICh2b2lkICopMC4gIChGcm9tIFBldGVyIFNjaGF1ZXIuKQotCi1Nb24gT2N0IDE0IDE3OjIwOjQ3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHJlcG9ydGVkCi0JcHJvYmxlbSB3aXRoIGJhZCBVbHRyaXggc3lzdGVtIGhlYWRlcnMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogIFRyeSB0byBoYW5kbGUgdGhlCi0JdmFyaW91cyBraW5kcyBvZiBhbGlnbm1lbnRzIGZvciB0aGUgdmFyaW91cyBraW5kcyBvZgotCW1hZ2ljIG51bWJlcnMuCi0KLU1vbiBPY3QgMTQgMTQ6MjM6MTAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZTogIERvbid0IGFzc3VtZSAuIGlzIG9uIHRoZSBwYXRoIChmcm9tIEphbWVzIENsYXJrKS4KLQotRnJpIE9jdCAxMSAyMjo0NToxNCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCBTdW4gTWFrZSBWUEFUSCBidWdzLgotCSogdGFyZ2V0cy5jOiAgRGVjbGFyZSB0cmFkX2NvcmUgdmVjdG9ycyBleHRlcm4uCi0KLUZyaSBPY3QgMTEgMTM6MDM6MDIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IE1vdmVkIEFMSUdOIG1hY3JvIHRvIGxpYmJmZC5oLiBSZW1vdmVkIGk5NjBfYWxpZ24uCi0JKiBsaWJiZmQuaDogTW92ZWQgQUxJR04gbWFjcm8gaGVyZS4KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiBSZXBsYWNlIGk5NjBfYWxpZ24gYnkgYWxpZ25fcG93ZXIuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogIEFkZGVkIGZpZWxkcyBwYWdlX3NpemUsCi0Jc2VnbWVudF9zaXplIGFuZCBleGVjX2J5dGVzX3NpemUuICBUaGVzZSBoZWxwIGdlbmVyaWMgY29kZQotCShpbiBhb3V0eC5oIGFuZCBsaWJhb3V0LmgpIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gYWxpZ24KLQl0aGUgdmFyaW91cyBzZWdtZW50cyBpbiBhIGRlbWFuZCBwYWdlZCBmaWxlLgotCSogbGliYW91dC5oIChXUklURV9IRUFERVIpOiAgVXNlIG5ldyAoc3RydWN0IGFvdXRkYXRhKSBmaWVsZHMKLQl0byBkZWNpZGUgaWYgdGhlIGV4ZWMgaGVhZGVyIGNvdW50cyBpbiBhX3RleHQgKHRleHQgc2VnbWVudCBzaXplKS4KLQlBbHNvLCBhc3N1bWUgRF9QQUdFRCBmbGFnIGlzIHNldDsgZG9uJ3Qgc2V0IGl0IGhlcmUuCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogQWRkIGluaXRpYWxpemF0aW9uIG9mCi0JYWRhdGEgZmllbGRzIHBhZ2Vfc2l6ZSwgc2VnbWVudF9zaXplLCBhbmQgZXhlY19ieXRlc19zaXplLgotCSogaG9zdC1hb3V0LmMgKE5BTUUoaG9zdF9hb3V0LCBjYWxsYmFjaykgYW5kCi0JTkFNRShob3N0X2FvdXQsbWtvYmplY3QpOiBEaXR0by4KLQkqIGkzODZhb3V0LmMgKGFvdXQzODZfY2FsbGJhY2spIGFuZCBuZXcgYW91dDM4Nl9ta29iamVjdCk6IERpdHRvLgotCSogbmV3b3MzLmMgKG5ld3NvczNfY2FsbGJhY2spIGFuZCBuZXcgbmV3c29zX21rb2JqZWN0KTogRGl0dG8uCi0JKiBhb3V0ZjEuYyAoc3Vub3M0X2NhbGxiYWNrKSBhbmQgbmV3IHN1bm9zX21rb2JqZWN0KTogRGl0dG8uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IERvbid0IHN1YnRyYWN0Ci0JRVhFQ19CWVRFU19TSVpFIGZyb20gdGhlIGFfdGVzdCBzaXplOyB0aGlzIGlzIG9ubHkgYXBwcm9wcmlhdGUKLQlmb3Igc29tZSBzeXN0ZW1zIChtYWlubHkgc3Vub3MpLCBzbyBkbyBpdCBpbiB0aGUgY2FsbGJhY2sgaW5zdGVhZC4KLQlTYW1lIHJvdXRpbmU6IEFkZCBzdHVmZiB0byB0aGUgVEhJU19JU19PTkxZX0RPQ1VNRU5UQVRJT04gY29tbWVudC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSB0aGUgd2F5Ci0JZmlsZXBvcyBhbmQgc2l6ZSBvZiBzZWN0aW9ucyBhcmUgY2FycmllZCBvdXQgdG8gc3VwcG9ydAotCW9sZGVyIHN0eWxlcyBvZiBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMuCi0KLQotRnJpIE9jdCAxMSAxMjozMzozNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBBZGRlZCBtb3JlIG1hY3JvcyB0byBDT0ZGX1NXQVBfVEFCTEUuCi0JKiBiZmQuYzogQWRkZWQgbWFjcm9zIHRvIGVuYWJsZSBnYXMgdG8gc3dhcCBjb2ZmIHJlY29yZHMuCi0JKiBjb2ZmY29kZS5oOiBNYWtlIHRoZSBjb2ZmX3N3YXBfKl9vdXQgcm91dGluZXMgcmV0dXJuIHRoZSBudW1iZXIKLQlvZiBieXRlcyBzd2FwcGVkLCBhbmQgY2xlYW5lZCB1cCB0aGVpciBwcm90b3R5cGVzLgotCSogY29uZmlndXJlLmluOiBBZGRlZCBlYm1vbi9jb2ZmIHN1cHBvcnQKLQkqIGVjb2ZmLmM6IENoYW5nZWQgbnVsbCBkZWZpbml0aW9ucyBvZiBjb2ZmX3N3YXBfKl9vdXQgdG8gY29uZm9ybQotCXRvIG5ldyBwcm90b3R5cGVzCi0JKiB0YXJnZXRzLmM6IEFkZGVkIG5ldyBlbnRyeSBwb2ludHMgZm9yIGNvZmYgc3dhcHBpbmcKLQotRnJpIE9jdCAxMSAwMzowMTo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KLQotCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIGhvc3RzL2gteHh4LmguCi0JQ2hhbmdlIHNvbWUgY29uZmlnIG5hbWVzIHRvIG1hdGNoIG90aGVyIGRpcnMuCi0JKiAqLmM6ICBJbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaCwgc28gYW5zaWRlY2wgYW5kIFBST1RPKCkKLQlnZXQgZGVmaW5lZCBmaXJzdC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlIC1JLiB0byBnZXQgc3lzZGVwLmguICBSZW1vdmUgcmVmcyB0bwotCS4uL2luY2x1ZGUvc3lzZGVwLmguCi0JKiBjcHUtaTk2MC5jOiAgU3RybmNtcCBuZWVkZWQgYSBsZW5ndGggYXJnLgotCSogZWNvZmYuYzogIERvbid0IGV2ZXIgY2FsbCB0cmFkX3VuaXhfY29yZV9maWxlX3AgZnJvbSBoZXJlLgotCSogaTM4NmFvdXQuYzogIFJlbW92ZSBkZWFkIE5fVFhUT0ZGIG92ZXJyaWRlLgotCSogdHJhZC1jb3JlLmM6ICBEb24ndCBkaXNhYmxlIHRoZSB3aG9sZSBmaWxlIGlmIFNVTjRfU1lTLgotCSogY29uZmlnLzogIFJlbmFtZSBzb21lIGNvbmZpZyBmaWxlcyB0byBtYXRjaCB1cCBoLSouaCBuYW1lcy4KLQlSZW1vdmUgYWxsIHRoZSBIT1NUX1NZUyBkZWZpbml0aW9ucyBmcm9tIHRoZSBjb25maWcgZmlsZXMuCi0JKiBob3N0cy9oLWFtaXguaCwgaC1pMzg2di5oOiAgRGVmaW5lIFBPU0lYX1VUSU1FLCBub3QgVVNHLgotCSogaG9zdHMvaC1ocDkwMDAuaDogIFJlbW92ZSBVU0cgY29tbWVudC4KLQkqIGhvc3RzL2gtcnM2MDAwLmg6ICBJbmNsdWRlIDxzdGRsaWIuaD4gZm9yIG1hbGxvYy4KLQkqIGhvc3RzL2gtbmV3cy5oLCBoLXNwYXJjLTY0Lmg6ICBOZXcgY29uZmlnIGZpbGVzIHRoYXQgaGFkCi0JcHJldmlvdXNseSBiZWVuIGtsdWRnZWQgaW4gdGhlIDxzeXNkZXAuaD4gZmlsZS4KLQotVGh1IE9jdCAxMCAxNzo1NDowOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLyo6ICB0cmFkLWNvcmUgc3VwcG9ydCBpcyBIT1NUIGRlcGVuZGVudCwgbm90IHRhcmdldAotCWRlcGVuZGVudC4gIFRhcmdldCBjb25maWcgZmlsZXMgb25seSBzZXQgREVGQVVMVF9WRUNUT1IgYW5kL29yCi0Jb3RoZXIgdmVjdG9yIGVsZW1lbnRzLiAgRXhjZXB0aW9uOiAgd2hlbiBob3N0LWFvdXQuYyBpcyBpbiB1c2UsCi0JaW4gd2hpY2ggY2FzZSB3ZSdyZSBmb3JjZWQgdG8gYXNzdW1lIHdlJ3JlIG5hdGl2ZSAoaHAsIHZheCwKLQl0YWhvZSkuICBSZW5hbWUgWERFUEZJTEVTIHRvIEhERVBGSUxFUy4KLQkqIE1ha2VmaWxlLmluOiAgUmVuYW1lIFhERVBGSUxFUy4KLQkqIGNvbmZpZy9oLXN1bio6ICBEb24ndCBmb3JjZSBzdGF0aWMgbGlua2luZy4KLQkqIHRyYWQtY29yZS5jOiAgRG9jdW1lbnQgaG93IHRvIHVzZSBpdCBub3dhZGF5cy4KLQkqIGkzODZhb3V0LmMsIG5ld3NvczMuYzogIENsZWFuIHVwLgotCSogaTM4NmNvZmYuYzogIEFsbG93IDM4NiBjb2ZmIGZpbGVzIHRvIGJlIHVzZWQgYXMgY29yZSBmaWxlcyB0b28KLQkoZm9yIHJlYWRpbmcgY29yZSBmaWxlcyBmcm9tIGVtYmVkZGVkIHN5c3RlbXMpLgotCi1UdWUgT2N0ICA4IDE1OjMwOjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBBZGQgaTM4NmFvdXQuYyBmb3IgYS5vdXQgc3VwcG9ydCBvbiB0aGUgaTM4Ni4KLQotVHVlIE9jdCAgOCAxMjoxODo1NCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jLCBzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jOiBjb3JyZWN0IGluZm8tbm9kZQotCXN0cnVjdHVyZSBpbiAqZG9jKiBjb21tZW50cy4KLQlkb2MvTWFrZWZpbGU6IHN0b3AgaGlkaW5nIGNvbXBsYWludHMgZnJvbSBtYWtlaW5mby4KLQotU3VuIE9jdCAgNiAxOToxMDowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoLi4uc29tZV9hb3V0X29iamVjdF9wKTogIFRha2UgYSB0aGlyZCBwYXJhbWV0ZXIsCi0JdGhlIGludGVybmFsX2V4ZWMgc3RydWN0LCBhbmQgYXZvaWQgZXZlciBsb29raW5nIGF0IGFuCi0JZXh0ZXJuYWxfZXhlYy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQgdG8gcmVhZCB0aGUgZW50aXJlCi0JZXh0ZXJuYWxfZXhlYyBzdHJ1Y3QsIHN3YXAgYW5kIGNoZWNrIGl0cyBtYWdpYyBudW1iZXIsCi0Jc3dhcCBpbiB0aGUgd2hvbGUgc3RydWN0dXJlLCBhbmQgcGFzcyB0aGUgc3dhcHBlZC1pbiB2ZXJzaW9uIHRvCi0Jc29tZV9hb3V0X29iamVjdF9wLgotCSogYm91dC5jOiAgQnJpbmcgaW50byBtb2Rlcm4gZXJhLiAgVXNlIHNpbmdsZSBfb2JqZWN0X3Agcm91dGluZQotCWZvciBiaWctIGFhbmQgbGl0dGxlLWVuZGlhbi4gIFByb3ZpZGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsCi0JZXhlYyBoZWFkZXIgc3RydWN0cy4gIFVzZSBzZXBhcmF0ZSBzd2FwLWluIGFuZCBzd2FwLW91dCByb3V0aW5lcy4KLQotCSogbGliYW91dC5oOiAgTW92ZSBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBmcm9tIC4uL2luY2x1ZGUvYW91dDY0LmgKLQl0byBoZXJlLiAgQWRkIG9ial9zeW1ib2xfZW50cnlfc2l6ZSB0byBzdHJ1Y3QgYW91dGRhdGEuCi0JKiBhb3V0eC5oICguLi5zb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IG9ial9zeW1ib2xfZW50cnlfc2l6ZS4KLQotCSogLi4vaW5jbHVkZS9hb3V0NjQuaDogIENoYW5nZSBFWFRFUk5BTF9MSVNUX1NJWkUgdG8KLQlFWFRFUk5BTF9OTElTVF9TSVpFLiAgQ2FsbGVycyBjaGFuZ2VkLgotCi1GcmkgT2N0ICA0IDE4OjE4OjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIFJlbW92ZSBzdHJlcnJvcigpIHRvIGxpYmliZXJ0eS4KLQotCSogZWxmLmM6ICBSZW1vdmUgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzLCB1c2UgZ2VuZXJpYyBvbmUuICBMaW50LgotCSogbGliYmZkLWluLmgsIGxpYmJmZC5jOiAgQWRkIGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzLgotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX3tnZXQsc2V0fV9zZWN0aW9uX2NvbnRlbnRzKTogIENoZWNrIHRoYXQKLQlsYXN0IGJ5dGUgb2YgdHJhbnNmZXIsIG5vdCBmaXJzdCBieXRlLCBpcyB3aXRoaW4gdGhlIHNlY3Rpb24uCi0KLQkqIGhvc3QtYW91dC5jOiAgUmVtb3ZlIGBCU0QnIGFyY2hpdmUgc3VwcG9ydC4gIExpbnQuCi0KLQkqIGFyY2h1cmVzLmM6IFJlbmFtZSBgc3RydWN0IGJmZF9hcmNoX2luZm9fc3RydWN0JyB0byBgc3RydWN0Ci0JYmZkX2FyY2hfaW5mbycuICBSZW5hbWUgYHR5cGVkZWYgYmZkX2FyY2hfaW5mb19zdHJ1Y3RfdHlwZScgdG8KLQlgYmZkX2FyY2hfaW5mb190eXBlJy4gIEFsbCB1c2VzIGNoYW5nZWQuCi0JKiByZWxvYy5jOiAgUmVuYW1lIGBiZmRfcmVsb2Nfc3RhdHVzX2VudW1fdHlwZScgdG8KLQlgYmZkX3JlbG9jX3N0YXR1c190eXBlJy4gIFJlbmFtZSBgYmZkX3JlbG9jX2NvZGVfZW51bV9yZWFsX3R5cGUnCi0JdG8gYGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZScuICAoVGhpcyBzZWVtcyB0byBiZSBhIG1pc25vbWVyLAotCWl0IG5lZWRzIGEgYmV0dGVyIG5hbWUuKSAgQWxsIHVzZXMgY2hhbmdlZC4KLQkqIHRhcmdldHMuYzogIFJlbmFtZSBgZW51bSB0YXJnZXRfZmxhdm91cl9lbnVtJyB0byBgZW51bQotCXRhcmdldF9mbGF2b3VyJywgYW5kIHJlbW92ZSB0aGUgYF9lbnVtJyBmcm9tIGFsbCBvZiB0aGUgZW51bQotCXZhbHVlcyB0aGVtc2VsdmVzLiAgQWxsIHVzZXMgY2hhbmdlZC4KLQotCSogY29uZmlndXJlLmluLCBjb25maWcvaC1pMzg2bWFjaDogIGkzODYgbWFjaCBob3N0LgotCSogY29uZmlnL3QtaTM4Ni1hb3V0OiAgVXNlIGhvc3QtYW91dC5jLgotCi0JKiB0cmFkLWNvcmUuYzogIEdpdmUgaXQgaXRzIG93biB4dmVjJ3MgdG8gbWFrZSBpdCBpbmRlcGVuZGVudAotCW9mIG90aGVyIGZpbGUgZm9ybWF0cy4KLQkqIGVjb2ZmLmMsIGhvc3QtYW91dC5jOiAgUmVtb3ZlIHJlZnMgdG8gdHJhZC1jb3JlLgotCSogY29uZmlnL3QtZGVjMzEwMCwgdC1ocDMwMGJzZCwgdC10YWhvZSwgdC12YXg6ICBEZWZpbmUgVFJBRF9DT1JFLgotCSogdGFyZ2V0cy5jOiAgI2lmZGVmIFRSQURfQ09SRSwgaW5jbHVkZSBpdCBpbiB0aGUgdmVjdG9yLgotCi1GcmkgT2N0ICA0IDE3OjM4OjAzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYzogRXh0ZW5kZWQgTkVXSE9XVE8gbWFjcm8KLQkqIGllZWUuYzogQ2hhbmdlZCB0aGUgd2F5IDhiaXQgcGNyZWwgaXMgZG9uZQotCSogY3B1LWg4MzAwLmM6IGdvdCB0aGUgcmVnaXN0ZXJzIGluIHRoZSByaWdodCBvcmRlcgotCi1UaHUgT2N0ICAzIDE5OjM5OjU1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIGVudW0gYm9vbGVhbiA9PiBlbnVtIGJmZF9ib29sZWFuIGZvciBTVlI0LiAgR3VtYnkncwotCXByZWRpY3Rpb24gaXMgdmluZGljYXRlZCEKLQotCSogYmZkLWluLmgsIGxpYmJmZC1pbi5oLCBkb2MvTWFrZWZpbGUsIGRvYy90b2xpYmJmZCwgZG9jL2ludG9iZmQ6Ci0JUmVtb3ZlIHJlZnMgdG8gaG93dG8uYywgc2luY2UgU3RldmUgZm9yZ290LgotCi1UaHUgT2N0ICAzIDA3OjQ5OjIxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IHRvb2sgdGhlIGFib3J0IG91dCBvZiBzZXRfYXJjaF9tYWNoIHNvIHRoYXQgb2JqZHVtcCAtaSB3aWxsCi0Jc3RpbGwgd29yay4gTm93IGFsbG93cyBhbnkgYXJjaGl0ZWN0dXJlL21hY2hpbmUgdG8gYmUgc2V0LgotCi1XZWQgT2N0ICAyIDEzOjUwOjM1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG93dG8uYyBkZWxldGVkIGFuZCBtb3ZlZCBjb2RlIHRvIHJlbG9jLmMKLQotCSogbGliYmZkLmgsIGxpYmJmZC1pbi5oIHJlbW92ZWQgJGlkIHN0dWZmIGZvciByZWFsCi0KLQkqIGNwdS1oODMwMC5jIE1hZGUgaXQgbWF0Y2ggdmFyaW91cyBkaWZmZXJlbnQgc3BlbGxpbmdzIG9mIGg4MzAwLgotCi0JKiBhcmNodXJlcy5jOiBUb29rIG91dCB0aGUgZmlyc3QgY2hhciBmaWx0ZXIgd2hpY2ggbWFkZSBpdCBvbmx5Ci0JbG9vayBmb3IgYSBjcHUvYXJjaCBtYXRjaCB3aGVuIHRoZSBmaXJzdCBjaGFycyBvZiBzdXBwbGllZCBhbmQKLQl0ZXN0ZWQgbmFtZXMgd2VyZSB0aGUgc2FtZS4KLQotCSogdGFyZ2V0cy5jIHJlbW92ZWQgb2FzeXMgc3R1ZmYsIHBlbmRpbmcgc29tZW9uZSB0byBmaXggdGhlIGJ1Z3MKLQlpbiBpdC4KLQotCi1UdWUgT2N0ICAxIDEyOjI5OjQ0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCB0YXJnZXRzLmMsIGVsZi5jOiAgQWRkIHByZWxpbWluYXJ5Ci0JRUxGIHN1cHBvcnQgZ29vZCBlbm91Z2ggZm9yIEdEQi4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2gtYW1peCwgY29uZmlnL3QtbTY4ay1lbGY6ICBIYW5kbGUKLQltNjhrLWNibS1zdnI0IGhvc3QgYW5kIHRhcmdldC4KLQkqIGNvbmZpZy90LW02OGstY29mZiwgdC1tODhrLWNvZmYsIHQtbTg4ay1hb3V0OiAgTWFrZSBmaWxlcyBub25lbXB0eQotCXNvIGBkaWZmJyBhbmQgYHBhdGNoJyBjYW4gY29wZS4KLQotVHVlIE9jdCAgMSAxMToyNDozMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmM6IHJlbW92ZWQgdGV4aW5mbyBlcnJvcgotCi0JKiBpbml0LmM6IGFkZGVkIHRleGluZm8gaG9va3MsIGFuZCByZW1vdmVkIGluaXRpYWxpemF0aW9uIGVycm9yCi0JbWVzc2FnZS4KLQotCSogbGliY29mZi1pbi5oLCBsaWJiZmQtaW4uaCByZW1vdmVkICRpZCBmaWVsZCBzbyBjdnMgY2FuIG1lcmdlCi0Jd2l0aG91dCBjb21wbGFpbnRzLgotCi1UdWUgT2N0ICAxIDA1OjAyOjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjcHUtaTk2MC5jOiAgQXZvaWQgbnVtZXJpY2FsIGNvdW50IG9mIGluaXRpYWxpemVycy4KLQotCVZheCBVbHRyaXggY2hhbmdlcyBmcm9tIERhdmlkIFRheWxvciA8dGF5bG9yQHRoaW5rLmNvbT46Ci0JKiBob3N0LWFvdXQuYzogIE1ha2UgbGl0dGxlLWVuZGlhbiB2ZWN0b3IgcmVhbGx5IGxpdHRsZS1lbmRpYW4uCi0JKiBjb25maWd1cmUuaW46ICBTZXBhcmF0ZSB2YXggYW5kIHRhaG9lIGNhc2VzLCBoYW5kbGUgdWx0cml4LgotCSogY29uZmlnL3QtdmF4OiAgQWRkIHRyYWQtY29yZS5vLgotCSogY29uZmlnL2gtdmF4dWx0OiAgTmV3IGhvc3Qgc3lzdGVtLgotCi1Nb24gU2VwIDMwIDE1OjEzOjQ2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggVkVSU0lPTiwgY2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDAuMTgsIHRoaXMgbWFrZXMgYQotCWdhcCwgYnV0IG5vdyBpcyB0aGUgc2FtZSBhcyB0aGUgbGlua2VyIHZlcnNpb24gbnVtYmVyLgotCi0JKiBjcHUtYTI5ay5jLCBjcHUtaTM4Ni5jLCBjcHUtbTY4ay5jLCBjcHUtbWlwcy5jLCBjcHUtdmF4LmMsCi0JY3B1LWg4MzAwLmMsIGNwdS1pOTYwLmMsIGNwdS1tODhrLmMsIGNwdS1zcGFyYy5jOiBhZGRlZC4gVGhlc2UKLQlmaWxlcyB3aWxsIGV2ZW50dWFsbHkgY29udGFpbiBwcm9jZXNzb3Igc3BlY2lmaWMgYml0cyBmb3IgYmZkLAotCWxpa2Ugc3RyYW5nZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFuZCBkaXMvYXNzZW1ibHkuICBTbyBmYXIgb25seQotCXRoZSBIOCBoYXMgYmVlbiBldmVuIHBhcnRpYWxseSBkb25lLiAgVGhpcyB3b3JrIGFsc28gdGllcyBpbiB3aXRoCi0JdGhlIGNoYW5nZSBpbiBoYW5kbGluZyBhcmNoaXRlY3R1cmVzLgotCi0JKiBhbWRjb2ZmLmM6IChhMjlrX3JlbG9jKSBmaXggZXJyb3IgbWVzc2FnZS4KLQotCSogYW91dC1mMS5oOiAoY2hvb3NlX3JlbG9jX3NpemUpIG5vdyBjYWxscyBiZmRfZ2V0X2FyY2ggdG8KLQlkaXNjb3ZlciB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBiZmQuIChzdW5vczRfY2FsbGJhY2spIGNhbGxzIHRoZQotCWZ1bmN0aW9uIGJmZF9zZXRfYXJjaF9tYWNoIHJhdGhlciB0aGFuIHN0dWZmaW5nIHN0dWZmIGRpcmVjdGx5Ci0JaW50byB0aGUgYmZkLiAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyksIGNoYW5nZWQgbmFtZXMgb2YKLQlhY2Nlc3NvciBmdW5jdGlvbnMuCi0KLQkqIGFvdXR4Lmg6IChzZXRfYXJjaF9tYWNoKSBub3cgY2FsbHMgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCB0bwotCXNldHVwIHRoZSBlbnZpcm9ubWVudC4KLQotCSogYXJjaGl2ZS5jOiAoYmZkX3NsdXJwX2NvZmZfYXJtYXApIGNvZmYgYXJjaGl2ZXMgYWx3YXlzIGhhdmUgdGhlCi0JaGVhZGVycyBpbiBiaWcgZW5kaWFuIGZvcm1hdCwgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQotCWhvc3Qgb3IgdGFyZ2V0LgotCi0JKiBhcmNodXJlcy5jOiB0b3RhbGx5IGNoYW5nZWQuIE5vdyBhbiBhcmNoaXRlY3R1cmUgaXMgcmVwcmVzZW50ZWQKLQl3aXRoIGEgcG9pbnRlciB0byBhbiBpbmZvIHN0cnVjdHVyZSByYXRoZXIgdGhhbiBhbiBlbnVtZXJhdGVkIHR5cGUKLQlhbmQgYSBsb25nLiBUaGUgb2xkIGluZm8gaXMgYXZhaWxhYmxlIGFzIHR3byBlbGVtZW50cyBpbiB0aGUKLQlzdHJ1Y3R1cmUuICBGdXR1cmUgZW5oYW5jZW1lbnRzIHRvIGFyY2hpdGVjdXJlIHN1cHBvcnQgd2lsbAotCWludm9sdmUgcG9pbnRlcnMgdG8gbWV0aG9kcyBiZWluZyBwbGFjZWQgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUuCi0KLQkqIGJmZC5jOiBjaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBiZmQgc3RydWN0dXJlIGZvciB0aGUgbmV3Ci0JYXJjaGl0ZWN0dXJlIHN0dWZmLgotCi0JKiBib3V0LmM6IChiX291dF9zZXRfYXJjaF9tYWNoKSBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3Ci0JYXJjaGl0ZWN0dXJlIG1lY2hhbmlzbS4KLQotCSogY29mZmNvZGUuaDogKGNvZmZfc2V0X2FyY2hfbWFjaCwgY29mZl9zZXRfZmxhZ3MpIGNoYW5nZWQgdG8gdXNlCi0JdGhlIG5ldyBhcmNoaXRlY3R1cmUgbWVjaGFuaXNtLgotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGg4IHN0dWZmLgotCi0JKiBpZWVlLmM6IHRvbyBtYW55IGNoYW5nZXMgdG8gbm90ZS4gIE5vdyBpZWVlIGZpbGVzIHdyaXR0ZW4gd2l0aAotCWJmZCBnYXMgYW5kIGxkIGNhbiBiZSByZWFkIGJ5IGdsZCBhbmQgaWVlZSBvbmx5IGxpbmtlcnMgYW5kCi0Jc2ltdWxhdG9ycy4KLQotCSogbGliYmZkLmMsIGxpYmJmZC5oOiBjaGFuZ2VkIHByb3RvdHlwZSBvZiBiZmRfd3JpdGUuCi0KLQkqIG5ld3NvczMuYzogKG5ld29zM19jYWxsYmFjaykgbm93IGNhbGxzIGJmZF9zZXRfYXJjaF9tYWNoIHJhdGhlcgotCXRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0KLQkqIG9hc3lzLmM6IChvYXN5c19vYmplY3RfcCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggcmF0aGVyCi0JdGhhbiBmaXhpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4KLQotCSogb3BuY2xzLmM6IChuZXdfYmZkKSBtYWtlcyBzdXJlIHRoYXQgYmZkX2luaXQgaGFzIGJlZW4gY2FsbGVkCi0JYmVmb3JlIG9wZW5pbmcgYSBiZmQuCi0KLQkqIHNyZWMuYzogKHNyZWNfc2V0X2FyY2hfbWFjaCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQlyYXRoZXIgdGhhbiBmaXhpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4KLQotCSogdGFyZ2V0cy5jOiAodGFyZ2V0X3ZlY3Rvcikgbm93IGJ5IGRlZmluaW5nIFNFTEVDVF9WRUNTIChwZXJoYXBzCi0JaW4gdGhlIHQvaG1ha2UgZmlsZSkgYSB1c2VyIGNhbiBzZWxlY3Qgd2hpY2ggYmFja2VuZHMgdGhleSB3YW50Ci0JbGlua2VkIHdpdGggYmZkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNvdXJjZS4KLQotCSogaW5pdC5jOiBuZXcsIGxvb2tzIGFmdGVyIGluaXRpYWxpemluZyBtb2R1bGVzLgotCi0JKiBob3d0by5jOiBmb3IgZnV0dXJlIHVzZSwgd2lsbCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byB3b3JrIG91dAotCXdoYXQgY29va2llIHRvIHVzZSBhcyBhIGhhbmRsZSBvbiBhIHJlbGNvYXRpbyBob3d0by4KLQotTW9uIFNlcCAzMCAxMzozMToxNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jOiAgQmV0dGVyIGVycm9yIGNoZWNraW5nLCBwYXJ0bHkgZnJvbSBQZXRlciBTY2hhdWVyLgotCShzcmVjX29iamVjdF9wKTogIEF2b2lkIGFzc3VtaW5nIGFueSBmaWxlIHRoYXQgc3RhcnRzIHdpdGggJ1MnIGlzCi0JYW4gUy1yZWNvcmQgZmlsZSEgIChDaGVjayBmb3IgMyB1cHBlcmNhc2UtaGV4IGRpZ2l0cyBhZnRlciBpdC4pCi0JKElTSEVYKTogIERlZmluZSBuZXcgbWFjcm8gZm9yIGNoZWNraW5nIHN1cHBvc2VkbHkgaGV4IGNoYXJhY3RlcnMuCi0JKHBhc3Nfb3Zlcik6ICBUcmVhdCBhcyBFT0YgYW55IFMtcmVjb3JkIGxpbmUgdGhhdDoKLQkgICAgKiAgZG9lc24ndCBoYXZlIGhleCBpbiBlaXRoZXIgc2l6ZSBjaGFyYWN0ZXIKLQkgICAgKiAgcHJvZHVjZXMgYSBzaXplIGxhcmdlciB0aGFuIDB4N0YKLQkgICAgKiAgaGFzIGFuIHVucmVjb2duaXplZCB0eXBlIG51bWJlcgotCi1UaHUgU2VwIDI2IDE1OjI3OjI5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCwgYW91dHguaCwgYm91dC5jLCBjb2ZmY29kZS5oLCBob3N0LWFvdXQuYywgb2FzeXMuYywKLQlvcG5jbHMuYzogIExpbnQgKHNhYmVyIGFjdHVhbGx5KS4KLQotVGh1IFNlcCAyNiAxMToyNDoyNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogU2V0IGhlYWRlcidzIGFfdGV4dCBmaWVsZCBhbHdheXMuCi0JKiBuZXdzb3MzLmM6IEZpeGVkIHR3byB0eXBlczogbmV3b3MzIC0+IG5ld3NvczMuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IHBjLXJlbGF0aXZlIHJlbG9jYXRpb24KLQl0byB1c2UgY29ycmVjdCBzZWdtZW50LgotCi1Nb24gU2VwIDIzIDE4OjI0OjM0IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChwcmludF9zeW1ib2wpOiAgSGFuZGxlIG1pc3Npbmcgc3ltYm9sLT5uYW1lLgotCi1GcmkgU2VwIDIwIDEyOjI2OjAxIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzd2FwY29yZV9zcGFyYyk6ICBDaGFuZ2UgbmFtZSBvZiBVU1JTVEFDSywgZml4IGNvbW1lbnQKLQlhdCB0b3Agb2Ygcm91dGluZS4KLQotVHVlIFNlcCAxNyAxNzoyMzo0OSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBvYXN5cy5jLCBjb25maWd1cmUuaW4sIGNvbmZpZy9oLWlyaXgzLCBjb25maWcvdC1pcml4MzoKLQlhZGQgc2dpL2lyaXggc3VwcG9ydC4KLQotVGh1IFNlcCAxMiAxNDoyOTowOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGZvciB0aGUgQU1EIDI5MDAwIFVsdHJhY29tcHV0ZXIgcG9ydCBmcm9tIERhdmlkIFdvb2QuCi0JKHdvb2RAbnl1LmVkdSkuCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBIYW5kbGUgTk9fRkNOVEwuCi0KLQkqIE1ha2VmaWxlLmluOiAgTWFrZSBzdWJkaXJzIHdvcmsgYnkgdXNpbmcgJChJTkNESVIpIGluIHRoZQotCWNydWRlIGRlcGVuZGVuY2llcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogIFBhc3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JY3VycmVudCBmaWxlJ3MgY29mZiBzeW1ib2wgZm9ybWF0IHRvIEJGRCB2aWEgdGhlIGNvZmZfZGF0YSBzdHJ1Y3QuCi0JKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiAgb2JqX2ljb2YgPT4gY29mZl9kYXRhLgotCShjb2ZmX3N3YXBfc3ltX3tpbixvdXR9KTogIENoZWNrIHRoYXQgU1lNTk1MRU4gPT0gRV9TWU1OTUxFTi4KLQkoY29mZl9zd2FwX2F1eF97aW4sb3V0fSk6ICBDaGVjayB0aGF0IEZJTE5NTEVOID09IEVfRklMTk1MRU4KLQlhbmQgRElNTlVNID09IEVfRElNTlVNLgotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIGEyOWstKi0qIGhvc3RzLCBhbmQgdGFyZ2V0cwotCWEyOWstKi1jb2ZmLCBhMjlrLSotYW91dCwgYW5kIGEyOWstKi1zeW0xLgotCSogbGliY29mZi1pbi5oOiAgQWRkIGxvY2FsX25fYnRtYXNrLCBsb2NhbF9uX2J0c2hmdCwKLQlsb2NhbF9uX3RtYXNrLCBsb2NhbF9uX3RzaGlmdCwgbG9jYWxfc3ltZXN6LCBsb2NhbF9hdXhlc3osCi0JbG9jYWxfbGluZXN6IHRvIGBjb2ZmX2RhdGEnICh0ZGF0YSkgc3RydWN0LgotCShjb2ZmX2RhdGEsIGNvZmZfZGF0YV90eXBlLCBjb2ZmX3RkYXRhKTogIFJlbmFtZSBzdHJ1Y3QgaWNvZmRhdGEuCi0JKiBjb25maWcvaC11bHRyYTM6ICBIYW5kbGUgYTI5ay0qLSogaG9zdHMgYXMgVWx0cmFjb21wdXRlcnMuCi0KLVRodSBTZXAgMTIgMTQ6MDc6MjIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAkKE1BS0UpIGZvciBtYWtlLCAkKGRvY2RpcikgZm9yIGRvYwotCSogZG9jL01ha2VmaWxlOiByZWR1bmRhbnQgZGVwZW5kZW5jaWVzIGZvciBTdW4tbWFrZSBWUEFUSCBidWcKLQotVHVlIFNlcCAxMCAyMDozNDoxMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfY29yZV9maWxlX3ApOiAgUmVsZWFzZSB0aGUgcmlnaHQgc3RvcmFnZSBpbgotCWVycm9yIGNhc2UuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgRml4IGhlYWRlciBjb21wYXJpc29uLgotCSogYW91dHguaDogIEF2b2lkIHNoaWZ0cyBvZiAzMiBiaXRzLCB1bmRlZmluZWQgaW4gQy4gIExpbnQuCi0JKiBib3V0LmMsIGljb2ZmLmMsIGllZWUuYywgbGliYmZkLmMsIG9hc3lzLmM6ICBnY2MgLU8gLVcgbGludC4KLQotV2VkIFNlcCAgNCAwMDo0NDo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlBbGxvdyBHREIgdG8gcGF0Y2ggb2JqZWN0IGZpbGVzLgotCi0JKiBhb3V0ZjEuaCAoc3Vub3NfY29yZV9maWxlX3ApOiAgU2V0IFNFQ19IQVNfQ09OVEVOVFMgb24gYWxsIHNlY3Rpb25zLgotCSogdHJhZC1jb3JlLmggKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6ICBEaXR0by4KLQkqIGFvdXR4LmggKGFvdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiAgT24gZmlyc3Qgb3V0cHV0LCBjaGVjawotCWFiZmQtPmRpcmVjdGlvbiBhbmQgY29tcGxhaW4gaWYgZXJyb25lb3VzLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBjcnVkZSBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBTZXAgIDMgMTM6NDY6MTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLyogYW91dHguaCBjb25maWd1cmUqIHNob3J0ZW5lZCBhbGwgdGhlIGgvdG1ha2UteHh4eAotCXRvIGgvdC14eHh4IGZpbGVzIHNvIHRoYXQgZXZlcnl0aGluZyB3aWxsIHdvcmsgb24gU3lzdGVtIFYuCi0KLUZyaSBBdWcgMjMgMTM6NTE6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oOiAgQWRkIGluZm9ybWF0aW9uIG9uIGhvc3QtYW91dC5jIGFuZCBob3cgdG8gY29uZmlndXJlCi0JdG8gdXNlIGl0LCB0byB0aGUgbWFudWFsLgotCSogY29uZmlndXJlLmluOiAgVGl4IHR5cG8uCi0JKiBlY29mZi5jOiAgSWYgY29tcGlsaW5nIGZvciBERUMzMTAwLCB1c2UgdHJhZF91bml4IGNvcmUgZmlsZXMsCi0JZWxzZSBkdW1teSBvdXQgdGhlIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6ICBJZiBIT1NUX0RBVEFfU1RBUlRfQUREUiBpcwotCXNwZWNpZmllZCwgdXNlIGl0IHRvIGxvY2F0ZSB0aGUgZGF0YSBzZWN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9zeW1ib2xzKTogIERlY2xhcmUgYnVmZmVyIGFzIGJmZF9ieXRlcwotCXJhdGhlciB0aGFuIGFzIGNoYXJzIChsaW50KS4KLQotVGh1IEF1ZyAyMiAyMjoyMDoxOSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCwgY29mZmNvZGUuaDogIHNhYmVyaXplZC4KLQotVGh1IEF1ZyAyMiAxMToyNzowNiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IHNvbWUgY2xlYW51cCwgcmVpbmNvcnBvcmF0ZWQgbW9yZSBpbnRybyBtYXR0ZXIgZnJvbQotCWJmZC5kb2MKLQliZmQuYywgdGFyZ2V0cy5jOiBtaW5vciByZXdvcmRpbmcgb2YgZG9jIHNlZ21lbnRzCi0KLQotV2VkIEF1ZyAyMSAxOToxMzoyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgVXNlIEhPU1RfVEVYVF9TVEFSVF9BRERSLAotCWV0YywgcmF0aGVyIHRoYW4gVEVYVF9TVEFSVF9BRERSLgotCSogaG9zdC1hb3V0LmM6ICBSZW1vdmUgI2lmIDAgYXJvdW5kIHdob2xlIHRoaW5nLgotCVVwZGF0ZSB0byBtb2Rlcm4gKDMyLzY0LWJpdCkgYS5vdXQgbmFtaW5nIGNvbnZlbnRpb25zLgotCUluY2x1ZGUgYSBsYXJnZSBjaHVuayBvZiAuLi9pbmNsdWRlL2Eub3V0LmdudS5oIHRvIGdldCBtYWNyb3MgdGhhdAotCWFyZSBub3QgZGVmaW5lZCBieSB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMuCi0JKGhvc3RfYW91dF97MzIsNjR9X3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBVc2UgdGhlIFdSSVRFX0hFQURFUlMKLQltYWNybyB1c2VkIGJ5IHRoZSBvdGhlciBhLm91dCBpbXBsZW1lbnRhdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogIEdpdmUgZGVwZW5kZW5jaWVzIHRvIE9QVElPTkFMX0JBQ0tFTkRTLgotCi1XZWQgQXVnIDIxIDE0OjMzOjA2IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIHRhcmdldHMgImJmZC5kdmkiIGFuZCAiYmZkLnBzIiBpbnN0ZWFkIG9mCi0JdGV4ZG9jIGFuZCBwc2RvYzsgbWFrZSB0aGVzZSBkZXBlbmQgb24gZ2VuZXJhdGVkIC50ZXhpJ3MKLQotCSogc2Nhbml0LCAobmV3KSB1blBST1RPOiB0dXJuIFBST1RPIG1hY3JvcyBpbnRvIEFOU0kgZGVjbGFyYXRpb25zIGluCi0JZG9jCi0KLQkqIGJmZC5jLCByZWxvYy5jLCBzeW1zLmM6IG1pbm9yIHNwZWxsaW5nL3dvcmRpbmcgZml4ZXMgaW4gZG9jCi0JcG9ydGlvbnMKLQotCSogTWFrZWZpbGUuaW4sIGF3a3NjYW4taXAsIGF3a3NjYW4tcCwgaW50b2JmZCwKLQlsaWJiZmQuaCwgbGliY29mZi5oLCB0b2xpYmNvZmY7IG5ldyBiZmQtaW4uaCwgbGliYmZkLWluLmgsCi0JbGliY29mZi1pbi5oOiAoYSkgdXNlIHNlcGFyYXRlIGZpbGVzIGZvciBpbnZhcmlhbnQgcGFydHMgb2YgYmZkLmgsCi0JbGliYmZkLmgsIGFuZCBsaWJjb2ZmLmg7IChiKSBpbiBnZW5lcmF0ZWQgcGFydHMgb2Ygc2FtZSwgdXNlIGxlc3MKLQlvYnRydXNpdmUgbWFya3MgaW5kaWNhdGluZyAuYyBvcmlnaW5zLgotCi0JKiBiZmQudGV4aW5mbzogZ2VuZXJhbGl6ZSBtb3N0IHJlZmVyZW5jZXMgdG8gbGlua2VyCi0KLVR1ZSBBdWcgMjAgMTU6MTg6MDIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmNsdWRlIGNvcmUucCBpbiBQUk9UT1MgKGJ1aWxkaW5nIGJldHRlciBiZmQuaCkKLQkqIGFyY2h1cmVzLmM6IHJlbW92ZSBlbXB0eSBmb28oKSBkZWZpbml0aW9uIChjcmVwdCBpbiBhdCB2bjEuOSkKLQotTW9uIEF1ZyAxOSAxMzo0ODoyMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IHVzZSBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24gaW5zdGVhZCBvZiBsb3RzIG9mCi0JQHBhZ2UnczsgbWlub3IgcmVwaHJhc2luZyBpbiBJbnRyb2R1Y3Rpb24uCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgYmZkLmMsIGJmZC50ZXhpbmZvLCBjYWNoZS5jLAotCWNvZmZjb2RlLmgsIGNvcmUuYywgZm9ybWF0LmMsIGllZWUuYywgbGliYmZkLmMsIGxpYmJmZC5oLCBsaWJjb2ZmLmgsCi0Jb2FzeXMuYywgb3BuY2xzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmMgKGRvY3VtZW50YXRpb24KLQlzZWdtZW50cyk6IHVzZWQgQkZEIChjYXBzKSBtb3JlIGNvbnNpc3RlbnRseSBhcyBhIG5hbWUgaW4KLQlkaXNjb3Vyc2UsIGZpeGVkIGEgZmV3IG90aGVyIG1pbm9yIHR5cG9zIGFuZCB1c2VzIG9mIGZvbnRzCi0KLQotVGh1IEF1ZyAgOCAxNjo0Nzo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBmaXhlZCBidWcgd2hlcmUgc3RyaW5nIHRhYmxlIHNpemUgd2Fzbid0IGJlaW5nIHN3YXBwZWQuCi0KLVRodSBBdWcgIDEgMTY6MzU6MjggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jOiBhZGRlZCBTRUNfQ09OU1RSVUNUT1JfVEVYVHxEQVRBfEJTUyBmbGFncwotCi0JKiBzeW1zLmM6IGFkZGVkIEJTRl9DT05TVFJVQ1RPUiwgQlNGX1dBUk5JTkcgYW5kIEJTRl9JTkRJUkVDVAotCWZsYWdzLiAoYmZkX3ByaW50X3N5bWJvbF92YW5kZikgbm93IGtub3dzIHdoYXQgdG8gZG8gd2l0aCB0aGUKLQlhYm92ZSBmbGFncy4KLQotCSogYW91dHguaDogbWFkZSB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIGFuZAotCXRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIHByb2R1Y2UgdGhlIGFib3ZlIGZsYWdzLgotCi0KLVdlZCBKdWwgMzEgMDk6NTM6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhbGwgZmlsZXM6ICB1cGRhdGUgY29weXJpZ2h0IG5vdGljZXMgZm9yIEdQTCB2ZXJzaW9uIDIuCi0JSW5zdGFsbCBoZWFkZXIgY29tbWVudHMgYW5kIGF0dHJpYnV0ZSBtb3N0IG1vZHVsZXMgdG8gdGhlaXIKLQlhdXRob3JzLiAgQkZEJ3MgbmFtZSBpcyBub3cgb2ZmaWNpYWxseSAiQmluYXJ5IEZpbGUgRGVzY3JpcHRvciIsCi0Jc28gcmVtb3ZlIGFueSBjb25mbGljdGluZyBwZWpvcmF0aXZlcy4KLQlhcmNodXJlcy5oOiAgQ29uc2lzdHMgc29sZWx5IG9mIGNvbW1lbnRzOyByZW1vdmUgaXQuCi0KLUZyaSBKdWwgMjYgMTg6MTE6MzQgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGJmZC5jOiBNYWRlIGl0IGNvbXBpbGUgYWdhaW4uCi0KLUZyaSBKdWwgMTkgMDg6MTc6MDkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogbmV3c29zMy5jLCB0YXJnZXRzLmMsIGNvZmZjb2RlLmg6IG5ldyBwYXRjaGVzIGZyb20gRGF2aWQgV29vZAotCi0KLU1vbiBKdWwgMTUgMTY6Mjc6NDIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggYXJjaGl2ZS5jIGJmZC5jIGNvZmZjb2RlLmggY29yZS5jIGVjb2ZmLmMgaWVlZS5jCi0JYmZkLnRleGluZm8gb2FzeXMuYyBvcG5jbHMuYyByZWxvYy5jIHNyZWMuYzogTW9yZSBkb2N1bWVudGF0aW9uIG9uCi0JbGludCBmaXhlcy4KLQotCSogYW1kY29mZi5jIGJmZC50ZXhpbmZvIE1ha2VmaWxlLmluIDogRm9sZGVkIGluIGNoYW5nZXMgZm9yIGFtZAotCTI5ayBjb2ZmIGJ5IERhdmlkIFdvb2QgKHdvb2RAbGFiLnVsdHJhLm55dS5lZHUpLgotCi1UaHUgSnVsICA0IDA5OjUzOjE2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIEV2ZXJ5dGhpbmc6IGNyZWF0ZWQgc29tZSBuZXcgZmlsZXMsIGNvcmUuYyBmb3JtYXQuYywgcmVsb2MuYywKLQlzZWN0aW9uLmMgYW5kIHN5bXMuYyB0byBzcGxpdCB0aGUgZnVuY3Rpb25hbGl0eSBhIGJpdCBiZXR0ZXIuCi0JQ2xlYW5lZCB1cCB0aGUgcmVzdCBvZiB0aGUgZmlsZXMgYSBiaXQsIGFuZCBhZGRlZCBzb21lCi0JZG9jdW1lbnRhdGlvbi4KLQotCi1Nb24gSnVsICAxIDEzOjI5OjQ3IDE5OTEgIERhdmlkIFdvb2QgKHdvb2QgYXQgZGF2aWQudWx0cmEubnlhLmVkdSkKLQotCSogb3BuY2xzLmMsIC4uL2luY2x1ZGUvc3lzL2gtc3VuMy5oIC4uL2luY2x1ZGUvc3lzL2gtc3VuNC5oOiBmY250bAotCXJlYWxseSB0YWtlcyAzIGFyZ3VtZW50cywgcGF0Y2hlZCBjb2RlIGFuZCBhbW1lbmRlZCBwcm90b3R5cGVzLgotCi1GcmkgSnVuIDE0IDEzOjE5OjQwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvYmZkLmggKHN0cnVjdCBiZmRfdGFyZ2V0KTogQWRkZWQgbmV3IGZpZWxkCi0JImFsaWduX3Bvd2VyX21pbiIgd2hpY2ggY29udGFpbnMgdGhlIG1pbmltdW0gYWxpZ25tZW50IGZvciBhCi0Jc2VjdGlvbi4gVGhpcyBpcyB1c2VkIGluIGNvZmZfbmV3X3NlY3Rpb25faG9vay4gVGhlIGZpZWxkCi0JaW5zZXJ0aW9uIG5lY2Vzc2l0YXRlcyBhbiB1cGRhdGUgb2YgYWxsIGJhY2tlbmRzLi4KLQotCSogYW91dGYxLmgganVtcCB0YWJsZSBmaWVsZCBpbnNlcnRlZAotCi0JKiBhcmNoaXZlLmMoc25hcmZfYXJfaGRyKShiZmRfc2x1cnBfY29mZl9hcm1hcCkgY2FuIG5vdyBwYXJzZSBkZ3V4IHN0eWxlIGV4dGVuZGVkCi0JZmlsZW5hbWVzIHRvby4KLQotCSogYm91dC5jKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKSBmaXggdG8gYXNzZXJ0aW9uIHRlc3RzLiBKdW1wCi0JdGFibGUgZmllbGQgaW5zZXJ0ZWQuCi0KLQkqIGNvZmZjb2RlLmgoanVzdCBhYm91dCBldmVyeXRoaW5nKSBOb3cgcGF0Y2hlcyB1cCBzeW1ib2wgdGFibGVzCi0JdXNpbmcgYSBkaWZmZXJlbnQgbWVjaGFuaXNtLiBUaGUgSW50ZWwgbWFqb3IgYnVnIGhhcyBiZWVuIGZpeGVkLAotCWFuZCB0aGUgbGlua2VyIGNhbiBzZWxmIGhvc3Qgb24gdGhlIEF2aWlvbiBhbmQgYmUgZGVidWdnZWQgd2l0aAotCWdkYi4KLQotCSogZWNvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsIGkzODZjb2ZmLmM6IG5ldwotCWluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsICBpY29mZi5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZQotCXBhdGNoLCBpZWVlLmM6IGNhbiBub3cgcmVhZCBhcmNoaXZlcyBjb250YWluaW5nIGllZWUgbW9kdWxlcy4sCi0JbGliY29mZi5oOiBhZGRlZCAoY29tYmluZWRfZW50cnlfdHlwZSksIGxpYmllZWUuaDogdXBlZCBtYXgKLQlzZWN0aW9ucyB0byAyMCwgbTY4a2NvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsCi0JbTg4a2Jjcy5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwgb2FzeXMuYzogdmFyaW91cyBidWdzCi0JZml4ZWQuIG9wbmNscy5jOiBhZGRlZCBiZmRfYWxsb2NfZ3JvdyBhbmQgYmZkX2FsbG9jX2ZpbmlzaC4KLQlzcmVjLmM6IGp1bXAgdGFibGUgcGF0Y2guIHRyYWQtY29kZS5jIGZpeGVkICNJRiB0eXBlbwotCi1GcmkgSnVuICA3IDEyOjM1OjQ2IDE5OTEgIFNlYW4gRmFnYW4gIChzZWYgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLSAJKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogYWRkZWQgZWxzZSBjYXNlIHRvIGRlYWwgd2l0aAotIAlmaWxlbmFtZXMgbGVzcyB0aGFuIDkgY2hhcmFjdGVycy4KLQotCi1UaHUgSnVuICA2IDE4OjI3OjM4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvb2FzeXMuaCBvYXN5cy5jIChvYXN5c19hcmNoaXZlX3ApOiBmaXhlZCBzbyBpdCB3b3JrcwotCi0JKiBzcmVjLmM6IG5vdyBhbGxvd3MgYW55IG51bWJlciBvZiBzZWN0aW9ucyB0byBiZSBjcmVhdGVkIGluIGEKLQlmaWxlLiBPdXRwdXRzIGFkZHJlc3NlcyBvZiB0aGUgcmlnaHQgbGVuZ3RoLgotCi1UaHUgTWF5IDMwIDE1OjMwOjEwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfY2hlY2tfZm9ybWF0KTogRml4ZWQgcHJvYmxlbSB3aGVyZSB3aGVuIGEgZGVmYXVsdGVkCi0JdGFyZ2V0IGRpZG4ndCBtYXRjaCwgdGhlIGZvcm1hdCBnb3Qgc2V0IHRvIHRoZSBhdHRlbXB0ZWQgbWF0Y2gsCi0JYnJlYWtpbmcgYSBmdXR1cmUgdGVzdC4KLQotICAgICAgICAqLi4vaW5jbHVkZS9pMzg2Y29mZi5oIDogZml4ZWQgdHlwbyBpbiB0eXBlIGZpZWxkIHdpdGggc2l6ZQotCi0JKiBpMzg2Y29mZi5jIGljb2ZmLmMgbTg4ay1iY3MuYyBlY29mZi5jIC4uL2luY2x1ZGUvYmZkLmggOiBBZGRlZAotCXN1cHBvcnQgaW4gdGhlIGp1bXAgdGFibGUgZm9yIHRoZSBzd2FwcGluZyByb3V0aW5lcyBleHBvcnRlZCB0bwotCWdkYi4gTm93IGdkYiB3b3JrcyB3aXRoIHRoZSAzODYuCi0KLVR1ZSBNYXkgMjggMTc6MjE6NDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20gZ2RiLTMuOTUgcmVsZWFzZS4KLQlNYWtlZmlsZS5pbjogIEFsbG93IGhtYWtlIGFuZCB0bWFrZSBmaWxlcyB0byBhZGQgT0ZJTEVTLgotCWFvdXRmMS5oOgotCWJmZC5jOiAgc3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLiAgV2hlbgotCXNlYXJjaGluZywgdGFrZSBkZWZhdWx0IHRhcmdldCBpbiBwcmVmZXJlbmNlIHRvIG90aGVycy4KLQliZmQuZG9jOiAgdHlwb3MKLQlpZWVlLmMsIG9hc3lzLmM6ICBBdm9pZCB1c2luZyB0aGUgInRkYXRhIiBtYWNyb3MgbGVmdCBvZiBhc3NpZ25tZW50LgotCWxpYmEub3V0Lmg6ICBEb24ndCBoYXJkLWNvZGUgZmlsZSBvZmZzZXRzOyB1c2UgTl8gbWFjcm9zIGZvciB0aGVtLgotCWxpYmJmZC5oOiAgU3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLgotCW9wbmNscy5jOiAgU3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLgotCXRhcmdldHMuYzogIFNlYXJjaCBpcyBzaG9ydC1jaXJjdWl0ZWQgaWYgZGVmYXVsdCB0YXJnZXQgbWF0Y2hlcy4KLQlsaWJvYXN5cy5jLCBsaWJpZWVlLmM6ICBVbmRvIGJvdGhuZXIgY2hhbmdlcyB0aGF0IG1ha2UgbWFjcm9zCi0Jd29yayB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50LCBidXQgd2hpY2ggZGVwZW5kIG9uIHRoZQotCXJlcHJlc2VudGF0aW9ucyBvZiBkaWZmZXJlbnQgcG9pbnRlciB0eXBlcyBiZWluZyB0aGUgc2FtZS4KLQotRnJpIE1heSAyNCAxODo1Njo1MiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpMzg2Y29mZi5jOiBjcmVhdGVkLgotCSogY29mZmNvZGUuaDogYWRkZWQgc3VwcG9ydCBmb3IgMzg2LgotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN1cHBvcnQgZm9yIDM4Ni4KLQkqIC4uL2luY2x1ZGUvaTM4NmNvZmYuaDogY3JlYXRlZAotCi1XZWQgTWF5IDIyIDA3OjI2OjM4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IHJlbW92ZWQgYWxsIHB1dF94XzxzaXplcz4KLQkqIGxpYmJmZC5jOiBDaGFuZ2VkICNpZmRlZiBfX0dOVUNfXyB0byAjaWZkZWYgSE9TVF82NF9CSVQsIEFkZGVkCi0JREVGVU5TCi0KLQotVHVlIE1heSAyMSAwODo1ODo1OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCShib3RobmVyKQotCSogb3BuY2xzLmM6IENoYW5nZWQgb2JzdGFja19jaHVua19hbGxvYyB1c2UgeG1hbGxvYwotCi1Nb24gTWF5IDIwIDE3OjEyOjE3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGV2ZXJ5dGhpbmc6IFJlbW92ZWQgc3lzZGVwLmggZnJvbSBiZmQuaCBhbmQgcHV0IGJhY2sgaW50byBmaWxlcwotCWZyb20gd2hpY2ggaXQgd2FzIHNwbGl0IG91dC4gTm93IDY0IGJpdCB2ZXJzaW9uIGlzIGJ1aWx0IHdpdGggYQotCS1ESE9TVF82NF9CSVQ9ImxvbmcgbG9uZyIgb24gdGhlIGNvbXBpbGUgbGluZS4KLQotRnJpIE1heSAxNyAxOTozNToyNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JQ2hhbmdlZCBhbGwgdGhlIFtnZXR8cHV0XVtuYW1lXSByb3V0aW5lcyB0byB1c2UgIFtnZXR8cHV0XV9bc2l6ZQotCWluIGJ5dGVzXS4KLQotCVB1dCBpbiBzdXBwb3J0IGZvciA2NCBiaXQgd29yay4gTm93IHR3byB2ZXJzaW9ucyBvZiBiZmQgbWF5IGJlCi0JZ2VuZXJhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIHN0YXRlIG9mIFRBUkdFVF82NF9CSVQsIG9uZSB3aGljaCBpcwotCTMyIGJpdCBvbmx5LCBhbmQgb25lIHdoaWNoIGlzIDY0LzMyIGJpdHMuCi0JQ3JlYXRlZCBuZXcgYmFjayBlbmQgJ2RlbW82NCcgdG8gdGVzdCA2NCBiaXQgZnVuY3Rpb25hbGl0eS4KLQotCVJlbmFtZWQgc29tZSBmaWxlcyB0byB3b3JrIG9uIERPUy4KLQotCSogYXJjaGl2ZS5jOiBsaW50ICogYmZkLmM6IHByb3RvdHlwZXMgYW5kIGxpbnQuICogZWNvZmYuYzogYWRkZWQKLQk2NGJpdCB0cmFuc2ZlciAJKiBpY29mZi5jOiBhZGRlZCA2NGJpdCB0cmFuc2ZlciAqIGllZWUuYzogbmFtZQotCWNoYWdlLCA2NCBiaXQgdHJhbnNmZXIuICogbGliYS5vdXQuaDogU3BsaXQgb3V0IGNvbW1vbiBjb2RlIGZyb20KLQlzdW5vcyBhbmQgbmV3c29zIGludG8gbGliYS5vdXQuIE5hbWUgY2hhbmdlcyBhbmQgcHJvdG90eXBlIG1vZHMuICoKLQlsaWJiZmQuYzogbGludCBhbmQgcHJvdG90eXBlcywgZXh0cmEgNjRiaXQgc3dhcHMuICogbGliYmZkLmg6Ci0JcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4gKiBsaWJjb2ZmLmg6IGxpbnQgKiBsaWJpZWVlLmg6IG1ha2UKLQl3b3JrIG9uIERPUyAqIGxpYm9hc3lzLmg6IG1ha2Ugd29yayBvbiBET1MgKiBtODhrLWJjcy5jOiBOYW1lCi0JY2hhbmdlIGFuZCA2NGJpdCBzdHVmZi4qIG5ld3NvczMuYzogY29tbW9uIGNvZGUgcmVtb3ZlZCwgbmV3IGp1bXAKLQl0YWJsZS4gKiBvYXN5cy5jOiBOYW1lIGNoYW5nZSAqIG9wbmNscy5jOiBQb3J0YWJpbGl0eSBmaXhlcyAqCi0Jc3JlYy5jOiBOYW1lIGNoYW5nZXMgKiBzdW5vcy5jOiBSZW1vdmVkIGNvbW9uIGNvZGUuICogdGFyZ2V0cy5jOgotCUFkZGVkIGRlbW8gKiBhb3V0MzIsIGFvdXQ2NC5jIGluY2x1ZGUgIGFvdXR4LmggKiBib3V0LmM6IHVzZWQgdG8KLQliZSBjYWxsZWQgYi5vdXQuYyAqIGNvZmZjb2RlLmg6IHVzZWQgdG8gYmUgY2FsbGVkIGNvZmYtY29kZS5oLCBub3cKLQk2NGJpdCBpemVkLiAqIGRlbW82NC5jOiA2NCBiaXQgYS5vdXQgYmFjayBlbmQKLQotVGh1IE1heSAxNiAxNjowMjowNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCWZyb20gYm90aG5lcgotIAkqIGxpYmllZWUuaDogTWFrZSBpZWVlX2RhdGEgYW5kIGllZWVfYXJfZGF0YSBtYWNyb3MgdXNhYmxlCi0Jb24gTEhTIG9mIGFzc2lnbm1lbnQsIGV2ZW4gd2hlbiB1c2luZyBvbGQgY29tcGlsZXJzLgotCSogbGlib2FzeXMuaDogRGl0dG8gZm9yIG9hc3lzX2RhdGEgYW5kIG9hc3lzX2FyX2RhdGEuCi0JKiBtNjhrY29mZi5jOiBBZGQgZW51bS10by1pbnQgY2FzdHMgdG8gYWNjb21vZGF0ZSBvbGQgY29tcGlsZXJzLgotCSogbmV3c29zMy5jOiBGaXggZGVmaW5pdGlvbnMgb2YgU0VHTUVOVF9TSVpFIGFuZCBURVhUX1NUQVJUX0FERFIuCi0JKiBvcG5jbHMuYzogRGVmaW5lIFNfSVhVU1IsIFNfSVhHUlAsIFNfSVhPVEggaWYgdW5kZWZpbmVkLgotCSogdGFyZ2V0cy5jOiBBZGQgZGVjbGFyYXRpb24gb2YgbmV3c29zM192ZWMuCi0KLU1vbiBNYXkgMTMgMTA6MDM6MjkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dC5jOiBmaXh4ZWQgc29tZSBvZiB0aGUgcHJvYmxlbXMgd2l0aCBmaWxlcG9zIGNhbGN1bGF0aW9uLgotCShzd2FwX2V4dF9yZWxvYyk6IGZpeGVkIHByb2JsZW0gd2l0aCBjcmVhdGlvbiBvZiByZWxvY3MuCi0JKGFvdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBmaXhlZCBmaWxlcG9zIHByb2JsZW0KLQotCSogY29mZi1jb2RlLmg6IChzd2FwX2ZpbGVoZHJfaW4sIHN3YXBfZmlsZWhkcl9vdXQpIGFkZC4KLQkoc3dhcF9maWxlaGRyKSBkZWxldGUuIENoYW5nZWQgYWxsIHRoZSB1c2FnZSBvZiBiZmRfaF9wdXRfeC4KLQkoc3dhcF9hb3V0aGRyX2luLCBzd2FwX2FvdXRoZHJfb3V0KSBhZGQuIChzd2FwX2FvdXRoZHIpIGRlbGV0ZS4KLQkoY29mZl9yZWFsX29iamVjdF9wKSBjbGVhbmVkIHVwLCBhZGRlZCBNSVBTLiAoY29mZl9vYmplY3RfcCkKLQljbGVhbmVkIHVwLiAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpIGNsZWFuZWQgdXAuCi0KLQkqIGVjb2ZmLmM6IFRvdGFsbHkgZGlmZmVyZW50LiBOb3cgc3VwcG9ydHMgZWNvZmYgZnVsbHkuCi0KLQkqIGljb2ZmLmM6IGZpeGVkIHByb2JsZW1zIGluIHJlbG9jYXRpb24gY2FsbG91dC4KLQotCSogbGliY29mZi5oOiAoc3RydWN0IGljb2ZkYXRhKSByZW1vdmVkIGhkciBzdHJ1Y3R1cmUgZnJvbSB0ZGF0YS4KLQotCSogbTY4a2NvZmYuYzogdXBkYXRlZCB0YXJnZXQgdmVjdG9yLgotCi0JKiBzdW5vcy5jOiAoY2hvb3NlX3JlbG9jX3NpemUpIGFkZGVkOiAoc3Vub3M0X2NhbGxiYWNrKSBjYWxscwotCWNob29zZV9yZWxvY19zaXplLiAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykgbm93IGNhbGxzCi0JY2hvb3NlX3JlbG9jX3NpemUgc28gb3V0cHV0cyByZWxvY3MgY29ycmVjdGx5LCBhbHNvIGNhbGN1bGF0ZXMgdGhlCi0Jc2l6ZSBvZiB0aGUgc2VjdGlvbnMgY29ycmVjdGx5LgotCi0KLQotRnJpIE1heSAxMCAxNjo1ODo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlNZXJnZSBQZXIgQm90aG5lcidzIGNoYW5nZXMgdG8gbW9kdWxhcml6ZSBCRkQgYS5vdXQgYSBiaXQuCi0KLQkqIGxpYmJmZC5oLCBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiAgQWRkLgotCSogaWVlZS5jOiAgQ2FzdCBlbnVtcyB0byBpbnQgYmVmb3JlIGNvbXBhcmluZyB0aGVtLCBmb3IgYnJhaW4tCi0JZGVhZCBjb21waWxlcnMuCi0JKiBjb2ZmLWNvZGUuaDogIFJlbW92ZSBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzLCBhbmQgdXNlIHRoZQotCWdlbmVyaWMgb25lIGluc3RlYWQuCi0KLQkqIGFvdXQuYzogIERlcml2ZSBuZXcgbW9kdWxlIGZyb20gc3Vub3MuYywgY29udGFpbmluZyBnZW5lcmljCi0Jc3VwcG9ydCBjb2RlIGZvciBhbGwga2luZHMgb2YgYS5vdXQgZmlsZXMuCi0KLQkqIHN1bm9zLmM6IFJlbW92ZSBhbGwgY29kZSB0aGF0IGdvZXMgaW4gYW91dC5jLiAgU3BsaXQgb3V0Ci0JbWFjaGluZSBkZXBlbmRlbnQgZm9sbG93dXAgaW4gc3Vub3M0X29iamVjdF9wIGludG8KLQlzdW5vczRfY2FsbGJhY2suICBVc2UgSlVNUF9UQUJMRShhb3V0KSBmb3IgdGhlIHRyYW5zdmVyIHZlY3RvciwKLQlhbmQgcmVkZWZpbmUgb25seSB0aGUgbmFtZXMgd2UgQ0hBTkdFLCBub3QgYWxsIHRoZSBuYW1lcy4gIERyb3AKLQl0aGUgbGl0dGxlLWVuZGlhbiB2ZWN0b3IsIGFuZCByZW5hbWUgdGhlIHZlY3RvciBhcyBzdW5vczQgcmF0aGVyCi0JdGhhbiBnZW5lcmljLgotCi0JKiBiLm91dC5jOiAgVXNlIGFvdXQuYyByb3V0aW5lcyBmb3IgbW9zdCBvZiB0aGUgd29yay4gIFNsaWdodAotCWNoYW5nZXMgZm9yIHRoZSBuZXcgcmVnaW1lLiAgUmVtb3ZlIGNsb3NlX2FuZF9jbGVhbnVwIGFuZAotCWdldF9zZWN0aW9uX2NvbnRlbnRzIGluIGZhdm9yIG9mIGdlbmVyaWNzLiAgTmV3IHRyYW5zZmVyIHZlY3RvcgotCXJlZ2ltZS4KLQotCSogbmV3c29zLmM6ICBOZXcgc3VwcG9ydCBmb3IgU29ueSBORVdTLCBhbm90aGVyIGEub3V0IGZvcm1hdC4KLQotCSogZWNvZmYuYzogIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cC4gIE5ldyB0dmVjIHJlZ2ltZS4KLQkqIGljb2ZmLmMsIG04OGstYmNzLmM6ICBBZGQgd3JpdGVfY29udGVudHMgdG8gdHZlYy4KLQkqIGllZWUuYywgb2FzeXMuYzogIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cCwgYWRkIHdyaXRlX2NvbnRlbnRzCi0JdG8gdHZlYy4KLQkqIG9wbmNscy5jIChiZmRfY2xvc2UpOiAgQ2FsbCBmb3JtYXQtZGVwZW5kZW50IHdyaXRlX2NvbnRlbnRzCi0Jcm91dGluZSwgaWYgd3JpdGluZywgYmVmb3JlIGNhbGxpbmcgdGFyZ2V0LWRlcGVuZGVudAotCWNsb3NlX2FuZF9jbGVhbnVwIHJvdXRpbmUgKHdoaWNoIGlzIG5vdyBhbHdheXMgZ2VuZXJpYywgSSB0aGluaykuCi0JKiBzcmVjLmM6ICBVc2UgYmZkX2FsbG9jIGluc3RlYWQgb2YgbWFsbG9jLiAgUmVtb3ZlCi0JY2xvc2VfYW5kX2NsZWFudXAgYW5kIG1vdmUgY29kZSBmcm9tIGl0IHRvCi0Jc3JlY193cml0ZV9vYmplY3RfY29udGVudHMuICBBZGQgd3JpdGVfY29udGVudHMgdG8gdHZlYy4KLQkqIHRhcmdldHMuYzogIFJlbW92ZSBhLm91dCBsaXR0bGUgdmVjdG9yLCByZXBsYWNlIGEub3V0IGJpZwotCXZlY3RvciB3aXRoIFN1bk9TIHZlY3Rvci4gIEZJWE1FOiAgTmVlZCBWYXggc3VwcG9ydCBhZ2FpbiBub3cuCi0KLQkqIGxpYmJmZC5oOiAgQWRkIHdyaXRlX2NvbnRlbnRzIGZvcm1hdC1kZXBlbmRlbnQtdmVjdG9yIHRvIHRoZQotCWJmZF90YXJnZXQgdmVjdG9yLiAgU3VwcGx5IGEgZ2VuZXJpYyBjbG9zZV9hbmRfY2xlYW51cCByb3V0aW5lLgotCSogbGliYS5vdXQuaDogIEhhbmRsZSB0aGUgbmV3IGFvdXQuYyBzcGxpdC4gIEFkZCBwcm90b3R5cGVzIGZvcgotCWFsbCByb3V0aW5lcyBkZWZpbmVkIGluIGFvdXQuYy4gIFJlbmFtZSAic3Vub3MiIHRoaW5ncyB0byAiYW91dCIKLQl0aGluZ3MuICBBZGQgYSBmZXcgZmllbGRzIHdoZXJlIG5lZWRlZCBmb3IgdmFyaW91cyBmb3JtYXRzLgotCSogTWFrZWZpbGUuaW46ICBBZGQgYW91dC5jIGFuZCBuZXdzb3MuYy4KLQotCSogYXJjaGl2ZS5jLCBpZWVlLmMsIG9hc3lzLmM6ICBMaW50LgotCi1GcmkgTWF5IDEwIDEyOjM0OjQ4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvYmZkLmgKLQljaGFuZ2VkIGZvcndhcmQgZGVjbGFyYXRpb24gc3RydWN0IHN0YXQ7IHRvIHJlZHVjZSB3YXJuaW5ncy4gQ2hhbmdlZAotCWNvbW1lbnQgb24gYmZkX2hfPHg+X3guCi0KLQkqIC4uL2luY2x1ZGUvbTY4a2NvZmYuaCwgLi4vaW5jbHVkZS9pbnRlbC1jb2ZmLmgsCi0JLi4vaW5jbHVkZS9tODhrLWJjcy5oCi0JTm93IHRoZXJlIGFyZSB0d28gaW5jYXJuYXRpb25zIG9mIHJlbG9jcywgbGluZW5vcyBhbmQgc3ltZW50cy4gT25lIGZvcgotCWludGVybmFsIGRpZ2VzdGlvbiwgYW5kIG9uZSBmdWxsIG9mIGNoYXIgYXJyYXlzIGZvciBJL08uIFRoZSBvcmlnaW5hbAotCW5hbWVzIGhhdmUgZ29uZSB0byBkZXRlY3QgZXJyb3JzLgotCi0JKiBNYWtlZmlsZS5pbiwgbTY4a2NvZmYuYywgdGFyZ2V0cy5jCi0JVGVzdCBuZXcgc3RydWN0dXJlIGNvZGUgd2l0aCBhIDY4ayBjb2ZmIGltcGxlbWVudGFpb24KLQotCSogY29mZi1jb2RlLmgsIGljb2ZmLmMsIGNvZmZzd2FwLmMsIGxpYmNvZmYuaAotCUZpeGVkIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCB0aGUgc2l6ZSBhbmQKLQlhbGlnbm1lbnRzIG9mIHN0cnVjdHVyZXMgb24gZGlzayBhbmQgc3RydWN0dXJlcyBpbiBtZW1vcnkuICNpZmVkIG91dAotCWFsbCB0aGUgY29kZSBpbiBjb2Zmc3dhcC5jLCBzaW5jZSBpdCBzaG91bGQgYmUgZG9uZSB1c2luZyB0aGUgdGFyZ2V0Ci0Jc3dhcCByb3V0aW5lcyBub3cuCi0KLVRodSBNYXkgIDkgMTE6MDA6NDUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChkb19vbmUsIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogbm93IHN1cHBvcnRzIHRoZSBsb2FkCi0JbXVsdGlwbGUgcmVsb2MgY29tbWFuZC4KLQotCSogc3Vub3MuYyAoc3Vub3M0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTWFkZSBpdCBzbyB0aGF0IHNlY3Rpb25zCi0JYXJlIGFsd2F5cyBwYWRkZWQgdG8gdGhlaXIgYWxpZ25tZW50IHNpemUuCi0KLVNhdCBNYXkgIDQgMTU6NDk6NDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMsIGJmZC5jLCBjb2ZmLWNvZGUuaCwgb3BuY2xzLmMsIHN1bm9zLmMsIHRyYWQtY29yZS5jOgotCUNsZWFuIHVwIHR5cGVzIGFuZCBzdWNoIChzYWJlciBDIHByb2JsZW1zKS4KLQkqIGVjb2ZmLmM6ICBDbGVhbiB1cCB0eXBlcyBhbmQgc3VjaC4gIFJlbW92ZSByb3V0aW5lcyB0aGF0IGFyZQotCW5vdCB1c2VkLiAgRml4IHVwIHJlYWRpbmcgYW5kIHN3YXBwaW5nIG9mIHNob3J0cyBmcm9tIGZpbGVzLgotCi0gICBOb3RlcyBvbiBiZmQtMC41LjItcGF0Y2gxYSwgZnJvbSBQZXIgQm90aG5lcjoKLQotCSogYS5vdXQudmF4LmM6IFJlbW92ZSB0d28gYm9ndXMgInN0YXRpYyIgZnJvbSBwcm90b3R5cGVzLgotCi0JKiBlY29mZi5jOiBHb3QgcmlkIG9mIGxvdHMgb2Ygbm9uLXdvcmtpbmcganVuayAodGhhdCBoYWQKLQliZWVuIGNvcGllZCBkaXJlY3RseSBmcm9tIGNvZmYtY29kZS5oKS4KLQlVcGRhdGVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB1cGRhdGVzIHRvIGljb2ZmLmMgYW5kIGNvZmYtY29kZS5oLgotCi0JKiBsaWJiZmQuaDogQWRkZWQgZGVmaW5pdGlvbnMgZm9yIFNfSVhVU1IsIFNfSVhHUlAsIGFuZCBTX0lYT1RICi0JaWYgdGhleSdyZSBtaXNzaW5nIChhcyB0aGV5IGFyZSBpbiAoQkRTLTQuMy1iYXNlZCkgTmV3c09TLTMpLgotCi0JKiBzdW5vcy5jIChuX3R4dG9mZik6IChSZS0pQWRkIHN1cHBvcnQgZm9yIHNvbnkuIFRoaXMgaXMgYSBrbHVkZ2UsCi0JYnV0IHVudGlsIHRoZSB0YXJnZXRfdmVjdG9yIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLAotCWl0J3MgYXMgZ29vZCBhcyBhbnkuIE5vdGUgdGhhdCB0aGUgdGV4dCBvZmZzZXQgaXMgdGhlIG9ubHkKLQlkaWZmZXJlbmNlIGJldHdlZW4gTmV3c09TIGFuZCBTdW5PcyAoaW5jbHVkaW5nIG1hZ2ljIG51bWJlcnMpLgotCShNb3N0IG9mIHRoZSBzdW5vc18qIHJvdXRpbmVzIHNob3VsZCB0byByZW5hbWVkIGJzZF8qCi0JYW5kIG1vdmUgdG8gYSBic2QuYyBmaWxlLiBUaGVuIChhbmQgd2hlbiB0aGUgdGFyZ2V0X3ZlY3RvcgotCWlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkKSBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGNyZWF0ZQotCWEgc2VwYXJhdGUgU29ueSB0YXJnZXQuKQotCi0JKiBzeXNkZXAuaDogRG9uJ3QgZGVjbGFyZSBmcmVhZCBhbmQgZndyaXRlLiBDYXVzZXMgdHJvdWJsZQotCW9uIHNvbWUgc3lzdGVtcywgYW5kIGRvZXNuJ3QgaGVscCBvbiBvdGhlcnMuCi0JU2ltaWxhcmx5LCBvbmx5IGRlZmluZSBYX09LIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIHN5cy9zdGF0LmggLSBhdCBsZWFzdAotCW9uIE5ld3NPUyAzLCBpdCBoYXMgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLgotCi1UdWUgTWFyICA1IDAxOjQ3OjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29mZi1jb2RlLmggKGJmZF9jb2ZmX3N3YXBfc3ltLCBiZmRfY29mZl9zd2FwX2F1eCwKLQliZmRfY29mZl9zd2FwX2xpbmVubyk6ICBFeHBvcnQgdGhlIHJvdXRpbmVzIHRoYXQgYnl0ZS1zd2FwIENPRkYKLQlzeW1ib2wgdGFibGVzIGlmIG5lY2Vzc2FyeSB3aGVuIHJlYWRpbmcgdGhlbSBpbiwgc28gZ2RiIGNhbiB1c2UKLQl0aGVtLiAgQWRkICJiZmRfY29mZl8iIHRvIHRoZSBuYW1lcyBzbyB0aGV5IHdvbid0IGNvbmZsaWN0IHdpdGgKLQluYW1lcyBpbiBjYWxsaW5nIHByb2dyYW1zLiAgRklYTUUtc29vbjogIGlmIGNvZmYtY29kZS5oIGlzCi0JaW5jbHVkZWQgaW4gdHdvIEJGRCBtb2R1bGVzLCB0aGlzIHdpbGwgY2F1c2UgZHVwbGljYXRlCi0JZGVmaW5pdGlvbnM7IHRoZSByb3V0aW5lcyBzaG91bGQgYmUgZXhwb3J0ZWQgdG8gYSBzZXBhcmF0ZSwKLQljb21tb24sIG1vZHVsZSAocHJvYmFibHkgYWxvbmcgd2l0aCBhIG1lc3Mgb2Ygb3RoZXIgb25lcykuCi0KLVNhdCBNYXIgIDIgMTI6MTE6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JSW1wcm92ZSBtb2R0aW1lIHN1cHBvcnQuCi0KLQkqIGJmZC5oOiAgQWRkIGJvb2xlYW4gbXRpbWVfc2V0LCBhbmQgZGVjbGFyZSBiZmRfZ2V0X210aW1lLgotCVJlbW92ZSAjZGVmaW5lIGZvciBiZmRfZ2V0X210aW1lLiAgUmVtb3ZlIGdyYXR1aXRvdXMgY29tbWVudC4KLQkqIGJmZC5jIChiZmRfZ2V0X210aW1lKTogIE5ldyBmbiwgY2FjaGVzIG10aW1lLCBnZXRzIGlmIG5vdCBjYWNoZWQuCi0JQlVHOiAgYXJjaGl2ZSBtZW1iZXJzIHN0aWxsIGRvIG5vdCBnZXQgY29ycmVjdCBtb2QgdGltZXMuCi0KLQlJbXByb3ZlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgZm9yIGNvcmUgZmlsZXMuCi0KLQkqIHN1bm9zLmMgKHN0cnVjdCBjb3JlKTogIENoYW5nZSB2b2lkICpmcGFfZHVtbXkgdG8gZG91YmxlIGZwX3N0dWZmLgotCShzdW5vczRfY29yZV9maWxlX3ApOiAgQ3JlYXRlIGEgc2Vjb25kIHJlZ2lzdGVycyBzZWN0aW9uIGluIHRoZQotCWNvcmUgZmlsZSwgY2FsbGVkICIucmVnMiIsIGZvciB0aGUgZmxvYXQgcmVnaXN0ZXJzLgotCi1UaHUgRmViIDE0IDE1OjQ5OjA2IDE5OTEgIEd1bWJ5IFZpbmF5YWsgV2FsbGFjZSAgKGd1bWJ5IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBtYW55IGNoYW5nZXMgdG8gaW1wcm92ZSBhcmNoaXZlIGhhbmRsaW5nOyBmb3VuZCBhIGxvZ2ljIGZsYXcgaW4KLQkgIGJmZF9jaGVja19mb3JtYXQgd2hpY2ggb25seSBqdXN0IGhhcHBlbmVkIHRvIHdvcmsgYnkgY29vbmNpZGVuY2UuCi0KLVRodSBGZWIgMTQgMDc6NTM6MTYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBmaXhlZCB0byB1c2Ugb3V0cHV0X29mZnNldHMKLQljb3JyZWN0bHkuCi0KLQkqIGJmZC5oOiBjaGFuZ2VkIHR5cGUgb2YgdWRhdGEgaW4gYXN5bWJvbCB0byB2b2lkICosIGxpa2UgaXQKLQlzaG91bGQgYmUuIEFkZGVkIGJmZF9yZWxvY19kYW5nZXJvdXMgZW51bSBtZW1iZXIuCi0KLQkqIGNvZmYtY29kZS5oOiBGaXhlZCBpdCBzbyB0aGF0IGludGVybmFsbHkgZ2VuZXJhdGVkIHN5bWJvbHMgZ2V0Ci0JdGhlaXIgdmFsdWVzIHJlbG9jYXRlZCBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLiBSZW1vdmVkIGNhbGxzIHRvCi0JeG1hbGxvYy4KLQotCSogaWNvZmYuYzogTm90IHVuZGVyc3RhbmRpbmcgdGhlIGRlc3RpbmF0aW9uIHN5bWJvbCBvZiBhIHJlbG9jIGlzCi0Jbm90IGEgZmFpbHVyZSBhbnkgbW9yZSwganVzdCAnZGFuZ2Vyb3VzJy4gVGhpcyBhbGxvd3MgbGlua2luZyBvZgotCWIub3V0IGFuZCBjb2ZmIGltYWdlcy4KLQotCSogc3Vub3MuYzogQ2xlYW5lZCB1cCB0aGUgd2F5IHRoYXQgWk1BR0lDIHNlY3Rpb24gc2l6ZXMgYXJlCi0JY2FsY3VsYXRlZC4KLQotCi1UdWUgRmViIDEyIDEzOjI1OjQ2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHN1bm9zLmMgKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogZml4ZWQKLQlzeW1fcG9pbnRlci0+bl92YWx1ZSBzbyB0aGF0IHN5bWJvbHMgb24gdGhlIHdheSBvdXQgZ2V0IHRoZWlyCi0Jc2VjdGlvbiByZWxhdGl2ZSB2YWx1ZXMgY2FsY3VsYXRlZCBjb3JyZWN0bHkuCi0KLQkqIGNvZmYtY29kZS5oIChtYW5nbGVfc3ltYm9scyk6IGZpeGVkIHByb2JsZW0gd2hlcmUgdGFncyB3ZXJlIG5vdAotCWJlaW5nIHJlbG9jYXRlZCBmb3Igc3RydWN0cywgZW51bXMsIHVuaW9ucy4gQWxzbyB2YXJpb3VzIGxpbnRzLgotCi1Nb24gRmViIDExIDE5OjUyOjI2IDE5OTEgIEd1bWJ5IFZpbmF5YWsgV2FsbGFjZSAgKGd1bWJ5IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGdldF9lbHRfYXRfZmlsZXBvcyk6IHN5c3RlbV9jYWxsX2Vycm9yIHJldHVybmVkCi0JICBpbmNvcnJlY3RseS4KLQotU3VuIEZlYiAxMCAyMzoxODo0MCAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogUmVzb2x2ZSB0aGUgdXNlIG9mIG5vX2Vycm9yIGFuZCBzeXN0ZW1fY2FsbF9lcnJvci4KLQkgIFRoZSBiZmQgbGlicmFyeSBpdHNlbGYgbm93IHdpbGwgbmV2ZXIgc2V0IGJmZF9lcnJvciB0bwotCSAgbm9fZXJyb3IuCi0KLQkgIFRoZSBjb2RlIHN0aWxsIG5lZWRzIHRvIGJlIGNvbWJlZCB0byBtYWtlIHN1cmUgYWxsIHRoZSBlcnJvcgotCSAgY29kZXMgYXJlIGNvcnJlY3QuICBJIHN1c3BlY3QgdGhleSBhcmUgbm90IGFsd2F5cyBzZXQgY29ycmVjdGx5LgotCi0JKiBUaGUgbmFtZXMgb2YgYWxsIHRoZSBtZXNzYWdlcyBoYXZlIF8gcHJlcGVuZGVkIGJlY2F1c2UgdGhlIHN1bgotCSAgYnVuZGxlZCBjb21waWxlciBjYW4ndCBkaXN0aW5ndWlzaCBmcm9tIGEgbWFjcm8gd2hpY2ggdGFrZXMgYW4KLQkgIGFyZ3VtZW50IGFuZCB0aGUgc2FtZSBpZGVudGlmaWVyIGluIGEgbm9uLW1hY3JvIGNvbnRleHQuCi0KLQkqIFRoZSByZWFzb24gZm9yIHRoZSBhYm92ZSBiZWluZyB0aGF0IGVudHJ5IHBvaW50cyB3aGljaCB1c2VkIHRvCi0JICBiZSB0cmFtcG9saW5lIGZ1bmN0aW9ucyBhcmUgbm93IGp1c3QgbWFjcm9zIHdoaWNoIGV4cGFuZCB0byBhCi0JICBkaXJlY3QgY2FsbCB0aHJvdWdoIHRoZSBiZmQncyB4ZmVyIHZlY3Rvci4KLQotCSogKC4uL2luY2x1ZGUvaW50ZWwtY29mZi5oKSBGX0FSMzJXUjogZml4IHRoaXMgY29uc3RhbnQuICBXaHkKLQkgIG11c3QgZ2FzIGhhdmUgaXRzIG93biB2ZXJzaW9uIG9mIGV2ZXJ5dGhpbmcgKHRoZSBnYXMgdmVyc2lvbgotCSAgaGFkIHRoZSBjb3JyZWN0IHZhbHVlKQotCi1UdWUgRmViICA1IDExOjQ2OjUzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGIub3V0LmM6IEFkZGVkIHBhdGNoZXMgc3VwcGxpZWQgYnkgY2hyaXNiQG1pcG9uMi5pbnRlbC5jb20gdG8KLQlwcm9wZXJseSBzdXBwb3J0IGk5NjAgYXJjaGl0ZWN0dXJlIGFuZCBvdXRwdXQgY29ycmVjdCByZWxvYyBzdHVmZi4KLQotCSogYmZkLmg6IGFkZGVkIHByb3RvdHlwZSBmb3IgYmZkX3ByaW50YWJsZV9hcmNoX21hY2gsIGFkZGVkCi0JQkZEX0ZBSUwKLQotCSogY29mZi1jb2RlLmg6IEFwcGxpZWQgcGF0Y2hlcyBmcm9tIGNocmlzYiB0byBzdXBwb3J0IGk5NjAKLQlhcmNoaXRlY3R1cmUsIHplcm8gcmVsb2NzIGFuZCBzd2FwIHRoZW0gY29ycmVjbHkgYW5kIGNvbmRpdGlvbmFsbHkKLQljb21waWxlZCB0aGUgdGltZXN0YW1wLgotCi0JKiBzdW5vcy5jOiBNYWRlIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IDJeMyBzbyB0aGF0IGRvdWJsZXMKLQlhcmUgZG9uZSBwcm9wZXJseS4gRml4ZWQgdGhlIHNhbWUgcmVsb2MgYnVnIHRoYXQgd2FzIGluIGIub3V0LmMKLQotCSogc3lzZGVwLmg6IE5vdyBjb21waWxlcyBvbiBhIFBvc2l4IGJveAotCi1XZWQgSmFuIDMwIDIxOjM2OjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaWNvZmYuYzogIEZpeCBjb21tZW50IG9uIGJpZy1lbmRpYW4gdmVyc2lvbi4KLQkqIGNvZmYtY29kZS5oOiAgTWFrZSBIQVNfUkVMT0MgcmVhbGx5IHdvcmsgKGl0J3MgYmFja3dhcmRzIGZyb20KLQlGX1JFTEZMRykuICBTZXQgRl9BUjMyV1IgaW4gb3V0cHV0IGZpbGVzIGlmIGxpdHRsZSBlbmRpYW4KLQlhcmNoaXRlY3R1cmUuCi0KLVR1ZSBKYW4gMjkgMjA6NTY6MTAgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBhcmNodXJlcy5jIGZpeGVkID0vPT0gdHlwbwotCi0JKiBzdW5vcy5jIGFkZGVkIGFyY2hpdGVjdHVyZSBzdHVmZiBmb3Igb3V0cHV0LiBGaXhlZAotCWJ1ZyB3aGVyZSBmaWxlcyB3aGVyZSB2bWEoZGF0YSkgIT0gc2l6ZSh0ZXh0KQotCXdlcmUgcHJvY2Vzc2VkIHdyb25nLgotCi0JKiBjb2ZmLWNvZGUuaCBhZGRlZCBhIGxpbnQgY2FzdAotCi0JKiAoLi4vaW5jbHVkZS9hLm91dC5zdW40LmgpIGZpeGVkIGl0IHNvIHptYWdpYwotCXdvcmtlZAotCi1Nb24gSmFuIDI4IDE5OjE1OjI5IFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYXJjaGl2ZS5jIHJlbW92ZWQgbG9hZHMgb2YgaW5jbHVkZXMsIGFuZCBmaXhlZCBidWcgd2hlcmUgc3RyaW5nCi0JdGFibGUgZGlkbid0IGhhdmUgYSBudWxsIGF0IHRoZSBlbmQuCi0KLQkqIGJmZC5jIGZpeGVkIGluY2x1ZGVzLCBhZGRlZCBzeW1ib2xzIGFyZ3VtZW50IHRvCi0JY2Fub25pY2FsaXplX3JlbG9jIGVudHJ5IHBvaW50LgotCi0JKiBsaWJiZmQuYyBmaXhlZCBpbmNsdWRlcyBhbmQgYWRkZWQgc29tZSBsaW50IHBhdGNoZXMuCi0KLQkqIHRhcmdldHMuYyBhZGRlZCBib3RoIHNvcnRzIG9mIGludGVsIGNvZmYuCi0KLQkqIGIub3V0LmMgZml4ZWQgaW5jbHVkZWQsIGNoYW5nZWQgd2FzIHRoZSBjYW5vbmljYWwKLQlyZWxvY3Mgd2VyZSBkb25lLgotCi0JKiBpY29mZi5jIGFkZGVkIHN1cHBvcnQgZm9yIGNhbGxqIGFuZCBiaWcgYW5kIGxpdHRsZQotCWVuaWRpYW4gdGFibGVzLgotCi0JKiBvcG5jbHMuYyBhZGRlZCBjaG1vZCt4aW5nIGZvciBmaWxlcyB3aXRoIEVYRUNfUCBzZXQuCi0KLQkqIHN1bm9zLmMgZml4ZWQgaW5jbHVkZXMuIENoYW5nZWQgZGVmYXVsdCBzZWN0aW9uCi0JYWxpZ25lbWVudCB0byB3b3Jkcy4gRml4ZWQgcmVsb2NhdGlvbiBzdHVmZiB0byB3b3JrIHdpdGgKLQluZXcgc2NoZW1lCi0KLQkqIGJmZC5oIHZhcmlvdXMgbmV3IHR5cGVzIGFkZGVkLCBwcm90b3R5cGUgZm9yIG5ldwotCXJlbG9jIGNhbGxzLCBjaGFuZ2VkIGJmZC0+aW9zdHJlYW0gdG8gYSB2b2lkICoKLQl0byBpbmNsdWRpbmcgZmlsZXMgZG9uJ3QgbmVlZCBzdGRpby5oLgotCi0JKiBsaWJjb2ZmLmggYWRkZWQgY29udmVyc2lvbiB0YWJsZSB0byB0aWUgcmVsb2NzIHRvCi0JY2Fub25pY2FsIHN5bWJvbHMKLQotCSogc3lzZGVwLmggY3JlYXRlZAotCi0JKiBjb2ZmLWNvZGUuaCBmaXhlZCBpbmNsdWRlcy4gQWRkZWQgY29kZSB0byBzdXBwb3J0Ci0JYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGZvcm1hdHMuIFZhcmlvdXMgbGludHMuIEJldHRlcgotCXByb2Nlc3Npbmcgb2Ygc3ltYm9scy4gQ2hhbmdlZCByZWxvYyBzdHVmZiB0byBuZXcKLQlvcmRlcgotCi0JKiBsaWJiZmQuaCBmaXhlZCBpbmNsdWRlcwotCi0KLU1vbiBKYW4gMjEgMTE6NTM6NTEgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBiZmQuaAljaGFuZ2VkIG5hbWUgb2YgYWxpZ25tZW50IGVudHJ5IGluIHNlY19zdHJ1Y3QgdG8KLQlhbGlnbm1lbnRfcG93ZXIsIGJlY2F1c2Ugb2YgY29uZmxpY3RpbmcgdXNlcyB3aXRoaW4gYmZkLgotCU5vdyBpdCBzaG91bGQgYmUgb2J2aW91cyB0aGF0IGl0J3MgYSAyKipuIGFsaWdubWVudAotCXNwZWNpZmllci4gUmVtb3ZlZCBzdGFydF9wYWQsIGVuZF9hbGlnbm1lbnQsIGJsb2NrLCBtaW5zaXplLAotCW91dHB1dF9maWxlX2FsaWdubWVudCwgc3Vic2VjdGlvbl9hbGlnbm1lbnQgYW5kIG9yaWdpbmFsX3ZtYSBmaWVsZHMuCi0JQWRkZWQgYWxpZ25fcG93ZXIoKSBtYWNyby4gRml4ZWQgYmZkX3NlY3Rpb25fYWxpZ25tZW50Ci0JYWNlc3NvciBtYWNyb3MuIEFkZGVkIGJmZF9zeW1ib2xfc2FtZV90YXJnZXQgbWFjcm8uCi0KLQkqIGIub3V0LmMgKGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cykgZml4ZWQgdG8gdXNlCi0JbmV3IGFsaWdubWVudCBtZW1iZXIuIEZpeGVkIChjYWxsal9jYWxsYmFjaykgdG8gdXNlIHNlY3Rpb24KLQlyZWxhdGl2ZSBzeW1ib2xzIHByb3Blcmx5LgotCi0JKiBzdW5vcy5jIChzdW5vczRfb2JqZWN0X3ApIGZpeGVkIHRvIHVzZSBuZXcgYWxpZ25tZW50X3Bvd2VyLgotCUZpeGVkICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKSB0byBjb3JyZWN0bHkgbWFrZQotCXN5bWJvbHMgc2VjdGlvbiByZWxhdGl2ZS4KLQotCSogYmZkLmMgKGJmZF9lcnJtc2cpIGZpeGVkIHZhcmlvdXMgZW51bSBjYXN0IHByb2JsZW1zLgotCShiZmRfbWFrZV9zZWN0aW9uKSB0b29rIG91dCBpbml0aWFsaXphdGlvbiBvZiBvYnNvbGV0ZSBtZW1iZXJzLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKSBhZGRlZAotCi0JKiBvcG5jbHMuYyAoYmZkX2NyZWF0ZSkgY3JlYXRlZC4KLQotCSogY29mZi1jb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vaykgdG9vayBhd2F5IHJlZnMKLQl0byBvYnNvbGV0ZSBtZW1iZXJzLiAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKSBhZGRlZAotCWNvbnZlcnNpb24gYmV0d2VlbiBhbGlnbm1lbnQgdHlwZXMuIChjb2ZmX3N5bWJvbF9mcm9tKQotCWFkZGVkLiAoY29mZl9jb3VudF9saW5lbnVtYmVycykgb25seSBjb3VudHMgbGluZW51bWJlcnMKLQlpZiBzeW1ib2wgaXMgb2YgY29mZi10eXBlLiAoY29mZl9tYW5nbGVfc3ltYm9scykgb25seQotCWhlYXZpbHkgbWFuZ2xlcyBzeW1ib2xzIGlmIHN5bWJvbCBpcyBjb2ZmLXR5cGUuCi0JKGNvZmZfd3JpdGVfc3ltYm9scykgdmFyaW91cyBsaW50cy4gKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCXZhcmlvdXMgbGludHMgYW5kIG1vZGlmaWNhdGlvbiBmb3IgYWxpZ25tZW50IGNvbnZlcnNpb24uCi0JKGNvZmZfc2x1cnBfcmVsb2NzKSBmaXhlZCBmb3IgdXNlIHdpdGggbmV3IGFzZWN0aW9uIHNoYXBlLgotCi1TYXQgSmFuIDE5IDE2OjEwOjQyIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYXJjaGl2ZS5jIGxvdHMgb2YgbGludAotCi0JKiBiLm91dC5jIGFkZGVkIGNhbGxqIHJlbG9jYXRpb24gc3VwcG9ydCwgdXBncmF0ZWQgcmVsb2MgaG93dG8uCi0JRml4ZWQgc28gdGhhdCBhc3ltYm9sIGFuZCByZWxvYyByZWNvcmRzIGFyZSBvdXRwdXQKLQljb3JyZWN0bHkuCi0KLQkqIGJmZC5jIGxvdHMgb2YgbGludCwgc3VwcG9ydCBmb3IgbmV3IGJmZCBlbnRyeSBwb2ludAotCWJmZF9wcmludF9zeW1ib2wuCi0KLQkqIGJmZC5oIGNoYW5nZWQgZGVmaW5pdGlvbiBvZiBhc3ltYm9sIHRvIGNvbnRhaW4gcG9pbnRlciB0bwotCW93bmluZyBiZmQsIHJlbW92ZWQgdGFyZ2V0IGRlcGVuZGVuY2llcy4KLQotCSogY2FjaGUuYyB0b29rIG91dCBwcmludCBzdGF0ZW1lbnRzLCBwdXQgaW4gQkZEX0FTU0VSVCBjYWxscy4KLQotCSogY29mZi1jb2RlLmggdmFyaW91cyBsaW50cywgY29ycmVjdGVkIGxpbmVudW1iZXIgb3V0cHV0Ci0JZnVuY3Rpb25hbGl0eS4gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IHN0eWxlIGFzeW1ib2xzIGFuZAotCWJmZF9wcmludF9zeW1ib2wuIEZpeGVkIHNvIHRoYXQgYXN5bWJvbCBhbmQKLQlyZWxvYyByZWNvcmRzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4gQWRkZWQgdGltZXN0YW1wLgotCi0JKiBpY29mZi5jIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBob3d0byBzaGFwZS4KLQotCSogbGliYS5vdXQuaCBBZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZQotCi0JKiBsaWJiZmQuYyB2YXJpb3VzIGxpbnRzCi0KLQkqIGxpYmJmZC5oIHZhcmlvdXMgbGludHMKLQotCSogbGliY29mZi5oIGFkZGVkIHN1cHBvcnQgZm9yIG5ldyBhc3ltYm9sIHNoYXBlLgotCi0JKiBzdW5vcy5jICB2YXJpb3VzIGxpbnRzLiBBZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZQotCWFuZCBiZmRfcHJpbnRfc3ltYm9sLgotCi1XZWQgSmFuIDE2IDIxOjM4OjA5IFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYi5vdXQuYyByZW1vdmVkIHByb3RvdHlwZSBvZiBzdW5vczRfZW5uYXRpdmF0ZV9zeW10YWIsIGxvdHMgb2YKLQlwb2ludGVyIGxpbnQuIEFkZGVkIHN1cHBvcnQgZm9yIGNhbGxqIHJlbG9jYXRpb24uIEZpeGVkIGJ1ZyB3aGVyZQotCXRoZSBsYXN0IDMyIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24gd2VyZSBvdmVyd3JpdHRlbiBieSBkYXRhLiBGaXhlZCBidWcKLQl3aGVyZSBhcmNoaXZlcyBvZiBiLm91dCBkaWRuJ3Qgd29yayBkdWUgYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLQlyZXR1cm5pbmcgZmFsc2UuCi0KLQkqIHN1bm9zLmMgYWRkZWQgc3VwcG9ydCBmb3Igbl9vdGhlciBmaWVsZC4gQnJhY2VkIHRoZSBob3d0byB0YWJsZSBzbwotCXRoYXQgaXQgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgYW55IGxlbmd0aGluZyBvZiB0aGUgaG93dG8gc3RydWN0IHR5cGVkZWYuCi0JVmFyaW91cyBsaW50cwotCi0JKiBiZmQuaCBhZGRlZCBzdXBwb3J0IGZvciBuX290aGVyIGZpZWxkLCBhZGRlZCBzcGVjaWFsX2Z1bmN0aW9uCi0JcmVsb2MgdHlwZSwgbW9kaWZpZWQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBwcm90b3R5cGUuIEFkZGVkIGJmZF9oX2dldF94Ci0JbWFjcm9zLgotCi0JKiBiZmQuYyB1cGdyYWRlZCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCB2YXJpb3VzIGxpbnRzLgotCi1XZWQgSmFuIDE2IDAxOjU1OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBydGwpCi0KLQkqIENoYW5nZUxvZzogIFN0YXJ0ZWQgQ2hhbmdlTG9nIGZvciBCRkQuCi0JKiBUb0RvOiAgQ3JlYXRlIGZpbGUgZm9yIHN1Z2dlc3Rpb25zLgotCi0JKiBNYWtlZmlsZTogIFN1cHBvcnQgZWFzeSBsb2FkaW5nIGludG8gU2FiZXIgQy4KLQlBZGQgZGVwZW5kZW5jaWVzIGZvciBpY29mZi5vIGFuZCBiY3M4OGtjb2ZmLm8uCi0JUmVuYW1lIGNvZmYuYyB0byBjb2ZmLWNvZGUuaC4gIENoYW5nZSBjYWxsZXJzLgotCi0JKiBiZmQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6ICBBbGxvdyB0aGUgY2hlY2tfZm9ybWF0IHJvdXRpbmVzCi0JdG8gcmV0dXJuIHRoZSBkZXNpcmVkIHRhcmdldCB2ZWN0b3IsIHJhdGhlciB0aGFuIGp1c3QgYSBCb29sZWFuLgotCWJmZC5oIChiZmRfY2hlY2tfZm9ybWF0KTogIENoYW5nZSBmdW5jdGlvbiBwb2ludGVyIHJldHVybiB0eXBlLgotCWFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogIGNoYW5nZSBjYWxsZWUuCi0JYi5vdXQuYyAoYl9vdXRfbGl0dGxlX29iamVjdF9wLCBiX291dF9iaWdfb2JqZWN0X3AsCi0JYl9vdXRfcmVhbF9vYmplY3RfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCWxpYmJmZC5jIChfYmZkX2R1bW15X3RhcmdldCk6ICBEdW1teSByb3V0aW5lIHJlcGxhY2luZyBiZmRfZmFsc2UKLQlpbiBjaGVja19mb3JtYXQgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IG5lZWQgYSBmaWxsZXIuCi0JbGliYmZkLmggKGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXQpOiAgRml4IGRlY2xzLgotCWJjczg4a2NvZmYuYzogIGNoYW5nZSBjYWxsZWUuCi0JY29mZi1jb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCwgY29mZl9iaWdfb2JqZWN0X3ApOiAgY2hhbmdlIGNhbGxlZS4KLQlpY29mZi5jOiAgY2hhbmdlIGNhbGxlZS4KLQlzdW5vcy5jIChzdW5vczRfb2JqZWN0X3AsIHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCi0JKiBsaWJiZmQuYyAoemFsbG9jKTogIEl0IHNob3VsZCBhY3R1YWxseSB6ZXJvIHRoZSBzdG9yYWdlIQotCVRoaXMgd2FzIGNvbW1lbnRlZCBvdXQgZm9yIHNvbWUgcmVhc29uLgotCi0JKiBsaWJiZmQuaDogIEFkZCBtYWxsb2MsIHhtYWxsb2MsIG1lbWNweSwgYW5kIGZhdGFsIGRlY2xzLgotCVRoaXMgaXMgc28gY2FsbGVycyBjYW4gYXZvaWQgPHN0ZGxpYi5oPiB3aGljaCBkb2Vzbid0IGV4aXN0Ci0Jb24gb2xkZXIgc3lzdGVtcy4KLQotCSogYmZkLmMgKG1hcF9vdmVyX3NlY3Rpb25zKTogIEFkZCBkZWJ1Z2dpbmcgY29kZSwgc2luY2UgSQotCW5vdGljZWQgdGhlIHNlY3Rpb24gY291bnQgZm9yIHN1bm9zIGNvcmUgZmlsZXMgd2FzIGJhZCwgYnV0IG9ubHkKLQlHREIgaGFkIGRldGVjdGVkIHRoZSBwcm9ibGVtLgotCShiZmRfc2V0X3NlY3Rpb25fbGluZW5vX3NpemUsIGJmZF9zZXRfc2VjdGlvbl9saW5lbm9zLAotCWJmZF9nZXRfc2VjdGlvbl9saW5lbm9zKTogIFJlbW92ZSBvYnNvbGV0ZSBmdW5jdGlvbnMuCi0JKGJmZF9hcHBseV9yZWxvY2F0aW9ucyk6ICBVc2UgbG9uZ3MsIG5vdCBpbnRzLCBmb3IgdGhlIG1hdGguCi0KLQkqIGJmZC5oOiAgRGVjbGFyZSBlbnVtIGJvb2xlYW4gYW5kIHN0cnVjdCBiZmRfdGFyZ2V0IGFzIHdlbGwKLQlhcyB0eXBlZGVmcyBmb3IgdGhlbS4gIFJlbW92ZSBvYnNvbGV0ZQotCWJmZF9nZXRfc2VjdGlvbl9saW5lbm9fc2l6ZS4KLQotCSogY2FjaGUuYzogIE1ha2UgdGhlICJmZG9wZW4iIHN1cHBvcnQgd29yay4gIEtlZXAgYmV0dGVyIHRyYWNrCi0Jb2YgaG93IG1hbnkgZmlsZXMgYXJlIG9wZW4uICBDZW50cmFsaXplIHRoZSBvcGVuaW5nIG9mIGZpbGVzCi0JYW5kIGJlIHN1cmUgYmZkX29wZW5bcnddIGFjdHVhbGx5IHRyeSB0byBvcGVuIHRoZSBmaWxlLiAgRXZhZGUKLQlsaW5rZWQgbGlzdCBpbml0aWFsaXphdGlvbiBwcm9ibGVtcy4KLQotCSogYi5vdXQuYywgY29mZi1jb2RlLmgsIG9wbmNscy5jLCBzdW5vcy5jOiAgbGludC4KLQotCSogY29mZi1jb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIE51bGwtdGVybWluYXRlIHN5bXRhYiBuYW1lcy4KLQotCSogY3BsdXMtZGVtLmM6ICBEZWxldGUgZmlsZSwgc2luY2UgaXQgaXMgbm90IHBhcnQgb2YgQkZELgotCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5yKTogIEVsaW1pbmF0ZSBtaXNwbGFjZWQgI2lmIDAgY29kZS4KLQkoYmZkX29wZW5yLCBiZmRfb3BlbncpOiAgQWN0dWFsbHkgb3BlbiB0aGUgZmlsZSwgZ2l2ZSBlcnJvciBub3cuCi0KLQkqIHN1bm9zLmMgKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBTZXQgc2VjdGlvbiBjb3VudC4KLQkoc3Vub3M0X3NldF9zZWN0aW9uX2xpbmVub3MsIHN0YWJfbmFtZXMsIGZwcmludF9uYW1lKTogIEVsaW1pbmlhdGUKLQlvYnNvbGV0ZSBkZWZpbml0aW9ucy4KLQkoX3dyaXRlX3N5bWJvbF90YWJsZSk6ICBJbml0aWFsaXplIDxpZHg+IGNvdW50ZXIuCi0JKGZvb3ApOiAgRWxpbWluYXRlIGRlYnVnZ2luZyBjb2RlLgotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05NDk1IGIvYmZkL0NoYW5nZUxvZy05NDk1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODY4NTgzLi4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2ctOTQ5NQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDQzICswLDAgQEAKLVRodSBEZWMgMjEgMTI6NDM6NDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgdGhlCi0Jb2xkIHN0eWxlIFRPQzE2IHJlZmVyZW5jZXMgd2l0aG91dCB1c2luZyBSX1BQQ19HT1QuCi0JKHBwY19yZWxvY190eXBlKTogRGl0dG8uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgc3VwcG9ydCBmb3IgVE9DMTYuCi0JKHBwY19lbGZfdG9jMTZfaW5uZXIpOiBSZW5hbWVkIGZyb20gcHBjX2VsZl9nb3QxNl9pbm5lci4KLQkocHBjX2VsZl90b2MxNl9yZWxvYyk6IFJlbmFtZWQgZnJvbSBwcGNfZWxmX3RvYzE2X3JlbG9jLgotCShwcGNfZWxmX2dvdDE2X3tpbm5lcixyZWxvY30pOiBTdHVicyBmb3IgcmVhbCBHT1Qgc3VwcG9ydC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBOZXcgZnVuY3Rpb24gZm9yIEdPVC9QTFQgc3VwcG9ydCB0aGF0IGlzCi0Jd29yayBpbiBwcm9ncmVzcy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEaXR0by4KLQkocHBjX2VsZl9hZGp1c3RfZHluaW5keCk6IERpdHRvLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERpdHRvLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERpdHRvLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGl0dG8uCi0JKEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKTogRGVmaW5lLgotCi1XZWQgRGVjIDIwIDE5OjE0OjE4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogV2hlbiBhdHRhY2hpbmcgc2VjdGlvbnMgdG8KLQlzZWdtZW50cyBpZ25vcmUgc2VjdGlvbnMgdGhhdCB3b24ndCBiZSBhbGxvY2F0ZWQuICBQYXRjaCBmcm9tCi0JQW5kcmVhcyBTY2h3YWIuCi0KLVR1ZSBEZWMgMTkgMjA6MDE6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IE1hdGNoIG9uIG02OGstY2JtLSogb25seSBpZiBPUyBkb2Vzbid0IG1hdGNoCi0JYW55dGhpbmcgZWxzZS4KLQotVHVlIERlYyAxOSAxNjozODo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChDQUxDX0FEREVORCk6IERlZmluZS4KLQkoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgdGhlIGlucHV0IHNlY3Rpb24gVk1BIHRvIHRoZQotCWFkZGVuZCBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzLgotCi1TdW4gRGVjIDE3IDIwOjExOjU1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3BkYXRhKTogTXVzdCB0ZXN0IHRoZSBlbnRpcmUgZW50cnkgZm9yIHplcm8KLQl0byBjb3JyZWN0bHkgdGVybWluYXRlLgotCi1GcmkgRGVjIDE1IDEyOjA1OjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9lbmRpYW4pOiBEZWZpbmUuCi0JKGJmZF90YXJnZXQpOiBSZW5hbWUgYnl0ZW9yZGVyX2JpZ19wIHRvIGJ5dGVvcmRlciwgYW5kIGNoYW5nZSBpdAotCWZyb20gYm9vbGVhbiB0byBlbnVtIGJmZF9lbmRpYW4uICBDaGFuZ2UgaGVhZGVyX2J5dGVvcmRlcl9iaWdfcAotCWNvcnJlc3BvbmRpbmdseS4KLQkqIGJmZC1pbi5oIChiZmRfYmlnX2VuZGlhbiwgYmZkX2xpdHRsZV9lbmRpYW4pOiBOZXcgbWFjcm9zLgotCShiZmRfaGVhZGVyX2JpZ19lbmRpYW4sIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbik6IE5ldyBtYWNyb3MuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBBbGwgdGFyZ2V0czogQ2hhbmdlIGluaXRpYWxpemF0aW9uIG9mIGJ5dGVvcmRlciBhbmQKLQloZWFkZXJfYnl0ZW9yZGVyIHRvIHVzZSBlbnVtIGJmZF9lbmRpYW4gdmFsdWVzIHJhdGhlciB0aGFuCi0JYm9vbGVhbnMuCi0JKiBBbGwgZmlsZXM6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBieXRlb3JkZXJfYmlnX3AgYW5kCi0JaGVhZGVyX2J5dGVvcmRlcl9iaWdfcCB0byB1c2UgbmV3IGJmZF8qX2VuZGlhbiBtYWNyb3MuCi0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogU2V0IGxtYSB0byBzX3BhZGRyLCBub3QKLQlzX3ZhZGRyLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgc19wYWRkciB0byBsbWEsIG5vdAotCXZtYS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLUZyaSBEZWMgMTUgMDc6MzI6MDkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVbaV0taTM4Ni5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IERlZmluZSB0byAnXycuCi0KLVRodSBEZWMgMTQgMTM6NDU6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IExvdHMgb2YgbWlub3IgY2xlYW51cHMuICBNYWtlIG1hbnkgZnVuY3Rpb25zIHJldHVybgotCWVycm9ycyByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LiAgQWxzbzoKLQkoaWVlZV93cml0ZV90d29ieXRlKTogUmVtb3ZlOyBjaGFuZ2UgY2FsbGVycyB0byBjYWxsIGV4aXN0aW5nCi0JaWVlZV93cml0ZV8yYnl0ZXMgZnVuY3Rpb24uCi0JKGllZWVfd3JpdGVfZXhwcmVzc2lvbik6IERvbid0IG91dHB1dCB0aGUgc2VjdGlvbiB0d2ljZSB3aGVuCi0Jb3V0cHV0dGluZyBhIGxvY2FsIHN5bWJvbC4gIERvbid0IGVtaXQgYW4gZXh0cmFuZW91cyB6ZXJvIGlmIHRoZXJlCi0JaXMgb25seSBvbmUgdGVybS4KLQkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IFNldCB0aGUgbG1hIGFzIHdlbGwgYXMgdGhlIHZtYS4KLQkoaWVlZV9hcmNoaXZlX3ApOiBVc2UgYmZkX2FsbG9jX2dyb3cgcmF0aGVyIHRoYW4gYW4gb2JzdGFjay4KLQotCSogaWhleC5jIChpaGV4X3NldF9hcmNoX21hY2gpOiBEb24ndCBhY2NlcHQgYW55IGFyY2hpdGVjdHVyZSwganVzdAotCWEgcmVjb2duaXplZCBvbmUgb3IgYmZkX2FyY2hfdW5rbm93bi4KLQkoaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbCwgdG8gcGVybWl0IG9iamNvcHkKLQl0byBzdWNjZWVkLgotCShpaGV4X2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQotV2VkIERlYyAxMyAxNTo0NDowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4Lmg6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlKTogRGVmaW5lLgotCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyk6IERlZmluZS4KLQkoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSk6IERlZmluZS4KLQkoYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCk6IERlZmluZSBtYWNyby4KLQkoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvKTogQWRkIGluY2x1ZGVzIGZpZWxkLgotCShhb3V0X2xpbmtfaW5jbHVkZXNfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IEluaXRpYWxpemUgaW5jbHVkZXMgaGFzaCB0YWJsZS4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBFbGltaW5hdGUgZHVwbGljYXRlIE5fQklOQ0wgZW50cmllcy4KLQotV2VkIERlYyAxMyAxMDo1MjoxNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IE1hdGNoIG9uIG1pcHMtKi0qIGluc3RlYWQgb2YgbWlwcy1pZHQtZWNvZmYuCi0KLVdlZCBEZWMgMTMgMTE6MDc6NDUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiByZW1vdmVkIGRlYnVnZ2luZyBjb2RlLgotCi1UdWUgRGVjIDEyIDE3OjQyOjA2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3JlbG9jKTogTmV3IGZ1bmN0aW9uIHRvIGR1bXAgdGhlIC5yZWxvYyBzZWN0aW9uLgotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogY2FsbCBwZV9wcmludF9yZWxvYy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogLnJlbG9jIHNlY3Rpb24gYWxpZ25tZW50LgotCSogY29mZi1wcGMuYyAoaW5fcmVsb2NfcCk6IEFkZGVkIG1pc3Npbmcgbm9uLWVsaWdpYmxlIHJlbG9jcy4gU3BpZmZlZAotCXVwIHNvbWUgZGVidWdnaW5nIGFzIHdlbGwuCi0KLVR1ZSBEZWMgMTIgMTE6MzQ6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBIYW5kbGUgc3BhcmMtKi1lbGYqLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlCi0JPHJmZ0Btb25rZXlzLmNvbT4uCi0KLUZyaSBEZWMgIDggMTc6NDc6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBzZWN0aW9uX2NvdW50IHRvIDAKLQl3aGVuIHNldHRpbmcgc2VjdGlvbnMgdG8gTlVMTC4KLQotV2VkIERlYyAgNiAxNzowNTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8pOiBBZGQgZXhwb3J0X2RlZmluZWRzCi0JZmllbGQuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgZXhwb3J0X2RlZmluZWRzIHBhcmFtZXRlci4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogSWYgZXhwb3J0X2RlZmluZWRzIGlzIHNldCwgc2V0IFhDT0ZGX0VYUE9SVAotCWZvciBhbGwgc3ltYm9scy4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gRGVjICA0IDE2OjQwOjQ3IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgcHJpbnRmJ3MKLQotTW9uIERlYyAgNCAxMToyNTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogSGFuZGxlIHJlY29yZCB0eXBlcyA0IGFuZCA1LgotCShpaGV4X29iamVjdF9wKTogUGVybWl0IHR5cGVzIDQgYW5kIDUuCi0JKGloZXhfc2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgY2hlY2sgZm9yIG91dCBvZiByYW5nZQotCWFkZHJlc3Nlcy4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBHZW5lcmF0ZSB0eXBlcyA0IGFuZCA1LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBKdXN0IGlnbm9yZSB3YXJuaW5nIGFuZAotCWluZGlyZWN0IHJlZmVyZW5jZXMgdG8gc3ltYm9scyB3aGljaCBkb24ndCByZWFsbHkgZXhpc3QuCi0KLVN1biBEZWMgIDMgMTk6MDA6MjcgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBNaW5vciBmb3JtYXQgZml4ZXMKLQkocGVfcHJpbnRfZWRhdGEpOiBOZXcgZnVuY3Rpb24uIFVuZGVyIHByaXZhdGUgcHJpbnRpbmcsIHRoaXMgZm9ybWF0cwotCXRoZSBlZGF0YSBzZWN0aW9uIG9mIGEgUEUgZmlsZS4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZGVkIGNhbGwgdG8gcGVfcHJpbnRfZWRhdGEuCi0KLVN1biBEZWMgIDMgMTY6NDY6NTQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBhb3V0LWFybS5jIChNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgS0VFUElUIHRvIGdldCB0aGUgc3ltYm9sCi0JaW5kZXgsIGRvbid0IGNhbGwgc3RvaS4KLQotRnJpIERlYyAgMSAxNDo0Njo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogU2V0IGxtYSBhcyB3ZWxsIGFzIHZtYS4KLQotCSogaWhleC5jOiBOZXcgZmlsZTsgc3VwcG9ydCBmb3IgSW50ZWwgSGV4IGZvcm1hdC4KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZCBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ci4KLQkoaWhleF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFsd2F5cyBpbmNsdWRlIGloZXhfdmVjLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGloZXhfZGF0YSBmaWVsZCB0byB0ZGF0YSB1bmlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBBZGQgaWhleC5vCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBpaGV4LmMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogU29ydCB0aGUgc2VjdGlvbnMgaW4KLQllYWNoIHNlZ21lbnQuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogUmV0dXJuIHRoZSByaWdodCBzaXplIGlmIHNlZ21lbnRfbWFwIGlzCi0Jbm90IE5VTEwuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IGJvdGhlciB0byBzb3J0IHRoZSBzZWN0aW9ucy4KLQotCSogYmZkLmMgKGJmZF9yZWNvcmRfcGhkcik6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfcmVjb3JkX3BoZHIpOiBEZWNsYXJlLgotCSogYmZkX2luMi5oOiBSZWJ1aWxkLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIGJvZ3VzCi0JQkZEX0FTU0VSVC4KLQotCSogbGliYmZkLmMgKGJmZF9tYWxsb2MsIGJmZF9yZWFsbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX3ptYWxsb2MpOiBSZXR1cm4gUFRSLCBub3QgY2hhciAqLiAgVGFrZSBzaXplX3QsIG5vdAotCWJmZF9zaXplX3R5cGUuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX21hbGxvYywgYmZkX3JlYWxsb2MpOiBEZWNsYXJlLgotCShiZmRfem1hbGxvYyk6IENoYW5nZSBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFueSBmaWxlczogVXNlIGJmZF9tYWxsb2MgYW5kIGJmZF9yZWFsbG9jIHJhdGhlciB0aGFuIG1hbGxvYwotCWFuZCByZWFsbG9jLiAgRG9uJ3Qgc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgdGhleSBmYWlsLgotCi1UaHUgTm92IDMwIDE5OjMyOjI2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jOiBBZGRlZCBtYWNyb3MgdG8gdGlkeSB1cCB0b2MgY2VsbCB0cmVhdG1lbnQuIE51bWVyb3VzCi0JdXNlcyBhcyB3ZWxsLiBBZGRlZCBhIG5ldyBob3d0byB0byBkZWFsIHdpdGggVE9DUkVMMTYgcmVsb2NzIHRoYXQKLQlhcmUgVE9DREVGTiBhcyB3ZWxsLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogRXhwYW5kZWQgdHJlYXRtZW50IG9mIEFERFIzMk5CIHJlbG9jcwotCXRvIGhhbmRsZSBSVkEgcmVsb2NzIGZyb20gZGxsdG9vbC4KLQkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiBUT0NERUZOIHJlbG9jIGFkZGl0aW9uLgotCShjb2ZmX3BwY19ydHlwZV90b19ob3d0byk6IFRPQ0RFRk4gcmVsb2MgYWRkaXRpb24uCi0JKHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogVE9DREVGTiByZWxvYyBhZGRpdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBjaGVjayBpZGF0YSRYIHNlY3Rpb25zCi0JdG8gZ2V0IHRoZSByaWdodCBzZWN0aW9uIGFsaWdubWVudC4KLQotVGh1IE5vdiAzMCAxNjo0ODoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3Qgc2V0IGxtYSBiYXNlZCBvbgotCXBfcGFkZHIgaWYgcF9wYWRkciBpcyB6ZXJvLgotCShtYWtlX21hcHBpbmcpOiBTZXQgaW5jbHVkZXNfZmlsZWhkciBhbmQgaW5jbHVkZXNfcGhkcnMgZm9yIGZpcnN0Ci0JUFRfTE9BRCBzZWdtZW50LgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBTZXQgaW5jbHVkZXNfcGhkcnMgZm9yIFBUX1BIRFIKLQlzZWdtZW50LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSGFuZGxlIGluY2x1ZGVzX2ZpbGVoZHIgYW5kCi0JaW5jbHVkZXNfcGhkcnMuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiBQVF9QSERSIGFuZCBmaXJzdAotCVBUX0xPQUQgc2VnbWVudHMuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFNldCBpbmNsdWRlc19maWxlaGRyIGFuZCBpbmNsdWRlc19waGRyCi0Jd2hlbiBhcHByb3ByaWF0ZS4gIFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIFBUX1BIRFIgc2VnbWVudC4KLQlVc2UgYSBtb3JlIGNvbXBsZXggY29uZGl0aW9uIGZvciB3aGVuIGEgc2VjdGlvbiBpcyBpbmNsdWRlZCBpbiBhCi0Jc2VnbWVudCB0byBoYW5kbGUgU29sYXJpcyBsaW5rZXIgb2RkaXRpZXMuCi0KLVRodSBOb3YgMzAgMTE6MTc6MzMgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChob3d0b190YWJsZSk6IFJlZm9ybWF0dGVkIGZvciBlYXNpZXIgcmVhZGluZzsKLQlzcGVjaWFsX2Z1bmN0aW9uIG5vdyBwb2ludHMgdG8gbmV3IGZ1bmN0aW9uIG04OGtfc3BlY2lhbF9yZWxvYy4KLQkoaG93dG9faHZydDE2KTogRnVuY3Rpb24gcHJldmlvdXNseSB1c2VkIGZvciBoYW5kbGluZyBIVlJUMTYgcmVsb2NzCi0JcmVtb3ZlZC4KLQkocnR5cGUyaG93dG8pOiBEbyBub3QgYWRkIHJlbG9jJ3Mgcl9vZmZzZXQgdG8gdGhlIGFkZGVuZCwgdGhpcyB3aWxsCi0JYmUgZG9uZSBjb3JyZWN0bHkgYnkgbTg4a19zcGVjaWFsX3JlbG9jLgotCShyZWxvY19wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgUkVMT0NfUFJPQ0VTU0lORy4KLQkoUkVMT0NfUFJPQ0VTU0lORyk6IERlZmluZSB0byBjYWxsIHJlbG9jX3Byb2Nlc3NpbmcuCi0KLVdlZCBOb3YgMjkgMTI6NDI6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogQ2FsbCBtYWxsb2MgcmF0aGVyIHRoYW4geG1hbGxvYy4KLQkocGVfcHJpbnRfcGRhdGEpOiBMaWtld2lzZS4KLQotCSogb3BuY2xzLmMgKGJmZF9hbGxvY19ieV9zaXplX3QpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZgotCW9ic3RhY2tfYWxsb2MgZmFpbHMuCi0JKGJmZF9hbGxvY19maW5pc2gpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiBvYnN0YWNrX2ZpbmlzaAotCWZhaWxzLgotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogU2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgbWFsbG9jIGZhaWxzLgotCSogTWFueSBmaWxlczogZG9uJ3Qgc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgb25lIG9mIHRoZSBhYm92ZQotCXJvdXRpbmVzIGZhaWxzLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IERvbid0IGFkanVzdCBwX3BhZGRyCi0JaWYgcF9wYWRkcl92YWxpZCBpcyBzZXQuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDYWxsIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGaXggY2FzZSB3aGVyZSBleHRyYQotCXByb2dyYW0gaGVhZGVycyB3ZXJlIGFsbG9jYXRlZC4KLQotCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSB0bwotCV9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbik6IERvbid0IGFib3J0IGlmCi0Jcl9zeW1uZHggaXMgUkVMT0NfU0VDVElPTl9OT05FIGZvciBhbiBBTFBIQV9SX0lHTk9SRSByZWxvYy4KLQlDaGFuZ2UgYSBSRUxPQ19TRUNUSU9OX0xJVEEgc3ltbmR4IHRvIFJFTE9DX1NFQ1RJT05fQUJTLgotCShhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCk6IENoYW5nZSBSRUxPQ19TRUNUSU9OX0FCUyB0bwotCVJFTE9DX1NFQ1RJT05fTElUQSBmb3IgQUxQSEFfUl9JR05PUkUuCi0JKGFscGhhX2FkanVzdF9yZWxvY19vdXQpOiBGb3IgQUxQSEFfUl9JR05PUkUsIGRvbid0IGNoYW5nZQotCVJFTE9DX1NFQ1RJT05fQUJTIHRvIFJFTE9DX1NFQ1RJT05fTk9ORS4KLQotVHVlIE5vdiAyOCAxNjo1OTo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgc2VnbWVudF9tYXAgZmllbGQuCi0JKiBlbGYuYyAobWFrZV9tYXBwaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX3NvcnRfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBSZW1vdmUuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogUmVtb3ZlIHNvcnRlZF9oZHJzLCBjb3VudCwgYW5kCi0JbWF4cGFnZXNpemUgcGFyYW1ldGVycy4gIFNpbXBsaWZ5LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFdoZW4gZ2VuZXJhdGluZyBhbgotCWV4ZWN1dGFibGUsIHVzZSBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzLgotCShlbGZfc29ydF9oZHJzKTogUmVtb3ZlLgotCShfYmZkX2VsZl9zaXplb2ZfaGVhZGVycyk6IFJlbW92ZSBlbGltaW5hdGVkIHBhcmFtZXRlcnMgZnJvbSBjYWxsCi0JdG8gZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuCi0KLU1vbiBOb3YgMjcgMTI6Mjc6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocDMwMGhwdXguYyAoTVkoY2FsbGJhY2spKTogU2V0IGxtYSBhcyB3ZWxsIGFzIHZtYS4KLQotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogU2V0IGNvcnJlY3RseSwgdG8gMS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IFNldCBjb3JyZWN0bHksIHRvIDAuCi0KLVdlZCBOb3YgMjIgMTI6MDI6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogSGFuZGxlIFNUWVBfUkNPTlNULgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBIYW5kbGUgc2NSQ29uc3QuCi0JKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogSGFuZGxlIFJFTE9DX1NFQ1RJT05fUkNPTlNULgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEhhbmRsZSBzY1JDb25zdC4KLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBIYW5kbGUgc2NSQ29uc3QuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBIYW5kbGUgLnJjb25zdAotCXNlY3Rpb24uCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9SQ09OU1QuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBPbmx5IHNldCB3cml0dGVuIGlmIHRoZQotCURFRl9EWU5BTUlDIGZsYWcgaXMgc2V0LgotCi1UdWUgTm92IDIxIDEzOjI1OjI5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBob3N0LWFvdXQuYzogSWYgVFJBRF9IRUFERVIgaXMgZGVmaW5lZCwgaW5jbHVkZSBpdC4KLQotVHVlIE5vdiAyMSAxMzowMzo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbi4KLQkoQkZEX0JJTkFSWV9GT1BFTik6IFJlcXVpcmUgQUNfQ0FOT05JQ0FMX1NZU1RFTS4KLQkoQkZEX05FRURfREVDTEFSQVRJT04pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWd1cmUuaW46IFVzZSBCRkRfTkVFRF9ERUNMQVJBVElPTi4KLQkqIGFjY29uZmlnLmg6IFB1dCBORUVEX0RFQ0xBUkFUSU9OXyogaW4gQFRPUEAgc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFyCi0Jc3BlY2lhbF9zZWN0aW9ucyBiZWZvcmUgcmV0dXJuaW5nIHdoZW4gY2FsbGVkIHdpdGggYSBub24gWENPRkYKLQlCRkQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogU29ydCBjb21tb24gc3ltYm9scyB3aXRoCi0JZ2xvYmFsIHN5bWJvbHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogT25seSBwYWQgdGhlCi0JcHJldmlvdXMgc2VjdGlvbiB0byBmb3JjZSBmaWxlIGFsaWdubWVudCB3aGVuIGNyZWF0aW5nIGFuCi0JZXhlY3V0YWJsZS4KLQotTW9uIE5vdiAyMCAxNDo1NDowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYKLQlSUzYwMDBDT0ZGX0MsIHNldCB1cCB0aGUgLmRlYnVnIHNlY3Rpb24uCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IEFkanVzdCB0aGUgVE9DIGFuY2hvciB2YWx1ZQotCWlmIGl0IGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gYWNjb21vZGF0ZSB0aGUgZW50aXJlIFRPQyBhcmVhIHdpdGgKLQlzaWduZWQgMTYgYml0IG9mZnNldHMuCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBIYW5kbGUgbmVnYXRpdmUgVE9DIG9mZnNldHMgaW4gZ2xvYmFsCi0JbGlua2FnZSBjb2RlLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IHJlbG9jYXRpb25zIGFnYWluc3QgYQotCVRPQyBhbmNob3IgdG8gdXNlIHRoZSBUT0MgdmFsdWUgdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLVNhdCBOb3YgMTggMTg6MDE6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IENhc3QgbWFsbG9jIHJldHVybi4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCi0KLVNhdCBOb3YgMTggMTk6NDM6MDQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBwZS1hcm0uYzogRml4IHR5cG9zLgotCSogY29mZi1hcm0uYzogTGlrZXdpc2UuCi0KLUZyaSBOb3YgMTcgMTY6MjI6MDQgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGxpc3RfZWxlKTogQWRkZWQgImNhdCJlZ29yeSBtZW1iZXIuCi0JKHJlY29yZF90b2MpOiBOZXcgY2F0ZWdvcnkgcGFyYW1ldGVyIChwcml2IG9yIHB1YikuCi0JKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogQ2hlY2sgdG8gc2VlIGlmIHRvYyBib3VuZHMgZXhjZWVkZWQuCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlZCBlbWJyaW9uaWMgZGF0YS1pbi10b2MgZnJvbQotCXRoZSBtYWlubGluZS4gSXQgYWRkZXMgZXh0cmEgdG9jIGNlbGxzIGluIGVycm9yLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogQWRkZWQgc29tZSBkb2N1bWVudGF0aW9uLgotCShkdW1wX3RvYyk6IENhbiBub3cgZGlhZ25vc2UgInZpcnR1YWwgdG9jIiBjaGljYW5lcnkuCi0KLUZyaSBOb3YgMTcgMTA6NDE6MjUgMTk5NSAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IENoYW5nZSB0eXBlIG9mCi0JZHluc3ltY291bnQgYW5kIGJ1Y2tldGNvdW50IGZpZWxkcyBmcm9tIHNpemVfdCB0byBiZmRfc2l6ZV90eXBlLgotCi1GcmkgTm92IDE3IDEwOjAyOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9wb2ludGVyaXplX2F1eF9ob29rKTogSTk2MCB2ZXJzaW9uOiBkb24ndAotCXBvaW50ZXJpemUgQ19MRUFGU1RBVCBvciBDX0xFQUZFWFQgZW50cmllcy4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IE9ubHkgY3JlYXRlCi0JRFRfSU5JVCBhbmQgRFRfRklOSSBlbnRyaWVzIGlmIHRoZSBfaW5pdCBvciBfZmluaSBzeW1ib2wgaXMKLQlkZWZpbmVkIG9yIG1lbnRpb25lZCBpbiBhIHJlZ3VsYXIgZmlsZS4KLQotVGh1IE5vdiAxNiAxNToxNjo0MiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF9kYXRhX2luX3RvY19lbnRyeSk6IG5ldyBmdW5jdGlvbgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFRPQ0RFRk4gYXR0cmlidXRlCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IFJFTDI0IGhhbmRsaW5nCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogQ29ycmVjdCBUT0NERUZOIGhhbmRsaW5nCi0KLQkqIHBlaWNvZGUuaCAoZGlyX25hbWVzKTogQWRkZWQgbmFtZSBkZXNjcmlwdGlvbnMKLQotVGh1IE5vdiAxNiAwMzozODowMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogVXBkYXRlZCB0byBjeWdudXMtMi42LgotCi1XZWQgTm92IDE1IDE5OjMwOjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKG02OGs0a25ldGJzZF92ZWMpOiBEZWNsYXJlLgotCi1XZWQgTm92IDE1IDE4OjA1OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIGFyZ3VtZW50IHRvCi0JX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIGZyb20gdm9pZCAqIHRvIFBUUi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDYXN0Ci0JdXNpbmcgUFRSIHJhdGhlciB0aGFuIHZvaWQgKi4KLQkqIGJmZC1pbjIsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogcGVpY29kZS5oIChwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlIHZmaWxlIGZyb20gdm9pZCAqCi0JdG8gUFRSLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSBhcwotCV9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSByYXRoZXIgdGhhbiBjYXN0aW5nCi0JYmZkX3RydWUuCi0KLVdlZCBOb3YgMTUgMDQ6MDk6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguZGVwMSk6IEZpeCBzdHVwaWQgdHlwbyBpbiBsYXN0IGNoYW5nZS4gIFJlbW92ZSBhbnkKLQkiRE8gTk9UIERFTEVURSIgbGluZXMgb3IgYmxhbmsgbGluZXMgdGhhdCBta2RlcCB3cml0ZXMgb24gc29tZQotCXN5c3RlbXMuCi0JKEJGRF9MSUJTX0NGSUxFUywgQUxMX01BQ0hJTkVTX0NGSUxFUywgQkZEMzJfQkFDS0VORFNfQ0ZJTEVTLAotCUJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENGSUxFUyk6IFVzZSB0aGVtLgotCi1UdWUgTm92IDE0IDExOjUyOjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgUFBDIFBFLCBzdGFydCBpc2l6ZSBhdCAwLAotCW5vdCBhdCB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQXZvaWQgdXNpbmcKLQl1bnBvcnRhYmxlICNlbGlmLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFdoZW4gZ2VuZXJhdGluZyBhIFBQQyBQRSBleGVjdXRhYmxlCi0Jd2l0aCBubyBzeW1ib2xzLCByb3VuZCB1cCB0aGUgZmlsZSBzaXplIHRvIGEgQ09GRl9QQUdFX1NJWkUKLQlib3VuZGFyeS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsCi0JZG9uJ3Qgd3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogV2hlbiB1c2luZyBhIGRpZmZlcmVudCBzZWN0aW9uCi0JaGVhZGVyLCBwYXNzIHRoZSBuZXcgb25lIHRvIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2luZm8gYW5kIHNoX2VudHNpemUgZmllbGRzLgotCShlbGZfbWFwX3N5bWJvbHMpOiBBZGQgc2VjdGlvbiBWTUEgdG8gc3ltYm9sIHZhbHVlIHdoZW4gY29tcGFyaW5nCi0JYWdhaW5zdCAwLgotCShfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGJ1aWxkIHN5bWJvbCB0YWJsZQotCWlmIHRoZXJlIGFyZSBzb21lIHN5bWJvbHMuICBTZXQgZmlsZSBvZmZzZXQgb2Ygc3ltdGFiIGFuZCBzdHJ0YWIKLQlzZWN0aW9ucy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBSZW1vdmUgZG9zeW1zIHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuICBOZXZlciBzZXQgZmlsZSBvZmZzZXQgb2Ygc3ltdGFiIGFuZCBzdHJ0YWIKLQlzZWN0aW9ucy4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoTUFQX09ORVNZTVRBQiwgTUFQX0RZTlNZTVRBQiwgTUFQX1NUUlRBQiwgTUFQX1NIU1RSVEFCKTogRGVmaW5lLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKHN3YXBfb3V0X3N5bXMpOiBDaGVjayBmb3Igc3BlY2lhbCBtYXBwaW5nIG9mIHN0X3NobmR4IGNyZWF0ZWQgYnkKLQljb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEuCi0JKiBlbGZ4eC10YXJnZXQuaDogVXNlIG5ldyBjb3B5IHJvdXRpbmVzLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogRGVjbGFyZS4KLQotCSogY29uZmlnLmJmZCAoc2gtKi0qKTogU2V0IHRhcmdfZGVmdmVjIHRvIHNoY29mZl92ZWMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgQ09GRl9XSVRIX1BFLCBoYW5kbGUKLQlDX05UX1dFQUsuCi0KLQkqIGNvZmYtc2guYyAoc2hsY29mZl92ZWMpOiBVc2UgX2JmZF9nZW5lcmljX2FyY2hpdmVfcCwgbm90Ci0JX2JmZF9kdW1teV90YXJnZXQsIG1hdGNoaW5nIHRoZSByZWNlbnQgY2hhbmdlIHRvIGFyY2hpdmUKLQlyZWNvZ25pdGlvbi4KLQotTW9uIE5vdiAxMyAxMzoyNDozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogVXNlIGNhc3RzIHRvIGF2b2lkIGRvaW5nCi0JYXJpdGhtZXRpYyBvbiBQVFIgdHlwZXMuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCB0aGUgbG1hIG9mIHRoZSBzZWN0aW9ucy4KLQotCSogZWNvZmYuYyAoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IFR1cm4gYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZAotCXN5bWJvbCBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgc2VjdGlvbi4KLQotTW9uIE5vdiAxMyAwNzozMTozNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX2NvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgc3VwcG9ydCBmb3IgaW5saW5lCi0JZ2x1ZSBmb3IgdGhlIHJlbG9jczogSU1HTFVFIGFuZCBJRkdMVUUuCi0JKHJlY29yZF90b2MpOiBuZXcgZnVuY3Rpb24gLSB0cmFja3MgdG9jIGNvbnRlbnRzCi0JKHBwY19tYXJrX3N5bWJvbF9hc19nbHVlKTogbmV3IGZ1bmN0aW9uIC0gc3VwcG9ydHMgdGhlIElNR0xVRSByZWxvYwotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkZWQgc3VwcG9ydCBhbmQgZml4ZXMgZm9yIElNR0xVRS9JRkdMVUUKLQkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiByZW1vdmVkIGludmFsaWQgSU1HTFVFIGhhY2sKLQkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiByZW1vdmVkIGludmFsaWQgSU1HTFVFIGhhY2sKLQkocHBjX3JlY29yZF90b2NfZW50cnkpOiBSZW1vdmVkIGEgZGVidWcgZGVmaW5lIChkdWgpCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBGaXhlZCBpbnZhbGlkIHN0cmNtcCBmb3IgIi5yZWxkYXRhIgotCShwZV9wcmludF9pZGF0YSk6IE5ldyBmdW5jdGlvbiAtIGZvcm1hdHMgdGhlIGlkYXRhIHNlY3Rpb24gZGF0YQotCShwZV9wcmludF9wZGF0YSk6IE5ldyBmdW5jdGlvbiAtIGZvcm1hdHMgdGhlIHBkYXRhIHNlY3Rpb24gZGF0YQotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogY2FsbHMgdG8gYWJvdmUKLQotU3VuIE5vdiAxMiAxMjoyMzoyNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChiZmRfbGlic19oZXJlLCBldGMpOiBQcm92aWRlIGVtcHR5IGRlZmluaXRpb25zLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBBZGQgY29uZGl0aW9uYWwgZGVmaW5lcwotCVRBUkdFVF9TWU0gYW5kIFRBUkdFVF9OQU1FIGZvciB2ZWN0b3IgYW5kIEJGRCBuYW1lLgotCSogY29mZi1wbWFjLmMgKHBtYWNfeGNvZmZfdmVjKTogUmVtb3ZlLgotCShUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBbUE9XRVJNQUNdOiBTZXQgdGhlCi0JbWFjaGluZSB0byAwLCBub3QgYWxsIFBvd2VyTWFjcyBhcmUgNjAxcy4KLQotRnJpIE5vdiAxMCAxMjoxMDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVhZCBpbiBhbnkgcHJvZ3JhbSBoZWFkZXJzLgotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGp1c3Qgc2VjdGlvbiBsbWEKLQliYXNlZCBvbiB0aGUgcHJvZ3JhbSBoZWFkZXJzLCBpZiBhbnkuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2FkZHIgZnJvbSB0aGUgdm1hLCBub3QgdGhlIGxtYS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBTZXQgcF9wYWRkciBvZiBwcm9ncmFtIGhlYWRlcnMgYmFzZWQgb24KLQl0aGUgbG1hLgotCi1UaHUgTm92ICA5IDEzOjAxOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBQcmVzZXJ2ZSB0ZGF0YSBpbiBjYXNlIG9mCi0JZmFpbHVyZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogUmVwb3J0IGEgcmVhc29uYWJsZSBlcnJvciB3aGVuCi0JdHJ5aW5nIHRvIGRvIGEgcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCBhIG5vbi1hLm91dCBvYmplY3QgZmlsZS4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBDaGVjayB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUKLQlpbiBhbiBhcmNoaXZlIGV2ZW4gaWYgdGFyZ2V0X2RlZmF1bHRlZCBpcyBzZXQuICBJZiB0aGUgb2JqZWN0IGZpbGUKLQloYXMgdGhlIHdyb25nIHh2ZWMsIHJlamVjdCBpdC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6IElmIGEgc2VjdGlvbiBjYW4gbm90Ci0JYmUgcmVwcmVzZW50ZWQsIHJlcG9ydCB0aGUgbmFtZSB2aWEgX2JmZF9lcnJvcl9oYW5kbGVyLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFdyaXRlIFJTNjAwMENPRkZfQyB2ZXJzaW9uCi0Jd2hpY2ggY2hlY2tzIGZvciBTVFlQX09WUkZMTyBzZWN0aW9ucy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZQotCXJlbG9jIGFuZCBsaW5lbm8gY291bnQgb3ZlcmZsb3dzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgY29mZl9jb3VudF9saW5lbnVtYmVycyBiZWZvcmUKLQljb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIElmIFJTNjAwMENPRkZfQywgaGFuZGxlCi0JcmVsb2MgYW5kIGxpbmVubyBjb3VudCBvdmVyZmxvd3MuCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IENvdW50IGxpbmUgbnVtYmVycyBhbmQKLQlyZWxvY3MgYmVmb3JlIGRlYWxpbmcgd2l0aCAucGFkIHNlY3Rpb25zLiAgQ291bnQgb3ZlcmZsb3cgc2VjdGlvbgotCWhlYWRlcnMgd2hlbiBoYW5kbGluZyAucGFkIHNlY3Rpb25zLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBhLm91dCB2c3RhbXAgdG8gMQotCWlmIFJTNjAwMENPRkZfQy4KLQotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX0RFU0NSSVBUT1IpOiBEZWZpbmUuCi0JKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZGVzY3JpcHRvcl9zZWN0aW9uIGFuZAotCXNwZWNpYWxfc2VjdGlvbnMgZmllbGRzLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IGxpbmthZ2Ugc2VjdGlvbiBhbGlnbm1lbnQuICBDcmVhdGUKLQlkZXNjcmlwdG9yIHNlY3Rpb24uICBDaGVjayBmb3IgbWFnaWMgc3ltYm9sIG5hbWVzIChfdGV4dCwgZXRjLiksCi0JYW5kIHJlY29yZCB0aGVtIGluIHNwZWNpYWxfc2VjdGlvbnMgaWYgZm91bmQuICBTZXQKLQlYQ09GRl9ERVNDUklQVE9SIGZsYWcgZm9yIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgYW5kIHNldCBpdHMKLQlkZXNjcmlwdG9yIGZpZWxkIHRvIHBvaW50IGJhY2sgdG8gdGhlIGZ1bmN0aW9uIGNvZGUgc3ltYm9sLgotCSh4Y29mZl9zd2VlcCk6IEFsd2F5cyBtYXJrIHRoZSBzcGVjaWFsIGRlc2NyaXB0b3Jfc2VjdGlvbi4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBDaGVjayB3aGV0aGVyIHRoZSBzeW1ib2wgbWlnaHQgYmUgYQotCWZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBtYXJrIGl0IGlmIGl0IGlzLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIG5ldyBzcGVjaWFsX3NlY3Rpb25zCi0JcGFyYW1ldGVyLCBhbmQgZmlsbCBpdCBpbi4gIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGVzY3JpcHRvcgotCXNlY3Rpb24uCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFNldCBYQ09GRl9ERUZfUkVHVUxBUiBmbGFnIHdoZW4gZGVmaW5pbmcKLQlnbG9iYWwgbGlua2FnZSBjb2RlLiAgSWYgYW4gdW5kZWZpbmVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IgaXMKLQlleHBvcnRlZCwgYXJyYW5nZSB0byBkZWZpbmUgaXQuICBXYXJuIGFib3V0IGFueSBvdGhlciB1bmRlZmluZWQKLQlleHBvcnRlZCBzeW1ib2wuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgdGhlIGRlc2NyaXB0b3Igc2VjdGlvbi4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IENyZWF0ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3Igd2hlbgotCW5lY2Vzc2FyeS4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UaHUgTm92ICA5IDA4OjQwOjIzIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpOiBuZXcgdHlwZXMgZm9yIGhhc2hpbmcKLQkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlKTogbmV3IHR5cGVzIGZvciBoYXNoaW5nCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogaGFzaCBlbnRyeSBjb25zdHJ1Y3RvcgotCShwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IGhhc2ggdGFibGUgaW5pdGlhbGl6ZXIKLQkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IGhhc2ggdGFibGUgY29uc3RydWN0b3IKLQkocHBjX3JlY29yZF90b2NfZW50cnkpOiBjaGFuZ2VkIHJlZmVyZW5jZXMgdG8gaGFzaCB0YWJsZQotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogY2hhbmdlZCByZWZlcmVuY2VzIHRvIGhhc2ggdGFibGUKLQotCSogbGliY29mZi1pbi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IHJlbW92ZWQgdG9jX29mZnNldAotCSogbGliY29mZi5oOiBSZWJ1aWxkCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IHJlbW92ZWQgdG9jX29mZnNldCBpbml0Ci0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IHJlbW92ZWQgdG9jX29mZnNldCBpbml0Ci0KLVRodSBOb3YgIDkgMDQ6MDA6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguZGVwMSk6IE1ha2Ugc3VyZSB0aGUgZmlsZSBta2RlcCBpcyB0byB3cml0ZSBleGlzdHMKLQlmaXJzdC4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBuZXcgb3B0aW9uIC0td2l0aFtvdXRdLW1tYXAuICBTZXQgVVNFX01NQVAKLQlpZiBpdCBpcyBnaXZlbiBhbmQgbW1lcCBpcyBhdmFpbGFibGUuCi0JKiBhY2NvbmZpZy5oOiBVbmRlZiBVU0VfTU1BUC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KLQkqIGFvdXR4Lmg6IElmIFVTRV9NTUFQIGlzIG5vdCBkZWZpbmVkLCBkbyBhbGwgc3ltYm9sIGFuZCBzdHJpbmcKLQl0YWJsZSBoYW5kbGluZyB0aGUgb2xkIHdheS4KLQkoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERvbid0IGNvbXBsYWluIGlmIGxhc3QgYnl0ZSBvZiBzdHJpbmcKLQl0YWJsZSBpcyBub256ZXJvLgotCSogbGliYmZkLmMgW0hBVkVfTUFEVklTRV06IEluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN5cy9tbWFuLmguCi0JKGJmZF9mcmVlX3dpbmRvdykgWyEgVVNFX01NQVBdOiBEb24ndCBkZWZpbmUuCi0JKGJmZF9nZXRfZmlsZV93aW5kb3csCi0JX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykgWyEgVVNFX01NQVBdOiBBYm9ydC4KLQotV2VkIE5vdiAgOCAyMDowMzo0NCAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgotCi0JKiBjb2ZmLWEyOWsuYyAoU0lHTl9FWFRFTkRfSFdPUkQpOiBVc2UgfjB4ZmZmZiByYXRoZXIgdGhhbgotCTB4ZmZmZjAwMDAuCi0KLVdlZCBOb3YgIDggMTE6MzE6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IENoYW5nZSBoYW5kbGluZyBvZiBSX0lSRUwgcmVsb2MgdG8gYmUKLQljb21wYXRpYmxlIHdpdGggQU1EIGdlbmVyYXRlZCBDT0ZGIGZpbGVzLiAgVHJ5IHRvIHN1cHBvcnQgYm90aCBBTUQKLQlhbmQgR05VIGZvcm1hdHMgc2ltdWx0YW5lb3VzbHkuCi0JKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHdyaXRhYmxlIHBhcmFtZXRlciBmcm9tCi0JaW50IHRvIGJvb2xlYW47IHVwZGF0ZSBhbGwgY2FsbGVycy4gIFBhc3MgTUFQX1NIQVJFRCBpZiBub3QKLQl3cml0YWJsZS0taXQncyByZXF1aXJlZCBvbiBTb2xhcmlzLiAgQ2FzdCBmcHJpbnRmIGFyZ3VtZW50IHRvCi0JYXZvaWQgd2FybmluZy4KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaDogVXBkYXRlIGNhbGxzIHRvIGJmZF9nZXRfZmlsZV93aW5kb3cuCi0KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9ERUZfRFlOQU1JQyk6IFJlbmFtZSBmcm9tIFhDT0ZGX1JFRl9EWU5BTUlDLgotCUNoYW5nZSBhbGwgdXNlcy4KLQkoeGNvZmZfc3dhcF9sZGhkcl9pbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX3N3YXBfbGRzeW1faW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9maW5kX3JlbG9jKTogSGFuZGxlIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHJlbG9jIGNvcnJlY3RseS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IElmIHdlIGp1c3QgY3JlYXRlZCBhIGRlc2NyaXB0b3IsIHBhc3MgaXQKLQl0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCwgdG8gc2F2ZSBhIGhhc2ggbG9va3VwLgotCUhhbmRsZSBYVFlfRVIvWE1DX1hPIHN5bWJvbHMgY29ycmVjdGx5LgotCSh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZXdyaXRlIHRvIHJlYWQgLmxvYWRlciBzeW1ib2xzCi0JcmF0aGVyIHRoYW4gbm9ybWFsIHN5bWJvbCB0YWJsZS4KLQkoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBJdCdzIG5vdCBhbiBlcnJvciBpZiB0aGUgc3ltYm9sIGlzCi0JYWxyZWFkeSBkZWZpbmVkIHdpdGggdGhlIHNhbWUgYWJzb2x1dGUgdmFsdWUuCi0JKHhjb2ZmX21hcmspOiBXaGVuIGNvbnNpZGVyaW5nIGNhbGxlZCBzeW1ib2xzLCBjaGVjayB3aGV0aGVyIHRoZQotCWRlc2NyaXB0b3IgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCByYXRoZXIgdGhhbiB0aGUgc3ltYm9sCi0JaXRzZWxmLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQlDYXN0IHJlYWxsb2MgYW5kIG1hbGxvYyByZXR1cm4gdmFsdWVzLiAgSWYgbWFsbG9jIG9yIHJlYWxsb2MgZmFpbCwKLQlzZXQgYmZkX2Vycm9yX25vX21lbW9yeS4KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHR5cGUgdG8gYm9vbGVhbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVHVlIE5vdiAgNyAxMTo1Mzo0OCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF90b2NfZW50cnkpOiBuZXcgZnVuY3Rpb24uCi0JKGluX3JlbG9jX3ApOiBjaGFuZ2VkIHJldHVybiB2YWx1ZS4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IG11Y2ggcmV3b3JrLgotCShwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBuZXcgZnVuY3Rpb24uCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogbmV3IGZ1bmN0aW9uLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogbmV3IGZ1bmN0aW9uLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBpbml0aWFsaXplIHRvY19vZmZzZXQuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IGluaXRpYWxpemUgdG9jX29mZnNldC4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQWRkZWQgY29mZl9zd2FwX3N5bV9pbl9ob29rCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEFkZGVkIG1vcmUgc2VjdGlvbnMgdG8gdGhlIGRhdGEKLQlkaWN0aW9uYXJ5IGZvciB0aGUgcGUgZmlsZSBoZWFkZXIuIEFsc28gY2hhbmdlZCBsaW5rZXIgdmVyc2lvbgotCW51bWJlciBvbiB0aGUgcHBjIHNpZGUuCi0JKGRpcl9uYW1lcyk6IHNtYWxsIGltcHJvdmVtZW50cyB0byB0aGUgZGljdGlvbmFyeSBwcmludGluZy4KLQkocGVfbWtvYmplY3RfaG9vayk6IHNhdmUgdGhlIGZpbGUgbGV2ZWwgZmxhZ3MuCi0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiBhZGRlZCB0b2Nfb2Zmc2V0IGZpZWxkCi0JKHBlX3RkYXRhKTogYWRkZWQgcmVhbF9mbGFncyBmaWVsZAotCShjb2ZmX3RkYXRhKTogYWRkZWQgbG9jYWxfdG9jX3N5bV9tYXAgYW5kIGFjY2VzcyBtYWNybwotCi0JKiBsaWJjb2ZmLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgdG9jX29mZnNldCBmaWVsZAotCShwZV90ZGF0YSk6IGFkZGVkIHJlYWxfZmxhZ3MgZmllbGQKLQkoY29mZl90ZGF0YSk6IGFkZGVkIGxvY2FsX3RvY19zeW1fbWFwIGFuZCBhY2Nlc3MgbWFjcm8KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBhZGRlZCBob29rIGZvciBQRS4KLQkoY29mZl9ta29iamVjdCk6IGluaXQgZm9yIGxvY2FsX3RvY19zeW1fbWFwCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IHRoZSBpbnRlcm5hbF9hLm1hZ2ljIHRvCi0gICAgICAgIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyB3aGljaCBhcHBlYXJzIHRvIGJlIHdoYXQgb3RoZXIKLQlwcGMgY29tcGlsZXJzIHVzZS4KLQotVHVlIE5vdiAgNyAxMzo0ODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogS2VlcCBsb29raW5nIHRocm91Z2ggc3RhYnMKLQllbnRyaWVzIHVudGlsIGJvdGggdGhlIGxpbmUgbnVtYmVyIGFkZHJlc3MgYW5kIHRoZSBmdW5jdGlvbiBuYW1lCi0JYWRkcmVzcyBhcmUgdG9vIGxhcmdlLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfUFJPRyB0byBmaW5kIGFuZCBjYWNoZSBBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IERvbid0IGRlZmluZSBDQ19GT1JfQlVJTEQgaWYgaXQKLQlpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudC4KLQotVHVlIE5vdiAgNyAxMDo1NzoyNCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogRGVmaW5lIHRvIHVzZQotCWdlbmVyaWMgdmVyc2lvbi4KLQotTW9uIE5vdiAgNiAxNzoxMzoxNSAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+Ci0KLQkqIGNvZmYtaTg2MC5jOiBOZXcgZmlsZSwgYmFzZWQgb24gY29mZi1pMzg2LmMuCi0JKiBjcHUtaTg2MC5jOiBOZXcgZmlsZSwgYmFzZWQgb24gY3B1LWkzODYuYy4KLQkqIGhvc3RzL2k4NjBtYWNoMy5oOiBOZXcgZmlsZSwgYmFzZWQgb24gaG9zdHMvaTM4Nm1hY2gzLmguCi0JKiBjb25maWcuYmZkIChpODYwLSotbWFjaDMqLCBpODYwLSotb3NmMSosIGk4NjAtKi1jb2ZmKik6IE5ldwotCXRhcmdldHMsIHVzaW5nIGk4NjBjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoaTg2MC0qLW1hY2gzKiwgaTg2MC0qLW9zZjEqKTogTmV3IGhvc3RzLCB1c2luZwotCXRyYWQtY29yZS5vIGFuZCBob3N0cy9pODYwbWFjaDMuaC4KLQkoaTg2MGNvZmZfdmVjKTogVXNlIGNvZmYtaTg2MC5vIGFuZCBjb2ZmbGluay5vLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LWk4NjAuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1pODYwLm8uCi0JKENGSUxFUyk6IEFkZCBjcHUtaTg2MC5jIGFuZCBjb2ZmLWk4NjAuYy4KLQkqIHRhcmdldHMuYyAoaTg2MGNvZmZfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmk4NjBjb2ZmX3ZlYy4KLQkqIGFyY2h1cmVzLmMgKGJmZF9pODYwX2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCAmYmZkX2k4NjBfYXJjaC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogSGFuZGxlIEk4NjAgbWFnaWMgbnVtYmVyLgotCShjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfYXJjaF9pODYwLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBJODYwIGEub3V0IG1hZ2ljIG51bWJlci4KLQotTW9uIE5vdiAgNiAxNDozNDowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgb2YKLQl0aGUgY3JlYXRlZCAudGMgc2VjdGlvbiB0byAyLgotCSh4Y29mZl9tYXJrKTogRG9uJ3Qga2VlcCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgY2FsbCB0byBhbgotCXVuZGVmaW5lZCBzeW1ib2wgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGdlbmVyYXRlCi0JZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgYSBjYWxsIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLVN1biBOb3YgIDUgMjE6NDQ6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBSZWJ1aWxkIGxpc3QgZnJvbSBCRkRfTElCUywgQUxMX01BQ0hJTkVTLAotCUJGRDMyX0JBQ0tFTkRTLCBCRkQ2NF9CQUNLRU5EUy4KLQkoLmRlcDEpOiBQdXQgbWtkZXAgb3V0cHV0IGluIGEgc2VwYXJhdGUgZmlsZS4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCk6IENhc3QgX2JmZF9yZWFkX2FyX2hkciByZXR1cm4KLQl2YWx1ZS4KLQotCVBlcm1pdCB1c2Ugb2YgbW1hcCB3aGVuIGF2YWlsYWJsZToKLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgbW1hcCwgbWFkdmlzZSwgbXByb3RlY3QuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGxpYmJmZC5jIChzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwpOiBEZWZpbmUgdHlwZS4KLQkoYmZkX2luaXRfd2luZG93LCBiZmRfZnJlZV93aW5kb3csIGJmZF9nZXRfZmlsZV93aW5kb3cpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKG9rX3RvX21hcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUgZm9yIGRlYnVnZ2luZy4KLQkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfd2luZG93X2ludGVybmFsKTogRGVjbGFyZSB0eXBlLgotCShiZmRfd2luZG93KTogRGVmaW5lIHR5cGUuCi0JKGJmZF9pbml0X3dpbmRvdywgYmZkX2ZyZWVfd2luZG93LCBiZmRfZ2V0X2ZpbGVfd2luZG93KTogRGVjbGFyZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KToKLQlEZWNsYXJlLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCB0d28gd2luZG93IGZpZWxkcy4KLQkob2JqX2FvdXRfc3ltX3dpbmRvdywgb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyk6IE5ldyBtYWNyb3MuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBJbml0aWFsaXplIHdpbmRvd3MuCi0JKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBHZXQgc3ltYm9sIGRhdGEgYW5kIHN0cmluZ3MgaW4KLQl3aW5kb3dzIGluc3RlYWQgb2YgZXhwbGljaXRseSBhbGxvY2F0ZWQgYnVmZmVycy4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogRnJlZSB3aW5kb3cgaW5zdGVhZCBvZiBtZW1vcnkuCi0JKGJmZF9mcmVlX2NhY2hlZF9pbmZvKTogUmVsZWFzZSB3aW5kb3dzIGluc3RlYWQgb2YgZnJlZWluZyBzdG9yYWdlCi0JZGlyZWN0bHkuCi0JKGFvdXRfbGlua19mcmVlX3N5bWJvbHMpOiBEaXR0by4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIG5ldyBmaWVsZCBmb3IKLQlnZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cuCi0JKEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMpOiBVcGRhdGVkLgotCSogYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBiaW5hcnkuYywgYm91dC5jLCBjb2ZmLWFscGhhLmMsCi0JY29mZi1taXBzLmMsIGVsZnh4LXRhcmdldC5oLCBpMzg2bXNkb3MuYywgaTM4Nm9zOWsuYywgaWVlZS5jLAotCWxpYmNvZmYtaW4uaCwgb2FzeXMuYywgc3JlYy5jLCB0ZWtoZXguYywgdmVyc2Fkb3MuYzogQWRkZWQgbmV3Ci0JbWFjcm9zIGZvciBnZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgZmllbGQuCi0KLVNhdCBOb3YgIDQgMTI6MjM6MjYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvcmUuYzogUmVuYW1lZCB0byBjb3JlZmlsZS5jCi0JKiBtYWtlZmlsZS5kb3MgKE9CSlMpOiBDaGFuZ2UgY29yZS5vIHRvIGNvcmVmaWxlLm8KLQkqIE1ha2VmaWxlLmluIChDRklMRVMsIEJGRF9MSUJTKTogVXNlIGNvcmVmaWxlLmMgaW5zdGVhZCBvZiBjb3JlLmMKLQotRnJpIE5vdiAgMyAxNTo1NDo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlIHN1YgotCXRvIG8uICBDbG9iYmVyIGFuZCByZXN0b3JlIHRoZSBsaXN0IG9mIG5ldyBjc2VjdHMgYXJvdW5kIHRoZSBjYWxsCi0JdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wsIGluIGNhc2UgaXQgd2FudHMgdG8gcmVwb3J0IGEKLQlsaW5rZXIgZXJyb3IgYW5kIHRoZSBsaW5rZXIgd2FudHMgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgUmVzZXQKLQl0aGUgbGluZSBudW1iZXIgY291bnQgb2YgYSByZWFsIHNlY3Rpb24gZXZlbiBpZiBpdCBoYXMgbm8gcmVsb2NzLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogSWYgc2hhcmVkLCBzZXQgdGhlIERZTkFNSUMgZmxhZy4KLQotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBXYXJuIGlmIHRoZSBzdHJpbmcgc2l6ZQotCWlzIHRvbyBzbWFsbC4KLQotVGh1IE5vdiAgMiAyMzoxNjozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3Qgd2FybiBhYm91dAotCWFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYSBzaGFyZWQgbGluay4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQ29ycmVjdCB0eXBlIG9mCi0Jb2xkdHlwZSBmcm9tIGJmZF9saW5rX29yZGVyX3R5cGUgdG8gYmZkX2xpbmtfaGFzaF90eXBlLiAgRnJvbQotCXBoZG1AaW5mby51Y2wuYWMuYmUgKFBoaWxpcHBlIERlIE11eXRlcikuCi0KLVdlZCBOb3YgIDEgMTQ6MjY6MDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChydHlwZTJob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKFJUWVBFMkhPV1RPKTogVXNlIGl0IHJhdGhlciB0aGFuIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgaW50ZXJuYWxfYS5tYWdpYwotCXRvIFBBR0VNQUdJQ1BFWEVDUEFHRUQgI2lmIGRlZmluZWQgKE02OCkgJiYgIWRlZmluZWQgKExZTlhPUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogbTY4Ki1tb3Rvcm9sYS1zeXN2KiBkb2VzIG5vdCB1c2UgcHRyYWNlLWNvcmUubzsKLQlkZWZpbmUgVFJBRF9IRUFERVIgdG8gbmV3IGZpbGUgaG9zdHMvZGVsdGE2OC5oLgotCW04OCotbW90b3JvbGEtc3lzdiosIGhvd2V2ZXIsIGRvZXMgdXNlIHB0cmFjZS1jb3JlLm8uCi0JKiBob3N0cy9kZWx0YTY4Lmg6IE5ldyBmaWxlLgotCi0JKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCk6IGNoYW5nZSBiZmRfem1hbGxvYyB0bwotCWJmZF96YWxsb2M7IHByb3ZpZGUgcHJvcGVyIHBhcm0gYWJmZCB0byBjYWxscyB0byBiZmRfemFsbG9jLgotCi1XZWQgTm92ICAxIDEzOjUxOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2bGludXguYyAoTVkodmVjKSk6IERlY2xhcmUgYmVmb3JlIHVzZS4KLQotV2VkIE5vdiAgMSAxMTo0NTowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCVBhc3MgaW5wdXRfYmZkLCBub3QgaW5fYmZkLCB0byBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUKLQlCRkQgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlLgotCShiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCk6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9YVkVDUCk6IERlZmluZS4KLQkoYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBCRkQgaXMgbm90Ci0Jb2YgdGhlIHJpZ2h0IHR5cGUuCi0JKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogT25seSBjaGVjayB0aGUgcmVsb2Mgc3ltYm9sCi0JdGFibGUgaW5kZXggYWdhaW5zdCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm9yIGEgYmFzZSByZWxhdGl2ZQotCXJlbG9jLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzKTogQ2hhbmdlIGZyb20gbWFjcm8gdG8KLQlzdGF0aWMgZnVuY3Rpb24uCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFNldAotCWZ1bGxfYW91dGhkciBmbGFnIGhlcmUuLi4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IC4uLm5vdCBoZXJlLgotCi1UdWUgT2N0IDMxIDEyOjUyOjAyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaDogIFJlbmFtZSB0byBlbGYtYmZkLmggdG8gYXZvaWQgY29uZmxpY3Qgd2l0aAotCXN5c3RlbXMgdGhhdCBoYXZlIGEgc3lzdGVtIDxsaWJlbGYuaD4uCi0JKiBNYWtlZmlsZS5pbjogR2xvYmFsbHkgcmVwbGFjZSBsaWJlbGYuaCB3aXRoIGVsZi1iZmQuaC4KLQkqIGJmZC5jLCBlbGYuYywgZWxmMzItYXJjLmMsIGVsZjMyLWdlbi5jLCBlbGYzMi1ocHBhLmMsCi0JZWxmMzItaHBwYS5oLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywgZWxmMzItbTY4ay5jLAotCWVsZjMyLW04OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1wcGMuYywgZWxmMzItc3BhcmMuYywKLQllbGY2NC1nZW4uYywgZWxmNjQtc3BhcmMuYywgZWxmY29kZS5oLCBlbGZsaW5rLmMsCi0JZWxmeHgtdGFyZ2V0Lmg6IEluY2x1ZGUgZWxmLWJmZC5oIHJhdGhlciB0aGFuIGxpYmVsZi5oLgotCSogZWxmeHgtdGFyZ2V0Lmg6IENoYW5nZSBsaWJlbGYuaCByZWZlcmVuY2UgdG8gZWxmLWJmZC5oLgotCi1UdWUgT2N0IDMxIDE1OjMwOjA3IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEFkZCBuZXcgcGFyYW1ldGVyIHdlYWsuICBJZgotCXNldCwgc2V0IEJTRl9XRUFLIGluIHN5bWJvbC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfZ2V0X2V4dHIpOiBTZXQgd2Vha2V4dCBiYXNlZCBvbiBCU0ZfV0VBSy4KLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogSWYgd2Vha2V4dCBpcyBzZXQsIHBhc3MgQlNGX1dFQUsgdG8KLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlcik6IENoZWNrIHRoYXQgdGhlIHNlY3Rpb24gdGRhdGEgcmVsb2NzCi0JYXJlIG5vdCBOVUxMIGJlZm9yZSB1c2luZyB0aGVtLgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLWxpbnV4Kik6IFNldCBDT1JFRklMRSB0byB0cmFkLWNvcmUubyBhbmQKLQlkZWZpbmUgVFJBRF9IRUFERVIgYXMgaG9zdHMvYWxwaGFsaW51eC5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogaG9zdHMvYWxwaGFsaW51eC5oOiBOZXcgZmlsZS4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDYXN0IHUudV9hcjAgdG8gYmZkX3ZtYSwKLQlub3QgaW50LgotCi1UdWUgT2N0IDMxIDEyOjM0OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBY2NlcHQgQ19CQ09NTSBhbmQKLQlDX0VDT01NIHN0b3JhZ2UgY2xhc3Nlcy4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmtfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIHhjb2ZmX21hcmsuCi0JKHhjb2ZmX21hcmspOiBDYWxsIHhjb2ZmX21hcmtfc3ltYm9sLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IENhbGwgeGNvZmZfbWFya19zeW1ib2wuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogQ2FsbCB4Y29mZl9tYXJrX3N5bWJvbCByYXRoZXIgdGhhbgotCWRvaW5nIGl0IGJ5IGhhbmQuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IEJ1aWxkIGEgLmxvYWRlciBzeW1ib2wgZm9yIGFuIGV4cG9ydCBzeW1ib2wuCi0KLU1vbiBPY3QgMzAgMTQ6NTM6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBuZXcgbGluZV9maWxlcG9zCi0JZmllbGQuCi0JKHhjb2ZmX2ZpbmRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogVXNlIGl0LgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogU2V0IGZpbmZvLmxpbmVfZmlsZXBvcy4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgQ19CSU5DTCBhbmQgQ19FSU5DTC4gIERvbid0Ci0JcmVsb2NhdGUgdGhlIHZhbHVlIG9mIENfREVDTC4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogUmVtb3ZlIGJvZ3VzIEJGRF9BU1NFUlQuCi0KLVNhdCBPY3QgMjggMDE6MjU6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UKLQljYWxsYmFjayBkZWNpZGUgd2hhdCBnb2VzIGluIC5yZWxvY3MuCi0JKiBwZVtpXS1pMzg2LmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogRGVmaW5lLgotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogT25seSBjb3B5IGFvdXRoZHIgaWYKLQl0aGVyZSBpcyBvbmUuCi0KLVNhdCBPY3QgMjggMDE6NTE6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IEhhbmRsZSBjc2VjdHMgaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4KLQotRnJpIE9jdCAyNyAxODoxNDozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jOiBNb3JlIGltcHJvdmVtZW50cywgbW9zdGx5IHRvIGZpeCBoYW5kbGluZyBvZgotCWNvbnN0cnVjdG9ycyBhbmQgYSBmZXcgb3RoZXIgc3BlY2lhbCBjYXNlcy4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgYmFjayB0bwotCXplcm8sIHJldmVydGluZyB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgT2N0IDI3IDE0OjQyOjE1IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIFBPUlRJTkcsIGFvdXQtYXJtLmMsIGFvdXQtZW5jYXAuYywgYW91dC10YXJnZXQuaCwKLQlhb3V0eC5oLCBnZW4tYW91dC5jLCBob3N0LWFvdXQuYywgaHAzMDBic2QuYywgaTM4NmFvdXQuYwotCWkzODZic2QuYywgaTM4NmR5bml4LmMsIGkzODZsaW51eC5jLCBpMzg2bHlueC5jLCBpMzg2bWFjaDMuYywKLQlpMzg2bmV0YnNkLmMsIG02OGtseW54LmMsIG04OGttYWNoMy5jLCBtaXBzYnNkLmMsIG5ld3NvczMuYywKLQluczMya25ldGJzZC5jLCBwYzUzMi1tYWNoLmMsIHJpc2NpeC5jLCBzcGFyY2x5bnguYywgc3BhcmNuZXRic2QuYzoKLQlDaGFuZ2UgUEFHRV9TSVpFIHRvIFRBUkdFVF9QQUdFX1NJWkUuCi0KLQkqIG02OGtuZXRic2QuYzogRGl0dG8gYXMgd2VsbCBhcyBhZGQgc3VwcG9ydCBmb3IgdGhlIG02OGs0ayBvYmplY3QKLQlmb3JtYXQuCi0KLQkqIG5ldGJzZC5oOiBEb3VibGUgZGl0dG8gKGluY2wuIG02OGs0ayBzdXBwb3J0KS4gIE5ldEJTRCdzIHRleHQKLQlzZWdtZW50cyBpbmNsdWRlcyB0aGUgYS5vdXQgaGVhZGVyLiAgU2VlIHRvIHRoYXQgdGhlIG1hZ2ljIG51bWJlcgotCSphbHdheXMqIGlzIGJpZy1lbmRpYW4uCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtNjgqLWhwKi1uZXRic2QqIGNhc2UuICBDcm9zcy1wb2xsaW5hdGUgbTY4ayBhbmQKLQltNjhrNGsgTmV0QlNEIGNvbmZpZ3VyYXRpb25zLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogU2VwYXJhdGUgaTM4NiAmIG1pcHMgTmV0QlNECi0JY29uZmlndXJhdGlvbnMgZnJvbSBvdGhlciBCU0Qgb25lcy4gIERvbid0IGFzc3VtZSBERUMgaXMgdGhlIG9ubHkKLQl0aGluZyBOZXRCU0QvbWlwcyBydW4gb24uICBBZGQge202OGssbnMzMmssc3BhcmN9LSotbmV0YnNkKgotCWNvbmZpZ3VyYXRpb25zLiAgQWRkIHN1cHBvcnQgZm9yIG02OGs0ayBOZXRCU0Qgb2JqZWN0IGZvcm1hdC4KLQotCSogbGliYW91dC5oOiBBZGRlZCBNXzY4SzRLX05FVEJTRCBtYWdpYy4KLQotCSogbTY4azRrbmV0YnNkLmM6IE5ldyBmaWxlLgotCi0JKiBob3N0cy97bTY4ayxzcGFyY31uYnNkLmg6IERvbid0IGRlZmluZSBIT1NUX0JJR19FTkRJQU5fUC4KLQotCSogaG9zdHMvbmJzZC5oOiBEZWZpbmUgSE9TVF9CSUdfRU5ESUFOX1AgYWNjb3JkaW5nIHRvCi0JPG1hY2hpbmUvZW5kaWFuLmg+LgotCi0JKiBob3N0cy9taXBzbmJzZC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyNiAxNDoxNjo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGdldCBjbG9zZXIgdG8gYSB3b3JraW5nIFhDT0ZGCi0JbGlua2VyLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgZnVsbF9hb3V0aGRyLAotCXRvY19zZWN0aW9uLCBhbmQgZW50cnlfc2VjdGlvbiBmaWVsZHMuCi0JKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogUmVtb3ZlIGxkcmVsX2NvdW50IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBuZXcgeGNvZmZfZGF0YQotCWZpZWxkcy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBSUzYwMDBDT0ZGX0MsIGdlbmVyYXRlCi0JZnVsbCBhLm91dCBoZWFkZXIgaWYgZnVsbF9hb3V0aGRyIGlzIHNldCBpbiB4Y29mZl9kYXRhLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgU2V0IG9fc25lbnRyeSBhbmQgb19zbnRvYwotCWJhc2VkIG9uIHNlY3Rpb25zIHN0b3JlZCBpbiB4Y29mZl9kYXRhLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBuZXcgeGNvZmZfZGF0YQotCWZpZWxkcy4KLQkoeGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCi0JKHJzNjAwMGNvZmZfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgdG8gJy4nLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9zeW1ib2xfaW5mbyk6IElmIGZpeF92YWx1ZSBpcyBzZXQsIGZpeCB0aGUKLQl2YWx1ZSBzdG9yZWQgaW4gcmV0IHJhdGhlciB0aGFuIHJldHVybmluZyBhIHBvaW50ZXIgdmFsdWUuCi0KLVdlZCBPY3QgMjUgMjM6MTA6MzkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0te2VsZixzeXN2NCxlYWJpLHNvbGFyaXMyfSk6IFJlbW92ZSBNQUMKLQlmb3JtYXQgZm9yIG5vdy4KLQotV2VkIE9jdCAyNSAxNjoxOToyNyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogQWxsb2NhdGUgdGhlIHN0cmluZ3Mgd2l0aCBtYWxsb2MKLQlzaW5jZSB0aGV5J3JlIGZyZWUnZCBieSBmcmVlX2NhY2hlZF9pbmZvLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2ltaWxhcmx5IGZvciB0aGUgc3ltYm9sIHRhYmxlLgotCi1XZWQgT2N0IDI1IDE0OjU5OjIyIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIERvbid0IG1ha2UgaGVhZGVycy4KLQotV2VkIE9jdCAyNSAxMTozMjo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogc3Vub3MuYyAoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEb24ndCBkbyBhbnl0aGluZyBpZgotCW91dHB1dF9iZmQgaXMgbm90IFN1bk9TLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuICBEb24ndCBzY2FuIHJlbG9jcyBvZgotCW5vbi1TdW5PUyBpbnB1dCBmaWxlcy4KLQotCSogeGNvZmZsaW5rLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHN1cHBvcnQgbGlua2luZyBzaGFyZWQgb2JqZWN0cwotCWFuZCBnZW5lcmF0aW5nIGEgLmxvYWRlciBzZWN0aW9uLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgaW1wb3J0X2ZpbGVfaWQgZmllbGQuCi0JKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIGxpbmVub19jb3VudCwgZmlyc3Rfc3ltbmR4LAotCWxhc3Rfc3ltbmR4LCBhbmQgbGRyZWxfY291bnQgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfaG93dG9fdGFibGUpOiBDb3JyZWN0IHJlbG9jIG5hbWVzLgotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBEb24ndCBzZXQgYW55IGZsYWdzIGlmIFNUWVBfUEFECi0JaXMgc2V0LgotCSogYmZkLWluLmggKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVHVlIE9jdCAyNCAxNzo0NDoyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHhjb2ZmbGluay5vIHRvIHBtYWNfeGNvZmZfdmVjLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbXB3LWNvbmZpZy5pbjogQWRkIHhjb2ZmbGluay5jLm8gdG8gcG93ZXJwYy1hcHBsZS1tYWNvcy4KLQkqIGNvZmYtcG1hYy5jOiBJbmNsdWRlIGNvZmYtcnM2MDAwLmMgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdHMKLQljb250ZW50cy4KLQkocG1hY194Y29mZl92ZWMpOiBVcGRhdGUgdG8gdXNlIG5ldyB4Y29mZiBzdXBwb3J0LgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTWFrZSBzdGF0aWMuCi0JKHhjb2ZmX3dyaXRlX2FybWFwKTogRGVjbGFyZSBidWYgYXMgdW5zaWduZWQgY2hhci4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZSBhIGxvY2FsIGFzIFBUUi4KLQotCSogbXB3LW1ha2Uuc2VkOiBHZW5lcmFsaXplIHN1YmRpcl9kbyBlZGl0LgotCi1UdWUgT2N0IDI0IDEwOjI1OjAxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYWJzZC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogSW5pdGlhbGl6ZSBhc2VjdC0+ZmlsZXBvcwotCWNvcnJlY3RseS4gIERvbid0IGluaXRpYWxpemUgYXNlY3QtPnZtYS4KLQotRnJpIE9jdCAyMCAxMzoyMzo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCk6IElmIF9iZmRfY2h1bmtzaXplIHdhc24ndCBwcmVzZXQsIHVzZQotCXNvbWV0aGluZyBhIGxpdHRsZSBsZXNzIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4KLQotVGh1IE9jdCAxOSAxMzowNjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCk6IENsZWFyICphZGp1c3RlZHAuCi0KLVdlZCBPY3QgMTggMTY6MjA6MDggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgLmJzcyBpcyBiZWZvcmUKLQkuZGF0YSB1cyB0aGF0IGFzIGRhdGFfc3RhcnQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogR2V0IHJlbG9jCi0JY2FsYyBjb3JyZWN0LgotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IFVzZSBfY29va2VkX3NpemUgb2YgZGF0YSBkaXJlY3RvcnkuCi0JKGNvZmZfc3dhcF9vdXRoZHJfb3V0KTogSGFyZHdpcmUgaW4gdmVyc2lvbiBudW1iZXIuCi0KLVdlZCBPY3QgMTggMTY6NTA6NTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGVzCi0JbWFqb3IgYW5kIG1pbm9yIHRvICpfdm5vLCBzaW5jZSB0aGUgZm9ybWVyIGFyZSBhbHNvIG1hY3JvcyBpbgotCVN1bk9TIGhlYWRlciBmaWxlcy4gIENhc3QgcmVzdWx0IG9mIGJmZF9hbGxvYyB0byBhcHByb3ByaWF0ZQotCXR5cGUuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IENhc3QgdXNlZF9ieV9iZmQgdmFsdWUKLQliZWZvcmUgYXNzaWduaW5nIHRvIHNlY19kYXRhLgotCi1XZWQgT2N0IDE4IDEzOjI1OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFRoZSBvZmZzZXQgYXJndW1lbnQgaXMKLQlub3cgcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24sIG5vdCBhYnNvbHV0ZS4KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogVXNlIHRoZSByaWdodCBzeW1ib2wgdG8KLQlnZXQgdGhlIGZpbGUgbmFtZSB3aGVuIHRoZXJlIGlzIGEgTl9TTyBkaXJlY3RvcnkgbmFtZS4gIFdoZW4KLQloYW5kbGluZyBzdGFicywgcmVtZW1iZXIgdGhhdCBzZWN0aW9uLT52bWEgd2FzIGFkZGVkIHRvIHRoZQotCW9mZnNldC4KLQotVHVlIE9jdCAxNyAxODoyNDo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgbmVlZGVkIGZpZWxkLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogQ2FsbCBiZmRfcmVsZWFzZSwgbm90IGZyZWUuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5lZWRlZCBmaWVsZC4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFJlY29yZCBuZWVkZWQgb2JqZWN0cy4KLQkoYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIE9jdCAxNiAxNDo0Mzo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZS5pbl9yZWxvY19wKTogTmV3LgotCi1Nb24gT2N0IDE2IDEwOjUyOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCk6IFJlbmFtZSBmcm9tCi0JYmZkX2VsZl9saW5rX25lZWRlZF9saXN0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmLmMsIGVsZmxpbmsuaCwgbGliZWxmLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotCUFkZCBzdGFydCBhdCBBSVggbGlua2VyIHN1cHBvcnQ7IG5vIHNoYXJlZCBsaWJyYXJpZXMgeWV0LgotCSogeGNvZmZsaW5rLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChyczYwMGNvZmZfdmVjKTogVXNlIHhjb2ZmbGluay5vLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgY3NlY3RzIGFuZCBkZWJ1Z19pbmRpY2VzCi0JZmllbGRzLgotCShzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZS4KLQkoeGNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG1hY3JvLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtcnM2MDAwLmM6IENsZWFuIHVwIGEgYml0LgotCSh4Y29mZl9ta29iamVjdCk6IERlZmF1bHQgbW9kdHlwZSB0byAxTCwgbm90IFJFLiAgSW5pdGlhbGl6ZQotCWNwdXR5cGUsIGNzZWN0cywgYW5kIGRlYnVnX2luZGljZXMuCi0JKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgY3B1dHlwZS4KLQkoeGNvZmZfaG93dG9fdGFibGUpOiBSZW5hbWUgZnJvbSByczYwMDBjb2ZmX2hvd3RvX3RhYmxlLgotCSh4Y29mZl9ydHlwZTJob3d0byk6IFJlbmFtZSBmcm9tIHJzNjAwMGNvZmZfcnR5cGUyaG93dG8uCi0JKHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KLQlyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkoX2JmZF94Y29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uKTogRGVmaW5lLgotCShyczYwMDBjb2ZmX3ZlYyk6IEZvciBCRkRfSlVNUF9UQUJMRV9MSU5LLCB1c2UgX2JmZF94Y29mZiwgbm90Ci0JY29mZi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgQUlYLAotCWluY3JlbWVudCBzb2ZhciBieSBTTUFMTF9BT1VUU1ogaWYgbm90IGV4ZWN1dGFibGUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQUlYLCBhbHdheXMgb3V0cHV0IGFuIGEub3V0Ci0JaGVhZGVyOyBpZiBub3QgZXhlY3V0YWJsZSwgaGVhZGVyIHNpemUgb2YgU01BTExfQU9VVFNaLgotCSogaGFzaC5jIChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoKTogQWRkIHhjb2ZmIGZpZWxkLgotCShfYmZkX3N0cmluZ3RhYl9pbml0KTogSW5pdGlhbGl6ZSB4Y29mZiBmaWVsZC4KLQkoX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9zdHJpbmd0YWJfYWRkKTogSW4gWENPRkYgbW9kZSwgbGVhdmUgdHdvIGJ5dGVzIGZvciBsZW5ndGguCi0JKF9iZmRfc3RyaW5ndGFiX2VtaXQpOiBJbiBYQ09GRiBtb2RlLCB3cml0ZSBvdXQgbGVuZ3RoLgotCSogbGliYmZkLWluLmggKF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHhjb2ZmbGluay5vLgotCShDRklMRVMpOiBBZGQgeGNvZmZsaW5rLmMuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBTZXQgU0VDX0FMTE9DLCBub3QKLQlTRUNfTk9fRkxBR1MsIGZvciAuYWNvbW1vbiBzZWN0aW9uLiAgRnJvbSBQZXRlciBTY2hhdWVyCi0JPFBldGVyLlNjaGF1ZXJAUmVnZW50LkUtVGVjaG5pay5UVS1NdWVuY2hlbi5ERT4uCi0KLVNhdCBPY3QgMTQgMjE6MzY6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChpbl9yZWxvY19wKTogQWRkLCBjbG9uZSBmcm9tIGNvZmYtaTM4Ni5jLgotCi1GcmkgT2N0IDEzIDE3OjQ4OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBhY2NvbmZpZy5oIChIQVZFX1NZU19QUk9DRlNfSCk6IFVuZGVmLCB3aXRoIGNvbW1lbnQuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCi0JKiBvcG5jbHMuYyAoZ2V0cGFnZXNpemUpIFshSEFWRV9HRVRQQUdFU0laRV06IERlZmluZSBhcyAyMDQ4LgotCShfYmZkX2NodW5rc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkoX2JmZF9uZXdfYmZkKTogU2V0IGl0IHRvIGdldHBhZ2VzaXplKCkgaWYgbmVnYXRpdmUsIGFuZCB1c2UgaXQKLQlmb3Igb2JzdGFjayBjaHVuayBzaXplLgotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgZ2V0cGFnZXNpemUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdHJhZC1jb3JlLmMgKHJhd3B0cik6IE1ha2UgaXQgYSBsb2NhbCB2YXJpYWJsZSBvZgotIAlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcC4KLQotRnJpIE9jdCAxMyAxMToyMjowMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogTmV3LgotCSogY29mZi1pMzg2LmMgKGluX3JlbG9jX3ApOiBOZXcuCi0JKiBjb2ZmY29kZS5oOiBBbGx3YXlzIGluY2x1ZGUgcGVpY29kZS5oIGlmIENPRkZfV0lUSF9QRS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbmx5IHNldCBoYXNfcmVsb2Nfc2VjdGlvbgotCWlmIFBFX0lNQUdFLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwKLQlpbl9yZWxvY19wIHRvIGRlY2lkZSBpZiByZWxvYyBzaG91bGQgYmUgZW1pdHRlZC4KLQkqIGxpYmNvZmYuaCAocGVfZGF0YV90eXBlLmluX3JlbG9jX3ApOiBOZXcuCi0JKiBwZWljb2RlLmggKHBlX21rb2JqZWN0KTogSW5pdGlhbGl6ZSBpbl9yZWxvY19wLgotCi1XZWQgT2N0IDExIDAwOjQ5OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTW92ZSB0byBjb2ZmZ2VuLmMuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBDb3B5IGZyb20gY29mZmdlbi5jLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBMaWtld2lzZS4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDb3JyZWN0IGNvbmRpdGlvbnMKLQl1bmRlciB3aGljaCB0eXBlIGFuZCBzaXplIGNoYW5nZSB3YXJuaW5ncyBhcmUgaXNzdWVkLgotCi1UdWUgT2N0IDEwIDE4OjMyOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKTogRG9uJ3QgY291bnQgbGluZSBudW1iZXJzIGZvcgotCWEgc3ltYm9sIHdoaWNoIGlzIG5vdCBpbiBhIHJlYWwgc2VjdGlvbi4KLQkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFJlbmFtZSBmcm9tCi0JY29mZl9saW5rX2hhc2hfbmV3ZnVuYyBhbmQgbWFrZSBub24tc3RhdGljLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UgaXQuCi0JKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBNYWtlIHN0YXRpYy4KLQkqIGxpYmNvZmYtaW4uaCAoKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IElmIFJTNjAwMENPRkZfQywgc2V0IGNwdXR5cGUKLQlmaWVsZCBpbiBYQ09GRiB0ZGF0YS4KLQkoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBDaGVjayBpZmRlZiBSUzYwMDBDT0ZGX0MsIG5vdCBpZmRlZgotCVU4MDJST01BR0lDLCBmb3IgY2xhcml0eS4gIFRyeSB0byBzZXQgYXJjaCBhbmQgbWFjaGluZSBjb3JyZWN0bHkKLQliYXNlZCBvbiBjcHV0eXBlIHN0b3JlZCBpbiBhLm91dCBoZWFkZXIsIG9yIGluIG5fdHlwZSBvZiBpbml0aWFsCi0JLmZpbGUgc3ltYm9sLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBjcHV0eXBlIGNvcnJlY3RseSBpbiBhLm91dAotCWhlYWRlci4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgY2FzdHMgdG8gZmlsZV9wdHIgdG8gYXZvaWQKLQl3YXJuaW5ncy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogU3dhcCBpbiBjcHV0eXBlIGZpZWxkLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBTd2FwIG91dCBjcHV0eXBlIGZpZWxkLiAgRG9uJ3QgY2xlYXIKLQlvbGQgcmVzdjEgZmllbGQuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBjcHV0eXBlIGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjcHUtcnM2MDAwLmMgKHJzNjAwMF9jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX3JzNjAwMF9hcmNoKTogVXNlIGl0LgotCSogY3B1LXBvd2VycGMuYyAocG93ZXJwY19jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IERlZmluZSB2YXJpb3VzIGZsYXZvdXJzIG9mIFBvd2VyUEMuCi0JKGJmZF9wb3dlcnBjX2FyY2gpOiBVc2UgcG93ZXJwY19jb21wYXRpYmxlLiAgUG9pbnQgYXQKLQlhcmNoX2luZm9fc3RydWN0LgotCi1UdWUgT2N0IDEwIDEwOjUwOjQ2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBSZW1vdmUgQklTT04uCi0KLVR1ZSBPY3QgMTAgMDE6Mjg6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHdhcm4gYWJvdXQKLQljaGFuZ2luZyB0aGUgc2l6ZSBvciB0eXBlIGlmIHRoZSBvbGQgZGVmaW5pdGlvbiB3YXMgd2Vhay4KLQotTW9uIE9jdCAgOSAxMToyNDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvbWJpbmVkX2VudHJ5X3R5cGUpOiBBZGQgZml4X2xpbmUgZmllbGQuCi0JKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IFdhcm4gaWYgd2UgdHJ5IHRvIHNldCB0aGUgbGluZW5vIGZpZWxkIG9mCi0JYSBzeW1ib2wgdHdpY2UuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUgQ19CSU5DTCBhbmQKLQlDX0VJTkNMIGJ5IHNldHRpbmcgZml4X2xpbmUuICBGaXggQ19CU1RBVCBzeW1ib2wgdmFsdWUuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfbWFuZ2xlX3N5bWJvbHMpOiBIYW5kbGUgZml4X2xpbmUuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogT25seSB1c2UgTl9ERUJVRyBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZQotCWFic29sdXRlIHNlY3Rpb24uCi0JKGNvZmZfcHJpbnRfc3ltYm9sKTogUHJpbnQgZml4X3ZhbHVlIHN5bWJvbHMgaW4gYSB1c2VmdWwgZmFzaGlvbi4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBEZWZpbmUuCi0JKHhjb2ZmX2RhdGEpOiBEZWZpbmUuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgeGNvZmZfb2JqX2RhdGEgZmllbGQgdG8gdGRhdGEgdW5pb24uCi0JKiBiZmQtaW4yLmgsIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX21rb2JqZWN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9ta29iamVjdCk6IERlZmluZS4KLQkoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCShyczYwMDBjb2ZmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfVE9DIGNvbXBsYWluX29uX292ZXJmbG93IGZyb20KLQlzaWduZWQgdG8gYml0ZmllbGQuCi0JKHJzNjAwMGNvZmZfdmVjKTogQWRkIERZTkFNSUMgdG8gb2JqZWN0X2ZsYWdzLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSAucGFkIGFuZAotCS5sb2FkZXIgc2VjdGlvbnMgc3BlY2lhbGx5LgotCShjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBJZiBSUzYwMDBDT0ZGX0MsIGdldCB0aGUgLnRleHQgYW5kIC5kYXRhCi0Jc2VjdGlvbiBhbGlnbm1lbnQgZnJvbSB0aGUgWENPRkYgdGRhdGEgaW5mb3JtYXRpb24uCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IElmIFJTNjAwMENPRkZfQywgc2V0IERZTkFNSUMgYmFzZWQgb24KLQlGX1NIUk9CSiwgYW5kIGNvcHkgdGhlIGV4dHJhIGEub3V0IGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZQotCVhDT0ZGIHRkYXRhIHN0cnVjdHVyZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBSUzYwMDBDT0ZGX0MsIHNldCBGX1NIUk9CSiwKLQlGX0RZTkxPQUQgYW5kIHRoZSBleHRyYSBhLm91dCBoZWFkZXIgaW5mb3JtYXRpb24uCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9OT1RfQVRfRU5EIGZvciBhIENfRVhUIG9yCi0JQ19ISURFWFQgc3ltYm9sIHdpdGggYXR0YWNoZWQgY3NlY3QgaW5mb3JtYXRpb24uCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IElmIFJTNjAwMENPRkZfQywgc3dhcAotCWluIHRoZSBvX21heGRhdGEgZmllbGQuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IElmIFJTNjAwMENPRkZfQywgc3dhcCBleHRyYSBYQ09GRiBmaWVsZHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IERvbid0IG1vdmUgYW55IHN5bWJvbCB0byB0aGUKLQllbmQgaWYgQlNGX05PVF9BVF9FTkQgaXMgc2V0LgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW5hbWUgX2JmZF9yZWFkX2FyX2hkciBmaWVsZCB0bwotCV9iZmRfcmVhZF9hcl9oZHJfZm4uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9yZWFkX2FyX2hkcik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKTogQ2FzdCBfYmZkX3JlYWRfYXJfaGRyCi0JcmV0dXJuIHZhbHVlLgotCShkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApOiBMaWtld2lzZS4KLQkoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IExpa2V3aXNlLgotCShfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBMaWtld2lzZS4KLQotRnJpIE9jdCAgNiAxNjoxODozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2dldF9uZXh0X21hcGVudCk6IFJldHVybiBCRkRfTk9fTU9SRV9TWU1CT0xTCi0Jd2hlbiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5LgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHJlc2VydmUKLQlzcGFjZSBmb3Igc2VjdGlvbiBzeW1ib2xzLCBzaW5jZSB3ZSBkb24ndCBvdXRwdXQgdGhlbSBlaXRoZXIuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogUmVtb3ZlZC4KLQotCSogcHRyYWNlLWNvcmUuYyAocmF3cHRyKTogTWFrZSBpdCBhIGxvY2FsIHZhcmlhYmxlIG9mCi0gCXB0cmFjZV91bml4X2NvcmVfZmlsZV9wLgotCi1GcmkgT2N0ICA2IDEyOjI0OjQ3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJldHVybiBmYWxzZSwgbm90Ci0JTlVMTC4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwY3ssbGV9LXtlbGYsc3lzdjQsZWFiaSxzb2xhcmlzMn0pOiBBZGQgTlQsIGFuZAotCU1hYyBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1GcmkgT2N0ICA2IDEyOjA0OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IERvbid0IHRyeSB0byBzZXQgdXAgZmlsZQotCWF1eGVudCBpZiB0aGVyZSBpc24ndCBvbmUuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IElmIHRoZXJlIGlzIG5vIGZpbGUgYXV4ZW50LCB1c2UgU1lNTk1MRU4KLQlyYXRoZXIgdGhhbiBGSUxOTUxFTiBhcyB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aC4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9wcmludF9hdXguCi0JKGJmZF9jb2ZmX3ByaW50X2F1eCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoUlM2MDAwQ09GRl9DIHZlcnNpb24pKTogUG9pbnRlcml6ZSB0aGUKLQlzY25sZW4gZmllbGQgb2YgYW4gWFRZX0xEIGNzZWN0IGF1eCBlbnRyeS4KLQkoY29mZl9wcmludF9hdXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHBvaW50ZXJpemUgc2NubGVuIGZpZWxkOyBub3cgZG9uZQotCWluIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vay4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBDYWxsIGJmZF9jb2ZmX3ByaW50X2F1eC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbiBBSVgsIGNsZWFyIEZfUkVMRkxHCi0JaWYgdGhlcmUgYXJlIHN5bWJvbHMsIGZvciBuYXRpdmUgQUlYIGxkIGNvbXBhdGliaWxpdHkuCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vay4KLQkoY29mZl9wb2ludGVyaXplX2F1eF9ob29rKTogRGVmaW5lIGFzIGEgZnVuY3Rpb24gaWYgUlM2MDAwQ09GRl9DCi0Jb3IgSTk2MCwgYW5kIGFzIDAgb3RoZXJ3aXNlLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChjb2ZmX3BvaW50ZXJpemVfYXV4KTogQ2hhbmdlIHBhcmFtZXRlcnMgIHRvIHRha2UKLQlzeW1ib2wgcG9pbnRlciBpbnN0ZWFkIG9mIHR5cGUgYW5kIGNsYXNzLCBhbmQgdG8gdGFrZSBhdXggaW5kZXguCi0JQ2FsbCBfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayBpZiBpdCBpcyBkZWZpbmVkLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IEFsd2F5cyBjYWxsIGNvZmZfcG9pbnRlcml6ZV9hdXguCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgYWxsIGZpZWxkcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLXJzNjAwMC5jOiBBZGQgZnVsbCBzdXBwb3J0IGZvciBBSVggYXJjaGl2ZXMuICBSZXdyaXRlIG9sZAotCXJlYWQtb25seS9ob3N0LW9ubHkgc3VwcG9ydC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQ19ISURFWFQgc3ltYm9scyB0byBiZQotCUJTRl9MT0NBTC4KLQkoT1RIRVJfR0xPQkFMX0NMQVNTKTogRG8gbm90IGRlZmluZSB0byBiZSBDX0hJREVYVCBpZgotCVJTNjAwMENPRkZfQy4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfcmVhZF9hcl9oZHIgZmllbGQuICBNb2RpZnkKLQlCRkRfSlVNUF9UQUJMRV9BUkNISVZFIGFjY29yZGluZ2x5LgotCSogbGliYmZkLWluLmggKF9iZmRfc25hcmZfYXJfaGRyKTogRG9uJ3QgZGVjbGFyZS4KLQkoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IERlY2xhcmUuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IERlY2xhcmUuCi0JKF9iZmRfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIGFyY2hpdmUuYzogQ2hhbmdlIGFsbCBjYWxsZXJzIG9mIF9iZmRfc25hcmZfYXJfaGRyIHRvIGNhbGwKLQlfYmZkX3JlYWRfYXJfaGRyIGluc3RlYWQuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IFJlbmFtZSBmcm9tIF9iZmRfc25hcmZfYXJfaGRyLgotCShfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUmVuYW1lIGZyb20KLQljb21wdXRlX2FuZF93cml0ZV9hcm1hcC4gIE1ha2Ugbm9uLXN0YXRpYy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXApOiBDYWxsIF9iZmRfcmVhZF9hcl9oZHIgcmF0aGVyCi0JdGhhbiBfYmZkX3NuYXJmX2FyX2hkci4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlYWRfYXJfaGRyKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogaWVlZS5jIChpZWVlX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogc29tLmMgKHNvbV9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLVRodSBPY3QgIDUgMTQ6MDQ6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5jIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IElmIHN5bXB0ciBpcwotCXplcm8sIHRoZXJlIGFyZW4ndCBhbnkgc3ltYm9scywgZXZlbiBpZiBuc3ltcyBpcyBzZXQuCi0KLVRodSBPY3QgIDUgMTE6NDU6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIGFkanVzdF9oZWFkZXJzCi0JZmllbGQuCi0JKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhCi0Jc2VjdGlvbnMsIGFuZCBzZXQgc3R5cCBjb3JyZWN0bHkgZm9yIHRoZW06IC5nb3QsIC5oYXNoLCAuZHluYW1pYywKLQkubGlibGlzdCwgLnJlbC5keW4sIC5jb25mbGljLCAuZHluc3RyLCAuZHluc3ltLCAuY29tbWVudC4KLQkoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhIHNlY3Rpb24KLQl0eXBlcy4KLQkoZWNvZmZfc29ydF9oZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmV0dXJuIGJvb2xlYW4sIG5vdCB2b2lkLgotCVNvcnQgdGhlIHNlY3Rpb25zIGJ5IFZNQSBiZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZW0uICBQdXQgdGhlCi0JZmlyc3Qgbm9uIFNFQ19BTExPQyBzZWN0aW9uIG9uIGEgbmV3IHBhZ2UuICBQdXQgZXZlcnkgU0VDX0FMTE9DCi0Jc2VjdGlvbiBvbiBhbiBhcHByb3ByaWF0ZSBib3VuZGFyeSB3aXRoaW4gdGhlIHBhZ2UuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQllY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBmb3IgdmFyaW91cyBBbHBoYQotCXNlY3Rpb24gdHlwZXMgd2hlbiBpbmNyZW1lbnRpbmcgdGV4dF9zaXplIGFuZCBkYXRhX3NpemUuICBDYWxsCi0JYWRqdXN0X2hlYWRlcnMgYmFja2VuZCBmdW5jdGlvbiBpZiBpdCBleGlzdHMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2FkanVzdF9oZWFkZXJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBhZGp1c3RfaGVhZGVycyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBob3N0cy9pMzg2YnNkLmg6IFJlc3RvcmUgZmlsZSBpbmNvcnJlY3RseSBkZWxldGVkIG9uIFNlcCA2LgotCi1XZWQgT2N0ICA0IDE4OjE1OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9WRVJTSU9OXzEpOiBVc2UgQ09SRV9WRVJTSU9OXzEgaW5zdGVhZAotCW9mIEFMVEVSTkFURV9BSVhfQ09SRV9GT1JNQVQuCi0JKiBjb25maWd1cmUuaW4gKGFpeDQpOiBObyBsb25nZXIgbmVlZCBDT1JFX0ZMQUdTLgotCSogY29uZmlndXJlOiBVcGRhdGVkLgotCi1XZWQgT2N0ICA0IDE1OjM2OjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTlMzMmsgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgotCSogYW91dHguaCAoTVlfZmluYWxfbGlua19yZWxvY2F0ZSwgTVlfcmVsb2NhdGVfY29udGVudHMpOiBOZXcKLQltYWNyb3MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0LAotCWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogQ2FsbCB0aGVtIGluc3RlYWQgb2YgX2JmZF8qCi0JdmVyc2lvbnMuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCk6IE5ldyBtYWNybywgZGVmYXVsdHMKLQl0byB6ZXJvLgotCShiYWNrZW5kX2RhdGEpOiBVc2UgaXQgaW5zdGVhZCBvZiBoYXJkY29kZWQgemVyby4KLQotCSogYW91dC1uczMyay5jIChDVE9SX1RBQkxFX1JFTE9DX0hPV1RPKTogTmV3IG1hY3JvLgotCShNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgdWRhdGEuaSBmb3IgS0VFUElULCBkb24ndCBjYWxsIHN0b2kuCi0KLQkqIG5zMzJrbmV0YnNkLmM6IEluY2x1ZGUgYmZkLmguCi0JKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLCBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgbWFjcm9zLgotCShNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWNsYXJlIGZ1bmN0aW9uIHRvby4KLQkqIHBjNTMyLW1hY2guYyAoc2V0X3NpemVzKTogRG9uJ3QgZGVjbGFyZS4KLQkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkKTogRGVmaW5lLgotCShiYWNrZW5kX2RhdGEsIE1ZX2JhY2tlbmRfZGF0YSk6IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnLmJmZDogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAotCW5zMzJrLSotbGl0ZXMqIGxpa2UgbnMzMmstKi1uZXRic2QqLgotCi0JKiBob3N0cy9uYnNkLmg6IFN3YXAgb3JkZXIgb2Ygc3lzL3ZtcGFyYW0uaCBhbmQgc3lzL3BhcmFtLmgsIHRvCi0JY29tcGlsZSBvbiBsaXRlcy4KLQotV2VkIE9jdCAgNCAxNDoxNTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVzdG9yZSBzZXR0aW5nCi0JZl90aW1kYXQgdG8gMCwgZGVsZXRlZCBvbiBBdWd1c3QgMjIuCi0KLVR1ZSBPY3QgIDMgMTY6Mjg6MzIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLAotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsCi0JY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogaWZkZWYgdG8gYWxsb3cgb3ZlcnJpZGVzLgotCSogcGVpY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcKLQkocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IFN3YXAgYnNzIHNpemUgaW50byB0aGUgcmlnaHQgcGxhY2UuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgc29tZSBuZXdsaW5lcy4KLQotVHVlIE9jdCAgMyAxMTo1MzowNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IERvbid0IGRpZSBpZiBhIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMuCi0KLU1vbiBPY3QgIDIgMTQ6MDg6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGxldCBhIHdlYWsKLQlkeW5hbWljIHN5bWJvbCBvdmVycmlkZSBhIGNvbW1vbiBzeW1ib2wuICBEb24ndCBjaGFuZ2UgdGhlIHNpemUgb3IKLQl0eXBlIGlmIHRoZXkgaGF2ZSBiZWVuIHNldCBhbmQgdGhlIG5ldyBzeW1ib2wgaXMgbm90IGEgZGVmaW5pdGlvbi4KLQlXYXJuIGlmIHRoZSBzaXplIG9yIHR5cGUgY2hhbmdlcy4KLQotU3VuIE9jdCAgMSAwMTozNDo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlIG9yCi0Jc3ltYm9sCXN0cmluZ3MuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IFdyaXRlIHRoZW0gaGVyZS4gIFBsYWNlIHRoZW0gYWZ0ZXIgdGhlCi0Jc3Vic3BhY2UgZGF0YSwgYnV0IGJlZm9yZSB0aGUgcmVsb2NzLgotCi1GcmkgU2VwIDI5IDExOjAxOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBKdXN0IHBhc3MgZmFsc2UsIG5vdAotCWluZm8tPnNoYXJlZF9saWJyYXJ5LCB0byBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogRG9uJ3Qgd2FybiBhYm91dCBhIHJlbG9jIGluIHRoZSAudGV4dAotCXNlY3Rpb24uCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBSZW1vdmUgLnRleHQgc2VjdGlvbiBhc3NlcnRpb24uCi0KLVRodSBTZXAgMjggMTg6NDg6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgcG93ZXJwYy0qLW1hY29zKiwgcG93ZXJwYy0qLW1wdyouCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogQWRkIHBtYWNfeGNvZmZfdmVjIGNhc2UuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1wbWFjLm8uCi0JKiBjb2ZmLXBtYWMuYzogTmV3IGZpbGUsIFBvd2VyTWFjIFhDT0ZGIHN1cHBvcnQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZCBQb3dlck1hYyBjYXNlLgotCSogdGFyZ2V0cy5jIChwbWFjX3hjb2ZmX3ZlYyk6IERlY2xhcmUuCi0KLQkqIG1wdy1jb25maWcuaW46IFZhcmlvdXMgY2hhbmdlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlCi0JYXV0b2NvbmYtYmFzZWQgY29uZmlndXJ5LgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4Ci0JbWFrZWZpbGUgaW50byBNUFcgc3ludGF4LgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIGhvc3RzL21wdy5oOiBSZW1vdmUuCi0JKiBiZmQtaW4uaCwgYmZkLWluMi5oOiBJZiBNUFcsIGluY2x1ZGUgdGhlIGZpbGUgdGhhdCBkZWZpbmVzCi0JdHJ1ZSBhbmQgZmFsc2UgYXMgZW51bXMsIHRoZW4gZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVELgotCi1UaHUgU2VwIDI4IDE3OjA2OjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfZ2V0X3N5bXRhYik6IFJldHVybiBhbiBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCi0JKiBvcG5jbHMuYyAoYmZkX2ZkcGVucik6IENoYW5nZSBXSU4zMiByZXN0cmljdGlvbiB0byBXSU5HREIuCi0KLVRodSBTZXAgMjggMTU6MzA6NDQgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogY29mZi1wcGMuYzogUmVmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGdudSBjb252ZW50aW9ucwotCSAgICAgICAgICAgICAgUmVtb3ZlZCBpcnJlbGV2YW50ICJpZiAwIiBjb2RlCi0KLVRodSBTZXAgMjggMTE6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSk6IFRyZWF0IHNlY29uZGFyeSBzeW1ib2xzIGFzIHdlYWsKLQlzeW1ib2xzIHJhdGhlciB0aGFuIGFzIGluZGlyZWN0IHN5bWJvbHMuCi0JKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGFib3V0Ci0Jc2Vjb25kYXJ5IHN5bWJvbHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IE1ha2Ugc3VyZSB0aGF0IHRoZSBhbGlnbm1lbnQKLQlvZiAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9ucyBpcyBubyBsYXJnZXIgdGhhbiAyLgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNoYW5nZQotCWJmZF9saW5rX2hhc2hfY29tbW9uIHRvIGJmZF9saW5rX2hhc2hfbmV3LCBzaW5jZSBpdCBtYXkgYmUgb24gdGhlCi0JdW5kZWYgbGlzdC4KLQkoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEb24ndCBwdXQgX19EWU5BTUlDIGluIHRoZQotCWR5bmFtaWMgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IEhhbmRsZSByZWxvY3MgY29ycmVjdGx5IHdoZW4gY3JlYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFyayB0aGUgX19EWU5BTUlDIHN5bWJvbCBhcwotCXdyaXR0ZW4gZXZlbiBpZiBpdCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IFVzZSBwbHRfb2Zmc2V0IGZvciB0aGUgYWRkcmVzcyBvZgotCXRoZSBqdW1wIHRhYmxlIHJlbG9jLiAgQWRkIGFuIGFzc2VydGlvbi4gIFVzZSBSRUxPQ19KTVBfU0xPVAotCXJhdGhlciB0aGFuIHRoZSBjb25zdGFudCAyMi4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IEhhbmRsZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogU2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgR09UIHRvCi0JemVybyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiB0aGVyZSBpcyBhIHN5bWJvbCBfX0RZTkFNSUMsCi0Jd3JpdGUgaXQgb3V0IGF0IHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIHRhYmxlLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hcm0uby4KLQotVGh1IFNlcCAyOCAwMDo1ODowNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBhcm0tKi1jb2ZmLgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkZCBhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMuCi0JKiB0YXJnZXRzLmMgKGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYy4KLQkqIGNvZmYtYXJtLmMgKGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYyk6IEFsd2F5cyBkZWZpbmUuCi0KLVdlZCBTZXAgMjcgMTA6Mzc6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF9maW5kX3RhcmdldCk6IFJlbW92ZSBkZWJ1Z2dpbmcgY29kZS4KLQotV2VkIFNlcCAyNyAwNzoyMzozOSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb2ZmLXBwYy5jLCBwZS1wcGMuYywgcGVpLXBwYy5jOiBJbml0aWFsIGJmZCBmb3IgY29mZi9QRQotICAgICAgICBzdXBwb3J0IG9uIHBvd2VycGMuCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgKi1wcGMgZmlsZXMKLQkqIGNvZmZjb2RlLmg6IHBwYyBNQUdJQywgYW5kIHVzZSBwZWljb2RlLmggcmF0aGVyIHRoYW4gY29mZnN3YXAuaCB0bwotICAgICAgICBhbGxvdyBwZSBiYXNlZCAubydzIHRvIGJlIHNoYXJlZCB3aXRoIG90aGVyIHRvb2xzIG9uIHBwYy9OVAotCSogY29uZmlnLmJmZDogYWRkZWQgcG93ZXJwY1tsZV0tW3BlfHdpbm50XSBjb25maWcgc3VwcG9ydAotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IGFkZGVkIGJmZF9wb3dlcnBjW2xlXV9wZVtpXV92ZWMKLQkqIHBlaWNvZGUuaDogQWRkZWQgbW9yZSBzZWN0aW9uIGZsYWdzIGZvciBQRSBvbiBwcGMKLQkgICAgICAgICAgICAgQWRkZWQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IHRvIGFsbG93IHBlaWNvZGUuaCB0byBiZQotCQkgICAgIHVzZWQgZm9yIG5vbi1pbWFnZSBQRSBmaWxlcyBvbiBwcGMuCi0JCSAgICAgQ2hlY2sgZm9yIGltYWdlLCBvciBub3QsIGJlZm9yZSBjb3B5aW5nIHBlX29wdGhkcgotCSogdGFyZ2V0cy5jOiBBZGRlZCBuZXcgYmZkJ3MKLQkqIHRhcmdldHMuYzogUmVtb3ZlZCB0d28gaW5hY3RpdmUgYmZkcyB0aGF0IHNob3VsZG4ndCBoYXZlIG1hZGUgaXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgZmFyLgotCi1UdWUgU2VwIDI2IDE0OjA2OjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19yZWxvY190eXBlKTogUmVuYW1lIGZyb20gcmVsb2NfdHlwZSwgYW5kIHVzZQotCWV4cGxpY2l0IHZhbHVlcyB0byBpbml0aWFsaXplIGFsbCByZWxvY3MuICBDaGFuZ2UgYWxsIHVzZXJzLgotCShwcGNfZWxmX2JydGFrZW5faW5uZXIpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGJyYW5jaCBwcmVkaWNpdGlvbgotCXJlbG9jcy4KLQkocHBjX2VsZl9icnRha2VuX3JlbG9jKTogRGl0dG8uCi0JKHBwY19lbGZfaG93dG9fcmF3KTogVXNlIG5ldyBmdW5jdGlvbnMuICBNYWtlIHN1cmUgYWxsIHVuc3VwcG9ydGVkCi0JcmVsb2NzIHVzZSBwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgYW4gZXJyb3IKLQluZWVkcyB0byBiZSByZXBvcnRlZC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogU3VwcG9ydCBicmFuY2ggcHJlZGljdGlvbiByZWxvY3MuCi0KLVR1ZSBTZXAgMjYgMTI6NDg6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2Fzc2VydCk6IFJlbW92ZSBcbiBmcm9tIHN0cmluZyBwYXNzZWQgdG8KLSAgICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyLgotCi0JKiBjb2ZmLWkzODYuYzogKFRXT19EQVRBX1NFQ1MpOiBEb24ndCBkZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgX2JmZF9tYWtlX3NlY3Rpb25faG9vay4KLQkoYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBEb24ndCBkZWZpbmUuCi0JKGNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBSZW1vdmUuCi0JKHNlY190b19zdHlwX2ZsYWdzKTogUmVtb3ZlIFRXT19EQVRBX1NFQ1MgY2FzZS4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBEb24ndCBpbml0aWFsaXplIG1ha2Vfc2VjdGlvbl9ob29rCi0JZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEp1c3QgY2FsbAotCWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5LCBub3QgYmZkX21ha2Vfc2VjdGlvbiBvcgotCWJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IFJlbW92ZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBEb24ndCBkZWNsYXJlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBEb24ndCBpbml0aWFsaXplCi0JbWFrZV9zZWN0aW9uX2hvb2sgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IHRyeSB0byBzdHVmZgotCXBvaW50ZXJzIGludG8gdmFsdWUgZmllbGQgZm9yIHdhcm5pbmcgYW5kIGluZGlyZWN0IHN5bWJvbHM7IGp1c3QKLQlsZWF2ZSB0aGUgdmFsdWUgZmllbGQgYWxvbmUuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFVzZSBuZXh0IHN5bWJvbCBmb3IKLQl3YXJuaW5nIGFuZCBpbmRpcmVjdCBzeW1ib2xzLCByYXRoZXIgdGhhbiBsb29raW5nIGluIHN5bWJvbCB2YWx1ZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbW92ZSBpbmRpcmVjdF9wdHJfcHRyCi0JcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgUmVtb3ZlIHN1cHBvcnQgZm9yIGluZGlyZWN0Ci0Jc3ltYm9sczsgaXQgZGlkbid0IHdvcmsgYW55aG93LgotCShfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlbW92ZSBpbmRpcmVjdF9wdHIgdmFyaWFibGUuCi0JKiBzeW1zLmM6IENoYW5nZSBjb21tZW50cyBhYm91dCBCU0ZfV0FSTklORyBhbmQgQlNGX0lORElSRUNULgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gU2VwIDI1IDE2OjA0OjA5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogRm9yIGFsbCAxNC1iaXQgYnJhbmNoIHJlbG9jcywKLQlnbyBiYWNrIHRvIHRlbGxpbmcgdGhlIHRvb2xzIHRoaXMgcmVsb2Mgb3BlcmF0ZXMgb24gMzIgYml0cy4KLQotTW9uIFNlcCAyNSAxMTo0ODowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9jYWxsYmFjayk6IFVzZSBfYmZkX2Vycm9yX2hhbmRsZXIKLQlyYXRoZXIgdGhhbiBhIGRpcmVjdCBmcHJpbnRmLgotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfdW5zdXBwb3J0ZWRfcmVsb2MpOiBMaWtld2lzZS4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAobGludXhfdGFsbHlfc3ltYm9scyk6IExpa2V3aXNlLgotCShsaW51eF9maW5pc2hfZHluYW1pY19saW5rKTogTGlrZXdpc2UuCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IExpa2V3aXNlLgotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9zaXplb2ZfaGVhZGVycyk6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX2JhZF9ieXRlKTogTGlrZXdpc2UuCi0JKiBiZmQuYyAoYmZkX2Fzc2VydCk6IExpa2V3aXNlLiAgQWxzbyBjaGFuZ2UgZmlsZSB0byBiZSBjb25zdC4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYXNzZXJ0KTogRGVjbGFyZSBmaXJzdCBwYXJhbWV0ZXIgY29uc3QuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogRG9uJ3QgYm90aGVyIHRvIGZwcmludGY7IHJldHVybmluZwotCWJmZF9yZWxvY19vdmVyZmxvdyBpcyBlbm91Z2guCi0JKiBjb2ZmLWg4MzAwLmMgKHJ0eXBlMmhvd3RvKTogRG9uJ3QgYm90aGVyIHRvIGZwcmludGY7IGp1c3QgYWJvcnQuCi0JKiBjb2ZmLWg4NTAwLmMgKHJ0eXBlMmhvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXo4ay5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2dldF9saW5lbm8pOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbm9faW5mb190b19ob3d0byk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvX3JlbCk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBMaWtld2lzZS4KLQkoTVkoc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlICNpZiAwIHNlY3Rpb25zLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBsaW5lX2J1ZiBmaWVsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBSZW1vdmUgc3RhdGljcyBidWZmZXIKLQlhbmQgZmlsZW5hbWVfYnVmZmVyLiAgSW5zdGVhZCwgdXNlIGEgbWFsbG9jIGJ1ZmZlciBzdG9yZWQgaW4gdGhlCi0JbmV3IGxpbmVfYnVmIGZpZWxkLiAgUmVtb3ZlIGxlbmd0aCByZXN0cmljdGlvbnMuCi0KLQkqIGNvZmZnZW4uYyAoc3RyaW5nX3NpemUpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShkZWJ1Z19zdHJpbmdfc2l6ZSwgZGVidWdfc3RyaW5nX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBBZGQgc3RyaW5nX3NpemVfcCwgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQlhbmQgZGVidWdfc3RyaW5nX3NpemVfcCBwYXJhbWV0ZXJzLiAgVXNlIHRoZW0gaW5zdGVhZCBvZiB0aGUKLQlnbG9iYWwgdmFyaWFibGVzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCwgY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IEFkZCBsb2NhbCB2YXJpYWJsZXMgdG8gcmVwbGFjZSByZW1vdmVkCi0JZ2xvYmFsIHZhcmlhYmxlcy4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIG9mZnNldCwgaSwKLQlmdW5jdGlvbiwgYW5kIGxpbmVfYmFzZSBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2Ugc2VjdGlvbiB0ZGF0YSB0byBjYWNoZQotCWluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiB1c2luZyBzdGF0aWMgdmFyaWFibGVzLgotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IEFkanVzdCBvZmZzZXRzIGluIGFuIE5NQUdJQwotCWZpbGUuICBGcm9tIFBldGVyIERlV29sZiA8cGxkQGFtdC50YXkxLmRlYy5jb20+LgotCi0JKiBpbml0LmMgKGluaXRpYWxpemVkKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoYmZkX2luaXQpOiBEb24ndCBib3RoZXIgc2V0dGluZyBpbml0aWFsaXplZC4KLQkoYmZkX2NoZWNrX2luaXQpOiBSZW1vdmUuCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogRG9uJ3QgY2FsbCBiZmRfY2hlY2tfaW5pdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1TYXQgU2VwIDIzIDAxOjIyOjIzIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgRG9uJ3QgY2hlY2sgdGhlIGNvcmUgZmlsZQotCXNpemUgZm9yIGZ1bGwgY29yZSBkdW1wcy4gQ29weSBjb3JlIGZpbGUgaGVhZGVyIHRvIHByaXZhdGUgZGF0YS4KLQkocnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLAotCXJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogIE5ldyBmdW5jdGlvbnMgdG8gZXh0cmFjdAotCXRoZSBmaWxlIG5hbWUgYW5kIHRlcm1pbmF0aW5nIHNpZ25hbCBmcm9tIHRoZSBjb3JlIGZpbGUuCi0JKiBjb2ZmLXJzNjAwMC5jOiAgVXNlIHRoZW0uCi0KLUZyaSBTZXAgMjIgMTc6NDQ6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQ2hhbmdlIGFyY2ggaW5mbyB0byBiZSBjb25zdCwgaW5pdGlhbGl6ZWQgYXQgY29tcGlsZSB0aW1lLgotCSogYXJjaHVyZXMuYzogUmVpbmRlbnQgbWFueSBmdW5jdGlvbnMuICBDaGFuZ2UgQ09OU1QgdG8gY29uc3QuCi0JKGJmZF9hcmNoX2luZm9fdHlwZSk6IE1ha2UgYXJjaF9uYW1lIGNvbnN0LiAgUmVtb3ZlIGRpc2Fzc2VtYmxlOwotCW5vdGhpbmcgc2V0IGl0IGFueWhvdy4gIE1ha2UgbmV4dCBjb25zdC4KLQkoYmZkX2FyY2hfaW5mb19saXN0KTogUmVtb3ZlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IFJlbmFtZSBmcm9tIGFyY2h1cmVzX2luaXRfdGFibGUuICBDaGFuZ2UgZnJvbQotCWEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdG8gYSB0YWJsZSBvZiBiZmRfYXJjaF9pbmZvX3R5cGUKLQlzdHJ1Y3R1cmUgYWRkcmVzc2VzLgotCShiZmRfc2Nhbl9hcmNoKTogUmV3cml0ZSBhY2NvcmRpbmdseS4gIFJldHVybiBhIGNvbnN0IHBvaW50ZXIuCi0JKGJmZF9sb29rdXBfYXJjaCk6IExpa2V3aXNlLgotCShiZmRfc2V0X2FyY2hfaW5mbyk6IFJld3JpdGUgYWNjb3JkaW5nbHkuICBDaGFuZ2UgYXJndW1lbnQgdG8gYmUgYQotCWNvbnN0IHBvaW50ZXIuCi0JKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KTogTWFrZSBjb25zdC4KLQkoYmZkX2FyY2hfaW5pdCwgYmZkX2FyY2hfbGlua2luKTogUmVtb3ZlLgotCShiZmRfZ2V0X2FyY2hfaW5mbyk6IFJldHVybiBhIGNvbnN0IHBvaW50ZXIuCi0JKiBpbml0LmMgKGJmZF9pbml0KTogRG9uJ3QgY2FsbCBiZmRfYXJjaF9pbml0LgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogTWFrZSBhcmNoX2luZm8gY29uc3QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogUHV0ICYgYmVmb3JlIGV2ZXJ5dGhpbmcgaW4gJHNlbGFyY2hzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY3B1LSouYzogQ2hhbmdlIGJmZF8qX2FyY2ggZnJvbSBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxzCi0JYmZkX2FyY2hfbGlua2luIHRvIGEgY29uc3Qgc3RydWN0dXJlLgotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogTWFrZSBhcmNoIGNvbnN0LgotCi1GcmkgU2VwIDIyIDE2OjIzOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCByZWxvY2F0aW9ucyB0byBzdXBwb3J0IGFsbCBvZgotCVBvd2VyUEMgVi40LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZjMyLXBwYy5jIChyZWxvY190eXBlKTogVXBkYXRlIG5hbWVzIHRvIG1hdGNoIGN1cnJlbnQgZHJhZnQuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogTWFyayAxNCBiaXQgcmVsb2NzIGFzIHNob3J0IHNpemVkIGFuZCBQQwotCXJlbGF0aXZlLiAgVXBkYXRlIG5hbWVzIHRvIGN1cnJlbnQgVi40IGRyYWZ0LgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHN1cHBvcnQgZm9yIG1vcmUgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSByZWxvY2F0aW9ucyB0byBtYXRjaCBkcmFmdC4KLQotVGh1IFNlcCAyMSAyMTo1MzoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsbG93IG1vZHVsZXMKLQljb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUtbGliIHRvIGJlIGxpbmtlZCB3aXRoIGVpdGhlciBub3JtYWwKLQltb2R1bGVzIG9yIC1tcmVsb2NhdGFibGUgbW9kdWxlcy4KLQotV2VkIFNlcCAyMCAxMjowMzoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2xlYXIgdGhlIHZzdGFtcCBmaWVsZAotCWluIHRoZSBhLm91dCBoZWFkZXIuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogRG9uJ3Qgc2V0IHJfZXh0ZXJuIGZvcgotCWEgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgZXZlbiBpZiBpdCdzIG5vdCBhIHNlY3Rpb24uCi0KLVR1ZSBTZXAgMTkgMTc6MDI6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW1vdmUgdW51c2VkIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIEFsbCBiYWNrZW5kczogUmVtb3ZlIGluaXRpYWxpemF0aW9uIG9mIGFsaWduX3Bvd2VyX21pbi4KLQotVHVlIFNlcCAxOSAxNDowMjoyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogR2V0IHNpemVzIGZvciBCU1MgcmlnaHQuCi0KLU1vbiBTZXAgMTggMTQ6MzU6MDEgMTk5NSAgQXJuZSBILiBKdXVsICA8YXJuZWpAcHZ2LnVuaXQubm8+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgaG9zdC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyBuYXRpdmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBTZXAgMTUgMTA6MjQ6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBtZXJnZSBjb21tb24gdHlwZXM6Ci0JKiBjb2ZmbGluay5jIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50KTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlKTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCk6IERlZmluZS4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUpOiBEZWZpbmUuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXApOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBkZWJ1Z19tZXJnZSBmaWVsZC4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IEFsbG9jYXRlIGFuZCBmcmVlIGRlYnVnX21lcmdlIHRhYmxlLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCBhbmQgdW5pb24KLQl0eXBlcy4KLQotVGh1IFNlcCAxNCAxNDo1Mzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlDb252ZXJ0IGk5NjAgQ09GRiB0byB1c2UgQ09GRiBiYWNrZW5kIGxpbmtlci4KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBVc2UgYSBjb2ZmX3NlY3Rpb25fZGF0YQotCXN0cnVjdHVyZSB0byBzdG9yZSB0aGUgc3ltYm9sIGJlaW5nIHVzZWQuCi0JKGNvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGNhbGxiYWNrIGZ1bmN0aW9uCi0JX2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsuCi0JKGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspOiBEZWZpbmUuCi0JKGNvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBBZGQgY29mZl9zdGFydF9maW5hbF9saW5rLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTWFrZSBnbG9iYWxseQotCXZpc2libGUuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogQ2FsbCBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rIGlmIHRoZQotCWZ1bmN0aW9uIGNhbGxiYWNrIGlzIG5vdCBOVUxMLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIHRkYXRhIGZpZWxkLgotCShfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluIChpY29mZl9iaWdfdmVjKTogQWRkIGNvZmZsaW5rLm8uCi0JKGljb2ZmX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAxMyAxNzozODoyMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbi1pbmZvKTogUmVtb3ZlIGV4dHJhbmVvdXMgdGFiIGZyb20gbGluZQotCWZvbGxvd2luZyBhY3Rpb24uCi0KLVdlZCBTZXAgMTMgMTM6Mjc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRmFpbCBpZiBhIHNlY3Rpb24gd2l0aCBubwotCWNvbnRlbnRzIGhhcyByZWxvY3MuCi0KLVRodSBTZXAgMTIgMTI6NDU6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBLZWVwIHRoZQotCXJhdyBzaXplIHNhZmUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtZW1iZXIgaWYgaXQncyBhIHJlbG9jYXRhYmxlCi0JZmlsZS4KLQkqIGxpYmNvZmYtaW4uaCAocGVfZGF0YV90eXBlKTogTmV3IG1lbWJlciAnaGFzX3JlbG9jX3NlY3Rpb24nCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IENsZWFyIG5vdC1yZWxvYyBmbGFnCi0JaWYgcmVsb2NhdGFibGUgZmlsZS4gU3dhcCBvdXQgc2F2ZWQgcmF3IHNpemUuCi0KLVR1ZSBTZXAgMTIgMTI6MTQ6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IFJlbmFtZSBmcm9tIGRvX3JlYWxjbGVhbi4KLQkobWFpbnRhaW5lci1jbGVhbik6IFJlbmFtZSBmcm9tIHJlYWxjbGVhbiwgcGFzc2luZwotCW1haW50YWluZXItY2xlYW4gZG93biB0byBzdWJkaXJlY3RvcmllcywgYnV0IGxlYXZlIHJlYWxjbGVhbiBhcyBhCi0Jc3lub255bS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUGFzcyBzeW1ib2wgbmFtZSB0bwotCXdhcm5pbmcgY2FsbGJhY2suCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSBjb25maWcuaCBmcm9tIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwKLQlicm9rZW4gb3V0IG9mIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogQ2FsbCBuZXcgZnVuY3Rpb24KLQlzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYi4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IEFkZCB0aHJlZSBuZXcgcGFyYW1ldGVycy4gIFJldHVybiB0aGUKLQlkeW5hbWljIHN5bWJvbCB0YWJsZSB0byB0aGUgY2FsbGVyLgotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IGFkZF9keW5hbWljX3N5bWJvbHMKLQljYWxsYmFjayB0byBvdmVycmlkZSB0aGUgc3ltYm9scyBiZWluZyByZWFkLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgdGhyZWUgbmV3IHBhcmFtZXRlcnMKLQl0byBhZGRfZHluYW1pY19zeW1ib2xzIGNhbGxiYWNrLgotCi0JRXh0ZW5zaXZlIG1pbm9yIGNoYW5nZXMgdG8gYXZvaWQgdmFyaW91cyBnY2Mgd2FybmluZ3MuICBBbHNvOgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIGNvZmYtYXJtLm8uCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaF9pbmZvX3R5cGUpOiBDaGFuZ2UgbWFjaCBmaWVsZCBmcm9tIGxvbmcgdG8KLQl1bnNpZ25lZCBsb25nLgotCShiZmRfbG9va3VwX2FyY2gpOiBDaGFuZ2UgbWFjaGluZSBwYXJhbWV0ZXIgZnJvbSBsb25nIHRvIHVuc2lnbmVkCi0JbG9uZy4KLQotTW9uIFNlcCAxMSAxMDo1NTo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IEZpeCBCRkRfQVNTRVJUOiBpdCdzIE9LIHRvIGZpbmQKLQlhIHN5bWJvbCB3aXRoIGEgbm9uLXplcm8gcGx0X29mZnNldC4KLQotRnJpIFNlcCAgOCAxMTo0NzoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoYWxpZ25fZmlsZV9wb3NpdGlvbik6IFJlbW92ZTsgbm90IHVzZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT25seSBjaGVjayBmb3IgPHN5cy9wcm9jZnMuaD4gb24gYSBuYXRpdmUgc3lzdGVtLAotCWFuZCBtYWtlIHN1cmUgaXQgZGVmaW5lcyBwcnN0YXR1c190LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgU2VwICA3IDEyOjQ4OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBDb3JyZWN0IG02OGsgYWJvcnQgdGVzdC4KLQotCSogY29uZmlnLmluOiBSZW5hbWUgZnJvbSBjb25maWcuaC5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIHdpdGggY29uZmlnLmg6Y29uZmlnLmluLgotCUNoZWNrIGZvciBjb25maWcuaDpjb25maWcuaW4gd2hlbiBjcmVhdGluZyBzdGFtcC1oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBjb25maWcuaW4gcmF0aGVyIHRoYW4KLQljb25maWcuaC5pbi4gIFNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4gd2hlbgotCWNhbGxpbmcgY29uZmlnLnN0YXR1cy4KLQotCSogTWFrZWZpbGUuaW4gKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCBhbmQgc3RhbXAtaC4KLQkoTWFrZWZpbGUpOiBKdXN0IHJlYnVpbGQgTWFrZWZpbGUuCi0JKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW46IENyZWF0ZSBzdGFtcC1oIHdoZW4gcmVidWlsZGluZyBjb25maWcuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAgNiAxNTowMDozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSLiAgU3Vic3RpdHV0ZQotCUhPU1RfNjRCSVRfTE9ORy4gIENoZWNrIHRoYXQgdmFyaW91cyBoZWFkZXIgZmlsZXMgZXhpc3QuICBDaGVjawotCXRoYXQgZmNudGwgZXhpc3RzLiAgQ2FsbCBCRkRfQklOQVJZX0ZPUEVOLiAgQ2hlY2sgd2hldGhlciBtYWxsb2MKLQlhbmQvb3IgZnJlZSBuZWVkIHRvIGJlIGRlY2xhcmVkLiAgRG9uJ3QgbWFrZSBhIGxpbmsgdG8gc3lzZGVwLmguCi0JRGVmaW5lIFRSQURfSEVBREVSIGZvciB2YXJpb3VzIGhvc3RzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBteV9ob3N0LiAgQWRkIGRlZmluaXRpb25zIHRha2VuIGZyb20KLQlob3N0IGhlYWRlciBmaWxlcyBmb3IgdmFyaW91cyBlbnRyaWVzLiAgUmVtb3ZlIGVudHJpZXMgd2hpY2ggbm93Ci0JZG8gbm90aGluZy4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmguaW46IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvaGVhZGVyLgotCSogc3lzZGVwLmg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGRvX2Rpc3RjbGVhbik6IERvbid0IHJlbW92ZSBzeXNkZXAuaC4KLQkoUkVDT05GSUcpOiBSZW1vdmUuCi0JKExPQ0FMX0hfREVQUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChCRkRfTElCUykpOiBVc2UgJChMT0NBTF9IX0RFUFMpIHJhdGhlciB0aGFuIGxpYmJmZC5oIGFuZAotCSQoUkVDT05GSUcpLgotCSgkKEJGRF9NQUNISU5FUyksICQoQkZEX0JBQ0tFTkRTKSk6IExpa2V3aXNlLgotCSgkKE9QVElPTkFMX0JBQ0tFTkRTKSk6IExpa2V3aXNlLgotCShzdG1wLWJmZC5oKTogSnVzdCBzdWJzdGl0dXRlIGZvciBCRkRfSE9TVF82NEJJVF9MT05HLCByYXRoZXIgdGhhbgotCWxvb2tpbmcgdGhyb3VnaCBzeXNkZXAuaC4KLQkqIGJmZC1pbi5oIChCRkRfSE9TVF82NEJJVF9MT05HKTogRGVmaW5lOyBzZXQgYnkgTWFrZWZpbGUuCi0JKEJGRF9IT1NUXzY0X0JJVCk6IERlZmluZSBiYXNlZCBvbiBCRkRfSE9TVF82NEJJVF9MT05HLgotCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBMaWtld2lzZS4KLQkoaW50NjRfdHlwZSwgdWludDY0X3R5cGUpOiBEb24ndCBkZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhcmNodXJlcy5jLCBiZmQuYywgc3JlYy5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkqIGVsZmNvcmUuaDogQ2hlY2sgSEFWRV9TWVNfUFJPQ0ZTX0ggcmF0aGVyIHRoYW4gSEFWRV9QUk9DRlMuCi0JKiBseW54LWNvcmUuYzogSW5jbHVkZSBzdHVmZiBmcm9tIG9sZCBob3N0cy9seW54LmguCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDaGVjayBIQVZFX0ZOQ1RMIGFuZCBkZWZpbmVkIChGX0dFVEZMKSwKLQlyYXRoZXIgdGhhbiBOT19GQ05UTC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KTogQ2hlY2sgSE9TVF9IUFBBSFBVWCBhbmQgISBfX1NURENfXwotCXJhdGhlciB0aGFuIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUi4KLQkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxlcnJuby5oPi4gIEluY2x1ZGUgVFJBRF9IRUFERVIgaWYgaXQKLQlpcyBkZWZpbmVkLgotCSogaG9zdHMvKi5oOiBSZW1vdmUgYWxsIGhlYWRlciBmaWxlcyB3aGljaCBtZXJlbHkgaW5jbHVkZSwKLQlkZWNsYXJlLCBhbmQgZGVmaW5lIHRoaW5ncy4gIExlYXZlIGhlYWRlciBmaWxlcyB3aGljaCBkZWZpbmUKLQlpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdHJhZC1jb3JlLmMuCi0KLQkqIGFjbG9jYWwubTQgKEJGRF9CSU5BUllfRk9QRU4pOiBEZWZpbmUuCi0JKEJGRF9DQ19GT1JfQlVJTEQpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IFVzZSBCRkRfQ0NfRk9SX0JVSUxELgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwICA1IDE5OjM1OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogRG9uJ3QgdHJ5IHRvIGdyZXAgLi4vTWFrZWZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29mZi1zcGFyYy5jIChDQUxDX0FEREVORCk6IERvbid0IHNldCB0aGUgYWRkZW5kIHRvIHRoZSB2YWx1ZSBvZgotCWEgZ2xvYmFsIHN5bWJvbC4KLQotVHVlIFNlcCAgNSAxMjo0ODoyNiAxOTk1ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IGkzODZwZV92ZSAtPiBpMzg2cGVfdmVjLgotCi1Nb24gU2VwICA0IDE0OjAyOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IEluY29ycG9yYXRlIGhvc3QgTWFrZWZpbGUgZnJhZ21lbnRzIGJ5IHNldHRpbmcKLQlzaGVsbCB2YXJpYWJsZXMuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQy4gIFN1YnN0aXR1dGUgQ0ZMQUdTLCBIREVGSU5FUyBhbmQKLQlBUi4gIENhbGwgQUNfUFJPR19JTlNUQUxMLiAgU3Vic3RpdHV0ZSBDQ19GT1JfQlVJTEQsIGNob29zaW5nIGEKLQl2YWx1ZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjb2RlIGlzIGJlaW5nIGNvbXBpbGVkIGJ5IGEgY3Jvc3MKLQljb21waWxlci4gIERvbid0IHN1YnN0aXR1dGUgaG9zdF9tYWtlZmlsZV9mcmFnIG9yIGZyYWdzLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUgdG8gZGVmaW5lIGxvY2FsIEFDX1BST0dfQ0MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfUFJPR1JBTSk6IFNldCB0byBASU5TVEFMTF9QUk9HUkFNQC4KLQkoSU5TVEFMTF9EQVRBKTogU2V0IHRvIEBJTlNUQUxMX0RBVEFALgotCShBUik6IFNldCB0byBAQVJALgotCShDQyk6IERlZmluZSBhcyBAQ0NALgotCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCi0JKENDX0ZPUl9CVUlMRCk6IFNldCB0byBAQ0NfRk9SX0JVSUxEQC4KLQkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKEFMTF9DRkxBR1MpOiBDaGFuZ2UgJChIREVGSU5FUykgdG8gQEhERUZJTkVTQC4gIE1vdmUgJChDRkxBR1MpCi0JYWZ0ZXIgb3RoZXIgb3B0aW9ucy4KLQkoY29uZmlnLnN0YXR1cyk6IFJlbW92ZSBkZXBlbmRlbmN5IHVwb24gQGZyYWdzQC4KLQkqIGNvbmZpZy8qLm1oLCBjb25maWcvUkVBRE1FOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy5iZmQ6IFJld3JpdGUgdG8gaW5jb3Jwb3JhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNYWtlZmlsZQotCWZyYWdtZW50cyBieSBzZXR0aW5nIHNoZWxsIHZhcmlhYmxlcywgcmF0aGVyIHRoYW4gbWVyZWx5IHJldHVybmluZwotCXRoZSBuYW1lIG9mIGEgTWFrZWZpbGUgZnJhZ21lbnQuCi0JKiBjb25maWd1cmUuaW46IFVzZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IGNvbmZpZy5iZmQgcmF0aGVyIHRoYW4KLQlsb29raW5nIGF0IHRoZSB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnQgZmlsZXMuICBEb24ndCBzdWJzdGl0dXRlCi0JdGFyZ2V0X21ha2VmaWxlX2ZyYWcuICBEbyBzdWJzdGl0dXRlIFRERUZJTkVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEB0YXJnZXRfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKEFMTF9DRkxBR1MpOiBDaGFuZ2UgJChUREVGSU5FUykgdG8gQFRERUZJTkVTQC4KLQkqIGNvbmZpZy8qLm10OiBSZW1vdmUuCi0KLU1vbiBTZXAgIDQgMDM6MTM6MjggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IGNoYW5nZXF1b3RlIGxpbmVzIGFyb3VuZCAiaVszNDVdODYiIHBhdHRlcm5zCi0Jc2VjdGlvbiBvZiBjb3JlIGZpbGUgc3VwcG9ydC4KLQotU3VuIFNlcCAgMyAxMTozMTo1OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSB0byB1c2UgdGhlCi0JZ2VuZXJpYyB2ZXJzaW9uLgotCi1GcmkgU2VwICAxIDE3OjA4OjQwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBBZGQgSW1hZ2VCYXNlIHRvCi0JZW50cnksIHRleHRfc3RhcnQgYW5kIGRhdGFfc3RhcnQuCi0KLUZyaSBTZXAgIDEgMTg6MDY6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogUmVtb3ZlICQoVERFUEZJTEVTKS4KLQkqIGNvbmZpZy9hcG9sbG8ubXQgKFRERVBGSUxFUyk6IFJlbW92ZS4KLQkqIGNvbmZpZy9SRUFETUU6IFVwZGF0ZS4KLQotCSogY29uZmlndXJlLmluOiBGb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgc2V0IENPUkVGSUxFIGFuZAotCUNPUkVGTEFHIGJhc2VkIG9uIHRoZSBjYW5vbmljYWwgaG9zdCBuYW1lLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfQ0ZMQUdTKTogQWRkIEBDT1JFRkxBR0AuCi0JKE9GSUxFUyk6IFJlcGxhY2UgJChIREVQRklMRVMpIHdpdGggQENPUkVGSUxFQC4KLQkqIGNvZmYtcnM2MDAwLmM6IENoZWNrIEFJWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfQUlYIGZvciBjb3JlIGZpbGUKLQlzdXBwb3J0IHJvdXRpbmVzLiAgQ2hlY2sgTFlOWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfTFlOWC4KLQkqIGx5bngtY29yZS5jOiBDaGVjayBMWU5YX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9MWU5YLgotCSogaTM4Nmx5bnguYzogTGlrZXdpc2UuCi0JKiBtNjhrbHlueC5jOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jOiBMaWtld2lzZS4KLQkqIHJzNjAwMC1jb3JlLmM6IENoZWNrIEFJWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfQUlYLgotCSogKi1jb3JlLmM6IENvbW1lbnQgY2hhbmdlcy4KLQkqIGNvbmZpZy9kZWNzdGF0aW9uLm1oIChIREVQRklMRVMpOiBSZW1vdmUuCi0JKEhERUZJTkVTKTogUmVtb3ZlIC1EVFJBRF9DT1JFLgotCSogY29uZmlnL2lyaXgzLm1oIChSQU5MSUIpOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDQubWggKEhERVBGSUxFUywgUkFOTElCKTogUmVtb3ZlLgotCShIREVGSU5FUyk6IFJlbW92ZSAtRElSSVhfQ09SRS4KLQkqIGNvbmZpZy9yaXNjb3MubWggKFJBTkxJQiwgSERFUEZJTEVTKTogUmVtb3ZlLgotCShIREVGSU5FUyk6IFJlbW92ZSAtRFRSQURfQ09SRS4KLQkqIGNvbmZpZy9uY3IzMDAwLm1oIChBUl9GTEFHUywgUkFOTElCKTogUmVtb3ZlLgotCSogY29uZmlnL3VsdHJhMy5taCAoUkFOTElCKTogUmVtb3ZlLgotCSogY29uZmlnL2FpeDQubWgsIGNvbmZpZy9hbHBoYW9zZi5taCwgY29uZmlnL2FtaXgubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9hcG9sbG8ubWgsIGNvbmZpZy9kZWx0YTY4Lm1oLCBjb25maWcvZGVsdGE4OC5taDogUmVtb3ZlLgotCSogY29uZmlnL2RweDIubWgsIGNvbmZpZy9lc2l4Lm1oLCBjb25maWcvaGFycmlzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaHAzMDAubWgsIGNvbmZpZy9ocDMwMGJzZC5taCwgY29uZmlnL2hwcGFic2QubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9ocHBhaHB1eC5taCwgY29uZmlnL2hwcGFvc2YubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2YWl4Lm1oLCBjb25maWcvaTM4NmJzZC5taDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZsaW51eC5taCwgY29uZmlnL2kzODZtYWNoMy5taDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZzY28ubWgsIGNvbmZpZy9pMzg2di5taCwgY29uZmlnL2kzODZ2NC5taDogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg1Lm1oLCBjb25maWcvbTg4a21hY2gzLm1oLCBjb25maWcvbWlwc2JzZC5taDogUmVtb3ZlLgotCSogY29uZmlnL21pcHNtYWNoMy5taCwgY29uZmlnL25ld3MtbWlwcy5taDogUmVtb3ZlLgotCSogY29uZmlnL25ld3MubWgsIGNvbmZpZy9wYzUzMm1hY2gubWgsIGNvbmZpZy9yaXNjaXgubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9yczYwMC5taCwgY29uZmlnL3JzNjAwMGx5bngubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCwgY29uZmlnL3N0cmF0dXMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9zeW1tZXRyeS5taCwgY29uZmlnL3N5c3Y0Lm1oLCBjb25maWcvdGFob2UubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy92YXhic2QubWgsIGNvbmZpZy92YXh1bHQubWgsIGNvbmZpZy92YXh1bHQyLm1oOiBSZW1vdmUuCi0KLUZyaSBTZXAgIDEgMTU6MTg6NTAgMTk5NSAgS2F6dW1vdG8gS29qaW1hICA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgY2hhbmdlIGEgRFRfSU5JVCBvcgotCURUX0ZJTkkgZW50cnkgaWYgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbCBpcyBub3QgaW4gdGhlIGhhc2ggdGFibGUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzCi0JYW5kIHdhbnRfaGRyX2luX3NlZyBmaWVsZHMuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRGVmaW5lIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogSW5pdGlhbGl6ZSBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGFuZAotCXdhbnRfaGRyX2luX3NlZy4KLQkqIGVsZi5jIChnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENhbGwgY3JlYXRlX3Byb2dyYW1faGVhZGVycwotCWJhY2tlbmQgcm91dGluZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDaGVjayB3YW50X2hkcl9pbl9zZWcgYmFja2VuZCBmaWVsZC4gIENhbGwKLQljcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGJhY2tlbmQgcm91dGluZS4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gbm9uIGFsbG9jYXRlZAotCXNlY3Rpb25zIHdoZW4gY3JlYXRpbmcgYW4gZXhlY3V0YWJsZS4KLQotCSogZWxmY29kZS5oIChlbGZfc3dhcF9waGRyX2luKTogTWFrZSBub24gc3RhdGljLgotCShlbGZfc3dhcF9waGRyX291dCk6IE1ha2Ugbm9uIHN0YXRpYy4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfc3dhcF9waGRyX2luKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX2luKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9vdXQpOiBEZWNsYXJlLgotCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfY29sbGVjdF9zaHVmZmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3Bkcik6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSk6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1GcmkgU2VwICAxIDEzOjIwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEZpeCB0eXBvLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEhhbmRsZSBpbmRpcmVjdCBhbmQKLQl3YXJuaW5nIHN5bWJvbHMuICBJZiBhbnkgc2VjdGlvbiBpcyBuYW1lZCAuZ251Lndhcm5pbmcuWFhYLCB0cmVhdAotCXRoZSBjb250ZW50cyBhcyBhIHdhcm5pbmcgdG8gYmUgaXNzdWVkIGlmIHRoZSBzeW1ib2wgWFhYIGlzCi0JcmVmZXJlbmNlZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEZvciBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbCwganVzdAotCW91dHB1dCB0aGUgc3ltYm9sIGl0IHBvaW50cyB0by4KLQotCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBib3RoZXIgdG8gc2V0IGJmZF9lcnJvcgotCWlmIGJmZF9oYXNoX2FsbG9jYXRlIGZhaWxzLCBzaW5jZSBpdCB3aWxsIGFscmVhZHkgYmUgc2V0LgotCShnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogTGlrZXdpc2UuCi0JKGFyY2hpdmVfaGFzaF9uZXdmdW5jKTogTGlrZXdpc2UuCi0JKGhhc2hfZW50cnlfYmZkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBQYXNzIG5ldyBhcmd1bWVudHMgdG8gd2FybmluZwotCWNhbGxiYWNrLiAgQWxsb2NhdGUgYSBuZXcgd2FybmluZyB1c2luZyB0aGUgaGFzaCB0YWJsZSBuZXdmdW5jLgotCVVzZSBiZmRfaGFzaF9yZXBsYWNlIHRvIHVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUsIHJhdGhlcgotCXRoYW4gYXNzdW1pbmcgd2UgY2FuIGNvcHkgdGhlIGZpZWxkcyB3aXRoIHN0cnVjdHVyZSBhc3NpZ25tZW50LgotCi0JKiBoYXNoLmMgKGJmZF9oYXNoX3JlcGxhY2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2hhc2hfcmVwbGFjZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDEgMDg6MTI6NTAgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtaXBzKnZyNDMwMC0qLWVsZiogdGFyZ2V0LgotCSogY29uZmlnL21pcHNidnI0MzAwLm10OiBBZGRlZC4KLQotVGh1IEF1ZyAzMSAxNjowMDo1MyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogYmZkLWluLmggKFBFIFNUVUZGKTogRGVsZXRlZC4KLQkqIGJmZC5jICh0ZGF0YS0+cGVfb2JqX2RhdGEpOiBOZXcuCi0JKGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogY29mZi1pMzg2LmMsIGNvZmYtYXJtLmMgKGNvZmZfKi1ydHlwZV90b19ob3d0byk6IEdldCBpbWFnZSBiYXNlIGZyb20KLQluZXcgcGxhY2UuCi0JKiBsaWJjb2ZmLmgsIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IERlbGV0ZQotCShjb2ZmX21rb2JqZWN0LCBjb2ZmX21rb2JqZWN0X2hvb2spOiBDb25kaXRpb25hbGx5IGJ1aWxkLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExvb2sgaW4gbmV3IHBsYWNlLgotCShhZGRfZGF0YV9lbnRyeSwgZmlsbF9wZV9oZWFkZXJfaW5mbyk6IERlbGV0ZWQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIFBFIHN0dWZmLgotCShjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogY29mZnN3YXAuaDogUmVtb3ZlIFBFIHN0dWZmLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZSk6IE5ldy4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiB0YXJnZXRzLmMgKF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIHBlaWNvZGUuaDogTmV3IGZpbGUuCi0KLVRodSBBdWcgMzEgMTE6NDk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogQWRkIGV4dGVybiAiQyIgaWYgX19jcGx1c3BsdXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjb252ZXJ0IGEgcmVsb2MKLQlhZ2FpbnN0IGFuIGFic29sdXRlIHN5bWJvbCBpbnRvIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uCi0KLVRodSBBdWcgMzEgMDg6MDA6MTQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQkKLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jKTogRml4IGNvbW1vbiBzaXplIHByb2JsZW0uCi0JKGkzY29mZl9vYmplY3RfcCk6IERlbGV0ZS4KLQotV2VkIEF1ZyAzMCAyMDo0MToyNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChkZWxldGVtZWFjb2ZmX2FybV9yZWxvYyk6IERlbGV0ZWQuCi0JKGFybTI2KTogTm90IHBhcnRpYWwgaW5wbGFjZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QKLQlkbyBwYWdlIGFsaWduaW5nIGlmIENPRkZfUEFHRV9TSVpFIGlzbid0IGRlZmluZWQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogVXBkYXRlIGltYWdlIGJhc2UgY29ycmVjdGx5LgotCi1UdWUgQXVnIDI5IDEzOjUwOjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKToKLQlDb21waWxlIGV2ZW4gaWYgQ09GRl9QQUdFX1NJWkUgaXNuJ3QgZGVmaW5lZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmF0ZV9yZWxvY19zZWN0aW9uKTogV3JpdGUKLQliYXNlIGZpbGUgaW5mbyBhcyBydmFzLgotCSogY29mZi1hcm0uYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlYWwgd2l0aCByZWxvYyAxMS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlICNpZjBlZCBjb2RlCi0JT25seSByZW1vdmUgZW1wdHkgc2VjdGlvbnMgaW4gUEUgaW5tYWdlIGZpbGVzLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogcmVnZW5lcmF0ZWQuCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvKTogTmV3IGVudHJ5IGF0IDExLgotCShhcm1fcmVsb2NfdHlwZV9sb29rdXApIDogVW5kZXJzdGFuZCB0eXBlIDExLgotCSogY29mZi1pMzg2LmMgKGhvd3RvX3RhYmxlKTogZml4IG5hbWUgb2YgcnZhIHR5cGUuCi0JKGNvZmYtaTM4Nl9ydHlwZV90b19ob3d0byk6IFVuZGVyc3RhbmQgUl9JTUFHRUJBU0UgdHlwZS4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogLmVkYXRhIGlzIGRhdGEuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogR2V0IHBhZ2Ugc2l6ZSByaWdodCBmb3IgUEUuCi0JUGFnZXNpemUgaW5mbyBpcyBvbmx5IHZhbGlkIGluIFBFIGltYWdlIGZpbGVzLgotCShmaWxsX3BlX2hlYWRlcl9pbmZvKTogRml4IGZpZWxkcy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgZW5kX29mX2ltYWdlIGNhbGMuCi0JKF9iZmRfY29mZl9nZW5lcmF0ZV9yZWxvY19zZWN0aW9uKTogUmVtb3ZlIG9ycGhhbmVkIGNvbW1lbnQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogRG9uJ3QgYWx3YXlzIGFkZCBJTUFHRV9CQVNFLgotCVN3YXAgaW4gUEUgaGVhZGVyLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldHVwIFBFIGZsYWdzIGNvcnJlY3RseS4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19SVkEpOiBOZXcgZmllbGQuCi0KLVRodSBBdWcgMjQgMTc6NDk6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgaW5jbHVkZSBsaW5lIG51bWJlcnMgZm9yCi0JYSBzZWN0aW9uIGlmIGl0cyBvdXRwdXQgc2VjdGlvbiBoYXMgbm8gY29udGVudHMuCi0KLVdlZCBBdWcgMjMgMTY6NDg6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBBZGQgcGFyZW50aGVzZXMgdG8gRklYCi0JZXhwcmVzc2lvbiB0byBhdm9pZCBjb21waWxlciBidWcgb24gSFAtVVggOS4wMS4KLQotV2VkIEF1ZyAyMyAwOTo0OTozOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAocGVfdmFsdWUpOiBVbmFuc2lmeS4KLQotTW9uIEF1ZyAyMSAxNzo0OToyOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2xpbmtfc3Vic3lzdGVtKTogVHVybiBlbnVtIGludG8gI2RlZmluZXMuCi0JKGJmZF9saW5rX3BlX2luZm9fZHZhbCk6IE5ldwotCShiZmRfbGlua19zdGFja19oZWFwKTogUmVuYW1lZCBhbmQgbWFzc2FnZWQgaW50byBiZmRfbGlua19wZV9pbmZvLgotCSogYmZkLWluMi5oOiByZWJ1aWx0LgotCSogYmZkLmMgKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlbGV0ZWQuCi0JKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZmlsbF9wZV9oZWFkZXJfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgbmV3IGZ1bmN0aW9uLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWx6ZSBsaW5rX2RhdGEgaWYgbm90IHNldC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfZmluYWxfbGlua19pbmZvKTogUmVtb3ZlIHBlIHJhbmRvbW5lc3MuCi0JKGRvcmVzX2NvbSk6IFVwZGF0ZSBpbmZvIGluIGJmZF9saW5rX3BlX2luZm9fZHZhbC4KLQkocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IFVzZSB0aGUgYmZkX2xpbmtfcGVfaW5mb19kdmFsLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IFJlbW92ZSBQRSBzdHVmZiwgaW5pdGlhbGl6ZQotCWNvZmZfZGF0YS0+bGlua19pbmZvLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX1thb3V0fGZpbGVoZHJdX291dCk6IFVzZSBpbmRpcmVjdCBQRSBwb2ludGVyLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSByZWFsIGltYWdlYmFzZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUubGlua19pbmZvKTogTmV3IGZpZWxkLgotCi1Nb24gQXVnIDIxIDExOjEwOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogSWYgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSBmb2xsb3dzIGFuCi0JdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlLCBjaGFuZ2UgdGhlIHR5cGUgdG8gdW5kZWZpbmVkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogRG9uJ3QgcmVjb3JkIGFuCi0JdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlIGFzIGRlZmluZWQsIGluIGNhc2UgaXQgdHVybnMgaW50byBhIHJlYWwKLQl1bmRlZmluZWQgcmVmZXJlbmNlIGxhdGVyIGluIHRoZSBzYW1lIGFyY2hpdmUuCi0KLVRodSBBdWcgMTcgMTY6Mjk6MDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X3NlY3Rpb24pOiBDYXN0IHZhbHVlIGZvciB1c2VkX2J5X2JmZCBmaWVsZAotCXRvIFBUUiwgbm90IGNvZmZfc2VjdGlvbl90ZGF0YSBwb2ludGVyLCBzaW5jZSBQVFIgaXMgdGhlIHJlYWwgdHlwZQotCW9mIHRoZSBmaWVsZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IERpdHRvLgotCi1UaHUgQXVnIDE3IDE0OjQ0OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBsaW5raW5nIFNQQVJDIFN1bk9TIFBJQyBjb21waWxlZCBjb2RlLgotCSogc3Vub3MuYyAoU1BBUkNfUExUX1BJQ19XT1JEMCk6IERlZmluZS4KLQkoU1BBUkNfUExUX1BJQ19XT1JEMSwgU1BBUkNfUExUX1BJQ19XT1JEMik6IERlZmluZS4KLQkoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBnb3Rfb2Zmc2V0IGFuZCBwbHRfb2Zmc2V0Ci0JZmllbGRzLgotCShzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBhbmQKLQlkeW5hbWljX3NlY3Rpb25zX25lZWRlZCBmaWVsZHMuCi0JKHN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBDYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBzdW5vc19zY2FuX3JlbG9jcyBiZWZvcmUKLQljaGVja2luZyB3aGV0aGVyIHdlIG5lZWQgdG8gc2V0IHVwIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uCi0JRGVmaW5lIF9fR0xPQkFMX09GRlNFVF9UQUJMRSBpZiBhbnl0aGluZyByZWZlcnJlZCB0byBpdC4KLQkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gIFVzZQotCXBsdF9vZmZzZXQgZmllbGQ7IG9ubHkgcHV0IHN5bWJvbCBpbiAucGx0IGlmIGl0IGlzIG5vdCBkZWZpbmVkIGJ5Ci0JYSByZWd1bGFyIG9iamVjdC4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuICBIYW5kbGUgYmFzZSByZWxhdGl2ZSByZWxvY3MuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBTdG9yZSBkeW5vYmogaW4gbG9jYWwgdmFyaWFibGUuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogQ2hlY2sgcGx0X29mZnNldCByYXRoZXIgdGhhbgotCWNoZWNraW5nIHdoZXRoZXIgc3ltYm9sIGlzIGluIC5wbHQgc2VjdGlvbi4gIElmIHN5bWJvbCBpcyBkZWZpbmVkCi0JaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLCB1c2UgU1BBUkNfUExUX1BJQ19XT1JEWzAxMl0sIGFuZCBkb24ndAotCWFkZCBhIEpNUF9UQkwgcmVsb2MuCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBBZGQgY29udGVudHMgYW5kIHJlbG9jYXRpb25wIGZpZWxkcy4KLQlJZiBwbHRfb2Zmc2V0IGlzIHNldCwgcmVkaXJlY3QgcmVsb2NhdGlvbiB0byBQTFQuICBJZiB0aGlzIGlzIGEKLQliYXNlIHJlbGF0aXZlIHJlbG9jLCByZWRpcmVjdCByZWxvY2F0aW9uIHRvIEdPVC4gIENoZWNrCi0JZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGQgcmF0aGVyIHRoYW4gd2hldGhlciBkeW5vYmogaXMgc2V0LgotCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogQ2hlY2sgZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGQKLQlyYXRoZXIgdGhhbiB3aGV0aGVyIGR5bm9iaiBpcyBzZXQuICBEb24ndCBkaWUgaWYgLm5lZWQgYW5kIC5ydWxlcwotCXNlY3Rpb25zIHdlcmUgbm90IGNyZWF0ZWQuCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBNYXJrIFBDMTAsIFBDMjIsIGFuZCBKTVBfVEJMIGVudHJpZXMKLQlQQyByZWxhdGl2ZS4gIE1hcmsgUEMxMCBjb21wbGFpbl9vdmVyZmxvd19kb250LiAgTWFyayBQQzIyIGFuZAotCUpNUF9UQkwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiBpbmZvLT5zaGFyZWQgaXMgc2V0LCBzZXQgRFlOQU1JQy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogQ2FsbCBjaGVja19keW5hbWljX3JlbG9jIGZvciBhbGwKLQlyZWxvY3MuICBQYXNzIGNvbnRlbnRzIGFuZCAmcmVsb2NhdGlvbi4gIERvbid0IHdhcm4gYWJvdXQgYW4KLQl1bmRlZmluZWQgc3ltYm9sIHVudGlsIGNoZWNrX2R5bmFtaWNfcmVsb2MgaGFzIGJlZW4gY2FsbGVkLiAgRG9uJ3QKLQl3YXJuIGFib3V0IGFuIHVuZGVmaW5lZCBzeW1ib2wgZm9yIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuICBGb3IgYSBiYXNlIHJlbGF0aXZlCi0JcmVsb2MsIGFsd2F5cyB0cmVhdCByX2luZGV4IGFzIGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGNvbnRlbnRzIGFuZAotCXJlbG9jYXRpb24gYXJndW1lbnQgdG8gY2hlY2tfZHluYW1pY19yZWxvYyBlbnRyeSBwb2ludC4KLQkoc3RydWN0IGFvdXRkYXRhKTogQWRkIGxvY2FsX2dvdF9vZmZzZXRzIGZpZWxkLgotCi1XZWQgQXVnIDE2IDAxOjAzOjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBGaXggYnVnIGluIGxhc3QgY2hhbmdlLgotCi1Nb24gQXVnIDE0IDExOjM5OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBIYW5kbGUgYSBtYWNoaW5lIG9mCi0JYmZkX21hY2hfc3BhcmMgb3IgYmZkX21hY2hfc3BhcmM2NC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhIHN5bWJvbCBpcyBhIHdlYWsKLQlkZWZpbml0aW9uLCBhZGQgaXQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGFueSBkeW5hbWljCi0Jb2JqZWN0IG1lbnRpb25zIGl0LiAgSWYgd2UgZG8gYWRkIGl0LCBtYWtlIHN1cmUgd2UgYWRkIHRoZQotCWNvcnJlc3BvbmRpbmcgcmVhbCBzeW1ib2wuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBBZGp1c3QgYSB3ZWFrIGRlZmluZWQgc3ltYm9sIHdoaWNoIHdlCi0JcHV0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgZXZlbiBpZiBubyByZWd1bGFyIG9iamVjdCByZWZlcnMKLQl0byBpdC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogV2hlbiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIGRvbid0IGFsbG9jYXRlIHNwYWNlIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYQotCWxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIGFzc2VydGlvbgotCXRvIGFjY2VwdCBzeW1ib2wgd2l0aCB3ZWFrZGVmIHNldC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJhcnksIGRvbid0IGNvcHkgb3ZlciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBsb2NhbAotCXN5bWJvbC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotU3VuIEF1ZyAxMyAwMDo0MDo1OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKFJfSFBQQV9CRUdJTl9CUlRBQik6IERlZmluZS4KLQkoUl9IUFBBX0VORF9CUlRBQik6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9CRUdJTl9CUlRBQiBhbmQgUl9FTkRfQlJUQUIuCi0KLVRodSBBdWcgMTAgMTU6NTM6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCB0aGUgYXJyYXkgZGltZW5zaW9ucwotCXdoZW5ldmVyIHhfZmNuYXJ5IGlzIG5vdCBiZWluZyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZSwgcmF0aGVyCi0JdGhhbiBvbmx5IGZvciBhbiBhcnJheS4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAgOCAxNjozNDo1NyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIG1vc3QKLQlvZiBzcGVjaWFsIGNhc2Ugc3R1ZmYgZm9yIFBFLiAgTm93IGhhbmRsZWQgYnkgcmVsb2NzLgotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IFNwZWNpYWwgY2FzZSBvZiBQRSB0eXBlIDdzLgotCShob3d0b190YWJsZSk6IFR5cGUgNyBpcyBkaXIzMi1ydmEuCi0KLVR1ZSBBdWcgIDggMTA6MTU6NDMgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgYWl4NCBleHBsaWNpdGx5LgotCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9EQVRBX1NJWkVfRklFTEQpOiBOZXcgbWFjcm8gdG8gZ2V0IGEgdGhlIHNpemUKLQlvZiBhIGNvcmUgZHVtcCdzIGRhdGEgc2VjdGlvbi4gIFByb3ZpZGUgYWx0ZXJuYXRlIGRlZmluaXRpb24gZm9yIGFpeDQuCi0JKFNBVkVfRklFTEQpOiBTaW1pbGFybHkgZm9yIHNhdmUgc3RhdGUgZmllbGQgKHJlZ2lzdGVyIGluZm8pLgotCShTVEFDS19FTkRfQUREUik6IFByb3ZpZGUgZGVmaW5pdGlvbiBzdWl0YWJsZSBmb3IgYWl4NC4KLQkqIGNvbmZpZy97YWl4NC5taCxhaXg0Lm10fTogTmV3IGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0JKiBob3N0cy9haXg0Lmg6IExpa2V3aXNlLgotCi1Nb24gQXVnICA3IDIzOjAzOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogQ2FzdCBpbml0aWFsaXphdGlvbnMKLQl0byBhdm9pZCB3YXJuaW5ncy4KLQotTW9uIEF1ZyAgNyAxNDo1MTowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9kZWNvZGVfc3ltY2xhc3MpOiBIYW5kbGUgYWJzb2x1dGUgc3ltYm9scyBieSBjaGVja2luZwotCXRoZSBTT00gdHlwZSAoc2luY2UgdGhleSB3aWxsIHJhcmVseSBpZiBldmVyIGJlIGluIHRoZSBhYnNvbHV0ZQotCXNlY3Rpb24pLgotCi1XZWQgQXVnICA2IDA5OjEyOjUwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYzY0KTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGNwdS1zcGFyYy5jIChzcGFyY19hcmNoX2luZm8pOiBSZW5hbWVkIGZyb20gYXJjaF9pbmZvX3N0cnVjdC4KLQkoc3BhcmM2NF9hcmNoX2luZm8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShiZmRfc3BhcmNfYXJjaCk6IExpbmsgaW4gc3BhcmM2NF9hcmNoX2luZm8uCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl94eHgpOiBSZW5hbWVkIGZyb20gZWxmNjRfeHh4LgotCShzcGFyYzY0X2VsZl9vYmplY3RfcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wKTogRGVmaW5lLgotCSogY29uZmlnL3NwYXJjNjQtZWxmLm10IChTRUxFQ1RfVkVDUyk6IEFkZCBiZmRfZWxmMzJfc3BhcmNfdmVjLgotCi1TYXQgQXVnICA1IDAwOjA0OjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20gKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBSZXR1cm4gLTEgb24gZXJyb3IuICBDb21wdXRlCi0JcmV0dXJuIHZhbHVlIHdpdGggc2l6ZW9mIChhcmVsZW50ICopLCBub3Qgc2l6ZW9mIChhcmVsZW50KS4KLQotV2VkIEF1ZyAgMiAxMjozMjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiB0aGUgc2VjdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotCXNoX2xpbmsgZmllbGQgb2YgYSByZWxvYyBzZWN0aW9uIGlzIG5vdCBhIHN5bWJvbCB0YWJsZSwgYW5kIHRoZQotCWZpbGUgY29udGFpbnMgYSBzaW5nbGUgc3ltYm9sIHRhYmxlLCBjbG9iYmVyIHRoZSBzaF9saW5rIGZpZWxkIG9mCi0JdGhlIHJlbG9jIHNlY3Rpb24gdG8gcG9pbnQgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQotVHVlIEF1ZyAgMSAxMDowOTowMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChob3d0byByZWxvYyBBUk0yNik6IENoYW5nZSBzaXplIGZyb20gMyB0byAyLgotCShob3d0byByZWxvYyBBUk0yNkQpOiBMaWtld2lzZS4KLQotTW9uIEp1bCAyNCAxNDoxNzo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBVc2UgdGhlIGxpbmUganVzdCBiZWZvcmUKLQl0aGUgb2Zmc2V0LCBub3QgdGhlIG9uZSBqdXN0IGFmdGVyLiAgQnJlYWsgb3V0IG9mIHRoZSBsb29wIGFmdGVyCi0JZmluZGluZyBhIGZ1bmN0aW9uIHBhc3QgdGhlIG9mZnNldCwgbm90IG1lcmVseSB3aGVuIGZpbmRpbmcgYQotCWZ1bmN0aW9uIHdpdGggYSBsaW5lIGRlZmluZWQuCi0KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogV2hlbiBoYW5kbGluZyBzdGFiczoKLQljb3JyZWN0IHNldHRpbmcgb2Ygc3ltX3B0cl9lbmQgdG8gY29uc2lkZXIgc3ltYm9scyBza2lwcGVkIHdoZW4KLQlzZXR0aW5nIHN5bV9wdHI7IGRvbid0IGxlYXZlIGxvb3AgZWFybHkgdW5sZXNzIGFuIE5fRlVOIGlzIGZvdW5kCi0Jd2l0aCBhIGxhcmdlciB2YWx1ZS4KLQotCSogY29mZi1zaC5jIChzaF9jb2ZmX2hvd3Rvcyk6IE1hcmsgUl9TSF9QQ0RJU1A4QlkyIGFuZCBSX1NIX1BDRElTUAotCWFzIFBDIHJlbGF0aXZlLiAgRGVzY3JpYmUgUl9TSF9JTU0xNi4gIEFkZCBlbnRyaWVzIGZvcgotCVJfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMzIsIFJfU0hfVVNFUywgUl9TSF9DT1VOVCwgYW5kCi0JUl9TSF9BTElHTi4KLQkoU1dBUF9JTl9SRUxPQ19PRkZTRVQpOiBEZWZpbmUuCi0JKFNXQVBfT1VUX1JFTE9DX09GRlNFVCk6IERlZmluZS4KLQkoQ0FMQ19BRERFTkQpOiBEZWZpbmUuCi0JKHNoX3JlbG9jKTogQ2hhbmdlIHN5bV92YWx1ZSBhbmQgYWRkciB0byB0eXBlIGJmZF92bWEuICBTa2lwIHJlbG9jCi0JdHlwZXMgb3RoZXIgdGhhbiBSX1NIX0lNTTMyIGFuZCBSX1NIX1BDRElTUCBvbiBhbiBleHRlcm5hbCBzeW1ib2wuCi0JKGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkoc2hfcmVsYXhfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9TSF9QQ0RJU1Agb24gYW4gZXh0ZXJuYWwgc3ltYm9sLgotCShzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsCi0JX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLCBub3QgY29mZl9saW5rX2dldF9zeW1ib2xzLiAgQ2FsbAotCV9iZmRfY29mZl9mcmVlX3N5bWJvbHMsIG5vdCBjb2ZmX2xpbmtfZnJlZV9zeW1ib2xzLiAgQ2FsbAotCV9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSwgbm90IGNvZmZfcmVhZF9zdHJpbmdfdGFibGUuCi0JKGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfZ2V0X3N5bWJvbHMpOiBNb3ZlIHRvIGNvZmZnZW4uYy4KLQkoY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfZnJlZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogVXNlIF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZS4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBVc2UgY2FjaGVkIHNlY3Rpb24gY29udGVudHMgaWYgYXZhaWxhYmxlLgotCVVzZSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IGNhbGwgYmZkX3NlZWsuCi0JKGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE9ubHkgZGVmaW5lIGlmIG5vdAotCWFscmVhZHkgZGVmaW5lZC4KLQkoY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChidWlsZF9zdHJpbmdfdGFibGUpOiBSZW1vdmUuCi0JKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvbGQKLQljb2ZmX2xpbmtfZ2V0X3N5bWJvbHMgaW4gY29mZmxpbmsuYy4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tIG9sZAotCWNvZmZfcmVhZF9zdHJpbmdfdGFibGUgaW4gY29mZmxpbmsuYy4KLQkoX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJtbyBvbGQKLQljb2ZmX2xpbmtfZnJlZV9zeW1ib2xzIGluIGNvZmZsaW5rLmMuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogVXNlIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scwotCXJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIHN5bWJvbHMgZGlyZWN0bHkuICBUbyBmcmVlIHRoZW0sIGNhbGwKLQlfYmZkX2NvZmZfZnJlZV9zeW1ib2xzLiAgVXNlIF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSByYXRoZXIKLQl0aGFuIGJ1aWxkX3N0cmluZ190YWJsZS4KLQkqIGxpYmNvZmYtaW4uaCAob2JqX2NvZmZfa2VlcF9zeW1zKTogRGVmaW5lLgotCShvYmpfY29mZl9rZWVwX3N0cmluZ3MpOiBEZWZpbmUuCi0JKGNvZmZfZGF0YV90eXBlKTogQWRkIGZpZWxkcyBrZWVwX3N5bXMgYW5kIGtlZXBfc3RyaW5ncy4KLQkoY29mZl9zZWN0aW9uX3RkYXRhKTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKGNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lLgotCShfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfZnJlZV9zeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotRnJpIEp1bCAyMSAyMjozMjo1NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX1NEQVJFTAotCXJlbG9jYXRpb24uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkocHBjX2VsZl9nb3QxNl9pbm5lcik6IERpdHRvLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVGh1IEp1bCAyMCAxOToxOTowNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgKGlnbm9yZWQpCi0JYXJndW1lbnQuCi0JKiBlbGYzMi1ocHBhLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1UaHUgSnVsIDIwIDE5OjAxOjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKHNldF9hb3V0X3NlY3Rpb25fZGF0YSk6IE5ldyBtYWNyby4KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fcmVsb2NzKTogVXNlIGl0LgotCi0JKiBhb3V0LW5zMzJrLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX291dCk6IFVuZGVmIEtFRVBJVCBiZWZvcmUKLQlkZWZpbmluZyBpdC4KLQotVGh1IEp1bCAyMCAxMzo0ODowMCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvaTM4NnY0LmggKGdldGdpZCwgZ2V0dWlkKTogIENoYW5nZSBwcm90b3R5cGVzIHRvIGJlCi0JY29tcGF0aWJsZSB3aXRoIFVuaXh3YXJlIDEueCBhbmQgVW5peHdhcmUgMi54LCBhbmQgcHJvYmFibHkgb3RoZXIKLQlpMzg2IHN2cjQgdmVyc2lvbnMgYXMgd2VsbC4KLQotVGh1IEp1bCAyMCAxMzo0MToyMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFNpbmNlIGFybXBlIGFuZCBhcm1wZWkgaGF2ZSBiZWVuCi0Jc3BsaXQgaW50byBiaWctIGFuZCBsaXR0bGUtZW5kaWFuIHZhcmlhbnRzLCBsaXN0IGFsbCBvZiB0aGVtLAotCWluc3RlYWQgb2YgdGhlIG5vdy1ub25leGlzdGFudCBhcm1wZVtpXV92ZWMuCi0KLVRodSBKdWwgMjAgMDA6MDY6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogU2V0IGxtYSBiYXNlZCBvbiBwX3BhZGRyLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzaF9hZGRyIGJhc2VkIG9uIGxtYSwgbm90IHZtYS4KLQotV2VkIEp1bCAxOSAxNTo1MjowMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBSZXBsYWNlcyBUQVJHRVRfU1lNLgotCSogY29uZmlndXJlLmluIChhcm1wZV92ZWMsIGFybXBlaV92ZWMpOiBBZGQgYmktZW5kaWFuIHN1cHBvcnQuCi0JKiBjb25maWd1cmU6ICJyZWdlbmVyYXRlZCIuCi0JKiBwZS1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KLQkoVEFSR0VUX0xJVFRMRV9OQU1FLCBUQVJHRVRfQklHX05BTUUpOiBSZXBsYWNlcyBUQVJHRVRfTkFNRS4KLQkqIHBlaS1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KLQkoVEFSR0VUX0xJVFRMRV9OQU1FLCBUQVJHRVRfQklHX05BTUUpOiBSZXBsYWNlcyBUQVJHRVRfTkFNRS4KLQkqIHRhcmdldHMuYyAoYXJtcGVfdmVjLCBhcm1wZWlfdmVjKTogRGVsZXRlZC4KLQkoYXJtcGVfbGl0dGxlX3ZlYywgYXJtcGVfYmlnX3ZlYywgYXJtcGVpX2xpdHRsZV92ZWMsIGFybXBlaV9iaWdfdmVjKToKLQlBZGRlZC4KLQkqIGNvbmZpZy9hcm0tcGUubXQgKERFRkFVTFRfVkVDVE9SKTogRGVmYXVsdCBpcyBhcm1wZV9saXR0bGVfdmVjLgotCShTRUxFQ1RfVkVDUyk6IEFkZCBiaS1lbmRpYW4gc3VwcG9ydC4KLQotV2VkIEp1bCAxOSAxMDo0NzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYzogQ2xlYW4gdXAgYW5kIGNvbW1lbnQuCi0JKHJfaW1tMzIpOiBSZW1vdmUuCi0JKHNoX2NvZmZfaG93dG9zKTogTmV3IHN0YXRpYyBhcnJheS4KLQkoU0hfQ09GRl9IT1dUT19DT1VOVCk6IERlZmluZS4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IE1ha2UgcmVsb2NhdGlvbiBiZmRfdm1hIHJhdGhlciB0aGFuIGxvbmcuCi0JKFJUWVBFMkhPV1RPKTogUmV3cml0ZSB0byB1c2Ugc2hfY29mZl9ob3d0b3MuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSB0byBzaF9yZWxvY2F0ZV9zZWN0aW9uLgotCShzaF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotU2F0IEp1bCAxNSAwMTowMjo1MyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIHN1cHBvcnQgZm9yIGdlbmVyaWMgbTY4ayBTVlI0IGhvc3QuCi0KLUZyaSBKdWwgMTQgMTM6MTM6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChLRUVQSVQpOiBDaGFuZ2UgZGVmaW5pdGlvbiB0byB1ZGF0YS5pLgotCShLRUVQSVRUWVBFKTogUmVtb3ZlLgotCShOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApKTogQWRkIGNhc2VzIHRvIHRoZQotCWV4dGVuZGVkIHJlbG9jIHR5cGUgc3dpdGNoOiBTUEFSQ19HT1QxMCwgU1BBUkNfR09UMTMsIFNQQVJDX0dPVDIyLAotCVNQQVJDX1BDMTAsIFNQQVJDX1BDMjIsIFNQQVJDX1dQTFQzMC4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBEb24ndCBib3RoZXIgdG8gdXNlIHN0b2kgd2hlbgotCXJldHJpZXZpbmcgS0VFUElUIHZhbHVlLgotCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLiAgQWxzbywgb25seSBhZGQgaW4KLQlvdXRwdXQgc2VjdGlvbiBWTUEgZm9yIHNlY3Rpb24gc3ltYm9scywgYW5kIGNoZWNrIEJTRl9TRUNUSU9OX1NZTQotCXRvIGNvbnRyb2wgd2hldGhlciB0byBzZXQgcl9leHRlcm4gdG8gMS4KLQotCSogc3ltcy5jOiBGaXggY29tbWVudHMgc28gdGhhdCBgbWFrZSBpbmZvJyB3b3Jrcy4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFNldCBTRUNfSEFTX0NPTlRFTlRTCi0JaW4gLm1kZWJ1ZyBzZWN0aW9uLCBpbiBjYXNlIGJhY2tlbmQgbGlua2VyIGhhcyBjbGVhcmVkIGl0LgotCi1GcmkgSnVsIDE0IDExOjU4OjM0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkcjE2X2hhX2lubmVyKTogUmV3cml0ZSB0byB0YWtlIGp1c3Qgb25lCi0JYXJndW1lbnQsIHRoZSBmaW5hbCByZWxvY2F0ZWQgYWRkcmVzcy4KLQkocHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIpOiBBZGp1c3QgcHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIgY2FsbGVyLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVGh1IEp1bCAxMyAxNzoyMjowMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogQ2hvb3NlIGEgcmVhc29uYWJsZSBmaWVsZAotCXNlbGVjdG9yIHJlbG9jYXRpb24gZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLgotCi1UaHUgSnVsIDEzIDEwOjMzOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IENhc3QgYXJndW1lbnQgdG8gc2l6ZV90Ci0JZm9yIG1hbGxvYy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZSwgZm9yIG1lbW1vdmUuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogY29mZmxpbmsuYyAocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1lbWNweSBhbmQgbWFsbG9jLgotCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfYWxpZ25fZGVidWcpOiBMaWtld2lzZSwgZm9yIG1lbXNldC4KLQkoZWNvZmZfd3JpdGVfc3ltaGRyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IExpa2V3aXNlLgotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UsIGZvcgotCXFzb3J0LgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlbGZjb3JlLmggKGVsZl9jb3JlZmlsZV9ub3RlKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfbGlua19yZWFkX3JlbG9jcyk6IExpa2V3aXNlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLCBmb3IgbWVtc2V0LgotCSogaTM4NmxpbnV4LmMgKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoZG9fd2l0aF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogTGlrZXdpc2UuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvciBtZW1jcHkuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwKLQlmb3IgbWFsbG9jLgotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwgZm9yIG1lbWNweS4KLQkqIHNyZWMuYyAoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UsIGZvcgotCXJlYWxsb2MgYW5kIG1lbXNldC4KLQkoc3Vub3Nfc2Nhbl9yZWxvY3MpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLCBmb3IgcmVhbGxvYy4KLQkqIHN5bXMuYyAoX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvcgotCW1lbWNweS4KLQotCSogbGliYmZkLmMgKHJlYWxfcmVhZCk6IEFkZCBwcm90b3R5cGUuICBDaGFuZ2UgYXJndW1lbnQgdHlwZXMgZnJvbQotCWludCB0byBzaXplX3QuCi0JKGJmZF9yZWFkKTogQ2FzdCByZWFsX3JlYWQgYXJndW1lbnQgdG8gc2l6ZV90LCBub3QgaW50LgotCShiZmRfd3JpdGUpOiBDYXN0IGZ3cml0ZSBhcmd1bWVudCB0byBzaXplX3QsIG5vdCBpbnQuCi0KLQkqIGVsZjY0LWdlbi5jIChlbGZfaW5mb190b19ob3d0byk6IEZpeCBkZWZpbml0aW9uIGZvciByZWNlbnQgZWxmLmMKLQljaGFuZ2VzLgotCi0JKiBjb25maWd1cmUuaW46IEZpeCB0eXBvOiBjaGFuZ2UgeyRlbmFibGV2YWx9IHRvICR7ZW5hYmxldmFsfS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZmxpbmsuby4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIGZpZWxkcyBfcmVhZF9taW5pc3ltYm9scyBhbmQKLQlfbWluaXN5bWJvbF90b19zeW1ib2wuCi0JKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMpOiBBZGQgX3JlYWRfbWluaXN5bWJvbHMgYW5kCi0JX21pbmlzeW1ib2xfdG9fc3ltYm9sLgotCShiZmRfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCSogc3ltcy5jIChfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE1JTklTWU1fVEhSRVNIT0xEKTogRGVmaW5lLgotCShOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkpOiBEZWNsYXJlLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoTVlfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKiBBbGwgdGFyZ2V0czogRGVmaW5lIHJlYWRfbWluaXN5bWJvbHMgYW5kIG1pbmlzeW1ib2xfdG9fc3ltYm9sLgotCi1XZWQgSnVsIDEyIDE3OjU1OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KLQliZmRfYWxsb2MuCi0KLQkqIGVsZmNvZGUuaCAoc2l6ZV9pbmZvKTogRG9uJ3QgdXNlICImIiBiZWZvcmUgZnVuY3Rpb24gbmFtZXMuCi0KLVdlZCBKdWwgMTIgMDA6MTY6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogVXNlIHVuc2lnbmVkLCBub3QgdW5zaWduZWQgY2hhciwKLQlmb3IgYml0ZmllbGRzLgotCi1UdWUgSnVsIDExIDE1OjE5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEluIGNhc2UgU0hUX1JFTFtBXSwgb25seSBnZXQgdGhlCi0gICAgICAgIEJGRCBzZWN0aW9uIGZvciB0aGUgc2hfbGluayBzZWN0aW9uIGlmIGl0IGlzIGEgU1lNVEFCIHNlY3Rpb24uCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSk6IERvbid0IGJvdGhlciB0byBjaGVjawotCXRoYXQgYXJjaGl2ZXMgaG9sZCBhLm91dCBvYmplY3RzLgotCSogY2YtaTM4Nmx5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlLgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlLgotCSogZWxmbGluay5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhhdAotCWFyY2hpdmVzIGhvbGQgRUxGIG9iamVjdHMuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSWYgdGhlIGFyY2hpdmUgaGFzIGEgbWFwLCBhbmQKLQl0aGUgdGFyZ2V0IHdhcyBkZWZhdWx0ZWQsIGJ1dCB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBhcmNoaXZlIGNhbgotCW5vdCBiZSBtYXRjaGVkIHdpdGggdGhhdCB0YXJnZXQsIHRoZW4gcmV0dXJuIGEgYmFkIGZvcm1hdCBlcnJvci4KLQotCSogZWxmNjQtc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogU2V0IGhvd3RvIGZvciBXRElTUDE2IHRvCi0JZWxmNjRfd2Rpc3AxNl9yZWxvYy4KLQkoZWxmNjRfd2Rpc3AxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZjY0X3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBsYXN0IGFyZ3VtZW50IHRvCi0Jc3dhcF9zeW1ib2xfb3V0IGZyb20gY2hhciAqIHRvIFBUUi4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9zeW1ib2xfb3V0KTogQ2hhbmdlIHR5cGUgb2YgY2RzdCBmcm9tIGNoYXIgKgotCXRvIFBUUi4KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gY2FsbGluZwotCXN3YXBfc3ltYm9sX291dCByb3V0aW5lLgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfc3ltKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMTEgMTI6Mjk6NDkgMTk5NSAgUmljayBTbGFka2V5ICA8anJzQHdvcmxkLnN0ZC5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugd2hlcmUKLQl0aGVyZSBpcyBubyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLU1vbiBKdWwgMTAgMTE6NDU6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1ha2VmaWxlLmRvcyAoT0JKUyk6IEFkZCBiaW5hcnkubyBhbmQgdGVraGV4Lm8uICBGcm9tIERKCi0JRGVsb3JpZS4KLQotTW9uIEp1bCAxMCAxMTowOTo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChzZXRfc3ltYm9sX2Zyb21faGFzaCk6IGJmZF9saW5rX2hhc2hfbmV3IGNhc2U6IERvbid0Ci0JYWJvcnQ7IGl0IGNhbiBoYXBwZW4gZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMgd2hlbiBub3QgYnVpbGRpbmcKLQljb25zdHJ1Y3RvcnMuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBDb3JyZWN0IHR5cG86IHVzZSAhIG9uIHN0cmNtcCwKLQlub3Qgb24gc3RyaW5nLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCBpLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBEb24ndCBkZWNsYXJlLgotCShQQ1JFTE9GRlNFVCk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWFybS5vCi0JKENGSUxFUyk6IEFkZCBjb2ZmLWFybS5jLCBwZS1hcm0uYywgcGVpLWFybS5jLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOiBBbGxvY2F0ZSBoYXNoIHRhYmxlCi0JdXNpbmcgYmZkX2FsbG9jLCBub3QgbWFsbG9jLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPjoKLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBJZiAtQnN5bWJvbGljLAotCW91dHB1dCBhIERUX1NZTUJPTElDIGR5bmFtaWMgZW50cnkuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBkb24ndCByZXF1aXJlIGEgUExUCi0JZW50cnkgZm9yIGEgbG9jYWxseSBkZWZpbmVkIHN5bWJvbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvIHdhcm4KLQlhYm91dCB1bmRlZmluZWQgc3ltYm9scywgYW5kIGZpbGwgaW4gdGhlIEdPVCBlbnRyeSBmb3IgYSBzeW1ib2wKLQlkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgb3V0cHV0IGEgUkVMQVRJVkUKLQlyZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUIHJlbG9jIGZvciBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQlyZWd1bGFyIG9iamVjdCBmaWxlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8gd2FybgotCWFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhIHN5bWJvbAotCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYSBSRUxBVElWRQotCXJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCXJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8KLQl3YXJuIGFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhCi0Jc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYQotCVJFTEFUSVZFIHJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQKLQlpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0KLQkqIGNvbmZpZy9tNjhrLWNvZmYubXQgKFNFTEVDVF9WRUNTKTogUmVuYW1lIGZyb20gU0VMRUNUX1ZFQ1RPUlMuCi0JQ29ycmVjdCBlbGVtZW50cyB0byBiZSBhY3R1YWwgQkZEIHZlY3RvciBuYW1lcy4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIHVwb24gQGZyYWdzQC4KLQkoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEBmcmFnc0AuCi0KLUZyaSBKdWwgIDcgMTc6MzY6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IFNvcnQgZGVmaW5lZCBzeW1ib2xzIHRoYXQgYXJlCi0JbmVpdGhlciBCU0ZfRlVOQ1RJT04gbm90IEJTRl9OT1RfQVRfRU5EIGp1c3QgYmVmb3JlIHVuZGVmaW5lZAotCXN5bWJvbHMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfRlVOQ1RJT04gYXMgd2VsbAotCWFzIEJTRl9OT1RfQVRfRU5ELgotCi1GcmkgSnVsICA3IDE3OjE2OjE1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbW9zdGx5Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZS4KLQotVGh1IEp1bCAgNiAxNDozNzo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFJldmVydCBNYXkgMjQgcGF0Y2guCi0gICAgICAgIERvbid0IGNvcHkgUEMzMiByZWxvYyBhZ2FpbnN0IHNlY3Rpb24gaW50byBzaGFyZWQgb2JqZWN0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZGVkIGVsZmxpbmsuYy4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgdXBvbiBjb25maWcuc3RhdHVzLCBub3QgY29uZmlndXJlLmluLgotCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldDsgZGVwZW5kIHVwb24gY29uZmlndXJlIGNvbmZpZ3VyZS5ob3N0Ci0JYW5kIGNvbmZpZy5iZmQuCi0KLVdlZCBKdWwgIDUgMjA6MTc6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaCwgZWxmbGluay5oLCBlbGZjb2RlLmgsIGVsZi5jLCBlbGZsaW5rLmM6IE1vdmVkIHNvbWUKLSAJcHJpbWFyaWx5IHNpemUtaW5kZXBlbmRlbnQgY29kZSBmcm9tIGVsZmNvZGUuaCB0byBlbGYuYyBhbmQgbmV3Ci0gCWZpbGUgZWxmbGluay5jOyBtb3ZlZCBvdXQgb3RoZXIgY29yZS0gb3IgbGlua2VyLXJlbGF0ZWQgcm91dGluZXMKLSAJaW50byBvdGhlciBuZXcgLmggZmlsZXMgZm9yIGNsYXJpdHkuICBSZW5hbWVkIG1hbnkgcm91dGluZXMgdG8KLSAJc3RhcnQgd2l0aCBiZmRfZWxmIG9yIF9iZmRfZWxmLiAgQWRkZWQgYSBzdHJ1Y3R1cmUgb2YKLSAJc2l6ZS1kZXBlbmRlbnQgYnV0IHRhcmdldC1pbmRlcGVuZGVudCBpbmZvIHRvIGVsZmNvZGUuaC4KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBlbGZsaW5rLm8uICBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogbGliZWxmLmg6IFVwZGF0ZWQgc29tZSBkZWNsYXJhdGlvbnMuICBBZGRlZCBhIGRlZmluaXRpb24gZm9yIHRoZQotCW5ldyBzdHJ1Y3R1cmUgaW4gZWxmY29kZS5oLiAgQWRkZWQgbW9yZSBmaWVsZHMgdG8gZWxmIGJhY2tlbmQgZGF0YQotCXN0cnVjdHVyZS4KLQkqIGVsZnh4LXRhcmdldC5oOiBSZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZS1kZXBlbmRlbnQgaW5mby4KLQkqIGVsZjMyLSouYzogQ2hhbmdlZCBzb21lIGZ1bmN0aW9uIG5hbWVzLiAgTW92ZWQgY29tbW9uCi0JY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgY29kZSBmcm9tIG02OGssIHNwYXJjLCBhbmQgaTM4NiBzdXBwb3J0Ci0JaW50byBlbGZsaW5rLmMuICBEZWZpbmUgc29tZSBuZXcgbWFjcm9zIHRvIGZpbGwgaW4gbmV3IGZpZWxkcyBvZgotCWJhY2sgZW5kIGRhdGEuICBBbHNvIGNsZWFuIHVwIHNvbWUgImdjYyAtV2FsbCIgd2FybmluZ3MgcmVnYXJkaW5nCi0JdW51c2VkIG9yIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBObywgZG9uJ3QgcHV0IGVsZmxpbmsubyBoZXJlLgotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGl0IGhlcmUgd2hlbmV2ZXIgZWxmLm8gaXMgc3BlY2lmaWVkLgotCi1XZWQgSnVsICA1IDEwOjMxOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vYmplY3RfcCk6IFVuY29uZGl0aW9uYWxseSBzZXQKLQllbGZfYmFkX3N5bXRhYiwgc2luY2Ugc29tZXRpbWVzIHRoZSBzeW1ib2wgdGFibGUgaXMgbWVzc2VkIHVwIGFuZAotCXRoZSBsYXN0IHN5bWJvbCBpcyBnbG9iYWwuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9pc19sb2NhbF9sYWJlbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICRhY19jb25maWdfc3ViLCBub3QgJGNvbmZpZ3N1Yi4KLQkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCi0KLQlQZXJtaXQgLS1lbmFibGUtdGFyZ2V0cz1pZWVlOgotCSogY29uZmlnLmJmZCAoKi0qLWllZWUqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9pZWVlLm10OiBOZXcgZmlsZS4KLQotV2VkIEp1bCAgNSAwNDoxNjozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2kzODZhaXgubWggKEhERUZJTkVTKTogUmVtb3ZlIC1ERkFTQ0lTVF9GRE9QRU4uCi0KLQlBdXRvY29uZmlzY2F0aW9uOgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBTd2l0Y2ggZnJvbSBDeWdudXMKLQljb25maWd1cmUgdG8gYXV0b2NvbmYgd2F5cyBvZiBwcm9jZXNzaW5nIC0tZW5hYmxlIGFyZ3VtZW50cywKLQlzZXR0aW5nIHVwIHN5bWxpbmtzLCBpbmNvcnBvcmF0aW5nIG1ha2VmaWxlIGZyYWdtZW50cywgcHJpbnRpbmcKLQltZXNzYWdlcyBhdCBjb25maWd1cmF0aW9uIHRpbWUsIHNldHRpbmcgdmFyaWFibGVzIGluIE1ha2VmaWxlLgotCURlbGV0ZWQgc29tZSB1bnVzZWQgdmFyaWFibGVzLiAgQ2hlY2sgZm9yIHJhbmxpYiB2aWEgYXV0b2NvbmYuCi0JRm9yIG5vdywgY29uZmlndXJlIHNjcmlwdCByZW1vdmVzIGRvYy9jb25maWcuc3RhdHVzLgotCSogY29uZmlndXJlOiBOZXcgZmlsZS4KLQkqIGRlcC1pbi5zZWQ6IFVzZSBAU1JDRElSQCBpbnN0ZWFkIG9mIEBzcmNkaXJALCBzbyBNYWtlZmlsZS5pbgotCWxpbmUgZG9lc24ndCBnZXQgYnJva2VuIGJ5IGNvbmZpZ3VyZS4KLQkqIGRvYy9jb25maWd1cmUuaW46IFJlbW92ZWQuCi0KLVR1ZSBKdWwgIDQgMTI6MjI6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBJZgotCUJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBsaW1pdCB0aGUgbGVuZ3RoIG9mIGFsbCBmaWxlIG5hbWVzCi0JdG8gYXJfbWF4X25hbWVsZW4uCi0JKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IElmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBjYWxsCi0JYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUuCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJldmVydCBKdW5lIDEgY2hhbmdlLgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IEFkZCBwcm92aWRlCi0JYXJndW1lbnQuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmVlZGVkIGZpZWxkLiAgUmVtb3ZlCi0Jc2F3X25lZWRlZCBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZWxmX2R0X25lZWRlZF9uYW1lCi0JaXMgYW4gZW1wdHkgc3RyaW5nLCBkb24ndCBtYWtlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSBvdXRwdXQKLQlmaWxlLiAgUmVjb3JkIGFsbCBEVF9ORUVERUQgZW50cmllcyBmb3VuZCBpbiBpbnB1dCBkeW5hbWljCi0Jb2JqZWN0cy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IGNoZWNrIHNhd19uZWVkZWQgd2hlbiBpc3N1aW5nCi0Jd2FybmluZ3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIG5lZWRlZCwgbm90Ci0Jc2F3X25lZWRlZC4KLQkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoc3RydWN0IGJmZF9lbGZfbGlua19uZWVkZWRfbGlzdCk6IERlZmluZS4KLQkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBBbHNvIGluaXRpYWxpemUKLQlmaW5kX2J1ZmZlciBhbmQgZmRydGFiX2xlbiBmaWVsZHMgb2YgbmV3bHkgYWxsb2NhdGVkCi0JZmluZF9saW5lX2luZm8gc3RydWN0dXJlLgotCi1Nb24gSnVsICAzIDE3OjAzOjUyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBOZXcgYXJndW1lbnQgInN5bV9kaWZmIiwKLQlub256ZXJvIHdoZW4gd2UncmUgZ2VuZXJhdGluZyByZWxvY2F0aW9ucyBmb3IgYW4gZXhwcmVzc2lvbgotCXVzaW5nIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQlIYW5kbGUgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGZvciBib3RoIFJfSFBQQSBhbmQgUl9DT01QTEVYCi0JY2FzZXMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9DT01QMSwgUl9DT01QMiBhbmQgUl9DT0RFX0VYUFIKLQlmaXh1cHMuCi0KLU1vbiBKdWwgIDMgMTM6NTU6MTggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAod2luMzIpOiBOZXcgY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZ3VyZS5ob3N0IChwZSk6IENoYW5nZWQgdG8gaTM4NndpbjMyLgotCSogY29uZmlnL2kzODZwZS5taDogRGVsZXRlZC4KLQkqIGNvbmZpZy9pMzg2d2luMzIubWg6IE5ldyBmaWxlLgotCi1Nb24gSnVsICAzIDExOjMwOjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHdlIGFsbG9jYXRlCi0JZmluZF9saW5lX2luZm8sIGNsZWFyIHRoZSBmZHJ0YWIgZmllbGQuCi0KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZCBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIgaGVyZSwKLQlyYXRoZXIgdGhhbiBpbiBiZmQtaW4yLmguCi0KLQkqIGJmZC5jIChlbnVtIGJmZF9lcnJvcik6IERlZmluZSBiZmRfZXJyb3Jfbm9fYXJtYXAuCi0JKGJmZF9lcnJtc2dzKTogQWRkIHN0cmluZyBmb3IgYmZkX2Vycm9yX25vX2FybWFwLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSWYgYW4gYXJjaGl2ZSBoYXMgbm8KLQlhcm1hcCwgc2V0IGJmZF9lcnJvcl9ub19hcm1hcCByYXRoZXIgdGhhbiBiZmRfZXJyb3Jfbm9fc3ltYm9scy4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBQZXJtaXQgY29tbW9uIGFuZAotCWluZGlyZWN0IHN5bWJvbHMgaW4gd2Vha2RlZnMgQkZEX0FTU0VSVC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogU2ltcGxpZnkKLQlCRkRfQVNTRVJUIHRvIHBlcm1pdCBzb21lIGxlZ2FsLCBidXQgb2RkLCBjYXNlcy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCB2ZXJzYWRvcy5vLgotCShDRklMRVMpOiBBZGQgcGUtaTM4Ni5jLCBwZWktaTM4Ni5jLCBhbmQgdmVyc2Fkb3MuYy4KLQotU3VuIEp1bCAgMiAxNzo0OTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXN0IGJhc2VfZmlsZQotCXRvIEZJTEUgKiBiZWZvcmUgdXNpbmcgaXQuCi0JKiBzdGFiLXN5bXMuYzogUmV2ZXJ0IHllc3RlcmRheSdzIHBhdGNoLgotCi1TYXQgSnVsICAxIDEyOjEwOjQyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBzdGFiLXN5bXMuYyAoc3RkaW8uaCk6ICBJbmNsdWRlIHByaW9yIHRvIGxpYmFvdXQuaCwgd2hpY2gKLQlpbmNsdWRlcyBiZmRsaW5rLmgsIHdoaWNoIG5vdyB1c2VzIEZJTEUuCi0KLVNhdCBKdWwgIDEgMDA6MTE6MDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZnh4LXRhcmdldC5oOiBOZXcgZmlsZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIGVsZl82NF9wIGZpZWxkLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZk5OX2JlZCk6IERvbid0IHNldCBpdC4KLQotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW4gKGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaCk6IEJ1aWxkIHRoZW0gZnJvbQotCWVsZnh4LXRhcmdldC5oLgotCi1GcmkgSnVuIDMwIDE2OjA3OjE4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wYXJlCi0JdGhlIGZ1bGwgdGV4dCBvZiAucmVsb2Mgb3IgLmVkYXRhIHNlY3Rpb24gbmFtZXMuCi0KLUZyaSBKdW4gMzAgMTU6NDc6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOgotCVJlbW92ZSBleHRyYSAnKycuCi0KLVRodSBKdW4gMjkgMTc6MjQ6NTIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jIChDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCi1XZWQgSnVuIDI4IDE4OjA0OjQyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiB2ZXJzYWRvcy5vIGlzIG5vdyBjb25kaXRpb25hbGx5IGJ1aWx0LgotCSogY29mZmNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2xlYW4gdXAuIENhbGN1bGF0ZQotCWRhdGEgZW50cmllcy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOgotCS5yZWxvYyBhbmQgLmVkYXRhIHNlY3Rpb25zIGFyZSBJTUFHRV9CQVNFRCB0b28uCi0JSWYgdGhlcmUncyBhIGJhc2VfZmlsZSB0aGVuIHdyaXRlIG91dCBiYXNlIGluZm9ybWF0aW9uLgotCSogY29uZmlndXJlLmhvc3QgKGkzODYtKi1wZSk6IE5ldy4KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBPbmx5IHNjYW4gcHJlZml4ZXMuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogVmVyc2Fkb3MgaXMgbm93IGNvbmRpdGlvbmFsbHkKLQlidWlsdC4KLQkqIGNvbmZpZy9tNjhrLWNvZmYubXQ6IEJ1aWxkIHZlcnNhZG9zLm8KLQkqIGhvc3RzL2kzODZwZS5oOiBOZXcgZmlsZS4KLQotTW9uIEp1biAyNiAxMzo1Mzo0OSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IENsb3NlIGNvbW1lbnQgYmVmb3JlCi0JUl9QQVJJU0NfRFBSRUwyMUwgaGFuZGxpbmcuCi0KLVRodSBKdW4gMjIgMTk6Mjg6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVN1biBNYXkgIDcgMTE6NTM6NDEgTURUIDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0KLQkqIGNvbmZpZy9pMzg2LW1vc3MubXQ6IGNyZWF0ZWQuCi0KLVRodSBKdW4gMjIgMDg6NTY6MTAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBjYXNlIGZvciAtdmUgd29yZHMuCi0KLVdlZCBKdW4gMjEgMTM6MTM6NDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdHJ5IHRvIGFwcGx5IGEKLQlyZWxvY2F0aW9uIGFnYWluc3QgYW4gdW5kZWZpbmVkIHN5bWJvbHMuCi0KLVdlZCBKdW4gMjEgMTA6MTY6MTAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYzogU2Vjb25kIHBhc3MvcmV3cml0ZS4KLQotTW9uIEp1biAxOSAwODo0MDo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogQ29tcGFyZSBvbmx5IHRoZSBmcm9udCBwYXJ0Ci0Jb2YgYSBzZWN0aW9uIG5hbWUuCi0KLVNhdCBKdW4gMTcgMDk6NDA6NDQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogU2V0IHRoZSBzaXplIG9mIHRoZSBzdHViCi0Jc2VjdGlvbiBpZiB3ZSBnZXQgYW4gZXJyb3IuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IERvbid0IG1lc3MKLQl3aXRoIHRoZSBvcGVyYW5kcyBvZiBhbiBSX1BBUklTQ19EUFJFTDIxTCByZWxvY2F0aW9uIGlmIHRoZSBpbnNuCi0JaXMgbm90ICJhZGRpbCA8c3ltYm9sPiwlcjI3Ii4KLQotRnJpIEp1biAxNiAxNTowNDo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWNsYXJlIGJ1dCBkb24ndAotCWRlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGJmZC5jIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWZpbmUuCi0KLUZyaSBKdW4gMTYgMDA6MDc6MjUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfbGlua19saW5rX3JlbG9jYXRlKTogVXNlIHRoZSByaWdodAotCXR5cGUgZmllbGQgKHRoZXJlIGFyZSB0d28hKSB3aGVuIGNoZWNraW5nIHRvIHNlZSBpZiAkZ2xvYmFsJCBpcwotCWRlZmluZWQuCi0KLVRodSBKdW4gMTUgMTQ6MDM6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCwgYmZkLWluMi5oIChiZmRfYm9vbGVhbik6IFJlbmFtZSBiZmRfdHJ1ZSwgYmZkX2ZhbHNlCi0JdG8gYmZkX3R0dHJ1ZSwgYmZkX2ZmZmFsc2Ugc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggZnVuY3Rpb25zLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBSZW1vdmUgdmVyc2lvbiB0aGF0IHdhcwotCWhhY2tlZCBmb3IgTVBXIEMuCi0JKiBtcHctY29uZmlnLmluOiBTZXQgc2hlbGwgdmFycyBpbnN0ZWFkIG9mIHBhc3RpbmcgdG8gbWFrZWZpbGUKLQlmb3IgZWFjaCBjb25maWd1cmF0aW9uLCBlZGl0IGNvZmZzd2FwLmggdG8gbWFrZSBNUFcgQyBub3QgY2hva2UuCi0JKGkzODYtdW5rbm93bi1jb2ZmLCBzaC1oaXRhY2hpLWhtcyk6IFJlY29nbml6ZS4KLQkqIG1wdy1tYWtlLmluIChCRkRfTElCUyk6IEFkZCB2ZXJzYWRvcy5jLm8uCi0KLQkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX3NjYW4pOiBQcm9wZXJseSBjYXN0IHJlc3VsdHMgZnJvbSBiZmRfYWxsb2MuCi0KLVdlZCBKdW4gMTQgMTU6Mjc6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IE5ldyBmdW5jdGlvbgotCXJlYWRzIGFuZCBoYW5kbGVzIC5kcmVjdHZlIHNlY3Rpb25zIGZvciBQRS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IENhbGwgbmV3IGZ1bmN0aW9uIGlmIFBFLgotCi1Nb24gSnVuIDEyIDEyOjA5OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IENhc2UgdHJ1ZSB0byBhIGJvb2xlYW4uCi0JKGJmZF9zZXRfY2FjaGVhYmxlKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDkgMTI6MjA6MjggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IFJld3JpdGUgdG8gYmUgc3ltbWV0cmljYWwuCi0KLUZyaSBKdW4gIDkgMTI6NDk6MDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHRhcmdldHMuYzogQWRkIGNvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBhbmQgbGlua19zcGxpdF9zZWN0aW9uCi0JdG8gdGhlIHRhcmdldCB2ZWN0b3IuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWZpbmUuCi0JKF9iZmRfbm9saW5rX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIHN5bXMuYyAoYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IERlZmluZS4KLQkqIGxpbmtlci5jIChiZl9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IE5ldyBmdW5jdGlvbgotCShzb21fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbik6IExpa2V3aXNlLgotCSogQWxsIG90aGVyIHRhcmdldHMgdXBkYXRlZCB3aXRoIGRlZmF1bHQgdmVyc2lvbnMgb2YgbmV3IHJvdXRpbmVzLgotCi0JKiBUYWtlIG91dCBteSBicmFpbmRhbWFnZWQgYmZkX3RydWUvYmZkX2ZhbHNlIGNoYW5nZXMgZnJvbSBlYXJsaWVyCi0JdG9kYXkuICBSZXBsYWNlIHdpdGgganVzdDoKLQkqIGJmZC1pbi5oOiAoVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQpOiBEZWZpbmUgdGhpcyBpZgotCWNvbXBpbGluZyB3aXRoIGcrKy0yLjYgb3IgbGF0ZXIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDkgMDc6NTQ6MjkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYyAoc3RydWN0IGVzZCwgZ2V0XzQpOiBMaW50OyB1c2UgdW5zaWduZWQgY2hhcnMuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiAgQ29tcGFyZSBvdXRwdXQgc2VjdGlvbiBuYW1lcwotCXdoZW4gY29udmVydGluZyBmb3Igdnh3b3Jrcy4KLQotV2VkIEp1biAgNyAxOTowMTozMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogUGVybWl0IC5zY29tbW9uIG9yIENPTU1PTgotCXNlY3Rpb25zIGFzIHJhbmRvbSBTSFRfTk9CSVRTIHNlY3Rpb25zLCBpbiBjYXNlIGEgbGlua2VyIHNjcmlwdCBpcwotCXN0cmFuZ2UuCi0KLVR1ZSBKdW4gIDYgMTc6Mjk6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IE1vdmVkIGZyb20gcGUuaAotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IEdldCBQRSByZWxvY3MgcmlnaHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0KTogU2V0IHBlIHRkYXRhIGJpdCB3aGVuIHVzaW5nIFBFLgotCSogY29mZmxpbmsuYyAoQ09GRl9XSVRIX1BFIGNvZGUpOiBUZXN0IG9uIG9ial9wZSBiaXQgcmF0aGVyCi0JdGhhbiBjb25kaXRpb25hbCBjb21waWxlLgotCSogY29uZmlndXJlLmluOiBGaXggUEUgZGVwZW5kZW5jaWVzLgotCSogbGliY29mZi1pbi5oIChvYmpfcGUpOiBOZXcuCi0JKGNvZmZfdGRhdGEpOiBBZGRlZCBwZSBlbnRyeS4KLQkqIGxpYmNvZmYuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBKdW4gIDUgMDk6MDc6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4KTogQ29tcGxldGVseSBwYXJlbnRoZXNpemUKLQltYWNyby4KLQotTW9uIEp1biAgNSAwMjoxNToyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlMaW5rZXIgc3VwcG9ydCBmb3IgbTY4ay1lbGYgZnJvbSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGVjayBmb3IgTlVMTCB3aGVuCi0JbG9vcGluZyB0aHJvdWdoIHRoZSBzeW1ib2wgaGFzaGVzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXaGVuIGxvb2tpbmcgZm9yIF9pbml0IGFuZCBfZmluaSBkb24ndCB1c2UKLQl0aGUgc3ltYm9sIGlmIGl0IGlzIGltcG9ydGVkIGZyb20gYW5vdGhlciBvYmplY3QuCi0JKiBlbGYzMi1tNjhrLmM6IFJlbG9jYXRpb24gdHlwZSBjaGFuZ2VkIGZyb20gUkVMIHRvIFJFTEEuICBSZWd1bGFyCi0JYW5kIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0IGZ1bmN0aW9ucyBhZGRlZCwgc2ltaWxhciB0byBvdGhlciBlbGYKLQl0YXJnZXRzLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWdudSopOiBVc2UgRUxGIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBKdW4gIDIgMTg6NTQ6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYzogTmV3IGZpbGUuCi0JKiBiZmQtaW4yLmggKHN0cnVjdCBfYmZkKTogTmV3IGZpZWxkLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogTmV3IGZpZWxkLgotCSogY29uZmlndXJlLmluICh2ZXJzYWRvc192ZWMpOiBOZXcgZmllbGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9mbGF2b3IpOiBBZGRlZCB2ZXJzYWRvcy4KLQotVGh1IEp1biAgMSAxMzo1MTo0OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncywgc3R5cF90b19zZWNfZmxhZ3MsIAotCWNvZmZfbmV3X3NlY3Rpb25faG9vayk6ICBBbnkgc2VjdGlvbiB0aGF0IHN0YXJ0cyAiLnN0YWIiCi0JaXMgbm93IG1hcmtlZCBhcyBkZWJ1Z2dpbmcuCi0KLVRodSBKdW4gIDEgMTY6MTU6MTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEaXNhYmxlIGV4dGVuZGVkIG5hbWUKLQl0YWJsZSB1bnRpbCBpdCBjYW4gYmUgbWFkZSBvcHRpb25hbCwgc28gdGhhdCBuYXRpdmUgQVIgaGFzIGhhbGYgYQotCWNoYW5jZSBvbiBTdW5PUyBhbmQgSFAvVVguCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scywgY2FzZQotCWJmZF9saW5rX2hhc2hfaW5kaXJlY3QpOiBBZGQgY2FzdCB0byBjb3JyZWN0IHBvaW50ZXIgdHlwZXMuCi0KLVNhdCBNYXkgMjcgMjE6Mzc6MzEgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChtNjhrLWJ1bGwtc3lzdiopOiBBZGRlZCBzdHJpcF91bmRlcnNjb3JlPXllcy4KLQkgIChtNjhrLWVzdC1jb2ZmKTogUmVtb3ZlZC4gIHRhcmdldCBkb2VzIG5vdCBlZmZlY3Qgb2JqZWN0IGZvcm1hdC4KLQotV2VkIE1heSAyNCAxMDo1MjowMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBDb3BlIHdpdGgKLQlpbmRpcmVjdCBzeW1ib2xzLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBHaXZlIGVycm9yCi0JbWVzc2FnZSB3aGVuIGxpbmtpbmcgdG8gYSBzaGFyZWQgcmVsb2Mgd2hpY2ggaXNuJ3QgdGhlcmUuCi0KLVdlZCBNYXkgMjQgMTA6NDA6MDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIEFSTS1QRS4KLQotCSogTWFrZWZpbGUuaW4sIGNvZmZjb2RlLmgsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgcGUtYXJtLmMsCi0JIHBlaS1hcm0uYywgY29mZi1hcm0uYywgcmVsb2MuYywgdGFyZ2V0cy5jLCBjb25maWcvYXJtLXBlLm10OgotCSBTdXBwb3J0IGZvciBBUk0gQ09GRi9QRS4KLQotVHVlIE1heSAyMyAxOToyNDo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5vdyBhIGZ1bmN0aW9uLAotCXRyaWVzIGNhbGxpbmcgcm91dGluZSBmcm9tIGlucHV0IGJmZCB0YXJnZXQgdmVjdG9yIGZvcgotCWJmZF9pbmRpcmVjdF9saW5rX29yZGVyLiAgUHV0IGEgZGVjbGFyYXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbWlwcy5jIChncHJlbDE2X3dpdGhfZ3ApOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBmcm9tCi0JbWlwc19lbGZfZ3ByZWwxNl9yZWxvYy4KLQkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IENhbGwgaXQuICBJZiBvdXRwdXQgYmZkIHRhcmdldCB2ZWN0b3IKLQlpc24ndCBlbGYgZmxhdm91cmVkLCBhYm9ydCwgc2luY2UgaXQncyBhc3N1bWVkIHRvIGJlIGVsZiBpbiBzb21lCi0Jb2YgdGhpcyBjb2RlLCBpbmNsdWRpbmcgdGhlIGNvZGUgdGhhdCBsb29rcyB1cCB0aGUgZ3AgdmFsdWUuCi0JKGVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLAotCW1vZGlmaWVkIGZyb20gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHRvIGRlYWwKLQl3aXRoIHBhc3NpbmcgZ3AgdG8gZ3ByZWwxNl93aXRoX2dwLgotCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBtYWNyby4KLQkqIGVsZjMyLXRhcmdldC5oIChiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQotVHVlIE1heSAyMyAxNTo1ODoxNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW46IEluc3RhbGwgYmZkbGluay5oIHRvby4KLQotU3VuIE1heSAyMSAyMjoyNTowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgdW5kZWZpbmVkIGFuZAotCW5vdHN1cHBvcnRlZCByZXR1cm4gY29kZXMgZnJvbSBmaW5hbF9saW5rX3JlbG9jYXRlICh1c2VkIHdoZW4KLQkkZ2xvYmFsJCBpcyB1bmRlZmluZWQgb3Igbm9uZXhpc3RhbnQpLgotCShlbGYzMl9ocHBhX2JmZF9saW5rX2xpbmtfcmVsb2NhdGUpOiBJZiAkZ2xvYmFsJCBleGlzdHMsIGJ1dCBpcwotCW5vdCBkZWZpbmVkLHRoZW4gcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQuCi0KLUZyaSBNYXkgMTkgMTA6MDA6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmg6IChJTUFHRV9CQVNFKTogRGVmaW5lIHRvIDAgaWYgbm90LgotCi1UaHUgTWF5IDE4IDA0OjI0OjAxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0YW5kYXJkKTogSWYgZGVmaW5lZCwgY2FsbAotCU1ZX3JlbG9jYXRhYmxlX3JlbG9jIGJlZm9yZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4KLQotCSogYW91dC1hcm0uYzogKFdSSVRFX0hFQURFUlMpOiBEZWxldGUuCi0JKE5BTUUpOiBEZWZpbmUgdmVyc2lvbiB0byBvdmVycmlkZSBkZWZhdWx0IGluIGFvdXR4LmgKLQkoTVkoaG93dG9fdGFibGUpKTogUmVmb3JtYXQuICBBbHRlciBzb21lIGVudHJpZXMgc2xpZ2h0bHkuCi0JKFJFTE9DX0FSTV9CSVRTX05FR197QklHLExJVFRMRX0pOiBEZWZpbmUuCi0JKE1ZKHJlbG9jX2hvd3RvKSwgTVkocHV0X3JlbG9jKSwgTVkocmVsb2NhdGFibGVfcmVsb2MpKTogTmV3IGZ1bmN0aW9ucy4KLQkoTVlfcmVsb2NfaG93dG8sIE1ZX3B1dF9yZWxvYywgTVlfcmVsb2NhdGFibGVfcmVsb2MpOiBEZWZpbmUuCi0JKE1ZKGZpeF9wY3JlbF8yNikpOiBSZW5hbWVkIGZyb20gYW91dGFybV9maXhfcGNyZWxfMjYsIHJldHVybgotCWJmZF9yZWxvY19vayBub3QgYmZkX3JlbG9jX2NvbnRpbnVlLgotCShNWShmaXhfcGNyZWxfMjZfZG9uZSkpOiBMaWtld2lzZS4KLQkoTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKSk6IFJlbmFtZWQgZnJvbSBhb3V0YXJtX3JlbG9jX3R5cGVfbG9va3VwLgotCShNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMsCi0JTVlfYmZkX2ZpbmFsX2xpbmspOiBEZWxldGUuCi0JKE1ZX3N3YXBfc3RkX3JlbG9jX2luLCBNWV9zd2FwX3N0ZF9yZWxvY19vdXQsIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzKToKLQlEZWZpbmUuCi0JKGFvdXR4LmgpOiBJbmNsdWRlIGl0LgotCShNWShzd2FwX3N0ZF9yZWxvY197aW4sb3V0fSkpOiBOZXcgZnVuY3Rpb25zLgotCVVzZSBSRUxPQ19BUk1fQklUU19ORUdfe0JJRyxMSVRUTEV9IHRvIGV4dHJhY3QgbmVnYXRpdmUgcmVsb2MgYml0LgotCShhb3V0YXJtX3NxdWlydF9vdXRfcmVsb2NzKTogRGVsZXRlLgotIAotCUZyb206IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0JKiBjb25maWcvYXJtW2xiXS1hb3V0Lm10OiBOZXcgZmlsZXMuCi0JKiBhb3V0LWFybS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQ6IEhhbmRsZSBhcm17LGVbbGJdfS0qLWFvdXQKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHZldG9yIGZvciBhb3V0X2FybV97YmlnLGxpdHRsZX1fdmVjLgotCSogcmVsb2MuYzogTmV3IHJlbG9jYXRpb24gdHlwZXMgZm9yIHRoZSBBUk0uCi0JKiB0YXJnZXRzLmMgKGFvdXRfYXJtX3tiaWcsbGl0dGxlfV92ZWMpOiBkZWNsYXJlLgotCi1UdWUgTWF5IDE2IDEwOjI5OjUxIDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX3N0YXQpOiBJZiBiZmRfY2FjaGVfbG9va3VwIHJldHVybnMgYW4gZXJyb3IsCi0JcmV0dXJuIGFuIGVycm9yIHRvIHRoZSBjYWxsZXIuICBDYWxsIGJmZF9zZXRfZXJyb3Igb24gZXJyb3JzLgotCi1UdWUgTWF5IDE2IDE0OjQ0OjQ1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogTW9kaWZpZWQgcHJvdG90eXBlcyBpbgotCWFjY29yZGFuY2Ugd2l0aCAxMSBNYXkgbGliY29mZi5oIGNoYW5nZS4KLQotVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JdGVraGV4LmMgKGZpcnN0X3BoYXNlKTogVW5kZXJzdGFuZCB0eXBlIDAgc3ltYm9scy4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZpeCB0eXBvIGluIGZpbmFsIHJlY29yZC4KLQotVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAob3B0Y2FsbF9jYWxsYmFjayk6IGRvbid0IHRyeSBhbmQgb3B0aW1pemUKLQl1bmRlZmluZWQgcmVmcy4gCi0JKGNvZmZfd3JpdGVfcmVsb2NzKTogU2VhcmNoIGZvciBicm9rZW4gcmVsb2NzIG9uIHRoZSB3YXkKLQlvdXQgYW5kIGZpeCB0aGVtIHVwLgotCShjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDYWxjdWxhdGUgYW5kIHJldHVybiBpbmRleCBvZgotCWZpcnN0IHVuZGVmaW5lZCBzeW1ib2wuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgCi0JYW5kIGNvZmZfd3JpdGVfcmVsb2NzIHdpdGggdGhlIG5ldyBhcmdzLgotCSogbGliY29mZi5oOiAoY29mZl9yZW51bWJlcl9zeW1ib2xzLCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOgotCU1vZGlmaWVkIHByb3RvdHlwZXMuCi0KLVRodSBNYXkgMTEgMTY6NDM6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQkJCSAgVG9tIEdyaWVzdCA8Z3JpZXN0QGNzLnlhbGUuZWR1PgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQRSBmb3JtYXQuIAotCQotCSogTWFrZWZpbGUuaW4sIHRhcmdldHMuYywgY29uZmlndXJlLmluLCBjb25maWcuYmZkOgotCUFkZCBzdXBwb3J0IGZvciBpMzg2LSotd2lubnQgYW5kIGkzODYtKi1wZS4KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6ICBVbmRlcnN0YW5kIE5UUEUgZm9ybWF0Ci0JYXJjaGl2ZXMuCi0JKF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFR1cm4gXCBpbiBhIGZpbGVuYW1lCi0JaW50byAvLgotCSogYmZkLWluLmggKGJmZF9saW5rX3N1YnN5c3RlbSwgX2JmZF9saW5rX3N0YWNrX2hlYXApOiBOZXcuCi0JKiBjb2ZmLWkzODYuYyAgKGhvd3RvX3RhYmxlKTogQ29uZGl0aW9uYWxpemUgUENSRUxPRkZTRVQuCi0JKiBjb2ZmY29kZS5oIChJTUFHRV9CQVNFKTogTmV3LgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFRocm93IGF3YXkgLmp1bmsKLQlzZWN0aW9ucyBmb3IgUEUsIGFsaWduIHN5bWJvbHMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVGhyb3cgYXdheSAuanVuayBzZWN0aW9ucwotCWZvciBQRS4gUmVtZW1iZXIgaW5mbyBvbiAuaWRhdGEgYW5kIC5yc3JjIHNlY3Rpb25zLgotCUZpbGwgaW4gdGhlIFBFIGhlYWRlci4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQRSB1c2VzIENfU0VDVElPTiBjbGFzcy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogS2VlcCBQRSBpbmZvIHVwIHRvIGRhdGUuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3BlIHdpdGggUEUgcmVsb2NzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3thb3V0L2ZpbGUvc2NuL3N5bX1oZHJfe2luL291dH0pOiAKLQlOZXcgY29kZSBmb3IgUEUgaGVhZGVycy4KLQotVHVlIE1heSAgOSAxNzowMTozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uCi0JKiB0YXJnZXRzLmM6IERpdHRvLgotCSogY29uZmlnL3BwY2xlLWVsZi5tdDogTmV3IGZpbGUsIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMKLQlzdXBwb3J0LgotCSogY29uZmlnL3BwYy1lbGYubXQ6IEFkZCBsaXR0bGUgZW5kaWFuIHBvd2VycGMgdG8gdGhlIEJGRAotCXNlbGVjdGlvbiB2ZWN0b3JzLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENvbXBsYWluIGlmCi0JbGlua2luZyBhIGRpZmZlcmVudCBlbmRpYW4gb2JqZWN0IHRoYW4gd2UgZXhwZWN0LgotCShUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0xJVFRMRV9OQU1FKTogRGVmaW5lLCB0byBwcm92aWRlIGxpdHRsZQotCWVuZGlhbiBzdXBwb3J0LgotCi1UdWUgTWF5ICAyIDE2OjMyOjI0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLWxpdGVzKik6IFRyZWF0IGp1c3QgbGlrZSBocHBhKi0qLSplbGYqLgotCi1UdWUgQXByIDI1IDE5OjM4OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSW5pdGlhbGl6ZSBsbWEgc2FtZSBhcwotCXZtYS4KLQotVHVlIEFwciAyNSAxMTowMzoyMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogI2luY2x1ZGUgYW5zaWRlY2wuaCAnY2F1c2UgUFRSIGlzIHVzZWQgaW4KLQlzdGQtaG9zdC5oLgotCi1Nb24gQXByIDI0IDIzOjU2OjQ0IDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBEb24ndCBkZWZpbmUgaXQuICBBZGRlZCBsZW5ndGh5Ci0JY29tbWVudCBleHBsYWluaW5nIHdoeS4KLQotTW9uIEFwciAyNCAxMDozNDowMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvaTM4NmxpbnV4LmggKEhBVkVfUFJPQ0ZTKTogSWYgTk9fUFJPQ0ZTIGlzIGRlZmluZWQsIGRvbid0Ci0JZGVmaW5lIEhBVkVfUFJPQ0ZTLgotCi1Nb24gQXByIDI0IDA4OjMzOjEyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGNvbnRpbnVlCi0JcHJvY2Vzc2luZyB1bmtub3duIHN5bWJvbHMgdG8gcHJldmVudCBhIGNhc2NhZGUgb2YgZXJyb3JzLgotCi1GcmkgQXByIDIxIDEyOjQ4OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gSC5KLiBMdSBmb3IgTGludXggRUxGIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogZWxmY29kZS5oIChlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKSBbSEFWRV9QUk9DRlNdOgotCVVzZSBwcnBzaW5mb190IGluc3RlYWQgb2Ygc3RydWN0IHBycHNpbmZvLCBmb3IgY29uc2lzdGVuY3kuCi0JKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBEZWZpbmUuCi0KLVRodSBBcHIgMjAgMDk6MDc6MzkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogRG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gYSB1bmRlZmluZWQKLQlzdHJvbmcgc3ltYm9sIGFwcGVhcnMgYWZ0ZXIgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCi1GcmkgQXByIDE0IDE2OjUxOjE3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0byByZWxvY2F0ZQotCWEgd2hvbGUgc2VjdGlvbiBmb3IgdGhlIGxpbmtlciwgYnlwYXNzaW5nIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24gdG8gbWFwIHRoZSBCRkQKLQllbnVtZXJhdGlvbiBjb2RlIGludG8gYSBob3d0byBzdHJ1Y3R1cmUuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogUmVuYW1lIGZyb20gcHBjX2VsZl9ob3d0b190YWJsZS4KLQkocHBjX2VsZl9ob3d0b190YWJsZSk6IE5ldyBhcnJheSB0aGF0IG1hcHMgUG93ZXJQQyByZWxvY2F0aW9uCi0JbnVtYmVycyB0byBob3d0byBzdHJ1Y3R1cmVzIHdpdGhvdXQgYSBsaW5lYXIgc2VhcmNoLiAgQ2hhbmdlIGZyb20KLQl1c2luZyBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgdG8gdXNlIHBwY19lbGZfc3RkX3JlbG9jLgotCShwcGNfZWxmX2hvd3RvX2luaXQpOiBJbml0aWFsaXplIHBwY19lbGZfaG93dG9fdGFibGUgZnJvbQotCXBwY19lbGZfaG93dG9fcmF3LgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogVXNlIGEgY2FzZSBzdGF0ZW1lbnQgaW5zdGVhZCBvZiBhCi0JbG9vcC4KLQkocHBjX2VsZl9zdGRfcmVsb2MpOiBSZXBsYWNlbWVudCBmb3IgYmZkX2VsZl9nZW5lcmljX3JlbG9jLgotCShwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKTogUHJpbnQgYSByZWFsIGVycm9yIG1lc3NhZ2UsIGluc3RlYWQKLQlvZiBjYWxsaW5nIGFib3J0LgotCShwcGNfZWxmX2FkZHIxNl9oYV9pbm5lcik6IEFic3RyYWN0IGdldHRpbmcgYWRqdXN0bWVudCBmcm9tCi0JcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIHNvIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYW4gdXNlIGl0Ci0JdG9vLgotCShwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyk6IENhbGwgaXQuCi0JKHBwY19lbGZfZ290MTZfaW5uZXIpOiBBYnN0cmFjdCBnZXR0aW5nIGFkanVzdG1lbnQgZnJvbQotCXBwY19lbGZfZ290MTZfcmVsb2MsIHNvIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYW4gdXNlIGl0IHRvby4KLQkocHBjX2VsZl9nb3QxNl9yZWxvYyk6IENhbGwgaXQuCi0JKHBwY19lbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tIHBvd2VycGNfaW5mb190b19ob3d0by4KLQotCSogZWxmY29kZS5oIChlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IE9taXQgc3BhY2UgaW4gZGVidWdnaW5nCi0Jb3V0cHV0LgotCShlbGZfc3ltYm9sX2ZsYWdzKTogQWRkIGRlYnVnIGZ1bmN0aW9uIHRvIGRlY29kZSBmbGFncyBzbyB0aGF0Ci0JZGVmaW5pbmcgREVCVUcgdG8gYmUgNCB3aWxsIGNvbXBpbGUgYWdhaW4uCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRml4IHR5cG8gaW4gZGVidWcgb3V0cHV0LgotCi1GcmkgQXByIDE0IDE2OjAzOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtNjgqLSotZWxmKi4KLQkqIGVsZjMyLW02OGsuYzogRmlsbGVkIG91dCBpbXBsZW1lbnRhdGlvbiwgZXhjZXB0IGZvciBkeW5hbWljCi0JbGlua2luZyBzdXBwb3J0LgotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgKl9HT1RfUENSRUwsICpfR09UT0ZGLAotCSpfUExUX1BDUkVMLCAqX1BMVE9GRiwgKl82OEtfKiByZWxvY2F0aW9ucyBmb3IgRUxGLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBBcHIgMTMgMTQ6Mjg6MDQgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQGFkZGVyLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbTY4ay5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBDaGFuZ2UgZnJvbQotCTEgdG8gMi4KLQkoYmZkX3RhcmdldCk6IENoYW5nZSBtaW5pbXVtIHNlY3Rpb24gYWxpZ25tZW50IGZyb20gMSB0byAyLgotCi1XZWQgQXByIDEyIDEyOjQwOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKG1hY2hpbmVfdHlwZSwgY2FzZSBiZmRfYXJjaF9taXBzKTogVHJlYXQgUjgwMDAgbGlrZQotCVI2MDAwIGFuZCBSNDAwMCBmb3Igbm93LgotCi1UdWUgQXByICA0IDEyOjI4OjI1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0JKiBob3N0cy9tcHcuaDogTmV3IGZpbGUsIE1QVyBob3N0IGRlZmluaXRpb25zLgotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luLCBlY29mZl9zd2FwX3Bkcl9pbikgW01QV19DXToKLQlBbHRlcm5hdGUgdmVyc2lvbnMgd2l0aG91dCBFQ09GRl82NCB0aGF0IGNob2tlcyBNUFcgQy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogQWRkIGFsdGVybmF0aXZlIHZlcnNpb24gd2l0aAotCXBhcnRseS1leHBhbmRlZCBtYWNyb3MuCi0KLVRodSBNYXIgMzAgMTQ6NTY6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvcgotCW92ZXJmbG93IGlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLgotCi1UaHUgTWFyIDMwIDE0OjMyOjI2IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogY29uZmlnLmJmZDogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKLQlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGJ1aWxkIGEgbGlicmFyeSB3aGljaCBkZWZhdWx0cyB0byBhLm91dC4KLQkqIGNvbmZpZy9pMzg2LWxhb3V0Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGludXgubXQuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxlbGYubXQuCi0JQ29tbWVudCBvdXQgRVhUUkFMSUJTLgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogUmVtb3ZlLgotCi1XZWQgTWFyIDI5IDEyOjAxOjMwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IENhY2hlIHRoZSBzZWN0aW9uIHN5bWJvbCBpbgotCXRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiB0aGUgc2VjdGlvbiwgdG8gYXZvaWQgbG9vcGluZyBmb3IgZWFjaAotCXJlbG9jLgotCi0JKiBjcHUtaDg1MDAuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBuYW1lIGZyb20gIkg4LzMwMCIgdG8KLQkiaDgzMDAiIGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGNwdS0qIGZpbGVzLgotCi1UdWUgTWFyIDI4IDE1OjE0OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChiX291dF9jYW5vbmljYWxpemVfcmVsb2MpOiBIYW5kbGUgU0VDX0NPTlNUUlVDVE9SCi0Jc2VjdGlvbnMuCi0JKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFNraXAgY29uc3RydWN0b3IKLQlzeW1ib2xzIHdoaWNoIHRoZSBtYWluIGxpbmtlciBjb2RlIGRpZCBub3QgZG8gYW55dGhpbmcgd2l0aC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBVc2UgdWRhdGEucCBpZiBpdCBpcyBzZXQsCi0JcmF0aGVyIHRoYW4gbG9va2luZyB0aGUgc3ltYm9sIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgSnVzdCBwYXNzCi0JdGhyb3VnaCBjb25zdHJ1Y3RvciBzeW1ib2xzIGZvciB3aGljaCB1ZGF0YS5wIGlzIG5vdCBzZXQuICBJZiB0aGUKLQlsaW5rZXIgZGVmaW5lZCB0aGUgc3ltYm9sLCBjbGVhciB0aGUgY29uc3RydWN0b3IgZmxhZy4KLQotVHVlIE1hciAyMSAxMDo1MDozMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFNpZ24gZXh0ZW5kIGNvbnN0YW50cyBmcm9tCi0JUl9EQVRBX09WRVJSSURFIGZpeHVwcy4KLQkqIGxpYmhwcGEuaCAoc2lnbl9leHRlbmQpOiBSZW5hbWVkIGZyb20gc2lnbl9leHQuICBGaXguCi0JKGxvd19zaWduX2V4dGVuZCk6IExpa2V3aXNlLgotCi1Nb24gTWFyIDIwIDIyOjM5OjEwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFRpZ2h0ZW4gdGVzdCB0byBkZXRlcm1pbmUKLQl3aGF0IHN5bWJvbHMgYXJlIHNlY3Rpb24gc3ltYm9scy4KLQotU2F0IE1hciAxOCAwMTo1NDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogQW4gZW1wdHkgYXJjaGl2ZSBpcyBPSy4KLQotRnJpIE1hciAxNyAxNjoyOTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IEp1c3QgcmV0dXJuIHRydWUgd2hlbgotCWVpdGhlciB0aGUgaW5wdXQgb3Igb3V0cHV0IHNlY3Rpb24gaXNuJ3QgYXR0YWNoZWQgdG8gYSBTT00gQkZELgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFNpbWlsYXJseSBmb3IgQkZEIHByaXZhdGUgZGF0YS4KLQotRnJpIE1hciAxNyAxMTo1MDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2hlY2sgd2hldGhlciBhIGR5bmFtaWMKLQlvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZCwgYW5kIGlnbm9yZSBpdCB0aGUgc2Vjb25kIHRpbWUuCi0KLVdlZCBNYXIgMTUgMTE6NTY6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9TUEFSQ19HT1QxMyBmcm9tCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQgdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX193cml0ZV9yZWxvY3MpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZWxmNjRfX3dyaXRlX3JlbG9jcyk6IERvbid0IGRlY2xhcmUuCi0KLVR1ZSBNYXIgMTQgMDU6NTQ6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHN0YWItc3ltcy5jIChhb3V0X3N0YWJfbmFtZSk6IE1vdmVkIGFvdXRfc3RhYl9uYW1lcyB0byBiZSBsb2NhbAotCXRvIHRoaXMgZnVuY3Rpb24uICBSZWNvZGVkIGZ1bmN0aW9uIHRvIHN0b3AgdXNpbmcgdGFibGUsIHRvCi0JaW1wcm92ZSBwZXJmb3JtYW5jZSAob24gaTQ4Ni1uZXRic2QgaG9zdCkuICBMZWZ0IG9sZCB2ZXJzaW9uCi0JaW50YWN0IHVuZGVyICIjaWYgMCIgZm9yIGZ1cnRoZXIgcGVyZm9ybWFuY2UgdGVzdGluZy4KLQotTW9uIE1hciAxMyAxMzo0ODo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogTWFrZSBzdGF0aWMuICBVc2UgUFRSIGFyZ3VtZW50IGFzIGEKLQlwb2ludGVyIHRvIGEgYm9vbGVhbiB2YXJpYWJsZSBzZXQgdG8gdHJ1ZSBpZiBzb21ldGhpbmcgZmFpbHMuCi0JQ2FzdCB0byBQVFIgcmF0aGVyIHRoYW4gdm9pZCAqLgotCShzeW1faXNfZ2xvYmFsKTogUmV3cml0ZSBmb3IgY2xhcml0eS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBJZiB0aGUgcHJvZ3JhbSBoZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwsCi0JY2FsbCBfYmZkX2Vycm9yX2hhbmRsZXIgYW5kIHJldHVybiBmYWlsdXJlIHJhdGhlciB0aGFuIGFib3J0aW5nLgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBhc3MgYm9vbGVhbiB2YXJpYWJsZSB3aGVuCi0JY2FsbGluZyB3cml0ZV9yZWxvY3MuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQpOiBEZWZpbmUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogRGVjbGFyZSB2YXJpYWJsZXMgaW4gaW5uZXIKLQlibG9ja3MuICBQYXNzIGVsZl9pbmZvX2ZhaWxlZCBzdHJ1Y3R1cmUgd2hlbiBjYWxsaW5nCi0JZWxmX2V4cG9ydF9zeW1ib2wgYW5kIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wuCi0JKGVsZl9leHBvcnRfc3ltYm9sKTogVHJlYXQgZGF0YSBhcmd1bWVudCBhcyBlbGZfaW5mb19mYWlsZWQgcmF0aGVyCi0JdGhhbiBiZmRfbGlua19pbmZvLiAgU2V0IGZhaWxlZCBmaWVsZCBvbiBlcnJvci4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShzdHJ1Y3QgZWxmX2ZpbmZvX2ZhaWxlZCk6IERlZmluZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogUGFzcyBlbGZfZmluZm9fZmFpbGVkIHN0cnVjdHVyZSB3aGVuIGNhbGxpbmcKLQllbGZfbGlua19vdXRwdXRfZXh0c3ltLiAgVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBUcmVhdCBkYXRhIGFyZ3VtZW50IGFzIGVsZl9maW5mb19mYWlsZWQKLQlyYXRoZXIgdGhhbiBlbGZfZmluYWxfbGlua19pbmZvLiAgU2V0IGZhaWxlZCBmaWVsZCBvbiBlcnJvci4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgd3JpdGUKLQlvdXQgUExUUkVMU1osIFBMVFJFTCBhbmQgSk1QUkVMIHJlbG9jcyBpZiB0aGVyZSBpcyBhIC5yZWxhLnBsdAotCXNlY3Rpb24uICBTb2xhcmlzIDIuNCBhcHBhcmVudGx5IGRvZXMgbm90IGhhbmRsZSBlbXB0eSByZWxvYwotCWluZm9ybWF0aW9uIGNvcnJlY3RseS4KLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiBDYXN0IGdldHVpZCBhbmQgZ2V0Z2lkIHJlc3VsdHMgdG8KLQlsb25nLCBhbmQgcHJpbnQgd2l0aCAlbGQuCi0KLUZyaSBNYXIgMTAgMTY6NDE6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IEFsd2F5cyB1c2UgdGhlIG91dHB1dAotCXNlY3Rpb24gaWYgaXQgaXMgbm90IE5VTEwuCi0KLVRodSBNYXIgIDkgMTU6MDY6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IElmIHRoZSBsaW5lIG51bWJlciBjb3VudCBvcgotCXRoZSByZWxvYyBjb3VudCBkb2VzIG5vdCBmaXQsIHByaW50IGFuIGVycm9yIGFuZCByZXR1cm4gMC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JY29mZl9zd2FwX3Njbmhkcl9vdXQuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZQotCW9mIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dC4KLQotCSogYmZkLmM6IEluY2x1ZGUgPHN0ZGFyZy5oPiBvciA8dmFyYXJncy5oPiwgZGVwZW5kaW5nIHVwb24KLQlBTlNJX1BST1RPVFlQRVMuCi0JKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpOiBOZXcgZ2xvYmFsIHR5cGUuCi0JKF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2Vycm9yX2hhbmRsZXIpOiBOZXcgQkZEIHByaXZhdGUgZ2xvYmFsIHZhcmlhYmxlLgotCShiZmRfc2V0X2Vycm9yX2hhbmRsZXIpOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkoYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUpOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Vycm9yX2hhbmRsZXIpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIsCi0JYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGJmZF9nZXRfc3ltY291bnQuICBDaGVjayByX2luZGV4IGFmdGVyCi0Jc2V0dGluZyByX2V4dGVybiBiYXNlZCBvbiB3aGV0aGVyIHRoaXMgaXMgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfSU4pKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlciwgYW5kIHVzZSBpdAotCWluc3RlYWQgb2YgYmZkX2dldF9zeW1jb3VudC4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYwotCXN3YXAgcm91dGluZXMuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyCi0JdG8gZGVjbGFyYXRpb24uCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogUGFzcwotCWluZm8tPmR5bnN5bV9jb3VudCB0byByZWxvYyBzd2FwIHJvdXRpbmVzLgotCSogYW91dC1uczMyay5jIChNWV9zd2FwX3N0ZF9yZWxvY19pbik6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIuCi0JKiBocDMwMGhwdXguYyAoTVkoc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKE1ZKHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYyBzd2FwCi0Jcm91dGluZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQKLQlwYXJhbWV0ZXIuCi0JKE5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYwotCXN3YXAgcm91dGluZXMuCi0KLVRodSBNYXIgIDkgMTI6MDQ6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24gdmVjdG9yIHRvIGJlCi0JY2FsbGVkIGJ5IHRoZSBsaW5rZXIgdG8gbWVyZ2UgYW55IHByaXZhdGUgYmZkIGRhdGEgb2YgdGhlIGlucHV0Ci0JZmlsZXMgYW5kIHRoZSBvdXRwdXQgZmlsZS4gIFVzZWQgYnkgdGhlIFBvd2VyUEMgRUxGIHN1cHBvcnQgdG8KLQljaGVjayB3aGV0aGVyIC1tcmVsb2NhdGFibGUgaXMgdXNlZCBmb3IgYWxsIG1vZHVsZXMuCi0JKGJmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldyBmdW5jdGlvbiB2ZWN0b3IgdG8gYmUgY2FsbGVkIGJ5IHRoZQotCWFzc2VtYmxlciB0byBzZXQgcHJpdmF0ZSBmbGFncy4gIFVzZWQgYnkgdGhlIFBvd2VyUEMgRUxGIHN1cHBvcnQKLQl0byBzZXQgdGhhdCBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgd2FzIGFzc2VtYmxlZCB3aXRoIHRoZQotCS1tcmVsb2NhdGFibGUgb3B0aW9uLgotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0NPUFkpOiBBZGQgaW50aWlhbGl6YXRpb24gb2YgdGhlCi0JYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgYW5kIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyBmdW5jdGlvbgotCXZlY3RvcnMuCi0KLQkqIGJmZC1pbjIuaCwgbGliYmZkLWluLmg6IFJlYnVpbGQgd2l0aCBiZmQuYyBhbmQgdGFyZ2V0cy5jCi0JY2hhbmdlcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgZnVuY3Rpb24gdG8gc2V0IHRoZQotCUVMRiBlX2ZsYWdzIGZpZWxkLgotCShwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgdGhlIGVfZmxhZ3MgZmllbGQgZnJvbSB0aGUKLQlpbnB1dCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgZm9yIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUKLQllX2ZsYWdzIGZpZWxkIG9mIGFsbCBvZiB0aGUgbGlua2VyIGlucHV0IGZpbGVzLgotCi0JKiBsaWJlbGYuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBwcGNfZmxhZ3NfaW5pdCBmaWVsZCBzbyB0aGF0IHRoZQotCVBvd2VyUEMgc3VwcG9ydCBjYW4gY2hlY2sgaWYgY29tcGF0YWlibGUgZV9mbGFncyBhcmUgcHJlc2VudC4KLQotCSogYW91dC10YXJnZXQuaDogQWRkIE5PUCBmb3IgdGhlIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0JYW5kIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyBmdW5jdGlvbiB2ZWN0b3JzLgotCSogY29mZmNvZGUuaDogRGl0dG8uCi0JKiBlbGYzMi10YXJnZXQuaDogRGl0dG8uCi0JKiBlbGY2NC10YXJnZXQuaDogRGl0dG8uCi0JKiBsaWJiZmQuaDogRGl0dG8uCi0JKiBsaWJlY29mZi5oOiBEaXR0by4KLQkqIHNvbS5jOiBEaXR0by4KLQotV2VkIE1hciAgOCAwMDo1Mzo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbWlwczo4MDAwIGVudHJ5LgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBNYXJrIGFuIHVuZGVmaW5lZCBCU0ZfV0VBSyBzeW1ib2wgYXMKLQlTVEJfV0VBSyByYXRoZXIgdGhhbiBTVEJfR0xPQkFMLgotCi1UdWUgTWFyICA3IDEyOjIzOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4LgotCShiZmRfY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUgYXMgTlVMTCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkIHRvCi0JY29mZl9hZGp1c3Rfc3ltbmR4LgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IENhbGwgY29mZl9hZGp1c3Rfc3ltbmR4IGlmIGl0Ci0JaXMgZGVmaW5lZC4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZSBiZWZvcmUgaW5jbHVkaW5nIGNvZmZjb2RlLmguCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBTa2lwIGJpbmFyeV92ZWMgd2hlbgotCXNlYXJjaGluZyB0aHJvdWdoIGJmZF90YXJnZXRfdmVjdG9yLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBDaGVjayBTSFRfTk9CSVRTIGJlZm9yZSBjaGVja2luZwotCXNoX3NpemUuCi0KLU1vbiBNYXIgIDYgMjM6MzE6MzYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBLZWVwIFNIVF9OT0JJVFMgc2VjdGlvbnMgYWZ0ZXIKLQkhU0hUX05PQklUUyBvbmVzLgotCi1Nb24gTWFyICA2IDA5OjUzOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjcHUtaHBwYS5jIChhcmNoX2luZm9fc3RydWN0KTogU3VwcG9ydCBib3RoIFBBMS4wIGFuZCBQQTEuMQotCW1hY2hpbmUgdHlwZXMuCi0JKGJmZF9ocHBhX2FyY2gpOiBMaW5rIGluIGJvdGggUEExLjAgYW5kIFBBMS4xIGFyY2hpdGVjdHVyZSBpbmZvCi0Jc3RydWN0dXJlcy4KLQkqIGxpYmhwcGEuaCAoZW51bSBwYV9hcmNoKTogTmV3IGVudW1lcmF0aW9uIHRvIGRlc2NyaWJlIHRoZQotCWRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUgUEEgYXJjaGl0ZWN0dXJlLgotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBVc2UgbmV3IGVudW1lcmF0aW9uIHRvIHNldCBtYWNoaW5lCi0JdHlwZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogSWYgdGhlIG1hY2hpbmUgdHlwZSBpcyBQQTEuMSwgdGhlbiB1c2UgdGhlCi0JUEExLjEgbWFjaGluZSBpZGVudGlmaWVyIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotVGh1IE1hciAgMiAxNTo1ODoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBUcmVhdCB0aGUgaW5kZXggb2YgYQotICAgICAgICBiYXNlIHJlbGF0aXZlIHJlbG9jIGFzIGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZSwgcmVnYXJkbGVzcwotICAgICAgICBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogRG91YmxlIGNoZWNrIHRoYXQgdGhlCi0JY2FsbGVyIGlzIHdyaXRpbmcgdG8gYSB2YWxpZCBzZWN0aW9uLgotCi1UaHUgTWFyICAyIDE0OjM3OjU3IDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0KLQkqIGJpbmFyeS5jOiBBZGQgc3VwcG9ydCBmb3IgcmVhZGluZyBiaW5hcnkgZmlsZXMuICBMb2FkcyB0aGUgcmF3Ci0JY29udGVudHMgb2YgdGhlIGZpbGUgaW50byBhIGRhdGEgc2VjdGlvbiBhbmQgd3JhcHMgc29tZSBzeW1ib2xzCi0JYXJvdW5kIGl0LiAgVGhlIHN5bWJvbHMgYF9iaW5hcnlfPGZpbGVuYW1lPl9zdGFydCcgYW5kCi0JYF9iaW5hcnlfPGZpbGVuYW1lPl9lbmQnIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkYXRhLAotCXdoaWxlIGBfYmluYXJ5XzxmaWxlbmFtZT5fc2l6ZScgaXMgYW4gYWJzb2x1dGUgc3ltYm9sIHdob3NlIHZhbHVlCi0JaXMgdGhlIHNpemUgb2YgdGhlIGRhdGEuICA8ZmlsZW5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBiaW5hcnkKLQlpbnB1dCBmaWxlLCB3aXRoIGFsbCBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgY29udmVydGVkIHRvCi0JdW5kZXJzY29yZXMuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlKTogQXNzdW1lIHVzZXJzIGtub3dzIHdoYXQKLQl0aGV5J3JlIGRvaW5nIGlmIG9uZSBvZiB0aGUgYXJjaGl0ZWN0dXJlcyBpcyBiZmRfYXJjaF91bmtub3duLgotCi1XZWQgTWFyICAxIDE3OjMwOjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBGb3IgcmVsb2NhdGlvbgotCVJfUFBDX0dPVDE2LCBjaGFuZ2UgY29tcGxhaW5fb25fb3ZlcmZsb3cgdG8gYmUKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0KLVdlZCBNYXIgIDEgMTE6NTI6NTUgMTk5NSAgSmFzb24gTW9sZW5kYSAgPGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgcG93ZXJwYy0qLWFpeCouCi0KLVdlZCBNYXIgIDEgMTE6NTc6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoQ09GRl9QQUdFX1NJWkUpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSBvdXRwdXQgb2YgVERFRkFVTFRTIHRvIGF2b2lkIHJlbHlpbmcgb24KLQlzZW1hbnRpY3Mgb2Ygc2luZ2xlIHF1b3RlcyBpbiBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uLgotCi1UdWUgRmViIDI4IDEyOjUzOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogU29ydCBlbXB0eSBzZWN0aW9ucyBiZWZvcmUgbm9uLWVtcHR5Ci0Jc2VjdGlvbnMsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBWTUEuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotbGludXhlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWxlbGYuCi0JKGlbMzQ1XTg2LSotZ251ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1nZWxmLgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1nZWxmLm10OiBOZXcgZmlsZS4KLQotTW9uIEZlYiAyNyAxMjo1ODoyNSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBhZGQgYTI5ay0qLXZ4d29ya3MgY29uZmlndXJhdGlvbi4KLQotV2VkIEZlYiAyMiAxNDo0MDoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IENoYW5nZSBkZWNsYXJhdGlvbiB0bwotCXVzZSByZWxvY19ob3d0b190eXBlIHJhdGhlciB0aGFuIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QuCi0KLVR1ZSBGZWIgMjEgMTg6MTk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIGlmIGFza2VkCi0JZm9yIHJlbG9jYXRpb25zIGZvciB0aGUgLmJzcyBzZWN0aW9uLgotCi1UdWUgRmViIDIxIDE1OjEzOjA1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBIYW5kbGUgb2JqZWN0cyB3aXRoIG9kZAotCWxlbmd0aHMuCi0KLUZyaSBGZWIgMTcgMTI6MzQ6MzYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2dvdDE2X3JlbG9jKTogTWFrZSBHT1Qgc3R5bGUgcmVsb2NzIGFkZAotCTMyNzY4LCBzbyB0aGUgR09UIHBvaW50ZXIgY2FuIHBvaW50IHRvIDE2Mzg0IHBvaW50ZXJzLCBpbnN0ZWFkIG9mCi0JODE5Mi4KLQotRnJpIEZlYiAxNyAxMTo0NTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL3N5c3Y0Lmg6IEluY2x1ZGUgPHVuaXN0ZC5oPiwgPHN0ZGxpYi5oPiwgYW5kIDx0aW1lLmg+LgotCU9ubHkgZGVmaW5lIFNFRUtfU0VUIGFuZCBTRUVLX0NVUiBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBkZWZpbmVkLgotCVJlbW92ZSBhbGwgZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCi0JKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBSZXR1cm4gJ1cnIGZvciBhIHdlYWsgc3ltYm9sLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBzdGFydCBhZGRyZXNzIGFuZCBmbGFncwotCWJlZm9yZSBjYWxsaW5nIGNvZmZfbWtvYmplY3RfaG9vay4gIFJlc3RvcmUgdGhlbSBvbiBmYWlsdXJlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9ta29iamVjdF9ob29rKTogSWYgbm90IEVDT0ZGX0FPVVRfWk1BR0lDLAotCWNsZWFyIERfUEFHRUQuCi0KLQkqIGNvZmZnZW4uYzogUmVpbmRlbnRlZC4KLQotVGh1IEZlYiAxNiAxNDozNzoyMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCB1c2UgYml0cG9zIGluIG92ZXJmbG93Ci0JY2FsY3VsYXRpb25zLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTYgMTM6MjI6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBSZW1vdmUgYWxsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGljaCByZXR1cm4KLQlpbnQgb3Igdm9pZCwgZXhjZXB0IHRoZSBvbmUgZm9yIGZyZWUuCi0KLVdlZCBGZWIgMTUgMTQ6NTQ6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBVc2UgYSBkZXN0aW5hdGlvbiBtYXNrIG9mCi0JMHhmZmZmZmZmZiBmb3IgUl9QUENfUkVMMzIsIG5vdCAwLgotCShwb3dlcnBjX3JlbG9jX21hcCk6IEFkZCBsb3cgMTYgYml0LCBoaWdoIDE2IGJpdCwgYW5kIGhpZ2ggMTYgYml0Ci0JYWRqdXN0ZWQgcmVsb2NhdGlvbnMuCi0KLVR1ZSBGZWIgMTQgMTc6NDc6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUpOiBEZWZpbmUuCi0JKG1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVmaW5lLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGZpbmRfbGluZV9pbmZvIGZpZWxkLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luKTogTW92ZSB0byBlY29mZmxpbmsuYy4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKGNtcF9mZHJ0YWJfZW50cnkpOiBMaWtld2lzZS4KLQkobWtfZmRydGFiKTogTGlrZXdpc2UuCi0JKGxvb2t1cCk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCBjYWxsIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKLQl0byBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgQWxsb2NhdGUgZmluZF9saW5lX2luZm8gaWYgbmVjZXNzYXJ5LgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfaW4pOiBNb3ZlIGluIGZyb20gZWNvZmYuYy4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKGNtcF9mZHJ0YWJfZW50cnkpOiBMaWtld2lzZS4gIFVzZSBQVFIgaW5zdGVhZCBvZiB2b2lkICouCi0JKG1rX2ZkcnRhYik6IE1vdmUgaW4gZnJvbSBlY29mZi5jLiAgQWRkIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsCi0JYW5kIGxpbmVfaW5mbyBhcmd1bWVudHMsIGFuZCB1c2UgdGhlbSBpbnN0ZWFkIG9mIGVjb2ZmX2RhdGEuCi0JKGZkcnRhYl9sb29rdXApOiBNb3ZlIGluIGZyb20gbG9va3VwIGluIGVjb2ZmLmMuICBSZW1vdmUgYWJmZAotCWFyZ3VtZW50LCBhZGQgbGluZV9pbmZvIGFyZ3VtZW50LiAgVXNlIGl0IGluc3RlYWQgb2YgZWNvZmZfZGF0YS4KLQkoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IE5ldyBmdW5jdGlvbiwgbW9zdGx5IGZyb20gdGhlIG9sZAotCV9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUgaW4gZWNvZmYuYy4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IFJlbW92ZSBmaW5kX2J1ZmZlciwgZmRydGFiX2xlbiBhbmQKLQlmZHJ0YWIgZmllbGRzLCByZXBsYWNpbmcgdGhlbSBmaW5kX2xpbmVfaW5mbyBmaWVsZC4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9pbik6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQpOiBEZWNsYXJlLgotCSogbGliYmZkLWluLmggKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBlY29mZi5vIGZvciBiZmRfZWxmMzJfYmlnbWlwc192ZWMgb3IKLQliZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBGZWIgMTQgMTQ6MDQ6MjIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgZWxmX21hY2hpbmVfYWx0MSBhbmQKLQllbGZfbWFjaGluZV9hbHQyIHdoaWNoIHByb3ZpZGUgYWx0ZXJuYXRlIHZlcnNpb25zIG9mIHRoZSBtYWNoaW5lCi0JY29kZS4KLQotCSogZWxmMzItcHBjLmMgKEVMRl9NQUNISU5FX0FMVDEsIEVMRl9NQUNISU5FX0FMVDIpOiBEZWZpbmUgdG8KLQlyZWNvZ25pemUgb2xkIHZlcnNpb25zIG9mIHRoZSBQb3dlclBDIG1hY2hpbmUgY29kZS4KLQotCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQotCWZpZWxkcyBkZWZpbmVkIGJ5IEVMRl9NQUNISU5FX0FMVDEgYW5kIEVMRl9NQUNISU5FX0FMVDIuCi0KLQkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQpOiBJbml0aWFsaXplIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUKLQlmaWVsZHMgZGVmaW5lZCBieSBFTEZfTUFDSElORV9BTFQxIGFuZCBFTEZfTUFDSElORV9BTFQyLgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogSW4gYWRkaXRpb24gdG8gdGhlCi0JbWFpbiBtYWNoaW5lIGNvZGUgZmllbGQsIGNoZWNrIHRoZSB0d28gYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQotCWZpZWxkcy4KLQotVHVlIEZlYiAxNCAxMjo0Njo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuICBEb24ndAotCWFjY2VwdCBNX1NQQVJDIGlmIGJmZF9hcmNoX3NwYXJjIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQKLQlhcmNoaXRlY3R1cmVzLCBhbmQgZG9uJ3QgYWNjZXB0IGEgNjgweDAgbWFjaGluZSB0eXBlIGlmCi0JYmZkX2FyY2hfbTY4ayBpcyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMuCi0JKiBhb3V0MC5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQotTW9uIEZlYiAxMyAyMzoyNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBEb24ndCByZXR1cm4gYSBwb2ludGVyCi0JdG8gZ2FyYmFnZSBpZiB0aGUgc3ltYm9sIGluZGV4IGlzIG91dCBvZiByYW5nZS4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCi1UaHUgRmViICA5IDE4OjM2OjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBpMzg2bXNkb3Muby4KLQotVGh1IEZlYiAgOSAxMjowMjozNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODZsaW51eC5jIChORUVEU19TSFJMSUIpOiBEZWZpbmUuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDcmFzaCBpZiBhIE5FRURTX1NIUkxJQiBzeW1ib2wgaXMKLQl1bmRlZmluZWQuICBGcm9tIGhqbEBueW5leHN0LmNvbSAoSC5KLiBMdSkuCi0KLVdlZCBGZWIgIDggMTc6MjY6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEFsbG9jYXRlIGNvbW1vbgotCXN5bWJvbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yIGNvbW1vbgotCXN5bWJvbCBzaXplIG92ZXJmbG93LgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogQWRqdXN0IHJlZmVyZW5jZXMKLQl0byBjb21tb24gc3ltYm9sIGluZm9ybWF0aW9uIGZvciBuZXcgc3RydWN0dXJlLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDggMDk6NTM6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogUHV0IFNIVF9OT0JJVFMgc2VjdGlvbnMgYWZ0ZXIgIVNIVF9OT0JJVFMuCi0KLVR1ZSBGZWIgIDcgMTY6Mjc6MzMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCByZXR1cm4gZmFsc2UsIGRvbid0Ci0JYWJvcnQuCi0KLVR1ZSBGZWIgIDcgMTQ6NDM6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmM6IFJlZm9ybWF0dGVkIHNvbWUgY29tbWVudHMgYW5kIGJyYWNlIGNvbnN0cnVjdHMgaW4KLQlyZWNlbnQgY2hhbmdlcyB0byBHTlUgc3R5bGUuCi0JKGNtcF9mZHJ0YWJfZW50cnksIG1rX2ZkcnRhYiwgbG9va3VwKTogVXNlIG9sZC1zdHlsZSBmdW5jdGlvbgotCWRlZmluaXRpb25zLgotCi1UdWUgRmViICA3IDE0OjIxOjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luKTogWmVybyBvdXQgaW50ZXJuIGJlZm9yZSBzZXR0aW5nCi0JYW55IG9mIHRoZSBmaWVsZHMuCi0KLU1vbiBGZWIgIDYgMjA6MDE6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVNhdCBGZWIgIDQgMTQ6MjA6MjQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4sIGVjb2ZmX3N3YXBfcGRyX291dCk6IGFkZGVkCi0JaW50ZXJuYWxpemluZy9leHRlcm5hbGl6aW5nIG5ldyAicHJvZiIgZmllbGQuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX3RkYXRhKTogYWRkZWQgZmRydGFiLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRml4ZWQuCi0KLU1vbiBGZWIgIDYgMTQ6MjU6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc2F3X25lZWRlZCBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHNhd19uZWVkZWQgaWYKLQlEVF9ORUVERUQgc2VlbiBpbiAuZHluYW1pYyBzZWN0aW9uLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogV2FybiBpZiBhbiB1bmRlZmluZWQgc3ltYm9sIGlzCi0Jb25seSByZWZlcmVuY2VkIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIG5vdCBtYWtpbmcgYSBzaGFyZWQKLQlvYmplY3QsIGFuZCBzYXdfbmVlZGVkIGlzIGZhbHNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBzYXdfbmVlZGVkLgotCi0JKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUspOiBEb24ndCBkZWZpbmUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNsZWFyIG9yIHNldAotCUVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3QgY2hlY2sgRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUsuCi0KLQlEaXN0aW5ndWlzaCBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIHJlZ3VsYXIgZGVmaW5lZCBzeW1ib2wuCi0JKiBsaW5rZXIuYyAoZW51bSBsaW5rX2FjdGlvbik6IEFkZCBERUZXLgotCShsaW5rX2FjdGlvbik6IEFkZCBiZmRfbGlua19oYXNoX2RlZndlYWsgY29sdW1uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBERUZXIGNhc2UuICBIYW5kbGUKLQliZmRfbGlua19oYXNoX2RlZndlYWsgaW4gYSBmZXcgb3RoZXIgY2FzZXMuCi0JKiBNYW55IGZpbGVzIChiZmRfbGlua19oYXNoX3VuZGVmd2Vhayk6IFJlbmFtZWQgZnJvbQotCWJmZF9saW5rX2hhc2hfd2Vhay4KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSGFuZGxlIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGdldF92YWx1ZSk6IExpa2V3aXNlLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBMaWtld2lzZS4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyk6IExpa2V3aXNlLgotCSogY29mZmxpbmsuYyAoY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogTElrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCShzZXRfc3ltYm9sX2Zyb21faGFzaCk6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IExpa2V3aXNlLgotCShiZmRfcGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCShzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAgNiAwMzoyMDoxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQsIGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU6Ci0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLW1zZG9zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGkzODZtc2Rvc192ZWMpOiBIYW5kbGUgaXQuCi0JKiBpMzg2bXNkb3MuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1tc2Rvcy5tdDogTmV3IGZpbGUuCi0JKiBiZmQuYyAoZW51bSBiZmRfZXJyb3IpOiBBZGRlZCBuZXcgdmFsdWUgYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZy4KLQkoYmZkX2Vycm1zZ3MpOiBBZGRlZCBzdHJpbmcgdG8gdGFibGUuCi0JKiBsaWJhb3V0LmggKHJlbG9jX3R5cGUtbG9va3VwKTogRGVjbGFyZSBpdC4KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZGVkIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ci4KLQkoaTM4Nm1zZG9zX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGl0IHRvIHRoZSBsaXN0LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotV2VkIEZlYiAgMSAwMTozMjoxNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbywgY2FzZSBSX0RBVEFfT05FX1NZTUJPTCk6IElmIHRoZXJlJ3MKLQlub3RoaW5nIGluIFJfREFUQV9PVkVSUklERSwgdGhlbiB0cnkgdG8gZmluZCB0aGUgYWRkZW5kIGluIHRoZQotCXNlY3Rpb24ncyBjb250ZW50cy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IElnbm9yZSB0aGUgYWRkZW5kIGluIGEgUl9EQVRBX09ORV9TWU1CT0wgZml4dXAuCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogTW9yZSBoZXJ1aXN0aWNzIHRvIGRldGVjdCB0aGUKLQlicmFpbmRhbWFnZWQgSFAgT1NGMSBsaW5rZXIuIAotCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGZvcmdldCB0byBmcmVlIHN1YnNwYWNlX3NlY3Rpb25zIGlmIHdlIGdldAotCWFuIGVycm9yLgotCShzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogQWxsb2NhdGUgc3RyaW5ncyBvbiB0aGlzIGJmZCdzIG9ic3RhY2sKLQlyYXRoZXIgdGhhbiBkaXJlY3RseSBvdXQgb2YgdGhlIGhlYXAuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIHNhdmVkIGNvcHkgb2YgdGhlCi0JY2Fub25pY2FsIHN5bWJvbHMuCi0JKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgc2F2ZWQgY29weSBvZiB0aGUKLQljYW5vbmljYWwgcmVsb2NhdGlvbnMuICBGcmVlIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMgd2hlbiB3ZSdyZQotCWRvbmUgd2l0aCB0aGVtLgotCi1UdWUgSmFuIDMxIDIxOjUzOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBtZW1iZXIgcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KLQkqIGVsZmNvZGUuaCAoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBOZXcgcGFyYW1ldGVycyBzb3J0ZWRfaGRycywKLQljb3VudCwgYW5kIG1heHBhZ2VzaXplLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQlJZiBzb3J0ZWRfaGRycyBpcyBub24tTlVMTCwgdXNlIGl0IHRvIGNvbXB1dGUgdGhlIG51bWJlciBvZiBzZWdtZW50cy4KLQlTYXZlIHJlc3VsdCBpbiBjYXNlIGNhbGxlZCBhZ2Fpbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTb3J0IGhlYWRlcnMgYmVmb3JlIGNhbGxpbmcKLQlnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KLQotVHVlIEphbiAzMSAxNToyNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBBZGQgc29ydGVkX2hkcnMgcGFyYW1ldGVyLgotCVNlYXJjaCB0aHJvdWdoIGl0IHJhdGhlciB0aGFuIHRocm91Z2ggdW5zb3J0ZWQgc2VjdGlvbiBoZWFkZXJzLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFBhc3Mgc29ydGVkX2hkcnMgdG8KLQltYXBfcHJvZ3JhbV9zZWdtZW50cy4KLQotTW9uIEphbiAzMCAyMjowNDo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRml4IHByb2JsZW1zIGluIHJhbmdlCi0JY2hlY2tpbmcuICBFeHBlY3QgYXJndW1lbnQgT0ZGU0VUIHRvIGJlIHNlY3Rpb24tcmVsYXRpdmUuICBGcm9tCi0JRGF2aWQgTW9zYmVyZ2VyLVRhbmcsIGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUuCi0KLU1vbiBKYW4gMzAgMTE6MjI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IERvbid0IGRvCi0JYW55dGhpbmcgaWYgd2UgYXJlIG5vdCBsaW5raW5nIGFuIEVMRiBmaWxlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLgotCi1TYXQgSmFuIDI4IDEyOjQ4OjU3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoY29tcGFyZV9zdWJzcGFjZXMpOiBOZXcgZnVuY3Rpb24gdG8gc29ydCBzdWJzcGFjZXMgYnkKLQl0aGVpciBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuCi0JKHNldHVwX3NlY3Rpb25zKTogV2hlbiBjb21wdXRpbmcgdGhlIGluZGV4IGZvciBlYWNoIHN1YnNwYWNlLAotCWhhbmRsZSBjYXNlIHdoZXJlIHNldHVwX3NlY3Rpb25zIHJlYWRzIHRoZSBzdWJzcGFjZXMgaW4gYQotCWRpZmZlcmVudCBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBvYmplY3QgZmlsZS4KLQkoc29tX2lzX3NwYWNlKTogQWxzbyBleGFtaW5lIHRoZSBvdXRwdXQgc2VjdGlvbiBmb3IgdGhlIGNvbnRhaW5pbmcKLQlzZWN0aW9uLgotCShzb21faXNfc3Vic3BhY2UsIHNvbV9pc19jb250YWluZXIpOiBMaWtld2lzZS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCBwcmVwYXJlIG9yIHdyaXRlIGZpeHVwcyBoZXJlLiAgV2hlbgotCXdyaXRpbmcgdGhlIHN5bWJvbCBzdHJpbmdzLCB1c2UgdGhlIHVuc29ydGVkIHN5bWJvbCB0YWJsZS4KLQkoc29tX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHdyaXRlIHRoZSBzeW1ib2wgdGFibGUgaGVyZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogUHJlcGFyZSBhbmQgd3JpdGUgdGhlIGZpeHVwcyBoZXJlLiAgTGlrZXdpc2UKLQlmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFVuZGVmaW5lZCBzeW1ib2xzIGFsd2F5cyBoYXZlCi0JdHlwZSBTU19VTlNBVCByZWdhcmRsZXNzIG9mIEJTRl9FWFBPUlQuCi0JKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFVucGFjayBhbmQgYXR0YWNoIGFyZ3VtZW50IGxvY2F0aW9uCi0JaW5mb3JtYXRpb24gZm9yIFJfUENSRUxfQ0FMTCBhbmQgUl9BQlNfQ0FMTCByZWxvY2F0aW9ucy4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBOZXcgaGV1cmlzdGljIHRvIGRldGVybWluZSBpZiB0aGUKLQllbnRyeSBhbmQgZmxhZ3MgZmllbGRzIGFyZSBzd2l0Y2hlZCBpbiB0aGUgZXhlYyBoZWFkZXIuCi0KLVNhdCBKYW4gMjggMDA6MTY6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSAqc3ltX2hhc2ggaW5zdGVhZAotCW9mIGggaWYgd2UgbWlnaHQgbm90IGJlIGRvaW5nIGFuIEVMRiBsaW5rLgotCi1GcmkgSmFuIDI3IDE2OjEzOjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogSWYgdGhlIHNpemUgb2YgYW4gaW5wdXQKLQkucmVnaW5mbyBzZWN0aW9uIGlzIHplcm8sIGZvcmNlIGl0IHRvIHRoZSBjb3JyZWN0IHNpemUsIHNpbmNlIHRoZQotCWxpbmtlciBlbXVsYXRpb24gY29kZSBtYXkgaGF2ZSBjbG9iYmVyZWQgaXQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IENvcnJlY3QgU0hGX0FMTE9DIHRlc3QuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRnJlZSBzb3J0ZWRfaGRycy4KLQotVGh1IEphbiAyNiAwOTowMDoxMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IG9mZiBieQotCW9uZSBlbmQgYWRkcmVzcyBjYWxjdWxhdGlvbi4KLQotCSogY29uZmlnLmJmZDogKG02OCotZXN0LWNvZmYpOiBOZXcgY29uZmlndXJhdGlvbi4KLQotVGh1IEphbiAyNiAxMTozOToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBleGFtaW5lIHdlYWtkZWYgaWYKLQl3ZSBhcmUgdXNpbmcgYW4gRUxGIGhhc2ggdGFibGUuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQWx3YXlzIHNldCBFWEVDX1AgaWYKLQl0aGUgc3RhcnQgYWRkcmVzcyBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbiwgZXZlbiBpZiBTVEFUX0ZPUl9FWEVDCi0JaXMgc2V0LiAgSnVzdCB1c2UgU1RBVF9GT1JfRVhFQyBhcyBhbiBhZGRpdGlvbmFsIHRlc3QuCi0KLVRodSBKYW4gMjYgMTE6MTI6NTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogVXNlIEVNX1BQQyBpbnN0ZWFkIG9mCi0JRU1fQ1lHTlVTX1BPV0VSUEMuCi0KLQkqIGVsZjMyLXBwYy5jIChyZWxvY190eXBlKTogQWRkIGFsbCBTeXN0ZW0gVi40IGFuZCBlQUJJCi0JcmVsb2NhdGlvbnMgY3VycmVudGx5IGRlZmluZWQuCi0JKHBvd2VycGNfcmVsb2NfbWFwKTogQWRqdXN0IHRvIG5ldyByZWxvY2F0aW9uIG5hbWVzLgotCShlbGZfcG93ZXJwY19ob3d0b190YWJsZSk6IEFkZCBtb3N0IG9mIHRoZSBuZXcgcmVsb2NhdGlvbnMuCi0JKEVMRl9NQUNISU5FX0NPREUpOiBVc2UgRU1fUFBDIGluc3RlYWQgb2YgRU1fQ1lHTlVTX1BPV0VSUEMuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWFiaS4KLQotCSogY29uZmlnL3BwYy1lbGYubXQ6IEFkZCByczYwMDAgYXJjaGl0ZWN0dXJlIHN1cHBvcnQgdG8gdGhlCi0JUG93ZXJQQy4gIEFsc28gYWRkIFhDT0ZGIHN1cHBvcnQuCi0KLVdlZCBKYW4gMjUgMjM6MjY6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKENBTENfQURERU5EKTogRG9uJ3QgZGVmaW5lLgotCShjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLgotCi1UdWUgSmFuIDI0IDE0OjIyOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vdXRwdXRfZXh0c3ltKTogU2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQlFQ09GRiBzeW1ib2wgZnJvbSB0aGUgaGFzaCB0YWJsZSBlbnRyeS4KLQotTW9uIEphbiAyMyAxNDo1MzozNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29mZi1zaC5jIChjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3Qgc3VidHJhY3QKLQl2bWEgdHdpY2UuCi0KLU1vbiBKYW4gMjMgMTM6MzM6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbG9jKTogRG9uJ3QgaWdub3JlIHRoZSBwcmV2aW91cyBjb250ZW50cyBvZiBhbgotCVJfU0hfSU1NMzIgcmVsb2MuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZ251Kik6IFNldCBiZmRfbmFtZSB0byBpMzg2LWdudS4KLQkqIGNvbmZpZy9pMzg2LWdudS5tdDogTmV3IGZpbGUuICBJbmNsdWRlIEVMRiBzdXBwb3J0LgotCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5zdHJlYW1yKTogQ2FsbCBiZmRfY2FjaGVfaW5pdC4KLQotRnJpIEphbiAyMCAxMTo0NDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogT25seSBzZXQgdGhlIHN1bm9zIHNwZWNpZmljCi0JZmllbGRzIGlmIHdlIGFyZSBkb2luZyBhIHN1bm9zIGxpbmsuCi0KLVdlZCBKYW4gMTggMTI6Mjg6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjcHUtaDgzMDAuYyAoaDgzMDBfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbmFtZSBmcm9tICJIOC8zMDAiIHRvCi0JImg4MzAwIiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBjcHUtKiBmaWxlcy4KLQkoaDgzMDBoX2luZm9fc3RydWN0KTogQ2hhbmdlIG5hbWUgZnJvbSAiSDgvMzAwSCIgdG8gImg4MzAwaCIuCi0JKiBjb2ZmLWg4MzAwLmMgKHNwZWNpYWwpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGRpZmYuCi0KLVR1ZSBKYW4gMTcgMTA6NTI6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2J5dGUsIHJlbG9jX2hvd3RvX3R5cGUpOiBEZWZpbmUgaGVyZSwgbm90Li4uCi0JKiByZWxvYy5jIChiZmRfYnl0ZSwgcmVsb2NfaG93dG9fdHlwZSk6IGhlcmUuCi0JKiBDaGFuZ2VkIGFsbCBvY2N1cnJlbmNlcyBvZiBgYGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QnJwotCXRvIGJlIGBgcmVsb2NfaG93dG9fdHlwZScnIGluc3RlYWQuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0KLQkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZW51bSByZWxvY190eXBlKTogRGVmaW5lIG5ldyByZWxvY3MgdXNlZCBvbiBJcml4LgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBuZXcgcmVsb2NzLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19NU1lNLAotCVNIVF9NSVBTX0RXQVJGLCBhbmQgU0hUX01JUFNfRVZFTlRTLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogSGFuZGxlIHNlY3Rpb25zIG5hbWVkIC5tc3ltLCAuZGVidWdfKgotCWFuZCAuTUlQUy5ldmVudHMuKi4KLQotCSogc3JlYy5jIChzcmVjX2luaXQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0KLVNhdCBKYW4gMTQgMTk6MDk6NDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAam9ubnk+Ci0KLQkqIGFyY2h1cmVzLmMsIE1ha2VmaWxlLmluLCB0YXJnZXRzLmMsIGJmZC1pbjIuaCwgY29mZmNvZGUuaCwKLQljb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGNvbmZpZy93NjUubXQ6IEluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIFc2NS4KLQotU3VuIEphbiAxNSAxMzo1Nzo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ29uZmlndXJlIGZvciBXSU4zMi4KLQotVGh1IEphbiAxMiAxNjozMDo0NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogSW5jbHVkZSBgaGVhZGVycycuCi0KLQkqIHN1bm9zLmMgKG02OGtfcGx0X2ZpcnN0X2VudHJ5LCBzcGFyY19wbHRfZmlyc3RfZW50cnkpOiBOb3cKLQljb25zdC4KLQkqIHRla2hleC5jIChkaWdzKTogRGl0dG8uCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3BsdDBfZW50cnksIGVsZl9pMzg2X3BsdF9lbnRyeSk6IERpdHRvLgotCi0JKiBzcmVjLmMsIHRla2hleC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLiAgRGVsZXRlIHN0YXRpYyBhcnJheQotCWhleF92YWx1ZSBhbmQgcmVwbGFjZSByZWZlcmVuY2VzIHRvIGl0IHdpdGggcmVmZXJlbmNlcyB0bwotCWhleF9pbml0LCBoZXhfcCwgYW5kIGhleF92YWx1ZS4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIGRlcGVuZGVuY2llcy4KLQotCSogYXJjaHVyZXMuYyAoYXJjaHVyZXNfaW5pdF90YWJsZSk6IE5vdyBjb25zdC4KLQkoYmZkX2FyY2hfaW5pdCk6IEFkanVzdGVkIHR5cGUgb2YgbG9jYWwgdmFyIGBwdGFibGUnLgotCi1UaHUgSmFuIDEyIDA5OjMzOjI0IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaG9zdHMvc3ltbWV0cnkuaDogIFJlZGVmaW5lIGBzaGFyZWQnIHRvIGVuYWJsZSBjb21waWxhdGlvbgotCXdpdGggdGhlIG5hdGl2ZSBEeW5peCBjYyBjb21waWxlci4KLQkqIGkzODZkeW5peC5jOiAgSW5jbHVkZSBhb3V0eC5oIGluc3RlYWQgb2YgdXNpbmcgcm91dGluZXMKLQlmcm9tIGFvdXQzMi5jLgotCi1XZWQgSmFuIDExIDIxOjMxOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBNYWtlIHR5cGVkZWYgaW5jbHVkZSBgY29uc3QnLgotCSogYW91dC1uczMyay5jLCBhb3V0eC5oLCBib3V0LmMsIGNmLW02OGtseW54LmMsIGNvZmYtaTM4Ni5jLAotCWNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZmxpbmsuYywgY3B1LW5zMzJrLmMsIGVjb2ZmLmMsCi0JZWxmMzItaHBwYS5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLW1pcHMuYywgZWxmMzItc3BhcmMuYywKLQllbGZjb2RlLmgsIGxpYmJmZC1pbi5oLCBsaW5rZXIuYywgbWlwc2JzZC5jLCBubG0zMi1wcGMuYywgb2FzeXMuYywKLQlyZWxvYy5jLCBzb20uYzogRG9uJ3QgdXNlIGBjb25zdCcgaW4gY29tYmluYXRpb24gd2l0aAotCWByZWxvY19ob3d0b190eXBlJy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBlY29mZi5jIChlY29mZl90eXBlX3RvX3N0cmluZyk6IExvY2FsIHZhcmlhYmxlIGBidWZmZXIxJyBkb2Vzbid0Ci0JbmVlZCB0byBiZSBzdGF0aWMuCi0KLVdlZCBKYW4gMTEgMTQ6MzY6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNvcmUgZHVtcCBpZiBhIG11bHRpcGxlCi0JZGVmaW5pdGlvbiBvZiBhbiBhYnNvbHV0ZSBzeW1ib2wgaXMgZW5jb3VudGVyZWQuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElnbm9yZQotCXJlZGVmaW5pdGlvbnMgb2YgYW4gYWJzb2x1dGUgc3ltYm9sIHRvIHRoZSBzYW1lIHZhbHVlLgotCi1Nb24gSmFuICA5IDE1OjUxOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJdCdzIHJlYXNvbmFibGUgZm9yIG5vCi0JZmxhZ3MgdG8gYmUgc2V0LCBzbyBkb24ndCBpbnNpc3Qgb3RoZXJ3aXNlLgotCi1GcmkgSmFuICA2IDE2OjM5OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3Qgc2V0IEJTRl9HTE9CQUwgZm9yIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgSmFuICA0IDE0OjE0OjA1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogT25seSByZXR1cm4gc2VjdGlvbnMgd2hpY2gKLQljb3JyZXNwb25kIHRvIHN1YnNwYWNlcy4KLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3QgZm9yZ2V0IHRvIGJ1bXAgdGhlCi0JdG90YWxfc3Vic3BhY2VzIHdoZW4gd3JpdGluZyB0aGUgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCi0KLVdlZCBEZWMgMjggMjA6NTQ6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogVXNlIFNFQ19IQVNfQ09OVEVOVFMgdG8gaWRlbnRpZnkKLQlic3MtbGlrZSBzZWN0aW9ucy4KLQkoc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDI3IDE0OjAzOjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBUdXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTIGZvciBic3MtbGlrZQotCXNlY3Rpb25zLgotCi1UdWUgRGVjIDIwIDE1OjMwOjEyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoYmZkX2RlYnVnX3NlY3Rpb24pOiBEZWxldGVkLgotCShjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXgpOiBSZXR1cm4gYWJzb2x1dGUgc2VjdGlvbiBmb3IgZGVidWcKLQlzeW1ib2wuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogU2V0IEJTRl9ERUJVR0dJTkcgZm9yIENfRklMRSBzeW1ib2xzLiAgSWYKLQlCU0ZfREVCVUdHSU5HIGlzIHNldCwgc2V0IHNlY3Rpb24gdG8gTl9ERUJVRy4KLQkoY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBVc2UgYWJzb2x1dGUgc2VjdGlvbi4KLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEluIGFzc2VydGlvbiwKLQlmb3JjZSBhbGwgdmFsdWVzIHRvIHRoZSBzYW1lIHR5cGUuCi0KLVR1ZSBEZWMgMjAgMTE6MTE6NTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IEFsbCByZWxvY3MgZ2V0IGEgc3BlY2lhbCBmdW5jdGlvbi4KLQkoc3BlY2lhbCk6IE5ldmVyIGRvIGFueXRoaW5nIHdoZW4gbGlua2luZyAtci4KLQotVHVlIERlYyAyMCAxMzo1ODowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IERvbid0IGRvIGFueXRoaW5nIExpbnV4Ci0Jc3BlY2lmaWMgaWYgdGhpcyBpcyBub3QgYSBMaW51eCBoYXNoIHRhYmxlLiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljQGFpYi5jb20+LgotCi0JUGF0Y2hlcyBmcm9tIGtrb2ppbWFAbWl4Lm9yLmpwIChLYXp1bW90byBLb2ppbWEpOgotCSogbWlwc2JzZC5jIChtaXBzX2hvd3RvX3RhYmxlX2V4dCk6IENoYW5nZSBzaXplcyBvZiBtZW1vcnkgcmVsb2NzCi0JYXBwbHkgdG8gZnJvbSB0d28gYnl0ZXMgdG8gZm91ciBieXRlcy4KLQkqIE1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IGFuZCBleHBhbmQgdGhlCi0JbGlzdCBvZiBjYXNlcyBmb3Igd2hpY2ggcmVsb2NhdGlvbiBuZWVkIG5vdCBiZSBjb21wdXRlZC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotTW9uIERlYyAxOSAyMzowOToxNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBEZWxldGUgZG9fbG9jYWxzIGFuZAotCWRvX2dsb2JhbHMgYXJndW1lbnRzLCBhbHdheXMgcmVhZCBzeW1ib2wgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGZvcgotCWdsb2JhbHMgYW5kIGxvY2Fscy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IFJld29yayB0byBvbmx5IHJlYWQgc3ltYm9sIGV4dGVuc2lvbgotCWluZm9ybWF0aW9uIG9uY2UgZm9yIGVhY2ggaW5wdXQgYmZkLiAgMTAlIGltcHJvdmVtZW50IGluIGxpbmtlcgotCXBlcmZvcm1hbmNlLgotCi1GcmkgRGVjIDE2IDEyOjI4OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ2hlY2sKLQliZmRfaXNfYWJzX3NlY3Rpb24sIGV0Yy4sIG9ubHkgYWZ0ZXIgY2hlY2tpbmcgZm9yIHRoZSBzZWN0aW9uIGluCi0JdGhlIEJGRCBhbmQgYWZ0ZXIgY2FsbGluZyB0aGUgYmFja2VuZCByb3V0aW5lLgotCi1XZWQgRGVjIDE0IDIwOjIxOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBPbmx5IHVzZSBzZWN0aW9uIHN5bWJvbHMgd2hvc2UKLQl2YWx1ZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIGNoZWNraW5nIG91dHB1dF9vZmZzZXQgd2hlbgotCXVzaW5nIG91dHB1dF9zZWN0aW9uLiAgV2hlbiBjcmVhdGluZyBhIG5ldyBzeW1ib2wsIHNldCB0aGUgdmFsdWUKLQl0byAwLCBzaW5jZSBCRkQgc3ltYm9sIHZhbHVlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZS4KLQotVHVlIERlYyAxMyAxMzozMTowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNwdS16OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IE1ha2UgejgwMDIgdGhlIGRlZmF1bHQKLQlhcmNoaXRlY3R1cmUuCi0KLUZyaSBEZWMgIDkgMTI6NDM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IElmIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlCi0JYXJjaGl2ZSBpcyBub3QgYW4gRUxGIG9iamVjdCwgcGFzcyB0aGUgYXJjaGl2ZSB0byB0aGUgYWRkX3N5bWJvbHMKLQllbnRyeSBwb2ludCBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpcnN0IG9iamVjdC4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY0BhaWIuY29tPi4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSk6IFNpbWlsYXIgY2hhbmdlIGlmIHRoZQotCWZpcnN0IG9iamVjdCBpcyBub3QgYW4gYS5vdXQgb2JqZWN0LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjb21wdXRlCi0JcmVsb2NhdGlvbiBpbiBjYXNlcyB3aGVyZSB3ZSB3b24ndCB1c2UgaXQuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBEZWMgIDggMTQ6MTk6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcGM1MzItbWFjaC5jIChOQU1FKTogRGVmaW5lIHRvIHVzZSBuczMya2FvdXQgcHJlZml4LgotCSogbnMzMmtuZXRic2QuYyAoTkFNRSk6IERpdHRvLgotCShuczMya2FvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUgdG8gc3RhbmRhcmQgYW91dC0zMgotCXZlcnNpb24uCi0KLUZyaSBEZWMgIDIgMTM6NTY6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVhZF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2YgbWlwc19yZWxheF9zZWN0aW9uLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBDYWxsIG1pcHNfcmVhZF9yZWxvY3MuCi0JKGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX21uaXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1XZWQgTm92IDMwIDE0OjEyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zaC5jOiBVc2UgX2JmZF9kdW1teV90YXJnZXQgaW5zdGVhZCBvZiBub19hcmNoaXZlLgotCi1UdWUgTm92IDI5IDE0OjAwOjE5IDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0AucnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBVc2UgaTM4Ni1ic2QgYXMgYmZkX25hbWUuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1mcmVlYnNkKik6IFVzZSBpMzg2YnNkIGFzIG15X2hvc3QuCi0KLU1vbiBOb3YgMjggMTU6MzY6MDQgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTY4ay1uYnNkLm10IChERUZBVUxUX1ZFQ1RPUik6IHNldCB0byBtNjhrbmV0YnNkX3ZlYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGFuY2llcy4KLQkgIChDRklMRVMpOiBBZGRlZCBtNjhrbmV0YnNkLmMuCi0JICAoSEZJTEVTKTogQWRkZWQgbmV0YnNkLmguCi0KLVdlZCBOb3YgMjMgMTk6MjE6NDEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zaC5jIChzaGxjb2ZmX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShub19hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssIGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlCi0JbGl0dGxlIGVuZGlhbiBTSC4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHNobC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc2hsY29mZl92ZWMuCi0JKiBjb25maWcvc2gtY29mZi5tdCAoU0VMRUNUX1ZFQ1MpOiBIYW5kbGUgc2hsX2NvZmZfdmVjLgotCi1XZWQgTm92IDIzIDEwOjUwOjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IERvIG5vdCBzdWJ0cmFjdCB0aGUgc2VjdGlvbidzIHZtYSBmcm9tCi0JdGhlIHJlbG9jJ3Mgb2Zmc2V0IHdoZW4gd3JpdGluZyAubydzLiAgSW5zdGVhZCBhZGQgdGhlIHNlY3Rpb24ncwotCXZtYSB0byB0aGUgcmVsb2MncyBvZmZzZXQgd2hlbiB3cml0aW5nIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkCi0JbGlicmFyeS4KLQotVHVlIE5vdiAyMiAyMzozNDozNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRG8gbm90IGFkZAotCWlucHV0X3NlY3Rpb24tPnZtYSB0byB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4KLQotTW9uIE5vdiAyMSAxMjozNzoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKHNyZWNfY2Fub25pY2FsaXplX3JlbG9jKTogRGVmaW5lLgotCShzcmVjX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkoc3JlY192ZWMsIHN5bWJvbHNyZWNfdmVjKTogVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYykuCi0KLVNhdCBOb3YgMTkgMDM6MTA6NTEgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1zb2xhcmlzKik6ICBVc2Ugc29sYXJpczIgdG8KLQllbmFibGUgZXh0cmFjdGlvbiBvZiBwcm9jZnMgaW5mbyBmcm9tIGNvcmUgZmlsZSBmb3IgR0RCLgotCi1UaHUgTm92IDE3IDE3OjM3OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBBZGQgbmV3IHZhbHVlIEJGRF9SRUxPQ18xMl9QQ1JFTC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLVRodSBOb3YgMTcgMTM6MTI6MDggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC9lbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGVkKTogVXNlIHRoZQotCXZtYSBmcm9tIHRoZSBvdXRwdXRfc2VjdGlvbiBjb250YWluaW5nICRnbG9iYWwkIHdoZW4gY29tcHV0aW5nCi0JZ2xvYmFsX3ZsYXVlLgotCi1UaHUgTm92IDE3IDE0OjI5OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBSb3VuZCB1cCB0aGUgYXJjaGl2ZQotCWhlYWRlciBzaXplIG9mIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIHRvIGFuIGV2ZW4gbnVtYmVyLgotCi1XZWQgTm92IDE2IDE2OjA4OjA2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYzogRGVsZXRlZCBzb21lIGNvZGUgdGhhdCB3YXMgY29tbWVudGVkIG91dCBvciBpbnNpZGUKLQkiI2lmIDAiLgotCShDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENvbnZlcnQgbmFtZSB0byBsb3dlcmNhc2UsIGZvcgotCWNvbnNpc3RlbmN5IHdpdGggb3RoZXIgYXJjaGl0ZWN0dXJlcy4KLQotU2F0IE5vdiAxMiAyMzo1MDoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2V4cG9ydF9zeW1ib2wpOiBBbHNvIGV4cG9ydCBzeW1ib2xzIHdoaWNoIGFyZQotCXJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIGZpbGUuCi0KLUZyaSBOb3YgMTEgMTQ6Mjk6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkCi0JZXhwb3J0X2R5bmFtaWMgYXJndW1lbnQsIGFuZCBoYW5kbGUgaXQuCi0JKGVsZl9leHBvcnRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBOb3YgMTEgMTA6MzU6MzMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfc3RydWN0KTogRGVsZXRlIGhhbmRsZXMgZm9yIHRoZQotCWRhdGEsIHJlZyBhbmQgc3RhY2sgc2VjdGlvbnMuICBUaGV5J3JlIG5ldmVyIHVzZWQuICBEZWxldGUKLQlhY2Nlc3NvciBtYWNyb3MuCi0JKG1ha2VfYmZkX2FzZWN0aW9uKTogVXNlIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IHNpbmNlIGRlYnVnZ2luZwotCWNvcmVzIGZyb20gZHluYW1pYyBleGVjdXRhYmxlcyBtYXkgaGF2ZSBzZXZlcmFsIHNlY3Rpb25zIHdpdGggdGhlCi0Jc2FtZSBsb2dpY2FsIG5hbWUuCi0JKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IERvbid0IHNhdmUgaGFuZGxlcyB0byBkYXRhLCByZWcgYW5kCi0Jc3RhY2sgc2VjdGlvbnMuICBIYW5kbGUgQ09SRV9URVhULCBDT1JFX01NRiBhbmQgQ09SRV9TSE0uCi0KLVR1ZSBOb3YgIDggMTM6MDM6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKTogQWRkIG5ldyBhcmd1bWVudCBzaHJpbmtpbmcuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIEhhbmRsZSByZWxvY3MgYWdhaW5zdCBzZWN0aW9uIHN5bWJvbHMgY29ycmVjdGx5LiAgSWYgbm90Ci0Jc2hyaW5raW5nLCBkb24ndCBzdWJ0cmFjdCBvdXQgZHN0aWR4OyB0aGUgc3VidHJhY3Rpb24gaXMgYWxyZWFkeQotCWluIHRoZSBvYmplY3QgZmlsZS4KLQotU3VuIE5vdiAgNiAxMjo1MjowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmg6IENvbmRpdGlvbmFsbHkgaW5jbHVkZSA8c2hsLmg+IGFuZCA8ZGwuaD4uCi0KLVRodSBOb3YgIDMgMTg6MTk6MTMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEluY2x1ZGUgbTY4a25ldGJzZC5vLgotCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oIChFWFRSQUxJQlMpOiBJbmNsdWRlIC1sbS4KLQotCVBhdGNoZXMgZnJvbSBESiBEZWxvcmllOgotCSogY29mZi1nbzMyLmM6IFJlcGxhY2VtZW50IGZpbGUsIHVzZXMgY29mZi1pMzg2LmMgd2l0aCBtaW5vcgotCWNoYW5nZXMuCi0JKiBjb2ZmLWkzODYuYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBhbGxvdyBvdGhlciBmaWxlcyB0byBvdmVycmlkZQotCXVuZGVyc2NvcmUgYWxzbwotCSogbWFrZWZpbGUuZG9zOiBkZWwgY3Rvci5vLCBhZGQgY29mZmxpbmsubyBhbmQgZWxmMzIubwotCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IElmIHVzZXIgc2V0IGRhdGEgc2VjdGlvbiB2bWEsIHVzZSBpdAotCXRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBic3Mgdm1hLiAgUGF0Y2ggZnJvbSBUYWthZGEgSGlyb2FraSwKLQloaXJvQGlzLnMudS10b2t5by5hYy5qcC4KLQkobWFjaGluZV90eXBlLCBjYXNlIGJmZF9hcmNoX3ZheCk6IFNldCAqdW5rbm93biB0byBmYWxzZS4gIFBhdGNoCi0JZnJvbSBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+LgotCi0JKiBjb25maWd1cmUuaW4gKHRiKTogUmVuYW1lIG5zMzJrbmV0YnNkX3ZlYyB0byBwYzUzMm5ldGJzZF92ZWMsCi0Jc2luY2UgdGhhdCdzIHdoYXQgaXQncyBjYWxsZWQuCi0KLVdlZCBOb3YgIDIgMTU6MjQ6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKG5vcm1hbGl6ZSk6IENoYW5nZSB0byB0YWtlIGEgQkZEIGFzIGFuIGFyZ3VtZW50LgotCUNoYW5nZSBWTVMgdmVyc2lvbiB0byB1c2UgYmZkX2FsbG9jIHJhdGhlciB0aGFuIG1hbGxvYywgc28gdGhhdCB3ZQotCWRvbid0IGxvc2UgdGhlIG1lbW9yeSBmb3JldmVyLgotCShfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogQ2hlY2sgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZQotCWVudHJ5IHdoaWNoIGlzIG5vdCBiZWluZyBleHRlbmRlZCwgYW5kIGNvcnJlY3QgaXQgaWYgaXQgaXMgd3JvbmcuCi0JVGhpcyBpcyBuZWNlc3NhcnkgaW4gY2FzZSB0aGUgYXJjaGl2ZSB3YXMgY29uc3RydWN0ZWQgYnkgYW5vdGhlcgotCXByb2dyYW0gd2hpY2ggcHV0IGFuIGVudHJ5IGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIHdoaWNoIHdlCi0JZG9uJ3QgcGxhbiB0byBwdXQgaW4gb3Vyc2VsdmVzLiAgRnJvbSBqamNAamNsYXJrLmNvbSAoSmFtZXMKLQlDbGFyaykuCi0JKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBub3JtYWxpemUuCi0KLU1vbiBPY3QgMzEgMTQ6MTk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1ocHBhLmMgKEVMRjMyX1BBUklTQ19TWF9TSVpFKTogRGVmaW5lLgotCShFTEYzMl9QQVJJU0NfU1hfR0VULCBFTEYzMl9QQVJJU0NfU1hfUFVUKTogRGVmaW5lLgotCShzeW1leHRuX2VudHJ5KTogRG9uJ3QgZGVmaW5lLgotCShzeW1leHRfY2hhaW5fc2l6ZSk6IENoYW5nZSB0eXBlIHRvIGJmZF9zaXplX3R5cGUuCi0JKHN5bWV4dG5fY29udGVudHMpOiBDaGFuZ2UgdHlwZSB0byBiZmRfYnl0ZSAqLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IFVzZQotCUVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQgb2Ygc2l6ZW9mIChzeW1leHRfZW50cnlTKS4KLQkoZWxmMzJfaHBwYV9zaXplX3N5bWV4dCk6IExpa2V3aXNlLiAgQWxzbywgY2hhbmdlIHR5cGUgb2Ygc2l6ZXAgdG8KLQliZmRfc2l6ZV90eXBlICouCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBDYXN0IHN5bWV4dG5fY29udGVudHMgYXNzaWdubWVudCB0bwotCWJmZF9ieXRlICouICBVc2UgRUxGMzJfUEFSSVNDX1NYX1BVVCBpbnN0ZWFkIG9mIGRpcmVjdCBhc3NpZ25tZW50LgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBVc2UKLQlFTEYzMl9QQVJJU0NfU1hfU0laRSBpbnN0ZWFkIG9mIHNpemVvZiAoc3ltZXh0X2VudHJ5UykuICBVc2UKLQlFTEYzMl9QQVJJU0NfU1hfR0VUIGluc2V0YWQgb2YgZGlyZWN0IGFzc2lnbm1lbnQuCi0JKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGNvbnRlbnRzLCBhbmQgaXRzCi0JYXNzaWdubWVudCBjYXN0LCB0byBiZmRfYnl0ZSAqLiAgVXNlIEVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQKLQlvZiBzaXplb2YgKHN5bWV4dG5fZW50cnkpLiAgVXNlIHN5bWV4dF9lbnRyeVMgaW5zdGVhZCBvZgotCXN5bWV4dG5fZW50cnkuICBVc2UgRUxGMzJfUEFSSVNDX1NYX0dFVCBpbnN0ZWFkIG9mIGRpcmVjdAotCWFzc2lnbm1lbnQuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lKTogQWRkIHRoZSBhciBwYWRkaW5nCi0JY2hhcmFjdGVyLCBpZiB0aGVyZSBpcyByb29tIGZvciBpdCwgZXZlbiBpZiB0aGUgbmFtZSBpcyB0aGUKLQltYXhpbXVtIGxlbmd0aC4KLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFNvcnQgdGhlIEVMRgotCWhlYWRlcnMgYnkgc2VjdGlvbiBhZGRyZXNzIHdoZW4gYXNzaWduaW5nIGZpbGUgcG9zaXRpb25zLgotCShlbGZfc29ydF9oZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotU3VuIE9jdCAzMCAxODo1Njo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDcmVhdGUgRFRfSU5JVAotCWFuZCBEVF9GSU5JIGR5bmFtaWMgZW50cmllcyBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mIF9pbml0IGFuZAotCV9maW5pIHN5bWJvbHMsIG5vdCBvbiB0aGUgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zLiAgVGhpcyBpcwotCWNvbXBhdGlibGUgd2l0aCBzb21lIFNWUjQgbGlua2Vycy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVNhdCBPY3QgMjkgMTI6MTg6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IG1vdmUgYQotCXN5bWJvbCB3aXRoIGEgUExUIGVudHJ5IGludG8gdGhlIC5wbHQgc2VjdGlvbiBpZiBpdCBpcyBkZWZpbmVkIGluCi0JYSByZWd1bGFyIGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJdCdzIG5vdCBhbgotCWVycm9yIGlmIGFuIGVtcHR5IGFyY2hpdmUgaGFzIG5vIHN5bWJvbCB0YWJsZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLUZyaSBPY3QgMjggMTA6MDg6NDEgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0gICAgICAgIE5ldEJTRC9tNjhrIHN1cHBvcnQsIGJhc2VkIG9uIHdvcmsgYnkgbWlrZWJAc25vdy5kYXRhbWV0cmljcy5jb206IAotCSogY29uZmlnLmJmZCAobTY4Ki0qLW5ldGJzZCopOiBVc2UgbTY4ay1uYnNkIGFzIGJmZF9uYW1lLgotCSogY29uZmlndXJlLmluIChtNjhrbmV0YnNkX3ZlYyk6IEFkZGVkLgotCSogdGFyZ2V0cy5jIChiZmRfbTY4a25ldGJzZF92ZWMpOiBBZGRlZC4KLQkqIGhvc3RzL202OGtuYnNkLmgsIGNvbmZpZy9tNjhrLW5ic2QubXQsIG02OGtuZXRic2QuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTLCBDRklMRVMpOiBBZGQgbTY4a25ldGJzZC5jLgotCi0JbWlzY2VsbGFuZW91cyBjbGVhbnVwIHJlcXVpcmVkIGJ5IGFsbCBuZXRic2QgdGFyZ2V0cywgYmFzZWQgb24gd29yayAKLQlieSBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PjoKLQkqIG5ldGJzZC5oIChOX01BR0lDLCBOX1NFVF9NQUdJQywgTl9HRVRNQUdJQywgTl9HRVRNQUdJQzIsIE5fVFhUQUREUiwKLQkgIE5fVFhUT0ZGLCBOX0FMSUdOLCBOX0RBVEFERFIsIE5fREFUT0ZGKTogUmVtb3ZlZC4gIEdlbmVyaWMgYS5vdXQKLQkgIGRlZmluaXRpb25zIHdvcmsuCi0JKiBpMzg2bmJzZC5jLCBuczMya25ic2QuYywgc3BhcmNuYnNkLmMgKF9fTERQR1NaKTogUmVtb3ZlZC4KLQkgIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIE5ldEJTRCdzIG1hZ2ljIG51bWJlcnMKLQotVGh1IE9jdCAyNyAxNjo1OTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgZmllbGQgZHluaW5keC4KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEb24ndCBmaW5hbGl6ZQotCXRoZSAuZHluc3ltLCAuZHluc3RyIG9yIC5oYXNoIHNlY3Rpb25zIHVudGlsIGFmdGVyIHRoZSBiYWNrZW5kCi0Jc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJvdXRpbmUsIHNvIHRoYXQgaXQgY2FuIGFkZCBkeW5hbWljIHN5bWJvbHMKLQlpZiBpdCB3YW50cyB0by4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgZGVmaW5lIHRoZQotCXN5bWJvbCB0byBiZSBpbiB0aGUgLnBsdCBzZWN0aW9uIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5Ci0JaWYgaXQgaXMgYSBkZWZpbmVkIHN5bWJvbC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBkeW5hbWljIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQKLQlzZWN0aW9uLCBzdG9yaW5nIHRoZSBpbmRleCBpbiB0aGUgZHluaW5keCBmaWVsZCBvZiB0aGUgRUxGIHNlY3Rpb24KLQlkYXRhLiAgQWRqdXN0IHRoZSBvdGhlciBkeW5pbmR4IGZpZWxkcyB0byBhY2NvdW50IGZvciB0aGlzLgotCShlbGYzMl9zcGFyY19hZGp1c3RfZHluaW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGNvcHlpbmcgYSByZWxvYyBpbnRvIGEgc2hhcmVkCi0JbGlicmFyeSwgdXNlIHRoZSBvcmlnaW5hbCBhZGRlbmQgYXMgYXBwcm9wcmlhdGUuICBDb252ZXJ0IGFuCi0JUl9TUEFSQ18zMiByZWxvYyBpbnRvIGFuIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2MuICBVc2UgdGhlIGR5bmFtaWMKLQlzeW1ib2wgaW5kZXggb2YgdGhlIG91dHB1dCBzZWN0aW9uLCBub3QgdGhlIG5vcm1hbCBzeW1ib2wgaW5kZXguCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgZGllIGlmIGEgc2VjdGlvbiBkb2VzCi0Jbm90IGV4aXN0IHdoZW4gc2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIGR5bmFtaWMgdGFncy4gIFdyaXRlIG91dAotCWEgZHluYW1pYyBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uCi0KLVdlZCBPY3QgMjYgMDE6MTU6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IERvbid0IGJvdGhlciB0byByZWFkIG9yIHdyaXRlCi0JdGhlIHJlbG9jcyBpZiB0aGVyZSBhcmVuJ3QgYW55LgotCi1UdWUgT2N0IDI1IDExOjQ0OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB0ZWtoZXguby4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBJZiBTRUxFQ1RfVkVDUyBpcyBub3QgZGVmaW5lZCwKLQlpbmNsdWRlIHRla2hleF92ZWMuCi0JKiB0ZWtoZXguYyAoTklCQkxFLCBJU0hFWCk6IENhc3QgYXJyYXkgYXJndW1lbnRzIHRvIHVuc2lnbmVkIGNoYXIuCi0JKGdldHZhbHVlLCBnZXRzeW0sIG91dCk6IExpa2V3aXNlLgotCShmaW5kX2NodW5rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzLgotCShmaXJzdF9waGFzZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcy4KLQkocGFzc19vdmVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhZGRyZXNzLgotCSh0ZWtoZXhfb2JqZWN0X3ApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHNlY3Rpb24uCi0JKG1vdmVfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSByZXR1cm4gdHlwZSBmcm9tIGJvb2xlYW4gdG8gdm9pZC4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHRkYXRhIGFuZAotCWxpc3QuCi0KLQkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIENJTkQuCi0JKGxpbmtfYWN0aW9uKTogQ2hhbmdlIENPTU1PTl9ST1dcaW5kciBmcm9tIE1ERUYgdG8gQ1JFRi4gIENoYW5nZQotCUlORFJfUk9XXGNvbW1vbiBmcm9tIE1ERUYgdG8gQ0lORC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJbiBDUkVGIGNhc2UsIGhhbmRsZSBhbgotCWV4aXN0aW5nIHN5bWJvbCB3aGljaCBpcyBpbmRpcmVjdCByYXRoZXIgdGhhbiBkZWZpbmVkLiAgQWRkIG5ldwotCUNJTkQgY2FzZS4KLQotTW9uIE9jdCAyNCAxNTozMzoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2UgUy1yZWNvcmQgYmFja2VuZCB0byB1c2UgbXVsdGlwbGUgc2VjdGlvbnMgdG8gaGFuZGxlIGdhcHMgaW4KLQlmaWxlLgotCSogc3JlYy5jIChzcmVjX2RhdGFfbGlzdF9zdHJ1Y3QpOiBNb3ZlIGZpZWxkIG5leHQgZnJvbSBsYXN0IHBsYWNlCi0JdG8gZmlyc3QuICBDaGFuZ2UgdHlwZSBvZiBkYXRhIHRvIGJmZF9ieXRlICouCi0JKHN0cnVjdCBzcmVjX3N5bWJvbCk6IERlZmluZS4KLQkodGRhdGFfdHlwZSk6IFJlbW92ZSBkb25lX3N5bWJvbF9yZWFkLCBjb3VudCwgc3RyaW5ncywgc3ltYm9sX2lkeCwKLQlzdHJpbmdfc2l6ZSwgc3RyaW5nX2lkeC4gIENoYW5nZSB0eXBlIG9mIHN5bWJvbHMgdG8gc3RydWN0Ci0Jc3JlY19zeW1ib2wgKi4gIEFkZCBzeW10YWlsIGFuZCBjc3ltYm9scy4KLQkobG93LCBoaWdoKTogUmVtb3ZlLgotCShzaXplX3N5bWJvbHMsIGZpbGx1cF9zeW1ib2xzLCBzaXplX3NyZWMsIGZpbGx1cCk6IFJlbW92ZS4KLQkod2hpdGUsIHNraXB3aGl0ZSwgcGFzc19vdmVyLCBvYmplY3RfcCk6IFJlbW92ZS4KLQkoc3JlY19ta29iamVjdCk6IENhbGwgc3JlY19pbml0LiAgQWRqdXN0IHRkYXRhIGluaXRpYWxpemF0aW9uIGZvcgotCWZpZWxkIGNoYW5nZXMuCi0JKHNyZWNfZ2V0X2J5dGUsIHNyZWNfYmFkX2J5dGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc3JlY19uZXdfc3ltYm9sLCBzcmVjX3NjYW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc3JlY19vYmplY3RfcCk6IENoYW5nZSB0eXBlIG9mIGIgdG8gYmZkX2J5dGUuICBFeHBsaWNpdGx5IHNldAotCXdyb25nX2Zvcm1hdCBlcnJvci4gIENhbGwgc3JlY19ta29iamVjdCBhbmQgc3JlY19zY2FuIGluc3RlYWQgb2YKLQlvYmplY3RfcC4KLQkoc3ltYm9sc3JlY19vYmplY3RfcCk6IExpa2V3aXNlLiAgQWxzbywgY2hhbmdlIGIgdG8gYmUgb25seSB0d28KLQlieXRlcy4KLQkoc3JlY19yZWFkX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCBzcmVjX3JlYWRfc2VjdGlvbiByYXRoZXIgdGhhbgotCXBhc3Nfb3Zlci4gIEhhbmRsZSB6ZXJvIGxlbmd0aCBzZWN0aW9uIGNvcnJlY3RseS4KLQkoc2V0X3NldF9hcmNoX21hY2gpOiBDaGFuZ2UgZnJvbSBmdW5jdGlvbiB0byBtYWNyby4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSBkYXRhIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIGRhdGEsIGVuZCBhbmQgc3JjIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfaGVhZGVyKTogQ2hhbmdlIGJ1ZmZlciBhbmQgZHN0IHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfc2VjdGlvbik6IENoYW5nZSBsb2NhdGlvbiB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX3Rlcm1pbmF0b3IpOiBDaGFuZ2UgYnVmZmVyIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERvbid0IGNhbGwKLQlzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzLgotCShzcmVjX2dldF9zeW10YWIpOiBSZXdyaXRlLgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBTZXQgdWRhdGEuaSB0byAwLCBub3QgTlVMTC4KLQotRnJpIE9jdCAyMSAxNjo0MzoxMyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAobWFjaGluZV90eXBlKTogYWRkZWQgTV82OEtfTkVUQlNEIGFuZCBNX1NQQVJDX05FVEJTRC4KLQkqIGkzODZuZXRic2QuYywgbnMzMmtuZXRic2QuYywgc3BhcmNuZXRic2QuYzogcmVtb3ZlZCBSQ1MgSWQncy4KLQkgIGNoYW5nZWQgaG93IFBBR0VfU0laRSBhbmQgU0VHTUVOVF9TSVpFIGFyZSBkZWZpbmVkIHNvIHRoZXkgYXJlCi0JICBjb25zaXN0YW50IHdpdGggZWFjaCBvdGhlci4KLQkqIG5ldGJzZC5oIChOX0hFQURFUl9JTl9URVhULCBURVhUX1NUQVJUX0FERFIpOiBOZXRCU0QgZml0cyBpdHMKLQkgIGhlYWRlciBpbnRvIHRoZSBzdGFydCBvZiBpdHMgdGV4dCBzZWdtZW50LgotCi1GcmkgT2N0IDIxIDE3OjEzOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogQWRkIGNhc2UgZm9yCi0JX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLgotCShiZmRfdGFyZ2V0KTogQWRkIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuCi0JKiBhcmNoaXZlLmMgKF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcKLQlmdW5jdGlvbi4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBSZW5hbWVkIGJ5IGFkZGluZyBhIGxlYWRpbmcKLQl1bmRlcnNjb3JlLCBhbmQgbWFkZSBleHRlcm5hbGx5IHZpc2libGUuICBBZGRlZCB0cmFpbGluZ19zbGFzaAotCWFyZ3VtZW50LCBhbmQgdXNlZCBpdCBpbnN0ZWFkIG9mIGVsZl9zdHlsZS4gIENoYW5nZWQgdHlwZSBvZgotCXRhYmxlbiB0byBiZmRfc2l6ZV90eXBlICouCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFVzZSBCRkRfU0VORCB0byBjYWxsCi0JY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuICBVc2UgdGhlIHJldHVybmVkIG5hbWUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlY2xhcmUuCi0JKF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVjbGFyZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBzb20uYyAoc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6Ci0JRGVmaW5lLgotCSogaWVlZS5jIChpZWVlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCi0JRml4IHRoZSBFTEYgbGlua2VyIHRvIG5vdCByZXF1aXJlIGFuIGludGVycHJldGVyIGlmIG5vIGR5bmFtaWMKLQlvYmplY3RzIHdlcmUgc2VlbiwgZXZlbiB3aGVuIGxpbmtpbmcgUElDIGNvZGUuCi0JKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGR5bnN0ciBpZiBpdAotCWRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgYmFzZWQgb24KLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgZmllbGQsIG5vdCBkeW5vYmogZmllbGQuICBEb24ndCBib3RoZXIgdG8KLQlzZXQgZHlub2JqLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIGR5bmFtaWMgc2VjdGlvbnMgd2VyZQotCWFscmVhZHkgY3JlYXRlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICBJZiBkeW5vYmogaXMgYWxyZWFkeSBzZXQsIHVzZQotCWl0OyBvdGhlcndpc2UsIHNldCBpdCB0byB0aGUgYmZkIGFyZ3VtZW50LiAgRG9uJ3QgaW5pdGlhbGl6ZQotCWR5bnN5bWNvdW50LiAgT25seSBjcmVhdGUgZHluc3RyIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgU2V0Ci0JZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHRvIHRydWUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogU2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24KLQlpZiBubyBkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzIHRoZQotCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGZsYWcgc2V0LCBsZXQgdGhlIGJhY2tlbmQgYWRqdXN0IGl0LgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDaGFuZ2UgbW9zdCBkZWNpc2lvbnMgYmFzZWQgb24gZHlub2JqIHRvCi0JY2hlY2sgZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIGluc3RlYWQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBPbmx5IGhhbmRsZSBkeW5hbWljIHN5bWJvbHMgaWYgYSBkeW5hbWljCi0Jb2JqZWN0IHdhcyBzZWVuLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBuZXcgZmllbGQKLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQuICBTZXQgZHluc3ltY291bnQgdG8gMSwgbm90IDAuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbAotCWVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbiByYXRoZXIgdGhhbiBjcmVhdGluZyB0aGUgLmdvdCBhbmQKLQkuZ290LnBsdCBzZWN0aW9ucy4KLQkoZWxmX2kzODZfY3JlYXRlX2dvdF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSnVzdCBjYWxsIGVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbiBpZgotCWEgR09UIHRhYmxlIGlzIG5lZWRlZCwgbm90IGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCU9ubHkgY3JlYXRlIHRoZSAucmVsLmdvdCBzZWN0aW9uLCBhbmQgb25seSBtYWtlIHNwYWNlIGZvciBhIHJlbG9jLAotCWZvciBhIGdsb2JhbCBzeW1ib2wgb3Igd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gIEZvciBhCi0JUl8zODZfUExUMzIgcmVsb2MsIGp1c3Qgc2V0IHRoZQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBmbGFnLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXdvcmsgaW5pdGlhbCBhc3NlcnRpb24gdG8KLQlwZXJtaXQgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgbm9uIGR5bmFtaWMgc3ltYm9scy4gIENyZWF0ZSBhCi0JcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgZm9yIHN1Y2ggc3ltYm9scy4gIEJ1dCwgaWYgbm8KLQlkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLCBuZXZlciBjcmVhdGUgYSBQTFQgZW50cnkuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIG5vIGR5bmFtaWMgb2JqZWN0cyB3ZXJlIHNlZW4sCi0Jc2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24sIGFuZCBmb3JjZSB0aGUgc2l6ZSBvZiB0aGUgLnJlbC5nb3QKLQlzZWN0aW9uIHRvIHplcm8uCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBSXzM4Nl9HT1QzMiByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsCi0Jc3ltYm9sIHdoZW4gbm8gZHluYW1pYyBvYmplY3Qgd2FzIHNlZW4sIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIC5nb3Qgc2VjdGlvbi4gIEZvciBhIFJfMzg2X0dPVDMyIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIG9ubHkKLQljcmVhdGUgYSBSXzM4Nl9SRUxBVElWRSByZWxvYyB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LgotCVRyZWF0IGEgUl8zODZfUExUMzIgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBmb3Igd2hpY2ggd2UgZGlkIG5vdAotCWNyZWF0ZSBhIFBMVCBlbnRyeSBhcyBhIFJfMzg2X1BDMzIgcmVsb2MuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBmaWRkbGUgd2l0aCB0aGUgZHluYW1pYwotCWVudHJpZXMgYW5kIHRoZSBQTFQgaWYgd2Ugc2F3IGEgZHluYW1pYyBvYmplY3QuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBGaXggUl9TUEFSQ19QQzIyIGJ5Ci0Jc2V0dGluZyByaWdodHNoaWZ0IHRvIDEwLiAgRml4IFJfU1BBUkNfV1BMVDIwIGJ5IHNldHRpbmcKLQlyaWdodHNoaWZ0IHRvIDIsIHNpemUgdG8gMiwgYml0c2l6ZSB0byAzMCwgYW5kIGRzdF9tYXNrIHRvCi0JMHgzZmZmZmZmZi4KLQkoZWxmMzJfc3BhcmNfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgdGhlIHNpemUgb2YgdGhlCi0JLnBsdCBzZWN0aW9uLiAgQ2FsbCBlbGYzMl9zcGFyY19jcmVhdGVfZ290X3NlY3Rpb24gcmF0aGVyIHRoYW4KLQljcmVhdGluZyB0aGUgLmdvdCBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBDYWxsIGVsZjMyX3NwYXJjX2NyZWF0ZV9nb3Rfc2VjdGlvbiBpZgotCWEgR09UIHRhYmxlIGlzIG5lZWRlZCwgbm90IGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCU9ubHkgY3JlYXRlIHRoZSAucmVsYS5nb3Qgc2VjdGlvbiwgYW5kIG9ubHkgbWFrZSBzcGFjZSBmb3IgYQotCXJlbG9jLCBmb3IgYSBnbG9iYWwgc3ltYm9sIG9yIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCi0JU2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIC5yZWxhLmdvdCBzZWN0aW9uIHRvIDIuICBGb3IgYQotCVJfU1BBUkNfV1BMVDMwIHJlbG9jLCBqdXN0IHNldCB0aGUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgZmxhZy4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV3b3JrIGluaXRpYWwgYXNzZXJ0aW9uIHRvCi0JcGVybWl0IEVMRl9MSU5LX0hBU0hfTkVEU19QTFQgbm9uIGR5bmFtaWMgc3ltYm9scy4gIENyZWF0ZSBhCi0JcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZm9yIHN1Y2ggc3ltYm9scy4gIEJ1dCwgaWYgbm8gZHluYW1pYwotCW9iamVjdHMgd2VyZSBzZWVuLCBuZXZlciBjcmVhdGUgYSBQTFQgZW50cnkuICBJbml0aWFsaXplIHRoZSBzaXplCi0Jb2YgdGhlIC5wbHQgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbm8gZHluYW1pYyBvYmplY3RzIHdlcmUKLQlzZWVuLCBza2lwIG1vc3Qgb2YgdGhpcyBmdW5jdGlvbiwgYW5kIGZvcmNlIHRoZSBzaXplIG9mIHRoZQotCS5yZWxhLmdvdCBzZWN0aW9uIHRvIHplcm8uICBTdHJpcCBlbXB0eSByZWxvYyBzZWN0aW9ucywgYW5kIHN0cmlwCi0JYW4gZW1wdHkgLnBsdCBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIGEgR09UIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwKLQlzeW1ib2wgd2hlbiBubyBkeW5hbWljIG9iamVjdCB3YXMgc2VlbiwgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLQl0aGUgLmdvdCBzZWN0aW9uLiAgRm9yIGEgR09UIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIG9ubHkKLQljcmVhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCi0JVHJlYXQgYSBSX1NQQVJDX1dQTFQzMCByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGZvciB3aGljaCB3ZSBkaWQgbm90Ci0JY3JlYXRlIGEgUExUIGVudHJ5IGFzIGEgUl9TUEFSQ19XRElTUDMwIHJlbG9jLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgZmlkZGxlIHdpdGggdGhlCi0JZHluYW1pYyBlbnRyaWVzIGFuZCB0aGUgUExUIGlmIHdlIHNhdyBhIGR5bmFtaWMgb2JqZWN0LgotCi1UaHUgT2N0IDIwIDEzOjI4OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCB3b3JyeSBhYm91dCBzZWN0aW9uIHN5bWJvbHMKLQlpbiBhIHNlY3Rpb24gbm90IG93bmVkIGJ5IGFueSBCRkQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBTZXBhcmF0ZSBvdXQgbG9vcCB3aGljaCBjYWxscwotCWJhY2tlbmQgcm91dGluZS4gIENoZWNrIGJmZF9zZWN0aW9uIGFuZCBjYWxsIHRoZSBiYWNrZW5kIHJvdXRpbmUKLQlldmVuIGZvciBhIHNlY3Rpb24gbm90IG93bmVkIGJ5IGFueSBCRkQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEhhbmRsZQotCS5hY29tbW9uIHNlY3Rpb24uCi0KLVdlZCBPY3QgMTkgMTM6Mjg6MjkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBNYWtlIG5hbWVzIGZvciBzZWN0aW9uIG51bWJlciBhbmQKLQlzdG9yYWdlIGNsYXNzIHNsaWdodGx5IG1vcmUgdmVyYm9zZS4gIEl0J3Mgbm90IGNsZWFyIGhvdyBtYW55Ci0JY2hhcmFjdGVycyBJIGNhbiBqdXN0aWZ5IHVzaW5nIHVwLCBidXQgYmVmb3JlIHRoaXMgY2hhbmdlIHRoZXkKLQlib3RoIHdlcmUgYWJicmV2aWF0ZWQgInNjIiB3aGljaCBpcyAoSU1ITykgY2xlYXJseSB1bmFjY2VwdGFibGUuCi0KLVdlZCBPY3QgMTkgMDE6MjY6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHRoZSBiYXNlIGZpbGUKLQlwb3NpdGlvbiBmcm9tIHRoZSBsb3dlc3Qgc2VjdGlvbiBWTUEsIG5vdCB0aGUgc3RhcnQgYWRkcmVzcy4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCByZXR1cm4gYW4gZXJyb3IKLQlpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTggMTI6NTY6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE9ubHkgY29weQotCXN1YmZvcm1hdCB0byBhbm90aGVyIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyIGZpbGUuCi0KLQkqIGJpbmFyeS5jOiBOZXcgZmlsZSBmb3IgcmF3IGJpbmFyeSBvdXRwdXQgZm9ybWF0LgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWRkIGJpbmFyeS5vLgotCShDRklMRVMpOiBBZGQgYmluYXJ5LmMuCi0JKiB0YXJnZXRzLmMgKGJpbmFyeV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEluY2x1ZGUgYmluYXJ5X3ZlYy4KLQotCSogc3JlYy5jICh0ZGF0YV90eXBlKTogQWRkIGZpZWxkIHRhaWwuCi0JKHNyZWNfbWtvYmplY3QpOiBJbml0aWFsaXplIHRhaWwuCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTb3J0IFMgcmVjb3JkIGxpc3QgYnkgYWRkcmVzcy4KLQotTW9uIE9jdCAxNyAxMTozODoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogU29ydCB0aGUgc3ltYm9scyBpbnRvIGEgbmV3IGFycmF5LAotCXJhdGhlciB0aGFuIG1lc3Npbmcgd2l0aCBFbGZfU3ltX0V4dHJhLiAgU3RvcmUgdGhlIHN5bWJvbCBpbmRleCBpbgotCXRoZSB1ZGF0YS5pIGZpZWxkLgotCShzd2FwX291dF9zeW1zKTogVXNlIG91dGJvdW5kX3N5bXMgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGFzIGFuCi0JYXJyYXkuICBEb24ndCB3b3JyeSBhYm91dCBlbGZfc3ltX251bS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX3N5bV9leHRyYSk6IERvbid0IGRlZmluZS4KLQkoRWxmX1N5bV9FeHRyYSk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW1vdmUgc3ltX2V4dHJhIGZpZWxkLgotCShlbGZfc3ltX2V4dHJhKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZQotCXVkYXRhLmkgcmF0aGVyIHRoYW4gZWxmX3N5bV9leHRyYSBhcnJheS4KLQotCSogc3ltcy5jIChhc3ltYm9sKTogQ2hhbmdlIHVkYXRhIGZpZWxkIGludG8gYSB1bmlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IFVzZSB1ZGF0YS5wIHJhdGhlcgotCXRoYW4ganVzdCB1ZGF0YS4KLQkqIGJvdXQuYyAocGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IExpa2V3aXNlLgotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9wZXJmb3JtX3NsaXApOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoZmlsbHVwX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGdldF9pbmRleCk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuIGp1c3QgdWRhdGEuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKHNldF9pbmRleCk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc3ltX2luZGV4LCBlY29mZl9zZXRfc3ltX2luZGV4KTogTGlrZXdpc2UuCi0JKiBzb20uYyAoY29tcGFyZV9zeW1zKTogTGlrZXdpc2UuCi0JKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBMaWtld2lzZS4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IExpa2V3aXNlLgotCi0JVXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IEVMRiBzeW1ib2wgbmFtZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9zdHJpbmd0YWJfaW5pdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9uZXdfc3RydGFiLCBiZmRfYWRkX3RvX3N0cnRhYiwgYmZkX2FkZF8yX3RvX3N0cnRhYik6IFJlbW92ZS4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIGVsZl9zdHJpbmd0YWJfaW5pdCBvcgotCV9iZmRfc3RyaW5ndGFiX2FkZCwgYW5kIGdldCBzdHJpbmd0YWIgbGVuZ3RocyB1c2luZwotCV9iZmRfc3RyaW5ndGFiX3NpemUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hhbmdlIGlnbm9yZWQgYXJndW1lbnQgdG8gcG9pbnRlciB0bwotCWJvb2xlYW4sIGFuZCBzZXQgdGhlIGJvb2xlYW4gdG8gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnMuICBJZiBhbgotCWVycm9yIGhhcyBhbHJlYWR5IG9jY3VycmVkLCBkb24ndCBkbyBhbnl0aGluZy4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEp1c3Qgc2V0IHNoX3NpemUsIG5vdCBjb250ZW50cy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFBhc3MgdGhlIGFkZHJlc3Mgb2YgYQotCWJvb2xlYW4gdG8gZWxmX2Zha2Vfc2VjdGlvbnMuICBQYXNzIHRoZSBhZGRyZXNzIG9mIGEKLQliZmRfc3RydGFiX2hhc2ggdG8gc3dhcF9vdXRfc3ltcy4gIFdyaXRlIG91dCB0aGUgLnN0cnRhYiBzZWN0aW9uLgotCShwcmVwX2hlYWRlcnMpOiBDaGFuZ2Ugc2hzdHJ0YWIgdG8gYmZkX3N0cnRhYl9oYXNoLgotCShzd2FwX291dF9zeW1zKTogVGFrZSBhIHBvaW50ZXIgdG8gYSBiZmRfc3RydGFiX2hhc2ggYXMgYW4KLQlhcmd1bWVudC4gIFNldCBpdCB0byB0aGUgc3ltYm9sIG5hbWVzLgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFdyaXRlIG91dCB0aGUgc2VjdGlvbgotCWhlYWRlciBuYW1lcyB1c2luZyBfYmZkX3N0cmluZ3RhYl9lbWl0LgotCShlbGZfZGVidWdfc2VjdGlvbik6IFJlbW92ZSBmaXJzdCBhcmd1bWVudDsgZ2V0IHRoZSBzZWN0aW9uIG5hbWUKLQl2aWEgdGhlIGJmZF9zZWN0aW9uIHBvaW50ZXIuICBDaGFuZ2UgY2FsbGVyLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBuYW1lcyB1c2luZwotCV9iZmRfc3RyaW5ndGFiX2VtaXQuICBMaWtld2lzZSBmb3IgdGhlIC5keW5zdHIgc2VjdGlvbiBjb250ZW50cy4KLQlGcmVlIHRoZSBzeW1ib2wgbmFtZXMgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFJlbW92ZSB0aGUgbGFzdCBhcmd1bWVudCwgb3V0cHV0X25hbWVzLAotCWZyb20gcmVsb2NhdGVfc2VjdGlvbi4gIFNhdmUgdGhlIG9sZCBzeW1ib2wgY29udGVudHMgYmVmb3JlCi0JY2FsbGluZyBlbGZfbGlua19vdXRwdXRfc3ltLCBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyd2FyZC4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IENoYW5nZSBkeW5zdHIgZmllbGQgdG8KLQlzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBsYXN0IGFyZ3VtZW50LCBvdXRwdXRfbmFtZXMsCi0JZnJvbSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCShzdHJ1Y3Qgc3RydGFiKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IENoYW5nZSBzdHJ0YWJfcHRyIGZpZWxkIHRvIHN0cnVjdAotCWJmZF9zdHJ0YWJfaGFzaC4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIGxhc3QKLQlhcmd1bWVudCwgb3V0cHV0X25hbWVzLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogbGliYmZkLWluLmggKERFRkFVTFRfU1RSSU5HX1NQQUNFX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmMgKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogUmVtb3ZlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3NoZHJfaW4pOiBVc2UgYmZkX3NlY3Rpb24sIG5vdCByYXdkYXRhLgotCUNsZWFyIGNvbnRlbnRzIGZpZWxkLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJbiBTSFRfU1RSVEFCIGNhc2UsIGNoZWNrIGJmZF9zZWN0aW9uLAotCW5vdCByYXdkYXRhLiAgRG9uJ3Qgc2V0IHJhd2RhdGEgaWYgZV9zaHN0cm5keC4gIFVzZSBiZmRfc2VjdGlvbgotCXJhdGhlciB0aGFuIHJhd2RhdGEgaW4gY29tbWVudGVkIG91dCBjb2RlLiAgSW4gU0hUX1JFTFtBXSBjYXNlLAotCWRvbid0IGJvdGhlciB0byBjaGVjayBlbGZfc2VjdGlvbl9kYXRhIG9mIHNlY3Rpb24gcmV0dXJuZWQgYnkKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuICBEb24ndCBzZXQKLQlzaXplLgotCShlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCBzZXQgZWxmX251bV9zZWN0aW9uX3N5bXMuICBEb24ndCBjcmVhdGUKLQlzZWN0aW9uIHN5bWJvbHMgdGhhdCBhbHJlYWR5IGV4aXN0LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IFVzZSBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBKdXN0IGNoZWNrIGJmZF9zZWN0aW9uIGZpZWxkLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRG9uJ3QgcHJpbnQgcmF3ZGF0YSwgY29udGVudHMsIG9yIHNpemUuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGVycm9yIG91dCBpZgotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJucyBOVUxMLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDaGVjayByZXR1cm4gdmFsdWUgZnJvbQotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggYWdhaW5zdCBOVUxMLCBub3QgYmZkX2lzX2Fic19zZWN0aW9uLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjaGVjayBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybgotCXZhbHVlLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIG51bV9zZWN0aW9uX3N5bXMgZmllbGQuCi0JKGVsZl9udW1fc2VjdGlvbl9zeW1zKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmLmMgKGVsZl9nZXRfc3RyX3NlY3Rpb24pOiBTdG9yZSBzZWN0aW9uIGNvbnRlbnRzIGluIGNvbnRlbnRzCi0JZmllbGQgcmF0aGVyIHRoYW4gcmF3ZGF0YSBmaWVsZC4KLQkoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdG9yZSBCRkQgc2VjdGlvbiBwb2ludGVyIGluCi0JYmZkX3NlY3Rpb24gZmllbGQgcmF0aGVyIHRoYW4gcmF3ZGF0YSBmaWVsZC4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogVXNlIGJmZF9zZWN0aW9uCi0JcmF0aGVyIHRoYW4gcmF3ZGF0YS4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERvbid0IHNldAotCXN5bWV4dG5faGRyLT5zaXplOyBqdXN0IHVzZSBzaF9zaXplLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVXNlIGJmZF9zZWN0aW9uCi0JcmF0aGVybiB0aGFuIHJhd2RhdGEuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBSZW1vdmUgcmF3ZGF0YSBjaGVjay4KLQotCSogc3JlYy5jIChwYXNzX292ZXIpOiBTZXQgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIFM3LCBTOCBvciBTOS4KLQotRnJpIE9jdCAxNCAxOToxNTo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBVcGRhdGVkIHRvIDIuNS4KLQotRnJpIE9jdCAxNCAxMTowNzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBDYXN0IGVuZCB0byBiZSBub24gY29uc3QgYmVmb3JlIHBhc3NpbmcgaXQKLQl0byBzdHJ0b3VsLgotCi1UaHUgT2N0IDEzIDE0OjQwOjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IFBhc3MgZW5kIGFyZ3VtZW50IG9uIHRvIHN0cnRvdWwuCi0KLVdlZCBPY3QgMTIgMTY6NDY6NDMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKGJmZF9yZWFsbG9jKTogRGVsZXRlZCwgc2luY2UgaXQncyBicm9rZW4gYW5kIGZpeGluZyBpdAotCXdvdWxkIG1ha2UgaXQgc2xvdy4gIEJlc2lkZXMsIGl0IGlzbid0IHVzZWQgbXVjaC4KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogQWx3YXlzIGFsbG9jYXRlIG5ldyBzdG9yYWdlIGZvciB0aGUKLQlzeW1ib2wgdGFibGUuCi0KLVdlZCBPY3QgMTIgMTE6NTQ6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBNYXJrIGxvY2FsIHN0UHJvYywgc3RMYWJlbCBvcgotCXN0YWJzIHN5bWJvbHMgYXMgQlNGX0RFQlVHR0lORy4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBNYWtlCi0Jc3RyMSBhbmQgc3RyMiBjb25zdCBwb2ludGVycy4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgdG9wIGxldmVsIGluc3RhbGwuc2ggc2NyaXB0LgotCSogY29uZmlnL1JFQURNRSAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9kZWx0YTg4Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2kzODZ2NC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NS5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9uY3J0MzAwMC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQotVHVlIE9jdCAxMSAxMzo1Nzo1NiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWNAYW5kYW50ZS5haWIuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE1ha2Ugc3VyZSB0aGF0IGEgc3ltYm9sCi0Jd2l0aCBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgb3IgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotCWVudHJ5IGlzIGFkZGVkIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMKLQlhbHJlYWR5IGdvdHRlbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LCBjaGFuZ2UgdGhlCi0JZGVmaW5pdGlvbiB0byB0aGUgUExUIGVudHJ5LgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTEgMTc6MTI6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBseW54LWNvcmUuYyAobHlueF9jb3JlX2ZpbGVfcCk6IFNQQVJDIEx5bnggYXBwZWFycyB0byBzdGFydAotCWR1bXBpbmcgdGhlIC5kYXRhIHNlY3Rpb24gaW4gYSBjb3JlIGZpbGUgYXQgYSBwYWdlIGJvdW5kYXJ5LgotCi1Nb24gT2N0IDEwIDE2OjI0OjQ0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQ2FzdCBhcmd1bWVudCB0byBiZmRfaF9wdXRfMzIKLQl0byBjb3JyZWN0IHR5cGUuCi0JKGNvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBDYXN0IGFyZ3VtZW50IHRvIGJmZF9oX2dldF8zMiB0byBjb3JyZWN0Ci0JdHlwZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENhc3QgYXJndW1lbnQgdG8KLQliZmRfZWxmX2hhc2ggdG8gY29ycmVjdCB0eXBlLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBUaGUgUEMxMCwgUEMyMiwgYW5kCi0JV1BMVDMwIHJlbG9jYXRpb25zIGFyZSBQQy1yZWxhdGl2ZS4KLQotVGh1IE9jdCAgNiAxMjo1NzoyNiAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IENvcnJlY3RseSBpbml0aWFsaXplIHZtYSBpZiB0aGUgdm1hIG9mCi0JdGhlIHRleHQgc2VjdGlvbiB3YXMgdXNlci1kZWZpbmVkLgotCi1XZWQgT2N0ICA1IDE0OjQyOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBTVlI0IHVzZXMgc2xhc2gKLQluZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgbmFtZSwgbm90IGp1c3QgbmV3bGluZS4KLQotVHVlIE9jdCAgNCAxMToyMzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQKLQlwb3dlciB0byA0LCByYXRoZXIgdGhhbiB1c2luZyBhbGlnbl9wb3dlcl9taW4uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IHVzZSBhbGlnbl9wb3dlcl9taW47Ci0JdXNlIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiBpbnN0ZWFkLiAgRm9yY2UgdGhlIC5zdGFiCi0JYW5kIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIGFsaWduZWQgdG8gbm8gbW9yZSB0aGFuIDIuICBSZW1vdmUKLQlDT0ZGX1NQQVJDIHNwZWNpYWwgY2FzZXMuCi0JKiBjb2ZmLWEyOWsuYzogRGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUi4KLQkqIGNvZmYtYXBvbGxvLmMsIGNvZmYtZ28zMi5jLCBjb2ZmLWg4MzAwLmM6IExpa2V3aXNlLgotCSogY29mZi1oODUwMC5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jOiBMaWtld2lzZS4KLQkqIGNvZmYtbTg4ay5jLCBjb2ZmLXJzNjAwMC5jLCBjb2ZmLXNoLmMsIGNvZmYtc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXdlMzJrLmMsIGNvZmYtejhrLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gY29udmVydCBhIGxvbmcKLQlmaWxlbmFtZSBpZiB0aGUgb2Zmc2V0IGZpZWxkIGlzIHplcm8uCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IElmIHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sCi0Jd2FzIG5vdCBzZXQsIHVzZSBhIHNlbnNpYmxlIGRlZmF1bHQgcmF0aGVyIHRoYW4gemVyby4KLQotTW9uIE9jdCAgMyAxNjowNDoyOSAxOTk0ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfY2xvc2UpOiBIb25vciB1bWFzayB3aGVuIHNldHRpbmcgZXhlY3V0aW9uIGJpdHMuCi0JKGJmZF9jbG9zZV9hbGxfZG9uZSk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICAzIDA0OjQxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgU2V0IFNFQ19IQVNfQ09OVEVOVFMgZmxhZwotCWZvciAuc3RhY2sgYW5kIC5sZGluZm8gc2VjdGlvbnMuIENhc3QgY29yZWRhdGEuY190YWIgdG8gYQotCWZpbGVfcHRyIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gZ2NjLgotCi1GcmkgU2VwIDMwIDEzOjExOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBSZW1vdmUgYXNzZXJ0aW9uIHdoZW4gYSBub24KLSAgICAgICAgU0VDX0lOX01FTU9SWSBzZWN0aW9uIGlzIGZvdW5kIGluIGR5bm9iai4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuCi0JbGlua2luZyBQSUMgY29tcGlsZWQgY29kZS4KLQotVGh1IFNlcCAyOSAxNToyMTo0NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogQ2hhbmdlIHR5cGUgb2YgImRhdGEiIHRvCi0JYmZkX2J5dGUgKiwgdG8gZ28gYWxvbmcgd2l0aCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IE1vdmVkIGhlcmUgZnJvbSBlbGZfcHJpbnRfc3ltYm9sCi0JaW4gZWxmY29kZS5oLiAgKGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGwpOiBQcmludCBzeW1ib2wncyBzaXplCi0JZmllbGQsIGV4Y2VwdCBmb3IgY29tbW9uIHN5bWJvbHM7IHByaW50IHRoZWlyIGFsaWdubWVudC4KLQkqIGVsZmNvZGUuaCAoZWxmX3ByaW50X3N5bWJvbCk6IERlbGV0ZWQuCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfZWxmezMyLDY0fV9wcmludF9zeW1ib2wpOiBSZXBsYWNlIGRlY2xhcmF0aW9ucyB3aXRoIG1hY3Jvcy4KLQotCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogU2hvdyBCU0ZfTE9DQUwgYW5kIEJTRl9HTE9CQUwKLQlpbiBvbmUgY29sdW1uLiAgVXNlIHRoZSBjb2x1bW4gZnJlZWQgdXAgdG8gc2hvdyBCU0ZfRlVOQ1RJT04gYW5kCi0JQlNGX0ZJTEUuCi0KLVRodSBTZXAgMjkgMTI6Mjk6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzeW1zLmMgKHN0dCk6IEFkZCAucmRhdGEgYW5kIC5yb2RhdGEuCi0KLVdlZCBTZXAgMjggMTM6MzU6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogQ2FzdCBkYXRhX3N0YXJ0IHRvIGJmZF9ieXRlICoKLQliZWZvcmUgdHJ5aW5nIHRvIGFkZCB2YWx1ZXMgdG8gaXQuCi0KLVR1ZSBTZXAgMjcgMTY6NDc6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IENhc3QKLQlyZXR1cm4gdmFsdWUgZnJvbSBlbGZfc3ltX2V4dHJhLgotCShlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBiZmRfemFsbG9jLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tIG1hbGxvYy4KLQotCSogZ2VuLWFvdXQuYyAobWFpbik6IERlY2xhcmUgYW5kIGluaXRpYWxpemUgImFyY2giLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYXN0IHJldHVybiB2YWx1ZSBvZgotCWJmZF9oYXNoX2FsbG9jYXRlLgotCi0JKiByaXNjaXguYyAocmlzY2l4X2NhbGxiYWNrKTogVXNlIFBBUkFNUyBtYWNybyBpbiBwcm90b3R5cGUuCi0KLQkqIHJlbG9jLmMgKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24sIG1vc3RseSBjb3BpZWQKLQlmcm9tIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFkanVzdGVkIGZvciB0aGUgYXNzZW1ibGVyJ3MgbmVlZHMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gU2VwIDI2IDExOjAwOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFsaWduIHRoZQotCXNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBwb3NpdGlvbiBldmVuIGlmIERfUEFHRUQgaXMgbm90IHNldC4KLQotCSogYmZkLWluLmggKGJmZF9zZWVrKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIG5vdCBtYXJrIGZwIGNvbnN0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogRG9uJ3QgbWFyayBwYXJhbWV0ZXJzIGNvbnN0LCB0byBhdm9pZAotCWNvbmZsaWN0cyB3aXRoIGRlY2xhcmF0aW9uLgotCi1GcmkgU2VwIDIzIDE1OjE1OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IERvbid0IGFib3J0IGlmIHdlIGFsbG9jYXRlZAotCXRvbyBtdWNoIHNwYWNlIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXIsIG9ubHkgaWYgd2UgYWxsb2NhdGVkIHRvbwotCWxpdHRsZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTaW1pbGFyIGNoYW5nZS4KLQotVHVlIFNlcCAyMCAxMzoxNzowNyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaDogRml4IGNvbW1lbnQuCi0JKiBuczMya25ic2QuaDogQ2hhbmdlZCBNX05TMzJLX05FVEJTRCB0byBNXzUzMl9ORVRCU0QgdG8gbWF0Y2gKLQkgIGxpYmFvdXQuaC4KLQotVHVlIFNlcCAyMCAxNToyMzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgc3BhcmNuZXRic2Quby4KLQkoQ0ZJTEVTKTogQWRkIG5zMzJrbmV0YnNkLmMgYW5kIHNwYXJjbmV0YnNkLmMuCi0JKiB0YXJnZXRzLmM6IG5zMzJrbmV0YnNkX3ZlYyB3YXMgcmVuYW1lZCB0byBwYzUzMm5ldGJzZF92ZWMuCi0KLQkqIGNvZmYtc2guYyAocnR5cGUyaG93dG8pOiBSZW1vdmU7IHVudXNlZC4KLQkoY29mZl9zaF9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSByc3RhdC4KLQkocmVsb2NfcHJvY2Vzc2luZyk6IENvbW1lbnQgb3V0OyB1bnVzZWQuCi0KLUZyaSBTZXAgMTYgMTI6MTI6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogSWYgaC0+aW5keCBpcyAtMiwgdGhlbgotCWFsd2F5cyB3cml0ZSBpdCBvdXQgZXZlbiBpZiBpdCB3b3VsZCBub3JtYWxseSBiZSBzdHJpcHBlZC4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogSWYgd2UgZmluZCBhIHJlbG9jIGFnYWluc3QgYQotCXN0cmlwcGVkIGdsb2JhbCBzeW1ib2wsIGZvcmNlIGl0IHRvIGJlIHdyaXR0ZW4gb3V0IHJhdGhlciB0aGFuCi0JbWVyZWx5IGNhbGxpbmcgdW5hdHRhY2hlZF9yZWxvYy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgMTQgMTU6Mzc6MTkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IE5ldyBmaWVsZCBzb3J0ZWRfc3ltcy4KLQkob2JqX3NvbV9zb3J0ZWRfc3ltcyk6IEFjY2Vzc29yIG1hY3JvLgotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBJbml0aWFsaXplIHNvcnRlZF9zeW1zIHRvIE5VTEwuCi0JKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBTb3J0IGEgY29weSBvZiB0aGUgQkZEJ3Mgc3ltYm9sIHRhYmxlOwotCXN0b3JlIHRoZSBzb3J0ZWQgc3ltYm9sIHRhYmxlIGluIHNvcnRlZF9zeW1zLgotCShzb21fd3JpdGVfZml4dXBzKTogSW5pdGFsaXplIHRtcF9yZWxvYyB0byBOVUxMIHRvIG1ha2UgR0NDIGhhcHB5LgotCShzb21fYmVnaW5fd3JpdGluZyk6IFNpbWlsYXJseSBmb3IgZXhlY19oZWFkZXIuICBQYXNzIHRoZSBzb3J0ZWQKLQlzeW1ib2wgdGFibGUgdG8gc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFVzZSB0aGUgc29ydGVkIHN5bWJvbHMgcmF0aGVyCi0JdGhhbiB0aGUgY2Fub25pY2FsIHN5bWJvbCB0YWJsZS4KLQotCSogc29tLmggKHNvbV9zeW1ib2xfdHlwZSk6IEFkZCAic3RyaW5ndGFiX29mZnNldCIgZmllbGQuCi0JKiBzb20uYyAoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzKTogVXNlICJzdHJpbmd0YWJfb2Zmc2V0IgotCXJhdGhlciB0aGFuIGRlc3Ryb3lpbmcgdGhlICJuYW1lIiBmaWVsZCBpbiB0aGUgQkZEIHN5bWJvbC4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAxNCAxNTowNjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogUmVuYW1lIHNraXBfaW5kaXJlY3QgdG8KLQlza2lwX25leHQuICBJZiB3ZSBmaW5kIGFuIE5fV0FSTklORyBzeW1ib2wgd2hpY2ggaGFzIGFscmVhZHkgYmVlbgotCXdyaXR0ZW4gb3V0LCBzZXQgc2tpcF9uZXh0LgotCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfdGRhdGEpOiBBZGQgZmllbGQgZmluZF9idWZmZXIuCi0JKiBlY29mZi5jOiBJbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBIYW5kbGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBLZWVwIGEgc3ltYm9sIG1hcmtlZCBhcyB3ZWFrCi0JZXZlbiBpZiBpdCBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgb2JqZWN0LgotCi1UdWUgU2VwIDEzIDE3OjU3OjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2ZpeHVwX2Zvcm1hdHMpOiBDYXNlIFJfRU5UUlkgKDB4YjMpLCBzZXQgYm90aAotCSdUJyBhbmQgJ1UnIHRvIGdyYWIgYWxsIHRoZSB1bndpbmQgaW5mb3JtYXRpb24uCi0JKHNvbV9zZXRfcmVsb2NfaW5mbyk6IE1ha2UgJ1UnIHVud2luZCBiaXRzIHBlcnNpc3QgYWNyb3NzCi0JbXVsdGlwbGUgU09NIHJlbG9jYXRpb25zLiAgU2V0IHRoZSBhZGRlbmQgZmllbGQgb2YgYW4gUl9FTlRSWQotCXJlbG9jYXRpb24gdG8gdGhlIHZhbHVlIGluICdUJzsgc2V0IHRoZSBhZGRlbmQgZmllbGQgb24gYW4KLQlSX0VYSVQgcmVsb2NhdGlvbiB0byB0aGUgdmFsdWUgaW4gJ1UnLgotCi0JKiBzb20uaCAoc29tX3N5bWJvbF90eXBlKTogRGVsZXRlIHVud2luZCBmaWVsZC4KLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBGb3IgUl9FTlRSWSBmaXh1cHMsIGdldCAzMmJpdHMgb2YKLQl1bndpbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWRkZW5kIGZpZWxkIG9mIHRoZSBSX0VOVFJZLCBnZXQgdGhlCi0Jb3RoZXIgMzJiaXRzIGZyb20gdGhlIGFkZGVuZCBmaWVsZCBvZiB0aGUgUl9FWElULgotCShiZmRfc29tX2F0dGFjaF91bndpbmRfaW5mbyk6IERlbGV0ZSBmdW5jdGlvbiBhbmQgYWxsIHJlZmVyZW5jZXMuCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX3R5cGUpOiBEZWxldGUgdW51c2VkIGEub3V0LXJlbGF0ZWQgZmllbGRzLgotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogVXNlIGJmZF9hYnNfc2VjdGlvbl9wdHIKLQlpbnN0ZWFkIG9mICZiZmRfYWJzX3NlY3Rpb24uCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogSGFuZGxlIGV4ZWNfZW50cnkgYW5kIGV4ZWNfZmxhZ3MgYmVpbmcKLQlzd2l0Y2hlZCBpbiBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IHRoZSBPU0YxIGxpbmtlci4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0VYSVQganVzdCBsaWtlIHRoZSBSX3tGLEwsUn1TRUwKLQlmaXh1cHMuICBTdXBwb3J0IFJfQUxUX0VOVFJZIChoYW5kbGUganVzdCBsaWtlIFJfRVhJVCkuCi0KLVR1ZSBTZXAgMTMgMTY6MDQ6MDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IHN5bWVudF9iYXNlIGlzIHVuc2lnbmVkCi0Jc28gY2FuJ3QgY29tcGFyZSAtdmUgbnVtYmVycyB3aXRoIGl0LgotCi1Nb24gU2VwIDEyIDIwOjMxOjE3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc2hjb2ZmX3ZlYyk6IFVzZSBjb2ZmbGluay5vIG5vdy4KLQkqIGNvZmYtc2guYzogUmV3cml0dGVuIHRvIHVzZSBuZXcgZmFzdCBjb2ZmIGJhY2tlbmQuCi0KLVR1ZSBTZXAgMTMgMTY6MjM6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBhc3N1bWUgdGhhdCBhbGwgdGhlIGlucHV0Ci0gICAgICAgIGZpbGVzIGFyZSBhLm91dC4KLQotVHVlIFNlcCAxMyAxMTowOTozOSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLW5ldGJzZCk6IHVzZSBzcGFyY25ic2QuCi0JICAobnMzMmstKi1uZXRic2QpOiB1c2UgbnMzMmtuYnNkLgotCi0JKiBob3N0cy97bmJzZCxpMzg2bmJzZCxuczMya25ic2Qsc3BhcmNuYnNkfS5oOiBOZXcgZmlsZXMsIE5ldEJTRAotCSAgaG9zdCBzdXBwb3J0LgotCi0JKiBzcGFyY25ldGJzZC5jOiBOZXcgZmlsZSwgYWRkcyBzdXBwb3J0IGZvciBOZXRCU0Qvc3BhcmMuCi0JKiBjb25maWcvc3BhcmMtbmJzZC5tdDogTGlrZXdpc2UuCi0KLQkqIG5ldGJzZC5oOiBOZXcgZmlsZSwgZGVmaW5pdGlvbnMgY29tbW9uIHRvIGFsbCBuZXRic2QgcG9ydHMuCi0JKiBpMzg2bmV0YnNkLmM6IFVzZSBpdC4KLSAgICAgICAgKiBuczMya25ldGJzZC5jOiBVc2UgaXQuCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYywgY29uZmlnL2kzODYtbmJzZC5tdCwKLQkgIGNvbmZpZy9uczMyay1uYnNkLm10OiBjYW5vbmljYWxpemUgbmV0YnNkIHRhcmdldHMgdG8gY29uZm9ybSB0bwotCSAgZmlsZS92YXJpYWJsZSBuYW1pbmcgY29udmVudGlvbnMuCi0JKiBpMzg2bmV0YnNkLmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gbmV0YnNkMzg2LmMuCi0JKiBuczMya25ldGJzZC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG5ldGJzZDUzMi5jLgotCQotTW9uIFNlcCAxMiAyMTo1NjoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9yZWxvY19za2lwKTogQ29ycmVjdCBvZmYtYnktb25lIGVycm9yIGZvciA0LWJ5dGUKLQlSX05PX1JFTE9DQVRJT04gZml4dXBzLgotCShiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBSZXR1cm4gdGhlIGFic29sdXRlIHNlY3Rpb24gaWYgdGhlCi0Jc3ltYm9sIGlzbid0IGNvbnRhaW5lZCBpbiBhbnkgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTVF9QUklfUFJPRyBhbmQgU1RfU0VDX1BST0cgc3ltYm9scyBhcmUKLQlub3QgZnVuY3Rpb24gc3ltYm9scyAodGhleSBhcmUgbWFnaWMgY29kZSBsYWJlbHMgd2hpY2ggKmNhbiogYmUgdGhlCi0JdGFyZ2V0cyBvZiBjcm9zcyBzcGFjZSBicmFuY2hlcykuICAkU1RBUlQkIGlzIG5vdCBhIHNlY3Rpb24gc3ltYm9sLgotCi1Nb24gU2VwIDEyIDExOjQzOjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBBZGQgU0VDX0NPREUgYW5kIFNFQ19EQVRBCi0JdG8gc2VjdGlvbl9mbGFncy4KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9saXR0bGVfdmVjLCBlY29mZl9iaWdfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IFNldCB0aGUgdHlwZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sCi0JdG8gU1RUX0ZVTkMgaWYgdGhlIEJTRl9GVU5DVElPTiBmbGFnIGlzIHNldC4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IElmIHJfc3ltbmR4IGlzIC0xLCBkb24ndAotCWNoYW5nZSBpdC4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElmIHJfc3ltbmR4IGlzIC0xLCBpdCBpcyBhbgotCWFic29sdXRlIHJlbG9jLiAgRG9uJ3QgZHVtcCBjb3JlIHVzaW5nIHJfc3ltbmR4IGFzIGFuIGFycmF5IGluZGV4LgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiAoY29weSBvZiBmdW5jdGlvbiBpbgotCWNvZmYtaTM4Ni5jKS4KLQkoY29mZl9tNjhrX2x5bnhydHlwZV90b19ob3d0byk6IHN5bSBhcmd1bWVudCBtYXkgYmUgTlVMTC4KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBhbiByX3N5bW5keAotCXZhbHVlIG9mIC0xLCBtZWFuaW5nIGFuIGFic29sdXRlIHJlbG9jLgotCi0JKiBjdG9yLmM6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogUmVtb3ZlIGN0b3Iuby4KLQkoQ0ZJTEVTKTogUmVtb3ZlIGN0b3IuYy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gU2VwIDEyIDAxOjU4OjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IElmIHRoZXJlIHdhcyBhIGxpbmsKLQllcnJvciBvZiBzb21lIHNvcnQgKGZvciBleGFtcGxlLCB1bmRlZmluZWQgc3ltYm9scyksIHRoZW4gZG8gbm90Ci0JYXBwbHkgYW55IHJlbG9jcywganVzdCBub3RpZnkgdGhlIHVzZXIgb2YgdGhlIGVycm9ycy4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBEbyBub3QgYnVpbGQgYSBzeW1ib2wKLQlleHRlbnNpb24gc2VjdGlvbiBmb3IgYW4gZXhlY3V0YWJsZSAoaXQncyB1c2VsZXNzKS4KLQkoZWxmMzJfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERvIG5vdGhpbmcgaWYgdGhlcmUgd2FzIGEKLQlsaW5rIGVycm9yIG9mIHNvbWUgc29ydCAoZm9yIGV4YW1wbGUsIHVuZGVmaW5lZCBzeW1ib2xzKS4KLQkoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogS2x1ZGdlLiAgVHVybiBvZmYgU0VDX0hBU19DT05URU5UUwotCWZvciBhbGwgdGhlIGlucHV0IHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMgdG8ga2VlcCB0aGUgZ2VuZXJpYwotCUJGRCBjb2RlIGhhcHB5LiAgVGVtcG9yYXJpbHkgdHVybiBpdCBvbiB0byByZWFkIHRoZSBjb250ZW50cyBvZgotCXRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uCi0KLVN1biBTZXAgMTEgMjE6NTg6NTkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChSQU5MSUIpOiBEbyBub3Qgc2V0LgotCSogY29uZmlnL2hwcGFic2QubWggKFJBTkxJQik6IExpa2V3aXNlLgotCi1TdW4gU2VwIDExIDIyOjUwOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2YtaTM4Nmx5bnguYzogUmVtb3ZlICNpZiAwIGNvZGUuCi0JKGkzODZfbHlueG9zX2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IElmCi0JY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzIGRlZmluZWQsIG9ubHkgZGVmaW5lIHRoaXMgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzLCBjb2ZmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEhhbmRsZQotCWJmZF9pbmRpcmVjdF9saW5rX29yZGVyIGV4cGxpY2l0bHksIHJhdGhlciB0aGFuIHZpYQotCV9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCShzZXRfc3ltYm9sX2Zyb21faGFzaCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogU3ltYm9sIHNldHRpbmcgY29kZSBtb3ZlZAotCXRvIHNldF9zeW1ib2xfZnJvbV9oYXNoOyBjYWxsIGl0LgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBBZGQgZ2VuZXJpY19saW5rZXIgYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYgZmFsc2UsIHNldCB0aGUgZ2VuZXJpYyBzeW1ib2xzIGJhc2VkIG9uCi0JdGhlIGhhc2ggdGFibGUgZW50cmllcy4KLQotRnJpIFNlcCAgOSAxMTo1MTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfc3ltdGFiKTogUmVpbmRlbnRlZC4gIFJlbW92ZWQgY29tbWVudGVkIG91dAotCWNhbGwgdG8gYmZkX2NvbnN0cnVjdG9yX2VudHJ5LgotCi0JQ29udmVydCBtNjhrIENPRkYgdG8gdXNlIG5ldyBDT0ZGIGJhY2tlbmQgbGlua2VyLgotCSogY29mZi1tNjhrLmMgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUuCi0JKGNvZmZfbTY4a19seW54X3J0eXBlX3RvX2hvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4a2NvZmZfdmVjKTogQnVpbGQgY29mZmxpbmsuby4KLQkobTY4a2NvZmZ1bl92ZWMsIG02OGtseW54X2NvZmZfdmVjKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgIDggMTY6MjA6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjYXNlIFJFTEJZVEUpOiBGbGFnCi0Jb3ZlcmZsb3dzIGNvcnJlY3RseS4KLQotV2VkIFNlcCAgNyAxOTowMTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IENoYW5nZSBzZWNvbmQgYXJndW1lbnQgb2YKLQllbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2sgdG8gYm9vbGVhbi4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbGlua2VyIGZpZWxkLgotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBhc3MgdmFsdWUgb2YKLQl0ZGF0YSBsaW5rZXIgZmllbGQgdG8gZmluYWxfd3JpdGVfcHJvY2Vzc2luZywgcmF0aGVyIHRoYW4gTlVMTC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgY2FsbCBmaW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2suICBTZXQKLQl0ZGF0YSBsaW5rZXIgZmllbGQgdG8gdHJ1ZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IENoYW5nZSB0eXBlIG9mCi0Jc2Vjb25kIGFyZ3VtZW50IHRvIGJvb2xlYW4uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQlMaWtld2lzZS4KLQotCSogY29mZi1nbzMyLmMgKFJUWVBFMkhPV1RPKTogRnVsbHkgcGFyZW50aGVzaXplIGFyZ3VtZW50cy4KLQkqIGNvZmYtaTk2MC5jIChSVFlQRTJIT1dUTyk6IExpa2V3aXNlLgotCSogY29mZi1tODhrLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXdlMzJrLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCi0KLQlNYWtlIGkzODYgQ09GRiB1c2UgbmV3IENPRkYgYmFja2VuZCBsaW5rZXIuCi0JKiBjb2ZmLWkzODYuYyAoUlRZUEUySE9XVE8pOiBGdWxseSBwYXJlbnRoZXNpemUgYXJndW1lbnRzLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4NmNvZmZfdmVjKTogVXNlIGNvZmZsaW5rLm8uCi0JKGkzODZseW54X2NvZmZfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8uCi0JKGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lLgotCShjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lIHRvIHVzZSBSVFlQRTJIT1dUTywgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBBbGxvY2F0ZSBzZWN0aW9uX2NvdW50ICsgMQotCXNlY3Rpb25faW5mbyBzdHJ1Y3R1cmVzLCBzaW5jZSB0aGUgdGFyZ2V0X2luZGV4IGlzIDEgYmFzZWQuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBTZXQgKnNlY3BwIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIgZm9yIGEKLQljb21tb24gc3ltYm9sLiAgQWRqdXN0IHJlbF9oYXNoIGJ5IHRoZSBvdXRwdXQgcmVsb2MgY291bnQuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi1UdWUgU2VwICA2IDIzOjI4OjUyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFRyZWF0IHVuZGVmaW5lZCBjb2RlCi0Jc3ltYm9scyBhbmQgdW5kZWZpbmVkIHN5bWJvbHMgd2hpY2ggbm8gdHlwZSBpbiB0aGUgc2FtZSBtYW5uZXIKLQlpZiB0aGUgYXNzb2NpYXRlZCBCRkQgc3ltYm9sIGhhcyBCU0ZfRlVOQ1RJT04gc2V0LiAgRm9yIGEgZGVmaW5lZAotCXN5bWJvbCB3aGljaCBubyB0eXBlLCBzZWxlY3QgYSBTT00gdHlwZSBiYXNlZCBvbiB0aGUgZmxhZ3Mgb2YgdGhlCi0Jc2VjdGlvbiBjb250YWluaW5nIHRoZSBzeW1ib2wuCi0JKHNvbV9zbHVycF9zeW1ib2xfdHlwZSk6IFNldCBCU0ZfRlVOQ1RJT04gZm9yIHVuZGVmaW5lZCBTVF9TVFVCCi0Jb3IgU1RfQ09ERSBzeW1ib2xzIChpbXBvcnRpbmcgYSBub24tZnVuY3Rpb24gY29kZSBzeW1ib2wgaXMKLQltZWFuaW5nbGVzcyBpbiBTT00pLgotCShzb21fc2V0X3JlbG9jX2luZm8pOiBEb24ndCBzZXQgIm9mZnNldCIgdG8gdGhlIHNlY3Rpb24ncyB2bWE7IGl0Ci0Jc2hvdWxkIGFsd2F5cyBzdGFydCBhdCB6ZXJvLgotCi1UdWUgU2VwICA2IDE0OjUxOjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCUFkZCBuZXcgc3R5bGUgbGlua2VyIHN1cHBvcnQgdG8gQ09GRiBiYWNrZW5kLiAgYTI5ayBvbmx5IGZvciBub3cuCi0JKiBjb2ZmbGluay5jOiBOZXcgZmlsZS4KLQkqIGxpYmNvZmYtaW4uaDogSW5jbHVkZSBiZmRsaW5rLmguCi0JKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMsIG9ial9jb2ZmX3N0cmluZ3MpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKG9ial9jb2ZmX3N5bV9oYXNoZXMpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKHN0cnVjdCBjb2ZmX3RkYXRhKTogQWRkIGZpZWxkcyBleHRlcm5hbF9zeW1zLCBzdHJpbmdzLCBhbmQKLQlzeW1faGFzaGVzLgotCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoY29mZl9saW5rX2hhc2hfbG9va3VwLCBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KLQkoY29mZl9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzLCBfYmZkX2NvZmZfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIF9iZmRfcmVsc3osCi0JX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4sIF9iZmRfY29mZl9zeW1faXNfZ2xvYmFsLAotCV9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24uCi0JKGJmZF9jb2ZmX3JlbHN6LCBiZmRfY29mZl9zd2FwX3JlbG9jX2luKTogRGVmaW5lLgotCShiZmRfY29mZl9zeW1faXNfZ2xvYmFsKTogRGVmaW5lLgotCShiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgb2JqX3Jhd19zeW1lbnRfY291bnQgYW5kCi0Jb2JqX2NvbnZfdGFibGVfc2l6ZS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgdGFyZ2V0X2luZGV4IG9mIGFsbAotCXNlY3Rpb25zLiAgU2V0IG91dHB1dF9oYXNfYmVndW4gZmllbGQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IHRhcmdldF9pbmRleDsgbm93IGRvbmUgYnkKLQljb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIFJlbW92ZSBvYnNvbGV0ZSBoYW5kbGluZyBvZgotCXNjbl9iYXNlIGFuZCBkYXRhX2Jhc2UuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhhdCB0YXJnZXRfaW5kZXgKLQlpcyBwb3NpdGl2ZSwgc2luY2UgaXQgYWx3YXlzIGlzLiAgUmVtb3ZlIHVzZSBvZiBwYWQsIHdoaWNoIGlzCi0JYWx3YXlzIHplcm8uICBDaGVjayBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90IGJmZF9nZXRfc3ltY291bnQsCi0JZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scywgYnV0IG9ubHkgd3JpdGUgdGhlbSBvdXQgaWYKLQliZmRfZ2V0X3N5bWNvdW50IGlzIG5vbi16ZXJvLiAgRG9uJ3QgY2hlY2sgb2JqX3Jhd19zeW1lbnRfY291bnQKLQl1bnRpbCBhZnRlciBjb2ZmX3dyaXRlX3N5bWJvbHMgaXMgY2FsbGVkLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90Ci0JYmZkX2dldF9zeW1jb3VudCBmb3IgdGhlIG51bWJlciBvZiBzeW1ib2xzLiAgRG9uJ3Qgc2V0Ci0Jb2JqX2NvbnZfdGFibGVfc2l6ZS4KLQkoY29mZl9zeW1faXNfZ2xvYmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBvciBtYWNyby4KLQkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IENhbGwgY29mZl9zd2FwX3JlbG9jX2luLCBub3QKLQliZmRfc3dhcF9yZWxvY19pbi4KLQkoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IElmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcwotCWRlZmluZWQsIGRlZmluZSBhcyBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IFNpbWlsYXIgY2hhbmdlLgotCShjb2ZmX2JmZF9maW5hbF9saW5rKTogU2ltaWxhciBjaGFuZ2UuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSBhcyBOVUxMIGlmIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogRG9uJ3Qgc2V0IG9ial9yYXdfc3ltZW50X2NvdW50Ci0JYW5kIG9ial9jb252X3RhYmxlX3NpemUgaGVyZS4KLQkoY29mZl9jb3VudF9saW5lbnVtYmVycyk6IFJlaW5kZW50LiAgSWYgYmZkX2dldF9zeW1jb3VudCBpcyB6ZXJvLAotCWFkZCB1cCB0aGUgbGluZSBudW1iZXJzIGZyb20gdGhlIHNlY3Rpb25zLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBTZXQgb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAotCWJmZF9nZXRfc3ltY291bnQuCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBEb24ndCBwb2ludGVyaXplIGEgbm9ucG9zaXRpdmUgeF9lbmRuZHgKLQlmaWVsZC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBVc2Ugb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAotCWJmZF9nZXRfc3ltY291bnQuCi0JKGNvZmZfcHJpbnRfc3ltYm9sKTogSWYgYXV4cC0+Zml4X2VuZCwgcHJpbnQgeF9lbmRuZHggdmFsdWUuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2NfaW4pOiBSZW5hbWUgZnJvbSBiZmRfc3dhcF9yZWxvY19pbi4KLQlSZWluZGVudC4gIENoYW5nZSBhcmd1bWVudCB0eXBlIHRvICBQVFIuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW4gKGEyOWtjb2ZmX2JpZ192ZWMpOiBDb21waWxlIGNvZmZsaW5rLm8uCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmbGluay5vLgotCShDRklMRVMpOiBBZGQgY29mZmxpbmsuYy4KLQotVHVlIFNlcCAgNiAxNDowMDo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sLCBjYXNlIGJmZF9zeW1ib2xfcHJpbnRfYWxsKTogQ2hlY2sKLQlmb3Igc2VjdGlvbiBzeW1ib2wsIGFuZCBwcmludCBpdHMgYXV4IGZpZWxkcyB3aXRoIGFwcHJvcHJpYXRlCi0JbGFiZWxzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkZWQgY3B1LWFybS5vLgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogUmVjb2duaXplIHRoZSBBUk0gcHJvY2Vzc29yLgotCSogYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3QsIGxpYmFvdXQuaCwgcmVsb2MuYywKLQl0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgQVJNLgotCSogY3B1LWFybS5jLCByaXNjaXguYywgY29uZmlnL3Jpc2NpeC5taCwgY29uZmlnL3Jpc2NpeC5tdDogTmV3IGZpbGVzLgotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFibGUpOiBDaGVjayB0aGF0IHN0ciBpc24ndCBhIE5VTEwgcG9pbnRlci4KLQotRnJpIFNlcCAgMiAxNDoxMDozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBSZXdyb3RlIGRlZmluaXRpb24gdG8gdXNlCi0JbmV3ICJjaGV3IiBjb21tYW5kcyBmb3Igc2ltdWx0YW5lb3VzIGRlZmluaXRpb24gb2YgZW51bWVyYXRvciBhbmQKLQllbnVtZXJhdG9yIG5hbWUgdGFibGUuCi0JKGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lKTogTmV3IGZ1bmN0aW9uLCBmb3IgcmV0cmlldmluZyBhIHN5bWJvbGljCi0JbmFtZSBhc3NvY2lhdGVkIHdpdGggYW4gZW51bWVyYXRvci4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgQXVnIDMwIDIxOjI0OjU0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcywgY2FzZSBSX0VOVFJZKTogSGFuZGxlIGNhc2Ugd2hlcmUgbm8KLQl1bndpbmQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCi0KLVR1ZSBBdWcgMzAgMTE6NDM6MzAgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHNvbmFtZQotCWFyZ3VtZW50LCBhbmQgdXNlIGl0IHRvIHNldCBEVF9TT05BTUUgZHluYW1pYyBlbnRyeS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBBdWcgMjYgMTU6NDc6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBvYmpfcmF3X3N5bWVudF9jb3VudC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBWZXJpZnkgb2JqX3Jhd19zeW1lbnRfY291bnQsIHJhdGhlcgotCXRoYW4gc2V0dGluZyBpdC4KLQotVGh1IEF1ZyAyNSAxMDo0NDo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogUmVtb3ZlIGhvc3QgZGVwZW5kZW5jaWVzLgotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFiKTogQ2hlY2sgZm9yIF9iZmRfc3RyaW5ndGFiX2FkZCBlcnJvcgotCWJlZm9yZSBhZGRpbmcgQllURVNfSU5fV09SRC4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogTG9vayBmb3IgdGhlIGJlc3QgQ19GSUxFLAotCW5vdCBtZXJlbHkgdGhlIGZpcnN0LgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSWYgd2UgYXJlIG5vdCB1c2luZyB0aGUKLQlzeW1ib2wsIGNsZWFyIHRoZSBuYW1lIHNvIHRoYXQgaXQgaXMgbm90IHB1dCBpbiB0aGUgc3RyaW5nIHRhYmxlLgotCUZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLVdlZCBBdWcgMjQgMTE6NDk6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQ2FzdCBwb2ludGVyIGRpZmZlcmVudCB0byBsb25nCi0JYW5kIHVzZSAlbGQgdG8gcHJpbnQgaXQuCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKLQlkc2VjY250LgotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfZXh0X291dCk6IElmIEVDT0ZGXzY0LCBjbGVhciByZW1haW5pbmcKLQlieXRlcyBpbiBiaXRzMi4KLQotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBTZXQgb2JqX2NvbnZfdGFibGVfc2l6ZSBoZXJlLAotCXJhdGhlciB0aGFuIHdhaXRpbmcgdW50aWwgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSnVzdCBpZ25vcmUgQlNGX0RFQlVHR0lORyBzeW1ib2xzLgotCUZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBGaXggZmFpbHVyZSBjaGVjayBvZgotCWJmZF9tYWtlX2VtcHR5X3N5bWJvbC4gIEZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogVXNlIHRoZSBvdXRwdXRfc2VjdGlvbgotCShhbmQgb3V0cHV0X29mZnNldCkgaWYgdGhlcmUgaXMgb25lLgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogRGlzY2FyZCB0aGUgc3ltYm9scwotCWlmIHRoZSBhcmNoaXZlIGVsZW1lbnQgd2FzIG5vdCBuZWVkZWQuCi0KLQkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBFbnN1cmUgdGhhdCBhIHplcm8gc3RyaW5nCi0JaW5kZXggeWllbGRzIGFuIGVtcHR5IHN0cmluZy4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBJZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgdXNlIG5hbWUKLQlmcm9tIG9yaWdpbmFsIGhhc2ggdGFibGUgZW50cnksIG5vdCBmcm9tIGVudHJ5IGluICpzeW1faGFzaC4KLQotCSogYW91dHguaCAoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvKTogQWRkIGZpZWxkcyBjb250ZW50cywKLQlyZWxvY3MsIHN5bWJvbF9tYXAgYW5kIG91dHB1dF9zeW1zLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBXb3JrIG91dCB0aGUgbGFyZ2VzdCBzZWN0aW9uIHNpemUsIHJlbG9jCi0Jc2l6ZSwgYW5kIG51bWJlciBvZiBzeW1ib2xzLiAgVXNlIHRoZW0gdG8gcHJlYWxsb2NhdGUgYnVmZmVycyB0aGF0Ci0JYXJlIGxhcmdlIGVub3VnaCBmb3IgYWxsIGNhc2VzLgotCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogVXNlIHByZWFsbG9jYXRlZCBzeW1ib2xfbWFwLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50OyB1c2UKLQlwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcCBpbnN0ZWFkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgVXNlCi0JcHJlYWxsb2NhdGVkIG91dHB1dF9zeW1zLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50LiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBVc2UgcHJlYWxsb2NhdGVkIGNvbnRlbnRzIGFuZCByZWxvY3MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50OyB1c2UKLQlwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcCBpbnN0ZWFkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAyMyAxMDo1MTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogRG9uJ3QgdXBkYXRlIHRoZQotCXN5bWJvbCBtYXAgdGltZXN0YW1wIGlmIHRoZXJlIGlzIG5vIHN5bWJvbCBtYXAuICBGcm9tCi0Jc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlIChBbmRyZWFzIFNjaHdhYikuCi0KLU1vbiBBdWcgMjIgMTI6MjY6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuCi0JKGJmZF90YXJnZXQpOiBBZGQgZmllbGQgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLgotCSogYmZkLmMgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLWluLmggKF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlY2xhcmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogQ2FsbAotCWJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGluc3RlYWQgb2YgY2hlY2tpbmcgZm9yIGEgQlNEIGFyY2hpdmUKLQlhbmQgY2FsbGluZyBic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4KLQkoX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogUmVuYW1lIGZyb20KLQlfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuICBEb24ndCBhc3N1bWUgdGhhdCBhcm1hcF9kYXRlcG9zIGlzCi0JYWxyZWFkeSBzZXQuCi0JKiBhb3V0LXRhcmdldC5oIChNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGllZWUuYyAoaWVlZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQotCSogaGFzaC5jOiBDb3B5IHN0cmluZyBoYXNoIGZ1bmN0aW9ucyBmcm9tIGFvdXR4LmguCi0JKiBhb3V0eC5oOiBTdHJpbmcgaGFzaCBmdW5jdGlvbnMgbW92ZWQgdG8gaGFzaC5jLiAgUmV0YWluCi0Jc2ltcGxpZmllZCB2ZXJzaW9ucyBvZiBhZGRfdG9fc3RyaW5ndGFiIGFuZCBlbWl0X3N0cmluZ3RhYi4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIG5ldyBmdW5jdGlvbiBhbmQgc3RydWN0dXJlIG5hbWVzLgotCSogbGliYmZkLWluLmggKF9iZmRfc3RyaW5ndGFiX2luaXQsIF9iZmRfc3RyaW5ndGFiX2ZyZWUpOiBEZWNsYXJlLgotCShfYmZkX3N0cmluZ3RhYl9zaXplLCBfYmZkX3N0cmluZ3RhYl9hZGQpOiBEZWNsYXJlLgotCShfYmZkX3N0cmluZ3RhYl9lbWl0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1Nb24gQXVnIDIyIDEwOjQ5OjM3IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogQ3JlYXRlIGEgZml4dXAgZm9yIGFueQotCWRlZmluZWQgYWJzb2x1dGUgc3ltYm9sLCBub3QganVzdCBHT1Qgb3IgUExUIHN5bWJvbHMuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIHJlZmVyZW5jZXMgdG8gZGVmaW5lZAotCXN5bWJvbHMuCi0KLVRodSBBdWcgMTggMTY6Mjk6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JR2V0IGxkIC14IC1yIHRvIGhhbmRsZSBhLm91dCBzZXQgc3ltYm9scyBjb3JyZWN0bHkuCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IElmIHRoZSAuYnNzIFZNQSB3YXMgc2V0IG91dHNpZGUgb2YKLQlCRkQsIHBhZCB0aGUgLmRhdGEgc2VjdGlvbiB1cCB0byB0aGUgVk1BIG9mIHRoZSAuYnNzIHNlY3Rpb24uCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IElmIGEgc2V0IHN5bWJvbCBkb2VzIG5vdCBnZXQgbW9kaWZpZWQsCi0JdHJlYXQgaXQgYXMgYSBsb2NhbCBzeW1ib2wuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogU2V0IHRoZSB2YWx1ZSBvZiBzZXQgc3ltYm9scwotCWNvcnJlY3RseS4gIERvbid0IGRpc2NhcmQgc2V0IHN5bWJvbHMgZXZlbiBpZiBkaXNjYXJkaW5nIGxvY2FsCi0Jc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IERvbid0IGFib3J0IG9uIGJmZF9saW5rX2hhc2hfbmV3LAotCXNpbmNlIGl0IGNhbiBub3cgaGFwcGVuIGZvciBzZXQgc3ltYm9scy4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IEp1c3QgY2hlY2sgZm9yICIucmVsYSIgYW5kCi0JIi5yZWwiLCBub3QgIi5yZWxhLiIgYW5kICIucmVsLiI7IG1ha2UgdGhpcyB3b3JrIGJ5IGNoZWNraW5nCi0JdXNlX3JlbGFfcC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSnVzdCBjaGVjayBmb3IgIi5yZWwiLCBub3QKLQkiLnJlbC4iCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBKdXN0IGNoZWNrIGZvcgotCSIucmVsYSIsIG5vdCAiLnJlbGEuIgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1XZWQgQXVnIDE3IDE2OjU0OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJbml0aWFsaXplCi0JUEFTUyB0byB0aGUgb2xkIHZhbHVlICsgMS4KLQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IElmIGEgQ19GSUxFIHN5bWJvbCBoYXMKLQlubyBhdXggZW50cmllcywgdXNlIHRoZSBzeW1ib2wgbmFtZSBhcyB0aGUgZmlsZSBuYW1lLgotCShjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogTG9vayBmb3IgdGhlIHJpZ2h0IENfRklMRSBzeW1ib2wsIHJhdGhlcgotCXRoYW4gYWx3YXlzIHVzaW5nIHRoZSBmaXJzdCBvbmUuICBJZiB0aGVyZSBpcyBhIGRlYnVnZ2luZyBzeW1ib2wKLQlhZnRlciBhIGZ1bmN0aW9uIHN5bWJvbCwgc2tpcCBpdC4gIEFkZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlIGxpbmUKLQlvZmZzZXQsIHNpbmNlIGl0IHdhcyBzdWJ0cmFjdGVkIG91dCBpbiBjb2ZmX3NsdXJwX2xpbmVfdGFibGUuCi0KLVR1ZSBBdWcgMTYgMTY6NTM6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogSWYgd3JpdGluZyBzb21lIGZvcm0gb2YgYW4gZXhlY3V0YWJsZSwKLQlhbGxvY2F0ZSBhbmQgYXR0YWNoIGFuIGV4ZWMgaGVhZGVyIHRvIHRoZSBCRkQgcHJpdmF0ZSBkYXRhLgotCShzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IGZpbGwgZmllbGRzIG9mIHRoZSBleGVjIGhlYWRlciBiYXNlZAotCW9uIEJGRCBwcml2YXRlIGRhdGEgaGVyZSAobGlrZSB0aGUgZXhlYyBmbGFncykuICBEbyBub3Qgd3JpdGUKLQl0aGUgZXhlYyBoZWFkZXIgaGVyZS4KLQkoc29tX3dyaXRlX2hlYWRlcnMpOiBJbnN0ZWFkIGRvIGl0IGhlcmUuCi0JKiBzb20uaCAoc3RydWN0IHNvbWRhdGEpOiBOZXcgZmllbGQgImV4ZWNfaGRyIiBmb3IgdGhlIGV4ZWN1dGFibGUKLQlmaWxlIGhlYWRlci4KLQkob2JqX3NvbV9leGVjX2hkcik6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQotVHVlIEF1ZyAxNiAwMDoxMjozMSAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jIChsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIHNlY3Rpb24KLQluYW1lZCAubGludXgtZHluYW1pYywgbm90IC5keW5hbWljLgotCShsaW51eF9hZGRfb25lX3N5bWJvbCk6IFVzZSAubGludXgtZHluYW1pYywgbm90IC5keW5hbWljLgotCShiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAxNSAxMjoxNjo1NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoU1RSSU5HX1NJWkVfU0laRSk6IERlZmluZS4KLQkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBVc2UgU1RSSU5HX1NJWkVfU0laRSwgbm90IDQuCi0JKGNvZmZfd3JpdGVfc3ltYm9scywgYnVpbGRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogTGlrZXdpc2UuCi0KLQkqIGxpYmNvZmYtaW4uaCAob2JqX3N5bWJvbF9zbGV3KTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgY29mZl90ZGF0YSk6IFJlbW92ZSB1bnVzZWQgZmllbGRzIGluZGV4X3NsZXcsIHJhd19saW5lbm9zLAotCWFuZCBmbGFncy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3QpOiBEb24ndCBpbml0aWFsaXplIHJhd19saW5lbm9zLgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBpbml0aWFsaXplIGZsYWdzLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV96bWFnaWNfY29udGlndW91cyk6IERlZmluZSBhcyAwIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IFVzZSBNWV96bWFnaWNfY29udGlndW91cywgbm90IGhhcmRjb2RlZCAwLgotCSogaTM4NmxpbnV4LmMgKE1ZX3ptYWdpY19jb250aWd1b3VzKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIGEgU0hUX1NZTVRBQiBzZWN0aW9uIGluIGEKLQlzaGFyZWQgb2JqZWN0IGhhcyBTSEZfQUxMT0Mgc2V0LCBjcmVhdGUgYSBCRkQgc2VjdGlvbiBmb3IgaXQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBUaGVyZSBtYXkgYmUgYSBCRkQgc2VjdGlvbiBmb3IgYQotCVNIVF9TWU1UQUIgc2VjdGlvbi4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBBZGQgbmFtZSBhcmd1bWVudC4gIElmIG5vIGZsYWdzCi0JYXJlIHJlY29nbml6ZWQsIGNob3NlIHNlY3Rpb24gZmxhZ3MgYmFzZWQgb24gdGhlIG5hbWUuCi0JKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IF9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vayBmaWVsZDogQWRkCi0JbmFtZSBhcmd1bWVudC4KLQkoYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayk6IEFkZCBuYW1lIGFyZ3VtZW50LgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IGFkanVzdCB0aGUgc2VjdGlvbgotCXBvc2l0aW9uIGJ5IENPRkZfUEFHRV9TSVpFIHVubGVzcyBTRUNfQUxMT0MgaXMgc2V0LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBQYXNzIHNlY3Rpb24gbmFtZSB0bwotCWJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2suCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIHVudXNlZCBuYW1lCi0JYXJndW1lbnQuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIG5hbWUgYXJndW1lbnQgdG8KLQlwcm90b3R5cGUuCi0KLUZyaSBBdWcgMTIgMTE6MjI6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBDb3JyZWN0IGNoZWNrIGZvciBpbnZhbGlkCi0Jc2VjdGlvbiBpbmRleC4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiB0aGVyZSBpcyBubyBzeW1ib2wKLQl0YWJsZSwgdHJ5IHVzaW5nIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXNvbGFyaXMyKik6IFVzZSBzb2xhcmlzMiwgbm90IHN5c3Y0LgotCVRoZSBsaW5rZXIgZGVwZW5kcyB1cG9uIGNvbmZpZ3VyaW5nIGZvciBzb2xhcmlzMi4KLQkqIGhvc3RzL3NvbGFyaXMyLmg6IE5ldyBmaWxlOyBpbmNsdWRlIGhvc3RzL3N5c3Y0LmguCi0JKiBjb25maWcvc29sYXJpczIubWg6IE5ldyBmaWxlOyBjb3B5IG9mIGNvbmZpZy9zeXN2NC5taC4KLQotV2VkIEF1ZyAxMCAxMzowOTozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFkanVzdF96X21hZ2ljKTogTWFrZSBzdXJlIGRhdGEgc2VjdGlvbiBpcyBwYWRkZWQgdG8KLQlwYWdlIGJvdW5kYXJ5IHdoZW4gdGhlIFZNQSBpcyBzZXQgYnkgdGhlIGNhbGxpbmcgcHJvZ3JhbS4gIEZyb20KLQlFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0KLU1vbiBBdWcgIDggMTc6MTg6NDkgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JVXBkYXRlIHRvIG5zMzJrIHN1cHBvcnQsIGZyb20gSWFuIERhbGwgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkuCi0JKiBhb3V0LW5zMzJrLmM6IEFkZCBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIGluIGFvdXQtbnMzMmsuaCwgY2hhbmdlCi0JZGVjbGFyYXRpb25zIHRvIHRyYWRpdGlvbmFsIGZvcm0uCi0JKE1ZX3JlbG9jX2hvd3RvLCBNWV9wdXRfcmVsb2MpOiBDaGFuZ2UgZnJvbSBtYWNybyB0byBmdW5jdGlvbi4KLQkobnMzMmtfcmVsb2NhdGVfY29udGVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBhb3V0LW5zMzJrLmg6IFJlbW92ZS4KLQkqIGNwdS1uczMyay5jOiBBZGQgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBpbiBhb3V0LW5zMzJrLmgsIGNoYW5nZQotCWRlY2xhcmF0aW9ucyB0byB0cmFkaXRpb25hbCBmb3JtLgotCShuczMya19maW5hbF9saW5rX3JlbG9jYXRlKTogQ2FsbCBuczMya19yZWxvY2F0ZV9jb250ZW50cy4KLQkqIG5ldGJzZDUzMi5jOiBSZWZvcm1hdCB0byBzdGFuZGFyZHMsIGFkZCBjb3B5cmlnaHQgbm90aWNlLgotCShBUkNIKTogRG9uJ3QgZGVmaW5lLgotCShhb3V0LW5zMzJrLmgpOiBEb24ndCBpbmNsdWRlLgotCSogcGM1MzItbWFjaC5jOiBEaXR0by4KLQotTW9uIEF1ZyAgOCAxNzo1NTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBEb24ndCB0cnkgdG8gY29udmVydCByZWxvY3MKLQlhZ2FpbnN0IGNvbW1vbiBzeW1ib2xzLgotCi1TYXQgQXVnICA2IDIyOjI3OjMwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6ICBJZ25vcmUgc2VjdGlvbnMgdGhhdAotCWFyZSBub3QgY29udGFpbmVkIGluIHRoZSBjb3JlIGZpbGUuCi0KLVRodSBBdWcgIDQgMTE6MzI6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKiBjZi1tNjhrbHlueC5jIChfYmZkX202OGtjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IEZvcmNlIHRoZSB2bWEgb2Ygc2VjdGlvbnMgd2hpY2gKLQlkbyBub3QgaGF2ZSBTRUNfQUxMT0Mgc2V0IHRvIGJlIDAuICBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUKLQlyZWxvY3MgYWdhaW5zdCBkZWJ1Z2dpbmcgc2VjdGlvbnMuCi0KLVdlZCBBdWcgIDMgMTY6NDU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogUmV3cm90ZSB0byBjaGFuZ2UgcmVsb2NzCi0JYWdhaW5zdCBsb2NhbGx5IGRlZmluZWQgc3ltYm9scyBpbnRvIHJlbG9jcyBhZ2FpbnN0IHNlY3Rpb24KLQlzeW1ib2xzLCBmb3IgVnhXb3JrcyA1LjEuCi0KLVdlZCBBdWcgIDMgMTA6MzQ6MzcgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBPbmx5IGhhbmRsZQotCVNIQVJBQkxFX0NPTkZMSUNUUyBzcGVjaWFsbHkgaWYgQlNGX0NPTlNUUlVDVE9SIGlzIHNldC4gIFNldCBoYXNocAotCWZvciBhIEdPVCBvciBQTFQgc3ltYm9sLiAgU2V0IGp1bXAgZmllbGQgb2YgZml4dXAgZm9yIGEgUExUIHN5bWJvbC4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IENoZWNrIHNlY3Rpb24gb2YgcmVhbCBzeW1ib2wuICBXaGVuIGxvb2tpbmcKLQlmb3IgYSBidWlsdGluIGZpeHVwLCBjaGVjayBidWlsdGluIGFuZCBqdW1wIGZsYWdzLiAgQ3JlYXRlIG5vIG1vcmUKLQl0aGFuIG9uZSBmaXh1cCwgYW5kIGFsd2F5cyBjcmVhdGUgb25lIGlmIHRoZSByZWFsIHN5bWJvbCBpcyBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLiAgT25seSBzdHJpcCBhYnNvbHV0ZSBzeW1ib2xzLgotCi1XZWQgQXVnICAzIDA1OjA4OjI0IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgaW50ZXJuYWxfYS5tYWdpYyB0bwotCUxZTlhDT0ZGTUFHSUMgd2hlbmV2ZXIgNjhrLCBTUEFSQyBvciBpMzg2IEx5bnhPUwotCSh5ZXMsIHRoZXkgaGF2ZSB0aGUgc2FtZSBtYWdpYyBudW1iZXIhKQotCi1UdWUgQXVnICAyIDEwOjQzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4LmMgKEJNQUdJQyk6IERlZmluZSBhcyBIUFVYX0RPVF9PX01BR0lDLCB0byBtYWtlIHRlc3QKLQlpbiBhb3V0eC5oIHdvcmsgY29ycmVjdGx5LgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQpOiBVc2UgaXQgYXMgc3BlY2lhbF9mdW5jdGlvbi4KLQotCSogbGliYmZkLWluLmg6IE1vdmUgZGVjbGFyYXRpb25zIG9mIGJmZF9yZWFkLCBiZmRfd3JpdGUsIGJmZF9zZWVrLAotCWJmZF90ZWxsLCBiZmRfZmx1c2gsIGFuZCBiZmRfc3RhdCBmcm9tIGhlcmUuLi4KLQkqIGJmZC1pbi5oOiAuLi50byBoZXJlLCB0byBtYWtlIHRoZW0gdmlzaWJsZSB0byBwcm9ncmFtcyB3aGljaAotCWtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IHRoYW4gQkZEIGRvZXMuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1Nb24gQXVnICAxIDE3OjU1OjUzIDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCk6ICBDb252ZXJ0IHphbGxvYyB1c2FnZQotCXRvIGJmZF96YWxsb2MuCi0KLU1vbiBBdWcgIDEgMTI6MDQ6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGY2NC1zcGFyYy5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQlFTEYgbGlua2VyIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHR5cGUgb2YKLQlfRFlOQU1JQyB0byBTVFRfT0JKRUNULgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBBbHdheXMgY3JlYXRlIGhhc2ggdGFibGUKLQllbnRyeS4gIFNldCB0eXBlIHRvIFNUVF9PQkpFQ1QuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBzZXQgdHlwZSBvZiB3ZWFrIGRlZmluZWQgc3ltYm9sIHRvCi0JU1RCX1dFQUsgaWYgc3ltYm9sIHdhcyByZWZlcmVuY2VkLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENoZWNrIERZTkFNSUMgYXMgd2VsbCBhcyBFWEVDX1AuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHR5cGUgb2YKLQlfR0xPQkFMX09GRlNFVF9UQUJMRSB0byBTVFRfT0JKRUNULgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBJZ25vcmUgbG9jYWwgUExUMzIgcmVsb2NzLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogVHJlYXQgbG9jYWwgUExUMzIgcmVsb2NzIGFzIFBDMzIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENvcnJlY3Qgd2VhayBzeW1ib2wKLQloYW5kbGluZyBhZ2Fpbi4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUgcmVsb2NzCi0JaWYgdGhlcmUgYXJlbid0IGFueS4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotc29sYXJpczIqKTogVXNlIHN5c3Y0LCBub3Qgc29sYXJpczIuCi0JKiBob3N0cy9zb2xhcmlzMi5oOiBSZW1vdmUuCi0JKiBjb25maWcvc29sYXJpczIubWg6IFJlbW92ZS4KLQotU3VuIEp1bCAzMSAxNDoyNzowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jLCBlbGYzMi1ocHBhLmg6IFVwZGF0ZSBjb21tZW50IHJlZmxlY3Rpbmcgd2hpY2gKLQlIUFBBIEVMRiBzcGVjIHRoZSBjb2RlIGltcGxlbWVudHMuCi0KLVR1ZSBKdWwgMjYgMTc6Mzg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY3B1LWk5NjAuYyAoTUFYX0FSQ0gpOiBOZXcgbWFjcm8uCi0JKGNvbXBhdGlibGUpOiBVc2UgaXQgaW4gY29tcHV0aW5nIGFycmF5IGJvdW5kcy4gIFB1dCBjb21tYSBhZnRlcgotCWxhc3QgZW50cnkgaW4gYXJyYXksIGZvciByZWd1bGFyaXR5LgotCShhcmNoX2luZm9fc3RydWN0KTogQWRqdXN0IHNwYWNpbmcgZm9yIGVhc2llciByZWFkaW5nLgotCi0JKiBjb2ZmLWk5NjAuYyAoaG93dG9fcmVsbG9uZywgaG93dG9faXBybWVkLCBob3d0b19vcHRjYWxsKTogVXNlCi0JSE9XVE8gbWFjcm8uCi0KLQkqIGNwdS1pOTYwLmMgKEpYKTogRGVmaW5lIGFzIGJmZF9tYWNoX2k5NjBfanguCi0JKHNjYW5fOTYwX21hY2gpOiBSZWNvZ25pemUganggbWFjaGluZS4KLQkoTUFYX0FSQ0gpOiBEZWZpbmUgdG8gYmUgSlguCi0JKGNvbXBhdGlibGUpOiBBZGQgSlggcm93IHRvIGFycmF5LgotCShhcmNoX2luZm9fc3RydWN0KTogQWRkIEpYIGVudHJ5LgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9pOTYwX2p4KTogTmV3IG1hY3JvLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBGb3IgRl9JOTYwSlgsIHNldCBtYWNoaW5lCi0JdG8gYmZkX21hY2hfaTk2MF9qeC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBGb3IgYmZkX21hY2hfaTk2MF9qeCwgc2V0IEZfSTk2MEpYLgotCi1UdWUgSnVsIDI2IDExOjA0OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogV2hlbiBoYW5kbGluZyBhIHdlYWsKLQlzeW1ib2wsIGNvcnJlY3QgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGVxdWl2YWxlbnQgbm9ybWFsIHN5bWJvbAotCXdhcyByZWZlcmVuY2VkLgotCi0JQWRkIHN1cHBvcnQgZm9yIGNyZWF0aW5nIHNoYXJlZCBsaWJyYXJpZXMgdW5kZXIgaTM4NiBFTEYgYW5kIFNQQVJDCi0JRUxGLiAgQmFzZWQgb24gcGF0Y2hlcyBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgY29weV9vZmZzZXQgZmllbGQuCi0JQWRkIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQgZmllbGRzLgotCShFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDX01VTFRJUExFKTogRG9uJ3QgZGVmaW5lLgotCShFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDX01VTFRJUExFKTogRG9uJ3QgZGVmaW5lLgotCShFTEZfTElOS19IQVNIX05FRURTX0NPUFkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGNoZWNrX3JlbG9jcyBmaWVsZC4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQ2hhbmdlIHJlbG9jcyBmcm9tIFBUUiB0bwotCUVsZl9JbnRlcm5hbF9SZWxhICouCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxvY2FsX2dvdF9vZmZzZXRzIGZpZWxkLgotCShlbGZfbG9jYWxfZ290X29mZnNldHMpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCB1c2UgdGhlIHNlY3Rpb24gZGF0YQotCXJlbG9jcyBmaWVsZC4KLQkoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgVXNlCi0JbWFjcm8gdG8gcmVuYW1lIHRvIE5BTUUoYmZkX2VsZixsaW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCkuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHB1dAotCW1ha2UgYWxsIGxvY2FsIHN5bWJvbHMgZHluYW1pYy4gIERvbid0IGJvdGhlciB3aXRoIHRoZQotCURZTkFNSUNfTVVMVElQTEUgZmxhZ3MuICBDYWxsIHRoZSBjaGVja19yZWxvY3MgYmFja2VuZCBmdW5jdGlvbiBpZgotCWl0IGlzIGRlZmluZWQuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgVXNlCi0JbWFjcm8gdG8gcmVuYW1lIHRvIE5BTUUoYmZkX2VsZixsaW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKS4gIElmCi0JY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0RZTkFNSUMgaXMgYWRkZWQgYXMgYQotCWR5bmFtaWMgc3ltYm9sLgotCShlbGZfbGlua19yZWFkX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBhbHdheXMgY3JlYXRlIHN5bWJvbHMsIGFuZCBhbHdheXMgbWFrZSB0aGVtIGR5bmFtaWMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFBlcm1pdCBjcmVhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBVc2UgZWxmX2xpbmtfcmVhZF9yZWxvY3MgdG8gZ2V0IHRoZSByZWxvY3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplCi0JY29weV9vZmZzZXQuICBJbml0aWFsaXplIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lIGFzIDAgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBjaGVja19yZWxvY3MgZmllbGQuCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lIGFzIDAgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmNjRfYmVkKTogSW5pdGlhbGl6ZSBjaGVja19yZWxvY3MgZmllbGQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IENoYW5nZSBSXzM4Nl9QTFQzMiBhbmQKLQlSXzM4Nl9HT1RQQyB0byBiZSBwY19yZWxhdGl2ZSBhbmQgcGNyZWxfb2Zmc2V0LgotCShlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeSk6IERlZmluZS4KLQkoZWxmX2kzODZfcGljX3BsdF9lbnRyeSk6IERlZmluZS4KLQkoZWxmX2kzODZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgYSAuZ290LnBsdCBzZWN0aW9uLCBhbmQKLQlkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiBpdC4gIElmIGNyZWF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGFkZGVkIGFzIGEKLQlkeW5hbWljIHN5bWJvbC4gIERvbid0IGNyZWF0ZSAucmVsLmJzcyBpZiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnkuCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFrZSBhIFBMVCBlbnRyeSBpZiB0aGUKLQlzeW1ib2wgYWxyZWFkeSBoYXMgb25lLiAgV2hlbiBtYWtpbmcgYSBQTFQgZW50cnksIHNldCBwbHRfb2Zmc2V0LgotCURvbid0IGNyZWF0ZSBhIGNvcHkgcmVsb2Mgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgRG9uJ3QKLQlzZXQgY29weV9vZmZzZXQsIGp1c3Qgc2V0IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWS4KLQkoZWxmX2kzODZfYWxsb2NhdGVfZHluYW1pY19zZWN0aW9uKTogUmVtb3ZlLgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucwotCXJhdGhlciB0aGFuIGFzc3VtaW5nIHdlIGtub3cgdGhlaXIgbmFtZXMuICBSZW1vdmUgYW55IGVtcHR5IHJlbG9jCi0Jb3IgcGx0IHNlY3Rpb25zLiAgT25seSBhZGQgYSBEVF9ERUJVRyBlbnRyeSBpZiBub3QgY3JlYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LiAgT25seSBhZGQgYSBEVF9QTFRHT1QgZW50cnkgaWYgdGhlcmUgaXMgYSBQTFQuCi0JQWRkIGEgRFRfVEVYVFJFTCBlbnRyeSBpZiByZXF1aXJlZC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCB1bmRlZmluZWQgc3ltYm9scyB3aGVuCi0JY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIEhhbmRsZSB0aGUgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzCi0Jc3BlY2lhbGx5LgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgYSBQTFQgZW50cnkgaWYgcGx0X29mZnNldAotCWlzIHNldC4gIElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHByb2R1Y2UgYSBQSUMgUExUIGVudHJ5LgotCU9ubHkgbWFyayBhIFBMVCBzeW1ib2wgYXMgdW5kZWZpbmVkIGlmIGl0IHdhcyBub3QgZGVmaW5lZCBieSBhCi0JcmVndWxhciBvYmplY3QgZmlsZS4gIENyZWF0ZSBhIEdPVCBlbnRyeSBpZiBnb3Rfb2Zmc2V0IGlzIHNldC4KLQlDcmVhdGUgYSBjb3B5IHJlbG9jIGlmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSBpcyBzZXQuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQ2hhbmdlIHRoZSBoYW5kbGluZyBvZgotCURUX1JFTFNaIHRvIHNpbXBseSBzdWJ0cmFjdCBvdXQgdGhlIHNpemUgb2YgLnJlbC5wbHQuICBJZiBjcmVhdGluZwotCWEgc2hhcmVkIGxpYnJhcnksIHByb2R1Y2UgUElDIFBMVCBjb2RlLgotCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9TUEFSQ19HT1QxMCwKLQlSX1NQQVJDX0dPVDIyLCBhbmQgUl9TUEFSQ19QQzEwIHRvIG5vdCB3YXJuIGFib3V0IHJlbG9jIG92ZXJmbG93LgotCShlbGYzMl9zcGFyY19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGFkZGVkIGFzIGEKLSAgICAgICAgZHluYW1pYyBzeW1ib2wsIGFuZCBzZXQgdGhlIHR5cGUgdG8gU1RUX09CSkVDVC4gIExpa2V3aXNlIGZvcgotICAgICAgICBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfLiAgRG9uJ3QgY3JlYXRlIC5yZWwuYnNzIGlmIGNyZWF0aW5nIGEKLSAgICAgICAgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFrZSBhIFBMVCBlbnRyeSBpZiB0aGUKLQlzeW1ib2wgYWxyZWFkeSBoYXMgb25lLiAgV2hlbiBtYWtpbmcgYSBQTFQgZW50cnksIHNldCBwbHRfb2Zmc2V0LgotCURvbid0IGNyZWF0ZSBhIGNvcHkgcmVsb2Mgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgRG9uJ3QKLQlzZXQgY29weV9vZmZzZXQsIGp1c3Qgc2V0IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWS4KLQkoZWxmMzJfc3BhcmNfYWxsb2NhdGVfZHluYW1pY19zZWN0aW9uKTogUmVtb3ZlLgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucwotCXJhdGhlciB0aGFuIGFzc3VtaW5nIHdlIGtub3cgdGhlaXIgbmFtZXMuICBPbmx5IGFkZCBhIERUX0RFQlVHCi0JZW50cnkgaWYgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBBZGQgYSBEVF9URVhUUkVMIGVudHJ5IGlmCi0JcmVxdWlyZWQuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgdW5kZWZpbmVkIHN5bWJvbHMgd2hlbgotCWNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBIYW5kbGUgdGhlIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlcwotCXNwZWNpYWxseS4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGEgUExUIGVudHJ5IGlmIHBsdF9vZmZzZXQKLQlpcyBzZXQuICBPbmx5IG1hcmsgYSBQTFQgc3ltYm9sIGFzIHVuZGVmaW5lZCBpZiBpdCB3YXMgbm90IGRlZmluZWQKLQlieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuICBDcmVhdGUgYSBHT1QgZW50cnkgaWYgZ290X29mZnNldCBpcwotCXNldC4gIENyZWF0ZSBhIGNvcHkgcmVsb2MgaWYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIGlzIHNldC4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBTdG9yZSBkeW5vYmogaW4gYSBsb2NhbAotCXZhcmlhYmxlLgotCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCi0KLU1vbiBKdWwgMjUgMTI6MjE6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBjNTMybWFjaF92ZWMpOiBDaGFuZ2UgdG8gcGM1MzJtYWNoYW91dF92ZWMuCi0JKiBjb25maWcuYmZkIChuczMyay0qLW5ldGJzZCopOiBVc2UgbnMzMmstbmJzZCBhcyBiZmRfbmFtZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LW5zMzJrLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtbnMzMmsubywgbmV0YnNkNTMyLm8sIG04OGttYWNoMy5vLAotCXBjNTMyLW1hY2guby4KLQkqIHRhcmdldHMuYyAocGM1MzJtYWNoYW91dF92ZWMpOiBVc2UgaW5zdGVhZCBvZiBwYzUzMm1hY2hfdmVjLgotCSogY29uZmlnL3BjNTMyLW1hY2gubXQgKERFRkFVTFRfVkVDVE9SKTogRGl0dG8uCi0JKFNFTEVDVF9WRUNTKTogUmVtb3ZlLgotCSogY29uZmlnL25zMzJrLW5ic2QubXQ6IE5ldyBmaWxlLCB3YXMgbnMzMmstbmV0YnNkLm10LgotCSogY29uZmlnL25zMzJrLW5ldGJzZC5tdDogUmVtb3ZlLCBuYW1lIHRvbyBsb25nLgotCi1GcmkgSnVsIDIyIDExOjA3OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBXaGVuIGNoYW5naW5nIGEKLQlzeW1ib2wgdG8gY29tbW9uLCBzZXQgdGhlIGFsaWdubWVudC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBXaGVuIGNyZWF0aW5nIGEgY29tbW9uIHN5bWJvbCwKLQlzZXQgdGhlIGFsaWdubWVudC4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogV2hlbiBjaGFuZ2luZyBhIHN5bWJvbCB0bwotCWNvbW1vbiwgc2V0IHRoZSBhbGlnbm1lbnQuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFJlc3RyaWN0IHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sCi0JdG8gdGhlIGFsaWdubWVudCBwb3dlciBnaXZlbiBieSB0aGUgYXJjaGl0ZWN0dXJlLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogUmVtb3ZlIGFsaWduIGZpZWxkLiAgQWRkCi0JY29weV9vZmZzZXQgZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFN0b3JlIGFsaWdubWVudCBpbgotCW5ldyBiZmRfbGlua19oYXNoX2VudHJ5IGZpZWxkLCBub3QgaW4gZWxmX2xpbmtfaGFzaF9lbnRyeSBmaWVsZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNpbWlsYXIgY2hhbmdlIHdoZW4gZ2V0dGluZyBhbGlnbm1lbnQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplIGFsaWduLiAgRG8KLQlpbml0aWFsaXplIGNvcHlfb2Zmc2V0LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBVc2UgY29weV9vZmZzZXQKLQlmaWVsZCByYXRoZXIgdGhhbiBhbGlnbiBmaWVsZC4gIEdldCBhbGlnbm1lbnQgdXNpbmcgYmZkX2xvZzIKLQlyYXRoZXIgdGhhbiBzd2l0Y2guCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlIGNvcHlfb2Zmc2V0LAotCW5vdCBhbGlnbi4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEp1c3QgY2hlY2sKLQlTVEFUX0ZPUl9FWEVDLCBkb24ndCBjaGVjayBNQUNILgotCSogbTg4a21hY2gzLmMgKE1BQ0gpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvaTM4Ni1tYWNoMy5tdCAoVERFRklORVMpOiBEZWZpbmUgU1RBVF9GT1JfRVhFQy4KLQkqIGNvbmZpZy9tODhrLW1hY2gzLm10IChUREVGSU5FUyk6IExpa2V3aXNlLgotCSogY29uZmlnL21pcHMtbWFjaDMubXQgKFRERUZJTkVTKTogTGlrZXdpc2UuCi0KLVRodSBKdWwgMjEgMTc6MjQ6MzEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBpMzg2bWFjaDMuYzogUmV2ZXJ0ZWQgdG8gdmVyc2lvbiBmcm9tIGJlZm9yZSBKdWwgNSAxOTk0IGNoYW5nZXMuCi0KLVRodSBKdWwgMjEgMTI6MjY6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogUmVtb3ZlIHNwZWNpYWxfZnVuY3Rpb24xLgotCUl0J3MgdGhlIHdyb25nIHdheSB0byBkbyB0aGluZ3MuCi0JKEhPV1RPKTogQ2hhbmdlIGFjY29yZGluZ2x5LgotCShIT1dUTzIpOiBSZW1vdmUuCi0JKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCi0Jc3BlY2lhbF9mdW5jdGlvbjEuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bwotCXNwZWNpYWxfZnVuY3Rpb24xLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi1XZWQgSnVsIDIwIDE1OjQ2OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCBycGF0aAotCWFyZ3VtZW50LiAgSWYgaXQgaXMgbm90IE5VTEwsIHVzZSBpdCB0byBzZXQgRFRfUlBBVEguCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotU2F0IEp1bCAxNiAyMToxMDozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IElmIHRoZXJlIGlzIG5vCi0JZHluYW1pYyBzeW10YWIsIHJldHVybiBlcnJvci4KLQotCSogbGliZWxmLmggKEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLKTogRGVmaW5lLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBzeW1ib2wgaXMgZGVmaW5lZCBhcwotCXdlYWssIHNldCBFTEZfTElOS19IQVNIX0RFRklORURfV0VBSy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGFzIHdlYWssIG1hcmsgaXQKLQlTVEJfV0VBSy4KLQotCSogbGliZWxmLmggKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCByZWxvY3MgZmllbGQuCi0JKHNoZHJfbmFtZSk6IFJlbW92ZTsgdW51c2VkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZXdyb3RlIHRvIGhhbmRsZSBib3RoIFJFTAotCWFuZCBSRUxBIHJlbG9jcy4gIEZyZWUgdXAgdGhlIHVuc3dhcHBlZCByZWxvY3MuICBQZXJtaXQgdGhlIHJlbG9jcwotCXRvIGJlIGNhY2hlZCBpbiB0aGUgc2VjdGlvbl9kYXRhLiAgQ29ycmVjdCB0aGUgcmVsb2MgYWRkcmVzcy4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IFJlbW92ZS4KLQkoZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IFJld3JvdGUuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFBlcm1pdCB0aGUgcmVsb2NzIHRvIGJlIGNhY2hlZCBpbiB0aGUKLQlzZWN0aW9uIGRhdGEuCi0KLVNhdCBKdWwgMTYgMTM6NTU6MzggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtODgqLWhhcnJpcy1jeHV4Kik6IFJlY29nbml6ZS4KLQkqIGhvc3RzL2hhcnJpcy5oIChQT1NJWF9VVElNRSwgSEFWRV9QUk9DRlMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLWF0YXJpLXN5c3Y0Kik6IE5ldyBob3N0LgotCShtNjgqLWNibS1zeXN2NCopOiBVc2UgbTY4a3Y0IGluc3RlYWQgb2YgYW1peC4KLQkqIGhvc3RzL2FtaXguaDogUmVtb3ZlLgotCSogaG9zdHMvbTY4a3Y0Lmg6IE5ldyBmaWxlLCB3YXMgYW1peC5oLgotCi1UaHUgSnVsIDE0IDE1OjEyOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCwgYmZkX3R5cGUsIHN0cnVjdAotCXJlbG9jX2hvd3RvX3N0cnVjdCwgcmVsb2NfaG93dG9fdHlwZSwgSE9XVE8sIEhPV1RPMik6IENvcGllZAotCWNoYW5nZXMgb3ZlciBmcm9tIGJmZC1pbjIuaCBzbyB0aGV5IGdldCBnZW5lcmF0ZWQgcHJvcGVybHkgbmV4dAotCXRpbWUgc29tZW9uZSBydW5zICJtYWtlIGhlYWRlcnMiLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiB0YXJnZXRzLmMgKG5ldGJzZDUzMl92ZWMsIHBjNTMybWFjaF92ZWMpOiBEZWNsYXJlIGNvbnN0LgotCShtODhrbWFjaDNfdmVjKTogUmVzdG9yZSBkZWxldGVkIGRlY2xhcmF0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IEFscGhhYmV0aXplIHRhcmdldCB2ZWN0b3IgbmFtZXMuCi0KLQkqIGNvbmZpZy9wYzUzMm1hY2gubWg6IE5ldyBmaWxlLgotCShIREVQRklMRVMsIEhERUZJTkVTKTogRGVmaW5lIGhlcmUuCi0JKiBjb25maWcvcGM1MzItbWFjaC5tdCAoSERFUEZJTEVTLCBIREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbnMzMmstbmV0YnNkLm10IChIREVQRklMRVMsIEhERUZJTkVTKTogRGVsZXRlZC4KLQotCVN1biBKdWwgMTAgMDA6MDQ6MjAgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIHBjNTMyLW1hY2guYzogTmV3IEZpbGUuIHBjNTMyLW1hY2ggYS5vdXQgZm9ybWF0LgotCi0JKiBuZXRic2Q1MzIuYzogTmV3IGZpbGUuIHBjNTMyLW5ldGJzZDUzMiBhLm91dCBmb3JtYXQuCi0KLQkqIGhvc3RzL3BjNTMybWFjaC5oOiBOZXcgZmlsZS4gcGM1MzItbWFjaCBob3N0IHN1cHBvcnQuCi0KLQkqIGNwdS1uczMyay5jOiBOZXcgZmlsZS4gbnMzMmsgc3VwcG9ydCBjcHUgc3BlY2lmaWMgY29kZSByYXRoZXIKLQl0aGFuIGZvcm1hdCBzcGVjaWZpYyBjb2RlLgotCi0JKiBjb25maWcvcGM1MzItbWFjaC5tdDogTmV3IGZpbGUuIFN1cHBvcnQgZm9yIHBjNTMyLW1hY2ggdGFyZ2V0LgotCi0JKiBjb25maWcvbnMzMmstbmV0YnNkLm10OiBOZXcgZmlsZS4gU3VwcG9ydCBmb3IgbmV0YnNkNTMyIHRhcmdldC4KLQotCSogYW91dC1uczMyay5jLCBhb3V0LW5zMzJrLmg6IE5ldyBmaWxlcyBzdXBwb3J0aW5nIGFvdXQgZm9ybWF0IGZvcgotCW5zMzJrIHNlcmllcy4gCi0KLQkqIHRhcmdldHMuYzogQWRkIG5ldGJzZDUzMl92ZWMgYW5kIHBjNTMybWFjaGFvdXRfdmVjIGludG8KLQliZmRfdGFyZ2V0X3ZlY3RvciBhcnJheS4gTW92ZSBuZXRic2QzODZfdmVjIHRvIGFscGhhYmV0aWMgb3JkZXIKLQlsb2NhdGlvbi4KLQotCSogcmVsb2MuYyAoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKSBBZGQgc3VwcG9ydCBmb3IKLQlzcGVjaWFsX2Z1bmN0aW9uMSBpbiBob3d0by4KLQotCSogbGliYW91dC5oOiBhZGQgTV9OUzMyMDMyLCBNX05TMzI1MzIsIE1fNTMyX05FVEJTRCBlbnRyaWVzIGluCi0JbWFjaGluZV90eXBlIGVudW0uCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHBjNTMybWFjaF92ZWMgYW5kIG5ldGJzZDUzMl92ZWMgZW50cmllcy4KLQotCSogY29uZmlnLmJmZDogYWRkIHBjNTMybWFjaCBob3N0IGVudHJpZXMuIFVzZSBmb3IgYm90aAotCW5zMzJrLXBjNTMyLW1hY2ggYW5kIG5zMzJrLXBjNTMyLW5ldGJzZC4KLQotCSogY29uZmlnLmJmZDogaXQgZG9lc24ndCB3b3JrIHRvIHVzZSBpMzg2LW1hY2gzIGZvciBuczMyayotKi1tYWNoLgotCWFkZCBuczMyay1wYzUzMi1tYWNoKiBhbmQgbnMzMmstKi1uZXRic2QqIGVudHJpZXMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIG5zMzJrIHNwZWNpZmljIHJlbG9jYXRpb25zIHRvIGJmZF9yZWxvY19jb2RlX3JlYWwKLQllbnVtLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBzcGVjaWFsX2Z1bmN0aW9uMSB0byBzdHJ1Y3QgaG93dG8uIENoYW5nZSBIT1dUTwotCWFuZCBORVdIT1dUTyBtYWNyb3MgdG8gbWFrZSBzcGVjaWFsX2Z1bmN0aW9uMSBOVUxMLiBOZXd3IEhPV1RPMgotCW1hY3JvLgotCi0JKiBiZmQtaW4yLmg6IFNwbGl0IGRlZmluaXRpb24gb2Ygc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAotCWFuZCBjb3JyZXNwb25kaW5nIHR5cGVkZWYgaW50byB0d28gc3RhdGVtZW50cy4KLQotCSogYmZkLWluMi5oOiBBZGQgZW50cnkgYmZkX2FyY2hfbnMzMmsgdG8gYmZkX2FyY2hpdGVjdHVyZSBlbnVtLgotCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX25zMzJrX2FyY2ggcHJvdG90eXBlLCBhbmQgZW50cnkgaW4KLQlhcmNodXJlc19pbml0X3RhYmxlLiAKLQotCSogYW91dHguaCAoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBBbGxvdyBmb3IgdGFyZ2V0IGRlcGVuZGVudAotCU1ZX3B1dF9yZWxvYyBtYWNyby4gQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQgc3BlY2lhbF9mdW5jdGlvbjEKLQl0byBhcHBseSB0aGUgcmVsb2NhdGlvbi4gCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IEFsbG93IGZvciB0YXJnZXQKLQlkZXBlbmRlbnQgZGV0ZXJtaW5hdGlvbiBvZiByZWxvYyBob3d0by4gQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQKLQlzcGVjaWFsX2Z1bmN0aW9uMSB0byBhcHBseSB0aGUgcmVsb2NhdGlvbi4KLQotCSogYW91dHguaCAoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGV0ZWN0IGJzcyBhbmQgcmV0dXJuIDAuCi0KLQkqIGFvdXR4LmggKHNsdXJwX3JlbG9jX3RhYmxlKTogRGV0ZWN0IGJzcyBhbmQgc3VjY2VzZnVsbHkgcmVhZAotCXplcm8gcmVsb2MgZW50cmllcy4KLQotCSogYW91dHguaCAobWFjaGluZV90eXBlKTogQWRkIGJmZF9hcmNoX25zMzJrIGNhc2UuCi0KLQkqIGFvdXR4Lmg6IFN0YXQgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFibGUgc3RhdHVzIGlmIFNUQVRfRk9SX0VYRUMKLQlpcyBkZWZpbmVkIChub3QganVzdCBNQUNIKS4gVXNlIGZzdGF0IGluc3RlYWQgb2Ygc3RhdCBhbmQgY2hlY2sKLQlmb3IgZnN0YXQgZXJyb3IuCi0KLQkqIGFvdXR4Lmg6IEFsbG93IHRhcmdldCBkZXBlbmRlbnQgc3dhcF9zdGRfcmVsb2Nfe2luLG91dH0uCi0KLQkqIGFvdXR4Lmg6IEFsbG93IENUT1JTIHJlbG9jIGluZm8gdG8gYmUgaW4gdGFyZ2V0IGRlcGVuZGVudCByZWxvYwotCXRhYmxlLgotCi0JKiBhb3V0LXRhcmdldC5oOiBBcHBseSBTV0FQX01BR0lDIChpZiBkZWZpbmVkKSBhZnRlcgotCXN3YXBfZXhlY19oZWFkZXJfaW4sIG90aGVyd2lzZSB3ZSBoYXZlIG1hZ2ljIGluIHRoZSB3cm9uZyBvcmRlci4KLQotVGh1IEp1bCAxNCAxMTo0NzoyNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IEhhdmUgbGVhZGluZyB1bmRlcnNjb3Jlcy4KLQotVHVlIEp1bCAxMiAxMjowODoxMCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXRmMS5oLCBjaXNjby1jb3JlLmMsIGVsZmNvZGUuaCwgaHBwYWJzZC1jb3JlLmMsCi0JaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLCBseW54LWNvcmUuYywgb3NmLWNvcmUuYywgcHRyYWNlLWNvcmUuYywKLQlyczYwMDAtY29yZS5jLCB0cmFkLWNvcmUuYzogIFJlbW92ZSBTRUNfQUxMT0MgZmxhZyBmcm9tIC5yZWcKLQlzZWN0aW9ucywgLnJlZyBzZWN0aW9ucyBhcmUgbm90IGFsbG9jYXRlZCBhbmQgY29udGFpbiBkZWJ1ZwotCWluZm9ybWF0aW9uIG9ubHkuCi0JKiBvc2YtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbiwgb3NmX2NvcmVfY29yZV9maWxlX3ApOiAgVXNlCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgaW5zdGVhZCBvZiBidWlsZGluZyB1bmlxdWUgc2VjdGlvbiBuYW1lcy4KLQotVHVlIEp1bCAxMiAxMTo0MToyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4pOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luLCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogRGVjbGFyZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGVfaW5pdCk6IENvcnJlY3QgY2FzdC4KLQotCSogYW91dC1lbmNhcC5jIChBUkNIKTogRG9uJ3QgZGVmaW5lLiAgT2Jzb2xldGUuCi0JKiBhb3V0MC5jLCBhb3V0eC5oLCBnZW4tYW91dC5jLCBocDMwMGJzZC5jLCBocDMwMGhwdXguYzogTGlrZXdpc2UuCi0JKiBpMzg2YW91dC5jLCBpMzg2YnNkLmMsIGkzODZkeW5peC5jLCBpMzg2bGludXguYzogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jLCBtNjhrbHlueC5jLCBtaXBzYnNkLmMsIG5ldGJzZDM4Ni5jOiBMaWtld2lzZS4KLQkqIG5ld3NvczMuYywgc3BhcmNseW54LmMsIHN1bm9zLmM6IExpa2V3aXNlLgotCi1Nb24gSnVsIDExIDIwOjA4OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6IE1ha2UgdGhlIHNpeHRoIGFyZ3VtZW50IGJvb2xlYW4sIG5vdAotCXRoZSBzZXZlbnRoLiAgRnJvbSBnYXJ5QHR1dmEucGFjc2VtaS5vei5hdSAoZ2FyeSBrb3BmZikuCi0KLVN1biBKdWwgMTAgMDk6MTI6MDIgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChiZmRfZnJlZV9jYWNoZWRfaW5mbyk6IENoYW5nZSBuYW1lIG9mIEZSRUUgdG8gQkZDSV9GUkVFCi0JaW4gb3JkZXIgbm90IHRvIGNvbGxpZGUgd2l0aCBMeW54T1MncyBkZWZpbml0aW9uIG9mIEZSRUUgaW4KLQkvdXNyL2luY2x1ZGUvc3lzL3Byb2MuaAotCi1UaHUgSnVsICA3IDE0OjE4OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IGNsb2JiZXIgdGhlIHJlbG9jYXRpb24KLQl2YWx1ZSBmb3IgY29mZi1JbnRlbC1saXR0bGUgb3IgY29mZi1JbnRlbC1iaWcuICBIYWNrIHVwb24gaGFjay4KLQotVGh1IEp1bCAgNyAxMDoxMDozNCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6ICBBZGQgZW50cnkgZm9yIEdPVCByZWxvY2F0aW9ucwotCXdoaWNoIGFyZSBwcmVzZW50IGluIHN1bjMgc2hhcmVkIGxpYnJhcmllcywgdG8gYXZvaWQgYXNzZXJ0aW9ucwotCXdoZW4gcmVhZGluZyB0aGUgZHluYW1pYyByZWxvY2F0aW9ucy4KLQotVGh1IEp1bCAgNyAxMDoxOToyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKFJfSFBQQV9DT01QTEVYKTogRml4IGR1bWIgdHlwby4gCi0KLVdlZCBKdWwgIDYgMTk6MjE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zeXN2NC5oIChxc29ydCwgc3RydG9sKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19vdXRwdXRfc3ltKTogRG9uJ3QgY2FsbCBvdXRwdXRfc3ltYm9sX2hvb2sKLQlpZiBpdCBpcyBOVUxMLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBBZGQgaWdub3JlZCBpbmZvCi0JYXJndW1lbnQgdG8gY29ycmVzcG9uZCB0byByZWNlbnQgbGliZWxmLmggY2hhbmdlLgotCi1XZWQgSnVsICA2IDAwOjQ4OjU3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9ta29iamVjdF9ob29rKTogIE5ldyBob29rIHRvCi0JYWRkaXRpb25hbGx5IGNvcHkgb2JqZWN0IHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWxwaGEgZmlsZQotCWhlYWRlciB0byB0aGUgQkZEIGZsYWdzLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiAgVXNlIGl0LgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiAgQWRkIERZTkFNSUMgdG8gb2JqZWN0X2ZsYWdzLgotCSogYW91dDY0LmM6ICBGaXggdHlwbyBpbiBjb25kaXRpb25hbCBRTUFHSUMgZGVmaW5pdGlvbi4KLQotV2VkIEp1bCAgNiAwMDoxMzoxNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCk6IFNhbml0eSBjaGVjayB0aGUKLQl2YWx1ZSBvZiBjbGlja3N6IHRvIGhlbHAgd2VlZCBvdXQgbm9uIEhQUEEgQlNEIGNvcmUgZmlsZXMuCi0KLVR1ZSBKdWwgIDUgMTM6MjY6MDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JTWFjaCAzIHN1cHBvcnQuCi0JKiBjb25maWcuYmZkIChtODgqLSotbWFjaDMqLCBtaXBzKi1kZWMtbWFjaDMqLCBtaXBzKi0qLW1hY2gzKik6Ci0JTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNF04Ni0qLW1hY2gzKiwgbnMzMmstKi1tYWNoMyopOiBSZWNvZ25pemUKLQkibWFjaDMiIGluc3RlYWQgb2YgIm1hY2giLgotCShtODgqLSotbWFjaDMqLCBtaXBzKi1kZWMtbWFjaDMqLCBtaXBzKi0qLW1hY2gzKik6IE5ldyBob3N0cy4KLQkqIHRhcmdldHMuYyAobTg4a21hY2gzX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpMzg2bWFjaDNfdmVjIGFuZCBtODhrbWFjaDNfdmVjLCBidXQKLQlpbnNpZGUgI2lmIDAuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApIFtNQUNIXTogUmVjb2duaXplIGV4ZWN1dGFibGVzIGJ5Ci0JY2hlY2tpbmcgZm9yIGV4ZWN1dGUgcGVybWlzc2lvbiwgaW5zdGVhZCBvZiBsb29raW5nIGF0IGVudHJ5Ci0JcG9pbnQuCi0JKiBpMzg2bWFjaDMuYzogVXBkYXRlLCBkZWZpbmUgTUFDSCwgTl9UWFRPRkYsIE5fVFhUQUREUiwKLQlOX1NIQVJFRF9MSUIsIGRvbid0IGluY2x1ZGUgYW91dC8qLmggZmlsZXMsIGV0Yy4KLQkqIG04OGttYWNoMy5jOiBOZXcgZmlsZSwgbTg4ayBNYWNoIDMgdGFyZ2V0LgotCSogY29uZmlnL204OGstbWFjaDMubXQsCWNvbmZpZy9taXBzLW1hY2gzLm10OiBOZXcgZmlsZXMsIHRhcmdldAotCW1ha2VmaWxlIGZyYWdtZW50cy4KLQkqIGNvbmZpZy9pMzg2bWFjaDMubWgsIGNvbmZpZy9tODhrbWFjaDMubWgsIGNvbmZpZy9taXBzbWFjaDMubWg6Ci0JTmV3IGZpbGVzLCBob3N0CW1ha2VmaWxlIGZyYWdtZW50cy4KLQkqIGhvc3RzL204OGttYWNoMy5oLCBob3N0cy9taXBzbWFjaDMuaDogTmV3IGZpbGVzLCBob3N0IGRlZmluaXRpb25zLgotCi1UdWUgSnVsICA1IDEzOjU2OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogR2V0IGFsaWdubWVudCBvZiBjb21tb24gc3ltYm9sIGZyb20KLQlzdF92YWx1ZSBmaWVsZCBvZiBzYXZlZCBFTEYgc3ltYm9sIGluZm9ybWF0aW9uLCBpZiB0aGVyZSBpcyBhbnkuCi0KLU1vbiBKdWwgIDQgMTk6MTM6MzIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChSX0hQUEFfQ09NUExFWCk6IERlZmluZS4KLQkqIGVsZjMyLWhwcGEuaCAoUl9IUFBBX0NPTVBMRVgpOiBEZWZpbmUuCi0JKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IERlbGV0ZSBSX1BBUklTQ19TVFVCX0NBTExfMTcuCi0KLUZyaSBKdWwgIDEgMTI6MDc6NDEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIFN1cHBvcnQgY29kZSBmb3IgZW5hYmxpbmcgdGhlIG5ldyBzdHlsZSBsaW5rZXIgZm9yIFBBIEVMRi4KLQkqIGVsZmNvZGUuaCAoc3dhcF9zeW1ib2xfaW4sIHN3YXBfc3ltYm9sX291dCk6IEV4dGVybmFsaXplLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUGFzcyBsaW5rX2luZm8gdG8KLQl0aGUgYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyBob29rLgotCShiZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFBhc3MgTlVMTCBmb3IgbmV3IGxpbmtfaW5mbwotCWFyZ3VtZW50IHRvIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vay4KLQkoZWxmX2xpbmtfb3V0cHV0X3N5bSk6IEFjY2VwdCBuZXcgImlucHV0X3NlY3Rpb24iIGFyZ3VtZW50IGZvcgotCXRoZSBzeW1ib2xzJ3MgaW5wdXQgc2VjdGlvbi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuICBDYWxsIHRoZQotCWxpbmtfb3V0cHV0X3N5bWJvbF9ob29rIGlmIGl0J3MgZGVmaW5lZC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2FsbCB0aGUgZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rIGlmCi0JaXQncyBkZWZpbmVkLgotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogRGVjbGFyZS4KLQkoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IEFkZCBuZXcgImluZm8iIGFyZ3VtZW50LgotCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBQcm92aWRlCi0JYSBkZWZhdWx0IGRlZmluaXRpb24uCi0JKGVsZjMyX2JlZCk6IEFkZCBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vay4KLQkqIGVsZjY0LXRhcmdldC5oOiBMaWtld2lzZS4KLQkKLQkqIE1ham9yIHJld29yayBvZiB0aGUgUEEgRUxGIGNvZGUuICBVc2VzIHRoZSBuZXcgc3R5bGUgQkZECi0JbGlua2VyLCBtYWpvciBjbGVhbnVwcy4KLQkqIGhwcGFfc3R1YnMuaDogUmV3cml0ZSBmcm9tIHNjcmF0Y2guICBNdWNoIHNtYWxsZXIgYW5kIHNpbXBsZXIuCi0JKiBlbGYzMi1ocHBhLmg6IERlbGV0ZSBhbGwgc3ltYm9sIGV4dGVuc2lvbiByZWxhdGVkIGNvZGUuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZSBkZWNsLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMsIGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMpOiBOZXcgZGVjbHMuCi0JKiBlbGYzMi1ocHBhLmM6IFN5bWJvbCBleHRlbnNpb24gc3R1ZmYgbW92ZWQgZm9ybSBlbGYzMi1ocHBhLmgKLQlpbnRvIGVsZjMyLWhwcGEuYy4gIERvIG5vdCBpbmNsdWRlIGFvdXQ2NC5oLgotCSh0eXBkZWYgaHBwYV9zdHViX3R5cGUpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfc3R1Yl9uYW1lX2xpc3Rfc3RydWN0KTogRGVsZXRlLgotCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb25fc3RydWN0KTogRGVsZXRlLgotCShhcmdfcmVsb2NfdHlwZSk6IFVzZSBzaW1wbGVyIGVudW1lcmF0aW9ucy4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKGFyZ19sb2NhdGlvbiwgYXJnX3JlbG9jX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9zeW1leHRuX21hcF9zdHJ1Y3QpOiBEZWxldGUuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfZ2V0X3N5bV9leHRuKTogRGVsZXRlLgotCShmaW5kX3N0dWJzLCBuZXdfc3R1YnMsIHR5cGVfb2ZfbWlzbWF0Y2gpOiBEZWxldGUuCi0JKGZpbmRfc3R1Yl9ieV9uYW1lLCBhZGRfc3R1Yl9ieV9uYW1lKTogRGVsZXRlLgotCShocHBhX2VsZl9zdHViX2ZpbmlzaCwgaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IERlbGV0ZS4KLQkoaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZCk6IFJlbmFtZWQuICBTaW1wbGlmeS4KLQkoaHBwYV9lbGZfYnVpbGRfbGlua2VyX3N0dWIsIGhwcGFfZWxmX2NyZWF0ZV9zdHViX3NlYyk6IERlbGV0ZS4KLQkoaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOiBEZWxldGUuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZS4KLQkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlbGV0ZS4KLQkoTkVXX0lOU1RSVUNUSU9OKTogRGVsZXRlLgotCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfc2l6ZV9zeW1leHQpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3NpemVfb2Zfc3R1Yik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9idWlsZF9vbmVfc3ViKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKGxpbmtlciwgc3R1YiBhbmQgYXJndW1lbnQgaGFzaCB0YWJsZXMpOiBBZGQgYXBwcm9wcmlhdGUKLQlzdHJ1Y3R1cmVzLCBkZWZpbml0aW9ucyBhbmQgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBhbGwgdGhyZWUKLQloYXNoIHRhYmxlcy4KLQkoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IERvbid0IG5lZWQgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24KLQlpbiB0aGlzIGZ1bmN0aW9uLgotCShhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluKTogQWNjZXB0IGEgc3ltYm9sJ3MgYXJndW1lbnQgbG9jYXRpb24KLQlpbmZvcm1hdGlvbiByYXRoZXIgdGhhbiB0aGUgc3ltYm9sIGl0c2VsZi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogU2ltcGxpZnkuCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3R1YiBzZWN0aW9uIGlzIG5vIGxvbmdlciBzcGVjaWFsLgotCShocHBhX2VsZl9yZWxvYyk6IEdyZWF0bHkgc2ltcGxpZnkuCi0JKGVsZjMyX2hwcGFfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IEFjY2VwdCBsaW5rX2luZm8gYXJndW1lbnQuCi0JSGFuZGxlIGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBCRkQgYmFja2VuZCBsaW5rZXIuCi0JKGVsZjMyX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTm8gbG9uZ2VyIGNhbGwgc3R1Yl9maW5pc2guCi0JCi1Nb24gSnVuIDI3IDE4OjA3OjA2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFB1dCBpbiBwYXJlbnMgdG8gZ2V0Ci0JcHJlY2VkZW5jZSByaWdodC4KLQotU3VuIEp1biAyNiAxODowODoyOSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliZWxmLmggKHJlbG9jYXRlX3NlY3Rpb24pOiBOZXcgYXJndW1lbnQgIm91dHB1dF9uYW1lcyIgYWRkZWQKLQl0byBwcm90b3R5cGUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IE5ldyBhcmd1bWVudCAib3V0cHV0X25hbWVzIgotCWFkZGVkIHRvIHByb3RvdHlwZSBvZiByZWxvY2F0ZV9zZWN0aW9uLiAgUGFzcyB0aGUgb3V0cHV0IHN5bWJvbAotCW5hbWVzIHRvIHJlbG9jYXRlX3NlY3Rpb24uCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgIm91dHB1dF9uYW1lcyIgdG8KLQlkZXRlcm1pbmUgdGhlIG5hbWUgb2YgYSBsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotRnJpIEp1biAyNCAwODoxNTo0MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQlBZGQgU29sYXJpcyBCQ1AgKHRoZSBwYXJ0IG9mIFNvbGFyaXMgd2hpY2ggYWxsb3dzIGl0IHRvIHJ1bgotCVN1bk9TNCBhLm91dCBmaWxlcykgY29yZSBmaWxlIGhhbmRsaW5nLgotCSogYW91dGYxLmggKGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUsIHN3YXBjb3JlX3NvbGFyaXNfYmNwKToKLQlOZXcgc3RydWN0dXJlIGFuZCBpdHMgc3dhcCBpbiBmdW5jdGlvbi4KLQkoaW50ZXJuYWxfc3Vub3NfY29yZSk6ICBOZXcgbWVtYmVyIGNfZGF0YV9hZGRyLCB0byByZWNlaXZlIHRoZQotCXN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VjdGlvbiBpbiB0aGUgY29yZSBmaWxlLgotCShzd2FwY29yZV9zdW4zLCBzd2FwY29yZV9zcGFyYywgc3Vub3M0X2NvcmVfZmlsZV9wKTogIFVzZSBpdC4KLQkoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFJlY29nbml6ZSBTb2xhcmlzIEJDUCBjb3JlIGZpbGUuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgQWx3YXlzIGluZGljYXRlIG1hdGNoCi0JZm9yIFNvbGFyaXMgQkNQIGNvcmUgZmlsZXMuCi0KLVRodSBKdW4gMjMgMTU6MzE6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBzaGFyZWQgbGlicmFyaWVzLCBmcm9tIEVyaWMKLQlZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBJZiBEWU5BTUlDLCBzZXQgZV90eXBlIHRvIEVUX0RZTi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LAotCWNyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIGZvciBmaXJzdCBpbnB1dCBCRkQgd2l0aCB0aGUgcmlnaHQgZm9ybWF0LgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyZWF0ZSAuaW50ZXJwIHNlY3Rpb24KLQlpZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBTa2lwIGR5bmFtaWMgc2VjdGlvbnMgaW4gaW5wdXQgZmlsZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgaXQncyBPSyBmb3IKLQlkeW5vYmogdG8gaGF2ZSBzZWN0aW9ucyB3aGljaCBhcmUgbm90IFNFQ19JTl9NRU1PUlkuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc2V0IC5pbnRlcnAKLQlzZWN0aW9uIGlmIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IERvbid0IHNldCBEWU5BTUlDIGp1c3QgYmVjYXVzZSB0aGVyZQotCWlzIGFuIFNIVF9EWU5BTUlDIHNlY3Rpb24uCi0KLQkqIGNmLWkzODZseW54LmMgKGkzODZjb2ZmX3ZlYyk6IERvbid0IGluY2x1ZGUgRFlOQU1JQyBpbgotCW9iamVjdF9mbGFncy4KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IExpa2V3aXNlLgotCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV92ZWMpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBEb24ndCBzZXQgU0VDX1JFTE9DCi0JanVzdCBiZWNhdXNlIERZTkFNSUMgaXMgc2V0LgotCi1UaHUgSnVuIDIzIDEyOjUzOjQxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cyBhbmQKLQktLXdpdGgtNjQtYml0LWJmZCB0byAtLWVuYWJsZS02NC1iaXQtYmZkLgotCSogTWFrZWZpbGUuaW4sIG1wdy1tYWtlLmluLCB0YXJnZXRzLmM6IENoYW5nZSBjb21tZW50cy4KLQotV2VkIEp1biAyMiAxNzo1OTo1OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotZWxmKik6IE5ldyB0YXJnZXQsIGp1c3QgbGlrZQotCXBvd2VycGMtKi1zeXN2NCouCi0KLQkqIGxpbmtlci5jIChGQUlMKTogVW5kZWZpbmUgbWFjcm8gYmVmb3JlIGRlZmluaW5nIGFzIGVudW0uCi0KLVdlZCBKdW4gMjIgMTA6NTI6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEluaXRpYWxpemUKLQlwYXNzIGZyb20gYWJmZC0+YXJjaGl2ZV9wYXNzLCBhbmQgc2F2ZSBpdCB0aGVyZSBhcyB3ZWxsLgotCi0JKiBoYXNoLmMgKGJmZF9oYXNoX2FsbG9jYXRlKTogRG9uJ3QgY2FsbCBiZmRfc2V0X2Vycm9yIGlmCi0Jb2JzdGFja19hbGxvYyByZXR1cm5zIE5VTEwgdW5sZXNzIHRoZSBzaXplIGlzIG5vbi16ZXJvLgotCi0JKiBsaW5rZXIuYyAoYXJjaGl2ZV9oYXNoX2FsbG9jYXRlKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogVXNlIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZQotCXJhdGhlciB0aGFuIG9ic3RhY2tfYWxsb2MsIGZvciBjbGFyaXR5LgotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBDb3JyZWN0LgotCi0JKiBhb3V0NjQuYyAoQk1BR0lDLCBRTUFHSUMpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIEZyb20KLQlQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uCi0KLQlMaW51eCBaTUFHSUMgc3VwcG9ydCBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGZpZWxkIHptYWdpY19kaXNrX2Jsb2NrX3NpemUuCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBPbmx5IHNldCBhbGlnbm1lbnQgYWNjb3JkaW5nIHRvCi0JYXJjaGl0ZWN0dXJlIGlmIHRoZSBzZWN0aW9uIHNpemVzIGFyZSBhbGlnbmVkIHRvIHRoYXQgYWxpZ25tZW50LAotCWZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCShNWShzZXRfc2l6ZXMpKTogSW5pdGlhbGl6ZSB6bWFnaWNfZGlza19ibG9ja19zaXplIGZpZWxkLgotCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBTZXQgenRpaCBpZiB1c2luZyBxX21hZ2ljX2Zvcm1hdC4gIFNldAotCXRleHQgc2VjdGlvbiBmaWxlcG9zIHRvIHptYWdpY19kaXNrX2Jsb2NrX3NpemUgaWYgbm90IHp0aWguICBVc2UgYQotCWRpZmZlcmVudCBwYWRkaW5nIGFsZ29yaXRobSBpZiBub3QgenRpaC4KLQkqIGkzODZsaW51eC5jIChNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERvbid0IGRlZmluZS4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBKdXN0IHNraXAgTl9TVEFCIGFuZCBOX0ZOCi0gICAgICAgIHN5bWJvbHM7IGRvbid0IGxvb2sgdGhlbSB1cCBpbiB0aGUgaGFzaCB0YWJsZS4gIEZyb20KLSAgICAgICAgcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaCBDYW1wYmVsbCkuCi0KLVR1ZSBKdW4gMjEgMTE6NDc6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWdvMzIuYyAoZ28zMmNvZmZfYXJjaGl2ZV9wKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQotCSogc2VjdGlvbi5jIChiZmRfYWJzX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfYWJzX3NlY3Rpb25fcHRyLCBiZmRfaXNfYWJzX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF91bmRfc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF91bmRfc2VjdGlvbl9wdHIsIGJmZF9pc191bmRfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2NvbV9zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX2NvbV9zZWN0aW9uX3B0cik6IERlZmluZS4KLQkoYmZkX2luZF9zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX2luZF9zZWN0aW9uX3B0ciwgYmZkX2lzX2luZF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfYWJzX3N5bWJvbCwgYmZkX2NvbV9zeW1ib2wpOiBNYWtlIGNvbnN0LgotCShiZmRfdW5kX3N5bWJvbCwgYmZkX2luZF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoZ2xvYmFsX3N5bXMpOiBDYXN0IGluaXRpYWxpemF0aW9uIG9mIHNlY3Rpb24gZmllbGQuCi0JKFNURF9TRUNUSU9OKTogRGVmaW5lIGFzIGNvbnN0LCBhbmQgY2FzdCBpbml0aWFsaXphdGlvbnMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBNYW55IGZpbGVzOiBDaGFuZ2UgdXNlcyBvZiBiZmRfYWJzX3NlY3Rpb24sIGV0Yy4sIHRvIHVzZQotCWJmZF9hYnNfc2VjdGlvbl9wdHIgb3IgYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuCi0KLU1vbiBKdW4gMjAgMTE6MDY6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYW55IGZpbGVzOiBjaGFuZ2UgYWxsIGJmZF90YXJnZXQgdmVjdG9ycyB0byBiZSBjb25zdC4gIENoYW5nZQotCWFsbCB1c2VzIG9mIGJmZF90YXJnZXQgKiB0byBiZSBjb25zdCBiZmRfdGFyZ2V0ICouICBDaGFuZ2UKLQliZmRfdGFyZ2V0X3ZlY3RvciBhbmQgYmZkX2RlZmF1bHRfdmVjdG9yIGFycmF5cyB0byBiZSBjb25zdAotCWJmZF90YXJnZXQgKiBjb25zdCAqLgotCi0JKiBlY29mZi5jLCBsaWJlY29mZi5oLCBlY29mZnN3YXAuaCwgY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywKLQllbGYzMi1taXBzLmM6IFJlbmFtZWQgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBFQ09GRiByb3V0aW5lcyB3aGljaAotCWFyZSBsb2NhbCB0byBCRkQgdG8gc3RhcnQgd2l0aCBfYmZkX2Vjb2ZmIGluc3RlYWQgb2YganVzdCBlY29mZi4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3dhcF90aXJfaW4pOiBDaGFuZ2UgaW5wdXQgYXJndW1lbnQgdG8gY29uc3QuCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IEFkZCBuZXcgYXJndW1lbnRzIHRvIGNvcnJlc3BvbmQgdG8KLQlyZWFkX2RlYnVnX2luZm8gZW50cnkgcG9pbnQgaW4gZWNvZmZfZGVidWdfc3dhcCBzdHJ1Y3R1cmUuCi0JQ2hhbmdlIGFsbCBjYWxscy4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBDaGFuZ2UgZGVjbGFyYXRpb24uCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF90aXJfaW4sIGVjb2ZmX3N3YXBfdGlyX291dCk6IERlY2xhcmUuCi0JKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IERlY2xhcmUuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3Ci0JZWNvZmZfZGVidWdfc3dhcCBmaWVsZHMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogVW5kZWZpbmUgUkVBRC4KLQkobWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcCk6IEluaXRpYWxpemUgbmV3IGVjb2ZmX2RlYnVnX3N3YXAKLQlmaWVsZHMuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9iaWdtaXBzX3ZlYyk6IFVzZSBlY29mZi5vIGFuZAotCWVjb2ZmbGluay5vLgotCShiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpOiBMaWtld2lzZS4KLQkoZWNvZmZfYmlnX3ZlYywgZWNvZmZfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZSBlY29mZi5vIGFuZCBlY29mZmxpbmsuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWNvZmYubyBhbmQgZWNvZmZsaW5rLm8uCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IENoZWNrIGZsYXZvdXIgb2Ygc3ViLCBub3QgYWJmZCwKLQl3aGVuIGNvbXB1dGluZyByZWxvYyBzaXplcy4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IHRyeSB0byBjb21wdXRlIG1heGltdW0KLQlyZWxvYyBjb3VudCBvciBzaXplIGZvciBhIG5vbi1FTEYgZmlsZS4KLQotCSogbWlwc2JzZC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGF2b2lkIHdhcm5pbmcuCi0KLQkqIGhwMzAwaHB1eC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGF2b2lkIHdhcm5pbmcuCi0JKEJNQUdJQywgUU1BR0lDKTogRGVmaW5lOyB1c2VkIGJ5IGFvdXR4LmguCi0JKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDaGFuZ2UgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncwotCWNhbGxzIHRvIHVzZSBuZXcgcGFyYW1ldGVycy4KLQotRnJpIEp1biAxNyAxNDo0NTozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUgdGV4dCwKLQlkYXRhIGFuZCBic3Mgc2VjdGlvbnMgYWZ0ZXIgZGV0ZXJtaW5pbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBUcmVhdCBhIGNvbW1vbiBzeW1ib2wgZnJvbSBhCi0JZHluYW1pYyBvYmplY3QgYXMgYmVpbmcgaW4gdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgb2JqZWN0LCByYXRoZXIKLQl0aGFuIGFzIGJlaW5nIHVuZGVmaW5lZC4KLQotRnJpIEp1biAxNyAxMToxNjo1MCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliaHBwYS5oIChiZmRfaHBwYV9pbnNuMmZtdCwgaHBwYV9yZWJ1aWxkX2luc24pOiBNYWtlIElOTElORS4KLQotCSogZWxmMzItaHBwYS5oIChlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRGVsZXRlIGRlY2wuCi0KLVRodSBKdW4gMTYgMjM6MzY6MjMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgdHJ5IHRvIHJlYWQgbG9jYWwgc3ltYm9scwotCWlmIHRoZXJlIGFyZW4ndCBhbnkgaW4gdGhlIGlucHV0IGZpbGUuCi0KLVRodSBKdW4gMTYgMTQ6MjU6MjIgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYzogTWFueSBuZXcgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucyBmb3IgbGlua2VyCi0Jc3VwcG9ydCBmb3IgTGludXggc2hhcmVkIGxpYnJhcmllcy4KLQkqIGJmZC1pbi5oIChiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVGh1IEp1biAxNiAxNDoyMzo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IElmIHNlY29uZCBhcmd1bWVudCBpcyBgYF8nJywgdGhlbiwgaW5zdGVhZCBvZgotCWVjaG9pbmcgY29uZmlnIGZpbGUgbmFtZSwgZWNobyB3aGV0aGVyIHRhcmdldCB1c2VzIGxlYWRpbmcKLQl1bmRlcnNjb3JlcyBvbiBzeW1ib2wgbmFtZXMuICBBZGQgYXBwcm9wcmlhdGUgc2V0dGluZ3MgdG8KLQlkaWZmZXJlbnQgY2FzZXMuICBVc2VkIGJ5IGJpbnV0aWxzL2NvbmZpZ3VyZS5pbiB0byBzZXQgZGVmYXVsdCBmb3IKLQljKytmaWx0LgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IElmIHRyeWluZyB0byBnZW5lcmF0ZSBhIHNoYXJlZAotCW9iamVjdCwgd2FybiBhbmQgcmV0dXJuIGZhbHNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEFjY2VwdCBCTUFHSUMgb2JqZWN0cwotCWFuZCB0cmVhdCB0aGVtIGFzIE9NQUdJQy4KLQotV2VkIEp1biAxNSAxODowMjoyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JRW5hYmxlIHNwYXJjIHY5IHN1cHBvcnQgZm9yIHJlbGVhc2UuICBOb3RlIHRoYXQgdGhpcyBpcyBzdGlsbCBhCi0Jd29yayBpbiBwcm9ncmVzcywgcGVuZGluZyByZWxlYXNlIG9mIGFuIEFCSSBzcGVjaWZpY2F0aW9uLgotCSogY29uZmlnLmJmZCwgY29uZmlndXJlLmluOiBJbmNsdWRlIHNwYXJjIHY5IGVsZiBjb25maWcuCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IEhhbmRsZSBzcGFyYyB2OSAoNjQgYml0KS4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWwpOiBOZXcgcmVsb2MgdHlwZXMuCi0JKiBlbGY2NC1zcGFyYy5jOiBJbXBsZW1lbnQgZWxmNjQtc3BhcmMgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4sIHRhcmdldHMuYzogVXBkYXRlZC4KLQotV2VkIEp1biAxNSAwMTozNDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZCBkdF9uZWVkZWRfbmFtZS4KLQkoZWxmX2R0X25lZWRlZF9uYW1lKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfZHRfbmVlZGVkX25hbWUKLQlpcyBzZXQsIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lIGZvciB0aGUgRFRfTkVFREVEIGR5bmFtaWMKLQllbnRyeS4KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgc2ludGVycHB0cgotCWFyZ3VtZW50LCBhbmQgc2V0IGl0IHRvIHRoZSAuaW50ZXJwIHNlY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogY29mZi1zcGFyYy5jIChTV0FQX09VVF9SRUxPQ19FWFRSQSk6IERlZmluZSB0byBjbGVhciB0aGUgcl9zcGFyZQotCWZpZWxkIG9mIHRoZSByZWxvYyByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGJlIGdhcmJhZ2UuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogUmVjb2duaXplIF9fLlNZTURFRi8gYXMgd2VsbCBhcwotCV9fLlNZTURFRjsgdGhlIGZvcm1lciB3YXMgdXNlZCBpbiBvbGQgTGludXggYXJjaGl2ZXMuICBGcm9tCi0JanJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0KLQkqIGkzODZsaW51eC5jIChpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVmaW5lOyBsaWtlCi0JTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBpbiBhb3V0LXRhcmdldC5oLCBidXQgc2V0IE1BQ0hUWVBFIHRvCi0JTV8zODYuICBGcm9tIGpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgotCShNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmUuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBUcmVhdCBOX1NFVFYgc3ltYm9scwotCWFzIE5fREFUQSBzeW1ib2xzLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotCSogYW91dHguaDogUmV3cml0ZSBzeW1ib2wgZHVwbGljYXRlIGVsaW1pbmF0aW9uIHRvIHVzZSBCRkQgaGFzaAotCXRhYmxlcy4KLQkoc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgc3RydWN0IHN0cmluZ3RhYl9kYXRhKTogUmVtb3ZlLgotCShIQVNITUFYTEVOLCBIQVNIX0NIQVIsIGhhc2gsIGNvbXBhcmUsIGxvZzIsIGVtaXRfc3RydGFiKTogUmVtb3ZlLgotCShzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnksIHN0cnVjdCBzdHJ0YWJfaGFzaCk6IERlZmluZS4KLQkoc3RydGFiX2hhc2hfbmV3ZnVuYywgc3RydGFiX2hhc2hfbG9va3VwKTogRGVmaW5lLgotCShzdHJpbmd0YWJfZnJlZSwgZW1pdF9zdHJpbmd0YWIpOiBEZWZpbmUuCi0JKHN0cmluZ3RhYl9pbml0LCBhZGRfdG9fc3RyaW5ndGFiKTogUmV3cml0ZS4KLQkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogVXNlIG5ldyBzdHJpbmd0YWIgY29kZS4KLQkoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvLCBOQU1FKGFvdXQsZmluYWxfbGluaykpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMsIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogYmZkLWluLmggKEJGRF9UUkFESVRJT05BTF9GT1JNQVQpOiBEZWZpbmUgbmV3IEJGRCBmbGFnIHRvCi0JcmVxdWVzdCBCRkQgdG8gd3JpdGUgb2JqZWN0IGluIHRoZSB0cmFkaXRpb25hbCBmb3JtYXQsIHdoYXRldmVyCi0JdGhhdCBtZWFucyBmb3IgdGhlIHBhcnRpY3VsYXIgYmFja2VuZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogaGFzaC5jIChiZmRfaGFzaF9hbGxvY2F0ZSk6IElmIG9ic3RhY2tfYWxsb2MgZmFpbHMsIHNldAotCWJmZF9lcnJvcl9ub19tZW1vcnkuCi0KLVR1ZSBKdW4gMTQgMTM6MDA6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBxX21hZ2ljX2Zvcm1hdCB0byBzdWJmb3JtYXQKLQllbnVtLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSBhcyBmdW5jdGlvbgotCWlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBDb3B5IHN1YmZvcm1hdCBpbmZvcm1hdGlvbi4KLQkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIpOiBEZWZpbmUgYXMgMCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShNWShiYWNrZW5kX2RhdGEpKTogVXNlIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIHJhdGhlciB0aGFuIDAuCi0JKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBSZW5hbWUgZnJvbSBmaW5hbF9saW5rX2NhbGxiYWNrLCBhbmQKLQlkZWZpbmUgb25seSBpZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKE1ZX2JmZF9maW5hbF9saW5rKTogUmVuYW1lIHVzZSBvZiBmaW5hbF9saW5rX2NhbGxiYWNrIHRvCi0JTVlfZmluYWxfbGlua19jYWxsYmFjay4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSGFuZGxlIFFNQUdJQyBsaWtlCi0JWk1BR0lDLCBidXQgc2V0IHRoZSBzdWJmb3JtYXQgdG8gcV9tYWdpY19mb3JtYXQuICBBYm9ydCBpZiB0aGUKLQltYWdpYyBudW1iZXIgaWYgbm90IHJlY29nbml6ZWQuCi0JKGFkanVzdF96X21hZ2ljKTogVXNlIFFNQUdJQyBpZiBxX21hZ2ljX2Zvcm1hdC4KLQkqIGkzODZsaW51eC5jIChNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERlZmluZSBhcyAxLgotCShpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmspOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShNWV9iZmRfZmluYWxfbGluayk6IERlZmluZSBhcyBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogQ2hlY2sgYm90aCBzZWN0aW9uIGFuZAotCW91dHB1dF9zZWN0aW9uIGFnYWluc3Qgc2VjdGlvbnMgb2YgYWJmZC4KLQotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSB0eXBlIG9mCi0Jd3JpdHRlbiBmcm9tIGJvb2xlYW4gdG8gY2hhci4gIEFkZCBuZXcgZmllbGQgc21hbGwuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbiB0byAwCi0JcmF0aGVyIHRoYW4gZmFsc2UuICBJbml0aWFsaXplIHNtYWxsIHRvIDAuCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IElmIEVDT0ZGIHR5cGUgaXMgc2NTVW5kZWZpbmVkLCBzZXQKLQlzbWFsbC4gIElmIHNtYWxsIGlzIHNldCwgYW5kIGhhc2ggdGFibGUgdHlwZSBpcyBjb21tb24sIGZvcmNlIHRoZQotCXN5bWJvbCBpbnRvIGEgc2VjdGlvbiBuYW1lZCBTQ09NTU9OIGFuZCBjaGFuZ2UgdGhlIEVDT0ZGIHR5cGUgZnJvbQotCXNjQ29tbW9uIHRvIHNjU0NvbW1vbi4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFNldCB3cml0dGVuIHRvIDEgcmF0aGVyIHRoYW4gdHJ1ZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IEpNUEFERFIgcmVsb2MKLQlvdmVyZmxvdyBjaGVjayB0byBjb25zaWRlciBzZWN0aW9uIFZNQSBvZiBpbnB1dCBmaWxlLgotCi1Nb24gSnVuIDEzIDE0OjIwOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBhCi0JbWFjaGluZSB0eXBlIG9mIDY4MDAwLgotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBBZGQgbmV3IGFyZ3VtZW50IHVua25vd24uCi0JU2V0ICp1bmtub3duIHRvIHRydWUgaWYgbWFjaGluZSB0eXBlIGlzIHJlYWxseSB1bmtub3duLCBhcyBvcHBvc2VkCi0JdG8gTV9VTktOT1dOIGZvciB0aGUgNjgwMDAuCi0JKE5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSk6IENoYW5nZSBOQU1FKGFvdXQsbWFjaGluZV90eXBlKSBjYWxsCi0JYWNjb3JkaW5nbHkuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogQWRkIG5ldyBhcmd1bWVudCB0bwotCXByb3RvdHlwZS4KLQotU3VuIEp1biAxMiAyMDoyMTowMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKEVYRUNfQVVYX0lEKTogRGVmaW5lIGJhc2VkIG9uIGF2YWlsYWJsaXR5IG9mIEhQVVhfQVVYX0lECi0Jb3IgSElVWF9BVVhfSUQuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogVXNlIEVYRUNfQVVYX0lEIGluc3RlYWQgb2YgSFBVWF9BVVhfSUQuCi0JKHNvbV93cml0ZV9hcm1hcCk6IFVzZSBDUFVfUEFfUklTQzFfMCBhcyB0aGUgbWFnaWMgbnVtYmVyLiAgTm90ZQotCXNvbS5jIGlzIGNhcmVmdWwgdG8gYWx3YXlzIGRlZmluZSBDUFVfUEFfUklTQzFfMC4KLQotU2F0IEp1biAxMSAxNjozMjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgd2VhayBzeW1ib2xzIGFzIGFuIGV4dGVuc2lvbiB0byBhLm91dC4KLQkqIGFvdXR4LmggKHN5bV9pbl90ZXh0X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCi0JKHN5bV9pbl9kYXRhX3NlY3Rpb24sIHN5bV9pbl9ic3Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShzeW1faXNfdW5kZWZpbmVkLCBzeW1faXNfZ2xvYmFsX2RlZm4pOiBMaWtld2lzZS4KLQkoc3ltX2lzX2RlYnVnZ2VyX2luZm8sIHN5bV9pc19mb3J0cmFuY29tbW9uKTogTGlrZXdpc2UuCi0JKHN5bV9pc19hYnNvbHV0ZSwgc3ltX2lzX2luZGlyZWN0KTogTGlrZXdpc2UuCi0JKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZXdyaXRlIGZvciBjbGFyaXR5LiAgUmVhcnJhbmdlCi0JYXJndW1lbnRzIGFuZCBjaGFuZ2UgY2FsbGVyLiAgSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBEb24ndCBpZ25vcmUgd2VhayBzeW1ib2xzLiAgUHVsbAotCW9iamVjdCBpbiBmcm9tIGFyY2hpdmUgaWYgYSB3ZWFrIGRlZmludGlvbiBpcyBmb3VuZCBmb3IgYW4KLQlleGlzdGluZyB1bmRlZmluZWQgc3ltYm9sLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBQdXQgYWxsIGNhc2VzIGluIHN3aXRjaC4gIFNldCBmbGFncyBvZiBhbgotCXVuZGVmaW5lZCBzeW1ib2wgdG8gMC4gIEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi1GcmkgSnVuIDEwIDEzOjI1OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBIYW5kbGUgLmJzcyBzZWN0aW9uLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIEJGRF9SRUxPQ19DVE9SLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEb24ndCBhc3N1bWUKLQl0aGUgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgbm90IE5VTEwuCi0KLVdlZCBKdW4gIDggMjM6MTU6NTMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiAgU2V0IEVYRUNfUCBhbmQgc3RhcnQgYWRkcmVzcyBmb3IgR0RCLgotCi1XZWQgSnVuICA4IDIzOjU3OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERvbid0IHRyeSB0byByZWFkIHRoZQotCXN0cmluZ3MgaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBVc2UgdGhlIG91dHB1dCBzZWN0aW9uIHdoZW4KLQl3b3JraW5nIG91dCB0aGUgdHlwZS4KLQotVHVlIEp1biAgNyAxMzoyNTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFB1dCBzaHN0cnRhYiwgc3ltdGFiIGFuZAotCXN0cnRhYiBzZWN0aW9ucyBhdCBlbmQgb2YgZmlsZS4gIEF2b2lkcyBidWcgaW4gc29tZSB2ZXJzaW9ucyBvZgotCVNWUjQgc3RyaXAuICBGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQHRhbnRhbHVzLm5ybC5uYXZ5Lm1pbD4uCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWYgQ09GRl9QQUdFX1NJWkUgaXMgZGVmaW5lZCwKLQlzZXQgU0VDX0RFQlVHR0lORyBmb3IgU1RZUF9JTkZPIHNlY3Rpb25zLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIENPRkZfUEFHRV9TSVpFIGlzCi0JZGVmaW5lZCwgYW5kIERfUEFHRUQgaXMgc2V0LCBzZXQgdGhlIGZpbGUgcG9zaXRpb24gZXF1YWwgdG8gdGhlCi0Jc2VjdGlvbiBWTUEgbW9kdWxvIENPRkZfUEFHRV9TSVpFLgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBJZiBGX0VYRUMgaXMgc2V0LCBzZXQgRF9QQUdFRC4KLQkqIGNvZmYtaTM4Ni5jOiBTZXQgRF9QQUdFRCBpbiBCRkQgdGFyZ2V0LgotCShDT0ZGX1BBR0VfU0laRSk6IERlZmluZS4KLQkqIGNvZmYtbTY4ay5jLCBjb2ZmLXNwYXJjLmM6IExpa2V3aXNlLgotCi1Nb24gSnVuICA2IDEwOjU3OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCB0dXJuIGEgcmVsb2Mgc2VjdGlvbgotCWludG8gYSBCRkQgc2VjdGlvbiBqdXN0IGJlY2F1c2UgU0hGX0FMTE9DIGlzIHNldDsgcmVxdWlyZSB0aGF0IGl0Ci0Jbm90IHVzZSB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZS4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JQmV0dGVyIGluZGlyZWN0IGFuZCB3YXJuaW5nIHN5bWJvbCBoYW5kbGluZyBpbnNwaXJlZCBieSBTdHVhcnQKLQlRdWljayA8c3R1Y2tAY3MubWFuLmFjLnVrPi4KLQkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIFJFRiwgTUlORCwgQ1dBUk4sIFJFRkMuCi0JKGxpbmtfYWN0aW9uKTogQ2hhbmdlIFVOREVGX1JPVy9kZWYgYW5kIFVOREVGV19ST1cvZGVmIGZyb20gTk9BQ1QKLQl0byBSRUYuICBDaGFuZ2UgVU5ERUZfUk9XL2luZHIgYW5kIFVOREVGV19ST1cvaW5kciBmcm9tIENZQ0xFIHRvCi0JUkVGQy4gIENoYW5nZSBERUZfUk9XL2luZHIgYW5kIENPTU1PTl9ST1cvaW5kciBmcm9tIENZQ0xFIHRvIE1ERUYuCi0JQ2hhbmdlIERFRldfUk9XL2luZHIgZnJvbSBDWUNMRSB0byBOT0FDVC4gIENoYW5nZSBJTkRSX1JPVy9pbmRyCi0JZnJvbSBNREVGIHRvIE1JTkQuICBDaGFuZ2UgSU5EUl9ST1cvd2FybiBmcm9tIFdBUk5DIHRvIENZQ0xFLgotCUNoYW5nZSBXQVJOX1JPVy9kZWYgYW5kIFdBUk5fUk9XL2luZHIgZnJvbSBNV0FSTiB0byBDV0FSTi4gIENoYW5nZQotCVdBUk5fUk9XL2NvbSBmcm9tIE1XQVJOIHRvIFdBUk4uICBDaGFuZ2UgV0FSTl9ST1cvd2FybiBmcm9tIE5PQUNUCi0JdG8gQ1lDTEUuICBDaGFuZ2UgU0VUX1JPVy93YXJuIGZyb20gV0FSTkMgdG8gQ1lDTEU+Ci0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSGFuZGxlIFJFRiwgTUlORCwgQ1dBUk4gYW5kCi0JUkVGQy4gIElmIGEgbmV3IGluZGlyZWN0IHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLCBwdXNoIHRoZQotCXJlZmVyZW5jZSBkb3duIHRvIHRoZSBzeW1ib2wgaXQgcG9pbnRzIHRvLiAgRkl4IGhhbmRsaW5nIG9mIFdBUk4uCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogSWYgTl9XQVJOSU5HLCBkb24ndAotCWNsb2JiZXIgZV90eXBlIG9mIG5leHQgc3ltYm9sLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IExvb3Agb24gYmZkX2xpbmtfaGFzaF93YXJuaW5nIGFzIHdlbGwKLQlhcyBiZmRfbGlua19oYXNoX2luZGlyZWN0LgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSk6IEluaXRpYWxpemUgd3JpdHRlbi4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHdyaXR0ZW4uCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiB1c2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkqIGdlbmxpbmsuaCAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5KTogTmV3IGZpZWxkIHdyaXR0ZW4uCi0JKiBsaW5rZXIuYyAoX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGluaXRpYWxpemUgd3JpdHRlbi4KLQkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBVc2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBBZGQgbGlua2VyIGZpZWxkLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgbmV3IHRkYXRhIGxpbmtlcgotCWZpZWxkLCByYXRoZXIgdGhhbiBvdXRzeW1ib2xzIGJlaW5nIG5vbi1OVUxMLCB0byBkZWNpZGUgd2hldGhlciB0bwotCW91dHB1dCB0aGUgc3ltYm9scyBhbmQgcmVsb2NzLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IFNldCBuZXcgdGRhdGEgbGlua2VyIGZpZWxkIHRvIHRydWUuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB0cnkgdG8gY29weQotCWRhdGEgdG8gYSBub24tRUNPRkYgZmlsZS4KLQotCSogbGliYmZkLWluLmg6IEFkZCB3YXJuaW5nIHRoYXQgbGliYmZkLmggaXMgYSBnZW5lcmF0ZWQgZmlsZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1TdW4gSnVuICA1IDE1OjAyOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gc3VwcG9ydCBFTEYgc3RyaXAgYW5kIG9iamNvcHkgb24gZHluYW1pY2FsbHkgbGlua2VkCi0JZmlsZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQWRkIHByb3RvdHlwZS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFrZSBhIEJGRCBzZWN0aW9uIGZyb20gYW4gU0hUX0hBU0gKLQlzZWN0aW9uLCBhbmQgZnJvbSBhbiBTSFRfRFlOU1lNIHNlY3Rpb24sIGFuZCBmcm9tIHRoZSBkeW5hbWljCi0Jc3RyaW5nIHRhYmxlIHNlY3Rpb24uCi0JKGVsZl9vYmplY3RfcCk6IFNldCBEX1BBR0VEIGlmIHRoZXJlIGlzIGEgcHJvZ3JhbSBoZWFkZXIuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogUmVtb3ZlLgotCShmaXhfdXBfc3RydGFicyk6IFJlbW92ZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZXdyaXRlLiAgTm93IHNldHMgc2hfZW50c2l6ZS4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFJld3JpdGUuICBOb3cgc2V0cyBzaF9saW5rIGFuZCBzaF9pbmZvCi0JZm9yIGFsbCBzZWN0aW9ucy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6ICBEb24ndCBjYWxsIG9ic29sZXRlCi0JZnVuY3Rpb25zIGVsZl9tYWtlX3NlY3Rpb25zIG9yIGZpeF91cF9zdHJ0YWJzLgotCShzd2FwX291dF9zeW1zKTogU2V0IHNoX2FkZHJhbGlnbiB0byBGSUxFX0FMSUdOIHJhdGhlciB0aGFuIDQuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogUGVybWl0IHdyaXRpbmcgRFlOQU1JQwotCW9iamVjdHMuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBUcmVhdCBTSFRfRFlOU1lNIGxpa2Ugb3RoZXIgbm9ybWFsCi0Jc2VjdGlvbnMuICBJZiBhbiBTSFRfUkVMIG9yIFNIVF9SRUxBIHNlY3Rpb24gaXMgYWxsb2NhdGVkIG9yIHVzZXMKLQlhbiB1bnVzdWFsIHN5bWJvbCB0YWJsZSwgcGVybWl0IGEgQkZEIHNlY3Rpb24gdG8gbWFwIHRvIGl0LgotCVBlcm1pdCBtb3N0IFNIVF9TVFJUQUIgc2VjdGlvbnMgdG8gaGF2ZSBhIEJGRCBzZWN0aW9uIG1hcHBlZCB0bwotCXRoZW0uCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCBzaF9saW5rLCBzaF9pbmZvIG9yIHNoX2VudHNpemUKLQlmaWVsZHMgb2YgZHluYW1pYyBzZWN0aW9ucyBoZXJlOyBkbyBpdCBpbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLgotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBBZGQgRF9QQUdFRCB0byBwZXJtaXR0ZWQgb2JqZWN0Ci0JZmxhZ3MuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogT25seSBzZXQgU0VDX0RBVEEgaWYKLQlTRUNfTE9BRCBpcyBzZXQsIHJhdGhlciB0aGFuIGNoZWNraW5nIFNFQ19BTExPQy4KLQotCSogbGliYmZkLWluLmggKGJmZF9yZWFsbG9jKTogQ2hhbmdlIGxhc3QgYXJnIHRvICJzaXplX3Qgc2l6ZSIuCi0KLUZyaSBKdW4gIDMgMTA6NTg6MDIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY29tcHV0ZSB0aGUgZmlsZSBoZWFkZXIncwotCWNoZWNrc3VtIGhlcmUuCi0JKHNvbV93cml0ZV9oZWFkZXJzKTogSW5zdGVhZCBkbyBpdCBoZXJlLgotCi0JKiBsaWJiZmQuaCAoYmZkX3JlYWxsb2MpOiBDaGFuZ2UgbGFzdCBhcmcgdG8gInNpemVfdCBzaXplIi4KLQotVGh1IEp1biAgMiAxNzozOToyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogSW5jbHVkZSA8c3RkbGliLmg+LiAgRG9uJ3QgZGVjbGFyZSBmcmVlLCBleGl0IG9yCi0JZ2V0ZW52LgotCi0JQWRkIGxpbmtlciBzdXBwb3J0IGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgotCSogc3Vub3MuYzogSW5jbHVkZSBiZmRsaW5rLmguICBBZGQgbWFueSBuZXcgZnVuY3Rpb25zIGFuZAotCWRlZmluaXRpb25zIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCSogYmZkLWluLmggKGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBhb3V0eC5oIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpOiBNb3ZlIHRvIGxpYmFvdXQuaC4KLQkoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19oYXNoX2xvb2t1cCwgYW91dF9saW5rX2hhc2hfdHJhdmVyc2UpOiBMaWtld2lzZS4KLQkoYW91dF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBSZW5hbWUgZnJvbSBhb3V0X2xpbmtfaGFzaF9uZXdmdW5jCi0JYW5kIG1ha2UgZXh0ZXJuYWxseSB2aXNpYmxlLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOiBDYWxsCi0JTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSwgbm90IF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGZhaWwgaWYgbm8gc3ltYm9scy4gIElmIGl0IGV4aXN0cywKLQljYWxsIGFkZF9keW5hbWljX3N5bWJvbHMgYmFja2VuZCBlbnRyeSBwb2ludCBmb3IgZHluYW1pYyBvYmplY3RzLgotCVVzZSBhZGRfb25lX3N5bWJvbCBiYWNrZW5kIGVudHJ5IHBvaW50IGlmIGl0IGV4aXN0cy4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogQ2FsbCBmaW5pc2hfZHluYW1pY19saW5rIGJhY2tlbmQgZW50cnkKLQlwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogRm9yIGEgZHluYW1pYyBvYmplY3QsIGNhbGwKLQlsaW5rX2R5bmFtaWNfb2JqZWN0IGJhY2tlbmQgZW50cnkgcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IENhbGwgd3JpdGVfZHluYW1pY19zeW1ib2wgYmFja2VuZAotCWVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogRG9uJ3QgcmVhZCB0aGUgcmVsb2NzIGlmIHRoZXkgaGF2ZQotCWFscmVhZHkgYmVlbiByZWFkLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIGRvaW5nIGEgZmluYWwgbGluaywgZm9yIGEKLQlyZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgY2FsbCBjaGVja19keW5hbWljX3JlbG9jIGJhY2tlbmQKLQllbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkqIGxpYmFvdXQuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gIEluY2x1ZGUKLQliZmRsaW5rLmguCi0JKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgaW4gZnJvbSBhb3V0eC5oLgotCShzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2hhc2hfbG9va3VwLCBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgotCShhb3V0X2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBhZGRfZHluYW1pY19zeW1ib2xzLAotCWFkZF9vbmVfc3ltYm9sLCBsaW5rX2R5bmFtaWNfb2JqZWN0LCB3cml0ZV9keW5hbWljX3N5bWJvbCwKLQljaGVja19keW5hbWljX3JlbG9jLCBhbmQgZmluaXNoX2R5bmFtaWNfbGluay4KLQkoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShhb3V0X3NlY3Rpb25fZGF0YSk6IERlZmluZSBuZXcgYWNjZXNzb3IgbWFjcm8uCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpKTogRGVjbGFyZS4KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBuZXcgYW91dF9iYWNrZW5kX2RhdGEKLQlmaWVsZHMuCi0JKiBhb3V0LXRhcmdldC5oIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYyAoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IHplcm8gb3V0IGNhY2hlZAotCXVudGlsIHdlIGtub3cgaXQgaXMgbm9uLU5VTEwuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogRG9uJ3Qgc2tpcCBhIHdhcm5pbmcgc3ltYm9sIGV2ZW4gaWYgaXQKLQloYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LiAgSWYgc2tpcHBpbmcgYW4gaW5kaXJlY3Qgc3ltYm9sLAotCXNraXAgdGhlIG5leHQgc3ltYm9sIGFzIHdlbGwuCi0KLVdlZCBKdW4gIDEgMTQ6Mzc6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IERvbid0IGRlY2xhcmUgcXNvcnQsIG1hbGxvYyBvciByZWFsbG9jLgotCi1UaHUgTWF5IDI2IDEzOjU2OjAzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBDYXN0IGJmZF9ieXRlIHBvaW50ZXIKLQl0byBjaGFyIHBvaW50ZXIgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSBzcGFjZXMgYmVmb3JlIGNvbG9ucy4KLQotCU1lcmdlZCBjaGFuZ2VzIGJhY2sgaW4gZnJvbSBGU0YgZ2FzIHJlbGVhc2UgMi4zOgotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IFdyYXAgYGlmJyBibG9jayBhcm91bmQgZ3JlcAotCWludm9jYXRpb24sIHRvIGF2b2lkIGEgYnVnIGluIEJTRCA0LjQgbWFrZS4KLQotCUZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBtaXBzYnNkLmMgKG1pcHNfZml4X2ptcF9hZGRyKTogSWYgc3ltYm9sIGlzIHVuZGVmaW5lZCwgcmV0dXJuIGFuCi0JZXJyb3IuCi0JKG1pcHNfZml4X2hpMTZfcyk6IERpdHRvLgotCi0JRnJpIE1heSAxMyAyMToyMTowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIG1ha2VmaWxlLmRvczogZGVmaW5lIGEgZGVmYXVsdCB0YXJnZXQsIG9yIGFyY2hpdmVzIHdvbid0IHdvcmsKLQkgIGR1ZSB0byBtdWx0aXBsZSBtYXRjaGVzLgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IGZpbGVzCi0JKiBtYWtlZmlsZS5kb3M6IHVwZGF0ZSBmb3IgY29ycmVjdCB0YXJnZXRzIGFuZCBzb3VyY2VzCi0JKiBjb2ZmLWdvMzIuYzogW25ld10gZ28zMidzIENPRkYgZm9ybWF0IChpMzg2Y29mZiB3aXRoIHVuZGVyc2NvcmVzKQotCSogdGFyZ2V0cy5jOiBhZGQgZ28zMmNvZmYgdGFyZ2V0Ci0JKiBtYWtlZmlsZS5pbjogYWRkIGNvZmYtZ28zMi5jIHN1cHBvcnQKLQotVGh1IE1heSAyNiAxMDoxMDoyMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBEbyBub3Qgc2V0IHRoZSBzeXN0ZW1faWQgaGVyZSwgcHJpdmF0ZQotCWJmZCBkYXRhIGhhcyBub3QgYmVlbiBjb3BpZWQgeWV0LgotCShzb21fd3JpdGVfaGVhZGVycyk6IEluc3RlYWQgZG8gaXQgaGVyZS4KLQotVHVlIE1heSAyNCAxNjoxNzoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlNYWtlIE1JUFMgRUxGIHVzZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyLiAgTm8gc2hhcmVkIGxpYnJhcnkKLQlzdXBwb3J0IHlldC4KLQkqIGVsZjMyLW1pcHMuYyAoYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9pbik6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX29iamVjdF9wKTogSWYgbGFzdCBzeW1ib2wgaXMgTE9DQUwsIHNldCBlbGZfYmFkX3N5bXRhYi4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9pbmZvIGZpZWxkIGZvciAuZ3B0YWIuKgotCXNlY3Rpb25zLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2VudHNpemUgZm9yIC5ncHRhYi4qIHNlY3Rpb25zLgotCShtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBSZWFkIGFuZCBmcmVlIGV4dGVybmFsIHN5bWJvbHMgbGFzdCwKLQlub3QgZmlyc3QsIGZvciBjbGFyaXR5LgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkobWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCk6IERlZmluZSBuZXcgbWFjcm8uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZSBuZXcgbWFjcm8uCi0JKG1pcHNfZWxmX2hhc2hfdGFibGUpOiBEZWZpbmUgbmV3IG1hY3JvLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgZXh0c3ltX2luZm8pOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkobWlwc19lbGZfZ2V0X2V4dHIsIG1pcHNfZWxmX3NldF9pbmRleCk6IFJlbW92ZS4KLQkobWlwc19lbGZfb3V0cHV0X2V4dHN5bSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdwdGFiX2NvbXBhcmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogUmV3cml0ZSB0byB1c2UgRUxGIGJhY2tlbmQgbGlua2VyLCBhbmQgdG8KLQltZXJnZSBncHRhYiBpbmZvcm1hdGlvbiBpbiBpbnB1dCBmaWxlcy4KLQkobWlwc19lbGZfcmVsb2NhdGVfaGkxNik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUgYXMgbWFjcm8gYmVmb3JlCi0JaW5jbHVkaW5nIGVsZjMyLXRhcmdldC5oLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lIGZyb20KLQllbGZfbGlua19oYXNoX25ld2Z1bmMgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENoYW5nZSBjYWxsZXIuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFVzZQotCV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0LgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIG5ldyBmaWVsZCBiYWRfc3ltdGFiLgotCShlbGZfYmFkX3N5bXRhYik6IERlZmluZSBuZXcgYWNjZXNzb3IgbWFjcm8uCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyZS4KLQkoX2Jld19lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBDYWxsIGJhY2tlbmQgb2JqZWN0X3AgaG9vayBhZnRlcgotCXN3YXBwaW5nIGluIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENvcnJlY3QgdHlwbzogSW50ZXJuYWwgZm9yIEV4dGVybmFsLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfYmFkX3N5bXRhYiBpcyBzZXQsIHJlYWQgYWxsCi0JdGhlIHN5bWJvbHMuICBTa2lwIFNUQl9MT0NBTCBzeW1ib2xzIHJhdGhlciB0aGFuIGdpdmluZyBhbiBlcnJvci4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCBhbGxvY2F0ZSBzcGFjZSBmb3IKLQlhbGwgc3ltYm9scywgbm90IGp1c3QgbG9jYWxzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT25seSBza2lwIGEgc3ltYm9sIG5vdCBtZW50aW9uZWQgYnkgYQotCXJlZ3VsYXIgZmlsZSBpZiBpdCBpcyBtZW50aW9uZWQgYnkgYSBkeW5hbWljIG9iamVjdC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCByZWFkIGFsbCB0aGUKLQlzeW1ib2xzLgotCi1GcmkgTWF5IDIwIDEzOjM4OjIzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvKTogRG8gbm90IHNldCBhbnkgcmVsb2NhdGlvbiBpbmZvCi0JZm9yIFNPTSBmaXh1cHMgd2hpY2ggYXJlIG5ldmVyIHBhc3NlZCB0byBCRkQuCi0KLUZyaSBNYXkgMjAgMTE6NTc6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIE1JUFNfUl9KTVBBRERSIG92ZXJmbG93Ci0JY2hlY2tpbmcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIERUX0RFQlVHIHRvCi0JdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIGRlYnVnZ2VyLgotCUZyb20gUGV0ZXIgU2NoYXVlci4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IE5ldyBmdW5jdGlvbiwgYmFzZWQgb24KLQljb2RlIHJlcGVhdGVkIHRocmVlIHRpbWVzIGluIGJmZF9zZWN0aW9uX2Zyb21fc2hkciBpbiBlbGZjb2RlLmguCi0JKiBsaWJlbGYuaCAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBuZXcgZnVuY3Rpb24KLQlfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIHRvIGNyZWF0ZSBCRkQgc2VjdGlvbnMuICBJZiBhCi0JcmVsb2Mgc2VjdGlvbiBkb2VzIG5vdCB1c2UgdGhlIG1haW4gc3ltYm9sIHRhYmxlLCBvciBpdCBpcyBwYXJ0IG9mCi0JdGhlIHByb2Nlc3MgaW1hZ2UsIHRyZWF0IGl0IGFzIGEgbm9ybWFsIHNlY3Rpb24sIG5vdCByZWxvY3MuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIG5ldyBmdW5jdGlvbgotCV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIuCi0KLVRodSBNYXkgMTkgMTE6Mzc6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IENoYW5nZSBhcl9tYXhfbmFtZWxlbiB2YWx1ZSBmcm9tCi0JMTUgdG8gMTQgdG8gbWF0Y2ggU1ZSNCBhci4KLQotCUFkZCBzdXBwb3J0IGZvciBFTEYgc2hhcmVkIGxpYnJhcmllcy4gIExvb3NlbHkgYmFzZWQgb24gd29yayBieQotCUVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNvbT4uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkcyBmb3IgZHluYW1pYwotCWxpbmtpbmc6IGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotCWVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLQllbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0JZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotCWVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSB0eXBlIG9mIGFsaWduIGZpZWxkIHRvCi0JYmZkX3NpemVfdHlwZS4gIEFkZCBmaWVsZHMgZHluaW5keCwgZHluc3RyX2luZGV4LCB3ZWFrZGVmLAotCWVsZl9saW5rX2hhc2hfZmxhZ3MuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkcyBkeW5vYmosIGR5bnN5bWNvdW50LAotCWR5bnN0ciwgYnVja2V0Y291bnQuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luLCBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4sIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9keW5faW4sIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY19pbiwgYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luLCBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX2luLCBiZmRfZWxmNjRfc3dhcF9keW5fb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5KTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoRWxmX0V4dGVybmFsX0R5bik6IERlZmluZS4KLQkoZWxmX3N3YXBfcmVsb2NfaW4pOiBEZWZpbmUgYXMgbWFjcm8gdXNpbmcgTkFNRS4gIE1ha2UgZXh0ZXJuYWxseQotCXZpc2libGUuCi0JKGVsZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9yZWxvY2FfaW4sIGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfZHluX2luLCBlbGZfc3dhcF9keW5fb3V0KTogRGVmaW5lIGFzIG1hY3JvIHVzaW5nIE5BTUUKLQlhbmQgYXMgbmV3IGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2VjdGlvbiB0eXBlIG9mIGR5bmFtaWMgc2VjdGlvbnMgYmFzZWQgb24KLQlzZWN0aW9uIG5hbWVzLgotCShlbGZfd3JpdGVfcGhkcnMpOiBSZW1vdmUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogQWRkIG5ldyBhbGlnbiBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IHNlZ19pbmZvKTogUmVtb3ZlLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENvbXBsZXRlbHkgcmV3cml0ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBDb21wbGV0ZWx5IHJld3JpdGUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogRG9uJ3Qgc2V0IGEgZmlsZSBwb3NpdGlvbiBmb3IKLQlzZWN0aW9ucyB3aGljaCBhbHJlYWR5IGhhdmUgb25lLiAgRG9uJ3QgYm90aGVyIHRvIGFsaWduIHRoZSBmaWxlCi0JcG9zaXRpb24gaGVyZS4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IEhhbmRsZSBTSFRfSEFTSCBhbmQgU0hUX0RZTkFNSUMKLQlzZWN0aW9uIHR5cGVzLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IGZhaWxzLCBqdXN0Ci0JdXNlIGJmZF9hYnNfc2VjdGlvbiByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gZXJyb3IuCi0JKGVsZl9zaXplb2ZfaGVhZGVycyk6IE1ha2UgdXNlZnVsLgotCShlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgZHluYW1pYyBvYmplY3RzLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9hZGRfZHluYW1pY19lbnRyeSk6IERlZmluZSBhcyBtYWNybyB1c2luZyBOQU1FIGFuZCBhcyBuZXcKLQlleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2J1Y2tldHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IE5ldyBmdW5jdGlvbi4KLQkoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8pOiBBZGQgZHluc3ltX3NlYyBhbmQgaGFzaF9zZWMgZmllbGRzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBIYW5kbGUgZHluYW1pYyBsaW5raW5nLiAgQ3JlYXRlIGEgc2VjdGlvbgotCXN5bWJvbCBmb3IgYWxsIEVMRiBzZWN0aW9ucywgbm90IGFsbCBCRkQgc2VjdGlvbnMuICBTdG9yZSBzZWN0aW9uCi0Jc3ltYm9sIGluZGV4IGluIHRhcmdldF9pbmRleCBmaWVsZCwgbm90IGluZGV4IGZpZWxkLiAgVHJhdmVyc2UKLQlvdmVyIGdsb2JhbCBzeW1ib2xzIGV2ZW4gaWYgc3RyaXBwaW5nLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT3V0cHV0IGR5bmFtaWMgc3ltYm9scy4gIE1hcmsgc3ltYm9scwotCWRlZmluZWQgYnkgZHluYW1pYyBvYmplY3RzIGFzIHVuZGVmaW5lZC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWdub3JlIGR5bmFtaWMgb2JqZWN0cy4gIFVzZSB0YXJnZXRfaW5kZXgKLQlmaWVsZCBmb3Igc2VjdGlvbiByZWxvY3MsIGFuZCBtYWtlIHN1cmUgaXQgaXMgc2V0LgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IFVzZSB0YXJnZXRfaW5kZXggZmllbGQgZm9yIHNlY3Rpb24gcmVsb2NzLAotCWFuZCBtYWtlIHN1cmUgaXQgaXMgc2V0LgotCSogZWxmLmMgKGVsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgZHluaW5keCwgZHluc3RyX2luZGV4LAotCXdlYWtkZWYgYW5kIGVsZl9saW5rX2hhc2hfZmxhZ3MgZmllbGRzLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBkeW5vYmosIGR5bnN5bWNvdW50LAotCWR5bnN0ciBhbmQgYnVja2V0Y291bnQgZmllbGRzLgotCSogZWxmMzItdGFyZ2V0Lmg6IEluaXRpYWxpemUgbmV3IGR5bmFtaWMgbGlua2luZyBmaWVsZHMuCi0JKiBlbGY2NC10YXJnZXQuaDogTGlrZXdpc2UuICAKLQkqIGVsZjMyLWkzODYuYzogTmV3IGZ1bmN0aW9ucyBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuCi0JKiBlbGYzMi1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1XZWQgTWF5IDE4IDA4OjI5OjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc29tLmM6IERvbid0IGluY2x1ZGUgPHN5cy9kaXIuaD4gb3IgPHN5cy91c2VyLmg+LgotCShzb21fcmVsb2NfcXVldWVfZmluZCk6IENhbGwgbWVtY21wIGluc3RlYWQgb2YgYmNtcC4KLQkoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IENoYW5nZSBmaXJzdCBhcmd1bWVudCB0byBiZmQgKi4KLQkoY29tcGFyZV9zeW1zKTogQ2hhbmdlIHR5cGVzIG9mIGFyZ3VtZW50cyB0byBjb25zdCB2b2lkICouCi0JKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIGZvdW5kLgotCShzb21fd3JpdGVfYXJtYXApOiBBZGQgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQgYW5kIGludCBhcmd1bWVudHMuCi0JKHNvbV93cml0ZV9hcm1hcCk6IFVzZSAlbGQgYW5kIGNhc3QgdG8gbG9uZyBmb3IgZ2V0dWlkIHJlc3VsdC4KLQotV2VkIE1heSAxOCAwOTowOTozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5oIChSX0hQUEFfQUJTX0NBTEwpOiBEZWZpbmUuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIGFic29sdXRlIGNhbGxzLgotCi0JKiBzb20uaCAoUl9IUFBBX0FCU19DQUxMKTogRGVmaW5lLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogRGVsZXRlIGNvbXBsZXggcmVsb2NhdGlvbiB0eXBlcy4KLQotVHVlIE1heSAxNyAxOTozMzoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoaWNvZmZfbGl0dGxlX3ZlYywgaWNvZmZfYmlnX3ZlYyk6IEluZGljYXRlIGxlYWRpbmcKLQl1bmRlcnNjb3JlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEludGVsIHRvb2wgY2hhaW4gKGdudTk2MHYyKS4KLQotTW9uIE1heSAxNiAxMDowOToyMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi1ocHBhLmM6IENoYW5nZSAuaHBwYV9saW5rZXJfc3R1YnMgdG8gLlBBUklTQy5zdHVicywKLQlsaWtld2lzZSBmb3Igb3RoZXIgUEEgc3BlY2lmaWMgc2VjdGlvbnMuCi0JKGhwcGFfZWxmX3JlbG9jYXRlX3Vud2luZF90YWJsZSk6IERlbGV0ZSB1bnVzZWQKLQlmdW5jdGlvbi4KLQkoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBDb21wbGV0ZWx5IG5ldyB0YWJsZSBiYXNlZCBvbiA5NC0wMi0wMgotCWRyYWZ0IFBBIEVMRiBzcGVjLiAgQ2hhbmdlIHJlbG9jYXRpb24gdGFncyBhcHByb3ByaWF0ZWx5Ci0JdGhyb3VnaG91dCBlbGYzMi1ocHBhLmMKLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBSZXdyaXRlIGFuZCBzaW1wbGlmeSBiYXNlZCBvbiA5NC0wMi0wMgotCXNwZWMuCi0JKGhwcGFfZWxmX3JlbG9jKTogTGlrZXdpc2UuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IExpa2V3aXNlCi0JKEVMRl9NQUNISU5FX0NPREUpOiBDaGFuZ2UgdG8gRU1fUEFSSVNDLgotCSogZWxmMzItaHBwYS5oOiBJbmNsdWRlICJlbGYvaHBwYS5oIi4gIENoYW5nZSByZWxvY2F0aW9uIHRhZ3MgCi0JYXBwcm9wcmlhdGVseSB0aHJvdWdob3V0IGVsZjMyLWhwcGEuaC4KLQkoZWxmMzJfaHBwYV9yZWxvY190eXBlKTogTmV3IHRhYmxlIGJhc2VkIG9uIDk0LTAyLTAyIGRyYWZ0IFBBIEVMRgotCXNwZWMuCi0JKFJfSFBQQV9BQlNfQ0FMTCwgUl9IUFBBX0NPTVBMRVgqLCBSX0hQUEFfVU5XSU5EKTogRGVsZXRlIGRlZmluaXRpb25zLgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBVc2UgRU1fUEFSSVNDIGluc3RlYWQgb2YgRU1fSFBQQS4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWwpOiBEZWxldGUgdW51c2VkIEhQUEEgcmVsb2NhdGlvbnMuCi0JKiBzb20uaCAoUl9IUFBBX0FCU19DQUxMLCBSX0hQUEFfQ09NUExFWCk6IERlbGV0ZSBkZWZpbml0aW9ucy4KLQotCSogbGliaHBwYS5oIChocHBhX2ZpZWxkX2FkanVzdCk6IEF2b2lkIGFkZGluZyBjb25zdGFudF92YWx1ZSBpbnRvCi0JdGhlIGZpbmFsIHZhbHVlIHR3aWNlIGZvciBMUiBhbmQgUlIgZmllbGQgc2VsZWN0b3JzLgotCi1TYXQgTWF5IDE0IDA5OjA5OjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFiKTogVXNlIEJGRF9BU1NFUlQgbm90IGFzc2VydC4gIFRoaXMKLQlhdm9pZHMgX19lcHJpbnRmIHRyb3VibGVzLgotCi1GcmkgTWF5IDEzIDEwOjUxOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCi0KLQkqIGNvbmZpZy9taXBzYmVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgZWNvZmZfYmlnX3ZlYyBhbmQKLQllY29mZl9saXR0bGVfdmVjIHNpbmNlIElyaXggNSBzdXBwb3J0cyBFQ09GRiBleGVjdXRhYmxlcy4KLQotV2VkIE1heSAxMSAwMDozMTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSGFuZGxlIGZkci5hZHIgIT0gcGRyLmFkcgotCWNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBVc2UgfHwgaW5zdGVhZCBvZiA7IHRvIGZvcmNlIFN1bk9TCi0JbWFrZSB0byBpbnZva2UgdGhlIHNoZWxsLgotCi1UdWUgTWF5IDEwIDE0OjIzOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTRUNfQ09GRl9TSEFSRURfTElCUkFSWSk6IFJlbmFtZWQgZnJvbQotCVNFQ19TSEFSRURfTElCUkFSWSBmb3IgY2xhcml0eS4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIGlzCi0Jc2V0LCBzZXQgU1RZUF9OT0xPQUQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCk6IERvbid0IGdldCBhbiBhc3NlcnRpb24KLQlmYWlsdXJlIGJlY2F1c2Ugb2YgYSBiYWQgc2hhcmVkIGxpYnJhcnkuCi0KLU1vbiBNYXkgIDkgMTg6NTM6NDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYzogQWRkIG1pc3NpbmcgY29tbWVudCB0ZXJtaW5hdG9yLgotCi1Nb24gTWF5ICA5IDExOjUzOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSWYgaGFzaHAgYW5kICpoYXNocAotCWFyZSBub3QgTlVMTCwgYXNzdW1lIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgbG9va2VkIHVwIHRoZSBzeW1ib2wKLQlpbiB0aGUgaGFzaCB0YWJsZSBhbmQgaGFzIHN0b3JlZCB0aGUgZW50cnkgaW4gKmhhc2hwLgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogU2V0IGggdG8gTlVMTCBiZWZvcmUgY2FsbGluZwotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBEb24ndCByZXF1aXJlCi0JcGFnZSBzaGFyZWQgYmV0d2VlbiAuZGF0YSBhbmQgLmJzcyBzZWdtZW50cyB0byBjb250YWluIHplcm9lcy4KLQotCSogZWxmY29kZS5oOiBJbmNsdWRlIGJmZGxpbmsuaC4gIEFkZGVkIHNldmVyYWwgbmV3IGZ1bmN0aW9ucyB0byBkbwotCWxpbmtpbmcuCi0JKEVMRl9SX1RZUEUpOiBEZWZpbmUuCi0JKGJmZF9hZGRfdG9fc3RydGFiKTogUmV0dXJuIHVuc2lnbmVkIGxvbmcuICBDaGFuZ2UgY2hlY2sgZm9yCi0JcmVhbGxvYyBmYWlsdXJlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfYWRkX3RvX3N0cnRhYi4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCBsaW5rX2luZm8gYXJndW1lbnQuCi0JQ2FsbCBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nIGhvb2sgYW5kIHByZXBfaGVhZGVycwotCWhlcmUuICBPbmx5IGNhbGwgc3dhcF9vdXRfc3ltcyBpZiBsaW5rX2luZm8gaXMgTlVMTC4gIFNldCB1cAotCS5zaHN0cnRhYiBzZWN0aW9uIGhlcmUuICBQYXNzIGRvc3ltcyBhcmd1bWVudCB0bwotCWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzLiAgU2V0IG91dHB1dF9oYXNfYmVndW4gZmxhZy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBBZGQgZG9zeW1zCi0JYXJndW1lbnQsIGFuZCB1c2UgaXQgdG8gY29udHJvbCBzZXR0aW5nIC5zeW10YWIgYW5kIC5zdHJ0YWIgZmlsZQotCXBvc2l0aW9ucy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBZGQgZG9zeW1zIGFyZ3VtZW50LCBhbmQKLQlwYXNzIGl0IG9uLgotCShwcmVwX2hlYWRlcnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX2FkZF90b19zdHJ0YWIuCi0JKHN3YXBfb3V0X3N5bXMpOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IHNldCB1cCAuc2hzdHJ0YWIgaGVyZS4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBTb21lIGNhbGxzIG1vdmVkIGludG8KLQllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNITl9MT1JFU0VSViBjb3JyZWN0ZWQgdG8gU0hOX0xPUkVTRVJWRS4KLQkqIGxpYmVsZi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGNvbGxlY3QsCi0JZWxmX2FkZF9zeW1ib2xfaG9vaywgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbi4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIGZpZWxkIHJlbF9oYXNoZXMuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIGZpZWxkcyBpbnRlcm5hbF9zeW1zIGFuZCBzeW1ib2xzLgotCUFkZCBmaWVsZCBzeW1faGFzaGVzLgotCShvYmpfc3ltYm9scywgb2JqX2ludGVybmFsX3N5bXMpOiBSZW1vdmUgZGVmaW5pdGlvbnMuCi0JKGVsZl9zeW1faGFzaGVzKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZl9saW5rX2hhc2hfbG9va3VwKTogRGVmaW5lLgotCShlbGZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lLgotCShlbGZfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKiBlbGYuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGVsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgbm90IGRlZmluZWQsCi0JZGVmaW5lIGFzIDAgYW5kIHVzZSBnZW5lcmljIGxpbmtlci4gIE90aGVyd2lzZSwgdXNlIEVMRiBiYWNrZW5kCi0JbGlua2VyLgotCShlbGZfYmFja2VuZF9jb2xsZWN0KTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyBmYWxzZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgotCShlbGYzMl9iZWQpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKiBlbGY2NC10YXJnZXQuaDogU2FtZSBjaGFuZ2VzIGFzIGVsZjMyLXRhcmdldC5oLgotCSogZWxmMzItaTM4Ni5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGVsZjMyLXNwYXJjLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShlbGZfaW5mb190b19ob3d0byk6IENoYW5nZSB0eXBlIG9mIGRzdCBmcm9tIEVsZjMyX0ludGVybmFsX1JlbGEKLQl0byBFbGZfSW50ZXJuYWxfUmVsYSAodGhleSdyZSB0aGUgc2FtZSB0eXBlIGFueWhvdykuCi0JKGVsZl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF9jb2xsZWN0KTogRGVmaW5lLgotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IEF2b2lkIHVzZWxlc3MgbWFrZSBlcnJvciBtZXNzYWdlIGluIGEKLQlkaWZmZXJlbnQgd2F5OyB0b3VjaCB0YWtlcyBhIG51bWVyaWMgYXJndW1lbnQgb24gc29tZSBzeXN0ZW1zLgotCi1GcmkgTWF5ICA2IDEzOjM0OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IFJld29yayBjdXN0b20gaGVhZGVyCi0JaGFuZGxpbmcgZm9yIGxhdGVzdCBzdWdnZXN0ZWQgZm9ybWF0LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBMaWtld2lzZS4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCi1GcmkgTWF5ICA2IDExOjExOjUwIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IGhhbmRsZSBlcnJpY3Nzb24gY29uZmlnIChmb3IgT1NFKS4KLQotVGh1IE1heSAgNSAxNTo0MDo0NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgotCSogbWlwc2JzZC5jIChtaXBzX2ZpeF9qbXBfYWRkcik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19maXhfaGkxNl9zKTogVXNlIGJmZF9pc19jb21fc2VjdGlvbi4KLQkobWlwc19ob3d0b190YWJsZV9leHQpOiBDYWxsIG1pcHNfZml4X2ptcF9hZGRyIGZvciBNSVBTX1JFTE9DX0pNUC4KLQotRnJpIE1heSAgNiAxMTo0ODo1NSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogWFggc3VwcG9ydC4KLQotCUZyb20gYmlsbAotCSogTWFrZWZpbGUuaW46IEJ1aWxkIHN5c2RlcC5oIHdpdGhvdXQgY2F1c2luZyB3b3JyeWluZyBidXQKLQloYXJtbGVzcyBlcnJvciBtZXNzYWdlLgotCi1XZWQgTWF5ICA0IDExOjA5OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCUNoYW5nZWQgbTY4ay1hb3V0IHRvIHNldCBmbGFncyB0byAwOyBtNjhrLXN1bm9zIHN0aWxsIHVzZXMgMS4KLQkqIGFvdXQwLmM6IE5ldyBmaWxlLgotCSogdGFyZ2V0cy5jIChhb3V0MF9iaWdfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYW91dDBfYmlnX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1hb3V0Kik6IFVzZSBtNjhrLTBhb3V0LCBub3QgbTY4ay1hb3V0LgotCSogY29uZmlnL202OGstYW91dC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmVkLgotCSogY29uZmlnL202OGstMGFvdXQubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChhb3V0MF9iaWdfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3I6IHVzZSBhb3V0MC5vLAotCWFvdXQzMi5vIGFuZCBzdGFiLXN5bXMuby4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dDAuby4KLQkoQ0ZJTEVTKTogQWRkIGFvdXQwLmMuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkIGV4ZWNfaGRyX2ZsYWdzLgotCSogYW91dC10YXJnZXQuaCAoTVlfZXhlY19oZHJfZmxhZ3MpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCi0JTVkoYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGFvdXRmMS5oIChzdW5vc18zMl9zZXRfYXJjaF9tYWNoKTogTWFrZSBzdGF0aWMuCi0JKGFvdXQzMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGZsYWdzIGZyb20gYmFja2VuZAotCWluZm8uCi0JKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGFvdXQtZW5jYXAuYyAoZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGZsYWdzIGZyb20KLQliYWNrZW5kIGluZm8uCi0JKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogRGVmaW5lIGFzIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURS4KLQkqIGhwMzAwaHB1eC5jIChNWV9leGVjX2hkcl9mbGFncyk6IERlZmluZSBhcyAweDIuCi0JKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBTZXQgZmxhZ3MgZnJvbSBiYWNrZW5kIGluZm8uCi0JKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGkzODZtYWNoMy5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jIChOQU1FKGFvdXQsc3BhcmNseW54X3dyaXRlX29iamVjdF9jb250ZW50cykpOiBTZXQKLQlmbGFncyBmcm9tIGJhY2tlbmQgaW5mby4KLQkoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0KLVdlZCBNYXkgIDQgMDI6NTY6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKGkzODYtKi1nbnUqKTogVHJlYXQgbGlrZSBpMzg2LSotbWFjaCouCi0JKG02OCotYXBvbGxvLSopOiBUcmVhdCBhbGwgQXBvbGxvIGNvbmZpZ3MgdGhlIHNhbWUsIGRvbid0IGhhbmRsZQotCUJTRCBzcGVjaWFsbHkuCi0KLVR1ZSBNYXkgIDMgMTk6NDM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjYWNoZS5jOiBSZXdyb3RlIHRvIHdvcmsgY29ycmVjdGx5LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBvcG5jbHMuYyAoYmZkX2NhY2hlX2luaXQsIGJmZF9vcGVuX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZmRvcGVucik6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfY2FjaGVfaW5pdC4KLQotRnJpIEFwciAyOSAxNTowODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNmLW02OGtseW54LmMgKENBTENfQURERU5EKTogQ2hlY2sgZm9yIFBDIHJlbGF0aXZlIHJlbG9jcyBieQotCWVudW1lcmF0aW5nIHRoZW0sIHNpbmNlIHRoZSByZWxvYyB0eXBlIGNhbiBub3Qgc2VydmUgYXMgYW4gaW5kZXgKLQlpbnRvIHRoZSBtNjhrIENPRkYgaG93dG9fdGFibGUuCi0KLUZyaSBBcHIgMjkgMDk6NDI6MzkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy5iZmQgKCotZ28zMik6IENoYW5nZWQgdG8gY29mZi4KLQkqIGNvZmYtaDgzMDAuYyAoSk1QTDEpOiBHZXQgSE9XVE8gcmlnaHQgZm9yIDI0Yml0IGJyYW5jaGVzLgotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBXcml0ZSBvdXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mCi0Jc3ltYm9scyBhbmQgZG9uJ3Qgc3RpY2sgaW4gZXh0cmEgbnVsbHMuCi0KLVR1ZSBBcHIgMjYgMTU6MDc6MjQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjZi1zcGFyY2x5bnguYyAoTFlOWE9TLCBDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCSogY29mZi1zcGFyYy5jIChCQURNQUcpOiBSZWNvZ25pemUgTFlOWENPRkZNQUdJQy4KLQkoQ09GRl9TUEFSQyk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IElmIENPRkZfU1BBUkMsIHNldCBhbGlnbm1lbnQKLQlwb3dlciBvZiBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdG8gMy4KLQkqIGhvc3RzL2x5bnguaCAoX19MWU5YT1MpOiBEZWZpbmUuCi0KLVR1ZSBBcHIgMjYgMTU6MDQ6MjYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBBZGp1c3QgdGhlIGFkZGVuZCBvZiByZWxvY2F0aW9ucwotCWFnYWluc3Qgc2VjdGlvbiBzeW1ib2xzIHRvIGF2b2lkIGxvc2luZyBkdXJpbmcgbGQgLXIuCi0KLVR1ZSBBcHIgMjYgMTI6MTY6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHNoc3RydGFiX2xlbmd0aF9maXhlZCk6IFJlbW92ZSB1c2VsZXNzIHN0YXRpYwotCXZhcmlhYmxlLgotCShzdHJ1Y3QgZWxmX3NlY3RfZGF0YSk6IFJlbW92ZSB1bnVzZWQgc3RydWN0dXJlLgotCShlbGZfb2JqZWN0X3ApOiBGcmVlIG1lbW9yeSBpZiBlcnJvciBvY2N1cnMuICBDaGVjayByZXR1cm4gdmFsdWUKLQlvZiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLiAgSWYgZWxmX2dldF9zdHJfc2VjdGlvbiBmYWlscywKLQlwcmVzZXJ2ZSBlcnJvciBjb2RlIHJhdGhlciB0aGFuIHNldHRpbmcgd3JvbmdfZm9ybWF0LgotCShudWxsX3NoZHIpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogUmVtb3ZlIHNoc3RydGFiX2xlbmd0aF9maXhlZCBhc3NpZ25tZW50LgotCUFsbG9jYXRlIGZpcnN0IHNlY3Rpb24gaGVhZGVyIG9uIEJGRCBvYnN0YWNrIHJhdGhlciB0aGFuIHVzaW5nCi0JbnVsbF9zaGRyLgotCShiZmRfcHJwc2luZm8pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIG5ld3NlY3QuCi0KLU1vbiBBcHIgMjUgMTU6MzE6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IFVuZG8gcGF0Y2ggb2YgQXByIDEwOyBicmVha3MgU29sYXJpcy4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQl0byBjcmVhdGUgc2VjdGlvbnMuICBDaGVjayByZXR1cm4gdmFsdWUgb2YgcmVjdXJzaXZlIGNhbGxzLgotCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX21ha2Vfc2VjdGlvbi4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX29iamVjdF9wKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZWN0aW9uX2Zyb21fc2hkci4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IExpa2V3aXNlLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleC4KLQkoYmZkX3Byc3RhdHVzKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfbWFrZV9zZWN0aW9uLgotCShiZmRfZnByZWdzZXQpOiBMaWtld2lzZS4KLQkoYmZkX3BycHNpbmZvKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuCi0JKGVsZl9jb3JlZmlsZV9ub3RlKTogQ2hlY2sgcmV0dXJuIHZhbHVlcyBvZiBiZmRfcHJzdGF0dXMsCi0JYmZkX2ZwcmVnc2V0LCBhbmQgYmZkX3BycHNpbmZvLgotCShlbGZfY29yZV9maWxlX3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgZWxmX2NvcmVmaWxlX25vdGUuCi0KLUZyaSBBcHIgMjIgMTE6MDg6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JR2V0IHJpZCBvZiB0aGUgRUNPRkYgLnJlZ2luZm8gc2VjdGlvbiBoYWNrLgotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IERvbid0IGNyZWF0ZSBhIC5yZWdpbmZvIHNlY3Rpb24uCi0JKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEb24ndCBoYW5kbGUgdGhlIC5yZWdpbmZvIHNlY3Rpb24uCi0JKGVjb2ZmX3NpemVvZl9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSB0aGUgR1AgdmFsdWUgYW5kIHRoZQotCXJlZ2lzdGVyIG1hc2tzLgotCShiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfc2V0X3JlZ21hc2tzKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCShiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkoYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQlGaXggRUNPRkYgb2JqY29weSB0byBhY3R1YWxseSBjb3B5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2dldF9leHRyKTogQXNzdW1lIHRoYXQgYW55IEVDT0ZGIHN5bWJvbCB3aXRoIGxvY2FsIGNsZWFyIGlzCi0JYW4gZXh0ZXJuYWwgc3ltYm9sLCByYXRoZXIgdGhhbiBjaGVja2luZyB0aGUgc3ltYm9sIGZsYWdzLiAgT25seQotCWNoZWNrIHRoZSBmbGFncyBmb3Igbm9uLUVDT0ZGIHN5bWJvbHMuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyk6IERvbid0IGNyYXNoIGlmIHRoZQotCW91dHB1dF9zZWN0aW9uIGZpZWxkIG9mIHRoZSBzeW1ib2wgc2VjdGlvbiBpcyBOVUxMLgotCSogbGliZWNvZmYuaCAoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUgYXMKLQlmdW5jdGlvbiByYXRoZXIgdGhhbiBkZWZpbmluZyBhcyBtYWNyby4KLQotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogU2V0IGJmZF9lcnJvcl9nb3Rfd3JvbmdfZm9ybWF0IGlmCi0JYXBwcm9wcmlhdGUuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjMyX3Bvd2VycGNfdmVjLgotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBBY2NlcHQgYmZkX2FyY2hfbTY4ayBhcyB3ZWxsIGFzCi0JYmZkX2FyY2hfdW5rbm93bi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guCi0JKiBlbGZjb2RlLmggKGVsZl9zZXRfYXJjaF9tYWNoKTogRG9uJ3QgY2hlY2sgYSBsaXN0IG9mIEVMRgotCWFyY2hpdGVjdHVyZXMsIGp1c3Qgc2VlIGlmIHRoZSBkZXNpcmVkIGFyY2hpdGVjdHVyZSBtYXRjaGVzIHdoYXQKLQl0aGUgRUxGIGJhY2tlbmQgcGVybWl0cy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZW5hbWUgU0hNQUdJQyB0bwotCVNIX0FSQ0hfTUFHSUMgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvc2guaC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBMaWtld2lzZS4KLQotCUZvbGxvdyBjb252ZW50aW9uIGluIHdoaWNoIGVhY2ggTkxNIGhlYWRlciBoYXMgYW4gOCBieXRlIHN0YW1wCi0JZm9sbG93ZWQgYnkgYSBmb3VyIGJ5dGUgbGVuZ3RoLgotCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogUmVuYW1lIG5sbV9jeWdudXNfc2VjdGlvbl9oZHIKLQl0byBubG1fY3lnbnVzX2V4dF9oZWFkZXIsIGFuZCBjaGFuZ2UgdHlwZSB0bwotCU5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlci4KLQkobmxtX2N5Z251c19leHRfaGVhZGVyKTogUmVuYW1lIGZyb20gbmxtX2N5Z251c19zZWN0aW9uX2hlYWRlci4KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBVc2UgQ3lHblVzRXggaW5zdGVhZAotCW9mIEN5R25Vc1NlQ3MuICBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbiB0byBjeWdudXNfZXh0LiAgUmVxdWlyZQotCWxlbmd0aCB3b3JkIHRvIGJlIDguCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9uIHRvCi0JY3lnbnVzX2V4dC4gIFNldCBsZW5ndGggd29yZCB0byA4LgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb24KLQl0byBjeWdudXNfZXh0LgotCi1UaHUgQXByIDIxIDIyOjU0OjIyIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiAgS2VlcCBzZWN0aW9uIHRhYmxlCi0JKGZyb20gQ3lHblVzU2VDcykgaW4gbW9yZSBwZXJtYW5lbnQgbWVtb3J5IHRvIGtlZXAgc2VjdGlvbiBuYW1lcwotCWZyb20gZ2V0dGluZyB0cmFzaGVkLgotCi1UaHUgQXByIDIxIDA5OjI5OjM3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbGliZWxmLmggKGVsZl9vYmpfdGRhdGEpOiAgQWRkIG1lbWJlcnMgZm9yIGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0JaGFuZGxpbmcuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBIYW5kbGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgVGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcgotCXRvIHNlbGVjdCBzdGF0aWMgb3IgZHluYW1pYyBzeW1ib2wgdGFibGUgYW5kIHJldHVybiBudW1iZXIgb2YKLQlzeW1ib2xzIHNsdXJwZWQgb3IgLTEgb24gZXJyb3IuCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc3ltdGFiKTogIFNldCBiZmQgc3ltY291bnQgZnJvbQotCWVsZl9zbHVycF9zeW1ib2xfdGFibGUgcmVzdWx0LgotCSogZWxmY29kZS5oIChlbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLAotCWVsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiAgTmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgZHluYW1pYwotCXN5bWJvbCB0YWJsZS4KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaCAoQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyk6Ci0JQ2hhbmdlIHRvIGhhbmRsZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgcHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zCi0JZm9yIGR5bmFtaWMgcmVsb2NzLgotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkLCBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSwKLQlOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pLCBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQsCi0JYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiAgSGFuZGxlIHJfam1wdGFibGUgYW5kIHJfcmVsYXRpdmUKLQlyZWxvY2F0aW9ucy4KLQotVGh1IEFwciAyMSAxMTo1ODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDbGVhbiB1cCB1c2VzIG9mIF9iZmRfZHVtbXlfdGFyZ2V0IChmcm9tIFBldGVyIFNjaGF1ZXIpLgotCSogbGliYmZkLmMgKF9iZmRfZHVtbXlfdGFyZ2V0KTogU2V0IGJmZF9lcnJvcl93cm9uZ19mb3JtYXQuCi0JKiBubG0tdGFyZ2V0LmggKG5sbV9jb3JlX2ZpbGVfcCk6IERlZmluZSBhcyBfYmZkX2R1bW15X3RhcmdldCwgbm90Ci0JTlVMTC4KLQkqIHNyZWMuYyAoc3JlY192ZWMpOiBVc2UgX2JmZF9kdW1teV90YXJnZXQsIG5vdCBOVUxMLCBpbgotCV9iZmRfY2hlY2tfZm9ybWF0LgotCShzeW1ib2xzcmVjX3ZlYyk6IExpa2V3aXNlLgotCSogdGVraGV4LmMgKHRla2hleF92ZWMpOiBMaWtld2lzZS4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogQWRkIG5sbV9jeWdudXNfc2VjdGlvbl9oZHIKLQlmaWVsZC4KLQkobmxtX2N5Z251c19zZWN0aW9uX2hlYWRlcik6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogRnJlZSBuZXcgdGRhdGEgc3RydWN0dXJlIGlmIGZhaWx1cmUuCi0JQWRkIGZpeGVkIHNlY3Rpb25zIGJlZm9yZSBzd2FwcGluZyBpbiBhdXhpbGlhcnkgaGVhZGVycy4gIEFmdGVyCi0JYWRkaW5nIHNlY3Rpb25zLCB0cmVhdCBlcnJvcnMgYXMgcmVhbCwgbm90IGFzIHdyb25nIGZvcm1hdC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBTd2FwIGluIHRoZSBzZWN0aW9ucyBoZWFkZXI7IGFkZAotCXNlY3Rpb25zIHRvIHRoZSBCRkQgZm9yIGVhY2ggc2VjdGlvbiBpdCBkZXNjcmliZXMuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFN3YXAgb3V0IHRoZSBzZWN0aW9ucyBoZWFkZXIuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBY2NvdW50IGZvciB0aGUgc2l6ZSBvZiB0aGUKLQlzZWN0aW9ucyBoZWFkZXIuCi0KLVdlZCBBcHIgMjAgMTY6NDU6NTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogQ2hhbmdlIG1pbmltdW0gYWxpZ25tZW50IHBvd2VyIHRvCi0JMiwgc28gdGhhdCBzdGFiIHNlY3Rpb25zIGNhbiBiZSBtdWx0aXBsZXMgb2YgNCBieXRlcyBvbmx5LgotCi0JKiBob3N0cy9pMzg2YWl4Lmg6IENoYW5nZXMgdG8gYXZvaWQgcHJvdG90eXBlcyBjb25mbGljdHMgd2l0aCB0aGUKLQlvbmVzIGRlZmluZWQgaW4gc3RkbGliLmguICAoRnJvbSBNaW5oIFRyYW4tTGUuKQotCi1XZWQgQXByIDIwIDE0OjE1OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtMzItcHBjLmM6IENvbXBsZXRlIHJld3JpdGUgZm9yIG5ldyB2ZXJzaW9uIG9mIFBvd2VyUEMKLQlOZXRXYXJlLiAgT2xkIGNvZGUgc3RpbGwgcHJlc2VudCwgYnV0IGlmZGVmZmVkIG91dC4KLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IERvbid0IGFzc3VtZSBhCi0JcGFydGljdWxhciBmb3JtYXQgZm9yIHRoZSBjdXN0b21lciBoZWFkZXIuICBBbGxvY2F0ZSBhIGJsb2NrIG9mCi0JbWVtb3J5IGFuZCByZWFkIGl0IGludG8gdGhhdC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogV3JpdGUgb3V0IHRoZSBibG9jayBvZiBtZW1vcnkuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJbmNsdWRlIGxlbmd0aCBvZiBjdXN0b21lcgotCWhlYWRlciB3aGVuIGNvbXB1dGluZyBpdHMgc2l6ZS4KLQotTW9uIEFwciAxOCAxNDoyNzoxNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBHZXQgdGhlIHNwYWNlJ3MgbnVtYmVyIGZyb20gdGhlCi0JYmFja2VuZCBwcml2YXRlIHNlY3Rpb24gZGF0YSByYXRoZXIgdGhhbiB0YXJnZXRfaW5kZXguCi0JKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IFN0b3JlIHRoZSBzcGFjZSdzIG51bWJlcgotCWluIHRoZSBiYWNrZW5kIHByaXZhdGUgc2VjdGlvbiBkYXRhIHJhdGhlciB0aGFuIHRhcmdldF9pbmRleC4KLQotCSogc29tLmggKHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KTogQWRkIHNwYWNlX251bWJlci4KLQotRnJpIEFwciAxNSAxMjoyMjowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jIChyZWxvY19wcm9jZXNzaW5nKTogQWx3YXlzIHNldCB0aGUgYWRkcmVzcyBvZiBhCi0JUl9JSENPTlNUIHJlbG9jIHRvIHRoYXQgb2YgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBSX0lISUhBTEYuCi0JZ2FzIGRvZXMgdGhpcyBhbnlob3csIGJ1dCBzb21lIG90aGVyIGFzc2VtYmxlcnMgc2VlbSB0byBsZWF2ZQotCWdhcmJhZ2UgaW4gdGhlIFJfSUhDT05TVCBhZGRyZXNzIGZpZWxkLgotCi0JKiBiZmQvYXJjaGl2ZS5jOiBDb25zaXN0ZW50bHkgdXNlIEFSRk1BRzsgZnJvbQotCXNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSAoQW5kcmVhcyBTY2h3YWIpLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBVc2UgQVJGTUFHIHJhdGhlciB0aGFuICdgJyBhbmQKLQknXDAxMicuCi0JKGJzZF93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QgbG9jYWwKLQlyZWxvY3MgYWdhaW5zdCB0aGUgLnRleHQgc2VjdGlvbiBhcyByZXF1aXJlZC4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IFdoZW4gcmVsYXhpbmcsIGFkanVzdAotCVBEUiBhZGRyZXNzZXMgYXMgcmVxdWlyZWQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2VtaXRfYWdncmVnYXRlKTogVGFrZSBmZHIgYXJndW1lbnQuICBNYXAgZmRyCi0JaW5kZXggdGhyb3VnaCByZmQgbWFwIGlmIGl0IGV4aXN0cy4gIENoZWNrIGZvciBhIGNvdXBsZSBvZiBjYXNlcwotCXdoaWNoIGdkYiBoYW5kbGVzIHNwZWNpYWxseS4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfdHlwZV90b19zdHJpbmcpOiBUYWtlIGZkciBhcmd1bWVudCByYXRoZXIgdGhhbiBhdXhfcHRyIGFuZAotCWJpZ2VuZGlhbiBhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfcHJpbnRfc3ltYm9sKTogSGFuZGxlIHN0U3RydWN0LCBzdFVuaW9uIGFuZCBzdEVudW0uCi0KLVRodSBBcHIgMTQgMTM6MDU6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBkdW1teSBlbnRyaWVzIHRvIGFjY291bnQgZm9yCi0JbnVtYmVyaW5nIGNoYW5nZXMgaW4gaW5jbHVkZS9jb2ZmL21pcHMuaC4gIEFkZCBlbnRyaWVzIGZvcgotCU1JUFNfUl9SRUxISSBhbmQgTUlQU19SX1JFTExPLgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4pOiBIYW5kbGUgYW4gZXh0cmEgYml0IGZvciB0aGUgcmVsb2MgdHlwZQotCXdoZW4gbGl0dGxlIGVuZGlhbi4gIFRyZWF0IGludGVybmFsIE1JUFNfUl9SRUxMTyBvciBNSVBTX1JfUkVMSEkKLQlyZWxvY3MgbGlrZSBNSVBTX1JfU1dJVENILCBhbmQgY29udmVydCByX29mZnNldCBmcm9tIDI0IHRvIDMyCi0JYml0cy4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IEhhbmRsZSBpbnRlcm5hbCBNSVBTX1JfUkVMTE8gb3IKLQlNSVBTX1JfUkVMSEkgcmVsb2NzIGxpa2UgTUlQU19SX1NXSVRDSC4KLQkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKG1pcHNfcmVsaGlfYWRkciwgbWlwc19yZWxoaV9hZGRlbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWlwc19yZWxoaV9yZWxvYywgbWlwc19yZWxsb19yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVHVybiBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGludG8KLQlNSVBTX1JfUkVMSEkgYW5kIHR1cm4gQkZEX1JFTE9DX1BDUkVMX0xPMTYgaW50byBNSVBTX1JfUkVMTE8uCi0JKG1pcHNfcmVsb2NhdGVfaGkpOiBSZW5hbWUgZnJvbSBtaXBzX3JlbG9jYXRlX3JlZmhpLCBhbmQgYWRkIHBjcmVsCi0JYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgZ290X3JlZmxvIHRvIGdvdF9sbyBhbmQKLQlyZWZsb19pbnRfcmVsIHRvIGxvX2ludF9yZWwuICBIYW5kbGUgTUlQU19SX1JFTExPIGFuZCBNSVBTX1JfUkVMSEkKLQlyZWxvY3MuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IEFkanVzdCBNSVBTX1JfUkVMSEkvTUlQU19SX1JFTExPIHBhaXJzIHdoZW4KLQlleHBhbmRpbmcgYSBQQyByZWxhdGl2ZSBjYWxsLgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUwotCWFuZCBCRkRfUkVMT0NfUENSRUxfTE8xNi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotV2VkIEFwciAxMyAxMTo1MDowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IFNldCBtaW5pbXVtIGFsaWdubWVudCBwb3dlciB0byAzLgotCi1UdWUgQXByIDEyIDEzOjM2OjIwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEFsd2F5cyBlbWl0IGF0IGxlYXN0Ci0gICAgICAgIG9uZSByZWxvY2F0aW9uIGZvciBhbnkgbm9uLWJzcyBzZWN0aW9uLgotCi1Nb24gQXByIDExIDE0OjQxOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IHJlcXVpcmUKLQl0aGUgZmlsZSBhbGlnbm1lbnQgdG8gY29ycmVzcG9uZCB0byB0aGUgcGFnZSBzaXplIHdoZW4gbGlua2luZwotCXdpdGggLU4uCi0KLVN1biBBcHIgMTAgMDE6MDI6MjQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRm9yIHJlbGEgcmVsb2NhdGlvbnMsIGFkanVzdCB0aGUKLQlhZGRlbmQgZm9yIHJlbG9jYXRpb25zIGludm9sdmluZyBzZWN0aW9uIHN5bWJvbHMgdG8gYWNjb3VudAotCWZvciB0aGUgbG9zc2FnZSBvZiAxOjEgbWFwcGluZyBmcm9tIGlucHV0IHNlY3Rpb24gc3ltYm9scyB0bwotCW91dHB1dCBzZWN0aW9uIHN5bWJvbHMuCi0KLUZyaSBBcHIgIDggMTI6MjI6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQ2FsbCBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykKLQlyYXRoZXIgdGhhbiBtYWtpbmcgc2VjdGlvbnMgaW5saW5lLgotCShOQU1FKGFvdXQsbWtvYmplY3QpKTogRG9uJ3QgbWFrZSBhbnkgc2VjdGlvbnMuCi0JKE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpKTogQ2FsbCBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGRlcmVmZXJlbmNlIG9ial90ZXh0c2VjIChhYmZkKSBvcgotCW9ial9kYXRhc2VjIChhYmZkKSBpZiB0aGV5IGFyZSBOVUxMLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykpOiBEZWNsYXJlLgotCSogYm91dC5jIChiX291dF9ta29iamVjdCk6IERvbid0IG1ha2UgYW55IHNlY3Rpb25zLgotCShiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGFvdXRfMzJfbWFrZV9zZWN0aW9ucy4KLQkoYl9vdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGkzODZvczlrLmMgKG9zOWtfbWtvYmplY3QpOiBEb24ndCBtYWtlIGFueSBzZWN0aW9ucy4KLQkob3M5a193cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGFvdXRfMzJfbWFrZV9zZWN0aW9ucy4KLQkob3M5a19zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykpOiBEb24ndCBzZXQgTl9FWFQgaW4gdGFyZ2V0Ci0JaW5kZXguCi0KLVdlZCBBcHIgIDYgMjA6NDQ6NTYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogIEFkZCBtaXBzLSotc3lzdjQqIHN1cHBvcnQuCi0KLVRodSBBcHIgIDcgMTQ6MjM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IgTUlQU19SX1NXSVRDSC4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX2luKTogRm9yIE1JUFNfUl9TV1RJQ0gsIGNvcHkgcl9zeW1uZHggaW50bwotCXJfb2Zmc2V0IGFuZCBzZXQgcl9zeW1uZHggdG8gUkVMT0NfU0VDVElPTl9URVhULgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogRm9yIE1JUFNfUl9TV0lUQ0gsIGdldCB0aGUgcl9zeW1uZHgKLQl2YWx1ZSBmcm9tIHRoZSByX29mZnNldCBmaWVsZC4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBNYXhpbXVtIHJfdHlwZSB2YWx1ZSBpcyBub3cgTUlQU19SX1NXSVRDSC4KLQlGb3IgTUlQU19SX1NXSVRDSCwgY29weSB0aGUgcl9vZmZzZXQgZmllbGQgaW50byB0aGUgYWRkZW5kIGZpZWxkLgotCShtaXBzX2FkanVzdF9yZWxvY19vdXQpOiBGb3IgTUlQU19SX1NXSVRDSCwgY29weSB0aGUgYWRkZW5kIGZpZWxkCi0JaW50byB0aGUgcl9vZmZzZXQgZmllbGQuCi0JKG1pcHNfc3dpdGNoX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFRyYW5zbGF0ZSBCRkRfUkVMT0NfR1BSRUwzMiBpbnRvCi0JTUlQU19SX1NXSVRDSC4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIE1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IEFkanVzdCBNSVBTX1JfU1dJVENIIG9mZnNldCBpZiBuZWNlc3NhcnkuCi0KLVRodSBBcHIgIDcgMTE6MTA6NTEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3VwcG9ydCBjYWxsaW5nIHRoZSBiYWNrZW5kCi0JZnVuY3Rpb24gZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyB3aGVuIGp1c3QgYmVnaW5uaW5nIHRvCi0Jd3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQotCSogZWxmezMyLDY0fS10YXJnZXQuaCAoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IFByb3ZpZGUKLQlhIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkoZWxmezMyLDY0fV9iZWQpOiBBZGQgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZy4KLQkKLQkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfdGNfc3ltYm9sKTogRGVsZXRlIGV4dGVybiBkZWNsYXJhdGlvbi4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1ocHBhLmMgKHN5bWV4dF9jaGFpbl9idWlsdCk6IERlbGV0ZS4KLQkoc3ltZXh0X2NoYWluX3NpemUpOiBSZW5hbWVkIGZyb20gc3ltZXh0bl9jb250ZW50c19yZWFsX3NpemUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF97YmVnaW4sZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb25zLgotCShhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluKTogTmV3IGZ1bmN0aW9uLgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElnbm9yZSB3cml0ZXMgdG8gdGhlIHN5bWJvbCBleHRlbnNpb24KLQlzZWN0aW9uIHVudGlsIGl0J3MgYmVlbiByZWJ1aWx0IGludGVybmFsbHkuCi0JKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIGlzIG5vCi0JbG9uZ2VyIHNwZWNpYWwuCi0JKGVsZl9iYWNrZW5kX3tiZWdpbixmaW5hbH1fd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IFNpbXBsaWZ5IG5vdyB0aGF0IG11Y2ggY29kZSBoYXMKLQltaWdyYXRlZCBpbnRvIGVsZjMyX2hwcGFfYmFja2VuZF97YmVpbmcsZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcuCi0KLVdlZCBBcHIgIDYgMTc6MjQ6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIG5ldyB0YXJnZXQgdmVjdG9ycyB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbHMgYW5kIGR5bmFtaWMKLQlyZWxvY3MuICBDaGFuZ2UgYS5vdXQgdG8gdXNlIHRoZXNlIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGR5bmFtaWMKLQlzeW1ib2xzIGFuZCByZWxvY3MgYWxvbmcgd2l0aCB0aGUgbm9ybWFsIHN5bWJvbHMgYW5kIHJlbG9jcy4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBmaWVsZHMKLQlfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiwKLQlfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLAotCV9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MuCi0JKEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMpOiBEZWZpbmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKToKLQlEZWZpbmUuCi0JKF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlZmluZS4KLQkoX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgotCSogYmZkLmMgKGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWZpbmUuCi0JKGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgotCSogc3Vub3MuYyAoTVlfcmVhZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX3JlYWRfZHluYW1pY19yZWxvY3MpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVmaW5lLgotCShNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBkeW5zeW1fY291bnQgYW5kCi0JZHlucmVsX2NvdW50IHRvIGxvbmcuICBBZGQgZmllbGRzIGNhbm9uaWNhbF9keW5zeW0gYW5kCi0JY2Fub25pY2FsX2R5bnJlbC4KLQkoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBDaGVjayB0aGF0IEJGRCBoYWQgRFlOQU1JQyBmbGFnIHNldC4KLQlDbGVhciBpbmZvLT5jYW5vbmljYWxfZHluc3ltIGFuZCBpbmZvLT5jYW5vbmljYWxfZHlucmVsLgotCShNWShyZWFkX2R5bmFtaWNfc3ltYm9scykpOiBSZW1vdmVkLgotCShNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IFJlbW92ZWQuCi0JKHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLgotCShzdW5vc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJhb3V0Lmg6IERlY2xhcmUgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCBhbmQKLQlyZWxvY19zdGRfZXh0ZXJuYWwgdG8gYXZvaWQgcHJvdG90eXBlIHByb2JsZW1zLgotCShzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgZmllbGRzIHJlYWRfZHluYW1pY19zeW1ib2xzIGFuZAotCXJlYWRfZHluYW1pY19yZWxvY3MuCi0JKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogRGVjbGFyZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IFJlbmFtZWQgZnJvbQotCXRyYW5zbGF0ZV9zeW1ib2xfdGFibGUgYW5kIG1hZGUgbm9uLXN0YXRpYy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgcmVhZCBkeW5hbWljIHN5bWJvbHMuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBEb24ndCByZWFkIGR5bmFtaWMgcmVsb2NzLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IERvbid0IGNvdW50IGR5bmFtaWMgcmVsb2NzLgotCSogYW91dGYxLmggKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGJvdGhlciB0bwotCXJlbW92ZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJlbG9jcy4gIFRoZXkgd2lsbCBubyBsb25nZXIgYmUKLQlwcmVzZW50LgotCShNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IERvbid0IGluaXRpYWxpemUgZHluYW1pYyBlbnRyeSBwb2ludHMuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IERvbid0IGluaXRpYWxpemUgZHluYW1pYyBlbnRyeSBwb2ludHMuCi0JKE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgdG8KLQlfYmZkX25vZHluYW1pYyB2ZXJzaW9uLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZS4KLQkoTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBMaWtld2lzZS4KLQkqIEFsbCBiYWNrZW5kczogQWRkZWQgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyB0byB0YXJnZXQgdmVjdG9yLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGNmLW02OGtseW54LmM6IEluY2x1ZGUgc3lzZGVwLmguCi0KLQkqIGhwMzAwaHB1eC5jOiBSZW1vdmVkIHNvbWUgc3BhY2VzIGluIHVzZXMgb2YgTkFNRSB0byBhdm9pZAotCXByb2JsZW1zIHdpdGggdHJhZGl0aW9uYWwgQyBjb21waWxlcnMuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlYXJyYW5nZWQgZmllbGRzIGluIHRhcmdldCB2ZWN0b3IuCi0JUmVtb3ZlZCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIF9iZmRfZGVidWdfaW5mb19lbmQgYW5kCi0JX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIHdoaWNoIHdlcmUgbmV2ZXIgdXNlZC4KLQkoQkZEX0pVTVBfVEFCTEVfR0VORVJJQywgQkZEX0pVTVBfVEFCTEVfQ09QWSk6IERlZmluZWQuCi0JKEJGRF9KVU1QX1RBQkxFX0NPUkUsIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBEZWZpbmVkLgotCShCRkRfSlVNUF9UQUJMRV9TWU1CT0xTLCBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MpOiBEZWZpbmVkLgotCShCRkRfSlVNUF9UQUJMRV9XUklURSwgQkZEX0pVTVBfVEFCTEVfTElOSyk6IERlZmluZWQuCi0JKiBBbGwgYmFja2VuZHM6IENoYW5nZWQgdG8gdXNlIHRoZSBuZXcgQkZEX0pVTVBfVEFCTEVfKiBtYWNyb3MKLQlyYXRoZXIgdGhhbiB0aGUgc2luZ2xlIEpVTVBfVEFCTEUgbWFjcm8uICBSZW1vdmVkIG1hbnkgb2YgdGhlCi0Jd2VpcmQgbWFjcm8gZGVmaW5pdGlvbnMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG1vbm9saXRoaWMKLQlKVU1QX1RBQkxFLgotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBSZW1vdmVkLgotCSogbGliYmZkLWluLmg6IERlZmluZSBhIGJ1bmNoIG9mIG1hY3JvcywgYW5kIGRlY2xhcmUgYSBmZXcKLQlmdW5jdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgbmV3IEJGRF9KVU1QX1RBQkxFXyogbWFjcm9zLgotCSogbGliYmZkLmMgKF9iZmRfZHVtbXlfbmV3X3NlY3Rpb25faG9vayk6IFJlbW92ZWQuCi0JKGJmZF9mYWxzZSk6IFNldCBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24uCi0JKGJmZF9udWxsdm9pZHB0cik6IExpa2V3aXNlLgotCShiZmRfbjEpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IFJlbmFtZWQgZnJvbQotCV9iZmRfZHVtbXlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wLgotCShfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogU2ltaWxhciByZW5hbWUuICBTZXQKLQliZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24uCi0JKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW5hbWVkIGZyb20KLQliZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbWlsYXIgcmVuYW1lLgotCSogaWVlZS5jOiAjaWYgMCBvdXQgaWVlZV9iZmRfZGVidWdfaW5mb19zdGFydCwKLQlpZWVlX2JmZF9kZWJ1Z19pbmZvX2VuZCwgaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLiAgVGhleQotCXdlcmUgbmV2ZXIgY2FsbGVkLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBBcHIgIDUgMjI6MTA6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIENydWRlIHN1cHBvcnQgZm9yIGV4YW1pbmluZyBkeW5hbWljIGxpYnJhcmllcy4KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogU2V0IERZTkFNSUMgZmxhZyBmb3IgU0hMX01BR0lDIGFuZAotCURMX01BR0lDIG9iamVjdHMuCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBQcmVzZXJ2ZSB0aGUgc3lzdGVtX2lkIGZvciBEWU5BTUlDIG9iamVjdHMuCi0JVXNlIFNITF9NQUdJQyBhcyB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBEWU5BTUlDIGZsYWcgaXMgc2V0LgotCVdyaXRlIGV4ZWMgaGVhZGVycyBmb3IgRFlOQU1JQyBvYmplY3RzLgotCShzb21fYmVnaW5fd3JpdGluZyk6IERZTkFNSUMgb2JqZWN0cyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudAotCXJlc3RyaWN0aW9ucyBhcyBEX1BBR0VEIG9iamVjdHMuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFRyZWF0IERZTkFNSUMgb2JqZWN0cyBsaWtlIEVYRUNfUAotCW9iamVjdHMuCi0JKG9iamVjdF9mbGFncyk6IEFkZCBEWU5BTUlDLgotCi1UdWUgQXByICA1IDE3OjQ4OjUyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYywgc3BhcmNseW54LmMgKE5BTUUpOiBSZW1vdmUgZW1iZWRkZWQgd2hpdGVzcGFjZSBpbgotCW1hY3JvIHVzZXMsIGNvbmZ1c2VzIHNvbWUgbm9uLUFOU0kgY29tcGlsZXJzLgotCi1UdWUgQXByICA1IDE1OjUwOjAxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogQWRkIG1pc3NpbmcgUEFSQU1TIGRlY2wuCi0JRG9uJ3QgZnJlZSBhbnl0aGluZyBpZiB3ZSBkb24ndCBoYXZlIGEgYmZkX29iamVjdC4KLQkoc29tX2Nsb3NlX2FuZF9jbGVhbnVwKTogQ2FsbCBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0KLVR1ZSBBcHIgIDUgMTE6MjI6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCByZW1vdmUgZW1wdHkgc2VjdGlvbnMuCi0JSXQgdHVybnMgb3V0IG5vdCB0byBiZSByZXF1aXJlZCBvbiBJcml4IDUsIGFuZCBpdCBjYXVzZXMgcHJvYmxlbXMKLQlpZiB0aGUgc2VjdGlvbnMgaGFwcGVuIHRvIGNvbnRhaW4gc3ltYm9scy4KLQotCSogZWxmY29kZS5oICh3cml0ZV9zaGRyc19hbmRfZWhkcik6IENvcnJlY3QgYmZkX3dyaXRlIGNoZWNrLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IERvbid0IGVycm9yIG91dCBpZgotCXNlY3Rpb24tPnJlbG9jYXRpb24gaXMgTlVMTDsgbWFsbG9jIG1pZ2h0IGhhdmUgcmV0dXJuZWQgTlVMTCB3aGVuCi0JZ2l2ZW4gYSB6ZXJvIHNpemUgaWYgdGhlcmUgd2VyZSBubyByZWxvY2F0aW9ucy4KLQkqIGJvdXQuYyAoYl9vdXRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIG5sbWNvZGUuaCAobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9yZWxvY190YWJsZSkpOiBMaWtld2lzZS4gIEFsc28sIGlmIG1hbGxvYwotCXJldHVybnMgTlVMTCwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHdlIGFza2VkIGZvciB6ZXJvIGJ5dGVzLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IElmIG1hbGxvYyByZXR1cm5zCi0JTlVMTCwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHdlIGFza2VkIGZvciB6ZXJvIGJ5dGVzLgotCSogbmxtY29kZS5oIChubG1fc2x1cnBfcmVsb2NfZml4dXBzKTogTGlrZXdpc2UuCi0KLU1vbiBBcHIgIDQgMTU6MzA6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogRG9uJ3QgZnJlZSBhbnl0aGluZwotCWlmIHdlIGRvbid0IGhhdmUgYSBiZmRfb2JqZWN0LgotCi0JTWFkZSBzdXJlIHRoYXQgZXZlcnkgY2FsbCB0byBiZmRfcmVhZCwgYmZkX3dyaXRlLCBhbmQgYmZkX3NlZWsKLQljaGVja3MgdGhlIHJldHVybiB2YWx1ZSBhbmQgaGFuZGxlZCBiZmRfZXJyb3IgY29ycmVjdGx5LiAgVGhlc2UKLQljaGFuZ2VzIGFyZSBub3QgaXRlbWlzZWQuICBBbHNvOgotCSogYW91dHguaCAoZW1pdF9zdHJ0YWIpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbiwgYW5kIHJldHVybgotCWVycm9ycy4KLQkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogQ2hlY2sgZW1pdF9zdHJ0YWIgcmV0dXJuIHZhbHVlLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4sCi0JYW5kIHJldHVybiBlcnJvcnMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgY29mZl93cml0ZV9yZWxvY3MgcmV0dXJuCi0JdmFsdWUuCi0JKiBpMzg2b3M5ay5jIChvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlib29sZWFuLgotCShvczlrX29iamVjdF9wKTogQ2hlY2sgb3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luIHJldHVybiB2YWx1ZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3JlYWRfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZTogQ2hlY2sgb2FzeXNfcmVhZF9yZWNvcmQgcmV0dXJuIHZhbHVlLgotCShvYXN5c19vYmplY3RfcCwgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCi0JKG9hc3lzX3dyaXRlX3JlY29yZCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShvYXN5c193cml0ZV9zeW1zKTogTGlrZXdpc2UuICBBbHNvLCBjaGVjayBvYXN5c193cml0ZV9yZWNvcmQKLQlyZXR1cm4gdmFsdWUuCi0JKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogQ2hlY2sgb2FzeXNfd3JpdGVfcmVjb3JkIHJldHVybiB2YWx1ZS4KLQkob2FzeXNfd3JpdGVfaGVhZGVyKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uICBDaGVjawotCW9hc3lzX3dyaXRlX3JlY29yZCByZXR1cm4gdmFsdWUuCi0JKG9hc3lzX3dyaXRlX2VuZCwgb2FzeXNfd3JpdGVfZGF0YSk6IExpa2V3aXNlLgotCShvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWVzIG9mCi0Jb2FzeXNfd3JpdGVfaGVhZGVyLCBvYXN5c193cml0ZV9zeW1zLCBvYXN5c193cml0ZV9kYXRhLCBhbmQKLQlvYXN5c193cml0ZV9lbmQuCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKHNyZWNfd3JpdGVfaGVhZGVyKTogTGlrZXdpc2UuICBBbHNvLCBjaGVjayBzcmVjX3dyaXRlX3JlY29yZAotCXJldHVybiB2YWx1ZS4KLQkoc3JlY193cml0ZV9zZWN0aW9uLCBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IpOiBMaWtld2lzZS4KLQkoc3JlY193cml0ZV9zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0Jc3JlY193cml0ZV9zeW1ib2xzLCBzcmVjX3dyaXRlX2hlYWRlciwgc3JlY193cml0ZV9zZWN0aW9uLCBhbmQKLQlzcmVjX3dyaXRlX3Rlcm1pbmF0b3IuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotTW9uIEFwciAgNCAxMDo1Njo0NSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKGFpeDM4Nl9iZmRfaXNfbG9jYWxfbGFiZWwpOiAgQ29ycmVjdCBjYXN0IGZyb20KLQlhc2VjdGlvbiB0byBhc3ltYm9sLgotCSogcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogIENvcnJlY3QgY2FzdCBmcm9tCi0JYmZkIHRvIGFzeW1ib2wuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2JmZF9pc19sb2NhbF9sYWJlbCk6ICBDb3JyZWN0IGNhc3QgZnJvbQotCWFzZWN0aW9uIHRvIGFzeW1ib2wuCi0KLVN1biBBcHIgIDMgMTg6Mjc6MjkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogVXNlIG1hbGxvYyB0byBhbGxvY2F0ZSBzcGFjZQotCWZvciB0aGUgY2FjaGVkIGNvcHkgb2YgdGhlIG5hdGl2ZSBzdHJpbmcgdGFibGUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIG5hdGl2ZSBzeW1ib2wgdGFibGUuCi0JKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgbmF0aXZlIGFuZCBnZW5lcmljCi0JcmVsb2NhdGlvbiB0YWJsZXMuCi0JKHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IEZyZWUgdGhlIGNhY2hlZCBuYXRpdmUgc3RyaW5ncywKLQlzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbnMuICBBbHNvIGZyZWUgdGhlIGNhbm9uaWNhbCBjYWNoZWQKLQlyZWxvY2F0aW9ucy4KLQotRnJpIEFwciAgMSAxMjo0MDo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSWYga2VlcF9tZW1vcnkgaXMgZmFsc2UsIG1ha2UKLQlzdXJlIHRoZSBzeW1ib2wgbmFtZSBpcyBzdG9yZWQgaW4gcGVybWFuZW50IG1lbW9yeSBiZWZvcmUgYWRkaW5nCi0JaXQgdG8gdGhlIHN0cmluZyB0YWJsZS4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBPbmNlIHdlJ3ZlIGZvdW5kIGFuCi0Jb2JqZWN0LCBkb24ndCBib3RoZXIgdG8gbG9vayBmb3IgbW9yZSB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8KLQlidWlsZCBhIG1hcC4KLQkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBBZnRlciBhZGRpbmcgdGhlIHN5bWJvbHMgZm9yIGEgQkZELAotCWNhbGwgYmZkX2ZyZWVfY2FjaGVkX2luZm8gb24gaXQuCi0KLQlBZGQgYmZkX2ZyZWVfY2FjaGVkX2luZm8gc3VwcG9ydCB0byBhLm91dCBiYWNrZW5kcy4KLQkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBSZW5hbWVkIGZyb20KLQlhb3V0X2xpbmtfZ2V0X3N5bWJvbHMuICBSZWFkIHN0cmluZ3MgZXZlbiBpZiBzeW1ib2xzIGhhdmUgYmVlbgotCXJlYWQuICBTdG9yZSBzdHJpbmcgc2l6ZSBpbiBvYmpfYW91dF9zdHJpbmdfc2l6ZS4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDYWxsIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgdG8KLQlyZWFkIHRoZSBzeW1ib2xzLiAgQWxsb2NhdGUgdGhlIGNhY2hlZCBzeW1ib2xzIHdpdGggbWFsbG9jLCBub3QKLQliZmRfYWxsb2MuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBBbGxvY2F0ZSB0aGUgY2FjaGVkIHJlbG9jcyB3aXRoCi0JbWFsbG9jLCBub3QgYmZkX2FsbG9jLgotCShOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogTmV3IGZ1bmN0aW9uOyBmcmVlIGNhY2hlZAotCXN5bWJvbHMgYW5kIHJlbG9jcy4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGV4dGVybmFsX3N0cmluZ19zaXplIGZpZWxkLgotCShvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkoTkFNRShhb3V0LGNsb3NlX2FuZF9jbGVhbnVwKSk6IERvbid0IGRlY2xhcmUuCi0JKE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykpOiBEZWNsYXJlLgotCShhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCShhb3V0XzY0X2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLAotCWRlZmluZSBhcyBOQU1FKGFvdXQsZnJlZV9jYWNoZWRfaW5mbykuCi0JKE1ZX2Nsb3NlX2FuZF9jbGVhbnVwKTogSWYgbm90IGFscmVhZHkgZGVmaW5lZCwgZGVmaW5lIGFzCi0JTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCi0JKiBib3V0LmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCi0JKiBocDMwMGhwdXguYyAoTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUgYXMgYmZkX3RydWUuCi0JKE1ZX2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IEFsbG9jYXRlIHRoZSBjYWNoZWQKLQlyZWxvY3Mgd2l0aCBtYWxsb2MsIG5vdCBiZmRfYWxsb2MuCi0JKiBpMzg2b3M5ay5jIChhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRG9uJ3QgZGVmaW5lLgotCi0JQWRkIGEgbmV3IGVudHJ5IHBvaW50IHRvIGZyZWUgbWVtb3J5IGNhY2hlZCBieSBhIEJGRC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8gZmllbGQuCi0JKiBiZmQuYyAoYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUuCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBBbGwgYmFja2VuZHM6IEluaXRpYWxpemUgYmZkX2ZyZWVfY2FjaGVkX2luZm8gZW50cnkgcG9pbnQgdG8KLQliZmRfdHJ1ZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IENvcnJlY3QgdHlwZSBvZgotCWZpcnN0LCB1bnVzZWQsIGFyZ3VtZW50LgotCShocHBhX2VsZl9pc19sb2NhbF9sYWJlbCk6IERlY2xhcmUgaW5zdGVhZCBvZgotCXNvbV9iZmRfaXNfbG9jYWxfbGFiZWwuCi0KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogQWRkIHJlbG9jX2VudHJ5LT5hZGRyZXNzIHRvIHZhbHVlIG9mCi0JYWJzb2x1dGUgUl9JUkVMIHJlbG9jLgotCi1UaHUgTWFyIDMxIDExOjUyOjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBlY29mZi5jIChlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgYQotCS5saWIgc2VjdGlvbi4KLQkoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGlmCi0JU1RZUF9FQ09GRl9MSUIgYml0IGlzIHNldC4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUm91bmQgdGhlIGNvbnRlbnRzIG9mIGEKLQkubGliIHNlY3Rpb24gdXAgdG8gdGhlIG5leHQgcGFnZSBib3VuZGFyeS4KLQkoZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZiB3ZSBzZWUgYSAubGliIHNlY3Rpb24sIGluY3JlbWVudAotCXRoZSB2bWEgYnkgb25lIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc2hhcmVkIGxpYnJhcmllcyB3ZSBoYXZlLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjcmFzaCBpZiB3ZSBzZWUgYQotCVNUWVBfRUNPRkZfTElCIHNlY3Rpb24sIGFuZCBkb24ndCBhZGp1c3QgdGV4dF9zdGFydCBvciBkYXRhX3N0YXJ0Ci0Jb3IgYnNzX3NpemUgZWl0aGVyLgotCi0JKiBjb2ZmY29kZS5oIChDQUxDX0FEREVORCk6IENoYW5nZSB0byBmZXRjaCBvcmlnaW5hbCBzeW1ib2wgdmFsdWUKLQlmcm9tIG9yaWdpbmFsIEJGRCwgcmF0aGVyIHRoYW4gdXNpbmcgdmFsdWUgb2YgY3VycmVudCBCRkQgc3ltYm9sLgotCU5lZWRlZCBmb3IgbmV3IGxpbmtlci4KLQkqIGNvZmYtc3BhcmMuYyAoQ0FMQ19BRERFTkQpOiBMaWtld2lzZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHRoZSB0ZXh0X3N0YXJ0IGFuZAotCWRhdGFfc3RhcnQgZW50cmllcyBpbiB0aGUgb3B0aW9uYWwgaGVhZGVyIGNvcnJlY3RseSBldmVuIGlmIGEgdGV4dAotCW9yIGRhdGEgc2VjdGlvbiBzdGFydHMgYXQgbG9jYXRpb24gemVyby4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkZWQgQkZEX1JFTE9DXzI2IChmcm9tIHNlZgotCWFuZCByYWVidXJuKS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9yZWFkX2ltcG9ydCk6IE51bGwgdGVybWluYXRlIHRoZSBzeW1ib2wKLQluYW1lLgotCSogbmxtMzItYWxwaGEuYyAobmxtX2FscGhhX3JlYWRfaW1wb3J0KTogTGlrZXdpc2UuCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9pbXBvcnQpOiBMaWtld2lzZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbCk6IFJlaW5kZW50ZWQuICBDaGFuZ2VkIHRvIHJldHVybgotCWJvb2xlYW4sIGFuZCBjaGFuZ2VkIHdyaXR0ZW4gdG8gdW5zaWduZWQgaW50ICouICBDaGVjayBlcnJvcgotCXJldHVybnMgZnJvbSBjYWxsZWQgZnVuY3Rpb25zLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogTGlrZXdpc2UuICBSZXdvcmtlZCBjaGVja3Mgb24gd2hldGhlciB0bwotCXdyaXRlIHN5bWJvbCBuYW1lIHRvIHN0cmluZyB0YWJsZSBmb3IgY2xhcml0eSBhbmQgdG8gYXZvaWQgY29yZQotCWR1bXBpbmcgd2hlbiBnaXZlbiBhIG5vbiBDT0ZGIHN5bWJvbC4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl93cml0ZV9zeW1ib2xzKTogRGVjbGFyZSBhcyByZXR1cm5pbmcgYm9vbGVhbi4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JY29mZl93cml0ZV9zeW1ib2xzLgotCi1XZWQgTWFyIDMwIDE2OjI1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gbGV0IEJGRCByZXR1cm4gYW4gZXJyb3IgaW5kaWNhdGlvbiBmcm9tCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCwgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuICBUaGV5IG5vdwotCXJldHVybiBsb25nIGluc3RlYWQgb2YgdW5zaWduZWQgaW50LCBhbmQgdXNlIC0xIHRvIGluZGljYXRlIGFuCi0JZXJyb3IuICBBbG9uZyB0aGUgd2F5LCByZW5hbWUgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0bwotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgotCSogYmZkLmMgKGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uCi0JZXJyb3JzLgotCShiZmRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzeW1zLmMgKGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogUmVuYW1lZCBmcm9tCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlbmFtZWQgX2dldF9zeW10YWJfdXBwZXJfYm91bmQgdG8KLQlfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIGFuZCBjaGFuZ2VkIGl0IGFuZAotCV9iZmRfY2Fub25pY2FsaXplX3N5bXRhYiBhbmQgX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyB0byBhbGwgcmV0dXJuIGxvbmcuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bXRhYikpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KLQkoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShiX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlbGZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGVsZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoZ2V0X3N5bXRhYikpOiBMaWtld2lzZS4KLQkoTVkoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYm9vbGVhbi4gIENoZWNrIGZvciBlcnJvcnMgZnJvbSBnZXRfc3ltYm9sLgotCShpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLiAgQ2hlY2sKLQlmb3IgZXJyb3JzIGZyb20gaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzLgotCShpZWVlX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KLQkoaWVlZV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIG5sbWNvZGUuaCAobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkobmxtX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkobmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG9hc3lzX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkob2FzeXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG9hc3lzX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHNvbV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoc3JlY19nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKHNyZWNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbC4KLQkoc3JlY19jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHRla2hleC5jICh0ZWtoZXhfZ2V0X3N5bXRhYik6IFJldHVybiBsb25nLCBhbmQgLTEgb24gZXJyb3JzLgotCSh0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSh0ZWtoZXhfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbC4KLQkodGVraGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBDaGFuZ2UKLQlkZWNsYXJhdGlvbiB0byByZXR1cm4gbG9uZy4KLQkoTkFNRShhb3V0LGdldF9zeW10YWIpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBsaWJubG0uaCAobmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShubG1OQU1FKGdldF9zeW10YWIpKTogTGlrZXdpc2UuCi0JKG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBVc2UgZXJyb3JfcmV0dXJuIGFuZAotCW5vX21lbW9yeV9yZXR1cm4gbGFiZWxzIHJhdGhlciB0aGFuIGZyZWVpbmcgaW5mb3JtYXRpb24gaW4gdmFyaW91cwotCXBsYWNlcy4gIENoYW5nZSBzdG9yYWdlLCBzeW1jb3VudCBhbmQgc3JjX2NvdW50IHRvIGxvbmcuICBDaGVjawotCWVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogYm91dC5jIChiX291dF9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHJlbG9jX3NpemUgdG8gbG9uZy4gIENoZWNrCi0JZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IExpa2V3aXNlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsIGFuZAotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBDaGVjayBmb3IgZXJyb3JzCi0JZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBsaWJiZmQuYyAoYmZkXzBsKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKGJmZF8wbCk6IERlY2xhcmUuCi0JKiBhaXgzODYtY29yZS5jOiBDaGFuZ2UgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgZ2V0X3N5bXRhYiwKLQlnZXRfcmVsb2NfdXBwZXJfYm91bmQsIGFuZCBjYW5vbmljYWxpemVfcmVsb2MgdG8gdXNlIGJmZF8wbCByYXRoZXIKLQl0aGFuIGJmZF8wdS4KLQkqIGNpc2NvLWNvcmUuYywgaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jOiBMaWtld2lzZS4KLQkqIGlyaXgtY29yZS5jLCBvc2YtY29yZS5jLCBwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX3JlYWRfcmVsb2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcwotCXRlbXAgYW5kIG5hbWUuCi0KLVdlZCBNYXIgMzAgMDg6MzM6MDQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2RweDIuaDogRGVmaW5lIFBPU0lYX1VUSU1FLgotCi1XZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaTM4NmR5bml4LmMsIGNvbmZpZy9pMzg2LWR5bml4Lm10OiAgTmV3IGZpbGVzLCBoYW5kbGluZyBEeW5peAotCXZhcmlhbnQgb2YgYS5vdXQuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5iZmQ6ICBVc2UgdGhlbSBmb3IgRHluaXguCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBkZXBlbmRlbmNpZXMgZm9yIGkzODZkeW5peC5vLiAKLQkqIHRhcmdldHMuYzogIEFkZCBkZWZpbml0aW9uIGZvciBpMzg2ZHluaXhfdmVjLgotCSogaG9zdHMvc3ltbWV0cnkuaDogIERvIG5vdCBkZWZpbmUgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUIGZvciBEeW5peC4KLQlEZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgYW5kIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwKLQlmb3IgRHluaXguIFJlbW92ZSBpbmNsdXNpb24gb2YgZHluaXgzLmgsIER5bml4IGJmZCBpcyBub3cgaGFuZGxlZCBieQotCWkzODZkeW5peC5jCi0KLU1vbiBNYXIgMjggMTI6NTM6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zcGFyYy5vLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfYXJjaF9wb3dlcnBjIGxpa2UKLQliZmRfYXJjaF9yczYwMDAuCi0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIHJzNjAwMC5tdC4KLQkqIGNvbmZpZy9yczYwMDAubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogQWRkIGJmZF9wb3dlcnBjX2FyY2guCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgU0VDX1JFTE9DIGZsYWcKLQlmb3IgZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHNlY3Rpb24uCi0KLVN1biBNYXIgMjcgMTY6MjU6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IE5ldyBhcHByb2FjaCBhdCBkZWFsaW5nIHdpdGggaG9sZXMKLQlpbiBleGVjdXRhYmxlcyBsZWZ0IGJ5IHRoZSBIUCBsaW5rZXIuICBEb2VzIG5vdCByZWx5IG9uIHN1YnNwYWNlCi0JYWxpZ25tZW50cyBhcyBzdWJzcGFjZXMgYXJlICpOT1QqIGd1YXJhbnRlZWQgdG8gYmUgcHJvcGVybHkKLQlhbGlnbmVkIGluIGFuIGV4ZWN1dGFibGUgKGNhbiB5b3UgYmVsaWV2ZSB0aGF0ISkuCi0KLVNhdCBNYXIgMjYgMTA6MjU6NDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24uICBEbyBub3QgdHJ5Ci0JdG8gYWN0dWFsbHkgcmVhZCBkYXRhIGZyb20gYSBzZWN0aW9uIHRoYXQgZG9lc24ndCBoYXZlIGVpdGhlcgotCVNFQ19MT0FEIG9yIFNFQ19ERUJVR0dJTkcgc2V0IChlZyAkQlNTJCkganVzdCByZXR1cm4gdHJ1ZS4KLQotICAgICAgICAqIGxpYmJmZC5jIChiZmRfcmVhZCk6IFNldCBiZmRfZXJyb3IgYXMgYXBwcm9wcmlhdGUgZm9yIGEgc2hvcnQKLQlyZWFkLiAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsIG9yIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkuCi0KLQkqIHNvbS5jOiBEbyBub3QgYmxpbmRseSBzZXQgYmZkX2Vycm9yX3N5c3RlbV9jYWxsIGFmdGVyIGEKLQlmYWlsaW5nIGJmZF9yZWFkLCBiZmRfd3JpdGUsIG9yIGJmZF9zZWVrLiAgSW4gYSBmZXcgcGxhY2VzCi0JKGxpa2Ugc29tX29iamVjdF9wKSBvdmVycmlkZSB0aGUgZXJyb3Igc3RhdHVzIHNldCBieSBiZmRfcmVhZC4KLQotCSogYWl4Mzg2LWNvcmUuYywgYW91dC1lbmNhcCxjIGFyY2hpdmUuYywgYm91dC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtcnM2MDAwLmMsIGNvZmZnZW4uYyBlY29mZi5jLCBlbGYuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMsIGVsZmNvZGUuaCwgaHAzMDBocHV4LmMsIGkzODZseW54LmM6IExpa2V3aXNlLgotCSogbmxtMzItYWxwaGEuYywgbmxtMzItaTM4Ni5jLCBubG0zMi1zcGFyYy5jOiBMaWtld2lzZS4KLQotCSogc29tLmM6IENoZWNrIHJldHVybiB2YWx1ZXMgZnJvbSBzZXZlcmFsIGJmZF97c2VlayxyZWFkLHdyaXRlfQotCWNhbGxzIHRoYXQgd2UganVzdCBhc3N1bWVkIHdlcmUgbm90IGZhaWxpbmcuCi0KLUZyaSBNYXIgMjUgMTE6NDQ6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N5c3Y0LmggKEhBVkVfUFJPQ0ZTKTogQWRkIGNvbW1lbnRzIGFib3V0IHB0eDQuCi0JKiBjb25maWcvc3lzdjQubWg6IEFkZCBjb21tZW50LgotCSogY29uZmlnL3N5bW1ldHJ5Lm1oOiBDaGFuZ2UgY29tbWVudC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2Ugc3lzdjQsIG5vdCBzeW1tZXRyeSwgZm9yIGlbMzRdODYtc2VxdWVudC1zeXN2NCouCi0KLUZyaSBNYXIgMjUgMTc6MTA6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBzdXBwb3J0IGxpbmtlciByZWxheGluZyBvZiBlbWJlZGRlZCBNSVBTIFBJQyBjb2RlIHRvCi0JdXNlIGEgZml2ZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IgZnVuY3Rpb24gY2FsbHMgd2hpY2ggYXJlIG91dCBvZgotCXJhbmdlIG9mIHRoZSBiYWwgaW5zdHJ1Y3Rpb24uCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZS4KLQkoZWNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lLgotCShlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERvbid0IGRlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSk6IERvbid0IHJlYWQgb3IgZnJlZQotCXRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaWYgaXQgaGFzIGFscmVhZHkgYmVlbiByZWFkLgotCShlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyKTogSGFuZGxlIF9jb29rZWRfc2l6ZSBiZWluZyBkaWZmZXJlbnQKLQlmcm9tIF9yYXdfc2l6ZS4gIERvbid0IHJlcmVhZCB0aGUgY29udGVudHMgb3IgdGhlIHJlbG9jcyBpZiB0aGV5Ci0JaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbi4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQ2hhbmdlIGJpdHNpemUgb2YgUENSRUwxNiBmcm9tCi0JMTggdG8gMTYuCi0JKFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQpOiBEZWZpbmUuCi0JKG1pcHNfcmVsb2NhdGVfcmVmaGkpOiBUYWtlIGFkanVzdCBhcmd1bWVudC4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHJlbG9jIG9mZnNldHMgc3RvcmVkIGluIHNlY3Rpb24KLQl1c2VkX2J5X2JmZCBmaWVsZC4gIENhbGwgbWlwc19yZWxheF9wY3JlbDE2IHRvIGhhbmRsZSBkZXRhaWxzIG9mCi0JZXhwYW5kaW5nIGFuIG91dCBvZiByYW5nZSBQQ1JFTDE2LiAgS2VlcCB0cmFjZSBvZiBhZGp1c3RtZW50cwotCXJlcXVpcmVkIGJ5IGV4cGFuc2lvbnMuICBTZXQgcyBhbmQgdW5zZXQgaCB3aGVuIGNvbnZlcnRpbmcgYSByZWxvYwotCWZyb20gdW5kZWZpbmVkIHRvIHNlY3Rpb24uICBDaGFuZ2UgaGFuZGxpbmcgb2YgUEMgcmVsYXRpdmUgcmVsb2NzOgotCWlmIGFnYWluc3QgYSBzZWN0aW9uLCB0aGV5IGFyZSBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwgaWYKLQlhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0aGV5IGFyZSBwY3JlbF9vZmZzZXQuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19yZWxheF9wY3JlbDE2KTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkqIGNvZmYtYWxwaGEuYyAoZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBIYW5kbGUgYWRqdXN0bWVudHMKLQlidWlsdCBieSBtaXBzX3JlbGF4X3NlY3Rpb24gd2hlbiB3cml0aW5nIG91dCBhZGRyZXNzZXMuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IENsZWFyIGFkanVzdCBmaWVsZC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IFRoZSBjYWxsZXIgZXhwZWN0cwotCWZ1bmN0aW9ubmFtZV9wdHIgdG8gYmUgc2V0IHRvIGEgc3ltYm9sIG5hbWUsIHNvIHByZXBlbmQKLQlzeW1ib2xfbGVhZGluZ19jaGFyLgotCi1UaHUgTWFyIDI0IDExOjMzOjQ2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEFkZCByZWxheGluZyBpbmZvCi0JZm9yIDE2Yml0IHJlbGF0aXZlIGJyYW5jaGVzLgotCSogY29mZi1oODUwMC5jIChyX2hpZ2g4LCByX2xvdzE2LCByX2hpZ2gxNik6IERvbid0IGNvbXBsYWluIG9uCi0Jb3ZlcmZsb3cuCi0KLVRodSBNYXIgMjQgMDk6MjE6MTMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogSWdub3JlIG5vbi1TT00gb2JqZWN0cy4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYsIHNvbV93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDIzIDE0OjI5OjMxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbmV0YnNkMzg2LmMgKE5fU0VUX0ZMQUdTKTogRGVsZXRlIHRoZSBvbGQgZGVmaW5pdGlvbi4KLQotV2VkIE1hciAyMyAxNDo1ODo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDbGVhbiB1cCB0aGUgcmVsYXhpbmcgY29kZSBmb3IgdGhlIG5ldyBsaW5rZXIuCi0JKiB0YXJnZXRzLmMgKF9iZmRfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQKLQlyYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JKiBiZmQuYyAoYmZkX3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2UgbmFtZSBvZiBmb3VydGggYXJndW1lbnQgZnJvbQotCXN5bWJvbHMgdG8gYWdhaW4uCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbgotCWFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4gIEFsd2F5cyByZXR1cm4gdHJ1ZS4KLQkqIGJvdXQuYzogSW5jbHVkZSBnZW5saW5rLmguCi0JKGFsaWduY29kZSwgcGVyZm9ybV9zbGlwKTogRGVjbGFyZS4KLQkocGVyZm9ybV9zbGlwKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCUNoYW5nZWQgYWxsIGNhbGxlcnMuICBHZXQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZELiAgQ2hhbmdlIHRoZQotCWhhc2ggdGFibGUgZW50cnkgdmFsdWUgYXMgd2VsbCBhcyB0aGUgc3ltYm9sIHZhbHVlLgotCShhYnMzMmNvZGUpOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBDaGFuZ2VkCi0JYWxsIGNhbGxlcnMuCi0JKGFsaWduY29kZSk6IExpa2V3aXNlLgotCShiX291dF9yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbiBhcmd1bWVudCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4gIE9ubHkgcmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLiAgU2V0ICphZ2FpbgotCXRvIGZhbHNlLiAgR2V0IHN5bWJvbHMgZnJvbSBCRkQuCi0JKiByZWxvYzE2LmM6IEluY2x1ZGUgZ2VubGluay5oLgotCShiZmRfcGVyZm9ybV9zbGlwKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCUdldCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQuICBDaGFuZ2UgdGhlIGhhc2ggdGFibGUgZW50cnkgdmFsdWUKLQlhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgdmFsdWUuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQKLQlyYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBPbmx5IHJldHVybiBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLQlTZXQgKmFnYWluIHRvIGZhbHNlLiAgR2V0IHN5bWJvbHMgZnJvbSBCRkQuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UKLQlfYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSB0byB0YWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4KLQkoYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCShkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0JKiBsaWJjb2ZmLWluLmggKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IENoYW5nZQotCWRlY2xhcmF0aW9uIHRvIHRha2UgYm9vbGVhbiAqIHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQkoYmZkX3BlcmZvcm1fc2xpcCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byB0YWtlIEJGRCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4KLQkqIGNvZmYtaDgzMDAuYyAoaDMwMF9yZWxvYzE2X2VzdGltYXRlKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyCi0JdGhhbiBhc3ltYm9sIGxpc3QuICBDaGFuZ2VkIGNhbGxzIHRvIGJmZF9wZXJmb3JtX3NsaXAuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZ2VubGluay5oIChfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50KTogRGVmaW5lLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24uCi0JKGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgaXQuICBVc2UKLQlfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyBhbmQgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50Ci0JdG8gZ2V0IHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRC4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFN0b3JlIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeQotCWluIGFzeW1ib2wgdWRhdGEgZmllbGQuCi0KLVR1ZSBNYXIgMjIgMTM6MDk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IgbmV3IE1JUFNfUl9QQ1JFTDE2Ci0JcmVsb2MsIHVzZWQgaW4gZW1iZWRkZWQgUElDIGNvZGUuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogQ2hhbmdlIHNhbml0eSBjaGVjayB0byBwZXJtaXQgbmV3IHJlbG9jLgotCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFR1cm4gQkZEX1JFTE9DXzE2X1BDUkVMX1MyIGludG8KLQlNSVBTX1JfUENSRUwxNi4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogQWNjb3VudCBmb3IgbGlua19vcmRlcgotCXJlbG9jcyB3aGVuIGFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgU2V0IFNFQ19SRUxPQyBmbGFnCi0JZm9yIGFueSBzZWN0aW9uIHdoaWNoIGhhcyByZWxvY3MuICBIYW5kbGUgbGlua19vcmRlciByZWxvY3MgaW4KLQlsaW5rX29yZGVyIGxvb3AuICBVc2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCBmb3IKLQlhZGRfc3ltYmxzIGVudHJ5IHBvaW50LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBTZXQgcmVsb2NfY291bnQgdG8gMCBiZWZvcmUKLQljb3VudGluZyByZWxvY3MuICBTZXQgU0VDX1JFTE9DIGZsYWcgZm9yIGFueSBzZWN0aW9uIHdoaWNoIGhhcwotCXJlbG9jcy4KLQotCSogbGlua2VyLmMgKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSGFuZGxlIGJmZF9kYXRhX2xpbmtfb3JkZXIuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyk6IEp1c3QgY2FsbAotCWdlbmVyaWNfbGlua19hZGRfc3ltYm9scy4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCk6IE5ldyBmdW5jdGlvbiwgbGlrZQotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIGJ1dCBhbHNvIGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZAotCWRlc3RydWN0b3JzIGJ5IG5hbWUgYXMgY29sbGVjdDIgZG9lcy4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLCBsaWtlIG9sZAotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIGJ1dCB3aXRoIGNvbGxlY3QgYXJndW1lbnQuCi0JKGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBUYWtlIGNvbGxlY3QgYXJndW1lbnQuCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0KTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbmFtZSBjb25zdHJ1Y3RvciBhcmd1bWVudCB0bwotCWNvbGxlY3QuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIE1hciAyMiAxMDowNDowMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXJjaGl2ZS5jIChiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBVc2UgYXJfcGFkY2hhcgotCWZvciBmaXJzdCBjaGFyYWN0ZXIgaW4gYW4gZXh0ZW5kZWQgbmFtZS4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogSWYgYXJfcGFkY2hhciA9PSAnLycsIHRoZW4gdXNlCi0JIi8vIiBhcyB0aGUgbmFtZSBvZiB0aGUgc3BlY2lhbCBhcmNoaXZlIG1lbWJlciBob2xkaW5nIHRoZQotCWV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLU1vbiBNYXIgMjEgMTI6Mjg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgbGlua19vcmRlciB0eXBlcyB3aGljaCBnZW5lcmF0ZSByZWxvY3MgaW4gb3JkZXIgdG8KLQlzdXBwb3J0IC1VciBpbiB0aGUgbGlua2VyLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudAotCWZyb20gY2FsbCB0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudC4KLQlEb24ndCBwYXNzIGJpdHNpemUgdG8gY29uc3RydWN0b3IgY2FsbCBiYWNrLiAgUGFzcyBCRkRfUkVMT0NfQ1RPUgotCWluc3RlYWQgb2YgYml0c2l6ZSB0byBhZGRfdG9fc2V0IGNhbGwgYmFjay4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBpbiBsaW5rX29yZGVyIGxvb3AuCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2RlZmF1bHRfbGlua19vcmRlcik6IElmIGEgcmVsb2NfbGlua19vcmRlciBpcyBzZWVuIGhlcmUsCi0JYWJvcnQuCi0JKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgYml0c2l6ZQotCWFyZ3VtZW50IGZyb20gZGVjbGFyYXRpb24uCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogRGVjbGFyZS4KLQkoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20KLQljYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBhZnRlciBoYW5kbGluZyBhbGwKLQlpbnB1dCBCRkRzLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20KLQljYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIgcmVsb2NzIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIEhhbmRsZSB0aGVtIGluIGxpbmtfb3JkZXIgbG9vcC4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFNldCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBhIGRlZmluZWQKLQlsaW5rZXIgY3JlYXRlZCBzeW1ib2wgYmFzZWQgb24gdGhlIHNlY3Rpb24gaXQgaXMgaW4uICBDb3JyZWN0Ci0JYmZkX2xpbmtfaGFzaF93ZWFrIGNhc2UgdG8gdXNlIC5zYyByYXRoZXIgdGhhbiAuc3QuCi0JKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZQotCUJGRF9SRUxPQ19DVE9SLgotCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgZHluc3ltCi0JYW5kIGJ1Zi4KLQotCSogY2lzY28tY29yZS5jIChjaXNjb19jb3JlX2ZpbGVfcCk6IE9ubHkgcGFzcyBvbmUgYXJndW1lbnQgdG8KLQliZmRfem1hbGxvYy4gIEZyZWUgYSBwb2ludGVyLCBub3QgYSB1bmlvbi4KLQkoY2lzY29fYmZkX2lzX2xvY2FsX2xhYmVsKTogQ29ycmVjdCBjYXN0IGZyb20gYXNlY3Rpb24gdG8gYXN5bWJvbC4KLQotU3VuIE1hciAyMCAwOToyNDozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkL3NvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZpeCB0aGlua28gKG9mZiBieSBvbmUgZXJyb3IpLgotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogT25seSB0byBkbyB0aGUgdmFsdWUKLQljb21wYXJpc29uIGZvciBmdW5jdGlvbiBzeW1ib2xzIHdpdGhpbiBleGVjdXRhYmxlcy4KLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJlbmFtZWQgZnJvbQotCXNvbV9zZWN0aW9uX2Zyb21fc3Vic3BhY2VfaW5kZXguICBQYXNzIGluIGEgbmF0aXZlIFNPTSBzeW1ib2wuCi0JRm9yIGV4ZWN1dGFibGVzLCBpdGVyYXRlIHRocm91Z2ggdGhlIHNlY3Rpb25zIHRvIGZpbmQgb3V0Ci0Jd2hpY2ggY29udGFpbnMgdGhlIHN5bWJvbCdzIGFkZHJlc3MgcmF0aGVyIHRoYW4gdXNpbmcgdGhlCi0Jc3ltYm9sX2luZm8gZmllbGQuICAoc3ltYm9sX2luZm8gaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yCi0JZHluYW1pY2x5IGxpbmtlZCBleGVjdXRhYmxlcy4pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBEb24ndCBwYXNzIGFiZmQgdG8KLQliZmRfem1hbGxvYy4KLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IGJyYWlubyAob25lIGNhbGwgdG8gYWxpZ24KLQlzcGFjZS9zdWJzcGFjZSBkYXRhIHdhcyBkb25lIHVuY29uZGl0aW9uYWxseSByYXRoZXIgdGhhbgotCWp1c3QgZm9yIGV4ZWN1dGFibGVzLikKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogQWxpZ24gdGV4dCBpbiBhbGwgZXhlY3V0YWJsZXMgdG8KLQltYWtlIEhQVVgga2VybmVsIGhhcHB5LiAgRml4ZXMgc3RyaXAvb2JqY29weSBmb3Igc2hhcmVkCi0JZXhlY3V0YWJsZXMuCi0KLVNhdCBNYXIgMTkgMDc6MDY6NTkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEFjY291bnQgZm9yIGFsaWdubWVudCBuZWVkcyBvZgotCXN1YnNwYWNlcyB0b28gd2hlbiB3cml0aW5nIGV4ZWN1dGFibGVzLiAgTmV2ZXIgcmVxdWVzdCBhIG5lZ2F0aXZlCi0JYnNzIHNpemUuICBGaXhlcyBzb21lIHByb2JsZW1zIHdpdGggZGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzLAotCXN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIHB1cmUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBleGVjdXRhYmxlcy4KLQotRnJpIE1hciAxOCAxOToxMjo0NyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENhbGwgYmZkX3ptYWxsb2Mgbm90Ci0JYmZkX3phbGxvYyBmb3IgcmF3cHRyLCBiZWNhdXNlIGxhdGVyIG9uIHdlIG1heSBjYWxsIGZyZWUsIG5vdAotCWJmZF9yZWxlYXNlLCBvbiBpdC4KLQotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGNpc2NvX2NvcmVfc3RydWN0IHRvIHRkYXRhIHVuaW9uLgotCSogbGliYmZkLmMgKGJmZF9yZWFkLCBiZmRfc2Vlayk6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgZXJyb3JzLgotCSogY2lzY28tY29yZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBjaXNjb19jb3JlX3ZlYy4KLQkqIGNvbmZpZy9tNjhrLWFvdXQubXQgKFNFTEVDVF9WRUNTKTogQWRkIGNpc2NvX2NvcmVfdmVjLgotCSogdGFyZ2V0cy5jOiBBZGQgY2lzY29fY29yZV92ZWMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBNYXIgMTggMTg6MTM6NDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IE5ldyBzdHJ1Y3R1cmUKLQljb250YWluaW5nIGFsbCB0aGUgcHJpdmF0ZSBzZWN0aW9uIGluZm9ybWF0aW9uIHdoaWNoIG5lZWRzCi0JdG8gYmUgY29waWVkIGZyb20gaW5wdXQgc2VjdGlvbiB0byBvdXRwdXQgc2VjdGlvbiBkdXJpbmcKLQlvYmpjb3B5IG9yIHN0cmlwLgotCShzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IFJlbW92ZSBzZXZlcmFsIGZpZWxkcyBub3cgaW4KLQlzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdC4gIE1ha2UgdGhlIHNwYWNlIGFuZCAKLQlzdWJzcGFjZSBkaWN0aW9uYXJpZXMgYmUgcG9pbnRlcnMgKHRvIHNhdmUgc3BhY2Ugd2hlbgotCW9ubHkgcmVhZGluZyBvYmplY3RzKS4KLQotCSogc29tLmMgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IE5vdyByZXR1cm5zIGEgYm9vbGVhbjsKLQlzb21lIHJlZmVyZW5jZXMgY2hhbmdlZC4gIEFsbG9jYXRlIGEgY29weWFibGUgZGF0YSBzdHVjdHVyZSBpZgotCW5vbmUgZXhpc3RzLiAgU3RvcmUgaW5mbyBpbnRvIHRoZSBjb3B5YWJsZSBkYXRhIHN0cnVjdHVyZS4KLQkoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzKTogTGlrZXdpc2UuCi0JKHNvbV9pc19zcGFjZSwgc29tX2lzX3N1YnNwYWNlLCBzb21faXNfY29udGFpbmVyKTogTmV3IGZ1bmN0aW9ucy4KLQlVc2UgdGhlc2UgaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgcHJpdmF0ZSBkYXRhLgotCShzb21fcHJlcF9oZWFkZXJzKTogQWxsb2NhdGUgc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMgaGVyZS4KLQlGaWxsIGluIHNvbWUgZmllbGRzIGluIHRoZSBzcGFjZS9zdWJzcGFjZSBoZWFkZXJzIGZyb20gdGhlCi0JY29weWFibGUgZGF0YS4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogT25seSBjb3B5IHRoZSBzdHVmZgotCXRoYXQgd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBvYmpjb3B5IGFuZCBzdHJpcCB3b3JrLiAgQWxsb2NhdGUKLQl0aGUgY29weV9kYXRhIHN0cnVjdHVyZSBmb3IgdGhlIG91dHB1dCBiZmQgYmVmb3JlIGNvcHlpbmcuCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCBleGVjCi0JaW5mbyB0aGF0IG11c3QgYmUgcHJlc2VydmVkIHdoZW4gcnVubmluZyBvYmpjb3B5L3N0cmlwLgotCShzdHJ1Y3Qgc29tZGF0YSk6IEFkZCBuZXcgImV4ZWNfZGF0YSIgZmllbGQgYW5kIGFjY2Vzc29yCi0JbWFjcm8uICBBZGQgc29tZSBjb21tZW50cyBvbiBob3cgdGhlIHZhcmlvdXMgZmllbGRzIGFyZSB1c2VkLgotCShzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IE1ha2UgaXNfc3BhY2UgYW5kIGlzX3N1YnNwYWNlIGJpdGZpZWxkcy4KLQlEZWxldGUgdW51c2VkIHN1YnNwYWNlX2luZGV4LiAgQWxsIHJlZmVyZW5jZXMgbm93IHVzZSB0aGUKLQl0YXJnZXRfaW5kZXggZmllbGQgd2l0aGluIHRoZSBzZWN0aW9uIHN0cnVjdHVyZSBpdHNlbGYuCi0KLQkqIHNvbS5jIChtYWtlX3VuaXF1ZV9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBkZWNsYXJhdGlvbi4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9vYmplY3Rfc2V0dXApOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIHNhdmUgZXhlYyBpbmZvcm1hdGlvbgotCXRoYXQgbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBvYmpjb3B5L3N0cmlwLgotCShzb21fbWtvYmplY3QpOiBEbyBub3QgYWxsb2NhdGUgc3BhY2UgZm9yIGEgZmlsZSBoZWFkZXIgaGVyZS4KLQlJdCBpcyBub3QgdXNlZCB3aGVuIG9ubHkgcmVhZGluZyBTT00gb2JqZWN0cy4KLQkoc29tX3ByZXBfaGVhZGVycyk6IEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIKLQl0byB0aGUgb3V0cHV0IGJmZC4gIEZvciBleGVjdXRhYmxlcywgdXNlIHRoZSBzYXZlZCBzeXN0ZW1faWQKLQl2YWx1ZSByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZ3Vlc3MgdGhlIHJpZ2h0IHZhbHVlLiAgRG8gbm90IGFib3J0Ci0Jd3doZW4gc2V0dGluZyBmaWxlX2hkci0+ZW50cnkqIGZvciBleGVjdXRhYmxlcy4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBGb3IgZXhlY3V0YWJsZXMsIHNldCB0aGUgZXhlY19lbnRyeSBhbmQKLQlleGVjX2ZsYWdzIGZpZWxkcy4KLQkoc29tX2NvcHlfcHJpdmF0ZV9iYWNrZW5kX3NlY3Rpb25fZGF0YSk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogbGliaHBwYS5oIChQQV9QQUdFU0laRSk6IERlZmluZS4KLQotCSogc29tLmMgKFNPTV9BTElHTik6IERlZmluZS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBJZiB3cml0aW5nIGFuIGV4ZWN1dGFibGUsIGluaXRpYWxpemUgYWxsCi0JZmllbGRzIGluIHRoZSBleGVjIGhlYWRlciB0byB6ZXJvLiAgVXBkYXRlIGZpZWxkcyBpbiB0aGUgZXhlYwotCWhlYWRlciBhcyBzaXplcyBvZiBsb2FkYWJsZSBzdWJzcGFjZXMgYXJlIGNvbXB1dGVkLiAgQ2FyZWZ1bGx5Ci0JcHJlc2VydmUgYWxpZ25tZW50cyB3aGVuIGJ1aWxkaW5nIGV4ZWN1dGFibGVzLiAgQWN0dWFsbHkgd3JpdGUgdGhlCi0JZXhlYyBhZnRlciBhbGwgdGhlIGZpZWxkcyBhcmUgZmlsbGVkIGluLgotCi0gICAgICAgICogQmV0dGVyIGxvbmctZmlsZW5hbWUgaGFuZGxpbmcuICBSZWFkcyBTT00gQUJJIGNvbXBsaWFudCBleHRlbmRlZAotCW5hbWVzLCBidXQgZG9lc24ndCBxdWl0ZSB3cml0ZSBjb21wbGlhbnQgZXh0ZW5kZWQgbmFtZXMgeWV0LgotCSogc29tLmMgKHNvbV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVsZXRlIGZ1bmN0aW9uLiAgVGhlCi0JZ2VuZXJpYyBjb2RlIHdpbGwgaGFuZGxlIHRoaW5ncyBjb3JyZWN0bHkuCi0JKHNvbV9zbHVycF9hcm1hcCk6IFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZW1iZXIuCi0JKG5vcm1hbGl6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBUYWtlIHRoZSBzaXplIG9mIHRoZSBleHRlbmRlZAotCW5hbWUgdGFibGUgaW50byBhY2NvdW50IHdoZW4gY29tcHV0aW5nIHRoZSBmaWxlIG9mZnNldHMgaW4gdGhlCi0JU09NIGRpY3Rpb25hcnkuICBNYWtlIHN1cmUgdG8gYWxpZ24gdG8gYW4gZXZlbiBib3VuZGFyeS4KLQkoc29tX3dyaXRlX2FybWFwKTogSW5pdGlhbGl6ZSB0aGUgY2hlY2tzdW0gdG8gemVyby4KLQkoYXJfbWF4Y2hhcnMpOiBGaXguICBPcHBzLgotCi1GcmkgTWFyIDE4IDIwOjM1OjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SIG9uIGEgNjQtYml0Ci0JbWFjaGluZS4gIEhhbmRsZSBCRkRfUkVMT0NfU1BBUkMxMyBhbmQgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMy4KLQotVGh1IE1hciAxNyAxODoyNjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoQkZEX1ZFUlNJT04pOiBVc2UgQFZFUlNJT05ALgotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogUmVwbGFjZSBpdCB3aXRoIGNvbnRlbnRzIG9mIFZFUlNJT04gZmlsZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogRml4ZWQgdHlwbyB3aGVyZQotCXRoaXMgd2FzIGFsc28gbmFtZWQgdHJhZF91bml4X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0KLVRodSBNYXIgMTcgMTA6Mzc6MDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmgsIGVsZmNvZGUuaCwgY29mZi1hbHBoYS5jLCBib3V0LmMsIGVjb2ZmLmMsIGVjb2ZmbGluay5jLAotCWVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCBsaW5rZXIuYywgc29tLmMsIHN1bm9zLmM6IElmIG1hbGxvYygwKQotCXJldHVybnMgTlVMTCwgaXQgaXMgbm90IGFuIGVycm9yLiAgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgb2YKLQl0aGVzZSBjaGVja3MgYXJlIG5vdCBuZWNlc3NhcnkgKGJlY2F1c2UgdGhlIHNpemUgY2FuIG5ldmVyIGJlCi0JemVybyksIGJ1dCBwdXR0aW5nIGluIHRoZSBjaGVja3MgaXMgdGhlIGNvbnNlcnZhdGl2ZSB0aGluZyB0byBkbwotCWluIGxpZ2h0IG9mIHRoZSBmYWN0IHRoYXQgc29tZSBvZiB0aGVzZSBtYWxsb2MgY2FsbHMgcmVwbGFjZWQKLQl1bmNoZWNrZWQgYWxsb2NhIGNhbGxzLCBpbiB3aGljaCBhIHplcm8gYXJndW1lbnQgd291bGQgd29yayBmaW5lLgotCi1UaHUgTWFyIDE3IDExOjQ0OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbW92ZQotCWR1cGxpY2F0ZSBkZWZpbml0aW9uLgotCShvc2ZfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUuCi0KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IGZhaWwKLQlpZiBtYWxsb2MgKDApIGZhaWxzLiAgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyByZXR1cm5pbmcgMCBpcyBub3QgYQotCWZhaWx1cmUgaW5kaWNhdGlvbiwgaXQgbWVyZWx5IG1lYW5zIHRoZXJlIGFyZSBubyByZWxvY3MuCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEb24ndCB1c2Ugc3BhY2UKLQlhZnRlciBOQU1FLCBzaW5jZSBTdW5PUyAvYmluL2NjIGNhbid0IGhhbmRsZSBpdC4KLQotV2VkIE1hciAxNiAxNjo0MzozMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5ldGJzZDM4Ni5jIChOX1NFVF9GTEFHUyk6IERvbid0IG51a2UgdGhlIG1hY2hpbmUgaWQgZmllbGQuCi0JRnJvbSBzdWtlc0BnbHVlLnVtZC5lZHUgKFRhc3VraSBIaXJhdGEpLgotCi1XZWQgTWFyIDE2IDA3OjU1OjU0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoNCBwbGFjZXMpOiBVc2UgYSBzaW1wbGUgI2lmIG9uIEFSQ0hfU0laRSwgcmF0aGVyIHRoYW4KLQlhbGwgdGhhdCBjb252b2x1dGVkIHN0dWZmIHdpdGggTkFNRSwgQ0FUMywgZXRjLiAgVGhlIGNvbnZvbHV0ZWQKLQlzdHVmZiBicm9rZSBmb3IgU3VuT1M0IC9iaW4vY2MgKGR1ZSB0byBERUZVTiBlbGltaW5hdGlvbiwgSSBndWVzcykuCi0KLVdlZCBNYXIgMTYgMDA6MDI6MDUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogRGV0ZWN0IHNlY3Rpb24gc3ltYm9scyBiYXNlZAotCW9uIGVpdGhlciB0aGUgbGFjayBvZiBwcml2YXRlIGRhdGEgb3IgdGhlIHN5bWJvbCBmbGFncy4gIERvIG5vdAotCW11bmdlIHNlY3Rpb24gc3ltYm9sIG5hbWVzIGFueW1vcmUgLS0gdGhleSBubyBsb25nZXIgY29uZnVzZSBHREIuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogTGVhdmUgc3BhY2UgZm9yIGFuIGV4ZWMgaGVhZGVyIGlmIHdyaXRpbmcKLQlhbiBleGVjdXRhYmxlLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVjb2duaXplIGJvdGggZm9ybXMgb2Ygc2VjdGlvbiBzeW1ib2wKLQluYW1lcyAiTCQwXDAwMiIgYW5kICIkPEZPTz4kIi4gIENoYW5nZSB0aGUgbmFtZSBvZiAiTCQwXDAwMiIKLQlzZWN0aW9uIHN5bWJvbHMgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhleSByZXByZXNlbnQuCi0JRGVidWdnaW5nICBzeW1ib2xzIGJlZ2luIHdpdGggIkwkMFwwMDEiLCBub3QganVzdCAiTCQiLgotCi1UdWUgTWFyIDE1IDIyOjU4OjI4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBqdW1wIHRhYmxlCi0JZm9yIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLAotCWFuZCBiZmRfaXNfbG9jYWxfbGFiZWwuCi0KLQkqIHRhcmdldHMuYzogQWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4KLQkKLQkqIGJmZC5jIChiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGRlZmluaXRpb24uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgZGVmaW5pdGlvbi4KLQotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZGVmaW5pdGlvbi4KLQotCSogbGliYmZkLWluLmggKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogRGVjbGFyZS4KLQotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCi0JKiAqLWNvcmUuYzogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBuZXcgZnVuY3Rpb25zIGluCi0JdGhlIHRhcmdldCB2ZWN0b3Igd2hpY2ggYWxsIHBvaW50IHRvIGJmZF9mYWxzZS4KLQotCSogYW91dC10YXJnZXQuaCwgY29mZmNvZGUuaCwgZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmgsIGllZWUuYwotCWxpYmFvdXQuaCwgbGliZWNvZmYuaCwgbmxtLXRhcmdldC5oLCBvYXN5cy5jLCBzcmVjLmMsIHRla2hleC5jCi0JRGVmYXVsdCBuZXcgdmVjdG9ycyBmb3IgY29weWluZyBwcml2YXRlIGJhY2tlbmQgZGF0YSB0byBiZmRfdHJ1ZS4KLQlEZWZhdWx0IG5ldyB2ZWN0b3IgZm9yIGRldGVybWluaW5nIGlmIGEgc3ltYm9sIGlzIGEgbG9jYWwgbGFiZWwKLQl0byBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbC4KLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBGb3Igbm93IGRlZmF1bHQgdG8gYmZkX3RydWUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBNYXIgMTUgMjM6NTU6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjZi1tNjhrbHlueC5jIChDQUxDX0FEREVORCk6IFVzZSBfYmZkX202OGtseW54X2hvd3RvX3RhYmxlLgotCi1UdWUgTWFyIDE1IDA0OjQxOjEzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogTW9zdCBmaWxlczoKLQlSZXBsYWNlIERFRlVOIGFuZCBERUZVTl9WT0lEIHdpdGggSyZSLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0JSW5kZW50IHNvbWUgb2YgdGhlbSB0byBHTlUgc3RhbmRhcmRzLgotCi0JKiBhb3V0MzIuYywgYXJjaHVyZXMuYywgY29yZS5jLCBjcHUtaDgzMDAuYywgY3B1LWk5NjAuYywKLQljcHUtbTY4ay5jLCBjcHUtbTg4ay5jLCBjcHUtbWlwcy5jLCBjcHUtdmF4LmMsIGN0b3IuYywgZGVtbzY0LmMsCi0JZWxmMzItaHBwYS5oLCBnZW4tYW91dC5jLCBob3N0LWFvdXQuYywgaW5pdC5jLCBsaWJocHBhLmgsCi0JbGliaWVlZS5oLCBsaWJvYXN5cy5oLCBuZXdzb3MzLmMsIHNvbS5oLCBzdGFiLXN5bXMuYywgc3Vub3MuYzoKLQlVcGRhdGUgY29weXJpZ2h0IHllYXJzLgotCi1Nb24gTWFyIDE0IDExOjQxOjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IEEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgdGhlIHNlY3Rpb24KLQlzeW1ib2wgZm9yIHRoZSAqQUJTKiBzZWN0aW9uIGlzIHJlYWxseSBhIHJlbG9jYXRpb24gaW52b2x2aW5nCi0Jbm8gc3ltYm9sLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRG8gbm90IHNldCBCU0ZfR0xPQkFMIG9yIEJTRl9FWFBPUlQgZm9yCi0JdW5kZWZpbmVkIHN5bWJvbHMuICBDb3JyZWN0bHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBkZWJ1Z2dlciBzeW1ib2xzCi0JYW5kIHNlY3Rpb24gc3ltYm9scy4KLQotCSogc29tIChzZXR1cF9zZWN0aW9ucyk6IFNldCBTRUNfREVCVUdHSU5HIGFuZCB0aGUgc2VjdGlvbiBhdHRyaWJ1dGVzCi0JZm9yIHNwYWNlcyBhbmQgc3Vic3BhY2VzLgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzKTogRml4IHR5cG8uCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogU2V0IEVYRUNfUCwgRF9QQUdFRCwgV1BfVEVYVCwgYW5kCi0JSEFTX1JFTE9DIGJhc2VkIG9uIHRoZSBvYmplY3QncyBtYWdpYyBudW1iZXIuCi0JKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiBEZWxldGUgZnVuY3Rpb24uICBCRkQgYW5kIGl0cyB1c2VycyBhcmUKLQlwcmVwYXJlZCB0byBoYW5kbGUgbXVsdGlwbGUgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLgotCShzZXR1cF9zZWN0aW9ucyk6IEFsbG9jYXRlIHNwYWNlIG9uIHRoZSBCRkQncyBvYnN0YWNrIHRvIGhvbGQKLQlzZWN0aW9uIG5hbWVzLiAgVXNlIGJmZF9tYWtlX3NldGlvbl9hbnl3YXkgcmF0aGVyIHRoYW4gdGhlCi0Jb2Jzb2xldGUgbWFrZV91bmlxdWVfc2VjdGlvbi4KLQkoc29tX3ByZXBfaGVhZGVycyk6IENob29zZSB0aGUgY29ycmVjdCBTT00gbWFnaWMgbnVtYmVyIGJhc2VkCi0Jb24gdGhlIEJGRCdzIGZsYWdzLgotCShzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyk6IFJldHVybiBmYWxzZSwgbm90IE5VTEwgb24gZXJyb3IuCi0KLVNhdCBNYXIgMTIgMDk6NDY6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1wcGMuYzogUmVuYW1lZCBmcm9tIGVsZjMyLXBvd2VycGMuYy4KLQkqIG5sbTMyLXBwYy5jOiBSZW5hbWVkIGZyb20gbmxtMzItcG93ZXJwYy5jLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1GcmkgTWFyIDExIDIyOjI3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItcG93ZXJwYy5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB1cGRhdGUgdG8gcHJlbGltaW5hcnkgQUJJLgotCi1GcmkgTWFyIDExIDAwOjM0OjU5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiAgQXNzdW1lIHRoYXQgZHluYW1pYyBpbmZvCi0JaXMgYWx3YXlzIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24gdG8gYWxsb3cKLQlyZWNvdmVyeSBvZiB0aGUgZHluYW1pYyBpbmZvIGZyb20gYSBzdHJpcHBlZCBleGVjdXRhYmxlLgotCSogZWNvZmYuYyAoZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiAgSGFuZGxlIFNUWVBfUERBVEEsIFNUWVBfWERBVEEKLQlhbmQgU1RZUF9DT01NRU5ULgotCi1XZWQgTWFyICA5IDE3OjE3OjUzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaDogUmVtb3ZlIGFsbG9jYSBjcnVmdC4gIEl0IHdhcyBtaXNzaW5nIHNvbWUgbmVjZXNzYXJ5Ci0JY3J1ZnQgKGxpa2UgdGhlICNwcmFnbWEgYWxsb2NhIGZvciBBSVgpLgotCUluIGFkZGl0aW9uIHRvIHRoYXQgcHJvYmxlbSwgdGhlIEMgYWxsb2NhIGNhbGxzIHhtYWxsb2MsIHdoaWNoCi0JbWVhbnMgY2hlY2tpbmcgZm9yIGJlaW5nIG91dCBvZiBtZW1vcnkgY2FuJ3Qgd29yayByaWdodC4gIFRoZQotCWZvbGxvd2luZyBjaGFuZ2VzIHJlbW92ZSBhbGwgdXNlcyBvZiBhbGxvY2EgZnJvbSBCRkQuCi0JKiBob3N0cy9zb2xhcmlzMi5oOiBSZW1vdmUgYWxsb2NhIGNydWZ0LgotCSogc29tLmM6IFJlcGxhY2UgYWxsb2NhIHdpdGggYSBmaXhlZCBzaXplIGF1dG8gYXJyYXkuCi0JKiBhb3V0eC5oLCBlbGZjb2RlLmgsIG5sbWNvZGUuaCwgYm91dC5jLCBjb2ZmLWFscGhhLmMsIGVjb2ZmLmMsCi0JZWNvZmZsaW5rLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCBsaW5rZXIuYywgcmVsb2MuYywgc29tLmMsCi0Jc3Vub3MuYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBtYWxsb2MgYW5kIGFwcHJvcHJpYXRlIGVycm9yIGNoZWNraW5nIGFuZAotCWZyZWVpbmcuCi0JKiBsaW5rZXIuYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBvYnN0YWNrX2FsbG9jLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBNYXIgIDggMTI6MTA6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIE1JUFNfUl9MSVRFUkFMIGxpa2UKLQlNSVBTX1JfR1BSRUwuCi0KLVNhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGYzMi1ocHBhLmgsIGVsZmNvZGUuaDogIFJlcGxhY2UgdXNlcyBvZiBFbGYqX0hhbGYsIEVsZipfV29yZCwKLQlFbGYqX09mZiB0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24sIHRoZSB0eXBlZGVmcyBoYXZlIGJlZW4KLQlyZW1vdmVkIGZyb20gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIEhhbmRsZSBTSFRfRFlOQU1JQyBzZWN0aW9uIGxpa2UKLQlTSFRfUFJPR0JJVFMgc2VjdGlvbi4KLQotVGh1IE1hciAgMyAyMDowMzozOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKF9QQV9SSVNDX0lEKTogVHJlYXQgSE9TVF9IUFBBT1NGIGp1c3QgbGlrZSBIT1NUX0hQUEFCU0QuCi0KLVdlZCBNYXIgIDIgMTM6Mjg6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgaVszNF04Ni1zZXF1ZW50LSouCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBBIG5vbi16ZXJvLCBub3QgemVybywKLQlyZXR1cm4gZnJvbSBiZmRfc2VlayBpbmRpY2F0ZXMgYW4gZXJyb3IuCi0JTmV3IG1hY3JvIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRSB0byByZXBsYWNlCi0JVFJBRF9DT1JFX1NUQUNLX09GRlNFVC4KLQkqIGhvc3RzL3N5bW1ldHJ5Lmg6IERlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUgYW5kCi0JVFJBRF9DT1JFX1VTRVJfT0ZGU0VUIGJ1dCBub3QgSE9TVF9TVEFDS19PRkZTRVQuCi0KLVdlZCBNYXIgIDIgMTE6NTc6MDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5bY2hdOiBEbyBub3QgaW5jbHVkZSBsaWJocHBhLmggaW4gc29tLmMsIGluc3RlYWQgaW5jbHVkZQotCWl0IGluIHNvbS5oLgotCi0JKiBlbGYzMi1ocHBhLltjaF06IERvIG5vdCBpbmNsdWRlIGxpYmhwcGEuaCBpbiBlbGYzMi1ocHBhLmMsIGluc3RlYWQKLQlpbmNsdWRlIGl0IGluIGVsZjMyLWhwcGEuaC4KLQotCSogc29tLmMgKGxvZzIpOiBSZXR1cm4gLTEgb24gZXJyb3IgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCi0JKHNldHVwX3NlY3Rpb25zKTogQnViYmxlIHVwIGFuIGVycm9yIGZyb20gbG9nMi4KLQotCSogQ2hhbmdlcyB0byBtYWtlIEhQIEMgY29tcGlsZXIgaGFwcHkgaW4gYm90aCB0cmFkaXRpb25hbAotCWFuZCBBTlNJIG1vZGUuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVc2UgY29ycmVjdCBlbnVtIHR5cGUgZm9yCi0JZmllbGQgcGFyYW1ldGVyLgotCShiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBVc2UgdW5zaWduZWQgaW50IHJhdGhlciB0aGFuCi0JdW5zaWduZWQgY2hhciB0byBhdm9pZCBHTlUtQyBleHRlbnNpb25zLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogUmV0dXJuIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSBzdWNjZXNzCi0Jb3IgZmFpbHVyZSByYXRoZXIgdGhhbiBhYm9ydGluZyBvbiBmYWlsdXJlLgotCi0JKiBzb20uaCAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogRml4IHByb3RvdHlwZSB0byBtYXRjaAotCXNvbS5jIGNoYW5nZXMuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBBZGQgcHJvdG90eXBlLgotCShocHBhX3NvbS1nZW5fcmVsb2NfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1ocHBhLmM6IEFkZCBhIGNvdXBsZSBjYXN0cyB0byBtYWtlIEhQIGNvbXBpbGVyIGhhcHB5LgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEbyBub3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKLQl1bnRpbCByZXN0IG9mIGNvZGUgaXMgcmVhZHkgdG8gaGFuZGxlIGl0LiAgQWJvcnQgZm9yIG5vdy4KLQotVHVlIE1hciAgMSAxODozMzo1OSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1UdWUgTWFyICAxIDEzOjA2OjUzIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGkzODZvczlrLmM6IHVzZSBuZXcgZnVuY3Rpb25zIGJmZF9zZXRfZXJyb3IgYW5kIGJmZF9nZXRfZXJyb3IuCi0JKiBNYWtlZmlsZS5pbjogZGVsZXRlIGFuIGV4dHJhIGJsYW5rLgotCSogY29uZmlndXJlLmluIDogQWRkIGkzOTZvczlrX3ZlYy4KLQotTW9uIEZlYiAyOCAxNTo0MTowMSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIDogQWRkIGkzODYtb3M5ay4KLQkqIGNvbmZpZy9pMzg2LW9zOWsubXQgOiBOZXdseSBhZGQgb3M5ayB0YXJnZXQgbWFrZWZpbGUuCi0KLQkqIGkzODZvczlrLmMgOiBuZXcgZmlsZSB0byBoYW5kbGUgb3M5ayBmb3JtYXQgYmZkLgotCSogTWFrZWZpbGUuaW4gOiBIYW5kbGUgbmV3IGZpbGUgaTM4Nm9zOWsuYwotCSogdGFyZ2V0cy5jIDogQWRkIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyIGFuZCBpMzg2b3M5a192ZWMuCi0JKiBjYWNoZS5jIDogSW5pdGlhbGl6ZSBjYWNoZV9zZW50aW5lbCB0byAwLgotCi1TdW4gRmViIDI3IDE2OjMwOjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKG1pc21hdGNoZXMsIHJldHZhbF9taXNtYXRjaGVzKTogRml4IG1pc21hdGNoCi0JYWN0aW9uIGluIGNhc2Ugd2hlcmUgY2FsbGVyIHNwZWNpZmllZCBubyBhcmd1bWVudCByZWxvY2F0aW9uLgotCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1Yik6IFRyeSBhZ2FpbiB0byBnZXQgdGhlIHN5bV9wdHJfcHRyCi0JcmlnaHQgaW4gdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24gYW5kIHRoZSBzdHViJ3MgcmVsb2NhdGlvbi4KLQotICAgICAgICAqIGVsZjMyLWhwcGEuaCAoaHBwYV9sb29rX2Zvcl9zdHViX2luX3NlY3Rpb24pOiBGaXggdHlwby4gIERlbGV0ZQotCXVudXNlZCBzeW1ib2xzIGFyZ3VtZW50LgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBBY2NlcHQgYXN5bWJvbCAqKiByYXRoZXIKLQl0aGFuIGFzeW1ib2wgKiBmb3Igb3JpZ2luYWwgdGFyZ2V0IHN5bWJvbC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JU2V0IHJlbG9jLT5zeW1fcHRyX3B0ciBhcHByb3ByaWF0ZWx5LgotCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1Yik6IFNldCByZWxvYy0+c3ltX3B0cl9wdHIgY29ycmVjdGx5LgotCShocHBhX2VsZl9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTm8gbG9uZ2VyIG5lZWQgc3ltYm9scwotCWFyZ3VtZW50LiAgVXNlIHRoZSBvdXRwdXQgc3ltYm9scyB3aGVuIGNhbm9uaWNhbGl6aW5nIHRoZSByZWxvY3MsCi0JY3JlYXRpbmcgdGhlbSBpZiBuZWNlc3NhcnkuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IERvIG5vdAotCXJlYnVpbGQvY2xvYmJlciB0aGUgb3V0cHV0IHN5bWJvbHMgaWYgdGhleSBhbHJlYWR5IGV4aXN0LgotCi1TdW4gRmViIDI3IDE1OjIyOjM2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChCRkRfU0VORCwgQkZEX1NFTkRfRk1UKTogQWRkIGRlYnVnZ2luZyB2ZXJzaW9ucyB0aGF0Ci0JY2hlY2sgYWxsIHRoZSBwb2ludGVyIGRlcmVmZXJlbmNlcy4gIEVuYWJsZWQgdmlhIERFQlVHX0JGRF9TRU5ELgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBzcmVjLmMgKGhleF92YWx1ZSk6IEFsd2F5cyBzZXQgdG8gYSBzaXplIG9mIDI1NiBieXRlcy4KLQkoc3JlY19pbml0KTogQ29zbWV0aWMgY2hhbmdlcy4KLQotU3VuIEZlYiAyNyAxMToxODo0NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jOiBTZWNvbmQgaGFsZiBvZiBtYWpvciBjbGVhbnVwLiAgTW9yZSBjb21tZW50cywKLQlQQVJBTWl6ZSBhbmQgc3RhdGljaXplIHJlc3Qgb2YgZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZAotCWZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQvdW5uZWNlc3NhcnkgYXJndW1lbnRzIHRvIHNvbWUgZnVuY3Rpb25zLgotCUdyb3VwIHN0YXRpYyB2YXJzIHRvZ2V0aGVyLiAgQWJvcnQgZm9yIGJhZCBlcnJvcnMgdW50aWwgd2UgaGF2ZQotCWVycm9yIGNvZGUgcHJvcG9nYXRpb24gd29ya2luZy4gIFdvcmsgb24gc3BhY2luZyBhbmQgaW5kZW50aW9uLgotCUFkZCBGSVhNRXMgZm9yIHVucmVzb2x2ZWQgcHJvYmxlbXMuICBVc2UgZW51bXMgcmF0aGVyIHRoYW4KLQkjZGVmaW5lcyBmb3IgbG90cyBvZiB0aGluZ3MuICBNZXJnZSB0d28gZnVuY3Rpb25zIHdoaWNoIGJ1aWxkCi0JbGlua2VyIHN0dWJzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gKHNvIHRoZXkgY2FuIGVhc2lseSBzaGFyZSBhCi0JdG9uIG9mIGNvbW1vbiBjb2RlKS4KLQotU2F0IEZlYiAyNiAxMDowMDo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBBZGp1c3QgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cgdG8KLQlhdm9pZCBkZXBlbmRpbmcgdXBvbiByaWdodCBzaGlmdHMgb2Ygc2lnbmVkIG51bWJlcnMsIGFuZCB0bwotCWNvcnJlY3QgaGFuZGxpbmcgb2Ygc3JjX21hc2sgd2l0aCBsb3dlciBiaXRzIHplcm8uCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYzogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4KLQkqIGVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlY29mZnN3YXAuaCwgc3JlYy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYzogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1ha2UgaSB1bnNpZ25lZDsgcmVtb3ZlIG9sZAotCSNpZiAwIGNvZGUuCi0JKGVsZl93cml0ZV9waGRycyk6IE1ha2UgaSB1bnNpZ25lZC4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBNYWtlIGkgYW5kIG5fbGVmdCB1bnNpZ25lZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBNYWtlIGkgdW5zaWduZWQuCi0JKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBNYWtlIGkgdW5zaWduZWQuCi0JKE5BTUUoYmZkLGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IE1ha2UgaW5kZXggYXJndW1lbnQgdW5zaWduZWQuCi0KLUZyaSBGZWIgMjUgMjE6MzQ6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IERvbid0IGluY2x1ZGUgYXNzZXJ0LmguCi0JKHN3YXBfb3V0X3N5bXMpOiBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhc3NlcnQuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogQWRkIG1pc3NpbmcKLQlicmVhayBpbiBzd2l0Y2guCi0KLQkqIGhvc3RzL2kzODZ2NC5oIChxc29ydCwgc3RydG9sKTogUmVtb3ZlIGluY29ycmVjdCBhbmQgdXNlbGVzcwotCWRlY2xhcmF0aW9ucy4KLQotRnJpIEZlYiAyNSAxNjozNTo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliaHBwYS5oIChocHBhX3JlYnVpbGRfaW5zbik6IE1vdmVkIGhlcmUgZnJvbSBlbGYzMi1ocHBhLmMuCi0KLQkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfdGNfc3ltYm9sKTogQWRkIG5ldyBhcmd1bWVudHMuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IEFkZCBleHRlcm4gZGVjbC4KLQotCSogZWxmMzItaHBwYS5jOiBGaXJzdCBoYWxmIG9mIG1ham9yIGNsZWFudXAuICBBZGQvY2xlYW51cCBsb3RzIG9mCi0JY29tbWVudHMuICBQQVJBTWl6ZSBzb21lIHN0YXRpYyBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkIGZ1bmN0aW9ucy4KLQlEZWxldGUgdW51c2VkL3VubmVjZXNzYXJ5IGFyZ3VtZW50cyB0byBtYW55IGZ1bmN0aW9ucy4gIEdyb3VwCi0Jc3RhdGljIHZhcnMgdG9nZXRoZXIuICBDb2xsYXBzZSBjb21tb24gY2FzZSBzdGF0ZW1lbnRzIHRvZ2V0aGVyCi0JaW4gbWFueSBwbGFjZXMuICBVc2UgZGVmYXVsdCBjYXNlIHdoZW4gcG9zc2libGUgaW5zdGVhZCBvZiBsaXN0aW5nCi0JZWFjaCBjYXNlIHNlcGFyYXRlbHkuICBBYm9ydCBmb3IgYmFkIGVycm9ycyB1bnRpbCB3ZSBnZXQgZXJyb3IKLQljb2RlIHByb3BvZ2F0aW9uIHdvcmtpbmcuICBXb3JrIG9uIHNwYWNpbmcgYW5kIGluZGVudGlvbiBwcm9ibGVtcy4KLQlBZGQgRklYTUVzIGZvciBzb21lIHVucmVzb2x2ZWQgcHJvYmxlbXMuICBEZWxldGUgaG9wZWxlc3NseSBicm9rZW4gCi0JQ09NUExFWCByZWxvY2F0aW9uIHN1cHBvcnQgKGl0J3MgbmV2ZXIgdXNlZCBhbnl3YXkpLgotCShocHBhX2VsZl9yZWJ1aWxkX2luc24pOiBEZWxldGUuICBNb3ZlZCBpbnRvIGxpYmhwcGEuaC4KLQkoZWxmX2hwcGFfdGNfc3ltYm9sKTogQWNjZXB0IGFuZCB1c2UgbmV3IGFyZ3VtZW50cyAoc3ltZXh0IGNoYWlucykuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IEluaXRpYWxpemUgbWF0Y2hpbmdfdmVjdG9yCi0JdG8ga2VlcCBnY2MgLVdhbGwgcXVpZXQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IEZpeCB0eXBvLgotCi0JKiBzb20uYyAoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBVc2UgInNpemVvZiAoYXN5bWJvbCAqKSIKLQlub3QgInNpemVvZiAoc29tX3N5bWJvbF90eXBlICopIi4KLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFVzZSAic2l6ZW9mIChhc3ltYm9sICopIgotCW5vdCAic2l6ZW9mIChhc3ltYm9sIikuICBPcHBzLgotCi1GcmkgRmViIDI1IDEzOjE5OjA0IDE5OTQgIFRlZCBMZW1vbiAgKG1lbGxvbkBwZXBwZXIubmNkLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfZ3Bfc2l6ZSk6IENhbid0IHJldHVybiBncCB2YWx1ZSBvbiBhbiBhcmNoaXZlLgotCShiZmRfc2V0X2dwX3NpemUpOiAgQ2FuJ3Qgc2V0IGdwIHZhbHVlIG9uIGFuIGFyY2hpdmUuCi0KLUZyaSBGZWIgMjUgMTI6NTc6MDAgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChwYXNzX292ZXIpOiBEb24ndCBza2lwIHRvbyBtYW55IGNoYXJhY3RlcnMgd2hlbgotCWVuZCBvZiBsaW5lIHNlZW4uCi0KLUZyaSBGZWIgMjUgMTE6NDE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zaXplb2ZfaGVhZGVycyk6IEFsaWduIHJlc3VsdCB0byAxNiBieXRlCi0JYm91bmRhcnkuCi0KLVRodSBGZWIgMjQgMDc6MTM6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogRGVyaXZlIHN5bWJvbF9pbmZvCi0JZmllbGQgZm9yIGFic29sdXRlIHN5bWJvbHMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHVuZGVmaW5lZAotCWFuZCBjb21tb24gc3ltYm9scy4KLQotVGh1IEZlYiAyNCAwNDoyOToxOSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2NvcmVfZmlsZV9wKTogIENoZWNrIGZvciBjb3JlIGZpbGUgZV9tYWNoaW5lIG1hdGNoCi0JbGlrZSBpbiBlbGZfb2JqZWN0X3AuCi0KLVdlZCBGZWIgMjMgMTg6Mjg6MzcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoYWxsb2NhKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IFVzZSBDUFVfUEFfUklTQzFfMCBmb3IgbWFnaWMKLQludW1iZXIgcmF0aGVyIHRoYW4gSFA5MDAwUzgwMF9JRC4gIE5vdGUgc29tLmMgaXMgY2FyZWZ1bAotCXRvIG1ha2Ugc3VyZSBDUFVfUEFfUklTQzFfMCBpcyBhbHdheXMgZGVmaW5lZC4KLQotTW9uIEZlYiAyMSAxMDoxMjowMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXJnZXRzLm8sIGFyY2h1cmVzLm8pOiBVc2UgQUxMX0NGTEFHUyB0byBzdXBwbHkKLQlmbGFncyB0byBleHBsaWNpdCBjb21waWxlIGFjdGlvbnMuCi0KLU1vbiBGZWIgMjEgMDk6NTA6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmbGluay5jIChlY29mZl93cml0ZV9zeW1oZHIpOiBTZXQgc3ltaGRyLT5tYWdpYyBoZXJlLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFrZSBzdXJlIC5ic3Mgc2VjdGlvbgotCWVuZHMgb24gYSBwYWdlIGJvdW5kYXJ5IGlmIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZS4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgc3ltaGRyLT5tYWdpYyBoZXJlLgotCi0JKiBob3N0cy9ocDMwMC5oOiBJbmNsdWRlIDxzdGRsaWIuaD47IGRvbid0IGRlY2xhcmUgZnJlZS4KLQotCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IFVzZSBhIHBvaW50ZXIgYW5kIGFsbG9jYQotCXJhdGhlciB0aGFuIGFuIGFycmF5IG9mIHZhcmlhYmxlIHNpemUuCi0JKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUgbWFzayBhbmQgc2hpZnQKLQlvcGVyYXRpb24gdG8gYXZvaWQgT1NGIDEuMyBjYyBidWcuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYWtlIHRleHRfc2l6ZSwgZGF0YV9zaXplCi0JYW5kIGJzc19zaXplIGJmZF9zaXplX3R5cGUgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgTWFrZQotCXRleHRfc3RhcnQgYW5kIGRhdGFfc3RhcnQgYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfYWRkX3N0cmluZyk6IFJlbW92ZSBpbmNvcnJlY3QgY2FzdCBvZiByZXR1cm4KLQl2YWx1ZS4KLQotU3VuIEZlYiAyMCAxNjowNjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBDb25zaWRlcgotCXN5bWJvbHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBhcmNoaXZlIG1hcC4KLQotU2F0IEZlYiAxOSAwMzoxNzozMiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvZmYtYWxwaGEuYyAocmVsb2NfbmlsKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLCBhZGQgbWlzc2luZwotCWVycm9yX21lc3NhZ2UgYXJndW1lbnQuCi0JKiBjb2ZmLXNwYXJjLmMgKGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MpOiAgQWRkIGZvcndhcmQgZGVjbGFyYXRpb24sCi0JYWRkIG1pc3NpbmcgZXJyb3JfbWVzc2FnZSBhcmd1bWVudC4KLQkqIG1pcHNic2QuYyAobWlwc19maXhfaGkxNl9zKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLCBhZGQgbWlzc2luZwotCWVycm9yX21lc3NhZ2UgYXJndW1lbnQuCi0KLUZyaSBGZWIgMTggMTE6NDE6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgUG93ZXJQQyBOZXRXYXJlLgotCSogbmxtMzItcG93ZXJwYy5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtbmxtLgotCSogY29uZmlnL3BwYy1ubG0ubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChubG0zMl9wb3dlcnBjX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOyB1c2UKLQlubG0zMi1wb3dlcnBjLm8sIG5sbTMyLm8sIG5sbS5vLgotCSogdGFyZ2V0cy5jIChubG0zMl9wb3dlcnBjX3ZlYyk6IERlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgbmxtMzItcG93ZXJwYy5vLgotCShDRklMRVMpOiBBZGQgbmxtMzItcG93ZXJwYy5jLgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQb3dlclBDIEVMRi4gIERvbmUgd2l0aG91dCBhbiBBQkksIGFuZAotCXByb2JhYmx5IHRvIGJlIGNoYW5nZWQgd2hlbiBJIGdldCBhbiBBQkkuCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotc3lzdjQqKTogTmV3IHRhcmdldDsgdXNlIHBwYy1lbGYuCi0JKiBjb25maWcvcHBjLWVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9wb3dlcnBjX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOyB1c2UKLQllbGYzMi1wb3dlcnBjLm8sIGVsZjMyLm8sIGVsZi5vLgotCSogZWxmMzItcG93ZXJwYy5jOiBOZXcgZmlsZS4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogQWRkIGJmZF9hcmNoX3Bvd2VycGMgY2FzZS4KLQkoZWxmX3NldF9hcmNoX21hY2gpOiBMaWtld2lzZS4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3Bvd2VycGNfdmVjKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1wb3dlcnBjLm8uCi0JKENGSUxFUyk6IEFkZCBlbGYzMi1wb3dlcnBjLmMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLVRodSBGZWIgMTcgMTU6Mjk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfbGluZW51bWJlcnMpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEhhbmRsZSB6ZXJvIHN5bWJvbHMKLQlyZWFzb25hYmx5LiAgQWxsb2NhdGUgeF9zeW1wIHVzaW5nIGFsbG9jYS4KLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IEVMRiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzCi0JbXVzdCBiZSBzb3J0ZWQgYnkgbG9hZCBhZGRyZXNzLiAgVGhpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbnRyaWVzCi0JaW4gcmV2ZXJzZSBvcmRlci4KLQotCSogc2VjdGlvbi5jIChTRUNfSU5fTUVNT1JZKTogRGVmaW5lLgotCShhc2VjdGlvbik6IFJlbmFtZSB1bnVzZWQgZmllbGQgb3RoZXJ1c2VyZGF0YSB0byBjb250ZW50cywgYW5kCi0JbWFrZSBpdCBjaGFyICouCi0JKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogSW5pdGlhbGl6ZSBjb250ZW50cyBmaWVsZCB0byBOVUxMLgotCShiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBJZiBTRUNfSU5fTUVNT1JZIGlzIHNldCwgZ2V0IHNlY3Rpb24KLQljb250ZW50cyBmcm9tIGNvbnRlbnRzIGZpZWxkIHJhdGhlciB0aGFuIGZyb20gZmlsZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotVGh1IEZlYiAxNyAwODozMDo1MyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X2Vycm9yLCBiZmRfc2V0X2Vycm9yKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX2Vycm9yKTogTWFrZSBzdGF0aWMuCi0JKGJmZF9lcnJvcl90eXBlKTogUmVuYW1lZCBmcm9tIGJmZF9lYy4gIFByZXBlbmQgImJmZF9lcnJvcl8iIHRvCi0JYWxsIHZhbHVlcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LWFkb2JlLmMsIGFvdXQtZW5jYXAuYywgYW91dC10YXJnZXQuaCwgCi0JYW91dGYxLmgsIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgCi0JYmZkLmMsIGJvdXQuYywgY2FjaGUuYywgY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgCi0JY29mZi1yczYwMDAuYywgY29mZmNvZGUuaCwgY29mZmdlbi5jLCBjb3JlLmMsIGN0b3IuYywgCi0JZWNvZmYuYywgZWNvZmZsaW5rLmMsIGVsZi5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLW1pcHMuYywgCi0JZWxmY29kZS5oLCBmb3JtYXQuYywgaGFzaC5jLCBocDMwMGhwdXguYywgaHBwYWJzZC1jb3JlLmMsIAotCWkzODZseW54LmMsIGllZWUuYywgbGliYmZkLmMsIGxpYmVsZi5oLCBsaW5rZXIuYywgCi0JbHlueC1jb3JlLmMsIG5sbS5jLCBubG0zMi1hbHBoYS5jLCBubG0zMi1pMzg2LmMsIAotCW5sbTMyLXNwYXJjLmMsIG5sbWNvZGUuaCwgb2FzeXMuYywgb3BuY2xzLmMsIG9zZi1jb3JlLmMsIAotCXB0cmFjZS1jb3JlLmMsIHJlbG9jMTYuYywgcnM2MDAwLWNvcmUuYywgc2VjdGlvbi5jLCBzb20uYywgCi0Jc3JlYy5jLCBzdW5vcy5jLCBzeW1zLmMsIHRhcmdldHMuYywgdGVraGV4LmMsIAotCXRyYWQtY29yZS5jOiBDaGFuZ2UgY2FsbGVycy4KLQotVHVlIEZlYiAxNSAyMjoyNzoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmM6IFJlbW92ZSBGSVhNRXMgZm9yIHRoaW5ncyB3aGljaCBoYXZlIGJlZW4gZGVhbHQgd2l0aC4KLQotVHVlIEZlYiAxNSAxOTozOToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbmNlIHRoaXMgZnVuY3Rpb24gcmVhZHMKLQl1bnJlbG9jYXRlZCBjb250ZW50cywgdGhlIHNlY3Rpb24ncyByYXcgc2l6ZSBpcyBhbHdheXMgdGhlIG9uZSB0bwotCXVzZSBmb3IgYm91bmRzIGNoZWNraW5nLgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogSW4gYXNzZXJ0aW9uLCBjb21wYXJlCi0JbGlua19vcmRlciBzaXplIGZpZWxkIGFnYWluc3QgY29va2VkIHNpemUsIG5vdCByYXcgc2l6ZSwgb2YgaW5wdXQKLQlzZWN0aW9uLgotCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IEZvciBCU1Mgc2VjdGlvbiwganVzdAotCXJldHVybiAwLgotCShhbGlnbmNvZGUpOiBXaGVuIHNocmlua2luZywgdGhlIGFkZGVuZCBzaG91bGQgYmUgc2V0IHRvIHRoZQotCWN1cnJlbnQgb2Zmc2V0IGluIHRoZSBzZWN0aW9uIHBsdXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBwYWRkaW5nCi0JdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHJldGFpbmVkLgotCShiX291dF9yZWxheF9zZWN0aW9uKTogSWYgYSBzZWN0aW9uIGNvbnRhaW5zIG5vIHJlbG9jYXRpb25zLCBkb24ndAotCWJvdGhlciBwcm9jZXNzaW5nIHRoZW0uCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFNldCByZWxvY19kb25lLiAgQXNzZXJ0Ci0JdGhhdCBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgcmV0dXJucyB0cnVlLiAgQ2hlY2sgdGhhdCByZWxvY3MgYXJlCi0JcHJvcGVybHkgb3JkZXJlZC4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlIEFMSUdORE9ORSk6IEFzc2VydAotCXRoYXQgcmVsb2MtPmFkZGVuZCBmYWxscyBiZXR3ZWVuIHRoZSBjdXJyZW50IHNvdXJjZSBvZmZzZXQgYW5kIHRoZQotCXJhdyBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uLgotCi0JKiBjb25maWcuYmZkOiBTdXBwb3J0IGk5NjAgdnh3b3JrcyB2ZXJzaW9ucyA+IDUuMCB3aXRoIGNvZmYsIG5vdAotCWJvdXQuICBEZWZhdWx0IHdpdGggbm8gdmVyc2lvbiBudW1iZXIgaXMgc3RpbGwgYm91dC4gIFN1cHBvcnQKLQlleHBsaWNpdCBpOTYwLWNvZmYgdGFyZ2V0IHRvby4KLQotCSogYm91dC5jOiBDaGFuZ2VkIHNvbWUgaW5kZW50YXRpb24sIGRlbGV0ZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwKLQlmaXhlZCBzb21lIGNvbW1lbnRzLCByZW1vdmVkIHNvbWUgIiNpZiAxIiBsaW5lcy4KLQkob3V0cHV0X2FkZHIpOiBOZXcgbWFjcm8uCi0JKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2ssIGdldF92YWx1ZSwgYWJzMzJjb2RlLCBhbGlnbmNvZGUsCi0JYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlIGl0IGZvciByZWFkYWJpbGl0eS4KLQotVHVlIEZlYiAxNSAwOTowMDoxNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUpOiBJdGVyYXRlIHRocm91Z2ggdGhlIFNPTQotCXN5bWJvbHMsIG5vdCB0aGUgQkZEIHN5bWJvbHMuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMTQgMjI6NTU6MjAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRG8gbm90IGRpZSBpZiBhIEJGRCBkb2Vzbid0Ci0JaGF2ZSBhbnkgc3ltYm9scy4KLQotCSogRmluaXNoIGJhc2ljIHJlYWQtd3JpdGUgc3VwcG9ydCBmb3IgU09NIGFyY2hpdmUgbGlicmFyaWVzLiAgQnVncwotCXN1cmVseSByZW1haW4gYXMgdGhpcyBoYXNuJ3QgYmVlbiB0ZXN0ZWQgYWxsIHRoYXQgbXVjaC4KLQkqIHNvbS5jIChTT01fTFNUX0hBU0hfU0laRSwgU09NX0xTVF9NT0RVTEVfTElNSVQpOiBEZWZpbmUuCi0JKHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyk6IE5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvIG5lY2Vzc2FyeQotCXRvIGJ1aWxkIGJvdGggbm9ybWFsIGFuZCBsaWJyYXJ5IHN5bWJvbCB0YWJsZXMuCi0JKHNvbV9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbiB0byBkZXJpdmUgaW5mbyBuZWNlc3NhcnkKLQl0byBidWlsZCBib3RoIG5vcm1hbCBhbmQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFVzZSBuZXcgZnVuY3Rpb24gdG8gZGVyaXZlIG1pc2MKLQlzeW1ib2wgaW5mb3JtYXRpb24uCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBVcGRhdGUgYmFja2VuZCBwcml2YXRlIGRhdGEgZm9yIHN5bWJvbHMKLQlhcHByb3ByaWF0ZWx5LgotCShzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3N5bWJvbF9oYXNoKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX2FybWFwKTogRmxlc2ggb3V0LgotCShzb21fdmVjKTogRml4IGFyIHBhZGRpbmcgY2hhcmFjdGVyLgotCi0JKiBzb20uYzogQ29uc2lzdGVudGx5IHVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCi0KLU1vbiBGZWIgMTQgMTc6MDI6MjggMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIEFkZCBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LCB1c2UgSE9TVF9BSVgsIHdoZXJlCi0JYXBwcm9wcmlhdGUuCi0JKiByczYwMDAtY29yZS5jOiAgVXNlIEhPU1RfQUlYIGluc3RlYWQgb2YgQ09SRUZJTEVTX1BMRUFTRS4KLQkqIGNvbmZpZy9yczYwMDAubWg6ICBSZW1vdmUgZGVmcyBvZiBBUkNISVZFU19QTEVBU0UgYW5kCi0JQ09SRUZJTEVTX1BMRUFTRS4KLQkqIGNvbmZpZy9yczYwMDBseW54Lm1oOiAgVHVybiBvbiBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvcnM2MDAwLmg6ICAjZGVmaW5lIEhPU1RfQUlYLgotCSogaG9zdHMvcnM2MDAwbHlueC5oOiAgQ3JlYXRlIHRoaXMgdG8gZW5hYmxlIEx5bnggaG9zdCBzdXBwb3J0LgotCi1TdW4gRmViIDEzIDE0OjMwOjAwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoc29tX3N5bWJvbF9kYXRhKTogU2FmZWx5IGFjY2VzcyBiYWNrZW5kIHByaXZhdGUgZGF0YQotCWZvciBCRkQgc3ltYm9scy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0KLQkqIFJlYWQtb25seSBTT00gYXJjaGl2ZSBzdXBwb3J0LgotCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IE5ldyBoZWxwZXIgZnVuY3Rpb24uCi0JKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogTmV3IGhlbHBlciBmdW5jdGlvbi4KLQkoc29tX3NsdXJwX2FybWFwKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgYSBTT00gTFNULgotCi0JKiBzb20uaDogSW5jbHVkZSA8bHN0Lmg+IGFuZCA8YXIuaD4uCi0KLVNhdCBGZWIgMTIgMjI6MzQ6MTQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRml4IHR5cG8uCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZXMgZnJvbSBwcmVwX2hlYWRlcnMgYW5kCi0JZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotRnJpIEZlYiAxMSAxNjo1Njo1MCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAobm9ybWFsaXplKSBbVk1TXTogQ2FsbCBtYWxsb2MsIG5vdCBiZmRfeG1hbGxvYy4KLQkoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogQ2hlY2sgcmVzdWx0IG9mIG5vcm1hbGl6ZS4KLQotVHVlIEZlYiAgOCAwODo1NzozMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlNYWtlIGFsbCBjYWxsZXJzIG9mIG1hbGxvYyBvciByZWFsbG9jIChpbmNsdWRpbmcgdmlhIG9ic3RhY2tzKQotCWNoZWNrIHRoZSByZXN1bHQgZm9yIE5VTEwuICBNb3N0IHNldCBiZmRfZXJyb3IgdG8gbm9fbWVtb3J5IGFuZAotCXJldHVybiBpbiB0aGF0IGNhc2U7IGEgZmV3IGFyZSBoYXJkZXIgdG8gZml4LCBhbmQgYXJlIG1hcmtlZAotCXdpdGggIkZJWE1FIDxyZXR1cm4gdHlwZT4iLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViCi0JaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6ICBDaGVjayBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgcmV0dXJuLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzCi0JX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERpdHRvCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogRGl0dG8uCi0KLQkqIHRla2hleC5jIChmaW5kX2NodW5rIHRla2hleF9ta29iamVjdCk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZmlyc3RfcGhhc2UpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQkodGVraGV4X21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBDaGVjayBiZmRfemFsbG9jLgotCShNWShyZWFkX2R5bmFtaWNfc3ltYm9scykgTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIHN0cmluZ2hhc2guYyAoX2JmZF9zdHJpbmd0YWJfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUuCi0KLQkqIHNyZWMuYzogSW5kZW50LgotCShmaWxsdXBfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvYy4gIEZJWE1FIHZvaWQKLQkoc3JlY19ta29iamVjdCBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0Jc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoZWNrIGJmZF9hbGxvYy4gCi0JKHNyZWNfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCShtYWtlX3VuaXF1ZV9zZWN0aW9uKTogQ2hlY2sgYmZkX2FsbG9jLgotCShzb21fbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBvYXN5cy5jIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgb2FzeXNfYXJjaGl2ZV9wCi0Jb2FzeXNfbWtvYmplY3Qgb2FzeXNfb2JqZWN0X3Agb2FzeXNfbmV3X3NlY3Rpb25faG9vawotCW9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hlY2sgYmZkX2FsbG9jLgotCShvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEpOiBDaGVjayBiZmRfemFsbG9jIGFuZCBiZmRfYWxsb2MuCi0JKG9hc3lzX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogbmxtY29kZS5oIChubG1fbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgYmZkX3phbGxvYyBhbmQgYmZkX2FsbG9jLgotCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIG5sbTMyLWFscGhhLmMgKG5sbV9hbHBoYV9yZWFkX2ltcG9ydCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMKLQkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYwotCShhcmNoaXZlX2hhc2hfbmV3ZnVuYwotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scwotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGJmZF9uZXdfbGlua19vcmRlcik6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCi0KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBpZWVlLmM6IEluZGVudC4KLQkocmVhZF9pZCBnZXRfc3ltYm9sIGdldF9zZWN0aW9uX2VudHJ5IGllZWVfYXJjaGl2ZV9wIGllZWVfb2JqZWN0X3AKLQlpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSBpZWVlX25ld19zZWN0aW9uX2hvb2spOiBDaGVjayBiZmRfYWxsb2MuCi0JKGRvX29uZSk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogQ2hlY2sgaXQuCi0JKGluaXRfZm9yX291dHB1dCk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGVjayBpdC4KLQkoZG9fd2l0aF9yZWxvY3MpOiAgQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKTogRGl0dG8uICBGSVhNRSB2b2lkLgotCShpZWVlX21rb2JqZWN0KTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96bWFsbG9jLgotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sKLQliZmRfemFsbG9jLgotCi0JKiBocHBhYnNkLWNvcmUuYyAoaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sKLQliZmRfemFsbG9jLgotCShocHBhYnNkX2NvcmVfY29yZV9maWxlX3ApOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogZWxmY29kZS5oIChlbGZfbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF9hbGxvYy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogRGl0dG8uCi0JKHdyaXRlX3JlbG9jcyk6IERpdHRvLiAgRklYTUUgdm9pZAotCShlbGZfbWFwX3N5bWJvbHMgYXNzaWduX3NlY3Rpb25fbnVtYmVycyBtYXBfcHJvZ3JhbV9zZWdtZW50cyk6Ci0JRGl0dG8uICBSZXR1cm4gYSBib29sZWFuLiAKLQkoc3dhcF9vdXRfc3ltcyk6IERpdHRvLiAgQ2hlY2sgZWxmX21hcF9zeW1ib2xzLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogRGl0dG8uCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFJldHVybiBhIGJvb2xlYW4uCi0JQ2hlY2sgbWFwX3Byb2dyYW1fc2VnbWVudHMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBpdC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfYnJhbmNoX3JlbG9jKTogQ2hlY2sgYmZkX3ptYWxsb2MgYW5kCi0JcmVhbGxvYy4gCi0JKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBEaXR0by4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBDaGVjayBiZmRfemFsbG9jLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogRGl0dG8uCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERpdHRvLgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShlY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayBpdC4KLQkoZWNvZmZfc2x1cnBfYXJtYXApOiBDaGVjayBiZmRfYWxsb2MuCi0JKGVjb2ZmX3dyaXRlX2FybWFwKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZSBhbmQKLQlfYmZkX2xpbmtfaGFzaF9uZXdmdW5jLiAKLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBjdG9yLmMgKGJmZF9jb25zdHJ1Y3Rvcl9lbnRyeSk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBDaGVjayBiZmRfYWxsb2MuCi0JKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZXR1cm4gYSBib29sZWFuLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IENoZWNrIGJmZF9hbGxvYy4gIEZJWE1FIGludAotCShjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoY29mZl9zZWN0aW9uX3N5bWJvbCk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2hlY2sgYmZkX2FsbG9jLgotCShjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKiBsaWJjb2ZmLWluLmg6IENoYW5nZSBkZWNscyBvZiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMsCi0JY29mZl93cml0ZV9saW5lbnVtYmVycy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sKLQljb2ZmX3JlbnVtYmVyX3N5bWJvbHMsIGNvZmZfd3JpdGVfbGluZW51bWJlcnMuCi0KLQkqIGNvZmZjb2RlLmg6IEluZGVudC4KLQkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4gIFJldHVybiBhCi0JYm9vbGVhbi4gCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgaXQuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGJmZF9hbGxvYy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogQ2hlY2sgYmZkX2FsbG9jIHZhbHVlLgotCShkb19zbHVycF9ic2RfYXJtYXApOiBEaXR0by4KLQkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBDaGVjayBiZmRfcmVhbGxvYyB2YWx1ZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIGJmZF9hbGxvYwotCXJldHVybiB2YWx1ZS4gIFJldHVybiBib29sZWFuIHZhbHVlLgotCShOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpKTogQ2hlY2sgYmZkX3phbGxvYyByZXR1cm4gdmFsdWUuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogQ2hlY2sgYmZfYWxsb2MgYW5kIGJmZF96YWxsb2MKLQlyZXR1cm4gdmFsdWUuCi0JKGFkZF90b19zdHJpbmd0YWIpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQkoYW91dF9saW5rX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIHJldHVybiB2YWx1ZS4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jIHZhbHVlLgotCSh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogQ2hlY2sgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogRGl0dG8uCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaGFzaF9uZXdmdW5jKTogQ2hlY2sgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYy4KLQotCSogb3BuY2xzLmMgKGJmZF96YWxsb2MgYmZkX3JlYWxsb2MpOiBDaGVjayByZXN1bHQgb2YgYmZkX2FsbG9jLgotCi0JKiBvcG5jbHMuYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JKF9iZmRfbmV3X2JmZCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuLgotCi0JKiBpZWVlLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCShpZWVlX2FyY2hpdmVfcCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuIGFuZAotCW9ic3RhY2tfZmluaXNoIGZvciBOVUxMIHJldHVybi4KLQotCSogaGFzaC5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQkoYmZkX2hhc2hfdGFibGVfaW5pdF9uKTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4gYW5kCi0Jb2JzdGFja19maW5pc2ggZm9yIE5VTEwgcmV0dXJuLgotCShiZmRfaGFzaF9sb29rdXApOiBDaGVjayBvYnN0YWNrX2FsbG9jIGZvciBOVUxMIHJldHVybi4KLQotCSogZWNvZmZsaW5rLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBDaGVjayBvYnN0YWNrX2FsbG9jLgotCShhZGRfZmlsZV9zaHVmZmxlIGFkZF9tZW1vcnlfc2h1ZmZsZSk6IENoZWNrIG9ic3RhY2tfYWxsb2MgZm9yCi0JTlVMTCByZXR1cm4uICBSZXR1cm4gYm9vbGVhbiwgbm90IHZvaWQuCi0JKGJmZF9lY29mZl9kZWJ1Z19pbml0KTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4uCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogQ2hlY2sgYWRkX2ZpbGVfc2h1ZmZsZQotCWFuZCBhZGRfbWVtb3J5X3NodWZmbGUgcmV0dXJuLiAKLQkoc3RyaW5nX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIGFuZCBiZmRfaGFzaF9uZXdmdW5jLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZWNvZmZfYWRkX3N0cmluZyk6IENoZWNrIGFkZF9tZW1vcnlfc2h1ZmZsZSByZXR1cm4uCi0KLQkqIGxpYmJmZC1pbi5oICh4bWFsbG9jLCBiZmRfeG1hbGxvYywgYmZkX3htYWxsb2NfYnlfc2l6ZV90KToKLQlSZW1vdmUgZGVjbHMuIAotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLUZyaSBGZWIgMTEgMTU6MzU6MzIgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBBZGQgTHlueC9yczYwMDAgc3VwcG9ydC4KLQkqIGNvbmZpZy9pMzg2LW5sbS5tdDogIEVuYWJsZSBhLm91dCBmaWxlIHN1cHBvcnQuCi0JKiBjb25maWcvcnM2MDAwbHlueC5taDogIEx5bngvcnM2MDAwIGhvc3Qgc3VwcG9ydC4KLQotRnJpIEZlYiAxMSAxNzoyNTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBSZXdyaXRlIHNvbWV3aGF0IHRvIGltcHJvdmUKLQltZW1vcnkgdXNhZ2UuCi0KLUZyaSBGZWIgMTEgMTM6MTA6NDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byAnXG4nIGluIGFyY2hpdmUgbWFnaWMKLQl0byAnXDAxMicsIGZvciBncmVhdGVyIHBvcnRhYmlsaXR5LgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfYXJtYXApOiBEaXR0by4KLQotVGh1IEZlYiAxMCAxMjo1ODo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBDaGVjayBzdHJpcCBzZXR0aW5ncyB0bwotCXNlZSB3aGV0aGVyIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LgotCSogZ2VubGluay5oIChzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8pOiBBZGRlZCBpbmZvCi0JZmllbGQuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIHdnaW5mby5pbmZvLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogQ2hlY2sgc3RyaXAgc2V0dGluZ3MgdG8KLQlzZWUgd2hldGhlciBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IEluaXRpYWxpemUgd2dpbmZvLmluZm8uCi0KLVdlZCBGZWIgIDkgMjE6MzQ6NTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcmVsb2NfcXVldWVfZmluZCk6IERvIG5vdCBleGFtaW5lIGEgTlVMTCBxdWV1ZSBlbnRyeS4KLQotCSogc29tLmM6IENhc3QgcmV0dXJuIHZhbHVlcyBmcm9tIEJGRCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB0bwotCWF2b2lkIHdhcm5pbmdzIGZyb20gdGhlIEhQIGNvbXBpbGVyLgotCi1XZWQgRmViICA5IDEyOjU1OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQWNjZXB0IGEgTElURVJBTAotCXJlbG9jIG9uIGFuICJsZGwiIGluc3RydWN0aW9uIHRvby4KLQotCSogYXJjaGl2ZS5jIChiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSk6IENhc3Qgc3RhdHVzIGVsZW1lbnRzCi0Jd2hlbiBwYXNzaW5nIHRoZW0gdG8gc3ByaW50Zi4gIFVzZSAlbGQgaW5zdGVhZCBvZiAlZC4KLQotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9ta2FyY2hpdmUpOiBSZXR1cm4gZmFsc2UuCi0JKHJzNjAwMF9jb2ZmX3NuYXJmX2FyX2hkcik6IERvbid0IGRlY2xhcmUgZXJybm87IGl0J3Mgbm90IHVzZWQuCi0JQWxzbyByZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBuYW1lbGVuLgotCShyczYwMDBjb2ZmX3dyaXRlX2FybWFwKTogRGVjbGFyZSBvcmxfY291bnQgYW5kIHN0cmlkeCBwYXJhbWV0ZXJzLgotCi1UdWUgRmViICA4IDE4OjAwOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHhtYWxsb2MpOiBEb24ndCBkZWNsYXJlIHBhcmFtZXRlciB0eXBlLCB0byBhdm9pZAotCWNvbmZsaWN0cy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgRmViICA4IDE1OjU1OjUwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAocmVsb2NfbmlsKTogTmV3IGZ1bmN0aW9uLgotCShhbHBoYV9ob3d0b190YWJsZSk6IFVzZSBpdCBhcyBzcGVjaWFsX2Z1bmN0aW9uIHRvIHByZXZlbnQgY2VydGFpbgotCXJlbG9jcyBmcm9tIGJlaW5nIGFkanVzdGVkIGJ5IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJR05PUkUKLQlyZWxvYyBzaG91bGQgYmUgcGFydGlhbF9pbnBsYWNlLgotCShhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBY2NlcHQgYSBMSVRFUkFMCi0JcmVsb2Mgb24gYW4gImxkbCIgaW5zdHJ1Y3Rpb24gdG9vLgotCi1UdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmMzItaHBwYS5jIChDVVJSRU5UX1NUVUJfT0ZGU0VULCBocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YiwKLQlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogIENhc3QgdG8gY2hhciAqIGluc3RlYWQgb2YgaW50Ci0JYmVmb3JlIHBlcmZvcm1pbmcgcG9pbnRlciBhcml0aG1ldGljLgotCi1Nb24gRmViICA3IDIwOjU2OjI3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLW9zZiopOiBVc2UgYmZkX25hbWUgaHBwYW9zZiBmb3IgdGhpcwotCWNvbmZpZ3VyYXRpb24uCi0JKGhwcGEqLSotKmVsZiopOiBUaGlzIGNvbmZpZ3VyYXRpb24gdXNlZCBocHBhLWVsZiBub3cuCi0KLQkqIHNvbS5jOiBUaGlzIGZpbGUgaXMgYWxzbyB1c2VkIGZvciBIT1NUX0hQUEFPU0YuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBFbmFibGUgc29tX3ZlYyBmb3IgSE9TVF9IUFBBT1NGLgotCi0JKiBob3N0cy9ocHBhb3NmLmg6IE5ldyBob3N0IGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotCSogY29uZmlnL2hwcGFic2QubXQgKFNFTEVDVF9WRUNTKTogQWRkIGJmZF9lbGYzMl9ocHBhX3ZlYyBhcwotCUJTRCBoYW5kbGVzIGJvdGggU09NIGFuZCBFTEYgb2JqZWN0IGZpbGVzLgotCi0JKiBjb25maWcvaHBwYW9zZi5taCAoSERFRklORVMpOiBEZWxldGUuICBObyBsb25nZXIgbmVlZGVkLgotCShSQU5MSUIpOiBEb2Vzbid0IGRvIGFueXRoaW5nLCBkZWZpbmUgaXQgdG8gYmUgImVjaG8iLgotCi0JKiBjb25maWcvaHBwYW9zZi5tdDogTmV3IHRhcmdldCBtYWtlZmlsZSBmcmFnbWVudCBmb3IgYSBQQSBydW5uaW5nCi0JT1NGMS4KLQotTW9uIEZlYiAgNyAxNTowMjowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZGVkIGJmZF9hcmNoX3Bvd2VycGMuCi0JKGFyY2h1cmVzX2luaXRfdGFibGUpOiBJZiBTRUxFQ1RfQVJDSElURUNUVVJFUyBpcyBub3QgZGVmaW5lZCwKLQlhZGRlZCBiZmRfcG93ZXJwY19hcmNoLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY3B1LXBvd2VycGMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTLCBDRklMRVMpOiBBZGRlZCBjcHUtcG93ZXJwYy5jLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEdldCB2bWEgYW5kIGFsaWdubWVudF9wb3dlcgotCW9mIGFuIFNIVF9TVFJUQUIgc2VjdGlvbiBmcm9tIHNoX2FkZHIgYW5kIHNoX2FkZHJhbGlnbiwgcmF0aGVyCi0JdGhhbiBqdXN0IHNldHRpbmcgdGhlbSB0byB6ZXJvLgotCi1TdW4gRmViICA2IDIwOjA0OjEwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMsIHN3YXBfb3V0X3N5bXMpOiBDaGVjayBmb3IgTlVMTCByZXR1cm4KLQlmcm9tIGJmZF9uZXdfc3RydGFiLiAKLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoZWNrIGZvciBmYWxzZSByZXR1cm4gZnJvbQotCXN3YXBfb3V0X3N5bXMuIAotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogQ2hlY2sgZm9yIE5VTEwgcmV0dXJuCi0JZnJvbSBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLgotCi0JKiBzeW1zLmM6IE1ha2UgZXhhbXBsZSBhcHBsaWNhdGlvbiBpbiBkb2MgY2FsbCB4bWFsbG9jLCBub3QKLQliZmRfeG1hbGxvYy4gCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpLAotCWFvdXRfbGlua19nZXRfc3ltYm9scywgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpKToKLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUsIGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKToKLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2luaXQpOiAKLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiAKLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IAotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IAotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiAKLQkoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiAKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiAKLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IAotCSogZWxmY29kZS5oIChiZmRfbmV3X3N0cnRhYik6IAotCShiZmRfYWRkXzJfdG9fc3RydGFiKTogCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAKLQkoZWxmX2NvcmVmaWxlX25vdGUpOiAKLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IAotCVVzZSBtYWxsb2MgYW5kIGNoZWNrIHRoZSByZXN1bHQsIGluc3RlYWQgb2YgYmZkX3htYWxsb2MuCi0KLVNhdCBGZWIgIDUgMTI6Mzk6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFB1dCBtNjgqLSotc3lzdiogbGluZSBhZnRlciBtNjgqLSotc3lzdjQqLgotCi1TYXQgRmViICA1IDA1OjMyOjQ0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZCk6ICBQdXQgQ09OU1Qga2V5d29yZCBmb3IgInNyYyIgYmVmb3JlCi0JInVuc2lnbmVkIiwgc29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSBpdCBhZnRlciAidW5zaWduZWQiLgotCSogbGliY29mZi5oLCBsaWJjb2ZmLWluLmggKGJmZF9wZXJmb3JtX3NsaXApOiAgUmVuYW1lICJ2YWx1ZSIgdG8KLQkidmFsIiBpbiBwcm90b3R5cGUgZGVjbGFyYXRpb24gYmVjYXVzZSBzb21lIGNvbXBpbGVycyBkb24ndCBsaWtlCi0JYXJndW1lbnRzIHdob3NlIG5hbWVzIGFyZSB0aGUgc2FtZSBhcyB0eXBlcy4KLQotU2F0IEZlYiAgNSAwMToxNDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogQ29ycmVjdCB0ZXN0IGZvciB3aGV0aGVyCi0Jb2JqZWN0IGZpbGUgZGVmaW5lcyBzeW1ib2wuICBBbHNvLCBpZiBza2lwcGluZyBhIHN5bWJvbCwgc2tpcCB0aGUKLQlzZWNvbmQgc3ltYm9sIG9mIGEgTl9XQVJOSU5HIG9yIE5fSU5EUiBzeW1ib2wgYXMgd2VsbC4KLQotRnJpIEZlYiAgNCAyMzo1NTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgYmFzaWMgc3VwcG9ydCBmb3Igd3JpdGluZyBSUy82MDAwIFhDT0ZGIGZpbGVzLgotCSogY29mZi1yczYwMDAuYyAoZHVtbXlfcmVsb2MpOiBSZW1vdmVkLgotCShyczYwMDBjb2ZmX2hvd3RvX3RhYmxlKTogRGVmaW5lZCBYQ09GRiByZWxvY3MuCi0JKFJUWVBFMkhPV1RPKTogRGVmaW5lZCB0byB1c2UgcnM2MDAwY29mZl9ydHlwZTJob3d0by4KLQkocnM2MDAwY29mZl9ydHlwZTJob3d0byk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmVkIHRvIHVzZQotCXJzNjAwMGNvZmZfcmVsb2NfdHlwZV9sb29rdXAuIAotCShyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShTRUxFQ1RfUkVMT0MpOiBEZWZpbmVkIHRvIHNldCByX3R5cGUgYW5kIHJfc2l6ZSBmaWVsZHMuCi0JKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmVkLgotCSogY29mZmNvZGUuaCAoY29tYmluZWRfZW50cnlfdHlwZSk6IENoYW5nZWQgZml4X3RhZyBhbmQgZml4X2VuZAotCWZpZWxkcyB0byBiaXRmaWVsZHMuICBBZGRlZCBmaWVsZHMgZml4X3ZhbHVlIGFuZCBmaXhfc2NubGVuLgotCShzZWNfdG9fc3R5cF9mbGFncyk6IElmIFNUWVBfREVCVUcgaXMgZGVmaW5lZCwgdXNlIGl0IHJhdGhlciB0aGFuCi0JU1RZUF9JTkZPIGZvciB0aGUgdHlwZSBvZiBhIHNlY3Rpb24gbmFtZWQgLmRlYnVnLgotCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUgaWYgUlM2MDAwQ09GRl9DLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIFJTNjAwMENPRkZfQywgZG9uJ3QgY2FsbAotCWNvZmZfYWRkX21pc3Npbmdfc3ltYm9scy4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBSUzYwMDBDT0ZGX0MsIHRoZW4gaWYgdGhlIGxhc3QgYXV4Ci0JZW50cnkgaGFzIHR5cGUgU1RZX0xEIGNoYW5nZSB0aGUgeF9zY25sZW4gaW50byBhIHBvaW50ZXIgdG8gYQotCXN5bWJvbCBhbmQgc2V0IGZpeF9zY25sZW4uICBBbHNvLCBmb3IgYSBDX0JTVEFUIHN5bWJvbCwgY2hhbmdlIHRoZQotCXZhbHVlIGludG8gYSBwb2ludGVyIHRvIGEgc3ltYm9sIGFuZCBzZXQgZml4X3ZhbHVlLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmdlbi5jIChjb2ZmX21hbmdsZV9zeW1ib2xzKTogUmVpbmRlbnQuICBJZiBmaXhfdmFsdWUgaXMgc2V0LAotCWdldCB0aGUgc3ltYm9sIG9mZnNldC4gTGlrZXdpc2UgZm9yIGZpeF9zY25sZW4uCi0JKHN0cmluZ19zaXplKTogQ2hhbmdlIHR5cGUgdG8gYmZkX3NpemVfdHlwZS4KLQkoZGVidWdfc3RyaW5nX3NpemUsIGRlYnVnX3N0cmluZ19zZWN0aW9uKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogSWYgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyByZXR1cm5zIHRydWUsCi0Jd3JpdGUgdGhlIHN5bWJvbCBuYW1lIGludG8gdGhlIC5kZWJ1ZyBzZWN0aW9uOyBhc3N1bWUgdGhhdCB0aGUKLQlzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCB3aXRoIHRoZSByaWdodCBzaXplLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBJbml0aWFsaXplIGRlYnVnX3N0cmluZ19zaXplIHRvIDAuICBJZgotCWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgcmV0dXJucyB0cnVlLCBkb24ndCBwdXQgc3ltYm9sIG5hbWUgaW4KLQl1c3VhbCBzdHJpbmcgdGFibGUuICBBZnRlciB3cml0aW5nIG91dCBhbGwgc3ltYm9scywgaWYKLQlkZWJ1Z19zdHJpbmdfc2l6ZSBpcyBub3QgMCwgY2hlY2sgdGhhdCBpdCBtYXRjaGVzIHRoZSBzaXplIG9mIHRoZQotCS5kZWJ1ZyBzZWN0aW9uLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IENsZWFyIG5ldyBmaXhfdmFsdWUgYW5kIGZpeF9zY25sZW4KLQlmaWVsZHMuICBJZiB0aGUgc3RyaW5nIG9mZnNldCBpcyAwLCBhbHdheXMgdXNlIGFuIGVtcHR5IHN0cmluZyBhcwotCXRoZSBuYW1lLgotCShjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKTogWmVybyBvdXQgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogV29yayBhcm91bmQgb25lIGdyb3NzIGhhY2sKLQl3aXRoIGFub3RoZXI6IGFjdHVhbGx5IGxvb2sgYXQgdGhlIHRhcmdldCBuYW1lIHRvIGF2b2lkIHRoZSBicm9rZW4KLQlDT0ZGIGNoZWNrLgotCShiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgQkZEX1JFTE9DX1BQQ19CMjYsCi0JQkZEX1JFTE9DX1BQQ19CQTI2IGFuZCBCRkRfUkVMT0NfUFBDX1RPQzE2LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgRmViICA0IDE3OjI4OjMyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogQ2FsbCBiZmRfeG1hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4KLQkoYmZkX3htYWxsb2MsIGJmZF94bWFsbG9jX2J5X3NpemVfdCk6IEZ1bmN0aW9ucyBkZWxldGVkLgotCSogbGliYmZkLWluLmg6IERlZmluZSB0aGVtIGFzIG1hY3JvcyBjYWxsaW5nIHhtYWxsb2MgYW5kIGRlY2xhcmUKLQl4bWFsbG9jLiAKLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UaHUgRmViICAzIDE2OjQ5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMpOiBJZiBhIHNtYWxsIHVuZGVmaW5lZAotCXN5bWJvbCBoYXMgYSB2YWx1ZSBpbiB0aGUgRUNPRkYgc3ltYm9sIGJ1dCBub3QgaW4gdGhlIEJGRCBzeW1ib2wsCi0Ja2VlcCB0aGUgdmFsdWUgaW4gdGhlIEVDT0ZGIHN5bWJvbC4gIFRoaXMgaGVscHMgZ2FzLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMsCi0JX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IHJlcXVpcmUgdGhhdCBhbGwKLQlyZWZlcmVuY2VzIHRvIGEgY29tbW9uIHN5bWJvbCBiZSB0aGVtc2VsdmVzIGNvbW1vbiBzeW1ib2xzLgotCi0JKiBhb3V0eC5oIChhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24pOiBIYW5kbGUgTl9VTkRGLgotCi1XZWQgRmViICAyIDIwOjM3OjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYywgYmZkLWluLmgsIGhvc3RzL2FscGhhb3NmLmgsIGhvc3RzL3NwYXJjLWxsLmgsIGFvdXRmMS5oLAotCXNwYXJjbHlueC5jLCBNYWtlZmlsZS5pbjogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotV2VkIEZlYiAgMiAxMjozMDoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSB0eXBlCi0JYW5kIHNpemUgY29ycmVjdGx5LgotCShjb2ZmX3N3YXBfYXV4X2luKTogSWYgUlM2MDAwQ09GRl9DLCBjaGFuZ2UgeF9jc2VjdC54X3NjbmxlbiB0bwotCXhfY3NlY3QueF9zY25sZW4ubCB0byBtYXRjaCBjaGFuZ2UgaW4gY29mZi9pbnRlcm5hbC5oLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpLCBjb2ZmLWFscGhhLmMKLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlIGNhc3RzIG9mIGF1eF9pbiBhbmQgYXV4X291dAotCWZpZWxkcyB0byBtYXRjaCB5ZXN0ZXJkYXkncyBjaGFuZ2VzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IElmIFNFTEVDVF9SRUxPQyBpcyBkZWZpbmVkLCBwYXNzCi0JaW4gdGhlIGludGVybmFsX3JlbG9jIGl0c2VsZiwgbm90IHRoZSB0eXBlLgotCSogY29mZi1hcG9sbG8uYywgY29mZi1oODMwMC5jLCBjb2ZmLWg4NTAwLmMsIGNvZmYtaTM4Ni5jLAotCWNvZmYtbTY4ay5jLCBjb2ZmLXNoLmMsIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYzogQ2hhbmdlZAotCWRlZmluaXRpb24gb2YgU0VMRUNUX1JFTE9DIGFjY29yZGluZ2x5LgotCi1UdWUgRmViICAxIDEyOjA1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgbmV3IGFyZ3VtZW50cyB0bwotCV9iZmRfY29mZl9zd2FwX2F1eF9pbiBhbmQgX2JmZF9jb2ZmX3N3YXBfYXV4X291dDogYXV4IGluZGV4IG51bWJlcgotCWFuZCBudW1iZXIgb2YgYXV4IGVudHJpZXMuCi0JKGJmZF9jb2ZmX3N3YXBfYXV4X2luLCBiZmRfY29mZl9zd2FwX2F1eF9vdXQpOiBDaGFuZ2VkCi0JYWNjb3JkaW5nbHkuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfYXV4X291dCk6IEFjY2VwdCBuZXcKLQlhcmd1bWVudHMuICBJZiBSUzYwMDBDT0ZGX0MsIG9ubHkgdHJlYXQgQ19FWFQgYW5kIENfSElERVhUCi0Jc3BlY2lhbGx5IGlmIHRoaXMgaXMgdGhlIGxhc3QgYXV4IGVudHJ5LgotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbCwgY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBQYXNzCi0JbmV3IGFyZ3VtZW50cyB0byBzd2FwX2F1eCBmdW5jdGlvbnMuCi0KLVN1biBKYW4gMzAgMTU6MTQ6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2VuLWFvdXQuYyAobWFpbik6IFNldCBERUZBVUxUX0FSQ0ggYmFzZWQgb24gcHJlcHJvY2Vzc29yIG1hY3JvcwotCShvbmx5IHRlc3RpbmcgZm9yIG02OGsgYW5kIHZheCBhdCB0aGUgbW9tZW50KTsgZG8gdmVyaWZ5IHRoYXQgdGhlCi0JcHJlcHJvY2Vzc29yIGRpZG4ndCB0cmFzaCB0aGUgYXJjaCBuYW1lIGluc2lkZSB0aGUgc3RyaW5nIHZlcnNpb24uCi0JRG9uJ3QgcHJpbnQgb3V0ICJwYWdlc2l6ZSA9IiBsaW5lIHRoYXQgcHJldmVudHMgb3V0cHV0IGZyb20KLQljb21waWxpbmcuICBEZXJpdmUgQllURVNfSU5fV09SRCBhbmQgQVJDSCB2YWx1ZXMgZnJvbSBzaXplb2YKLQlyZXN1bHRzLgotCSogTWFrZWZpbGUuaW4gKGFvdXQtcGFyYW1zLmgpOiBQYXNzIGdlbi1hb3V0IGEgZHVtbXkgdGFyZ2V0IG5hbWUuCi0JKGNoZWNrLCBpbnN0YWxsY2hlY2spOiBJZGVudGlmeSBkaXJlY3RvcnkgaW4gIm5vIHRlc3RzdWl0ZXMiCi0JbWVzc2FnZS4KLQotU3VuIEphbiAzMCAxMzoyNToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogV3JpdGUgb3V0IGNvcnJlY3QgdmFsdWUgZm9yCi0Jb2JqZWN0IGZpbGUgc3ltYm9sLgotCi1GcmkgSmFuIDI4IDE4OjM0OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3ZheGJzZC5oIChIT1NUX1NUQUNLX0VORF9BRERSKTogVmF4IEJTRCBkb2Vzbid0IGRlZmluZQotCUtFUk5CQVNFLCBzbyBoYXJkLWNvZGUgMHg4MDAwMDAwMCBpbnN0ZWFkLgotCi1UaHUgSmFuIDI3IDEzOjU0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBJZiBzeW1ib2wgaXMgY29tbW9uLAotCXNldCB0aGUgQlNGX09MRF9DT01NT04gZmxhZy4KLQotV2VkIEphbiAyNiAxMzo0NzoxNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBQdXQgdGhlIG5ldyBlbnRyeSBpbiB0aGUKLQljb3JyZWN0IGVsZW1lbnQgb2YgbWF0Y2hpbmdfdmVjdG9yLgotCi1UdWUgSmFuIDI1IDExOjQzOjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzb20uYywgc29tLmggKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcywKLQliZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBDaGFuZ2UgcGFyYW1ldGVycyBmcm9tIGNoYXIKLQl0byBpbnQuICBGb2xsb3dpbmcgYSBwcm90b3R5cGUgd2l0aCBhbiBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbgotCWluIHRoZSBwcmVzZW5jZSBvZiB3aWRlbmVkIHBhcmFtZXRlcnMgaXMgYSBHQ0MtaXNtIG5vdCBzdXBwb3J0ZWQKLQlieSB0aGUgSFAgY29tcGlsZXIgaW4gQU5TSSBtb2RlLgotCi1UdWUgSmFuIDI1IDExOjQ2OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogU2l6ZSBvZiB0eXBlIC0yIGlzIDQgYnl0ZXMsIG5vdCAyLgotCi0JKiBocDMwMGhwdXguYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFdyaXRlIG91dCB0aGUgc3ltYm9scwotCWJlZm9yZSB3cml0aW5nIG91dCB0aGUgcmVsb2NzLCBzbyB0aGF0IHRoZSByaWdodCBzeW1ib2wgaW5kaWNlcwotCWFyZSB1c2VkLgotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IERvIG5vdAotCXRyeSB0byBvdmVybGF5IHRoZSBpbnRlcm5hbCBjYXJzeW1zIG9uIHRoZSBleHRlcm5hbCBzeW1kZWZzLiAgVGhhdAotCWNhbiBub3Qgd29yayBpZiB0aGUgc2l6ZSBvZiBhIGhvc3QgcG9pbnRlciBpcyBsYXJnZXIgdGhhbiA0IGJ5dGVzLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2FzdCByZXN1bHQgb2YKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogQXZvaWQgQU5TSSBDIHByb3RvdHlwZS4KLQotCSogYXJjaGl2ZS5jOiBSZWluZGVudGVkIHRvIEdOVSBzdGFuZGFyZHMuCi0KLU1vbiBKYW4gMjQgMTQ6NDE6MjMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkLCBfYmZkX25ld19iZmRfY29udGFpbmVkX2luKTogQWRkCi0JIl9iZmRfIiB0byBmdW5jdGlvbiBuYW1lcy4KLQkqIGFyY2hpdmUuYyAoX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsKSwKLQlsaWJiZmQtaW4uaDogQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IFJlbmFtZWQgZnJvbSB6YWxsb2MuCi0JKiBsaWJiZmQuYyAoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpLAotCXRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApLAotCXRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KSwKLQlwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCksCi0Jb3BuY2xzLmMgKG5ld19iZmQpLCBsaWJiZmQtaW4uaCwKLQlpZWVlLmMgKGllZWVfbWFrZV9lbXB0eV9zeW1ib2wpLAotCWVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpLAotCShocHBhX2VsZl9zdHViX3JlbG9jKTogQ2hhbmdlIGNhbGxlcnMuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUpOiBBZGQgIl9iZmRfIiB0byBuYW1lLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyksIAotCWNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKSwgbGliYmZkLWluLmg6Ci0JQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpLCBsaWJiZmQtaW4uaCwgdGFyZ2V0cy5jLAotCWVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVuYW1lIHRhcmdldF92ZWN0b3IgdG8gYmZkX3RhcmdldF92ZWN0b3IKLQlhbmQgZGVmYXVsdF92ZWN0b3IgdG8gYmZkX2RlZmF1bHRfdmVjdG9yLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfY2hlY2tfZm9ybWF0KTogQ2FsbCBpdC4KLQkoYmZkX21hdGNoaW5nX2Zvcm1hdHMpOiBGdW5jdGlvbiByZW1vdmVkLgotCSogdGFyZ2V0cy5jOiBSZXBsYWNlIHRoZSB2ZWN0b3IgYWRkZWQgb24gSmFuIDIxIHdpdGggYSBjb3VudCBvZgotCWVudHJpZXMgaW4gZGVmYXVsdF92ZWN0b3IuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gSmFuIDI0IDEyOjM4OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbi4gIFNldCBzaXplIG9mCi0JLnBkYXRhIHNlY3Rpb24gYmFzZWQgb24gbG5ub3B0ciBmaWVsZCwgbm90IHNlY3Rpb24gaGVhZGVyLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGlmIHJfc3ltbmR4ID49IDAsCi0Jc2luY2UgaXQgaXMgdW5zaWduZWQuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IFVzZSBhbHBoYV9lY29mZl9vYmplY3RfcCByYXRoZXIgdGhhbgotCWNvZmZfb2JqZWN0X3AuCi0JKiBlY29mZi5jIChlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IGFsaWdubWVudF9wb3dlciBmaWVsZCBvZgotCS5wZGF0YSBzZWN0aW9uIHRvIDMuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNhdmUgdGhlIHNpemUgb2YgdGhlCi0JLnBkYXRhIHNlY3Rpb24gaW4gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZCwgYW5kIGFjdHVhbGx5IGFsaWduIHRoZQotCS5wZGF0YSBzZWN0aW9uIHRvIGFuIGFsaWdubWVudCBwb3dlciBvZiA0LgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogU2V0IG91dHB1dF9oYXNfYmVndW4gYWZ0ZXIKLQljYWxsaW5nIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHNfbG5ub3B0ciBmb3IgdGhlIC5wZGF0YQotCXNlY3Rpb24gZnJvbSB0aGUgbGluZV9maWxlcG9zIGZpZWxkLiAgU2V0IHZzdGFtcCBmb3IgdGhlIG9wdGlvbmFsCi0JaGVhZGVyIGZyb20gdGhlIHZzdGFtcCBvZiB0aGUgc3ltYm9saWMgaGVhZGVyLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IFNldCB2c3RhbXAgb2YgdGhlIHN5bWJvbGljIGhlYWRlciB0byB0aGUKLQl2c3RhbXAgdXNlZCBieSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgaW4gdGhlIGxpbmsuCi0KLQkqIGVjb2ZmbGluay5jIChlY29mZl9hbGlnbl9kZWJ1Zyk6IEFsaWduIFJGRHMgdG8gZGVidWdfYWxpZ24uCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYWNoaXZlX2VsZW1lbnQpOiBTZXQgU0VDX0FMTE9DIGZsYWcKLQlmb3IgYSBjcmVhdGVkIGNvbW1vbiBzZWN0aW9uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBVc2UgZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiB0bwotCWdldCB0aGUgaW5kZXggb2YgYSBjb21tb24gc2VjdGlvbiwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nCi0JU0hOX0NPTU1PTiAoTUlQUyBoYXMgbXVsdGlwbGUgY29tbW9uIHNlY3Rpb25zKS4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFR5cG8gKD09IGZvciA9KS4KLQotCSogYmZkL2FvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwKLQlhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBQYXNzIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvCi0JcmVsb2Nfb3ZlcmZsb3cgY2FsbGJhY2suCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywKLQlhbHBoYV9yZWxvY2F0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogY29mZi1oODUwMC5jIChleHRyYV9jYXNlKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXo4ay5jIChleHRyYV9jYXNlKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTGlrZXdpc2UuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotCSogYm91dC5jIChjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrKTogVXNlIGdldF92YWx1ZSB0byBnZXQKLQl0aGUgc3ltYm9sIHZhbHVlIGFuZCBjaGVjayBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGdldF92YWx1ZSk6IElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBsb29rIGl0IHVwIGluIHRoZSBsaW5rZXIKLQloYXNoIHRhYmxlLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBGb3IgUENSRUwyNCBhbmQgUENSRUwxMwotCXVzZSBnZXRfdmFsdWUgdG8gZ2V0IHRoZSBzeW1ib2wgdmFsdWUgYW5kIGNoZWNrIGZvciB1bmRlZmluZWQKLQlzeW1ib2xzLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IElmIHRoZSBzeW1ib2wgaXMKLQl1bmRlZmluZWQsIGxvb2sgaXQgdXAgaW4gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogVGhlIHN0cmluZyBpbmRleCAwIGhhcyBhCi0Jc3BlY2lhbCBtZWFuaW5nIGZvciBub3JtYWwgc3ltYm9scywgYnV0IG5vdCBmb3IgZHluYW1pYyBzeW1ib2xzLgotCi1TYXQgSmFuIDIyIDEyOjI2OjAxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjbHlueC5jOiAgU2V0dXAgYXBwcm9wcmlhdGUgbWFjcm9zIHRvIGVuYWJsZSBjb3JlIGZpbGUKLQlzdXBwb3J0LgotCi1GcmkgSmFuIDIxIDE2OjI1OjM1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiBBZGQgYSB2ZWN0b3Igb2YgbWF0Y2hpbmcgZm9ybWF0IG5hbWVzLgotCSogZm9ybWF0LmMgKGJmZF9tYXRjaGluZ19mb3JtYXRzKTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiBpdC4KLQkoYmZkX2NoZWNrX2Zvcm1hdCk6IFNldCBpdC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGJmZC1pbi5oOiBSZW1vdmUgZGVjbHMgb2YgYmZkX2VjIHR5cGUgYW5kIGVycm9yIHByaW50aW5nIGZ1bmN0aW9ucy4KLQlSZW1vdmUgZGVjbCBvZiB0eXBlIHN5bWNsYXNzOyB3YXNuJ3QgdXNlZC4KLQkqIGJmZC5jOiBEb2N1bWVudCBlcnJvciBoYW5kbGluZywgaW5jbHVkaW5nIGNvZGUgZnJhZ21lbnRzCi0JY29udGFpbmluZyB0aGUgZXJyb3IgZGVjbHMgdGhhdCB3ZXJlIGluIGJmZC1pbi5oLgotCVJlbW92ZSBERUZVTnMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1GcmkgSmFuIDIxIDE0OjExOjE2IDE5OTQgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oLCBsaWJsbm0uaCwgbmxtMzItYWxwaGEuYyBubG0zMi1pMzg2LmMgbmxtMzItc3BhcmMuYzoKLQlUaGUgc3BhcmMgKGFuZCBwb3NzaWJseSBvdGhlcj8pIE5MTSBmb3JtYXQgcmVxdWlyZXMgYSBkaWZmZXJlbnQKLQl3YXkgdG8gd3JpdGUgZXhwb3J0cywgc28gYWRkIGEgd3JpdGVfZXhwb3J0IGZpZWxkIHRvIHRoZSBiYWNrZW5kCi0JZGF0YSAoYW5kIHNldCBpdCB0byBOVUxMIGZvciBldmVyeXRoaW5nIGJ1dCB0aGUgc3BhcmMpLgotCi1GcmkgSmFuIDIxIDE0OjExOjE2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdW5vcy5jIChNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IENvbXBhcmUgaW5mby0+ZHlucmVsIHdpdGggTlVMTCwKLQlub3QgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMLiAgaW5mby0+ZHlucmVsIGlzIGEgUFRSLCBub3QKLQlhIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqLgotCi1GcmkgSmFuIDIxIDA5OjI5OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6IFJlbW92ZSBlcnJvciBzdHJpbmdzIGZvciBlcnJvcnMgcmVtb3ZlZCBiZWxvdy4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKSwgYmZkLWluLmggKGJmZF9lYyksCi0Jb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZW5hbWUKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uIHRvIG5vbnJlcHJlc2VudGFibGVfc2VjdGlvbi4KLQlOb25lIG9mIHRoZSBvdGhlciBiZmQgZXJyb3IgbmFtZXMgc3RhcnQgd2l0aCAiYmZkX2Vycm9yIi4KLQlSZW1vdmUgZXJyb3JzIHN5bWJvbF9ub3RfZm91bmQgYW5kIG5vX3JlbG9jYXRpb25faW5mbywgd2hpY2ggc2VlbQotCXRvIGJlIHVudXNlZC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLUZyaSBKYW4gMjEgMDE6MTE6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplKTogQWRkZWQgc3VwcG9ydCBmb3IgRUxGLgotCi0JKiBzeW1zLmMgKEJTRl9EWU5BTUlDKTogTmV3IHN5bWJvbCBmbGFnLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogUHJpbnQgaXQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IE5ldyByZWFkX2R5bmFtaWNfc3ltYm9scwotCWFuZCByZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KLQkoc3RydWN0IGFvdXRkYXRhKTogTmV3IGR5bmFtaWNfaW5mbyBmaWVsZC4KLQkob2JqX2FvdXRfZHluYW1pY19pbmZvKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvLCBNWShyZWFkX2R5bmFtaWNfc3ltYm9scyksCi0JTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBOZXcgZnVuY3Rpb25zIHRvIHJlYWQgZHluYW1pYyBzeW1ib2xzCi0JYW5kIHJlbG9jcy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSWYgdGhlIG9iamVjdCBpcwotCWR5bmFtaWNhbGx5IGxpbmtlZCwgc2V0IFNFQ19SRUxPQyBmb3IgYm90aCB0aGUgLnRleHQgYW5kIC5kYXRhCi0Jc2VjdGlvbnMuCi0JKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCBzZXQgQlNGX0xPQ0FMIGZvciBhbgotCXVuZGVmaW5lZCBzeW1ib2wuCi0JKHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBvZgotCXNsdXJwX3N5bWJvbF90YWJsZTsgc2V0IHRoZSBCU0ZfRFlOQU1JQyBmbGFnIGFwcHJvcHJpYXRlbHkuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogUmVhZCBkeW5hbWljIHN5bWJvbHMsIGlmIGFueS4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFJlYWQgZHluYW1pYyByZWxvY3MsIGlmIGFueS4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBJbmNsdWRlIGR5bmFtaWMgcmVsb2MgY291bnQgaW4KLQlyZXR1cm4gdmFsdWUuCi0JKiBhb3V0ZjEuaCAoTkFNRShhb3V0LHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpKTogRG9uJ3Qgd3JpdGUKLQlvdXQgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcyBhZ2FpbnN0IHJlbG9jIHN5bWJvbHMsIHNpbmNlIHRoZXkKLQlhcmUgYWxyZWFkeSBpbiB0aGUgLnRleHQgc2VjdGlvbiBhbmQgd2Ugd291bGRuJ3Qga25vdyB3aGVyZSB0bwotCXdyaXRlIHRoZW0gYW55aG93LgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSByZWFkX2R5bmFtaWNfc3ltYm9scyBhbmQKLQlyZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplCi0JcmVhZF9keW5hbWljX3N5bWJvbHMgYW5kIHJlYWRfZHluYW1pY19yZWxvY3MgZmllbGRzLgotCi1UaHUgSmFuIDIwIDIwOjU3OjI3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2FscGhhb3NmLmggKHVpbnQ2NGVfdHlwZSwgdWludDY0X3R5cGUsIGludDY0X3R5cGUpOiBEZWxldGUKLQl0eXBlZGVmcywgc2luY2UgSE9TVF82NF9CSVQgd2lsbCB0YWtlIGNhcmUgb2YgZGVmaW5pbmcgdGhlbSBpbgotCWJmZC5oLgotCi1XZWQgSmFuIDE5IDE3OjI4OjU5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hbHBoYW9zZi5taCAoSERFRklORVMpOiBEb24ndCBkZWZpbmUgSE9TVF82NF9CSVQgaGVyZTsKLQl0aGF0J3MgZGVhbHQgd2l0aCBlbHNld2hlcmUuCi0JKiBob3N0cy9hbHBoYW9zZi5oIChzcHJpbnRmX3ZtYSwgZnByaW50Zl92bWEpOiBOZXcgbWFjcm9zLgotCSh1aW50NjRfdHlwZUhJR0gsIHVpbnQ2NF90eXBlTE9XKTogQ29tbWVudCB3aXRoIEhPU1RfNjRfQklUIHNvCi0JdGhleSBnZXQgY29waWVkIHRvIGJmZC5oLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGQgc29tZSBBbHBoYSByZWxvY2F0aW9uCi0JdHlwZXMuICBSZW9yZ2FuaXplZCBzb21lIG9mIHRoZSBleGlzdGluZyBvbmVzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSk6IENvbnN0cnVjdCA2NC1iaXQgbmVnYXRpdmUgb25lCi0JdmFsdWVzIGluIGNhc2Ugb2YgY29tcGlsYXRpb24gb24gYSAzMi1iaXQgbWFjaGluZS4gIEZpeCBwY3JlbAotCWZpZWxkcyBvZiBzb21lIHJlbG9jIHR5cGVzLgotCShhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgbW9yZSByZWxvY2F0aW9uIHR5cGVzLgotCi0JKiBiZmQtaW4uaCAodWludDY0X3R5cGVISUdILCB1aW50NjRfdHlwZUxPVyk6IFN1cHBseSBkZWZhdWx0Ci0JZGVmaW5pdGlvbnMgd2hlbiBub3QgZGVmaW5lZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVpbnQ2NF90eXBlIGlzCi0JYSBkZWZpbmVkIG1hY3JvIG9yIG5vdC4KLQkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogRGVmaW5lIG9ubHkgaWYgZnByaW50Zl92bWEgaXMgbm90Ci0JYWxyZWFkeSBkZWZpbmVkLgotCi1XZWQgSmFuIDE5IDAwOjAyOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgdGhlIHR5cGUgb2YgYQotCUJTRl9XQVJOSU5HIHN5bWJvbCB0byBOX1dBUk5JTkcuCi0KLVR1ZSBKYW4gMTggMTY6NDM6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBJbmNyZW1lbnQgc3ltX2hhc2ggYXMgd2VsbCBhcyBwCi0JZm9yIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVwZGF0ZSBzeW1faGFzaCB3aXRoIHRoZSB0YXJnZXQgb2YgYW4KLQlpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4gIElmIGFuIGluZGlyZWN0IHN5bWJvbCBpcyBkZWZpbmVkLAotCW91dHB1dCB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBhbmQgZG9uJ3Qgb3V0cHV0IHRoZSB0YXJnZXQgc3ltYm9sLgotCi1UdWUgSmFuIDE4IDAzOjU0OjU5IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IEdpdmUgd2FybmluZyBzeW1ib2xzCi0JYW4gKHVudXNlZCkgbm9uemVybyBzZWN0aW9uIHZhbHVlLCBuZWVkZWQgZm9yIGNoZWNrIGJlbG93LgotCi1Nb24gSmFuIDE3IDE1OjEyOjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncywKLQlhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBUcmVhdCBOX1NFVFtBQkRUXSB8IE5fRVhUIGxpa2UKLQlOX1NFVFtBQkRUXS4KLQotRnJpIEphbiAxNCAxNjo0NTo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgdGhlcmUgaXMgYSBTSFRfRFlOQU1JQyBzZWN0aW9uLCBzZXQKLQl0aGUgRFlOQU1JQyBmbGFnIGZvciB0aGUgQkZELgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERvbid0IHRyeSB0byB3cml0ZSBvdXQgYQotCUJGRCB3aXRoIHRoZSBEWU5BTUlDIGZsYWcgc2V0LCBzaW5jZSB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgcHJvZ3JhbQotCWhlYWRlciB0YWJsZSBjb3JyZWN0bHkuCi0KLUZyaSBKYW4gMTQgMDE6MDQ6MzYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgRnJlZSB4X3N5bXAgYXQgdGhlIGVuZAotCW9mIHRoZSBmdW5jdGlvbiB0byBhdm9pZCBzdG9yYWdlIGxlYWsuCi0KLVRodSBKYW4gMTMgMjM6MDc6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogQW4gaWZkIGNhbiBiZSAtMS4KLQotVGh1IEphbiAxMyAxMjozMzoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFByb3ZpZGUgYSBkZWZhdWx0IHN5bWJvbCBmb3IKLQlyZWxvY2F0aW9ucyB3aGljaCBkb24ndCBhY3R1YWxseSBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sLgotCi0JKiBzb20uYyAoaHBwYV9zb21fcmVsb2MpOiBBZGQgbmV3ICJlcnJvciBtZXNzYWdlIiBhcmd1bWVudC4KLQotV2VkIEphbiAxMiAxMzozNjo0MyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQlFbmFibGUgZ2RiIHRvIHdyaXRlIHRvIGNvcmUgZmlsZXMgb24gbW9yZSBjb3JlIGZpbGUgcmVhZGVycy4KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6ICBSZW1vdmUgcmFuZ2UgY2hlY2sKLQlmb3Igc2VjdGlvbiBzaXplLCBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0Jd2l0aCBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cuCi0JKiBhaXgzODYtY29yZS5jLCBocHBhYnNkLWNvcmUuYywgaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLAotCW9zZi1jb3JlLmMsIHB0cmFjZS1jb3JlLmMsIHRyYWQtY29yZS5jICgqX3NldF9zZWN0aW9uX2NvbnRlbnRzKToKLQlVc2UgYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMgaW5zdGVhZCBvZiBiZmRfZmFsc2UuCi0KLVdlZCBKYW4gMTIgMTU6MzE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYzogQWRkZWQgaW5pdGlhbCBkb2N1bWVudGF0aW9uLgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogRG9uJ3QgZXhwZWN0IHNwYWNlIGZvcgotCW91dHB1dCByZWxvY2F0aW9ucyBpZiB0aGVyZSBhcmVuJ3QgYW55IGlucHV0IHJlbG9jYXRpb25zLgotCi1UdWUgSmFuIDExIDE0OjM3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogU2V0IGFfZW50cnkgYmVmb3JlIGNvbXB1dGluZwotCWZpbGUgb2Zmc2V0cy4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogQSBjb21tb24gc3ltYm9sIGlzIFNUVF9PQkpFQ1QsIG5vdAotCVNUVF9OT1RZUEUuCi0KLVR1ZSBKYW4gMTEgMDk6MTA6NTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBFTEYsIG5vdCBDT0ZGIGZvciBtODgqLSotZGd1eCouCi0JQ29tYmluZSBtODhrLSotKiBhbmQgbTg4MTEwLSotKiBjYXNlcyBpbnRvIG04OCotKi0qLgotCi1UdWUgSmFuIDExIDAwOjA3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmZsaW5rLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGNvbXByZXNzIGFuZCBtZXJnZSBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiwgYW5kIHRvIHdyaXRlIHNvbWUgb2Ygb3V0IGRpcmVjdGx5IHJhdGhlciB0aGFuIHNhdmluZwotCWl0IGluIG1lbW9yeS4gIFNldmVyYWwgbmV3IGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcywgYW5kIG5ldwotCWFyZ3VtZW50cyB0byBleGlzdGluZyBmdW5jdGlvbnMuCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogQ29tcHV0ZQotCXN5bV9maWxlcG9zIGFzIHdlbGwuCi0JKGVjb2ZmX2dldF9leHRyKTogVXNlIGlmZG1hcCBpbnN0ZWFkIG9mIGlmZGJhc2UuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNvbXB1dGUgc3ltX2ZpbGVwb3MgaGVyZS4KLQlPbmx5IG91dHB1dCBzeW1ib2xzIGlmIG91dHN5bWJvbHMgaXMgbm90IE5VTEwuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluIGVjb2ZmX2RlYnVnX2luZm8gYW5kCi0JYmZkX2Vjb2ZmX2RlYnVnIGZ1bmN0aW9ucy4gIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGVyZS4KLQkoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluCi0JYmZkX2Vjb2ZmX2RlYnVnIGZ1bmN0aW9ucy4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFVzZSBpZmRtYXAgcmF0aGVyIHRoYW4gaWZkYmFzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVhZCBleHRlcm5hbCBzeW1ib2xzCi0JZmlyc3QsIHRvIHB1dCB0aGVtIGluIHRoZSBmaXJzdCBtZW1vcnkgYnVmZmVyLiAgQ2xlYXIgZmRyIGZpZWxkLgotCShtaXBzX2VsZl9nZXRfZXh0cik6IFVzZSBwb2ludGVyIHRvIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2wuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4gYmZkX2Vjb2ZmIGZ1bmN0aW9ucy4KLQlQcmVzZXJ2ZSAudGV4dCwgLmRhdGEgYW5kIC5ic3MgZXZlbiBpZiB0aGV5IGFyZSBlbXB0eS4gIFNhdmUKLQlwb2ludGVyIHRvIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2wgcmF0aGVyIHRoYW4gY29weWluZyBpdC4KLQlEb24ndCBmcmVlIHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IENoYW5nZSBtaXBzX2V4dHIgdG8gUFRSLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9kZWJ1Z19pbml0LCBiZmRfZWNvZmZfZGVidWdfZnJlZSk6IERlY2xhcmUuCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcik6IFJlbmFtZSBkZWNsYXJhdGlvbiBmcm9tCi0JYmZkX2Vjb2ZmX2RlYnVnX2xpbmtfb3RoZXIgYW5kIHVwZGF0ZS4KLQkoYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotTW9uIEphbiAxMCAyMDo0Njo1MyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgIkAiIHdoaWNoIGZvbGxvd3MgYSBiYWNrc2xhc2guICBJbgotCXRoaXMgcG9zaXRpb24gaXQganVzdCBjYXVzZXMgZXJyb3JzLCBub3Qgc3VwcHJlc3NlcyBlY2hvZXMuCi0KLU1vbiBKYW4gMTAgMDk6MDY6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEZpeCBoYW5kbGluZyBvZiBMVCBhbmQgUlQKLQlmaWVsZCBzZWxlY3RvcnMuCi0KLVN1biBKYW4gIDkgMDQ6MzI6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2LW5ldGJzZC5tdCAoU0VMRUNUX1ZFQ1MpOiBJbmNsdWRlIGkzODZic2RfdmVjLgotCi1GcmkgSmFuICA3IDEwOjI3OjI3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBEb24ndCBtZXJnZSB0aGUgc3RhcnQgb2YgYnNzIHdpdGggdGhlCi0JZW5kIG9mIGRhdGEgaWYgdGhleSBhcmUgbm90IGNvbnRpZ3VvdXMuCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogQ29tbWVudCB0aGUgZmllbGRzJyBtZWFuaW5ncy4KLQotRnJpIEphbiAgNyAxNTo0MDoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZsYWcKLQlmb3IgLnJlZ2luZm8gc2VjdGlvbiBoZXJlLgotCShlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IGl0IGhlcmUgaW5zdGVhZC4KLQotRnJpIEphbiAgNyAxMDoyOToyNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLSAgICAJKiBiZmQtaW4uaDogKGJmZF9ib29sZWFuKTogQWRkIHdvcmthcm91bmQgZm9yIHN5c3RlbXMgdGhhdCBhbHNvCi0JZGVmaW5lIHRydWUgYW5kIGZhbHNlIGFzIGVudW1zLgotCShBTE1PU1RfU1REQyk6IEFkZCBhcyBhbHRlcm5hdGl2ZSB0byBfX1NURENfXy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIHN5bXMuYyAoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IENvbnZlcnQgYSBQVFIgdG8gRklMRSouCi0KLVRodSBKYW4gIDYgMTQ6MjQ6NDQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IENhdGNoIHRoZSBjYXNlIHdoZXJlCi0JdGhlcmUgaXMgbm8gb3V0cHV0IHNlY3Rpb24uCi0KLVRodSBKYW4gIDYgMTQ6Mzc6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IElmIHdlIGNhbid0IHJlYWQgdGhlIGZpeGVkIGhlYWRlciwKLQljb3VudCBpdCBhcyBhIHdyb25nIGZvcm1hdCBlcnJvciwgbm90IGEgc3lzdGVtIGNhbGwgZXJyb3IsIHNpbmNlCi0JdGhlIG9iamVjdCBmaWxlIG1pZ2h0IHNpbXBseSBiZSB0b28gc21hbGwuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZGVkIG5sbTMyX2FscGhhX3ZlYyBpbnNpZGUgI2lmZGVmCi0JQkZENjQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgbmxtMzItYWxwaGEuby4KLQkoQkZENjRfQkFDS0VORFMpOiBBZGQgbmxtMzItYWxwaGEuby4gIEl0IGRlcGVuZHMgb24gNjQgYml0Ci0Jc3VwcG9ydCwgZXZlbiB0aG91Z2ggaXQgaXMgZm9yIGFuIEFscGhhIGluIDMyIGJpdCBtb2RlLgotCSogY29uZmlndXJlLmluIChubG0zMl9hbHBoYV92ZWMpOiBTZXQgdGFyZ2V0NjQgdG8gdHJ1ZS4KLQotCSogbmxtMzItZ2VuLmMsIG5sbTY0LWdlbi5jOiBSZW1vdmVkLiAgQWxsIG5sbSB0YXJnZXRzIGFyZQotCWRpZmZlcmVudCwgc28gdGhlcmUgaXMgbm8gcG9pbnQgdG8gcHJvdmlkaW5nIGEgZ2VuZXJpYyBvbmUuCi0JKiBsaWJubG0uaDogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvciBubG1fYmFja2VuZChiZmQpIGJlaW5nIE5VTEwKLQlpbiB0aGUgYmFja2VuZCBhY2Nlc3NvciBtYWNyb3M7IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBwb3NzaWJsZS4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZWQgbmxtMzJfYmlnX2dlbmVyaWNfdmVjLAotCW5sbTY0X2JpZ19nZW5lcmljX3ZlYywgbmxtNjRfbGl0dGxlX2dlbmVyaWNfdmVjLgotCSogY29uZmlndXJlLmluIChubG0zMl9iaWdfZ2VuZXJpY192ZWMsIG5sbTMyX2xpdHRsZV9nZW5lcmljX3ZlYywKLQlubG02NF9iaWdfZ2VuZXJpY192ZWMsIG5sbTY0X2xpdHRsZV9nZW5lcmljX3ZlYyk6IFJlbW92ZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMsIGFuZAotCShCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZWQgbmxtMzItZ2VuLm8uCi0JKEJGRDY0X0JBQ0tFTkRTKTogUmVtb3ZlZCBubG02NC1nZW4uby4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBubG0zMi1nZW4uYyBhbmQgbmxtNjQtZ2VuLmMuCi0KLQkqIGhwMzAwaHB1eC5jIChBUkNIX1NJWkUpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZyBhb3V0eC5oLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBBZGQgY29uc3RydWN0b3IgYW5kCi0JYml0c2l6ZSBhcmd1bWVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzIChhb3V0eC5oKS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBjb25zdHJ1Y3RvcgotCWFuZCBiaXRzaXplIGFyZ3VtZW50cyB0byBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBlY29mZi5jOiBGaXJzdCBjdXQgYXQgbmV3IHN0eWxlIG9mIGxpbmtlciBiYWNrZW5kIGZvcgotCUVDT0ZGLS1hZGRlZCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucy4gIEFsc286Ci0JKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogU2V0IGZsYWdzIGZvciAucGRhdGEgYW5kIC54ZGF0YS4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQ2FsbCBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogR2V0IG91dCBxdWlja2x5IGlmIGNvdW50IGlzIHplcm8uCi0JQ2hlY2sgZXJyb3JzIGJldHRlci4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUHV0IC54ZGF0YSBzZWN0aW9uIGluIGRhdGEgc2VnbWVudC4KLQlDYWxsIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMuICBEb24ndCBvdXRwdXQgcmVsb2NzIG9yCi0JZXh0ZXJuYWwgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIE5VTEwuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQ29tcGxldGVseSByZXdyaXR0ZW4uCi0JKiBsaWJlY29mZi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCShlY29mZl9kYXRhX3R5cGUpOiBBZGQgc3ltX2hhc2hlcyBhbmQgc3ltbmR4X3RvX3NlY3Rpb24gZmllbGRzLgotCShzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIG5vdCBtYWNyby4KLQkoZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzKTogQ2FsbCBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSk6IE1hcmsgQlJBRERSIGFzCi0JcGFydGlhbF9pbnBsYWNlLCBhbmQgc2V0IHRoZSBzcmNfbWFzayB0byAweDFmZmZmZi4KLQkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlIGdwX3dhcm5lZC4KLQkoYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIHJlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9yZWZoaSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCi0JKiByZWxvYy5jIChfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogQ29ycmVjdGVkIHNpZ25lZCBvdmVyZmxvdwotCWNoZWNraW5nIHdoZW4gdGhlcmUgaXMgYW4gYWRkZW5kLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBhYm9ydCB3aGVuIHRyeWluZyB0byBsaW5rCi0JYSBub24gYS5vdXQgZmlsZSwganVzdCBwYXNzIGl0IHRvIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIGRvaW5nIGEgZmluYWwgUEMgcmVsYXRpdmUgbGluawotCWFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgc3VidHJhY3QgdGhlIFZNQSBvZiB0aGUgaW5wdXQgc2VjdGlvbi4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBSZW5hbWVkIGZyb20KLQlfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlciBhbmQgbWFkZSBzdGF0aWMuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogRG9uJ3Qgc3dpdGNoIG9uIGxpbmtfb3JkZXIgdHlwZSwganVzdAotCWNhbGwgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0JKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSGFuZGxlIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyIHR5cGUuCi0JKiBnZW5saW5rLmg6IFJlbW92ZWQgZGVjbGFyYXRpb24gb2YKLQlfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlci4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IERvbid0IHN3aXRjaCBvbiBsaW5rX29yZGVyCi0JdHlwZSwganVzdCBjYWxsIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCi1UdWUgSmFuICA0IDIxOjIzOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBCYXNlIHRoZSBuYW1lIG9mCi0JdGhlIGNyZWF0ZWQgY29tbW9uIHNlY3Rpb24gb24gdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbAotCWNhbWUgZnJvbS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiAoY2FzZSBCSUcpOiBBIGNvbW1vbiBzeW1ib2wKLQltdXN0IGhhdmUgYSBzZWN0aW9uLCBzbyBkb24ndCBib3RoZXIgdG8gY3JlYXRlIG9uZS4KLQotTW9uIEphbiAgMyAxNTozMjoxNiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKHZlYykpOiBBZGQgRFlOQU1JQyB0byBtYXNrIG9mIG9iamVjdCBmbGFncy4KLQkqIGFvdXRmMS5oIChOQU1FKGFvdXQsc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykpOgotCUlmIHRoZSBEWU5BTUlDIGZsYWcgaXMgc2V0LCBzZXQgaXQgaW4gdGhlIGV4ZWMgaGVhZGVyLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBJZiB0aGUgb2JqZWN0IGlzCi0JZHluYW1pY2FsbHkgbGlua2VkLCBzZXQgdGhlIERZTkFNSUMgZmxhZyBpbiB0aGUgQkZELgotCSogbGliYW91dC5oIChOX1NFVF9EWU5BTUlDKTogTmV3IG1hY3JvLgotCShOX0RZTkFNSUMpOiBBZGQgbWlzc2luZyAwIGluIG1hc2suCi0KLU1vbiBKYW4gIDMgMTE6NDE6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9nZXRfZXh0cik6IERvbid0IG91dHB1dCBzZWN0aW9uIHN5bWJvbHMgYXMKLQlleHRlcm5hbCBzeW1ib2xzLgotCi0JKiBiZmQtaW4uaCwgaGFzaC5jOiBDaGFuZ2UgYmZkX2hhc2hfYWxsb2NhdGUgYXJndW1lbnQgZnJvbSBzaXplX3QKLQl0byB1bnNpZ25lZCBpbnQsIGJlY2F1c2Ugc2l6ZV90IG1heSBub3QgYmUgZGVmaW5lZCBpbiBiZmQuaC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogYmZkLWluLmggKGJmZF9nZXR7YixsfVtfc2lnbmVkX117MTYsMzIsNjR9KTogRGVjbGFyZSBhcmd1bWVudCB0bwotCWJlIGEgY29uc3QgcG9pbnRlci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5jIChiZmRfZ2V0e2IsbH1bX3NpZ25lZF9dezE2LDMyLDY0fSk6IERlY2xhcmUgYXJndW1lbnQgdG8KLQliZSBhIGNvbnN0IHBvaW50ZXIuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBDaGFuZ2Ugc3dhcCBmdW5jdGlvbiBwb2ludGVycwotCWFjY29yZGluZ2x5LgotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogQ2hhbmdlIHN3YXAgYWNjb3JkaW5nbHkuCi0JKiBhaXgzODYtY29yZS5jOiBDaGFuZ2UgTk9fR0VUIGFuZCBOT19HRVRTIGFjY29yZGluZ2x5LgotCSogaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jLCBpcml4LWNvcmUuYywgb3NmLWNvcmUuYywKLQlwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYzogQ2hhbmdlIE5PX0dFVCBhbmQgTk9fU0lHTkVEX0dFVAotCWFjY29yZGluZ2x5LgotCi0JKiBsaWJiZmQtaW4uaCAoc3RydWN0IGFydGRhdGEpOiBBZGRlZCB0ZGF0YSBmaWVsZC4KLQkoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUpOiBEZWNsYXJlLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IERlY2xhcmUuCi0JKF9iZmRfc25hcmZfYXJfaGRyKTogUmVuYW1lZCBmcm9tIHNuYXJmX2FyX2hkci4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogYXJjaGl2ZS5jOiBDbGVhbmVkIHVwIHNvbWUgbW9yZS4KLQkoX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSW5pdGlhbGl6ZQotCXBvaW50ZXIgZWxlbWVudHMgb2YgYXJ0ZGF0YS4KLQkoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUpOiBSZW5hbWVkIGZyb20gYWRkX2JmZF90b19jYWNoZS4KLQkoX2JmZF9zbmFyZl9hcl9oZHIpOiBSZW5hbWVkIGZyb20gc25hcmZfYXJfaGRyLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IFJlbmFtZWQgZnJvbSBnZXRfZWx0X2F0X2ZpbGVwb3MuCi0JKGdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSwgYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLAotCWJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtLCBjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IE1hZGUgc3RhdGljLgotCSogZWNvZmYuYzogU29tZSBjb21tZW50IGNoYW5nZXMuCi0JKGVjb2ZmX3NsdXJwX2FybWFwKTogSGFuZGxlIHJlbmFtZSBvZiBzbmFyZl9hcl9oZHIuICBTZXQKLQlhcmRhdGEtPnRkYXRhIHRvIHJhd19hcm1hcC4KLQkoZWNvZmZfYXJjaGl2ZV9wKTogSW5pdGlhbGl6ZSBwb2ludGVyIGVsZW1lbnRzIG9mIGFydGRhdGEuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyk6IEhhbmRsZSByZW5hbWUgb2YKLQlhZGRfYmZkX3RvX2NhY2hlLgotCi0JKiBoYXNoLmM6IEFkZGVkIHNvbWUgZG9jdW1lbnRhdGlvbi4KLQotTW9uIEphbiAgMyAxMTowOToyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgbmV0YnNkMzg2LmM6IFJlcGxhY2UgTk9fU1dBUF9NQUdJQyB3aXRoIFNXQVBfTUFHSUMsCi0JYW5kIGRvIHRoZSBzd2FwcGluZyBoZXJlIHJhdGhlciB0aGFuIGNhbGxpbmcgbnRvaGwgZnJvbSB0aGUgTl8qCi0JbWFjcm9zLiAgVGhpcyBjbGVhbnMgdXAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHNpemUgb2YgYSBob3N0IGxvbmcsCi0JdGhlIGV4aXN0ZW5jZSB0byBudG9obCwgZXRjLgotCi1TYXQgSmFuICAxIDEzOjUwOjA1IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLiBJdCBjdXJyZW50bHkgdXNlcwotCWkzODYtYW91dC4KLQotU2F0IEphbiAgMSAxMDoxODo1NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1NFR01FTlRfU0laRSk6IEZpeCB2YWx1ZS4KLQkqIGkzODZtYWNoMy5jIChTRUdNRU5UX1NJWkUpOiBGaXggdmFsdWUuCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTE5MwotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05Njk3IGIvYmZkL0NoYW5nZUxvZy05Njk3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIyYzhjLi4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2ctOTY5NworKysgL2Rldi9udWxsCkBAIC0xLDY3MTEgKzAsMCBAQAotVHVlIERlYyAzMCAxMjo0NToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IElmIC1Cc3ltYm9saWMsIGRvbid0Ci0JYWxsb2NhdGUgc3BhY2UgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCB3aGljaCBpcwotCWRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkb24ndCBjb3B5IGEgUEMKLQlyZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0JZmlsZS4KLQotTW9uIERlYyAyOSAxODowMjoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEpvbmF0aGFuIFN0b25lIDxqb25hdGhhbkBEU0cuU3RhbmZvcmQuRURVPjoKLQkqIGNvbmZpZy5iZmQgKG1pcHMtZGVjLW5ldGJzZCopOiBBZGQgRUNPRkYgdmVjdG9ycyB0bwotCXRhcmdfc2VsdmVjcy4KLQkobWlwcyplbC0qLW5ldGJzZCopOiBMaWtlIG1pcHMtZGVjLW5ldGJzZCouCi0JKG1pcHMqLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0KLU1vbiBEZWMgMjkgMTc6MTM6MjggMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IENoYW5nZSBlcnJvciBtZXNzYWdlCi0JZnJvbSAidW5kZWZpbmVkIHZlcnNpb24gbmFtZSIgdG8gInVuZGVmaW5lZCB2ZXJzaW9uZWQgc3ltYm9sCi0JbmFtZSIuCi0KLU1vbiBEZWMgMjkgMTE6NDE6MTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvIGZyb20gcHJldmlvdXMKLQlkZWx0YS4KLQotVHVlIERlYyAyMyAxNzowMToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldCAucmVsb2Mgc2VjdGlvbiB0byBiZQotCXNoYXJlZC4gIFNldCBzdGFiKiBzZWN0aW9ucyB0byBiZSBzaGFyZWQgYW5kIHJlYWQuICBTZXQgLnJzcmMKLQlzZWN0aW9uIHRvIGJlIHJlYWQgYW5kIHNoYXJlZC4KLQotTW9uIERlYyAyMiAxMzoyMDo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZHdhcmYyLmxvLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGR3YXJmMi5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvZmYtYXJtLmM6IERvbid0IGluY2x1ZGUgb2JzdGFjay5oLgotCi1Nb24gRGVjIDIyIDEzOjA0OjMzIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlnLmJmZCAoaVszNDU2XTg2Ki1nbzMyLXJ0ZW1zKik6IEZpeCB0byBiZSB0aGUgc2FtZSBhcwotCWlbMzQ1Nl04Ni1nbzMyLgotCi1UaHUgRGVjIDE4IDE2OjAxOjI1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB0byBnZXQgQFNIRUxMQCBzdWJzdGl0dXRlZC4KLQotV2VkIERlYyAxNyAwOTo0NTowOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogT25seSBsb29rIGF0IHNlY3Rpb24KLQlvd25lciBpZiB0aGVyZSBpcyBvbmUuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRmFpbCBpZiB0aGVyZSBpcyBub3QKLQllbm91Z2ggcm9vbSBmb3IgdGhlIHByb2dyYW0gaGVhZGVycy4KLQotVHVlIERlYyAxNiAwODowOTo1NiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2FsbAotCV9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIGZpcnN0LgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogU2FtZS4KLQkqIGR3YXJmMi5jOiBOZXcgZmlsZTsgaW1wbGVtZW50IF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lLgotCi1Nb24gRGVjIDE1IDE2OjA4OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfbWFjaF9tMzJyLgotCi1Nb24gRGVjIDE1IDE2OjExOjIyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChBTElHTl9TRUNUSU9OU19JTl9GSUxFKTogRGVmaW5lIGlmIEk5NjAgbm90IGRlZmluZWQuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXNlIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLQl0byBkZWNpZGUgd2hlbiB0byBhbGlnbiB0aGUgZmlsZSBzZWN0aW9ucyBmb3IgcGFnaW5nLgotCSogY29mZmNvZGUuaCAoQUxJR05fU0VDVElPTlNfSU5fRklMRSk6IFVuZGVmaW5lIGZvciBUSUM4MENPRkYuCi0KLU1vbiBEZWMgMTUgMTU6MDE6MTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9vYmplY3RfcCk6IE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiAgTmV3IEZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IFBvaW50IHRvIG0zMnJfb2JqZWN0X3AuCi0JKGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBQb2ludCB0bwotCW0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0JKGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KLQltMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0JKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IFBvaW50IHRvCi0JbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YS4KLQkoYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IFBvaW50IHRvCi0JbTMycl9lbGZfc2V0X3ByaXZhdGVfYmZkX2RhdGEuCi0JKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFBvaW50IHRvCi0JbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCi0JKiBiZmQtaW4yLmggKGJmZF9tYWNoX20zMnIpOiBBZGQgaWRlbnRpZmllciBmb3IgTTMyUiBhcmNoaXRlY3R1cmUKLQltYWNoaW5lcy4KLQotRnJpIERlYyAxMiAxMTozMDoyOCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBPbmx5IGJ1aWxkIGxpYmJmZCBzaGFyZWQgaWYgLS1lbmFibGUtc2hhcmVkJ3MgdmFsdWUKLQl3YXMgYHllcycsIG9yIHdhcyBzZXQgdG8gYCpiZmQqJy4KLQkqIGFjbG9jYWwubTQ6IExpa2V3aXNlLgotCSogTk9URTogdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgZml4ZWQgaW4gbGlidG9vbC9saWJ0b29sLm00LCB0aGUKLQlvcmlnaW5hbCBzb3VyY2Ugb2YgdGhpcyBiaXQgb2YgY29kZS4gIEl0J3Mgbm90IGNsZWFyIHdoYXQgdGhlIGJlc3QgZml4Ci0Jd291bGQgYmUsIHRob3VnaC4KLQotVGh1IERlYyAxMSAxNzo0ODoxMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IEFsd2F5cyBpbml0IHVkYXRhLnAgc28KLQl0aGF0IHRoZSBnZW5lcmljIHJlbGF4YXRpb24gY29kZSBjYW4gZnVuY3Rpb24gd2hlbiBpbnB1dCBhbmQgb3V0cHV0Ci0JZmlsZSBmb3JtYXRzIGFyZSBtaXNtYXRjaGVkLgotCi1UaHUgRGVjIDExIDAxOjAyOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEZvciBhIGxvYWRhYmxlCi0Jc2VjdGlvbiwgbWFrZSBzdXJlIHRoYXQgdGhlIGxvYWQgYWRkcmVzcyBpcyBjb3JyZWN0IHJlbGF0aXZlIHRvCi0JdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VnbWVudCBwbHVzIHRoZSBzaXplIG9mIHRoZSBzZWdtZW50IHNvCi0JZmFyLgotCi0JKiBjb2ZmY29kZS5oIChfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pOiBNYWtlIHN0YXRpYy4KLQkoX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KTogTGlrZXdpc2UuCi0KLVdlZCBEZWMgMTAgMjM6Mzc6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBhIHJlbG9jYXRlYWJsZSBsaW5rIGluCi0Jd2hpY2ggYSByZWxvY2F0aW9uIHJlZmVycyB0byBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4KLQotV2VkIERlYyAxMCAxMToxNTo1NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChiZmRfYXJtX2NvZmZfZmluYWxfbGluayk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGNvZmZfYXJtX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBsaWJjb2ZmLmggKHN0cnVjdCBiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkczoKLQlfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIGFuZAotCV9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQuICBBZGQgbmV3IG1hY3JvczoKLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oKSBhbmQKLQliZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoKS4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbnNlcnQgY2FsbHMgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oKSBhbmQKLQliZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoKS4KLQotCSogY29mZmNvZGUuaDogQWRkIHR3byBuZXcgZmllbGRzIHRvIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YQotCXN0cnVjdHVyZTogX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biBhbmQKLQlfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0LiAgQWRkIGRlZmF1bHQgaW5pdGlhbGlzZXJzIGZvcgotCXRoZXNlIGZpZWxkcy4gIEFkZCBvdmVycmlkYWJsZSBhbGlhc2VzIGZvciB0aGUgY29mZiBzd2FwIGZ1bmN0aW9ucwotCWluIHRoZSBiYWNrZW5kIGRhdGEgc3RydWN0dXJlLgotCi0JKiBlbGYzMi12ODUwLmM6IFVwZGF0ZSB3aXRoIHBhdGNoZXMgZnJvbSB0aGUgYnJhbmNoIHRvIGZpeAotCUhJMTZfUy9MTzE2IHJlbG9jIHBhaXJzLgotCi1XZWQgRGVjIDEwIDE0OjA2OjQ4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGQzMHZfaW5mb190b19ob3d0b19yZWxhKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQKLQlSRUxBIHJlbG9jYXRpb25zLgotCShVU0VfUkVMKTogRG9uJ3QgZGVmaW5lIGFueSBtb3JlLCBzd2l0Y2ggdG8gdXNpbmcgUkVMQQotCXJlbG9jYXRpb25zLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZSBhcyBkMzB2X2luZm9fdG9faG93dG9fcmVsYS4KLQotVHVlIERlYyAgOSAxMTozNzo1MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX21pcHMqKTogRGVmaW5lLgotCShiZmRfZGVmYXVsdF9zY2FuKTogRm9yIDMwMDAgYW5kIDQwMDAgcmVwbGFjZSBtYWdpYyBjb25zdGFudCB3aXRoCi0gCW1hY3JvLgotCi0JKiBjcHUtbWlwcy5jIChOKTogRGVmaW5lLgotCShiZmRfbWlwc19hcmNoLCBhcmNoX2luZm9fc3RydWN0KTogUmUtd3JpdGUgdXNpbmcgbWFjcm8gTiwgcmVwbGFjZQotIAludW1iZXJzIHdpdGggYmZkX21hY2hfbWlwcyogbWFjcm9zLgotCi1GcmkgRGVjICA1IDExOjEzOjQ2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MsIHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuLAotCXY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggcmVsb2MgYWRkZW5kIGhhbmRsaW5nLgotCSh2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sIHY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nLAotCXY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vaywgdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCi0Jdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIsIHY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb25zCi0JdG8gY3JlYXRlIGFuZCBoYW5kbGUgc3BlY2lhbCBjb21tb24gc2VjdGlvbnMuCi0JKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBGaXggSEkxNiBhbmQgSEkxNl9TIHJlbG9jYXRpb25zCi0Jd2hpY2ggaGF2ZSBkYXRhIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgRGVjICAyIDEwOjI2OjE2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogUmV2ZXJ0IGJhY2sgdG8gJ18nCi0JKFVTRVJfTEFCRUxfUFJFRklYKTogUmV2ZXJ0IGJhY2sgdG8gJ18nCi0KLQkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYtc2guYyAoc2hfY29mZl9ob3d0b3MpOiBBZGQgUl9TSF9TV0lUQ0g4IGVudHJ5LgotCShnZXRfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIFJfU0hfU1dJVENIOC4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0KLVdlZCBOb3YgMjYgMTQ6MTM6MzQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBDaGFuZ2VkIHRvIG1hdGNoIGRlZmluaXRpb24gaW4KLQlnY2MvY29uZmlnL2FybS9zZW1pLmgKLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgQVJNIGFuZCBUaHVtYiBzeW1ib2wKLQljbGFzc2VzLgotCi1TdW4gTm92IDIzIDE2OjAyOjU4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZnJlZWJzZC5oIChTV0FQX01BR0lDKTogUmVhZCBtYWdpYyBudW1iZXIgbGl0dGxlIGFuZCBub3QgYmlnCi0gCWVuZGlhbi4KLQotV2VkIE5vdiAyNiAwOTozMDozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBPbmx5IHNldCBwcml2YXRlIGZsYWdzIGZvciBub24KLQlQRSBBUk0gcG9ydHMuCi0KLVR1ZSBOb3YgMjUgMTU6MzM6MjMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEFsc28gaWdub3JlIE5FVkVSX0xPQUQKLQlzZWN0aW9ucy4KLQotVHVlIE5vdiAyNSAxMDo1NTozNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvIG5vdAotCWNvbXBsYWluIGlmIGlub3V0IGFuZCBvdXRwdXQgZm9ybWF0cyBkaWZmZXIuCi0KLVR1ZSBOb3YgMjUgMTE6MjY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgdGVraGV4LmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBSZW1vdmUgdGVraGV4LmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgc3JjL01ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggY3VycmVudAotCWF1dG9tYWtlIGFuZCBhdXRvY29uZi4KLQotCSogY29mZi1hcm0uYyAoYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6IEZpeCB0eXBvCi0JKENPRkZfV0lUSF9QUiB0byBDT0ZGX1dJVEhfUEUpLgotCi1Nb24gTm92IDI0IDE1OjQ3OjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IE1ha2UgdmFyaWFibGVzIGFuZCBzb21lIGZ1bmN0aW9ucyBzdGF0aWMsIHNvIHRoYXQKLQl0aGlzIGZpbGUgY2FuIGJlIGluY2x1ZGVkIGluIG11bHRpcGxlIG9iamVjdCBmaWxlcy4KLQkoY29mZl9hcm1fYmZkX2ZpbmFsX2xpbmspOiBGaXggbWlub3IgYnVnLgotCi1TYXQgTm92IDIyIDE1OjE2OjAwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBQSUMgYW5kIEFQQ1MtRkxPQVQgdHlwZSBiaW5hcmllcy4KLQotCSogY29mZmNvZGUuaDogQWRkIHN1cHBvcnQgZm9yIFBJQyBhbmQgQVBDUy1GTE9BVCB0eXBlIGJpbmFyaWVzLgotCi1TYXQgTm92IDIyIDE2OjA2OjU2IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBldmF4LWVtaC5jIChfYmZkX2V2YXhfd3JpdGVfZW1oKTogVXNlIGFsbG9jYSBpbnN0ZWFkIG9mIHN0cmR1cC4KLQotU2F0IE5vdiAyMiAxMjoyOTozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogV2hlbiBvdmVycmlkaW5nIGEgZGVmaW5lZAotCXN5bWJvbCwgc2V0IGl0IHRvIHVuZGVmaW5lZCwgbm90IG5ldy4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IGtpbGwgTEFCRUwKLQlyZWxvY3MuCi0KLUZyaSBOb3YgMjEgMTQ6MTQ6MjIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9zZWN0aW9uKTogRm9yY2Ugc2lnbiBleHRlbnRpb24gb2YgVVNFUyByX29mZnNldC4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3Qga2lsbCBMQUJFTCByZWxvY3MuCi0KLU1vbiBOb3YgMTcgMTU6MDg6MzggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkpOiBGaXggdHlwby4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCi1TYXQgTm92IDE1IDE1OjM2OjA3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogQ2FzdCBzZWNvbmQgYXJnIG9mCi0JYmZkX2hfZ2V0XyogY2FsbHMgdG8gImJmZF9ieXRlICoiLgotCi1UdWUgTm92IDExIDEwOjM3OjIzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGQKLQkibW92bV9zdGFja19zaXplIi4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluY2x1ZGUgc3RhY2sgc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzCi0JaW4gdGhlIGltbTggZmllbGQgb2YgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbyk6IERldGVybWluZSBob3cgbXVjaCBzdGFjayBpcyBhbGxvY2F0ZWQgYnkKLQl0aGUgbW92bSBpbnN0cnVjdGlvbi4gIEZpeCB0eXBvLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBtb3ZtX3N0YWNrX3NpemUuCi0KLU1vbiBOb3YgMTAgMTQ6MzI6NDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEb24ndCBjcmFzaCBpZgotCWEgdmVyc2lvbiBkZXBlbmRlbmN5IGNvdWxkIG5vdCBiZSBmb3VuZC4KLQotVHVlIE5vdiAgNCAxMjowNTo1NiAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogR2V0IHZlcnNpb24gaW5mbyBmcm9tIGNvbmZpZ3VyZS5pbgotCi1GcmkgT2N0IDI0IDExOjE1OjU4IDE5OTcgIEpha3ViIEplbGluZWsgIDxqakBzdW5zaXRlLm1mZi5jdW5pLmN6PgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKToKLQlOZXcgZnVuY3Rpb24uIEF2b2lkIG1peGluZyBVUzEgYW5kIEhBTCBSMSBjb2RlLgotCVNldCByZXN1bHRpbmcgbWVtb3J5IG9yZGVyaW5nIHRvIHRoZSBzdHJvbmdlc3Qgb25lIHVzZWQuCi0JKHNwYXJjNjRfZWxmX29iamVjdF9wKTogU2V0IGJmZF9tYWNoIGNvcnJlY3RseS4KLQotVGh1IE9jdCAyMyAxNDowOTozMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IEFkZCBVQTY0ICYgVUExNi4KLQkoc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzKTogSGFuZGxlIHRoZW0uCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4gIEJlZm9yZSBlbWl0dGluZyBhIGR5biByZWxvYywKLQljaGVjayBhbGlnbm1lbnQgYW5kIHRyYW5zbXV0ZSBSX1NQQVJDX3g8LT5SX1NQQVJDX1VBeC4KLQotVGh1IE9jdCAyMyAwMDo1MzoxNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1saW51eCopOiBVc2UgdHJhZC1jb3JlIGFuZCAuLi4KLQkqIGhvc3RzL3NwYXJjbGludXguaDogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjMgMDA6MjU6MjkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAZG90LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQtKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIHBsdF9hbGlnbm1lbnQgbWVtYmVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBTZXQgLmdvdCBhbGlnbm1lbnQgYmFzZWQKLQlvbiBhcmNoX3NpemUuCi0JKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UgZm9yIC5yZWwqIHNlY3Rpb25zLgotCVNldCAucGx0IGFsaWdubWVudCBmcm9tIG5ldyBwbHRfYWxpZ25tZW50LgotCSogZWxmbGluay5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB2ZXJzaW9uIHNlY3Rpb24KLQlhbGlnbm1lbnQgdG8gTE9HX0ZJTEVfQUxJR04uCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCk6IFByb3ZpZGUgZGVmYXVsdC4KLQkoZWxmWFhfYmVkKTogSW5pdCBwbHRfYWxpZ25tZW50LgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MsCi0Jc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLCBzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0Jc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmluZHgsIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCwKLQlzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogRml4IGEgZmV3IG5hbWUgc3RyaW5ncy4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBOZXcgZGVmaW5pdGlvbi4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBzaGFyZWQgbGlicmFyaWVzLgotCi0JKiBlbGY2NC1zcGFyYy5jIChzdHJ1Y3QgcGx0X3RlbXBsYXRlLCBwbHRfKl9oZWFkZXIsIHBsdF8qX2VudHJ5LAotCXNwYXJjNjRfZWxmX2J1aWxkX3BsdF9lbnRyeSwgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKToKLQlQTFQgZGVmaW5pdGlvbnMgc3BhcmM2NC1saW51eCBvcmlnaW5hbGx5IGNob29zZS4gIFRoZXNlIHdpbGwgZ28KLQlhd2F5IHNvb24gaW4gZmF2b3VyIG9mIHRoZSBvZmZpY2lhbCBhYmkgZGVmaW5pdGlvbnMuCi0KLVdlZCBPY3QgMjIgMTY6MDg6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKGNvZmZfc21hbGxfb2JqZWN0X3ApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3NtYWxsX25ld19zZWN0aW9uX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogTmV3IHN0YXRpYyBjb25zdCBzdHJ1Y3R1cmUuCi0JKGNvZmZfc21hbGxfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogRGVmaW5lLgotCShzaGNvZmZfc21hbGxfdmVjKTogTmV3IHN0YXRpYyBzdHJ1Y3R1cmUuCi0JKHNobGNvZmZfc21hbGxfdmVjKTogTmV3IHN0YXRpYyBzdHJ1Y3R1cmUuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNoY29mZl9zbWFsbF92ZWMgYW5kCi0Jc2hsY29mZl9zbWFsbF92ZWMuCi0JKiBjb25maWcuYmZkIChzaC0qLWVsZiopOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQKLQlzaGxjb2ZmX3NtYWxsX3ZlYyB0byB0YXJnX3NlbHZlY3MuCi0JKHNoLSotKik6IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQgc2hsY29mZl9zbWFsbF92ZWMgY2FzZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBPY3QgMjAgMTU6MDE6MjcgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGV2YXgtZWdzZC5jOiBXZWFrIHN5bWJvbHMgYXJlIGdsb2JhbC4KLQotCSogZXZheC1lbWguYzogVXNlIHByb3BlciBjYXN0cy4KLQotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogUmVtb3ZlIHVubmVlZGVkIHVuYW1lLgotCi0JKiBldmF4LWVnc2QuYzogU2VjdGlvbiBuYW1lcyBhbmQgc3ltYm9scyBoYXZlIGRpZmZlcmVudAotCWxlbmd0aCByZXN0cmljdGlvbnMuIEFkZCBsZW5ndGggcGFyYW1ldGVyIHRvCi0JX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbC4KLQkqIGV2YXgtZXRpci5jOiBMaWtld2lzZS4KLQkqIGV2YXgtbWlzYy5jIChfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sKTogQWRkIGxlbmd0aAotCXBhcmFtZXRlci4KLQkqIGV2YXguaCAoRU9CSl9TX0NfU0VDU0laKTogRGVmaW5lLgotCi0JKiBldmF4LWFscGhhLmM6IFJlbW92ZSBkdXBsaWNhdGUgdGVzdC4KLQotCSogZXZheC1lbWguYzogU1lTJCBmdW5jdGlvbnMgYXJlIHVwcGVyLWNhc2UuCi0KLQkqIGV2YXgtZWdzZC5jOiBDcmVhdGUgc2VwYXJhdGUgc2VjdGlvbnMgZm9yIGNvbW1vbiBzeW1ib2xzLgotCSogZXZheC1ldGlyLmM6IERvbid0IG91dHB1dCBjb21tb24gc2VjdGlvbi4KLQkqIGV2YXguaDogQnVtcCB1cCBzZWN0aW9uIGNvdW50LgotCi0JKiBjb25maWd1cmUuY29tOiBVc2UgNjRiaXQgaW50ZWdlcnMgd2l0aCBERUMgQy4KLQotCSogZXZheC1lZ3NkLmM6IE1ha2Ugc2VjdGlvbiBmbGFncyBkZWMgYyBjb21wYXRpYmxlLgotCi1Nb24gT2N0IDIwIDA5OjM4OjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKG5vcm1hbGl6ZSk6IERlbGV0ZSBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBOZXcgcGFyYW1ldGVyIGVsZW5ndGguICBBbGwgY2FsbGVycwotCWNoYW5nZWQuICBVc2UgcGFzc2VkIGluIGVsZW5ndGggdG8gZGV0ZXJtaW5lIHNpemUgb2YgdGhlIGV4dGVuZGVkCi0JbmFtZSB0YWJsZSBpbnN0ZWFkIG9mIGNvbXB1dGluZyBpdCBhZ2Fpbi4KLQotU3VuIE9jdCAxOSAyMzozNjoyMSAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgfD0gbm90ID0gdG8gc2V0Ci0JSU1BR0VfU0NOX01FTV9SRUFEIGZvciBhbiB1bnJlY29nbml6ZWQgc2VjdGlvbi4KLQotU3VuIE9jdCAxOSAyMTowNDo1NiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEFjY291bnQgZm9yIHRyYWlsaW5nCi0JJy8nIGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLgotCi1GcmkgT2N0IDE3IDAwOjA0OjEzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogRm9yIGV4cGxpY2l0bHkgdmVyc2lvbmVkCi0Jc3ltYm9scywgY2hlY2sgZ2xvYmFscyBsaXN0IGJlZm9yZSBtYXRjaGluZyBvbiBsb2NhbHMuCi0KLVRodSBPY3QgMTYgMDg6MTc6MDYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQscGVfcHJpbnRfaWRhdGEpOiBGaXggbWFuZ2xlZAotCXBhdGNoLgotCi1XZWQgT2N0IDE1IDEzOjQ1OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogU2V0IERMTCBmbGFnLgotCShwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBETEwgZmxhZy4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldCBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCi0JZm9yIC5zdGFiKiBzZWN0aW9ucy4gIFJlcGxhY2Ugc3RybGVuIG9mIGNvbnN0YW50IHN0cmluZ3Mgd2l0aAotCW51bWJlci4KLQotVHVlIE9jdCAxNCAxNTo0Mjo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9tZXJnZV9pbmRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiB0bwotCW1lcmdlIGdvdCBhbmQgcmVsb2MgZW50cmllcyBmcm9tIGluZCBzeW1zIHRvIHRoZWlyIHRhcmdldC4KLQkoZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBDYWxsIGl0LgotCShlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MpOiBPcGVyYXRlIG9uIHRoZSB0YXJnZXQgb2YgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyk6IExpa2V3aXNlLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQmFjayBvdXQgSEoncyBjaGFuZ2UsCi0JYXMgaXQgaXMgaW5zdWZmaWNpZW50IHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbiBjaGFuZ2VzIGFzIHdlbGwuCi0KLU1vbiBPY3QgMTMgMjM6MTA6MDggMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyBmb3IgUkVMQVRJVkUKLQlyZWxvY3MgZm9yIHN5bWJvbHMgaW4gc2hsaWJzIHRoYXQgaGF2ZSBiZWVuIGZvcmNlZCBsb2NhbC4KLQkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IE91dHB1dCBSRUxBVElWRXMgaW4gLmdvdCBmb3Igc2FtZS4KLQotTW9uIE9jdCAxMyAyMToyNDowNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIHRoZQotCWdvdF9lbnRpZXMgb2YgdGhlIGRlZmF1bHQgc3ltYm9sIGZvciB0aGUgZGVmYXVsdCB2ZXJzaW9uZWQKLQlzeW1ib2wuICBQYXRjaCBmcm9tIGhqbEBnbnUuYWkubWl0LmVkdSwgbW9kaWZpZWQgbm90IHRvIHVzZQotCWFsbG9jYSBpbiB0aGUgbG9vcC4KLQotTW9uIE9jdCAxMyAxNzozNzozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBPbmx5IHVzZSB0aGUgYm90dG9tCi0JMjQgYml0cyBvZiB0aGUgUEMgd2hlbiBjb21wdXRpbmcgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLgotCi1GcmkgT2N0IDEwIDE2OjAxOjMwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MsIHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOgotCUNvcnJlY3QgdmFsdWUgZm9yIG1heGltdW0gcG9zaXRpdmUgMjIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0JKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUHJldmVudCBvdmVyZmxvdyBmcm9tIEhJMTZfUyBhbmQKLQlISV8xNiByZWxvY2F0aW9ucy4gIENvcnJlY3QgYml0IGFkanVzdG1lbnQgaW4gVERBIG9mZnNldHMuCi0KLVRodSBPY3QgIDkgMTY6NDM6MzkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmNfZWxmX3toaXgyMixsb3gxMH1fcmVsb2MpOiBOZXcgZnVuY3Rpb25zLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IFVzZSB0aGVtIGZvciBISVgyMixMT1gxMCByZWxvY3MuCi0KLVdlZCBPY3QgIDggMTE6Mzg6NDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMpOiBQZWRhbnRpY2x5LCBhbGlnbm1lbnRfcG93ZXIgc2hvdWxkCi0JYmUgTE9HX0ZJTEVfQUxJR04uCi0KLVdlZCBPY3QgIDggMTE6MzY6MDAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogTWlzc2VkIG9uZSBhbHBoYSogY2hhbmdlLgotCi1UdWUgT2N0ICA3IDEzOjAwOjE3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUmVtb3ZlIEJGRDY0IHN1cHBvcnQuCi0JKiBlbGY2NC1zcGFyYy5jIChTUEFSQzY0X09MRF9SRUxPQ1MpOiBVbmRlZi4KLQkoTUlOVVNfT05FKTogTmV3IG1hY3JvLgotCShzcGFyY19lbGZfbm90c3VwX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBESVNQNjQsUExUNjQsSElYMjIsTE9YMTAsCi0JSDQ0LE00NCxMNDQsUkVHSVNURVIuCi0JKHNwYXJjX3JlbG9jX21hcCk6IExpa2V3aXNlLiAgTWFwIEJGRF9SRUxPQ19DVE9SIHRvIFJfU1BBUkNfNjQuCi0JKGluaXRfaW5zbl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBVc2UgaXQuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgZW50cmllcyBmb3IgT0xPMTAsSElYMjIsTE9YMTAuCi0KLVR1ZSBPY3QgIDcgMTE6NDA6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzb20uYyAoc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogUmVtb3ZlIHN0YXRpYwotCWZ1bmN0aW9uLCBhbmQgZGVmaW5lIGFzIG1hY3JvIGluc3RlYWQuCi0KLUZyaSBPY3QgIDMgMTQ6MDI6MTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQ2hhbmdlIGFscGhhLSotKiB0byBhbHBoYSotKi0qOyBjb25maWcuZ3Vlc3Mgbm93Ci0JcmVjb2duaXplcyBhbHBoYWV2NSBldGMuCi0JKiBjb25maWd1cmUuaG9zdDogTGlrZXdpc2UuCi0KLUZyaSBPY3QgIDMgMTE6MjM6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSBsZCAtcyB3b3JrIG9uIEFJWDoKLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgY3JlYXRlIHRoZSAuZGVidWcKLQlzZWN0aW9uIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgdGhlIC5kZWJ1ZyBzZWN0aW9uCi0Jc2l6ZSBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IFNFQ19SRUxPQyBvciByZWxfZmlsZXBvcywKLQlhbmQgZG9uJ3Qgd3JpdGUgb3V0IHJlbG9jcywgaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBzZXQgdXAgcmVsb2MgaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IHdyaXRlIG91dCBzeW1ib2wgb3IgcmVsb2MgaWYgd2UKLQlhcmUgc3RyaXBwaW5nLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGluY2x1ZGUgZWxmLmxvIGFnYWluIGZvciBFTEYgdGFyZ2V0czsgaXQncwotCWFsd2F5cyBpbiB0aGUgbGlicmFyeSBhbnlob3cuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogZWxmMzItc3BhcmMuYyAoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBDYXN0IHRvIGJmZF9ieXRlICosIG5vdAotCWNoYXIgKiwgd2hlbiBjYWxsaW5nIGJmZF9nZXRfMzIgYW5kIGJmZF9wdXRfMzIuCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogQ2FzdCBjb250ZW50cyB0byBjaGFyICoKLQl3aGVuIGNhbGxpbmcgc3RyY3B5LgotCi1UaHUgT2N0ICAyIDE2OjE1OjUwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9jaGVja19vdmVyZmxvdyk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IFVzZSBpdC4KLQkoQkZEX1JFTE9DX1NQQVJDX3tESVNQNjQsUExUNjR9KTogTmV3IHJlbG9jcy4KLQkoQkZEX1JFTE9DX1NQQVJDX3tISVgyMixMT1gxMCxINDQsTTQ0LEw0NCxSRUdJU1RFUn0pOiBOZXcgcmVsb2NzLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBPY3QgIDIgMTM6MTc6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IElNQUdFX1NDTl9NRU1fUkVBRCBmb3IgYW4KLQl1bnJlY29nbml6ZWQgc2VjdGlvbi4gIEZyb20gSm9uIFRoYWNrcmF5IDxqb250QGhhcmxlcXVpbi5jby51az4uCi0KLVdlZCBPY3QgIDEgMTQ6MDM6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoJChCRkRfSCkpOiBDaGFuZ2Ugc3RtcC1iZmQuaCB0byBzdG1wLWJmZC1oLgotIAkoc3RtcC1iZmQtaCk6IFJlbmFtZSBmcm9tIHN0bXAtYmZkLmguCi0gCShCRkRfSF9GSUxFUywgTElCQkZEX0hfRklMRVMsIExJQkNPRkZfSF9GSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBKdXN0IGRlcGVuZCB1cG9uIHN0bXAtYmluMi1oLgotCShzdG1wLWJpbjItaCk6IE5ldyB0YXJnZXQuCi0JKCQoc3JjZGlyKS9saWJiZmQuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1sYmZkLWguCi0JKHN0bXAtbGJmZC1oKTogTmV3IHRhcmdldC4KLQkoJChzcmNkaXIpL2xpYmNvZmYuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1sY29mZi1oLgotCShzdG1wLWxjb2ZmLWgpOiBOZXcgdGFyZ2V0LgotCShDTEVBTkZJTEVTKTogQ2hhbmdlIHN0bXAtYmZkLmggdG8gc3RtcC1iZmQtaC4gIEFkZCBzdG1wLWJpbjIuaCwKLQlzdG1wLWxiZmQtaCwgYW5kIHN0bXAtbGNvZmYtaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBhIGRpdmVyc2lvbiB0byBzZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgdGhlCi0JYXJndW1lbnRzIGFyZSBwYXJzZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgMzAgMTQ6MTg6MzIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSX1NQQVJDX0dMT0JfSk1QCi0JcmVuYW1lZCB0byBSX1NQQVJDX1VOVVNFRF80Mi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVsZXRlIFJfU1BBUkNfR0xPQl9KTVAgZW50cnkuCi0JKiBlbGY2NC1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJfU1BBUkNfR0xPQl9KTVAKLQlyZW5hbWVkIHRvIFJfU1BBUkNfVU5VU0VEXzQyLgotCShzcGFyY19yZWxvY19tYXApOiBEZWxldGUgUl9TUEFSQ19HTE9CX0pNUCBlbnRyeS4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TUEFSQ19HTE9CX0pNUCk6IERlbGV0ZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBTZXAgMjUgMTI6MTU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEb24ndCBjaGVjayB0aGUgaGFzaCBjcmVhdG9yIHVudGlsCi0JYWZ0ZXIgd2UgaGF2ZSBzZXQgKnN5bV9oYXNoLgotCi1XZWQgU2VwIDI0IDE2OjUyOjI4IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlnLmJmZCAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLSplbGYqLgotCi1XZWQgU2VwIDI0IDExOjI3OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZF9hX1NPVVJDRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1RPT0wgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAyMyAxOTowMzoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBFdmVuIGlmIHdlIGFyZSBub3QgZGVtYW5kCi0JcGFnZWQsIGRvbid0IHB1dCBhIGxvYWRhYmxlIHNlY3Rpb24gYWZ0ZXIgYSBub25sb2FkYWJsZSBzZWN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSW5jcmVtZW50IHRoZSBmaWxlIG9mZnNldAotCWZvciBhIHNlY3Rpb24gd2l0aCBjb250ZW50cywgZXZlbiBpZiBpdCBpcyBub3QgbG9hZGFibGUuCi0KLVN1biBTZXAgMjEgMTE6MDM6MjQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogQWRkIHJldHVybiBjb2RlCi0JaW5kaWNhdGluZyB0aGF0IF9fY3RicCBjb3VsZCBub3QgYmUgZm91bmQuCi0KLVRodSBTZXAgMTggMTU6MDQ6NTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0KLVdlZCBTZXAgMTcgMDk6NTQ6NTEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlLCB2ODUwX2VsZl9yZWxvYywKLQl2ODUwX2VsZl9jaGVja19yZWxvY3MsIHY4NTBfZWxmX3JlbG9jX21hcCwgdjg1MF9lbGZfaG93dG9fdGFibGUpOgotCUFkZCBzdXBwb3J0IGZvciB0aGUgQ0FMTFQgcmVsb2NzLgotCi0JKiByZWxvYy5jIChDT01NRU5UKTogQWRkIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQgYW5kCi0JQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBBZGQgY2hlY2tzIHRvIGNhdGNoCi0JcmVsb2NhdGlvbnMgYWdhaW5zdCBub24tZXhpc3RhbnQgc3ltYm9scy4KLQotVHVlIFNlcCAxNiAxNDoyMDoyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgQkZSX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVC4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSwKLQl2ODUwX2VsZl9ob3d0b190YWJsZSwgdjg1MF9lbGZfcmVsb2NfbWFwKTogQWRkIHN1cHBvcnQgZm9yIGEgMTYKLQliaXQgcmVsb2MgaW4gdGhlIHRpbnkgZGF0YSBhcmVhLgotCi1Nb24gU2VwIDE1IDExOjI3OjM2IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBDaGFuZ2UgcGMtcmVsYXRpdmUgcmVsb2NzCi0Jb3ZlciAyXjMyIGJ5dGVzIHRvIGJlIGFic29sdXRlLiAgTmVlZGVkIGJlY2F1c2UgRDMwViBQQyBkb2Vzbid0Ci0JbmVjZXNzYXJpbHkgd3JhcC4KLQotCSogcmVsb2MuYywgZWxmMzItZDMwdi5jIChCRkRfUkVMT0NfRDMwVl85X1BDUkVMLAotCUJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUik6IE5ldyByZWxvY3MuCi0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jXzIxKTogTmV3IGZ1bmN0aW9uLgotCURvIDE1IGFuZCAyMSBiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLCBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SKToKLQlOZXcgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogQWRkZW5kIG5lZWRzIHRvIGJlCi0JYWRkZWQgdG8gdGhlIHJlbG9jYXRpb24sIG5vdCBvcidkLgotCi1XZWQgU2VwIDEwIDE1OjE3OjI1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MpOiBSZW1vdmUgc3B1cmlvdXMgZXJyb3IgbWVzc2FnZS4KLQotV2VkIFNlcCAxMCAxMToxNzo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBVc2Ugc3RyY2FzZWNtcC4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IFRlc3QgZm9yIG1hdGNoIHdpdGggYXJjaF9uYW1lICsgIjoiICsKLSAJcHJpbnRhYmxlX25hbWUuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBUZXN0IGZvciBtYXRjaCB3aXRoIHByaW50YWJsZV9uYW1lIC0gIjoiLgotCShiZmRfZGVmYXVsdF9zY2FuKTogRGVsZXRlIHc2NSwgaDgzMDAsIGg4NTAwLCB6OGssIGk5NjAgc3BlY2lhbAotIAljYXNlcy4gIEVhY2ggaW1wbGVtZW50cyB0aGVpciBvd24gc2NhbiBmdW5jdGlvbi4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IERlbGV0ZSAzODYsIDI5MDAsIDg2MCwgbWlwcyAyMDAwLCBtaXBzIDQ0MDAKLSAJc3BlY2lhbCBjYXNlcy4gIFNpbmNlIGluZm8tPm1hY2ggPT0gMC4gIFRoZSB0ZXN0IG1hY2ggPT0gbnVtYmVyCi0gCWZhaWxzLgotCShiZmRfYXJjaF9saXN0KTogTmV3IGZ1bmN0aW9uLCByZXR1cm4gbmFtZSBvZiBhbGwgdGhlIHN1cHBvcnRlZAotIAlhcmNoaXRlY3R1cmVzLgotCi1UdWUgU2VwICA5IDEwOjIxOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEJyZWFrIGFmdGVyCi0JZGVjb2RpbmcgYXJjaGl0ZWN0dXJlLgotCSh2ODUwX2VsZl9yZWxvYyk6IERvIG5vdCBjb21wbGFpbiBpZiBhIFJfVjg1MF9MTzE2IHJlbG9jIGhhcyBiaXQKLQkxNSBzZXQuCi0KLVN1biBTZXAgIDcgMTI6MjU6MjIgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotCSogYmZkL2VsZjY0LWFscGhhLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBGaXggdGhlIGhvd3RvIHRhYmxlLgotCi1UaHUgU2VwICA0IDA5OjQ0OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtdjg1MC5jLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLXY4NTAuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiByZWxvYy5jOiBSZW1vdmUgZXh0cmFuZW91cyBjb21tYXMgZnJvbSByZWxvY2F0aW9uIGVudHJpZXMuCi0JUmVtb3ZlIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFB1dCBYVFlfQ00vWE1DX1REIHN5bWJvbHMKLQlpbiBzZWN0aW9ucyBuYW1lZCAudG9jYnNzIHJhdGhlciB0aGFuIC5ic3MuCi0KLVdlZCBTZXAgIDMgMTE6MjM6MjMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmgsIGJmZC1pbjIuaCwgZWxmMzItdjg1MC5jOiBSZW1vdmVkCi0JQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwuCi0KLVR1ZSBTZXAgIDIgMjA6NDQ6MTAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogSGFuZGxlIENfU1lTVEVNIHN5bXMKLQl0aGUgc2FtZSBhcyBDX0VYVCBzeW1zLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEaXR0by4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRGl0dG8uCi0JKF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMpOiBBZGQgc2F2ZV9nbG9iYWxfdG9fc3RhdGljLiAgVXNlCi0JaXQgdG8gcHJlc2VydmUgYW5kIHJlc3RvcmUgc3RhdGUgb2YgZ2xvYmFsX3RvX3N0YXRpYyBmbGFnLgotCi1UdWUgU2VwICAyIDE3OjQ1OjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBTZXQgbWFjaGluZSBudW1iZXIgYmFzZWQgb24KLQliaXRzIGluIGVfZmxhZ3MgZmllbGQgcmF0aGVyIHRoYW4gbWFnaWMgbnVtYmVycy4KLQkodjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywgdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MsCi0Jdjg1MF9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhLCB2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLAotCXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb25zLgotCi1UdWUgU2VwICAyIDE3OjQzOjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBSZW1vdmUgVjg1MEUgbWFnaWMgbnVtYmVyLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFJlbW92ZSBWODUwRUEgbWFnaWMgbnVtYmVyLgotCi1UdWUgU2VwICAyIDE3OjM1OjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcmMuYyAoYXJjX2dldF9tYWNoKTogUHJvcGVybHkgc2NhbiBkZWZpbmVkIG1hY2ggZW50cmllcy4KLQotVHVlIFNlcCAgMiAxODoyOTozNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFBDIHJlbGF0aXZlCi0JaW5zdHJ1Y3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgbm90IHRoZQotCWN1cnJlbnQgaW5zdHJ1Y3Rpb24uCi0JKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBTaW1pbGFybHkuCi0KLVR1ZSBTZXAgIDIgMTU6NDU6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTAuYzogVXNlIGEgbWFjcm8gdG8gY29uc3RydWN0IGJmZF9hcmNoX2luZm9fdHlwZQotCWVudHJpZXMuCi0KLQkqIHJlbG9jLmMsIGxpYmJmZC5oLCBiZmQtaW4yLmgsIGVsZjMyLXY4NTAuYzogUmVwbGFjZQotCUJGRF9SRUxPQ19WODUwX3tTREEvVERBL1pEQX1fT0ZGU0VUIHJlbG9jcyB3aXRoIG5ldyBiaXQgcGF0dGVybgotCXNwZWNpZmljIHZlcnNpb25zOiBCRkRfUkVMT0NfVjg1MF97YXJlYX1fe2JpdHN9X09GRlNFVC4KLQotVGh1IEF1ZyAyOCAxNzowMTowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwLmM6IFJlbW92ZSAicGxhaW4iIGZyb20gdjg1MCBwcmludGFibGUgbmFtZS4KLQkoc2Nhbik6IFVzZSBzdHJjYXNlY21wLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF92ODUwKTogRGVmaW5lLgotCi0JKiBjcHUtc2guYyAoc2Nhbl9tYWNoKTogQ29tcGFyZSB3aXRoIHRhYmxlIGluc3RlYWQgb2YgaGFyZHdpcmVkIHRvCi0gCWp1c3Qgc2gvU0gsIHVzZSBzdHJjYXNlY21wLgotCShhcmNoX2luZm9fc3RydWN0KTogQWRkIGVudHJpZXMgZm9yIHNoMyBldC5hbC4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc2gsIC4uLik6IERlZmluZS4KLQotV2VkIEF1ZyAyNyAxNzozMzowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNodXJlc19saXN0KTogQWx3YXlzIE5VTEwgdGVybWluYXRlIHRoZSBsaXN0LgotCi1UdWUgQXVnIDI2IDE3OjI2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS1hcmMuYy4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBlbGYzMi1hcmMuYy4KLQkoZWxmMzItYXJjLmxvKTogUmVtb3ZlIGV4cGxpY2l0IGRlcGVuZGVuY3kuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYWNpbmNsdWRlLm00IChCRkRfQ0NfRk9SX0JVSUxEKTogU2V0IEVYRUVYVF9GT1JfQlVJTEQuCi0JKiBkb2MvTWFrZWZpbGUuYW0gKE1LRE9DKTogVXNlIEVYRUVYVF9GT1JfQlVJTEQsIG5vdCBFWEVFWFQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBdWcgMjUgMTY6MTQ6MzQgMTk5NyAgQ2hyaXN0b3BoZXIgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsYXRlc3QgZGV2byBhdXRvY29uZiBmb3IgTlQgc3VwcG9ydAotCi1Nb24gQXVnIDI1IDE2OjExOjA0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6IElmIEIgaXMgYSBkZWZhdWx0IHR5cGUsIHJldHVybiBBLgotCi1Nb24gQXVnIDI1IDE1OjM1OjQ2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwLmMgKHNjYW4pOiBOZXcgZnVuY3Rpb24uCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBOZXcgc3RydWN0dXJlLgotCShiZmRfdjg1MF9hcmNoKTogQWRkIGxpbmsgaW50byBhcmNoX2luZm9fc3RydWN0dXJlLgotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFsbCB2ODUwIHZhcmlhbnRzIHVzZSB0aGUgYmZkX2FyY2hfdjg1MAotCWFyY2hpdGVjdHVyZS4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbi4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfdjg1MGUpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZS4KLQotCSogYmZkLWluMi5oIChiZmRfbWFjaF92ODUwZSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlLgotCi0JKiBlbGYzMi12ODUwLmMgKEVMRl9NQUNISU5FX0NPREUpOiBEZWZhdWx0IHRvIHY4NTBlIG1hY2hpbmUKLQludW1iZXIuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgbWFjaGluZSBudW1iZXIuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3Y4NTBlYSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlYS4KLQotCSogYmZkLWluMi5oIChiZmRfbWFjaF92ODUwZWEpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZWEuCi0KLQkqIGVsZjMyLXY4NTAuYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmF1bHQgdG8gdjg1MGVhIG1hY2hpbmUKLQludW1iZXIuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIG1hY2hpbmUgbnVtYmVyLgotCi1Nb24gQXVnIDI1IDE0OjA3OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IENsZWFyIHRoZQotIAljYWNoZWRfc3RhYiBmaWVsZCBpZiB0aGUgb2Zmc2V0IHByZXZlbnRzIHVzIGZyb20gdXNpbmcgdGhlIGNhY2hlLgotCi1Nb24gQXVnIDI1IDEyOjA4OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVkodmVjKSk6IEFkZCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEgdG8gc2VjdGlvbgotCWZsYWdzLgotCSogYW91dC1hcm0uYyAoYW91dF9hcm1fbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCShhb3V0X2FybV9iaWdfdmVjKTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGJfb3V0X3ZlY19iaWdfaG9zdCk6IExpa2V3aXNlLgotCShiX291dF92ZWNfbGl0dGxlX2hvc3QpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoYW91dF9taXBzX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkoYW91dF9taXBzX2JpZ192ZWMpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAxOSAxMDowOToxMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChDT0ZGX0FMSUdOX0lOX1NGTEFHUyk6IERlZmluZSB0byAxLgotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBJZ25vcmUgaW5jb21pbmcgU1RZUF9JTkZPCi0JYml0IGluIHNfZmxhZ3MgaWYgQ09GRl9BTElHTl9JTl9TX0ZMQUdTIGlzIGRlZmluZWQuCi0KLVR1ZSBBdWcgMTkgMDg6NDc6MTcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSKTogRGVmaW5lIHRvIDEuCi0JKEdFVF9TQ05IRFJfQUxJR04sIFBVVF9TQ05IRFJfQUxJR04pOiBEZWZpbmUuCi0JKiBjb2ZmLW04OGsuYyAoR0VUX1NDTkhEUl9OUkVMT0MsIEdFVF9TQ05IRFJfTkxOTk8pOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IENvbmRpdGlvbmFsbHkgY29tcGlsZSBpbiBpZgotCUNPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgaXMgZGVmaW5lZC4gIENvbnZlcnQgYWxpZ25tZW50IHRvIHBvd2VyCi0Jb2YgdHdvIGZvciBJOTYwIG9ubHkuCi0JKiBjb2Zmc3dhcC5oIChHRVRfU0NOSERSX05SRUxPQywgUFVUX1NDTkhEUl9OUkVMT0MsIEdFVF9TQ05ESFJfTkxOTk8sCi0JUFVUX1NDTkhEUl9OTE5OTywgR0VUX1NDTkhEUl9GTEFHUywgUFVUX1NDTkhEUl9GTEFHUyk6IFByb3ZpZGUKLQlkZWZhdWx0IGRlZmluaXRpb25zLgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogVXNlIEdFVF9TQ05IRFJfRkxBR1MsIEdFVF9TQ05IRFJfTlJFTE9DLAotCUdFVF9TQ05IRFJfTkxOTk8sIGFuZCBHRVRfU0NOSERSX0FMSUdOLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSBQVVRfU0NOSERSX0ZMQUdTLCBQVVRfU0NOSERSX0FMSUdOLgotCSogTWFrZWZpbGUuaW4gKGNvZmYtdGljODAubyk6IERlcGVuZHMgdXBvbiBjb2Zmc3dhcC5oLgotCSogY29mZi10aWM4MC5jIChDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSKTogRGVmaW5lIHRvIDEuCi0JKEdFVF9TQ05IRFJfRkxBR1MsIFBVVF9TQ05IRFJfRkxBR1MpOiBEZWZpbmUKLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGFsaWdubWVudCBmaWVsZCBpbgotIAlzZWN0aW9uIGhlYWRlciBmb3IgVElDODBDT0ZGIGZpbGVzLgotCi1Nb24gQXVnIDE4IDExOjM2OjE5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfaG93dG9fdGFibGUsIHY4NTBfZWxmX3JlbG9jX21hcCwKLQl2ODUwX2VsZl9jaGVja19yZWxvY3MsIHY4NTBfZWxmX3JlbG9jLAotCXY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgQWRkIHN1cHBvcnQgZm9yCi0JQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotCSogcmVsb2MuYyAoQ09NTUVOVCk6IEFkZCBzdXVwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTAotCXJlbG9jYXRpb24uCi0KLQkqIGxpYmJmZC5oOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotCSogYmZkLWluMi5oOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotTW9uIEF1ZyAxOCAxMTozMzo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MGU6IE5ldyBmaWxlLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogYmZkLWluMi5oIChiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMTozMzo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MGVhOiBOZXcgZmlsZS4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi0JKiBiZmQtaW4yLmggKGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi1GcmkgQXVnIDE1IDEyOjAxOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQ29ycmVjdGx5IGhhbmRsZSB0aGUgb2Zmc2V0Ci0JYXJndW1lbnQgYXMgc2VjdGlvbiByZWxhdGl2ZSwgcmF0aGVyIHRoYW4gYW4gYWJzb2x1dGUgYWRkcmVzcy4KLQlGcm9tIEphbiBIb29nZW5yYWFkIDxob29nZW5yZEBuYXRsYWIucmVzZWFyY2gucGhpbGlwcy5jb20+LgotCi1GcmkgQXVnIDE1IDA0OjU4OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGFyYy0qLWVsZiopOiBBZGQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl97bGl0dGxlLGJpZ31hcmNfdmVjKTogQWRkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuYW0gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtYXJjLmxvLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1hcmMubG8uCi0JKGNwdS1hcmMubG8sZWxmMzItYXJjLmxvKTogQWRkIHJ1bGVzIGZvci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogYXJjaHVyZXMuYyAoYXJjaGl0ZWN0dXJlIGxpc3QpOiBBZGQgYmZkX2FyY2hfYXJjLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfYXJjX2FyY2guCi0JKGJmZF9tYWNoX2FyY19iYXNlKTogRGVmaW5lLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsQkZEX1JFTE9DX0FSQ19CMjYpOiBBZGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl97bGl0dGxlLGJpZ31hcmNfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0KTogQWRkIHRoZW0uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY3B1LWFyYy5jLCBlbGYzMi1hcmMuYzogTmV3IGZpbGVzLgotCSogZWxmLmMgKHByZV9oZWFkZXJzKTogUmVjb2duaXplIGJmZF9hcmNoX2FyYy4KLQotVHVlIEF1ZyAxMiAxMTo0NToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IElmIG5vIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUKLQlkYXRhIHNlY3Rpb24gaXMgY29ycmVjdGx5IHJvdW5kZWQgdG8gYSBwYWdlIGluIHRoZSBmaWxlLgotCi1Nb24gQXVnIDExIDEyOjQ1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgZW1pdCB0aGUgc3RyaW5nIHRhYmxlIGlmCi0JdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0KLVN1biBBdWcgMTAgMTQ6NDU6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXN0Z28zMi5jOiBSZW5hbWUgZnJvbSBjb2ZmLXN0dWJnbzMyLmMgdG8gYXZvaWQgb2xkIFN5c3RlbSBWCi0JZmlsZSBzeXN0ZW0gMTQgY2hhcmFjdGVyIGxpbWl0LgotCSogTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEF1ZyAgOCAxODozNDozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiAoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBlbGYzMi1kMTB2LmMuCi0JUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEF1ZyAgNiAxODo1Njo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChkb2NkaXIpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEF1ZyAgNSAyMzowNTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuMS4KLQotTW9uIEF1ZyAgNCAxMjowMDozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBwYXRjaGVzLgotCi1TdW4gQXVnICAzIDA4OjE1OjEyIDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24pOiAgTmV3IGZ1bmN0aW9uIHRvIGFkZCBhIHNlY3Rpb24KLQl0byB0aGUgY29yZSBmaWxlIGJmZC4KLQkocnM2MDAwY29mZl9jb3JlX3ApOiAgVXNlIG1ha2VfYmZkX2FzZWN0aW9uIHRvIGFkZCB0aGUgY29yZSBmaWxlCi0Jc2VjdGlvbnMuCi0JVXNlIEJGRCByb3V0aW5lcyB0byBzZWVrLCByZWFkIGFuZCBzdGF0IHRoZSBjb3JlIGZpbGUuCi0JSGFuZGxlIC5kYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMgYW5kIGFub255bW91c2x5IG1tYXBwZWQKLQlyZWdpb25zLCB0aGVzZSBhcmUgYXZhaWxhYmxlIGluIEFJWCA0IGNvcmUgZmlsZXMuCi0KLUZyaSBBdWcgIDEgMTI6NTg6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2luY2x1ZGUubTQ6IE1vdmUgYWNtYWNyb3MubTQgaW4gaGVyZS4gIFJlbW92ZSBBTV9QUk9HX0xJQlRPT0wKLQljb3B5OyB1c2UgYSBwYXRjaGVzIGxpYnRvb2wgaW5zdGVhZC4KLQkqIGFjbWFjcm9zLm00OiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgSnVsIDMxIDE5OjU1OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY21hY3Jvcy5tNDogTmV3IGZpbGUsIGNvcGllZCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUgc2hhcmVkIGxpYnJhcnkKLQloYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UgQUNfQ09ORklHX0hFQURFUiB3aXRoCi0JQU1fQ09ORklHX0hFQURFUi4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGggQU1fUFJPR19JTlNUQUxMLgotCUNhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLCBBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIENoYW5nZSBhbGwKLQkubyBmaWxlcyB0byAubG8uICBSZW1vdmUgc3RhbXAtaCBoYW5kbGluZyBpbiBBQ19PVVRQVVQuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGRlcC1pbi5zZWQ6IENoYW5nZSAubyB0byAubG8uCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBWRVJTSU9OOiBSZW1vdmUuCi0KLVRodSBKdWwgMzEgMTI6MDk6MjAgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IFRFWFRSRUwKLSAJaWYgdGhlcmUgaXMgb25seSBhIHJlbG9jYXRpb24gdG8gYSByZWFkLW9ubHkgYnV0IG5vdCBhbGxvY2F0YWJsZQotIAlzZWN0aW9uIChsaWtlIC5zdGFiKS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IENvcnJlY3QgdmFyaW91cyBjb21tZW50cy4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBUaGVzZSBzZWN0aW9ucyBhcmUgbm90Ci0JY3JlYXRlZCBieSB0aGUgbGlua2VyICh0aGF0IGlzLCB0aGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSB1c2VyCi0JcHV0dGluZyBkYXRhIGluIHRoZW0pLiBJbiBwYXJ0aWN1bGFyLCB0aGV5IGNhbiBiZSB0aGUgc291cmNlCi0JYW5kIHRhcmdldCBvZiByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDaGVjayBwb3N0Y29uZGl0aW9uIG9mCi0gCWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbC4gIEFsaWduIDE2LWJ5dGUgY29tbW9uCi0gCW9iamVjdHMgKGZvciBpbnN0YW5jZSwgJ2xvbmcgZG91YmxlJykgdG8gMTYtYnl0ZSBib3VuZGFyaWVzLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE1ha2UgdGhlIGNvZGUgdGhhdCBnZW5lcmF0ZXMKLQlzZWN0aW9uIHN5bWJvbHMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3Igc3BhcmMsIHJlZHVjaW5nIHRoZQotCW51bWJlciBvZiBzZWN0aW9uIHN5bWJvbHMgb3V0cHV0LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IENoZWNrIHBvc3Rjb25kaXRpb24gb2YKLQliZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wuICBNYWtlIGRlZmF1bHQgY2FzZSB0aGUKLQlzYW1lIGFzIGNvcnJlc3BvbmRpbmcgY29kZSBmb3Igc3BhcmMsIGZpeGluZyBidWcgaW52b2x2aW5nCi0JLnJlbGEuc3RhYnMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRml4IGNhc2UgaW52b2x2aW5nIEdPVCBzeW1ib2xzCi0gCWZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIHZlcnNpb25pbmcgKGJ5IHJlcGxpY2F0aW5nCi0gCWNvcnJlc3BvbmRpbmcgY2hhbmdlIGluIHNwYXJjKS4gIFRyZWF0IFJfUFBDX1JFTEFUSVZFIFJFTEEgcmVsb2NzCi0gCWFzIHVzdWFsIGluIEVMRiwgbm90IGFzIHBzZXVkby1SRUwgcmVsb2NzIChhcyB0aGUgc3BhcmMgbGlua2VyCi0gCWRvZXMpLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgaGFuZHkgZGVidWdnaW5nIGNvZGUgZm9yIHdoZW4KLSAJYXNzZXJ0aW9uIGZhaWxzLiAgQWRkIHNvbWUgbW9yZSAnc3ltYm9sIG1hZGUgbG9jYWwgYmVjYXVzZSBvZgotIAl2ZXJzaW9uaW5nJyBjYXNlcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvcGUgd2l0aCBhZGRlbmQgd2hlbgotCXByb2Nlc3NpbmcgYSBHT1QgcmVsb2NhdGlvbiBhcyByZXF1aXJlZCBieSBBQkkuCi0KLVdlZCBKdWwgMzAgMjE6MzA6MzUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogUmVtb3ZlIGFueQotCXZlcnNpb24gaW5mbyBpZiB0aGlzIHN5bWJvbCBjYW1lIGZyb20gYSBkeW5hbWljIG9iamVjdC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHRoZSB2ZXJzaW9uIGluZm8gb2YgYSBzeW1ib2wKLQlvbmx5IGlmIHRoZSBvYmplY3QgYWN0dWFsbHkgY29udGFpbnMgdmVyc2lvbiBkZWZpbml0aW9ucyBhbmQKLQlkZWZpbmVzIHRoaXMgc3ltYm9sLgotCi1Nb24gSnVsIDI4IDE4OjA3OjQzIDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IEFkZCBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNyb3MuCi0gICAgICAgICogY29uZmlndXJlLmluOiBVc2UgQ1lHV0lOIGFuZCBFWEVFWFQgYXV0b2NvbmYgbWFjcm8gdG8gbG9vayBmb3IKLSAgICAgICAgd2luMzIgZGVwZW5kZW5jaWVzLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEyLgotICAgICAgICAqIGRvYy9NYWtlZmlsZS5pbjogQWRkICQoRVhFRVhUKSB0byBjaGV3IGV4ZWN1dGFibGUuCi0KLU1vbiBKdWwgMjggMDI6NTA6MjkgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBJZiBDT1JFX1RSVU5DIGlzIHNldCwgcHJpbnQKLQlhIHdhcm5pbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIGVycm9yLgotCi1TdW4gSnVsIDI3IDE5OjU0OjE0IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IGFkZCBzZW1pY29sb24gdG8gbWFrZSBNU1ZDIGhhcHB5LgotCi1GcmkgSnVsIDI1IDE0OjUwOjA4IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY2lzY28tY29yZS5jOiBkZWZpbmUgc2lnbmFscyBmb3Igd2luZ2RiLgotCi1GcmkgSnVsIDI1IDE2OjI3OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogT25seSBtZXJnZSBmaWxlcyB3aXRoCi0JdGhlIHNhbWUgbnVtYmVyIG9mIGF1eCBlbnRyaWVzLgotCi1GcmkgSnVsIDI1IDA4OjIyOjE1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogVXNlIFJfREFUQV9FWFBSIGZvciB0aGUKLQlkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGlmIHRoZSByZWxvY2F0aW9uIHNpemUgaXMgMzIgYml0cy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RBVEFfRVhQUi4KLQotV2VkIEp1bCAyMyAxNjowODowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBEb24ndCBvZmZzZXQgYSBjb21tb24gc3ltYm9sIGJ5Ci0JaXRzIHZhbHVlIGlmIENPRkZfV0lUSF9QRSBpcyBkZWZpbmVkLgotCi1UdWUgSnVsIDIyIDE3OjE5OjQ1IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogY29mZi1zdHViZ28zMi5jOiBOZXcgZmlsZS4KLQkqIGdvMzJzdHViLmg6IE5ldyBmaWxlLgotCSogY29mZi1pMzg2LmM6IElmIENPRkZfR08zMl9FWEUsIGluY2x1ZGUgY29mZi9nbzMyZXhlLmguCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IEludm9rZQotCUNPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUFJFIGFuZCBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QgaWYgdGhleQotCWFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFIGFuZAotCUNPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX2F1eF9pbik6IEludm9rZSBDT0ZGX0FESlVTVF9BVVhfSU5fUFJFIGFuZAotCUNPRkZfQURKVVNUX0FVWF9JTl9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogSW52b2tlIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIGFuZAotCUNPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogSW52b2tlIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUgYW5kCi0JQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUgYW5kCi0JQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKiB0YXJnZXRzLmMgKGdvMzJzdHViYmVkY29mZl92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBnbzMyc3R1YmJlZGNvZmZfdmVjLgotCSogY29uZmlndXJlLmluIChnbzMyY29mZl92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoZ28zMnN0dWJiZWRjb2ZmX3ZlYyk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotbXNkb3NkamdwcCopOiBOZXcgdGFyZ2V0LgotCShpWzM0NTZdODYtKi1nbzMyKik6IENoYW5nZSB0byBiZSBsaWtlIG5ldyBtc2Rvc2RqZ3BwKi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtc3R1YmdvMzIuby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtc3R1YmdvMzIuYy4KLQkoSEZJTEVTKTogQWRkIGdvMzJzdHViLmguCi0KLVR1ZSBKdWwgMjIgMTU6MDk6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBmZG9wZW4uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENoZWNrIEhBVkVfRkRPUEVOIHJhdGhlciB0aGFuIFZNUyBvcgotCV9fR08zMl9fLiAgUmVpbmRlbnQgYSBiaXQuCi0KLVN1biBKdWwgMjAgMjA6MDU6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCBTRUNfTElOS0VSX0NSRUFURUQKLQlmbGFnIGZvciBuZXdseSBjcmVhdGVkIHNlY3Rpb25zLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGlzY2FyZCBuZXdseSBjcmVhdGVkIHNlY3Rpb25zCi0JaWYgc2hhcmVkIGxpYnJhcnkgaXMgZHlub2JqLgotCi1Nb24gSnVsIDE0IDE1OjMzOjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IFdoZW4gY2hlY2tpbmcgd2hldGhlcgotCWluY2x1ZGluZyBhIHNlY3Rpb24gaW4gYSBzZWdtZW50IHdvdWxkIGZvcmNlIHVzIHRvIHNraXAgYSBwYWdlLAotCWFsaWduIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IHNlZ21lbnQgdG8gYXZvaWQgd3JhcGFyb3VuZAotCXByb2JsZW1zLgotCi1UdWUgSnVsICA4IDEyOjExOjI5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWxpemUKLSAJdGFyZ2V0IGlkIGZpZWxkIHRvIFRJQzgwX1RBUkdFVF9JRC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IFN3YXAgb3V0IHRhcmdldCBpZCBmaWVsZAotIAlpZiB1c2VkLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IFN3YXAgaW4gdGFyZ2V0IGlkIGZpZWxkIGlmIHVzZWQuCi0KLU1vbiBKdWwgIDcgMTY6NDE6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uCi0JaWYgVEFSR0VUX1VOREVSU0NPUkUuCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgaWYgVEFSR0VUX1VOREVSU0NPUkUuCi0JKGkzODZjb2ZmX3ZlYyk6IEFkZCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEgdG8gc2VjdGlvbl9mbGFncy4KLQotTW9uIEp1biAzMCAxNDoyOToyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoaG93dG9fdGFibGUpOiBVc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIG5vdAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgZm9yIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotVGh1IEp1biAyNiAwMToyNjozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBhIHZlcnNpb24KLQlpbmRpcmVjdGlvbiBzeW1ib2wgaXMgb3ZlcnJpZGRlbiwgbWFrZSB0aGUgb3JpZ2luYWwgc3ltYm9sIHBvaW50Ci0JYXQgdGhlIHJlYWwgb3ZlcnJpZGluZyBzeW1ib2wuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogQ2hlY2sgZm9yIGFuIGludmFsaWQKLQlzdHJpbmcgaW5kZXguCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFVzZSB0aGUgcmlnaHQgc2VjdGlvbiBmb3IgYQotCWNvbW1vbiBzeW1ib2wuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogSWYgYSBjb21tb24KLQlzeW1ib2wgd2FzIGluIC5zY29tbW9uLCBtYXJrIGl0IGFzIFNITl9NSVBTX1NDT01NT04uCi0KLVdlZCBKdW4gMjUgMTI6NDM6MTAgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9scyk6IFJlc29sdmUgaW5kaXJlY3QgYW5kIHdhcm5pbmcKLQlzeW1ib2xzIGJlZm9yZSBjaGVja2luZyBmb3IgbmV3IHN5bWJvbHMuCi0KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVmaWxlX25vdGUpOiBNb3ZlIG91dCBvZiBIQVZFX1NZU19QUk9DRlNfSC4KLQotVHVlIEp1biAyNCAxMToyMDo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9vYmplY3RfcCk6IFJlYWQgdGhlIGZfb3B0aGRyIGJ5dGVzIGZyb20gdGhlCi0JZmlsZSwgbm90IGFvdXRzeiBieXRlcyAodGhleSBhcmUgZGlmZmVyZW50IGluIFhDT0ZGIC5vIGZpbGVzKS4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBQZXJtaXQgc3ltYm9scyB0byBiZQotCXJlZGVmaW5lZCBieSBvYmplY3RzIGluY2x1ZGVkIGZyb20gYXJjaGl2ZXMuCi0KLU1vbiBKdW4gMjMgMTg6MDM6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBJbiB0aGUgY2FzZSBvZiBhIG5ldyBkZWZpbmVkCi0Jc3ltYm9sIG92ZXJyaWRpbmcgYW4gb2xkIGRlZmluZWQgc3ltYm9sLCByZXR1cm4gdGhlIGhhc2ggdGFibGUKLQllbnRyeSB3aGljaCB3ZSBtb2RpZnksIGV2ZW4gaWYgaXQgaXMgdGhlIHRhcmdldCBvZiBhbgotCWluZGlyZWN0aW9uLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiB0aGUgcmVhbCBuYW1lIG9mIHRoZSBzeW1ib2wgZ2V0cwotCW92ZXJyaWRkZW4sIGNvbnZlcnQgdGhlIHZlcnNpb25lZCBzeW1ib2wgaW50byBhbiBpbmRpcmVjdCBzeW1ib2wKLQl0byB0aGUgcmVhbCBzeW1ib2wuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQllbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhbGwgaXQuCi0KLVN1biBKdW4gMjIgMTk6NDA6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCBoYWNrIHRvCi0JaGFuZGxlIGNhc2Ugd2hlcmUgQ09GRiBmaWxlaGRyIGRvZXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvdyBQRQotCWhlYWRlci4KLQkqIGNvZmZnZW4uYyAoY29mZl9vYmplY3RfcCk6IFJlbW92ZSB1c2VsZXNzIHNlZWsgdG8gY3VycmVudAotCWxvY2F0aW9uLgotCi1XZWQgSnVuIDE4IDE5OjAzOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogQ2hhbmdlIENPTU1PTl9ST1cvaW5kciB0byBmcm9tIENSRUYgdG8KLQlSRUZDLgotCi1UdWUgSnVuIDE3IDExOjU1OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgc3RyaXBwaW5nIGRlYnVnZ2luZwotCXN5bWJvbHMsIHNraXAgTl9BQlMgc3ltYm9scyB3aXRoIGRlYnVnZ2luZyBzdG9yYWdlIGNsYXNzZXMuCi0KLU1vbiBKdW4gMTYgMTg6NTY6MjcgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQgUl9QUENfUkVMKgotCXJlbG9jcyBpbiBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIHJlZmVyIHRvIGxvY2FsIHN5bWJvbHMuICBDb3BlCi0Jd2l0aCBhZGRlbmQgd2hlbiBwcm9jZXNzaW5nIGEgR09UIHJlbG9jYXRpb24uCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgY3JlYXRlIHN5bWJvbHMKLQlmb3Igc2VjdGlvbnMgdGhhdCB0aGUgbGlua2VyIGRpZG4ndCBjcmVhdGUuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHRyeSB0byB3cml0ZSBvdXQgYSBzZWN0aW9uCi0Jc3ltYm9sIGlmIGl0IHdhcyBjcmVhdGVkIGluIHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wbGFpbiBpZiB3ZSBoYXZlIHRvIGdlbmVyYXRlIGEgcmVsb2MKLQlyZWxhdGl2ZSB0byBhIHNlY3Rpb24gZm9yIHdoaWNoIHdlIGRpZG4ndCBvdXRwdXQgYSBzeW1ib2wuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFuIHVwLiAgUExUCi0JcmVsb2NzIGFyZSAncmVsYScgcmVsb2NzLCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZS4gIC5yZWxhLnBsdCBpcyBub3QKLQlhIHJlYWQtb25seSBzZWN0aW9uLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHNwZWNpYWwtY2FzZSBpdC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRW50cmllcyBpbiB0aGUKLQkucmVsYS5ic3Mgc2VjdGlvbiBhcmUgKG9mIGNvdXJzZSkgJ3JlbGEnIHJlbG9jcyBub3QgJ3JlbCcgcmVsb2NzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBJbml0aWFsaXNlIHNyZWxnb3QuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEBnb3Qgb2Zmc2V0cyBhcmUgNCBmcm9tIHN0YXJ0IG9mIHRoZQotCWFjdHVhbCAuZ290IHNlY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFRoZSB0aHJlZSByZXNlcnZlZAotCXdvcmRzIHN0YXJ0IGZyb20gdGhlIHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogJy5yZWxhJyBpcyA1Ci0JY2hhcmFjdGVycywgbm90IDQuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFVzZQotCV9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiB0byBjcmVhdGUgdGhlIEdPVCByYXRoZXIgdGhhbgotCXBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uLiBDcmVhdGUgdGhlICcucmVsYS5nb3QnIHNlY3Rpb24KLQlvdXJzZWx2ZXMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU2V0IHVwIEdPVCByZWxvY2F0aW9ucyB3aGVuIGEKLQlzeW1ib2wgaGFzIGEgR09UIGVudHJ5LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWNvcmQgd2hlbiBhIHN5bWJvbCBpcyB1c2VkIHRocm91Z2gKLQl0aGUgR09ULCBhbmQgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIEdPVCBmb3IgZWFjaCBzdWNoIHN5bWJvbC4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEZWxldGUgdW51c2VkIC5nb3QucGx0IHN0dWZmLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgTElOS0VSX1NFQ1RJT05fR09UCi0Jc3R1ZmYuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEdPVDE2X0hBIHJlbG9jcyBzaG91bGQgYmUKLQl0cmVhdGVkIGluIGEgc2ltaWxhciB3YXkgdG8gQUREUjE2X0hBIHJlbG9jcy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUExUUkVMMjQgcmVsb2NzIGRvIG5vdCBnZXQgY29waWVkIGludG8KLQlzaGFyZWQgb2JqZWN0czsgdGhlIGxpbmtlciBtdXN0IGRlYWwgd2l0aCB0aGVtLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFN0b3Agc2V0dGluZwotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byB0aGUgd3JvbmcgdmFsdWU7IGRlbGV0ZSB1bnVzZWQKLQlMSU5LRVJfU0VDVElPTl9QTFQgc3R1ZmYuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogRGVsZXRlIHVudXNlZCBMSU5LRVJfU0VDVElPTl9QTFQgc3R1ZmYuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgQkZEIGNhbGxzIHRvIGdldCBHT1QKLQlzZWN0aW9uLCBub3QgRUxGLXNwZWNpZmljIGNhbGxzLgotCShlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCk6IFNldCB0byAxLgotCShlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCk6IFNldCB0byA0LgotCSogZWxmLWJmZC5oIChlbGZfYmFja2VuZF9kYXRhKTogQWRkICdwbHRfbm90X2xvYWRlZCcgbWVtYmVyCi0JZm9yIHdoZW4gbGQuc28gZmlsbHMgaW4gdGhlIFBMVDsgYW5kICdnb3Rfc3ltYm9sX29mZnNldCcgbWVtYmVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IEFwcGx5Ci0JcGx0X25vdF9sb2FkZWQgbWVtYmVyLgotCShfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBBcHBseSBnb3Rfc3ltYm9sX29mZnNldC4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCk6IFNldCBkZWZhdWx0IHRvCi0JJ2xvYWRlZCcuCi0JKGVsZl9iYWNrZW5kX0dfT19UX29mZnNldCk6IFNldCBkZWZhdWx0IHRvIDAuCi0JKGVsZk5OX2JlZCk6IFNldCBhZGRlZCBmaWVsZHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFdhcyBzZXR0aW5nCi0JRFRfUkVMRU5UIGluIHNoYXJlZCBvYmplY3RzOyBzaG91bGQgYmUgRFRfUkVMQUVOVC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFByb3BhZ2F0ZQotCVJfUFBDX0FERFIxNl9IQSByZWxvY3MgdG8gc2hhcmVkIG9iamVjdHMuIENvcGUgd2l0aCBjYXNlIHdoZXJlCi0Jc3VjaCBhIHJlbG9jIChpbiBhIG5vbi1zaGFyZWQgb2JqZWN0KSByZWZlcnMgdG8gYSBzeW1ib2wgdGhhdCdzCi0Jbm90IGRlZmluZWQuCi0KLU1vbiBKdW4gMTYgMTQ6NDI6MTQgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZWxmY29kZS5oIChwdXRfc2lnbmVkX3dvcmQpOiBEZWZpbmUuCi0JKGdldF9zaWduZWRfd29yZCk6IERlZmluZS4KLQkoZWxmX3N3YXBfcmVsb2NhX2luKTogVXNlIGdldF9zaWduZWRfd29yZCBmb3IgdGhlIHJfYWRkZW5kIGZpZWxkLgotCShlbGZfc3dhcF9yZWxvY2Ffb3V0KTogVXNlIHB1dF9zaWduZWRfd29yZCBmb3IgdGhlIHJfYWRkZW5kCi0JZmllbGQuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZQotCWJmZF9nZXRfc2lnbmVkXzMyIHRvIHNldCB0aGUgcl9hZGRlbmQgZmllbGQuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4pOiBVc2UKLQliZmRfaF9nZXRfc2lnbmVkXzY0IHRvIHNldCB0aGUgcl9hZGRlbmQgZmllbGQuCi0KLU1vbiBKdW4gMTYgMTI6MzE6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGdlbmVyYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LCBkbyB0aGUgcmVsb2NhdGlvbiBpZiB0aGUgaW5wdXQgc2VjdGlvbiBpcyBub3QKLQlhbGxvY2F0ZWQgaW4gbWVtb3J5LgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FsbAotCWVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiBiZWZvcmUgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4KLQkoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENhbGwgZWxmX2ZpeF9zeW1ib2xfZmxhZ3MuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IExpa2V3aXNlLiAgUGVybWl0IGEgc3ltYm9sIHRvIGJlCi0JZm9yY2VkIGxvY2FsIGV2ZW4gaWYgTkVFRFNfUExUIGlzIHNldC4gIFdoZW4gZm9yY2luZyBhIHN5bWJvbCB0bwotCWJlIGxvY2FsLCBjbGVhciBORUVEU19QTFQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBSZW1vdmUgdW51c2VkIGxvY2FsIGJlZC4KLQotV2VkIEp1biAxMSAyMjo0NDoyMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBOZXcgc3RydWN0dXJlCi0JZm9yIGRlcml2ZWQgZWxmIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICBSZWZlcmVuY2VzIHRvCi0JZWxmX2xpbmtfaGFzaF9lbnRyeSBjaGFuZ2VkIGFwcHJvcHJpYXRlbHkuCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlKTogTmV3IHN0cnVjdHVyZSBmb3IgZGVyaXZlZCBlbGYKLQlsaW5rZXIgaGFzaCB0YWJsZS4KLQkoZWxmMzJfbW4xMDMwMF9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSGFuZGxlICJjYWxsIiAtPiAiY2FsbHMiLCByZW1vdmFsCi0Jb2YgcHJvbG9ndWUgY29kZSwgYW5kIGNhbGw6MzItPmNhbGw6MTYgcmVsYXhpbmcuCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbzogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2lsaW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVmaW5lLgotCi1XZWQgSnVuIDExIDAwOjAwOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQ2FsbCBmaW5pc2hfZHluYW1pY19zeW1ib2wKLQlmb3IgYSBzeW1ib2wgd2hpY2ggaXMgYmVpbmcgZm9yY2VkIHRvIGJlIGxvY2FsLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogV3JpdGUgb3V0IHRoZQotCXJlbG9jYXRpb24gdmFsdWUgZm9yIGEgR09UIHJlbG9jIGZvciBhIHN5bWJvbCB3aGljaCBpcyB0dXJuaW5nCi0JaW50byBhIGxvY2FsIHN5bWJvbC4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaXMgdHVybmluZyBpbnRvIGEKLQlsb2NhbCBzeW1ib2wsIHdyaXRlIG91dCBhIFJFTEFUSVZFIHJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQKLQlyZWxvYy4KLQkqIGVsZjMyLW02OGsuYywgZWxmMzItc3BhcmMuYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBHZXQgdGhlIHJlbG9jYXRpb24KLQl2YWx1ZSBpZiB0aGUgc3ltYm9sIGlzIHR1cm5pbmcgaW50byBhIGxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0xOTk3LTA2LTEwIDIyOjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBBbHNvIHJlYWQgdmVybmVlZAotCWluZm9ybWF0aW9uIGJ5IGNhbGxpbmcgYF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzJy4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzIGxvb2sgZm9yCi0JdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgdmVybmVlZCByZWNvcmRzLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2Ugc29uYW1lIG9mIHNoYXJlZCBvYmplY3QKLQlmb3IgdmVybmVlZCByZWNvcmQgaWYgaXQgaXMgYXZhaWxhYmxlLgotCi1UdWUgSnVuIDEwIDExOjEzOjAzIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNwdS1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yIGNvbXBhdGlibGUgYW5kIHNjYW4uCi0JKiBjb2ZmbGluay5jOiBBZGQgcHJvdG90eXBlIGZvciBtYXJrX3JlbG9jcy4KLQotCSogYXJjaGl2ZS5jIChiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSk6IENoYW5nZSBmaWxlbmFtZSB0bwotCWNvbnN0IHBvaW50ZXIuICBBZGQgcHJvdG90eXBlLgotCi1Nb24gSnVuICA5IDEyOjM0OjIxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElnbm9yZSByZWxvY2F0aW9ucyBvZgotCXNlY3Rpb25zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQuCi0KLTE5OTctMDYtMDYgMjI6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMpOiBXaGVuIHNlYXJjaGluZwotCWZvciBrbm93biB2ZXJzaW9uIHN5bWJvbCBza2lwIG5vbi1tYXRjaGluZyB2ZXJkZWYgcmVjb3Jkcywgbm90Ci0JbWF0Y2hpbmcgcmVjb3Jkcy4KLQotVGh1IEp1biAgNSAxNTo1Mjo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBXcml0ZSBhIGxvbmcsCi0Jbm90IGEgYmZkX3ZtYSwgdG8gdGhlIGJhc2UgZmlsZSwgdG8gbWF0Y2ggaG93IGRsbHRvb2wgcmVhZHMgaXQuCi0KLVR1ZSBKdW4gIDMgMTY6NTc6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIHRodW1iIHJlbG9jYXRpb25zLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBUaHVtYiByZWxvY2F0aW9ucy4KLQotCSogbGliYmZkLmg6IEFkZCBUaHVtYiByZWxvY2F0aW9ucy4KLQotTW9uIEp1biAgMiAxMDo0MTo1MiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEZpeCA2ODA2MCBjcHUgbmFtZS4KLQotRnJpIE1heSAzMCAxMjo0NjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFNldCBkeW5pbmR4Ci0JZm9yIGEgc2VjdGlvbiBldmVuIGlmIGl0IGlzIG5vdCBsb2FkZWQuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IElmIFBFIGZpbGUsIGRvbid0IHN1YnRyYWN0Ci0Jc2VjdGlvbiBWTUEuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFNlcGFyYXRlIHNlY3Rpb24gVk1BIGhhbmRsaW5nIGZvcgotCWlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayB3aGV0aGVyIGlucHV0IGZpbGUsCi0Jbm90IG91dHB1dCBmaWxlLCBpcyBhIFBFIGZpbGUuCi0KLVdlZCBNYXkgMjggMTU6NDg6NDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE1ha2Ugc3RhdGljLgotCi1XZWQgTWF5IDI4IDE2OjE2OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IERvbid0IGp1c3QgZXhpdCBpZiB3ZSBzZWUgYW4KLQlSX0lNQUdFQkFTRSByZWxvYy4KLQotV2VkIE1heSAyOCAwOTo0ODo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiBBZGQgdGVzdCBmb3Igc3VwZXJzZXRzIG9mIEFSTQotCWFyY2hpdGVjdHVyZXMuCi0KLVR1ZSBNYXkgMjcgMTk6NDI6MDMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBnbG9iYWxfdG9fc3RhdGljCi0JbWVtYmVyLgotCi1UdWUgTWF5IDI3IDE0OjM0OjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE1ha2UgZ2xvYmFsLiAgSXQgaXMKLQljYWxsZWQgZGlyZWN0bHkgYnkgZ2FzL2NvbmZpZy90Yy1hcm0uYy4KLQotVHVlIE1heSAyNyAxNTo1ODo1MyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoUExUX0VOVFJZXyopOiBVc2UgYSBuZXcgdGhyZWFkLXNhZmUgZm9ybWF0LgotCShlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaWxsIGl0IGluIHByb3Blcmx5LgotCi1Nb24gTWF5IDI2IDE0OjA1OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IElmIFBFIGZpbGUsIGRvbid0IGFkZAotCXNlY3Rpb24gVk1BLgotCi1Nb24gTWF5IDI2IDEwOjU3OjQ4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiAjdW5kZWYgYmVmb3JlICNkZWZpbmUuCi0JKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBNYWtlIHN0YXRpYy4KLQkoY29mZl9hcm1fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQkoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogRGl0dG8uCi0JKGNvZmZfYXJtX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQotRnJpIE1heSAyMyAxNToxNDo1OCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgYm9vbGVhbgotCWdsb2JhbF90b19zdGF0aWMgbWVtYmVyIGZvciBzdXBwb3J0IG9mIHRhc2sgbGlua2luZy4KLQkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IEFkZCBwcm90b3R5cGUuCi0JKiBsaWJjb2ZmLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSAjaWZkZWYgdG8KLQljaGVjayBSUzYwMDBDT0ZGX0MsIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgdXNlcwotCWluIHRoaXMgZmlsZS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLAotCWNhbGwgX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscy4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLCBjb252ZXJ0Ci0JZ2xvYmFsIGZ1bmN0aW9ucyB0byBzdGF0aWMuCi0JKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLCBjb252ZXJ0Ci0JZ2xvYmFsIHZhcmlhYmxlcyB0byBzdGF0aWMuCi0JKF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLXRpYzgwLmMgKFRJQzgwQ09GRik6IERlZmluZSB0aGlzIGluc3RlYWQgb2YganVzdCBUSUM4MC4KLQkoQ19BVVRPQVJHKTogI3VuZGVmIHNpbmNlIGl0IGNsYXNoZXMgd2l0aCBDX1VFWFQuCi0JKENfTEFTVEVOVCk6ICN1bmRlZiBzaW5jZSBpdCBjbGFzaGVzIHdpdGggQ19TVEFUTEFCLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgVElDODBDT0ZGCi0JcmF0aGVyIHRoYW4gVElDODAuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIENfU1lTVEVNLiAgSGlkZSBDX0FVVE9BUkcgdXNlCi0Jd2hlbiBUSUM4MENPRkYgZGVmaW5lZCAoY2xhc2hlcyB3aXRoIENfVUVYVCkuICBFeHBsaWNpdGx5Ci0JcmVjb2duaXplIENfVUVYVCwgQ19TVEFUTEFCLCBhbmQgQ19FWFRMQUIgYXMgdW5zdXBwb3J0ZWQuCi0KLUZyaSBNYXkgMjMgMTI6Mzg6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwX2hvd3RvX3RhYmxlKTogQ2hhbmdlIG92ZXJmbG93IGNoZWNrIGZvciBtb3N0Ci0JUFAgcmVsb2NhdGlvbnMgdG8gY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4KLQotVGh1IE1heSAyMiAyMDoyMjoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBBZGQgUFAgcmVsb2NhdGlvbnMuICBDaGFuZ2UKLQluYW1lIG9mIFJfUkVMTE9ORyB0byAiUkVMTE9ORyIuICBTZXQgcmlnaHRzaGlmdCBhbmQgY29tcGxhaW4gZm9yCi0JTV9QUENSLgotCShwcGJhc2VfcmVsb2MsIGdsb2IxNV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShnbG9iMTZfcmVsb2MsIGxvY2FsMTZfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgYWxsIHJlbG9jYXRpb24gdHlwZXMuCi0JKGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSB0byBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogRGVwZW5kcyB1cG9uIGluY2x1ZGUvY29mZi90aWM4MC5oLgotCi1XZWQgTWF5IDIxIDE3OjE1OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBDT0ZGX1dJVEhfUEUgb3IKLQlDT0ZGX0lNQUdFX1dJVEhfUEUsIGRvbid0IHN1YnRyYWN0IHRoZSBzZWN0aW9uIFZNQSBmcm9tIHRoZSBzeW1ib2wKLQl2YWx1ZS4KLQkqIGNvZmZnZW4uYyAoZml4dXBfc3ltYm9sX3ZhbHVlKTogQWRkIGFiZmQgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBJZiBQRSBmaWxlLCBkb24ndCBhZGQgc2VjdGlvbiBWTUEuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSWYgUEUgZmlsZSwgZG9uJ3QgYWRkIHNlY3Rpb24gVk1BLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogcGVpY29kZS5oOiBBZGQgJiAweGZmZmZmZmZmIHdoZW4gdXNpbmcgSW1hZ2VCYXNlIGluIGNhc2UgYmZkX3ZtYQotCWlzIDY0IGJpdHMuCi0KLVdlZCBNYXkgMjEgMDk6NTg6MTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAobWFya19yZWxvY3MpOiBBZGQgbmV3IGZ1bmN0aW9uIHRvIG1hcmsgc3ltYm9scyB3aGljaAotCWFyZSB1c2VkIGJ5IHJlbG9jYXRpb25zLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBBZGQgY2FsbCB0byBtYXJrX3JlbG9jcygpIGFuZCBjb2RlIHRvCi0Jc3VwcHJlc3MgdGhlIHNraXBwaW5nIG9mIHN5bWJvbHMgdGhhdCBoYXZlIHRodXMgYmVlbiBtYXJrZWQuCi0KLVR1ZSBNYXkgMjAgMTg6NDU6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX21lcmdlX3ByaXZhdGVfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0KLU1vbiBNYXkgMTkgMTQ6NDY6MDAgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmM6IFJlbW92ZSB1bm5lY2Vzc2FyeSAjaWZkZWZzLgotCSogY29uZmlnLmJmZDogU2V0IHRhcmdfdW5kZXJzY29yZSB0byB5ZXMgZm9yIHRpYzgwLgotCi1Nb24gTWF5IDE5IDE0OjI2OjM2IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChOQU1FU19IQVZFX1VOREVSU0NPUkUpOiBEZWZpbmUgKGZpeGVzIHByb2JsZW0KLQl3aXRoIHVucmVzb2x2ZWQgZXh0ZXJuYWwgc3ltYm9scyBpbiBHREIpLgotCi1GcmkgTWF5IDE2IDEwOjIzOjAzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX3JlbGF4X3NlY3Rpb24pOiBSZWFkIGluIGFsbAotCXRoZSBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEJGRC4KLQkobW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3QgYWRqdXN0IHRoZSBzYW1lIHN5bWJvbAotCW1vcmUgdGhhbiBvbmNlLgotCSogZWxmLW0xMDIwMC5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLW0zMnIuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1zaC5jOiBMaWtld2lzZS4KLQotRnJpIE1heSAxNiAxMjoxMDo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgZGVjcmVhc2UgdGhlCi0JYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbC4gIElmIHR3byBzeW1ib2xzIHRoYXQgbG9vayBsaWtlCi0JY29tbW9uIHN5bWJvbHMgYXJlIGZvdW5kIGluIHR3byBzaGFyZWQgbGlicmFyaWVzLCBhbmQgdGhlIHNpemUgaXMKLQlkaWZmZXJlbnQsIHVzZSB0aGUgbGFyZ2VyIHNpemUsIGFuZCB3YXJuIGlmIC0td2Fybi1jb21tb24uICBJZiBhCi0JY29tbW9uIHN5bWJvbCBvdmVycmlkZXMgYSBkZWZpbml0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnksIHNldCB0aGUKLQlzaXplIHRvIHRoZSBsYXJnZXIgc2l6ZSwgYW5kIHdhcm4gaWYgLS13YXJuLWNvbW1vbi4KLQotVGh1IE1heSAxNSAxNDozMToyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiAgQWxsb3cgZGVmYXVsdCBtYWNoaW5lIHRvIGJlIHBvbHltb3JwaGVkCi0JaW50byBhbnkgb3RoZXIgbWFjaGluZSB0eXBlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6ICBJbml0aWFsaXNlIGZsYWdzIHZhcmlhYmxlIHRvIDAuCi0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogIFdoZW4gbWVyZ2luZwotCWRhdGEgaW50byBhbiB1bml0aWFsaXNlZCBkZXN0aW5hdGlvbiBzZXQgaXRzIG1hY2hpbmUgdHlwZSBhcyB3ZWxsLgotCi1UaHUgTWF5IDE1IDE2OjQwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBGb3JjZSBFTEYgc3ltYm9sIHNpemUKLQl0byBjb21tb24gc3ltYm9sIHNpemUuICBDb25zaXN0ZW50bHkgdHJlYXQgdW5pbml0aWFsaXplZCBzeW1ib2xzCi0JaW4gc2hhcmVkIG9iamVjdHMgYXMgY29tbW9uIHN5bWJvbHMuCi0KLUZyaSBNYXkgIDkgMTA6MTU6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoY29uc3RhbnRzKTogIEFkZGVkIG5ldyBjb25zdGFudHMgdG8gaWRlbnRpZnkgdGhlCi0JdHlwZSBvZiB0aGUgQVJNIGFyY2hpdGVjdHVyZTogYmZkX21hY2hfYXJtXzIsIGJmZF9tYWNoX2FybV8yYSwKLQliZmRfbWFjaF9hcm1fMywJYmZkX21hY2hfYXJtXzNNLCBiZmRfbWFjaF9hcm1fNCBhbmQgYmZkX21hY2hfYXJtXzRULgotCi0JKiBiZmQtaW4yLmggKGNvbnN0YW50cyk6ICAgQWRkZWQgbmV3IGNvbnN0YW50cyB0byBpZGVudGlmeQotCXRoZSB0eXBlIG9mIHRoZSBBUk0gYXJjaGl0ZWN0dXJlOiBiZmRfbWFjaF9hcm1fMiwgYmZkX21hY2hfYXJtXzJhLAotCWJmZF9tYWNoX2FybV8zLCBiZmRfbWFjaF9hcm1fM00sIGJmZF9tYWNoX2FybV80IGFuZAotCWJmZF9tYWNoX2FybV80VC4gIFRoaXMgZmlsZSBpcyBhdXRvLW1hZ2ljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUKLQlhcmNodXJlcy5jIGZpbGUuICBUaGlzIHVwZGF0ZSBpcyBqdXN0IHRvIHNhdmUgd29yay4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsCi0JY29mZl9hcm1fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsCi0JY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzLAotCWNvZmZfYXJtX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGRlZCB0aGVzZSBuZXcgZnVuY3Rpb25zLgotCShnbG9iYWwpOiBNYWNybyByZWRlZmluaXRpb25zIHNldCB1cCB0byB1c2UgdGhlc2UgbmV3IGZ1bmN0aW9ucy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogQWRkZWQgY2FsbCB0bwotCWNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncygpLgotCShjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZGVkIGNvZGUgdG8gc2V0IG1hY2hpbmUgdHlwZSBiYXNlZCBvbgotCWJpdHMgc3RvcmVkIGluIGludGVybmFsIGZsYWdzLgotICAJKGNvZmZfc2V0X2ZsYWdzKTogQWRkZWQgY29kZSB0byBzZXQgdGhlIG5ldyBiaXRzIGluIHRoZSBmbGFncwotCWZpZWxkIGJhc2VkIG9uIHRoZSBtYWNoaW5lIG51bWJlci4KLQkoZnVuY3Rpb24gZGVmaW5pdGlvbiBtYWNyb3MpOiBNYWRlIGFsbCBmdW5jdGlvbiBkZWZpbml0aW9uIG1hY3JvcwotCWNvbmRpdGlvbmFsIHNvIHRoYXQgdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0YXJnZXQgc3BlY2lmaWMKLQlmaWxlcy4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogQWRkZWQgdGhpcyBmdW5jdGlvbi4gIChhcmNoX2luZm9fc3RydWN0KToKLQlTdHJ1Y3R1cmUgZXh0ZW5kZWQgdG8gaW5jbHVkZSBuZXcgdHlwZXMsIG9uZSBlYWNoIGZvciBBUk12MiwKLQlBUk12MmEsIEFSTXYzLCBBUk12M00sIEFSTXY0IGFuZCBBUk12NFQuCi0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiAgQWRkZWQgZmxhZ3MgZmllbGQuCi0KLUZyaSBNYXkgIDkgMTc6NDA6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1nbnUqKTogRG9uJ3QgaW5jbHVkZSBNYWNoIHN1cHBvcnQuCi0KLQkqIGNvbmZpZy5iZmQ6IENoYW5nZSAjaWYgMCBhcm91bmQgdXNlcyBvZiBob3N0X2FvdXRfdmVjIHRvICNpZgotCUhBVkVfaG9zdF9hb3V0X3ZlYy4KLQotTW9uIE1heSAgNSAxMzo1NzozMiAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSWYgdGhlcmUgYXJlIG5vIHN5bWVudHMsCi0JanVzdCByZXR1cm4gZmFsc2UuCi0KLU1vbiBNYXkgIDUgMTg6MTg6NDUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8cGpiMjdAY2FtLmFjLnVrPgotCi0JKiBjb25maWcuYmZkOiBjb3BlIHdpdGggJyotKi1saW51eC1nbnVhb3V0JyB0YXJnZXRzLgotCi1UaHUgTWF5ICAxIDExOjMxOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ21hdGNoLnNlZDogQWRkIGV4cGxpY2l0IFxuIGNoYXJhY3RlcnMgdG8gd29yayBhcm91bmQgYnVnIGluCi0JSFAvVVggMTAuMjAgc2VkIHByb2dyYW0uCi0KLVdlZCBBcHIgMzAgMTI6Mjc6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ2FzdCBjc2VjcyB0byBhdm9pZCBzaWduCi0JZXh0ZW5zaW9uIHByb2JsZW1zLgotCi1UdWUgQXByIDIyIDEyOjA2OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21haW50YWluZXJfY2xlYW4pOiBEb24ndCByZW1vdmUgYmZkLWluMi5oLgotCi1Nb24gQXByIDIxIDExOjIxOjMxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEZvbGxvdyB0aGUgbGFzdCBjaGFuZ2VzIGluIGVsZjMyLWkzODYuYzoKLQkoc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQsIHN0cnVjdAotCWVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSwgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZSwKLQllbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UsIGVsZl9tNjhrX2hhc2hfdGFibGUsCi0JZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMsIGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsCi0JZWxmX202OGtfZGlzY2FyZF9jb3BpZXMsIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6Ci0JTmV3IGRlZmluaXRpb25zLgotCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgZG9uJ3QgY29weQotCVBDIHJlbGF0aXZlIHJlbG9jcyBmb3IgYSBnbG9iYWwgc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyCi0Jb2JqZWN0LCBhbmQgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciBhbnkKLQlnbG9iYWwgc3ltYm9sLgotCShlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywKLQl0cmF2ZXJzZSB3aXRoIGVsZl9tNjhrX2Rpc2NhcmRfY29waWVzLgotCi1TYXQgQXByIDE5IDIyOjUwOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBPbmx5IGNvdW50IFBDIHJlbGF0aXZlCi0JcmVsb2NzLiAgRnJvbSBKYW1pZSBMb2tpZXIgPGphbWllQHJlYmVsbGlvbi5jby51az4uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yY2UgdGhlCi0JcG90ZW50aWFsIGxhc3QgYnl0ZSBpbiB0aGUgZmlsZSB0byBiZSB3cml0dGVuIG91dCB3aGVuCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotCi1UaHUgQXByIDE3IDEzOjQ2OjU2IDE5OTcgIFBlciBGb2dlbHN0cm9tICA8cGVmb0BvcGVuYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmhvc3QgKG1pcHMqLSotb3BlbmJzZCopOiBOZXcgaG9zdC4KLQotVGh1IEFwciAxNyAxMToxMDo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBzdWJ0cmFjdCB0aGUKLQlzZWN0aW9uIFZNQSBmcm9tIHRoZSBzeW1ib2wgdmFsdWUgaWYgdGhpcyBpcyBhIGZ1bGx5IGxpbmtlZCBmaWxlLgotCi0JKiBlbGYzMi1pMzg2LmMgKHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBkb24ndCBjb3B5Ci0JUEMgcmVsYXRpdmUgcmVsb2NzIGZvciBhIGdsb2JhbCBzeW1ib2wgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlvYmplY3QsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIGFueQotCWdsb2JhbCBzeW1ib2wuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLAotCXRyYXZlcnNlIHdpdGggZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMuCi0JKGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVmaW5lLgotCi0JRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBhb3V0ZjEuaCAoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogVXNlIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcy4KLQotV2VkIEFwciAxNiAxMjo0MzozMiAxOTk3ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChlbGZfZDMwdl9ob3d0b190YWJsZSk6IENoYW5nZWQgc2l6ZSBvZgotCVJfRDMwVl8zMl9OT1JNQUwgdG8gMiAoNCBieXRlcykuCi0KLVdlZCBBcHIgMTYgMTQ6MDI6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBuZXRic2QuaCAoTl9TSEFSRURfTElCKTogRGVmaW5lLgotCShTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKiBtNjhrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZSAocmV2ZXJ0IGNoYW5nZSBvZgotCUFwcmlsIDExKS4KLQkqIHNwYXJjbmV0YnNkLmMgKFRBUkdFVF9QQUdFX1NJWkUpOiBEZWZpbmUgYXMgMHgyMDAwLgotCShTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNldCAucmVsYS5ic3Mgc2l6ZQotCXRvIHNpemVvZiBSZWxhIHN0cnVjdHVyZSwgbm90IHNpemVvZiBSZWwgc3RydWN0dXJlLiAgRnJvbSBHYXJ5Ci0JVGhvbWFzIDxnLnRob21hc0BvcGVuZ3JvdXAub3JnPi4KLQotVHVlIEFwciAxNSAxMTo1MDozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IElmIGVudHJ5X2lzX3RleHRfYWRkcmVzcywgYWRqdXN0Ci0Jd2hlbmV2ZXIgZW50cnkgaXMgbGFyZ2VyIHRoYW4gdGV4dCBhZGRyZXNzLCBidXQgb25seSBieSB3aG9sZQotCXBhZ2VzLiAgRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT4uCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UKLQlta2luc3RhbGxkaXJzIHRvIGJ1aWxkICQob2xkaW5jbHVkZWRpcikuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBjYWxsIGNoZWNrX3JlbG9jcwotCWlmIHRoaXMgaXMgYSBkZWJ1Z2dpbmcgc2VjdGlvbiB3aGljaCB3ZSBhcmUgc3RyaXBwaW5nLgotCi1Nb24gQXByIDE0IDEyOjM5OjMwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9vYmplY3RfcCk6IEFsbG9jYXRlIHRoZQotCWFscGhhLXNwZWNpZmljIHRhcmdldCBkYXRhIHN0cnVjdC4KLQotTW9uIEFwciAxNCAxMTo0NTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBNYWtlZmlsZS5pbjogQWx3YXlzIHVzZSAkKFNIRUxMKSB3aGVuIHJ1bm5pbmcgbW92ZS1pZi1jaGFuZ2UuCi0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByIDExIDE1OjQzOjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogT25seSBzdWJ0cmFjdCB0aGUgc2VjdGlvbgotCVZNQSBpZiB0aGlzIGlzIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBhIHNoYXJlZCBvYmplY3QuCi0KLQkqIHRhcmdldHMuYyAobmV0YnNkX2NvcmVfdmVjKTogRGVjbGFyZS4gIEZyb20gR29yZG9uIFcuIFJvc3MKLQk8Z3dyQG1jLmNvbT4uCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGVudHJ5X2lzX3RleHRfYWRkcmVzcwotCWZpZWxkLgotCSogYW91dC10YXJnZXQuaCAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIHRvIFRBUkdFVF9QQUdFX1NJWkUgYXQgdGhlCi0Jc3RhcnQgb2YgdGhlIGZpbGUuICBSZW1vdmUgdXNlcyBsYXRlciBvbiB3aGljaCBzd2l0Y2ggdXNpbmcKLQlpZmRlZi4KLQkoTVkoY2FsbGJhY2spKTogSGFuZGxlIGVudHJ5X2lzX3RleHRfYWRkcmVzcy4KLQkoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgotCSogaTM4NmFvdXQuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogaTM4Nm1hY2gzLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmMgKHNwYXJjbHlueF9hb3V0X2JhY2tlbmQpOiBMaWtld2lzZS4KLQkqIG5ldGJzZC5oIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyk6IERlZmluZS4KLQkqIG02OGtuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIGFzIDB4MjAwMDAuCi0KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IEhhbmRsZSBpbXBvcnRpbmcgYSBzeW1ib2wKLQl3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGAuJy4KLQotRnJpIEFwciAxMSAxMTo1NzoxNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBjb25maWcuYmZkOiAoaVszNDU2XTg2LSotb3BlbmJzZCosIG02OCotKi1vcGVuYnNkKiwKLQltaXBzKmVsKi0qLW9wZW5ic2QqLCBtaXBzKi0qLW9wZW5ic2QqLCBuczMyay0qLW9wZW5ic2QqLAotCXBvd2VycGMtKi0qYnNkKiwgc3BhcmMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi1vcGVuYnNkKiwgbWlwcyotKi1vcGVuYnNkKiwKLQltNjgqLSotb3BlbmJzZCosIG5zMzJrLSotb3BlbmJzZCosIHBvd2VycGMtKi0qYnNkKiwKLQlzcGFyYy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBBcHIgIDggMTg6MDk6MjkgMTk5NyAgSmFtaWUgTG9raWVyICA8amFtaWVAcmViZWxsaW9uLmNvLnVrPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8pOiBOZXcgZmllbGQKLQlgY3VtdWxhdGl2ZV9za2lwcycuCi0JKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRmlsbCB0aGUgYWJvdmUgYXJyYXkuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCk6IFVzZSBgY3VtdWxhdGl2ZV9za2lwcycgdG8KLQlzcGVlZCB1cCBvZmZzZXQgY2FsY3VsYXRpb24uCi0KLVR1ZSBBcHIgIDggMDA6MDE6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogZWxmLW1uMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IERvbid0IGZvcmdldCB0aGUKLSAgICAgICAgYWRkZW5kIGZvciBub24gcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZi1tMTAzMDAuYyAoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBSZW1vdmUgcHJvdG90eXBlCi0JZm9yIG5vbi1leGlzdGVudCBmdW5jdGlvbi4KLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkobW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi1Nb24gQXByICA3IDE2OjQ3OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBTSExJQl9MSUJTLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIFNITElCX0xJQlMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoU0hMSUJfTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJQikpOiBVc2UgJChTSExJQl9MSUJTKS4KLQotTW9uIEFwciAgNyAxMDo1Mzo1MiAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCBiZmQtaW4yLmg6IGFkZCBiZmRfc2VjdGlvbl9sbWEgbWFjcm8gdG8gY29ycmVzcG9uZAotCXdpdGggYmZkX3NlY3Rpb25fdm1hLgotCi1GcmkgQXByICA0IDExOjM3OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVcGRhdGUgZmlsZSBuYW1lcyBmb3IgYmZkX2VsZjMyX21uMTBbMjNdMDBfdmVjLgotCUNvcnJlY3QgQ1BVIGZpbGUgbmFtZXMgZm9yIG1uMTBbMjNdMDAuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGJmZC5jIChiZmRfcmVjb3JkX3BoZHIpOiBDYXN0IGNvdW50IHRvIHNpemVfdCBiZWZvcmUKLQlzdWJ0cmFjdGlvbi4KLQotCSogY29mZi1wcGMuYyAoZHVtcF90b2MpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nIGZyb20gU3VuT1MgY2MuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9yZWFkX2FyX2hkcik6IExpa2V3aXNlLgotCSh4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogTElrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IExpa2V3aXNlLgotCShwZV9wcmludF9lZGF0YSwgcGVfcHJpbnRfcGRhdGEsIHBlX3ByaW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9zZXRfYXJjaF9tYWNoKTogTWFrZSBzdGF0aWMuCi0JKHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19jdG9yNjRfaG93dG8pOiBTZXQgY29tcGxhaW5fb25fb3ZlcmZsb3cKLQl0byBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0KLVRodSBBcHIgIDMgMTE6NTE6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBTZXQgdG8gMi44LjEuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogIERvbid0IGNoZWNrIFNFQ19BTExPQyB3aGVuCi0JZGVjaWRpbmcgd2hldGhlciB0byBjb3B5IGEgcmVsb2MgaW50byBhIHNoYXJlZCBvYmplY3QuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLiAgUmVsb2NhdGUgUl9QUENfUkVMQVRJVkUKLQlyZWxvY3MgaW4gdW5hbGxvY2F0ZWQgc2VjdGlvbnMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVsb2NhdGUKLQlSX1NQQVJDX1JFTEFUSVZFIHJlbG9jcyBpbiB1bmFsbG9jYXRlZCBzZWN0aW9ucy4KLQotV2VkIEFwciAgMiAxNjoxOTo0MSAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVW5kbyBNYXJjaCAyNiBjaGFuZ2UgYW5kCi0JYWx3YXlzIGNyZWF0ZSBnb3Qgc2VjdGlvbiBzbyB0aGF0IHRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gbGFiZWwKLQlpcyBhbHdheXMgY3JlYXRlZC4KLQotV2VkIEFwciAgMiAxMDo0OTowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGV0IGEgY29tbW9uIHN5bWJvbAotCW92ZXJyaWRlIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGZyb20gYSBzaGFyZWQgbGlicmFyeSB3aXRoIGEKLQlzbWFsbGVyIHNpemUuCi0KLQkqIGVsZi1tMTAyMDAuYzogUmVuYW1lIGZyb20gZWxmMzItbW4xMDIwMC5jLgotCSogZWxmLW0xMDMwMC5jOiBSZW5hbWUgZnJvbSBlbGYzMi1tbjEwMzAwLmMuCi0JKiBjcHUtbTEwMjAwLmM6IFJlbmFtZSBmcm9tIGNwdS1tbjEwMjAwLmMKLQkqIGNwdS1tMTAzMDAuYzogUmVuYW1lIGZyb20gY3B1LW1uMTAzMDAuYwotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19jdG9yNjRfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShlbGZfbWlwc19pc2EpOiBNb3ZlIHRvIGVhcmxpZXIgaW4gZmlsZS4KLQkobWlwc19yZWxvY19tYXApOiBSZW1vdmUgQkZEX1JFTE9DX0NUT1IgZW50cnkuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IKLQlzcGVjaWFsbHkuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwczE2X2p1bXBfcmVsb2MpOiBQcmludCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4KLQljYWxsaW5nIGFib3J0LgotCi1UdWUgQXByICAxIDE2OjE4OjA1IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLXZtczogUmVtb3ZlIGZpbGUuCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBmb3IgbmV3IGNvbmZpZ3VyZSBzY2hlbWUuCi0KLU1vbiBNYXIgMzEgMjM6Mjg6MzkgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbGliY29mZi1pbi5oIChwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBEZWNsYXJlLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IERlY2xhcmUgaWYgbm90IGEgbWFjcm8uCi0KLU1vbiBNYXIgMzEgMTY6Mjk6NTAgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuYmZkIChocHBhKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCi1Nb24gTWFyIDMxIDE2OjExOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdXNlIHN5bW5keCBhcyBhCi0Jc3ltYm9sIGluZGV4IGZvciBhIFJfSUhDT05TVCByZWxvYy4KLQotTW9uIE1hciAzMSAxNTo0MDo1OSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiB0YXJnbWF0Y2guc2VkOiBEbyBub3QgdXNlIFwoXCkgcmVjdXJzaXZlbHkuCi0KLUZyaSBNYXIgMjggMTQ6NDQ6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbTY4a2xpbnV4LmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCSogaTM4NmxpbnV4LmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCi1GcmkgTWFyIDI4IDExOjU2OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1PiBhbmQgSC5KLiBMdQotCTxoamxAZ251LmFpLm1pdC5lZHU+OgotCSogc3BhcmNsaW51eC5jOiBOZXcgZmlsZS4KLQkqIGJmZC1pbi5oIChiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlnLmJmZCAoc3BhcmMtKi1saW51eGFvdXQqLCBzcGFyYy0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChzcGFyY2xpbnV4X3ZlYyk6IEFkZCB0byBsaXN0IG9mIHZlY3RvcnMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKHNwYXJjbGludXhfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc3BhcmNsaW51eF92ZWMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHNwYXJjbGludXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHNwYXJjbGludXguYy4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcKLQliZmRfY29mZl9iYWNrZW5kX2RhdGEgZmllbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcuYmZkOiBBZGQgYmZkX2VsZjY0X3tiaWcsbGl0dGxlfW1pcHNfdmVjIHRvIHRhcmdfc2VsdmVjcwotCWZvciBtaXBzKmVsKi0qLWxpbnV4KiBhbmQgbWlwcyotKi1saW51eCouICBGcm9tIEguSi4gTHUKLQk8aGpsQGx1Y29uLm9yZz4gYW5kIFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT4uCi0KLQkqIGJmZC5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKHN0cmVycm9yKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2Vycm1zZyk6IENhbGwgeHN0cmVycm9yIHJhdGhlciB0aGFuIHN0cmVycm9yLgotCi1UaHUgTWFyIDI3IDEyOjU1OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBHZW5lcmF0ZSBhIENPUFkKLQlyZWxvYyBldmVuIGlmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC5ic3Mgc2VjdGlvbi4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIuCi0JKGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaW1pdCBhbGlnbm1lbnQgb2YgYSBjb21tb24KLQlzeW1ib2wgdG8gdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQuCi0KLQkqIENPUFlJTkc6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KLQotVGh1IE1hciAyNyAwMDo0NTo1NyAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChlbGZfZDMwdl9ob3d0b190YWJsZSk6IEZpeCBhIHR5cG8gaW4gdGhlCi0JMjEtYml0IGFic29sdXRlIHRoYXQgbWFkZSBpdCBhY3QgYXMgYSByZWxhdGl2ZS4KLQotV2VkIE1hciAyNiAxNDo1MDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogRG9uJ3Qgc2V0Ci0JYnNzX3NlY3Rpb24gYW5kIHJlbF9zZWN0aW9uIGZyb20gZXhpc3Rpbmcgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IE9ubHkgY3JlYXRlIHRoZSBnb3Qgc2VjdGlvbgotCWlmIGl0IGlzIG5lZWRlZC4KLQotVHVlIE1hciAyNSAyMjoyNjo1NiAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgQ2hhbmdlIGV4ZWN1dGFibGUgdGVzdCB0byBmaXgKLQlwcm9ibGVtcyB3aXRoIGVtYmVkZGVkIGEub3V0IHN5c3RlbXMuCi0KLVR1ZSBNYXIgMjUgMTQ6MzU6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IHRoZSBvZmZzZXQgb2YgYQotCXN0YWIgcmVsb2MuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBzdGFicy5jIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IENvcHkgb3ZlciB0aGUgZmlyc3QgaGVhZGVyCi0Jc3ltYm9sLiAgQ2hlY2sgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgb2YgKnBzaW5mby4KLQkoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogQWRkIHBzaW5mbyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIFNldCB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciBzeW1ib2wuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBNYXIgMjQgMjA6MDc6MjkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBBZGQgUl9BQlMgZW50cnkuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIFJfQUJTIHJlbG9jIHR5cGUuICBBbHNvIGFib3J0IG9uIHVuaGFuZGxlZAotCXJlbG9jIHR5cGVzLCByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIHRvIGdlbmVyYXRlIGFuIG91dHB1dCBmaWxlLgotCi1Nb24gTWFyIDI0IDEzOjQxOjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ21hdGNoLnNlZDogVXNlIHRoZSBob2xkIHNwYWNlIHRvIHB1dCB0aGUgI2lmZGVmIGFyb3VuZCB0aGUKLQl0aGUgc3RyaW5nIGNvbnN0YW50LgotCSogdGFyZ2V0cy5jIChVTlNVUFBPUlRFRF9UQVJHRVQpOiBEb24ndCBkZWZpbmUuCi0JKGZpbmRfdGFyZ2V0KTogRG9uJ3QgY2hlY2sgZm9yIFVOU1VQUE9SVEVEX1RBUkdFVC4KLQkoYmZkX3NldF9kZWZhdWx0X3RhcmdldCk6IERvbid0IHRyeSB0byBvcHRpbWl6ZSBieSBjaGVja2luZyBmb3IKLQlkZWZhdWx0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS1tMzJyLmMuCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1tMzJyLmMuCi0JKGVsZjMyLW0zMnIubyk6IFJlbW92ZSBleHBsaWNpdCB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQ6IERvbid0IHNldCB0YXJnX3VuZGVyc2NvcmUgZm9yIGlbMzQ1Nl04Ni0qLWdudSogb3IKLQlpWzM0NTZdODYtKi1saW51eCouCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0Ci0JY291bnQgc2VjdGlvbiBzeW1ib2xzIGZvciBzZWN0aW9ucyB0aGF0IHdlcmUgY3JlYXRlZCBieSB0aGUKLQlsaW5rZXIsIG9yIGFyZSBub3QgYWxsb2NhdGFibGUgb3Igbm90IGxvYWRhYmxlLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE91dHB1dCBvdXRwdXQgc2VjdGlvbgotCXN5bWJvbHMgZm9yIHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1hZGUgc3BhY2UgZm9yIHRoZW0uCi0KLUZyaSBNYXIgMjEgMTM6MDg6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGVyZSBpcwotCW5vIC5yZWxhLnBsdCBzZWN0aW9uLCBkb24ndCBvdXRwdXQgYSBEVF9QTFRHT1QgZHluYW1pYyBlbnRyeS4KLQotRnJpIE1hciAyMSAxMjozNjo0NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2hvd3RvX3RhYmxlKTogVXNlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIExPMTYuCi0JKG0zMnJfaGkxNl9saXN0KTogTmV3IHN0YXRpYyBsb2NhbC4KLQkobTMycl9lbGZfaGkxNl9yZWxvYyk6IERvbid0IHBlcmZvcm0gcmVsb2MsIGp1c3QgcXVldWUgaXQgdXAuCi0JKG0zMnJfZWxmX2RvX2hpMTZfcmVsb2MpOiBEZWxldGUuCi0JKG0zMnJfZWxmX3JlbG9jYXRlX2hpMTYpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZWxmX2xvMTZfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgSEkxNiByZWxvY3MsIHNjYW4gZm9yIGNvcnJlc3BvbmRpbmcKLQlMTzE2IHJlbG9jLgotCi0JTW9uIE1hciAxMCAxNjowMzozMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBEZWxldGUuCi0JKG0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vayk6IFJld3JpdGUgX1NEQV9CQVNFXyBzdXBwb3J0LgotCShtMzJyX2VsZl9maW5hbF9zZGFfYmFzZSk6IE5ldyBmdW5jdGlvbi4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUgc2RhdGEgc3VwcG9ydC4KLQkobTMycl9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWxldGUuCi0KLVRodSBNYXIgMjAgMTI6Mzk6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0JKiBjb2ZmLXN2bTY4ay5jOiBOZXcgZmlsZS4gIEp1c3QgZGVmaW5lcyBzb21lIG1hY3JvcyBhbmQgaW5jbHVkZXMKLQljb2ZmLW02OGsuYy4KLQkqIGNvZmYtbTY4ay5jOiBBZGQgZnVuY3Rpb25zIHRvIGhhbmRsZSBjb21tb24gYWRkZW5kcywgbW92ZWQgaW4KLQlmcm9tIGNmLW02OGtseW54LmMuICBDb250cm9sIHRoZW0gdXNpbmcgQ09GRl9DT01NT05fQURERU5EIG1hY3JvLgotCUNvbnRyb2wgd2hldGhlciByZWxvY3MgYXJlIHZpc2libGUgdXNpbmcgU1RBVElDX1JFTE9DUy4KLQkqIGNmLW02OGtseW54LmM6IFNpbXBsaWZ5IGdyZWF0bHk6IGp1c3QgZGVmaW5lIG1hY3JvcyB0byBjb250cm9sCi0JY29mZi1tNjhrLmMuCi0JKiBjb2ZmLWF1eC5jOiBMaWtld2lzZS4gIEp1c3QgbGVhdmUgYWRkX29uZV9zeW1ib2wgcm91dGluZS4KLQkqIHRhcmdldHMuIChtNjhrc3lzdmNvZmZfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgbTY4a3N5c3Zjb2ZmX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKG02OCotbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChtNjhrc3lzdmNvZmZfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtc3ZtNjhrLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBjb2ZmLXN2bTY4ay5jLgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgZ2V0IG1pc2xlZCBpZiB0aGUKLSAJZmlyc3Qgc2VjdGlvbiBpcyBub3QgbG9hZGFibGUuICBGcm9tIE1hdHRoZXcgTC4gTWFydGluCi0gCTxtbG1AeGVkaWEuY29tPi4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgdGhlIHZhbHVlIG9mIGEgc2VjdGlvbgotCXN5bWJvbCB0byB0aGUgc2VjdGlvbiBhZGRyZXNzIHVubGVzcyBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi1UdWUgTWFyIDE4IDIzOjAzOjE3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjcmVhdGUKLQkucGx0IGVudHJ5IGlmIHdlJ3ZlIHRha2VuIHRoZSBmdW5jdGlvbidzIGFkZHJlc3MuCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBNZXJnZSBjb2xsZWN0ZWQgZmxhZ3MgaW5mbyBhcyB3ZWxsLgotCi1UdWUgTWFyIDE4IDIyOjQwOjA5IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIGNwdS1tNjhrLmMgKGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2gpOiBEb24ndCBkZWNsYXJlLgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgImxpYmNvZmYuaCIgYW5kICJsaWJlY29mZi5oIi4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBNYWtlIHN0YXRpYy4KLQkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBDaGFuZ2Ugc3RyZWFtIHBhcmFtZXRlciB0byBQVFIuCi0JKiBwZWljb2RlLmg6IENoYW5nZSBzZXZlcmFsIHZvaWQgKiBwYXJhbWV0ZXJzIHRvIFBUUi4KLQkqIHNyZWMuYyAoc3JlY19nZXRfc3ltYm9sX2luZm8pOiBNYWtlIHN0YXRpYy4KLQkqIHN5bXMuYyAoYmZkX3N5bWJvbF9pc19hYnNvbHV0ZSk6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotVHVlIE1hciAxOCAxMjo1ODowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFJlbW92ZS4KLQkoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlZmluZS4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBDYWxsIGJmZF9tYWxsb2MgcmF0aGVyCi0JdGhhbiBtYWxsb2MuCi0KLU1vbiBNYXIgMTcgMTE6MzI6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogRG9uJ3QgaW5jbHVkZSBvYnN0YWNrLmguCi0JKHN0cnVjdCBiZmRfaGFzaF90YWJsZSk6IENoYW5nZSBtZW1vcnkgZmllbGQgdG8gUFRSLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQ2hhbmdlIG1lbW9yeSBmaWVsZCB0byBQVFIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX3JlbGVhc2UpOiBEZWNsYXJlIGFzIGZ1bmN0aW9uLCBkb24ndCBkZWZpbmUgYXMKLQltYWNyby4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogb3BuY2xzLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCShnZXRwYWdlc2l6ZSk6IERvbid0IGRlZmluZS4KLQkoX2JmZF9uZXdfYmZkKTogRG9uJ3Qgc2V0IF9iZmRfY2h1bmtzaXplLgotCShiZmRfb3BlbnIpOiBGcmVlIG5ldyBiZmQgYW5kIG9iamFsbG9jIG9uIGZhaWx1cmUuCi0JKGJmZF9mZG9wZW5yLCBiZmRfb3BlbnN0cmVhbXIsIGJmZF9vcGVudyk6IExpa2V3aXNlLgotCShiZmRfYWxsb2Nfc2l6ZSk6IFJlbW92ZS4KLQkoYmZkX3JlbGVhc2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBoYXNoLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgYWNjdW11bGF0ZSk6IENoYW5nZSBtZW1vcnkgdG8gc3RydWN0IG9iamFsbG9jICouCi0JKiBsaWJvYXN5cy5oIChvYXN5c19kYXRhX3R5cGUpOiBSZW1vdmUgb2FzeXNfb2JzdGFjayBmaWVsZC4KLQkqIGRlcC1pbi5zZWQ6IERvbid0IHJlbW92ZSBvYnN0YWNrLmggZnJvbSBkZXBlbmRlbmN5IGxpc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9IX0RFUFMpOiBSZW1vdmUgb2JzdGFjay5oLgotCShpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBvYnN0YWNrLmguCi0JKiBNYW55IGZpbGVzOiBEb24ndCBpbmNsdWRlICJvYnN0YWNrLmgiLgotCSogVkVSU0lPTjogQnVtcC4KLQotCSogb3BuY2xzLmMgKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2NfZmluaXNoKTogUmVtb3ZlLgotCSogbGliYmZkLWluLmggKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2NfZmluaXNoKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogaWVlZS5jIChpZWVlX2FyY2hpdmVfcCk6IFJld3JpdGUgdG8gbm90IHVzZSBiZmRfYWxsb2NfZ3Jvdy4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogUmV3cml0ZSB0byBub3QgdXNlIG9ic3RhY2tfMWdyb3cuCi0KLQkqIG9wbmNscy5jIChiZmRfYWxsb2MpOiBSZW5hbWUgZnJvbSBiZmRfYWxsb2NfYnlfc2l6ZV90LiAgUmVtb3ZlCi0Jb2xkIHZlcnNpb24gb2YgYmZkX2FsbG9jLgotCSogbGliYmZkLWluLmggKGJmZF9hbGxvY19ieV9zaXplX3QpOiBEb24ndCBkZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBTZXZlcmFsIGZpbGVzOiBDYWxsIGJmZF9hbGxvYyByYXRoZXIgdGhhbiBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCi1TYXQgTWFyIDE1IDE1OjI0OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogQWNjZXB0IHRoZSBnZW5lcmljCi0JRUxGIGxvY2FsIGxhYmVsIHN5bnRheCBhcyB3ZWxsLgotCi1TYXQgTWFyIDE1IDEwOjE2OjQyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotYmVvcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotYmVvcyopOiBBZGQgY2FzZSB0aGF0IGV4cGxpY2l0bHkKLQlkb2VzIG5vdCBzZXQgQ09SRUZJTEUgZm9yIG5vdy4gIEEgZnV0dXJlIEJlT1MgdmVyc2lvbiBpcwotCWV4cGVjdGVkIHRvIHN1cHBvcnQgY29yZSBmaWxlcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCi1GcmkgTWFyIDE0IDE2OjQzOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBHaXZlIGFuIGVycm9yIGlmIENBTEwxNiBpcwotIAlzZWVuIHdpdGggYSBsb2NhbCBzeW1ib2wsIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUKLQl2ZXJzaW9uIHN5bWJvbHMgaWYgdGhlcmUgYXJlbid0IGFueS4KLQotVGh1IE1hciAxMyAxNjozODozMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lCi0JKGNvZmZfdGljODBfcnR5cGVfdG9faG93dG8pOiBDbG9uZSBnZW5lcmljIGNvZmYgdmVyc2lvbiBhbmQKLQlhZGQgY29kZSB0byBoYW5kbGUgdGhlIGZ1bmt5IFRJICJpbnRlcm5hbCByZWxvY2F0aW9ucyIuCi0KLVRodSBNYXIgMTMgMTQ6MDg6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHdhcm4gYWJvdXQgdHlwZQotCW9yIHNpemUgY2hhbmdlcyBiZWNhdXNlIG9mIGEgd2VhayBzeW1ib2wuCi0KLQkqIGNpc2NvLWNvcmUuYyAoU0lHRU1UKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCi1XZWQgTWFyIDEyIDIxOjM2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgZXh0c3ltb2ZmIHdoZW4KLQlzZXR0aW5nIGV2ZXIuICBTYW5pdHkgY2hlY2sgdGhlIHZlcnNpb24gbnVtYmVyLiAgU29ydCBvdXQgY29weWluZwotCWZsYWdzIGFuZCBvdGhlciBpbmZvcm1hdGlvbiB3aGVuIGFkZGluZyBhbiBpbmRpcmVjdCBzeW1ib2wuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogUHJlc2VydmUgYW55IGR5bmFtaWMKLQlzeW1ib2xzIGFkZGVkIGJ5IHRoZSBiYWNrZW5kLiAgQ2xlYXIgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUKLQl2ZXJzeW0gc2VjdGlvbi4KLQkoZWxmX2V4cG9ydF9zeW1ib2wpOiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEFjY2VwdCBhIHNlY3Rpb24gd2l0aG91dCBhbiBvd25lciBpbiBhbgotCWFzc2VydC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFkZCBhIHNhbml0eSBjaGVjayBvbiB0aGUKLQl2ZXJzaW9uIGNvdW50LiAgQ29ycmVjdCB0aGUgYWxsb2NhdGlvbiBvZiB4X3ZlcnN5bXAuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IHRoZSBvd25lciBvZgotCXRoZSBtYWdpYyBzZWN0aW9ucyB1c2VkIGZvciBTSE5fTUlQU19URVhUIGFuZCBTSE5fTUlQU19EQVRBLgotCURvbid0IHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyIHdoZW4gaW5mby0+c2hhcmVkLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogU2V0IHRoZSBhbGlnbm1lbnQgb2YgLnJ0cHJvYyB0byA0LCBub3QgMTIuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ29ycmVjdCB0eXBlOiBePSBmb3IgJj0uCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlc29sdmUgYW4gaW5kaXJlY3Qgc3ltYm9sIGluCi0Jc3ltX2hhc2hlcy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgY2hhbmdlIFNITl9BQlMgaW50bwotCVNITl9NSVBTX1RFWFQgb3IgU0hOX01JUFNfREFUQS4KLQotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogVHdlYWsgdmVyc2lvbiBvdXRwdXQgc2xpZ2h0bHkuCi0KLVR1ZSBNYXIgMTEgMDE6Mzg6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZWxmLWJmZC5oIChFTEZfTElOS19GT1JDRURfTE9DQUwpOiBEZWZpbmUuCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBDb3JyZWN0IGVycm9ycyBpbiBsYXN0IGNoYW5nZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSGFuZGxlIGNhc2VzIGluIHdoaWNoIGEKLQl2ZXJzaW9uZWQgc3ltYm9sIGFwcGVhcnMgaW4gYm90aCBhIHJlZ3VsYXIgYW5kIGEgc2hhcmVkIG9iamVjdC4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogU2V0IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCB3aGVuCi0JYXBwcm9wcmlhdGUuICBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0JKHN0cnVjdCBlbGZfb3V0ZXh0X2luZm8pOiBSZW5hbWUgZnJvbSBlbGZfZmluZm9fZmFpbGVkLiAgQ2hhbmdlCi0JYWxsIHVzZXMuICBBZGQgbG9jYWxzeW1zIGZpZWxkLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgY2FsbAotCWVsZl9saW5rX291dHB1dF9leHRzeW0gdG8gb3V0cHV0IGFsbCBsb2NhbCBzeW1ib2xzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSGFuZGxlIHN5bWJvbHMgd2hpY2ggd2VyZSBmb3JjZWQgdG8KLQliZWNvbWUgbG9jYWwuCi0KLVN1biBNYXIgIDkgMjM6MDg6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZWxmLWJmZC5oIChlbGZfc3ltYm9sX3R5cGUpOiBBZGQgdmVyc2lvbiBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCB2ZXJzaW9uIGZpZWxkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGNyZWF0aW5nIGFuCi0gCWluZGlyZWN0IHN5bWJvbCBmb3IgYSBkZWZhdWx0IHZlcnNpb24gc3ltYm9sLCBzZXQgREVGX0RZTkFNSUMgaWYKLSAJYXBwcm9wcmlhdGUuICBTZXQgdXAgYW4gaW5kaXJlY3Rpb24gZnJvbSB0aGUgbm9uZGVmYXVsdCB2ZXJzaW9uIG9mCi0JdGhlIHN5bWJvbCBhcyB3ZWxsLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENhbGwKLQllbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24gYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgdGhlcmUgYXJlIGFueQotCXZlcnNpb25zLiAgQWx3YXlzIHJlY29yZCB0aGUgdmVyc2lvbiBuYW1lIGFzIGEgZHluYW1pYyBzeW1ib2wuCi0JSW5pdGlhbGl6ZSBjb3VudGVycy4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogQWZ0ZXIgZmluZGluZyBhIHZlcnNpb24sIHNlZSBpZiBhCi0Jc3ltYm9sIHNob3VsZCBiZSBmb3JjZWQgdG8gbG9jYWwgc2NvcGUuICBDcmVhdGUgYSBuZXcgdmVyc2lvbgotCWRlZmluaXRpb24gaWYgYXBwcm9wcmlhdGUuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBDb3JyZWN0IGluZGlyZWN0IHN5bWJvbCBoYW5kbGluZy4KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24uCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFR1cm4gdmVyc2lvbiBzZWN0aW9ucyBpbnRvIEJGRCBzZWN0aW9ucy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBPbmx5IGNvcHkgY3ZlcmRlZnMgYW5kIGN2ZXJyZWZzIGludG8gc2hfaW5mbwotCWlmIHNoX2luZm8gaXMgbm90IGFscmVhZHkgc2V0LgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ29weSBzaF9pbmZvIGZvciB2ZXJzaW9uCi0Jc2VjdGlvbnMuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogVGVsbAotCV9iZmRfc3RyaW5ndGFiX2FkZCB0byBjb3B5IHRoZSBuYW1lIGludG8gcGVybWFuZW50IG1lbW9yeSBpZgotCWFwcHJvcHJpYXRlLgotCi1GcmkgTWFyICA3IDExOjU1OjMxIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogRnVsbHkgcGFyZW50aGVzaXplLgotCi1GcmkgTWFyICA3IDEwOjM3OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlCi0JX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyB0byByZXR1cm4gYSBib29sZWFuCi0JdmFsdWUuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYm9vbGVhbi4gIElmIHRoZSBzaXplIG9mIHRoZSBsYXN0IHNlY3Rpb24gY2hhbmdlZCwgdGhlbiBvdXRwdXQgYQotCXplcm8gYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IEFsd2F5cyBhbGxvY2F0ZSBzcGFjZQotCWZvciBhdCBsZWFzdCA2IG91dHB1dCBzeW1ib2xzLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogV2hlbiBlbWl0dGluZyBUT0MgZW50cnkgcmVsb2NzLCBhbHNvCi0JZW1pdCBhIFRDIGNzZWN0IHRvIHJlcHJlc2VudCB0aGUgc3BhY2UgdGhleSB0YWtlIHVwLiAgRm9yIGFuIFhPCi0Jc3ltYm9sLCBqdXN0IGVtaXQgYSByZWZlcmVuY2UsIG5vdCBhIGNzZWN0LgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogSnVzdCB1c2UgbG4gLXMsIG5vdCBsbiAtc2YsIHNpbmNlCi0JU29sYXJpcyBkb2Vzbid0IGxpa2UgdGhlIGNvbWJpbmVkIG9wdGlvbnMsIGFuZCB0aGUgLWYgaXMKLQl1bm5lY2Vzc2FyeS4KLQkoc3RhbXAtdHNobGluaywgaW5zdGFsbCk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IFJfTUlQUzE2XzI2Ci0JaGFuZGxpbmcgd2hlbiBsaXR0bGUgZW5kaWFuLgotCi1UaHUgTWFyICA2IDEzOjUxOjUxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAocmVsb2NfdHlwZSk6IFJlbW92ZSBQQ1JFTHs4LDE2LDMyfV97MSwyfUJZVEUKLQlyZWxvY3MuICBSZXBsYWNlIHRoZW0gd2l0aCBnZW5lcmljIFBDUkVMX3s4LDE2LDMyfSByZWxvY3MuCi0JKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQkoZWxmMzJfbW4xMDMwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCi1UaHUgTWFyICA2IDEyOjE5OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHJ0eXBlMmhvd3RvKTogSWYgcGFzc2VkIGEgcmVsb2NhdGlvbiB0eXBlIHdlIGRvbid0Ci0JdW5kZXJzdGFuZCwganVzdCBzZXQgdGhlIGhvd3RvIGZpZWxkIHRvIE5VTEwsIGFuZCB0aGUgY2FsbGVyIHdpbGwKLQlwcmludCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFB1bGwgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyBhbmQKLQljb2RlIGZyYWdtZW50IG91dCBvZiBib3RoIGxlZ3Mgb2YgI2lmZGVmIFJFTE9DX1BST0NFU1NJTkcgLi4uICNlbmRpZgotCWJsb2NrLiAgVXNlIE5VTEwgZm9yIGluaXRpYWxpemF0aW9ucyBvZiAicHRyIiByYXRoZXIgdGhhbiBiYXJlIDAuCi0JKiBjb2ZmLWg4MzAwLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0JKiBjb2ZmLWg4NTAwLmM6IERpdHRvLgotCSogY29mZi13NjUuYzogRGl0dG8KLQkqIGNvZmYtejhrLmM6IERpdHRvLgotCi1XZWQgTWFyICA1IDEzOjU5OjA5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jKTogRml4IG92ZXJmbG93IGNhbGMuCi0JKG0zMnJfZWxmX3JlbGF4X3NlY3Rpb24sIG0zMnJfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcywKLQltMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBGaXJzdCBwYXNzIGF0IHJlbGF4IHN1cHBvcnQuCi0KLU1vbiBNYXIgIDMgMTM6Mjc6MDkgMTk5NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJ0bC5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBjb3JyZWN0IHNoX3NpemUKLQllbnRyeSBmb3IgcmVhZGluZyB2ZXJkZWYgcmVjb3Jkcy4KLQlVc2UgY29ycmVjdCBicmFjZXMgZm9yIGNvbXB1dGluZyBpbmNyZW1lbnRzIG9mIGV4dHZlcmRhdXggYW5kCi0JZXh0ZXZlcmRlZiByZWNvcmQgcG9pbnRlcnMuCi0KLVN1biBNYXIgIDIgMjI6NDc6NTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTogU2V0IHRoaXMgdG8gMgotCWluc3RlYWQgb2YgNC4KLQotU3VuIE1hciAgMiAxNjoyNTozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IENoZWNrIHRoYXQKLQlERUZfUkVHVUxBUiBpcyBub3Qgc2V0IGFzIHdlbGwgYXMgY2hlY2tpbmcgdGhhdCBERUZfRFlOQU1JQyBpcwotCXNldC4KLQotRnJpIEZlYiAyOCAxNjo1Mjo0MCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiBBZGQgY2FzZSBmb3IgVElDODBfQVJDSF9NQUdJQy4KLQotRnJpIEZlYiAyOCAxNTowNjo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX2RlZmF1bHRfdmVjdG9yKTogTWFrZSBub24tY29uc3QuCi0JKGZpbmRfdGFyZ2V0KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWJmZF9maW5kX3RhcmdldC4KLQkoYmZkX3NldF9kZWZhdWx0X3RhcmdldCk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2ZpbmRfdGFyZ2V0KTogQ2FsbCBmaW5kX3RhcmdldC4gIFdoZW4gZGVmYXVsdGluZywgdXNlCi0JYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGlmIGl0IGlzIG5vdCBOVUxMLgotCSogbGliYmZkLWluLmggKGJmZF9kZWZhdWx0X3ZlY3Rvcik6IEFkanVzdCBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogUmV0dXJuIGZhbHNlIGlmIHRoZSBzeW1ib2wgaGFzIG5vCi0JbmFtZS4KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGNvZmYtbTY4ay5jIChtNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFRyZWF0IHN5bWJvbHMgYmVnaW5uaW5nCi0Jd2l0aCAuLiBvciBfLkxfIGFzIGxvY2FsLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBUcmVhdCBzeW1ib2xzCi0JYmVnaW5uaW5nIHdpdGggJCBhcyBsb2NhbC4KLQotVGh1IEZlYiAyNyAxODozNjoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXNlIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0JcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgaW5mby0+bHByZWZpeC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgYXMKLQlfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlY2xhcmUuCi0KLQkqIGNvZmYtbTg4ay5jIChjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCShtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lIGFzCi0JX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKTogQ2hhbmdlIF9iZmRfaXNfbG9jYWxfbGFiZWwKLQl0byBfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUuCi0JKGJmZF90YXJnZXQpOiBMaWtld2lzZS4KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVmaW5lIGFzIGZ1bmN0aW9uLCBub3QgbWFjcm8uCi0JKGJmZF9pc19sb2NhbF9uYW1lKTogRGVmaW5lLgotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBSZW5hbWUgZnJvbQotCWJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsLCBhbmQgdGFrZSBhIHN0cmluZyByYXRoZXIgdGhhbiBhCi0Jc3ltYm9sLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlZmluZS4KLQkoX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0gCShiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIEFsbCBiYWNrZW5kczogQ2hhbmdlIGxvY2FsX2xhYmVsIHRvIGxvY2FsX2xhYmVsX25hbWUuCi0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZ290X2luZm8pOiBBZGQgYXNzaWduZWRfZ290bm8gZmllbGQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCURvbid0IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCB6ZXJvIGVudHJ5IGlzIHVuYXNzaWduZWQ7IGluc3RlYWQsIHVzZQotCWFzc2lnbmVkX2dvdG5vLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JbWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsLgotCShtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBJbml0aWFsaXplIGFzc2lnbmVkX2dvdG5vIGZpZWxkLgotCi1XZWQgRmViIDI2IDE1OjE5OjUxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEFkZCBjb2RlIHRvIGRvIDMyLWJpdAotCXJlbG9jYXRpb25zLgotCi1XZWQgRmViIDI2IDEzOjMzOjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBza2lwIHN5bWJvbHMgZnJvbSBzZWN0aW9ucwotCXRoYXQgaGF2ZSBubyBjb250ZW50cyBtZXJlbHkgYmVjYXVzZSBsaW5rZXJfbWFyayBpcyBub3Qgc2V0LgotCi1UdWUgRmViIDI1IDE4OjUxOjM1IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1sbmV3cyopOiBOZXcgdGFyZ2V0LgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UgYXNzZXJ0IGNvbXBhcmUKLQljb250ZW50IGJ5dGVvcmRlciBpbnN0ZWFkIG9mIGhlYWRlciBieXRlb3JkZXIuCi0JKGVjb2ZmX2JpZ2xpdHRsZV92ZWMpOiBOZXcgQkZELCBiaWctZW5kaWFuIGhlYWRlcnMsIGxpdHRsZS1lbmRpYW4KLQlkYXRhLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBlY29mZl9iaWdsaXR0bGVfdmVjLgotCSogY29uZmlndXJlLmluIChlY29mZl9iaWdsaXR0bGVfdmVjKTogQWRkIGNhc2UuCi0JKiBjb25maWd1cmU6IFVwZGF0ZS4KLQotVHVlIEZlYiAyNSAwMDozMjo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBTSFRfTk9URSBmb3IgYW55IHNlY3Rpb24gd2hvc2UKLQluYW1lIGJlZ2lucyB3aXRoICIubm90ZSIuCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IEFkZCBhIFBUX05PVEUgc2VnbWVudCBmb3IgYW55IGxvYWRhYmxlCi0Jc2VjdGlvbiB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoICIubm90ZSIuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGZvciBtaXNhbGlnbmVkCi0JamFsIGFuZCBmb3IgamFsIG92ZXJmbG93LgotCi1Nb24gRmViIDI0IDE3OjUzOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IElmIGEgZGVmYXVsdCBzeW1ib2wgaXMKLQlub3QgZm91bmQsIHRyeSBsb29raW5nIGl0IHVwIGFnYWluIHdpdGhvdXQgdGhlIHZlcnNpb24gbmFtZS4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQWx3YXlzIGxpbmsgYWdhaW5zdCB0aGUgZHluYW1pYwotCXN5bWJvbCB0YWJsZSBvZiBhIGR5bmFtaWMgb2JqZWN0LiAgV2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljCi0Jb2JqZWN0LCBpbmNsdWRlIHZlcnNpb24gc3RyaW5ncyBpbiBzeW1ib2wgbmFtZXMsIGFuZCBzZXQgdXAKLQl2ZXJzaW9uIGluZm9ybWF0aW9uLiAgQWRkIGluZGlyZWN0IHN5bWJvbHMgZm9yIGRlZmF1bHQgdmVyc2lvbnMuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIHNwZWNpYWwgdmVyc2lvbiBzZWN0aW9ucy4KLQkoc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvKTogRGVmaW5lLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCB2ZXJkZWZzIHBhcmFtZXRlci4gIFNldAotCXVwIHZlcnNpb24gc2VjdGlvbnMuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBzeW12ZXJfc2VjIGZpZWxkLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGZpbmZvLnN5bXZlcl9zZWMuICBEb24ndCBjb3VudAotCWxvY2FsIHN5bWJvbHMgb2YgYSBkeW5hbWljIG9iamVjdC4gIEhhbmRsZSBEVF9WRVIqIGNvbnN0YW50cy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNpbXBsaWZ5IEJGRF9BU1NFUlQgY2hlY2tpbmcgZm9yIGEKLQlkeW5hbWljIG9iamVjdC4gIFNraXAgaW5kaXJlY3Qgc3ltYm9scyBmcm9tIEVMRiBvYmplY3RzLiAgUmVtb3ZlCi0JdGhlIHZlcnNpb24gbmFtZSBiZWZvcmUgY2hvb3NpbmcgYSBoYXNoIGJ1Y2tldC4gIFdyaXRlIG91dCB0aGUKLQl2ZXJzaW9uIGluZm9ybWF0aW9uIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBmb3IgRFlOQU1JQywgbm90IEVUX0RZTi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIHZlcmluZm8gZmllbGQuCi0JQ2hhbmdlIGVsZl9saW5rX2hhc2hfZmxhZ3MgdG8gdW5zaWduZWQgc2hvcnQuCi0JKEVMRl9MSU5LX0hJRERFTik6IERlZmluZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGRzIGR5bnZlcnN5bV9oZHIsIGR5bnZlcnJlZl9oZHIsCi0JZHludmVyZGVmX2hkciwgZHludmVyc3ltX3NlY3Rpb24sIGR5bnZlcmRlZl9zZWN0aW9uLAotCWR5bnZlcnJlZl9zZWN0aW9uLCBjdmVyZGVmcywgY3ZlcnJlZnMsIHZlcmRlZiwgdmVycmVmLgotCShlbGZfZHludmVyc3ltLCBlbGZfZHludmVyZGVmLCBlbGZfZHludmVycmVmKTogRGVmaW5lLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiwgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4sIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzKTogRGVjbGFyZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luLCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZCBEVF9WRVIqIGNvbnN0YW50cy4gIFByaW50Ci0JdmVyc2lvbiBpbmZvcm1hdGlvbiBpZiB0aGVyZSBpcyBhbnkuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB2ZXJpbmZvIGZpZWxkLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX0dOVV92ZXIqIHNlY3Rpb24gdHlwZXMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogSGFuZGxlIC5nbnUudmVyc2lvbiogc2VjdGlvbiBuYW1lcy4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEhhbmRsZSBTSFRfR05VX3Zlciogc2VjdGlvbiB0eXBlcy4KLQkoX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgaW5jbHVkZQotCXZlcnNpb24gbmFtZSBpbiBzdHJpbmcgZW50ZXJlZCBpbiBkeW5hbWljIGhhc2ggdGFibGUuCi0JKiBlbGZjb2RlLmg6IEluY2x1ZGUgZm5tYXRjaC5oLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIGEgZHluYW1pYwotCXN5bWJvbCB3aGljaCB3YXMgZm9yY2VkIHRvIGJlY29tZSBsb2NhbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3ApOiBMaWtld2lzZS4KLQotRnJpIEZlYiAyMSAxNjoxNToxOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFNpbXBsaWZ5Ci0Jc29tZXdoYXQuCi0JKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBDb3JyZWN0bHkgY29tcHV0ZSBhIHN5bWJvbCdzIHZhbHVlCi0Jd2hlbiB0aGUgc3ltYm9sIGlzIGxvY2FsLCBidXQgbm90IGluIHRoZSBzYW1lIHNlY3Rpb24gYXMgd2UgYXJlCi0JcmVsYXhpbmcuICBJbXBsZW1lbnQgYWJzMjQgLT4gYWJzMTYsIGltbTI0IC0+IGltbTE2IGFuZCBkMjQgLT4gZDE2Ci0JcmVsYXhpbmcuCi0KLUZyaSBGZWIgMjEgMTM6NTU6MTQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogUmV3cml0ZSB0byB1c2UgRUxGIGJhY2tlbmQgbGlua2VyLgotCVN0b3JlIGxvd2VyIDE2IGJpdHMgb2YgYWRkZW5kIGluIFJfTTMyUl9ISTE2X1tTVV1MTyBpbnNucy4KLQlBZGQgc21hbGwgZGF0YSBhcmVhIHN1cHBvcnQgKFJfTTMyUl9TREExNikuCi0JKiByZWxvYy5jOiBEb2N1bWVudCBCRkRfUkVMT0NfTTMyUl9TREExNi4KLQkqIGJmZC1pbjIuaCxsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBGZWIgMjAgMjM6NTA6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCShtbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi1UdWUgRmViIDE4IDE3OjIyOjU5IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBlbGYuYywKLQlyZWxvYy5jLCB0YXJnZXRzLmM6IE5ldyB0YXJnZXQsIGVsZi0qLUQzMFYuCi0KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlLCBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogY3B1LWQzMHYuYywgZWxmMzItZDMwdi5jOiBOZXcgZmlsZXMuCi0KLVR1ZSBGZWIgMTggMTU6MzE6NDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBGaXggdHlwbyBpbiBjb21tZW50LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGNvZmYtdGljODAuYyAoUlRZUEUySE9XVE8pOiBSZXBsYWNlIGFib3J0IHdpdGggcmVhbCBmdW5jdGlvbi4KLQkocnR5cGUyaG93dG8pOiBBZGQgZnVuY3Rpb24uCi0JKHRpYzgwX2hvd3RvX3RhYmxlKTogQWRkLgotCi1UdWUgRmViIDE4IDExOjQxOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogc3lzZGVwLmg6IERvbid0IGRlZmluZSBlcnJubyBpbiBNU1ZDIGlmIGVycm9yLmggaXMgaW5jbHVkZWQuCi0KLVR1ZSBGZWIgMTggMTA6MDQ6MTMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlIHN1cmUgcl9zeW1uZHgKLQlpcyBpbml0aWFsaXplZCBiZWZvcmUgaXQgaXMgdXNlZC4KLQotTW9uIEZlYiAxNyAxMToyODo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlKTogRG9uJ3QgY29udmVydCBhIHNlY29uZGFyeSBjb21tb24KLQlzeW1ib2wgaW50byBhIHdlYWsgdW5kZWZpbmVkIHN5bWJvbDsgbGVhdmUgaXQgYXMgYSBjb21tb24gc3ltYm9sLgotCi1GcmkgRmViIDE0IDE5OjA4OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBpc3N1ZSBhIHdhcm5pbmcKLQlhYm91dCBhIHN5bWJvbCBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgaWYgaXQgaGFzIGFscmVhZHkgYmVlbgotCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KLQotVGh1IEZlYiAxMyAyMDo1MzoyMiAxOTk3ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogbWFrZWZpbGUudm1zOiBBZGQgZ2NjIGZsYWdzIHRvIGFsbG93IGNvbXBpbGluZyB3aXRoIGN1cnJlbnQgZ2NjCi0Jc25hcHNob3QKLQkodGFyZ21hdGNoLmgpOiBOZXcgZGVwZW5kZW5jeS4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSKTogTmV3IHJlbG9jYXRpb24gZm9yCi0Jb3BlblZNUy9BbHBoYS4KLQkqIGV2YXguaCAoQUxQSEFfUl9DT0RFQUREUik6IE5ldyByZWxvY2F0aW9uLgotCSogZXZheC1hbHBoYS5jIChBTFBIQV9SX0NPREVBRERSKTogNjQgYml0IHByb2NlZHVyZSByZWxvY2F0aW9uIGZvcgotCW9wZW5WTVMvQWxwaGEuCi0JKiBldmF4LWV0aXIuYyAoQUxQSEFfUl9DT0RFQUREUik6IE91dHB1dCBvYmplY3QgY29kZSBmb3IgdGhpcwotCXJlbG9jYXRpb24uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JUmVzdHJpY3Qgc3ltYm9sIGxlbmd0aCB0byA2NCBieXRlcywgY2FzZSBwcmVzZXJ2aW5nOgotCSogZXZheC1lbWguYyAoX2JmZF9ldmF4X3dyaXRlX2VtaCk6IFJlbW92ZSBjYXNlIGhhY2tpbmcuCi0JKiBldmF4LW1pc2MuYyAoX2JmZF9ldmF4X2Nhc2VfaGFja19zeW1ib2wpOiBSZW1vdmUuCi0JKF9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wpOiBBZGRlZC4KLQkqIGV2YXgtZXRpci5jIChfYmZkX2V2YXhfd3JpdGVfZXRpcik6IENhbGwKLQlfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sIGJlZm9yZSBvdXRwdXQgb2Ygc3ltYm9sLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogTGlrZXdpc2UuCi0JKiBldmF4LmggKGZsYWdfaGFzaF9sb25nX25hbWVzLCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpOiBSZW1vdmUuCi0KLQkqIGV2YXgtZW1oLmM6IE91dHB1dCBmaWxlbmFtZSB0byBvYmplY3QgZmlsZSB3aXRob3V0IHBhdGguCi0KLQkqIGV2YXgtZWdzZC5jOiBOZXcgc2VjdGlvbnMgZm9yIGxvY2FsIGFuZCBnbG9iYWwgY29tbW9ucy4KLQotCSogZXZheC1hbHBoYS5jLCBldmF4LWVtaC5jLCBldmF4LWVnc2QuYywgZXZheC1ldGlyLmMsCi0JZXZheC1taXNjLmMsIGV2YXguaDogUmVtb3ZlIDggYml0IGNoYXJhY3RlcnMgZnJvbSBjb3B5cmlnaHQKLQlub3RpY2VzLiAgUmVwbGFjZSBBWFAgd2l0aCBBbHBoYS4KLQotV2VkIEZlYiAxMiAxODoxMDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogV2UgbmVlZCB0aGUgZHluYW1pYwotCXNlY3Rpb25zIGlmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCi1UdWUgRmViIDExIDE1OjQ1OjQzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpMzg2LXdpbmRvd3MpOiBEb24ndCBzZXQgaG9zdDY0PXRydWUuCi0KLVR1ZSBGZWIgMTEgMTU6Mjc6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHJlbG9jX3R5cGUpOiBBZGQgUl9NSVBTMTZfR1BSRUwuCi0JKGVsZl9taXBzMTZfZ3ByZWxfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzMTZfZ3ByZWxfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwuCi0JKG1pcHNfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgUl9NSVBTMTZfR1BSRUwuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTMTZfR1BSRUwuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQUzE2X0dQUkVMKTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIEZlYiAxMCAyMzoyNTowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChlbGZfbTMycl9ob3d0b190YWJsZSk6IENoYW5nZSBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZQotCWZvciBSX00zMlJfezE2LDMyLDI0LEhJMTZfVUxPLEhJMTZfU0xPLExPMTZ9LgotCi1GcmkgRmViICA3IDEyOjM5OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBJZiB3ZSd2ZSBkaXNjYXJkZWQgYSBzZWN0aW9uLAotCXRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uOyBkb24ndCBwcmludCBhbgotCWFzc2VydGlvbiBtZXNzYWdlIGZvciB0aGF0IGNhc2Ugd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi1UaHUgRmViICA2IDE2OjU1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChGTl9TVFVCLCBDQUxMX1NUVUIsIENBTExfRlBfU1RVQik6IERlZmluZS4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGRzIGZuX3N0dWIsCi0JbmVlZF9mbl9zdWIsIGNhbGxfc3R1YiwgYW5kIGNhbGxfZnBfc3R1Yi4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBmaWVsZCBtaXBzMTZfc3R1YnNfc2Vlbi4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlZGlyZWN0IHJlbG9jYXRpb25zIHRvIHVzZSBtaXBzMTYKLQlzdHVicyB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBBdHRhY2ggc3R1YiBzZWN0aW9ucyB0byB0aGUgYXBwcm9wcmlhdGUKLQlzeW1ib2wuICBTZXQgbmVlZF9mbl9zdHViIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxvY2FsX3N0dWJzIGZpZWxkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERpc2NhcmQgbG9jYWwgc3ltYm9scyB0aGF0IGFyZQotCWF0dGFjaGVkIHRvIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuCi0KLVdlZCBGZWIgIDUgMTM6MjA6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZQotCXN5bWJvbCB2YWx1ZSB3aGVuIGNvbXB1dGluZyB0aGUgYWRkZW5kIGZvciBhIHBjX3JlbGF0aXZlCi0JcGNyZWxfb2Zmc2V0IHJlbG9jLgotCi1Nb24gRmViICAzIDExOjU0OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElmIGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluaywganVzdCBza2lwIHBjX3JlbGF0aXZlIHBjcmVsX29mZnNldCByZWxvY3MuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9ydHlwZV90b19ob3d0byk6IFJldHVybiBhIGRpZmZlcmVudCBob3d0bwotCXN0cnVjdHVyZSBmb3IgYW4gQVJNMjYgcmVsb2Mgd2hpY2ggY2FuIGJlIHJlc29sdmVkLgotCShjb2ZmX2FybV9hZGp1c3Rfc3ltbmR4KTogT25seSBjb252ZXJ0IEFSTTI2IHRvIEFSTTI2RCBpZiB0aGUKLQlyZWxvYyBjYW4gYmUgcmVzb2x2ZWQuCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IENvcnJlY3Qgb2ZmIGJ5IG9uZQotCWVycm9yIGluIG92ZXJmbG93IGNoZWNrIGZvciBSX1JFTEJZVEUuCi0KLUZyaSBKYW4gMzEgMTQ6MDc6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogUGljayB1cCB0aGUgc3RhcnQgYWRkcmVzcy4KLQlGcm9tIE1hcmsgUmFzaW4gPG1hcmsucmFzaW5AdGVscmFkLmNvLmlsPi4KLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBEb24ndCBhcHBseSBkaXNjYXJkX2wgdG8KLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQotV2VkIEphbiAyOSAwMDowMDo0OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAocmVsb2NfdHlwZSk6IEFkZCAxNmJpdCBwYy1yZWxhdGl2ZSByZWxvYy4KLQkoZWxmX21uMTAyMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQkobW4xMDIwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQotTW9uIEphbiAyNyAxMjowNzozNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIHJlbG9jcyBCRkRfUkVMT0NfTTMyUl97SEkxNl9bVVNdTE8sTE8xNn0uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW0zMnIuYzogQWRkIHN1cHBvcnQgZm9yIHRoZW0uCi0KLU1vbiBKYW4gMjcgMTI6MjU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LWFybS5jIChNWV9zd2FwX3N0ZF9yZWxvY19pbik6IFJlbW92ZSB1bnVzZWQgcl9sZW5ndGguCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgdW51c2VkIHBsdC4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFJlbW92ZSB1c2VkCi0Jcl9mb3JtYXQgYW5kIHJfcGNyZWwuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKiByaXNjaXguYyAoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IERlZmluZSB0byBkdW1teSB2YWx1ZS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXaGVuIGNoZWNraW5nIGZvcgotCXJlbG9jYXRpb25zIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudCwgbG9vayB1cCB0aGUgb3V0cHV0IG5hbWUgb2YKLQl0aGUgcmVsb2Mgc2VjdGlvbi4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1XZWQgSmFuIDIyIDE1OjQwOjI4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwY29mZl92ZWMpOiBVc2UgY29ycmVjdCBkYXRhIHB1dC9nZXQKLQlyb3V0aW5lcyBmb3IgbGl0dGxlIGVuZGlhbiBkYXRhLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgbWFnaWMgdG8KLSAJVElDODBfQVJDSF9NQUdJQyBmb3IgVEljODAuCi0KLVR1ZSBKYW4gMjEgMTI6MzI6NDMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBjb2ZmX3ZlYyk6IENoYW5nZSB0byBsaXR0bGUgZW5kaWFuIGRhdGEKLQlhcyB0aGUgZGVmYXVsdC4KLQotVGh1IEphbiAxNiAxNzo0NTo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDaGFuZ2UgdHlwZSBvZgotCWF1eGlsaWFyeV9maWx0ZXJzIHBhcmFtZXRlciB0byBiZSBjb25zdCBjaGFyICogY29uc3QgKi4gIEFjY2VwdCBhCi0JTlVMTCB0ZXJtaW5hdGVkIGFycmF5LgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMTUgMTE6MjE6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBUcmVhdCBhCi0JTk9UWVBFIHN5bWJvbCBpbiBhIHRleHQgc2VjdGlvbiBhcyBhIEZVTkMgc3ltYm9sLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvcmNlCi0JcmVsb2NiYXNlIHRvIGJlIGFsaWduZWQgdG8gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLgotCi1UdWUgSmFuIDE0IDA4OjQ2OjMzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAobWFjaGluZV90eXBlKTogUmVzZXJ2ZSBzZXZlcmFsIHZhbHVlcyBmb3Igc3BhcmNsZXQuCi0KLU1vbiBKYW4gMTMgMjI6Mzk6MDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh0aWM4MC0qLSopOiBEb24ndCByZXF1aXJlICdjb2ZmJy4KLQotTW9uIEphbiAxMyAxOTozNjoyNSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfaG93dG9fdGFibGUpOiBTZXQgdGhlIHNwZWNpYWxfZnVuY3Rpb24KLQl0YWJsZSB0byB2ODUwX2VsZl9yZWxvYyBmb3IgYWxsIG5vbi1zdGFuZGFyZCByZWxvY2F0aW9ucy4KLQkodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogQWRkIGNoZWNrIGZvciBoIGJlaW5nIG5vbi1udWxsLgotCSh2ODUwX2VsZl9yZWxvYyk6IEFkZCAgUl9WODUwX1pEQV9PRkZTRVQgc3VwcG9ydC4gIFVzZSBzd2l0Y2gKLQlzdGF0ZW1lbnQgaW5zdGVhZCBvZiBtdWx0aXBsZSBpZnMuCi0JKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdXAgZXJyb3IgbWVzc2FnZSwgZG9uJ3QganVzdCBjYWxsCi0JYWJvcnQuCi0KLU1vbiBKYW4gIDYgMTM6Mjg6MzUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVsZl9tbjEwMjAwX2hvd3RvKTogRG9uJ3QgZXZlciBzZXQgcGFydGlhbC1pbnBsYWNlLgotCVVzZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgYXMgc3BlY2lhbCBmdW5jdGlvbiBmb3IgYWxsIHJlbG9jcy4KLQkoYmZkX2VsZjMyX21uMTAyMDBfcmVsb2MpOiBSZW1vdmUgdW5uZWNlc3NhcnkgZnVuY3Rpb24uCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZWxmX21uMTAyMDBfaG93dG8pOiBTZXQgcGNyZWxfb2Zmc2V0IGZvcgotCTI0Yml0IHBjLXJlbGF0aXZlIHJlbG9jLgotCi1GcmkgSmFuICAzIDE2OjMzOjAwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogQWRkIGNvZmZjb2RlLmggdG8gZGVwZW5kZW5jeSBsaXN0LgotCSogY29mZi10aWM4MC5jICh0aWM4MGNvZmZfdmVjKTogRGF0YSBieXRlIG9yZGVyIGlzIGJpZyBlbmRpYW4gYW5kCi0JaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbi4gIFVzZSBjb3JyZWN0IGJmZF9nZXQgYW5kCi0JYmZkX3B1dCByb3V0aW5lcyBmb3IgbGl0dGxlIGVuZGlhbiBoZWFkZXJzLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBTZXQgYXJjaCB0bwotCWJmZF9hcmNoX3RpYzgwIGZvciBUSUM4MF9BUkNIX01BR0lDIG51bWJlci4KLQotRnJpIEphbiAgMyAxNjo1NDowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmM6IEFkZCBCRkRfUkVMT0NfMjQuCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCAyNGJpdCBhbmQgcGNyZWwgcmVsb2NzLgotCShlbGZfbW4xMDIwMF9ob3d0bywgbW4xMDIwMF9yZWxvY19tYXApOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1GcmkgSmFuICAzIDE2OjU4OjMxIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JZWxmNjQtYWxwaGEgbXVsdGlwbGUgLmdvdCByZXdyaXRlOgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGFsd2F5c19zaXplX3NlY3Rpb25zIGVudHJ5LgotCShiZmRfZWxmKl9ta29iamVjdCk6IERvbid0IGRlZmluZSBoZXJlIC4uLgotCSogZWxmeHgtdGFyZ2V0Lmg6IC4uLiBidXQgcmF0aGVyIGhlcmUuICBEZWZhdWx0IGFsd2F5c19zaXplX3NlY3Rpb25zCi0JaG9vayB0byBOVUxMLgotCSogZWxmLmMgKGVsZl9ta29iamVjdCk6IFJlbmFtZSB0byBiZmRfZWxmX21rb2JqZWN0LCBzaW5jZSB0aGF0IHdhcwotCXdoYXQgdGhlICNkZWZpbmVzIGluIGVsZi1iZmQuaCB0cmFuc211dGVkIGl0IHRvIGFueXdheS4KLQotCSogc2VjdGlvbi5jOiBBZGQgU0VDX0xJTktFUl9DUkVBVEVEIGZsYWcuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgdG8KLQlyZWxvY2F0aW9uIHNlY3Rpb24gZmxhZ3MuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBTRUNfTElOS0VSX0NSRUFURUQgaW5zdGVhZCBvZgotCVNFQ19JTl9NRU1PUlkgdG8gcmVjb2duaXplIGdlbmVyYXRlZCBiaXRzLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MsIGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6Ci0JTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmssIG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotCW1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uLCBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24sCi0JbWlwc19lbGZfY2hlY2tfcmVsb2NzLCBtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiwKLQlwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzLAotCWVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBBZGQgU0VDX0xJTktFUl9DUkVBVEVEIHRvCi0Jc2VjdGlvbiBmbGFncy4KLQkoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCB0aGUgYWx3YXlzX3NpemVfc2VjdGlvbnMgaG9vay4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogVXNlIFNFQ19MSU5LRVJfQ1JFQVRFRCBpbnN0ZWFkIG9mIFNFQ19JTl9NRU1PUlkKLQl0byBpZGVudGlmeSBnZW5lcmF0ZWQgYml0cy4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0KLQkqIGVsZjY0LWFscGhhLmM6IFJld3JpdGUgZXZlcnl0aGluZyB0b3VjaGluZyByZWxvY2F0aW9ucy4KLQotRnJpIEphbiAgMyAxMTo0Mjo1MyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAoYWxsIGZ1bmN0aW9ucyBhbmQgc3RhdGljIHZhcmlhYmxlcyk6IEdvIHRocm91Z2gKLQlhbmQgcmVndWxhcml6ZSBuYW1lcyB0byBiZSBvZiB0aGUgZm9ybSB2ODUwX2VsZl88eHh4Pi4KLQkodG9wbGV2ZWwpOiBJbmNsdWRlIDxlbGYvdjg1MC5oPi4KLQkoZW51bSByZWxvY190eXBlKTogTW92ZSB0byBpbmNsdWRlL2VsZi92ODUwLmguCi0JKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6IEZvciBjb21tb24gdmFyaWFibGVzLCBpZiB0aGUgdmFyaWFibGUgaXMKLQlyZWZlcmVuY2VkIGJ5IGEgUl9WODUwX3tTREEsWkRBLFREQX0gcmVsb2NhdGlvbiwgcHV0IHRoZSB2YXJpYWJsZQotCWludG8gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZS4KLQotVHVlIERlYyAzMSAxNToxNToyOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBGaXggc29tZSBzcGFjaW5nLgotCi1UdWUgRGVjIDMxIDE0OjQ0OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAobWlwcyplbC0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0JKG1pcHMqLSotbGludXgqKTogTmV3IHRhcmdldC4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDbGVhbiB1cC4KLQlSZXR1cm4gYSB1c2VmdWwgdmFsdWUuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCwgbm90Ci0JYWNfY3ZfZnVuY19tbWFwLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIGluc3RlYWQgb2YKLQlhY19jdl9mdW5jX21tYXAgaW4gYmZkL2NvbmZpZ3VyZS5ob3N0LgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkCi0JZmlsdGVyX3NobGliIGFuZCBhdXhpbGlhcnlfZmlsdGVyX3NobGliIHBhcmFtZXRlcnMuCi0JKiBlbGYuYyAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEhhbmRsZSBEVF9BVVhJTElBUlkgYW5kCi0JRFRfRklMVEVSLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIERlYyAzMCAxODo0ODo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBXaGVuIGV4cG9ydGluZyBhbGwgZGVmaW5lZAotCXN5bWJvbHMsIGRvbid0IGV4cG9ydCBhIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGJ5IGFuIG9iamVjdCBpbiBhbgotCWFyY2hpdmUgd2hpY2ggY29udGFpbnMgc2hhcmVkIG9iamVjdHMuCi0KLU1vbiBEZWMgMzAgMTY6MTI6NTggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBiZmRfYXJjaF90aWM4MAotCWZvciBUSSBUTVMzMjBjODAgKE1WUCkuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF90aWM4MF9hcmNoLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlIGJ5IHJ1bm5pbmcgIm1ha2UgaGVhZGVycyIuCi0KLVN1biBEZWMgMjkgMTY6MTg6NTIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNwdS10aWM4MC5jIChiZmRfdGljODBfYXJjaCk6IEFkZCBzdHJ1Y3QuCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHZlYyk6IENvcnJlY3QgdHlwbywgInRiIiBub3QgInRwIi4KLQlBbHNvIGFkZCBjb2ZmbGluay5vIGZvciB0aWM4MGNvZmZfdmVjLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0KLU1vbiBEZWMgMzAgMTE6NTQ6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYzogUGF0Y2ggdXAgdGhlIG1tYXAgY29kZSBzbyB0aGF0IGl0IGlzIG9ubHkgYnVpbHQgaWYgQkZECi0JaXMgY29uZmlndXJlZCB3aXRoIC0td2l0aC1tbWFwLgotCi1TdW4gRGVjIDI5IDEwOjQ4OjU3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi10aWM4MC5vCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtdGljODAubwotCShjcHUtdGljODAubywgY29mZi10aWM4MC5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvZmYtdGljODAuYzogQWRkIHNrZWxldG9uLCBjbG9uZWQgZnJvbSBhbm90aGVyIGNvZmYgY29uZmlnLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgbWFnaWMgdG8gVElDODBNQUdJQwotIAlmb3IgVEljODAuCi0KLUZyaSBEZWMgMjcgMjA6NTY6NDEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIFRPRE86IENvcnJlY3QgYSBtaXNzcGVsbGluZy4KLQkqIGNvZmYtdGljODAuYzogTmV3IGZpbGUgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKS4KLQkqIGNwdS10aWM4MC5jOiBOZXcgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVlApLgotCSogY29uZmlndXJlLmluIChjYXNlICR2ZWMpOiBBZGQgdGljODBjb2ZmX3ZlYyBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCSogYXJjaHVyZXMuYyAoYmZkX3RpYzgwX2FyY2gpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfdGljODAuCi0JKiBjb25maWcuYmZkIChjYXNlICR7dGFyZ30pOiBBZGQgdGljODAqLSotY29mZiogdGFyZ2V0LgotCSogdGFyZ2V0cy5jICh0aWM4MGNvZmZfdmVjKTogQWRkIGRlY2wgYXMgZXh0ZXJuIGJmZF90YXJnZXQuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHRpYzgwY29mZl92ZWMgZW50cnkuCi0KLUZyaSBEZWMgMjcgMTE6NDg6MTIgMTk5NiAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2J1Y2tldHMpOiBBZGQgc29tZSBtb3JlIHZhbHVlcyBmb3IgbGFyZ2VyCi0JYmluYXJpZXMuCi0KLVRodSBEZWMgMjYgMTg6MzY6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE1vdmUgc3ViZGlyX2RvIG91dCBvZiBjb25kaXRpb25hbC4gRnJvbQotCUZyZWQgRmlzaCA8Zm5mQGN5Z251cy5jb20+LgotCi1XZWQgRGVjIDE4IDEwOjA0OjMwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChlbnVtIHJlbG9jX3R5cGUpOiBFbmFibGUgYmFzaWMgOCwgMTYsIGFuZAotCTMyIGJpdCByZWxvY3MuCi0JKGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMTcgMTE6MDk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IEFkZCAxIHRvIHRoZSB2YWx1ZSBvZiBhCi0JbWlwczE2IHN5bWJvbCBkdXJpbmcgdGhlIGxpbmsuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFN1YnRyYWN0IDEgZnJvbSB0aGUgdmFsdWUgb2YgYQotCW1pcHMxNiBzeW1ib2wuCi0JKG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBEZWZpbmUuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IFByaW50IHRoZSBzdF9vdGhlciBmaWVsZCBpZiBpdCBpcwotCW5vdCB6ZXJvLgotCi1Nb24gRGVjIDE2IDE0OjM4OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IGNoZWNrIGZvciByZWxvYyBzZWN0aW9ucwotCWFnYWluc3QgU0VDX0RFQlVHR0lORyBzZWN0aW9ucyBoZXJlIChyZXZlcnQgcGF0Y2ggb2YgRGVjZW1iZXIgNSkuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IENoZWNrIGZvciB0aGVtIGhlcmUsIGluc3RlYWQuCi0KLVN1biBEZWMgMTUgMTQ6NDY6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IEFkZCBkeW5hbWljIHBhcmFtZXRlci4KLQkqIGVsZi5jIChfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBQYXNzIG5ldyBhcmd1bWVudCB0bwotCXNsdXJwX3JlbG9jX3RhYmxlLgotCShfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogVXBkYXRlIGRlY2xhcmF0aW9uIG9mCi0Jc2x1cnBfcmVsb2NfdGFibGUuCi0JKF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFVzZSBuZXcgZHluYW1pYyByZWxvYyByb3V0aW5lcyBieSBkZWZhdWx0LgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlKTogQWRkIGR5bmFtaWMKLQlwYXJhbWV0ZXIuCi0KLUZyaSBEZWMgMTMgMTM6MTg6NDkgMTk5NiAgRGFuIFdpbGRlciAgPGRhbkBnYXNib3kuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IFVzZSBNQzY4S0JDU01BR0lDIGZvciBiZmRfYXJjaF9tNjhrCi0JaWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFIGlzIGRlZmluZWQuCi0KLUZyaSBEZWMgMTMgMTE6MTM6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChlbnVtIG1hY2hpbmVfdHlwZSk6IENoYW5nZSBNX1NQQVJDTEVUIGZyb20gMTQyIHRvIDEzMS4KLQotVGh1IERlYyAxMiAxNTowNzoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IE1vdmUgUl9QUENfUExUUkVMMjQgaW50byB0aGUKLQlzdXBwb3J0ZWQgcmVsb2NzLgotCi1UaHUgRGVjIDEyIDE0OjU1OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IGFkZCBhIHdlYWsKLQlzeW1ib2wgaWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JQWZ0ZXIgZmluZGluZyB0aGUgcmVhbCBkZWZpbml0aW9uLCB0aGVuLCBpZiBpdCBpcyBkeW5hbWljLCBhZGQgdGhlCi0Jd2VhayBzeW1ib2wgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCi0JKiBjb2ZmLWF1eC5jIChjb2ZmX202OGtfYXV4X2xpbmtfYWRkX29uZV9zeW1ib2wpOiBNYWtlIHN0YXRpYy4KLQotCSogcHBjYm9vdC5jIChwcGNib290X3NldF9hcmNoX21hY2gpOiBEb24ndCBkZWZpbmU7IGl0J3MgYQotCWZ1bmN0aW9uLgotCShwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBhbgotCWFycmF5LgotCi1UdWUgRGVjIDEwIDIzOjIzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChyZWxvY190eXBlKTogUmVtb3ZlIGJpZyBlbmRpYW4gbW4xMDMwMCByZWxvYwotCXZhcmlhbnRzLgotCShlbGYzMl9tbjEwMzAwX2hvd3RvX3RhYmxlLCBtbjEwMzAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IFdyaXRlIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCi0JKiByZWxvYy5jOiBSZW1vdmUgbW4xMDMwMCBiaWcgZW5kaWFuIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLW1uMTAyMDAuYzogVXBkYXRlIGZyb20gZWxmMzItbW4xMDMwMC5jLgotCi1GcmkgRGVjICA2IDE1OjE4OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcik6IERlZmluZS4KLQotCSogZWxmMzItbW4xMDMwMC5jOiBBZGQgc29tZSBjb21tZW50cy4KLQotRnJpIERlYyAgNiAxNzoxNjo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWx3YXlzIGluaXRpYWxpemUgYnVmIGJlZm9yZSBqdW1waW5nIHRvCi0JZXJyb3JfcmV0dXJuLgotCShpaGV4X3JlYWRfc2VjdGlvbik6IExpa2V3aXNlLgotCi1UaHUgRGVjICA1IDIyOjI5OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChlbGZfbW4xMDMwMF9ob3d0b190YWJsZSk6IERvbid0IHNldCBwYXJ0aWFsLQotCWlucGxhY2UgZm9yIG1vc3QgcmVsb2NzLgotCi1UaHUgRGVjICA1IDEzOjI0OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsaW5nIGNoZWNrX3JlbG9jcwotCWV2ZW4gaWYgU0VDX0FMTE9DIGlzIG5vdCBzZXQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IGNoZWNrIFNFQ19BTExPQwotCXdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBjb3B5IGEgcmVsb2MgaW50byBhIHNoYXJlZCBvYmplY3QuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IHNldCBTRUNfQUxMT0MgaW4gYQotCXJlbG9jIHNlY3Rpb24gaWYgaXQgaXMgbm90IHNldCBpbiB0aGUgc291cmNlIHNlY3Rpb24uCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYXJrIGEgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkCi0Jd2l0aCBhIFNFQ19ERUJVR0dJTkcgc2VjdGlvbiBhcyBTRUNfREVCVUdHSU5HLgotCi1XZWQgRGVjICA0IDE0OjE4OjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogI2lmIDAgY29kZSB0aGF0Ci0JZXhwZWN0cyBhIC5nb3QucGx0IHVudGlsIHdlIGFjdHVhbGx5IGNyZWF0ZSBpdC4KLQotTW9uIERlYyAgMiAxMjoxMzo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBQcmludCBhbiBlcnJvcgotCW1lc3NhZ2UgZm9yIGJmZF9yZWxvY19vdXRvZnJhbmdlLCByYXRoZXIgdGhhbiBhYm9ydGluZy4gIEZyb20KLQlQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzIGluCi0JYSByZWxvY2F0ZWFibGUgbGluaywgZG9uJ3QgdHJ5IHRvIHByb2Nlc3MgdGhlbS4gIEZyb20gSGVpbnogV3JvYmVsCi0JPHdyb2JlbEBscHIuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4KLQotTW9uIERlYyAgMiAwMDozOToyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAobW4xMDMwMF9pbmZvX2hvd3RvKTogUmVuYW1lZCBmcm9tCi0JbW4xMDMwMF9pbmZvX2hvd3RvX3JlbC4gIFR3ZWFrIHJlbG9jIGFyZ3VtZW50IHRvIGJlIGFuCi0JRWxmMzJfSW50ZXJuYWxfUmVsYS4KLQkoVVNFX1JFTEEpOiBEZWZpbmUgaW5zdGVhZCBvZiBVU0VfUkVMLgotCShlbGZfaW5mb190b19ob3d0bywgZWxmX2luZm9faG93dG9fcmVsKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1TdW4gRGVjICAxIDAwOjE4OjU5IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6ICBIYW5kbGUgbWlwcyotc2dpLWlyaXg2Ki4KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfY29yZV9maWxlX3ApOiAgQWNjZXB0IENPUkVfTUFHSUNOMzIKLQljb3JlIGZpbGVzLgotCi1XZWQgTm92IDI3IDEyOjEwOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogV2FybiBhYm91dCBhCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gYSBzZWN0aW9uIHdpdGggbm8gb3V0cHV0Ci0Jc2VjdGlvbi4KLQotVHVlIE5vdiAyNiAxMTowNzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBEb24ndCByZXF1aXJlIEFDX0NfQ1JPU1MuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgb3RoZXIgZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG90aGVyIGZpZWxkLgotCShzd2FwX291dF9zeW1zKTogU2V0IHN0X290aGVyIGZyb20gZXhpc3Rpbmcgc3Rfb3RoZXIgZmllbGQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFN0b3JlIHN0X290aGVyIGluIGhhc2gKLQl0YWJsZSBvdGhlciBmaWVsZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNldCB0aGUgb3RoZXIgZmllbGQgZnJvbSB0aGUgZ2xvYmFsIGhhc2gKLQl0YWJsZSBlbnRyeS4KLQkqIGVsZjMyLW1pcHMuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfTUlQUzE2XzI2LgotCShlbGZfbWlwczE2X2p1bXBfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzMTZfanVtcF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX01JUFMxNl9KTVAuCi0JKG1pcHNfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgUl9NSVBTMTZfMjYuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTMTZfMjYuICBIYW5kbGUgUl9NSVBTXzI2Ci0JdG8gYSBtaXBzMTYgc3ltYm9sLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFMxNl9KTVApOiBBZGQgdG8gbGlzdCBvZiByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBtaXBzOjE2IGVudHJ5LgotCi1Nb24gTm92IDI1IDExOjIzOjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBsb25nIGxvbmcgZm9yIG1pcHMtc2dpLWlyaXg2Ki4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBNYWtlIGxpbmUgbnVtYmVyIG92ZXJmbG93Ci0Jb25seSBhIHdhcm5pbmcuICBGcm9tIFBoaWxpcHBlIERlIE11eXRlciA8cGhkZW11eXRAdWxiLmFjLmJlPi4KLQotTW9uIE5vdiAyNSAwODo1MjoyOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBtb3JlIHJlbG9jIHR5cGVzLgotCShlbGYzMl9tbjEwMzAwX2hvd3RvX3RhYmxlKTogVXBkYXRlIGZvciBuZXcgcmVsb2MgdHlwZXMuCi0JKGVsZjMyX21uMTAzMDBfcmVsb2NfbWFwKTogVXBkYXRlIGZvciBuZXcgcmVsb2MgdHlwZXMuCi0JKiByZWxvYy5jOiBBZGQgc29tZSBuZXcgcmVsb2NzIGZvciB0aGUgbW4xMDMwMCBzZXJpZXMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1TYXQgTm92IDIzIDEzOjI2OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgbG9zZSBmb3IgYSBzcGFjZSB3aGljaCBoYXMKLQlubyBkYXRhLCBidXQgc29tZSBzeW1ib2xzLgotCi1GcmkgTm92IDIyIDExOjMyOjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBnb3RfbmVlZGVkIGZpZWxkLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBnb3RfbmVlZGVkLgotCShzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc2V0IC5nb3Qgc2VjdGlvbiBzaXplIGlmIGl0Ci0JaXMgbm90IGFscmVhZHkgc2V0LiAgU2V0IGdvdF9uZWVkZWQuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDaGVjayBnb3RfbmVlZGVkLiAgT25seSBzZXQKLQlzZHlucHRyLCBhbmQgb25seSBoYW5kbGUgZHluYW1pYyBzZWN0aW9ucywgaWYgZHluYW1pYyBzZWN0aW9ucyBhcmUKLQluZWVkZWQuCi0JKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IFBhc3MgZmFsc2UgdG8gY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JSW5pdGlhbGl6ZSAuZ290IHNlY3Rpb24uCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IExpa2V3aXNlLgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IFNldCB1cCBQTFQgZW50cnkgZXZlbiBpZiB0aGlzIGlzIG5vdAotCWEgZHluYW1pYyBzeW1ib2wuCi0JKHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmspOiBDaGVjayBnb3RfbmVlZGVkLiAgT25seSBzZXQgdXAKLQlkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gaWYgbmVlZGVkLgotCi1UaHUgTm92IDIxIDEwOjMxOjMxIDE5OTYgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogQWRkZWQgVmVyc2FET1MgZm9ybWF0IHRvIHRoZSBFcmljc3NvbiBjb25maWd1cmF0aW9uLgotCi1XZWQgTm92IDIwIDE2OjMxOjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jOiBSb3VnaCBjdXQgYXQgcmVsb2NzIGZvciB0aGUgbW4xMDMwMC4KLQotV2VkIE5vdiAxMyAwODoxMjozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbGYzMi1kMTB2Lm8pOiBEb24ndCBkZXBlbmQgb24gZWxmL2QxMHYuaAotCWFueW1vcmUuCi0KLVR1ZSBOb3YgMTIgMTM6MzA6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBmaWxlbW9kZS5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCSogaWhleC5jOiBBZGQgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3Vub3MuYzogQWRkIGNhc3RzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQotTW9uIE5vdiAxMSAxMDozNzowMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSAuZ290LnBsdAotCXNlY3Rpb24uCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX0xPQ0FMMjRQQy4gIE1ha2UKLQlhcHByb3ByaWF0ZSByZWxvY2F0aW9ucyBpbiB0aGUgLnNvIGZpbGUgaWYgc2hhcmVkLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVHVlIE9jdCAyOSAxNTowMzowMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMjQpOiBVc2UKLQljb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZC4KLQotVHVlIE9jdCAyOSAxMjo1Mzo0NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IERvbid0IGNvbXBsYWluIG9uCi0Jb3ZlcmZsb3dzIGZvciBSX0QxMFZfMTYgYW5kIFJfRDEwVl8xOC4KLQotVHVlIE9jdCAyOSAxMzoyMzo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQpOiBVc2UgTE1BIHJhdGhlciB0aGFuIFZNQS4KLQkoZG9fd2l0aF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoZG9fYXNfcmVwZWF0KTogTGlrZXdpc2UuCi0JKGNvcHlfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCi1GcmkgT2N0IDI1IDE2OjU2OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQpOiBDb3JyZWN0bHkgcmVjb3JkIHdoZXRoZXIKLQl0aGVyZSBpcyBhbiBleHRlcm5hbCBwYXJ0LgotCi1UaHUgT2N0IDI0IDE0OjMyOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogQ29ycmVjdGx5Ci0JaGFuZGxlIHRkYSBvZmZzZXRzIGZvciBzbGQudyBhbmQgc3N0LncgaW5zdHJ1Y3Rpb25zLgotCUZpeCBhbGlnbm1lbnQgY2hlY2sgaW4gc2xkLncgYW5kIHNzdC53IHRkYSByZWxvYyBoYW5kbGluZy4KLQotVGh1IE9jdCAyNCAwOTowODo0NyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6ICBTZXQgVVNFX0JJTkFSWV9GT1BFTiBmb3IgKi0qLXdpbmRvd3MuCi0KLVdlZCBPY3QgMjMgMDA6NTM6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmM6IEFkZCBjb21tZW50cyBhYm91dCBhc3N1bXB0aW9ucyBhYm91dAotCWNoYXIsIHNob3J0ICYgbG9uZyBzaXplcy4KLQkoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBzaWduIGV4dGVuc2lvbgotCXByb2JsZW1zIGZvciBzZXZlcmFsIHJlbG9jcy4KLQotCSogZWxmMzItdjg1MC5jIChlbGYzMl92ODUwX2hvd3RvX3RhYmxlKTogRml4IHR5cG8gaW4KLQlSX1Y4NTBfU0RBX09GRlNFVCBlbnRyeS4KLQotV2VkIE9jdCAyMyAwMDoyMDozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IERvbid0IGFsbG9jYXRlIGxkc3ltLgotCVN0b3JlIGltcG9ydCBmaWxlIGluZGV4IGluIGxkaW5keC4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogQXNzdW1lIHRoYXQgbGRzeW0gd2FzIG5vdCBwcmV2aW91c2x5Ci0JYWxsb2NhdGVkLiAgRm9yIGFuIGltcG9ydGVkIHN5bWJvbCwgY29weSBsZGluZHggaW50byBsX2lmaWxlLgotCi1UdWUgT2N0IDIyIDE5OjIwOjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbGZfdjg1MF9ob3d0b190YWJsZSk6IEZpeCBvcmRlcmluZyBvZgotCVJfVjg1MF9aREFfT0ZGU0VUIGFuZCBSX1Y4NTBfVERBX09GRlNFVC4gIEZpeCB2YXJpb3VzCi0JZmllbGRzIGluIFJfVjg1MF9UREFfT0ZGU0VULgotCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogVHdlYWsgcGMtcmVsYXRpdmUKLQlyZWxvY3MgdG8gd29yayBtb3JlIGxpa2Ugb3RoZXIgcmVsb2NzLiAgSGFuZGxlIFJfVjg1MF9UREFfT0ZGU0VUCi0JcmVsb2NhdGlvbnMuCi0KLQkqIGVsZjMyLXY4NTAuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogUmV0dXJuIGFuIGVycm9yIGlmIHdlIGdldCBhIHJlbG9jCi0Jd2UgY2FuJ3QgaGFuZGxlLgotCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCSh2ODUwX2VsZl9yZWxvY2F0aW9uX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotVHVlIE9jdCAyMiAxNzoyMjo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZ25vcmUgc2VjdGlvbnMgd2hpY2gKLQlkb24ndCBoYXZlIFNFQ19MT0FEIGFuZCBTRUNfQUxMT0Mgc2V0LgotCi1Nb24gT2N0IDIxIDEyOjEzOjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogQXZvaWQgbG9zaW5nIHN0YXRpYwotCXN5bWJvbHMgaW4gdGhlIC5ic3Mgc2VjdGlvbi4KLQotTW9uIE9jdCAyMSAxMDo1NDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBEZXNjcmliZSBSX01JUFNfNjQuCi0JKG1pcHMzMl82NGJpdF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfcmVsb2NfbWFwKTogQWRkIGVudHJ5IGZvciBCRkRfUkVMT0NfNjQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTXzY0LgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZQotCXdoZW4gYXR0ZW1wdGluZyB0byBkbyBhIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggZGlmZmVyZW50IG9iamVjdAotCWZpbGUgZm9ybWF0cywgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KLQotVGh1IE9jdCAxNyAxMDo0MzoyOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChtMzJyIHJlbG9jcyk6IFJlbmFtZSB0aGVtLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1tMzJyLmM6IFVwZGF0ZS4KLQkobTMycl9lbGZfMTBfcGNyZWxfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMTBfUENSRUwgZW50cnkpOiBVc2UgaXQuCi0JKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMjQgZW50cnkpOiBGaXgge3NyYyxkc3R9X21hc2tzLgotCi1XZWQgT2N0IDE2IDExOjI0OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogU2V0ICJsaW5rZXJfbWFyayIgZm9yCi0JYWxsIHNlY3Rpb25zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogRGlzY2FyZCBzeW1ib2xzIGluIHNlY3Rpb25zCi0Jd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4KLQkqIGVsZjMyLXY4NTAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfVjg1MF9TREFfT0ZGU0VULAotCVJfVjg1MF9UREFfT0ZGU0VUIGFuZCBSX1Y4NTBfWkRBX09GRlNFVC4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKGVsZl92ODUwX3JlbG9jX21hcCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIHJlbG9jLmM6IEFkZCBhZGRpdGlvbmFsIFY4NTAgcmVsb2NhdGlvbnMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogTWFzayBvdXQgYml0cyB3ZQotCW5vIGxvbmdlciB3YW50IGluIHBjLXJlbGF0aXZlIHJlbG9jcy4KLQotVHVlIE9jdCAxNSAyMjoxNzozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBEb24ndCBzaWxlbnRseQotCWFjY2VwdCBhIHJlbG9jIGFnYWluc3QgYW4gdW5kZWZpbmVkIHN5Ym1vbCEKLQotVHVlIE9jdCAxNSAxNjoxNzoyOCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmM6ICBEZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgdG8gYmUgJ18nLgotCi1UdWUgT2N0IDE1IDEyOjQwOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogQnVtcCBmb3IgbmV3IHJlbG9jYXRpb24uCi0KLQkqIGhvc3RzL2kzODZic2QuaDogSWYgTkJQRyBpcyBub3QgZGVmaW5lZCwgZGVmaW5lIGl0IGFzCi0JUEFHRV9TSVpFLCBmb3IgcmVjZW50IHZlcnNpb25zIG9mIEZyZWVCU0QuCi0KLU1vbiBPY3QgMTQgMTI6Mzc6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGBsb25nIGxvbmcnIGFzIHRoZSA2NCBiaXQgdHlwZSBvbiBhIFNvbGFyaXMKLQlob3N0LCBzaW5jZSBib3RoIGdjYyBhbmQgdGhlIFN1blBSTyBjb21waWxlcnMgc3VwcG9ydCBpdC4KLQotTW9uIE9jdCAxNCAxMToxNzoyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogcmVsb2MuYzogQ3JlYXRlIGEgbmV3IEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTC4gIEl0IHdhcyBhCi0JbWlzdGFrZSB0byBoYXZlIHJldXNlZCB0aGUgRUNPRkYgTElURVJBTCBmb3IgRUxGIHNpbmNlIHRoZXkgaGF2ZQotCWRpZmZlcmVudCBzZW1hbnRpY3MuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGZfcmVsb2NfbWFwKTogTWFwIGZyb20gRUxGX0xJVEVSQUwuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBUcmFwIC5nb3QKLQlzZWN0aW9uIG92ZXJmbG93LgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGVtaXQgYQotCWR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgYW4gdW5kZWZ3ZWFrIHN5bWJvbCB3aGVuIHdlIGFyZSBidWlsZGluZwotCWEgc3RhdGljIGV4ZWN1dGFibGUuCi0KLVRodSBPY3QgMTAgMTE6MTU6MDYgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQgKGNvbmZpZy5iZmQsIHRhcmdtYXRjaC5zZWQpOiBFZGl0IHJlZmVyZW5jZXMgdG8KLQlwb2ludCBleHBsaWNpdGx5IHRvIHNyY2Rpci4KLQkodGFyZ21hdGNoLmgpOiBFZGl0IHJlZmVyZW5jZXMgdG8gcG9pbnQgZXhwbGljaXRseSB0byBvYmpkaXIuCi0KLVRodSBPY3QgMTAgMTQ6MTQ6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBXaGVuIHNldHRpbmcgdGFyZ19jcHUsIGRvbid0IGdldCBjb25mdXNlZCBieQotCWxpbnV4LWdudS4KLQotVHVlIE9jdCAgOCAwODo1MToxOSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogIEFkZCBzdXBwb3J0IGZvciB3aW5kb3dzIGhvc3QgKGEgYnVpbGQgZG9uZQotCXVuZGVyIHRoZSBNaWNyb3NvZnQgYnVpbGQgZW52aXJvbm1lbnQpLgotCi1UdWUgT2N0ICA4IDExOjQwOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhIHN5bWJvbCBpcyBhIHdlYWsKLQlkZWZpbml0aW9uIGluIGEgZHluYW1pYyBvYmplY3QsIGFkZCBpdCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUKLQlpZiBhbnkgZHluYW1pYyBvYmplY3QgbWVudGlvbnMgaXQuICBSZXZlcnRzIHBhcnQgb2YgbGFzdCBwYXRjaC4KLQotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBnb3RfYmFzZSBmaWVsZC4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgZ290X2Jhc2UuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUKLQl0aGFuIDB4MTAwMCBieXRlcywgc2V0IF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gYW5kIGdvdF9iYXNlIHRvCi0JMHgxMDAwLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogU3VidHJhY3QgZ290X2Jhc2UgZnJvbSBhIGJhc2UKLQlyZWxhdGl2ZSByZWxvY2F0aW9uLgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2lzYSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IHdhcm4gYWJvdXQgbGlua2luZwotCS1taXBzMSBhbmQgLW1pcHMyIGNvZGUgdG9nZXRoZXIsIG9yIC1taXBzMyBhbmQgLW1pcHM0IGNvZGUuCi0KLU1vbiBPY3QgIDcgMTE6NDQ6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiBPbmx5IHRyZWF0IGFyY2hpdmUgYXMgbGl0dGxlCi0JZW5kaWFuIGZvciBpOTYwIENPRkYuCi0KLUZyaSBPY3QgIDQgMTM6NDk6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkanVzdCBzb2ZhcgotIAlieSB0aGUgY2hhbmdlIGluIHNpemUgb2YgdGhlIHNlY3Rpb24gd2hlbiBFWEVDX1AgaXMgbm90IHNldC4KLQotCSogY29mZi1tNjhrLmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKG02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfbTY4a19seW54X3J0eXBlX3RvX2hvd3RvKTogQWRkIHRoZSBzZWN0aW9uCi0JVk1BIHRvIHRoZSBhZGRlbmQgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MuCi0KLQkqIGRlcC1pbi5zZWQ6IFJld29yayBiYWNrc2xhc2ggbG9vcCBhIGJpdCB0byBhdm9pZCBidWcgaW4gc2VkIG9uCi0JSFAvVVggMTAuMjAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSAuLi9iZmQvc3lzZGVwLmgsIHNpbmNlIGl0IHdpbGwgYXBwZWFyIHdoZW4KLQlzb20uaCBpcyBpbmNsdWRlZC4KLQotRnJpIE9jdCAgNCAxMTo0MTozOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgZXhwbGljaXQgZGVwZW5kZW5jaWVzIGZvciBtbjEwMjAwIGFuZAotCW1uMTAzMDAgZmlsZXMuCi0JKEFMTF9NQUNISU5FX0NGSUxFUyk6IEFkZCBjcHUtbW4xMDIwMC5jIGFuZCBjcHUtbW4xMDMwMC5jLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItbW4xMDIwMC5jIGFuZCBlbGYzMi1tbjEwMzAwLmMKLQkoZGVwZW5kZW5jaWVzKTogUmVidWlsdC4KLQotVGh1IE9jdCAgMyAxNjo1Nzo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFNldCBvYmpfY29mZl9rZWVwX3N5bXMKLQlkdXJpbmcgdGhpcyBmdW5jdGlvbi4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBPbmx5IHVzZSBhbiBleGlzdGluZwotCXNlY3Rpb24gaWYgdGhlIGZsYWdzIGFyZSBjb21wYXRpYmxlLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBoYXZldmVjcywgYW5kIHB1dCBpdCBpbiB0ZGVmYXVsdHMuCi0JKiBtcHctY29uZmlnLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdtYXRjaC5zZWQ6IE5ldyBmaWxlOyBhIHNlZCBzY3JpcHQgdG8gYnVpbGQgdGFyZ21hdGNoLmggZnJvbQotCWNvbmZpZy5iZmQuCi0JKiBjb25maWcuYmZkOiBBZGQgI2lmLCAjZW5kaWYsIGFuZCBjb21tZW50cyBmb3IgdGFyZ21hdGNoLmguCi0JKiB0YXJnZXRzLmM6IEluY2x1ZGUgImZubWF0Y2guaCIuCi0JKHN0cnVjdCB0YXJnbWF0Y2gpOiBEZWZpbmUuCi0JKGJmZF90YXJnZXRfbWF0Y2gpOiBEZWZpbmUgYnkgaW5jbHVkaW5nIHRhcmdtYXRjaC5oLgotCShiZmRfZmluZF90YXJnZXQpOiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZCBieSBuYW1lLCBzZWFyY2ggZm9yCi0JaXQgYXMgYSBjb25maWd1cmF0aW9uIHRyaXBsZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LWFybS5vLCBhb3V0LXNwYXJjbGUubywgaHAzMDBic2QubywKLQlpMzg2ZHluaXgubywgbTY4azRrbmV0YnNkLm8sIGFuZCByaXNjaXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGFvdXQtYXJtLmMsIGFvdXQtc3BhcmNsZS5jLAotCWhwMzAwYnNkLmMsIGkzODZkeW5peC5jLCBtNjhrNGtuZXRic2QuYywgYW5kIHJpc2NpeC5jLgotCShIRklMRVMpOiBBZGQgdGFyZ21hdGNoLmguICBBbHNvLCBhbHBoYWJldGl6ZSBhbmQgcmVpbmRlbnQuCi0JKENGSUxFUyk6IFJlbW92ZSBpMzg2ZHluaXguYyBhbmQgaHAzMDBic2QuYy4KLQkodGFyZ21hdGNoLmgpOiBOZXcgdGFyZ2V0LgotCShkb19jbGVhbik6IFJlbW92ZSB0YXJnbWF0Y2guaC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KS4KLQkqIGFjY29uZmlnLmg6IEFkZCBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmg6IElmIE5FRURfREVDTEFSQVRJT05fR0VURU5WLCBkZWNsYXJlIGdldGVudi4KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9vYmplY3RfcCk6IERvbid0IGRlY2xhcmUgZ2V0ZW52LgotCi1UaHUgT2N0ICAzIDA5OjI5OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY3B1LW1uMTB4MDAuYywgZWxmMzItbW4xMHgwMDogUmVtb3ZlZC4KLQkqIGNwdS1tbjEwMjAwLmMsIGNwdS1tbjEwMzAwLmM6IE5ldyBmaWxlcy4KLQkqIGVsZjMyLW1uMTAyMDAuYywgZWxmMzItbW4xMDMwMC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gdHdvIHNlcGFyYXRlCi0JY29uZmlndXJhdGlvbnMsIG1uMTAyMDAgYW5kIG1uMTAzMDAuCi0JKiBhcmNodXJlcy5jLCBjb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGVsZi5jLCB0YXJnZXRzLmM6IExpa2V3aXNlLgotCSogYmZkLWluMi5oLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVRodSBPY3QgIDMgMTU6Mzg6MTkgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRvX2NsZWFuKTogTW92ZSBjb25maWcubG9nIHRvIGRvX2Rpc3RjbGVhbi4KLQotV2VkIE9jdCAgMiAyMTo0MDo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNwdS1tbjEweDAwLmMsIGVsZjMyLW1uMTB4MDAuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtbW4xMHgwMC5vLgotCShCRkQzMl9CQUNLRU5EUyk6IFNpbWlsYXJseSBmb3IgZWxmMzItbW4xMHgwMC5vLgotCShlbGYzMi1tbjEweDAwLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX21uMTB4MDAuCi0JKGJmZF9tbjEweDAwX2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfbW4xMHgwMF9hcmNoLgotCSogY29uZmlnLmJmZDogQWRkIG1uMTB4MDAtKi0qLgotCSogY29uZmlndXJlLmluOiBBZGQgYmZkX2VsZjMyX21uMTB4MDBfdmVjLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9tbjEweDAwLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfbW4xMHgwMF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmMzJfbW4xMHgwMF92ZWMuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotV2VkIE9jdCAgMiAxNTo0Njo0NSAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCW9wZW5WTVMvQWxwaGE6IFByb3ZpZGUgZmlsZW5hbWUgYW5kIGNhc2VfaGFjayBmbGFncyB2aWEKLQlzeW1ib2wgdGFibGUgZnJvbSBnYXMuCi0JQWRkIGNhc2VfaGFjayBjb2RlIGZvciBzeW1ib2wgb3V0cHV0IGZyb20gdmF4L3Ztcy4KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9pbml0aWFsaXplKTogUmVtb3ZlIGZpbGVuYW1lIGhhbmRsaW5nLAotCWZpbGVuYW1lIGlzIHByb3ZpZGVkIHZpYSBzeW1ib2wgdGFibGUuCi0JKGV2YXhfZ2V0X3N5bXRhYik6IFVzZSBsb2NhbCBzeW1ib2wgY291bnQgd2hlbiBzZXR0aW5nIHVwIHRhYmxlLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF9zbHVycF9lZ3NkKTogUHJpbnQgY29ycmVjdCBuYW1lIHdoZW4KLQlkZWJ1Z2dpbmcuCi0JKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogU2tpcCBmaWxlIG5hbWUgc3ltYm9sLgotCSogZXZheC1lbWguYyAoZ2V0X3Ztc190aW1lX3N0cmluZyk6IExvY2FsIGZ1bmN0aW9uIG5vdy4KLQkoX2JmZF9ldmF4X3dyaXRlX2VtaCk6IEV4dHJhY3Qgc291cmNlIGZpbGVuYW1lIGFuZCBjYXNlX2hhY2sgZmxhZ3MKLQlmcm9tIHN5bWJvbCB0YWJsZS4KLQkqIGV2YXhfd3JpdGVfZXRpciAoX2JmZF9ldmF4X3dyaXRlX2V0aXIpOiBQYXNzIGFsbCBzeW1ib2wgbmFtZXMKLQl0aHJvdWdoIF9iZmRfZXZheF9jYXNlX2hhY2tfc3ltYm9sLgotCSogZXZheC1taXNjLmMgKGhhc2hfc3RyaW5nLCBfYmZkX2V2YXhfY2FzZV9oYWNrX3N5bWJvbCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoX2JmZF9ldmF4X2Jhc2VuYW1lKTogUmVtb3ZlZC4KLQkoX2JmZF9nZXRfdm1zX3RpbWVfc3RyaW5nKTogTW92ZWQgdG8gZXZheC1lbWguYy4KLQkqIGV2YXguaCAoZXZheF9wcml2YXRlX2RhdGFfc3RydWN0KTogUmVtb3ZlIGZpbGVuYW1lLgotCShmbGFnX2hhc2hfbG9uZ19uYW1lcywgZmxhZ19zaG93X2FmdGVyX3RydW5jLAotCWZsYWdfbm9faGFzaF9taXhlZF9jYXNlLCB2bXNfbmFtZV9tYXBwaW5nKTogTmV3IGZsYWdzIGZvcgotCXZtc19jYXNlX2hhY2suCi0KLVdlZCBPY3QgIDIgMTI6MDI6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmcmVlYnNkLmggKE5fR0VUX01BR0lDX05FVCk6IERvbid0IHVzZSBudG9obC4KLQkoTl9HRVRNSURfTkVULCBOX0dFVEZMQUdfTkVUKTogTGlrZXdpc2UuCi0JKE5PX1NXQVBfTUFHSUMpOiBEb24ndCBkZWZpbmUuCi0JKFNXQVBfTUFHSUMpOiBEZWZpbmUuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzCi0Jbm8gaGFzaCB0YWJsZSBlbnRyeSBmb3IgYSBnbG9iYWwgc3ltYm9sLgotCi1UdWUgT2N0ICAxIDE2OjE0OjIyIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcyotKi1lbGYqLgotCi1UdWUgT2N0ICAxIDEyOjMxOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3Qgb3ZlcnJpZGUgYSBtZWFuaW5nZnVsCi0Jc3ltYm9sIHR5cGUgd2l0aCBUX05VTEwuICBXYXJuIGlmIHN5bWJvbCB0eXBlIGNoYW5nZXMuICBCYXNlZCBvbgotCXBhdGNoIGZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IHB1dCBhIHN5bWJvbCBmcm9tCi0JYSBkeW5hbWljIG9iamVjdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgaXQgaXMgcmVmZXJlbmNlZAotCW9yIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4KLQotRnJpIFNlcCAyNyAxODo0MTowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX2lzX2xvY2FsX2xhYmVsKTogIE5ldyBmdW5jdGlvbiB0bwotCXJlbW92ZSBkd2FyZiBsb2NhbCBsYWJlbHMuICBTaHJpbmtzIGJpbmFyaWVzIGJ5IGEgZmFjdG9yIG9mIDMhCi0KLU1vbiBTZXAgMjMgMTM6MzM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBDcmVhdGUgdGhlIC5zYnNzIHNlY3Rpb24KLQlieSBoYW5kLCByYXRoZXIgdGhhbiBieSBjYWxsaW5nIGJmZF9tYWtlX3NlY3Rpb24uCi0KLU1vbiBTZXAgMjMgMDk6MjM6NDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IFJlbmFtZSBtMzJyIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBlbGYzMi1tMzJyLmM6IFVwZGF0ZS4KLQotRnJpIFNlcCAyMCAxMTo0Mzo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUKLQlsaW5rLCBhZGp1c3QgdGhlIHN5bWJvbCBpbmRleCBvZiBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuICBEb24ndAotCWNoYW5nZSB0aGUgYWRkZW5kIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgcGNyZWxfb2Zmc2V0IGlzIHNldC4KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBkbyBhbnl0aGluZyBmb3IKLQlhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQXBwbHkgdGhlIHJlbG9jYXRpb24gZXZlbiBpZgotCWl0IGlzIHplcm8sIGluIGNhc2Ugc3JjX21hc2sgbWF0dGVycy4KLQkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1UaHUgU2VwIDE5IDExOjAzOjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBBbHdheXMgaW5pdGlhbGl6ZQotCWtlZXBfc3ltcy4KLSAJKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgdGFyZ2V0X2luZGV4Ci0JdG8gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KLQotVHVlIFNlcCAxNyAxNDoxODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IFdhcm4gYWJvdXQgaWxsZWdhbCBzeW1ib2wKLQlpbmRpY2VzLCByYXRoZXIgdGhhbiBjcmFzaGluZy4KLQkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlLiAgQ2hlY2sgd2hldGhlciB0aGUgaG93dG8gZmllbGQKLQlpcyBOVUxMLgotCSogY29mZi1zaC5jIChzaF9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZm9yIGFuIGlsbGVnYWwgc3ltYm9sCi0JaW5kZXguCi0KLU1vbiBTZXAgMTYgMTI6Mzk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IENoYW5nZSBkc3RfbWFzayBmb3IgQVJNMjZECi0gCXJlbG9jIHRvIDAuCi0JKGNvZmZfYXJtX2FkanVzdF9zeW1uZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCi0KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogQWNjZXB0IG11bHRpcGxlIHN5bWJvbHMgb24gYSBzaW5nbGUgbGluZS4KLQlGcm9tIFBhc2NhbCBNYXJ0aW4gPHBtYXJ0aW5AYWxzeXMuY29tPi4KLQotCSogUkVBRE1FOiBOZXcgZmlsZS4KLQotRnJpIFNlcCAxMyAxNDozMjo0MiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKHN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBTZXAgMTMgMTU6NTA6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFN3aXRjaCBvbiBvdXRwdXQgQkZEIHJhdGhlcgotCXRoYW4gaW5wdXQgQkZELgotCShiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogc2VjdGlvbi5jIChiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IExpa2V3aXNlLgotCSogc3ltcy5jIChiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENoZWNrIHRoYXQKLQlib3RoIEJGRCdzIGFyZSB0aGUgcmlnaHQgZmxhdm91ci4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIHBlaWNvZGUuaCAocGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBMaWtld2lzZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9ob3d0b190YWJsZSk6IEZpbGwgaW4gc29tZSBmaWVsZHMgZm9yCi0JUl9QQVJJU0NfRElSMzIsIHNvIHRoYXQgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgcGFzc2VzCi0JaXRzIHNhbml0eSBjaGVjay4KLQotVGh1IFNlcCAxMiAxMTo0NTo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIG0zMnIgcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGNwdS1tMzJyLmMsZWxmMzItbTMyci5jOiBOZXcgZmlsZXMuCi0KLVRodSBTZXAgMTIgMTE6MTA6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgZmllbGQgdG8gJ18nLgotCi1XZWQgU2VwIDExIDExOjU3OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGVraGV4LmMgKGZpcnN0X3BoYXNlKTogQ2hhbmdlIHR5cGUgcGFyYW1ldGVyIGZyb20gY2hhciB0byBpbnQuCi0JKG91dCk6IExpa2V3aXNlLgotCShwYXNzX292ZXIpOiBDaGFuZ2UgZnVuYyB0byBleHBlY3QgaW50LCBub3QgY2hhci4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBUZXN0IFNFQ19BTExPQwotCXJhdGhlciB0aGFuIFNFQ19MT0FEIHdoZW4gYWxpZ25pbmcgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlyc3QKLQlzZWN0aW9uIGluIGEgc2VnbWVudC4KLQotVHVlIFNlcCAxMCAxNjoxODozMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IE1ha2UgYXJnIGNvbnN0LgotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6IFJlbW92ZSBleHRyYW5lb3VzIGV4dHJhIGFyZwotCXRvIG1ha2VfYmZkX2FzZWN0aW9uKCkuCi0JKiBlbGYtYmZkLmggKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IEFkZCBwcm90b3R5cGUuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IFJlbW92ZSBwcm90b3R5cGUuCi0JKF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0KTogUmVtb3ZlIHByb3RvdHlwZS4KLQotCSogbmV0YnNkLWNvcmUuYyAoc3dhcF9hYm9ydCk6IEFkZCBwcm90b3R5cGUuCi0JKiBhaXgzODYtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYwotCSogaHB1eC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogaXJpeC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogcHRyYWNlLWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiB0cmFkLWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2NfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX3JlbG9jX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX3N5bV9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfc3ltX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfYXV4X2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9saW5lbm9faW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2xpbmVub19vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBEaXR0by4KLQkqIGloZXguYyAoaWhleF9zaXplb2ZfaGVhZGVycyk6IERpdHRvLgotCSogdGVraGV4LmMgKGdldHN5bSk6IERpdHRvLgotCShmaW5kX2NodW5rKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkoaW5zZXJ0X2J5dGUpOiBEaXR0by4KLQkoZmlyc3RfcGhhc2UpOiBEaXR0by4KLQkocGFzc19vdmVyKTogRGl0dG8uCi0JKHRla2hleF9nZXRfc3ltdGFiKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkodGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSh0ZWtoZXhfbWtvYmplY3QpOiBEaXR0by4KLQkodGVraGV4X29iamVjdF9wKTogRGl0dG8uCi0JKG1vdmVfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCSh0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkodGVraGV4X3NldF9hcmNoX21hY2gpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSh0ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkod3JpdGV2YWx1ZSk6IERpdHRvLgotCSh3cml0ZXN5bSk6IERpdHRvLgotCShvdXQpOiBEaXR0by4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCSh0ZWtoZXhfc2l6ZW9mX2hlYWRlcnMpOiBEaXR0by4KLQkodGVraGV4X21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKHRla2hleF9nZXRfc3ltYm9sX2luZm8pOiBEaXR0by4KLQkodGVraGV4X3ByaW50X3N5bWJvbCk6IERpdHRvLgotCSogaXJpeC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBEaXR0by4KLQkoaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkqIHNyZWMuYyAoc3JlY19uZXdfc3ltYm9sKTogRGl0dG8uCi0JKHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkoc3JlY19zZXRfYXJjaF9tYWNoKTogRGl0dG8uCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkoaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3JlY19zaXplb2ZfaGVhZGVycyk6IERpdHRvLgotCShzcmVjX21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERpdHRvLgotCShzcmVjX2dldF9zeW10YWIpOiBEaXR0by4KLQkoc3JlY19wcmludF9zeW1ib2wpOiBEaXR0byBhbmQgbWFrZSBzdGF0aWMuCi0JKiBlbGYuYyAoZWxmX3JlYWQpOiBEaXR0bwotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogRGl0dG8uCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogRGl0dG8uCi0JKHN5bV9pc19nbG9iYWwpOiBEaXR0by4KLQkoZWxmX21hcF9zeW1ib2xzKTogRGl0dG8uCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogRGl0dG8uCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IERpdHRvLgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApOiBEaXR0by4KLQkoZml4dXBfc3ltYm9sX3ZhbHVlKTogRGl0dG8uCi0JKGJ1aWxkX2RlYnVnX3NlY3Rpb24pOiBEaXR0by4KLQkoY29weV9uYW1lKTogRGl0dG8uCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogRGl0dG8uCi0KLU1vbiBTZXAgIDkgMjI6MzY6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQgYWZ0ZXIgbTMyciBjaGFuZ2VzLgotCi1Nb24gU2VwICA5IDEyOjMxOjIyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQsY29uZmlndXJlLmluLGNvbmZpZ3VyZTogQWRkIG0zMnIgc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluLGFyY2h1cmVzLmMsZWxmLmMsdGFyZ2V0cy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQ6IEtlZXAgdGFyZ2V0IGxpc3QgYWxwaGFiZXRpY2FsbHkgc29ydGVkLgotCi1Nb24gU2VwICA5IDExOjQ4OjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYywgY2FzZSBSX1Y4NTBfSEkxNik6IERvbid0IGZvcmdldAotCXRvIGFkZCBpbiB0aGUgY29uc3RhbnQgcGFydCBmb3VuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLgotCShjYXNlIFJfVjg1MF9ISTE2X1MpOiBMaWtld2lzZS4KLQotRnJpIFNlcCAgNiAxNzowNDozOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IE1vZGlmeSB0aGUgc2l6ZSBvZiBSX0QxMFZfMTYKLQlhbmQgUl9EMTBWXzE4IHRvIGJlIDEgKHdvcmQpLgotCi1UaHUgU2VwICA1IDE1OjIzOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBJZiB0aGUgb3V0cHV0X3NlY3Rpb24gZmllbGQKLQlvZiBlaXRoZXIgc2VjdGlvbiBpcyBiZmRfYWJzX3NlY3Rpb24sIHRoZW4gdGhlIGxpbmtlciBpcwotCWRpc2NhcmRpbmcgdGhlIHNlY3Rpb24gYW5kIHdlIHNob3VsZCBub3Qgb3B0aW1pemUgaXQuCi0KLVR1ZSBTZXAgIDMgMTI6MTY6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFvdXQtc3BhcmNsZS5vKTogTmV3IHRhcmdldC4KLQkqIGFvdXRmMS5oIChUQVJHRVRfSVNfQklHX0VORElBTl9QKTogRG9uJ3QgZGVmaW5lIGlmIGxpdHRsZSBlbmRpYW4uCi0JKiBjb25maWcuYmZkIChzcGFyY2xldC0qLWFvdXQqKTogQWRkIGNhc2UuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGVfYW91dF92ZWMpOiBBZGQgY2FzZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiB0YXJnZXRzLmMgKHNwYXJjbGVfYW91dF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzcGFyY2xlX2FvdXRfdmVjLgotCSogYW91dC1zcGFyY2xlLmM6IE5ldyBmaWxlLgotCi1UdWUgU2VwICAzIDAwOjU3OjAyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZgotCWxvdyBvcmRlciBzaWduIGJpdCBwcm9wb2dhdGlvbiBmb3IgUl9WODUwX0hJMTZfUy4KLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IE5ldyBmdW5jdGlvbiBmb3IKLQloYW5kbGluZyBWODUwIHNwZWNpZmljIHJlbG9jcy4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBVc2UgdGhlIG5ldyBmdW5jdGlvbiBmb3Igc29tZQotCXJlbG9jYXRpb25zLiAgVHdpZGRsZSBtYXNrcyAmIHNoaWZ0cyBmb3Igc29tZSByZWxvY3MuCi0JU2V0IHBhcnRpYWxfaW5wbGFjZSB3aGVyZSBuZWVkZWQuCi0KLU1vbiBTZXAgIDIgMTI6MTI6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtbWlwcy5jOiBBZGQgYW4gZXhwbGljaXQgbWlwczozMDAwIGVudHJ5LCBhbmQgY2hhbmdlIHRoZQotCWRlZmF1bHQgYXJjaGl0ZWN0dXJlIHRvIGEgbWFjaGluZSBudW1iZXIgb2YgMC4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IFNldCB0aGUgbWFjaGluZSBudW1iZXIKLQlmb3IgRV9NSVBTX0FSQ0hfMS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogSWYgdGhlIG1hY2hpbmUgbnVtYmVyIG9mCi0JdGhlIG91dHB1dCBCRkQgaXMgdGhlIGRlZmF1bHQsIHNldCBpdCBmcm9tIHRoZSBmaXJzdCBpbnB1dCBCRkQuCi0KLVN1biBTZXAgIDEgMTg6Mzg6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQWxsIHRoZSAxNmJpdCByZWxvY3MKLQlpbnNlcnQgYXQgYml0cG9zIHplcm8uICBUaGUgSEkxNiByZWxvY3MgYXJlIHNoaWZ0ZWQgcmlnaHQKLQlieSAxNiBiaXRzLiAgRml4IHNyY19tYXNrIGZvciBhbGwgcmVsb2NzLgotCShUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0xJVFRMRV9OQU1FKTogRGVmaW5lLiAgVGhlIFY4NTAgaXMKLQlsaXR0bGUgZW5kaWFuIQotCShUQVJHRVRfQklHX1NZTSwgVEFSR0VUX0JJR19OQU1FKTogUmVtb3ZlLiAgVGhlIFY4NTAgaXMgbGl0dGxlCi0JZW5kaWFuIQotCi1TdW4gU2VwICAxIDE1OjQxOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOgotCVJld3JpdGUgdG8gdXNlIEJGRCBmaWxlIHJlYWQgcm91dGluZXMgYW5kIHRvIGF2b2lkIHVzaW5nIGEgZml4ZWQKLQlsZW5ndGggZm9yIHRoZSBmaWxlIG5hbWUuCi0KLVNhdCBBdWcgMzEgMTA6MjI6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfezMyLDE2LDh9LgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IEFkZCBzdXBwb3J0IGZvciBSX1Y4NTBfezMyLDE2LDh9LgotCSh2ODUwX3JlbG9jX21hcCk6IEFkZCB0cmFuc2xhdGlvbiBmcm9tIEJGRF9SRUxPQ197MzIsMTYsOH0KLQl0byBSX1Y4NTBfezMyLDE2LDh9LgotCi1GcmkgQXVnIDMwIDE4OjA2OjA0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHJlbG9jX3R5cGUpOiBBZGQgUl9WODUwX0hJMTZfUy4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBBZGQgaW5mbyBmb3IgSEkxNl9TIHJlbG9jLgotCSh2ODUwX3JlbG9jX21hcCk6IEFkZCBISV8xNl9TIHJlbG9jLgotCSogcmVsb2MuYzogRGVmaW5lIEJGRF9SRUxPQ19WODUwXyogcmVsb2NzLgotCi1GcmkgQXVnIDMwIDExOjQ5OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBTSCBFTEYgc3VwcG9ydC4KLQkqIGVsZjMyLXNoLmM6IE5ldyBmaWxlLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9zaC4KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogSGFuZGxlIGFic29sdXRlIHN5bWJvbC4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzKTogRGVjbGFyZS4KLQkoX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGVsZmxpbmsuaCAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKSk6IFJlbmFtZSBmcm9tCi0JZWxmX2xpbmtfcmVhZF9yZWxvY3MuICBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogR2V0IGV4dGVybmFsIHN5bWJvbHMgZnJvbSBjYWNoZSBpbgotCXN5bXRhYl9oZHItPmNvbnRlbnRzLiAgR2V0IGNvbnRlbnRzIGZyb20gY2FjaGUgaW4KLQllbGZfc2VjdGlvbl9kYXRhLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmRF9lbGZOTl9iZmRfcmVsYXhfc2VjdGlvbik6IE9ubHkgZGVmaW5lIGlmIG5vdAotCWFscmVhZHkgZGVmaW5lZC4KLQkqIHJlbG9jLmM6IERlZmluZSBCRkRfUkVMT0NfU0hfKiByZWxvY3MuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4pOiBEZWNsYXJlLgotCSogY29mZi1zaC5jIChzaF9pbnNuc19jb25mbGljdCk6IEZpeCBhIHJldHVybiB2YWx1ZS4KLQkoX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4pOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbiwgYnJva2VuCi0Jb3V0IG9mIHNoX2FsaWduX2xvYWQuCi0JKHNoX2FsaWduX2xvYWQpOiBDYWxsIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuLgotCShzaF9zd2FwX2luc25zKTogQ2hhbmdlIHJlbG9jcyBwYXJhbWV0ZXIgdG8gUFRSLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3NoX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zaGxfdmVjKTogRGVjbGFyZS4KLQkqIGNvbmZpZy5iZmQgKHNoLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9zaF92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoYmZkX2VsZjMyX3NobF92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLXNoLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1zaC5jLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogQ2hlY2sgdGhhdCBMTUEgZG9lcyBub3Qgc2tpcCBhCi0JcGFnZSBiZWZvcmUgY2hlY2tpbmcgRF9QQUdFRC4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBSZW1vdmVkIHVubmVjZXNzYXJ5IGV4dGJhc2UgdmFyaWFibGUuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIGV4dGJhc2U7IGFsd2F5cyB1c2Ugc2VnYmFzZQotCWluc3RlYWQuCi0KLVRodSBBdWcgMjkgMTY6NTI6MTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLSopOiBEaXR0by4KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotKik6IERpdHRvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1kZ3V4Kik6IFJlY29nbml6ZSBhcyBhIHN5bm9ueW0gZm9yIHg4NgotCWVsZi4KLQotVHVlIEF1ZyAyNyAwOToxODoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBBZGQgbmV3IGFyZ3VtZW50LgotCSogZWxmMzItaHBwYS5oIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBBZGQgbmV3IGFyZ3VtZW50LiAgSWYKLQl3ZSBlbmNvdW50ZXIgYW4gUl9EQVRBX09ORV9TWU1CT0wgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCB0aGF0Ci0Jd2lsbCBoYXZlIGFuIFNUX0NPREUgdHlwZSwgY2hhbmdlIHRoZSBzeW1ib2wncyB0eXBlIHRvIFNUX0RBVEEuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVcGRhdGUgcHJvdG90eXBlLgotCi1UdWUgQXVnIDI3IDAwOjEyOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBTZXQgZHlub2JqIGlmIG5lZWRlZCBmb3IKLQlSX01JUFNfMzIgYW5kIFJfTUlQU19SRUwzMi4gIFNldCBzZ290IGFuZCBnIGFzIHNvb24gYXMgcG9zc2libGUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHJlcXVpcmUgLmdvdCB0byBleGlzdC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAyMiAxMDo1NDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChITERFTlYpOiBOZXcgdmFyaWFibGUgdG8gc2V0LiAgU2V0IGl0IGZvcgotCSotKi1zeXN2NCosIHNpbmNlIHRob3NlIGxpbmtlcnMgbWF5IG5vdCBzdXBwb3J0IC1SIGJ1dCB0aGV5IGFsd2F5cwotCXN1cHBvcnQgTERfUlVOX1BBVEguCi0KLQkqIGxpYmllZWUuaCAoTlNFQ1RJT05TKTogRG9uJ3QgZGVmaW5lLgotCShpZWVlX2RhdGFfc3RydWN0KTogQ2hhbmdlIHNlY3Rpb25fdGFibGUgdG8gYXNlY3Rpb24gKiouICBBZGQKLQlzZWN0aW9uX3RhYmxlX3NpemUuCi0JKiBpZWVlLmMgKGdldF9zZWN0aW9uX2VudHJ5KTogSWYgdGhlIHRhYmxlIGlzbid0IGJpZyBlbm91Z2gsIG1ha2UKLQlpdCBiaWdnZXIuCi0JKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBSZW1vdmUgYXNzZXJ0aW9uIGFib3V0IG51bWJlciBvZiBzZWN0aW9ucy4KLQkoaWVlZV9vYmplY3RfcCk6IEFkanVzdCBpbml0aWFsaXphdGlvbiBvZiBpZWVlIHRvIG1hdGNoIGNoYW5nZXMgdG8KLQl0aGUgc3RydWN0dXJlLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFyayk6IERvbid0IGNvcHkgcmVsb2NzIGZvciB1bmRlZmluZWQKLQlzeW1ib2xzIG1lcmVseSBiZWNhdXNlIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IERvbid0IHNldCB1cCBnbG9iYWwgbGlua2FnZSBjb2RlIGZvciBhbgotCXVuZGVmaW5lZCBzeW1ib2wgbWVyZWx5IGJlY2F1c2Ugd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LgotCi1UdWUgQXVnIDIwIDE1OjA2OjA1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS12ODUwLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKSBBZGQgZWxmMzItdjg1MC5vLgotCSogYXJjaHVyZXMuYzogQWRkIGJmZF92ODUwX2FyY2guCi0JKiBiZmQtaW4yLmg6IEFkZCBiZmRfdjg1MF9hcmNoLgotCSogY29uZmlnLmJmZCAodjg1MC0qLSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiAoYmZkX2VsZjMyX3Y4NTBfdmVjKSBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlLmluOiAoYmZkX2VsZjMyX3Y4NTBfdmVjKSBOZXcgdmVjdG9yLgotCSogY3B1LXY4NTAuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkZWQgY2FzZSBiZmRfYXJjaF92ODUwLgotCSogZWxmMzItdjg1MC5jOiBOZXcgZmlsZS4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3Y4NTBfdmVjKTogTmV3IHZlY3Rvci4KLQotRnJpIEF1ZyAxNiAxNjoyNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBDcmVhdGUgYW5kIGRlZmluZQotIAlhIGZ1bmN0aW9uIGNvZGUgc3ltYm9sIGZvciBhbiBYTUNfWE8gc3ltYm9sLgotCi1UaHUgQXVnIDE1IDEyOjMzOjI5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogVXBkYXRlIGVkaXRpbmcgb2YgYXV0b2NvbmYgdmFycyB0byByZWZsZWN0Ci0JSnVsIDE4IGNvbmZpZ3VyZS5pbiBjaGFuZ2UuCi0JKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSBlZGl0aW5nIG9mIGluY2x1ZGUgcGF0aG5hbWVzIHRvIGJlCi0JbW9yZSBnZW5lcmFsLCBhZGQgQERBU0hfQ19GTEFHQCB0byBleHBsaWNpdCBjb21waWxlIHJ1bGUgZWRpdC4KLQotVGh1IEF1ZyAxNSAxMDozNToxMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSk6IFRoZSBzZWN0aW9uIGZyb20KLQl3aGljaCB0byBvZmZzZXQgdG8gZ2V0IHRoZSAucGx0IGVudHJ5IGFkZHJlc3MgaXMgIi5wbHQiLgotCi1UaHUgQXVnIDE1IDE2OjQwOjMwIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogcmVsb2MuYzogKEJGRF9SRUxPQ19BUk1fVEhVTUJfQURELCBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTSwKLQlCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZULCBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCk6Ci0gCUFkZGVkLCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBBUk0gZ2FzLgotCSogbGliYmZkLmg6IFJlYnVpbHQKLQkqIGJmZC1pbjIuaDogUmVidWlsdAotCi1XZWQgQXVnIDE0IDE3OjAyOjA5IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IHR5cG8KLQlpbiBzZWN0aW9uIGR5bmlkeCBzdGFydC4KLQotVHVlIEF1ZyAxMyAxNDozNTozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogVHJlYXQgc2VjdGlvbnMgd2hvc2UKLQluYW1lIGJlZ2lucyB3aXRoIC5nbnUubGlua29uY2UgYXMgU0VDX0xJTktfT05DRS4gIFRoaXMgaXMgYW4KLQlvcHRpbWl6YXRpb24gZm9yIGcrKy4KLQotVHVlIEF1ZyAxMyAxNzowNDo0MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBJZiBvbmUgbW9kdWxlIGhhcwotCXRoZSAtbXJlbG9jYXRhYmxlLWxpYiBiaXQgc2V0IGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgY2xlYXIgdGhlCi0JLW1yZWxvY2F0YWJsZS1saWIgYml0IGluIHRoZSBoZWFkZXIuCi0KLVNhdCBBdWcgMTAgMjI6NTk6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvIG5vdCByZXNvbHZlIGEgY29tbW9uCi0Jc3ltYm9sIGFnYWluc3QgYSBTVFRfRlVOQyBzeW1ib2wgaW4gYSBzaGFyZWQgbGlicmFyeS4KLQotRnJpIEF1ZyAgOSAxMjo0NDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBJZiBhIGRlc2NyaXB0b3IKLSAJc3ltYm9sIGlzIGZvdW5kLCBhdXRvbWF0aWNhbGx5IGRlZmluZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgotIAljb2RlLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBPbmx5IHNldCAoKnN5bV9oYXNoKS0+bnVtYXV4Ci0JaWYgc3ltLm5fbnVtYXV4IGlzIG5vdCB6ZXJvLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBQZXJtaXQgdGhlIHN5bWJvbCBhbmQgdGhlIGhhc2ggdGFibGUKLQllbnRyeSB0byBkaXNhZ3JlZSBhYm91dCB0aGUgbnVtYmVyIG9mIGF1eCBlbnRyaWVzIGlmIHRoZSBzeW1ib2wKLQloYXMgemVyby4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBDcmVhdGUgdGhlIC5yZWwuZHluCi0Jc2VjdGlvbiBpZiBpdCBtaWdodCBiZSBuZWVkZWQsIG5vdCBqdXN0IGlmIGluZm8tPnNoYXJlZC4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTWFrZSByb29tIGZvciBhIG51bGwgZWxlbWVudCBhdAotCXRoZSBzdGFydCBvZiAucmVsLmR5biBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGl0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgY2xlYXIgdGhlIGZpcnN0IGVsZW1lbnQKLQlvZiAucmVsLmR5biBpZiB0aGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotVGh1IEF1ZyAgOCAxNjoyNDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IElmIHdlIGFscmVhZHkgY2FsbGVkIHRoZQotCXVuZGVmaW5lZF9zeW1ib2wgY2FsbGJhY2sgZm9yIGEgc3ltYm9sLCB0aGVuIGRvbid0IGlzc3VlIGFueSBtb3JlCi0Jd2FybmluZ3MgYWJvdXQgbG9hZGVyIHJlbG9jcy4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGRvIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcKLQlhZnRlciBjYWxsaW5nIHRoZSB1bmRlZmluZWRfc3ltYm9sIGNhbGxiYWNrLgotCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfTVVMVElQTFlfREVGSU5FRCk6IERlZmluZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFBlcm1pdCBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBhIHN5bWJvbAotCWFzIHRoZSBBSVggbGlua2VyIHNlZW1zIHRvIGRvLgotCi1UaHUgQXVnICA4IDEyOjIxOjU2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfYWxwaGFfdmVjKTogQ29ycmVjdGVkIGZsYWdzLCBjbGVhbnVwLgotCShldmF4X2luaXRpYWxpemUpOiBSZW1vdmUgZXZheF9yZWxvY190YWJsZS4KLQkoZXZheF9jbG9zZV9hbmRfY2xlYW51cCk6IERpdHRvLgotCShyZWxvY19uaWwpOiBEaXR0by4KLQkoYWxwaGFfaG93dG9fdGFibGUpOiBSZW1vdmUgQUxQSEFfUl9TV1JFTDMyIGFuZCBBTFBIQV9SX1NXUkVMNjQKLQllbnRyaWVzLgotCShldmF4X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF9zbHVycF9lZ3NkKTogQWRkIGEgZmV3IGNhc3RzOyBzZXQKLQljb29rZWRfc2l6ZSA9PSByYXdfc2l6ZS4KLQkqIGV2YXgtZW1oLmMgKF9iZmRfZXZheF9yZWdpc3Rlcl9maWxlbmFtZSk6IFJlbW92ZS4KLQkqIGV2YXgtZXRpci5jIChldGlyX3N0Yyk6IEFsbG93IEVUSVJfU19DX1NUQ194eCBjb21tYW5kcy4KLQkqIGV2YXgtbWlzYy5jIChhZGRfbmV3X2NvbnRlbnRzKTogTWFsbG9jIHNlY3Rpb24gYXQgZnVsbCBzaXplLgotCShfYmZkX3NhdmVfZXZheF9zZWN0aW9uKTogTWVtY3B5IHNlY3Rpb24gY29udGVudHMgZGlyZWN0bHkuCi0JKiBldmF4LmggKEFMUEhBX1JfU1dSRUwzMiwgQUxQSEFfUl9TV1JFTDY0KTogUmVtb3ZlLgotCShldmF4X3JlbG9jX3RhYmxlKTogUmVtb3ZlLgotCi0JKiBob3N0cy9hbHBoYXZtcy5oIChPX0FDQ01PREUpOiBEZWZpbmUgaWYgbmVlZGVkLgotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBiZXR0ZXIgc3VwcG9ydCBmb3IgREVDIEMgY29tcGlsYXRpb24KLQlBZGQgZXZheC5oIGRlcGVuZGVuY2llcwotCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBBZGQgY2FzZSBmb3IgMTYgYnl0ZSByZWxvYy4KLQkoQkZEX1JFTE9DX1NXUkVMMzIsQkZEX1JFTE9DX1NXUkVMNjQpOiBSZW1vdmUuCi0JKEJGRF9SRUxPQ19BTFBIQV9CQVNFUkVHKTogUmVtb3ZlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotVGh1IEF1ZyAgOCAwODoxNzozMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6ICBJZmRlZiBhcm91bmQgY2FsbHMgdG8gZ2V0dWlkIGFuZAotCWdldGdpZCBpZiBfV0lOMzIgaXMgZGVmaW5lZC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBSZW1vdmUgdW5uZWNlc3NhcnkgV0lOR0RCIGlmZGVmLgotCi1XZWQgQXVnICA3IDIzOjE5OjAwIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggYmZkLWluLmggYmZkLWluMi5oIG9wbmNscy5jIHJpc2NpeC5jIHNvbS5jIHRhcmdldHMuYzoKLQlDaGFuZ2UgTk9fRkxBR1MgdG8gQkZEX05PX0ZMQUdTIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggYW4gSFBVWAotCWluY2x1ZGUgZmlsZS4KLQkqIGxpYmJmZC5jOiAgQ3JlYXRlIGR1bW15IGdldHBhZ2VzaXplKCkgbWFjcm8gaWYgSEFWRV9HRVRQQUdFU0laRQotCWlzbid0IGRlZmluZWQuCi0KLVdlZCBBdWcgIDcgMTQ6MTE6NDQgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVERURfREVDTEFSQVRJT04gb24gc3Ryc3RyIGFuZAotCXJlYWxsb2MuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaCAoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KLQkocmVhbGxvYyk6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DLgotCi0JKiBhY2xvY2FsLm00IChCRkRfTkVFRF9ERUNMQVJBVElPTik6IEluY2x1ZGUgPHN0cmluZy5oPiBvcgotCTxzdHJpbmdzLmg+IGlmIHRoZXkgZXhpc3QuCi0KLQkqIGllZWUuYyAoaWVlZV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENhc3QgYmZkX2FsbG9jIHJldHVybi4KLQotV2VkIEF1ZyAgNyAxMjoxMjowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1pMzg2LmMgKGk4MDg2X2FyY2gpOiBBcmNoaXRlY3R1cmUgaW5mbyBmb3IgdGhlIGk4MDg2LgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEVyaWMgVmFsZXR0ZSA8dmFsZXR0ZUBjcmYuY2Fub24uZnI+OgotCSogZWxmMzItaTM4Ni5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgRklSU1RfSU5WQUxJRF9SRUxPQywKLQlMQVNUX0lOVkFMSURfUkVMT0MsIFJfMzg2XzE2LCBSXzM4Nl9QQzE2LCBSXzM4Nl84LCBSXzM4Nl9QQzguCi0JKGVsZl9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBuZXcgcmVsb2NzLgotCShlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBuZXcgcmVsb2NzLgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogSnVzdCBjYWxsIGFib3J0LgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCk6IENoZWNrIHRoYXQgdGhlIHJlbG9jIHR5cGUgaXMgdmFsaWQuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAgNiAxMjo1NDo1NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IEFkZGVkIFJfRDEwVl8zMi4KLQotTW9uIEF1ZyAgNSAxMzo0Mjo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRm9yIGEgbG9hZGFibGUgc2VjdGlvbiwKLQlvbmx5IGdldCB0aGUgTE1BIGZyb20gdGhlIHBoZHIgaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFydCBvZiB0aGUKLQlmaWxlLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogUmV3cml0ZSB0ZXN0cyBmb3Igc3RhcnRpbmcgYQotCW5ldyBzZWdtZW50IHRvIG1ha2UgdGhlbSBtb3JlIGNvbXByZWhlbnNpYmxlLiAgSWYgdGhlIHJlbGF0aW9uc2hpcAotCWJldHdlZW4gdGhlIExNQSBhbmQgdGhlIFZNQSBjaGFuZ2VkLCBzdGFydCBhIG5ldyBzZWdtZW50LiAgRG9uJ3QKLQljaGVjayBkeW5zZWMgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIHN0YXJ0IGEgbmV3IHNlZ21lbnQgZm9yIGEKLQl3cml0ZWFibGUgc2VjdGlvbjsgLU4gd2lsbCBub3cgaGFuZGxlIHRoaXMuCi0KLVRodSBBdWcgIDEgMjI6NDM6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IFJlbW92ZSAiZXNlbCIgY2hhbmdlcy4gIE5vdCB0aGUgcmlnaHQgYXBwcm9hY2guCi0JKiBzb20uYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogVXNlIFNUX0RBVEEgZm9yIHN5bWJvbHMKLQl3aGljaCBkb24ndCBoYXZlIGEgU09NIHN5bWJvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotCVJldmVyc2VzIGEgMTk5NCBjaGFuZ2UuCi0KLVdlZCBKdWwgMzEgMTU6NTA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSBsZCAtTiBtb3JlIHJlYXNvbmFibGUgZm9yIEVMRjoKLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiBEX1BBR0VEIGlzIG5vdCBzZXQsIHNldAotCXBoZHJfaW5fc2VjdGlvbiB0byBmYWxzZSwgYW5kIGFsd2F5cyB1c2UgYSBzaW5nbGUgbG9hZCBzZWdtZW50LgotCShlbGZfc29ydF9zZWN0aW9ucyk6IFNvcnQgc2VjdGlvbnMgYnkgTE1BIGFmdGVyIFZNQS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIERfUEFHRUQgaXMgbm90IHNldCwgZG9uJ3QKLQlhbGlnbiB0byBtYXhwYWdlc2l6ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgYSBzZWN0aW9uIGlzIGxvYWRlZCBidXQgbm90IHBhZ2UKLQlhbGlnbmVkLCBjbGVhciBEX1BBR0VELgotCi1XZWQgSnVsIDMxIDE1OjAwOjEyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogcmVsb2MuYzogKEJGRF9SRUxPQ19BUk1fT0ZGU0VUSU1NOCwgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwpOgotIAlBZGRlZCwgZm9yIGludGVybmFsIHVzZSBieSB0aGUgQVJNIGdhcy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0Ci0JKiBiZmQtaW4yLmg6IFJlYnVpbHQKLQotVHVlIEp1bCAzMCAxNDoxNDo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoUl9IUFBBX0VTRUwpOiBOZXcgZmllbGQgc2VsZWN0b3IuCi0JKGVfZXNlbCk6IFNpbWlsYXJseS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IElmIHdlIGVuY291bnRlciBhbiBlX2VzZWwsCi0JdGhlbiBnZW5lcmF0ZSBSX0NPTVAyIChQVVNIX1NZTSksIFJfREFUQV9FWFBSIGZpeHVwIHN0cmVhbS4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RBVEFfRVhQUiBqdXN0IGxpa2UgUl9DT0RFX0VYUFIuCi0KLVR1ZSBKdWwgMzAgMTM6MzE6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvIHRoZSByZWd1bGFyCi0JYXJjaGl2ZSBzZWFyY2ggYmVmb3JlIGxvb2tpbmcgZm9yIHN0cmlwcGVkIGR5bmFtaWMgb2JqZWN0cy4KLQotRnJpIEp1bCAyNiAxNzo1MTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBNYWtlIGV4cG9ydGluZyBhbiB1bmRlZmluZWQKLQlzeW1ib2wgYSB3YXJuaW5nIHJhdGhlciB0aGFuIGFuIGVycm9yLgotCi1XZWQgSnVsIDI0IDEyOjAyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBUcmFjayB0aGUgdmlydHVhbAotCW1lbW9yeSBwb3NpdGlvbiBzZXBhcmF0ZWx5IGZyb20gdGhlIGZpbGUgcG9zaXRpb24sIGFuZCB1c2UgaXQgdG8KLQljb21wdXRlIHRoZSBhbGlnbm1lbnQgYWRqdXN0bWVudC4KLQotVHVlIEp1bCAyMyAxMDo0MzozMSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IENoYW5nZWQgYWxsIHJlbG9jcyB0byAibG9uZyIKLSAJYW5kIGZpeGVkIG1hc2sgb24gUl9EMTBWXzEwX1BDUkVMX0wuCi0KLU1vbiBKdWwgMjIgMTU6MzA6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEluY2x1ZGUgImFvdXQvYXIuaCIuCi0JKG1pcHNfZWxmNjRfc2x1cnBfYXJtYXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZjY0X3dyaXRlX2FybWFwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjY0X2FyY2hpdmVfKik6IERlZmluZS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYXJjaGl2ZV9wKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCVVzZSBpbnN0ZWFkIG9mIGJmZF9nZW5lcmljX2FyY2hpdmVfcC4KLQkoYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuICBVc2UKLQlpbnN0ZWFkIG9mIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cy4KLQkoYmZkX2VsZk5OX21rZGFyY2hpdmUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuICBVc2UgaW5zdGVhZCBvZgotCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUuCi0JKFRBUkdFVF9CSUdfU1lNKTogSWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zIGlzIGRlZmluZWQsIHVzZQotCWJmZF9lbGZOTl9hcmNoaXZlIGluIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgcmF0aGVyIHRoYW4KLQlfYmZkX2FyY2hpdmVfY29mZi4KLQkoVEFSR0VUX0xJVFRMRV9TWU0pOiBMaWtld2lzZS4KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogQ2hlY2sgZm9yIGFuZCByZWplY3QgYW4gYXJjaGl2ZSBtYXAKLQluYW1lIG9mIC9TWU02NC8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogSGFuZGxlCi0JU0hUX01JUFNfTElCTElTVCwgU0hUX01JUFNfQ09OVEVOVCwgU0hUX01JUFNfU1lNQk9MX0xJQiwgYW5kCi0JU0hUX01JUFNfRVZFTlRTIHNlY3Rpb25zLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX0lGQUNFLAotCVNIVF9NSVBTX0NPTlRFTlQsIFNIVF9NSVBTX1NZTUJPTF9MSUIsIGFuZCBTSFRfTUlQU19FVkVOVFMKLQlzZWN0aW9ucy4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZCByZGF0YV9pbl90ZXh0IGZpZWxkLgotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ29weQotCXJkYXRhX2luX3RleHQgZnJvbSBiYWNrZW5kIGluZm8gdG8gdGRhdGEuICBDbGVhciBpdCBpZiBhbnkgZGF0YQotCXNlY3Rpb24gY29tZXMgYmVmb3JlIC5yZGF0YS4KLQkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgcmRhdGFfaW5fdGV4dCBmaWVsZCBpbgotCXRkYXRhIHJhdGhlciB0aGFuIGJhY2tlbmQgaW5mby4KLQotRnJpIEp1bCAxOSAxODoxNTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHRlc3QgZm9yIHdoZXRoZXIgYSBjb21waWxlciBoYXMgYSA2NCBiaXQKLQl0eXBlLiAgRnJvbSBKaW0gV2lsc29uIDx3aWxzb25AY3lnbnVzLmNvbT4uCi0KLVRodSBKdWwgMTggMTU6Mzk6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy1zZ2ktaXJpeDYqKTogTmV3IGhvc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIFZFUlNJT04sIEJGRF9IT1NUXzY0QklUX0xPTkcKLQkocmVwbGFjaW5nIEhPU1RfNjRCSVRMT05HKSwgQkZEX0hPU1RfNjRfQklUX0RFRklORUQsCi0JQkZEX0hPU1RfNjRfQklULCBhbmQgQkZEX0hPU1RfVV82NF9CSVQuICBBZGQgYmZkLWluMi5oOmJmZC1pbjIuaAotCXRvIEFDX09VVFBVVCBjYWxsLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogYmZkLWluLmggKEJGRF9BUkNIX1NJWkUpOiBEZWZpbmUgYXMgQHdvcmRzaXplQCwgbm90IEBXT1JEU0laRUAuCi0JKEJGRF9IT1NUXzY0X0JJVCk6IERlZmluZSBjb25kaXRpb25hbGx5LgotCShCRkRfSE9TVF9VXzY0X0JJVCk6IERlZmluZSB3aGVuIEJGRF9IT1NUXzY0X0JJVCBpcyBkZWZpbmVkLgotCShiZmRfdm1hKTogVHlwZWRlZiBhcyBCRkRfSE9TVF9VXzY0X0JJVC4KLQkoc3ltdmFsdWUsIGJmZF9zaXplX3R5cGUpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChkb19jbGVhbik6IFJlbW92ZSBiZmQtdG1wLmguCi0JKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBiZmQtaW4zLmguCi0JKHN0bXAtYmZkLmgpOiBKdXN0IGRvIGNvcHktaWYtY2hhbmdlIGJmZC1pbjMuaCBiZmQuaC4KLQkoYmZkLWluMy5oKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlnLmJmZCAoc3BhcmMtKi1zeXN2NCopOiBEb24ndCBidWlsZCBzdW5vc19iaWdfdmVjLiAgRnJvbQotCUFuZHJldyBHaWVydGggPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBJTlNUQUxMX1NITElCLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1NVQlNUIChJTlNUQUxMX1NITElCKS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogVXNlIEBJTlNUQUxMX1NITElCQC4KLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1pcml4NiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3Q6IEhhbmRsZSBJcml4IDYgc2hhcmVkIGxpYnJhcnkgbGlrZSBJcml4IDUuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgY2hlY2sgYW4gWE1DX1RECi0Jc3ltYm9sIGZvciBhIG1hZ2ljIG5hbWUuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgY2hhbmdlIHRoZSByZWxvYyBzeW1ib2wgZm9yIGFuCi0JWE1DX1REIHN5bWJvbC4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGdldCB0aGUgVE9DIG9mZnNldCBmb3IgYW4KLQlYTUNfVEQgc3ltYm9sLgotCi1UaHUgSnVsIDE4IDExOjM2OjMxIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIEVMRiBzdXBwb3J0IHRvIG1pcHMgY29uZmlnLCBjcmVhdGUgdGhlCi0JZWxmMzItdGFyZ2V0LmggZmlsZSBpbiB0aGUgb2JqZWN0IGRpci4KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBlbGZYWC10YXJnZXQuaCByZWZzIGF0IGJlZ2lubmluZ3Mgb2YgbGluZXMuCi0KLVdlZCBKdWwgMTcgMTg6MDI6MzIgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmM6IFJlZGlkIGRlYnVnIHNjaGVtZSAtIG51bWVyb3VzIGZwcmludGYncyBnb25lLgotCUFsc28gcmVtb3ZlZCBtb3N0IGFib3J0IGNhbGxzLCBpbiBmYXZvciBvZiB1c2luZyBiZmQgcmVwb3J0aW5nLgotCi1XZWQgSnVsIDE3IDE0OjUxOjUyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1kMTB2Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTKSBBZGQgZWxmMzItZDEwdi5vLgotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9kMTB2X2FyY2guCi0JKiBiZmQtaW4yLmg6IEFkZCBiZmRfZDEwdl9hcmNoLgotCSogY29uZmlnLmJmZCAoZDEwdi0qLSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiAoYmZkX2VsZjMyX2QxMHZfdmVjKSBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlLmluOiAoYmZkX2VsZjMyX2QxMHZfdmVjKSBOZXcgdmVjdG9yLgotCSogY3B1LWQxMHYuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkZWQgY2FzZSBiZmRfYXJjaF9kMTB2LgotCSogZWxmMzItZDEwdi5jOiBOZXcgZmlsZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiwgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwKLSAJQkZEX1JFTE9DX0QxMFZfMTgsIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMKTogRGVmaW5lLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfZDEwdl92ZWMpOiBOZXcgdmVjdG9yLgotCi1XZWQgSnVsIDE3IDEwOjU4OjU1IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlZCBib2d1cyBmcHJpbnRmCi0KLVR1ZSBKdWwgMTYgMjM6NDk6MDIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyBiZmQtaW4yLmg6ICBBZGQgYmZkX21hY2hfaTM4Nl9pMzg2IGFuZAotCWJmZF9tYWNoX2kzODZfaTgwODYgbWFjaGluZSB0eXBlcy4KLQotV2VkIEp1bCAxMCAxMjo0Mjo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBTRUNfQ09ERSBmb3IgX0lOSVQKLQlhbmQgX0ZJTkkgc2VjdGlvbnMuCi0KLVdlZCBKdWwgMTAgMTE6MTg6MjEgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBBL1VYIGRvZXMgbm90IHJlcXVpcmUKLQlzcGVjaWFsIGhhbmRsaW5nIG9mIHRoZSBfTElCIHNlY3Rpb24uCi0KLVR1ZSBKdWwgIDkgMTU6NTI6MjAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBVc2UgdGhlIGNvcnJlY3QKLQl2YWx1ZSBmb3IgUl9SRUxCWVRFLgotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IE9ubHkgInNocmlua3MiCi0JYXJyYXkgaWYgb25lIHdhcyBhbGxvY2F0ZWQuCi0KLVR1ZSBKdWwgIDkgMTI6MjE6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAa2suaW5mby5rYW5hZ2F3YS11LmFjLmpwPjoKLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZXcgZmllbGRzCi0JdXNlX3JsZF9vYmpfaGVhZCBhbmQgcmxkX3ZhbHVlLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBNYXJrIF9fcmxkX29ial9oZWFkIHN5bWJvbCBhcwotCWR5bmFtaWMuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIC5ybGRfbWFwIHNlY3Rpb24uICBJZgotCV9fcmxkX29ial9oZWFkIHN5bWJvbCBub3Qgc2VlbiwgY3JlYXRlIGFuIF9fcmxkX21hcCBzeW1ib2wuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE1ha2Ugc3BhY2UgaW4gLnJsZF9tYXAgc2VjdGlvbi4KLQlDcmVhdGUgYSBEVF9NSVBTX1JMRF9NQVAgZW50cnkgcmF0aGVyIHRoYW4gYSBEVF9ERUJVRyBlbnRyeS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU2F2ZSB2YWx1ZSBvZiBfX3JsZF9tYXAgb3IKLQlfX3JsZF9vYmpfaGVhZCBzeW1ib2wuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSGFuZGxlIERUX01JUFNfUkxEX01BUC4KLQotTW9uIEp1bCAgOCAxNjoxODowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBSZW1vdmUgQkZEX1JFTE9DXzMyX1BDUkVMIGVudHJ5LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBGb3IgUl9QUENfQUREUjE2X0hBLCB1c2UKLQlwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYy4KLQkocHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmLW1pcHMuYyAoc3RydWN0IG1pcHNfaGkpOiBEZWZpbmUuCi0JKG1pcHNfcmVmaGlfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0gCShtaXBzX3JlZmhpX2FkZHIsIG1pcHNfcmVmaGlfYWRkZW5kKTogUmVtb3ZlLgotCShtaXBzX3JlZmhpX3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBSRUZISSByZWxvY3MuCi0JKG1pcHNfcmVmbG9fcmVsb2MpOiBQcm9jZXNzIG1pcHNfcmVmaGlfbGlzdC4KLQkobWlwc19yZWxoaV9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc19yZWxoaV9hZGRyLCBtaXBzX3JlbGhpX2FkZGVuZCk6IFJlbW92ZS4KLQkobWlwc19yZWxoaV9yZWxvYyk6IE1haW50YWluIGEgbGlzdCBvZiB1bm1hdGNoZWQgUkVMSEkgcmVsb2NzLgotCShtaXBzX3JlbGxvX3JlbG9jKTogUHJvY2VzcyBtaXBzX3JlbGhpX2xpc3QuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFJFRkhJIG9yCi0JUkVMSEkgcmVsb2NzIGJlZm9yZSB0aGUgYXNzb2NpYXRlZCBSRUZMTyBvciBSRUxMTyByZWxvYy4KLQotRnJpIEp1bCAgNSAxOToyNzo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCByZWxvY19jb3VudCBmaWVsZHMuCi0KLVRodSBKdWwgIDQgMTI6MDA6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgY3JlYXRlIGR5bmFtaWMKLQlzZWN0aW9ucyB1bmxlc3MgdGhpcyBpcyBhIFN1bk9TIGxpbmsuCi0KLQkqIFZFUlNJT046IFNldCB0byAyLjcuMS4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi1XZWQgSnVsICAzIDE0OjU5OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4NmFvdXQuYzogSW5jbHVkZSAiYW91dC9hb3V0NjQuaCIuCi0gCShpMzg2YW91dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmUuCi0KLQkqIG5ldGJzZC5oIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogTWFrZSBzdXJlIHRoYXQKLQlhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgaXMgY2FsbGVkIGJlZm9yZSBmaWRkbGluZyB3aXRoIHRoZSBtYWdpYwotCW51bWJlci4KLQotVHVlIEp1bCAgMiAyMzozMDozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRml4IGNhc3RzIG9mIHBzaW5mby4KLQotU3VuIEp1biAzMCAxMzozNDozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChpdG9zLCBzdG9pKTogRG9uJ3QgZGVmaW5lLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBpMzg2bHlueC5jIChLRUVQSVQpOiBEZWZpbmUgYXMgdWRhdGEuaS4KLQkoTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX291dCkpOiBEb24ndCB1c2Ugc3RvaS4KLQkoTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkpOiBMaWtld2lzZS4KLQkqIHJpc2NpeC5jIChyaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVXNlIHVkYXRhLmkgcmF0aGVyIHRoYW4KLQlmbGFncy4gIERvbid0IHVzZSBzdG9pLgotCi0JKiBlbGYzMi1taXBzLmMgKEVMRl9NQUdQQUdFU0laRSk6IENoYW5nZSBkZWZpbml0aW9uIHRvIDB4MTAwMC4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IERvbid0IHN0YXJ0IGEgbmV3IHNlZ21lbnQgZm9yCi0gCWEgd3JpdGFibGUgc2VjdGlvbiBpZiBpdCdzIG9uIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIHByZXZpb3VzCi0gCXNlZ21lbnQuICBSZXNldCB0aGUgd3JpdGFibGUgdmFyaWFibGUgZm9yIGEgcmVhZG9ubHkgc2VjdGlvbi4KLQotU2F0IEp1biAyOSAxNjoxODo1MSAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IE1pc3NpbmcgaW5pdGlhbGl6YXRpb25zIG9mCi0JZmlyc3RfdGh1bmtfYWRkcmVzcywgdGh1bmtfc2l6ZSwgYW5kIGltcG9ydF90YWJsZV9zaXplLgotCSogcGVpY29kZS5oOiBJbXByb3ZlZCBzb21lIGRpYWdub3N0aWNzIHJlZ2FyZGluZyBlZGF0YSBzZWN0aW9ucy4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEVhcmxpZXIgZXJyb3IgY2hlY2sKLQlvbiBJTUdMVUUgcmVsb2NzLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSW1wcm92ZWQgZGlhZ25vc3RpYyBmb3IgbGFyZ2UgVE9DREVGTidzLgotCShUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkIG1pc3NpbmcgRF9QQUdFRC4KLQotRnJpIEp1biAyOCAxMzo0ODo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBBbiB1bmRlZmluZWQgc3ltYm9sCi0Jd2l0aCBYQ09GRl9ERUZfRFlOQU1JQyBzZXQgaXMgcmVhbGx5IGRlZmluZWQuCi0JKHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBPbmx5IGNyZWF0ZSBzcGVjaWFsIHNlY3Rpb25zIGlmIHVzaW5nIGFuCi0JWENPRkYgaGFzaCB0YWJsZS4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSB4Y29mZi1wb3dlcm1hYyBsaWtlCi0JYWl4Y29mZi1yczYwMDAuCi0JKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQotRnJpIEp1biAyOCAxMToxNzowMCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgZmxhZ3MKLQlmaWVsZC4KLQkoQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSKTogRGVmaW5lLgotCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX01FTSk6IERlZmluZS4KLQkoQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DKTogRGVmaW5lLgotCShlbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgZmxhZ3MgZmllbGQuCi0JKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IFJlY29yZCB0eXBlcyBvZiBMSVRVU0UgZW50cmllcyB0aGF0Ci0JYXJlIGZvdW5kIGZvciBMSVRFUkFMIHJlbG9jcy4KLQkoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzIGl0cyBhZGRyZXNzCi0JdGFrZW4sIHdlIGNhbm5vdCBnZW5lcmF0ZSBhIC5wbHQgZW50cnkgZm9yIHRoZSBzeW1ib2wuCi0KLVRodSBKdW4gMjcgMTE6MjQ6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19JU0NfUE9TSVgsIGFuZCBjaGVjayBmb3Igc2V0aXRpbWVyIGFuZAotCXN5c2NvbmYgZnVuY3Rpb25zIChmb3IgZ3Byb2YpLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVdlZCBKdW4gMjYgMTY6Mjk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2FyY2hpdmVfcCk6IENoZWNrIHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbgotCWFuIGFyY2hpdmUgaWYgaXQgaGFzIGEgbWFwLiAgSWYgdGhlIG9iamVjdCBmaWxlIGhhcyB0aGUgd3JvbmcKLQl4dmVjLCByZWplY3QgaXQuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfYWRqdXN0X3JlbG9jX2luKTogU2V0IHRoZSBhZGRlbmQgZm9yIGEKLQlCUkFERFIsIFNSRUwxNiwgU1JFTDMyLCBvciBTUkVMNjQgcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbAotCXN5bWJvbC4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogVXNlIFJFTFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBVc2UgRklMSFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfc3ltX291dCk6IFVzZSBTWU1FU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogVXNlIEFVWEVTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2xpbmVub19vdXQpOiBVc2UgTElORVNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBVc2UgQU9VVFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSBTQ05IU1osIG5vdCBzaXplb2YuCi0JKiBwZWljb2RlLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIEp1biAyNSAxNToyODozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQ29tbWVudCBvdXQgY29kZQotCWRlYWxpbmcgd2l0aCBtYWtpbmcgR09UIHBvaW50ZXJzIG5lZ2F0aXZlIG9mIHRoZSBHT1Qgc3ltYm9sIGZvcgotCW5vdy4KLQotVHVlIEp1biAyNSAxMTo0MToyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QKLQlpbmNyZW1lbnQgdGhlIC5yZWxhLnBsdCBzaXplIHVudGlsIGFmdGVyIHdlJ3JlIGRvbmUgY3JlYXRpbmcgdGhlCi0JLnBsdCBlbnRyeS4KLQkoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIC5wbHQgZW50cnkgdG8gbG9hZCB0aGUKLQkucmVsYS5wbHQgb2Zmc2V0IGRpcmVjdGx5IHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIGl0LgotCi1Nb24gSnVuIDI0IDE3OjE1OjEwIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiwgKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIpOgotCVVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotICAgICAgICAqIGRvYy9NYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwKLQlpbmNsdWRlZGlyLCBJTlNUQUxMLCBJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQKLQl2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIpOiBEZWxldGVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgdjIuNSBvciBoaWdoZXIuCi0gICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gSnVuIDI0IDIyOjUwOjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBGaXggdHlwbyBpbiBSX0VORF9UUlkgZm9yIGV4Y2VwdGlvbgotCWhhbmRsaW5nIGNvZGUgPiAxayBhd2F5LgotCi1Nb24gSnVuIDI0IDE4OjQxOjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBJZiBERUJVRyBpcwotCWRlZmluZWQsIG91dHB1dCB3aGVuZXZlciB0aGUgc3ltYm9sIGlzIHVwZGF0ZWQuCi0KLU1vbiBKdW4gMjQgMTc6NTg6MTIgMTk5NiAgSm91a2UgTnVtYW4gIDxqbnVtYW5AYmF6aXMubmw+Ci0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IERvbid0IHNldCBzaF9hZGRyIG9mIGEgbm9uIFNFQ19BTExPQwotCXNlY3Rpb24gdG8gMCBpZiB1c2VyX3NldF92bWEgaXMgc2V0LgotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQotU3VuIEp1biAyMyAyMDo0Mjo1MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JUGFydGlhbGx5IHVuZG8gcGF0Y2ggb2YgSnVuIDIwLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBVc2UgQ09GRl9JTUFHRV9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgUmUtYWRkIGRlbGV0ZWQgY29kZSwgYnV0Ci0JdXNlICNpZmRlZiBDT0ZGX1dJVEhfUEUsIG5vdCBDT0ZGX09CSl9XSVRIX1BFLgotCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUmUtYWRkICNpZmRlZi4KLQotRnJpIEp1biAyMSAxNzozODoxNSAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBtZXJsaW4uZ2NzLnJlZHN0b25lLmFybXkubWlsPgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgKi0qLXJ0ZW1zKiBjb25maWd1cmF0aW9ucy4KLQotRnJpIEp1biAyMSAxNToxOTo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgYmZkX2FyY2hfYWxwaGEgY2FzZS4KLQotRnJpIEp1biAyMSAxMjozNToyNyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChhbHBoYS0qLWxpbnV4ZWNvZmYqKTogTmV3IHRhcmdldC4KLQkoYWxwaGEtKi1saW51eCosIGFscGhhLSotZWxmKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmNjRfYWxwaGFfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjY0X2FscGhhX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGY2NF9hbHBoYV92ZWMgaWYgQkZENjQuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfQUxQSEFfR1BESVNQKTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGVsZjY0LWFscGhhLm8uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGY2NC1hbHBoYS5jLgotCi1UaHUgSnVuIDIwIDE4OjE0OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYXJtYXBfaGFzaCk6IElmIGhsb2cgaXMgMCwganVzdCByZXR1cm4gMCwgcmF0aGVyCi0JdGhhbiByZWx5aW5nIG9uIGEgcmlnaHQgc2hpZnQgb2YgMzIuCi0KLVRodSBKdW4gMjAgMTE6MDA6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBDaGFuZ2UgQ09GRl9JTUFHRV9XSVRIX1BFCi0JaWZkZWYgdG8gQ09GRl9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgRGVsZXRlIENPRkZfT0JKX1dJVEhfUEUuCi0JKiBwZS17YXJtLGkzODYscHBjfS5jIChDT0ZGX09CSl9XSVRIX1BFKTogRGVsZXRlLgotCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVsZXRlIGlmZGVmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLCBhbHdheXMgaW5jbHVkZS4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6ICIuZHJlY3R2ZSIgZG9lc24ndCBoYXZlIHRyYWlsaW5nIDAuCi0KLVdlZCBKdW4gMTkgMTE6Mzc6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogRml4IHVwIHRoZSB0ZXN0IGZvciAtVHRleHQgdG8KLQlhcHByb3hpbWF0ZSB0aGUgY29ycmVjdCBhbnN3ZXIgaWYgU0laRU9GX0hFQURFUlMgd2FzIG5vdCB1c2VkLgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHNlY3Rpb24gZmlsZQotCXBvc2l0aW9uIGJhc2VkIG9uIExNQSByYXRoZXIgdGhhbiBWTUEuCi0KLVdlZCBKdW4gMTkgMTE6MTk6MjUgMTk5NiAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUlDNSA2MC8zLzE0MiAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogRG9uJ3Qgb3V0cHV0IGFueQotCXN5bWJvbHMgaWYgaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsLgotCi1UdWUgSnVuIDE4IDE1OjE3OjM2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmM6IFJlbW92ZSAjaWYgMCBjb2RlLgotCShjb21wYXRhYmxlKTogRG9uJ3QgYWxsb3cgbWl4aW5nL21hdGNoaW5nIG9mIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9oODMwMHMpOiBBZGQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmLWg4MzAwLmMgKGZ1bmN2ZWNfaGFzaF9uZXdmdW5jKTogSGFuZGxlIEg4L1MgdG9vLgotCShCQURNQUcpOiBMaWtld2lzZS4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IExpa2V3aXNlLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IExpa2V3aXNlLgotCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgotCSogY3B1LWg4MzAwLmMgKGg4MzAwX3NjYW4pOiBMaWtld2lzZS4KLQlBZGQgSDgvUyB0byBiZmRfaDgzMDBfYXJjaCBsaXN0LgotCi1UdWUgSnVuIDE4IDE0OjQyOjU4IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JQWRkZWQgc3VwcG9ydCBmb3IgQWxwaGEgT3BlblZNUzoKLQkqIGV2YXguaCwgZXZheC1hbHBoYS5jLCBldmF4LWVnc2QuYywgZXZheC1lbWguYzogTmV3IGZpbGVzLgotCSogZXZheC1ldGlyLmMsIGV2YXgtbWlzYy5jLCBob3N0cy9hbHBoYXZtcy5oOiBOZXcgZmlsZXMuCi0JKiBjb25maWcuaC12bXMsIG1ha2VmaWxlLnZtczogTmV3IGZpbGVzLgotCSogY29uZmlnLmJmZCAoYWxwaGEtKi0qdm1zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGV2YXhfYWxwaGFfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfU1dSRUwzMiwgQkZEX1JFTE9DX1NXUkVMNjQpOiBEZWZpbmUuCi0JKEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFLCBCRkRfUkVMT0NfQUxQSEFfQkFTRVJFRyk6IERlZmluZS4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIpOiBEZWZpbmUuCi0JKGV2YXhfYWxwaGFfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgZWNvZmZhbHBoYV9saXR0bGVfdmVjIGFuZCBldmF4X2FscGhhX3ZlYwotCWlmIEJGRDY0IGlzIGRlZmluZWQuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBldmF4LWFscGhhLm8sIGV2YXgtZWdzZC5vLCBldmF4LWV0aXIubywKLQlldmF4LWVtaC5vLCBhbmQgZXZheC1taXNjLm8uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBldmF4LWFscGhhLmMsIGV2YXgtZWdzZC5jLAotCWV2YXgtZXRpci5jLCBldmF4LWVtaC5jLCBhbmQgZXZheC1taXNjLmMuCi0JKEhGSUxFUyk6IEFkZCBldmF4LmguCi0KLVR1ZSBKdW4gMTggMTM6NTQ6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBNYWtlIG5hbWUgYSBjb25zdAotCXBvaW50ZXIuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMTcgMTA6MDY6NTAgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNvbS5oIChSX0hQUEFfQkVHSU5fVFJZLCBSX0hQUEFfRU5EX1RSWSk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfQkVHSU5fVFJZIGFuZCBSX0VORF9UUlkuCi0KLU1vbiBKdW4gMTcgMTI6NDk6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjcmVhdGUgYSByZWxvYwotCWZvciBSX01JUFNfUkVMMzIgYW5kIFJfTUlQU18zMiByZWxvY3MgaWYgbm8gZHluYW1pYyBzZWN0aW9ucyB3ZXJlCi0JY3JlYXRlZC4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogT25seSBjcmVhdGUgLnJlbC5keW4gZm9yIFJfTUlQU19SRUwzMiBhbmQKLQlSX01JUFNfMzIgcmVsb2NzIGlmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0KLVRodSBKdW4gMTMgMjA6MTQ6NTEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IFVzZSBwZWlfc2VjdGlvbl9kYXRhIHJhdGhlciB0aGFuCi0JX2Nvb2tlZF9zaXplLiAgQ29ycmVzcG9uZHMgdG8gTWF5IDEzIGNoYW5nZSBpbiBjb2ZmY29kZS5oLgotCi1UaHUgSnVuIDEzIDEwOjIzOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB0aGVyZSBhcmUgbG9uZwotCXNlY3Rpb24gbmFtZXMsIGFsd2F5cyBzZXQgdGhlIGZfc3ltcHRyIGZpZWxkLCBldmVuIGlmIHRoZXJlIGFyZSBubwotCXN5bWJvbHMuCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogRG9uJ3QgY2xlYXIgdGhlIGZfc3ltcHRyIGZpZWxkCi0JaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQltYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUuCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IENoZWNrIHRoYXQgdGhlcmUgYXJlIHNvbWUgc3ltYm9scwotCWJlZm9yZSB0cnlpbmcgdG8gcmVhZCB0aGUgc3RyaW5nIHRhYmxlIHNpemUuCi0KLVdlZCBKdW4gMTIgMTE6MTY6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFdoZW4gY29uc2lkZXJpbmcgd2hldGhlcgotCXRvIHJlcGxhY2UgYSBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCB3aXRoIGEgc3ltYm9sIGZyb20gYW5vdGhlcgotCWR5bmFtaWMgb2JqZWN0LCBkbyB0aGUgcmVwbGFjZW1lbnQgaWYgdGhlIGV4aXN0aW5nIHN5bWJvbCBpcwotCWdsb2JhbCBsaW5rYWdlIGNvZGUuCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZXhwbGljaXRseQotCWZvciBfcHRyZ2wsIGFuZCB0cmVhdCBpdCBhcyBnbG9iYWwgbGlua2FnZSBjb2RlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogTm90aWNlIGlmIHdlIGZpbmQgYQotCWZpbGVuYW1lIG9yIE5fU08gc3ltYm9sIHBhc3QgdGhlIG9mZnNldCwgYW5kIHVzZSBpdCB0byBpbmRpY2F0ZQotCXRoYXQgdGhlcmUgaXMgbm8gbGluZSBudW1iZXIgb3IgZnVuY3Rpb24gd2hlbiBhcHByb3ByaWF0ZS4KLQotVHVlIEp1biAxMSAxNToyNDo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBTZXQgWENPRkZfREVGX1JFR1VMQVIgZm9yIGEKLQljb21tb24gc3ltYm9sIGRlZmluZWQgYnkgdGhlIGxpbmtlci4gIERvbid0IGV4cG9ydCBmdW5jdGlvbiBjb2RlCi0JZXZlbiBpZiBleHBvcnRfZGVmaW5lZHMgaXMgc2V0LgotCi1Nb24gSnVuIDEwIDExOjU3OjI3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IEFkZCBuZXcgZW50cmllcyBmb3IgUl9CQ0NfSU5WCi0JYW5kIFJfSk1QX0RFTC4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9CQ0NfSU5WIGFuZCBSX0pNUF9ERUwuCi0JKGg4MzAwX3N5bWJvbF9hZGRyZXNzX3ApOiBOZXcgZnVuY3Rpb24uCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBFbGltaW5hdGUganVtcHMgbWFkZSB1bm5lY2Vzc2FyeSBieQotCXJlbGF4aW5nLgotCi1TdW4gSnVuICA5IDE2OjMwOjIwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogRml4IG1hbnkgbWlub3Igc3BhY2luZwotCXByb2JsZW1zLgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlLCBjYXNlcyBSX0pNUDEsIFJfSk1QMik6IEFkanVzdCAiZG90IgotCWNvcnJlY3RseSBmb3IgdGhlIHR3byB2YXJpYW50cy4gIEFsbG93IHJlbGF4aW5nIGlmIHRoZSB0YXJnZXQKLQlpcyAxMjggYnl0ZXMgYXdheSBzaW5jZSBhZnRlciByZWxheGF0aW9uIGl0J2xsIGJlIDEyNiBieXRlcyBhd2F5LgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlLCBjYXNlIFJfUENSV09SRCk6IENvcnJlY3RseSBhZGp1c3QKLQkiZG90IiBhbmQgInZhbHVlIi4gIEFsbG93IHJlbGF4aW5nIGlmIHRoZSB0YXJnZXQgaXMgMTI4IGJ5dGVzCi0JYXdheSBzaW5jZSBhZnRlciByZWxheGF0aW9uIGl0J2xsIGJlIDEyNiBieXRlcyBhd2F5LgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBLZWVwIHJlbGF4aW5nCi0JdGhlIGdpdmVuIHNlY3Rpb24gdW50aWwgbm90aGluZyBjaGFuZ2VzLgotCi1UaHUgSnVuICA2IDE1OjI0OjQ1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBSZW1vdmUgdGhlIF9QREFUQQotIAlhbGlnbm1lbnQgaGFjay0td2UgY2FuIGdldCB0aGUgbG5ub3B0ciBpbmZvIGFub3RoZXIgd2F5IHdpdGhvdXQKLSAJc3VkZGVubHkgaW5jcmVhc2luZyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gIFNldCB0aGUgZmxhZ3MgZm9yCi0JdGhlIF9QREFUQSBzZWN0aW9uLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEbyBzby4KLQotVGh1IEp1biAgNiAxMToyNDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBQdXQgYSB0aW1lc3RhbXAgaW4gdGhlIGZpbGUKLQl0byBrZWVwIHRoZSBIUCBlbXVsYXRvciBkYXRhYmFzZSBoYXBweS4KLQotCSogY29uZmlnLmJmZDogUmVjb2duaXplIHBvd2VycGMtKi1saW51eCogYW5kIHBvd2VycGNsZS0qLWxpbnV4Ki4KLQlGcm9tIEtldmluIEJ1ZXR0bmVyIDxrZXZAcHJpbWVuZXQuY29tPi4KLQotV2VkIEp1biAgNSAxNToxNjowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3QgdHJ5IHRvIHByaW50IHRoZQotCW5hbWUgb2YgYSBOVUxMIHNlY3Rpb24uCi0KLVR1ZSBKdW4gIDQgMTg6NTM6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJZiBub3RpY2VfYWxsIGlzCi0Jc2V0LCBhbHdheXMgY2FsbCB0aGUgbm90aWNlIGNhbGxiYWNrLgotCi0JKiBWRVJTSU9OOiBJbmNyZW1lbnQgZm9yIGJmZGxpbmsuaCBjaGFuZ2UuCi0KLU1vbiBKdW4gIDMgMTE6MDE6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik6IFNldCB0byA0LgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGRpZmZlcmVudGx5IHNpemVkCi0JdHJhaWxpbmcgYWxpZ25tZW50IHJlbG9jLgotCi0JKiBiZmQtaW4uaDogVXNlICNlcnJvciBpZiBCRkRfSE9TVF82NF9CSVQgY2FuIG5vdCBiZSBkZWZpbmVkLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBXYXJuIGlmIHRoZXJlIGlzIG5vIGtub3duIDY0IGJpdCB0eXBlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBwcGNib290Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBwcGNib290LmMuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBjLgotCUZyb20gUGVyIEZvZ2Vsc3Ryb20gPHBlci5mb2dlbHN0cm9tQG1haWxib3gyMDAuc3dpcG5ldC5zZT4uCi0KLVNhdCBKdW4gIDEgMjE6NDk6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbikKLQkoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCk6IE1vdmUgZnJvbSBoZXJlLi4uCi0JKiBlbGYzMi1taXBzLmMgKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbikKLQkoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCk6IC4uLnRvIGhlcmUuCi0KLUZyaSBNYXkgMzEgMTM6NTE6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEltcHJvdmUgcmVsb2Mgc3BlY2lhbF9mdW5jdGlvbnMgYW5kIGhhbmRsaW5nIG9mCi0JU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2hpMTZfcmVsb2MgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfbG8xNl9yZWxvYyBhbmQKLQltYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9nb3QxNl9yZWxvYyBhbmQKLQltYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MKLQlhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShncHJlbDE2X3dpdGhfZ3ApOiBDaGVjayBob3d0by0+c3JjX21hc2sgYmVmb3JlIHVzaW5nIHZhbHVlIGluCi0JaW5zbi4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfZ3ByZWwzMl9yZWxvYwotCWFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKGdwcmVsMzJfd2l0aF9ncCk6IENoZWNrIGhvd3RvLT5zcmNfbWFzayBiZWZvcmUgZmV0Y2hpbmcgdmFsdWUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0KTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogQWNjZXB0IC5NSVBTLm9wdGlvbnMgYXMgYSBuYW1lCi0JZm9yIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogQ29uc2lkZXIgLk1JUFMub3B0aW9ucyB0byBiZSB0aGUKLQluYW1lIG9mIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFNldCB0aGUgR1AgdmFsdWUgaW4gYQotCVNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoYmZkX2VsZjMyX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCSogZWxmLWJmZC5oIChfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWNsYXJlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCi0JKiBjb2ZmLXc2NS5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogUmVuYW1lIFJfTU9WQlsxMl0gdG8KLQlSX01PVjE2QlsxMl0sIHRvIG1hdGNoIGNoYW5nZSBpbiBjb2ZmL2ludGVybmFsLmguCi0KLVRodSBNYXkgMzAgMTI6Mzg6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gcHJvdmlkZSBiZXR0ZXIgc3VwcG9ydCBmb3IKLQl3cml0aW5nIGZpbGVzIGFuZCBmb3IgZ2FzLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX29iamVjdF9wKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2YgbWlwc19lbGZfb2JqZWN0X3AuCi0JKG1pcHNfZWxmMzJfb2JqZWN0X3ApOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9vYmplY3RfcDsgY2FsbAotCV9iZmRfbWlwc19lbGZfb2JqZWN0X3AuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZy4KLQkobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZzsgY2FsbAotCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nLgotCShfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKG1pcHNfZWxmMzJfZWNvZmZfZGVidWdfc3dhcCk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcC4KLQkqIGVsZi5jIChfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogVXNlIGFzeW1ib2wgcmF0aGVyIHRoYW4KLQlzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5LgotCShfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbQotCWVsZmNvZGUuaDp2YWxpZGF0ZV9yZWxvYy4KLQkqIGVsZmNvZGUuaCAodmFsaWRhdGVfcmVsb2MpOiBSZW1vdmU7IG1vdmVkIGludG8gZWxmLmMgYW5kIHJlbmFtZWQKLQl0byBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIGVsZi1iZmQuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEb24ndCBkZWZpbmUKLQlpZiBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2JqZWN0X3ApOiBIYW5kbGUgRV9NSVBTX0FSQ0hfNC4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCi1XZWQgTWF5IDI5IDE2OjE1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCTY0LWJpdCBNSVBTIEVMRiBBQkkgb2JqZHVtcCBzdXBwb3J0OgotCSogZWxmNjQtbWlwcy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGVsZjY0LW1pcHMuby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjY0LW1pcHMuYy4KLQkqIGNvbmZpZy5iZmQgKG1pcHMqZWwtKi1lbGYqKSBBZGQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGFuZAotCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyB0byB0YXJnX3NlbHZlY3MuCi0JKG1pcHMqLSotZWxmKik6IExpa2V3aXNlLgotCSogY29uZmluZ3VyZS5pbjogQWRkIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBhbmQKLQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgdG8gdmVjdG9yIHN3aXRjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IE5ldyBmdW5jdGlvbiwKLQlicm9rZW4gb3V0IG9mIG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkci4gIENhbGwgbmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVwZGF0ZSBuYW1lIG9mIHJlbmFtZWQgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgb2YKLQl3cml0ZV9vdXRfcGhkcnMgdG8gYmUgY29uc3QuICBMaWtld2lzZSBmb3Igc2Vjb25kIHBhcmFtZXRlciBvZgotCXN3YXBfc3ltYm9sX291dC4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHJlbF9oZHIyIGZpZWxkLgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY19pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcGhkcl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9waGRyX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9keW5faW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc2x1cnBfc3ltYm9sX3RhYmxlKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3dyaXRlX291dF9waGRycyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9keW5fb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlIGFzc2VydGlvbiByZXF1aXJpbmcKLQlTSFRfUkVML1NIVF9SRUxBIHRvIG1hdGNoIHVzZV9yZWxhX3AuICBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVsb2MKLQlzZWN0aW9uIGZvciB0aGUgc2VjdGlvbiwgYWRkIHRoZSBuZXcgb25lIHRvIHJlbF9oZHIyLiAgSW5jcmVtZW50Ci0JcmVsb2NfY291bnQgcmF0aGVyIHRoYW4gc2V0dGluZyBpdC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERlZmluZSBuYW1lIGFzIG1hY3JvLgotCVJlbW92ZSBzdGF0aWMgZGVjbGFyYXRpb24uCi0JKGVsZl93cml0ZV9zaGRyc19hbmRfZWhkcik6IERlZmluZSBuYW1lIGFzIG1hY3JvLgotCShlbGZfd3JpdGVfb3V0X3BoZHJzKTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX2VoZHJfaW4sIGVsZl9zd2FwX2VoZHJfb3V0KTogRGVjbGFyZS4KLQkoZWxmX3N3YXBfc2hkcl9pbiwgZWxmX3N3YXBfc2hkcl9vdXQpOiBEZWNsYXJlLgotCShlbGZfc3dhcF9zeW1ib2xfaW4pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoZWxmX3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9laGRyX2luLCBlbGZfc3dhcF9laGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9zaGRyX2luLCBlbGZfc3dhcF9zaGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9waGRyX2luLCBlbGZfc3dhcF9waGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9yZWxvY19pbiwgZWxmX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3JlbG9jYV9pbiwgZWxmX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShlbGZfd3JpdGVfb3V0X3BoZHJzKTogUmVuYW1lIGZyb20gd3JpdGVfb3V0X3BoZHJzLiAgQ2hhbmdlIHNlY29uZAotCXBhcmFtZXRlciB0byBiZSBjb25zdC4gIE1ha2Ugbm9uLXN0YXRpYy4KLQkoZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogUmVuYW1lIGZyb20gd3JpdGVfc2hkcnNfYW5kX2VoZHIuCi0JTWFrZSBub24tc3RhdGljLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTWFrZSBub24tc3RhdGljLgotCShOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykpOiBVcGRhdGUgbmFtZXMgb2YgcmVuYW1lZCBmdW5jdGlvbnMuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGVsZl9iYWNrZW5kX3NpemVfaW5mbyk6IExpa2V3aXNlLgotCShlbGZOTl9iZWQpOiBVc2UgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfYmlnbWlwc192ZWMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYW5kCi0JYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIGlmIEJGRDY0IGlzIGRlZmluZWQuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQWRkIGNhc3QgdG8gZnByaW50ZiBhcmd1bWVudC4KLQotVHVlIE1heSAyOCAxMTo0MjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogSW5zZXJ0IG5vcCBpbnN0cnVjdGlvbnMsIG5vdAotCXplcm9lcywgaW4gYWxpZ25tZW50IGhvbGVzLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogTWFrZSByb29tIGZvciB0aGUKLQlwb3RlbnRpYWwgbGVhZGluZyB1bmRlcnNjb3JlIGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgotCi1GcmkgTWF5IDI0IDE0OjI4OjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG8gbm90IHB1dCBzbWFsbCBjb21tb24KLQlzeW1ib2xzIGludG8gLnNic3MgaWYgdGhpcyBpcyBhIHJlbG9jYXRhYmxlIGxpbmsuCi0KLVRodSBNYXkgMjMgMTI6MjY6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IFdhcm4gYWJvdXQKLQl1bmRlZmluZWQgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0KLUZyaSBNYXkgMTcgMTM6NTQ6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmM6IEFkZCBhIGJ1bmNoIG9mIG5ldyBjb2RlIGFuZCBzdGF0aWMgY29uc3QgYXJyYXlzIHRvCi0Jc3VwcG9ydCBhbGlnbmluZyBsb2FkcyBhbmQgc3RvcmVzIG9uIGZvdXIgYnl0ZSBtZW1vcnkgYm91bmRhcmllcy4KLQlBbHNvOgotCShzaF9jb2ZmX2hvd3Rvcyk6IEFkZCBlbnRyaWVzIGZvciBSX1NIX0NPREUsIFJfU0hfREFUQSBhbmQKLQlSX1NIX0xBQkVMLgotCShzaF9yZWxheF9zZWN0aW9uKTogTG9vayBmb3IgUl9TSF9DT0RFIHJlbG9jcy4gIElmIHdlIGZpbmQgb25lLAotCWNhbGwgc2hfYWxpZ25fbG9hZHMuCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IG1hcmsgUl9TSF9DT0RFIG9yIFJfU0hfREFUQSByZWxvY3MKLQlhcyB1bnVzZWQuCi0KLVRodSBNYXkgMTYgMTY6MzQ6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjYWNoZS5jIChiZmRfb3Blbl9maWxlKTogVW5saW5rIHRoZSBmaWxlIGJlZm9yZSBvcGVuaW5nIGl0IGZvcgotCXdyaXRlLiAgRnJvbSBNYXJ0eSBMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogU2V0IG9wZW5lZF9vbmNlLgotCi1UdWUgTWF5IDE0IDEyOjM1OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IENsZWFyIGV4dGVybmFsX3JlbG9jcyBjYWNoZSBhZnRlcgotCWZyZWVpbmcgaXQuCi0KLQkqIGxpYmJmZC5jOiBSZW1vdmUgI2lmZGVmIEZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVgsIGFuZCBjb21waWxlCi0JdGhlIGNvZGUgdW5jb25kaXRpb25hbGx5LgotCi1Nb24gTWF5IDEzIDE5OjUxOjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUgc3RydWN0dXJlLgotCShwZWlfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG1hY3JvLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsCi0Jc3RvcmUgc19wYWRkciBmaWVsZCBpbiBwZWlfc2VjdGlvbl9kYXRhLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFVzZSBwZWlfc2VjdGlvbl9kYXRhIHJhdGhlcgotCXRoYW4gX2Nvb2tlZF9zaXplLCBhbmQgZG9uJ3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHZhbHVlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIENPRkZfT0JKX1dJVEhfUEUsIHNldCBzX3BhZGRyIHRvCi0JMC4gIElmIENPRkZfSU1BR0VfV0lUSF9QRSwgc2V0IHNfcGFkZHIgdG8gcGVpX3NlY3Rpb25fZGF0YS4KLQkqIHBlaWNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IERlZmluZSBpZgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLSAJKHBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLQotV2VkIE1heSAgOCAxNjoxMDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19zZXRfYXJjaF9tYWNoKTogV3JpdGUgYXMgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhCi0JbWFjcm8gZGVmaW5pdGlvbi4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiBhbiBhcmNoaXZlIGhhcwotCW5vIG1hcCwganVzdCBjaGVjayBlYWNoIG1lbWJlciBpbiB0dXJuIHRvIHNlZSB3aGV0aGVyIGl0IGlzCi0JcmVxdWlyZWQuCi0KLVdlZCBNYXkgIDggMDk6MTc6MzQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfb2JqZWN0X3ApOiBDaGVjayBmb3IgdHlwZSAweDQxIGluIHBhcnRpdGlvbgotCXRhYmxlLiAgQ2FsbCBCRkRfQVNTRVJUIHRvIHZhbGlkYXRlIGhlYWRlciBzaXplLCBpbnN0ZWFkIG9mCi0JY2FsbGluZyBmYXRhbC4KLQkocHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFB1dCBxdW90ZXMgYXJvdW5kIHBhcnRpdGlvbgotCW5hbWUuCi0KLVR1ZSBNYXkgIDcgMTY6MTA6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGNib290LmM6IE5ldyB0YXJnZXQgZm9yIGxvb2tpbmcgYXQgUFBDYnVnIGJvb3QgcmVjb3Jkcy4KLQotCSogY29uZmlne3VyZS5pbiwuYmZkfTogQWRkIHN1cHBvcnQgZm9yIHBwY2Jvb3QgdGFyZ2V0LgotCSogdGFyZ2V0cy5jOiBEaXR0by4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVHVlIE1heSAgNyAxMToxNToxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaG93dG9fdGFibGUpOiBVcGRhdGUgbmFtZXMgdG8gbWF0Y2ggcmVjZW50Ci0JY2hhbmdlcyB0byBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaC4gIEZpeCBtaW5vciBlcnJvcnMgaW4gdGhlCi0JZXhpc3RpbmcgcmVsb2NzLiAgQWRkIFJfTU9WTDEgYW5kIFJfTU9WTDIuCi0JKHJ0eXBlMmhvd3RvKTogU2ltaWxhcmx5LgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogUmV3cml0ZSB0byBzaW1wbGlmeSwgZml4IGJ1Z3MgaW4gdGhlCi0JZXhpc3RpbmcgcmVsYXhpbmcgY29kZSAgYW5kIHBlZm9ybSBtb3JlIHJlbGF4aW5nLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0KLU1vbiBNYXkgIDYgMTg6MjQ6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogSGFuZGxlIGNvbW1vbgotCXN5bWJvbHMgY29ycmVjdGx5LgotCi1TYXQgTWF5ICA0IDA1OjA4OjQ1IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiAgUmVqZWN0IGdlbmVyaWMgRUxGIHRhcmdldCBpZgotCWVfbWFjaGluZSBtYXRjaGVzIGFuIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUgaW4gYSBzcGVjaWZpYyBiYWNrZW5kLgotCi0JKiBuZXRic2QtY29yZS5jIChuZXRic2RfY29yZV92ZWMpOiAgUmVtb3ZlIGluaXRpYWxpemVyIGZvcgotCW9ic29sZXRlIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQotRnJpIE1heSAgMyAxMzowNzozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAocmVsb2NfaG93dG9fdHlwZSk6IEFkZCBob3d0byBlbnRyeSBmb3IKLQlSX1BDUldPUkRfQi4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9QQ1JXT1JEX0IuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBIYW5kbGUgUl9QQ1JXT1JEX0IuCi0JKGg4MzAwX3JlbG9jXzE2X2VzdGltYXRlKTogTGlrZXdpc2UuICBUcnkgdG8gdHVybiBhIDE2Yml0Ci0JcGMtcmVsYXRpdmUgYnJhbmNoIChSX1BDUldPUkQpIGludG8gYW4gOGJpdCBwYy1yZWxhdGl2ZQotCWJyYW5jaCAoUl9QQ1dPUkRfQikuCi0KLUZyaSBNYXkgIDMgMTA6NDc6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogU2V0IHRoZSBzZWN0aW9uIGZvcgotCUJTRl9DT05TVFJVQ1RPUiBzeW1ib2xzLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBDb3JyZWN0IHNldHRpbmcgb2YKLQlsYXN0X2JmX2luZGV4LgotCi1XZWQgTWF5ICAxIDE4OjM5OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW4gY29tZGF0IHNlY3Rpb24gbG9va3VwLAotCXN0b3AgbG9va2luZyB3aGVuIHNlY3Rpb24gaXMgZm91bmQuCi0KLVdlZCBNYXkgIDEgMTQ6MTc6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChTVFJJTkdfU0laRV9TSVpFKTogRGVmaW5lLgotCShzdHlwX3RvX3NlY19mbGFncyk6IEhhbmRsZSBsb25nIHN5bWJvbCBuYW1lcyB3aGVuIGxvb2tpbmcgZm9yIHRoZQotCXNlY3Rpb24gc3ltYm9sLgotCShiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgX2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyBmaWVsZC4KLQkoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKTogRGVmaW5lLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEhhbmRsZSBsb25nIHNlY3Rpb24KLQluYW1lcy4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIHBlLWFybS5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlaS1hcm0uYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZS1pMzg2LmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGVpLWkzODYuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZS1wcGMuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZWktcHBjLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogU2V0IGxtYSBvZiBzZWN0aW9ucy4KLQkoYl9vdXRfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFJlbmFtZSBpbl9hYmZkCi0JcGFyYW1ldGVyIHRvIG91dHB1dF9iZmQuICBVc2VkIGlucHV0X2JmZCBpbnN0ZWFkIG9mIG91dHB1dF9iZmQgaW4KLQlzZXZlcmFsIHBsYWNlcy4KLQotVHVlIEFwciAzMCAxNzo1NjozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCBjcmVhdGUKLQlTRUNfQ09OU1RSVUNUT1Igc2VjdGlvbnMuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IGVsZl9ncC4KLQlGcm9tIERvbiBCb3dtYW4gPGJvd21hbkB3YXRlcmxvby5ocC5jb20+LgotCi1UdWUgQXByIDMwIDE3OjA2OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybWNvZmZfbGl0dGxlX3ZlYyk6IElmIENPRkZfV0lUSF9QRSBpcyBkZWZpbmVkLCBhZGQKLQlTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTIHRvIHNlY3Rpb25fZmxhZ3MuCi0KLU1vbiBBcHIgMjkgMTM6MTU6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQKLQltaXBzXzMyX3JlbG9jcyBmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG1pcHNfMzJfcmVsb2NzIGZpZWxkLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29weSBSX01JUFNfUkVMMzIgYW5kIFJfTUlQU18zMgotCXJlbG9jcyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlmaWxlLgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBGb3IgYSBSX01JUFNfUkVMMzIgb3IgUl9NSVBTXzMyIHJlbG9jCi0JYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIGluY3JlbWVudCBtaXBzXzMyX3JlbG9jcy4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgbWlwc18zMl9yZWxvY3MgaXMgc2V0LCBhbmQKLQl0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBtYWtlIHJvb20gaW4gdGhlCi0JLnJlbC5keW4gc2VjdGlvbi4KLQotRnJpIEFwciAyNiAxODowMDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFRyYWNrIHRoZSByZWFsCi0JZmlsZSBwb3NpdGlvbiBhbmQgdGhlIHZpcnR1YWwgZmlsZSBwb3NpdGlvbiBzZXBhcmF0ZWx5LiAgU2V0Ci0JZmlsZXBvcyBpbmZvcm1hdGlvbiBic2FlZCBvbiB0aGUgcmVhbCBmaWxlIHBvc2l0aW9uLgotCShfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSGFuZGxlIC5saWIgc2VjdGlvbnMgbGlrZSB0aGUKLQlKYW4gMjMgY2hhbmdlIHRvIGNvZmZjb2RlLmguCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHRoZSBzeW1ib2wgY291bnQgdG8gdGhlCi0JbnVtYmVyIG9mIEJGRCBzeW1ib2xzIGNyZWF0ZWQuCi0KLUZyaSBBcHIgMjYgMTI6MzQ6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBGb3J3YXJkIHJlbG9jYXRpb25zIHRvIHRoZQotCW91dHB1dCBmaWxlIGlmIGxpbmtpbmcgc2hhcmVkIG9iamVjdHMuICBMb29wIHRvIGNoZWNrIGFsbCByZWxvY3MsCi0JcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGZhbHNlIG9uIGZpcnN0IGVycm9yLgotCi1UaHUgQXByIDI1IDEzOjI1OjEyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogQWRkIFBMVCBjYXNlLgotCShwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogSWYgLmludGVycCBzZWN0aW9uLCBidW1wICMKLQlvZiBwcm9ncmFtIGhlYWRlcnMgYnkgMS4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBGbGVzaCBvdXQgc3VwcG9ydC4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3IgLnBsdCBzZWN0aW9uLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFByaW50IG91dCBmaWxlbmFtZSBpbiBkZWJ1ZyBjb2RlLiAgRW5hYmxlCi0JUExUIHN1cHBvcnQuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQWRkIHN1cHBvcnQgZm9yIFBMVCdzLCBiZWVmIHVwCi0JZGVidWcgb3V0cHV0LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiB0aGUgb3V0cHV0IHNlY3Rpb24gaXNuJ3QgZGVmaW5lZCwKLQlkb24ndCBhYm9ydCwganVzdCBnaXZlIGFuIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGUgc2VjdGlvbgotCWJlaW5nIGNyZWF0ZWQgaXMgLnNkYXRhIG9yIC5zZGF0YTIsIGRvbid0IG1ha2UgdGhlIHN5bWJvbCBkeW5hbWljLgotCi1XZWQgQXByIDI0IDE0OjA0OjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMb29rIHRocm91Z2ggdGhlCi0JbWVtYmVycyBvZiBhbiBhcmNoaXZlIGZvciBkeW5hbWljIG9iamVjdHMgd2l0aCBubyBzeW1ib2xzLCBhbmQKLQlwYXNzIHRoZW0gZGlyZWN0bHkgdG8gY2hlY2tfYXJjaGl2ZV9lbGVtZW50LgotCSh4Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBQYXNzIGR5bmFtaWMgb2JqZWN0cyB0bwotCXhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzLgotCSh4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogQ2hhbmdlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLQlmcm9tIF9iZmRfbm9keW5hbWljIHRvIF9iZmRfeGNvZmYuCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKToKLQlEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9zd2FwX2xkcmVsX2luKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKHhjb2ZmX2R5bmFtaWNfcmVsb2MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBVc2UgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMuCi0KLVR1ZSBBcHIgMjMgMTI6NDg6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNwYXJjLmMgKGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MpOiBSZXR1cm4gYmZkX3JlbG9jX29rIGV2ZW4KLQlpZiByZWxvY19lbnRyeS0+YWRkZW5kIGlzIG5vdCAwLgotCShDQUxDX0FEREVORCk6IEp1c3Qgc2V0IHRoZSBhZGRlbmQgdG8gcmVsb2Mucl9vZmZzZXQuCi0KLU1vbiBBcHIgMjIgMTg6Mjk6MDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBGaXggc3BlbGxpbmcgb2YKLQlSX1NQQVJDX0dMT0JfSk1QLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQlBZGQgZW50cmllcyBmb3IgUl9TUEFSQ19bNTZdLgotCShzcGFyY19yZWxvY19tYXApOiBBZGQgZW50cmllcyBmb3IgUl9TUEFSQ19bNTZdLgotCi1Nb24gQXByIDIyIDE1OjA3OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU9wdGltaXplIGxpbmtpbmcgb2Ygc3RhYnMgaW4gc2VjdGlvbnMgYXMgdXNlZCBpbiBFTEYgYW5kIENPRkYuCi0JKiBzdGFicy5jOiBOZXcgZmlsZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IERlY2xhcmUuCi0JKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IERlY2xhcmUuCi0JKF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUKLQlzdGFiX2luZm8gZmllbGQuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENhbGwgX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMgaWYKLQlhcHByb3ByaWF0ZS4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgc3RhYiBzdHJpbmdzIGhhc2ggdGFibGUuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBvcHRpbWl6ZWQgc3RhYnMgc2VjdGlvbnMuCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MKLQloYXNoIHRhYmxlLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIHN0YWJfaW5mbwotCWZpZWxkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhcHByb3ByaWF0ZSwgY2FsbAotCV9iZmRfbGlua19zZWN0aW9uX3N0YWJzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgc3RhYiBzdHJpbmdzIGhhc2ggdGFibGUuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBvcHRpbWl6ZWQgc3RhYnMgc2VjdGlvbnMuCi0JKiByZWxvYy5jIChfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDaGVjayBhZGRyZXNzIGFnYWluc3QKLQlfcmF3X3NpemUgcmF0aGVyIHRoYW4gX2Nvb2tlZF9zaXplLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IEFkZCBzdGFicy5vCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBzdGFicy5jLgotCi0JKiBWRVJTSU9OOiBJbmNyZW1lbnQgZm9yIGJmZGxpbmsuaCBjaGFuZ2UuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogQ29ycmVjdCBoYW5kbGluZyBvZgotCUJTRl9OT1RfQVRfRU5EIGNvbW1vbiBzeW1ib2xzLgotCi1GcmkgQXByIDE5IDE5OjIxOjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocmVjb3JkX3RvYyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIEFOU0kgQyBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLQkocHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW1vdmUgdW5yZWFjaGVkIGNvZGUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHRha2UgdGhlIGFkZHJlc3MKLQlvZiBhbiBhcnJheS4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZy4KLQkocGVfcHJpbnRfZWRhdGEpOiBMaWtld2lzZS4KLQkocGVfcHJpbnRfcmVsb2MpOiBSZW1vdmUgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uLgotCi1UaHUgQXByIDE4IDE4OjUxOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgbGFzdF9iZl9pbmRleAotCWFuZCBsYXN0X2JmIGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBTd2FwIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KLQlzeW1ib2xzLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogTGlrZXdpc2UuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBDaGVjayBlbmRuZHggZmllbGQgZm9yIENfRkNOCi0Jc3ltYm9scy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBsYXN0X2JmX2luZGV4Ci0JZmllbGQuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04gc3ltYm9scy4KLQlGaXggdXAgLmJmIGVuZG5keCBsaW5rIGZpZWxkcy4KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBsYXN0X2JmX2luZGV4Ci0JZmllbGQuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBlbmRuZHggZmllbGQgZm9yIENfRkNOCi0Jc3ltYm9scy4KLQotV2VkIEFwciAxNyAxMjowODoyNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBleyxpfS1wcGMuYyAoUFBDX1BFKTogRGVmaW5lIGluc3RlYWQgb2YgUFBDLCBzbyB0aGF0IGNvbXBpbGluZwotCW9uIFNvbGFyaXMgUG93ZXJQQyBzeXN0ZW1zIGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkLgotCi0JKiBjY2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSAjaWZkZWYgUFBDX1BFLCBub3QKLQkjaWZkZWYgUFBDLgotCi0JKiBlbGZjb3JlLmggKGJmZF9wcnN0YXR1cywgYmZkX2ZwcmVnc2V0KTogQWRkIHRocmVhZCBhcmd1bWVudC4KLQkoZWxmX2NvcmVmaWxlX25vdGUpOiBJZiBIQVZFX1NZU19QUk9DRlNfSCBpcyBub3QgZGVmaW5lZCwgZG9uJ3QKLQl1cGRhdGUgZGlkX3JlZyBhbmQgZGlkX3JlZzIuCi0KLVdlZCBBcHIgMTcgMTM6MDc6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBmb3IgVE9DIG92ZXJmbG93LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBXaGVuIGNhbGxpbmcgdGhlCi0JY2FsbGJhY2sgcm91dGluZXMsIHBhc3MgaC0+cm9vdC5zdHJpbmcgcmF0aGVyIHRoYW4gbmFtZSwgaW4gY2FzZQotCWNvcHkgaXMgdHJ1ZSBhbmQgbmFtZSBpcyB0cmFuc2llbnQuCi0KLVR1ZSBBcHIgMTYgMTY6MzY6MzggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBlbGZjb3JlLmg6ICBBZGQgc3VwcG9ydCBmb3IgY29yZSBmaWxlcyB3aXRoIG11bHRpcGxlIHRocmVhZHMuCi0JKFByaW1hcmlseSBmb3IgU29sYXJpcy4pCi0KLVR1ZSBBcHIgMTYgMTM6NDQ6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYKLQlzZWN0aW9uLT5vcmVsb2NhdGlvbiBpcyBOVUxMLgotCi0JKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX2dldF9zeW1lbnQpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9jb2ZmX2dldF9hdXhlbnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2NvZmZfZ2V0X3N5bWVudCk6IERlY2xhcmUuCi0JKGJmZF9jb2ZmX2dldF9hdXhlbnQpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gQXByIDE1IDE5OjA2OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19oaTE2KTogRGVmaW5lLgotCShtaXBzX2hpMTZfYWRkciwgbWlwc19oaTE2X2FkZGVuZCk6IFJlbW92ZS4KLQkobWlwc19oaTE2X2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzX2VsZl9oaTE2X3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBISTE2IHJlbG9jcy4KLQkobWlwc19lbGZfbG8xNl9yZWxvYyk6IFByb2Nlc3MgbWlwc19oaTE2X2xpc3QuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2Ci0JcmVsb2NzIGJlZm9yZSB0aGUgYXNzb2NpYXRlZCBMTzE2IHJlbG9jLgotCi1XZWQgQXByIDEwIDAwOjIzOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYyAodmVyc2Fkb3Nfc2Nhbik6IENoZWNrIGJmZF9hbGxvYyByZXR1cm4gdmFsdWUuCi0JKHZlcnNhZG9zX29iamVjdF9wKTogQ2hlY2sgYWxsIGJmZF9yZWFkIHJldHVybiB2YWx1ZXMuICBSZXF1aXJlCi0JdGhhdCBsYW5nIGZpZWxkIGJlIGxlc3MgdGhhbiAxMCwgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggSW50ZWwgSGV4Ci0JZmlsZXMuCi0KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSUyk6IFdyaXRlIG91dCB0aGUgcmVsb2NzIGV2ZW4gaWYgdGhlcmUKLQlhcmVuJ3QgYW55IHN5bWJvbHMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IFNldCByX2luZGV4IHRvIE5fQUJTLAotCW5vdCAwLCBmb3IgYW4gYWJzb2x1dGUgc3ltYm9sLgotCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IEFjY2VwdCBhIGxlbmd0aCBvZiA0IGZvciByZWNvcmQgdHlwZSA1LgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZvciBhIGxhcmdlIHN0YXJ0IGFkZHJlc3MsIG91dHB1dAotCXRoZSBmdWxsIDMyIGJpdCBhZGRyZXNzIGluIHJlY29yZCB0eXBlIDUuCi0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9ieXRlKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgZnJvbSBiZmRfYnl0ZQotCXRvIGludCB0byBhdm9pZCBwcm9tb3Rpb24gcHJvYmxlbXMgaW4gcHJvdG90eXBlLgotCi1UdWUgQXByICA5IDExOjQ0OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSAke3NyY2Rpcn0gd2hlbiBsb29raW5nIGZvciBwaWNmcmFnLgotCi0JKiBjb25maWd1cmUuaG9zdDogU3dpdGNoIG9uICR7bGliZGlyfSwgbm90ICQobGliZGlyKS4gIEZyb20KLQlhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdSAoQWxhbiBNb2RyYSkuCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IEFsd2F5cyBjYWxsIGFkZF9keW5hbWljX3N5bWJvbHMKLQllbnRyeSBwb2ludCwgbm90IGp1c3QgZm9yIERZTkFNSUMgb2JqZWN0cy4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBBbHdheXMgY2FsbAotCXN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgSWYgY2FsbGVkIHdpdGggYSBub24gRFlOQU1JQwotCW9iamVjdCwgZG9uJ3QgZG8gYW55dGhpbmcgZWxzZS4KLQkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBjYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCi1Nb24gQXByICA4IDEyOjA5OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERkxBR1MgYW5kIFNITElCX0NGTEFHUyBmb3IgKi1kZWMtb3NmKgotCWhvc3Qgd2hlbiBjb25maWd1cmluZyB3aXRoIC0tZW5hYmxlLXNoYXJkLgotCi1GcmkgQXByICA1IDEyOjI0OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIGlbMzQ1XTg2LSotZnJlZWJzZGVsZiogdGFyZ2V0OyBmcm9tIEpvaG4gUG9sc3RyYQotCTxqZHBAcG9sc3RyYS5jb20+LgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBGb3IgV0FSTl9ST1cvd2FybiwgdXNlIE1XQVJOLCBub3QgQ1lDTEUsCi0JdG8gYXZvaWQgY3Jhc2hpbmcgaW4gYmZkX2hhc2hfcmVwbGFjZS4KLQotCSogc3lzZGVwLmg6IFVzZSAjaWZkZWYsIG5vdCAjaWYuCi0KLVRodSBBcHIgIDQgMjM6MzI6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0KLVRodSBBcHIgIDQgMTg6NDk6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zb255LWJzZCopOiBGaXggdHlwbyBpbiBBQ19ERUZJTkUuCi0JKEFDX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3lzL3RpbWUuaAotCShBQ19IRUFERVJfVElNRSk6IEFkZCBtYWNyby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHN5c2RlcC5oOiBVc2UgVElNRV9XSVRIX1NZU19USU1FIGFuZCBIQVZFX1NZU19USU1FX0gKLQl0byBjb250cm9sIHdoYXQgY29tYmluYXRpb24gb2YgPHRpbWU+IGFuZCA8c3lzL3RpbWUuaD4KLQlnZXQgaW5jbHVkZWQuCi0KLVR1ZSBBcHIgIDIgMTM6MTE6NTMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYW91dGYxLmggKHN1bm9zXzMyX3NldF9hcmNoX21hY2gpOiBIYW5kbGUgTV9TUEFSQ0xFVC4KLQkoYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEhhbmRsZQotCWJmZF9tYWNoX3NwYXJjX3tzcGFyY2xldCxzcGFyY2xpdGV9LgotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfe3NwYXJjbGV0LHNwYXJjbGl0ZX0pOiBEZWZpbmUuCi0JKGJmZF9tYWNoX3NwYXJjX3Y5X3ApOiBVcGRhdGUuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBlbnRyaWVzIGZvciBzcGFyY2xldCxzcGFyY2xpdGUuCi0JKiBsaWJhb3V0LmggKGVudW0gbWFjaGluZV90eXBlKTogQWRkIE1fU1BBUkNMRVQuCi0JKiBzdW5vcy5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBBcHIgIDIgMDA6MzM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGhnb3QgZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIGhnb3QgZmllbGQuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFN0b3JlIHRoZQotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZSBoZ290IGZpZWxkLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSWYgdGhlIHNpemUgb2YgdGhlCi0JZ2xvYmFsIG9mZnNldCB0YWJsZSBnb2VzIG92ZXIgMHgxMDAwLCBzZXQgdGhlIHZhbHVlIG9mCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHRvIDB4MTAwMCBpbnRvIHRoZSBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogU3VidHJhY3QgdGhlIG9mZnNldCBvZgotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB3aGVuIGhhbmRsaW5nIEdPVCByZWxvY2F0aW9ucy4KLQotCSogZWxmY29kZS5oOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4uCi0KLU1vbiBBcHIgIDEgMTA6Mzk6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lZCBmcm9tCi0JZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYy4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKiBnZW5saW5rLmggKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmF0aW9uCi0JbW92ZWQgaGVyZSBmcm9tIGxpYmJmZC1pbi5oLgotCSogbGliYmZkLWluLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIEFwciAgMSAxMjozNTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFdoZW4gcmVwb3J0aW5nIGFuCi0Jb3ZlcmZsb3cgZXJyb3IsIHVzZSB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlIGlmCi0JYXZhaWxhYmxlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBjb21tb24gc3ltYm9sIGdvdAotCWRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIHNldCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSLgotCi1TdW4gTWFyIDMxIDAxOjU4OjQxIDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRGVsZXRlIHRlc3QgZm9yIC5qdW5rLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQotRnJpIE1hciAyOSAxMjo0NDozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX0xJTktfT05DRSk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFUyk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBDT0ZGX1dJVEhfUEUsIHR1cm4KLQlTRUNfTElOS19PTkNFIGludG8gSU1BR0VfU0NOX0xOS19DT01EQVQuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWYgQ09GRl9XSVRIX1BFLCB0dXJuIElNQUdFX1NDTl9MTktfUkVNT1ZFCi0JaW50byBTRUNfRVhDTFVERS4gIElmIElNQUdFX1NDTl9MTktfQ09NREFUIGlzIHNldCwgc2V0Ci0JU0VDX0xJTktfT05DRSwgYW5kIGxvb2sgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUgc2V0dGluZwotCWZvciBTRUNfTElOS19EVVBMSUNBVEVTLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIENPRkZfV0lUSF9QRSwgaWYgU0VDX0xJTktfT05DRSBpcwotCXNldCBmb3IgYSBzZWN0aW9uLCBmaW5kIHRoZSBzZWN0aW9uIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLAotCWFuZCBzZXQgdGhlIGF1eCBlbnRyeSBiYXNlZCBvbiBTRUNfTElOS19EVVBMSUNBVEVTLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IEFkZCBhIHNwYWNlIGJlZm9yZSAiY2hlY2tzdW0iLgotCSogY29mZi1hcm0uYyAoYXJtY29mZl9iaWdfdmVjKTogSWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQsIGFkZAotCVNFQ19MSU5LX09OQ0UgYW5kIFNFQ19MSU5LX0RVUExJQ0FURVMgdG8gc2VjdGlvbl9mbGFncy4KLQkqIGNvZmYtaTM4Ni5jIChpMzg2Y29mZl92ZWMpOiBMaWtld2lzZS4KLQkqIGNvZmYtcHBjLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IExpa2V3aXNlLgotCi0JKiBWRVJTSU9OOiBCdW1wIHRvIDIuNi4xLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBWRVJTSU9OLgotCi1UaHUgTWFyIDI4IDIzOjQ4OjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBBZGQgZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2xpbmtfaGFzaF9jcmVhdGUpOiBBbGxvdyBzcGVjaWZpYyB0YXJnZXRzCi0JdG8gb3ZlcnJpZGUuCi0JKiBjb2ZmLWg4MzAwLmM6IEFkZCB0d28gZGVyaXZlZCBoYXNoIHRhYmxlcyBhbmQgdGhlaXIgYXNzb2NpYXRlZAotCWZ1bnRpb25zIGFuZCAjZGVmaW5lcyBmb3IgdXNlIGJ5IHRoZSBoODMwMCBsaW5rZXIuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNhc2UgUl9NRU1fSU5ESVJFQ1QpOiBDcmVhdGUgZW50cmllcyBpbgotCXRoZSBmdW5jdGlvbiB2ZWN0b3IgYXMgbmVlZGVkLiAgUGxhY2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uCi0JdmVjdG9yIGVudHJ5IGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIFJfTUVNX0lORElSRUNUIHJlbG9jLgotCVJld3JpdGUgdGhlIHZlY3RvcnMgc2VjdGlvbiBjb250ZW50cyBhcyBuZWNlc3NhcnkuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIGZvciB0aGUgaDgzMDAgbGlua2VyLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lIHRvIHVzZSBoODMwMCBzcGVjaWZpYyB2ZXJzaW9uLgotCShjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjggMTc6NDQ6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJocHBhLmg6IElmIGdjYyAyLjcgb3IgaGlnaGVyLCBkZWNsYXJlIGFsbCB0aGUgZnVuY3Rpb25zIHdpdGgKLQlfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpIHNvIHRoYXQgLVdhbGwgZG9lc24ndCB3YXJuIGFib3V0Ci0JdGhlbS4KLQkoaHBwYV9yZWJ1aWxkX2luc24pOiBQYXNzIHBvaW50ZXIgdG8gY29ycmVjdCB0eXBlIHRvCi0JbG93X3NpZ25fdW5leHQgYW5kIGRpc19hc3NlbWJsZV8yMS4KLQotVGh1IE1hciAyOCAxMTowMDozNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LXtzeXN2NCosc29sYXJpczIqfSk6IERlbGV0ZS4KLQlTdGljayB3aXRoIHNwYXJjLSote3N5c3Y0Kixzb2xhcmlzMip9LgotCi1XZWQgTWFyIDI3IDEwOjQzOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCBpbiBleHRyYSBQRSB4X3NjbiBmaWVsZHMuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogU3dhcCBvdXQgZXh0cmEgUEUgeF9zY24gZmllbGRzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IFplcm8gb3V0IGV4dHJhIFBFIHhfc2NuIGZpZWxkcy4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBJZiBhbnkgb2YgdGhlIGV4dHJhIFBFIHhfc2NuCi0JZmllbGRzIGlzIG5vbi16ZXJvLCBwcmludCB0aGVtLgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IFB1dCBpbnNpZGUgQ09GRl9JTUFHRV9XSVRIX1BFCi0JaWZkZWYuICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkocHBjX3JlY29yZF9kYXRhX2luX3RvY19lbnRyeSk6IElmZGVmIG91dC4gIFJlbW92ZWQgdW51c2VkCi0JdmFyaWFibGVzLgotCShwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZSk6IFB1dCBpbnNpZGUgQ09GRl9JTUFHRV9XSVRIX1BFIGlmZGVmLgotCShnZXRfc3ltYm9sX3ZhbHVlKTogSWZkZWYgb3V0LgotCShwZV9wcGNfcmVsb2MpOiBJZmRlZiBvdXQuICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgTWFrZQotCWZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMgY29ycmVzcG9uZC4gIFB1dCBiZWZvcmVfYWRkciBpbgotCURFQlVHX1JFTE9DIGlmZGVmLgotCShkdW1wX3RvYyk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgQWx3YXlzCi0JcmV0dXJuIGEgdmFsdWUuCi0JKHBwY19yZWZsb19yZWxvYyk6IElmZGVmIG91dC4KLQkocHBjX2FkZHIzMm5iX3JlbG9jKTogSWZkZWYgb3V0LgotCShwcGNfY29mZl9ydHlwZTJob3d0byk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcwotCWNvcnJlc3BvbmQuCi0JKGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IE1vdmUgb3RoZXJ3aXNlIHVudXNlZCB2YXJpYWJsZXMgaW50bwotCXRoZSAjaWZkZWYgd2hlcmUgdGhleSBhcmUgdXNlZC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkocGVfcHJpbnRfZWRhdGEpOiBNYWtlIGZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMKLQljb3JyZXNwb25kLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShwZV9wcmludF9wZGF0YSk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGFkZHJfdmFsdWUuICBBbHdheXMKLQlyZXR1cm4gYSB2YWx1ZS4KLQkocGVfcHJpbnRfcmVsb2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIG9uYWxpbmUuICBNYWtlIGZwcmludGYKLQlzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9mYWtlX3NlY3Rpb25zKTogUmV0dXJuIHRydWUuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTW92ZSBkZWZpbml0aW9uIG9mIHVudXNlZAotCXZhcmlhYmxlIHJlbGEgaW5zaWRlICNpZiAwIHNlY3Rpb24gd2hlcmUgaXQgaXMgdXNlZC4KLQotCSogbnMzMmsuaDogTmV3IGZpbGUuCi0JKiBjcHUtbnMzMmsuaDogSW5jbHVkZSBuczMyay5oLiAgUmVuYW1lIGV4dGVybmFsbHkgdmlzaWJsZQotCWZ1bmN0aW9ucyB0byBzdGFydCB3aXRoIF9iZmRfLgotCSogYW91dC1uczMyay5jOiBJbmNsdWRlIG5zMzJrLmguICBDaGFuZ2UgcmVmZXJlbmNlcyB0byByZW5hbWVkCi0JZnVuY3Rpb25zIGluIGNwdS1uczMyay5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShIRklMRVMpOiBBZGQgbnMzMmsuaC4KLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogQWRkIGxpbmtlcl9tYXJrIGZpZWxkLiAgQ2hhbmdlCi0JdXNlcl9zZXRfdm1hIGFuZCByZWxvY19kb25lIHRvIGJlIHNpbmdsZSBiaXQgZmllbGRzLgotCShTVERfU0VDVElPTik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4KLQkoYW91dF9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbgotCXRoZSBsaW5rLgotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQKLQlpbiB0aGUgbGluay4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEluY2x1ZGUgc2VjdGlvbiBuYW1lIGluCi0Jb3ZlcmZsb3cgZXJyb3IgbWVzc2FnZXMuCi0KLVR1ZSBNYXIgMjYgMTU6NDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIpOiBJZiBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZQotCWlzIG5vdCBzZXQsIHByaW50ICJCRkQ6ICIgYmVmb3JlIHRoZSBlcnJvciBtZXNzYWdlLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgYXIgYW5kIHJhbmxpYi4gIEZyb20KLQlNaWxlcyBCYWRlciA8bWlsZXNAZ251LmFpLm1pdC5lZHU+LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDIyIDEyOjE3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRml4IHNjYW4gZm9yIENfQklOQ0wvQ19FSU5DTAotCXN5bWJvbHMuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBpZWVlX3ZlYyB0byB0YXJnX3NlbHZlY3MgZm9yIGk5NjAgdGFyZ2V0cyBhbmQKLQltNjhrLWFvdXQsIG02OGstY29mZiwgYW5kIG02OGstZWxmIHRhcmdldHMuCi0KLUZyaSBNYXIgMjIgMTE6MzM6NDQgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBnb29meS5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIGllZWUuYzogQ2hhbmdlZCAjaWZkZWYgS0VFUE1JTlVTUENJTklOU1QgdG8gI2lmIEtFRVBNSU5VU1BDSU5JTlNULgotCShpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IFJlc3RydWN0dXJlZCB0byBwcmV2ZW50Ci0JaWVlZV9vYmplY3RfcCBmcm9tIGJlaW5nIGNhbGxlZCByZXBlYXRlZGx5LgotCi1UaHUgTWFyIDIxIDExOjAwOjQ3IDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIEFsbG9jYXRlCi0JYnVmZmVycyBsYXJnZSBlbm91Z2ggZm9yIGFueSBGSUxFSERSIG9yIEFPVVRIRFIuCi0KLVRodSBNYXIgMjEgMTY6Mjg6MTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmZsaW5rLmMgKGxvb2t1cF9saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgcmVuYW1lZCBhbmQKLQlzbGlnaGx5IGNoYW5nZWQgZnJvbSBvbGQgX2JmZF9lY29mZl9sb2NhdGVfbGluZS4KLQkoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IENhY2hlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgVXNlCi0JbG9va3VwX2xpbmUgZm9yIGFjdHVhbCBsb29rdXAuCi0KLVRodSBNYXIgMjEgMTQ6NTk6MTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3BkYXRhKTogV2FybiBpZiB0aGUgLnBkYXRhIHNlY3Rpb24gaXMgbm90IGEKLQltdWx0aXBsZSBvZiAyMCBieXRlcy4KLQotVGh1IE1hciAyMSAxMzo1NDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgYmZkX3phbGxvYyB0bwotCWFsbG9jYXRlIGVjb2ZmX2ZpbmRfbGluZSwgYW5kIGRvbid0IGluaXRpYWxpemUgYnkgaGFuZC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgYmZkX3phbGxvYyBmb3IKLQltaXBzX2VsZl9maW5kX2xpbmUsIGFuZCBkb24ndCBjYWxsIG1lbXNldC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBub3QKLQlwcm9kdWNpbmcgYSBmaW5hbCBleGVjdXRhYmxlLCBkb24ndCBjb25zaWRlciBzb2ZhciB3aGVuIGFsaWduaW5nCi0JdGhlIHNlY3Rpb24gdG8gdGhlIGNvcnJlY3Qgc2l6ZS4KLQotV2VkIE1hciAyMCAxNjo1MzoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IElmZGVmIG91dC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjYWxsIGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scy4KLQkqIGNvZmZnZW4uYyAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IElmZGVmIG91dC4KLQotTW9uIE1hciAxOCAxMjo1NDo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IEluaXRpYWxpemUgZ3AgaWYKLQlvdXRwdXRfYmZkIGlzIG5vdCBOVUxMLgotCi1UaHUgTWFyIDE0IDE3OjEyOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2FsbCBiZmRfemFsbG9jIGluc3RlYWQKLQlvZiBiZmRfYWxsb2MgKGZpeGVzIGZpeF9saW5lIG5vdCBiZWluZyBpbml0aWFsaXplZCkuCi0JRGVsZXRlIHplcm9pbmcgb2YgZml4X3t2YWx1ZSx0YWcsZW5kLHNjbmxlbn0gZmllbGRzLgotCi1UaHUgTWFyIDE0IDE2OjA2OjA2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogQWxsb3cgc3BlY2lmaWMgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlCi0JYmZkX2xpbmtfYWRkX3N5bWJvbHMgcm91dGluZS4KLQotCSogY29mZi1oODMwMC5jOiBJbmNsdWRlIGdlbmxpbmsuaC4KLQkoaG93dG9fdGFibGUpOiBBZGQgUl9NRU1fSU5ESVJFQ1QuCi0JKHJ0eXBlMmhvd3RvKTogU3VwcG9ydCBSX01FTV9JTkRJUkVDVC4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEhhbmRsZSBSX01FTV9JTkRJUkVDVCBsaWtlIFJfUkVMQllURQotCWZvciBub3cuCi0KLVR1ZSBNYXIgMTIgMTI6NDE6MTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1Aa29hbGEuYXpzdGFybmV0LmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlCi0JaW5mby0+Y2FsbGJhY2tzX3dhcm5pbmcsIHJhdGhlciB0aGFuIF9iZmRfZXJyb3JfaGFuZGxlciwgZm9yCi0JIm11bHRpcGxlIGdwIiB3YXJuaW5nLgotCi1UdWUgTWFyIDEyIDEyOjEwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFUlQgb24gaGFzaAotCXRhYmxlIHN0cmluZy4gIFVzZSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFUlQgb24gaGFzaAotCXRhYmxlIHN0cmluZy4KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXNlIHRoZSBuYW1lIGZyb20gdGhlIGhhc2gKLQl0YWJsZSwgaWYgYW55LCB3aGVuIHdyaXRpbmcgb3V0IHN5bWJvbHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoIHRhYmxlLAotCWlmIGFueSwgd2hlbiByZXBvcnRpbmcgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IFVzZSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwLgotCSogYm91dC5jIChnZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKHhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfZmRyX2luKTogSWYgRUNPRkZfNjQsIHR1cm4gMHhmZmZmZmZmZgotCWludG8gLTEgZm9yIGludGVybi0+cnNzLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLU1vbiBNYXIgMTEgMTI6Mjg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFiLXN5bXMuYyAoX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUpOiBEZWZpbmUuCi0JKGJmZF9nZXRfc3RhYl9uYW1lKTogUmVuYW1lIGZyb20gYW91dF9zdGFiX25hbWUuICBSZXdyaXRlIHRvIHVzZSBhCi0Jc3dpdGNoLgotCSogYmZkLWluLmggKGJmZF9nZXRfc3RhYl9uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBBZGQgc3RhYi1zeW1zLm8uCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBzdGFiLXN5bXMuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgc3RhYi1zeW1zLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IFJlbW92ZSBzdGFiLXN5bXMuYy4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgbGlzdCBzdGFiLXN5bXMubyBpbiBiZmRfYmFja2VuZHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBsaWJhb3V0LmggKGFvdXRfc3RhYl9uYW1lKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pKTogQ2FsbCBiZmRfZ2V0X3N0YWJfbmFtZSwKLQlub3QgYW91dF9zdGFiX25hbWUuCi0KLUZyaSBNYXIgIDggMTE6MjY6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEFkanVzdCBmaWxlIG9mZnNldAotCWZvciBzZWN0aW9uIGFsaWdubWVudCBldmVuIGlmIFNFQ19MT0FEIGlzIG5vdCBzZXQuCi0KLVR1ZSBNYXIgIDUgMTI6MDI6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBTSExJQiBvciBTSExJTksgdG8gYW4gZW1wdHkgc3RyaW5nLAotCXNpbmNlIHRoZXkgYXBwZWFyIGFzIHRhcmdldHMgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IElmIG5vdCBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSwKLQlkb24ndCBmaWRkbGUgd2l0aCBhIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZS4KLQotTW9uIE1hciAgNCAxMjo0OToxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrKTogVHJlYXQgdW5kZWZpbmVkIGltcG9ydGVkIHN5bWJvbHMgYXMKLQl0aG91Z2ggdGhleSBhcmUgZGVmaW5lZCBpbiBhIHNoYXJlZCBsaWJyYXJ5LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBMaWtld2lzZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgbG9vayBhdCB0aGUgbGluZQotCW51bWJlcnMgZm9yIHRoZSBzZWN0aW9uIGlmIHNlY3Rpb24tPmxpbmVubyBpcyBOVUxMLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IFByaW50IGEgdXNlZnVsIGVycm9yCi0JbWVzc2FnZSByYXRoZXIgdGhhbiBjYWxsaW5nIEJGRF9BU1NFUlQuCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCV9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wuCi0KLUZyaSBNYXIgIDEgMDk6NDI6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEb24ndCBzZXQgU0VDX0xPQUQgZmxhZwotCWZvciAuc2JzcyBzZWN0aW9uLgotCi1XZWQgRmViIDI4IDExOjI1OjQ3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBBZGQgUl9IUFBBX05MU0VMCi0JYW5kIFJfSFBQQV9OTFJTRUwuCi0JKGVfbnNlbCwgZV9ubHNlbCwgZV9ubHJzZWwpOiBVbmRlZmluZS4gIEFkZCB0bwotCWhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQuCi0JKGhwcGFfZmllbGRfYWRqdXN0KTogSGFuZGxlIGVfbmxzZWwsIGVfbmxyc2VsLiAgRml4IGVfbnNlbCBoYW5kbGluZy4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSBOJywgTkwnIE5MUicgZmllbGQKLQlzZWxlY3RvcnMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBGaW5pc2ggaGFuZGxpbmcgb2YgUl9OMFNFTCBhbmQgUl9OMVNFTC4KLQotV2VkIEZlYiAyOCAxMTowMDoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWRqdXN0IHRoZSBzZWdtZW50Ci0JbWVtb3J5IHNpemUgZm9yIHRoZSBhbGlnbm1lbnQgb2YgYSBTRUNfQUxMT0Mgc2VjdGlvbiwgbm90IGp1c3QgYQotCVNFQ19MT0FEIHNlY3Rpb24uCi0KLVR1ZSBGZWIgMjcgMTQ6MTc6MzEgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGtsaW51eC5jOiBOZXcgZmlsZS4KLQkqIGhvc3RzL202OGtsaW51eC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1saW51eGFvdXQqLCBtNjgqLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKG02OCotKi1saW51eCopOiBOZXcgbmF0aXZlIGhvc3QuCi0JKG02OGtsaW51eF92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChtNjhrbGludXhfdmVjKTogRGVjbGFyZS4KLQkqIGkzODZsaW51eC5jIChiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFJlbmFtZWQgZnJvbQotCWJmZF9saW51eF9zaXplX2R5bm1pY19zZWN0aW9ucyB0byBhdm9pZCBjbGFzaCB3aXRoIG02OGtsaW51eC5jLgotCSogYmZkLWluLmggKGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogUmVuYW1lCi0JZGVjbGFyYXRpb24gZnJvbSBiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCShiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIG02OGtsaW51eC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgbTY4a2xpbnV4LmMuCi0KLVR1ZSBGZWIgMjcgMTE6MzE6MzQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKHBhX2FyY2gpOiBBZGQgcGEyMC4KLQkoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlKTogQWRkIFJfSFBQQV9OU0VMLgotCShlX25zZWwpOiBVbmRlZmluZS4gIEFkZCB0byBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0LgotCShocHBhX2ZpZWxkX2FkanVzdCk6IEhhbmRsZSBlX25zZWwuCi0JKiBzb20uYzogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBtYW55IG5ldyByZWxvY3MgZm91bmQgb25seQotCWluIGhwdXgxMCBpbmNsdWRlIGZpbGVzLgotCShzb21fZml4dXBfZm9ybWF0cyk6IEFkZCBzZXZlcmFsIG5ldyByZWxvY3MgZnJvbSBocHV4MTAuCi0JKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogQWRkIGhwdXgxMCByZWxvY3MuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9OMFNFTCBhbmQgUl9OMVNFTCBocHV4MTAgcmVsb2NzLgotCi1Nb24gRmViIDI2IDEyOjUyOjQ4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCByZWNlbnQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCwgYW5kCi0JcnVsZXMgdG8gcmVidWlsZCAuaCBmaWxlcyB1c2luZyBkb2MvY2hldy4KLQotTW9uIEZlYiAyNiAxNDo0ODozOSAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBBWlN0YXJOZXQuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGp1c3QgdGhlIGZpbGUKLQlzaXplIGV2ZW4gb2Ygc2VjdGlvbnMgd2l0aCBubyBjb250ZW50cy4KLQotTW9uIEZlYiAyNiAxNDowMToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFdoZW4gbWVyZ2luZywgc2tpcCBuYW1lcwotCXN0YXJ0aW5nIHdpdGggJyQnIHRoZSB3YXkgd2Ugc2tpcCBuYW1lcyBzdGFydGluZyB3aXRoICcuJy4gIFdoZW4KLQl1cGRhdGluZyB4X2VuZG5keCwgZG9uJ3QgYmUgZm9vbGVkIGJ5IGFuIGluZGV4IHdoaWNoIGhhcyBiZWVuCi0JbWVyZ2VkLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gb3B0aW1pemUgYQotCXN0cnVjdC91bmlvbi9lbnVtIHR5cGUgd2l0aCBubyBlbGVtZW50cy4KLQotU2F0IEZlYiAyNCAxMTozODo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfZXJybXNnKTogSGFuZGxlIGEgTlVMTCByZXR1cm4gZnJvbSBzdHJlcnJvci4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQlhcmNoaXZlIGNhbiBub3QgYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QsIGRvbid0IGFzc3VtZSB0aGF0IHRoaXMKLQlpcyB0aGUgd3JvbmcgZm9ybWF0LgotCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUKLQlmb3JtYXQgaXMgbm90IGJmZF9vYmplY3QuCi0JKGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSk6IExpa2V3aXNlLgotCi1XZWQgRmViIDIxIDEzOjU4OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IHJhbmdlIG9mIFJfU0hfVVNFUwotCXJlbG9jLgotCi1UdWUgRmViIDIwIDE2OjIyOjQ0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKHRkYXRhKTogQWRkIG5ldGJzZF9jb3JlX2RhdGEuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRmViIDIwIDE2OjUwOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoU1VOT1NfQ09OU1RSVUNUT1IpOiBEZWZpbmUuCi0JKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgbGV0IGEgc3ltYm9sIGZyb20gYSBkeW5hbWljIG9iamVjdAotCW92ZXJyaWRlIGEgY29uc3RydWN0b3Igc3ltYm9sLiAgU2V0IFNVTk9TX0NPTlNUUlVDVE9SIHdoZW4KLQlhcHByb3ByaWF0ZS4KLQotCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuIGZsYWdzCi0JdG8gZ2V0IHRoZSBzeW1ib2wgaW5kZXgsIG1hdGNoaW5nIDE0IEp1bCA5NSBjaGFuZ2UuCi0KLVR1ZSBGZWIgMjAgMDg6MjY6MjcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlSZW1vdmUgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgZ3AuCi0KLU1vbiBGZWIgMTkgMTI6Mzc6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0Ci0JYXNzdW1lIHRoYXQgd2UgY2FuIHNldCB0aGUgR1AgdmFsdWUgYW5kIHRoZW4gZ2V0IHRoZSBzYW1lIHZhbHVlLAotCXNpbmNlIGl0IHdvbid0IGJlIHRydWUgaWYgdGhlIG91dHB1dCBmaWxlIGlzIG5laXRoZXIgRUxGIG5vcgotCUVDT0ZGLgotCSogY29mZi1taXBzLmMgKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogRG9uJ3QgYm90aGVyIHRvIHVzZQotCV9iZmRfZ2V0X2dwX3ZhbHVlIGhlcmUuCi0JKG1pcHNfZ3ByZWxfcmVsb2MpOiBEb24ndCBhc3N1bWUgd2UgY2FuIHNldCBhbmQgZ2V0IHRoZSBHUCB2YWx1ZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaGkxNl9yZWxvYyk6IEdldCBncCB2YWx1ZSBmcm9tCi0JbWlwc19lbGZfZmluYWxfZ3AuCi0JKG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZmluYWxfZ3ApOiBBZGQgcGdwIHBhcmFtZXRlci4gIFNldCBpdCB0byB0aGUgR1AgdmFsdWUuCi0JRG9uJ3QgcmVxdWlyZSB0aGF0IHRoZSBCRkQgYmUgRUxGLgotCShtaXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogR2V0IGdwIHZhbHVlIGZyb20gbWlwc19lbGZfZmluYWxfZ3AuCi0JKG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGFzc3VtZSB3ZSBjYW4gc2V0IGFuZCBnZXQgdGhlCi0JR1AgdmFsdWUuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERvbid0IGJvdGhlciB0byB1c2UKLQlfYmZkX2dldF9ncF92YWx1ZSBoZXJlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUpOiBJbml0aWFsaXplIHN2LgotCURvbid0IGNoYW5nZSBlcGRyIGJldHdlZW4gbWFsbG9jIGFuZCBmcmVlLiAgQmUgY2FyZWZ1bCBub3QgdG8gZnJlZQotCU5VTEwgcG9pbnRlcnMuICBaZXJvIG91dCB0aGUgZmlyc3QgUlBEUi4KLQotCSogY29uZmlndXJlLmhvc3Q6IE9uIExpbnV4LCBvbmx5IHBhc3MgLXJwYXRoIG9wdGlvbiBpZiAkKGxpYmRpcikKLQlpcyBuZWl0aGVyIC9saWIgbm9yIC91c3IvbGliLiAgRnJvbSBBbGFuIE1vZHJhCi0JPGFsYW5AbXVsbGV0LkxldmVscy5VbmlTQS5FZHUuQXU+LgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVuYW1lIGR0X25lZWRlZF9uYW1lIHRvCi0JZHRfbmFtZS4KLQkoZWxmX2R0X25hbWUpOiBSZW5hbWUgZnJvbSBlbGZfZHRfbmVlZGVkX25hbWUuCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBVc2UgZWxmX2R0X25hbWUsIG5vdAotCWVsZl9kdF9uZWVkZWRfbmFtZS4KLQkoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgZWxmX2R0X25hbWUsIG5vdAotCWVsZl9kdF9uZWVkZWRfbmFtZS4gIFNhdmUgdGhlIFNPTkFNRSBiYWNrIGluIGVsZl9kdF9uYW1lLgotCSogYmZkLWluLmggKGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTkgMDI6NTA6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lZCBmcm9tCi0JX2JmZF9zcGFyY19lbGZfcmVsb2NfdHlwZV9sb29rdXAuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBVcGRhdGUuCi0JKiBlbGY2NC1zcGFyYy5jIChTUEFSQzY0X09MRF9SRUxPQ1MpOiBEZWZpbmUuCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogRGVmaW5lLgotCShzcGFyY19yZWxvY19tYXApOiBEZWZpbmUuCi0JKHNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBVc2Ugc3BhcmM2NF9lbGZfaG93dG9fdGFibGUuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFVwZGF0ZS4KLQotU3VuIEZlYiAxOCAxNTowMjoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLQl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KLQotRnJpIEZlYiAxNiAxMjo0NjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChfYmZkX2dldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9zZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCShfYmZkX3NldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlCi0JX2JmZF9nZXRfZ3BfdmFsdWUgYW5kIF9iZmRfc2V0X2dwX3ZhbHVlIHJhdGhlciB0aGFuIHJlZmVycmluZwotCWRpcmVjdGx5IHRvIHRoZSBmaWVsZHMgaW4gdGhlIHRkYXRhIGluZm9ybWF0aW9uLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkobWlwc19ncHJlbF9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaGkxNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9sbzE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2ZpbmFsX2dwKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBib3V0LmMgKGJfb3V0X3NldF9hcmNoX21hY2gpOiBSZWNvZ25pemUgYmZkX21hY2hfaTk2MF9qeC4KLQotVGh1IEZlYiAxNSAxMToyOToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBjb25maWd1cmUuaG9zdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBEb24ndCBzZXQgaW5mb3JtYXRpb24gd2hpY2ggYXV0b2NvbmYgc2hvdWxkCi0JZmlndXJlIG91dCwgbmFtZWx5IENDLCBDRkxBR1MsIExERkxBR1MsIEFSLCBhbmQgUkFOTElCLgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVtb3ZlIGdvMzIgYW5kIHdpbjMyIGhvc3QgaW5mb3JtYXRpb24sIHNpbmNlIGl0Ci0Jc2hvdWxkIG5vIGxvbmdlciBiZSBuZWVkZWQuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiB3ZSBoYXZlIGEgLmR5bmFtaWMgc2VjdGlvbiwKLQl0aGVuIHN0YXJ0IGEgbmV3IHNlZ21lbnQgcmF0aGVyIHRoYW4gcHV0IGEgd3JpdGFibGUgc2VjdGlvbiBpbiBhCi0JcmVhZG9ubHkgc2VnbWVudC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBSUEFUSF9FTlZWQVIuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkCi0JemVyb19zZWN0aW9uIHZhcmlhYmxlLgotCi1UaHUgRmViIDE1IDEwOjM5OjE3IDE5OTYgIEguSi4gTHUgIDxoamxAem9vbS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKHNyY2RpcikvYmZkLWluMi5oKTogUmVuYW1lIHRhcmdldCBmcm9tIGJmZC1pbjIuaC4KLQkoJChzcmNkaXIpL2xpYmJmZC5oKTogUmVuYW1lIGZyb20gbGliYmZkLmguCi0JKCQoc3JjZGlyKS9saWJjb2ZmLmgpOiBSZW5hbWUgZnJvbSBsaWJjb2ZmLmguCi0KLVdlZCBGZWIgMTQgMTY6Mjk6MDcgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2V4cHJlc3Npb24pOiBPbmx5IHVzZSBhbiBSIHZhcmlhYmxlIGZvciBhCi0JbG9jYWwgc3ltYm9sLiAgRG9uJ3Qgb3V0cHV0IGEgemVybyBvZmZzZXQuICBIYW5kbGUgYSB6ZXJvIGFkZHJlc3MuCi0JKFNSQ19NQVNLLCBQQ1JFTF9PRkZTRVQpOiBEZWZpbmUgYmFzZWQgb24gS0VFUE1JTlVTUENJTklOU1QuCi0JKHJlbDMyX2hvd3RvLCByZWwxNl9ob3d0bywgcmVsOF9ob3d0byk6IFVzZSBTUkNfTUFTSyBhbmQKLQlQQ1JFTF9PRkZTRVQuCi0JKHBhcnNlX2V4cHJlc3Npb24pOiBEb24ndCB0cnkgdG8gaGFuZGxlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIGEKLQlQIHZhcmlhYmxlLiAgSGFuZGxlIEkgdmFyaWFibGVzIGRpZmZlcmVudGx5IGZyb20gWCB2YXJpYWJsZXMuICBGaXgKLQl0aGUgb3JkZXIgb2YgbWludXMgZXhwcmVzc2lvbnMuCi0JKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IEdlbmVyYXRlIGFuIEkgdmFyaWFibGUgZm9yIGFuIE5OCi0JcmVjb3JkLiAgRml4IGhhbmRsaW5nIG9mIEFUSSBhbmQgQVRYIHJlY29yZHMuCi0JKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBPbmx5IHNldCBtaW5pbWFsIHNlY3Rpb24gYXR0cmlidXRlcy4KLQlBZGp1c3QgdGhlbSBsYXRlciwgYmFzZWQgb24gdGhlIHNlY3Rpb24gY29udGVudHMuCi0JKGllZWVfb2JqZWN0X3ApOiBSZWFkIGluIHRoZSBmaWxlIHVudGlsIGp1c3QgYWZ0ZXIgdGhlIE1FIHJlY29yZC4KLQlDYWxsIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIHRvIHNldCB0aGUgc2VjdGlvbiBmbGFncy4KLQkoZG9fb25lKTogQWRkIGl0ZXJhdGlvbnMgcGFyYW1ldGVyLiAgT25seSByZXBlYXQgdGhlIGZpcnN0IGxvYWQKLQlpdGVtLiAgU2V0IHRoZSBzZWN0aW9uIGFuZCBmaWxlIHJlbG9jIGZsYWdzLgotCShpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IFNldCBzZWN0aW9uIGZsYWdzLiAgUGFzcyBpdGVyYXRpb25zIHRvCi0JZG9fb25lLgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IEhhbmRsZSBJIHZhcmlhYmxlcy4KLQkoZG9fd2l0aF9yZWxvY3MpOiBPbmx5IGVtaXQgcmVsb2NhdGlvbiBzaXplIHdoZW4gbmVjZXNzYXJ5LgotCUluY3JlYXNlIE1BWFJVTiB0byAxMjcuICBDaGFuZ2Ugb3YgdG8gYmUgYXNzaWduZWQsIGFuZCB0YWtlCi0Jc3JjX21hc2sgYW5kIHBjcmVsX29mZnNldCBpbnRvIGFjY291bnQuCi0JKGllZWVfd3JpdGVfZGF0YV9wYXJ0KTogU2tpcCBzZWN0aW9ucyB0aGF0IGFyZSBub3QgbG9hZGVkLgotCShpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQpOiBEb24ndCBvdXRwdXQgb3B0aW9uYWwgbGFzdCBlbnRyeSBvZiBXWAotCXJlY29yZHMuCi0JKGllZWVfd3JpdGVfbWVfcGFydCk6IE1ha2Ugc2V0dGluZyBvZiBtZV9yZWNvcmQgbmVhdGVyLgotCShpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IEdldCB0aGUgc2l6ZSBvZiBhbiBhcmNoaXZlIGVsZW1lbnQuCi0KLQkqIHN5bXMuYyAoc3R0KTogQWRkIGVudHJpZXMgZm9yIHplcm92YXJzLCB2YXJzLCBhbmQgY29kZS4KLQotCSogZWxmY29kZS5oICh2YWxpZGF0ZV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHdyaXRlX3JlbG9jcyk6IENhbGwgdmFsaWRhdGVfcmVsb2MgZm9yIG5vbiBFTEYgcmVsb2NzLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKFRBUkdFVF9CSUdfU1lNKTogVXNlIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLgotCShUQVJHRVRfTElUVExFX1NZTSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcuYmZkIChtNjgqLSotcHNvcyopOiBOZXcgdGFyZ2V0LgotCi1UdWUgRmViIDEzIDE1OjU2OjIyIDE5OTYgIEJyeWFuIEZvcmQgIDxiYWZvcmRAc25ha2UuY3MudXRhaC5lZHU+Ci0KLQkqIGkzODZtc2Rvcy5jOiBSZW1vdmUgc29tZSAjaWYgMCBjb2RlLgotCShtc2Rvc193cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBpbmNsdWRlIGVtcHR5IHNlY3Rpb25zIGluIHRoZQotCXNpemUgY29tcHV0YXRpb24sIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgYWRkcmVzcy4KLQotVHVlIEZlYiAxMyAxNTozNjozNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBzZWdmYXVsdCBpZiBkeW5ib2oKLQlpcyBOVUxMLCBpZSwgdGhlIC1yIHN3aXRjaCBpcyB1c2VkLgotCi1UdWUgRmViIDEzIDE0OjM1OjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOiBEZWZpbmUuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KTogRGVmaW5lLgotCShCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNik6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfcmVsb2NfbWFwKTogTWFwIG5ldyByZWxvY3MuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSERMRkxBR1MgZm9yICotKi1ocHV4IHdpdGggLS1lbmFibGUtc2hhcmVkLgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogQ2hlY2sgdHMgYWdhaW5zdCAkKFNITElCKSwgbm90Ci0JJChTSExJTkspLgotCi0JKiBpZWVlLmMgKGdldF9zeW1ib2wpOiBTZXQgdGhlIHNlY3Rpb24gdG8gYmZkX2Fic19zZWN0aW9uLgotCShkb193aXRoX3JlbG9jcyk6IElmIEVYRUNfUCBpcyBzZXQgYW5kIHRoZXJlIGFyZSBubyByZWxvY3MsIHVzZSBhCi0Jc2ltcGxlIG51bWJlciBmb3IgdGhlIHNlY3Rpb24gYWRkcmVzcywgcmF0aGVyIHRoYW4gYW4gZXhwcmVzc2lvbi4KLQlMaW1pdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gcmVsb2NzIHRvIE1BWFJVTi4KLQkoaWVlZV93cml0ZV9tZV9wYXJ0KTogU2V0IG1lX3JlY29yZCB0byB0aGUgZmlsZSBvZmZzZXQgYWZ0ZXIgdGhlCi0Jc3RhcnQgYWRkcmVzcy4KLQkoaWVlZV93cml0ZV9wcm9jZXNzb3IpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBpZWVlX3dyaXRlX3Byb2Nlc3Nvci4KLQotRnJpIEZlYiAgOSAxMDo1MzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgJHtDQy1nY2N9IHdoZW4gdGVzdGluZyBmb3IgLXJwYXRoIG9uIFN1bk9TLgotCi0JKiBjb2ZmLWF1eC5jOiBDaGFuZ2UgaW5jbHVkZSBvZiBhdXguaCB0byBhdXgtY29mZi5oLgotCi1UaHUgRmViICA4IDE0OjAxOjAzIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBSXzY4S19SRUxBVElWRQotCXJlbG9jYXRpb24gcHV0IHRoZSBhZGRlbmQgYm90aCBpbiB0aGUgcmVsb2MgZW50cnkgYW5kIHRoZSBkYXRhLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4gIE1hc2sgb3V0IG1hcmtlciBpbgotCUdPVCBvZmZzZXQgdmFsdWUuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIHJlc29sdmUKLQlhIFJfNjhLX1BDeHggcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgZ2xvYmFsIHN5bWJvbCBkaXJlY3RseS4KLQkoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogRG9uJ3QgY291bnQgc3VjaCBhIHJlbG9jLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IERvbid0IHJlY29yZCBhIHN5bWJvbCB3aXRoCi0JYSBQTFR4eCByZWxvYyBhcyBkeW5hbWljLiAgRGlzYWxsb3cgUExUeHhPIHJlbG9jIGFnYWluc3QgYSBsb2NhbAotCXN5bWJvbCBmb3Igbm93LCBvdGhlcndpc2UgYWx3YXlzIHJlY29yZCB0aGUgc3ltYm9sIGFzIGR5bmFtaWMuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIHdpdGggYSBQTFR4eCByZWxvYwotCWlzIG5vdCByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBhcmUgbm90IG1ha2luZyBhCi0Jc2hhcmVkIG9iamVjdCwgdGhlbiBkb24ndCBtYWtlIGEgUExUIGVudHJ5LiAgSWYgd2UgZG8gbWFrZSBhIFBMVAotCWVudHJ5LCBtYWtlIHN1cmUgdGhlIHN5bWJvbCBoYXMgYmVlbiByZWNvcmRlZCBhcyBkeW5hbWljLgotCi1XZWQgRmViICA3IDEzOjU2OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFdoZW4gbWFraW5nIGEgc2hhcmVkIGxpYnJhcnksIHNldCBITERGTEFHUyB0bwotCXBhc3MgYW4gYXBwcm9wcmlhdGUgLXJwYXRoIG9wdGlvbi4gIFVzZSB0aGUgbWFrZSB2YXJpYWJsZSBTT05BTUUKLQlhcyB0aGUgc2hhcmVkIGxpYnJhcnkgc29uYW1lLCByYXRoZXIgdGhhbiBjb21wdXRpbmcgaXQgaGVyZS4gIE9uCi0JU3VuT1MsIGJ1aWxkIHN0YW1wLXRzaGxpbmsgaW4gcGxhY2Ugb2YgJChTSExJTkspLgotCSogTWFrZWZpbGUuaW4gKFNPTkFNRSk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJTkspKTogTWFrZSBhIGxpbmsgdG8gdGhlIHRyYW5zZm9ybWVkIG5hbWUsIGFzIHdlbGwuCi0JKHN0YW1wLXRzaGxpbmspOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogU2tpcCBzdGFtcC10c2hsaW5rIGR1cmluZyBpbnN0YWxsLgotCi1XZWQgRmViICA3IDEzOjM3OjM5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG8gbm90IGFzc3VtZSB0aGF0IHRoZQotCWxpbmtlciBzZWN0aW9ucyBoYXZlIGJlZW4gc2V0IHVwIHlldC4KLQotCSogZWxmLmMgKG1ha2VfbWFwcGluZyk6IEFkZCBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHN1cHByZXNzCi0JbWFraW5nIHRoZSBmaXJzdCBzZWN0aW9uIGluY2x1ZGUgdGhlIHByb2dyYW0gaGVhZGVycy4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogSWYgdGhlIHVzZXIgdXNlZCAtVHRleHQgc3VjaCB0aGF0IHRoZQotCXByb2dyYW0gaGVhZGVycyBhcmUgb24gYSBkaWZmZXJlbnQgcGFnZSwgZG8gbm90IHNldCB0aGUgZmxhZ3MKLQlzYXlpbmcgdGhhdCB0aGlzIHNlY3Rpb24gaW5jbHVkZXMgdGhlIHByb2dyYW0gaGVhZGVycy4KLQotVHVlIEZlYiAgNiAxNDowNDo0OSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldGJzZCopOiBTZXQgQ09SRUZJTEUgdG8gbmV0YnNkLWNvcmUuYy4KLQlkb24ndCBkZWZpbmUgVFJBRF9IRUFERVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIG5ldGJzZC1jb3JlLmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBOZXRCU0QgY29yZSBmaWxlcy4KLQkqIGhvc3RzLypuYnNkLmg6IFJlbW92ZWQuCi0KLVR1ZSBGZWIgIDYgMTE6NDc6NDkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TUEFSQ19bNTY3XSk6IE5ldyByZWxvYyB0eXBlcy4KLQkoQkZEX1JFTE9DX1NQQVJDX0xPNyByZWxvYyB0eXBlKTogRGVsZXRlZC4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWVkIGZyb20KLQliZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwLgotCShyZWxvY190eXBleyxfbmFtZXN9KTogRGVsZXRlZC4KLQkoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW5hbWVkIGZyb20gZWxmX3NwYXJjX2hvd3RvX3RhYmxlLgotCUFkZCBzcGFyYzY0IHJlbG9jcy4KLQkoc3BhcmNfcmVsb2NfbWFwKTogQWRkIHNwYXJjNjQgcmVsb2NzLgotCShzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBIYW5kbGUgUl9TUEFSQ19XRElTUHsxNiwxOX0uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3dkaXNwMTZfcmVsb2MpOiBEZWxldGVkLgotCShyZWxvY190eXBleyxfbmFtZXN9KTogRGVsZXRlZC4KLQkoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRGVsZXRlZC4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVsZXRlZC4KLQkoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW5hbWVkIGZyb20gZWxmX3NwYXJjX2hvd3RvX3RhYmxlLgotCShiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQ2hhbmdlIGZyb20gZnVuY3Rpb24gdG8gI2RlZmluZS4KLQotVHVlIEZlYiAgNiAxMjoxMjoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBNYWtlIFNITElCX0NGTEFHUyBpbmNsdWRlICQoUElDRkxBRykgb24gYQotCSotKi1ocHV4KiBob3N0LgotCi0JKiBNYWtlZmlsZS5pbiAocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSk6IE5ldyB2YXJpYWJsZS4KLQkoaW5zdGFsbCk6IFRyYW5zZm9ybSBsaWJyYXJ5IG5hbWUgYmVmb3JlIGluc3RhbGxpbmcgaXQuCi0KLU1vbiBGZWIgIDUgMTA6Mzg6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9pOTYwX2h4KTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY3B1LWk5NjAuYyAoc2Nhbl85NjBfbWFjaCk6IEFjY2VwdCBtYWNoaW5lICJoeCIuCi0JKE1BVFJJWCk6IEV4cGFuZCBlbnRyaWVzIGZvciBIWC4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBpOTYwOmh4IGVudHJ5LgotCSogYm91dC5jIChiX291dF9zZXRfYXJjaF9tYWNoKTogSGFuZGxlIGJmZF9tYWNoX2k5NjBfaHguCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEhhbmRsZSBGX0k5NjBIWC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUgYmZkX21hY2hfaTk2MF9oeC4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGFzIGEgc2hhcmVkIGxpYnJhcnksIGJhc2VkIG9uIHBhdGNoZXMgZnJvbQotCUFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIHNoYXJlZCBhbmQgY29tbW9uYmZkbGliLgotCU5ldyBzdWJzdGl0dXRpb25zOiBBTExMSUJTLCBQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsCi0JU0hMSUJfQ0ZMQUdTLCBDT01NT05fU0hMSUIsIFBJQ0xJU1QsIFNITElOSy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBJZiAtLWVuYWJsZS1zaGFyZWQsIGFkanVzdCBzaGFyZWQgbGlicmFyeSBzdHVmZgotCWJhc2VkIG9uIHRoZSBob3N0LiAgSWYgdGhlIGhvc3QgaXMgU3VuT1MsIGFuZCB0aGUgbGlua2VyIHN1cHBvcnRzCi0JLXJwYXRoLCBzZXQgSExERkxBR1MgdG8gdXNlIGl0LgotCSogTWFrZWZpbGUuaW4gKEFMTExJQlMpOiBOZXcgdmFyaWFibGUuCi0JKFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywgU0hMSUJfQ0ZMQUdTKTogTmV3IHZhcmlhYmxlcy4KLQkoQ09NTU9OX1NITElCLCBTSExJTkspOiBOZXcgdmFyaWFibGVzLgotCSguYy5vKTogSWYgUElDRkxBRyBpcyBzZXQsIGNvbXBpbGUgdHdpY2UsIG9uY2UgUElDLCBvbmNlIG5vcm1hbC4KLQkoU1RBR0VTVFVGRik6IFJlbW92ZSB2YXJpYWJsZS4KLQkoYWxsKTogRGVwZW5kIHVwb24gJChBTExMSUJTKSBhbmQgQFBJQ0xJU1RAIHJhdGhlciB0aGFuCi0JJChUQVJHRVRMSUIpLgotCShzdGFtcC1vZmlsZXMpOiBOZXcgdGFyZ2V0LCBsaWtlIG9sZCBvZmlsZXMgdGFyZ2V0LCBidXQgYnVpbGQKLQl1c2luZyBhIHRlbXBvcmFyeSBmaWxlIGFuZCBtb3ZlLWlmLWNoYW5nZSwgYW5kIHRvdWNoIHN0YW1wLW9maWxlcwotCXdoZW4gZG9uZS4KLQkob2ZpbGVzKTogSnVzdCBkZXBlbmQgdXBvbiBzdGFtcC1vZmlsZXMuCi0JKHN0YW1wLXBpY2xpc3QsIHBpY2xpc3QpOiBOZXcgdGFyZ2V0cy4KLQkoJChTSExJQiksICQoU0hMSU5LKSk6IE5ldyB0YXJnZXRzLgotCSh0YXJnZXRzLm8sIGFyY2h1cmVzLm8pOiBCdWlsZCB0d2ljZSBpZiBQSUNGTEFHIGlzIHNldC4KLQkoZG9fbW9zdGx5Y2xlYW4pOiBSZW1vdmUgcGljLyouby4KLQkoZG9fY2xlYW4pOiBSZW1vdmUgc3RhbXAtb2ZpbGVzLCAkKFNITElCKSwgJChTSExJTkspLCBwaWNsaXN0LCBhbmQKLQlzdGFtcC1waWNsaXN0LgotCShkb19kaXN0Y2xlYW4pOiBSZW1vdmUgcGljIGFuZCBzdGFtcC1waWNkaXIuCi0JKGluc3RhbGwpOiBJbnN0YWxsIHNoYXJlZCBsaWJyYXJpZXMuCi0JKCQoT0ZJTEVTKSk6IERlcGVuZCB1cG9uIHN0YW1wLXBpY2Rpci4KLQkoc3RhbXAtcGljZGlyKTogTmV3IHRhcmdldC4KLQotCSogbGliY29mZi1pbi5oOiBBZGQgY29tbWVudCByZW1pbmRpbmcgcGVvcGxlIHRoYXQgbGliY29mZi5oIGlzIGEKLQlnZW5lcmF0ZWQgZmlsZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgdHJ5IHRvIGdldCB0aGUKLQlmbGF2b3VyIG9mIGEgc2VjdGlvbiB3aXRoIG5vIG93bmVyLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ2xlYXIKLQlFTEZfTElOS19OT05fRUxGIGZsYWcuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBlbGYuYzogUmV2ZXJ0IGxhc3QgY2hhbmdlLCBzaW5jZSBpdCBicmVha3MgZHluYW1pYyBsaW5raW5nLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSB3YW50X2hkcl9pbl9zZWcKLQlmaWVsZC4KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3dhbnRfaGRyX2luX3NlZyk6IERvbid0IGRlZmluZS4KLQkoZWxmTk5fYmVkKTogRG9uJ3QgaW5pdGlhbGl6ZSB3YW50X2hkcl9pbl9zZWcgZmllbGQuCi0KLVN1biBGZWIgIDQgMjA6NDU6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIHRoZSBiYWNrZW5kIGRvZXMKLQlub3Qgd2FudCB0aGUgZWxmIGhlYWRlciBvciB0aGUgcHJvZ3JhbSBoZWFkZXJzIGluIHRoZSBhZGRyZXNzCi0Jc3BhY2UsIGRvIG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIGNhbGN1bGF0aW9ucy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBOZXcgaG9vawotCWZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIGFkZGl0aW9uYWwgcHJvZ3JhbSBoZWFkZXJzLgotCShwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCk6IERlZmluZSBhcyBhIE5PUCBmdW5jdGlvbiBmb3Igbm93LgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IC5zZGF0YTIgaXMgYSByZWFkLW9ubHkgc2VjdGlvbi4KLQotU2F0IEZlYiAgMyAyMzowMDowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmg6IE1vdmUgdG9kYXkncyBsaWJjb2ZmLmggY2hhbmdlIGludG8gY29mZmNvZGUuaC4KLQotU2F0IEZlYiAgMyAxNTo0Mzo0NCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi5oIChiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKTogQ29tYmluZSBtYWNybyBhcmdzCi0JYmFjayBpbnRvIG9uZSBsaW5lLiAgU29tZSBjb21waWxlcnMgKHN1bm9zIDQuMS4zIGZvciBleGFtcGxlKQotCXdvbid0IGFjY2VwdCBhcmdzIHNwbGl0IGFjcm9zcyBtb3JlIHRoYW4gb25lIGxpbmUuCi0KLUZyaSBGZWIgIDIgMTE6NDI6MTUgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0JJTkFSWV9GT1BFTik6IFVuZGVyc3RhbmQgY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLUZyaSBGZWIgIDIgMTI6MTI6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERvbid0Ci0JdHJ5IHRvIGRvIGFyaXRobWV0aWMgb24gYSB2b2lkICosIGNhc3QgaXQgdG8gYSB1bnNpZ25lZCBjaGFyICogZmlyc3QuCi0KLVRodSBGZWIgIDEgMTY6MDQ6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX05PTl9FTEYpOiBEZWZpbmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBTZXQgZWxmX2xpbmtfaGFzaF9mbGFncyB0bwotCUVMRl9MSU5LX05PTl9FTEYuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFJlc2V0IEVMRl9MSU5LX05PTl9FTEYKLQlmbGFnIGZvciBhIG5ld2x5IGRlZmluZWQgc3ltYm9sLgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBMaWtld2lzZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIEVMRl9MSU5LX05PTl9FTEYgaXMgc2V0LCB0cnkgdG8KLQlzZXQgdGhlIERFRiBvciBSRUZfUkVHVUxBUiBmbGFncyBjb3JyZWN0bHkuCi0KLQkqIE1ha2VmaWxlLmluIChiZmQtaW4yLmgpOiBNYWtlIGJmZC5oLCBub3QgcHJvdG9zLCBpbiBkb2NkaXIuCi0JKGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBEb24ndCByZWNvcmQgYSBzeW1ib2wgd2l0aAotCWEgUExUMzIgcmVsb2MgYXMgZHluYW1pYy4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgd2l0aCBhIFBMVDMyIHJlbG9jCi0JaXMgbm90IHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEKLQlzaGFyZWQgb2JqZWN0LCB0aGVuIGRvbid0IG1ha2UgYSBQTFQgZW50cnkuICBJZiB3ZSBkbyBtYWtlIGEgUExUCi0JZW50cnksIG1ha2Ugc3VyZSB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlY29yZGVkIGFzIGR5bmFtaWMuCi0KLVdlZCBKYW4gMzEgMTc6MjM6MzIgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfMzJfUENSRUwuCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLXdpbjMyKTogQmVjb21lcyBpWzM0NV04Ni0qLWN5Z3dpbjMyLgotCShwb3dlcnBjbGUtKi1jeWd3aW4zMik6IE5ldy4KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBHZXQgYWRkcmVzcyBmcm9tIHZtYS4KLQotV2VkIEphbiAzMSAxNjoyMzo1NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogSWYgdGhlIHN5bWJvbAotCWF0dGFjaGVkIHRvIHRoZSBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhcyBhbiB1bmRlZmluZWQKLQlzeW1ib2wsIHRyZWF0IGl0IGFzIGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LgotCi1XZWQgSmFuIDMxIDE2OjE2OjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBvdXRwdXQgaW5pdGlhbCBkdW1teQotCXN5bWJvbCBvciBzZWN0aW9uIHN5bWJvbHMgaWYgc3RyaXBwaW5nIGFsbCBzeW1ib2xzIGFuZCB0aGlzIGlzIG5vdAotCWEgcmVsb2NhdGVhYmxlIGxpbmsuICBEb24ndCBvdXRwdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgaWYKLQl0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQkoZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzIHRvIGZsdXNoLgotCi1XZWQgSmFuIDMxIDEyOjU1OjQ5IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb2ZmLWF1eC5jOiBOZXcgZmlsZS4KLQkqIGhvc3RzL202OGthdXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgbmF0aXZlIGhvc3QuCi0JKG02OGthdXhfY29mZl92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChtNjhrYXV4X2NvZmZfdmVjKTogRGVjbGFyZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZAotCV9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLgotCShiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKTogRGVmaW5lLgotCShjb21wYXJlX2FyZWxlbnRfcHRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZiBUQVJHX0FVWC4KLQkoY29mZl93cml0ZV9yZWxvY3MpOiBJZiBUQVJHX0FVWCwgc29ydCB0aGUgcmVsb2NzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBBL1VYIGFvdXRoZHIgbWFnaWMgbnVtYmVyLgotCShjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYWxsCi0JYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCByYXRoZXIgdGhhbgotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCSogY29mZi1tNjhrLmMgKENPRkZfUEFHRV9TSVpFKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hdXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtYXV4LmMuCi0KLVdlZCBKYW4gMzEgMTE6Mzc6NDYgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCBSXzY4S19HT1QqCi0JcmVsb2NhdGlvbjsgaWdub3JlIGFkZGVuZCB3aXRoIFJfNjhLX3tHT1QsUExUfSpPIHJlbG9jYXRpb24uCi0KLVR1ZSBKYW4gMzAgMTI6MDk6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IFJlbW92ZSAkKHNyY2RpcikvYmZkLWluMi5oLAotCSQoc3JjZGlyKS9saWJiZmQuaCBhbmQgJChzcmNkaXIpL2xpYmNvZmYuaC4KLQkobWFpbnRhaW5lci1jbGVhbik6IFdhcm4gYWJvdXQgZGVsZXRpbmcgc3BlY2lhbCBmaWxlcy4KLQkoYmZkLWluMi5oLCBsaWJiZmQuaCwgbGliY29mZi5oKTogTmV3IHRhcmdldHMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIGluZGlyZWN0IGFuZAotCXdhcm5pbmcgc3ltYm9scyBjb3JyZWN0bHkuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHN5bXMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBBZGQgY2FzdHMgdG8gYXZvaWQKLQl3YXJuaW5ncy4KLQotTW9uIEphbiAyOSAxNDoyNzoyNCAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oOiBhbGlnbmVkIG5ld2x5IGV4cG9ydGVkIG5hbWVzIHdpdGggYmZkIG5hbWluZwotCWNvbnZlbnRpb25zLiBSZW1vdmVkIGFuIGVycm9uZW91cyBkZWZpbmUgb2YgUE9XRVJQQ19MRV9QRS4KLSAJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jLCBjb2ZmLXBwYy5jOiB0aGUgYWJvdmUgZnVuY3Rpb24gbmFtZSBjaGFuZ2VzCi0KLU1vbiBKYW4gMjkgMTM6MDY6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBCYXNpbSBLYWRoaW0gPGthZGhpbUBzcG9jay5jcy5jb2xvcmFkby5lZHU+OgotCSogZWNvZmYuYyAoc3RydWN0IGV4dHN5bV9pbmZvKTogRGVmaW5lLgotCShfYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rKTogUGFzcyBhIHBvaW50ZXIgdG8gc3RydWN0IGV4dHN5bV9pbmZvCi0JdG8gZWNvZmZfbGlua193cml0ZV9leHRlcm5hbC4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IEFjY2VwdCBhIHN0cnVjdCBleHRzeW1faW5mbyBwb2ludGVyLgotCVN0cmlwIHN5bWJvbHMgd2hlbiBhcHByb3ByaWF0ZS4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogc3ltcy5jIChCU0ZfT0JKRUNUKTogRGVmaW5lLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogUHJpbnQgJ08nIGZvciBCU0ZfT0JKRUNULgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9PQkpFQ1QgZm9yIGFuCi0JU1RUX09CSkVDVCBzeW1ib2wuCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IE9ubHkgc2V0IHR5cGUgdG8gU1RUX09CSkVDVCBpZiBCU0ZfT0JKRUNUCi0JaXMgc2V0LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCB3aGVuCi0JY29weWluZyByZWxvY3MgaW50byBhIHNoYXJlZCBvYmplY3QsIHRyZWF0IGEgZGVmaW5lZCBnbG9iYWwgc3ltYm9sCi0JYXMgYSBsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgc2V0IHdlYWtkZWYgdG8gYQotCXJlYWwgZGVmaW5lZCBzeW1ib2wsIG5vdCB0byBhIHdlYWsgZGVmaW5lZCBzeW1ib2wuCi0KLU1vbiBKYW4gMjkgMTE6MzQ6MzYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmM6IHJlbW92ZWQgdGhlIFBPV0VSUENfTEVfUEUgaGFjaywgcHJvbW90ZWQgc29tZSB0eXBlcwotCWFuZCBtYWRlIGEgZmV3IHN0YXRpYyBmdW5jdGlvbnMgZXh0ZXJucy4KLQotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBuZXcgZnVuY3Rpb24sIHJlcGxhY2VzIHRoZQotCVBPV0VSUENfTEVfUEUgaGFjayBpbiBjb2ZmbGluay4KLQotCSogbGliY29mZi1pbi5oOiBwcm9tb3RlZCB0aGUgZm9sbG93aW5nIGZyb20gY29mZmxpbmsuYyB0byBhbGxvdwotCV9iZmRfY29mZl9maW5hbF9saW5rIHRvIGJlIG92ZXJyaWRkZW4gLSAgU1RSSU5HX1NJWkVfU0laRSwKLQljb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQsIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUsCi0JY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5LCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUsCi0JY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQsICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSwKLQljb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwLCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvLAotCWNvZmZfZmluYWxfbGlua19pbmZvLCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYywKLQljb2ZmX3dyaXRlX2dsb2JhbF9zeW0sIGNvZmZfbGlua19pbnB1dF9iZmQsIGNvZmZfcmVsb2NfbGlua19vcmRlci4KLQotCSogbGliY29mZi5oOiByZS1nZW4nZAotCi1GcmkgSmFuIDI2IDE4OjMzOjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jOiBJbmNsdWRlICJiZmRsaW5rLmgiLgotCShzdHJ1Y3Qgc3RhYl9maW5kX2luZm8pOiBEZWZpbmUuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsaW5lX2luZm8gZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBUcnkgY2FsbGluZwotCV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIGJlZm9yZSBzZWFyY2hpbmcgdGhlIEVMRgotCXN5bWJvbCB0YWJsZS4gIEZpbmQgdGhlIGNsb3Nlc3QgU1RUX0ZVTkMgc3ltYm9sLCBub3QgdGhlIGxhc3Qgb25lLgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IEFkZCBsaW5lX2luZm8gZmllbGQuCi0gCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVHJ5IGNhbGxpbmcKLQlfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSBiZWZvcmUgc2VhcmNoaW5nIHRoZSBDT0ZGCi0Jc3ltYm9sIHRhYmxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1GcmkgSmFuIDI2IDE2OjExOjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKFJfUFBDX0VNQl9TREEyMSByZWxvY2F0aW9ucyk6IE1ha2UgcmVsb2NhdGlvbiBzaXplCi0JNCBieXRlcywgc28gd2UgZ2V0IHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gdXBkYXRpbmcgdGhlIHJlZ2lzdGVyCi0JZmllbGQgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgotCi1UaHUgSmFuIDI1IDEyOjE0OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBSZW1vdmUgdG9jX3NlY3Rpb24gYW5kCi0JZW50cnlfc2VjdGlvbiBmaWVsZHMuICBBZGQgc250b2MgYW5kIHNuZW50cnkgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBzbnRvYyBhbmQgc25lbnRyeSwKLQlub3QgdG9jX3NlY3Rpb24gYW5kIGVudHJ5X3NlY3Rpb24gKHRoZSBDT0ZGIGZpbGUgZG9lcyBub3QgaGF2ZSBhbnkKLQlzZWN0aW9ucyBhdCB0aGlzIHBvaW50KS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgb19zbmVudHJ5IGFuZCBvX3NudG9jIGZyb20KLQlzbmVudHJ5IGFuZCBzbnRvYyByYXRoZXIgdGhhbiBlbnRyeV9zZWN0aW9uIGFuZCB0b2Nfc2VjdGlvbi4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgc250b2MgYW5kCi0Jc25lbnRyeSwgbm90IHRvY19zZWN0aW9uIGFuZCBlbnRyeV9zZWN0aW9uLgotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQKLQllbnRyeV9zZWN0aW9uIGZyb20gaGVudHJ5LgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IElmIGEgZGVmaW5lZCBzeW1ib2wgaGFzIFhDT0ZGX0VOVFJZIHNldCwKLQlzZXQgc25lbnR5LgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IFNldCBzbnRvYywgbm90IHRvY19zZWN0aW9uLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogR2V0IHRvY19zZWN0aW9uIGZyb20gc250b2MsIHJhdGhlcgotCXRoYW4gdXNpbmcgdG9jX3NlY3Rpb24gZGlyZWN0bHkuCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBtaXNzaW5nIGAuJyBpbiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotc2NvKmVsZiopOiBVc2UgYmZkX2VsZjMyX2kzODZfdmVjLiAgRnJvbQotCVJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT4uCi0KLVRodSBKYW4gMjUgMTI6MDg6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgLnJlbGEuc2RhdGF7LDJ9Ci0JdG8gc2VjdGlvbnMgd2UgYWxsb2NhdGUuICBVc2UgYmZkX3phbGxvYyB0byBhbGxvY2F0ZSBpbml0aWFsaWFsCi0Jc2VjdGlvbnMsIG5vdCBiZmRfYWxsb2MuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUmVtb3ZlIEJGRF9BU1NFUlRzIGZvciAhc2hhcmVkIGZyb20KLQlTREF7LDJ9STE2IHJlbG9jYXRpb25zLgotCShwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IFVzZSB0aGUgdmFsdWUgb2YgLUcgbm4gdG8gZGV0ZXJtaW5lCi0Jd2hldGhlciB0byBwdXQgc29tZXRoaW5nIGluIC5zYnNzIG9yIG5vdC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIHN1cHBvcnQgZm9yIG1vcmUgcmVsb2NhdGlvbnMuICBBZGQKLQlpbiBzZWMtPm91dHB1dF9vZmZzZXQgd2hlcmUgYXBwcm9wcmlhdGUuICBNYWtlIGVycm9yIG1lc3NhZ2VzCi0JaW5jbHVkZSB0aGUgc3ltYm9sIG5hbWUuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTG9va3VwIHN5bWJvbCBiZWZvcmUKLQl0cnlpbmcgdG8gYWRkIGl0IHRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwotCWRvZXNuJ3QgZ2V0IHJlZGVmaW5lZCBtZXNzYWdlcyBpZiAtc2hhcmVkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikgT25seSBidW1wIFJFTEEKLQlzZWN0aW9uIGlmIHRoZSByZWxfc2VjdGlvbiBmaWVsZCBoYXMgYmVlbiBzZXQgdXAuCi0KLVdlZCBKYW4gMjQgMjA6NDA6MjYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8gaW4gZWFiaQotCXJlbG9jYXRpb25zLgotCi1XZWQgSmFuIDI0IDEwOjM4OjM0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVsZXRlIGNoZWNraW5nCi0Jb2YgZmxhZ3MsIG9ubHkgZmxhZ3MgdXNlZCBhcmUgY29udHJvbGxlZCBieSBtYWNoIG51bWJlci4gIEJ1bXAgdXAKLQlvdXRwdXQgZmlsZSBtYWNoIG51bWJlciB0byBoaWdoZXN0IG9mIGlucHV0IGZpbGUgbWFjaCBudW1iZXJzLgotCShlbGYzMl9zcGFyY19vYmplY3RfcCk6IFdhdGNoIGZvciBFRl9TUEFSQ19TVU5fVVMxLgotCShlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IEVGX1NQQVJDX1NVTl9VUzEgaWYgdjhwbHVzYS4KLQotCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLXtzeXN2NCosc29sYXJpczIqfSk6IENvbW1lbnQgb3V0Ci0JYmZkX2VsZjY0X3NwYXJjX3ZlYyBzdXBwb3J0LgotCi1UdWUgSmFuIDIzIDE0OjMzOjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgY29tcGxhaW4gaWYKLQl0aGUgZW1iZWRkZWQgYml0IGlzIHNldCBvbiBzb21lIG9iamVjdHMgYW5kIG5vdCBvbiBvdGhlcnMuICBKdXN0Ci0Jb3IgaXQgdG9nZXRoZXIuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEltcGxlbWVudCBSX1BQQ19FTUJfe1NEQTIxLFJFTFNEQX0KLQlyZWxvY2F0aW9ucy4KLQotVHVlIEphbiAyMyAxNDoyMjo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IHRyeSB0byBhbGlnbiB0aGUKLQkuc3RhYnN0ciBzZWN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IHRoZSBoYW5kbGluZyBvZiB0aGUKLQkubGliIHNlY3Rpb24gdG8gd29yayBldmVuIGlmIHRoZSBlbnRpcmUgc2VjdGlvbiBjb250ZW50cyBhcmUKLQl3cml0dGVuIGF0IG9uY2UuICBGcm9tIEd2cmFuIFVkZGVib3JnIDxndnJhbkB1ZGRlYm9yZy5wcC5zZT4gYW5kCi0JUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotTW9uIEphbiAyMiAxODo0NTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRG9uJ3QgYWxsb2NhdGUKLQltZW1vcnkgaGVyZSBmb3IgY29udGVudHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBCdW1wIHVwIF9TREFfQkFTRV8gYW5kCi0JX1NEQTJfQkFTRV8gYnkgMzI3NjguCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogI2lmIG91dCBQTFQgY29kZSB3aGljaCB3ZSBoYXZlbid0Ci0Jc3RhcnRlZCB1c2luZy4gIEFsbG9jYXRlIGNvbnRlbnRzIGZvciAuc2RhdGEgYW5kIC5zZGF0YTIgc2VjdGlvbnMKLQlhbHNvLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFVzZSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSBpbiBkZWJ1ZyBtZXNzYWdlLAotCXJhdGhlciB0aGFuIF9uYW1lLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFJlbW92ZSBjb2RlIHRoYXQgYXR0ZW1wdGVkIHRvCi0Jc2l6ZSBfU0RBeywyfV9CQVNFXy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hhbmdlIGhvdyBzZGF0YXssMn0gcmVsb2NhdGlvbnMgYXJlCi0JZG9uZS4KLQotTW9uIEphbiAyMiAwODo1MjowNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBGaXggdHlwby4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfdjkpOiBSZW5hbWVkIGZyb20gYmZkX21hY2hfc3BhcmM2NC4KLQkoYmZkX21hY2hfc3BhcmNfe3Y4cGx1cyx2OHBsdXNhfSk6IERlZmluZS4KLQkoYmZkX21hY2hfc3BhcmNfdjlhKTogRGVmaW5lLgotCShiZmRfbWFjaF9zcGFyY192OV9wKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGFvdXR4LmggKGFvdXQsbWFjaGluZV90eXBlKTogYmZkX21hY2hfc3BhcmM2NCByZW5hbWVkIHRvCi0JYmZkX21hY2hfc3BhcmNfdjkuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9vYmplY3RfcCk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLXN5c3Y0KixzcGFyYzY0LSotc29sYXJpczIqKTogU2V0IHRhcmdfZGVmdmVjCi0JdG8gYmZkX2VsZjMyX3NwYXJjX3ZlYy4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogUmVuYW1lZCBmcm9tIHNwYXJjX2FyY2hfaW5mby4KLQlBZGQgdjhwbHVzeyxhfSBzdXBwb3J0LgotCUFkZCB2OWEgc3VwcG9ydC4KLQkoc3BhcmNfY29tcGF0aWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZjMyLXNwYXJjLmg6ICNpbmNsdWRlICJlbGYvc3BhcmMuaCIuCi0JKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIGVsZjMyX3NwYXJjX29iamVjdF9wLAotCWVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIGVsZl9iYWNrZW5kX29iamVjdF9wLAotCWVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWZpbmUuCi0KLU1vbiBKYW4gMjIgMTE6MjE6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkCi0JbGlua2VyX3NlY3Rpb25fcG9pbnRlciBmaWVsZC4KLQkoZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSk6IEVudW1lcmF0aW9uIGZvciBuZXcgd2F5IG9mCi0JY3JlYXRpbmcgbGlua2VyIGR5bmFtaWMgc2VjdGlvbnMgYW5kIHN5bWJvbHMuCi0JKGVsZl9saW5rZXJfc2VjdGlvbnssX3BvaW50ZXJzfSk6IE5ldyBzdHJ1Y3R1cmVzIGZvciBjcmVhdGluZwotCWR5bmFtaWMgc2VjdGlvbnMgYW5kIHN5bWJvbHMuCi0JKGVsZl9vYmpfdGRhdGEpOiBBZGQgbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgYW5kIGxpbmtlcl9zZWN0aW9uCi0JZmllbGRzLgotCShlbGZfbG9jYWxfcHRyX29mZnNldHMsZWxmX2xpbmtlcl9zZWN0aW9uKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGRlY2xhcmF0aW9ucy4KLQkoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRGl0dG8uCi0JKGJmZF9lbGZ7MzIsNjR9X3tjcmVhdGUsZmluaXNofV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRGl0dG8uCi0JKF9iZmRfZWxmX21ha2VfbGlua2VyX3NlY3Rpb25fcmVsYSk6IERpdHRvLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVsZXRlLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0byBjcmVhdGUgdGhlCi0Jc2VjdGlvbnMgLmdvdCwgLnNkYXRhLCBhbmQgLnNkYXRhMi4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBaYXAgLnJlbGEue3NkYXRhLHNkYXRhMn0gaWYKLQluZWVkZWQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogU3VwcG9ydCBtb3JlIG9mIHRoZSBlYWJpIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2xzKTogQWRqdXN0IF9TREF7LDJ9X0JBU0VfIGJ5IDMyNzY4Ci0JaWYgdGhlIC5zZGF0YXssMn0gKyAuc2Jzc3ssMn0gc2VjdGlvbiBzaXplIGlzID4gMzJrLgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBpbml0aWFsaXplZCBwb2ludGVycyBpbiBkeW5hbWljIGxpbmtlciBzZWN0aW9ucy4KLQkoZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQWN0dWFsbHkgaW50aWFsaXplIHRoZQotCXBvaW50ZXJzIGNyZWF0ZWQgYWJvdmUuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2VsZnszMiw2NH1fY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBOZXcKLQltYWNyb3MgdG8gcHJvdmlkZSBib3RoIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMgb2YKLQllbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24uCi0JKGJmZF9lbGZ7MzIsNjR9X2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogTmV3IG1hY3JvcyB0bwotCXByb3ZpZGUgYm90aCAzMiBhbmQgNjQgYml0IHZlcnNpb25zIG9mCi0JZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBhIGxpbmtlciBzZWN0aW9uLgotCShfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBGaW5kIGEgdW5pcXVlIHBvaW50ZXIgdG8gYQotCWdpdmVuIGFkZHJlc3MgaW4gdGhlIGxpbmtlciBwb2ludGVyIG9mZnNldHMgY3JlYXRlZCBmb3IgYSBnaXZlbgotCXN5bWJvbC4KLQkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogTWFrZSBhIFJFTEEgc2VjdGlvbgotCWNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRlZCBsaW5rZXIgc2VjdGlvbi4KLQotU2F0IEphbiAyMCAwODozNjoxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChFTEZfTUFDSElORV9BTFQxKTogRGVmaW5lLgotCi1UaHUgSmFuIDE4IDE4OjI1OjM0IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogY2hhbmdlZCBUT0NERUZOIHJlbG9jcy4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBzcGVjaWFsIHZhbHVlcyBmb3IgZ2NjIGJ1aWx0IGRsbHMuCi0JKGR1bXBfdG9jKTogZml4IGRpYWdub3NpbmcgY29kZSB0byBpZGVudGlmeSBvdXQtb2YtdG9jLWJvdW5kcyBlbnRyaWVzLgotCUFsc28gYmVnaW4gdGhlIHRvYyBhdCA0IGFzIGFuIGV5ZSBjYXRjaGVyICgnMzEzMTMxMzEnIG1hcmtzIHRoZSBmaXJzdAotCXRvYyBlbnRyeSBpbiBhbiBvYmpkdW1wKSBmb3Igbm93LgotCShwcGNfZG9fbGFzdCwgcHBjX2dldF9sYXN0KTogTmV3IGZ1bmN0aW9uIC0gbmVlZGVkIHRvIHNhdmUgcHJvY2Vzc2luZwotCXRoZSB0b2Mgb3duZXIgdG8gdGhlIGVuZC4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IFJlbW92ZWQgYW4gaW5jb3JyZWN0IGhhY2sgZm9yIGRvaW5nIHRoZQotCXRvYyBvd25lciBsYXN0LgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEFkZGVkIGEgbmV3IGhhY2sgdG8ga2VlcCB0aGUKLQl0b2Mgb3duZXIgZnJvbSBiZWluZyBkb25lIHRpbGwgbGFzdC4gTXVzdCBkZWZpbmUgUE9XRVJQQ19MRV9QQwotCXRvIGVuYWJsZSBpdC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBhbGlnbm1lbnQgc2V0dGluZyBmb3IgLnN0YWIKLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IHNldCBzZWN0aW9uIGZsYWdzIGZvciBzdGFiL3N0cgotCXRvIElORk8uCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IFJlbW92ZWQgYSBub24td29ya2luZyBoYWNrIGZvciBjb21wdXRpbmcgdGhlCi0JU2l6ZU9mSW1hZ2UgZm9yIFBvd2VyUEMuIElnbm9yZSB0aGUgc2l6ZSBvZiB0aGUgLmp1bmsgc2VjdGlvbi4KLQotVGh1IEphbiAxOCAxNzo0MjoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaDogSW5jbHVkZSA8c2lnbmFsLmg+IGJlZm9yZSA8c3lzL3Byb2Nmcy5oPi4KLQotV2VkIEphbiAxNyAxMjo0MDoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1wb3dlcnBjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbGFzdCBlbnRyeSB0byBub3QgcG9pbnQKLQliYWNrIHRvIGZpcnN0LgotCShiZmRfcG93ZXJwY19hcmNoKTogUG9pbnQgYXQgZmlyc3QgZW50cnkgaW4gYXJjaF9pbmZvX3N0cnVjdC4KLQotVHVlIEphbiAxNiAxNToxMDo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRG9uJ3QgaW5jcmVtZW50IGZpbGUKLQlvZmZzZXQgZm9yIGEgc2VnbWVudCB3aGljaCBjb250YWlucyBubyBsb2FkYWJsZSBzZWN0aW9ucy4KLQotTW9uIEphbiAxNSAxNzo0NjoyNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCBuZXcgUG93ZXJQQyByZWxvY2F0aW9ucy4KLQkqIHtiZmQtaW4yLGxpYmJmZH0uaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIG1vcmUgUFBDIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTG9va3VwIG5ldyByZWxvY2F0aW9ucy4KLQotTW9uIEphbiAxNSAxNDoyOTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IEZpeCBSRUxPQ19CQVNFMTAgYW5kIFJFTE9DX0JBU0UyMgotCWVudHJpZXMuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IERvbid0IGZhaWwgYXNzZXJ0IGlmCi0gICAgICAgIGluZm8tPnNoYXJlZC4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgdHJ5IHRvIGNhY2hlCi0JaW5mb3JtYXRpb24gaW4gc2VjdGlvbnMgdGhhdCBhcmUgbm90IG93bmVkIGJ5IGEgQkZELiAgRnJvbSBSaWNoYXJkCi0JSGVuZGVyc29uIDxyaWNoYXJkQGF0aGVpc3QudGFtdS5lZHU+LgotCi0JKiBlbGYzMi1taXBzLmM6IE51bWVyb3VzIGNoYW5nZXMgdG8gZHluYW1pYyBsaW5raW5nIGNvZGUsIG1vc3RseQotCWZyb20gS2F6dW1vdG8gS29qaW1hIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4uCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBSZW1vdmUgc3BlY2lhbCBjaGVjayBmb3IKLQlfcmxkX25ld19pbnRlcmZhY2UuCi0KLQkqIGVjb2Zmc3dhcC5oOiBBZGQgcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQotU3VuIEphbiAxNCAyMTozNjowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3t1bnN1cHBvcnRlZCxzdGR9X3JlbG9jKTogUmVtb3ZlIGZ1bmN0aW9ucy4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBSZW1vdmUgcHBjX2VsZl97dW5zdXBwb3J0ZWQsc3RkfV9yZWxvYwotCXJlZmVyZW5jZXMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBObyBsb25nZXIgYWxsb3cgLnNkYXRhLy5zYnNzIHNlY3Rpb25zCi0JdG8gc2F0aXNmeSBhIFRPQzE2IHJlbG9jYXRpb24uIAlSZXdyaXRlIHVuc3VwcG9ydGVkIHJlbG9jYXRpb24KLQlzdXBwb3J0LiAgQmVnaW4gc3VwcG9ydCBmb3IgUl9QUENfU0RBezIsfVJFTC4KLQotU2F0IEphbiAxMyAwOTozNjo1MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIHRoZSAuZ290IGFuZCAuZ290Lm5lZyBzZWN0aW9ucy4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIGl0LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IENhbGwgaXQuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU3VwcG9ydCAuZ290Lm5lZywganVzdCBsaWtlIC5nb3QuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQWRkIGVycm9yIG1lc3NhZ2VzIGZvciByZWxvY2F0aW9ucyB3ZQotCWRvbid0IHlldCBzdXBwb3J0LiAgRG8gbm90IGluY2x1ZGUgUl9QUENfU0RBUkVMMTYgbGlrZSBhIEdPVAotCXJlbG9jYXRpb24uCi0KLUZyaSBKYW4gMTIgMTU6Mjc6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9mYWtlX3NlY3Rpb25zKTogRGVmaW5lLCBhbmQgaGFuZGxlIHRoZSBuZXcKLQlzZWN0aW9uIGZsYWdzIGZvciBWLjQgYW5kIGVhYmkuCi0KLUZyaSBKYW4gMTIgMTM6NTk6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIGEgc2VnbWVudAotCWNvbnRhaW5zIG5vIHNlY3Rpb25zLCBkb24ndCBtYXJrIGl0IGFzIHJlYWRhYmxlLgotCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERvbid0IGRlY2xhcmUuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRHVtcCBjb250ZW50cyBvZgotCWR5bmFtaWMgc2VjdGlvbiwgaWYgdGhlcmUgaXMgb25lLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IEFkZCBzd2FwX2R5bl9pbiBmaWVsZC4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX2luKTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIHBhcmFtZXRlciB0byBQVFIuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9keW5faW4pOiBDaGFuZ2UgdHlwZSBvZiBzZWNvbmQgcGFyYW1ldGVyIHRvCi0JUFRSLgotCShOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykpOiBJbml0aWFsaXplIHN3YXBfZHluX2luIGZpZWxkLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyZWF0ZSBhCi0JRFRfVEVYVFJFTCBlbnRyeSBiZWNhdXNlIG9mIC5yZWwucGx0LiAgRnJvbSBNYXJ0aW4gUGlya2VyCi0JPHBpcmtlckBlaXVuaXgudHV3aWVuLmFjLmF0Pi4KLQotVGh1IEphbiAxMSAxNzowNjoxNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX3tFWENMVURFLFNPUlRfRU5UUklFU30pOiBOZXcgc2VjdGlvbiBmbGFncyBmb3IKLQlQb3dlclBDIFYuNCBhbmQgZWFiaS4KLSAJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJmZC5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoVEFSR0VUX3tCSUcsTElUVExFfV9TWU0pOiBBZGQgbmV3IGZsYWdzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFN1cHBvcnQgU0hUX09SREVSRUQKLQlzZWN0aW9uIHR5cGUgYW5kIFNIRl9FWENMVURFIHNlY3Rpb24gZmxhZywgdHVybmluZyB0aGVtIGludG8gdGhlCi0JYXBwcm9wcmlhdGUgYmZkIHNlY3Rpb24gZmxhZy4KLQotVGh1IEphbiAxMSAxMToyMzozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ3JlYXRlIHRoZSBzcGVjaWFsCi0Jc2VjdGlvbnMgaWYgd2Ugc2VlIGEgRFlOQU1JQyBvYmplY3QsIGluIGNhc2UgdGhhdCBpcyB0aGUgb25seQotCVhDT0ZGIGlucHV0IG9iamVjdCB3ZSBzZWUuCi0KLQkqIGVsZjMyLW1pcHMuYzogRXh0ZW5zaXZlIGNoYW5nZXMgZm9yIGEgc3RhcnQgYXQgZHluYW1pYyBsaW5raW5nCi0Jc3VwcG9ydCwgZnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCB0eXBlX2NoYW5nZV9vayBmaWVsZC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUKLQllbGZfYmFja2VuZF9jcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGZpZWxkLiAgQWRkCi0JZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgYW5kCi0JZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwIGZpZWxkcy4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vayk6IERlZmluZSBpZiBub3QKLQlkZWZpbmVkLgotCShlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX3Byb2dyYW1faGVhZGVycyk6IERvbid0IGRlZmluZS4KLQkoZWxmTk5fYmVkKTogQ2hhbmdlIHRvIGFjY291bnQgZm9yIGZpZWxkIGNoYW5nZXMuCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IENhbGwgbmV3Ci0JbW9kaWZ5X3NlZ21lbnRfbWFwIGJhY2tlbmQgZnVuY3Rpb24uICBEb24ndCBjYWxsIG9sZAotCWNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgYmFja2VuZCBmdW5jdGlvbi4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBDYWxsIGFkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIHJhdGhlcgotCXRoYW4gY3JlYXRlX3Byb2dyYW1faGVhZGVycy4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSW5pdGlhbGl6ZQotCXR5cGVfY2hhbmdlX29rIGZyb20gbmV3IGJhY2tlbmQgZmllbGQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCB3YXJuIGlmIF9ybGRfbmV3X2ludGVyZmFjZSBpcwotCWRlZmluZWQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMKLQlhIHJlbG9jIGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHRkYXRhIGZpZWxkLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbmFtZSBwcGNfZmxhZ3NfaW5pdCBmaWVsZCB0byBmbGFnc19pbml0LgotCShlbGZfZmxhZ3NfaW5pdCk6IFJlbmFtZSBmcm9tIGVsZl9wcGNfZmxhZ3NfaW5pdC4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogVXNlIGVsZl9mbGFnc19pbml0LCBub3QKLQllbGZfcHBjX2ZsYWdzX2luaXQuCi0JKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1tNjhrLmMgKGhvd3RvX3RhYmxlKTogQ2hhbmdlIHNyY19tYXNrIHRvIDAgZm9yIGFsbAotCXJlbG9jYXRpb24gZW50cmllcy4KLQotVHVlIEphbiAgOSAxNToyMjo1MyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEdXJpbmcgZmluYWwgbGluaywgYWxsb3cKLSAJb3V0cHV0IC5saXRhIHNlY3Rpb24gdG8gYmUgYmlnZ2VyIHRoYW4gNjRrIGJ5IGFkanVzdGluZyBncCB2YWx1ZQotIAlvbiBhIHBlci1pbnB1dCBzZWN0aW9uIGJhc2lzLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX3RkYXRhKTogQWRkIGlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nCi0JZmllbGQuCi0JKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIGdwIGZpZWxkLgotCi1UdWUgSmFuICA5IDEyOjAwOjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUhhbmRsZSBBbHBoYSBFQ09GRiBjaGFuZ2VzIGluIE9TRi8xIDMuMi4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZ2V0X2VsdF9hdF9maWxlcG9zCi0JZmllbGQuCi0JKiBjb2ZmLWFscGhhLmM6IEluY2x1ZGUgImFvdXQvYXIuaCIuCi0JKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IHJlcXVpcmUgYW4KLQlBTFBIQV9SX0lHTk9SRSByZWxvYyBhZnRlciBhbiBBTFBIQV9SX0dQRElTUCByZWxvYywgc2luY2UgT1NGLzEKLQkzLjIgZG9lc24ndCBnZW5lcmF0ZSBvbmUuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYWxwaGFfZWNvZmZfc2x1cnBfYXJtYXApOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl90cnVuY2F0ZV9hcm5hbWUpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3dyaXRlX2FybWFwKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKEFSRlpNQUcpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgZ2V0X2VsdF9hdF9maWxlcG9zIGZpZWxkLgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBDaGFuZ2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSBmcm9tCi0JX2JmZF9lY29mZiB0byBhbHBoYV9lY29mZi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IFVzZSBnZXRfZWx0X2F0X2ZpbGVwb3MKLQlmaWVsZCBmcm9tIGJhY2tlbmQgc3RydWN0dXJlLCByYXRoZXIgdGhhbiBhbHdheXMgY2FsbGluZwotCV9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZQotCWdldF9lbHRfYXRfZmlsZXBvcyBmaWVsZC4KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyk6IE5ldyBmdW5jdGlvbiwgY29waWVkCi0JZnJvbSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgd2l0aCBtaW5vciBjaGFuZ2VzLgotCShfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIpOiBVc2UgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4uaCAoQkZEX0lOX01FTU9SWSk6IERlZmluZS4KLQkqIGxpYmJmZC1pbi5oIChzdHJ1Y3QgYmZkX2luX21lbW9yeSk6IERlZmluZS4KLQkqIGxpYmJmZC5jIChiZmRfcmVhZCk6IEhhbmRsZSBCRkRfSU5fTUVNT1JZIGZsYWcuCi0JKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBEb24ndCB0cnkgdG8gbWFwIGEgQkZEX0lOX01FTU9SWSBmaWxlLgotCShiZmRfd3JpdGUsIGJmZF9zdGF0KTogQWJvcnQgaWYgQkZEX0lOX01FTU9SWSBpcyBzZXQuCi0JKGJmZF90ZWxsLCBiZmRfZmx1c2gsIGJmZF9zZWVrKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IENoYW5nZSBpb3N0cmVhbSBmaWVsZCBmcm9tIGNoYXIgKiB0byBQVFIuCi0JKGJmZF9nZXRfc2l6ZSk6IEhhbmRsZSBCRkRfSU5fTUVNT1JZIGZsYWcuCi0JKiBjYWNoZS5jIChiZmRfY2FjaGVfY2xvc2UpOiBJZ25vcmUgQkZEX0lOX01FTU9SWSBmaWxlcy4KLQkoYmZkX29wZW5fZmlsZSk6IENhc3QgdG8gUFRSLCBub3QgY2hhciAqLCB3aGVuIHNldHRpbmcgaW9zdHJlYW0uCi0JKGJmZF9jYWNoZV9sb29rdXBfd29ya2VyKTogQWJvcnQgaWYgQkZEX0lOX01FTU9SWSBpcyBzZXQuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDYXN0IHRvIFBUUiwgbm90IGNoYXIgKiwgd2hlbiBzZXR0aW5nCi0JaW9zdHJlYW0uCi0JKGJmZF9vcGVuc3RyZWFtcik6IExpa2V3aXNlLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBPbmx5IGZzdGF0IGlvc3RyZWFtIGlmCi0JQkZEX0lOX01FTU9SWSBpcyBub3Qgc2V0LgotCSogcmlzY2l4LmMgKHJpc2NpeF9zb21lX2FvdXRfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2dldF9lbHRfYXRfaW5kZXggZmllbGQuCi0JKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgX2dldF9lbHRfYXRfaW5kZXguCi0JKGJmZF9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCk6IFJlbmFtZSBmcm9tCi0JYmZkX2dldF9lbHRfYXRfaW5kZXguICBDaGFuZ2UgaW5kZXggcGFyYW1ldGVyIGZyb20gaW50IHRvCi0Jc3ltaW5kZXguCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgpOiBEZWNsYXJlLgotCShfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogYW91dC10YXJnZXQuaCAoTVlfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBpZWVlLmMgKGllZWVfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCByZXN0cmljdCBsaW5lCi0JbnVtYmVycyB0byB0aGUgLnRleHQgc2VjdGlvbi4KLQotTW9uIEphbiAgOCAxNzowMDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9kZWJ1Z19wYXJ0KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JSWYgdGhlcmUgaXMgYSBTRUNfREVCVUdHSU5HIHNlY3Rpb24sIGdldCB0aGUgY29udGVudHMgb2YgdGhlIGRlYnVnCi0JaW5mb3JtYXRpb24gcGFydCBmcm9tIGl0LgotCShpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3RvcmUgdGhlIGNvbnRlbnRzIG9mIGEgU0VDX0RFQlVHR0lORwotCXNlY3Rpb24gaW4gbWVtb3J5LgotCShpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGllZWVfd3JpdGVfZGVidWdfcGFydCByZXR1cm4uCi0KLVRodSBKYW4gIDQgMTc6MTI6MzcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBBZGQgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChpMzg2ZnJlZWJzZF92ZWMpOiBBZGQgdmVjLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGkzODZmcmVlYnNkLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBpMzg2ZnJlZWJzZC5jLgotCVJlYnVpbGQgZGVwZW5kZW5jaWVzLi4KLQkqIGZyZWVic2QuaDogTmV3IGZpbGUuCi0JKiBpMzg2ZnJlZWJzZC5jOiBOZXcgZmlsZS4KLQkqIHRhcmdldHMuYyAoaTM4NmZyZWVic2RfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgaTM4NmZyZWVic2RfdmVjLgotCSogaTM4NmxpbnV4LmMgKFNFR01FTlRfU0laRSk6IERlZmluZSBhcyBUQVJHRVRfUEFHRV9TSVpFCi0JKiBpMzg2bmV0YnNkLmMgKFNFR01FTlRfU0laRSk6ICBEZWZpbmUgYXMgVEFSR0VUX1BBR0VfU0laRQotCi1UaHUgSmFuICA0IDE2OjI3OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2RlYnVnKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9vYmplY3RfcCk6IENhbGwgaXQuCi0JKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogU2tpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMuCi0JKGllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGllZWVfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoaWVlZV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQpOiBMaWtld2lzZS4KLQkoaWVlZV93cml0ZV9kZWJ1Z19wYXJ0KTogTGlrZXdpc2UuCi0JKGllZWVfd3JpdGVfZGF0YV9wYXJ0KTogTGlrZXdpc2UuCi0JKGluaXRfZm9yX291dHB1dCk6IExpa2V3aXNlLgotCi1XZWQgSmFuICAzIDE5OjQyOjQ3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlIEBHT1QgcmVsb2NhdGlvbnMKLQl3b3JrLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IEp1c3QgdXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBmb3IgYWxsIGhvd3RvCi0JcmVsb2NzLCBzaW5jZSBwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gaGFuZGxlcyB0aGUgbGlua2VyIGNhc2UuCi0JKHBwY19lbGZfe2FkZHIxNl9oYSxnb3QxNix0b2MxNixicnRha2VufV9yZWxvYyk6IERlbGV0ZSwgbm8gbG9uZ2VyCi0JdXNlZC4KLQkocHBjX2VsZl97YWRkcjE2X2hhLGdvdDE2LHRvYzE2LGJydGFrZW59X2lubmVyKTogTWVyZ2UgdGhlc2UgaW50bwotCXBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBzaW5jZSB0aGF0IGlzIG5vdyB0aGUgb25seSBjYWxsZXIuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1XZWQgSmFuICAzIDE1OjExOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB3ZSBkb24ndCBrbm93IHRoZQotCXNlY3Rpb24gb2YgdGhlIGVudHJ5IHBvaW50IGZvciBhbiBYQ09GRiBleGVjdXRhYmxlLCBhbHdheXMgc2V0IHRoZQotCWVudHJ5IGFkZHJlc3MgdG8gLTEuCi0KLVR1ZSBKYW4gIDIgMTQ6MTc6MTUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogQWRkIHN1cHBvcnQgZm9yIG5vdGUgc2VjdGlvbnMuCi0KLVR1ZSBKYW4gIDIgMTM6MTA6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoc3RydWN0IF9zeW1ib2xfaW5mbyk6IEFkZCBzdGFiX3R5cGUgZmllbGQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSk6IFNldCBzdGFiX3R5cGUuCi0KLQkqIGVsZjMyLXBwYy5jOiBSZW1vdmUgdHJhaWxpbmcgbmV3bGluZSBmcm9tIGNhbGxzIHRvCi0gICAgICAgIF9iZmRfZXJyb3JfaGFuZGxlci4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogT25seSB3YXJuIGFib3V0IGVuZGlhbm5lc3MKLQlkaWZmZXJlbmNlIGlmIHRhcmdldCBlbmRpYW5uZXNzIGlzIGtub3duLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTk0OTUKLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9NYWtlZmlsZS5hbSBiL2JmZC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiNGNhZS4uMDAwMDAwMAotLS0gYS9iZmQvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTAzICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQotTUtERVAgPSBta2RlcAotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKLUJGRF9IID0gYmZkLmgKLQotIyBKaW0gS2luZ2RvbiBub3RlczoKLSMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKLSMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCi0jIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKLSMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQotIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKLSMgZGVidWdnZXIpLgotQkZEX0xJQlMgPSBcCi0JYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCi0JZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCi0Jc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAotCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotCi1CRkRfTElCU19DRklMRVMgPSBcCi0JYXJjaGl2ZS5jIGFyY2h1cmVzLmMgYmZkLmMgY2FjaGUuYyBjb2ZmZ2VuLmMgY29yZWZpbGUuYyBcCi0JZm9ybWF0LmMgaW5pdC5jIGxpYmJmZC5jIG9wbmNscy5jIHJlbG9jLmMgXAotCXNlY3Rpb24uYyBzeW1zLmMgdGFyZ2V0cy5jIGhhc2guYyBsaW5rZXIuYyBcCi0Jc3JlYy5jIGJpbmFyeS5jIHRla2hleC5jIGloZXguYyBzdGFicy5jIHN0YWItc3ltcy5jCi0KLSMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc2llciB0byBrZWVwIGluIHN5bmMKLSMgd2l0aCB0aGUgZGVjbHMgYW5kIGluaXRpYWxpemVyIGluIGFyY2h1cmVzLmMuCi1BTExfTUFDSElORVMgPSBcCi0JY3B1LWEyOWsubG8gXAotCWNwdS1hbHBoYS5sbyBcCi0JY3B1LWFyYy5sbyBcCi0JY3B1LWFybS5sbyBcCi0JY3B1LWQxMHYubG8gXAotCWNwdS1kMzB2LmxvIFwKLQljcHUtZnIzMC5sbyBcCi0JY3B1LWg4MzAwLmxvIFwKLQljcHUtaDg1MDAubG8gXAotCWNwdS1ocHBhLmxvIFwKLQljcHUtaTM4Ni5sbyBcCi0JY3B1LWk4NjAubG8gXAotCWNwdS1pOTYwLmxvIFwKLQljcHUtbTMyci5sbyBcCi0JY3B1LW02OGsubG8gXAotCWNwdS1tODhrLmxvIFwKLQljcHUtbTEwMjAwLmxvIFwKLQljcHUtbTEwMzAwLmxvIFwKLQljcHUtbWNvcmUubG8gXAotCWNwdS1taXBzLmxvIFwKLQljcHUtbnMzMmsubG8gXAotCWNwdS1wai5sbyBcCi0JY3B1LXBvd2VycGMubG8gXAotCWNwdS1yczYwMDAubG8gXAotCWNwdS1zaC5sbyBcCi0JY3B1LXNwYXJjLmxvIFwKLQljcHUtdGljMzAubG8gXAotCWNwdS10aWM4MC5sbyBcCi0JY3B1LXY4NTAubG8gXAotCWNwdS12YXgubG8gXAotCWNwdS13ZTMyay5sbyBcCi0JY3B1LXc2NS5sbyBcCi0JY3B1LXo4ay5sbwotCi1BTExfTUFDSElORVNfQ0ZJTEVTID0gXAotCWNwdS1hMjlrLmMgXAotCWNwdS1hbHBoYS5jIFwKLQljcHUtYXJjLmMgXAotCWNwdS1hcm0uYyBcCi0JY3B1LWQxMHYuYyBcCi0JY3B1LWQzMHYuYyBcCi0JY3B1LWZyMzAuYyBcCi0JY3B1LWg4MzAwLmMgXAotCWNwdS1oODUwMC5jIFwKLQljcHUtaHBwYS5jIFwKLQljcHUtaTM4Ni5jIFwKLQljcHUtaTg2MC5jIFwKLQljcHUtaTk2MC5jIFwKLQljcHUtbTMyci5jIFwKLQljcHUtbTY4ay5jIFwKLQljcHUtbTg4ay5jIFwKLQljcHUtbTEwMjAwLmMgXAotCWNwdS1tMTAzMDAuYyBcCi0JY3B1LW1jb3JlLmMgXAotCWNwdS1taXBzLmMgXAotCWNwdS1uczMyay5jIFwKLQljcHUtcGouYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljODAuYyBcCi0JY3B1LXY4NTAuYyBcCi0JY3B1LXZheC5jIFwKLQljcHUtd2UzMmsuYyBcCi0JY3B1LXc2NS5jIFwKLQljcHUtejhrLmMKLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgMzIgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbC4KLUJGRDMyX0JBQ0tFTkRTID0gXAotCWFvdXQtYWRvYmUubG8gXAotCWFvdXQtYXJtLmxvIFwKLQlhb3V0LW5zMzJrLmxvIFwKLQlhb3V0LXNwYXJjbGUubG8gXAotCWFvdXQtdGljMzAubG8gXAotCWFvdXQwLmxvIFwKLQlhb3V0MzIubG8gXAotCWFybW5ldGJzZC5sbyBcCi0JYm91dC5sbyBcCi0JY2YtaTM4Nmx5bngubG8gXAotCWNmLW02OGtseW54LmxvIFwKLQljZi1zcGFyY2x5bngubG8gXAotCWNvZmYtYTI5ay5sbyBcCi0JY29mZi1hcG9sbG8ubG8gXAotCWNvZmYtYXJtLmxvIFwKLQljb2ZmLWF1eC5sbyBcCi0JY29mZi1oODMwMC5sbyBcCi0JY29mZi1oODUwMC5sbyBcCi0JY29mZi1pMzg2LmxvIFwKLQljb2ZmLWdvMzIubG8gXAotCWNvZmYtaTg2MC5sbyBcCi0JY29mZi1pOTYwLmxvIFwKLQljb2ZmLW02OGsubG8gXAotCWNvZmYtbTg4ay5sbyBcCi0JY29mZi1taXBzLmxvIFwKLQljb2ZmLXBtYWMubG8gXAotCWNvZmYtcnM2MDAwLmxvIFwKLQljb2ZmLXNoLmxvIFwKLQljb2ZmLXNwYXJjLmxvIFwKLQljb2ZmLXN0Z28zMi5sbyBcCi0JY29mZi1zdm02OGsubG8gXAotCWNvZmYtdGljMzAubG8gXAotCWNvZmYtdGljODAubG8gXAotCWNvZmYtdTY4ay5sbyBcCi0JY29mZi13ZTMyay5sbyBcCi0JY29mZi13NjUubG8gXAotCWNvZmYtejhrLmxvIFwKLQljb2ZmbGluay5sbyBcCi0JZHdhcmYxLmxvIFwKLQlkd2FyZjIubG8gXAotCWVjb2ZmLmxvIFwKLQllY29mZmxpbmsubG8gXAotCWVsZi5sbyBcCi0JZWxmMzItYXJjLmxvIFwKLQllbGZhcm0tb2FiaS5sbyBcCi0JZWxmYXJtLW5hYmkubG8gXAotCWVsZjMyLWQxMHYubG8gXAotCWVsZjMyLWQzMHYubG8gXAotCWVsZjMyLWZyMzAubG8gXAotCWVsZjMyLWdlbi5sbyBcCi0JZWxmMzItaHBwYS5sbyBcCi0JZWxmMzItaTM4Ni5sbyBcCi0JZWxmMzItaTg2MC5sbyBcCi0JZWxmMzItaTk2MC5sbyBcCi0JZWxmMzItbTMyci5sbyBcCi0JZWxmMzItbTY4ay5sbyBcCi0JZWxmMzItbTg4ay5sbyBcCi0JZWxmLW0xMDIwMC5sbyBcCi0JZWxmLW0xMDMwMC5sbyBcCi0JZWxmMzItbWNvcmUubG8gXAotCWVsZjMyLW1pcHMubG8gXAotCWVsZjMyLXBqLmxvIFwKLQllbGYzMi1wcGMubG8gXAotCWVsZjMyLXNoLmxvIFwKLQllbGYzMi1zcGFyYy5sbyBcCi0JZWxmMzItdjg1MC5sbyBcCi0JZWxmMzIubG8gXAotCWVsZmxpbmsubG8gXAotCWVwb2MtcGUtYXJtLmxvIFwKLQllcG9jLXBlaS1hcm0ubG8gXAotCWhwMzAwYnNkLmxvIFwKLQlocDMwMGhwdXgubG8gXAotCXNvbS5sbyBcCi0JaTM4NmFvdXQubG8gXAotCWkzODZic2QubG8gXAotCWkzODZkeW5peC5sbyBcCi0JaTM4NmZyZWVic2QubG8gXAotCWkzODZsaW51eC5sbyBcCi0JaTM4Nmx5bngubG8gXAotCWkzODZtc2Rvcy5sbyBcCi0JaTM4Nm5ldGJzZC5sbyBcCi0JaTM4Nm1hY2gzLmxvIFwKLQlpMzg2b3M5ay5sbyBcCi0JaWVlZS5sbyBcCi0JbTY4azRrbmV0YnNkLmxvIFwKLQltNjhrbGludXgubG8gXAotCW02OGtseW54LmxvIFwKLQltNjhrbmV0YnNkLmxvIFwKLQltODhrbWFjaDMubG8gXAotCW1pcHNic2QubG8gXAotCW5ld3NvczMubG8gXAotCW5sbS5sbyBcCi0JbmxtMzItaTM4Ni5sbyBcCi0JbmxtMzItc3BhcmMubG8gXAotCW5sbTMyLXBwYy5sbyBcCi0JbmxtMzIubG8gXAotCW5zMzJrbmV0YnNkLmxvIFwKLQlvYXN5cy5sbyBcCi0JcGM1MzItbWFjaC5sbyBcCi0JcGUtYXJtLmxvIFwKLQlwZWktYXJtLmxvIFwKLQlwZS1pMzg2LmxvIFwKLQlwZWktaTM4Ni5sbyBcCi0JcGUtbWNvcmUubG8gXAotCXBlaS1tY29yZS5sbyBcCi0JcGUtcHBjLmxvIFwKLQlwZWktcHBjLmxvIFwKLQlwZWlnZW4ubG8gXAotCXBwY2Jvb3QubG8gXAotCXJlbG9jMTYubG8gXAotCXJpc2NpeC5sbyBcCi0Jc3BhcmNsaW51eC5sbyBcCi0Jc3BhcmNseW54LmxvIFwKLQlzcGFyY25ldGJzZC5sbyBcCi0Jc3Vub3MubG8gXAotCXZheG5ldGJzZC5sbyBcCi0JdmVyc2Fkb3MubG8gXAotCXZtcy5sbyBcCi0Jdm1zLWdzZC5sbyBcCi0Jdm1zLWhkci5sbyBcCi0Jdm1zLW1pc2MubG8gXAotCXZtcy10aXIubG8gXAotCXhjb2ZmbGluay5sbwotCi1CRkQzMl9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dC1hZG9iZS5jIFwKLQlhb3V0LWFybS5jIFwKLQlhb3V0LW5zMzJrLmMgXAotCWFvdXQtc3BhcmNsZS5jIFwKLQlhb3V0LXRpYzMwLmMgXAotCWFvdXQwLmMgXAotCWFvdXQzMi5jIFwKLQlhcm1uZXRic2QuYyBcCi0JYm91dC5jIFwKLQljZi1pMzg2bHlueC5jIFwKLQljZi1tNjhrbHlueC5jIFwKLQljZi1zcGFyY2x5bnguYyBcCi0JY29mZi1hMjlrLmMgXAotCWNvZmYtYXBvbGxvLmMgXAotCWNvZmYtYXJtLmMgXAotCWNvZmYtYXV4LmMgXAotCWNvZmYtaDgzMDAuYyBcCi0JY29mZi1oODUwMC5jIFwKLQljb2ZmLWkzODYuYyBcCi0JY29mZi1pODYwLmMgXAotCWNvZmYtZ28zMi5jIFwKLQljb2ZmLWk5NjAuYyBcCi0JY29mZi1tNjhrLmMgXAotCWNvZmYtbTg4ay5jIFwKLQljb2ZmLW1pcHMuYyBcCi0JY29mZi1wbWFjLmMgXAotCWNvZmYtcnM2MDAwLmMgXAotCWNvZmYtc2guYyBcCi0JY29mZi1zcGFyYy5jIFwKLQljb2ZmLXN0Z28zMi5jIFwKLQljb2ZmLXN2bTY4ay5jIFwKLQljb2ZmLXRpYzMwLmMgXAotCWNvZmYtdGljODAuYyBcCi0JY29mZi11NjhrLmMgXAotCWNvZmYtd2UzMmsuYyBcCi0JY29mZi13NjUuYyBcCi0JY29mZi16OGsuYyBcCi0JY29mZmxpbmsuYyBcCi0JZHdhcmYxLmMgXAotCWR3YXJmMi5jIFwKLQllY29mZi5jIFwKLQllY29mZmxpbmsuYyBcCi0JZWxmLmMgXAotCWVsZjMyLWFyYy5jIFwKLQllbGZhcm0tb2FiaS5jIFwKLQllbGZhcm0tbmFiaS5jIFwKLQllbGYzMi1kMTB2LmMgXAotCWVsZjMyLWQzMHYuYyBcCi0JZWxmMzItZnIzMC5jIFwKLQllbGYzMi1nZW4uYyBcCi0JZWxmMzItaHBwYS5jIFwKLQllbGYzMi1pMzg2LmMgXAotCWVsZjMyLWk4NjAuYyBcCi0JZWxmMzItaTk2MC5jIFwKLQllbGYzMi1tMzJyLmMgXAotCWVsZjMyLW02OGsuYyBcCi0JZWxmMzItbTg4ay5jIFwKLQllbGYtbTEwMjAwLmMgXAotCWVsZi1tMTAzMDAuYyBcCi0JZWxmMzItbWNvcmUuYyBcCi0JZWxmMzItbWlwcy5jIFwKLQllbGYzMi1wai5jIFwKLQllbGYzMi1wcGMuYyBcCi0JZWxmMzItc2guYyBcCi0JZWxmMzItc3BhcmMuYyBcCi0JZWxmMzItdjg1MC5jIFwKLQllbGYzMi5jIFwKLQllbGZsaW5rLmMgXAotCWVwb2MtcGUtYXJtLmMgXAotCWVwb2MtcGVpLWFybS5jIFwKLQlocDMwMGJzZC5jIFwKLQlocDMwMGhwdXguYyBcCi0Jc29tLmMgXAotCWkzODZhb3V0LmMgXAotCWkzODZic2QuYyBcCi0JaTM4NmR5bml4LmMgXAotCWkzODZmcmVlYnNkLmMgXAotCWkzODZsaW51eC5jIFwKLQlpMzg2bHlueC5jIFwKLQlpMzg2bXNkb3MuYyBcCi0JaTM4Nm5ldGJzZC5jIFwKLQlpMzg2bWFjaDMuYyBcCi0JaTM4Nm9zOWsuYyBcCi0JaWVlZS5jIFwKLQltNjhrNGtuZXRic2QuYyBcCi0JbTY4a2xpbnV4LmMgXAotCW02OGtseW54LmMgXAotCW02OGtuZXRic2QuYyBcCi0JbTg4a21hY2gzLmMgXAotCW1pcHNic2QuYyBcCi0JbmV3c29zMy5jIFwKLQlubG0uYyBcCi0JbmxtMzItaTM4Ni5jIFwKLQlubG0zMi1zcGFyYy5jIFwKLQlubG0zMi1wcGMuYyBcCi0JbmxtMzIuYyBcCi0JbnMzMmtuZXRic2QuYyBcCi0Jb2FzeXMuYyBcCi0JcGM1MzItbWFjaC5jIFwKLQlwZS1hcm0uYyBcCi0JcGVpLWFybS5jIFwKLQlwZS1pMzg2LmMgXAotCXBlaS1pMzg2LmMgXAotCXBlLW1jb3JlLmMgXAotCXBlaS1tY29yZS5jIFwKLQlwZS1wcGMuYyBcCi0JcGVpLXBwYy5jIFwKLQlwZWlnZW4uYyBcCi0JcHBjYm9vdC5jIFwKLQlyZWxvYzE2LmMgXAotCXJpc2NpeC5jIFwKLQlzcGFyY2xpbnV4LmMgXAotCXNwYXJjbHlueC5jIFwKLQlzcGFyY25ldGJzZC5jIFwKLQlzdW5vcy5jIFwKLQl2YXhuZXRic2QuYyBcCi0JdmVyc2Fkb3MuYyBcCi0Jdm1zLmMgXAotCXZtcy1nc2QuYyBcCi0Jdm1zLWhkci5jIFwKLQl2bXMtbWlzYy5jIFwKLQl2bXMtdGlyLmMgXAotCXhjb2ZmbGluay5jCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDY0IGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwKLSMgYW5kIC0tZW5hYmxlLTY0LWJpdC1iZmQuCi1CRkQ2NF9CQUNLRU5EUyA9IFwKLQlhb3V0NjQubG8gXAotCWNvZmYtYWxwaGEubG8gXAotCWRlbW82NC5sbyBcCi0JZWxmNjQtYWxwaGEubG8gXAotCWVsZjY0LWdlbi5sbyBcCi0JZWxmNjQtbWlwcy5sbyBcCi0JZWxmNjQtc3BhcmMubG8gXAotCWVsZjY0LmxvIFwKLQlubG0zMi1hbHBoYS5sbyBcCi0JbmxtNjQubG8KLQotQkZENjRfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQ2NC5jIFwKLQljb2ZmLWFscGhhLmMgXAotCWRlbW82NC5jIFwKLQllbGY2NC1hbHBoYS5jIFwKLQllbGY2NC1nZW4uYyBcCi0JZWxmNjQtbWlwcy5jIFwKLQllbGY2NC1zcGFyYy5jIFwKLQllbGY2NC5jIFwKLQlubG0zMi1hbHBoYS5jIFwKLQlubG02NC5jCi0KLU9QVElPTkFMX0JBQ0tFTkRTID0gXAotCWFpeDM4Ni1jb3JlLmxvIFwKLQlocHV4LWNvcmUubG8gXAotCWlyaXgtY29yZS5sbyBcCi0JbHlueC1jb3JlLmxvIFwKLQlvc2YtY29yZS5sbyBcCi0Jc2NvNS1jb3JlLmxvIFwKLQl0cmFkLWNvcmUubG8gXAotCWNpc2NvLWNvcmUubG8KLQotT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFpeDM4Ni1jb3JlLmMgXAotCWhwdXgtY29yZS5jIFwKLQlpcml4LWNvcmUuYyBcCi0JbHlueC1jb3JlLmMgXAotCW9zZi1jb3JlLmMgXAotCXNjbzUtY29yZS5jIFwKLQl0cmFkLWNvcmUuYyBcCi0JY2lzY28tY29yZS5jCi0KLSMgVGhlc2UgYXJlIGRlZmluZWQgYnkgY29uZmlndXJlLmluOgotV09SRFNJWkUgPSBAd29yZHNpemVACi1BTExfQkFDS0VORFMgPSBAYWxsX2JhY2tlbmRzQAotQkZEX0JBQ0tFTkRTID0gQGJmZF9iYWNrZW5kc0AKLUJGRF9NQUNISU5FUyA9IEBiZmRfbWFjaGluZXNACi1UREVGQVVMVFMgPSBAdGRlZmF1bHRzQAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgQEhERUZJTkVTQCBAQ09SRUZMQUdAIEBUREVGSU5FU0AgJChDU0VBUkNIKSAkKENTV0lUQ0hFUykgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQkkKEJGRF9MSUJTX0NGSUxFUykgXAotCSQoQUxMX01BQ0hJTkVTX0NGSUxFUykgXAotCSQoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKSBcCi0JJChCRkQ2NF9CQUNLRU5EU19DRklMRVMpIFwKLQkkKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUykKLQotIyMgVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIC5oIGZpbGVzIHdoaWNoIGFyZSBpbiB0aGUgc291cmNlIHRyZWUuCi1TT1VSQ0VfSEZJTEVTID0gXAotCWFvdXQtdGFyZ2V0LmggYW91dGYxLmggYW91dHguaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAotCWVjb2Zmc3dhcC5oIGVsZjMyLWFybS5oIGVsZjMyLWhwcGEuaCBlbGZjb2RlLmggZWxmY29yZS5oIFwKLQllbGZsaW5rLmggZnJlZWJzZC5oIGdlbmxpbmsuaCBnbzMyc3R1Yi5oIGhwcGFfc3R1YnMuaCBsaWJhb3V0LmggXAotCWxpYmJmZC5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVsZi1iZmQuaCBsaWJocHBhLmggbGliaWVlZS5oIFwKLQlsaWJubG0uaCBsaWJvYXN5cy5oIGxpYnBlaS5oIG5ldGJzZC5oIG5sbS10YXJnZXQuaCBubG1jb2RlLmggXAotCW5sbXN3YXAuaCBuczMyay5oIHBlaWNvZGUuaCBzb20uaCB2bXMuaAotCi1IRklMRVMgPSBcCi0JZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmggdGFyZ21hdGNoLmggXAotCSQoU09VUkNFX0hGSUxFUykKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1kaXN0c3R1ZmY6IGluZm8KLQotIyBWYXJpb3VzIGtpbmRzIG9mIC5vIGZpbGVzIHRvIHB1dCBpbiBsaWJiZmQuYToKLSMgQkZEX0JBQ0tFTkRTCVJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQkZEX01BQ0hJTkVTCUFyY2hpdGVjdHVyZS1zcGVjaWZpYyByb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCi0jIENPUkVGSUxFCUNvcmUgZmlsZSByb3V0aW5lcyBmb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbgotT0ZJTEVTID0gJChCRkRfQkFDS0VORFMpICQoQkZEX01BQ0hJTkVTKSBAQ09SRUZJTEVACi0KLXN0YW1wLW9maWxlczogTWFrZWZpbGUKLQlybSAtZiB0b2ZpbGVzCi0JZj0iIjsgXAotCWZvciBpIGluICQoT0ZJTEVTKSA7IGRvIFwKLQkgIGNhc2UgIiAkJGYgIiBpbiBcCi0JICAgICoiICQkaSAiKikgOzsgXAotCSAgICAqKSBmPSIkJGYgJCRpIiA7OyBcCi0JICBlc2FjIDsgXAotCWRvbmUgOyBcCi0JZWNobyAkJGYgPiB0b2ZpbGVzCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRvZmlsZXMgb2ZpbGVzCi0JdG91Y2ggc3RhbXAtb2ZpbGVzCi0KLW9maWxlczogc3RhbXAtb2ZpbGVzIDsgQHRydWUKLQotbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKLWxpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCi1saWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKLWxpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKLSMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKLSMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgotIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCi1saWJiZmRfYV9TT1VSQ0VTID0KLQotc3RhbXAtbGliOiBsaWJiZmQubGEKLQlpZiBbIC1mIC5saWJzL2xpYmJmZC5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGliYmZkLmEgbGliYmZkLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLmE7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtbGliCi0KLWxpYmJmZC5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotCi0jIFRoaXMgZmlsZSBob2xkcyBhbiBhcnJheSBhc3NvY2lhdGluZyBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFuZAotIyB2ZWN0b3IgbmFtZXMuICBJdCBpcyBidWlsdCBmcm9tIGNvbmZpZy5iZmQuICBJdCBpcyBub3QgY29tcGlsZWQgYnkKLSMgaXRzZWxmLCBidXQgaXMgaW5jbHVkZWQgYnkgdGFyZ2V0cy5jLgotdGFyZ21hdGNoLmg6IGNvbmZpZy5iZmQgdGFyZ21hdGNoLnNlZAotCXJtIC1mIHRhcmdtYXRjaC5oCi0Jc2VkIC1mICQoc3JjZGlyKS90YXJnbWF0Y2guc2VkIDwgJChzcmNkaXIpL2NvbmZpZy5iZmQgPiB0YXJnbWF0Y2gubmV3Ci0JbXYgLWYgdGFyZ21hdGNoLm5ldyB0YXJnbWF0Y2guaAotCi0jIFdoZW4gY29tcGlsaW5nIGFyY2h1cmVzLmMgYW5kIHRhcmdldHMuYywgc3VwcGx5IHRoZSBkZWZhdWx0IHRhcmdldAotIyBpbmZvIGZyb20gY29uZmlndXJlLgotCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgY29uZmlnLnN0YXR1cwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkKFRERUZBVUxUUykgJChzcmNkaXIpL3RhcmdldHMuYwotCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvYXJjaHVyZXMuYwotCi1lbGYzMi10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmMzItdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi8zMi9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmMzItdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjMyLXRhcmdldC5uZXcgZWxmMzItdGFyZ2V0LmgKLQotZWxmNjQtdGFyZ2V0LmggOiBlbGZ4eC10YXJnZXQuaAotCXJtIC1mIGVsZjY0LXRhcmdldC5oCi0Jc2VkIC1lIHMvTk4vNjQvZyA8ICQoc3JjZGlyKS9lbGZ4eC10YXJnZXQuaCA+IGVsZjY0LXRhcmdldC5uZXcKLQltdiAtZiBlbGY2NC10YXJnZXQubmV3IGVsZjY0LXRhcmdldC5oCi0KLUJGRF9IX0RFUFM9ICQoSU5DRElSKS9hbnNpZGVjbC5oCi1MT0NBTF9IX0RFUFM9IGxpYmJmZC5oIHN5c2RlcC5oIGNvbmZpZy5oCi0kKEJGRF9MSUJTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX01BQ0hJTkVTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX0JBQ0tFTkRTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoT1BUSU9OQUxfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotCi0jIEluc3RhbGwgQkZEIGluY2x1ZGUgZmlsZSwgYW5kIG90aGVycyB0aGF0IGl0IG5lZWRzLgotaW5zdGFsbC1kYXRhLWxvY2FsOiAkKEJGRF9IKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChpbmNsdWRlZGlyKQotCSQoSU5TVEFMTF9EQVRBKSAkKEJGRF9IKSAkKGluY2x1ZGVkaXIpL2JmZC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9hbnNpZGVjbC5oICQoaW5jbHVkZWRpcikvYW5zaWRlY2wuaAotCSQoSU5TVEFMTF9EQVRBKSAkKElOQ0RJUikvYmZkbGluay5oICQoaW5jbHVkZWRpcikvYmZkbGluay5oCi0KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIERFUDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLURFUDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGJmZC5oCi0Jcm0gLWYgREVQMQotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgREVQMQotCXNlZCAtZiBkZXAuc2VkIDxERVAxID5ERVAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLSMgVGhlIE5ldEJTRCBta2RlcCBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBmaWxlIGNvbnRlbnRzLCBhbmQgZG9lc24ndCBpbnNlcnQKLSMgdGhlICJETyBOT1QgREVMRVRFIiBsaW5lLgotIyBPdGhlciBta2RlcCB2ZXJzaW9ucyByZXF1aXJlIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzLCBhbmQgZG8gaW5zZXJ0IGl0LgotIyBIZW5jZSB0aGUgd2VpcmRuZXNzLi4uLgotREVQMTogJChDRklMRVMpCi0Jcm0gLWYgREVQMiBERVAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCWVjaG8gPiBERVAyYQotCSQoTUtERVApIC1mIERFUDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCBERVAyYSA+PiBERVAyCi0Jcm0gLWYgREVQMmEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi1ob3N0LWFvdXQubG86IE1ha2VmaWxlCi0KLSMgVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgc2ltcGxlIGNvbmZpZyBmaWxlCi0jIHdoaWNoIGNhbiBiZSBmb2xkZWQgaW50byBhbiBoLVhYWCBmaWxlIGZvciBhIG5ldyBob3N0LCB3aXRoIHNvbWUgZWRpdGluZy4KLWFvdXQtcGFyYW1zLmg6IGdlbi1hb3V0Ci0JLi9nZW4tYW91dCBob3N0ID4gYW91dC1wYXJhbXMuaAotZ2VuLWFvdXQ6ICQoc3JjZGlyKS9nZW4tYW91dC5jIE1ha2VmaWxlCi0JJChDQykgLW8gZ2VuLWFvdXQgJChDRkxBR1MpICQoTEZMQUdTKSAkKHNyY2RpcikvZ2VuLWFvdXQuYwotCi0kKEJGRF9IKTogc3RtcC1iZmQtaCA7IEB0cnVlCi0KLXN0bXAtYmZkLWg6IGJmZC1pbjMuaAotCXJtIC1mIGJmZC10bXAuaAotCWNwIGJmZC1pbjMuaCBiZmQtdG1wLmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLXRtcC5oICQoQkZEX0gpCi0Jcm0gLWYgYmZkLXRtcC5oCi0JdG91Y2ggc3RtcC1iZmQtaAotCi1CRkRfSF9GSUxFUyA9IGJmZC1pbi5oIGluaXQuYyBvcG5jbHMuYyBsaWJiZmQuYyBzZWN0aW9uLmMgYXJjaHVyZXMuYyBcCi0JcmVsb2MuYyBzeW1zLmMgYmZkLmMgYXJjaGl2ZS5jIGNvcmVmaWxlLmMgdGFyZ2V0cy5jIGZvcm1hdC5jCi1MSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYwotTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKLQotIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgotaGVhZGVyczoKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQotIyBXZSBvbmx5IHJlYnVpbGQgdGhlIGhlYWRlciBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIHdlIGhhdmUgYmVlbgotIyBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLgotCi0kKHNyY2RpcikvYmZkLWluMi5oOiBATUFJTlRAIHN0bXAtYmluMi1oIDsgQHRydWUKLXN0bXAtYmluMi1oOiAkKEJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBiZmQuaCkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQl0b3VjaCBzdG1wLWJpbjItaAotCi0kKHNyY2RpcikvbGliYmZkLmg6IEBNQUlOVEAgc3RtcC1sYmZkLWggOyBAdHJ1ZQotc3RtcC1sYmZkLWg6ICQoTElCQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmJmZC5oKQotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCXRvdWNoIHN0bXAtbGJmZC1oCi0KLSQoc3JjZGlyKS9saWJjb2ZmLmg6IEBNQUlOVEAgc3RtcC1sY29mZi1oIDsgQHRydWUKLXN0bXAtbGNvZmYtaDogJChMSUJDT0ZGX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0JdG91Y2ggc3RtcC1sY29mZi1oCi0KLU1PU1RMWUNMRUFORklMRVMgPSBlbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCBvZmlsZXMgc3RhbXAtb2ZpbGVzIFwKLQl0YXJnbWF0Y2guaAotCi1DTEVBTkZJTEVTID0gYmZkLmggZGVwLnNlZCBzdG1wLWJmZC1oIERFUCBERVAxIGxpYmJmZC5hIHN0YW1wLWxpYiBcCi0Jc3RtcC1iaW4yLWggc3RtcC1sYmZkLWggc3RtcC1sY29mZi1oCi0KLSMgV2Ugd2FudCB0byByZXJ1biBjb25maWd1cmUgaWYgY29uZmlnLmJmZCBvciBjb25maWd1cmUuaG9zdCBjaGFuZ2UuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcuYmZkICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotCi1lbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyBlbGYzMi1hcm0uaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi1hcmNoaXZlLmxvOiBhcmNoaXZlLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYW91dC9yYW5saWIuaAotYXJjaHVyZXMubG86IGFyY2h1cmVzLmMKLWJmZC5sbzogYmZkLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWNhY2hlLmxvOiBjYWNoZS5jCi1jb2ZmZ2VuLmxvOiBjb2ZmZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1jb3JlZmlsZS5sbzogY29yZWZpbGUuYwotZm9ybWF0LmxvOiBmb3JtYXQuYwotaW5pdC5sbzogaW5pdC5jCi1saWJiZmQubG86IGxpYmJmZC5jCi1vcG5jbHMubG86IG9wbmNscy5jICQoSU5DRElSKS9vYmphbGxvYy5oCi1yZWxvYy5sbzogcmVsb2MuYyAkKElOQ0RJUikvYmZkbGluay5oCi1zZWN0aW9uLmxvOiBzZWN0aW9uLmMgJChJTkNESVIpL2JmZGxpbmsuaAotc3ltcy5sbzogc3ltcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgJChJTkNESVIpL2ZubWF0Y2guaCB0YXJnbWF0Y2guaAotaGFzaC5sbzogaGFzaC5jICQoSU5DRElSKS9vYmphbGxvYy5oCi1saW5rZXIubG86IGxpbmtlci5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oCi1zcmVjLmxvOiBzcmVjLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1iaW5hcnkubG86IGJpbmFyeS5jCi10ZWtoZXgubG86IHRla2hleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAotaWhleC5sbzogaWhleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAotc3RhYnMubG86IHN0YWJzLmMgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RhYi1zeW1zLmxvOiBzdGFiLXN5bXMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1jcHUtYTI5ay5sbzogY3B1LWEyOWsuYwotY3B1LWFscGhhLmxvOiBjcHUtYWxwaGEuYwotY3B1LWFyYy5sbzogY3B1LWFyYy5jCi1jcHUtYXJtLmxvOiBjcHUtYXJtLmMKLWNwdS1kMTB2LmxvOiBjcHUtZDEwdi5jCi1jcHUtZDMwdi5sbzogY3B1LWQzMHYuYwotY3B1LWZyMzAubG86IGNwdS1mcjMwLmMKLWNwdS1oODMwMC5sbzogY3B1LWg4MzAwLmMKLWNwdS1oODUwMC5sbzogY3B1LWg4NTAwLmMKLWNwdS1ocHBhLmxvOiBjcHUtaHBwYS5jCi1jcHUtaTM4Ni5sbzogY3B1LWkzODYuYwotY3B1LWk4NjAubG86IGNwdS1pODYwLmMKLWNwdS1pOTYwLmxvOiBjcHUtaTk2MC5jCi1jcHUtbTMyci5sbzogY3B1LW0zMnIuYwotY3B1LW02OGsubG86IGNwdS1tNjhrLmMKLWNwdS1tODhrLmxvOiBjcHUtbTg4ay5jCi1jcHUtbTEwMjAwLmxvOiBjcHUtbTEwMjAwLmMKLWNwdS1tMTAzMDAubG86IGNwdS1tMTAzMDAuYwotY3B1LW1jb3JlLmxvOiBjcHUtbWNvcmUuYwotY3B1LW1pcHMubG86IGNwdS1taXBzLmMKLWNwdS1uczMyay5sbzogY3B1LW5zMzJrLmMgbnMzMmsuaAotY3B1LXBqLmxvOiBjcHUtcGouYwotY3B1LXBvd2VycGMubG86IGNwdS1wb3dlcnBjLmMKLWNwdS1yczYwMDAubG86IGNwdS1yczYwMDAuYwotY3B1LXNoLmxvOiBjcHUtc2guYwotY3B1LXNwYXJjLmxvOiBjcHUtc3BhcmMuYwotY3B1LXRpYzMwLmxvOiBjcHUtdGljMzAuYwotY3B1LXRpYzgwLmxvOiBjcHUtdGljODAuYwotY3B1LXY4NTAubG86IGNwdS12ODUwLmMKLWNwdS12YXgubG86IGNwdS12YXguYwotY3B1LXdlMzJrLmxvOiBjcHUtd2UzMmsuYwotY3B1LXc2NS5sbzogY3B1LXc2NS5jCi1jcHUtejhrLmxvOiBjcHUtejhrLmMKLWFvdXQtYWRvYmUubG86IGFvdXQtYWRvYmUuYyAkKElOQ0RJUikvYW91dC9hZG9iZS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LWFybS5sbzogYW91dC1hcm0uYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXR4LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dC1uczMyay5sbzogYW91dC1uczMyay5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgbnMzMmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotYW91dC1zcGFyY2xlLmxvOiBhb3V0LXNwYXJjbGUuYyAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGliYW91dC5oIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAubG86IGFvdXQtdGljMzAuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oIGFvdXR4LmgKLWFvdXQwLmxvOiBhb3V0MC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWFvdXQzMi5sbzogYW91dDMyLmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1hcm1uZXRic2QubG86IGFybW5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotYm91dC5sbzogYm91dC5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oICQoSU5DRElSKS9ib3V0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaAotY2YtaTM4Nmx5bngubG86IGNmLWkzODZseW54LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2YtbTY4a2x5bngubG86IGNmLW02OGtseW54LmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2Ytc3BhcmNseW54LmxvOiBjZi1zcGFyY2x5bnguYyBjb2ZmLXNwYXJjLmMgJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYTI5ay5sbzogY29mZi1hMjlrLmMgJChJTkNESVIpL2NvZmYvYTI5ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXBvbGxvLmxvOiBjb2ZmLWFwb2xsby5jICQoSU5DRElSKS9jb2ZmL2Fwb2xsby5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcm0ubG86IGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hdXgubG86IGNvZmYtYXV4LmMgJChJTkNESVIpL2NvZmYvYXV4LWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvbTY4ay5oIGNvZmYtbTY4ay5jIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4MzAwLmxvOiBjb2ZmLWg4MzAwLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAotICAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4NTAwLmxvOiBjb2ZmLWg4NTAwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWkzODYubG86IGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk4NjAubG86IGNvZmYtaTg2MC5jICQoSU5DRElSKS9jb2ZmL2k4NjAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWdvMzIubG86IGNvZmYtZ28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTk2MC5sbzogY29mZi1pOTYwLmMgJChJTkNESVIpL2NvZmYvaTk2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTY4ay5sbzogY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTg4ay5sbzogY29mZi1tODhrLmMgJChJTkNESVIpL2NvZmYvbTg4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbWlwcy5sbzogY29mZi1taXBzLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvbWlwcy5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGNvZmZzd2FwLmggXAotICBlY29mZnN3YXAuaAotY29mZi1wbWFjLmxvOiBjb2ZmLXBtYWMuYyBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1yczYwMDAubG86IGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXNoLmxvOiBjb2ZmLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXNwYXJjLmxvOiBjb2ZmLXNwYXJjLmMgJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3RnbzMyLmxvOiBjb2ZmLXN0Z28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvZ28zMmV4ZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKLSAgZ28zMnN0dWIuaAotY29mZi1zdm02OGsubG86IGNvZmYtc3ZtNjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWMzMC5sbzogY29mZi10aWMzMC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWM4MC5sbzogY29mZi10aWM4MC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi11NjhrLmxvOiBjb2ZmLXU2OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXdlMzJrLmxvOiBjb2ZmLXdlMzJrLmMgJChJTkNESVIpL2NvZmYvd2UzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdzY1LmxvOiBjb2ZmLXc2NS5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtejhrLmxvOiBjb2ZmLXo4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmZsaW5rLmxvOiBjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotZHdhcmYxLmxvOiBkd2FyZjEuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmLmgKLWR3YXJmMi5sbzogZHdhcmYyLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZWNvZmYubG86IGVjb2ZmLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgJChJTkNESVIpL2FvdXQvcmFubGliLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVjb2ZmbGluay5sbzogZWNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JqYWxsb2MuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oCi1lbGYubG86IGVsZi5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1lbGYzMi1hcmMubG86IGVsZjMyLWFyYy5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyAkKElOQ0RJUikvZWxmL2FybS1vYWJpLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItYXJtLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZjMyLWFybS5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQxMHYubG86IGVsZjMyLWQxMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMzB2LmxvOiBlbGYzMi1kMzB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZnIzMC5sbzogZWxmMzItZnIzMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItZ2VuLmxvOiBlbGYzMi1nZW4uYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1ocHBhLmxvOiBlbGYzMi1ocHBhLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGxpYmhwcGEuaCBcCi0gIGVsZjMyLWhwcGEuaCBlbGYtaHBwYS5oIGhwcGFfc3R1YnMuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTM4Ni5sbzogZWxmMzItaTM4Ni5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9pMzg2LmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTg2MC5sbzogZWxmMzItaTg2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWk5NjAubG86IGVsZjMyLWk5NjAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvaTk2MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW0zMnIubG86IGVsZjMyLW0zMnIuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW02OGsubG86IGVsZjMyLW02OGsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW04OGsubG86IGVsZjMyLW04OGsuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMjAwLmxvOiBlbGYtbTEwMjAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmLW0xMDMwMC5sbzogZWxmLW0xMDMwMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tY29yZS5sbzogZWxmMzItbWNvcmUuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1pcHMubG86IGVsZjMyLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9taXBzLmggZWNvZmZzd2FwLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItcGoubG86IGVsZjMyLXBqLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3BqLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItcHBjLmxvOiBlbGYzMi1wcGMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItc2gubG86IGVsZjMyLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItc3BhcmMubG86IGVsZjMyLXNwYXJjLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi12ODUwLmxvOiBlbGYzMi12ODUwLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi5sbzogZWxmMzIuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1lbGZsaW5rLmxvOiBlbGZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVwb2MtcGUtYXJtLmxvOiBlcG9jLXBlLWFybS5jIHBlLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotZXBvYy1wZWktYXJtLmxvOiBlcG9jLXBlaS1hcm0uYyBwZWktYXJtLmMgY29mZi1hcm0uYyBcCi0gICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLWhwMzAwYnNkLmxvOiBocDMwMGJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaHAzMDBocHV4LmxvOiBocDMwMGhwdXguYyAkKElOQ0RJUikvYW91dC9ocDMwMGhwdXguaCBcCi0gIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1zb20ubG86IHNvbS5jCi1pMzg2YW91dC5sbzogaTM4NmFvdXQuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZic2QubG86IGkzODZic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZkeW5peC5sbzogaTM4NmR5bml4LmMgJChJTkNESVIpL2FvdXQvZHluaXgzLmggYW91dHguaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotaTM4NmZyZWVic2QubG86IGkzODZmcmVlYnNkLmMgZnJlZWJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmxpbnV4LmxvOiBpMzg2bGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZseW54LmxvOiBpMzg2bHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1zZG9zLmxvOiBpMzg2bXNkb3MuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotaTM4Nm5ldGJzZC5sbzogaTM4Nm5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1hY2gzLmxvOiBpMzg2bWFjaDMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZvczlrLmxvOiBpMzg2b3M5ay5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL29zOWsuaAotaWVlZS5sbzogaWVlZS5jICQoSU5DRElSKS9pZWVlLmggbGliaWVlZS5oCi1tNjhrNGtuZXRic2QubG86IG02OGs0a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a2xpbnV4LmxvOiBtNjhrbGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW02OGtseW54LmxvOiBtNjhrbHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a25ldGJzZC5sbzogbTY4a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTg4a21hY2gzLmxvOiBtODhrbWFjaDMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW1pcHNic2QubG86IG1pcHNic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW5ld3NvczMubG86IG5ld3NvczMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW5sbS5sbzogbmxtLmMgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5sbTMyLWkzODYubG86IG5sbTMyLWkzODYuYyAkKElOQ0RJUikvbmxtL2kzODYtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1zcGFyYy5sbzogbmxtMzItc3BhcmMuYyAkKElOQ0RJUikvbmxtL3NwYXJjMzItZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1wcGMubG86IG5sbTMyLXBwYy5jICQoSU5DRElSKS9ubG0vcHBjLWV4dC5oIGxpYm5sbS5oIFwKLSAgJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oIFwKLSAgbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzIubG86IG5sbTMyLmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1uczMya25ldGJzZC5sbzogbnMzMmtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW9hc3lzLmxvOiBvYXN5cy5jICQoSU5DRElSKS9vYXN5cy5oIGxpYm9hc3lzLmgKLXBjNTMyLW1hY2gubG86IHBjNTMyLW1hY2guYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXBlLWFybS5sbzogcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktYXJtLmxvOiBwZWktYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZS1pMzg2LmxvOiBwZS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1pMzg2LmxvOiBwZWktaTM4Ni5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZS1tY29yZS5sbzogcGUtbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktbWNvcmUubG86IHBlaS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLXBwYy5sbzogcGUtcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLXBwYy5sbzogcGVpLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaWdlbi5sbzogcGVpZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYnBlaS5oCi1wcGNib290LmxvOiBwcGNib290LmMKLXJlbG9jMTYubG86IHJlbG9jMTYuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oCi1yaXNjaXgubG86IHJpc2NpeC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotc3BhcmNsaW51eC5sbzogc3BhcmNsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotc3BhcmNseW54LmxvOiBzcGFyY2x5bnguYyAkKElOQ0RJUikvYW91dC9zdW40LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1zcGFyY25ldGJzZC5sbzogc3BhcmNuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXN1bm9zLmxvOiBzdW5vcy5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIGFvdXRmMS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXZheG5ldGJzZC5sbzogdmF4bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi12ZXJzYWRvcy5sbzogdmVyc2Fkb3MuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXZtcy5sbzogdm1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWdzZC5sbzogdm1zLWdzZC5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1oZHIubG86IHZtcy1oZHIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtbWlzYy5sbzogdm1zLW1pc2MuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtdGlyLmxvOiB2bXMtdGlyLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAoteGNvZmZsaW5rLmxvOiB4Y29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWFvdXQ2NC5sbzogYW91dDY0LmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1jb2ZmLWFscGhhLmxvOiBjb2ZmLWFscGhhLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBlY29mZnN3YXAuaAotZGVtbzY0LmxvOiBkZW1vNjQuYyBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWVsZjY0LWFscGhhLmxvOiBlbGY2NC1hbHBoYS5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVjb2Zmc3dhcC5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1nZW4ubG86IGVsZjY0LWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LW1pcHMubG86IGVsZjY0LW1pcHMuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBnZW5saW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggZWNvZmZzd2FwLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtc3BhcmMubG86IGVsZjY0LXNwYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC5sbzogZWxmNjQuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1ubG0zMi1hbHBoYS5sbzogbmxtMzItYWxwaGEuYyAkKElOQ0RJUikvbmxtL2FscGhhLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtNjQubG86IG5sbTY0LmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1haXgzODYtY29yZS5sbzogYWl4Mzg2LWNvcmUuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ocHV4LWNvcmUubG86IGhwdXgtY29yZS5jCi1pcml4LWNvcmUubG86IGlyaXgtY29yZS5jCi1seW54LWNvcmUubG86IGx5bngtY29yZS5jCi1vc2YtY29yZS5sbzogb3NmLWNvcmUuYwotc2NvNS1jb3JlLmxvOiBzY281LWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotdHJhZC1jb3JlLmxvOiB0cmFkLWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGhvc3RzL2kzODZsaW51eC5oCi1jaXNjby1jb3JlLmxvOiBjaXNjby1jb3JlLmMKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvYmZkL01ha2VmaWxlLmluIGIvYmZkL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UyNjY5Li4wMDAwMDAwCi0tLSBhL2JmZC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE2MzcgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9IT1NUXzY0QklUX0xPTkcgPSBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLUJGRF9IT1NUXzY0X0JJVCA9IEBCRkRfSE9TVF82NF9CSVRACi1CRkRfSE9TVF82NF9CSVRfREVGSU5FRCA9IEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLUJGRF9IT1NUX1VfNjRfQklUID0gQEJGRF9IT1NUX1VfNjRfQklUQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotQ09SRUZJTEUgPSBAQ09SRUZJTEVACi1DT1JFRkxBRyA9IEBDT1JFRkxBR0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUVYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSERFRklORVMgPSBASERFRklORVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTk0gPSBATk1ACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1UREVGSU5FUyA9IEBUREVGSU5FU0AKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACi1XSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKLWFsbF9iYWNrZW5kcyA9IEBhbGxfYmFja2VuZHNACi1iZmRfYmFja2VuZHMgPSBAYmZkX2JhY2tlbmRzQAotYmZkX21hY2hpbmVzID0gQGJmZF9tYWNoaW5lc0AKLWwgPSBAbEAKLXRkZWZhdWx0cyA9IEB0ZGVmYXVsdHNACi13b3Jkc2l6ZSA9IEB3b3Jkc2l6ZUAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQotTUtERVAgPSBta2RlcAotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKLUJGRF9IID0gYmZkLmgKLQotIyBKaW0gS2luZ2RvbiBub3RlczoKLSMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKLSMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCi0jIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKLSMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQotIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKLSMgZGVidWdnZXIpLgotQkZEX0xJQlMgPSBcCi0JYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCi0JZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCi0Jc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAotCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotCi0KLUJGRF9MSUJTX0NGSUxFUyA9IFwKLQlhcmNoaXZlLmMgYXJjaHVyZXMuYyBiZmQuYyBjYWNoZS5jIGNvZmZnZW4uYyBjb3JlZmlsZS5jIFwKLQlmb3JtYXQuYyBpbml0LmMgbGliYmZkLmMgb3BuY2xzLmMgcmVsb2MuYyBcCi0Jc2VjdGlvbi5jIHN5bXMuYyB0YXJnZXRzLmMgaGFzaC5jIGxpbmtlci5jIFwKLQlzcmVjLmMgYmluYXJ5LmMgdGVraGV4LmMgaWhleC5jIHN0YWJzLmMgc3RhYi1zeW1zLmMKLQotCi0jIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jCi0jIHdpdGggdGhlIGRlY2xzIGFuZCBpbml0aWFsaXplciBpbiBhcmNodXJlcy5jLgotQUxMX01BQ0hJTkVTID0gXAotCWNwdS1hMjlrLmxvIFwKLQljcHUtYWxwaGEubG8gXAotCWNwdS1hcmMubG8gXAotCWNwdS1hcm0ubG8gXAotCWNwdS1kMTB2LmxvIFwKLQljcHUtZDMwdi5sbyBcCi0JY3B1LWZyMzAubG8gXAotCWNwdS1oODMwMC5sbyBcCi0JY3B1LWg4NTAwLmxvIFwKLQljcHUtaHBwYS5sbyBcCi0JY3B1LWkzODYubG8gXAotCWNwdS1pODYwLmxvIFwKLQljcHUtaTk2MC5sbyBcCi0JY3B1LW0zMnIubG8gXAotCWNwdS1tNjhrLmxvIFwKLQljcHUtbTg4ay5sbyBcCi0JY3B1LW0xMDIwMC5sbyBcCi0JY3B1LW0xMDMwMC5sbyBcCi0JY3B1LW1jb3JlLmxvIFwKLQljcHUtbWlwcy5sbyBcCi0JY3B1LW5zMzJrLmxvIFwKLQljcHUtcGoubG8gXAotCWNwdS1wb3dlcnBjLmxvIFwKLQljcHUtcnM2MDAwLmxvIFwKLQljcHUtc2gubG8gXAotCWNwdS1zcGFyYy5sbyBcCi0JY3B1LXRpYzMwLmxvIFwKLQljcHUtdGljODAubG8gXAotCWNwdS12ODUwLmxvIFwKLQljcHUtdmF4LmxvIFwKLQljcHUtd2UzMmsubG8gXAotCWNwdS13NjUubG8gXAotCWNwdS16OGsubG8KLQotCi1BTExfTUFDSElORVNfQ0ZJTEVTID0gXAotCWNwdS1hMjlrLmMgXAotCWNwdS1hbHBoYS5jIFwKLQljcHUtYXJjLmMgXAotCWNwdS1hcm0uYyBcCi0JY3B1LWQxMHYuYyBcCi0JY3B1LWQzMHYuYyBcCi0JY3B1LWZyMzAuYyBcCi0JY3B1LWg4MzAwLmMgXAotCWNwdS1oODUwMC5jIFwKLQljcHUtaHBwYS5jIFwKLQljcHUtaTM4Ni5jIFwKLQljcHUtaTg2MC5jIFwKLQljcHUtaTk2MC5jIFwKLQljcHUtbTMyci5jIFwKLQljcHUtbTY4ay5jIFwKLQljcHUtbTg4ay5jIFwKLQljcHUtbTEwMjAwLmMgXAotCWNwdS1tMTAzMDAuYyBcCi0JY3B1LW1jb3JlLmMgXAotCWNwdS1taXBzLmMgXAotCWNwdS1uczMyay5jIFwKLQljcHUtcGouYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljODAuYyBcCi0JY3B1LXY4NTAuYyBcCi0JY3B1LXZheC5jIFwKLQljcHUtd2UzMmsuYyBcCi0JY3B1LXc2NS5jIFwKLQljcHUtejhrLmMKLQotCi0jIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSAzMiBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KLSMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLgotQkZEMzJfQkFDS0VORFMgPSBcCi0JYW91dC1hZG9iZS5sbyBcCi0JYW91dC1hcm0ubG8gXAotCWFvdXQtbnMzMmsubG8gXAotCWFvdXQtc3BhcmNsZS5sbyBcCi0JYW91dC10aWMzMC5sbyBcCi0JYW91dDAubG8gXAotCWFvdXQzMi5sbyBcCi0JYXJtbmV0YnNkLmxvIFwKLQlib3V0LmxvIFwKLQljZi1pMzg2bHlueC5sbyBcCi0JY2YtbTY4a2x5bngubG8gXAotCWNmLXNwYXJjbHlueC5sbyBcCi0JY29mZi1hMjlrLmxvIFwKLQljb2ZmLWFwb2xsby5sbyBcCi0JY29mZi1hcm0ubG8gXAotCWNvZmYtYXV4LmxvIFwKLQljb2ZmLWg4MzAwLmxvIFwKLQljb2ZmLWg4NTAwLmxvIFwKLQljb2ZmLWkzODYubG8gXAotCWNvZmYtZ28zMi5sbyBcCi0JY29mZi1pODYwLmxvIFwKLQljb2ZmLWk5NjAubG8gXAotCWNvZmYtbTY4ay5sbyBcCi0JY29mZi1tODhrLmxvIFwKLQljb2ZmLW1pcHMubG8gXAotCWNvZmYtcG1hYy5sbyBcCi0JY29mZi1yczYwMDAubG8gXAotCWNvZmYtc2gubG8gXAotCWNvZmYtc3BhcmMubG8gXAotCWNvZmYtc3RnbzMyLmxvIFwKLQljb2ZmLXN2bTY4ay5sbyBcCi0JY29mZi10aWMzMC5sbyBcCi0JY29mZi10aWM4MC5sbyBcCi0JY29mZi11NjhrLmxvIFwKLQljb2ZmLXdlMzJrLmxvIFwKLQljb2ZmLXc2NS5sbyBcCi0JY29mZi16OGsubG8gXAotCWNvZmZsaW5rLmxvIFwKLQlkd2FyZjEubG8gXAotCWR3YXJmMi5sbyBcCi0JZWNvZmYubG8gXAotCWVjb2ZmbGluay5sbyBcCi0JZWxmLmxvIFwKLQllbGYzMi1hcmMubG8gXAotCWVsZmFybS1vYWJpLmxvIFwKLQllbGZhcm0tbmFiaS5sbyBcCi0JZWxmMzItZDEwdi5sbyBcCi0JZWxmMzItZDMwdi5sbyBcCi0JZWxmMzItZnIzMC5sbyBcCi0JZWxmMzItZ2VuLmxvIFwKLQllbGYzMi1ocHBhLmxvIFwKLQllbGYzMi1pMzg2LmxvIFwKLQllbGYzMi1pODYwLmxvIFwKLQllbGYzMi1pOTYwLmxvIFwKLQllbGYzMi1tMzJyLmxvIFwKLQllbGYzMi1tNjhrLmxvIFwKLQllbGYzMi1tODhrLmxvIFwKLQllbGYtbTEwMjAwLmxvIFwKLQllbGYtbTEwMzAwLmxvIFwKLQllbGYzMi1tY29yZS5sbyBcCi0JZWxmMzItbWlwcy5sbyBcCi0JZWxmMzItcGoubG8gXAotCWVsZjMyLXBwYy5sbyBcCi0JZWxmMzItc2gubG8gXAotCWVsZjMyLXNwYXJjLmxvIFwKLQllbGYzMi12ODUwLmxvIFwKLQllbGYzMi5sbyBcCi0JZWxmbGluay5sbyBcCi0JZXBvYy1wZS1hcm0ubG8gXAotCWVwb2MtcGVpLWFybS5sbyBcCi0JaHAzMDBic2QubG8gXAotCWhwMzAwaHB1eC5sbyBcCi0Jc29tLmxvIFwKLQlpMzg2YW91dC5sbyBcCi0JaTM4NmJzZC5sbyBcCi0JaTM4NmR5bml4LmxvIFwKLQlpMzg2ZnJlZWJzZC5sbyBcCi0JaTM4NmxpbnV4LmxvIFwKLQlpMzg2bHlueC5sbyBcCi0JaTM4Nm1zZG9zLmxvIFwKLQlpMzg2bmV0YnNkLmxvIFwKLQlpMzg2bWFjaDMubG8gXAotCWkzODZvczlrLmxvIFwKLQlpZWVlLmxvIFwKLQltNjhrNGtuZXRic2QubG8gXAotCW02OGtsaW51eC5sbyBcCi0JbTY4a2x5bngubG8gXAotCW02OGtuZXRic2QubG8gXAotCW04OGttYWNoMy5sbyBcCi0JbWlwc2JzZC5sbyBcCi0JbmV3c29zMy5sbyBcCi0JbmxtLmxvIFwKLQlubG0zMi1pMzg2LmxvIFwKLQlubG0zMi1zcGFyYy5sbyBcCi0JbmxtMzItcHBjLmxvIFwKLQlubG0zMi5sbyBcCi0JbnMzMmtuZXRic2QubG8gXAotCW9hc3lzLmxvIFwKLQlwYzUzMi1tYWNoLmxvIFwKLQlwZS1hcm0ubG8gXAotCXBlaS1hcm0ubG8gXAotCXBlLWkzODYubG8gXAotCXBlaS1pMzg2LmxvIFwKLQlwZS1tY29yZS5sbyBcCi0JcGVpLW1jb3JlLmxvIFwKLQlwZS1wcGMubG8gXAotCXBlaS1wcGMubG8gXAotCXBlaWdlbi5sbyBcCi0JcHBjYm9vdC5sbyBcCi0JcmVsb2MxNi5sbyBcCi0JcmlzY2l4LmxvIFwKLQlzcGFyY2xpbnV4LmxvIFwKLQlzcGFyY2x5bngubG8gXAotCXNwYXJjbmV0YnNkLmxvIFwKLQlzdW5vcy5sbyBcCi0JdmF4bmV0YnNkLmxvIFwKLQl2ZXJzYWRvcy5sbyBcCi0Jdm1zLmxvIFwKLQl2bXMtZ3NkLmxvIFwKLQl2bXMtaGRyLmxvIFwKLQl2bXMtbWlzYy5sbyBcCi0Jdm1zLXRpci5sbyBcCi0JeGNvZmZsaW5rLmxvCi0KLQotQkZEMzJfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQtYWRvYmUuYyBcCi0JYW91dC1hcm0uYyBcCi0JYW91dC1uczMyay5jIFwKLQlhb3V0LXNwYXJjbGUuYyBcCi0JYW91dC10aWMzMC5jIFwKLQlhb3V0MC5jIFwKLQlhb3V0MzIuYyBcCi0JYXJtbmV0YnNkLmMgXAotCWJvdXQuYyBcCi0JY2YtaTM4Nmx5bnguYyBcCi0JY2YtbTY4a2x5bnguYyBcCi0JY2Ytc3BhcmNseW54LmMgXAotCWNvZmYtYTI5ay5jIFwKLQljb2ZmLWFwb2xsby5jIFwKLQljb2ZmLWFybS5jIFwKLQljb2ZmLWF1eC5jIFwKLQljb2ZmLWg4MzAwLmMgXAotCWNvZmYtaDg1MDAuYyBcCi0JY29mZi1pMzg2LmMgXAotCWNvZmYtaTg2MC5jIFwKLQljb2ZmLWdvMzIuYyBcCi0JY29mZi1pOTYwLmMgXAotCWNvZmYtbTY4ay5jIFwKLQljb2ZmLW04OGsuYyBcCi0JY29mZi1taXBzLmMgXAotCWNvZmYtcG1hYy5jIFwKLQljb2ZmLXJzNjAwMC5jIFwKLQljb2ZmLXNoLmMgXAotCWNvZmYtc3BhcmMuYyBcCi0JY29mZi1zdGdvMzIuYyBcCi0JY29mZi1zdm02OGsuYyBcCi0JY29mZi10aWMzMC5jIFwKLQljb2ZmLXRpYzgwLmMgXAotCWNvZmYtdTY4ay5jIFwKLQljb2ZmLXdlMzJrLmMgXAotCWNvZmYtdzY1LmMgXAotCWNvZmYtejhrLmMgXAotCWNvZmZsaW5rLmMgXAotCWR3YXJmMS5jIFwKLQlkd2FyZjIuYyBcCi0JZWNvZmYuYyBcCi0JZWNvZmZsaW5rLmMgXAotCWVsZi5jIFwKLQllbGYzMi1hcmMuYyBcCi0JZWxmYXJtLW9hYmkuYyBcCi0JZWxmYXJtLW5hYmkuYyBcCi0JZWxmMzItZDEwdi5jIFwKLQllbGYzMi1kMzB2LmMgXAotCWVsZjMyLWZyMzAuYyBcCi0JZWxmMzItZ2VuLmMgXAotCWVsZjMyLWhwcGEuYyBcCi0JZWxmMzItaTM4Ni5jIFwKLQllbGYzMi1pODYwLmMgXAotCWVsZjMyLWk5NjAuYyBcCi0JZWxmMzItbTMyci5jIFwKLQllbGYzMi1tNjhrLmMgXAotCWVsZjMyLW04OGsuYyBcCi0JZWxmLW0xMDIwMC5jIFwKLQllbGYtbTEwMzAwLmMgXAotCWVsZjMyLW1jb3JlLmMgXAotCWVsZjMyLW1pcHMuYyBcCi0JZWxmMzItcGouYyBcCi0JZWxmMzItcHBjLmMgXAotCWVsZjMyLXNoLmMgXAotCWVsZjMyLXNwYXJjLmMgXAotCWVsZjMyLXY4NTAuYyBcCi0JZWxmMzIuYyBcCi0JZWxmbGluay5jIFwKLQllcG9jLXBlLWFybS5jIFwKLQllcG9jLXBlaS1hcm0uYyBcCi0JaHAzMDBic2QuYyBcCi0JaHAzMDBocHV4LmMgXAotCXNvbS5jIFwKLQlpMzg2YW91dC5jIFwKLQlpMzg2YnNkLmMgXAotCWkzODZkeW5peC5jIFwKLQlpMzg2ZnJlZWJzZC5jIFwKLQlpMzg2bGludXguYyBcCi0JaTM4Nmx5bnguYyBcCi0JaTM4Nm1zZG9zLmMgXAotCWkzODZuZXRic2QuYyBcCi0JaTM4Nm1hY2gzLmMgXAotCWkzODZvczlrLmMgXAotCWllZWUuYyBcCi0JbTY4azRrbmV0YnNkLmMgXAotCW02OGtsaW51eC5jIFwKLQltNjhrbHlueC5jIFwKLQltNjhrbmV0YnNkLmMgXAotCW04OGttYWNoMy5jIFwKLQltaXBzYnNkLmMgXAotCW5ld3NvczMuYyBcCi0JbmxtLmMgXAotCW5sbTMyLWkzODYuYyBcCi0JbmxtMzItc3BhcmMuYyBcCi0JbmxtMzItcHBjLmMgXAotCW5sbTMyLmMgXAotCW5zMzJrbmV0YnNkLmMgXAotCW9hc3lzLmMgXAotCXBjNTMyLW1hY2guYyBcCi0JcGUtYXJtLmMgXAotCXBlaS1hcm0uYyBcCi0JcGUtaTM4Ni5jIFwKLQlwZWktaTM4Ni5jIFwKLQlwZS1tY29yZS5jIFwKLQlwZWktbWNvcmUuYyBcCi0JcGUtcHBjLmMgXAotCXBlaS1wcGMuYyBcCi0JcGVpZ2VuLmMgXAotCXBwY2Jvb3QuYyBcCi0JcmVsb2MxNi5jIFwKLQlyaXNjaXguYyBcCi0Jc3BhcmNsaW51eC5jIFwKLQlzcGFyY2x5bnguYyBcCi0Jc3BhcmNuZXRic2QuYyBcCi0Jc3Vub3MuYyBcCi0JdmF4bmV0YnNkLmMgXAotCXZlcnNhZG9zLmMgXAotCXZtcy5jIFwKLQl2bXMtZ3NkLmMgXAotCXZtcy1oZHIuYyBcCi0Jdm1zLW1pc2MuYyBcCi0Jdm1zLXRpci5jIFwKLQl4Y29mZmxpbmsuYwotCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDY0IGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwKLSMgYW5kIC0tZW5hYmxlLTY0LWJpdC1iZmQuCi1CRkQ2NF9CQUNLRU5EUyA9IFwKLQlhb3V0NjQubG8gXAotCWNvZmYtYWxwaGEubG8gXAotCWRlbW82NC5sbyBcCi0JZWxmNjQtYWxwaGEubG8gXAotCWVsZjY0LWdlbi5sbyBcCi0JZWxmNjQtbWlwcy5sbyBcCi0JZWxmNjQtc3BhcmMubG8gXAotCWVsZjY0LmxvIFwKLQlubG0zMi1hbHBoYS5sbyBcCi0JbmxtNjQubG8KLQotCi1CRkQ2NF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dDY0LmMgXAotCWNvZmYtYWxwaGEuYyBcCi0JZGVtbzY0LmMgXAotCWVsZjY0LWFscGhhLmMgXAotCWVsZjY0LWdlbi5jIFwKLQllbGY2NC1taXBzLmMgXAotCWVsZjY0LXNwYXJjLmMgXAotCWVsZjY0LmMgXAotCW5sbTMyLWFscGhhLmMgXAotCW5sbTY0LmMKLQotCi1PUFRJT05BTF9CQUNLRU5EUyA9IFwKLQlhaXgzODYtY29yZS5sbyBcCi0JaHB1eC1jb3JlLmxvIFwKLQlpcml4LWNvcmUubG8gXAotCWx5bngtY29yZS5sbyBcCi0Jb3NmLWNvcmUubG8gXAotCXNjbzUtY29yZS5sbyBcCi0JdHJhZC1jb3JlLmxvIFwKLQljaXNjby1jb3JlLmxvCi0KLQotT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFpeDM4Ni1jb3JlLmMgXAotCWhwdXgtY29yZS5jIFwKLQlpcml4LWNvcmUuYyBcCi0JbHlueC1jb3JlLmMgXAotCW9zZi1jb3JlLmMgXAotCXNjbzUtY29yZS5jIFwKLQl0cmFkLWNvcmUuYyBcCi0JY2lzY28tY29yZS5jCi0KLQotIyBUaGVzZSBhcmUgZGVmaW5lZCBieSBjb25maWd1cmUuaW46Ci1XT1JEU0laRSA9IEB3b3Jkc2l6ZUAKLUFMTF9CQUNLRU5EUyA9IEBhbGxfYmFja2VuZHNACi1CRkRfQkFDS0VORFMgPSBAYmZkX2JhY2tlbmRzQAotQkZEX01BQ0hJTkVTID0gQGJmZF9tYWNoaW5lc0AKLVRERUZBVUxUUyA9IEB0ZGVmYXVsdHNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSBASERFRklORVNAIEBDT1JFRkxBR0AgQFRERUZJTkVTQCAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCSQoQkZEX0xJQlNfQ0ZJTEVTKSBcCi0JJChBTExfTUFDSElORVNfQ0ZJTEVTKSBcCi0JJChCRkQzMl9CQUNLRU5EU19DRklMRVMpIFwKLQkkKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKQotCi0KLVNPVVJDRV9IRklMRVMgPSBcCi0JYW91dC10YXJnZXQuaCBhb3V0ZjEuaCBhb3V0eC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0JZWNvZmZzd2FwLmggZWxmMzItYXJtLmggZWxmMzItaHBwYS5oIGVsZmNvZGUuaCBlbGZjb3JlLmggXAotCWVsZmxpbmsuaCBmcmVlYnNkLmggZ2VubGluay5oIGdvMzJzdHViLmggaHBwYV9zdHVicy5oIGxpYmFvdXQuaCBcCi0JbGliYmZkLmggbGliY29mZi5oIGxpYmVjb2ZmLmggZWxmLWJmZC5oIGxpYmhwcGEuaCBsaWJpZWVlLmggXAotCWxpYm5sbS5oIGxpYm9hc3lzLmggbGlicGVpLmggbmV0YnNkLmggbmxtLXRhcmdldC5oIG5sbWNvZGUuaCBcCi0Jbmxtc3dhcC5oIG5zMzJrLmggcGVpY29kZS5oIHNvbS5oIHZtcy5oCi0KLQotSEZJTEVTID0gXAotCWVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIHRhcmdtYXRjaC5oIFwKLQkkKFNPVVJDRV9IRklMRVMpCi0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQotCi0jIFZhcmlvdXMga2luZHMgb2YgLm8gZmlsZXMgdG8gcHV0IGluIGxpYmJmZC5hOgotIyBCRkRfQkFDS0VORFMJUm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBCRkRfTUFDSElORVMJQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQ09SRUZJTEUJQ29yZSBmaWxlIHJvdXRpbmVzIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uCi1PRklMRVMgPSAkKEJGRF9CQUNLRU5EUykgJChCRkRfTUFDSElORVMpIEBDT1JFRklMRUAKLQotbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKLWxpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCi1saWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKLWxpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKLSMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKLSMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgotIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCi1saWJiZmRfYV9TT1VSQ0VTID0gCi0KLUJGRF9IX0RFUFMgPSAkKElOQ0RJUikvYW5zaWRlY2wuaAotTE9DQUxfSF9ERVBTID0gbGliYmZkLmggc3lzZGVwLmggY29uZmlnLmgKLQotQkZEX0hfRklMRVMgPSBiZmQtaW4uaCBpbml0LmMgb3BuY2xzLmMgbGliYmZkLmMgc2VjdGlvbi5jIGFyY2h1cmVzLmMgXAotCXJlbG9jLmMgc3ltcy5jIGJmZC5jIGFyY2hpdmUuYyBjb3JlZmlsZS5jIHRhcmdldHMuYyBmb3JtYXQuYwotCi1MSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYwotTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKLQotTU9TVExZQ0xFQU5GSUxFUyA9IGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIG9maWxlcyBzdGFtcC1vZmlsZXMgXAotCXRhcmdtYXRjaC5oCi0KLQotQ0xFQU5GSUxFUyA9IGJmZC5oIGRlcC5zZWQgc3RtcC1iZmQtaCBERVAgREVQMSBsaWJiZmQuYSBzdGFtcC1saWIgXAotCXN0bXAtYmluMi1oIHN0bXAtbGJmZC1oIHN0bXAtbGNvZmYtaAotCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9ICBiZmQtaW4zLmgKLUxJQlJBUklFUyA9ICAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLWxpYmJmZF9hX0xJQkFERCA9IAotbGliYmZkX2FfT0JKRUNUUyA9IAotTFRMSUJSQVJJRVMgPSAgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWxpYmJmZF9sYV9PQkpFQ1RTID0gIGFyY2hpdmUubG8gYXJjaHVyZXMubG8gYmZkLmxvIGNhY2hlLmxvIGNvZmZnZW4ubG8gXAotY29yZWZpbGUubG8gZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBzZWN0aW9uLmxvIFwKLXN5bXMubG8gdGFyZ2V0cy5sbyBoYXNoLmxvIGxpbmtlci5sbyBzcmVjLmxvIGJpbmFyeS5sbyB0ZWtoZXgubG8gXAotaWhleC5sbyBzdGFicy5sbyBzdGFiLXN5bXMubG8KLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDT1BZSU5HIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBcCi1NYWtlZmlsZS5pbiBUT0RPIGFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGJmZC1pbjIuaCBjb25maWcuaW4gY29uZmlndXJlIFwKLWNvbmZpZ3VyZS5pbgotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gJChsaWJiZmRfYV9TT1VSQ0VTKSAkKGxpYmJmZF9sYV9TT1VSQ0VTKQotT0JKRUNUUyA9ICQobGliYmZkX2FfT0JKRUNUUykgJChsaWJiZmRfbGFfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmxvIC5vIC5zCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotYmZkLWluMy5oOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyBiZmQtaW4yLmgKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgQ09ORklHX0ZJTEVTPSRAOmJmZC1pbjIuaCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1tb3N0bHljbGVhbi1saWJMVExJQlJBUklFUzoKLQotY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUzoKLQotaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgJChMSUJUT09MKSAgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCWRvbmUKLQotbGliYmZkLmxhOiAkKGxpYmJmZF9sYV9PQkpFQ1RTKSAkKGxpYmJmZF9sYV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGliYmZkX2xhX0xERkxBR1MpICQobGliYmZkX2xhX09CSkVDVFMpICQobGliYmZkX2xhX0xJQkFERCkgJChMSUJTKQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1pbmZvLWFtOgotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbToKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtZGF0YS1sb2NhbAotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKExJQlJBUklFUykgJChMVExJQlJBUklFUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobGliZGlyKQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBcCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAotaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCBcCi11bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKLWluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1kaXN0c3R1ZmY6IGluZm8KLQotc3RhbXAtb2ZpbGVzOiBNYWtlZmlsZQotCXJtIC1mIHRvZmlsZXMKLQlmPSIiOyBcCi0JZm9yIGkgaW4gJChPRklMRVMpIDsgZG8gXAotCSAgY2FzZSAiICQkZiAiIGluIFwKLQkgICAgKiIgJCRpICIqKSA7OyBcCi0JICAgICopIGY9IiQkZiAkJGkiIDs7IFwKLQkgIGVzYWMgOyBcCi0JZG9uZSA7IFwKLQllY2hvICQkZiA+IHRvZmlsZXMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG9maWxlcyBvZmlsZXMKLQl0b3VjaCBzdGFtcC1vZmlsZXMKLQotb2ZpbGVzOiBzdGFtcC1vZmlsZXMgOyBAdHJ1ZQotCi1zdGFtcC1saWI6IGxpYmJmZC5sYQotCWlmIFsgLWYgLmxpYnMvbGliYmZkLmEgXTsgdGhlbiBcCi0JICBjcCAubGlicy9saWJiZmQuYSBsaWJiZmQudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGliYmZkLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLSMgVGhpcyBmaWxlIGhvbGRzIGFuIGFycmF5IGFzc29jaWF0aW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYW5kCi0jIHZlY3RvciBuYW1lcy4gIEl0IGlzIGJ1aWx0IGZyb20gY29uZmlnLmJmZC4gIEl0IGlzIG5vdCBjb21waWxlZCBieQotIyBpdHNlbGYsIGJ1dCBpcyBpbmNsdWRlZCBieSB0YXJnZXRzLmMuCi10YXJnbWF0Y2guaDogY29uZmlnLmJmZCB0YXJnbWF0Y2guc2VkCi0Jcm0gLWYgdGFyZ21hdGNoLmgKLQlzZWQgLWYgJChzcmNkaXIpL3RhcmdtYXRjaC5zZWQgPCAkKHNyY2RpcikvY29uZmlnLmJmZCA+IHRhcmdtYXRjaC5uZXcKLQltdiAtZiB0YXJnbWF0Y2gubmV3IHRhcmdtYXRjaC5oCi0KLSMgV2hlbiBjb21waWxpbmcgYXJjaHVyZXMuYyBhbmQgdGFyZ2V0cy5jLCBzdXBwbHkgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0jIGluZm8gZnJvbSBjb25maWd1cmUuCi0KLXRhcmdldHMubG86IHRhcmdldHMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvdGFyZ2V0cy5jCi0KLWFyY2h1cmVzLmxvOiBhcmNodXJlcy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS9hcmNodXJlcy5jCi0KLWVsZjMyLXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGYzMi10YXJnZXQuaAotCXNlZCAtZSBzL05OLzMyL2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGYzMi10YXJnZXQubmV3Ci0JbXYgLWYgZWxmMzItdGFyZ2V0Lm5ldyBlbGYzMi10YXJnZXQuaAotCi1lbGY2NC10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmNjQtdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi82NC9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmNjQtdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjY0LXRhcmdldC5uZXcgZWxmNjQtdGFyZ2V0LmgKLSQoQkZEX0xJQlMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfTUFDSElORVMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChPUFRJT05BTF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0KLSMgSW5zdGFsbCBCRkQgaW5jbHVkZSBmaWxlLCBhbmQgb3RoZXJzIHRoYXQgaXQgbmVlZHMuCi1pbnN0YWxsLWRhdGEtbG9jYWw6ICQoQkZEX0gpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpCi0JJChJTlNUQUxMX0RBVEEpICQoQkZEX0gpICQoaW5jbHVkZWRpcikvYmZkLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2Fuc2lkZWNsLmggJChpbmNsdWRlZGlyKS9hbnNpZGVjbC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9iZmRsaW5rLmggJChpbmNsdWRlZGlyKS9iZmRsaW5rLmgKLQotIyBIYXZlIHRvIGdldCByaWQgb2YgREVQMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgYmZkLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPERFUDEgPkRFUAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotIyBUaGUgTmV0QlNEIG1rZGVwIG92ZXJ3cml0ZXMgYW55IGV4aXN0aW5nIGZpbGUgY29udGVudHMsIGFuZCBkb2Vzbid0IGluc2VydAotIyB0aGUgIkRPIE5PVCBERUxFVEUiIGxpbmUuCi0jIE90aGVyIG1rZGVwIHZlcnNpb25zIHJlcXVpcmUgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMsIGFuZCBkbyBpbnNlcnQgaXQuCi0jIEhlbmNlIHRoZSB3ZWlyZG5lc3MuLi4uCi1ERVAxOiAkKENGSUxFUykKLQlybSAtZiBERVAyIERFUDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JZWNobyA+IERFUDJhCi0JJChNS0RFUCkgLWYgREVQMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/Ci0Jc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IERFUDJhID4+IERFUDIKLQlybSAtZiBERVAyYQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLWhvc3QtYW91dC5sbzogTWFrZWZpbGUKLQotIyBUaGUgZm9sbG93aW5nIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBzaW1wbGUgY29uZmlnIGZpbGUKLSMgd2hpY2ggY2FuIGJlIGZvbGRlZCBpbnRvIGFuIGgtWFhYIGZpbGUgZm9yIGEgbmV3IGhvc3QsIHdpdGggc29tZSBlZGl0aW5nLgotYW91dC1wYXJhbXMuaDogZ2VuLWFvdXQKLQkuL2dlbi1hb3V0IGhvc3QgPiBhb3V0LXBhcmFtcy5oCi1nZW4tYW91dDogJChzcmNkaXIpL2dlbi1hb3V0LmMgTWFrZWZpbGUKLQkkKENDKSAtbyBnZW4tYW91dCAkKENGTEFHUykgJChMRkxBR1MpICQoc3JjZGlyKS9nZW4tYW91dC5jCi0KLSQoQkZEX0gpOiBzdG1wLWJmZC1oIDsgQHRydWUKLQotc3RtcC1iZmQtaDogYmZkLWluMy5oCi0Jcm0gLWYgYmZkLXRtcC5oCi0JY3AgYmZkLWluMy5oIGJmZC10bXAuaAotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtdG1wLmggJChCRkRfSCkKLQlybSAtZiBiZmQtdG1wLmgKLQl0b3VjaCBzdG1wLWJmZC1oCi0KLSMgQ291bGQgcmVhbGx5IHVzZSBhICJjb3B5LWlmLWNoYW5nZSIuLi4KLWhlYWRlcnM6Ci0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSBwcm90b3MgJChGTEFHU19UT19QQVNTKSkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0KLSMgV2Ugb25seSByZWJ1aWxkIHRoZSBoZWFkZXIgZmlsZXMgYXV0b21hdGljYWxseSBpZiB3ZSBoYXZlIGJlZW4KLSMgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLW1haW50YWluZXItbW9kZS4KLQotJChzcmNkaXIpL2JmZC1pbjIuaDogQE1BSU5UQCBzdG1wLWJpbjItaCA7IEB0cnVlCi1zdG1wLWJpbjItaDogJChCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYmZkLmgpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCi0JdG91Y2ggc3RtcC1iaW4yLWgKLQotJChzcmNkaXIpL2xpYmJmZC5oOiBATUFJTlRAIHN0bXAtbGJmZC1oIDsgQHRydWUKLXN0bXAtbGJmZC1oOiAkKExJQkJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJiZmQuaCkKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKLQl0b3VjaCBzdG1wLWxiZmQtaAotCi0kKHNyY2RpcikvbGliY29mZi5oOiBATUFJTlRAIHN0bXAtbGNvZmYtaCA7IEB0cnVlCi1zdG1wLWxjb2ZmLWg6ICQoTElCQ09GRl9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJjb2ZmLmgpCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAotCXRvdWNoIHN0bXAtbGNvZmYtaAotCi0jIFdlIHdhbnQgdG8gcmVydW4gY29uZmlndXJlIGlmIGNvbmZpZy5iZmQgb3IgY29uZmlndXJlLmhvc3QgY2hhbmdlLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlnLmJmZCAkKHNyY2RpcikvY29uZmlndXJlLmhvc3QKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgZWxmMzItYXJtLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWFyY2hpdmUubG86IGFyY2hpdmUuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYwotYmZkLmxvOiBiZmQuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotY2FjaGUubG86IGNhY2hlLmMKLWNvZmZnZW4ubG86IGNvZmZnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWNvcmVmaWxlLmxvOiBjb3JlZmlsZS5jCi1mb3JtYXQubG86IGZvcm1hdC5jCi1pbml0LmxvOiBpbml0LmMKLWxpYmJmZC5sbzogbGliYmZkLmMKLW9wbmNscy5sbzogb3BuY2xzLmMgJChJTkNESVIpL29iamFsbG9jLmgKLXJlbG9jLmxvOiByZWxvYy5jICQoSU5DRElSKS9iZmRsaW5rLmgKLXNlY3Rpb24ubG86IHNlY3Rpb24uYyAkKElOQ0RJUikvYmZkbGluay5oCi1zeW1zLmxvOiBzeW1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXRhcmdldHMubG86IHRhcmdldHMuYyAkKElOQ0RJUikvZm5tYXRjaC5oIHRhcmdtYXRjaC5oCi1oYXNoLmxvOiBoYXNoLmMgJChJTkNESVIpL29iamFsbG9jLmgKLWxpbmtlci5sbzogbGlua2VyLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmgKLXNyZWMubG86IHNyZWMuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJpbmFyeS5sbzogYmluYXJ5LmMKLXRla2hleC5sbzogdGVraGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1paGV4LmxvOiBpaGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdGFicy5sbzogc3RhYnMuYyAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdGFiLXN5bXMubG86IHN0YWItc3ltcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLWNwdS1hMjlrLmxvOiBjcHUtYTI5ay5jCi1jcHUtYWxwaGEubG86IGNwdS1hbHBoYS5jCi1jcHUtYXJjLmxvOiBjcHUtYXJjLmMKLWNwdS1hcm0ubG86IGNwdS1hcm0uYwotY3B1LWQxMHYubG86IGNwdS1kMTB2LmMKLWNwdS1kMzB2LmxvOiBjcHUtZDMwdi5jCi1jcHUtZnIzMC5sbzogY3B1LWZyMzAuYwotY3B1LWg4MzAwLmxvOiBjcHUtaDgzMDAuYwotY3B1LWg4NTAwLmxvOiBjcHUtaDg1MDAuYwotY3B1LWhwcGEubG86IGNwdS1ocHBhLmMKLWNwdS1pMzg2LmxvOiBjcHUtaTM4Ni5jCi1jcHUtaTg2MC5sbzogY3B1LWk4NjAuYwotY3B1LWk5NjAubG86IGNwdS1pOTYwLmMKLWNwdS1tMzJyLmxvOiBjcHUtbTMyci5jCi1jcHUtbTY4ay5sbzogY3B1LW02OGsuYwotY3B1LW04OGsubG86IGNwdS1tODhrLmMKLWNwdS1tMTAyMDAubG86IGNwdS1tMTAyMDAuYwotY3B1LW0xMDMwMC5sbzogY3B1LW0xMDMwMC5jCi1jcHUtbWNvcmUubG86IGNwdS1tY29yZS5jCi1jcHUtbWlwcy5sbzogY3B1LW1pcHMuYwotY3B1LW5zMzJrLmxvOiBjcHUtbnMzMmsuYyBuczMyay5oCi1jcHUtcGoubG86IGNwdS1wai5jCi1jcHUtcG93ZXJwYy5sbzogY3B1LXBvd2VycGMuYwotY3B1LXJzNjAwMC5sbzogY3B1LXJzNjAwMC5jCi1jcHUtc2gubG86IGNwdS1zaC5jCi1jcHUtc3BhcmMubG86IGNwdS1zcGFyYy5jCi1jcHUtdGljMzAubG86IGNwdS10aWMzMC5jCi1jcHUtdGljODAubG86IGNwdS10aWM4MC5jCi1jcHUtdjg1MC5sbzogY3B1LXY4NTAuYwotY3B1LXZheC5sbzogY3B1LXZheC5jCi1jcHUtd2UzMmsubG86IGNwdS13ZTMyay5jCi1jcHUtdzY1LmxvOiBjcHUtdzY1LmMKLWNwdS16OGsubG86IGNwdS16OGsuYwotYW91dC1hZG9iZS5sbzogYW91dC1hZG9iZS5jICQoSU5DRElSKS9hb3V0L2Fkb2JlLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtYXJtLmxvOiBhb3V0LWFybS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dHguaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0LW5zMzJrLmxvOiBhb3V0LW5zMzJrLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBuczMyay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LXNwYXJjbGUubG86IGFvdXQtc3BhcmNsZS5jICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotYW91dC10aWMzMC5sbzogYW91dC10aWMzMC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dHguaAotYW91dDAubG86IGFvdXQwLmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dDMyLmxvOiBhb3V0MzIuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWFybW5ldGJzZC5sbzogYXJtbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ib3V0LmxvOiBib3V0LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggJChJTkNESVIpL2JvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oCi1jZi1pMzg2bHlueC5sbzogY2YtaTM4Nmx5bnguYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1tNjhrbHlueC5sbzogY2YtbTY4a2x5bnguYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1zcGFyY2x5bngubG86IGNmLXNwYXJjbHlueC5jIGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hMjlrLmxvOiBjb2ZmLWEyOWsuYyAkKElOQ0RJUikvY29mZi9hMjlrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcG9sbG8ubG86IGNvZmYtYXBvbGxvLmMgJChJTkNESVIpL2NvZmYvYXBvbGxvLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWFybS5sbzogY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWF1eC5sbzogY29mZi1hdXguYyAkKElOQ0RJUikvY29mZi9hdXgtY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9tNjhrLmggY29mZi1tNjhrLmMgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDgzMDAubG86IGNvZmYtaDgzMDAuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDg1MDAubG86IGNvZmYtaDg1MDAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTM4Ni5sbzogY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTg2MC5sbzogY29mZi1pODYwLmMgJChJTkNESVIpL2NvZmYvaTg2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtZ28zMi5sbzogY29mZi1nbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pOTYwLmxvOiBjb2ZmLWk5NjAuYyAkKElOQ0RJUikvY29mZi9pOTYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1tNjhrLmxvOiBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1tODhrLmxvOiBjb2ZmLW04OGsuYyAkKElOQ0RJUikvY29mZi9tODhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1taXBzLmxvOiBjb2ZmLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9taXBzLmggbGliY29mZi5oIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBcCi0gIGVjb2Zmc3dhcC5oCi1jb2ZmLXBtYWMubG86IGNvZmYtcG1hYy5jIGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXJzNjAwMC5sbzogY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc2gubG86IGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3BhcmMubG86IGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zdGdvMzIubG86IGNvZmYtc3RnbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9nbzMyZXhlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAotICBnbzMyc3R1Yi5oCi1jb2ZmLXN2bTY4ay5sbzogY29mZi1zdm02OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzMwLmxvOiBjb2ZmLXRpYzMwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzgwLmxvOiBjb2ZmLXRpYzgwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXU2OGsubG86IGNvZmYtdTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtd2UzMmsubG86IGNvZmYtd2UzMmsuYyAkKElOQ0RJUikvY29mZi93ZTMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13NjUubG86IGNvZmYtdzY1LmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi93NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi16OGsubG86IGNvZmYtejhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi96OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZmxpbmsubG86IGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oCi1kd2FyZjEubG86IGR3YXJmMS5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYuaAotZHdhcmYyLmxvOiBkd2FyZjIuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5sbzogZWNvZmYuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FyLmggXAotICAkKElOQ0RJUikvYW91dC9yYW5saWIuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWNvZmZsaW5rLmxvOiBlY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYmphbGxvYy5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVsZi5sbzogZWxmLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVsZjMyLWFyYy5sbzogZWxmMzItYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jICQoSU5DRElSKS9lbGYvYXJtLW9hYmkuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi1hcm0uaCBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItYXJtLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZDEwdi5sbzogZWxmMzItZDEwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQzMHYubG86IGVsZjMyLWQzMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1mcjMwLmxvOiBlbGYzMi1mcjMwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2ZyMzAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1nZW4ubG86IGVsZjMyLWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWhwcGEubG86IGVsZjMyLWhwcGEuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggbGliaHBwYS5oIFwKLSAgZWxmMzItaHBwYS5oIGVsZi1ocHBhLmggaHBwYV9zdHVicy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pMzg2LmxvOiBlbGYzMi1pMzg2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pODYwLmxvOiBlbGYzMi1pODYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItaTk2MC5sbzogZWxmMzItaTk2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9pOTYwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTMyci5sbzogZWxmMzItbTMyci5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTY4ay5sbzogZWxmMzItbTY4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTg4ay5sbzogZWxmMzItbTg4ay5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAyMDAubG86IGVsZi1tMTAyMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMzAwLmxvOiBlbGYtbTEwMzAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1jb3JlLmxvOiBlbGYzMi1tY29yZS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbWlwcy5sbzogZWxmMzItbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wai5sbzogZWxmMzItcGouYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvcGouaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wcGMubG86IGVsZjMyLXBwYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zaC5sbzogZWxmMzItc2guYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLmxvOiBlbGYzMi5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLWVsZmxpbmsubG86IGVsZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZXBvYy1wZS1hcm0ubG86IGVwb2MtcGUtYXJtLmMgcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1lcG9jLXBlaS1hcm0ubG86IGVwb2MtcGVpLWFybS5jIHBlaS1hcm0uYyBjb2ZmLWFybS5jIFwKLSAgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggXAotICBsaWJwZWkuaAotaHAzMDBic2QubG86IGhwMzAwYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ocDMwMGhwdXgubG86IGhwMzAwaHB1eC5jICQoSU5DRElSKS9hb3V0L2hwMzAwaHB1eC5oIFwKLSAgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLXNvbS5sbzogc29tLmMKLWkzODZhb3V0LmxvOiBpMzg2YW91dC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmJzZC5sbzogaTM4NmJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmR5bml4LmxvOiBpMzg2ZHluaXguYyAkKElOQ0RJUikvYW91dC9keW5peDMuaCBhb3V0eC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1pMzg2ZnJlZWJzZC5sbzogaTM4NmZyZWVic2QuYyBmcmVlYnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bGludXgubG86IGkzODZsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotaTM4Nmx5bngubG86IGkzODZseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bXNkb3MubG86IGkzODZtc2Rvcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1pMzg2bmV0YnNkLmxvOiBpMzg2bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bWFjaDMubG86IGkzODZtYWNoMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotaTM4Nm9zOWsubG86IGkzODZvczlrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvb3M5ay5oCi1pZWVlLmxvOiBpZWVlLmMgJChJTkNESVIpL2llZWUuaCBsaWJpZWVlLmgKLW02OGs0a25ldGJzZC5sbzogbTY4azRrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbGludXgubG86IG02OGtsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbTY4a2x5bngubG86IG02OGtseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbmV0YnNkLmxvOiBtNjhrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tODhrbWFjaDMubG86IG04OGttYWNoMy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbWlwc2JzZC5sbzogbWlwc2JzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbmV3c29zMy5sbzogbmV3c29zMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbmxtLmxvOiBubG0uYyBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotbmxtMzItaTM4Ni5sbzogbmxtMzItaTM4Ni5jICQoSU5DRElSKS9ubG0vaTM4Ni1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXNwYXJjLmxvOiBubG0zMi1zcGFyYy5jICQoSU5DRElSKS9ubG0vc3BhcmMzMi1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXBwYy5sbzogbmxtMzItcHBjLmMgJChJTkNESVIpL25sbS9wcGMtZXh0LmggbGlibmxtLmggXAotICAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggXAotICBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi5sbzogbmxtMzIuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5zMzJrbmV0YnNkLmxvOiBuczMya25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotb2FzeXMubG86IG9hc3lzLmMgJChJTkNESVIpL29hc3lzLmggbGlib2FzeXMuaAotcGM1MzItbWFjaC5sbzogcGM1MzItbWFjaC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotcGUtYXJtLmxvOiBwZS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1hcm0ubG86IHBlaS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLWkzODYubG86IHBlLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLWkzODYubG86IHBlaS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLW1jb3JlLmxvOiBwZS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1tY29yZS5sbzogcGVpLW1jb3JlLmMgY29mZi1tY29yZS5jICQoSU5DRElSKS9jb2ZmL21jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGUtcHBjLmxvOiBwZS1wcGMuYyBjb2ZmLXBwYy5jICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktcHBjLmxvOiBwZWktcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpZ2VuLmxvOiBwZWlnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggbGlicGVpLmgKLXBwY2Jvb3QubG86IHBwY2Jvb3QuYwotcmVsb2MxNi5sbzogcmVsb2MxNi5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmgKLXJpc2NpeC5sbzogcmlzY2l4LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1zcGFyY2xpbnV4LmxvOiBzcGFyY2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1zcGFyY2x5bngubG86IHNwYXJjbHlueC5jICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXNwYXJjbmV0YnNkLmxvOiBzcGFyY25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotc3Vub3MubG86IHN1bm9zLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggYW91dGYxLmggXAotICAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotdmF4bmV0YnNkLmxvOiB2YXhuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXZlcnNhZG9zLmxvOiB2ZXJzYWRvcy5jICQoSU5DRElSKS9saWJpYmVydHkuaAotdm1zLmxvOiB2bXMuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtZ3NkLmxvOiB2bXMtZ3NkLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWhkci5sbzogdm1zLWhkci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1taXNjLmxvOiB2bXMtbWlzYy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy10aXIubG86IHZtcy10aXIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi14Y29mZmxpbmsubG86IHhjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotYW91dDY0LmxvOiBhb3V0NjQuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWNvZmYtYWxwaGEubG86IGNvZmYtYWxwaGEuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCBjb2Zmc3dhcC5oIGVjb2Zmc3dhcC5oCi1kZW1vNjQubG86IGRlbW82NC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotZWxmNjQtYWxwaGEubG86IGVsZjY0LWFscGhhLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmggZWNvZmZzd2FwLmggZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LWdlbi5sbzogZWxmNjQtZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtbWlwcy5sbzogZWxmNjQtbWlwcy5jICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1zcGFyYy5sbzogZWxmNjQtc3BhcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LmxvOiBlbGY2NC5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLW5sbTMyLWFscGhhLmxvOiBubG0zMi1hbHBoYS5jICQoSU5DRElSKS9ubG0vYWxwaGEtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG02NC5sbzogbmxtNjQuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLWFpeDM4Ni1jb3JlLmxvOiBhaXgzODYtY29yZS5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWhwdXgtY29yZS5sbzogaHB1eC1jb3JlLmMKLWlyaXgtY29yZS5sbzogaXJpeC1jb3JlLmMKLWx5bngtY29yZS5sbzogbHlueC1jb3JlLmMKLW9zZi1jb3JlLmxvOiBvc2YtY29yZS5jCi1zY281LWNvcmUubG86IHNjbzUtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi10cmFkLWNvcmUubG86IHRyYWQtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgaG9zdHMvaTM4NmxpbnV4LmgKLWNpc2NvLWNvcmUubG86IGNpc2NvLWNvcmUuYwotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JmZC9QT1JUSU5HIGIvYmZkL1BPUlRJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmZkNzcuLjAwMDAwMDAKLS0tIGEvYmZkL1BPUlRJTkcKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0JUHJlbGltaW5hcnkgTm90ZXMgb24gUG9ydGluZyBCRkQKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgJ2hvc3QnIGlzIHRoZSBzeXN0ZW0gYSB0b29sIHJ1bnMgKm9uKi4KLVRoZSAndGFyZ2V0JyBpcyB0aGUgc3lzdGVtIGEgdG9vbCBydW5zICpmb3IqLCBpLmUuCi1hIHRvb2wgY2FuIHJlYWQvd3JpdGUgdGhlIGJpbmFyaWVzIG9mIHRoZSB0YXJnZXQuCi0KLVBvcnRpbmcgdG8gYSBuZXcgaG9zdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QaWNrIGEgbmFtZSBmb3IgeW91ciBob3N0LiBDYWxsIHRoYXQgPGhvc3Q+LgotKDxob3N0PiBtaWdodCBiZSBzdW40LCAuLi4pCi1DcmVhdGUgYSBmaWxlIGhvc3RzLzxob3N0Pi5taC4KLQotUG9ydGluZyB0byBhIG5ldyB0YXJnZXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QaWNrIGEgbmFtZSBmb3IgeW91ciB0YXJnZXQuIENhbGwgdGhhdCA8dGFyZ2V0Pi4KLUNhbGwgdGhlIG5hbWUgZm9yIHlvdXIgQ1BVIGFyY2hpdGVjdHVyZSA8Y3B1Pi4KLVlvdSBuZWVkIHRvIGNyZWF0ZSA8dGFyZ2V0Pi5jIGFuZCBjb25maWcvPHRhcmdldD4ubXQsCi1hbmQgYWRkIGEgY2FzZSBmb3IgaXQgdG8gYSBjYXNlIHN0YXRlbWVudHMgaW4gYmZkL2NvbmZpZ3VyZS5ob3N0IGFuZAotYmZkL2NvbmZpZy5iZmQsIHdoaWNoIGFzc29jaWF0ZXMgZWFjaCBjYW5vbmljYWwgaG9zdCB0eXBlIHdpdGggYSBCRkQKLWhvc3QgdHlwZSAodXNlZCBhcyB0aGUgYmFzZSBvZiB0aGUgbWFrZWZpbGUgZnJhZ21lbnQgbmFtZXMpLCBhbmQgdG8gdGhlCi10YWJsZSBpbiBiZmQvY29uZmlndXJlLmluIHdoaWNoIGFzc29jaWF0ZXMgZWFjaCB0YXJnZXQgdmVjdG9yIHdpdGgKLXRoZSAubyBmaWxlcyBpdCB1c2VzLgotCi1jb25maWcvPHRhcmdldD4ubXQgaXMgYSBNYWtlZmlsZSBmcmFnbWVudC4KLVRoZSBmb2xsb3dpbmcgaXMgdXN1YWxseSBlbm91Z2g6Ci1ERUZBVUxUX1ZFQ1RPUj08dGFyZ2V0Pl92ZWMKLVNFTEVDVF9BUkNISVRFQ1RVUkVTPWJmZF88Y3B1Pl9hcmNoCi0KLVNlZSB0aGUgbGlzdCBvZiBjcHUgdHlwZXMgaW4gYXJjaHVyZXMuYywgb3IgImxzIGNwdS0qLmMiLgotSWYgeW91ciBhcmNoaXRlY3R1cmUgaXMgbmV3LCB5b3UgbmVlZCB0byBhZGQgaXQgdG8gdGhlIHRhYmxlcwotaW4gYmZkL2FyY2h1cmVzLmMsIG9wY29kZXMvY29uZmlndXJlLmluLCBhbmQgYmludXRpbHMvb2JqZHVtcC5jLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCAubXQgYW5kIC5taCBmaWxlcywgc2VlIGNvbmZpZy9SRUFETUUuCi0KLVRoZSBmaWxlIDx0YXJnZXQ+LmMgaXMgdGhlIGhhcmQgcGFydC4gIEl0IGltcGxlbWVudHMgdGhlCi1iZmRfdGFyZ2V0IDx0YXJnZXQ+X3ZlYywgd2hpY2ggaW5jbHVkZXMgcG9pbnRlcnMgdG8KLWZ1bmN0aW9ucyB0aGF0IGRvIHRoZSBhY3R1YWwgPHRhcmdldD4tc3BlY2lmaWMgbWV0aG9kcy4KLQotUG9ydGluZyB0byBhIDx0YXJnZXQ+IHRoYXQgdXNlcyB0aGUgYS5vdXQgYmluYXJ5IGZvcm1hdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JbiB0aGlzIGNhc2UsIHRoZSBpbmNsdWRlIGZpbGUgYW91dC10YXJnZXQuaCBwcm9iYWJ5IGRvZXMgbW9zdAotb2Ygd2hhdCB5b3UgbmVlZC4gVGhlIHByb2dyYW0gZ2VuLWFvdXQgZ2VuZXJhdGVzIDx0YXJnZXQ+LmMgZm9yCi15b3UgYXV0b21hdGljYWxseSBmb3IgbWFueSBhLm91dCBzeXN0ZW1zLiAgRG86Ci0JbWFrZSBnZW4tYW91dAotCS4vZ2VuLWFvdXQgPHRhcmdldD4gPiA8dGFyZ2V0Pi5jCi0oVGhpcyBvbmx5IHdvcmtzIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gdGhlIHRhcmdldCAoIm5hdGl2ZSIpLgotSWYgeW91IG11c3QgbWFrZSBhIGNyb3NzLXBvcnQgZnJvbSBzY3JhdGNoLCBjb3B5IHRoZSBtb3N0Ci1zaW1pbGFyIGV4aXN0aW5nIGZpbGUgdGhhdCBpbmNsdWRlcyBhb3V0LXRhcmdldC5oLCBhbmQgZml4IHdoYXQgaXMgd3JvbmcuKQotCi1DaGVjayB0aGUgcGFyYW1ldGVycyBpbiA8dGFyZ2V0Pi5jLCBhbmQgZml4IGFueXRoaW5nIHRoYXQgaXMgd3JvbmcuCi0oQWxzbyBsZXQgdXMga25vdyBhYm91dCBpdDsgcGVyaGFwcyB3ZSBjYW4gaW1wcm92ZSBnZW4tYW91dC5jLikKLQotVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCVNob3VsZCBiZSBkZWZpbmVkIGlmIDx0YXJnZXQ+IGlzIGJpZy1lbmRpYW4uCi0KLU5fSEVBREVSX0lOX1RFWFQoeCkKLQlTZWUgZGlzY3Vzc2lvbiBpbiAuLi9pbmNsdWRlL2FvdXQvYW91dDY0LmguCi0KLUJZVEVTX0lOX1dPUkQKLQlOdW1iZXIgb2YgYnl0ZXMgcGVyIHdvcmQuIChVc3VhbGx5IDQgYnV0IGNhbiBiZSA4LikKLQotQVJDSAotCU51bWJlciBvZiBiaXRzIHBlciB3b3JkLiAgKFVzdWFsbHkgMzIsIGJ1dCBjYW4gYmUgNjQuKQotCi1FTlRSWV9DQU5fQkVfWkVSTwotCURlZmluZSBpZiB0aGUgZXh0cnkgcG9pbnQgKHN0YXJ0IGFkZHJlc3Mgb2YgYW4KLQlleGVjdXRhYmxlIHByb2dyYW0pIGNhbiBiZSAweDAuCi0KLVRFWFRfU1RBUlRfQUREUgotCVRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWdlbW50IGluCi0JdmlydHVhbCBtZW1vcnkuICBOb3JtYWxseSwgdGhlIHNhbWUgYXMgdGhlIGVudHJ5IHBvaW50LgotCi1UQVJHRVRfUEFHRV9TSVpFCi0KLVNFR01FTlRfU0laRQotICAgICAgICBVc3VhbGx5LCB0aGUgc2FtZSBhcyB0aGUgVEFSR0VUX1BBR0VfU0laRS4KLSAgICAgICAgQWxpZ25tZW50IG5lZWRlZCBmb3IgdGhlIGRhdGEgc2VnbWVudC4KLQotVEFSR0VUTkFNRQotCVRoZSBuYW1lIG9mIHRoZSB0YXJnZXQsIGZvciBydW4tdGltZSBsb29rdXBzLgotCVVzdWFsbHkgImEub3V0LTx0YXJnZXQ+IgpkaWZmIC0tZ2l0IGEvYmZkL1JFQURNRSBiL2JmZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2UxMzMuLjAwMDAwMDAKLS0tIGEvYmZkL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLUJGRCBpcyBhIGFuIG9iamVjdCBmaWxlIGxpYnJhcnkuICBJdCBwZXJtaXRzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCi1zYW1lIHJvdXRpbmVzIHRvIHByb2Nlc3Mgb2JqZWN0IGZpbGVzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgZm9ybWF0LgotCi1CRkQgaXMgdXNlZCBieSB0aGUgR05VIGRlYnVnZ2VyLCBhc3NlbWJsZXIsIGxpbmtlciwgYW5kIHRoZSBiaW5hcnkKLXV0aWxpdGllcy4KLQotVGhlIGRvY3VtZW50YXRpb24gb24gdXNpbmcgQkZEIGlzIHNjYW50eSBhbmQgbWF5IGJlIG9jY2FzaW9uYWxseQotaW5jb3JyZWN0LiAgUG9pbnRlcnMgdG8gZG9jdW1lbnRhdGlvbiBwcm9ibGVtcywgb3IgYW4gZW50aXJlbHkKLXJld3JpdHRlbiBtYW51YWwsIHdvdWxkIGJlIGFwcHJlY2lhdGVkLgotCi1UaGVyZSBpcyBzb21lIEJGRCBpbnRlcm5hbHMgZG9jdW1lbnRhdGlvbiBpbiBkb2MvYmZkaW50LnRleGkgd2hpY2ggbWF5Ci1oZWxwIHByb2dyYW1tZXJzIHdobyB3YW50IHRvIG1vZGlmeSBCRkQuCi0KLUJGRCBpcyBub3JtYWxseSBidWlsdCBhcyBwYXJ0IG9mIGFub3RoZXIgcGFja2FnZS4gIFNlZSB0aGUgYnVpbGQKLWluc3RydWN0aW9ucyBmb3IgdGhhdCBwYWNrYWdlLCBwcm9iYWJseSBpbiBhIFJFQURNRSBmaWxlIGluIHRoZQotYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1CRkQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb25maWd1cmUgb3B0aW9uczoKLQotICAtLXRhcmdldD1UQVJHRVQKLQlUaGUgZGVmYXVsdCB0YXJnZXQgZm9yIHdoaWNoIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiAgVEFSR0VUIGlzCi0JYSBjb25maWd1cmF0aW9uIHRhcmdldCB0cmlwbGV0LCBzdWNoIGFzIHNwYXJjLXN1bi1zb2xhcmlzLgotICAtLWVuYWJsZS10YXJnZXRzPVRBUkdFVCxUQVJHRVQsVEFSR0VULi4uCi0JQWRkaXRpb25hbCB0YXJnZXRzIHRoZSBsaWJyYXJ5IHNob3VsZCBzdXBwb3J0LiAgVG8gaW5jbHVkZQotCXN1cHBvcnQgZm9yIGFsbCBrbm93biB0YXJnZXRzLCB1c2UgLS1lbmFibGUtdGFyZ2V0cz1hbGwuCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQKLQlJbmNsdWRlIHN1cHBvcnQgZm9yIDY0IGJpdCB0YXJnZXRzLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5Ci0JdHVybmVkIG9uIGlmIHlvdSBleHBsaWNpdGx5IHJlcXVlc3QgYSA2NCBiaXQgdGFyZ2V0LCBidXQgbm90Ci0JZm9yIC0tZW5hYmxlLXRhcmdldHM9YWxsLiAgVGhpcyByZXF1aXJlcyBhIGNvbXBpbGVyIHdpdGggYSA2NAotCWJpdCBpbnRlZ2VyIHR5cGUsIHN1Y2ggYXMgZ2NjLgotICAtLWVuYWJsZS1zaGFyZWQKLQlCdWlsZCBCRkQgYXMgYSBzaGFyZWQgbGlicmFyeS4KLSAgLS13aXRoLW1tYXAKLQlVc2UgbW1hcCB3aGVuIGFjY2Vzc2luZyBmaWxlcy4gIFRoaXMgaXMgZmFzdGVyIG9uIHNvbWUgaG9zdHMsCi0JYnV0IHNsb3dlciBvbiBvdGhlcnMuICBJdCBtYXkgbm90IHdvcmsgb24gYWxsIGhvc3RzLgotCi1SZXBvcnQgYnVncyB3aXRoIEJGRCB0byBidWctZ251LXV0aWxzQGdudS5vcmcuCi0KLVBhdGNoZXMgYXJlIGVuY291cmFnZWQuICBXaGVuIHNlbmRpbmcgcGF0Y2hlcywgYWx3YXlzIHNlbmQgdGhlIG91dHB1dAotb2YgZGlmZiAtdSBvciBkaWZmIC1jIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgRG8gbm90Ci1zZW5kIGRlZmF1bHQgZGlmZiBvdXRwdXQuICBEbyBub3QgbWFrZSB0aGUgZGlmZiBmcm9tIHRoZSBuZXcgZmlsZSB0bwotdGhlIG9yaWdpbmFsIGZpbGUuICBSZW1lbWJlciB0aGF0IGFueSBwYXRjaCBtdXN0IG5vdCBicmVhayBvdGhlcgotc3lzdGVtcy4gIFJlbWVtYmVyIHRoYXQgQkZEIG11c3Qgc3VwcG9ydCBjcm9zcyBjb21waWxhdGlvbiBmcm9tIGFueQotaG9zdCB0byBhbnkgdGFyZ2V0LCBzbyBwYXRjaGVzIHdoaWNoIHVzZSBgYCNpZmRlZiBIT1NUJycgYXJlIG5vdAotYWNjZXB0YWJsZS4gIFBsZWFzZSBhbHNvIHJlYWQgdGhlIGBgUmVwb3J0aW5nIEJ1Z3MnJyBzZWN0aW9uIG9mIHRoZQotZ2NjIG1hbnVhbC4KLQotQnVnIHJlcG9ydHMgd2l0aG91dCBwYXRjaGVzIHdpbGwgYmUgcmVtZW1iZXJlZCwgYnV0IHRoZXkgbWF5IG5ldmVyIGdldAotZml4ZWQgdW50aWwgc29tZWJvZHkgdm9sdW50ZWVycyB0byBmaXggdGhlbS4KZGlmZiAtLWdpdCBhL2JmZC9UT0RPIGIvYmZkL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTI3MzUuLjAwMDAwMDAKLS0tIGEvYmZkL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1UaGluZ3MgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGRvbmU6IC0qLSBUZXh0IC0qLQotCi0gbyAtIEEgc291cmNlIG9mIHNwYWNlIGxvc3NhZ2UgaXMgdGhhdCBhbGwgdGhlIHRhcmdldC1kZXBlbmRlbnQgY29kZQotICAgICBpcyBpbiBhIHNpbmdsZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gIEhlbmNlIGFsbCB0aGUgY29kZSBmb3IKLSAgICAgKndyaXRpbmcqIG9iamVjdCBmaWxlcyBpcyBzdGlsbCBwdWxsZWQgaW50byBhbGwgdGhlIGFwcGxpY2F0aW9ucwotICAgICB0aGF0IG9ubHkgY2FyZSBhYm91dCAqcmVhZGluZyogKGdkYiwgbm0sIG9iamR1bXApLCB3aGlsZSBnYXMgaGFzCi0gICAgIHRvIGNhcnJ5IGFsb25nIGFsbCB0aGUgdW5uZWVkZWQgYmFnZ2FnZSBmb3IgcmVhZGluZyBvYmplY3RzLiAgQW5kCi0gICAgIHNvIG9uLiAgVGhpcyB3b3VsZCBiZSBhIHN1YnN0YW50aWFsIGNoYW5nZSwgYW5kIHRoZSBwYXlvZmYgd291bGQKLSAgICAgbm90IGFsbCB0aGF0IGdyZWF0IChlc3NlbnRpYWxseSBub25lIGlmIGJmZCBpcyB1c2VkIGFzIGEgc2hhcmVkCi0gICAgIGxpYnJhcnkpLgotCi0gbyAtIFRoZSBzdG9yYWdlIG5lZWRlZCBieSBCRkQgZGF0YSBzdHJ1Y3R1cmVzIGlzIGFsc28gbGFyZ2VyIHRoYW4gc3RyaWN0bHkKLSAgICAgbmVlZGVkLiAgVGhpcyBtYXkgYmUgZGlmZmljdWx0IHRvIGRvIG11Y2ggYWJvdXQuCi0KLSBvIC0gaW1wbGVtZW50IGJmZF9hYm9ydCwgd2hpY2ggc2hvdWxkIGNsb3NlIHRoZSBiZmQgYnV0IG5vdCBhbHRlciB0aGUKLSAgICAgZmlsZXN5c3RlbS4KLQotIG8gLSB1cGRhdGUgdGhlIGJmZCBkb2M7IHdyaXRlIGEgaG93LXRvLXdyaXRlLWEtYmFja2VuZCBkb2MsIHRha2Ugb3V0Ci0gICAgIHRoZSBzdHVwaWQgcXVpcHMgYW5kIGZpbGwgaW4gYWxsIHRoZSBibGFua3MuCi0KLSBvIC0gdXBncmFkZSB0aGUgcmVsb2MgaGFuZGxpbmcgYXMgcGVyIFN0ZXZlJ3Mgc3VnZ2VzdGlvbi4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL2FjaW5jbHVkZS5tNCBiL2JmZC9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzI2ZTguLjAwMDAwMDAKLS0tIGEvYmZkL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgotQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW3JtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ub10pCi0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi1BQ19TVUJTVChFWEVFWFRfRk9SX0JVSUxEKV0pZG5sCi0KLWRubCBTZWUgd2hldGhlciB3ZSBuZWVkIGEgZGVjbGFyYXRpb24gZm9yIGEgZnVuY3Rpb24uCi1BQ19ERUZVTihCRkRfTkVFRF9ERUNMQVJBVElPTiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJDEgbXVzdCBiZSBkZWNsYXJlZF0pCi1BQ19DQUNIRV9WQUwoYmZkX2N2X2RlY2xfbmVlZGVkXyQxLAotW0FDX1RSWV9DT01QSUxFKFsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZl0sCi1bY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgJDFdLAotYmZkX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBiZmRfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKV0pCi1BQ19NU0dfUkVTVUxUKCRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEpCi1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGEgdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSkKLV0pCi0KLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbWVtYmVyICQyIGluIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEuJDIgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLiQyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKVtfXXRyYW5zbGl0KCQyLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuJDIuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIpCi1dKQotCi0KZGlmZiAtLWdpdCBhL2JmZC9hY2xvY2FsLm00IGIvYmZkL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYWVmN2MuLjAwMDAwMDAKLS0tIGEvYmZkL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE3ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgotQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW3JtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ub10pCi0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi1BQ19TVUJTVChFWEVFWFRfRk9SX0JVSUxEKV0pZG5sCi0KLWRubCBTZWUgd2hldGhlciB3ZSBuZWVkIGEgZGVjbGFyYXRpb24gZm9yIGEgZnVuY3Rpb24uCi1BQ19ERUZVTihCRkRfTkVFRF9ERUNMQVJBVElPTiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJDEgbXVzdCBiZSBkZWNsYXJlZF0pCi1BQ19DQUNIRV9WQUwoYmZkX2N2X2RlY2xfbmVlZGVkXyQxLAotW0FDX1RSWV9DT01QSUxFKFsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZl0sCi1bY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgJDFdLAotYmZkX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBiZmRfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKV0pCi1BQ19NU0dfUkVTVUxUKCRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEpCi1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGEgdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSkKLV0pCi0KLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbWVtYmVyICQyIGluIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEuJDIgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLiQyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKVtfXXRyYW5zbGl0KCQyLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuJDIuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIpCi1dKQotCi0KLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCi0jIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KLSMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgc2VyaWFsIDEKLQotZG5sIFVzYWdlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKLQotQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotUEFDS0FHRT1bJDFdCi1BQ19TVUJTVChQQUNLQUdFKQotVkVSU0lPTj1bJDJdCi1BQ19TVUJTVChWRVJTSU9OKQotZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLWlmZWxzZShbJDNdLCwKLUFDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLUFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKLWRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KLSMKLQotQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCi1kbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgotQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAotW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICQxPSQyCi0gICBBQ19NU0dfUkVTVUxUKGZvdW5kKQotZWxzZQotICAgJDE9IiQzL21pc3NpbmcgJDIiCi0gICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCi1maQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIHNlcmlhbCAzNSBBQ19QUk9HX0xJQlRPT0wKLUFDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKLVtBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1BQ19DQUNIRV9TQVZFCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCi0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICBBQ19TWVNfTElCVE9PTF9DWUdXSU4KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCi1bICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmddLAotbmVlZF9sb2Nrcz0kZW5hYmxldmFsLAotbmVlZF9sb2Nrcz15ZXMpCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGNoZWNrIGZvciBkbG9wZW4gc3VwcG9ydAotQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtsdF9kbG9wZW49eWVzXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELAotW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELAotW0FDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLAotW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHN0YXRpYywKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLAotW0FDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsCi1bZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKLUFDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLAotW0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKEFDX1BST0dfTEQsCi1bQUNfQVJHX1dJVEgoZ251LWxkLAotWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCi10ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotY2hhbmdlcXVvdGUoLClkbmwKLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfU1VCU1QoTEQpCi1BQ19QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFDX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1BQ19NU0dfUkVTVUxUKFskTk1dKQotQUNfU1VCU1QoTk0pCi1dKQotCi0jIEFDX1NZU19OTV9QQVJTRSAtIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZAotIyBieSBDIHN5bWJvbCBuYW1lIGZyb20gbm0uCi1BQ19ERUZVTihBQ19TWVNfTk1fUEFSU0UsCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUsCi1bIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi1jaGFuZ2VxdW90ZSgsKWRubAotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJGFjX3N5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1jaGFuZ2VxdW90ZSgsKWRubAotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotCSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotXSkKLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1BQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCi1dKQotCi0jIEFDX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgotQUNfREVGVU4oQUNfU1lTX0xJQlRPT0xfQ1lHV0lOLAotW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi1BQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi1dKQotCi0jIEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSAtIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIHVuZGVyc2NvcmU/Ci1BQ19ERUZVTihBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAotW2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi1maQotcm0gLXJmIGNvbmZ0ZXN0KgotXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSkKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLUFDX1NVQlNUKFVTRV9TWU1CT0xfVU5ERVJTQ09SRSlkbmwKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sIFsKLUFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wpCi1BQ19DSEVDS19MSUIobSwgY29zKQotXSkKLQotIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi1BQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLV0pCi0KLSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCi1BQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLCBMSUJMVERMPSItbGx0ZGwiLCBbCi0gICAgY2FzZSAiJGVuYWJsZV9sdGRsX2luc3RhbGwiIGluCi0gICAgbm8pIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKSA7OwotICAgICIiKSBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIgOzsKLSAgICBlc2FjCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geCJubyI7IHRoZW4KLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotQUNfREVGVU4oQU1fU1lTX05NX1BBUlNFLCBbaW5kaXIoW0FDX1NZU19OTV9QQVJTRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwgW2luZGlyKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sIFtpbmRpcihbQUNfU1lTX0xJQlRPT0xfQ1lHV0lOXSldKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCmRpZmYgLS1naXQgYS9iZmQvYWl4Mzg2LWNvcmUuYyBiL2JmZC9haXgzODYtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY3YjE3Li4wMDAwMDAwCi0tLSBhL2JmZC9haXgzODYtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQUlYIG9uIFBTLzIgY29yZSBmaWxlcy4KLSAgIFRoaXMgd2FzIGJhc2VkIG9uIHRyYWQtY29yZS5jLCB3aGljaCB3YXMgd3JpdHRlbiBieSBKb2huIEdpbG1vcmUgb2YKLSAgICAgICAgQ3lnbnVzIFN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWluaCBUcmFuLUxlIDxUUkFOTEVASU5URUxMSUNPUlAuQ09NPi4KLSAgIENvbnZlcnRlZCB0byBiYWNrIGVuZCBmb3JtIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaWYgZGVmaW5lZCAoX0FJWCkgJiYgZGVmaW5lZCAoX0kzODYpCi0jZGVmaW5lIE5PQ0hFQ0tTCQkvKiB0aGlzIGlzIGZvciBjb3JlZHVtcC5oICovCi0jZGVmaW5lIF9oX1VTRVIJCQkvKiBhdm9pZCBpbmNsdWRpbmcgdXNlci5oIGZyb20gY29yZWR1bXAuaCAqLwotI2luY2x1ZGUgPHVpbmZvLmg+Ci0jaW5jbHVkZSA8c3lzL2kzODYvY29yZWR1bXAuaD4KLSNlbmRpZiAvKiBfQUlYICYmIF9JMzg2ICovCi0KLS8qIG1heWJlIHRoaXMgY291bGQgd29yayBvbiBzb21lIG90aGVyIGkzODYgYnV0IEkgaGF2ZSBub3QgdHJpZWQgaXQKLSAqIG10cmFubGVAcGFyaXMgLSBUdWUgU2VwIDI0IDEyOjQ5OjM1IDE5OTEKLSAqLwotCi0jaWZuZGVmIENPUl9NQUdJQwotIyBkZWZpbmUgQ09SX01BR0lDICJjb3JlIgotI2VuZGlmCi0KLS8qIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UgcHRyIGlzIHJlYWxseSB2b2lkICogKi8KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSBcCi0gICAgKCgoYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YSkpLT5oZHIpCi0jZGVmaW5lIGNvcmVfc2VjdGlvbihiZmQsbikgXAotICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+c2VjdGlvbnNbbl0pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgXAotICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+cmVnX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnMnNlYyhiZmQpIFwKLSAgICAoKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YSktPnJlZzJfc2VjdGlvbikKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLXN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IHsKLSAgc3RydWN0IGNvcmVoZHIgKmhkcjsJCS8qIGNvcmUgZmlsZSBoZWFkZXIgKi8KLSAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICBhc2VjdGlvbiAqcmVnMl9zZWN0aW9uOwotICBhc2VjdGlvbiAqc2VjdGlvbnNbTUFYX0NPUkVfU0VHU107Ci19OwotCi1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYWl4Mzg2X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBpLG47Ci0gIHVuc2lnbmVkIGNoYXIgbG9uZ2J1Zls0XTsJLyogUmF3IGJ5dGVzIG9mIHZhcmlvdXMgaGVhZGVyIGZpZWxkcyAqLwotICBpbnQgY29yZV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgY29yZWhkcik7Ci0gIHN0cnVjdCBjb3JlaGRyICpjb3JlOwotICBzdHJ1Y3QgbWVyZ2VtIHsKLSAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCBjb3JlZGF0YTsKLSAgICBzdHJ1Y3QgY29yZWhkciBpbnRlcm5hbF9jb3JlOwotICB9ICptZXJnZW07Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKWxvbmdidWYsIDEsIHNpemVvZiAobG9uZ2J1ZiksIGFiZmQpICE9IHNpemVvZiAobG9uZ2J1ZikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wKGxvbmdidWYsQ09SX01BR0lDLDQpKSByZXR1cm4gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDBMLCBmYWxzZSkgPCAwKSByZXR1cm4gMDsKLQotICBtZXJnZW0gPSAoc3RydWN0IG1lcmdlbSAqKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1lcmdlbSkpOwotICBpZiAobWVyZ2VtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgY29yZSA9ICZtZXJnZW0tPmludGVybmFsX2NvcmU7Ci0KLSAgaWYgKChiZmRfcmVhZCAoKFBUUikgY29yZSwgMSwgY29yZV9zaXplLCBhYmZkKSkgIT0gY29yZV9zaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc2V0X3RkYXRhIChhYmZkLCAmbWVyZ2VtLT5jb3JlZGF0YSk7Ci0gIGNvcmVfaGRyIChhYmZkKSA9IGNvcmU7Ci0KLSAgLyogY3JlYXRlIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgcmF1bmNoeSwgYnV0IGJmZF9jbG9zZSB3YW50cyB0byByZWNsYWltCi0gICAgIHRoZW0gKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjoKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWcyc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjE6Ci0gICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3JlZ3NlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgZm9yIChpPTAsIG49MCA7IChpIDwgTUFYX0NPUkVfU0VHUykgJiYgKGNvcmUtPmNkX3NlZ3NbaV0uY3NfdHlwZSkgOyBpKyspCi0gICAgewotICAgICAgaWYgKGNvcmUtPmNkX3NlZ3NbaV0uY3Nfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsbikgPQotCShhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gICAgICBpZiAoY29yZV9zZWN0aW9uIChhYmZkLG4pID09IE5VTEwpCi0JewotCSAgaW50IGo7Ci0JICBpZiAobiA+IDApCi0JICAgIHsKLQkgICAgICBmb3IgKGo9MDsgaiA8IG47IGorKykKLQkJYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfc2VjdGlvbihhYmZkLCBqKSk7Ci0JICAgIH0KLQkgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0JICBnb3RvIGxvc2VyMTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoY29yZS0+Y2Rfc2Vnc1tpXS5jc190eXBlKQotCXsKLQljYXNlIENPUl9UWVBFX0RBVEE6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5kYXRhIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19MT0FEICsKLQkJCQkJICAgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX1NUQUNLOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIuc3RhY2siOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0xPQUQgKwotCQkJCQkgICBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfTElCREFUQToKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLmxpYmRhdGEiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX1dSSVRFOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIud3JpdGVhYmxlIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9NU0M6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5taXNjIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLnVua25vd24iOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5fcmF3X3NpemUgPSBjb3JlLT5jZF9zZWdzW2ldLmNzX2xlbjsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPnZtYSAgICAgICA9IGNvcmUtPmNkX3NlZ3NbaV0uY3NfYWRkcmVzczsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZpbGVwb3MgICA9IGNvcmUtPmNkX3NlZ3NbaV0uY3Nfb2Zmc2V0OwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5leHQgICAgICA9IE5VTEw7Ci0gICAgICBpZiAobiA+IDApCi0JY29yZV9zZWN0aW9uIChhYmZkLCAobi0xKSktPm5leHQgPSBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pOwotCi0gICAgICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gKytuOwotICAgIH0KLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPm5hbWUgPSAiLnJlZzIiOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBzaXplb2YoY29yZS0+Y2RfcmVncyk7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZihjb3JlLT5jZF9mcHJlZ3MpOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gLTE7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPnZtYSA9IC0xOwotCi0gIC8qIFdlJ2xsIGFjY2VzcyB0aGUgcmVncyBhZnJlc2ggaW4gdGhlIGNvcmUgZmlsZSwgbGlrZSBhbnkgc2VjdGlvbjogKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKW9mZnNldG9mKHN0cnVjdCBjb3JlaGRyLGNkX3JlZ3NbMF0pOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKW9mZnNldG9mKHN0cnVjdCBjb3JlaGRyLAotCQkJCQkJICAgIGNkX2ZwcmVncyk7Ci0KLSAgLyogYWRkIHRoZSAyIHJlZyBmYWtlIHNlY3Rpb25zIHRvIGFiZmQgKi8KLSAgYWJmZC0+c2VjdGlvbl9jb3VudCArPSAyOwotICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWcyc2VjIChhYmZkKTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfc2VjdGlvbiAoYWJmZCwgMCk7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWFpeDM4Nl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmNkX2NvbW07Ci19Ci0KLXN0YXRpYyBpbnQKLWFpeDM4Nl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+Y2RfY3Vyc2lnOwotfQotCi1zdGF0aWMgYm9vbGVhbgotYWl4Mzg2X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCQkvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzCi0JCQkJICAgcG9pbnQgKi8KLX0KLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoUFJPVE8oYmZkX3ZtYSwgKCopLCAoICAgICAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lIE5PX0dFVFMgKChQUk9UTyhiZmRfc2lnbmVkX3ZtYSwgKCopLCAoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgoUFJPVE8odm9pZCwgICAgICAgICgqKSwgKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgYWl4Mzg2X2NvcmVfdmVjID0KLSAgewotICAgICJhaXgzODYtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5HX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAgICcgJywJCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwgLyogZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULCAvKiBoZHJzICovCi0KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgICBfYmZkX2R1bW15X3RhcmdldCwgYWl4Mzg2X2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF9jcmVhdGVfb2JqZWN0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoYWl4Mzg2KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LWFkb2JlLmMgYi9iZmQvYW91dC1hZG9iZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE2YzdlLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFkb2JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhLm91dC5hZG9iZSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgQmFzZWQgb24gYm91dC5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvYWRvYmUuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYzsJCS8qIEZvcndhcmQgZGVjbCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYW91dF9hZG9iZV9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBzZWN0KSk7Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKLSAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCi0KLXZvaWQgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApKTsKLQkgCi12b2lkCi1hb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZSBpbnRvIHRoZQotICAgc3VwcGxpZWQgYnVmZmVyIHJlYWR5IGZvciB3cml0aW5nIHRvIGRpc2suICAqLwotCi1QUk9UTyh2b2lkLCBhb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfb3V0LAotCSAgKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsCi0JICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotdm9pZAotYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8gICwgYnl0ZXMtPmVfaW5mbyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90ZXh0ICAsIGJ5dGVzLT5lX3RleHQpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZGF0YSAgLCBieXRlcy0+ZV9kYXRhKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2JzcyAgICwgYnl0ZXMtPmVfYnNzKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3N5bXMgICwgYnl0ZXMtPmVfc3ltcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9lbnRyeSAsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Ryc2l6ZSwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1hb3V0X2Fkb2JlX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgY2hhciAqdGFyZzsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLQotICAvKiBOb3JtYWxseSB3ZSBqdXN0IGNvbXBhcmUgZm9yIHRoZSBtYWdpYyBudW1iZXIuCi0gICAgIEhvd2V2ZXIsIGEgYnVuY2ggb2YgQWRvYmUgdG9vbHMgYXJlbid0IGZpeGVkIHVwIHlldDsgdGhleSBnZW5lcmF0ZQotICAgICBmaWxlcyB1c2luZyBaTUFHSUMoISkuCi0gICAgIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHTlVUQVJHRVQgaXMgc2V0IHRvICJhLm91dC5hZG9iZSIsIHdlIHdpbGwKLSAgICAgdGFrZSBqdXN0IGFib3V0IGFueSBhLm91dCBmaWxlIGFzIGFuIEFkb2JlIGEub3V0IGZpbGUuICBGSVhNRSEgICovCi0KLSAgaWYgKE5fQkFETUFHIChhbmV4ZWMpKSB7Ci0gICAgdGFyZyA9IGdldGVudiAoIkdOVVRBUkdFVCIpOwotICAgIGlmICh0YXJnICYmICFzdHJjbXAgKHRhcmcsIGFfb3V0X2Fkb2JlX3ZlYy5uYW1lKSkKLSAgICAgIDsJCS8qIEp1c3QgY29udGludWUgYW55d2F5LCBpZiBzcGVjaWZpY2FsbHkgc2V0IHRvIHRoaXMgZm9ybWF0ICovCi0gICAgZWxzZQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotICB9Ci0KLSAgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCAmZXhlY19ieXRlcywgJmFuZXhlYyk7Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgYW91dF9hZG9iZV9jYWxsYmFjayk7Ci19Ci0KLQotLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQotICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYW91dF9hZG9iZV9jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGFzZWN0aW9uICpzZWN0OwotICBzdHJ1Y3QgZXh0ZXJuYWxfc2VnZGVzYyBleHRbMV07Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciB0cnlfYWdhaW5bMzBdOwkvKiBuYW1lIGFuZCBudW1iZXIgKi8KLSAgY2hhciAqbmV3bmFtZTsKLSAgaW50IHRyeW51bTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgLS0gdW5rbm93biBpbiB0aGlzIGZvcm1hdC4gICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGJmZF9hcmNoX3Vua25vd24sIDApOwotCi0gIC8qIFRoZSBwb3NpdGlvbnMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0KLSAgLyogU3VjayB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlLCBvbmUgc2VjdGlvbiBhdCBhIHRpbWUuICAqLwotCi0gIGZvciAoOzspIHsKLSAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGV4dCwgMSwgc2l6ZW9mICgqZXh0KSwgYWJmZCkgIT0gc2l6ZW9mICgqZXh0KSkgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHN3aXRjaCAoZXh0LT5lX3R5cGVbMF0pIHsKLSAgICBjYXNlIE5fVEVYVDoKLSAgICAgIHNlY3Rpb25fbmFtZSA9ICIudGV4dCI7Ci0gICAgICBmbGFncyA9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHNlY3Rpb25fbmFtZSA9ICIuZGF0YSI7Ci0gICAgICBmbGFncyA9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fQlNTOgotICAgICAgc2VjdGlvbl9uYW1lID0gIi5ic3MiOwotICAgICAgZmxhZ3MgPSBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMDoKLSAgICAgIGdvdG8gbm9fbW9yZV9zZWN0aW9uczsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IFVua25vd24gc2VjdGlvbiB0eXBlIGluIGEub3V0LmFkb2JlIGZpbGU6ICV4XG4iKSwgCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBleHQtPmVfdHlwZVswXSk7Ci0gICAgICBnb3RvIG5vX21vcmVfc2VjdGlvbnM7Ci0gICAgfQotCi0gICAgLyogRmlyc3Qgb25lIGlzIGNhbGxlZCAiLnRleHQiIG9yIHdoYXRldmVyOyBzdWJzZXF1ZW50IG9uZXMgYXJlCi0gICAgICAgIi50ZXh0MSIsICIudGV4dDIiLCAuLi4gKi8KLQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0gICAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb25fbmFtZSk7Ci0gICAgdHJ5bnVtID0gMDsKLSAgICB3aGlsZSAoIXNlY3QpIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19lcnJvcikKLQlyZXR1cm4gMDsJLyogU29tZSBvdGhlciBlcnJvciAtLSBzbGlkZSBpbnRvIHRoZSBzdW5zZXQgKi8KLSAgICAgIHNwcmludGYgKHRyeV9hZ2FpbiwgIiVzJWQiLCBzZWN0aW9uX25hbWUsICsrdHJ5bnVtKTsKLSAgICAgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCB0cnlfYWdhaW4pOwotICAgIH0KLQotICAgIC8qIEZpeCB0aGUgbmFtZSwgaWYgaXQgaXMgYSBzcHJpbnRmJ2QgbmFtZS4gICovCi0gICAgaWYgKHNlY3QtPm5hbWUgPT0gdHJ5X2FnYWluKSB7Ci0gICAgICBuZXduYW1lID0gKGNoYXIgKikgYmZkX3phbGxvYyhhYmZkLCBzdHJsZW4gKHNlY3QtPm5hbWUpKTsKLSAgICAgIGlmIChuZXduYW1lID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIHNlY3QtPm5hbWUpOwotICAgICAgc2VjdC0+bmFtZSA9IG5ld25hbWU7Ci0gICAgfQotCi0gICAgLyogTm93IHNldCB0aGUgc2VjdGlvbidzIGF0dHJpYnV0ZXMuICAqLwotICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdCwgZmxhZ3MpOwotICAgIHNlY3QtPl9yYXdfc2l6ZSA9ICgoZXh0LT5lX3NpemVbMF0gPDwgOCkJLyogQXNzdW1lZCBiaWctZW5kaWFuICovCi0JCSAgICAgIHwgZXh0LT5lX3NpemVbMV0gPDwgOCkKLQkJICAgICAgfCBleHQtPmVfc2l6ZVsyXTsKLSAgICBzZWN0LT5fY29va2VkX3NpemUgPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgc2VjdC0+dm1hID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPmVfdmlydGJhc2UpOwotICAgIHNlY3QtPmZpbGVwb3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+ZV9maWxlYmFzZSk7Ci0gICAgLyogRklYTUUgWFhYIGFsaWdubWVudD8gKi8KLQotICAgIC8qIFNldCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBmaXJzdCBzZWN0aW9uIG9mIGVhY2ggdHlwZS4gICovCi0gICAgaWYgKHRyeW51bSA9PSAwKSBzd2l0Y2ggKGV4dC0+ZV90eXBlWzBdKSB7Ci0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICBzZWN0LT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgICAgIHNlY3QtPnJlbG9jX2NvdW50ID0gZXhlY3AtPmFfdHJzaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHNlY3QtPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGICgqZXhlY3ApOwotICAgICAgc2VjdC0+cmVsb2NfY291bnQgPSBleGVjcC0+YV9kcnNpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLW5vX21vcmVfc2VjdGlvbnM6ICAKLQotICBhZGF0YShhYmZkKS5yZWxvY19lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgYWRhdGEoYWJmZCkuc3ltYm9sX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCB7Ci0gICAgc3RydWN0IGFvdXRkYXRhIGE7Ci0gICAgc3RydWN0IGludGVybmFsX2V4ZWMgZTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBhZGF0YShhYmZkKS5yZWxvY19lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgYWRhdGEoYWJmZCkuc3ltYm9sX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLSAgc3RhdGljIHN0cnVjdCBleHRlcm5hbF9zZWdkZXNjIHNlbnRpbmVsWzFdOwkvKiBJbml0aWFsaXplZCB0byB6ZXJvICovCi0gIGFzZWN0aW9uICpzZWN0OwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gWk1BR0lDOwotCi0gIC8qIENhbGN1bGF0ZSB0ZXh0IHNpemUgYXMgdG90YWwgb2YgdGV4dCBzZWN0aW9ucywgZXRjLiAqLwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gMDsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2RhdGEgPSAwOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzICA9IDA7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSAwOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gMDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJewotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX3RleHQgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSArPSBzZWN0LT5yZWxvY19jb3VudCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCk7Ci0gICAgfSBlbHNlIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplICs9IHNlY3QtPnJlbG9jX2NvdW50ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgICB9IGVsc2UgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0FMTE9DICYmICEoc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkpIHsKLSAgICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICB9Ci0gIH0KLQotICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpCi0gICAgCQkJCSogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIGFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZzd2FwcGVkX2hkciwgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFRleHQgZmlyc3QsIGRhdGEgbmV4dCwgcmVzdAotICAgICBhZnRlcndhcmQuICAqLwotCi0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICBhb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpOwotICAgIH0KLSAgfQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKLSAgICB9Ci0gIH0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgaWYgKCEoc2VjdC0+ZmxhZ3MgJiAoU0VDX0NPREV8U0VDX0RBVEEpKSkgewotICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKLSAgICB9Ci0gIH0KLQotICAvKiBXcml0ZSBmaW5hbCBgc2VudGluZWxgIHNlY3Rpb24gaGVhZGVyICh3aXRoIHR5cGUgb2YgMCkuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzZW50aW5lbCwgMSwgc2l6ZW9mICgqc2VudGluZWwpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mICgqc2VudGluZWwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJewotICAgICAgICAgIGlmICghYW91dF8zMl9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgc2VjdCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICAgICAgaWYgKCFhb3V0XzMyX3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUgWFhYICovCi19Ci0MCi1zdGF0aWMgYm9vbGVhbgotYW91dF9hZG9iZV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBmaWxlX3B0ciBzZWN0aW9uX3N0YXJ0OwotICBzZWNfcHRyIHNlY3Q7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpIHsgLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLQotICAgIC8qIEFzc2lnbiBmaWxlIG9mZnNldHMgdG8gc2VjdGlvbnMuICBUZXh0IHNlY3Rpb25zIGFyZSBmaXJzdCwgYW5kCi0gICAgICAgYXJlIGNvbnRpZ3VvdXMuICBUaGVuIGRhdGEgc2VjdGlvbnMuICBFdmVyeXRoaW5nIGVsc2UgYXQgdGhlIGVuZC4gICovCi0KLSAgICBzZWN0aW9uX3N0YXJ0ID0gTl9UWFRPRkYgKGlnbm9yZTwtLT5tZSk7Ci0KLSAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgICBzZWN0LT5maWxlcG9zID0gc2VjdGlvbl9zdGFydDsKLQkvKiBGSVhNRTogIFJvdW5kIHRvIGFsaWdubWVudCAqLwotCXNlY3Rpb25fc3RhcnQgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUyAmJgotCSAgIShzZWN0LT5mbGFncyAmIChTRUNfQ09ERXxTRUNfREFUQSkpKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogcmVnYXJkbGVzcywgb25jZSB3ZSBrbm93IHdoYXQgd2UncmUgZG9pbmcsIHdlIG1pZ2h0IGFzIHdlbGwgZ2V0IGdvaW5nICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgP3RydWU6ZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24KLSAgICAgIHx8IGFyY2ggPT0gYmZkX2FyY2hfbTY4aykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgCi1hb3V0X2Fkb2JlX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBzaXplb2Yoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLQotCi0vKiBCdWlsZCB0aGUgdHJhbnNmZXIgdmVjdG9yIGZvciBBZG9iZSBBLk91dCBmaWxlcy4gICovCi0KLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2RlZmluZQlhb3V0XzMyX3NldF9hcmNoX21hY2gJCWFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaAotI2RlZmluZQlhb3V0XzMyX3NldF9zZWN0aW9uX2NvbnRlbnRzCWFvdXRfYWRvYmVfc2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZQlhb3V0XzMyX3NpemVvZl9oZWFkZXJzCQlhb3V0X2Fkb2JlX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIGFvdXRfMzJfYmZkX3JlbGF4X3NlY3Rpb24gICAgICAgYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBhb3V0XzMyX2JmZF9nY19zZWN0aW9ucyAgICAgICAgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX2FkZF9zeW1ib2xzCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2ZpbmFsX2xpbmsJCV9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbglfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjID0KLXsKLSAgImEub3V0LmFkb2JlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIHVua25vd24gKGJpZyBhc3N1bWVkKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhkciBieXRlIG9yZGVyIGlzIGJpZyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUICksCi0gIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUkVMT0MpLAotICAnXycsCQkJCS8qICBzeW1ib2wgbGVhZGluZyBjaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBhb3V0X2Fkb2JlX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBhb3V0X2Fkb2JlX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBhb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvYW91dC1hcm0uYyBiL2JmZC9hb3V0LWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzY1ZjlkLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgcmF3IEFSTSBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAoKE5fTUFHSUMoeCkgPT0gTk1BR0lDKSA/IDB4ODAwMCA6IFwKLSAgIChOX01BR0lDKHgpICE9IFpNQUdJQykgPyAwIDogXAotICAgKE5fU0hBUkVEX0xJQih4KSkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgOiBcCi0gICBURVhUX1NUQVJUX0FERFIpCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDB4ODAwMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4ODAwMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfYXJtCi0KLSNkZWZpbmUgTVkoT1ApIENBVChhb3V0YXJtXyxPUCkKLSNkZWZpbmUgTl9CQURNQUcoeCkgKCgoKHgpLmFfaW5mbyAmIH4wMDcyMDApICE9IFpNQUdJQykgJiYgXAotICAgICAgICAgICAgICAgICAgICAgKCgoeCkuYV9pbmZvICYgfjAwNjAwMCkgIT0gT01BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKHgpLmFfaW5mbyAhPSBOTUFHSUMpKQotI2RlZmluZSBOX01BR0lDKHgpICgoeCkuYV9pbmZvICYgfjA3MjAwKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgTVlBUk0oT1ApIENBVChhb3V0YXJtXyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgCSpNWUFSTShiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0JCQkJUEFSQU1TKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiAJCU1ZQVJNKHdyaXRlX29iamVjdF9jb250ZW50cykJUEFSQU1TKChiZmQgKikpOwotCi0vKiBBdm9pZCBtdWx0aXBsZSBkZWZpbmluaXRpb25zIGZyb20gYW91dHggaWYgc3VwcG9ydGluZyBzdGFuZGFyYWQgYS5vdXQgCi0gICBhcyB3ZWxsIGFzIG91ciBvd24uICAqLwotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhhb3V0YXJtLF8zMl8seSkKLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dGFybV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1NWShmaXhfcGNyZWxfMjZfZG9uZSkJUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLU1ZKGZpeF9wY3JlbF8yNikJIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIE1ZKHN3YXBfc3RkX3JlbG9jX2luKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLAotCQkJCQkgICBhcmVsZW50ICosIGFzeW1ib2wgKiosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQgTVkoc3dhcF9zdGRfcmVsb2Nfb3V0KSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCAKLQkJCQkgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOwotCi1yZWxvY19ob3d0b190eXBlIE1ZKGhvd3RvX3RhYmxlKVtdID0KLXsKLSAgLyogdHlwZSBycyBzaXplIGJzeiBwY3JlbCBiaXRwb3Mgb3ZyZiBzZiBuYW1lIHBhcnRfaW5wbCByZWFkbWFzayBzZXRtYXNrCi0gICAgIHBjZG9uZSAqLwotICBIT1dUTyAoMCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsIHRydWUsCi0JIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDIsIDIsIDI2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIE1ZKGZpeF9wY3JlbF8yNiksCi0JICJBUk0yNiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoNCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCB0cnVlLAotCSAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8gKDUsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCB0cnVlLAotCSAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKDYsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKDcsIDIsIDIsIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSBNWShmaXhfcGNyZWxfMjZfZG9uZSksICJBUk0yNkQiLCB0cnVlLCAweDAsIDB4MCwKLQkgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTyAoOSwgMCwgLTEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJORUcxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDEwLCAwLCAtMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIk5FRzMyIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpCi19OwotCi0jZGVmaW5lIFJFTE9DX0FSTV9CSVRTX05FR19CSUcgICAgICAoKHVuc2lnbmVkIGludCkgMHgwOCkKLSNkZWZpbmUgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSAgICgodW5zaWduZWQgaW50KSAweDEwKQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvKShhYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbDsKLSAgICAgaW50ICpyX2luZGV4OwotICAgICBpbnQgKnJfZXh0ZXJuOwotICAgICBpbnQgKnJfcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJfcGNyZWxfZG9uZTsKLSAgdW5zaWduZWQgaW50IHJfbmVnOwotICBpbnQgaW5kZXg7Ci0KLSAgKnJfcGNyZWwgPSAwOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICAqcl9pbmRleCAgICAgPSAgKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLSAgICAgICpyX2V4dGVybiAgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgICAgcl9uZWcgCSAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRykpOwotICAgICAgcl9sZW5ndGggICAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0JCSAgICAgID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyX2luZGV4ICAgICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgfCByZWwtPnJfaW5kZXhbMF0pOwotICAgICAgKnJfZXh0ZXJuICAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0gICAgICByX25lZyAJICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFKSk7Ci0gICAgICByX2xlbmd0aCAgICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLQkJICAgICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotICBpbmRleCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWxfZG9uZSArIDggKiByX25lZzsKLSAgaWYgKGluZGV4ID09IDMpCi0gICAgKnJfcGNyZWwgPSAxOwotCi0gIHJldHVybiBNWShob3d0b190YWJsZSkgKyBpbmRleDsKLX0KLSAKLSNkZWZpbmUgTVlfcmVsb2NfaG93dG8oQkZELCBSRUwsIElOLCBFWCwgUEMpIFwKLQlNWShyZWxvY19ob3d0bykgKEJGRCwgUkVMLCAmSU4sICZFWCwgJlBDKQotCi12b2lkCi1NWShwdXRfcmVsb2MpKGFiZmQsIHJfZXh0ZXJuLCByX2luZGV4LCB2YWx1ZSwgaG93dG8sIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByX2V4dGVybjsKLSAgICAgaW50IHJfaW5kZXg7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnOwotCi0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0KLSAgLyogU3BlY2lhbCBjYXNlIGZvciBicmFuY2ggcmVsb2NhdGlvbnMuICovCi0gIGlmIChob3d0by0+dHlwZSA9PSAzIHx8IGhvd3RvLT50eXBlID09IDcpCi0gICAgcl9sZW5ndGggPSAzOwotCi0gIHJfcGNyZWwgID0gaG93dG8tPnR5cGUgJiA0OyAJLyogUEMgUmVsYXRpdmUgZG9uZT8gKi8KLSAgcl9uZWcgPSBob3d0by0+dHlwZSAmIDg7CS8qIE5lZ2F0aXZlIHJlbG9jYXRpb24gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICByZWxvYy0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICByZWxvYy0+cl90eXBlWzBdID0KLQkoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCSB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHIDogMCkKLQkgfCAocl9uZWcgPwkgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRyA6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICByZWxvYy0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICByZWxvYy0+cl90eXBlWzBdID0KLQkoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQkgfCAocl9uZWcgPwkgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSA6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0gICAgfQotfQotIAotI2RlZmluZSBNWV9wdXRfcmVsb2MoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpIFwKLSAgTVkocHV0X3JlbG9jKShCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykKLQotdm9pZAotTVkocmVsb2NhdGFibGVfcmVsb2MpKGhvd3RvLCBhYmZkLCByZWxvYywgYW1vdW50LCByX2FkZHIpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jOwotICAgICBiZmRfdm1hICphbW91bnQ7Ci0gICAgIGJmZF92bWEgcl9hZGRyOwotewotICBpZiAoaG93dG8tPnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBpZiAocmVsb2MtPnJfdHlwZVswXSAKLQkgICYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkKLQkgICAgID8gUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKQotCXsKLQkgIC8qIFRoZSByZWxvYyBpcyBzdGlsbCBleHRlcm5hbCwgc28gZG9uJ3QgbW9kaWZ5IGFueXRoaW5nLiAqLwotCSAgKmFtb3VudCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICphbW91bnQgLT0gcl9hZGRyOwotCSAgLyogQ2hhbmdlIHRoZSByX3BjcmVsIHZhbHVlIC0tIG9uIHRoZSBBUk0sIHRoaXMgYml0IGlzIHNldCBvbmNlIHRoZQotCSAgICAgcmVsb2NhdGlvbiBpcyBkb25lLiAgKi8KLQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCSAgICByZWxvYy0+cl90eXBlWzBdIHw9IFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzsKLQkgIGVsc2UKLQkgICAgcmVsb2MtPnJfdHlwZVswXSB8PSBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoaG93dG8tPnR5cGUgPT0gNykKLSAgICAqYW1vdW50ID0gMDsKLX0KLQotI2RlZmluZSBNWV9yZWxvY2F0YWJsZV9yZWxvYyhIT1csIEJGRCwgUkVMLCBBTU9VTlQsIEFERFIpIFwKLSAgTVkocmVsb2NhdGFibGVfcmVsb2MpKEhPVywgQkZELCBSRUwsICYoQU1PVU5UKSwgQUREUikKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2X2RvbmUpIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2KSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICBpZiAocmVsb2NhdGlvbiAmIDMpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKLSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKLSAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZNWShob3d0b190YWJsZSlbN107Ci0gIAotICByZXR1cm4gZmxhZzsKLX0KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1NWShiZmRfcmVsb2NfdHlwZV9sb29rdXApKGFiZmQsY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSNkZWZpbmUgQVNURChpLGopICAgICAgIGNhc2UgaTogcmV0dXJuICZNWShob3d0b190YWJsZSlbal0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotICAgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgICAgfQotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTYsIDEpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAzKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOwotICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgIH0KLX0KLQotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19pbiBNWShzd2FwX3N0ZF9yZWxvY19pbikKLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IE1ZKHN3YXBfc3RkX3JlbG9jX291dCkKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0vKiAjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlICovCi0vKiAjZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzICovCi0vKiAjZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rICovCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX3BjcmVsOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IE1ZX3JlbG9jX2hvd3RvIChhYmZkLCBieXRlcywgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotCi0gIE1PVkVfQUREUkVTUyAoMCk7Ci19Ci0KLXZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25lZyA9IDA7CS8qIE5lZ2F0aXZlIHJlbG9jcyB1c2UgdGhlIEJBU0VSRUwgYml0LiAgKi8KLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZSA7ICAgLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLwotICBpZiAocl9sZW5ndGggPCAwKQotICAgIHsKLSAgICAgIHJfbGVuZ3RoID0gLXJfbGVuZ3RoOwotICAgICAgcl9uZWcgPSAxOwotICAgIH0KLQotICByX3BjcmVsICA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsgLyogUmVsYXRpdmUgdG8gUEM/ICovCi0KLSAgLyogRm9yIFJJU0MgaVgsIGluIHBjLXJlbGF0aXZlIHJlbG9jcyB0aGUgcl9wY3JlbCBiaXQgbWVhbnMgdGhhdCB0aGUKLSAgICAgcmVsb2NhdGlvbiBoYXMgYmVlbiBkb25lIGFscmVhZHkgKE9ubHkgZm9yIHRoZSAyNi1iaXQgb25lIEkgdGhpbmspPz8/ISEhCi0gICAgICovCi0KLSAgaWYgKGctPmhvd3RvLT50eXBlID09IDMpCi0gICAgewotICAgICAgcl9sZW5ndGggPSAzOwotICAgICAgcl9wY3JlbCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChnLT5ob3d0by0+dHlwZSA9PSA3KQotICAgIHsgCi0gICAgICByX2xlbmd0aCA9IDM7Ci0gICAgICByX3BjcmVsID0gMTsKLSAgICB9Ci0gIAotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRzogMCkKLQkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzogMCkKLQkgfCAocl9uZWcgICAgPyAgIFJFTE9DX0FSTV9CSVRTX05FR19CSUc6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRTogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgTVlfQkZEX1RBUkdFVAotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9saXR0bGVfdmVjID0KLXsKLSAgImEub3V0LWFybS1saXR0bGUiLCAgICAgICAgICAgLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgICAgLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gICYgYW91dF9hcm1fYmlnX3ZlYywKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYyA9Ci17Ci0gICJhLm91dC1hcm0tYmlnIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLCAgICAgICAgICAgICAgIC8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLCAgICAgICAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8ICAgICAgICAgLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsICAgICAgICAgICAgICAgICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LCAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICAmIGFvdXRfYXJtX2xpdHRsZV92ZWMsCi0gIAotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtZW5jYXAuYyBiL2JmZC9hb3V0LWVuY2FwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWY5MDM3Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWVuY2FwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhLm91dCBmaWxlcyBlbmNhcHN1bGF0ZWQgd2l0aCBDT0ZGIGhlYWRlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVEhJUyBNT0RVTEUgSVMgTk9UIEZJTklTSEVELiAgSVQgUFJPQkFCTFkgRE9FU04nVCBFVkVOIENPTVBJTEUuICAqLwotCi0jaWYgMAotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPHN5c2RlcC5oPgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgPGFvdXQvYW91dDY0Lmg+Ci0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKmVuY2FwX3JlYWxfY2FsbGJhY2sgKCk7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKgotZW5jYXBfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY2J1Zls0XTsgLyogUmF3IGJ5dGVzIG9mIG1hZ2ljIG51bWJlciBmcm9tIGZpbGUgKi8KLSAgdW5zaWduZWQgbG9uZyBtYWdpYzsJCS8qIFN3YXBwZWQgbWFnaWMgbnVtYmVyICovCi0gIHNob3J0IGNvZmZfbWFnaWM7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKW1hZ2ljYnVmLCAxLCBzaXplb2YgKG1hZ2ljYnVmKSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobWFnaWNidWYpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIGNvZmZfbWFnaWMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIG1hZ2ljYnVmKTsKLSAgaWYgKGNvZmZfbWFnaWMgIT0gQ09GRl9NQUdJQykKLSAgICByZXR1cm4gMDsJCQkvKiBOb3QgYW4gZW5jYXAgY29mZiBmaWxlICovCi0KLSAgX19oZWFkZXJfb2Zmc2V0X3RlbXA9PUNPRkZfTUFHSUMgPyBzaXplb2Yoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKLSAgKGZzZWVrICgoZiksIEhFQURFUl9PRkZTRVQoKGYpKSwgMSkpCi0KLSAgbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIG1hZ2ljYnVmKTsKLQotICBpZiAoTl9CQURNQUcgKCooKHN0cnVjdCBpbnRlcm5hbF9leGVjICopICZtYWdpYykpKSByZXR1cm4gMDsKLQotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZleGVjLCBlbmNhcF9yZWFsY2FsbGJhY2spOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYSBlbmNhcHN1bGF0ZWQtY29mZiBhLm91dCBmaWxlIGhlYWRlciAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1lbmNhcF9yZWFsX2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgCi0gIE1ZKGNhbGxiYWNrKShhYmZkLCBleGVjcCk7Ci0gIAotICAvKiBJZiB3ZSBoYXZlIGEgY29mZiBoZWFkZXIsIGl0IGNhbiBnaXZlIHVzIGJldHRlciB2YWx1ZXMgZm9yCi0gICAgIHRleHRfc3RhcnQgYW5kIGV4ZWNfZGF0YV9zdGFydC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bAotICAgICBmb3IgcmVtb3RlIGRlYnVnZ2luZyBvZiBlbWJlZGRlZCBzeXN0ZW1zLiAgKi8KLSAgaWYgKE5fRkxBR1MoZXhlY19hb3V0aGRyKSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkKLSAgewotCSAgc3RydWN0IGNvZmZoZWFkZXIgY2g7Ci0JICBpbnQgdmFsOwotCSAgdmFsID0gbHNlZWsgKGV4ZWNjaGFuLCAtKHNpemVvZiAoQU9VVEhEUikgKyBzaXplb2YgKGNoKSksIDEpOwotCSAgaWYgKHZhbCA9PSAtMSkKLQkJICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7Ci0JICB2YWwgPSBteXJlYWQgKGV4ZWNjaGFuLCAmY2gsIHNpemVvZiAoY2gpKTsKLQkgIGlmICh2YWwgPCAwKQotCQkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKLQkgIHRleHRfc3RhcnQgPSBjaC50ZXh0X3N0YXJ0OwotCSAgZXhlY19kYXRhX3N0YXJ0ID0gY2guZGF0YV9zdGFydDsKLSAgfSBlbHNlCi0JIHsKLQkgIHRleHRfc3RhcnQgPQotCSAgICBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKSA/IDAgOiBOX1RYVEFERFIgKGV4ZWNfYW91dGhkcik7Ci0JICBleGVjX2RhdGFfc3RhcnQgPSBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKQotCSAgICA/IGV4ZWNfYW91dGhkci5hX3RleHQgOiBOX0RBVEFERFIgKGV4ZWNfYW91dGhkcik7Ci0gIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7IC8qIEZJWE1FICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEVuY2Fwc3VsYXRlZCBDT0ZGIGZvcm1hdC4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotYm9vbGVhbgotZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9wYWQgPSAwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLS8qKioqKiogRklYTUU6ICBGcmFnbWVudHMgZnJvbSB0aGUgb2xkIEdOVSBMRCBwcm9ncmFtIGZvciBkZWFsaW5nIHdpdGgKLSAgICAgICAgZW5jYXAgY29mZi4gICovCi1zdHJ1Y3QgY29mZmhlYWRlciBjb2ZmaGVhZGVyOwotaW50IG5lZWRfY29mZl9oZWFkZXI7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gY291bnQgdGhlIGhlYWRlciBhcyBwYXJ0IG9mCi0gICAgIHRoZSB0ZXh0IHNpemUsIGFuZCBpbml0aWFsaXplIHRoZSB0ZXh0IHNpemUgYWNjb3JkaW5nbHkuCi0gICAgIFRoaXMgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBzeXN0ZW0gYW5kIG9uIHRoZSBvdXRwdXQgZm9ybWF0IHNlbGVjdGVkLiAgKi8KLQotICBOX1NFVF9NQUdJQyAob3V0aGVhZGVyLCBtYWdpYyk7Ci0jaWZkZWYgSU5JVElBTElaRV9IRUFERVIKLSAgSU5JVElBTElaRV9IRUFERVI7Ci0jZW5kaWYKLQotICB0ZXh0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleGVjKTsKLSNpZmRlZiBDT0ZGX0VOQ0FQU1VMQVRFCi0gIGlmIChyZWxvY2F0YWJsZV9vdXRwdXQgPT0gMCAmJiBmaWxlX3RhYmxlWzBdLmp1c3Rfc3ltc19mbGFnID09IDApCi0gICAgewotICAgICAgbmVlZF9jb2ZmX2hlYWRlciA9IDE7Ci0gICAgICAvKiBzZXQgdGhpcyBmbGFnIG5vdywgc2luY2UgaXQgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBOX1RYVE9GRiwgZXRjICovCi0gICAgICBOX1NFVF9GTEFHUyAob3V0aGVhZGVyLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLSAgICAgIHRleHRfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCi0gICAgewotICAgICAgLyogV2UgYXJlIGVuY2Fwc3VsYXRpbmcgQlNEIGZvcm1hdCB3aXRoaW4gQ09GRiBmb3JtYXQuICAqLwotICAgICAgc3RydWN0IGNvZmZzY24gKnRwLCAqZHAsICpicDsKLQotICAgICAgdHAgPSAmY29mZmhlYWRlci5zY25zWzBdOwotICAgICAgZHAgPSAmY29mZmhlYWRlci5zY25zWzFdOwotICAgICAgYnAgPSAmY29mZmhlYWRlci5zY25zWzJdOwotCi0gICAgICBzdHJjcHkgKHRwLT5zX25hbWUsICIudGV4dCIpOwotICAgICAgdHAtPnNfcGFkZHIgPSB0ZXh0X3N0YXJ0OwotICAgICAgdHAtPnNfdmFkZHIgPSB0ZXh0X3N0YXJ0OwotICAgICAgdHAtPnNfc2l6ZSA9IHRleHRfc2l6ZTsKLSAgICAgIHRwLT5zX3NjbnB0ciA9IHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYyk7Ci0gICAgICB0cC0+c19yZWxwdHIgPSAwOwotICAgICAgdHAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICB0cC0+c19ucmVsb2MgPSAwOwotICAgICAgdHAtPnNfbmxubm8gPSAwOwotICAgICAgdHAtPnNfZmxhZ3MgPSAweDIwOwotICAgICAgc3RyY3B5IChkcC0+c19uYW1lLCAiLmRhdGEiKTsKLSAgICAgIGRwLT5zX3BhZGRyID0gZGF0YV9zdGFydDsKLSAgICAgIGRwLT5zX3ZhZGRyID0gZGF0YV9zdGFydDsKLSAgICAgIGRwLT5zX3NpemUgPSBkYXRhX3NpemU7Ci0gICAgICBkcC0+c19zY25wdHIgPSB0cC0+c19zY25wdHIgKyB0cC0+c19zaXplOwotICAgICAgZHAtPnNfcmVscHRyID0gMDsKLSAgICAgIGRwLT5zX2xubm9wdHIgPSAwOwotICAgICAgZHAtPnNfbnJlbG9jID0gMDsKLSAgICAgIGRwLT5zX25sbm5vID0gMDsKLSAgICAgIGRwLT5zX2ZsYWdzID0gMHg0MDsKLSAgICAgIHN0cmNweSAoYnAtPnNfbmFtZSwgIi5ic3MiKTsKLSAgICAgIGJwLT5zX3BhZGRyID0gZHAtPnNfdmFkZHIgKyBkcC0+c19zaXplOwotICAgICAgYnAtPnNfdmFkZHIgPSBicC0+c19wYWRkcjsKLSAgICAgIGJwLT5zX3NpemUgPSBic3Nfc2l6ZTsKLSAgICAgIGJwLT5zX3NjbnB0ciA9IDA7Ci0gICAgICBicC0+c19yZWxwdHIgPSAwOwotICAgICAgYnAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICBicC0+c19ucmVsb2MgPSAwOwotICAgICAgYnAtPnNfbmxubm8gPSAwOwotICAgICAgYnAtPnNfZmxhZ3MgPSAweDgwOwotCi0gICAgICBjb2ZmaGVhZGVyLmZfbWFnaWMgPSBDT0ZGX01BR0lDOwotICAgICAgY29mZmhlYWRlci5mX25zY25zID0gMzsKLSAgICAgIC8qIHN0b3JlIGFuIHVubGlrZWx5IHRpbWUgc28gcHJvZ3JhbXMgY2FuCi0gICAgICAgKiB0ZWxsIHRoYXQgdGhlcmUgaXMgYSBic2QgaGVhZGVyCi0gICAgICAgKi8KLSAgICAgIGNvZmZoZWFkZXIuZl90aW1kYXQgPSAxOwotICAgICAgY29mZmhlYWRlci5mX3N5bXB0ciA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLmZfbnN5bXMgPSAwOwotICAgICAgY29mZmhlYWRlci5mX29wdGhkciA9IDI4OwotICAgICAgY29mZmhlYWRlci5mX2ZsYWdzID0gMHgxMDM7Ci0gICAgICAvKiBhb3V0aGRyICovCi0gICAgICBjb2ZmaGVhZGVyLm1hZ2ljID0gWk1BR0lDOwotICAgICAgY29mZmhlYWRlci52c3RhbXAgPSAwOwotICAgICAgY29mZmhlYWRlci50c2l6ZSA9IHRwLT5zX3NpemU7Ci0gICAgICBjb2ZmaGVhZGVyLmRzaXplID0gZHAtPnNfc2l6ZTsKLSAgICAgIGNvZmZoZWFkZXIuYnNpemUgPSBicC0+c19zaXplOwotICAgICAgY29mZmhlYWRlci5lbnRyeSA9IG91dGhlYWRlci5hX2VudHJ5OwotICAgICAgY29mZmhlYWRlci50ZXh0X3N0YXJ0ID0gdHAtPnNfdmFkZHI7Ci0gICAgICBjb2ZmaGVhZGVyLmRhdGFfc3RhcnQgPSBkcC0+c192YWRkcjsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCi0gICAgbXl3cml0ZSAoJmNvZmZoZWFkZXIsIHNpemVvZiBjb2ZmaGVhZGVyLCAxLCBvdXRkZXNjKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgcGFkZmlsZSAoTl9UWFRPRkYgKG91dGhlYWRlcikgLSBzaXplb2Ygb3V0aGVhZGVyLCBvdXRkZXNjKTsKLSNlbmRpZgotCi0gIHRleHRfc2l6ZSAtPSBOX1RYVE9GRiAob3V0aGVhZGVyKTsKLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50IGVuY2FwX3dyaXRlX29iamVjdF9jb250ZW50cwotI2RlZmluZSBNWV9vYmplY3RfcCBlbmNhcF9vYmplY3RfcAotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC1uczMyay5jIGIvYmZkL2FvdXQtbnMzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhYzg0ZS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC1uczMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgbnMzMmsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gRGFsbCAoaWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgIm5zMzJrLmgiCi0KLSNkZWZpbmUgTVlOUyhPUCkgQ0FUKG5zMzJrYW91dF8sT1ApCi1yZWxvY19ob3d0b190eXBlICoKLU1ZTlMoYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWJvb2xlYW4KLU1ZTlMod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICBQQVJBTVMoKGJmZCAqYWJmZCkpOwotCi0vKiBBdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9ucyBmcm9tIGFvdXR4IGlmIHN1cHBvcnRpbmcgc3RhbmRhcmQgYS5vdXQgZm9ybWF0KHMpCi0gKiBhcyB3ZWxsIGFzIHRoaXMgb25lCi0gKi8KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotdm9pZCBiZmRfbnMzMmtfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgTVkoT1ApIE1ZTlMoT1ApCi0KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTVkoc3dhcF9zdGRfcmVsb2NfaW4pCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpCi0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzLAotCQkJICAgICAgYXJlbGVudCAqY2FjaGVfcHRyLCBhc3ltYm9sICoqc3ltYm9scywKLQkJCSAgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQpKTsKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmcsCi0JCQkgICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyKSk7Ci0KLS8qIFRoZSBuczMyayBzZXJpZXMgaXMgYWgsIHVudXN1YWwsIHdoZW4gaXQgY29tZXMgdG8gcmVsb2NhdGlvbi4KLSAqIFRoZXJlIGFyZSB0aHJlZSBzdG9yYWdlIG1ldGhvZHMgZm9yIHJlbG9jYXRlYWJsZSBvYmplY3RzLiAgVGhlcmUKLSAqIGFyZSBkaXNwbGFjZW1lbnRzLCBpbW1lZGlhdGUgb3BlcmFuZHMgYW5kIG9yZGluYXJ5IHR3b3MgY29tcGxlbWVudAotICogZGF0YS4gT2YgdGhlc2UsIG9ubHkgdGhlIGxhc3QgZml0cyBpbnRvIHRoZSBzdGFuZGFyZCByZWxvY2F0aW9uCi0gKiBzY2hlbWUuICBJbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHN0b3JlZCBodWZmbWFuIGVuY29kZWQgYW5kCi0gKiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHN0b3JlZCBiaWcgZW5kaWFuICh3aGVyZSBhcyB0aGUgbmF0dXJhbCBieXRlCi0gKiBvcmRlciBpcyBsaXR0bGUgZW5kaWFuIGZvciB0aGlzIGFjaGl0ZWN0dXJlKS4KLQotICogTm90ZSB0aGF0IHRoZSBuczMyayBkaXNwbGFjZW1lbnQgc3RvcmFnZSBtZXRob2QgaXMgb3J0aG9nb25hbCB0bwotICogd2hldGhlciB0aGUgcmVsb2NhdGlvbiBpcyBwYyByZWxhdGl2ZSBvciBub3QuIFRoZSAiZGlzcGxhY2VtZW50IgotICogc3RvcmFnZSBzY2hlbWUgaXMgdXNlZCBmb3IgZXNzZW50aWFsbHkgYWxsIGFkZHJlc3MgY29uc3RhbnRzLiBUaGUKLSAqIGRpc3BsYWNlbWVudCBjYW4gYmUgcmVsYXRpdmUgdG8gemVybyAoYWJzb2x1dGUgZGlzcGxhY2VtZW50KSwKLSAqIHJlbGF0aXZlIHRvIHRoZSBwYyAocGMgcmVsYXRpdmUpLCB0aGUgc3RhY2sgcG9pbnRlciwgdGhlIGZyYW1lCi0gKiBwb2ludGVyLCB0aGUgc3RhdGljIGJhc2UgcmVnaXN0ZXIgYW5kIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBldGMuCi0KLSAqIEZvciBleGFtcGxlOgotICoKLSAqICBzeW0xOiAubG9uZyAuCSMgcGMgcmVsYXRpdmUgMidzIGNvbXBsZW1lbnQKLSAqICBzeW0xOiAubG9uZyBmb28JIyAyJ3MgY29tcGxlbWVudCBub3QgcGMgcmVsYXRpdmUKLSAqCi0gKiAgc2VsZjogIG1vdmQgQHNlbGYsIHIwICMgcGMgcmVsYXRpdmUgZGlzcGxhY2VtZW50Ci0gKgkgICBtb3ZkIGZvbywgcjAgIyBub24gcGMgcmVsYXRpdmUgZGlzcGxhY2VtZW50Ci0gKgotICogIHNlbGY6ICBtb3ZkIHNlbGYsIHIwICMgcGMgcmVsYXRpdmUgaW1tZWRpYXRlCi0gKiAgICAgICAgIG1vdmQgZm9vLCByMCAjIG5vbiBwYyByZWxhdGl2ZSBpbW1lZGlhdGUKLSAqCi0gKiBJbiBhZGRpdGlvbiwgZm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHJlbG9jYXRpb24gdHlwZXMKLSAqIGluIHRoZSBhLm91dCBmb3JtYXQgcmVsb2NhdGlvbiBlbnRyaWVzIGlzIHN1Y2ggdGhhdCBldmVuIHRoZSByZWxvY2F0aW9uCi0gKiBtZXRob2RzIHdoaWNoIGFyZSBzdGFuZGFyZCBhcmUgbm90IGVuY29kZWQgdGhlIHN0YW5kYXJkIHdheS4KLSAqCi0gKi8KLQotcmVsb2NfaG93dG9fdHlwZSBNWShob3d0b190YWJsZSlbXSA9IAotewotICAvKiBuczMyayBpbW1lZGlhdGUgb3BlcmFuZHMgKi8KLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fOCwgMCwgMCwgOCwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiTlMzMktfSU1NXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICAiTlMzMktfSU1NXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiTlMzMktfSU1NXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsIDAsIDAsIDgsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV84IiwKLQkgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV8zMiIsCi0JIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIC8qIG5zMzJrIGRpc3BsYWNlbWVudHMgKi8KLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsIDAsIDAsIDgsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJOUzMyS19ESVNQXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfMTYiLAotCSB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJOUzMyS19ESVNQXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIlBDUkVMX05TMzJLX0RJU1BfOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsIDAsIDEsIDE2LCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsIDAsIDIsIDMyLCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF8zMiIsCi0JIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIC8qIE5vcm1hbCAyJ3MgY29tcGxlbWVudCAqLwotICBIT1dUTyAoQkZEX1JFTE9DXzgsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLAotCSAiOCIsIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICIxNiIsIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICIzMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzhfUENSRUwsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzgiLCB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ18xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMzJfUENSRUwsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCi0JICJQQ1JFTF8zMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSE9XVE8oQkZEKSAoTVkoaG93dG9fdGFibGUpICsgMTQpCi0KLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9CSUcgMHgwNgotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0xJVFRMRSAweDYwCi0jZGVmaW5lIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfU0hfQklHIDEKLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9MSVRUTEUgNQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvKShhYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9uczMya190eXBlOwotLyogIEJGRF9BU1NFUlQoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7ICovCi0gICpyX2luZGV4ID0gICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkgICAgICAgfCAgcmVsLT5yX2luZGV4WzBdICk7Ci0gICpyX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICpyX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgcl9sZW5ndGggID0gICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQk+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgcl9uczMya190eXBlICA9ICAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci0gIHJldHVybiAoTVkoaG93dG9fdGFibGUpICsgcl9sZW5ndGggKyAzICogKCpyX3BjcmVsKSArIDYgKiByX25zMzJrX3R5cGUpOwotfQotCi0jZGVmaW5lIE1ZX3JlbG9jX2hvd3RvKEJGRCxSRUwsSU4sRVgsUEMpIE1ZKHJlbG9jX2hvd3RvKShCRkQsIFJFTCwgJklOLCAmRVgsICZQQykKLQotdm9pZAotTVkocHV0X3JlbG9jKShhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgdmFsdWUsIGhvd3RvLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcl9leHRlcm47Ci0gICAgIGludCByX2luZGV4OwotICAgICBsb25nIHZhbHVlOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25zMzJrX3R5cGU7Ci0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgaG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgcl9uczMya190eXBlID0gKGhvd3RvIC0gTVkoaG93dG9fdGFibGUpICkvNjsKLS8qICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsgKi8KLSAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICByZWxvYy0+cl90eXBlWzBdID0KLSAgICAocl9leHRlcm4/ICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0gICAgICB8IChyX3BjcmVsPyAgICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCXwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKQotCSAgfCAocl9uczMya190eXBlIDw8ICBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci19Ci0KLSNkZWZpbmUgTVlfcHV0X3JlbG9jKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKSBcCi0gIE1ZKHB1dF9yZWxvYykoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpCi0KLSNkZWZpbmUgU1RBVF9GT1JfRVhFQwotCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKLQotI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKShhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSNkZWZpbmUgRU5UUlkoaSxqKQljYXNlIGk6IHJldHVybiAmTVkoaG93dG9fdGFibGUpW2pdCi0KLSAgaW50IGV4dCA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRTsKLQotICBCRkRfQVNTRVJUKGV4dCA9PSAwKTsKLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotCWNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzgsIDApOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCA0KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsIDUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwgNyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgOCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCA5KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLCAxMCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMTEpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzgsIDEyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ18xNiwgMTMpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzMyLCAxNCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfOF9QQ1JFTCwgMTUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzE2X1BDUkVMLCAxNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfMzJfUENSRUwsIDE3KTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0jdW5kZWYgRU5UUlkKLX0KLQotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX3BjcmVsOwotICBzdHJ1Y3QgYW91dGRhdGEgICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IE1ZX3JlbG9jX2hvd3RvKGFiZmQsIGJ5dGVzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCk7Ci0KLSAgTU9WRV9BRERSRVNTKDApOwotfQotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfYWRkZW5kOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAKLSAgLyogbmFtZSB3YXMgY2xvYmJlcmVkIGJ5IGFvdXRfd3JpdGVfc3ltcyB0byBiZSBzeW1ib2wgaW5kZXggKi8KLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgdGhlbiBzZXQgdGhlIAotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBDaGVjayBmb3IgdGhhdCBoZXJlLiAgKi8KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24KLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24pIAotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb24uc3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotI3VuZGVmIEtFRVBJVAotI2RlZmluZSBLRUVQSVQgdWRhdGEuaQotCSAgcl9pbmRleCA9ICAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7Ci0jdW5kZWYgS0VFUElUICAgICAKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OyAgICAgIAotICAgIH0KLQotICBNWV9wdXRfcmVsb2MgKGFiZmQsIHJfZXh0ZXJuLCByX2luZGV4LCBnLT5hZGRyZXNzLCBnLT5ob3d0bywgbmF0cHRyKTsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLXsKLSAgaW50IHJfbnMzMmtfdHlwZSA9IChob3d0byAtIE1ZKGhvd3RvX3RhYmxlKSkgLyA2OwotICBsb25nICgqZ2V0X2RhdGEpIFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLSAgaW50ICgqcHV0X2RhdGEpIFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLQotICBzd2l0Y2ggKHJfbnMzMmtfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZ2V0X2RhdGEgPSBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGU7Ci0gICAgICBwdXRfZGF0YSA9IF9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGdldF9kYXRhID0gX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50OwotICAgICAgcHV0X2RhdGEgPSBfYmZkX25zMzJrX3B1dF9kaXNwbGFjZW1lbnQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgICAgbG9jYXRpb24pOwotICAgICAgLyogTk9UIFJFQUNIRUQgKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0gIHJldHVybiBfYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICAgICBsb2NhdGlvbiwgZ2V0X2RhdGEsIHB1dF9kYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9hb3V0LXNwYXJjbGUuYyBiL2JmZC9hb3V0LXNwYXJjbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzYjEzNi4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC1zcGFyY2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3Igc3BhcmMgbGl0dGxlLWVuZGlhbiBhb3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWxpdHRsZSIKLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY2xlX2FvdXRfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9TUEFSQyB8fCAobXR5cGUpID09IE1fU1BBUkNMRVQpCi0KLS8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLwotI2RlZmluZSBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QCi0jaW5jbHVkZSAiYW91dGYxLmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC10YXJnZXQuaCBiL2JmZC9hb3V0LXRhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E1MGFjLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8qIERlZmluZSBhIHRhcmdldCB2ZWN0b3IgYW5kIHNvbWUgc21hbGwgcm91dGluZXMgZm9yIGEgdmFyaWFudCBvZiBhLm91dC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotLyojaW5jbHVkZSAibGliYW91dC5oIiovCi0KLSNpZm5kZWYgU0VHTUVOVF9TSVpFCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLQotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKiBOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotLyogU2V0IHBhcmFtZXRlcnMgYWJvdXQgdGhpcyBhLm91dCBmaWxlIHRoYXQgYXJlIG1hY2hpbmUtZGVwZW5kZW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNvbWVfYW91dF9vYmplY3RfcCBqdXN0IGJlZm9yZSBpdCByZXR1cm5zLiAgKi8KLSNpZm5kZWYgTVlfY2FsbGJhY2sKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKk1ZKGNhbGxiYWNrKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShjYWxsYmFjaykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgYXJjaF9hbGlnbl9wb3dlcjsKLSAgdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduOwotCi0gIC8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHBhcnRzIG9mIGEgbmV3bHkgcmVhZCBhb3V0IGhlYWRlciAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSKCpleGVjcCk7Ci0gIG9ial9ic3NzZWMgIChhYmZkKS0+dm1hID0gTl9CU1NBRERSKCpleGVjcCk7Ci0KLSAgLyogRm9yIHNvbWUgdGFyZ2V0cywgaWYgdGhlIGVudHJ5IHBvaW50IGlzIG5vdCBpbiB0aGUgc2FtZSBwYWdlCi0gICAgIGFzIHRoZSBzdGFydCBvZiB0aGUgdGV4dCwgdGhlbiBhZGp1c3QgdGhlIFZNQSBzbyB0aGF0IGl0IGlzLgotICAgICBGSVhNRTogRG8gdGhpcyB3aXRoIGEgbWFjcm8gbGlrZSBTRVRfQVJDSF9NQUNIIGluc3RlYWQ/ICAqLwotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSAgICAgICYmIGV4ZWNwLT5hX2VudHJ5ID4gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGp1c3Q7Ci0KLSAgICAgIGFkanVzdCA9IGV4ZWNwLT5hX2VudHJ5IC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gICAgICAvKiBBZGp1c3Qgb25seSBieSB3aG9sZSBwYWdlcy4gKi8KLSAgICAgIGFkanVzdCAmPSB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKTsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OwotICAgIH0KLQotICAvKiBTZXQgdGhlIGxvYWQgYWRkcmVzc2VzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0goYWJmZCwgKmV4ZWNwKTsKLSNlbHNlCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKLSNlbmRpZgotCi0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlcgotICAgICBTRVRfQVJDSF9NQUNILiAgSXQgYXNzdW1lcyB0aGF0IFNFVF9BUkNIX01BQ0ggd2lsbCBzZXQKLSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgY29ycmVjdGx5LCBpZiB0aGUgcmVsb2Mgc2l6ZSBpcyBub3QKLSAgICAgUkVMT0NfU1REX1NJWkUuICAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID0KLSAgICBleGVjcC0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNwLT5hX2Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBhcmNoaXRlY3R1cmUsIHNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUKLSAgICAgc2VjdGlvbnMuICBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spLAotICAgICBidXQgd2hlbiB0aGUgaW5pdGlhbCBzZWN0aW9ucyB3ZXJlIGNyZWF0ZWQgdGhlIGFyY2hpdGVjdHVyZSBoYWQKLSAgICAgbm90IHlldCBiZWVuIHNldC4gIEhvd2V2ZXIsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZSBkb24ndAotICAgICBzZXQgdGhlIGFsaWdubWVudCBwb3dlciBhbnkgaGlnaGVyIHRoYW4gYXMgcmVxdWlyZWQgYnkgdGhlIHNpemUKLSAgICAgb2YgdGhlIHNlY3Rpb24uICAqLwotICBhcmNoX2FsaWduX3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOwotICBhcmNoX2FsaWduID0gMSA8PCBhcmNoX2FsaWduX3Bvd2VyOwotICBpZiAoKEJGRF9BTElHTiAob2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0gICAgICAgPT0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgICAmJiAoQkZEX0FMSUdOIChvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLQkgID09IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplKQotICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLQkgID09IG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIHsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgIH0KLQotICAvKiBEb24ndCBzZXQgc2l6ZXMgbm93IC0tIGNhbid0IGJlIHN1cmUgdW50aWwgd2Uga25vdyBhcmNoICYgbWFjaC4KLSAgICAgU2l6ZXMgZ2V0IHNldCBpbiBzZXRfc2l6ZXMgY2FsbGJhY2ssIGxhdGVyLiAgKi8KLSNpZiAwCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotI2VuZGlmCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBNWV9vYmplY3RfcAotLyogRmluaXNoIHVwIHRoZSByZWFkaW5nIG9mIGFuIGEub3V0IGZpbGUgaGVhZGVyICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpNWShvYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotTVkob2JqZWN0X3ApIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJCS8qIENsZWFuZWQtdXAgZXhlYyBoZWFkZXIgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkgcmV0dXJuIDA7Ci0jaWZkZWYgTUFDSFRZUEVfT0sKLSAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpIHJldHVybiAwOwotI2VuZGlmCi0KLSAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pKGFiZmQsICZleGVjX2J5dGVzLCAmZXhlYyk7Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIC8qIHN3YXBfZXhlY19oZWFkZXJfaW4gcmVhZCBpbiBhX2luZm8gd2l0aCB0aGUgd3JvbmcgYnl0ZSBvcmRlciAqLwotICBleGVjLmFfaW5mbyA9IFNXQVBfTUFHSUMgKGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgdGFyZ2V0ID0gTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCBNWShjYWxsYmFjaykpOwotCi0jaWZkZWYgRU5UUllfQ0FOX0JFX1pFUk8KLSAgLyogVGhlIE5FV1NPUzMgZW50cnktcG9pbnQgaXMvd2FzIDAsIHdoaWNoIChhbW9uZ3N0IG90aGVyIGxvc3NhZ2UpCi0gICAqIG1lYW5zIHRoYXQgaXQgaXNuJ3Qgb2J2aW91cyBpZiBFWEVDX1Agc2hvdWxkIGJlIHNldC4KLSAgICogQWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlIGZvciBhbiBleGVjdXRhYmxlOgotICAgKiBUaGVyZSBtdXN0IGJlIG5vIHJlbG9jYXRpb25zLCB0aGUgYmZkIGNhbiBiZSBuZWl0aGVyIGFuCi0gICAqIGFyY2hpdmUgbm9yIGFuIGFyY2hpdmUgZWxlbWVudCwgYW5kIHRoZSBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZS4gKi8KLQotICBpZiAoZXhlYy5hX3Ryc2l6ZSArIGV4ZWMuYV9kcnNpemUgPT0gMAotICAgICAgJiYgYmZkX2dldF9mb3JtYXQoYWJmZCkgPT0gYmZkX29iamVjdCAmJiBhYmZkLT5teV9hcmNoaXZlID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDAgJiYgKGJ1Zi5zdF9tb2RlICYgU19JWFVTUikpCi0JYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLSNlbmRpZiAvKiBFTlRSWV9DQU5fQkVfWkVSTyAqLwotCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0jZGVmaW5lIE1ZX29iamVjdF9wIE1ZKG9iamVjdF9wKQotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9ta29iamVjdAotCi1zdGF0aWMgYm9vbGVhbiBNWShta29iamVjdCkgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKG1rb2JqZWN0KSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoTkFNRShhb3V0LG1rb2JqZWN0KShhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0jaWYgMCAvKiBTaXplcyBnZXQgc2V0IGluIHNldF9zaXplcyBjYWxsYmFjaywgbGF0ZXIsIGFmdGVyIHdlIGtub3cKLQkgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4gICovCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBNWV9ta29iamVjdCBNWShta29iamVjdCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0KLS8qIENvcHkgcHJpdmF0ZSBzZWN0aW9uIGRhdGEuICBUaGlzIGFjdHVhbGx5IGRvZXMgbm90aGluZyB3aXRoIHRoZQotICAgc2VjdGlvbnMuICBJdCBjb3BpZXMgdGhlIHN1YmZvcm1hdCBmaWVsZC4gIFdlIGNvcHkgaXQgaGVyZSwgYmVjYXVzZQotICAgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhpcyBpcyBhIFFNQUdJQyBmaWxlIGJlZm9yZSB3ZSBzZXQgdGhlCi0gICBzZWN0aW9uIGNvbnRlbnRzLCBhbmQgY29weV9wcml2YXRlX2JmZF9kYXRhIGlzIG5vdCBjYWxsZWQgdW50aWwKLSAgIGFmdGVyIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLSAgICBvYmpfYW91dF9zdWJmb3JtYXQgKG9iZmQpID0gb2JqX2FvdXRfc3ViZm9ybWF0IChpYmZkKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZgotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotI2lmbmRlZiBNWV93cml0ZV9vYmplY3RfY29udGVudHMKLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFKGFiZmQpOwotI2Vsc2UKLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0jZW5kaWYKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3NldF9zaXplcwotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWShzZXRfc2l6ZXMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLQotI2lmZGVmIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUKLSAgYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSA9IFpNQUdJQ19ESVNLX0JMT0NLX1NJWkU7Ci0jZWxzZQotICBhZGF0YShhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSNlbmRpZgotCi0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIE1ZX3NldF9zaXplcyBNWShzZXRfc2l6ZXMpCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9leGVjX2hkcl9mbGFncwotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAwCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iYWNrZW5kX2RhdGEKLQotI2lmbmRlZiBNWV96bWFnaWNfY29udGlndW91cwotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIKLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0jZGVmaW5lIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfZHluYW1pY19zeW1ib2xzCi0jZGVmaW5lIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9saW5rX2R5bmFtaWNfb2JqZWN0Ci0jZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3QgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9jaGVja19keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayAwCi0jZW5kaWYKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICBNWV96bWFnaWNfY29udGlndW91cywKLSAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19jYWxsYmFjawotCi0vKiBDYWxsYmFjayBmb3IgdGhlIGZpbmFsX2xpbmsgcm91dGluZSB0byBzZXQgdGhlIHNlY3Rpb24gb2Zmc2V0cy4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLQotc3RhdGljIHZvaWQKLU1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgKGFiZmQsIHB0cmVsb2ZmLCBwZHJlbG9mZiwgcHN5bW9mZikKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciAqcHRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwZHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBzeW1vZmY7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAqcHRyZWxvZmYgPSBOX1RSRUxPRkYgKCpleGVjcCk7Ci0gICpwZHJlbG9mZiA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLSAgKnBzeW1vZmYgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZpbmFsX2xpbmsKLQotLyogRmluYWwgbGluayByb3V0aW5lLiAgV2UgbmVlZCB0byB1c2UgYSBjYWxsIGJhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0gICBvZmZzZXRzIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuIE1ZX2JmZF9maW5hbF9saW5rIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNlbmRpZgotCi0vKiBXZSBhc3N1bWUgQkZEIGdlbmVyaWMgYXJjaGl2ZSBmaWxlcy4gICovCi0jaWZuZGVmCU1ZX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZQlNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBNWV9nZXRfZWx0X2F0X2luZGV4CQlfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2VuZGlmCi0jaWZuZGVmCU1ZX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZQlNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2VuZGlmCi0jaWZuZGVmCU1ZX3NsdXJwX2FybWFwCi0jZGVmaW5lCU1ZX3NsdXJwX2FybWFwCQkJYmZkX3NsdXJwX2JzZF9hcm1hcAotI2VuZGlmCi0jaWZuZGVmCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUJTVlfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQlfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNlbmRpZgotI2lmbmRlZiBNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNlbmRpZgotI2lmbmRlZglNWV93cml0ZV9hcm1hcAotI2RlZmluZQlNWV93cml0ZV9hcm1hcAkJYnNkX3dyaXRlX2FybWFwCi0jZW5kaWYKLSNpZm5kZWYgTVlfcmVhZF9hcl9oZHIKLSNkZWZpbmUgTVlfcmVhZF9hcl9oZHIJCV9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2VuZGlmCi0jaWZuZGVmCU1ZX3RydW5jYXRlX2FybmFtZQotI2RlZmluZQlNWV90cnVuY2F0ZV9hcm5hbWUJCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZW5kaWYKLSNpZm5kZWYgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotI2RlZmluZSBNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotI2VuZGlmCi0KLS8qIE5vIGNvcmUgZmlsZSBkZWZpbmVkIGhlcmUgLS0gY29uZmlndXJlIGluIHRyYWQtY29yZS5jIHNlcGFyYXRlbHkuICAqLwotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAlcCi0JCQkJX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX3AJCV9iZmRfZHVtbXlfdGFyZ2V0Ci0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19zdGFydAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19lbmQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQlcCi0JCQkodm9pZCAoKikgUEFSQU1TICgoYmZkKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBOQU1FKGFvdXQsY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgTkFNRShhb3V0LGNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9zZXRfc2VjdGlvbl9jb250ZW50cyBOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LGdldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2VuZGlmCi0jaWZuZGVmIE1ZX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgTVlfbmV3X3NlY3Rpb25faG9vayBOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQgTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiIE5BTUUoYW91dCxnZXRfc3ltdGFiKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfcmVsb2MKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWFrZV9lbXB0eV9zeW1ib2wKLSNkZWZpbmUgTVlfbWFrZV9lbXB0eV9zeW1ib2wgTkFNRShhb3V0LG1ha2VfZW1wdHlfc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3ByaW50X3N5bWJvbAotI2RlZmluZSBNWV9wcmludF9zeW1ib2wgTkFNRShhb3V0LHByaW50X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgTVlfZ2V0X3N5bWJvbF9pbmZvIE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2xpbmVubwotI2RlZmluZSBNWV9nZXRfbGluZW5vIE5BTUUoYW91dCxnZXRfbGluZW5vKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NldF9hcmNoX21hY2gKLSNkZWZpbmUgTVlfc2V0X2FyY2hfbWFjaCBOQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBNWV9maW5kX25lYXJlc3RfbGluZSBOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgTVlfc2l6ZW9mX2hlYWRlcnMgTkFNRShhb3V0LHNpemVvZl9oZWFkZXJzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBNWV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2djX3NlY3Rpb25zCi0jZGVmaW5lIE1ZX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykKLSNlbmRpZgotI2lmbmRlZiBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBNWV9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZW5kaWYKLQotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBNWV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBNWV9jbG9zZV9hbmRfY2xlYW51cCBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2VuZGlmCi0KLS8qIEFvdXQgc3ltYm9scyBub3JtYWxseSBoYXZlIGxlYWRpbmcgdW5kZXJzY29yZXMgKi8KLSNpZm5kZWYgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLSNlbmRpZgotCi0vKiBBb3V0IGFyY2hpdmVzIG5vcm1hbGx5IHVzZSBzcGFjZXMgZm9yIHBhZGRpbmcgKi8KLSNpZm5kZWYgQVJfUEFEX0NIQVIKLSNkZWZpbmUgQVJfUEFEX0NIQVIgJyAnCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9CRkRfVEFSR0VUCi1jb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYykgPQotewotICBUQVJHRVROQU1FLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSNpZmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChiaWcpICovCi0jZWxzZQotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotI2VuZGlmCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0jaWZkZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSNlbHNlCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotI2VuZGlmCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICAvKiBBbHRlcm5hdGl2ZV90YXJnZXQgKi8KLSAgTlVMTCwKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YQotfTsKLSNlbmRpZiAvKiBNWV9CRkRfVEFSR0VUICovCmRpZmYgLS1naXQgYS9iZmQvYW91dC10aWMzMC5jIGIvYmZkL2FvdXQtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjYWUwYy4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEMzMCBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAxMDI0Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMTI4Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF90aWMzMAotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2RlZmluZSBNWShPUCkgQ0FUKHRpYzMwX2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC10aWMzMCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDModGljMzBfYW91dCxfMzJfLHkpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9maXhfMTYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZml4XzMyCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICp0aWMzMF9hb3V0X3JlbG9jX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGludCAqLCBpbnQgKiwgaW50ICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0aWMzMF9hb3V0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0aWMzMF9hb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGljMzBfYW91dF9zZXRfc2l6ZXMgUEFSQU1TICgoYmZkICopKTsKLQotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsUkVMLElOLEVYLFBDKSB0aWMzMF9hb3V0X3JlbG9jX2hvd3RvKEJGRCxSRUwsJklOLCZFWCwmUEMpCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX29iamVjdF9wIHRpYzMwX2FvdXRfb2JqZWN0X3AKLSNkZWZpbmUgTVlfbWtvYmplY3QgTkFNRShhb3V0LG1rb2JqZWN0KQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NpemVzIHRpYzMwX2FvdXRfc2V0X3NpemVzCi0KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCi0KLSNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAotI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAxCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgdGljMzBfYW91dF9iYWNrZW5kX2RhdGEgPQotewotICBNWV96bWFnaWNfY29udGlndW91cywKLSAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmdGljMzBfYW91dF9iYWNrZW5kX2RhdGEKLSNlbmRpZgotCi0vKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIGFvdXR4Lmggc2hvdWxkIHJlYWxseSBvbmx5IGJlIGluY2x1ZGVkIGJ5Ci0gICBhb3V0MzIuYy4gICovCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiBUaGlzIHRhYmxlIGxpc3RzIHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgVE1TMzIwQzMwLiAgVGhlcmUgYXJlCi0gICBvbmx5IGEgZmV3IHJlbG9jYXRpb25zIHJlcXVpcmVkLCBhbmQgYWxsIG11c3QgYmUgZGl2aWRlZCBieSA0ICg+PgotICAgMikgdG8gZ2V0IHRoZSAzMi1iaXQgYWRkcmVzc2VzIGluIHRoZSBmb3JtYXQgdGhlIFRNUzMyMEMzMCBsaWtlcwotICAgaXQuICovCi1yZWxvY19ob3d0b190eXBlIHRpYzMwX2FvdXRfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPICgxLCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIHRpYzMwX2FvdXRfZml4XzE2LAotCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoMiwgMiwgMiwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjI0IiwgZmFsc2UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDE4LCAzLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDQsIDIsIDQsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHRpYzMwX2FvdXRfZml4XzMyLAotCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoNSwgMiwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgdGljMzBfYW91dF9maXhfcGNyZWxfMTYsICJQQ1JFTCIsIHRydWUsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIHRydWUpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpCi19OwotCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqTkFNRSAoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApICgpOwotCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgIGNhc2UgQkZEX1JFTE9DX1RJQzMwX0xEUDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVszXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVsxXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVsyXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVs1XTsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVs0XTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi10aWMzMF9hb3V0X3JlbG9jX2hvd3RvIChhYmZkLCByZWxvY3MsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgaW50ICpyX2luZGV4OwotICAgICBpbnQgKnJfZXh0ZXJuOwotICAgICBpbnQgKnJfcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJfcGNyZWxfZG9uZTsKLSAgaW50IGluZGV4OwotCi0gICpyX3BjcmVsID0gMDsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgKnJfaW5kZXggPSAoKHJlbG9jcy0+cl9pbmRleFswXSA8PCAxNikgfCAocmVsb2NzLT5yX2luZGV4WzFdIDw8IDgpIHwgcmVsb2NzLT5yX2luZGV4WzJdKTsKLSAgICAgICpyX2V4dGVybiA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgICAgcl9sZW5ndGggPSAoKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJfaW5kZXggPSAoKHJlbG9jcy0+cl9pbmRleFsyXSA8PCAxNikgfCAocmVsb2NzLT5yX2luZGV4WzFdIDw8IDgpIHwgcmVsb2NzLT5yX2luZGV4WzBdKTsKLSAgICAgICpyX2V4dGVybiA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotICAgICAgcl9sZW5ndGggPSAoKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotICBpbmRleCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWxfZG9uZTsKLSAgcmV0dXJuIHRpYzMwX2FvdXRfaG93dG9fdGFibGUgKyBpbmRleDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgY2FsbGJhY2sgZm9yIDE2LWJpdCByZWxvY3MuICBUaGlzIGlzCi0gICByZXF1aXJlZCBmb3IgcmVsb2NhdGlvbnMgYmV0d2VlbiBzZWdtZW50cy4gIEEgbGluZSBpbiBhb3V0eC5oCi0gICByZXF1aXJlcyB0aGF0IGFueSByZWxvY2F0aW9ucyBmb3IgdGhlIGRhdGEgc2VjdGlvbiBzaG91bGQgcG9pbnQgdG8KLSAgIHRoZSBlbmQgb2YgdGhlIGFsaWduZWQgdGV4dCBzZWN0aW9uLCBwbHVzIGFuIG9mZnNldC4gIEJ5IGRlZmF1bHQsCi0gICB0aGlzIGRvZXMgbm90IGhhcHBlbiwgdGhlcmVmb3JlIHRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZgotICAgdGhhdC4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfMTYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wncyBzZWN0aW9uIGlzIGRlZmluZWQuICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uIGFuZCB0dXJuIGl0IGludG8gdGhlIFRNUzMyMEMzMAotICAgICAzMi1iaXQgYWRkcmVzcyBmb3JtYXQuICovCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT5zZWN0aW9uLT52bWEgPj4gMik7Ci0gIHJlbG9jYXRpb24gKz0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGljMzBfYW91dF9maXhfMTYgZXhjZXB0IGZvciAzMgotICAgYml0IHJlbG9jYXRpb25zLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpeF8zMiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbCdzIHNlY3Rpb24gaXMgZGVmaW5lZC4gKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2Nfb2sgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb24gYW5kIHR1cm4gaXQgaW50byB0aGUgVE1TMzIwQzMwCi0gICAgIDMyLWJpdCBhZGRyZXNzIGZvcm1hdC4gKi8KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnNlY3Rpb24tPnZtYSA+PiAyKTsKLSAgcmVsb2NhdGlvbiArPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3b3JrIG91dCBwYy1yZWxhdGl2ZSBvZmZzZXRzIGZvciB0aGUKLSAgIFRNUzMyMEMzMC4gIFRoZSBkYXRhIGFscmVhZHkgcGxhY2VkIGJ5IG1kX3BjcmVsX2Zyb20gd2l0aGluIGdhcyBpcwotICAgdXNlbGVzcyBmb3IgYSByZWxvY2F0aW9uLCBzbyB3ZSBqdXN0IGdldCB0aGUgb2Zmc2V0IHZhbHVlIGFuZCBwbGFjZQotICAgYSB2ZXJzaW9uIG9mIHRoaXMgd2l0aGluIHRoZSBvYmplY3QgY29kZS4KLSAgIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZSB3aWxsIHRoZW4gY2FsY3VsYXRlIHRoZSByZXF1aXJlZAotICAgcmVsb2NhdGlvbiB0byBhZGQgb24gdG8gdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgY29kZS4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfcGNyZWxfMTYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uID0gMTsKLSAgYmZkX2J5dGUgb2Zmc2V0X2RhdGEgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgLSAxKTsKLQotICAvKiBUaGUgYnl0ZSBiZWZvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXggY29udGFpbnMgYml0cyAyMy0xNiBvZgotICAgICB0aGUgcGNyZWwgaW5zdHJ1Y3Rpb24uICBCaXQgMjEgaXMgc2V0IGZvciBhIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggcmVxdWlyZXMgb24gb2Zmc2V0IG9mIDMgaW5zdGVhZCBvZiAxLiAqLwotICBpZiAob2Zmc2V0X2RhdGEgJiAweDIwKQotICAgIHJlbG9jYXRpb24gLT0gMzsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gLT0gMTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+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+c2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgYmZkX3B1dGJfMjQgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gb3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhbiBhLm91dCBmaWxlIGhlYWRlciAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10aWMzMF9hb3V0X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkKLSAgICByZXR1cm4gMDsKLSNpZmRlZiBNQUNIVFlQRV9PSwotICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUgKGFvdXQsIHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0jaWZkZWYgU1dBUF9NQUdJQwotICAvKiBzd2FwX2V4ZWNfaGVhZGVyX2luIHJlYWQgaW4gYV9pbmZvIHdpdGggdGhlIHdyb25nIGJ5dGUgb3JkZXIgKi8KLSAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIHRhcmdldCA9IE5BTUUgKGFvdXQsIHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCB0aWMzMF9hb3V0X2NhbGxiYWNrKTsKLQotI2lmZGVmIEVOVFJZX0NBTl9CRV9aRVJPCi0gIC8qIFRoZSBORVdTT1MzIGVudHJ5LXBvaW50IGlzL3dhcyAwLCB3aGljaCAoYW1vbmdzdCBvdGhlciBsb3NzYWdlKQotICAgKiBtZWFucyB0aGF0IGl0IGlzbid0IG9idmlvdXMgaWYgRVhFQ19QIHNob3VsZCBiZSBzZXQuCi0gICAqIEFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZSBmb3IgYW4gZXhlY3V0YWJsZToKLSAgICogVGhlcmUgbXVzdCBiZSBubyByZWxvY2F0aW9ucywgdGhlIGJmZCBjYW4gYmUgbmVpdGhlciBhbgotICAgKiBhcmNoaXZlIG5vciBhbiBhcmNoaXZlIGVsZW1lbnQsIGFuZCB0aGUgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUuICovCi0KLSAgaWYgKGV4ZWMuYV90cnNpemUgKyBleGVjLmFfZHJzaXplID09IDAKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0ICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCQkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwICYmIChidWYuc3RfbW9kZSAmIFNfSVhVU1IpKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogRU5UUllfQ0FOX0JFX1pFUk8gKi8KLQotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAgVGhpcyBhY3R1YWxseSBkb2VzIG5vdGhpbmcgd2l0aCB0aGUKLSAgIHNlY3Rpb25zLiAgSXQgY29waWVzIHRoZSBzdWJmb3JtYXQgZmllbGQuICBXZSBjb3B5IGl0IGhlcmUsIGJlY2F1c2UKLSAgIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoaXMgaXMgYSBRTUFHSUMgZmlsZSBiZWZvcmUgd2Ugc2V0IHRoZQotICAgc2VjdGlvbiBjb250ZW50cywgYW5kIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBpcyBub3QgY2FsbGVkIHVudGlsCi0gICBhZnRlciB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgb2JqX2FvdXRfc3ViZm9ybWF0IChvYmZkKSA9IG9ial9hb3V0X3N1YmZvcm1hdCAoaWJmZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRpYzMwX2FvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFIChhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0gIHsKLSAgICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsJLyogZHVtbXkgdmFycyAqLwotICAgIGZpbGVfcHRyIHRleHRfZW5kOwotICAgIGlmIChhZGF0YSAoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQotICAgICAgTkFNRSAoYW91dCwgYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsKLQotICAgIGV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gICAgZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gICAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgTkFNRSAoYW91dCwgc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwotCi0gICAgaWYgKGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPiAwKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoYmZkX3dyaXRlICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUsIGFiZmQpICE9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCi0KLSAgICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSAhPSAoYXN5bWJvbCAqKikgTlVMTAotCSYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1NZTU9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JaWYgKCFOQU1FIChhb3V0LCB3cml0ZV9zeW1zKSAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fVFJFTE9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghTkFNRSAoYW91dCwgc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX0RSRUxPRkYgKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIU5BTUUgKGFvdXQsIHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGljMzBfYW91dF9zZXRfc2l6ZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0KLSNpZmRlZiBTRUdNRU5UX1NJWkUKLSAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSNlbHNlCi0gIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotI2VuZGlmCi0KLSNpZmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0gIGFkYXRhIChhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRTsKLSNlbHNlCi0gIGFkYXRhIChhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSNlbmRpZgotCi0gIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19jYWxsYmFjawotCi0vKiBDYWxsYmFjayBmb3IgdGhlIGZpbmFsX2xpbmsgcm91dGluZSB0byBzZXQgdGhlIHNlY3Rpb24gb2Zmc2V0cy4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLQotc3RhdGljIHZvaWQKLU1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgKGFiZmQsIHB0cmVsb2ZmLCBwZHJlbG9mZiwgcHN5bW9mZikKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciAqcHRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwZHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBzeW1vZmY7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAqcHRyZWxvZmYgPSBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgKyBleGVjcC0+YV9kYXRhOwotICAqcGRyZWxvZmYgPSAqcHRyZWxvZmYgKyBleGVjcC0+YV90cnNpemU7Ci0gICpwc3ltb2ZmID0gKnBkcmVsb2ZmICsgZXhlY3AtPmFfZHJzaXplOzsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZpbmFsX2xpbmsKLQotLyogRmluYWwgbGluayByb3V0aW5lLiAgV2UgbmVlZCB0byB1c2UgYSBjYWxsIGJhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0gICBvZmZzZXRzIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICBmaWxlX3B0ciBwb3M7Ci0gIGJmZF92bWEgdm1hID0gMDsKLSAgaW50IHBhZDsKLQotICAvKiBTZXQgdGhlIGV4ZWN1dGFibGUgaGVhZGVyIHNpemUgdG8gMCwgYXMgd2UgZG9uJ3Qgd2FudCBvbmUgZm9yIGFuCi0gICAgIG91dHB1dC4gKi8KLSAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IDA7Ci0gIHBvcyA9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIC8qIFRleHQuICAqLwotICB2bWEgPSBpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbi0+dm1hOwotICBwb3MgKz0gdm1hOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gdm1hOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnVzZXJfc2V0X3ZtYSA9IDE7Ci0gIHBvcyArPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIERhdGEuICAqLwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbi0+bmV4dC0+dm1hID4gMCkKLQlvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT5uZXh0LT52bWE7Ci0gICAgICBlbHNlCi0Jb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgNCk7Ci0gICAgfQotICBpZiAob2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPCB2bWEpCi0gICAgewotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgNCk7Ci0gICAgfQotICBvYmpfZGF0YXNlYyAoYWJmZCktPnVzZXJfc2V0X3ZtYSA9IDE7Ci0gIHZtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSB2bWEgKyBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBleGVjcC0+YV90ZXh0ID0gdm1hIC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfdGV4dDsKLQotICAvKiBTaW5jZSBCU1MgZm9sbG93cyBkYXRhIGltbWVkaWF0ZWx5LCBzZWUgaWYgaXQgbmVlZHMgYWxpZ25tZW50LiAgKi8KLSAgdm1hICs9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICBwb3MgKz0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gdm1hOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLQotICAvKiBXZSBhcmUgZnVsbHkgcmVzaXplZCwgc28gZG9uJ3QgcmVhZGp1c3QgaW4gZmluYWxfbGluay4gKi8KLSAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLQotICByZXR1cm4gTkFNRSAoYW91dCwgZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZW5kaWYKLQotZW51bSBtYWNoaW5lX3R5cGUKLXRpYzMwX2FvdXRfbWFjaGluZV90eXBlIChhcmNoLCBtYWNoaW5lLCB1bmtub3duKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gKnVua25vd247Ci17Ci0gIGVudW0gbWFjaGluZV90eXBlIGFyY2hfZmxhZ3M7Ci0KLSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgKnVua25vd24gPSB0cnVlOwotCi0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgICp1bmtub3duID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgICB9Ci0gIGlmIChhcmNoX2ZsYWdzICE9IE1fVU5LTk9XTikKLSAgICAqdW5rbm93biA9IGZhbHNlOwotICByZXR1cm4gYXJjaF9mbGFnczsKLX0KLQotYm9vbGVhbgotdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmICghYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5rbm93bjsKLSAgICAgIHRpYzMwX2FvdXRfbWFjaGluZV90eXBlIChhcmNoLCBtYWNoaW5lLCAmdW5rbm93bik7Ci0gICAgICBpZiAodW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgcmV0dXJuICgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5zZXRfc2l6ZXMpIChhYmZkKTsKLX0KLQotLyogV2UgYXNzdW1lIEJGRCBnZW5lcmljIGFyY2hpdmUgZmlsZXMuICAqLwotI2lmbmRlZglNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgTVlfZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNlbmRpZgotI2lmbmRlZglNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9hcm1hcAotI2RlZmluZQlNWV9zbHVycF9hcm1hcAkJCWJmZF9zbHVycF9ic2RfYXJtYXAKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYJTVlfd3JpdGVfYXJtYXAKLSNkZWZpbmUJTVlfd3JpdGVfYXJtYXAJCWJzZF93cml0ZV9hcm1hcAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfYXJfaGRyCi0jZGVmaW5lIE1ZX3JlYWRfYXJfaGRyCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNlbmRpZgotI2lmbmRlZglNWV90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUJTVlfdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2VuZGlmCi0jaWZuZGVmIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNkZWZpbmUgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNlbmRpZgotCi0vKiBObyBjb3JlIGZpbGUgZGVmaW5lZCBoZXJlIC0tIGNvbmZpZ3VyZSBpbiB0cmFkLWNvcmUuYyBzZXBhcmF0ZWx5LiAgKi8KLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AJXAotCQkJCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wCQlfYmZkX2R1bW15X3RhcmdldAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fZW5kCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIE5BTUUoYW91dCxjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNlbmRpZgotI2lmbmRlZiBNWV9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIE1ZX25ld19zZWN0aW9uX2hvb2sgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBOQU1FKGFvdXQsZ2V0X3N5bXRhYikKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIE1ZX21ha2VfZW1wdHlfc3ltYm9sIE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9wcmludF9zeW1ib2wKLSNkZWZpbmUgTVlfcHJpbnRfc3ltYm9sIE5BTUUoYW91dCxwcmludF9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIE1ZX2dldF9zeW1ib2xfaW5mbyBOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9saW5lbm8KLSNkZWZpbmUgTVlfZ2V0X2xpbmVubyBOQU1FKGFvdXQsZ2V0X2xpbmVubykKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIE1ZX3NldF9hcmNoX21hY2ggdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgTVlfZmluZF9uZWFyZXN0X2xpbmUgTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIE1ZX3NpemVvZl9oZWFkZXJzIE5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBNWV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgTVlfY2xvc2VfYW5kX2NsZWFudXAgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNlbmRpZgotCi0vKiBBb3V0IHN5bWJvbHMgbm9ybWFsbHkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzICovCi0jaWZuZGVmIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLSNlbmRpZgotCi0vKiBBb3V0IGFyY2hpdmVzIG5vcm1hbGx5IHVzZSBzcGFjZXMgZm9yIHBhZGRpbmcgKi8KLSNpZm5kZWYgQVJfUEFEX0NIQVIKLSNkZWZpbmUgQVJfUEFEX0NIQVIgJyAnCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9CRkRfVEFSR0VUCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2FvdXRfdmVjID0KLXsKLSAgVEFSR0VUTkFNRSwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwJCQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEKLX07Ci0jZW5kaWYgLyogTVlfQkZEX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQwLmMgYi9iZmQvYW91dDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjN2FlMC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDAuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBTdW5PUyBzdHlsZSBhLm91dCB3aXRoIGZsYWdzIHNldCB0byAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtemVyby1iaWciCi0jZGVmaW5lIE1ZKE9QKSBDQVQoYW91dDBfYmlnXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDAKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgXAotICAoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkKLQotLyogSW5jbHVkZSB0aGUgdXN1YWwgYS5vdXQgc3VwcG9ydC4gICovCi0jaW5jbHVkZSAiYW91dGYxLmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dDMyLmMgYi9iZmQvYW91dDMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzQwYjQuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciAzMi1iaXQgYS5vdXQgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0NjQuYyBiL2JmZC9hb3V0NjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwMzZjOC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIDY0LWJpdCBhLm91dCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2lmbmRlZiBCTUFHSUMKLSNkZWZpbmUgQk1BR0lDIDAKLSNlbmRpZgotI2lmbmRlZiBRTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0ZjEuaCBiL2JmZC9hb3V0ZjEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOTViNS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dGYxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NTkgKzAsMCBAQAotLyogQS5vdXQgImZvcm1hdCAxIiBmaWxlIGhhbmRsaW5nIGNvZGUgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3VuNC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotLyogVGhpcyBpcyBuZWVkZWQgdG8gcmVqZWN0IGEgTmV3c09TIGZpbGUsIGUuZy4gaW4KLSAgIGdkYi90ZXN0c3VpdGUvZ2RiLnQxMC9jcm9zc2xvYWQuZXhwLiA8a2luZ2RvbkBjeWdudXMuY29tPgotICAgSSBuZWVkZWQgdG8gYWRkIE1fVU5LTk9XTiB0byByZWNvZ25pemUgYSA2ODAwMCBvYmplY3QsIHNvIHRoaXMgd2lsbAotICAgcHJvYmFibHkgbm8gbG9uZ2VyIHJlamVjdCBhIE5ld3NPUyBvYmplY3QuICA8aWFuQGN5Z251cy5jb20+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/IHRydWUgOiBmYWxzZTsKLX0KLQotI2RlZmluZSBNWV9zZXRfc2l6ZXMgc3Vub3M0X3NldF9zaXplcwotc3RhdGljIGJvb2xlYW4KLXN1bm9zNF9zZXRfc2l6ZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi0vKiBXZSBkZWZhdWx0IHRvIHNldHRpbmcgdGhlIHRvb2x2ZXJzaW9uIGZpZWxkIHRvIDEsIGFzIGlzIHJlcXVpcmVkIGJ5Ci0gICBTdW5PUy4gICovCi0jaWZuZGVmIE1ZX2V4ZWNfaGRyX2ZsYWdzCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2xpbmtfZHluYW1pY19vYmplY3QKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluaXNoX2R5bmFtaWNfbGluawotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIDAKLSNlbmRpZgotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIHN1bm9zNF9hb3V0X2JhY2tlbmQgPQotewotICAwLAkJCQkvKiB6bWFnaWMgZmlsZXMgYXJlIG5vdCBjb250aWd1b3VzICovCi0gIDEsCQkJCS8qIHRleHQgaW5jbHVkZXMgaGVhZGVyICovCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIGRlZmF1bHQgdGV4dCB2bWEgKi8KLSAgc3Vub3M0X3NldF9zaXplcywKLSAgMCwJCQkJLyogaGVhZGVyIGlzIGNvdW50ZWQgaW4gem1hZ2ljIHRleHQgKi8KLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotDAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIAlzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3Agc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLSNkZWZpbmUgTVlfY29yZV9maWxlX3AJCQlzdW5vczRfY29yZV9maWxlX3AKLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCU5BTUUoYW91dCxzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEJCQkmc3Vub3M0X2FvdXRfYmFja2VuZAotCi0jaWZuZGVmIFRBUkdFVF9JU19MSVRUTEVfRU5ESUFOX1AKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2VuZGlmCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXR4LmggYi9iZmQvYW91dHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1YTMyMS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dHguaAorKysgL2Rldi9udWxsCkBAIC0xLDU3MTUgKzAsMCBAQAotLyogQkZEIHNlbWktZ2VuZXJpYyBiYWNrLWVuZCBmb3IgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlhLm91dCBiYWNrZW5kcwotCi0KLURFU0NSSVBUSU9OCi0KLQlCRkQgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZsYXZvdXJzIG9mIGEub3V0IGZvcm1hdCwKLQl0aG91Z2ggdGhlIG1ham9yIGRpZmZlcmVuY2VzIGFyZSBvbmx5IHRoZSBzaXplcyBvZiB0aGUKLQlzdHJ1Y3R1cmVzIG9uIGRpc2ssIGFuZCB0aGUgc2hhcGUgb2YgdGhlIHJlbG9jYXRpb24KLQlpbmZvcm1hdGlvbi4KLQotCVRoZSBzdXBwb3J0IGlzIHNwbGl0IGludG8gYSBiYXNpYyBzdXBwb3J0IGZpbGUgQGZpbGV7YW91dHguaH0KLQlhbmQgb3RoZXIgZmlsZXMgd2hpY2ggZGVyaXZlIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlLiBPbmUKLQlkZXJpdmF0aW9uIGZpbGUgaXMgQGZpbGV7YW91dGYxLmh9IChmb3IgYS5vdXQgZmxhdm91ciAxKSwgYW5kCi0JYWRkcyB0byB0aGUgYmFzaWMgYS5vdXQgZnVuY3Rpb25zIHN1cHBvcnQgZm9yIHN1bjMsIHN1bjQsIDM4NgotCWFuZCAyOWsgYS5vdXQgZmlsZXMsIHRvIGNyZWF0ZSBhIHRhcmdldCBqdW1wIHZlY3RvciBmb3IgYQotCXNwZWNpZmljIHRhcmdldC4KLQotCVRoaXMgaW5mb3JtYXRpb24gaXMgZnVydGhlciBzcGxpdCBvdXQgaW50byBtb3JlIHNwZWNpZmljIGZpbGVzCi0JZm9yIGVhY2ggbWFjaGluZSwgaW5jbHVkaW5nIEBmaWxle3N1bm9zLmN9IGZvciBzdW4zIGFuZCBzdW40LAotCUBmaWxle25ld3NvczMuY30gZm9yIHRoZSBTb255IE5FV1MsIGFuZCBAZmlsZXtkZW1vNjQuY30gZm9yIGEKLQlkZW1vbnN0cmF0aW9uIG9mIGEgNjQgYml0IGEub3V0IGZvcm1hdC4KLQotCVRoZSBiYXNlIGZpbGUgQGZpbGV7YW91dHguaH0gZGVmaW5lcyBnZW5lcmFsIG1lY2hhbmlzbXMgZm9yCi0JcmVhZGluZyBhbmQgd3JpdGluZyByZWNvcmRzIHRvIGFuZCBmcm9tIGRpc2sgYW5kIHZhcmlvdXMKLQlvdGhlciBtZXRob2RzIHdoaWNoIEJGRCByZXF1aXJlcy4gSXQgaXMgaW5jbHVkZWQgYnkKLQlAZmlsZXthb3V0MzIuY30gYW5kIEBmaWxle2FvdXQ2NC5jfSB0byBmb3JtIHRoZSBuYW1lcwotCTw8YW91dF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luPj4sIDw8YW91dF82NF9zd2FwX2V4ZWNfaGVhZGVyX2luPj4sIGV0Yy4KLQotCUFzIGFuIGV4YW1wbGUsIHRoaXMgaXMgd2hhdCBnb2VzIG9uIHRvIG1ha2UgdGhlIGJhY2sgZW5kIGZvciBhCi0Jc3VuNCwgZnJvbSBAZmlsZXthb3V0MzIuY306Ci0KLXwJI2RlZmluZSBBUkNIX1NJWkUgMzIKLXwJI2luY2x1ZGUgImFvdXR4LmgiCi0KLQlXaGljaCBleHBvcnRzIG5hbWVzOgotCi18CS4uLgotfAlhb3V0XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYwotfAlhb3V0XzMyX2ZpbmRfbmVhcmVzdF9saW5lCi18CWFvdXRfMzJfZ2V0X2xpbmVubwotfAlhb3V0XzMyX2dldF9yZWxvY191cHBlcl9ib3VuZAotfAkuLi4KLQotCWZyb20gQGZpbGV7c3Vub3MuY306Ci0KLXwJI2RlZmluZSBUQVJHRVRfTkFNRSAiYS5vdXQtc3Vub3MtYmlnIgotfAkjZGVmaW5lIFZFQ05BTUUgICAgc3Vub3NfYmlnX3ZlYwotfAkjaW5jbHVkZSAiYW91dGYxLmgiCi0KLQlyZXF1aXJlcyBhbGwgdGhlIG5hbWVzIGZyb20gQGZpbGV7YW91dDMyLmN9LCBhbmQgcHJvZHVjZXMgdGhlIGp1bXAgdmVjdG9yCi0KLXwJc3Vub3NfYmlnX3ZlYwotCi0JVGhlIGZpbGUgQGZpbGV7aG9zdC1hb3V0LmN9IGlzIGEgc3BlY2lhbCBjYXNlLiAgSXQgaXMgZm9yIGEgbGFyZ2Ugc2V0Ci0Jb2YgaG9zdHMgdGhhdCB1c2UgYGBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQnJyBhLm91dCBmaWxlcywgYW5kCi0JZm9yIHdoaWNoIGNyb3NzLWRlYnVnZ2luZyBpcyBub3QgaW50ZXJlc3RpbmcuICBJdCB1c2VzIHRoZQotCXN0YW5kYXJkIDMyLWJpdCBhLm91dCBzdXBwb3J0IHJvdXRpbmVzLCBidXQgZGV0ZXJtaW5lcyB0aGUKLQlmaWxlIG9mZnNldHMgYW5kIGFkZHJlc3NlcyBvZiB0aGUgdGV4dCwgZGF0YSwgYW5kIEJTUwotCXNlY3Rpb25zLCB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSwgYW5kIHRoZQotCWVudHJ5IHBvaW50IGFkZHJlc3MsIGluIGEgaG9zdC1kZXBlbmRlbnQgbWFubmVyLiAgT25jZSB0aGVzZQotCXZhbHVlcyBoYXZlIGJlZW4gZGV0ZXJtaW5lZCwgZ2VuZXJpYyBjb2RlIGlzIHVzZWQgdG8gaGFuZGxlCi0JdGhlICBvYmplY3QgZmlsZS4KLQotCVdoZW4gcG9ydGluZyBpdCB0byBydW4gb24gYSBuZXcgc3lzdGVtLCB5b3UgbXVzdCBzdXBwbHk6Ci0KLXwgICAgICAgIEhPU1RfUEFHRV9TSVpFCi18ICAgICAgICBIT1NUX1NFR01FTlRfU0laRQotfCAgICAgICAgSE9TVF9NQUNISU5FX0FSQ0ggICAgICAgKG9wdGlvbmFsKQotfCAgICAgICAgSE9TVF9NQUNISU5FX01BQ0hJTkUgICAgKG9wdGlvbmFsKQotfCAgICAgICAgSE9TVF9URVhUX1NUQVJUX0FERFIKLXwgICAgICAgIEhPU1RfU1RBQ0tfRU5EX0FERFIKLQotCWluIHRoZSBmaWxlIEBmaWxley4uL2luY2x1ZGUvc3lzL2gtQHZhcntYWFh9Lmh9IChmb3IgeW91ciBob3N0KS4gIFRoZXNlCi0JdmFsdWVzLCBwbHVzIHRoZSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgZGVmaW5lZCBpbiBAZmlsZXthLm91dC5ofSBvbgotCXlvdXIgaG9zdCBzeXN0ZW0sIHdpbGwgcHJvZHVjZSBhIEJGRCB0YXJnZXQgdGhhdCB3aWxsIGFjY2VzcwotCW9yZGluYXJ5IGEub3V0IGZpbGVzIG9uIHlvdXIgaG9zdC4gVG8gY29uZmlndXJlIGEgbmV3IG1hY2hpbmUKLQl0byB1c2UgQGZpbGV7aG9zdC1hb3V0LmN9LCBzcGVjaWZ5OgotCi18CVRERUZBVUxUUyA9IC1EREVGQVVMVF9WRUNUT1I9aG9zdF9hb3V0X2JpZ192ZWMKLXwJVERFUEZJTEVTPSBob3N0LWFvdXQubyB0cmFkLWNvcmUubwotCi0JaW4gdGhlIEBmaWxle2NvbmZpZy9AdmFye1hYWH0ubXR9IGZpbGUsIGFuZCBtb2RpZnkgQGZpbGV7Y29uZmlndXJlLmlufQotCXRvIHVzZSB0aGUKLQlAZmlsZXtAdmFye1hYWH0ubXR9IGZpbGUgKGJ5IHNldHRpbmcgIjw8YmZkX3RhcmdldD1YWFg+PiIpIHdoZW4geW91cgotCWNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQuCi0KLSovCi0KLS8qIFNvbWUgYXNzdW1wdGlvbnM6Ci0gICAqIEFueSBCRkQgd2l0aCBEX1BBR0VEIHNldCBpcyBaTUFHSUMsIGFuZCB2aWNlIHZlcnNhLgotICAgICBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBzZXR0aW5nIG9mIFdQX1RFWFQgaXMgb24gb3V0cHV0LCBidXQgaXQnbGwKLSAgICAgZ2V0IHNldCBvbiBpbnB1dC4KLSAgICogQW55IEJGRCB3aXRoIERfUEFHRUQgY2xlYXIgYW5kIFdQX1RFWFQgc2V0IGlzIE5NQUdJQy4KLSAgICogQW55IEJGRCB3aXRoIGJvdGggZmxhZ3MgY2xlYXIgaXMgT01BR0lDLgotICAgKEp1c3Qgd2FudCB0byBtYWtlIHRoZXNlIGV4cGxpY2l0LCBzbyB0aGUgY29uZGl0aW9ucyB0ZXN0ZWQgaW4gdGhpcwotICAgZmlsZSBtYWtlIHNlbnNlIGlmIHlvdSdyZSBtb3JlIGZhbWlsaWFyIHdpdGggYS5vdXQgdGhhbiB3aXRoIEJGRC4pICAqLwotCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLXN0YXRpYyBib29sZWFuIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3RydWN0IGV4dGVybmFsX25saXN0ICopKTsKLXN0YXRpYyB2b2lkIGFkanVzdF9vX21hZ2ljIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3Rfel9tYWdpYyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4ZWMgKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X25fbWFnaWMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leGVjICopKTsKLQotLyoKLVNVQlNFQ1RJT04KLQlSZWxvY2F0aW9ucwotCi1ERVNDUklQVElPTgotCVRoZSBmaWxlIEBmaWxle2FvdXR4Lmh9IHByb3ZpZGVzIGZvciBib3RoIHRoZSBAZW1waHtzdGFuZGFyZH0KLQlhbmQgQGVtcGh7ZXh0ZW5kZWR9IGZvcm1zIG9mIGEub3V0IHJlbG9jYXRpb24gcmVjb3Jkcy4KLQotCVRoZSBzdGFuZGFyZCByZWNvcmRzIGNvbnRhaW4gb25seSBhbgotCWFkZHJlc3MsIGEgc3ltYm9sIGluZGV4LCBhbmQgYSB0eXBlIGZpZWxkLiBUaGUgZXh0ZW5kZWQgcmVjb3JkcwotCSh1c2VkIG9uIDI5a3MgYW5kIHNwYXJjcykgYWxzbyBoYXZlIGEgZnVsbCBpbnRlZ2VyIGZvciBhbgotCWFkZGVuZC4KLQotKi8KLSNpZm5kZWYgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTwotI2RlZmluZSBDVE9SX1RBQkxFX1JFTE9DX0lEWCAyCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSE9XVE8oQkZEKSAoKG9ial9yZWxvY19lbnRyeV9zaXplKEJGRCkgPT0gUkVMT0NfRVhUX1NJWkUgXAotCSAgICAgPyBob3d0b190YWJsZV9leHQgOiBob3d0b190YWJsZV9zdGQpIFwKLQkgICAgKyBDVE9SX1RBQkxFX1JFTE9DX0lEWCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3N3YXBfc3RkX3JlbG9jX2luCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX2luIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3N3YXBfc3RkX3JlbG9jX291dAotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19vdXQgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSNkZWZpbmUgTVlfZmluYWxfbGlua19yZWxvY2F0ZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3JlbG9jYXRlX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfcmVsb2NhdGVfY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGhvd3RvX3RhYmxlX2V4dCBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKQotI2RlZmluZSBob3d0b190YWJsZV9zdGQgTkFNRShhb3V0LHN0ZF9ob3d0b190YWJsZSkKLQotcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZV9leHRbXSA9Ci17Ci0gIC8qIHR5cGUgICAgICAgICAgIHJzICAgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgc2V0bWFzayBwY2RvbmUgKi8KLSAgSE9XVE8oUkVMT0NfOCwgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLCAgICAgICAgZmFsc2UsIDAsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18xNiwgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsICAgICAgIGZhbHNlLCAwLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfMzIsICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLCAgICAgICBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1A4LCAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQOCIsIAlmYWxzZSwgMCwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1AxNiwgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQMTYiLCAJZmFsc2UsIDAsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19ESVNQMzIsIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiRElTUDMyIiwgCWZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfV0RJU1AzMCwyLCAgMiwgCTMwLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIldESVNQMzAiLCAJZmFsc2UsIDAsMHgzZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19XRElTUDIyLDIsICAyLCAJMjIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiV0RJU1AyMiIsIAlmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0hJMjIsICAgMTAsIDIsIAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkhJMjIiLAlmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzIyLCAgICAgMCwgIDIsIAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjIyIiwgICAgICAgZmFsc2UsIDAsMHgwMDNmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18xMywgICAgIDAsICAyLCAJMTMsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxMyIsICAgICAgIGZhbHNlLCAwLDB4MDAwMDFmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfTE8xMCwgICAwLCAgMiwgCTEwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwwLCJMTzEwIiwgICAgIGZhbHNlLCAwLDB4MDAwMDAzZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfU0ZBX0JBU0UsMCwgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0ZBX0JBU0UiLCBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1NGQV9PRkYxMywwLDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlNGQV9PRkYxMyIsZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMTAsIDAsICAyLCAJMTAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIkJBU0UxMCIsICAgZmFsc2UsIDAsMHgwMDAwMDNmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMTMsIDAsICAyLAkxMywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJCQVNFMTMiLCAgIGZhbHNlLCAwLDB4MDAwMDFmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfQkFTRTIyLCAxMCwgMiwJMjIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMjIiLCAgIGZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfUEMxMCwgICAwLCAgMiwJMTAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIlBDMTAiLAlmYWxzZSwgMCwweDAwMDAwM2ZmLCB0cnVlKSwKLSAgSE9XVE8oUkVMT0NfUEMyMiwgICAxMCwgIDIsCTIyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIlBDMjIiLCBmYWxzZSwgMCwweDAwM2ZmZmZmLCB0cnVlKSwKLSAgSE9XVE8oUkVMT0NfSk1QX1RCTCwyLCAgMiwgCTMwLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkpNUF9UQkwiLCAJZmFsc2UsIDAsMHgzZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19TRUdPRkYxNiwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlNFR09GRjE2IiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19HTE9CX0RBVCwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkdMT0JfREFUIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19KTVBfU0xPVCwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkpNUF9TTE9UIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19SRUxBVElWRSwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJFTEFUSVZFIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTygwLCAgMCwgMCwgICAgMCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTygwLCAgMCwgMCwgICAgMCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2RlZmluZSBSRUxPQ19TUEFSQ19SRVYzMiBSRUxPQ19XRElTUDE5Ci0gIEhPV1RPKFJFTE9DX1NQQVJDX1JFVjMyLCAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwwLCJSX1NQQVJDX1JFVjMyIiwgICAgICAgZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotLyogQ29udmVydCBzdGFuZGFyZCByZWxvYyByZWNvcmRzIHRvICJhcmVsZW50IiBmb3JtYXQgKGluY2wgYnl0ZSBzd2FwKS4gICovCi0KLXJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVfc3RkW10gPSB7Ci0gIC8qIHR5cGUgICAgICAgICAgICAgIHJzIHNpemUgYnN6ICBwY3JlbCBiaXRwb3Mgb3ZyZiAgICAgICAgICAgICAgICAgICAgIHNmIG5hbWUgICAgIHBhcnRfaW5wbCByZWFkbWFzayAgc2V0bWFzayAgICBwY2RvbmUgKi8KLUhPV1RPKCAwLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwJCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotSE9XVE8oIDEsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLUhPV1RPKCAyLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTyggMywJICAgICAgIDAsICA0LCAJNjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI2NCIsCXRydWUsIDB4ZGVhZGRlYWQsMHhkZWFkZGVhZCwgZmFsc2UpLAotSE9XVE8oIDQsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLUhPV1RPKCA1LAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotSE9XVE8oIDYsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTyggNywJICAgICAgIDAsICA0LCAJNjQsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQNjQiLAl0cnVlLCAweGZlZWRmYWNlLDB4ZmVlZGZhY2UsIGZhbHNlKSwKLUhPV1RPKCA4LAkgICAgICAgMCwgIDIsICAgIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJHT1RfUkVMIiwJZmFsc2UsICAgICAgICAgMCwweDAwMDAwMDAwLCBmYWxzZSksCi1IT1dUTyggOSwJICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRTE2IiwJZmFsc2UsMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTygxMCwJICAgICAgIDAsICAyLCAgIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRTMyIiwJZmFsc2UsMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oMTYsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJKTVBfVEFCTEUiLCBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oMzIsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSRUxBVElWRSIsICBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPKDQwLAkgICAgICAgMCwgIDIsCSAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRVJFTCIsICAgZmFsc2UsICAgICAgICAgMCwweDAwMDAwMDAwLCBmYWxzZSksCi19OwotCi0jZGVmaW5lIFRBQkxFX1NJWkUoVEFCTEUpCShzaXplb2YoVEFCTEUpL3NpemVvZihUQUJMRVswXSkpCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKSAoYWJmZCxjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotI2RlZmluZSBFWFQoaSxqKQljYXNlIGk6IHJldHVybiAmaG93dG9fdGFibGVfZXh0W2pdCi0jZGVmaW5lIFNURChpLGopCWNhc2UgaTogcmV0dXJuICZob3d0b190YWJsZV9zdGRbal0KLSAgaW50IGV4dCA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRTsKLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotCWNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDY0OgotCWNvZGUgPSBCRkRfUkVMT0NfNjQ7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIGlmIChleHQpCi0gICAgc3dpdGNoIChjb2RlKQotICAgICAgewotCUVYVCAoQkZEX1JFTE9DXzMyLCAyKTsKLQlFWFQgKEJGRF9SRUxPQ19ISTIyLCA4KTsKLQlFWFQgKEJGRF9SRUxPQ19MTzEwLCAxMSk7Ci0JRVhUIChCRkRfUkVMT0NfMzJfUENSRUxfUzIsIDYpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIDcpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDMTMsIDEwKTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgMTQpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0JBU0UxMywgMTUpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCAxNSk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfR09UMjIsIDE2KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19QQzEwLCAxNyk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfUEMyMiwgMTgpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgMTkpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1JFVjMyLCAyNik7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICAgIH0KLSAgZWxzZQotICAgIC8qIHN0ZCByZWxvY3MgKi8KLSAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICB7Ci0JU1REIChCRkRfUkVMT0NfMTYsIDEpOwotCVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKLQlTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKLQlTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7Ci0JU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOwotCVNURCAoQkZEX1JFTE9DXzE2X0JBU0VSRUwsIDkpOwotCVNURCAoQkZEX1JFTE9DXzMyX0JBU0VSRUwsIDEwKTsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgICAgfQotfQotCi0vKgotU1VCU0VDVElPTgotCUludGVybmFsIGVudHJ5IHBvaW50cwotCi1ERVNDUklQVElPTgotCUBmaWxle2FvdXR4Lmh9IGV4cG9ydHMgc2V2ZXJhbCByb3V0aW5lcyBmb3IgYWNjZXNzaW5nIHRoZQotCWNvbnRlbnRzIG9mIGFuIGEub3V0IGZpbGUsIHdoaWNoIGFyZSBnYXRoZXJlZCBhbmQgZXhwb3J0ZWQgaW4KLQl0dXJuIGJ5IHZhcmlvdXMgZm9ybWF0IHNwZWNpZmljIGZpbGVzIChlZyBzdW5vcy5jKS4KLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX2luCi0KLVNZTk9QU0lTCi0Jdm9pZCBhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9pbiwKLSAgICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApOwotCi1ERVNDUklQVElPTgotCVN3YXAgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIEB2YXJ7cmF3X2J5dGVzfSB0YWtlbgotCWZyb20gYSByYXcgYnl0ZSBzdHJlYW0gbWVtb3J5IGltYWdlIGludG8gdGhlIGludGVybmFsIGV4ZWMgaGVhZGVyCi0Jc3RydWN0dXJlIEB2YXJ7ZXhlY3B9LgotKi8KLQotI2lmbmRlZiBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBUaGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgaGFzIHNvbWUgZmllbGRzIHRoYXQgYXJlIHVudXNlZCBpbiB0aGlzCi0gICAgIGNvbmZpZ3VyYXRpb24gKElFIGZvciBpOTYwKSwgc28gZW5zdXJlIHRoYXQgYWxsIHN1Y2ggdW5pbml0aWFsaXplZAotICAgICBmaWVsZHMgYXJlIHplcm8nZCBvdXQuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIHR3byBvZiB0aGVzZSBzdHJ1Y3RzCi0gICAgIGFyZSBtZW1jbXAnZCwgYW5kIHRodXMgdGhlIGNvbnRlbnRzIGRvIG1hdHRlci4gKi8KLSAgbWVtc2V0ICgoUFRSKSBleGVjcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpOwotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotfQotI2RlZmluZSBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4gTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pCi0jZW5kaWYKLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfb3V0Ci0KLVNZTk9QU0lTCi0Jdm9pZCBhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9vdXQKLQkgIChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCSAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpOwotCi1ERVNDUklQVElPTgotCVN3YXAgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZQotCUB2YXJ7ZXhlY3B9IGludG8gdGhlIGJ1ZmZlciBAdmFye3Jhd19ieXRlc30gcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4KLSovCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgcmF3IGRhdGEsIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgZXhlYyBzdHJ1Y3QuICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfaW5mbyAgLCBieXRlcy0+ZV9pbmZvKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3RleHQgICwgYnl0ZXMtPmVfdGV4dCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kYXRhICAsIGJ5dGVzLT5lX2RhdGEpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfYnNzICAgLCBieXRlcy0+ZV9ic3MpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfc3ltcyAgLCBieXRlcy0+ZV9zeW1zKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2VudHJ5ICwgYnl0ZXMtPmVfZW50cnkpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdHJzaXplLCBieXRlcy0+ZV90cnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotfQotCi0vKiBNYWtlIGFsbCB0aGUgc2VjdGlvbiBmb3IgYW4gYS5vdXQgZmlsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX3RleHRzZWMgKGFiZmQpID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICAmJiBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnRleHQiKSA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChvYmpfZGF0YXNlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGF0YSIpID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG9ial9ic3NzZWMgKGFiZmQpID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICAmJiBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmJzcyIpID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9zb21lX2FvdXRfb2JqZWN0X3AKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfdGFyZ2V0ICphb3V0X0B2YXJ7c2l6ZX1fc29tZV9hb3V0X29iamVjdF9wCi0JIChiZmQgKmFiZmQsCi0JICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApKCkpOwotCi1ERVNDUklQVElPTgotCVNvbWUgYS5vdXQgdmFyaWFudCB0aGlua3MgdGhhdCB0aGUgZmlsZSBvcGVuIGluIEB2YXJ7YWJmZH0KLQljaGVja2luZyBpcyBhbiBhLm91dCBmaWxlLiAgRG8gc29tZSBtb3JlIGNoZWNraW5nLCBhbmQgc2V0IHVwCi0JZm9yIGFjY2VzcyBpZiBpdCByZWFsbHkgaXMuICBDYWxsIGJhY2sgdG8gdGhlIGNhbGxpbmcKLQllbnZpcm9ubWVudCdzICJmaW5pc2ggdXAiIGZ1bmN0aW9uIGp1c3QgYmVmb3JlIHJldHVybmluZywgdG8KLQloYW5kbGUgYW55IGxhc3QtbWludXRlIHNldHVwLgotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1OQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSAoYWJmZCwgZXhlY3AsIGNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci17Ci0gIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICpyYXdwdHIsICpvbGRyYXdwdHI7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnJlc3VsdDsKLQotICByYXdwdHIgPSAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBvbGRyYXdwdHIgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGE7Ci0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IHJhd3B0cjsKLQotICAvKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgb2xkIHRkYXRhIHN0cnVjdC4KLSAgICAgSW4gcGFydGljdWxhciwgd2Ugd2FudCB0aGUgc3ViZm9ybWF0LCBzaW5jZSBmb3IgaHB1eCBpdCB3YXMgc2V0IGluCi0gICAgIGhwMzAwaHB1eC5jOnN3YXBfZXhlY19oZWFkZXJfaW4gYW5kIHdpbGwgYmUgdXNlZCBpbgotICAgICBocDMwMGhwdXguYzpjYWxsYmFjay4gICovCi0gIGlmIChvbGRyYXdwdHIgIT0gTlVMTCkKLSAgICAqYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gKm9sZHJhd3B0cjsKLQotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyID0gJnJhd3B0ci0+ZTsKLSAgKihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyKSA9ICpleGVjcDsJLyogQ29weSBpbiB0aGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3QgKi8KLSAgZXhlY3AgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyOwotCi0gIC8qIFNldCB0aGUgZmlsZSBmbGFncyAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGV4ZWNwLT5hX2Ryc2l6ZSB8fCBleGVjcC0+YV90cnNpemUpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICAvKiBTZXR0aW5nIG9mIEVYRUNfUCBoYXMgYmVlbiBkZWZlcnJlZCB0byB0aGUgYm90dG9tIG9mIHRoaXMgZnVuY3Rpb24gKi8KLSAgaWYgKGV4ZWNwLT5hX3N5bXMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKLSAgaWYgKE5fRFlOQU1JQygqZXhlY3ApKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gWk1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQgfCBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gUU1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQgfCBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLSAgICAgIGFkYXRhIChhYmZkKS5zdWJmb3JtYXQgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gTk1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBuX21hZ2ljOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBPTUFHSUMKLQkgICB8fCBOX01BR0lDICgqZXhlY3ApID09IEJNQUdJQykKLSAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2hvdWxkIGhhdmUgYmVlbiBjaGVja2VkIHdpdGggTl9CQURNQUcgYmVmb3JlIHRoaXMgcm91dGluZQotCSB3YXMgY2FsbGVkLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gZXhlY3AtPmFfZW50cnk7Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSAoYW91dF9zeW1ib2xfdHlwZSAqKU5VTEw7Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZXhlY3AtPmFfc3ltcyAvIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLQotICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBWNyBVbml4LiAgKi8KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgLyogVGhlIGRlZmF1bHQgc3ltYm9sIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBVbml4LiAqLwotICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotI2lmZGVmIFVTRV9NTUFQCi0gIGJmZF9pbml0X3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSAgYmZkX2luaXRfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotI2VuZGlmCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBOVUxMOwotICBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKSA9IE5VTEw7Ci0KLSAgaWYgKCEgTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2RhdGE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9ic3M7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5mbGFncyA9Ci0gICAgKGV4ZWNwLT5hX3Ryc2l6ZSAhPSAwCi0gICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQotICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUykpOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0KLSAgICAoZXhlY3AtPmFfZHJzaXplICE9IDAKLSAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCi0gICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQzsKLQotI2lmZGVmIFRISVNfSVNfT05MWV9ET0NVTUVOVEFUSU9OCi0gIC8qIFRoZSBjb21tb24gY29kZSBjYW4ndCBmaWxsIGluIHRoZXNlIHRoaW5ncyBiZWNhdXNlIHRoZXkgZGVwZW5kCi0gICAgIG9uIGVpdGhlciB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgdGV4dCBzZWdtZW50LCB0aGUgcm91bmRpbmcKLSAgICAgdXAgb2YgdmlydHVhbCBhZGRyZXNzZXMgYmV0d2VlbiBzZWdtZW50cywgb3IgdGhlIHN0YXJ0aW5nIGZpbGUKLSAgICAgcG9zaXRpb24gb2YgdGhlIHRleHQgc2VnbWVudCAtLSBhbGwgb2Ygd2hpY2ggdmFyaWVzIGFtb25nIGRpZmZlcmVudAotICAgICB2ZXJzaW9ucyBvZiBhLm91dC4gICovCi0KLSAgLyogQ2FsbCBiYWNrIHRvIHRoZSBmb3JtYXQtZGVwZW5kZW50IGNvZGUgdG8gZmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUKLSAgICAgZmllbGRzIGFuZCBkbyBhbnkgZnVydGhlciBjbGVhbnVwLiAgVGhpbmdzIHRoYXQgc2hvdWxkIGJlIGZpbGxlZAotICAgICBpbiBieSB0aGUgY2FsbGJhY2s6ICAqLwotCi0gIHN0cnVjdCBleGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPnNpemUgPSBOX1RYVFNJWkUoKmV4ZWNwKTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yYXdfc2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotICAvKiBkYXRhIGFuZCBic3MgYXJlIGFscmVhZHkgZmlsbGVkIGluIHNpbmNlIHRoZXkncmUgc28gc3RhbmRhcmQgKi8KLQotICAvKiBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSA9IE5fVFhUQUREUigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IE5fREFUQUREUigqZXhlY3ApOwotICBvYmpfYnNzc2VjICAoYWJmZCktPnZtYSA9IE5fQlNTQUREUigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fREFUT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBzd2l0Y2ggKE5fTUFDSFRZUEUgKCpleGVjX2hkciAoYWJmZCkpKSB7Ci0gIGRlZmF1bHQ6Ci0gICAgYWJmZC0+b2JqX2FyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgIGJyZWFrOwotICB9Ci0KLSAgYWRhdGEoYWJmZCktPnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLT5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLT5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLSAgLyogVGhlIGFyY2hpdGVjdHVyZSBpcyBlbmNvZGVkIGluIHZhcmlvdXMgd2F5cyBpbiB2YXJpb3VzIGEub3V0IHZhcmlhbnRzLAotICAgICBvciBpcyBub3QgZW5jb2RlZCBhdCBhbGwgaW4gc29tZSBvZiB0aGVtLiAgVGhlIHJlbG9jYXRpb24gc2l6ZSBkZXBlbmRzCi0gICAgIG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kIHRoZSBhLm91dCB2YXJpYW50LiAgRmluYWxseSwgdGhlIHJldHVybiB2YWx1ZQotICAgICBpcyB0aGUgYmZkX3RhcmdldCB2ZWN0b3IgaW4gdXNlLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gemVybyBhbmQKLSAgICAgc2V0IGJmZF9lcnJvciB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KLQotICAgICBGb3JtYXRzIHN1Y2ggYXMgYi5vdXQsIHdoaWNoIGhhdmUgYWRkaXRpb25hbCBmaWVsZHMgaW4gdGhlIGEub3V0Ci0gICAgIGhlYWRlciwgc2hvdWxkIGNvcGUgd2l0aCB0aGVtIGluIHRoaXMgY2FsbGJhY2sgYXMgd2VsbC4gICovCi0jZW5kaWYJCQkJLyogRE9DVU1FTlRBVElPTiAqLwotCi0gIHJlc3VsdCA9ICgqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkoYWJmZCk7Ci0KLSAgLyogTm93IHRoYXQgdGhlIHNlZ21lbnQgYWRkcmVzc2VzIGhhdmUgYmVlbiB3b3JrZWQgb3V0LCB0YWtlIGEgYmV0dGVyCi0gICAgIGd1ZXNzIGF0IHdoZXRoZXIgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZS4gIElmIHRoZSBlbnRyeSBwb2ludAotICAgICBpcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYXNzdW1lIGl0IGlzLiAgKFRoaXMgbWFrZXMgZmlsZXMKLSAgICAgZXhlY3V0YWJsZSBldmVuIGlmIHRoZWlyIGVudHJ5IHBvaW50IGFkZHJlc3MgaXMgMCwgYXMgbG9uZyBhcwotICAgICB0aGVpciB0ZXh0IHN0YXJ0cyBhdCB6ZXJvLikuCi0KLSAgICAgVGhpcyB0ZXN0IGhhZCB0byBiZSBjaGFuZ2VkIHRvIGRlYWwgd2l0aCBzeXN0ZW1zIHdoZXJlIHRoZSB0ZXh0IHNlZ21lbnQKLSAgICAgcnVucyBhdCBhIGRpZmZlcmVudCBsb2NhdGlvbiB0aGFuIHRoZSBkZWZhdWx0LiAgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGUKLSAgICAgZW50cnkgYWRkcmVzcyBjYW4gYXBwZWFyIHRvIGJlIG91dHNpZGUgdGhlIHRleHQgc2VnbWVudCwgdGh1cyBjYXVzaW5nIGFuCi0gICAgIGVycm9uZW91cyBjb25jbHVzaW9uIHRoYXQgdGhlIGZpbGUgaXNuJ3QgZXhlY3V0YWJsZS4KLQotICAgICBUbyBmaXggdGhpcywgd2Ugbm93IGFjY2VwdCBhbnkgbm9uLXplcm8gZW50cnkgcG9pbnQgYXMgYW4gaW5kaWNhdGlvbiBvZgotICAgICBleGVjdXRhYmlsaXR5LiAgVGhpcyB3aWxsIHdvcmsgbW9zdCBvZiB0aGUgdGltZSwgc2luY2Ugb25seSB0aGUgbGlua2VyCi0gICAgIHNldHMgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhhdCBpcyBsaWtlbHkgdG8gYmUgbm9uLXplcm8gZm9yIG1vc3Qgc3lzdGVtcy4gKi8KLQotICBpZiAoZXhlY3AtPmFfZW50cnkgIT0gMAotICAgICAgfHwgKGV4ZWNwLT5hX2VudHJ5ID49IG9ial90ZXh0c2VjKGFiZmQpLT52bWEKLQkgICYmIGV4ZWNwLT5hX2VudHJ5IDwgb2JqX3RleHRzZWMoYWJmZCktPnZtYSArIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSNpZmRlZiBTVEFUX0ZPUl9FWEVDCi0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKLQotICAgICAgLyogVGhlIG9yaWdpbmFsIGhldXJpc3RpYyBkb2Vzbid0IHdvcmsgaW4gc29tZSBpbXBvcnRhbnQgY2FzZXMuCi0gICAgICAgIFRoZSBhLm91dCBmaWxlIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGV4dCBzdGFydAotICAgICAgICBhZGRyZXNzLiAgRm9yIGZpbGVzIChsaWtlIGtlcm5lbHMpIGxpbmtlZCB0byBub24tc3RhbmRhcmQKLSAgICAgICAgYWRkcmVzc2VzIChsZCAtVHRleHQgbm5uKSB0aGUgZW50cnkgcG9pbnQgbWF5IG5vdCBiZSBiZXR3ZWVuCi0gICAgICAgIHRoZSBkZWZhdWx0IHRleHQgc3RhcnQgKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpIGFuZAotICAgICAgICAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgKyB0ZXh0IHNpemUuICBUaGlzIGlzIG5vdCBqdXN0IGEgbWFjaAotICAgICAgICBpc3N1ZS4gIE1hbnkga2VybmVscyBhcmUgbG9hZGVkIGF0IG5vbiBzdGFuZGFyZCBhZGRyZXNzZXMuICAqLwotICAgICAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwKLQkgICYmIChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpID09IDAKLQkgICYmIChmc3RhdChmaWxlbm8oKEZJTEUgKikgKGFiZmQtPmlvc3RyZWFtKSksICZzdGF0X2J1ZikgPT0gMCkKLQkgICYmICgoc3RhdF9idWYuc3RfbW9kZSAmIDAxMTEpICE9IDApKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogU1RBVF9GT1JfRVhFQyAqLwotCi0gIGlmIChyZXN1bHQpCi0gICAgewotI2lmIDAgLyogVGhlc2Ugc2hvdWxkIGJlIHNldCBjb3JyZWN0bHkgYW55d2F5cy4gICovCi0gICAgICBhYmZkLT5zZWN0aW9ucyA9IG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+bmV4dCA9IG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IG9ial9ic3NzZWMgKGFiZmQpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnJlZSAocmF3cHRyKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IG9sZHJhd3B0cjsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9ta29iamVjdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYW91dF9AdmFye3NpemV9X21rb2JqZWN0LCAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlJbml0aWFsaXplIEJGRCBAdmFye2FiZmR9IGZvciB1c2Ugd2l0aCBhLm91dCBmaWxlcy4KLSovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxta29iamVjdCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICpyYXdwdHI7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQotICAvKiBVc2UgYW4gaW50ZXJtZWRpYXRlIHZhcmlhYmxlIGZvciBjbGFyaXR5ICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKSk7Ci0KLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0gIGV4ZWNfaGRyIChhYmZkKSA9ICYocmF3cHRyLT5lKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfYnNzc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X21hY2hpbmVfdHlwZQotCi1TWU5PUFNJUwotCWVudW0gbWFjaGluZV90eXBlICBhb3V0X0B2YXJ7c2l6ZX1fbWFjaGluZV90eXBlCi0JIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1ERVNDUklQVElPTgotCUtlZXAgdHJhY2sgb2YgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBmb3IKLQlhLm91dCdzLiBSZXR1cm4gdGhlIDw8bWFjaGluZV90eXBlPj4gZm9yIGEgcGFydGljdWxhcgotCWFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSwgb3IgPDxNX1VOS05PV04+PiBpZiB0aGF0IGV4YWN0IGFyY2hpdGVjdHVyZQotCWFuZCBtYWNoaW5lIGNhbid0IGJlIHJlcHJlc2VudGVkIGluIGEub3V0IGZvcm1hdC4KLQotCUlmIHRoZSBhcmNoaXRlY3R1cmUgaXMgdW5kZXJzdG9vZCwgbWFjaGluZSB0eXBlIDAgKGRlZmF1bHQpCi0JaXMgYWx3YXlzIHVuZGVyc3Rvb2QuCi0qLwotCi1lbnVtIG1hY2hpbmVfdHlwZQotTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkgKGFyY2gsIG1hY2hpbmUsIHVua25vd24pCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci0gICAgIGJvb2xlYW4gKnVua25vd247Ci17Ci0gIGVudW0gbWFjaGluZV90eXBlIGFyY2hfZmxhZ3M7Ci0KLSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgKnVua25vd24gPSB0cnVlOwotCi0gIHN3aXRjaCAoYXJjaCkgewotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGlmIChtYWNoaW5lID09IDAKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfdjkpCi0gICAgICBhcmNoX2ZsYWdzID0gTV9TUEFSQzsKLSAgICBlbHNlIGlmIChtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0KQotICAgICAgYXJjaF9mbGFncyA9IE1fU1BBUkNMRVQ7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgIHN3aXRjaCAobWFjaGluZSkgewotICAgIGNhc2UgMDoJCSAgYXJjaF9mbGFncyA9IE1fNjgwMTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDAwOiBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyAqdW5rbm93biA9IGZhbHNlOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAxMDogYXJjaF9mbGFncyA9IE1fNjgwMTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDIwOiBhcmNoX2ZsYWdzID0gTV82ODAyMDsgYnJlYWs7Ci0gICAgZGVmYXVsdDoJCSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICBpZiAobWFjaGluZSA9PSAwKQlhcmNoX2ZsYWdzID0gTV8zODY7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNXzI5SzsKLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICBpZiAobWFjaGluZSA9PSAwKQlhcmNoX2ZsYWdzID0gTV9BUk07Ci0gICAgYnJlYWs7Ci0gICAgCi0gIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM2MDAwOgotICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMTA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDEwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MzAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ0MDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDYwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMTAwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMTY6Ci0gICAgICAvKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIE1JUFMzIG9yIE1JUFM0LiAgKi8KLSAgICAgIGFyY2hfZmxhZ3MgPSBNX01JUFMyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIDA6ICAgIAkJYXJjaF9mbGFncyA9IE1fTlMzMjUzMjsgYnJlYWs7Ci0gICAgY2FzZSAzMjAzMjoJCWFyY2hfZmxhZ3MgPSBNX05TMzIwMzI7IGJyZWFrOwotICAgIGNhc2UgMzI1MzI6CQlhcmNoX2ZsYWdzID0gTV9OUzMyNTMyOyBicmVhazsKLSAgICBkZWZhdWx0OgkJYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICp1bmtub3duID0gZmFsc2U7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICB9Ci0KLSAgaWYgKGFyY2hfZmxhZ3MgIT0gTV9VTktOT1dOKQotICAgICp1bmtub3duID0gZmFsc2U7Ci0KLSAgcmV0dXJuIGFyY2hfZmxhZ3M7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X3NldF9hcmNoX21hY2gKLQotU1lOT1BTSVMKLQlib29sZWFuIGFvdXRfQHZhcntzaXplfV9zZXRfYXJjaF9tYWNoLAotCSAoYmZkICosCi0JICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCB0aGUgbWFjaGluZSBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlCi0JdmFsdWVzIEB2YXJ7YXJjaH0gYW5kIEB2YXJ7bWFjaGluZX0uICBWZXJpZnkgdGhhdCBAdmFye2FiZmR9J3MgZm9ybWF0Ci0JY2FuIHN1cHBvcnQgdGhlIGFyY2hpdGVjdHVyZSByZXF1aXJlZC4KLSovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBib29sZWFuIHVua25vd247Ci0KLSAgICAgIE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIChhcmNoLCBtYWNoaW5lLCAmdW5rbm93bik7Ci0gICAgICBpZiAodW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnkgKi8KLSAgc3dpdGNoIChhcmNoKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuICgqYW91dF9iYWNrZW5kX2luZm8oYWJmZCktPnNldF9zaXplcykgKGFiZmQpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X29fbWFnaWMgKGFiZmQsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgZmlsZV9wdHIgcG9zID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkID0gMDsKLQotICAvKiBUZXh0LiAgKi8KLSAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIGlmICghb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hID0gdm1hOwotICBlbHNlCi0gICAgdm1hID0gb2JqX3RleHRzZWMoYWJmZCktPnZtYTsKLQotICBwb3MgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogRGF0YS4gICovCi0gIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0jaWYgMAkgICAgLyogPz8gRG9lcyBhbGlnbm1lbnQgaW4gdGhlIGZpbGUgaW1hZ2UgcmVhbGx5IG1hdHRlcj8gKi8KLSAgICAgIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9kYXRhc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotI2VuZGlmCi0gICAgICBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgICAgIHBvcyArPSBwYWQ7Ci0gICAgICB2bWEgKz0gcGFkOwotICAgICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgcG9zICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHZtYSArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSNpZiAwCi0gICAgICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotI2VuZGlmCi0gICAgICBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgICAgIHBvcyArPSBwYWQ7Ci0gICAgICB2bWEgKz0gcGFkOwotICAgICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hID0gdm1hOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBWTUEgb2YgdGhlIC5ic3Mgc2VjdGlvbiBpcyBzZXQgYnkgdGhlIHRoZSBWTUEgb2YgdGhlCi0gICAgICAgICAuZGF0YSBzZWN0aW9uIHBsdXMgdGhlIHNpemUgb2YgdGhlIC5kYXRhIHNlY3Rpb24uICBXZSBtYXkKLSAgICAgICAgIG5lZWQgdG8gYWRkIHBhZGRpbmcgYnl0ZXMgdG8gbWFrZSB0aGlzIHRydWUuICAqLwotICAgICAgcGFkID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSAtIHZtYTsKLSAgICAgIGlmIChwYWQgPiAwKQotCXsKLQkgIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLQkgIHBvcyArPSBwYWQ7Ci0JfQotICAgIH0KLSAgb2JqX2Jzc3NlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLQotICAvKiBGaXggdXAgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLSAgZXhlY3AtPmFfdGV4dCA9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9ic3MgPSBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIE5fU0VUX01BR0lDICgqZXhlY3AsIE9NQUdJQyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfel9tYWdpYyAoYWJmZCwgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBiZmRfc2l6ZV90eXBlIGRhdGFfcGFkLCB0ZXh0X3BhZDsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSAqYWJkcDsKLSAgaW50IHp0aWg7CQkJLyogTm9uemVybyBpZiB0ZXh0IGluY2x1ZGVzIGV4ZWMgaGVhZGVyLiAgKi8KLSAgCi0gIGFiZHAgPSBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCk7Ci0KLSAgLyogVGV4dC4gICovCi0gIHp0aWggPSAoYWJkcCAhPSBOVUxMCi0JICAmJiAoYWJkcC0+dGV4dF9pbmNsdWRlc19oZWFkZXIKLQkgICAgICB8fCBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IHFfbWFnaWNfZm9ybWF0KSk7Ci0gIG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zID0gKHp0aWgKLQkJCQk/IGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZQotCQkJCTogYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSk7Ci0gIGlmICghIG9ial90ZXh0c2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotICAgICAgLyogPz8gRG8gd2UgcmVhbGx5IG5lZWQgdG8gY2hlY2sgZm9yIHJlbG9jcyBoZXJlPyAgKi8KLSAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEgPSAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKQotCQkJCT8gMAotCQkJCTogKHp0aWgKLQkJCQkgICA/IChhYmRwLT5kZWZhdWx0X3RleHRfdm1hCi0JCQkJICAgICAgKyBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUpCi0JCQkJICAgOiBhYmRwLT5kZWZhdWx0X3RleHRfdm1hKSk7Ci0gICAgICB0ZXh0X3BhZCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIC50ZXh0IHNlY3Rpb24gaXMgYmVpbmcgbG9hZGVkIGF0IGFuIHVudXN1YWwgYWRkcmVzcy4gIFdlCi0gICAgICAgICBtYXkgbmVlZCB0byBwYWQgaXQgc3VjaCB0aGF0IHRoZSAuZGF0YSBzZWN0aW9uIHN0YXJ0cyBhdCBhIHBhZ2UKLSAgICAgICAgIGJvdW5kYXJ5LiAgKi8KLSAgICAgIGlmICh6dGloKQotCXRleHRfcGFkID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSkKLQkJICAgICYgKGFkYXRhIChhYmZkKS5wYWdlX3NpemUgLSAxKSk7Ci0gICAgICBlbHNlCi0JdGV4dF9wYWQgPSAoKC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0JCSAgICAmIChhZGF0YSAoYWJmZCkucGFnZV9zaXplIC0gMSkpOwotICAgIH0KLQotICAvKiBGaW5kIHN0YXJ0IG9mIGRhdGEuICAqLwotICBpZiAoenRpaCkKLSAgICB7Ci0gICAgICB0ZXh0X2VuZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyArIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICAgICAgdGV4dF9wYWQgKz0gQkZEX0FMSUdOICh0ZXh0X2VuZCwgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSkgLSB0ZXh0X2VuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgaWYgcGFnZV9zaXplID09IHptYWdpY19kaXNrX2Jsb2NrX3NpemUsIHRoZW4KLQkgZmlsZXBvcyA9PSBwYWdlX3NpemUsIGFuZCB0aGlzIGNhc2UgaXMgdGhlIHNhbWUgYXMgdGhlIHp0aWgKLQkgY2FzZS4gICovCi0gICAgICB0ZXh0X2VuZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICAgICAgdGV4dF9wYWQgKz0gQkZEX0FMSUdOICh0ZXh0X2VuZCwgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSkgLSB0ZXh0X2VuZDsKLSAgICAgIHRleHRfZW5kICs9IG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvczsKLSAgICB9Ci0gIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gdGV4dF9wYWQ7Ci0gIHRleHRfZW5kICs9IHRleHRfcGFkOwotCi0gIC8qIERhdGEuICAqLwotICBpZiAoIW9ial9kYXRhc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotICAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgICB2bWEgPSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hICsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgICAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplKTsKLSAgICB9Ci0gIGlmIChhYmRwICYmIGFiZHAtPnptYWdpY19tYXBwZWRfY29udGlndW91cykKLSAgICB7Ci0gICAgICB0ZXh0X3BhZCA9IChvYmpfZGF0YXNlYyhhYmZkKS0+dm1hCi0JCSAgLSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hCi0JCSAgLSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gdGV4dF9wYWQ7Ci0gICAgfQotICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IChvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcwotCQkJCSsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSk7Ci0gIAotICAvKiBGaXggdXAgZXhlYyBoZWFkZXIgd2hpbGUgd2UncmUgYXQgaXQuICAqLwotICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgaWYgKHp0aWggJiYgKCFhYmRwIHx8IChhYmRwICYmICFhYmRwLT5leGVjX2hlYWRlcl9ub3RfY291bnRlZCkpKQotICAgIGV4ZWNwLT5hX3RleHQgKz0gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBxX21hZ2ljX2Zvcm1hdCkKLSAgICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBRTUFHSUMpOwotICBlbHNlCi0gICAgTl9TRVRfTUFHSUMgKCpleGVjcCwgWk1BR0lDKTsKLQotICAvKiBTcGVjIHNheXMgZGF0YSBzZWN0aW9uIHNob3VsZCBiZSByb3VuZGVkIHVwIHRvIHBhZ2UgYm91bmRhcnkuICAqLwotICBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplCi0gICAgPSBhbGlnbl9wb3dlciAob2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJICAgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKTsKLSAgZXhlY3AtPmFfZGF0YSA9IEJGRF9BTElHTiAob2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJCSAgICAgYWRhdGEoYWJmZCkucGFnZV9zaXplKTsKLSAgZGF0YV9wYWQgPSBleGVjcC0+YV9kYXRhIC0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBpZiAoIW9ial9ic3NzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSAob2JqX2RhdGFzZWMoYWJmZCktPnZtYQotCQkJICAgICArIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUpOwotICAvKiBJZiB0aGUgQlNTIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGRhdGEgc2VjdGlvbiBhbmQgZXh0cmEgc3BhY2UKLSAgICAgaW4gdGhlIHBhZ2UgaXMgbGVmdCBhZnRlciB0aGUgZGF0YSBzZWN0aW9uLCBmdWRnZSBkYXRhCi0gICAgIGluIHRoZSBoZWFkZXIgc28gdGhhdCB0aGUgYnNzIHNlY3Rpb24gbG9va3Mgc21hbGxlciBieSB0aGF0Ci0gICAgIGFtb3VudC4gIFdlJ2xsIHN0YXJ0IHRoZSBic3Mgc2VjdGlvbiB0aGVyZSwgYW5kIGxpZSB0byB0aGUgT1MuCi0gICAgIChOb3RlIHRoYXQgYSBsaW5rZXIgc2NyaXB0LCBhcyB3ZWxsIGFzIHRoZSBhYm92ZSBhc3NpZ25tZW50LAotICAgICBjb3VsZCBoYXZlIGV4cGxpY2l0bHkgc2V0IHRoZSBCU1Mgdm1hIHRvIGltbWVkaWF0ZWx5IGZvbGxvdwotICAgICB0aGUgZGF0YSBzZWN0aW9uLikgICovCi0gIGlmIChhbGlnbl9wb3dlciAob2JqX2Jzc3NlYyhhYmZkKS0+dm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgICA9PSBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hICsgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICBleGVjcC0+YV9ic3MgPSAoZGF0YV9wYWQgPiBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemUpID8gMCA6Ci0gICAgICBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemUgLSBkYXRhX3BhZDsKLSAgZWxzZQotICAgIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9uX21hZ2ljIChhYmZkLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIGZpbGVfcHRyIHBvcyA9IGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkOwotICAKLSAgLyogVGV4dC4gICovCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBpZiAoIW9ial90ZXh0c2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgZWxzZQotICAgIHZtYSA9IG9ial90ZXh0c2VjKGFiZmQpLT52bWE7Ci0gIHBvcyArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBEYXRhLiAgKi8KLSAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hID0gQkZEX0FMSUdOICh2bWEsIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSk7Ci0gIHZtYSA9IG9ial9kYXRhc2VjKGFiZmQpLT52bWE7Ci0gIAotICAvKiBTaW5jZSBCU1MgZm9sbG93cyBkYXRhIGltbWVkaWF0ZWx5LCBzZWUgaWYgaXQgbmVlZHMgYWxpZ25tZW50LiAgKi8KLSAgdm1hICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7Ci0gIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICBwb3MgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBpZiAoIW9ial9ic3NzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfYnNzc2VjKGFiZmQpLT52bWE7Ci0KLSAgLyogRml4IHVwIGV4ZWMgaGVhZGVyLiAgKi8KLSAgZXhlY3AtPmFfdGV4dCA9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9ic3MgPSBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIE5fU0VUX01BR0lDICgqZXhlY3AsIE5NQUdJQyk7Ci19Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCB0ZXh0X3NpemUsIHRleHRfZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZTsKLSAgICAgZmlsZV9wdHIgKnRleHRfZW5kIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYWRhdGEoYWJmZCkubWFnaWMgIT0gdW5kZWNpZGVkX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgPQotICAgIGFsaWduX3Bvd2VyKG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0gICp0ZXh0X3NpemUgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgLyogUnVsZSAoaGV1cmlzdGljKSBmb3Igd2hlbiB0byBwYWQgdG8gYSBuZXcgcGFnZS4gIE5vdGUgdGhhdCB0aGVyZQotICAgICBhcmUgKGF0IGxlYXN0KSB0d28gd2F5cyBkZW1hbmQtcGFnZWQgKFpNQUdJQykgZmlsZXMgaGF2ZSBiZWVuCi0gICAgIGhhbmRsZWQuICBNb3N0IEJlcmtlbGV5LWJhc2VkIHN5c3RlbXMgc3RhcnQgdGhlIHRleHQgc2VnbWVudCBhdAotICAgICAoVEFSR0VUX1BBR0VfU0laRSkuICBIb3dldmVyLCBuZXdlciB2ZXJzaW9ucyBvZiBTVU5PUyBzdGFydCB0aGUgdGV4dAotICAgICBzZWdtZW50IHJpZ2h0IGFmdGVyIHRoZSBleGVjIGhlYWRlcjsgdGhlIGxhdHRlciBpcyBjb3VudGVkIGluIHRoZQotICAgICB0ZXh0IHNlZ21lbnQgc2l6ZSwgYW5kIGlzIHBhZ2VkIGluIGJ5IHRoZSBrZXJuZWwgd2l0aCB0aGUgcmVzdCBvZgotICAgICB0aGUgdGV4dC4gKi8KLQotICAvKiBUaGlzIHBlcmhhcHMgaXNuJ3QgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzLCBidXQgbWFkZSBpdCBzaW1wbGVyIGZvciBtZQotICAgICB0byB1bmRlcnN0YW5kIGVub3VnaCB0byBpbXBsZW1lbnQgaXQuICBCZXR0ZXIgd291bGQgcHJvYmFibHkgYmUgdG8gZ28KLSAgICAgcmlnaHQgZnJvbSBCRkQgZmxhZ3MgdG8gYWxpZ25tZW50L3Bvc2l0aW9uaW5nIGNoYXJhY3RlcmlzdGljcy4gIEJ1dCB0aGUKLSAgICAgb2xkIGNvZGUgd2FzIHNsb3BweSBlbm91Z2ggYWJvdXQgaGFuZGxpbmcgdGhlIGZsYWdzLCBhbmQgaGFkIGVub3VnaAotICAgICBvdGhlciBtYWdpYywgdGhhdCBpdCB3YXMgYSBsaXR0bGUgaGFyZCBmb3IgbWUgdG8gdW5kZXJzdGFuZC4gIEkgdGhpbmsKLSAgICAgSSB1bmRlcnN0YW5kIGl0IGJldHRlciBub3csIGJ1dCBJIGhhdmVuJ3QgdGltZSB0byBkbyB0aGUgY2xlYW51cCB0aGlzCi0gICAgIG1pbnV0ZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkKLSAgICAvKiBXaGV0aGVyIG9yIG5vdCBXUF9URVhUIGlzIHNldCAtLSBsZXQgRF9QQUdFRCBvdmVycmlkZS4gICovCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSBuX21hZ2ljOwotICBlbHNlCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotCi0jaWZkZWYgQkZEX0FPVVRfREVCVUcgLyogcmVxdWlyZXMgZ2NjMiAqLwotI2lmIF9fR05VQ19fID49IDIKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXMgdGV4dD08JXgsJXgsJXg+IGRhdGE9PCV4LCV4LCV4PiBic3M9PCV4LCV4LCV4PlxuIiwKLQkgICAoeyBjaGFyICpzdHI7Ci0JICAgICAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykgewotCSAgICAgIGNhc2Ugbl9tYWdpYzogc3RyID0gIk5NQUdJQyI7IGJyZWFrOwotCSAgICAgIGNhc2Ugb19tYWdpYzogc3RyID0gIk9NQUdJQyI7IGJyZWFrOwotCSAgICAgIGNhc2Ugel9tYWdpYzogc3RyID0gIlpNQUdJQyI7IGJyZWFrOwotCSAgICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotCSAgICAgIH0KLQkgICAgICBzdHI7Ci0JICAgIH0pLAotCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIsCi0JICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2RhdGFzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlciwKLQkgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEsIG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBvX21hZ2ljOgotICAgICAgYWRqdXN0X29fbWFnaWMgKGFiZmQsIGV4ZWNwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugel9tYWdpYzoKLSAgICAgIGFkanVzdF96X21hZ2ljIChhYmZkLCBleGVjcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG5fbWFnaWM6Ci0gICAgICBhZGp1c3Rfbl9tYWdpYyAoYWJmZCwgZXhlY3ApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotI2lmZGVmIEJGRF9BT1VUX0RFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgICAgICB0ZXh0PTwleCwleCwleD4gZGF0YT08JXgsJXgsJXg+IGJzcz08JXgsJXg+XG4iLAotCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zLAotCSAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEsIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zLAotCSAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fbmV3X3NlY3Rpb25faG9vawotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGFvdXRfQHZhcntzaXplfV9uZXdfc2VjdGlvbl9ob29rLAotCSAgIChiZmQgKmFiZmQsCi0JICAgIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbGVkIGJ5IHRoZSBCRkQgaW4gcmVzcG9uc2UgdG8gYSBAY29kZXtiZmRfbWFrZV9zZWN0aW9ufQotCXJlcXVlc3QuCi0qLwotYm9vbGVhbgotTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICAvKiBhbGlnbiB0byBkb3VibGUgYXQgbGVhc3QgKi8KLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8oYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0KLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gIHsKLSAgICBpZiAob2JqX3RleHRzZWMoYWJmZCkgPT0gTlVMTCAmJiAhc3RyY21wKG5ld3NlY3QtPm5hbWUsICIudGV4dCIpKSB7Ci0Jb2JqX3RleHRzZWMoYWJmZCk9IG5ld3NlY3Q7Ci0JbmV3c2VjdC0+dGFyZ2V0X2luZGV4ID0gTl9URVhUOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgaWYgKG9ial9kYXRhc2VjKGFiZmQpID09IE5VTEwgJiYgIXN0cmNtcChuZXdzZWN0LT5uYW1lLCAiLmRhdGEiKSkgewotCW9ial9kYXRhc2VjKGFiZmQpID0gbmV3c2VjdDsKLQluZXdzZWN0LT50YXJnZXRfaW5kZXggPSBOX0RBVEE7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICBpZiAob2JqX2Jzc3NlYyhhYmZkKSA9PSBOVUxMICYmICFzdHJjbXAobmV3c2VjdC0+bmFtZSwgIi5ic3MiKSkgewotCW9ial9ic3NzZWMoYWJmZCkgPSBuZXdzZWN0OwotCW5ld3NlY3QtPnRhcmdldF9pbmRleCA9IE5fQlNTOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gIH0KLQotICAvKiBXZSBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgc2VjdGlvbnMgaW50ZXJuYWxseSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fY29udGVudHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiAhPSBvYmpfdGV4dHNlYyAoYWJmZCkKLSAgICAgICYmIHNlY3Rpb24gIT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlYWQgdGhlIGV4dGVybmFsIHN5bWJvbHMgZnJvbSBhbiBhLm91dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotCi0gICAgICBjb3VudCA9IGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zIC8gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBpZiAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwKLQkJCSAgICAgICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywKLQkJCSAgICAgICAmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCksIHRydWUpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bXMgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIG9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpLmRhdGE7Ci0jZWxzZQotICAgICAgLyogV2UgYWxsb2NhdGUgdXNpbmcgbWFsbG9jIHRvIG1ha2UgdGhlIHZhbHVlcyBlYXN5IHRvIGZyZWUKLQkgbGF0ZXIgb24uICBJZiB3ZSBwdXQgdGhlbSBvbiB0aGUgb2JqYWxsb2MgaXQgbWlnaHQgbm90IGJlCi0JIHBvc3NpYmxlIHRvIGZyZWUgdGhlbS4gICovCi0gICAgICBzeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkgICAgICBiZmRfbWFsbG9jICgoc2l6ZV90KSBjb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKTsKLSAgICAgIGlmIChzeW1zID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCAmJiBjb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzeW1zLCAxLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywgYWJmZCkKLQkgICAgICAhPSBleGVjX2hkciAoYWJmZCktPmFfc3ltcykpCi0JewotCSAgZnJlZSAoc3ltcyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotI2VuZGlmCi0KLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPSBjb3VudDsKLSAgICB9Ci0gICAgICAKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID09IE5VTEwKLSAgICAgICYmIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBzdHJpbmdfY2hhcnNbQllURVNfSU5fV09SRF07Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cmluZ3NpemU7Ci0gICAgICBjaGFyICpzdHJpbmdzOwotCi0gICAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBzdHJpbmdfY2hhcnMsIEJZVEVTX0lOX1dPUkQsIDEsIGFiZmQpCi0JICAgICAgIT0gQllURVNfSU5fV09SRCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyaW5nc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBzdHJpbmdfY2hhcnMpOwotCi0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGlmIChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBzdHJpbmdzaXplLAotCQkJICAgICAgICZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSwgdHJ1ZSkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyaW5ncyA9IChjaGFyICopIG9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpLmRhdGE7Ci0jZWxzZQotICAgICAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN0cmluZ3NpemUgKyAxKTsKLSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTa2lwIHNwYWNlIGZvciB0aGUgc3RyaW5nIGNvdW50IGluIHRoZSBidWZmZXIgZm9yIGNvbnZlbmllbmNlCi0JIHdoZW4gdXNpbmcgaW5kZXhlcy4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKHN0cmluZ3MgKyBCWVRFU19JTl9XT1JELCAxLCBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCwKLQkJICAgIGFiZmQpCi0JICAhPSBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCkKLQl7Ci0JICBmcmVlIChzdHJpbmdzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogRW5zdXJlIHRoYXQgYSB6ZXJvIGluZGV4IHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcuICAqLwotICAgICAgc3RyaW5nc1swXSA9ICdcMCc7Ci0KLSAgICAgIHN0cmluZ3Nbc3RyaW5nc2l6ZSAtIDFdID0gMDsKLQotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBzdHJpbmdzOwotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUgKGFiZmQpID0gc3RyaW5nc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBhLm91dCBzeW1ib2wgaW50byBhIEJGRCBzeW1ib2wuICBUaGUgZGVzYywgb3RoZXIsIHR5cGUKLSAgIGFuZCBzeW1ib2wtPnZhbHVlIGZpZWxkcyBvZiBDQUNIRV9QVFIgd2lsbCBiZSBzZXQgZnJvbSB0aGUgYS5vdXQKLSAgIG5saXN0IHN0cnVjdHVyZS4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKLSAgIHN5bWJvbC0+ZmxhZ3MgYW5kIHN5bWJvbC0+c2VjdGlvbiwgYW5kIGFkanVzdGluZyBzeW1ib2wtPnZhbHVlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZV9wdHI7Ci17Ci0gIGZsYWd3b3JkIHZpc2libGU7Ci0KLSAgaWYgKChjYWNoZV9wdHItPnR5cGUgJiBOX1NUQUIpICE9IDAKLSAgICAgIHx8IGNhY2hlX3B0ci0+dHlwZSA9PSBOX0ZOKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLQotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0gICAgICAvKiBXb3JrIG91dCB0aGUgc3ltYm9sIHNlY3Rpb24uICAqLwotICAgICAgc3dpdGNoIChjYWNoZV9wdHItPnR5cGUgJiBOX1RZUEUpCi0JewotCWNhc2UgTl9URVhUOgotCWNhc2UgTl9GTjoKLQkgIHNlYyA9IG9ial90ZXh0c2VjIChhYmZkKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9EQVRBOgotCSAgc2VjID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0JTUzoKLQkgIHNlYyA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIE5fQUJTOgotCSAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IHNlYzsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IHNlYy0+dm1hOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBkZWZhdWx0IHZpc2liaWxpdHkuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFsbCB0eXBlcywgc28KLSAgICAgd2UganVzdCBob2xkIGl0IGluIGEgbG9jYWwgdmFyaWFibGUgdG8gdXNlIGlmIHdhbnRlZC4gICovCi0gIGlmICgoY2FjaGVfcHRyLT50eXBlICYgTl9FWFQpID09IDApCi0gICAgdmlzaWJsZSA9IEJTRl9MT0NBTDsKLSAgZWxzZQotICAgIHZpc2libGUgPSBCU0ZfR0xPQkFMOwotCi0gIHN3aXRjaCAoY2FjaGVfcHRyLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgTl9BQlM6IGNhc2UgTl9BQlMgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgICAgaWYgKGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlICE9IDApCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gMDsKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1RFWFQ6IGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE5fU0VUViBzeW1ib2xzIHVzZWQgdG8gcmVwcmVzZW50IHNldCB2ZWN0b3JzIHBsYWNlZCBpbiB0aGUKLQkgZGF0YSBzZWN0aW9uLiAgVGhleSBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZC4gIFRoZW9yZXRpY2FsbHksCi0JIGl0IHdhcyBwb3NzaWJsZSB0byBleHRyYWN0IHRoZSBlbnRyaWVzIGFuZCBjb21iaW5lIHRoZW0gd2l0aAotCSBuZXcgb25lcywgYWx0aG91Z2ggSSBkb24ndCBrbm93IGlmIHRoYXQgd2FzIGV2ZXIgYWN0dWFsbHkKLQkgZG9uZS4gIFVubGVzcyB0aGF0IGZlYXR1cmUgaXMgcmVzdG9yZWQsIHRyZWF0IHRoZW0gYXMgZGF0YQotCSBzeW1ib2xzLiAgKi8KLSAgICBjYXNlIE5fU0VUVjogY2FzZSBOX1NFVFYgfCBOX0VYVDoKLSAgICBjYXNlIE5fREFUQTogY2FzZSBOX0RBVEEgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9CU1M6IGNhc2UgTl9CU1MgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gdmlzaWJsZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NFVEE6IGNhc2UgTl9TRVRBIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVFQ6IGNhc2UgTl9TRVRUIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVEQ6IGNhc2UgTl9TRVREIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6Ci0gICAgICB7Ci0JLyogVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCB1c2VkIHRvIGJlIHVzZWQgdG8gbWFrZQotICAgICAgICAgICB0aGUgbGlua2VyIGhhbmRsZSBzZXQgc3ltYm9scywgYnV0IHRoZXkgYXJlIG5vdyBoYW5kbGVkIGluCi0gICAgICAgICAgIHRoZSBhZGRfc3ltYm9scyByb3V0aW5lIGluc3RlYWQuICAqLwotI2lmIDAKLQlhc2VjdGlvbiAqc2VjdGlvbjsKLQlhcmVsZW50X2NoYWluICpyZWxvYzsKLQlhc2VjdGlvbiAqaW50b19zZWN0aW9uOwotCi0JLyogVGhpcyBpcyBhIHNldCBzeW1ib2wuICBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIHRoZSBuYW1lCi0JICAgb2YgdGhlIHNldCAoZS5nLiwgX19DVE9SX0xJU1RfXykuICBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbAotCSAgIGlzIHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNldC4gIFdlIGNyZWF0ZSBhIHNlY3Rpb24gd2l0aAotCSAgIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN5bWJvbCwgYW5kIGFkZCBhIHJlbG9jIHRvIGluc2VydCB0aGUKLQkgICBhcHByb3ByaWF0ZSB2YWx1ZSBpbnRvIHRoZSBzZWN0aW9uLgotCi0JICAgVGhpcyBhY3Rpb24gaXMgYWN0dWFsbHkgb2Jzb2xldGU7IGl0IHVzZWQgdG8gbWFrZSB0aGUKLQkgICBsaW5rZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLCBidXQgdGhlIGxpbmtlciBubyBsb25nZXIgdXNlcwotCSAgIHRoaXMgZnVuY3Rpb24uICAqLwotCi0Jc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKLQlpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgewotCSAgICBjaGFyICpjb3B5OwotCi0JICAgIGNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoY2FjaGVfcHRyLT5zeW1ib2wubmFtZSkgKyAxKTsKLQkgICAgaWYgKGNvcHkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgc3RyY3B5IChjb3B5LCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKLQkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGNvcHkpOwotCSAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCXJlbG9jID0gKGFyZWxlbnRfY2hhaW4gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnRfY2hhaW4pKTsKLQlpZiAocmVsb2MgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIEJ1aWxkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgdGhlIGNvbnN0cnVjdG9yLiAgKi8KLQlzd2l0Y2ggKGNhY2hlX3B0ci0+dHlwZSAmIE5fVFlQRSkKLQkgIHsKLQkgIGNhc2UgTl9TRVRBOgotCSAgICBpbnRvX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0FCUzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0VUVDoKLQkgICAgaW50b19zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX1RFWFQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEQ6Ci0JICAgIGludG9fc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9EQVRBOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRCOgotCSAgICBpbnRvX3NlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9CU1M7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIHBvaW50aW5nIGludG8gdGhlIGNvbnN0cnVjdG9yIHNlY3Rpb24KLQkgICBwb2ludGluZyBhdCB0aGUgc3ltYm9sIGluIHRoZSBzZXQgdmVjdG9yIHNwZWNpZmllZC4gICovCi0JcmVsb2MtPnJlbGVudC5hZGRlbmQgPSBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZTsKLQljYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gaW50b19zZWN0aW9uOwotCXJlbG9jLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBpbnRvX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCi0JLyogV2UgbW9kaWZ5IHRoZSBzeW1ib2wgdG8gYmVsb25nIHRvIGEgc2VjdGlvbiBkZXBlbmRpbmcgdXBvbgotCSAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGFuZCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24KLQkgICB0byBjb250YWluIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sLiBCdWlsZCBhIHJlbG9jIGVudHJ5IHRvCi0JICAgcmVsb2NhdGUgdG8gdGhpcyBzeW1ib2wgYXR0YWNoZWQgdG8gdGhpcyBzZWN0aW9uLiAgKi8KLQlzZWN0aW9uLT5mbGFncyA9IFNFQ19DT05TVFJVQ1RPUiB8IFNFQ19SRUxPQzsKLQotCXNlY3Rpb24tPnJlbG9jX2NvdW50Kys7Ci0Jc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotCXJlbG9jLT5uZXh0ID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0Jc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW4gPSByZWxvYzsKLQlyZWxvYy0+cmVsZW50LmFkZHJlc3MgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0Jc2VjdGlvbi0+X3Jhd19zaXplICs9IEJZVEVTX0lOX1dPUkQ7Ci0KLQlyZWxvYy0+cmVsZW50Lmhvd3RvID0gQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhhYmZkKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotCXN3aXRjaCAoY2FjaGVfcHRyLT50eXBlICYgTl9UWVBFKQotCSAgewotCSAgY2FzZSBOX1NFVEE6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRUOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVREOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRCOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0FSTklORzoKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIHRoZSB0ZXh0IG9mIGEgd2FybmluZyBtZXNzYWdlLiAgVGhlIG5leHQKLQkgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdG8gYXNzb2NpYXRlIHRoZSB3YXJuaW5nIHdpdGguICBJZiBhCi0JIHJlZmVyZW5jZSBpcyBtYWRlIHRvIHRoYXQgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiAgKi8KLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORyB8IEJTRl9XQVJOSU5HOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9JTkRSOiBjYXNlIE5fSU5EUiB8IE5fRVhUOgotICAgICAgLyogQW4gaW5kaXJlY3Qgc3ltYm9sLiAgVGhpcyBjb25zaXN0cyBvZiB0d28gc3ltYm9scyBpbiBhIHJvdy4KLQkgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgaW5kaXJlY3Rpb24uICBUaGUgc2Vjb25kCi0JIHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LiAgQSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0Ci0JIHN5bWJvbCBiZWNvbWVzIGEgcmVmZXJlbmNlIHRvIHRoZSBzZWNvbmQuICAqLwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HIHwgQlNGX0lORElSRUNUIHwgdmlzaWJsZTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS1U6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLQToKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1dFQUtUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLRDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS0I6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGZpZWxkcyBvZiBTWU1fUE9JTlRFUiBhY2NvcmRpbmcgdG8gQ0FDSEVfUFRSLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBjYWNoZV9wdHIsIHN5bV9wb2ludGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fcG9pbnRlcjsKLXsKLSAgYmZkX3ZtYSB2YWx1ZSA9IGNhY2hlX3B0ci0+dmFsdWU7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgb2ZmOwotCi0gIC8qIE1hc2sgb3V0IGFueSBleGlzdGluZyB0eXBlIGJpdHMgaW4gY2FzZSBjb3B5aW5nIGZyb20gb25lIHNlY3Rpb24KLSAgICAgdG8gYW5vdGhlci4gICovCi0gIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJj0gfk5fVFlQRTsKLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKGNhY2hlX3B0cik7Ci0gIG9mZiA9IDA7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBvY2N1cnMsIGUuZy4sIGZvciB0aGUgKkRFQlVHKiBzZWN0aW9uIG9mIGEgQ09GRgotCSBmaWxlLiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBmb3Igc3ltYm9sIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAKLQkgY2FjaGVfcHRyLT5uYW1lICE9IE5VTEwgPyBjYWNoZV9wdHItPm5hbWUgOiBfKCIqdW5rbm93bioiKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBvZmYgPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9BQlM7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX1RFWFQ7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0RBVEE7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fQlNTOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fVU5ERiB8IE5fRVhUOwotICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fSU5EUjsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSBOX1VOREYgfCBOX0VYVDsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFR1cm4gdGhlIHN5bWJvbCBmcm9tIHNlY3Rpb24gcmVsYXRpdmUgdG8gYWJzb2x1dGUgYWdhaW4gKi8KLSAgdmFsdWUgKz0gc2VjLT52bWEgKyBvZmY7Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fV0FSTklORzsKLQotICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikgY2FjaGVfcHRyKS0+dHlwZTsKLSAgZWxzZSBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9FWFQ7Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIGludCB0eXBlID0gKChhb3V0X3N5bWJvbF90eXBlICopIGNhY2hlX3B0ciktPnR5cGU7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgTl9BQlM6CXR5cGUgPSBOX1NFVEE7IGJyZWFrOwotCWNhc2UgTl9URVhUOgl0eXBlID0gTl9TRVRUOyBicmVhazsKLQljYXNlIE5fREFUQToJdHlwZSA9IE5fU0VURDsgYnJlYWs7Ci0JY2FzZSBOX0JTUzoJdHlwZSA9IE5fU0VUQjsgYnJlYWs7Ci0JfQotICAgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IHR5cGU7Ci0gICAgfQotCi0gIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICBzd2l0Y2ggKHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJiBOX1RZUEUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBOX0FCUzoJdHlwZSA9IE5fV0VBS0E7IGJyZWFrOwotCWNhc2UgTl9URVhUOgl0eXBlID0gTl9XRUFLVDsgYnJlYWs7Ci0JY2FzZSBOX0RBVEE6CXR5cGUgPSBOX1dFQUtEOyBicmVhazsKLQljYXNlIE5fQlNTOgl0eXBlID0gTl9XRUFLQjsgYnJlYWs7Ci0JY2FzZSBOX1VOREY6CXR5cGUgPSBOX1dFQUtVOyBicmVhazsKLQl9Ci0gICAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gdHlwZTsKLSAgICB9Ci0KLSAgUFVUX1dPUkQoYWJmZCwgdmFsdWUsIHN5bV9wb2ludGVyLT5lX3ZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIE5hdGl2ZS1sZXZlbCBpbnRlcmZhY2UgdG8gc3ltYm9scy4gKi8KLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFvdXRfc3ltYm9sX3R5cGUgICpuZXcgPQotICAgIChhb3V0X3N5bWJvbF90eXBlICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBUcmFuc2xhdGUgYSBzZXQgb2YgaW50ZXJuYWwgc3ltYm9scyBpbnRvIGV4dGVybmFsIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgKGFiZmQsIGluLCBleHQsIGNvdW50LCBzdHIsIHN0cnNpemUsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYW91dF9zeW1ib2xfdHlwZSAqaW47Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBjaGFyICpzdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3Ryc2l6ZTsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmV4dF9lbmQ7Ci0KLSAgZXh0X2VuZCA9IGV4dCArIGNvdW50OwotICBmb3IgKDsgZXh0IDwgZXh0X2VuZDsgZXh0KyssIGluKyspCi0gICAgewotICAgICAgYmZkX3ZtYSB4OwotCi0gICAgICB4ID0gR0VUX1dPUkQgKGFiZmQsIGV4dC0+ZV9zdHJ4KTsKLSAgICAgIGluLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLSAgICAgIC8qIEZvciB0aGUgbm9ybWFsIHN5bWJvbHMsIHRoZSB6ZXJvIGluZGV4IHBvaW50cyBhdCB0aGUgbnVtYmVyCi0JIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcgdGFibGUgYnV0IGlzIHRvIGJlIGludGVycHJldGVkIGFzIHRoZQotCSBudWxsIHN0cmluZy4gIEZvciB0aGUgZHluYW1pYyBzeW1ib2xzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCi0JIHRoZSBzdHJpbmcgdGFibGUgaXMgc3RvcmVkIGluIHRoZSBfX0RZTkFNSUMgc3RydWN0dXJlIGFuZCB0aGUKLQkgemVybyBpbmRleCBwb2ludHMgYXQgYW4gYWN0dWFsIHN0cmluZy4gICovCi0gICAgICBpZiAoeCA9PSAwICYmICEgZHluYW1pYykKLQlpbi0+c3ltYm9sLm5hbWUgPSAiIjsKLSAgICAgIGVsc2UgaWYgKHggPCBzdHJzaXplKQotCWluLT5zeW1ib2wubmFtZSA9IHN0ciArIHg7Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpbi0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCAgZXh0LT5lX3ZhbHVlKTsKLSAgICAgIGluLT5kZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPmVfZGVzYyk7Ci0gICAgICBpbi0+b3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXh0LT5lX290aGVyKTsKLSAgICAgIGluLT50eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsICBleHQtPmVfdHlwZSk7Ci0gICAgICBpbi0+c3ltYm9sLnVkYXRhLnAgPSBOVUxMOwotCi0gICAgICBpZiAoISB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBpbikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoZHluYW1pYykKLQlpbi0+c3ltYm9sLmZsYWdzIHw9IEJTRl9EWU5BTUlDOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgcmVhZCB0aGUgc3ltYm9scyBpbnRvIGEgYnVmZmVyLCB3aGljaCBpcyBkaXNjYXJkZWQgd2hlbiB0aGlzCi0gICBmdW5jdGlvbiBleGl0cy4gIFdlIHJlYWQgdGhlIHN0cmluZ3MgaW50byBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8KLSAgIGhvbGQgdGhlbSBhbGwgcGx1cyBhbGwgdGhlIGNhY2hlZCBzeW1ib2wgZW50cmllcy4gKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvbGRfZXh0ZXJuYWxfc3ltczsKLSAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOwotICBzaXplX3QgY2FjaGVkX3NpemU7Ci0KLSAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLwotICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBvbGRfZXh0ZXJuYWxfc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjYWNoZWRfc2l6ZSA9IChvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpCi0JCSAqIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpOwotICBjYWNoZWQgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBiZmRfbWFsbG9jIChjYWNoZWRfc2l6ZSk7Ci0gIGlmIChjYWNoZWQgPT0gTlVMTCAmJiBjYWNoZWRfc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGNhY2hlZF9zaXplICE9IDApCi0gICAgbWVtc2V0IChjYWNoZWQsIDAsIGNhY2hlZF9zaXplKTsKLQotICAvKiBDb252ZXJ0IGZyb20gZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHRvIGludGVybmFsLiAgKi8KLSAgaWYgKCEgKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKQotCSAoYWJmZCwgY2FjaGVkLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCksCi0JICBmYWxzZSkpKQotICAgIHsKLSAgICAgIGZyZWUgKGNhY2hlZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IGNhY2hlZDsKLQotICAvKiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFueWJvZHkgd2hvIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgICAgd2FudCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLCBzbyBpZiBpdCB3YXMgYWxsb2NhdGVkCi0gICAgIGJlY2F1c2Ugb2Ygb3VyIGNhbGwgdG8gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scywgd2UgZnJlZSBpdCB1cAotICAgICByaWdodCBhd2F5IHRvIHNhdmUgc3BhY2UuICAqLwotICBpZiAob2xkX2V4dGVybmFsX3N5bXMgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMCi0gICAgICAmJiBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IHN5bWJvbHMgc28gdGhhdCB3ZSBvbmx5IHdyaXRlCi0gICBvdXQgYSBwYXJ0aWN1bGFyIHN0cmluZyBvbmNlLiAgVGhpcyBoZWxwcyBwYXJ0aWN1bGFybHkgd2hlbiB0aGUKLSAgIGxpbmtlciB3cml0ZXMgb3V0IHN0YWJzIGRlYnVnZ2luZyBlbnRyaWVzLCBiZWNhdXNlIGVhY2ggZGlmZmVyZW50Ci0gICBjb250cmlidXRpbmcgb2JqZWN0IGZpbGUgdGVuZHMgdG8gaGF2ZSBtYW55IGR1cGxpY2F0ZSBzdGFicwotICAgc3RyaW5ncy4KLQotICAgVGhpcyBoYXNoIHRhYmxlIGNvZGUgYnJlYWtzIGRieCBvbiBTdW5PUyA0LjEuMywgc28gd2UgZG9uJ3QgZG8gaXQKLSAgIGlmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUgYWRkX3RvX3N0cmluZ3RhYgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGVtaXRfc3RyaW5ndGFiIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBpbmRleCBvZiBhIHN0cmluZyBpbiBhIHN0cnRhYiwgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdAotICAgYWxyZWFkeSBwcmVzZW50LiAgKi8KLQotc3RhdGljIElOTElORSBiZmRfc2l6ZV90eXBlCi1hZGRfdG9fc3RyaW5ndGFiIChhYmZkLCB0YWIsIHN0ciwgY29weSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgYm9vbGVhbiBjb3B5OwotewotICBib29sZWFuIGhhc2g7Ci0gIGJmZF9zaXplX3R5cGUgaW5kZXg7Ci0KLSAgLyogQW4gaW5kZXggb2YgMCBhbHdheXMgbWVhbnMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gIGlmIChzdHIgPT0gMCB8fCAqc3RyID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRG9uJ3QgaGFzaCBpZiBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgYmVjYXVzZSBTdW5PUyBkYngKLSAgICAgZG9lc24ndCB1bmRlcnN0YW5kIGEgaGFzaGVkIHN0cmluZyB0YWJsZS4gICovCi0gIGhhc2ggPSB0cnVlOwotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICBoYXNoID0gZmFsc2U7Ci0KLSAgaW5kZXggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHRhYiwgc3RyLCBoYXNoLCBjb3B5KTsKLQotICBpZiAoaW5kZXggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotICAgIHsKLSAgICAgIC8qIEFkZCBCWVRFU19JTl9XT1JEIHRvIHRoZSByZXR1cm4gdmFsdWUgdG8gYWNjb3VudCBmb3IgdGhlCi0JIHNwYWNlIHRha2VuIHVwIGJ5IHRoZSBzdHJpbmcgdGFibGUgc2l6ZS4gICovCi0gICAgICBpbmRleCArPSBCWVRFU19JTl9XT1JEOwotICAgIH0KLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cnRhYi4gIEFCRkQgaXMgYWxyZWFkeSBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlCi0gICBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVtaXRfc3RyaW5ndGFiIChhYmZkLCB0YWIpCi0gICAgIHJlZ2lzdGVyIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotewotICBiZmRfYnl0ZSBidWZmZXJbQllURVNfSU5fV09SRF07Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBzdGFydHMgd2l0aCB0aGUgc2l6ZS4gICovCi0gIFBVVF9XT1JEIChhYmZkLCBfYmZkX3N0cmluZ3RhYl9zaXplICh0YWIpICsgQllURVNfSU5fV09SRCwgYnVmZmVyKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBCWVRFU19JTl9XT1JELCBhYmZkKSAhPSBCWVRFU19JTl9XT1JEKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgdGFiKTsKLX0KLQwKLWJvb2xlYW4KLU5BTUUoYW91dCx3cml0ZV9zeW1zKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgY291bnQgOwotICBhc3ltYm9sICoqZ2VuZXJpYyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLQotICBzdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoc3RydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOyBjb3VudCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKmcgPSBnZW5lcmljW2NvdW50XTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBuc3A7Ci0KLSAgICAgIGluZHggPSBhZGRfdG9fc3RyaW5ndGFiIChhYmZkLCBzdHJ0YWIsIGctPm5hbWUsIGZhbHNlKTsKLSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIFBVVF9XT1JEIChhYmZkLCBpbmR4LCAoYmZkX2J5dGUgKikgbnNwLmVfc3RyeCk7Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyKGcpID09IGFiZmQtPnh2ZWMtPmZsYXZvdXIpCi0JewotCSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT5kZXNjLCAgbnNwLmVfZGVzYyk7Ci0JICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+b3RoZXIsICBuc3AuZV9vdGhlcik7Ci0JICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+dHlwZSwgIG5zcC5lX3R5cGUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfaF9wdXRfMTYoYWJmZCwwLCBuc3AuZV9kZXNjKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX290aGVyKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX3R5cGUpOwotCX0KLQotICAgICAgaWYgKCEgdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGcsICZuc3ApKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3dyaXRlKChQVFIpJm5zcCwxLEVYVEVSTkFMX05MSVNUX1NJWkUsIGFiZmQpCi0JICAhPSBFWFRFUk5BTF9OTElTVF9TSVpFKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBOQjogYEtFRVBJVCcgY3VycmVudGx5IG92ZXJsYXlzIGB1ZGF0YS5wJywgc28gc2V0IHRoaXMgb25seQotCSBoZXJlLCBhdCB0aGUgZW5kLiAgKi8KLSAgICAgIGctPktFRVBJVCA9IGNvdW50OwotICAgIH0KLQotICBpZiAoISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgc3RydGFiKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzdHJ0YWIpOwotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotDAotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgZm9yIChzeW1iYXNlID0gb2JqX2FvdXRfc3ltYm9scyhhYmZkKTsgY291bnRlcisrIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7KQotICAgICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopKCBzeW1iYXNlKyspOwotICAgICpsb2NhdGlvbisrID0wOwotICAgIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotDAotLyogU3RhbmRhcmQgcmVsb2Mgc3R1ZmYgKi8KLS8qIE91dHB1dCBzdGFuZGFyZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotZXh0ZXJuIHZvaWQgIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgLyogWFhYIFRoaXMgcmVsaWVzIG9uIHJlbG9jcyBjb21pbmcgZnJvbSBhLm91dCBmaWxlcy4gICovCi0gIHJfYmFzZXJlbCA9IChnLT5ob3d0by0+dHlwZSAmIDgpICE9IDA7Ci0gIHJfam1wdGFibGUgPSAoZy0+aG93dG8tPnR5cGUgJiAxNikgIT0gMDsKLSAgcl9yZWxhdGl2ZSA9IChnLT5ob3d0by0+dHlwZSAmIDMyKSAhPSAwOwotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0gICAgICB7Ci0JLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0Jcl9pbmRleCA9IE5fQUJTOwotCXJfZXh0ZXJuID0gMDsKLSAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JLyogRmlsbCBpbiBzeW1ib2wgKi8KLQlyX2V4dGVybiA9IDE7Ci0Jcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLQotICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0gICAgICAgKHJfZXh0ZXJuPyAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCXwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUc6IDApCi0JIHwgKHJfYmFzZXJlbD8gICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRzogMCkKLQkgIHwgKHJfam1wdGFibGU/ICBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUc6IDApCi0JICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRzogMCkKLQkgICAgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0gZWxzZSB7Ci0JbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQluYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLQluYXRwdHItPnJfdHlwZVswXSA9Ci0JIChyX2V4dGVybj8gICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLQkgIHwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JICAgfCAocl9iYXNlcmVsPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFOiAwKQotCSAgICB8IChyX2ptcHRhYmxlPyAgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFOiAwKQotCSAgICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRTogMCkKLQkgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgICB9Ci19Ci0KLQotLyogRXh0ZW5kZWQgc3R1ZmYgKi8KLS8qIE91dHB1dCBleHRlbmRlZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotZXh0ZXJuIHZvaWQgTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQ7Ci0gIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICByX2FkZGVuZCArPSAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCi0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gTl9BQlM7Ci0gICAgfQotICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCi0Jcl9leHRlcm4gPSAxOwotICAgICAgZWxzZQotCXJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLSAgICAgICgocl9leHRlcm4/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUc6IDApCi0gICAgICAgfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0gICAgIChyX2V4dGVybj8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLSAgICAgIHwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0gIH0KLQotICBQVVRfV09SRCAoYWJmZCwgcl9hZGRlbmQsIG5hdHB0ci0+cl9hZGRlbmQpOwotfQotCi0vKiBCRkQgZGVhbHMgaW50ZXJuYWxseSB3aXRoIGFsbCB0aGluZ3MgYmFzZWQgZnJvbSB0aGUgc2VjdGlvbiB0aGV5J3JlCi0gICBpbi4gc28sIHNvbWV0aGluZyBpbiAxMCBieXRlcyBpbnRvIGEgdGV4dCBzZWN0aW9uICB3aXRoIGEgYmFzZSBvZgotICAgNTAgd291bGQgaGF2ZSBhIHN5bWJvbCAoLnRleHQrMTApIGFuZCBrbm93IC50ZXh0IHZtYSB3YXMgNTAuCi0KLSAgIEFvdXQga2VlcHMgYWxsIGl0J3Mgc3ltYm9scyBiYXNlZCBmcm9tIHplcm8sIHNvIHRoZSBzeW1ib2wgd291bGQKLSAgIGNvbnRhaW4gNjAuIFRoaXMgbWFjcm8gc3VicyB0aGUgYmFzZSBvZiBlYWNoIHNlY3Rpb24gZnJvbSB0aGUgdmFsdWUKLSAgIHRvIGdpdmUgdGhlIHRydWUgb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24gKi8KLQotCi0jZGVmaW5lIE1PVkVfQUREUkVTUyhhZCkgICAgICAgCQkJCQkJXAotICBpZiAocl9leHRlcm4pIHsJCQkJCQkJXAotICAgLyogdW5kZWZpbmVkIHN5bWJvbCAqLwkJCQkJCVwKLSAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyByX2luZGV4OwkJCVwKLSAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgIH0gZWxzZSB7CQkJCQkJCQlcCi0gICAgLyogZGVmaW5lZCwgc2VjdGlvbiByZWxhdGl2ZS4gcmVwbGFjZSBzeW1ib2wgd2l0aCBwb2ludGVyIHRvICAgIAlcCi0gICAgICAgc3ltYm9sIHdoaWNoIHBvaW50cyB0byBzZWN0aW9uICAqLwkJCQlcCi0gICAgc3dpdGNoIChyX2luZGV4KSB7CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVDoJCQkJCQkJXAotICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfdGV4dHNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgIC0gc3UtPnRleHRzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQToJCQkJCQkJXAotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfZGF0YXNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+ZGF0YXNlYy0+dm1hOwkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1M6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0JTUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmJzc3NlYy0+dm1hOwkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBkZWZhdWx0OgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlM6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0FCUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB9ICAgICAJCQkJCQkJCVwKLQotdm9pZAotTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gKEdFVF9TV09SRCAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcykpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMF0gPDwgMTYpCi0JICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMl07Ci0gICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCi0JCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMl0gPDwgMTYpCi0JICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMF07Ci0gICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCi0JCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEU7Ci0gIH0KLQotICBjYWNoZV9wdHItPmhvd3RvID0gIGhvd3RvX3RhYmxlX2V4dCArIHJfdHlwZTsKLQotICAvKiBCYXNlIHJlbGF0aXZlIHJlbG9jcyBhcmUgYWx3YXlzIGFnYWluc3QgdGhlIHN5bWJvbCB0YWJsZSwKLSAgICAgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4gIHJfZXh0ZXJuIGp1c3QgcmVmbGVjdHMKLSAgICAgd2hldGhlciB0aGUgc3ltYm9sIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGlzIGxvY2FsIG9yIGdsb2JhbC4gICovCi0gIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0gICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0gICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotICAgIHJfZXh0ZXJuID0gMTsKLQotICBpZiAocl9leHRlcm4gJiYgcl9pbmRleCA+IHN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGFycmFuZ2UgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgbWlnaHQgYmUgdXNlZnVsCi0gICAgICAgICB0byBzZWUgdGhlIGZpbGUgZXZlbiBpZiBpdCBpcyBiYWQuICAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IE5fQUJTOwotICAgIH0KLQotICBNT1ZFX0FERFJFU1MoR0VUX1NXT1JEKGFiZmQsIGJ5dGVzLT5yX2FkZGVuZCkpOwotfQotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKLSAgc3RydWN0IGFvdXRkYXRhICAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0gIHVuc2lnbmVkIGludCBob3d0b19pZHg7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIHJfaW5kZXggPSAgKGJ5dGVzLT5yX2luZGV4WzBdIDw8IDE2KQotICAgICAgfCAoYnl0ZXMtPnJfaW5kZXhbMV0gPDwgOCkKLQl8ICBieXRlcy0+cl9pbmRleFsyXTsKLSAgICByX2V4dGVybiAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICByX3BjcmVsICAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLSAgICByX2ptcHRhYmxlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotICAgIHJfcmVsYXRpdmU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHKSk7Ci0gICAgcl9sZW5ndGggID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQotICAgICAgCQkJPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFsyXSA8PCAxNikKLSAgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCi0JfCAgYnl0ZXMtPnJfaW5kZXhbMF07Ci0gICAgcl9leHRlcm4gID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgcl9wY3JlbCAgID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICByX2Jhc2VyZWwgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7Ci0gICAgcl9qbXB0YWJsZT0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKLSAgICByX3JlbGF0aXZlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSkpOwotICAgIHJfbGVuZ3RoICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLSAgICAgIAkJCT4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEU7Ci0gIH0KLQotICBob3d0b19pZHggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsICsgOCAqIHJfYmFzZXJlbAotCSAgICAgICsgMTYgKiByX2ptcHRhYmxlICsgMzIgKiByX3JlbGF0aXZlOwotICBCRkRfQVNTRVJUIChob3d0b19pZHggPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9zdGQpKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICBob3d0b190YWJsZV9zdGQgKyBob3d0b19pZHg7Ci0gIEJGRF9BU1NFUlQgKGNhY2hlX3B0ci0+aG93dG8tPnR5cGUgIT0gKHVuc2lnbmVkIGludCkgLTEpOwotCi0gIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgc3ltYm9sIHRhYmxlLAotICAgICByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLiAgcl9leHRlcm4ganVzdCByZWZsZWN0cwotICAgICB3aGV0aGVyIHRoZSBzeW1ib2wgdGhlIHJlbG9jIGlzIGFnYWluc3QgaXMgbG9jYWwgb3IgZ2xvYmFsLiAgKi8KLSAgaWYgKHJfYmFzZXJlbCkKLSAgICByX2V4dGVybiA9IDE7Ci0KLSAgaWYgKHJfZXh0ZXJuICYmIHJfaW5kZXggPiBzeW1jb3VudCkKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBhcnJhbmdlIHRvIHJldHVybiBhbiBlcnJvciwgYnV0IGl0IG1pZ2h0IGJlIHVzZWZ1bAotICAgICAgICAgdG8gc2VlIHRoZSBmaWxlIGV2ZW4gaWYgaXQgaXMgYmFkLiAgKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBOX0FCUzsKLSAgICB9Ci0KLSAgTU9WRV9BRERSRVNTKDApOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgZWxzZSBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHJlbG9jX3NpemUgPSBleGVjX2hkcihhYmZkKS0+YV90cnNpemU7Ci0gIGVsc2UgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJlbG9jX3NpemUgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAocmVsb2NfY2FjaGUgPT0gTlVMTCAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtc2V0IChyZWxvY19jYWNoZSwgMCwgY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jcyA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPQotCShzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jczsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcnB0ciA9Ci0JKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLSAgICB9Ci0KLSAgZnJlZSAocmVsb2NzKTsKLQotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjYWNoZV9wdHIgLSByZWxvY19jYWNoZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgcmVsb2NhdGlvbiBzZWN0aW9uIGludG8gYW4gb2JqZWN0IGZpbGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgdW5zaWduZWQgY2hhciAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgZWFjaF9zaXplOwotCi0gIHVuc2lnbmVkIGludCBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBzaXplX3QgbmF0c2l6ZTsKLQotICBpZiAoY291bnQgPT0gMCB8fCBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OwotICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKLSAgaWYgKCFuYXRpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiluYXRwdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU1ZX3N3YXBfc3RkX3JlbG9jX291dChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiluYXRwdHIpOwotICAgIH0KLQotICBpZiAoIGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKSB7Ci0gICAgYmZkX3JlbGVhc2UoYWJmZCwgbmF0aXZlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotbG9uZwotTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb24gPT0gb2JqX2Jzc3NlYyAoYWJmZCkpCi0gICAgewotICAgICAgKnJlbHB0ciA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCEodGJscHRyIHx8IE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCArKykgewotICAgICAgKnJlbHB0ciArKyA9ICZjaGFpbi0+cmVsZW50OwotICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotICAgICAgewotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICAgfQotICB9Ci0gICpyZWxwdHIgPSAwOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotbG9uZwotTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqIChhc2VjdC0+cmVsb2NfY291bnQrMSkpOwotICB9Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKQotCSAgICAqICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKQotCSAgICAgICArIDEpKTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHJldHVybiAoc2l6ZW9mIChhcmVsZW50ICopCi0JICAgICogKChleGVjX2hkcihhYmZkKS0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpCi0JICAgICAgICsgMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICByZXR1cm4gc2l6ZW9mIChhcmVsZW50ICopOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICByZXR1cm4gMDsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gLTE7Ci19Ci0KLQwKLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKzEpICogKHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotIGFsZW50ICoKLU5BTUUoYW91dCxnZXRfbGluZW5vKSAoaWdub3JlX2FiZmQsIGlnbm9yZV9zeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqaWdub3JlX3N5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gKGFsZW50ICopTlVMTDsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1OQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0KLSAgaWYgKHJldC0+dHlwZSA9PSAnPycpCi0gICAgewotICAgICAgaW50IHR5cGVfY29kZSA9IGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUgJiAweGZmOwotICAgICAgY29uc3QgY2hhciAqc3RhYl9uYW1lID0gYmZkX2dldF9zdGFiX25hbWUgKHR5cGVfY29kZSk7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTBdOwotCi0gICAgICBpZiAoc3RhYl9uYW1lID09IE5VTEwpCi0JewotCSAgc3ByaW50ZihidWYsICIoJWQpIiwgdHlwZV9jb2RlKTsKLQkgIHN0YWJfbmFtZSA9IGJ1ZjsKLQl9Ci0gICAgICByZXQtPnR5cGUgPSAnLSc7Ci0gICAgICByZXQtPnN0YWJfdHlwZSA9IHR5cGVfY29kZTsKLSAgICAgIHJldC0+c3RhYl9vdGhlciA9ICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKTsKLSAgICAgIHJldC0+c3RhYl9kZXNjID0gKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKTsKLSAgICAgIHJldC0+c3RhYl9uYW1lID0gc3RhYl9uYW1lOwotICAgIH0KLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpIHsKLSAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgaWYgKHN5bWJvbC0+bmFtZSkKLSAgICAgIGZwcmludGYoZmlsZSwiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICBmcHJpbnRmKGZpbGUsIiU0eCAlMnggJTJ4IiwodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPmRlc2MgJiAweGZmZmYpLAotCSAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPm90aGVyICYgMHhmZiksCi0JICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+dHlwZSkpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgIHsKLSAgIENPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbi0+bmFtZTsKLQotCi0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKChQVFIpZmlsZSxzeW1ib2wpOwotCi0gICAgICBmcHJpbnRmKGZpbGUsIiAlLTVzICUwNHggJTAyeCAlMDJ4IiwKLQkgICAgICBzZWN0aW9uX25hbWUsCi0JICAgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKSwKLQkgICAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPm90aGVyICYgMHhmZiksCi0JICAgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT50eXBlICAmIDB4ZmYpKTsKLSAgICAgIGlmIChzeW1ib2wtPm5hbWUpCi0gICAgICAgIGZwcmludGYoZmlsZSwiICVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogSWYgd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gMU1CIHRvIGhvbGQgdGhlIGdlbmVyaWMKLSAgIHN5bWJvbHMsIHdlIHVzZSB0aGUgZ2VuZXJpYyBtaW5pc3ltYm9sIG1ldGhvcmQ6IGl0J3MgZmFzdGVyLCBzaW5jZQotICAgaXQgb25seSB0cmFuc2xhdGVzIHRoZSBzeW1ib2xzIG9uY2UsIG5vdCBtdWx0aXBsZSB0aW1lcy4gICovCi0jZGVmaW5lIE1JTklTWU1fVEhSRVNIT0xEICgxMDAwMDAwIC8gc2l6ZW9mIChhc3ltYm9sKSkKLQotLyogUmVhZCBtaW5pc3ltYm9scy4gIEZvciBtaW5pc3ltYm9scywgd2UgdXNlIHRoZSB1bm1vZGlmaWVkIGEub3V0Ci0gICBzeW1ib2xzLiAgVGhlIG1pbmlzeW1ib2xfdG9fc3ltYm9sIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlc2UgaW50bwotICAgQkZEIGFzeW1ib2wgc3RydWN0dXJlcy4gICovCi0KLWxvbmcKLU5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKSAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiAqbWluaXN5bXNwOwotICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOwotewotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBoYW5kbGUgdGhlIGR5bmFtaWMgc3ltYm9scyBoZXJlIGFzIHdlbGwsIGJ1dCBpdCdzCi0gICAgICAgICBlYXNpZXIgdG8gaGFuZCB0aGVtIG9mZi4gICovCi0gICAgICByZXR1cm4gX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApOwotICAgIH0KLQotICBpZiAoISBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPCBNSU5JU1lNX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApOwotCi0gICptaW5pc3ltc3AgPSAoUFRSKSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKTsKLQotICAvKiBCeSBwYXNzaW5nIHRoZSBleHRlcm5hbCBzeW1ib2xzIGJhY2sgZnJvbSB0aGlzIHJvdXRpbmUsIHdlIGFyZQotICAgICBnaXZpbmcgdXAgY29udHJvbCBvdmVyIHRoZSBtZW1vcnkgYmxvY2suICBDbGVhcgotICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zLCBzbyB0aGF0IHdlIGRvIG5vdCB0cnkgdG8gZnJlZSBpdAotICAgICBvdXJzZWx2ZXMuICAqLwotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0KLSAgKnNpemVwID0gRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgcmV0dXJuIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7Ci19Ci0KLS8qIENvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgQkZEIGFzeW1ib2wuICBBIG1pbmlzeW1ib2wgaXMganVzdCBhbgotICAgdW5tb2RpZmllZCBhLm91dCBzeW1ib2wuICBUaGUgU1lNIGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlIHJldHVybmVkCi0gICBieSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wsIHdoaWNoIHdlIGZpbGwgaW4gaGVyZS4gICovCi0KLWFzeW1ib2wgKgotTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKSAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgY29uc3QgUFRSIG1pbmlzeW07Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgaWYgKGR5bmFtaWMKLSAgICAgIHx8IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPCBNSU5JU1lNX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pOwotCi0gIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKTsKLQotICAvKiBXZSBjYWxsIHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUgdG8gdHJhbnNsYXRlIGEgc2luZ2xlIHN5bWJvbC4gICovCi0gIGlmICghIChOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkKLQkgKGFiZmQsCi0JICAoYW91dF9zeW1ib2xfdHlwZSAqKSBzeW0sCi0JICAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIG1pbmlzeW0sCi0JICAoYmZkX3NpemVfdHlwZSkgMSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUgKGFiZmQpLAotCSAgZmFsc2UpKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gc3ltOwotfQotCi0vKgotIHByb3ZpZGVkIGEgQkZELCBhIHNlY3Rpb24gYW5kIGFuIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLCBjYWxjdWxhdGUKLSBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSB3YW50ZWQgbG9jYXRpb24uCi0qLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpCi0gICAgIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIC8qIFJ1biBkb3duIHRoZSBmaWxlIGxvb2tpbmcgZm9yIHRoZSBmaWxlbmFtZSwgZnVuY3Rpb24gYW5kIGxpbmVudW1iZXIgKi8KLSAgYXN5bWJvbCAqKnA7Ci0gIENPTlNUIGNoYXIgKmRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgQ09OU1QgY2hhciAqbWFpbl9maWxlX25hbWUgPSBOVUxMOwotICBDT05TVCBjaGFyICpjdXJyZW50X2ZpbGVfbmFtZSA9IE5VTEw7Ci0gIENPTlNUIGNoYXIgKmxpbmVfZmlsZV9uYW1lID0gTlVMTDsgLyogVmFsdWUgb2YgY3VycmVudF9maWxlX25hbWUgYXQgbGluZSBudW1iZXIuICovCi0gIENPTlNUIGNoYXIgKmxpbmVfZGlyZWN0b3J5X25hbWUgPSBOVUxMOyAvKiBWYWx1ZSBvZiBkaXJlY3RvcnlfbmFtZSBhdCBsaW5lIG51bWJlci4gKi8KLSAgYmZkX3ZtYSBsb3dfbGluZV92bWEgPSAwOwotICBiZmRfdm1hIGxvd19mdW5jX3ZtYSA9IDA7Ci0gIGFzeW1ib2wgKmZ1bmMgPSAwOwotICBzaXplX3QgZmlsZWxlbiwgZnVuY2xlbjsKLSAgY2hhciAqYnVmOwotCi0gICpmaWxlbmFtZV9wdHIgPSBhYmZkLT5maWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSAwOwotICAqbGluZV9wdHIgPSAwOwotICBpZiAoc3ltYm9scyAhPSAoYXN5bWJvbCAqKilOVUxMKSB7Ci0gICAgZm9yIChwID0gc3ltYm9sczsgKnA7IHArKykgewotICAgICAgYW91dF9zeW1ib2xfdHlwZSAgKnEgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSgqcCk7Ci0gICAgbmV4dDoKLSAgICAgIHN3aXRjaCAocS0+dHlwZSl7Ci0gICAgICBjYXNlIE5fVEVYVDoKLQkvKiBJZiB0aGlzIGxvb2tzIGxpa2UgYSBmaWxlIG5hbWUgc3ltYm9sLCBhbmQgaXQgY29tZXMgYWZ0ZXIKLSAgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIHdlIGhhdmUgZm91bmQgc28gZmFyLCBidXQgYmVmb3JlIHRoZQotICAgICAgICAgICBvZmZzZXQsIHRoZW4gd2UgaGF2ZSBwcm9iYWJseSBub3QgZm91bmQgdGhlIHJpZ2h0IGxpbmUKLSAgICAgICAgICAgbnVtYmVyLiAgKi8KLQlpZiAocS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldAotCSAgICAmJiAoKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19saW5lX3ZtYQotCQkgJiYgKGxpbmVfZmlsZV9uYW1lICE9IE5VTEwKLQkJICAgICB8fCAqbGluZV9wdHIgIT0gMCkpCi0JCXx8IChxLT5zeW1ib2wudmFsdWUgPiBsb3dfZnVuY192bWEKLQkJICAgICYmIGZ1bmMgIT0gTlVMTCkpKQotCSAgewotCSAgICBjb25zdCBjaGFyICpzeW1uYW1lOwotCi0JICAgIHN5bW5hbWUgPSBxLT5zeW1ib2wubmFtZTsKLQkgICAgaWYgKHN0cmNtcCAoc3ltbmFtZSArIHN0cmxlbiAoc3ltbmFtZSkgLSAyLCAiLm8iKSA9PSAwKQotCSAgICAgIHsKLQkJaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19saW5lX3ZtYSkKLQkJICB7Ci0JCSAgICAqbGluZV9wdHIgPSAwOwotCQkgICAgbGluZV9maWxlX25hbWUgPSBOVUxMOwotCQkgIH0KLQkJaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19mdW5jX3ZtYSkKLQkJICBmdW5jID0gTlVMTDsKLQkgICAgICB9Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgTl9TTzoKLQkvKiBJZiB0aGlzIHN5bWJvbCBpcyBsZXNzIHRoYW4gdGhlIG9mZnNldCwgYnV0IGdyZWF0ZXIgdGhhbgotICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2UgaGF2ZSBmb3VuZCBzbyBmYXIsIHRoZW4gd2UgaGF2ZSBub3QKLSAgICAgICAgICAgZm91bmQgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyLiAgKi8KLQlpZiAocS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgIHsKLQkgICAgaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19saW5lX3ZtYSkKLQkgICAgICB7Ci0JCSpsaW5lX3B0ciA9IDA7Ci0JCWxpbmVfZmlsZV9uYW1lID0gTlVMTDsKLQkgICAgICB9Ci0JICAgIGlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfZnVuY192bWEpCi0JICAgICAgZnVuYyA9IE5VTEw7Ci0JICB9Ci0KLQltYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JLyogTG9vayBhaGVhZCB0byBuZXh0IHN5bWJvbCB0byBjaGVjayBpZiB0aGF0IHRvbyBpcyBhbiBOX1NPLiAqLwotCXArKzsKLQlpZiAoKnAgPT0gTlVMTCkKLQkgIGJyZWFrOwotCXEgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSgqcCk7Ci0JaWYgKHEtPnR5cGUgIT0gKGludClOX1NPKQotCSAgZ290byBuZXh0OwotCi0JLyogRm91bmQgYSBzZWNvbmQgTl9TTyAgRmlyc3QgaXMgZGlyZWN0b3J5OyBzZWNvbmQgaXMgZmlsZW5hbWUuICovCi0JZGlyZWN0b3J5X25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQltYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JaWYgKG9ial90ZXh0c2VjKGFiZmQpICE9IHNlY3Rpb24pCi0JICBnb3RvIGRvbmU7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE5fU09MOgotCWN1cnJlbnRfZmlsZV9uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgTl9TTElORToKLQotICAgICAgY2FzZSBOX0RTTElORToKLSAgICAgIGNhc2UgTl9CU0xJTkU6Ci0JLyogV2UnbGwga2VlcCB0aGlzIGlmIGl0IHJlc29sdmVzIG5lYXJlciB0aGFuIHRoZSBvbmUgd2UgaGF2ZQotICAgICAgICAgICBhbHJlYWR5LiAgKi8KLQlpZiAocS0+c3ltYm9sLnZhbHVlID49IGxvd19saW5lX3ZtYQotCSAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgewotCSAgICAqbGluZV9wdHIgPSBxLT5kZXNjOwotCSAgICBsb3dfbGluZV92bWEgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIGxpbmVfZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JICAgIGxpbmVfZGlyZWN0b3J5X25hbWUgPSBkaXJlY3RvcnlfbmFtZTsKLQkgIH0KLQlicmVhazsKLSAgICAgIGNhc2UgTl9GVU46Ci0JewotCSAgLyogV2UnbGwga2VlcCB0aGlzIGlmIGl0IGlzIG5lYXJlciB0aGFuIHRoZSBvbmUgd2UgaGF2ZSBhbHJlYWR5ICovCi0JICBpZiAocS0+c3ltYm9sLnZhbHVlID49IGxvd19mdW5jX3ZtYSAmJgotCSAgICAgIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpIHsKLQkgICAgbG93X2Z1bmNfdm1hID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICBmdW5jID0gKGFzeW1ib2wgKilxOwotCSAgfQotCSAgZWxzZSBpZiAocS0+c3ltYm9sLnZhbHVlID4gb2Zmc2V0KQotCSAgICBnb3RvIGRvbmU7Ci0JfQotCWJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gZG9uZToKLSAgaWYgKCpsaW5lX3B0ciAhPSAwKQotICAgIHsKLSAgICAgIG1haW5fZmlsZV9uYW1lID0gbGluZV9maWxlX25hbWU7Ci0gICAgICBkaXJlY3RvcnlfbmFtZSA9IGxpbmVfZGlyZWN0b3J5X25hbWU7Ci0gICAgfQotCi0gIGlmIChtYWluX2ZpbGVfbmFtZSA9PSBOVUxMCi0gICAgICB8fCBtYWluX2ZpbGVfbmFtZVswXSA9PSAnLycKLSAgICAgIHx8IGRpcmVjdG9yeV9uYW1lID09IE5VTEwpCi0gICAgZmlsZWxlbiA9IDA7Ci0gIGVsc2UKLSAgICBmaWxlbGVuID0gc3RybGVuIChkaXJlY3RvcnlfbmFtZSkgKyBzdHJsZW4gKG1haW5fZmlsZV9uYW1lKTsKLSAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICBmdW5jbGVuID0gMDsKLSAgZWxzZQotICAgIGZ1bmNsZW4gPSBzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpKTsKLQotICBpZiAoYWRhdGEgKGFiZmQpLmxpbmVfYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYWRhdGEgKGFiZmQpLmxpbmVfYnVmKTsKLSAgaWYgKGZpbGVsZW4gKyBmdW5jbGVuID09IDApCi0gICAgYWRhdGEgKGFiZmQpLmxpbmVfYnVmID0gYnVmID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIGJmZF9tYWxsb2MgKGZpbGVsZW4gKyBmdW5jbGVuICsgMyk7Ci0gICAgICBhZGF0YSAoYWJmZCkubGluZV9idWYgPSBidWY7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobWFpbl9maWxlX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobWFpbl9maWxlX25hbWVbMF0gPT0gJy8nIHx8IGRpcmVjdG9yeV9uYW1lID09IE5VTEwpCi0JKmZpbGVuYW1lX3B0ciA9IG1haW5fZmlsZV9uYW1lOwotICAgICAgZWxzZQotCXsKLQkgIHNwcmludGYgKGJ1ZiwgIiVzJXMiLCBkaXJlY3RvcnlfbmFtZSwgbWFpbl9maWxlX25hbWUpOwotCSAgKmZpbGVuYW1lX3B0ciA9IGJ1ZjsKLQkgIGJ1ZiArPSBmaWxlbGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uID0gZnVuYy0+bmFtZTsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIC8qIFRoZSBjYWxsZXIgZXhwZWN0cyBhIHN5bWJvbCBuYW1lLiAgV2UgYWN0dWFsbHkgaGF2ZSBhCi0JIGZ1bmN0aW9uIG5hbWUsIHdpdGhvdXQgdGhlIGxlYWRpbmcgdW5kZXJzY29yZS4gIFB1dCB0aGUKLQkgdW5kZXJzY29yZSBiYWNrIGluLCBzbyB0aGF0IHRoZSBjYWxsZXIgZ2V0cyBhIHN5bWJvbCBuYW1lLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdcMCcpCi0Jc3RyY3B5IChidWYsIGZ1bmN0aW9uKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBidWZbMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOwotCSAgc3RyY3B5IChidWYgKyAxLCBmdW5jdGlvbik7Ci0JfQotICAgICAgLyogSGF2ZSB0byByZW1vdmUgOiBzdHVmZiAqLwotICAgICAgcCA9IHN0cmNociAoYnVmLCAnOicpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQkqcCA9ICdcMCc7Ci0gICAgICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qQVJHU1VTRUQqLwotaW50Ci1OQU1FKGFvdXQsc2l6ZW9mX2hlYWRlcnMpIChhYmZkLCBleGVjYWJsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGV4ZWNhYmxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci19Ci0KLS8qIEZyZWUgYWxsIGluZm9ybWF0aW9uIHdlIGhhdmUgY2FjaGVkIGZvciB0aGlzIEJGRC4gIFdlIGNhbiBhbHdheXMKLSAgIHJlYWQgaXQgYWdhaW4gbGF0ZXIgaWYgd2UgbmVlZCBpdC4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0jZGVmaW5lIEJGQ0lfRlJFRSh4KSBpZiAoeCAhPSBOVUxMKSB7IGZyZWUgKHgpOyB4ID0gTlVMTDsgfQotICBCRkNJX0ZSRUUgKG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpKTsKLSNpZmRlZiBVU0VfTU1BUAotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IDA7Ci0gIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IDA7Ci0jZWxzZQotICBCRkNJX0ZSRUUgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKLSAgQkZDSV9GUkVFIChvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSk7Ci0jZW5kaWYKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIEJGQ0lfRlJFRSAoby0+cmVsb2NhdGlvbik7Ci0jdW5kZWYgQkZDSV9GUkVFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBhLm91dCBsaW5rIGNvZGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLU5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT53cml0dGVuID0gZmFsc2U7Ci0gICAgICByZXQtPmluZHggPSAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGFuIGEub3V0IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKHJldCwgYWJmZCwKLQkJCQkJIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogR2l2ZW4gYW4gYS5vdXQgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCShhYmZkLCBpbmZvLCBhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIGEub3V0IG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayBhIHNpbmdsZSBhcmNoaXZlIGVsZW1lbnQgdG8gc2VlIGlmIHdlIG5lZWQgdG8gaW5jbHVkZSBpdCBpbgotICAgdGhlIGxpbmsuICAqUE5FRURFRCBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzCi0gICBuZWVkZWQgaW4gdGhlIGxpbmsgb3Igbm90LiAgVGhpcyBpcyBjYWxsZWQgZnJvbQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBpZiAoISBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnJlZSB1cCB0aGUgaW50ZXJuYWwgc3ltYm9scyByZWFkIGZyb20gYW4gYS5vdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAoKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTDsKLSAgICB9Ci0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSNpZmRlZiBVU0VfTU1BUAotICAgICAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotI2Vsc2UKLSAgICAgIGZyZWUgKChQVFIpIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpKTsKLSNlbmRpZgotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSAoY2hhciAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgaW50ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBvYmplY3QgZmlsZSBzaG91bGQKLSAgIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgV2Ugc2hvdWxkIGluY2x1ZGUgdGhpcyBvYmplY3QgZmlsZSBpZiBpdAotICAgZGVmaW5lcyBhbnkgc3ltYm9scyB3aGljaCBhcmUgY3VycmVudGx5IHVuZGVmaW5lZC4gIElmIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGRlZmluZXMgYSBjb21tb24gc3ltYm9sLCB0aGVuIHdlIG1heSBhZGp1c3QgdGhlIHNpemUgb2YgdGhlCi0gICBrbm93biBzeW1ib2wgYnV0IHdlIGRvIG5vdCBpbmNsdWRlIHRoZSBvYmplY3QgZmlsZSBpbiB0aGUgbGluawotICAgKHVubGVzcyB0aGVyZSBpcyBzb21lIG90aGVyIHJlYXNvbiB0byBpbmNsdWRlIGl0KS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnBlbmQ7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgcCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBwZW5kID0gcCArIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKTsKLSAgZm9yICg7IHAgPCBwZW5kOyBwKyspCi0gICAgewotICAgICAgaW50IHR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgcC0+ZV90eXBlKTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogSWdub3JlIHN5bWJvbHMgdGhhdCBhcmUgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4gIFRoaXMgaXMgYW4KLQkgb3B0aW1pemF0aW9uIG9ubHksIGFzIHdlIGNoZWNrIHRoZSB0eXBlIG1vcmUgdGhvcm91Z2hseQotCSBiZWxvdy4gICovCi0gICAgICBpZiAoKCh0eXBlICYgTl9FWFQpID09IDAKLQkgICB8fCAodHlwZSAmIE5fU1RBQikgIT0gMAotCSAgIHx8IHR5cGUgPT0gTl9GTikKLQkgICYmIHR5cGUgIT0gTl9XRUFLQQotCSAgJiYgdHlwZSAhPSBOX1dFQUtUCi0JICAmJiB0eXBlICE9IE5fV0VBS0QKLQkgICYmIHR5cGUgIT0gTl9XRUFLQikKLQl7Ci0JICBpZiAodHlwZSA9PSBOX1dBUk5JTkcKLQkgICAgICB8fCB0eXBlID09IE5fSU5EUikKLQkgICAgKytwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JIHVuZGVmaW5lZCBvciBjb21tb24uICAqLwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikpCi0JewotCSAgaWYgKHR5cGUgPT0gKE5fSU5EUiB8IE5fRVhUKSkKLQkgICAgKytwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAodHlwZSA9PSAoTl9URVhUIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0RBVEEgfCBOX0VYVCkKLQkgIHx8IHR5cGUgPT0gKE5fQlNTIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0FCUyB8IE5fRVhUKQotCSAgfHwgdHlwZSA9PSAoTl9JTkRSIHwgTl9FWFQpKQotCXsKLQkgIC8qIFRoaXMgb2JqZWN0IGZpbGUgZGVmaW5lcyB0aGlzIHN5bWJvbC4gIFdlIG11c3QgbGluayBpdAotCSAgICAgaW4uICBUaGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjdXJyZW50Ci0JICAgICBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGNvbW1vbi4gIElmIHRoZQotCSAgICAgY3VycmVudCBkZWZpbml0aW9uIGlzIGNvbW1vbiwgd2UgaGF2ZSBhIGNhc2UgaW4gd2hpY2ggd2UKLQkgICAgIGhhdmUgYWxyZWFkeSBzZWVuIGFuIG9iamVjdCBmaWxlIGluY2x1ZGluZwotCSAgICAgICAgIGludCBhOwotCSAgICAgYW5kIHRoaXMgb2JqZWN0IGZpbGUgZnJvbSB0aGUgYXJjaGl2ZSBpbmNsdWRlcwotCSAgICAgICAgIGludCBhID0gNTsKLQkgICAgIEluIHN1Y2ggYSBjYXNlIHdlIG11c3QgaW5jbHVkZSB0aGlzIG9iamVjdCBmaWxlLgotCi0JICAgICBGSVhNRTogVGhlIFN1bk9TIDQuMS4zIGxpbmtlciB3aWxsIHB1bGwgaW4gdGhlIGFyY2hpdmUKLQkgICAgIGVsZW1lbnQgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSAuZGF0YSBzZWN0aW9uLAotCSAgICAgYnV0IG5vdCBpZiBpdCBpcyBkZWZpbmVkIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhhdAotCSAgICAgc2VlbXMgYSBiaXQgY3JhenkgdG8gbWUsIGFuZCBJIGhhdmVuJ3QgaW1wbGVtZW50ZWQgaXQuCi0JICAgICBIb3dldmVyLCBpdCBtaWdodCBiZSBjb3JyZWN0LiAgKi8KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICpwbmVlZGVkID0gdHJ1ZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gKE5fVU5ERiB8IE5fRVhUKSkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlOwotCi0JICB2YWx1ZSA9IEdFVF9XT1JEIChhYmZkLCBwLT5lX3ZhbHVlKTsKLQkgIGlmICh2YWx1ZSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgaXMgY29tbW9uIGluIHRoZSBvYmplY3QgZnJvbSB0aGUgYXJjaGl2ZQotCQkgZmlsZS4gICovCi0JICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JCXsKLQkJICBiZmQgKnN5bWJmZDsKLQkJICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkJICBzeW1iZmQgPSBoLT51LnVuZGVmLmFiZmQ7Ci0JCSAgaWYgKHN5bWJmZCA9PSAoYmZkICopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIGFzIHVuZGVmaW5lZCBmcm9tCi0JCQkgb3V0c2lkZSBCRkQuICBXZSBhc3N1bWUgdGhhdCB3ZSBzaG91bGQgbGluawotCQkJIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgZG9uZSBmb3IgdGhlIC11Ci0JCQkgb3B0aW9uIGluIHRoZSBsaW5rZXIuICAqLwotCQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sCi0JCQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCQkJICAgICBuYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCQkgICAgICByZXR1cm4gdHJ1ZTsKLQkJICAgIH0KLQkJICAvKiBUdXJuIHRoZSBjdXJyZW50IGxpbmsgc3ltYm9sIGludG8gYSBjb21tb24KLQkJICAgICBzeW1ib2wuICBJdCBpcyBhbHJlYWR5IG9uIHRoZSB1bmRlZnMgbGlzdC4gICovCi0JCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOwotCQkgIGgtPnUuYy5wID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKLQkJCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJICBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKLQkJICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0KLQkJICAvKiBGSVhNRTogVGhpcyBpc24ndCBxdWl0ZSByaWdodC4gIFRoZSBtYXhpbXVtCi0JCSAgICAgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCBzaG91bGQgYmUgc2V0IGJ5IHRoZQotCQkgICAgIGFyY2hpdGVjdHVyZSBvZiB0aGUgb3V0cHV0IGZpbGUsIG5vdCBvZiB0aGUgaW5wdXQKLQkJICAgICBmaWxlLiAgKi8KLQkJICBwb3dlciA9IGJmZF9sb2cyICh2YWx1ZSk7Ci0JCSAgaWYgKHBvd2VyID4gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyKQotCQkgICAgcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0JCSAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwKLQkJCQkJCQkJIkNPTU1PTiIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sIGlmCi0JCSAgICAgbmVjZXNzYXJ5LiAgKi8KLQkJICBpZiAodmFsdWUgPiBoLT51LmMuc2l6ZSkKLQkJICAgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gTl9XRUFLQQotCSAgfHwgdHlwZSA9PSBOX1dFQUtUCi0JICB8fCB0eXBlID09IE5fV0VBS0QKLQkgIHx8IHR5cGUgPT0gTl9XRUFLQikKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyB3ZWFrIGJ1dCBkZWZpbmVkLiAgV2UgbXVzdCBwdWxsIGl0IGluIGlmCi0JICAgICB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpcyB1bmRlZmluZWQsIGJ1dCB3ZSBkb24ndCB3YW50Ci0JICAgICBpdCBpZiB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpcyBjb21tb24uICAqLwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbGwgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCi0JCQkJICAgICBib29sZWFuLAotCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLSAgY2hhciAqc3RyaW5nczsKLSAgYm9vbGVhbiBjb3B5OwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnBlbmQ7Ci0KLSAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBzeW1fY291bnQgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCk7Ci0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBjb3B5ID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBjb3B5ID0gdHJ1ZTsKLQotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfZHluYW1pY19zeW1ib2xzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfZHluYW1pY19zeW1ib2xzKQotCSAgICAgKGFiZmQsIGluZm8sICZzeW1zLCAmc3ltX2NvdW50LCAmc3RyaW5ncykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIHBhcnRpY3VsYXIgc3ltYm9scy4gIFdlIGNvdWxkIGp1c3QgbG9vayB0aGVtIHVwIGluIHRoZSBoYXNoCi0gICAgIHRhYmxlLCBidXQga2VlcGluZyB0aGUgbGlzdCBpcyBtb3JlIGVmZmljaWVudC4gIFBlcmhhcHMgdGhpcwotICAgICBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gaW5mby0+a2VlcF9tZW1vcnkuICAqLwotICBzeW1faGFzaCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoKHNpemVfdCkgc3ltX2NvdW50Ci0JCQkgICogc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bV9jb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKLQotICBhZGRfb25lX3N5bWJvbCA9IGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+YWRkX29uZV9zeW1ib2w7Ci0gIGlmIChhZGRfb25lX3N5bWJvbCA9PSBOVUxMKQotICAgIGFkZF9vbmVfc3ltYm9sID0gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w7Ci0KLSAgcCA9IHN5bXM7Ci0gIHBlbmQgPSBwICsgc3ltX2NvdW50OwotICBmb3IgKDsgcCA8IHBlbmQ7IHArKywgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotICAgICAgKnN5bV9oYXNoID0gTlVMTDsKLQotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBwLT5lX3R5cGUpOwotCi0gICAgICAvKiBJZ25vcmUgZGVidWdnaW5nIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotICAgICAgdmFsdWUgPSBHRVRfV09SRCAoYWJmZCwgcC0+ZV92YWx1ZSk7Ci0gICAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBzdHJpbmcgPSBOVUxMOwotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIE5fVU5ERjoKLQljYXNlIE5fQUJTOgotCWNhc2UgTl9URVhUOgotCWNhc2UgTl9EQVRBOgotCWNhc2UgTl9CU1M6Ci0JY2FzZSBOX0ZOX1NFUToKLQljYXNlIE5fQ09NTToKLQljYXNlIE5fU0VUVjoKLQljYXNlIE5fRk46Ci0JICAvKiBJZ25vcmUgc3ltYm9scyB0aGF0IGFyZSBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLiAgKi8KLQkgIGNvbnRpbnVlOwotCWNhc2UgTl9JTkRSOgotCSAgLyogSWdub3JlIGxvY2FsIGluZGlyZWN0IHN5bWJvbC4gICovCi0JICArK3A7Ci0JICArK3N5bV9oYXNoOwotCSAgY29udGludWU7Ci0KLQljYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgaWYgKHZhbHVlID09IDApCi0JICAgIHsKLQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgICAgICBmbGFncyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fREFUQSB8IE5fRVhUOgotCWNhc2UgTl9TRVRWIHwgTl9FWFQ6Ci0JICAvKiBUcmVhdCBOX1NFVFYgc3ltYm9scyBhcyBOX0RBVEEgc3ltYm9sOyBzZWUgY29tbWVudCBpbgotCSAgICAgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4gICovCi0JICBzZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fQlNTIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9JTkRSIHwgTl9FWFQ6Ci0JICAvKiBBbiBpbmRpcmVjdCBzeW1ib2wuICBUaGUgbmV4dCBzeW1ib2wgaXMgdGhlIHN5bWJvbAotCSAgICAgd2hpY2ggdGhpcyBvbmUgcmVhbGx5IGlzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKHAgKyAxIDwgcGVuZCk7Ci0JICArK3A7Ci0JICBzdHJpbmcgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7Ci0JICBzZWN0aW9uID0gYmZkX2luZF9zZWN0aW9uX3B0cjsKLQkgIGZsYWdzIHw9IEJTRl9JTkRJUkVDVDsKLQkgIGJyZWFrOwotCWNhc2UgTl9DT01NIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVRBOiBjYXNlIE5fU0VUQSB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICBicmVhazsKLQljYXNlIE5fU0VUVDogY2FzZSBOX1NFVFQgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVREOiBjYXNlIE5fU0VURCB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9XQVJOSU5HOgotCSAgLyogQSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4KLQkgICAgIGFib3V0LiAgKi8KLQkgIEJGRF9BU1NFUlQgKHAgKyAxIDwgcGVuZCk7Ci0JICArK3A7Ci0JICBzdHJpbmcgPSBuYW1lOwotCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoYWJmZCwgcC0+ZV9zdHJ4KTsKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgfD0gQlNGX1dBUk5JTkc7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS1U6Ci0JICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS0E6Ci0JICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS1Q6Ci0JICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dFQUtEOgotCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLQjoKLQkgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCEgKCgqYWRkX29uZV9zeW1ib2wpCi0JICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNvcHksIGZhbHNlLAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgc3ltX2hhc2gpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFJlc3RyaWN0IHRoZSBtYXhpbXVtIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wgYmFzZWQgb24KLQkgdGhlIGFyY2hpdGVjdHVyZSwgc2luY2UgYS5vdXQgaGFzIG5vIHdheSB0byByZXByZXNlbnQKLQkgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIHNlY3Rpb24gaW4gYSAubyBmaWxlLiAgRklYTUU6Ci0JIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQ6IGl0IHNob3VsZCB1c2UgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUKLQkgb3V0cHV0IGZpbGUsIG5vdCB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgaWYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyID4KLQkgICAgICBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXIpKQotCSgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPQotCSAgYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgc2V0IHN5bWJvbCwgYW5kIHdlIGFyZSBub3QgYnVpbGRpbmcgc2V0cywgdGhlbgotCSBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGhhc2ggZW50cnkgdG8gbm90IGhhdmUgYmVlbiBzZXQuICBJbgotCSBzdWNoIGEgY2FzZSwgdHJlYXQgdGhlIHN5bWJvbCBhcyBub3QgZ2xvYmFsbHkgZGVmaW5lZC4gICovCi0gICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQl7Ci0JICBCRkRfQVNTRVJUICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApOwotCSAgKnN5bV9oYXNoID0gTlVMTDsKLQl9Ci0KLSAgICAgIGlmICh0eXBlID09IChOX0lORFIgfCBOX0VYVCkgfHwgdHlwZSA9PSBOX1dBUk5JTkcpCi0JKytzeW1faGFzaDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBIGhhc2ggdGFibGUgdXNlZCBmb3IgaGVhZGVyIGZpbGVzIHdpdGggTl9CSU5DTCBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgdG90YWxzIHRoYXQgd2UgaGF2ZSBmb3VuZCBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlcgotICAgZmlsZS4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzICpuZXh0OwotICBiZmRfdm1hIHRvdGFsOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBMaXN0IG9mIHRvdGFscyB3ZSBoYXZlIGZvdW5kIGZvciB0aGlzIGZpbGUuICAqLwotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqdG90YWxzOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogRHVyaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAgd2UgbmVlZCB0byBwYXNzIGFyb3VuZCBhIGJ1bmNoIG9mCi0gICBpbmZvcm1hdGlvbiwgc28gd2UgZG8gaXQgaW4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBiZmQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFJlbG9jIGZpbGUgcG9zaXRpb25zLiAgKi8KLSAgZmlsZV9wdHIgdHJlbG9mZiwgZHJlbG9mZjsKLSAgLyogRmlsZSBwb3NpdGlvbiBvZiBzeW1ib2xzLiAgKi8KLSAgZmlsZV9wdHIgc3ltb2ZmOwotICAvKiBTdHJpbmcgdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7Ci0gIC8qIEhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlIGluY2x1ZGVzOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYW55IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLwotICBQVFIgcmVsb2NzOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc3ltYm9sIG1hcCBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgaW50ICpzeW1ib2xfbWFwOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRwdXRfc3ltczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX3dyaXRlX3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgZmlsZV9wdHIgKnJlbG9mZl9wdHIsCi0JICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZSkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLAotCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUsIGJmZF9ieXRlICpjb250ZW50cykpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0Ci0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqLAotCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUsIGJmZF9ieXRlICpjb250ZW50cykpOwotc3RhdGljIElOTElORSBhc2VjdGlvbiAqYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnRvdGFscyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gIFRoaXMgaXMgY2FsbGVkIG9uIHRoZSBvdXRwdXQgQkZELiAgVGhlCi0gICBJTkZPIHN0cnVjdHVyZSBzaG91bGQgcG9pbnQgdG8gYSBsaXN0IG9mIEJGRHMgbGlua2VkIHRocm91Z2ggdGhlCi0gICBsaW5rX25leHQgZmllbGQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBlYWNoIEJGRCB3aGljaCB0YWtlcyBwYXJ0Ci0gICBpbiB0aGUgb3V0cHV0LiAgQWxzbywgZWFjaCBzZWN0aW9uIGluIEFCRkQgc2hvdWxkIHBvaW50IHRvIGEgbGlzdAotICAgb2YgYmZkX2xpbmtfb3JkZXIgc3RydWN0dXJlcyB3aGljaCBsaXN0IGFsbCB0aGUgaW5wdXQgc2VjdGlvbnMgZm9yCi0gICB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIGNhbGxiYWNrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICB2b2lkICgqY2FsbGJhY2spIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci17Ci0gIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyBhb3V0X2luZm87Ci0gIGJvb2xlYW4gaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCA9IGZhbHNlOwotICByZWdpc3RlciBiZmQgKnN1YjsKLSAgYmZkX3NpemVfdHlwZSB0cnNpemUsIGRyc2l6ZTsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBzaXplX3QgbWF4X3JlbG9jc19zaXplOwotICBzaXplX3QgbWF4X3N5bV9jb3VudDsKLSAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0gIGZpbGVfcHRyIHRleHRfZW5kOwotICByZWdpc3RlciBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIGFzZWN0aW9uICpvOwotICBib29sZWFuIGhhdmVfbGlua19vcmRlcl9yZWxvY3M7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGFvdXRfaW5mby5pbmZvID0gaW5mbzsKLSAgYW91dF9pbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBhb3V0X2luZm8uY29udGVudHMgPSBOVUxMOwotICBhb3V0X2luZm8ucmVsb2NzID0gTlVMTDsKLSAgYW91dF9pbmZvLnN5bWJvbF9tYXAgPSBOVUxMOwotICBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPSBOVUxMOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAoJmFvdXRfaW5mby5pbmNsdWRlcy5yb290LAotCQkJICAgICAgIGFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jLAotCQkJICAgICAgIDI1MSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3Qgc2VjdGlvbiBzaXplLiAgQWxzbywgaWYgZ2VuZXJhdGluZwotICAgICByZWxvY2F0ZWFibGUgb3V0cHV0LCBjb3VudCB0aGUgcmVsb2NzLiAgKi8KLSAgdHJzaXplID0gMDsKLSAgZHJzaXplID0gMDsKLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfcmVsb2NzX3NpemUgPSAwOwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHN1YikgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0JICAgIHsKLQkgICAgICB0cnNpemUgKz0gZXhlY19oZHIgKHN1YiktPmFfdHJzaXplOwotCSAgICAgIGRyc2l6ZSArPSBleGVjX2hkciAoc3ViKS0+YV9kcnNpemU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBXZSBuZWVkIHRvIGlkZW50aWZ5IHRoZSAudGV4dCBhbmQgLmRhdGEgc2VjdGlvbnMKLQkJIGFuZCBjYWxsIGdldF9yZWxvY191cHBlcl9ib3VuZCBhbmQgY2Fub25pY2FsaXplX3JlbG9jIHRvCi0JCSB3b3JrIG91dCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBuZWVkZWQsIGFuZCB0aGVuIG11bHRpcGx5Ci0JCSBieSB0aGUgcmVsb2Mgc2l6ZS4gICovCi0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogcmVsb2NhdGVhYmxlIGxpbmsgZnJvbSAlcyB0byAlcyBub3Qgc3VwcG9ydGVkIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJIHN1Yi0+eHZlYy0+bmFtZSwgYWJmZC0+eHZlYy0+bmFtZSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc3ViKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLQl7Ci0JICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKHN1Yiwgb2JqX3RleHRzZWMgKHN1YikpOwotCSAgaWYgKHN6ID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JICAgIG1heF9jb250ZW50c19zaXplID0gc3o7Ci0JICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKHN1Yiwgb2JqX2RhdGFzZWMgKHN1YikpOwotCSAgaWYgKHN6ID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JICAgIG1heF9jb250ZW50c19zaXplID0gc3o7Ci0KLQkgIHN6ID0gZXhlY19oZHIgKHN1YiktPmFfdHJzaXplOwotCSAgaWYgKHN6ID4gbWF4X3JlbG9jc19zaXplKQotCSAgICBtYXhfcmVsb2NzX3NpemUgPSBzejsKLQkgIHN6ID0gZXhlY19oZHIgKHN1YiktPmFfZHJzaXplOwotCSAgaWYgKHN6ID4gbWF4X3JlbG9jc19zaXplKQotCSAgICBtYXhfcmVsb2NzX3NpemUgPSBzejsKLQotCSAgc3ogPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKHN1Yik7Ci0JICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCSAgICBtYXhfc3ltX2NvdW50ID0gc3o7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGlmIChvYmpfdGV4dHNlYyAoYWJmZCkgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JdHJzaXplICs9IChfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzIChvYmpfdGV4dHNlYyAoYWJmZCkKLQkJCQkJCSAtPmxpbmtfb3JkZXJfaGVhZCkKLQkJICAgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICAgICAgaWYgKG9ial9kYXRhc2VjIChhYmZkKSAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQlkcnNpemUgKz0gKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKG9ial9kYXRhc2VjIChhYmZkKQotCQkJCQkJIC0+bGlua19vcmRlcl9oZWFkKQotCQkgICAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgfQotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSB0cnNpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSBkcnNpemU7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICAvKiBBZGp1c3QgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIHZtYXMgYWNjb3JkaW5nIHRvIHRoZSBtYWdpYyBudW1iZXIuCi0gICAgIFRoaXMgc2V0cyBhX3RleHQsIGFfZGF0YSBhbmQgYV9ic3MgaW4gdGhlIGV4ZWNfaGRyIGFuZCBzZXRzIHRoZQotICAgICBmaWxlcG9zIGZvciBlYWNoIHNlY3Rpb24uICAqLwotICBpZiAoISBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgcmVsb2NhdGlvbiBhbmQgc3ltYm9sIGZpbGUgcG9zaXRpb25zIGRpZmZlciBhbW9uZyBhLm91dAotICAgICB0YXJnZXRzLiAgV2UgYXJlIHBhc3NlZCBhIGNhbGxiYWNrIHJvdXRpbmUgZnJvbSB0aGUgYmFja2VuZAotICAgICBzcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSB0aGlzLgotICAgICBGSVhNRTogQXQgdGhpcyBwb2ludCB3ZSBkbyBub3Qga25vdyBob3cgbXVjaCBzcGFjZSB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHdpbGwgcmVxdWlyZS4gIFRoaXMgd2lsbCBub3Qgd29yayBmb3IgYW55IChub25zdGFuZGFyZCkKLSAgICAgYS5vdXQgdGFyZ2V0IHRoYXQgbmVlZHMgdG8ga25vdyB0aGUgc3ltYm9sIHRhYmxlIHNpemUgYmVmb3JlIGl0Ci0gICAgIGNhbiBjb21wdXRlIHRoZSByZWxvY2F0aW9uIGZpbGUgcG9zaXRpb25zLiAgVGhpcyBtYXkgb3IgbWF5IG5vdAotICAgICBiZSB0aGUgY2FzZSBmb3IgdGhlIGhwMzAwaHB1eCB0YXJnZXQsIGZvciBleGFtcGxlLiAgKi8KLSAgKCpjYWxsYmFjaykgKGFiZmQsICZhb3V0X2luZm8udHJlbG9mZiwgJmFvdXRfaW5mby5kcmVsb2ZmLAotCSAgICAgICAmYW91dF9pbmZvLnN5bW9mZik7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBhb3V0X2luZm8udHJlbG9mZjsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IGFvdXRfaW5mby5kcmVsb2ZmOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gYW91dF9pbmZvLnN5bW9mZjsKLQotICAvKiBXZSBrZWVwIGEgY291bnQgb2YgdGhlIHN5bWJvbHMgYXMgd2Ugb3V0cHV0IHRoZW0uICAqLwotICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpID0gMDsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBzdHJpbmcgdGFibGUgYXMgd2Ugd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYW91dF9pbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChhb3V0X2luZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQWxsb2NhdGUgYnVmZmVycyB0byBob2xkIHNlY3Rpb24gY29udGVudHMgYW5kIHJlbG9jcy4gICovCi0gIGFvdXRfaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGFvdXRfaW5mby5yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NzX3NpemUpOwotICBhb3V0X2luZm8uc3ltYm9sX21hcCA9IChpbnQgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAoaW50ICopKTsKLSAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkJCSAgIGJmZF9tYWxsb2MgKChtYXhfc3ltX2NvdW50ICsgMSkKLQkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCkpKTsKLSAgaWYgKChhb3V0X2luZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSAhPSAwKQotICAgICAgfHwgKGFvdXRfaW5mby5yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NzX3NpemUgIT0gMCkKLSAgICAgIHx8IChhb3V0X2luZm8uc3ltYm9sX21hcCA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IGFvdXRfaW5mby5vdXRwdXRfc3ltcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGhhdmUgYSBzeW1ib2wgbmFtZWQgX19EWU5BTUlDLCBmb3JjZSBpdCBvdXQgbm93LiAgVGhpcyBpcwotICAgICByZXF1aXJlZCBieSBTdW5PUy4gIERvaW5nIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiBzdW5vcy5jIGlzIGEKLSAgICAgaGFjaywgYnV0IGl0J3MgZWFzaWVyIHRoYW4gZXhwb3J0aW5nIGV2ZXJ5dGhpbmcgd2hpY2ggd291bGQgYmUKLSAgICAgbmVlZGVkLiAgKi8KLSAgewotICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgIGggPSBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKGFvdXRfaGFzaF90YWJsZSAoaW5mbyksICJfX0RZTkFNSUMiLAotCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgIGlmIChoICE9IE5VTEwpCi0gICAgICBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCAmYW91dF9pbmZvKTsKLSAgfQotCi0gIC8qIFRoZSBtb3N0IHRpbWUgZWZmaWNpZW50IHdheSB0byBkbyB0aGUgbGluayB3b3VsZCBiZSB0byByZWFkIGFsbAotICAgICB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGludG8gbWVtb3J5IGFuZCB0aGVuIHNvcnQgb3V0IHRoZQotICAgICBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFVuZm9ydHVuYXRlbHksIHRoYXQgd2lsbAotICAgICBwcm9iYWJseSB1c2UgdG9vIG11Y2ggbWVtb3J5LiAgQW5vdGhlciBtZXRob2Qgd291bGQgYmUgdG8gc3RlcAotICAgICB0aHJvdWdoIGV2ZXJ5dGhpbmcgdGhhdCBjb21wb3NlcyB0aGUgdGV4dCBzZWN0aW9uIGFuZCB3cml0ZSBpdAotICAgICBvdXQsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgdGhhdCBjb21wb3NlcyB0aGUgZGF0YSBzZWN0aW9uIGFuZCB3cml0ZQotICAgICBpdCBvdXQsIGFuZCB0aGVuIHdyaXRlIG91dCB0aGUgcmVsb2NzLCBhbmQgdGhlbiB3cml0ZSBvdXQgdGhlCi0gICAgIHN5bWJvbHMuICBVbmZvcnR1bmF0ZWx5LCB0aGF0IHJlcXVpcmVzIHJlYWRpbmcgc3R1ZmYgZnJvbSBlYWNoCi0gICAgIGlucHV0IGZpbGUgc2V2ZXJhbCB0aW1lcywgYW5kIHdlIHdpbGwgbm90IGJlIGFibGUgdG8ga2VlcCBhbGwgdGhlCi0gICAgIGlucHV0IGZpbGVzIG9wZW4gc2ltdWx0YW5lb3VzbHksIGFuZCByZW9wZW5pbmcgdGhlbSB3aWxsIGJlIHNsb3cuCi0KLSAgICAgV2hhdCB3ZSBkbyBpcyBiYXNpY2FsbHkgcHJvY2VzcyBvbmUgaW5wdXQgZmlsZSBhdCBhIHRpbWUuICBXZSBkbwotICAgICBldmVyeXRoaW5nIHdlIG5lZWQgdG8gZG8gd2l0aCBhbiBpbnB1dCBmaWxlIG9uY2UtLWNvcHkgb3ZlciB0aGUKLSAgICAgc2VjdGlvbiBjb250ZW50cywgaGFuZGxlIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBhbmQgd3JpdGUKLSAgICAgb3V0IHRoZSBzeW1ib2xzLS1hbmQgdGhlbiB3ZSB0aHJvdyBhd2F5IHRoZSBpbmZvcm1hdGlvbiB3ZSByZWFkCi0gICAgIGZyb20gaXQuICBUaGlzIGFwcHJvYWNoIHJlcXVpcmVzIGEgbG90IG9mIGxzZWVrcyBvZiB0aGUgb3V0cHV0Ci0gICAgIGZpbGUsIHdoaWNoIGlzIHVuZm9ydHVuYXRlIGJ1dCBzdGlsbCBmYXN0ZXIgdGhhbiByZW9wZW5pbmcgYSBsb3QKLSAgICAgb2YgZmlsZXMuCi0KLSAgICAgV2UgdXNlIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkIG9mIHRoZSBpbnB1dCBCRkRzIHRvIHNlZQotICAgICB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIGl0LiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gKGJmZCAqKSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLQotICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBUaGlzCi0gICAgIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB0aGF0IHdlCi0gICAgIGNhbiBpZGVudGlmeSBhbnkgc2VjdGlvbnMgd2hpY2ggdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QKLSAgICAgaW5jbHVkZS4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5saW5rZXJfbWFyayA9IHRydWU7Ci0JfQotICAgIH0KLQotICBoYXZlX2xpbmtfb3JkZXJfcmVsb2NzID0gZmFsc2U7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCi0JICAgICAgaW5wdXRfYmZkID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBpbnB1dF9iZmQtPm91dHB1dF9oYXNfYmVndW4pCi0JCXsKLQkJICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfYmZkICgmYW91dF9pbmZvLCBpbnB1dF9iZmQpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgaW5wdXRfYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICAvKiBUaGVzZSBhcmUgaGFuZGxlZCBiZWxvdy4gICovCi0JICAgICAgaGF2ZV9saW5rX29yZGVyX3JlbG9jcyA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCBhbnkgc3ltYm9scyB0aGF0IHdlIGhhdmUgbm90IGFscmVhZHkgd3JpdHRlbiBvdXQuICAqLwotICBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSAoYW91dF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wsCi0JCQkgICAoUFRSKSAmYW91dF9pbmZvKTsKLQotICAvKiBOb3cgaGFuZGxlIGFueSByZWxvY3Mgd2Ugd2VyZSBhc2tlZCB0byBjcmVhdGUgYnkgdGhlIGxpbmtlci4KLSAgICAgVGhlc2UgZGlkIG5vdCBjb21lIGZyb20gYW55IGlucHV0IGZpbGUuICBXZSBtdXN0IGRvIHRoZXNlIGFmdGVyCi0gICAgIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBzeW1ib2xzLCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbAotICAgICBpbmRpY2VzIHRvIHVzZS4gICovCi0gIGlmIChoYXZlX2xpbmtfb3JkZXJfcmVsb2NzKQotICAgIHsKLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkJewotCQkgIGlmICghIGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyICgmYW91dF9pbmZvLCBvLCBwKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChhb3V0X2luZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8uY29udGVudHMpOwotICAgICAgYW91dF9pbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8ucmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYW91dF9pbmZvLnJlbG9jcyk7Ci0gICAgICBhb3V0X2luZm8ucmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8uc3ltYm9sX21hcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGFvdXRfaW5mby5zeW1ib2xfbWFwKTsKLSAgICAgIGFvdXRfaW5mby5zeW1ib2xfbWFwID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8ub3V0cHV0X3N5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8ub3V0cHV0X3N5bXMpOwotICAgICAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhb3V0X2luZm8uaW5jbHVkZXMucm9vdCk7Ci0gICAgICBpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEZpbmlzaCB1cCBhbnkgZHluYW1pYyBsaW5raW5nIHdlIG1heSBiZSBkb2luZy4gICovCi0gIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmZpbmlzaF9keW5hbWljX2xpbmsgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZmluaXNoX2R5bmFtaWNfbGluaykgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIGFiZmQtPnN5bWNvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBhYmZkLT5zeW1jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpICsgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUsIHVubGVzcyB0aGVyZSBhcmUgbm8gc3ltYm9scy4gICovCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgYW91dF9pbmZvLnN0cnRhYikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBlbHNlIGlmIChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID09IDAKLQkgICAmJiBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYiA9IDA7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zCi0JCSAgICAgKyBleGVjX2hkciAoYWJmZCktPmFfZGF0YQotCQkgICAgIC0gMSksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhb3V0X2luZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8uY29udGVudHMpOwotICBpZiAoYW91dF9pbmZvLnJlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5yZWxvY3MpOwotICBpZiAoYW91dF9pbmZvLnN5bWJvbF9tYXAgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8uc3ltYm9sX21hcCk7Ci0gIGlmIChhb3V0X2luZm8ub3V0cHV0X3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8ub3V0cHV0X3N5bXMpOwotICBpZiAoaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCkKLSAgICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYW91dF9pbmZvLmluY2x1ZGVzLnJvb3QpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIExpbmsgYW4gYS5vdXQgaW5wdXQgQkZEIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLQotICBCRkRfQVNTRVJUIChiZmRfZ2V0X2Zvcm1hdCAoaW5wdXRfYmZkKSA9PSBiZmRfb2JqZWN0KTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIGl0IG1heSBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiBhb3V0X2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+bGlua19keW5hbWljX29iamVjdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiAoKCphb3V0X2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+bGlua19keW5hbWljX29iamVjdCkKLQkgICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCkpOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHN5bWJvbHMuICBXZSBwcm9iYWJseSBoYXZlIHRoZW0gYWxyZWFkeSwgdW5sZXNzCi0gICAgIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZS4gICovCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoaW5wdXRfYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHN5bWJvbHMgYW5kIGdldCBhIG1hcCBvZiB0aGUgbmV3IGluZGljZXMuICBUaGUgbWFwCi0gICAgIGlzIHBsYWNlZCBpbnRvIGZpbmZvLT5zeW1ib2xfbWFwLiAgKi8KLSAgaWYgKCEgYW91dF9saW5rX3dyaXRlX3N5bWJvbHMgKGZpbmZvLCBpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWxvY2F0ZSBhbmQgd3JpdGUgb3V0IHRoZSBzZWN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyB1c2UgdGhlCi0gICAgIHN5bWJvbCBtYXAgY3JlYXRlZCBieSBhb3V0X2xpbmtfd3JpdGVfc3ltYm9scy4gIFRoZSBsaW5rZXJfbWFyawotICAgICBmaWVsZCB3aWxsIGJlIHNldCBpZiB0aGVzZSBzZWN0aW9ucyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgIGxpbmssIHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgdGhlIGNhc2UuICAqLwotICBpZiAob2JqX3RleHRzZWMgKGlucHV0X2JmZCktPmxpbmtlcl9tYXJrKQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uIChmaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgb2JqX3RleHRzZWMgKGlucHV0X2JmZCksCi0JCQkJICAgICAmZmluZm8tPnRyZWxvZmYsCi0JCQkJICAgICBleGVjX2hkciAoaW5wdXRfYmZkKS0+YV90cnNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKS0+bGlua2VyX21hcmspCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb24gKGZpbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICZmaW5mby0+ZHJlbG9mZiwKLQkJCQkgICAgIGV4ZWNfaGRyIChpbnB1dF9iZmQpLT5hX2Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IGtlZXBpbmcgbWVtb3J5LCB3ZSBkb24ndCBuZWVkIHRoZSBzeW1ib2xzIGFueQotICAgICBsb25nZXIuICBXZSBzdGlsbCBuZWVkIHRoZW0gaWYgd2UgYXJlIGtlZXBpbmcgbWVtb3J5LCBiZWNhdXNlIHRoZQotICAgICBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIHBvaW50IGludG8gdGhlbS4gICovCi0gIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhbmQgd3JpdGUgb3V0IHRoZSBzeW1ib2xzIGZvciBhbiBhLm91dCBmaWxlLiAgU2V0IHRoZSBuZXcKLSAgIHN5bWJvbCBpbmRpY2VzIGludG8gYSBzeW1ib2xfbWFwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua193cml0ZV9zeW1ib2xzIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLSAgY2hhciAqc3RyaW5nczsKLSAgZW51bSBiZmRfbGlua19zdHJpcCBzdHJpcDsKLSAgZW51bSBiZmRfbGlua19kaXNjYXJkIGRpc2NhcmQ7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqb3V0c3ltOwotICBiZmRfc2l6ZV90eXBlIHN0cnRhYl9pbmRleDsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW07Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGludCAqc3ltYm9sX21hcDsKLSAgYm9vbGVhbiBwYXNzOwotICBib29sZWFuIHNraXBfbmV4dDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoaW5wdXRfYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7Ci0gIHN0cmlwID0gZmluZm8tPmluZm8tPnN0cmlwOwotICBkaXNjYXJkID0gZmluZm8tPmluZm8tPmRpc2NhcmQ7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRwdXRfc3ltczsKLQotICAvKiBGaXJzdCB3cml0ZSBvdXQgYSBzeW1ib2wgZm9yIHRoaXMgb2JqZWN0IGZpbGUsIHVubGVzcyB3ZSBhcmUKLSAgICAgZGlzY2FyZGluZyBzdWNoIHN5bWJvbHMuICAqLwotICBpZiAoc3RyaXAgIT0gc3RyaXBfYWxsCi0gICAgICAmJiAoc3RyaXAgIT0gc3RyaXBfc29tZQotCSAgfHwgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBpbnB1dF9iZmQtPmZpbGVuYW1lLAotCQkJICAgICAgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotICAgICAgJiYgZGlzY2FyZCAhPSBkaXNjYXJkX2FsbCkKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgTl9URVhULCBvdXRzeW0tPmVfdHlwZSk7Ci0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX290aGVyKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG91dHN5bS0+ZV9kZXNjKTsKLSAgICAgIHN0cnRhYl9pbmRleCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsCi0JCQkJICAgICAgIGlucHV0X2JmZC0+ZmlsZW5hbWUsIGZhbHNlKTsKLSAgICAgIGlmIChzdHJ0YWJfaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBzdHJ0YWJfaW5kZXgsIG91dHN5bS0+ZV9zdHJ4KTsKLSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAotCQkoYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkgICAgICBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKS0+b3V0cHV0X3NlY3Rpb24pCi0JCSArIG9ial90ZXh0c2VjIChpbnB1dF9iZmQpLT5vdXRwdXRfb2Zmc2V0KSwKLQkJb3V0c3ltLT5lX3ZhbHVlKTsKLSAgICAgICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb3V0c3ltOwotICAgIH0KLQotICBwYXNzID0gZmFsc2U7Ci0gIHNraXBfbmV4dCA9IGZhbHNlOwotICBzeW0gPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBzeW1fZW5kID0gc3ltICsgc3ltX2NvdW50OwotICBzeW1faGFzaCA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKLSAgbWVtc2V0IChzeW1ib2xfbWFwLCAwLCBzeW1fY291bnQgKiBzaXplb2YgKnN5bWJvbF9tYXApOwotICBmb3IgKDsgc3ltIDwgc3ltX2VuZDsgc3ltKyssIHN5bV9oYXNoKyssIHN5bWJvbF9tYXArKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgaW50IHR5cGU7Ci0gICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBhc2VjdGlvbiAqc3ltc2VjOwotICAgICAgYmZkX3ZtYSB2YWwgPSAwOwotICAgICAgYm9vbGVhbiBjb3B5OwotCi0gICAgICAvKiBXZSBzZXQgKnN5bWJvbF9tYXAgdG8gMCBhYm92ZSBmb3IgYWxsIHN5bWJvbHMuICBJZiBpdCBoYXMKLSAgICAgICAgIGFscmVhZHkgYmVlbiBzZXQgdG8gLTEgZm9yIHRoaXMgc3ltYm9sLCBpdCBtZWFucyB0aGF0IHdlIGFyZQotICAgICAgICAgZGlzY2FyZGluZyBpdCBiZWNhdXNlIGl0IGFwcGVhcnMgaW4gYSBkdXBsaWNhdGUgaGVhZGVyIGZpbGUuCi0gICAgICAgICBTZWUgdGhlIE5fQklOQ0wgY29kZSBiZWxvdy4gICovCi0gICAgICBpZiAoKnN5bWJvbF9tYXAgPT0gLTEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgKnN5bWJvbF9tYXAgdG8gLTEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN5bWJvbCB3YXMKLSAgICAgICAgIG5vdCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSB3aWxsIGNoYW5nZSBpdCBsYXRlciBpZgotICAgICAgICAgd2UgZG8gY29weSB0aGUgc3ltYm9sIG92ZXIuICAqLwotICAgICAgKnN5bWJvbF9tYXAgPSAtMTsKLQotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV90eXBlKTsKLSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3N0cngpOwotCi0gICAgICBoID0gTlVMTDsKLQotICAgICAgaWYgKHBhc3MpCi0JewotCSAgLyogUGFzcyB0aGlzIHN5bWJvbCB0aHJvdWdoLiAgSXQgaXMgdGhlIHRhcmdldCBvZiBhbgotCSAgICAgaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuICAqLwotCSAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKLQkgIHBhc3MgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChza2lwX25leHQpCi0JewotCSAgLyogU2tpcCB0aGlzIHN5bWJvbCwgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdAotCSAgICAgc3ltYm9sIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkIHRvIG5vIGxvbmdlciBiZSBhbiBpbmRpcmVjdAotCSAgICAgc3ltYm9sLiAgKi8KLQkgIHNraXBfbmV4dCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaHJlc29sdmU7Ci0KLQkgIC8qIFdlIGhhdmUgc2F2ZWQgdGhlIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sLCBpZgotCSAgICAgdGhlcmUgaXMgb25lLiAgTm90ZSB0aGF0IHdlIGNvdWxkIGp1c3QgbG9vayBpdCB1cCBhZ2FpbgotCSAgICAgaW4gdGhlIGhhc2ggdGFibGUsIHByb3ZpZGVkIHdlIGZpcnN0IGNoZWNrIHRoYXQgaXQgaXMgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbC4gKi8KLQkgIGggPSAqc3ltX2hhc2g7Ci0KLQkgIC8qIFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoIHRhYmxlLCBpbiBjYXNlIHRoZSBzeW1ib2wgd2FzCi0gICAgICAgICAgICAgd3JhcHBlZC4gICovCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQotCSAgLyogSWYgdGhpcyBpcyBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbCwgdGhlbiBjaGFuZ2UKLQkgICAgIGhyZXNvbHZlIHRvIHRoZSBiYXNlIHN5bWJvbC4gIFdlIGFsc28gY2hhbmdlICpzeW1faGFzaCBzbwotCSAgICAgdGhhdCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lcyByZWxvY2F0ZSBhZ2FpbnN0IHRoZSByZWFsCi0JICAgICBzeW1ib2wuICAqLwotCSAgaHJlc29sdmUgPSBoOwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykpCi0JICAgIHsKLQkgICAgICBocmVzb2x2ZSA9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgICAgICB3aGlsZSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgICAgfHwgaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCWhyZXNvbHZlID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkJCSAgICBocmVzb2x2ZS0+cm9vdC51LmkubGluayk7Ci0JICAgICAgKnN5bV9oYXNoID0gaHJlc29sdmU7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LCBza2lwIGl0LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3dhcm5pbmcKLQkgICAgICAmJiBoLT53cml0dGVuKQotCSAgICB7Ci0JICAgICAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0lORFIKLQkJICB8fCB0eXBlID09IE5fV0FSTklORykKLQkJc2tpcF9uZXh0ID0gdHJ1ZTsKLQkgICAgICAqc3ltYm9sX21hcCA9IGgtPmluZHg7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogU2VlIGlmIHdlIGFyZSBzdHJpcHBpbmcgdGhpcyBzeW1ib2wuICAqLwotCSAgc2tpcCA9IGZhbHNlOwotCSAgc3dpdGNoIChzdHJpcCkKLQkgICAgewotCSAgICBjYXNlIHN0cmlwX25vbmU6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2Ugc3RyaXBfZGVidWdnZXI6Ci0JICAgICAgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzdHJpcF9zb21lOgotCSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkJICA9PSBOVUxMKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzdHJpcF9hbGw6Ci0JICAgICAgc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChza2lwKQotCSAgICB7Ci0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQloLT53cml0dGVuID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotCSAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX1RFWFQKLQkgICAgICB8fCB0eXBlID09IE5fV0VBS1QpCi0JICAgIHN5bXNlYyA9IG9ial90ZXh0c2VjIChpbnB1dF9iZmQpOwotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fREFUQQotCQkgICB8fCB0eXBlID09IE5fV0VBS0QpCi0JICAgIHN5bXNlYyA9IG9ial9kYXRhc2VjIChpbnB1dF9iZmQpOwotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQlNTCi0JCSAgIHx8IHR5cGUgPT0gTl9XRUFLQikKLQkgICAgc3ltc2VjID0gb2JqX2Jzc3NlYyAoaW5wdXRfYmZkKTsKLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0FCUwotCQkgICB8fCB0eXBlID09IE5fV0VBS0EpCi0JICAgIHN5bXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmICgoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUgotCQkgICAgJiYgKGhyZXNvbHZlID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkJfHwgKGhyZXNvbHZlLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgJiYgaHJlc29sdmUtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJCSAgICAmJiBocmVzb2x2ZS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKSkpCi0JCSAgIHx8IHR5cGUgPT0gTl9XQVJOSU5HKQotCSAgICB7Ci0JICAgICAgLyogUGFzcyB0aGUgbmV4dCBzeW1ib2wgdGhyb3VnaCB1bmNoYW5nZWQuICBUaGUKLQkJIGNvbmRpdGlvbiBhYm92ZSBmb3IgaW5kaXJlY3Qgc3ltYm9scyBpcyBzbyB0aGF0IGlmCi0JCSB0aGUgaW5kaXJlY3Qgc3ltYm9sIHdhcyBkZWZpbmVkLCB3ZSBvdXRwdXQgaXQgd2l0aAotCQkgdGhlIGNvcnJlY3QgZGVmaW5pdGlvbiBzbyB0aGUgZGVidWdnZXIgd2lsbAotCQkgdW5kZXJzdGFuZCBpdC4gICovCi0JICAgICAgcGFzcyA9IHRydWU7Ci0JICAgICAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKLQkgICAgICBzeW1zZWMgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fU1RBQikgIT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSk7Ci0JICAgICAgc3ltc2VjID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2l0aCBhbiBpbmRpcmVjdCBzeW1ib2wsIGl0IG1lYW5zIHRoYXQKLQkJIHdlIGFyZSBvdXRwdXR0aW5nIGl0IHdpdGggYSByZWFsIGRlZmluaXRpb24uICBJbiBzdWNoCi0JCSBhIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gb3V0cHV0IHRoZSBuZXh0IHN5bWJvbCwKLQkJIHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGluZGlyZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUikKLQkJc2tpcF9uZXh0ID0gdHJ1ZTsKLQotCSAgICAgIHN5bXNlYyA9IE5VTEw7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgaGFzaCB0YWJsZS4gIFdlIHVzZQotCQkgaHJlc29sdmUgc28gdGhhdCBpZiB3ZSBoYXZlIGRlZmluZWQgYW4gaW5kaXJlY3QKLQkJIHN5bWJvbCB3ZSBvdXRwdXQgdGhlIGZpbmFsIGRlZmluaXRpb24uICAqLwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJewotCQkgIHN3aXRjaCAodHlwZSAmIE5fVFlQRSkKLQkJICAgIHsKLQkJICAgIGNhc2UgTl9TRVRUOgotCQkgICAgICBzeW1zZWMgPSBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIE5fU0VURDoKLQkJICAgICAgc3ltc2VjID0gb2JqX2RhdGFzZWMgKGlucHV0X2JmZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBOX1NFVEI6Ci0JCSAgICAgIHN5bXNlYyA9IG9ial9ic3NzZWMgKGlucHV0X2JmZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBOX1NFVEE6Ci0JCSAgICAgIHN5bXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgdmFsID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAgfHwgaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBUaGlzIGNhc2UgdXN1YWxseSBtZWFucyBhIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2FzCi0JCSAgICAgdHVybmVkIGludG8gYSBkZWZpbmVkIHN5bWJvbC4gICovCi0JCSAgaW5wdXRfc2VjdGlvbiA9IGhyZXNvbHZlLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgb3V0cHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICBCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCQkJICAgICAgfHwgb3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCQkgIHZhbCA9IChocmVzb2x2ZS0+cm9vdC51LmRlZi52YWx1ZQotCQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pCi0JCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkgIC8qIEdldCB0aGUgY29ycmVjdCB0eXBlIGJhc2VkIG9uIHRoZSBzZWN0aW9uLiAgSWYKLQkJICAgICB0aGlzIGlzIGEgY29uc3RydWN0ZWQgc2V0LCBmb3JjZSBpdCB0byBiZQotCQkgICAgIGdsb2JhbGx5IHZpc2libGUuICAqLwotCQkgIGlmICh0eXBlID09IE5fU0VUVAotCQkgICAgICB8fCB0eXBlID09IE5fU0VURAotCQkgICAgICB8fCB0eXBlID09IE5fU0VUQgotCQkgICAgICB8fCB0eXBlID09IE5fU0VUQSkKLQkJICAgIHR5cGUgfD0gTl9FWFQ7Ci0KLQkJICB0eXBlICY9fiBOX1RZUEU7Ci0KLQkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX1RFWFQKLQkJCSAgICAgOiBOX1dFQUtUKTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICA/IE5fREFUQQotCQkJICAgICA6IE5fV0VBS0QpOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX0JTUwotCQkJICAgICA6IE5fV0VBS0IpOwotCQkgIGVsc2UKLQkJICAgIHR5cGUgfD0gKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgID8gTl9BQlMKLQkJCSAgICAgOiBOX1dFQUtBKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JCXZhbCA9IGhyZXNvbHZlLT5yb290LnUuYy5zaXplOwotCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXsKLQkJICB2YWwgPSAwOwotCQkgIHR5cGUgPSBOX1dFQUtVOwotCQl9Ci0JICAgICAgZWxzZQotCQl2YWwgPSAwOwotCSAgICB9Ci0JICBpZiAoc3ltc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICB2YWwgPSAoc3ltc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3ltc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSkKLQkJICAgICAgLSBzeW1zZWMtPnZtYSkpOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCBzZXQgdGhlIHdyaXR0ZW4gZmxhZywgYW5kIGlmCi0JICAgICBpdCBpcyBhIGxvY2FsIHN5bWJvbCBzZWUgaWYgd2Ugc2hvdWxkIGRpc2NhcmQgaXQuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgaC0+d3JpdHRlbiA9IHRydWU7Ci0JICAgICAgaC0+aW5keCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVFQKLQkJICAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VURAotCQkgICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRCCi0JCSAgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEEpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGRpc2NhcmQpCi0JCXsKLQkJY2FzZSBkaXNjYXJkX25vbmU6Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9sOgotCQkgIGlmICgodHlwZSAmIE5fU1RBQikgPT0gMAotCQkgICAgICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlIGRpc2NhcmRfYWxsOgotCQkgIHNraXAgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaWYgKHNraXApCi0JCXsKLQkJICBwYXNzID0gZmFsc2U7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBBbiBOX0JJTkNMIHN5bWJvbCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBzdGFicwotCSAgICAgZW50cmllcyBmb3IgYSBoZWFkZXIgZmlsZS4gIFdlIG5lZWQgdG8gc2NhbiBhaGVhZCB0byB0aGUKLQkgICAgIG5leHQgTl9FSU5DTCBzeW1ib2wsIGlnbm9yaW5nIG5lc3RpbmcsIGFkZGluZyB1cCBhbGwgdGhlCi0JICAgICBjaGFyYWN0ZXJzIGluIHRoZSBzeW1ib2wgbmFtZXMsIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUKLQkgICAgIG51bWJlcnMgaW4gdHlwZXMgKHRoZSBmaXJzdCBudW1iZXIgYWZ0ZXIgYW4gb3BlbgotCSAgICAgcGFyZW50aGVzaXMpLiAgKi8KLQkgIGlmICh0eXBlID09IE5fQklOQ0wpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmluY2xfc3ltOwotCSAgICAgIGludCBuZXN0OwotCSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKmluY2xfZW50cnk7Ci0JICAgICAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKnQ7Ci0KLQkgICAgICB2YWwgPSAwOwotCSAgICAgIG5lc3QgPSAwOwotCSAgICAgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyAxOyBpbmNsX3N5bSA8IHN5bV9lbmQ7IGluY2xfc3ltKyspCi0JCXsKLQkJICBpbnQgaW5jbF90eXBlOwotCi0JCSAgaW5jbF90eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfdHlwZSk7Ci0JCSAgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQkgICAgewotCQkgICAgICBpZiAobmVzdCA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICAgIC0tbmVzdDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJICAgICsrbmVzdDsKLQkJICBlbHNlIGlmIChuZXN0ID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLQkJICAgICAgcyA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBpbmNsX3N5bS0+ZV9zdHJ4KTsKLQkJICAgICAgZm9yICg7ICpzICE9ICdcMCc7IHMrKykKLQkJCXsKLQkJCSAgdmFsICs9ICpzOwotCQkJICBpZiAoKnMgPT0gJygnKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLQkJCSAgICAgICsrczsKLQkJCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkJCSsrczsKLQkJCSAgICAgIC0tczsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIGhlYWRlciBmaWxlIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgIHNhbWUgdmFsdWUsIHRoZW4gcmVwbGFjZSB0aGlzIG9uZSB3aXRoIGFuIE5fRVhDTAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGNvcHkgPSAhIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeTsKLQkgICAgICBpbmNsX2VudHJ5ID0gYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCAoJmZpbmZvLT5pbmNsdWRlcywKLQkJCQkJCSAgICAgIG5hbWUsIHRydWUsIGNvcHkpOwotCSAgICAgIGlmIChpbmNsX2VudHJ5ID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBmb3IgKHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JCWlmICh0LT50b3RhbCA9PSB2YWwpCi0JCSAgYnJlYWs7Ci0JICAgICAgaWYgKHQgPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBzZWVuIHRoaXMgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICBmaWxlIHdpdGggdGhpcyBzZXQgb2Ygc3RhYnMgc3RyaW5ncy4gICovCi0JCSAgdCA9ICgoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKikKLQkJICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmZmluZm8tPmluY2x1ZGVzLnJvb3QsCi0JCQkJCSAgc2l6ZW9mICp0KSk7Ci0JCSAgaWYgKHQgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB0LT50b3RhbCA9IHZhbDsKLQkJICB0LT5uZXh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOwotCQkgIGluY2xfZW50cnktPnRvdGFscyA9IHQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgKmluY2xfbWFwOwotCi0JCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBoZWFkZXIgZmlsZS4gIFdlIG11c3QgY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgICBpdCB0byBiZSBhbiBOX0VYQ0wgZW50cnksIGFuZCBtYXJrIGFsbCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIHN5bWJvbHMgdG8gcHJldmVudCBvdXRwdXR0aW5nIHRoZW0uICAqLwotCQkgIHR5cGUgPSBOX0VYQ0w7Ci0KLQkJICBuZXN0ID0gMDsKLQkJICBmb3IgKGluY2xfc3ltID0gc3ltICsgMSwgaW5jbF9tYXAgPSBzeW1ib2xfbWFwICsgMTsKLQkJICAgICAgIGluY2xfc3ltIDwgc3ltX2VuZDsKLQkJICAgICAgIGluY2xfc3ltKyssIGluY2xfbWFwKyspCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbmNsX3R5cGU7Ci0KLQkJICAgICAgaW5jbF90eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfdHlwZSk7Ci0JCSAgICAgIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKLQkJCXsKLQkJCSAgaWYgKG5lc3QgPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICAqaW5jbF9tYXAgPSAtMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgLS1uZXN0OwotCQkJfQotCQkgICAgICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJCSsrbmVzdDsKLQkJICAgICAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQkJKmluY2xfbWFwID0gLTE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogQ29weSB0aGlzIHN5bWJvbCBpbnRvIHRoZSBsaXN0IG9mIHN5bWJvbHMgd2UgYXJlIGdvaW5nIHRvCi0JIHdyaXRlIG91dC4gICovCi0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgdHlwZSwgb3V0c3ltLT5lX3R5cGUpOwotICAgICAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV9vdGhlciksCi0JCSAgIG91dHN5bS0+ZV9vdGhlcik7Ci0gICAgICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIGJmZF9oX2dldF8xNiAoaW5wdXRfYmZkLCBzeW0tPmVfZGVzYyksCi0JCSAgICBvdXRzeW0tPmVfZGVzYyk7Ci0gICAgICBjb3B5ID0gZmFsc2U7Ci0gICAgICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0JewotCSAgLyogbmFtZSBwb2ludHMgaW50byBhIHN0cmluZyB0YWJsZSB3aGljaCB3ZSBhcmUgZ29pbmcgdG8KLQkgICAgIGZyZWUuICBJZiB0aGVyZSBpcyBhIGhhc2ggdGFibGUgZW50cnksIHVzZSB0aGF0IHN0cmluZy4KLQkgICAgIE90aGVyd2lzZSwgY29weSBuYW1lIGludG8gbWVtb3J5LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIGNvcHkgPSB0cnVlOwotCX0KLSAgICAgIHN0cnRhYl9pbmRleCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsCi0JCQkJICAgICAgIG5hbWUsIGNvcHkpOwotICAgICAgaWYgKHN0cnRhYl9pbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHN0cnRhYl9pbmRleCwgb3V0c3ltLT5lX3N0cngpOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLT5lX3ZhbHVlKTsKLSAgICAgICpzeW1ib2xfbWFwID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb3V0c3ltOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIG91dHB1dCBzeW1ib2xzIHdlIGhhdmUganVzdCBjb25zdHJ1Y3RlZC4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0cHV0X3N5bXMpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBvdXRzeW1fY291bnQ7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgZmluZm8tPnN5bW9mZiwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb3V0c3ltX2NvdW50ID0gb3V0c3ltIC0gZmluZm8tPm91dHB1dF9zeW1zOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZmluZm8tPm91dHB1dF9zeW1zLAotCQkgICAgIChiZmRfc2l6ZV90eXBlKSBFWFRFUk5BTF9OTElTVF9TSVpFLAotCQkgICAgIChiZmRfc2l6ZV90eXBlKSBvdXRzeW1fY291bnQsIG91dHB1dF9iZmQpCi0JICAhPSBvdXRzeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZpbmZvLT5zeW1vZmYgKz0gb3V0c3ltX2NvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN5bWJvbCB0aGF0IHdhcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGEub3V0IGlucHV0Ci0gICBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBpbnQgdHlwZTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBvdXRzeW07Ci0gIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0KLSAgaWYgKGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+d3JpdGVfZHluYW1pY19zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCphb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPndyaXRlX2R5bmFtaWNfc3ltYm9sKQotCSAgICAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBoKSkpCi0JewotCSAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPndyaXR0ZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+d3JpdHRlbiA9IHRydWU7Ci0KLSAgLyogQW4gaW5keCBvZiAtMiBtZWFucyB0aGUgc3ltYm9sIG11c3QgYmUgd3JpdHRlbi4gICovCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIC8qIEF2b2lkIHZhcmlhYmxlIG5vdCBpbml0aWFsaXplZCB3YXJuaW5ncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBzZXQgc3ltYm9scyB3aGVuIHNldHMgYXJlIG5vdCBiZWluZwotICAgICAgICAgYnVpbHQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2VjOwotCi0Jc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQlCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLQkJICAgIHx8IHNlYy0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0JaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fVEVYVCA6IE5fV0VBS1Q7Ci0JZWxzZSBpZiAoc2VjID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9EQVRBIDogTl9XRUFLRDsKLQllbHNlIGlmIChzZWMgPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fQlNTIDogTl9XRUFLQjsKLQllbHNlCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fQUJTIDogTl9XRUFLQTsKLQl0eXBlIHw9IE5fRVhUOwotCXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JICAgICAgICsgc2VjLT52bWEKLQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IGgtPnJvb3QudS5jLnNpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgdHlwZSA9IE5fV0VBS1U7Ci0gICAgICB2YWwgPSAwOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCB0eXBlLCBvdXRzeW0uZV90eXBlKTsKLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIDAsIG91dHN5bS5lX290aGVyKTsKLSAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0uZV9kZXNjKTsKLSAgaW5keCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgICBmYWxzZSk7Ci0gIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIGhhbmRsZSBlcnJvcnMuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBQVVRfV09SRCAob3V0cHV0X2JmZCwgaW5keCwgb3V0c3ltLmVfc3RyeCk7Ci0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWwsIG91dHN5bS5lX3ZhbHVlKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIGZpbmZvLT5zeW1vZmYsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZvdXRzeW0sIChiZmRfc2l6ZV90eXBlKSBFWFRFUk5BTF9OTElTVF9TSVpFLAotCQkgICAgKGJmZF9zaXplX3R5cGUpIDEsIG91dHB1dF9iZmQpICE9IEVYVEVSTkFMX05MSVNUX1NJWkUpCi0gICAgewotICAgICAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBmaW5mby0+c3ltb2ZmICs9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIGgtPmluZHggPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICArK29ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExpbmsgYW4gYS5vdXQgc2VjdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfc2VjdGlvbiAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2ZmX3B0ciwKLQkJCSByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBmaWxlX3B0ciAqcmVsb2ZmX3B0cjsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgYmZkX3NpemVfdHlwZSBpbnB1dF9zaXplOwotICBQVFIgcmVsb2NzOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlucHV0X3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIChQVFIpIGZpbmZvLT5jb250ZW50cywKLQkJCQkgIChmaWxlX3B0cikgMCwgaW5wdXRfc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlYWQgaW4gdGhlIHJlbG9jcyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBpdC4gICovCi0gIGlmIChhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbikgIT0gTlVMTAotICAgICAgJiYgYW91dF9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MgIT0gTlVMTCkKLSAgICByZWxvY3MgPSBhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jczsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jcyA9IGZpbmZvLT5yZWxvY3M7Ci0gICAgICBpZiAocmVsX3NpemUgPiAwKQotCXsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxfc2l6ZSwgaW5wdXRfYmZkKSAhPSByZWxfc2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzLAotCQkJCQkgcmVsX3NpemUsIGZpbmZvLT5jb250ZW50cykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkJIHJlbF9zaXplLCBmaW5mby0+Y29udGVudHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgZmluZm8tPmNvbnRlbnRzLAotCQkJCSAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJCQkgIGlucHV0X3NpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZSByZWxvY3Mgd2VyZQotICAgICBtb2RpZmllZCwgYW5kIHdlIG5vdyB3cml0ZSB0aGVtIG91dC4gICovCi0gIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlICYmIHJlbF9zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGZpbmZvLT5vdXRwdXRfYmZkLCAqcmVsb2ZmX3B0ciwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF93cml0ZSAocmVsb2NzLCAoYmZkX3NpemVfdHlwZSkgMSwgcmVsX3NpemUsIGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgIT0gcmVsX3NpemUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgKnJlbG9mZl9wdHIgKz0gcmVsX3NpemU7Ci0KLSAgICAgIC8qIEFzc2VydCB0aGF0IHRoZSByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIHN5bWJvbHMsIGFuZAotCSB0aGF0IGlmIHRoZXNlIGFyZSB0aGUgdGV4dCByZWxvY3MgdGhleSBoYXZlIG5vdCBydW4gaW50byB0aGUKLQkgZGF0YSByZWxvY3MuICAqLwotICAgICAgQkZEX0FTU0VSVCAoKnJlbG9mZl9wdHIgPD0gb2JqX3N5bV9maWxlcG9zIChmaW5mby0+b3V0cHV0X2JmZCkKLQkJICAmJiAocmVsb2ZmX3B0ciAhPSAmZmluZm8tPnRyZWxvZmYKLQkJICAgICAgfHwgKCpyZWxvZmZfcHRyCi0JCQkgIDw9IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCktPnJlbF9maWxlcG9zKSkpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWxvYyBpbmRleC4gICovCi0KLXN0YXRpYyBJTkxJTkUgYXNlY3Rpb24gKgotYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChhYmZkLCBpbmR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpbmR4OwotewotICBzd2l0Y2ggKGluZHggJiBOX1RZUEUpCi0gICAgewotICAgIGNhc2UgTl9URVhUOgotICAgICAgcmV0dXJuIG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHJldHVybiBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgY2FzZSBOX0JTUzoKLSAgICAgIHJldHVybiBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICBjYXNlIE5fQUJTOgotICAgIGNhc2UgTl9VTkRGOgotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIGEub3V0IHNlY3Rpb24gdXNpbmcgc3RhbmRhcmQgYS5vdXQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NzLAotCQkJICAgICByZWxfc2l6ZSwgY29udGVudHMpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGJvb2xlYW4gKCpjaGVja19keW5hbWljX3JlbG9jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgIFBUUiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqLAotCQkJCQkgIGJmZF92bWEgKikpOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGludCAqc3ltYm9sX21hcDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxfZW5kOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgY2hlY2tfZHluYW1pY19yZWxvYyA9IGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+Y2hlY2tfZHluYW1pY19yZWxvYzsKLQotICBCRkRfQVNTRVJUIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSk7Ci0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcgotCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIpOwotCi0gIHJlbG9jYXRlYWJsZSA9IGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGU7Ci0gIHN5bXMgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoaW5wdXRfYmZkKTsKLSAgc3ltX2hhc2hlcyA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKLQotICByZWxvY19jb3VudCA9IHJlbF9zaXplIC8gUkVMT0NfU1REX1NJWkU7Ci0gIHJlbCA9IHJlbG9jczsKLSAgcmVsX2VuZCA9IHJlbCArIHJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSByX2FkZHI7Ci0gICAgICBpbnQgcl9pbmRleDsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIGludCByX3BjcmVsOwotICAgICAgaW50IHJfYmFzZXJlbCA9IDA7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9hZGRyID0gR0VUX1NXT1JEIChpbnB1dF9iZmQsIHJlbC0+cl9hZGRyZXNzKTsKLQotI2lmZGVmIE1ZX3JlbG9jX2hvd3RvCi0gICAgICBob3d0byA9IE1ZX3JlbG9jX2hvd3RvKGlucHV0X2JmZCwgcmVsLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCk7Ci0jZWxzZSAgICAgIAotICAgICAgewotCWludCByX2ptcHRhYmxlOwotCWludCByX3JlbGF0aXZlOwotCWludCByX2xlbmd0aDsKLQl1bnNpZ25lZCBpbnQgaG93dG9faWR4OwotCi0JaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkgIHsKLQkgICAgcl9pbmRleCAgID0gICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkJICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgfCByZWwtPnJfaW5kZXhbMl0pOwotCSAgICByX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSk7Ci0JICAgIHJfcGNyZWwgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotCSAgICByX2Jhc2VyZWwgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRykpOwotCSAgICByX2ptcHRhYmxlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKLQkgICAgcl9yZWxhdGl2ZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHKSk7Ci0JICAgIHJfbGVuZ3RoICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQotCQkJID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgcl9pbmRleCAgID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCQkgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgfCByZWwtPnJfaW5kZXhbMF0pOwotCSAgICByX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0JICAgIHJfcGNyZWwgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotCSAgICByX2Jhc2VyZWwgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0KLQkJCSAgICAgICAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7Ci0JICAgIHJfam1wdGFibGU9ICgwICE9IChyZWwtPnJfdHlwZVswXQotCQkJICAgICAgICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKSk7Ci0JICAgIHJfcmVsYXRpdmU9ICgwICE9IChyZWwtPnJfdHlwZVswXQotCQkJICAgICAgICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFKSk7Ci0JICAgIHJfbGVuZ3RoICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQkJID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOwotCSAgfQotCi0JaG93dG9faWR4ID0gKHJfbGVuZ3RoICsgNCAqIHJfcGNyZWwgKyA4ICogcl9iYXNlcmVsCi0JCSAgICAgKyAxNiAqIHJfam1wdGFibGUgKyAzMiAqIHJfcmVsYXRpdmUpOwotCUJGRF9BU1NFUlQgKGhvd3RvX2lkeCA8IFRBQkxFX1NJWkUgKGhvd3RvX3RhYmxlX3N0ZCkpOwotCWhvd3RvID0gaG93dG9fdGFibGVfc3RkICsgaG93dG9faWR4OwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JewotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUsIGFuZCBtdXN0Ci0JICAgICBtb2RpZnkgdGhlIHJlbG9jIGFjY29yZGluZ2x5LiAgKi8KLQkgIGlmIChyX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGtub3cgdGhlIHN5bWJvbCB0aGlzIHJlbG9jYXRpb24gaXMgYWdhaW5zdCwKLQkJIGNvbnZlcnQgaXQgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBUaGlzCi0JCSBpcyB3aGF0IHRoZSBuYXRpdmUgbGlua2VyIGRvZXMuICAqLwotCSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0JCSAgLyogQ2hhbmdlIHRoZSByX2V4dGVybiB2YWx1ZS4gICovCi0JCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCSAgICByZWwtPnJfdHlwZVswXSAmPX4gUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRzsKLQkJICBlbHNlCi0JCSAgICByZWwtPnJfdHlwZVswXSAmPX4gUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTsKLQotCQkgIC8qIENvbXB1dGUgYSBuZXcgcl9pbmRleC4gICovCi0JCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCQkgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9URVhUOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0RBVEE7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9CU1M7Ci0JCSAgZWxzZQotCQkgICAgcl9pbmRleCA9IE5fQUJTOwotCi0JCSAgLyogQWRkIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUKLQkJICAgICBhZGRlbmQgc3RvcmVkIGluIHRoZSBjb250ZW50cy4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBvdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UgbXVzdCBjaGFuZ2Ugcl9pbmRleCBhY2NvcmRpbmcgdG8gdGhlIHN5bWJvbAotCQkgICAgIG1hcC4gICovCi0JCSAgcl9pbmRleCA9IHN5bWJvbF9tYXBbcl9pbmRleF07Ci0KLQkJICBpZiAocl9pbmRleCA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGggIT0gTlVMTCkKLQkJCXsKLQkJCSAgLyogV2UgZGVjaWRlZCB0byBzdHJpcCB0aGlzIHN5bWJvbCwgYnV0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG91dCB0aGF0IHdlIGNhbid0LiAgTm90ZSB0aGF0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc2UgdGhlIG90aGVyIGFuZCBkZXNjIGluZm9ybWF0aW9uIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgZG9uJ3QgdGhpbmsgdGhhdCB3aWxsIGV2ZXIgbWF0dGVyIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wuICAqLwotCQkJICBpZiAoaC0+aW5keCA8IDApCi0JCQkgICAgewotCQkJICAgICAgaC0+aW5keCA9IC0yOwotCQkJICAgICAgaC0+d3JpdHRlbiA9IGZhbHNlOwotCQkJICAgICAgaWYgKCEgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwKLQkJCQkJCQkJICAoUFRSKSBmaW5mbykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQkJCSAgcl9pbmRleCA9IGgtPmluZHg7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkJICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICByX2FkZHIpKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIHJfaW5kZXggPSAwOwotCQkJfQotCQkgICAgfQotCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQotCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbmV3IHJfaW5kZXggdmFsdWUuICAqLwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQl7Ci0JCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLQkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFdlIG11c3QKLQkJIGFkanVzdCBieSB0aGUgYW1vdW50IHRoYXQgdGhlIHNlY3Rpb24gbW92ZWQuICAqLwotCSAgICAgIHNlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSBzZWN0aW9uLT52bWEpOwotCSAgICB9Ci0KLQkgIC8qIENoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbi4gICovCi0JICBQVVRfV09SRCAob3V0cHV0X2JmZCwKLQkJICAgIHJfYWRkciArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCSAgICByZWwtPnJfYWRkcmVzcyk7Ci0KLQkgIC8qIEFkanVzdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gYnkgcmVtb3ZpbmcgdGhlIHJlZmVyZW5jZQotCSAgICAgdG8gdGhlIG9yaWdpbmFsIGFkZHJlc3MgaW4gdGhlIHNlY3Rpb24gYW5kIGluY2x1ZGluZyB0aGUKLQkgICAgIHJlZmVyZW5jZSB0byB0aGUgbmV3IGFkZHJlc3MuICAqLwotCSAgaWYgKHJfcGNyZWwpCi0JICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0jaWZkZWYgTVlfcmVsb2NhdGFibGVfcmVsb2MKLQkgIE1ZX3JlbG9jYXRhYmxlX3JlbG9jIChob3d0bywgb3V0cHV0X2JmZCwgcmVsLCByZWxvY2F0aW9uLCByX2FkZHIpOwotI2VuZGlmCi0KLQkgIGlmIChyZWxvY2F0aW9uID09IDApCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JICBlbHNlCi0JICAgIHIgPSBNWV9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCWlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkJY29udGVudHMgKyByX2FkZHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBib29sZWFuIGh1bmRlZjsKLQotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYW4gZXhlY3V0YWJsZSwgYW5kIG11c3QgZG8gYSBmdWxsCi0JICAgICByZWxvY2F0aW9uLiAgKi8KLQkgIGh1bmRlZiA9IGZhbHNlOwotCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBodW5kZWYgPSB0cnVlOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAgICAgc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkgICAgICByZWxvY2F0aW9uID0gKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHNlY3Rpb24tPnZtYSk7Ci0JICAgICAgaWYgKHJfcGNyZWwpCi0JCXJlbG9jYXRpb24gKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgICB9Ci0KLQkgIGlmIChjaGVja19keW5hbWljX3JlbG9jICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBib29sZWFuIHNraXA7Ci0KLQkgICAgICBpZiAoISAoKCpjaGVja19keW5hbWljX3JlbG9jKQotCQkgICAgIChmaW5mby0+aW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLAotCQkgICAgICAoUFRSKSByZWwsIGNvbnRlbnRzLCAmc2tpcCwgJnJlbG9jYXRpb24pKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChza2lwKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBOb3cgd2FybiBpZiBhIGdsb2JhbCBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgV2UgY291bGQgbm90Ci0gICAgICAgICAgICAgZG8gdGhpcyBlYXJsaWVyLCBiZWNhdXNlIGNoZWNrX2R5bmFtaWNfcmVsb2MgbWlnaHQgd2FudAotICAgICAgICAgICAgIHRvIHNraXAgdGhpcyByZWxvYy4gICovCi0JICBpZiAoaHVuZGVmICYmICEgZmluZm8tPmluZm8tPnNoYXJlZCAmJiAhIHJfYmFzZXJlbCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQluYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICBlbHNlCi0JCW5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCSAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgciA9IE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgcl9hZGRyLCByZWxvY2F0aW9uLAotCQkJCSAgICAgIChiZmRfdm1hKSAwKTsKLQl9Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UgaWYgKHJfZXh0ZXJuKQotCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJICAgICBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqczsKLQotCQkgICAgcyA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkJICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQkgIH0KLQkJaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLAotCQkJKGJmZF92bWEpIDAsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIGEub3V0IHNlY3Rpb24gdXNpbmcgZXh0ZW5kZWQgYS5vdXQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NzLAotCQkJICAgICByZWxfc2l6ZSwgY29udGVudHMpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGJvb2xlYW4gKCpjaGVja19keW5hbWljX3JlbG9jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgIFBUUiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqLAotCQkJCQkgIGJmZF92bWEgKikpOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGludCAqc3ltYm9sX21hcDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsOwotICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWxfZW5kOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgY2hlY2tfZHluYW1pY19yZWxvYyA9IGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+Y2hlY2tfZHluYW1pY19yZWxvYzsKLQotICBCRkRfQVNTRVJUIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19FWFRfU0laRSk7Ci0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcgotCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIpOwotCi0gIHJlbG9jYXRlYWJsZSA9IGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGU7Ci0gIHN5bXMgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoaW5wdXRfYmZkKTsKLSAgc3ltX2hhc2hlcyA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKLQotICByZWxvY19jb3VudCA9IHJlbF9zaXplIC8gUkVMT0NfRVhUX1NJWkU7Ci0gIHJlbCA9IHJlbG9jczsKLSAgcmVsX2VuZCA9IHJlbCArIHJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSByX2FkZHI7Ci0gICAgICBpbnQgcl9pbmRleDsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gICAgICBiZmRfdm1hIHJfYWRkZW5kOwotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGFzZWN0aW9uICpyX3NlY3Rpb24gPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICByX2FkZHIgPSBHRVRfU1dPUkQgKGlucHV0X2JmZCwgcmVsLT5yX2FkZHJlc3MpOwotCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCXsKLQkgIHJfaW5kZXggID0gKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLQkgIHJfdHlwZSAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfaW5kZXggID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLQkgIHJfdHlwZSAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0JfQotCi0gICAgICByX2FkZGVuZCA9IEdFVF9TV09SRCAoaW5wdXRfYmZkLCByZWwtPnJfYWRkZW5kKTsKLQotICAgICAgQkZEX0FTU0VSVCAocl90eXBlIDwgVEFCTEVfU0laRSAoaG93dG9fdGFibGVfZXh0KSk7Ci0KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JewotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUsIGFuZCBtdXN0Ci0JICAgICBtb2RpZnkgdGhlIHJlbG9jIGFjY29yZGluZ2x5LiAgKi8KLQkgIGlmIChyX2V4dGVybgotCSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JICAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGtub3cgdGhlIHN5bWJvbCB0aGlzIHJlbG9jYXRpb24gaXMgYWdhaW5zdCwKLQkJIGNvbnZlcnQgaXQgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBUaGlzCi0JCSBpcyB3aGF0IHRoZSBuYXRpdmUgbGlua2VyIGRvZXMuICAqLwotCSAgICAgIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JCSAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JCWggPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBDaGFuZ2UgdGhlIHJfZXh0ZXJuIHZhbHVlLiAgKi8KLQkJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHOwotCQkgIGVsc2UKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX2luZGV4LiAgKi8KLQkJICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fREFUQTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0JTUzsKLQkJICBlbHNlCi0JCSAgICByX2luZGV4ID0gTl9BQlM7Ci0KLQkJICAvKiBBZGQgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZQotCQkgICAgIGFkZGVuZC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBvdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgLyogTm93IFJFTE9DQVRJT04gaXMgdGhlIFZNQSBvZiB0aGUgZmluYWwKLQkJICAgICBkZXN0aW5hdGlvbi4gIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywKLQkJICAgICB0aGVuIEFEREVORCBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIHNvdXJjZSBWTUEuCi0JCSAgICAgV2Ugd2FudCB0byBzZXQgQURERU5EIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJICAgICB0aGUgZGVzdGluYXRpb24gVk1BIGFuZCB0aGUgc291cmNlIFZNQSwgd2hpY2gKLQkJICAgICBtZWFucyB3ZSBtdXN0IGFkanVzdCBSRUxPQ0FUSU9OIGJ5IHRoZSBjaGFuZ2UgaW4KLQkJICAgICB0aGUgc291cmNlIFZNQS4gIFRoaXMgaXMgZG9uZSBiZWxvdy4gICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNoYW5nZSByX2luZGV4IGFjY29yZGluZyB0byB0aGUgc3ltYm9sCi0JCSAgICAgbWFwLiAgKi8KLQkJICByX2luZGV4ID0gc3ltYm9sX21hcFtyX2luZGV4XTsKLQotCQkgIGlmIChyX2luZGV4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQkJewotCQkJICAvKiBXZSBkZWNpZGVkIHRvIHN0cmlwIHRoaXMgc3ltYm9sLCBidXQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QuICBOb3RlIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24gaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBkb24ndCB0aGluayB0aGF0IHdpbGwgZXZlciBtYXR0ZXIgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbC4gICovCi0JCQkgIGlmIChoLT5pbmR4IDwgMCkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5pbmR4ID0gLTI7Ci0JCQkgICAgICBoLT53cml0dGVuID0gZmFsc2U7Ci0JCQkgICAgICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLAotCQkJCQkJCQkgIChQVFIpIGZpbmZvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJICByX2luZGV4ID0gaC0+aW5keDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHJfYWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgcl9pbmRleCA9IDA7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gMDsKLQotCQkgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiB0aGUgYWRkZW5kCi0JCSAgICAgaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSBzb3VyY2UgVk1BLiAgV2UgbXVzdAotCQkgICAgIGFkanVzdCBpdCBieSB0aGUgY2hhbmdlIGluIHRoZSBzb3VyY2UgVk1BLiAgVGhpcwotCQkgICAgIGlzIGRvbmUgYmVsb3cuICAqLwotCQl9Ci0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIG5ldyByX2luZGV4IHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgV2UgbXVzdAotCQkgYWRqdXN0IGJ5IHRoZSBhbW91bnQgdGhhdCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCi0JICAgICAgcl9zZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAocl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyByX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHJfc2VjdGlvbi0+dm1hKTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiB0aGUgYWRkZW5kIGlzCi0JCSB0aGUgZGlmZmVyZW5jZSBpbiBWTUEgYmV0d2VlbiB0aGUgZGVzdGluYXRpb24gYW5kIHRoZQotCQkgc291cmNlLiAgV2UgaGF2ZSBqdXN0IGFkanVzdGVkIGZvciB0aGUgY2hhbmdlIGluIFZNQQotCQkgb2YgdGhlIGRlc3RpbmF0aW9uLCBzbyB3ZSBtdXN0IGFsc28gYWRqdXN0IGJ5IHRoZQotCQkgY2hhbmdlIGluIFZNQSBvZiB0aGUgc291cmNlLiAgVGhpcyBpcyBkb25lIGJlbG93LiAgKi8KLQkgICAgfQotCi0JICAvKiBBcyBkZXNjcmliZWQgYWJvdmUsIHdlIG11c3QgYWx3YXlzIGFkanVzdCBhIFBDIHJlbGF0aXZlCi0JICAgICByZWxvYyBieSB0aGUgY2hhbmdlIGluIFZNQSBvZiB0aGUgc291cmNlLiAgSG93ZXZlciwgaWYKLQkgICAgIHBjcmVsX29mZnNldCBpcyBzZXQsIHRoZW4gdGhlIGFkZGVuZCBkb2VzIG5vdCBpbmNsdWRlIHRoZQotCSAgICAgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IG5lZWQKLQkgICAgIHRvIGFkanVzdCBhbnl0aGluZy4gICovCi0JICBpZiAoaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ucGNfcmVsYXRpdmUKLQkgICAgICAmJiAhIGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLnBjcmVsX29mZnNldCkKLQkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgIC8qIENoYW5nZSB0aGUgYWRkZW5kIGlmIG5lY2Vzc2FyeS4gICovCi0JICBpZiAocmVsb2NhdGlvbiAhPSAwKQotCSAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRlbmQgKyByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotCSAgLyogQ2hhbmdlIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLQkgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAotCQkgICAgcl9hZGRyICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHJlbC0+cl9hZGRyZXNzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYm9vbGVhbiBodW5kZWY7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYW4gZXhlY3V0YWJsZSwgYW5kIG11c3QgZG8gYSBmdWxsCi0JICAgICByZWxvY2F0aW9uLiAgKi8KLQkgIGh1bmRlZiA9IGZhbHNlOwotCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBodW5kZWYgPSB0cnVlOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW07Ci0JICAgICAgaW50IHR5cGU7Ci0KLQkgICAgICAvKiBGb3IgYmFzZSByZWxhdGl2ZSByZWxvY3MsIHJfaW5kZXggaXMgYWx3YXlzIGFuIGluZGV4Ci0gICAgICAgICAgICAgICAgIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgZXZlbiBpZiByX2V4dGVybiBpcyAwLiAgKi8KLQkgICAgICBzeW0gPSBzeW1zICsgcl9pbmRleDsKLQkgICAgICB0eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgc3ltLT5lX3R5cGUpOwotCSAgICAgIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9URVhUCi0JCSAgfHwgdHlwZSA9PSBOX1dFQUtUKQotCQlyX3NlY3Rpb24gPSBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKTsKLQkgICAgICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9EQVRBCi0JCSAgICAgICB8fCB0eXBlID09IE5fV0VBS0QpCi0JCXJfc2VjdGlvbiA9IG9ial9kYXRhc2VjIChpbnB1dF9iZmQpOwotCSAgICAgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0JTUwotCQkgICAgICAgfHwgdHlwZSA9PSBOX1dFQUtCKQotCQlyX3NlY3Rpb24gPSBvYmpfYnNzc2VjIChpbnB1dF9iZmQpOwotCSAgICAgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0FCUwotCQkgICAgICAgfHwgdHlwZSA9PSBOX1dFQUtBKQotCQlyX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIGVsc2UKLQkJYWJvcnQgKCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChyX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICsgKEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSkKLQkJCSAgICAgICAtIHJfc2VjdGlvbi0+dm1hKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJfc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiBSX0FEREVORCBpcyB0aGUKLQkJIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHZtYXMsIG9yCi0JCSAgIG9sZF9kZXN0X3NlYyArIG9sZF9kZXN0X29mZiAtIChvbGRfc3JjX3NlYyArIG9sZF9zcmNfb2ZmKQotCQkgd2hlcmUKLQkJICAgb2xkX2Rlc3Rfc2VjID09IHNlY3Rpb24tPnZtYQotCQkgYW5kCi0JCSAgIG9sZF9zcmNfc2VjID09IGlucHV0X3NlY3Rpb24tPnZtYQotCQkgYW5kCi0JCSAgIG9sZF9zcmNfb2ZmID09IHJfYWRkcgotCi0JCSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgZXhwZWN0cyBSRUxPQ0FUSU9OICsKLQkJIFJfQURERU5EIHRvIGJlIHRoZSBWTUEgb2YgdGhlIGRlc3RpbmF0aW9uIG1pbnVzCi0JCSByX2FkZHIgKHRoZSBtaW51cyByX2FkZHIgaXMgYmVjYXVzZSB0aGlzIHJlbG9jYXRpb24KLQkJIGlzIG5vdCBwY3JlbF9vZmZzZXQsIHdoaWNoIGlzIGEgYml0IGNvbmZ1c2luZyBhbmQKLQkJIHNob3VsZCwgcGVyaGFwcywgYmUgY2hhbmdlZCksIG9yCi0JCSAgIG5ld19kZXN0X3NlYwotCQkgd2hlcmUKLQkJICAgbmV3X2Rlc3Rfc2VjID09IG91dHB1dF9zZWN0aW9uLT52bWEgKyBvdXRwdXRfb2Zmc2V0Ci0JCSBXZSBhcnJhbmdlIGZvciB0aGlzIHRvIGhhcHBlbiBieSBzZXR0aW5nIFJFTE9DQVRJT04gdG8KLQkJICAgbmV3X2Rlc3Rfc2VjICsgb2xkX3NyY19zZWMgLSBvbGRfZGVzdF9zZWMKLQotCQkgSWYgdGhpcyBpcyBub3QgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiBSX0FEREVORCBpcwotCQkgc2ltcGx5IHRoZSBWTUEgb2YgdGhlIGRlc3RpbmF0aW9uLCBzbyB3ZSBzZXQKLQkJIFJFTE9DQVRJT04gdG8gdGhlIGNoYW5nZSBpbiB0aGUgZGVzdGluYXRpb24gVk1BLCBvcgotCQkgICBuZXdfZGVzdF9zZWMgLSBvbGRfZGVzdF9zZWMKLQkJICovCi0JICAgICAgcmVsb2NhdGlvbiA9IChyX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcl9zZWN0aW9uLT52bWEpOwotCSAgICAgIGlmIChob3d0b190YWJsZV9leHRbcl90eXBlXS5wY19yZWxhdGl2ZSkKLQkJcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIH0KLQotCSAgaWYgKGNoZWNrX2R5bmFtaWNfcmVsb2MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAgIGlmICghICgoKmNoZWNrX2R5bmFtaWNfcmVsb2MpCi0JCSAgICAgKGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGgsCi0JCSAgICAgIChQVFIpIHJlbCwgY29udGVudHMsICZza2lwLCAmcmVsb2NhdGlvbikpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKHNraXApCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE5vdyB3YXJuIGlmIGEgZ2xvYmFsIHN5bWJvbCBpcyB1bmRlZmluZWQuICBXZSBjb3VsZCBub3QKLSAgICAgICAgICAgICBkbyB0aGlzIGVhcmxpZXIsIGJlY2F1c2UgY2hlY2tfZHluYW1pY19yZWxvYyBtaWdodCB3YW50Ci0gICAgICAgICAgICAgdG8gc2tpcCB0aGlzIHJlbG9jLiAgKi8KLQkgIGlmIChodW5kZWYKLQkgICAgICAmJiAhIGZpbmZvLT5pbmZvLT5zaGFyZWQKLQkgICAgICAmJiByX3R5cGUgIT0gUkVMT0NfQkFTRTEwCi0JICAgICAgJiYgcl90eXBlICE9IFJFTE9DX0JBU0UxMwotCSAgICAgICYmIHJfdHlwZSAhPSBSRUxPQ19CQVNFMjIpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgZWxzZQotCQluYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkgICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChyX3R5cGUgIT0gUkVMT0NfU1BBUkNfUkVWMzIpCi0JICAgIHIgPSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0b190YWJsZV9leHQgKyByX3R5cGUsCi0JCQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJfYWRkciwgcmVsb2NhdGlvbiwKLQkJCQkJcl9hZGRlbmQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB4OwotCi0JICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByX2FkZHIpOwotCSAgICAgIHggPSB4ICsgcmVsb2NhdGlvbiArIHJfYWRkZW5kOwotCSAgICAgIGJmZF9wdXRsMzIgKC8qaW5wdXRfYmZkLCovIHgsIGNvbnRlbnRzICsgcl9hZGRyKTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICBpZiAoaCAhPSBOVUxMKQotCQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJICAgIGVsc2UgaWYgKHJfZXh0ZXJuCi0JCQkgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJCSAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkJICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCQkgICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCQkgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlhc2VjdGlvbiAqczsKLQotCQkJcyA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkJCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQkgICAgICB9Ci0JCSAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCSAgIChmaW5mby0+aW5mbywgbmFtZSwgaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ubmFtZSwKLQkJCSAgICByX2FkZGVuZCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgbGluayBvcmRlciB3aGljaCBpcyBzdXBwb3NlZCB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyIChmaW5mbywgbywgcCkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jICpwcjsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIGZpbGVfcHRyICpyZWxvZmZfcHRyID0gTlVMTDsKLSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCBzcmVsOwotICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIGVyZWw7Ci0gIFBUUiByZWxfcHRyOwotCi0gIHByID0gcC0+dS5yZWxvYy5wOwotCi0gIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAocHItPnUuc2VjdGlvbikpCi0Jcl9pbmRleCA9IE5fQUJTIHwgTl9FWFQ7Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAocHItPnUuc2VjdGlvbi0+b3duZXIgPT0gZmluZm8tPm91dHB1dF9iZmQpOwotCSAgcl9pbmRleCA9IHByLT51LnNlY3Rpb24tPnRhcmdldF9pbmRleDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBCRkRfQVNTRVJUIChwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcik7Ci0gICAgICByX2V4dGVybiA9IDE7Ci0gICAgICBoID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSBwci0+dS5uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+aW5keCA+PSAwKQotCXJfaW5kZXggPSBoLT5pbmR4OwotICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCXsKLQkgIC8qIFdlIGRlY2lkZWQgdG8gc3RyaXAgdGhpcyBzeW1ib2wsIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCB3ZQotCSAgICAgY2FuJ3QuICBOb3RlIHRoYXQgd2UgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24KLQkgICAgIGhlcmUuICBJIGRvbid0IHRoaW5rIHRoYXQgd2lsbCBldmVyIG1hdHRlciBmb3IgYSBnbG9iYWwKLQkgICAgIHN5bWJvbC4gICovCi0JICBoLT5pbmR4ID0gLTI7Ci0JICBoLT53cml0dGVuID0gZmFsc2U7Ci0JICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCAoUFRSKSBmaW5mbykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJfaW5kZXggPSBoLT5pbmR4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGZpbmZvLT5pbmZvLCBwci0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJfaW5kZXggPSAwOwotCX0KLSAgICB9Ci0KLSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGZpbmZvLT5vdXRwdXRfYmZkLCBwci0+cmVsb2MpOwotICBpZiAoaG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG8gPT0gb2JqX3RleHRzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKSkKLSAgICByZWxvZmZfcHRyID0gJmZpbmZvLT50cmVsb2ZmOwotICBlbHNlIGlmIChvID09IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCkpCi0gICAgcmVsb2ZmX3B0ciA9ICZmaW5mby0+ZHJlbG9mZjsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSNpZmRlZiBNWV9wdXRfcmVsb2MKLSAgICAgIE1ZX3B1dF9yZWxvYyhmaW5mby0+b3V0cHV0X2JmZCwgcl9leHRlcm4sIHJfaW5kZXgsIHAtPm9mZnNldCwgaG93dG8sCi0JCSAgICZzcmVsKTsKLSNlbHNlCi0gICAgICB7Ci0JaW50IHJfcGNyZWw7Ci0JaW50IHJfYmFzZXJlbDsKLQlpbnQgcl9qbXB0YWJsZTsKLQlpbnQgcl9yZWxhdGl2ZTsKLQlpbnQgcl9sZW5ndGg7Ci0KLQlyX3BjcmVsID0gaG93dG8tPnBjX3JlbGF0aXZlOwotCXJfYmFzZXJlbCA9IChob3d0by0+dHlwZSAmIDgpICE9IDA7Ci0Jcl9qbXB0YWJsZSA9IChob3d0by0+dHlwZSAmIDE2KSAhPSAwOwotCXJfcmVsYXRpdmUgPSAoaG93dG8tPnR5cGUgJiAzMikgIT0gMDsKLQlyX2xlbmd0aCA9IGhvd3RvLT5zaXplOwotCi0JUFVUX1dPUkQgKGZpbmZvLT5vdXRwdXRfYmZkLCBwLT5vZmZzZXQsIHNyZWwucl9hZGRyZXNzKTsKLQlpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JICB7Ci0JICAgIHNyZWwucl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JICAgIHNyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgICAgc3JlbC5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkgICAgc3JlbC5yX3R5cGVbMF0gPQotCSAgICAgICgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IDApCi0JICAgICAgIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCSAgICAgICB8IChyX2Jhc2VyZWwgPyAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcgOiAwKQotCSAgICAgICB8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHIDogMCkKLQkgICAgICAgfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRyA6IDApCi0JICAgICAgIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBzcmVsLnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCSAgICBzcmVsLnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JICAgIHNyZWwucl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JICAgIHNyZWwucl90eXBlWzBdID0KLQkgICAgICAoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQkgICAgICAgfCAocl9iYXNlcmVsID8gIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFIDogMCkKLQkgICAgICAgfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSA6IDApCi0JICAgICAgIHwgKHJfcmVsYXRpdmUgPyBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotCSAgfQotICAgICAgfQotI2VuZGlmCi0gICAgICByZWxfcHRyID0gKFBUUikgJnNyZWw7Ci0KLSAgICAgIC8qIFdlIGhhdmUgdG8gd3JpdGUgdGhlIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwgc2luY2UKLQkgc3RhbmRhcmQgYS5vdXQgcmVsb2NzIGFyZSBpbiBwbGFjZS4gIEl0IHdvdWxkIGJlIG1vcmUKLQkgcmVsaWFibGUgaWYgd2UgaGFkIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBmaWxlIGhlcmUsCi0JIHJhdGhlciB0aGFuIGFzc3VtaW5nIHplcm9lcywgYnV0IHdlIGNhbid0IHJlYWQgdGhlIGZpbGUgc2luY2UKLQkgaXQgd2FzIG9wZW5lZCB1c2luZyBiZmRfb3BlbncuICAqLwotICAgICAgaWYgKHByLT5hZGRlbmQgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQkgIGJmZF9ieXRlICpidWY7Ci0JICBib29sZWFuIG9rOwotCi0JICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0JICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotCSAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgciA9IE1ZX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJICAgICAgcHItPmFkZGVuZCwgYnVmKTsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vazoKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGZpbmZvLT5pbmZvLAotCQkgICAgICAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgICA/IGJmZF9zZWN0aW9uX25hbWUgKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkgICBwci0+dS5zZWN0aW9uKQotCQkgICAgICAgOiBwci0+dS5uYW1lKSwKLQkJICAgICAgaG93dG8tPm5hbWUsIHByLT5hZGRlbmQsIChiZmQgKikgTlVMTCwKLQkJICAgICAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JCXsKLQkJICBmcmVlIChidWYpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoZmluZm8tPm91dHB1dF9iZmQsIG8sCi0JCQkJCSAoUFRSKSBidWYsCi0JCQkJCSAoZmlsZV9wdHIpIHAtPm9mZnNldCwKLQkJCQkJIHNpemUpOwotCSAgZnJlZSAoYnVmKTsKLQkgIGlmICghIG9rKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9XT1JEIChmaW5mby0+b3V0cHV0X2JmZCwgcC0+b2Zmc2V0LCBlcmVsLnJfYWRkcmVzcyk7Ci0KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGZpbmZvLT5vdXRwdXRfYmZkKSkKLQl7Ci0JICBlcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotCSAgZXJlbC5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCSAgZXJlbC5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkgIGVyZWwucl90eXBlWzBdID0KLQkgICAgKChyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCSAgICAgfCAoaG93dG8tPnR5cGUgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXJlbC5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQkgIGVyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgIGVyZWwucl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JICBlcmVsLnJfdHlwZVswXSA9Ci0JICAgIChyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSAgICAgIHwgKGhvd3RvLT50eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLQl9Ci0KLSAgICAgIFBVVF9XT1JEIChmaW5mby0+b3V0cHV0X2JmZCwgcHItPmFkZGVuZCwgZXJlbC5yX2FkZGVuZCk7Ci0KLSAgICAgIHJlbF9wdHIgPSAoUFRSKSAmZXJlbDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChmaW5mby0+b3V0cHV0X2JmZCwgKnJlbG9mZl9wdHIsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlIChyZWxfcHRyLCAoYmZkX3NpemVfdHlwZSkgMSwKLQkJICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpLAotCQkgICAgIGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgIT0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGZpbmZvLT5vdXRwdXRfYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpyZWxvZmZfcHRyICs9IG9ial9yZWxvY19lbnRyeV9zaXplIChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgLyogQXNzZXJ0IHRoYXQgdGhlIHJlbG9jcyBoYXZlIG5vdCBydW4gaW50byB0aGUgc3ltYm9scywgYW5kIHRoYXQgbgotICAgICB0aGUgdGV4dCByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIGRhdGEgcmVsb2NzLiAgKi8KLSAgQkZEX0FTU0VSVCAoKnJlbG9mZl9wdHIgPD0gb2JqX3N5bV9maWxlcG9zIChmaW5mby0+b3V0cHV0X2JmZCkKLQkgICAgICAmJiAocmVsb2ZmX3B0ciAhPSAmZmluZm8tPnRyZWxvZmYKLQkJICB8fCAoKnJlbG9mZl9wdHIKLQkJICAgICAgPD0gb2JqX2RhdGFzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKS0+cmVsX2ZpbGVwb3MpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJjaGl2ZS5jIGIvYmZkL2FyY2hpdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyOTNhZi4uMDAwMDAwMAotLS0gYS9iZmQvYXJjaGl2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzMCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGFyY2hpdmUgZmlsZXMgKGxpYnJhcmllcykuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBNb3N0bHkgR3VtYnkgSGVua2VsLVdhbGxhY2UncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotQHNldGZpbGVuYW1lIGFyY2hpdmUtaW5mbwotU0VDVElPTgotCUFyY2hpdmVzCi0KLURFU0NSSVBUSU9OCi0JQW4gYXJjaGl2ZSAob3IgbGlicmFyeSkgaXMganVzdCBhbm90aGVyIEJGRC4gIEl0IGhhcyBhIHN5bWJvbAotCXRhYmxlLCBhbHRob3VnaCB0aGVyZSdzIG5vdCBtdWNoIGEgdXNlciBwcm9ncmFtIHdpbGwgZG8gd2l0aCBpdC4KLQotCVRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGFyY2hpdmUgQkZEIGFuZCBhbiBvcmRpbmFyeSBCRkQKLQlpcyB0aGF0IHRoZSBhcmNoaXZlIGRvZXNuJ3QgaGF2ZSBzZWN0aW9ucy4gIEluc3RlYWQgaXQgaGFzIGEKLQljaGFpbiBvZiBCRkRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgaXRzIGNvbnRlbnRzLiAgVGhlc2UgQkZEcyBjYW4KLQliZSBtYW5pcHVsYXRlZCBsaWtlIGFueSBvdGhlci4gIFRoZSBCRkRzIGNvbnRhaW5lZCBpbiBhbgotCWFyY2hpdmUgb3BlbmVkIGZvciByZWFkaW5nIHdpbGwgYWxsIGJlIG9wZW5lZCBmb3IgcmVhZGluZy4gIFlvdQotCW1heSBwdXQgZWl0aGVyIGlucHV0IG9yIG91dHB1dCBCRkRzIGludG8gYW4gYXJjaGl2ZSBvcGVuZWQgZm9yCi0Jb3V0cHV0OyB0aGV5IHdpbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB0aGUgYXJjaGl2ZSBpcyBjbG9zZWQuCi0KLQlVc2UgPDxiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlPj4gdG8gc3RlcCB0aHJvdWdoCi0JdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgb3BlbmVkIGZvciBpbnB1dC4gIFlvdSBkb24ndAotCWhhdmUgdG8gcmVhZCB0aGUgZW50aXJlIGFyY2hpdmUgaWYgeW91IGRvbid0IHdhbnQKLQl0byEgIFJlYWQgaXQgdW50aWwgeW91IGZpbmQgd2hhdCB5b3Ugd2FudC4KLQotCUFyY2hpdmUgY29udGVudHMgb2Ygb3V0cHV0IEJGRHMgYXJlIGNoYWluZWQgdGhyb3VnaCB0aGUKLQk8PG5leHQ+PiBwb2ludGVyIGluIGEgQkZELiAgVGhlIGZpcnN0IG9uZSBpcyBmaW5kYWJsZSB0aHJvdWdoCi0JdGhlIDw8YXJjaGl2ZV9oZWFkPj4gc2xvdCBvZiB0aGUgYXJjaGl2ZS4gIFNldCBpdCB3aXRoCi0JPDxiZmRfc2V0X2FyY2hpdmVfaGVhZD4+IChxLnYuKS4gIEEgZ2l2ZW4gQkZEIG1heSBiZSBpbiBvbmx5IG9uZQotCW9wZW4gb3V0cHV0IGFyY2hpdmUgYXQgYSB0aW1lLgotCi0JQXMgZXhwZWN0ZWQsIHRoZSBCRkQgYXJjaGl2ZSBjb2RlIGlzIG1vcmUgZ2VuZXJhbCB0aGFuIHRoZQotCWFyY2hpdmUgY29kZSBvZiBhbnkgZ2l2ZW4gZW52aXJvbm1lbnQuICBCRkQgYXJjaGl2ZXMgbWF5Ci0JY29udGFpbiBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyAoZS5nLiwgYS5vdXQgYW5kIGNvZmYpIGFuZAotCWV2ZW4gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuICBZb3UgbWF5IGV2ZW4gcGxhY2UgYXJjaGl2ZXMKLQlyZWN1cnNpdmVseSBpbnRvIGFyY2hpdmVzIQotCi0JVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZCBjb25mdXNpb24sIHNpbmNlIHNvbWUgYXJjaGl2ZQotCWZvcm1hdHMgYXJlIG1vcmUgZXhwcmVzc2l2ZSB0aGFuIG90aGVycy4gIEZvciBpbnN0YW5jZSwgSW50ZWwKLQlDT0ZGIGFyY2hpdmVzIGNhbiBwcmVzZXJ2ZSBsb25nIGZpbGVuYW1lczsgU3VuT1MgYS5vdXQgYXJjaGl2ZXMKLQljYW5ub3QuICBJZiB5b3UgbW92ZSBhIGZpbGUgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIHNlY29uZAotCWZvcm1hdCBhbmQgYmFjayBhZ2FpbiwgdGhlIGZpbGVuYW1lIG1heSBiZSB0cnVuY2F0ZWQuCi0JTGlrZXdpc2UsIGRpZmZlcmVudCBhLm91dCBlbnZpcm9ubWVudHMgaGF2ZSBkaWZmZXJlbnQKLQljb252ZW50aW9ucyBhcyB0byBob3cgdGhleSB0cnVuY2F0ZSBmaWxlbmFtZXMsIHdoZXRoZXIgdGhleQotCXByZXNlcnZlIGRpcmVjdG9yeSBuYW1lcyBpbiBmaWxlbmFtZXMsIGV0Yy4gIFdoZW4KLQlpbnRlcm9wZXJhdGluZyB3aXRoIG5hdGl2ZSB0b29scywgYmUgc3VyZSB5b3VyIGZpbGVzIGFyZQotCWhvbW9nZW5lb3VzLgotCi0JQmV3YXJlOiBtb3N0IG9mIHRoZXNlIGZvcm1hdHMgZG8gbm90IHJlYWN0IHdlbGwgdG8gdGhlCi0JcHJlc2VuY2Ugb2Ygc3BhY2VzIGluIGZpbGVuYW1lcy4gIFdlIGRvIHRoZSBiZXN0IHdlIGNhbiwgYnV0Ci0JY2FuJ3QgYWx3YXlzIGhhbmRsZSB0aGlzIGNhc2UgZHVlIHRvIHJlc3RyaWN0aW9ucyBpbiB0aGUgZm9ybWF0IG9mCi0JYXJjaGl2ZXMuICBNYW55IFVuaXggdXRpbGl0aWVzIGFyZSBicmFpbmRlYWQgaW4gcmVnYXJkcyB0bwotCXNwYWNlcyBhbmQgc3VjaCBpbiBmaWxlbmFtZXMgYW55d2F5LCBzbyB0aGlzIHNob3VsZG4ndCBiZSBtdWNoCi0Jb2YgYSByZXN0cmljdGlvbi4KLQotCUFyY2hpdmVzIGFyZSBzdXBwb3J0ZWQgaW4gQkZEIGluIDw8YXJjaGl2ZS5jPj4uCi0KLSovCi0KLS8qIEFzc3VtZXM6Ci0gICBvIC0gYWxsIGFyY2hpdmUgZWxlbWVudHMgc3RhcnQgb24gYW4gZXZlbiBib3VuZGFyeSwgbmV3bGluZSBwYWRkZWQ7Ci0gICBvIC0gYWxsIGFyY2ggaGVhZGVycyBhcmUgY2hhciAqOwotICAgbyAtIGFsbCBhcmNoIGhlYWRlcnMgYXJlIHRoZSBzYW1lIHNpemUgKGFjcm9zcyBhcmNoaXRlY3R1cmVzKS4KLSovCi0KLS8qIFNvbWUgZm9ybWF0cyBwcm92aWRlIGEgd2F5IHRvIGNyYW0gYSBsb25nIGZpbGVuYW1lIGludG8gdGhlIHNob3J0Ci0gICAoMTYgY2hhcnMpIHNwYWNlIHByb3ZpZGVkIGJ5IGEgQlNEIGFyY2hpdmUuICBUaGUgdHJpY2sgaXM6IG1ha2UgYQotICAgc3BlY2lhbCAiZmlsZSIgaW4gdGhlIGZyb250IG9mIHRoZSBhcmNoaXZlLCBzb3J0IG9mIGxpa2UgdGhlIFNZTURFRgotICAgZW50cnkuICBJZiB0aGUgZmlsZW5hbWUgaXMgdG9vIGxvbmcgdG8gZml0LCBwdXQgaXQgaW4gdGhlIGV4dGVuZGVkCi0gICBuYW1lIHRhYmxlLCBhbmQgdXNlIGl0cyBpbmRleCBhcyB0aGUgZmlsZW5hbWUuICBUbyBwcmV2ZW50Ci0gICBjb25mdXNpb24gcHJlcGVuZCB0aGUgaW5kZXggd2l0aCBhIHNwYWNlLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QKLSAgIGhhdmUgZmlsZW5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIHNwYWNlLCBidXQgdGhlbiBhZ2FpbiwgbWFueSBVbml4Ci0gICB1dGlsaXRpZXMgY2FuJ3QgaGFuZGxlIHRoYXQgYW55d2F5LgotCi0gICBUaGlzIHNjaGVtZSB1bmZvcnR1bmF0ZWx5IHJlcXVpcmVzIHRoYXQgeW91IHN0YW5kIG9uIHlvdXIgaGVhZCBpbgotICAgb3JkZXIgdG8gd3JpdGUgYW4gYXJjaGl2ZSBzaW5jZSB5b3UgbmVlZCB0byBwdXQgYSBtYWdpYyBmaWxlIGF0IHRoZQotICAgZnJvbnQsIGFuZCBuZWVkIHRvIHRvdWNoIGV2ZXJ5IGVudHJ5IHRvIGRvIHNvLiAgQydlc3QgbGEgdmllLgotCi0gICBXZSBzdXBwb3J0IHR3byB2YXJpYW50cyBvZiB0aGlzIGlkZWE6Ci0gICBUaGUgU1ZSNCBmb3JtYXQgKGV4dGVuZGVkIG5hbWUgdGFibGUgaXMgbmFtZWQgIi8vIiksCi0gICBhbmQgYW4gZXh0ZW5kZWQgcHNldWRvLUJTRCB2YXJpYW50IChleHRlbmRlZCBuYW1lIHRhYmxlIGlzIG5hbWVkCi0gICAiQVJGSUxFTkFNRVMvIikuICBUaGUgb3JpZ2luIG9mIHRoZSBsYXR0ZXIgZm9ybWF0IGlzIHVuY2VydGFpbi4KLQotICAgQlNEIDQuNCB1c2VzIGEgdGhpcmQgc2NoZW1lOiAgSXQgd3JpdGVzIGEgbG9uZyBmaWxlbmFtZQotICAgZGlyZWN0bHkgYWZ0ZXIgdGhlIGhlYWRlci4gIFRoaXMgYWxsb3dzICdhciBxJyB0byB3b3JrLgotICAgV2UgY3VycmVudGx5IGNhbiByZWFkIEJTRCA0LjQgYXJjaGl2ZXMsIGJ1dCBub3Qgd3JpdGUgdGhlbS4KLSovCi0KLS8qIFN1bW1hcnkgb2YgYXJjaGl2ZSBtZW1iZXIgbmFtZXM6Ci0KLSBTeW1ib2wgdGFibGUgKG11c3QgYmUgZmlyc3QpOgotICJfXy5TWU1ERUYgICAgICAgIiAtIFN5bWJvbCB0YWJsZSwgQmVya2VsZXkgc3R5bGUsIHByb2R1Y2VkIGJ5IHJhbmxpYi4KLSAiLyAgICAgICAgICAgICAgICIgLSBTeW1ib2wgdGFibGUsIHN5c3RlbSA1IHN0eWxlLgotCi0gTG9uZyBuYW1lIHRhYmxlIChtdXN0IGJlIGJlZm9yZSByZWd1bGFyIGZpbGUgbWVtYmVycyk6Ci0gIi8vICAgICAgICAgICAgICAiIC0gTG9uZyBuYW1lIHRhYmxlLCBTeXN0ZW0gNSBSNCBzdHlsZS4KLSAiQVJGSUxFTkFNRVMvICAgICIgLSBMb25nIG5hbWUgdGFibGUsIG5vbi1zdGFuZGFyZCBleHRlbmRlZCBCU0QgKG5vdCBCU0QgNC40KS4KLQotIFJlZ3VsYXIgZmlsZSBtZW1iZXJzIHdpdGggc2hvcnQgbmFtZXM6Ci0gImZpbGVuYW1lLm8vICAgICAiIC0gUmVndWxhciBmaWxlLCBTeXN0ZW0gNSBzdHlsZSAoZW1iZWRkZWQgc3BhY2VzIG9rKS4KLSAiZmlsZW5hbWUubyAgICAgICIgLSBSZWd1bGFyIGZpbGUsIEJlcmtlbGV5IHN0eWxlIChubyBlbWJlZGRlZCBzcGFjZXMpLgotCi0gUmVndWxhciBmaWxlcyB3aXRoIGxvbmcgbmFtZXMgKG9yIGVtYmVkZGVkIHNwYWNlcywgZm9yIEJTRCB2YXJpYW50cyk6Ci0gIi8xOCAgICAgICAgICAgICAiIC0gU1ZSNCBzdHlsZSwgbmFtZSBhdCBvZmZzZXQgMTggaW4gbmFtZSB0YWJsZS4KLSAiIzEvMjMgICAgICAgICAgICIgLSBMb25nIG5hbWUgKG9yIGVtYmVkZGVkIHBhY2VzKSAyMyBjaGFyYWN0ZXJzIGxvbmcsCi0JCSAgICAgIEJTRCA0LjQgc3R5bGUsIGZ1bGwgbmFtZSBmb2xsb3dzIGhlYWRlci4KLQkJICAgICAgSW1wbGVtZW50ZWQgZm9yIHJlYWRpbmcsIG5vdCB3cml0aW5nLgotICIgMTggICAgICAgICAgICAgIiAtIExvbmcgbmFtZSAxOCBjaGFyYWN0ZXJzIGxvbmcsIGV4dGVuZGVkIHBzZXVkby1CU0QuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJhb3V0L3JhbmxpYi5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEdOVTk2MAotI2RlZmluZSBCRkRfR05VOTYwX0FSTUFHKGFiZmQpCShCRkRfQ09GRl9GSUxFX1AoKGFiZmQpKSA/IEFSTUFHIDogQVJNQUdCKQotI2VuZGlmCi0KLS8qIERlZmluZSBvZmZzZXRvZiBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBsYWNrIGl0ICovCi0KLSNpZm5kZWYgb2Zmc2V0b2YKLSNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBjYWNoZSBvZiBhcmNoaXZlIGZpbGVwb2ludGVycyB0byBhcmNoaXZlIGVsZW1lbnRzIHRvCi0gICBzcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFyY2hpdmUgYnkgZmlsZXBvcy4gIFdlIG9ubHkgYWRkIGFuIGVudHJ5IHRvCi0gICB0aGUgY2FjaGUgd2hlbiB3ZSBhY3R1YWxseSByZWFkIG9uZS4gIFdlIGFsc28gZG9uJ3Qgc29ydCB0aGUgY2FjaGU7Ci0gICBpdCdzIGdlbmVyYWxseSBzaG9ydCBlbm91Z2ggdG8gc2VhcmNoIGxpbmVhcmx5LgotICAgTm90ZSB0aGF0IHRoZSBwb2ludGVycyBoZXJlIHBvaW50IHRvIHRoZSBmcm9udCBvZiB0aGUgYXJfaGRyLCBub3QKLSAgIHRvIHRoZSBmcm9udCBvZiB0aGUgY29udGVudHMhCi0qLwotc3RydWN0IGFyX2NhY2hlCi17Ci0gIGZpbGVfcHRyIHB0cjsKLSAgYmZkICphcmVsdDsKLSAgc3RydWN0IGFyX2NhY2hlICpuZXh0OwotfTsKLQotI2RlZmluZSBhcl9wYWRjaGFyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmFyX3BhZF9jaGFyKQotI2RlZmluZSBhcl9tYXhuYW1lbGVuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmFyX21heF9uYW1lbGVuKQotCi0jZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSgoYmZkKS0+YXJlbHRfZGF0YSkpCi0jZGVmaW5lIGFyY2hfaGRyKGJmZCkgKChzdHJ1Y3QgYXJfaGRyICopYXJjaF9lbHRkYXRhKGJmZCktPmFyY2hfaGVhZGVyKQotCi1zdGF0aWMgY2hhciAqZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lIFBBUkFNUyAoKGJmZCAqYXJjaCwKLQkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIGJvb2xlYW4gZG9fc2x1cnBfYnNkX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gZG9fc2x1cnBfY29mZl9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpub3JtYWxpemUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKmZpbGUpKTsKLXN0YXRpYyBzdHJ1Y3QgYXJlbHRkYXRhICpiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJICAgICBjb25zdCBjaGFyICosCi0JCQkJCQkJICAgICBiZmQgKm1lbWJlcikpOwotDAotYm9vbGVhbgotX2JmZF9nZW5lcmljX21rYXJjaGl2ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSAoKHN0cnVjdCBhcnRkYXRhICopCi0JCQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcnRkYXRhKSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X25leHRfbWFwZW50Ci0KLVNZTk9QU0lTCi0Jc3ltaW5kZXggYmZkX2dldF9uZXh0X21hcGVudChiZmQgKmFiZmQsIHN5bWluZGV4IHByZXZpb3VzLCBjYXJzeW0gKipzeW0pOwotCi1ERVNDUklQVElPTgotCVN0ZXAgdGhyb3VnaCBhcmNoaXZlIEB2YXJ7YWJmZH0ncyBzeW1ib2wgdGFibGUgKGlmIGl0Ci0JaGFzIG9uZSkuICBTdWNjZXNzaXZlbHkgdXBkYXRlIEB2YXJ7c3ltfSB3aXRoIHRoZSBuZXh0IHN5bWJvbCdzCi0JaW5mb3JtYXRpb24sIHJldHVybmluZyB0aGF0IHN5bWJvbCdzIChpbnRlcm5hbCkgaW5kZXggaW50byB0aGUKLQlzeW1ib2wgdGFibGUuCi0KLQlTdXBwbHkgPDxCRkRfTk9fTU9SRV9TWU1CT0xTPj4gYXMgdGhlIEB2YXJ7cHJldmlvdXN9IGVudHJ5IHRvIGdldAotCXRoZSBmaXJzdCBvbmU7IHJldHVybnMgPDxCRkRfTk9fTU9SRV9TWU1CT0xTPj4gd2hlbiB5b3UndmUgYWxyZWFkeQotCWdvdCB0aGUgbGFzdCBvbmUuCi0KLQlBIDw8Y2Fyc3ltPj4gaXMgYSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2wuICBUaGUgb25seQotCXVzZXItdmlzaWJsZSBlbGVtZW50IGlzIGl0cyBuYW1lLCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCi0qLwotCi1zeW1pbmRleAotYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgcHJldiwgZW50cnkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3ltaW5kZXggcHJldjsKLSAgICAgY2Fyc3ltICoqZW50cnk7Ci17Ci0gIGlmICghYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgICB9Ci0KLSAgaWYgKHByZXYgPT0gQkZEX05PX01PUkVfU1lNQk9MUykKLSAgICBwcmV2ID0gMDsKLSAgZWxzZQotICAgICsrcHJldjsKLSAgaWYgKHByZXYgPj0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudCkKLSAgICByZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUzsKLQotICAqZW50cnkgPSAoYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgKyBwcmV2KTsKLSAgcmV0dXJuIHByZXY7Ci19Ci0KLS8qIFRvIGJlIGNhbGxlZCBieSBiYWNrZW5kcyBvbmx5ICovCi0KLWJmZCAqCi1fYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKG9iZmQpCi0gICAgIGJmZCAqb2JmZDsKLXsKLSAgcmV0dXJuIF9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gKG9iZmQpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2FyY2hpdmVfaGVhZAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9hcmNoaXZlX2hlYWQoYmZkICpvdXRwdXQsIGJmZCAqbmV3X2hlYWQpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgaGVhZCBvZiB0aGUgY2hhaW4gb2YKLQlCRkRzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZSBAdmFye291dHB1dH0gdG8gQHZhcntuZXdfaGVhZH0uCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2FyY2hpdmVfaGVhZCAob3V0cHV0X2FyY2hpdmUsIG5ld19oZWFkKQotICAgICBiZmQgKm91dHB1dF9hcmNoaXZlOwotICAgICBiZmQgKm5ld19oZWFkOwotewotCi0gIG91dHB1dF9hcmNoaXZlLT5hcmNoaXZlX2hlYWQgPSBuZXdfaGVhZDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJmZCAqCi1fYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSAoYXJjaF9iZmQsIGZpbGVwb3MpCi0gICAgIGJmZCAqYXJjaF9iZmQ7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcl9jYWNoZSAqY3VycmVudDsKLQotICBmb3IgKGN1cnJlbnQgPSBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlOyBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgaWYgKGN1cnJlbnQtPnB0ciA9PSBmaWxlcG9zKQotICAgICAgcmV0dXJuIGN1cnJlbnQtPmFyZWx0OwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBLaW5kIG9mIHN0dXBpZCB0byBjYWxsIGNvbnMgZm9yIGVhY2ggb25lLCBidXQgd2UgZG9uJ3QgZG8gdG9vIG1hbnkgKi8KLWJvb2xlYW4KLV9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIChhcmNoX2JmZCwgZmlsZXBvcywgbmV3X2VsdCkKLSAgICAgYmZkICphcmNoX2JmZCwgKm5ld19lbHQ7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcl9jYWNoZSAqbmV3X2NhY2hlID0gKChzdHJ1Y3QgYXJfY2FjaGUgKikKLQkJCQliZmRfemFsbG9jIChhcmNoX2JmZCwKLQkJCQkJICAgIHNpemVvZiAoc3RydWN0IGFyX2NhY2hlKSkpOwotCi0gIGlmIChuZXdfY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3X2NhY2hlLT5wdHIgPSBmaWxlcG9zOwotICBuZXdfY2FjaGUtPmFyZWx0ID0gbmV3X2VsdDsKLSAgbmV3X2NhY2hlLT5uZXh0ID0gKHN0cnVjdCBhcl9jYWNoZSAqKSBOVUxMOwotICBpZiAoYmZkX2FyZGF0YSAoYXJjaF9iZmQpLT5jYWNoZSA9PSBOVUxMKQotICAgIGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGUgPSBuZXdfY2FjaGU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJfY2FjaGUgKmN1cnJlbnQgPSBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlOwotCi0gICAgICB3aGlsZSAoY3VycmVudC0+bmV4dCAhPSBOVUxMKQotCWN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotICAgICAgY3VycmVudC0+bmV4dCA9IG5ld19jYWNoZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGUgbmFtZSBiZWdpbnMgd2l0aCBzcGFjZS4gIEhlbmNlIHRoZSByZXN0IG9mIHRoZSBuYW1lIGlzIGFuIGluZGV4IGludG8KLSAgIHRoZSBzdHJpbmcgdGFibGUuICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSAoYXJjaCwgbmFtZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICB1bnNpZ25lZCBsb25nIGluZGV4ID0gMDsKLQotICAvKiBTaG91bGQgZXh0cmFjdCBzdHJpbmcgc28gdGhhdCBJIGNhbiBndWFyYW50ZWUgbm90IHRvIG92ZXJmbG93IGludG8KLSAgICAgdGhlIG5leHQgcmVnaW9uLCBidXQgSSdtIHRvbyBsYXp5LiAqLwotICBlcnJubyA9IDA7Ci0gIC8qIFNraXAgZmlyc3QgY2hhciwgd2hpY2ggaXMgJy8nIGluIFNWUjQgb3IgJyAnIGluIHNvbWUgb3RoZXIgdmFyaWFudHMuICovCi0gIGluZGV4ID0gc3RydG9sIChuYW1lICsgMSwgTlVMTCwgMTApOwotICBpZiAoZXJybm8gIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfYXJkYXRhIChhcmNoKS0+ZXh0ZW5kZWRfbmFtZXMgKyBpbmRleDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbnMgcmVhZHMgYW4gYXJjaCBoZWFkZXIgYW5kIHJldHVybnMgYW4gYXJlbHRkYXRhIHBvaW50ZXIsIG9yCi0gICBOVUxMIG9uIGVycm9yLgotCi0gICBQcmVzdW1lcyB0aGUgZmlsZSBwb2ludGVyIGlzIGFscmVhZHkgaW4gdGhlIHJpZ2h0IHBsYWNlIChpZSBwb2ludGluZwotICAgdG8gdGhlIGFyX2hkciBpbiB0aGUgZmlsZSkuICAgTW92ZXMgdGhlIGZpbGUgcG9pbnRlcjsgb24gc3VjY2VzcyBpdAotICAgc2hvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBjb250ZW50czsgb24gZmFpbHVyZSBpdAotICAgY291bGQgaGF2ZSBiZWVuIG1vdmVkIGFyYml0cmFyaWx5LgotKi8KLQotUFRSCi1fYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgKGFiZmQsIChjb25zdCBjaGFyICopIE5VTEwpOwotfQotCi0vKiBBbHBoYSBFQ09GRiB1c2VzIGFuIG9wdGlvbmFsIGRpZmZlcmVudCBBUkZNQUcgdmFsdWUsIHNvIHdlIGhhdmUgYQotICAgdmFyaWFudCBvZiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgd2hpY2ggYWNjZXB0cyBhIG1hZ2ljIHN0cmluZy4gICovCi0KLVBUUgotX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyAoYWJmZCwgbWFnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm1hZzsKLXsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIGNoYXIgKmhkcnAgPSAoY2hhciAqKSAmaGRyOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7Ci0gIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IG5hbWVsZW4gPSAwOwotICB1bnNpZ25lZCBpbnQgYWxsb2NzaXplID0gc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0gIGNoYXIgKmFsbG9jcHRyID0gMDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhkcnAsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKSAhPSAwCi0gICAgICAmJiAobWFnID09IE5VTEwKLQkgIHx8IHN0cm5jbXAgKGhkci5hcl9mbWFnLCBtYWcsIDIpICE9IDApKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZXJybm8gPSAwOwotICBwYXJzZWRfc2l6ZSA9IHN0cnRvbCAoaGRyLmFyX3NpemUsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBFeHRyYWN0IHRoZSBmaWxlbmFtZSBmcm9tIHRoZSBhcmNoaXZlIC0gdGhlcmUgYXJlIHR3byB3YXlzIHRvCi0gICAgIHNwZWNpZnkgYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZSwgZWl0aGVyIHRoZSBmaXJzdCBjaGFyIG9mIHRoZQotICAgICBuYW1lIGlzIGEgc3BhY2UsIG9yIGl0J3MgYSBzbGFzaC4gICovCi0gIGlmICgoaGRyLmFyX25hbWVbMF0gPT0gJy8nCi0gICAgICAgfHwgKGhkci5hcl9uYW1lWzBdID09ICcgJwotCSAgICYmIG1lbWNociAoaGRyLmFyX25hbWUsICcvJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpID09IE5VTEwpKQotICAgICAgJiYgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZmlsZW5hbWUgPSBnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUgKGFiZmQsIGhkci5hcl9uYW1lKTsKLSAgICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotICAvKiBCU0Q0LjQtc3R5bGUgbG9uZyBmaWxlbmFtZS4KLSAgICAgT25seSBpbXBsZW1lbnRlZCBmb3IgcmVhZGluZywgc28gZmFyISAqLwotICBlbHNlIGlmIChoZHIuYXJfbmFtZVswXSA9PSAnIycKLQkgICAmJiBoZHIuYXJfbmFtZVsxXSA9PSAnMScKLQkgICAmJiBoZHIuYXJfbmFtZVsyXSA9PSAnLycKLQkgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaGRyLmFyX25hbWVbM10pKQotICAgIHsKLSAgICAgIC8qIEJTRC00LjQgZXh0ZW5kZWQgbmFtZSAqLwotICAgICAgbmFtZWxlbiA9IGF0b2kgKCZoZHIuYXJfbmFtZVszXSk7Ci0gICAgICBhbGxvY3NpemUgKz0gbmFtZWxlbiArIDE7Ci0gICAgICBwYXJzZWRfc2l6ZSAtPSBuYW1lbGVuOwotCi0gICAgICBhbGxvY3B0ciA9IGJmZF96YWxsb2MgKGFiZmQsIGFsbG9jc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2NwdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZpbGVuYW1lID0gKGFsbG9jcHRyCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIGlmIChiZmRfcmVhZCAoZmlsZW5hbWUsIDEsIG5hbWVsZW4sIGFiZmQpICE9IG5hbWVsZW4pCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBmaWxlbmFtZVtuYW1lbGVuXSA9ICdcMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UganVkZ2UgdGhlIGVuZCBvZiB0aGUgbmFtZSBieSBsb29raW5nIGZvciAnLycgb3IgJyAnLgotCSBOb3RlOiAgVGhlIFNZU1YgZm9ybWF0ICh0ZXJtaW5hdGVkIGJ5ICcvJykgYWxsb3dzIGVtYmVkZGVkCi0JIHNwYWNlcywgc28gb25seSBsb29rIGZvciAnICcgaWYgd2UgZG9uJ3QgZmluZCAnLycuICovCi0KLSAgICAgIGNoYXIgKmU7Ci0gICAgICBlID0gbWVtY2hyIChoZHIuYXJfbmFtZSwgJ1wwJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotICAgICAgaWYgKGUgPT0gTlVMTCkKLQl7Ci0gICAgICAgICAgZSA9IG1lbWNociAoaGRyLmFyX25hbWUsICcvJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotCSAgaWYgKGUgPT0gTlVMTCkKLSAgICAgICAgICAgIGUgPSBtZW1jaHIgKGhkci5hcl9uYW1lLCAnICcsIGFyX21heG5hbWVsZW4gKGFiZmQpKTsKLQl9Ci0KLSAgICAgIGlmIChlICE9IE5VTEwpCi0JbmFtZWxlbiA9IGUgLSBoZHIuYXJfbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIHRlcm1pbmF0aW9uIGNoYXJhY3RlciwgdGhlbiB0aGUgbmFtZQotCSAgICAgbXVzdCBiZSB0aGUgZW50aXJlIGZpZWxkLiAgKi8KLQkgIG5hbWVsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQl9Ci0KLSAgICAgIGFsbG9jc2l6ZSArPSBuYW1lbGVuICsgMTsKLSAgICB9Ci0KLSAgaWYgKCFhbGxvY3B0cikKLSAgICB7Ci0gICAgICBhbGxvY3B0ciA9IGJmZF96YWxsb2MgKGFiZmQsIGFsbG9jc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2NwdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXJlZCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGFsbG9jcHRyOwotCi0gIGFyZWQtPmFyY2hfaGVhZGVyID0gYWxsb2NwdHIgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpOwotICBtZW1jcHkgKChjaGFyICopIGFyZWQtPmFyY2hfaGVhZGVyLCAoY2hhciAqKSAmaGRyLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgYXJlZC0+cGFyc2VkX3NpemUgPSBwYXJzZWRfc2l6ZTsKLQotICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKLSAgICBhcmVkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgYXJlZC0+ZmlsZW5hbWUgPSBhbGxvY3B0ciArIChzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpICsKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIGlmIChuYW1lbGVuKQotCW1lbWNweSAoYXJlZC0+ZmlsZW5hbWUsIGhkci5hcl9uYW1lLCBuYW1lbGVuKTsKLSAgICAgIGFyZWQtPmZpbGVuYW1lW25hbWVsZW5dID0gJ1wwJzsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIGFyZWQ7Ci19Ci0MCi0vKiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uOyBpdCdzIG1haW5seSB1c2VkIHdoZW4gaW5kZXhpbmcKLSAgIHRocm91Z2ggdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlLCBidXQgYWxzbyB1c2VkIHRvIGdldCB0aGUgbmV4dAotICAgZWxlbWVudCwgc2luY2UgaXQgaGFuZGxlcyB0aGUgYm9va2tlZXBpbmcgc28gbmljZWx5IGZvciB1cy4gICovCi0KLWJmZCAqCi1fYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcykKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICpuZXdfYXJlbGRhdGE7Ci0gIGJmZCAqbl9uZmQ7Ci0KLSAgbl9uZmQgPSBfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSAoYXJjaGl2ZSwgZmlsZXBvcyk7Ci0gIGlmIChuX25mZCkKLSAgICByZXR1cm4gbl9uZmQ7Ci0KLSAgaWYgKDAgPiBiZmRfc2VlayAoYXJjaGl2ZSwgZmlsZXBvcywgU0VFS19TRVQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICgobmV3X2FyZWxkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYXJjaGl2ZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbl9uZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2hpdmUpOwotICBpZiAobl9uZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbmV3X2FyZWxkYXRhKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuX25mZC0+b3JpZ2luID0gYmZkX3RlbGwgKGFyY2hpdmUpOwotICBuX25mZC0+YXJlbHRfZGF0YSA9IChQVFIpIG5ld19hcmVsZGF0YTsKLSAgbl9uZmQtPmZpbGVuYW1lID0gbmV3X2FyZWxkYXRhLT5maWxlbmFtZTsKLQotICBpZiAoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgKGFyY2hpdmUsIGZpbGVwb3MsIG5fbmZkKSkKLSAgICByZXR1cm4gbl9uZmQ7Ci0KLSAgLyogaHVoPyAqLwotICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbl9uZmQpOwotICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbmV3X2FyZWxkYXRhKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgQkZEIHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgdGhlIHN5bWJvbCBpbiBBQkZEIGluZGV4ZWQgYnkKLSAgIElOREVYLiAgSU5ERVggc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSBiZmRfZ2V0X25leHRfbWFwZW50LiAgKi8KLQotYmZkICoKLV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgZW50cnktPmZpbGVfb2Zmc2V0KTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotCi1TWU5PUFNJUwotCWJmZCAqYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShiZmQgKmFyY2hpdmUsIGJmZCAqcHJldmlvdXMpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVkIGEgQkZELCBAdmFye2FyY2hpdmV9LCBjb250YWluaW5nIGFuIGFyY2hpdmUgYW5kIE5VTEwsIG9wZW4KLQlhbiBpbnB1dCBCRkQgb24gdGhlIGZpcnN0IGNvbnRhaW5lZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoYXQuCi0JU3Vic2VxdWVudCBjYWxscyBzaG91bGQgcGFzcwotCXRoZSBhcmNoaXZlIGFuZCB0aGUgcHJldmlvdXMgcmV0dXJuIHZhbHVlIHRvIHJldHVybiBhIGNyZWF0ZWQKLQlCRkQgdG8gdGhlIG5leHQgY29udGFpbmVkIGVsZW1lbnQuIE5VTEwgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZQotCWFyZSBubyBtb3JlLgotCi0qLwotCi1iZmQgKgotYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBpZiAoKGJmZF9nZXRfZm9ybWF0IChhcmNoaXZlKSAhPSBiZmRfYXJjaGl2ZSkgfHwKLSAgICAgIChhcmNoaXZlLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYXJjaGl2ZSwKLQkJICAgb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlLAotCQkgICAoYXJjaGl2ZSwKLQkJICAgIGxhc3RfZmlsZSkpOwotfQotCi1iZmQgKgotYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGZpbGVfcHRyIGZpbGVzdGFydDsKLQotICBpZiAoIWxhc3RfZmlsZSkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBhcmVsdF9zaXplIChsYXN0X2ZpbGUpOwotICAgICAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuLi4KLQkgTm90ZSB0aGF0IGxhc3RfZmlsZS0+b3JpZ2luIGNhbiBiZSBvZGQgaW4gdGhlIGNhc2Ugb2YKLQkgQlNELTQuNC1zdHlsZSBlbGVtZW50IHdpdGggYSBsb25nIG9kZCBzaXplLiAqLwotICAgICAgZmlsZXN0YXJ0ID0gbGFzdF9maWxlLT5vcmlnaW4gKyBzaXplOwotICAgICAgZmlsZXN0YXJ0ICs9IGZpbGVzdGFydCAlIDI7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9nZW5lcmljX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKLSAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKLQotICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmZGVmIEdOVTk2MAotICBpZiAoc3RybmNtcCAoYXJtYWcsIEJGRF9HTlU5NjBfQVJNQUcgKGFiZmQpLCBTQVJNQUcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0jZWxzZQotICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDAgJiYKLSAgICAgIHN0cm5jbXAgKGFybWFnLCBBUk1BR0IsIFNBUk1BRykgIT0gMCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIFdlIGFyZSBzZXR0aW5nIGJmZF9hcmRhdGEoYWJmZCkgaGVyZSwgYnV0IHNpbmNlIGJmZF9hcmRhdGEKLSAgICAgaW52b2x2ZXMgYSBjYXN0LCB3ZSBjYW4ndCBkbyBpdCBhcyB0aGUgbGVmdCBvcGVyYW5kIG9mIGFzc2lnbm1lbnQuICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9ICgoc3RydWN0IGFydGRhdGEgKikKLQkJCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKSk7Ci0KLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IFNBUk1BRzsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmNhY2hlID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmFyY2hpdmVfaGVhZCA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gTlVMTDsKLQotICBpZiAoIUJGRF9TRU5EIChhYmZkLCBfYmZkX3NsdXJwX2FybWFwLCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSwgKGFiZmQpKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZCAqZmlyc3Q7Ci0KLSAgICAgIC8qIFRoaXMgYXJjaGl2ZSBoYXMgYSBtYXAsIHNvIHdlIG1heSBwcmVzdW1lIHRoYXQgdGhlIGNvbnRlbnRzCi0JIGFyZSBvYmplY3QgZmlsZXMuICBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQkgYXJjaGl2ZSBjYW4gYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QgZmlsZSwgaXQgaXMgZm9yIHRoaXMKLQkgdGFyZ2V0LiAgSWYgbm90LCBhc3N1bWUgdGhhdCB0aGlzIGlzIHRoZSB3cm9uZyBmb3JtYXQuICBJZgotCSB0aGUgZmlyc3QgZmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGUsIHNvbWVib2R5IGlzIGRvaW5nCi0JIHNvbWV0aGluZyB3ZWlyZCwgYW5kIHdlIHBlcm1pdCBpdCBzbyB0aGF0IGFyIC10IHdpbGwgd29yay4KLQotCSBUaGlzIGlzIGRvbmUgYmVjYXVzZSBhbnkgbm9ybWFsIGZvcm1hdCB3aWxsIHJlY29nbml6ZSBhbnkKLQkgbm9ybWFsIGFyY2hpdmUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGZvcm1hdCBvZiB0aGUgb2JqZWN0IGZpbGVzLgotCSBXZSBkbyBhY2NlcHQgYW4gZW1wdHkgYXJjaGl2ZS4gICovCi0KLSAgICAgIGZpcnN0ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gZmFpbDsKLQotCSAgZmlyc3QtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQkgIGZhaWwgPSBmYWxzZTsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaXJzdCwgYmZkX29iamVjdCkKLQkgICAgICAmJiBmaXJzdC0+eHZlYyAhPSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoZmlyc3QpOwotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0JICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JICAvKiBXZSBvdWdodCB0byBjbG9zZSBmaXJzdCBoZXJlLCBidXQgd2UgY2FuJ3QsIGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICBoYXZlIG5vIHdheSB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJjaGl2ZSBjYWNoZS4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBTb21lIGNvbnN0YW50cyBmb3IgYSAzMiBiaXQgQlNEIGFyY2hpdmUgc3RydWN0dXJlLiAgV2UgZG8gbm90Ci0gICBzdXBwb3J0IDY0IGJpdCBhcmNoaXZlcyBwcmVzZW50bHk7IHNvIGZhciBhcyBJIGtub3csIG5vbmUgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3VwcG9ydGluZyB0aGVtIHdvdWxkIHJlcXVpcmUgY2hhbmdpbmcgdGhlc2UgY29uc3RhbnRzLCBhbmQKLSAgIGNoYW5naW5nIHNvbWUgYmZkX2hfZ2V0XzMyIHRvIGJmZF9oX2dldF82NC4gICovCi0KLS8qIFRoZSBzaXplIG9mIGFuIGV4dGVybmFsIHN5bWRlZiBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX1NJWkUgOAotCi0vKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIGEgc3ltZGVmIHN0cnVjdHVyZSB0byB0aGUgZmlsZSBvZmZzZXQuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX09GRlNFVF9TSVpFIDQKLQotLyogVGhlIHNpemUgb2YgdGhlIHN5bWRlZiBjb3VudC4gICovCi0jZGVmaW5lIEJTRF9TWU1ERUZfQ09VTlRfU0laRSA0Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzdHJpbmcgY291bnQuICAqLwotI2RlZmluZSBCU0RfU1RSSU5HX0NPVU5UX1NJWkUgNAotCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotCi1zdGF0aWMgYm9vbGVhbgotZG9fc2x1cnBfYnNkX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBiZmRfYnl0ZSAqcmF3X2FybWFwLCAqcmJhc2U7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOwotICBjYXJzeW0gKnNldDsKLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBwYXJzZWRfc2l6ZSA9IG1hcGRhdGEtPnBhcnNlZF9zaXplOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7CS8qIERvbid0IG5lZWQgaXQgYW55IG1vcmUuICovCi0KLSAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHBhcnNlZF9zaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHBhcnNlZF9zaXplLCBhYmZkKSAhPSBwYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICBieWVieWU6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJhd19hcm1hcCkgLyBCU0RfU1lNREVGX1NJWkU7Ci0KLSAgaWYgKGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFID4KLSAgICAgIHBhcnNlZF9zaXplIC0gQlNEX1NZTURFRl9DT1VOVF9TSVpFKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHdlJ3JlIHVzaW5nIHRoZSB3cm9uZyBieXRlIG9yZGVyaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgZ290byBieWVieWU7Ci0gICAgfQotCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotICByYmFzZSA9IHJhd19hcm1hcCArIEJTRF9TWU1ERUZfQ09VTlRfU0laRTsKLSAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSByYmFzZQotCQkrIGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFCi0JCSsgQlNEX1NUUklOR19DT1VOVF9TSVpFKTsKLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgKGFyZGF0YS0+c3ltZGVmX2NvdW50Ci0JCQkJCSAgICogc2l6ZW9mIChjYXJzeW0pKSk7Ci0gIGlmICghYXJkYXRhLT5zeW1kZWZzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ZXIgPSAwLCBzZXQgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gICAgICAgY291bnRlciA8IGFyZGF0YS0+c3ltZGVmX2NvdW50OwotICAgICAgIGNvdW50ZXIrKywgc2V0KyssIHJiYXNlICs9IEJTRF9TWU1ERUZfU0laRSkKLSAgICB7Ci0gICAgICBzZXQtPm5hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlKSArIHN0cmluZ2Jhc2U7Ci0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSArIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUpOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0gIC8qIEZJWE1FLCB3ZSBzaG91bGQgcHJvdmlkZSBzb21lIHdheSB0byBmcmVlIHJhd19hcmRhdGEgd2hlbgotICAgICB3ZSBhcmUgZG9uZSB1c2luZyB0aGUgc3RyaW5ncyBmcm9tIGl0LiAgRm9yIG5vdywgaXQgc2VlbXMKLSAgICAgdG8gYmUgYWxsb2NhdGVkIG9uIGFuIG9iamFsbG9jIGFueXdheS4uLiAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLXN0YXRpYyBib29sZWFuCi1kb19zbHVycF9jb2ZmX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGludCAqcmF3X2FybWFwLCAqcmF3cHRyOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIGNhcnN5bSAqY2Fyc3ltczsKLSAgdW5zaWduZWQgaW50IG5zeW16OwkJLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYXJtYXAuICovCi0gIGJmZF92bWEgKCpzd2FwKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGNoYXIgaW50X2J1ZltzaXplb2YgKGxvbmcpXTsKLSAgdW5zaWduZWQgaW50IGNhcnN5bV9zaXplLCBwdHJzaXplLCBpOwotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsJLyogRG9uJ3QgbmVlZCBpdCBhbnkgbW9yZS4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGludF9idWYsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBJdCBzZWVtcyB0aGF0IGFsbCBudW1lcmljIGluZm9ybWF0aW9uIGluIGEgY29mZiBhcmNoaXZlIGlzIGFsd2F5cwotICAgICBpbiBiaWcgZW5kaWFuIGZvcm1hdCwgbm9tYXR0ZXIgdGhlIGhvc3Qgb3IgdGFyZ2V0LiAqLwotICBzd2FwID0gYmZkX2dldGIzMjsKLSAgbnN5bXogPSBiZmRfZ2V0YjMyICgoUFRSKSBpbnRfYnVmKTsKLSAgc3RyaW5nc2l6ZSA9IHBhcnNlZF9zaXplIC0gKDQgKiBuc3lteikgLSA0OwotCi0jaWYgMQotICAvKiAuLi4gZXhjZXB0IHRoYXQgc29tZSBhcmNoaXZlIGZvcm1hdHMgYXJlIGJyb2tlbiwgYW5kIGl0IG1heSBiZSBvdXIKLSAgICAgZmF1bHQgLSB0aGUgaTk2MCBsaXR0bGUgZW5kaWFuIGNvZmYgc29tZXRpbWVzIGhhcyBiaWcgYW5kIHNvbWV0aW1lcwotICAgICBsaXR0bGUsIGJlY2F1c2Ugb3VyIHRvb2xzIGNoYW5nZWQuICBIZXJlJ3MgYSBob3JyaWJsZSBoYWNrIHRvIGNsZWFuCi0gICAgIHVwIHRoZSBjcmFwLiAgKi8KLQotICBpZiAoc3RyaW5nc2l6ZSA+IDB4ZmZmZmYKLSAgICAgICYmIGJmZF9nZXRfYXJjaCAoYWJmZCkgPT0gYmZkX2FyY2hfaTk2MAotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICB7Ci0gICAgICAvKiBUaGlzIGxvb2tzIGRhbmdlcm91cywgbGV0J3MgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQgKi8KLSAgICAgIG5zeW16ID0gYmZkX2dldGwzMiAoKFBUUikgaW50X2J1Zik7Ci0gICAgICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSAoNCAqIG5zeW16KSAtIDQ7Ci0gICAgICBzd2FwID0gYmZkX2dldGwzMjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBUaGUgY29mZiBhcm1hcCBtdXN0IGJlIHJlYWQgc2VxdWVudGlhbGx5LiAgU28gd2UgY29uc3RydWN0IGEKLSAgICAgYnNkLXN0eWxlIG9uZSBpbiBjb3JlIGFsbCBhdCBvbmNlLCBmb3Igc2ltcGxpY2l0eS4gKi8KLQotICBjYXJzeW1fc2l6ZSA9IChuc3lteiAqIHNpemVvZiAoY2Fyc3ltKSk7Ci0gIHB0cnNpemUgPSAoNCAqIG5zeW16KTsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF96YWxsb2MgKGFiZmQsIGNhcnN5bV9zaXplICsgc3RyaW5nc2l6ZSArIDEpOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjYXJzeW1zID0gYXJkYXRhLT5zeW1kZWZzOwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIGFyZGF0YS0+c3ltZGVmcykgKyBjYXJzeW1fc2l6ZTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgcmVhZCBpbiB0aGUgcmF3IG9mZnNldHMuICovCi0gIHJhd19hcm1hcCA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBwdHJzaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQotICAgIGdvdG8gcmVsZWFzZV9zeW1kZWZzOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgcHRyc2l6ZSwgYWJmZCkgIT0gcHRyc2l6ZQotICAgICAgfHwgYmZkX3JlYWQgKChQVFIpIHN0cmluZ2Jhc2UsIDEsIHN0cmluZ3NpemUsIGFiZmQpICE9IHN0cmluZ3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBnb3RvIHJlbGVhc2VfcmF3X2FybWFwOwotICAgIH0KLQotICAvKiBPSywgYnVpbGQgdGhlIGNhcnN5bXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5zeW16OyBpKyspCi0gICAgewotICAgICAgcmF3cHRyID0gcmF3X2FybWFwICsgaTsKLSAgICAgIGNhcnN5bXMtPmZpbGVfb2Zmc2V0ID0gc3dhcCAoKFBUUikgcmF3cHRyKTsKLSAgICAgIGNhcnN5bXMtPm5hbWUgPSBzdHJpbmdiYXNlOwotICAgICAgc3RyaW5nYmFzZSArPSBzdHJsZW4gKHN0cmluZ2Jhc2UpICsgMTsKLSAgICAgIGNhcnN5bXMrKzsKLSAgICB9Ci0gICpzdHJpbmdiYXNlID0gMDsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IG5zeW16OwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0KLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotCi0gIC8qIENoZWNrIGZvciBhIHNlY29uZCBhcmNoaXZlIGhlYWRlciAoYXMgdXNlZCBieSBQRSkgKi8KLSAgewotICAgIHN0cnVjdCBhcmVsdGRhdGEgKnRtcDsKLQotICAgIGJmZF9zZWVrIChhYmZkLCAgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCk7Ci0gICAgdG1wID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gICAgaWYgKHRtcCAhPSBOVUxMKSAKLSAgICAgIHsKLQlpZiAodG1wLT5hcmNoX2hlYWRlclswXSA9PSAnLycKLQkgICAgJiYgdG1wLT5hcmNoX2hlYWRlclsxXSA9PSAnICcpIAotCSAgewotCSAgICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPQotCSAgICAgICh0bXAtPnBhcnNlZF9zaXplICsgc2l6ZW9mKHN0cnVjdCBhcl9oZHIpICsgMSkgJiB+MTsKLQkgIH0KLQliZmRfcmVsZWFzZSAoYWJmZCwgdG1wKTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotCi1yZWxlYXNlX3Jhd19hcm1hcDoKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci1yZWxlYXNlX3N5bWRlZnM6Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSAoYXJkYXRhKS0+c3ltZGVmcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyByb3V0aW5lIGNhbiBoYW5kbGUgZWl0aGVyIGNvZmYtc3R5bGUgb3IgYnNkLXN0eWxlIGFybWFwcy4KLSAgIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi0KLWJvb2xlYW4KLWJmZF9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgaW50IGkgPSBiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoaSAhPSAxNikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGICAgICAgICIsIDE2KQotICAgICAgfHwgIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGLyAgICAgICIsIDE2KSkgLyogb2xkIExpbnV4IGFyY2hpdmVzICovCi0gICAgcmV0dXJuIGRvX3NsdXJwX2JzZF9hcm1hcCAoYWJmZCk7Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikpCi0gICAgcmV0dXJuIGRvX3NsdXJwX2NvZmZfYXJtYXAgKGFiZmQpOwotICBlbHNlIGlmICghc3RybmNtcCAobmV4dG5hbWUsICIvU1lNNjQvICAgICAgICAgIiwgMTYpKQotICAgIHsKLSAgICAgIC8qIElyaXggNiBhcmNoaXZlLS1tdXN0IGJlIHJlY29nbml6ZWQgYnkgY29kZSBpbiBlbGY2NC1taXBzLmMuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi0vKiBmbGF2b3IgMiBvZiBhIGJzZCBhcm1hcCwgc2ltaWxhciB0byBiZmRfc2x1cnBfYnNkX2FybWFwIGV4Y2VwdCB0aGUKLSAgIGhlYWRlciBpcyBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCBvcmRlciBhbmQgdGhlIG1hcCBuYW1lIGlzICcvJy4KLSAgIFRoaXMgZmxhdm91ciBpcyB1c2VkIGJ5IGhwMzAwaHB1eC4gKi8KLQotI2RlZmluZSBIUFVYX1NZTURFRl9DT1VOVF9TSVpFIDIKLQotYm9vbGVhbgotYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICptYXBkYXRhOwotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGJmZF9ieXRlICpyYXdfYXJtYXAsICpyYmFzZTsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyICpzdHJpbmdiYXNlOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZTsKLSAgY2Fyc3ltICpzZXQ7Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBhcmNoaXZlIGhhcyBhdCBsZWFzdCAxNiBieXRlcyBpbiBpdCAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIC0xNkwsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGICAgICAgICIsIDE2KQotICAgICAgfHwgIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGLyAgICAgICIsIDE2KSkgLyogb2xkIExpbnV4IGFyY2hpdmVzICovCi0gICAgcmV0dXJuIGRvX3NsdXJwX2JzZF9hcm1hcCAoYWJmZCk7Ci0KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJhd19hcm1hcCA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBtYXBkYXRhLT5wYXJzZWRfc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgYnllYnllOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgbWFwZGF0YS0+cGFyc2VkX3NpemUsIGFiZmQpICE9Ci0gICAgICBtYXBkYXRhLT5wYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICBieWVieWVieWU6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIGdvdG8gYnllYnllOwotICAgIH0KLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotICBpZiAoYXJkYXRhLT5zeW1kZWZfY291bnQgKiBCU0RfU1lNREVGX1NJWkUKLSAgICAgID4gbWFwZGF0YS0+cGFyc2VkX3NpemUgLSBIUFVYX1NZTURFRl9DT1VOVF9TSVpFKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHdlJ3JlIHVzaW5nIHRoZSB3cm9uZyBieXRlIG9yZGVyaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgZ290byBieWVieWVieWU7Ci0gICAgfQotCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotCi0gIHN0cmluZ3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJhd19hcm1hcCArIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUpOwotICAvKiBza2lwIHN5bSBjb3VudCBhbmQgc3RyaW5nIHN6ICovCi0gIHN0cmluZ2Jhc2UgPSAoKGNoYXIgKikgcmF3X2FybWFwCi0JCSsgSFBVWF9TWU1ERUZfQ09VTlRfU0laRQotCQkrIEJTRF9TVFJJTkdfQ09VTlRfU0laRSk7Ci0gIHJiYXNlID0gKGJmZF9ieXRlICopIHN0cmluZ2Jhc2UgKyBzdHJpbmdzaXplOwotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKLQkJCQkJICAgKiBCU0RfU1lNREVGX1NJWkUpKTsKLSAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnRlciA9IDAsIHNldCA9IGFyZGF0YS0+c3ltZGVmczsKLSAgICAgICBjb3VudGVyIDwgYXJkYXRhLT5zeW1kZWZfY291bnQ7Ci0gICAgICAgY291bnRlcisrLCBzZXQrKywgcmJhc2UgKz0gQlNEX1NZTURFRl9TSVpFKQotICAgIHsKLSAgICAgIHNldC0+bmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmJhc2UpICsgc3RyaW5nYmFzZTsKLSAgICAgIHNldC0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlICsgQlNEX1NZTURFRl9PRkZTRVRfU0laRSk7Ci0gICAgfQotCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSAoYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLSAgLyogRklYTUUsIHdlIHNob3VsZCBwcm92aWRlIHNvbWUgd2F5IHRvIGZyZWUgcmF3X2FyZGF0YSB3aGVuCi0gICAgIHdlIGFyZSBkb25lIHVzaW5nIHRoZSBzdHJpbmdzIGZyb20gaXQuICBGb3Igbm93LCBpdCBzZWVtcwotICAgICB0byBiZSBhbGxvY2F0ZWQgb24gYW4gb2JqYWxsb2MgYW55d2F5Li4uICovCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIEV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLSAgTm9ybWFsbHkgYXJjaGl2ZXMgc3VwcG9ydCBvbmx5IDE0LWNoYXJhY3RlciBmaWxlbmFtZXMuCi0KLSAgSW50ZWwgaGFzIGV4dGVuZGVkIHRoZSBmb3JtYXQ6IGxvbmdlciBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc3BlY2lhbAotICBlbGVtZW50ICh0aGUgZmlyc3QgaW4gdGhlIGFyY2hpdmUsIG9yIHNlY29uZCBpZiB0aGVyZSBpcyBhbiBhcm1hcCk7Ci0gIHRoZSBuYW1lIGluIHRoZSBhcl9oZHIgaXMgcmVwbGFjZWQgYnkgPHNwYWNlPjxpbmRleCBpbnRvIGZpbGVuYW1lCi0gIGVsZW1lbnQ+LiAgSW5kZXggaXMgdGhlIFAuUi4gb2YgYW4gaW50IChkZWNpbWFsKS4gIERhdGEgR2VuZXJhbCBoYXZlCi0gIGV4dGVuZGVkIHRoZSBmb3JtYXQgYnkgdXNpbmcgdGhlIHByZWZpeCAvLyBmb3IgdGhlIHNwZWNpYWwgZWxlbWVudCAqLwotCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotYm9vbGVhbgotX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICBzdHJ1Y3QgYXJlbHRkYXRhICpuYW1lZGF0YTsKLQotICAvKiBGSVhNRTogIEZvcm1hdHRpbmcgc3Vja3MgaGVyZSwgYW5kIGluIGNhc2Ugb2YgZmFpbHVyZSBvZiBCRkRfUkVBRCwKLSAgICAgd2UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byByZXR1cm4gdHJ1ZS4gICovCi0gIGJmZF9zZWVrIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKSA9PSAxNikKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICJBUkZJTEVOQU1FUy8gICAgIiwgMTYpICE9IDAgJiYKLQkgIHN0cm5jbXAgKG5leHRuYW1lLCAiLy8gICAgICAgICAgICAgICIsIDE2KSAhPSAwKQotCXsKLQkgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG5hbWVkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gICAgICBpZiAobmFtZWRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9Ci0JYmZkX3phbGxvYyAoYWJmZCwgbmFtZWRhdGEtPnBhcnNlZF9zaXplKTsKLSAgICAgIGlmIChiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JYnllYnllOgotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG5hbWVkYXRhKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzLCAxLAotCQkgICAgbmFtZWRhdGEtPnBhcnNlZF9zaXplLCBhYmZkKSAhPSBuYW1lZGF0YS0+cGFyc2VkX3NpemUpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIChiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMpKTsKLQkgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0JICBnb3RvIGJ5ZWJ5ZTsKLQl9Ci0KLSAgICAgIC8qIFNpbmNlIHRoZSBhcmNoaXZlIGlzIHN1cHBvc2VkIHRvIGJlIHByaW50YWJsZSBpZiBpdCBjb250YWlucwotCSB0ZXh0LCB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBhcmUgbmV3bGluZS1wYWRkZWQsIG5vdCBudWxsCi0JIHBhZGRlZC4gSW4gU1ZSNC1zdHlsZSBhcmNoaXZlcywgdGhlIG5hbWVzIGFsc28gaGF2ZSBhCi0JIHRyYWlsaW5nICcvJy4gIERPUy9OVCBjcmVhdGVkIGFyY2hpdmUgb2Z0ZW4gaGF2ZSBcIGluIHRoZW0KLQkgV2UnbGwgZml4IGFsbCBwcm9ibGVtcyBoZXJlLi4gICovCi0gICAgICB7Ci0JY2hhciAqdGVtcCA9IGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lczsKLQljaGFyICpsaW1pdCA9IHRlbXAgKyBuYW1lZGF0YS0+cGFyc2VkX3NpemU7Ci0JZm9yICg7IHRlbXAgPCBsaW1pdDsgKyt0ZW1wKSB7Ci0JICBpZiAoKnRlbXAgPT0gJ1wwMTInKQotCSAgICB0ZW1wW3RlbXBbLTFdID09ICcvJyA/IC0xIDogMF0gPSAnXDAnOwotCSAgaWYgKCp0ZW1wID09ICdcXCcpCi0JICAgICp0ZW1wID0gJy8nOwotCX0KLSAgICAgIH0KLQotICAgICAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9Ci0JKGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLQotICAgICAgLyogRklYTUUsIHdlIGNhbid0IHJlbGVhc2UgbmFtZWRhdGEgaGVyZSBiZWNhdXNlIGl0IHdhcyBhbGxvY2F0ZWQKLQkgYmVsb3cgZXh0ZW5kZWRfbmFtZXMgb24gdGhlIG9iamFsbG9jLi4uICovCi0gICAgICAvKiBiZmRfcmVsZWFzZSAoYWJmZCwgbmFtZWRhdGEpOyAqLwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBWTVMKLQotLyogUmV0dXJuIGEgY29weSBvZiB0aGUgc3R1ZmYgaW4gdGhlIGZpbGVuYW1lIGJldHdlZW4gYW55IDpdPiBhbmQgYQotICAgc2VtaWNvbG9uICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgKGFiZmQsIGZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgQ09OU1QgY2hhciAqZmlyc3Q7Ci0gIENPTlNUIGNoYXIgKmxhc3Q7Ci0gIGNoYXIgKmNvcHk7Ci0KLSAgZmlyc3QgPSBmaWxlICsgc3RybGVuIChmaWxlKSAtIDE7Ci0gIGxhc3QgPSBmaXJzdCArIDE7Ci0KLSAgd2hpbGUgKGZpcnN0ICE9IGZpbGUpCi0gICAgewotICAgICAgaWYgKCpmaXJzdCA9PSAnOycpCi0JbGFzdCA9IGZpcnN0OwotICAgICAgaWYgKCpmaXJzdCA9PSAnOicgfHwgKmZpcnN0ID09ICddJyB8fCAqZmlyc3QgPT0gJz4nKQotCXsKLQkgIGZpcnN0Kys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmaXJzdC0tOwotICAgIH0KLQotICBjb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBsYXN0IC0gZmlyc3QgKyAxKTsKLSAgaWYgKGNvcHkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtZW1jcHkgKGNvcHksIGZpcnN0LCBsYXN0IC0gZmlyc3QpOwotICBjb3B5W2xhc3QgLSBmaXJzdF0gPSAwOwotCi0gIHJldHVybiBjb3B5OwotfQotCi0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ybWFsaXplIChhYmZkLCBmaWxlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOwotCi0gIGlmIChmaWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLSNlbmRpZgotCi0vKiBCdWlsZCBhIEJGRCBzdHlsZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotICAgICBjb25zdCBjaGFyICoqbmFtZTsKLXsKLSAgKm5hbWUgPSAiQVJGSUxFTkFNRVMvIjsKLSAgcmV0dXJuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIGZhbHNlLCB0YWJsb2MsIHRhYmxlbik7Ci19Ci0KLS8qIEJ1aWxkIGFuIFNWUjQgc3R5bGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICoqdGFibG9jOwotICAgICBiZmRfc2l6ZV90eXBlICp0YWJsZW47Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lOwotewotICAqbmFtZSA9ICIvLyI7Ci0gIHJldHVybiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cnVlLCB0YWJsb2MsIHRhYmxlbik7Ci19Ci0KLS8qIEZvbGxvd3MgYXJjaGl2ZV9oZWFkIGFuZCBwcm9kdWNlcyBhbiBleHRlbmRlZCBuYW1lIHRhYmxlIGlmCi0gICBuZWNlc3NhcnkuICBSZXR1cm5zIChpbiB0YWJsb2MpIGEgcG9pbnRlciB0byBhbiBleHRlbmRlZCBuYW1lCi0gICB0YWJsZSwgYW5kIGluIHRhYmxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB0YWJsZS4gIElmIGl0IG1ha2VzIGFuIGVudHJ5Ci0gICBpdCBjbG9iYmVycyB0aGUgZmlsZW5hbWUgc28gdGhhdCB0aGUgZWxlbWVudCBtYXkgYmUgd3JpdHRlbiB3aXRob3V0Ci0gICBmdXJ0aGVyIG1hc3NhZ2UuICBSZXR1cm5zIHRydWUgaWYgaXQgcmFuIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYKLSAgIHNvbWV0aGluZyB3ZW50IHdyb25nLiAgQSBzdWNjZXNzZnVsIHJldHVybiBtYXkgc3RpbGwgaW52b2x2ZSBhCi0gICB6ZXJvLWxlbmd0aCB0YWJsZW4hICAqLwotCi1ib29sZWFuCi1fYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cmFpbGluZ19zbGFzaCwgdGFibG9jLCB0YWJsZW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB0cmFpbGluZ19zbGFzaDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotewotICB1bnNpZ25lZCBpbnQgbWF4bmFtZSA9IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbmFtZWxlbiA9IDA7Ci0gIGJmZCAqY3VycmVudDsKLSAgY2hhciAqc3RycHRyOwotCi0gICp0YWJsZW4gPSAwOwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IGxvbmcgdGhlIHRhYmxlIHNob3VsZCBiZSAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbm9ybWFsOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47Ci0KLSAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOwotICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKLQotICAgICAgaWYgKHRoaXNsZW4gPiBtYXhuYW1lCi0JICAmJiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JdGhpc2xlbiA9IG1heG5hbWU7Ci0KLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKLQl7Ci0JICAvKiBBZGQgb25lIHRvIGxlYXZlIHJvb20gZm9yIFxuLiAgKi8KLQkgIHRvdGFsX25hbWVsZW4gKz0gdGhpc2xlbiArIDE7Ci0JICBpZiAodHJhaWxpbmdfc2xhc2gpCi0JICAgIHsKLQkgICAgICAvKiBMZWF2ZSByb29tIGZvciB0cmFpbGluZyBzbGFzaC4gICovCi0JICAgICAgKyt0b3RhbF9uYW1lbGVuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQkgIGlmIChzdHJuY21wIChub3JtYWwsIGhkci0+YXJfbmFtZSwgdGhpc2xlbikgIT0gMAotCSAgICAgIHx8ICh0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZQotCQkgICYmIGhkci0+YXJfbmFtZVt0aGlzbGVuXSAhPSBhcl9wYWRjaGFyIChjdXJyZW50KSkpCi0JICAgIHsKLQkgICAgICAvKiBNdXN0IGhhdmUgYmVlbiB1c2luZyBleHRlbmRlZCBmb3JtYXQgZXZlbiB0aG91Z2ggaXQKLQkgICAgICAgICBkaWRuJ3QgbmVlZCB0by4gIEZpeCBpdCB0byB1c2Ugbm9ybWFsIGZvcm1hdC4gICovCi0JICAgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIG5vcm1hbCwgdGhpc2xlbik7Ci0JICAgICAgaWYgKHRoaXNsZW4gPCBtYXhuYW1lCi0JCSAgfHwgKHRoaXNsZW4gPT0gbWF4bmFtZSAmJiB0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZSkpCi0JCWhkci0+YXJfbmFtZVt0aGlzbGVuXSA9IGFyX3BhZGNoYXIgKGN1cnJlbnQpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAodG90YWxfbmFtZWxlbiA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gICp0YWJsb2MgPSBiZmRfemFsbG9jIChhYmZkLCB0b3RhbF9uYW1lbGVuKTsKLSAgaWYgKCp0YWJsb2MgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnRhYmxlbiA9IHRvdGFsX25hbWVsZW47Ci0gIHN0cnB0ciA9ICp0YWJsb2M7Ci0KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbm9ybWFsOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47Ci0KLSAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOwotICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKLQl7Ci0JICAvKiBXb3JrcyBmb3Igbm93OyBtYXkgbmVlZCB0byBiZSByZS1lbmdpbmVlcmVkIGlmIHdlCi0JICAgICBlbmNvdW50ZXIgYW4gb2RkYmFsbCBhcmNoaXZlIGZvcm1hdCBhbmQgd2FudCB0bwotCSAgICAgZ2VuZXJhbGlzZSB0aGlzIGhhY2suICovCi0JICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBhcmNoX2hkciAoY3VycmVudCk7Ci0JICBzdHJjcHkgKHN0cnB0ciwgbm9ybWFsKTsKLQkgIGlmICghIHRyYWlsaW5nX3NsYXNoKQotCSAgICBzdHJwdHJbdGhpc2xlbl0gPSAnXDAxMic7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJwdHJbdGhpc2xlbl0gPSAnLyc7Ci0JICAgICAgc3RycHRyW3RoaXNsZW4gKyAxXSA9ICdcMDEyJzsKLQkgICAgfQotCSAgaGRyLT5hcl9uYW1lWzBdID0gYXJfcGFkY2hhciAoY3VycmVudCk7Ci0JICAvKiBXZSBrbm93IHRoZXJlIHdpbGwgYWx3YXlzIGJlIGVub3VnaCByb29tIChvbmUgb2YgdGhlIGZldwotCSAgICAgY2FzZXMgd2hlcmUgeW91IG1heSBzYWZlbHkgdXNlIHNwcmludGYpLiAqLwotCSAgc3ByaW50ZiAoKGhkci0+YXJfbmFtZSkgKyAxLCAiJS1kIiwgKHVuc2lnbmVkKSAoc3RycHRyIC0gKnRhYmxvYykpOwotCSAgLyogS2luZGEgS2x1ZGd5LiAgV2Ugc2hvdWxkIGp1c3QgdXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBvZgotCSAgICAgc3ByaW50ZiBidXQgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgZ2V0IHRoaXMgcmlnaHQgKi8KLQkgIHsKLQkgICAgY2hhciAqdGVtcCA9IGhkci0+YXJfbmFtZSArIDI7Ci0JICAgIGZvciAoOyB0ZW1wIDwgaGRyLT5hcl9uYW1lICsgbWF4bmFtZTsgdGVtcCsrKQotCSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQotCQkqdGVtcCA9ICcgJzsKLQkgIH0KLQkgIHN0cnB0ciArPSB0aGlzbGVuICsgMTsKLQkgIGlmICh0cmFpbGluZ19zbGFzaCkKLQkgICAgKytzdHJwdHI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBBIGNvdXBsZSBvZiBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFyX2hkcnMgKi8KLQotI2lmbmRlZiBIQVZFX0dFVFVJRAotI2RlZmluZSBnZXR1aWQoKSAwCi0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVEdJRAotI2RlZmluZSBnZXRnaWQoKSAwCi0jZW5kaWYKLQotLyogVGFrZXMgYSBmaWxlbmFtZSwgcmV0dXJucyBhbiBhcmVsdF9kYXRhIGZvciBpdCwgb3IgTlVMTCBpZiBpdCBjYW4ndAotICAgbWFrZSBvbmUuICBUaGUgZmlsZW5hbWUgbXVzdCByZWZlciB0byBhIGZpbGVuYW1lIGluIHRoZSBmaWxlc3lzdGVtLgotICAgVGhlIGZpbGVuYW1lIGZpZWxkIG9mIHRoZSBhcl9oZHIgd2lsbCBOT1QgYmUgaW5pdGlhbGl6ZWQuICBJZiBtZW1iZXIKLSAgIGlzIHNldCwgYW5kIGl0J3MgYW4gaW4tbWVtb3J5IGJmZCwgd2UgZmFrZSBpdC4gKi8KLQotc3RhdGljIHN0cnVjdCBhcmVsdGRhdGEgKgotYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gKGFiZmQsIGZpbGVuYW1lLCBtZW1iZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJmZCAqbWVtYmVyOwotewotICBzdHJ1Y3Qgc3RhdCBzdGF0dXM7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgY2hhciAqdGVtcCwgKnRlbXAxOwotCi0gIGlmIChtZW1iZXIgJiYgKG1lbWJlci0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSB3ZSBqdXN0ICJtYWRlIiB0aGUgbWVtYmVyLCBhbmQgZmFrZSBpdCAqLwotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBtZW1iZXItPmlvc3RyZWFtOwotICAgICAgdGltZSgmc3RhdHVzLnN0X210aW1lKTsKLSAgICAgIHN0YXR1cy5zdF91aWQgPSBnZXR1aWQoKTsKLSAgICAgIHN0YXR1cy5zdF9naWQgPSBnZXRnaWQoKTsKLSAgICAgIHN0YXR1cy5zdF9tb2RlID0gMDY0NDsKLSAgICAgIHN0YXR1cy5zdF9zaXplID0gYmltLT5zaXplOwotICAgIH0KLSAgZWxzZSBpZiAoc3RhdCAoZmlsZW5hbWUsICZzdGF0dXMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhcmVkID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7Ci0gIGlmIChhcmVkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopICgoKGNoYXIgKikgYXJlZCkgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLQotICAvKiBhciBoZWFkZXJzIGFyZSBzcGFjZSBwYWRkZWQsIG5vdCBudWxsIHBhZGRlZCEgKi8KLSAgbWVtc2V0ICgoUFRSKSBoZHIsICcgJywgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0KLSAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOwotCi0gIC8qIEdvZGRhbW5lZCBzcHJpbnRmIGRvZXNuJ3QgcGVybWl0IE1BWElNVU0gZmllbGQgbGVuZ3RocyAqLwotICBzcHJpbnRmICgoaGRyLT5hcl9kYXRlKSwgIiUtMTJsZCIsIChsb25nKSBzdGF0dXMuc3RfbXRpbWUpOwotICBzcHJpbnRmICgoaGRyLT5hcl91aWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF91aWQpOwotICBzcHJpbnRmICgoaGRyLT5hcl9naWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF9naWQpOwotICBzcHJpbnRmICgoaGRyLT5hcl9tb2RlKSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0dXMuc3RfbW9kZSk7Ci0gIHNwcmludGYgKChoZHItPmFyX3NpemUpLCAiJS0xMGxkIiwgKGxvbmcpIHN0YXR1cy5zdF9zaXplKTsKLSAgLyogQ29ycmVjdCBmb3IgYSBsb3NzYWdlIGluIHNwcmludGYgd2hlcmVieSBpdCBudWxsLXRlcm1pbmF0ZXMuICBJIGNhbm5vdAotICAgICB1bmRlcnN0YW5kIGhvdyB0aGVzZSBDIGxvc2VycyBjb3VsZCBkZXNpZ24gc3VjaCBhIHJhbXNoYWNrbGUgYnVuY2ggb2YKLSAgICAgSU8gb3BlcmF0aW9ucyAqLwotICB0ZW1wID0gKGNoYXIgKikgaGRyOwotICB0ZW1wMSA9IHRlbXAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpIC0gMjsKLSAgZm9yICg7IHRlbXAgPCB0ZW1wMTsgdGVtcCsrKQotICAgIHsKLSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQotCSp0ZW1wID0gJyAnOwotICAgIH0KLSAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICBhcmVkLT5wYXJzZWRfc2l6ZSA9IHN0YXR1cy5zdF9zaXplOwotICBhcmVkLT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcjsKLQotICByZXR1cm4gYXJlZDsKLX0KLQotLyogVGhpcyBpcyBtYWdpYyByZXF1aXJlZCBieSB0aGUgImFyIiBwcm9ncmFtLiAgU2luY2UgaXQncwotICAgIHVuZG9jdW1lbnRlZCwgaXQncyB1bmRvY3VtZW50ZWQuICBZb3UgbWF5IHRoaW5rIHRoYXQgaXQgd291bGQgdGFrZQotICAgIGEgc3Ryb25nIHN0b21hY2ggdG8gd3JpdGUgdGhpcywgYW5kIGl0IGRvZXMsIGJ1dCBpdCB0YWtlcyBldmVuIGEKLSAgICBzdHJvbmdlciBzdG9tYWNoIHRvIHRyeSB0byBjb2RlIGFyb3VuZCBzdWNoIGEgdGhpbmchICAqLwotCi1zdHJ1Y3QgYXJfaGRyICpiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0cnVjdCBhcl9oZHIgKgotYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgKGFiZmQsIGZpbGVuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICphcl9lbHQgPSBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSAoYWJmZCwgZmlsZW5hbWUsIDApOwotICBpZiAoYXJfZWx0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiAoc3RydWN0IGFyX2hkciAqKSBhcl9lbHQtPmFyY2hfaGVhZGVyOwotfQotCi0KLS8qIEFuYWxvZ291cyB0byBzdGF0IGNhbGwgKi8KLWludAotYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpidWY7Ci17Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgY2hhciAqYWxvc2VyOwotCi0gIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaGRyID0gYXJjaF9oZHIgKGFiZmQpOwotCi0jZGVmaW5lIGZvbyhhcmVsdCwgc3RlbHQsIHNpemUpICBcCi0gIGJ1Zi0+c3RlbHQgPSBzdHJ0b2wgKGhkci0+YXJlbHQsICZhbG9zZXIsIHNpemUpOyBcCi0gIGlmIChhbG9zZXIgPT0gaGRyLT5hcmVsdCkgcmV0dXJuIC0xOwotCi0gIGZvbyAoYXJfZGF0ZSwgc3RfbXRpbWUsIDEwKTsKLSAgZm9vIChhcl91aWQsIHN0X3VpZCwgMTApOwotICBmb28gKGFyX2dpZCwgc3RfZ2lkLCAxMCk7Ci0gIGZvbyAoYXJfbW9kZSwgc3RfbW9kZSwgOCk7Ci0KLSAgYnVmLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWJmZF9kb250X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgLyogRklYTUU6IFRoaXMgaW50ZXJhY3RzIHVucGxlYXNhbnRseSB3aXRoIGFyJ3MgcXVpY2stYXBwZW5kIG9wdGlvbi4KLSAgICAgRm9ydHVuYXRlbHkgaWM5NjAgdXNlcnMgd2lsbCBuZXZlciB1c2UgdGhhdCBvcHRpb24uICBGaXhpbmcgdGhpcwotICAgICBpcyB2ZXJ5IGhhcmQ7IGZvcnR1bmF0ZWx5IEkga25vdyBob3cgdG8gZG8gaXQgYW5kIHdpbGwgZG8gc28gb25jZQotICAgICBpbnRlbCdzIHJlbGVhc2UgaXMgb3V0IHRoZSBkb29yLiAqLwotCi0gIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOwotICBzaXplX3QgbGVuZ3RoOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgc2l6ZV90IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgewotICAgICAgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZpbGVuYW1lID0gbm9ybWFsaXplIChhYmZkLCBwYXRobmFtZSk7Ci0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgbGVuZ3RoID0gc3RybGVuIChmaWxlbmFtZSk7Ci0KLSAgaWYgKGxlbmd0aCA8PSBtYXhsZW4pCi0gICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBsZW5ndGgpOwotCi0gIC8qIEFkZCB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICAqLwotICBpZiAobGVuZ3RoIDwgbWF4bGVuCi0gICAgICB8fCAobGVuZ3RoID09IG1heGxlbiAmJiBsZW5ndGggPCBzaXplb2YgaGRyLT5hcl9uYW1lKSkKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLXZvaWQKLWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSAoc3RydWN0IGFyX2hkciAqKSBhcmhkcjsKLSAgaW50IGxlbmd0aDsKLSAgQ09OU1QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChwYXRobmFtZSwgJy8nKTsKLSAgaW50IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gcGF0aG5hbWU7Ci0gIGVsc2UKLSAgICArK2ZpbGVuYW1lOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoZmlsZW5hbWUpOwotCi0gIGlmIChsZW5ndGggPD0gbWF4bGVuKQotICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbGVuZ3RoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KLSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKLSAgICAgIGxlbmd0aCA9IG1heGxlbjsKLSAgICB9Ci0KLSAgaWYgKGxlbmd0aCA8IG1heGxlbikKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLS8qIFN0b3JlIG5hbWUgaW50byBhciBoZWFkZXIuICBUcnVuY2F0ZXMgdGhlIG5hbWUgdG8gZml0LgotICAgMT4gc3RyaXAgcGF0aG5hbWUgdG8gYmUganVzdCB0aGUgYmFzZW5hbWUuCi0gICAyPiBpZiBpdCdzIHNob3J0IGVudWYgdG8gZml0LCBzdHVmZiBpdCBpbi4KLSAgIDM+IElmIGl0IGRvZXNuJ3QgZW5kIHdpdGggLm8sIHRydW5jYXRlIGl0IHRvIGZpdAotICAgND4gdHJ1bmNhdGUgaXQgYmVmb3JlIHRoZSAubywgYXBwZW5kIC5vLCBzdHVmZiBUSEFUIGluLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IGdudSBhciBkb2VzLiAgSXQncyBiZXR0ZXIgYnV0IGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgYnNkIGFyLiAqLwotCi12b2lkCi1iZmRfZ251X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgc3RydWN0IGFyX2hkciAqaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgYXJoZHI7Ci0gIGludCBsZW5ndGg7Ci0gIENPTlNUIGNoYXIgKmZpbGVuYW1lID0gc3RycmNociAocGF0aG5hbWUsICcvJyk7Ci0gIGludCBtYXhsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9IHBhdGhuYW1lOwotICBlbHNlCi0gICAgKytmaWxlbmFtZTsKLQotICBsZW5ndGggPSBzdHJsZW4gKGZpbGVuYW1lKTsKLQotICBpZiAobGVuZ3RoIDw9IG1heGxlbikKLSAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIGxlbmd0aCk7Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KLSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKLSAgICAgIGlmICgoZmlsZW5hbWVbbGVuZ3RoIC0gMl0gPT0gJy4nKSAmJiAoZmlsZW5hbWVbbGVuZ3RoIC0gMV0gPT0gJ28nKSkKLQl7Ci0JICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMl0gPSAnLic7Ci0JICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMV0gPSAnbyc7Ci0JfQotICAgICAgbGVuZ3RoID0gbWF4bGVuOwotICAgIH0KLQotICBpZiAobGVuZ3RoIDwgMTYpCi0gICAgKGhkci0+YXJfbmFtZSlbbGVuZ3RoXSA9IGFyX3BhZGNoYXIgKGFiZmQpOwotfQotDAotLyogVGhlIEJGRCBpcyBvcGVuIGZvciB3cml0ZSBhbmQgaGFzIGl0cyBmb3JtYXQgc2V0IHRvIGJmZF9hcmNoaXZlICovCi0KLWJvb2xlYW4KLV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYXJjaCkKLSAgICAgYmZkICphcmNoOwotewotICBiZmQgKmN1cnJlbnQ7Ci0gIGNoYXIgKmV0YWJsZSA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgZWxlbmd0aCA9IDA7Ci0gIGNvbnN0IGNoYXIgKmVuYW1lID0gTlVMTDsKLSAgYm9vbGVhbiBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFyY2gpOwotICBib29sZWFuIGhhc29iamVjdHMgPSBmYWxzZTsJLyogaWYgbm8gLm8ncywgZG9uJ3QgYm90aGVyIHRvIG1ha2UgYSBtYXAgKi8KLSAgYmZkX3NpemVfdHlwZSB3cm90ZTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCB0cmllczsKLQotICAvKiBWZXJpZnkgdGhlIHZpYWJpbGl0eSBvZiBhbGwgZW50cmllczsgaWYgYW55IG9mIHRoZW0gbGl2ZSBpbiB0aGUKLSAgICAgZmlsZXN5c3RlbSAoYXMgb3Bwb3NlZCB0byBsaXZpbmcgaW4gYW4gYXJjaGl2ZSBvcGVuIGZvciBpbnB1dCkKLSAgICAgdGhlbiBjb25zdHJ1Y3QgYSBmcmVzaCBhcl9oZHIgZm9yIHRoZW0uICAqLwotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGVfcCAoY3VycmVudCkpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCi0JewotCSAgY3VycmVudC0+YXJlbHRfZGF0YSA9Ci0JICAgIChQVFIpIGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIChhcmNoLCBjdXJyZW50LT5maWxlbmFtZSwgY3VycmVudCk7Ci0JICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogUHV0IGluIHRoZSBmaWxlIG5hbWUgKi8KLQkgIEJGRF9TRU5EIChhcmNoLCBfYmZkX3RydW5jYXRlX2FybmFtZSwgKGFyY2gsCi0JCQkJCQkgY3VycmVudC0+ZmlsZW5hbWUsCi0JCQkJCSAgICAgIChjaGFyICopIGFyY2hfaGRyIChjdXJyZW50KSkpOwotCX0KLQotICAgICAgaWYgKG1ha2VtYXAgJiYgISBoYXNvYmplY3RzKQotCXsJCQkvKiBkb24ndCBib3RoZXIgaWYgd2Ugd29uJ3QgbWFrZSBhIG1hcCEgKi8KLQkgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkpCi0jaWYgMAkJCQkvKiBGSVhNRSAtLSB0aGVzZSBhcmUgbm90IHNldCBjb3JyZWN0bHkgKi8KLQkgICAgICAmJiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoY3VycmVudCkgJiBIQVNfU1lNUykpCi0jZW5kaWYKLQkgICAgKQotCSAgICBoYXNvYmplY3RzID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmICghQkZEX1NFTkQgKGFyY2gsIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUsCi0JCSAoYXJjaCwgJmV0YWJsZSwgJmVsZW5ndGgsICZlbmFtZSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFyY2gsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotI2lmZGVmIEdOVTk2MAotICB3cm90ZSA9IGJmZF93cml0ZSAoQkZEX0dOVTk2MF9BUk1BRyAoYXJjaCksIDEsIFNBUk1BRywgYXJjaCk7Ci0jZWxzZQotICB3cm90ZSA9IGJmZF93cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgYXJjaCk7Ci0jZW5kaWYKLSAgaWYgKHdyb3RlICE9IFNBUk1BRykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICB7Ci0gICAgICBpZiAoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCkgIT0gdHJ1ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGVuZ3RoICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGFyX2hkciBoZHI7Ci0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIHN0cmNweSAoaGRyLmFyX25hbWUsIGVuYW1lKTsKLSAgICAgIC8qIFJvdW5kIHNpemUgdXAgdG8gZXZlbiBudW1iZXIgaW4gYXJjaGl2ZSBoZWFkZXIuICAqLwotICAgICAgc3ByaW50ZiAoJihoZHIuYXJfc2l6ZVswXSksICIlLTEwZCIsCi0JICAgICAgIChpbnQpICgoZWxlbmd0aCArIDEpICYgfjEpKTsKLSAgICAgIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLQlpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLQkgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0gICAgICBpZiAoKGJmZF93cml0ZSAoKGNoYXIgKikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLQkgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotCSAgfHwgYmZkX3dyaXRlIChldGFibGUsIDEsIGVsZW5ndGgsIGFyY2gpICE9IGVsZW5ndGgpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKChlbGVuZ3RoICUgMikgPT0gMSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgiXDAxMiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY2hhciBidWZmZXJbREVGQVVMVF9CVUZGRVJTSVpFXTsKLSAgICAgIHVuc2lnbmVkIGludCByZW1haW5pbmcgPSBhcmVsdF9zaXplIChjdXJyZW50KTsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQotICAgICAgLyogd3JpdGUgYXIgaGVhZGVyICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBoZHIsIDEsIHNpemVvZiAoKmhkciksIGFyY2gpICE9IHNpemVvZiAoKmhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChjdXJyZW50LCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHdoaWxlIChyZW1haW5pbmcpCi0JewotCSAgdW5zaWduZWQgaW50IGFtdCA9IERFRkFVTFRfQlVGRkVSU0laRTsKLQkgIGlmIChhbXQgPiByZW1haW5pbmcpCi0JICAgIGFtdCA9IHJlbWFpbmluZzsKLQkgIGVycm5vID0gMDsKLQkgIGlmIChiZmRfcmVhZCAoYnVmZmVyLCBhbXQsIDEsIGN1cnJlbnQpICE9IGFtdCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgYW10LCAxLCBhcmNoKSAhPSBhbXQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbWFpbmluZyAtPSBhbXQ7Ci0JfQotICAgICAgaWYgKChhcmVsdF9zaXplIChjdXJyZW50KSAlIDIpID09IDEpCi0JewotCSAgaWYgKGJmZF93cml0ZSAoIlwwMTIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHsKLSAgICAgIC8qIFZlcmlmeSB0aGUgdGltZXN0YW1wIGluIHRoZSBhcmNoaXZlIGZpbGUuICBJZiBpdCB3b3VsZCBub3QgYmUKLQkgYWNjZXB0ZWQgYnkgdGhlIGxpbmtlciwgcmV3cml0ZSBpdCB1bnRpbCBpdCB3b3VsZCBiZS4gIElmCi0JIGFueXRoaW5nIG9kZCBoYXBwZW5zLCBicmVhayBvdXQgYW5kIGp1c3QgcmV0dXJuLiAgKFRoZQotCSBCZXJrZWxleSBsaW5rZXIgY2hlY2tzIHRoZSB0aW1lc3RhbXAgYW5kIHJlZnVzZXMgdG8gcmVhZCB0aGUKLQkgdGFibGUtb2YtY29udGVudHMgaWYgaXQgaXMgPjYwIHNlY29uZHMgbGVzcyB0aGFuIHRoZSBmaWxlJ3MKLQkgbW9kaWZpZWQtdGltZS4gIFRoYXQgcGFpbmZ1bCBoYWNrIHJlcXVpcmVzIHRoaXMgcGFpbmZ1bCBoYWNrLiAgKi8KLSAgICAgIHRyaWVzID0gMTsKLSAgICAgIGRvCi0JewotCSAgaWYgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKSkKLQkgICAgYnJlYWs7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIldhcm5pbmc6IHdyaXRpbmcgYXJjaGl2ZSB3YXMgc2xvdzogcmV3cml0aW5nIHRpbWVzdGFtcFxuIikpOwotCX0KLSAgICAgIHdoaWxlICgrK3RyaWVzIDwgNik7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTm90ZSB0aGF0IHRoZSBuYW1pZHggZm9yIHRoZSBmaXJzdCBzeW1ib2wgaXMgMCAqLwotCi1ib29sZWFuCi1fYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotewotICBjaGFyICpmaXJzdF9uYW1lID0gTlVMTDsKLSAgYmZkICpjdXJyZW50OwotICBmaWxlX3B0ciBlbHRfbm8gPSAwOwotICBzdHJ1Y3Qgb3JsICptYXAgPSBOVUxMOwotICBpbnQgb3JsX21heCA9IDEwMjQ7CQkvKiBmaW5lIGluaXRpYWwgZGVmYXVsdCAqLwotICBpbnQgb3JsX2NvdW50ID0gMDsKLSAgaW50IHN0cmlkeCA9IDA7CQkvKiBzdHJpbmcgaW5kZXggKi8KLSAgYXN5bWJvbCAqKnN5bXMgPSBOVUxMOwotICBsb25nIHN5bXNfbWF4ID0gMDsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgLyogRHVubm8gaWYgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyBpbmZvLi4uICovCi0gIGlmIChlbGVuZ3RoICE9IDApCi0gICAgZWxlbmd0aCArPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotICBlbGVuZ3RoICs9IGVsZW5ndGggJSAyOwotCi0gIG1hcCA9IChzdHJ1Y3Qgb3JsICopIGJmZF9tYWxsb2MgKG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKTsKLSAgaWYgKG1hcCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIHB1dCB0aGUgc3ltYm9sIG5hbWVzIG9uIHRoZSBhcmNoIG9iamFsbG9jLCBhbmQgdGhlbiBkaXNjYXJkCi0gICAgIHRoZW0gd2hlbiBkb25lLiAgKi8KLSAgZmlyc3RfbmFtZSA9IGJmZF9hbGxvYyAoYXJjaCwgMSk7Ci0gIGlmIChmaXJzdF9uYW1lID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogRHJvcCBhbGwgdGhlIGZpbGVzIGNhbGxlZCBfXy5TWU1ERUYsIHdlJ3JlIGdvaW5nIHRvIG1ha2Ugb3VyCi0gICAgIG93biAqLwotICB3aGlsZSAoYXJjaC0+YXJjaGl2ZV9oZWFkICYmCi0JIHN0cmNtcCAoYXJjaC0+YXJjaGl2ZV9oZWFkLT5maWxlbmFtZSwgIl9fLlNZTURFRiIpID09IDApCi0gICAgYXJjaC0+YXJjaGl2ZV9oZWFkID0gYXJjaC0+YXJjaGl2ZV9oZWFkLT5uZXh0OwotCi0gIC8qIE1hcCBvdmVyIGVhY2ggZWxlbWVudCAqLwotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gICAgICAgY3VycmVudCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGVsdF9ubysrKQotICAgIHsKLSAgICAgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKLQkgICYmICgoYmZkX2dldF9maWxlX2ZsYWdzIChjdXJyZW50KSAmIEhBU19TWU1TKSkpCi0JewotCSAgbG9uZyBzdG9yYWdlOwotCSAgbG9uZyBzeW1jb3VudDsKLQkgIGxvbmcgc3JjX2NvdW50OwotCi0JICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGN1cnJlbnQpOwotCSAgaWYgKHN0b3JhZ2UgPCAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKHN0b3JhZ2UgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzdG9yYWdlID4gc3ltc19tYXgpCi0JCXsKLQkJICBpZiAoc3ltc19tYXggPiAwKQotCQkgICAgZnJlZSAoc3ltcyk7Ci0JCSAgc3ltc19tYXggPSBzdG9yYWdlOwotCQkgIHN5bXMgPSAoYXN5bWJvbCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3ltc19tYXgpOwotCQkgIGlmIChzeW1zID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGN1cnJlbnQsIHN5bXMpOwotCSAgICAgIGlmIChzeW1jb3VudCA8IDApCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogTm93IG1hcCBvdmVyIGFsbCB0aGUgc3ltYm9scywgcGlja2luZyBvdXQgdGhlIG9uZXMgd2Ugd2FudCAqLwotCSAgICAgIGZvciAoc3JjX2NvdW50ID0gMDsgc3JjX2NvdW50IDwgc3ltY291bnQ7IHNyY19jb3VudCsrKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoc3ltc1tzcmNfY291bnRdKS0+ZmxhZ3M7Ci0JCSAgYXNlY3Rpb24gKnNlYyA9IHN5bXNbc3JjX2NvdW50XS0+c2VjdGlvbjsKLQotCQkgIGlmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMIHx8Ci0JCSAgICAgICBmbGFncyAmIEJTRl9XRUFLIHx8Ci0JCSAgICAgICBmbGFncyAmIEJTRl9JTkRJUkVDVCB8fAotCQkgICAgICAgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCQkgICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLQkJICAgIHsKLQkJICAgICAgc2l6ZV90IG5hbWVsZW47Ci0JCSAgICAgIHN0cnVjdCBvcmwgKm5ld19tYXA7Ci0KLQkJICAgICAgLyogVGhpcyBzeW1ib2wgd2lsbCBnbyBpbnRvIHRoZSBhcmNoaXZlIGhlYWRlciAqLwotCQkgICAgICBpZiAob3JsX2NvdW50ID09IG9ybF9tYXgpCi0JCQl7Ci0JCQkgIG9ybF9tYXggKj0gMjsKLQkJCSAgbmV3X21hcCA9Ci0JCQkgICAgKChzdHJ1Y3Qgb3JsICopCi0JCQkgICAgIGJmZF9yZWFsbG9jIChtYXAsIG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKSk7Ci0JCQkgIGlmIChuZXdfbWFwID09IChzdHJ1Y3Qgb3JsICopIE5VTEwpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgbWFwID0gbmV3X21hcDsKLQkJCX0KLQotCQkgICAgICBuYW1lbGVuID0gc3RybGVuIChzeW1zW3NyY19jb3VudF0tPm5hbWUpOwotCQkgICAgICBtYXBbb3JsX2NvdW50XS5uYW1lID0gKChjaGFyICoqKQotCQkJCQkgICAgIGJmZF9hbGxvYyAoYXJjaCwKLQkJCQkJCQlzaXplb2YgKGNoYXIgKikpKTsKLQkJICAgICAgaWYgKG1hcFtvcmxfY291bnRdLm5hbWUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICAqKG1hcFtvcmxfY291bnRdLm5hbWUpID0gYmZkX2FsbG9jIChhcmNoLCBuYW1lbGVuICsgMSk7Ci0JCSAgICAgIGlmICgqKG1hcFtvcmxfY291bnRdLm5hbWUpID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgc3RyY3B5ICgqKG1hcFtvcmxfY291bnRdLm5hbWUpLCBzeW1zW3NyY19jb3VudF0tPm5hbWUpOwotCQkgICAgICAobWFwW29ybF9jb3VudF0pLnBvcyA9IChmaWxlX3B0cikgY3VycmVudDsKLQkJICAgICAgKG1hcFtvcmxfY291bnRdKS5uYW1pZHggPSBzdHJpZHg7Ci0KLQkJICAgICAgc3RyaWR4ICs9IG5hbWVsZW4gKyAxOwotCQkgICAgICArK29ybF9jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIE5vdyBhc2sgdGhlIEJGRCB0byBmcmVlIHVwIGFueSBjYWNoZWQgaW5mb3JtYXRpb24sIHNvIHdlCi0JICAgICBkb24ndCBmaWxsIGFsbCBvZiBtZW1vcnkgd2l0aCBzeW1ib2wgdGFibGVzLiAgKi8KLQkgIGlmICghIGJmZF9mcmVlX2NhY2hlZF9pbmZvIChjdXJyZW50KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBPSywgbm93IHdlIGhhdmUgY29sbGVjdGVkIGFsbCB0aGUgZGF0YSwgbGV0J3Mgd3JpdGUgdGhlbSBvdXQgKi8KLSAgcmV0ID0gQkZEX1NFTkQgKGFyY2gsIHdyaXRlX2FybWFwLAotCQkgIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KSk7Ci0KLSAgaWYgKHN5bXNfbWF4ID4gMCkKLSAgICBmcmVlIChzeW1zKTsKLSAgaWYgKG1hcCAhPSBOVUxMKQotICAgIGZyZWUgKG1hcCk7Ci0gIGlmIChmaXJzdF9uYW1lICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFyY2gsIGZpcnN0X25hbWUpOwotCi0gIHJldHVybiByZXQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzeW1zX21heCA+IDApCi0gICAgZnJlZSAoc3ltcyk7Ci0gIGlmIChtYXAgIT0gTlVMTCkKLSAgICBmcmVlIChtYXApOwotICBpZiAoZmlyc3RfbmFtZSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhcmNoLCBmaXJzdF9uYW1lKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2xlYW4KLWJzZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBpbnQgcGFkaXQgPSBzdHJpZHggJiAxOwotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IG9ybF9jb3VudCAqIEJTRF9TWU1ERUZfU0laRTsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKLSAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHJhbmxpYnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHJhbmxpYnNpemUgKyBzdHJpbmdzaXplICsgODsKLSAgZmlsZV9wdHIgZmlyc3RyZWFsOwotICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGJmZCAqbGFzdF9lbHQgPSBjdXJyZW50OwkvKiBsYXN0IGVsZW1lbnQgYXJjaCBzZWVuICovCi0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZpcnN0cmVhbCA9IG1hcHNpemUgKyBlbGVuZ3RoICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIFNBUk1BRzsKLQotICBzdGF0IChhcmNoLT5maWxlbmFtZSwgJnN0YXRidWYpOwotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIHNwcmludGYgKGhkci5hcl9uYW1lLCBSQU5MSUJNQUcpOwotICAvKiBSZW1lbWJlciB0aGUgdGltZXN0YW1wLCB0byBrZWVwIGl0IGhvbHkuICBCdXQgZnVkZ2UgaXQgYSBsaXR0bGUuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIEFSTUFQX1RJTUVfT0ZGU0VUOwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcyA9IChTQVJNQUcKLQkJCQkgICAgICArIG9mZnNldG9mIChzdHJ1Y3QgYXJfaGRyLCBhcl9kYXRlWzBdKSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgZ2V0dWlkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSBnZXRnaWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0gIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLSAgaWYgKGJmZF93cml0ZSAoKGNoYXIgKikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfaF9wdXRfMzIgKGFyY2gsIChiZmRfdm1hKSByYW5saWJzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgMSwgc2l6ZW9mICh0ZW1wKSwgYXJjaCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgb3JsX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGJ1ZltCU0RfU1lNREVGX1NJWkVdOwotCi0gICAgICBpZiAoKChiZmQgKikgKG1hcFtjb3VudF0pLnBvcykgIT0gbGFzdF9lbHQpCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGZpcnN0cmVhbCArPSBhcmVsdF9zaXplIChjdXJyZW50KSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0JICAgICAgZmlyc3RyZWFsICs9IGZpcnN0cmVhbCAlIDI7Ci0JICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0JICAgIH0KLQkgIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgKG1hcFtjb3VudF0pLnBvcyk7Ci0JfQkJCS8qIGlmIG5ldyBhcmNoaXZlIGVsZW1lbnQgKi8KLQotICAgICAgbGFzdF9lbHQgPSBjdXJyZW50OwotICAgICAgYmZkX2hfcHV0XzMyIChhcmNoLCBtYXBbY291bnRdLm5hbWlkeCwgYnVmKTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYXJjaCwgZmlyc3RyZWFsLCBidWYgKyBCU0RfU1lNREVGX09GRlNFVF9TSVpFKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgQlNEX1NZTURFRl9TSVpFLCAxLCBhcmNoKSAhPSBCU0RfU1lNREVGX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBub3cgd3JpdGUgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcyAqLwotICBiZmRfaF9wdXRfMzIgKGFyY2gsIHN0cmluZ3NpemUsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCAxLCBzaXplb2YgKHRlbXApLCBhcmNoKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgb3JsX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBzdW4ncyBhciB3ZSB1c2UgYSBudWxsLiAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXQgdGhlIGVuZCBvZiBhcmNoaXZlIGZpbGUgaGFuZGxpbmcsIHVwZGF0ZSB0aGUgdGltZXN0YW1wIGluIHRoZQotICAgZmlsZSwgc28gdGhlIGxpbmtlciB3aWxsIGFjY2VwdCBpdC4KLQotICAgUmV0dXJuIHRydWUgaWYgdGhlIHRpbWVzdGFtcCB3YXMgT0ssIG9yIGFuIHVudXN1YWwgcHJvYmxlbSBoYXBwZW5lZC4KLSAgIFJldHVybiBmYWxzZSBpZiB3ZSB1cGRhdGVkIHRoZSB0aW1lc3RhbXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpCi0gICAgIGJmZCAqYXJjaDsKLXsKLSAgc3RydWN0IHN0YXQgYXJjaHN0YXQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBGbHVzaCB3cml0ZXMsIGdldCBsYXN0LXdyaXRlIHRpbWVzdGFtcCBmcm9tIGZpbGUsIGFuZCBjb21wYXJlIGl0Ci0gICAgIHRvIHRoZSB0aW1lc3RhbXAgSU4gdGhlIGZpbGUuICAqLwotICBiZmRfZmx1c2ggKGFyY2gpOwotICBpZiAoYmZkX3N0YXQgKGFyY2gsICZhcmNoc3RhdCkgPT0gLTEpCi0gICAgewotICAgICAgcGVycm9yIChfKCJSZWFkaW5nIGFyY2hpdmUgZmlsZSBtb2QgdGltZXN0YW1wIikpOwotICAgICAgcmV0dXJuIHRydWU7CQkvKiBDYW4ndCByZWFkIG1vZCB0aW1lIGZvciBzb21lIHJlYXNvbiAqLwotICAgIH0KLSAgaWYgKGFyY2hzdGF0LnN0X210aW1lIDw9IGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXApCi0gICAgcmV0dXJuIHRydWU7CQkvKiBPSyBieSB0aGUgbGlua2VyJ3MgcnVsZXMgKi8KLQotICAvKiBVcGRhdGUgdGhlIHRpbWVzdGFtcC4gICovCi0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXAgPSBhcmNoc3RhdC5zdF9tdGltZSArIEFSTUFQX1RJTUVfT0ZGU0VUOwotCi0gIC8qIFByZXBhcmUgYW4gQVNDSUkgdmVyc2lvbiBzdWl0YWJsZSBmb3Igd3JpdGluZy4gICovCi0gIG1lbXNldCAoaGRyLmFyX2RhdGUsIDAsIHNpemVvZiAoaGRyLmFyX2RhdGUpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoaGRyLmFyX2RhdGUpOyBpKyspCi0gICAgaWYgKGhkci5hcl9kYXRlW2ldID09ICdcMCcpCi0gICAgICAoaGRyLmFyX2RhdGUpW2ldID0gJyAnOwotCi0gIC8qIFdyaXRlIGl0IGludG8gdGhlIGZpbGUuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcyA9IChTQVJNQUcKLQkJCQkgICAgICArIG9mZnNldG9mIChzdHJ1Y3QgYXJfaGRyLCBhcl9kYXRlWzBdKSk7Ci0gIGlmIChiZmRfc2VlayAoYXJjaCwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX2RhdGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlIChoZHIuYXJfZGF0ZSwgc2l6ZW9mIChoZHIuYXJfZGF0ZSksIDEsIGFyY2gpCi0JICAhPSBzaXplb2YgKGhkci5hcl9kYXRlKSkpCi0gICAgewotICAgICAgLyogRklYTUU6IGJmZCBjYW4ndCBjYWxsIHBlcnJvci4gICovCi0gICAgICBwZXJyb3IgKF8oIldyaXRpbmcgdXBkYXRlZCBhcm1hcCB0aW1lc3RhbXAiKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsJCS8qIFNvbWUgZXJyb3Igd2hpbGUgd3JpdGluZyAqLwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CQkJLyogV2UgdXBkYXRlZCB0aGUgdGltZXN0YW1wIHN1Y2Nlc3NmdWxseS4gICovCi19Ci0MCi0vKiBBIGNvZmYgYXJtYXAgbG9va3MgbGlrZSA6Ci0gICBsQVJNQUcKLSAgIHN0cnVjdCBhcl9oZHIgd2l0aCBuYW1lID0gJy8nCi0gICBudW1iZXIgb2Ygc3ltYm9scwotICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCAwCi0gICBvZmZzZXQgb2YgZmlsZSBmb3Igc3ltYm9sIDEKLQotICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCBuLTEKLSAgIHN5bWJvbCBuYW1lIDAKLSAgIHN5bWJvbCBuYW1lIDEKLQotICAgc3ltYm9sIG5hbWUgbi0xCi0qLwotCi1ib29sZWFuCi1jb2ZmX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIHN5bWJvbF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSByYW5saWIgaXMgdGhlIG51bWJlciBvZiBleHBvcnRlZCBzeW1ib2xzIGluIHRoZQotICAgICBhcmNoaXZlICogdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIGludCwgKyBhbiBpbnQgZm9yIHRoZSBjb3VudCAqLwotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IChzeW1ib2xfY291bnQgKiA0KSArIDQ7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplID0gc3RyaWR4OwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHN0cmluZ3NpemUgKyByYW5saWJzaXplOwotICBmaWxlX3B0ciBhcmNoaXZlX21lbWJlcl9maWxlX3B0cjsKLSAgYmZkICpjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IHBhZGl0ID0gbWFwc2l6ZSAmIDE7Ci0KLSAgaWYgKHBhZGl0KQotICAgIG1hcHNpemUrKzsKLQotICAvKiB3b3JrIG91dCB3aGVyZSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgd2lsbCBnbyBpbiB0aGUgYXJjaGl2ZSAqLwotICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciA9IChtYXBzaXplCi0JCQkgICAgICsgZWxlbmd0aAotCQkJICAgICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikKLQkJCSAgICAgKyBTQVJNQUcpOwotCi0gIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgaGRyLmFyX25hbWVbMF0gPSAnLyc7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBtYXBzaXplKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgdGltZSAoTlVMTCkpOwotICAvKiBUaGlzLCBhdCBsZWFzdCwgaXMgd2hhdCBJbnRlbCBjb2ZmIHNldHMgdGhlIHZhbHVlcyB0by46ICovCi0gIHNwcmludGYgKChoZHIuYXJfdWlkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfZ2lkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfbW9kZSksICIlLTdvIiwgKHVuc2lnbmVkKSAwKTsKLSAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgLyogV3JpdGUgdGhlIGFyIGhlYWRlciBmb3IgdGhpcyBpdGVtIGFuZCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFyY2gsIHN5bWJvbF9jb3VudCk7Ci0KLSAgLyogVHdvIHBhc3NlcywgZmlyc3Qgd3JpdGUgdGhlIGZpbGUgb2Zmc2V0cyBmb3IgZWFjaCBzeW1ib2wgLQotICAgICByZW1lbWJlcmluZyB0aGF0IGVhY2ggb2Zmc2V0IGlzIG9uIGEgdHdvIGJ5dGUgYm91bmRhcnkuICAqLwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBlYWNoCi0gICAgIHN5bWJvbCwgYW5kIHJlbWVtYmVyIHRvIGtlZXAgdGhlIG9mZnNldHMgcGFkZGVkIG91dC4gICovCi0KLSAgY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgY291bnQgPSAwOwotICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIE5VTEwgJiYgY291bnQgPCBzeW1ib2xfY291bnQpCi0gICAgewotICAgICAgLyogRm9yIGVhY2ggc3ltYm9sIHdoaWNoIGlzIHVzZWQgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCwgd3JpdGUgb3V0Ci0JIHRoZSBvYmplY3QgZmlsZSdzIGFkZHJlc3MgaW4gdGhlIGFyY2hpdmUgKi8KLQotICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbY291bnRdKS5wb3MpID09IGN1cnJlbnQpCi0JewotCSAgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFyY2gsIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyKTsKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgLyogQWRkIHNpemUgb2YgdGhpcyBhcmNoaXZlIGVudHJ5ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSAoYXJlbHRfc2l6ZSAoY3VycmVudCkKLQkJCQkgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gICAgICAvKiByZW1lbWJlciBhYm9vdXQgdGhlIGV2ZW4gYWxpZ25tZW50ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciAlIDI7Ci0gICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLSAgICB9Ci0KLSAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3ltYm9sX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBhcmM5NjAgd2UgdXNlIGEgbnVsbC4gKi8KLSAgaWYgKHBhZGl0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJjaHVyZXMuYyBiL2JmZC9hcmNodXJlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWMyMjNhLi4wMDAwMDAwCi0tLSBhL2JmZC9hcmNodXJlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIGFyY2hpdGVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IEpvaG4gR2lsbW9yZSBhbmQgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qCi0KLVNFQ1RJT04KLQlBcmNoaXRlY3R1cmVzCi0KLQlCRkQga2VlcHMgb25lIGF0b20gaW4gYSBCRkQgZGVzY3JpYmluZyB0aGUKLQlhcmNoaXRlY3R1cmUgb2YgdGhlIGRhdGEgYXR0YWNoZWQgdG8gdGhlIEJGRDogYSBwb2ludGVyIHRvIGEKLQk8PGJmZF9hcmNoX2luZm9fdHlwZT4+LiAgCi0KLQlQb2ludGVycyB0byBzdHJ1Y3R1cmVzIGNhbiBiZSByZXF1ZXN0ZWQgaW5kZXBlbmRlbnRseSBvZiBhIEJGRAotCXNvIHRoYXQgYW4gYXJjaGl0ZWN0dXJlJ3MgaW5mb3JtYXRpb24gY2FuIGJlIGludGVycm9nYXRlZAotCXdpdGhvdXQgYWNjZXNzIHRvIGFuIG9wZW4gQkZELgotCi0JVGhlIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBieSBlYWNoIGFyY2hpdGVjdHVyZSBwYWNrYWdlLgotCVRoZSBzZXQgb2YgZGVmYXVsdCBhcmNoaXRlY3R1cmVzIGlzIHNlbGVjdGVkIGJ5IHRoZSBtYWNybwotCTw8U0VMRUNUX0FSQ0hJVEVDVFVSRVM+Pi4gIFRoaXMgaXMgbm9ybWFsbHkgc2V0IHVwIGluIHRoZQotCUBmaWxle2NvbmZpZy9AdmFye3RhcmdldH0ubXR9IGZpbGUgb2YgeW91ciBjaG9pY2UuICBJZiB0aGUgbmFtZSBpcyBub3QKLQlkZWZpbmVkLCB0aGVuIGFsbCB0aGUgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWQgYXJlIGluY2x1ZGVkLiAKLQotCVdoZW4gQkZEIHN0YXJ0cyB1cCwgYWxsIHRoZSBhcmNoaXRlY3R1cmVzIGFyZSBjYWxsZWQgd2l0aCBhbgotCWluaXRpYWxpemUgbWV0aG9kLiAgSXQgaXMgdXAgdG8gdGhlIGFyY2hpdGVjdHVyZSBiYWNrIGVuZCB0bwotCWluc2VydCBhcyBtYW55IGl0ZW1zIGludG8gdGhlIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcyBhcyBpdCB3YW50cyB0bzsKLQlnZW5lcmFsbHkgdGhpcyB3b3VsZCBiZSBvbmUgZm9yIGVhY2ggbWFjaGluZSBhbmQgb25lIGZvciB0aGUKLQlkZWZhdWx0IGNhc2UgKGFuIGl0ZW0gd2l0aCBhIG1hY2hpbmUgZmllbGQgb2YgMCkuIAotCi0JQkZEJ3MgaWRlYSBvZiBhbiBhcmNoaXRlY3R1cmUgaXMgaW1wbGVtZW50ZWQgaW4JQGZpbGV7YXJjaHVyZXMuY30uCi0qLwotCi0vKgotCi1TVUJTRUNUSU9OCi0JYmZkX2FyY2hpdGVjdHVyZQotCi1ERVNDUklQVElPTgotCVRoaXMgZW51bSBnaXZlcyB0aGUgb2JqZWN0IGZpbGUncyBDUFUgYXJjaGl0ZWN0dXJlLCBpbiBhCi0JZ2xvYmFsIHNlbnNlLS0taS5lLiwgd2hhdCBwcm9jZXNzb3IgZmFtaWx5IGRvZXMgaXQgYmVsb25nIHRvPwotCUFub3RoZXIgZmllbGQgaW5kaWNhdGVzIHdoaWNoIHByb2Nlc3NvciB3aXRoaW4KLQl0aGUgZmFtaWx5IGlzIGluIHVzZS4gIFRoZSBtYWNoaW5lIGdpdmVzIGEgbnVtYmVyIHdoaWNoCi0JZGlzdGluZ3Vpc2hlcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGFyY2hpdGVjdHVyZSwKLQljb250YWluaW5nLCBmb3IgZXhhbXBsZSwgMiBhbmQgMyBmb3IgSW50ZWwgaTk2MCBLQSBhbmQgaTk2MCBLQiwKLQlhbmQgNjgwMjAgYW5kIDY4MDMwIGZvciBNb3Rvcm9sYSA2ODAyMCBhbmQgNjgwMzAuIAotCi0uZW51bSBiZmRfYXJjaGl0ZWN0dXJlIAotLnsKLS4gIGJmZF9hcmNoX3Vua25vd24sICAgeyogRmlsZSBhcmNoIG5vdCBrbm93biAqfQotLiAgYmZkX2FyY2hfb2JzY3VyZSwgICB7KiBBcmNoIGtub3duLCBub3Qgb25lIG9mIHRoZXNlICp9Ci0uICBiZmRfYXJjaF9tNjhrLCAgICAgIHsqIE1vdG9yb2xhIDY4eHh4ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDA4IDIKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAxMCAzCi0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDMwIDUKLS4jZGVmaW5lIGJmZF9tYWNoX202ODA0MCA2Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNwotLiNkZWZpbmUgYmZkX21hY2hfY3B1MzIgIDgKLS4gIGJmZF9hcmNoX3ZheCwgICAgICAgeyogREVDIFZheCAqfSAgIAotLiAgYmZkX2FyY2hfaTk2MCwgICAgICB7KiBJbnRlbCA5NjAgKn0KLS4gICAgeyogVGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgaW1wb3J0YW50LgotLiAgICAgICBsb3dlciBudW1iZXIgaW5kaWNhdGVzIGEgbWFjaGluZSB0eXBlIHRoYXQgCi0uICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0uICAgICAgIGF2YWlsYWJsZSB0byBtYWNoaW5lcyB3aXRoIGhpZ2hlciBudW1iZXJzLgotLiAgICAgICBUaGUgZXhjZXB0aW9uIGlzIHRoZSAiY2EiLCB3aGljaCBpcwotLiAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAotLiAgICAgICAiY29yZSIuICp9Ci0uCi0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCi0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2thX3NhICAgICAyCi0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2tiX3NiICAgICAzCi0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0Ci0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX3hhICAgICAgICA1Ci0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NhICAgICAgICA2Ci0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4CSA3Ci0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2h4ICAgICAgICA4Ci0uCi0uICBiZmRfYXJjaF9hMjlrLCAgICAgIHsqIEFNRCAyOTAwMCAqfQotLiAgYmZkX2FyY2hfc3BhcmMsICAgICB7KiBTUEFSQyAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmMJCQkxCi0ueyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2OHBsdXMgYW5kIHY5IGlzIHRoYXQgdjkgaXMgYSB0cnVlIDY0IGJpdCBlbnYuICAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQJMgotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlCTMKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwkJNAotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjhwbHVzYQkJNSB7KiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUJNgotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjkJCTcKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YQkJOCB7KiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICp9Ci0ueyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5X3AobWFjaCkgXAotLiAgKChtYWNoKSA+PSBiZmRfbWFjaF9zcGFyY192OHBsdXMgJiYgKG1hY2gpIDw9IGJmZF9tYWNoX3NwYXJjX3Y5YSkKLS4gIGJmZF9hcmNoX21pcHMsICAgICAgeyogTUlQUyBSeHh4eCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAJCTMwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMzOTAwCQkzOTAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDAwMAkJNDAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAJCTQwMTAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MTAwCQk0MTAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDExMQkJNDExMQotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAJCTQzMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0NDAwCQk0NDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDYwMAkJNDYwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAJCTQ2NTAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM1MDAwCQk1MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNjAwMAkJNjAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAJCTgwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMxMDAwMAkJMTAwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMxNgkJMTYKLS4gIGJmZF9hcmNoX2kzODYsICAgICAgeyogSW50ZWwgMzg2ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9pMzg2X2kzODYgMAotLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCi0uI2RlZmluZSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4IDIKLS4gIGJmZF9hcmNoX3dlMzJrLCAgICAgeyogQVQmVCBXRTMyeHh4ICp9Ci0uICBiZmRfYXJjaF90YWhvZSwgICAgIHsqIENDSS9IYXJyaXMgVGFob2UgKn0KLS4gIGJmZF9hcmNoX2k4NjAsICAgICAgeyogSW50ZWwgODYwICp9Ci0uICBiZmRfYXJjaF9yb21wLCAgICAgIHsqIElCTSBST01QIFBDL1JUICp9Ci0uICBiZmRfYXJjaF9hbGxpYW50LCAgIHsqIEFsbGlhbnQgKn0KLS4gIGJmZF9hcmNoX2NvbnZleCwgICAgeyogQ29udmV4ICp9Ci0uICBiZmRfYXJjaF9tODhrLCAgICAgIHsqIE1vdG9yb2xhIDg4eHh4ICp9Ci0uICBiZmRfYXJjaF9weXJhbWlkLCAgIHsqIFB5cmFtaWQgVGVjaG5vbG9neSAqfQotLiAgYmZkX2FyY2hfaDgzMDAsICAgICB7KiBIaXRhY2hpIEg4LzMwMCAqfQotLiNkZWZpbmUgYmZkX21hY2hfaDgzMDAgICAxCi0uI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKLS4jZGVmaW5lIGJmZF9tYWNoX2g4MzAwcyAgMwotLiAgYmZkX2FyY2hfcG93ZXJwYywgICB7KiBQb3dlclBDICp9Ci0uICBiZmRfYXJjaF9yczYwMDAsICAgIHsqIElCTSBSUy82MDAwICp9Ci0uICBiZmRfYXJjaF9ocHBhLCAgICAgIHsqIEhQIFBBIFJJU0MgKn0KLS4gIGJmZF9hcmNoX2QxMHYsICAgICAgeyogTWl0c3ViaXNoaSBEMTBWICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9kMTB2CQkwCi0uI2RlZmluZSBiZmRfbWFjaF9kMTB2X3RzMgkyCi0uI2RlZmluZSBiZmRfbWFjaF9kMTB2X3RzMwkzCi0uICBiZmRfYXJjaF9kMzB2LCAgICAgIHsqIE1pdHN1YmlzaGkgRDMwViAqfQotLiAgYmZkX2FyY2hfejhrLCAgICAgICB7KiBaaWxvZyBaODAwMCAqfQotLiNkZWZpbmUgYmZkX21hY2hfejgwMDEJCTEKLS4jZGVmaW5lIGJmZF9tYWNoX3o4MDAyCQkyCi0uICBiZmRfYXJjaF9oODUwMCwgICAgIHsqIEhpdGFjaGkgSDgvNTAwICp9Ci0uICBiZmRfYXJjaF9zaCwgICAgICAgIHsqIEhpdGFjaGkgU0ggKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NoICAgICAgICAgICAgMAotLiNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCi0uI2RlZmluZSBiZmRfbWFjaF9zaDNlICAgICAgIDB4M2UKLS4gIGJmZF9hcmNoX2FscGhhLCAgICAgeyogRGVjIEFscGhhICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjQgIDB4MTAKLS4jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotLiNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY2ICAweDMwCi0uICBiZmRfYXJjaF9hcm0sICAgICAgIHsqIEFkdmFuY2VkIFJpc2MgTWFjaGluZXMgQVJNICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fMgkJMQotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzJhCTIKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8zCQkzCi0uI2RlZmluZSBiZmRfbWFjaF9hcm1fM00gCTQKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV80IAk1Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgCTYKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV81IAk3Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fNVQJOAotLiAgYmZkX2FyY2hfbnMzMmssICAgICB7KiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICp9Ci0uICBiZmRfYXJjaF93NjUsICAgICAgIHsqIFdEQyA2NTgxNiAqfQotLiAgYmZkX2FyY2hfdGljMzAsICAgICB7KiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKn0KLS4gIGJmZF9hcmNoX3RpYzgwLCAgICAgeyogVEkgVE1TMzIwYzgwIChNVlApICp9Ci0uICBiZmRfYXJjaF92ODUwLCAgICAgIHsqIE5FQyBWODUwICp9Ci0uI2RlZmluZSBiZmRfbWFjaF92ODUwICAgICAgICAgIDAKLS4jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlIAknRScKLS4jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlYQknQScKLS4gIGJmZF9hcmNoX2FyYywgICAgICAgeyogQXJnb25hdXQgUklTQyBDb3JlICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hcmNfYmFzZSAwCi0uICBiZmRfYXJjaF9tMzJyLCAgICAgIHsqIE1pdHN1YmlzaGkgTTMyUi9EICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tMzJyCQkwIHsqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tMzJyeAkJJ3gnCi0uICBiZmRfYXJjaF9tbjEwMjAwLCAgIHsqIE1hdHN1c2hpdGEgTU4xMDIwMCAqfQotLiAgYmZkX2FyY2hfbW4xMDMwMCwgICB7KiBNYXRzdXNoaXRhIE1OMTAzMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX21uMTAzMDAJCTMwMAotLiNkZWZpbmUgYmZkX21hY2hfYW0zMwkJMzMwCi0uICBiZmRfYXJjaF9mcjMwLAotLiNkZWZpbmUgYmZkX21hY2hfZnIzMAkJMHg0NjUyMzMzMAotLiAgYmZkX2FyY2hfbWNvcmUsCi0uICBiZmRfYXJjaF9waiwKLS4gIGJmZF9hcmNoX2xhc3QKLS4gIH07Ci0KLQotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoX2luZm8KLQotREVTQ1JJUFRJT04KLQlUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBhcmNoaXRlY3R1cmVzIGZvciB1c2UKLQl3aXRoaW4gQkZELgotCi0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLS57Ci0uICBpbnQgYml0c19wZXJfd29yZDsKLS4gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotLiAgaW50IGJpdHNfcGVyX2J5dGU7Ci0uICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLS4gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLS4gIGNvbnN0IGNoYXIgKmFyY2hfbmFtZTsKLS4gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOwotLiAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0uIHsqIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICp9Ci0uICBib29sZWFuIHRoZV9kZWZhdWx0OwkKLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQotLglQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLS4JICAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmIpKTsKLS4KLS4gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLS4KLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OwotLn0gYmZkX2FyY2hfaW5mb190eXBlOwotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYTI5a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJtX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDg1MDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k4NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX20zMnJfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX202OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAyMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfcGpfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NoX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zcGFyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzgwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92YXhfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3dlMzJrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF96OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX25zMzJrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF93NjVfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Y4NTBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2ZyMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21jb3JlX2FyY2g7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCBiZmRfYXJjaHVyZXNfbGlzdFtdID0KLXsKLSNpZmRlZiBTRUxFQ1RfQVJDSElURUNUVVJFUwotICBTRUxFQ1RfQVJDSElURUNUVVJFUywKLSNlbHNlCi0gICZiZmRfYTI5a19hcmNoLAotICAmYmZkX2FscGhhX2FyY2gsCi0gICZiZmRfYXJjX2FyY2gsCi0gICZiZmRfYXJtX2FyY2gsCi0gICZiZmRfZDEwdl9hcmNoLAotICAmYmZkX2QzMHZfYXJjaCwKLSAgJmJmZF9oODMwMF9hcmNoLAotICAmYmZkX2g4NTAwX2FyY2gsCi0gICZiZmRfaHBwYV9hcmNoLAotICAmYmZkX2kzODZfYXJjaCwKLSAgJmJmZF9pODYwX2FyY2gsCi0gICZiZmRfaTk2MF9hcmNoLAotICAmYmZkX20zMnJfYXJjaCwKLSAgJmJmZF9tNjhrX2FyY2gsCi0gICZiZmRfbTg4a19hcmNoLAotICAmYmZkX21pcHNfYXJjaCwKLSAgJmJmZF9tbjEwMjAwX2FyY2gsCi0gICZiZmRfbW4xMDMwMF9hcmNoLAotICAmYmZkX3Bvd2VycGNfYXJjaCwKLSAgJmJmZF9yczYwMDBfYXJjaCwKLSAgJmJmZF9zaF9hcmNoLAotICAmYmZkX3NwYXJjX2FyY2gsCi0gICZiZmRfdGljMzBfYXJjaCwKLSAgJmJmZF90aWM4MF9hcmNoLAotICAmYmZkX3ZheF9hcmNoLAotICAmYmZkX3dlMzJrX2FyY2gsCi0gICZiZmRfejhrX2FyY2gsCi0gICZiZmRfbnMzMmtfYXJjaCwKLSAgJmJmZF93NjVfYXJjaCwKLSAgJmJmZF92ODUwX2FyY2gsCi0gICZiZmRfZnIzMF9hcmNoLAotICAmIGJmZF9tY29yZV9hcmNoLAotI2VuZGlmCi0gIDAKLX07Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludGFibGVfbmFtZQotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKmJmZF9wcmludGFibGVfbmFtZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHByaW50YWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUKLQlmcm9tIHRoZSBwb2ludGVyIHRvIHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBzdHJ1Y3R1cmUuCi0KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9uYW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPnByaW50YWJsZV9uYW1lOwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NjYW5fYXJjaAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX3NjYW5fYXJjaChjb25zdCBjaGFyICpzdHJpbmcpOwotCi1ERVNDUklQVElPTgotCUZpZ3VyZSBvdXQgaWYgQkZEIHN1cHBvcnRzIGFueSBjcHUgd2hpY2ggY291bGQgYmUgZGVzY3JpYmVkIHdpdGgKLQl0aGUgbmFtZSBAdmFye3N0cmluZ30uICBSZXR1cm4gYSBwb2ludGVyIHRvIGFuIDw8YXJjaF9pbmZvPj4KLQlzdHJ1Y3R1cmUgaWYgYSBtYWNoaW5lIGlzIGZvdW5kLCBvdGhlcndpc2UgTlVMTC4KLQotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9zY2FuX2FyY2ggKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwLCAqYXA7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgaW5zdGFsbGVkIGFyY2hpdGVjdHVyZXMgKi8KLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICBpZiAoYXAtPnNjYW4gKGFwLCBzdHJpbmcpKQotCSAgICByZXR1cm4gYXA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2xpc3QKLQotU1lOT1BTSVMKLQljb25zdCBjaGFyICoqYmZkX2FyY2hfbGlzdCh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBmcmVzaGx5IG1hbGxvY2VkIE5VTEwtdGVybWluYXRlZCB2ZWN0b3Igb2YgdGhlIG5hbWVzCi0Jb2YgYWxsIHRoZSB2YWxpZCBCRkQgYXJjaGl0ZWN0dXJlcy4gIERvIG5vdCBtb2RpZnkgdGhlIG5hbWVzLgotCi0qLwotCi1jb25zdCBjaGFyICoqCi1iZmRfYXJjaF9saXN0ICgpCi17Ci0gIGludCB2ZWNfbGVuZ3RoID0gMDsKLSAgY29uc3QgY2hhciAqKm5hbWVfcHRyOwotICBjb25zdCBjaGFyICoqbmFtZV9saXN0OwotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwOwotCi0gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGFyY2hpdGVjdHVyZXMgKi8KLSAgdmVjX2xlbmd0aCA9IDA7Ci0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcDsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIHZlY19sZW5ndGgrKzsKLQl9Ci0gICAgfQotCi0gIG5hbWVfbGlzdCA9IChDT05TVCBjaGFyICoqKQotICAgIGJmZF9tYWxsb2MgKCh2ZWNfbGVuZ3RoICsgMSkgKiBzaXplb2YgKGNoYXIgKiopKTsKLSAgaWYgKG5hbWVfbGlzdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFBvaW50IHRoZSBsaXN0IGF0IGVhY2ggb2YgdGhlIG5hbWVzICovCi0gIG5hbWVfcHRyID0gbmFtZV9saXN0OwotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICAqbmFtZV9wdHIgPSBhcC0+cHJpbnRhYmxlX25hbWU7Ci0JICBuYW1lX3B0cisrOwotCX0KLSAgICB9Ci0gICpuYW1lX3B0ciA9IE5VTEw7Ci0KLSAgcmV0dXJuIG5hbWVfbGlzdDsKLX0KLQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2dldF9jb21wYXRpYmxlCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSgKLQkJY29uc3QgYmZkICphYmZkLAotCSAgICAgICAgY29uc3QgYmZkICpiYmZkKTsKLQotREVTQ1JJUFRJT04KLQlEZXRlcm1pbmUgd2hldGhlciB0d28gQkZEcycKLQlhcmNoaXRlY3R1cmVzIGFuZCBtYWNoaW5lIHR5cGVzIGFyZSBjb21wYXRpYmxlLiAgQ2FsY3VsYXRlcwotCXRoZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yIGJldHdlZW4gdGhlIHR3byBhcmNoaXRlY3R1cmVzCi0JYW5kIG1hY2hpbmUgdHlwZXMgaW1wbGllZCBieSB0aGUgQkZEcyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KLQlhbiA8PGFyY2hfaW5mbz4+IHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjb21wYXRpYmxlIG1hY2hpbmUuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgKGFiZmQsIGJiZmQpCi0gICAgIGNvbnN0IGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkICpiYmZkOwotewotICAvKiBJZiBlaXRoZXIgYXJjaGl0ZWN0dXJlIGlzIHVua25vd24sIHRoZW4gYWxsIHdlIGNhbiBkbyBpcyBhc3N1bWUKLSAgICAgdGhlIHVzZXIga25vd3Mgd2hhdCBoZSdzIGRvaW5nLiAgKi8KLSAgaWYgKGFiZmQtPmFyY2hfaW5mby0+YXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAJcmV0dXJuIGJiZmQtPmFyY2hfaW5mbzsKLSAgaWYgKGJiZmQtPmFyY2hfaW5mby0+YXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAJcmV0dXJuIGFiZmQtPmFyY2hfaW5mbzsKLQotICAvKiBPdGhlcndpc2UgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUgaGFzIHRvIGRlY2lkZS4gICovCi0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmNvbXBhdGlibGUgKGFiZmQtPmFyY2hfaW5mbywgYmJmZC0+YXJjaF9pbmZvKTsKLX0KLQotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWJmZF9kZWZhdWx0X2FyY2hfc3RydWN0Ci0KLURFU0NSSVBUSU9OCi0JVGhlIDw8YmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q+PiBpcyBhbiBpdGVtIG9mCi0JPDxiZmRfYXJjaF9pbmZvX3R5cGU+PiB3aGljaCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBhIGZhaXJseQotCWdlbmVyaWMgc3RhdGUuICBBIEJGRCBzdGFydHMgbGlmZSBieSBwb2ludGluZyB0byB0aGlzCi0Jc3RydWN0dXJlLCB1bnRpbCB0aGUgY29ycmVjdCBiYWNrIGVuZCBoYXMgZGV0ZXJtaW5lZCB0aGUgcmVhbAotCWFyY2hpdGVjdHVyZSBvZiB0aGUgZmlsZS4KLQotLmV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCA9Ci17Ci0gICAgMzIsMzIsOCxiZmRfYXJjaF91bmtub3duLDAsInVua25vd24iLCJ1bmtub3duIiwyLHRydWUsCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLCAKLSAgICAwLAotfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9hcmNoX2luZm8KLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9zZXRfYXJjaF9pbmZvKGJmZCAqYWJmZCwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmcpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGluZm8gb2YgQHZhcnthYmZkfSB0byBAdmFye2FyZ30uCi0qLwotCi12b2lkCi1iZmRfc2V0X2FyY2hfaW5mbyAoYWJmZCwgYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJnOwotewotICBhYmZkLT5hcmNoX2luZm8gPSBhcmc7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYmZkICphYmZkLAotCQllbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkJdW5zaWduZWQgbG9uZyBtYWNoKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGluIEJGRCBAdmFye2FiZmR9Ci0JdG8gQHZhcnthcmNofSBhbmQgQHZhcnttYWNofS4gIEZpbmQgdGhlIGNvcnJlY3QKLQlwb2ludGVyIHRvIGEgc3RydWN0dXJlIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgPDxhcmNoX2luZm8+PgotCXBvaW50ZXIuIAotKi8KLQotYm9vbGVhbgotYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwLCAqYXA7Ci0KLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICBpZiAoYXAtPmFyY2ggPT0gYXJjaAotCSAgICAgICYmIChhcC0+bWFjaCA9PSBtYWNoCi0JCSAgfHwgKG1hY2ggPT0gMCAmJiBhcC0+dGhlX2RlZmF1bHQpKSkKLQkgICAgewotCSAgICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFwOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9hcmNoCi0KLVNZTk9QU0lTCi0JZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGJmZF9nZXRfYXJjaChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgZW51bWVyYXRlZCB0eXBlIHdoaWNoIGRlc2NyaWJlcyB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCWFyY2hpdGVjdHVyZS4KLQotKi8KLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi1iZmRfZ2V0X2FyY2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5hcmNoOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X21hY2gKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBsb25nIGJmZF9nZXRfbWFjaChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbG9uZyB0eXBlIHdoaWNoIGRlc2NyaWJlcyB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCW1hY2hpbmUuCi0qLwotCi11bnNpZ25lZCBsb25nICAKLWJmZF9nZXRfbWFjaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAgIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPm1hY2g7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2JpdHNfcGVyX2J5dGUKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2FyY2hfYml0c19wZXJfYnl0ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gb25lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlJ3MgYnl0ZXMuCi0KLSovCi0KLXVuc2lnbmVkIGludAotYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5iaXRzX3Blcl9ieXRlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzCi0KLVNZTk9QU0lTCi0JdW5zaWduZWQgaW50IGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIG9uZSBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCWFyY2hpdGVjdHVyZSdzIGFkZHJlc3Nlcy4KLSovCi0KLXVuc2lnbmVkIGludAotYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5iaXRzX3Blcl9hZGRyZXNzOwotfQotCi0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTiAKLQliZmRfZGVmYXVsdF9jb21wYXRpYmxlCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfZGVmYXVsdF9jb21wYXRpYmxlCi0JKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYSwKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmIpOwotCi1ERVNDUklQVElPTgotCVRoZSBkZWZhdWx0IGZ1bmN0aW9uIGZvciB0ZXN0aW5nIGZvciBjb21wYXRpYmlsaXR5LgotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGEtPm1hY2ggPiBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIGlmIChiLT5tYWNoID4gYS0+bWFjaCkKLSAgICByZXR1cm4gYjsKLQotICByZXR1cm4gYTsKLX0KLQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZGVmYXVsdF9zY2FuCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZGVmYXVsdF9zY2FuKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvLCBjb25zdCBjaGFyICpzdHJpbmcpOwotCi1ERVNDUklQVElPTgotCVRoZSBkZWZhdWx0IGZ1bmN0aW9uIGZvciB3b3JraW5nIG91dCB3aGV0aGVyIHRoaXMgaXMgYW4KLQlhcmNoaXRlY3R1cmUgaGl0IGFuZCBhIG1hY2hpbmUgaGl0LgotKi8KLQotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NjYW4gKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgY29uc3QgY2hhciAqcHRyX3NyYzsKLSAgY29uc3QgY2hhciAqcHRyX3RzdDsKLSAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBjb25zdCBjaGFyICpwcmludGFibGVfbmFtZV9jb2xvbjsKLQotICAvKiBFeGFjdCBtYXRjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIG5hbWUgKEFSQ0hfTkFNRSkgYW5kIGFsc28gdGhlCi0gICAgIGRlZmF1bHQgYXJjaGl0ZWN0dXJlPyAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5hcmNoX25hbWUpID09IDAKLSAgICAgICYmIGluZm8tPnRoZV9kZWZhdWx0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEV4YWN0IG1hdGNoIG9mIHRoZSBtYWNoaW5lIG5hbWUgKFBSSU5UQUJMRV9OQU1FKT8gKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gICAgIAotICAvKiBHaXZlbiB0aGF0IHByaW50YWJsZV9uYW1lIGNvbnRhaW5zIG5vIGNvbG9uLCBhdHRlbXB0IHRvIG1hdGNoOgotICAgICBBUkNIX05BTUUgWyAiOiIgXSBQUklOVEFCTEVfTkFNRT8gKi8KLSAgcHJpbnRhYmxlX25hbWVfY29sb24gPSBzdHJjaHIgKGluZm8tPnByaW50YWJsZV9uYW1lLCAnOicpOwotICBpZiAocHJpbnRhYmxlX25hbWVfY29sb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgc3RybGVuX2FyY2hfbmFtZSA9IHN0cmxlbiAoaW5mby0+YXJjaF9uYW1lKTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5hcmNoX25hbWUsIHN0cmxlbl9hcmNoX25hbWUpID09IDApCi0JewotCSAgaWYgKHN0cmluZ1tzdHJsZW5fYXJjaF9uYW1lXSA9PSAnOicpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nICsgc3RybGVuX2FyY2hfbmFtZSArIDEsCi0JCQkgICAgICBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcgKyBzdHJsZW5fYXJjaF9uYW1lLAotCQkJICAgICAgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0JCXJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBHaXZlbiB0aGF0IFBSSU5UQUJMRV9OQU1FIGhhcyB0aGUgZm9ybTogPGFyY2g+ICI6IiA8bWFjaD47Ci0gICAgIEF0dGVtcHQgdG8gbWF0Y2g6IDxhcmNoPiA8bWFjaD4/ICovCi0gIGlmIChwcmludGFibGVfbmFtZV9jb2xvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBjb2xvbl9pbmRleCA9IHByaW50YWJsZV9uYW1lX2NvbG9uIC0gaW5mby0+cHJpbnRhYmxlX25hbWU7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUsIGNvbG9uX2luZGV4KSA9PSAwCi0JICAmJiBzdHJjYXNlY21wIChzdHJpbmcgKyBjb2xvbl9pbmRleCwKLQkJCSBpbmZvLT5wcmludGFibGVfbmFtZSArIGNvbG9uX2luZGV4ICsgMSkgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogR2l2ZW4gdGhhdCBQUklOVEFCTEVfTkFNRSBoYXMgdGhlIGZvcm06IDxhcmNoPiAiOiIgPG1hY2g+OyBEbyBub3QKLSAgICAgYXR0ZW1wdCB0byBtYXRjaCBqdXN0IDxtYWNoPiwgaXQgY291bGQgYmUgYW1iaWdpb3VzLiAgVGhpcyB0ZXN0Ci0gICAgIGlzIGxlZnQgdW50aWwgbGF0ZXIuICovCi0KLSAgLyogTk9URTogVGhlIGJlbG93IGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuIFBsZWFzZSBkbyBub3QKLSAgICAgYWRkIHRvIHRoaXMgY29kZSAqLwotCi0gIC8qIFNlZSBob3cgbXVjaCBvZiB0aGUgc3VwcGxpZWQgc3RyaW5nIG1hdGNoZXMgd2l0aCB0aGUKLSAgICAgYXJjaGl0ZWN0dXJlLCBlZyB0aGUgc3RyaW5nIG02OGs6NjgwMjAgd291bGQgbWF0Y2ggdGhlIDY4ayBlbnRyeQotICAgICB1cCB0byB0aGUgOiwgdGhlbiB3ZSBnZXQgbGVmdCB3aXRoIHRoZSBtYWNoaW5lIG51bWJlciAqLwotCi0gIGZvciAocHRyX3NyYyA9IHN0cmluZywgcHRyX3RzdCA9IGluZm8tPmFyY2hfbmFtZTsgCi0gICAgICAgKnB0cl9zcmMgJiYgKnB0cl90c3Q7Ci0gICAgICAgcHRyX3NyYysrLCBwdHJfdHN0KyspIAotICAgIHsKLSAgICAgIGlmICgqcHRyX3NyYyAhPSAqcHRyX3RzdCkgYnJlYWs7Ci0gICAgfQotCi0gIC8qIENoZXdlZCB1cCBhcyBtdWNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgYXMgd2lsbCBtYXRjaCwgc2tpcCBhbnkKLSAgICAgY29sb25zICovCi0gIGlmICgqcHRyX3NyYyA9PSAnOicpCi0gICAgcHRyX3NyYysrOwotICAKLSAgaWYgKCpwdHJfc3JjID09IDApCi0gICAgewotICAgICAgLyogbm90aGluZyBtb3JlLCB0aGVuIG9ubHkga2VlcCB0aGlzIG9uZSBpZiBpdCBpcyB0aGUgZGVmYXVsdAotCSBtYWNoaW5lIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLwotICAgICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OwotICAgIH0KLQotICBudW1iZXIgPSAwOwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwdHJfc3JjKSkKLSAgICB7Ci0gICAgICBudW1iZXIgPSBudW1iZXIgKiAxMCArICpwdHJfc3JjICAtICcwJzsKLSAgICAgIHB0cl9zcmMrKzsKLSAgICB9Ci0KLSAgLyogTk9URTogVGhlIGJlbG93IGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuCi0gICAgIFBMRUFTRSBETyBOT1QgQUREIFRPIFRISVMgQ09ERS4gKi8KLQotICBzd2l0Y2ggKG51bWJlcikgCi0gICAgewotICAgICAgLyogRklYTUU6IFRoZXNlIGFyZSBuZWVkZWQgdG8gcGFyc2UgSUVFRSBvYmplY3RzLiAgKi8KLSAgICBjYXNlIDY4MDAwOiAKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAxMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAyMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAzMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDMwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODA0MDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDQwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODA2MDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODMzMjoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfY3B1MzI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzIwMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfd2UzMms7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbWlwczMwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbWlwczQwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNjAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9yczYwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6ICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGFyY2ggIT0gaW5mby0+YXJjaCkgCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChudW1iZXIgIT0gaW5mby0+bWFjaCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9hcmNoX2luZm8KLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBiZmRfZ2V0X2FyY2hfaW5mbyhiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgYXJjaGl0ZWN0dXJlIGluZm8gc3RydWN0IGluIEB2YXJ7YWJmZH0uCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mbzsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfbG9va3VwX2FyY2gKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9sb29rdXBfYXJjaAotCQkoZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi0JCWFyY2gsCi0JCXVuc2lnbmVkIGxvbmcgbWFjaGluZSk7Ci0KLURFU0NSSVBUSU9OCi0JTG9vayBmb3IgdGhlIGFyY2hpdGVjdXJlIGluZm8gc3RydWN0dXJlIHdoaWNoIG1hdGNoZXMgdGhlCi0JYXJndW1lbnRzIEB2YXJ7YXJjaH0gYW5kIEB2YXJ7bWFjaGluZX0uIEEgbWFjaGluZSBvZiAwIG1hdGNoZXMgdGhlCi0JbWFjaGluZS9hcmNoaXRlY3R1cmUgc3RydWN0dXJlIHdoaWNoIG1hcmtzIGl0c2VsZiBhcyB0aGUKLQlkZWZhdWx0LgotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogCi1iZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2hpbmUpCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+YXJjaCA9PSBhcmNoCi0JICAgICAgJiYgKGFwLT5tYWNoID09IG1hY2hpbmUKLQkJICB8fCAobWFjaGluZSA9PSAwICYmIGFwLT50aGVfZGVmYXVsdCkpKQotCSAgICByZXR1cm4gYXA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfcHJpbnRhYmxlX2FyY2hfbWFjaAotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKmJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0JCShlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwcmludGFibGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYXJjaGl0ZWN0dXJlIGFuZAotCW1hY2hpbmUgdHlwZS4gCi0KLQlUaGlzIHJvdXRpbmUgaXMgZGVwcmVjaWF0ZWQuCi0qLwotCi1jb25zdCBjaGFyICoKLWJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhcmNoLCBtYWNoaW5lKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXAgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2hpbmUpOwotCi0gICAgaWYgKGFwKQotICAgICAgcmV0dXJuIGFwLT5wcmludGFibGVfbmFtZTsKLSAgICByZXR1cm4gIlVOS05PV04hIjsKLX0KZGlmZiAtLWdpdCBhL2JmZC9hcm1uZXRic2QuYyBiL2JmZC9hcm1uZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2ZWU0Ny4uMDAwMDAwMAotLS0gYS9iZmQvYXJtbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9BUk0gYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECQk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJCWJmZF9hcmNoX2FybQotI2RlZmluZQlERUZBVUxUX01JRCAJCU1fQVJNNl9ORVRCU0QKLS8qI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9BUk02X05FVEJTRCkqLwotCi0jZGVmaW5lIE1ZKE9QKSAJCQlDQVQgKGFybW5ldGJzZF8sIE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAJCSJhLm91dC1hcm0tbmV0YnNkIgotCi0jaWYgMAotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhhb3V0YXJtLF8zMl8seSkKLQotI2RlZmluZSBhb3V0YXJtXzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dGFybV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImJmZC5oIgkJLyogVG8gZW5zdXJlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBpcyBPSyAqLwotCi1DT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLU1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiBhYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLSNlbmRpZgotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvYmZkLWluLmggYi9iZmQvYmZkLWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZmY3ZGQuLjAwMDAwMDAKLS0tIGEvYmZkL2JmZC1pbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qIE1haW4gaGVhZGVyIGZpbGUgZm9yIHRoZSBiZmQgbGlicmFyeSAtLSBwb3J0YWJsZSBhY2Nlc3MgdG8gb2JqZWN0IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogYmZkLmggYW5kIGJmZC1pbjIuaCBhcmUgR0VORVJBVEVEIGZpbGVzLiAgRG9uJ3QgY2hhbmdlIHRoZW07Ci0qKiBpbnN0ZWFkLCBjaGFuZ2UgYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGVzZSBmaWxlcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBiZmQuaCAtLSBUaGUgb25seSBoZWFkZXIgZmlsZSByZXF1aXJlZCBieSB1c2VycyBvZiB0aGUgYmZkIGxpYnJhcnkgCi0KLVRoZSBiZmQuaCBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJmZC1pbi5oIGFuZCB2YXJpb3VzIC5jIGZpbGVzOyBpZiB5b3UKLWNoYW5nZSBpdCwgeW91ciBjaGFuZ2VzIHdpbGwgcHJvYmFibHkgYmUgbG9zdC4KLQotQWxsIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbW1lbnQgIlRIRSBGT0xMT1dJTkcKLUlTIEVYVFJBQ1RFRCBGUk9NIFRIRSBTT1VSQ0UiIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzIGZvcgotQkZELiAgSWYgeW91IGNoYW5nZSBpdCwgc29tZW9uZSBvbmVkYXkgd2lsbCBleHRyYWN0IGl0IGZyb20gdGhlIHNvdXJjZQotYWdhaW4sIGFuZCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiAgVG8gc2F2ZSB5b3Vyc2VsZiBmcm9tIHRoaXMgYmluZCwKLWNoYW5nZSB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgYmZkIGRpcmVjdG9yeS4gIFR5cGUgIm1ha2UKLWRvY3MiIGFuZCB0aGVuICJtYWtlIGhlYWRlcnMiIGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgbWFnaWNhbGx5IHRoaXMgZmlsZQotd2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGNoYW5nZXMuCi0KLUlmIHlvdSBkb24ndCBoYXZlIHRoZSB0b29scyB0byBwZXJmb3JtIHRoZSBleHRyYWN0aW9uLCB0aGVuIHlvdSBhcmUKLXNhZmUgZnJvbSBzb21lb25lIG9uIHlvdXIgc3lzdGVtIHRyYW1wbGluZyBvdmVyIHlvdXIgaGVhZGVyIGZpbGVzLgotWW91IHNob3VsZCBzdGlsbCBtYWludGFpbiB0aGUgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0aGlzCi1maWxlIHRob3VnaDsgZXZlcnkgY2hhbmdlIHlvdSBtYWtlIHRvIHRoZSAuYyBmaWxlIHNob3VsZCBiZSByZWZsZWN0ZWQKLWhlcmUuICAqLwotCi0jaWZuZGVmIF9fQkZEX0hfU0VFTl9fCi0jZGVmaW5lIF9fQkZEX0hfU0VFTl9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHR3byBsaW5lcyBnZXQgc3Vic3RpdHV0aW9ucyBkb25lIGJ5IGNvbW1hbmRzIGluIE1ha2VmaWxlLmluLiAgKi8KLSNkZWZpbmUgQkZEX1ZFUlNJT04gICJAVkVSU0lPTkAiCi0jZGVmaW5lIEJGRF9BUkNIX1NJWkUgQHdvcmRzaXplQAotI2RlZmluZSBCRkRfSE9TVF82NEJJVF9MT05HIEBCRkRfSE9TVF82NEJJVF9MT05HQAotI2lmIEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLSNkZWZpbmUgQkZEX0hPU1RfNjRfQklUIEBCRkRfSE9TVF82NF9CSVRACi0jZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIEBCRkRfSE9TVF9VXzY0X0JJVEAKLSNlbmRpZgotCi0jaWYgQkZEX0FSQ0hfU0laRSA+PSA2NAotI2RlZmluZSBCRkQ2NAotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgX19HTlVDX18gPj0gMgotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBfYmZkIGJmZDsKLQotLyogVG8gc3F1ZWxjaCBlcnJvbmVvdXMgY29tcGlsZXIgd2FybmluZ3MgKCJpbGxlZ2FsIHBvaW50ZXIKLSAgIGNvbWJpbmF0aW9uIikgZnJvbSB0aGUgU1ZSMyBjb21waWxlciwgd2Ugd291bGQgbGlrZSB0byB0eXBlZGVmCi0gICBib29sZWFuIHRvIGludCAoaXQgZG9lc24ndCBsaWtlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYm9vbGVhbi4KLSAgIE1ha2luZyBzdXJlIHRoZXkgYXJlIG5ldmVyIGltcGxpY2l0bHkgZGVjbGFyZWQgdG8gcmV0dXJuIGludAotICAgZG9lc24ndCBzZWVtIHRvIGhlbHApLiAgQnV0IHRoaXMgZmlsZSBpcyBub3QgY29uZmlndXJlZCBiYXNlZCBvbgotICAgdGhlIGhvc3QuICAqLwotLyogR2VuZXJhbCBydWxlczogZnVuY3Rpb25zIHdoaWNoIGFyZSBib29sZWFuIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKLSAgIGFuZCBmYWxzZSBvbiBmYWlsdXJlICh1bmxlc3MgdGhleSdyZSBhIHByZWRpY2F0ZSkuICAgLS0gYmZkLmRvYyAqLwotLyogSSdtIHN1cmUgdGhpcyBpcyBnb2luZyB0byBicmVhayBzb21ldGhpbmcgYW5kIHNvbWVvbmUgaXMgZ29pbmcgdG8KLSAgIGZvcmNlIG1lIHRvIGNoYW5nZSBpdC4gKi8KLS8qIHR5cGVkZWYgZW51bSBib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsgKi8KLS8qIFl1cCwgU1ZSNCBoYXMgYSAidHlwZWRlZiBlbnVtIGJvb2xlYW4iIGluIDxzeXMvdHlwZXMuaD4gIC1mbmYgKi8KLS8qIEl0IGdldHMgd29yc2UgaWYgdGhlIGhvc3QgYWxzbyBkZWZpbmVzIGEgdHJ1ZS9mYWxzZSBlbnVtLi4uIC1zdHMgKi8KLS8qIEFuZCBldmVuIHdvcnNlIGlmIHlvdXIgY29tcGlsZXIgaGFzIGJ1aWx0LWluIGJvb2xlYW4gdHlwZXMuLi4gLWxhdyAqLwotI2lmIGRlZmluZWQgKF9fR05VR19fKSAmJiAoX19HTlVDX01JTk9SX18gPiA1KQotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmCi0jaWZkZWYgTVBXCi0vKiBQcmUtZW1wdGl2ZSBzdHJpa2UgLSBnZXQgdGhlIGZpbGUgd2l0aCB0aGUgZW51bS4gKi8KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotI2lmbmRlZiBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsKLSNkZWZpbmUgQkZEX1RSVUVfRkFMU0UKLSNlbHNlCi0vKiBVc2UgZW51bSBuYW1lcyB0aGF0IHdpbGwgYXBwZWFyIG5vd2hlcmUgZWxzZS4gICovCi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2JmZF9mZmZhbHNlLCBiZmRfdHR0cnVlfSBib29sZWFuOwotI2VuZGlmCi0KLS8qIEEgcG9pbnRlciB0byBhIHBvc2l0aW9uIGluIGEgZmlsZS4gICovCi0vKiBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIHVzaW5nIG9mZl90IGZyb20gPHN5cy90eXBlcy5oPi4KLSAgIEZvciBub3csIHRyeSB0byBhdm9pZCBicmVha2luZyBzdHVmZiBieSBub3QgaW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gaGVyZS4KLSAgIFRoaXMgd2lsbCBicmVhayBvbiBzeXN0ZW1zIHdpdGggNjQtYml0IGZpbGUgb2Zmc2V0cyAoZS5nLiA0LjRCU0QpLgotICAgUHJvYmFibHkgdGhlIGJlc3QgbG9uZy10ZXJtIGFuc3dlciBpcyB0byBhdm9pZCB1c2luZyBmaWxlX3B0ciBBTkQgb2ZmX3QgCi0gICBpbiB0aGlzIGhlYWRlciBmaWxlLCBhbmQgdG8gaGFuZGxlIHRoaXMgaW4gdGhlIEJGRCBpbXBsZW1lbnRhdGlvbgotICAgcmF0aGVyIHRoYW4gaW4gaXRzIGludGVyZmFjZS4gICovCi0vKiB0eXBlZGVmIG9mZl90CWZpbGVfcHRyOyAqLwotdHlwZWRlZiBsb25nIGludCBmaWxlX3B0cjsKLQotLyogU3VwcG9ydCBmb3IgZGlmZmVyZW50IHNpemVzIG9mIHRhcmdldCBmb3JtYXQgaW50cyBhbmQgYWRkcmVzc2VzLgotICAgSWYgdGhlIHR5cGUgYGxvbmcnIGlzIGF0IGxlYXN0IDY0IGJpdHMsIEJGRF9IT1NUXzY0QklUX0xPTkcgd2lsbCBiZQotICAgc2V0IHRvIDEgYWJvdmUuICBPdGhlcndpc2UsIGlmIGdjYyBpcyBiZWluZyB1c2VkLCB0aGlzIGNvZGUgd2lsbAotICAgdXNlIGdjYydzICJsb25nIGxvbmciIHR5cGUuICBPdGhlcndpc2UsIEJGRF9IT1NUXzY0X0JJVCBtdXN0IGJlCi0gICBkZWZpbmVkIGFib3ZlLiAgKi8KLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSMgaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotIyAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nCi0jICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZwotIyBlbHNlCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGlmIF9fR05VQ19fID49IDIKLSMgICAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nIGxvbmcKLSMgICAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcgbG9uZwotIyAgIGVuZGlmIC8qIF9fR05VQ19fID49IDIgKi8KLSMgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCi0jIGVuZGlmIC8qICEgQkZEX0hPU1RfNjRCSVRfTE9ORyAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi0jaWZkZWYgQkZENjQKLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSAjZXJyb3IgTm8gNjQgYml0IGludGVnZXIgdHlwZSBhdmFpbGFibGUKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgYmZkX3NpZ25lZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF9zaXplX3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIHN5bXZhbHVlOwotCi0jaWZuZGVmIGZwcmludGZfdm1hCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KQotI2RlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KQotI2Vsc2UKLSNkZWZpbmUgX2JmZF9pbnQ2NF9sb3coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkKLSNkZWZpbmUgX2JmZF9pbnQ2NF9oaWdoKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgXAotICBmcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIFwKLSAgc3ByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBCRkQ2NCAgKi8KLQotLyogUmVwcmVzZW50IGEgdGFyZ2V0IGFkZHJlc3MuICBBbHNvIHVzZWQgYXMgYSBnZW5lcmljIHVuc2lnbmVkIHR5cGUKLSAgIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueSBhcml0aG1ldGljIHR5cGVzCi0gICB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3ZtYTsKLQotLyogQSBnZW5lcmljIHNpZ25lZCB0eXBlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueQotICAgYXJpdGhtZXRpYyB0eXBlcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gIENhbiBiZSBhc3N1bWVkIHRvIGJlIGNvbXBhdGlibGUKLSAgIHdpdGggYmZkX3ZtYSBpbiB0aGUgc2FtZSB3YXkgdGhhdCBzaWduZWQgYW5kIHVuc2lnbmVkIGludHMgYXJlIGNvbXBhdGlibGUKLSAgIChhcyBwYXJhbWV0ZXJzLCBpbiBhc3NpZ25tZW50LCBldGMpLiAgKi8KLXR5cGVkZWYgbG9uZyBiZmRfc2lnbmVkX3ZtYTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bXZhbHVlOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF9zaXplX3R5cGU7Ci0KLS8qIFByaW50IGEgYmZkX3ZtYSB4IG9uIHN0cmVhbSBzLiAgKi8KLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBmcHJpbnRmKHMsICIlMDhseCIsIHgpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZihzLCAiJTA4bHgiLCB4KQotCi0jZW5kaWYgLyogbm90IEJGRDY0ICAqLwotCi0jZGVmaW5lIHByaW50Zl92bWEoeCkgZnByaW50Zl92bWEoc3Rkb3V0LHgpCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZsYWd3b3JkOwkvKiAzMiBiaXRzIG9mIGZsYWdzICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYmZkX2J5dGU7Ci0MCi0vKiogRmlsZSBmb3JtYXRzICovCi0KLXR5cGVkZWYgZW51bSBiZmRfZm9ybWF0IHsKLQkgICAgICBiZmRfdW5rbm93biA9IDAsCS8qIGZpbGUgZm9ybWF0IGlzIHVua25vd24gKi8KLQkgICAgICBiZmRfb2JqZWN0LAkvKiBsaW5rZXIvYXNzZW1iZXIvY29tcGlsZXIgb3V0cHV0ICovCi0JICAgICAgYmZkX2FyY2hpdmUsCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLQkgICAgICBiZmRfY29yZSwJCS8qIGNvcmUgZHVtcCAqLwotCSAgICAgIGJmZF90eXBlX2VuZH0JLyogbWFya3MgdGhlIGVuZDsgZG9uJ3QgdXNlIGl0ISAqLwotICAgICAgICAgYmZkX2Zvcm1hdDsKLQotLyogVmFsdWVzIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBCRkQuICBUaGVzZSBhbHNvCi0gICBhcHBlYXIgaW4gdGhlIG9iamVjdF9mbGFncyBmaWVsZCBvZiB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUsIHdoZXJlCi0gICB0aGV5IGluZGljYXRlIHRoZSBzZXQgb2YgZmxhZ3MgdXNlZCBieSB0aGF0IGJhY2tlbmQgKG5vdCBhbGwgZmxhZ3MKLSAgIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cykgKEZJWE1FOiBhdCB0aGUgbW9tZW50LAotICAgdGhlIG9iamVjdF9mbGFncyB2YWx1ZXMgaGF2ZSBtb3N0bHkganVzdCBiZWVuIGNvcGllZCBmcm9tIGJhY2tlbmQKLSAgIHRvIGFub3RoZXIsIGFuZCBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QpLiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBCRkRfTk9fRkxBR1MgICAJMHgwMAotCi0vKiBCRkQgY29udGFpbnMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgSEFTX1JFTE9DICAgCTB4MDEKLQotLyogQkZEIGlzIGRpcmVjdGx5IGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBFWEVDX1AgICAgICAJMHgwMgotCi0vKiBCRkQgaGFzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MTk5PIGluIGEKLSAgIENPRkYgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MSU5FTk8gIAkweDA0Ci0KLS8qIEJGRCBoYXMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgSEFTX0RFQlVHICAgCTB4MDgKLQotLyogQkZEIGhhcyBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgSEFTX1NZTVMgICAgCTB4MTAKLQotLyogQkZEIGhhcyBsb2NhbCBzeW1ib2xzIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MU1lNUyBpbiBhIENPRkYKLSAgIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTE9DQUxTICAJMHgyMAotCi0vKiBCRkQgaXMgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIERZTkFNSUMgICAgIAkweDQwCi0KLS8qIFRleHQgc2VjdGlvbiBpcyB3cml0ZSBwcm90ZWN0ZWQgKGlmIERfUEFHRUQgaXMgbm90IHNldCwgdGhpcyBpcwotICAgbGlrZSBhbiBhLm91dCBOTUFHSUMgZmlsZSkgKHRoZSBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dAotICAgY2xlYXJzIGl0IGZvciAtciBvciAtTikuICAqLwotI2RlZmluZSBXUF9URVhUICAgICAJMHg4MAotCi0vKiBCRkQgaXMgZHluYW1pY2FsbHkgcGFnZWQgKHRoaXMgaXMgbGlrZSBhbiBhLm91dCBaTUFHSUMgZmlsZSkgKHRoZQotICAgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQgY2xlYXJzIGl0IGZvciAtciBvciAtbiBvciAtTikuICAqLwotI2RlZmluZSBEX1BBR0VEICAgICAJMHgxMDAKLQotLyogQkZEIGlzIHJlbGF4YWJsZSAodGhpcyBtZWFucyB0aGF0IGJmZF9yZWxheF9zZWN0aW9uIG1heSBiZSBhYmxlIHRvCi0gICBkbyBzb21ldGhpbmcpIChzb21ldGltZXMgYmZkX3JlbGF4X3NlY3Rpb24gY2FuIGRvIHNvbWV0aGluZyBldmVuIGlmCi0gICB0aGlzIGlzIG5vdCBzZXQpLiAgKi8KLSNkZWZpbmUgQkZEX0lTX1JFTEFYQUJMRSAweDIwMAotCi0vKiBUaGlzIG1heSBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgb3V0IGEgQkZEIHRvIHJlcXVlc3QgdXNpbmcgYQotICAgdHJhZGl0aW9uYWwgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCB0byByZXF1ZXN0IHRoYXQgd2hlbgotICAgd3JpdGluZyBvdXQgYW4gYS5vdXQgb2JqZWN0IHRoZSBzeW1ib2xzIG5vdCBiZSBoYXNoZWQgdG8gZWxpbWluYXRlCi0gICBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCAweDQwMAotCi0vKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIEJGRCBjb250ZW50cyBhcmUgYWN0dWFsbHkgY2FjaGVkIGluCi0gICBtZW1vcnkuICBJZiB0aGlzIGlzIHNldCwgaW9zdHJlYW0gcG9pbnRzIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotI2RlZmluZSBCRkRfSU5fTUVNT1JZIDB4ODAwCi0MCi0vKiBzeW1ib2xzIGFuZCByZWxvY2F0aW9uICovCi0KLS8qIEEgY291bnQgb2YgY2Fyc3ltcyAoY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scykuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWluZGV4OwotCi0vKiBIb3cgdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0IHJlbG9jX2hvd3RvX3R5cGU7Ci0KLSNkZWZpbmUgQkZEX05PX01PUkVfU1lNQk9MUyAoKHN5bWluZGV4KSB+MCkKLQotLyogR2VuZXJhbCBwdXJwb3NlIHBhcnQgb2YgYSBzeW1ib2wgWDsKLSAgIHRhcmdldCBzcGVjaWZpYyBwYXJ0cyBhcmUgaW4gbGliY29mZi5oLCBsaWJhb3V0LmgsIGV0Yy4gICovCi0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24pCi0jZGVmaW5lIGJmZF9nZXRfb3V0cHV0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbih4LHkpICgoeCktPnNlY3Rpb24pID0gKHkpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2Jhc2UoeCkgKCh4KS0+c2VjdGlvbi0+dm1hKQotI2RlZmluZSBiZmRfYXN5bWJvbF92YWx1ZSh4KSAoYmZkX2FzeW1ib2xfYmFzZSh4KSArICh4KS0+dmFsdWUpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX25hbWUoeCkgKCh4KS0+bmFtZSkKLS8qUGVyaGFwcyBmdXR1cmU6ICNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnNlY3Rpb24tPm93bmVyKSovCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT50aGVfYmZkKQotI2RlZmluZSBiZmRfYXN5bWJvbF9mbGF2b3VyKHgpIChiZmRfYXN5bWJvbF9iZmQoeCktPnh2ZWMtPmZsYXZvdXIpCi0KLS8qIEEgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9sLiAgKi8KLS8qIFRoaXMgaXMgYSB0eXBlIHB1biB3aXRoIHN0cnVjdCByYW5saWIgb24gcHVycG9zZSEgKi8KLXR5cGVkZWYgc3RydWN0IGNhcnN5bSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwkJLyogbG9vayBoZXJlIHRvIGZpbmQgdGhlIGZpbGUgKi8KLX0gY2Fyc3ltOwkJCS8qIHRvIG1ha2UgdGhlc2UgeW91IGNhbGwgYSBjYXJzeW1vZ2VuICovCi0KLSAgCi0vKiBVc2VkIGluIGdlbmVyYXRpbmcgYXJtYXBzIChhcmNoaXZlIHRhYmxlcyBvZiBjb250ZW50cykuCi0gICBQZXJoYXBzIGp1c3QgYSBmb3J3YXJkIGRlZmluaXRpb24gd291bGQgZG8/ICovCi1zdHJ1Y3Qgb3JsIHsJCQkvKiBvdXRwdXQgcmFubGliICovCi0gIGNoYXIgKipuYW1lOwkJCS8qIHN5bWJvbCBuYW1lICovIAotICBmaWxlX3B0ciBwb3M7CQkJLyogYmZkKiBvciBmaWxlIHBvc2l0aW9uICovCi0gIGludCBuYW1pZHg7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8KLX07Ci0MCi0KLS8qIExpbmVudW1iZXIgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSB7Ci0gIHVuc2lnbmVkIGludCBsaW5lX251bWJlcjsJLyogTGluZW51bWJlciBmcm9tIHN0YXJ0IG9mIGZ1bmN0aW9uKi8gIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltOyAvKiBGdW5jdGlvbiBuYW1lICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHNlY3Rpb24gKi8KLSAgfSB1OwotfSBhbGVudDsKLQwKLS8qIG9iamVjdCBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLSNkZWZpbmUJYWxpZ25fcG93ZXIoYWRkciwgYWxpZ24pCVwKLQkoICgoYWRkcikgKyAoKDE8PChhbGlnbikpLTEpKSAmICgtMSA8PCAoYWxpZ24pKSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VjICpzZWNfcHRyOwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyICsgMCkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lKQotI2RlZmluZSBiZmRfc2VjdGlvbl9zaXplKGJmZCwgcHRyKSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHB0cikpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2xtYShiZmQsIHB0cikgKChwdHIpLT5sbWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhiZmQsIHB0cikgKChwdHIpLT5mbGFncyArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0cikgKChwdHIpLT51c2VyZGF0YSkKLQotI2RlZmluZSBiZmRfaXNfY29tX3NlY3Rpb24ocHRyKSAoKChwdHIpLT5mbGFncyAmIFNFQ19JU19DT01NT04pICE9IDApCi0KLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3ZtYShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT52bWEgPSAocHRyKS0+bG1hPSAodmFsKSksICgocHRyKS0+dXNlcl9zZXRfdm1hID0gKGJvb2xlYW4pdHJ1ZSksIHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+YWxpZ25tZW50X3Bvd2VyID0gKHZhbCkpLHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT51c2VyZGF0YSA9ICh2YWwpKSx0cnVlKQotCi10eXBlZGVmIHN0cnVjdCBzdGF0IHN0YXRfdHlwZTsgCi0MCi10eXBlZGVmIGVudW0gYmZkX3ByaW50X3N5bWJvbAoteyAKLSAgYmZkX3ByaW50X3N5bWJvbF9uYW1lLAotICBiZmRfcHJpbnRfc3ltYm9sX21vcmUsCi0gIGJmZF9wcmludF9zeW1ib2xfYWxsCi19IGJmZF9wcmludF9zeW1ib2xfdHlwZTsKLSAgICAKLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sIHRoYXQgbm0gbmVlZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfc3ltYm9sX2luZm8KLXsKLSAgc3ltdmFsdWUgdmFsdWU7Ci0gIGNoYXIgdHlwZTsKLSAgQ09OU1QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhYl90eXBlOyAgICAgLyogU3RhYiB0eXBlLiAgKi8KLSAgY2hhciBzdGFiX290aGVyOyAgICAgICAgICAgICAvKiBTdGFiIG90aGVyLiAqLwotICBzaG9ydCBzdGFiX2Rlc2M7ICAgICAgICAgICAgIC8qIFN0YWIgZGVzYy4gICovCi0gIENPTlNUIGNoYXIgKnN0YWJfbmFtZTsgICAgICAgLyogU3RyaW5nIGZvciBzdGFiIHR5cGUuICAqLwotfSBzeW1ib2xfaW5mbzsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3RhYnMgdHlwZSBjb2RlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9nZXRfc3RhYl9uYW1lIFBBUkFNUyAoKGludCkpOwotDAotLyogSGFzaCB0YWJsZSByb3V0aW5lcy4gIFRoZXJlIGlzIG5vIHdheSB0byBmcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi0KLS8qIEFuIGVsZW1lbnQgaW4gdGhlIGhhc2ggdGFibGUuICBNb3N0IHVzZXMgd2lsbCBhY3R1YWxseSB1c2UgYSBsYXJnZXIKLSAgIHN0cnVjdHVyZSwgYW5kIGFuIGluc3RhbmNlIG9mIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIFN0cmluZyBiZWluZyBoYXNoZWQuICAqLwotICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gIC8qIEhhc2ggY29kZS4gIFRoaXMgaXMgdGhlIGZ1bGwgaGFzaCBjb2RlLCBub3QgdGhlIGluZGV4IGludG8gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotfTsKLQotLyogQSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqdGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZmlyc3QgZW50cnkgaXMgaXRzZWxmIGEgcG9pbnRlciB0byBhbiBlbGVtZW50LiAgV2hlbiB0aGlzCi0gICAgIGZ1bmN0aW9uIGlzIGZpcnN0IGludm9rZWQsIHRoaXMgcG9pbnRlciB3aWxsIGJlIE5VTEwuICBIb3dldmVyLAotICAgICBoYXZpbmcgdGhlIHBvaW50ZXIgcGVybWl0cyBhIGhpZXJhcmNoeSBvZiBtZXRob2QgZnVuY3Rpb25zIHRvIGJlCi0gICAgIGJ1aWx0IGVhY2ggb2Ygd2hpY2ggY2FsbHMgdGhlIGZ1bmN0aW9uIGluIHRoZSBzdXBlcmNsYXNzLiAgVGh1cwotICAgICBlYWNoIGZ1bmN0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIG9mIG1lbW9yeQotICAgICBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotICAgLyogQW4gb2JqYWxsb2MgZm9yIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaXMgYSBzdHJ1Y3Qgb2JqYWxsb2MgKiwKLSAgICAgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2Ygb2JqYWxsb2MuaC4gICovCi0gIFBUUiBtZW1vcnk7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgc3BlY2lmeWluZyBhIHNpemUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiksCi0JICAgdW5zaWduZWQgaW50IHNpemUpKTsKLQotLyogRnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdGFibGVfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikpOwotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIElmIENSRUFURSBpcyB0cnVlLCBhIG5ldyBlbnRyeQotICAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHN0cmluZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZQotICAgQ09QWSBhcmd1bWVudCBtdXN0IGJlIHRydWUgaWYgdGhpcyByb3V0aW5lIHNob3VsZCBjb3B5IHRoZSBzdHJpbmcKLSAgIGludG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSB3aGVuIGFkZGluZyBhbiBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3JlcGxhY2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbncpKTsKLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLQotLyogR3JhYiBzb21lIHNwYWNlIGZvciBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIFBUUiBiZmRfaGFzaF9hbGxvY2F0ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlIGluIGEgcmFuZG9tIG9yZGVyLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaAotICAgZWxlbWVudC4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdHJhdmVyc2FsIHN0b3BzLiAgVGhlCi0gICBJTkZPIGFyZ3VtZW50IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdHJhdmVyc2UgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICBQVFIpLAotCQkJCSAgICAgICBQVFIgaW5mbykpOwotDAotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQyBwcmVwcm9jZXNzb3JzLgotICAgVGhlIHByb2JsZW0gaXMsICIzMl8iIGlzIG5vdCBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4sIGFuZCB3ZSBkb24ndAotICAgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwgIm5sbV8zMl8iKS4gIFRoZSBYQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZQotICAgaW5uZXIgQ0FUIG1hY3JvcyB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuCi0gICBUaGVuIHRoZSBmaW5hbCBjb25jYXRlbmF0aW9uIGNhbiBiZSBkb25lLiAgKFNpZ2guKSAgKi8KLSNpZm5kZWYgQ0FUCi0jaWZkZWYgU0FCRVIKLSNkZWZpbmUgQ0FUKGEsYikJYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKQlhIyNiIyNjCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBDQVQoYSxiKSBhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEjI2IjI2MKLSNkZWZpbmUgWENBVDIoYSxiKQlDQVQoYSxiKQotI2RlZmluZSBDQVQ0KGEsYixjLGQpCVhDQVQyKENBVChhLGIpLENBVChjLGQpKQotI2Vsc2UKLSNkZWZpbmUgQ0FUKGEsYikgYS8qKi9iCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEvKiovYi8qKi9jCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYS8qKi9iLyoqL2MvKiovZAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfU1dBUF9UQUJMRSAoUFRSKSAmYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUKLQwKLS8qIFVzZXIgcHJvZ3JhbSBhY2Nlc3MgdG8gQkZEIGZhY2lsaXRpZXMgKi8KLQotLyogRGlyZWN0IEkvTyByb3V0aW5lcywgZm9yIHByb2dyYW1zIHdoaWNoIGtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0Ci0gICBmaWxlIHRoYW4gQkZEIGRvZXMuICBVc2UgaGlnaGVyIGxldmVsIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAgKi8KLQotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3JlYWQKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF93cml0ZQotICBQQVJBTVMgKChjb25zdCBQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc2VlayBQQVJBTVMgKChiZmQgKmFiZmQsIGZpbGVfcHRyIGZwLCBpbnQgZGlyZWN0aW9uKSk7Ci1leHRlcm4gbG9uZyBiZmRfdGVsbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc3RhdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICopKTsKLQotCi0vKiBDYXN0IGZyb20gY29uc3QgY2hhciAqIHRvIGNoYXIgKiBzbyB0aGF0IGNhbGxlciBjYW4gYXNzaWduIHRvCi0gICBhIGNoYXIgKiB3aXRob3V0IGEgd2FybmluZy4gICovCi0jZGVmaW5lIGJmZF9nZXRfZmlsZW5hbWUoYWJmZCkgKChjaGFyICopIChhYmZkKS0+ZmlsZW5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfY2FjaGVhYmxlKGFiZmQpICgoYWJmZCktPmNhY2hlYWJsZSkKLSNkZWZpbmUgYmZkX2dldF9mb3JtYXQoYWJmZCkgKChhYmZkKS0+Zm9ybWF0KQotI2RlZmluZSBiZmRfZ2V0X3RhcmdldChhYmZkKSAoKGFiZmQpLT54dmVjLT5uYW1lKQotI2RlZmluZSBiZmRfZ2V0X2ZsYXZvdXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+Zmxhdm91cikKLSNkZWZpbmUgYmZkX2JpZ19lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfbGl0dGxlX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9oZWFkZXJfYmlnX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT5mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5vYmplY3RfZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+c2VjdGlvbl9mbGFncykKLSNkZWZpbmUgYmZkX215X2FyY2hpdmUoYWJmZCkgKChhYmZkKS0+bXlfYXJjaGl2ZSkKLSNkZWZpbmUgYmZkX2hhc19tYXAoYWJmZCkgKChhYmZkKS0+aGFzX2FybWFwKQotCi0jZGVmaW5lIGJmZF92YWxpZF9yZWxvY190eXBlcyhhYmZkKSAoKGFiZmQpLT54dmVjLT52YWxpZF9yZWxvY190eXBlcykKLSNkZWZpbmUgYmZkX3VzcmRhdGEoYWJmZCkgKChhYmZkKS0+dXNyZGF0YSkKLQotI2RlZmluZSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCkgKChhYmZkKS0+c3RhcnRfYWRkcmVzcykKLSNkZWZpbmUgYmZkX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLSNkZWZpbmUgYmZkX2dldF9vdXRzeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIGJmZF9jb3VudF9zZWN0aW9ucyhhYmZkKSAoKGFiZmQpLT5zZWN0aW9uX2NvdW50KQotCi0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5zeW1ib2xfbGVhZGluZ19jaGFyKQotCi0jZGVmaW5lIGJmZF9zZXRfY2FjaGVhYmxlKGFiZmQsYm9vbCkgKCgoYWJmZCktPmNhY2hlYWJsZSA9IChib29sZWFuKShib29sKSksIHRydWUpCi0KLWV4dGVybiBib29sZWFuIGJmZF9yZWNvcmRfcGhkcgotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwgZmxhZ3dvcmQsIGJvb2xlYW4sIGJmZF92bWEsCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEJ5dGUgc3dhcHBpbmcgcm91dGluZXMuICAqLwotCi1iZmRfdm1hCQliZmRfZ2V0YjY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYSAJYmZkX2dldGw2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGw2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0MCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvOwotc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXA7Ci1zdHJ1Y3QgZWNvZmZfZXh0cjsKLXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7Ci1zdHJ1Y3QgYmZkX2xpbmtfaW5mbzsKLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Owotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlOwotI2VuZGlmCi1leHRlcm4gYmZkX3ZtYSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIGdwX3ZhbHVlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyBncHJtYXNrLCB1bnNpZ25lZCBsb25nIGZwcm1hc2ssCi0JICAgdW5zaWduZWQgbG9uZyAqY3BybWFzaykpOwotZXh0ZXJuIFBUUiBiZmRfZWNvZmZfZGVidWdfaW5pdAotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9lY29mZl9kZWJ1Z19mcmVlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlucHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsIGJmZCAqaW5wdXRfYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0JICAgYm9vbGVhbiAoKmdldF9leHRyKSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJCXN0cnVjdCBlY29mZl9leHRyICopLAotCSAgIHZvaWQgKCpzZXRfaW5kZXgpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkgICAgICBiZmRfc2l6ZV90eXBlKSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqZXN5bSkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX2Vjb2ZmX2RlYnVnX3NpemUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9kZWJ1ZwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZwotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiwgc3RydWN0IHNlYyAqLAotCSAgIGNoYXIgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVMRiByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdAotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5leHQ7Ci0gIGJmZCAqYnk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfZWxmX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZWxmX2dldF9kdF9zb25hbWUgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IHNlYyAqKikpOwotCi0vKiBMaW51eCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogbW1hcCBoYWNrcyAqLwotCi1zdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWw7Ci10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCBiZmRfd2luZG93X2ludGVybmFsOwotCi10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvdyB7Ci0gIC8qIFdoYXQgdGhlIHVzZXIgYXNrZWQgZm9yLiAgKi8KLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogVGhlIGFjdHVhbCB3aW5kb3cgdXNlZCBieSBCRkQuICBTbWFsbCB1c2VyLXJlcXVlc3RlZCByZWFkLW9ubHkKLSAgICAgcmVnaW9ucyBzaGFyaW5nIGEgcGFnZSBtYXkgc2hhcmUgYSBzaW5nbGUgd2luZG93IGludG8gdGhlIG9iamVjdAotICAgICBmaWxlLiAgUmVhZC13cml0ZSB2ZXJzaW9ucyBzaG91bGRuJ3QgdW50aWwgSSd2ZSBmaXhlZCB0aGluZ3MgdG8KLSAgICAga2VlcCB0cmFjayBvZiB3aGljaCBwb3J0aW9ucyBoYXZlIGJlZW4gY2xhaW1lZCBieSB0aGUKLSAgICAgYXBwbGljYXRpb247IGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGUgc2FtZSByZWdpb24gYmFjayB3aGVuIHRoZQotICAgICBhcHBsaWNhdGlvbiB3YW50cyB0d28gd3JpdGFibGUgY29waWVzISAgKi8KLSAgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsICppOwotfSBiZmRfd2luZG93OwotCi1leHRlcm4gdm9pZCBiZmRfaW5pdF93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZnJlZV93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZ2V0X2ZpbGVfd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgYmZkX3dpbmRvdyAqLCBib29sZWFuKSk7Ci0KLS8qIFhDT0ZGIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9leHBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sCi0JICAgaW50LCBib29sZWFuLCBib29sZWFuLCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50OwotdW5pb24gaW50ZXJuYWxfYXV4ZW50OwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9zeW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9hdXhlbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgaW50LCB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBFTEYgQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgZnJvbSB0aGUgc291cmNlLiAgKi8KZGlmZiAtLWdpdCBhL2JmZC9iZmQtaW4yLmggYi9iZmQvYmZkLWluMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2M5YjdlLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQtaW4yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTE0ICswLDAgQEAKLS8qIE1haW4gaGVhZGVyIGZpbGUgZm9yIHRoZSBiZmQgbGlicmFyeSAtLSBwb3J0YWJsZSBhY2Nlc3MgdG8gb2JqZWN0IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogYmZkLmggYW5kIGJmZC1pbjIuaCBhcmUgR0VORVJBVEVEIGZpbGVzLiAgRG9uJ3QgY2hhbmdlIHRoZW07Ci0qKiBpbnN0ZWFkLCBjaGFuZ2UgYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGVzZSBmaWxlcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBiZmQuaCAtLSBUaGUgb25seSBoZWFkZXIgZmlsZSByZXF1aXJlZCBieSB1c2VycyBvZiB0aGUgYmZkIGxpYnJhcnkgCi0KLVRoZSBiZmQuaCBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJmZC1pbi5oIGFuZCB2YXJpb3VzIC5jIGZpbGVzOyBpZiB5b3UKLWNoYW5nZSBpdCwgeW91ciBjaGFuZ2VzIHdpbGwgcHJvYmFibHkgYmUgbG9zdC4KLQotQWxsIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbW1lbnQgIlRIRSBGT0xMT1dJTkcKLUlTIEVYVFJBQ1RFRCBGUk9NIFRIRSBTT1VSQ0UiIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzIGZvcgotQkZELiAgSWYgeW91IGNoYW5nZSBpdCwgc29tZW9uZSBvbmVkYXkgd2lsbCBleHRyYWN0IGl0IGZyb20gdGhlIHNvdXJjZQotYWdhaW4sIGFuZCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiAgVG8gc2F2ZSB5b3Vyc2VsZiBmcm9tIHRoaXMgYmluZCwKLWNoYW5nZSB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgYmZkIGRpcmVjdG9yeS4gIFR5cGUgIm1ha2UKLWRvY3MiIGFuZCB0aGVuICJtYWtlIGhlYWRlcnMiIGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgbWFnaWNhbGx5IHRoaXMgZmlsZQotd2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGNoYW5nZXMuCi0KLUlmIHlvdSBkb24ndCBoYXZlIHRoZSB0b29scyB0byBwZXJmb3JtIHRoZSBleHRyYWN0aW9uLCB0aGVuIHlvdSBhcmUKLXNhZmUgZnJvbSBzb21lb25lIG9uIHlvdXIgc3lzdGVtIHRyYW1wbGluZyBvdmVyIHlvdXIgaGVhZGVyIGZpbGVzLgotWW91IHNob3VsZCBzdGlsbCBtYWludGFpbiB0aGUgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0aGlzCi1maWxlIHRob3VnaDsgZXZlcnkgY2hhbmdlIHlvdSBtYWtlIHRvIHRoZSAuYyBmaWxlIHNob3VsZCBiZSByZWZsZWN0ZWQKLWhlcmUuICAqLwotCi0jaWZuZGVmIF9fQkZEX0hfU0VFTl9fCi0jZGVmaW5lIF9fQkZEX0hfU0VFTl9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHR3byBsaW5lcyBnZXQgc3Vic3RpdHV0aW9ucyBkb25lIGJ5IGNvbW1hbmRzIGluIE1ha2VmaWxlLmluLiAgKi8KLSNkZWZpbmUgQkZEX1ZFUlNJT04gICJAVkVSU0lPTkAiCi0jZGVmaW5lIEJGRF9BUkNIX1NJWkUgQHdvcmRzaXplQAotI2RlZmluZSBCRkRfSE9TVF82NEJJVF9MT05HIEBCRkRfSE9TVF82NEJJVF9MT05HQAotI2lmIEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLSNkZWZpbmUgQkZEX0hPU1RfNjRfQklUIEBCRkRfSE9TVF82NF9CSVRACi0jZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIEBCRkRfSE9TVF9VXzY0X0JJVEAKLSNlbmRpZgotCi0jaWYgQkZEX0FSQ0hfU0laRSA+PSA2NAotI2RlZmluZSBCRkQ2NAotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgX19HTlVDX18gPj0gMgotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBfYmZkIGJmZDsKLQotLyogVG8gc3F1ZWxjaCBlcnJvbmVvdXMgY29tcGlsZXIgd2FybmluZ3MgKCJpbGxlZ2FsIHBvaW50ZXIKLSAgIGNvbWJpbmF0aW9uIikgZnJvbSB0aGUgU1ZSMyBjb21waWxlciwgd2Ugd291bGQgbGlrZSB0byB0eXBlZGVmCi0gICBib29sZWFuIHRvIGludCAoaXQgZG9lc24ndCBsaWtlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYm9vbGVhbi4KLSAgIE1ha2luZyBzdXJlIHRoZXkgYXJlIG5ldmVyIGltcGxpY2l0bHkgZGVjbGFyZWQgdG8gcmV0dXJuIGludAotICAgZG9lc24ndCBzZWVtIHRvIGhlbHApLiAgQnV0IHRoaXMgZmlsZSBpcyBub3QgY29uZmlndXJlZCBiYXNlZCBvbgotICAgdGhlIGhvc3QuICAqLwotLyogR2VuZXJhbCBydWxlczogZnVuY3Rpb25zIHdoaWNoIGFyZSBib29sZWFuIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKLSAgIGFuZCBmYWxzZSBvbiBmYWlsdXJlICh1bmxlc3MgdGhleSdyZSBhIHByZWRpY2F0ZSkuICAgLS0gYmZkLmRvYyAqLwotLyogSSdtIHN1cmUgdGhpcyBpcyBnb2luZyB0byBicmVhayBzb21ldGhpbmcgYW5kIHNvbWVvbmUgaXMgZ29pbmcgdG8KLSAgIGZvcmNlIG1lIHRvIGNoYW5nZSBpdC4gKi8KLS8qIHR5cGVkZWYgZW51bSBib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsgKi8KLS8qIFl1cCwgU1ZSNCBoYXMgYSAidHlwZWRlZiBlbnVtIGJvb2xlYW4iIGluIDxzeXMvdHlwZXMuaD4gIC1mbmYgKi8KLS8qIEl0IGdldHMgd29yc2UgaWYgdGhlIGhvc3QgYWxzbyBkZWZpbmVzIGEgdHJ1ZS9mYWxzZSBlbnVtLi4uIC1zdHMgKi8KLS8qIEFuZCBldmVuIHdvcnNlIGlmIHlvdXIgY29tcGlsZXIgaGFzIGJ1aWx0LWluIGJvb2xlYW4gdHlwZXMuLi4gLWxhdyAqLwotI2lmIGRlZmluZWQgKF9fR05VR19fKSAmJiAoX19HTlVDX01JTk9SX18gPiA1KQotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmCi0jaWZkZWYgTVBXCi0vKiBQcmUtZW1wdGl2ZSBzdHJpa2UgLSBnZXQgdGhlIGZpbGUgd2l0aCB0aGUgZW51bS4gKi8KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotI2lmbmRlZiBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsKLSNkZWZpbmUgQkZEX1RSVUVfRkFMU0UKLSNlbHNlCi0vKiBVc2UgZW51bSBuYW1lcyB0aGF0IHdpbGwgYXBwZWFyIG5vd2hlcmUgZWxzZS4gICovCi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2JmZF9mZmZhbHNlLCBiZmRfdHR0cnVlfSBib29sZWFuOwotI2VuZGlmCi0KLS8qIEEgcG9pbnRlciB0byBhIHBvc2l0aW9uIGluIGEgZmlsZS4gICovCi0vKiBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIHVzaW5nIG9mZl90IGZyb20gPHN5cy90eXBlcy5oPi4KLSAgIEZvciBub3csIHRyeSB0byBhdm9pZCBicmVha2luZyBzdHVmZiBieSBub3QgaW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gaGVyZS4KLSAgIFRoaXMgd2lsbCBicmVhayBvbiBzeXN0ZW1zIHdpdGggNjQtYml0IGZpbGUgb2Zmc2V0cyAoZS5nLiA0LjRCU0QpLgotICAgUHJvYmFibHkgdGhlIGJlc3QgbG9uZy10ZXJtIGFuc3dlciBpcyB0byBhdm9pZCB1c2luZyBmaWxlX3B0ciBBTkQgb2ZmX3QgCi0gICBpbiB0aGlzIGhlYWRlciBmaWxlLCBhbmQgdG8gaGFuZGxlIHRoaXMgaW4gdGhlIEJGRCBpbXBsZW1lbnRhdGlvbgotICAgcmF0aGVyIHRoYW4gaW4gaXRzIGludGVyZmFjZS4gICovCi0vKiB0eXBlZGVmIG9mZl90CWZpbGVfcHRyOyAqLwotdHlwZWRlZiBsb25nIGludCBmaWxlX3B0cjsKLQotLyogU3VwcG9ydCBmb3IgZGlmZmVyZW50IHNpemVzIG9mIHRhcmdldCBmb3JtYXQgaW50cyBhbmQgYWRkcmVzc2VzLgotICAgSWYgdGhlIHR5cGUgYGxvbmcnIGlzIGF0IGxlYXN0IDY0IGJpdHMsIEJGRF9IT1NUXzY0QklUX0xPTkcgd2lsbCBiZQotICAgc2V0IHRvIDEgYWJvdmUuICBPdGhlcndpc2UsIGlmIGdjYyBpcyBiZWluZyB1c2VkLCB0aGlzIGNvZGUgd2lsbAotICAgdXNlIGdjYydzICJsb25nIGxvbmciIHR5cGUuICBPdGhlcndpc2UsIEJGRF9IT1NUXzY0X0JJVCBtdXN0IGJlCi0gICBkZWZpbmVkIGFib3ZlLiAgKi8KLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSMgaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotIyAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nCi0jICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZwotIyBlbHNlCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGlmIF9fR05VQ19fID49IDIKLSMgICAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nIGxvbmcKLSMgICAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcgbG9uZwotIyAgIGVuZGlmIC8qIF9fR05VQ19fID49IDIgKi8KLSMgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCi0jIGVuZGlmIC8qICEgQkZEX0hPU1RfNjRCSVRfTE9ORyAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi0jaWZkZWYgQkZENjQKLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSAjZXJyb3IgTm8gNjQgYml0IGludGVnZXIgdHlwZSBhdmFpbGFibGUKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgYmZkX3NpZ25lZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF9zaXplX3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIHN5bXZhbHVlOwotCi0jaWZuZGVmIGZwcmludGZfdm1hCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KQotI2RlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KQotI2Vsc2UKLSNkZWZpbmUgX2JmZF9pbnQ2NF9sb3coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkKLSNkZWZpbmUgX2JmZF9pbnQ2NF9oaWdoKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgXAotICBmcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIFwKLSAgc3ByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBCRkQ2NCAgKi8KLQotLyogUmVwcmVzZW50IGEgdGFyZ2V0IGFkZHJlc3MuICBBbHNvIHVzZWQgYXMgYSBnZW5lcmljIHVuc2lnbmVkIHR5cGUKLSAgIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueSBhcml0aG1ldGljIHR5cGVzCi0gICB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3ZtYTsKLQotLyogQSBnZW5lcmljIHNpZ25lZCB0eXBlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueQotICAgYXJpdGhtZXRpYyB0eXBlcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gIENhbiBiZSBhc3N1bWVkIHRvIGJlIGNvbXBhdGlibGUKLSAgIHdpdGggYmZkX3ZtYSBpbiB0aGUgc2FtZSB3YXkgdGhhdCBzaWduZWQgYW5kIHVuc2lnbmVkIGludHMgYXJlIGNvbXBhdGlibGUKLSAgIChhcyBwYXJhbWV0ZXJzLCBpbiBhc3NpZ25tZW50LCBldGMpLiAgKi8KLXR5cGVkZWYgbG9uZyBiZmRfc2lnbmVkX3ZtYTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bXZhbHVlOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF9zaXplX3R5cGU7Ci0KLS8qIFByaW50IGEgYmZkX3ZtYSB4IG9uIHN0cmVhbSBzLiAgKi8KLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBmcHJpbnRmKHMsICIlMDhseCIsIHgpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZihzLCAiJTA4bHgiLCB4KQotCi0jZW5kaWYgLyogbm90IEJGRDY0ICAqLwotCi0jZGVmaW5lIHByaW50Zl92bWEoeCkgZnByaW50Zl92bWEoc3Rkb3V0LHgpCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZsYWd3b3JkOwkvKiAzMiBiaXRzIG9mIGZsYWdzICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYmZkX2J5dGU7Ci0MCi0vKiogRmlsZSBmb3JtYXRzICovCi0KLXR5cGVkZWYgZW51bSBiZmRfZm9ybWF0IHsKLQkgICAgICBiZmRfdW5rbm93biA9IDAsCS8qIGZpbGUgZm9ybWF0IGlzIHVua25vd24gKi8KLQkgICAgICBiZmRfb2JqZWN0LAkvKiBsaW5rZXIvYXNzZW1iZXIvY29tcGlsZXIgb3V0cHV0ICovCi0JICAgICAgYmZkX2FyY2hpdmUsCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLQkgICAgICBiZmRfY29yZSwJCS8qIGNvcmUgZHVtcCAqLwotCSAgICAgIGJmZF90eXBlX2VuZH0JLyogbWFya3MgdGhlIGVuZDsgZG9uJ3QgdXNlIGl0ISAqLwotICAgICAgICAgYmZkX2Zvcm1hdDsKLQotLyogVmFsdWVzIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBCRkQuICBUaGVzZSBhbHNvCi0gICBhcHBlYXIgaW4gdGhlIG9iamVjdF9mbGFncyBmaWVsZCBvZiB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUsIHdoZXJlCi0gICB0aGV5IGluZGljYXRlIHRoZSBzZXQgb2YgZmxhZ3MgdXNlZCBieSB0aGF0IGJhY2tlbmQgKG5vdCBhbGwgZmxhZ3MKLSAgIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cykgKEZJWE1FOiBhdCB0aGUgbW9tZW50LAotICAgdGhlIG9iamVjdF9mbGFncyB2YWx1ZXMgaGF2ZSBtb3N0bHkganVzdCBiZWVuIGNvcGllZCBmcm9tIGJhY2tlbmQKLSAgIHRvIGFub3RoZXIsIGFuZCBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QpLiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBCRkRfTk9fRkxBR1MgICAJMHgwMAotCi0vKiBCRkQgY29udGFpbnMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgSEFTX1JFTE9DICAgCTB4MDEKLQotLyogQkZEIGlzIGRpcmVjdGx5IGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBFWEVDX1AgICAgICAJMHgwMgotCi0vKiBCRkQgaGFzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MTk5PIGluIGEKLSAgIENPRkYgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MSU5FTk8gIAkweDA0Ci0KLS8qIEJGRCBoYXMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgSEFTX0RFQlVHICAgCTB4MDgKLQotLyogQkZEIGhhcyBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgSEFTX1NZTVMgICAgCTB4MTAKLQotLyogQkZEIGhhcyBsb2NhbCBzeW1ib2xzIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MU1lNUyBpbiBhIENPRkYKLSAgIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTE9DQUxTICAJMHgyMAotCi0vKiBCRkQgaXMgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIERZTkFNSUMgICAgIAkweDQwCi0KLS8qIFRleHQgc2VjdGlvbiBpcyB3cml0ZSBwcm90ZWN0ZWQgKGlmIERfUEFHRUQgaXMgbm90IHNldCwgdGhpcyBpcwotICAgbGlrZSBhbiBhLm91dCBOTUFHSUMgZmlsZSkgKHRoZSBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dAotICAgY2xlYXJzIGl0IGZvciAtciBvciAtTikuICAqLwotI2RlZmluZSBXUF9URVhUICAgICAJMHg4MAotCi0vKiBCRkQgaXMgZHluYW1pY2FsbHkgcGFnZWQgKHRoaXMgaXMgbGlrZSBhbiBhLm91dCBaTUFHSUMgZmlsZSkgKHRoZQotICAgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQgY2xlYXJzIGl0IGZvciAtciBvciAtbiBvciAtTikuICAqLwotI2RlZmluZSBEX1BBR0VEICAgICAJMHgxMDAKLQotLyogQkZEIGlzIHJlbGF4YWJsZSAodGhpcyBtZWFucyB0aGF0IGJmZF9yZWxheF9zZWN0aW9uIG1heSBiZSBhYmxlIHRvCi0gICBkbyBzb21ldGhpbmcpIChzb21ldGltZXMgYmZkX3JlbGF4X3NlY3Rpb24gY2FuIGRvIHNvbWV0aGluZyBldmVuIGlmCi0gICB0aGlzIGlzIG5vdCBzZXQpLiAgKi8KLSNkZWZpbmUgQkZEX0lTX1JFTEFYQUJMRSAweDIwMAotCi0vKiBUaGlzIG1heSBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgb3V0IGEgQkZEIHRvIHJlcXVlc3QgdXNpbmcgYQotICAgdHJhZGl0aW9uYWwgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCB0byByZXF1ZXN0IHRoYXQgd2hlbgotICAgd3JpdGluZyBvdXQgYW4gYS5vdXQgb2JqZWN0IHRoZSBzeW1ib2xzIG5vdCBiZSBoYXNoZWQgdG8gZWxpbWluYXRlCi0gICBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCAweDQwMAotCi0vKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIEJGRCBjb250ZW50cyBhcmUgYWN0dWFsbHkgY2FjaGVkIGluCi0gICBtZW1vcnkuICBJZiB0aGlzIGlzIHNldCwgaW9zdHJlYW0gcG9pbnRzIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotI2RlZmluZSBCRkRfSU5fTUVNT1JZIDB4ODAwCi0MCi0vKiBzeW1ib2xzIGFuZCByZWxvY2F0aW9uICovCi0KLS8qIEEgY291bnQgb2YgY2Fyc3ltcyAoY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scykuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWluZGV4OwotCi0vKiBIb3cgdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0IHJlbG9jX2hvd3RvX3R5cGU7Ci0KLSNkZWZpbmUgQkZEX05PX01PUkVfU1lNQk9MUyAoKHN5bWluZGV4KSB+MCkKLQotLyogR2VuZXJhbCBwdXJwb3NlIHBhcnQgb2YgYSBzeW1ib2wgWDsKLSAgIHRhcmdldCBzcGVjaWZpYyBwYXJ0cyBhcmUgaW4gbGliY29mZi5oLCBsaWJhb3V0LmgsIGV0Yy4gICovCi0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24pCi0jZGVmaW5lIGJmZF9nZXRfb3V0cHV0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbih4LHkpICgoeCktPnNlY3Rpb24pID0gKHkpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2Jhc2UoeCkgKCh4KS0+c2VjdGlvbi0+dm1hKQotI2RlZmluZSBiZmRfYXN5bWJvbF92YWx1ZSh4KSAoYmZkX2FzeW1ib2xfYmFzZSh4KSArICh4KS0+dmFsdWUpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX25hbWUoeCkgKCh4KS0+bmFtZSkKLS8qUGVyaGFwcyBmdXR1cmU6ICNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnNlY3Rpb24tPm93bmVyKSovCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT50aGVfYmZkKQotI2RlZmluZSBiZmRfYXN5bWJvbF9mbGF2b3VyKHgpIChiZmRfYXN5bWJvbF9iZmQoeCktPnh2ZWMtPmZsYXZvdXIpCi0KLS8qIEEgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9sLiAgKi8KLS8qIFRoaXMgaXMgYSB0eXBlIHB1biB3aXRoIHN0cnVjdCByYW5saWIgb24gcHVycG9zZSEgKi8KLXR5cGVkZWYgc3RydWN0IGNhcnN5bSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwkJLyogbG9vayBoZXJlIHRvIGZpbmQgdGhlIGZpbGUgKi8KLX0gY2Fyc3ltOwkJCS8qIHRvIG1ha2UgdGhlc2UgeW91IGNhbGwgYSBjYXJzeW1vZ2VuICovCi0KLSAgCi0vKiBVc2VkIGluIGdlbmVyYXRpbmcgYXJtYXBzIChhcmNoaXZlIHRhYmxlcyBvZiBjb250ZW50cykuCi0gICBQZXJoYXBzIGp1c3QgYSBmb3J3YXJkIGRlZmluaXRpb24gd291bGQgZG8/ICovCi1zdHJ1Y3Qgb3JsIHsJCQkvKiBvdXRwdXQgcmFubGliICovCi0gIGNoYXIgKipuYW1lOwkJCS8qIHN5bWJvbCBuYW1lICovIAotICBmaWxlX3B0ciBwb3M7CQkJLyogYmZkKiBvciBmaWxlIHBvc2l0aW9uICovCi0gIGludCBuYW1pZHg7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8KLX07Ci0MCi0KLS8qIExpbmVudW1iZXIgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSB7Ci0gIHVuc2lnbmVkIGludCBsaW5lX251bWJlcjsJLyogTGluZW51bWJlciBmcm9tIHN0YXJ0IG9mIGZ1bmN0aW9uKi8gIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltOyAvKiBGdW5jdGlvbiBuYW1lICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHNlY3Rpb24gKi8KLSAgfSB1OwotfSBhbGVudDsKLQwKLS8qIG9iamVjdCBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLSNkZWZpbmUJYWxpZ25fcG93ZXIoYWRkciwgYWxpZ24pCVwKLQkoICgoYWRkcikgKyAoKDE8PChhbGlnbikpLTEpKSAmICgtMSA8PCAoYWxpZ24pKSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VjICpzZWNfcHRyOwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyICsgMCkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lKQotI2RlZmluZSBiZmRfc2VjdGlvbl9zaXplKGJmZCwgcHRyKSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHB0cikpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2xtYShiZmQsIHB0cikgKChwdHIpLT5sbWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhiZmQsIHB0cikgKChwdHIpLT5mbGFncyArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0cikgKChwdHIpLT51c2VyZGF0YSkKLQotI2RlZmluZSBiZmRfaXNfY29tX3NlY3Rpb24ocHRyKSAoKChwdHIpLT5mbGFncyAmIFNFQ19JU19DT01NT04pICE9IDApCi0KLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3ZtYShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT52bWEgPSAocHRyKS0+bG1hPSAodmFsKSksICgocHRyKS0+dXNlcl9zZXRfdm1hID0gKGJvb2xlYW4pdHJ1ZSksIHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+YWxpZ25tZW50X3Bvd2VyID0gKHZhbCkpLHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT51c2VyZGF0YSA9ICh2YWwpKSx0cnVlKQotCi10eXBlZGVmIHN0cnVjdCBzdGF0IHN0YXRfdHlwZTsgCi0MCi10eXBlZGVmIGVudW0gYmZkX3ByaW50X3N5bWJvbAoteyAKLSAgYmZkX3ByaW50X3N5bWJvbF9uYW1lLAotICBiZmRfcHJpbnRfc3ltYm9sX21vcmUsCi0gIGJmZF9wcmludF9zeW1ib2xfYWxsCi19IGJmZF9wcmludF9zeW1ib2xfdHlwZTsKLSAgICAKLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sIHRoYXQgbm0gbmVlZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfc3ltYm9sX2luZm8KLXsKLSAgc3ltdmFsdWUgdmFsdWU7Ci0gIGNoYXIgdHlwZTsKLSAgQ09OU1QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhYl90eXBlOyAgICAgLyogU3RhYiB0eXBlLiAgKi8KLSAgY2hhciBzdGFiX290aGVyOyAgICAgICAgICAgICAvKiBTdGFiIG90aGVyLiAqLwotICBzaG9ydCBzdGFiX2Rlc2M7ICAgICAgICAgICAgIC8qIFN0YWIgZGVzYy4gICovCi0gIENPTlNUIGNoYXIgKnN0YWJfbmFtZTsgICAgICAgLyogU3RyaW5nIGZvciBzdGFiIHR5cGUuICAqLwotfSBzeW1ib2xfaW5mbzsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3RhYnMgdHlwZSBjb2RlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9nZXRfc3RhYl9uYW1lIFBBUkFNUyAoKGludCkpOwotDAotLyogSGFzaCB0YWJsZSByb3V0aW5lcy4gIFRoZXJlIGlzIG5vIHdheSB0byBmcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi0KLS8qIEFuIGVsZW1lbnQgaW4gdGhlIGhhc2ggdGFibGUuICBNb3N0IHVzZXMgd2lsbCBhY3R1YWxseSB1c2UgYSBsYXJnZXIKLSAgIHN0cnVjdHVyZSwgYW5kIGFuIGluc3RhbmNlIG9mIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIFN0cmluZyBiZWluZyBoYXNoZWQuICAqLwotICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gIC8qIEhhc2ggY29kZS4gIFRoaXMgaXMgdGhlIGZ1bGwgaGFzaCBjb2RlLCBub3QgdGhlIGluZGV4IGludG8gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotfTsKLQotLyogQSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqdGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZmlyc3QgZW50cnkgaXMgaXRzZWxmIGEgcG9pbnRlciB0byBhbiBlbGVtZW50LiAgV2hlbiB0aGlzCi0gICAgIGZ1bmN0aW9uIGlzIGZpcnN0IGludm9rZWQsIHRoaXMgcG9pbnRlciB3aWxsIGJlIE5VTEwuICBIb3dldmVyLAotICAgICBoYXZpbmcgdGhlIHBvaW50ZXIgcGVybWl0cyBhIGhpZXJhcmNoeSBvZiBtZXRob2QgZnVuY3Rpb25zIHRvIGJlCi0gICAgIGJ1aWx0IGVhY2ggb2Ygd2hpY2ggY2FsbHMgdGhlIGZ1bmN0aW9uIGluIHRoZSBzdXBlcmNsYXNzLiAgVGh1cwotICAgICBlYWNoIGZ1bmN0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIG9mIG1lbW9yeQotICAgICBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotICAgLyogQW4gb2JqYWxsb2MgZm9yIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaXMgYSBzdHJ1Y3Qgb2JqYWxsb2MgKiwKLSAgICAgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2Ygb2JqYWxsb2MuaC4gICovCi0gIFBUUiBtZW1vcnk7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgc3BlY2lmeWluZyBhIHNpemUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiksCi0JICAgdW5zaWduZWQgaW50IHNpemUpKTsKLQotLyogRnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdGFibGVfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikpOwotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIElmIENSRUFURSBpcyB0cnVlLCBhIG5ldyBlbnRyeQotICAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHN0cmluZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZQotICAgQ09QWSBhcmd1bWVudCBtdXN0IGJlIHRydWUgaWYgdGhpcyByb3V0aW5lIHNob3VsZCBjb3B5IHRoZSBzdHJpbmcKLSAgIGludG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSB3aGVuIGFkZGluZyBhbiBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3JlcGxhY2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbncpKTsKLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLQotLyogR3JhYiBzb21lIHNwYWNlIGZvciBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIFBUUiBiZmRfaGFzaF9hbGxvY2F0ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlIGluIGEgcmFuZG9tIG9yZGVyLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaAotICAgZWxlbWVudC4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdHJhdmVyc2FsIHN0b3BzLiAgVGhlCi0gICBJTkZPIGFyZ3VtZW50IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdHJhdmVyc2UgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICBQVFIpLAotCQkJCSAgICAgICBQVFIgaW5mbykpOwotDAotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQyBwcmVwcm9jZXNzb3JzLgotICAgVGhlIHByb2JsZW0gaXMsICIzMl8iIGlzIG5vdCBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4sIGFuZCB3ZSBkb24ndAotICAgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwgIm5sbV8zMl8iKS4gIFRoZSBYQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZQotICAgaW5uZXIgQ0FUIG1hY3JvcyB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuCi0gICBUaGVuIHRoZSBmaW5hbCBjb25jYXRlbmF0aW9uIGNhbiBiZSBkb25lLiAgKFNpZ2guKSAgKi8KLSNpZm5kZWYgQ0FUCi0jaWZkZWYgU0FCRVIKLSNkZWZpbmUgQ0FUKGEsYikJYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKQlhIyNiIyNjCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBDQVQoYSxiKSBhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEjI2IjI2MKLSNkZWZpbmUgWENBVDIoYSxiKQlDQVQoYSxiKQotI2RlZmluZSBDQVQ0KGEsYixjLGQpCVhDQVQyKENBVChhLGIpLENBVChjLGQpKQotI2Vsc2UKLSNkZWZpbmUgQ0FUKGEsYikgYS8qKi9iCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEvKiovYi8qKi9jCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYS8qKi9iLyoqL2MvKiovZAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfU1dBUF9UQUJMRSAoUFRSKSAmYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUKLQwKLS8qIFVzZXIgcHJvZ3JhbSBhY2Nlc3MgdG8gQkZEIGZhY2lsaXRpZXMgKi8KLQotLyogRGlyZWN0IEkvTyByb3V0aW5lcywgZm9yIHByb2dyYW1zIHdoaWNoIGtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0Ci0gICBmaWxlIHRoYW4gQkZEIGRvZXMuICBVc2UgaGlnaGVyIGxldmVsIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAgKi8KLQotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3JlYWQKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF93cml0ZQotICBQQVJBTVMgKChjb25zdCBQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc2VlayBQQVJBTVMgKChiZmQgKmFiZmQsIGZpbGVfcHRyIGZwLCBpbnQgZGlyZWN0aW9uKSk7Ci1leHRlcm4gbG9uZyBiZmRfdGVsbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc3RhdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICopKTsKLQotCi0vKiBDYXN0IGZyb20gY29uc3QgY2hhciAqIHRvIGNoYXIgKiBzbyB0aGF0IGNhbGxlciBjYW4gYXNzaWduIHRvCi0gICBhIGNoYXIgKiB3aXRob3V0IGEgd2FybmluZy4gICovCi0jZGVmaW5lIGJmZF9nZXRfZmlsZW5hbWUoYWJmZCkgKChjaGFyICopIChhYmZkKS0+ZmlsZW5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfY2FjaGVhYmxlKGFiZmQpICgoYWJmZCktPmNhY2hlYWJsZSkKLSNkZWZpbmUgYmZkX2dldF9mb3JtYXQoYWJmZCkgKChhYmZkKS0+Zm9ybWF0KQotI2RlZmluZSBiZmRfZ2V0X3RhcmdldChhYmZkKSAoKGFiZmQpLT54dmVjLT5uYW1lKQotI2RlZmluZSBiZmRfZ2V0X2ZsYXZvdXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+Zmxhdm91cikKLSNkZWZpbmUgYmZkX2JpZ19lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfbGl0dGxlX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9oZWFkZXJfYmlnX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT5mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5vYmplY3RfZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+c2VjdGlvbl9mbGFncykKLSNkZWZpbmUgYmZkX215X2FyY2hpdmUoYWJmZCkgKChhYmZkKS0+bXlfYXJjaGl2ZSkKLSNkZWZpbmUgYmZkX2hhc19tYXAoYWJmZCkgKChhYmZkKS0+aGFzX2FybWFwKQotCi0jZGVmaW5lIGJmZF92YWxpZF9yZWxvY190eXBlcyhhYmZkKSAoKGFiZmQpLT54dmVjLT52YWxpZF9yZWxvY190eXBlcykKLSNkZWZpbmUgYmZkX3VzcmRhdGEoYWJmZCkgKChhYmZkKS0+dXNyZGF0YSkKLQotI2RlZmluZSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCkgKChhYmZkKS0+c3RhcnRfYWRkcmVzcykKLSNkZWZpbmUgYmZkX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLSNkZWZpbmUgYmZkX2dldF9vdXRzeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIGJmZF9jb3VudF9zZWN0aW9ucyhhYmZkKSAoKGFiZmQpLT5zZWN0aW9uX2NvdW50KQotCi0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5zeW1ib2xfbGVhZGluZ19jaGFyKQotCi0jZGVmaW5lIGJmZF9zZXRfY2FjaGVhYmxlKGFiZmQsYm9vbCkgKCgoYWJmZCktPmNhY2hlYWJsZSA9IChib29sZWFuKShib29sKSksIHRydWUpCi0KLWV4dGVybiBib29sZWFuIGJmZF9yZWNvcmRfcGhkcgotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwgZmxhZ3dvcmQsIGJvb2xlYW4sIGJmZF92bWEsCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEJ5dGUgc3dhcHBpbmcgcm91dGluZXMuICAqLwotCi1iZmRfdm1hCQliZmRfZ2V0YjY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYSAJYmZkX2dldGw2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGw2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0MCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvOwotc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXA7Ci1zdHJ1Y3QgZWNvZmZfZXh0cjsKLXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7Ci1zdHJ1Y3QgYmZkX2xpbmtfaW5mbzsKLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Owotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlOwotI2VuZGlmCi1leHRlcm4gYmZkX3ZtYSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIGdwX3ZhbHVlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyBncHJtYXNrLCB1bnNpZ25lZCBsb25nIGZwcm1hc2ssCi0JICAgdW5zaWduZWQgbG9uZyAqY3BybWFzaykpOwotZXh0ZXJuIFBUUiBiZmRfZWNvZmZfZGVidWdfaW5pdAotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9lY29mZl9kZWJ1Z19mcmVlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlucHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsIGJmZCAqaW5wdXRfYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0JICAgYm9vbGVhbiAoKmdldF9leHRyKSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJCXN0cnVjdCBlY29mZl9leHRyICopLAotCSAgIHZvaWQgKCpzZXRfaW5kZXgpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkgICAgICBiZmRfc2l6ZV90eXBlKSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqZXN5bSkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX2Vjb2ZmX2RlYnVnX3NpemUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9kZWJ1ZwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZwotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiwgc3RydWN0IHNlYyAqLAotCSAgIGNoYXIgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVMRiByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdAotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5leHQ7Ci0gIGJmZCAqYnk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfZWxmX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZWxmX2dldF9kdF9zb25hbWUgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IHNlYyAqKikpOwotCi0vKiBMaW51eCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogbW1hcCBoYWNrcyAqLwotCi1zdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWw7Ci10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCBiZmRfd2luZG93X2ludGVybmFsOwotCi10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvdyB7Ci0gIC8qIFdoYXQgdGhlIHVzZXIgYXNrZWQgZm9yLiAgKi8KLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogVGhlIGFjdHVhbCB3aW5kb3cgdXNlZCBieSBCRkQuICBTbWFsbCB1c2VyLXJlcXVlc3RlZCByZWFkLW9ubHkKLSAgICAgcmVnaW9ucyBzaGFyaW5nIGEgcGFnZSBtYXkgc2hhcmUgYSBzaW5nbGUgd2luZG93IGludG8gdGhlIG9iamVjdAotICAgICBmaWxlLiAgUmVhZC13cml0ZSB2ZXJzaW9ucyBzaG91bGRuJ3QgdW50aWwgSSd2ZSBmaXhlZCB0aGluZ3MgdG8KLSAgICAga2VlcCB0cmFjayBvZiB3aGljaCBwb3J0aW9ucyBoYXZlIGJlZW4gY2xhaW1lZCBieSB0aGUKLSAgICAgYXBwbGljYXRpb247IGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGUgc2FtZSByZWdpb24gYmFjayB3aGVuIHRoZQotICAgICBhcHBsaWNhdGlvbiB3YW50cyB0d28gd3JpdGFibGUgY29waWVzISAgKi8KLSAgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsICppOwotfSBiZmRfd2luZG93OwotCi1leHRlcm4gdm9pZCBiZmRfaW5pdF93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZnJlZV93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZ2V0X2ZpbGVfd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgYmZkX3dpbmRvdyAqLCBib29sZWFuKSk7Ci0KLS8qIFhDT0ZGIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9leHBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sCi0JICAgaW50LCBib29sZWFuLCBib29sZWFuLCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50OwotdW5pb24gaW50ZXJuYWxfYXV4ZW50OwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9zeW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9hdXhlbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgaW50LCB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBFTEYgQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgZnJvbSB0aGUgc291cmNlLiAgKi8KLXZvaWQgCi1iZmRfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCkpOwotCi1iZmQgKgotYmZkX2Zkb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCwgaW50IGZkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnN0cmVhbXIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFBUUikpOwotCi1iZmQgKgotYmZkX29wZW53IFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZV9hbGxfZG9uZSBQQVJBTVMgKChiZmQgKikpOwotCi1iZmQgKgotYmZkX2NyZWF0ZSBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgYmZkICp0ZW1wbCkpOwotCi1ib29sZWFuIAotYmZkX21ha2Vfd3JpdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfbWFrZV9yZWFkYWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKi8KLQotI2RlZmluZSBiZmRfcHV0XzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICAoKHZvaWQpICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF84IFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOAotI2RlZmluZSBiZmRfZ2V0XzgoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgKCgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSBeIDB4ODApIC0gMHg4MCkKLQotI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgxNiwgKCh2YWwpLChwdHIpKSkKLSNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMTYgXAotICAgICAgICAgICAgICAgIGJmZF9wdXRfMTYKLSNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDE2LCAocHRyKSkKLSNkZWZpbmUgYmZkX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQgKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MzIsICgodmFsKSwocHRyKSkpCi0jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzMyIFwKLSAgICAgICAgICAgICAgICBiZmRfcHV0XzMyCi0jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgzMiwgKHB0cikpCi0jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzMyKGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4NjQsICgodmFsKSwgKHB0cikpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0gICAgICAgICAgICAgICAgYmZkX3B1dF82NAotI2RlZmluZSBiZmRfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4NjQsIChwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9nZXQoYml0cywgYWJmZCwgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX2dldF84IChhYmZkLCBwdHIpICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMTYgPyBiZmRfZ2V0XzE2IChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMzIgPyBiZmRfZ2V0XzMyIChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gNjQgPyBiZmRfZ2V0XzY0IChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksIChiZmRfdm1hKSAtIDEpKQotCi0jZGVmaW5lIGJmZF9wdXQoYml0cywgYWJmZCwgdmFsLCBwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMTYgPyBiZmRfcHV0XzE2IChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMzIgPyBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gNjQgPyBiZmRfcHV0XzY0IChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksICh2b2lkKSAwKSkKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIGZpbGUgaGVhZGVyIGRhdGEuICAqLwotCi0jZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgYmZkX2dldF84IChhYmZkLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKLQotI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzE2IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfMTYKLSNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDMyLCh2YWwscHRyKSkKLSNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0gICAgICAgICAgICAgICAgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MzIsKHB0cikpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9oX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgYmZkX2hfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYSBjb21kYXQgc2VjdGlvbiwgYXMgaW4gUEUuICBBIGNvbWRhdAotICAgIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBzeW1ib2wuICBXaGVuIHRoZSBsaW5rZXIKLSAgICBzZWVzIGEgY29tZGF0IHNlY3Rpb24sIGl0IGtlZXBzIG9ubHkgb25lIG9mIHRoZSBzZWN0aW9ucyB3aXRoIGEKLSAgICBnaXZlbiBuYW1lIGFuZCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBzeW1ib2wuICovCi0KLXN0cnVjdCBiZmRfY29tZGF0X2luZm8KLXsKLSAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgY29tZGF0IHNlY3Rpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAvKiBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEKLSAgICAgY29tZGF0IHNlY3Rpb24uICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICAgIHNwZWNpZmljIGNvZGU7IGl0IGlzIG5vdCBhbiBpbmRleCBpbnRvIHRoZSBsaXN0IHJldHVybmVkIGJ5Ci0gICAgIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLiAgKi8KLSAgbG9uZyBzeW1ib2w7Ci0KLSAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyBiZWluZyBkaXNjYXJkZWQsIHRoZSBsaW5rZXIgdXNlcyB0aGlzIGZpZWxkCi0gICAgIHRvIHBvaW50IHRvIHRoZSBpbnB1dCBzZWN0aW9uIHdoaWNoIGlzIGJlaW5nIGtlcHQuICAqLwotICBzdHJ1Y3Qgc2VjICpzZWM7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBzZWMKLXsKLSAgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uOyB0aGUgbmFtZSBpc24ndCBhIGNvcHksIHRoZSBwb2ludGVyIGlzCi0gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICovCi0KLSAgICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICAgICAvKiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKi8KLQotICAgaW50IGluZGV4OwotCi0gICAgICAgICAvKiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqLwotCi0gICAgc3RydWN0IHNlYyAqbmV4dDsKLQotICAgICAgICAgLyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKLSAgICAgICAgICAgZmxhZ3MgYXJlIHJlYWQgaW4gZnJvbSB0aGUgb2JqZWN0IGZpbGUsIGFuZCBzb21lIGFyZQotICAgICAgICAgICBzeW50aGVzaXplZCBmcm9tIG90aGVyIGluZm9ybWF0aW9uLiAgKi8KLQotICAgIGZsYWd3b3JkIGZsYWdzOwotCi0jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCi0KLSAgICAgICAgIC8qIFRlbGxzIHRoZSBPUyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzZWN0aW9uIHdoZW4gbG9hZGluZy4KLSAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgb25seS4gKi8KLSNkZWZpbmUgU0VDX0FMTE9DICAgICAgMHgwMDEKLQotICAgICAgICAgLyogVGVsbHMgdGhlIE9TIHRvIGxvYWQgdGhlIHNlY3Rpb24gZnJvbSB0aGUgZmlsZSB3aGVuIGxvYWRpbmcuCi0gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqLwotI2RlZmluZSBTRUNfTE9BRCAgICAgICAweDAwMgotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHN0aWxsIHRvIGJlIHJlbG9jYXRlZCwgc28gdGhlcmUgaXMKLSAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKi8KLSNkZWZpbmUgU0VDX1JFTE9DICAgICAgMHgwMDQKLQotI2lmIDAgICAgLyogT2Jzb2xldGUgPyAqLwotI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAotI2VuZGlmCi0KLSAgICAgICAgIC8qIEEgc2lnbmFsIHRvIHRoZSBPUyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHJlYWQgb25seQotICAgICAgICAgIGRhdGEuICovCi0jZGVmaW5lIFNFQ19SRUFET05MWSAgIDB4MDEwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvZGUgb25seS4gKi8KLSNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5LiAqLwotI2RlZmluZSBTRUNfREFUQSAgICAgICAweDA0MAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICovCi0jZGVmaW5lIFNFQ19ST00gICAgICAgIDB4MDgwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uLiBUaGlzIHNlY3Rpb24KLSAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKLSAgICAgICAgICAgZGVzdHJ1Y3RvcnMgdXNlZCBieSA8PGcrKz4+LiBXaGVuIGEgYmFjayBlbmQgc2VlcyBhIHN5bWJvbAotICAgICAgICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGxpc3QsIGl0IGNyZWF0ZXMgYSBuZXcKLSAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcwotICAgICAgICAgICB0aGUgc3ltYm9sIHRvIGl0LCBhbmQgYnVpbGRzIGEgcmVsb2NhdGlvbi4gVG8gYnVpbGQgdGhlIGxpc3RzCi0gICAgICAgICAgIG9mIGNvbnN0cnVjdG9ycywgYWxsIHRoZSBsaW5rZXIgaGFzIHRvIGRvIGlzIGNhdGVuYXRlIGFsbCB0aGUKLSAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQotICAgICAgICAgICBjb250YWluZWQgd2l0aGluIC0gZXhhY3RseSB0aGUgb3BlcmF0aW9ucyBpdCB3b3VsZCBwZWZvcm0gb24KLSAgICAgICAgICAgc3RhbmRhcmQgZGF0YS4gKi8KLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgY29uc3RydWN0b3IsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZQotICAgICAgICAgIGVuZCBvZiB0aGUgdGV4dCwgZGF0YSwgb3IgYnNzIHNlY3Rpb24oPykuICovCi0jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAotI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfREFUQSAweDIxMDAKLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0JTUyAgMHgzMTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0FMTE9DPj4gfCA8PFNFQ19IQVNfQ09OVEVOVFM+PjsgYSBkZWJ1ZyBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0hBU19DT05URU5UUz4+ICovCi0jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKLQotICAgICAgICAgLyogQW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGxpbmtlciB0byBub3Qgb3V0cHV0IHRoZSBzZWN0aW9uCi0gICAgICAgICAgIGV2ZW4gaWYgaXQgaGFzIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHdyaXR0ZW4uICovCi0jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgVGhpcyBmbGFnIGlzCi0gICAgICAgICAgIG9ubHkgZm9yIHRoZSBsaW5rZXIuICBJZiB0aGlzIHR5cGUgb2Ygc2VjdGlvbiBhcHBlYXJzIGluCi0gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgdm1hIG9yIHNpemUuICBGSVhNRTogQWx0aG91Z2ggdGhpcwotICAgICAgICAgICB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBiZSBnZW5lcmFsLCBpdCByZWFsbHkgaXMgQ09GRgotICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKLSAgICAgICAgICAgbWlnaHQgYmUgY2xlYW5lciB0byBoYXZlIHNvbWUgbW9yZSBnZW5lcmFsIG1lY2hhbmlzbSB0bwotICAgICAgICAgICBhbGxvdyB0aGUgYmFjayBlbmQgdG8gY29udHJvbCB3aGF0IHRoZSBsaW5rZXIgZG9lcyB3aXRoCi0gICAgICAgICAgIHNlY3Rpb25zLiAqLwotI2RlZmluZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSAweDgwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBjb21tb24gc3ltYm9scyAoc3ltYm9scyBtYXkgYmUgZGVmaW5lZAotICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKLSAgICAgICAgICAgc3BhY2UgaXQgcmVxdWlyZXMsIGFuZCB0aGUgbGFyZ2VzdCBzeW1ib2wgdmFsdWUgaXMgdGhlIG9uZQotICAgICAgICAgICB1c2VkKS4gIE1vc3QgdGFyZ2V0cyBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZXNlICh3aGljaCB3ZQotICAgICAgICAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqLwotI2RlZmluZSBTRUNfSVNfQ09NTU9OIDB4ODAwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBvbmx5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZvcgotICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCi0gICAgICAgICAgIHN0cmlwIHRlc3RzIHRoaXMgZmxhZyB0byBzZWUgaWYgYSBzZWN0aW9uIGNhbiBiZQotICAgICAgICAgICBkaXNjYXJkZWQuICovCi0jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAotCi0gICAgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSBoZWxkIGluIG1lbW9yeSBwb2ludGVkIHRvCi0gICAgICAgICAgIGJ5IHRoZSBjb250ZW50cyBmaWVsZC4gIFRoaXMgaXMgY2hlY2tlZCBieQotICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQotICAgICAgICAgICBtZW1vcnkgaWYgYXBwcm9wcmlhdGUuICAqLwotI2RlZmluZSBTRUNfSU5fTUVNT1JZIDB4MjAwMDAKLQotICAgICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCi0gICAgICAgICAgIGxpbmtlciBmb3IgZXhlY3V0YWJsZSBhbmQgc2hhcmVkIG9iamVjdHMgdW5sZXNzIHRob3NlCi0gICAgICAgICAgIG9iamVjdHMgYXJlIHRvIGJlIGZ1cnRoZXIgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAotCi0gICAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIHNvcnRlZCBieSB0aGUKLSAgICAgICAgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgc3ltYm9sCi0gICAgICAgICAgdGFibGUuICAqLwotI2RlZmluZSBTRUNfU09SVF9FTlRSSUVTIDB4ODAwMDAKLQotICAgICAgICAvKiBXaGVuIGxpbmtpbmcsIGR1cGxpY2F0ZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNob3VsZCBiZQotICAgICAgICAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCi0gICAgICAgICAgaXMgdXN1YWxseSBkb25lLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBjb21tb24gc3ltYm9scyBhcmUKLSAgICAgICAgICBoYW5kbGVkLiAgU2VlIFNFQ19MSU5LX0RVUExJQ0FURVMgYmVsb3cuICAqLwotI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCi0KLSAgICAgICAgLyogSWYgU0VDX0xJTktfT05DRSBpcyBzZXQsIHRoaXMgYml0ZmllbGQgZGVzY3JpYmVzIGhvdyB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgc2VjdGlvbnMuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IGR1cGxpY2F0ZQotICAgICAgICAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBzaG91bGQgc2ltcGx5IGJlIGRpc2NhcmRlZC4gKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMsIGFsdGhvdWdoCi0gICAgICAgICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkgMHgyMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotICAgICAgICAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSAweDQwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCi0gICAgICAgICAgcmVsb2NhdGlvbiBvciBvdGhlciBhcmNhbmUgcHJvY2Vzc2luZy4gIEl0IGlzIHNraXBwZWQgd2hlbgotICAgICAgICAgIGdvaW5nIHRocm91Z2ggdGhlIGZpcnN0LXBhc3Mgb3V0cHV0LCB0cnVzdGluZyB0aGF0IHNvbWVvbmUKLSAgICAgICAgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktFUl9DUkVBVEVEIDB4ODAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHNob3VsZCBub3QgYmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgInNob3J0IiBkYXRhLCBhbmQgc2hvdWxkIGJlIHBsYWNlZAotICAgICAgICAgICJuZWFyIiB0aGUgR1AuICAqLwotI2RlZmluZSBTRUNfU01BTExfREFUQSAweDIwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGF0YSB3aGljaCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKLSAgICAgICAgICBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cy4gICovCi0jZGVmaW5lIFNFQ19TSEFSRUQgMHg0MDAwMDAwCi0KLSAgICAgICAgLyogIEVuZCBvZiBzZWN0aW9uIGZsYWdzLiAgKi8KLQotICAgICAgICAvKiBTb21lIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICovCi0KLSAgICAgICAgLyogU2VlIHRoZSB2bWEgZmllbGQuICAqLwotICAgICAgIHVuc2lnbmVkIGludCB1c2VyX3NldF92bWEgOiAxOwotCi0gICAgICAgIC8qIFdoZXRoZXIgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gICovCi0gICAgICAgdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBvZiB0aGUgbGlua2VyIGJhY2tlbmRzLiAgKi8KLSAgICAgICB1bnNpZ25lZCBpbnQgbGlua2VyX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgICAgdW5zaWduZWQgaW50IGdjX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEVuZCBvZiBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqLwotCi0gICAgICAgIC8qICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLSAgICAgICAgICAgYXQgcnVuIHRpbWUuICBUaGUgc3ltYm9scyBhcmUgcmVsb2NhdGVkIGFnYWluc3QgdGhpcy4gIFRoZQotICAgICAgICAgICB1c2VyX3NldF92bWEgZmxhZyBpcyBtYWludGFpbmVkIGJ5IGJmZDsgaWYgaXQncyBub3Qgc2V0LCB0aGUKLSAgICAgICAgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLSAgICAgICAgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgPDwuZGF0YT4+IGlzIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMKLSAgICAgICAgICAgdGFyZ2V0IGFuZCB2YXJpb3VzIGZsYWdzKS4gICovCi0KLSAgIGJmZF92bWEgdm1hOwotCi0gICAgICAgIC8qICBUaGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIC0gd2hlcmUgaXQgd291bGQgYmUgaW4gYQotICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLSAgICAgICAgICAgaW5mb3JtYXRpb24uICovCi0KLSAgIGJmZF92bWEgbG1hOwotCi0gICAgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBpbiBieXRlcywgYXMgaXQgd2lsbCBiZSBvdXRwdXQuCi0gICAgICAgICAgIGNvbnRhaW5zIGEgdmFsdWUgZXZlbiBpZiB0aGUgc2VjdGlvbiBoYXMgbm8gY29udGVudHMgKGUuZy4sIHRoZQotICAgICAgICAgICBzaXplIG9mIDw8LmJzcz4+KS4gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiBhZnRlciByZWxvY2F0aW9uICovCi0KLSAgIGJmZF9zaXplX3R5cGUgX2Nvb2tlZF9zaXplOwotCi0gICAgICAgICAvKiBUaGUgb3JpZ2luYWwgc2l6ZSBvbiBkaXNrIG9mIHRoZSBzZWN0aW9uLCBpbiBieXRlcy4gIE5vcm1hbGx5IHRoaXMKLSAgICAgICAgICAgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUsIGJ1dCBpZiBzb21lIHJlbGF4aW5nIGhhcwotICAgICAgICAgICBiZWVuIGRvbmUsIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGJpZ2dlci4gICovCi0KLSAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotCi0gICAgICAgICAvKiBJZiB0aGlzIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgb3V0cHV0LCB0aGVuIHRoaXMgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgc2VjdGlvbi4gRS5nLiwgaWYgdGhpcyB3YXMgZ29pbmcgdG8gc3RhcnQgYXQgdGhlIDEwMHRoIGJ5dGUgaW4KLSAgICAgICAgICAgdGhlIG91dHB1dCBzZWN0aW9uLCB0aGlzIHZhbHVlIHdvdWxkIGJlIDEwMC4gKi8KLQotICAgYmZkX3ZtYSBvdXRwdXRfb2Zmc2V0OwotCi0gICAgICAgICAvKiBUaGUgb3V0cHV0IHNlY3Rpb24gdGhyb3VnaCB3aGljaCB0byBtYXAgb24gb3V0cHV0LiAqLwotCi0gICBzdHJ1Y3Qgc2VjICpvdXRwdXRfc2VjdGlvbjsKLQotICAgICAgICAgLyogVGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUgc2VjdGlvbiwgYXMgYW4gZXhwb25lbnQgb2YgMiAtCi0gICAgICAgICAgIGUuZy4sIDMgYWxpZ25zIHRvIDJeMyAob3IgOCkuICovCi0KLSAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci0KLSAgICAgICAgIC8qIElmIGFuIGlucHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiByZWxvY2F0aW9uCi0gICAgICAgICAgIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKi8KLQotICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICpyZWxvY2F0aW9uOwotCi0gICAgICAgICAvKiBJZiBhbiBvdXRwdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvCi0gICAgICAgICAgIHJlbG9jYXRpb24gcmVjb3JkcyBmb3IgdGhlIGRhdGEgaW4gdGhpcyBzZWN0aW9uLiAqLwotCi0gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKipvcmVsb2NhdGlvbjsKLQotICAgICAgICAgLyogVGhlIG51bWJlciBvZiByZWxvY2F0aW9uIHJlY29yZHMgaW4gb25lIG9mIHRoZSBhYm92ZSAgKi8KLQotICAgdW5zaWduZWQgcmVsb2NfY291bnQ7Ci0KLSAgICAgICAgIC8qIEluZm9ybWF0aW9uIGJlbG93IGlzIGJhY2sgZW5kIHNwZWNpZmljIC0gYW5kIG5vdCBhbHdheXMgdXNlZAotICAgICAgICAgICBvciB1cGRhdGVkLiAgKi8KLQotICAgICAgICAgLyogRmlsZSBwb3NpdGlvbiBvZiBzZWN0aW9uIGRhdGEgICAgKi8KLQotICAgZmlsZV9wdHIgZmlsZXBvczsKLQotICAgICAgICAgLyogRmlsZSBwb3NpdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gKi8KLQotICAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0KLSAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2YgbGluZSBkYXRhICAgICAgICovCi0KLSAgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLQotICAgICAgICAgLyogUG9pbnRlciB0byBkYXRhIGZvciBhcHBsaWNhdGlvbnMgKi8KLQotICAgUFRSIHVzZXJkYXRhOwotCi0gICAgICAgICAvKiBJZiB0aGUgU0VDX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhpcyBwb2ludHMgdG8gdGhlIGFjdHVhbAotICAgICAgICAgICBjb250ZW50cy4gICovCi0gICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLQotICAgICAgICAgLyogQXR0YWNoZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKi8KLQotICAgYWxlbnQgKmxpbmVubzsKLQotICAgICAgICAgLyogTnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgICAqLwotCi0gICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotCi0gICAgICAgICAvKiBPcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIENPTURBVCBlbnRyeTsgTlVMTCBpZiBub3QgQ09NREFUICovCi0KLSAgIHN0cnVjdCBiZmRfY29tZGF0X2luZm8gKmNvbWRhdDsKLQotICAgICAgICAgLyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotICAgICAgICAgICBsaW5lbnVtYmVycyBhcmUgd3JpdHRlbiBvdXQgKi8KLQotICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLQotICAgICAgICAgLyogV2hhdCB0aGUgc2VjdGlvbiBudW1iZXIgaXMgaW4gdGhlIHRhcmdldCB3b3JsZCAgKi8KLQotICAgaW50IHRhcmdldF9pbmRleDsKLQotICAgUFRSIHVzZWRfYnlfYmZkOwotCi0gICAgICAgICAvKiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotICAgICAgICAgICByZWxvY2F0aW9ucyBjcmVhdGVkIHRvIHJlbG9jYXRlIGl0ZW1zIHdpdGhpbiBpdC4gKi8KLQotICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICAgICAgIC8qIFRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc2VjdGlvbi4gKi8KLQotICAgYmZkICpvd25lcjsKLQotICAgICAgICAgLyogQSBzeW1ib2wgd2hpY2ggcG9pbnRzIGF0IHRoaXMgc2VjdGlvbiBvbmx5ICovCi0gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0KLSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcl9oZWFkOwotICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci19IGFzZWN0aW9uIDsKLQotICAgICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2xvYmFsLCBhbmQgYXJlIG1hbmFnZWQgYnkgQkZELiAgVGhlIGFwcGxpY2F0aW9uCi0gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotICAgICAgIHRoZXNlIHNlY3Rpb25zLiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgc2VjdGlvbl9wdHIgbWFjcm9zIHJhdGhlcgotICAgICAgIHRoYW4gcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBjb25zdCBzZWN0aW9ucy4gIFRoZSBjb25zdCBzZWN0aW9ucwotICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICovCi0jZGVmaW5lIEJGRF9BQlNfU0VDVElPTl9OQU1FICIqQUJTKiIKLSNkZWZpbmUgQkZEX1VORF9TRUNUSU9OX05BTUUgIipVTkQqIgotI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0jZGVmaW5lIEJGRF9JTkRfU0VDVElPTl9OQU1FICIqSU5EKiIKLQotICAgICAvKiB0aGUgYWJzb2x1dGUgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2Fic19zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfYWJzX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc19hYnNfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotICAgICAvKiBQb2ludGVyIHRvIHRoZSB1bmRlZmluZWQgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX3VuZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfdW5kX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc191bmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotICAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2NvbV9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfY29tX3NlY3Rpb24pCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IHNlY3Rpb24gKi8KLWV4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfaW5kX3NlY3Rpb247Ci0jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotI2RlZmluZSBiZmRfaXNfaW5kX3NlY3Rpb24oc2VjKSAoKHNlYykgPT0gYmZkX2luZF9zZWN0aW9uX3B0cikKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX2NvbV9zeW1ib2w7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF91bmRfc3ltYm9sOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKHNlY3Rpb24tPnJlbG9jX2RvbmUgPyAoYWJvcnQoKSwxKTogKHNlY3Rpb24pLT5fcmF3X3NpemUpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKChzZWN0aW9uLT5yZWxvY19kb25lKSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplOiAoYWJvcnQoKSwxKSkKLWFzZWN0aW9uICoKLWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X3NlY3Rpb25fZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBmbGFnd29yZCBmbGFncykpOwotCi12b2lkIAotYmZkX21hcF9vdmVyX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICB2b2lkICgqZnVuYykoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0LAotICAgIFBUUiBvYmopLAotICAgIFBUUiBvYmopKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3NpemVfdHlwZSB2YWwpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICBQVFIgZGF0YSwKLSAgICBmaWxlX3B0ciBvZmZzZXQsCi0gICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotCi1ib29sZWFuIAotYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLAotICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYykpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSkKLXZvaWQgCi1fYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLSBQQVJBTVMgKChhc2VjdGlvbiAqc2VjdGlvbikpOwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi17Ci0gIGJmZF9hcmNoX3Vua25vd24sICAgIC8qIEZpbGUgYXJjaCBub3Qga25vd24gKi8KLSAgYmZkX2FyY2hfb2JzY3VyZSwgICAgLyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqLwotICBiZmRfYXJjaF9tNjhrLCAgICAgICAvKiBNb3Rvcm9sYSA2OHh4eCAqLwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgotI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAotI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQotI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNwotI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAotICBiZmRfYXJjaF92YXgsICAgICAgICAvKiBERUMgVmF4ICovICAgCi0gIGJmZF9hcmNoX2k5NjAsICAgICAgIC8qIEludGVsIDk2MCAqLwotICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCi0gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0gICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCi0gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLSAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAotICAgICAgICJjb3JlIi4gKi8KLQotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4ICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKLQotICBiZmRfYXJjaF9hMjlrLCAgICAgICAvKiBBTUQgMjkwMDAgKi8KLSAgYmZkX2FyY2hfc3BhcmMsICAgICAgLyogU1BBUkMgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmMgICAgICAgICAgICAgICAgIDEKLSAvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0ICAgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSAgICAgICAzCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAgICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgICAgICAgICA1ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSAgICA2Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5ICAgICAgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YSAgICAgICAgICAgICA4ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0gLyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCi0gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0gIGJmZF9hcmNoX21pcHMsICAgICAgIC8qIE1JUFMgUnh4eHggKi8KLSNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAgICAgICAgICAgICAgIDMwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAgICAgICAgICAgICAgIDM5MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAgICAgICAgICAgICAgIDQwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAgICAgICAgICAgICAgIDQwMTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAgICAgICAgICAgICAgIDQxMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEgICAgICAgICAgICAgIDQxMTEKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAgICAgICAgICAgICAgIDQzMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAgICAgICAgICAgICAgIDQ0MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAgICAgICAgICAgICAgIDQ2MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAgICAgICAgICAgICAgIDQ2NTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAgICAgICAgICAgICAgIDUwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAgICAgICAgICAgICAgIDYwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwICAgICAgICAgICAgIDEwMDAwCi0jZGVmaW5lIGJmZF9tYWNoX21pcHMxNiAgICAgICAgICAgICAgICAxNgotICBiZmRfYXJjaF9pMzg2LCAgICAgICAvKiBJbnRlbCAzODYgKi8KLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCi0jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgotICBiZmRfYXJjaF93ZTMyaywgICAgICAvKiBBVCZUIFdFMzJ4eHggKi8KLSAgYmZkX2FyY2hfdGFob2UsICAgICAgLyogQ0NJL0hhcnJpcyBUYWhvZSAqLwotICBiZmRfYXJjaF9pODYwLCAgICAgICAvKiBJbnRlbCA4NjAgKi8KLSAgYmZkX2FyY2hfcm9tcCwgICAgICAgLyogSUJNIFJPTVAgUEMvUlQgKi8KLSAgYmZkX2FyY2hfYWxsaWFudCwgICAgLyogQWxsaWFudCAqLwotICBiZmRfYXJjaF9jb252ZXgsICAgICAvKiBDb252ZXggKi8KLSAgYmZkX2FyY2hfbTg4aywgICAgICAgLyogTW90b3JvbGEgODh4eHggKi8KLSAgYmZkX2FyY2hfcHlyYW1pZCwgICAgLyogUHlyYW1pZCBUZWNobm9sb2d5ICovCi0gIGJmZF9hcmNoX2g4MzAwLCAgICAgIC8qIEhpdGFjaGkgSDgvMzAwICovCi0jZGVmaW5lIGJmZF9tYWNoX2g4MzAwICAgMQotI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKLSNkZWZpbmUgYmZkX21hY2hfaDgzMDBzICAzCi0gIGJmZF9hcmNoX3Bvd2VycGMsICAgIC8qIFBvd2VyUEMgKi8KLSAgYmZkX2FyY2hfcnM2MDAwLCAgICAgLyogSUJNIFJTLzYwMDAgKi8KLSAgYmZkX2FyY2hfaHBwYSwgICAgICAgLyogSFAgUEEgUklTQyAqLwotICBiZmRfYXJjaF9kMTB2LCAgICAgICAvKiBNaXRzdWJpc2hpIEQxMFYgKi8KLSNkZWZpbmUgYmZkX21hY2hfZDEwdiAgICAgICAgICAwCi0jZGVmaW5lIGJmZF9tYWNoX2QxMHZfdHMyICAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9kMTB2X3RzMyAgICAgIDMKLSAgYmZkX2FyY2hfZDMwdiwgICAgICAgLyogTWl0c3ViaXNoaSBEMzBWICovCi0gIGJmZF9hcmNoX3o4aywgICAgICAgIC8qIFppbG9nIFo4MDAwICovCi0jZGVmaW5lIGJmZF9tYWNoX3o4MDAxICAgICAgICAgMQotI2RlZmluZSBiZmRfbWFjaF96ODAwMiAgICAgICAgIDIKLSAgYmZkX2FyY2hfaDg1MDAsICAgICAgLyogSGl0YWNoaSBIOC81MDAgKi8KLSAgYmZkX2FyY2hfc2gsICAgICAgICAgLyogSGl0YWNoaSBTSCAqLwotI2RlZmluZSBiZmRfbWFjaF9zaCAgICAgICAgICAgIDAKLSNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCi0jZGVmaW5lIGJmZF9tYWNoX3NoM2UgICAgICAgMHgzZQotICBiZmRfYXJjaF9hbHBoYSwgICAgICAvKiBEZWMgQWxwaGEgKi8KLSNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCi0jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKLSAgYmZkX2FyY2hfYXJtLCAgICAgICAgLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJtXzIgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2FybV8yYSAgICAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9hcm1fMyAgICAgICAgIDMKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzNNICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV80ICAgICAgICAgNQotI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgICAgICAgIDYKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzUgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV81VCAgICAgICAgOAotICBiZmRfYXJjaF9uczMyaywgICAgICAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICovCi0gIGJmZF9hcmNoX3c2NSwgICAgICAgIC8qIFdEQyA2NTgxNiAqLwotICBiZmRfYXJjaF90aWMzMCwgICAgICAvKiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKi8KLSAgYmZkX2FyY2hfdGljODAsICAgICAgLyogVEkgVE1TMzIwYzgwIChNVlApICovCi0gIGJmZF9hcmNoX3Y4NTAsICAgICAgIC8qIE5FQyBWODUwICovCi0jZGVmaW5lIGJmZF9tYWNoX3Y4NTAgICAgICAgICAgMAotI2RlZmluZSBiZmRfbWFjaF92ODUwZSAgICAgICAgICdFJwotI2RlZmluZSBiZmRfbWFjaF92ODUwZWEgICAgICAgICdBJwotICBiZmRfYXJjaF9hcmMsICAgICAgICAvKiBBcmdvbmF1dCBSSVNDIENvcmUgKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJjX2Jhc2UgMAotICBiZmRfYXJjaF9tMzJyLCAgICAgICAvKiBNaXRzdWJpc2hpIE0zMlIvRCAqLwotI2RlZmluZSBiZmRfbWFjaF9tMzJyICAgICAgICAgIDAgIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIGJmZF9tYWNoX20zMnJ4ICAgICAgICAgJ3gnCi0gIGJmZF9hcmNoX21uMTAyMDAsICAgIC8qIE1hdHN1c2hpdGEgTU4xMDIwMCAqLwotICBiZmRfYXJjaF9tbjEwMzAwLCAgICAvKiBNYXRzdXNoaXRhIE1OMTAzMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfbW4xMDMwMCAgICAgICAgICAgICAgIDMwMAotI2RlZmluZSBiZmRfbWFjaF9hbTMzICAgICAgICAgICAgICAgMzMwCi0gIGJmZF9hcmNoX2ZyMzAsCi0jZGVmaW5lIGJmZF9tYWNoX2ZyMzAgICAgICAgICAgMHg0NjUyMzMzMAotICBiZmRfYXJjaF9tY29yZSwKLSAgYmZkX2FyY2hfcGosCi0gIGJmZF9hcmNoX2xhc3QKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLXsKLSAgaW50IGJpdHNfcGVyX3dvcmQ7Ci0gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotICBpbnQgYml0c19wZXJfYnl0ZTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgY29uc3QgY2hhciAqYXJjaF9uYW1lOwotICBjb25zdCBjaGFyICpwcmludGFibGVfbmFtZTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0gIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICovCi0gIGJvb2xlYW4gdGhlX2RlZmF1bHQ7IAotICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqICgqY29tcGF0aWJsZSkKLSAgICAgICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYikpOwotCi0gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLQotICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqbmV4dDsKLX0gYmZkX2FyY2hfaW5mb190eXBlOwotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX25hbWUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfc2Nhbl9hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1jb25zdCBjaGFyICoqCi1iZmRfYXJjaF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9hcmNoX2dldF9jb21wYXRpYmxlIFBBUkFNUyAoKAotICAgIGNvbnN0IGJmZCAqYWJmZCwKLSAgICBjb25zdCBiZmQgKmJiZmQpKTsKLQotdm9pZCAKLWJmZF9zZXRfYXJjaF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmcpKTsKLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlIAotYmZkX2dldF9hcmNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBsb25nIAotYmZkX2dldF9tYWNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9iaXRzX3Blcl9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiAKLWJmZF9nZXRfYXJjaF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2xvb2t1cF9hcmNoCi0gUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi0gICAgYXJjaCwKLSAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX2FyY2hfbWFjaAotIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotdHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMKLXsKLSAgICAgICAgLyogTm8gZXJyb3JzIGRldGVjdGVkICovCi0gIGJmZF9yZWxvY19vaywKLQotICAgICAgICAvKiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgdGhlcmUgd2FzIGFuIG92ZXJmbG93LiAqLwotICBiZmRfcmVsb2Nfb3ZlcmZsb3csCi0KLSAgICAgICAgLyogVGhlIGFkZHJlc3MgdG8gcmVsb2NhdGUgd2FzIG5vdCB3aXRoaW4gdGhlIHNlY3Rpb24gc3VwcGxpZWQuICovCi0gIGJmZF9yZWxvY19vdXRvZnJhbmdlLAotCi0gICAgICAgIC8qIFVzZWQgYnkgc3BlY2lhbCBmdW5jdGlvbnMgKi8KLSAgYmZkX3JlbG9jX2NvbnRpbnVlLAotCi0gICAgICAgIC8qIFVuc3VwcG9ydGVkIHJlbG9jYXRpb24gc2l6ZSByZXF1ZXN0ZWQuICovCi0gIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQsCi0KLSAgICAgICAgLyogVW51c2VkICovCi0gIGJmZF9yZWxvY19vdGhlciwKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIHRvIHJlbG9jYXRlIGFnYWluc3Qgd2FzIHVuZGVmaW5lZC4gKi8KLSAgYmZkX3JlbG9jX3VuZGVmaW5lZCwKLQotICAgICAgICAvKiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgbWF5IG5vdCBiZSBvayAtIHByZXNlbnRseQotICAgICAgICAgIGdlbmVyYXRlZCBvbmx5IHdoZW4gbGlua2luZyBpOTYwIGNvZmYgZmlsZXMgd2l0aCBpOTYwIGIub3V0Ci0gICAgICAgICAgc3ltYm9scy4gIElmIHRoaXMgdHlwZSBpcyByZXR1cm5lZCwgdGhlIGVycm9yX21lc3NhZ2UgYXJndW1lbnQKLSAgICAgICAgICB0byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHdpbGwgYmUgc2V0LiAgKi8KLSAgYmZkX3JlbG9jX2Rhbmdlcm91cwotIH0KLSBiZmRfcmVsb2Nfc3RhdHVzX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkKLXsKLSAgICAgICAgLyogQSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCB0YWJsZSBvZiBwb2ludGVycyAgKi8KLSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bV9wdHJfcHRyOwotCi0gICAgICAgIC8qIG9mZnNldCBpbiBzZWN0aW9uICovCi0gIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKLQotICAgICAgICAvKiBhZGRlbmQgZm9yIHJlbG9jYXRpb24gdmFsdWUgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgICAgLyogUG9pbnRlciB0byBob3cgdG8gcGVyZm9ybSB0aGUgcmVxdWlyZWQgcmVsb2NhdGlvbiAqLwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotfSBhcmVsZW50OwotZW51bSBjb21wbGFpbl9vdmVyZmxvdwotewotICAgICAgICAvKiBEbyBub3QgY29tcGxhaW4gb24gb3ZlcmZsb3cuICovCi0gIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0KLSAgICAgICAgLyogQ29tcGxhaW4gaWYgdGhlIGJpdGZpZWxkIG92ZXJmbG93cywgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkCi0gICAgICAgICAgYXMgc2lnbmVkIG9yIHVuc2lnbmVkLiAqLwotICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBzaWduZWQKLSAgICAgICAgICBudW1iZXIuICovCi0gIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBhbgotICAgICAgICAgIHVuc2lnbmVkIG51bWJlci4gKi8KLSAgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQKLX07Ci0KLXN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLXsKLSAgICAgICAgLyogIFRoZSB0eXBlIGZpZWxkIGhhcyBtYWlubHkgYSBkb2N1bWVudGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCi0gICAgICAgICAgIGRvIHdoYXQgaXQgd2FudHMgd2l0aCBpdCwgdGhvdWdoIG5vcm1hbGx5IHRoZSBiYWNrIGVuZCdzCi0gICAgICAgICAgIGV4dGVybmFsIGlkZWEgb2Ygd2hhdCBhIHJlbG9jIG51bWJlciBpcyBzdG9yZWQKLSAgICAgICAgICAgaW4gdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgUEMgcmVsYXRpdmUgd29yZCByZWxvY2F0aW9uCi0gICAgICAgICAgIGluIGEgY29mZiBlbnZpcm9ubWVudCBoYXMgdGhlIHR5cGUgMDIzIC0gYmVjYXVzZSB0aGF0J3MKLSAgICAgICAgICAgd2hhdCB0aGUgb3V0c2lkZSB3b3JsZCBjYWxscyBhIFJfUENSV09SRCByZWxvYy4gKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgICAgICAgLyogIFRoZSB2YWx1ZSB0aGUgZmluYWwgcmVsb2NhdGlvbiBpcyBzaGlmdGVkIHJpZ2h0IGJ5LiBUaGlzIGRyb3BzCi0gICAgICAgICAgIHVud2FudGVkIGRhdGEgZnJvbSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotCi0gICAgICAgIC8qICBUaGUgc2l6ZSBvZiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzICpub3QqIGEKLSAgICAgICAgICAgcG93ZXItb2YtdHdvIG1lYXN1cmUuICBUbyBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZAotICAgICAgICAgICBvbiBieSBhIHR5cGUgb2YgcmVsb2NhdGlvbiwgdXNlIGJmZF9nZXRfcmVsb2Nfc2l6ZS4gICovCi0gIGludCBzaXplOwotCi0gICAgICAgIC8qICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyB1c2VkCi0gICAgICAgICAgIHdoZW4gZG9pbmcgb3ZlcmZsb3cgY2hlY2tpbmcuICAqLwotICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQotICAgICAgICAvKiAgTm90ZXMgdGhhdCB0aGUgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlCi0gICAgICAgICAgIGRhdGEgc2VjdGlvbiBvZiB0aGUgYWRkZW5kLiBUaGUgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aWxsCi0gICAgICAgICAgIHN1YnRyYWN0IGZyb20gdGhlIHJlbG9jYXRpb24gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uCi0gICAgICAgICAgIGJlaW5nIHJlbG9jYXRlZC4gKi8KLSAgYm9vbGVhbiBwY19yZWxhdGl2ZTsKLQotICAgICAgICAvKiAgVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgcmVsb2MgdmFsdWUgaW4gdGhlIGRlc3RpbmF0aW9uLgotICAgICAgICAgICBUaGUgcmVsb2NhdGVkIHZhbHVlIGlzIGxlZnQgc2hpZnRlZCBieSB0aGlzIGFtb3VudC4gKi8KLSAgdW5zaWduZWQgaW50IGJpdHBvczsKLQotICAgICAgICAvKiBXaGF0IHR5cGUgb2Ygb3ZlcmZsb3cgZXJyb3Igc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHdoZW4KLSAgICAgICAgICByZWxvY2F0aW5nLiAqLwotICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGNvbXBsYWluX29uX292ZXJmbG93OwotCi0gICAgICAgIC8qIElmIHRoaXMgZmllbGQgaXMgbm9uIG51bGwsIHRoZW4gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGlzCi0gICAgICAgICAgY2FsbGVkIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHJlYWxseQotICAgICAgICAgIHN0cmFuZ2UgcmVsb2NhdGlvbiBtZXRob2RzIHRvIGJlIGFjY29tb2RhdGVkIChlLmcuLCBpOTYwIGNhbGxqCi0gICAgICAgICAgaW5zdHJ1Y3Rpb25zKS4gKi8KLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlICgqc3BlY2lhbF9mdW5jdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotICAgICAgICAvKiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgLyogV2hlbiBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rLCBzb21lIGZvcm1hdHMgbXVzdCBtb2RpZnkgdGhlCi0gICAgICAgICAgcmVsb2NhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRhdGEgLSB0aGlzIGZsYWcgc2lnbmFscyB0aGlzLiovCi0gIGJvb2xlYW4gcGFydGlhbF9pbnBsYWNlOwotCi0gICAgICAgIC8qIFRoZSBzcmNfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSByZWFkIGluIGRhdGEKLSAgICAgICAgICBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbiBzdW0uICBFLmcuLCBpZiB0aGlzIHdhcyBhbiA4IGJpdAotICAgICAgICAgIGJpdCBvZiBkYXRhIHdoaWNoIHdlIHJlYWQgYW5kIHJlbG9jYXRlZCwgdGhpcyB3b3VsZCBiZQotICAgICAgICAgIDB4MDAwMDAwZmYuIFdoZW4gd2UgaGF2ZSByZWxvY3Mgd2hpY2ggaGF2ZSBhbiBhZGRlbmQsIHN1Y2ggYXMKLSAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCi0gICAgICAgICAgcmVsb2NhdGluZyBmaWVsZCBpcyBnYXJiYWdlIHNvIHdlIG5ldmVyIHVzZSBpdC4gSW4gdGhpcyBjYXNlCi0gICAgICAgICAgdGhlIG1hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gKi8KLSAgYmZkX3ZtYSBzcmNfbWFzazsKLQotICAgICAgICAvKiBUaGUgZHN0X21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHJlcGxhY2VkCi0gICAgICAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24uIEluIG1vc3QgY2FzZXMgc3JjX21hc2sgPT0gZHN0X21hc2ssCi0gICAgICAgICAgZXhjZXB0IGluIHRoZSBhYm92ZSBzcGVjaWFsIGNhc2UsIHdoZXJlIGRzdF9tYXNrIHdvdWxkIGJlCi0gICAgICAgICAgMHgwMDAwMDBmZiwgYW5kIHNyY19tYXNrIHdvdWxkIGJlIDB4MDAwMDAwMDAuICAgKi8KLSAgYmZkX3ZtYSBkc3RfbWFzazsKLQotICAgICAgICAvKiBXaGVuIHNvbWUgZm9ybWF0cyBjcmVhdGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zLCB0aGV5IGxlYXZlCi0gICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwYyBvZiB0aGUgcGxhY2UgYmVpbmcgcmVsb2NhdGVkIGluIHRoZSBvZmZzZXQKLSAgICAgICAgICBzbG90IG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gdGhhdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gY2FuCi0gICAgICAgICAgYmUgbWFkZSBqdXN0IGJ5IGFkZGluZyBpbiBhbiBvcmRpbmFyeSBvZmZzZXQgKGUuZy4sIHN1bjMgYS5vdXQpLgotICAgICAgICAgIFNvbWUgZm9ybWF0cyBsZWF2ZSB0aGUgZGlzcGxhY2VtZW50IHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgICAgICAgICBlbXB0eSAoZS5nLiwgbTg4ayBiY3MpOyB0aGlzIGZsYWcgc2lnbmFscyB0aGUgZmFjdC4qLwotICBib29sZWFuIHBjcmVsX29mZnNldDsKLQotfTsKLSNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBPLCBTRiwgTkFNRSwgSU5QTEFDRSwgTUFTS1NSQywgTUFTS0RTVCwgUEMpIFwKLSAgeyh1bnNpZ25lZClDLFIsUyxCLCBQLCBCSSwgTyxTRixOQU1FLElOUExBQ0UsTUFTS1NSQyxNQVNLRFNULFBDfQotI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCxGVU5DVElPTiwgTkFNRSxmYWxzZSwwLDAsSU4pCi0KLSNkZWZpbmUgRU1QVFlfSE9XVE8oQykgXAotICBIT1dUTygoQyksMCwwLDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LE5VTEwsTlVMTCxmYWxzZSwwLDAsZmFsc2UpCi0KLSNkZWZpbmUgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2wpICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChzeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKSB7ICAgICAgICAgICAgIFwKLSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSB7IFwKLSAgICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOyAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLXVuc2lnbmVkIGludCAKLWJmZF9nZXRfcmVsb2Nfc2l6ZSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0KLXR5cGVkZWYgc3RydWN0IHJlbGVudF9jaGFpbiB7Ci0gIGFyZWxlbnQgcmVsZW50OwotICBzdHJ1Y3QgICByZWxlbnRfY2hhaW4gKm5leHQ7Ci19IGFyZWxlbnRfY2hhaW47Ci1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX2NoZWNrX292ZXJmbG93Ci0gUEFSQU1TICgoZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3csCi0gICAgdW5zaWduZWQgaW50IGJpdHNpemUsCi0gICAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQsCi0gICAgdW5zaWduZWQgaW50IGFkZHJzaXplLAotICAgIGJmZF92bWEgcmVsb2NhdGlvbikpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICBQVFIgZGF0YSwKLSAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi0KLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgUFRSIGRhdGEsIGJmZF92bWEgZGF0YV9zdGFydCwKLSAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1lbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgewotICBfZHVtbXlfZmlyc3RfYmZkX3JlbG9jX2NvZGVfcmVhbCwKLQotCi0vKiBCYXNpYyBhYnNvbHV0ZSByZWxvY2F0aW9ucyBvZiBOIGJpdHMuICovCi0gIEJGRF9SRUxPQ182NCwKLSAgQkZEX1JFTE9DXzMyLAotICBCRkRfUkVMT0NfMjYsCi0gIEJGRF9SRUxPQ18yNCwKLSAgQkZEX1JFTE9DXzE2LAotICBCRkRfUkVMT0NfMTQsCi0gIEJGRF9SRUxPQ184LAotCi0vKiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuICovCi0gIEJGRF9SRUxPQ182NF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzMyX1BDUkVMLAotICBCRkRfUkVMT0NfMjRfUENSRUwsCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DXzEyX1BDUkVMLAotICBCRkRfUkVMT0NfOF9QQ1JFTCwKLQotLyogRm9yIEVMRi4gKi8KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMLAotICBCRkRfUkVMT0NfMzJfR09UT0ZGLAotICBCRkRfUkVMT0NfMTZfR09UT0ZGLAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYsCi0gIEJGRF9SRUxPQ184X0dPVE9GRiwKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfMzJfUExUT0ZGLAotICBCRkRfUkVMT0NfMTZfUExUT0ZGLAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYsCi0gIEJGRF9SRUxPQ184X1BMVE9GRiwKLQotLyogUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLiAqLwotICBCRkRfUkVMT0NfNjhLX0dMT0JfREFULAotICBCRkRfUkVMT0NfNjhLX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFLAotCi0vKiBMaW5rYWdlLXRhYmxlIHJlbGF0aXZlLiAqLwotICBCRkRfUkVMT0NfMzJfQkFTRVJFTCwKLSAgQkZEX1JFTE9DXzE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCwKLSAgQkZEX1JFTE9DXzhfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX1JWQSwKLQotLyogQWJzb2x1dGUgOC1iaXQgcmVsb2NhdGlvbiwgYnV0IHVzZWQgdG8gZm9ybSBhbiBhZGRyZXNzIGxpa2UgMHhGRm5uLiAqLwotICBCRkRfUkVMT0NfOF9GRm5uLAotCi0vKiBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4gKi8KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIsCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMiwKLQotLyogSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4gKi8KLSAgQkZEX1JFTE9DX0hJMjIsCi0gIEJGRF9SRUxPQ19MTzEwLAotCi0vKiBGb3Igc3lzdGVtcyB0aGF0IGFsbG9jYXRlIGEgR2xvYmFsIFBvaW50ZXIgcmVnaXN0ZXIsIHRoZXNlIGFyZQotZGlzcGxhY2VtZW50cyBvZmYgdGhhdCByZWdpc3Rlci4gIFRoZXNlIHJlbG9jYXRpb24gdHlwZXMgYXJlCi1oYW5kbGVkIHNwZWNpYWxseSwgYmVjYXVzZSB0aGUgdmFsdWUgdGhlIHJlZ2lzdGVyIHdpbGwgaGF2ZSBpcwotZGVjaWRlZCByZWxhdGl2ZWx5IGxhdGUuICovCi0gIEJGRF9SRUxPQ19HUFJFTDE2LAotICBCRkRfUkVMT0NfR1BSRUwzMiwKLQotLyogUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4gKi8KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEosCi0KLS8qIFNQQVJDIEVMRiByZWxvY2F0aW9ucy4gIFRoZXJlIGlzIHByb2JhYmx5IHNvbWUgb3ZlcmxhcCB3aXRoIG90aGVyCi1yZWxvY2F0aW9uIHR5cGVzIGFscmVhZHkgZGVmaW5lZC4gKi8KLSAgQkZEX1JFTE9DX05PTkUsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLAotICBCRkRfUkVMT0NfU1BBUkMyMiwKLSAgQkZEX1JFTE9DX1NQQVJDMTMsCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLAotICBCRkRfUkVMT0NfU1BBUkNfR09UMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzEwLAotICBCRkRfUkVMT0NfU1BBUkNfUEMyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0NPUFksCi0gIEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19TUEFSQ19VQTMyLAotCi0vKiBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLiAqLwotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLAotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyLAotCi0vKiBTUEFSQzY0IHJlbG9jYXRpb25zICovCi0jZGVmaW5lIEJGRF9SRUxPQ19TUEFSQ182NCBCRkRfUkVMT0NfNjQKLSAgQkZEX1JFTE9DX1NQQVJDXzEwLAotICBCRkRfUkVMT0NfU1BBUkNfMTEsCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwLAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5LAotICBCRkRfUkVMT0NfU1BBUkNfNywKLSAgQkZEX1JFTE9DX1NQQVJDXzYsCi0gIEJGRF9SRUxPQ19TUEFSQ181LAotI2RlZmluZSBCRkRfUkVMT0NfU1BBUkNfRElTUDY0IEJGRF9SRUxPQ182NF9QQ1JFTAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQsCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwLAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0LAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0LAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0LAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIsCi0KLS8qIFNQQVJDIGxpdHRsZSBlbmRpYW4gcmVsb2NhdGlvbiAqLwotICBCRkRfUkVMT0NfU1BBUkNfUkVWMzIsCi0KLS8qIEFscGhhIEVDT0ZGIGFuZCBFTEYgcmVsb2NhdGlvbnMuICBTb21lIG9mIHRoZXNlIHRyZWF0IHRoZSBzeW1ib2wgb3IKLSJhZGRlbmQiIGluIHNvbWUgc3BlY2lhbCB3YXkuCi1Gb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLXdyaXRpbmc7IHdoZW4gcmVhZGluZywgaXQgd2lsbCBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICBUaGUKLWFkZGVuZCBpcyB0aGUgZGlzcGxhY2VtZW50IGluIGJ5dGVzIG9mIHRoZSAibGRhIiBpbnN0cnVjdGlvbiBmcm9tCi10aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2LAotCi0vKiBGb3IgR1BESVNQX0xPMTYgKCJpZ25vcmUiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBoYW5kbGVkIGFzCi13aXRoIEdQRElTUF9ISTE2IHJlbG9jcy4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcgdGhlCi1yZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi1yZWFkaW5nLCBmb3IgY29udmVuaWVuY2UuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNiwKLQotLyogVGhlIEVMRiBHUERJU1AgcmVsb2NhdGlvbiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBHUERJU1BfSEkxNgotcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLXJlbG9jYXRpb24uICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1AsCi0KLS8qIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLXRoZSBhc3NlbWJsZXIgdHVybnMgaXQgaW50byBhIExEUSBpbnN0cnVjdGlvbiB0byBsb2FkIHRoZSBhZGRyZXNzIG9mCi10aGUgc3ltYm9sLCBhbmQgdGhlbiBmaWxscyBpbiBhIHJlZ2lzdGVyIGluIHRoZSByZWFsIGluc3RydWN0aW9uLgotCi1UaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotc2VjdGlvbiBzeW1ib2wuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nLCBidXQgaXMgZmlsbGVkCi1pbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24gcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLCBhcyB3aXRoIHRoZQotR1BESVNQX0xPMTYgcmVsb2MuCi0KLVRoZSBFTEZfTElURVJBTCByZWxvYyBpcyBzb21ld2hlcmUgYmV0d2VlbiAxNl9HT1RPRkYgYW5kIEdQRElTUF9MTzE2LgotSXQgc2hvdWxkIHJlZmVyIHRvIHRoZSBzeW1ib2wgdG8gYmUgcmVmZXJlbmNlZCwgYXMgd2l0aCAxNl9HT1RPRkYsCi1idXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotc2VjdGlvbiwgYnV0IHJlbGF0aXZlIHRvIHRoZSBHUCB2YWx1ZSBjaG9zZW4gZm9yIHRoZSBmaWxlIGR1cmluZyB0aGUKLWZpbmFsIGxpbmsgc3RhZ2UuCi0KLVRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi1pbmZvcm1hdGlvbiB0byB0aGUgbGlua2VyIHRoYXQgaXQgbWlnaHQgYmUgYWJsZSB0byB1c2UgdG8gb3B0aW1pemUKLWF3YXkgc29tZSBsaXRlcmFsIHNlY3Rpb24gcmVmZXJlbmNlcy4gIFRoZSBzeW1ib2wgaXMgaWdub3JlZCAocmVhZAotYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLW9mIGluc3RydWN0aW9uIHVzaW5nIHRoZSByZWdpc3RlcjoKLTEgLSAibWVtb3J5IiBmbXQgaW5zbgotMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0zIC0ganNyICh0YXJnZXQgb2YgYnJhbmNoKQotCi1UaGUgR05VIGxpbmtlciBjdXJyZW50bHkgZG9lc24ndCBkbyBhbnkgb2YgdGhpcyBvcHRpbWl6aW5nLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTCwKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFLAotCi0vKiBUaGUgQkZEX1JFTE9DX0FMUEhBX1VTRVJfKiByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHRvCi1wcm9jZXNzIHRoZSBleHBsaWNpdCAhPHJlbG9jPiFzZXF1ZW5jZSByZWxvY2F0aW9ucywgYW5kIGFyZSBtYXBwZWQKLWludG8gdGhlIG5vcm1hbCByZWxvY2F0aW9ucyBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSCwKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1csCi0KLS8qIFRoZSBISU5UIHJlbG9jYXRpb24gaW5kaWNhdGVzIGEgdmFsdWUgdGhhdCBzaG91bGQgYmUgZmlsbGVkIGludG8gdGhlCi0iaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLXByZWRpY3Rpb24gbG9naWMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIG9uIHNvbWUgcHJvY2Vzc29ycy4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCi0KLS8qIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi13aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UsCi0KLS8qIFRoZSBDT0RFQUREUiByZWxvY2F0aW9uIG91dHB1dHMgYSBTVE9fQ0EgaW4gdGhlIG9iamVjdCBmaWxlLAotd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiwKLQotLyogQml0cyAyNy4uMiBvZiB0aGUgcmVsb2NhdGlvbiBhZGRyZXNzIHNoaWZ0ZWQgcmlnaHQgMiBiaXRzOwotc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4gKi8KLSAgQkZEX1JFTE9DX01JUFNfSk1QLAotCi0vKiBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19NSVBTMTZfSk1QLAotCi0vKiBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwsCi0KLS8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWU7IHNpbXBsZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0hJMTYsCi0KLS8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLWV4dGVuZGVkIGFuZCBhZGRlZCB0byBmb3JtIHRoZSBmaW5hbCByZXN1bHQuICBJZiB0aGUgbG93IDE2Ci1iaXRzIGZvcm0gYSBuZWdhdGl2ZSBudW1iZXIsIHdlIG5lZWQgdG8gYWRkIG9uZSB0byB0aGUgaGlnaCB2YWx1ZQotdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuICovCi0gIEJGRF9SRUxPQ19ISTE2X1MsCi0KLS8qIExvdyAxNiBiaXRzLiAqLwotICBCRkRfUkVMT0NfTE8xNiwKLQotLyogTGlrZSBCRkRfUkVMT0NfSEkxNl9TLCBidXQgUEMgcmVsYXRpdmUuICovCi0gIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MsCi0KLS8qIExpa2UgQkZEX1JFTE9DX0xPMTYsIGJ1dCBQQyByZWxhdGl2ZS4gKi8KLSAgQkZEX1JFTE9DX1BDUkVMX0xPMTYsCi0KLS8qIFJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGdsb2JhbCBwb2ludGVyLiAqLwotI2RlZmluZSBCRkRfUkVMT0NfTUlQU19HUFJFTCBCRkRfUkVMT0NfR1BSRUwxNgotCi0vKiBSZWxvY2F0aW9uIGFnYWluc3QgYSBNSVBTIGxpdGVyYWwgc2VjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01JUFNfTElURVJBTCwKLQotLyogTUlQUyBFTEYgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYsCi0jZGVmaW5lIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIgQkZEX1JFTE9DX0dQUkVMMzIKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwKLSAgQkZEX1JFTE9DX01JUFNfU1VCLAotICBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRSwKLSAgQkZEX1JFTE9DX01JUFNfR09UX09GU1QsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQLAotCi0KLS8qIGkzODYvZWxmIHJlbG9jYXRpb25zICovCi0gIEJGRF9SRUxPQ18zODZfR09UMzIsCi0gIEJGRF9SRUxPQ18zODZfUExUMzIsCi0gIEJGRF9SRUxPQ18zODZfQ09QWSwKLSAgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVCwKLSAgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QsCi0gIEJGRF9SRUxPQ18zODZfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ18zODZfR09UT0ZGLAotICBCRkRfUkVMT0NfMzg2X0dPVFBDLAotCi0vKiBuczMyayByZWxvY2F0aW9ucyAqLwotICBCRkRfUkVMT0NfTlMzMktfSU1NXzgsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsCi0KLS8qIFBpY29qYXZhIHJlbG9jcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4gKi8KLSAgQkZEX1JFTE9DX1BKX0NPREVfSEkxNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfTE8xNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYsCi0gIEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyLAotICBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfUkVMMzIsCi0KLS8qIFBvd2VyKHJzNjAwMCkgYW5kIFBvd2VyUEMgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19QUENfQjI2LAotICBCRkRfUkVMT0NfUFBDX0JBMjYsCi0gIEJGRF9SRUxPQ19QUENfVE9DMTYsCi0gIEJGRF9SRUxPQ19QUENfQjE2LAotICBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19CQTE2LAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0NPUFksCi0gIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ19QUENfSk1QX1NMT1QsCi0gIEJGRF9SRUxPQ19QUENfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19QUENfTE9DQUwyNFBDLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBLAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTIxLAotICBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTywKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEksCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBLAotICBCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxELAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEsCi0KLS8qIFRoZSB0eXBlIG9mIHJlbG9jIHVzZWQgdG8gYnVpbGQgYSBjb250cnVjdG9yIHRhYmxlIC0gYXQgdGhlIG1vbWVudAotcHJvYmFibHkgYSAzMiBiaXQgd2lkZSBhYnNvbHV0ZSByZWxvY2F0aW9uLCBidXQgdGhlIHRhcmdldCBjYW4gY2hvb3NlLgotSXQgZ2VuZXJhbGx5IGRvZXMgbWFwIHRvIG9uZSBvZiB0aGUgb3RoZXIgcmVsb2NhdGlvbiB0eXBlcy4gKi8KLSAgQkZEX1JFTE9DX0NUT1IsCi0KLS8qIEFSTSAyNiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQotbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILAotCi0vKiBUaGVzZSByZWxvY3MgYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGhlIEFSTSBhc3NlbWJsZXIuICBUaGV5IGFyZSBub3QKLShhdCBwcmVzZW50KSB3cml0dGVuIHRvIGFueSBvYmplY3QgZmlsZXMuICovCi0gIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFLAotICBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFLAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NLAotICBCRkRfUkVMT0NfQVJNX1NXSSwKLSAgQkZEX1JFTE9DX0FSTV9NVUxUSSwKLSAgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NLAotICBCRkRfUkVMT0NfQVJNX0FEUl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fTERSX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9MSVRFUkFMLAotICBCRkRfUkVMT0NfQVJNX0lOX1BPT0wsCi0gIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTgsCi0gIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMLAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQsCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VULAotICBCRkRfUkVMT0NfQVJNX0dPVDEyLAotICBCRkRfUkVMT0NfQVJNX0dPVDMyLAotICBCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVCwKLSAgQkZEX1JFTE9DX0FSTV9DT1BZLAotICBCRkRfUkVMT0NfQVJNX0dMT0JfREFULAotICBCRkRfUkVMT0NfQVJNX1BMVDMyLAotICBCRkRfUkVMT0NfQVJNX1JFTEFUSVZFLAotICBCRkRfUkVMT0NfQVJNX0dPVE9GRiwKLSAgQkZEX1JFTE9DX0FSTV9HT1RQQywKLQotLyogSGl0YWNoaSBTSCByZWxvY3MuICBOb3QgYWxsIG9mIHRoZXNlIGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyLAotICBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIsCi0gIEJGRF9SRUxPQ19TSF9JTU00LAotICBCRkRfUkVMT0NfU0hfSU1NNEJZMiwKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTQsCi0gIEJGRF9SRUxPQ19TSF9JTU04LAotICBCRkRfUkVMT0NfU0hfSU1NOEJZMiwKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTQsCi0gIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIsCi0gIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQsCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gxNiwKLSAgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLAotICBCRkRfUkVMT0NfU0hfVVNFUywKLSAgQkZEX1JFTE9DX1NIX0NPVU5ULAotICBCRkRfUkVMT0NfU0hfQUxJR04sCi0gIEJGRF9SRUxPQ19TSF9DT0RFLAotICBCRkRfUkVMT0NfU0hfREFUQSwKLSAgQkZEX1JFTE9DX1NIX0xBQkVMLAotCi0vKiBUaHVtYiAyMy0sIDEyLSBhbmQgOS1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoZXMuICBUaGUgbG93ZXN0IGJpdCBtdXN0Ci1iZSB6ZXJvIGFuZCBpcyBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDksCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiwKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzLAotCi0vKiBBcmdvbmF1dCBSSVNDIENvcmUgKEFSQykgcmVsb2NzLgotQVJDIDIyIGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi1ub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIDIwIGJpdHMgYXJlIGluc3RhbGxlZCBpbiBiaXRzIDI2Ci10aHJvdWdoIDcgb2YgdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCwKLQotLyogQVJDIDI2IGJpdCBhYnNvbHV0ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlIG5vdAotc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIDI0IGJpdHMgYXJlIGluc3RhbGxlZCBpbiBiaXRzIDIzCi10aHJvdWdoIDAuICovCi0gIEJGRF9SRUxPQ19BUkNfQjI2LAotCi0vKiBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgotVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiwKLQotLyogTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLVRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyByZWxvYwotZXhjZXB0IGl0IGlzIGluIHRoZSBsZWZ0IGNvbnRhaW5lciwgaS5lLiwKLXNoaWZ0ZWQgbGVmdCAxNSBiaXRzLiAqLwotICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMTgsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTCwKLQotLyogTWl0c3ViaXNoaSBEMzBWIHJlbG9jcy4KLVRoaXMgaXMgYSA2LWJpdCBhYnNvbHV0ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfNiwKLQotLyogVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SLAotCi0vKiBUaGlzIGlzIGEgMTItYml0IGFic29sdXRlIHJlbG9jIHdpdGggdGhlIAotcmlnaHQgMyBiaXRzYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8xNSwKLQotLyogVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUiwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8yMSwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi1hcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi1vZiB0aGUgY29udGFpbmVyLiAqLwotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SLAotCi0vKiBUaGlzIGlzIGEgMzItYml0IGFic29sdXRlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfRDMwVl8zMiwKLQotLyogVGhpcyBpcyBhIDMyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwsCi0KLS8qIE1pdHN1YmlzaGkgTTMyUiByZWxvY3MuCi1UaGlzIGlzIGEgMjQgYml0IGFic29sdXRlIGFkZHJlc3MuICovCi0gIEJGRF9SRUxPQ19NMzJSXzI0LAotCi0vKiBUaGlzIGlzIGEgMTAtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDI2LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHVuc2lnbmVkLiAqLwotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTywKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHNpZ25lZC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8sCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgbG93ZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLiAqLwotICBCRkRfUkVMT0NfTTMyUl9MTzE2LAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIHNtYWxsIGRhdGEgYXJlYSBvZmZzZXQgZm9yIHVzZSBpbgotYWRkMywgbG9hZCwgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX00zMlJfU0RBMTYsCi0KLS8qIFRoaXMgaXMgYSA5LWJpdCByZWxvYyAqLwotICBCRkRfUkVMT0NfVjg1MF85X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMjItYml0IHJlbG9jICovCi0gIEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLXNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotemVybyBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhbiA4IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNiBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYW4gOGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNyBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci1kYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA1IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNCBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci1kYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA0IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLWJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsCi0KLQotLyogVGhpcyBpcyBhIDMyYml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLWluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2Yml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLWluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDhiaXQgRFAgcmVsb2MgZm9yIHRoZSB0bXMzMjBjMzAsIHdoZXJlIHRoZSBtb3N0Ci1zaWduaWZpY2FudCA4IGJpdHMgb2YgYSAyNCBiaXQgd29yZCBhcmUgcGxhY2VkIGludG8gdGhlIGxlYXN0Ci1zaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG9wY29kZS4gKi8KLSAgQkZEX1JFTE9DX1RJQzMwX0xEUCwKLQotLyogVGhpcyBpcyBhIDQ4IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMzIgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfNDgsCi0KLS8qIFRoaXMgaXMgYSAzMiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDIwIGJpdHMgc3BsaXQgdXAgaW50bwotdHdvIHNlY3Rpb25zLiAqLwotICBCRkRfUkVMT0NfRlIzMF8yMCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA2IGJpdCB3b3JkIG9mZnNldCBpbgotNCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF82X0lOXzQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGFuIDggYml0IGJ5dGUgb2Zmc2V0Ci1pbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfOF9JTl84LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHNob3J0IG9mZnNldAotaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzlfSU5fOCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMCBiaXQgd29yZCBvZmZzZXQKLWludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF8xMF9JTl84LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHBjIHJlbGF0aXZlCi1zaG9ydCBvZmZzZXQgaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzlfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTIgYml0IHBjIHJlbGF0aXZlCi1zaG9ydCBvZmZzZXQgaW50byAxMSBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCwKLQotLyogTW90b3JvbGEgTWNvcmUgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0LAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyLAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzIsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIsCi0gIEJGRF9SRUxPQ19NQ09SRV9SVkEsCi0KLS8qIFRoZXNlIHR3byByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgbGlua2VyIHRvIGRldGVybWluZSB3aGljaCBvZiAKLXRoZSBlbnRyaWVzIGluIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgYXJlIGFjdHVhbGx5IHVzZWQuICBXaGVuCi10aGUgLS1nYy1zZWN0aW9ucyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rZXIgd2lsbCB6ZXJvIG91dCB0aGUgZW50cmllcwotdGhhdCBhcmUgbm90IHVzZWQsIHNvIHRoYXQgdGhlIGNvZGUgZm9yIHRob3NlIGZ1bmN0aW9ucyBuZWVkIG5vdCBiZQotaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KLQotVlRBQkxFX0lOSEVSSVQgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdXNlZCB0byBkZXNjcmliZSB0byB0aGUKLWxpbmtlciB0aGUgaW5oZXJpdGVuY2UgdHJlZSBvZiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgVGhlCi1yZWxvY2F0aW9uJ3Mgc3ltYm9sIHNob3VsZCBiZSB0aGUgcGFyZW50IGNsYXNzJyB2dGFibGUsIGFuZCB0aGUKLXJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2F0ZWQgYXQgdGhlIGNoaWxkIHZ0YWJsZS4KLQotVlRBQkxFX0VOVFJZIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSB1c2Ugb2YgYQotdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBlbnRyeS4gIFRoZSByZWxvYydzIHN5bWJvbCBzaG91bGQgcmVmZXIgdG8gdGhlCi10YWJsZSBvZiB0aGUgY2xhc3MgbWVudGlvbmVkIGluIHRoZSBjb2RlLiAgT2ZmIG9mIHRoYXQgYmFzZSwgYW4gb2Zmc2V0Ci1kZXNjcmliZXMgdGhlIGVudHJ5IHRoYXQgaXMgYmVpbmcgdXNlZC4gIEZvciBSZWxhIGhvc3RzLCB0aGlzIG9mZnNldCAKLWlzIHN0b3JlZCBpbiB0aGUgcmVsb2MncyBhZGRlbmQuICBGb3IgUmVsIGhvc3RzLCB3ZSBhcmUgZm9yY2VkIHRvIHB1dAotdGhpcyBvZmZzZXQgaW4gdGhlIHJlbG9jJ3Mgc2VjdGlvbiBvZmZzZXQuICovCi0gIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwKLSAgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwKLSAgQkZEX1JFTE9DX1VOVVNFRCB9OwotdHlwZWRlZiBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlOwotcmVsb2NfaG93dG9fdHlwZSAqCi0KLWJmZF9yZWxvY190eXBlX2xvb2t1cCAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi1jb25zdCBjaGFyICoKLWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lICBQQVJBTVMgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi0KLXR5cGVkZWYgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeQotewotICAgICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIEJGRCB3aGljaCBvd25zIHRoZSBzeW1ib2wuIFRoaXMgaW5mb3JtYXRpb24KLSAgICAgICAgICBpcyBuZWNlc3Nhcnkgc28gdGhhdCBhIGJhY2sgZW5kIGNhbiB3b3JrIG91dCB3aGF0IGFkZGl0aW9uYWwKLSAgICAgICAgICBpbmZvcm1hdGlvbiAoaW52aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIpIGlzIGNhcnJpZWQKLSAgICAgICAgICB3aXRoIHRoZSBzeW1ib2wuCi0KLSAgICAgICAgICBUaGlzIGZpZWxkIGlzICphbG1vc3QqIHJlZHVuZGFudCwgc2luY2UgeW91IGNhbiB1c2Ugc2VjdGlvbi0+b3duZXIKLSAgICAgICAgICBpbnN0ZWFkLCBleGNlcHQgdGhhdCBzb21lIHN5bWJvbHMgcG9pbnQgdG8gdGhlIGdsb2JhbCBzZWN0aW9ucwotICAgICAgICAgIGJmZF97YWJzLGNvbSx1bmR9X3NlY3Rpb24uICBUaGlzIGNvdWxkIGJlIGZpeGVkIGJ5IG1ha2luZwotICAgICAgICAgIHRoZXNlIGdsb2JhbHMgYmUgcGVyLWJmZCAob3IgcGVyLXRhcmdldC1mbGF2b3IpLiAgRklYTUUuICovCi0KLSAgc3RydWN0IF9iZmQgKnRoZV9iZmQ7ICAvKiBVc2UgYmZkX2FzeW1ib2xfYmZkKHN5bSkgdG8gYWNjZXNzIHRoaXMgZmllbGQuICovCi0KLSAgICAgICAgLyogVGhlIHRleHQgb2YgdGhlIHN5bWJvbC4gVGhlIG5hbWUgaXMgbGVmdCBhbG9uZSwgYW5kIG5vdCBjb3BpZWQ7IHRoZQotICAgICAgICAgIGFwcGxpY2F0aW9uIG1heSBub3QgYWx0ZXIgaXQuICovCi0gIENPTlNUIGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgLyogVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBUaGlzIHJlYWxseSBzaG91bGQgYmUgYSB1bmlvbiBvZiBhCi0gICAgICAgICAgbnVtZXJpYyB2YWx1ZSB3aXRoIGEgcG9pbnRlciwgc2luY2Ugc29tZSBmbGFncyBpbmRpY2F0ZSB0aGF0Ci0gICAgICAgICAgYSBwb2ludGVyIHRvIGFub3RoZXIgc3ltYm9sIGlzIHN0b3JlZCBoZXJlLiAgKi8KLSAgc3ltdmFsdWUgdmFsdWU7Ci0KLSAgICAgICAgLyogQXR0cmlidXRlcyBvZiBhIHN5bWJvbDogKi8KLQotI2RlZmluZSBCU0ZfTk9fRkxBR1MgICAgMHgwMAotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaGFzIGxvY2FsIHNjb3BlOyA8PHN0YXRpYz4+IGluIDw8Qz4+LiBUaGUgdmFsdWUKLSAgICAgICAgICBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCi0jZGVmaW5lIEJTRl9MT0NBTCAgICAgIDB4MDEKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGU7IGluaXRpYWxpemVkIGRhdGEgaW4gPDxDPj4uIFRoZQotICAgICAgICAgIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKi8KLSNkZWZpbmUgQlNGX0dMT0JBTCAgICAgMHgwMgotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZSBhbmQgaXMgZXhwb3J0ZWQuIFRoZSB2YWx1ZSBpcwotICAgICAgICAgIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKi8KLSNkZWZpbmUgQlNGX0VYUE9SVCAgICAgQlNGX0dMT0JBTCAgLyogbm8gcmVhbCBkaWZmZXJlbmNlICovCi0KLSAgICAgICAgLyogQSBub3JtYWwgQyBzeW1ib2wgd291bGQgYmUgb25lIG9mOgotICAgICAgICAgIDw8QlNGX0xPQ0FMPj4sIDw8QlNGX0ZPUlRfQ09NTT4+LCAgPDxCU0ZfVU5ERUZJTkVEPj4gb3IKLSAgICAgICAgICA8PEJTRl9HTE9CQUw+PiAqLwotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaXMgYSBkZWJ1Z2dpbmcgcmVjb3JkLiBUaGUgdmFsdWUgaGFzIGFuIGFyYml0YXJ5Ci0gICAgICAgICAgbWVhbmluZywgdW5sZXNzIEJTRl9ERUJVR0dJTkdfUkVMT0MgaXMgYWxzbyBzZXQuICAqLwotI2RlZmluZSBCU0ZfREVCVUdHSU5HICAweDA4Ci0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBkZW5vdGVzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQuICBVc2VkIGluIEVMRiwKLSAgICAgICAgICBwZXJoYXBzIG90aGVycyBzb21lZGF5LiAgKi8KLSNkZWZpbmUgQlNGX0ZVTkNUSU9OICAgIDB4MTAKLQotICAgICAgICAvKiBVc2VkIGJ5IHRoZSBsaW5rZXIuICovCi0jZGVmaW5lIEJTRl9LRUVQICAgICAgICAweDIwCi0jZGVmaW5lIEJTRl9LRUVQX0cgICAgICAweDQwCi0KLSAgICAgICAgLyogQSB3ZWFrIGdsb2JhbCBzeW1ib2wsIG92ZXJyaWRhYmxlIHdpdGhvdXQgd2FybmluZ3MgYnkKLSAgICAgICAgICBhIHJlZ3VsYXIgZ2xvYmFsIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgKi8KLSNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4ODAKLQotICAgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCB0byBwb2ludCB0byBhIHNlY3Rpb24sIGUuZy4gRUxGJ3MKLSAgICAgICAgICBTVFRfU0VDVElPTiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4MTAwCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCB1c2VkIHRvIGJlIGEgY29tbW9uIHN5bWJvbCwgYnV0IG5vdyBpdCBpcwotICAgICAgICAgIGFsbG9jYXRlZC4gKi8KLSNkZWZpbmUgQlNGX09MRF9DT01NT04gIDB4MjAwCi0KLSAgICAgICAgLyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGNvbW1vbiBkYXRhLiAqLwotI2RlZmluZSBCRkRfRk9SVF9DT01NX0RFRkFVTFRfVkFMVUUgMAotCi0gICAgICAgIC8qIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKLSAgICAgICAgICBsb2NhdGlvbiBpbiBhbiBvdXRwdXQgZmlsZSAtIGllIGluIGNvZmYgYSA8PElTRkNOPj4gc3ltYm9sCi0gICAgICAgICAgd2hpY2ggaXMgYWxzbyA8PENfRVhUPj4gc3ltYm9sIGFwcGVhcnMgd2hlcmUgaXQgd2FzCi0gICAgICAgICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAotICAgICAgICAgIGJ5IHRoZSB0YXJnZXQgQkZEIHBhcnQgdG8gY29udmV5IHRoaXMgaW5mb3JtYXRpb24uICovCi0KLSNkZWZpbmUgQlNGX05PVF9BVF9FTkQgICAgMHg0MDAKLQotICAgICAgICAvKiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIHRoZSBsYWJlbCBvZiBjb25zdHJ1Y3RvciBzZWN0aW9uLiAqLwotI2RlZmluZSBCU0ZfQ09OU1RSVUNUT1IgICAweDgwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgYSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuYW1lIGlzIGEKLSAgICAgICAgICB3YXJuaW5nLiAgVGhlIG5hbWUgb2YgdGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dDsKLSAgICAgICAgICBpZiBhIHJlZmVyZW5jZSBpcyBtYWRlIHRvIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbmV4dAotICAgICAgICAgIHN5bWJvbCwgYSB3YXJuaW5nIGlzIGlzc3VlZCBieSB0aGUgbGlua2VyLiAqLwotI2RlZmluZSBCU0ZfV0FSTklORyAgICAgICAweDEwMDAKLQotICAgICAgICAvKiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIGluZGlyZWN0LiAgVGhpcyBzeW1ib2wgaXMgYW4gaW5kaXJlY3QKLSAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0IHN5bWJvbC4gKi8KLSNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHgyMDAwCi0KLSAgICAgICAgLyogQlNGX0ZJTEUgbWFya3Mgc3ltYm9scyB0aGF0IGNvbnRhaW4gYSBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQKLSAgICAgICAgICBmb3IgRUxGIFNUVF9GSUxFIHN5bWJvbHMuICAqLwotI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDQwMDAKLQotICAgICAgICAvKiBTeW1ib2wgaXMgZnJvbSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBCU0ZfRFlOQU1JQyAgICAgICAweDgwMDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBkYXRhIG9iamVjdC4gIFVzZWQgaW4gRUxGLCBhbmQgcGVyaGFwcwotICAgICAgICAgIG90aGVycyBzb21lZGF5LiAgKi8KLSNkZWZpbmUgQlNGX09CSkVDVCAgICAgICAgMHgxMDAwMAotCi0gICAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0Ci0gICAgICAgICAgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gIEJTRl9ERUJVR0dJTkcgc2hvdWxkIGJlIHNldAotICAgICAgICAgIGFzIHdlbGwuICAqLwotI2RlZmluZSBCU0ZfREVCVUdHSU5HX1JFTE9DIDB4MjAwMDAKLQotICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhpcyBzeW1ib2wgaXMKLSAgICAgICAgICByZWxhdGl2ZS4gIFRoaXMgd2lsbCBhbHdheXMgYmUgbm9uIE5VTEwsIHRoZXJlIGFyZSBzcGVjaWFsCi0gICAgICAgICAgc2VjdGlvbnMgZm9yIHVuZGVmaW5lZCBhbmQgYWJzb2x1dGUgc3ltYm9scy4gICovCi0gIHN0cnVjdCBzZWMgKnNlY3Rpb247Ci0KLSAgICAgICAgLyogQmFjayBlbmQgc3BlY2lhbCBkYXRhLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBQVFIgcDsKLSAgICAgIGJmZF92bWEgaTsKLSAgICB9IHVkYXRhOwotCi19IGFzeW1ib2w7Ci0jZGVmaW5lIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotYm9vbGVhbiAKLWJmZF9pc19sb2NhbF9sYWJlbCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bSkpOwotCi1ib29sZWFuIAotYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBjaGFyICpuYW1lKSk7Ci0KLSNkZWZpbmUgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoYWJmZCwgbmFtZSkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCAoYWJmZCwgbmFtZSkpCi0jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsXAotICAgICAgICAgICAgICAgICAgKGFiZmQsIGxvY2F0aW9uKSkKLWJvb2xlYW4gCi1iZmRfc2V0X3N5bXRhYiAgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqbG9jYXRpb24sIHVuc2lnbmVkIGludCBjb3VudCkpOwotCi12b2lkIAotYmZkX3ByaW50X3N5bWJvbF92YW5kZiBQQVJBTVMgKChQVFIgZmlsZSwgYXN5bWJvbCAqc3ltYm9sKSk7Ci0KLSNkZWZpbmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKLSNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wsIChhYmZkLCBwdHIsIHNpemUpKQotaW50IAotYmZkX2RlY29kZV9zeW1jbGFzcyBQQVJBTVMgKChhc3ltYm9sICpzeW1ib2wpKTsKLQotdm9pZCAKLWJmZF9zeW1ib2xfaW5mbyBQQVJBTVMgKChhc3ltYm9sICpzeW1ib2wsIHN5bWJvbF9pbmZvICpyZXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pKTsKLQotI2RlZmluZSBiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpIFwKLSAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkpCi1zdHJ1Y3QgX2JmZCAKLXsKLSAgICAgLyogVGhlIGZpbGVuYW1lIHRoZSBhcHBsaWNhdGlvbiBvcGVuZWQgdGhlIEJGRCB3aXRoLiAgKi8KLSAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsgICAgICAgICAgICAgICAgCi0KLSAgICAgLyogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQganVtcCB0YWJsZS4gICAgICAgICAgICAgKi8KLSAgICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLQotICAgICAvKiBUbyBhdm9pZCBkcmFnZ2luZyB0b28gbWFueSBoZWFkZXIgZmlsZXMgaW50byBldmVyeSBmaWxlIHRoYXQKLSAgICAgICBpbmNsdWRlcyBgPDxiZmQuaD4+JywgSU9TVFJFQU0gaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSAiY2hhcgotICAgICAgICoiLCBhbmQgTVRJTUUgYXMgYSAibG9uZyIuICBUaGVpciBjb3JyZWN0IHR5cGVzLCB0byB3aGljaCB0aGV5Ci0gICAgICAgYXJlIGNhc3Qgd2hlbiB1c2VkLCBhcmUgIkZJTEUgKiIgYW5kICJ0aW1lX3QiLiAgICBUaGUgaW9zdHJlYW0KLSAgICAgICBpcyB0aGUgcmVzdWx0IG9mIGFuIGZvcGVuIG9uIHRoZSBmaWxlbmFtZS4gIEhvd2V2ZXIsIGlmIHRoZQotICAgICAgIEJGRF9JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoZW4gaW9zdHJlYW0gaXMgYWN0dWFsbHkgYSBwb2ludGVyCi0gICAgICAgdG8gYSBiZmRfaW5fbWVtb3J5IHN0cnVjdC4gICovCi0gICAgUFRSIGlvc3RyZWFtOwotCi0gICAgIC8qIElzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgY2FjaGVkPyAgVGhhdCBpcywgY2FuIGl0IGJlIGNsb3NlZCBhcwotICAgICAgIG5lZWRlZCwgYW5kIHJlLW9wZW5lZCB3aGVuIGFjY2Vzc2VkIGxhdGVyPyAgKi8KLQotICAgIGJvb2xlYW4gY2FjaGVhYmxlOwotCi0gICAgIC8qIE1hcmtzIHdoZXRoZXIgdGhlcmUgd2FzIGEgZGVmYXVsdCB0YXJnZXQgc3BlY2lmaWVkIHdoZW4gdGhlCi0gICAgICAgQkZEIHdhcyBvcGVuZWQuIFRoaXMgaXMgdXNlZCB0byBzZWxlY3Qgd2hpY2ggbWF0Y2hpbmcgYWxnb3JpdGhtCi0gICAgICAgdG8gdXNlIHRvIGNob29zZSB0aGUgYmFjayBlbmQuICovCi0KLSAgICBib29sZWFuIHRhcmdldF9kZWZhdWx0ZWQ7Ci0KLSAgICAgLyogVGhlIGNhY2hpbmcgcm91dGluZXMgdXNlIHRoZXNlIHRvIG1haW50YWluIGEKLSAgICAgICBsZWFzdC1yZWNlbnRseS11c2VkIGxpc3Qgb2YgQkZEcyAqLwotCi0gICAgc3RydWN0IF9iZmQgKmxydV9wcmV2LCAqbHJ1X25leHQ7Ci0KLSAgICAgLyogV2hlbiBhIGZpbGUgaXMgY2xvc2VkIGJ5IHRoZSBjYWNoaW5nIHJvdXRpbmVzLCBCRkQgcmV0YWlucwotICAgICAgIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaWxlIGhlcmU6ICovCi0KLSAgICBmaWxlX3B0ciB3aGVyZTsgICAgICAgICAgICAgIAotCi0gICAgIC8qIGFuZCBoZXJlOiAoYGBvbmNlJycgbWVhbnMgYXQgbGVhc3Qgb25jZSkgKi8KLQotICAgIGJvb2xlYW4gb3BlbmVkX29uY2U7Ci0KLSAgICAgLyogU2V0IGlmIHdlIGhhdmUgYSBsb2NhbGx5IG1haW50YWluZWQgbXRpbWUgdmFsdWUsIHJhdGhlciB0aGFuCi0gICAgICAgZ2V0dGluZyBpdCBmcm9tIHRoZSBmaWxlIGVhY2ggdGltZTogKi8KLQotICAgIGJvb2xlYW4gbXRpbWVfc2V0OwotCi0gICAgIC8qIEZpbGUgbW9kaWZpZWQgdGltZSwgaWYgbXRpbWVfc2V0IGlzIHRydWU6ICovCi0KLSAgICBsb25nIG10aW1lOyAgICAgICAgICAKLQotICAgICAvKiBSZXNlcnZlZCBmb3IgYW4gdW5pbXBsZW1lbnRlZCBmaWxlIGxvY2tpbmcgZXh0ZW5zaW9uLiovCi0KLSAgICBpbnQgaWZkOwotCi0gICAgIC8qIFRoZSBmb3JtYXQgd2hpY2ggYmVsb25ncyB0byB0aGUgQkZELiAob2JqZWN0LCBjb3JlLCBldGMuKSAqLwotCi0gICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci0KLSAgICAgLyogVGhlIGRpcmVjdGlvbiB0aGUgQkZEIHdhcyBvcGVuZWQgd2l0aCovCi0KLSAgICBlbnVtIGJmZF9kaXJlY3Rpb24ge25vX2RpcmVjdGlvbiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RpcmVjdGlvbiA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9kaXJlY3Rpb24gPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgYm90aF9kaXJlY3Rpb24gPSAzfSBkaXJlY3Rpb247Ci0KLSAgICAgLyogRm9ybWF0X3NwZWNpZmljIGZsYWdzKi8KLQotICAgIGZsYWd3b3JkIGZsYWdzOyAgICAgICAgICAgICAgCi0KLSAgICAgLyogQ3VycmVudGx5IG15X2FyY2hpdmUgaXMgdGVzdGVkIGJlZm9yZSBhZGRpbmcgb3JpZ2luIHRvCi0gICAgICAgYW55dGhpbmcuIEkgYmVsaWV2ZSB0aGF0IHRoaXMgY2FuIGJlY29tZSBhbHdheXMgYW4gYWRkIG9mCi0gICAgICAgb3JpZ2luLCB3aXRoIG9yaWdpbiBzZXQgdG8gMCBmb3Igbm9uIGFyY2hpdmUgZmlsZXMuICAgKi8KLQotICAgIGZpbGVfcHRyIG9yaWdpbjsgICAgICAgICAgICAgCi0KLSAgICAgLyogUmVtZW1iZXIgd2hlbiBvdXRwdXQgaGFzIGJlZ3VuLCB0byBzdG9wIHN0cmFuZ2UgdGhpbmdzCi0gICAgICAgZnJvbSBoYXBwZW5pbmcuICovCi0gICAgYm9vbGVhbiBvdXRwdXRfaGFzX2JlZ3VuOwotCi0gICAgIC8qIFBvaW50ZXIgdG8gbGlua2VkIGxpc3Qgb2Ygc2VjdGlvbnMqLwotICAgIHN0cnVjdCBzZWMgICpzZWN0aW9uczsKLQotICAgICAvKiBUaGUgbnVtYmVyIG9mIHNlY3Rpb25zICovCi0gICAgdW5zaWduZWQgaW50IHNlY3Rpb25fY291bnQ7Ci0KLSAgICAgLyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIG9iamVjdCBmaWxlczogCi0gICAgICAgVGhlIHN0YXJ0IGFkZHJlc3MuICovCi0gICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotCi0gICAgIC8qIFVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQqLwotICAgIHVuc2lnbmVkIGludCBzeW1jb3VudDsKLQotICAgICAvKiBTeW1ib2wgdGFibGUgZm9yIG91dHB1dCBCRkQgKHdpdGggc3ltY291bnQgZW50cmllcykgKi8KLSAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqKm91dHN5bWJvbHM7ICAgICAgICAgICAgIAotCi0gICAgIC8qIFBvaW50ZXIgdG8gc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiovCi0gICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2hfaW5mbzsKLQotICAgICAvKiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3IgYXJjaGl2ZXM6Ki8KLSAgICBQVFIgYXJlbHRfZGF0YTsgICAgICAgICAgICAgIAotICAgIHN0cnVjdCBfYmZkICpteV9hcmNoaXZlOyAgICAgIC8qIFRoZSBjb250YWluaW5nIGFyY2hpdmUgQkZELiAgKi8KLSAgICBzdHJ1Y3QgX2JmZCAqbmV4dDsgICAgICAgICAgICAvKiBUaGUgbmV4dCBCRkQgaW4gdGhlIGFyY2hpdmUuICAqLwotICAgIHN0cnVjdCBfYmZkICphcmNoaXZlX2hlYWQ7ICAgIC8qIFRoZSBmaXJzdCBCRkQgaW4gdGhlIGFyY2hpdmUuICAqLwotICAgIGJvb2xlYW4gaGFzX2FybWFwOyAgICAgICAgICAgCi0KLSAgICAgLyogQSBjaGFpbiBvZiBCRkQgc3RydWN0dXJlcyBpbnZvbHZlZCBpbiBhIGxpbmsuICAqLwotICAgIHN0cnVjdCBfYmZkICpsaW5rX25leHQ7Ci0KLSAgICAgLyogQSBmaWVsZCB1c2VkIGJ5IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICBUaGlzIHdpbGwKLSAgICAgICBiZSB1c2VkIG9ubHkgZm9yIGFyY2hpdmUgZWxlbWVudHMuICAqLwotICAgIGludCBhcmNoaXZlX3Bhc3M7Ci0KLSAgICAgLyogVXNlZCBieSB0aGUgYmFjayBlbmQgdG8gaG9sZCBwcml2YXRlIGRhdGEuICovCi0KLSAgICB1bmlvbiAKLSAgICAgIHsKLSAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICphb3V0X2RhdGE7Ci0gICAgICBzdHJ1Y3QgYXJ0ZGF0YSAqYW91dF9hcl9kYXRhOwotICAgICAgc3RydWN0IF9vYXN5c19kYXRhICpvYXN5c19vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSAqb2FzeXNfYXJfZGF0YTsKLSAgICAgIHN0cnVjdCBjb2ZmX3RkYXRhICpjb2ZmX29ial9kYXRhOwotICAgICAgc3RydWN0IHBlX3RkYXRhICpwZV9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfdGRhdGEgKmVjb2ZmX29ial9kYXRhOwotICAgICAgc3RydWN0IGllZWVfZGF0YV9zdHJ1Y3QgKmllZWVfZGF0YTsKLSAgICAgIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0ICppZWVlX2FyX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc3JlY19kYXRhX3N0cnVjdCAqc3JlY19kYXRhOwotICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKmloZXhfZGF0YTsKLSAgICAgIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QgKnRla2hleF9kYXRhOwotICAgICAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKmVsZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBubG1fb2JqX3RkYXRhICpubG1fb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqYm91dF9kYXRhOwotICAgICAgc3RydWN0IHN1bl9jb3JlX3N0cnVjdCAqc3VuX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBzY281X2NvcmVfc3RydWN0ICpzY281X2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICp0cmFkX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QgKnNvbV9kYXRhOwotICAgICAgc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKmhwdXhfY29yZV9kYXRhOwotICAgICAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmhwcGFic2RfY29yZV9kYXRhOwotICAgICAgc3RydWN0IHNnaV9jb3JlX3N0cnVjdCAqc2dpX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBseW54X2NvcmVfc3RydWN0ICpseW54X2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKm9zZl9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QgKmNpc2NvX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCB2ZXJzYWRvc19kYXRhX3N0cnVjdCAqdmVyc2Fkb3NfZGF0YTsKLSAgICAgIHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgKm5ldGJzZF9jb3JlX2RhdGE7Ci0gICAgICBQVFIgYW55OwotICAgICAgfSB0ZGF0YTsKLSAgCi0gICAgIC8qIFVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGhvbGQgcHJpdmF0ZSBkYXRhKi8KLSAgICBQVFIgdXNyZGF0YTsKLQotICAgLyogV2hlcmUgYWxsIHRoZSBhbGxvY2F0ZWQgc3R1ZmYgdW5kZXIgdGhpcyBCRkQgZ29lcy4gIFRoaXMgaXMgYQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKiwgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2YKLSAgICAgb2JqYWxsb2MuaC4gICovCi0gICAgUFRSIG1lbW9yeTsKLX07Ci0KLXR5cGVkZWYgZW51bSBiZmRfZXJyb3IKLXsKLSAgYmZkX2Vycm9yX25vX2Vycm9yID0gMCwKLSAgYmZkX2Vycm9yX3N5c3RlbV9jYWxsLAotICBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQsCi0gIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQsCi0gIGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbiwKLSAgYmZkX2Vycm9yX25vX21lbW9yeSwKLSAgYmZkX2Vycm9yX25vX3N5bWJvbHMsCi0gIGJmZF9lcnJvcl9ub19hcm1hcCwKLSAgYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMsCi0gIGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSwKLSAgYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQsCi0gIGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQsCi0gIGJmZF9lcnJvcl9ub19jb250ZW50cywKLSAgYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwKLSAgYmZkX2Vycm9yX25vX2RlYnVnX3NlY3Rpb24sCi0gIGJmZF9lcnJvcl9iYWRfdmFsdWUsCi0gIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwKLSAgYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZywKLSAgYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZQotfSBiZmRfZXJyb3JfdHlwZTsKLQotYmZkX2Vycm9yX3R5cGUgCi1iZmRfZ2V0X2Vycm9yICBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X2Vycm9yICBQQVJBTVMgKChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpKTsKLQotQ09OU1QgY2hhciAqCi1iZmRfZXJybXNnICBQQVJBTVMgKChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpKTsKLQotdm9pZCAKLWJmZF9wZXJyb3IgIFBBUkFNUyAoKENPTlNUIGNoYXIgKm1lc3NhZ2UpKTsKLQotdHlwZWRlZiB2b2lkICgqYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSAKLWJmZF9zZXRfZXJyb3JfaGFuZGxlciAgUEFSQU1TICgoYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkpOwotCi12b2lkIAotYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi1iZmRfZXJyb3JfaGFuZGxlcl90eXBlIAotYmZkX2dldF9lcnJvcl9oYW5kbGVyICBQQVJBTVMgKCh2b2lkKSk7Ci0KLWxvbmcgCi1iZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3QpKTsKLQotbG9uZyAKLWJmZF9jYW5vbmljYWxpemVfcmVsb2MKLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlYywKLSAgICBhcmVsZW50ICoqbG9jLAotICAgIGFzeW1ib2wgKipzeW1zKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X3JlbG9jCi0gUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBhcmVsZW50ICoqcmVsLCB1bnNpZ25lZCBpbnQgY291bnQpCi0gICAgCi0gICAgKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfZmlsZV9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X3N0YXJ0X2FkZHJlc3MgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIHZtYSkpOwotCi1sb25nIAotYmZkX2dldF9tdGltZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotbG9uZyAKLWJmZF9nZXRfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotaW50IAotYmZkX2dldF9ncF9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi12b2lkIAotYmZkX3NldF9ncF9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IGkpKTsKLQotYmZkX3ZtYSAKLWJmZF9zY2FuX3ZtYSBQQVJBTVMgKChDT05TVCBjaGFyICpzdHJpbmcsIENPTlNUIGNoYXIgKiplbmQsIGludCBiYXNlKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYmZkICpvYmZkKSk7Ci0KLSNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwgXAotICAgICAgICAgICAgICAgKGliZmQsIG9iZmQpKQotYm9vbGVhbiAKLWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYmZkICpvYmZkKSk7Ci0KLSNkZWZpbmUgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgb2JmZCkpCi1ib29sZWFuIAotYmZkX3NldF9wcml2YXRlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpKTsKLQotI2RlZmluZSBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MoYWJmZCwgZmxhZ3MpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MsIFwKLSAgICAgICAgICAgICAgIChhYmZkLCBmbGFncykpCi0jZGVmaW5lIGJmZF9zaXplb2ZfaGVhZGVycyhhYmZkLCByZWxvYykgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zaXplb2ZfaGVhZGVycywgKGFiZmQsIHJlbG9jKSkKLQotI2RlZmluZSBiZmRfZmluZF9uZWFyZXN0X2xpbmUoYWJmZCwgc2VjLCBzeW1zLCBvZmYsIGZpbGUsIGZ1bmMsIGxpbmUpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluZF9uZWFyZXN0X2xpbmUsICAoYWJmZCwgc2VjLCBzeW1zLCBvZmYsIGZpbGUsIGZ1bmMsIGxpbmUpKQotCi0gICAgICAgIC8qIERvIHRoZXNlIHRocmVlIGRvIGFueXRoaW5nIHVzZWZ1bCBhdCBhbGwsIGZvciBhbnkgYmFjayBlbmQ/ICAqLwotI2RlZmluZSBiZmRfZGVidWdfaW5mb19zdGFydChhYmZkKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfZGVidWdfaW5mb19lbmQoYWJmZCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2VuZCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUoYWJmZCwgc2VjdGlvbikgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIChhYmZkLCBzZWN0aW9uKSkKLQotCi0jZGVmaW5lIGJmZF9zdGF0X2FyY2hfZWx0KGFiZmQsIHN0YXQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc3RhdF9hcmNoX2VsdCwoYWJmZCwgc3RhdCkpCi0KLSNkZWZpbmUgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAoYWJmZCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX3NldF9hcmNoX21hY2goYWJmZCwgYXJjaCwgbWFjaClcCi0gICAgICAgIEJGRF9TRU5EICggYWJmZCwgX2JmZF9zZXRfYXJjaF9tYWNoLCAoYWJmZCwgYXJjaCwgbWFjaCkpCi0KLSNkZWZpbmUgYmZkX3JlbGF4X3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlbGF4X3NlY3Rpb24sIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSkKLQotI2RlZmluZSBiZmRfZ2Nfc2VjdGlvbnMoYWJmZCwgbGlua19pbmZvKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2Nfc2VjdGlvbnMsIChhYmZkLCBsaW5rX2luZm8pKQotCi0jZGVmaW5lIGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKGFiZmQpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2xpbmtfYWRkX3N5bWJvbHMoYWJmZCwgaW5mbykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfYWRkX3N5bWJvbHMsIChhYmZkLCBpbmZvKSkKLQotI2RlZmluZSBiZmRfZmluYWxfbGluayhhYmZkLCBpbmZvKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluYWxfbGluaywgKGFiZmQsIGluZm8pKQotCi0jZGVmaW5lIGJmZF9mcmVlX2NhY2hlZF9pbmZvKGFiZmQpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9mcmVlX2NhY2hlZF9pbmZvLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoYWJmZCwgZmlsZSlcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwgKGFiZmQsIGZpbGUpKQotCi0jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoYWJmZCwgYXN5bWJvbHMpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIsIChhYmZkLCBhc3ltYm9scykpCi0KLSNkZWZpbmUgYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKGFiZmQpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyhhYmZkLCBhcmVscywgYXN5bXMpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYywgKGFiZmQsIGFyZWxzLCBhc3ltcykpCi0KLWV4dGVybiBiZmRfYnl0ZSAqYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi1zeW1pbmRleCAKLWJmZF9nZXRfbmV4dF9tYXBlbnQgUEFSQU1TICgoYmZkICphYmZkLCBzeW1pbmRleCBwcmV2aW91cywgY2Fyc3ltICoqc3ltKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X2FyY2hpdmVfaGVhZCBQQVJBTVMgKChiZmQgKm91dHB1dCwgYmZkICpuZXdfaGVhZCkpOwotCi1iZmQgKgotYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2hpdmUsIGJmZCAqcHJldmlvdXMpKTsKLQotQ09OU1QgY2hhciAqCi1iZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotaW50IAotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLQotI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgICAgICAgICAgICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpCi0KLSNpZmRlZiBERUJVR19CRkRfU0VORAotI3VuZGVmIEJGRF9TRU5ECi0jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAoKChiZmQpICYmIChiZmQpLT54dmVjICYmIChiZmQpLT54dmVjLT5tZXNzYWdlKSA/IFwKLSAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KSA6IFwKLSAgICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLSNlbmRpZgotI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICAgICAgICAgICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkKLQotI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0jdW5kZWYgQkZEX1NFTkRfRk1UCi0jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgKCgoYmZkKSAmJiAoYmZkKS0+eHZlYyAmJiAoYmZkKS0+eHZlYy0+bWVzc2FnZSkgPyBcCi0gICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkgOiBcCi0gICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLSNlbmRpZgotZW51bSBiZmRfZmxhdm91ciB7Ci0gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91ciwKLSAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X29zOWtfZmxhdm91ciwKLSAgYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotfTsKLQotZW51bSBiZmRfZW5kaWFuIHsgQkZEX0VORElBTl9CSUcsIEJGRF9FTkRJQU5fTElUVExFLCBCRkRfRU5ESUFOX1VOS05PV04gfTsKLQotIC8qIEZvcndhcmQgZGVjbGFyYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyBfYmZkX2xpbmtfaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QgYmZkX3RhcmdldAotewotICBjaGFyICpuYW1lOwotICBlbnVtIGJmZF9mbGF2b3VyIGZsYXZvdXI7Ci0gIGVudW0gYmZkX2VuZGlhbiBieXRlb3JkZXI7Ci0gIGVudW0gYmZkX2VuZGlhbiBoZWFkZXJfYnl0ZW9yZGVyOwotICBmbGFnd29yZCBvYmplY3RfZmxhZ3M7ICAgICAgIAotICBmbGFnd29yZCBzZWN0aW9uX2ZsYWdzOwotICBjaGFyIHN5bWJvbF9sZWFkaW5nX2NoYXI7Ci0gIGNoYXIgYXJfcGFkX2NoYXI7ICAgICAgICAgICAgCi0gIHVuc2lnbmVkIHNob3J0IGFyX21heF9uYW1lbGVuOwotICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqKCpfYmZkX2NoZWNrX2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF9zZXRfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICAgICAgICAgICAgKCpfYmZkX3dyaXRlX2NvbnRlbnRzW2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgIC8qIEdlbmVyaWMgZW50cnkgcG9pbnRzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyhOQU1FKVwKLUNBVChOQU1FLF9jbG9zZV9hbmRfY2xlYW51cCksXAotQ0FUKE5BTUUsX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSxcCi1DQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAotQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzKSxcCi1DQVQoTkFNRSxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotCi0gICAvKiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqLwotICBib29sZWFuICAgICAgICgqX2Nsb3NlX2FuZF9jbGVhbnVwKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogQXNrIHRoZSBCRkQgdG8gZnJlZSBhbGwgY2FjaGVkIGluZm9ybWF0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfZnJlZV9jYWNoZWRfaW5mbykgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIENhbGxlZCB3aGVuIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLSAgIC8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgYmZkX3dpbmRvdyAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0gICAvKiBFbnRyeSBwb2ludHMgdG8gY29weSBwcml2YXRlIGRhdGEuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9DT1BZKE5BTUUpXAotQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyksXAotQ0FUKE5BTUUsX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKVwKLSAgIC8qIENhbGxlZCB0byBjb3B5IEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgICB0byBhbm90aGVyLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLSAgIC8qIENhbGxlZCB0byBtZXJnZSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgICAgdG8gYSBjb21tb24gb3V0cHV0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0gICAvKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgICAgdG8gYW5vdGhlci4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqLCBzZWNfcHRyKSk7Ci0gICAvKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBzeW1ib2wgCi0gICAgIHRvIGFub3RoZXIuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICosIGFzeW1ib2wgKikpOwotICAgLyogQ2FsbGVkIHRvIHNldCBwcml2YXRlIGJhY2tlbmQgZmxhZ3MgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotCi0gICAvKiBDYWxsZWQgdG8gcHJpbnQgcHJpdmF0ZSBCRkQgZGF0YSAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLSAgIC8qIENvcmUgZmlsZSBlbnRyeSBwb2ludHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9DT1JFKE5BTUUpXAotQ0FUKE5BTUUsX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpLFwKLUNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpLFwKLUNBVChOQU1FLF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0gIGNoYXIgKiAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGludCAgICAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgKCpfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotICAgLyogQXJjaGl2ZSBlbnRyeSBwb2ludHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKE5BTUUpXAotQ0FUKE5BTUUsX3NsdXJwX2FybWFwKSxcCi1DQVQoTkFNRSxfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSksXAotQ0FUKE5BTUUsX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi1DQVQoTkFNRSxfdHJ1bmNhdGVfYXJuYW1lKSxcCi1DQVQoTkFNRSxfd3JpdGVfYXJtYXApLFwKLUNBVChOQU1FLF9yZWFkX2FyX2hkciksXAotQ0FUKE5BTUUsX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSksXAotQ0FUKE5BTUUsX2dldF9lbHRfYXRfaW5kZXgpLFwKLUNBVChOQU1FLF9nZW5lcmljX3N0YXRfYXJjaF9lbHQpLFwKLUNBVChOQU1FLF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKQotICBib29sZWFuICAoKl9iZmRfc2x1cnBfYXJtYXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAoKl9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpCi0gICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotICB2b2lkICAgICAoKl9iZmRfdHJ1bmNhdGVfYXJuYW1lKSBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKLSAgYm9vbGVhbiAgKCp3cml0ZV9hcm1hcCkgUEFSQU1TICgoYmZkICphcmNoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9ybCAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWR4KSk7Ci0gIFBUUiAoKl9iZmRfcmVhZF9hcl9oZHJfZm4pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJmZCAqICAgICgqb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKSBQQVJBTVMgKChiZmQgKmFyY2gsIGJmZCAqcHJldikpOwotI2RlZmluZSBiZmRfZ2V0X2VsdF9hdF9pbmRleChiLGkpIEJGRF9TRU5EKGIsIF9iZmRfZ2V0X2VsdF9hdF9pbmRleCwgKGIsaSkpCi0gIGJmZCAqICAgICgqX2JmZF9nZXRfZWx0X2F0X2luZGV4KSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLSAgaW50ICAgICAgKCpfYmZkX3N0YXRfYXJjaF9lbHQpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0gIGJvb2xlYW4gICgqX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKSBQQVJBTVMgKChiZmQgKikpOwotCi0gICAvKiBFbnRyeSBwb2ludHMgdXNlZCBmb3Igc3ltYm9scy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMoTkFNRSlcCi1DQVQoTkFNRSxfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2dldF9zeW10YWIpLFwKLUNBVChOQU1FLF9tYWtlX2VtcHR5X3N5bWJvbCksXAotQ0FUKE5BTUUsX3ByaW50X3N5bWJvbCksXAotQ0FUKE5BTUUsX2dldF9zeW1ib2xfaW5mbyksXAotQ0FUKE5BTUUsX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSxcCi1DQVQoTkFNRSxfZ2V0X2xpbmVubyksXAotQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCi1DQVQoTkFNRSxfYmZkX21ha2VfZGVidWdfc3ltYm9sKSxcCi1DQVQoTkFNRSxfcmVhZF9taW5pc3ltYm9scyksXAotQ0FUKE5BTUUsX21pbmlzeW1ib2xfdG9fc3ltYm9sKQotICBsb25nICAoKl9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIpIFBBUkFNUyAoKGJmZCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqCi0gICAgICAgICAgICAgICAgKCpfYmZkX21ha2VfZW1wdHlfc3ltYm9sKSBQQVJBTVMgKChiZmQgKikpOwotICB2b2lkICAgICAgICAgICgqX2JmZF9wcmludF9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci0jZGVmaW5lIGJmZF9wcmludF9zeW1ib2woYixwLHMsZSkgQkZEX1NFTkQoYiwgX2JmZF9wcmludF9zeW1ib2wsIChiLHAscyxlKSkKLSAgdm9pZCAgICAgICAgICAoKl9iZmRfZ2V0X3N5bWJvbF9pbmZvKSBQQVJBTVMgKChiZmQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfaW5mbyAqKSk7Ci0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2luZm8oYixwLGUpIEJGRF9TRU5EKGIsIF9iZmRfZ2V0X3N5bWJvbF9pbmZvLCAoYixwLGUpKQotICBib29sZWFuICAgICAgICgqX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgYWxlbnQgKiAgICAoKl9nZXRfbGluZW5vKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKSk7Ci0gIGJvb2xlYW4gICAgKCpfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZWMgKnNlY3Rpb24sIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICBiZmRfdm1hIG9mZnNldCwgQ09OU1QgY2hhciAqKmZpbGUsIENPTlNUIGNoYXIgKipmdW5jLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLSAgLyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLSAgICB3aGlsZSB1c2luZyBCRkQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gIEN1cnJlbnRseSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIKLSAgICB3aGVuIGNyZWF0aW5nIENPRkYgZmlsZXMuICAqLwotICBhc3ltYm9sICogICgqX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCkgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIHZvaWQgKnB0ciwKLSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKLSNkZWZpbmUgYmZkX3JlYWRfbWluaXN5bWJvbHMoYiwgZCwgbSwgcykgXAotICBCRkRfU0VORCAoYiwgX3JlYWRfbWluaXN5bWJvbHMsIChiLCBkLCBtLCBzKSkKLSAgbG9uZyAgKCpfcmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKikpOwotI2RlZmluZSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2woYiwgZCwgbSwgZikgXAotICBCRkRfU0VORCAoYiwgX21pbmlzeW1ib2xfdG9fc3ltYm9sLCAoYiwgZCwgbSwgZikpCi0gIGFzeW1ib2wgKigqX21pbmlzeW1ib2xfdG9fc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bWJvbCAqKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIGZvciByZWxvY3MuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MoTkFNRSlcCi1DQVQoTkFNRSxfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCi1DQVQoTkFNRSxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBsb25nICAoKl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBhcmVsZW50ICoqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0gICAvKiBTZWUgZG9jdW1lbnRhdGlvbiBvbiByZWxvYyB0eXBlcy4gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKgotICAgICAgICgqcmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi0gICAvKiBSb3V0aW5lcyB1c2VkIHdoZW4gd3JpdGluZyBhbiBvYmplY3QgZmlsZS4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1dSSVRFKE5BTUUpXAotQ0FUKE5BTUUsX3NldF9hcmNoX21hY2gpLFwKLUNBVChOQU1FLF9zZXRfc2VjdGlvbl9jb250ZW50cykKLSAgYm9vbGVhbiAgICAoKl9iZmRfc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZykpOwotICBib29sZWFuICAgICAgICgqX2JmZF9zZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotICAgLyogUm91dGluZXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfTElOSyhOQU1FKVwKLUNBVChOQU1FLF9zaXplb2ZfaGVhZGVycyksXAotQ0FUKE5BTUUsX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLFwKLUNBVChOQU1FLF9iZmRfcmVsYXhfc2VjdGlvbiksXAotQ0FUKE5BTUUsX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSxcCi1DQVQoTkFNRSxfYmZkX2xpbmtfYWRkX3N5bWJvbHMpLFwKLUNBVChOQU1FLF9iZmRfZmluYWxfbGluayksXAotQ0FUKE5BTUUsX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pLFwKLUNBVChOQU1FLF9iZmRfZ2Nfc2VjdGlvbnMpCi0gIGludCAgICAgICAgKCpfYmZkX3NpemVvZl9oZWFkZXJzKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotICBiZmRfYnl0ZSAqICgqX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLSAgICAgICAgICAgICAgICAgICAgYmZkX2J5dGUgKmRhdGEsIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0KLSAgYm9vbGVhbiAgICAoKl9iZmRfcmVsYXhfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKiwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqYWdhaW4pKTsKLQotICAgLyogQ3JlYXRlIGEgaGFzaCB0YWJsZSBmb3IgdGhlIGxpbmtlci4gIERpZmZlcmVudCBiYWNrZW5kcyBzdG9yZQotICAgICBkaWZmZXJlbnQgaW5mb3JtYXRpb24gaW4gdGhpcyB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLQotICAgLyogQWRkIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGhhc2ggdGFibGUuICAqLwotICBib29sZWFuICgqX2JmZF9saW5rX2FkZF9zeW1ib2xzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gICAvKiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0gICAgIHNlY3Rpb24gb2YgdGhlIEJGRC4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2ZpbmFsX2xpbmspIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSAgIC8qIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpOwotCi0gICAvKiBSZW1vdmUgc2VjdGlvbnMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgZnJvbSB0aGUgb3V0cHV0LiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfZ2Nfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIHRvIGhhbmRsZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJlbG9jcy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMoTkFNRSlcCi1DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKSxcCi1DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLSAgIC8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICovCi0gIGxvbmcgICgqX2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKQotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0gICAvKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBSZWFkIGluIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLSAgICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotCi0gIC8qIE9wcG9zaXRlIGVuZGlhbiB2ZXJzaW9uIG9mIHRoaXMgdGFyZ2V0LiAgKi8gIAotIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICogYWx0ZXJuYXRpdmVfdGFyZ2V0OwotIAotIFBUUiBiYWNrZW5kX2RhdGE7Ci0gCi19IGJmZF90YXJnZXQ7Ci1ib29sZWFuIAotYmZkX3NldF9kZWZhdWx0X3RhcmdldCAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9maW5kX3RhcmdldCBQQVJBTVMgKChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKSk7Ci0KLWNvbnN0IGNoYXIgKioKLWJmZF90YXJnZXRfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKiAKLWJmZF9zZWFyY2hfZm9yX3RhcmdldCAgUEFSQU1TICgoaW50ICgqIHNlYXJjaF9mdW5jKShjb25zdCBiZmRfdGFyZ2V0ICosIHZvaWQgKiksIHZvaWQgKikpOwotCi1ib29sZWFuIAotYmZkX2NoZWNrX2Zvcm1hdCBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCwgY2hhciAqKiptYXRjaGluZykpOwotCi1ib29sZWFuIAotYmZkX3NldF9mb3JtYXQgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCkpOwotCi1DT05TVCBjaGFyICoKLWJmZF9mb3JtYXRfc3RyaW5nIFBBUkFNUyAoKGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLQotLyogUmV0dXJuIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYQotICAgY29weSBvZiBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcy4gIFJldHVybiAtMSBpZiBhbiBlcnJvcgotICAgb2NjdXJzOyBiZmRfZ2V0X2Vycm9yIHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNvZGUuICAqLwotZXh0ZXJuIGxvbmcgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogQ29weSBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcyB0byAqUEhEUlMuICBUaGUgZW50cmllcwotICAgd2lsbCBiZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgRWxmX0ludGVybmFsX1BoZHIgc3RydWN0dXJlcywgYXMKLSAgIGRlZmluZWQgaW4gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4gIFRvIGZpbmQgb3V0IGhvdyBsYXJnZSB0aGUKLSAgIGJ1ZmZlciBuZWVkcyB0byBiZSwgY2FsbCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHJlYWQsIG9yIC0xIGlmIGFuCi0gICBlcnJvciBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1leHRlcm4gaW50IGJmZF9nZXRfZWxmX3BoZHJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqcGhkcnMpKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvYmZkLmMgYi9iZmQvYmZkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDE3MmYuLjAwMDAwMDAKLS0tIGEvYmZkL2JmZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MyArMCwwIEBACi0vKiBHZW5lcmljIEJGRCBsaWJyYXJ5IGludGVyZmFjZSBhbmQgc3VwcG9ydCByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQk8PHR5cGVkZWYgYmZkPj4KLQotCUEgQkZEIGhhcyB0eXBlIDw8YmZkPj47IG9iamVjdHMgb2YgdGhpcyB0eXBlIGFyZSB0aGUKLQljb3JuZXJzdG9uZSBvZiBhbnkgYXBwbGljYXRpb24gdXNpbmcgQkZELiBVc2luZyBCRkQKLQljb25zaXN0cyBvZiBtYWtpbmcgcmVmZXJlbmNlcyB0aG91Z2ggdGhlIEJGRCBhbmQgdG8gZGF0YSBpbiB0aGUgQkZELgotCi0JSGVyZSBpcyB0aGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyB0aGUgdHlwZSA8PGJmZD4+LiAgSXQKLQljb250YWlucyB0aGUgbWFqb3IgZGF0YSBhYm91dCB0aGUgZmlsZSBhbmQgcG9pbnRlcnMKLQl0byB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLgotLnN0cnVjdCBfYmZkIAotLnsKLS4gICAgeyogVGhlIGZpbGVuYW1lIHRoZSBhcHBsaWNhdGlvbiBvcGVuZWQgdGhlIEJGRCB3aXRoLiAgKn0KLS4gICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAotLgotLiAgICB7KiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBqdW1wIHRhYmxlLiAgICAgICAgICAgICAqfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLS4KLS4gICAgeyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0Ci0uICAgICAgIGluY2x1ZGVzIGA8PGJmZC5oPj4nLCBJT1NUUkVBTSBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhICJjaGFyCi0uICAgICAgICoiLCBhbmQgTVRJTUUgYXMgYSAibG9uZyIuICBUaGVpciBjb3JyZWN0IHR5cGVzLCB0byB3aGljaCB0aGV5Ci0uICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCi0uICAgICAgIGlzIHRoZSByZXN1bHQgb2YgYW4gZm9wZW4gb24gdGhlIGZpbGVuYW1lLiAgSG93ZXZlciwgaWYgdGhlCi0uICAgICAgIEJGRF9JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoZW4gaW9zdHJlYW0gaXMgYWN0dWFsbHkgYSBwb2ludGVyCi0uICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqfQotLiAgICBQVFIgaW9zdHJlYW07Ci0uCi0uICAgIHsqIElzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgY2FjaGVkPyAgVGhhdCBpcywgY2FuIGl0IGJlIGNsb3NlZCBhcwotLiAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICp9Ci0uCi0uICAgIGJvb2xlYW4gY2FjaGVhYmxlOwotLgotLiAgICB7KiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQotLiAgICAgICBCRkQgd2FzIG9wZW5lZC4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB3aGljaCBtYXRjaGluZyBhbGdvcml0aG0KLS4gICAgICAgdG8gdXNlIHRvIGNob29zZSB0aGUgYmFjayBlbmQuICp9Ci0uCi0uICAgIGJvb2xlYW4gdGFyZ2V0X2RlZmF1bHRlZDsKLS4KLS4gICAgeyogVGhlIGNhY2hpbmcgcm91dGluZXMgdXNlIHRoZXNlIHRvIG1haW50YWluIGEKLS4gICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKn0KLS4KLS4gICAgc3RydWN0IF9iZmQgKmxydV9wcmV2LCAqbHJ1X25leHQ7Ci0uCi0uICAgIHsqIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKLS4gICAgICAgc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGZpbGUgaGVyZTogKn0KLS4KLS4gICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogYW5kIGhlcmU6IChgYG9uY2UnJyBtZWFucyBhdCBsZWFzdCBvbmNlKSAqfQotLgotLiAgICBib29sZWFuIG9wZW5lZF9vbmNlOwotLgotLiAgICB7KiBTZXQgaWYgd2UgaGF2ZSBhIGxvY2FsbHkgbWFpbnRhaW5lZCBtdGltZSB2YWx1ZSwgcmF0aGVyIHRoYW4KLS4gICAgICAgZ2V0dGluZyBpdCBmcm9tIHRoZSBmaWxlIGVhY2ggdGltZTogKn0KLS4KLS4gICAgYm9vbGVhbiBtdGltZV9zZXQ7Ci0uCi0uICAgIHsqIEZpbGUgbW9kaWZpZWQgdGltZSwgaWYgbXRpbWVfc2V0IGlzIHRydWU6ICp9Ci0uCi0uICAgIGxvbmcgbXRpbWU7ICAgICAgICAgIAotLgotLiAgICB7KiBSZXNlcnZlZCBmb3IgYW4gdW5pbXBsZW1lbnRlZCBmaWxlIGxvY2tpbmcgZXh0ZW5zaW9uLip9Ci0uCi0uICAgIGludCBpZmQ7Ci0uCi0uICAgIHsqIFRoZSBmb3JtYXQgd2hpY2ggYmVsb25ncyB0byB0aGUgQkZELiAob2JqZWN0LCBjb3JlLCBldGMuKSAqfQotLgotLiAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLS4KLS4gICAgeyogVGhlIGRpcmVjdGlvbiB0aGUgQkZEIHdhcyBvcGVuZWQgd2l0aCp9Ci0uCi0uICAgIGVudW0gYmZkX2RpcmVjdGlvbiB7bm9fZGlyZWN0aW9uID0gMCwKLS4gICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RpcmVjdGlvbiA9IDEsCi0uICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKLS4gICAgICAgICAgICAgICAgICAgICAgICBib3RoX2RpcmVjdGlvbiA9IDN9IGRpcmVjdGlvbjsKLS4KLS4gICAgeyogRm9ybWF0X3NwZWNpZmljIGZsYWdzKn0KLS4KLS4gICAgZmxhZ3dvcmQgZmxhZ3M7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogQ3VycmVudGx5IG15X2FyY2hpdmUgaXMgdGVzdGVkIGJlZm9yZSBhZGRpbmcgb3JpZ2luIHRvCi0uICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgotLiAgICAgICBvcmlnaW4sIHdpdGggb3JpZ2luIHNldCB0byAwIGZvciBub24gYXJjaGl2ZSBmaWxlcy4gICAqfQotLgotLiAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAotLgotLiAgICB7KiBSZW1lbWJlciB3aGVuIG91dHB1dCBoYXMgYmVndW4sIHRvIHN0b3Agc3RyYW5nZSB0aGluZ3MKLS4gICAgICAgZnJvbSBoYXBwZW5pbmcuICp9Ci0uICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKLS4KLS4gICAgeyogUG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyp9Ci0uICAgIHN0cnVjdCBzZWMgICpzZWN0aW9uczsKLS4KLS4gICAgeyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqfQotLiAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLS4KLS4gICAgeyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIG9iamVjdCBmaWxlczogCi0uICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqfQotLiAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0uCi0uICAgIHsqIFVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQqfQotLiAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci0uCi0uICAgIHsqIFN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IEJGRCAod2l0aCBzeW1jb3VudCBlbnRyaWVzKSAqfQotLiAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqKm91dHN5bWJvbHM7ICAgICAgICAgICAgIAotLgotLiAgICB7KiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaF9pbmZvOwotLgotLiAgICB7KiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3IgYXJjaGl2ZXM6Kn0KLS4gICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKLS4gICAgc3RydWN0IF9iZmQgKm15X2FyY2hpdmU7ICAgICB7KiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICp9Ci0uICAgIHN0cnVjdCBfYmZkICpuZXh0OyAgICAgICAgICAgeyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgc3RydWN0IF9iZmQgKmFyY2hpdmVfaGVhZDsgICB7KiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgYm9vbGVhbiBoYXNfYXJtYXA7ICAgICAgICAgICAKLS4KLS4gICAgeyogQSBjaGFpbiBvZiBCRkQgc3RydWN0dXJlcyBpbnZvbHZlZCBpbiBhIGxpbmsuICAqfQotLiAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OwotLgotLiAgICB7KiBBIGZpZWxkIHVzZWQgYnkgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gIFRoaXMgd2lsbAotLiAgICAgICBiZSB1c2VkIG9ubHkgZm9yIGFyY2hpdmUgZWxlbWVudHMuICAqfQotLiAgICBpbnQgYXJjaGl2ZV9wYXNzOwotLgotLiAgICB7KiBVc2VkIGJ5IHRoZSBiYWNrIGVuZCB0byBob2xkIHByaXZhdGUgZGF0YS4gKn0KLS4KLS4gICAgdW5pb24gCi0uICAgICAgewotLiAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICphb3V0X2RhdGE7Ci0uICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgX29hc3lzX2RhdGEgKm9hc3lzX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSAqb2FzeXNfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgcGVfdGRhdGEgKnBlX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdCAqaWVlZV9kYXRhOwotLiAgICAgIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0ICppZWVlX2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqaWhleF9kYXRhOwotLiAgICAgIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QgKnRla2hleF9kYXRhOwotLiAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKm5sbV9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqYm91dF9kYXRhOwotLiAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKnNjbzVfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICp0cmFkX2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKLS4gICAgICBzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAqaHB1eF9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmhwcGFic2RfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKmx5bnhfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKm9zZl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0ICp2ZXJzYWRvc19kYXRhOwotLiAgICAgIHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgKm5ldGJzZF9jb3JlX2RhdGE7Ci0uICAgICAgUFRSIGFueTsKLS4gICAgICB9IHRkYXRhOwotLiAgCi0uICAgIHsqIFVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGhvbGQgcHJpdmF0ZSBkYXRhKn0KLS4gICAgUFRSIHVzcmRhdGE7Ci0uCi0uICB7KiBXaGVyZSBhbGwgdGhlIGFsbG9jYXRlZCBzdHVmZiB1bmRlciB0aGlzIEJGRCBnb2VzLiAgVGhpcyBpcyBhCi0uICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKiwgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2YKLS4gICAgIG9iamFsbG9jLmguICAqfQotLiAgICBQVFIgbWVtb3J5OwotLn07Ci0uCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jdW5kZWYgb2JqX3N5bWJvbHMKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotDAotLyogcHJvdmlkZSBzdG9yYWdlIGZvciBzdWJzeXN0ZW0sIHN0YWNrIGFuZCBoZWFwIGRhdGEgd2hpY2ggbWF5IGhhdmUgYmVlbgotICAgcGFzc2VkIGluIG9uIHRoZSBjb21tYW5kIGxpbmUuICBMZCBwdXRzIHRoaXMgZGF0YSBpbnRvIGEgYmZkX2xpbmtfaW5mbwotICAgc3RydWN0IHdoaWNoIHVsdGltYXRlbHkgZ2V0cyBwYXNzZWQgaW4gdG8gdGhlIGJmZC4gIFdoZW4gaXQgYXJyaXZlcywgY29weQotICAgaXQgdG8gdGhlIGZvbGxvd2luZyBzdHJ1Y3Qgc28gdGhhdCB0aGUgZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSBpbiBjb2ZmY29kZS5oCi0gICB3aGVyZSBpdCBpcyBuZWVkZWQuICBUaGUgdHlwZWRlZidzIHVzZWQgYXJlIGRlZmluZWQgaW4gYmZkLmggKi8KLQotCi0MCi0vKgotU0VDVElPTgotCUVycm9yIHJlcG9ydGluZwotCi0JTW9zdCBCRkQgZnVuY3Rpb25zIHJldHVybiBub256ZXJvIG9uIHN1Y2Nlc3MgKGNoZWNrIHRoZWlyCi0JaW5kaXZpZHVhbCBkb2N1bWVudGF0aW9uIGZvciBwcmVjaXNlIHNlbWFudGljcykuICBPbiBhbiBlcnJvciwKLQl0aGV5IGNhbGwgPDxiZmRfc2V0X2Vycm9yPj4gdG8gc2V0IGFuIGVycm9yIGNvbmRpdGlvbiB0aGF0IGNhbGxlcnMKLQljYW4gY2hlY2sgYnkgY2FsbGluZyA8PGJmZF9nZXRfZXJyb3I+Pi4KLSAgICAgICAgSWYgdGhhdCByZXR1cm5zIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4sIHRoZW4gY2hlY2sKLQk8PGVycm5vPj4uCi0KLQlUaGUgZWFzaWVzdCB3YXkgdG8gcmVwb3J0IGEgQkZEIGVycm9yIHRvIHRoZSB1c2VyIGlzIHRvCi0JdXNlIDw8YmZkX3BlcnJvcj4+LgotCi1TVUJTRUNUSU9OCi0JVHlwZSA8PGJmZF9lcnJvcl90eXBlPj4KLQotCVRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgPDxiZmRfZ2V0X2Vycm9yPj4gYXJlIGRlZmluZWQgYnkgdGhlCi0JZW51bWVyYXRlZCB0eXBlIDw8YmZkX2Vycm9yX3R5cGU+Pi4KLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfZXJyb3IKLS57Ci0uICBiZmRfZXJyb3Jfbm9fZXJyb3IgPSAwLAotLiAgYmZkX2Vycm9yX3N5c3RlbV9jYWxsLAotLiAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotLiAgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCwKLS4gIGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19tZW1vcnksCi0uICBiZmRfZXJyb3Jfbm9fc3ltYm9scywKLS4gIGJmZF9lcnJvcl9ub19hcm1hcCwKLS4gIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAotLiAgYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlLAotLiAgYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQsCi0uICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAotLiAgYmZkX2Vycm9yX25vX2NvbnRlbnRzLAotLiAgYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAotLiAgYmZkX2Vycm9yX2JhZF92YWx1ZSwKLS4gIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwKLS4gIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCi0uICBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlCi0ufSBiZmRfZXJyb3JfdHlwZTsKLS4KLSovCi0KLXN0YXRpYyBiZmRfZXJyb3JfdHlwZSBiZmRfZXJyb3IgPSBiZmRfZXJyb3Jfbm9fZXJyb3I7Ci0KLUNPTlNUIGNoYXIgKkNPTlNUIGJmZF9lcnJtc2dzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gZXJyb3IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJTeXN0ZW0gY2FsbCBlcnJvciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkludmFsaWQgYmZkIHRhcmdldCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgaW4gd3JvbmcgZm9ybWF0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiSW52YWxpZCBvcGVyYXRpb24iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJNZW1vcnkgZXhoYXVzdGVkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gc3ltYm9scyIpLAotCQkJTl8oIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJObyBtb3JlIGFyY2hpdmVkIGZpbGVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTWFsZm9ybWVkIGFyY2hpdmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIlNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIpLAotCQkJTl8oIlN5bWJvbCBuZWVkcyBkZWJ1ZyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGV4aXN0IiksCi0JCQlOXygiQmFkIHZhbHVlIiksCi0JCQlOXygiRmlsZSB0cnVuY2F0ZWQiKSwKLQkJCU5fKCJGaWxlIHRvbyBiaWciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCIjPEludmFsaWQgZXJyb3IgY29kZT4iKQotICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0JYmZkX2Vycm9yX3R5cGUgYmZkX2dldF9lcnJvciAodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBjdXJyZW50IEJGRCBlcnJvciBjb25kaXRpb24uCi0qLwotCi1iZmRfZXJyb3JfdHlwZQotYmZkX2dldF9lcnJvciAoKQotewotICByZXR1cm4gYmZkX2Vycm9yOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgQkZEIGVycm9yIGNvbmRpdGlvbiB0byBiZSBAdmFye2Vycm9yX3RhZ30uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yIChlcnJvcl90YWcpCi0gICAgIGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZzsKLXsKLSAgYmZkX2Vycm9yID0gZXJyb3JfdGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZXJybXNnCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2Vycm1zZyAoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgQHZhcntlcnJvcl90YWd9LCBvcgotCXRoZSBzeXN0ZW0gZXJyb3IgaWYgQHZhcntlcnJvcl90YWd9IGlzIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4uCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9lcnJtc2cgKGVycm9yX3RhZykKLSAgICAgYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnOwotewotI2lmbmRlZiBlcnJubwotICBleHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0gIGlmIChlcnJvcl90YWcgPT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgIHJldHVybiB4c3RyZXJyb3IgKGVycm5vKTsKLQotICBpZiAoKCgoaW50KWVycm9yX3RhZyA8KGludCkgYmZkX2Vycm9yX25vX2Vycm9yKSB8fAotICAgICAgICgoaW50KWVycm9yX3RhZyA+IChpbnQpYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZSkpKQotICAgIGVycm9yX3RhZyA9IGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGU7Lyogc2FuaXR5IGNoZWNrICovCi0KLSAgcmV0dXJuIF8oYmZkX2Vycm1zZ3MgWyhpbnQpZXJyb3JfdGFnXSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wZXJyb3IKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wZXJyb3IgKENPTlNUIGNoYXIgKm1lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUKLQlsYXN0IEJGRCBlcnJvciB0aGF0IG9jY3VycmVkLCBvciB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaWYKLQl0aGUgbGFzdCBCRkQgZXJyb3Igd2FzIGEgc3lzdGVtIGNhbGwgZmFpbHVyZS4gIElmIEB2YXJ7bWVzc2FnZX0KLQlpcyBub24tTlVMTCBhbmQgbm9uLWVtcHR5LCB0aGUgZXJyb3Igc3RyaW5nIHByaW50ZWQgaXMgcHJlY2VkZWQKLQlieSBAdmFye21lc3NhZ2V9LCBhIGNvbG9uLCBhbmQgYSBzcGFjZS4gIEl0IGlzIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KLSovCi0KLXZvaWQKLWJmZF9wZXJyb3IgKG1lc3NhZ2UpCi0gICAgIENPTlNUIGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICBwZXJyb3IoKGNoYXIgKiltZXNzYWdlKTsgICAgICAgICAgICAvKiBtdXN0IGJlIHN5c3RlbSBlcnJvciB0aGVuLi4uICovCi0gIGVsc2UgewotICAgIGlmIChtZXNzYWdlID09IE5VTEwgfHwgKm1lc3NhZ2UgPT0gJ1wwJykKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLX0KLQotLyoKLVNVQlNFQ1RJT04KLQlCRkQgZXJyb3IgaGFuZGxlcgotCi0JU29tZSBCRkQgZnVuY3Rpb25zIHdhbnQgdG8gcHJpbnQgbWVzc2FnZXMgZGVzY3JpYmluZyB0aGUKLQlwcm9ibGVtLiAgVGhleSBjYWxsIGEgQkZEIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uICBUaGlzCi0JZnVuY3Rpb24gbWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgcHJvZ3JhbS4KLQotCVRoZSBCRkQgZXJyb3IgaGFuZGxlciBhY3RzIGxpa2UgcHJpbnRmLgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiB2b2lkICgqYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLS4KLSovCi0KLS8qIFRoZSBwcm9ncmFtIG5hbWUgdXNlZCB3aGVuIHByaW50aW5nIEJGRCBlcnJvciBtZXNzYWdlcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZTsKLQotLyogVGhpcyBpcyB0aGUgZGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBCRkQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0KLXN0YXRpYyB2b2lkIF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnMsIC4uLikpOwotCi1zdGF0aWMgdm9pZAotX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgKGNvbnN0IGNoYXIgKnMsIC4uLikKLXsKLSAgdmFfbGlzdCBwOwotCi0gIGlmIChfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCRkQ6ICIpOwotCi0gIHZhX3N0YXJ0IChwLCBzKTsKLQotICB2ZnByaW50ZiAoc3RkZXJyLCBzLCBwKTsKLQotICB2YV9lbmQgKHApOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSAqLwotCi1zdGF0aWMgdm9pZCBfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciAoKTsKLQotc3RhdGljIHZvaWQKLV9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgcDsKLSAgY29uc3QgY2hhciAqczsKLQotICBpZiAoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiQkZEOiAiKTsKLQotICB2YV9zdGFydCAocCk7Ci0KLSAgcyA9IHZhX2FyZyAocCwgY29uc3QgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgcywgcCk7Ci0KLSAgdmFfZW5kIChwKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChBTlNJX1BST1RPVFlQRVMpICovCi0KLS8qIFRoaXMgaXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSByb3V0aW5lIHdoaWNoIHNob3VsZCBoYW5kbGUgQkZECi0gICBlcnJvciBtZXNzYWdlcy4gIEl0IGlzIGNhbGxlZCB3aGVuIGEgQkZEIHJvdXRpbmUgZW5jb3VudGVycyBhbgotICAgZXJyb3IgZm9yIHdoaWNoIGl0IHdhbnRzIHRvIHByaW50IGEgbWVzc2FnZS4gIEdvaW5nIHRocm91Z2ggYQotICAgZnVuY3Rpb24gcG9pbnRlciBwZXJtaXRzIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBCRkQgdG8gaW50ZXJjZXB0Ci0gICB0aGUgbWVzc2FnZXMgYW5kIGRlYWwgd2l0aCB0aGVtIGl0c2VsZi4gICovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyID0gX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXI7Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX3NldF9lcnJvcl9oYW5kbGVyIChiZmRfZXJyb3JfaGFuZGxlcl90eXBlKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLiAgUmV0dXJucyB0aGUgcHJldmlvdXMKLQlmdW5jdGlvbi4KLSovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUKLWJmZF9zZXRfZXJyb3JfaGFuZGxlciAocG5ldykKLSAgICAgYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBwbmV3OwotewotICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBvbGQ7Ci0KLSAgcG9sZCA9IF9iZmRfZXJyb3JfaGFuZGxlcjsKLSAgX2JmZF9lcnJvcl9oYW5kbGVyID0gcG5ldzsKLSAgcmV0dXJuIHBvbGQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAoY29uc3QgY2hhciAqKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIHByb2dyYW0gbmFtZSB0byB1c2Ugd2hlbiBwcmludGluZyBhIEJGRCBlcnJvci4gIFRoaXMKLQlpcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IgbWVzc2FnZSBmb2xsb3dlZCBieSBhIGNvbG9uIGFuZAotCXNwYWNlLiAgVGhlIHN0cmluZyBtdXN0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGlzIHBhc3NlZCB0bwotCXRoaXMgZnVuY3Rpb24uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgPSBuYW1lOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX2dldF9lcnJvcl9oYW5kbGVyICh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLgotKi8KLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZQotYmZkX2dldF9lcnJvcl9oYW5kbGVyICgpCi17Ci0gIHJldHVybiBfYmZkX2Vycm9yX2hhbmRsZXI7Ci19Ci0MCi0vKgotU0VDVElPTgotCVN5bWJvbHMKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlCi0JcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBAdmFye3NlY3R9Ci0JYXR0YWNoZWQgdG8gYmZkIEB2YXJ7YWJmZH0uICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4KLQotKi8KLQotCi1sb25nCi1iZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2dldF9yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQsIGFzZWN0KSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9jYW5vbmljYWxpemVfcmVsb2MKLSAgICAgICAgCShiZmQgKmFiZmQsCi0JCWFzZWN0aW9uICpzZWMsCi0JCWFyZWxlbnQgKipsb2MsCi0JCWFzeW1ib2wJKipzeW1zKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZECi0JQHZhcnthYmZkfSBhbmQgdHJhbnNsYXRlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSByZWxvY2F0aW9uCi0JaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gQHZhcntzZWN9IGludG8gdGhlIGludGVybmFsIGNhbm9uaWNhbAotCWZvcm0uICBQbGFjZSB0aGUgdGFibGUgaW50byBtZW1vcnkgYXQgQHZhcntsb2N9LCB3aGljaCBoYXMKLQliZWVuIHByZWFsbG9jYXRlZCwgdXN1YWxseSBieSBhIGNhbGwgdG8KLQk8PGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQ+Pi4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZWxvY3MsIG9yCi0JLTEgb24gZXJyb3IuCi0KLQlUaGUgQHZhcntzeW1zfSB0YWJsZSBpcyBhbHNvIG5lZWRlZCBmb3IgaG9ycmlibGUgaW50ZXJuYWwgbWFnaWMKLQlyZWFzb25zLgotCi0KLSovCi1sb25nCi1iZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBhc2VjdCwgbG9jYXRpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLQkJICAgKGFiZmQsIGFzZWN0LCBsb2NhdGlvbiwgc3ltYm9scykpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3JlbG9jCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X3JlbG9jCi0JICAoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBhcmVsZW50ICoqcmVsLCB1bnNpZ25lZCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSByZWxvY2F0aW9uIHBvaW50ZXIgYW5kIGNvdW50IHdpdGhpbgotCXNlY3Rpb24gQHZhcntzZWN9IHRvIHRoZSB2YWx1ZXMgQHZhcntyZWx9IGFuZCBAdmFye2NvdW50fS4KLQlUaGUgYXJndW1lbnQgQHZhcnthYmZkfSBpcyBpZ25vcmVkLgotCi0qLwotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfc2V0X3JlbG9jIChpZ25vcmVfYWJmZCwgYXNlY3QsIGxvY2F0aW9uLCBjb3VudCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhcmVsZW50ICoqbG9jYXRpb247Ci0gICAgIHVuc2lnbmVkIGludCBjb3VudDsKLXsKLSAgYXNlY3QtPm9yZWxvY2F0aW9uID0gbG9jYXRpb247Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2ZpbGVfZmxhZ3MKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfZmlsZV9mbGFncyhiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGZsYWcgd29yZCBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LgotCi0JUG9zc2libGUgZXJyb3JzIGFyZToKLQlvIDw8YmZkX2Vycm9yX3dyb25nX2Zvcm1hdD4+IC0gVGhlIHRhcmdldCBiZmQgd2FzIG5vdCBvZiBvYmplY3QgZm9ybWF0LgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtIFRoZSB0YXJnZXQgYmZkIHdhcyBvcGVuIGZvciByZWFkaW5nLgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JVGhlIGZsYWcgd29yZCBjb250YWluZWQgYSBiaXQgd2hpY2ggd2FzIG5vdCBhcHBsaWNhYmxlIHRvIHRoZQotCXR5cGUgb2YgZmlsZS4gIEUuZy4sIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gc2V0IHRoZSA8PERfUEFHRUQ+PiBiaXQKLQlvbiBhIEJGRCBmb3JtYXQgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBkZW1hbmQgcGFnaW5nLgotCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2ZpbGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYmZkX3JlYWRfcCAoYWJmZCkpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgPSBmbGFnczsKLSAgaWYgKChmbGFncyAmIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MgKGFiZmQpKSAhPSBmbGFncykgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLXJldHVybiB0cnVlOwotfQotCi12b2lkCi1iZmRfYXNzZXJ0IChmaWxlLCBsaW5lKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBpbnQgbGluZTsKLXsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJiZmQgYXNzZXJ0aW9uIGZhaWwgJXM6JWQiKSwgZmlsZSwgbGluZSk7Ci19Ci0KLS8qIEEgbW9yZSBvciBsZXNzIGZyaWVuZGx5IGFib3J0IG1lc3NhZ2UuICBJbiBsaWJiZmQuaCBhYm9ydCBpcwotICAgZGVmaW5lZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24uICAqLwotCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX0ZBSUxVUkUgMQotI2VuZGlmCi0KLXZvaWQKLV9iZmRfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBpbnQgbGluZTsKLSAgICAgY29uc3QgY2hhciAqZm47Ci17Ci0gIGlmIChmbiAhPSBOVUxMKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgKF8oIkJGRCBpbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIiksCi0gICAgICAgZmlsZSwgbGluZSwgZm4pOwotICBlbHNlCi0gICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAoXygiQkZEIGludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iKSwKLSAgICAgICBmaWxlLCBsaW5lKTsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zdGFydF9hZGRyZXNzCi0KLVNZTk9QU0lTCi0gCWJvb2xlYW4gYmZkX3NldF9zdGFydF9hZGRyZXNzKGJmZCAqYWJmZCwgYmZkX3ZtYSB2bWEpOwotCi1ERVNDUklQVElPTgotCU1ha2UgQHZhcnt2bWF9IHRoZSBlbnRyeSBwb2ludCBvZiBvdXRwdXQgQkZEIEB2YXJ7YWJmZH0uCi0KLVJFVFVSTlMKLQlSZXR1cm5zIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvdGhlcndpc2UuCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCwgdm1hKQotYmZkICphYmZkOwotYmZkX3ZtYSB2bWE7Ci17Ci0gIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSB2bWE7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfbXRpbWUKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfbXRpbWUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgKGFzIHJlYWQgZnJvbSB0aGUgZmlsZSBzeXN0ZW0sIG9yCi0JZnJvbSB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIGFyY2hpdmUgbWVtYmVycykuCi0KLSovCi0KLWxvbmcKLWJmZF9nZXRfbXRpbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRklMRSAqZnA7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICBpZiAoYWJmZC0+bXRpbWVfc2V0KQotICAgIHJldHVybiBhYmZkLT5tdGltZTsKLQotICBmcCA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICBpZiAoMCAhPSBmc3RhdCAoZmlsZW5vIChmcCksICZidWYpKQotICAgIHJldHVybiAwOwotCi0gIGFiZmQtPm10aW1lID0gYnVmLnN0X210aW1lOwkJLyogU2F2ZSB2YWx1ZSBpbiBjYXNlIGFueW9uZSB3YW50cyBpdCAqLwotICByZXR1cm4gYnVmLnN0X210aW1lOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3NpemUKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfc2l6ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgZmlsZSBzaXplIChhcyByZWFkIGZyb20gZmlsZSBzeXN0ZW0pIGZvciB0aGUgZmlsZQotCWFzc29jaWF0ZWQgd2l0aCBCRkQgQHZhcnthYmZkfS4KLQotCVRoZSBpbml0aWFsIG1vdGl2YXRpb24gZm9yLCBhbmQgdXNlIG9mLCB0aGlzIHJvdXRpbmUgaXMgbm90Ci0Jc28gd2UgY2FuIGdldCB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgb2JqZWN0IHRoZSBCRkQgYXBwbGllcyB0bywgc2luY2UKLQl0aGF0IG1pZ2h0IG5vdCBiZSBnZW5lcmFsbHkgcG9zc2libGUgKGFyY2hpdmUgbWVtYmVycyBmb3IgZXhhbXBsZSkuCi0JSXQgd291bGQgYmUgaWRlYWwgaWYgc29tZW9uZSBjb3VsZCBldmVudHVhbGx5IG1vZGlmeQotCWl0IHNvIHRoYXQgc3VjaCByZXN1bHRzIHdlcmUgZ3VhcmFudGVlZC4KLQotCUluc3RlYWQsIHdlIHdhbnQgdG8gYXNrIHF1ZXN0aW9ucyBsaWtlICJpcyB0aGlzIE5OTiBieXRlIHNpemVkCi0Jb2JqZWN0IEknbSBhYm91dCB0byB0cnkgcmVhZCBmcm9tIGZpbGUgb2Zmc2V0IFlZWSByZWFzb25hYmxlPyIKLQlBcyBhcyBleGFtcGxlIG9mIHdoZXJlIHdlIG1pZ2h0IGRvIHRoaXMsIHNvbWUgb2JqZWN0IGZvcm1hdHMKLQl1c2Ugc3RyaW5nIHRhYmxlcyBmb3Igd2hpY2ggdGhlIGZpcnN0IDw8c2l6ZW9mKGxvbmcpPj4gYnl0ZXMgb2YgdGhlCi0JdGFibGUgY29udGFpbiB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgaXRzZWxmLCBpbmNsdWRpbmcgdGhlIHNpemUgYnl0ZXMuCi0JSWYgYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gcmVhZCB3aGF0IGl0IHRoaW5rcyBpcyBvbmUgb2YgdGhlc2UKLQlzdHJpbmcgdGFibGVzLCB3aXRob3V0IHNvbWUgd2F5IHRvIHZhbGlkYXRlIHRoZSBzaXplLCBhbmQgZm9yCi0Jc29tZSByZWFzb24gdGhlIHNpemUgaXMgd3JvbmcgKGJ5dGUgc3dhcHBpbmcgZXJyb3IsIHdyb25nIGxvY2F0aW9uCi0JZm9yIHRoZSBzdHJpbmcgdGFibGUsIGV0Yy4pLCB0aGUgb25seSBjbHVlIGlzIGxpa2VseSB0byBiZSBhIHJlYWQKLQllcnJvciB3aGVuIGl0IHRyaWVzIHRvIHJlYWQgdGhlIHRhYmxlLCBvciBhICJ2aXJ0dWFsIG1lbW9yeQotCWV4aGF1c3RlZCIgZXJyb3Igd2hlbiBpdCB0cmllcyB0byBhbGxvY2F0ZSAxNSBiYXppbGxvbiBieXRlcwotCW9mIHNwYWNlIGZvciB0aGUgMTUgYmF6aWxsb24gYnl0ZSB0YWJsZSBpdCBpcyBhYm91dCB0byByZWFkLgotCVRoaXMgZnVuY3Rpb24gYXQgbGVhc3QgYWxsb3dzIHVzIHRvIGFuc3dlciB0aGUgcXVlc2lvbiwgImlzIHRoZQotCXNpemUgcmVhc29uYWJsZT8iLgotKi8KLQotbG9uZwotYmZkX2dldF9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKmZwOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuICgoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW0pLT5zaXplOwotCi0gIGZwID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGlmICgwICE9IGZzdGF0IChmaWxlbm8gKGZwKSwgJmJ1ZikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIGJ1Zi5zdF9zaXplOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2dwX3NpemUKLQotU1lOT1BTSVMKLQlpbnQgYmZkX2dldF9ncF9zaXplKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQCi0JcmVnaXN0ZXIgdW5kZXIgTUlQUyBFQ09GRi4gIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieSB0aGUgPDwtRz4+Ci0JYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IgbGlua2VyLgotKi8KLQotaW50Ci1iZmRfZ2V0X2dwX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLQlyZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemU7Ci0gICAgICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JcmV0dXJuIGVsZl9ncF9zaXplIChhYmZkKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2dwX3NpemUKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9zZXRfZ3Bfc2l6ZShiZmQgKmFiZmQsIGludCBpKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG9wdGltaXplZCB1c2luZyB0aGUgR1AKLQlyZWdpc3RlciB1bmRlciBFQ09GRiBvciBNSVBTIEVMRi4gIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieQotCXRoZSA8PC1HPj4gYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IgbGlua2VyLgotKi8KLQotdm9pZAotYmZkX3NldF9ncF9zaXplIChhYmZkLCBpKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpOwotewotICAvKiBEb24ndCB0cnkgdG8gc2V0IEdQIHNpemUgb24gYW4gYXJjaGl2ZSBvciBjb3JlIGZpbGUhICovCi0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm47Ci0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLSAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSA9IGk7Ci0gIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICBlbGZfZ3Bfc2l6ZSAoYWJmZCkgPSBpOwotfQotCi0vKiBHZXQgdGhlIEdQIHZhbHVlLiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHNvbWUgb2YgdGhlCi0gICByZWxvY2F0aW9uIHNwZWNpYWxfZnVuY3Rpb24gcm91dGluZXMgb24gdGFyZ2V0cyB3aGljaCBzdXBwb3J0IGEgR1AKLSAgIHJlZ2lzdGVyLiAgKi8KLQotYmZkX3ZtYQotX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLQlyZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXJldHVybiBlbGZfZ3AgKGFiZmQpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUuICAqLwotCi12b2lkCi1fYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgdikKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHY7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm47Ci0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLSAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSB2OwotICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgZWxmX2dwIChhYmZkKSA9IHY7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zY2FuX3ZtYQotCi1TWU5PUFNJUwotCWJmZF92bWEgYmZkX3NjYW5fdm1hKENPTlNUIGNoYXIgKnN0cmluZywgQ09OU1QgY2hhciAqKmVuZCwgaW50IGJhc2UpOwotCi1ERVNDUklQVElPTgotCUNvbnZlcnQsIGxpa2UgPDxzdHJ0b3VsPj4sIGEgbnVtZXJpY2FsIGV4cHJlc3Npb24KLQlAdmFye3N0cmluZ30gaW50byBhIDw8YmZkX3ZtYT4+IGludGVnZXIsIGFuZCByZXR1cm4gdGhhdCBpbnRlZ2VyLgotCShUaG91Z2ggd2l0aG91dCBhcyBtYW55IGJlbGxzIGFuZCB3aGlzdGxlcyBhcyA8PHN0cnRvdWw+Pi4pCi0JVGhlIGV4cHJlc3Npb24gaXMgYXNzdW1lZCB0byBiZSB1bnNpZ25lZCAoaS5lLiwgcG9zaXRpdmUpLgotCUlmIGdpdmVuIGEgQHZhcntiYXNlfSwgaXQgaXMgdXNlZCBhcyB0aGUgYmFzZSBmb3IgY29udmVyc2lvbi4KLQlBIGJhc2Ugb2YgMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIGludGVycHJldCB0aGUgc3RyaW5nCi0JaW4gaGV4IGlmIGEgbGVhZGluZyAiMHgiIG9yICIwWCIgaXMgZm91bmQsIG90aGVyd2lzZQotCWluIG9jdGFsIGlmIGEgbGVhZGluZyB6ZXJvIGlzIGZvdW5kLCBvdGhlcndpc2UgaW4gZGVjaW1hbC4KLQotCU92ZXJmbG93IGlzIG5vdCBkZXRlY3RlZC4KLSovCi0KLWJmZF92bWEKLWJmZF9zY2FuX3ZtYSAoc3RyaW5nLCBlbmQsIGJhc2UpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLSAgICAgQ09OU1QgY2hhciAqKmVuZDsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGludCBkaWdpdDsKLQotICAvKiBMZXQgdGhlIGhvc3QgZG8gaXQgaWYgcG9zc2libGUuICAqLwotICBpZiAoc2l6ZW9mKGJmZF92bWEpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKLSAgICByZXR1cm4gKGJmZF92bWEpIHN0cnRvdWwgKHN0cmluZywgKGNoYXIgKiopIGVuZCwgYmFzZSk7Ci0KLSAgLyogQSBuZWdhdGl2ZSBiYXNlIG1ha2VzIG5vIHNlbnNlLCBhbmQgd2Ugb25seSBuZWVkIHRvIGdvIGFzIGhpZ2ggYXMgaGV4LiAgKi8KLSAgaWYgKChiYXNlIDwgMCkgfHwgKGJhc2UgPiAxNikpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAwOwotCi0gIGlmIChiYXNlID09IDApCi0gICAgewotICAgICAgaWYgKHN0cmluZ1swXSA9PSAnMCcpCi0JewotCSAgaWYgKChzdHJpbmdbMV0gPT0gJ3gnKSB8fCAoc3RyaW5nWzFdID09ICdYJykpCi0JICAgIGJhc2UgPSAxNjsKLQkgIC8qIFhYWCBzaG91bGQgd2UgYWxzbyBhbGxvdyAiMGIiIG9yICIwQiIgdG8gc2V0IGJhc2UgdG8gMj8gKi8KLQkgIGVsc2UKLQkgICAgYmFzZSA9IDg7Ci0JfQotICAgICAgZWxzZQotCWJhc2UgPSAxMDsKLSAgICB9Ci0gIGlmICgoYmFzZSA9PSAxNikgJiYKLSAgICAgIChzdHJpbmdbMF0gPT0gJzAnKSAmJiAoKHN0cmluZ1sxXSA9PSAneCcpIHx8IChzdHJpbmdbMV0gPT0gJ1gnKSkpCi0gICAgc3RyaW5nICs9IDI7Ci0gIC8qIFhYWCBzaG91bGQgd2UgYWxzbyBza2lwIG92ZXIgIjBiIiBvciAiMEIiIGlmIGJhc2UgaXMgMj8gKi8KLSAgICAKLS8qIFNwZWVkIGNvdWxkIGJlIGltcHJvdmVkIHdpdGggYSB0YWJsZSBsaWtlIGhleF92YWx1ZVtdIGluIGdhcy4gICovCi0jZGVmaW5lIEhFWF9WQUxVRShjKSBcCi0gIChpc3hkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpCQkJCQlcCi0gICA/IChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykJCQkJXAotICAgICAgPyAoYyAtICcwJykJCQkJCQlcCi0gICAgICA6ICgxMCArIGMgLSAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSkpCVwKLSAgIDogNDIpCi0KLSAgZm9yICh2YWx1ZSA9IDA7IChkaWdpdCA9IEhFWF9WQUxVRSgqc3RyaW5nKSkgPCBiYXNlOyBzdHJpbmcrKykKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHZhbHVlICogYmFzZSArIGRpZ2l0OwotICAgIH0KLQotICBpZiAoZW5kKQotICAgICplbmQgPSBzdHJpbmc7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGJmZCAqaWJmZCwgYmZkICpvYmZkKTsKLQotREVTQ1JJUFRJT04KLQlDb3B5IHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZSAKLQl0aGUgQkZEIEB2YXJ7b2JmZH0uICBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLgotCVBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLCBcCi0uCQkoaWJmZCwgb2JmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShiZmQgKmliZmQsIGJmZCAqb2JmZCk7Ci0KLURFU0NSSVBUSU9OCi0JTWVyZ2UgcHJpdmF0ZSBCRkQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIEB2YXJ7aWJmZH0gdG8gdGhlIAotCXRoZSBvdXRwdXQgZmlsZSBCRkQgQHZhcntvYmZkfSB3aGVuIGxpbmtpbmcuICBSZXR1cm4gPDx0cnVlPj4KLQlvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCi0uICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBcCi0uCQkoaWJmZCwgb2JmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfcHJpdmF0ZV9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9wcml2YXRlX2ZsYWdzKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCBwcml2YXRlIEJGRCBmbGFnIGluZm9ybWF0aW9uIGluIHRoZSBCRkQgQHZhcnthYmZkfS4KLQlSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IKLQlyZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MoYWJmZCwgZmxhZ3MpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9wcml2YXRlX2ZsYWdzLCBcCi0uCQkoYWJmZCwgZmxhZ3MpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQlzdHVmZgotCi1ERVNDUklQVElPTgotCVN0dWZmIHdoaWNoIHNob3VsZCBiZSBkb2N1bWVudGVkOgotCi0uI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NpemVvZl9oZWFkZXJzLCAoYWJmZCwgcmVsb2MpKQotLgotLiNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5kX25lYXJlc3RfbGluZSwgIChhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkpCi0uCi0uICAgICAgIHsqIERvIHRoZXNlIHRocmVlIGRvIGFueXRoaW5nIHVzZWZ1bCBhdCBhbGwsIGZvciBhbnkgYmFjayBlbmQ/ICAqfQotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19zdGFydCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fZW5kLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSwgKGFiZmQsIHNlY3Rpb24pKQotLgotLgotLiNkZWZpbmUgYmZkX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc3RhdF9hcmNoX2VsdCwoYWJmZCwgc3RhdCkpCi0uCi0uI2RlZmluZSBiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcChhYmZkKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoKVwKLS4gICAgICAgIEJGRF9TRU5EICggYWJmZCwgX2JmZF9zZXRfYXJjaF9tYWNoLCAoYWJmZCwgYXJjaCwgbWFjaCkpCi0uCi0uI2RlZmluZSBiZmRfcmVsYXhfc2VjdGlvbihhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSBcCi0uICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlbGF4X3NlY3Rpb24sIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSkKLS4KLS4jZGVmaW5lIGJmZF9nY19zZWN0aW9ucyhhYmZkLCBsaW5rX2luZm8pIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2Nfc2VjdGlvbnMsIChhYmZkLCBsaW5rX2luZm8pKQotLgotLiNkZWZpbmUgYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoYWJmZCkgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfYWRkX3N5bWJvbHMsIChhYmZkLCBpbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9maW5hbF9saW5rKGFiZmQsIGluZm8pIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluYWxfbGluaywgKGFiZmQsIGluZm8pKQotLgotLiNkZWZpbmUgYmZkX2ZyZWVfY2FjaGVkX2luZm8oYWJmZCkgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9mcmVlX2NhY2hlZF9pbmZvLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YShhYmZkLCBmaWxlKVwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwgKGFiZmQsIGZpbGUpKQotLgotLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYihhYmZkLCBhc3ltYm9scykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIsIChhYmZkLCBhc3ltYm9scykpCi0uCi0uI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoYWJmZCkgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKGFiZmQsIGFyZWxzLCBhc3ltcykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYywgKGFiZmQsIGFyZWxzLCBhc3ltcykpCi0uCi0uZXh0ZXJuIGJmZF9ieXRlICpiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0uCVBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotLgkJICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwKLS4JCSAgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotLgotCi0qLwotCi1iZmRfYnl0ZSAqCi1iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJICAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGJmZCAqYWJmZDI7Ci0gIGJmZF9ieXRlICooKmZuKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCQkJICAgYXN5bWJvbCAqKikpOwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotICAgIHsKLSAgICAgIGFiZmQyID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgICAgIGlmIChhYmZkMiA9PSAwKQotCWFiZmQyID0gYWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYmZkMiA9IGFiZmQ7Ci0gIGZuID0gYWJmZDItPnh2ZWMtPl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzOwotCi0gIHJldHVybiAoKmZuKSAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpOwotfQotCi0vKiBSZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUxGIHByb2dyYW0gaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX3JlY29yZF9waGRyIChhYmZkLCB0eXBlLCBmbGFnc192YWxpZCwgZmxhZ3MsIGF0X3ZhbGlkLCBhdCwKLQkJIGluY2x1ZGVzX2ZpbGVoZHIsIGluY2x1ZGVzX3BoZHJzLCBjb3VudCwgc2VjcykKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gICAgIGJvb2xlYW4gZmxhZ3NfdmFsaWQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBib29sZWFuIGF0X3ZhbGlkOwotICAgICBiZmRfdm1hIGF0OwotICAgICBib29sZWFuIGluY2x1ZGVzX2ZpbGVoZHI7Ci0gICAgIGJvb2xlYW4gaW5jbHVkZXNfcGhkcnM7Ci0gICAgIHVuc2lnbmVkIGludCBjb3VudDsKLSAgICAgYXNlY3Rpb24gKipzZWNzOwotewotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQotCQkgICArICgoc2l6ZV90KSBjb3VudCAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgaWYgKG0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbS0+bmV4dCA9IE5VTEw7Ci0gIG0tPnBfdHlwZSA9IHR5cGU7Ci0gIG0tPnBfZmxhZ3MgPSBmbGFnczsKLSAgbS0+cF9wYWRkciA9IGF0OwotICBtLT5wX2ZsYWdzX3ZhbGlkID0gZmxhZ3NfdmFsaWQ7Ci0gIG0tPnBfcGFkZHJfdmFsaWQgPSBhdF92YWxpZDsKLSAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IGluY2x1ZGVzX2ZpbGVoZHI7Ci0gIG0tPmluY2x1ZGVzX3BoZHJzID0gaW5jbHVkZXNfcGhkcnM7Ci0gIG0tPmNvdW50ID0gY291bnQ7Ci0gIGlmIChjb3VudCA+IDApCi0gICAgbWVtY3B5IChtLT5zZWN0aW9ucywgc2VjcywgY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQotICBmb3IgKHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCi0gICAgOwotICAqcG0gPSBtOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2JpbmFyeS5jIGIvYmZkL2JpbmFyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk4MGIwLi4wMDAwMDAwCi0tLSBhL2JmZC9iaW5hcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGJpbmFyeSBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBCRkQgYmFja2VuZCB3aGljaCBtYXkgYmUgdXNlZCB0byB3cml0ZSBiaW5hcnkgb2JqZWN0cy4KLSAgIEl0IG1heSBvbmx5IGJlIHVzZWQgZm9yIG91dHB1dCwgbm90IGlucHV0LiAgVGhlIGludGVudGlvbiBpcyB0aGF0Ci0gICB0aGlzIG1heSBiZSB1c2VkIGFzIGFuIG91dHB1dCBmb3JtYXQgZm9yIG9iamNvcHkgaW4gb3JkZXIgdG8KLSAgIGdlbmVyYXRlIHJhdyBiaW5hcnkgZGF0YS4KLQotICAgVGhpcyBpcyB2ZXJ5IHNpbXBsZS4gIFRoZSBvbmx5IGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSByZWFsIGRhdGEKLSAgIHdpbGwgc3RhcnQgYXQgc29tZSBhZGRyZXNzIFgsIGFuZCBpbiBzb21lIGNhc2VzIHdlIHdpbGwgbm90IHdhbnQgdG8KLSAgIGluY2x1ZGUgWCB6ZXJvZXMganVzdCB0byBnZXQgdG8gdGhhdCBwb2ludC4gIFNpbmNlIHRoZSBzdGFydAotICAgYWRkcmVzcyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQsIHdlIHVzZSBpdAotICAgaW5zdGVhZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBzdGFydCBvZgotICAgdGhlIGZpbGUuICBvYmpjb3B5IGNvb3BlcmF0ZXMgYnkgc3BlY2lhbGx5IHNldHRpbmcgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIHRvIHplcm8gYnkgZGVmYXVsdC4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIEFueSBiZmQgd2UgY3JlYXRlIGJ5IHJlYWRpbmcgYSBiaW5hcnkgZmlsZSBoYXMgdGhyZWUgc3ltYm9sczoKLSAgIGEgc3RhcnQgc3ltYm9sLCBhbiBlbmQgc3ltYm9sLCBhbmQgYW4gYWJzb2x1dGUgbGVuZ3RoIHN5bWJvbC4gICovCi0jZGVmaW5lIEJJTl9TWU1TIDMKLQotc3RhdGljIGJvb2xlYW4gYmluYXJ5X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYmluYXJ5X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBiaW5hcnlfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBsb25nIGJpbmFyeV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqbWFuZ2xlX25hbWUgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotc3RhdGljIGxvbmcgYmluYXJ5X2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBhc3ltYm9sICpiaW5hcnlfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGJpbmFyeV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgaW50IGJpbmFyeV9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi0vKiBDcmVhdGUgYSBiaW5hcnkgb2JqZWN0LiAgSW52b2tlZCB2aWEgYmZkX3NldF9mb3JtYXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmluYXJ5X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFueSBmaWxlIG1heSBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYmluYXJ5IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKLSAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcwotICAgYmVpbmcgYmluYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYmluYXJ5X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPSBCSU5fU1lNUzsKLQotICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPbmUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc2VjLT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWMtPnZtYSA9IDA7Ci0gIHNlYy0+X3Jhd19zaXplID0gc3RhdGJ1Zi5zdF9zaXplOwotICBzZWMtPmZpbGVwb3MgPSAwOwotCi0gIGFiZmQtPnRkYXRhLmFueSA9IChQVFIpIHNlYzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2RlZmluZSBiaW5hcnlfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGJpbmFyeV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgYmluYXJ5X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1iaW5hcnlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAoQklOX1NZTVMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogQ3JlYXRlIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGJmZCdzIGZpbGVuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbWFuZ2xlX25hbWUgKGFiZmQsIHN1ZmZpeCkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdWZmaXg7Ci17Ci0gIGludCBzaXplOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnA7Ci0KLSAgc2l6ZSA9IChzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCSAgKyBzdHJsZW4gKHN1ZmZpeCkKLQkgICsgc2l6ZW9mICJfYmluYXJ5X18iKTsKLQotICBidWYgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoYnVmID09IE5VTEwpCi0gICAgcmV0dXJuICIiOwotCi0gIHNwcmludGYgKGJ1ZiwgIl9iaW5hcnlfJXNfJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3VmZml4KTsKLQotICAvKiBDaGFuZ2UgYW55IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0byB1bmRlcnNjb3Jlcy4gICovCi0gIGZvciAocCA9IGJ1ZjsgKnA7IHArKykKLSAgICBpZiAoISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnApKQotICAgICAgKnAgPSAnXyc7Ci0KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogUmV0dXJuIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotYmluYXJ5X2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBhc2VjdGlvbiAqc2VjID0gKGFzZWN0aW9uICopIGFiZmQtPnRkYXRhLmFueTsKLSAgYXN5bWJvbCAqc3ltczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3ltcyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgQklOX1NZTVMgKiBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3RhcnQgc3ltYm9sLiAgKi8KLSAgc3ltc1swXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1swXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJzdGFydCIpOwotICBzeW1zWzBdLnZhbHVlID0gMDsKLSAgc3ltc1swXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMF0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1swXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBFbmQgc3ltYm9sLiAgKi8KLSAgc3ltc1sxXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1sxXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJlbmQiKTsKLSAgc3ltc1sxXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICBzeW1zWzFdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1sxXS5zZWN0aW9uID0gc2VjOwotICBzeW1zWzFdLnVkYXRhLnAgPSBOVUxMOwotCi0gIC8qIFNpemUgc3ltYm9sLiAgKi8KLSAgc3ltc1syXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1syXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJzaXplIik7Ci0gIHN5bXNbMl0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1syXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMl0uc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIHN5bXNbMl0udWRhdGEucCA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJJTl9TWU1TOyBpKyspCi0gICAgKmFsb2NhdGlvbisrID0gc3ltcysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gQklOX1NZTVM7Ci19Ci0KLS8qIE1ha2UgYW4gZW1wdHkgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotYmluYXJ5X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotfQotCi0jZGVmaW5lIGJpbmFyeV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0KLS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1iaW5hcnlfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotI2RlZmluZSBiaW5hcnlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiaW5hcnlfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGJpbmFyeV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiaW5hcnlfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBiaW5hcnlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBiaW5hcnlfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgYmluYXJ5X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBiaW5hcnlfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIGJpbmFyeV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgb2YgYSBiaW5hcnkgZmlsZS4gICovCi0jZGVmaW5lIGJpbmFyeV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLS8qIFdyaXRlIHNlY3Rpb24gY29udGVudHMgb2YgYSBiaW5hcnkgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBib29sZWFuIGZvdW5kX2xvdzsKLSAgICAgIGJmZF92bWEgbG93OwotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIFRoZSBsb3dlc3Qgc2VjdGlvbiBMTUEgc2V0cyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydAotICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSB1c2UgdGhpcyB0byBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQotICAgICAgICAgc2VjdGlvbnMuICAqLwotICAgICAgZm91bmRfbG93ID0gZmFsc2U7Ci0gICAgICBsb3cgPSAwOwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKCgocy0+ZmxhZ3MKLQkgICAgICAmIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfTkVWRVJfTE9BRCkpCi0JICAgICA9PSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLQkgICAgJiYgKCEgZm91bmRfbG93IHx8IHMtPmxtYSA8IGxvdykpCi0JICB7Ci0JICAgIGxvdyA9IHMtPmxtYTsKLQkgICAgZm91bmRfbG93ID0gdHJ1ZTsKLQkgIH0KLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgcy0+ZmlsZXBvcyA9IHMtPmxtYSAtIGxvdzsKLQotCSAgLyogU2tpcCBmb2xsb3dpbmcgd2FybmluZyBjaGVjayBmb3Igc2VjdGlvbnMgdGhhdCB3aWxsIG5vdAotCSAgICAgb2NjdXB5IGZpbGUgc3BhY2UuICAqLyAKLQkgIGlmICgocy0+ZmxhZ3MKLQkgICAgICAgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19ORVZFUl9MT0FEKSkKLQkgICAgICAhPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIGEgYmluYXJ5IGZpbGUgZnJvbSBhIGJmZCB3aXRoCi0JICAgICBMTUEncyBhbGwgb3ZlciB0aGUgcGxhY2UsIGh1Z2UgKHNwYXJzZT8pIGJpbmFyeSBmaWxlcyBtYXkKLQkgICAgIHJlc3VsdC4gIFRoaXMgY29uZGl0aW9uIGF0dGVtcHRzIHRvIGRldGVjdCB0aGlzIHNpdHVhdGlvbgotCSAgICAgYW5kIHByaW50IGEgd2FybmluZy4gIEJldHRlciBoZXVyaXN0aWNzIHdvdWxkIGJlIG5pY2UgdG8KLQkgICAgIGhhdmUuICovCi0KLQkgIGlmIChzLT5maWxlcG9zIDwgMCkKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgKF8oIldhcm5pbmc6IFdyaXRpbmcgc2VjdGlvbiBgJXMnIHRvIGh1Z2UgKGllIG5lZ2F0aXZlKSBmaWxlIG9mZnNldCAweCVseC4iKSwKLQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgcy0+ZmlsZXBvcyk7Ci0JfQotCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgYW55dGhpbmcgZm9yIGEgc2VjdGlvbiB0aGF0IGlzIG5laXRoZXIKLSAgICAgbG9hZGVkIG5vciBhbGxvY2F0ZWQuICBUaGUgY29udGVudHMgb2Ygc3VjaCBhIHNlY3Rpb24gYXJlIG5vdAotICAgICBtZWFuaW5nZnVsIGluIHRoZSBiaW5hcnkgZm9ybWF0LiAgKi8KLSAgaWYgKChzZWMtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpOwotfQotCi0vKiBObyBzcGFjZSBpcyByZXF1aXJlZCBmb3IgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGludAotYmluYXJ5X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBleGVjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIGJpbmFyeV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJpbmFyeV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJpbmFyeV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgYmluYXJ5X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiaW5hcnlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmluYXJ5X2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBiaW5hcnlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1jb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWMgPQotewotICAiYmluYXJ5IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAkvKiBmbGF2b3VyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIGJ5dGVvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiBoZWFkZXJfYnl0ZW9yZGVyICovCi0gIEVYRUNfUCwJCQkvKiBvYmplY3RfZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUyksIC8qIHNlY3Rpb25fZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLSAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgYmluYXJ5X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGJpbmFyeV9ta29iamVjdCwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfdHJ1ZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9iZmQvYm91dC5jIGIvYmZkL2JvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxNzU0YS4uMDAwMDAwMAotLS0gYS9iZmQvYm91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBiLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotI2luY2x1ZGUgImJvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLQotc3RhdGljIGludCBhbGlnbmNvZGUgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGFyZWxlbnQgKnIsIHVuc2lnbmVkIGludCBzaHJpbmspKTsKLXN0YXRpYyB2b2lkIHBlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZF92bWEgdmFsdWUpKTsKLXN0YXRpYyBib29sZWFuIGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpiX291dF9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjYWxsanhfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFyZWxlbnQgKiwgUFRSIHNyYywgUFRSIGRzdCwKLQkgICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNhbGxqX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhcmVsZW50ICosIFBUUiBkYXRhLAotCSAgIHVuc2lnbmVkIGludCBzcmNpZHgsIHVuc2lnbmVkIGludCBkc3RpZHgsIGFzZWN0aW9uICosIGJvb2xlYW4pKTsKLXN0YXRpYyBiZmRfdm1hIGdldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgaW50IGFiczMyY29kZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLAotCQkJICAgICAgdW5zaWduZWQgaW50LCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBiX291dF9iZmRfcmVsYXhfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCXN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQlib29sZWFuICopKTsKLXN0YXRpYyBiZmRfYnl0ZSAqYl9vdXRfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdyBieXRlCi0gICBzdHJlYW0gbWVtb3J5IGltYWdlLCBpbnRvIHRoZSBpbnRlcm5hbCBleGVjX2hlYWRlciBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1ib3V0X3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgZXhlY3AtPmFfdGxvYWQgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Rsb2FkKTsKLSAgZXhlY3AtPmFfZGxvYWQgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgZXhlY3AtPmFfdGFsaWduID0gYnl0ZXMtPmVfdGFsaWduWzBdOwotICBleGVjcC0+YV9kYWxpZ24gPSBieXRlcy0+ZV9kYWxpZ25bMF07Ci0gIGV4ZWNwLT5hX2JhbGlnbiA9IGJ5dGVzLT5lX2JhbGlnblswXTsKLSAgZXhlY3AtPmFfcmVsYXhhYmxlID0gYnl0ZXMtPmVfcmVsYXhhYmxlWzBdOwotfQotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlIGludG8gdGhlCi0gICBzdXBwbGllZCBidWZmZXIgcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4gICovCi0KLVBST1RPKHZvaWQsIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQsCi0JICAoYmZkICphYmZkLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwKLQkgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzKSk7Ci12b2lkCi1ib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgcmF3IGRhdGEsIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgZXhlYyBzdHJ1Y3QuICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfaW5mbyAgLCBieXRlcy0+ZV9pbmZvKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3RleHQgICwgYnl0ZXMtPmVfdGV4dCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kYXRhICAsIGJ5dGVzLT5lX2RhdGEpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfYnNzICAgLCBieXRlcy0+ZV9ic3MpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfc3ltcyAgLCBieXRlcy0+ZV9zeW1zKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2VudHJ5ICwgYnl0ZXMtPmVfZW50cnkpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdHJzaXplLCBieXRlcy0+ZV90cnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGxvYWQgLCBieXRlcy0+ZV90bG9hZCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kbG9hZCAsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgYnl0ZXMtPmVfdGFsaWduWzBdID0gZXhlY3AtPmFfdGFsaWduOwotICBieXRlcy0+ZV9kYWxpZ25bMF0gPSBleGVjcC0+YV9kYWxpZ247Ci0gIGJ5dGVzLT5lX2JhbGlnblswXSA9IGV4ZWNwLT5hX2JhbGlnbjsKLSAgYnl0ZXMtPmVfcmVsYXhhYmxlWzBdID0gZXhlY3AtPmFfcmVsYXhhYmxlOwotfQotCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWJfb3V0X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLQotICBpZiAoTl9CQURNQUcgKGFuZXhlYykpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgJmV4ZWNfYnl0ZXMsICZhbmV4ZWMpOwotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZhbmV4ZWMsIGJfb3V0X2NhbGxiYWNrKTsKLX0KLQotCi0vKiBGaW5pc2ggdXAgdGhlIG9wZW5pbmcgb2YgYSBiLm91dCBmaWxlIGZvciByZWFkaW5nLiAgRmlsbCBpbiBhbGwgdGhlCi0gICBmaWVsZHMgdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgY29tbW9uIGNvZGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1iX291dF9jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGxvbmcgYnNzX3N0YXJ0OwotCi0gIC8qIEFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsCi0JCSAgICBiZmRfYXJjaF9pOTYwLCAvKiBCLm91dCBvbmx5IHVzZWQgb24gaTk2MCAqLwotCQkgICAgYmZkX21hY2hfaTk2MF9jb3JlIC8qIERlZmF1bHQgKi8KLQkJICAgICk7Ci0KLSAgLyogVGhlIHBvc2l0aW9ucyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gTl9TVFJPRkYgKCpleGVjcCk7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgYWxpZ25tZW50cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV90YWxpZ247Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfZGFsaWduOwotICBvYmpfYnNzc2VjICAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX2JhbGlnbjsKLQotICAvKiBUaGUgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gZXhlY3AtPmFfdGxvYWQ7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gZXhlY3AtPmFfZGxvYWQ7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5sbWEgPSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5sbWEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICAvKiBBbmQgcmVsb2FkIHRoZSBzaXplcywgc2luY2UgdGhlIGFvdXQgbW9kdWxlIHphcHMgdGhlbSAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX3RleHQ7Ci0KLSAgYnNzX3N0YXJ0ID0gZXhlY3AtPmFfZGxvYWQgKyBleGVjcC0+YV9kYXRhOyAvKiBCU1MgPSBlbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSBhbGlnbl9wb3dlciAoYnNzX3N0YXJ0LCBleGVjcC0+YV9iYWxpZ24pOwotCi0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9UWFRPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUk9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gIE5fRFJPRkYoKmV4ZWNwKTsKLQotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSAxOwkvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gMTsgLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICBpZiAoZXhlY3AtPmFfcmVsYXhhYmxlKQotICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0cnVjdCBib3V0X2RhdGFfc3RydWN0IHsKLSAgICBzdHJ1Y3QgYW91dGRhdGEgYTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5ib3V0X2RhdGEgPSByYXdwdHI7Ci0gIGV4ZWNfaGRyIChhYmZkKSA9ICZyYXdwdHItPmU7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2Jzc3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1iX291dF9zeW1ib2xfY21wIChhLCBiKQotICAgICBzdHJ1Y3QgYW91dF9zeW1ib2wgKiphLCAqKmI7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgYXYsIGJ2OwotCi0gIC8qIFByaW1hcnkga2V5IGlzIGFkZHJlc3MgKi8KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uICgmKCphKS0+c3ltYm9sKTsKLSAgYXYgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQgKyAoKmEpLT5zeW1ib2wudmFsdWU7Ci0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoJigqYiktPnN5bWJvbCk7Ci0gIGJ2ID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0ICsgKCpiKS0+c3ltYm9sLnZhbHVlOwotCi0gIGlmIChhdiA8IGJ2KQotICAgIHJldHVybiAtMTsKLSAgaWYgKGF2ID4gYnYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2Vjb25kYXJ5IGtleSBwdXRzIENBTExOQU1FIHN5bXMgbGFzdCBhbmQgQkFMTkFNRSBzeW1zIGZpcnN0LCBzbwotICAgICB0aGF0IHRoZXkgaGF2ZSB0aGUgYmVzdCBjaGFuY2Ugb2YgYmVpbmcgY29udGlndW91cy4gICovCi0gIGlmIChJU19CQUxOQU1FICgoKmEpLT5vdGhlcikgfHwgSVNfQ0FMTE5BTUUgKCgqYiktPm90aGVyKSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChJU19DQUxMTkFNRSAoKCphKS0+b3RoZXIpIHx8IElTX0JBTE5BTUUgKCgqYiktPm90aGVyKSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLQotICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfaW5mbyA9IEJNQUdJQzsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzID0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoc3RydWN0IG5saXN0KTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RhbGlnbiA9IG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfZGFsaWduID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9iYWxpZ24gPSBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90bG9hZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBleGVjX2hkciAoYWJmZCktPmFfZGxvYWQgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICBib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjX2hkciAoYWJmZCksICZzd2FwcGVkX2hkcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmc3dhcHBlZF9oZHIsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLQkgICE9IEVYRUNfQllURVNfU0laRSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUge0NBTEwsQkFMfU5BTUUgc3ltYm9scyByZW1haW4gYWRqYWNlbnQgb24gb3V0cHV0Ci0JIGJ5IHNvcnRpbmcuICBUaGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgc3RhYnMgYXJlCi0JIGFsc28gb3JkZXJlZC4gIFNvbHZlIHRoaXMgYnkgc2hpZnRpbmcgYWxsIHN0YWJzIHRvIHRoZSBlbmQKLQkgaW4gb3JkZXIsIHRoZW4gc29ydGluZyB0aGUgcmVzdC4gICovCi0KLSAgICAgIGFzeW1ib2wgKipvdXRzeW1zLCAqKnAsICoqcTsKLQotICAgICAgb3V0c3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gICAgICBwID0gb3V0c3ltcyArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gICAgICBmb3IgKHEgPSBwLS07IHAgPj0gb3V0c3ltczsgcC0tKQotCXsKLQkgIGlmICgoKnApLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0JICAgIHsKLQkgICAgICBhc3ltYm9sICp0ID0gKi0tcTsKLQkgICAgICAqcSA9ICpwOwotCSAgICAgICpwID0gdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHEgPiBvdXRzeW1zKQotCXFzb3J0IChvdXRzeW1zLCBxIC0gb3V0c3ltcywgc2l6ZW9mKGFzeW1ib2wqKSwgYl9vdXRfc3ltYm9sX2NtcCk7Ci0KLSAgICAgIC8qIEJhY2sgdG8geW91ciByZWd1bGFybHkgc2NoZWR1bGVkIHByb2dyYW0uICAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGFvdXRfMzJfd3JpdGVfc3ltcyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUk9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUk9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiogU29tZSByZWxvYyBoYWNrZXJ5ICovCi0KLSNkZWZpbmUgQ0FMTFMJICAweDY2MDAzODAwCS8qIFRlbXBsYXRlIGZvciAnY2FsbHMnIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIEJBTAkgIDB4MGIwMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWwnIGluc3RydWN0aW9uICovCi0jZGVmaW5lIEJBTF9NQVNLICAweDAwZmZmZmZmCi0jZGVmaW5lIEJBTFgJICAweDg1ZjAwMDAwCS8qIFRlbXBsYXRlIGZvciAnYmFseCcgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMWF9NQVNLIDB4MDAwN2ZmZmYKLSNkZWZpbmUgQ0FMTCAgICAgIDB4MDkwMDAwMDAKLSNkZWZpbmUgUENSRUwxM19NQVNLIDB4MWZmZgotCi0KLSNkZWZpbmUgb3V0cHV0X2FkZHIoc2VjKSAoKHNlYyktPm91dHB1dF9vZmZzZXQrKHNlYyktPm91dHB1dF9zZWN0aW9uLT52bWEpCi0KLS8qIE1hZ2ljIHRvIHR1cm4gY2FsbHggaW50byBjYWxsanggKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNhbGxqeF9jYWxsYmFjayAoYWJmZCwgbGlua19pbmZvLCByZWxvY19lbnRyeSwgc3JjLCBkc3QsIGlucHV0X3NlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotewotICBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYyk7Ci0gIGFzeW1ib2wgKnN5bWJvbF9pbiA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sID0gYW91dF9zeW1ib2wgKHN5bWJvbF9pbik7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jX2VudHJ5LCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gIGlmIChJU19DQUxMTkFNRSAoc3ltYm9sLT5vdGhlcikpCi0gICAgewotICAgICAgYW91dF9zeW1ib2xfdHlwZSAqYmFsc3ltID0gc3ltYm9sKzE7Ci0gICAgICBpbnQgaW5zdCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtNCk7Ci0gICAgICAvKiBUaGUgbmV4dCBzeW1ib2wgc2hvdWxkIGJlIGFuIE5fQkFMTkFNRSAqLwotICAgICAgQkZEX0FTU0VSVCAoSVNfQkFMTkFNRSAoYmFsc3ltLT5vdGhlcikpOwotICAgICAgaW5zdCAmPSBCQUxYX01BU0s7Ci0gICAgICBpbnN0IHw9IEJBTFg7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnN0LCAoYmZkX2J5dGUgKikgZHN0LTQpOwotICAgICAgc3ltYm9sID0gYmFsc3ltOwotICAgICAgdmFsdWUgPSAoc3ltYm9sLT5zeW1ib2wudmFsdWUKLQkgICAgICAgKyBvdXRwdXRfYWRkciAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbikpOwotICAgIH0KLQotICB3b3JkICs9IHZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIGRzdCk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotLyogTWFnaWMgdG8gdHVybiBjYWxsIGludG8gY2FsbGogKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNhbGxqX2NhbGxiYWNrIChhYmZkLCBsaW5rX2luZm8sIHJlbG9jX2VudHJ5LCAgZGF0YSwgc3JjaWR4LCBkc3RpZHgsCi0JCWlucHV0X3NlY3Rpb24sIHNocmlua2luZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCBzcmNpZHg7Ci0gICAgIHVuc2lnbmVkIGludCBkc3RpZHg7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBib29sZWFuIHNocmlua2luZzsKLXsKLSAgaW50IHdvcmQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHNyY2lkeCk7Ci0gIGFzeW1ib2wgKnN5bWJvbF9pbiA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sID0gYW91dF9zeW1ib2wgKHN5bWJvbF9pbik7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jX2VudHJ5LCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gIGlmIChJU19PVEhFUihzeW1ib2wtPm90aGVyKSkKLSAgICB7Ci0gICAgICAvKiBDYWxsIHRvIGEgc3lzdGVtIHByb2NlZHVyZSAtIHJlcGxhY2UgY29kZSB3aXRoIHN5c3RlbQotCSBwcm9jZWR1cmUgbnVtYmVyLiAgKi8KLSAgICAgIHdvcmQgPSBDQUxMUyB8IChzeW1ib2wtPm90aGVyIC0gMSk7Ci0gICAgfQotICBlbHNlIGlmIChJU19DQUxMTkFNRShzeW1ib2wtPm90aGVyKSkKLSAgICB7Ci0gICAgICBhb3V0X3N5bWJvbF90eXBlICpiYWxzeW0gPSBzeW1ib2wrMTsKLQotICAgICAgLyogVGhlIG5leHQgc3ltYm9sIHNob3VsZCBiZSBhbiBOX0JBTE5BTUUuICAqLwotICAgICAgQkZEX0FTU0VSVChJU19CQUxOQU1FKGJhbHN5bS0+b3RoZXIpKTsKLSAgICAgIAotICAgICAgLyogV2UgYXJlIGNhbGxpbmcgYSBsZWFmLCBzbyByZXBsYWNlIHRoZSBjYWxsIGluc3RydWN0aW9uIHdpdGggYQotCSBiYWwuICAqLwotICAgICAgd29yZCA9IEJBTCB8ICgod29yZAotCQkgICAgICsgb3V0cHV0X2FkZHIgKGJhbHN5bS0+c3ltYm9sLnNlY3Rpb24pCi0JCSAgICAgKyBiYWxzeW0tPnN5bWJvbC52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQKLQkJICAgICAtIGRzdGlkeAotCQkgICAgIC0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkgICAgJiBCQUxfTUFTSyk7Ci0gICAgfQotICBlbHNlIGlmICgoc3ltYm9sLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgLyogQSBjYWxsaiBhZ2FpbnN0IGEgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24gaXMgYSBmdWxseQotICAgICAgICAgcmVzb2x2ZWQgcmVsYXRpdmUgY2FsbC4gIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS4KLSAgICAgICAgIElmIHRoZSBzeW1ib2wgaXMgbm90IGluIHRoZSBzYW1lIHNlY3Rpb24sIEknbSBub3Qgc3VyZSB3aGF0Ci0gICAgICAgICB0byBkbzsgZm9ydHVuYXRlbHksIHRoaXMgY2FzZSB3aWxsIHByb2JhYmx5IG5ldmVyIGFyaXNlLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKCEgc2hyaW5raW5nKTsKLSAgICAgIEJGRF9BU1NFUlQgKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd29yZCA9IENBTEwgfCAoKCh3b3JkICYgQkFMX01BU0spCi0JCSAgICAgICsgdmFsdWUKLQkJICAgICAgKyByZWxvY19lbnRyeS0+YWRkZW5kCi0JCSAgICAgIC0gKHNocmlua2luZyA/IGRzdGlkeCA6IDApCi0JCSAgICAgIC0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkgICAgICYgQkFMX01BU0spOwotICAgIH0KLSAgYmZkX3B1dF8zMihhYmZkLCB3b3JkLCAoYmZkX2J5dGUgKikgZGF0YSArIGRzdGlkeCk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIHR5cGUgcnNoaWZ0IHNpemUgIGJpdHNpemUgIAlwY3JlbAliaXRwb3MgIGFic29sdXRlIG92ZXJmbG93IGNoZWNrKi8KLQotI2RlZmluZSBBQlMzMkNPREUgMAotI2RlZmluZSBBQlMzMkNPREVfU0hSVU5LIDEKLSNkZWZpbmUgUENSRUwyNCAyCi0jZGVmaW5lIENBTExKIDMKLSNkZWZpbmUgQUJTMzIgNAotI2RlZmluZSBQQ1JFTDEzIDUKLSNkZWZpbmUgQUJTMzJfTUFZQkVfUkVMQVhBQkxFIDEKLSNkZWZpbmUgQUJTMzJfV0FTX1JFTEFYQUJMRSAyCi0KLSNkZWZpbmUgQUxJR05FUiAxMAotI2RlZmluZSBBTElHTkRPTkUgMTEKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2NhbGxqID0KLUhPV1RPKENBTExKLCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCJjYWxsaiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsZmFsc2UpOwotc3RhdGljICByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyID0KLUhPV1RPKEFCUzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsImFiczMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX3BjcmVsMjQgPQotSE9XVE8oUENSRUwyNCwgMCwgMiwgMjQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJwY3JlbDI0IiwgdHJ1ZSwgMHgwMGZmZmZmZiwweDAwZmZmZmZmLGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfcGNyZWwxMyA9Ci1IT1dUTyhQQ1JFTDEzLCAwLCAyLCAxMywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsInBjcmVsMTMiLCB0cnVlLCAweDAwMDAxZmZmLDB4MDAwMDFmZmYsZmFsc2UpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyY29kZXNocnVuayA9Ci1IT1dUTyhBQlMzMkNPREVfU0hSVU5LLCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCJjYWxseC0+Y2FsbGoiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLGZhbHNlKTsKLQotc3RhdGljICByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyY29kZSA9Ci1IT1dUTyhBQlMzMkNPREUsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiY2FsbHgiLCB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19hbGlnbl90YWJsZVtdID0gewotICBIT1dUTyAoQUxJR05FUiwgMCwgMHgxLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMTYiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHgzLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMzIiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHg3LCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHhmLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMTI4IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2RvbmVfYWxpZ25fdGFibGVbXSA9IHsKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHgxLCAweDEsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMTYiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05ET05FLCAweDMsIDB4MywgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24zMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkRPTkUsIDB4NywgMHg3LCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjY0IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHhmLCAweGYsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMTI4IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJfb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19jYWxsajsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19hYnMzMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfcGNyZWwyNDsKLSAgICB9Ci19Ci0KLS8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHJlbG9jIGVudHJpZXMsIHBsdXMgcG9pbnRlcnMgdG8gdGhlbSBhbGwgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgOwotICBhcmVsZW50ICpjYWNoZV9wdHIgOwotICBpbnQgZXh0ZXJuX21hc2ssIHBjcmVsX21hc2ssIGNhbGxqX21hc2ssIGxlbmd0aF9zaGlmdDsKLSAgaW50IGluY29kZV9tYXNrOwotICBpbnQgc2l6ZV9tYXNrOwotICBiZmRfdm1hIHByZXZfYWRkciA9IDA7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc2l6ZV90ICByZWxvY19zaXplOwotICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCFhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfZHJzaXplOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfdHJzaXplOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkgewotICAgIHJlbG9jX3NpemUgPSAwOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotIGRvaXQ6Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShhc2VjdC0+cmVsX2ZpbGVwb3MpLCAgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb3VudCA9IHJlbG9jX3NpemUgLyBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotCi0gIHJlbG9jcyA9IChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jcyAmJiByZWxvY19zaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopIGJmZF9tYWxsb2MgKChjb3VudCsxKSAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAoIXJlbG9jX2NhY2hlKSB7Ci0gICAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgICAgZnJlZSAoKGNoYXIqKXJlbG9jcyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpIHsKLSAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICAvKiBiaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDgwOwotICAgIGV4dGVybl9tYXNrID0gMHgxMDsKLSAgICBpbmNvZGVfbWFzayA9IDB4MDg7Ci0gICAgY2FsbGpfbWFzayAgPSAweDAyOwotICAgIHNpemVfbWFzayA9ICAgMHgyMDsKLSAgICBsZW5ndGhfc2hpZnQgPSA1OwotICB9IGVsc2UgewotICAgIC8qIGxpdHRsZS1lbmRpYW4gYml0IGZpZWxkIGFsbG9jYXRpb24gb3JkZXIgKi8KLSAgICBwY3JlbF9tYXNrICA9IDB4MDE7Ci0gICAgZXh0ZXJuX21hc2sgPSAweDA4OwotICAgIGluY29kZV9tYXNrID0gMHgxMDsKLSAgICBjYWxsal9tYXNrICA9IDB4NDA7Ci0gICAgc2l6ZV9tYXNrICAgPSAweDAyOwotICAgIGxlbmd0aF9zaGlmdCA9IDE7Ci0gIH0KLQotICBmb3IgKHJwdHIgPSByZWxvY3MsIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlLCBjb3VudGVyID0gMDsKLSAgICAgICBjb3VudGVyIDwgY291bnQ7Ci0gICAgICAgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqcmF3ID0gKHVuc2lnbmVkIGNoYXIgKilycHRyOwotICAgIHVuc2lnbmVkIGludCBzeW1udW07Ci0gICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXcgKyAwKTsKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gMDsKLSAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBzeW1udW0gPSAocmF3WzRdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNl07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzeW1udW0gPSAocmF3WzZdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNF07Ci0gICAgfQotCi0gICAgaWYgKHJhd1s3XSAmIGV4dGVybl9tYXNrKQotICAgIHsKLSAgICAgIC8qIGlmIHRoaXMgaXMgc2V0IHRoZW4gdGhlIHJfaW5kZXggaXMgYSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGU7Ci0gICAgICAgKiBpZiB0aGUgYml0IGlzIG5vdCBzZXQgdGhlbiByX2luZGV4IGNvbnRhaW5zIGEgc2VjdGlvbiBtYXAuCi0gICAgICAgKiB3ZSBlaXRoZXIgZmlsbCBpbiB0aGUgc3ltIGVudHJ5IHdpdGggYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wsCi0gICAgICAgKiBvciBwb2ludCB0byB0aGUgY29ycmVjdCBzZWN0aW9uCi0gICAgICAgKi8KLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgc3ltbnVtOwotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIC8qIGluIGEub3V0IHN5bWJvbHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgKiBmaWxlIHJhdGhlciB0aGFuIHNlY3Rpb25zID8KLSAgICAgICAqIChsb29rIGluIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpCi0gICAgICAgKiB0aGUgcmVsb2MgZW50cnkgYWRkZW5kIGhhcyBhZGRlZCB0byBpdCB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgICAgKiBmaWxlIG9mIHRoZSBkYXRhLCBzbyBzdWJ0cmFjdCB0aGUgYmFzZSB0byBtYWtlIHRoZSByZWxvYwotICAgICAgICogc2VjdGlvbiByZWxhdGl2ZSAqLwotICAgICAgaW50IHM7Ci0gICAgICB7Ci0JLyogc2lnbi1leHRlbmQgc3ltbnVtIGZyb20gMjQgYml0cyB0byB3aGF0ZXZlciBob3N0IHVzZXMgKi8KLQlzID0gc3ltbnVtOwotCWlmIChzICYgKDEgPDwgMjMpKQotCSAgcyB8PSAofjApIDw8IDI0OwotICAgICAgfQotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKU5VTEw7Ci0gICAgICBzd2l0Y2ggKHMpCi0gICAgICB7Ci0gICAgICAgY2FzZSBOX1RFWFQ6Ci0gICAgICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gLSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOwotCWJyZWFrOwotICAgICAgIGNhc2UgTl9EQVRBOgotICAgICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9kYXRhc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKLQljYWNoZV9wdHItPmFkZGVuZCA9IC0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKLQlicmVhazsKLSAgICAgICBjYXNlIE5fQlNTOgotICAgICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKLQljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX2Jzc3NlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7Ci0JY2FjaGVfcHRyLT5hZGRlbmQgPSAgLSBvYmpfYnNzc2VjKGFiZmQpLT52bWE7Ci0JYnJlYWs7Ci0gICAgICAgY2FzZSBOX0FCUzoKLSAgICAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gMDsKLQlicmVhazsKLSAgICAgIGNhc2UgLTI6IC8qIC5hbGlnbiAqLwotCWlmIChyYXdbN10gJiBwY3JlbF9tYXNrKQotCSAgewotCSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX2FsaWduX3RhYmxlWyhyYXdbN10gPj4gbGVuZ3RoX3NoaWZ0KSAmIDNdOwotCSAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiAub3JnPyAqLwotCSAgICBhYm9ydCAoKTsKLQkgIH0KLQljYWNoZV9wdHItPmFkZGVuZCA9IDA7Ci0JYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLQlCRkRfQVNTRVJUKDApOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgfQotCi0gICAgLyogdGhlIGk5NjAgb25seSBoYXMgYSBmZXcgcmVsb2NhdGlvbiB0eXBlczoKLSAgICAgICBhYnMgMzItYml0IGFuZCBwY3JlbCAyNGJpdC4gICBleGNlcHQgZm9yIGNhbGxqJ3MhICAqLwotICAgIGlmIChjYWNoZV9wdHItPmhvd3RvICE9IDApCi0gICAgICA7Ci0gICAgZWxzZSBpZiAocmF3WzddICYgY2FsbGpfbWFzaykKLSAgICB7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX2NhbGxqOwotICAgIH0KLSAgICBlbHNlIGlmICggcmF3WzddICYgcGNyZWxfbWFzaykKLSAgICB7Ci0gICAgICBpZiAocmF3WzddICYgc2l6ZV9tYXNrKQotICAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfcGNyZWwxMzsKLSAgICAgIGVsc2UKLSAgICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX3BjcmVsMjQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocmF3WzddICYgaW5jb2RlX21hc2spCi0gICAgICB7Ci0JY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNhY2hlX3B0ci0+YWRkcmVzcyA8IHByZXZfYWRkcikKLSAgICB7Ci0gICAgICAvKiBPdWNoISB0aGlzIHJlbG9jIGlzIG91dCBvZiBvcmRlciwgaW5zZXJ0IGludG8gdGhlIHJpZ2h0IHBsYWNlCi0gICAgICAgKi8KLSAgICAgIGFyZWxlbnQgdG1wOwotICAgICAgYXJlbGVudCAqY3Vyc29yID0gY2FjaGVfcHRyLTE7Ci0gICAgICBiZmRfdm1hIHN0b3AgPSBjYWNoZV9wdHItPmFkZHJlc3M7Ci0gICAgICB0bXAgID0gKmNhY2hlX3B0cjsKLSAgICAgIHdoaWxlIChjdXJzb3ItPmFkZHJlc3MgPiBzdG9wICYmIGN1cnNvciA+PSByZWxvY19jYWNoZSkKLSAgICAgIHsKLQljdXJzb3JbMV0gPSBjdXJzb3JbMF07Ci0JY3Vyc29yLS07Ci0gICAgICB9Ci0gICAgICBjdXJzb3JbMV0gPSB0bXA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwcmV2X2FkZHIgPSBjYWNoZV9wdHItPmFkZHJlc3M7Ci0gICAgfQotICB9Ci0KLQotICBpZiAocmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NzKTsKLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gY291bnQ7Ci0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICBpbnQgcl9leHRlcm4gPSAwOwotICBpbnQgcl9pZHg7Ci0gIGludCBpbmNvZGVfbWFzazsKLSAgaW50IGxlbl8xOwotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgbmF0c2l6ZSA9IGNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLSAgaW50IGV4dGVybl9tYXNrLCBwY3JlbF9tYXNrLCAgbGVuXzIsIGNhbGxqX21hc2s7Ci0gIGlmIChjb3VudCA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgZ2VuZXJpYyAgID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0gIG5hdGl2ZSA9ICgoc3RydWN0IHJlbG9jYXRpb25faW5mbyAqKSBiZmRfbWFsbG9jIChuYXRzaXplKSk7Ci0gIGlmICghbmF0aXZlICYmIG5hdHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gIHsKLSAgICAvKiBCaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDgwOwotICAgIGV4dGVybl9tYXNrID0gMHgxMDsKLSAgICBsZW5fMiAgICAgICA9IDB4NDA7Ci0gICAgbGVuXzEgICAgICAgPSAweDIwOwotICAgIGNhbGxqX21hc2sgID0gMHgwMjsKLSAgICBpbmNvZGVfbWFzayA9IDB4MDg7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLyogTGl0dGxlLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLwotICAgIHBjcmVsX21hc2sgID0gMHgwMTsKLSAgICBleHRlcm5fbWFzayA9IDB4MDg7Ci0gICAgbGVuXzIgICAgICAgPSAweDA0OwotICAgIGxlbl8xICAgICAgID0gMHgwMjsKLSAgICBjYWxsal9tYXNrICA9IDB4NDA7Ci0gICAgaW5jb2RlX21hc2sgPSAweDEwOwotICB9Ci0KLSAgZm9yIChuYXRwdHIgPSBuYXRpdmU7IGNvdW50ID4gMDsgLS1jb3VudCwgKytuYXRwdHIsICsrZ2VuZXJpYykKLSAgewotICAgIGFyZWxlbnQgKmcgPSAqZ2VuZXJpYzsKLSAgICB1bnNpZ25lZCBjaGFyICpyYXcgPSAodW5zaWduZWQgY2hhciAqKW5hdHB0cjsKLSAgICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLQotICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZy0+YWRkcmVzcywgcmF3KTsKLSAgICAvKiBGaW5kIGEgdHlwZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB3aGljaCBtYXRjaGVzIHRoZSBpbnB1dCBob3d0byAtCi0gICAgICogYXQgdGhlIG1vbWVudCB3ZSBhc3N1bWUgaW5wdXQgZm9ybWF0ID09IG91dHB1dCBmb3JtYXQgRklYTUUhIQotICAgICAqLwotICAgIHJfaWR4ID0gMDsKLSAgICAvKiBGSVhNRTogIE5lZWQgY2FsbGogc3R1ZmYgaGVyZSwgYW5kIHRvIGNoZWNrIHRoZSBob3d0byBlbnRyaWVzIHRvCi0gICAgICAgYmUgc3VyZSB0aGV5IGFyZSByZWFsIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gICovCi0gICAgaWYgKGctPmhvd3RvPT0gJmhvd3RvX3JlbG9jX2NhbGxqKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IGNhbGxqX21hc2sgKyBwY3JlbF9tYXNrICsgbGVuXzI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID09ICZob3d0b19yZWxvY19wY3JlbDI0KQotICAgIHsKLSAgICAgIHJhd1s3XSA9IHBjcmVsX21hc2sgKyBsZW5fMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZy0+aG93dG8gPT0gJmhvd3RvX3JlbG9jX3BjcmVsMTMpCi0gICAgewotICAgICAgcmF3WzddID0gcGNyZWxfbWFzayArIGxlbl8xOwotICAgIH0KLSAgICBlbHNlIGlmIChnLT5ob3d0byA9PSAmaG93dG9fcmVsb2NfYWJzMzJjb2RlKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IGxlbl8yICsgaW5jb2RlX21hc2s7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID49IGhvd3RvX2FsaWduX3RhYmxlCi0JICAgICAmJiBnLT5ob3d0byA8PSAoaG93dG9fYWxpZ25fdGFibGUKLQkJCSAgICArIHNpemVvZiAoaG93dG9fYWxpZ25fdGFibGUpIC8gc2l6ZW9mIChob3d0b19hbGlnbl90YWJsZVswXSkKLQkJCSAgICAtIDEpKQotICAgICAgewotCS8qIHN5bW51bSA9PSAtMjsgZXh0ZXJuX21hc2sgbm90IHNldCwgcGNyZWxfbWFzayBzZXQgKi8KLQlyX2lkeCA9IC0yOwotCXJfZXh0ZXJuID0gMDsKLQlyYXdbN10gPSAocGNyZWxfbWFzawotCQkgIHwgKChnLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKSA8PCAxKSk7Ci0gICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByYXdbN10gPSBsZW5fMjsKLSAgICB9Ci0KLSAgICBpZiAocl9pZHggIT0gMCkKLSAgICAgIC8qIGFscmVhZHkgbXVja2VkIHdpdGggcl9leHRlcm4sIHJfaWR4ICovOwotICAgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCSAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotCi0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLSAgICAgIHsKLQkvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQlyX2lkeCA9IDA7Ci0Jcl9leHRlcm4gPSAwOwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkvKiBGaWxsIGluIHN5bWJvbCAqLwotCi0Jcl9leHRlcm4gPSAxOwotCXJfaWR4ID0gKCpnLT5zeW1fcHRyX3B0ciktPnVkYXRhLmk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaWR4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICAgIHJhd1s0XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHggPj4gMTYpOwotICAgICAgcmF3WzVdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCA+PiAgOCk7Ci0gICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOwotICAgIH0gZWxzZSB7Ci0gICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ID4+IDE2KTsKLSAgICAgIHJhd1s1XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHg+PiAgOCk7Ci0gICAgICByYXdbNF0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOwotICAgIH0KLSAgICBpZiAocl9leHRlcm4pCi0gICAgIHJhd1s3XSB8PSBleHRlcm5fbWFzazsKLSAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkgewotICAgIGZyZWUoKFBUUiluYXRpdmUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmcmVlICgoUFRSKW5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotc3RhdGljIGxvbmcKLWJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgewotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gPT0gTlVMTAotCSAgJiYgISBiX291dF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0JKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgfQotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotc3RhdGljIGxvbmcKLWJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiBzaXplb2YgKGFyZWxlbnQgKikgKiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCi0JICAgICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKLQkgICAgICsxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCi0JICAgICgoZXhlY19oZHIoYWJmZCktPmFfdHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKLQkgICAgICsxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAtMTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1iX291dF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKSB7IC8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgaWYgKCEgYW91dF8zMl9tYWtlX3NlY3Rpb25zIChhYmZkKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci0gICAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApIHsKLSAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLQotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQkvKiBVbmtub3duIG1hY2hpbmUgYXJjaCBpcyBPSyAqLwotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF9pOTYwKQkvKiBpOTYwIGRlZmF1bHQgaXMgT0sgKi8KLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1iX291dF9zaXplb2ZfaGVhZGVycyAoaWdub3JlX2FiZmQsIGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYmZkX3ZtYQotZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQotICAvKiBBIHN5bWJvbCBob2xkcyBhIHBvaW50ZXIgdG8gYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0IGZyb20gdGhlCi0gICAgIGJhc2Ugb2YgdGhlIHNlY3Rpb24uICBUbyByZWxvY2F0ZSwgd2UgZmluZCB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsCi0gICAgIGxpdmUgaW4gdGhlIG91dHB1dCBhbmQgYWRkIHRoYXQgaW4gKi8KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIEJGRC4gIExvb2sgaXQgdXAgaW4gdGhlCi0JIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4KLQkgd2UgY29udmVydCBiLm91dCB0byB1c2UgYSBzcGVjaWZpYyBmaW5hbF9saW5rIGZ1bmN0aW9uIGFuZAotCSBjaGFuZ2UgdGhlIGludGVyZmFjZSB0byBiZmRfcmVsYXhfc2VjdGlvbiB0byBub3QgcmVxdWlyZSB0aGUKLQkgZ2VuZXJpYyBzeW1ib2xzLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChpbnB1dF9zZWN0aW9uLT5vd25lciwgbGlua19pbmZvLAotCQkJCQliZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkJCQlmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl2YWx1ZSA9IGgtPnUuZGVmLnZhbHVlICsgb3V0cHV0X2FkZHIgKGgtPnUuZGVmLnNlY3Rpb24pOwotICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXZhbHVlID0gaC0+dS5jLnNpemU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkgIGlucHV0X3NlY3Rpb24tPm93bmVyLCBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQkgIHZhbHVlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgb3V0cHV0X2FkZHIgKHN5bWJvbC0+c2VjdGlvbik7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZWxvY2F0aW9uICovCi0gIHZhbHVlICs9IHJlbG9jLT5hZGRlbmQ7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZAotcGVyZm9ybV9zbGlwIChhYmZkLCBzbGlwLCBpbnB1dF9zZWN0aW9uLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2xpcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIEZpbmQgYWxsIHN5bWJvbHMgcGFzdCB0aGlzIHBvaW50LCBhbmQgbWFrZSB0aGVtIGtub3cKLSAgICAgd2hhdCdzIGhhcHBlbmVkICovCi0gIHdoaWxlICgqcykKLSAgewotICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIC8qIFRoaXMgd2FzIHBvaW50aW5nIGludG8gdGhpcyBzZWN0aW9uLCBzbyBtYW5nbGUgaXQgKi8KLSAgICAgIGlmIChwLT52YWx1ZSA+IHZhbHVlKQotICAgICAgewotCXAtPnZhbHVlIC09c2xpcDsKLQlpZiAocC0+dWRhdGEucCAhPSBOVUxMKQotCSAgewotCSAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgcC0+dWRhdGEucDsKLQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCk7Ci0JICAgIGgtPnJvb3QudS5kZWYudmFsdWUgLT0gc2xpcDsKLQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC51LmRlZi52YWx1ZSA9PSBwLT52YWx1ZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHMrKzsKLQotICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSB3b3JrcyBvdXQgaWYgdGhlIHRoaW5nIHdlIHdhbnQgdG8gZ2V0IHRvIGNhbiBiZQotICAgcmVhY2hlZCB3aXRoIGEgMjRiaXQgb2Zmc2V0IGluc3RlYWQgb2YgYSAzMiBiaXQgb25lLgotICAgSWYgaXQgY2FuLCB0aGVuIGl0IGNoYW5nZXMgdGhlIGFtb2RlICovCi0KLXN0YXRpYyBpbnQKLWFiczMyY29kZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgciwgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnI7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWUgPSBnZXRfdmFsdWUgKHIsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0gIGJmZF92bWEgZG90ID0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pICsgci0+YWRkcmVzczsKLSAgYmZkX3ZtYSBnYXA7Ci0KLSAgLyogU2VlIGlmIHRoZSBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgYXQgd2l0aGluIDJeMjMgYnl0ZXMgb2Ygd2hlcmUKLSAgICAgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0gICAgIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gIGdhcCA9IHZhbHVlIC0gKGRvdCAtIHNocmluayk7Ci0KLQotICBpZiAoLTE8PDIzIDwgKGxvbmcpZ2FwICYmIChsb25nKWdhcCA8IDE8PDIzICkKLSAgewotICAgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDMyYml0Y29kZSBwb3NzaWJsZSAyNCwgdG8gMjRiaXQKLSAgICAgICBwb3NzaWJsZSAzMiAqLwotCi0gICAgci0+aG93dG8gPSAmaG93dG9fcmVsb2NfYWJzMzJjb2Rlc2hydW5rOwotICAgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgZm91ciBieXRlcyAqLwotICAgIHItPmFkZHJlc3MgLT00OwotCi0gICAgLyogVGhpcyB3aWxsIGJlIGZvdXIgYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLSAgICBzaHJpbmsgKz0gNCA7Ci0gICAgcGVyZm9ybV9zbGlwIChhYmZkLCA0LCBpbnB1dF9zZWN0aW9uLCByLT5hZGRyZXNzLXNocmluayArIDQpOwotICB9Ci0gIHJldHVybiBzaHJpbms7Ci19Ci0KLXN0YXRpYyBpbnQKLWFsaWduY29kZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgciwgc2hyaW5rKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBhcmVsZW50ICpyOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotewotICBiZmRfdm1hIGRvdCA9IG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSArIHItPmFkZHJlc3M7Ci0gIGJmZF92bWEgZ2FwOwotICBiZmRfdm1hIG9sZF9lbmQ7Ci0gIGJmZF92bWEgbmV3X2VuZDsKLSAgaW50IHNocmlua19kZWx0YTsKLSAgaW50IHNpemUgPSByLT5ob3d0by0+c2l6ZTsKLQotICAvKiBSZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGFsaWdubWVudCBzbyB0aGF0IGl0J3Mgc3RpbGwgYWxpZ25lZCBidXQKLSAgICAgc21hbGxlciAgLSB0aGUgY3VycmVudCBzaXplIGlzIGFscmVhZHkgdGhlIHNhbWUgc2l6ZSBhcyBvciBiaWdnZXIKLSAgICAgdGhhbiB0aGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgKi8KLQotICAvKiBjYWxjdWxhdGUgdGhlIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBwYWRkaW5nIGJlZm9yZSB3ZSBvcHRpbWl6ZSAqLwotICBvbGRfZW5kID0gKChkb3QgKyBzaXplICkgJiB+c2l6ZSkgKyBzaXplKzE7Ci0gIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBuZXcgZW5kIHdpbGwgYmUgLSByZW1lbWJlciB0aGF0IHdlJ3JlIHNtYWxsZXIKLSAgICAgdGhhbiB3ZSB1c2VkIHRvIGJlICovCi0gIG5ld19lbmQgPSAoKGRvdCAtIHNocmluayArIHNpemUpICYgfnNpemUpOwotCi0gIC8qIFRoaXMgaXMgdGhlIG5ldyBlbmQgKi8KLSAgZ2FwID0gb2xkX2VuZCAtICgoZG90ICsgc2l6ZSkgJiB+c2l6ZSk7Ci0KLSAgc2hyaW5rX2RlbHRhID0gKG9sZF9lbmQgLSBuZXdfZW5kKSAtIHNocmluazsKLQotICBpZiAoc2hyaW5rX2RlbHRhKQotICB7Ci0gICAgLyogQ2hhbmdlIHRoZSByZWxvYyBzbyB0aGF0IGl0IGtub3dzIGhvdyBmYXIgdG8gYWxpZ24gdG8gKi8KLSAgICByLT5ob3d0byA9IGhvd3RvX2RvbmVfYWxpZ25fdGFibGUgKyAoci0+aG93dG8gLSBob3d0b19hbGlnbl90YWJsZSk7Ci0KLSAgICAvKiBFbmNvZGUgdGhlIHN0dWZmIGludG8gdGhlIGFkZGVuZCAtIGZvciBmdXR1cmUgdXNlIHdlIG5lZWQgdG8KLSAgICAgICBrbm93IGhvdyBiaWcgdGhlIHJlbG9jIHVzZWQgdG8gYmUgKi8KLSAgICByLT5hZGRlbmQgPSBvbGRfZW5kIC0gZG90ICsgci0+YWRkcmVzczsKLQotICAgIC8qIFRoaXMgd2lsbCBiZSBOIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuLCBhZGp1c3QgYWxsIHRoZSBzeW1ib2xzICovCi0gICAgcGVyZm9ybV9zbGlwIChhYmZkLCBzaHJpbmtfZGVsdGEsIGlucHV0X3NlY3Rpb24sIHItPmFkZHJlc3MgLSBzaHJpbmspOwotICAgIHNocmluayArPSBzaHJpbmtfZGVsdGE7Ci0gIH0KLSAgcmV0dXJuIHNocmluazsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X2JmZF9yZWxheF9zZWN0aW9uIChhYmZkLCBpLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBpLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBpOwotICBpbnQgc2hyaW5rID0gMCA7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKGlucHV0X2JmZCwKLQkJCQkJICAgICAgaW5wdXRfc2VjdGlvbik7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBvbmx5IHJ1biB0aGlzIHJlbGF4YXRpb24gb25jZS4gIEl0IG1pZ2h0IHdvcmsgdG8gcnVuIGl0Ci0gICAgIG11bHRpcGxlIHRpbWVzLCBidXQgaXQgaGFzbid0IGJlZW4gdGVzdGVkLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKHJlbG9jX3NpemUpCi0gICAgewotICAgICAgbG9uZyByZWxvY19jb3VudDsKLQotICAgICAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICAgICAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogR2V0IHRoZSByZWxvY3MgYW5kIHRoaW5rIGFib3V0IHRoZW0gKi8KLSAgICAgIHJlbG9jX2NvdW50ID0KLQliZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX3ZlY3RvciwKLQkJCQlfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICBhcmVsZW50ICoqcGFyZW50OwotCSAgZm9yIChwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQ7IHBhcmVudCsrKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqciA9ICpwYXJlbnQ7Ci0JICAgICAgc3dpdGNoIChyLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIEFMSUdORVI6Ci0JCSAgLyogQW4gYWxpZ25tZW50IHJlbG9jICovCi0JCSAgc2hyaW5rID0gYWxpZ25jb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmspOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERToKLQkJICAvKiBBIDMyYml0IHJlbG9jIGluIGFuIGFkZHJlc3NpbmcgbW9kZSAqLwotCQkgIHNocmluayA9IGFiczMyY29kZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmssCi0JCQkJICAgICAgbGlua19pbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMzMkNPREVfU0hSVU5LOgotCQkgIHNocmluays9NDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplIC0gc2hyaW5rOwotCi0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1iX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLAotCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgZG9uJ3QgYm90aGVyIHRvIHJlbGF4LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwKLQkJCQkJCSAgICAgICBkYXRhLCByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSAxOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgQkZEX0FTU0VSVCAodHJ1ZSA9PSBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCQlkYXRhLAotCQkJCQkJMCwKLQkJCQkJCWlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQgPSByZWxvY192ZWN0b3I7Ci0gICAgICBhcmVsZW50ICpyZWxvYyA7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IHJ1bjsKLSAgICAgIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgICAgIC8qIEZpbmQgaG93IGxvbmcgYSBydW4gd2UgY2FuIGRvICovCi0gICAgICB3aGlsZSAoZHN0X2FkZHJlc3MgPCBsaW5rX29yZGVyLT5zaXplKQotCXsKLQkgIHJlbG9jID0gKnBhcmVudDsKLQkgIGlmIChyZWxvYykKLQkgICAgewotCSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmVsYXhpbmcgZGlkbid0IHRpZSB1cCB0aGUgYWRkcmVzc2VzIGluIHRoZQotCQkgcmVsb2NhdGlvbiwgc28gd2UgdXNlIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIHdvcmsgb3V0IHRoZQotCQkgcnVuIG9mIG5vbi1yZWxvY2F0ZWQgZGF0YSAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRyZXNzID49IHNyY19hZGRyZXNzKTsKLQkgICAgICBydW4gPSByZWxvYy0+YWRkcmVzcyAtIHNyY19hZGRyZXNzOwotCSAgICAgIHBhcmVudCsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBydW4gPSBsaW5rX29yZGVyLT5zaXplIC0gZHN0X2FkZHJlc3M7Ci0JICAgIH0KLQkgIC8qIENvcHkgdGhlIGJ5dGVzICovCi0JICBmb3IgKGlkeCA9IDA7IGlkeCA8IHJ1bjsgaWR4KyspCi0JICAgIHsKLQkgICAgICBkYXRhW2RzdF9hZGRyZXNzKytdID0gZGF0YVtzcmNfYWRkcmVzcysrXTsKLQkgICAgfQotCi0JICAvKiBOb3cgZG8gdGhlIHJlbG9jYXRpb24gKi8KLQotCSAgaWYgKHJlbG9jKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0JCXsKLQkJY2FzZSBBQlMzMkNPREU6Ci0JCSAgY2FsbGp4X2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsCi0JCQkJICAgc3JjX2FkZHJlc3MgKyBkYXRhLCBkc3RfYWRkcmVzcyArIGRhdGEsCi0JCQkJICAgaW5wdXRfc2VjdGlvbik7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzI6Ci0JCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCQkJICAgICAgKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHNyY19hZGRyZXNzKQotCQkJICAgICAgICsgZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSksCi0JCQkgICAgICBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQkgIHNyY19hZGRyZXNzKz00OwotCQkgIGRzdF9hZGRyZXNzKz00OwotCQkgIGJyZWFrOwotCQljYXNlIENBTExKOgotCQkgIGNhbGxqX2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsIGRhdGEsCi0JCQkJICBzcmNfYWRkcmVzcywgZHN0X2FkZHJlc3MsIGlucHV0X3NlY3Rpb24sCi0JCQkJICBmYWxzZSk7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUxJR05ET05FOgotCQkgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRlbmQgPj0gc3JjX2FkZHJlc3MpOwotCQkgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRlbmQgPD0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBzcmNfYWRkcmVzcyA9IHJlbG9jLT5hZGRlbmQ7Ci0JCSAgZHN0X2FkZHJlc3MgPSAoKGRzdF9hZGRyZXNzICsgcmVsb2MtPmhvd3RvLT5zaXplKQotCQkJCSAmIH5yZWxvYy0+aG93dG8tPnNpemUpOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERV9TSFJVTks6Ci0JCSAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY2FsbHgsIGJ1dCB3ZSd2ZSBmb3VuZCBvdXQgdGhhdCBhCi0JCSAgICAgY2FsbGogd2lsbCByZWFjaCwgc28gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkJICBjYWxsal9jYWxsYmFjayAoaW5wdXRfYmZkLCBsaW5rX2luZm8sIHJlbG9jLCBkYXRhLAotCQkJCSAgc3JjX2FkZHJlc3MgKyA0LCBkc3RfYWRkcmVzcywgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHRydWUpOwotCQkgIGRzdF9hZGRyZXNzKz00OwotCQkgIHNyY19hZGRyZXNzKz04OwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMMjQ6Ci0JCSAgewotCQkgICAgbG9uZyBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJCWRhdGEgKyBzcmNfYWRkcmVzcyk7Ci0JCSAgICBiZmRfdm1hIHZhbHVlOwotCi0JCSAgICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCSAgICB3b3JkID0gKCh3b3JkICYgfkJBTF9NQVNLKQotCQkJICAgIHwgKCgod29yZCAmIEJBTF9NQVNLKQotCQkJCSsgdmFsdWUKLQkJCQktIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKQotCQkJCSsgcmVsb2MtPmFkZGVuZCkKLQkJCSAgICAgICAmIEJBTF9NQVNLKSk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgd29yZCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkJICAgIGRzdF9hZGRyZXNzKz00OwotCQkgICAgc3JjX2FkZHJlc3MrPTQ7Ci0KLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBQQ1JFTDEzOgotCQkgIHsKLQkJICAgIGxvbmcgaW50IHdvcmQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQlkYXRhICsgc3JjX2FkZHJlc3MpOwotCQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQotCQkgICAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCQkgICAgd29yZCA9ICgod29yZCAmIH5QQ1JFTDEzX01BU0spCi0JCQkgICAgfCAoKCh3b3JkICYgUENSRUwxM19NQVNLKQotCQkJCSsgdmFsdWUKLQkJCQkrIHJlbG9jLT5hZGRlbmQKLQkJCQktIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSkKLQkJCSAgICAgICAmIFBDUkVMMTNfTUFTSykpOwotCi0JCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHdvcmQsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCSAgICBkc3RfYWRkcmVzcys9NDsKLQkJICAgIHNyY19hZGRyZXNzKz00OwotCi0JCSAgfQotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQoKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBCdWlsZCB0aGUgdHJhbnNmZXIgdmVjdG9ycyBmb3IgQmlnIGFuZCBMaXR0bGUtRW5kaWFuIEIuT1VUIGZpbGVzLiAgKi8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYl9vdXRfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBiX291dF9iZmRfZ2Nfc2VjdGlvbnMgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLSNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19saXR0bGVfaG9zdDsKLQotY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfYmlnX2hvc3QgPQotewotICAiYi5vdXQuYmlnIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIGJfb3V0X3ZlY19saXR0bGVfaG9zdCwKLSAgCi0gIChQVFIpIDAsCi19OwotCi0KLWNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0ID0KLXsKLSAgImIub3V0LmxpdHRsZSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgYl9vdXRfdmVjX2JpZ19ob3N0LAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jYWNoZS5jIGIvYmZkL2NhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOGRlNGIuLjAwMDAwMDAKLS0tIGEvYmZkL2NhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgLS0gY2FjaGluZyBvZiBmaWxlIGRlc2NyaXB0b3JzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCAoc3RldmVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlGaWxlIGNhY2hpbmcKLQotCVRoZSBmaWxlIGNhY2hpbmcgbWVjaGFuaXNtIGlzIGVtYmVkZGVkIHdpdGhpbiBCRkQgYW5kIGFsbG93cwotCXRoZSBhcHBsaWNhdGlvbiB0byBvcGVuIGFzIG1hbnkgQkZEcyBhcyBpdCB3YW50cyB3aXRob3V0Ci0JcmVnYXJkIHRvIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0ncyBmaWxlIGRlc2NyaXB0b3IKLQlsaW1pdCAob2Z0ZW4gYXMgbG93IGFzIDIwIG9wZW4gZmlsZXMpLiAgVGhlIG1vZHVsZSBpbgotCTw8Y2FjaGUuYz4+IG1haW50YWlucyBhIGxlYXN0IHJlY2VudGx5IHVzZWQgbGlzdCBvZgotCTw8QkZEX0NBQ0hFX01BWF9PUEVOPj4gZmlsZXMsIGFuZCBleHBvcnRzIHRoZSBuYW1lCi0JPDxiZmRfY2FjaGVfbG9va3VwPj4sIHdoaWNoIHJ1bnMgYXJvdW5kIGFuZCBtYWtlcyBzdXJlIHRoYXQKLQl0aGUgcmVxdWlyZWQgQkZEIGlzIG9wZW4uIElmIG5vdCwgdGhlbiBpdCBjaG9vc2VzIGEgZmlsZSB0bwotCWNsb3NlLCBjbG9zZXMgaXQgYW5kIG9wZW5zIHRoZSBvbmUgd2FudGVkLCByZXR1cm5pbmcgaXRzIGZpbGUKLQloYW5kbGUuIAotCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLXN0YXRpYyB2b2lkIGluc2VydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc25pcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY2xvc2Vfb25lIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGJmZF9jYWNoZV9kZWxldGUgUEFSQU1TICgoYmZkICopKTsKLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JQkZEX0NBQ0hFX01BWF9PUEVOIG1hY3JvCi0KLURFU0NSSVBUSU9OCi0JVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHdoaWNoIHRoZSBjYWNoZSB3aWxsIGtlZXAgb3BlbiBhdAotCW9uZSB0aW1lLgotCi0uI2RlZmluZSBCRkRfQ0FDSEVfTUFYX09QRU4gMTAKLQotKi8KLQotLyogVGhlIG51bWJlciBvZiBCRkQgZmlsZXMgd2UgaGF2ZSBvcGVuLiAgKi8KLQotc3RhdGljIGludCBvcGVuX2ZpbGVzOwotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfbGFzdF9jYWNoZQotCi1TWU5PUFNJUwotCWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi1ERVNDUklQVElPTgotCVplcm8sIG9yIGEgcG9pbnRlciB0byB0aGUgdG9wbW9zdCBCRkQgb24gdGhlIGNoYWluLiAgVGhpcyBpcwotCXVzZWQgYnkgdGhlIDw8YmZkX2NhY2hlX2xvb2t1cD4+IG1hY3JvIGluIEBmaWxle2xpYmJmZC5ofSB0bwotCWRldGVybWluZSB3aGVuIGl0IGNhbiBhdm9pZCBhIGZ1bmN0aW9uIGNhbGwuCi0qLwotCi1iZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKgotICBJTlRFUk5BTF9GVU5DVElPTgotICAJYmZkX2NhY2hlX2xvb2t1cAotIAotICBERVNDUklQVElPTgotIAlDaGVjayB0byBzZWUgaWYgdGhlIHJlcXVpcmVkIEJGRCBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBvbmUKLSAJbG9va2VkIHVwLiBJZiBzbywgdGhlbiBpdCBjYW4gdXNlIHRoZSBzdHJlYW0gaW4gdGhlIEJGRCB3aXRoCi0gCWltcHVuaXR5LCBzaW5jZSBpdCBjYW4ndCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgbG9va3VwOwotIAlvdGhlcndpc2UsIGl0IGhhcyB0byBwZXJmb3JtIHRoZSBjb21wbGljYXRlZCBsb29rdXAgZnVuY3Rpb24uCi0gCi0gIC4jZGVmaW5lIGJmZF9jYWNoZV9sb29rdXAoeCkgXAotICAuICAgICgoeCk9PWJmZF9sYXN0X2NhY2hlPyBcCi0gIC4gICAgICAoRklMRSopKGJmZF9sYXN0X2NhY2hlLT5pb3N0cmVhbSk6IFwKLSAgLiAgICAgICBiZmRfY2FjaGVfbG9va3VwX3dvcmtlcih4KSkKLSAKLSAKLSAqLwotCi0vKiBJbnNlcnQgYSBCRkQgaW50byB0aGUgY2FjaGUuICAqLwotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWluc2VydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2xhc3RfY2FjaGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhYmZkLT5scnVfbmV4dCA9IGFiZmQ7Ci0gICAgICBhYmZkLT5scnVfcHJldiA9IGFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWJmZC0+bHJ1X25leHQgPSBiZmRfbGFzdF9jYWNoZTsKLSAgICAgIGFiZmQtPmxydV9wcmV2ID0gYmZkX2xhc3RfY2FjaGUtPmxydV9wcmV2OwotICAgICAgYWJmZC0+bHJ1X3ByZXYtPmxydV9uZXh0ID0gYWJmZDsKLSAgICAgIGFiZmQtPmxydV9uZXh0LT5scnVfcHJldiA9IGFiZmQ7Ci0gICAgfQotICBiZmRfbGFzdF9jYWNoZSA9IGFiZmQ7Ci19Ci0KLS8qIFJlbW92ZSBhIEJGRCBmcm9tIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotc25pcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT5scnVfcHJldi0+bHJ1X25leHQgPSBhYmZkLT5scnVfbmV4dDsKLSAgYWJmZC0+bHJ1X25leHQtPmxydV9wcmV2ID0gYWJmZC0+bHJ1X3ByZXY7Ci0gIGlmIChhYmZkID09IGJmZF9sYXN0X2NhY2hlKQotICAgIHsKLSAgICAgIGJmZF9sYXN0X2NhY2hlID0gYWJmZC0+bHJ1X25leHQ7Ci0gICAgICBpZiAoYWJmZCA9PSBiZmRfbGFzdF9jYWNoZSkKLQliZmRfbGFzdF9jYWNoZSA9IE5VTEw7Ci0gICAgfQotfQotCi0vKiBXZSBuZWVkIHRvIG9wZW4gYSBuZXcgZmlsZSwgYW5kIHRoZSBjYWNoZSBpcyBmdWxsLiAgRmluZCB0aGUgbGVhc3QKLSAgIHJlY2VudGx5IHVzZWQgY2FjaGVhYmxlIEJGRCBhbmQgY2xvc2UgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY2xvc2Vfb25lICgpCi17Ci0gIHJlZ2lzdGVyIGJmZCAqa2lsbDsKLQotICBpZiAoYmZkX2xhc3RfY2FjaGUgPT0gTlVMTCkKLSAgICBraWxsID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoa2lsbCA9IGJmZF9sYXN0X2NhY2hlLT5scnVfcHJldjsKLQkgICAhIGtpbGwtPmNhY2hlYWJsZTsKLQkgICBraWxsID0ga2lsbC0+bHJ1X3ByZXYpCi0JewotCSAgaWYgKGtpbGwgPT0gYmZkX2xhc3RfY2FjaGUpCi0JICAgIHsKLQkgICAgICBraWxsID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGtpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgbm8gb3BlbiBjYWNoZWFibGUgQkZEJ3MuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGtpbGwtPndoZXJlID0gZnRlbGwgKChGSUxFICopIGtpbGwtPmlvc3RyZWFtKTsKLQotICByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSAoa2lsbCk7Ci19Ci0KLS8qIENsb3NlIGEgQkZEIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgY2FjaGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmZkX2NhY2hlX2RlbGV0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuIHJldDsKLQotICBpZiAoZmNsb3NlICgoRklMRSAqKSBhYmZkLT5pb3N0cmVhbSkgPT0gMCkKLSAgICByZXQgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgIH0KLQotICBzbmlwIChhYmZkKTsKLQotICBhYmZkLT5pb3N0cmVhbSA9IE5VTEw7Ci0gIC0tb3Blbl9maWxlczsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfaW5pdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NhY2hlX2luaXQgKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQWRkIGEgbmV3bHkgb3BlbmVkIEJGRCB0byB0aGUgY2FjaGUuCi0qLwotCi1ib29sZWFuCi1iZmRfY2FjaGVfaW5pdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBCRkRfQVNTRVJUIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKTsKLSAgaWYgKG9wZW5fZmlsZXMgPj0gQkZEX0NBQ0hFX01BWF9PUEVOKQotICAgIHsKLSAgICAgIGlmICghIGNsb3NlX29uZSAoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpbnNlcnQgKGFiZmQpOwotICArK29wZW5fZmlsZXM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfY2xvc2UKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jYWNoZV9jbG9zZSAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZW1vdmUgdGhlIEJGRCBAdmFye2FiZmR9IGZyb20gdGhlIGNhY2hlLiBJZiB0aGUgYXR0YWNoZWQgZmlsZSBpcyBvcGVuLAotCXRoZW4gY2xvc2UgaXQgdG9vLgotCi1SRVRVUk5TCi0JPDxmYWxzZT4+IGlzIHJldHVybmVkIGlmIGNsb3NpbmcgdGhlIGZpbGUgZmFpbHMsIDw8dHJ1ZT4+IGlzCi0JcmV0dXJuZWQgaWYgYWxsIGlzIHdlbGwuCi0qLwotCi1ib29sZWFuCi1iZmRfY2FjaGVfY2xvc2UgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmlvc3RyZWFtID09IE5VTEwKLSAgICAgIHx8IChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGJmZF9jYWNoZV9kZWxldGUgKGFiZmQpOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfb3Blbl9maWxlCi0KLVNZTk9QU0lTCi0JRklMRSogYmZkX29wZW5fZmlsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCUNhbGwgdGhlIE9TIHRvIG9wZW4gYSBmaWxlIGZvciBAdmFye2FiZmR9LiAgUmV0dXJuIHRoZSA8PEZJTEUgKj4+Ci0JKHBvc3NpYmx5IDw8TlVMTD4+KSB0aGF0IHJlc3VsdHMgZnJvbSB0aGlzIG9wZXJhdGlvbi4gIFNldCB1cCB0aGUKLQlCRkQgc28gdGhhdCBmdXR1cmUgYWNjZXNzZXMga25vdyB0aGUgZmlsZSBpcyBvcGVuLiBJZiB0aGUgPDxGSUxFICo+PgotCXJldHVybmVkIGlzIDw8TlVMTD4+LCB0aGVuIGl0IHdvbid0IGhhdmUgYmVlbiBwdXQgaW4gdGhlCi0JY2FjaGUsIHNvIGl0IHdvbid0IGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0LgotKi8KLQotRklMRSAqCi1iZmRfb3Blbl9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPmNhY2hlYWJsZSA9IHRydWU7CS8qIEFsbG93IGl0IHRvIGJlIGNsb3NlZCBsYXRlci4gKi8KLQotICBpZiAob3Blbl9maWxlcyA+PSBCRkRfQ0FDSEVfTUFYX09QRU4pCi0gICAgewotICAgICAgaWYgKCEgY2xvc2Vfb25lICgpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICBzd2l0Y2ggKGFiZmQtPmRpcmVjdGlvbikKLSAgICB7Ci0gICAgY2FzZSByZWFkX2RpcmVjdGlvbjoKLSAgICBjYXNlIG5vX2RpcmVjdGlvbjoKLSAgICAgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJvdGhfZGlyZWN0aW9uOgotICAgIGNhc2Ugd3JpdGVfZGlyZWN0aW9uOgotICAgICAgaWYgKGFiZmQtPm9wZW5lZF9vbmNlID09IHRydWUpCi0JewotCSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1JVQik7Ci0JICBpZiAoYWJmZC0+aW9zdHJlYW0gPT0gTlVMTCkKLQkgICAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1dVQik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENyZWF0ZSB0aGUgZmlsZS4gIFVubGluayBpdCBmaXJzdCwgZm9yIHRoZSBjb252ZW5pZW5jZSBvZgotICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW1zIHdoaWNoIHdvcnJ5IGFib3V0IG92ZXJ3cml0aW5nIHJ1bm5pbmcKLSAgICAgICAgICAgICBiaW5hcmllcy4gICovCi0JICB1bmxpbmsgKGFiZmQtPmZpbGVuYW1lKTsKLQkgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9XQik7Ci0JICBhYmZkLT5vcGVuZWRfb25jZSA9IHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jYWNoZV9pbml0IChhYmZkKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChGSUxFICopIGFiZmQtPmlvc3RyZWFtOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfbG9va3VwX3dvcmtlcgotCi1TWU5PUFNJUwotCUZJTEUgKmJmZF9jYWNoZV9sb29rdXBfd29ya2VyKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbGVkIHdoZW4gdGhlIG1hY3JvIDw8YmZkX2NhY2hlX2xvb2t1cD4+IGZhaWxzIHRvIGZpbmQgYQotCXF1aWNrIGFuc3dlci4gIEZpbmQgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIEB2YXJ7YWJmZH0uICBJZgotCW5lY2Vzc2FyeSwgaXQgb3BlbiBpdC4gIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vcmUgdGhhbgotCTw8QkZEX0NBQ0hFX01BWF9PUEVOPj4gZmlsZXMgb3BlbiwgaXQgdHJpZXMgdG8gY2xvc2Ugb25lIGZpcnN0LCB0bwotCWF2b2lkIHJ1bm5pbmcgb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuICAKLSovCi0KLUZJTEUgKgotYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUpIAotICAgIGFiZmQgPSBhYmZkLT5teV9hcmNoaXZlOwotCi0gIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE1vdmUgdGhlIGZpbGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjYWNoZS4gICovCi0gICAgICBpZiAoYWJmZCAhPSBiZmRfbGFzdF9jYWNoZSkKLQl7Ci0JICBzbmlwIChhYmZkKTsKLQkgIGluc2VydCAoYWJmZCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChiZmRfb3Blbl9maWxlIChhYmZkKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgaWYgKGZzZWVrICgoRklMRSAqKSBhYmZkLT5pb3N0cmVhbSwgYWJmZC0+d2hlcmUsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKEZJTEUgKikgYWJmZC0+aW9zdHJlYW07Ci19CmRpZmYgLS1naXQgYS9iZmQvY2YtaTM4Nmx5bnguYyBiL2JmZC9jZi1pMzg2bHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE0YmRlLi4wMDAwMDAwCi0tLSBhL2JmZC9jZi1pMzg2bHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBMeW54T1MgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIFRBUkdFVF9TWU0JaTM4Nmx5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtaTM4Ni1seW54IgotCi0jZGVmaW5lIExZTlhPUwotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NmLW02OGtseW54LmMgYi9iZmQvY2YtbTY4a2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3NGYxYi4uMDAwMDAwMAotLS0gYS9iZmQvY2YtbTY4a2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgTTY4SyBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2x5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay1seW54IgotI2RlZmluZSBMWU5YT1MKLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY2Ytc3BhcmNseW54LmMgYi9iZmQvY2Ytc3BhcmNseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NGEwOTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NmLXNwYXJjbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTcGFyYyBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0Jc3BhcmNseW54X2NvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLXNwYXJjLWx5bngiCi0KLSNkZWZpbmUgTFlOWE9TCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jaW5jbHVkZSAiY29mZi1zcGFyYy5jIgpkaWZmIC0tZ2l0IGEvYmZkL2Npc2NvLWNvcmUuYyBiL2JmZC9jaXNjby1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTJlNzUuLjAwMDAwMDAKLS0tIGEvYmZkL2Npc2NvLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIENJU0NPIGNyYXNoIGR1bXBzLgotCi1Db3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0vKiBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgcmV0dXJucyBhIGhvc3Qgc2lnbmFsICh0aGlzIHByb2JhYmx5IHNob3VsZAotICAgYmUgZml4ZWQpLiAgKi8KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogZm9yIE1TVkMgYnVpbGRzICovCi0jaWZuZGVmIFNJR1RSQVAKLSMgZGVmaW5lIFNJR1RSQVAgNQotI2VuZGlmCi0jaWZuZGVmIFNJR0VNVAotIyBkZWZpbmUgU0lHRU1UIDYKLSNlbmRpZgotI2lmbmRlZiBTSUdCVVMKLSMgZGVmaW5lIFNJR0JVUyAxMAotI2VuZGlmCi0MCi1pbnQgY3Jhc2hfaW5mb19sb2NzW10gPSB7Ci0gIDB4MDI1MCwJLyogbWlwcywgcHBjLCB4ODYsIGk5NjAgKi8KLSAgMHgwNDAwLAkvKiBtNjhrLCBtaXBzLCB4ODYsIGk5NjAgKi8KLSAgMHgwRkZDLAkvKiBtNjhrLCBtaXBzLCBwcGMsIHg4NiwgaTk2MCAqLwotICAweDMwMDAsCS8qIHBwYyAqLwotICAweDRGRkMsCS8qIG02OGsgKi8KLSAgLTEKLX07Ci0KLSNkZWZpbmUgQ1JBU0hfTUFHSUMJMHhkZWFkMTIzNAotI2RlZmluZSBNQVNLX0FERFIoeCkJKCh4KSAmIDB4MGZmZmZmZmYpCS8qIE1hc2sgY3Jhc2ggaW5mbyBhZGRyZXNzICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgQ1JBU0hfUkVBU09OX05PVENSQVNIRUQgPSAwLAotICAgIENSQVNIX1JFQVNPTl9FWENFUFRJT04gPSAxLAotICAgIENSQVNIX1JFQVNPTl9DT1JSVVBUID0gMiwKLX0gY3Jhc2hyZWFzb247Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciBtYWdpY1s0XTsJCS8qIE1hZ2ljIG51bWJlciAqLwotICBjaGFyIHZlcnNpb25bNF07CQkvKiBWZXJzaW9uIG51bWJlciAqLwotICBjaGFyIHJlYXNvbls0XTsJCS8qIENyYXNoIHJlYXNvbiAqLwotICBjaGFyIGNwdV92ZWN0b3JbNF07CQkvKiBDUFUgdmVjdG9yIGZvciBleGNlcHRpb25zICovCi0gIGNoYXIgcmVnaXN0ZXJzWzRdOwkJLyogUG9pbnRlciB0byBzYXZlZCByZWdpc3RlcnMgKi8KLSAgY2hhciByYW1iYXNlWzRdOwkJLyogQmFzZSBvZiBSQU0gKG5vdCBpbiBWMSBjcmFzaCBpbmZvKSAqLwotICBjaGFyIHRleHRiYXNlWzRdOwkJLyogQmFzZSBvZiAudGV4dCBzZWN0aW9uIChub3QgaW4gVjMgY3Jhc2ggaW5mbykgKi8KLSAgY2hhciBkYXRhYmFzZVs0XTsJCS8qIEJhc2Ugb2YgLmRhdGEgc2VjdGlvbiAobm90IGluIFYzIGNyYXNoIGluZm8pICovCi0gIGNoYXIgYnNzYmFzZVs0XTsJCS8qIEJhc2Ugb2YgLmJzcyBzZWN0aW9uIChub3QgaW4gVjMgY3Jhc2ggaW5mbykgKi8KLX0gY3Jhc2hpbmZvX2V4dGVybmFsOwotDAotc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0Ci17Ci0gIGludCBzaWc7Ci19OwotDAotLyogRXhhbWluZSB0aGUgZmlsZSBmb3IgYSBjcmFzaCBpbmZvIHN0cnVjdCBhdCB0aGUgb2Zmc2V0IGdpdmVuIGJ5Ci0gICBDUkFTSF9JTkZPX0xPQy4gKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY2lzY29fY29yZV9maWxlX3ZhbGlkYXRlIChhYmZkLCBjcmFzaF9pbmZvX2xvYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY3Jhc2hfaW5mb19sb2M7Ci17Ci0gIGNoYXIgYnVmWzRdOwotICB1bnNpZ25lZCBpbnQgY3Jhc2hpbmZvX29mZnNldDsKLSAgY3Jhc2hpbmZvX2V4dGVybmFsIGNyYXNoaW5mbzsKLSAgaW50IG5yZWFkOwotICB1bnNpZ25lZCBpbnQgbWFnaWM7Ci0gIHVuc2lnbmVkIGludCB2ZXJzaW9uOwotICB1bnNpZ25lZCBpbnQgcmFtYmFzZTsKLSAgc2VjX3B0ciBhc2VjdDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGNyYXNoX2luZm9fbG9jLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkIChidWYsIDEsIDQsIGFiZmQpOwotICBpZiAobnJlYWQgIT0gNCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGNyYXNoaW5mb19vZmZzZXQgPSBNQVNLX0FERFIgKGJmZF9nZXRfMzIgKGFiZmQsIGJ1ZikpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3Jhc2hpbmZvX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgewotICAgICAgLyogTW9zdCBsaWtlbHkgd2UgZmFpbGVkIGJlY2F1c2Ugb2YgYSBib2d1cyAoaHVnZSkgb2Zmc2V0ICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBucmVhZCA9IGJmZF9yZWFkICgmY3Jhc2hpbmZvLCAxLCBzaXplb2YgKGNyYXNoaW5mbyksIGFiZmQpOwotICBpZiAobnJlYWQgIT0gc2l6ZW9mIChjcmFzaGluZm8pKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBtYWdpYyA9IGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5tYWdpYyk7Ci0gIGlmIChtYWdpYyAhPSBDUkFTSF9NQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB2ZXJzaW9uID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnZlcnNpb24pOwotICBpZiAodmVyc2lvbiA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICh2ZXJzaW9uID09IDEpCi0gICAgewotICAgICAgLyogVjEgY29yZSBkdW1wcyBkb24ndCBzcGVjaWZ5IHRoZSBkdW1wIGJhc2UsIGFzc3VtZSAwICovCi0gICAgICByYW1iYXNlID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByYW1iYXNlID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJhbWJhc2UpOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUuICAqLwotCi0gIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSA9Ci0gICAgKChzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QgKikKLSAgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0KSkpOwotICBpZiAoYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3dpdGNoICgoY3Jhc2hyZWFzb24pIGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yZWFzb24pKQotICAgIHsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9OT1RDUkFTSEVEOgotICAgICAgLyogQ3Jhc2ggZmlsZSBwcm9iYWJseSBjYW1lIGZyb20gd3JpdGUgY29yZS4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9DT1JSVVBUOgotICAgICAgLyogVGhlIGNyYXNoIGNvbnRleHQgYXJlYSB3YXMgY29ycnVwdCAtLSBwcm9jZWVkIHdpdGggY2F1dGlvbi4KLQkgV2UgaGF2ZSBubyB3YXkgb2YgcGFzc2luZyB0aGlzIGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlIGNhbGxlci4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9FWENFUFRJT046Ci0gICAgICAvKiBDcmFzaCBvY2N1cmVkIGR1ZSB0byBDUFUgZXhjZXB0aW9uLiAgKi8KLQotICAgICAgLyogVGhpcyBpcyA2OGstc3BlY2lmaWM7IGZvciBNSVBTIHdlJ2xsIG5lZWQgdG8gaW50ZXJwcmV0Ci0JIGNwdV92ZWN0b3IgZGlmZmVyZW50bHkgYmFzZWQgb24gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uCi0JIChzaW5jZSBDSVNDTyBjb3JlIGZpbGVzIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgcHJvY2Vzc29yCi0JIGVuY29kZWQgaW4gdGhlbSkuICAqLwotCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5jcHVfdmVjdG9yKSkKLQl7Ci0JICAgLyogYnVzIGVycm9yICAgICAgICAgICAqLwotCWNhc2UgMiA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyBicmVhazsKLQkgICAvKiBhZGRyZXNzIGVycm9yICAgICAgICovCi0JY2FzZSAzIDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7IGJyZWFrOwotCSAgIC8qIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KLQljYXNlIDQgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOwotCSAgIC8qIHplcm8gZGl2aWRlICAgICAgICAgKi8KLQljYXNlIDUgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgIC8qIGNoayBpbnN0cnVjdGlvbiAgICAgKi8KLQljYXNlIDYgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgYnJlYWs7Ci0JICAgLyogdHJhcHYgaW5zdHJ1Y3Rpb24gICAqLwotCWNhc2UgNyA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyBicmVhazsKLQkgICAvKiBwcml2aWxlZ2UgdmlvbGF0aW9uICovCi0JY2FzZSA4IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdTRUdWOyBicmVhazsKLQkgICAvKiB0cmFjZSB0cmFwICAgICAgICAgICovCi0JY2FzZSA5IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMDEwIGVtdWxhdG9yICAqLwotCWNhc2UgMTA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMTExIGVtdWxhdG9yICAqLwotCWNhc2UgMTE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0KLQkgIC8qIENvcHJvY2Vzc29yIHByb3RvY29sIHZpb2xhdGlvbi4gIFVzaW5nIGEgc3RhbmRhcmQgTU1VIG9yIEZQVQotCSAgICAgdGhpcyBjYW5ub3QgYmUgdHJpZ2dlcmVkIGJ5IHNvZnR3YXJlLiAgQ2FsbCBpdCBhIFNJR0JVUy4gICovCi0JY2FzZSAxMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7ICBicmVhazsKLQotCSAgLyogaW50ZXJydXB0ICAgICAgICAgICAqLwotCWNhc2UgMzE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSU5UOyAgYnJlYWs7Ci0JICAvKiBicmVha3BvaW50ICAgICAgICAgICovCi0JY2FzZSAzMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0KLQkgIC8qIGZsb2F0aW5nIHBvaW50IGVyciAgKi8KLQljYXNlIDQ4OiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogZmxvYXRpbmcgcG9pbnQgZXJyICAqLwotCWNhc2UgNDk6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiB6ZXJvIGRpdmlkZSAgICAgICAgICovCi0JY2FzZSA1MDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIHVuZGVyZmxvdyAgICAgICAgICAgKi8KLQljYXNlIDUxOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogb3BlcmFuZCBlcnJvciAgICAgICAqLwotCWNhc2UgNTI6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAgLyogb3ZlcmZsb3cgICAgICAgICAgICAqLwotCWNhc2UgNTM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiBOQU4gICAgICAgICAgICAgICAgICovCi0JY2FzZSA1NDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQlkZWZhdWx0OgotI2lmbmRlZiBTSUdFTVQKLSNkZWZpbmUgU0lHRU1UIFNJR1RSQVAKLSNlbmRpZgotCSAgLyogInNvZnR3YXJlIGdlbmVyYXRlZCIqLwotCSAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdFTVQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFVua25vd24gY3Jhc2ggcmVhc29uLiAgKi8KLSAgICAgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCi0gIC8qIENyZWF0ZSBhICIucmVnIiBzZWN0aW9uIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgc2F2ZWQKLSAgICAgcmVnaXN0ZXJzLiAqLwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIucmVnIjsKLSAgYXNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgYXNlY3QtPnZtYSA9IDA7Ci0gIGFzZWN0LT5maWxlcG9zID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJlZ2lzdGVycykgLSByYW1iYXNlOwotICAvKiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBleGFjdCBzaXplIG9mIHRoZSBzYXZlZCByZWdpc3RlciBpbmZvLAotICAgICBjaG9vc2UgYSByZWdpc3RlciBzZWN0aW9uIHNpemUgdGhhdCBpcyBlaXRoZXIgdGhlIHJlbWFpbmluZyBwYXJ0Ci0gICAgIG9mIHRoZSBmaWxlLCBvciAxMDI0LCB3aGljaGV2ZXIgaXMgc21hbGxlci4gKi8KLSAgbnJlYWQgPSBzdGF0YnVmLnN0X3NpemUgLSBhc2VjdC0+ZmlsZXBvczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IChucmVhZCA8IDEwMjQpID8gbnJlYWQgOiAxMDI0OwotICBhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotICBhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotICArK2FiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLSAgLyogQ3JlYXRlIGEgIi5jcmFzaCIgc2VjdGlvbiB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIHNhdmVkCi0gICAgIGNyYXNoIGluZm9ybWF0aW9uLiAqLwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIuY3Jhc2giOwotICBhc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBhc2VjdC0+dm1hID0gMDsKLSAgYXNlY3QtPmZpbGVwb3MgPSBjcmFzaGluZm9fb2Zmc2V0OwotICBhc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChjcmFzaGluZm8pOwotICBhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotICBhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotICArK2FiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLSAgLyogQ3JlYXRlIGEgIi5kYXRhIiBzZWN0aW9uIHRoYXQgbWFwcyB0aGUgZW50aXJlIGZpbGUsIHdoaWNoIGlzCi0gICAgIGVzc2VudGlhbGx5IGEgZHVtcCBvZiB0aGUgdGFyZ2V0IHN5c3RlbSdzIFJBTS4gKi8KLQotICBhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoYXNlY3QgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgYXNlY3QtPm5hbWUgPSAiLmRhdGEiOwotICBhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIC8qIFRoZSBzaXplIG9mIG1lbW9yeSBpcyB0aGUgc2l6ZSBvZiB0aGUgY29yZSBmaWxlIGl0c2VsZi4gICovCi0gIGFzZWN0LT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIGFzZWN0LT52bWEgPSByYW1iYXNlOwotICBhc2VjdC0+ZmlsZXBvcyA9IDA7Ci0gIGFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0gICsrYWJmZC0+c2VjdGlvbl9jb3VudDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotICAvKiBHZXQgaGVyZSBpZiB3ZSBoYXZlIGFscmVhZHkgc3RhcnRlZCBmaWxsaW5nIG91dCB0aGUgQkZECi0gICAgIGFuZCB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIGtpbmQuICovCi0KLSBlcnJvcl9yZXR1cm46Ci0gIHsKLSAgICBzZWNfcHRyIG5leHRzZWN0OwotICAgIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3QgIT0gTlVMTDspCi0gICAgICB7Ci0JbmV4dHNlY3QgPSBhc2VjdC0+bmV4dDsKLQlmcmVlIChhc2VjdCk7Ci0JYXNlY3QgPSBuZXh0c2VjdDsKLSAgICAgIH0KLSAgICBmcmVlIChhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNpc2NvX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCAqY3Jhc2hfaW5mb19sb2NwOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQgPSBOVUxMOwotCi0gIGZvciAoY3Jhc2hfaW5mb19sb2NwID0gY3Jhc2hfaW5mb19sb2NzOwotICAgICAgICpjcmFzaF9pbmZvX2xvY3AgIT0gLTEgICYmICB0YXJnZXQgPT0gTlVMTDsKLSAgICAgICBjcmFzaF9pbmZvX2xvY3ArKykKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBjaXNjb19jb3JlX2ZpbGVfdmFsaWRhdGUgKGFiZmQsICpjcmFzaF9pbmZvX2xvY3ApOwotICAgIH0KLSAgcmV0dXJuICh0YXJnZXQpOwotfQotCi1jaGFyICoKLWNpc2NvX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludAotY2lzY29fY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZzsKLX0KLQotYm9vbGVhbgotY2lzY29fY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV9saXR0bGVfdmVjOwotCi1jb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfYmlnX3ZlYyA9Ci0gIHsKLSAgICAiY2lzY28taW9zLWNvcmUtYmlnIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICAgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBjaXNjb19jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGNpc2NvKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgICYgY2lzY29fY29yZV9saXR0bGVfdmVjLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV9saXR0bGVfdmVjID0KLSAgewotICAgICJjaXNjby1pb3MtY29yZS1saXR0bGUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gICAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGNpc2NvX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY2lzY28pLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgJmNpc2NvX2NvcmVfYmlnX3ZlYywKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYTI5ay5jIGIvYmZkL2NvZmYtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI2ODQ0Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFNRCAyOTAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgYXQgTmV3IFlvcmsgVW5pdmVyc2l0eSA3LzgvOTEuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBMjlLIDEKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvYTI5ay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBsb25nIGdldF9zeW1ib2xfdmFsdWUgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGEyOWtfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYm9vbGVhbiAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotCi0jZGVmaW5lIElOU0VSVF9IV09SRChXT1JELEhXT1JEKQlcCi0gICAgKCgoV09SRCkgJiAweGZmMDBmZjAwKSB8ICgoKEhXT1JEKSAmIDB4ZmYwMCkgPDwgOCkgfCAoKEhXT1JEKSYgMHhmZikpCi0jZGVmaW5lIEVYVFJBQ1RfSFdPUkQoV09SRCkgXAotICAgICgoKChXT1JEKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKChXT1JEKSYgMHhmZikpCi0jZGVmaW5lIFNJR05fRVhURU5EX0hXT1JEKEhXT1JEKSBcCi0gICAgKChIV09SRCkgJiAweDgwMDAgPyAoSFdPUkQpfCh+MHhmZmZmTCkgOiAoSFdPUkQpKQotCi0vKiBQcm92aWRlZCB0aGUgc3ltYm9sLCByZXR1cm5zIHRoZSB2YWx1ZSByZWZmZWQgKi8KLXN0YXRpYyBsb25nCi1nZXRfc3ltYm9sX3ZhbHVlIChzeW1ib2wpICAgICAgIAotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgewotICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0gIGVsc2UgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlICsKLSAgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLSAgICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICByZXR1cm4ocmVsb2NhdGlvbik7Ci19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIHBlcmZvcm1pbmcgYWxsIHRoZSAyOWsgcmVsb2NhdGlvbnMgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYTI5a19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIHRoZSBjb25zdGggcmVsb2NhdGlvbiBjb21lcyBpbiB0d28gcGFydHMsIHdlIGhhdmUgdG8gcmVtZW1iZXIKLSAgICAgdGhlIHN0YXRlIGJldHdlZW4gY2FsbHMsIGluIHRoZXNlIHZhcmlhYmxlcyAqLwotICBzdGF0aWMgYm9vbGVhbiBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhcnQxX2NvbnN0aF92YWx1ZTsKLQotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgc3ltX3ZhbHVlOwotICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7Ci0gIGxvbmcgc2lnbmVkX3ZhbHVlOwotCi0gIHVuc2lnbmVkIGxvbmcgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzIDsgLyorIGlucHV0X3NlY3Rpb24tPnZtYSovCi0gIGJmZF9ieXRlICAqaGl0X2RhdGEgPWFkZHIgKyAoYmZkX2J5dGUgKikoZGF0YSk7Ci0JCi0gIHJfdHlwZSA9IHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCkgewotICAgIC8qIFBhcnRpYWwgbGlua2luZyAtIGRvIG5vdGhpbmcgKi8KLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgfQotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICB7Ci0gICAgLyogS2VlcCB0aGUgc3RhdGUgbWFjaGluZSBoYXBweSBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBhZ2FpbiAqLwotICAgIGlmIChyX3R5cGUgPT0gUl9JSElIQUxGKSAKLSAgICB7Ci0gICAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gdHJ1ZTsKLSAgICAgIHBhcnQxX2NvbnN0aF92YWx1ZSAgPSAwOwotICAgIH0KLSAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7Ci0gIH0KLQotICBpZiAoKHBhcnQxX2NvbnN0aF9hY3RpdmUpICYmIChyX3R5cGUgIT0gUl9JSENPTlNUKSkgCi0gIHsKLSAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBfKCJNaXNzaW5nIElIQ09OU1QiKTsKLSAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gIH0KLQotCi0gIHN5bV92YWx1ZSA9IGdldF9zeW1ib2xfdmFsdWUoc3ltYm9sX2luKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkgCi0gIHsKLSAgIGNhc2UgUl9JUkVMOiAJCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBUYWtlIHRoZSB2YWx1ZSBpbiB0aGUgZmllbGQgYW5kIHNpZ24gZXh0ZW5kIGl0ICovCi0gICAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRChpbnNuKTsKLSAgICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRChzaWduZWRfdmFsdWUpOwotICAgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotICAgIC8qIFNlZSB0aGUgbm90ZSBvbiB0aGUgUl9JUkVMIHJlbG9jIGluIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgICBpZiAoc2lnbmVkX3ZhbHVlID09IC0gKGxvbmcpIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotICAgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotICAgIHNpZ25lZF92YWx1ZSArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIGlmICgoc2lnbmVkX3ZhbHVlICYgfjB4M2ZmZmYpID09IDApCi0gICAgewkJCQkvKiBBYnNvbHV0ZSBqbXAvY2FsbCAqLwotICAgICAgaW5zbiB8PSAoMTw8MjQpOwkJLyogTWFrZSBpdCBhYnNvbHV0ZSAqLwotICAgICAgLyogRklYTUU6IFNob3VsZCB3ZSBjaGFuZ2Ugcl90eXBlIHRvIFJfSUFCUyAqLwotICAgIH0gCi0gICAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBSZWxhdGl2ZSBqbXAvY2FsbCwgc28gc3VidHJhY3QgZnJvbSB0aGUgdmFsdWUgdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIHdlJ3JlIGNvbWluZyBmcm9tICovCi0gICAgICBzaWduZWRfdmFsdWUgLT0gKHJlbG9jX2VudHJ5LT5hZGRyZXNzCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoc2lnbmVkX3ZhbHVlPjB4MWZmZmYgfHwgc2lnbmVkX3ZhbHVlPC0weDIwMDAwKSAKLSAgICAgICByZXR1cm4oYmZkX3JlbG9jX292ZXJmbG93KTsKLSAgICB9Ci0gICAgc2lnbmVkX3ZhbHVlID4+PSAyOwotICAgIGluc24gPSBJTlNFUlRfSFdPUkQoaW5zbiwgc2lnbmVkX3ZhbHVlKTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24gLGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUxPSEFMRjogCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICB1bnNpZ25lZF92YWx1ZSA9IEVYVFJBQ1RfSFdPUkQoaW5zbik7Ci0gICAgdW5zaWduZWRfdmFsdWUgKz0gIHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0gICAgYmZkX3B1dF8zMihhYmZkLCBpbnNuLCBoaXRfZGF0YSk7IAotICAgIGJyZWFrOwotICAgY2FzZSBSX0lISUhBTEY6Ci0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBjb25zdGgsIHBhcnQgMSAKLSAgICAgICBKdXN0IGdldCB0aGUgc3ltYm9sIHZhbHVlIHRoYXQgaXMgcmVmZXJlbmNlZCAqLwotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOwotICAgIHBhcnQxX2NvbnN0aF92YWx1ZSA9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgLyogRG9uJ3QgbW9kaWZ5IGluc24gdW50aWwgUl9JSENPTlNUICovCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUhDT05TVDoJCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBjb25zdGgsIHBhcnQgMiAKLSAgICAgICBOb3cgcmVsb2NhdGUgdGhlIHJlZmVyZW5jZSAqLwotICAgIGlmIChwYXJ0MV9jb25zdGhfYWN0aXZlID09IGZhbHNlKSB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgSUhJSEFMRiIpOwotICAgICAgcmV0dXJuKGJmZF9yZWxvY19kYW5nZXJvdXMpOwotICAgIH0KLSAgICAvKiBzeW1fcHRyX3B0ciA9IHJfc3ltbmR4LCBpbiBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKCkgKi8KLSAgICB1bnNpZ25lZF92YWx1ZSA9IDA7CQkvKkVYVFJBQ1RfSFdPUkQoaW5zbikgPDwgMTY7Ki8KLSAgICB1bnNpZ25lZF92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOyAvKiByX3N5bW5keCAqLwotICAgIHVuc2lnbmVkX3ZhbHVlICs9IHBhcnQxX2NvbnN0aF92YWx1ZTsKLSAgICB1bnNpZ25lZF92YWx1ZSA9IHVuc2lnbmVkX3ZhbHVlID4+IDE2OwotICAgIGluc24gPSBJTlNFUlRfSFdPUkQoaW5zbiwgdW5zaWduZWRfdmFsdWUpOwotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfQllURToKLSAgICBpbnNuID0gYmZkX2dldF84KGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgdW5zaWduZWRfdmFsdWUgPSBpbnNuICsgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsJCi0gICAgaWYgKHVuc2lnbmVkX3ZhbHVlICYgMHhmZmZmZmYwMCkKLSAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIGJmZF9wdXRfOChhYmZkLCB1bnNpZ25lZF92YWx1ZSwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9IV09SRDoKLSAgICBpbnNuID0gYmZkX2dldF8xNihhYmZkLCBoaXRfZGF0YSk7IAotICAgIHVuc2lnbmVkX3ZhbHVlID0gaW5zbiArIHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7CQotICAgIGlmICh1bnNpZ25lZF92YWx1ZSAmIDB4ZmZmZjAwMDApCi0gICAgICByZXR1cm4oYmZkX3JlbG9jX292ZXJmbG93KTsKLSAgICBiZmRfcHV0XzE2KGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfV09SRDoKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsgIAotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAqZXJyb3JfbWVzc2FnZSA9IF8oIlVucmVjb2duaXplZCByZWxvYyIpOwotICAgIHJldHVybiAoYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gIH0KLQotCi0gIHJldHVybihiZmRfcmVsb2Nfb2spOwkKLX0KLQotLyogICAgICB0eXBlCSAgIHJpZ2h0c2hpZnQKLQkJICAgICAgIHNpemUKLQkJCSAgYml0c2l6ZQotCQkJICAgICAgIHBjLXJlbGF0aXZlCi0JCQkJICAgICBiaXRwb3MKLQkJCQkJIGFic29sdXRlCi0JCQkJCSAgICAgY29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJCQkJCSAgc3BlY2lhbF9mdW5jdGlvbgotCQkJCQkJICAgIHJlbG9jYXRpb24gbmFtZQotCQkJCQkJCSAgICAgICBwYXJ0aWFsX2lucGxhY2UgCi0JCQkJCQkJCSAgICAgIHNyY19tYXNrCi0qLwotCi0vKkZJWE1FOiBJJ20gbm90IHJlYWwgc3VyZSBhYm91dCB0aGlzIHRhYmxlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIHtSX0FCUywgICAgIDAsIDMsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYTI5a19yZWxvYywiQUJTIiwgICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEVNUFRZX0hPV1RPICgyKSwKLSAgRU1QVFlfSE9XVE8gKDMpLAotICBFTVBUWV9IT1dUTyAoNCksCi0gIEVNUFRZX0hPV1RPICg1KSwKLSAgRU1QVFlfSE9XVE8gKDYpLAotICBFTVBUWV9IT1dUTyAoNyksCi0gIEVNUFRZX0hPV1RPICg4KSwKLSAgRU1QVFlfSE9XVE8gKDkpLAotICBFTVBUWV9IT1dUTyAoMTApLAotICBFTVBUWV9IT1dUTyAoMTEpLAotICBFTVBUWV9IT1dUTyAoMTIpLAotICBFTVBUWV9IT1dUTyAoMTMpLAotICBFTVBUWV9IT1dUTyAoMTQpLAotICBFTVBUWV9IT1dUTyAoMTUpLAotICBFTVBUWV9IT1dUTyAoMTYpLAotICBFTVBUWV9IT1dUTyAoMTcpLAotICBFTVBUWV9IT1dUTyAoMTgpLAotICBFTVBUWV9IT1dUTyAoMTkpLAotICBFTVBUWV9IT1dUTyAoMjApLAotICBFTVBUWV9IT1dUTyAoMjEpLAotICBFTVBUWV9IT1dUTyAoMjIpLAotICBFTVBUWV9IT1dUTyAoMjMpLAotICB7Ul9JUkVMLCAgICAwLCAzLCAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCxhMjlrX3JlbG9jLCJJUkVMIiwgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtSX0lBQlMsICAgIDAsIDMsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIklBQlMiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfSUxPSEFMRiwgMCwgMywgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklMT0hBTEYiLCB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge1JfSUhJSEFMRiwgMCwgMywgMTYsIHRydWUsICAxNiwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBhMjlrX3JlbG9jLCJJSElIQUxGIiwgdHJ1ZSwgMHhmZmZmMDAwMCwweGZmZmYwMDAwLCBmYWxzZX0sCi0gIHtSX0lIQ09OU1QsIDAsIDMsIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBhMjlrX3JlbG9jLCJJSENPTlNUIiwgdHJ1ZSwgMHhmZmZmMDAwMCwweGZmZmYwMDAwLCBmYWxzZX0sCi0gIHtSX0JZVEUsICAgIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiQllURSIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2V9LAotICB7Ul9IV09SRCwgICAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBhMjlrX3JlbG9jLCJIV09SRCIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtSX1dPUkQsICAgIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIldPUkQiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLX07Ci0KLSNkZWZpbmUgQkFETUFHKHgpIEEyOUtCQURNQUcoeCkKLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQscmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gICAgc3RhdGljIGJmZF92bWEgaWhpaGFsZl92YWRkciA9IChiZmRfdm1hKSAtMTsKLQotICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwkJCi0gICAgcmVsZW50LT5ob3d0byA9IGhvd3RvX3RhYmxlICsgcmVsb2MtPnJfdHlwZTsKLSAgICBpZiAocmVsb2MtPnJfdHlwZSA9PSBSX0lIQ09OU1QpIAotICAgIHsJCQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gUl9JSENPTlNUIHNob3VsZCBhbHdheXMgYmUgdGhlIGFkZHJlc3Mgb2YKLQkgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBSX0lISUhBTEYuICByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotCSBhcmUgY29ycmVjdCwgYnV0IHJlbG9jcyBnZW5lcmF0ZWQgYnkgSGlnaCBDIGFyZSBkaWZmZXJlbnQgKEkKLQkgY2FuJ3QgZmlndXJlIG91dCB3aGF0IHRoZSBhZGRyZXNzIG1lYW5zIGZvciBIaWdoIEMpLiAgV2UgY2FuCi0JIGhhbmRsZSBib3RoIGdhcyBhbmQgSGlnaCBDIGJ5IGlnbm9yaW5nIHRoZSBhZGRyZXNzIGhlcmUsIGFuZAotCSBzaW1wbHkgcmV1c2luZyB0aGUgYWRkcmVzcyBzYXZlZCBmb3IgUl9JSElIQUxGLiAgKi8KLSAgICAgICAgaWYgKGloaWhhbGZfdmFkZHIgPT0gKGJmZF92bWEpIC0xKQotCSAgYWJvcnQgKCk7Ci0JcmVsZW50LT5hZGRyZXNzID0gaWhpaGFsZl92YWRkcjsKLQlpaGloYWxmX3ZhZGRyID0gKGJmZF92bWEpIC0xOwotCXJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfc3ltbmR4OwkJCi0JcmVsZW50LT5zeW1fcHRyX3B0cj0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgYXN5bWJvbCAqcHRyOwotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotCi0gICAgICBwdHIgPSAqKHJlbGVudC0+c3ltX3B0cl9wdHIpOwotCi0gICAgICBpZiAocHRyIAotCSAgJiYgYmZkX2FzeW1ib2xfYmZkKHB0cikgPT0gYWJmZAkJCi0KLQkgICYmICgocHRyLT5mbGFncyAmIEJTRl9PTERfQ09NTU9OKT09IDApKQkKLSAgICAgIHsJCQkJCQkKLQkgIHJlbGVudC0+YWRkZW5kID0gMDsKLSAgICAgIH0JCQkJCQkKLSAgICAgIGVsc2UKLSAgICAgIHsJCQkJCQotCSAgcmVsZW50LT5hZGRlbmQgPSAwOwkJCQotICAgICAgfQkJCQotICAgICAgcmVsZW50LT5hZGRyZXNzLT0gc2VjdGlvbi0+dm1hOwotICAgICAgaWYgKHJlbG9jLT5yX3R5cGUgPT0gUl9JSElIQUxGKQotCWloaWhhbGZfdmFkZHIgPSByZWxlbnQtPmFkZHJlc3M7Ci0gICAgICBlbHNlIGlmIChpaGloYWxmX3ZhZGRyICE9IChiZmRfdm1hKSAtMSkKLQlhYm9ydCAoKTsKLSAgfQotfQotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0gIGJvb2xlYW4gaGloYWxmOwotICBiZmRfdm1hIGhpaGFsZl92YWw7Ci0KLSAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhCi0gICAgIHRoaW5nLiAgVGhlIGNhbGxlciB3aWxsIHRha2UgY2FyZSBvZiBhZGp1c3RpbmcgdGhlIHJlbG9jCi0gICAgIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIGJmZF9ieXRlICpsb2M7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgbG9uZyBzaWduZWRfdmFsdWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEgfHwgcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0KLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogQW4gUl9JSENPTlNUIHJlbG9jIGRvZXMgbm90IGhhdmUgYSBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKLSAgICAgICAgIHN5bWJvbCBpbmRleCBpcyBhbiBhZGRlbmQuICBSX0lIQ09OU1QgaXMgYWx3YXlzIHVzZWQgaW4KLSAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggUl9JSEhBTEYuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfSUhDT05TVCkKLQl7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkJc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCQkgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JCSAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBzeW0tPm5fdmFsdWUKLQkJCSAtIHNlYy0+dm1hKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSENPTlNUIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGYgPSBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JY2FzZSBSX0lSRUw6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCi0JICAvKiBFeHRyYWN0IHRoZSBhZGRlbmQuICAqLwotCSAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRCAoaW5zbik7Ci0JICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRCAoc2lnbmVkX3ZhbHVlKTsKLQkgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotCSAgLyogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQ09GRgotCSAgICAgYTI5ay4gIEluIHRoZSBvcmlnaW5hbCBBTUQgdmVyc2lvbiwgdGhlIHZhbHVlIHN0b3JlZCBpbgotCSAgICAgdGhlIGZpZWxkIGZvciB0aGUgUl9JUkVMIHJlbG9jIGlzIGEgc2ltcGxlIGFkZGVuZC4gIEluCi0JICAgICB0aGUgR05VIHZlcnNpb24sIHRoZSB2YWx1ZSBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3MKLQkgICAgIG9mIHRoZSByZWxvYyB3aXRoaW4gc2VjdGlvbi4gIFdlIHRyeSB0byBjb3BlIGhlcmUgYnkKLQkgICAgIGFzc3VtaW5nIHRoZSBBTUQgdmVyc2lvbiwgdW5sZXNzIHRoZSBhZGRlbmQgaXMgZXhhY3RseQotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzOyBpbiB0aGUgbGF0dGVyIGNhc2Ugd2UgYXNzdW1lCi0JICAgICB0aGUgR05VIHZlcnNpb24uICBUaGlzIG1lYW5zIHRoYXQgc29tZXRoaW5nIGxpa2UKLQkgICAgICAgICAudGV4dAotCQkgbm9wCi0JCSBqbXAgaS00Ci0JICAgICB3aWxsIGZhaWwsIGJlY2F1c2UgdGhlIGFkZGVuZCBvZiAtNCB3aWxsIGhhcHBlbiB0byBlcXVhbAotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFRoZQotCSAgICAgY29tcGlsZXIgd2lsbCBuZXZlciBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpcy4KLQotCSAgICAgQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIHdlIG1heSB3YW50IHRvIHRha2Ugb3V0IHRoaXMKLQkgICAgIGNoZWNrLiAgKi8KLQotCSAgaWYgKHNpZ25lZF92YWx1ZSA9PSAtIChsb25nKSAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkKLQkgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotCSAgLyogRGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUganVtcC4gICovCi0JICBzaWduZWRfdmFsdWUgKz0gdmFsOwotCi0JICBpZiAoKHNpZ25lZF92YWx1ZSAmIH4weDNmZmZmKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHVzZSBhbiBhYnNvbHV0ZSBqdW1wLiAgKi8KLQkgICAgICBpbnNuIHw9ICgxIDw8IDI0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTWFrZSB0aGUgZGVzdGluYXRpb24gUEMgcmVsYXRpdmUuICAqLwotCSAgICAgIHNpZ25lZF92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIGlmIChzaWduZWRfdmFsdWUgPiAweDFmZmZmIHx8IHNpZ25lZF92YWx1ZSA8IC0gMHgyMDAwMCkKLQkJewotCQkgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBzaWduZWRfdmFsdWUgPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUHV0IHRoZSBhZGp1c3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIHNpZ25lZF92YWx1ZSA+Pj0gMjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHNpZ25lZF92YWx1ZSk7Ci0KLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lMT0hBTEY6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEIChpbnNuKTsKLQkgIHVuc2lnbmVkX3ZhbHVlICs9IHZhbDsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgbG9jKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lISUhBTEY6Ci0JICAvKiBTYXZlIHRoZSB2YWx1ZSBmb3IgdGhlIFJfSUhDT05TVCByZWxvYy4gICovCi0JICBoaWhhbGYgPSB0cnVlOwotCSAgaGloYWxmX3ZhbCA9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lIQ09OU1Q6Ci0JICBpZiAoISBoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSElIQUxGIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGZfdmFsID0gMDsKLQkgICAgfQotCi0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSByZWwtPnJfc3ltbmR4ICsgaGloYWxmX3ZhbDsKLQkgIHVuc2lnbmVkX3ZhbHVlID4+PSAxNjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGhpaGFsZiA9IGZhbHNlOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9CWVRFOgotCWNhc2UgUl9IV09SRDoKLQljYXNlIFJfV09SRDoKLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZSwKLQkJCQkJICBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGlmIChyc3RhdCA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIGVsc2UgaWYgKHJzdGF0ICE9IGJmZF9yZWxvY19vaykKLQkgICAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChvdmVyZmxvdykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICAgICAgbmFtZSA9IGJ1ZjsKLQkgICAgfQotCi0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sIG5hbWUsIGhvd3RvX3RhYmxlW3JlbC0+cl90eXBlXS5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzeW1uZHggb2YgYSBSX0lIQ09OU1QgcmVsb2MsIHNpbmNlIGl0Ci0gICBpcyBhY3R1YWxseSBhbiBhZGRlbmQsIG5vdCBhIHN5bWJvbCBpbmRleCBhdCBhbGwuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCi0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmliZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgIGJvb2xlYW4gKmFkanVzdGVkcDsKLXsKLSAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX0lIQ09OU1QpCi0gICAgKmFkanVzdGVkcCA9IHRydWU7Ci0gIGVsc2UKLSAgICAqYWRqdXN0ZWRwID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGEyOWtjb2ZmX2JpZ192ZWMsICJjb2ZmLWEyOWstYmlnIiwgMCwgU0VDX1JFQURPTkxZLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi1hbHBoYS5jIGIvYmZkL2NvZmYtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyNTMxOS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFMUEhBIEV4dGVuZGVkLUNvZmYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgTW9kaWZpZWQgZnJvbSBjb2ZmLW1pcHMuYyBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+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+YXJjaF9oZWFkZXI7Ci0gICAgICBzaXplID0gc3RydG9sIChoLT5hcl9zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4uLgotCSBOb3RlIHRoYXQgbGFzdF9maWxlLT5vcmlnaW4gY2FuIGJlIG9kZCBpbiB0aGUgY2FzZSBvZgotCSBCU0QtNC40LXN0eWxlIGVsZW1lbnQgd2l0aCBhIGxvbmcgb2RkIHNpemUuICovCi0gICAgICBmaWxlc3RhcnQgPSBsYXN0X2ZpbGUtPm9yaWdpbiArIHNpemU7Ci0gICAgICBmaWxlc3RhcnQgKz0gZmlsZXN0YXJ0ICUgMjsKLSAgICB9Ci0KLSAgcmV0dXJuIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotLyogT3BlbiB0aGUgYXJjaGl2ZSBmaWxlIGdpdmVuIGFuIGluZGV4IGludG8gdGhlIGFybWFwLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIGVudHJ5LT5maWxlX29mZnNldCk7Ci19Ci0MCi0vKiBUaGlzIGlzIHRoZSBFQ09GRiBiYWNrZW5kIHN0cnVjdHVyZS4gIFRoZSBiYWNrZW5kIGZpZWxkIG9mIHRoZQotICAgdGFyZ2V0IHZlY3RvciBwb2ludHMgdG8gdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhIGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSA9Ci17Ci0gIC8qIENPRkYgYmFja2VuZCBzdHJ1Y3R1cmUuICAqLwotICB7Ci0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpIGJmZF92b2lkLCAvKiBhdXhfaW4gKi8KLSAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19pbiAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLGludCxpbnQsaW50LGludCxQVFIpKSliZmRfdm9pZCwvKmF1eF9vdXQqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogbGluZW5vX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogcmVsb2Nfb3V0ICovCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX291dCwKLSAgICBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gICAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgMCwgMCwgMCwgMCwgRklMTk1MRU4sIHRydWUsIGZhbHNlLCA0LAotICAgIGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbiwgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX2luLAotICAgIGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX2luLCBOVUxMLAotICAgIGFscGhhX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vaywgX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gICAgYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vaywgX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncywKLSAgICBfYmZkX2Vjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMCi0gIH0sCi0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBiZmRfYXJjaF9hbHBoYSwKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gICJfX19fX19fXzY0IiwKLSAgLyogVGhlIHBhZ2UgYm91bmRhcnkgdXNlZCB0byBhbGlnbiBzZWN0aW9ucyBpbiBhIGRlbWFuZC1wYWdlZAotICAgICBleGVjdXRhYmxlIGZpbGUuICBFLmcuLCAweDEwMDAuICAqLwotICAweDIwMDAsCi0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICB0cnVlLAotICAvKiBCaXRzaXplIG9mIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICA2NCwKLSAgLyogUmVsb2MgdG8gdXNlIGZvciBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgJmFscGhhX2hvd3RvX3RhYmxlW0FMUEhBX1JfUkVGUVVBRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bTIsCi0gICAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICAgIDgsCi0gICAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICAgIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX2luLAotICAgIGVjb2ZmX3N3YXBfZG5yX2luLAotICAgIGVjb2ZmX3N3YXBfcGRyX2luLAotICAgIGVjb2ZmX3N3YXBfc3ltX2luLAotICAgIGVjb2ZmX3N3YXBfb3B0X2luLAotICAgIGVjb2ZmX3N3YXBfZmRyX2luLAotICAgIGVjb2ZmX3N3YXBfcmZkX2luLAotICAgIGVjb2ZmX3N3YXBfZXh0X2luLAotICAgIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gICAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgICBlY29mZl9zd2FwX29wdF9vdXQsCi0gICAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAgIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gICAgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIH0sCi0gIC8qIEV4dGVybmFsIHJlbG9jIHNpemUuICAqLwotICBSRUxTWiwKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbiwKLSAgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBhbHBoYV9hZGp1c3RfcmVsb2NfaW4sCi0gIGFscGhhX2FkanVzdF9yZWxvY19vdXQsCi0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBhbHBoYV9hZGp1c3RfaGVhZGVycywKLSAgLyogUmVhZCBhbiBlbGVtZW50IGZyb20gYW4gYXJjaGl2ZSBhdCBhIGdpdmVuIGZpbGUgcG9zaXRpb24uICAqLwotICBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MKLX07Ci0KLS8qIExvb2tpbmcgdXAgYSByZWxvYyB0eXBlIGlzIEFscGhhIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLS8qIFNvIGlzIGdldHRpbmcgcmVsb2NhdGVkIHNlY3Rpb24gY29udGVudHMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotLyogSGFuZGxpbmcgZmlsZSB3aW5kb3dzIGlzIGdlbmVyaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotLyogUmVsYXhpbmcgc2VjdGlvbnMgaXMgZ2VuZXJpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVhbHBoYSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGFscGhhX2Vjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYWxwaGFfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAmYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXBvbGxvLmMgYi9iZmQvY29mZi1hcG9sbG8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3NWQ1Mi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hcG9sbG8uYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFwb2xsbyA2ODAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEJ5IFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LmVkdS5hdSkKLSAgIEJhc2VkIG9uIG02OGsgc3RhbmRhcmQgQ09GRiB2ZXJzaW9uIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvYXBvbGxvLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlW107Ci0jZWxzZQotcmVsb2NfaG93dG9fdHlwZSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HX05FRywJICAgICAgIDAsICAtMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICItMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2lmbmRlZiBCQURNQUcKLSNkZWZpbmUgQkFETUFHKHgpIE02OEtCQURNQUcoeCkKLSNlbmRpZgotI2RlZmluZSBBUE9MTE9fTTY4IDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gdm9pZCBhcG9sbG9fcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqaW50ZXJuYWwsIGludCByZWxvY2VudHJ5KSk7Ci1leHRlcm4gaW50IGFwb2xsb19ob3d0bzJydHlwZSBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKLSNlbHNlCi12b2lkCi1hcG9sbG9fcnR5cGUyaG93dG8oaW50ZXJuYWwsIHJlbG9jZW50cnkpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBpbnQgcmVsb2NlbnRyeTsKLXsKLSAgc3dpdGNoIChyZWxvY2VudHJ5KSAKLSAgewotICAgY2FzZSBSX1JFTEJZVEU6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAwOyBicmVhazsKLSAgIGNhc2UgUl9SRUxXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDI7IGJyZWFrOwotICAgY2FzZSBSX1BDUkJZVEU6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAzOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNDsgYnJlYWs7Ci0gICBjYXNlIFJfUENSTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDU7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkdfTkVHOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNjsgYnJlYWs7Ci0gIH0KLX0KLQotaW50IAotYXBvbGxvX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaW50ZXJuYWw7Ci17Ci0gIGlmIChpbnRlcm5hbC0+cGNfcmVsYXRpdmUpIAotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCi0gICAgewotICAgICBjYXNlIDMyOiByZXR1cm4gUl9QQ1JMT05HOwotICAgICBjYXNlIDE2OiByZXR1cm4gUl9QQ1JXT1JEOwotICAgICBjYXNlIDg6IHJldHVybiBSX1BDUkJZVEU7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpCi0gICAgIHsKLSAgICAgIGNhc2UgMzI6IHJldHVybiBSX1JFTExPTkc7Ci0gICAgICBjYXNlIDE2OiByZXR1cm4gUl9SRUxXT1JEOwotICAgICAgY2FzZSA4OiByZXR1cm4gUl9SRUxCWVRFOwotICAgICB9Ci0gIH0KLSAgcmV0dXJuIFJfUkVMTE9ORzsgICAgCi19Ci0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgXAotICBhcG9sbG9fcnR5cGUyaG93dG8oaW50ZXJuYWwsIChyZWxvY2VudHJ5KS0+cl90eXBlKQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhleHRlcm5hbCwgaW50ZXJuYWwpIFwKLSAgZXh0ZXJuYWwucl90eXBlID0gYXBvbGxvX2hvd3RvMnJ0eXBlKGludGVybmFsKTsKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSNpZm5kZWYgVEFSR0VUX1NZTQotI2RlZmluZSBUQVJHRVRfU1lNIGFwb2xsb2NvZmZfdmVjCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfTkFNRQotI2RlZmluZSBUQVJHRVRfTkFNRSAiYXBvbGxvLW02OGsiCi0jZW5kaWYKLQotI2lmZGVmIE5BTUVTX0hBVkVfVU5ERVJTQ09SRQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FLCAwLCAwLCAnXycsIE5VTEwpCi0jZWxzZQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FLCAwLCAwLCAwLCBOVUxMKQotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvY29mZi1hcm0uYyBiL2JmZC9jb2ZmLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkzODI1Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvYXJtLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogTWFjcm9zIGZvciBtYW5pcHVsYXRpb24gdGhlIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIHRoZSBjb2ZmIGRhdGEKLSAgIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEFQQ1NfMjZfRkxBRyggICAgICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfQVBDU18yNikKLSNkZWZpbmUgQVBDU19GTE9BVF9GTEFHKCAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX0ZMT0FUKQotI2RlZmluZSBQSUNfRkxBRyggICAgICAgICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX1BJQykKLSNkZWZpbmUgQVBDU19TRVQoICAgICAgICAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX1NFVCkKLSNkZWZpbmUgU0VUX0FQQ1NfRkxBR1MoICAgICBhYmZkLCBmbGdzKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgPSBcCi0JCQkJCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIH4gKEZfQVBDU18yNiB8IEZfQVBDU19GTE9BVCB8IEZfUElDKSkgXAotCQkJCQkgfCAoZmxncyB8IEZfQVBDU19TRVQpKQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggICAgIGFiZmQgKSAJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9JTlRFUldPUkspCi0jZGVmaW5lIElOVEVSV09SS19TRVQoICAgICAgYWJmZCApIAkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0lOVEVSV09SS19TRVQpCi0jZGVmaW5lIFNFVF9JTlRFUldPUktfRkxBRyggYWJmZCwgZmxnICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzID0gXAotCQkJCQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiB+IEZfSU5URVJXT1JLKSBcCi0JCQkJCSB8IChmbGcgfCBGX0lOVEVSV09SS19TRVQpKQotICAgICAKLXR5cGVkZWYgZW51bSB7YnVua25vd24sIGI5LCBiMTIsIGIyM30gdGh1bWJfcGNyZWxfYnJhbmNodHlwZTsKLS8qIHNvbWUgdHlwZWRlZnMgZm9yIGhvbGRpbmcgaW5zdHJ1Y3Rpb25zICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGluc24zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGluc24xNjsKLQotCi0gICAgIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBzdHVwaWQgY29tcGlsZXJzLiAgKi8KLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotICAgICAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8yMwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8xMgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF85Ci0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2FybV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCSAgIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAlib29sZWFuICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogY29mZl9hcm1fcnR5cGVfdG9faG93dG8gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF9jb21tb24KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqLAotCSAgIHRodW1iX3BjcmVsX2JyYW5jaHR5cGUpKTsKLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICogY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGluc24zMiBpbnNlcnRfdGh1bWJfYnJhbmNoCi0gIFBBUkFNUyAoKGluc24zMiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogZmluZF90aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBmaW5kX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMgdm9pZCByZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotI2VuZGlmCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFRoZSBsaW5rZXIgc2NyaXB0IGtub3dzIHRoZSBzZWN0aW9uIG5hbWVzIGZvciBwbGFjZW1lbnQuCi0gICBUaGUgZW50cnlfbmFtZXMgYXJlIHVzZWQgdG8gZG8gc2ltcGxlIG5hbWUgbWFuZ2xpbmcgb24gdGhlIHN0dWJzLgotICAgR2l2ZW4gYSBmdW5jdGlvbiBuYW1lLCBhbmQgaXRzIHR5cGUsIHRoZSBzdHViIGNhbiBiZSBmb3VuZC4gVGhlCi0gICBuYW1lIGNhbiBiZSBjaGFuZ2VkLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGUgJXMgYmUgcHJlc2VudC4KLSAgICovCi0gICAKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83dCIKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fdGh1bWIiCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83IgotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV9hcm0iCi0KLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfYXJtX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIElmIFVTRVJfTEFCRUxfUFJFRklYIGlzIGRlZmluZWQgYXMgIl8iIChzZWUgY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSgpCi0gICBpbiB0aGlzIGZpbGUpLCB0aGVuIFRBUkdFVF9VTkRFUlNDT1JFIHNob3VsZCBiZSBkZWZpbmVkLCBvdGhlcndpc2UgaXQKLSAgIHNob3VsZCBub3QuICAqLwotI2lmbmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNlbmRpZgotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNlbmRpZgotCi0vKiBUaGVzZSBtb3N0IGNlcnRhaW5seSBiZWxvbmcgc29tZXdoZXJlIGVsc2UuIEp1c3QgaGFkIHRvIGdldCByaWQgb2YKLSAgIHRoZSBtYW5pZmVzdCBjb25zdGFudHMgaW4gdGhlIGNvZGUuICovCi0KLSNkZWZpbmUgQVJNXzggICAgICAgIDAKLSNkZWZpbmUgQVJNXzE2ICAgICAgIDEKLSNkZWZpbmUgQVJNXzMyICAgICAgIDIKLSNkZWZpbmUgQVJNXzI2ICAgICAgIDMKLSNkZWZpbmUgQVJNX0RJU1A4ICAgIDQKLSNkZWZpbmUgQVJNX0RJU1AxNiAgIDUKLSNkZWZpbmUgQVJNX0RJU1AzMiAgIDYKLSNkZWZpbmUgQVJNXzI2RCAgICAgIDcKLS8qIDggaXMgdW51c2VkICovCi0jZGVmaW5lIEFSTV9ORUcxNiAgICA5Ci0jZGVmaW5lIEFSTV9ORUczMiAgIDEwCi0jZGVmaW5lIEFSTV9SVkEzMiAgIDExCi0jZGVmaW5lIEFSTV9USFVNQjkgIDEyCi0jZGVmaW5lIEFSTV9USFVNQjEyIDEzCi0jZGVmaW5lIEFSTV9USFVNQjIzIDE0Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW10gPSAKLXsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotICBIT1dUTyhBUk1fOCwJCQkvKiB0eXBlICovCi0JMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JMCwJCQkvKiBzaXplICovCi0JOCwJCQkvKiBiaXRzaXplICovCi0JZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkwLAkJCS8qIGJpdHBvcyAqLwotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCWNvZmZfYXJtX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSJBUk1fOCIsCQkvKiBuYW1lICovCi0gICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JUENSRUxPRkZTRVQJCS8qIHBjcmVsX29mZnNldCAqLyksCi0gIEhPV1RPKEFSTV8xNiwgIAotCTAsIAotCTEsIAotCTE2LCAKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fMTYiLCAKLQl0cnVlLAotCTB4MDAwMGZmZmYsCi0JMHgwMDAwZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fMzIsIAotCTAsCi0JMiwgCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNXzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fMjYsCi0JMiwKLQkyLAotCTI0LAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JYW91dGFybV9maXhfcGNyZWxfMjYgLAotCSJBUk1fMjYiLAotCWZhbHNlLAotCTB4MDBmZmZmZmYsCi0JMHgwMGZmZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fRElTUDgsICAgICAgICAKLQkwLAotCTAsCi0JOCwgCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQOCIsICAKLQl0cnVlLAotCTB4MDAwMDAwZmYsCi0JMHgwMDAwMDBmZiwKLQl0cnVlKSwKLSAgSE9XVE8oIEFSTV9ESVNQMTYsIAotCTAsCi0JMSwKLQkxNiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX0RJU1AxNiIsCi0JdHJ1ZSwKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsCi0JdHJ1ZSksCi0gIEhPV1RPKCBBUk1fRElTUDMyLAotCTAsCi0JMiwKLQkzMiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLSAJY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQMzIiLAotCXRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCXRydWUpLAotICBIT1dUTyggQVJNXzI2RCwgIAotCTIsIAotCTIsCi0JMjQsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19kb250LAotCWFvdXRhcm1fZml4X3BjcmVsXzI2X2RvbmUsIAotCSJBUk1fMjZEIiwKLQl0cnVlLAotCTB4MDBmZmZmZmYsCi0JMHgwLAotCWZhbHNlKSwKLSAgLyogOCBpcyB1bnVzZWQgKi8KLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oIEFSTV9ORUcxNiwKLQkwLAotCS0xLAotCTE2LAotCWZhbHNlLAotCTAsIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fTkVHMTYiLAotICAgICAgICB0cnVlLCAKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsIAotCWZhbHNlKSwKLSAgSE9XVE8oIEFSTV9ORUczMiwgCi0JMCwgCi0JLTIsCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX05FRzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JZmFsc2UpLAotICBIT1dUTyggQVJNX1JWQTMyLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9SVkEzMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjksCi0JMSwKLQkxLAotCTgsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzkgLAotCSJBUk1fVEhVTUI5IiwKLQlmYWxzZSwKLQkweDAwMDAwMGZmLAotCTB4MDAwMDAwZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjEyLAotCTEsCi0JMSwKLQkxMSwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWNvZmZfdGh1bWJfcGNyZWxfMTIgLAotCSJBUk1fVEhVTUIxMiIsCi0JZmFsc2UsCi0JMHgwMDAwMDdmZiwKLQkweDAwMDAwN2ZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKCBBUk1fVEhVTUIyMywKLQkxLAotCTIsCi0JMjIsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzIzICwKLQkiQVJNX1RIVU1CMjMiLAotCWZhbHNlLAotCTB4MDdmZjA3ZmYsCi0JMHgwN2ZmMDdmZiwgCi0JUENSRUxPRkZTRVQpLAotfTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuCi1pbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci17Ci0gIHJldHVybiAhaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT50eXBlICE9IEFSTV9SVkEzMjsKLX0gICAgIAotI2VuZGlmCi0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byArIChkc3QpLT5yX3R5cGU7Ci0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX2FybV9ydHlwZV90b19ob3d0bwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2FybV9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIGhvd3RvID0gYW91dGFybV9zdGRfcmVsb2NfaG93dG8gKyByZWwtPnJfdHlwZTsKLQotICBpZiAocmVsLT5yX3R5cGUgPT0gQVJNX1JWQTMyKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IHBlX2RhdGEoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgIH0KLQotICByZXR1cm4gaG93dG87Ci0KLX0KLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYW91dGFybV9maXhfcGNyZWxfMjZfZG9uZSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVXNlZCBieSB0aGUgYXNzZW1ibGVyLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hb3V0YXJtX2ZpeF9wY3JlbF8yNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICAKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmYW91dGFybV9zdGRfcmVsb2NfaG93dG9bQVJNXzI2RF07Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGJ0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB0aHVtYl9wY3JlbF9icmFuY2h0eXBlIGJ0eXBlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb24gPSAwOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBkc3Rtc2s7Ci0gIGJmZF92bWEgb2ZmbXNrOwotICBiZmRfdm1hIHNpZ25iaXQ7Ci0KLSAgLyogTk9URTogVGhpcyByb3V0aW5lIGlzIGN1cnJlbnRseSB1c2VkIGJ5IEdBUywgYnV0IG5vdCBieSB0aGUgbGluawotICAgICBwaGFzZS4gICovCi0KLSAgc3dpdGNoIChidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBiOToKLSAgICAgIGRzdG1zayAgPSAweDAwMDAwMGZmOwotICAgICAgb2ZmbXNrICA9IDB4MDAwMDAxZmU7Ci0gICAgICBzaWduYml0ID0gMHgwMDAwMDEwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiMTI6Ci0gICAgICBkc3Rtc2sgID0gMHgwMDAwMDdmZjsKLSAgICAgIG9mZm1zayAgPSAweDAwMDAwZmZlOwotICAgICAgc2lnbmJpdCA9IDB4MDAwMDA4MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYjIzOgotICAgICAgZHN0bXNrICA9IDB4MDdmZjA3ZmY7Ci0gICAgICBvZmZtc2sgID0gMHgwMDdmZmZmZjsKLSAgICAgIHNpZ25iaXQgPSAweDAwNDAwMDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHN3aXRjaCAoYnR5cGUpCi0gICAgewotICAgIGNhc2UgYjk6Ci0gICAgY2FzZSBiMTI6Ci0gICAgICByZWxvY2F0aW9uID0gKCh0YXJnZXQgJiBkc3Rtc2spIDw8IDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGIyMzoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgMHg3ZmYpIDw8IDEpICB8ICgodGFyZ2V0ICYgMHgwN2ZmMDAwMCkgPj4gNCk7Ci0gICAgICBlbHNlCi0JcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgMHg3ZmYpIDw8IDEyKSB8ICgodGFyZ2V0ICYgMHgwN2ZmMDAwMCkgPj4gMTUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIHNpZ25iaXQpIC0gc2lnbmJpdDsgLyogU2lnbiBleHRlbmQgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcjsKLQotICBpZiAocmVsb2NhdGlvbiAmIDEpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiBzaWduYml0KQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH5vZmZtc2spICE9IH5vZmZtc2spCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+b2ZmbXNrKQotICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgdGFyZ2V0ICY9IH5kc3Rtc2s7Ci0gIHN3aXRjaCAoYnR5cGUpCi0gICB7Ci0gICBjYXNlIGI5OgotICAgY2FzZSBiMTI6Ci0gICAgIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAxKTsKLSAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgYjIzOgotICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgICAgIHRhcmdldCB8PSAoKHJlbG9jYXRpb24gJiAweGZmZikgPj4gMSkgIHwgKChyZWxvY2F0aW9uIDw8IDQpICAmIDB4MDdmZjAwMDApOwotICAgICBlbHNlCi0gICAgICAgdGFyZ2V0IHw9ICgocmVsb2NhdGlvbiAmIDB4ZmZlKSA8PCAxNSkgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpOwotICAgICBicmVhazsKLQotICAgZGVmYXVsdDoKLSAgICAgYWJvcnQgKCk7Ci0gICB9Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICYgYW91dGFybV9zdGRfcmVsb2NfaG93dG8gW0FSTV8yNkRdOwotICAKLSAgLyogVE9ETzogV2Ugc2hvdWxkIHBvc3NpYmx5IGhhdmUgRE9ORSBlbnRyaWVzIGZvciB0aGUgVEhVTUIgUENSRUwgcmVsb2NhdGlvbnMgKi8KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfMjMgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBiMjMpOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX3RodW1iX3BjcmVsXzEyIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjEyKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl90aHVtYl9wY3JlbF85IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjkpOwotfQotCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLWNvZmZfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICAgYmZkICogYWJmZDsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotI2RlZmluZSBBU1REKGksaikgICAgICAgY2FzZSBpOiByZXR1cm4gJmFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW2pdCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLSAgICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgQVNURCAoQkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBBUk1fOCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIEFSTV8xNik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIEFSTV8zMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIEFSTV8yNik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgICAgICAgICAgICAgIEFSTV9ESVNQOCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTZfUENSRUwsICAgICAgICAgICAgIEFSTV9ESVNQMTYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICBBUk1fRElTUDMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19SVkEsICAgICAgICAgICAgICAgICAgQVJNX1JWQTMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LCAgQVJNX1RIVU1COSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsIEFSTV9USFVNQjEyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgQVJNX1RIVU1CMjMpOwotICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgIH0KLX0KLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEFSTUJBRE1BRyh4KQotI2RlZmluZSBBUk0gMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgQVJNIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi1zdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBvcmlnaW5hbCBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUuICBNVVNUIGJlIGZpcnN0IGZpZWxkLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCXJvb3Q7Ci0gIAotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgVGh1bWItdG8tQVJNIGdsdWUuICAqLwotICBsb25nIGludCAJCQl0aHVtYl9nbHVlX3NpemU7Ci0gIAotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgQVJNLXRvLVRodW1iIGdsdWUuICAqLwotICBsb25nIGludCAJCQlhcm1fZ2x1ZV9zaXplOwotCi0gIC8qIEFuIGFyYml0YXJ5IGlucHV0IEJGRCBjaG9zZW4gdG8gaG9sZCB0aGUgZ2x1ZSBzZWN0aW9ucy4gICovCi0gIGJmZCAqCQkJCWJmZF9vZl9nbHVlX293bmVyOwotCi0gIC8qIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkLCBub24taW50ZXJ3b3JraW5nIGF3YXJlIEFSTSBjb2RlLiAqLwotICBpbnQgCQkJCXN1cHBvcnRfb2xkX2NvZGU7Ci19OwotCi0vKiBHZXQgdGhlIEFSTSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgY29mZl9hcm1faGFzaF90YWJsZShpbmZvKSBcCi0gICgoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSAoKGluZm8pLT5oYXNoKSkKLQotLyogQ3JlYXRlIGFuIEFSTSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gICAgICAoJiByZXQtPnJvb3QsIGFiZmQsIF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+dGh1bWJfZ2x1ZV9zaXplICAgPSAwOwotICByZXQtPmFybV9nbHVlX3NpemUgICAgID0gMDsKLSAgcmV0LT5iZmRfb2ZfZ2x1ZV9vd25lciA9IE5VTEw7Ci0KLSAgcmV0dXJuICYgcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX29mZnNldCkKLSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgICBiZmRfdm1hIHJlbG9jX29mZnNldDsKLXsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2Nfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLSAgICAgYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICBmd3JpdGUgKCZhZGRyLCAxLCBzaXplb2YgKGFkZHIpLCAoRklMRSAqKSBpbmZvLT5iYXNlX2ZpbGUpOwotCi19Ci0MCi0vKiBUaGUgdGh1bWIgZm9ybSBvZiBhIGxvbmcgYnJhbmNoIGlzIGEgYml0IGZpbmlja3ksIGJlY2F1c2UgdGhlIG9mZnNldAotICAgZW5jb2RpbmcgaXMgc3BsaXQgb3ZlciB0d28gZmllbGRzLCBlYWNoIGluIGl0J3Mgb3duIGluc3RydWN0aW9uLiBUaGV5Ci0gICBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLiBTbyBnaXZlbiBhIHRodW1iIGZvcm0gb2YgbG9uZyBicmFuY2gsIGFuZCBhbiAKLSAgIG9mZnNldCwgaW5zZXJ0IHRoZSBvZmZzZXQgaW50byB0aGUgdGh1bWIgYnJhbmNoIGFuZCByZXR1cm4gZmluaXNoZWQKLSAgIGluc3RydWN0aW9uLiAKLQotICAgSXQgdGFrZXMgdHdvIHRodW1iIGluc3RydWN0aW9ucyB0byBlbmNvZGUgdGhlIHRhcmdldCBhZGRyZXNzLiBFYWNoIGhhcyAKLSAgIDExIGJpdHMgdG8gaW52ZXN0LiBUaGUgdXBwZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIG9uZSAoaWRlbnRpZmVkIGJ5Ci0gICBILTAuLiBzZWUgYmVsb3cpLCB0aGUgbG93ZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIHRoZSBvdGhlciAoaWRlbnRpZmllZCAKLSAgIGJ5IEgtMSkuIAotCi0gICBDb21iaW5lIHRvZ2V0aGVyIGFuZCBzaGlmdGVkIGxlZnQgYnkgMSAoaXQncyBhIGhhbGYgd29yZCBhZGRyZXNzKSBhbmQgCi0gICB0aGVyZSB5b3UgaGF2ZSBpdC4KLQotICAgICBPcDogMTExMSA9IEYsCi0gICAgIEgtMCwgdXBwZXIgYWRkcmVzcy0wID0gMDAwCi0gICAgIE9wOiAxMTExID0gRiwKLSAgICAgSC0xLCBsb3dlciBhZGRyZXNzLTAgPSA4MDAKLQotICAgVGhleSBjYW4gYmUgb3JkZXJlZCBlaXRoZXIgd2F5LCBidXQgdGhlIGFybSB0b29scyBJJ3ZlIHNlZW4gYWx3YXlzIHB1dCAKLSAgIHRoZSBsb3dlciBvbmUgZmlyc3QuIEl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLiBrcmtAY3lnbnVzLmNvbQotCi0gICBYWFg6ICBBY3R1YWxseSB0aGUgb3JkZXIgZG9lcyBtYXR0ZXIuICBUaGUgc2Vjb25kIGluc3RydWN0aW9uIChILTEpCi0gICBtb3ZlcyB0aGUgY29tcHV0ZWQgYWRkcmVzcyBpbnRvIHRoZSBQQywgc28gaXQgbXVzdCBiZSB0aGUgc2Vjb25kIG9uZQotICAgaW4gdGhlIHNlcXVlbmNlLiAgVGhlIHByb2JsZW0sIGhvd2V2ZXIgaXMgdGhhdCB3aGlsc3QgbGl0dGxlIGVuZGlhbiBjb2RlCi0gICBzdG9yZXMgdGhlIGluc3RydWN0aW9ucyBpbiBISSB0aGVuIExPVyBvcmRlciwgYmlnIGVuZGlhbiBjb2RlIGRvZXMgdGhlCi0gICByZXZlcnNlLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLQotI2RlZmluZSBMT1dfSElfT1JERVIgMHhGODAwRjAwMAotI2RlZmluZSBISV9MT1dfT1JERVIgMHhGMDAwRjgwMAotCi1zdGF0aWMgaW5zbjMyCi1pbnNlcnRfdGh1bWJfYnJhbmNoIChicl9pbnNuLCByZWxfb2ZmKQotICAgICBpbnNuMzIgYnJfaW5zbjsKLSAgICAgaW50IHJlbF9vZmY7Ci17Ci0gIHVuc2lnbmVkIGludCBsb3dfYml0czsKLSAgdW5zaWduZWQgaW50IGhpZ2hfYml0czsKLQotCi0gIEJGRF9BU1NFUlQoKHJlbF9vZmYgJiAxKSAhPSAxKTsKLQotICByZWxfb2ZmID4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbGYgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KLSAgbG93X2JpdHMgPSByZWxfb2ZmICYgMHgwMDAwMDdGRjsgICAgICAgICAgICAvKiB0aGUgYm90dG9tIDExIGJpdHMgKi8KLSAgaGlnaF9iaXRzID0gKHJlbF9vZmYgPj4gMTEpICYgMHgwMDAwMDdGRjsgICAvKiB0aGUgdG9wIDExIGJpdHMgKi8KLQotICBpZiAoKGJyX2luc24gJiBMT1dfSElfT1JERVIpID09IExPV19ISV9PUkRFUikKLSAgICBicl9pbnNuID0gTE9XX0hJX09SREVSIHwgKGxvd19iaXRzIDw8IDE2KSB8IGhpZ2hfYml0czsKLSAgZWxzZSBpZiAoKGJyX2luc24gJiBISV9MT1dfT1JERVIpID09IEhJX0xPV19PUkRFUikKLSAgICBicl9pbnNuID0gSElfTE9XX09SREVSIHwgKGhpZ2hfYml0cyA8PCAxNikgfCBsb3dfYml0czsKLSAgZWxzZQotICAgIGFib3J0KCk7IC8qIGVycm9yIC0gbm90IGEgdmFsaWQgYnJhbmNoIGluc3RydWN0aW9uIGZvcm0gKi8KLQotICAvKiBGSVhNRTogYWJvcnQgaXMgcHJvYmFibHkgbm90IHRoZSByaWdodCBjYWxsLiBrcmtAY3lnbnVzLmNvbSAqLwotCi0gIHJldHVybiBicl9pbnNuOwotfQotCi0MCi1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoKLWZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIENPTlNUIGNoYXIgKiAgICAgICAgICAgbmFtZTsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLQkgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLSAgCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IHVuYWJsZSB0byBmaW5kIFRIVU1CIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotICAKLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF9hcm1fZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIENPTlNUIGNoYXIgKiAgICAgICAgICAgbmFtZTsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLQkgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotICAKLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IHVuYWJsZSB0byBmaW5kIEFSTSBnbHVlICclcycgZm9yIGAlcyciKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKLSAgCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICByZXR1cm4gbXloOwotfQotCi0vKgotICBBUk0tPlRodW1iIGdsdWU6Ci0KLSAgICAgICAuYXJtCi0gICAgICAgX19mdW5jX2Zyb21fYXJtOgotCSAgICAgbGRyIHIxMiwgX19mdW5jX2FkZHIKLQkgICAgIGJ4ICByMTIKLSAgICAgICBfX2Z1bmNfYWRkcjoKLSAgICAgICAgICAgIC53b3JkIGZ1bmMgICAgQCBiZWhhdmUgYXMgaWYgeW91IHNhdyBhIEFSTV8zMiByZWxvYwotKi8KLQotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9TSVpFIDEyCi1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDFfbGRyX2luc24gICAgICAgPSAweGU1OWZjMDAwOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQyX2J4X3IxMl9pbnNuICAgID0gMHhlMTJmZmYxYzsKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0M19mdW5jX2FkZHJfaW5zbiA9IDB4MDAwMDAwMDE7Ci0KLS8qCi0gICBUaHVtYi0+QVJNOgkJCQlUaHVtYi0+KG5vbi1pbnRlcndvcmtpbmcgYXdhcmUpIEFSTQotCi0gICAudGh1bWIJCQkJLnRodW1iCi0gICAuYWxpZ24gMgkJCQkuYWxpZ24gMgotICAgICAgX19mdW5jX2Zyb21fdGh1bWI6CQkgICBfX2Z1bmNfZnJvbV90aHVtYjoKLQkgICBieCBwYwkJCQlwdXNoIHtyNiwgbHJ9Ci0JICAgbm9wCQkJCQlsZHIgIHI2LCBfX2Z1bmNfYWRkcgotICAgLmFybQkJCQkJCW1vdiAgbHIsIHBjCi0gICAgICBfX2Z1bmNfY2hhbmdlX3RvX2FybToJCQlieCAgIHI2Ci0JICAgYiBmdW5jICAgCQkJLmFybQotCQkJCQkgICBfX2Z1bmNfYmFja190b190aHVtYjoKLSAgIAkJICAJCQkJbGRtaWEgcjEzISB7cjYsIGxyfQotICAgCQkJCQkgICAgICAgIGJ4ICAgIGxyCi0gICAJCQkJCSAgIF9fZnVuY19hZGRyOgotCQkJCQkgICAgICAgIC53b3JkCWZ1bmMgCi0qLwotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NJWkUgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyAyMCA6IDgpCi1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfYnhfcGNfaW5zbiA9IDB4NDc3ODsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9ub29wX2luc24gID0gMHg0NmMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmEzX2JfaW5zbiAgICAgPSAweGVhMDAwMDAwOwotCi1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfcHVzaF9pbnNuICA9IDB4YjU0MDsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9sZHJfaW5zbiAgID0gMHg0ZTAzOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEzX21vdl9pbnNuICAgPSAweDQ2ZmU7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTRfYnhfaW5zbiAgICA9IDB4NDczMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNV9wb3BfaW5zbiAgID0gMHhlOGJkNDA0MDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNl9ieF9pbnNuICAgID0gMHhlMTJmZmYxZTsKLQotLyogVE9ETzoKLSAgICAgV2Ugc2hvdWxkIHJlYWxseSBjcmVhdGUgbmV3IGxvY2FsIChzdGF0aWMpIHN5bWJvbHMgaW4gZGVzdGluYXRpb24KLSAgICAgb2JqZWN0IGZvciBlYWNoIHN0dWIgd2UgY3JlYXRlLiAgV2Ugc2hvdWxkIGFsc28gY3JlYXRlIGxvY2FsCi0gICAgIChzdGF0aWMpIHN5bWJvbHMgd2l0aGluIHRoZSBzdHVicyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIEFSTSBhbmQKLSAgICAgVGh1bWIgY29kZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZGVidWdnZXIgYW5kIGRpc2Fzc2VtYmxlcgotICAgICBjYW4gcHJlc2VudCBhIGJldHRlciB2aWV3IG9mIHN0dWJzLgotCi0gICAgIFdlIGNhbiB0cmVhdCBzdHVicyBsaWtlIGxpdGVyYWwgc2VjdGlvbnMsIGFuZCBmb3IgdGhlIFRIVU1COSBvbmVzCi0gICAgIChzaG9ydCBhZGRyZXNzaW5nIHJhbmdlKSB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbnNlcnQgdGhlIHN0dWJzCi0gICAgIGJldHdlZW4gc2VjdGlvbnMuIGkuZS4gdGhlIHNpbXBsZXN0IGFwcHJvYWNoIChzaW5jZSByZWxvY2F0aW9ucwotICAgICBhcmUgZG9uZSBvbiBhIHNlY3Rpb24gYmFzaXMpIGlzIHRvIGR1bXAgdGhlIHN0dWJzIGF0IHRoZSBlbmQgb2YKLSAgICAgcHJvY2Vzc2luZyBhIHNlY3Rpb24uIFRoYXQgd2F5IHdlIGNhbiBhbHdheXMgdHJ5IGFuZCBtaW5pbWlzZSB0aGUKLSAgICAgb2Zmc2V0IHRvIGFuZCBmcm9tIGEgc3R1Yi4gSG93ZXZlciwgdGhpcyBkb2VzIG5vdCBtYXAgd2VsbCBvbnRvCi0gICAgIHRoZSB3YXkgdGhhdCB0aGUgbGlua2VyL0JGRCBkb2VzIGl0cyB3b3JrOiBtYXBwaW5nIGFsbCBpbnB1dAotICAgICBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMgdmlhIHRoZSBsaW5rZXIgc2NyaXB0IGJlZm9yZSBkb2luZwotICAgICBhbGwgdGhlIHByb2Nlc3NpbmcuCi0KLSAgICAgVW5mb3J0dW5hdGVseSBpdCBtYXkgYmUgZWFzaWVyIHRvIGp1c3QgdG8gZGlzYWxsb3cgc2hvcnQgcmFuZ2UKLSAgICAgVGh1bWItPkFSTSBzdHVicyAoaS5lLiBubyBjb25kaXRpb25hbCBpbnRlci13b3JraW5nIGJyYW5jaGVzLAotICAgICBvbmx5IGJyYW5jaC1hbmQtbGluayAoQkwpIGNhbGxzLiAgVGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBwcm9jZXNzaW5nCi0gICAgIHNpbmNlIHdlIGNhbiB0aGVuIHB1dCBhbGwgb2YgdGhlIHN0dWJzIGludG8gdGhlaXIgb3duIHNlY3Rpb24uCi0KLSAgVE9ETzoKLSAgICAgT24gYSBkaWZmZXJlbnQgc3ViamVjdCwgcmF0aGVyIHRoYW4gY29tcGxhaW5pbmcgd2hlbiBhCi0gICAgIGJyYW5jaCBjYW5ub3QgZml0IGluIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgZm9yIHRoZQotICAgICBpbnN0cnVjdGlvbiB3ZSBzaG91bGQgZ2VuZXJhdGUgYSB0cmFtcG9saW5lIHN0dWIgKG5lZWRlZCB0bwotICAgICBhZGRyZXNzIHRoZSBjb21wbGV0ZSAzMmJpdCBhZGRyZXNzIHNwYWNlKS4gICovCi0KLS8qIFRoZSBzdGFuZGFyZCBDT0ZGIGJhY2tlbmQgbGlua2VyIGRvZXMgbm90IGNvcGUgd2l0aCB0aGUgc3BlY2lhbCAKLSAgIFRodW1iIEJSQU5DSDIzIHJlbG9jYXRpb24uICBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gc3BsaXQgdGhlCi0gICBCUkFOQ0gyMyBpbnRvIHNlcGVyYXRlIEhJMjMgYW5kIExPMjMgcmVsb2NhdGlvbnMuIEhvd2V2ZXIsIGl0IGlzIGEKLSAgIGJpdCBzaW1wbGVyIHNpbXBseSBwcm92aWRpbmcgb3VyIG93biByZWxvY2F0aW9uIGRyaXZlci4gKi8KLQotLyogVGhlIHJlbG9jIHByb2Nlc3Npbmcgcm91dGluZSBmb3IgdGhlIEFSTS9UaHVtYiBDT0ZGIGxpbmtlci4gIE5PVEU6Ci0gICBUaGlzIGNvZGUgaXMgYSB2ZXJ5IHNsaWdodGx5IG1vZGlmaWVkIGNvcHkgb2YKLSAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uICBJdCB3b3VsZCBiZSBhIG11Y2ggbW9yZQotICAgbWFpbnRhaW5hYmxlIHNvbHV0aW9uIHRvIGhhdmUgYSBNQUNSTyB0aGF0IGNvdWxkIGJlIGV4cGFuZGVkIHdpdGhpbgotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiB0aGF0IHdvdWxkIG9ubHkgYmUgcHJvdmlkZWQgZm9yCi0gICBBUk0vVGh1bWIgYnVpbGRzLiAgSXQgaXMgb25seSB0aGUgY29kZSBtYXJrZWQgVEhVTUJFWFRFTlNJT04gdGhhdAotICAgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAwOwotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICBoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqICAgICAgIHN5bTsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICAgIGhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICAgIHJzdGF0OwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGhfdmFsOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQotICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAotICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKLSAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLwotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotCi0gICAgICBob3d0byA9IGNvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOwotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgcmVsb2NhdGlvbl9zZWN0aW9uIGZ1bmN0aW9uIHdpbGwgc2tpcCBwY3JlbF9vZmZzZXQgcmVsb2NzCi0gICAgICAgICB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBIb3dldmVyLCB3ZSB3YW50IHRvIGNvbnZlcnQKLSAgICAgICAgIEFSTTI2IHRvIEFSTTI2RCByZWxvY3MgaWYgcG9zc2libGUuICBXZSByZXR1cm4gYSBmYWtlIGhvd3RvIGluCi0gICAgICAgICB0aGlzIGNhc2Ugd2l0aG91dCBwY3JlbF9vZmZzZXQgc2V0LCBhbmQgYWRqdXN0IHRoZSBhZGRlbmQgdG8KLSAgICAgICAgIGNvbXBlbnNhdGUuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlID09IEFSTV8yNgotICAgICAgICAgICYmIGggIT0gTlVMTAotICAgICAgICAgICYmIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZmFrZV9hcm0yNl9yZWxvYyA9IAotCSAgICBIT1dUTyAoQVJNXzI2LAotICAgIAkgICAgICAgMiwKLSAgICAJICAgICAgIDIsCi0gICAgCSAgICAgICAyNCwKLSAgICAJICAgICAgIHRydWUsCi0gICAgCSAgICAgICAwLAotICAgIAkgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotICAgIAkgICAgICAgYW91dGFybV9maXhfcGNyZWxfMjYgLAotICAgIAkgICAgICAgIkFSTV8yNiIsCi0gICAgCSAgICAgICBmYWxzZSwKLSAgICAJICAgICAgIDB4MDBmZmZmZmYsCi0gICAgCSAgICAgICAweDAwZmZmZmZmLCAKLSAgICAJICAgICAgIGZhbHNlKTsKLQotICAgICAgICAgIGFkZGVuZCAtPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICAgICAgaG93dG8gPSAmZmFrZV9hcm0yNl9yZWxvYzsKLSAgICAgICAgfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdGhlbiB3ZSBjYW4ganVzdCBpZ25vcmUKLSAgICAgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MgdGhhdCBpcyBwY3JlbF9vZmZzZXQuICBJdCB3aWxsIGFscmVhZHkKLSAgICAgICAgIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUuICBJZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLAotICAgICAgICAgdGhlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+cGNyZWxfb2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLSAgICAgICAgICAgIGFkZGVuZCArPSBzeW0tPm5fdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZQotCQkgICAgIC0gc2VjLT52bWEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLSNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICAgICAgLyogV2UgZG9uJ3Qgb3V0cHV0IHRoZSBzdHVicyBpZiB3ZSBhcmUgZ2VuZXJhdGluZyBhCi0gICAgICAgICAgICAgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUsIHNpbmNlIHdlIG1heSBhcyB3ZWxsIGxlYXZlIHRoZQotICAgICAgICAgICAgIHN0dWIgZ2VuZXJhdGlvbiB0byB0aGUgZmluYWwgbGlua2VyIHBhc3MuIElmIHdlIGZhaWwgdG8KLQkgICAgIHZlcmlmeSB0aGF0IHRoZSBuYW1lIGlzIGRlZmluZWQsIHdlJ2xsIHRyeSB0byBidWlsZCBzdHVicwotCSAgICAgZm9yIGFuIHVuZGVmaW5lZCBuYW1lLi4uICovCi0gICAgICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAgICAgJiYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICAgICAgICAgIHsKLQkgICAgICBhc2VjdGlvbiAqICAgaF9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgY29uc3QgY2hhciAqIG5hbWUgID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICAKLQkgICAgICAvKiBoIGxvY2F0ZXMgdGhlIHN5bWJvbCByZWZlcmVuY2VkIGluIHRoZSByZWxvYy4gICovCi0JICAgICAgaF92YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoX3NlYy0+b3V0cHV0X29mZnNldCk7Ci0KLSAgICAgICAgICAgICAgaWYgKGhvd3RvLT50eXBlID09IEFSTV8yNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoICAgaC0+Y2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCi0JCSAgICAgIHx8IGgtPmNsYXNzID09IENfVEhVTUJFWFRGVU5DKQotCQkgICAgewotCQkgICAgICAvKiBBcm0gY29kZSBjYWxsaW5nIGEgVGh1bWIgZnVuY3Rpb24gKi8KLQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnQgICAgICAgICAgICAgICAgIHRtcDsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29mZnNldDsKLQkJICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgICAgIHM7Ci0JCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfb2Zmc2V0OwotCQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgbXloOyAKLQkJICAgICAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0JCSAgICAgIAotCQkgICAgICBteWggPSBmaW5kX2FybV9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotCQkgICAgICBpZiAobXloID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJICAgICAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCQkJCi0JCSAgICAgIG15X29mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgICAgCi0JCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIAotCQkJCQkJICBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0KLQkJICAgICAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotCQkJewotCQkJICBpZiAoaF9zZWMtPm93bmVyICE9IE5VTEwKLQkJCSAgICAgICYmIElOVEVSV09SS19TRVQgKGhfc2VjLT5vd25lcikKLQkJCSAgICAgICYmICEgSU5URVJXT1JLX0ZMQUcgKGhfc2VjLT5vd25lcikpCi0JCQkgICAgewotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCQkoXygiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGhfc2VjLT5vd25lciksIG5hbWUpOwotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCQkoXygiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgfQotCi0JCQkgIC0tbXlfb2Zmc2V0OwotCQkJICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLQkJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0MV9sZHJfaW5zbiwKLQkJCQkgICAgICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0JCQkgIAotCQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQyX2J4X3IxMl9pbnNuLAotCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0JCQkgIAotCQkJICAvKiBJdCdzIGEgdGh1bWIgYWRkcmVzcy4gIEFkZCB0aGUgbG93IG9yZGVyIGJpdC4gICovCi0JCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGhfdmFsIHwgYTJ0M19mdW5jX2FkZHJfaW5zbiwKLQkJCQkgICAgICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29mZnNldCArIDgpOwotCi0JCQl9Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotCi0JCSAgICAgIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfdmFkZHIKLQkJCQkJLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgICAKLQkJICAgICAgdG1wID0gdG1wICYgMHhGRjAwMDAwMDsKLQotCQkgICAgICAvKiBTb21laG93IHRoZXNlIGFyZSBib3RoIDQgdG9vIGZhciwgc28gc3VidHJhY3QgOC4gKi8KLQkJICAgICAgcmV0X29mZnNldCA9Ci0JCQlzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIG15X29mZnNldCAKLQkJCSsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hIAotCQkJICAgKyByZWwtPnJfdmFkZHIpCi0JCQktIDg7Ci0KLQkJICAgICAgdG1wID0gdG1wIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRik7Ci0JCSAgICAgIAotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0bXAsIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIGRvbmUgPSAxOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLQkgICAgICAKLQkgICAgICAvKiBOb3RlOiBXZSB1c2VkIHRvIGNoZWNrIGZvciBBUk1fVEhVTUI5IGFuZCBBUk1fVEhVTUIxMiAqLwotICAgICAgICAgICAgICBlbHNlIGlmIChob3d0by0+dHlwZSA9PSBBUk1fVEhVTUIyMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoICAgaC0+Y2xhc3MgPT0gQ19FWFQgCi0JCSAgICAgIHx8IGgtPmNsYXNzID09IENfU1RBVAotCQkgICAgICB8fCBoLT5jbGFzcyA9PSBDX0xBQkVMKQotCQkgICAgewotCQkgICAgICAvKiBUaHVtYiBjb2RlIGNhbGxpbmcgYW4gQVJNIGZ1bmN0aW9uICovCi0JCSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7Ci0JCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0OwotCQkgICAgICB1bnNpZ25lZCBsb25nIGludCAgICAgICAgICAgICAgICAgIHRtcDsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfb2Zmc2V0OwotCQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgIG15aDsKLQkJICAgICAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqICBnbG9iYWxzOwotCi0JCSAgICAgIG15aCA9IGZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLQkJICAgICAgaWYgKG15aCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCSAgICAgIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQkJICAgICAgCi0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCQkgICAgICAKLQkJICAgICAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICAKLQkJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgCi0JCQkJCQkgICBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCQkgICAgICAKLQkJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCQkgICAgICAKLQkJICAgICAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotCQkJewotCQkJICBpZiAoaF9zZWMtPm93bmVyICE9IE5VTEwKLQkJCSAgICAgICYmIElOVEVSV09SS19TRVQgKGhfc2VjLT5vd25lcikKLQkJCSAgICAgICYmICEgSU5URVJXT1JLX0ZMQUcgKGhfc2VjLT5vd25lcikKLQkJCSAgICAgICYmICEgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSkKLQkJCSAgICB7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaF9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiB0aHVtYiBjYWxsIHRvIGFybSIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCShfKCIgIGNvbnNpZGVyIHJlbGlua2luZyB3aXRoIC0tc3VwcG9ydC1vbGQtY29kZSBlbmFibGVkIikpOwotCQkJICAgIH0KLQkJCSAgCi0JCQkgIC0tIG15X29mZnNldDsKLQkJCSAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0JCQkgIGlmIChnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlKQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfcHVzaF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9sZHJfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOwotCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEzX21vdl9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTRfYnhfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDYpOwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0MmE1X3BvcF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7Ci0JCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHQyYTZfYnhfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDEyKTsKLQkJCSAgICAgIAotCQkJICAgICAgLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBsYXN0IHdvcmQgb2YgdGhlIHN0dWIuICAqLwotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaF92YWwsCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgcywgbXlfb2Zmc2V0ICsgMTYpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfYnhfcGNfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0JCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9ub29wX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAyKTsKLQkJICAgICAgCi0JCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCQkoKGJmZF9zaWduZWRfdm1hKSBoX3ZhbCkJLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBvZiB0aGUgc3R1YiAqLwotCQkJCS0gKChiZmRfc2lnbmVkX3ZtYSkKLQkJCQkgICAocy0+b3V0cHV0X29mZnNldCAJCS8qIE9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgc3R1YnMuICAqLwotCQkJCSAgICArIG15X29mZnNldAkJCS8qIE9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBzdHViIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JCQkJICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSkgCS8qIEFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotCQkJCSAgICsgNAkJCQkvKiBUaGUgYnJhbmNoIGluc3RydWN0aW9uIGlzIDQgYnl0ZXMgaW50byB0aGUgc3R1Yi4gICovCi0JCQkJICAgKyA4KTsJCQkvKiBBUk0gYnJhbmNoZXMgd29yayBmcm9tIHRoZSBwYyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKyA4LiAgKi8KLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCQkJICB0MmEzX2JfaW5zbiB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0KLQkJICAgICAgLyogTm93IGdvIGJhY2sgYW5kIGZpeCB1cCB0aGUgb3JpZ2luYWwgQkwgaW5zbiB0byBwb2ludAotCQkJIHRvIGhlcmUuICAqLwotCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCXMtPm91dHB1dF9vZmZzZXQKLQkJCSsgbXlfb2Zmc2V0Ci0JCQktIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIHJlbC0+cl92YWRkcikKLQkJCS00OwotCQkgICAgICAKLQkJICAgICAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCQktIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCQkgIGluc2VydF90aHVtYl9icmFuY2ggKHRtcCwgcmV0X29mZnNldCksCi0JCQkJICBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCSAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgICAKLQkJICAgICAgZG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JICAKLSAgICAgICAgICAvKiBJZiB0aGUgcmVsb2NhdGlvbiB0eXBlIGFuZCBkZXN0aW5hdGlvbiBzeW1ib2wgZG9lcyBub3QKLSAgICAgICAgICAgICBmYWxsIGludG8gb25lIG9mIHRoZSBhYm92ZSBjYXRlZ29yaWVzLCB0aGVuIHdlIGNhbiBqdXN0Ci0gICAgICAgICAgICAgcGVyZm9ybSBhIGRpcmVjdCBsaW5rLiAqLwotCi0JICBpZiAoZG9uZSkKLQkgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0JICBlbHNlIAotI2VuZGlmIC8qIFRIVU1CRVhURU5TSU9OICovCi0JICAgIGlmICggICBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCXx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotCXsKLQkgIC8qIEVtaXQgYSByZWxvYyBpZiB0aGUgYmFja2VuZCB0aGlua3MgaXQgbmVlZHMgaXQuICovCi0JICBpZiAoc3ltICYmIHBlX2RhdGEob3V0cHV0X2JmZCktPmluX3JlbG9jX3Aob3V0cHV0X2JmZCwgaG93dG8pKQotICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIpOwotCX0KLSAgCi0jaWYgMSAvKiBUSFVNQkVYVEVOU0lPTiAqLwotICAgICAgaWYgKGRvbmUpCi0JcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICAvKiBPbmx5IHBlcmZvcm0gdGhpcyBmaXggZHVyaW5nIHRoZSBmaW5hbCBsaW5rLCBub3QgYSByZWxvY2F0YWJsZSBsaW5rLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLSAgICAgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAgICAgICYmIGhvd3RvLT50eXBlID09IEFSTV9USFVNQjIzKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBpcyBwcmV0dHkgbXVjaCBhIGNvcHkgb2Ygd2hhdCB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSBhbmQgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICAgICAgICAgICAgIHJvdXRpbmVzIGRvIHRvIHBlcmZvcm0gYSByZWxvY2F0aW9uLCB3aXRoIHNwZWNpYWwKLSAgICAgICAgICAgICBwcm9jZXNzaW5nIGZvciB0aGUgc3BsaXQgYWRkcmVzc2luZyBvZiB0aGUgVGh1bWIgQkwKLSAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEFnYWluLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBzaW1wbGVyIGFkZGluZyBhCi0gICAgICAgICAgICAgVGh1bWJCUkFOQ0gyMyBzcGVjaWZpYyBtYWNybyBleHBhbnNpb24gaW50byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIGNvZGUuICAqLwotCSAgCi0gICAgICAgICAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgCi0gICAgICAgICAgaWYgKGFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgIHJzdGF0ID0gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBiZmRfdm1hICAgICAgICAgcmVsb2NhdGlvbiAgICAgICA9IHZhbCArIGFkZGVuZDsKLQkgICAgICBpbnQgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotCSAgICAgIGJvb2xlYW4gICAgICAgICBvdmVyZmxvdyAgICAgICAgID0gZmFsc2U7Ci0JICAgICAgYmZkX2J5dGUgKiAgICAgIGxvY2F0aW9uICAgICAgICAgPSBjb250ZW50cyArIGFkZHJlc3M7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIHggICAgICAgICAgICAgICAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLQkgICAgICBiZmRfdm1hICAgICAgICAgc3JjX21hc2sgICAgICAgICA9IDB4MDA3RkZGRkU7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIGNoZWNrOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICBzaWduZWRfY2hlY2s7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIGFkZDsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSAgc2lnbmVkX2FkZDsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHNpemUgPT0gNCk7Ci0JICAgICAgCi0gICAgICAgICAgICAgIC8qIGhvd3RvLT5wY19yZWxhdGl2ZSBzaG91bGQgYmUgVFJVRSBmb3IgdHlwZSAxNCBCUkFOQ0gyMyAqLwotICAgICAgICAgICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgCi0gICAgICAgICAgICAgIC8qIGhvd3RvLT5wY3JlbF9vZmZzZXQgc2hvdWxkIGJlIFRSVUUgZm9yIHR5cGUgMTQgQlJBTkNIMjMgKi8KLSAgICAgICAgICAgICAgcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotCSAgICAgIAotCSAgICAgIC8qIE5vIG5lZWQgdG8gbmVnYXRlIHRoZSByZWxvY2F0aW9uIHdpdGggQlJBTkNIMjMuICovCi0JICAgICAgLyogaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCBmb3IgQlJBTkNIMjMuICAqLwotCSAgICAgIC8qIGhvd3RvLT5yaWdodHNoaWZ0ID09IDEgKi8KLQkgICAgICAvKiBEcm9wIHVud2FudGVkIGJpdHMgZnJvbSB0aGUgdmFsdWUgd2UgYXJlIHJlbG9jYXRpbmcgdG8uICAqLwotCSAgICAgIAotCSAgICAgIGNoZWNrID0gcmVsb2NhdGlvbiA+PiBob3d0by0+cmlnaHRzaGlmdDsKLQkJCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHNpZ25lZCB2YWx1ZSwgdGhlIHJpZ2h0c2hpZnQganVzdCBkcm9wcGVkCi0JCSBsZWFkaW5nIDEgYml0cyAoYXNzdW1pbmcgdHdvcyBjb21wbGVtZW50KS4gICovCi0JICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCQlzaWduZWRfY2hlY2sgPSBjaGVjazsKLQkgICAgICBlbHNlCi0JCXNpZ25lZF9jaGVjayA9IChjaGVjawotCQkJCXwgKChiZmRfdm1hKSAtIDEKLQkJCQkgICAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQkgICAgICAKLQkgICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQkgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXsKLQkJICBhZGQgPSAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDQpIHwgKCgoeCkgJiAweDdmZikgPDwgMSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhZGQgPSAoKCgoeCkgJiAweDdmZikgPDwgMTIpIHwgKCgoeCkgJiAweDA3ZmYwMDAwKSA+PiAxNSkpOwotCQl9Ci0KLQkgICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlIHdpdGggYW4gYXBwcm9wcmlhdGUgc2lnbi4KLQkJIFRoZSBleHByZXNzaW9uIGludm9sdmluZyBob3d0by0+c3JjX21hc2sgaXNvbGF0ZXMgdGhlIHVwcGVyCi0JCSBiaXQgb2Ygc3JjX21hc2suICBJZiB0aGF0IGJpdCBpcyBzZXQgaW4gdGhlIHZhbHVlIHdlIGFyZQotCQkgYWRkaW5nLCBpdCBpcyBuZWdhdGl2ZSwgYW5kIHdlIHN1YnRyYWN0IG91dCB0aGF0IG51bWJlciB0aW1lcwotCQkgdHdvLiAgSWYgc3JjX21hc2sgaW5jbHVkZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgYml0LCB0aGVuIHdlCi0JCSBjYW4gbm90IGdldCB0aGUgdXBwZXIgYml0LCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIgc2luY2UKLQkJIHNpZ25lZF9hZGQgbmVlZHMgbm8gYWRqdXN0bWVudCB0byBiZWNvbWUgbmVnYXRpdmUgaW4gdGhhdAotCQkgY2FzZS4gICovCi0JICAgICAgCi0JICAgICAgc2lnbmVkX2FkZCA9IGFkZDsKLQkgICAgICAKLQkgICAgICBpZiAoKGFkZCAmICgoKH4gc3JjX21hc2spID4+IDEpICYgc3JjX21hc2spKSAhPSAwKQotCQlzaWduZWRfYWRkIC09ICgoKH4gc3JjX21hc2spID4+IDEpICYgc3JjX21hc2spIDw8IDE7Ci0JICAgICAgCi0JICAgICAgLyogQWRkIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSwgc2hpZnRlZCBzbyB0aGF0IGl0IGlzIGEKLQkJIHN0cmFpZ2h0IG51bWJlci4gICovCi0JICAgICAgLyogaG93dG8tPmJpdHBvcyA9PSAwICovCi0JICAgICAgCi0JICAgICAgc2lnbmVkX2NoZWNrICs9IHNpZ25lZF9hZGQ7Ci0JICAgICAgcmVsb2NhdGlvbiArPSBzaWduZWRfYWRkOwotCi0JICAgICAgQkZEX0FTU0VSVCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCk7Ci0KLQkgICAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCSAgICAgIGlmICggICBzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4Ci0JCSAgfHwgc2lnbmVkX2NoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIAotCSAgICAgIC8qIFB1dCBSRUxPQ0FUSU9OIGludG8gdGhlIGNvcnJlY3QgYml0czogICovCi0JICAgICAgCi0JICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9ICgoKHJlbG9jYXRpb24gJiAweGZmZSkgPj4gMSkgIHwgKChyZWxvY2F0aW9uIDw8IDQpICYgMHgwN2ZmMDAwMCkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9ICgoKHJlbG9jYXRpb24gJiAweGZmZSkgPDwgMTUpIHwgKChyZWxvY2F0aW9uID4+IDEyKSAmIDB4N2ZmKSk7Ci0JCX0KLQkgICAgICAKLQkgICAgICAvKiBBZGQgUkVMT0NBVElPTiB0byB0aGUgY29ycmVjdCBiaXRzIG9mIFg6ICAqLwotCSAgICAgIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8IHJlbG9jYXRpb24pOwotCi0JICAgICAgLyogUHV0IHRoZSByZWxvY2F0ZWQgdmFsdWUgYmFjayBpbiB0aGUgb2JqZWN0IGZpbGU6ICAqLwotCSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotCi0JICAgICAgcnN0YXQgPSBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgZWxzZQotI2VuZGlmIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIGFkZGVuZCk7Ci0jaWYgMSAvKiBUSFVNQkVYVEVOU0lPTiAqLwotICAgICAgLyogRklYTUU6IAotCSBJcyB0aGlzIHRoZSBiZXN0IHdheSB0byBmaXggdXAgdGh1bWIgYWRkcmVzc2VzPyBrcmtAY3lnbnVzLmNvbQotCSBQcm9iYWJseSBub3QsIGJ1dCBpdCB3b3JrcywgYW5kIGlmIGl0IHdvcmtzIGl0IGRvbid0IG5lZWQgZml4aW5nISAgbmlja2NAY3lnbnVzLmNvbSAqLwotICAgICAgLyogT25seSBwZXJmb3JtIHRoaXMgZml4IGR1cmluZyB0aGUgZmluYWwgbGluaywgbm90IGEgcmVsb2NhdGFibGUgbGluay4gIG5pY2tjQGN5Z251cy5jb20gICovCi0gICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICYmIChyZWwtPnJfdHlwZSA9PSBBUk1fMzIgfHwgcmVsLT5yX3R5cGUgPT0gQVJNX1JWQTMyKSkKLQl7Ci0JICAvKiBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBzZXQgdGhlIGJvdHRvbSBiaXQgb2YgYSByZWxvY2F0ZWQgYWRkcmVzcwotCSAgICAgYmVjYXVzZSB0aGUgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiBhIFRodW1iIGNvZGUgc3ltYm9sLiAgKi8KLQkgICAgIAotCSAgaW50IHBhdGNoaXQgPSBmYWxzZTsKLQkgIAotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmICggICBoLT5jbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMKLQkJICB8fCBoLT5jbGFzcyA9PSBDX1RIVU1CRVhURlVOQykpCi0JICAgIHsKLQkgICAgICBwYXRjaGl0ID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3ltICE9IE5VTEwKLQkJICAgJiYgc3ltLT5uX3NjbnVtID4gTl9VTkRFRikKLQkgICAgewotCSAgICAgIC8qIE5vIGhhc2ggZW50cnkgLSB1c2UgdGhlIHN5bWJvbCBpbnN0ZWFkLiAgKi8KLQotCSAgICAgIGlmICggICBzeW0tPm5fc2NsYXNzID09IENfVEhVTUJTVEFURlVOQwotCQkgIHx8IHN5bS0+bl9zY2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCi0JCXBhdGNoaXQgPSB0cnVlOwotCSAgICB9Ci0KLQkgIGlmIChwYXRjaGl0KQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgKiBsb2NhdGlvbiA9IGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgICAgIGJmZF92bWEgICAgeCAgICAgICAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLQotCSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCB8IDEsIGxvY2F0aW9uKTsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBUSFVNQkVYVEVOU0lPTiAqLyAgICAgIAotICAgICAgCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKLQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLWJvb2xlYW4KLWJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIChpbmZvKSAKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgczsKLSAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvbzsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0jaWYgMAotICBzdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jaGFyID0gJzEnOwotI2VuZGlmCi0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotICAgICAgCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotI2lmIDAKLSAgICAgIG1lbXNldCAoZm9vLCB0ZXN0X2NoYXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotI2VuZGlmCi0gICAgICAKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPmFybV9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgaWYgKGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotICAgICAgCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0jaWYgMAotICAgICAgbWVtc2V0IChmb28sIHRlc3RfY2hhciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLSNlbmRpZgotICAgICAgCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiAgICAgICAgICAgICAgIHM7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgIG15aDsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0JICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLSAgCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47IC8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICAvKiBUaGUgb25seSB0cmljayBoZXJlIGlzIHVzaW5nIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgYXMgdGhlIHZhbHVlLiBFdmVuCi0gICAgIHRob3VnaCB0aGUgc2VjdGlvbiBpc24ndCBhbGxvY2F0ZWQgeWV0LCB0aGlzIGlzIHdoZXJlIHdlIHdpbGwgYmUgcHV0dGluZwotICAgICBpdC4gICovCi0KLSAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCUJTRl9HTE9CQUwsIAotCQkJCXMsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKyAxLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLSAgCi0gIGZyZWUgKHRtcF9uYW1lKTsKLSAgCi0gIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKz0gQVJNMlRIVU1CX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogICAgICAgICAgICAgICAgczsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgICBteWg7Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiAgZ2xvYmFsczsKLQotICAKLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsgLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfR0xPQkFMLCBzLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgKyAxLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLSAgCi0gIC8qIElmIHdlIG1hcmsgaXQgJ3RodW1iJywgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGRvIGEgYmV0dGVyIGpvYi4gICovCi0gIG15aC0+Y2xhc3MgPSBDX1RIVU1CRVhURlVOQzsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgLyogQWxsb2NhdGUgYW5vdGhlciBzeW1ib2wgdG8gbWFyayB3aGVyZSB3ZSBzd2l0Y2ggdG8gYXJtIG1vZGUuICAqLwotICAgICAgCi0jZGVmaW5lIENIQU5HRV9UT19BUk0gIl9fJXNfY2hhbmdlX3RvX2FybSIKLSNkZWZpbmUgQkFDS19GUk9NX0FSTSAiX18lc19iYWNrX2Zyb21fYXJtIgotICAKLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChDSEFOR0VfVE9fQVJNKSArIDEpOwotICAKLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotICAKLSAgc3ByaW50ZiAodG1wX25hbWUsIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyBCQUNLX0ZST01fQVJNIDogQ0hBTkdFX1RPX0FSTSwgbmFtZSk7Ci0KLSAgbXloID0gTlVMTDsKLSAgCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfTE9DQUwsIHMsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZQotCQkJCSsgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyA4IDogNCksCi0JCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAotCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsgIAotICAKLSAgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICs9IFRIVU1CMkFSTV9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBTZWxlY3QgYSBCRkQgdG8gYmUgdXNlZCB0byBob2xkIHRoZSBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBnbHVlIGNvZGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiBsZC9lbXVsdGVtcGwvCi0gICB7YXJtY29mZi9wZX0uZW0gICovCi0KLWJvb2xlYW4KLWJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChhYmZkLCBpbmZvKQotICAgICBiZmQgKiAJCSAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotICBmbGFnd29yZCAgIAkJCSAgICBmbGFnczsKLSAgYXNlY3Rpb24gKiAJCQkgICAgc2VjOwotICAgIAotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgZ2V0dGluZyBhIGJmZCB0byBob2xkIHRoZSBnbHVlLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgCi0gIGlmIChzZWMgPT0gTlVMTCkgCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0NPREUgfCBTRUNfUkVBRE9OTFk7Ci0gICAgICAKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gICAgICAKLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotICAgICAgCi0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotICAgICAgCi0gICAgICBpZiAoc2VjID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIAotICAvKiBTYXZlIHRoZSBiZmQgZm9yIGxhdGVyIHVzZS4gICovCi0gIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGFiZmQsIGluZm8sIHN1cHBvcnRfb2xkX2NvZGUpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogIGluZm87Ci0gICAgIGludAkJICAgICBzdXBwb3J0X29sZF9jb2RlOwotewotICBhc2VjdGlvbiAqIHNlYzsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIHRvIGNvbnN0cnVjdCBhbnkgZ2x1ZS4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICAvKiBIZXJlIHdlIGhhdmUgYSBiZmQgdGhhdCBpcyB0byBiZSBpbmNsdWRlZCBvbiB0aGUgbGluay4gIFdlIGhhdmUgYSBob29rCi0gICAgIHRvIGRvIHJlbG9jIHJ1bW1hZ2luZywgYmVmb3JlIHNlY3Rpb24gc2l6ZXMgYXJlIG5haWxlZCBkb3duLiAgKi8KLQotICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpOwotCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPSBzdXBwb3J0X29sZF9jb2RlOwotICAKLSAgLyogUnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgZ2x1ZSB2ZWN0b3JzLiAgKi8KLSAgc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAoOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIGk7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0KLSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApIAotCWNvbnRpbnVlOwotCi0gICAgICAvKiBMb2FkIHRoZSByZWxvY3MuICAqLwotICAgICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlLiAqLwotICAgICAgCi0gICAgICBpID0gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIDEsIDAsIDAsIDApOwotICAgIAotICAgICAgQkZEX0FTU0VSVCAoaSAhPSAwKTsKLQotICAgICAgZm9yIChyZWwgPSBpOyByZWwgPCBpICsgc2VjLT5yZWxvY19jb3VudDsgKytyZWwpIAotCXsKLQkgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICByX3R5cGUgID0gcmVsLT5yX3R5cGU7Ci0JICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbmR4OwotCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0KLQkgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIG5vdCBhZ2FpbnN0IGEgc3ltYm9sIGl0IGNhbm5vdCBjb25jZXJuIHVzLiAqLwotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgY29udGludWU7Ci0KLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtzeW1uZHhdOwotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGEgc3RhdGljIHN5bWJvbCBpdCBtdXN0IGJlIHdpdGhpbgotCSAgICAgdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgc28gY2Fubm90IGJlIGEgY3Jvc3MgQVJNL1RodW1iIHJlbG9jYXRpb24uICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIHN3aXRjaCAocl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgQVJNXzI2OgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIGFybSBjb2RlLiAgV2UgbmVlZCB0byBsb29rIHVwCi0JCSB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBhIHRodW1iIHRhcmdldCwgd2UKLQkJIGluc2VydCBnbHVlLiAgKi8KLQkgICAgICAKLQkgICAgICBpZiAoaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCi0JCXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAoaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJNX1RIVU1CMjM6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gdGh1bWIgY29kZS4gIFdlIHVzZWQgdG8gbG9vawotCQkgZm9yIEFSTV9USFVNQjkgYW5kIEFSTV9USFVNQjEyIGFzIHdlbGwuICBXZSBuZWVkIHRvIGxvb2sKLQkJIHVwIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGFuIGFybSB0YXJnZXQsIHdlCi0JCSBpbnNlcnQgZ2x1ZS4gIElmIHRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QgaXQgd2lsbCBiZQotCQkgZ2l2ZW4gYSBjbGFzcyBvZiBDX0VYVCBhbmQgc28gd2Ugd2lsbCBnZW5lcmF0ZSBhIHN0dWIKLQkJIGZvciBpdC4gIFRoaXMgaXMgbm90IHJlYWxseSBhIHByb2JsZW0sIHNpbmNlIHRoZSBsaW5rCi0JCSBpcyBkb29tZWQgYW55d2F5LiAgKi8KLQotCSAgICAgIHN3aXRjaCAoaC0+Y2xhc3MpCi0JCXsKLQkJY2FzZSBDX0VYVDoKLQkJY2FzZSBDX1NUQVQ6Ci0JCWNhc2UgQ19MQUJFTDoKLQkJICByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoQ09GRl9JTUFHRV9XSVRIX1BFKSAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIAkJY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIAkJCWNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAJCWNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4CQkJY29mZl9hcm1fYWRqdXN0X3N5bW5keAotI2RlZmluZSBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAJCWNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotI2RlZmluZSBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAkJY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0Ci0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJCWNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQkJY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAgICAgICAgICAgICAgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICAgICAgY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUJCWNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotCi0vKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIHdhbnQgdG8gY29udmVydCBBUk0yNiByZWxvY3MKLSAgIGludG8gQVJNMjZEIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9hZGp1c3Rfc3ltbmR4IChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIGlyZWwsIGFkanVzdGVkcCkKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICBib29sZWFuICphZGp1c3RlZHA7Ci17Ci0gIGlmIChpcmVsLT5yX3R5cGUgPT0gMykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpYmZkKVtpcmVsLT5yX3N5bW5keF07Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IHNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JaXJlbC0+cl90eXBlID0gNzsKLSAgICB9Ci0gICphZGp1c3RlZHAgPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIG1lcmdpbmcgdGhlIHByaXZhdGUgZGF0YSBhcmVhcyBvZiB0d28gQkZEcy4KLSAgIFRoaXMgaXMgaW1wb3J0YW50IGFzIGl0IGFsbG93cyB1cyB0byBkZXRlY3QgaWYgd2UgYXJlCi0gICBhdHRlbXB0aW5nIHRvIG1lcmdlIGJpbmFyaWVzIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQgQVJNCi0gICB0YXJnZXRzLCBlZyBkaWZmZXJlbnQgQ1BVcyBvciBkaWZmZXJlbnRzIEFQQ1Mncy4gICAgICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiAgIGliZmQ7Ci0gICAgIGJmZCAqICAgb2JmZDsKLXsKLSAgQkZEX0FTU0VSVCAoaWJmZCAhPSBOVUxMICYmIG9iZmQgIT0gTlVMTCk7Ci0KLSAgaWYgKGliZmQgPT0gb2JmZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGUgdHdvIGZvcm1hdHMgYXJlIGRpZmZlcmVudCB3ZSBjYW5ub3QgbWVyZ2UgYW55dGhpbmcuCi0gICAgIFRoaXMgaXMgbm90IGFuIGVycm9yLCBzaW5jZSBpdCBpcyBwZXJtaXNzYWJsZSB0byBjaGFuZ2UgdGhlCi0gICAgIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cy4gICovCi0gIGlmICggICBpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFZlcmlmeSB0aGF0IHRoZSBBUENTIGlzIHRoZSBzYW1lIGZvciB0aGUgdHdvIEJGRHMgKi8KLSAgaWYgKEFQQ1NfU0VUIChpYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoQVBDU19TRVQgKG9iZmQpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgQVBDUyBmbGFnIGJpdHMgc2V0LCBmYWlsLiAgKi8KLQkgIGlmIChBUENTXzI2X0ZMQUcgKG9iZmQpICE9IEFQQ1NfMjZfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCShfKCIlczogRVJST1I6IGNvbXBpbGVkIGZvciBBUENTLSVkIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgQVBDUy0lZCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIEFQQ1NfMjZfRkxBRyAoaWJmZCkgPyAyNiA6IDMyLAotCQkgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIEFQQ1NfMjZfRkxBRyAob2JmZCkgPyAyNiA6IDMyCi0JCSApOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAKLQkgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKG9iZmQpICE9IEFQQ1NfRkxPQVRfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICptc2c7Ci0KLQkgICAgICBpZiAoQVBDU19GTE9BVF9GTEFHIChpYmZkKSkKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBmbG9hdCByZWdpc3RlcnMgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBpbnRlZ2VyIHJlZ2lzdGVycyIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGZsb2F0IHJlZ2lzdGVycyIpOwotCSAgICAgIAotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBpZiAoUElDX0ZMQUcgKG9iZmQpICE9IFBJQ19GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKiBtc2c7Ci0KLQkgICAgICBpZiAoUElDX0ZMQUcgKGliZmQpKQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBjb21waWxlZCBhcyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyBhYnNvbHV0ZSBwb3NpdGlvbiIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgYWJzb2x1dGUgcG9zaXRpb24gY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQiKTsKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0FQQ1NfRkxBR1MgKG9iZmQsIEFQQ1NfMjZfRkxBRyAoaWJmZCkgfCBBUENTX0ZMT0FUX0ZMQUcgKGliZmQpIHwgUElDX0ZMQUcgKGliZmQpKTsKLQkgIAotCSAgLyogU2V0IHVwIHRoZSBhcmNoIGFuZCBmaWVsZHMgYXMgd2VsbCBhcyB0aGVzZSBhcmUgcHJvYmFibHkgd3JvbmcuICAqLwotCSAgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhlIGludGVyd29ya2luZyBzdXBwb3J0LiAgKi8KLSAgaWYgKElOVEVSV09SS19TRVQgKGliZmQpKQotICAgIHsKLSAgICAgIGlmIChJTlRFUldPUktfU0VUIChvYmZkKSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGRpZmZlciBpbiB0aGVpciBpbnRlcndvcmtpbmcgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLQkgIGlmIChJTlRFUldPUktfRkxBRyAob2JmZCkgIT0gSU5URVJXT1JLX0ZMQUcgKGliZmQpKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqIG1zZzsKLQotCSAgICAgIGlmIChJTlRFUldPUktfRkxBRyAoaWJmZCkpCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIHN1cHBvcnRzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzIG5vdC4iKTsKLQkgICAgICBlbHNlCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMuIik7Ci0JICAgICAgCi0JICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFNFVF9JTlRFUldPUktfRkxBRyAob2JmZCwgSU5URVJXT1JLX0ZMQUcgKGliZmQpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICV4OiIpLCBjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyk7Ci0gIAotICBpZiAoQVBDU19TRVQgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OiBBUENTIGlzIEFSTSBQcm9kZWN1cmUgQ2FsbCBTdGFuZGFyZCwgaXQgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAgKi8KLSAgICAgIGZwcmludGYgKGZpbGUsICIgW0FQQ1MtJWRdIiwgQVBDU18yNl9GTEFHIChhYmZkKSA/IDI2IDogMzIpOwotCi0gICAgICBpZiAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSkKLQlmcHJpbnRmIChmaWxlLCBfKCIgW2Zsb2F0cyBwYXNzZWQgaW4gZmxvYXQgcmVnaXN0ZXJzXSIpKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChmaWxlLCBfKCIgW2Zsb2F0cyBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnNdIikpOwotCi0gICAgICBpZiAoUElDX0ZMQUcgKGFiZmQpKQotCWZwcmludGYgKGZpbGUsIF8oIiBbcG9zaXRpb24gaW5kZXBlbmRlbnRdIikpOwotICAgICAgZWxzZQotCWZwcmludGYgKGZpbGUsIF8oIiBbYWJzb2x1dGUgcG9zaXRpb25dIikpOwotICAgIH0KLSAgCi0gIGlmICghIElOVEVSV09SS19TRVQgKGFiZmQpKQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIGZsYWcgbm90IGluaXRpYWxpc2VkXSIpKTsKLSAgZWxzZSBpZiAoSU5URVJXT1JLX0ZMQUcgKGFiZmQpKQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIHN1cHBvcnRlZF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfKCIgW2ludGVyd29ya2luZyBub3Qgc3VwcG9ydGVkXSIpKTsKLSAgCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENvcGllcyB0aGUgZ2l2ZW4gZmxhZ3MgaW50byB0aGUgY29mZl90ZGF0YS5mbGFncyBmaWVsZC4KLSAgIFR5cGljYWxseSB0aGVzZSBmbGFncyBjb21lIGZyb20gdGhlIGZfZmxhZ3NbXSBmaWVsZCBvZgotICAgdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsIHdoaWNoIGNvbnRhaW5zIGltcG9ydGFudCwKLSAgIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLSAgIE5vdGU6IEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgc3RhdGljLCBpdCBpcyBleHBsaWNpdGx5Ci0gICBjYWxsZWQgZnJvbSBib3RoIGNvZmZjb2RlLmggYW5kIHBlaWNvZGUuaC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1fYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLQliZmQgKgkgICBhYmZkOwotCWZsYWd3b3JkICAgZmxhZ3M7Ci17Ci0gIGZsYWd3b3JkIGZsYWc7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMKTsKLQotICBmbGFnID0gKGZsYWdzICYgRl9BUENTMjYpID8gRl9BUENTXzI2IDogMDsKLSAgCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBBUENTIGZpZWxkIGhhcyBub3QgYmVlbiBpbml0aWFsaXNlZCB0byB0aGUgb3Bwb3NpdGUKLSAgICAgdmFsdWUuICAqLwotICBpZiAoQVBDU19TRVQgKGFiZmQpCi0gICAgICAmJiAoICAgKEFQQ1NfMjZfRkxBRyAgICAoYWJmZCkgIT0gZmxhZykKLQkgIHx8IChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpICE9IChmbGFncyAmIEZfQVBDU19GTE9BVCkpCi0JICB8fCAoUElDX0ZMQUcgICAgICAgIChhYmZkKSAhPSAoZmxhZ3MgJiBGX1BJQykpCi0JICApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmbGFnIHw9IChmbGFncyAmIChGX0FQQ1NfRkxPQVQgfCBGX1BJQykpOwotICAKLSAgU0VUX0FQQ1NfRkxBR1MgKGFiZmQsIGZsYWcpOwotCi0gIGZsYWcgPSAoZmxhZ3MgJiBGX0lOVEVSV09SSyk7Ci0gIAotICAvKiBJZiB0aGUgQkZEIGhhcyBhbHJlYWR5IGhhZCBpdHMgaW50ZXJ3b3JraW5nIGZsYWcgc2V0LCBidXQgaXQKLSAgICAgaXMgZGlmZmVyZW50IGZyb20gdGhlIHZhbHVlIHRoYXQgd2UgaGF2ZSBiZWVuIGFza2VkIHRvIHNldCwKLSAgICAgdGhlbiBhc3N1bWUgdGhhdCB0aGF0IG1lcmdlZCBjb2RlIHdpbGwgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nCi0gICAgIGFuZCBzZXQgdGhlIGZsYWcgYWNjb3JkaW5nbHkuICAqLwotICBpZiAoSU5URVJXT1JLX1NFVCAoYWJmZCkgJiYgKElOVEVSV09SS19GTEFHIChhYmZkKSAhPSBmbGFnKSkKLSAgICB7Ci0gICAgICBpZiAoZmxhZykKLQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIldhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29ya2luZyBmbGFnIG9mICVzLCBzaW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBhcyBub24taW50ZXJ3b3JraW5nIiksCi0JCQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZWxzZQotCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCV9iZmRfZXJyb3JfaGFuZGxlciAoXygiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBmbGFnID0gMDsKLSAgICB9Ci0KLSAgU0VUX0lOVEVSV09SS19GTEFHIChhYmZkLCBmbGFnKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDb3B5IHRoZSBpbXBvcnRhbnQgcGFydHMgb2YgdGhlIHRhcmdldCBzcGVjaWZpYyBkYXRhCi0gICBmcm9tIG9uZSBpbnN0YW5jZSBvZiBhIEJGRCB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoc3JjLCBkZXN0KQotICAgICBiZmQgKiAgc3JjOwotICAgICBiZmQgKiAgZGVzdDsKLXsKLSAgQkZEX0FTU0VSVCAoc3JjICE9IE5VTEwgJiYgZGVzdCAhPSBOVUxMKTsKLSAKLSAgaWYgKHNyYyA9PSBkZXN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBub3QgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzb3VyY2UsIGRvIG5vdCBkbwotICAgICB0aGUgY29weS4gICovCi0gIGlmIChzcmMtPnh2ZWMgIT0gZGVzdC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBjb3B5IHRoZSBmbGFncyBmaWVsZCAqLwotICBpZiAoQVBDU19TRVQgKHNyYykpCi0gICAgewotICAgICAgaWYgKEFQQ1NfU0VUIChkZXN0KSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IEFQQ1MgZmxhZyBiaXRzIHNldCwgZmFpbC4gICovCi0JICBpZiAoQVBDU18yNl9GTEFHIChkZXN0KSAhPSBBUENTXzI2X0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIAotCSAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAoZGVzdCkgIT0gQVBDU19GTE9BVF9GTEFHIChzcmMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAKLQkgIGlmIChQSUNfRkxBRyAoZGVzdCkgIT0gUElDX0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JU0VUX0FQQ1NfRkxBR1MgKGRlc3QsIEFQQ1NfMjZfRkxBRyAoc3JjKSB8IEFQQ1NfRkxPQVRfRkxBRyAoc3JjKQotCQkJfCBQSUNfRkxBRyAoc3JjKSk7Ci0gICAgfQotCi0gIGlmIChJTlRFUldPUktfU0VUIChzcmMpKQotICAgIHsKLSAgICAgIGlmIChJTlRFUldPUktfU0VUIChkZXN0KSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IGludGVyd29ya2luZyBmbGFncyB0aGVuIHR1cm4KLQkgICAgIG9mZiB0aGUgaW50ZXJ3b3JraW5nIGJpdC4gICovCi0JICBpZiAoSU5URVJXT1JLX0ZMQUcgKGRlc3QpICE9IElOVEVSV09SS19GTEFHIChzcmMpKQotCSAgICB7Ci0JICAgICAgaWYgKElOVEVSV09SS19GTEFHIChkZXN0KSkKLQkJewotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgX2JmZF9lcnJvcl9oYW5kbGVyICgoIldhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmtpbmcgYml0IG9mICVzLCBiZWNhdXNlIHRoZSBub24taW50ZXJ3b3JraW5nIGNvZGUgaW4gJXMgaGFzIGJlZW4gY29waWVkIGludG8gaXQiKSwKLQkJCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChkZXN0KSwKLQkJCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzcmMpKTsKLQkJfQotCSAgICAgIAotCSAgICAgIFNFVF9JTlRFUldPUktfRkxBRyAoZGVzdCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0lOVEVSV09SS19GTEFHIChkZXN0LCBJTlRFUldPUktfRkxBRyAoc3JjKSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTm90ZTogIHRoZSBkZWZpbml0aW9ucyBoZXJlIG9mIExPQ0FMX0xBQkVMX1BSRUZJWCBhbmQgVVNFUl9MQUJFTF9QUkVJRlgKLSAqbXVzdCogbWF0Y2ggdGhlIGRlZmluaXRpb25zIGluIGdjYy9jb25maWcvYXJtL2NvZmYuaCBhbmQgc2VtaS5oICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMX1BSRUZJWCAiLiIKLSNpZm5kZWYgVVNFUl9MQUJFTF9QUkVGSVgKLSNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggIl8iCi0jZW5kaWYKLQotLyogTGlrZSBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSwgYnV0Ci0gICBhKSB0ZXN0IGFnYWluc3QgVVNFUl9MQUJFTF9QUkVGSVgsIHRvIGF2b2lkIHN0cmlwcGluZyBsYWJlbHMga25vd24gdG8gYmUKLSAgICAgIG5vbi1sb2NhbC4KLSAgIGIpIEFsbG93IG90aGVyIHByZWZpeGVzIHRoYW4gIi4iLCBlLmcuIGFuIGVtcHR5IHByZWZpeCB3b3VsZCBjYXVzZSBhbGwKLSAgICAgIGxhYmVscyBvZiB0aGUgZm9ybSBMeHh4IHRvIGJlIHN0cmlwcGVkLiAgKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICogbmFtZTsKLXsKLSNpZmRlZiBVU0VSX0xBQkVMX1BSRUZJWAotICBpZiAoVVNFUl9MQUJFTF9QUkVGSVhbMF0gIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgVVNFUl9MQUJFTF9QUkVGSVgsIHN0cmxlbiAoVVNFUl9MQUJFTF9QUkVGSVgpKSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIExPQ0FMX0xBQkVMX1BSRUZJWAotICAvKiBJZiB0aGVyZSBpcyBhIHByZWZpeCBmb3IgbG9jYWwgbGFiZWxzIHRoZW4gbG9vayBmb3IgdGhpcy4KLSAgICAgSWYgdGhlIHByZWZpeCBleGlzdHMsIGJ1dCBpdCBpcyBlbXB0eSwgdGhlbiBpZ25vcmUgdGhlIHRlc3QuICovCi0gIAotICBpZiAoTE9DQUxfTEFCRUxfUFJFRklYWzBdICE9IDApCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoTE9DQUxfTEFCRUxfUFJFRklYKTsKLSAgICAgIAotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIExPQ0FMX0xBQkVMX1BSRUZJWCwgbGVuKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgLyogUGVyZm9ybSB0aGUgY2hlY2tzIGJlbG93IGZvciB0aGUgcmVzdCBvZiB0aGUgbmFtZS4gICovCi0gICAgICBuYW1lICs9IGxlbjsKLSAgICB9Ci0jZW5kaWYKLSAgCi0gIHJldHVybiBuYW1lWzBdID09ICdMJzsKLX0KLQotLyogVGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCi0gICB0aGUgZ2x1ZSBzZWN0aW9uIGlzIHdyaXR0ZW4gbGFzdC4gCi0KLSAgIFRoaXMgZG9lcyBkZXBlbmQgb24gYmZkX21ha2Vfc2VjdGlvbiBhdHRhY2hpbmcgYSBuZXcgc2VjdGlvbiB0byB0aGUKLSAgIGVuZCBvZiB0aGUgc2VjdGlvbiBsaXN0IGZvciB0aGUgYmZkLiAKLQotICAga3JrQGN5Z251cy5jb20gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4gKHN1YiwgaW5mbykKLSAgICAgYmZkICogc3ViOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBpbmZvOwotewotICByZXR1cm4gKHN1Yi0+b3V0cHV0X2hhc19iZWd1bgotCSAgfHwgc3ViID09IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8tPmluZm8pLT5iZmRfb2ZfZ2x1ZV9vd25lcik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm87Ci17Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChwZmluZm8tPmluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgCi0gIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAocGZpbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lcikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lci0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0jZGVmaW5lIGNvZmZfU1dBUF9zeW1faW4gIGFybV9iZmRfY29mZl9zd2FwX3N5bV9pbgotCi1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotCi0vKiBTZXBjaWFsIHZlcnNpb24gb2Ygc3ltYm9sIHN3YXBwZXIsIHVzZWQgdG8gZ3JhYiBhIGJmZAotICAgb250byB3aGljaCB0aGUgZ2x1ZSBzZWN0aW9ucyBjYW4gYmUgYXR0YWNoZWQuICAqLwotc3RhdGljIHZvaWQKLWFybV9iZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgKiBhYmZkOwotICAgICBQVFIgICBleHQxOwotICAgICBQVFIgICBpbjE7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqIHM7Ci0KLSAgLyogRG8gdGhlIG5vcm1hbCBzd2FwIGluLiAgKi8KLSAgY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKTsKLQotICBpZiAoYmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCkgLyogd2UgYWxyZWFkeSBoYXZlIGEgdG9jLCBzbyBnbyBob21lICovCi0gICAgcmV0dXJuOwotCi0gIC8qIFNhdmUgdGhlIGJmZCBmb3IgbGF0ZXIgYWxsb2NhdGlvbi4gICovCi0gIGJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGJmZF9vZl9nbHVlX293bmVyICwgCi0JCQkgICAgICAgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgOwotICAgICAgCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGJmZF9vZl9nbHVlX293bmVyLCBzLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChiZmRfb2ZfZ2x1ZV9vd25lciwgcywgMikpCi0JewotCSAgLyogRklYTUU6IHNldCBhcHByb3ByaWF0ZSBiZmQgZXJyb3IgKi8KLQkgIGFib3J0KCk7Ci0JfQotICAgIH0KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSA7Ci0gICAgICAKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChiZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgICAgIAotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYmZkX29mX2dsdWVfb3duZXIsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGJmZF9vZl9nbHVlX293bmVyLCBzLCAyKSkKLQl7Ci0JICAvKiBGSVhNRTogc2V0IGFwcHJvcHJpYXRlIGJmZCBlcnJvciBrcmtAY3lnbnVzLmNvbSAqLwotCSAgYWJvcnQoKTsKLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNIGFybWNvZmZfbGl0dGxlX3ZlYwotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfTkFNRQotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgImNvZmYtYXJtLWxpdHRsZSIKLSNlbmRpZgotI2lmbmRlZiBUQVJHRVRfQklHX1NZTQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSBhcm1jb2ZmX2JpZ192ZWMKLSNlbmRpZgotI2lmbmRlZiBUQVJHRVRfQklHX05BTUUKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICJjb2ZmLWFybS1iaWciCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAwCi0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2RlZmluZSBFWFRSQV9TX0ZMQUdTIChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUykKLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NfRkxBR1MgMAotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSBpbml0aWFsaXNpbmcgYWx0ZXJuYXRpdmVfdGFyZ2V0IGZpZWxkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9CSUdfU1lNIDsKLQotLyogVGFyZ2V0IHZlY3RvcnMuICAqLwotQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfTElUVExFX05BTUUsIERfUEFHRUQsIEVYVFJBX1NfRkxBR1MsIFRBUkdFVF9VTkRFUlNDT1JFLCAmIFRBUkdFVF9CSUdfU1lNKQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUsIERfUEFHRUQsIEVYVFJBX1NfRkxBR1MsIFRBUkdFVF9VTkRFUlNDT1JFLCAmIFRBUkdFVF9MSVRUTEVfU1lNKQotCmRpZmYgLS1naXQgYS9iZmQvY29mZi1hdXguYyBiL2JmZC9jb2ZmLWF1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY2MzkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWF1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBwbGUgTTY4SyBDT0ZGIEEvVVggMy54IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQltNjhrYXV4X2NvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstYXV4IgotCi0jaWZuZGVmIFRBUkdfQVVYCi0jZGVmaW5lIFRBUkdfQVVYCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLS8qIDRrIHBhZ2VzICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBPbiBBVVgsIGEgU1RZUF9OT0xPQUR8U1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkIGxpYnJhcnkuICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0KLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotc3RhdGljIGJvb2xlYW4gY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCAKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLCAKLSAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotI2RlZmluZSBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCi0KLSNpbmNsdWRlICJjb2ZmL2F1eC1jb2ZmLmgiICAvKiBvdmVycmlkZSBjb2ZmL2ludGVybmFsLmggYW5kIGNvZmYvbTY4ay5oICovCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCi0KLS8qIFdlIG5lZWQgbm9uLWFic29sdXRlIHN5bWJvbHMgdG8gb3ZlcnJpZGUgYWJzb2x1dGUgc3ltYm9scy4gIFRoaXMKLSAgIG1pcnJvcnMgQXBwbGUncyAic29sdXRpb24iIHRvIGxldCBhIHN0YXRpYyBsaWJyYXJ5IHN5bWJvbCBvdmVycmlkZQotICAgYSBzaGFyZWQgbGlicmFyeSBzeW1ib2wuICBPbiB0aGUgd2hvbGUgbm90IGEgZ29vZCB0aGluZywgZ2l2ZW4gaG93Ci0gICBzaGFyZWQgbGlicmFyaWVzIHdvcmsgaGVyZSwgYnV0IGNhbiB3b3JrIGlmIHlvdSBhcmUgY2FyZWZ1bCB3aXRoCi0gICB3aGF0IHlvdSBpbmNsdWRlIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCQkJICAgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoKGZsYWdzICYgKEJTRl9XQVJOSU5HIHwgQlNGX0NPTlNUUlVDVE9SIHwgQlNGX1dFQUspKSA9PSAwICYmCi0gICAgICAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSAmJgotICAgICAgIWJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgewotICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgYSBkZWZpbml0aW9uIG9yIGFuIGluZGlyZWN0IGRlZmluaXRpb24gKi8KLQotICAgICAgLyogVGhpcyBiaXQgY29waWVkIGZyb20gbGlua2VyLmMgKi8KLSAgICAgIGlmIChoYXNocCAhPSBOVUxMICYmICpoYXNocCAhPSBOVUxMKQotCXsKLQkgIGggPSAqaGFzaHA7Ci0JICBCRkRfQVNTRVJUIChzdHJjbXAgKGgtPnJvb3Quc3RyaW5nLCBuYW1lKSA9PSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGhhc2hwICE9IE5VTEwpCi0JCSpoYXNocCA9IE5VTEw7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+bm90aWNlX2hhc2ggIT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMCi0JICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpCi0JewotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPm5vdGljZSkgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGhhc2hwICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkKLQkqaGFzaHAgPSBoOwotICAgICAgLyogZW5kIGR1cGxpY2F0aW9uIGZyb20gbGlua2VyLmMgKi8KLQotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JewotCSAgYXNlY3Rpb24gKm1zZWM7Ci0KLQkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgICAgbXNlYyA9IGgtPnUuZGVmLnNlY3Rpb247Ci0JICBlbHNlCi0JICAgIG1zZWMgPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotCi0JICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChtc2VjKSAmJiAhYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKSkKLQkgICAgewotCSAgICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotCSAgICAgIGgtPnUuZGVmLnZhbHVlID0gdmFsdWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikgJiYgIWJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykpCi0JICAgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGV4aXQgZWFybHksIGZpbmlzaCBwcm9jZXNzaW5nIGluIHRoZSBnZW5lcmljIHJvdXRpbmUgKi8KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLQkJCQkJICAgaGFzaHApOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtZ28zMi5jIGIvYmZkL2NvZmYtZ28zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI0ZTM2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWdvMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IENPRkYgZmlsZXMgKGdvMzIgdmFyaWFudCkuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgREogRGVsb3JpZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JCWdvMzJjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkJImNvZmYtZ28zMiIKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUJJ18nCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0jZGVmaW5lIENPRkZfU1VQUE9SVF9HTlVfTElOS09OQ0UKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5kYXRhIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIudGV4dCIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuZ251LmxpbmtvbmNlLmQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLmdudS5saW5rb25jZS50IiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfUEFSVElBTF9NQVRDSCAoIi5nbnUubGlua29uY2UuciIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9Ci0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWg4MzAwLmMgYi9iZmQvY29mZi1oODMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzExMjVjLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWg4MzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSGl0YWNoaSBIOC8zMDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL2g4MzAwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCi0KLS8qIFdlIGRlcml2ZSBhIGhhc2ggdGFibGUgZnJvbSB0aGUgYmFzaWMgQkZEIGhhc2ggdGFibGUgdG8KLSAgIGhvbGQgZW50cmllcyBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yLiAgQXNpZGUgZnJvbSB0aGUgCi0gICBpbmZvIHN0b3JlZCBieSB0aGUgYmFzaWMgaGFzaCB0YWJsZSwgd2UgbmVlZCB0aGUgb2Zmc2V0Ci0gICBvZiBhIHBhcnRpY3VsYXIgZW50cnkgd2l0aGluIHRoZSBoYXNoIHRhYmxlIGFzIHdlbGwgYXMKLSAgIHRoZSBvZmZzZXQgd2hlcmUgd2UnbGwgYWRkIHRoZSBuZXh0IGVudHJ5LiAgKi8KLQotc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeQotewotICAvKiBUaGUgYmFzaWMgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSB2ZWN0b3JzIHNlY3Rpb24gd2hlcmUKLSAgICAgdGhpcyBlbnRyeSBsaXZlcy4gICovCi0gIGJmZF92bWEgb2Zmc2V0OwotfTsKLQotc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZQotewotICAvKiBUaGUgYmFzaWMgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotCi0gIGJmZCAqYWJmZDsKLQotICAvKiBPZmZzZXQgYXQgd2hpY2ggd2UnbGwgYWRkIHRoZSBuZXh0IGVudHJ5LiAgKi8KLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZnVuY3ZlY19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWZ1bmN2ZWNfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKiwgYmZkICosCi0gICAgICAgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKSkpKTsKLQotLyogVG8gbG9va3VwIGEgdmFsdWUgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgZnVuY3ZlY19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVGhlIGRlcml2ZWQgaDgzMDAgQ09GRiBsaW5rZXIgdGFibGUuICBOb3RlIGl0J3MgZGVyaXZlZCBmcm9tCi0gICB0aGUgZ2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZSwgbm90IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIGhhc2gKLSAgIHRhYmxlISAgV2UgdXNlIHRoaXMgdG8gYXR0YWNoIGFkZGl0aW9uYWwgZGF0YSBzdHJ1Y3R1cmVzIHdlCi0gICBuZWVkIHdoaWxlIGxpbmtpbmcgb24gdGhlIGg4MzAwLiAgKi8KLXN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogU2VjdGlvbiBmb3IgdGhlIHZlY3RvcnMgdGFibGUuICBUaGlzIGdldHMgYXR0YWNoZWQgdG8gYQotICAgICByYW5kb20gaW5wdXQgYmZkLCB3ZSBrZWVwIGl0IGhlcmUgZm9yIGVhc3kgYWNjZXNzLiAgKi8KLSAgYXNlY3Rpb24gKnZlY3RvcnNfc2VjOwotCi0gIC8qIEhhc2ggdGFibGUgb2YgdGhlIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIGVudGVyIGludG8gdGhlIGZ1bmN0aW9uCi0gICAgIHZlY3Rvci4gICovCi0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKmZ1bmN2ZWNfaGFzaF90YWJsZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdldCB0aGUgSDgvMzAwIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGg4MzAwX2NvZmZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICopICgoY29mZl9oYXNoX3RhYmxlIChwKSkpKQotCi0vKiBJbml0aWFsaXplIGZpZWxkcyB3aXRoaW4gYSBmdW5jdmVjIGhhc2ggdGFibGUgZW50cnkuICBDYWxsZWQgd2hlbmV2ZXIKLSAgIGEgbmV3IGVudHJ5IGlzIGFkZGVkIHRvIHRoZSBmdW5jdmVjIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWZ1bmN2ZWNfaGFzaF9uZXdmdW5jIChlbnRyeSwgZ2VuX3RhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqZ2VuX3RhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKnJldDsKLSAgc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqdGFibGU7Ci0KLSAgcmV0ID0gKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikgZW50cnk7Ci0gIHRhYmxlID0gKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKikgZ2VuX3RhYmxlOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopCi0gICAgICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlIChnZW5fdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKQotICAgICAgICAgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIGdlbl90YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE5vdGUgd2hlcmUgdGhpcyBlbnRyeSB3aWxsIHJlc2lkZSBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIHRhYmxlLiAgKi8KLSAgcmV0LT5vZmZzZXQgPSB0YWJsZS0+b2Zmc2V0OwotCi0gIC8qIEJ1bXAgdGhlIG9mZnNldCBhdCB3aGljaCB3ZSBzdG9yZSBlbnRyaWVzIGluIHRoZSBmdW5jdGlvbgotICAgICB2ZWN0b3IuICBXZSdkIGxpa2UgdG8gYnVtcCB1cCB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9ycyBzZWN0aW9uLAotICAgICBidXQgaXQncyBub3QgZWFzaWx5IGF2YWlsYWJsZSBoZXJlLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwKQotICAgIHRhYmxlLT5vZmZzZXQgKz0gMjsKLSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoICh0YWJsZS0+YWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JICAgfHwgYmZkX2dldF9tYWNoICh0YWJsZS0+YWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotICAgIHRhYmxlLT5vZmZzZXQgKz0gNDsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEV2ZXJ5dGhpbmcgd2VudCBPSy4gICovCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZnVuY3ZlY19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKikpOwotewotICAvKiBJbml0aWFsaXplIG91ciBsb2NhbCBmaWVsZHMsIHRoZW4gY2FsbCB0aGUgZ2VuZXJpYyBpbml0aWFsaXphdGlvbgotICAgICByb3V0aW5lLiAgKi8KLSAgdGFibGUtPm9mZnNldCA9IDA7Ci0gIHRhYmxlLT5hYmZkID0gYWJmZDsKLSAgcmV0dXJuIChiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIG5ld2Z1bmMpKTsKLX0KLQotLyogQ3JlYXRlIHRoZSBkZXJpdmVkIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UgdXNlIGEgZGVyaXZlZCBoYXNoIHRhYmxlCi0gICBiYXNpY2FsbHkgdG8gaG9sZCAic3RhdGljIiBpbmZvcm1hdGlvbiBkdXJpbmcgYW4gaDgvMzAwIGNvZmYgbGluawotICAgd2l0aG91dCB1c2luZyBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLSAgcmV0ID0gKChzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCFfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LnJvb3QsIGFiZmQsIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBvdXIgZGF0YS4gICovCi0gIHJldC0+dmVjdG9yc19zZWMgPSBOVUxMOwotICByZXQtPmZ1bmN2ZWNfaGFzaF90YWJsZSA9IE5VTEw7Ci0KLSAgLyogT0suICBFdmVyeXRoaW5nJ3MgaW50aWFsaXplZCwgcmV0dXJuIHRoZSBiYXNlIHBvaW50ZXIuICAqLwotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBIOC8zMDAgcmVsb2NzLgotICAgV2Ugb25seSBjb21lIGhlcmUgZm9yIHBjcmVsIHN0dWZmIGFuZCByZXR1cm4gbm9ybWFsbHkgaWYgbm90IGFuIC1yIGxpbmsuCi0gICBXaGVuIGRvaW5nIC1yLCB3ZSBjYW4ndCBkbyBhbnkgYXJpdGhtZXRpYyBmb3IgdGhlIHBjcmVsIHN0dWZmLCBiZWNhdXNlCi0gICB0aGUgY29kZSBpbiByZWxvYy5jIGFzc3VtZXMgdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgdGFyZ2V0cyBvZgotICAgdGhlIHBjcmVsIGJyYW5jaGVzLiAgVGhpcyBpc24ndCBzbywgc2luY2UgdGhlIEg4LzMwMCBjYW4gZG8gcmVsYXhpbmcsIAotICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZ2FwIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGVub3VnaCB0bwotICAgY29udGFpbiB0aGUgb2Zmc2V0IHJlcXVpcmVkIGZvciB0aGUgYnJhbmNoLCBzbyB3ZSBoYXZlIHRvIHVzZSB0aGUgb25seQotICAgdGhlIGFkZGVuZCB1bnRpbCB0aGUgZmluYWwgbGluayAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGVjaWFsIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9SRUxCWVRFLCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICI4IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMV09SRCwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMTE9ORywgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUENSQllURSwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDgiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1BDUldPUkQsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQMTYiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1BDUkxPTkcsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQMzIiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX01PVjE2QjEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGFibGUgbW92LmI6MTYiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9NT1YxNkIyLCAwLCAxLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGVkIG1vdi5iOjE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QMSwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjE2L3BjcmVsIiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QMiwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicGNyZWNsLzE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QTDEsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIyNC9wY3JlbGwiLCBmYWxzZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9KTVBMMiwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicGM4LzI0IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfTU9WMjRCMSwgMCwgMSwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4YWJsZSBtb3YuYjoyNCIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX01PVjI0QjIsIDAsIDEsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4ZWQgbW92LmI6MjQiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotCi0gIC8qIEFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLiAgVGhpcyBjYXVzZXMgdGhlIGZ1bmN0aW9uJ3MgYWRkcmVzcwotICAgICB0byBiZSBhZGRlZCB0byB0aGUgZnVuY3Rpb24gdmVjdG9yIGluIGxvLW1lbSBhbmQgcHV0cyB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgZnVuY3Rpb24gdmVjdG9yJ3MgZW50cnkgaW4gdGhlIGpzciBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChSX01FTV9JTkRJUkVDVCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiOC9pbmRpcmVjdCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0KLSAgLyogSW50ZXJuYWwgcmVsb2MgZm9yIHJlbGF4aW5nLiAgVGhpcyBpcyBjcmVhdGVkIHdoZW4gYSAxNmJpdCBwYy1yZWxhdGl2ZQotICAgICBicmFuY2ggaXMgdHVybmVkIGludG8gYW4gOGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoUl9QQ1JXT1JEX0IsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhlZCBiQ0M6MTYiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX01PVkwxLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwZWNpYWwsICIzMi8yNCByZWxheGFibGUgbW92ZSIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgSE9XVE8gKFJfTU9WTDIsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIzMi8yNCByZWxheGVkIG1vdmUiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX0JDQ19JTlYsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1A4IGludmVydGVkIiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotCi0gIEhPV1RPIChSX0pNUF9ERUwsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRlbGV0ZWQganVtcCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLX07Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgXAotICB7IHgucl90eXBlID0gc2VsZWN0X3JlbG9jKGhvd3RvKTsgfQotCi0jZGVmaW5lIEJBRE1BRyh4KSAoSDgzMDBCQURNQUcoeCkgJiYgSDgzMDBIQkFETUFHKHgpICYmIEg4MzAwU0JBRE1BRyh4KSkKLSNkZWZpbmUgSDgzMDAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLQotc3RhdGljIGludAotc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlCi0gICAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1JFTEJZVEU6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUkVMV09SRDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9SRUxMT05HOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUkJZVEU6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JMT05HOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVjE2QjE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVAxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUDI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QTDE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUEwyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YyNEIxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YyNEIyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NRU1fSU5ESVJFQ1Q6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUldPUkRfQjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WTDE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVkwyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9CQ0NfSU5WOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVBfREVMOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxOTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0KLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLSAgLyogIHJlbGVudC0+c2VjdGlvbiA9IDA7Ki8KLX0KLQotc3RhdGljIGJvb2xlYW4KLWg4MzAwX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogU2VhcmNoIGFsbCB0aGUgc3ltYm9scyBmb3Igb25lIGluIElOUFVUX1NFQ1RJT04gd2l0aAotICAgICBhZGRyZXNzIEFERFJFU1MuICAqLwotICB3aGlsZSAoKnMpIAotICAgIHsKLSAgICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24KLQkgICYmIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgKyBwLT52YWx1ZSkgPT0gYWRkcmVzcykKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIHMrKzsKLSAgICB9ICAgIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogSWYgUkVMT0MgcmVwcmVzZW50cyBhIHJlbGF4YWJsZSBpbnN0cnVjdGlvbi9yZWxvYywgY2hhbmdlIGl0IGludG8KLSAgIHRoZSByZWxheGVkIHJlbG9jLCBub3RpZnkgdGhlIGxpbmtlciB0aGF0IHN5bWJvbCBhZGRyZXNzZXMKLSAgIGhhdmUgY2hhbmdlZCAoYmZkX3BlcmZvcm1fc2xpcCkgYW5kIHJldHVybiBob3cgbXVjaCB0aGUgY3VycmVudAotICAgc2VjdGlvbiBoYXMgc2hydW5rIGJ5LgotCi0gICBGSVhNRTogTXVjaCBvZiB0aGlzIGNvZGUgaGFzIGtub3dsZWRnZSBvZiB0aGUgb3JkZXJpbmcgb2YgZW50cmllcwotICAgaW4gdGhlIGhvd3RvIHRhYmxlLiAgVGhpcyBuZWVkcyB0byBiZSBmaXhlZC4gICovCi0KLXN0YXRpYyBpbnQKLWg4MzAwX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgdW5zaWduZWQgaW50IHNocmluazsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsgIAotICBiZmRfdm1hIGRvdDsKLSAgYmZkX3ZtYSBnYXA7Ci0gIHN0YXRpYyBhc2VjdGlvbiAqbGFzdF9pbnB1dF9zZWN0aW9uID0gTlVMTDsKLSAgc3RhdGljIGFyZWxlbnQgKmxhc3RfcmVsb2MgPSBOVUxMOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyB0byBiZSByZWxvY2F0ZWQgd2lsbCBoYXZlIG1vdmVkIGJhY2sgYnkgCi0gICAgIHRoZSBzaXplIG9mIHRoZSBzaHJpbmsgLSBidXQgd2UgZG9uJ3QgY2hhbmdlIHJlbG9jLT5hZGRyZXNzIGhlcmUsCi0gICAgIHNpbmNlIHdlIG5lZWQgaXQgdG8ga25vdyB3aGVyZSB0aGUgcmVsb2NhdGlvbiBsaXZlcyBpbiB0aGUgc291cmNlCi0gICAgIHVuY29va2VkIHNlY3Rpb24uICAqLwotICBiZmRfdm1hIGFkZHJlc3MgPSByZWxvYy0+YWRkcmVzcyAtIHNocmluazsKLQotICBpZiAoaW5wdXRfc2VjdGlvbiAhPSBsYXN0X2lucHV0X3NlY3Rpb24pCi0gICAgbGFzdF9yZWxvYyA9IE5VTEw7Ci0KLSAgLyogT25seSBleGFtaW5lIHRoZSByZWxvY3Mgd2hpY2ggbWlnaHQgYmUgcmVsYXhhYmxlLiAgKi8KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgeyAgICAgCi0KLSAgICAvKiBUaGlzIGlzIHRoZSAxNi8yNCBiaXQgYWJzb2x1dGUgYnJhbmNoIHdoaWNoIGNvdWxkIGJlY29tZSBhbiA4IGJpdAotICAgICAgIHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCi0gICAgY2FzZSBSX0pNUDE6Ci0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgYWRkcmVzcyk7Ci0KLSAgICAgIC8qIEFkanVzdCBmb3IgUl9KTVAxIHZzIFJfSk1QTDEuICAqLwotICAgICAgZG90ICs9IChyZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9KTVAxID8gMSA6IDIpOwotCi0gICAgICAvKiBDb21wdXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgaW5zbiB0byB0aGUgYnJhbmNoIHRhcmdldC4gICovCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLSAgCi0gICAgICAvKiBJZiB0aGUgZGlzdGFuY2UgaXMgd2l0aGluIC0xMjguLisxMjggaW5jbHVzaXZlLCB0aGVuIHdlIGNhbiByZWxheAotCSB0aGlzIGp1bXAuICArMTI4IGlzIHZhbGlkIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBtb3ZlIHR3byBieXRlcwotCSBjbG9zZXIgaWYgd2UgZG8gcmVsYXggdGhpcyBicmFuY2guICAqLwotICAgICAgaWYgKChpbnQpZ2FwID49IC0xMjggJiYgKGludClnYXAgPD0gMTI4ICkKLQl7IAotCi0JICAvKiBJdCdzIHBvc3NpYmxlIHdlIG1heSBiZSBhYmxlIHRvIGVsaW1pbmF0ZSB0aGlzIGJyYW5jaCBlbnRpcmVseTsKLQkgICAgIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGJyYW5jaCBhcm91bmQgdGhpcyBpbnN0cnVjdGlvbiwKLQkgICAgIGFuZCB0aGVyZSdzIG5vIGxhYmVsIGF0IHRoaXMgaW5zdHJ1Y3Rpb24sIHRoZW4gd2UgY2FuIHJldmVyc2UKLQkgICAgIHRoZSBjb25kaXRpb24gb24gdGhlIHByZXZpb3VzIGJyYW5jaCBhbmQgZWxpbWluYXRlIHRoaXMganVtcC4KLQotCSAgICAgICBvcmlnaW5hbDoJCQluZXc6Ci0JCSBiQ0MgbGFiMQkJCWJDQycgbGFiMgotCQkgam1wIGxhYjIKLQkJbGFiMToJCQkJbGFiMToKLQkKLQkgICAgIFRoaXMgc2F2ZXMgNCBieXRlcyBpbnN0ZWFkIG9mIHR3bywgYW5kIHNob3VsZCBiZSByZWxhdGl2ZWx5Ci0JICAgICBjb21tb24uICAqLwotCi0JICBpZiAoZ2FwIDw9IDEyNgotCSAgICAgICYmIGxhc3RfcmVsb2MKLQkgICAgICAmJiBsYXN0X3JlbG9jLT5ob3d0by0+dHlwZSA9PSBSX1BDUkJZVEUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIGxhc3RfdmFsdWU7Ci0JICAgICAgbGFzdF92YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChsYXN0X3JlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbikgKyAxOwotCi0JICAgICAgaWYgKGxhc3RfdmFsdWUgPT0gZG90ICsgMgotCQkgICYmIGxhc3RfcmVsb2MtPmFkZHJlc3MgKyAxID09IHJlbG9jLT5hZGRyZXNzCi0JCSAgJiYgISBoODMwMF9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBpbnB1dF9zZWN0aW9uLCBkb3QgLSAyKSkKLQkJewotCQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTk7Ci0JCSAgbGFzdF9yZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE4OwotCQkgIGxhc3RfcmVsb2MtPnN5bV9wdHJfcHRyID0gcmVsb2MtPnN5bV9wdHJfcHRyOwotCQkgIGxhc3RfcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRlbmQ7Ci0JCSAgc2hyaW5rICs9IDQ7Ci0JCSAgYmZkX3BlcmZvcm1fc2xpcCAoYWJmZCwgNCwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogVGhpcyBpcyB0aGUgMTYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaCB3aGljaCBjb3VsZCBiZWNvbWUgYW4gOCBiaXQKLSAgICAgICBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9QQ1JXT1JEOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2gsIGFkZCBvbmUgdG8gdGhlIHZhbHVlCi0gICAgICAgICBiZWNhdXNlIHRoZSBhZGRlbmQgZmllbGQgaW4gUENyZWwganVtcHMgaXMgb2ZmIGJ5IC0xLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikgKyAxOwotCQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIGlmIHdlIHdlcmUgdG8gcmVsYXguICAqLwotICAgICAgZG90ID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3M7Ci0gIAotICAgICAgLyogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluc24gdG8gdGhlIGJyYW5jaCB0YXJnZXQuICAqLwotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIElmIHRoZSBkaXN0YW5jZSBpcyB3aXRoaW4gLTEyOC4uKzEyOCBpbmNsdXNpdmUsIHRoZW4gd2UgY2FuIHJlbGF4Ci0JIHRoaXMganVtcC4gICsxMjggaXMgdmFsaWQgc2luY2UgdGhlIHRhcmdldCB3aWxsIG1vdmUgdHdvIGJ5dGVzCi0JIGNsb3NlciBpZiB3ZSBkbyByZWxheCB0aGlzIGJyYW5jaC4gICovCi0gICAgICBpZiAoKGludClnYXAgPj0gLTEyOCAmJiAoaW50KWdhcCA8PSAxMjggKQotCXsgCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNTsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogVGhpcyBpcyBhIDE2IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92LmIgaW5zbiwgd2hpY2ggY2FuCi0gICAgICAgYmVjb21lIGFuIDggYml0IGFic29sdXRlIGFkZHJlc3MgaWYgaXQncyBpbiB0aGUgcmlnaHQgcmFuZ2UuICAqLwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhpcyBtb3YuYiBpbnNuLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFRoZSBhZGRyZXNzIGlzIGluIDB4ZmYwMC4uMHhmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDAgb3IKLQkgMHhmZmZmMDAuLjB4ZmZmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDBoLCB0aGVuIHdlIGNhbgotCSByZWxheCB0aGlzIG1vdi5iICAqLwotICAgICAgaWYgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwCi0JICAgJiYgdmFsdWUgPj0gMHhmZjAwCi0JICAgJiYgdmFsdWUgPD0gMHhmZmZmKQotCSAgfHwgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgICAgICB8fCBiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQkgICAgICAmJiB2YWx1ZSA+PSAweGZmZmYwMAotCSAgICAgICYmIHZhbHVlIDw9IDB4ZmZmZmZmKSkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2ltaWxhcmx5IGZvciBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92LmIuICBOb3RlIHRoYXQKLSAgICAgICBpZiB3ZSBjYW4ndCByZWxheCB0aGlzIGludG8gYW4gOCBiaXQgYWJzb2x1dGUsIHdlJ2xsIGZhbGwgdGhyb3VnaAotICAgICAgIGFuZCB0cnkgdG8gcmVsYXggaXQgaW50byBhIDE2Yml0IGFic29sdXRlLiAgKi8KLSAgICBjYXNlIFJfTU9WMjRCMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoaXMgbW92LmIgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBpcyBpbiAweGZmZmYwMC4uMHhmZmZmZmYgaW5jbHVzaXZlIG9uIHRoZSBoODMwMGgsCi0JIHRoZW4gd2UgY2FuIHJlbGF4IHRoaXMgbW92LmIgICovCi0gICAgICBpZiAoKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JICAgfHwgYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICAmJiB2YWx1ZSA+PSAweGZmZmYwMAotCSAgJiYgdmFsdWUgPD0gMHhmZmZmZmYpCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgZm91ciBieXRlcy4gICovCi0JICBzaHJpbmsgKz0gNDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgNCwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0KLQkgIC8qIERvbmUgd2l0aCB0aGlzIHJlbG9jLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogRkFMTFRIUk9VR0ggYW5kIHRyeSB0byB0dXJuIHRoZSAzMi8yNCBiaXQgcmVsb2MgaW50byBhIDE2IGJpdAotCSByZWxvYy4gICovCi0KLSAgICAvKiBUaGlzIGlzIGEgMjQvMzIgYml0IGFic29sdXRlIGFkZHJlc3MgaW4gYSBtb3YgaW5zbiwgd2hpY2ggY2FuCi0gICAgICAgYmVjb21lIGFuIDE2IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGlmIGl0J3MgaW4gdGhlIHJpZ2h0IHJhbmdlLiAgKi8KLSAgICBjYXNlIFJfTU9WTDE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGlzIG1vdiBpbnNuLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIElmIHRoaXMgYWRkcmVzcyBpcyBpbiAweDAwMDAuLjB4N2ZmZiBpbmNsdXNpdmUgb3IKLSAgICAgICAgIDB4ZmY4MDAwLi4weGZmZmZmZiBpbmNsdXNpdmUsIHRoZW4gaXQgY2FuIGJlIHJlbGF4ZWQuICAqLwotICAgICAgaWYgKHZhbHVlIDw9IDB4N2ZmZiB8fCB2YWx1ZSA+PSAweGZmODAwMCkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNzsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBObyBvdGhlciByZWxvYyB0eXBlcyByZXByZXNlbnQgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgIH0KLQotICBsYXN0X3JlbG9jID0gcmVsb2M7Ci0gIGxhc3RfaW5wdXRfc2VjdGlvbiA9IGlucHV0X3NlY3Rpb247Ci0gIHJldHVybiBzaHJpbms7Ci19Ci0KLQotLyogSGFuZGxlIHJlbG9jYXRpb25zIGZvciB0aGUgSDgvMzAwLCBpbmNsdWRpbmcgcmVsb2NzIGZvciByZWxheGVkCi0gICBpbnN0cnVjdGlvbnMuCi0KLSAgIEZJWE1FOiBOb3QgYWxsIHJlbG9jYXRpb25zIGNoZWNrIGZvciBvdmVyZmxvdyEgICovCi0KLXN0YXRpYyB2b2lkCi1oODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9ICpzcmNfcHRyOwotICB1bnNpZ25lZCBpbnQgZHN0X2FkZHJlc3MgPSAqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGJmZF92bWEgZG90OwotICBpbnQgZ2FwLHRtcDsKLQotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7Ci0KLSAgICAvKiBHZW5lcmljIDhiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1BDUkJZVEU6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0IAotCSAgICAgKyBkc3RfYWRkcmVzcyAKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBBcHBseSB0aGUgcmVsb2NhdGlvbiBhbmQgdXBkYXRlIHRoZQotCSBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MrKzsKLSAgICAgIHNyY19hZGRyZXNzKys7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgLyogR2VuZXJpYyAxNmJpdCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQgCi0JICAgICArIGRzdF9hZGRyZXNzIAotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwID4gMzI3NjYgfHwgZ2FwIDwgLTMyNzY4KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIE9LLiAgQXBwbHkgdGhlIHJlbG9jYXRpb24gYW5kIHVwZGF0ZSB0aGUKLQkgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSAyOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMjsKLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBHZW5lcmljIDhiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1JFTEJZVEU6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8PSAweGZmCi0JICB8fCAodmFsdWUgPj0gMHgwMDAwZmYwMCAmJiB2YWx1ZSA8PSAweDAwMDBmZmZmKQotICAJICB8fCAodmFsdWUgPj0gMHgwMGZmZmYwMCAmJiB2YWx1ZSA8PSAweDAwZmZmZmZmKQotCSAgfHwgKHZhbHVlID49IDB4ZmZmZmZmMDAgJiYgdmFsdWUgPD0gMHhmZmZmZmZmZikpCi0JewotCSAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEFwcGx5IHRoZSByZWxvY2F0aW9uIGFuZCB1cGRhdGUgdGhlCi0JICAgICBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLQkgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCSAgZHN0X2FkZHJlc3MgKz0gMTsKLQkgIHNyY19hZGRyZXNzICs9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBBbGwgZG9uZS4gICovCi0gICAgICBicmVhazsKLQotICAgIC8qIFZhcmlvdXMgc2ltcGxlIDE2Yml0IGFic29sdXRlIHJlbG9jYXRpb25zLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICBjYXNlIFJfSk1QMToKLSAgICBjYXNlIFJfUkVMV09SRDoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDI7Ci0gICAgICBzcmNfYWRkcmVzcyArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBWYXJpb3VzIHNpbXBsZSAyNC8zMmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBSX01PVjI0QjE6Ci0gICAgY2FzZSBSX01PVkwxOgotICAgIGNhc2UgUl9SRUxMT05HOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDQ7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBbm90aGVyIDI0LzMyYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICB2YWx1ZSA9ICgodmFsdWUgJiAweDAwZmZmZmZmKQotCSAgICAgICB8IChiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgc3JjX2FkZHJlc3MpICYgMHhmZjAwMDAwMCkpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSA0OwotICAgICAgc3JjX2FkZHJlc3MgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYm9sdXRlIHJlbG9jYXRpb24gdGhhdCB3YXMgZm9ybWVybGx5IGEgMjQvMzJiaXQKLSAgICAgICBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfTU9WTDI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8IDB4ODAwMCB8fCB2YWx1ZSA+IDB4ZmY4MDAwKQotCXsKLQkgIC8qIEluc2VydCB0aGUgMTZiaXQgdmFsdWUgaW50byB0aGUgcHJvcGVyIGxvY2F0aW9uLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0JICAvKiBGaXggdGhlIG9wY29kZS4gIEZvciBhbGwgdGhlIG1vdmUgaW5zbnMsIHdlIHNpbXBseQotCSAgICAgbmVlZCB0byB0dXJuIG9mZiBiaXQgMHgyMCBpbiB0aGUgcHJldmlvdXMgYnl0ZS4gICovCi0gICAgICAgICAgZGF0YVtkc3RfYWRkcmVzcyAtIDFdICY9IH4weDIwOwotCSAgZHN0X2FkZHJlc3MgKz0gMjsKLQkgIHNyY19hZGRyZXNzICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYnNvbHV0ZSBicmFuY2ggdGhhdCBpcyBub3cgYW4gOC1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfSk1QMjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCSAgICAgKyBkc3RfYWRkcmVzcwotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIE5vdyBmaXggdGhlIGluc3RydWN0aW9uIGl0c2VsZi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbZHN0X2FkZHJlc3MgLSAxXSkKLQl7Ci0JY2FzZSAweDVlOgotCSAgLyoganNyIC0+IGJzciAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDU1LCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg1YToKLQkgIC8qIGptcCAtPmJyYSAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDQwLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSA4Yml0IHZhbHVlLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0gICAgICBkc3RfYWRkcmVzcyArPSAxOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMzsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0aGF0IGlzIG5vdyBhbiA4LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9QQ1JXT1JEX0I6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCSAgICAgKyBkc3RfYWRkcmVzcwotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgLSAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIE5vdyBmaXggdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoZGF0YVtkc3RfYWRkcmVzcyAtIDJdKQotCXsKLQljYXNlIDB4NTg6Ci0JICAvKiBiQ0M6MTYgLT4gYkNDOjggKi8KLQkgIC8qIEdldCB0aGUgY29uZGl0aW9uIGNvZGUgZnJvbSB0aGUgb3JpZ2luYWwgaW5zbi4gICovCi0JICB0bXAgPSBkYXRhW2RzdF9hZGRyZXNzIC0gMV07Ci0JICB0bXAgJj0gMHhmMDsKLQkgIHRtcCA+Pj0gNDsKLQotCSAgLyogTm93IG9yIGluIHRoZSBoaWdoIG5pYmJsZSBvZiB0aGUgb3Bjb2RlLiAgKi8KLQkgIHRtcCB8PSAweDQwOwotCi0JICAvKiBXcml0ZSBpdC4gICovCi0JICBiZmRfcHV0XzggKGFiZmQsIHRtcCwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMik7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLQkvKiBPdXRwdXQgdGhlIHRhcmdldC4gICovCi0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpOwotCi0JLyogV2UgZG9uJ3QgYWR2YW5jZSBkc3RfYWRkcmVzcyAtLSB0aGUgOGJpdCByZWxvYyBpcyBhcHBsaWVkIGF0Ci0JICAgZHN0X2FkZHJlc3MgLSAxLCBzbyB0aGUgbmV4dCBpbnNuIHNob3VsZCBiZWdpbiBhdCBkc3RfYWRkcmVzcy4gICovCi0Jc3JjX2FkZHJlc3MgKz0gMjsKLQotCWJyZWFrOwotICAgICAgCi0gICAgLyogU2ltaWxhcmx5IGZvciBhIDI0Yml0IGFic29sdXRlIHRoYXQgaXMgbm93IDggYml0cy4gICovCi0gICAgY2FzZSBSX0pNUEwyOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMik7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBGaXggdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoZGF0YVtzcmNfYWRkcmVzc10pCi0JewotCWNhc2UgMHg1ZToKLQkgIC8qIGpzciAtPiBic3IgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg1YToKLQkgIC8qIGptcCAtPmJyYSAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDQwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyArIDEpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYnNvbHV0ZSBtb3YuYiB0aGF0IGlzIG5vdyBhbiA4Yml0IGFic29sdXRlIG1vdi5iLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSAhPSAweDZhKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGaXggdXAgdGhlIG9wY29kZS4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYwKQotCXsKLQljYXNlIDB4MDA6Ci0JICBkYXRhW2RzdF9hZGRyZXNzIC0gMl0gPSAoZGF0YVtzcmNfYWRkcmVzcy0xXSAmIDB4ZikgfCAweDIwOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgzMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNGJpdCBtb3YuYiAgKi8KLSAgICBjYXNlIFJfTU9WMjRCMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSAhPSAweDZhKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGaXggdXAgdGhlIG9wY29kZS4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYwKQotCXsKLQljYXNlIDB4MjA6Ci0JICBkYXRhW2RzdF9hZGRyZXNzIC0gMl0gPSAoZGF0YVtzcmNfYWRkcmVzcy0xXSAmIDB4ZikgfCAweDIwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGEwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgzMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9CQ0NfSU5WOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICAgICsgZHN0X2FkZHJlc3MgCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkgKyAxOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChnYXAgPCAtMTI4IHx8IGdhcCA+IDEyNikKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEZpeCB0aGUgY29uZGl0aW9uIGluIHRoZSBpbnN0cnVjdGlvbiwgYXBwbHkKLQkgdGhlIHJlbG9jYXRpb24sIGFuZCB1cGRhdGUgdGhlIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfZ2V0XzggKGFiZmQsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpIF4gMSwKLQkJIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcysrOwotICAgICAgc3JjX2FkZHJlc3MrKzsKLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSk1QX0RFTDoKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFuIDhiaXQgbWVtb3J5IGluZGlyZWN0IGluc3RydWN0aW9uIChqbXAvanNyKS4KLQotICAgICAgIFRoZXJlJ3Mgc2V2ZXJhbCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUgdG8gaGFuZGxlCi0gICAgICAgdGhpcyByZWxvY2F0aW9uLgotCi0gICAgICAgSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGFic29sdXRlIHN5bWJvbCwgdGhlbgotICAgICAgIHdlIHNob3VsZCBoYW5kbGUgaXQganVzdCBSX1JFTEJZVEUuICBMaWtld2lzZSBpZiBpdCdzCi0gICAgICAgZm9yIGEgc3ltYm9sIHdpdGggYSB2YWx1ZSBnZSAwIGFuZCBsZSAweGZmLgotCi0gICAgICAgT3RoZXJ3aXNlIGl0J3MgYSBqdW1wL2NhbGwgdGhyb3VnaCB0aGUgZnVuY3Rpb24gdmVjdG9yLAotICAgICAgIGFuZCB0aGUgbGlua2VyIGlzIGV4cGVjdGVkIHRvIHNldCB1cCB0aGUgZnVuY3Rpb24gdmVjdG9yCi0gICAgICAgYW5kIHB1dCB0aGUgcmlnaHQgdmFsdWUgaW50byB0aGUganVtcC9jYWxsIGluc3RydWN0aW9uLiAgKi8KLSAgICBjYXNlIFJfTUVNX0lORElSRUNUOgotICAgICAgewotCS8qIFdlIG5lZWQgdG8gZmluZCB0aGUgc3ltYm9sIHNvIHdlIGNhbiBkZXRlcm1pbmUgaXQncwotCSAgIGFkZHJlc3MgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICovCi0JYXN5bWJvbCAqc3ltYm9sOwotCWJmZF92bWEgdmFsdWU7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICpoOwotCWFzZWN0aW9uICp2ZWN0b3JzX3NlYyA9IGg4MzAwX2NvZmZfaGFzaF90YWJsZSAobGlua19pbmZvKS0+dmVjdG9yc19zZWM7Ci0KLQkvKiBGaXJzdCBzZWUgaWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGFic29sdXRlIHN5bWJvbAotCSAgIG9yIGFnYWluc3QgYSBzeW1ib2wgd2l0aCBhIG5vbm5lZ2F0aXZlIHZhbHVlIDw9IDB4ZmYuICAqLwotCXN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQl2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQlpZiAoc3ltYm9sID09IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbAotCSAgICB8fCB2YWx1ZSA8PSAweGZmKQotCSAgewotCSAgICAvKiBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGluIGEgbWFubmVyIHZlcnkgc2ltaWxhciB0bwotCSAgICAgICBSX1JFTEJZVEVTLiAgIElmIHRoZSB2YWx1ZSBpcyBpbiByYW5nZSwgdGhlbiBqdXN0IHNsYW0KLQkgICAgICAgdGhlIHZhbHVlIGludG8gdGhlIHJpZ2h0IGxvY2F0aW9uLiAgRWxzZSB0cmlnZ2VyIGEKLQkgICAgICAgcmVsb2Mgb3ZlcmZsb3cgY2FsbGJhY2suICAqLwotCSAgICBpZiAodmFsdWUgPD0gMHhmZikKLQkgICAgICB7Ci0JCWJmZF9wdXRfOCAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCWRzdF9hZGRyZXNzICs9IDE7Ci0JCXNyY19hZGRyZXNzICs9IDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJCXJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCQlpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCQkgIGFib3J0ICgpOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBUaGlzIGlzIGEganVtcC9jYWxsIHRocm91Z2ggYSBmdW5jdGlvbiB2ZWN0b3IsIGFuZCB3ZSdyZQotCSAgIGV4cGVjdGVkIHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24gdmVjdG9yIG91cnNlbHZlcy4gCi0KLQkgICBGaXJzdCBsb29rIHVwIHRoaXMgc3ltYm9sIGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSAtLSB3ZSBuZWVkCi0JICAgdGhlIGRlcml2ZWQgbGlua2VyIHN5bWJvbCB3aGljaCBob2xkcyB0aGlzIHN5bWJvbCdzIGluZGV4Ci0JICAgaW4gdGhlIGZ1bmN0aW9uIHZlY3Rvci4gICovCi0JbmFtZSA9IHN5bWJvbC0+bmFtZTsKLQlpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkKLQkgIHsKLQkgICAgY2hhciAqbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgOSk7Ci0JICAgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0cmNweSAobmV3X25hbWUsIG5hbWUpOwotCSAgICBzcHJpbnRmIChuZXdfbmFtZSArIHN0cmxlbiAobmFtZSksICJfJTA4eCIsCi0JCSAgICAgKGludClzeW1ib2wtPnNlY3Rpb24pOwotCSAgICBuYW1lID0gbmV3X25hbWU7Ci0JICB9Ci0KLQloID0gZnVuY3ZlY19oYXNoX2xvb2t1cCAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChsaW5rX2luZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLQkvKiBUaGlzIHNob3VsZG4ndCBldmVyIGhhcHBlbi4gIElmIGl0IGRvZXMgdGhhdCBtZWFucyB3ZSd2ZSBnb3QKLQkgICBkYXRhIGNvcnJ1cHRpb24gb2Ygc29tZSBraW5kLiAgQWJvcnRpbmcgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUKLQkgICB0aGluayB0byBkbyBoZXJlLiAgKi8KLQlpZiAoaCA9PSBOVUxMIHx8IHZlY3RvcnNfc2VjID09IE5VTEwpCi0JICBhYm9ydCAoKTsKLQotCS8qIFBsYWNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiB2ZWN0b3IgZW50cnkgaW50byB0aGUKLQkgICByZWxvYydzIGFkZHJlc3MuICAqLwotCWJmZF9wdXRfOCAoYWJmZCwKLQkJICAgdmVjdG9yc19zZWMtPm91dHB1dF9vZmZzZXQgKyBoLT5vZmZzZXQsCi0JCSAgIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0KLQlkc3RfYWRkcmVzcysrOwotCXNyY19hZGRyZXNzKys7Ci0KLQkvKiBOb3cgY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaXRzZWxmLiAgKi8KLQlpZiAoYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDApCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsCi0JCQkJCQkgIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgIHZlY3RvcnNfc2VjLT5jb250ZW50cyArIGgtPm9mZnNldCk7Ci0JZWxzZSBpZiAoYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDBoCi0JCSB8fCBiZmRfZ2V0X21hY2ggKGlucHV0X3NlY3Rpb24tPm93bmVyKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICBiZmRfcHV0XzMyIChhYmZkLAotCQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsCi0JCQkJCQkgIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgIHZlY3RvcnNfc2VjLT5jb250ZW50cyArIGgtPm9mZnNldCk7Ci0JZWxzZQotCSAgYWJvcnQgKCk7Ci0KLQkvKiBHcm9zcy4gIFdlJ3ZlIGFscmVhZHkgd3JpdHRlbiB0aGUgY29udGVudHMgb2YgdGhlIHZlY3RvciBzZWN0aW9uCi0JICAgYmVmb3JlIHdlIGdldCBoZXJlLi4uICBTbyB3ZSB3cml0ZSBpdCBhZ2FpbiB3aXRoIHRoZSBuZXcgZGF0YS4gICovCi0JYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzICh2ZWN0b3JzX3NlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCSAgdmVjdG9yc19zZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgdmVjdG9yc19zZWMtPmNvbnRlbnRzLAotCQkJCSAgdmVjdG9yc19zZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICB2ZWN0b3JzX3NlYy0+X3Jhd19zaXplKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gICpzcmNfcHRyID0gc3JjX2FkZHJlc3M7Ci0gICpkc3RfcHRyID0gZHN0X2FkZHJlc3M7Ci19Ci0KLQotLyogUm91dGluZSBmb3IgdGhlIGg4MzAwIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgdGhlIHNwZWNpYWwgUl9NRU1fSU5ESVJFQ1QKLSAgIHJlbG9jcyBvbiB0aGUgaDgzMDAuICBJdCdzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGEgdmVjdG9ycwotICAgc2VjdGlvbiBhbmQgYXR0YWNoaW5nIGl0IHRvIGFuIGlucHV0IGJmZCBhcyB3ZWxsIGFzIHNpemluZwotICAgdGhlIHZlY3RvcnMgc2VjdGlvbi4gIEl0IGFsc28gY3JlYXRlcyBvdXIgdmVjdG9ycyBoYXNoIHRhYmxlLgotCi0gICBJdCB1c2VzIHRoZSBnZW5lcmljIGxpbmtlciByb3V0aW5lcyB0byBhY3R1YWxseSBhZGQgdGhlIHN5bWJvbHMuCi0gICBmcm9tIHRoaXMgQkZEIHRvIHRoZSBiZmQgbGlua2VyIGhhc2ggdGFibGUuICBJdCBtYXkgYWRkIGEgZmV3Ci0gICBzZWxlY3RlZCBzdGF0aWMgc3ltYm9scyB0byB0aGUgYmZkIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKmZ1bmN2ZWNfaGFzaF90YWJsZTsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGNyZWF0ZWQgYSB2ZWN0b3JzIHNlY3Rpb24sIGRvIHNvIG5vdy4gICovCi0gIGlmICghaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYXJlIHNldCwgaW5jbHVkaW5nIFNFQ19JTl9NRU1PUlkuICAqLwotICAgICAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19SRUFET05MWSk7Ci0gICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsCi0JCQkJCQkJCSAgICAiLnZlY3RvcnMiKTsKLQotICAgICAgLyogSWYgdGhlIHNlY3Rpb24gd2Fzbid0IGNyZWF0ZWQsIG9yIHdlIGNvdWxkbid0IHNldCB0aGUgZmxhZ3MsCi0JIHF1aXQgcXVpY2tseSBub3csIHJhdGhlciB0aGFuIGRpZWluZyBhIHBhaW5mdWwgZGVhdGggbGF0ZXIuICAqLwotICAgICAgaWYgKCEgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZShpbmZvKS0+dmVjdG9yc19zZWMsCi0JCQkJICAgICAgZmxhZ3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWxzbyBjcmVhdGUgdGhlIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGZ1bmN2ZWNfaGFzaF90YWJsZSA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqKQotCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlKSkpOwotCi0gICAgICBpZiAoIWZ1bmN2ZWNfaGFzaF90YWJsZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFuZCBpbml0aWFsaXplIHRoZSBmdW5jdmVjIGhhc2ggdGFibGUuICAqLwotICAgICAgaWYgKCFmdW5jdmVjX2hhc2hfdGFibGVfaW5pdCAoZnVuY3ZlY19oYXNoX3RhYmxlLCBhYmZkLAotCQkJCSAgICBmdW5jdmVjX2hhc2hfbmV3ZnVuYykpCi0JewotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIGZ1bmN2ZWNfaGFzaF90YWJsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdG9yZSBhd2F5IGEgcG9pbnRlciB0byB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZ1bmN2ZWNfaGFzaF90YWJsZSA9IGZ1bmN2ZWNfaGFzaF90YWJsZTsKLSAgICB9Ci0KLSAgLyogTG9hZCB1cCB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotICBmdW5jdmVjX2hhc2hfdGFibGUgPSBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGU7Ci0KLSAgLyogQWRkIHRoZSBzeW1ib2xzIHVzaW5nIHRoZSBnZW5lcmljIGNvZGUuICAqLwotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0KLSAgLyogTm93IHNjYW4gdGhlIHJlbG9jcyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGlzIGJmZDsgY3JlYXRlCi0gICAgIGFkZGl0aW9uYWwgc3BhY2UgaW4gdGhlIC52ZWN0b3JzIHNlY3Rpb24gYXMgbmVlZGVkLiAgKi8KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgbG9uZyByZWxvY19zaXplLCByZWxvY19jb3VudCwgaTsKLSAgICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICAgYXJlbGVudCAqKnJlbG9jczsKLQotICAgICAgLyogU3VjayBpbiB0aGUgcmVsb2NzLCBzeW1ib2xzICYgY2Fub25pY2FsaXplIHRoZW0uICAqLwotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAocmVsb2Nfc2l6ZSA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxvY3MgPSAoYXJlbGVudCAqKiliZmRfbWFsbG9jICgoc2l6ZV90KXJlbG9jX3NpemUpOwotICAgICAgaWYgKCFyZWxvY3MpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgc3ltYm9scyBzaG91bGQgaGF2ZSBiZWVuIHJlYWQgaW4gYnkgX2JmZF9nZW5lcmljIGxpbmtfYWRkX3N5bWJvbHMKLQkgY2FsbCBhYm92ZWMsIHNvIHdlIGNhbiBjaGVhdCBhbmQgdXNlIHRoZSBwb2ludGVyIHRvIHRoZW0gdGhhdCB3YXMKLQkgc2F2ZWQgaW4gdGhlIGFib3ZlIGNhbGwuICAqLwotICAgICAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKGFiZmQpOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbG9jcywgc3ltYm9scyk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPD0gMCkKLQl7Ci0JICBmcmVlIChyZWxvY3MpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOb3cgd2FsayB0aHJvdWdoIGFsbCB0aGUgcmVsb2NhdGlvbnMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnJlbG9jID0gcmVsb2NzW2ldOwotCSAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgLyogV2UndmUgZ290IGFuIGluZGlyZWN0IHJlbG9jLiAgU2VlIGlmIHdlIG5lZWQgdG8gYWRkIGl0Ci0JICAgICB0byB0aGUgZnVuY3Rpb24gdmVjdG9yIHRhYmxlLiAgIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUKLQkgICAgIHRvIGFkZCBhIG5ldyBlbnRyeSBmb3IgZWFjaCB1bmlxdWUgc3ltYm9sIHJlZmVyZW5jZWQKLQkgICAgIGJ5IGFuIFJfTUVNX0lORElSRUNUIHJlbG9jYXRpb24gZXhjZXB0IGZvciBhIHJlbG9jCi0JICAgICBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gICovCi0JICBpZiAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfTUVNX0lORElSRUNUCi0JICAgICAgJiYgc3ltYm9sICE9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCkKLQotCSAgICB7Ci0JICAgICAgc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIG5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JCXsKLQkJICBjaGFyICpuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyA5KTsKLQotCQkgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICBzdHJjcHkgKG5ld19uYW1lLCBuYW1lKTsKLQkJICBzcHJpbnRmIChuZXdfbmFtZSArIHN0cmxlbiAobmFtZSksICJfJTA4eCIsCi0JCQkgICAoaW50KXN5bWJvbC0+c2VjdGlvbik7Ci0JCSAgbmFtZSA9IG5ld19uYW1lOwotCQl9Ci0KLQkgICAgICAvKiBMb29rIHRoaXMgc3ltYm9sIHVwIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0JICAgICAgaCA9IGZ1bmN2ZWNfaGFzaF9sb29rdXAgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZ1bmN2ZWNfaGFzaF90YWJsZSwKLQkJCQkgICAgICAgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCi0JICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZSwgYWRkCi0JCSBpdCBhbmQgYnVtcCB1cCB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZS4gICovCi0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIGggPSBmdW5jdmVjX2hhc2hfbG9va3VwIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJCSAgIG5hbWUsIHRydWUsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIEJ1bXAgdGhlIHNpemUgb2YgdGhlIHZlY3RvcnMgc2VjdGlvbi4gIEVhY2ggdmVjdG9yCi0JCSAgICAgdGFrZXMgMiBieXRlcyBvbiB0aGUgaDgzMDAgYW5kIDQgYnl0ZXMgb24gdGhlIGg4MzAwaC4gICovCi0JCSAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDApCi0JCSAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplICs9IDI7Ci0JCSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkJCSAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCQkgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSArPSA0OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgcmVsb2NhdGlvbnMsIHJlbGVhc2UgdGhlbS4gICovCi0gICAgICBmcmVlIChyZWxvY3MpOwotICAgIH0KLQotICAvKiBOb3cgYWN0dWFsbHkgYWxsb2NhdGUgc29tZSBzcGFjZSBmb3IgdGhlIGZ1bmN0aW9uIHZlY3Rvci4gIEl0J3MKLSAgICAgd2FzdGVmdWwgdG8gZG8gdGhpcyBtb3JlIHRoYW4gb25jZSwgYnV0IHRoaXMgaXMgZWFzaWVyLiAgKi8KLSAgaWYgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5fcmF3X3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBGcmVlIHRoZSBvbGQgY29udGVudHMuICAqLwotICAgICAgaWYgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5jb250ZW50cykKLQlmcmVlIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+Y29udGVudHMpOwotCi0gICAgICAvKiBBbGxvY2F0ZSBuZXcgY29udGVudHMuICAqLwotICAgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPmNvbnRlbnRzCi0JPSBiZmRfbWFsbG9jIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMKLSNkZWZpbmUgY29mZl9yZWxvYzE2X2VzdGltYXRlIGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGg4MzAwY29mZl92ZWMsICJjb2ZmLWg4MzAwIiwgQkZEX0lTX1JFTEFYQUJMRSwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaDg1MDAuYyBiL2JmZC9jb2ZmLWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWVhYTUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtaDg1MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvNTAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi9oODUwMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTggPQotSE9XVE8gKFJfSDg1MDBfSU1NOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMTYgPQotSE9XVE8gKFJfSDg1MDBfSU1NMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMjQgPQotSE9XVE8gKFJfSDg1MDBfSU1NMjQsIDAsIDEsIDI0LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMjQiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMzIgPQotSE9XVE8gKFJfSDg1MDBfSU1NMzIsIDAsIDEsIDMyLCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9oaWdoOCA9Ci1IT1dUTyAoUl9IODUwMF9ISUdIOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfbG93MTYgPQotSE9XVE8gKFJfSDg1MDBfTE9XMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9sb3cxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9wY3JlbDggPQotSE9XVE8gKFJfSDg1MDBfUENSRUw4LCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJyX3BjcmVsOCIsIHRydWUsIDAsIDAsIHRydWUpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfcGNyZWwxNiA9Ci1IT1dUTyAoUl9IODUwMF9QQ1JFTDE2LCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicl9wY3JlbDE2IiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaGlnaDE2ID0KLUhPV1RPIChSX0g4NTAwX0hJR0gxNiwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDE2IiwgdHJ1ZSwgMHgwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludCAKLWNvZmZfaDg1MDBfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX2g4NTAwX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBIODUwMEJBRE1BRyh4KQotI2RlZmluZSBIODUwMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKiBpbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU04OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTI0OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9wY3JlbDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX3BjcmVsMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9sb3cxNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkIHJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi1zdGF0aWMgdm9pZAotZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGJmZF9ieXRlICpkID0gZGF0YSsqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSDg1MDBfSU1NODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJIGQpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgPj4gMTYpLAotCQkgZCApOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSU1NMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkICApOwotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkKTsKLQotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfSDg1MDBfSElHSDE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgID4+MTYpLAotCQkgIGQpOwotCi0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKLSAgICAgIHsKLQlpbnQgdiA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCWludCBvID0gYmZkX2dldF8zMihpbl9hYmZkLCBkYXRhKyAqZHN0X3B0ciAtMSk7Ci0JdiA9ICh2ICYgMHgwMGZmZmZmZikgfCAobyAmIDB4ZmYwMDAwMCk7Ci0JYmZkX3B1dF8zMiAoaW5fYWJmZCwgdiwgZGF0YSAgKyAqZHN0X3B0ciAtMSk7Ci0JKCpkc3RfcHRyKSArPTM7Ci0JKCpzcmNfcHRyKSs9Mzs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICB7Ci0JaW50IHYgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzMyIChpbl9hYmZkLCB2LCBkYXRhICArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpICs9NDsKLQkoKnNyY19wdHIpKz00OzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUw4OgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0Ci0JICArICpkc3RfcHRyCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOyAvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCA+IDEyOCB8fCBnYXAgPCAtMTI4KQotCSAgewotCSAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgICAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYmZkX3B1dF84IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSsrOwotCSgqc3JjX3B0cikrKzsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIHsKLQliZmRfdm1hIGRzdCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldAotCSAgKyAqZHN0X3B0cgotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsgLyogLTEgc2luY2Ugd2VyZSBpbiB0aGUgb2RkIGJ5dGUgb2YgdGhlCi0JCQkJICAgIHdvcmQgYW5kIHRoZSBwYydzIGJlZW4gaW5jcmVtZW50ZWQgKi8KLQotCWlmIChnYXAgPiAzMjc2NyB8fCBnYXAgPCAtMzI3NjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzE2IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSs9MjsKLQkoKnNyY19wdHIpKz0yOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZXh0cmFfY2FzZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI3VuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGg4NTAwY29mZl92ZWMsICJjb2ZmLWg4NTAwIiwgMCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTM4Ni5jIGIvYmZkL2NvZmYtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDYzZTU4Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvaTM4Ni5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0dPMzJfRVhFCi0jaW5jbHVkZSAiY29mZi9nbzMyZXhlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2kzODZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqaTNjb2ZmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLS8qIEZvciBzb21lIHJlYXNvbiB3aGVuIHVzaW5nIGkzODYgQ09GRiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24gc3ltYm9sIGlzIHRoZSB2YWx1ZSBpdHNlbGYgcGx1cwotICAgYW55IGRlc2lyZWQgb2Zmc2V0LiAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl9pMzg2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotI2Vsc2UKLSAgICAgIC8qIEluIFBFIG1vZGUsIHdlIGRvIG5vdCBvZmZzZXQgdGhlIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogRklYTUU6IEhvdyBzaG91bGQgdGhpcyBjYXNlIGJlIGhhbmRsZWQ/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT50eXBlID09IFJfSU1BR0VCQVNFKQotICAgIGRpZmYgLT0gcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0jZW5kaWYKLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgICBpZiAoZGlmZiAhPSAwKQotICAgICAgewotCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLQlzd2l0Y2ggKGhvd3RvLT5zaXplKQotCSAgewotCSAgY2FzZSAwOgotCSAgICB7Ci0JICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE6Ci0JICAgIHsKLQkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgewotCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0KLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jCi0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gaW5fcmVsb2NfcCBQQVJBTVMgKChiZmQgKiwgcmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBSX0lNQUdFQkFTRTsKLX0KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9Ci17Ci0gIEVNUFRZX0hPV1RPICgwKSwKLSAgRU1QVFlfSE9XVE8gKDEpLAotICBFTVBUWV9IT1dUTyAoMiksCi0gIEVNUFRZX0hPV1RPICgzKSwKLSAgRU1QVFlfSE9XVE8gKDQpLAotICBFTVBUWV9IT1dUTyAoNSksCi0gIEhPV1RPIChSX0RJUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJkaXIzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIFBFIElNQUdFX1JFTF9JMzg2X0RJUjMyTkIgcmVsb2NhdGlvbiAoNykuCSovCi0gIEhPV1RPIChSX0lNQUdFQkFTRSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicnZhMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBFTVBUWV9IT1dUTyAoMDEwKSwKLSAgRU1QVFlfSE9XVE8gKDAxMSksCi0gIEVNUFRZX0hPV1RPICgwMTIpLAotICBFTVBUWV9IT1dUTyAoMDEzKSwKLSAgRU1QVFlfSE9XVE8gKDAxNCksCi0gIEVNUFRZX0hPV1RPICgwMTUpLAotICBFTVBUWV9IT1dUTyAoMDE2KSwKLSAgLyogQnl0ZSByZWxvY2F0aW9uICgwMTcpLiAgKi8KLSAgSE9XVE8gKFJfUkVMQllURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICI4IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIDE2LWJpdCB3b3JkIHJlbG9jYXRpb24gKDAyMCkuICAqLwotICBIT1dUTyAoUl9SRUxXT1JELAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICIxNiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiAzMi1iaXQgbG9uZ3dvcmQgcmVsb2NhdGlvbiAoMDIxKS4JKi8KLSAgSE9XVE8gKFJfUkVMTE9ORywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiMzIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQnl0ZSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uICgwMjIpLgkgKi8KLSAgSE9XVE8gKFJfUENSQllURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQOCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIDE2LWJpdCB3b3JkIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gKDAyMykuCSovCi0gIEhPV1RPIChSX1BDUldPUkQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkRJU1AxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIDMyLWJpdCBsb25nd29yZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uICgwMjQpLiAgKi8KLSAgSE9XVE8gKFJfUENSTE9ORywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBQQ1JFTE9GRlNFVCkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEkzODZCQURNQUcoeCkKLSNkZWZpbmUgSTM4NiAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkJCQkJCVwKLSAgKChjYWNoZV9wdHIpLT5ob3d0byA9CQkJCQkJCVwKLSAgICgoZHN0KS0+cl90eXBlIDwgc2l6ZW9mIChob3d0b190YWJsZSkgLyBzaXplb2YgKGhvd3RvX3RhYmxlWzBdKQlcCi0gICAgPyBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGUJCQkJCVwKLSAgICA6IE5VTEwpKQotCi0vKiBGb3IgMzg2IENPRkYgYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaXMgcGFydCBvZiBhIHNoYXJlZAotICAgbGlicmFyeS4gIE9uIHNvbWUgb3RoZXIgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIG5vcm1hbGx5Ci0gICBTVFlQX05PTE9BRC4gICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAotICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQotICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCi0gICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCi0gICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCi0gICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCi0gICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKLSAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAotICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCi0gICBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQotICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKLSAgewkJCQkJCQkJXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCi0JICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKLSAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCi0JJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCi0JICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKLSAgICBpZiAocHRyICYmIGhvd3RvX3RhYmxlW3JlbG9jLnJfdHlwZV0ucGNfcmVsYXRpdmUpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICBGb3Igbm9ybWFsIGkzODYgQ09GRiwgd2UKLSAgIGNhbiB1c2UgdGhlIGdlbmVyaWMgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgRm9yIFBFLCB3ZSBuZWVkIG91cgotICAgb3duIHJvdXRpbmUuICAqLwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0KLSNlbHNlIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBUaGUgUEUgcmVsb2NhdGUgc2VjdGlvbiByb3V0aW5lLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKLSAgIGFuZCB0aGUgcmVndWxhciByb3V0aW5lIGlzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBmb3IgYQotICAgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCSAgICAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JCQkJCSAgICAgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucyk7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogQ29udmVydCBhbiBydHlwZSB0byBob3d0byBmb3IgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2kzODZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIGlmIChyZWwtPnJfdHlwZSA+IHNpemVvZiAoaG93dG9fdGFibGUpIC8gc2l6ZW9mIChob3d0b190YWJsZVswXSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIC8qIENhbmNlbCBvdXQgY29kZSBpbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgKmFkZGVuZHAgPSAwOwotI2VuZGlmCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICAqYWRkZW5kcCArPSBzZWMtPnZtYTsKLQotICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtID09IDAgJiYgc3ltLT5uX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgc2VjdGlvbiBjb250ZW50cyBpbmNsdWRlIHRoZQotCSBzaXplIChzeW0tPm5fdmFsdWUpIGFzIGFuIGFkZGVuZC4gIFRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JIGZ1bmN0aW9uIHdpbGwgYmUgYWRkaW5nIGluIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgV2UKLQkgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBvcmRlciB0byBnZXQgdGhlCi0JIGNvcnJlY3QgcmVzdWx0LiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZQotCSBzZWVuIHNvbWUgZGF0YSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsb2NhdGlvbiBhZGRyZXNzLgotCSBJZiBJIGxpbmsgdHdvIHZlcnNpb25zIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkCi0JIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlCi0JIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgY2FzZSBpbiB3aGljaAotCSB0aGlzIHNlY3Rpb24gaGFzIGJlZW4gYnlwYXNzZWQgaGFzIGFkZHJlc3NlcyB3aGljaCBjb3JyZXNwb25kCi0JIHRvIHZhbHVlcyBJIGNhbiBmaW5kIGluIHRoZSBtYXAuICAqLwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotI2VuZGlmCi0gICAgfQotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IDQ7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIGlmIChyZWwtPnJfdHlwZSA9PSBSX0lNQUdFQkFTRSkKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSBwZV9kYXRhKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gaG93dG87Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1JWQToKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfSU1BR0VCQVNFOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9ESVIzMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUENSTE9ORzsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUkVMV09SRDsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUENSV09SRDsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9SRUxCWVRFOwotICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX1BDUkJZVEU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9GQUlMICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotCi0vKiBJZiBpMzg2IGdjYyB1c2VzIHVuZGVyc2NvcmVzIGZvciBzeW1ib2wgbmFtZXMsIHRoZW4gaXQgZG9lcyBub3QgdXNlCi0gICBhIGxlYWRpbmcgZG90IGZvciBsb2NhbCBsYWJlbHMsIHNvIGlmIFRBUkdFVF9VTkRFUlNDT1JFIGlzIGRlZmluZWQKLSAgIHdlIHRyZWF0IGFsbCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggTCBhcyBsb2NhbC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICdMJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2VuZGlmIC8qIFRBUkdFVF9VTkRFUlNDT1JFICovCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pM2NvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgLyogV2UgbmVlZCB0byBoYWNrIGJhZGx5IHRvIGhhbmRsZSBhIFBFIGltYWdlIGNvcnJlY3RseS4gIEluIFBFCi0gICAgIGltYWdlcyBjcmVhdGVkIGJ5IHRoZSBHTlUgbGlua2VyLCB0aGUgb2Zmc2V0IHRvIHRoZSBDT0ZGIGhlYWRlcgotICAgICBpcyBhbHdheXMgdGhlIHNpemUuICBIb3dldmVyLCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiBpbWFnZXMKLSAgICAgZ2VuZXJhdGVkIGJ5IG90aGVyIFBFIGxpbmtlcnMuICBUaGUgUEUgZm9ybWF0IHN0b3JlcyBhIGZvdXIgYnl0ZQotICAgICBvZmZzZXQgdG8gdGhlIFBFIHNpZ25hdHVyZSBqdXN0IGJlZm9yZSB0aGUgQ09GRiBoZWFkZXIgYXQKLSAgICAgbG9jYXRpb24gMHgzYyBvZiB0aGUgZmlsZS4gIFdlIHBpY2sgdXAgdGhhdCBvZmZzZXQsIHZlcmlmeSB0aGF0Ci0gICAgIHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlcmUsIGFuZCB0aGVuIHNldCBvdXJzZWx2ZXMgdXAgdG8gcmVhZCBpbgotICAgICB0aGUgQ09GRiBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX2J5dGUgZXh0X29mZnNldFs0XTsKLSAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgYmZkX2J5dGUgZXh0X3NpZ25hdHVyZVs0XTsKLSAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZTsKLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgMHgzYywgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoZXh0X29mZnNldCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBvZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9vZmZzZXQpOwotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkIChleHRfc2lnbmF0dXJlLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIHNpZ25hdHVyZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X3NpZ25hdHVyZSk7Ci0KLSAgICBpZiAoc2lnbmF0dXJlICE9IDB4NDU1MCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgIC8qIEhlcmUgaXMgdGhlIGhhY2suICBjb2ZmX29iamVjdF9wIHdhbnRzIHRvIHJlYWQgZmlsaHN6IGJ5dGVzIHRvCi0gICAgICAgcGljayB1cCB0aGUgQ09GRiBoZWFkZXIuICBXZSBhZGp1c3Qgc28gdGhhdCB0aGF0IHdpbGwgd29yay4gIDIwCi0gICAgICAgaXMgdGhlIHNpemUgb2YgdGhlIGkzODYgQ09GRiBmaWxlaGRyLiAgKi8KLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAoYmZkX3RlbGwgKGFiZmQpCi0JCSAgIC0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKQotCQkgICArIDIwKSwKLQkJICBTRUVLX1NFVCkKLQkhPSAwKQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci19Ci0KLWNvbnN0IGJmZF90YXJnZXQKLSNpZmRlZiBUQVJHRVRfU1lNCi0gIFRBUkdFVF9TWU0gPQotI2Vsc2UKLSAgaTM4NmNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImNvZmYtaTM4NiIsCQkJLyogbmFtZSAqLwotI2VuZGlmCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTCi0jZW5kaWYKLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotICBUQVJHRVRfVU5ERVJTQ09SRSwJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2Vsc2UKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZW5kaWYKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIGkzY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgaTNjb2ZmX29iamVjdF9wfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0KLSAgQ09GRl9TV0FQX1RBQkxFCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTg2MC5jIGIvYmZkL2NvZmYtaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjNiYjVmLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDg2MCBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDcmVhdGVkIG1vc3RseSBieSBzdWJzdGl0dXRpbmcgIjg2MCIgZm9yICIzODYiIGluIGNvZmYtaTM4Ni5jCi0gICBIYXJyeSBEb2xhbiA8ZG9sYW5Ac3NkLmludGVsLmNvbT4sIE9jdG9iZXIgMTk5NQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvaTg2MC5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTg2MF9yZWxvYyAKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBGb3Igc29tZSByZWFzb24gd2hlbiB1c2luZyBpODYwIENPRkYgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMKLSAgIGFueSBkZXNpcmVkIG9mZnNldC4gIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfaTg2MF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ltdmFsdWUgZGlmZjsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogV2UgYXJlIHJlbG9jYXRpbmcgYSBjb21tb24gc3ltYm9sLiAgVGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlCi0JIG9iamVjdCBmaWxlIGlzIE9SSUcgKyBPRkZTRVQsIHdoZXJlIE9SSUcgaXMgdGhlIHZhbHVlIG9mIHRoZQotCSBjb21tb24gc3ltYm9sIGFzIHNlZW4gYnkgdGhlIG9iamVjdCBmaWxlIHdoZW4gaXQgd2FzIGNvbXBpbGVkCi0JICh0aGlzIG1heSBiZSB6ZXJvIGlmIHRoZSBzeW1ib2wgd2FzIHVuZGVmaW5lZCkgYW5kIE9GRlNFVCBpcwotCSB0aGUgb2Zmc2V0IGludG8gdGhlIGNvbW1vbiBzeW1ib2wgKG5vcm1hbGx5IHplcm8sIGJ1dCBtYXkgYmUKLQkgbm9uLXplcm8gd2hlbiByZWZlcnJpbmcgdG8gYSBmaWVsZCBpbiBhIGNvbW1vbiBzdHJ1Y3R1cmUpLgotCSBPUklHIGlzIHRoZSBuZWdhdGl2ZSBvZiByZWxvY19lbnRyeS0+YWRkZW5kLCB3aGljaCBpcyBzZXQgYnkKLQkgdGhlIENBTENfQURERU5EIG1hY3JvIGJlbG93LiAgV2Ugd2FudCB0byByZXBsYWNlIHRoZSB2YWx1ZSBpbgotCSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBORVcgKyBPRkZTRVQsIHdoZXJlIE5FVyBpcyB0aGUgdmFsdWUgb2YKLQkgdGhlIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHB1dCBpbiB0aGUgZmluYWwKLQkgb2JqZWN0IGZpbGUuICBORVcgaXMgc3ltYm9sLT52YWx1ZS4gICovCi0gICAgICBkaWZmID0gc3ltYm9sLT52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRm9yIHNvbWUgcmVhc29uIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYWx3YXlzIGVmZmVjdGl2ZWx5Ci0JIGlnbm9yZXMgdGhlIGFkZGVuZCBmb3IgYSBDT0ZGIHRhcmdldCB3aGVuIHByb2R1Y2luZwotCSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhpcyBzZWVtcyB0byBiZSBhbHdheXMgd3JvbmcgZm9yIDg2MAotCSBDT0ZGLCBzbyB3ZSBoYW5kbGUgdGhlIGFkZGVuZCBoZXJlIGluc3RlYWQuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgZGlmZikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gICAgaWYgKGRpZmYgIT0gMCkKLSAgICAgIHsKLQlyZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQl1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0Jc3dpdGNoIChob3d0by0+c2l6ZSkKLQkgIHsKLQkgIGNhc2UgMDoKLQkgICAgewotCSAgICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICB7Ci0JICAgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHsKLQkgICAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCBmYWxzZQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgRU1QVFlfSE9XVE8gKDApLAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEVNUFRZX0hPV1RPICgyKSwKLSAgRU1QVFlfSE9XVE8gKDMpLAotICBFTVBUWV9IT1dUTyAoNCksCi0gIEVNUFRZX0hPV1RPICg1KSwKLSAgSE9XVE8gKFJfRElSMzIsICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJkaXIzMiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogezd9LCAqLwotICBIT1dUTyAoUl9JTUFHRUJBU0UsICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJydmEzMiIsCSAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIEVNUFRZX0hPV1RPICgwMTApLAotICBFTVBUWV9IT1dUTyAoMDExKSwKLSAgRU1QVFlfSE9XVE8gKDAxMiksCi0gIEVNUFRZX0hPV1RPICgwMTMpLAotICBFTVBUWV9IT1dUTyAoMDE0KSwKLSAgRU1QVFlfSE9XVE8gKDAxNSksCi0gIEVNUFRZX0hPV1RPICgwMTYpLAotICBIT1dUTyAoUl9SRUxCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiOCIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1JFTFdPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiMTYiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9SRUxMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIjMyIiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSQllURSwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSA4LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1A4IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JXT1JELAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1AxNiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSTE9ORywJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBJODYwQkFETUFHKHgpCi0jZGVmaW5lIEk4NjAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi0vKiBGb3IgODYwIENPRkYgYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaXMgcGFydCBvZiBhIHNoYXJlZAotICAgbGlicmFyeS4gIE9uIHNvbWUgb3RoZXIgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIG5vcm1hbGx5Ci0gICBTVFlQX05PTE9BRC4gICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAotICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQotICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCi0gICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCi0gICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCi0gICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCi0gICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKLSAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAotICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCi0gICBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQotICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKLSAgewkJCQkJCQkJXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCi0JICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKLSAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCi0JJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCi0JICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKLSAgICBpZiAocHRyICYmIGhvd3RvX3RhYmxlW3JlbG9jLnJfdHlwZV0ucGNfcmVsYXRpdmUpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2k4NjBfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0KLSAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZSBzZWVuIHNvbWUgZGF0YQotCSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsY2F0aW9uIGFkZHJlc3MuICBJZiBJIGxpbmsgdHdvIHZlcnNpb25zCi0JIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sCi0JIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgCi0JIGNhc2UgaW4gd2hpY2ggdGhpcyBzZWN0aW9uIGhhcyBiZWVuIGJ5cGFzc2VkIGhhcyBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZAotCSB0byB2YWx1ZXMgSSBjYW4gZmluZCBpbiB0aGUgbWFwICovCi0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pIAotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pM2NvZmZfb2JqZWN0X3AoYSkKLSAgICAgYmZkICphOwotewotICByZXR1cm4gY29mZl9vYmplY3RfcChhKTsKLX0KLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICBpODYwY29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiY29mZi1pODYwIiwJCQkvKiBuYW1lICovCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgaTNjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBpM2NvZmZfb2JqZWN0X3B9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWk5NjAuYyBiL2JmZC9jb2ZmLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3ZWJmYi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA5NjAgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEk5NjAgMQotI2RlZmluZSBCQURNQUcoeCkgSTk2MEJBRE1BRyh4KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pOTYwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIJCS8qIHRvIGFsbG93IGVhc2llciBhYnN0cmFjdGlvbi1icmVha2luZyAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG9wdGNhbGxfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTk2MF9yZWxvY2F0ZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBib29sZWFuICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgMQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfQUxJR04gYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFBVVF9TQ05IRFJfQUxJR04gYmZkX2hfcHV0XzMyCi0KLS8qIFRoZSBpOTYwIGRvZXMgbm90IHN1cHBvcnQgYW4gTU1VLCBzbyBDT0ZGX1BBR0VfU0laRSBjYW4gYmUKLSAgIGFyYml0cmFyaWx5IHNtYWxsLiAgKi8KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotLyogVGhpcyBzZXQgb2YgbG9jYWwgbGFiZWwgbmFtZXMgaXMgdGFrZW4gZnJvbSBnYXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnCi0JICB8fCAobmFtZVswXSA9PSAnLicKLQkgICAgICAmJiAobmFtZVsxXSA9PSAnQycKLQkJICB8fCBuYW1lWzFdID09ICdJJwotCQkgIHx8IG5hbWVbMV0gPT0gJy4nKSkpOwotfQotCi0vKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgdXN1YWwgQ0FMQ19BRERFTkQsIGJ1dCBpdCBpbmNsdWRlcyB0aGUKLSAgIHNlY3Rpb24gVk1BIGZvciBQQyByZWxhdGl2ZSByZWxvY3MuICAqLwotI2lmbmRlZiBDQUxDX0FEREVORAotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocHRyICYmIChyZWxvYy5yX3R5cGUgPT0gMjUgfHwgcmVsb2Mucl90eXBlID09IDI3KSkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0jZW5kaWYKLQotI2RlZmluZSBDQUxMUwkgMHg2NjAwMzgwMAkvKiBUZW1wbGF0ZSBmb3IgJ2NhbGxzJyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUwJIDB4MGIwMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWwnIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIEJBTF9NQVNLIDB4MDBmZmZmZmYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLW9wdGNhbGxfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBpdGVtIGhhcyBhbHJlYWR5IGJlZW4gcmVsb2NhdGVkIGNvcnJlY3RseSwgYnV0IHdlIG1heSBiZQotICAgKiBhYmxlIHRvIHBhdGNoIGluIHlldCBiZXR0ZXIgY29kZSAtIGRvbmUgYnkgZGlnZ2luZyBvdXQgdGhlCi0gICAqIGNvcnJlY3QgaW5mbyBvbiB0aGlzIHN5bWJvbCAqLwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmVzdWx0OwotICBjb2ZmX3N5bWJvbF90eXBlICpjcyA9IGNvZmZzeW1ib2woc3ltYm9sX2luKTsKLQotICAvKiBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHN5bWJvbHMgd2hpY2ggYXJlbid0IHRpZWQgdXAgeWV0LAotICAgICBleGNlcHQgbW92ZSB0aGUgcmVsb2MuICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGNzLT5zeW1ib2wuc2VjdGlvbikpIHsKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gIH0KLSAgICAKLSAgLyogU28gdGhlIHRhcmdldCBzeW1ib2wgaGFzIHRvIGJlIG9mIGNvZmYgdHlwZSwgYW5kIHRoZSBzeW1ib2wgCi0gICAgIGhhcyB0byBoYXZlIHRoZSBjb3JyZWN0IG5hdGl2ZSBpbmZvcm1hdGlvbiB3aXRoaW4gaXQgKi8KLSAgaWYgKChiZmRfYXN5bWJvbF9mbGF2b3VyKCZjcy0+c3ltYm9sKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICAgIHx8IChjcy0+bmF0aXZlID09IChjb21iaW5lZF9lbnRyeV90eXBlICopTlVMTCkpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBpbnRlcmVzdGluZywgY29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgd2UncmUgb3V0cHV0dGluZyBjb2ZmCi0JIGZyb20gYSBtaXggbiBtYXRjaCBpbnB1dCwgbGlua2luZyBmcm9tIGNvZmYgdG8gYSBzeW1ib2wgZGVmaW5lZCBpbiBhCi0JIGJvdXQgZmlsZSB3aWxsIGNhdXNlIHRoaXMgbWF0Y2ggdG8gYmUgdHJ1ZS4gU2hvdWxkIEkgY29tcGxhaW4/ICBUaGlzCi0JIHdpbGwgb25seSB3b3JrIGlmIHRoZSBib3V0IHN5bWJvbCBpcyBub24gbGVhZi4gICovCi0gICAgICAqZXJyb3JfbWVzc2FnZSA9Ci0JKGNoYXIgKikgXygidW5jZXJ0YWluIGNhbGxpbmcgY29udmVudGlvbiBmb3Igbm9uLUNPRkYgc3ltYm9sIik7Ci0gICAgICByZXN1bHQgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICBzd2l0Y2ggKGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzKSAKLSAgICAgIHsKLSAgICAgIGNhc2UgQ19MRUFGU1RBVDoKLSAgICAgIGNhc2UgQ19MRUFGRVhUOgotICAJLyogVGhpcyBpcyBhIGNhbGwgdG8gYSBsZWFmIHByb2NlZHVyZSwgcmVwbGFjZSBpbnN0cnVjdGlvbiB3aXRoIGEgYmFsCi0JICAgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24uICAqLwotCXsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4ID0gJigoY3MtPm5hdGl2ZSsyKS0+dS5hdXhlbnQpOwotCSAgaW50IHdvcmQgPSBiZmRfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0JICBpbnQgb2xmID0gKGF1eC0+eF9iYWwueF9iYWxudHJ5IC0gY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICBCRkRfQVNTRVJUKGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4PT0yKTsKLQotCSAgLyogV2UgcmVwbGFjZSB0aGUgb3JpZ2luYWwgY2FsbCBpbnN0cnVjdGlvbiB3aXRoIGEgYmFsIHRvCi0JICAgICB0aGUgYmFsIGVudHJ5IHBvaW50IC0gdGhlIG9mZnNldCBvZiB3aGljaCBpcyBkZXNjcmliZWQgaW4KLQkgICAgIHRoZSAybmQgYXV4ZW50IG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wuIFdlIGtlZXAgdGhlIG5hdGl2ZQotCSAgICAgc3ltIGFuZCBhdXhlbnRzIHVudG91Y2hlZCwgc28gdGhlIGRlbHRhIGJldHdlZW4gdGhlIHR3bwotCSAgICAgaXMgdGhlIG9mZnNldCBvZiB0aGUgYmFsIGVudHJ5IHBvaW50LiAgKi8KLQkgIHdvcmQgPSAoKHdvcmQgKyAgb2xmKSAgJiBCQUxfTUFTSykgfCBCQUw7Ci0gIAkgIGJmZF9wdXRfMzIoYWJmZCwgd29yZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIAl9Ci0JcmVzdWx0ID0gYmZkX3JlbG9jX29rOwotCWJyZWFrOwotICAgICAgY2FzZSBDX1NDQUxMOgotCS8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgc3lzdGVtIGNhbGwsIHJlcGxhY2Ugd2l0aCBhIGNhbGxzIHRvICMgKi8KLQlCRkRfQVNTRVJUKDApOwotCXJlc3VsdCA9IGJmZF9yZWxvY19vazsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcmVzdWx0ID0gYmZkX3JlbG9jX29rOwotCWJyZWFrOwotICAgICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGk5NjAgQ09GRiBpcyB1c2VkIGJ5IFZ4V29ya3MgNS4xLiAgSG93ZXZlciwgVnhXb3JrcyA1LjEgZG9lcyBub3QKLSAgIGFwcGVhciB0byBjb3JyZWN0bHkgaGFuZGxlIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZQotICAgc2FtZSBvYmplY3QgZmlsZS4gIEl0IGFwcGVhcnMgdG8gc2ltcGx5IGRpc2NhcmQgc3VjaCByZWxvY3MsIHJhdGhlcgotICAgdGhhbiBhZGRpbmcgdGhlaXIgdmFsdWVzIGludG8gdGhlIG9iamVjdCBmaWxlLiAgV2UgaGFuZGxlIHRoaXMgaGVyZQotICAgYnkgY29udmVydGluZyBhbGwgcmVsb2NzIGFnYWluc3QgZGVmaW5lZCBzeW1ib2xzIGludG8gcmVsb2NzCi0gICBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbCwgd2hlbiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dAotICAgZmlsZS4KLQotICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgQ09GRgotICAgc3BlY2lmaWMgYmFja2VuZCBsaW5rZXIuICBJdCBvbmx5IGRvZXMgc29tZXRoaW5nIHdoZW4gZG9pbmcgYQotICAgcmVsb2NhdGVhYmxlIGxpbmssIHdoaWNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBmYWlsIHdoZW4gbm90Ci0gICBnZW5lcmF0aW5nIENPRkYgaTk2MCBvdXRwdXQsIHNvIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgbm8gbG9uZ2VyCi0gICB1c2VmdWwuICBJdCB3YXMgdXNlZCBiZWZvcmUgdGhpcyB0YXJnZXQgd2FzIGNvbnZlcnRlZCB0byB1c2UgdGhlCi0gICBDT0ZGIHNwZWNpZmljIGJhY2tlbmQgbGlua2VyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWNvZmZfaTk2MF9yZWxvY2F0ZSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhc2VjdGlvbiAqb3NlYzsKLQotICBpZiAob3V0cHV0X2JmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vdCBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpKQotICAgIHsKLSAgICAgIC8qIFN5bWJvbCBpcyBub3QgZGVmaW5lZCwgc28gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBpdC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpKQotICAgIHsKLSAgICAgIC8qIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGUgcmlnaHQgYWN0aW9uIGlzIGZvciBhIGNvbW1vbgotICAgICAgICAgc3ltYm9sLiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIC8qIENvbnZlcnQgdGhlIHJlbG9jIHRvIHVzZSB0aGUgc2VjdGlvbiBzeW1ib2wuICBGSVhNRTogVGhpcyBtZXRob2QKLSAgICAgaXMgcmlkaWN1bG91cy4gICovCi0gIG9zZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCktPm91dHB1dF9zZWN0aW9uOwotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpICE9IE5VTEwKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKS0+dGRhdGEgIT0gTlVMTCkKLSAgICByZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIgPQotICAgICAgKGFzeW1ib2wgKiopIGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKS0+dGRhdGE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzZWNfbmFtZTsKLSAgICAgIGFzeW1ib2wgKipzeW1zLCAqKnN5bV9lbmQ7Ci0KLSAgICAgIHNlY19uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIG9zZWMpOwotICAgICAgc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCk7Ci0gICAgICBzeW1fZW5kID0gc3ltcyArIGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotICAgICAgZm9yICg7IHN5bXMgPCBzeW1fZW5kOyBzeW1zKyspCi0JewotCSAgaWYgKGJmZF9hc3ltYm9sX25hbWUgKCpzeW1zKSAhPSBOVUxMCi0JICAgICAgJiYgKCpzeW1zKS0+dmFsdWUgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoKCpzeW1zKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsCi0JCQkgc2VjX25hbWUpID09IDApCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHN5bXMgPj0gc3ltX2VuZCkKLQlhYm9ydCAoKTsKLQotICAgICAgcmVsb2NfZW50cnktPnN5bV9wdHJfcHRyID0gc3ltczsKLQotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKSA9PSBOVUxMKQotCXsKLQkgIG9zZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotCSAgaWYgKG9zZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JfQotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpLT50ZGF0YSA9IChQVFIpIHN5bXM7Ci0gICAgfQotCi0gIC8qIExldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGRvIGl0cyB0aGluZywgd2hpY2ggd2lsbCBpbmNsdWRlCi0gICAgIHN0dWZmaW5nIHRoZSBzeW1ib2wgYWRkZW5kIGludG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsbG9uZyA9Ci0gIEhPV1RPICgodW5zaWduZWQgaW50KSBSX1JFTExPTkcsIDAsIDIsIDMyLGZhbHNlLCAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgY29mZl9pOTYwX3JlbG9jYXRlLCJyZWxsb25nIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMCk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19pcHJtZWQgPQotICBIT1dUTyAoUl9JUFJNRUQsIDAsIDIsIDI0LHRydWUsMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSBjb2ZmX2k5NjBfcmVsb2NhdGUsICJpcHJtZWQgIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgMCk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19vcHRjYWxsID0KLSAgSE9XVE8gKFJfT1BUQ0FMTCwgMCwyLDI0LHRydWUsMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSBvcHRjYWxsX2NhbGxiYWNrLCAib3B0Y2FsbCIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDApOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSTk2MF9DQUxMSjoKLSAgICAgIHJldHVybiAmaG93dG9fb3B0Y2FsbDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxsb25nOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0X1BDUkVMOgotICAgICAgcmV0dXJuICZob3d0b19pcHJtZWQ7Ci0gICAgfQotfQotCi0vKiBUaGUgcmVhbCBjb2RlIGlzIGluIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotewkJCQkJCQlcCi0gICByZWxvY19ob3d0b190eXBlICpob3d0b19wdHI7CQkJCVwKLSAgIHN3aXRjaCAoKGRzdCktPnJfdHlwZSkgewkJCQlcCi0gICAgIGNhc2UgMTc6IGhvd3RvX3B0ciA9ICZob3d0b19yZWxsb25nOyBicmVhazsJXAotICAgICBjYXNlIDI1OiBob3d0b19wdHIgPSAmaG93dG9faXBybWVkOyBicmVhazsJCVwKLSAgICAgY2FzZSAyNzogaG93dG9fcHRyID0gJmhvd3RvX29wdGNhbGw7IGJyZWFrOwlcCi0gICAgIGRlZmF1bHQ6IGhvd3RvX3B0ciA9IDA7IGJyZWFrOwkJCVwKLSAgICAgfQkJCQkJCQlcCi0gICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b19wdHI7CQkJXAotIH0KLQotLyogaTk2MCBDT0ZGIGlzIHVzZWQgYnkgVnhXb3JrcyA1LjEuICBIb3dldmVyLCBWeFdvcmtzIDUuMSBkb2VzIG5vdAotICAgYXBwZWFyIHRvIGNvcnJlY3RseSBoYW5kbGUgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlCi0gICBzYW1lIG9iamVjdCBmaWxlLiAgSXQgYXBwZWFycyB0byBzaW1wbHkgZGlzY2FyZCBzdWNoIHJlbG9jcywgcmF0aGVyCi0gICB0aGFuIGFkZGluZyB0aGVpciB2YWx1ZXMgaW50byB0aGUgb2JqZWN0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBieQotICAgY29udmVydGluZyBhbGwgcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMgaW50byByZWxvY3MgYWdhaW5zdAotICAgaW50ZXJuYWwgc3ltYm9scyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBUaGlzIHJvdXRpbmUgaXMKLSAgIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmtpbmcgcHJvY2VzcywgYW5kIGl0IGNyZWF0ZXMgdGhlCi0gICBuZWNlc3Nhcnkgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBhc2VjdGlvbiAqbzsKLSAgYmZkX2J5dGUgKmVzeW07Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3ltZXN6KTsKLSAgaWYgKGVzeW0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCi0gICAgICBzdHJuY3B5IChpc3ltLl9uLl9uX25hbWUsIG8tPm5hbWUsIFNZTU5NTEVOKTsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBvLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpc3ltLm5fdHlwZSA9IFRfTlVMTDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gICAgICBpc3ltLm5fbnVtYXV4ID0gMDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZXN5bSk7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKGVzeW0sIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXsKLQkgIGZyZWUgKGVzeW0pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICs9IDE7Ci0gICAgfQotCi0gIGZyZWUgKGVzeW0pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICBib29sZWFuIGRvbmU7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JY2FzZSAxNzogaG93dG8gPSAmaG93dG9fcmVsbG9uZzsgYnJlYWs7Ci0JY2FzZSAyNTogaG93dG8gPSAmaG93dG9faXBybWVkOyBicmVhazsKLQljYXNlIDI3OiBob3d0byA9ICZob3d0b19vcHRjYWxsOyBicmVhazsKLQlkZWZhdWx0OgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBkb25lID0gZmFsc2U7Ci0KLSAgICAgIGlmIChob3d0by0+dHlwZSA9PSBSX09QVENBTEwgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUgJiYgc3ltbmR4ICE9IC0xKQotCXsKLQkgIGludCBjbGFzczsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgY2xhc3MgPSBoLT5jbGFzczsKLQkgIGVsc2UKLQkgICAgY2xhc3MgPSBzeW0tPm5fc2NsYXNzOwotCi0JICBzd2l0Y2ggKGNsYXNzKQotCSAgICB7Ci0JICAgIGNhc2UgQ19OVUxMOgotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGFwcGFyZW50bHkgbm90IGZyb20gYSBDT0ZGIGlucHV0IGZpbGUuCi0gICAgICAgICAgICAgICAgIFdlIHdhcm4sIGFuZCB0aGVuIGFzc3VtZSB0aGF0IGl0IGlzIG5vdCBhIGxlYWYKLSAgICAgICAgICAgICAgICAgZnVuY3Rpb24uICAqLwotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgICAgIChpbmZvLAotCQkgICAgICBfKCJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENfTEVBRlNUQVQ6Ci0JICAgIGNhc2UgQ19MRUFGRVhUOgotCSAgICAgIC8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgbGVhZiBwcm9jZWR1cmU7IHVzZSB0aGUgYmFsCi0gICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICB7Ci0JCWxvbmcgb2xmOwotCQl1bnNpZ25lZCBsb25nIHdvcmQ7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICB7Ci0JCSAgICBCRkRfQVNTRVJUIChoLT5udW1hdXggPT0gMik7Ci0JCSAgICBvbGYgPSBoLT5hdXhbMV0ueF9iYWwueF9iYWxudHJ5OwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGJmZF9ieXRlICplc3ltczsKLQkJICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkJICAgIEJGRF9BU1NFUlQgKHN5bS0+bl9udW1hdXggPT0gMik7Ci0JCSAgICBlc3ltcyA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotCQkgICAgZXN5bXMgKz0gKHN5bW5keCArIDIpICogYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotCQkgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bXMsIHN5bS0+bl90eXBlLAotCQkJCQkgIHN5bS0+bl9zY2xhc3MsIDEsIHN5bS0+bl9udW1hdXgsCi0JCQkJCSAgKFBUUikgJmF1eCk7Ci0JCSAgICBvbGYgPSBhdXgueF9iYWwueF9iYWxudHJ5OwotCQkgIH0KLQotCQl3b3JkID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCSAgIChjb250ZW50cwotCQkJCSAgICArIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSk7Ci0JCXdvcmQgPSAoKHdvcmQgKyBvbGYgLSB2YWwpICYgQkFMX01BU0spIHwgQkFMOwotCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgd29yZCwKLQkJCSAgICAoY29udGVudHMKLQkJCSAgICAgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpOwotCQlkb25lID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ19TQ0FMTDoKLQkgICAgICBCRkRfQVNTRVJUICgwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgZG9uZSkKLQl7Ci0JICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCSAgICBhZGRlbmQgKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywKLQkJCQkJICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJICAgIHZhbCwgYWRkZW5kKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2wgaW5kZXggb2YgYW55IHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHRvCi0gICBpbnN0ZWFkIGJlIGEgcmVsb2MgYWdhaW5zdCB0aGUgaW50ZXJuYWwgc3ltYm9sIHdlIGNyZWF0ZWQgc3BlY2lhbGx5Ci0gICBmb3IgdGhlIHNlY3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCi0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICBib29sZWFuICphZGp1c3RlZHA7Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAqYWRqdXN0ZWRwID0gZmFsc2U7Ci0KLSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGliZmQpW2lyZWwtPnJfc3ltbmR4XTsKLSAgaWYgKGggPT0gTlVMTAotICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlyZWwtPnJfc3ltbmR4ID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4IC0gMTsKLSAgKmFkanVzdGVkcCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZQotCi0jZGVmaW5lIGNvZmZfc3RhcnRfZmluYWxfbGluayBjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluawotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbgotCi0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keAotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWNvZmZfYmlnX3ZlYzsKLQotQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMgKGljb2ZmX2xpdHRsZV92ZWMsICJjb2ZmLUludGVsLWxpdHRsZSIsIDAsIDAsICdfJywgJiBpY29mZl9iaWdfdmVjKQotCi1jb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWMgPQotewotICAiY29mZi1JbnRlbC1iaWciLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIGljb2ZmX2xpdHRsZV92ZWMsCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1tNjhrLmMgYi9iZmQvY29mZi1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTM4YzAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgNjgwMDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL202OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBUaGlzIHNvdXJjZSBmaWxlIGlzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGZvciB2YXJpb3VzIG02OGsgQ09GRgotICAgdmFyaWFudHMuICBUaGUgZm9sbG93aW5nIG1hY3JvcyBjb250cm9sIGl0cyBiZWhhdmlvdXI6Ci0KLSAgIFRBUkdFVF9TWU0KLSAgICAgVGhlIEMgbmFtZSBvZiB0aGUgQkZEIHRhcmdldCB2ZWN0b3IuICBUaGUgZGVmYXVsdCBpcyBtNjhrY29mZl92ZWMuCi0gICBUQVJHRVRfTkFNRQotICAgICBUaGUgdXNlciB2aXNpYmxlIHRhcmdldCBuYW1lLiAgVGhlIGRlZmF1bHQgaXMgImNvZmYtbTY4ayIuCi0gICBOQU1FU19IQVZFX1VOREVSU0NPUkUKLSAgICAgV2hldGhlciBzeW1ib2wgbmFtZXMgaGF2ZSBhbiB1bmRlcnNjb3JlLgotICAgT05MWV9ERUNMQVJFX1JFTE9DUwotICAgICBPbmx5IGRlY2xhcmUgdGhlIHJlbG9jYXRpb24gaG93dG8gYXJyYXkuICBEb24ndCBhY3R1YWxseSBjb21waWxlCi0gICAgIGl0LiAgVGhlIGFjdHVhbCBhcnJheSB3aWxsIGJlIHBpY2tlZCB1cCBpbiBhbm90aGVyIHZlcnNpb24gb2YgdGhlCi0gICAgIGZpbGUuCi0gICBTVEFUSUNfUkVMT0NTCi0gICAgIE1ha2UgdGhlIHJlbG9jYXRpb24gaG93dG8gYXJyYXksIGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9ucywgc3RhdGljLgotICAgQ09GRl9DT01NT05fQURERU5ECi0gICAgIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlbiwgZm9yIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgY29tbW9uCi0gICAgIHN5bWJvbCwgdGhlIG9iamVjdCBmaWxlIGhvbGRzIHRoZSB2YWx1ZSAodGhlIHNpemUpIG9mIHRoZSBjb21tb24KLSAgICAgc3ltYm9sLiAgSWYgdGhpcyBpcyBub3QgZGVmaW5lZCwgdGhlbiwgZm9yIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEKLSAgICAgY29tbW9uIHN5bWJvbCwgdGhlIG9iamVjdCBmaWxlIGhvbGRzIHplcm8uICAqLwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLQotI2lmbmRlZiBDT0ZGX1BBR0VfU0laRQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MjAwMAotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9DT01NT05fQURERU5ECi0jZGVmaW5lIFJFTE9DX1NQRUNJQUxfRk4gMAotI2Vsc2UKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0jZGVmaW5lIFJFTE9DX1NQRUNJQUxfRk4gbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBPbiB0aGUgZGVsdGEsIGEgc3ltYm9sIHN0YXJ0aW5nIHdpdGggTCUgaXMgbG9jYWwuICBXZSB3b24ndCBzZWUKLSAgIHN1Y2ggYSBzeW1ib2wgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyBpdCBzaG91bGQgYmUgc2FmZSB0byBhbHdheXMKLSAgIGNvbnNpZGVyIGl0IGxvY2FsIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyUnKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0KLSNpZm5kZWYgU1RBVElDX1JFTE9DUwotLyogQ2xlYW4gdXAgbmFtZXNwYWNlLiAgKi8KLSNkZWZpbmUgbTY4a2NvZmZfaG93dG9fdGFibGUJX2JmZF9tNjhrY29mZl9ob3d0b190YWJsZQotI2RlZmluZSBtNjhrX3J0eXBlMmhvd3RvCV9iZmRfbTY4a2NvZmZfcnR5cGUyaG93dG8KLSNkZWZpbmUgbTY4a19ob3d0bzJydHlwZQlfYmZkX202OGtjb2ZmX2hvd3RvMnJ0eXBlCi0jZGVmaW5lIG02OGtfcmVsb2NfdHlwZV9sb29rdXAJX2JmZF9tNjhrY29mZl9yZWxvY190eXBlX2xvb2t1cAotI2VuZGlmCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBtNjhrY29mZl9ob3d0b190YWJsZVtdOwotI2Vsc2UKLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotcmVsb2NfaG93dG9fdHlwZSBtNjhrY29mZl9ob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPKFJfUkVMQllURSwJICAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICI4IiwJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMV09SRCwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9ORywJICAgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSQllURSwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIFJFTE9DX1NQRUNJQUxfRk4sICJESVNQOCIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUldPUkQsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiRElTUDE2IiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIkRJU1AzMiIsICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9OR19ORUcsCSAgICAgICAwLCAgLTIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiLTMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotI2VuZGlmIC8qIG5vdCBPTkxZX0RFQ0xBUkVfUkVMT0NTICovCi0KLSNpZm5kZWYgQkFETUFHCi0jZGVmaW5lIEJBRE1BRyh4KSBNNjhLQkFETUFHKHgpCi0jZW5kaWYKLSNkZWZpbmUgTTY4IDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gdm9pZCBtNjhrX3J0eXBlMmhvd3RvIFBBUkFNUyAoKGFyZWxlbnQgKmludGVybmFsLCBpbnQgcmVsb2NlbnRyeSkpOwotZXh0ZXJuIGludCBtNjhrX2hvd3RvMnJ0eXBlIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKikpOwotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotI2Vsc2UKLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotdm9pZAotbTY4a19ydHlwZTJob3d0byhpbnRlcm5hbCwgcmVsb2NlbnRyeSkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIGludCByZWxvY2VudHJ5OwotewotICBzd2l0Y2ggKHJlbG9jZW50cnkpIAotICB7Ci0gICBjYXNlIFJfUkVMQllURToJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAwOyBicmVhazsKLSAgIGNhc2UgUl9SRUxXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDE7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMjsgYnJlYWs7Ci0gICBjYXNlIFJfUENSQllURToJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAzOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDQ7IGJyZWFrOwotICAgY2FzZSBSX1BDUkxPTkc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9OR19ORUc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNjsgYnJlYWs7Ci0gIH0KLX0KLQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi1pbnQgCi1tNjhrX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaW50ZXJuYWw7Ci17Ci0gIGlmIChpbnRlcm5hbC0+cGNfcmVsYXRpdmUpIAotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCi0gICAgewotICAgICBjYXNlIDMyOiByZXR1cm4gUl9QQ1JMT05HOwotICAgICBjYXNlIDE2OiByZXR1cm4gUl9QQ1JXT1JEOwotICAgICBjYXNlIDg6IHJldHVybiBSX1BDUkJZVEU7Ci0gICAgfQotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKLSAgICAgewotICAgICAgY2FzZSAzMjogcmV0dXJuIFJfUkVMTE9ORzsKLSAgICAgIGNhc2UgMTY6IHJldHVybiBSX1JFTFdPUkQ7Ci0gICAgICBjYXNlIDg6IHJldHVybiBSX1JFTEJZVEU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gUl9SRUxMT05HOyAgICAKLX0KLQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi1yZWxvY19ob3d0b190eXBlICoKLW02OGtfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgkJCXJldHVybiBOVUxMOwotICAgIGNhc2UgQkZEX1JFTE9DXzg6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAwOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMTsKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMjsKLSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAzOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA0OwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA1OwotICAgICAgLyogRklYTUU6IFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGNvZGUgZm9yIFJfUkVMTE9OR19ORUcuICAqLwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotI2VuZGlmIC8qIG5vdCBPTkxZX0RFQ0xBUkVfUkVMT0NTICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIFwKLSAgbTY4a19ydHlwZTJob3d0byhpbnRlcm5hbCwgKHJlbG9jZW50cnkpLT5yX3R5cGUpCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGV4dGVybmFsLCBpbnRlcm5hbCkgXAotICBleHRlcm5hbC5yX3R5cGUgPSBtNjhrX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBtNjhrX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpZm5kZWYgQ09GRl9DT01NT05fQURERU5ECi0jaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIG02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptNjhrY29mZl9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tNjhrY29mZl9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIGFyZWxlbnQgcmVsZW50OwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBSVFlQRTJIT1dUTyAoJnJlbGVudCwgcmVsKTsKLQotICBob3d0byA9IHJlbGVudC5ob3d0bzsKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIHJldHVybiBob3d0bzsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKENPRkZfQ09NTU9OX0FEREVORCkgKi8KLQwKLSNpZmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKLQotLyogSWYgQ09GRl9DT01NT05fQURERU5EIGlzIGRlZmluZWQsIHRoZW4gd2hlbiB1c2luZyBtNjhrIENPRkYgdGhlCi0gICB2YWx1ZSBzdG9yZWQgaW4gdGhlIC50ZXh0IHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uCi0gICBzeW1ib2wgaXMgdGhlIHZhbHVlIGl0c2VsZiBwbHVzIGFueSBkZXNpcmVkIG9mZnNldC4gICh0YWtlbiBmcm9tCi0gICB3b3JrIGRvbmUgYnkgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGZvciBJMzg2IENPRkYpLiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfc3BlY2lhbF9mbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQkgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKLQkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCi0JIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKLQkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCi0JIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQotCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCi0JIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQotCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCi0JIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgotCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAotCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KLSAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgZGlmZikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIGlmIChkaWZmICE9IDApCi0gICAgewotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gICAgICB1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotCXsKLQljYXNlIDA6Ci0JICB7Ci0JICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgIERPSVQgKHgpOwotCSAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDE6Ci0JICB7Ci0JICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgRE9JVCAoeCk7Ci0JICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDI6Ci0JICB7Ci0JICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICBET0lUICh4KTsKLQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKLSAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKLSAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAotICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQotICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQotICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQotICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCi0gICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKLSAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgotICAgUEMgcmVsYXRpdmUgcmVsb2NzLgotICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKLSAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAotCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCi0gICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAotCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAotCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCi0gICAgaWYgKHB0ciAmJiAocmVsb2Mucl90eXBlID09IFJfUENSQllURQkJCVwKLQkJfHwgcmVsb2Mucl90eXBlID09IFJfUENSV09SRAkJCVwKLQkJfHwgcmVsb2Mucl90eXBlID09IFJfUENSTE9ORykpCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0KLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotCi0vKiBjb2ZmLW02OGsuYyB1c2VzIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICBXZSBuZWVkIHRvCi0gICBhZGp1c3QgY29tbW9uIHN5bWJvbHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIGFyZWxlbnQgcmVsZW50OwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBSVFlQRTJIT1dUTyAoJnJlbGVudCwgcmVsKTsKLQotICBob3d0byA9IHJlbGVudC5ob3d0bzsKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gPT0gMCAmJiBzeW0tPm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBzZWN0aW9uIGNvbnRlbnRzIGluY2x1ZGUgdGhlCi0JIHNpemUgKHN5bS0+bl92YWx1ZSkgYXMgYW4gYWRkZW5kLiAgVGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkgZnVuY3Rpb24gd2lsbCBiZSBhZGRpbmcgaW4gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBXZQotCSBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBzaXplIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgY29ycmVjdCByZXN1bHQuICAqLwotICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLSAgICAgICphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG91dHB1dCBzeW1ib2wgaXMgY29tbW9uIChpbiB3aGljaCBjYXNlIHRoaXMgbXVzdCBiZSBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rKSwgd2UgbmVlZCB0byBhZGQgaW4gdGhlIGZpbmFsIHNpemUgb2YgdGhlCi0gICAgIGNvbW1vbiBzeW1ib2wuICAqLwotICBpZiAoaCAhPSBOVUxMICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICAqYWRkZW5kcCArPSBoLT5yb290LnUuYy5zaXplOwotCi0gIHJldHVybiBob3d0bzsKLX0KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIG02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KLQotI2VuZGlmIC8qIENPRkZfQ09NTU9OX0FEREVORCAqLwotDAotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIG02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSNpZm5kZWYgVEFSR0VUX1NZTQotI2RlZmluZSBUQVJHRVRfU1lNIG02OGtjb2ZmX3ZlYwotI2VuZGlmCi0KLSNpZm5kZWYgVEFSR0VUX05BTUUKLSNkZWZpbmUgVEFSR0VUX05BTUUgImNvZmYtbTY4ayIKLSNlbmRpZgotCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIERfUEFHRUQsIDAsICdfJywgTlVMTCkKLSNlbHNlCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIERfUEFHRUQsIDAsIDAsIE5VTEwpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW04OGsuYyBiL2JmZC9jb2ZmLW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4Mzc3YS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA4ODAwMCBDT0ZGICJCaW5hcnkgQ29tcGF0YWJpbGl0eSBTdGFuZGFyZCIgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE04OCAxCQkvKiBDdXN0b21pemUgdmFyaW91cyBpbmNsdWRlIGZpbGVzICovCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9tODhrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJvb2xlYW4gbTg4a19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTg4a19zcGVjaWFsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIHZvaWQgcmVsb2NfcHJvY2Vzc2luZwotICBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBhc3ltYm9sICoqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2RlZmluZSBHRVRfU0NOSERSX05SRUxPQyBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgR0VUX1NDTkhEUl9OTE5OTyBiZmRfaF9nZXRfMzIKLQotLyogT24gY29mZi1tODhrLCBsb2NhbCBsYWJlbHMgc3RhcnQgd2l0aCAnQCcuICAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgbTg4a19pc19sb2NhbF9sYWJlbF9uYW1lCi0KLXN0YXRpYyBib29sZWFuCi1tODhrX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnQCc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1tODhrX3NwZWNpYWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQotICBzd2l0Y2ggKGhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSFZSVDE2OgotICAgIGNhc2UgUl9MVlJUMTY6Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlCi0JICAgICByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuCi0JICAgICBNb2RpZnkgdGhlIHJlbG9jIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0JICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQkgIGJmZF92bWEgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotCSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLQotCSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotCSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0JICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0JICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLQkgIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotCSAgaWYgKG91dHB1dF9iZmQpCi0JICAgIG91dHB1dF9iYXNlID0gMDsKLQkgIGVsc2UKLQkgICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0JICByZWxvY2F0aW9uICs9ICgocmVsb2NfZW50cnktPmFkZGVuZCA8PCBob3d0by0+Yml0c2l6ZSkgKyB4KTsKLQotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0KLQkgIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotCSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotCSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLQkgIGlmIChyZWxvY2F0aW9uKQotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyBhZGRyKTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotCSB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZQotCSAgICAgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLgotCSAgICAgTW9kaWZ5IHRoZSByZWxvYyBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0KLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICByZXR1cm4gYmZkX3JlbG9jX29rOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPIChSX1BDUjE2TCwJCQkvKiB0eXBlICovCi0JIDAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1IxNkwiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BDUjI2TCwJCQkvKiB0eXBlICovCi0JIDAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1IyNkwiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAzZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDNmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1ZSVDE2LAkJCS8qIHR5cGUgKi8KLQkgMDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlZSVDE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9IVlJUMTYsCQkJLyogdHlwZSAqLwotCSAxNiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJIVlJUMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0xWUlQxNiwJCQkvKiB0eXBlICovCi0JIDAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxWUlQxNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfVlJUMzIsCQkJLyogdHlwZSAqLwotCSAwMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVlJUMzIiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogQ29kZSB0byB0dXJuIGFuIGV4dGVybmFsIHJfdHlwZSBpbnRvIGEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUKLSAgIGFib3ZlIGhvd3RvIHRhYmxlLiAgKi8KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIGlmIChkc3QtPnJfdHlwZSA+PSBSX1BDUjE2TCAmJiBkc3QtPnJfdHlwZSA8PSBSX1ZSVDMyKQotICAgIHsKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSBob3d0b190YWJsZSArIGRzdC0+cl90eXBlIC0gUl9QQ1IxNkw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyBvZmZzZXQgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8xNgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzE2Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikJXAotICByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmICgoKGludCkgcmVsb2MtPnJfc3ltbmR4KSA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi0jZGVmaW5lIEJBRE1BRyh4KSBNQzg4QkFETUFHKHgpCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI3VuZGVmIGNvZmZfd3JpdGVfYXJtYXAKLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKG04OGtiY3NfdmVjLCAiY29mZi1tODhrYmNzIiwgMCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbWNvcmUuYyBiL2JmZC9jb2ZmLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDhiZjEuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDY1MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xsYSBNQ29yZSBDT0ZGL1BFCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL21jb3JlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotI2RlZmluZSBCQURNQUcoeCkgTUNPUkVCQURNQUcoeCkKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShBKSAoc2l6ZW9mIChBKSAvIHNpemVvZiAoQSlbMF0pCi0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gbWNvcmVfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICogICAgICAgICAgIHBlX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLQotDAotLyogVGhlIE5UIGxvYWRlciBwb2ludHMgdGhlIHRvYyByZWdpc3RlciB0byAmdG9jICsgMzI3NjgsIGluIG9yZGVyIHRvCi0gICB1c2UgdGhlIGNvbXBsZXRlIHJhbmdlIG9mIGEgMTYtYml0IGRpc3BsYWNlbWVudC4gV2UgaGF2ZSB0byBhZGp1c3QKLSAgIGZvciB0aGlzIHdoZW4gd2UgZml4IHVwIGxvYWRzIGRpc3BsYWNlZCBvZmYgdGhlIHRvYyByZWcuICAqLwotI2RlZmluZSBUT0NfTE9BRF9BREpVU1RNRU5UICgtMzI3NjgpCi0jZGVmaW5lIFRPQ19TRUNUSU9OX05BTUUgIi5wcml2YXRlLnRvYyIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfQUJTT0xVVEUsLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogZG9udCBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUJTT0xVVEUiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwJIAkgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsICAgICAgICAJCSAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9BRERSMzIsLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTThCWTQiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogYnNyL2J0L2JmL2JyIGluc3RydWN0aW9uczsgMTEgYml0cyArIDEgemVybyBiaXQgCi0gICAgIFNwYW4gMmsgaW5zdHJ1Y3Rpb25zID09IDRrIGJ5dGVzLgotICAgICBPbmx5IHVzZWZ1bCBwaWVjZXMgYXQgdGhlIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSB0aGUgb3Bjb2RlICg1IGJpdHMpICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTTExQlkyIiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXRzICsgMSB6ZXJvIGJpdDsgJ2xvb3B0JyBpbnN0cnVjdGlvbiBvbmx5OyB1bnN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NNEJZMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIsLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSRUxfMzIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBQQ1JFTF9JTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKLSAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCi0gICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAotICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAotICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAotICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcwotICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJKU1JfSU1NMTFCWTIiLCAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9SVkEsICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTUNPUkVfUlZBIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgTSpDb3JlIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi10eXBlZGVmIHN0cnVjdCBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgb3JpZ2luYWwgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlLiAgTVVTVCBiZSBmaXJzdCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQlyb290OwotCi0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vZl90b2Nfb3duZXI7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90b2Nfc2l6ZTsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3RhYmxlX3NpemU7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3RodW5rX2FkZHJlc3M7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIHRodW5rX3NpemU7Ci19Ci1tY29yZV9oYXNoX3RhYmxlOwotCi0vKiBHZXQgdGhlIE1Db3JlIGNvZmYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX21jb3JlX2hhc2hfdGFibGUoaW5mbykgXAotICAoKG1jb3JlX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBNQ29yZSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1jb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG1jb3JlX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChtY29yZV9oYXNoX3RhYmxlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIHJldCkpKTsKLSAgaWYgKHJldCA9PSAobWNvcmVfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICAgICAgKCYgcmV0LT5yb290LCBhYmZkLCBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmJmZF9vZl90b2Nfb3duZXIgPSBOVUxMOwotICByZXQtPmdsb2JhbF90b2Nfc2l6ZSAgPSAwOwotICByZXQtPmltcG9ydF90YWJsZV9zaXplID0gMDsKLSAgcmV0LT5maXJzdF90aHVua19hZGRyZXNzID0gMDsKLSAgcmV0LT50aHVua19zaXplID0gMDsKLQotICByZXR1cm4gJiByZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgYmFzZSBmaWxlLiAgKi8KLXN0YXRpYyB2b2lkCi1tY29yZV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2Nfb2Zmc2V0KQotICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICByZWxvY19vZmZzZXQ7Ci17Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX29mZnNldAotICAgICAgICAgICAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotICAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIGlmIChjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICAgYWRkciAtPSBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgCi0gIGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAoYWRkciksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci19Ci0MCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEJGRF9BU1NFUlQgKHJlbG9jX2VudHJ5LT5ob3d0byAhPSAocmVsb2NfaG93dG9fdHlwZSAqKTApOwotICAKLSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPm5hbWUsCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSk7Ci0gIAotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotDAotLyogQSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZS4gKi8KLSNkZWZpbmUgSE9XMk1BUChiZmRfcnR5cGUsIG1jb3JlX3J0eXBlKSAgXAotIGNhc2UgYmZkX3J0eXBlOiByZXR1cm4gJiBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlIFttY29yZV9ydHlwZV0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsgCi0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0LCAgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU04Qlk0KTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMiwgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMiwgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfMzJfUENSRUwsICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMiwgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfUlZBLCAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfUlZBKTsKLSAgIGRlZmF1bHQ6IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jdW5kZWYgSE9XMk1BUAotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0gIChjYWNoZV9wdHIpLT5ob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bTsKLSAgICAgYmZkX3ZtYSAqIGFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLQotCi0gIGlmIChyZWwtPnJfdHlwZSA+PSBOVU1fRUxFTSAobWNvcmVfY29mZl9ob3d0b190YWJsZSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotICBpZiAocmVsLT5yX3R5cGUgPT0gSU1BR0VfUkVMX01DT1JFX1JWQSkKLSAgICAqIGFkZGVuZHAgLT0gcGVfZGF0YSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAKLSAgZWxzZSBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICogYWRkZW5kcCA9IHNlYy0+dm1hIC0gMjsgLyogWFhYIGd1ZXNzIC0gaXMgdGhpcyByaWdodCA/ICovCi0gICAgICAKLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqIGFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgICogYWRkZW5kcCA9IDA7Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgaW4gcGVfbWtvYmplY3QgaW4gcGVpY29kZS5oLiAgKi8KLXN0YXRpYyBib29sZWFuCi1pbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfTUNPUkVfUlZBOwotfSAgICAgCi0KLQwKLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYmZkICogaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bXM7Ci0gICAgIGFzZWN0aW9uICoqIHNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvdXRwdXRfYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuLlxuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICAKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiAgICAgICBzeW07Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgICByc3RhdDsKLSAgICAgIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgICBsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgcl90eXBlID0gcmVsLT5yX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG8gPSBOVUxMOwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgbXlfbmFtZTsKLSAgCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICAKLSAgICAgIC8qIEdldCB0aGUgaG93dG8gYW5kIGluaXRpYWxpc2UgdGhlIGFkZGVuZC4gICovCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmIGFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbXlfbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgCi0JICAgICAgdmFsID0gKHN5bS0+bl92YWx1ZSAKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQkJbXlfbmFtZSA9ICIqdW5rbm93bioiOwotCSAgICAgIGVsc2UgaWYgKCAgIHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCQlteV9uYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgZWxzZSAKLQkJewotCQkgIHN0YXRpYyBjaGFyIGJ1ZiBbU1lNTk1MRU4gKyAxXTsKLQkJICAKLQkJICBzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQkgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQkgIG15X25hbWUgPSBidWY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBteV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQl9CQotCi0gICAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgICAgLyogRWFjaCBjYXNlIG11c3QgZG8gaXRzIG93biByZWxvY2F0aW9uLCBzZXR0aW5nIHJzdGF0IGFwcHJvcHJpYXRlbHkuICAqLwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JICAKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURToKLQkgIGZwcmludGYgKHN0ZGVyciwgCi0JCSAgIF8oIldhcm5pbmc6IHVuc3VwcG9ydGVkIHJlbG9jICVzIDxmaWxlICVzLCBzZWN0aW9uICVzPlxuIiksIAotCQkgICBob3d0by0+bmFtZSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICAKLQkgIGZwcmludGYgKHN0ZGVyciwic3ltICVsZCAoJXMpLCByX3ZhZGRyICVsZCAoJWx4KVxuIiwgCi0JCSAgIHJlbC0+cl9zeW1uZHgsIG15X25hbWUsIChsb25nKSByZWwtPnJfdmFkZHIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICBicmVhazsKLQkgIAotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQ6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfQUREUjMyOgotCSAgLyogWFhYIGZpeG1lIC0gc2hvdWxkbid0IHRoaXMgYmUgbGlrZSB0aGUgY29kZSBmb3IgdGhlIFJWQSByZWxvYyA/ICovCi0JICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUlZBOgotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQkgICAgKGhvd3RvLCBpbnB1dF9iZmQsCi0JICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCSAgICAgdmFsLCBhZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotCXsKLQkgIC8qIEVtaXQgYSByZWxvYyBpZiB0aGUgYmFja2VuZCB0aGlua3MgaXQgbmVlZHMgaXQuICAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhIChvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcCAob3V0cHV0X2JmZCwgaG93dG8pKQotICAgICAgICAgICAgbWNvcmVfZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkcik7Ci0JfQotICAKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIAotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JICAKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywgbXlfbmFtZSwgaG93dG8tPm5hbWUsIAotCQkgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykge2ludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlO30KLQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAgICAgICAgICAgICAgIDB4MTAwMAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQwKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXBlX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAvKiBXZSBuZWVkIHRvIGhhY2sgYmFkbHkgdG8gaGFuZGxlIGEgUEUgaW1hZ2UgY29ycmVjdGx5LiAgSW4gUEUKLSAgICAgaW1hZ2VzIGNyZWF0ZWQgYnkgdGhlIEdOVSBsaW5rZXIsIHRoZSBvZmZzZXQgdG8gdGhlIENPRkYgaGVhZGVyCi0gICAgIGlzIGFsd2F5cyB0aGUgc2l6ZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlIGluIGltYWdlcwotICAgICBnZW5lcmF0ZWQgYnkgb3RoZXIgUEUgbGlua2Vycy4gIFRoZSBQRSBmb3JtYXQgc3RvcmVzIGEgZm91ciBieXRlCi0gICAgIG9mZnNldCB0byB0aGUgUEUgc2lnbmF0dXJlIGp1c3QgYmVmb3JlIHRoZSBDT0ZGIGhlYWRlciBhdAotICAgICBsb2NhdGlvbiAweDNjIG9mIHRoZSBmaWxlLiAgV2UgcGljayB1cCB0aGF0IG9mZnNldCwgdmVyaWZ5IHRoYXQKLSAgICAgdGhlIFBFIHNpZ25hdHVyZSBpcyB0aGVyZSwgYW5kIHRoZW4gc2V0IG91cnNlbHZlcyB1cCB0byByZWFkIGluCi0gICAgIHRoZSBDT0ZGIGhlYWRlci4gICovCi0gIHsKLSAgICBiZmRfYnl0ZSBleHRfb2Zmc2V0WzRdOwotICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICBiZmRfYnl0ZSBleHRfc2lnbmF0dXJlWzRdOwotICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlOwotCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAweDNjLCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkIChleHRfb2Zmc2V0LCAxLCA0LCBhYmZkKSAhPSA0KQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIAotICAgIG9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X29mZnNldCk7Ci0gICAgCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JfHwgYmZkX3JlYWQgKGV4dF9zaWduYXR1cmUsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCi0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgCi0gICAgc2lnbmF0dXJlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHRfc2lnbmF0dXJlKTsKLQotICAgIGlmIChzaWduYXR1cmUgIT0gMHg0NTUwKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotCi0gICAgLyogSGVyZSBpcyB0aGUgaGFjay4gIGNvZmZfb2JqZWN0X3Agd2FudHMgdG8gcmVhZCBmaWxoc3ogYnl0ZXMgdG8KLSAgICAgICBwaWNrIHVwIHRoZSBDT0ZGIGhlYWRlci4gIFdlIGFkanVzdCBzbyB0aGF0IHRoYXQgd2lsbCB3b3JrLiAgMjAKLSAgICAgICBpcyB0aGUgc2l6ZSBvZiB0aGUgbWlwcyBDT0ZGIGZpbGVoZHIuICAqLwotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGJmZF90ZWxsIChhYmZkKSAtIGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkgKyAyMCksCi0JCSAgU0VFS19TRVQpICE9IDApCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCi0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQwKLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gaW5pdGlhbGlzZSBhbHRlcmJhdGl2ZV90YXJnZXQgZmllbGQuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU07Ci0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3JzIHRoYXQgbGVhZCB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUsIERfUEFHRUQsIChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksIDAsICYgVEFSR0VUX0xJVFRMRV9TWU0pCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSwgRF9QQUdFRCwgKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwgMCwgJiBUQVJHRVRfQklHX1NZTSkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW1pcHMuYyBiL2JmZC9jb2ZmLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2ODdmYi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBFeHRlbmRlZC1Db2ZmIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBPcmlnaW5hbCB2ZXJzaW9uIGJ5IFBlciBCb3RobmVyLgotICAgRnVsbCBzdXBwb3J0IGFkZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL21pcHMuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLQwKLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBtaXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBmaWxlaGRyKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJICAgICAgIFBUUikpOwotc3RhdGljIHZvaWQgbWlwc19hZGp1c3RfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosCi0JCQkJCSAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgYXJlbGVudCAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2FkanVzdF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19nZW5lcmljX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQkgUFRSIGRhdGEsCi0JCQkJCQkJIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCSBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlZmhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlZmxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX2dwcmVsX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlbGhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlbGxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3N3aXRjaF9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJCVBUUiBkYXRhLAotCQkJCQkJCWFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCWJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCQljaGFyICoqZXJyb3IpKTsKLXN0YXRpYyB2b2lkIG1pcHNfcmVsb2NhdGVfaGkgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3JlbG9jICpyZWZoaSwKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmxvLAotCQkJCSAgICAgIGJmZCAqaW5wdXRfYmZkLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF9ieXRlICpjb250ZW50cywKLQkJCQkgICAgICBzaXplX3QgYWRqdXN0LAotCQkJCSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkJCQkgICAgICBib29sZWFuIHBjcmVsKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICBiZmRfYnl0ZSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVhZF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVsYXhfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlbGF4X3BjcmVsMTYgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJCSAgIGFzZWN0aW9uICosCi0JCQkJCSAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotDAotLyogRUNPRkYgaGFzIENPRkYgc2VjdGlvbnMsIGJ1dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbgotICAgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmb3JtYXQuICBFQ09GRiB0YXJnZXRzIHVzZSBzb21lIG9mIHRoZQotICAgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBjb2Zmc3dhcC5oLCBhbmQgc29tZSBvZiB0aGUgZ2VuZXJpYyBDT0ZGCi0gICByb3V0aW5lcyBpbiBjb2ZmZ2VuLmMsIGJ1dCwgdW5saWtlIHRoZSByZWFsIENPRkYgdGFyZ2V0cywgZG8gbm90Ci0gICB1c2UgY29mZmNvZGUuaCBpdHNlbGYuCi0KLSAgIEdldCB0aGUgZ2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBleGNlcHQgZm9yIHRoZSByZWxvYywKLSAgIHN5bWJvbCwgYW5kIGxpbmVubyBvbmVzLiAgR2l2ZSB0aGVtIEVDT0ZGIG5hbWVzLiAgKi8KLSNkZWZpbmUgTUlQU0VDT0ZGCi0jZGVmaW5lIE5PX0NPRkZfUkVMT0NTCi0jZGVmaW5lIE5PX0NPRkZfU1lNQk9MUwotI2RlZmluZSBOT19DT0ZGX0xJTkVOT1MKLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfaW4gbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfaW4gbWlwc19lY29mZl9zd2FwX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX291dAotI2luY2x1ZGUgImNvZmZzd2FwLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2RlZmluZSBFQ09GRl8zMgotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotDAotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2NzIHR5cGVzLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19ob3d0b190YWJsZVtdID0KLXsKLSAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQuICBUaGUgcmVsb2MgcmVhZGluZyBjb2RlIGVuc3VyZXMgdGhhdAotICAgICB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAuYWJzIHNlY3Rpb24sIHdoaWNoIHdpbGwgY2F1c2UKLSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB0byBkbyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLCBub3JtYWxseSBmcm9tIGEgZGF0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZIQUxGLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkhBTEYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wsIG5vcm1hbGx5IGZyb20gYSBkYXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoTUlQU19SX1JFRldPUkQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGV09SRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyNiBiaXQgYWJzb2x1dGUganVtcCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9KTVBBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkpNUEFERFIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCAxNiBiaXRzIG9mIGEgc3ltYm9sIHZhbHVlLiAgSGFuZGxlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgbWlwc19yZWZoaV9yZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGSEksCQkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGSEkiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgbG93IDE2IGJpdHMgb2YgYSBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkxPLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlZmxvX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMTyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVmZXJlbmNlIHRvIGFuIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gIEhhbmRsZWQgYnkgdGhlCi0gICAgIGZ1bmN0aW9uIG1pcHNfZ3ByZWxfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX0dQUkVMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWZlcmVuY2UgdG8gYSBsaXRlcmFsIHVzaW5nIGFuIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4KLSAgICAgSGFuZGxlZCBieSB0aGUgZnVuY3Rpb24gbWlwc19ncHJlbF9yZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVEVSQUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBFTVBUWV9IT1dUTyAoOCksCi0gIEVNUFRZX0hPV1RPICg5KSwKLSAgRU1QVFlfSE9XVE8gKDEwKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhIDE2IGJpdCBQQwotICAgICByZWxhdGl2ZSByZWxvYyByaWdodHNoaWZ0ZWQgdHdpY2UgYXMgdXNlZCBpbiB0aGUgTUlQUyBicmFuY2gKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9QQ1JFTDE2LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBDUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyB0aGUgaGlnaCAxNgotICAgICBiaXRzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MuICBUaGUgbmV4dCByZWxvYyBtdXN0IGJlCi0gICAgIE1JUFNfUl9SRUxMTywgYW5kIHRoZSBhZGRlbmQgaXMgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgdGhlCi0gICAgIHR3byBpbnN0cnVjdGlvbnMsIGp1c3QgYXMgaW4gTUlQU19SX1JFRkhJIGFuZCBNSVBTX1JfUkVGTE8uICBUaGUKLSAgICAgZmluYWwgdmFsdWUgaXMgYWN0dWFsbHkgUEMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIG5vdCB0aGUgTUlQU19SX1JFTEhJIHJlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUxISSwJCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVsaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTEhJIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgdGhlIGxvdyAxNgotICAgICBiaXRzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX1JFTExPLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVsbG9fcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTExPIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwKLSAgRU1QVFlfSE9XVE8gKDE3KSwKLSAgRU1QVFlfSE9XVE8gKDE4KSwKLSAgRU1QVFlfSE9XVE8gKDE5KSwKLSAgRU1QVFlfSE9XVE8gKDIwKSwKLSAgRU1QVFlfSE9XVE8gKDIxKSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhbiBlbnRyeSBpbgotICAgICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scyBpbgotICAgICB0aGUgLnRleHQgc2VjdGlvbi4gIFRoZSBzeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBzdWJ0cmFoZW5kLiAgU2VlIGluY2x1ZGUvY29mZi9taXBzLmggZm9yCi0gICAgIG1vcmUgZGV0YWlscy4gICovCi0gIEhPV1RPIChNSVBTX1JfU1dJVENILAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfc3dpdGNoX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTV0lUQ0giLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jZGVmaW5lIE1JUFNfSE9XVE9fQ09VTlQgXAotICAoc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSkKLQotLyogV2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIHJlbGF4aW5nLCBpdCBtYXkgY2hhbmdlIGEgZXh0ZXJuYWwgUENSRUwxNgotICAgcmVsb2MuICBUaGlzIHR5cGljYWxseSByZXByZXNlbnRzIGFuIGluc3RydWN0aW9uIGxpa2UKLSAgICAgICBiYWwgZm9vCi0gICBXZSBjaGFuZ2UgaXQgdG8KLSAgICAgICAuc2V0ICBub3Jlb3JkZXIKLSAgICAgICBiYWwgICAkTDEKLSAgICAgICBsdWkgICAkYXQsJWhpKGZvbyAtICRMMSkKLSAgICAgJEwxOgotICAgICAgIGFkZGl1ICRhdCwlbG8oZm9vIC0gJEwxKQotICAgICAgIGFkZHUgICRhdCwkYXQsJDMxCi0gICAgICAgamFsciAgJGF0Ci0gICBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhpcyBjaGFuZ2VzIHRoZQotICAgaW5zdHJ1Y3Rpb24gYnkuICAqLwotCi0jZGVmaW5lIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQgKDQgKiA0KQotDAotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBNSVBTX01BR0lDXzE6Ci0gICAgICAvKiBJIGRvbid0IGtub3cgd2hhdCBlbmRpYW5uZXNzIHRoaXMgaW1wbGllcy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19CSUc6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzI6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzM6Ci0gICAgICByZXR1cm4gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRToKLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMjoKLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMzoKLSAgICAgIHJldHVybiBiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCk7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQwKLS8qIFJlbG9jIGhhbmRsaW5nLiAgTUlQUyBFQ09GRiByZWxvY3MgYXJlIHBhY2tlZCBpbnRvIDggYnl0ZXMgaW4KLSAgIGV4dGVybmFsIGZvcm0uICBUaGV5IHVzZSBhIGJpdCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ltYm9sCi0gICBpcyBleHRlcm5hbC4gICovCi0KLS8qIFN3YXAgYSByZWxvYyBpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIGV4dF9wdHIsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIGNvbnN0IFJFTE9DICpleHQgPSAoUkVMT0MgKikgZXh0X3B0cjsKLQotICBpbnRlcm4tPnJfdmFkZHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gKCgoaW50KSBleHQtPnJfYml0c1swXQotCQkJICAgPDwgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHKQotCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1sxXQotCQkJICAgICA8PCBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUcpCi0JCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzJdCi0JCQkgICAgIDw8IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRykpOwotICAgICAgaW50ZXJuLT5yX3R5cGUgPSAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCQk+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRyk7Ci0gICAgICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0JJRykgIT0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gKCgoaW50KSBleHQtPnJfYml0c1swXQotCQkJICAgPDwgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFKQotCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1sxXQotCQkJICAgICA8PCBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEUpCi0JCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzJdCi0JCQkgICAgIDw8IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRSkpOwotICAgICAgaW50ZXJuLT5yX3R5cGUgPSAoKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkJID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfTElUVExFKQotCQkJfCAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRSkKLQkJCSAgIDw8IFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUpKTsKLSAgICAgIGludGVybi0+cl9leHRlcm4gPSAoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFKSAhPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgTUlQU19SX1NXSVRDSCByZWxvYywgb3IgYW4gaW50ZXJuYWwgTUlQU19SX1JFTEhJIG9yCi0gICAgIE1JUFNfUl9SRUxMTyByZWxvYywgcl9zeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBiYXNlIG9mIHRoZSBkaWZmZXJlbmNlIChzZWUKLSAgICAgaW5jbHVkZS9jb2ZmL21pcHMuaCBmb3IgbW9yZSBkZXRhaWxzKS4gIFdlIGNvcHkgc3ltbmR4IGludG8gdGhlCi0gICAgIHJfb2Zmc2V0IGZpZWxkIHNvIGFzIG5vdCB0byBjb25mdXNlIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIGluCi0gICAgIGVjb2ZmLmMuICBJbiBhZGp1c3RfcmVsb2NfaW4gd2UgdGhlbiBjb3B5IHJfb2Zmc2V0IGludG8gdGhlIHJlbG9jCi0gICAgIGFkZGVuZC4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICi0gICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPCi0JICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKSkpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoISBpbnRlcm4tPnJfZXh0ZXJuKTsKLSAgICAgIGludGVybi0+cl9vZmZzZXQgPSBpbnRlcm4tPnJfc3ltbmR4OwotICAgICAgaWYgKGludGVybi0+cl9vZmZzZXQgJiAweDgwMDAwMCkKLQlpbnRlcm4tPnJfb2Zmc2V0IC09IDB4MTAwMDAwMDsKLSAgICAgIGludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0gICAgfQotfQotCi0vKiBTd2FwIGEgcmVsb2Mgb3V0LiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIGludGVybiwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGRzdDsKLSAgbG9uZyByX3N5bW5keDsKLQotICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfZXh0ZXJuCi0JICAgICAgfHwgKGludGVybi0+cl9zeW1uZHggPj0gMCAmJiBpbnRlcm4tPnJfc3ltbmR4IDw9IDEyKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxMTyBvcgotICAgICBNSVBTX1JfUkVMSEkgcmVsb2MsIHdlIGFjdHVhbGx5IHdhbnQgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mCi0gICAgIHJfb2Zmc2V0IG91dCBhcyB0aGUgc3ltYm9sIGluZGV4LiAgVGhpcyB1bmRvZXMgdGhlIGNoYW5nZSBtYWRlIGJ5Ci0gICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSAhPSBNSVBTX1JfU1dJVENICi0gICAgICAmJiAoaW50ZXJuLT5yX2V4dGVybgotCSAgfHwgKGludGVybi0+cl90eXBlICE9IE1JUFNfUl9SRUxISQotCSAgICAgICYmIGludGVybi0+cl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQotICAgIHJfc3ltbmR4ID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUKTsKLSAgICAgIHJfc3ltbmR4ID0gaW50ZXJuLT5yX29mZnNldCAmIDB4ZmZmZmZmOwotICAgIH0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cl92YWRkciwgKGJmZF9ieXRlICopIGV4dC0+cl92YWRkcik7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dC0+cl9iaXRzWzBdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5yX2JpdHNbMV0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPnJfYml0c1syXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+cl9iaXRzWzNdID0gKCgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzNfVFlQRV9TSF9CSUcpCi0JCQkgJiBSRUxPQ19CSVRTM19UWVBFX0JJRykKLQkJCXwgKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTM19FWFRFUk5fQklHIDogMCkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dC0+cl9iaXRzWzBdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5yX2JpdHNbMV0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPnJfYml0c1syXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+cl9iaXRzWzNdID0gKCgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUpCi0JCQkgJiBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRSkKLQkJCXwgKChpbnRlcm4tPnJfdHlwZSA+PiBSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFCi0JCQkgICAgJiBSRUxPQ19CSVRTM19UWVBFSElfTElUVExFKSkKLQkJCXwgKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFIDogMCkpOwotICAgIH0KLX0KLQotLyogRmluaXNoIGNhbm9uaWNhbGl6aW5nIGEgcmVsb2MuICBQYXJ0IG9mIHRoaXMgaXMgZ2VuZXJpYyB0byBhbGwKLSAgIEVDT0ZGIHRhcmdldHMsIGFuZCB0aGF0IHBhcnQgaXMgaW4gZWNvZmYuYy4gIFRoZSByZXN0IGlzIGRvbmUgaW4KLSAgIHRoaXMgYmFja2VuZCByb3V0aW5lLiAgSXQgbXVzdCBmaWxsIGluIHRoZSBob3d0byBmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2FkanVzdF9yZWxvY19pbiAoYWJmZCwgaW50ZXJuLCBycHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBhcmVsZW50ICpycHRyOwotewotICBpZiAoaW50ZXJuLT5yX3R5cGUgPiBNSVBTX1JfU1dJVENIKQotICAgIGFib3J0ICgpOwotCi0gIGlmICghIGludGVybi0+cl9leHRlcm4KLSAgICAgICYmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfR1BSRUwKLQkgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9MSVRFUkFMKSkKLSAgICBycHRyLT5hZGRlbmQgKz0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotCi0gIC8qIElmIHRoZSB0eXBlIGlzIE1JUFNfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0gICAgIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX0lHTk9SRSkKLSAgICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCi0gIC8qIElmIHRoaXMgaXMgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCB3ZSB3YW50IHRoZSBhZGRlbmQgZmllbGQgb2YgdGhlIEJGRCByZWxvY3RvCi0gICAgIGhvbGQgdGhlIHZhbHVlIHdoaWNoIHdhcyBvcmlnaW5hbGx5IGluIHRoZSBzeW1uZHggZmllbGQgb2YgdGhlCi0gICAgIGludGVybmFsIE1JUFMgRUNPRkYgcmVsb2MuICBUaGlzIHZhbHVlIHdhcyBjb3BpZWQgaW50bwotICAgICBpbnRlcm4tPnJfb2Zmc2V0IGJ5IG1pcHNfc3dhcF9yZWxvY19pbiwgYW5kIGhlcmUgd2UgY29weSBpdCBpbnRvCi0gICAgIHRoZSBhZGRlbmQgZmllbGQuICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAotICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgotCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISQotCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTykpKQotICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl9vZmZzZXQ7Ci0KLSAgcnB0ci0+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIE1ha2UgYW55IGFkanVzdG1lbnRzIG5lZWRlZCB0byBhIHJlbG9jIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIE5vbmUKLSAgIGFyZSBuZWVkZWQgZm9yIE1JUFMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGFyZWxlbnQgKnJlbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIC8qIEZvciBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxISSBvcgotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIHdlIG11c3QgY29weSByZWwtPmFkZGVuZCBpbnRvCi0gICAgIGludGVybi0+cl9vZmZzZXQuICBUaGlzIHdpbGwgdGhlbiBiZSB3cml0dGVuIG91dCBhcyB0aGUgc3ltYm9sCi0gICAgIGluZGV4IGJ5IG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQuICBUaGlzIG9wZXJhdGlvbiBwYXJhbGxlbHMgdGhlCi0gICAgIGFjdGlvbiBvZiBtaXBzX2FkanVzdF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICi0gICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJCi0JICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPKSkpCi0gICAgaW50ZXJuLT5yX29mZnNldCA9IHJlbC0+YWRkZW5kOwotfQotCi0vKiBFQ09GRiByZWxvY3MgYXJlIGVpdGhlciBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMsIG9yIGFnYWluc3QKLSAgIHNlY3Rpb25zLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgdGhlIHJlbG9jCi0gICBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcgaGFzIGdpdmVuIHVzIGFueQotICAgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvIGJlIGFnYWluc3QgdGhlCi0gICBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZwotICAgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbCBhbGwgYmUgZG9uZSBhdAotICAgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlIGludG8KLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLAotCQkgICAgcmVsb2NfZW50cnksCi0JCSAgICBzeW1ib2wsCi0JCSAgICBkYXRhLAotCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsCi0JCSAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBEbyBhIFJFRkhJIHJlbG9jYXRpb24uICBUaGlzIGhhcyB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYQotICAgUkVGTE8gcmVsb2MsIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBSRUZMTyB0byB0aGUgUkVGSEkuCi0gICBIZXJlIHdlIGp1c3Qgc2F2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZDsgd2UgZG8gdGhlIGFjdHVhbAotICAgcmVsb2NhdGlvbiB3aGVuIHdlIHNlZSB0aGUgUkVGTE8uICBNSVBTIEVDT0ZGIHJlcXVpcmVzIHRoYXQgdGhlCi0gICBSRUZMTyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIFJFRkhJLiAgQXMgYSBHTlUgZXh0ZW5zaW9uLCB3ZSBwZXJtaXQKLSAgIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkgcmVsb2NzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBMTwotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpCi17Ci0gIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotICBiZmRfYnl0ZSAqYWRkcjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGEgc3RhdGljIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX2hpICptaXBzX3JlZmhpX2xpc3Q7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbWlwc19oaSAqbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVGTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gIG1pcHNfcmVmaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUZMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgaW5wbGFjZQotICAgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFRkhJCi0gICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobWlwc19yZWZoaV9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkgKmw7Ci0KLSAgICAgIGwgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotCi0JICAvKiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAotCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUZMTyBpdHNlbGYsIGV4Y2VwdAotCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCi0JICAgICBSRUZISS4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotCQkgICAmIDB4ZmZmZik7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCi0JICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCi0JICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKLQkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCi0JICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KLQkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0JICAgIHZhbCAtPSAweDEwMDAwOwotCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0JICAgIHZhbCArPSAweDEwMDAwOwotCi0JICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbWlwc19yZWZoaV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBSRUZMTyByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIG1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBhIEdQUkVMIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgMTYgYml0IHZhbHVlIHdoaWNoIG11c3QgYmVjb21lCi0gICB0aGUgb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19ncHJlbF9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfdm1hIGdwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFQ09GRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiByZWxvY2F0ZWFibGUgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBncCB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVDT0ZGCi0gICAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMAotICAgICAgJiYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApKQotICAgIHsKLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgIT0gZmFsc2UpCi0JewotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgYXN5bWJvbCAqKnN5bTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCSAgc3ltID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLQotCSAgaWYgKHN5bSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLQkgICAgaSA9IGNvdW50OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bSsrKQotCQl7Ci0JCSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqc3ltKTsKLQkJICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOwotCQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID49IGNvdW50KQotCSAgICB7Ci0JICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotCSAgICAgIGdwID0gNDsKLQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgICAgICplcnJvcl9tZXNzYWdlID0KLQkJKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIpOwotCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgKyByZWxvY19lbnRyeS0+YWRkZW5kKSAmIDB4ZmZmZjsKLSAgaWYgKHZhbCAmIDB4ODAwMCkKLSAgICB2YWwgLT0gMHgxMDAwMDsKLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KLSAgaWYgKHZhbCA+PSAweDgwMDAgJiYgdmFsIDwgMHhmZmZmODAwMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUkVMSEkgcmVsb2NhdGlvbi4gIFdlIGRvIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIFJFTExPCi0gICByZWxvYywganVzdCBhcyBSRUZISSBhbmQgUkVGTE8gYXJlIGRvbmUgdG9nZXRoZXIuICBSRUxISSBhbmQgUkVMTE8KLSAgIGFyZSBDeWdudXMgZXh0ZW5zaW9ucyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudAotICAgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gICovCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfaGkgKm1pcHNfcmVsaGlfbGlzdDsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19yZWxoaV9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtaXBzX2hpICpuOwotCi0gIC8qIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHRoZW4gaXQgaXMgY29ycmVjdAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgY2FzZSBpcwotICAgICB3aGVuIHdlIGFyZSByZWxheGluZywgYW5kIHRoYXQgaXMgaGFuZGxlZCBlbnRpcmVseSBieQotICAgICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gYW5kIG5ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24uICAqLwotICBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gIElmIHdlJ3JlIHJlbG9jYXRpbmcsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVMTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlbGhpX2xpc3Q7Ci0gIG1pcHNfcmVsaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUxMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgUEMKLSAgIHJlbGF0aXZlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZSBSRUxISQotICAgcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlbGxvX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG1pcHNfcmVsaGlfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX2hpICpsOwotCi0gICAgICBsID0gbWlwc19yZWxoaV9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKLQotCSAgLyogRG8gdGhlIFJFTEhJIHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QKLQkgICAgIG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgUkVMTE8gaXRzZWxmLCBleGNlcHQKLQkgICAgIHdoZXJlIHRvIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZQotCSAgICAgUkVMSEkuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpOwotCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKLQkgIHZhbCArPSBsLT5hZGRlbmQ7Ci0KLQkgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgbWFrZSB2YWwgUEMgcmVsYXRpdmUuICBJZiB0aGUKLQkgICAgIHN5bWJvbCBpcyBub3QgZGVmaW5lZCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMsIGJlY2F1c2UKLQkgICAgIHdlIGRvbid0IHdhbnQgdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSB0byBpbmNvcnBvcmF0ZQotCSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jLiAgKi8KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKQotCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpKQotCSAgICB2YWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLQkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cwotCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAotCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCi0JICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZwotCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0JICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgLT0gMHgxMDAwMDsKLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG1pcHNfcmVsaGlfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHRoZW4gaXQgaXMgY29ycmVjdAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgY2FzZSBpcwotICAgICB3aGVuIHdlIGFyZSByZWxheGluZywgYW5kIHRoYXQgaXMgaGFuZGxlZCBlbnRpcmVseSBieQotICAgICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gYW5kIG5ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24uICAqLwotICBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGRvZXMgbm90IGhhbmRsZSBwY3JlbF9vZmZzZXQgcmVsb2NhdGlvbnMKLSAgICAgY29ycmVjdGx5IHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBmaWxlLCBzbyBoYW5kbGUgdGhlbQotICAgICBkaXJlY3RseSBoZXJlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIFJFTExPIHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHRoZSBNSVBTX1JfU1dJVENIIHJlbG9jLiAgVGhpcwotICAgc3BlY2lhbCByZWxvYyBpcyBub3JtYWxseSBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwgYW5kIG9ubHkKLSAgIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgd2hlbiByZWxheGluZy4gIFdlIGRvbid0IHdhbnQKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gdG8gdGFtcGVyIHdpdGggaXQgYXQgYWxsLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3N3aXRjaF9yZWxvYyAoYWJmZCwKLQkJICAgcmVsb2NfZW50cnksCi0JCSAgIHN5bWJvbCwKLQkJICAgZGF0YSwKLQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwKLQkJICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IG1pcHNfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhBTEY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRldPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9KTVBBRERSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfR1BSRUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1BDUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVMSEk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFTExPOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9TV0lUQ0g7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmbWlwc19ob3d0b190YWJsZVttaXBzX3R5cGVdOwotfQotDAotLyogQSBoZWxwZXIgcm91dGluZSBmb3IgbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIFJFRkhJCi0gICBhbmQgUkVMSEkgcmVsb2NhdGlvbnMuICBUaGUgUkVGSEkgcmVsb2NhdGlvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEKLSAgIFJFRkxPIHJlbG9jYXRpb24gKGFuZCBSRUxISSBieSBhIFJFTExPKSwgYW5kIHRoZSBhZGRlbmQgdXNlZCBpcwotICAgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgYm90aCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19yZWxvY2F0ZV9oaSAocmVmaGksIHJlZmxvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGp1c3QsCi0JCSAgcmVsb2NhdGlvbiwgcGNyZWwpCi0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmaGk7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmbG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzaXplX3QgYWRqdXN0OwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJvb2xlYW4gcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0KLSAgaWYgKHJlZmhpID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJICAgICBjb250ZW50cyArIGFkanVzdCArIHJlZmhpLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLSAgaWYgKHJlZmxvID09IE5VTEwpCi0gICAgdmFsbG8gPSAwOwotICBlbHNlCi0gICAgdmFsbG8gPSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJIGNvbnRlbnRzICsgYWRqdXN0ICsgcmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpCi0JICAgICAmIDB4ZmZmZik7Ci0gCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0gIHZhbCArPSByZWxvY2F0aW9uOwotCi0gIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQgdmFsdWUuCi0gICAgIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMgcmVxdWlyZXMgYW4KLSAgICAgYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZCB0byBtYWtlIHRoaXMKLSAgICAgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UgdG9vayBmcm9tIHRoZSBkYXRhLAotICAgICBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0gIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0gICAgdmFsIC09IDB4MTAwMDA7Ci0KLSAgaWYgKHBjcmVsKQotICAgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgKyAocmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyBhZGp1c3QpKTsKLQotICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLSAgICB2YWwgKz0gMHgxMDAwMDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sCi0JICAgICAgY29udGVudHMgKyBhZGp1c3QgKyByZWZoaS0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgc2VjdGlvbiB3aGlsZSBsaW5raW5nIGEgTUlQUyBFQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb247Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgc2l6ZV90IGFkanVzdDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYm9vbGVhbiBnb3RfbG87Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBsb19pbnRfcmVsOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyKTsKLQotICAvKiBXZSBrZWVwIGEgdGFibGUgbWFwcGluZyB0aGUgc3ltbmR4IGZvdW5kIGluIGFuIGludGVybmFsIHJlbG9jIHRvCi0gICAgIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIHVwIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUgZWFjaCB0aW1lLiAgKi8KLSAgc3ltbmR4X3RvX3NlY3Rpb24gPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbjsKLSAgaWYgKHN5bW5keF90b19zZWN0aW9uID09IChhc2VjdGlvbiAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbiA9ICgoYXNlY3Rpb24gKiopCi0JCQkgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAoTlVNX1JFTE9DX1NFQ1RJT05TCi0JCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgICAgIGlmICghc3ltbmR4X3RvX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX05PTkVdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fVEVYVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIudGV4dCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9SREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9TREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2RhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0JTU10gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2JzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9CU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmJzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9JTklUXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5pbml0Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDhdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDgiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUNF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0NCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9YREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9QREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IE5VTEw7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMCkKLSAgICBncF91bmRlZmluZWQgPSB0cnVlOwotICBlbHNlCi0gICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0KLSAgZ290X2xvID0gZmFsc2U7Ci0KLSAgYWRqdXN0ID0gMDsKLQotICBpZiAoZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pID09IE5VTEwpCi0gICAgb2Zmc2V0cyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBvZmZzZXRzID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5vZmZzZXRzOwotCi0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIGV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBib29sZWFuIHVzZV9sbyA9IGZhbHNlOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYXNlY3Rpb24gKnMgPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIGlmICghIGdvdF9sbykKLQltaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGlucHV0X2JmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOwotICAgICAgZWxzZQotCXsKLQkgIGludF9yZWwgPSBsb19pbnRfcmVsOwotCSAgZ290X2xvID0gZmFsc2U7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZQotCQkgIDwgc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSk7Ci0KLSAgICAgIC8qIFRoZSBSRUZISSBhbmQgUkVMSEkgcmVsb2NzIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcuICB0aGV5Ci0JIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBSRUZMTyBvciBSRUxMTyByZWxvYywgcmVzcGVjdGl2ZWx5LCBhbmQKLQkgdGhlIGFkZGVuZCBpcyBmb3JtZWQgZnJvbSBib3RoIHJlbG9jcy4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JewotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpsb19leHRfcmVsOwotCi0JICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIHBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFJFRkhJCi0gICAgICAgICAgICAgb3IgUkVMSEkgcmVsb2NzIGJlZm9yZSB0aGUgUkVGTE8gb3IgUkVMTE8gcmVsb2MuICBUaGlzCi0gICAgICAgICAgICAgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcyBpdHNlbGYuICAqLwotCSAgZm9yIChsb19leHRfcmVsID0gZXh0X3JlbCArIDE7Ci0JICAgICAgIGxvX2V4dF9yZWwgPCBleHRfcmVsX2VuZDsKLQkgICAgICAgbG9fZXh0X3JlbCsrKQotCSAgICB7Ci0JICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChpbnB1dF9iZmQsIChQVFIpIGxvX2V4dF9yZWwsCi0JCQkJCSZsb19pbnRfcmVsKTsKLQkgICAgICBpZiAobG9faW50X3JlbC5yX3R5cGUgIT0gaW50X3JlbC5yX3R5cGUpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChsb19leHRfcmVsIDwgZXh0X3JlbF9lbmQKLQkgICAgICAmJiAobG9faW50X3JlbC5yX3R5cGUKLQkJICA9PSAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JCSAgICAgID8gTUlQU19SX1JFRkxPCi0JCSAgICAgIDogTUlQU19SX1JFTExPKSkKLQkgICAgICAmJiBpbnRfcmVsLnJfZXh0ZXJuID09IGxvX2ludF9yZWwucl9leHRlcm4KLQkgICAgICAmJiBpbnRfcmVsLnJfc3ltbmR4ID09IGxvX2ludF9yZWwucl9zeW1uZHgpCi0JICAgIHsKLQkgICAgICB1c2VfbG8gPSB0cnVlOwotCSAgICAgIGlmIChsb19leHRfcmVsID09IGV4dF9yZWwgKyAxKQotCQlnb3RfbG8gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBob3d0byA9ICZtaXBzX2hvd3RvX3RhYmxlW2ludF9yZWwucl90eXBlXTsKLQotICAgICAgLyogVGhlIFNXSVRDSCByZWxvYyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgVGhpcyByZWxvYyBpcwotCSBtYXJrcyB0aGUgbG9jYXRpb24gb2YgYSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvcnRpb25zIG9mIGFuCi0JIG9iamVjdCBmaWxlLiAgVGhlIHN5bWJvbCBpbmRleCBkb2VzIG5vdCByZWZlcmVuY2UgYSBzeW1ib2wsCi0JIGJ1dCBpcyBhY3R1YWxseSB0aGUgb2Zmc2V0IGZyb20gdGhlIHJlbG9jIHRvIHRoZSBzdWJ0cmFoZW5kCi0JIG9mIHRoZSBkaWZmZXJlbmNlLiAgVGhpcyByZWxvYyBpcyBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwKLQkgYW5kIG5lZWRzIG5vIGZ1cnRoZXIgYWRqdXN0bWVudCwgdW5sZXNzIHdlIGFyZSByZWxheGluZy4gIElmCi0JIHdlIGFyZSByZWxheGluZywgd2UgbWF5IGhhdmUgdG8gYWRkIGluIGFuIG9mZnNldC4gIFNpbmNlIG5vCi0JIHN5bWJvbHMgYXJlIGludm9sdmVkIGluIHRoaXMgcmVsb2MsIHdlIGhhbmRsZSBpdCBjb21wbGV0ZWx5Ci0JIGhlcmUuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9TV0lUQ0gpCi0JewotCSAgaWYgKG9mZnNldHMgIT0gTlVMTAotCSAgICAgICYmIG9mZnNldHNbaV0gIT0gMCkKLQkgICAgewotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkgIChiZmRfdm1hKSBvZmZzZXRzW2ldLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIGFkanVzdAotCQkJCQkgICArIGludF9yZWwucl92YWRkcgotCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIEJGRF9BU1NFUlQgKHIgPT0gYmZkX3JlbG9jX29rKTsKLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChpbnRfcmVsLnJfZXh0ZXJuKQotCXsKLQkgIGggPSBzeW1faGFzaGVzW2ludF9yZWwucl9zeW1uZHhdOwotCSAgLyogSWYgaCBpcyBOVUxMLCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wgd2hpY2ggd2UgdGhvdWdodCB3YXMganVzdCBhIGRlYnVnZ2luZwotCSAgICAgc3ltYm9sLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gICovCi0JICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludF9yZWwucl9zeW1uZHggPCAwIHx8IGludF9yZWwucl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCSAgICBzID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgcyA9IHN5bW5keF90b19zZWN0aW9uW2ludF9yZWwucl9zeW1uZHhdOwotCi0JICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBUaGUgR1BSRUwgcmVsb2MgdXNlcyBhbiBhZGRlbmQ6IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBHUAotCSB2YWx1ZXMuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9HUFJFTAotCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX0xJVEVSQUwpCi0JYWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZ3BfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGluZm8sIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBHUCBub3QgZGVmaW5lZCIpLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KLQkgICAgICBncCA9IDQ7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgICAgICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhlIGN1cnJlbnQKLQkJIGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkgSU5QVVRfU0VDVElPTi0+dm1hIGFuZCB0aGUgR1AgdmFsdWUgb2YgSU5QVVRfQkZELiAgV2UKLQkJIG11c3QgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkJIGZpbmFsIGRlZmluaXRpb24gKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pCi0JCSBhbmQgdGhlIEdQIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCi0JICAgICAgYWRkZW5kID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgLSBncDsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sLiAgVGhlCi0JCSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgc2ltcGx5IHRoZQotCQkgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseSB6ZXJvKS4gIFdlCi0JCSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoaXMgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0JCSBkZWZpbmVkIHN5bWJvbCwgc28gd2Ugd2FudCB0aGUgaW5zdHJ1Y3Rpb24gdG8gaG9sZAotCQkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmluYWwgZGVmaW5pdGlvbiBvZiB0aGUKLQkJIHN5bWJvbCAod2hpY2ggd2lsbCBlbmQgdXAgaW4gUkVMT0NBVElPTikgYW5kIHRoZSBHUAotCQkgdmFsdWUgb2YgT1VUUFVUX0JGRCAod2hpY2ggaXMgaW4gR1ApLiAgKi8KLQkgICAgICBhZGRlbmQgPSAtIGdwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBvciBjb21tb24KLQkJIHN5bWJvbC4gIFRoZSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLQkJIHNpbXBseSB0aGUgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseQotCQkgemVybykuICBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2UKLQkJIGFyZW4ndCBnb2luZyB0byBkZWZpbmUgdGhpcyBzeW1ib2wsIHNvIHdlIGp1c3QgbGVhdmUKLQkJIHRoZSBpbnN0cnVjdGlvbiBhbG9uZS4gICovCi0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBtaXBzX3JlbGF4X3NlY3Rpb24gbWF5IGhhdmUgc2V0Ci0JIG9mZnNldHNbaV0gdG8gc29tZSB2YWx1ZS4gIEEgdmFsdWUgb2YgMSBtZWFucyB3ZSBtdXN0IGV4cGFuZAotCSBhIFBDIHJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gb2Ygc2VxdWVuY2UsCi0JIGFuZCBhbnkgb3RoZXIgdmFsdWUgaXMgYW4gYWRkZW5kLiAgKi8KLSAgICAgIGlmIChvZmZzZXRzICE9IE5VTEwKLQkgICYmIG9mZnNldHNbaV0gIT0gMCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0JICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUENSRUwxNgotCQkgICAgICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkKLQkJICAgICAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgIGlmIChvZmZzZXRzW2ldICE9IDEpCi0JICAgIGFkZGVuZCArPSBvZmZzZXRzW2ldOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgKmhlcmU7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfZXh0ZXJuCi0JCQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIE1vdmUgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB1cC4gICovCi0JICAgICAgaGVyZSA9IChjb250ZW50cwotCQkgICAgICArIGFkanVzdAotCQkgICAgICArIGludF9yZWwucl92YWRkcgotCQkgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgbWVtbW92ZSAoaGVyZSArIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQsIGhlcmUsCi0JCSAgICAgICAoc2l6ZV90KSAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplCi0JCQkJIC0gKGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJICAgICAgIAotCSAgICAgIC8qIEdlbmVyYXRlIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgICBpZiAoISBtaXBzX3JlbGF4X3BjcmVsMTYgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJaCwgaGVyZSwKLQkJCQkJKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJCQkgKyAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkKLQkJCQkJICsgYWRqdXN0KSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIFdlIG11c3QgYWRqdXN0IGV2ZXJ5dGhpbmcgZWxzZSB1cCBhIG5vdGNoLiAgKi8KLQkgICAgICBhZGp1c3QgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotCSAgICAgIC8qIG1pcHNfcmVsYXhfcGNyZWwxNiBoYW5kbGVzIGFsbCB0aGUgZGV0YWlscyBvZiB0aGlzCi0JCSByZWxvY2F0aW9uLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIC50ZXh0Ci0JIHNlZ21lbnQsIHdlIG1heSBuZWVkIHRvIGFkanVzdCBpdCBpZiBzb21lIGJyYW5jaGVzIGhhdmUgYmVlbgotCSBleHBhbmRlZC4gIFRoZSByZWxvYyB0eXBlcyB3aGljaCBhcmUgbGlrZWx5IHRvIG9jY3VyIGluIHRoZQotCSAudGV4dCBzZWN0aW9uIGFyZSBoYW5kbGVkIGVmZmljaWVudGx5IGJ5IG1pcHNfcmVsYXhfc2VjdGlvbiwKLQkgYW5kIHRodXMgZG8gbm90IG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLiAgKi8KLSAgICAgIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdCAhPSBOVUxMCi0JICAmJiAhIGludF9yZWwucl9leHRlcm4KLQkgICYmIGludF9yZWwucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUCi0JICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJICAgICAgIi50ZXh0IikgIT0gMAotCSAgICAgIHx8IChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUENSRUwxNgotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9TV0lUQ0gKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKLQl7Ci0JICBiZmRfdm1hIGFkcjsKLQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmE7Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBhZGRlbmQgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgd2UgbmVlZAotCSAgICAgdG8gYWRqdXN0IHRoZSBhZGRyZXNzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZXT1JEKTsKLQotCSAgYWRyID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgIChjb250ZW50cwotCQkJICAgICArIGFkanVzdAotCQkJICAgICArIGludF9yZWwucl92YWRkcgotCQkJICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCi0JICBmb3IgKGEgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdDsKLQkgICAgICAgYSAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMOwotCSAgICAgICBhID0gYS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChhZHIgPj0gYS0+c3RhcnQgJiYgYWRyIDwgYS0+ZW5kKQotCQlhZGRlbmQgKz0gYS0+YWRqdXN0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0IGNvbnZlcnQKLQkgICAgIHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIG91dHB1dC4gIENvbnZlcnQKLQkJICAgICB0aGUgcmVsb2MgZnJvbSBiZWluZyBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gYmVpbmcKLQkJICAgICBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotCQkgIC8qIENsZWFyIHRoZSByX2V4dGVybiBiaXQuICAqLwotCQkgIGludF9yZWwucl9leHRlcm4gPSAwOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCi0JCSAgcyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0KLQkJICBpbnRfcmVsLnJfc3ltbmR4ID0gLTE7Ci0JCSAgc3dpdGNoIChuYW1lWzFdKQotCQkgICAgewotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2knOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncyc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAgICAgCi0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIC8qIEFkZCB0aGUgc2VjdGlvbiBWTUEgYW5kIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgcy0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAvKiBGb3IgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLCB0aGUgb2JqZWN0IGZpbGUKLQkJICAgICBjdXJyZW50bHkgaG9sZHMganVzdCB0aGUgYWRkZW5kLiAgV2UgbXVzdCBhZGp1c3QKLQkJICAgICBieSB0aGUgYWRkcmVzcyB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgewotCQkgICAgICByZWxvY2F0aW9uIC09IGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotCQkgICAgICAvKiBJZiB3ZSBhcmUgY29udmVydGluZyBhIFJFTEhJIG9yIFJFTExPIHJlbG9jCi0JCQkgZnJvbSBiZWluZyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0bwotCQkJIGJlaW5nIGFnYWluc3QgYSBzZWN0aW9uLCB3ZSBtdXN0IHB1dCBhCi0JCQkgc3BlY2lhbCB2YWx1ZSBpbnRvIHRoZSByX29mZnNldCBmaWVsZC4gIFRoaXMKLQkJCSB2YWx1ZSBpcyB0aGUgb2xkIGFkZGVuZC4gIFRoZSByX29mZnNldCBmb3IKLQkJCSBib3RoIHRoZSBSRUxISSBhbmQgUkVMTE8gcmVsb2NzIGFyZSB0aGUgc2FtZSwKLQkJCSBhbmQgd2Ugc2V0IGJvdGggd2hlbiB3ZSBzZWUgUkVMSEkuICAqLwotCQkgICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCQkJewotCQkJICBsb25nIGFkZGhpLCBhZGRsbzsKLQotCQkJICBhZGRoaSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgKGNvbnRlbnRzCi0JCQkJCSAgICAgICArIGFkanVzdAotCQkJCQkgICAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JCQkgIGFkZGhpICY9IDB4ZmZmZjsKLQkJCSAgaWYgKGFkZGhpICYgMHg4MDAwKQotCQkJICAgIGFkZGhpIC09IDB4MTAwMDA7Ci0JCQkgIGFkZGhpIDw8PSAxNjsKLQotCQkJICBpZiAoISB1c2VfbG8pCi0JCQkgICAgYWRkbG8gPSAwOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQkgIChjb250ZW50cwotCQkJCQkJICAgKyBhZGp1c3QKLQkJCQkJCSAgICsgbG9faW50X3JlbC5yX3ZhZGRyCi0JCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCQkJICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCQkJICAgICAgaWYgKGFkZGxvICYgMHg4MDAwKQotCQkJCWFkZGxvIC09IDB4MTAwMDA7Ci0KLQkJCSAgICAgIGxvX2ludF9yZWwucl9vZmZzZXQgPSBhZGRoaSArIGFkZGxvOwotCQkJICAgIH0KLQotCQkJICBpbnRfcmVsLnJfb2Zmc2V0ID0gYWRkaGkgKyBhZGRsbzsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGggPSBOVUxMOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2hhbmdlIHRoZSBzeW1uZHggdmFsdWUgdG8gdGhlIHJpZ2h0IG9uZSBmb3IgdGhlCi0JCSAgICAgb3V0cHV0IEJGRC4gICovCi0JCSAgaW50X3JlbC5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaW50X3JlbC5yX3N5bW5keCA9IDA7Ci0JCSAgICB9Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBBZGp1c3QgdGhlCi0JCSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHMtPnZtYSk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiArPSBhZGRlbmQ7Ci0JICBhZGRlbmQgPSAwOwotCi0JICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UKLQkgICAgIHRvIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBzZWN0aW9uIGFuZCBpbmNsdWRpbmcgdGhlCi0JICAgICByZWZlcmVuY2UgdG8gdGhlIG5ldyBhZGRyZXNzLiAgSG93ZXZlciwgZXh0ZXJuYWwgUkVMSEkKLQkgICAgIGFuZCBSRUxMTyByZWxvY3MgYXJlIFBDIHJlbGF0aXZlLCBidXQgZG9uJ3QgaW5jbHVkZSBhbnkKLQkgICAgIHJlZmVyZW5jZSB0byB0aGUgYWRkcmVzcy4gIFRoZSBhZGRlbmQgaXMgbWVyZWx5IGFuCi0JICAgICBhZGRlbmQuICAqLwotCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZQotCSAgICAgICYmICghIGludF9yZWwucl9leHRlcm4KLQkJICB8fCAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCi0JCSAgICAgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgLyogQWRqdXN0IHRoZSBjb250ZW50cy4gICovCi0JICBpZiAocmVsb2NhdGlvbiA9PSAwKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUZISQotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSkKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSAgICAoY29udGVudHMKLQkJCQkJICAgICArIGFkanVzdAotCQkJCQkgICAgICsgaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQkgICAgdXNlX2xvID8gJmxvX2ludF9yZWwgOiBOVUxMLAotCQkJCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICBhZGp1c3QsIHJlbG9jYXRpb24sCi0JCQkJICAgIGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzcy4gICovCi0JICBpbnRfcmVsLnJfdmFkZHIgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBTYXZlIHRoZSBjaGFuZ2VkIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGlucHV0X2JmZCwgJmludF9yZWwsIChQVFIpIGV4dF9yZWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhcmUgcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uICAqLwotCSAgICAgIHJlbG9jYXRpb24gPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcy0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcy0+dm1hKTsKLQotCSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaXMgYWxyZWFkeSBjb3JyZWN0IGluIHRoZSBvYmplY3QKLQkJIGZpbGUuICBNYWtlIGl0IGxvb2sgbGlrZSBhIHBjcmVsX29mZnNldCByZWxvY2F0aW9uIGJ5Ci0JCSBhZGRpbmcgaW4gdGhlIHN0YXJ0IGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0JCXsKLQkJICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJIHx8ICEgdXNlX2xvKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCSAgZWxzZQotCQkgICAgcmVsb2NhdGlvbiArPSBsb19pbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRkhJCi0JICAgICAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJKQotCSAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsCi0JCQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywKLQkJCQkJICAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSAgICsgYWRqdXN0KSwKLQkJCQkJICByZWxvY2F0aW9uLAotCQkJCQkgIGFkZGVuZCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQl1c2VfbG8gPyAmbG9faW50X3JlbCA6IE5VTEwsCi0JCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRqdXN0LAotCQkJCXJlbG9jYXRpb24sCi0JCQkJaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBNSVBTX1JfSk1QQUREUiByZXF1aXJlcyBwZWN1bGlhciBvdmVyZmxvdyBkZXRlY3Rpb24uICBUaGUKLQkgaW5zdHJ1Y3Rpb24gcHJvdmlkZXMgYSAyOCBiaXQgYWRkcmVzcyAodGhlIHR3byBsb3dlciBiaXRzIGFyZQotCSBpbXBsaWNpdCB6ZXJvZXMpIHdoaWNoIGlzIGNvbWJpbmVkIHdpdGggdGhlIHVwcGVyIGZvdXIgYml0cwotCSBvZiB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2sKLQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9KTVBBRERSCi0JICAmJiAoKChyZWxvY2F0aW9uCi0JCSsgYWRkZW5kCi0JCSsgKGludF9yZWwucl9leHRlcm4gPyAwIDogcy0+dm1hKSkKLQkgICAgICAgJiAweGYwMDAwMDAwKQotCSAgICAgICE9ICgoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKQotCQkgICArIGFkanVzdCkKLQkJICAmIDB4ZjAwMDAwMDApKSkKLQlyID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaW50X3JlbC5yX2V4dGVybikKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCWludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCBpbiB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICpzZWN0aW9uX3RkYXRhOwotCi0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gIGlmIChzZWN0aW9uX3RkYXRhID09IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgICBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+b2Zmc2V0cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotCi0gICAgICBleHRlcm5hbF9yZWxvY3Nfc2l6ZSA9IChlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZQotCQkJICAgICAgKiBzZWMtPnJlbG9jX2NvdW50KTsKLQotICAgICAgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID0KLQkoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgICAgIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBleHRlcm5hbF9yZWxvY3Nfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MsIDEsCi0JCQlleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgYWJmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsYXggYSBzZWN0aW9uIHdoZW4gbGlua2luZyBhIE1JUFMgRUNPRkYgZmlsZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGVtYmVkZGVkIFBJQyBjb2RlLCB3aGljaCBhbHdheXMgdXNlcyBQQyByZWxhdGl2ZSBicmFuY2hlcyB3aGljaAotICAgb25seSBoYXZlIGFuIDE4IGJpdCByYW5nZSBvbiBNSVBTLiAgSWYgYSBicmFuY2ggaXMgbm90IGluIHJhbmdlLCB3ZQotICAgZ2VuZXJhdGUgYSBsb25nIGluc3RydWN0aW9uIHNlcXVlbmNlIHRvIGNvbXBlbnNhdGUuICBFYWNoIHRpbWUgd2UKLSAgIGZpbmQgYSBicmFuY2ggdG8gZXhwYW5kLCB3ZSBoYXZlIHRvIGNoZWNrIGFsbCB0aGUgb3RoZXJzIGFnYWluIHRvCi0gICBtYWtlIHN1cmUgdGhleSBhcmUgc3RpbGwgaW4gcmFuZ2UuICBUaGlzIGlzIHNsb3csIGJ1dCBpdCBvbmx5IGhhcwotICAgdG8gYmUgZG9uZSB3aGVuIC1yZWxheCBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGZpZ3VyZXMgb3V0IHdoaWNoIGJyYW5jaGVzIG5lZWQgdG8gZXhwYW5kOyB0aGUgYWN0dWFsCi0gICBleHBhbnNpb24gaXMgZG9uZSBpbiBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gd2hlbiB0aGUgc2VjdGlvbgotICAgY29udGVudHMgYXJlIHJlbG9jYXRlZC4gIFRoZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIG9mZnNldHMKLSAgIGZpZWxkIG9mIHRoZSBlY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gIEFuIG9mZnNldCBvZiAxIG1lYW5zCi0gICB0aGF0IHRoZSBicmFuY2ggbXVzdCBiZSBleHBhbmRlZCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCAoc3VjaCBhbiBvZmZzZXQgd2lsbCBvbmx5IG9jY3VyIGZvciBhIFBDIHJlbGF0aXZlCi0gICBicmFuY2ggdG8gYW4gZXh0ZXJuYWwgc3ltYm9sKS4gIEFueSBvdGhlciBvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlCi0gICBvZiBmb3VyLCBhbmQgaXMgdGhlIGFtb3VudCB0byBjaGFuZ2UgdGhlIGJyYW5jaCBieSAoc3VjaCBhbiBvZmZzZXQKLSAgIHdpbGwgb25seSBvY2N1ciBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2ggd2l0aGluIHRoZSBzYW1lIHNlY3Rpb24pLgotCi0gICBXZSBkbyBub3QgbW9kaWZ5IHRoZSBzZWN0aW9uIHJlbG9jcyBvciBjb250ZW50cyB0aGVtc2VsdmVzIHNvIHRoYXQKLSAgIGlmIG1lbW9yeSB1c2FnZSBiZWNvbWVzIGFuIGlzc3VlIHdlIGNhbiBkaXNjYXJkIHRoZW0gYW5kIHJlYWQgdGhlbQotICAgYWdhaW4uICBUaGUgb25seSBpbmZvcm1hdGlvbiB3ZSBtdXN0IHNhdmUgaW4gbWVtb3J5IGJldHdlZW4gdGhpcwotICAgcm91dGluZSBhbmQgdGhlIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lIGlzIHRoZSB0YWJsZSBvZgotICAgb2Zmc2V0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBBc3N1bWUgd2UgYXJlIG5vdCBnb2luZyB0byBuZWVkIGFub3RoZXIgcGFzcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBhbiBFQ09GRiBmaWxlLCB0aGlzIGlzIG11Y2ggdG9vCi0gICAgIGNvbmZ1c2luZyB0byBkZWFsIHdpdGguICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWxvY3MsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gUEMgcmVsYXRpdmUgcmVsb2NzLCBhbmQgd2h5IHdvdWxkIHRoZXJlCi0gICAgIGV2ZXIgYmUgb25lIGZyb20gYW55dGhpbmcgYnV0IHRoZSAudGV4dCBzZWN0aW9uPyAgKi8KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIudGV4dCIpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZ290IHRoZW0uICAqLwotICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICBpZiAoc2VjdGlvbl90ZGF0YSA9PSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgfQotCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIG11c3QgaW5pdGlhbGl6ZSBfY29va2VkX3NpemUgb25seSB0aGUgZmlyc3QgdGltZSB3ZSBhcmUKLQkgY2FsbGVkLiAgKi8KLSAgICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotCi0gIGNvbnRlbnRzID0gc2VjdGlvbl90ZGF0YS0+Y29udGVudHM7Ci0gIG9mZnNldHMgPSBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzOwotCi0gIC8qIExvb2sgZm9yIGFueSBleHRlcm5hbCBQQyByZWxhdGl2ZSByZWxvY3MuICBJbnRlcm5hbCBQQyByZWxhdGl2ZQotICAgICByZWxvY3MgYXJlIGFscmVhZHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsIHNvIHRoZXkgY2VydGFpbmx5Ci0gICAgIGNhbiBub3Qgb3ZlcmZsb3cuICAqLwotICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jICphZGpfZXh0X3JlbDsKLSAgICAgIHVuc2lnbmVkIGludCBhZGpfaTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXh0X2NvdW50OwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKmFkal9oX3B0cjsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiphZGpfaF9wdHJfZW5kOwotICAgICAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZXhwYW5kZWQgdGhpcyByZWxvYywgd2UgY2VydGFpbmx5IGRvbid0Ci0JIG5lZWQgdG8gZG8gaXQgYWdhaW4uICAqLwotICAgICAgaWYgKG9mZnNldHMgIT0gKGxvbmcgKikgTlVMTCAmJiBvZmZzZXRzW2ldID09IDEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFF1aWNrbHkgY2hlY2sgdGhhdCB0aGlzIHJlbG9jIGlzIGV4dGVybmFsIFBDUkVMMTYuICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgaWYgKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fQklHKSA9PSAwCi0JICAgICAgfHwgKCgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCSAgID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHKQotCQkgICE9IE1JUFNfUl9QQ1JFTDE2KSkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRSkgPT0gMAotCSAgICAgIHx8ICgoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkgICA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRSkKLQkJICAhPSBNSVBTX1JfUENSRUwxNikpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoUFRSKSBleHRfcmVsLCAmaW50X3JlbCk7Ci0KLSAgICAgIGggPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIC8qIEp1c3QgaWdub3JlIHVuZGVmaW5lZCBzeW1ib2xzLiAgVGhlc2Ugd2lsbCBwcmVzdW1hYmx5Ci0JICAgICBnZW5lcmF0ZSBhbiBlcnJvciBsYXRlciBpbiB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0KLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBhZGRyZXNzLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpKTsKLQotICAgICAgLyogVGhlIGFkZGVuZCBpcyBzdG9yZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gdGhlIG5vcm1hbCBjYXNlCi0JIG9mIGBgYmFsIHN5bWJvbCcnLCB0aGUgYWRkZW5kIHdpbGwgYmUgLTQuICBJdCB3aWxsIG9ubHkgYmUKLQkgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mIGBgYmFsIHN5bWJvbCtjb25zdGFudCcnLiAgVG8gYXZvaWQKLQkgYWx3YXlzIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIHdlIGRvbid0IGNoZWNrIHRoZQotCSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlICh3ZSBjb3VsZCBlYXNpbHkgY2hlY2sgdGhlIGNvbnRlbnRzCi0JIGlmIHdlIGhhcHBlbiB0byBoYXZlIGFscmVhZHkgcmVhZCB0aGVtIGluLCBidXQgSSBmZWFyIHRoYXQKLQkgdGhpcyBjb3VsZCBiZSBjb25mdXNpbmcpLiAgVGhpcyBtZWFucyB3ZSB3aWxsIHNjcmV3IHVwIGlmCi0JIHRoZXJlIGlzIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgaW4gcmFuZ2UsIGJ1dCBhZGRlZCB0bwotCSBhIGNvbnN0YW50IHdoaWNoIHB1dHMgaXQgb3V0IG9mIHJhbmdlOyBpbiBzdWNoIGEgY2FzZSB0aGUKLQkgbGluayB3aWxsIGZhaWwgd2l0aCBhIHJlbG9jIG92ZXJmbG93IGVycm9yLiAgU2luY2UgdGhlCi0JIGNvbXBpbGVyIHdpbGwgbmV2ZXIgZ2VuZXJhdGUgc3VjaCBjb2RlLCBpdCBzaG91bGQgYmUgZWFzeQotCSBlbm91Z2ggdG8gd29yayBhcm91bmQgaXQgYnkgY2hhbmdpbmcgdGhlIGFzc2VtYmx5IGNvZGUgaW4gdGhlCi0JIHNvdXJjZSBmaWxlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gNDsKLQotICAgICAgLyogTm93IFJFTE9DQVRJT04gaXMgdGhlIG51bWJlciB3ZSB3YW50IHRvIHB1dCBpbiB0aGUgb2JqZWN0Ci0JIGZpbGUuICBTZWUgd2hldGhlciBpdCBmaXRzLiAgKi8KLSAgICAgIGlmIChyZWxvY2F0aW9uID49IC0weDIwMDAwICYmIHJlbG9jYXRpb24gPCAweDIwMDAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgcmVsb2MgbmVlZHMgd29yaywgd2hpY2ggd2lsbCByYXJlbHkKLQkgaGFwcGVuLCBnbyBhaGVhZCBhbmQgZ3JhYiB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JewotCSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNlYy0+X3Jhd19zaXplKTsKLQkgIGVsc2UKLQkgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKGNvbnRlbnRzID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCAoUFRSKSBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0JICAgIHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotCi0gICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgY2hhbmdpbmcgdGhlIGJhbCBpbnN0cnVjdGlvbi4gIEl0IHdvdWxkIGJlCi0JIHBvc3NpYmxlIHRvIGhhbmRsZSBvdGhlciBQQyByZWxhdGl2ZSBicmFuY2hlcywgYnV0IHNvbWUgb2YKLQkgdGhlbSAodGhlIGNvbmRpdGlvbmFsIGJyYW5jaGVzKSB3b3VsZCByZXF1aXJlIGEgZGlmZmVyZW50Ci0JIGxlbmd0aCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB3aGljaCB3b3VsZCBjb21wbGljYXRlIGJvdGggdGhpcwotCSByb3V0aW5lIGFuZCBtaXBzX3JlbGF4X3BjcmVsMTYuICBJdCBjb3VsZCBiZSB3cml0dGVuIGlmCi0JIHNvbWVib2R5IGZlbHQgaXQgd2VyZSBpbXBvcnRhbnQuICBJZ25vcmluZyB0aGlzIHJlbG9jIHdpbGwKLQkgcHJlc3VtYWJseSBjYXVzZSBhIHJlbG9jIG92ZXJmbG93IGVycm9yIGxhdGVyIG9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIGludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKQotCSAgIT0gMHgwNDExZmZmZikgLyogYmdlemFsICQwLC4gPT0gYmFsIC4gKi8KLQljb250aW51ZTsKLQotICAgICAgLyogQm90aGVyLiAgV2UgbmVlZCB0byBleHBhbmQgdGhpcyByZWxvYywgYW5kIHdlIHdpbGwgbmVlZCB0bwotCSBtYWtlIGFub3RoZXIgcmVsYXhhdGlvbiBwYXNzIHNpbmNlIHRoaXMgY2hhbmdlIG1heSBwdXQgb3RoZXIKLQkgcmVsb2NzIG91dCBvZiByYW5nZS4gIFdlIG5lZWQgdG8gZXhhbWluZSB0aGUgbG9jYWwgYnJhbmNoZXMKLQkgYW5kIHdlIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG9mZnNldHMgd2UgbXVzdAotCSBhZGQgdG8gdGhlbS4gIFdlIGFsc28gbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlcyBvZiBhbGwKLQkgc3ltYm9scyBpbiB0aGUgb2JqZWN0IGZpbGUgZm9sbG93aW5nIHRoaXMgbG9jYXRpb24uICAqLwotCi0gICAgICBzZWMtPl9jb29rZWRfc2l6ZSArPSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UOwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgaWYgKG9mZnNldHMgPT0gKGxvbmcgKikgTlVMTCkKLQl7Ci0JICBzaXplX3Qgc2l6ZTsKLQotCSAgc2l6ZSA9IHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGxvbmcpOwotCSAgb2Zmc2V0cyA9IChsb25nICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JICBpZiAob2Zmc2V0cyA9PSAobG9uZyAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG1lbXNldCAob2Zmc2V0cywgMCwgc2l6ZSk7Ci0JICBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzID0gb2Zmc2V0czsKLQl9Ci0KLSAgICAgIG9mZnNldHNbaV0gPSAxOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIFBDIHJlbGF0aXZlIHJlZmVyZW5jZXMgdGhhdCBjcm9zcyB0aGlzIHJlbG9jCi0JIGFuZCBhZGp1c3QgdGhlaXIgb2Zmc2V0cy4gICovCi0gICAgICBhZGpfZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yIChhZGpfaSA9IDA7IGFkal9leHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGFkal9leHRfcmVsKyssIGFkal9pKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIGFkal9pbnRfcmVsOwotCSAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQkgIGludCBjaGFuZ2U7Ci0KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgYWRqX2V4dF9yZWwsICZhZGpfaW50X3JlbCk7Ci0KLQkgIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1BDUkVMMTYpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgbG9jYWwgcmVmZXJlbmNlcy4gIEV4dGVybmFsIG9uZXMKLQkJIHdpbGwgYmUgcmVsb2NhdGVkIGNvcnJlY3RseSBhbnlob3cuICAqLwotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2l0aGluCi0JCSB0aGlzIHNlY3Rpb24uICBGSVhNRTogQ3Jvc3Mgc2VjdGlvbiBQQyByZWxhdGl2ZQotCQkgcmVsb2NzIG1heSBub3QgYmUgaGFuZGxlZCBjb3JyZWN0bHk7IGRvZXMgYW55Ym9keQotCQkgY2FyZT8gICovCi0JICAgICAgaWYgKGFkal9pbnRfcmVsLnJfc3ltbmR4ICE9IFJFTE9DX1NFQ1RJT05fVEVYVCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHI7Ci0KLQkgICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwKLQkJCQkgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCi0JICAgICAgc3RvcCA9IChpbnNuICYgMHhmZmZmKSA8PCAyOwotCSAgICAgIGlmICgoc3RvcCAmIDB4MjAwMDApICE9IDApCi0JCXN0b3AgLT0gMHg0MDAwMDsKLQkgICAgICBzdG9wICs9IGFkal9pbnRfcmVsLnJfdmFkZHIgKyA0OwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIHJlbGxvOwotCSAgICAgIGxvbmcgYWRkaGksIGFkZGxvOwotCi0JICAgICAgLyogVGhlIG5leHQgcmVsb2MgbXVzdCBiZSBNSVBTX1JfUkVMTE8sIGFuZCB3ZSBoYW5kbGUKLQkJIHRoZW0gdG9nZXRoZXIuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKGFkal9leHRfcmVsICsgMSA8IGV4dF9yZWxfZW5kKTsKLQotCSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgKGFkal9leHRfcmVsICsgMSksICZyZWxsbyk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChyZWxsby5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgICAgICAKLQkgICAgICBhZGRoaSA9IGJmZF9nZXRfMzIgKGFiZmQsCi0JCQkJICAgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCSAgICAgIGFkZGhpICY9IDB4ZmZmZjsKLQkgICAgICBpZiAoYWRkaGkgJiAweDgwMDApCi0JCWFkZGhpIC09IDB4MTAwMDA7Ci0JICAgICAgYWRkaGkgPDw9IDE2OwotCi0JICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHJlbGxvLnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCSAgICAgIGlmIChhZGRsbyAmIDB4ODAwMCkKLQkJYWRkbG8gLT0gMHgxMDAwMDsKLQotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJewotCQkgIC8qIFRoZSB2YWx1ZSB3ZSB3YW50IGhlcmUgaXMKLQkJICAgICAgIHN5bSAtIFJFTExPYWRkciArIGFkZGVuZAotCQkgICAgIHdoaWNoIHdlIGNhbiBleHByZXNzIGFzCi0JCSAgICAgICBzeW0gLSAoUkVMTE9hZGRyIC0gYWRkZW5kKQotCQkgICAgIFRoZXJlZm9yZSBpZiB3ZSBhcmUgZXhwYW5kaW5nIHRoZSBhcmVhIGJldHdlZW4KLQkJICAgICBSRUxMT2FkZHIgYW5kIFJFTExPYWRkciAtIGFkZGVuZCB3ZSBtdXN0IGFkanVzdAotCQkgICAgIHRoZSBhZGRlbmQuICBUaGlzIGlzIGFkbWl0dGVkbHkgYW1iaWd1b3VzLCBzaW5jZQotCQkgICAgIHdlIG1pZ2h0IG1lYW4gKHN5bSArIGFkZGVuZCkgLSBSRUxMT2FkZHIsIGJ1dCBpbgotCQkgICAgIHByYWN0aWNlIHdlIGRvbid0LCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZQotCQkgICAgIHRoYXQgY2FzZSBjb3JyZWN0bHkgc2luY2UgYXQgdGhpcyBwb2ludCB3ZSBoYXZlCi0JCSAgICAgbm8gaWRlYSB3aGV0aGVyIGFueSByZWxvYyBpcyBiZWluZyBleHBhbmRlZAotCQkgICAgIGJldHdlZW4gc3ltIGFuZCBzeW0gKyBhZGRlbmQuICAqLwotCQkgIHN0YXJ0ID0gcmVsbG8ucl92YWRkciAtIChhZGRoaSArIGFkZGxvKTsKLQkJICBzdG9wID0gcmVsbG8ucl92YWRkcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEFuIGludGVybmFsIFJFTEhJL1JFTExPIHBhaXIgcmVwcmVzZW50cyB0aGUKLQkJICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkZHJlc3NlcywgJExDMCAtIGZvby4KLQkJICAgICBUaGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IHRoZSBkaWZmZXJlbmNlCi0JCSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgJExDMC4gIFRoaXMgbGV0cyB1cwotCQkgICAgIGNvbXB1dGUgJExDMCwgYW5kLCBieSBjb25zaWRlcmluZyB0aGUgYWRkZW5kLAotCQkgICAgIGZvby4gIElmIHRoZSByZWxvYyB3ZSBhcmUgZXhwYW5kaW5nIGZhbGxzIGJldHdlZW4KLQkJICAgICB0aG9zZSB0d28gcmVsb2NzLCB3ZSBtdXN0IGFkanVzdCB0aGUgYWRkZW5kLiAgQXQKLQkJICAgICB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGluIHRoZQotCQkgICAgIHJfb2Zmc2V0IGZpZWxkLCB3aGVyZSBpdCB3YXMgcHV0IGJ5Ci0JCSAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkJICBzdGFydCA9IHJlbGxvLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkJICBzdG9wID0gc3RhcnQgKyBhZGRoaSArIGFkZGxvOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfU1dJVENIKQotCSAgICB7Ci0JICAgICAgLyogQSBNSVBTX1JfU1dJVENIIHJlbG9jIHJlcHJlc2VudHMgYSB3b3JkIG9mIHRoZSBmb3JtCi0JCSAgIC53b3JkICRMMy0kTFMxMgotCQkgVGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSBpcyBjb3JyZWN0LCBhc3N1bWluZyB0aGUKLQkJIG9yaWdpbmFsIHZhbHVlIG9mICRMMy4gIFRoZSBzeW1uZHggdmFsdWUgaXMgYWN0dWFsbHkKLQkJIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kICRMUzEyLgotCQkgVGhpcyBsZXRzIHVzIGNvbXB1dGUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMUzEyIGFzCi0JCSAgIHZhZGRyIC0gc3ltbmR4Ci0JCSBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMyBhcwotCQkgICB2YWRkciAtIHN5bW5keCArIGFkZGVuZAotCQkgd2hlcmUgYWRkZW5kIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gIEF0Ci0JCSB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGZvdW5kIGluIHRoZQotCQkgcl9vZmZzZXQgZmllbGQsIHNpbmNlIGl0IHdhcyBtb3ZlZCBieQotCQkgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkgICAgICBzdG9wID0gc3RhcnQgKyBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCQkgKGNvbnRlbnRzCi0JCQkJCSAgKyBhZGpfaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgLSBzZWMtPnZtYSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGUgcmFuZ2UgZXhwcmVzc2VkIGJ5IHRoaXMgcmVsb2MsIHdoaWNoIGlzIHRoZQotCSAgICAgZGlzdGFuY2UgYmV0d2VlbiBTVEFSVCBhbmQgU1RPUCBjcm9zc2VzIHRoZSByZWxvYyB3ZSBhcmUKLQkgICAgIGV4cGFuZGluZywgd2UgbXVzdCBhZGp1c3QgdGhlIG9mZnNldC4gIFRoZSBzaWduIG9mIHRoZQotCSAgICAgYWRqdXN0bWVudCBkZXBlbmRzIHVwb24gdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgcmFuZ2UKLQkgICAgIGNyb3NzZXMgdGhlIHJlbG9jIGJlaW5nIGV4cGFuZGVkLiAgKi8KLQkgIGlmIChzdGFydCA8PSBpbnRfcmVsLnJfdmFkZHIgJiYgc3RvcCA+IGludF9yZWwucl92YWRkcikKLQkgICAgY2hhbmdlID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQkgIGVsc2UgaWYgKHN0YXJ0ID4gaW50X3JlbC5yX3ZhZGRyICYmIHN0b3AgPD0gaW50X3JlbC5yX3ZhZGRyKQotCSAgICBjaGFuZ2UgPSAtIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JICBlbHNlCi0JICAgIGNoYW5nZSA9IDA7Ci0KLQkgIG9mZnNldHNbYWRqX2ldICs9IGNoYW5nZTsKLQotCSAgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JICAgIHsKLQkgICAgICBhZGpfZXh0X3JlbCsrOwotCSAgICAgIGFkal9pKys7Ci0JICAgICAgb2Zmc2V0c1thZGpfaV0gKz0gY2hhbmdlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIGluIHRoaXMgc2VjdGlvbiBkZWZpbmVkIGJ5IHRoaXMgb2JqZWN0IGZpbGUKLQkgYW5kIGFkanVzdCB0aGVpciB2YWx1ZXMuICBOb3RlIHRoYXQgd2UgZGVjaWRlIHdoZXRoZXIgdG8KLQkgYWRqdXN0IHRoZSB2YWx1ZSBiYXNlZCBvbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBFQ09GRiBFWFRSCi0JIHN0cnVjdHVyZSwgYmVjYXVzZSB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlIG1heQotCSBoYXZlIGJlZW4gY2hhbmdlZCBieSBhbiBlYXJsaWVyIGV4cGFuZGVkIHJlbG9jIGFuZCB0aHVzIG1heQotCSBubyBsb25nZXIgY29ycmVjdGx5IGluZGljYXRlIHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBiZWZvcmUgb3IKLQkgYWZ0ZXIgdGhlIGV4cGFuZGVkIHJlbG9jLiAgKi8KLSAgICAgIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotICAgICAgYWRqX2hfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXM7Ci0gICAgICBhZGpfaF9wdHJfZW5kID0gYWRqX2hfcHRyICsgZXh0X2NvdW50OwotICAgICAgZm9yICg7IGFkal9oX3B0ciA8IGFkal9oX3B0cl9lbmQ7IGFkal9oX3B0cisrKQotCXsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmFkal9oOwotCi0JICBhZGpfaCA9ICphZGpfaF9wdHI7Ci0JICBpZiAoYWRqX2ggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIChhZGpfaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGFkal9oLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICYmIGFkal9oLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAgICAgJiYgYWRqX2gtPmVzeW0uYXN5bS52YWx1ZSA+IGludF9yZWwucl92YWRkcikKLQkgICAgYWRqX2gtPnJvb3QudS5kZWYudmFsdWUgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQl9Ci0KLSAgICAgIC8qIEFkZCBhbiBlbnRyeSB0byB0aGUgc3ltYm9sIHZhbHVlIGFkanVzdCBsaXN0LiAgVGhpcyBpcyB1c2VkCi0JIGJ5IGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIHRvIGFkanVzdCB0aGUgdmFsdWVzIG9mCi0JIGludGVybmFsIHN5bWJvbHMgYW5kIEZEUidzLiAgKi8KLSAgICAgIGFkanVzdCA9ICgoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCkpKTsKLSAgICAgIGlmIChhZGp1c3QgPT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRqdXN0LT5zdGFydCA9IGludF9yZWwucl92YWRkcjsKLSAgICAgIGFkanVzdC0+ZW5kID0gc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGFkanVzdC0+YWRqdXN0ID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotICAgICAgYWRqdXN0LT5uZXh0ID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0OwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0ID0gYWRqdXN0OwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwgJiYgISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyAhPSAoYmZkX2J5dGUgKikgTlVMTCAmJiAhIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoZW4gYSBQQwotICAgcmVsYXRpdmUgcmVsb2MgbXVzdCBiZSBleHBhbmRlZCBpbnRvIHRoZSBmaXZlIGluc3RydWN0aW9uIHNlcXVlbmNlLgotICAgSXQgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIGV4cGFuc2lvbiwgaW5jbHVkaW5nIHJlc29sdmluZwotICAgdGhlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsYXhfcGNyZWwxNiAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLCBsb2NhdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogMHgwNDExZmZmZiBpcyBiZ2V6YWwgJDAsLiA9PSBiYWwgLiAgKi8KLSAgQkZEX0FTU0VSVCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbikgPT0gMHgwNDExZmZmZik7Ci0KLSAgLyogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgYW5kIHRoZQotICAgICBjdXJyZW50IGFkZHJlc3MgcGx1cyBlaWdodC4gICovCi0gIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcmVzcyArIDg7Ci0KLSAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgbmVnYXRpdmUsIGluY3JlbWVudCB0aGUgdXBwZXIgMTYgaGFsZi4gICovCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZWxvY2F0aW9uICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDA0MTEwMDAxLCBsb2NhdGlvbik7IC8qIGJhbCAuKzggKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIDB4M2MwMTAwMDAgfCAoKHJlbG9jYXRpb24gPj4gMTYpICYgMHhmZmZmKSwgLyogbHVpICRhdCxYWCAqLwotCSAgICAgIGxvY2F0aW9uICsgNCk7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkgICAgICAweDI0MjEwMDAwIHwgKHJlbG9jYXRpb24gJiAweGZmZmYpLCAvKiBhZGRpdSAkYXQsJGF0LFhYICovCi0JICAgICAgbG9jYXRpb24gKyA4KTsKLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDAwM2YwODIxLCBsb2NhdGlvbiArIDEyKTsgLyogYWRkdSAkYXQsJGF0LCRyYSAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDAyMGY4MDksIGxvY2F0aW9uICsgMTYpOyAvKiBqYWxyICRhdCAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIC5zZGF0YSBzZWN0aW9uIGFuZCBhIC5yZWwuc2RhdGEgaW4tbWVtb3J5IHNlY3Rpb24sIHN0b3JlCi0gICByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGludG8gdGhlIC5yZWwuc2RhdGEgc2VjdGlvbiB3aGljaCBjYW4gYmUKLSAgIHVzZWQgYXQgcnVudGltZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZQotICAgbGlua2VyIHdoZW4gdGhlIC0tZW1iZWRkZWQtcmVsb2NzIHN3aXRjaCBpcyB1c2VkLiAgVGhpcyBpcyBjYWxsZWQKLSAgIGFmdGVyIHRoZSBhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIG9iamVjdHMsIGFuZCBiZWZvcmUgdGhlIGZpbmFsX2xpbmsgZW50cnkgcG9pbnQgaXMgY2FsbGVkLiAgVGhpcwotICAgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgb2JqZWN0IHdhcyBjb21waWxlZCB1c2luZwotICAgLW1lbWJlZGRlZC1waWMuICAqLwotCi1ib29sZWFuCi1iZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCBpbmZvLCBkYXRhc2VjLCByZWxzZWMsIGVycm1zZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gICAgIGFzZWN0aW9uICpyZWxzZWM7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICBiZmRfYnl0ZSAqcDsKLQotICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgKmVycm1zZyA9IE5VTEw7Ci0KLSAgaWYgKGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOwotCi0gIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIGRhdGFzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KTsKLSAgaWYgKHJlbHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcCA9IHJlbHNlYy0+Y29udGVudHM7Ci0KLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZGF0YXNlYyk7Ci0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgZGF0YXNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgcCArPSA0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgYm9vbGVhbiB0ZXh0X3JlbGF0aXZlOwotCi0gICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKLQotICAgICAgLyogV2UgYXJlIGdvaW5nIHRvIHdyaXRlIGEgZm91ciBieXRlIHdvcmQgaW50byB0aGUgcnVudGltZSByZWxvYwotCSBzZWN0aW9uLiAgVGhlIHdvcmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBpbiB0aGUgZGF0YSBzZWN0aW9uCi0JIHdoaWNoIG11c3QgYmUgcmVsb2NhdGVkLiAgVGhpcyBtdXN0IGJlIG9uIGEgd29yZCBib3VuZGFyeSwKLQkgd2hpY2ggbWVhbnMgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4gIFdlIHVzZSB0aGUKLQkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGluZGljYXRlIGhvdyB0aGUgdmFsdWUgaW4gdGhlIGRhdGEKLQkgc2VjdGlvbiBtdXN0IGJlIHJlbG9jYXRlZC4gIEEgMCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcwotCSByZWxhdGl2ZSB0byB0aGUgdGV4dCBzZWN0aW9uLCB3aGlsZSBhIDEgaW5kaWNhdGVzIHRoYXQgdGhlCi0JIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIHNlY3Rpb24uICBHaXZlbiB0aGF0IHdlIGFyZQotCSBhc3N1bWluZyB0aGUgY29kZSB3YXMgY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMsIHRoZXJlCi0JIHNob3VsZCBub3QgYmUgYW55IG90aGVyIHBvc3NpYmlsaXRpZXMuICAqLwotCi0gICAgICAvKiBXZSBjYW4gb25seSByZWxvY2F0ZSBSRUZXT1JEIHJlbG9jcyBhdCBydW4gdGltZS4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRldPUkQpCi0JewotCSAgKmVycm1zZyA9IF8oInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JewotCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IHN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07Ci0JICAvKiBJZiBoIGlzIE5VTEwsIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbCB3aGljaCB3ZSB0aG91Z2h0IHdhcyBqdXN0IGEgZGVidWdnaW5nCi0JICAgICBzeW1ib2wuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkgICAgdGV4dF9yZWxhdGl2ZSA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHRleHRfcmVsYXRpdmUgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpbnRfcmVsLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9URVhUOgotCSAgICAgIHRleHRfcmVsYXRpdmUgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TQlNTOgotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODoKLQkgICAgICB0ZXh0X3JlbGF0aXZlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYwotICAgICAgICAgICAgICAgICBjb2RlLiAgKi8KLQkgICAgICAqZXJybXNnID0gXygicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIik7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGludF9yZWwucl9vZmZzZXQgJiAzKSAhPSAwKQotCXsKLQkgICplcnJtc2cgPSBfKCJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLAotCQkgIChpbnRfcmVsLnJfdmFkZHIgLSBkYXRhc2VjLT52bWEgKyBkYXRhc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKHRleHRfcmVsYXRpdmUgPyAwIDogMSkpLAotCQkgIHApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCi0gICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgbWlwc19lY29mZl9iYWNrZW5kX2RhdGEgPQotewotICAvKiBDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KLSAgewotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKSBiZmRfdm9pZCwgLyogYXV4X2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9pbiAqLwotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9faW4gKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpYmZkX3ZvaWQsLyphdXhfb3V0Ki8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHJlbG9jX291dCAqLwotICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0LAotICAgIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIDAsIDAsIDAsIDAsIEZJTE5NTEVOLCB0cnVlLCBmYWxzZSwgNCwKLSAgICBtaXBzX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbiwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfaW4sCi0gICAgbWlwc19lY29mZl9zd2FwX3Njbmhkcl9pbiwgTlVMTCwKLSAgICBtaXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vaywgX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gICAgX2JmZF9lY29mZl9ta29iamVjdF9ob29rLCBfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzLAotICAgIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rLCBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwKLSAgfSwKLSAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCi0gIGJmZF9hcmNoX21pcHMsCi0gIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLwotICAiX19fX19fX19fXyIsCi0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgMHgxMDAwLAotICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBNSVBTLiAgKi8KLSAgZmFsc2UsCi0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIDMyLAotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICAmbWlwc19ob3d0b190YWJsZVtNSVBTX1JfUkVGV09SRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bSwKLSAgICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gICAgNCwKLSAgICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gICAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gICAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9zeW1faW4sCi0gICAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gICAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gICAgZWNvZmZfc3dhcF9leHRfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICAgIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gICAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KLSAgfSwKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIFJFTFNaLAotICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLwotICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4sCi0gIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBtaXBzX2FkanVzdF9yZWxvY19pbiwKLSAgbWlwc19hZGp1c3RfcmVsb2Nfb3V0LAotICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLwotICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBOVUxMLAotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gICovCi0gIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zCi19OwotCi0vKiBMb29raW5nIHVwIGEgcmVsb2MgdHlwZSBpcyBNSVBTIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogR2V0dGluZyByZWxvY2F0ZWQgc2VjdGlvbiBjb250ZW50cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIEhhbmRsaW5nIGZpbGUgd2luZG93cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIFJlbGF4aW5nIHNlY3Rpb25zIGlzIE1JUFMgc3BlY2lmaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIG1pcHNfcmVsYXhfc2VjdGlvbgotCi0vKiBHQyBvZiBzZWN0aW9ucyBpcyBub3QgZG9uZS4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgZWNvZmZfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVtaXBzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBlY29mZl9iaWdfdmVjLAotICAKLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWMgPQotewotICAiZWNvZmYtYmlnbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBlY29mZl9saXR0bGVfdmVjLAotICAKLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ2xpdHRsZV92ZWMgPQotewotICAiZWNvZmYtYmlnbGl0dGxlbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAmbWlwc19lY29mZl9iYWNrZW5kX2RhdGEKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1wbWFjLmMgYi9iZmQvY29mZi1wbWFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzMyZDkuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtcG1hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBcHBsZSBldCBhbCBQb3dlclBDIE1hYyAiWENPRkYiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCXBtYWNfeGNvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJ4Y29mZi1wb3dlcm1hYyIKLQotLyogVHdlYWsgY29mZmNvZGUuaCBiYXNlZCBvbiB0aGlzIGJlaW5nIGEgUG93ZXJNYWMgaW5zdGVhZCBvZiBSUy82MDAwLiAqLwotCi0jZGVmaW5lIFBPV0VSTUFDCi0KLSNpbmNsdWRlICJjb2ZmLXJzNjAwMC5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcHBjLmMgYi9iZmQvY29mZi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlOGNiOC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NjkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE9yaWdpbmFsIHZlcnNpb24gcGllY2VkIHRvZ2V0aGVyIGJ5IEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0KLSAgIFRoZXJlIGlzIG5vdGhpbmcgbmV3IHVuZGVyIHRoZSBzdW4uIFRoaXMgZmlsZSBkcmF3cyBhIGxvdCBvbiBvdGhlcgotICAgY29mZiBmaWxlcywgaW4gcGFydGljdWxhciwgdGhvc2UgZm9yIHRoZSBycy82MDAwLCBhbHBoYSwgbWlwcywgYW5kIAotICAgaW50ZWwgYmFja2VuZHMsIGFuZCB0aGUgUEUgd29yayBmb3IgdGhlIGFybS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ3VycmVudCBTdGF0ZToKLSAgIC0gb2JqZHVtcCB3b3JrcwotICAgLSByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotICAgLSBsZCB3aWxsIGxpbmsgZmlsZXMsIGJ1dCB0aGV5IGRvIG5vdCBydW4uCi0gICAtIGRsbHRvb2wgd2lsbCBub3QgcHJvZHVjZSBjb3JyZWN0IG91dHB1dCBpbiBzb21lIC5yZWxvYyBjYXNlcywgYW5kIHdpbGwgCi0gICAgIG5vdCBwcm9kdWNlIHRoZSByaWdodCBnbHVlIGNvZGUgZm9yIGRsbCBmdW5jdGlvbiBjYWxscy4KLSovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3Bvd2VycGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotCi0jZGVmaW5lIEJBRE1BRyh4KSBQUENCQURNQUcoeCkKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGR1bXBfdG9jIFBBUkFNUyAoKFBUUikpOwotCi0vKiBUaGUgdG9jIGlzIGEgc2V0IG9mIGJmZF92bWEgZmllbGRzLiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB2YWxpZCAgICAgICAgICovCi0vKiBhZGRyZXNzZXMgYXJlIGV2ZW4gKGkuZS4gdGhlIGJpdCByZXByZXNlbnRpbmcgIjEiIGlzIG9mZikgdG8gYWxsb3cgICAgICovCi0vKiB1cyB0byBlbmNvZGUgYSBsaXR0bGUgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhlIGZpZWxkICAgICAgICAgICAgICAgICAgICovCi0vKiAtIFVuYWxsb2NhdGVkIGFkZHJlc3NlcyBhcmUgaW50aWFsaXplZCB0byAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtIEFsbG9jYXRlZCBhZGRyZXNzZXMgYXJlIGV2ZW4gbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZmlyc3QgdGltZSB3ZSBhY3R1YWxseSB3cml0ZSBhIHJlZmVyZW5jZSB0byB0aGUgdG9jIGluIHRoZSBiZmQsICAgICovCi0vKiB3ZSB3YW50IHRvIHJlY29yZCB0aGF0IGZhY3QgaW4gYSBmaXh1cCBmaWxlIChpZiBpdCBpcyBhc2tlZCBmb3IpLCBzbyAgICovCi0vKiB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IGFuIGFkZHJlc3MgaGFzIGJlZW4gd3JpdHRlbiBieSBtYXJraW5nICovCi0vKiB0aGUgbG93IG9yZGVyIGJpdCB3aXRoIGEgIjEiIHVwb24gd3JpdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgU0VUX1VOQUxMT0NBVEVEKHgpICAoKHgpID0gMSkKLSNkZWZpbmUgSVNfVU5BTExPQ0FURUQoeCkgICAoKHgpID09IDEpCi0KLSNkZWZpbmUgSVNfV1JJVFRFTih4KSAgICAgICAoKHgpICYgMSkKLSNkZWZpbmUgTUFSS19BU19XUklUVEVOKHgpICAoKHgpIHw9IDEpCi0jZGVmaW5lIE1BS0VfQUREUl9BR0FJTih4KSAgKCh4KSAmPSB+MSkKLQotCi0vKiBUdXJuIG9uIHRoaXMgY2hlY2sgaWYgeW91IHN1c3BlY3Qgc29tZXRoaW5nIGFtaXNzIGluIHRoZSBoYXNoIHRhYmxlcyAqLwotI2lmZGVmIERFQlVHX0hBU0gKLQotLyogTmVlZCBhIDcgY2hhciBzdHJpbmcgZm9yIGFuIGV5ZSBjYXRjaGVyICovCi0jZGVmaW5lIEVZRSAia3JranVuayIKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTCBjaGFyIGV5ZV9jYXRjaGVyWzhdOwotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KSAgICAgIHN0cmNweShyZXQtPmV5ZV9jYXRjaGVyLCBFWUUpCi0jZGVmaW5lIEhBU0hfQ0hFQ0soYWRkcikgXAotIGlmIChzdHJjbXAoYWRkci0+ZXllX2NhdGNoZXIsIEVZRSkgIT0gMCkgXAotICB7IFwKLSAgICBmcHJpbnRmKHN0ZGVycixcCi0gICAgXygiRmlsZSAlcywgbGluZSAlZCwgSGFzaCBjaGVjayBmYWlsdXJlLCBiYWQgZXllICU4c1xuIiksIFwKLSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGFkZHItPmV5ZV9jYXRjaGVyKTsgXAotICAgIGFib3J0KCk7IFwKLSB9Ci0KLQotI2Vsc2UKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTAotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KQotI2RlZmluZSBIQVNIX0NIRUNLKGFkZHIpCi0KLSNlbmRpZgotCi0vKiBJbiBvcmRlciBub3QgdG8gYWRkIGFuIGludCB0byBldmVyeSBoYXNoIHRhYmxlIGl0ZW0gZm9yIGV2ZXJ5IGNvZmYKLSAgIGxpbmtlciwgd2UgZGVmaW5lIG91ciBvd24gaGFzaCB0YWJsZSwgZGVyaXZlZCBmcm9tIHRoZSBjb2ZmIG9uZSAqLwotCi0vKiBQRSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgICovCi0KLSAgLyogQXMgd2Ugd29uZGVyIGFyb3VuZCB0aGUgcmVsb2NzLCB3ZSdsbCBrZWVwIHRoZSBhc3NpZ25lZCB0b2Nfb2Zmc2V0Ci0gICAgIGhlcmUgKi8KLSAgYmZkX3ZtYSB0b2Nfb2Zmc2V0OyAgICAgICAgICAgICAgIC8qIE91ciBhZGRpdGlvbiwgYXMgcmVxdWlyZWQgKi8KLSAgaW50IHN5bWJvbF9pc19nbHVlOwotICB1bnNpZ25lZCBsb25nIGludCBnbHVlX2luc247Ci0KLSAgSEFTSF9DSEVDS19EQ0wKLX07Ci0KLQotLyogUEUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1wcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gCi0gICAgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCAKLQkJCSBzaXplb2YgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpKTsKLQotICBpZiAocmV0ID09IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgCi0JCQkJICAgICAgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIFNFVF9VTkFMTE9DQVRFRChyZXQtPnRvY19vZmZzZXQpOwotICAgICAgcmV0LT5zeW1ib2xfaXNfZ2x1ZSA9IDA7Ci0gICAgICByZXQtPmdsdWVfaW5zbiA9IDA7Ci0KLSAgICAgIEhBU0hfQ0hFQ0tfSU5JVChyZXQpOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBQRSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIFBFIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoISBwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBOb3csIHRhaWxvciBjb2ZmY29kZS5oIHRvIHVzZSBvdXIgaGFzaCBzdHVmZiAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0MCi0vKiBUaGUgbnQgbG9hZGVyIHBvaW50cyB0aGUgdG9jIHJlZ2lzdGVyIHRvICZ0b2MgKyAzMjc2OCwgaW4gb3JkZXIgdG8gKi8KLS8qIHVzZSB0aGUgY29tcGxldGUgcmFuZ2Ugb2YgYSAxNi1iaXQgZGlzcGxhY2VtZW50LiBXZSBoYXZlIHRvIGFkanVzdCAqLwotLyogZm9yIHRoaXMgd2hlbiB3ZSBmaXggdXAgbG9hZHMgZGlzcGxhY2VkIG9mZiB0aGUgdG9jIHJlZy4gICAgICAgICAgICovCi0jZGVmaW5lIFRPQ19MT0FEX0FESlVTVE1FTlQgKC0zMjc2OCkKLSNkZWZpbmUgVE9DX1NFQ1RJT05fTkFNRSAiLnByaXZhdGUudG9jIgotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotLyogdGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZ28gaW4gYSBoZWFkZXIgZmlsZSBzb21ld2hlcmUuLi4gKi8KLQotLyogTk9QICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgICAgICAgICAgMHgwMDAwCi0KLS8qIDY0LWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjY0ICAgICAgICAgICAgMHgwMDAxCi0KLS8qIDMyLWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyICAgICAgICAgICAgMHgwMDAyCi0KLS8qIDI2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIGFic29sdXRlKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIyNCAgICAgICAgICAgIDB4MDAwMwotCi0vKiAxNi1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNiAgICAgICAgICAgIDB4MDAwNAotCi0vKiAxNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTQgICAgICAgICAgICAweDAwMDUKLQotLyogMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUwyNCAgICAgICAgICAgICAweDAwMDYKLQotLyogMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMTQgICAgICAgICAgICAgMHgwMDA3Ci0KLS8qIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2ICAgICAgICAgIDB4MDAwOAotCi0vKiAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgICAgICAgICAgMHgwMDA5Ci0KLS8qIDMyLWJpdCBhZGRyIHcvbyBpbWFnZSBiYXNlICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyTkIgICAgICAgICAgMHgwMDBBCi0KLS8qIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwgICAgICAgICAgICAweDAwMEIKLQotLyogc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNUSU9OICAgICAgICAgICAweDAwMEMKLQotLyogc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lGR0xVRSAgICAgICAgICAgIDB4MDAwRAotCi0vKiBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19JTUdMVUUgICAgICAgICAgICAweDAwMEUKLQotLyogdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChsaW1pdGVkIHRvIDE2IGJpdHMpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMMTYgICAgICAgICAgMHgwMDBGCi0KLS8qIHN0dWZmIHRvIGhhbmRsZSBpbW1lZGlhdGUgZGF0YSB3aGVuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgKi8KLS8qIGRhdGEgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaW1tZWRpYXRlIGZpZWxkICovCi0vKiBXZSBuZWVkIHRvIGRvICh1c3VhbGx5KSAzMiBiaXQgYXJpdGhtZXRpYyBvbiAxNiBiaXQgY2h1bmtzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGSEkgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGTE8gICAgICAgICAgICAgMHgwMDExCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUEFJUiAgICAgICAgICAgICAgMHgwMDEyCi0KLS8qIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdG9jcmVsMTYsIHdpdGggVE9DREVGTiBhc3N1bWVkICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAgICAgMHgwMDEzCi0KLS8qICBGbGFnIGJpdHMgaW4gSU1BR0VfUkVMT0NBVElPTi5UWVBFICovCi0KLS8qIHN1YnRyYWN0IHJlbG9jIHZhbHVlIHJhdGhlciB0aGFuIGFkZGluZyBpdCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX05FRyAgICAgICAgICAgICAgIDB4MDEwMAotCi0vKiBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJUQUtFTiAgICAgICAgICAgMHgwMjAwCi0KLS8qIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggbm90IHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gICAgICAgICAgMHgwNDAwCi0KLS8qIHRvYyBzbG90IGRlZmluZWQgaW4gZmlsZSAob3IsIGRhdGEgaW4gdG9jKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gICAgICAgICAgIDB4MDgwMAotCi0vKiBtYXNrcyB0byBpc29sYXRlIGFib3ZlIHZhbHVlcyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlR5cGUgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyAgICAgICAgICAweDAwRkYKLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19GTEFHTUFTSyAgICAgICAgICAweDBGMDAKLQotI2RlZmluZSBFWFRSQUNUX1RZUEUoeCkgICAgICAgICAgICAgICAgICgoeCkgJiBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLKQotI2RlZmluZSBFWFRSQUNUX0ZMQUdTKHgpICgoeCkgJiBJTUFHRV9SRUxfUFBDX0ZMQUdNQVNLKQotI2RlZmluZSBFWFRSQUNUX0pVTksoeCkgIFwKLSAgICAgICAgICAgKCh4KSAmIH4oSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyB8IElNQUdFX1JFTF9QUENfRkxBR01BU0spKQotCi0MCi0vKiBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlIHJlbG9jYXRpb24gd29yayAqLwotLyogKFdvcmsgSW4gUHJvZ3Jlc3MpICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19wYWlyX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgIGNoYXIgKiplcnJvcikpOwotCi0MCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY190b2MxNl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLQotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2FkZHIzMm5iX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQkgUFRSIGRhdGEsCi0JCQkJCQkJIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCSBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWN0aW9uX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQlhcmVsZW50ICpyZWxvYywKLQkJCQkJCQlhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJUFRSIGRhdGEsCi0JCQkJCQkJYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCWNoYXIgKiplcnJvcikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWNyZWxfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2ltZ2x1ZV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLQotCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgUEFSQU1TKChiZmQgKmFiZmQsIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvKSk7Ci0KLQwKLS8qIEZJWE1FOiBJdCdsbCB0YWtlIGEgd2hpbGUgdG8gZ2V0IHRocm91Z2ggYWxsIG9mIHRoZXNlLiBJIG9ubHkgbmVlZCBhIGZldyB0bwotICAgZ2V0IHVzIHN0YXJ0ZWQsIHNvIHRob3NlIEknbGwgbWFrZSBzdXJlIHdvcmsuIFRob3NlIG1hcmtlZCBGSVhNRSBhcmUgZWl0aGVyCi0gICBjb21wbGV0ZWx5IHVudmVyaWZpZWQgb3IgaGF2ZSBhIHNwZWNpZmljIHVua25vd24gbWFya2VkIGluIHRoZSBjb21tZW50ICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJlbG9jYXRpb24gZW50cmllcyBmb3IgV2luZG93cy9OVCBvbiBQb3dlclBDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZyb20gdGhlIGRvY3VtZW50ICIiIHdlIGZpbmQgdGhlIGZvbGxvd2luZyBsaXN0ZWQgYXMgdXNlZCByZWxvY3M6ICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUJTT0xVVEUgICAgICAgOiBUaGUgbm9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUREUls2NHwzMnwxNl0gOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBkYXRhIGZpZWxkcyBvciB0aGUgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIG9uIGEgbG9hZC9zdG9yZS4gICAgICAgICAgICAgKi8KLS8qICAgQUREUlsyNHwxNF0gICAgOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBicmFuY2ggYW5kIGNvbmQgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBicmFuY2hlcy4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3Nlcy4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBUaGUgbG93IG9yZGVyIDIgYml0cyBhcmUgcHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgUkVMWzI0fDE0XSAgICAgOiBicmFuY2hlcyByZWxhdGl2ZSB0byB0aGUgSW5zdHJ1Y3Rpb24gQWRkcmVzcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3NlcywgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBhcyBiZWZvcmUuIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB3aWxsIGJlIHplcm8sIGFuZCAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgU1lNIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgbGluayB0aW1lLiAgKi8KLS8qICAgVE9DUkVMMTYgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIHJlZmVycmluZyB0byBhIHNsb3QgaW4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0b2MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVE9DUkVMMTQgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkLCBzaW1pbGFyIHRvIFJFTDE0IG9yIEFERFIxNC4gKi8KLS8qICAgQUREUjMyTkIgICAgICAgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAoT24gdGhlIGFscGhhLCB0aGlzIGlzIGFsd2F5cyBhIGxpbmtlciBnZW5lcmF0ZWQgdGh1bmspKi8KLS8qICAgICAgICAgICAgICAgICAgICAoaS5lLiAzMmJpdCBhZGRyIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBiYXNlKSAgICAgICAgICAgKi8KLS8qICAgU0VDUkVMICAgICAgICAgOiBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBzeW1ib2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgU0VDVElPTiAgICAgICAgOiBhY2Nlc3MgdG8gdGhlIGhlYWRlciBjb250YWluaW5nIHRoZSBpdGVtLiBTdXBwb3J0cyB0aGUgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb2RldmlldyBkZWJ1Z2dlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEluIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgICAgICAgICAgKi8KLS8qIHJlbG9jYXRpb25zIGxpc3RlZCBpbiB0aGUgaGVhZGVyIGZpbGUgYXJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgMHgwMDAwICAgTk9QICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUJTT0xVVEUsIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGRvbnQgY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFCU09MVVRFIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsCSAJICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwLCAgICAgICAgCQkgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjY0IDB4MDAwMSAgNjQtYml0IGFkZHJlc3MgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyhJTUFHRV9SRUxfUFBDX0FERFI2NCwgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTMsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCTY0LAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAJIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkiQUREUjY0IiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JdHJ1ZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JTUlOVVNfT05FLAkgCSAvKiBzcmNfbWFzayAqLwotCU1JTlVTX09ORSwgICAgICAgIAkgLyogZHN0X21hc2sgKi8KLQlmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMiAweDAwMDIgIDMyLWJpdCBhZGRyZXNzICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMjQgMHgwMDAzICAyNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCBhYnNvbHV0ZSkgKi8KLSAgLyogdGhlIExJIGZpZWxkIGlzIGluIGJpdCA2IHRocm91Z2ggYml0IDI5IGlzIDI0IGJpdHMsICsgMiBmb3IgdGhlIHNoaWZ0ICovCi0gIC8qIE9mIGNvdXJzZSwgVGhhdCdzIHRoZSBJQk0gYXBwcm92ZWQgYml0IG51bWJlcmluZywgd2hpY2ggaXMgbm90IHdoYXQgKi8KLSAgLyogYW55b25lIGVsc2UgdXNlcy4uLi4gVGhlIGxpIGZpZWxkIGlzIGluIGJpdCAyIHRocnUgMjUgKi8gCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIyNCwgIC8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjI0IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwN2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDdmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMTYgMHgwMDA0ICAxNi1iaXQgYWRkcmVzcyAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMTYsICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIxNiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIxNCAweDAwMDUgKi8KLSAgLyogIDE2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBGSVhNRTogdGhlIG1hc2sgaXMgbGlrZWx5IHdyb25nLCBhbmQgdGhlIGJpdCBwb3NpdGlvbiBtYXkgYmUgYXMgd2VsbCAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIxNCwgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjE2IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMjQgMHgwMDA2ICovCi0gIC8qICAgMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUkVMMjQsICAgLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVMMjQiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMTQgMHgwMDA3ICovCi0gIC8qICAgMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0gIC8qIEZJWE1FOiB0aGUgbWFzayBpcyBsaWtlbHkgd3JvbmcsIGFuZCB0aGUgYml0IHBvc2l0aW9uIG1heSBiZSBhcyB3ZWxsICovCi0gIC8qIEZJWE1FOiBob3cgZG9lcyBpdCBrbm93IGhvdyBmYXIgdG8gc2hpZnQ/ICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjE0LCAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBRERSMTYiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAweDAwMDggKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfVE9DUkVMMTYsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3RvYzE2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJUT0NSRUwxNiIsICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgMHgwMDA5ICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0LC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTQiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMk5CIDB4MDAwQSAqLwotICAvKiAgIDMyLWJpdCBhZGRyIHcvIGltYWdlIGJhc2UgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMzJOQiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyTkIiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfU0VDUkVMIDB4MDAwQiAqLwotICAvKiAgIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfc2VjcmVsX3JlbG9jLCAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1NFQ1RJT04gMHgwMDBDICovCi0gIC8qICAgc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNUSU9OLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3NlY3Rpb25fcmVsb2MsICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNUSU9OIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JRkdMVUUgMHgwMDBEICovCi0gIC8qICAgc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19JRkdMVUUsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJJRkdMVUUiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JTUdMVUUgMHgwMDBFICovCi0gIC8qICAgc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfSU1HTFVFLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19pbWdsdWVfcmVsb2MsICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiSU1HTFVFIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiAweDAwMEYgKi8KLSAgLyogICB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGxpbWl0ZWQgdG8gMTYgYml0cykgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTDE2IiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19SRUZISSAgICAgICAgICAgICAweDAwMTAgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19SRUZISSwgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVGSEkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1JFRkxPICAgICAgICAgICAgIDB4MDAxMSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1JFRkxPLCAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSRUZMTyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19QQUlSICAgICAgICAgICAgICAweDAwMTIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19QQUlSLCAgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19wYWlyX3JlbG9jLCAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUEFJUiIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAweDAwMTMgKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHdpdGhvdXQgY2F1c2luZyBhIGRlZmluaXRpb24gKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKCAoSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiB8IElNQUdFX1JFTF9QUENfVE9DREVGTiksIC8qIHR5cGUgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTYsIFRPQ0RFRk4iLCAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLQotDAotCi0vKiBTb21lIHJlYWxseSBjaGVlenkgbWFjcm9zIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiB0byB0ZXN0IHN0ZGVyciA6LSkgKi8KLQotI2lmZGVmIERFQlVHX1JFTE9DCi0jZGVmaW5lIFVOX0lNUEwoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHN0YXRpYyBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBpZiAoaSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgZnByaW50ZihzdGRlcnIsXygiVW5pbXBsZW1lbnRlZCBSZWxvY2F0aW9uIC0tICVzXG4iKSx4KTsgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEVU1QX1JFTE9DKG4scikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIGFkZHIgJWQsIGFkZGVuZCAlZFxuIiwgXAotCSAgIG4sICgqKHItPnN5bV9wdHJfcHRyKSktPm5hbWUsICAgICAgICAgICAgIFwKLQkgICByLT5hZGRyZXNzLCByLT5hZGRlbmQpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIEdpdmVuIGEgcmVsb2MgbmFtZSwgbiwgYW5kIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbF9yZWxvYywgCi0gICBkdW1wIG91dCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBvbiB0aGUgY29udGVudHMgCi0KLSNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCi0jZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCi0jZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0Ci0KLSovCi0KLSNkZWZpbmUgRFVNUF9SRUxPQzIobixyKSAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIHJfdmFkZHIgJWQgJXNcbiIsIFwKLQkgICBuLCByLT5yX3N5bW5keCwgci0+cl92YWRkcixcCi0JICAgKCgoci0+cl90eXBlKSAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgPT0gMCkgXAotCSAgID8iICI6IiBUT0NERUZOIiAgKTsgICAgICBcCi19Ci0KLSNlbHNlCi0jZGVmaW5lIFVOX0lNUEwoeCkKLSNkZWZpbmUgRFVNUF9SRUxPQyhuLHIpCi0jZGVmaW5lIERVTVBfUkVMT0MyKG4scikKLSNlbmRpZgotCi0KLQwKLS8qIHRvYyBjb25zdHJ1Y3Rpb24gYW5kIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBhbmQgdGhlc2UgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIG9uZQotICAgb2YgdGhlIGNvbXBpbGF0aW9ucy4gIEZJWE1FOiBUaGlzIGlzIGNvbmZ1c2luZyBhbmQgd2VpcmQuICBBbHNvLAotICAgQkZEIHNob3VsZCBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuICAqLwotZXh0ZXJuIGJmZCogYmZkX29mX3RvY19vd25lcjsKLWV4dGVybiBsb25nIGludCBnbG9iYWxfdG9jX3NpemU7Ci0KLWV4dGVybiBsb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWV4dGVybiBsb25nIGludCBmaXJzdF90aHVua19hZGRyZXNzOwotZXh0ZXJuIGxvbmcgaW50IHRodW5rX3NpemU7Ci0KLWVudW0gdG9jX3R5cGUKLXsKLSAgZGVmYXVsdF90b2MsCi0gIHRvY18zMiwKLSAgdG9jXzY0Ci19OwotCi1lbnVtIHJlZl9jYXRlZ29yeQotewotICBwcml2LAotICBwdWIsCi0gIGRhdGEKLX07Ci0KLXN0cnVjdCBsaXN0X2VsZQotewotICBzdHJ1Y3QgbGlzdF9lbGUgKm5leHQ7Ci0gIGJmZF92bWEgYWRkcjsKLSAgZW51bSByZWZfY2F0ZWdvcnkgY2F0OwotICBpbnQgb2Zmc2V0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2VsZSAqaGVhZDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyB2b2lkIHJlY29yZF90b2MKLSAgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBlbnVtIHJlZl9jYXRlZ29yeSwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdG9jICh0b2Nfc2VjdGlvbiwgb3VyX3RvY19vZmZzZXQsIGNhdCwgbmFtZSkKLSAgICAgYXNlY3Rpb24gKnRvY19zZWN0aW9uOwotICAgICBpbnQgb3VyX3RvY19vZmZzZXQ7Ci0gICAgIGVudW0gcmVmX2NhdGVnb3J5IGNhdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogYWRkIHRoaXMgZW50cnkgdG8gb3VyIHRvYyBhZGRyLW9mZnNldC1uYW1lIGxpc3QgKi8KLSAgc3RydWN0IGxpc3RfZWxlICp0OwotICB0ID0gKHN0cnVjdCBsaXN0X2VsZSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaXN0X2VsZSkpOwotICBpZiAodCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotICB0LT5uZXh0ID0gMDsKLSAgdC0+b2Zmc2V0ID0gb3VyX3RvY19vZmZzZXQ7Ci0gIHQtPm5hbWUgPSBuYW1lOwotICB0LT5jYXQgPSBjYXQ7Ci0gIHQtPmFkZHIgPSB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCi0gIGlmIChoZWFkID09IDApCi0gICAgewotICAgICAgaGVhZCA9IHQ7Ci0gICAgICB0YWlsID0gdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YWlsLT5uZXh0ID0gdDsKLSAgICAgIHRhaWwgPSB0OwotICAgIH0KLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi1zdGF0aWMgYm9vbGVhbiBwcGNfcmVjb3JkX3RvY19lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgaW50LCBlbnVtIHRvY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotCi0vKiByZWNvcmQgYSB0b2Mgb2Zmc2V0IGFnYWluc3QgYSBzeW1ib2wgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfcmVjb3JkX3RvY19lbnRyeShhYmZkLCBpbmZvLCBzZWMsIHN5bSwgdG9jX2tpbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc3ltOwotICAgICBlbnVtIHRvY190eXBlIHRvY19raW5kIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaW50ICpsb2NhbF9zeW1zOwotCi0gIGggPSAwOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0gIGlmIChoICE9IDApCi0gICAgewotICAgICAgSEFTSF9DSEVDSyhoKTsKLSAgICB9Ci0KLSAgaWYgKGggPT0gMCkgCi0gICAgeyAKLSAgICAgIGxvY2FsX3N5bXMgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoYWJmZCk7Ci0gICAgICBpZiAobG9jYWxfc3ltcyA9PSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgLyogYWxsb2NhdGUgYSB0YWJsZSAqLwotCSAgbG9jYWxfc3ltcyA9IAotCSAgICAoaW50ICopIGJmZF96YWxsb2MgKGFiZmQsIAotCQkJCW9ial9yYXdfc3ltZW50X2NvdW50KGFiZmQpICogc2l6ZW9mKGludCkpOwotCSAgaWYgKGxvY2FsX3N5bXMgPT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGFiZmQpID0gbG9jYWxfc3ltczsKLQkgIGZvciAoaSA9IDA7IGkgPCBvYmpfcmF3X3N5bWVudF9jb3VudChhYmZkKTsgKytpKQotCSAgICB7Ci0JICAgICAgU0VUX1VOQUxMT0NBVEVEKGxvY2FsX3N5bXNbaV0pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoSVNfVU5BTExPQ0FURUQobG9jYWxfc3ltc1tzeW1dKSkgCi0JewotCSAgbG9jYWxfc3ltc1tzeW1dID0gZ2xvYmFsX3RvY19zaXplOwotCSAgZ2xvYmFsX3RvY19zaXplICs9IDQ7Ci0KLQkgIC8qIFRoZSBzaXplIG11c3QgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkgIGlmIChnbG9iYWxfdG9jX3NpemUgPiA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIHRvYyBzbG90IGFsbG9jYXRlZC4gSWYgbm90LCBkbyBpdAotCSBoZXJlLiBJdCB3aWxsIGJlIHVzZWQgaW4gcmVsb2NhdGVfc2VjdGlvbiAqLwotICAgICAgaWYgKElTX1VOQUxMT0NBVEVEKGgtPnRvY19vZmZzZXQpKQotCXsKLQkgIGgtPnRvY19vZmZzZXQgPSBnbG9iYWxfdG9jX3NpemU7Ci0JICBnbG9iYWxfdG9jX3NpemUgKz0gNDsKLQotCSAgLyogVGhlIHNpemUgbXVzdCBmaXQgaW4gYSAxNmJpdCBkaXNwbGFjbWVudCAqLwotCSAgaWYgKGdsb2JhbF90b2Nfc2l6ZSA+PSA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIHJlY29yZCBhIHRvYyBvZmZzZXQgYWdhaW5zdCBhIHN5bWJvbCAqLwotc3RhdGljIHZvaWQKLXBwY19tYXJrX3N5bWJvbF9hc19nbHVlKGFiZmQsIHN5bSwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzeW07Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotewotICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0KLSAgSEFTSF9DSEVDSyhoKTsKLQotICBoLT5zeW1ib2xfaXNfZ2x1ZSA9IDE7Ci0gIGgtPmdsdWVfaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSAmcmVsLT5yX3ZhZGRyKTsKLQotICByZXR1cm47Ci19Ci0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQwKLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiAKLSAgICAoISBob3d0by0+cGNfcmVsYXRpdmUpIAotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfQUREUjMyTkIpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19UT0NSRUwxNikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lNR0xVRSkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lGR0xVRSkgCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNSRUwpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNUSU9OKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfU0VDUkVMMTYpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19SRUZISSkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1JFRkxPKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4pIDsKLX0gICAgIAotCi0jaWYgMAotCi0vKiB0aGlzIGZ1bmN0aW9uIGlzIGluIGNoYXJnZSBvZiBwZXJmb3JtaW5nIGFsbCB0aGUgcHBjIFBFIHJlbG9jYXRpb25zICovCi0vKiBEb24ndCB5ZXQga25vdyBpZiB3ZSB3YW50IHRvIGRvIHRoaXMgdGhpcyBwYXJ0aWN1bGFyIHdheSAuLi4gKGtyaykgICovCi0vKiBGSVhNRTogKGl0IGlzIG5vdCB5ZXQgZW5hYmxlZCkgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcGVfcHBjX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiB0aGUgY29uc3RoIHJlbG9jYXRpb24gY29tZXMgaW4gdHdvIHBhcnRzLCB3ZSBoYXZlIHRvIHJlbWVtYmVyCi0gICAgIHRoZSBzdGF0ZSBiZXR3ZWVuIGNhbGxzLCBpbiB0aGVzZSB2YXJpYWJsZXMgKi8KLSAgc3RhdGljIGJvb2xlYW4gcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJ0MV9jb25zdGhfdmFsdWU7Ci0KLSAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKLSAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KLQkKLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkKSAKLSAgICB7Ci0gICAgICAvKiBQYXJ0aWFsIGxpbmtpbmcgLSBkbyBub3RoaW5nICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsgCi0gICAgfQotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIEtlZXAgdGhlIHN0YXRlIG1hY2hpbmUgaGFwcHkgaW4gY2FzZSB3ZSdyZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19SRUZISSkgCi0JewotCSAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7Ci0JICBwYXJ0MV9jb25zdGhfdmFsdWUgID0gMDsKLQl9Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7Ci0gICAgfQotICAKLSAgaWYgKChwYXJ0MV9jb25zdGhfYWN0aXZlKSAmJiAocl90eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikpIAotICAgIHsKLSAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBQQUlSIik7Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gICAgfQotCi0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOwotICAKLSAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgYXNlY3Rpb24gKnRvY19zZWN0aW9uID0gMDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IDA7Ci0gIAotICAvKiBJZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGEKLSAgICAgdGhpbmcuICBUaGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkanVzdGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBoaWhhbGYgPSBmYWxzZTsKLSAgaGloYWxmX3ZhbCA9IDA7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfYnl0ZSAqbG9jOwotCi0gICAgICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChyZWwtPnJfdHlwZSk7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0gIAotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLSAgICAgIGxvYyA9IGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBGSVhNRTogY2hlY2sgYm91bmRzIG9uIHJfdHlwZSAqLwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAKLQkgICAgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XSk7Ci0JICBpZiAoaCAhPSAwKSAKLQkgICAgewotCSAgICAgIEhBU0hfQ0hFQ0soaCk7Ci0JICAgIH0KLQotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19JTUdMVUUgJiYgaCA9PSAwKQotCXsKLQkgIC8qIEFuIElNR0xVRSByZWxvYyBtdXN0IGhhdmUgYSBuYW1lLiBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KLQkgIGFib3J0KCk7Ci0JfQotCi0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogRklYTUU6IFBBSVIgdW5zdXBwb3J0ZWQgaW4gdGhlIGZvbGxvd2luZyBjb2RlICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKG91dHB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgSEFTSF9DSEVDSyhoKTsKLQotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICAgIC8qIEVhY2ggY2FzZSBtdXN0IGRvIGl0cyBvd24gcmVsb2NhdGlvbiwgc2V0dGluZyByc3RhdCBhcHByb3ByaWF0ZWx5ICovCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIElNQUdFX1JFTF9QUENfVE9DUkVMMTY6Ci0JICB7Ci0JICAgIGJmZF92bWEgb3VyX3RvY19vZmZzZXQ7Ci0JICAgIGludCBmaXhpdDsKLQotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAodG9jX3NlY3Rpb24gPT0gMCkgCi0JICAgICAgewotCQl0b2Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiZmRfb2ZfdG9jX293bmVyLCAKLQkJCQkJCSAgICAgICBUT0NfU0VDVElPTl9OQU1FKTsKLQotCQlpZiAoIHRvY19zZWN0aW9uID09IE5VTEwgKSAKLQkJICB7Ci0JCSAgICAvKiBUaGVyZSBpcyBubyB0b2Mgc2VjdGlvbi4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0JCSAgICBhYm9ydCgpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogCi0JICAgICAqICBBbWF6aW5nIGJpdCB0cmlja3MgcHJlc2VudC4gQXMgd2UgbWF5IGhhdmUgc2VlbiBlYXJsaWVyLCB3ZQotCSAgICAgKiAgdXNlIHRoZSAxIGJpdCB0byB0ZWxsIHVzIHdoZXRoZXIgb3Igbm90IGEgdG9jIG9mZnNldCBoYXMgYmVlbgotCSAgICAgKiAgYWxsb2NhdGVkLiBOb3cgdGhhdCB0aGV5J3ZlIGFsbCBiZWVuIGFsbG9jYXRlZCwgd2Ugd2lsbCB1c2UKLQkgICAgICogIHRoZSAxIGJpdCB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHdyaXR0ZW4gdGhpcyBwYXJ0aWN1bGFyIHRvYwotCSAgICAgKiAgZW50cnkgb3V0LgotCSAgICAgKi8KLQkgICAgZml4aXQgPSBmYWxzZTsKLQkgICAgaWYgKGggPT0gMCkKLQkgICAgICB7IC8qIGl0IGlzIGEgZmlsZSBsb2NhbCBzeW1ib2wgKi8KLQkJaW50ICpsb2NhbF90b2NfdGFibGU7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJc3ltID0gc3ltcyArIHN5bW5keDsKLQkJbmFtZSA9IHN5bS0+X24uX25fbmFtZTsKLQotCQlsb2NhbF90b2NfdGFibGUgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoaW5wdXRfYmZkKTsKLQkJb3VyX3RvY19vZmZzZXQgPSBsb2NhbF90b2NfdGFibGVbc3ltbmR4XTsKLQotCQlpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCi0JCSAgewotCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKLQkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKLQkJICAgICAgIGFnYWluLgotCQkgICAgICovCi0JCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCi0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCAKLQkJCSAgICAgICBvdXJfdG9jX29mZnNldCwgCi0JCQkgICAgICAgcHJpdiwgCi0JCQkgICAgICAgc3RyZHVwKG5hbWUpKTsKLQotCQkgICAgYmZkX3B1dF8zMihvdXRwdXRfYmZkLAotCQkJICAgICAgIHZhbCwKLQkJCSAgICAgICB0b2Nfc2VjdGlvbi0+Y29udGVudHMgKyBvdXJfdG9jX29mZnNldCk7Ci0KLQkJICAgIE1BUktfQVNfV1JJVFRFTihsb2NhbF90b2NfdGFibGVbc3ltbmR4XSk7Ci0JCSAgICBmaXhpdCA9IHRydWU7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJb3VyX3RvY19vZmZzZXQgPSBoLT50b2Nfb2Zmc2V0OwotCi0JCWlmICgocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgCi0JCSAgICA9PSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gKQotCQkgIHsKLQkJICAgIC8qIFRoaXMgaXMgdW5iZWxpZXZhYmxlIGNoZWVzZS4gU29tZSBrbm93bGVkZ2FibGUgYXNtIAotCQkgICAgICAgaGFja2VyIGhhcyBkZWNpZGVkIHRvIHVzZSByMiBhcyBhIGJhc2UgZm9yIGxvYWRpbmcgCi0JCSAgICAgICBhIHZhbHVlLiBIZS9TaGUgZG9lcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHRvY2RlZm4gYml0LCAKLQkJICAgICAgIGFuZCBub3Qgc3VwcGx5aW5nIGEgdG9jIGRlZmluaXRpb24uIFRoZSBiZWhhdmlvdXIgaXMgCi0JCSAgICAgICB0aGVuIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWx1ZSBvZiB0aGUgCi0JCSAgICAgICBzeW1ib2wgYW5kIHRoZSBhY3R1YWwgbG9jYXRpb24gb2YgdGhlIHRvYyBhcyB0aGUgdG9jIAotCQkgICAgICAgaW5kZXguIAotCi0JCSAgICAgICBJbiBmYWN0LCB3aGF0IGlzIHVzdWFsbHkgaGFwcGVuaW5nIGlzLCBiZWNhdXNlIHRoZQotCQkgICAgICAgSW1wb3J0IEFkZHJlc3MgVGFibGUgaXMgbWFwcGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZwotCQkgICAgICAgdGhlIHRvYywgc29tZSB0cmlwcHkgbGlicmFyeSBjb2RlIHRyeWluZyBmb3Igc3BlZWQgb24KLQkJICAgICAgIGRsbCBsaW5rYWdlLCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhhdCBhbmQgY29uc2lkZXJzIAotCQkgICAgICAgdGhlIElBVCB0byBiZSBwYXJ0IG9mIHRoZSB0b2MsIHRodXMgc2F2aW5nIGEgbG9hZC4KLQkJICAgICovCi0KLQkJICAgIG91cl90b2Nfb2Zmc2V0ID0gdmFsIC0gCi0JCSAgICAgICh0b2Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkgICAgICAgdG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgICAvKiBUaGUgc2l6ZSBtdXN0IHN0aWxsIGZpdCBpbiBhIDE2Yml0IGRpc3BsYWNtZW50ICovCi0JCSAgICBpZiAob3VyX3RvY19vZmZzZXQgPj0gNjU1MzUpCi0JCSAgICAgIHsKLQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAoXygiJXM6IFJlbG9jYXRpb24gZm9yICVzIG9mICV4IGV4Y2VlZHMgVG9jIHNpemUgbGltaXQiKSwgCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBuYW1lLCBvdXJfdG9jX29mZnNldCk7Ci0JCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCi0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCBvdXJfdG9jX29mZnNldCwgcHViLCBzdHJkdXAobmFtZSkpOwotCQkgIH0KLQkJZWxzZSBpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCi0JCSAgewotCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKLQkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKLQkJICAgICAgIGFnYWluLgotCQkgICAgICovCi0JCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBwdWIsIHN0cmR1cChuYW1lKSk7Ci0KLQkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCi0JCSAgICBiZmRfcHV0XzMyKG91dHB1dF9iZmQsCi0JCQkgICAgICAgdmFsLAotCQkJICAgICAgIHRvY19zZWN0aW9uLT5jb250ZW50cyArIG91cl90b2Nfb2Zmc2V0KTsKLQotCQkgICAgTUFSS19BU19XUklUVEVOKGgtPnRvY19vZmZzZXQpOwotCQkgICAgLyogVGhlIHRyaWNreSBwYXJ0IGlzIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyB0aGF0ICovCi0JCSAgICAvKiBuZWVkcyBhIC5yZWxvYyBlbnRyeSBmb3IgaXQgKi8KLQkJICAgIGZpeGl0ID0gdHJ1ZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChmaXhpdCAmJiBpbmZvLT5iYXNlX2ZpbGUpIAotCSAgICAgIHsKLQkJLyogU28gaWYgdGhpcyBpcyBub24gcGNyZWxhdGl2ZSwgYW5kIGlzIHJlZmVyZW5jZWQKLQkJICAgdG8gYSBzZWN0aW9uIG9yIGEgY29tbW9uIHN5bWJvbCwgdGhlbiBpdCBuZWVkcyBhIHJlbG9jICovCi0KLQkJLyogcmVsb2NhdGlvbiB0byBhIHN5bWJvbCBpbiBhIHNlY3Rpb24gd2hpY2gKLQkJICAgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKLQkJICAgdG8gYSBmaWxlICovCi0KLQkJYmZkX3ZtYSBhZGRyID0gIHRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCQkgICAgCi0JCWlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotCQlmd3JpdGUgKCZhZGRyLCAxLDQsIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci0JICAgICAgfQotCi0KLQkgICAgLyogRklYTUU6IHRoaXMgdGVzdCBpcyBjb25zZXJ2YXRpdmUgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICYmCi0JCW91cl90b2Nfb2Zmc2V0ID4gdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogUmVsb2NhdGlvbiBleGNlZWRzIGFsbG9jYXRlZCBUT0MgKCV4KSIpLCAKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIC8qIE5vdyB3ZSBrbm93IHRoZSByZWxvY2F0aW9uIGZvciB0aGlzIHRvYyByZWZlcmVuY2UgKi8KLQkgICAgcmVsb2NhdGlvbiA9ICBvdXJfdG9jX29mZnNldCArIFRPQ19MT0FEX0FESlVTVE1FTlQ7Ci0JICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgICBpbnB1dF9iZmQsIAotCQkJCQkgICAgcmVsb2NhdGlvbiwgCi0JCQkJCSAgICBsb2MpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0lGR0xVRToKLQkgIHsKLQkgICAgLyogVG8gc29sdmUgdGhpcywgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgKi8KLQkgICAgLyogYXBwZWFyaW5nIG9uIHRoZSBjYWxsIGluc3RydWN0aW9uIGlzIGEgZ2x1ZSBmdW5jdGlvbiBvciBub3QuICovCi0JICAgIC8qIEEgZ2x1ZSBmdW5jdGlvbiBtdXN0IGFubm91bmNlIGl0c2VsZiB2aWEgYSBJTUdMVUUgcmVsb2MsIGFuZCAqLwotCSAgICAvKiB0aGUgcmVsb2MgY29udGFpbnMgdGhlIHJlcXVpcmVkIHRvYyByZXN0b3JlIGluc3RydWN0aW9uICovCi0JICAKLQkgICAgYmZkX3ZtYSB4OwotCSAgICBjb25zdCBjaGFyICpteV9uYW1lOwotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAoaCAhPSAwKQotCSAgICAgIHsKLQkJbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJaWYgKGgtPnN5bWJvbF9pc19nbHVlID09IDEpIAotCQkgIHsKLQkJICAgIHggPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbG9jKTsKLQkJICAgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCBoLT5nbHVlX2luc24sIGxvYyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0JICAvKiBVbmltcGxlbWVudGVkOiBjb2RldmlldyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KLQkgIC8qIEZvciBmYXN0IGFjY2VzcyB0byB0aGUgaGVhZGVyIG9mIHRoZSBzZWN0aW9uIAotCSAgICAgY29udGFpbmluZyB0aGUgaXRlbS4gKi8KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotCSAgLyogVW5pbXBsZW1lbnRlZDogY29kZXZpZXcgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCi0JICAvKiBJcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSByZWxhdGl2ZQotCSAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotCSAgICAgc3ltYm9sICovCi0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfQUJTT0xVVEU6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIGlmIChoID09IDApCi0JCW15X25hbWUgPSAoc3ltcytzeW1uZHgpLT5fbi5fbl9uYW1lOwotCSAgICBlbHNlCi0JICAgICAgewotCQlteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIH0KLQotCSAgICBmcHJpbnRmKHN0ZGVyciwgCi0JCSAgICBfKCJXYXJuaW5nOiB1bnN1cHBvcnRlZCByZWxvYyAlcyA8ZmlsZSAlcywgc2VjdGlvbiAlcz5cbiIpLCAKLQkJICAgIGhvd3RvLT5uYW1lLAotCQkgICAgYmZkX2dldF9maWxlbmFtZShpbnB1dF9iZmQpLAotCQkgICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0KLQkgICAgZnByaW50ZihzdGRlcnIsInN5bSAlbGQgKCVzKSwgcl92YWRkciAlbGQgKCVseClcbiIsIAotCQkgICAgcmVsLT5yX3N5bW5keCwgbXlfbmFtZSwgKGxvbmcpIHJlbC0+cl92YWRkciwKLQkJICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICB9Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfSU1HTFVFOgotCSAgewotCSAgICAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4gVGhpcyByZWxvYyB3YXMgbm90ZWQgaW4gdGhlIGZpcnN0Ci0JICAgICAgIHBhc3Mgb3ZlciB0aGUgcmVsb2NzLCBhbmQgdGhlIGdsdWUgaW5zdHJ1Y3Rpb24gZXh0cmFjdGVkICovCi0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIGlmIChoLT5zeW1ib2xfaXNfZ2x1ZSA9PSAxKSAKLQkgICAgICBicmVhazsKLQkgICAgbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAoXygiJXM6IE91dCBvZiBvcmRlciBJTUdMVUUgcmVsb2MgZm9yICVzIiksIAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBteV9uYW1lKTsKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpteWggPSAwOwotCSAgICBjb25zdCBjaGFyICpuYW1lID0gMDsKLQkgICAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0KLQkgICAgaWYgKHN0cm5jbXAoIi5pZGF0YSQyIixpbnB1dF9zZWN0aW9uLT5uYW1lLDgpID09IDAgJiYgZmlyc3RfdGh1bmtfYWRkcmVzcyA9PSAwKQotCSAgICAgIHsKLQkJLyogc2V0IG1hZ2ljIHZhbHVlcyAqLwotCQlpbnQgaWRhdGE1b2Zmc2V0OwotCQlzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKm15aCA9IDA7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTVfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkgICAgc2VjLT5vdXRwdXRfb2Zmc2V0IC0gCi0JCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCQotCQlpZGF0YTVvZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTZfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCi0JCXRodW5rX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgLSBpZGF0YTVvZmZzZXQ7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJaW1wb3J0X3RhYmxlX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JICAgICAgfQotCi0JICAgIGlmIChoID09IDApCi0JICAgICAgeyAvKiBpdCBpcyBhIGZpbGUgbG9jYWwgc3ltYm9sICovCi0JCXN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JCW5hbWUgPSBzeW0tPl9uLl9uX25hbWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQljaGFyICp0YXJnZXQgPSAwOwotCi0JCW5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWlmIChzdHJjbXAoIi5pZGF0YSQyIiwgbmFtZSkgPT0gMCkKLQkJICB0YXJnZXQgPSAiX19pZGF0YTJfbWFnaWNfXyI7Ci0JCWVsc2UgaWYgKHN0cmNtcCgiLmlkYXRhJDQiLCBuYW1lKSA9PSAwKQotCQkgIHRhcmdldCA9ICJfX2lkYXRhNF9tYWdpY19fIjsKLQkJZWxzZSBpZiAoc3RyY21wKCIuaWRhdGEkNSIsIG5hbWUpID09IDApCi0JCSAgdGFyZ2V0ID0gIl9faWRhdGE1X21hZ2ljX18iOwotCi0JCWlmICh0YXJnZXQgIT0gMCkKLQkJICB7Ci0JCSAgICBteWggPSAwOwotCi0JCSAgICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgdGFyZ2V0LAotCQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCSAgICBpZiAobXloID09IDApIAotCQkgICAgICB7Ci0JCQkvKiBNaXNzaW5nIG1hZ2ljIGNvb2tpZXMuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotCQkJYWJvcnQoKTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICB2YWwgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgKyAKLQkJICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQkgICAgaWYgKGZpcnN0X3RodW5rX2FkZHJlc3MgPT0gMCkKLQkJICAgICAgewotCQkJaW50IGlkYXRhNW9mZnNldDsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE1X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkJICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAKLQkJCSAgICBzZWMtPm91dHB1dF9vZmZzZXQgLSAKLQkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCQkKLQkJCWlkYXRhNW9mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE2X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJCi0JCQl0aHVua19zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlIC0gaWRhdGE1b2Zmc2V0OwotCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCi0JCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlpbXBvcnRfdGFibGVfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJICAgICAgCSAgICAgIGlucHV0X2JmZCwgCi0JCQkgICAgICB2YWwgLSAKLQkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UsCi0JCQkgICAgICBsb2MpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIElNQUdFX1JFTF9QUENfUkVMMjQ6Ci0JICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQkgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgaW5wdXRfYmZkLCAKLQkJCQkJICB2YWwsIAotCQkJCQkgIGxvYyk7Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfQUREUjE2OgotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLQkgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsIAotCQkJCQkgIHZhbCwgCi0JCQkJCSAgbG9jKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCBpbmZvLT5iYXNlX2ZpbGUgKQotCXsKLQkgIC8qIFNvIGlmIHRoaXMgaXMgbm9uIHBjcmVsYXRpdmUsIGFuZCBpcyByZWZlcmVuY2VkCi0JICAgICB0byBhIHNlY3Rpb24gb3IgYSBjb21tb24gc3ltYm9sLCB0aGVuIGl0IG5lZWRzIGEgcmVsb2MgKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCi0JICAgIHsKLQkgICAgICAvKiByZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaAotCQkgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKLQkJIHRvIGEgZmlsZSAqLwotCSAgICAgIGJmZF92bWEgYWRkciA9IHJlbC0+cl92YWRkciAKLQkJLSBpbnB1dF9zZWN0aW9uLT52bWEgCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgICAgICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLQkJewotCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkJfQotCSAgICAgIGZ3cml0ZSAoJmFkZHIsIDEsNCwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UgaWYgKHN5bSA9PSBOVUxMKQotCSAgICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgICAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JCSAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RybmNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLQkJYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JCW5hbWUgPSBidWY7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgCi0JCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgewotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCX0KLQotICAgIH0gICAgIAotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLS8qIEZJWE1FOiBCRkQgc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4gIFRoaXMgZmlsZSBpcyBjb21waWxlZAotICAgdHdpY2UsIGFuZCB0aGVzZSB2YXJpYWJsZXMgYXJlIHNoYXJlZC4gIFRoaXMgaXMgY29uZnVzaW5nIGFuZAotICAgd2VpcmQuICAqLwotCi1sb25nIGludCBnbG9iYWxfdG9jX3NpemUgPSA0OwotCi1iZmQqIGJmZF9vZl90b2Nfb3duZXIgPSAwOwotCi1sb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWxvbmcgaW50IGZpcnN0X3RodW5rX2FkZHJlc3M7Ci1sb25nIGludCB0aHVua19zaXplOwotCi1zdHJ1Y3QgbGlzdF9lbGUgKmhlYWQ7Ci1zdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyBjaGFyICoKLWgxID0gTl8oIlxuXHRcdFx0VE9DIE1BUFBJTkdcblxuIik7Ci1zdGF0aWMgY2hhciAqCi1oMiA9IE5fKCIgVE9DICAgIGRpc2Fzc2VtYmx5ICBDb21tZW50cyAgICAgICBOYW1lXG4iKTsKLXN0YXRpYyBjaGFyICoKLWgzID0gTl8oIiBPZmZzZXQgIHNwZWxsaW5nICAgICAgICAgICAgICAgICAgIChpZiBwcmVzZW50KVxuIik7Ci0KLXZvaWQKLWR1bXBfdG9jICh2ZmlsZSkKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIHN0cnVjdCBsaXN0X2VsZSAqdDsKLQotICBmcHJpbnRmKGZpbGUsIF8oaDEpKTsKLSAgZnByaW50ZihmaWxlLCBfKGgyKSk7Ci0gIGZwcmludGYoZmlsZSwgXyhoMykpOwotCi0gIGZvcih0ID0gaGVhZDsgdCAhPSAwOyB0PXQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqY2F0ID0gIiI7Ci0KLSAgICAgIGlmICh0LT5jYXQgPT0gcHJpdikKLQljYXQgPSBfKCJwcml2YXRlICAgICAgICIpOwotICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IHB1YikKLQljYXQgPSBfKCJwdWJsaWMgICAgICAgICIpOwotICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IGRhdGEpCi0JY2F0ID0gXygiZGF0YS1pbi10b2MgICAiKTsKLQotICAgICAgaWYgKHQtPm9mZnNldCA+IGdsb2JhbF90b2Nfc2l6ZSkKLQl7Ci0JICBpZiAodC0+b2Zmc2V0IDw9IGdsb2JhbF90b2Nfc2l6ZSArIHRodW5rX3NpemUpCi0JICAgIGNhdCA9IF8oIklBVCByZWZlcmVuY2UgIik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmKGZpbGUsCi0JCSAgICAgIF8oIioqKiogZ2xvYmFsX3RvY19zaXplICVsZCglbHgpLCB0aHVua19zaXplICVsZCglbHgpXG4iKSwKLQkJICAgICAgZ2xvYmFsX3RvY19zaXplLCBnbG9iYWxfdG9jX3NpemUsIHRodW5rX3NpemUsIHRodW5rX3NpemUpOwotCSAgICAgIGNhdCA9IF8oIk91dCBvZiBib3VuZHMhIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICAiICUwNGx4ICAgICglZCkiLCAodW5zaWduZWQgbG9uZykgdC0+b2Zmc2V0LCB0LT5vZmZzZXQgLSAzMjc2OCk7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgIiAgICAlcyAlc1xuIiwKLQkgICAgICBjYXQsIHQtPm5hbWUpOwotCi0gICAgfQotCi0gIGZwcmludGYoZmlsZSwgIlxuIik7Ci19Ci0KLWJvb2xlYW4KLXBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoaW5mbykgCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZm9vOwotICBzdGF0aWMgY2hhciB0ZXN0X2NoYXIgPSAnMSc7Ci0KLSAgaWYgKCBnbG9iYWxfdG9jX3NpemUgPT0gMCApIC8qIEZJWE1FOiBkb2VzIHRoaXMgZ2V0IG1lIGluIHRyb3VibGU/ICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgb3duZXI/IFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lICggYmZkX29mX3RvY19vd25lciAsIFRPQ19TRUNUSU9OX05BTUUpOwotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgc2VjdGlvbj8gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0gICAgICBhYm9ydCgpOwotICAgIH0KLQotICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jKGJmZF9vZl90b2Nfb3duZXIsIGdsb2JhbF90b2Nfc2l6ZSk7Ci0gIG1lbXNldChmb28sIHRlc3RfY2hhciwgZ2xvYmFsX3RvY19zaXplKTsKLQotICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxfdG9jX3NpemU7Ci0gIHMtPmNvbnRlbnRzID0gZm9vOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1wcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppLCAqcmVsOwotCi0gIC8qIGhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gKi8KLQotICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMoYWJmZCk7Ci0KLSAgLyogcnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgdG9jICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yICg7IHNlYyAhPSAwOyBzZWMgPSBzZWMtPm5leHQpCi0gIHsKLSAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKSAKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLyogbG9hZCB0aGUgcmVsb2NzICovCi0gICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlICovCi0gICAgaT1fYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MoYWJmZCxzZWMsMSwwLDAsMCk7Ci0gICAgCi0gICAgaWYgKGkgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICBmb3IgKHJlbD1pO3JlbDxpK3NlYy0+cmVsb2NfY291bnQ7KytyZWwpIAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLQl1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0JYm9vbGVhbiBvayA9IHRydWU7Ci0KLQlEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0KLQlzd2l0Y2gocl90eXBlKSAKLQkgIHsKLQkgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLQkgICAgLyogaWYgVE9DREVGTiBpcyBvbiwgaWdub3JlIGFzIHNvbWVvbmUgZWxzZSBoYXMgYWxsb2NhdGVkIHRoZQotCSAgICAgICB0b2MgZW50cnkgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICkKLQkgICAgICBvayA9IHBwY19yZWNvcmRfdG9jX2VudHJ5KGFiZmQsIGluZm8sIHNlYywgCi0JCQkJCXJlbC0+cl9zeW1uZHgsIGRlZmF1bHRfdG9jKTsKLQkgICAgaWYgKCFvaykKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLQkgICAgcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUoYWJmZCwgcmVsLT5yX3N5bW5keCwgcmVsKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJSRUZISSIpOwotICBEVU1QX1JFTE9DKCJSRUZISSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jaWYgMAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJSRUZMTyIpOwotICBEVU1QX1JFTE9DKCJSRUZMTyIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3BhaXJfcmVsb2MgKGFiZmQsCi0JCXJlbG9jX2VudHJ5LAotCQlzeW1ib2wsCi0JCWRhdGEsCi0JCWlucHV0X3NlY3Rpb24sCi0JCW91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJQQUlSIik7Ci0gIERVTVBfUkVMT0MoIlBBSVIiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotDAotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3RvYzE2X3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgVU5fSU1QTCgiVE9DUkVMMTYiKTsKLSAgRFVNUF9SRUxPQygiVE9DUkVMMTYiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2lmIDAKLQotLyogQUREUjMyTkIgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgKE9uIHRoZSBhbHBoYSwgdGhpcyBpcyBhbHdheXMgYSBsaW5rZXIgZ2VuZXJhdGVkIHRodW5rKSovCi0vKiAgICAgICAgICAgIChpLmUuIDMyYml0IGFkZHIgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGJhc2UpICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19hZGRyMzJuYl9yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIkFERFIzMk5CIik7Ci0gIERVTVBfUkVMT0MoIkFERFIzMk5CIixyZWxvY19lbnRyeSk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19zZWNyZWxfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJTRUNSRUwiKTsKLSAgRFVNUF9SRUxPQygiU0VDUkVMIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3NlY3Rpb25fcmVsb2MgKGFiZmQsCi0JCSAgIHJlbG9jX2VudHJ5LAotCQkgICBzeW1ib2wsCi0JCSAgIGRhdGEsCi0JCSAgIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsCi0JCSAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJTRUNUSU9OIik7Ci0gIERVTVBfUkVMT0MoIlNFQ1RJT04iLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfaW1nbHVlX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgVU5fSU1QTCgiSU1HTFVFIik7Ci0gIERVTVBfUkVMT0MoIklNR0xVRSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLQotI2RlZmluZSBNQVhfUkVMT0NfSU5ERVggIFwKLSAgICAgIChzaXplb2YocHBjX2NvZmZfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHBwY19jb2ZmX2hvd3RvX3RhYmxlWzBdKSAtIDEpCi0KLQotLyogRklYTUU6IFRoZXJlIGlzIGEgcG9zc2libGl0eSB0aGF0IHdoZW4gd2UgcmVhZCBpbiBhIHJlbG9jIGZyb20gYSBmaWxlLAotICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIHNvbWUgYml0cyBlbmNvZGVkIGluIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSAKLQkgIHR5cGUgZmllbGQuIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0qLwotc3RhdGljIHZvaWQgcHBjX2NvZmZfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqcmVsZW50LAotCQkJCQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWwpKTsKLQotc3RhdGljIHZvaWQKLXBwY19jb2ZmX3J0eXBlMmhvd3RvIChyZWxlbnQsIGludGVybmFsKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWw7Ci17ICAKLQotICAvKiBXZSBjYW4gZW5jb2RlIG9uZSBvZiB0aHJlZSB0aGluZ3MgaW4gdGhlIHR5cGUgZmllbGQsIGFzaWRlIGZyb20gdGhlCi0gICAgIHR5cGU6Ci0gICAgIDEuIElNQUdFX1JFTF9QUENfTkVHIC0gaW5kaWNhdGVzIHRoZSB2YWx1ZSBmaWVsZCBpcyBhIHN1YnRyYWN0aW9uCi0gICAgICAgIHZhbHVlLCByYXRoZXIgdGhhbiBhbiBhZGRpdGlvbiB2YWx1ZQotICAgICAyLiBJTUFHRV9SRUxfUFBDX0JSVEFLRU4sIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gLSBpbmRpY2F0ZXMgdGhhdAotICAgICAgICB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuIG9yIG5vdC4KLSAgICAgMy4gSU1BR0VfUkVMX1BQQ19UT0NERUZOIC0gdG9jIHNsb3QgZGVmaW5pdGlvbiBpbiB0aGUgZmlsZQotICAgICBGb3Igbm93LCB3ZSBqdXN0IHN0cmlwIHRoaXMgc3R1ZmYgdG8gZmluZCB0aGUgdHlwZSwgYW5kIGlnbm9yZSBpdCBvdGhlcgotICAgICB0aGFuIHRoYXQuCi0gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChpbnRlcm5hbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MoaW50ZXJuYWwtPnJfdHlwZSk7Ci0gIHVuc2lnbmVkIHNob3J0IGp1bmsgICAgPSBFWFRSQUNUX0pVTksgKGludGVybmFsLT5yX3R5cGUpOwotCi0gIC8qIHRoZSBtYXNraW5nIHByb2Nlc3Mgb25seSBzbGljZXMgb2ZmIHRoZSBib3R0b20gYnl0ZSBmb3Igcl90eXBlLiAqLwotICBpZiAoIHJfdHlwZSA+IE1BWF9SRUxPQ19JTkRFWCApIAotICAgIGFib3J0KCk7Ci0KLSAgLyogY2hlY2sgZm9yIGFic29sdXRlIGNyYXAgKi8KLSAgaWYgKCBqdW5rICE9IDAgKQotICAgIGFib3J0KCk7Ci0KLSAgc3dpdGNoKHJfdHlwZSkgCi0gICAgewotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDVElPTjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDUkVMOgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCBpbnRlcm5hbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgCi0JICAgICAgXygiV2FybmluZzogVW5zdXBwb3J0ZWQgcmVsb2MgJXMgWyVkXSB1c2VkIC0tIGl0IG1heSBub3Qgd29yay5cbiIpLAotCSAgICAgIHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkgICAgICByX3R5cGUpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsgICAgICAKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJlbGVudC0+aG93dG8gPSBob3d0bzsKLSAgCi19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogV2UgY2FuIGVuY29kZSBvbmUgb2YgdGhyZWUgdGhpbmdzIGluIHRoZSB0eXBlIGZpZWxkLCBhc2lkZSBmcm9tIHRoZQotICAgICB0eXBlOgotICAgICAxLiBJTUFHRV9SRUxfUFBDX05FRyAtIGluZGljYXRlcyB0aGUgdmFsdWUgZmllbGQgaXMgYSBzdWJ0cmFjdGlvbgotICAgICAgICB2YWx1ZSwgcmF0aGVyIHRoYW4gYW4gYWRkaXRpb24gdmFsdWUKLSAgICAgMi4gSU1BR0VfUkVMX1BQQ19CUlRBS0VOLCBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOIC0gaW5kaWNhdGVzIHRoYXQKLSAgICAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbiBvciBub3QuCi0gICAgIDMuIElNQUdFX1JFTF9QUENfVE9DREVGTiAtIHRvYyBzbG90IGRlZmluaXRpb24gaW4gdGhlIGZpbGUKLSAgICAgRm9yIG5vdywgd2UganVzdCBzdHJpcCB0aGlzIHN0dWZmIHRvIGZpbmQgdGhlIHR5cGUsIGFuZCBpZ25vcmUgaXQgb3RoZXIKLSAgICAgdGhhbiB0aGF0LgotICAqLwotCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MocmVsLT5yX3R5cGUpOwotICB1bnNpZ25lZCBzaG9ydCBqdW5rICAgID0gRVhUUkFDVF9KVU5LIChyZWwtPnJfdHlwZSk7Ci0KLSAgLyogdGhlIG1hc2tpbmcgcHJvY2VzcyBvbmx5IHNsaWNlcyBvZmYgdGhlIGJvdHRvbSBieXRlIGZvciByX3R5cGUuICovCi0gIGlmICggcl90eXBlID4gTUFYX1JFTE9DX0lOREVYICkgCi0gICAgYWJvcnQoKTsKLSAgCi0gIC8qIGNoZWNrIGZvciBhYnNvbHV0ZSBjcmFwICovCi0gIGlmICgganVuayAhPSAwICkKLSAgICBhYm9ydCgpOwotICAgIAotICBzd2l0Y2gocl90eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsIAotCSAgICAgIF8oIldhcm5pbmc6IFVuc3VwcG9ydGVkIHJlbG9jICVzIFslZF0gdXNlZCAtLSBpdCBtYXkgbm90IHdvcmsuXG4iKSwKLQkgICAgICBwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsCi0JICAgICAgcl90eXBlKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLQotLyogYSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZSAqLwotI2RlZmluZSBIT1cyTUFQKGJmZF9ydHlwZSxwcGNfcnR5cGUpICBcCi0gY2FzZSBiZmRfcnR5cGU6IHJldHVybiAmcHBjX2NvZmZfaG93dG9fdGFibGVbcHBjX3J0eXBlXQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzMyX0dPVE9GRiwgICAgSU1BR0VfUkVMX1BQQ19JTUdMVUUpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTZfR09UX1BDUkVMLCBJTUFHRV9SRUxfUFBDX0lGR0xVRSk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjE2KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19CMjYsICAgICAgSU1BR0VfUkVMX1BQQ19SRUwyNCk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfQkEyNiwgICAgIElNQUdFX1JFTF9QUENfQUREUjI0KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19UT0MxNiwgICAgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNl9HT1RPRkYsICAgIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18zMiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1JWQSwgICAgICAgICAgSU1BR0VfUkVMX1BQQ19BRERSMzJOQik7Ci0gICAgZGVmYXVsdDogCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLSN1bmRlZiBIT1cyTUFQCi0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgIHBwY19jb2ZmX3J0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYyB2b2lkIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZW5kaWYKLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gICAgICAgICAgY29mZl9wcGNfcnR5cGVfdG9faG93dG8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgICAgICAgICAgcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBGSVhNRTogVGhpcyBubyBsb25nZXIgd29ya3MuICAqLwotI2RlZmluZSBjb2ZmX3N3YXBfc3ltX2luX2hvb2sgICAgICAgIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sKLSNlbmRpZgotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhpbnRlcm5hbCwgaG93dG8pIHtpbnRlcm5hbC5yX3R5cGU9aG93dG8tPnR5cGU7fQotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKLQotLyogRklYTUU6IFRoaXMgY29udHJvbHMgc29tZSBjb2RlIHRoYXQgdXNlZCB0byBiZSBpbiBwZWljb2RlLmggYW5kIGlzCi0gICBub3cgaW4gcGVpZ2VuLmMuICBJdCB3aWxsIG5vdCBjb250cm9sIHRoZSBjb2RlIGluIHBlaWdlbi5jLiAgSWYKLSAgIGFueWJvZHkgd2FudHMgdG8gZ2V0IHRoaXMgd29ya2luZywgeW91IHdpbGwgbmVlZCB0byBmaXggdGhhdC4gICovCi0jZGVmaW5lIFBPV0VSUENfTEVfUEUKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5pZGF0YSQyIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAwIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuaWRhdGEkMyIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmlkYXRhJDQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5pZGF0YSQ1IiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuaWRhdGEkNiIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMSB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLnJlbG9jIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAxIH0KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQwKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLS8qIEZJWE1FOgotICAgV2hhdCB3ZSdyZSB0cnlpbmcgdG8gZG8gaGVyZSBpcyBhbGxvY2F0ZSBhIHRvYyBzZWN0aW9uIChlYXJseSksIGFuZCBhdHRhY2ggCi0gICBpdCB0byB0aGUgbGFzdCBiZmQgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGF2b2lkcyB0aGUgcHJvYmxlbSBvZiBoYXZpbmcgYSB0b2MKLSAgIHdyaXR0ZW4gb3V0IGJlZm9yZSBhbGwgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcwotICAgYSB0b2Mgc2VjdGlvbiBmb3IgZXZlcnkgZmlsZSwgYW5kIHJlY29yZHMgdGhlIGxhc3Qgb25lIHNlZW4uIFRoZXJlIGFyZQotICAgYXQgbGVhc3QgdHdvIHByb2JsZW1zIHdpdGggdGhpcyBhcHByb2FjaDoKLSAgIDEuIFdlIGFsbG9jYXRlIHdob2xlIGJ1bmNoZXMgb2YgdG9jIHNlY3Rpb25zIHRoYXQgYXJlIGlnbm9yZWQsIGJ1dCBhdAotICAgICAgYXQgbGVhc3Qgd2Ugd2lsbCBub3QgYWxsb2NhdGUgYSB0b2MgaWYgbm8gLnRvYyBpcyBwcmVzZW50LgotICAgMi4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCBiZWluZyB0aGUgbGFzdCBiZmQgcmVhZCBuZWNlc3NhcmlseSBtZWFucwotICAgICAgdGhhdCB5b3UgYXJlIHRoZSBsYXN0IGJmZCBjbG9zZWQuCi0gICAzLiBEb2luZyBpdCBvbiBhICJzd2FwIGluIiBob29rIGRlcGVuZHMgb24gd2hlbiB0aGUgInN3YXAgaW4iIGlzIGNhbGxlZCwKLSAgICAgIGFuZCBob3cgb2Z0ZW4sIGV0Yy4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCB0aGVyZSBpc24ndCBhIGhvbGUgaGVyZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW4xOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgIT0gMCkgLyogd2UgYWxyZWFkeSBoYXZlIGEgdG9jLCBzbyBnbyBob21lICovCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdHJjbXAoaW4tPl9uLl9uX25hbWUsICIudG9jIikgPT0gMCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKCBhYmZkICwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0gICAgICBpZiAocyAhPSBOVUxMKSAKLQl7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgOwotCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXsKLQkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yICovCi0JICBhYm9ydCgpOwotCX0KLQotICAgICAgLyogc2F2ZSB0aGUgYmZkIGZvciBsYXRlciBhbGxvY2F0aW9uICovCi0gICAgICBiZmRfb2ZfdG9jX293bmVyID0gYWJmZDsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLXN0YXRpYyBib29sZWFuIHBwY19kb19sYXN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICpwcGNfZ2V0X2xhc3QgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2RvX2xhc3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQgPT0gYmZkX29mX3RvY19vd25lcikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJmZCAqCi1wcGNfZ2V0X2xhc3QoKQotewotICByZXR1cm4gYmZkX29mX3RvY19vd25lcjsKLX0KLQotLyogdGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCi0gICB0aGUgdG9jIHNlY3Rpb24gaXMgd3JpdHRlbiBsYXN0LiAKLQotICAgVGhpcyBkb2VzIGRlcGVuZCBvbiBiZmRfbWFrZV9zZWN0aW9uIGF0dGFjaGluZyBhIG5ldyBzZWN0aW9uIHRvIHRoZQotICAgZW5kIG9mIHRoZSBzZWN0aW9uIGxpc3QgZm9yIHRoZSBiZmQuIAotCi0gICBUaGlzIGlzIG90aGVyd2lzZSBpbnRlbmRlZCB0byBiZSBmdW5jdGlvbmFsbHkgdGhlIHNhbWUgYXMgCi0gICBjb2ZmbGluay5jOl9iZmRfY29mZl9maW5hbF9saW5rKCkuIEl0IGlzIHNwZWNpZmljYWxseSBkaWZmZXJlbnQgb25seSAKLSAgIHdoZXJlIHRoZSBQT1dFUlBDX0xFX1BFIG1hY3JvIG1vZGlmaWVzIHRoZSBjb2RlLiBJdCBpcyBsZWZ0IGluIGFzIGEgCi0gICBwcmVjaXNlIGZvcm0gb2YgY29tbWVudC4ga3JrQGN5Z251cy5jb20KLSovCi0KLQotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLXBwY19iZmRfY29mZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBib29sZWFuIGRlYnVnX21lcmdlX2FsbG9jYXRlZDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby5sYXN0X2JmX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbyA9IGluZm87Ci0KLSAgZmluZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0ICgmZmluZm8uZGVidWdfbWVyZ2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSB0cnVlOwotCi0gIC8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVycyBhbmQgcmVsb2NhdGlvbiBlbnRyaWVzIHJlcXVpcmVkIGZvciB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBTZXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgcmVsX2ZpbGVwb3MgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X2xpbmVub19jb3VudCA9IDA7Ci0gIG1heF9yZWxvY19jb3VudCA9IDA7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0KLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JfQotICAgIH0KLQotICAvKiBJZiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlCi0gICAgIG5lZWQgdG8ga2VlcC4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQotICAgICAgICAgdGhlIHRhcmdldF9pbmRleCBmaWVsZHMgYXJlIDEgYmFzZWQuICAqLwotICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLQkoKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0JIGJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7Ci0gICAgICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzID0gTlVMTDsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKLQlvLT5saW5lX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLQkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgIT0gMCkKLQl7Ci0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LAotCSAgICAgYnV0IG9ubHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCBpcyBub3QgdGhlCi0JICAgICBjb21tb24gY2FzZS4gICovCi0JICBCRkRfQVNTRVJUIChpbmZvLT5yZWxvY2F0ZWFibGUpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KLQkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KLQkgICAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSByZWxvYyBhbmQgbGluZW5vIGNvdW50cywgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8KLQkgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgIH0KLQotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gbGluZV9maWxlcG9zOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYW4gaW5wdXQgQkZELiAgVGFrZQotICAgICB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYXIgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGRzIG9mIGFsbCB0aGUKLSAgICAgaW5wdXQgQkZEJ3MuICAqLwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgICAgIHN6ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCW1heF9zeW1fY291bnQgPSBzejsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBidWZmZXJzIHVzZWQgd2hpbGUgbGlua2luZy4gICovCi0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgZmluZm8uc2VjX3B0cnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkJICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCSAgICAgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCQkJICAgICBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnNlY19wdHJzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAotICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKQotICAgICAgfHwgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAmJiBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIGV4Y2VwdCB0aGF0Ci0gICAgIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlcmVmb3JlIHdlIGRvbid0Ci0gICAgIGtub3cgd2hlcmUgdGhlIHN0cmluZyB0YWJsZSBzdGFydHMuICBXZSBqdXN0IGJ1aWxkIHRoZSBzdHJpbmcKLSAgICAgdGFibGUgaW4gbWVtb3J5IGFzIHdlIGdvIGFsb25nLiAgV2UgcHJvY2VzcyBhbGwgdGhlIHJlbG9jYXRpb25zCi0gICAgIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOwotCi0gIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0jaWZkZWYgUE9XRVJQQ19MRV9QRQotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1biAmJiAhcHBjX2RvX2xhc3Qoc3ViKSkKLSNlbHNlCi0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotI2VuZGlmCi0JCXsKLQkJICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgewotICAgIGJmZCogbGFzdF9vbmUgPSBwcGNfZ2V0X2xhc3QoKTsKLSAgICBpZiAobGFzdF9vbmUpCi0gICAgICB7Ci0JaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIGxhc3Rfb25lKSkKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgfQotICAgIGxhc3Rfb25lLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgfQotI2VuZGlmCi0KLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IF9iZmRfY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgICAgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiAgV3JpdGUgaXQgb3V0IGFnYWluIGlmCi0gICAgIG5lY2Vzc2FyeS4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmICh1bnNpZ25lZCBpbnQpIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlICE9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0sCi0JCQkgICAoUFRSKSAmZmluZm8pOwotICBpZiAoZmluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBvdXRzeW1zIGJ1ZmZlciBpcyB1c2VkIGJ5IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLiAgKi8KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdwotCSB0aGUgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuCi0JIGZpbmFsbHkgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKChiZmRfYnl0ZSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeikpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGJmZF9ieXRlICplcmVsOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotCSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoKCpyZWxfaGFzaCktPmluZHggPj0gMCk7Ci0JCSAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkJfQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQkgICAgYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCSAgICBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zdHJ0YWIpICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzdHJidWYpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLSAgICAgIGlmIChiZmRfd3JpdGUgKHN0cmJ1ZiwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkgIT0gU1RSSU5HX1NJWkVfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZGVidWdfbWVyZ2VfYWxsb2NhdGVkKQotICAgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnNlY19wdHJzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjX3B0cnMpOwotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0MCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSBieSBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQuICAqLwotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTTsKLSNlbmRpZgotCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IGxlYWQgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNID0KLXsKLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAkJLyogbmFtZSBvciBjb2ZmLWFybS1saXR0bGUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogRklYTUU6IG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIAotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAKLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIC8qIF9iZmRfZHVtbXlfdGFyZ2V0ICovIGNvZmZfb2JqZWN0X3AgfSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0gIAotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIC8qIEFsdGVybmF0aXZlX3RhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLSAgJiBUQVJHRVRfQklHX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICBUQVJHRVRfQklHX05BTUUsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBGSVhNRTogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCAvKiBfYmZkX2R1bW15X3RhcmdldCAqLyBjb2ZmX29iamVjdF9wIH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLQotICAvKiBBbHRlcm5hdGl2ZV90YXJnZXQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0gICYgVEFSR0VUX0xJVFRMRV9TWU0sCi0jZWxzZQotICBOVUxMLAotI2VuZGlmCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcnM2MDAwLmMgYi9iZmQvY29mZi1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyMzAwMC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1yczYwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJQk0gUlMvNjAwMCAiWENPRkYiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSwgCi0gICAgIGFuZCBKb2huIEdpbG1vcmUuCi0gICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLSAgIENvbnRyaWJ1dGVkIGJ5IElCTSBDb3Jwb3JhdGlvbiBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW50ZXJuYWxjb2ZmLmggYW5kIGNvZmZjb2RlLmggbW9kaWZ5IHRoZW1zZWx2ZXMgYmFzZWQgb24gdGhpcyBmbGFnLiAgKi8KLSNkZWZpbmUgUlM2MDAwQ09GRl9DIDEKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotCi1zdGF0aWMgYm9vbGVhbiB4Y29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9ydHlwZTJob3d0bwotICBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp4Y29mZl9hcmNoaXZlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBQVFIgeGNvZmZfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmQgKnhjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBpbnQgeGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbm9ybWFsaXplX2ZpbGVuYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl93cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQwKLS8qIFdlIHVzZSBvdXIgb3duIHRkYXRhIHR5cGUuICBJdHMgZmlyc3QgZmllbGQgaXMgdGhlIENPRkYgdGRhdGEgdHlwZSwKLSAgIHNvIHRoZSBDT0ZGIHJvdXRpbmVzIGFyZSBjb21wYXRpYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID0KLSAgICAoKHN0cnVjdCB4Y29mZl90ZGF0YSAqKQotICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl90ZGF0YSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLSAgY29mZi0+c3ltYm9scyA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIGNvZmYtPmNvbnZlcnNpb25fdGFibGUgPSAodW5zaWduZWQgaW50ICopIE5VTEw7Ci0gIGNvZmYtPnJhd19zeW1lbnRzID0gKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikgTlVMTDsKLSAgY29mZi0+cmVsb2NiYXNlID0gMDsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7Ci0KLSAgLyogV2Ugc2V0IGNwdXR5cGUgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgbm90IGJlZW4KLSAgICAgaW5pdGlhbGl6ZWQuICAqLwotICB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSA9IC0xOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHMgPSBOVUxMOwotICB4Y29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5kaWNlcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgWENPRkYgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKml4LCAqb3g7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGliZmQtPnh2ZWMgIT0gb2JmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaXggPSB4Y29mZl9kYXRhIChpYmZkKTsKLSAgb3ggPSB4Y29mZl9kYXRhIChvYmZkKTsKLSAgb3gtPmZ1bGxfYW91dGhkciA9IGl4LT5mdWxsX2FvdXRoZHI7Ci0gIG94LT50b2MgPSBpeC0+dG9jOwotICBpZiAoaXgtPnNudG9jID09IDApCi0gICAgb3gtPnNudG9jID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaWJmZCwgaXgtPnNudG9jKTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQlveC0+c250b2MgPSAwOwotICAgICAgZWxzZQotCW94LT5zbnRvYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0gIGlmIChpeC0+c25lbnRyeSA9PSAwKQotICAgIG94LT5zbmVudHJ5ID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaWJmZCwgaXgtPnNuZW50cnkpOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCW94LT5zbmVudHJ5ID0gMDsKLSAgICAgIGVsc2UKLQlveC0+c25lbnRyeSA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0gIG94LT50ZXh0X2FsaWduX3Bvd2VyID0gaXgtPnRleHRfYWxpZ25fcG93ZXI7Ci0gIG94LT5kYXRhX2FsaWduX3Bvd2VyID0gaXgtPmRhdGFfYWxpZ25fcG93ZXI7Ci0gIG94LT5tb2R0eXBlID0gaXgtPm1vZHR5cGU7Ci0gIG94LT5jcHV0eXBlID0gaXgtPmNwdXR5cGU7Ci0gIG94LT5tYXhkYXRhID0gaXgtPm1heGRhdGE7Ci0gIG94LT5tYXhzdGFjayA9IGl4LT5tYXhzdGFjazsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEkgZG9uJ3QgdGhpbmsgWENPRkYgcmVhbGx5IGhhcyBhIG5vdGlvbiBvZiBsb2NhbCBsYWJlbHMgYmFzZWQgb24KLSAgIG5hbWUuICBUaGlzIHdpbGwgbWVhbiB0aGF0IGxkIC1YIGRvZXNuJ3QgYWN0dWFsbHkgc3RyaXAgYW55dGhpbmcuCi0gICBUaGUgQUlYIG5hdGl2ZSBsaW5rZXIgZG9lcyBub3QgaGF2ZSBhIC1YIG9wdGlvbiwgYW5kIGl0IGlnbm9yZXMgdGhlCi0gICAteCBvcHRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogVGhlIFhDT0ZGIHJlbG9jIHRhYmxlLiAgQWN0dWFsbHksIFhDT0ZGIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhlCi0gICBiaXRzaXplIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHNpZ25lZCBvciBub3QsIGFsb25nIHdpdGggYQotICAgY29udmVudGlvbmFsIHR5cGUuICBUaGlzIHRhYmxlIGlzIGZvciB0aGUgdHlwZXMsIHdoaWNoIGFyZSB1c2VkIGZvcgotICAgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIHB1dHRpbmcgaW4gdGhlIHJlbG9jLiAgTWFueSBvZiB0aGVzZQotICAgcmVsb2NzIG5lZWQgc3BlY2lhbF9mdW5jdGlvbiBlbnRyaWVzLCB3aGljaCBJIGhhdmUgbm90IHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVE9DIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcyBpcy4gICovCi0gIEhPV1RPICg0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SVEIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRXh0ZXJuYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9HTCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvY2FsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVENMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoNyksCi0gIAotICAvKiBOb24gbW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQkEiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoOSksCi0KLSAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoMHhiKSwKLQotICAvKiBJbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4YywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkwiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHhkLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STEEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEVNUFRZX0hPV1RPICgweGUpLAotICAKLSAgLyogTm9uLXJlbG9jYXRpbmcgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKDB4ZiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVGIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsICAgICAJICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEVNUFRZX0hPV1RPICgweDEwKSwKLSAgRU1QVFlfSE9XVE8gKDB4MTEpLAotICAKLSAgLyogVE9DIHJlbGF0aXZlIGluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHgxMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgbG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4MTMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTEEiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkkiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJBIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgYWJzb2x1dGUgaW5kaXJlY3QuICAqLwotICBIT1dUTyAoMHgxNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ0FJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxNywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTksCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQUMiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxYSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCUiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxYiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJSQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi1zdGF0aWMgdm9pZAoteGNvZmZfcnR5cGUyaG93dG8gKHJlbGVudCwgaW50ZXJuYWwpCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbDsKLXsKLSAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlICsgaW50ZXJuYWwtPnJfdHlwZTsKLQotICAvKiBUaGUgcl9zaXplIGZpZWxkIG9mIGFuIFhDT0ZGIHJlbG9jIGVuY29kZXMgdGhlIGJpdHNpemUgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24sIGFzIHdlbGwgYXMgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIHNpZ25lZCBvciBub3QuCi0gICAgIERvdWJsZWNoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUKLSAgICAgdHlwZSBtYXRjaGVzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMSkKLSAgICBhYm9ydCAoKTsKLSNpZiAwCi0gIGlmICgoaW50ZXJuYWwtPnJfc2l6ZSAmIDB4ODApICE9IDAKLSAgICAgID8gKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICAgIDogKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi14Y29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CMjY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzB4YV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMjY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzhdOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoKLSAgICAgIHJldHVybiAmeGNvZmZfaG93dG9fdGFibGVbM107Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiAmeGNvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoaW50ZXJuYWwsIGhvd3RvKQkJCQkJXAotICB7CQkJCQkJCQkJXAotICAgIGludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlOwkJCQkJXAotICAgIGludGVybmFsLnJfc2l6ZSA9CQkJCQkJCVwKLSAgICAgICgoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZAkJXAotCT8gMHg4MAkJCQkJCQkJXAotCTogMCkJCQkJCQkJCVwKLSAgICAgICB8IChob3d0by0+Yml0c2l6ZSAtIDEpKTsJCQkJCQlcCi0gIH0KLQwKLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgeGNvZmZfcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotCi0jZGVmaW5lIGNvZmZfbWtvYmplY3QgeGNvZmZfbWtvYmplY3QKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0MCi0vKiBYQ09GRiBhcmNoaXZlIHN1cHBvcnQuICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIGNvZGUgd2FzIGJ5Ci0gICBEYW1vbiBBLiBQZXJtZXplbC4gIEl0IHdhcyBlbmhhbmNlZCB0byBwZXJtaXQgY3Jvc3Mgc3VwcG9ydCwgYW5kCi0gICB3cml0aW5nIGFyY2hpdmUgZmlsZXMsIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBYQ09GRiB1c2VzIGl0cyBvd24gYXJjaGl2ZSBmb3JtYXQuICBFdmVyeXRoaW5nIGlzIGhvb2tlZCB0b2dldGhlcgotICAgd2l0aCBmaWxlIG9mZnNldCBsaW5rcywgc28gaXQgaXMgcG9zc2libGUgdG8gcmFwaWRseSB1cGRhdGUgYW4KLSAgIGFyY2hpdmUgaW4gcGxhY2UuICBPZiBjb3Vyc2UsIHdlIGRvbid0IGRvIHRoYXQuICBBbiBYQ09GRiBhcmNoaXZlCi0gICBoYXMgYSByZWFsIGZpbGUgaGVhZGVyLCBub3QganVzdCBhbiBBUk1BRyBzdHJpbmcuICBUaGUgc3RydWN0dXJlIG9mCi0gICB0aGUgZmlsZSBoZWFkZXIgYW5kIG9mIGVhY2ggYXJjaGl2ZSBoZWFkZXIgYXBwZWFyIGJlbG93LgotCi0gICBBbiBYQ09GRiBhcmNoaXZlIGFsc28gaGFzIGEgbWVtYmVyIHRhYmxlLCB3aGljaCBpcyBhIGxpc3Qgb2YKLSAgIGVsZW1lbnRzIGluIHRoZSBhcmNoaXZlICh5b3UgY2FuIGdldCB0aGF0IGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUKLSAgIGxpbmtlZCBsaXN0LCBidXQgeW91IGhhdmUgdG8gcmVhZCBhIGxvdCBtb3JlIG9mIHRoZSBmaWxlKS4gIFRoZQotICAgbWVtYmVyIHRhYmxlIGhhcyBhIG5vcm1hbCBhcmNoaXZlIGhlYWRlciB3aXRoIGFuIGVtcHR5IG5hbWUuICBJdCBpcwotICAgbm9ybWFsbHkgKGFuZCBwZXJoYXBzIG11c3QgYmUpIHRoZSBzZWNvbmQgdG8gbGFzdCBlbnRyeSBpbiB0aGUKLSAgIGFyY2hpdmUuICBUaGUgbWVtYmVyIHRhYmxlIGRhdGEgaXMgYWxtb3N0IHByaW50YWJsZSBBU0NJSS4gIEl0Ci0gICBzdGFydHMgd2l0aCBhIDEyIGNoYXJhY3RlciBkZWNpbWFsIHN0cmluZyB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCi0gICBlbnRyaWVzIGluIHRoZSB0YWJsZS4gIEZvciBlYWNoIGVudHJ5IGl0IGhhcyBhIDEyIGNoYXJhY3RlciBkZWNpbWFsCi0gICBzdHJpbmcgd2hpY2ggaXMgdGhlIG9mZnNldCBpbiB0aGUgYXJjaGl2ZSBvZiB0aGF0IG1lbWJlci4gIFRoZXNlCi0gICBlbnRyaWVzIGFyZSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyB3aGljaAotICAgYXJlIHRoZSBtZW1iZXIgbmFtZXMgZm9yIGVhY2ggZW50cnkuCi0KLSAgIEZpbmFsbHksIGFuIFhDT0ZGIGFyY2hpdmUgaGFzIGEgZ2xvYmFsIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMgd2hhdAotICAgd2UgY2FsbCB0aGUgYXJtYXAuICBUaGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSBoYXMgYSBub3JtYWwgYXJjaGl2ZQotICAgaGVhZGVyIHdpdGggYW4gZW1wdHkgbmFtZS4gIEl0IGlzIG5vcm1hbGx5IChhbmQgcGVyaGFwcyBtdXN0IGJlKQotICAgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFyY2hpdmUuICBUaGUgY29udGVudHMgc3RhcnQgd2l0aCBhIGZvdXIgYnl0ZQotICAgYmluYXJ5IG51bWJlciB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICBUaGlzIGlzIGZvbGxvd2VkIGJ5Ci0gICBhIHRoYXQgbWFueSBmb3VyIGJ5dGUgYmluYXJ5IG51bWJlcnM7IGVhY2ggaXMgdGhlIGZpbGUgb2Zmc2V0IG9mIGFuCi0gICBlbnRyeSBpbiB0aGUgYXJjaGl2ZS4gIFRoZXNlIG51bWJlcnMgYXJlIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mCi0gICBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgd2hpY2ggYXJlIHN5bWJvbCBuYW1lcy4gICovCi0KLS8qIFhDT0ZGIGFyY2hpdmVzIHVzZSB0aGlzIGFzIGEgbWFnaWMgc3RyaW5nLiAgKi8KLQotI2RlZmluZSBYQ09GRkFSTUFHICI8YWlhZmY+XDAxMiIKLSNkZWZpbmUgU1hDT0ZGQVJNQUcgOAotCi0vKiBUaGlzIHRlcm1pbmF0ZXMgYW4gWENPRkYgYXJjaGl2ZSBtZW1iZXIgbmFtZS4gICovCi0KLSNkZWZpbmUgWENPRkZBUkZNQUcgImBcMDEyIgotI2RlZmluZSBTWENPRkZBUkZNQUcgMgotCi0vKiBYQ09GRiBhcmNoaXZlcyBzdGFydCB3aXRoIHRoaXMgKHByaW50YWJsZSkgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyCi17Ci0gIC8qIE1hZ2ljIHN0cmluZy4gICovCi0gIGNoYXIgbWFnaWNbU1hDT0ZGQVJNQUddOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbWVtYmVyIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHN5bW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZmlyc3RtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbGFzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbGFzdG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgb24gdGhlIGZyZWUgbGlzdCAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBmcmVlb2ZmWzEyXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0ZJTEVfSERSICg1ICogMTIgKyBTWENPRkZBUk1BRykKLQotLyogRWFjaCBYQ09GRiBhcmNoaXZlIG1lbWJlciBzdGFydHMgd2l0aCB0aGlzIChwcmludGFibGUpIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9oZHIKLXsKLSAgLyogRmlsZSBzaXplIG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBzaXplWzEyXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBuZXh0IGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG5leHRvZmZbMTJdOwotCi0gIC8qIEZpbGUgb2Zmc2V0IG9mIHByZXZpb3VzIGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHByZXZvZmZbMTJdOwotCi0gIC8qIEZpbGUgbXRpbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZGF0ZVsxMl07Ci0KLSAgLyogRmlsZSBVSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgdWlkWzEyXTsKLQotICAvKiBGaWxlIEdJRCAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBnaWRbMTJdOwotCi0gIC8qIEZpbGUgbW9kZSAob2N0YWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbW9kZVsxMl07Ci0KLSAgLyogTGVuZ3RoIG9mIGZpbGUgbmFtZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuYW1sZW5bNF07Ci0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgZm9sbG93ZWQgYnkgdGhlIGZpbGUgbmFtZS4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICAgIG5hbWUgaXMgZ2l2ZW4gaW4gdGhlIG5hbWxlbiBmaWVsZC4gIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMKLSAgICAgb2RkLCB0aGUgbmFtZSBpcyBmb2xsb3dlZCBieSBhIG51bGwgYnl0ZS4gIFRoZSBuYW1lIGFuZCBvcHRpb25hbAotICAgICBudWxsIGJ5dGUgYXJlIGZvbGxvd2VkIGJ5IFhDT0ZGQVJGTUFHLCB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW4KLSAgICAgbmFtbGVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlIG1lbWJlciBmb2xsb3c7IHRoZSBudW1iZXIgb2YKLSAgICAgYnl0ZXMgaXMgZ2l2ZW4gaW4gdGhlIHNpemUgZmllbGQuICAqLwotfTsKLQotI2RlZmluZSBTSVpFT0ZfQVJfSERSICg3ICogMTIgKyA0KQotCi0vKiBXZSBzdG9yZSBhIGNvcHkgb2YgdGhlIHhjb2ZmX2FyX2ZpbGVfaGRyIGluIHRoZSB0ZGF0YSBmaWVsZCBvZiB0aGUKLSAgIGFydGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfYXJkYXRhKGFiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhKQotCi0vKiBXZSBzdG9yZSBhIGNvcHkgb2YgdGhlIHhjb2ZmX2FyX2hkciBpbiB0aGUgYXJlbHRfZGF0YSBmaWVsZCBvZiBhbgotICAgYXJjaGl2ZSBlbGVtZW50LiAgKi8KLSNkZWZpbmUgYXJjaF9lbHRkYXRhKGJmZCkgKChzdHJ1Y3QgYXJlbHRkYXRhICopICgoYmZkKS0+YXJlbHRfZGF0YSkpCi0jZGVmaW5lIGFyY2hfeGhkcihiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfaGRyICopIGFyY2hfZWx0ZGF0YSAoYmZkKS0+YXJjaF9oZWFkZXIpCi0KLS8qIFhDT0ZGIGFyY2hpdmVzIGRvIG5vdCBoYXZlIGFueXRoaW5nIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuCi0gICBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotI2RlZmluZSB4Y29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSB4Y29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIHhjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLQotLyogV2UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgZ2V0X2VsdF9hdF9pbmRleCByb3V0aW5lLiAgKi8KLQotI2RlZmluZSB4Y29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0KLS8qIFhDT0ZGIGFyY2hpdmVzIGRvIG5vdCBoYXZlIGEgdGltZXN0YW1wLiAgKi8KLQotI2RlZmluZSB4Y29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLS8qIFJlYWQgaW4gdGhlIGFybWFwIG9mIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgb2ZmOwotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgc2l6ZV90IG5hbWxlbjsKLSAgYmZkX3NpemVfdHlwZSBzejsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqY2VuZDsKLSAgdW5zaWduZWQgaW50IGMsIGk7Ci0gIGNhcnN5bSAqYXJzeW07Ci0gIGJmZF9ieXRlICpwOwotCi0gIGlmICh4Y29mZl9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgb2ZmID0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFiZmQpLT5zeW1vZmYsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGlmIChvZmYgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBzeW1ib2wgdGFibGUgc3RhcnRzIHdpdGggYSBub3JtYWwgYXJjaGl2ZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNraXAgdGhlIG5hbWUgKG5vcm1hbGx5IGVtcHR5KS4gICovCi0gIG5hbWxlbiA9IHN0cnRvbCAoaGRyLm5hbWxlbiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoKG5hbWxlbiArIDEpICYgfjEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN6ID0gc3RydG9sIChoZHIuc2l6ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzeik7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBjb250ZW50cywgMSwgc3osIGFiZmQpICE9IHN6KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3ltYm9sIHRhYmxlIHN0YXJ0cyB3aXRoIGEgZm91ciBieXRlIGNvdW50LiAgKi8KLSAgYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgY29udGVudHMpOwotCi0gIGlmIChjICogNCA+PSBzeikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSAoKGNhcnN5bSAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwgYyAqIHNpemVvZiAoY2Fyc3ltKSkpOwotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWZ0ZXIgdGhlIGNvdW50IGNvbWVzIGEgbGlzdCBvZiBmb3VyIGJ5dGUgZmlsZSBvZmZzZXRzLiAgKi8KLSAgZm9yIChpID0gMCwgYXJzeW0gPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcywgcCA9IGNvbnRlbnRzICsgNDsKLSAgICAgICBpIDwgYzsKLSAgICAgICArK2ksICsrYXJzeW0sIHAgKz0gNCkKLSAgICBhcnN5bS0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCi0gIC8qIEFmdGVyIHRoZSBmaWxlIG9mZnNldHMgY29tZSBudWxsIHRlcm1pbmF0ZWQgc3ltYm9sIG5hbWVzLiAgKi8KLSAgY2VuZCA9IGNvbnRlbnRzICsgc3o7Ci0gIGZvciAoaSA9IDAsIGFyc3ltID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0gICAgICAgaSA8IGM7Ci0gICAgICAgKytpLCArK2Fyc3ltLCBwICs9IHN0cmxlbiAoKGNoYXIgKikgcCkgKyAxKQotICAgIHsKLSAgICAgIGlmIChwID49IGNlbmQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYXJzeW0tPm5hbWUgPSAoY2hhciAqKSBwOwotICAgIH0KLQotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50ID0gYzsKLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIHRoaXMgaXMgYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXhjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgaGRyOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkciwgU0laRU9GX0FSX0ZJTEVfSERSLCAxLCBhYmZkKQotICAgICAgIT0gU0laRU9GX0FSX0ZJTEVfSERSKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoaGRyLm1hZ2ljLCBYQ09GRkFSTUFHLCBTWENPRkZBUk1BRykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBhcmUgc2V0dGluZyBiZmRfYXJkYXRhKGFiZmQpIGhlcmUsIGJ1dCBzaW5jZSBiZmRfYXJkYXRhCi0gICAgIGludm9sdmVzIGEgY2FzdCwgd2UgY2FuJ3QgZG8gaXQgYXMgdGhlIGxlZnQgb3BlcmFuZCBvZgotICAgICBhc3NpZ25tZW50LiAgKi8KLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0KLSAgICAoc3RydWN0IGFydGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSAoc3RydWN0IGFydGRhdGEgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gc3RydG9sIChoZHIuZmlyc3RtZW1vZmYsCi0JCQkJCQkgIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gYmZkX3phbGxvYyAoYWJmZCwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG1lbWNweSAoYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhLCAmaGRyLCBTSVpFT0ZfQVJfRklMRV9IRFIpOwotCi0gIGlmICghIHhjb2ZmX3NsdXJwX2FybWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEw7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgdGhlIGFyY2hpdmUgaGVhZGVyIGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgUFRSCi14Y29mZl9yZWFkX2FyX2hkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgc2l6ZV90IG5hbWxlbjsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciAqaGRycDsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqcmV0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUiwgMSwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUikKLSAgICByZXR1cm4gTlVMTDsKLQotICBuYW1sZW4gPSBzdHJ0b2wgKGhkci5uYW1sZW4sIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGhkcnAgPSAoc3RydWN0IHhjb2ZmX2FyX2hkciAqKSBiZmRfYWxsb2MgKGFiZmQsIFNJWkVPRl9BUl9IRFIgKyBuYW1sZW4gKyAxKTsKLSAgaWYgKGhkcnAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbWVtY3B5IChoZHJwLCAmaGRyLCBTSVpFT0ZfQVJfSERSKTsKLSAgaWYgKGJmZF9yZWFkICgoY2hhciAqKSBoZHJwICsgU0laRU9GX0FSX0hEUiwgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4pCi0gICAgcmV0dXJuIE5VTEw7Ci0gICgoY2hhciAqKSBoZHJwKVtTSVpFT0ZfQVJfSERSICsgbmFtbGVuXSA9ICdcMCc7Ci0KLSAgcmV0ID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXQtPmFyY2hfaGVhZGVyID0gKGNoYXIgKikgaGRycDsKLSAgcmV0LT5wYXJzZWRfc2l6ZSA9IHN0cnRvbCAoaGRyLnNpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIHJldC0+ZmlsZW5hbWUgPSAoY2hhciAqKSBoZHJwICsgU0laRU9GX0FSX0hEUjsKLQotICAvKiBTa2lwIG92ZXIgdGhlIFhDT0ZGQVJGTUFHIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgbmFtZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKG5hbWxlbiAmIDEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBPcGVuIHRoZSBuZXh0IGVsZW1lbnQgaW4gYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBiZmQgKgoteGNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGZpbGVfcHRyIGZpbGVzdGFydDsKLQotICBpZiAoeGNvZmZfYXJkYXRhIChhcmNoaXZlKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMKQotICAgIGZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7Ci0gIGVsc2UKLSAgICBmaWxlc3RhcnQgPSBzdHJ0b2wgKGFyY2hfeGhkciAobGFzdF9maWxlKS0+bmV4dG9mZiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLQotICBpZiAoZmlsZXN0YXJ0ID09IDAKLSAgICAgIHx8IGZpbGVzdGFydCA9PSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSktPm1lbW9mZiwKLQkJCSAgICAgIChjaGFyICoqKSBOVUxMLCAxMCkKLSAgICAgIHx8IGZpbGVzdGFydCA9PSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSktPnN5bW9mZiwKLQkJCSAgICAgIChjaGFyICoqKSBOVUxMLCAxMCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotLyogU3RhdCBhbiBlbGVtZW50IGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgaW50Ci14Y29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnM7Ci17Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmhkcnA7Ci0KLSAgaWYgKGFiZmQtPmFyZWx0X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBoZHJwID0gYXJjaF94aGRyIChhYmZkKTsKLQotICBzLT5zdF9tdGltZSA9IHN0cnRvbCAoaGRycC0+ZGF0ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgcy0+c3RfdWlkID0gc3RydG9sIChoZHJwLT51aWQsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIHMtPnN0X2dpZCA9IHN0cnRvbCAoaGRycC0+Z2lkLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBzLT5zdF9tb2RlID0gc3RydG9sIChoZHJwLT5tb2RlLCAoY2hhciAqKikgTlVMTCwgOCk7Ci0gIHMtPnN0X3NpemUgPSBhcmNoX2VsdGRhdGEgKGFiZmQpLT5wYXJzZWRfc2l6ZTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogTm9ybWFsaXplIGEgZmlsZSBuYW1lIGZvciBpbmNsdXNpb24gaW4gYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZV9maWxlbmFtZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICpmaWxlOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotICBmaWxlID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gIGZpbGVuYW1lID0gc3RycmNociAoZmlsZSwgJy8nKTsKLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwpCi0gICAgZmlsZW5hbWUrKzsKLSAgZWxzZQotICAgIGZpbGVuYW1lID0gZmlsZTsKLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gWENPRkYgYXJtYXAuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgaGRyOwotICBjaGFyICpwOwotICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLSAgYmZkICpzdWI7Ci0gIGZpbGVfcHRyIGZpbGVvZmY7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIG1lbXNldCAoJmhkciwgMCwgc2l6ZW9mIGhkcik7Ci0gIHNwcmludGYgKGhkci5zaXplLCAiJWxkIiwgKGxvbmcpICg0ICsgb3JsX2NvdW50ICogNCArIHN0cmlkeCkpOwotICBzcHJpbnRmIChoZHIubmV4dG9mZiwgIiVkIiwgMCk7Ci0gIG1lbWNweSAoaGRyLnByZXZvZmYsIHhjb2ZmX2FyZGF0YSAoYWJmZCktPm1lbW9mZiwgMTIpOwotICBzcHJpbnRmIChoZHIuZGF0ZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci51aWQsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIuZ2lkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLm1vZGUsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIubmFtbGVuLCAiJWQiLCAwKTsKLQotICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICBmb3IgKHAgPSAoY2hhciAqKSAmaGRyOyBwIDwgKGNoYXIgKikgJmhkciArIFNJWkVPRl9BUl9IRFI7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIKLSAgICAgIHx8IGJmZF93cml0ZSAoWENPRkZBUkZNQUcsIDEsIFNYQ09GRkFSRk1BRywgYWJmZCkgIT0gU1hDT0ZGQVJGTUFHKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgb3JsX2NvdW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgZmlsZW9mZiA9IFNJWkVPRl9BUl9GSUxFX0hEUjsKLSAgaSA9IDA7Ci0gIHdoaWxlIChzdWIgIT0gTlVMTCAmJiBpIDwgb3JsX2NvdW50KQotICAgIHsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2ldKS5wb3MpID09IHN1YikKLQl7Ci0JICBiZmRfaF9wdXRfMzIgKGFiZmQsIGZpbGVvZmYsIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICsraTsKLQl9Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKSk7Ci0gICAgICBuYW1sZW4gPSAobmFtbGVuICsgMSkgJn4gMTsKLSAgICAgIGZpbGVvZmYgKz0gKFNJWkVPRl9BUl9IRFIKLQkJICArIG5hbWxlbgotCQkgICsgU1hDT0ZGQVJGTUFHCi0JCSAgKyBhcmVsdF9zaXplIChzdWIpKTsKLSAgICAgIGZpbGVvZmYgPSAoZmlsZW9mZiArIDEpICZ+IDE7Ci0gICAgICBzdWIgPSBzdWItPm5leHQ7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgbmFtZSA9ICptYXBbaV0ubmFtZTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChuYW1lLCAxLCBuYW1sZW4gKyAxLCBhYmZkKSAhPSBuYW1sZW4gKyAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChzdHJpZHggJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgYjsKLQotICAgICAgYiA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gWENPRkYgYXJjaGl2ZS4gIFdlIGFsd2F5cyB3cml0ZSBhbiBlbnRpcmUgYXJjaGl2ZSwKLSAgIHJhdGhlciB0aGFuIGZ1c3Npbmcgd2l0aCB0aGUgZnJlZWxpc3QgYW5kIHNvIGZvcnRoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyIGZoZHI7Ci0gIHNpemVfdCBjb3VudDsKLSAgc2l6ZV90IHRvdGFsX25hbWxlbjsKLSAgZmlsZV9wdHIgKm9mZnNldHM7Ci0gIGJvb2xlYW4gbWFrZW1hcDsKLSAgYm9vbGVhbiBoYXNvYmplY3RzOwotICBmaWxlX3B0ciBwcmV2b2ZmLCBuZXh0b2ZmOwotICBiZmQgKnN1YjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgYWhkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjaGFyICpwOwotICBjaGFyIGRlY2J1ZlsxM107Ci0KLSAgbWVtc2V0ICgmZmhkciwgMCwgc2l6ZW9mIGZoZHIpOwotICBzdHJuY3B5IChmaGRyLm1hZ2ljLCBYQ09GRkFSTUFHLCBTWENPRkZBUk1BRyk7Ci0gIHNwcmludGYgKGZoZHIuZmlyc3RtZW1vZmYsICIlZCIsIFNJWkVPRl9BUl9GSUxFX0hEUik7Ci0gIHNwcmludGYgKGZoZHIuZnJlZW9mZiwgIiVkIiwgMCk7Ci0KLSAgY291bnQgPSAwOwotICB0b3RhbF9uYW1sZW4gPSAwOwotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKLSAgICB7Ci0gICAgICArK2NvdW50OwotICAgICAgdG90YWxfbmFtbGVuICs9IHN0cmxlbiAobm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpKSArIDE7Ci0gICAgfQotICBvZmZzZXRzID0gKGZpbGVfcHRyICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGZpbGVfcHRyKSk7Ci0gIGlmIChvZmZzZXRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgU0laRU9GX0FSX0ZJTEVfSERSLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbWFrZW1hcCA9IGJmZF9oYXNfbWFwIChhYmZkKTsKLSAgaGFzb2JqZWN0cyA9IGZhbHNlOwotICBwcmV2b2ZmID0gMDsKLSAgbmV4dG9mZiA9IFNJWkVPRl9BUl9GSUxFX0hEUjsKLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQsIGkgPSAwOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0LCBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyICphaGRycDsKLSAgICAgIGJmZF9zaXplX3R5cGUgcmVtYWluaW5nOwotCi0gICAgICBpZiAobWFrZW1hcCAmJiAhIGhhc29iamVjdHMpCi0JewotCSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHN1YiwgYmZkX29iamVjdCkpCi0JICAgIGhhc29iamVjdHMgPSB0cnVlOwotCX0KLQotICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgIT0gTlVMTCkKLQlhaGRycCA9IGFyY2hfeGhkciAoc3ViKTsKLSAgICAgIGVsc2UKLQlhaGRycCA9IE5VTEw7Ci0KLSAgICAgIGlmIChhaGRycCA9PSBOVUxMKQotCXsKLQkgIHN0cnVjdCBzdGF0IHM7Ci0KLQkgIG1lbXNldCAoJmFoZHIsIDAsIHNpemVvZiBhaGRyKTsKLQkgIGFoZHJwID0gJmFoZHI7Ci0JICBpZiAoc3RhdCAoYmZkX2dldF9maWxlbmFtZSAoc3ViKSwgJnMpICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzcHJpbnRmIChhaGRycC0+c2l6ZSwgIiVsZCIsIChsb25nKSBzLnN0X3NpemUpOwotCSAgc3ByaW50ZiAoYWhkcnAtPmRhdGUsICIlbGQiLCAobG9uZykgcy5zdF9tdGltZSk7Ci0JICBzcHJpbnRmIChhaGRycC0+dWlkLCAiJWxkIiwgKGxvbmcpIHMuc3RfdWlkKTsKLQkgIHNwcmludGYgKGFoZHJwLT5naWQsICIlbGQiLCAobG9uZykgcy5zdF9naWQpOwotCSAgc3ByaW50ZiAoYWhkcnAtPm1vZGUsICIlbyIsICh1bnNpZ25lZCBpbnQpIHMuc3RfbW9kZSk7Ci0KLQkgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN1Yi0+YXJlbHRfZGF0YSA9IGJmZF9hbGxvYyAoc3ViLCBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLQkgICAgICBpZiAoc3ViLT5hcmVsdF9kYXRhID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBhcmNoX2VsdGRhdGEgKHN1YiktPnBhcnNlZF9zaXplID0gcy5zdF9zaXplOwotCX0KLQotICAgICAgc3ByaW50ZiAoYWhkcnAtPnByZXZvZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0gICAgICBzcHJpbnRmIChhaGRycC0+bmFtbGVuLCAiJWxkIiwgKGxvbmcpIG5hbWxlbik7Ci0KLSAgICAgIC8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMgb2RkLCB3ZSB3cml0ZSBvdXQgdGhlIG51bGwgYnl0ZQotICAgICAgICAgYWZ0ZXIgdGhlIG5hbWUgYXMgd2VsbC4gICovCi0gICAgICBuYW1sZW4gPSAobmFtbGVuICsgMSkgJn4gMTsKLQotICAgICAgcmVtYWluaW5nID0gYXJlbHRfc2l6ZSAoc3ViKTsKLSAgICAgIHNpemUgPSAoU0laRU9GX0FSX0hEUgotCSAgICAgICsgbmFtbGVuCi0JICAgICAgKyBTWENPRkZBUkZNQUcKLQkgICAgICArIHJlbWFpbmluZyk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKG5leHRvZmYgPT0gYmZkX3RlbGwgKGFiZmQpKTsKLQotICAgICAgb2Zmc2V0c1tpXSA9IG5leHRvZmY7Ci0KLSAgICAgIHByZXZvZmYgPSBuZXh0b2ZmOwotICAgICAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKLQotICAgICAgc3ByaW50ZiAoYWhkcnAtPm5leHRvZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0KLSAgICAgIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gICAgICBmb3IgKHAgPSAoY2hhciAqKSBhaGRycDsgcCA8IChjaGFyICopIGFoZHJwICsgU0laRU9GX0FSX0hEUjsgcCsrKQotCWlmICgqcCA9PSAnXDAnKQotCSAgKnAgPSAnICc7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGFoZHJwLCAxLCBTSVpFT0ZfQVJfSERSLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCi0JICB8fCBiZmRfd3JpdGUgKChQVFIpIG5hbWUsIDEsIG5hbWxlbiwgYWJmZCkgIT0gbmFtbGVuCi0JICB8fCAoYmZkX3dyaXRlICgoUFRSKSBYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKQotCSAgICAgICE9IFNYQ09GRkFSRk1BRykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKHN1YiwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB3aGlsZSAocmVtYWluaW5nICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBhbXQ7Ci0JICBiZmRfYnl0ZSBidWZmZXJbREVGQVVMVF9CVUZGRVJTSVpFXTsKLQotCSAgYW10ID0gc2l6ZW9mIGJ1ZmZlcjsKLQkgIGlmIChhbXQgPiByZW1haW5pbmcpCi0JICAgIGFtdCA9IHJlbWFpbmluZzsKLQkgIGlmIChiZmRfcmVhZCAoYnVmZmVyLCAxLCBhbXQsIHN1YikgIT0gYW10Ci0JICAgICAgfHwgYmZkX3dyaXRlIChidWZmZXIsIDEsIGFtdCwgYWJmZCkgIT0gYW10KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICByZW1haW5pbmcgLT0gYW10OwotCX0KLQotICAgICAgaWYgKChzaXplICYgMSkgIT0gMCkKLQl7Ci0JICBiZmRfYnl0ZSBiOwotCi0JICBiID0gJ1wwJzsKLQkgIGlmIChiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBzcHJpbnRmIChmaGRyLmxhc3RtZW1vZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBtZW1iZXIgdGFibGUuICAqLwotCi0gIEJGRF9BU1NFUlQgKG5leHRvZmYgPT0gYmZkX3RlbGwgKGFiZmQpKTsKLSAgc3ByaW50ZiAoZmhkci5tZW1vZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0KLSAgbWVtc2V0ICgmYWhkciwgMCwgc2l6ZW9mIGFoZHIpOwotICBzcHJpbnRmIChhaGRyLnNpemUsICIlbGQiLCAobG9uZykgKDEyICsgY291bnQgKiAxMiArIHRvdGFsX25hbWxlbikpOwotICBzcHJpbnRmIChhaGRyLnByZXZvZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0gIHNwcmludGYgKGFoZHIuZGF0ZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIudWlkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci5naWQsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLm1vZGUsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLm5hbWxlbiwgIiVkIiwgMCk7Ci0KLSAgc2l6ZSA9IChTSVpFT0ZfQVJfSERSCi0JICArIDEyCi0JICArIGNvdW50ICogMTIKLQkgICsgdG90YWxfbmFtbGVuCi0JICArIFNYQ09GRkFSRk1BRyk7Ci0KLSAgcHJldm9mZiA9IG5leHRvZmY7Ci0gIG5leHRvZmYgKz0gc2l6ZSArIChzaXplICYgMSk7Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICBzcHJpbnRmIChhaGRyLm5leHRvZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChhaGRyLm5leHRvZmYsICIlZCIsIDApOwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZhaGRyOyBwIDwgKGNoYXIgKikgJmFoZHIgKyBTSVpFT0ZfQVJfSERSOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYWhkciwgMSwgU0laRU9GX0FSX0hEUiwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUgotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgWENPRkZBUkZNQUcsIDEsIFNYQ09GRkFSRk1BRywgYWJmZCkKLQkgICE9IFNYQ09GRkFSRk1BRykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNwcmludGYgKGRlY2J1ZiwgIiUtMTJsZCIsIChsb25nKSBjb3VudCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGRlY2J1ZiwgMSwgMTIsIGFiZmQpICE9IDEyKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIG9mZnNldHNbaV0pOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIG5hbWUgPSBub3JtYWxpemVfZmlsZW5hbWUgKHN1Yik7Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuICsgMSwgYWJmZCkgIT0gbmFtbGVuICsgMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKHNpemUgJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAnXDAnOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGFybWFwLCBpZiBhcHByb3ByaWF0ZS4gICovCi0KLSAgaWYgKCEgbWFrZW1hcCB8fCAhIGhhc29iamVjdHMpCi0gICAgc3ByaW50ZiAoZmhkci5zeW1vZmYsICIlZCIsIDApOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotICAgICAgc3ByaW50ZiAoZmhkci5zeW1vZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSAoUFRSKSAmZmhkcjsKLSAgICAgIGlmICghIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgKGFiZmQsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBhcmNoaXZlIGZpbGUgaGVhZGVyLiAgKi8KLQotICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICBmb3IgKHAgPSAoY2hhciAqKSAmZmhkcjsgcCA8IChjaGFyICopICZmaGRyICsgU0laRU9GX0FSX0ZJTEVfSERSOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZmaGRyLCBTSVpFT0ZfQVJfRklMRV9IRFIsIDEsIGFiZmQpICE9Ci0JICBTSVpFT0ZfQVJfRklMRV9IRFIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFdlIGNhbid0IHVzZSB0aGUgdXN1YWwgY29mZl9zaXplb2ZfaGVhZGVycyByb3V0aW5lLCBiZWNhdXNlIEFJWAotICAgYWx3YXlzIHVzZXMgYW4gYS5vdXQgaGVhZGVyLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1fYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBzaXplOwotCi0gIHNpemUgPSBGSUxIU1o7Ci0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNpemUgKz0gQU9VVFNaOwotICBlbHNlCi0gICAgc2l6ZSArPSBTTUFMTF9BT1VUU1o7Ci0gIHNpemUgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIFNDTkhTWjsKLSAgcmV0dXJuIHNpemU7Ci19Ci0MCi0jZGVmaW5lIENPUkVfRklMRV9QIF9iZmRfZHVtbXlfdGFyZ2V0Ci0KLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFwKLSAgX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLSNpZmRlZiBBSVhfQ09SRQotI3VuZGVmIENPUkVfRklMRV9QCi0jZGVmaW5lIENPUkVfRklMRV9QIHJzNjAwMGNvZmZfY29yZV9wCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIHJzNjAwMGNvZmZfY29yZV9wICgpOwotZXh0ZXJuIGJvb2xlYW4gcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoKTsKLWV4dGVybiBib29sZWFuIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotCi0jdW5kZWYJY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIFwKLQkJCQkgICAgIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLWV4dGVybiBjaGFyICpyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotZXh0ZXJuIGludCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi0jdW5kZWYJY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZQljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCXJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZiAvKiBBSVhfQ09SRSAqLwotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLSN1bmRlZiBDT1JFX0ZJTEVfUAotI2RlZmluZSBDT1JFX0ZJTEVfUCBseW54X2NvcmVfZmlsZV9wCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwKLQkJCQkJCQkgICAgYmZkICpleGVjX2JmZCkpOwotI3VuZGVmCWNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLWV4dGVybiBjaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotZXh0ZXJuIGludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCi0KLSNkZWZpbmUgX2JmZF94Y29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9nY19zZWN0aW9ucyBjb2ZmX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gY29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3IgdGhhdCBsZWFkcyB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIHJzNjAwMGNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImFpeGNvZmYtcnM2MDAwIiwJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgRFlOQU1JQyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIHhjb2ZmX2FyY2hpdmVfcCwgQ09SRV9GSUxFX1B9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHhjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF94Y29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfeGNvZmYpLAotCi0gIE5VTEwsCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1zaC5jIGIvYmZkL2NvZmYtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2M2Y4My4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg3MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgU3VwZXItSCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLSAgIFJlbGF4aW5nIGNvZGUgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi9zaC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIEludGVybmFsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZ2V0X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIHNoX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpzaF9pbnNuX2luZm8gUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9hbGlnbl9sb2FkcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF9ieXRlICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfc3dhcF9pbnNucwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9ieXRlICpzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi0vKiBEZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IHRvIDIqKjQuICAqLwotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDQpCi0KLS8qIEdlbmVyYXRlIGxvbmcgZmlsZSBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotLyogVGhlIHN1cHBvcnRlZCByZWxvY2F0aW9ucy4gIFRoZXJlIGFyZSBhIGxvdCBvZiByZWxvY2F0aW9ucyBkZWZpbmVkCi0gICBpbiBjb2ZmL2ludGVybmFsLmggd2hpY2ggd2UgZG8gbm90IGV4cGVjdCB0byBldmVyIHNlZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzaF9jb2ZmX2hvd3Rvc1tdID0KLXsKLSAgRU1QVFlfSE9XVE8gKDApLAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEVNUFRZX0hPV1RPICgyKSwKLSAgRU1QVFlfSE9XVE8gKDMpLCAvKiBSX1NIX1BDUkVMOCAqLwotICBFTVBUWV9IT1dUTyAoNCksIC8qIFJfU0hfUENSRUwxNiAqLwotICBFTVBUWV9IT1dUTyAoNSksIC8qIFJfU0hfSElHSDggKi8KLSAgRU1QVFlfSE9XVE8gKDYpLCAvKiBSX1NIX0lNTTI0ICovCi0gIEVNUFRZX0hPV1RPICg3KSwgLyogUl9TSF9MT1cxNiAqLwotICBFTVBUWV9IT1dUTyAoOCksCi0gIEVNUFRZX0hPV1RPICg5KSwgLyogUl9TSF9QQ0RJU1A4Qlk0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENESVNQOEJZMiwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNkaXNwOGJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPICgxMSksIC8qIFJfU0hfUENESVNQOCAqLwotCi0gIEhPV1RPIChSX1NIX1BDRElTUCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9wY2Rpc3AxMmJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDEzKSwKLQotICBIT1dUTyAoUl9TSF9JTU0zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9pbW0zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwgLyogUl9TSF9JTU04ICovCi0gIEVNUFRZX0hPV1RPICgxNyksIC8qIFJfU0hfSU1NOEJZMiAqLwotICBFTVBUWV9IT1dUTyAoMTgpLCAvKiBSX1NIX0lNTThCWTQgKi8KLSAgRU1QVFlfSE9XVE8gKDE5KSwgLyogUl9TSF9JTU00ICovCi0gIEVNUFRZX0hPV1RPICgyMCksIC8qIFJfU0hfSU1NNEJZMiAqLwotICBFTVBUWV9IT1dUTyAoMjEpLCAvKiBSX1NIX0lNTTRCWTQgKi8KLQotICBIT1dUTyAoUl9TSF9QQ1JFTElNTThCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNyZWxpbW04YnkyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENSRUxJTU04Qlk0LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjcmVsaW1tOGJ5NCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0lNTTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2ltbTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfU1dJVENIMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfc3dpdGNoMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2gzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfVVNFUywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl91c2VzIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfY291bnQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0FMSUdOLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2FsaWduIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2NvZGUiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfZGF0YSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfbGFiZWwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1NXSVRDSDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2g4IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2RlZmluZSBTSF9DT0ZGX0hPV1RPX0NPVU5UIChzaXplb2Ygc2hfY29mZl9ob3d0b3MgLyBzaXplb2Ygc2hfY29mZl9ob3d0b3NbMF0pCi0KLS8qIENoZWNrIGZvciBhIGJhZCBtYWdpYyBudW1iZXIuICAqLwotI2RlZmluZSBCQURNQUcoeCkgU0hCQURNQUcoeCkKLQotLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKHRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkKS4gICovCi0jZGVmaW5lIFNIIDEKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaGVyZS4gICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBTd2FwIHRoZSByX29mZnNldCBmaWVsZCBpbiBhbmQgb3V0LiAgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0KLS8qIFN3YXAgb3V0IGV4dHJhIGluZm9ybWF0aW9uIGluIHRoZSByZWxvYyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkJXAotICBkbwkJCQkJCVwKLSAgICB7CQkJCQkJXAotICAgICAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOwkJCVwKLSAgICAgIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsJCQlcCi0gICAgfQkJCQkJCVwKLSAgd2hpbGUgKDApCi0KLS8qIEdldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgbG9uZwotZ2V0X3N5bWJvbF92YWx1ZSAoc3ltYm9sKSAgICAgICAKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAKLSAgICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUgKwotCQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotICByZXR1cm4gcmVsb2NhdGlvbjsKLX0KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIGluIGNvZmZjb2RlLmggdG8gZ2V0IHRoZSBob3d0byBjb3JyZXNwb25kaW5nIHRvCi0gICBhbiBpbnRlcm5hbCByZWxvYy4gICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8ocmVsZW50LCBpbnRlcm5hbCkJCVwKLSAgKChyZWxlbnQpLT5ob3d0byA9CQkJCVwKLSAgICgoaW50ZXJuYWwpLT5yX3R5cGUgPCBTSF9DT0ZGX0hPV1RPX0NPVU5UCVwKLSAgICA/ICZzaF9jb2ZmX2hvd3Rvc1soaW50ZXJuYWwpLT5yX3R5cGVdCVwKLSAgICA6IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpKQotCi0vKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBtYWNybyBpbiBjb2ZmY29kZS5oLCBleGNlcHQgdGhhdCBpdCBjb3BpZXMKLSAgIHJfb2Zmc2V0IGludG8gcmVsb2NfZW50cnktPmFkZGVuZCBmb3Igc29tZSByZWxvY3MuICAqLwotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9TV0lUQ0g4CQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1NXSVRDSDE2CQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfU1dJVENIMzIJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9VU0VTCQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0NPVU5UCQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0FMSUdOKQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gKHJlbG9jKS5yX29mZnNldDsJCQlcCi0gIH0KLQotLyogVGhpcyBpcyB0aGUgaG93dG8gZnVuY3Rpb24gZm9yIHRoZSBTSCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNoX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIHN5bV92YWx1ZTsKLSAgdW5zaWduZWQgc2hvcnQgcl90eXBlOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gYWRkciArIChiZmRfYnl0ZSAqKSBkYXRhOwotCi0gIHJfdHlwZSA9IHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZy0tZG8gbm90aGluZy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogQWxtb3N0IGFsbCByZWxvY3MgaGF2ZSB0byBkbyB3aXRoIHJlbGF4aW5nLiAgSWYgYW55IHdvcmsgbXVzdCBiZQotICAgICBkb25lIGZvciB0aGVtLCBpdCBoYXMgYmVlbiBkb25lIGluIHNoX3JlbGF4X3NlY3Rpb24uICAqLwotICBpZiAocl90eXBlICE9IFJfU0hfSU1NMzIKLSAgICAgICYmIChyX3R5cGUgIT0gUl9TSF9QQ0RJU1AKLQkgIHx8IChzeW1ib2xfaW4tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIHN5bV92YWx1ZSA9IGdldF9zeW1ib2xfdmFsdWUgKHN5bWJvbF9pbik7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9TSF9JTU0zMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfU0hfUENESVNQOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIHN5bV92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgc3ltX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICsgYWRkcgotCQkgICAgKyA0KTsKLSAgICAgIHN5bV92YWx1ZSArPSAoaW5zbiAmIDB4ZmZmKSA8PCAxOwotICAgICAgaWYgKGluc24gJiAweDgwMCkKLQlzeW1fdmFsdWUgLT0gMHgxMDAwOwotICAgICAgaW5zbiA9IChpbnNuICYgMHhmMDAwKSB8IChzeW1fdmFsdWUgJiAweGZmZik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBpZiAoc3ltX3ZhbHVlIDwgKGJmZF92bWEpIC0weDEwMDAgfHwgc3ltX3ZhbHVlID49IDB4MTAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaAotCi0vKiBXZSBjYW4gZG8gcmVsYXhpbmcuICAqLwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIHNoX3JlbGF4X3NlY3Rpb24KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gc2hfcmVsb2NhdGVfc2VjdGlvbgotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIHVzZSBzcGVjaWFsIGNvZGUgdG8gZ2V0IHRoZSByZWxvY2F0ZWQKLSAgIHNlY3Rpb24gY29udGVudHMuICAqLwotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBvbiB0aGUgU0guCi0KLSAgIEZ1bmN0aW9uIGNhbGxzIG9uIHRoZSBTSCBsb29rIGxpa2UgdGhpczoKLQotICAgICAgIG1vdmwgIEwxLHIwCi0gICAgICAgLi4uCi0gICAgICAganNyICAgQHIwCi0gICAgICAgLi4uCi0gICAgIEwxOgotICAgICAgIC5sb25nIGZ1bmN0aW9uCi0KLSAgIFRoZSBjb21waWxlciBhbmQgYXNzZW1ibGVyIHdpbGwgY29vcGVyYXRlIHRvIGNyZWF0ZSBSX1NIX1VTRVMKLSAgIHJlbG9jcyBvbiB0aGUganNyIGluc3RydWN0aW9ucy4gIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUKLSAgIFJfU0hfVVNFUyByZWxvYyBpcyB0aGUgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaAotICAgbG9hZHMgdGhlIHJlZ2lzdGVyICh0aGUgcl9vZmZzZXQgZmllbGQgaXMgY29tcHV0ZWQgYXMgdGhvdWdoIGl0Ci0gICB3ZXJlIGEganVtcCBpbnN0cnVjdGlvbiwgc28gdGhlIG9mZnNldCB2YWx1ZSBpcyBhY3R1YWxseSBmcm9tIGZvdXIKLSAgIGJ5dGVzIHBhc3QgdGhlIGluc3RydWN0aW9uKS4gIFRoZSBsaW5rZXIgY2FuIHVzZSB0aGlzIHJlbG9jIHRvCi0gICBkZXRlcm1pbmUganVzdCB3aGljaCBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQsIGFuZCB0aHVzIGRlY2lkZQotICAgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4KLQotICAgSWYgbXVsdGlwbGUgZnVuY3Rpb24gY2FsbHMgYXJlIGFsbCBiYXNlZCBvbiBhIHNpbmdsZSByZWdpc3RlciBsb2FkCi0gICAoaS5lLiwgdGhlIHNhbWUgZnVuY3Rpb24gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzKSwgdGhlIGNvbXBpbGVyCi0gICBndWFyYW50ZWVzIHRoYXQgZWFjaCBmdW5jdGlvbiBjYWxsIHdpbGwgaGF2ZSBhbiBSX1NIX1VTRVMgcmVsb2MuCi0gICBUaGVyZWZvcmUsIGlmIHRoZSBsaW5rZXIgaXMgYWJsZSB0byBjb252ZXJ0IGVhY2ggUl9TSF9VU0VTIHJlbG9jCi0gICB3aGljaCByZWZlcnMgdG8gdGhhdCBhZGRyZXNzLCBpdCBjYW4gc2FmZWx5IGVsaW1pbmF0ZSB0aGUgcmVnaXN0ZXIKLSAgIGxvYWQuCi0KLSAgIFdoZW4gdGhlIGFzc2VtYmxlciBjcmVhdGVzIGFuIFJfU0hfVVNFUyByZWxvYywgaXQgZXhhbWluZXMgaXQgdG8KLSAgIGRldGVybWluZSB3aGljaCBhZGRyZXNzIGlzIGJlaW5nIGxvYWRlZCAoTDEgaW4gdGhlIGFib3ZlIGV4YW1wbGUpLgotICAgSXQgdGhlbiBjb3VudHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoYXQgYWRkcmVzcywgYW5kCi0gICBjcmVhdGVzIGFuIFJfU0hfQ09VTlQgcmVsb2MgYXQgdGhhdCBhZGRyZXNzLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mCi0gICB0aGUgUl9TSF9DT1VOVCByZWxvYyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcy4gIElmIHRoZQotICAgbGlua2VyIGlzIGFibGUgdG8gZWxpbWluYXRlIGEgcmVnaXN0ZXIgbG9hZCwgaXQgY2FuIHVzZSB0aGUKLSAgIFJfU0hfQ09VTlQgcmVsb2MgdG8gc2VlIHdoZXRoZXIgaXQgY2FuIGFsc28gZWxpbWluYXRlIHRoZSBmdW5jdGlvbgotICAgYWRkcmVzcy4KLQotICAgU0ggcmVsYXhpbmcgYWxzbyBoYW5kbGVzIGFub3RoZXIsIHVucmVsYXRlZCwgbWF0dGVyLiAgT24gdGhlIFNILCBpZgotICAgYSBsb2FkIG9yIHN0b3JlIGluc3RydWN0aW9uIGlzIG5vdCBhbGlnbmVkIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LAotICAgdGhlIG1lbW9yeSBjeWNsZSBpbnRlcmZlcmVzIHdpdGggdGhlIDMyIGJpdCBpbnN0cnVjdGlvbiBmZXRjaCwKLSAgIGNhdXNpbmcgYSBvbmUgY3ljbGUgYnViYmxlIGluIHRoZSBwaXBlbGluZS4gIFRoZXJlZm9yZSwgd2UgdHJ5IHRvCi0gICBhbGlnbiBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgb24gZm91ciBieXRlIGJvdW5kYXJpZXMgaWYgd2UKLSAgIGNhbiwgYnkgc3dhcHBpbmcgdGhlbSB3aXRoIG9uZSBvZiB0aGUgYWRqYWNlbnQgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1zaF9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgYm9vbGVhbiBoYXZlX2NvZGU7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgbGlua19pbmZvLT5rZWVwX21lbW9yeSwKLQkJICAgICAgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkgICAgICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGhhdmVfY29kZSA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBsYWRkciwgcGFkZHIsIHN5bXZhbDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGluc247Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxmbiwgKmlyZWxzY2FuLCAqaXJlbGNvdW50OwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBmb2ZmOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfQ09ERSkKLQloYXZlX2NvZGUgPSB0cnVlOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlICE9IFJfU0hfVVNFUykKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBSX1NIX1VTRVMgcmVsb2Mgd2lsbCBwb2ludCB1cyB0bwotICAgICAgICAgdGhlIHJlZ2lzdGVyIGxvYWQuICBUaGUgNCBpcyBiZWNhdXNlIHRoZSByX29mZnNldCBmaWVsZCBpcwotICAgICAgICAgY29tcHV0ZWQgYXMgdGhvdWdoIGl0IHdlcmUgYSBqdW1wIG9mZnNldCwgd2hpY2ggYXJlIGJhc2VkCi0gICAgICAgICBmcm9tIDQgYnl0ZXMgYWZ0ZXIgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgbGFkZHIgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgKyA0OwotICAgICAgLyogQ2FyZWZ1bCB0byBzaWduIGV4dGVuZCB0aGUgMzItYml0IG9mZnNldC4gICovCi0gICAgICBsYWRkciArPSAoKGlyZWwtPnJfb2Zmc2V0ICYgMHhmZmZmZmZmZikgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDA7Ci0gICAgICBpZiAobGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIsCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcik7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBsYWRkcik7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgbW92LmwgTk4sck4sIHdlIGRvbid0IGtub3cgd2hhdCB0byBkby4gICovCi0gICAgICBpZiAoKGluc24gJiAweGYwMDApICE9IDB4ZDAwMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IFJfU0hfVVNFUyBwb2ludHMgdG8gdW5yZWNvZ25pemVkIGluc24gMHgleCIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkciwgaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgbG9hZGVkLiAgVGhlCi0gICAgICAJIGRpc3BsYWNlbWVudCBpbiB0aGUgbW92LmwgaW5zdHJ1Y3Rpb24gaXMgcXVhZHJ1cGxlZC4gIEl0IGlzIGEKLSAgICAgIAkgZGlzcGxhY2VtZW50IGZyb20gZm91ciBieXRlcyBhZnRlciB0aGUgbW92bCBpbnN0cnVjdGlvbiwgYnV0LAotICAgICAgCSBiZWZvcmUgYWRkaW5nIGluIHRoZSBQQyBhZGRyZXNzLCB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cwotICAgICAgCSBvZiB0aGUgUEMgYXJlIGNsZWFyZWQuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkCi0gICAgICAJIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgIHBhZGRyID0gaW5zbiAmIDB4ZmY7Ci0gICAgICBwYWRkciAqPSA0OwotICAgICAgcGFkZHIgKz0gKGxhZGRyICsgNCkgJn4gMzsKLSAgICAgIGlmIChwYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSByZWxvYyBmb3IgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMKLSAgICAgICAgIGJlaW5nIGxvYWRlZC4gIFRoaXMgcmVsb2Mgd2lsbCB0ZWxsIHVzIHdoaWNoIGZ1bmN0aW9uIGlzCi0gICAgICAgICBhY3R1YWxseSBiZWluZyBjYWxsZWQuICAqLwotICAgICAgcGFkZHIgKz0gc2VjLT52bWE7Ci0gICAgICBmb3IgKGlyZWxmbiA9IGludGVybmFsX3JlbG9jczsgaXJlbGZuIDwgaXJlbGVuZDsgaXJlbGZuKyspCi0JaWYgKGlyZWxmbi0+cl92YWRkciA9PSBwYWRkcgotCSAgICAmJiBpcmVsZm4tPnJfdHlwZSA9PSBSX1NIX0lNTTMyKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbGZuID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkgICAgKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJICAgICArIChpcmVsZm4tPnJfc3ltbmR4Ci0JCQkJKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkgICAgJnN5bSk7Ci0gICAgICBpZiAoc3ltLm5fc2NudW0gIT0gMCAmJiBzeW0ubl9zY251bSAhPSBzZWMtPnRhcmdldF9pbmRleCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQpCi0JewotCSAgc3ltdmFsID0gKHN5bS5uX3ZhbHVlCi0JCSAgICAtIHNlYy0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtpcmVsZm4tPnJfc3ltbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIHN5bXZhbCArPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHBhZGRyIC0gc2VjLT52bWEpOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxsIGNhbiBiZSBzaG9ydGVuZWQuICAqLwotICAgICAgZm9mZiA9IChzeW12YWwKLQkgICAgICAtIChpcmVsLT5yX3ZhZGRyCi0JCSAtIHNlYy0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICsgNCkpOwotICAgICAgaWYgKGZvZmYgPCAtMHgxMDAwIHx8IGZvZmYgPj0gMHgxMDAwKQotCXsKLQkgIC8qIEFmdGVyIGFsbCB0aGF0IHdvcmssIHdlIGNhbid0IHNob3J0ZW4gdGhpcyBmdW5jdGlvbiBjYWxsLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogU2hvcnRlbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JewotCSAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgICgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9yZWxvY3MgPSB0cnVlOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBjb250ZW50czsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0gICAgICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKLQotICAgICAgLyogUmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotCi0gICAgICAvKiBDaGFuZ2UgdGhlIFJfU0hfVVNFUyByZWxvYyBpbnRvIGFuIFJfU0hfUENESVNQIHJlbG9jLCBhbmQKLSAgICAgICAgIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfU0hfUENESVNQOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSBpcmVsZm4tPnJfc3ltbmR4OwotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCkKLQl7Ci0JICAvKiBJZiB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgYmVjYXVzZSBvZiBmdXR1cmUgcmVsYXhpbmcsCi0gICAgICAgICAgICAgaXQgd2lsbCBiZSBoYW5kbGVkIGhlcmUgbGlrZSBvdGhlciBpbnRlcm5hbCBQQ0RJU1AKLSAgICAgICAgICAgICByZWxvY3MuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgMHhiMDAwIHwgKChmb2ZmID4+IDEpICYgMHhmZmYpLAotCQkgICAgICBjb250ZW50cyArIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGNhbid0IGZ1bGx5IHJlc29sdmUgdGhpcyB5ZXQsIGJlY2F1c2UgdGhlIGV4dGVybmFsCi0gICAgICAgICAgICAgc3ltYm9sIHZhbHVlIG1heSBiZSBjaGFuZ2VkIGJ5IGZ1dHVyZSByZWxheGluZy4gIFdlIGxldAotICAgICAgICAgICAgIHRoZSBmaW5hbCBsaW5rIHBoYXNlIGhhbmRsZSBpdC4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCAweGIwMDAsIGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hKTsKLQl9Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIFJfU0hfVVNFUyByZWxvYyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKLSAgICAgICAgIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsZW5kOyBpcmVsc2NhbisrKQotCWlmIChpcmVsc2Nhbi0+cl90eXBlID09IFJfU0hfVVNFUwotCSAgICAmJiBsYWRkciA9PSBpcmVsc2Nhbi0+cl92YWRkciAtIHNlYy0+dm1hICsgNCArIGlyZWxzY2FuLT5yX29mZnNldCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxzY2FuIDwgaXJlbGVuZCkKLQl7Ci0JICAvKiBTb21lIG90aGVyIGZ1bmN0aW9uIGNhbGwgZGVwZW5kcyB1cG9uIHRoaXMgcmVnaXN0ZXIgbG9hZCwKLQkgICAgIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgY29udmVydGVkIHRoYXQgZnVuY3Rpb24gY2FsbC4KLQkgICAgIEluZGVlZCwgd2UgbWF5IG5ldmVyIGJlIGFibGUgdG8gY29udmVydCBpdC4gIFRoZXJlIGlzCi0JICAgICBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciBhIFJfU0hfQ09VTlQgcmVsb2Mgb24gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZQotICAgICAgICAgZnVuY3Rpb24gYWRkcmVzcyBpcyBzdG9yZWQuICBEbyB0aGlzIGJlZm9yZSBkZWxldGluZyBhbnkKLSAgICAgICAgIGJ5dGVzLCB0byBhdm9pZCBjb25mdXNpb24gYWJvdXQgdGhlIGFkZHJlc3MuICAqLwotICAgICAgZm9yIChpcmVsY291bnQgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxjb3VudCA8IGlyZWxlbmQ7IGlyZWxjb3VudCsrKQotCWlmIChpcmVsY291bnQtPnJfdmFkZHIgPT0gcGFkZHIKLQkgICAgJiYgaXJlbGNvdW50LT5yX3R5cGUgPT0gUl9TSF9DT1VOVCkKLQkgIGJyZWFrOwotCi0gICAgICAvKiBEZWxldGUgdGhlIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgaWYgKCEgc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGxhZGRyLCAyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCBqdXN0IGluIGNhc2UgaXQgcGVybWl0cyBzb21lCi0gICAgICAgICBvdGhlciBmdW5jdGlvbiBjYWxsIHRvIGNvbWUgd2l0aGluIHJhbmdlLCB3ZSBzaG91bGQgcmVsYXgKLSAgICAgICAgIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgLyogTm93IGNoZWNrIHdoZXRoZXIgd2UgZ290IGEgQ09VTlQgcmVsb2MuICAqLwotICAgICAgaWYgKGlyZWxjb3VudCA+PSBpcmVsZW5kKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgQ09VTlQgcmVsb2MiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBudW1iZXIgb2YgdXNlcyBpcyBzdG9yZWQgaW4gdGhlIHJfb2Zmc2V0IGZpZWxkLiAgV2UndmUKLSAgICAgICAgIGp1c3QgZGVsZXRlZCBvbmUuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgY291bnQiLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLS1pcmVsY291bnQtPnJfb2Zmc2V0OwotCi0gICAgICAvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSB1c2VzLCB3ZSBjYW4gZGVsZXRlIHRoZSBhZGRyZXNzLiAgUmVsb2FkCi0gICAgICAgICB0aGUgYWRkcmVzcyBmcm9tIGlyZWxmbiwgaW4gY2FzZSBpdCB3YXMgY2hhbmdlZCBieSB0aGUKLSAgICAgICAgIHByZXZpb3VzIGNhbGwgdG8gc2hfcmVsYXhfZGVsZXRlX2J5dGVzLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfb2Zmc2V0ID09IDApCi0JewotCSAgaWYgKCEgc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJICAgICAgIGlyZWxmbi0+cl92YWRkciAtIHNlYy0+dm1hLCA0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSd2ZSBkb25lIGFsbCB3ZSBjYW4gd2l0aCB0aGF0IGZ1bmN0aW9uIGNhbGwuICAqLwotICAgIH0KLQotICAvKiBMb29rIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCB3ZSBjYW4gYWxpZ24gb24gZm91cgotICAgICBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoaGF2ZV9jb2RlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gc3dhcHBlZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgc2hfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywgJnN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc3dhcHBlZCkKLQl7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCQkoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotCSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9yZWxvY3MgPSB0cnVlOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBjb250ZW50czsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBjb2ZmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JCSgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IE5VTEw7Ci0JICAgIH0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBiZmRfYnl0ZSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID4gYWRkcgotCSAgJiYgY291bnQgPCAoMSA8PCBpcmVsLT5yX29mZnNldCkpCi0JewotCSAgaXJlbGFsaWduID0gaXJlbDsKLQkgIHRvYWRkciA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIGlmIChpcmVsYWxpZ24gPT0gTlVMTCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0jZGVmaW5lIE5PUF9PUENPREUgKDB4MDAwOSkKLQotICAgICAgQkZEX0FTU0VSVCAoKGNvdW50ICYgMSkgPT0gMCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMikKLQliZmRfcHV0XzE2IChhYmZkLCBOT1BfT1BDT0RFLCBjb250ZW50cyArIHRvYWRkciAtIGNvdW50ICsgaSk7Ci0gICAgfQotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBucmFkZHIsIHN0b3A7Ci0gICAgICBiZmRfdm1hIHN0YXJ0ID0gMDsKLSAgICAgIGludCBpbnNuID0gMDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgaW50IG9mZiwgYWRqdXN0LCBvaW5zbjsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmYgPSAwOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBucmFkZHIgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0gICAgICBpZiAoKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPCB0b2FkZHIpCi0JICB8fCAoaXJlbC0+cl90eXBlID09IFJfU0hfQUxJR04KLQkgICAgICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gdG9hZGRyKSkKLQlucmFkZHIgLT0gY291bnQ7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIHdhcyBmb3IgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZCwgaW4gd2hpY2gKLQkgY2FzZSB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCBpdC4gIERvbid0IGRlbGV0ZSByZWxvY3Mgd2hpY2gKLQkgcmVwcmVzZW50IGFkZHJlc3NlcywgdGhvdWdoLiAgKi8KLSAgICAgIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPj0gYWRkcgotCSAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hIDwgYWRkciArIGNvdW50Ci0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfQ09ERQotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfREFUQQotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfTEFCRUwpCi0JaXJlbC0+cl90eXBlID0gUl9TSF9VTlVTRUQ7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgc2VlIGlmIHRoZSByYW5nZSBpdCBjb3ZlcnMKLSAgICAgICAgIGluY2x1ZGVzIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQuICAqLwotICAgICAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCWNhc2UgUl9TSF9QQ0RJU1A6Ci0JY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQljYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9JTU0zMjoKLQkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoaXMKLSAgICAgICAgICAgICBzZWN0aW9uLCBhbmQgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZSBhZGp1c3RlZCBiZWxvdywgd2UKLSAgICAgICAgICAgICBtdXN0IGNoZWNrIHRoZSBhZGRlbmQgdG8gc2VlIGl0IHdpbGwgcHV0IHRoZSB2YWx1ZSBpbgotICAgICAgICAgICAgIHJhbmdlIHRvIGJlIGFkanVzdGVkLCBhbmQgaGVuY2UgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJCSgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCQkgKyAoaXJlbC0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JICAgICAgJiYgc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICAgICAmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDw9IGFkZHIKLQkJICB8fCAoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPj0gdG9hZGRyKSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIHZhbCArPSBzeW0ubl92YWx1ZTsKLQkgICAgICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCWJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgIH0KLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBpZiAob2ZmICYgMHg4MCkKLQkgICAgb2ZmIC09IDB4MTAwOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDRElTUDoKLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJCSgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCQkgKyAoaXJlbC0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCSAgICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb2ZmID0gaW5zbiAmIDB4ZmZmOwotCSAgICAgIGlmIChvZmYgJiAweDgwMCkKLQkJb2ZmIC09IDB4MTAwMDsKLQkgICAgICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTI6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSBzdGFydCArIDQgKyBvZmYgKiAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gKHN0YXJ0ICZ+IChiZmRfdm1hKSAzKSArIDQgKyBvZmYgKiA0OwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfU1dJVENIODoKLQljYXNlIFJfU0hfU1dJVENIMTY6Ci0JY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgLyogVGhlc2UgcmVsb2NzIHR5cGVzIHJlcHJlc2VudAotCSAgICAgICAud29yZCBMMi1MMQotCSAgICAgVGhlIHJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jCi0JICAgICBhZGRyZXNzIGFuZCBMMS4gIFRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSByZWxvYywgYW5kCi0JICAgICBhZGRpbmcgaW4gdGhlIGNvbnRlbnRzIGdpdmVzIHVzIHRoZSB0b3AuICBXZSBtdXN0IGFkanVzdAotCSAgICAgYm90aCB0aGUgcl9vZmZzZXQgZmllbGQgYW5kIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQotCSAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0IC0gKGxvbmcpIGlyZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKHN0YXJ0ID4gYWRkcgotCSAgICAgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAgICAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfb2Zmc2V0ICs9IGNvdW50OwotCSAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkJICAgJiYgc3RvcCA8IHRvYWRkcgotCQkgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCSAgICBpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKLQotCSAgc3RhcnQgPSBzdG9wOwotCi0JICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfU1dJVENIMTYpCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZSBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfU1dJVENIOCkKLQkgICAgdm9mZiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyB2b2ZmKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfVVNFUzoKLQkgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydAotCQkJICAgICsgKGxvbmcpIGlyZWwtPnJfb2Zmc2V0Ci0JCQkgICAgKyA0KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHN0YXJ0ID4gYWRkcgotCSAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCWFkanVzdCA9IGNvdW50OwotICAgICAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkgICAgICAgJiYgc3RvcCA8IHRvYWRkcgotCSAgICAgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCWFkanVzdCA9IC0gY291bnQ7Ci0gICAgICBlbHNlCi0JYWRqdXN0ID0gMDsKLQotICAgICAgaWYgKGFkanVzdCAhPSAwKQotCXsKLQkgIG9pbnNuID0gaW5zbjsKLQkgIG92ZXJmbG93ID0gZmFsc2U7Ci0JICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICAgICAgQkZEX0FTU0VSVCAoYWRqdXN0ID09IGNvdW50IHx8IGNvdW50ID49IDQpOwotCSAgICAgIGlmIChjb3VudCA+PSA0KQotCQlpbnNuICs9IGFkanVzdCAvIDQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKChpcmVsLT5yX3ZhZGRyICYgMykgPT0gMCkKLQkJICAgICsraW5zbjsKLQkJfQotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIODoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IDAgfHwgdm9mZiA+PSAweGZmKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDE2OgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICh2b2ZmIDwgLSAweDgwMDAgfHwgdm9mZiA+PSAweDgwMDApCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8xNiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9VU0VTOgotCSAgICAgIGlyZWwtPnJfb2Zmc2V0ICs9IGFkanVzdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgICgiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlyZWwtPnJfdmFkZHIgPSBucmFkZHIgKyBzZWMtPnZtYTsKLSAgICB9Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgb3RoZXIgc2VjdGlvbnMuICBJZiB0aGVyZSBjb250YWluIGFueSBJTU0zMgotICAgICByZWxvY3MgYWdhaW5zdCBpbnRlcm5hbCBzeW1ib2xzIHdoaWNoIHdlIGFyZSBub3QgZ29pbmcgdG8gYWRqdXN0Ci0gICAgIGJlbG93LCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGFkZGVuZHMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbHNjYW4sICppcmVsc2NhbmVuZDsKLSAgICAgIGJmZF9ieXRlICpvY29udGVudHM7Ci0KLSAgICAgIGlmIChvID09IHNlYwotCSAgfHwgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICB8fCBvLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHJlbG9jcy4gIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzCi0gICAgICAgICBmYWxzZSwgd2Ugc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywgd2hlbiB3ZQotICAgICAgICAgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAoYWJmZCwgbywgdHJ1ZSwgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkJICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG9jb250ZW50cyA9IE5VTEw7Ci0gICAgICBpcmVsc2NhbmVuZCA9IGludGVybmFsX3JlbG9jcyArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsc2NhbmVuZDsgaXJlbHNjYW4rKykKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotCSAgaWYgKGlyZWxzY2FuLT5yX3R5cGUgIT0gUl9TSF9JTU0zMikKLQkgICAgY29udGludWU7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJCSgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCQkgKyAoaXJlbHNjYW4tPnJfc3ltbmR4Ci0JCQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAotCQkJCSZzeW0pOwotCSAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgICAgICYmIHN5bS5uX3NjbnVtID09IHNlYy0+dGFyZ2V0X2luZGV4Ci0JICAgICAgJiYgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSA8PSBhZGRyCi0JCSAgfHwgKGJmZF92bWEpIHN5bS5uX3ZhbHVlID49IHRvYWRkcikpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJewotCQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmNvbnRlbnRzICE9IE5VTEwpCi0JCSAgICBvY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmNvbnRlbnRzOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB3ZSBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotCQkgICAgICBvY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8sIG9jb250ZW50cywKLQkJCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJCSAgICAgIG8tPl9yYXdfc2l6ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+Y29udGVudHMgPSBvY29udGVudHM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX3ZhZGRyIC0gby0+dm1hKTsKLQkgICAgICB2YWwgKz0gc3ltLm5fdmFsdWU7Ci0JICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwKLQkJCSAgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl92YWRkciAtIG8tPnZtYSk7Ci0KLQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3RpbmcgdGhlIGludGVybmFsIHN5bWJvbHMgd2lsbCBub3Qgd29yayBpZiBzb21ldGhpbmcgaGFzCi0gICAgIGFscmVhZHkgcmV0cmlldmVkIHRoZSBnZW5lcmljIHN5bWJvbHMuICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0bwotICAgICBtYWtlIHRoaXMgd29yayBieSBhZGp1c3RpbmcgdGhlIGdlbmVyaWMgc3ltYm9scyBhdCB0aGUgc2FtZSB0aW1lLgotICAgICBIb3dldmVyLCB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBhcmlzZSBpbiBub3JtYWwgdXNhZ2UuICAqLwotICBpZiAob2JqX3N5bWJvbHMgKGFiZmQpICE9IE5VTEwKLSAgICAgIHx8IG9ial9yYXdfc3ltZW50cyAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgKCIlczogZmF0YWw6IGdlbmVyaWMgc3ltYm9scyByZXRyaWV2ZWQgYmVmb3JlIHJlbGF4aW5nIiwKLQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgc3ltYm9scy4gICovCi0gIHN5bV9oYXNoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5uX3NjbnVtID09IHNlYy0+dGFyZ2V0X2luZGV4Ci0JICAmJiAoYmZkX3ZtYSkgaXN5bS5uX3ZhbHVlID4gYWRkcgotCSAgJiYgKGJmZF92bWEpIGlzeW0ubl92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLm5fdmFsdWUgLT0gY291bnQ7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmlzeW0sIChQVFIpIGVzeW0pOwotCi0JICBpZiAoKnN5bV9oYXNoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0JICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPj0gYWRkcgotCQkJICAmJiAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcik7Ci0JICAgICAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVzeW0gKz0gKGlzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICAgIHN5bV9oYXNoICs9IGlzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICAvKiBTZWUgaWYgd2UgY2FuIG1vdmUgdGhlIEFMSUdOIHJlbG9jIGZvcndhcmQuICBXZSBoYXZlIGFkanVzdGVkCi0gICAgIHJfdmFkZHIgZm9yIGl0IGFscmVhZHkuICAqLwotICBpZiAoaXJlbGFsaWduICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBhbGlnbnRvLCBhbGlnbmFkZHI7Ci0KLSAgICAgIGFsaWdudG8gPSBCRkRfQUxJR04gKHRvYWRkciwgMSA8PCBpcmVsYWxpZ24tPnJfb2Zmc2V0KTsKLSAgICAgIGFsaWduYWRkciA9IEJGRF9BTElHTiAoaXJlbGFsaWduLT5yX3ZhZGRyIC0gc2VjLT52bWEsCi0JCQkgICAgIDEgPDwgaXJlbGFsaWduLT5yX29mZnNldCk7Ci0gICAgICBpZiAoYWxpZ250byAhPSBhbGlnbmFkZHIpCi0JewotCSAgLyogVGFpbCByZWN1cnNpb24uICAqLwotCSAgcmV0dXJuIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhbGlnbmFkZHIsCi0JCQkJCWFsaWdudG8gLSBhbGlnbmFkZHIpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIGlzIHlldCBhbm90aGVyIHZlcnNpb24gb2YgdGhlIFNIIG9wY29kZSB0YWJsZSwgdXNlZCB0byByYXBpZGx5Ci0gICBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLiAgKi8KLQotLyogVGhlIG9wY29kZSBtYXAgaXMgcmVwcmVzZW50ZWQgYnkgYW4gYXJyYXkgb2YgdGhlc2Ugc3RydWN0dXJlcy4gIFRoZQotICAgYXJyYXkgaXMgaW5kZXhlZCBieSB0aGUgaGlnaCBvcmRlciBmb3VyIGJpdHMgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLQotc3RydWN0IHNoX21ham9yX29wY29kZQotewotICAvKiBBIHBvaW50ZXIgdG8gdGhlIGluc3RydWN0aW9uIGxpc3QuICBUaGlzIGlzIGFuIGFycmF5IHdoaWNoCi0gICAgIGNvbnRhaW5zIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBtYWpvciBvcGNvZGUuICAqLwotICBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlICptaW5vcl9vcGNvZGVzOwotICAvKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIG1pbm9yX29wY29kZXMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBjb3VudDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHNldCBvZiBTSCBvcGNvZGVzLiAgVGhlCi0gICBpbnN0cnVjdGlvbiBjb2RlIGlzIGFuZGVkIHdpdGggdGhlIG1hc2sgdmFsdWUsIGFuZCB0aGUgcmVzdWx0aW5nCi0gICB2YWx1ZSBpcyB1c2VkIHRvIHNlYXJjaCB0aGUgb3JkZXIgb3Bjb2RlIGxpc3QuICAqLwotCi1zdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlCi17Ci0gIC8qIFRoZSBzb3J0ZWQgb3Bjb2RlIGxpc3QuICAqLwotICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcGNvZGVzOwotICAvKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIG9wY29kZXMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBjb3VudDsKLSAgLyogVGhlIG1hc2sgdmFsdWUgdG8gdXNlIHdoZW4gc2VhcmNoaW5nIHRoZSBvcGNvZGUgbGlzdC4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1hc2s7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYW4gU0ggaW5zdHJ1Y3Rpb24uICBBbiBhcnJheQotICAgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBzb3J0ZWQgaW4gb3JkZXIgYnkgb3Bjb2RlLiAgKi8KLQotc3RydWN0IHNoX29wY29kZQotewotICAvKiBUaGUgY29kZSBmb3IgdGhpcyBpbnN0cnVjdGlvbiwgYWZ0ZXIgaXQgaGFzIGJlZW4gYW5kZWQgd2l0aCB0aGUKLSAgICAgbWFzayB2YWx1ZSBpbiB0aGUgc2hfbWFqb3Jfb3Bjb2RlIHN0cnVjdHVyZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSAgLyogRmxhZ3MgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKLX07Ci0KLS8qIEZsYWcgd2hpY2ggYXBwZWFyIGluIHRoZSBzaF9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLQotLyogVGhpcyBpbnN0cnVjdGlvbiBsb2FkcyBhIHZhbHVlIGZyb20gbWVtb3J5LiAgKi8KLSNkZWZpbmUgTE9BRCAoMHgxKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHN0b3JlcyBhIHZhbHVlIHRvIG1lbW9yeS4gICovCi0jZGVmaW5lIFNUT1JFICgweDIpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2guICAqLwotI2RlZmluZSBCUkFOQ0ggKDB4NCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBoYXMgYSBkZWxheSBzbG90LiAgKi8KLSNkZWZpbmUgREVMQVkgKDB4OCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTMSAoMHgxMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTMiAoMHgyMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiByZWdpc3RlciAwLiAgKi8KLSNkZWZpbmUgVVNFU1IwICgweDQwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNFVFMxICgweDgwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwMGYwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNFVFMyICgweDEwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHJlZ2lzdGVyIDAuICAqLwotI2RlZmluZSBTRVRTUjAgKDB4MjAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgYSBzcGVjaWFsIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgU0VUU1NQICgweDQwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIGEgc3BlY2lhbCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFVTRVNTUCAoMHg4MDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTRjEgKDB4MTAwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwMGYwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVTRVNGMiAoMHgyMDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgMC4gICovCi0jZGVmaW5lIFVTRVNGMCAoMHg0MDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VUU0YxICgweDgwMDApCi0KLXN0YXRpYyBib29sZWFuIHNoX2luc25fdXNlc19yZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl91c2VzX2ZyZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbnNfY29uZmxpY3QKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCwKLQkgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2xvYWRfdXNlCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQsCi0JICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqKSk7Ci0KLS8qIFRoZSBvcGNvZGUgbWFwcy4gICovCi0KLSNkZWZpbmUgTUFQKGEpIGEsIHNpemVvZiBhIC8gc2l6ZW9mIGFbMF0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMDBbXSA9Ci17Ci0gIHsgMHgwMDA4LCBTRVRTU1AgfSwJCQkvKiBjbHJ0ICovCi0gIHsgMHgwMDA5LCAwIH0sCQkJLyogbm9wICovCi0gIHsgMHgwMDBiLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVNTUCB9LAkvKiBydHMgKi8KLSAgeyAweDAwMTgsIFNFVFNTUCB9LAkJCS8qIHNldHQgKi8KLSAgeyAweDAwMTksIFNFVFNTUCB9LAkJCS8qIGRpdjB1ICovCi0gIHsgMHgwMDFiLCAwIH0sCQkJLyogc2xlZXAgKi8KLSAgeyAweDAwMjgsIFNFVFNTUCB9LAkJCS8qIGNscm1hYyAqLwotICB7IDB4MDAyYiwgQlJBTkNIIHwgREVMQVkgfCBTRVRTU1AgfSwJLyogcnRlICovCi0gIHsgMHgwMDM4LCBVU0VTU1AgfCBTRVRTU1AgfSwJCS8qIGxkdGxiICovCi0gIHsgMHgwMDQ4LCBTRVRTU1AgfSwJCQkvKiBjbHJzICovCi0gIHsgMHgwMDU4LCBTRVRTU1AgfQkJCS8qIHNldHMgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTAxW10gPQotewotICB7IDB4MDAwMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgc3Iscm4gKi8KLSAgeyAweDAwMDMsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfCBTRVRTU1AgfSwJLyogYnNyZiBybiAqLwotICB7IDB4MDAwYSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgbWFjaCxybiAqLwotICB7IDB4MDAxMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgZ2JyLHJuICovCi0gIHsgMHgwMDFhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBtYWNsLHJuICovCi0gIHsgMHgwMDIyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyB2YnIscm4gKi8KLSAgeyAweDAwMjMsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGJyYWYgcm4gKi8KLSAgeyAweDAwMjksIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogbW92dCBybiAqLwotICB7IDB4MDAyYSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgcHIscm4gKi8KLSAgeyAweDAwMzIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHNzcixybiAqLwotICB7IDB4MDA0MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgc3BjLHJuICovCi0gIHsgMHgwMDVhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBmcHVsLHJuICovCi0gIHsgMHgwMDZhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBmcHNjcixybiAqLwotICB7IDB4MDA4MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjBfYmFuayxybiAqLwotICB7IDB4MDA4MywgTE9BRCB8IFVTRVMxIH0sCQkJLyogcHJlZiBAcm4gKi8KLSAgeyAweDAwOTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIxX2Jhbmsscm4gKi8KLSAgeyAweDAwYTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIyX2Jhbmsscm4gKi8KLSAgeyAweDAwYjIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIzX2Jhbmsscm4gKi8KLSAgeyAweDAwYzIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI0X2Jhbmsscm4gKi8KLSAgeyAweDAwZDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI1X2Jhbmsscm4gKi8KLSAgeyAweDAwZTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI2X2Jhbmsscm4gKi8KLSAgeyAweDAwZjIsIFNFVFMxIHwgVVNFU1NQIH0JCQkvKiBzdGMgcjdfYmFuayxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMDJbXSA9Ci17Ci0gIHsgMHgwMDA0LCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmIgcm0sQChyMCxybikgKi8KLSAgeyAweDAwMDUsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YudyBybSxAKHIwLHJuKSAqLwotICB7IDB4MDAwNiwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5sIHJtLEAocjAscm4pICovCi0gIHsgMHgwMDA3LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtdWwubCBybSxybiAqLwotICB7IDB4MDAwYywgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmIgQChyMCxybSkscm4gKi8KLSAgeyAweDAwMGQsIExPQUQgfCBTRVRTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi53IEAocjAscm0pLHJuICovCi0gIHsgMHgwMDBlLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YubCBAKHIwLHJtKSxybiAqLwotICB7IDB4MDAwZiwgTE9BRHxTRVRTMXxTRVRTMnxTRVRTU1B8VVNFUzF8VVNFUzJ8VVNFU1NQIH0sIC8qIG1hYy5sIEBybSssQHJuKyAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlMFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTAwKSwgMHhmZmZmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUwMSksIDB4ZjBmZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMDIpLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMTBbXSA9Ci17Ci0gIHsgMHgxMDAwLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfQkvKiBtb3YubCBybSxAKGRpc3Ascm4pICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUxW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMjBbXSA9Ci17Ci0gIHsgMHgyMDAwLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG1vdi5iIHJtLEBybiAqLwotICB7IDB4MjAwMSwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtb3YudyBybSxAcm4gKi8KLSAgeyAweDIwMDIsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbW92Lmwgcm0sQHJuICovCi0gIHsgMHgyMDA0LCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBtb3YuYiBybSxALXJuICovCi0gIHsgMHgyMDA1LCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBtb3YudyBybSxALXJuICovCi0gIHsgMHgyMDA2LCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBtb3YubCBybSxALXJuICovCi0gIHsgMHgyMDA3LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1NQIH0sCS8qIGRpdjBzICovCi0gIHsgMHgyMDA4LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiB0c3Qgcm0scm4gKi8KLSAgeyAweDIwMDksIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogYW5kIHJtLHJuICovCi0gIHsgMHgyMDBhLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHhvciBybSxybiAqLwotICB7IDB4MjAwYiwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBvciBybSxybiAqLwotICB7IDB4MjAwYywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL3N0ciBybSxybiAqLwotICB7IDB4MjAwZCwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiB4dHJjdCBybSxybiAqLwotICB7IDB4MjAwZSwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbXVsdS53IHJtLHJuICovCi0gIHsgMHgyMDBmLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0JCS8qIG11bHMudyBybSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlMltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTIwKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTMwW10gPQotewotICB7IDB4MzAwMCwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2VxIHJtLHJuICovCi0gIHsgMHgzMDAyLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvaHMgcm0scm4gKi8KLSAgeyAweDMwMDMsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9nZSBybSxybiAqLwotICB7IDB4MzAwNCwgU0VUU1NQIHwgVVNFU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBkaXYxIHJtLHJuICovCi0gIHsgMHgzMDA1LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBkbXVsdS5sIHJtLHJuICovCi0gIHsgMHgzMDA2LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvaGkgcm0scm4gKi8KLSAgeyAweDMwMDcsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9ndCBybSxybiAqLwotICB7IDB4MzAwOCwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBzdWIgcm0scm4gKi8KLSAgeyAweDMwMGEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNTUCB9LCAvKiBzdWJjIHJtLHJuICovCi0gIHsgMHgzMDBiLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJLyogc3VidiBybSxybiAqLwotICB7IDB4MzAwYywgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBhZGQgcm0scm4gKi8KLSAgeyAweDMwMGQsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGRtdWxzLmwgcm0scm4gKi8KLSAgeyAweDMwMGUsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNTUCB9LCAvKiBhZGRjIHJtLHJuICovCi0gIHsgMHgzMDBmLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfQkvKiBhZGR2IHJtLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUzW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMzApLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNDBbXSA9Ci17Ci0gIHsgMHg0MDAwLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGxsIHJuICovCi0gIHsgMHg0MDAxLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGxyIHJuICovCi0gIHsgMHg0MDAyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgbWFjaCxALXJuICovCi0gIHsgMHg0MDAzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgc3IsQC1ybiAqLwotICB7IDB4NDAwNCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogcm90bCBybiAqLwotICB7IDB4NDAwNSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogcm90ciBybiAqLwotICB7IDB4NDAwNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxtYWNoICovCi0gIHsgMHg0MDA3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNyICovCi0gIHsgMHg0MDA4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDIgcm4gKi8KLSAgeyAweDQwMDksIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxyMiBybiAqLwotICB7IDB4NDAwYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0sbWFjaCAqLwotICB7IDB4NDAwYiwgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB9LAkJLyoganNyIEBybiAqLwotICB7IDB4NDAwZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sc3IgKi8KLSAgeyAweDQwMTAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIGR0IHJuICovCi0gIHsgMHg0MDExLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGNtcC9weiBybiAqLwotICB7IDB4NDAxMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIG1hY2wsQC1ybiAqLwotICB7IDB4NDAxMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIGdicixALXJuICovCi0gIHsgMHg0MDE1LCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGNtcC9wbCBybiAqLwotICB7IDB4NDAxNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxtYWNsICovCi0gIHsgMHg0MDE3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLGdiciAqLwotICB7IDB4NDAxOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGw4IHJuICovCi0gIHsgMHg0MDE5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjggcm4gKi8KLSAgeyAweDQwMWEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzIHJtLG1hY2wgKi8KLSAgeyAweDQwMWIsIExPQUQgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogdGFzLmIgQHJuICovCi0gIHsgMHg0MDFlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxnYnIgKi8KLSAgeyAweDQwMjAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNoYWwgcm4gKi8KLSAgeyAweDQwMjEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNoYXIgcm4gKi8KLSAgeyAweDQwMjIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBwcixALXJuICovCi0gIHsgMHg0MDIzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgdmJyLEAtcm4gKi8KLSAgeyAweDQwMjQsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogcm90Y2wgcm4gKi8KLSAgeyAweDQwMjUsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogcm90Y3Igcm4gKi8KLSAgeyAweDQwMjYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSsscHIgKi8KLSAgeyAweDQwMjcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssdmJyICovCi0gIHsgMHg0MDI4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDE2IHJuICovCi0gIHsgMHg0MDI5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjE2IHJuICovCi0gIHsgMHg0MDJhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcyBybSxwciAqLwotICB7IDB4NDAyYiwgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB9LAkJLyogam1wIEBybiAqLwotICB7IDB4NDAyZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sdmJyICovCi0gIHsgMHg0MDMzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgc3NyLEAtcm4gKi8KLSAgeyAweDQwMzcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssc3NyICovCi0gIHsgMHg0MDNlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxzc3IgKi8KLSAgeyAweDQwNDMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBzcGMsQC1ybiAqLwotICB7IDB4NDA0NywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxzcGMgKi8KLSAgeyAweDQwNGUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHNwYyAqLwotICB7IDB4NDA1MiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIGZwdWwsQC1ybiAqLwotICB7IDB4NDA1NiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxmcHVsICovCi0gIHsgMHg0MDVhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcy5sIHJtLGZwdWwgKi8KLSAgeyAweDQwNjIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBmcHNjcixALXJuICovCi0gIHsgMHg0MDY2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLGZwc2NyICovCi0gIHsgMHg0MDZhLCBTRVRTU1AgfCBVU0VTMSB9CQkJLyogbGRzIHJtLGZwc2NyICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU0MVtdID0KLXsKLSAgeyAweDQwODMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCByeF9iYW5rLEAtcm4gKi8KLSAgeyAweDQwODcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSsscnhfYmFuayAqLwotICB7IDB4NDA4ZSwgU0VUU1NQIHwgVVNFUzEgfQkJCS8qIGxkYyBybSxyeF9iYW5rICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU0MltdID0KLXsKLSAgeyAweDQwMGMsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJCS8qIHNoYWQgcm0scm4gKi8KLSAgeyAweDQwMGQsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJCS8qIHNobGQgcm0scm4gKi8KLSAgeyAweDQwMGYsIExPQUR8U0VUUzF8U0VUUzJ8U0VUU1NQfFVTRVMxfFVTRVMyfFVTRVNTUCB9LCAvKiBtYWMudyBAcm0rLEBybisgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTRbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU0MCksIDB4ZjBmZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNDEpLCAweGYwOGYgfSwKLSAgeyBNQVAgKHNoX29wY29kZTQyKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTUwW10gPQotewotICB7IDB4NTAwMCwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfQkvKiBtb3YubCBAKGRpc3Ascm0pLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU1W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNjBbXSA9Ci17Ci0gIHsgMHg2MDAwLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9LAkJLyogbW92LmIgQHJtLHJuICovCi0gIHsgMHg2MDAxLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9LAkJLyogbW92LncgQHJtLHJuICovCi0gIHsgMHg2MDAyLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9LAkJLyogbW92LmwgQHJtLHJuICovCi0gIHsgMHg2MDAzLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogbW92IHJtLHJuICovCi0gIHsgMHg2MDA0LCBMT0FEIHwgU0VUUzEgfCBTRVRTMiB8IFVTRVMyIH0sCS8qIG1vdi5iIEBybSsscm4gKi8KLSAgeyAweDYwMDUsIExPQUQgfCBTRVRTMSB8IFNFVFMyIHwgVVNFUzIgfSwJLyogbW92LncgQHJtKyxybiAqLwotICB7IDB4NjAwNiwgTE9BRCB8IFNFVFMxIHwgU0VUUzIgfCBVU0VTMiB9LAkvKiBtb3YubCBAcm0rLHJuICovCi0gIHsgMHg2MDA3LCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogbm90IHJtLHJuICovCi0gIHsgMHg2MDA4LCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogc3dhcC5iIHJtLHJuICovCi0gIHsgMHg2MDA5LCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogc3dhcC53IHJtLHJuICovCi0gIHsgMHg2MDBhLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMyIHwgVVNFU1NQIH0sCS8qIG5lZ2Mgcm0scm4gKi8KLSAgeyAweDYwMGIsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBuZWcgcm0scm4gKi8KLSAgeyAweDYwMGMsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBleHR1LmIgcm0scm4gKi8KLSAgeyAweDYwMGQsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBleHR1Lncgcm0scm4gKi8KLSAgeyAweDYwMGUsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBleHRzLmIgcm0scm4gKi8KLSAgeyAweDYwMGYsIFNFVFMxIHwgVVNFUzIgfQkJCS8qIGV4dHMudyBybSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlNltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTYwKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTcwW10gPQotewotICB7IDB4NzAwMCwgU0VUUzEgfCBVU0VTMSB9CQkvKiBhZGQgI2ltbSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlN1tdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTcwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTgwW10gPQotewotICB7IDB4ODAwMCwgU1RPUkUgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YuYiByMCxAKGRpc3Ascm4pICovCi0gIHsgMHg4MTAwLCBTVE9SRSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi53IHIwLEAoZGlzcCxybikgKi8KLSAgeyAweDg0MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTMiB9LAkvKiBtb3YuYiBAKGRpc3Ascm0pLHIwICovCi0gIHsgMHg4NTAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFUzIgfSwJLyogbW92LncgQChkaXNwLHJuKSxyMCAqLwotICB7IDB4ODgwMCwgU0VUU1NQIHwgVVNFU1IwIH0sCQkvKiBjbXAvZXEgI2ltbSxyMCAqLwotICB7IDB4ODkwMCwgQlJBTkNIIHwgVVNFU1NQIH0sCQkvKiBidCBsYWJlbCAqLwotICB7IDB4OGIwMCwgQlJBTkNIIHwgVVNFU1NQIH0sCQkvKiBiZiBsYWJlbCAqLwotICB7IDB4OGQwMCwgQlJBTkNIIHwgREVMQVkgfCBVU0VTU1AgfSwJLyogYnQvcyBsYWJlbCAqLwotICB7IDB4OGYwMCwgQlJBTkNIIHwgREVMQVkgfCBVU0VTU1AgfQkvKiBiZi9zIGxhYmVsICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU4W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlODApLCAweGZmMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlOTBbXSA9Ci17Ci0gIHsgMHg5MDAwLCBMT0FEIHwgU0VUUzEgfQkvKiBtb3YudyBAKGRpc3AscGMpLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU5W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlOTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlYTBbXSA9Ci17Ci0gIHsgMHhhMDAwLCBCUkFOQ0ggfCBERUxBWSB9CS8qIGJyYSBsYWJlbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlYVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWEwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWIwW10gPQotewotICB7IDB4YjAwMCwgQlJBTkNIIHwgREVMQVkgfQkvKiBic3IgbGFiZWwgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWJbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGViMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVjMFtdID0KLXsKLSAgeyAweGMwMDAsIFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YuYiByMCxAKGRpc3AsZ2JyKSAqLwotICB7IDB4YzEwMCwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi53IHIwLEAoZGlzcCxnYnIpICovCi0gIHsgMHhjMjAwLCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmwgcjAsQChkaXNwLGdicikgKi8KLSAgeyAweGMzMDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJCS8qIHRyYXBhICNpbW0gKi8KLSAgeyAweGM0MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5iIEAoZGlzcCxnYnIpLHIwICovCi0gIHsgMHhjNTAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YudyBAKGRpc3AsZ2JyKSxyMCAqLwotICB7IDB4YzYwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmwgQChkaXNwLGdicikscjAgKi8KLSAgeyAweGM3MDAsIFNFVFNSMCB9LAkJCQkvKiBtb3ZhIEAoZGlzcCxwYykscjAgKi8KLSAgeyAweGM4MDAsIFNFVFNTUCB8IFVTRVNSMCB9LAkJCS8qIHRzdCAjaW1tLHIwICovCi0gIHsgMHhjOTAwLCBTRVRTUjAgfCBVU0VTUjAgfSwJCQkvKiBhbmQgI2ltbSxyMCAqLwotICB7IDB4Y2EwMCwgU0VUU1IwIHwgVVNFU1IwIH0sCQkJLyogeG9yICNpbW0scjAgKi8KLSAgeyAweGNiMDAsIFNFVFNSMCB8IFVTRVNSMCB9LAkJCS8qIG9yICNpbW0scjAgKi8KLSAgeyAweGNjMDAsIExPQUQgfCBTRVRTU1AgfCBVU0VTUjAgfCBVU0VTU1AgfSwJLyogdHN0LmIgI2ltbSxAKHIwLGdicikgKi8KLSAgeyAweGNkMDAsIExPQUQgfCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkvKiBhbmQuYiAjaW1tLEAocjAsZ2JyKSAqLwotICB7IDB4Y2UwMCwgTE9BRCB8IFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCS8qIHhvci5iICNpbW0sQChyMCxnYnIpICovCi0gIHsgMHhjZjAwLCBMT0FEIHwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfQkvKiBvci5iICNpbW0sQChyMCxnYnIpICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVjW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlYzApLCAweGZmMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZDBbXSA9Ci17Ci0gIHsgMHhkMDAwLCBMT0FEIHwgU0VUUzEgfQkJLyogbW92LmwgQChkaXNwLHBjKSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWQwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWUwW10gPQotewotICB7IDB4ZTAwMCwgU0VUUzEgfQkJLyogbW92ICNpbW0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWVbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVlMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVmMFtdID0KLXsKLSAgeyAweGYwMDAsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmFkZCBmbSxmbiAqLwotICB7IDB4ZjAwMSwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmc3ViIGZtLGZuICovCi0gIHsgMHhmMDAyLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZtdWwgZm0sZm4gKi8KLSAgeyAweGYwMDMsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmRpdiBmbSxmbiAqLwotICB7IDB4ZjAwNCwgU0VUU1NQIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmY21wL2VxIGZtLGZuICovCi0gIHsgMHhmMDA1LCBTRVRTU1AgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZjbXAvZ3QgZm0sZm4gKi8KLSAgeyAweGYwMDYsIExPQUQgfCBTRVRTRjEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBmbW92LnMgQChyMCxybSksZm4gKi8KLSAgeyAweGYwMDcsIFNUT1JFIHwgVVNFUzEgfCBVU0VTRjIgfCBVU0VTUjAgfSwJLyogZm1vdi5zIGZtLEAocjAscm4pICovCi0gIHsgMHhmMDA4LCBMT0FEIHwgU0VUU0YxIHwgVVNFUzIgfSwJCS8qIGZtb3YucyBAcm0sZm4gKi8KLSAgeyAweGYwMDksIExPQUQgfCBTRVRTMiB8IFNFVFNGMSB8IFVTRVMyIH0sCS8qIGZtb3YucyBAcm0rLGZuICovCi0gIHsgMHhmMDBhLCBTVE9SRSB8IFVTRVMxIHwgVVNFU0YyIH0sCQkvKiBmbW92LnMgZm0sQHJuICovCi0gIHsgMHhmMDBiLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTRjIgfSwJLyogZm1vdi5zIGZtLEAtcm4gKi8KLSAgeyAweGYwMGMsIFNFVFNGMSB8IFVTRVNGMiB9LAkJCS8qIGZtb3YgZm0sZm4gKi8KLSAgeyAweGYwMGUsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB8IFVTRVNGMCB9CS8qIGZtYWMgZjAsZm0sZm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWYxW10gPQotewotICB7IDB4ZjAwZCwgU0VUU0YxIHwgVVNFU1NQIH0sCS8qIGZzdHMgZnB1bCxmbiAqLwotICB7IDB4ZjAxZCwgU0VUU1NQIHwgVVNFU0YxIH0sCS8qIGZsZHMgZm4sZnB1bCAqLwotICB7IDB4ZjAyZCwgU0VUU0YxIHwgVVNFU1NQIH0sCS8qIGZsb2F0IGZwdWwsZm4gKi8KLSAgeyAweGYwM2QsIFNFVFNTUCB8IFVTRVNGMSB9LAkvKiBmdHJjIGZuLGZwdWwgKi8KLSAgeyAweGYwNGQsIFNFVFNGMSB8IFVTRVNGMSB9LAkvKiBmbmVnIGZuICovCi0gIHsgMHhmMDVkLCBTRVRTRjEgfCBVU0VTRjEgfSwJLyogZmFicyBmbiAqLwotICB7IDB4ZjA2ZCwgU0VUU0YxIHwgVVNFU0YxIH0sCS8qIGZzcXJ0IGZuICovCi0gIHsgMHhmMDdkLCBTRVRTU1AgfCBVU0VTRjEgfSwJLyogZnRzdC9uYW4gZm4gKi8KLSAgeyAweGYwOGQsIFNFVFNGMSB9LAkJLyogZmxkaTAgZm4gKi8KLSAgeyAweGYwOWQsIFNFVFNGMSB9CQkvKiBmbGRpMSBmbiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWYwKSwgMHhmMDBmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVmMSksIDB4ZjBmZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21ham9yX29wY29kZSBzaF9vcGNvZGVzW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTEpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUyKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMykgfSwKLSAgeyBNQVAgKHNoX29wY29kZTQpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU1KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNikgfSwKLSAgeyBNQVAgKHNoX29wY29kZTcpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU4KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlOSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWEpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGViKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlYykgfSwKLSAgeyBNQVAgKHNoX29wY29kZWQpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVlKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlZikgfQotfTsKLQotLyogR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24sIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLSAgIHNoX29wY29kZSBzdHJ1Y3R1cmUuICBSZXR1cm4gTlVMTCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90Ci0gICByZWNvZ25pemVkLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKgotc2hfaW5zbl9pbmZvIChpbnNuKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLXsKLSAgY29uc3Qgc3RydWN0IHNoX21ham9yX29wY29kZSAqbWFqOwotICBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlICptaW4sICptaW5lbmQ7Ci0KLSAgbWFqID0gJnNoX29wY29kZXNbKGluc24gJiAweGYwMDApID4+IDEyXTsKLSAgbWluID0gbWFqLT5taW5vcl9vcGNvZGVzOwotICBtaW5lbmQgPSBtaW4gKyBtYWotPmNvdW50OwotICBmb3IgKDsgbWluIDwgbWluZW5kOyBtaW4rKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbDsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wLCAqb3BlbmQ7Ci0KLSAgICAgIGwgPSBpbnNuICYgbWluLT5tYXNrOwotICAgICAgb3AgPSBtaW4tPm9wY29kZXM7Ci0gICAgICBvcGVuZCA9IG9wICsgbWluLT5jb3VudDsKLQotICAgICAgLyogU2luY2UgdGhlIG9wY29kZXMgdGFibGVzIGFyZSBzb3J0ZWQsIHdlIGNvdWxkIHVzZSBhIGJpbmFyeQotICAgICAgICAgc2VhcmNoIGhlcmUgaWYgdGhlIGNvdW50IHdlcmUgYWJvdmUgc29tZSBjdXRvZmYgdmFsdWUuICAqLwotICAgICAgZm9yICg7IG9wIDwgb3BlbmQ7IG9wKyspCi0JaWYgKG9wLT5vcGNvZGUgPT0gbCkKLQkgIHJldHVybiBvcDsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7ICAKLX0KLQotLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3VzZXNfcmVnIChpbnNuLCBvcCwgcmVnKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCByZWc7Ci17Ci0gIHVuc2lnbmVkIGludCBmOwotCi0gIGYgPSBvcC0+ZmxhZ3M7Ci0KLSAgaWYgKChmICYgVVNFUzEpICE9IDAKLSAgICAgICYmICgoaW5zbiAmIDB4MGYwMCkgPj4gOCkgPT0gcmVnKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTMikgIT0gMAotICAgICAgJiYgKChpbnNuICYgMHgwMGYwKSA+PiA0KSA9PSByZWcpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNSMCkgIT0gMAotICAgICAgJiYgcmVnID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiB1c2VzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfaW5zbl91c2VzX2ZyZWcgKGluc24sIG9wLCBmcmVnKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCBmcmVnOwotewotICB1bnNpZ25lZCBpbnQgZjsKLQotICBmID0gb3AtPmZsYWdzOwotCi0gIC8qIFdlIGNhbid0IHRlbGwgaWYgdGhpcyBpcyBhIGRvdWJsZS1wcmVjaXNpb24gaW5zbiwgc28ganVzdCBwbGF5IHNhZmUKLSAgICAgYW5kIGFzc3VtZSB0aGF0IGl0IG1pZ2h0IGJlLiAgU28gbm90IG9ubHkgaGF2ZSB3ZSB0ZXN0IEZSRUcgYWdhaW5zdAotICAgICBpdHNlbGYsIGJ1dCBhbHNvIGV2ZW4gRlJFRyBhZ2FpbnN0IEZSRUcrMSAtIGlmIHRoZSB1c2luZyBpbnNuIHVzZXMKLSAgICAganVzdCB0aGUgbG93IHBhcnQgb2YgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIC0gYnV0IGFsc28gYW4gb2RkCi0gICAgIEZSRUcgYWdhaW5zdCBGUkVHLTEgLSAgaWYgdGhlIHNldHRpbmcgaW5zbiBzZXRzIGp1c3QgdGhlIGxvdyBwYXJ0Ci0gICAgIG9mIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZS4KLSAgICAgU28gd2hhdCB0aGlzIGFsbCBib2lscyBkb3duIHRvIGlzIHRoYXQgd2UgaGF2ZSB0byBpZ25vcmUgdGhlIGxvd2VzdAotICAgICBiaXQgb2YgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgIAotICBpZiAoKGYgJiBVU0VTRjEpICE9IDAKLSAgICAgICYmICgoaW5zbiAmIDB4MGUwMCkgPj4gOCkgPT0gKGZyZWcgJiAweGUpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTRjIpICE9IDAKLSAgICAgICYmICgoaW5zbiAmIDB4MDBlMCkgPj4gNCkgPT0gKGZyZWcgJiAweGUpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTRjApICE9IDAKLSAgICAgICYmIGZyZWcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGluc3RydWN0aW9ucyBJMSBhbmQgSTIgY29uZmxpY3QsIGFzc3VtaW5nIEkxIGNvbWVzCi0gICBiZWZvcmUgSTIuICBPUDEgYW5kIE9QMiBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgc2hfb3Bjb2RlIHN0cnVjdHVyZXMuCi0gICBUaGlzIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0LCBvciBmYWxzZSBpZiB0aGUKLSAgIGluc3RydWN0aW9ucyBjYW4gYmUgc3dhcHBlZCBzYWZlbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfaW5zbnNfY29uZmxpY3QgKGkxLCBvcDEsIGkyLCBvcDIpCi0gICAgIHVuc2lnbmVkIGludCBpMTsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AxOwotICAgICB1bnNpZ25lZCBpbnQgaTI7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMjsKLXsKLSAgdW5zaWduZWQgaW50IGYxLCBmMjsKLQotICBmMSA9IG9wMS0+ZmxhZ3M7Ci0gIGYyID0gb3AyLT5mbGFnczsKLQotICAvKiBMb2FkIG9mIGZwc2NyIGNvbmZsaWN0cyB3aXRoIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMuCi0gICAgIEZJWE1FOiBzaG91bGRuJ3QgdGVzdCByYXcgb3Bjb2RlcyBoZXJlLiAgKi8KLSAgaWYgKCgoaTEgJiAweGYwZmYpID09IDB4NDA2NiAmJiAoaTIgJiAweGYwMDApID09IDB4ZjAwMCkKLSAgICAgIHx8ICgoaTIgJiAweGYwZmYpID09IDB4NDA2NiAmJiAoaTEgJiAweGYwMDApID09IDB4ZjAwMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIChCUkFOQ0ggfCBERUxBWSkpICE9IDAKLSAgICAgIHx8IChmMiAmIChCUkFOQ0ggfCBERUxBWSkpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFNTUCkgIT0gMCAmJiAoZjIgJiBVU0VTU1ApICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTU1ApICE9IDAgJiYgKGYxICYgVVNFU1NQKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiBTRVRTMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFMyKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAoaTEgJiAweDAwZjApID4+IDQpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFNGMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX2ZyZWcgKGkyLCBvcDIsIChpMSAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMiAmIFNFVFMxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMSwgb3AxLCAoaTIgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUUzIpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkxLCBvcDEsIChpMiAmIDB4MDBmMCkgPj4gNCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTUjApICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkxLCBvcDEsIDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfZnJlZyAoaTEsIG9wMSwgKGkyICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBjb25mbGljdC4gICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogSTEgaXMgYSBsb2FkIGluc3RydWN0aW9uLCBhbmQgSTIgaXMgc29tZSBvdGhlciBpbnN0cnVjdGlvbi4gIFJldHVybgotICAgdHJ1ZSBpZiBJMSBsb2FkcyBhIHJlZ2lzdGVyIHdoaWNoIEkyIHVzZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfbG9hZF91c2UgKGkxLCBvcDEsIGkyLCBvcDIpCi0gICAgIHVuc2lnbmVkIGludCBpMTsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AxOwotICAgICB1bnNpZ25lZCBpbnQgaTI7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMjsKLXsKLSAgdW5zaWduZWQgaW50IGYxOwotCi0gIGYxID0gb3AxLT5mbGFnczsKLQotICBpZiAoKGYxICYgTE9BRCkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgYm90aCBTRVRTMSBhbmQgU0VUU1NQIGFyZSBzZXQsIHRoYXQgbWVhbnMgYSBsb2FkIHRvIGEgc3BlY2lhbAotICAgICByZWdpc3RlciB1c2luZyBwb3N0aW5jcmVtZW50IGFkZHJlc3NpbmcgbW9kZSwgd2hpY2ggd2UgZG9uJ3QgY2FyZQotICAgICBhYm91dCBoZXJlLiAgKi8KLSAgaWYgKChmMSAmIFNFVFMxKSAhPSAwCi0gICAgICAmJiAoZjEgJiBTRVRTU1ApID09IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIChpMSAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFNSMCkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFNGMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX2ZyZWcgKGkyLCBvcDIsIChpMSAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUcnkgdG8gYWxpZ24gbG9hZHMgYW5kIHN0b3JlcyB3aXRoaW4gYSBzcGFuIG9mIG1lbW9yeS4gIFRoaXMgaXMKLSAgIGNhbGxlZCBieSBib3RoIHRoZSBFTEYgYW5kIHRoZSBDT0ZGIHNoIHRhcmdldHMuICBBQkZEIGFuZCBTRUMgYXJlCi0gICB0aGUgQkZEIGFuZCBzZWN0aW9uIHdlIGFyZSBleGFtaW5pbmcuICBDT05URU5UUyBpcyB0aGUgY29udGVudHMgb2YKLSAgIHRoZSBzZWN0aW9uLiAgU1dBUCBpcyB0aGUgcm91dGluZSB0byBjYWxsIHRvIHN3YXAgdHdvIGluc3RydWN0aW9ucy4KLSAgIFJFTE9DUyBpcyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24sIHRvIGJlCi0gICBwYXNzZWQgdG8gU1dBUC4gIFBMQUJFTCBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbGFiZWwgaW4gYQotICAgc29ydGVkIGxpc3Qgb2YgbGFiZWxzOyBMQUJFTF9FTkQgaXMgdGhlIGVuZCBvZiB0aGUgbGlzdC4gIFNUQVJUIGFuZAotICAgU1RPUCBhcmUgdGhlIHJhbmdlIG9mIG1lbW9yeSB0byBleGFtaW5lLiAgSWYgYSBzd2FwIGlzIG1hZGUsCi0gICAqUFNXQVBQRUQgaXMgc2V0IHRvIHRydWUuICAqLwotCi1ib29sZWFuCi1fYmZkX3NoX2FsaWduX2xvYWRfc3BhbiAoYWJmZCwgc2VjLCBjb250ZW50cywgc3dhcCwgcmVsb2NzLAotCQkJIHBsYWJlbCwgbGFiZWxfZW5kLCBzdGFydCwgc3RvcCwgcHN3YXBwZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICgqc3dhcCkgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotICAgICBQVFIgcmVsb2NzOwotICAgICBiZmRfdm1hICoqcGxhYmVsOwotICAgICBiZmRfdm1hICpsYWJlbF9lbmQ7Ci0gICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgIGJmZF92bWEgc3RvcDsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIGJmZF92bWEgaTsKLQotICAvKiBJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGFsaWduZWQgb24gMiBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoKHN0YXJ0ICYgMSkgPT0gMSkKLSAgICArK3N0YXJ0OwotCi0gIC8qIE5vdyBsb29rIHRocm91Z2ggdGhlIHVuYWxpZ25lZCBhZGRyZXNzZXMuICAqLwotICBpID0gc3RhcnQ7Ci0gIGlmICgoaSAmIDIpID09IDApCi0gICAgaSArPSAyOwotICBmb3IgKDsgaSA8IHN0b3A7IGkgKz0gNCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOwotICAgICAgdW5zaWduZWQgaW50IHByZXZfaW5zbiA9IDA7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpwcmV2X29wID0gTlVMTDsKLQotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSk7Ci0gICAgICBvcCA9IHNoX2luc25faW5mbyAoaW5zbik7Ci0gICAgICBpZiAob3AgPT0gTlVMTAotCSAgfHwgKG9wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGlzIGlzIGEgbG9hZCBvciBzdG9yZSB3aGljaCBpcyBub3Qgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotCi0gICAgICB3aGlsZSAoKnBsYWJlbCA8IGxhYmVsX2VuZCAmJiAqKnBsYWJlbCA8IGkpCi0JKysqcGxhYmVsOwotCi0gICAgICBpZiAoaSA+IHN0YXJ0KQotCXsKLQkgIHByZXZfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSAtIDIpOwotCSAgcHJldl9vcCA9IHNoX2luc25faW5mbyAocHJldl9pbnNuKTsKLQotCSAgLyogSWYgdGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gaXMgaW4gYSBkZWxheSBzbG90LCB3ZQotCSAgICAgY2FuJ3Qgc3dhcC4gICovCi0JICBpZiAocHJldl9vcCA9PSBOVUxMCi0JICAgICAgfHwgKHByZXZfb3AtPmZsYWdzICYgREVMQVkpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChpID4gc3RhcnQKLQkgICYmICgqcGxhYmVsID49IGxhYmVsX2VuZCB8fCAqKnBsYWJlbCAhPSBpKQotCSAgJiYgcHJldl9vcCAhPSBOVUxMCi0JICAmJiAocHJldl9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAotCSAgJiYgISBzaF9pbnNuc19jb25mbGljdCAocHJldl9pbnNuLCBwcmV2X29wLCBpbnNuLCBvcCkpCi0JewotCSAgYm9vbGVhbiBvazsKLQotCSAgLyogVGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhIGxhYmVsLCBhbmQKLQkgICAgIHRoZXJlIGlzIGEgcHJldmlvdXMgaW5zdHJ1Y3Rpb247IFBSRVZfSU5TTiBpcyBub3QKLQkgICAgIGl0c2VsZiBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24sIGFuZCBQUkVWX0lOU04gYW5kCi0JICAgICBJTlNOIGRvIG5vdCBjb25mbGljdC4gICovCi0KLQkgIG9rID0gdHJ1ZTsKLQotCSAgaWYgKGkgPj0gc3RhcnQgKyA0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHByZXYyX2luc247Ci0JICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqcHJldjJfb3A7Ci0KLQkgICAgICBwcmV2Ml9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpIC0gNCk7Ci0JICAgICAgcHJldjJfb3AgPSBzaF9pbnNuX2luZm8gKHByZXYyX2luc24pOwotCi0JICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGJlZm9yZSBQUkVWX0lOU04gaGFzIGEgZGVsYXkKLQkJIHNsb3QtLXRoYXQgaXMsIFBSRVZfSU5TTiBpcyBpbiBhIGRlbGF5IHNsb3QtLXdlCi0JCSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIGlmIChwcmV2Ml9vcCA9PSBOVUxMCi0JCSAgfHwgKHByZXYyX29wLT5mbGFncyAmIERFTEFZKSAhPSAwKQotCQlvayA9IGZhbHNlOwotCi0JICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGJlZm9yZSBQUkVWX0lOU04gaXMgYSBsb2FkLAotCQkgYW5kIGl0IHNldHMgYSByZWdpc3RlciB3aGljaCBJTlNOIHVzZXMsIHRoZW4KLQkJIHB1dHRpbmcgSU5TTiBpbW1lZGlhdGVseSBhZnRlciBQUkVWX0lOU04gd2lsbAotCQkgY2F1c2UgYSBwaXBlbGluZSBidWJibGUsIHNvIHRoZXJlIGlzIG5vIHBvaW50IHRvCi0JCSBtYWtpbmcgdGhlIHN3YXAuICAqLwotCSAgICAgIGlmIChvawotCQkgICYmIChwcmV2Ml9vcC0+ZmxhZ3MgJiBMT0FEKSAhPSAwCi0JCSAgJiYgc2hfbG9hZF91c2UgKHByZXYyX2luc24sIHByZXYyX29wLCBpbnNuLCBvcCkpCi0JCW9rID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKG9rKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCpzd2FwKSAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBpIC0gMikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcHN3YXBwZWQgPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICB3aGlsZSAoKnBsYWJlbCA8IGxhYmVsX2VuZCAmJiAqKnBsYWJlbCA8IGkgKyAyKQotCSsrKnBsYWJlbDsKLQotICAgICAgaWYgKGkgKyAyIDwgc3RvcAotCSAgJiYgKCpwbGFiZWwgPj0gbGFiZWxfZW5kIHx8ICoqcGxhYmVsICE9IGkgKyAyKSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbmV4dF9pbnNuOwotCSAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqbmV4dF9vcDsKLQotCSAgLyogVGhlcmUgaXMgYW4gaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIGxvYWQvc3RvcmUKLQkgICAgIGluc3RydWN0aW9uLCBhbmQgaXQgZG9lcyBub3QgaGF2ZSBhIGxhYmVsLiAgKi8KLQkgIG5leHRfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSArIDIpOwotCSAgbmV4dF9vcCA9IHNoX2luc25faW5mbyAobmV4dF9pbnNuKTsKLQkgIGlmIChuZXh0X29wICE9IE5VTEwKLQkgICAgICAmJiAobmV4dF9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAotCSAgICAgICYmICEgc2hfaW5zbnNfY29uZmxpY3QgKGluc24sIG9wLCBuZXh0X2luc24sIG5leHRfb3ApKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBvazsKLQotCSAgICAgIC8qIE5FWFRfSU5TTiBpcyBub3QgaXRzZWxmIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiwKLQkJIGFuZCBpdCBkb2VzIG5vdCBjb25mbGljdCB3aXRoIElOU04uICAqLwotCi0JICAgICAgb2sgPSB0cnVlOwotCi0JICAgICAgLyogSWYgUFJFVl9JTlNOIGlzIGEgbG9hZCwgYW5kIGl0IHNldHMgYSByZWdpc3RlcgotCQkgd2hpY2ggTkVYVF9JTlNOIHVzZXMsIHRoZW4gcHV0dGluZyBORVhUX0lOU04KLQkJIGltbWVkaWF0ZWx5IGFmdGVyIFBSRVZfSU5TTiB3aWxsIGNhdXNlIGEgcGlwZWxpbmUKLQkJIGJ1YmJsZSwgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvIG1ha2UgdGhpcyBzd2FwLiAgKi8KLQkgICAgICBpZiAocHJldl9vcCAhPSBOVUxMCi0JCSAgJiYgKHByZXZfb3AtPmZsYWdzICYgTE9BRCkgIT0gMAotCQkgICYmIHNoX2xvYWRfdXNlIChwcmV2X2luc24sIHByZXZfb3AsIG5leHRfaW5zbiwgbmV4dF9vcCkpCi0JCW9rID0gZmFsc2U7Ci0KLQkgICAgICAvKiBJZiBJTlNOIGlzIGEgbG9hZCwgYW5kIGl0IHNldHMgYSByZWdpc3RlciB3aGljaAotCQkgdGhlIGluc24gYWZ0ZXIgTkVYVF9JTlNOIHVzZXMsIHRoZW4gZG9pbmcgdGhlCi0JCSBzd2FwIHdpbGwgY2F1c2UgYSBwaXBlbGluZSBidWJibGUsIHNvIHRoZXJlIGlzIG5vCi0JCSByZWFzb24gdG8gbWFrZSB0aGUgc3dhcC4gIEhvd2V2ZXIsIGlmIHRoZSBpbnNuCi0JCSBhZnRlciBORVhUX0lOU04gaXMgaXRzZWxmIGEgbG9hZCBvciBzdG9yZQotCQkgaW5zdHJ1Y3Rpb24sIHRoZW4gaXQgaXMgbWlzYWxpZ25lZCwgc28KLQkJIG9wdGltaXN0aWNhbGx5IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHN3YXBwZWQKLQkJIGl0c2VsZiwgYW5kIGp1c3QgbGl2ZSB3aXRoIHRoZSBwaXBlbGluZSBidWJibGUgaWYKLQkJIGl0IGlzbid0LiAgKi8KLQkgICAgICBpZiAob2sKLQkJICAmJiBpICsgNCA8IHN0b3AKLQkJICAmJiAob3AtPmZsYWdzICYgTE9BRCkgIT0gMCkKLQkJewotCQkgIHVuc2lnbmVkIGludCBuZXh0Ml9pbnNuOwotCQkgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm5leHQyX29wOwotCi0JCSAgbmV4dDJfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSArIDQpOwotCQkgIG5leHQyX29wID0gc2hfaW5zbl9pbmZvIChuZXh0Ml9pbnNuKTsKLQkJICBpZiAoKG5leHQyX29wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwCi0JCSAgICAgICYmIHNoX2xvYWRfdXNlIChpbnNuLCBvcCwgbmV4dDJfaW5zbiwgbmV4dDJfb3ApKQotCQkgICAgb2sgPSBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKG9rKQotCQl7Ci0JCSAgaWYgKCEgKCpzd2FwKSAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICAqcHN3YXBwZWQgPSB0cnVlOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIGZvciBsb2FkcyBhbmQgc3RvcmVzIHdoaWNoIHdlIGNhbiBhbGlnbiB0byBmb3VyIGJ5dGUKLSAgIGJvdW5kYXJpZXMuICBTZWUgdGhlIGxvbmdlciBjb21tZW50IGFib3ZlIHNoX3JlbGF4X3NlY3Rpb24gZm9yIHdoeQotICAgdGhpcyBpcyBkZXNpcmFibGUuICBUaGlzIHNldHMgKlBTV0FQUEVEIGlmIHNvbWUgaW5zdHJ1Y3Rpb24gd2FzCi0gICBzd2FwcGVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsIHBzd2FwcGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gKnBzd2FwcGVkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotICBiZmRfdm1hICpsYWJlbHMgPSBOVUxMOwotICBiZmRfdm1hICpsYWJlbCwgKmxhYmVsX2VuZDsKLQotICAqcHN3YXBwZWQgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBHZXQgYWxsIHRoZSBhZGRyZXNzZXMgd2l0aCBsYWJlbHMgb24gdGhlbS4gICovCi0gIGxhYmVscyA9IChiZmRfdm1hICopIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGJmZF92bWEpKTsKLSAgaWYgKGxhYmVscyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBsYWJlbF9lbmQgPSBsYWJlbHM7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfTEFCRUwpCi0JewotCSAgKmxhYmVsX2VuZCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgICsrbGFiZWxfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTm90ZSB0aGF0IHRoZSBhc3NlbWJsZXIgY3VycmVudGx5IGFsd2F5cyBvdXRwdXRzIHJlbG9jcyBpbgotICAgICBhZGRyZXNzIG9yZGVyLiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gc29ydAotICAgICB0aGUgbGFiZWwgdmFsdWVzIGFuZCB0aGUgcmVsb2NzLiAgKi8KLQotICBsYWJlbCA9IGxhYmVsczsKLQotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQotICAgICAgaWYgKGlyZWwtPnJfdHlwZSAhPSBSX1NIX0NPREUpCi0JY29udGludWU7Ci0KLSAgICAgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCi0gICAgICBmb3IgKGlyZWwrKzsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQlpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfREFUQSkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWwgPCBpcmVsZW5kKQotCXN0b3AgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0gICAgICBlbHNlCi0Jc3RvcCA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gICAgICBpZiAoISBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbiAoYWJmZCwgc2VjLCBjb250ZW50cywgc2hfc3dhcF9pbnNucywKLQkJCQkgICAgIChQVFIpIGludGVybmFsX3JlbG9jcywgJmxhYmVsLAotCQkJCSAgICAgbGFiZWxfZW5kLCBzdGFydCwgc3RvcCwgcHN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmcmVlIChsYWJlbHMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAobGFiZWxzICE9IE5VTEwpCi0gICAgZnJlZSAobGFiZWxzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTd2FwIHR3byBTSCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfc3dhcF9pbnNucyAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiByZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jcyA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgcmVsb2NzOwotICB1bnNpZ25lZCBzaG9ydCBpMSwgaTI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0KLSAgLyogU3dhcCB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICAqLwotICBpMSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGkyID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkyLCBjb250ZW50cyArIGFkZHIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMSwgY29udGVudHMgKyBhZGRyICsgMik7Ci0KLSAgLyogQWRqdXN0IGFsbCByZWxvYyBhZGRyZXNzZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGludCB0eXBlLCBhZGQ7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIHR5cGVzIG9mIHJlbG9jcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgIGFkanVzdC4gIFRoZXNlIHJlbG9jcyBkbyBub3QgYXBwbHkgdG8gdGhlIGluc3RydWN0aW9uIGl0c2VsZiwKLSAgICAgICAgIGJ1dCBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MuICAqLwotICAgICAgdHlwZSA9IGlyZWwtPnJfdHlwZTsKLSAgICAgIGlmICh0eXBlID09IFJfU0hfQUxJR04KLQkgIHx8IHR5cGUgPT0gUl9TSF9DT0RFCi0JICB8fCB0eXBlID09IFJfU0hfREFUQQotCSAgfHwgdHlwZSA9PSBSX1NIX0xBQkVMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiBhbiBSX1NIX1VTRVMgcmVsb2MgcG9pbnRzIHRvIG9uZSBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nCi0gICAgICAgICBzd2FwcGVkLCB3ZSBtdXN0IGFkanVzdCBpdC4gIEl0IHdvdWxkIGJlIGluY29ycmVjdCB0byBkbyB0aGlzCi0gICAgICAgICBmb3IgYSBqdW1wLCB0aG91Z2gsIHNpbmNlIHdlIHdhbnQgdG8gZXhlY3V0ZSBib3RoCi0gICAgICAgICBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIGp1bXAuICAoV2UgaGF2ZSBhdm9pZGVkIHN3YXBwaW5nCi0gICAgICAgICBhcm91bmQgYSBsYWJlbCwgc28gdGhlIGp1bXAgd2lsbCBub3Qgd2luZCB1cCBleGVjdXRpbmcgYW4KLSAgICAgICAgIGluc3RydWN0aW9uIGl0IHNob3VsZG4ndCkuICAqLwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9VU0VTKQotCXsKLQkgIGJmZF92bWEgb2ZmOwotCi0JICBvZmYgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgKyA0ICsgaXJlbC0+cl9vZmZzZXQ7Ci0JICBpZiAob2ZmID09IGFkZHIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0ICs9IDI7Ci0JICBlbHNlIGlmIChvZmYgPT0gYWRkciArIDIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0IC09IDI7Ci0JfQotCi0gICAgICBpZiAoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID09IGFkZHIpCi0JewotCSAgaXJlbC0+cl92YWRkciArPSAyOwotCSAgYWRkID0gLTI7Ci0JfQotICAgICAgZWxzZSBpZiAoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID09IGFkZHIgKyAyKQotCXsKLQkgIGlyZWwtPnJfdmFkZHIgLT0gMjsKLQkgIGFkZCA9IDI7Ci0JfQotICAgICAgZWxzZQotCWFkZCA9IDA7Ci0KLSAgICAgIGlmIChhZGQgIT0gMCkKLQl7Ci0JICBiZmRfYnl0ZSAqbG9jOwotCSAgdW5zaWduZWQgc2hvcnQgaW5zbiwgb2luc247Ci0JICBib29sZWFuIG92ZXJmbG93OwotCi0JICBsb2MgPSBjb250ZW50cyArIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIG92ZXJmbG93ID0gZmFsc2U7Ci0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOEJZMjoKLQkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKLQkgICAgICAvKiBUaGlzIHJlbG9jIGlnbm9yZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDMgYml0cyBvZgotICAgICAgICAgICAgICAgICB0aGUgcHJvZ3JhbSBjb3VudGVyIGJlZm9yZSBhZGRpbmcgaW4gdGhlIG9mZnNldC4KLSAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IGlmIEFERFIgaXMgYXQgYW4gZXZlbiBhZGRyZXNzLCB0aGUKLSAgICAgICAgICAgICAgICAgc3dhcCB3aWxsIG5vdCBhZmZlY3QgdGhlIG9mZnNldC4gIElmIEFERFIgaXMgYW4gYXQgYW4KLSAgICAgICAgICAgICAgICAgb2RkIGFkZHJlc3MsIHRoZW4gdGhlIGluc3RydWN0aW9uIHdpbGwgYmUgY3Jvc3NpbmcgYQotICAgICAgICAgICAgICAgICBmb3VyIGJ5dGUgYm91bmRhcnksIGFuZCBtdXN0IGJlIGFkanVzdGVkLiAgKi8KLQkgICAgICBpZiAoKGFkZHIgJiAzKSAhPSAwKQotCQl7Ci0JCSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JCSAgb2luc24gPSBpbnNuOwotCQkgIGluc24gKz0gYWRkIC8gMjsKLQkJICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkJfQotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgYSBtb2RpZmljYXRpb24gb2YgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiwgd2hpY2gKLSAgIHdpbGwgaGFuZGxlIFNIIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JCSAgICAgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgLyogQWxtb3N0IGFsbCByZWxvY3MgaGF2ZSB0byBkbyB3aXRoIHJlbGF4aW5nLiAgSWYgYW55IHdvcmsgbXVzdAotICAgICAgICAgYmUgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSAhPSBSX1NIX0lNTTMyCi0JICAmJiByZWwtPnJfdHlwZSAhPSBSX1NIX1BDRElTUCkKLQljb250aW51ZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBpZiAoc3ltbmR4IDwgMAotCSAgICAgIHx8ICh1bnNpZ25lZCBsb25nKSBzeW1uZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKCIlczogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIsCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBzeW1uZHgpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfUENESVNQKQotCWFkZGVuZCAtPSA0OwotCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPj0gU0hfQ09GRl9IT1dUT19DT1VOVCkKLQlob3d0byA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaG93dG8gPSAmc2hfY29mZl9ob3d0b3NbcmVsLT5yX3R5cGVdOwotCi0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBkbyBmb3IgYW4gaW50ZXJuYWwgUENESVNQIHJlbG9jLiAgKi8KLQkgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1NIX1BDRElTUCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsCi0JCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJdmFsLCBhZGRlbmQpOwotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICYmIHN5bS0+X24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgICBuYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0gCQlzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQlidWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkJbmFtZSA9IGJ1ZjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBzaF9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLXNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCWRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSA9PSBOVUxMCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgbWVtY3B5IChkYXRhLCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+Y29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgICAgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgZmFsc2UsIChiZmRfYnl0ZSAqKSBOVUxMLAotCQkJICBmYWxzZSwgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpCi0JCQkJICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAob2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkKLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIHN5bWVzejsKLSAgICAgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQl7Ci0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+bl9zY251bSAhPSAwKQotCSAgICAqc2VjcHAgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPm5fc2NudW0pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGlzeW1wLT5uX3ZhbHVlID09IDApCi0JCSpzZWNwcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICAgICAgZWxzZQotCQkqc2VjcHAgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0KLQkgIGVzeW0gKz0gKGlzeW1wLT5uX251bWF1eCArIDEpICogc3ltZXN6OwotCSAgc2VjcHAgKz0gaXN5bXAtPm5fbnVtYXV4ICsgMTsKLQkgIGlzeW1wICs9IGlzeW1wLT5uX251bWF1eCArIDE7Ci0JfQotCi0gICAgICBpZiAoISBzaF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBUaGUgdGFyZ2V0IHZlY3RvcnMuICAqLwotCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoc2hjb2ZmX3ZlYywgImNvZmYtc2giLCBCRkRfSVNfUkVMQVhBQkxFLCAwLCAnXycsIE5VTEwpCi0KLSNpZmRlZiBUQVJHRVRfU0hMX1NZTQotI2RlZmluZSBUQVJHRVRfU1lNIFRBUkdFVF9TSExfU1lNCi0jZWxzZQotI2RlZmluZSBUQVJHRVRfU1lNIHNobGNvZmZfdmVjCi0jZW5kaWYKLSAgICAgCi0jaWZuZGVmIFRBUkdFVF9TSExfTkFNRQotI2RlZmluZSBUQVJHRVRfU0hMX05BTUUgImNvZmYtc2hsIgotI2VuZGlmCi0KLUNSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfU0hMX05BTUUsIEJGRF9JU19SRUxBWEFCTEUsIDAsICdfJywgTlVMTCkKLSAgICAgCi0KLS8qIFNvbWUgcGVvcGxlIHdhbnQgdmVyc2lvbnMgb2YgdGhlIFNIIENPRkYgdGFyZ2V0IHdoaWNoIGRvIG5vdCBhbGlnbgotICAgdG8gMTYgYnl0ZSBib3VuZGFyaWVzLiAgV2UgaW1wbGVtZW50IHRoYXQgYnkgYWRkaW5nIGEgY291cGxlIG9mIG5ldwotICAgdGFyZ2V0IHZlY3RvcnMuICBUaGVzZSBhcmUganVzdCBsaWtlIHRoZSBvbmVzIGFib3ZlLCBidXQgdGhleQotICAgY2hhbmdlIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50LiAgVG8gZ2VuZXJhdGUgdGhlbSBpbiB0aGUKLSAgIGFzc2VtYmxlciwgdXNlIC1zbWFsbC4gIFRvIHVzZSB0aGVtIGluIHRoZSBsaW5rZXIsIHVzZSAtYgotICAgY29mZi1zaHtsfS1zbWFsbCBhbmQgLW9mb3JtYXQgY29mZi1zaHtsfS1zbWFsbC4KLQotICAgWWVzLCB0aGlzIGlzIGEgaG9ycmlibGUgaGFjay4gIEEgZ2VuZXJhbCBzb2x1dGlvbiBmb3Igc2V0dGluZwotICAgc2VjdGlvbiBhbGlnbm1lbnQgaW4gQ09GRiBpcyByYXRoZXIgY29tcGxleC4gIEVMRiBoYW5kbGVzIHRoaXMKLSAgIGNvcnJlY3RseS4gICovCi0KLS8qIE9ubHkgcmVjb2duaXplIHRoZSBzbWFsbCB2ZXJzaW9ucyBpZiB0aGUgdGFyZ2V0IHdhcyBub3QgZGVmYXVsdGVkLgotICAgT3RoZXJ3aXNlIHdlIHdvbid0IHJlY29nbml6ZSB0aGUgbm9uIGRlZmF1bHQgZW5kaWFubmVzcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNvZmZfc21hbGxfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQotLyogU2V0IHRoZSBzZWN0aW9uIGFsaWdubWVudCBmb3IgdGhlIHNtYWxsIHZlcnNpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc21hbGxfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgaWYgKCEgY29mZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2UgbXVzdCBhbGlnbiB0byBhdCBsZWFzdCBhIGZvdXIgYnl0ZSBib3VuZGFyeSwgYmVjYXVzZSBsb25nd29yZAotICAgICBhY2Nlc3NlcyBtdXN0IGJlIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9PSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjb3BpZWQgZnJvbSBiZmRfY29mZl9zdGRfc3dhcF90YWJsZSBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UKLSAgIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlID0KLXsKLSAgY29mZl9zd2FwX2F1eF9pbiwgY29mZl9zd2FwX3N5bV9pbiwgY29mZl9zd2FwX2xpbmVub19pbiwKLSAgY29mZl9zd2FwX2F1eF9vdXQsIGNvZmZfc3dhcF9zeW1fb3V0LAotICBjb2ZmX3N3YXBfbGluZW5vX291dCwgY29mZl9zd2FwX3JlbG9jX291dCwKLSAgY29mZl9zd2FwX2ZpbGVoZHJfb3V0LCBjb2ZmX3N3YXBfYW91dGhkcl9vdXQsCi0gIGNvZmZfc3dhcF9zY25oZHJfb3V0LAotICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaLCBTWU1FU1osIEFVWEVTWiwgUkVMU1osIExJTkVTWiwgRklMTk1MRU4sCi0jaWZkZWYgQ09GRl9MT05HX0ZJTEVOQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSAgMiwKLSAgY29mZl9zd2FwX2ZpbGVoZHJfaW4sIGNvZmZfc3dhcF9hb3V0aGRyX2luLCBjb2ZmX3N3YXBfc2NuaGRyX2luLAotICBjb2ZmX3N3YXBfcmVsb2NfaW4sIGNvZmZfYmFkX2Zvcm1hdF9ob29rLCBjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgY29mZl9ta29iamVjdF9ob29rLCBzdHlwX3RvX3NlY19mbGFncywgY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssCi0gIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLCBzeW1uYW1lX2luX2RlYnVnX2hvb2ssIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaywKLSAgY29mZl9wcmludF9hdXgsIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcywgY29mZl9yZWxvYzE2X2VzdGltYXRlLAotICBjb2ZmX2NsYXNzaWZ5X3N5bWJvbCwgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0gIGNvZmZfc3RhcnRfZmluYWxfbGluaywgY29mZl9yZWxvY2F0ZV9zZWN0aW9uLCBjb2ZmX3J0eXBlX3RvX2hvd3RvLAotICBjb2ZmX2FkanVzdF9zeW1uZHgsIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCwKLSAgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4sIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci19OwotCi0jZGVmaW5lIGNvZmZfc21hbGxfY2xvc2VfYW5kX2NsZWFudXAgXAotICBjb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGNvZmZfc21hbGxfYmZkX2ZyZWVfY2FjaGVkX2luZm8gXAotICBjb2ZmX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHMgXAotICBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3NtYWxsX3ZlYyA9Ci17Ci0gICJjb2ZmLXNoLXNtYWxsIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIHNobGNvZmZfc21hbGxfdmVjLAotICAKLSAgKFBUUikgJmJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWMgPQotewotICAiY29mZi1zaGwtc21hbGwiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbiB0b28qLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwgICAKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIHNoY29mZl9zbWFsbF92ZWMsCi0gIAotICAoUFRSKSAmYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXNwYXJjLmMgYi9iZmQvY29mZi1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTkxOWRhLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTcGFyYyBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL3NwYXJjLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLSNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBTUEFSQ01BR0lDICYmICh4KS5mX21hZ2ljICE9IExZTlhDT0ZGTUFHSUMpCi0KLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAwCi0KLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgUl9TUEFSQ19OT05FID0gMCwKLSAgICBSX1NQQVJDXzgsCQlSX1NQQVJDXzE2LAkJUl9TUEFSQ18zMiwgCi0gICAgUl9TUEFSQ19ESVNQOCwJUl9TUEFSQ19ESVNQMTYsCQlSX1NQQVJDX0RJU1AzMiwgCi0gICAgUl9TUEFSQ19XRElTUDMwLAlSX1NQQVJDX1dESVNQMjIsCi0gICAgUl9TUEFSQ19ISTIyLAlSX1NQQVJDXzIyLAotICAgIFJfU1BBUkNfMTMsCQlSX1NQQVJDX0xPMTAsCi0gICAgUl9TUEFSQ19HT1QxMCwJUl9TUEFSQ19HT1QxMywJCVJfU1BBUkNfR09UMjIsCi0gICAgUl9TUEFSQ19QQzEwLAlSX1NQQVJDX1BDMjIsCi0gICAgUl9TUEFSQ19XUExUMzAsCi0gICAgUl9TUEFSQ19DT1BZLAotICAgIFJfU1BBUkNfR0xPQl9EQVQsCVJfU1BBUkNfSk1QX1NMT1QsCi0gICAgUl9TUEFSQ19SRUxBVElWRSwKLSAgICBSX1NQQVJDX1VBMzIsCi0gICAgUl9TUEFSQ19tYXgKLSAgfTsKLQotI2lmIDAKLXN0YXRpYyBDT05TVCBjaGFyICpDT05TVCByZWxvY190eXBlX25hbWVzW10gPQotewotICAiUl9TUEFSQ19OT05FIiwKLSAgIlJfU1BBUkNfOCIsCQkiUl9TUEFSQ18xNiIsCQkiUl9TUEFSQ18zMiIsCi0gICJSX1NQQVJDX0RJU1A4IiwJIlJfU1BBUkNfRElTUDE2IiwJIlJfU1BBUkNfRElTUDMyIiwKLSAgIlJfU1BBUkNfV0RJU1AzMCIsCSJSX1NQQVJDX1dESVNQMjIiLAotICAiUl9TUEFSQ19ISTIyIiwJIlJfU1BBUkNfMjIiLAotICAiUl9TUEFSQ18xMyIsCQkiUl9TUEFSQ19MTzEwIiwKLSAgIlJfU1BBUkNfR09UMTAiLAkiUl9TUEFSQ19HT1QxMyIsCSJSX1NQQVJDX0dPVDIyIiwKLSAgIlJfU1BBUkNfUEMxMCIsCSJSX1NQQVJDX1BDMjIiLAotICAiUl9TUEFSQ19XUExUMzAiLAotICAiUl9TUEFSQ19DT1BZIiwKLSAgIlJfU1BBUkNfR0xPQl9EQVQiLAkiUl9TUEFSQ19KTVBfU0xPVCIsCi0gICJSX1NQQVJDX1JFTEFUSVZFIiwKLSAgIlJfU1BBUkNfVUEzMiIsCi19OwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgc3RvbGVuIHByZXR0eSBkaXJlY3RseSBmcm9tIGVsZi5jLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLX07Ci0KLXN0cnVjdCBjb2ZmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGNvZmZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBjb2ZmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwgLyogQEAgQXNzdW1lcyAzMiBiaXRzLiAgKi8KLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qICB7IEJGRF9SRUxPQ19TUEFSQ19VQTMyLCBSX1NQQVJDX1VBMzIgfSwgbm90IHVzZWQ/PyAqLwotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3BhcmNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGNvZmZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmY29mZl9zcGFyY19ob3d0b190YWJsZVsoaW50KSBzcGFyY19yZWxvY19tYXBbaV0uY29mZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWNvZmZfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgQkZEX0FTU0VSVCAoZHN0LT5yX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmY29mZl9zcGFyY19ob3d0b190YWJsZVtkc3QtPnJfdHlwZV07Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQJYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSBcCi0gIGNhY2hlX3B0ci0+YWRkZW5kID0gcmVsb2Mucl9vZmZzZXQ7Ci0KLS8qIENsZWFyIHRoZSByX3NwYXJlIGZpZWxkIGluIHJlbG9jcy4gICovCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsc3JjLGRzdCkgXAotICBkbyB7IFwKLSAgICAgICBkc3QtPnJfc3BhcmVbMF0gPSAwOyBcCi0gICAgICAgZHN0LT5yX3NwYXJlWzFdID0gMDsgXAotICAgICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBFbmFibGUgU3BhcmMtc3BlY2lmaWMgaGFja3MgaW4gY29mZmNvZGUuaC4gKi8KLQotI2RlZmluZSBDT0ZGX1NQQVJDCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jaWZuZGVmIFRBUkdFVF9TWU0KLSNkZWZpbmUgVEFSR0VUX1NZTSBzcGFyY2NvZmZfdmVjCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfTkFNRQotI2RlZmluZSBUQVJHRVRfTkFNRSAiY29mZi1zcGFyYyIKLSNlbmRpZgotCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIERfUEFHRUQsIDAsICdfJywgTlVMTCkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXN0Z28zMi5jIGIvYmZkL2NvZmYtc3RnbzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGJhNDAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtc3RnbzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBmaWxlcyAoZ28zMiB2YXJpYW50IHdpdGggYSBzdHViKS4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBSb2JlcnQgSG9laG5lLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBoYW5kbGVzIG5vdyBhbHNvIHN0dWJiZWQgY29mZiBpbWFnZXMuIFRoZSBzdHViIGlzIGEgc21hbGwKLSAgIERPUyBleGVjdXRhYmxlIHByb2dyYW0gYmVmb3JlIHRoZSBjb2ZmIGltYWdlIHRvIGxvYWQgaXQgaW4gbWVtb3J5Ci0gICBhbmQgZXhlY3V0ZSBpdC4gVGhpcyBpcyBuZWVkZWQsIGJlY2F1c2UgRE9TIGNhbm5vdCBydW4gY29mZiBmaWxlcy4KLQotICAgQWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGNhbGxlZCBieSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMKLSAgIGZyb20gY29mZnN3YXAuaC4KLSAgIFRoZSBvbmx5IHRoaW5nIHdoYXQgdGhleSBkbyBpcyB0byBhZGp1c3QgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbgotICAgdGhlIENPRkYgZmlsZSB3aGljaCBhcmUgb2Zmc2V0IGludG8gdGhlIGZpbGUuCi0gICBUaGlzIGlzIG5lZWRlZCwgYmVjYXVzZSBESkdQUCB1c2VzIGEgdmVyeSBzcGVjaWFsIHdheSB0byBsb2FkIGFuZCBydW4KLSAgIHRoZSBjb2ZmIGltYWdlLiBJdCBsb2FkcyB0aGUgaW1hZ2UgaW4gbWVtb3J5IGFuZCBhc3N1bWVzIHRoZW4sIHRoYXQgdGhlCi0gICBpbWFnZSBoYWQgbm8gc3R1YiBieSB1c2luZyB0aGUgZmlsZXBvaW50ZXJzIGFzIHBvaW50ZXJzIGluIHRoZSBjb2ZmCi0gICBpbWFnZSBhbmQgTk9UIGluIHRoZSBmaWxlLgotCi0gICBUbyBiZSBjb21wYXRpYmxlIHdpdGggYW55IGV4aXN0aW5nIGV4ZWN1dGFibGVzIEkgaGF2ZSBmaXhlZCB0aGlzCi0gICBoZXJlIGFuZCBOT1QgaW4gdGhlIERKR1BQIHN0YXJ0dXAgY29kZS4KLSAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JCWdvMzJzdHViYmVkY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJCSJjb2ZmLWdvMzItZXhlIgotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRQknXycKLSNkZWZpbmUgQ09GRl9HTzMyX0VYRQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotI2RlZmluZSBDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFCi0KLSNkZWZpbmUgQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuZGF0YSIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLnRleHQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLS8qIEF0IGZpcnN0IHRoZSBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9pbl9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBzcmMsIFBUUiBkc3QpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcHJlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9pbl9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBleHQsIFBUUiBpbikpOwotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3ByZSBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW4sIFBUUiBvdXQpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX291dF9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9pbl9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBleHQxLCBpbnQgdHlwZSwgaW50IGNsYXNzLCBpbnQgaW5keCwKLQkJCSAgICBpbnQgbnVtYXV4LCBQVFIgaW4xKSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9vdXRfcHJlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbnAsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAotCQkJICAgIGludCBudW1hdXgsIFBUUiBleHRwKSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9vdXRfcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW5wLCBpbnQgdHlwZSwgaW50IGNsYXNzLCBpbnQgaW5keCwKLQkJCSAgICAgaW50IG51bWF1eCwgUFRSIGV4dHApKTsKLQotc3RhdGljIHZvaWQKLWNyZWF0ZV9nbzMyX3N0dWIgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi0vKgotICAgQWxsIHRoYXQgLi4uX1BSRSBhbmQgLi4uUE9TVCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nCi0gICBjb2ZmX3N3YXAuLi4gZnVuY3Rpb25zLiBUaGUgLi4uUFJFIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcKLSAgIG9mIHRoZSBmdW5jdGlvbiBhbmQgdGhlIC4uLlBPU1QgZnVuY3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHN3YXAgcm91dGluZXMuCi0gKi8KLQotI2RlZmluZSBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QgYWRqdXN0X2ZpbGVoZHJfaW5fcG9zdAotI2RlZmluZSBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUgYWRqdXN0X2ZpbGVoZHJfb3V0X3ByZQotI2RlZmluZSBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUIGFkanVzdF9maWxlaGRyX291dF9wb3N0Ci0KLSNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QgYWRqdXN0X3Njbmhkcl9pbl9wb3N0Ci0jZGVmaW5lIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFIGFkanVzdF9zY25oZHJfb3V0X3ByZQotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgYWRqdXN0X3Njbmhkcl9vdXRfcG9zdAotCi0jZGVmaW5lIENPRkZfQURKVVNUX0FVWF9JTl9QT1NUIGFkanVzdF9hdXhfaW5fcG9zdAotI2RlZmluZSBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRSBhZGp1c3RfYXV4X291dF9wcmUKLSNkZWZpbmUgQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUIGFkanVzdF9hdXhfb3V0X3Bvc3QKLQotc3RhdGljIGJvb2xlYW4KLSAgZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiBpYmZkLCBiZmQgKiBvYmZkKSk7Ci0KLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIGdvMzJfc3R1YmJlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgotCi0vKiBJIGhvbGQgaW4gdGhlIHVzcmRhdGEgdGhlIHN0dWIgKi8KLSNkZWZpbmUgYmZkX2NvZmZfZ28zMnN0dWIgYmZkX3VzcmRhdGEKLQotLyogVGhpcyBtYWNybyBpcyB1c2VkLCBiZWNhdXNlIEkgY2Fubm90IGFzc3VtZSB0aGUgZW5kaWFuZXNzIG9mIHRoZQotICAgaG9zdCBzeXN0ZW0gKi8KLSNkZWZpbmUgX0goaW5kZXgpIChiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopKGhlYWRlcitpbmRleCoyKSkpCi0KLS8qIFRoZXNlIGJ5dGVzIGFyZSBhIDIwNDgtYnl0ZSBET1MgZXhlY3V0YWJsZSwgd2hpY2ggbG9hZHMgdGhlIENPRkYKLSAgIGltYWdlIGludG8gbWVtb3J5IGFuZCB0aGVuIHJ1bnMgaXQuIEl0IGlzIGNhbGxlZCAnc3R1YicgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgc3R1Yl9ieXRlc1tTVFVCU0laRV0gPQotewotI2luY2x1ZGUgImdvMzJzdHViLmgiCi19OwotCi0vKgotICAgSSBoYXZlIG5vdCBjb21tZW50ZWQgZWFjaCBzd2FwIGZ1bmN0aW9uIGJlbG93LCBiZWNhdXNlIHRoZQotICAgdGVjaG5pcXVlIGlzIGluIGFueSBmdW5jdGlvbiB0aGUgc2FtZS4gRm9yIHRoZSAuLi5pbiBmdW5jdGlvbiwKLSAgIGFsbCB0aGUgcG9pbnRlcnMgYXJlIGFkanVzdGVkIGJ5IGFkZGluZyBTVFVCU0laRSBhbmQgZm9yIHRoZQotICAgLi4ub3V0IGZ1bmN0aW9uLCBpdCBpcyBzdWJ0cmFjdGVkIGZpcnN0IGFuZCBhZnRlciBjYWxsaW5nIHRoZQotICAgc3RhbmRhcmQgc3dhcCBmdW5jdGlvbiBpdCBpcyByZXNldCB0byB0aGUgb2xkIHZhbHVlICovCi0KLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgYWRqdXN0aW5nIHRoZSBmaWxlcG9pbnRlcnMsIHdoaWNoCi0gICBpcyBkb25lIG9ubHksIGlmIHRoZSBwb2ludGVyIGlzIG5vbnplcm8gKi8KLQotI2RlZmluZSBBREpVU1RfVkFMKHZhbCxkaWZmKSBcCi0gIGlmICh2YWwgIT0gMCkgdmFsICs9IGRpZmYKLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX2luX3Bvc3QgIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgc3JjOwotICAgICBQVFIgZHN0OwotewotICBGSUxIRFIgKmZpbGVoZHJfc3JjID0gKEZJTEhEUiAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBkc3Q7Ci0KLSAgQURKVVNUX1ZBTCAoZmlsZWhkcl9kc3QtPmZfc3ltcHRyLCBTVFVCU0laRSk7Ci0KLSAgLyogU2F2ZSBub3cgdGhlIHN0dWIgdG8gYmUgdXNlZCBsYXRlciAqLwotICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIFNUVUJTSVpFKTsKLQotICAvKiBTaW5jZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbm8gc3RhdHVzLCBJIGRvIG5vdCBzZXQgaGVyZQotICAgICBhbnkgYmZkX2Vycm9yXy4uLgotICAgICBUaGF0IG1lYW5zLCBiZWZvcmUgdGhlIHVzZSBvZiBiZmRfY29mZl9nbzMyc3R1YiAoKSwgdGhpcyB2YWx1ZQotICAgICBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyAhPSBOVUxMICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIG1lbWNweSAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpLCBmaWxlaGRyX3NyYy0+c3R1YiwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3ByZSAgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBpbjsKLSAgRklMSERSICpmaWxlaGRyX291dCA9IChGSUxIRFIgKikgb3V0OwotCi0gIC8qIEdlbmVyYXRlIHRoZSBzdHViICovCi0gIGNyZWF0ZV9nbzMyX3N0dWIgKGFiZmQpOwotCi0gIC8qIENvcHkgdGhlIHN0dWIgdG8gdGhlIGZpbGUgaGVhZGVyICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgIT0gTlVMTCkKLSAgICBtZW1jcHkgKGZpbGVoZHJfb3V0LT5zdHViLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIFNUVUJTSVpFKTsKLSAgZWxzZQotICAgIC8qIHVzZSB0aGUgZGVmYXVsdCAqLwotICAgIG1lbWNweSAoZmlsZWhkcl9vdXQtPnN0dWIsIHN0dWJfYnl0ZXMsIFNUVUJTSVpFKTsKLQotICBBREpVU1RfVkFMIChmaWxlaGRyX2luLT5mX3N5bXB0ciwgLVNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wb3N0ICAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBpbjsKLSAgLyogdW5kbyB0aGUgYWJvdmUgY2hhbmdlICovCi0gIEFESlVTVF9WQUwgKGZpbGVoZHJfaW4tPmZfc3ltcHRyLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX2luX3Bvc3QgIChhYmZkLCBleHQsIGluKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGV4dCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW47Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3NjbnB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3JlbHB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIFNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3ByZSAgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW47Ci0gICAgIFBUUiBvdXQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfc2NucHRyLCAtU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3JlbHB0ciwgLVNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19sbm5vcHRyLCAtU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcG9zdCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19zY25wdHIsIFNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19yZWxwdHIsIFNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19sbm5vcHRyLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X2luX3Bvc3QgIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZXh0MSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopIGluMTsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBBREpVU1RfVkFMIChpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBTVFVCU0laRSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9vdXRfcHJlICAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGlucDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBjbGFzczsKLSAgICAgaW50IGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZXh0cCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgLVNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wb3N0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW5wOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBleHRwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopIGlucDsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBBREpVU1RfVkFMIChpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBTVFVCU0laRSk7Ci0gICAgfQotfQotCi0vKgotICAgVGhhdCdzIHRoZSBmdW5jdGlvbiwgd2hpY2ggY3JlYXRlcyB0aGUgc3R1Yi4gVGhlcmUgYXJlCi0gICBkaWZmZXJlbnQgY2FzZXMgZnJvbSB3aGVyZSB0aGUgc3R1YiBpcyB0YWtlbi4KLSAgIEF0IGZpcnN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkKEdPMzJTVFVCKSBpcyBjaGVja2VkIGFuZCB0aGVuCi0gICAkKFNUVUIpIGlmIGl0IHdhcyBub3Qgc2V0LgotICAgSWYgaXQgZXhpc3RzIGFuZCBwb2ludHMgdG8gYSB2YWxpZCBzdHViIHRoZSBzdHViIGlzIHRha2VuIGZyb20KLSAgIHRoYXQgZmlsZS4gVGhpcyBmaWxlIGNhbiBiZSBhbHNvIGEgd2hvbGUgZXhlY3V0YWJsZSBmaWxlLCBiZWNhdXNlCi0gICB0aGUgc3R1YiBpcyBjb21wdXRlZCBmcm9tIHRoZSBleGUgaW5mb3JtYXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoYXQKLSAgIGZpbGUuCi0KLSAgIElmIHRoZXJlIHdhcyBhbnkgZXJyb3IsIHRoZSBzdGFuZGFyZCBzdHViIChjb21waWxlZCBpbiB0aGlzIGZpbGUpCi0gICBpcyB0YWtlbi4KLSAqLwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2dvMzJfc3R1YiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBEbyBpdCBvbmx5IG9uY2UgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnN0dWI7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgIGludCBmOwotICAgICAgdW5zaWduZWQgY2hhciBoZWFkZXJbMTBdOwotICAgICAgY2hhciBtYWdpY1s4XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgY29mZl9zdGFydCwgZXhlX3N0YXJ0OwotCi0gICAgICAvKiBDaGVjayBhdCBmaXJzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChHTzMyU1RVQikgKi8KLSAgICAgIHN0dWIgPSBnZXRlbnYgKCJHTzMyU1RVQiIpOwotICAgICAgLyogTm93IGNoZWNrIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkKFNUVUIpICovCi0gICAgICBpZiAoc3R1YiA9PSBOVUxMKQotCXN0dWIgPSBnZXRlbnYgKCJTVFVCIik7Ci0gICAgICBpZiAoc3R1YiA9PSBOVUxMKQotCWdvdG8gc3R1Yl9lbmQ7Ci0gICAgICBpZiAoc3RhdCAoc3R1YiwgJnN0KSAhPSAwKQotCWdvdG8gc3R1Yl9lbmQ7Ci0jaWZkZWYgT19CSU5BUlkKLSAgICAgIGYgPSBvcGVuIChzdHViLCBPX1JET05MWSB8IE9fQklOQVJZKTsKLSNlbHNlCi0gICAgICBmID0gb3BlbiAoc3R1YiwgT19SRE9OTFkpOwotI2VuZGlmCi0gICAgICBpZiAoZiA8IDApCi0JZ290byBzdHViX2VuZDsKLSAgICAgIGlmIChyZWFkIChmLCAmaGVhZGVyLCBzaXplb2YgKGhlYWRlcikpIDwgMCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIGlmIChfSCAoMCkgIT0gMHg1YTRkKQkvKiBpdCBpcyBub3QgYW4gZXhlIGZpbGUgKi8KLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHN0dWIgKGl0IGlzIGV2ZXJ5IHRoaW5nIHVwCi0gICAgICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb2ZmIGltYWdlKSAqLwotICAgICAgY29mZl9zdGFydCA9IChsb25nKSBfSCAoMikgKiA1MTJMOwotICAgICAgaWYgKF9IICgxKSkKLQljb2ZmX3N0YXJ0ICs9IChsb25nKSBfSCAoMSkgLSA1MTJMOwotCi0gICAgICAvKiBDdXJyZW50bHkgdGhlcmUgaXMgb25seSBhIGZpeGVkIHN0dWIgc2l6ZSBvZiAyMDQ4IGJ5dGVzCi0gICAgICAgICBzdXBwb3J0ZWQgKi8KLSAgICAgIGlmIChjb2ZmX3N0YXJ0ICE9IDIwNDgpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBleGVfc3RhcnQgPSBfSCAoNCkgKiAxNjsKLSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgbHNlZWsgKGYsIGV4ZV9zdGFydCwgU0VFS19TRVQpICE9IGV4ZV9zdGFydCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIGlmIChyZWFkIChmLCAmbWFnaWMsIDgpICE9IDgpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAobWVtY21wIChtYWdpYywgImdvMzJzdHViIiwgOCkgIT0gMCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIC8qIE5vdyB3ZSBmb3VuZCBhIGNvcnJlY3Qgc3R1YiAoaG9wZWZ1bGx5KSAqLwotICAgICAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBjb2ZmX3N0YXJ0KTsKLSAgICAgIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbHNlZWsgKGYsIDBMLCBTRUVLX1NFVCk7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHJlYWQgKGYsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgY29mZl9zdGFydCkKLQkgICE9IGNvZmZfc3RhcnQpCi0JewotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSk7Ci0JICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSBOVUxMOwotCX0KLSAgICAgIGNsb3NlIChmKTsKLSAgICB9Ci1zdHViX2VuZDoKLSAgLyogVGhlcmUgd2FzIHNvbWV0aGluZyB3cm9uZyBhYm92ZSwgc28gdXNlIG5vdyB0aGUgc3RhbmRhcmQgYnVpbHRpbgotICAgICBzdHViICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIFNUVUJTSVpFKTsKLSAgICAgIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLQl7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBtZW1jcHkgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgc3R1Yl9ieXRlcywgU1RVQlNJWkUpOwotICAgIH0KLX0KLQotLyogSWYgaWJmZCB3YXMgYSBzdHViYmVkIGNvZmYgaW1hZ2UsIGNvcHkgdGhlIHN0dWIgZnJvbSB0aGF0IGJmZAotICAgdG8gdGhlIG5ldyBvYmZkLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1nbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhICAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIC8qIGNoZWNrIGlmIGJvdGggYXJlIHRoZSBzYW1lIHRhcmdldHMgKi8KLSAgaWYgKGliZmQtPnh2ZWMgIT0gb2JmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBjaGVjayBpZiBib3RoIGhhdmUgYSB2YWxpZCBzdHViICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoaWJmZCkgPT0gTlVMTAotICAgICAgfHwgYmZkX2NvZmZfZ28zMnN0dWIgKG9iZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTm93IGNvcHkgdGhlIHN0dWIgKi8KLSAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAob2JmZCksIGJmZF9jb2ZmX2dvMzJzdHViIChpYmZkKSwgU1RVQlNJWkUpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3ZtNjhrLmMgYi9iZmQvY29mZi1zdm02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyYTVhNy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zdm02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgc3lzdjY4Ci0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a3N5c3Zjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLXN5c3YiCi0jZGVmaW5lIFNUQVRJQ19SRUxPQ1MKLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXRpYzMwLmMgYi9iZmQvY29mZi10aWMzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTcxZjc2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXRpYzMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBUTVMzMjBDMzAgY29mZiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi90aWMzMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1yZWxvY19ob3d0b190eXBlIHRpYzMwX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1RJQzMwX0FCUzE2LCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIE5VTEwsCi0JICIxNiIsIGZhbHNlLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX0FCUzI0LCAyLCAyLCAyNCwgZmFsc2UsIDgsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiMjQiLCBmYWxzZSwgMHhGRkZGRkYwMCwgMHhGRkZGRkYwMCwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9MRFAsIDE4LCAwLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVElDMzBfQUJTMzIsIDIsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCi0JICIzMiIsIGZhbHNlLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX1BDMTYsIDIsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIE5VTEwsCi0JICJQQ1JFTCIsIGZhbHNlLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGLCBmYWxzZSksCi0gIEVNUFRZX0hPV1RPICgtMSkKLX07Ci0KLSNpZm5kZWYgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgdGljMzBfY29mZl9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBGb3IgdGhlIGNhc2Ugc3RhdGVtZW50IHVzZSB0aGUgY29kZSB2YWx1ZXMgdXNlZCBpbiB0Y19nZW5fcmVsb2MgdG8KLSAgIG1hcCB0byB0aGUgaG93dG8gdGFibGUgZW50cmllcyB0aGF0IG1hdGNoIHRob3NlIGluIGJvdGggdGhlIGFvdXQKLSAgIGFuZCBjb2ZmIGltcGxlbWVudGF0aW9ucy4gKi8KLXJlbG9jX2hvd3RvX3R5cGUgKgotdGljMzBfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVElDMzBfTERQOgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzJdOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzBdOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0OgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzFdOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzRdOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzNdOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi1zdGF0aWMgaW50Ci1jb2ZmX3RpYzMwX3NlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHgucl90eXBlID0gY29mZl90aWMzMF9zZWxlY3RfcmVsb2MoaG93dG8pCi0KLQotI2RlZmluZSBCQURNQUcoeCkgVElDMzBCQURNQUcoeCkKLSNkZWZpbmUgVElDMzAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCi1kc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZS4gKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9USUMzMF9BQlMxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzBdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX0FCUzI0OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfQUJTMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVszXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9MRFA6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVsyXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9QQzE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbNF07Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLS8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci19Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2NvZmZfdmVjID0KLXsKLSAgImNvZmYtdGljMzAiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXRpYzgwLmMgYi9iZmQvY29mZi10aWM4MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTMyZWE2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXRpYzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDODAgTXVsdGltZWRpYSBWaWRlbyBQcm9jZXNzb3IgKE1WUCkuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggKGZuZkBjeWdudXMuY29tKQotCi0gICBUaGVyZSBpcyBub3RoaW5nIG5ldyB1bmRlciB0aGUgc3VuLiBUaGlzIGZpbGUgZHJhd3MgYSBsb3Qgb24gb3RoZXIKLSAgIGNvZmYgZmlsZXMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi90aWM4MC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotI2RlZmluZSBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSIDEKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRkxBR1MgMQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfRkxBR1MgYmZkX2hfZ2V0XzE2Ci0jZGVmaW5lIFBVVF9TQ05IRFJfRkxBR1MgYmZkX2hfcHV0XzE2Ci0KLXN0YXRpYyB2b2lkIHJ0eXBlMmhvd3RvCi0gIFBBUkFNUyAoKGFyZWxlbnQgKmNhY2hlX3B0ciwgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3QpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBiYXNlX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBnbG9iMTVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdsb2IxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbG9jYWwxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgdGljODBfaG93dG9fdGFibGVbXSA9Ci17Ci0KLSAgSE9XVE8gKFJfUkVMTE9ORywJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTExPTkciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTVBQQ1IsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJNUFBDUiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BQlMsCQkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQUJTIiwJCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBCQVNFLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGJhc2VfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBCQVNFIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTEJBU0UsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwYmFzZV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExCQVNFIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE1IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNVciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFAxNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQMTZCIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUEwxNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUEwxNVciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTVIIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGxvY2FsMTZfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTZCIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNVcsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTjE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTZCLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTjE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExOMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTE4xNVcsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExOMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTVILAkJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGxvY2FsMTZfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotDAotLyogU3BlY2lhbCByZWxvY2F0aW9uIGZ1bmN0aW9ucywgdXNlZCB3aGVuIHRoZSBvdXRwdXQgZmlsZSBpcyBub3QKLSAgIGl0c2VsZiBhIENPRkYgVEljODAgZmlsZS4gICovCi0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgYmFzZSBhZGRyZXNzIHR5cGUKLSAgIHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBiYXNlX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2xfaW4gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZ2xvYmFsIDE1IGJpdCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWdsb2IxNV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGdsb2JhbCAxNiBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1nbG9iMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBsb2NhbCAxNiBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1sb2NhbDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2xfaW4gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0MCi0vKiBDb2RlIHRvIHR1cm4gYW4gZXh0ZXJuYWwgcl90eXBlIGludG8gYSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBob3d0b190YWJsZS4KLSAgIElmIHBhc3NlZCBhbiByX3R5cGUgd2UgZG9uJ3QgcmVjb2duaXplIHRoZSBhYm9ydCByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nCi0gICB0byBnZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZS4gKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiB0aWM4MF9ob3d0b190YWJsZSAvIHNpemVvZiB0aWM4MF9ob3d0b190YWJsZVswXTsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0aWM4MF9ob3d0b190YWJsZVtpXS50eXBlID09IGRzdC0+cl90eXBlKQotCXsKLQkgIGNhY2hlX3B0ci0+aG93dG8gPSB0aWM4MF9ob3d0b190YWJsZSArIGk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVucmVjb2duaXplZCByZWxvYyB0eXBlIDB4JXgiKSwKLQkJCSAodW5zaWduZWQgaW50KSBkc3QtPnJfdHlwZSk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSB0aWM4MF9ob3d0b190YWJsZSArIDA7Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIHJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX3RpYzgwX3J0eXBlX3RvX2hvd3RvCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfdGljODBfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICBhcmVsZW50IGdlbnJlbDsKLQotICBpZiAocmVsIC0+IHJfc3ltbmR4ID09IC0xICYmIGFkZGVuZHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgVEkgImludGVybmFsIHJlbG9jYXRpb24iLCB3aGljaCBtZWFucyB0aGF0IHRoZSByZWxvY2F0aW9uCi0JIGFtb3VudCBpcyB0aGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgYmVpbmcgcmVsb2NhdGVkCi0JIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gKi8KLSAgICAgICphZGRlbmRwID0gKHNlYyAtPiBvdXRwdXRfc2VjdGlvbiAtPiB2bWEgKyBzZWMgLT4gb3V0cHV0X29mZnNldCkgLSBzZWMgLT4gdm1hOwotICAgIH0KLSAgUlRZUEUySE9XVE8gKCZnZW5yZWwsIHJlbCk7Ci0gIHJldHVybiBnZW5yZWwuaG93dG87Ci19Ci0KLSNpZm5kZWYgQkFETUFHCi0jZGVmaW5lIEJBRE1BRyh4KSBUSUM4MEJBRE1BRyh4KQotI2VuZGlmCi0MCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24KLQotLyogV2UgbmVlZCBhIHNwZWNpYWwgcmVsb2NhdGlvbiByb3V0aW5lIHRvIGhhbmRsZSB0aGUgUFAgcmVsb2NzLiAgTW9zdAotICAgb2YgdGhpcyBpcyBhIGNvcHkgb2YgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCSAgICAgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX3ZtYSBhZGRyOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQotICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAotICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKLSAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLwotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgaG93dG8gPSBiZmRfY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUpOwotCSAgICAgIGlmICghIG9ial9wZSAob3V0cHV0X2JmZCkpCi0JCXZhbCAtPSBzZWMtPnZtYTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBhZGRyID0gcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBGSVhNRTogVGhpcyBjb2RlIGFzc3VtZXMgbGl0dGxlIGVuZGlhbiwgYnV0IHRoZSBQUCBjYW4KLSAgICAgICAgIGFwcGFyZW50bHkgYmUgYmktZW5kaWFuLiAgSSBkb24ndCBrbm93IGlmIHRoZSBiaS1lbmRpYW5uZXNzCi0gICAgICAgICBhcHBsaWVzIHRvIHRoZSBpbnN0cnVjdGlvbiBzZXQgb3IganVzdCB0byB0aGUgZGF0YS4gICovCi0gICAgICBzd2l0Y2ggKGhvd3RvLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgUl9BQlM6Ci0JY2FzZSBSX1JFTExPTkdYOgotCWNhc2UgUl9QUEwxNToKLQljYXNlIFJfUFBMMTVXOgotCWNhc2UgUl9QUEwxNUg6Ci0JY2FzZSBSX1BQTE4xNToKLQljYXNlIFJfUFBMTjE1VzoKLQljYXNlIFJfUFBMTjE1SDoKLQkgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsIGFkZHIsIHZhbCwgYWRkZW5kKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQMTU6Ci0JY2FzZSBSX1BQMTVXOgotCWNhc2UgUl9QUDE1SDoKLQljYXNlIFJfUFBOMTU6Ci0JY2FzZSBSX1BQTjE1VzoKLQljYXNlIFJfUFBOMTVIOgotCSAgLyogT2Zmc2V0IHRoZSBhZGRyZXNzIHNvIHRoYXQgd2UgY2FuIHVzZSA0IGJ5dGUgcmVsb2NhdGlvbnMuICAqLwotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cyArIDIsIGFkZHIsIHZhbCwgYWRkZW5kKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQMTZCOgotCWNhc2UgUl9QUE4xNkI6Ci0JICB7Ci0JICAgIC8qIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBzdG9yZWQgaW4gYml0IDYuICAqLwotCSAgICBiZmRfYnl0ZSBob2xkOwotCi0JICAgIGhvbGQgPSBjb250ZW50c1thZGRyICsgNF07Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSAmPX4gMHgyMDsKLQkgICAgY29udGVudHNbYWRkciArIDRdIHw9IChjb250ZW50c1thZGRyXSA+PiAxKSAmIDB4MjA7Ci0JICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBjb250ZW50cyArIDIsIGFkZHIsCi0JCQkJCSAgICAgIHZhbCwgYWRkZW5kKTsKLQkgICAgY29udGVudHNbYWRkcl0gJj1+IDB4NDA7Ci0JICAgIGNvbnRlbnRzW2FkZHJdIHw9IChjb250ZW50c1thZGRyICsgNF0gPDwgMSkgJiAweDQwOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gJj1+IDB4MjA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSB8PSBob2xkICYgMHgyMDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIFJfUFBMMTZCOgotCWNhc2UgUl9QUExOMTZCOgotCSAgewotCSAgICAvKiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgc3RvcmVkIGluIGJpdCAyOC4gICovCi0JICAgIGJmZF9ieXRlIGhvbGQ7Ci0KLQkgICAgaG9sZCA9IGNvbnRlbnRzW2FkZHIgKyAxXTsKLQkgICAgY29udGVudHNbYWRkciArIDFdICY9fiAweDgwOwotCSAgICBjb250ZW50c1thZGRyICsgMV0gfD0gKGNvbnRlbnRzW2FkZHIgKyAzXSA8PCAzKSAmIDB4ODA7Ci0JICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBjb250ZW50cywgYWRkciwKLQkJCQkJICAgICAgdmFsLCBhZGRlbmQpOwotCSAgICBjb250ZW50c1thZGRyICsgM10gJj0gfjB4MTA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAzXSB8PSAoY29udGVudHNbYWRkciArIDFdID4+IDMpICYgMHgxMDsKLQkgICAgY29udGVudHNbYWRkciArIDFdICY9fiAweDgwOwotCSAgICBjb250ZW50c1thZGRyICsgMV0gfD0gaG9sZCAmIDB4ODA7Ci0JICAgIGJyZWFrOwotCSAgfQotCQotCWNhc2UgUl9QUEJBU0U6Ci0JICAvKiBQYXJhbWV0ZXIgUkFNIGlzIGZyb20gMHgxMDAwMDAwIHRvIDB4MTAwMDgwMC4gICovCi0JICBjb250ZW50c1thZGRyXSAmPX4gMHgzOwotCSAgaWYgKHZhbCA+PSAweDEwMDAwMDAgJiYgdmFsIDwgMHgxMDAwODAwKQotCSAgICBjb250ZW50c1thZGRyXSB8PSAweDM7Ci0JICBlbHNlCi0JICAgIGNvbnRlbnRzW2FkZHJdIHw9IDB4MjsKLQkgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFBMQkFTRToKLQkgIC8qIFBhcmFtZXRlciBSQU0gaXMgZnJvbSAweDEwMDAwMDAgdG8gMHgxMDAwODAwLiAgKi8KLQkgIGNvbnRlbnRzW2FkZHIgKyAyXSAmPSB+MHhjMDsKLQkgIGlmICh2YWwgPj0gMHgxMDAwMDAwICYmIHZhbCA8IDB4MTAwMDgwMCkKLQkgICAgY29udGVudHNbYWRkciArIDJdIHw9IDB4YzA7Ci0JICBlbHNlCi0JICAgIGNvbnRlbnRzW2FkZHIgKyAyXSB8PSAweDgwOwotCSAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyLAotCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0jZGVmaW5lIFRJQzgwQ09GRiAxCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI3VuZGVmIENfQVVUT0FSRwkJLyogQ2xhc2hlcyB3aXRoIFRJYzgwJ3MgQ19VRVhUICovCi0jdW5kZWYgQ19MQVNURU5UCQkvKiBDbGFzaGVzIHdpdGggVEljODAncyBDX1NUQVRMQUIgKi8KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAodGljODBjb2ZmX3ZlYywgImNvZmYtdGljODAiLCBEX1BBR0VELCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi11NjhrLmMgYi9iZmQvY29mZi11NjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZWE3M2YuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtdTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA2ODAwMCBDT0ZGIGJpbmFyaWVzIGhhdmluZyB1bmRlcnNjb3JlIHdpdGggbmFtZS4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2NvZmZ1bl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay11biIKLQotI2RlZmluZSBOQU1FU19IQVZFX1VOREVSU0NPUkUKLQotLyogZGVmaW5lIHRoaXMgdG8gbm90IGhhdmUgbXVsdGlwbGUgY29weSBvZiBtNjhrX3J0eXBlMmhvd3RvCi0gICBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlICovCi0jZGVmaW5lIE9OTFlfREVDTEFSRV9SRUxPQ1MKLQotLyogVGhpcyBtYWdpYyBudW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWVzIGhhdmUgdW5kZXJzY29yZXMuCi0gICBPdGhlciA2OGsgbWFnaWMgbnVtYmVycyBpbmRpY2F0ZSB0aGF0IHRoZSBuYW1lcyBkbyBub3QgaGF2ZQotICAgdW5kZXJzY29yZXMuICAqLwotI2RlZmluZSBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IE1DNjhLQkNTTUFHSUMpCi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXc2NS5jIGIvYmZkL2NvZmYtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzliZmIuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtdzY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBXREMgNjU4MTYgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3c2NS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1c2NV9BQlM4LCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzE2LCAgIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMyNCwgICAwLCAgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczI0IiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTOFM4LCAgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIj5hYnM4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTOFMxNiwgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIl5hYnM4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMTZTOCwgMSwgIDAsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI+YWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMxNlMxNiwxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIl5hYnMxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X1BDUjgsICAgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJwY3JlbDgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfVzY1X1BDUjE2LCAgIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicGNyZWwxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9XNjVfRFAsICAgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJkcCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLQotfTsKLQotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSBcCi0gIHsgeC5yX3R5cGUgPSBzZWxlY3RfcmVsb2MoaG93dG8pOyB9Ci0KLSNkZWZpbmUgQkFETUFHKHgpIChXNjVCQURNQUcoeCkpCi0jZGVmaW5lIFc2NSAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLQotc3RhdGljIGludAotc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZSA7Ci19Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIGRzdC0+cl90eXBlIC0gMTsKLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSYoYmZkX2Fic19zeW1ib2wpOwotICAgIH0KLQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0KLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLSAgLyogIHJlbGVudC0+c2VjdGlvbiA9IDA7Ki8KLX0KLQotCi1zdGF0aWMgaW50Ci1oODMwMF9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWU7ICAKLSAgYmZkX3ZtYSBkb3Q7Ci0gIGJmZF92bWEgZ2FwOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyB0byBiZSByZWxvY2F0ZWQgd2lsbCBoYXZlIG1vdmVkIGJhY2sgYnkgCi0gICB0aGUgc2l6ZSBvZiB0aGUgc2hyaW5rICAtIGJ1dCB3ZSBkb24ndCBjaGFuZ2UgcmVsb2MtPmFkZHJlc3MgaGVyZSwKLSAgIHNpbmNlIHdlIG5lZWQgaXQgdG8ga25vdyB3aGVyZSB0aGUgcmVsb2NhdGlvbiBsaXZlcyBpbiB0aGUgc291cmNlCi0gICB1bmNvb2tlZCBzZWN0aW9uICovCi0KLSAgLyogIHJlbG9jLT5hZGRyZXNzIC09IHNocmluazsgICBjb25jZXB0dWFsICovCi0KLSAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsb2MtPmFkZHJlc3MgLSBzaHJpbms7Ci0gIAotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsgICAgIAotICAgIGNhc2UgUl9NT1YxNkIyOgotICAgIGNhc2UgUl9KTVAyOgotICAgICAgc2hyaW5rKz0yOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoaW5nIGlzIGEgbW92ZSBvbmUgYnl0ZSAqLwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgaWYgKHZhbHVlID49IDB4ZmYwMCkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAxNmJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAxNiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgb25lICovCi0JICAvKiBUaGlzIHdpbGwgYmUgdHdvIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuICovCi0JICBzaHJpbmsgKz0yIDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfSAgICAgIAotCi0gICAgICBicmVhazsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIDI0IGJpdCBicmFuY2ggd2hpY2ggY291bGQgYmVjb21lIGFuIDggYml0dGVyLCAKLSAgICAgICB0aGUgcmVsb2NhdGlvbiBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluc24sIG5vdCB0aGUKLSAgICAgICBhY3R1YWwgZGF0YSAqLwotCi0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkKLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIFNlZSBpZiB0aGUgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGF0IHdpdGhpbiAxMjcgYnl0ZXMgb2Ygd2hlcmUKLQkgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0JIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdCA7Ci0gIAotICAgICAgaWYgKC0xMjAgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTIwICkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAyNGJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAzMiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoaXMgd2lsbCBiZSB0d28gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLQkgIHNocmluayArPTIgOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9KTVAxOgotCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCQotICAgICAgZG90ID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3M7Ci0gIAotICAgICAgLyogU2VlIGlmIHRoZSBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgYXQgd2l0aGluIDEyNyBieXRlcyBvZiB3aGVyZQotCSB3ZSBhcmUsIGlmIHNvIHRoZW4gd2UgY2FuIHVzZSBhIHNtYWxsIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUKLQkganVtcCB3ZSB3ZXJlIGdvaW5nIHRvICovCi0KLSAgICAgIGdhcCA9IHZhbHVlIC0gKGRvdCAtIHNocmluayk7Ci0gIAotCi0gICAgICBpZiAoLTEyMCA8IChsb25nKWdhcCAmJiAobG9uZylnYXAgPCAxMjAgKQotCXsgCi0KLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDE2Yml0LCBwb3NzaWJsZSA4IHRvIDhiaXQKLQkgICAgIHBvc3NpYmxlIDE2ICovCi0JICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwkgIAotCSAgLyogVGhlIHBsYWNlIHRvIHJlbGMgbW92ZXMgYmFjayBieSBvbmUgKi8KLQotCSAgLyogVGhpcyB3aWxsIGJlIHR3byBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotCSAgc2hyaW5rICs9MiA7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAKLSAgcmV0dXJuIHNocmluazsKLX0KLQotCi0vKiBGaXJzdCBwaGFzZSBvZiBhIHJlbGF4aW5nIGxpbmsgKi8KLQotLyogUmVsb2MgdHlwZXMKLSAgIGxhcmdlCQlzbWFsbAotICAgUl9NT1YxNkIxCQlSX01PVjE2QjIJbW92LmIgd2l0aCAxNmJpdCBvciA4IGJpdCBhZGRyZXNzCi0gICBSX0pNUDEJCVJfSk1QMgkJam1wIG9yIHBjcmVsIGJyYW5jaAotICAgUl9KTVBMMQkJUl9KTVBMX0I4CTI0am1wIG9yIHBjcmVsIGJyYW5jaAotICAgUl9NT1YyNEIxCQlSX01PVjI0QjIJMjQgb3IgOCBiaXQgcmVsb2MgZm9yIG1vdi5iCi0KLSovCi0KLXN0YXRpYyB2b2lkCi1oODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9ICpzcmNfcHRyOwotICB1bnNpZ25lZCBpbnQgZHN0X2FkZHJlc3MgPSAqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9XNjVfQUJTODoKLSAgICBjYXNlIFJfVzY1X0RQOgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTOFM4OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49IDg7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzhTMTY6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWdhcCA+Pj0xNjsKLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTMTY6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCi0JYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDI7Ci0Jc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfQUJTMTZTODoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSA4OwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0FCUzE2UzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49IDE2OwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTMjQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQliZmRfcHV0XzggKGFiZmQsIGdhcD4+MTYsIGRhdGErZHN0X2FkZHJlc3MrMik7Ci0JZHN0X2FkZHJlc3MgKz0gMzsKLQlzcmNfYWRkcmVzcyArPSAzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X1BDUjg6Ci0gICAgICB7Ci0JaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICsgZHN0X2FkZHJlc3MgCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JZ2FwIC09IGRvdCArIDE7Ci0JaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI3KSB7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0KCk7Ci0JfQotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDE7Ci0Jc3JjX2FkZHJlc3MgKz0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9QQ1IxNjoKLSAgICAgIHsKLQliZmRfdm1hIGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICsgZHN0X2FkZHJlc3MgCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0KLQkvKiBUaGlzIHdyYXBzIHdpdGhpbiB0aGUgcGFnZSwgc28gaWdub3JlIHRoZSByZWxhdGl2ZW5lc3MsIGxvb2sgYXQgdGhlCi0JICAgaGlnaCBwYXJ0ICovCi0JaWYgKChnYXAgJiAweGYwMDAwKSAhPSAoZG90ICYgMHhmMDAwMCkpIHsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQoKTsKLQl9Ci0KLQlnYXAgLT0gZG90ICsgMjsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZihfKCJpZ25vcmluZyByZWxvYyAlc1xuIiksIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgKnNyY19wdHIgPSBzcmNfYWRkcmVzczsKLSAgKmRzdF9wdHIgPSBkc3RfYWRkcmVzczsKLQotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBoODMwMF9yZWxvYzE2X2VzdGltYXRlCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLUNSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDICh3NjVfdmVjLCAiY29mZi13OTUiLCBCRkRfSVNfUkVMQVhBQkxFLCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi13ZTMyay5jIGIvYmZkL2NvZmYtd2UzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1OWFkNy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi13ZTMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciB3ZTMyayBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEJyZW5kYW4gS2Vob2UgKGJyZW5kYW5AY3Mud2lkZW5lci5lZHUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL3dlMzJrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgICBFTVBUWV9IT1dUTyAoMCksCi0gICAgRU1QVFlfSE9XVE8gKDEpLAotICAgIEVNUFRZX0hPV1RPICgyKSwKLSAgICBFTVBUWV9IT1dUTyAoMyksCi0gICAgRU1QVFlfSE9XVE8gKDQpLAotICAgIEVNUFRZX0hPV1RPICg1KSwKLSAgSE9XVE8oUl9ESVIzMiwJICAgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiZGlyMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgICBFTVBUWV9IT1dUTyAoNyksCi0gICAgRU1QVFlfSE9XVE8gKDAxMCksCi0gICAgRU1QVFlfSE9XVE8gKDAxMSksCi0gICAgRU1QVFlfSE9XVE8gKDAxMiksCi0gICAgRU1QVFlfSE9XVE8gKDAxMyksCi0gICAgRU1QVFlfSE9XVE8gKDAxNCksCi0gICAgRU1QVFlfSE9XVE8gKDAxNSksCi0gICAgRU1QVFlfSE9XVE8gKDAxNiksCi0gIEhPV1RPKFJfUkVMQllURSwJICAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI4IiwJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMV09SRCwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9ORywJICAgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSQllURSwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQOCIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUldPUkQsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDE2IiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AzMiIsICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jICBudW5tYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHsgeC5yX3R5cGUgPSBob3d0by0+dHlwZTsgfQotI2RlZmluZSBCQURNQUcoeCkgV0UzMktCQURNQUcoeCkKLSNkZWZpbmUgV0UzMksJMQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0JICAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgKGRzdCktPnJfdHlwZTsKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSNkZWZpbmUgY29mZl93cml0ZV9hcm1hcCBic2Rfd3JpdGVfYXJtYXAKLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKHdlMzJrY29mZl92ZWMsICJjb2ZmLXdlMzJrIiwgMCwgMCwgMCwgTlVMTCkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXo4ay5jIGIvYmZkL2NvZmYtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjI5YTguLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtejhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBaaWxvZyBaODAwbiBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3o4ay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTMyID0KLUhPV1RPIChSX0lNTTMyLCAwLCAxLCAzMiwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwKLSAgICAgICAweGZmZmZmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tNGwgPQotSE9XVE8gKFJfSU1NNEwsIDAsIDEsIDQsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW00bCIsIHRydWUsIDB4ZiwgMHhmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfZGEgPQotSE9XVE8gKFJfSU1NMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfZGEiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLAotICAgICAgIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW04ID0KLUhPV1RPIChSX0lNTTgsIDAsIDEsIDgsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW04IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwKLSAgICAgICBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfanIgPQotSE9XVE8gKFJfSlIsIDAsIDEsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLSAgICAgICAicl9qciIsIHRydWUsIDAsIDAsIHRydWUpOwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi1zdGF0aWMgaW50IAotY29mZl96OGtfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX3o4a19zZWxlY3RfcmVsb2MoaG93dG8pCi0KLQotI2RlZmluZSBCQURNQUcoeCkgWjhLQkFETUFHKHgpCi0jZGVmaW5lIFo4SyAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLQotCi0vKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICAgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpIFwKLSAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCi0gIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlCi0gICAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKiBpbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU04OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tODsKLSAgICAgIGJyZWFrOwotICAgICBjYXNlIFJfSU1NMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9kYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KUjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2pyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTMyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NNEw6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW00bDsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkIAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKHJlbG9jLT5yX3N5bW5keCA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1leHRyYV9jYXNlIChpbl9hYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKQotICAgICBiZmQgKmluX2FiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9JTU04OgotICAgICAgYmZkX3B1dF84IChpbl9hYmZkLAotCQkgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMTsKLSAgICAgICgqc3JjX3B0cikgKz0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTMyOgotICAgICAgYmZkX3B1dF8zMiAoaW5fYWJmZCwKLQkJICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSAgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gNDsKLSAgICAgICgqc3JjX3B0cikgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTRMOgotICAgICAgYmZkX3B1dF84IChpbl9hYmZkLAotCQkgKChiZmRfZ2V0XzggKGluX2FiZmQsIGRhdGEgKyAqZHN0X3B0cikgJiAweGYwKSAKLQkJICB8ICgweDBmCi0JCSAgICAgJiBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pKSksCi0JCSBkYXRhICsgKmRzdF9wdHIpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSU1NMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkYXRhICsgKmRzdF9wdHIpOwotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSlI6Ci0gICAgICB7Ci0JYmZkX3ZtYSBkc3QgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0Ci0JCSAgICAgICArICpkc3RfcHRyCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOy8qIC0xIHNpbmNlIHdlcmUgaW4gdGhlIG9kZCBieXRlIG9mIHRoZQotCQkJCSAgICB3b3JkIGFuZCB0aGUgcGMncyBiZWVuIGluY3JlbWVudGVkICovCi0KLQlpZiAoZ2FwICYgMSkKLQkgIGFib3J0ICgpOwotCWdhcCAvPSAyOwotCWlmIChnYXAgPiAxMjggfHwgZ2FwIDwgLTEyOCkKLQkgIHsKLQkgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICAgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICAgIGFib3J0ICgpOwotCSAgfQotCWJmZF9wdXRfOCAoaW5fYWJmZCwgZ2FwLCBkYXRhICsgKmRzdF9wdHIpOwotCSgqZHN0X3B0cikrKzsKLQkoKnNyY19wdHIpKys7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZXh0cmFfY2FzZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI3VuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKHo4a2NvZmZfdmVjLCAiY29mZi16OGsiLCAwLCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZmNvZGUuaCBiL2JmZC9jb2ZmY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDIzNjk3Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDk4OSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBtb3N0IENPRkYgdmFyaWFudHMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20KLSovCi0vKgotCi1TRUNUSU9OCi0JY29mZiBiYWNrZW5kcwotCi0JQkZEIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmbGF2b3VycyBvZiBjb2ZmIGZvcm1hdC4KLQlUaGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBmb3JtYXRzIGFyZSB0aGUgc2l6ZXMgYW5kCi0JYWxpZ25tZW50cyBvZiBmaWVsZHMgaW4gc3RydWN0dXJlcyBvbiBkaXNrLCBhbmQgdGhlIG9jY2FzaW9uYWwKLQlleHRyYSBmaWVsZC4KLQotCUNvZmYgaW4gYWxsIGl0cyB2YXJpZXRpZXMgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIGZldyBjb21tb24KLQlmaWxlcyBhbmQgYSBudW1iZXIgb2YgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZmlsZXMuIEZvcgotCWV4YW1wbGUsIFRoZSA4OGsgYmNzIGNvZmYgZm9ybWF0IGlzIGltcGxlbWVudGVkIGluIHRoZSBmaWxlCi0JQGZpbGV7Y29mZi1tODhrLmN9LiBUaGlzIGZpbGUgQGNvZGV7I2luY2x1ZGV9cwotCUBmaWxle2NvZmYvbTg4ay5ofSB3aGljaCBkZWZpbmVzIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmUgb2YgdGhlCi0JY29mZiBmb3JtYXQgZm9yIHRoZSA4OGssIGFuZCBAZmlsZXtjb2ZmL2ludGVybmFsLmh9IHdoaWNoCi0JZGVmaW5lcyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlLiBAZmlsZXtjb2ZmLW04OGsuY30gYWxzbwotCWRlZmluZXMgdGhlIHJlbG9jYXRpb25zIHVzZWQgYnkgdGhlIDg4ayBmb3JtYXQKLQlAeHJlZntSZWxvY2F0aW9uc30uCi0KLQlUaGUgSW50ZWwgaTk2MCBwcm9jZXNzb3IgdmVyc2lvbiBvZiBjb2ZmIGlzIGltcGxlbWVudGVkIGluCi0JQGZpbGV7Y29mZi1pOTYwLmN9LiBUaGlzIGZpbGUgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcwotCUBmaWxle2NvZmYtbTg4ay5jfSwgZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgQGZpbGV7Y29mZi9pOTYwLmh9Ci0JcmF0aGVyIHRoYW4gQGZpbGV7Y29mZi1tODhrLmh9LgotCi1TVUJTRUNUSU9OCi0JUG9ydGluZyB0byBhIG5ldyB2ZXJzaW9uIG9mIGNvZmYKLQotCVRoZSByZWNvbW1lbmRlZCBtZXRob2QgaXMgdG8gc2VsZWN0IGZyb20gdGhlIGV4aXN0aW5nCi0JaW1wbGVtZW50YXRpb25zIHRoZSB2ZXJzaW9uIG9mIGNvZmYgd2hpY2ggaXMgbW9zdCBsaWtlIHRoZSBvbmUKLQl5b3Ugd2FudCB0byB1c2UuICBGb3IgZXhhbXBsZSwgd2UnbGwgc2F5IHRoYXQgaTM4NiBjb2ZmIGlzCi0JdGhlIG9uZSB5b3Ugc2VsZWN0LCBhbmQgdGhhdCB5b3VyIGNvZmYgZmxhdm91ciBpcyBjYWxsZWQgZm9vLgotCUNvcHkgQGZpbGV7aTM4NmNvZmYuY30gdG8gQGZpbGV7Zm9vY29mZi5jfSwgY29weQotCUBmaWxley4uL2luY2x1ZGUvY29mZi9pMzg2Lmh9IHRvIEBmaWxley4uL2luY2x1ZGUvY29mZi9mb28uaH0sCi0JYW5kIGFkZCB0aGUgbGluZXMgdG8gQGZpbGV7dGFyZ2V0cy5jfSBhbmQgQGZpbGV7TWFrZWZpbGUuaW59Ci0Jc28gdGhhdCB5b3VyIG5ldyBiYWNrIGVuZCBpcyB1c2VkLiBBbHRlciB0aGUgc2hhcGVzIG9mIHRoZQotCXN0cnVjdHVyZXMgaW4gQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2Zvby5ofSBzbyB0aGF0IHRoZXkgbWF0Y2gKLQl3aGF0IHlvdSBuZWVkLiBZb3Ugd2lsbCBwcm9iYWJseSBhbHNvIGhhdmUgdG8gYWRkCi0JQGNvZGV7I2lmZGVmfXMgdG8gdGhlIGNvZGUgaW4gQGZpbGV7Y29mZi9pbnRlcm5hbC5ofSBhbmQKLQlAZmlsZXtjb2ZmY29kZS5ofSBpZiB5b3VyIHZlcnNpb24gb2YgY29mZiBpcyB0b28gd2lsZC4KLQotCVlvdSBjYW4gdmVyaWZ5IHRoYXQgeW91ciBuZXcgQkZEIGJhY2tlbmQgd29ya3MgcXVpdGUgc2ltcGx5IGJ5Ci0JYnVpbGRpbmcgQGZpbGV7b2JqZHVtcH0gZnJvbSB0aGUgQGZpbGV7YmludXRpbHN9IGRpcmVjdG9yeSwKLQlhbmQgbWFraW5nIHN1cmUgdGhhdCBpdHMgdmVyc2lvbiBvZiB3aGF0J3MgZ29pbmcgb24gYW5kIHlvdXIKLQlob3N0IHN5c3RlbSdzIGlkZWEgKGFzc3VtaW5nIGl0IGhhcyB0aGUgcHJldHR5IHN0YW5kYXJkIGNvZmYKLQlkdW1wIHV0aWxpdHksIHVzdWFsbHkgY2FsbGVkIEBjb2Rle2F0dC1kdW1wfSBvciBqdXN0Ci0JQGNvZGV7ZHVtcH0pIGFyZSB0aGUgc2FtZS4gIFRoZW4gY2xlYW4gdXAgeW91ciBjb2RlLCBhbmQgc2VuZAotCXdoYXQgeW91J3ZlIGRvbmUgdG8gQ3lnbnVzLiBUaGVuIHlvdXIgc3R1ZmYgd2lsbCBiZSBpbiB0aGUKLQluZXh0IHJlbGVhc2UsIGFuZCB5b3Ugd29uJ3QgaGF2ZSB0byBrZWVwIGludGVncmF0aW5nIGl0LgotCi1TVUJTRUNUSU9OCi0JSG93IHRoZSBjb2ZmIGJhY2tlbmQgd29ya3MKLQotU1VCU1VCU0VDVElPTgotCUZpbGUgbGF5b3V0Ci0KLQlUaGUgQ29mZiBiYWNrZW5kIGlzIHNwbGl0IGludG8gZ2VuZXJpYyByb3V0aW5lcyB0aGF0IGFyZQotCWFwcGxpY2FibGUgdG8gYW55IENvZmYgdGFyZ2V0IGFuZCByb3V0aW5lcyB0aGF0IGFyZSBzcGVjaWZpYwotCXRvIGEgcGFydGljdWxhciB0YXJnZXQuICBUaGUgdGFyZ2V0LXNwZWNpZmljIHJvdXRpbmVzIGFyZQotCWZ1cnRoZXIgc3BsaXQgaW50byBvbmVzIHdoaWNoIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgZm9yIGFsbAotCUNvZmYgdGFyZ2V0cyBleGNlcHQgdGhhdCB0aGV5IHVzZSB0aGUgZXh0ZXJuYWwgc3ltYm9sIGZvcm1hdAotCW9yIHVzZSBkaWZmZXJlbnQgdmFsdWVzIGZvciBjZXJ0YWluIGNvbnN0YW50cy4KLQotCVRoZSBnZW5lcmljIHJvdXRpbmVzIGFyZSBpbiBAZmlsZXtjb2ZmZ2VuLmN9LiAgVGhlc2Ugcm91dGluZXMKLQl3b3JrIGZvciBhbnkgQ29mZiB0YXJnZXQuICBUaGV5IHVzZSBzb21lIGhvb2tzIGludG8gdGhlIHRhcmdldAotCXNwZWNpZmljIGNvZGU7IHRoZSBob29rcyBhcmUgaW4gYSBAY29kZXtiZmRfY29mZl9iYWNrZW5kX2RhdGF9Ci0Jc3RydWN0dXJlLCBvbmUgb2Ygd2hpY2ggZXhpc3RzIGZvciBlYWNoIHRhcmdldC4KLQotCVRoZSBlc3NlbnRpYWxseSBzaW1pbGFyIHRhcmdldC1zcGVjaWZpYyByb3V0aW5lcyBhcmUgaW4KLQlAZmlsZXtjb2ZmY29kZS5ofS4gIFRoaXMgaGVhZGVyIGZpbGUgaW5jbHVkZXMgZXhlY3V0YWJsZSBDIGNvZGUuCi0JVGhlIHZhcmlvdXMgQ29mZiB0YXJnZXRzIGZpcnN0IGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIENvZmYKLQloZWFkZXIgZmlsZSwgbWFrZSBhbnkgc3BlY2lhbCBkZWZpbmVzIHRoYXQgYXJlIG5lZWRlZCwgYW5kCi0JdGhlbiBpbmNsdWRlIEBmaWxle2NvZmZjb2RlLmh9LgotCi0JU29tZSBvZiB0aGUgQ29mZiB0YXJnZXRzIHRoZW4gYWxzbyBoYXZlIGFkZGl0aW9uYWwgcm91dGluZXMgaW4KLQl0aGUgdGFyZ2V0IHNvdXJjZSBmaWxlIGl0c2VsZi4KLQotCUZvciBleGFtcGxlLCBAZmlsZXtjb2ZmLWk5NjAuY30gaW5jbHVkZXMKLQlAZmlsZXtjb2ZmL2ludGVybmFsLmh9IGFuZCBAZmlsZXtjb2ZmL2k5NjAuaH0uICBJdCB0aGVuCi0JZGVmaW5lcyBhIGZldyBjb25zdGFudHMsIHN1Y2ggYXMgQGNvZGV7STk2MH0sIGFuZCBpbmNsdWRlcwotCUBmaWxle2NvZmZjb2RlLmh9LiAgU2luY2UgdGhlIGk5NjAgaGFzIGNvbXBsZXggcmVsb2NhdGlvbgotCXR5cGVzLCBAZmlsZXtjb2ZmLWk5NjAuY30gYWxzbyBpbmNsdWRlcyBzb21lIGNvZGUgdG8KLQltYW5pcHVsYXRlIHRoZSBpOTYwIHJlbG9jcy4gIFRoaXMgY29kZSBpcyBub3QgaW4KLQlAZmlsZXtjb2ZmY29kZS5ofSBiZWNhdXNlIGl0IHdvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlcgotCXRhcmdldC4KLQotU1VCU1VCU0VDVElPTgotCUJpdCB0d2lkZGxpbmcKLQotCUVhY2ggZmxhdm91ciBvZiBjb2ZmIHN1cHBvcnRlZCBpbiBCRkQgaGFzIGl0cyBvd24gaGVhZGVyIGZpbGUKLQlkZXNjcmliaW5nIHRoZSBleHRlcm5hbCBsYXlvdXQgb2YgdGhlIHN0cnVjdHVyZXMuIFRoZXJlIGlzIGFsc28KLQlhbiBpbnRlcm5hbCBkZXNjcmlwdGlvbiBvZiB0aGUgY29mZiBsYXlvdXQsIGluCi0JQGZpbGV7Y29mZi9pbnRlcm5hbC5ofS4gQSBtYWpvciBmdW5jdGlvbiBvZiB0aGUKLQljb2ZmIGJhY2tlbmQgaXMgc3dhcHBpbmcgdGhlIGJ5dGVzIGFuZCB0d2lkZGxpbmcgdGhlIGJpdHMgdG8KLQl0cmFuc2xhdGUgdGhlIGV4dGVybmFsIGZvcm0gb2YgdGhlIHN0cnVjdHVyZXMgaW50byB0aGUgbm9ybWFsCi0JaW50ZXJuYWwgZm9ybS4gVGhpcyBpcyBhbGwgcGVyZm9ybWVkIGluIHRoZQotCUBjb2Rle2JmZF9zd2FwfV9AaXt0aGluZ31fQGl7ZGlyZWN0aW9ufSByb3V0aW5lcy4gU29tZQotCWVsZW1lbnRzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKLQljb2ZmOyBpdCBpcyB0aGUgZHV0eSBvZiB0aGUgY29mZiB2ZXJzaW9uIHNwZWNpZmljIGluY2x1ZGUgZmlsZQotCXRvIG92ZXJyaWRlIHRoZSBkZWZpbml0aW9ucyBvZiB2YXJpb3VzIHBhY2tpbmcgcm91dGluZXMgaW4KLQlAZmlsZXtjb2ZmY29kZS5ofS4gRS5nLiwgdGhlIHNpemUgb2YgbGluZSBudW1iZXIgZW50cnkgaW4gY29mZiBpcwotCXNvbWV0aW1lcyAxNiBiaXRzLCBhbmQgc29tZXRpbWVzIDMyIGJpdHMuIEBjb2RleyNkZWZpbmV9aW5nCi0JQGNvZGV7UFVUX0xOU1pfTE5OT30gYW5kIEBjb2Rle0dFVF9MTlNaX0xOTk99IHdpbGwgc2VsZWN0IHRoZQotCWNvcnJlY3Qgb25lLiBObyBkb3VidCwgc29tZSBkYXkgc29tZW9uZSB3aWxsIGZpbmQgYSB2ZXJzaW9uIG9mCi0JY29mZiB3aGljaCBoYXMgYSB2YXJ5aW5nIGZpZWxkIHNpemUgbm90IGNhdGVyZWQgdG8gYXQgdGhlCi0JbW9tZW50LiBUbyBwb3J0IEJGRCwgdGhhdCBwZXJzb24gd2lsbCBoYXZlIHRvIGFkZCBtb3JlIEBjb2RleyNkZWZpbmVzfS4KLQlUaHJlZSBvZiB0aGUgYml0IHR3aWRkbGluZyByb3V0aW5lcyBhcmUgZXhwb3J0ZWQgdG8KLQlAY29kZXtnZGJ9OyBAY29kZXtjb2ZmX3N3YXBfYXV4X2lufSwgQGNvZGV7Y29mZl9zd2FwX3N5bV9pbn0KLQlhbmQgQGNvZGV7Y29mZl9zd2FwX2xpbmVub19pbn0uIEBjb2Rle0dEQn0gcmVhZHMgdGhlIHN5bWJvbAotCXRhYmxlIG9uIGl0cyBvd24sIGJ1dCB1c2VzIEJGRCB0byBmaXggdGhpbmdzIHVwLiAgTW9yZSBvZiB0aGUKLQliaXQgdHdpZGRsZXJzIGFyZSBleHBvcnRlZCBmb3IgQGNvZGV7Z2FzfTsKLQlAY29kZXtjb2ZmX3N3YXBfYXV4X291dH0sIEBjb2Rle2NvZmZfc3dhcF9zeW1fb3V0fSwKLQlAY29kZXtjb2ZmX3N3YXBfbGluZW5vX291dH0sIEBjb2Rle2NvZmZfc3dhcF9yZWxvY19vdXR9LAotCUBjb2Rle2NvZmZfc3dhcF9maWxlaGRyX291dH0sIEBjb2Rle2NvZmZfc3dhcF9hb3V0aGRyX291dH0sCi0JQGNvZGV7Y29mZl9zd2FwX3Njbmhkcl9vdXR9LiBAY29kZXtHYXN9IGN1cnJlbnRseSBrZWVwcyB0cmFjawotCW9mIGFsbCB0aGUgc3ltYm9sIHRhYmxlIGFuZCByZWxvYyBkcnVkZ2VyeSBpdHNlbGYsIHRoZXJlYnkKLQlzYXZpbmcgdGhlIGludGVybmFsIEJGRCBvdmVyaGVhZCwgYnV0IHVzZXMgQkZEIHRvIHN3YXAgdGhpbmdzCi0Jb24gdGhlIHdheSBvdXQsIG1ha2luZyBjcm9zcyBwb3J0cyBtdWNoIHNhZmVyLiAgRG9pbmcgc28gYWxzbwotCWFsbG93cyBCRkQgKGFuZCB0aHVzIHRoZSBsaW5rZXIpIHRvIHVzZSB0aGUgc2FtZSBoZWFkZXIgZmlsZXMKLQlhcyBAY29kZXtnYXN9LCB3aGljaCBtYWtlcyBvbmUgYXZlbnVlIHRvIGRpc2FzdGVyIGRpc2FwcGVhci4KLQotU1VCU1VCU0VDVElPTgotCVN5bWJvbCByZWFkaW5nCi0KLQlUaGUgc2ltcGxlIGNhbm9uaWNhbCBmb3JtIGZvciBzeW1ib2xzIHVzZWQgYnkgQkZEIGlzIG5vdCByaWNoCi0JZW5vdWdoIHRvIGtlZXAgYWxsIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gYSBjb2ZmIHN5bWJvbAotCXRhYmxlLiBUaGUgYmFjayBlbmQgZ2V0cyBhcm91bmQgdGhpcyBwcm9ibGVtIGJ5IGtlZXBpbmcgdGhlIG9yaWdpbmFsCi0Jc3ltYm9sIHRhYmxlIGFyb3VuZCwgImJlaGluZCB0aGUgc2NlbmVzIi4KLQotCVdoZW4gYSBzeW1ib2wgdGFibGUgaXMgcmVxdWVzdGVkICh0aHJvdWdoIGEgY2FsbCB0bwotCUBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifSksIGEgcmVxdWVzdCBnZXRzIHRocm91Z2ggdG8KLQlAY29kZXtjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYn0uIFRoaXMgcmVhZHMgdGhlIHN5bWJvbCB0YWJsZSBmcm9tCi0JdGhlIGNvZmYgZmlsZSBhbmQgc3dhcHMgYWxsIHRoZSBzdHJ1Y3R1cmVzIGluc2lkZSBpbnRvIHRoZQotCWludGVybmFsIGZvcm0uIEl0IGFsc28gZml4ZXMgdXAgYWxsIHRoZSBwb2ludGVycyBpbiB0aGUgdGFibGUKLQkocmVwcmVzZW50ZWQgaW4gdGhlIGZpbGUgYnkgb2Zmc2V0cyBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgaW4KLQl0aGUgdGFibGUpIGludG8gcGh5c2ljYWwgcG9pbnRlcnMgdG8gZWxlbWVudHMgaW4gdGhlIG5ldwotCWludGVybmFsIHRhYmxlLiBUaGlzIGludm9sdmVzIHNvbWUgd29yayBzaW5jZSB0aGUgbWVhbmluZ3Mgb2YKLQlmaWVsZHMgY2hhbmdlIGRlcGVuZGluZyB1cG9uIGNvbnRleHQ6IGEgZmllbGQgdGhhdCBpcyBhCi0JcG9pbnRlciB0byBhbm90aGVyIHN0cnVjdHVyZSBpbiB0aGUgc3ltYm9sIHRhYmxlIGF0IG9uZSBtb21lbnQKLQltYXkgYmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBzdHJ1Y3R1cmUgYXQgdGhlIG5leHQuICBBbm90aGVyCi0JcGFzcyBpcyBtYWRlIG92ZXIgdGhlIHRhYmxlLiBBbGwgc3ltYm9scyB3aGljaCBtYXJrIGZpbGUgbmFtZXMKLQkoPDxDX0ZJTEU+PiBzeW1ib2xzKSBhcmUgbW9kaWZpZWQgc28gdGhhdCB0aGUgaW50ZXJuYWwKLQlzdHJpbmcgcG9pbnRzIHRvIHRoZSB2YWx1ZSBpbiB0aGUgYXV4ZW50ICh0aGUgcmVhbCBmaWxlbmFtZSkKLQlyYXRoZXIgdGhhbiB0aGUgbm9ybWFsIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wKLQkoQGNvZGV7Ii5maWxlIn0pLgotCi0JQXQgdGhpcyB0aW1lIHRoZSBzeW1ib2wgbmFtZXMgYXJlIG1vdmVkIGFyb3VuZC4gQ29mZiBzdG9yZXMKLQlhbGwgc3ltYm9scyBsZXNzIHRoYW4gbmluZSBjaGFyYWN0ZXJzIGxvbmcgcGh5c2ljYWxseQotCXdpdGhpbiB0aGUgc3ltYm9sIHRhYmxlOyBsb25nZXIgc3RyaW5ncyBhcmUga2VwdCBhdCB0aGUgZW5kIG9mCi0JdGhlIGZpbGUgaW4gdGhlIHN0cmluZyAJdGFibGUuIFRoaXMgcGFzcyBtb3ZlcyBhbGwgc3RyaW5ncwotCWludG8gbWVtb3J5IGFuZCByZXBsYWNlcyB0aGVtIHdpdGggcG9pbnRlcnMgdG8gdGhlIHN0cmluZ3MuCi0KLQotCVRoZSBzeW1ib2wgdGFibGUgaXMgbWFzc2FnZWQgb25jZSBhZ2FpbiwgdGhpcyB0aW1lIHRvIGNyZWF0ZQotCXRoZSBjYW5vbmljYWwgdGFibGUgdXNlZCBieSB0aGUgQkZEIGFwcGxpY2F0aW9uLiBFYWNoIHN5bWJvbAotCWlzIGluc3BlY3RlZCBpbiB0dXJuLCBhbmQgYSBkZWNpc2lvbiBtYWRlICh1c2luZyB0aGUKLQlAY29kZXtzY2xhc3N9IGZpZWxkKSBhYm91dCB0aGUgdmFyaW91cyBmbGFncyB0byBzZXQgaW4gdGhlCi0JQGNvZGV7YXN5bWJvbH0uICBAeHJlZntTeW1ib2xzfS4gVGhlIGdlbmVyYXRlZCBjYW5vbmljYWwgdGFibGUKLQlzaGFyZXMgc3RyaW5ncyB3aXRoIHRoZSBoaWRkZW4gaW50ZXJuYWwgc3ltYm9sIHRhYmxlLgotCi0JQW55IGxpbmVudW1iZXJzIGFyZSByZWFkIGZyb20gdGhlIGNvZmYgZmlsZSB0b28sIGFuZCBhdHRhY2hlZAotCXRvIHRoZSBzeW1ib2xzIHdoaWNoIG93biB0aGUgZnVuY3Rpb25zIHRoZSBsaW5lbnVtYmVycyBiZWxvbmcgdG8uCi0KLVNVQlNVQlNFQ1RJT04KLQlTeW1ib2wgd3JpdGluZwotCi0JV3JpdGluZyBhIHN5bWJvbCB0byBhIGNvZmYgZmlsZSB3aGljaCBkaWRuJ3QgY29tZSBmcm9tIGEgY29mZgotCWZpbGUgd2lsbCBsb3NlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoZSBAY29kZXthc3ltYm9sfQotCXN0cnVjdHVyZSByZW1lbWJlcnMgdGhlIEJGRCBmcm9tIHdoaWNoIHRoZSBzeW1ib2wgd2FzIHRha2VuLCBhbmQgb24KLQlvdXRwdXQgdGhlIGJhY2sgZW5kIG1ha2VzIHN1cmUgdGhhdCB0aGUgc2FtZSBkZXN0aW5hdGlvbiB0YXJnZXQgYXMKLQlzb3VyY2UgdGFyZ2V0IGlzIHByZXNlbnQuCi0KLQlXaGVuIHRoZSBzeW1ib2xzIGhhdmUgY29tZSBmcm9tIGEgY29mZiBmaWxlIHRoZW4gYWxsIHRoZQotCWRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcmVzZXJ2ZWQuCi0KLQlTeW1ib2wgdGFibGVzIGFyZSBwcm92aWRlZCBmb3Igd3JpdGluZyB0byB0aGUgYmFjayBlbmQgaW4gYQotCXZlY3RvciBvZiBwb2ludGVycyB0byBwb2ludGVycy4gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIGxpa2UKLQl0aGUgbGlua2VyIHRvIGFjY3VtdWxhdGUgYW5kIG91dHB1dCBsYXJnZSBzeW1ib2wgdGFibGVzCi0Jd2l0aG91dCBoYXZpbmcgdG8gZG8gdG9vIG11Y2ggYnl0ZSBjb3B5aW5nLgotCi0JVGhpcyBmdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIHByb3ZpZGVkIHN5bWJvbCB0YWJsZSBhbmQKLQlwYXRjaGVzIGVhY2ggc3ltYm9sIG1hcmtlZCBhcyBhIGZpbGUgcGxhY2UgaG9sZGVyCi0JKEBjb2Rle0NfRklMRX0pIHRvIHBvaW50IHRvIHRoZSBuZXh0IGZpbGUgcGxhY2UgaG9sZGVyIGluIHRoZQotCWxpc3QuIEl0IGFsc28gbWFya3MgZWFjaCBAY29kZXtvZmZzZXR9IGZpZWxkIGluIHRoZSBsaXN0IHdpdGgKLQl0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IHN5bWJvbCBvZiB0aGUgY3VycmVudCBzeW1ib2wuCi0KLQlBbm90aGVyIGZ1bmN0aW9uIG9mIHRoaXMgcHJvY2VkdXJlIGlzIHRvIHR1cm4gdGhlIGNhbm9uaWNhbAotCXZhbHVlIGZvcm0gb2YgQkZEIGludG8gdGhlIGZvcm0gdXNlZCBieSBjb2ZmLiBJbnRlcm5hbGx5LCBCRkQKLQlleHBlY3RzIHN5bWJvbCB2YWx1ZXMgdG8gYmUgb2Zmc2V0cyBmcm9tIGEgc2VjdGlvbiBiYXNlOyBzbyBhCi0Jc3ltYm9sIHBoeXNpY2FsbHkgYXQgMHgxMjAsIGJ1dCBpbiBhIHNlY3Rpb24gc3RhcnRpbmcgYXQKLQkweDEwMCwgd291bGQgaGF2ZSB0aGUgdmFsdWUgMHgyMC4gQ29mZiBleHBlY3RzIHN5bWJvbHMgdG8KLQljb250YWluIHRoZWlyIGZpbmFsIHZhbHVlLCBzbyBzeW1ib2xzIGhhdmUgdGhlaXIgdmFsdWVzCi0JY2hhbmdlZCBhdCB0aGlzIHBvaW50IHRvIHJlZmxlY3QgdGhlaXIgc3VtIHdpdGggdGhlaXIgb3duaW5nCi0Jc2VjdGlvbi4gIFRoaXMgdHJhbnNmb3JtYXRpb24gdXNlcyB0aGUKLQk8PG91dHB1dF9zZWN0aW9uPj4gZmllbGQgb2YgdGhlIEBjb2Rle2FzeW1ib2x9J3MKLQlAY29kZXthc2VjdGlvbn0gQHhyZWZ7U2VjdGlvbnN9LgotCi0JbyA8PGNvZmZfbWFuZ2xlX3N5bWJvbHM+PgotCi0JVGhpcyByb3V0aW5lIHJ1bnMgdGhvdWdoIHRoZSBwcm92aWRlZCBzeW1ib2wgdGFibGUgYW5kIHVzZXMKLQl0aGUgb2Zmc2V0cyBnZW5lcmF0ZWQgYnkgdGhlIHByZXZpb3VzIHBhc3MgYW5kIHRoZSBwb2ludGVycwotCWdlbmVyYXRlZCB3aGVuIHRoZSBzeW1ib2wgdGFibGUgd2FzIHJlYWQgaW4gdG8gY3JlYXRlIHRoZQotCXN0cnVjdHVyZWQgaGllcmFjaHkgcmVxdWlyZWQgYnkgY29mZi4gSXQgY2hhbmdlcyBlYWNoIHBvaW50ZXIKLQl0byBhIHN5bWJvbCBpbnRvIHRoZSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIGFzeW1ib2wuCi0KLQlvIDw8Y29mZl93cml0ZV9zeW1ib2xzPj4KLQotCVRoaXMgcm91dGluZSBydW5zIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhbmQgcGF0Y2hlcyB1cCB0aGUKLQlzeW1ib2xzIGZyb20gdGhlaXIgaW50ZXJuYWwgZm9ybSBpbnRvIHRoZSBjb2ZmIHdheSwgY2FsbHMgdGhlCi0JYml0IHR3aWRkbGVycywgYW5kIHdyaXRlcyBvdXQgdGhlIHRhYmxlIHRvIHRoZSBmaWxlLgotCi0qLwotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWNvZmZfc3ltYm9sX3R5cGUKLQotREVTQ1JJUFRJT04KLQlUaGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciBhbiA8PGFzeW1ib2w+PiBpcyBkZXNjcmliZWQgaW4gYQotCTw8Y29tYmluZWRfZW50cnlfdHlwZT4+OgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0Ci0uewotLgotLiAgICAgICB7KiBSZW1lbWJlcnMgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIGZpbGUgZm9yCi0uICAgICAgICAgIHRoaXMgc3ltYm9sLiBHZW5lcmF0ZWQgYnkgY29mZl9yZW51bWJlcl9zeW1ib2xzLiAqfQotLnVuc2lnbmVkIGludCBvZmZzZXQ7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4gIFVzZWQgZm9yCi0uICAgICAgICAgIFhDT0ZGIENfQlNUQVQgc3ltYm9scy4gIFNldCBieSBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICp9Ci0udW5zaWduZWQgaW50IGZpeF92YWx1ZSA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgdGFnIGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0uICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKn0KLS51bnNpZ25lZCBpbnQgZml4X3RhZyA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgZW5kaWR4IGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0uICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKn0KLS51bnNpZ25lZCBpbnQgZml4X2VuZCA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgeF9jc2VjdC54X3NjbmxlbiBmaWVsZCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF9zY25sZW4gOiAxOwotLgotLiAgICAgICB7KiBGaXggdXAgYW4gWENPRkYgQ19CSU5DTC9DX0VJTkNMIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUKLS4gICAgICAgICAgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIFNldCBieQotLiAgICAgICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICp9Ci0udW5zaWduZWQgaW50IGZpeF9saW5lIDogMTsKLS4KLS4gICAgICAgeyogVGhlIGNvbnRhaW5lciBmb3IgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgcmVhZCBhbmQgdHJhbnNsYXRlZAotLiAgICAgICAgICAgZnJvbSB0aGUgZmlsZS4gKn0KLS4KLS51bmlvbiB7Ci0uICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eGVudDsKLS4gICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLS4gfSB1OwotLn0gY29tYmluZWRfZW50cnlfdHlwZTsKLS4KLS4KLS57KiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXM6ICp9Ci0uCi0udHlwZWRlZiBzdHJ1Y3QgY29mZl9zeW1ib2xfc3RydWN0Ci0uewotLiAgIHsqIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICp9Ci0uYXN5bWJvbCBzeW1ib2w7Ci0uCi0uICAgeyogQSBwb2ludGVyIHRvIHRoZSBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICp9Ci0uY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotLgotLiAgIHsqIEEgcG9pbnRlciB0byB0aGUgbGluZW51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKn0KLS5zdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsaW5lbm87Ci0uCi0uICAgeyogSGF2ZSB0aGUgbGluZSBudW1iZXJzIGJlZW4gcmVsb2NhdGVkIHlldCA/ICp9Ci0uYm9vbGVhbiBkb25lX2xpbmVubzsKLS59IGNvZmZfc3ltYm9sX3R5cGU7Ci0KLQotKi8KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2luY2x1ZGUgInBlaWNvZGUuaCIKLSNlbHNlCi0jaW5jbHVkZSAiY29mZnN3YXAuaCIKLSNlbmRpZgotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLXN0YXRpYyBsb25nIHNlY190b19zdHlwX2ZsYWdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBmbGFnd29yZCBzdHlwX3RvX3NlY19mbGFncwotICBQQVJBTVMgKChiZmQgKiwgUFRSLCBjb25zdCBjaGFyICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2N1c3RvbV9zZWN0aW9uX2FsaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgY29uc3Qgc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkgKiwKLQkgICBjb25zdCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBzaG9ydCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgUFRSIGJ1eV9hbmRfcmVhZCBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGludCwgc2l6ZV90KSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX2xpbmVfdGFibGUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjb2ZmX2NsYXNzaWZ5X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgbG9uZyBjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotI2lmbmRlZiBjb2ZmX21rb2JqZWN0X2hvb2sKLXN0YXRpYyBQVFIgY29mZl9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIsICBQVFIpKTsKLSNlbmRpZgotDAotLyogdm9pZCB3YXJuaW5nKCk7ICovCi0KLS8qIFJldHVybiBhIHdvcmQgd2l0aCBTVFlQXyogKHNjbmhkci5zX2ZsYWdzKSBmbGFncyBzZXQgdG8gcmVwcmVzZW50Ci0gICB0aGUgaW5jb21pbmcgU0VDXyogZmxhZ3MuICBUaGUgaW52ZXJzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzCi0gICBzdHlwX3RvX3NlY19mbGFncygpLiAgTk9URTogSWYgeW91IGFkZCB0by9jaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3UKLSAgIHNob3VsZCBwcm9iYWJseSBtaXJyb3IgdGhlIGNoYW5nZXMgaW4gc3R5cF90b19zZWNfZmxhZ3MoKS4gICovCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0KLXN0YXRpYyBsb25nCi1zZWNfdG9fc3R5cF9mbGFncyAoc2VjX25hbWUsIHNlY19mbGFncykKLSAgICAgQ09OU1QgY2hhciAqc2VjX25hbWU7Ci0gICAgIGZsYWd3b3JkIHNlY19mbGFnczsKLXsKLSAgbG9uZyBzdHlwX2ZsYWdzID0gMDsKLQotICBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9URVhUKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9URVhUOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9EQVRBKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9CU1MpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0JTUzsKLSNpZmRlZiBfQ09NTUVOVAotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9DT01NRU5UKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotI2VuZGlmIC8qIF9DT01NRU5UICovCi0jaWZkZWYgX0xJQgotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MSUIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xJQjsKLSNlbmRpZiAvKiBfTElCICovCi0jaWZkZWYgX0xJVAotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MSVQpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xJVDsKLSNlbmRpZiAvKiBfTElUICovCi0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgIi5kZWJ1ZyIpKQotICAgIHsKLSNpZmRlZiBTVFlQX0RFQlVHCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9ERUJVRzsKLSNlbHNlCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmICghc3RybmNtcCAoc2VjX25hbWUsICIuc3RhYiIsIDUpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0lORk87Ci0gICAgfQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX1BBRCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfUEFEOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MT0FERVIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xPQURFUjsKLSAgICB9Ci0jZW5kaWYKLSAgLyogVHJ5IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQgc2hvdWxkIGJlICovCi0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19DT0RFKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfREFUQSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX1JFQURPTkxZKQotICAgIHsKLSNpZmRlZiBTVFlQX0xJVAkJCS8qIDI5ayByZWFkb25seSB0ZXh0L2RhdGEgc2VjdGlvbiAqLwotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElUOwotI2Vsc2UKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19MT0FEKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfQUxMT0MpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfQlNTOwotICAgIH0KLQotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmICgoc2VjX2ZsYWdzICYgKFNFQ19ORVZFUl9MT0FEIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLQotICByZXR1cm4gc3R5cF9mbGFnczsKLX0KLQotI2Vsc2UgLyogQ09GRl9XSVRIX1BFICovCi0KLS8qIFRoZSBQRSB2ZXJzaW9uOyBzZWUgYWJvdmUgZm9yIHRoZSBnZW5lcmFsIGNvbW1lbnRzLiAgVGhlIG5vbi1QRQotICAgY2FzZSBzZWVtcyB0byBiZSBtb3JlIGd1ZXNzaW5nLCBhbmQgYnJlYWtzIFBFIGZvcm1hdDsgc3BlY2lmaWNhbGx5LAotICAgLnJkYXRhIGlzIHJlYWRvbmx5LCBidXQgaXQgc3VyZSBhaW4ndCB0ZXh0LiAgUmVhbGx5LCBhbGwgdGhpcwotICAgc2hvdWxkIGJlIHNldCB1cCBwcm9wZXJseSBpbiBnYXMgKG9yIHdoYXRldmVyIGFzc2VtYmxlciBpcyBpbiB1c2UpLAotICAgYW5kIGhvbm9yIHdoYXRldmVyIG9iamNvcHkvc3RyaXAsIGV0Yy4gc2VudCB1cyBhcyBpbnB1dC4gICovCi0KLXN0YXRpYyBsb25nCi1zZWNfdG9fc3R5cF9mbGFncyAoc2VjX25hbWUsIHNlY19mbGFncykKLSAgICAgY29uc3QgY2hhciAqc2VjX25hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgc2VjX2ZsYWdzOwotewotICBsb25nIHN0eXBfZmxhZ3MgPSAwOwotCi0gIC8qIGNhdXRpb246IHRoZXJlIGFyZSBhdCBsZWFzdCB0aHJlZSBncm91cHMgb2Ygc3ltYm9scyB0aGF0IGhhdmUKLSAgICAgdmVyeSBzaW1pbGFyIGJpdHMgYW5kIG1lYW5pbmdzOiBJTUFHRV9TQ04qLCBTRUNfKiwgYW5kIFNUWVBfKi4KLSAgICAgU0VDXyogYXJlIHRoZSBCRkQgaW50ZXJuYWwgZmxhZ3MsIHVzZWQgZm9yIGdlbmVyaWMgQkZECi0gICAgIGluZm9ybWF0aW9uLiAgU1RZUF8qIGFyZSB0aGUgQ09GRiBzZWN0aW9uIGZsYWdzIHdoaWNoIGFwcGVhciBpbgotICAgICBDT0ZGIGZpbGVzLiAgSU1BR0VfU0NOXyogYXJlIHRoZSBQRSBzZWN0aW9uIGZsYWdzIHdoaWNoIGFwcGVhciBpbgotICAgICBQRSBmaWxlcy4gIFRoZSBTVFlQXyogZmxhZ3MgYW5kIHRoZSBJTUFHRV9TQ05fKiBmbGFncyBvdmVybGFwLAotICAgICBidXQgdGhlcmUgYXJlIG1vcmUgSU1BR0VfU0NOXyogZmxhZ3MuICAqLwotCi0gIC8qIHNraXAgTE9BRCAqLwotICAvKiBSRUFET05MWSBsYXRlciAqLwotICAvKiBza2lwIFJFTE9DICovCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0NPREUpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fQ05UX0NPREU7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0RBVEEpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEE7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0FMTE9DKSAhPSAwICYmIChzZWNfZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBOyAgLyogPT1TVFlQX0JTUyAqLwotICAvKiBza2lwIFJPTSAqLwotICAvKiBza2lwIENPTlNUUlVDVE9SICovCi0gIC8qIHNraXAgQ09OVEVOVFMgKi8KLSNpZmRlZiBTVFlQX05PTE9BRAotICBpZiAoKHNlY19mbGFncyAmIChTRUNfTkVWRVJfTE9BRCB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSkgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IFNUWVBfTk9MT0FEOwotI2VuZGlmCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0lTX0NPTU1PTikgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOwotICBpZiAoKHNlY19mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFOwotICBpZiAoKHNlY19mbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19SRU1PVkU7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTE5LX1JFTU9WRTsKLSAgLyogc2tpcCBJTl9NRU1PUlkgKi8KLSAgLyogc2tpcCBTT1JUICovCi0gIGlmIChzZWNfZmxhZ3MgJiBTRUNfTElOS19PTkNFKSAKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOyAKLSAgLyogc2tpcCBMSU5LX0RVUExJQ0FURVMgKi8KLSAgLyogc2tpcCBMSU5LRVJfQ1JFQVRFRCAqLwotCi0gIC8qIEZvciBub3csIHRoZSByZWFkL3dyaXRlIGJpdHMgYXJlIG1hcHBlZCBvbnRvIFNFQ19SRUFET05MWSwgZXZlbgotICAgICB0aG91Z2ggdGhlIHNlbWFudGljcyBkb24ndCBxdWl0ZSBtYXRjaC4gIFRoZSBiaXRzIGZyb20gdGhlIGlucHV0Ci0gICAgIGFyZSByZXRhaW5lZCBpbiBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncyAqLwotCi0gIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9SRUFEOyAgICAgICAvKiBhbHdheXMgcmVhZGFibGUuICovCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9XUklURTsgICAgLyogSW52ZXJ0IFJFQURPTkxZIGZvciB3cml0ZSAqLwotICBpZiAoc2VjX2ZsYWdzICYgU0VDX0NPREUpCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX0VYRUNVVEU7ICAvKiBDT0RFLT5FWEVDVVRFICovCi0gIGlmIChzZWNfZmxhZ3MgJiBTRUNfU0hBUkVEKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9TSEFSRUQ7ICAgLyogU2hhcmVkIHJlbWFpbnMgbWVhbmluZ2Z1bCAqLwotCi0gIHJldHVybiBzdHlwX2ZsYWdzOyAKLX0KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBSZXR1cm4gYSB3b3JkIHdpdGggU0VDXyogZmxhZ3Mgc2V0IHRvIHJlcHJlc2VudCB0aGUgaW5jb21pbmcgU1RZUF8qCi0gICBmbGFncyAoZnJvbSBzY25oZHIuc19mbGFncykuICBUaGUgaW52ZXJzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzCi0gICBzZWNfdG9fc3R5cF9mbGFncygpLiAgTk9URTogSWYgeW91IGFkZCB0by9jaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3UKLSAgIHNob3VsZCBwcm9iYWJseSBtaXJyb3IgdGhlIGNoYW5nZXMgaW4gc2VjX3RvX3N0eXBfZmxhZ3MoKS4gICovCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0KLXN0YXRpYyBmbGFnd29yZAotc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmludGVybmFsX3MgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBoZHI7Ci0gIGxvbmcgc3R5cF9mbGFncyA9IGludGVybmFsX3MtPnNfZmxhZ3M7Ci0gIGZsYWd3b3JkIHNlY19mbGFncyA9IDA7Ci0KLSNpZmRlZiBTVFlQX05PTE9BRAotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0jZW5kaWYgLyogU1RZUF9OT0xPQUQgKi8KLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9URVhUKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0RBVEEpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotICAgIHsKLSNpZmRlZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotI2VuZGlmCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pCi0gICAgewotICAgICAgLyogV2UgbWFyayB0aGVzZSBhcyBTRUNfREVCVUdHSU5HLCBidXQgb25seSBpZiBDT0ZGX1BBR0VfU0laRSBpcwotCSBkZWZpbmVkLiAgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgdXNlcwotCSBDT0ZGX1BBR0VfU0laRSB0byBlbnN1cmUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlCi0JIHNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBvZmZzZXQgbWF0Y2guICBJZiB3ZSBkb24ndCBrbm93Ci0JIENPRkZfUEFHRV9TSVpFLCB3ZSBjYW4ndCBlbnN1cmUgdGhlIGNvcnJlY3QgY29ycmVzcG9uZGVuY2UsCi0JIGFuZCBkZW1hbmQgcGFnZSBsb2FkaW5nIG9mIHRoZSBmaWxlIHdpbGwgZmFpbC4gICovCi0jaWYgZGVmaW5lZCAoQ09GRl9QQUdFX1NJWkUpICYmICFkZWZpbmVkIChDT0ZGX0FMSUdOX0lOX1NfRkxBR1MpCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfUEFEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9URVhUKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQlNTKSA9PSAwKQotICAgIHsKLSNpZmRlZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotI2VuZGlmCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kZWJ1ZyIpID09IDAKLSNpZmRlZiBfQ09NTUVOVAotCSAgIHx8IHN0cmNtcCAobmFtZSwgX0NPTU1FTlQpID09IDAKLSNlbmRpZgotCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIDUpID09IDApCi0gICAgewotI2lmZGVmIENPRkZfUEFHRV9TSVpFCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSNpZmRlZiBfTElCCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQikgPT0gMCkKLSAgICA7Ci0jZW5kaWYKLSNpZmRlZiBfTElUCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVCkgPT0gMCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgICB9Ci0KLSNpZmRlZiBTVFlQX0xJVAkJCS8qIEEyOWsgcmVhZG9ubHkgdGV4dC9kYXRhIHNlY3Rpb24gdHlwZSAqLwotICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0xJVCkgPT0gU1RZUF9MSVQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzID0gKFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZKTsKLSAgICB9Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSNpZmRlZiBTVFlQX09USEVSX0xPQUQJCS8qIE90aGVyIGxvYWRlZCBzZWN0aW9ucyAqLwotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfT1RIRVJfTE9BRCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX1NEQVRBICovCi0KLSNpZiBkZWZpbmVkIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUykgJiYgZGVmaW5lZCAoQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRSkKLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlLCB3ZQotICAgICBvbmx5IGxpbmsgYSBzaW5nbGUgY29weSBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0Ci0gICAgIGcrKy4gIGcrKyB3aWxsIGVtaXQgZWFjaCB0ZW1wbGF0ZSBleHBhbnNpb24gaW4gaXRzIG93biBzZWN0aW9uLgotICAgICBUaGUgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgYXMgd2Vhaywgc28gdGhhdCBtdWx0aXBsZSBkZWZpbml0aW9ucwotICAgICBhcmUgcGVybWl0dGVkLiAgVGhlIEdOVSBsaW5rZXIgZXh0ZW5zaW9uIGlzIHRvIGFjdHVhbGx5IGRpc2NhcmQKLSAgICAgYWxsIGJ1dCBvbmUgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251LmxpbmtvbmNlIiwgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0jZW5kaWYKLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotCi0jZWxzZSAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogVGhlIFBFIHZlcnNpb247IHNlZSBhYm92ZSBmb3IgdGhlIGdlbmVyYWwgY29tbWVudHMuCi0KLSAgIFNpbmNlIHRvIHNldCB0aGUgU0VDX0xJTktfT05DRSBhbmQgYXNzb2NpYXRlZCBmbGFncywgd2UgaGF2ZSB0bwotICAgbG9vayBhdCB0aGUgc3ltYm9sIHRhYmxlIGFueXdheSwgd2UgcmV0dXJuIHRoZSBzeW1ib2wgdGFibGUgaW5kZXgKLSAgIG9mIHRoZSBzeW1ib2wgYmVpbmcgdXNlZCBhcyB0aGUgQ09NREFUIHN5bWJvbC4gIFRoaXMgaXMgYWRtaXR0ZWRseQotICAgdWdseSwgYnV0IHRoZXJlJ3MgcmVhbGx5IG5vd2hlcmUgZWxzZSB0aGF0IHdlIGhhdmUgYWNjZXNzIHRvIHRoZQotICAgcmVxdWlyZWQgaW5mb3JtYXRpb24uICBGSVhNRTogSXMgdGhlIENPTURBVCBzeW1ib2wgaW5kZXggdXNlZCBmb3IKLSAgIGFueSBwdXJwb3NlIG90aGVyIHRoYW4gb2JqZHVtcD8gICovCi0KLXN0YXRpYyBmbGFnd29yZAotc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOwotICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOwotICBmbGFnd29yZCBzZWNfZmxhZ3MgPSAwOwotCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9EU0VDVCkKLSAgICBhYm9ydCAoKTsgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotI2lmZGVmIFNFQ19ORVZFUl9MT0FECi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9OT0xPQUQpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotI2VuZGlmCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9HUk9VUCkKLSAgICBhYm9ydCAoKTsgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotICAvKiBza2lwIElNQUdFX1NDTl9UWVBFX05PX1BBRCAqLwotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfQ09QWSkKLSAgICBhYm9ydCAoKTsgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9DTlRfQ09ERSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX09USEVSKQotICAgIGFib3J0ICgpOyAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0xOS19JTkZPKQotICAgIHsKLSAgICAgIC8qIFdlIG1hcmsgdGhlc2UgYXMgU0VDX0RFQlVHR0lORywgYnV0IG9ubHkgaWYgQ09GRl9QQUdFX1NJWkUgaXMKLQkgZGVmaW5lZC4gIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIHVzZXMKLQkgQ09GRl9QQUdFX1NJWkUgdG8gZW5zdXJlIHRoYXQgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZQotCSBzZWN0aW9uIFZNQSBhbmQgdGhlIGZpbGUgb2Zmc2V0IG1hdGNoLiAgSWYgd2UgZG9uJ3Qga25vdwotCSBDT0ZGX1BBR0VfU0laRSwgd2UgY2FuJ3QgZW5zdXJlIHRoZSBjb3JyZWN0IGNvcnJlc3BvbmRlbmNlLAotCSBhbmQgZGVtYW5kIHBhZ2UgbG9hZGluZyBvZiB0aGUgZmlsZSB3aWxsIGZhaWwuICAqLwotI2lmZGVmIENPRkZfUEFHRV9TSVpFCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX09WRVIpCi0gICAgYWJvcnQgKCk7ICAvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX1JFTU9WRSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX1NIQVJFRCkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX1NIQVJFRDsKLSAgLyogQ09NREFUOiBzZWUgYmVsb3cgKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFKQotICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCkKLSAgICBhYm9ydCAoKTsvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRCkKLSAgICBhYm9ydCAoKTsgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0KLSAgLyogV2UgaW5mZXIgZnJvbSB0aGUgZGlzdGluY3QgcmVhZC93cml0ZS9leGVjdXRlIGJpdHMgdGhlIHNldHRpbmdzCi0gICAgIG9mIHNvbWUgb2YgdGhlIGJmZCBmbGFnczsgdGhlIGFjdHVhbCB2YWx1ZXMsIHNob3VsZCB3ZSBuZWVkIHRoZW0sCi0gICAgIGFyZSBhbHNvIGluIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncy4gICovCi0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX0VYRUNVVEUpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19DT0RFOyAgIC8qIFByb2JhYmx5IHJlZHVuZGFudCAqLwotICAvKiBJTUFHRV9TQ05fTUVNX1JFQUQgaXMgc2ltcGx5IGlnbm9yZWQsIGFzc3VtaW5nIGl0IGFsd2F5cyB0byBiZSB0cnVlLiAqLwotICBpZiAoKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX1dSSVRFKSA9PSAwKQotICAgIHNlY19mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0KLSAgLyogQ09NREFUIGdldHMgdmVyeSBzcGVjaWFsIHRyZWF0bWVudC4gICovCi0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0xOS19DT01EQVQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX09OQ0U7Ci0KLSAgICAgIC8qIFVuZm9ydHVuYXRlbHksIHRoZSBQRSBmb3JtYXQgc3RvcmVzIGVzc2VudGlhbCBpbmZvcm1hdGlvbiBpbgotICAgICAgICAgdGhlIHN5bWJvbCB0YWJsZSwgb2YgYWxsIHBsYWNlcy4gIFdlIG5lZWQgdG8gZXh0cmFjdCB0aGF0Ci0gICAgICAgICBpbmZvcm1hdGlvbiBub3csIHNvIHRoYXQgb2JqZHVtcCBhbmQgdGhlIGxpbmtlciB3aWxsIGtub3cgaG93Ci0gICAgICAgICB0byBoYW5kbGUgdGhlIHNlY3Rpb24gd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUgc3ltYm9scy4gIFdlCi0gICAgICAgICBjYW4ndCBjYWxsIHNsdXJwX3N5bXRhYiwgYmVjYXVzZSB0aGUgbGlua2VyIGRvZXNuJ3Qgd2FudCB0aGUKLSAgICAgICAgIHN3YXBwZWQgc3ltYm9scy4gICovCi0KLSAgICAgIC8qIENPTURBVCBzZWN0aW9ucyBhcmUgc3BlY2lhbC4gIFRoZSBmaXJzdCBzeW1ib2wgaXMgdGhlIHNlY3Rpb24KLQkgc3ltYm9sLCB3aGljaCB0ZWxscyB3aGF0IGtpbmQgb2YgQ09NREFUIHNlY3Rpb24gaXQgaXMuICBUaGUKLQkgc2Vjb25kIHN5bWJvbCBpcyB0aGUgImNvbWRhdCBzeW1ib2wiIC0gdGhlIG9uZSB3aXRoIHRoZQotCSB1bmlxdWUgbmFtZS4gIEdOVSB1c2VzIHRoZSBzZWN0aW9uIHN5bWJvbCBmb3IgdGhlIHVuaXF1ZQotCSBuYW1lOyBNUyB1c2VzICIudGV4dCIgZm9yIGV2ZXJ5IGNvbWRhdCBzZWN0aW9uLiAgU2lnaC4gIC0gREogKi8KLQotICAgICAgLyogVGhpcyBpcyBub3QgbWlycm9yZWQgaW4gc2VjX3RvX3N0eXBfZmxhZ3MoKSwgYnV0IHRoZXJlCi0JIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIG5lZWQgdG8sIGVpdGhlciwgYW5kIGl0IHdvdWxkIGF0IGJlc3QgYmUKLQkgcmF0aGVyIG1lc3N5LiAgKi8KLQotICAgICAgaWYgKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0JewotCSAgYmZkX2J5dGUgKmVzeW1zdGFydCwgKmVzeW0sICplc3ltZW5kOwotCSAgaW50IHNlZW5fc3RhdGUgPSAwOwotCSAgY2hhciAqdGFyZ2V0X25hbWU7Ci0KLQkgIGVzeW1zdGFydCA9IGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0JICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIFNZTUVTWjsKLQotCSAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCSAgICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICAgICAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmaXN5bSk7Ci0KLQkgICAgICBpZiAoc2l6ZW9mIChpbnRlcm5hbF9zLT5zX25hbWUpID4gU1lNTk1MRU4pCi0JCXsKLQkJICAvKiBUaGlzIGNhc2UgaW1wbGllcyB0aGF0IHRoZSBtYXRjaGluZyBzeW1ib2wgbmFtZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaWYgKGlzeW0ubl9zY251bSA9PSBzZWN0aW9uLT50YXJnZXRfaW5kZXgpCi0JCXsKLQkJICAvKiBBY2NvcmRpbmcgdG8gdGhlIE1TVkMgZG9jdW1lbnRhdGlvbiwgdGhlIGZpcnN0Ci0JCSAgICAgVFdPIGVudHJpZXMgd2l0aCB0aGUgc2VjdGlvbiAjIGFyZSBib3RoIG9mCi0JCSAgICAgaW50ZXJlc3QgdG8gdXMuICBUaGUgZmlyc3Qgb25lIGlzIHRoZSAic2VjdGlvbgotCQkgICAgIHN5bWJvbCIgKHNlY3Rpb24gbmFtZSkuICBUaGUgc2Vjb25kIGlzIHRoZSBjb21kYXQKLQkJICAgICBzeW1ib2wgbmFtZS4gIEhlcmUsIHdlJ3ZlIGZvdW5kIHRoZSBmaXJzdAotCQkgICAgIHF1YWxpZnlpbmcgZW50cnk7IHdlIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlCi0JCSAgICAgc2Vjb25kIHdpdGggYSBzdGF0ZSBmbGFnLgotCi0JCSAgICAgSW4gdGhlIGNhc2Ugb2YgZ2FzLWdlbmVyYXRlZCAoYXQgbGVhc3QgdW50aWwgdGhhdAotCQkgICAgIGlzIGZpeGVkKSAubyBmaWxlcywgaXQgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlCi0JCSAgICAgc2Vjb25kIG9uZS4gIEl0IG1heSBiZSBzb21lIG90aGVyIGxhdGVyIHN5bWJvbC4KLQotCQkgICAgIFNpbmNlIGdhcyBhbHNvIGRvZXNuJ3QgZm9sbG93IE1TIGNvbnZlbnRpb25zIGFuZAotCQkgICAgIGVtaXRzIHRoZSBzZWN0aW9uIHNpbWlsYXIgdG8gLnRleHQkPG5hbWU+LCB3aGVyZQotCQkgICAgIDxzb21ldGhpbmc+IGlzIHRoZSBuYW1lIHdlJ3JlIGxvb2tpbmcgZm9yLCB3ZQotCQkgICAgIGRpc3Rpbmd1aXNoIHRoZSB0d28gYXMgZm9sbG93czoKLQotCQkgICAgIElmIHRoZSBzZWN0aW9uIG5hbWUgaXMgc2ltcGx5IGEgc2VjdGlvbiBuYW1lIChubwotCQkgICAgICQpIHdlIHByZXN1bWUgaXQncyBNUy1nZW5lcmF0ZWQsIGFuZCBsb29rIGF0Ci0JCSAgICAgcHJlY2lzZWx5IHRoZSBzZWNvbmQgc3ltYm9sIGZvciB0aGUgY29tZGF0IG5hbWUuCi0JCSAgICAgSWYgdGhlIHNlY3Rpb24gbmFtZSBoYXMgYSAkLCB3ZSBhc3N1bWUgaXQncwotCQkgICAgIGdhcy1nZW5lcmF0ZWQsIGFuZCBsb29rIGZvciA8c29tZXRoaW5nPiAod2hhdGV2ZXIKLQkJICAgICBmb2xsb3dzIHRoZSAkKSBhcyB0aGUgY29tZGF0IHN5bWJvbC4gICovCi0KLQkJICAvKiBBbGwgMyBicmFuY2hlcyB1c2UgdGhpcyAqLwotCQkgIHN5bW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZpc3ltLCBidWYpOwotCi0JCSAgaWYgKHN5bW5hbWUgPT0gTlVMTCkKLQkJICAgIGFib3J0ICgpOwotCi0JCSAgc3dpdGNoIChzZWVuX3N0YXRlKQotCQkgICAgewotCQkgICAgY2FzZSAwOgotCQkgICAgICB7Ci0JCQkvKiBUaGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZSBzeW1ib2wuICAqLwotCQkJdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCQkJc2Vlbl9zdGF0ZSA9IDE7Ci0KLQkJCS8qIElmIGl0IGlzbid0IHRoZSBzdHVmZiB3ZSdyZSBleHBlY3RpbmcsIGRpZTsKLQkJCSAgIFRoZSBNUyBkb2N1bWVudGF0aW9uIGlzIHZhZ3VlLCBidXQgaXQKLQkJCSAgIGFwcGVhcnMgdGhhdCB0aGUgc2Vjb25kIGVudHJ5IHNlcnZlcyBCT1RICi0JCQkgICBhcyB0aGUgY29tZGF0IHN5bWJvbCBhbmQgdGhlIGRlZmluaW5nCi0JCQkgICBzeW1ib2wgcmVjb3JkIChlaXRoZXIgQ19TVEFUIG9yIENfRVhULAotCQkJICAgcG9zc2libHkgd2l0aCBhbiBhdXggZW50cnkgd2l0aCBkZWJ1ZwotCQkJICAgaW5mb3JtYXRpb24gaWYgaXQncyBhIGZ1bmN0aW9uLikgIEl0Ci0JCQkgICBhcHBlYXJzIHRoZSBvbmx5IHdheSB0byBmaW5kIHRoZSBzZWNvbmQgb25lCi0JCQkgICBpcyB0byBjb3VudC4gIChPbiBJbnRlbCwgdGhleSBhcHBlYXIgdG8gYmUKLQkJCSAgIGFkamFjZW50LCBidXQgb24gQWxwaGEsIHRoZXkgaGF2ZSBiZWVuCi0JCQkgICBmb3VuZCBzZXBhcmF0ZWQuKQotCi0JCQkgICBIZXJlLCB3ZSB0aGluayB3ZSd2ZSBmb3VuZCB0aGUgZmlyc3Qgb25lLAotCQkJICAgYnV0IHRoZXJlJ3Mgc29tZSBjaGVja2luZyB3ZSBjYW4gZG8gdG8gYmUKLQkJCSAgIHN1cmUuICAqLwotCi0JCQlpZiAoISAoaXN5bS5uX3NjbGFzcyA9PSBDX1NUQVQKLQkJCSAgICAgICAmJiBpc3ltLm5fdHlwZSA9PSBUX05VTEwKLQkJCSAgICAgICAmJiBpc3ltLm5fdmFsdWUgPT0gMCkpCi0JCQkgIGFib3J0ICgpOwotCi0JCQkvKiBGSVhNRSBMQVRFUjogTVNWQyBnZW5lcmF0ZXMgc2VjdGlvbiBuYW1lcwotCQkJICAgbGlrZSAudGV4dCBmb3IgY29tZGF0cy4gIEdhcyBnZW5lcmF0ZXMKLQkJCSAgIG5hbWVzIGxpa2UgLnRleHQkZm9vX19GdiAoaW4gdGhlIGNhc2Ugb2YgYQotCQkJICAgZnVuY3Rpb24pLiAgU2VlIGNvbW1lbnQgYWJvdmUgZm9yIG1vcmUuICAqLwotCi0JCQlpZiAoc3RyY21wIChuYW1lLCBzeW1uYW1lKSAhPSAwKQotCQkJICBhYm9ydCAoKTsKLSAgCi0JCQkvKiBUaGlzIGlzIHRoZSBzZWN0aW9uIHN5bWJvbC4gICovCi0KLQkJCWJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIFNZTUVTWiksCi0JCQkJCSAgICAgIGlzeW0ubl90eXBlLCBpc3ltLm5fc2NsYXNzLAotCQkJCQkgICAgICAwLCBpc3ltLm5fbnVtYXV4LCAoUFRSKSAmYXV4KTsKLQotCQkJdGFyZ2V0X25hbWUgPSBzdHJjaHIgKG5hbWUsICckJyk7Ci0JCQlpZiAodGFyZ2V0X25hbWUgIT0gTlVMTCkKLQkJCSAgewotCQkJICAgIC8qIEdhcyBtb2RlLiAgKi8KLQkJCSAgICBzZWVuX3N0YXRlID0gMjsKLQkJCSAgICAvKiBTa2lwIHRoZSBgJCcuICAqLwotCQkJICAgIHRhcmdldF9uYW1lICs9IDE7Ci0JCQkgIH0KLQotCQkJLyogRklYTUU6IE1pY3Jvc29mdCB1c2VzIE5PRFVQTElDQVRFUyBhbmQKLQkJCSAgIEFTU09DSUFUSVZFLCBidXQgZ251IHVzZXMgQU5ZIGFuZAotCQkJICAgU0FNRV9TSVpFLiAgVW5mb3J0dW5hdGVseSwgZ251IGRvZXNuJ3QgZG8KLQkJCSAgIHRoZSBjb21kYXQgc3ltYm9scyByaWdodC4gIFNvLCB1bnRpbCB3ZSBjYW4KLQkJCSAgIGZpeCBpdCB0byBkbyB0aGUgcmlnaHQgdGhpbmcsIHdlIGFyZQotCQkJICAgdGVtcG9yYXJpbHkgZGlzYWJsaW5nIGNvbWRhdHMgZm9yIHRoZSBNUwotCQkJICAgdHlwZXMgKHRoZXkncmUgdXNlZCBpbiBETExzIGFuZCBDKyssIGJ1dCB3ZQotCQkJICAgZG9uJ3Qgc3VwcG9ydCAqdGhlaXIqIEMrKyBsaWJyYXJpZXMgYW55d2F5Ci0JCQkgICAtIERKLiAgKi8KLQotCQkJLyogQ3lnd2luIGRvZXMgbm90IGZvbGxvdyB0aGUgTVMgc3R5bGUsIGFuZAotCQkJICAgdXNlcyBBTlkgYW5kIFNBTUVfU0laRSB3aGVyZSBOT0RVUExJQ0FURVMKLQkJCSAgIGFuZCBBU1NPQ0lBVElWRSBzaG91bGQgYmUgdXNlZC4gIEZvcgotCQkJICAgSW50ZXJpeCwgd2UganVzdCBkbyB0aGUgcmlnaHQgdGhpbmcgdXAKLQkJCSAgIGZyb250LiAgKi8KLQotCQkJc3dpdGNoIChhdXgueF9zY24ueF9jb21kYXQpCi0JCQkgIHsKLQkJCSAgY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzoKLSNpZmRlZiBTVFJJQ1RfUEVfRk9STUFUIAotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOwotI2Vsc2UKLQkJCSAgICBzZWNfZmxhZ3MgJj0gflNFQ19MSU5LX09OQ0U7Ci0jZW5kaWYKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOgotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRToKLQkJCSAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOgotCQkJICAgIC8qIE5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQgPz8/ICovCi0JCQkgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzsKLQkJCSAgICBicmVhazsKLQotCQkJICAvKiBkZWJ1ZyRTIGdldHMgdGhpcyBjYXNlOyBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNhdGlvbnMgPz8/ICovCi0KLQkJCSAgLyogVGhlcmUgbWF5IGJlIG5vIHN5bWJvbC4uLiB3ZSdsbCBzZWFyY2gKLQkJCSAgICAgdGhlIHdob2xlIHRhYmxlLi4uIElzIHRoaXMgdGhlIHJpZ2h0Ci0JCQkgICAgIHBsYWNlIHRvIHBsYXkgdGhpcyBnYW1lPyBPciBzaG91bGQgd2UgZG8KLQkJCSAgICAgaXQgd2hlbiByZWFkaW5nIGl0IGluLiAgKi8KLQkJCSAgY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFOgotI2lmZGVmIFNUUklDVF9QRV9GT1JNQVQKLQkJCSAgICAvKiBGSVhNRTogVGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAgKi8KLQkJCSAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotI2Vsc2UKLQkJCSAgICBzZWNfZmxhZ3MgJj0gflNFQ19MSU5LX09OQ0U7Ci0jZW5kaWYKLQkJCSAgICBicmVhazsKLQotCQkJICBkZWZhdWx0OiAgLyogMCBtZWFucyAibm8gc3ltYm9sIiAqLwotCQkJICAgIC8qIGRlYnVnJEYgZ2V0cyB0aGlzIGNhc2U7IG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljYXRpb25zID8/PyAqLwotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkgCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgMjoKLQkJICAgICAgLyogR2FzIG1vZGU6IHRoZSBmaXJzdCBtYXRjaGluZyBvbiBwYXJ0aWFsIG5hbWUuICAqLwotCi0jaWZuZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFIDAKLSNlbmRpZgotCQkgICAgICAvKiBJcyB0aGlzIHRoZSBuYW1lIHdlJ3JlIGxvb2tpbmcgZm9yPyAqLwotCQkgICAgICBpZiAoc3RyY21wICh0YXJnZXRfbmFtZSwgCi0JCQkJICBzeW1uYW1lICsgKFRBUkdFVF9VTkRFUlNDT1JFID8gMSA6IDApKSAhPSAwKQotCQkJewotCQkJICAgIC8qIE5vdCB0aGUgbmFtZSB3ZSdyZSBsb29raW5nIGZvciAqLwotCSAgICAgICAgICAgICAgICAgICAgZXN5bSArPSAoaXN5bS5uX251bWF1eCArIDEpICogU1lNRVNaOwotCQkJICAgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgICAgY2FzZSAxOiAKLQkJICAgICAgLyogTVNWQyBtb2RlOiB0aGUgbGV4aWNhbGx5IHNlY29uZCBzeW1ib2wgKG9yCi0JCQkgZHJvcCB0aHJvdWdoIGZyb20gdGhlIGFib3ZlKS4gICovCi0JCSAgICAgIHsKLQkJICAgICAgICBjaGFyICpuZXduYW1lOwotCi0JCQkvKiBUaGlzIG11c3QgdGhlIHRoZSBzZWNvbmQgc3ltYm9sIHdpdGggdGhlCi0JCQkgICBzZWN0aW9uICMuICBJdCBpcyB0aGUgYWN0dWFsIHN5bWJvbCBuYW1lLgotCQkJICAgSW50ZWwgcHV0cyB0aGUgdHdvIGFkamFjZW50LCBidXQgQWxwaGEgKGF0Ci0JCQkgICBsZWFzdCkgc3ByZWFkcyB0aGVtIG91dC4gICovCi0KLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQgPSAKLQkJCSAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfY29tZGF0X2luZm8pKTsKLQkJICAgICAgICBpZiAoc2VjdGlvbi0+Y29tZGF0ID09IE5VTEwpCi0JCSAgICAgICAgICBhYm9ydCAoKTsKLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQtPnN5bWJvbCA9Ci0JCQkgIChlc3ltIC0gZXN5bXN0YXJ0KSAvIFNZTUVTWjsKLQotCQkgICAgICAgIG5ld25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc3ltbmFtZSkgKyAxKTsKLQkJICAgICAgICBpZiAobmV3bmFtZSA9PSBOVUxMKQotCQkgICAgICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgICAgICBzdHJjcHkgKG5ld25hbWUsIHN5bW5hbWUpOwotCQkgICAgICAgIHNlY3Rpb24tPmNvbWRhdC0+bmFtZSA9IG5ld25hbWU7Ci0KLQkJICAgICAgfQotCi0JCSAgICAgIGdvdG8gYnJlYWtsb29wOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBlc3ltICs9IChpc3ltLm5fbnVtYXV4ICsgMSkgKiBTWU1FU1o7Ci0JICAgIH0KLQkgIGJyZWFrbG9vcDoKLQl9Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpICYmIGRlZmluZWQgKENPRkZfU1VQUE9SVF9HTlVfTElOS09OQ0UpCi0gIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgaWYgdGhlIG5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSwgd2UKLSAgICAgb25seSBsaW5rIGEgc2luZ2xlIGNvcHkgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAotICAgICBnKysuICBnKysgd2lsbCBlbWl0IGVhY2ggdGVtcGxhdGUgZXhwYW5zaW9uIGluIGl0cyBvd24gc2VjdGlvbi4KLSAgICAgVGhlIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGFzIHdlYWssIHNvIHRoYXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgYXJlIHBlcm1pdHRlZC4gIFRoZSBHTlUgbGlua2VyIGV4dGVuc2lvbiBpcyB0byBhY3R1YWxseSBkaXNjYXJkCi0gICAgIGFsbCBidXQgb25lIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmIChzdHJuY21wIChuYW1lLCAiLmdudS5saW5rb25jZSIsIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKQotICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotI2VuZGlmCi0KLSAgcmV0dXJuIHNlY19mbGFnczsKLX0KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0jZGVmaW5lCWdldF9pbmRleChzeW1ib2wpCSgoc3ltYm9sKS0+dWRhdGEuaSkKLQotLyoKLUlOVEVSTkFMX0RFRklOSVRJT04KLQliZmRfY29mZl9iYWNrZW5kX2RhdGEKLQotQ09ERV9GUkFHTUVOVAotCi0ueyogQ09GRiBzeW1ib2wgY2xhc3NpZmljYXRpb25zLiAgKn0KLS4KLS5lbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uCi0uewotLiAgeyogR2xvYmFsIHN5bWJvbC4gICp9Ci0uICBDT0ZGX1NZTUJPTF9HTE9CQUwsCi0uICB7KiBDb21tb24gc3ltYm9sLiAgKn0KLS4gIENPRkZfU1lNQk9MX0NPTU1PTiwKLS4gIHsqIFVuZGVmaW5lZCBzeW1ib2wuICAqfQotLiAgQ09GRl9TWU1CT0xfVU5ERUZJTkVELAotLiAgeyogTG9jYWwgc3ltYm9sLiAgKn0KLS4gIENPRkZfU1lNQk9MX0xPQ0FMLAotLiAgeyogUEUgc2VjdGlvbiBzeW1ib2wuICAqfQotLiAgQ09GRl9TWU1CT0xfUEVfU0VDVElPTgotLn07Ci0uCi1TcGVjaWFsIGVudHJ5IHBvaW50cyBmb3IgZ2RiIHRvIHN3YXAgaW4gY29mZiBzeW1ib2wgdGFibGUgcGFydHM6Ci0udHlwZWRlZiBzdHJ1Y3QKLS57Ci0uICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYXV4X2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCi0uICAgICAgIGludCAgICAgICAgICAgICB0eXBlLAotLiAgICAgICBpbnQgICAgICAgICAgICAgY2xhc3MsCi0uICAgICAgIGludCAgICAgICAgICAgICBpbmRhdXgsCi0uICAgICAgIGludCAgICAgICAgICAgICBudW1hdXgsCi0uICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotLgotLiAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX3N5bV9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgICAgICAgICphYmZkICwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0uCi0uICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgICAgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0uCi0KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnYXMgdG8gc3dhcCBvdXQgY29mZiBwYXJ0czoKLQotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgCSphYmZkLAotLiAgICAgICBQVFIJaW4sCi0uICAgICAgIGludCAgICAJdHlwZSwKLS4gICAgICAgaW50ICAgIAljbGFzcywKLS4gICAgICAgaW50ICAgICBpbmRhdXgsCi0uICAgICAgIGludCAgICAgbnVtYXV4LAotLiAgICAgICBQVFIgICAgCWV4dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSBQQVJBTVMgKCgKLS4gICAgICBiZmQgICAgICAqYWJmZCwKLS4gICAgICBQVFIJaW4sCi0uICAgICAgUFRSCWV4dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkICAgCSphYmZkLAotLiAgICAgIAlQVFIJaW4sCi0uCVBUUglleHQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkICAgICAqYWJmZCwKLS4gICAgIAlQVFIJc3JjLAotLglQVFIJZHN0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkICAJKmFiZmQsCi0uCVBUUiAJaW4sCi0uCVBUUiAJb3V0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkIAkqYWJmZCwKLS4JUFRSIAlpbiwKLS4JUFRSCW91dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkICAJKmFiZmQsCi0uICAgICAgCVBUUglpbiwKLS4JUFRSCW91dCkpOwotLgotCi1TcGVjaWFsIGVudHJ5IHBvaW50cyBmb3IgZ2VuZXJpYyBDT0ZGIHJvdXRpbmVzIHRvIGNhbGwgdGFyZ2V0Ci1kZXBlbmRlbnQgQ09GRiByb3V0aW5lczoKLQotLiB1bnNpZ25lZCBpbnQgX2JmZF9maWxoc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2FvdXRzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfc2NuaHN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9zeW1lc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2F1eGVzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfcmVsc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2xpbmVzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfZmlsbm1sZW47Ci0uIGJvb2xlYW4gX2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzOwotLiBib29sZWFuIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXM7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcjsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotLiBQVFIgKCpfYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkciwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9hb3V0aGRyKSk7Ci0uIGZsYWd3b3JkICgqX2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIsCi0uICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0uICAgICAgIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0uIHZvaWQgKCpfYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICpzZWMsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0uICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3ByaW50X2F1eCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgRklMRSAqZmlsZSwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgsCi0uICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgpKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotLiAgICAgICBhcmVsZW50ICpyZWxvYywKLS4gICAgICAgYmZkX2J5dGUgKmRhdGEsCi0uICAgICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciwKLS4gICAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyKSk7Ci0uIGludCAoKl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLS4gICAgICAgYXJlbGVudCAqciwKLS4gICAgICAgdW5zaWduZWQgaW50IHNocmluaywKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotLiBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uICgqX2JmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICpvdXRwdXRfYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLS4gICAgICAgYmZkICppbnB1dF9iZmQsCi0uICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zLAotLiAgICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zKSk7Ci0uIHJlbG9jX2hvd3RvX3R5cGUgKigqX2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBhc2VjdGlvbiAqc2VjLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwKLS4gICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0sCi0uICAgICAgIGJmZF92bWEgKmFkZGVuZHApKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICpvYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLS4gICAgICAgYmZkICppYmZkLAotLiAgICAgICBhc2VjdGlvbiAqc2VjLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jLAotLiAgICAgICBib29sZWFuICphZGp1c3RlZHApKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKCgKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLS4gICAgICAgZmxhZ3dvcmQgZmxhZ3MsIAotLiAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLS4gICAgICAgYmZkX3ZtYSB2YWx1ZSwKLS4gICAgICAgY29uc3QgY2hhciAqc3RyaW5nLAotLiAgICAgICBib29sZWFuIGNvcHksCi0uICAgICAgIGJvb2xlYW4gY29sbGVjdCwgCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHApKTsKLS4KLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIFBBUkFNUyAoKAotLgliZmQgKiBhYmZkLAotLiAgICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIFBBUkFNUyAoKAotLgliZmQgKiBhYmZkLAotLglzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8pKTsKLS4KLS59IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YTsKLS4KLS4jZGVmaW5lIGNvZmZfYmFja2VuZF9pbmZvKGFiZmQpICgoYmZkX2NvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfaW4oYSxlLHQsYyxpbmQsbnVtLGkpIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfaW4pIChhLGUsdCxjLGluZCxudW0saSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9pbihhLGUsaSkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX3N5bV9pbikgKGEsZSxpKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luKGEsZSxpKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvICggYSktPl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgKGEsZSxpKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KGFiZmQsIGksIG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dChhYmZkLCBpLCBvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfb3V0KGEsaSx0LGMsaW5kLG51bSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgKGEsaSx0LGMsaW5kLG51bSxvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfZmlsaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfZmlsaHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfYW91dHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYW91dHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfc2NuaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2NuaHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfc3ltZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc3ltZXN6KQotLiNkZWZpbmUgYmZkX2NvZmZfYXV4ZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYXV4ZXN6KQotLiNkZWZpbmUgYmZkX2NvZmZfcmVsc3ooYWJmZCkgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfcmVsc3opCi0uI2RlZmluZSBiZmRfY29mZl9saW5lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9saW5lc3opCi0uI2RlZmluZSBiZmRfY29mZl9maWxubWxlbihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbG5tbGVuKQotLiNkZWZpbmUgYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMoYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKQotLiNkZWZpbmUgYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKGFiZmQpIFwKLS4gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpCi0uI2RlZmluZSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKGFiZmQpIFwKLS4JIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKQotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbihhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbihhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4oYWJmZCwgaSwgbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2soYWJmZCwgZmlsZWhkcikgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayhhYmZkLCBmaWxlaGRyKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCi0uI2RlZmluZSBiZmRfY29mZl9ta29iamVjdF9ob29rKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ta29iamVjdF9ob29rKSAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rKGFiZmQsIHNjbmhkciwgbmFtZSwgc2VjdGlvbilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKVwKLS4gICAgICAgICAoYWJmZCwgc2NuaGRyLCBuYW1lLCBzZWN0aW9uKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayhhYmZkLCBzZWMsIHNjbmhkcilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUoYWJmZClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyhhYmZkLCBzeW0pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3ByaW50X2F1eChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLS4gICAgICAgICAoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKVwKLS4gICAgICAgICAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbylcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpXAotLiAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKGFiZmQsIHN5bSlcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbClcCi0uICAgICAgICAgKGFiZmQsIHN5bSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMoYWJmZClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucylcCi0uICAgICAgICAgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayhvYmZkLCBpbmZvKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKG9iZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaylcCi0uICAgICAgICAgKG9iZmQsIGluZm8pKQotLiNkZWZpbmUgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbihvYmZkLGluZm8saWJmZCxvLGNvbixyZWwsaXN5bXMsc2VjcylcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChpYmZkKS0+X2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pXAotLiAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBvLCBjb24sIHJlbCwgaXN5bXMsIHNlY3MpKQotLiNkZWZpbmUgYmZkX2NvZmZfcnR5cGVfdG9faG93dG8oYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKVwKLS4gICAgICAgICAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkpCi0uI2RlZmluZSBiZmRfY29mZl9hZGp1c3Rfc3ltbmR4KG9iZmQsIGluZm8sIGliZmQsIHNlYywgcmVsLCBhZGp1c3RlZHApXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KVwKLS4gICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcCkpCi0uI2RlZmluZSBiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKGluZm8sYWJmZCxuYW1lLGZsYWdzLHNlY3Rpb24sdmFsdWUsc3RyaW5nLGNwLGNvbGwsaGFzaHApXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKVwKLS4gICAgICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNwLCBjb2xsLCBoYXNocCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oYSxwKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgKGEscCkpCi0uI2RlZmluZSBiZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoYSxwKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgKGEscCkpCi0uCi0qLwotCi0vKiBTZWUgd2hldGhlciB0aGUgbWFnaWMgbnVtYmVyIG1hdGNoZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9iYWRfZm9ybWF0X2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgaWYgKEJBRE1BRyAoKmludGVybmFsX2YpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBpZiB0aGUgb3B0aW9uYWwgaGVhZGVyIGlzIE5VTEwgb3Igbm90IHRoZSBjb3JyZWN0IHNpemUgdGhlbgotICAgICBxdWl0OyB0aGUgb25seSBkaWZmZXJlbmNlIEkgY2FuIHNlZSBiZXR3ZWVuIG04OGsgZGd1eCBoZWFkZXJzIChNQzg4RE1BR0lDKQotICAgICBhbmQgSW50ZWwgOTYwIHJlYWR3cml0ZSBoZWFkZXJzIChJOTYwV1JNQUdJQykgaXMgdGhhdCB0aGUKLSAgICAgb3B0aW9uYWwgaGVhZGVyIGlzIG9mIGEgZGlmZmVyZW50IHNpemUuCi0KLSAgICAgQnV0IHRoZSBtaXBzIGtlZXBzIGV4dHJhIHN0dWZmIGluIGl0J3Mgb3B0aGRyLCBzbyBkb250IGNoZWNrCi0gICAgIHdoZW4gZG9pbmcgdGhhdAotICAgICAqLwotCi0jaWYgZGVmaW5lZChNODgpIHx8IGRlZmluZWQoSTk2MCkKLSAgaWYgKGludGVybmFsX2YtPmZfb3B0aGRyICE9IDAgJiYgQU9VVFNaICE9IGludGVybmFsX2YtPmZfb3B0aGRyKQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayB3aGV0aGVyIHRoaXMgc2VjdGlvbiB1c2VzIGFuIGFsaWdubWVudCBvdGhlciB0aGFuIHRoZQotICAgZGVmYXVsdC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24sIGFsaWdubWVudF90YWJsZSwgdGFibGVfc2l6ZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBjb25zdCBzdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeSAqYWxpZ25tZW50X3RhYmxlOwotICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdGFibGVfc2l6ZTsKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IGRlZmF1bHRfYWxpZ25tZW50ID0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgdGFibGVfc2l6ZTsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBpZiAoYWxpZ25tZW50X3RhYmxlW2ldLmNvbXBhcmlzb25fbGVuZ3RoID09ICh1bnNpZ25lZCBpbnQpIC0xCi0JICA/IHN0cmNtcCAoYWxpZ25tZW50X3RhYmxlW2ldLm5hbWUsIHNlY25hbWUpID09IDAKLQkgIDogc3RybmNtcCAoYWxpZ25tZW50X3RhYmxlW2ldLm5hbWUsIHNlY25hbWUsCi0JCSAgICAgYWxpZ25tZW50X3RhYmxlW2ldLmNvbXBhcmlzb25fbGVuZ3RoKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLSAgaWYgKGkgPj0gdGFibGVfc2l6ZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGFsaWdubWVudF90YWJsZVtpXS5kZWZhdWx0X2FsaWdubWVudF9taW4gIT0gQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkKLSAgICAgICYmIGRlZmF1bHRfYWxpZ25tZW50IDwgYWxpZ25tZW50X3RhYmxlW2ldLmRlZmF1bHRfYWxpZ25tZW50X21pbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKGFsaWdubWVudF90YWJsZVtpXS5kZWZhdWx0X2FsaWdubWVudF9tYXggIT0gQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkKLSAgICAgICYmIGRlZmF1bHRfYWxpZ25tZW50ID4gYWxpZ25tZW50X3RhYmxlW2ldLmRlZmF1bHRfYWxpZ25tZW50X21heCkKLSAgICByZXR1cm47Ci0KLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ25tZW50X3RhYmxlW2ldLmFsaWdubWVudF9wb3dlcjsKLX0KLQotLyogQ3VzdG9tIHNlY3Rpb24gYWxpZ25tZW50IHJlY29yZHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkKLWNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfdGFibGVbXSA9Ci17Ci0jaWZkZWYgQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTCi0gIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUywKLSNlbmRpZgotICAvKiBUaGVyZSBtdXN0IG5vdCBiZSBhbnkgZ2FwcyBiZXR3ZWVuIC5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgeyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLnN0YWJzdHIiKSwKLSAgICAxLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMCB9LAotICAvKiBUaGUgLnN0YWIgc2VjdGlvbiBtdXN0IGJlIGFsaWduZWQgdG8gMioqMiBhdCBtb3N0LCB0byBhdm9pZCBnYXBzLiAgKi8KLSAgeyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLnN0YWIiKSwKLSAgICAzLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9LAotICAvKiBTaW1pbGFybHkgZm9yIHRoZSAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9ucy4gICovCi0gIHsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuY3RvcnMiKSwKLSAgICAzLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9LAotICB7IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmR0b3JzIiksCi0gICAgMywgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlX3NpemUgPQotICBzaXplb2YgY29mZl9zZWN0aW9uX2FsaWdubWVudF90YWJsZSAvIHNpemVvZiBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlWzBdOwotCi0vKiBJbml0aWFsaXplIGEgc2VjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBwZWN1bGlhciB0byB0aGlzCi0gICBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIENPRkYuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0KLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+dGV4dF9hbGlnbl9wb3dlciAhPSAwCi0gICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKSwgIi50ZXh0IikgPT0gMCkKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB4Y29mZl9kYXRhIChhYmZkKS0+dGV4dF9hbGlnbl9wb3dlcjsKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5kYXRhX2FsaWduX3Bvd2VyICE9IDAKLSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLCAiLmRhdGEiKSA9PSAwKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5kYXRhX2FsaWduX3Bvd2VyOwotI2VuZGlmCi0KLSAgLyogQWxsb2NhdGUgYXV4IHJlY29yZHMgZm9yIHNlY3Rpb24gc3ltYm9scywgdG8gc3RvcmUgc2l6ZSBhbmQKLSAgICAgcmVsYXRlZCBpbmZvLgotCi0gICAgIEBAIFRoZSAxMCBpcyBhIGd1ZXNzIGF0IGEgcGxhdXNpYmxlIG1heGltdW0gbnVtYmVyIG9mIGF1eCBlbnRyaWVzCi0gICAgIChidXQgc2hvdWxkbid0IGJlIGEgY29uc3RhbnQpLiAgKi8KLSAgbmF0aXZlID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopCi0JICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSkgKiAxMCkpOwotICBpZiAobmF0aXZlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IHVwIG5fbmFtZSwgbl92YWx1ZSwgb3Igbl9zY251bSBpbiB0aGUgbmF0aXZlCi0gICAgIHN5bWJvbCBpbmZvcm1hdGlvbiwgc2luY2UgdGhleSdsbCBiZSBvdmVycmlkZW4gYnkgdGhlIEJGRCBzeW1ib2wKLSAgICAgYW55aG93LiAgSG93ZXZlciwgd2UgZG8gbmVlZCB0byBzZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UgY2xhc3MsCi0gICAgIGluIGNhc2UgdGhpcyBzeW1ib2wgd2luZHMgdXAgZ2V0dGluZyB3cml0dGVuIG91dC4gIFRoZSB2YWx1ZSAwCi0gICAgIGZvciBuX251bWF1eCBpcyBhbHJlYWR5IGNvcnJlY3QuICAqLwotCi0gIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gVF9OVUxMOwotICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotCi0gIGNvZmZzeW1ib2wgKHNlY3Rpb24tPnN5bWJvbCktPm5hdGl2ZSA9IG5hdGl2ZTsKLQotICBjb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24sCi0JCQkJICAgICBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlLAotCQkJCSAgICAgY29mZl9zZWN0aW9uX2FsaWdubWVudF90YWJsZV9zaXplKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIKLQotLyogU2V0IHRoZSBhbGlnbm1lbnQgb2YgYSBCRkQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZkZWYgSTk2MAotICAvKiBFeHRyYWN0IEFMSUdOIGZyb20gMioqQUxJR04gc3RvcmVkIGluIHNlY3Rpb24gaGVhZGVyICovCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIGlmICgoMSA8PCBpKSA+PSBoZHItPnNfYWxpZ24pCi0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFRJQzgwQ09GRgotICAvKiBUSSB0b29scyBoaWphY2sgYml0cyA4LTExIGZvciB0aGUgYWxpZ25tZW50ICovCi0gIGkgPSAoaGRyLT5zX2ZsYWdzID4+IDgpICYgMHhGIDsKLSNlbmRpZgotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBpOwotfQotCi0jZWxzZSAvKiAhIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgKi8KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQotLyogYSBjb3VwbGUgb2YgbWFjcm9zIHRvIGhlbHAgc2V0dGluZyB0aGUgYWxpZ25tZW50IHBvd2VyIGZpZWxkICovCi0jZGVmaW5lIEFMSUdOX1NFVChmaWVsZCx4LHkpIFwKLSAgaWYgKCgoZmllbGQpICYgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMpID09IHggKVwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotI2RlZmluZSBFTElGQUxJR05fU0VUKGZpZWxkLHgseSkgXAotICBlbHNlIGlmICgoIChmaWVsZCkgJiBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUykgPT0geCApIFwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIFBUUiBzY25oZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKLQotICBBTElHTl9TRVQgICAgIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl82NEJZVEVTLCA2KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8zMkJZVEVTLCA1KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTLCA0KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl84QllURVMsICAzKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl80QllURVMsICAyKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8yQllURVMsICAxKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xQllURVMsICAwKQotCi0gIC8qIEluIGEgUEUgaW1hZ2UgZmlsZSwgdGhlIHNfcGFkZHIgZmllbGQgaG9sZHMgdGhlIHZpcnR1YWwgc2l6ZSBvZiBhCi0gICAgIHNlY3Rpb24sIHdoaWxlIHRoZSBzX3NpemUgZmllbGQgaG9sZHMgdGhlIHJhdyBzaXplLiAgV2UgYWxzbyBrZWVwCi0gICAgIHRoZSBvcmlnaW5hbCBzZWN0aW9uIGZsYWcgdmFsdWUsIHNpbmNlIG5vdCBldmVyeSBiaXQgY2FuIGJlCi0gICAgIG1hcHBlZCBvbnRvIGEgZ2VuZXJpYyBCRkQgc2VjdGlvbiBiaXQuICAqLwotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JewotCSAgLyogRklYTUU6IFJldHVybiBlcnJvci4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnRkYXRhID0KLQkoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dGRhdGEgPT0gTlVMTCkKLQl7Ci0JICAvKiBGSVhNRTogUmV0dXJuIGVycm9yLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT52aXJ0X3NpemUgPSBoZHItPnNfcGFkZHI7Ci0gIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncyA9IGhkci0+c19mbGFnczsKLQotICBzZWN0aW9uLT5sbWEgPSBoZHItPnNfdmFkZHI7Ci19Ci0jdW5kZWYgQUxJR05fU0VUCi0jdW5kZWYgRUxJRkFMSUdOX1NFVAotCi0jZWxzZSAvKiAhIENPRkZfV0lUSF9QRSAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotCi0vKiBXZSBncm9zc2x5IGFidXNlIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlIFhDT0ZGIG92ZXJmbG93IGhlYWRlcnMuCi0gICBXaGVuIHdlIHNlZSBvbmUsIHdlIGNvcnJlY3QgdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudHMgaW4gdGhlCi0gICByZWFsIGhlYWRlciwgYW5kIHJlbW92ZSB0aGUgc2VjdGlvbiB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotCi1zdGF0aWMgdm9pZCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgc2VjdGlvbiwgc2NuaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0gIGFzZWN0aW9uICpyZWFsX3NlYzsKLSAgYXNlY3Rpb24gKipwczsKLQotICBpZiAoKGhkci0+c19mbGFncyAmIFNUWVBfT1ZSRkxPKSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWFsX3NlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgaGRyLT5zX25yZWxvYyk7Ci0gIGlmIChyZWFsX3NlYyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICByZWFsX3NlYy0+cmVsb2NfY291bnQgPSBoZHItPnNfcGFkZHI7Ci0gIHJlYWxfc2VjLT5saW5lbm9fY291bnQgPSBoZHItPnNfdmFkZHI7Ci0KLSAgZm9yIChwcyA9ICZhYmZkLT5zZWN0aW9uczsgKnBzICE9IE5VTEw7IHBzID0gJigqcHMpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgqcHMgPT0gc2VjdGlvbikKLQl7Ci0JICAqcHMgPSAoKnBzKS0+bmV4dDsKLQkgIC0tYWJmZC0+c2VjdGlvbl9jb3VudDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNlbHNlIC8qICEgUlM2MDAwQ09GRl9DICovCi0KLSNkZWZpbmUgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKSkgYmZkX3ZvaWQpCi0KLSNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLwotI2VuZGlmIC8qICEgQ09GRl9XSVRIX1BFICovCi0jZW5kaWYgLyogISBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSICovCi0KLSNpZm5kZWYgY29mZl9ta29iamVjdAotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBjb2ZmX2RhdGFfdHlwZSAqY29mZjsKLQotICBhYmZkLT50ZGF0YS5jb2ZmX29ial9kYXRhID0gKHN0cnVjdCBjb2ZmX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9kYXRhX3R5cGUpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmNvZmZfb2JqX2RhdGEgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNvZmYgPSBjb2ZmX2RhdGEgKGFiZmQpOwotICBjb2ZmLT5zeW1ib2xzID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgY29mZi0+Y29udmVyc2lvbl90YWJsZSA9ICh1bnNpZ25lZCBpbnQgKikgTlVMTDsKLSAgY29mZi0+cmF3X3N5bWVudHMgPSAoc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqKSBOVUxMOwotICBjb2ZmLT5yZWxvY2Jhc2UgPSAwOwotICBjb2ZmLT5sb2NhbF90b2Nfc3ltX21hcCA9IDA7Ci0KLS8qICBtYWtlX2Fic19zZWN0aW9uKGFiZmQpOyovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKLQotLyogQ3JlYXRlIHRoZSBDT0ZGIGJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotI2lmbmRlZiBjb2ZmX21rb2JqZWN0X2hvb2sKLXN0YXRpYyBQVFIKLWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci0gICAgIFBUUiBhb3V0aGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGlmIChjb2ZmX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLQotICBjb2ZmLT5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJwotICAgICB1bmZvcnR1bmF0ZWx5IHZhcnkgYW1vbmcgY29mZiBpbXBsZW1lbnRhdGlvbnMuLi4gICovCi0gIGNvZmYtPmxvY2FsX25fYnRtYXNrID0gTl9CVE1BU0s7Ci0gIGNvZmYtPmxvY2FsX25fYnRzaGZ0ID0gTl9CVFNIRlQ7Ci0gIGNvZmYtPmxvY2FsX25fdG1hc2sgPSBOX1RNQVNLOwotICBjb2ZmLT5sb2NhbF9uX3RzaGlmdCA9IE5fVFNISUZUOwotICBjb2ZmLT5sb2NhbF9zeW1lc3ogPSBTWU1FU1o7Ci0gIGNvZmYtPmxvY2FsX2F1eGVzeiA9IEFVWEVTWjsKLSAgY29mZi0+bG9jYWxfbGluZXN6ID0gTElORVNaOwotCi0gIGNvZmYtPnRpbWVzdGFtcCA9IGludGVybmFsX2YtPmZfdGltZGF0OwotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9Ci0gICAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkgPQotICAgICAgaW50ZXJuYWxfZi0+Zl9uc3ltczsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1NIUk9CSikgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICBpZiAoYW91dGhkciAhPSBOVUxMICYmIGludGVybmFsX2YtPmZfb3B0aGRyID49IEFPVVRTWikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqaW50ZXJuYWxfYSA9Ci0JKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmOwotCi0gICAgICB4Y29mZiA9IHhjb2ZmX2RhdGEgKGFiZmQpOwotICAgICAgeGNvZmYtPmZ1bGxfYW91dGhkciA9IHRydWU7Ci0gICAgICB4Y29mZi0+dG9jID0gaW50ZXJuYWxfYS0+b190b2M7Ci0gICAgICB4Y29mZi0+c250b2MgPSBpbnRlcm5hbF9hLT5vX3NudG9jOwotICAgICAgeGNvZmYtPnNuZW50cnkgPSBpbnRlcm5hbF9hLT5vX3NuZW50cnk7Ci0gICAgICB4Y29mZi0+dGV4dF9hbGlnbl9wb3dlciA9IGludGVybmFsX2EtPm9fYWxnbnRleHQ7Ci0gICAgICB4Y29mZi0+ZGF0YV9hbGlnbl9wb3dlciA9IGludGVybmFsX2EtPm9fYWxnbmRhdGE7Ci0gICAgICB4Y29mZi0+bW9kdHlwZSA9IGludGVybmFsX2EtPm9fbW9kdHlwZTsKLSAgICAgIHhjb2ZmLT5jcHV0eXBlID0gaW50ZXJuYWxfYS0+b19jcHV0eXBlOwotICAgICAgeGNvZmYtPm1heGRhdGEgPSBpbnRlcm5hbF9hLT5vX21heGRhdGE7Ci0gICAgICB4Y29mZi0+bWF4c3RhY2sgPSBpbnRlcm5hbF9hLT5vX21heHN0YWNrOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQVJNIAotICAvKiBTZXQgdGhlIGZsYWdzIGZpZWxkIGZyb20gdGhlIENPRkYgaGVhZGVyIHJlYWQgaW4gKi8KLSAgaWYgKCEgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgaW50ZXJuYWxfZi0+Zl9mbGFncykpCi0gICAgY29mZi0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gIAotI2lmZGVmIENPRkZfV0lUSF9QRQotICAvKiBGSVhNRTogSSdtIG5vdCBzdXJlIHRoaXMgaXMgZXZlciBleGVjdXRlZCwgc2luY2UgcGVpY29kZS5oCi0gICAgIGRlZmluZXMgY29mZl9ta29iamVjdF9ob29rLiAgKi8KLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCkgPT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfREVCVUc7Ci0jZW5kaWYKLQotICByZXR1cm4gKFBUUikgY29mZjsKLX0KLSNlbmRpZgotCi0vKiBEZXRlcm1pbmUgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLiAgRklYTUU6IFRoaXMgaXMgdGFyZ2V0Ci0gICBkZXBlbmRlbnQgYmVjYXVzZSB0aGUgbWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiB0aGUgdGFyZ2V0Ci0gICBkZXBlbmRlbnQgaGVhZGVyIGZpbGVzLiAgQnV0IHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgbmVlZCBmb3IgdGhpcy4KLSAgIElmIHRoZSBtYWdpYyBudW1iZXJzIHdlcmUgbW92ZWQgdG8gYSBzZXBhcmF0ZSBmaWxlLCB0aGlzIGZ1bmN0aW9uCi0gICB3b3VsZCBiZSB0YXJnZXQgaW5kZXBlbmRlbnQgYW5kIHdvdWxkIGFsc28gYmUgbXVjaCBtb3JlIHN1Y2Nlc3NmdWwKLSAgIGF0IGxpbmtpbmcgdG9nZXRoZXIgQ09GRiBmaWxlcyBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIGxvbmcgbWFjaGluZTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgbWFjaGluZSA9IDA7Ci0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0jaWZkZWYgUFBDTUFHSUMKLSAgICBjYXNlIFBQQ01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0gICAgICBtYWNoaW5lID0gMDsgLyogd2hhdCBkb2VzIHRoaXMgbWVhbj8gKGtyaykgKi8KLSAgICAgIGJyZWFrOyAKLSNlbmRpZgotI2lmZGVmIEkzODZNQUdJQwotICAgIGNhc2UgSTM4Nk1BR0lDOgotICAgIGNhc2UgSTM4NlBUWE1BR0lDOgotICAgIGNhc2UgSTM4NkFJWE1BR0lDOgkJLyogRGFuYnVyeSBQUy8yIEFJWCBDIENvbXBpbGVyICovCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgkvKiBzaGFkb3dzIHRoZSBtNjhrIEx5bnggbnVtYmVyIGJlbG93LCBzaWdoICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBMjlLX01BR0lDX0JJRwotICAgIGNhc2UgQTI5S19NQUdJQ19CSUc6Ci0gICAgY2FzZSBBMjlLX01BR0lDX0xJVFRMRToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSTU1BR0lDCi0gICAgY2FzZSBBUk1NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hcm07Ci0gICAgICBzd2l0Y2ggKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSykKLQl7Ci0gICAgICAgIGNhc2UgRl9BUk1fMjogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fMjsgIGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzJhOiBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzJhOyBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV8zOiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV8zOyAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNhc2UgRl9BUk1fM006IG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fM007IGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzQ6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzQ7ICBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV80VDogbWFjaGluZSA9IGJmZF9tYWNoX2FybV80VDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fNTogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fNTsgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM2OE1BR0lDCi0gICAgY2FzZSBNQzY4TUFHSUM6Ci0gICAgY2FzZSBNNjhNQUdJQzoKLSNpZmRlZiBNQzY4S0JDU01BR0lDCi0gICAgY2FzZSBNQzY4S0JDU01BR0lDOgotI2VuZGlmCi0jaWZkZWYgQVBPTExPTTY4S01BR0lDCi0gICAgY2FzZSBBUE9MTE9NNjhLTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBMWU5YQ09GRk1BR0lDCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgotI2VuZGlmCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE1DODhNQUdJQwotICAgIGNhc2UgTUM4OE1BR0lDOgotICAgIGNhc2UgTUM4OERNQUdJQzoKLSAgICBjYXNlIE1DODhPTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTg4azsKLSAgICAgIG1hY2hpbmUgPSA4ODEwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgWjhLTUFHSUMKLSAgICBjYXNlIFo4S01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3o4azsKLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfTUFDSE1BU0spCi0JewotCWNhc2UgRl9aODAwMToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF96ODAwMTsKLQkgIGJyZWFrOwotCWNhc2UgRl9aODAwMjoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF96ODAwMjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJODYwCi0gICAgY2FzZSBJODYwTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTg2MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSTk2MAotI2lmZGVmIEk5NjBST01BR0lDCi0gICAgY2FzZSBJOTYwUk9NQUdJQzoKLSAgICBjYXNlIEk5NjBSV01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2k5NjA7Ci0gICAgICBzd2l0Y2ggKEZfSTk2MFRZUEUgJiBpbnRlcm5hbF9mLT5mX2ZsYWdzKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgRl9JOTYwQ09SRToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MEtCOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2ME1DOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfbWM7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MFhBOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfeGE7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MENBOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY2E7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MEtBOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Ffc2E7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MEpYOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfang7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MEhYOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfaHg7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICBjYXNlIFU4MDJST01BR0lDOgotICAgIGNhc2UgVTgwMldSTUFHSUM6Ci0gICAgY2FzZSBVODAyVE9DTUFHSUM6Ci0gICAgICB7Ci0JaW50IGNwdXR5cGU7Ci0KLQlpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgIT0gLTEpCi0JICBjcHV0eXBlID0geGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgJiAweGZmOwotCWVsc2UKLQkgIHsKLQkgICAgLyogV2UgZGlkIG5vdCBnZXQgYSB2YWx1ZSBmcm9tIHRoZSBhLm91dCBoZWFkZXIuICBJZiB0aGUKLQkgICAgICAgZmlsZSBoYXMgbm90IGJlZW4gc3RyaXBwZWQsIHdlIG1heSBiZSBhYmxlIHRvIGdldCB0aGUKLQkgICAgICAgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpcnN0IHN5bWJvbCwgaWYgaXQKLQkgICAgICAgaXMgYSAuZmlsZSBzeW1ib2wuICAqLwotCSAgICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID09IDApCi0JICAgICAgY3B1dHlwZSA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWJmZF9ieXRlIGJ1ZltTWU1FU1pdOwotCQlzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotCQlpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JCSAgICB8fCBiZmRfcmVhZCAoYnVmLCAxLCBTWU1FU1osIGFiZmQpICE9IFNZTUVTWikKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGJ1ZiwgKFBUUikgJnN5bSk7Ci0JCWlmIChzeW0ubl9zY2xhc3MgPT0gQ19GSUxFKQotCQkgIGNwdXR5cGUgPSBzeW0ubl90eXBlICYgMHhmZjsKLQkJZWxzZQotCQkgIGNwdXR5cGUgPSAwOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIEZJWE1FOiBXZSBkb24ndCBoYW5kbGUgYWxsIGNhc2VzIGhlcmUuICAqLwotCXN3aXRjaCAoY3B1dHlwZSkKLQkgIHsKLQkgIGRlZmF1bHQ6Ci0JICBjYXNlIDA6Ci0jaWZkZWYgUE9XRVJNQUMKLQkgICAgLyogUG93ZXJQQyBNYWNzIHVzZSB0aGUgc2FtZSBtYWdpYyBudW1iZXJzIGFzIFJTLzYwMDAKLQkgICAgICAgKGJlY2F1c2UgdGhhdCdzIGhvdyB0aGV5IHdlcmUgYm9vdHN0cmFwcGVkIG9yaWdpbmFsbHkpLAotCSAgICAgICBidXQgdGhleSBhcmUgYWx3YXlzIFBvd2VyUEMgYXJjaGl0ZWN0dXJlLiAgKi8KLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSAwOwotI2Vsc2UKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLQkgICAgbWFjaGluZSA9IDYwMDA7Ci0jZW5kaWYgLyogUE9XRVJNQUMgKi8KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSA2MDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOiAvKiA2NCBiaXQgUG93ZXJQQyAqLwotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDYyMDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gMDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIGFyY2ggPSBiZmRfYXJjaF9yczYwMDA7Ci0JICAgIG1hY2hpbmUgPSA2MDAwOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBXRTMyS01BR0lDCi0gICAgY2FzZSBXRTMyS01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3dlMzJrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDgzMDBNQUdJQwotICAgIGNhc2UgSDgzMDBNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODMwMDsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9oODMwMDsKLSAgICAgIC8qICEhIEZJWE1FIHRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4MzAwSE1BR0lDCi0gICAgY2FzZSBIODMwMEhNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODMwMDsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9oODMwMGg7Ci0gICAgICAvKiAhISBGSVhNRSB0aGlzIHByb2JhYmx5IGlzbid0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODMwMFNNQUdJQwotICAgIGNhc2UgSDgzMDBTTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaDgzMDA7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfaDgzMDBzOwotICAgICAgLyogISEgRklYTUUgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgKi8KLSAgICAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU0hfQVJDSF9NQUdJQ19CSUcKLSAgICBjYXNlIFNIX0FSQ0hfTUFHSUNfQklHOgotICAgIGNhc2UgU0hfQVJDSF9NQUdJQ19MSVRUTEU6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc2g7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODUwME1BR0lDCi0gICAgY2FzZSBIODUwME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4NTAwOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU1BBUkNNQUdJQwotICAgIGNhc2UgU1BBUkNNQUdJQzoKLSNpZmRlZiBMWU5YQ09GRk1BR0lDCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgotI2VuZGlmCi0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUMzME1BR0lDCi0gICAgY2FzZSBUSUMzME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3RpYzMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFRJQzgwX0FSQ0hfTUFHSUMKLSAgICBjYXNlIFRJQzgwX0FSQ0hfTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfdGljODA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgTUNPUkVNQUdJQwotICAgIGNhc2UgTUNPUkVNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tY29yZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoJCQkvKiBVbnJlYWRhYmxlIGlucHV0IGZpbGUgdHlwZSAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgU1lNTkFNRV9JTl9ERUJVRwotCi1zdGF0aWMgYm9vbGVhbiBzeW1uYW1lX2luX2RlYnVnX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotc3ltbmFtZV9pbl9kZWJ1Z19ob29rIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotewotICByZXR1cm4gU1lNTkFNRV9JTl9ERUJVRyAoc3ltKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2Vsc2UKLQotI2RlZmluZSBzeW1uYW1lX2luX2RlYnVnX2hvb2sgXAotICAoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpKSBiZmRfZmFsc2UKLQotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQotLyogSGFuZGxlIHRoZSBjc2VjdCBhdXhlbnQgb2YgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotewotICBpbnQgY2xhc3MgPSBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzOwotCi0gIGlmICgoY2xhc3MgPT0gQ19FWFQgfHwgY2xhc3MgPT0gQ19ISURFWFQpCi0gICAgICAmJiBpbmRhdXggKyAxID09IHN5bWJvbC0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgaWYgKFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCkgPT0gWFRZX0xEKQotCXsKLQkgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wID0KLQkgICAgdGFibGVfYmFzZSArIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgYXV4LT5maXhfc2NubGVuID0gMTsKLQl9Ci0KLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgbm90IGRvIGFueQotICAgICAgICAgZnVydGhlciB3b3JrIG9uIHRoaXMgYXV4ZW50LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF1eGVudCBzaG91bGQgYmUgaGFuZGxlZCBieQotICAgICB0aGUgY2FsbGVyLiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jZWxzZQotI2lmZGVmIEk5NjAKLQotLyogV2UgZG9uJ3Qgd2FudCB0byBwb2ludGVyaXplIGJhbCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29mZl9wb2ludGVyaXplX2F1eF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICB1bnNpZ25lZCBpbnQsIGNvbWJpbmVkX2VudHJ5X3R5cGUgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFJldHVybiB0cnVlIGlmIHdlIGRvbid0IHdhbnQgdG8gcG9pbnRlcml6ZSB0aGlzIGF1eCBlbnRyeSwgd2hpY2gKLSAgICAgaXMgdGhlIGNhc2UgZm9yIHRoZSBsYXN0Zmlyc3QgYXV4IGVudHJ5IGZvciBhIENfTEVBRlBST0Mgc3ltYm9sLiAgKi8KLSAgcmV0dXJuIChpbmRhdXggPT0gMQotCSAgJiYgKHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGUFJPQwotCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGU1RBVAotCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGRVhUKSk7Ci19Ci0KLSNlbHNlIC8qICEgSTk2MCAqLwotCi0jZGVmaW5lIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAwCi0KLSNlbmRpZiAvKiAhIEk5NjAgKi8KLSNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLwotCi0vKiBQcmludCBhbiBhdXggZW50cnkuICBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBoYXMgcHJpbnRlZCBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcHJpbnRfYXV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBGSUxFICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgdW5zaWduZWQgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3ByaW50X2F1eCAoYWJmZCwgZmlsZSwgdGFibGVfYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEZJTEUgKmZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKChzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRVhUCi0gICAgICAgfHwgc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLSAgICAgICYmIGluZGF1eCArIDEgPT0gc3ltYm9sLT51LnN5bWVudC5uX251bWF1eCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY3NlY3QgZW50cnkuICAqLwotICAgICAgZnByaW50ZiAoZmlsZSwgIkFVWCAiKTsKLSAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApICE9IFhUWV9MRCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGF1eC0+Zml4X3Njbmxlbik7Ci0JICBmcHJpbnRmIChmaWxlLCAidmFsICU1bGQiLCBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKGZpbGUsICJpbmR4ICIpOwotCSAgaWYgKCEgYXV4LT5maXhfc2NubGVuKQotCSAgICBmcHJpbnRmIChmaWxlLCAiJTRsZCIsIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkgIGVsc2UKLQkgICAgZnByaW50ZiAoZmlsZSwgIiU0bGQiLAotCQkgICAgIChsb25nKSAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLnAgLSB0YWJsZV9iYXNlKSk7Ci0JfQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgIiBwcm1oc2ggJWxkIHNuaHNoICV1IHR5cCAlZCBhbGduICVkIGNsc3MgJXUgc3RiICVsZCBzbnN0YiAldSIsCi0JICAgICAgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Bhcm1oYXNoLAotCSAgICAgICAodW5zaWduZWQgaW50KSBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbmhhc2gsCi0JICAgICAgIFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCi0JICAgICAgIFNNVFlQX0FMSUdOIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtY2xhcywKLQkgICAgICAgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc3RhYiwKLQkgICAgICAgKHVuc2lnbmVkIGludCkgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc25zdGFiKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHNwZWNpYWwgYWN0aW9uIHdhcyB0YWtlbi4gICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlXcml0aW5nIHJlbG9jYXRpb25zCi0KLQlUbyB3cml0ZSByZWxvY2F0aW9ucywgdGhlIGJhY2sgZW5kIHN0ZXBzIHRob3VnaCB0aGUKLQljYW5vbmljYWwgcmVsb2NhdGlvbiB0YWJsZSBhbmQgY3JlYXRlIGFuCi0JQGNvZGV7aW50ZXJuYWxfcmVsb2N9LiBUaGUgc3ltYm9sIGluZGV4IHRvIHVzZSBpcyByZW1vdmVkIGZyb20KLQl0aGUgQGNvZGV7b2Zmc2V0fSBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIHN1cHBsaWVkLiAgVGhlCi0JYWRkcmVzcyBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBzdW0gb2YgdGhlIHNlY3Rpb24gYmFzZQotCWFkZHJlc3MgYW5kIHRoZSByZWxvY2F0aW9uIG9mZnNldDsgdGhlIHR5cGUgaXMgZHVnIGRpcmVjdGx5Ci0JZnJvbSB0aGUgaG93dG8gZmllbGQuICBUaGVuIHRoZSBAY29kZXtpbnRlcm5hbF9yZWxvY30gaXMKLQlzd2FwcGVkIGludG8gdGhlIHNoYXBlIG9mIGFuIEBjb2Rle2V4dGVybmFsX3JlbG9jfSBhbmQgd3JpdHRlbgotCW91dCB0byBkaXNrLgotCi0qLwotCi0jaWZkZWYgVEFSR19BVVgKLQotc3RhdGljIGludCBjb21wYXJlX2FyZWxlbnRfcHRyIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIEFVWCdzIGxkIHdhbnRzIHJlbG9jYXRpb25zIHRvIGJlIHNvcnRlZCAqLwotc3RhdGljIGludAotY29tcGFyZV9hcmVsZW50X3B0ciAoeCwgeSkKLSAgICAgY29uc3QgUFRSIHg7Ci0gICAgIGNvbnN0IFBUUiB5OwotewotICBjb25zdCBhcmVsZW50ICoqYSA9IChjb25zdCBhcmVsZW50ICoqKSB4OwotICBjb25zdCBhcmVsZW50ICoqYiA9IChjb25zdCBhcmVsZW50ICoqKSB5OwotICBiZmRfc2l6ZV90eXBlIGFhZHIgPSAoKmEpLT5hZGRyZXNzOwotICBiZmRfc2l6ZV90eXBlIGJhZHIgPSAoKmIpLT5hZGRyZXNzOwotCi0gIHJldHVybiAoYWFkciA8IGJhZHIgPyAtMSA6IGJhZHIgPCBhYWRyID8gMSA6IDApOwotfQotCi0jZW5kaWYgLyogVEFSR19BVVggKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfcmVsb2NzIChhYmZkLCBmaXJzdF91bmRlZikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgaW50IGZpcnN0X3VuZGVmOwotewotICBhc2VjdGlvbiAqczsKLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgZHN0OwotICAgICAgYXJlbGVudCAqKnA7Ci0KLSNpZm5kZWYgVEFSR19BVVgKLSAgICAgIHAgPSBzLT5vcmVsb2NhdGlvbjsKLSNlbHNlCi0gICAgICAvKiBzb3J0IHJlbG9jYXRpb25zIGJlZm9yZSB3ZSB3cml0ZSB0aGVtIG91dCAqLwotICAgICAgcCA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICBpZiAocCA9PSBOVUxMICYmIHMtPnJlbG9jX2NvdW50ID4gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1jcHkgKHAsIHMtPm9yZWxvY2F0aW9uLCBzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICBxc29ydCAocCwgcy0+cmVsb2NfY291bnQsIHNpemVvZiAoYXJlbGVudCAqKSwgY29tcGFyZV9hcmVsZW50X3B0cik7Ci0jZW5kaWYKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIG47Ci0JICBhcmVsZW50ICpxID0gcFtpXTsKLQkgIG1lbXNldCAoKFBUUikgJiBuLCAwLCBzaXplb2YgKG4pKTsKLQotCSAgLyogTm93IHdlJ3ZlIHJlbnVtYmVyZWQgdGhlIHN5bWJvbHMgd2Uga25vdyB3aGVyZSB0aGUKLQkgICAgIHVuZGVmaW5lZCBzeW1ib2xzIGxpdmUgaW4gdGhlIHRhYmxlLiAgQ2hlY2sgdGhlIHJlbG9jCi0JICAgICBlbnRyaWVzIGZvciBzeW1ib2xzIHdobydzIG91dHB1dCBiZmQgaXNuJ3QgdGhlIHJpZ2h0IG9uZS4KLQkgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQgKHdoaWNoIG1lYW5zCi0JICAgICB0aGF0IGFsbCB0aGUgcG9pbnRlcnMgYXJlIG5ldmVyIG1hZGUgdG8gcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHBsYWNlKS4gVGhpcyBpcyBhIGJhZCB0aGluZywnY2F1c2UgdGhlIHN5bWJvbHMgYXR0YWNoZWQKLQkgICAgIHRvIHRoZSBvdXRwdXQgYmZkIGFyZSBpbmRleGVkLCBzbyB0aGF0IHRoZSByZWxvY2F0aW9uCi0JICAgICBlbnRyaWVzIGtub3cgd2hpY2ggc3ltYm9sIGluZGV4IHRoZXkgcG9pbnQgdG8uICBTbyB3ZQotCSAgICAgaGF2ZSB0byBsb29rIHVwIHRoZSBvdXRwdXQgc3ltYm9sIGhlcmUuICovCi0KLQkgIGlmIChxLT5zeW1fcHRyX3B0clswXS0+dGhlX2JmZCAhPSBhYmZkKQotCSAgICB7Ci0JICAgICAgaW50IGk7Ci0JICAgICAgY29uc3QgY2hhciAqc25hbWUgPSBxLT5zeW1fcHRyX3B0clswXS0+bmFtZTsKLQkgICAgICBhc3ltYm9sICoqb3V0c3ltcyA9IGFiZmQtPm91dHN5bWJvbHM7Ci0JICAgICAgZm9yIChpID0gZmlyc3RfdW5kZWY7IG91dHN5bXNbaV07IGkrKykKLQkJewotCQkgIGNvbnN0IGNoYXIgKmludGFibGUgPSBvdXRzeW1zW2ldLT5uYW1lOwotCQkgIGlmIChzdHJjbXAgKGludGFibGUsIHNuYW1lKSA9PSAwKSB7Ci0JCSAgICAvKiBnb3QgYSBoaXQsIHNvIHJlcG9pbnQgdGhlIHJlbG9jICovCi0JCSAgICBxLT5zeW1fcHRyX3B0ciA9IG91dHN5bXMgKyBpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQl9Ci0JICAgIH0KLQotCSAgbi5yX3ZhZGRyID0gcS0+YWRkcmVzcyArIHMtPnZtYTsKLQotI2lmZGVmIFJfSUhDT05TVAotCSAgLyogVGhlIDI5ayBjb25zdC9jb25zdGggcmVsb2MgcGFpciBpcyBhIHJlYWwga2x1ZGdlLiAgVGhlIGNvbnN0aAotCSAgICAgcGFydCBkb2Vzbid0IGhhdmUgYSBzeW1ib2w7IGl0IGhhcyBhbiBvZmZzZXQuICBTbyByZWJ1aWx0Ci0JICAgICB0aGF0IGhlcmUuICAqLwotCSAgaWYgKHEtPmhvd3RvLT50eXBlID09IFJfSUhDT05TVCkKLQkgICAgbi5yX3N5bW5keCA9IHEtPmFkZGVuZDsKLQkgIGVsc2UKLSNlbmRpZgotCSAgICBpZiAocS0+c3ltX3B0cl9wdHIpCi0JICAgICAgewotCQlpZiAocS0+c3ltX3B0cl9wdHIgPT0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHIpCi0JCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGFic29sdXRlIHN5bWJvbC4gICovCi0JCSAgbi5yX3N5bW5keCA9IC0xOwotCQllbHNlCi0JCSAgewotCQkgICAgbi5yX3N5bW5keCA9IGdldF9pbmRleCAoKCoocS0+c3ltX3B0cl9wdHIpKSk7Ci0JCSAgICAvKiBUYWtlIG5vdGljZSBpZiB0aGUgc3ltYm9sIHJlbG9jIHBvaW50cyB0byBhIHN5bWJvbAotCQkgICAgICAgd2UgZG9uJ3QgaGF2ZSBpbiBvdXIgc3ltYm9sIHRhYmxlLiAgV2hhdCBzaG91bGQgd2UKLQkJICAgICAgIGRvIGZvciB0aGlzPz8gICovCi0JCSAgICBpZiAobi5yX3N5bW5keCA+IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQotCQkgICAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgICAgfQotCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCi0JICBuLnJfb2Zmc2V0ID0gcS0+YWRkZW5kOwotI2VuZGlmCi0KLSNpZmRlZiBTRUxFQ1RfUkVMT0MKLQkgIC8qIFdvcmsgb3V0IHJlbG9jIHR5cGUgZnJvbSB3aGF0IGlzIHJlcXVpcmVkICovCi0JICBTRUxFQ1RfUkVMT0MgKG4sIHEtPmhvd3RvKTsKLSNlbHNlCi0JICBuLnJfdHlwZSA9IHEtPmhvd3RvLT50eXBlOwotI2VuZGlmCi0JICBjb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmbiwgJmRzdCk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIGRzdCwgMSwgUkVMU1osIGFiZmQpICE9IFJFTFNaKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgVEFSR19BVVgKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JZnJlZSAocCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCBmbGFncyBhbmQgbWFnaWMgbnVtYmVyIG9mIGEgY29mZiBmaWxlIGZyb20gYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lCi0gICB0eXBlLiAgUmVzdWx0IGlzIHRydWUgaWYgd2UgY2FuIHJlcHJlc2VudCB0aGUgYXJjaCZ0eXBlLCBmYWxzZSBpZiBub3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfZmxhZ3MgKGFiZmQsIG1hZ2ljcCwgZmxhZ3NwKQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgKm1hZ2ljcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBzaG9ydCAqZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0jaWZkZWYgWjhLTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3o4azoKLSAgICAgICptYWdpY3AgPSBaOEtNQUdJQzsKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF96ODAwMToKLQkgICpmbGFnc3AgPSBGX1o4MDAxOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF96ODAwMjoKLQkgICpmbGFnc3AgPSBGX1o4MDAyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIEk5NjBST01BR0lDCi0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0KLSAgICAgIHsKLQl1bnNpZ25lZCBmbGFnczsKLQkqbWFnaWNwID0gSTk2MFJPTUFHSUM7Ci0JLyoKLQkgICgoYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICYgV1BfVEVYVCkgPyBJOTYwUk9NQUdJQyA6Ci0JICBJOTYwUldNQUdJQyk7ICAgRklYTUU/Pz8KLQkgICovCi0Jc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCSAgewotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0JICAgIGZsYWdzID0gRl9JOTYwQ09SRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0JICAgIGZsYWdzID0gRl9JOTYwS0I7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotCSAgICBmbGFncyA9IEZfSTk2ME1DOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLQkgICAgZmxhZ3MgPSBGX0k5NjBYQTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0JICAgIGZsYWdzID0gRl9JOTYwQ0E7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotCSAgICBmbGFncyA9IEZfSTk2MEtBOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLQkgICAgZmxhZ3MgPSBGX0k5NjBKWDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0JICAgIGZsYWdzID0gRl9JOTYwSFg7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSpmbGFnc3AgPSBmbGFnczsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUMzME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgICptYWdpY3AgPSBUSUMzME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBUSUM4MF9BUkNIX01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF90aWM4MDoKLSAgICAgICptYWdpY3AgPSBUSUM4MF9BUkNIX01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBBUk1NQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgICAgKiBtYWdpY3AgPSBBUk1NQUdJQzsKLSAgICAgICogZmxhZ3NwID0gMDsKLSAgICAgIGlmIChBUENTX1NFVCAoYWJmZCkpCi0JewotCSAgaWYgKEFQQ1NfMjZfRkxBRyAoYWJmZCkpCi0JICAgICogZmxhZ3NwIHw9IEZfQVBDUzI2OwotCSAgCi0JICBpZiAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSkKLQkgICAgKiBmbGFnc3AgfD0gRl9BUENTX0ZMT0FUOwotCSAgCi0JICBpZiAoUElDX0ZMQUcgKGFiZmQpKQotCSAgICAqIGZsYWdzcCB8PSBGX1BJQzsKLQl9Ci0gICAgICBpZiAoSU5URVJXT1JLX1NFVCAoYWJmZCkgJiYgSU5URVJXT1JLX0ZMQUcgKGFiZmQpKQotCSogZmxhZ3NwIHw9IEZfSU5URVJXT1JLOwotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2FybV8yOiAgKiBmbGFnc3AgfD0gRl9BUk1fMjsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzJhOiAqIGZsYWdzcCB8PSBGX0FSTV8yYTsgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fMzogICogZmxhZ3NwIHw9IEZfQVJNXzM7ICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV8zTTogKiBmbGFnc3AgfD0gRl9BUk1fM007IGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzQ6ICAqIGZsYWdzcCB8PSBGX0FSTV80OyAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fNFQ6ICogZmxhZ3NwIHw9IEZfQVJNXzRUOyBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV81OiAgKiBmbGFnc3AgfD0gRl9BUk1fNTsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzVUOiAqIGZsYWdzcCB8PSBGX0FSTV81OyAgYnJlYWs7IC8qIFhYWCAtIHdlIGRvIG5vdCBoYXZlIGFuIEZfQVJNXzVUICovCi0JfQotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBQUENNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgICptYWdpY3AgPSBQUENNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJMzg2TUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICAqbWFnaWNwID0gSTM4Nk1BR0lDOwotI2lmZGVmIExZTlhPUwotICAgICAgLyogSnVzdCBvdmVyd3JpdGUgdGhlIHVzdWFsIHZhbHVlIGlmIHdlJ3JlIGRvaW5nIEx5bnguICovCi0gICAgICAqbWFnaWNwID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEk4NjBNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaTg2MDoKLSAgICAgICptYWdpY3AgPSBJODYwTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM2OE1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotI2lmZGVmIEFQT0xMT002OEtNQUdJQwotICAgICAgKm1hZ2ljcCA9IEFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSOwotI2Vsc2UKLSAgICAgIC8qIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSBtYXkgYmUgZGVmaW5lZCBieSBjb2ZmLXU2OGsuYy4gICovCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICAgICAqbWFnaWNwID0gTUM2OEtCQ1NNQUdJQzsKLSNlbHNlCi0gICAgICAqbWFnaWNwID0gTUM2OE1BR0lDOwotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBMWU5YT1MKLSAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLwotICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DODhNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgICptYWdpY3AgPSBNQzg4T01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEg4MzAwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2g4MzAwOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2g4MzAwOgotCSAgKm1hZ2ljcCA9IEg4MzAwTUFHSUM7Ci0JICByZXR1cm4gdHJ1ZTsKLQljYXNlIGJmZF9tYWNoX2g4MzAwaDoKLQkgICptYWdpY3AgPSBIODMwMEhNQUdJQzsKLQkgIHJldHVybiB0cnVlOwotCWNhc2UgYmZkX21hY2hfaDgzMDBzOgotCSAgKm1hZ2ljcCA9IEg4MzAwU01BR0lDOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNIX0FSQ0hfTUFHSUNfQklHCi0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JKm1hZ2ljcCA9IFNIX0FSQ0hfTUFHSUNfQklHOwotICAgICAgZWxzZQotCSptYWdpY3AgPSBTSF9BUkNIX01BR0lDX0xJVFRMRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNQQVJDTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgKm1hZ2ljcCA9IFNQQVJDTUFHSUM7Ci0jaWZkZWYgTFlOWE9TCi0gICAgICAvKiBKdXN0IG92ZXJ3cml0ZSB0aGUgdXN1YWwgdmFsdWUgaWYgd2UncmUgZG9pbmcgTHlueC4gKi8KLSAgICAgICptYWdpY3AgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODUwME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9oODUwMDoKLSAgICAgICptYWdpY3AgPSBIODUwME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEEyOUtfTUFHSUNfQklHCi0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQkqbWFnaWNwID0gQTI5S19NQUdJQ19CSUc7Ci0gICAgICBlbHNlCi0JKm1hZ2ljcCA9IEEyOUtfTUFHSUNfTElUVExFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgV0UzMktNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfd2UzMms6Ci0gICAgICAqbWFnaWNwID0gV0UzMktNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFU4MDJUT0NNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotI2lmbmRlZiBQUENNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSNlbmRpZgotICAgICAgKm1hZ2ljcCA9IFU4MDJUT0NNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DT1JFTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX21jb3JlOgotICAgICAgKiBtYWdpY3AgPSBNQ09SRU1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSAgICAgIAotICAgIGRlZmF1bHQ6CQkJLyogVW5rbm93biBhcmNoaXRlY3R1cmUgKi8KLSAgICAgIC8qIHJldHVybiBmYWxzZTsgIC0tIGZhbGwgdGhyb3VnaCB0byAicmV0dXJuIGZhbHNlIiBiZWxvdywgdG8gYXZvaWQKLSAgICAgICAic3RhdGVtZW50IG5ldmVyIHJlYWNoZWQiIGVycm9ycyBvbiB0aGUgb25lIGJlbG93LiAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICB1bnNpZ25lZCBkdW1teTE7Ci0gIHVuc2lnbmVkIHNob3J0IGR1bW15MjsKLQotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93biAmJgotICAgICAgY29mZl9zZXRfZmxhZ3MgKGFiZmQsICZkdW1teTEsICZkdW1teTIpICE9IHRydWUpCi0gICAgcmV0dXJuIGZhbHNlOwkJLyogV2UgY2FuJ3QgcmVwcmVzZW50IHRoaXMgdHlwZSAqLwotCi0gIHJldHVybiB0cnVlOwkJCS8qIFdlJ3JlIGVhc3kgLi4uICovCi19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogVGhpcyBpcyB1c2VkIHRvIHNvcnQgc2VjdGlvbnMgYnkgVk1BLCBhcyByZXF1aXJlZCBieSBQRSBpbWFnZQotICAgZmlsZXMuICAqLwotCi1zdGF0aWMgaW50IHNvcnRfYnlfc2VjYWRkciBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1zb3J0X2J5X3NlY2FkZHIgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKmEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqYiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0KLSAgaWYgKGEtPnZtYSA8IGItPnZtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGEtPnZtYSA+IGItPnZtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09GRl9JTUFHRV9XSVRIX1BFICovCi0KLS8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbiBmb3IgZWFjaCBzZWN0aW9uLiAqLwotCi0jaWZuZGVmIEk5NjAKLSNkZWZpbmUgQUxJR05fU0VDVElPTlNfSU5fRklMRQotI2VuZGlmCi0jaWZkZWYgVElDODBDT0ZGCi0jdW5kZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGFzZWN0aW9uICpwcmV2aW91cyA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBmaWxlX3B0ciBzb2ZhciA9IEZJTEhTWjsKLSAgYm9vbGVhbiBhbGlnbl9hZGp1c3Q7Ci0jaWZkZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotICBmaWxlX3B0ciBvbGRfc29mYXI7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAvKiBPbiBYQ09GRiwgaWYgd2UgaGF2ZSBzeW1ib2xzLCBzZXQgdXAgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN6OwotICAgICAgYmZkX3NpemVfdHlwZSBpLCBzeW1jb3VudDsKLSAgICAgIGFzeW1ib2wgKipzeW1wOwotCi0gICAgICBzeiA9IDA7Ci0gICAgICBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgICAgZm9yIChzeW1wID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBzeW1jb3VudDsgc3ltcCsrLCBpKyspCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSAqY2Y7Ci0KLQkgIGNmID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgKnN5bXApOwotCSAgaWYgKGNmICE9IE5VTEwKLQkgICAgICAmJiBjZi0+bmF0aXZlICE9IE5VTEwKLQkgICAgICAmJiBTWU1OQU1FX0lOX0RFQlVHICgmY2YtPm5hdGl2ZS0+dS5zeW1lbnQpKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoKnN5bXApKTsKLQkgICAgICBpZiAobGVuID4gU1lNTk1MRU4pCi0JCXN6ICs9IGxlbiArIDM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3ogPiAwKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRlYnVnIik7Ci0JICBpZiAoZHNlYyA9PSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQkgIGRzZWMtPl9yYXdfc2l6ZSA9IHN6OwotCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgaW50IHBhZ2Vfc2l6ZTsKLSAgaWYgKGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbykgCi0gICAgewotICAgICAgcGFnZV9zaXplID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5GaWxlQWxpZ25tZW50OwotICAgIH0KLSAgZWxzZQotICAgIHBhZ2Vfc2l6ZSA9IFBFX0RFRl9GSUxFX0FMSUdOTUVOVDsKLSNlbHNlCi0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgaW50IHBhZ2Vfc2l6ZSA9IENPRkZfUEFHRV9TSVpFOwotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiAgQSBzdGFydCBhZGRyZXNzIG1heSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGZpbGUuIEluIHRoaXMKLQkgIGNhc2UgaXQgd2lsbCBuZWVkIGFuIG9wdGlvbmFsIGhlYWRlciB0byByZWNvcmQgaXQuICAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgc29mYXIgKz0gQU9VVFNaOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNvZmFyICs9IEFPVVRTWjsKLSAgZWxzZQotICAgIHNvZmFyICs9IFNNQUxMX0FPVVRTWjsKLSNlbmRpZgotCi0gIHNvZmFyICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBTQ05IU1o7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgYWxsb2NhdGluZyBhIG5ldyBzZWN0aW9uIGhlYWRlciB0byBob2xkIHRoZSBjb3JyZWN0IGNvdW50cy4gICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLSAgICAgIHNvZmFyICs9IFNDTkhTWjsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIHsKLSAgICAvKiBQRSByZXF1aXJlcyB0aGUgc2VjdGlvbnMgdG8gYmUgaW4gbWVtb3J5IG9yZGVyIHdoZW4gbGlzdGVkIGluCi0gICAgICAgdGhlIHNlY3Rpb24gaGVhZGVycy4gIEl0IGFsc28gZG9lcyBub3QgbGlrZSBlbXB0eSBsb2FkYWJsZQotICAgICAgIHNlY3Rpb25zLiAgVGhlIHNlY3Rpb25zIGFwcGFyZW50bHkgZG8gbm90IGhhdmUgdG8gYmUgaW4gdGhlCi0gICAgICAgcmlnaHQgb3JkZXIgaW4gdGhlIGltYWdlIGZpbGUgaXRzZWxmLCBidXQgd2UgZG8gbmVlZCB0byBnZXQgdGhlCi0gICAgICAgdGFyZ2V0X2luZGV4IHZhbHVlcyByaWdodC4gICovCi0KLSAgICBpbnQgY291bnQ7Ci0gICAgYXNlY3Rpb24gKipzZWN0aW9uX2xpc3Q7Ci0gICAgaW50IGk7Ci0gICAgaW50IHRhcmdldF9pbmRleDsKLQotICAgIGNvdW50ID0gMDsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgICsrY291bnQ7Ci0KLSAgICAvKiBXZSBhbGxvY2F0ZSBhbiBleHRyYSBjZWxsIHRvIHNpbXBsaWZ5IHRoZSBmaW5hbCBsb29wLiAgKi8KLSAgICBzZWN0aW9uX2xpc3QgPSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBhc2VjdGlvbiAqKSAqIChjb3VudCArIDEpKTsKLSAgICBpZiAoc2VjdGlvbl9saXN0ID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpID0gMDsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgIHsKLQlzZWN0aW9uX2xpc3RbaV0gPSBjdXJyZW50OwotCSsraTsKLSAgICAgIH0KLSAgICBzZWN0aW9uX2xpc3RbaV0gPSBOVUxMOwotCi0gICAgcXNvcnQgKHNlY3Rpb25fbGlzdCwgY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksIHNvcnRfYnlfc2VjYWRkcik7Ci0KLSAgICAvKiBSZXRocmVhZCB0aGUgbGlua2VkIGxpc3QgaW50byBzb3J0ZWQgb3JkZXI7IGF0IHRoZSBzYW1lIHRpbWUsCi0gICAgICAgYXNzaWduIHRhcmdldF9pbmRleCB2YWx1ZXMuICAqLwotICAgIHRhcmdldF9pbmRleCA9IDE7Ci0gICAgYWJmZC0+c2VjdGlvbnMgPSBzZWN0aW9uX2xpc3RbMF07Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICB7Ci0JY3VycmVudCA9IHNlY3Rpb25fbGlzdFtpXTsKLQljdXJyZW50LT5uZXh0ID0gc2VjdGlvbl9saXN0W2kgKyAxXTsKLQotCS8qIExhdGVyLCBpZiB0aGUgc2VjdGlvbiBoYXMgemVybyBzaXplLCB3ZSdsbCBiZSB0aHJvd2luZyBpdAotCSAgIGF3YXksIHNvIHdlIGRvbid0IHdhbnQgdG8gbnVtYmVyIGl0IG5vdy4gIE5vdGUgdGhhdCBoYXZpbmcKLQkgICBhIHplcm8gc2l6ZSBhbmQgaGF2aW5nIHJlYWwgY29udGVudHMgYXJlIGRpZmZlcmVudAotCSAgIGNvbmNlcHRzOiAuYnNzIGhhcyBubyBjb250ZW50cywgYnV0ICh1c3VhbGx5KSBub24temVybwotCSAgIHNpemUuICAqLwotCWlmIChjdXJyZW50LT5fcmF3X3NpemUgPT0gMCkKLQkgIHsKLQkgICAgLyogRGlzY2FyZC4gIEhvd2V2ZXIsIGl0IHN0aWxsIG1pZ2h0IGhhdmUgKHZhbGlkKSBzeW1ib2xzCi0JICAgICAgIGluIGl0LCBzbyBhcmJpdHJhcmlseSBzZXQgaXQgdG8gc2VjdGlvbiAxIChpbmRleGluZyBpcwotCSAgICAgICAxLWJhc2VkIGhlcmU7IHVzdWFsbHkgLnRleHQpLiAgX19lbmRfXyBhbmQgb3RoZXIKLQkgICAgICAgY29udGVudHMgb2YgLmVuZHNlY3Rpb24gcmVhbGx5IGhhdmUgdGhpcyBoYXBwZW4uCi0JICAgICAgIEZJWE1FOiBUaGlzIHNlZW1zIHNvbWV3aGF0IGR1YmlvdXMuICAqLwotCSAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSAxOwotCSAgfQotCWVsc2UKLQkgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IHRhcmdldF9pbmRleCsrOwotICAgICAgfQotCi0gICAgZnJlZSAoc2VjdGlvbl9saXN0KTsKLSAgfQotI2Vsc2UgLyogISBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLSAgewotICAgIC8qIFNldCB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkLiAgKi8KLSAgICBpbnQgdGFyZ2V0X2luZGV4OwotCi0gICAgdGFyZ2V0X2luZGV4ID0gMTsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IHRhcmdldF9pbmRleCsrOwotICB9Ci0jZW5kaWYgLyogISBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQotICBhbGlnbl9hZGp1c3QgPSBmYWxzZTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBXaXRoIFBFIHdlIGhhdmUgdG8gcGFkIGVhY2ggc2VjdGlvbiB0byBiZSBhIG11bHRpcGxlIG9mIGl0cwotCSBwYWdlIHNpemUgdG9vLCBhbmQgcmVtZW1iZXIgYm90aCBzaXplcy4gICovCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpID09IE5VTEwpCi0JewotCSAgY3VycmVudC0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjdXJyZW50LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpID09IE5VTEwpCi0JewotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT50ZGF0YSA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT50ZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemUgPT0gMCkKLQlwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplID0gY3VycmVudC0+X3Jhd19zaXplOwotI2VuZGlmCi0KLSAgICAgIC8qIE9ubHkgZGVhbCB3aXRoIHNlY3Rpb25zIHdoaWNoIGhhdmUgY29udGVudHMuICAqLwotICAgICAgaWYgKCEoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSkKLQljb250aW51ZTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogTWFrZSBzdXJlIHdlIHNraXAgZW1wdHkgc2VjdGlvbnMgaW4gYSBQRSBpbWFnZS4gICovCi0gICAgICBpZiAoY3VycmVudC0+X3Jhd19zaXplID09IDApCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCi0JIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICBJOTYwIGRvZXNuJ3QKLQkgZG8gdGhpcyAoRklYTUUpIHNvIHdlIGNhbiBzdGF5IGluIHN5bmMgd2l0aCBJbnRlbC4gIDk2MAotCSBkb2Vzbid0IHlldCBwYWdlIGZyb20gZmlsZXMuLi4gKi8KLSNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQotCXsKLQkgIC8qIG1ha2Ugc3VyZSB0aGlzIHNlY3Rpb24gaXMgYWxpZ25lZCBvbiB0aGUgcmlnaHQgYm91bmRhcnkgLSBieQotCSAgICAgcGFkZGluZyB0aGUgcHJldmlvdXMgc2VjdGlvbiB1cCBpZiBuZWNlc3NhcnkgKi8KLQotCSAgb2xkX3NvZmFyID0gc29mYXI7Ci0JICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGlmIChwcmV2aW91cyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIHByZXZpb3VzLT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0JICAgIH0KLQl9Ci0KLSNlbmRpZgotCi0gICAgICAvKiBJbiBkZW1hbmQgcGFnZWQgZmlsZXMgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZSBmaWxlIG9mZnNldAotCSBtdXN0IG1hdGNoIHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUgdmlydHVhbCBhZGRyZXNzLiAgKi8KLSNpZmRlZiBDT0ZGX1BBR0VfU0laRQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQlzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcGFnZV9zaXplOwotI2VuZGlmCi0gICAgICBjdXJyZW50LT5maWxlcG9zID0gc29mYXI7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFNldCB0aGUgcGFkZGVkIHNpemUuICAqLwotICAgICAgY3VycmVudC0+X3Jhd19zaXplID0gKGN1cnJlbnQtPl9yYXdfc2l6ZSArIHBhZ2Vfc2l6ZSAtMSkgJiAtcGFnZV9zaXplOwotI2VuZGlmCi0KLSAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLQotI2lmZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBvbGRfc2l6ZTsKLQotCSAgb2xkX3NpemUgPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0JICBjdXJyZW50LT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKGN1cnJlbnQtPl9yYXdfc2l6ZSwKLQkJCQkJICAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7Ci0JICBhbGlnbl9hZGp1c3QgPSBjdXJyZW50LT5fcmF3X3NpemUgIT0gb2xkX3NpemU7Ci0JICBzb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemUgLSBvbGRfc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2xkX3NvZmFyID0gc29mYXI7Ci0JICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGFsaWduX2FkanVzdCA9IHNvZmFyICE9IG9sZF9zb2ZhcjsKLQkgIGN1cnJlbnQtPl9yYXdfc2l6ZSArPSBzb2ZhciAtIG9sZF9zb2ZhcjsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogRm9yIFBFIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIHBhZCBvdXQgdG8gdGhlIGFsaWduZWQKLSAgICAgICAgIF9yYXdfc2l6ZSwgaW4gY2FzZSB0aGUgY2FsbGVyIG9ubHkgd3JpdGVzIG91dCBkYXRhIHRvIHRoZQotICAgICAgICAgdW5hbGlnbmVkIF9yYXdfc2l6ZS4gICovCi0gICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA8IGN1cnJlbnQtPl9yYXdfc2l6ZSkKLQlhbGlnbl9hZGp1c3QgPSB0cnVlOwotI2VuZGlmCi0KLSNpZmRlZiBfTElCCi0gICAgICAvKiBGb3JjZSAubGliIHNlY3Rpb25zIHRvIHN0YXJ0IGF0IHplcm8uICBUaGUgdm1hIGlzIHRoZW4KLQkgaW5jcmVtZW50ZWQgaW4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cy4gIFRoaXMgaXMgcmlnaHQgZm9yCi0JIFNWUjMuMi4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCWJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQsIDApOwotI2VuZGlmCi0KLSAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLSAgICB9Ci0KLSAgLyogSXQgaXMgbm93IHNhZmUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCBmaWxlLiAgSWYgd2UgbmVlZGVkIGFuCi0gICAgIGFsaWdubWVudCBhZGp1c3RtZW50IGZvciB0aGUgbGFzdCBzZWN0aW9uLCB0aGVuIG1ha2Ugc3VyZSB0aGF0Ci0gICAgIHRoZXJlIGlzIGEgYnl0ZSBhdCBvZmZzZXQgc29mYXIuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBhbmQgbm8KLSAgICAgcmVsb2NzLCB0aGVuIG5vdGhpbmcgZm9sbG93cyB0aGUgbGFzdCBzZWN0aW9uLiAgSWYgd2UgZG9uJ3QgZm9yY2UKLSAgICAgdGhlIGxhc3QgYnl0ZSBvdXQsIHRoZW4gdGhlIGZpbGUgbWF5IGFwcGVhciB0byBiZSB0cnVuY2F0ZWQuICAqLwotICBpZiAoYWxpZ25fYWRqdXN0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzb2ZhciAtIDEsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSByZWxvY2F0aW9ucyBhcmUgYWxpZ25lZC4gIFdlIGRvbid0IG5lZWQgdG8gbWFrZQotICAgICBzdXJlIHRoYXQgdGhpcyBieXRlIGV4aXN0cywgYmVjYXVzZSBpdCB3aWxsIG9ubHkgbWF0dGVyIGlmIHRoZXJlCi0gICAgIHJlYWxseSBhcmUgcmVsb2NzLiAgKi8KLSAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik7Ci0KLSAgb2JqX3JlbG9jYmFzZSAoYWJmZCkgPSBzb2ZhcjsKLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgY2FuIG5ldmVyIHdvcmssIGJlY2F1c2UgaXQgaXMgY2FsbGVkIHRvbyBsYXRlLS1hZnRlciB0aGUKLSAgIHNlY3Rpb24gcG9zaXRpb25zIGhhdmUgYmVlbiBzZXQuICBJIGNhbid0IGZpZ3VyZSBvdXQgd2hhdCBpdCBpcwotICAgZm9yLCBzbyBJIGFtIGdvaW5nIHRvIGRpc2FibGUgaXQtLUlhbiBUYXlsb3IgMjAgTWFyY2ggMTk5Ni4gICovCi0KLS8qIElmIC5maWxlLCAudGV4dCwgLmRhdGEsIC5ic3Mgc3ltYm9scyBhcmUgbWlzc2luZywgYWRkIHRoZW0uICAqLwotLyogQEAgU2hvdWxkIHdlIG9ubHkgYmUgYWRkaW5nIG1pc3Npbmcgc3ltYm9scywgb3Igb3ZlcnJpZGluZyB0aGUgYXV4Ci0gICB2YWx1ZXMgZm9yIGV4aXN0aW5nIHNlY3Rpb24gc3ltYm9scz8gICovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBuc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcHAgPSBhYmZkLT5vdXRzeW1ib2xzOwotICBhc3ltYm9sICoqc3ltcHAyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IG5lZWRfdGV4dCA9IDEsIG5lZWRfZGF0YSA9IDEsIG5lZWRfYnNzID0gMSwgbmVlZF9maWxlID0gMTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnN5bXM7IGkrKykKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltcHBbaV0pOwotICAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgIGlmIChjc3ltKQotCXsKLQkgIC8qIG9ubHkgZG8gdGhpcyBpZiB0aGVyZSBpcyBhIGNvZmYgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0Ci0JICAgc3ltYm9sICovCi0JICBpZiAoY3N5bS0+bmF0aXZlICYmIGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgbmVlZF9maWxlID0gMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgbmFtZSA9IGNzeW0tPnN5bWJvbC5uYW1lOwotCSAgaWYgKCFuYW1lKQotCSAgICBjb250aW51ZTsKLQkgIGlmICghc3RyY21wIChuYW1lLCBfVEVYVCkpCi0JICAgIG5lZWRfdGV4dCA9IDA7Ci0jaWZkZWYgQVBPTExPX002OAotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgIi53dGV4dCIpKQotCSAgICBuZWVkX3RleHQgPSAwOwotI2VuZGlmCi0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfREFUQSkpCi0JICAgIG5lZWRfZGF0YSA9IDA7Ci0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfQlNTKSkKLQkgICAgbmVlZF9ic3MgPSAwOwotCX0KLSAgICB9Ci0gIC8qIE5vdyBpID09IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpLiAgKi8KLSAgLyogQEAgRm9yIG5vdywgZG9uJ3QgZGVhbCB3aXRoIC5maWxlIHN5bWJvbC4gICovCi0gIG5lZWRfZmlsZSA9IDA7Ci0KLSAgaWYgKCFuZWVkX3RleHQgJiYgIW5lZWRfZGF0YSAmJiAhbmVlZF9ic3MgJiYgIW5lZWRfZmlsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgbnN5bXMgKz0gbmVlZF90ZXh0ICsgbmVlZF9kYXRhICsgbmVlZF9ic3MgKyBuZWVkX2ZpbGU7Ci0gIHN5bXBwMiA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGFiZmQsIG5zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWYgKCFzeW1wcDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKHN5bXBwMiwgc3ltcHAsIGkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZiAobmVlZF9maWxlKQotICAgIHsKLSAgICAgIC8qIEBAIEdlbmVyYXRlIGZha2UgLmZpbGUgc3ltYm9sLCBpbiBzeW1wcDJbaV0sIGFuZCBpbmNyZW1lbnQgaS4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChuZWVkX3RleHQpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfVEVYVCk7Ci0gIGlmIChuZWVkX2RhdGEpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfREFUQSk7Ci0gIGlmIChuZWVkX2JzcykKLSAgICBzeW1wcDJbaSsrXSA9IGNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIF9CU1MpOwotICBCRkRfQVNTRVJUIChpID09IG5zeW1zKTsKLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXBwMiwgbnN5bXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotLyogU1VQUFJFU1MgNTU4ICovCi0vKiBTVVBQUkVTUyA1MjkgKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGJvb2xlYW4gaGFzcmVsb2NzID0gZmFsc2U7Ci0gIGJvb2xlYW4gaGFzbGlubm8gPSBmYWxzZTsKLSAgYm9vbGVhbiBoYXNkZWJ1ZyA9IGZhbHNlOwotICBmaWxlX3B0ciBzY25fYmFzZTsKLSAgZmlsZV9wdHIgcmVsb2NfYmFzZTsKLSAgZmlsZV9wdHIgbGluZW5vX2Jhc2U7Ci0gIGZpbGVfcHRyIHN5bV9iYXNlOwotICB1bnNpZ25lZCBsb25nIHJlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIGxubm9fc2l6ZSA9IDA7Ci0gIGJvb2xlYW4gbG9uZ19zZWN0aW9uX25hbWVzOwotICBhc2VjdGlvbiAqdGV4dF9zZWMgPSBOVUxMOwotICBhc2VjdGlvbiAqZGF0YV9zZWMgPSBOVUxMOwotICBhc2VjdGlvbiAqYnNzX3NlYyA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyIGludGVybmFsX2Y7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGludGVybmFsX2E7Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgc2l6ZV90IHN0cmluZ19zaXplID0gU1RSSU5HX1NJWkVfU0laRTsKLSNlbmRpZgotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogTWFrZSBhIHBhc3MgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGNvdW50IGxpbmUgbnVtYmVyIGVudHJpZXMgYW5kCi0gICAgIHB1dCB0aGVtIGludG8gdGhlIGNvcnJlY3QgYXNlY3Rpb25zICovCi0KLSAgbG5ub19zaXplID0gY29mZl9jb3VudF9saW5lbnVtYmVycyAoYWJmZCkgKiBMSU5FU1o7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKCEgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmVsb2NfYmFzZSA9IG9ial9yZWxvY2Jhc2UgKGFiZmQpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSByZWxvYyBhbmQgbGlubm8gYXJlYXMgKi8KLQotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0KLSAgICAgICBjdXJyZW50LT5uZXh0KQotICAgIHJlbG9jX3NpemUgKz0gY3VycmVudC0+cmVsb2NfY291bnQgKiBSRUxTWjsKLQotICBsaW5lbm9fYmFzZSA9IHJlbG9jX2Jhc2UgKyByZWxvY19zaXplOwotICBzeW1fYmFzZSA9IGxpbmVub19iYXNlICsgbG5ub19zaXplOwotCi0gIC8qIEluZGljYXRlIGluIGVhY2ggc2VjdGlvbi0+bGluZV9maWxlcG9zIGl0cyBhY3R1YWwgZmlsZSBhZGRyZXNzICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCkKLQl7Ci0JICBjdXJyZW50LT5saW5lX2ZpbGVwb3MgPSBsaW5lbm9fYmFzZTsKLQkgIGN1cnJlbnQtPm1vdmluZ19saW5lX2ZpbGVwb3MgPSBsaW5lbm9fYmFzZTsKLQkgIGxpbmVub19iYXNlICs9IGN1cnJlbnQtPmxpbmVub19jb3VudCAqIExJTkVTWjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VycmVudC0+bGluZV9maWxlcG9zID0gMDsKLQl9Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQpCi0JewotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSByZWxvY19iYXNlOwotCSAgcmVsb2NfYmFzZSArPSBjdXJyZW50LT5yZWxvY19jb3VudCAqIFJFTFNaOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjdXJyZW50LT5yZWxfZmlsZXBvcyA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBzZWN0aW9uIGhlYWRlcnMgdG8gdGhlIGZpbGUuICAqLwotICBpbnRlcm5hbF9mLmZfbnNjbnMgPSAwOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgc2NuX2Jhc2UgPSBGSUxIU1ogKyBBT1VUU1o7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzY25fYmFzZSA9IEZJTEhTWjsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCXNjbl9iYXNlICs9IEFPVVRTWjsKLSAgICAgIGVsc2UKLQlzY25fYmFzZSArPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzY25fYmFzZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxvbmdfc2VjdGlvbl9uYW1lcyA9IGZhbHNlOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciBzZWN0aW9uOwotICAgICAgYm9vbGVhbiBpc19yZWxvY19zZWN0aW9uID0gZmFsc2U7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsICIucmVsb2MiKSA9PSAwKQotCXsKLQkgIGlzX3JlbG9jX3NlY3Rpb24gPSB0cnVlOwotCSAgaGFzcmVsb2NzID0gdHJ1ZTsKLQkgIHBlX2RhdGEgKGFiZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbiA9IDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGludGVybmFsX2YuZl9uc2NucysrOwotCi0gICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgU0NOTk1MRU4pOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgICAgIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMgYXMgaW4gUEUuICBUaGlzIG11c3QgYmUgY29tcGF0aWJsZQotICAgICAgICAgd2l0aCB0aGUgY29kZSBpbiBjb2ZmX3dyaXRlX3N5bWJvbHMgYW5kIF9iZmRfY29mZl9maW5hbF9saW5rLiAgKi8KLSAgICAgIHsKLQlzaXplX3QgbGVuOwotCi0JbGVuID0gc3RybGVuIChjdXJyZW50LT5uYW1lKTsKLQlpZiAobGVuID4gU0NOTk1MRU4pCi0JICB7Ci0JICAgIG1lbXNldCAoc2VjdGlvbi5zX25hbWUsIDAsIFNDTk5NTEVOKTsKLQkgICAgc3ByaW50ZiAoc2VjdGlvbi5zX25hbWUsICIvJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHN0cmluZ19zaXplKTsKLQkgICAgc3RyaW5nX3NpemUgKz0gbGVuICsgMTsKLQkgICAgbG9uZ19zZWN0aW9uX25hbWVzID0gdHJ1ZTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgX0xJQgotICAgICAgLyogQWx3YXlzIHNldCBzX3ZhZGRyIG9mIC5saWIgdG8gMC4gIFRoaXMgaXMgcmlnaHQgZm9yIFNWUjMuMgotCSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQlzZWN0aW9uLnNfdmFkZHIgPSAwOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICBzZWN0aW9uLnNfdmFkZHIgPSBjdXJyZW50LT52bWE7Ci0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSBjdXJyZW50LT5sbWE7Ci0gICAgICBzZWN0aW9uLnNfc2l6ZSA9ICBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFJlbWluZGVyOiBzX3BhZGRyIGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMCi0JICAmJiBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMKQotCXNlY3Rpb24uc19wYWRkciA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemU7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3BhZGRyID0gMDsKLSNlbmRpZgotCi0gICAgICAvKgotCSBJZiB0aGlzIHNlY3Rpb24gaGFzIG5vIHNpemUgb3IgaXMgdW5sb2FkYWJsZSB0aGVuIHRoZSBzY25wdHIKLQkgd2lsbCBiZSAwIHRvbwotCSAqLwotICAgICAgaWYgKGN1cnJlbnQtPl9yYXdfc2l6ZSA9PSAwIHx8Ci0JICAoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKSkgPT0gMCkKLQl7Ci0JICBzZWN0aW9uLnNfc2NucHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7Ci0JfQotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0gICAgICBzZWN0aW9uLnNfbmxubm8gPSBjdXJyZW50LT5saW5lbm9fY291bnQ7Ci0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogSW4gUEVJLCByZWxvY3MgY29tZSBpbiB0aGUgLnJlbG9jIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ICE9IDApCi0JaGFzcmVsb2NzID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCAhPSAwKQotCWhhc2xpbm5vID0gdHJ1ZTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0JICAmJiAhIGlzX3JlbG9jX3NlY3Rpb24pCi0JaGFzZGVidWcgPSB0cnVlOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgICAvKiBJbmRpY2F0ZSB0aGUgdXNlIG9mIGFuIFhDT0ZGIG92ZXJmbG93IHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLQl7Ci0JICBzZWN0aW9uLnNfbnJlbG9jID0gMHhmZmZmOwotCSAgc2VjdGlvbi5zX25sbm5vID0gMHhmZmZmOwotCX0KLSNlbmRpZgotCi0gICAgICBzZWN0aW9uLnNfZmxhZ3MgPSBzZWNfdG9fc3R5cF9mbGFncyAoY3VycmVudC0+bmFtZSwgY3VycmVudC0+ZmxhZ3MpOwotCi0gICAgICBpZiAoIXN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1RFWFQpKQotCXsKLQkgIHRleHRfc2VjID0gY3VycmVudDsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChjdXJyZW50LT5uYW1lLCBfREFUQSkpCi0JewotCSAgZGF0YV9zZWMgPSBjdXJyZW50OwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9CU1MpKQotCXsKLQkgIGJzc19zZWMgPSBjdXJyZW50OwotCX0KLQotI2lmZGVmIEk5NjAKLSAgICAgIHNlY3Rpb24uc19hbGlnbiA9IChjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIKLQkJCSA/IDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyCi0JCQkgOiAwKTsKLSNlbHNlCi0jaWZkZWYgVElDODBDT0ZGCi0gICAgICBzZWN0aW9uLnNfZmxhZ3MgfD0gKGN1cnJlbnQtPmFsaWdubWVudF9wb3dlciAmIDB4RikgPDwgODsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFN1cHByZXNzIG91dHB1dCBvZiB0aGUgc2VjdGlvbnMgaWYgdGhleSBhcmUgbnVsbC4gIGxkCi0JIGluY2x1ZGVzIHRoZSBic3MgYW5kIGRhdGEgc2VjdGlvbnMgZXZlbiBpZiB0aGVyZSBpcyBubyBzaXplCi0JIGFzc2lnbmVkIHRvIHRoZW0uICBOVCBsb2FkZXIgZG9lc24ndCBsaWtlIGl0IGlmIHRoZXNlIHNlY3Rpb24KLQkgaGVhZGVycyBhcmUgaW5jbHVkZWQgaWYgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMgYXJlIG5vdAotCSBuZWVkZWQuICBTZWUgYWxzbyBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCi0gICAgICBpZiAoc2VjdGlvbi5zX3NpemUgPT0gMCkKLQlpbnRlcm5hbF9mLmZfbnNjbnMtLTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCXsKLQkgIFNDTkhEUiBidWZmOwotCSAgaWYgKGNvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAmc2VjdGlvbiwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICgmYnVmZiksIDEsIFNDTkhTWiwgYWJmZCkgIT0gU0NOSFNaKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICAvKiBQRSBzdG9yZXMgQ09NREFUIHNlY3Rpb24gaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIElmCi0gICAgICAgICB0aGlzIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gaGF2ZSBzb21lIENPTURBVCBpbmZvLCB0cmFjayBkb3duCi0gICAgICAgICB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIG1vZGlmeSBpdC4gICovCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaSwgY291bnQ7Ci0JICBhc3ltYm9sICoqcHN5bTsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW0gPSBOVUxMOwotCSAgYXN5bWJvbCAqKnBzeW1zZWM7Ci0KLQkgIHBzeW1zZWMgPSBOVUxMOwotCSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGZvciAoaSA9IDAsIHBzeW0gPSBhYmZkLT5vdXRzeW1ib2xzOyBpIDwgY291bnQ7IGkrKywgcHN5bSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCgqcHN5bSktPnNlY3Rpb24gIT0gY3VycmVudCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChwc3ltc2VjID09IE5VTEwpCi0JCXBzeW1zZWMgPSBwc3ltOwotCi0JICAgICAgLyogU2VlIGlmIHRoaXMgaXMgdGhlIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoc3RyY21wICgoKnBzeW0pLT5uYW1lLCBjdXJyZW50LT5uYW1lKSA9PSAwKQotCQl7Ci0JCSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsICpwc3ltKTsKLQkJICBpZiAoY3N5bSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPCAxCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgIT0gQ19TVEFUCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlICE9IFRfTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogSGVyZSAqUFNZTSBpcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yIENVUlJFTlQuICAqLwotCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBEaWQgd2UgZmluZCBpdD8KLQkgICAgIE5vdGUgdGhhdCB3ZSBtaWdodCBub3QgaWYgd2UncmUgY29udmVydGluZyB0aGUgZmlsZSBmcm9tCi0JICAgICBzb21lIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCi0JICBpZiAoaSA8IGNvdW50KQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotCi0JICAgICAgLyogV2UgZG9uJ3QgdG91Y2ggdGhlIHhfY2hlY2tzdW0gZmllbGQuICBUaGUKLQkJIHhfYXNzb2NpYXRlZCBmaWVsZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gICovCi0KLQkgICAgICBhdXggPSBjc3ltLT5uYXRpdmUgKyAxOwotCSAgICAgIHN3aXRjaCAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfTElOS19EVVBMSUNBVEVTKQotCQl7Ci0JCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWTsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPQotCQkgICAgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFM6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBUaGUgQ09NREFUIHN5bWJvbCBtdXN0IGJlIHRoZSBmaXJzdCBzeW1ib2wgZnJvbSB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEluIG9yZGVyIHRvIG1ha2UgdGhpcwotICAgICAgICAgICAgICAgICB3b3JrLCB3ZSBtb3ZlIHRoZSBDT01EQVQgc3ltYm9sIGJlZm9yZSB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgc3ltYm9sIHdlIGZvdW5kIGluIHRoZSBzZWFyY2ggYWJvdmUuICBJdCdzIE9LIHRvCi0gICAgICAgICAgICAgICAgIHJlYXJyYW5nZSB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgY29mZl9yZW51bWJlcl9zeW1ib2xzIGlzIGdvaW5nIHRvIHJlYXJyYW5nZSBpdAotICAgICAgICAgICAgICAgICBmdXJ0aGVyIGFuZCBmaXggdXAgYWxsIHRoZSBhdXggZW50cmllcy4gICovCi0JICAgICAgaWYgKHBzeW0gIT0gcHN5bXNlYykKLQkJewotCQkgIGFzeW1ib2wgKmhvbGQ7Ci0JCSAgYXN5bWJvbCAqKnBjb3B5OwotCi0JCSAgaG9sZCA9ICpwc3ltOwotCQkgIGZvciAocGNvcHkgPSBwc3ltOyBwY29weSA+IHBzeW1zZWM7IHBjb3B5LS0pCi0JCSAgICBwY29weVswXSA9IHBjb3B5Wy0xXTsKLQkJICAqcHN5bXNlYyA9IGhvbGQ7Ci0JCX0KLQkgICAgfQotCX0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLSAgICB9Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiBoZWFkZXIgdG8gaG9sZCB0aGUgY29ycmVjdCB2YWx1ZXMuICAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IGN1cnJlbnQtPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciBzY25oZHI7Ci0JICBTQ05IRFIgYnVmZjsKLQotCSAgaW50ZXJuYWxfZi5mX25zY25zKys7Ci0JICBzdHJuY3B5ICgmKHNjbmhkci5zX25hbWVbMF0pLCBjdXJyZW50LT5uYW1lLCA4KTsKLQkgIHNjbmhkci5zX3BhZGRyID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBzY25oZHIuc192YWRkciA9IGN1cnJlbnQtPmxpbmVub19jb3VudDsKLQkgIHNjbmhkci5zX3NpemUgPSAwOwotCSAgc2NuaGRyLnNfc2NucHRyID0gMDsKLQkgIHNjbmhkci5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCSAgc2NuaGRyLnNfbG5ub3B0ciA9IGN1cnJlbnQtPmxpbmVfZmlsZXBvczsKLQkgIHNjbmhkci5zX25yZWxvYyA9IGN1cnJlbnQtPnRhcmdldF9pbmRleDsKLQkgIHNjbmhkci5zX25sbm5vID0gY3VycmVudC0+dGFyZ2V0X2luZGV4OwotCSAgc2NuaGRyLnNfZmxhZ3MgPSBTVFlQX09WUkZMTzsKLQkgIGlmIChjb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgJnNjbmhkciwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBTQ05IU1osIGFiZmQpICE9IFNDTkhTWikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAvKiBPSywgbm93IHNldCB1cCB0aGUgZmlsZWhkci4uLiAqLwotCi0gIC8qIERvbid0IGluY2x1ZGUgdGhlIGludGVybmFsIGFicyBzZWN0aW9uIGluIHRoZSBzZWN0aW9uIGNvdW50ICovCi0KLSAgLyoKLSAgICAgV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeSB0aW1lIHlvdQotICAgICBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtIHNvcnJ5LiAgVGhpcwotICAgICBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28gaXQgY29tcGFyZXMgdGhlCi0gICAgIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0gZ251QGN5Z251cy5jb20KLSAgICAgKi8KLSAgaW50ZXJuYWxfZi5mX3RpbWRhdCA9IDA7Ci0KLSAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gMDsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX29wdGhkciA9IEFPVVRTWjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybmFsX2YuZl9vcHRoZHIgPSAwOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0JaW50ZXJuYWxfZi5mX29wdGhkciA9IEFPVVRTWjsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9mLmZfb3B0aGRyID0gU01BTExfQU9VVFNaOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICghaGFzcmVsb2NzKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX1JFTEZMRzsKLSAgaWYgKCFoYXNsaW5ubykKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9MTk5POwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRVhFQzsKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgaWYgKCEgaGFzZGVidWcpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9BUjMyV1I7Ci0gIGVsc2UKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9BUjMyVzsKLSNlbmRpZgotCi0jaWZkZWYgVElDODBfVEFSR0VUX0lECi0gIGludGVybmFsX2YuZl90YXJnZXRfaWQgPSBUSUM4MF9UQVJHRVRfSUQ7Ci0jZW5kaWYKLQotICAvKgotICAgICBGSVhNRSwgc2hvdWxkIGRvIHNvbWV0aGluZyBhYm91dCB0aGUgb3RoZXIgYnl0ZSBvcmRlcnMgYW5kCi0gICAgIGFyY2hpdGVjdHVyZXMuCi0gICAgICovCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfU0hST0JKOwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIF9MT0FERVIpICE9IE5VTEwpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRFlOTE9BRDsKLSNlbmRpZgotCi0gIG1lbXNldCAoJmludGVybmFsX2EsIDAsIHNpemVvZiBpbnRlcm5hbF9hKTsKLQotICAvKiBTZXQgdXAgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBzdHVmZiAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbWFnaWMgPSAwOwotICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzID0gMDsKLSAgICBjb2ZmX3NldF9mbGFncyAoYWJmZCwgJm1hZ2ljLCAmZmxhZ3MpOwotICAgIGludGVybmFsX2YuZl9tYWdpYyA9IG1hZ2ljOwotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBmbGFnczsKLSAgICAvKiAuLi5hbmQgdGhlICJvcHQiaGRyLi4uICovCi0KLSNpZmRlZiBBMjlLCi0jaWZkZWYgVUxUUkEzCQkJLyogTllVJ3MgbWFjaGluZSAqLwotICAgIC8qIEZJWE1FOiBUaGlzIGlzIGEgYm9ndXMgY2hlY2suICBJIHJlYWxseSB3YW50IHRvIHNlZSBpZiB0aGVyZQotICAgICAqIGlzIGEgLnNoYnNzIG9yIGEgLnNoZGF0YSBzZWN0aW9uLCBpZiBzbyB0aGVuIHNldCB0aGUgbWFnaWMKLSAgICAgKiBudW1iZXIgdG8gaW5kaWNhdGUgYSBzaGFyZWQgZGF0YSBleGVjdXRhYmxlLgotICAgICAqLwotICAgIGlmIChpbnRlcm5hbF9mLmZfbnNjbnMgPj0gNykKLSAgICAgIGludGVybmFsX2EubWFnaWMgPSBTSE1BR0lDOyAvKiBTaGFyZWQgbWFnaWMgKi8KLSAgICBlbHNlCi0jZW5kaWYgLyogVUxUUkEzICovCi0gICAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTk1BR0lDOyAvKiBBc3N1bWUgc2VwYXJhdGUgaS9kICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEEyOUsgKi8KLSNpZmRlZiBUSUM4MENPRkYKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gVElDODBfQVJDSF9NQUdJQzsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogVElDODAgKi8KLSNpZmRlZiBJODYwCi0gICAgLyogRklYTUU6IFdoYXQgYXJlIHRoZSBhLm91dCBtYWdpYyBudW1iZXJzIGZvciB0aGUgaTg2MD8gICovCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IDA7Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEk4NjAgKi8KLSNpZmRlZiBJOTYwCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IChtYWdpYyA9PSBJOTYwUk9NQUdJQyA/IE5NQUdJQyA6IE9NQUdJQyk7Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEk5NjAgKi8KLSNpZiBNODgKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFBBR0VNQUdJQ0JDUzsKLSNlbmRpZiAvKiBNODggKi8KLQotI2lmIEFQT0xMT19NNjgKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE02OCkgfHwgZGVmaW5lZChXRTMySykgfHwgZGVmaW5lZChNNjhLKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbHNlCi0jaWYgZGVmaW5lZChUQVJHX0FVWCkKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gKGFiZmQtPmZsYWdzICYgRF9QQUdFRCA/IFBBR0VNQUdJQ1BFWEVDUEFHRUQgOgotCQkJYWJmZC0+ZmxhZ3MgJiBXUF9URVhUID8gUEFHRU1BR0lDUEVYRUNTV0FQUEVEIDoKLQkJCVBBR0VNQUdJQ0VYRUNTV0FQUEVEKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoUEFHRU1BR0lDUEVYRUNQQUdFRCkKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gUEFHRU1BR0lDUEVYRUNQQUdFRDsKLSNlbmRpZgotI2VuZGlmIC8qIFRBUkdfQVVYICovCi0jZW5kaWYgLyogTFlOWE9TICovCi0jZW5kaWYgLyogTTY4IHx8IFdFMzJLIHx8IE02OEsgKi8KLQotI2lmIGRlZmluZWQoQVJNKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gWk1BR0lDOwotI2VuZGlmIAotCi0jaWYgZGVmaW5lZChQUENfUEUpCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUM7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgTUNPUkVfUEUKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQzsKLSNlbmRpZiAKLQotI2lmIGRlZmluZWQoSTM4NikKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jaWYgZGVmaW5lZChMWU5YT1MpCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IExZTlhDT0ZGTUFHSUM7Ci0jZWxzZSAgLyogTFlOWE9TICovCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFpNQUdJQzsKLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBJMzg2ICovCi0KLSNpZiBkZWZpbmVkKFNQQVJDKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBTUEFSQyAqLwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA/IFJTNktfQU9VVEhEUl9aTUFHSUMgOgotICAgIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpID8gUlM2S19BT1VUSERSX05NQUdJQyA6Ci0gICAgUlM2S19BT1VUSERSX09NQUdJQzsKLSNlbmRpZgotCi0jaWZuZGVmIF9fQV9NQUdJQ19TRVRfXwotI2luY2x1ZGUgIllvdXIgYW91dGhkciBtYWdpYyBudW1iZXIgaXMgbm90IGJlaW5nIHNldCEiCi0jZWxzZQotI3VuZGVmIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmCi0gIH0KLQotICAvKiBGSVhNRTogRG9lcyBhbnlib2R5IGV2ZXIgc2V0IHRoaXMgdG8gYW5vdGhlciB2YWx1ZT8gICovCi0gIGludGVybmFsX2EudnN0YW1wID0gMDsKLQotICAvKiBOb3cgc2hvdWxkIHdyaXRlIHJlbG9jcywgc3RyaW5ncywgc3ltcyAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gc3ltX2Jhc2U7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaW50IGZpcnN0dW5kZWY7Ci0jaWYgMAotICAgICAgaWYgKCFjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgICAgaWYgKCFjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgKGFiZmQsICZmaXJzdHVuZGVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBjb2ZmX21hbmdsZV9zeW1ib2xzIChhYmZkKTsKLSAgICAgIGlmICghIGNvZmZfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9saW5lbnVtYmVycyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9yZWxvY3MgKGFiZmQsIGZpcnN0dW5kZWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgZWxzZSBpZiAobG9uZ19zZWN0aW9uX25hbWVzKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGhhdmUgbG9uZyBzZWN0aW9uIG5hbWVzIHdlIGhhdmUgdG8gd3JpdGUgb3V0IHRoZSBzdHJpbmcKLSAgICAgICAgIHRhYmxlIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0jaWZkZWYgUFBDX1BFCi0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICAvKiBQb3dlclBDIFBFIGFwcGVhcnMgdG8gcmVxdWlyZSB0aGF0IGFsbCBleGVjdXRhYmxlIGZpbGVzIGJlCi0gICAgICAgICByb3VuZGVkIHVwIHRvIHRoZSBwYWdlIHNpemUuICAqLwotICAgICAgYiA9IDA7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBCRkRfQUxJR04gKHN5bV9iYXNlLCBDT0ZGX1BBR0VfU0laRSkgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotI2VuZGlmCi0KLSAgLyogSWYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCwgdGhlbiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBDT0ZGCi0gICAgIGJhY2tlbmQgbGlua2VyLCBhbmQgb2JqX3Jhd19zeW1lbnRfY291bnQgaXMgbm90IHZhbGlkIHVudGlsIGFmdGVyCi0gICAgIGNvZmZfd3JpdGVfc3ltYm9scyBpcyBjYWxsZWQuICAqLwotICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IHN5bV9iYXNlOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgLyogQUlYIGFwcGVhcnMgdG8gcmVxdWlyZSB0aGF0IEZfUkVMRkxHIG5vdCBiZSBzZXQgaWYgdGhlcmUgYXJlCi0gICAgICAgICBsb2NhbCBzeW1ib2xzIGJ1dCBubyByZWxvY2F0aW9ucy4gICovCi0gICAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgJj1+IEZfUkVMRkxHOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxvbmdfc2VjdGlvbl9uYW1lcykKLQlpbnRlcm5hbF9mLmZfc3ltcHRyID0gc3ltX2Jhc2U7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfZi5mX3N5bXB0ciA9IDA7Ci0gICAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9MU1lNUzsKLSAgICB9Ci0KLSAgaWYgKHRleHRfc2VjKQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHRleHRfc2VjKTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IGludGVybmFsX2EudHNpemUgPyB0ZXh0X3NlYy0+dm1hIDogMDsKLSAgICB9Ci0gIGlmIChkYXRhX3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChkYXRhX3NlYyk7Ci0gICAgICBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBpbnRlcm5hbF9hLmRzaXplID8gZGF0YV9zZWMtPnZtYSA6IDA7Ci0gICAgfQotICBpZiAoYnNzX3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLmJzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChic3Nfc2VjKTsKLSAgICAgIGlmIChpbnRlcm5hbF9hLmJzaXplICYmIGJzc19zZWMtPnZtYSA8IGludGVybmFsX2EuZGF0YV9zdGFydCkKLQlpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBic3Nfc2VjLT52bWE7Ci0gICAgfQotCi0gIGludGVybmFsX2EuZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBpbnRlcm5hbF9mLmZfbnN5bXMgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0gICAgewotICAgICAgYmZkX3ZtYSB0b2M7Ci0gICAgICBhc2VjdGlvbiAqbG9hZGVyX3NlYzsKLQotICAgICAgaW50ZXJuYWxfYS52c3RhbXAgPSAxOwotCi0gICAgICBpbnRlcm5hbF9hLm9fc25lbnRyeSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5zbmVudHJ5OwotICAgICAgaWYgKGludGVybmFsX2Eub19zbmVudHJ5ID09IDApCi0JaW50ZXJuYWxfYS5lbnRyeSA9IChiZmRfdm1hKSAtMTsKLQotICAgICAgaWYgKHRleHRfc2VjICE9IE5VTEwpCi0JewotCSAgaW50ZXJuYWxfYS5vX3NudGV4dCA9IHRleHRfc2VjLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbnRleHQgPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCB0ZXh0X3NlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludGVybmFsX2Eub19zbnRleHQgPSAwOwotCSAgaW50ZXJuYWxfYS5vX2FsZ250ZXh0ID0gMDsKLQl9Ci0gICAgICBpZiAoZGF0YV9zZWMgIT0gTlVMTCkKLQl7Ci0JICBpbnRlcm5hbF9hLm9fc25kYXRhID0gZGF0YV9zZWMtPnRhcmdldF9pbmRleDsKLQkgIGludGVybmFsX2Eub19hbGduZGF0YSA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIGRhdGFfc2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50ZXJuYWxfYS5vX3NuZGF0YSA9IDA7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbmRhdGEgPSAwOwotCX0KLSAgICAgIGxvYWRlcl9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgICAgIGlmIChsb2FkZXJfc2VjICE9IE5VTEwpCi0JaW50ZXJuYWxfYS5vX3NubG9hZGVyID0gbG9hZGVyX3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgZWxzZQotCWludGVybmFsX2Eub19zbmxvYWRlciA9IDA7Ci0gICAgICBpZiAoYnNzX3NlYyAhPSBOVUxMKQotCWludGVybmFsX2Eub19zbmJzcyA9IGJzc19zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9hLm9fc25ic3MgPSAwOwotCi0gICAgICB0b2MgPSB4Y29mZl9kYXRhIChhYmZkKS0+dG9jOwotICAgICAgaW50ZXJuYWxfYS5vX3RvYyA9IHRvYzsKLSAgICAgIGludGVybmFsX2Eub19zbnRvYyA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5zbnRvYzsKLQotICAgICAgaW50ZXJuYWxfYS5vX21vZHR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZTsKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAhPSAtMSkKLQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlOwotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLQkgICAgICBpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLQkgICAgICBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSAwKQotCQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDM7Ci0JICAgICAgZWxzZQotCQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBpbnRlcm5hbF9hLm9fbWF4c3RhY2sgPSB4Y29mZl9kYXRhIChhYmZkKS0+bWF4c3RhY2s7Ci0gICAgICBpbnRlcm5hbF9hLm9fbWF4ZGF0YSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5tYXhkYXRhOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIG5vdyB3cml0ZSB0aGVtICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHsKLSAgICBjaGFyIGJ1ZmZbRklMSFNaXTsKLSAgICBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIChQVFIpICYgaW50ZXJuYWxfZiwgKFBUUikgYnVmZik7Ci0gICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZiwgMSwgRklMSFNaLCBhYmZkKSAhPSBGSUxIU1opCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBwZWljb2RlLmggZmlsbHMgaW4gYSBQRUFPVVRIRFIsIG5vdCBhbiBBT1VUSERSLiAKLQkgaW5jbHVkZS9jb2ZmL3BlLmggc2V0cyBBT1VUU1ogPT0gc2l6ZW9mKFBFQU9VVEhEUikpICovCi0gICAgICBjaGFyIGJ1ZmZbQU9VVFNaXTsKLSAgICAgIGNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJiBpbnRlcm5hbF9hLCAoUFRSKSBidWZmKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmYsIDEsIEFPVVRTWiwgYWJmZCkgIT0gQU9VVFNaKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGVsc2UKLSAgICB7Ci0gICAgICBBT1VUSERSIGJ1ZmY7Ci0gICAgICBzaXplX3Qgc2l6ZTsKLQotICAgICAgLyogWENPRkYgc2VlbXMgdG8gYWx3YXlzIHdyaXRlIGF0IGxlYXN0IGEgc21hbGwgYS5vdXQgaGVhZGVyLiAgKi8KLSAgICAgIGNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2EsIChQVFIpICZidWZmKTsKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCXNpemUgPSBBT1VUU1o7Ci0gICAgICBlbHNlCi0Jc2l6ZSA9IFNNQUxMX0FPVVRTWjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkJLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIGRlZmluZWQoX0xJQikgJiYgIWRlZmluZWQoVEFSR19BVVgpCi0KLSAgIC8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIGZpZWxkIG9mIGEgLmxpYiBzZWN0aW9uIGlzIHVzZWQgdG8gaG9sZCB0aGUKLSAgICAgIG51bWJlciBvZiBzaGFyZWQgbGlicmFyaWVzIGluIHRoZSBzZWN0aW9uLiAgVGhpcyBjb2RlIGNvdW50cyB0aGUKLSAgICAgIG51bWJlciBvZiBzZWN0aW9ucyBiZWluZyB3cml0dGVuLCBhbmQgaW5jcmVtZW50cyB0aGUgbG1hIGZpZWxkCi0gICAgICB3aXRoIHRoZSBudW1iZXIuCi0KLSAgICAgIEkgaGF2ZSBmb3VuZCBubyBkb2N1bWVudGF0aW9uIG9uIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uCi0gICAgICBFeHBlcmltZW50YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgemVybyBvciBtb3JlCi0gICAgICByZWNvcmRzLCBlYWNoIG9mIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLQotICAgICAgLSBhIChmb3VyIGJ5dGUpIHdvcmQgaG9sZGluZyB0aGUgbGVuZ3RoIG9mIHRoaXMgcmVjb3JkLCBpbiB3b3JkcywKLSAgICAgIC0gYSB3b3JkIHRoYXQgYWx3YXlzIHNlZW1zIHRvIGJlIHNldCB0byAiMiIsCi0gICAgICAtIHRoZSBwYXRoIHRvIGEgc2hhcmVkIGxpYnJhcnksIG51bGwtdGVybWluYXRlZCBhbmQgdGhlbiBwYWRkZWQKLSAgICAgICAgdG8gYSB3aG9sZSB3b3JkIGJvdW5kYXJ5LgotCi0gICAgICBiZmRfYXNzZXJ0IGNhbGxzIGhhdmUgYmVlbiBhZGRlZCB0byBhbGVydCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUKLSAgICAgIHRvIHdyaXRlIGEgc2VjdGlvbiB3aGljaCBkb2Vzbid0IGZvbGxvdyB0aGVzZSBhc3N1bXB0aW9ucy4gIFRoZQotICAgICAgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgb24gSVNDIDQuMSBieSBtZSwgYW5kIG9uIFNDTyBieSBSb2JlcnQgTGlwZQotICAgICAgPHJvYmVydGxAYXJuZXQuY29tPiAoVGhhbmtzISkuCi0gIAotICAgICAgR3ZyYW4gVWRkZWJvcmcgPGd2cmFuQHVkZGVib3JnLnBwLnNlPiAqLwotCi0gICAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICAgIHsKLQliZmRfYnl0ZSAqcmVjLCAqcmVjZW5kOwotCi0JcmVjID0gKGJmZF9ieXRlICopIGxvY2F0aW9uOwotCXJlY2VuZCA9IHJlYyArIGNvdW50OwotCXdoaWxlIChyZWMgPCByZWNlbmQpCi0JICB7Ci0JICAgICsrc2VjdGlvbi0+bG1hOwotCSAgICByZWMgKz0gYmZkX2dldF8zMiAoYWJmZCwgcmVjKSAqIDQ7Ci0JICB9Ci0KLQlCRkRfQVNTRVJUIChyZWMgPT0gcmVjZW5kKTsKLSAgICAgIH0KLQotI2VuZGlmCi0KLSAgLyogRG9uJ3Qgd3JpdGUgb3V0IGJzcyBzZWN0aW9ucyAtIG9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0bwotICAgICAgIHNlZSBpZiB0aGUgZmlsZXBvcyBoYXMgbm90IGJlZW4gc2V0LiAqLwotICBpZiAoc2VjdGlvbi0+ZmlsZXBvcyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLSNpZiAwCi1zdGF0aWMgYm9vbGVhbgotY29mZl9jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpKQotICAgIHN3aXRjaCAoYWJmZC0+Zm9ybWF0KQotICAgICAgewotICAgICAgY2FzZSBiZmRfYXJjaGl2ZToKLQlpZiAoIV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9vYmplY3Q6Ci0JaWYgKCFjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gIC8qIFdlIGRlcGVuZCBvbiBiZmRfY2xvc2UgdG8gZnJlZSBhbGwgdGhlIG1lbW9yeSBvbiB0aGUgb2JqYWxsb2MuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBQVFIKLWJ1eV9hbmRfcmVhZCAoYWJmZCwgd2hlcmUsIHNlZWtfZGlyZWN0aW9uLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotICAgICBpbnQgc2Vla19kaXJlY3Rpb247Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgYXJlYSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmICghYXJlYSkKLSAgICByZXR1cm4gKE5VTEwpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBzZWVrX2RpcmVjdGlvbikgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGFyZWEsIDEsIHNpemUsIGFiZmQpICE9IHNpemUpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgcmV0dXJuIChhcmVhKTsKLX0JCQkJLyogYnV5X2FuZF9yZWFkKCkgKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlSZWFkaW5nIGxpbmVudW1iZXJzCi0KLQlDcmVhdGluZyB0aGUgbGluZW51bWJlciB0YWJsZSBpcyBkb25lIGJ5IHJlYWRpbmcgaW4gdGhlIGVudGlyZQotCWNvZmYgbGluZW51bWJlciB0YWJsZSwgYW5kIGNyZWF0aW5nIGFub3RoZXIgdGFibGUgZm9yIGludGVybmFsIHVzZS4KLQotCUEgY29mZiBsaW5lbnVtYmVyIHRhYmxlIGlzIHN0cnVjdHVyZWQgc28gdGhhdCBlYWNoIGZ1bmN0aW9uCi0JaXMgbWFya2VkIGFzIGhhdmluZyBhIGxpbmUgbnVtYmVyIG9mIDAuIEVhY2ggbGluZSB3aXRoaW4gdGhlCi0JZnVuY3Rpb24gaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGZpcnN0IGxpbmUgaW4gdGhlIGZ1bmN0aW9uLiBUaGUKLQliYXNlIG9mIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhYmxlIGlzIHN0b3JlZCBpbgotCXRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbi4KLQotCU5vdGU6IFRoZSBQRSBmb3JtYXQgdXNlcyBsaW5lIG51bWJlciAwIGZvciBhIGZsYWcgaW5kaWNhdGluZyBhCi0JbmV3IHNvdXJjZSBmaWxlLgotCi0JVGhlIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBleHRlcm5hbCB0byB0aGUgaW50ZXJuYWwKLQl0YWJsZSwgYW5kIGVhY2ggc3ltYm9sIHdoaWNoIG1hcmtzIGEgZnVuY3Rpb24gaXMgbWFya2VkIGJ5Ci0JcG9pbnRpbmcgaXRzLi4uCi0KLQlIb3cgZG9lcyB0aGlzIHdvcmsgPwotCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbHVycF9saW5lX3RhYmxlIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci17Ci0gIExJTkVOTyAqbmF0aXZlX2xpbmVubzsKLSAgYWxlbnQgKmxpbmVub19jYWNoZTsKLQotICBCRkRfQVNTRVJUIChhc2VjdC0+bGluZW5vID09IChhbGVudCAqKSBOVUxMKTsKLQotICBuYXRpdmVfbGluZW5vID0gKExJTkVOTyAqKSBidXlfYW5kX3JlYWQgKGFiZmQsCi0JCQkJCSAgIGFzZWN0LT5saW5lX2ZpbGVwb3MsCi0JCQkJCSAgIFNFRUtfU0VULAotCQkJCQkgICAoc2l6ZV90KSAoTElORVNaICoKLQkJCQkJCSAgICAgYXNlY3QtPmxpbmVub19jb3VudCkpOwotICBsaW5lbm9fY2FjaGUgPQotICAgIChhbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIChzaXplX3QpICgoYXNlY3QtPmxpbmVub19jb3VudCArIDEpICogc2l6ZW9mIChhbGVudCkpKTsKLSAgaWYgKGxpbmVub19jYWNoZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgICAgIGFsZW50ICpjYWNoZV9wdHIgPSBsaW5lbm9fY2FjaGU7Ci0gICAgICBMSU5FTk8gKnNyYyA9IG5hdGl2ZV9saW5lbm87Ci0KLSAgICAgIHdoaWxlIChjb3VudGVyIDwgYXNlY3QtPmxpbmVub19jb3VudCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGRzdDsKLQkgIGNvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIHNyYywgJmRzdCk7Ci0JICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gZHN0LmxfbG5ubzsKLQotCSAgaWYgKGNhY2hlX3B0ci0+bGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gd2FybmVkOwotCSAgICAgIGxvbmcgc3ltbmR4OwotCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKnN5bTsKLQotCSAgICAgIHdhcm5lZCA9IGZhbHNlOwotCSAgICAgIHN5bW5keCA9IGRzdC5sX2FkZHIubF9zeW1uZHg7Ci0JICAgICAgaWYgKHN5bW5keCA8IDAKLQkJICB8fCAodW5zaWduZWQgbG9uZykgc3ltbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gbGluZSBudW1iZXJzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5sX2FkZHIubF9zeW1uZHgpOwotCQkgIHN5bW5keCA9IDA7Ci0JCSAgd2FybmVkID0gdHJ1ZTsKLQkJfQotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIGNhc3RpbmcgYmV0d2VlbiBpbnRzIGFuZAotICAgICAgICAgICAgICAgICBwb2ludGVycyBsaWtlIHRoaXMuICAqLwotCSAgICAgIHN5bSA9ICgoY29mZl9zeW1ib2xfdHlwZSAqKQotCQkgICAgICgoc3ltbmR4ICsgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSkKLQkJICAgICAgLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcykpOwotCSAgICAgIGNhY2hlX3B0ci0+dS5zeW0gPSAoYXN5bWJvbCAqKSBzeW07Ci0JICAgICAgaWYgKHN5bS0+bGluZW5vICE9IE5VTEwgJiYgISB3YXJuZWQpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogZHVwbGljYXRlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBgJXMnIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCSAgICAgYmZkX2FzeW1ib2xfbmFtZSAoJnN5bS0+c3ltYm9sKSk7Ci0JCX0KLQkgICAgICBzeW0tPmxpbmVubyA9IGNhY2hlX3B0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2FjaGVfcHRyLT51Lm9mZnNldCA9IGRzdC5sX2FkZHIubF9wYWRkcgotCQktIGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgYXNlY3QpOwotCSAgICB9CQkJLyogSWYgbm8gbGluZW51bWJlciBleHBlY3QgYSBzeW1ib2wgaW5kZXggKi8KLQotCSAgY2FjaGVfcHRyKys7Ci0JICBzcmMrKzsKLQkgIGNvdW50ZXIrKzsKLQl9Ci0gICAgICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gMDsKLQotICAgIH0KLSAgYXNlY3QtPmxpbmVubyA9IGxpbmVub19jYWNoZTsKLSAgLyogRklYTUUsIGZyZWUgbmF0aXZlX2xpbmVubyBoZXJlLCBvciB1c2UgYWxsb2NhIG9yIHNvbWV0aGluZy4gKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNsdXJwIGluIHRoZSBzeW1ib2wgdGFibGUsIGNvbnZlcnRpbmcgaXQgdG8gZ2VuZXJpYyBmb3JtLiAgTm90ZQotICAgdGhhdCBpZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMgZGVmaW5lZCwgdGhlIGxpbmtlciB3aWxsIHJlYWQKLSAgIHN5bWJvbHMgdmlhIGNvZmZfbGlua19hZGRfc3ltYm9scywgcmF0aGVyIHRoYW4gdmlhIHRoaXMgcm91dGluZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlX3N5bWJvbHM7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNhY2hlZF9hcmVhOwotICB1bnNpZ25lZCBpbnQgKnRhYmxlX3B0cjsKLQotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX3N5bWJvbHMgPSAwOwotCi0gIGlmIChvYmpfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlICovCi0gIGlmICgobmF0aXZlX3N5bWJvbHMgPSBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiAoYWJmZCkpID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQkJCQkvKiBvbiBlcnJvciAqLwotCi0gIC8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gY2FjaGVkIGZvcm0gKi8KLSAgY2FjaGVkX2FyZWEgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpCi0JCQkgICAgICogc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSkpKTsKLQotICBpZiAoY2FjaGVkX2FyZWEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHRhYmxlX3B0ciA9ICgodW5zaWduZWQgaW50ICopCi0JICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpKSk7Ci0KLSAgaWYgKHRhYmxlX3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmRzdCA9IGNhY2hlZF9hcmVhOwotICAgICAgdW5zaWduZWQgaW50IGxhc3RfbmF0aXZlX2luZGV4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSAwOwotICAgICAgd2hpbGUgKHRoaXNfaW5kZXggPCBsYXN0X25hdGl2ZV9pbmRleCkKLQl7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpzcmMgPSBuYXRpdmVfc3ltYm9scyArIHRoaXNfaW5kZXg7Ci0JICB0YWJsZV9wdHJbdGhpc19pbmRleF0gPSBudW1iZXJfb2Zfc3ltYm9sczsKLQkgIGRzdC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0JICBkc3QtPnN5bWJvbC5uYW1lID0gKGNoYXIgKikgKHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpOwotCSAgLyogV2UgdXNlIHRoZSBuYXRpdmUgbmFtZSBmaWVsZCB0byBwb2ludCB0byB0aGUgY2FjaGVkIGZpZWxkLiAgKi8KLQkgIHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAobG9uZykgZHN0OwotCSAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCSAgICAgc3JjLT51LnN5bWVudC5uX3NjbnVtKTsKLQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gMDsKLQkgIGRzdC0+ZG9uZV9saW5lbm8gPSBmYWxzZTsKLQotCSAgc3dpdGNoIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzKQotCSAgICB7Ci0jaWZkZWYgSTk2MAotCSAgICBjYXNlIENfTEVBRkVYVDoKLSNpZiAwCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKLSNlbmRpZgotCSAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBuZXh0IGNhc2UgKi8KLQotI2VuZGlmCi0KLQkgICAgY2FzZSBDX0VYVDoKLQkgICAgY2FzZSBDX1dFQUtFWFQ6Ci0jaWYgZGVmaW5lZCBBUk0KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVDoKLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVEZVTkM6Ci0jZW5kaWYKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgY2FzZSBDX0hJREVYVDoKLSNlbmRpZgotI2lmZGVmIENfU1lTVEVNCi0JICAgIGNhc2UgQ19TWVNURU06CS8qIFN5c3RlbSBXaWRlIHZhcmlhYmxlICovCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgICAgICAgIC8qIEluIFBFLCAweDY4ICgxMDQpIGRlbm90ZXMgYSBzZWN0aW9uIHN5bWJvbCAqLwotICAgICAgICAgICAgY2FzZSBDX1NFQ1RJT046Ci0JICAgIC8qIEluIFBFLCAweDY5ICgxMDUpIGRlbm90ZXMgYSB3ZWFrIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0JICAgICAgc3dpdGNoIChjb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgJnNyYy0+dS5zeW1lbnQpKQotCQl7Ci0JCWNhc2UgQ09GRl9TWU1CT0xfR0xPQkFMOgotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkJICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgICAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCQkgIGlmIChJU0ZDTiAoKHNyYy0+dS5zeW1lbnQubl90eXBlKSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEEgZnVuY3Rpb24gZXh0IGRvZXMgbm90IGdvIGF0IHRoZSBlbmQgb2YgYQotCQkJIGZpbGUuICAqLwotCQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX0NPTU1PTjoKLQkJICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX1VOREVGSU5FRDoKLQkJICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7Ci0JCSAgYnJlYWs7IAotCi0JCWNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQkJICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfRVhQT1JUIHwgQlNGX1NFQ1RJT05fU1lNOwotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX0xPQ0FMOgotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkJICBpZiAoSVNGQ04gKChzcmMtPnUuc3ltZW50Lm5fdHlwZSkpKQotCQkgICAgZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQgfCBCU0ZfRlVOQ1RJT047Ci0JCSAgYnJlYWs7Ci0JCX0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICAgIC8qIEEgc3ltYm9sIHdpdGggYSBjc2VjdCBlbnRyeSBzaG91bGQgbm90IGdvIGF0IHRoZSBlbmQuICAqLwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTlRfV0VBSykKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1NFQ1RJT04KLQkJICAmJiBzcmMtPnUuc3ltZW50Lm5fc2NudW0gPiAwKQotCQl7Ci0JCSAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JCX0KLSNlbmRpZgotCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX1NUQVQ6CS8qIHN0YXRpYwkJCSAqLwotI2lmZGVmIEk5NjAKLQkgICAgY2FzZSBDX0xFQUZTVEFUOgkvKiBzdGF0aWMgbGVhZiBwcm9jZWR1cmUgICAgICAgICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkIEFSTSAKLSAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVQ6ICAgLyogVGh1bWIgc3RhdGljICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkxBQkVMOiAgLyogVGh1bWIgbGFiZWwgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVRGVU5DOi8qIFRodW1iIHN0YXRpYyBmdW5jdGlvbiAgICAgICAgKi8KLSNlbmRpZgotCSAgICBjYXNlIENfTEFCRUw6CS8qIGxhYmVsCQkJICovCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY251bSA9PSBOX0RFQlVHKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZWxzZQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQotCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSBzZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuICAqLwotCSAgICAgIGlmIChkc3QtPnN5bWJvbC5zZWN0aW9uKQotCQl7Ci0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkJICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgICAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCQl9Ci0JICAgICAgZWxzZQotCQlkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfTU9TOgkvKiBtZW1iZXIgb2Ygc3RydWN0dXJlCSAqLwotCSAgICBjYXNlIENfRU9TOgkvKiBlbmQgb2Ygc3RydWN0dXJlCQkgKi8KLSNpZmRlZiBOT1RERUYJCQkvKiBDX0FVVE9BUkcgaGFzIHRoZSBzYW1lIHZhbHVlICovCi0jaWZkZWYgQ19HTEJMUkVHCi0JICAgIGNhc2UgQ19HTEJMUkVHOgkvKiBBMjlrLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3MgKi8KLSNlbmRpZgotI2VuZGlmCi0JICAgIGNhc2UgQ19SRUdQQVJNOgkvKiByZWdpc3RlciBwYXJhbWV0ZXIJCSAqLwotCSAgICBjYXNlIENfUkVHOgkvKiByZWdpc3RlciB2YXJpYWJsZQkJICovCi0jaWZuZGVmIFRJQzgwQ09GRgotI2lmZGVmIENfQVVUT0FSRwotCSAgICBjYXNlIENfQVVUT0FSRzoJLyogOTYwLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3MgKi8KLSNlbmRpZgotI2VuZGlmCi0JICAgIGNhc2UgQ19UUERFRjoJLyogdHlwZSBkZWZpbml0aW9uCQkgKi8KLQkgICAgY2FzZSBDX0FSRzoKLQkgICAgY2FzZSBDX0FVVE86CS8qIGF1dG9tYXRpYyB2YXJpYWJsZSAqLwotCSAgICBjYXNlIENfRklFTEQ6CS8qIGJpdCBmaWVsZCAqLwotCSAgICBjYXNlIENfRU5UQUc6CS8qIGVudW1lcmF0aW9uIHRhZwkJICovCi0JICAgIGNhc2UgQ19NT0U6CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkgKi8KLQkgICAgY2FzZSBDX01PVToJLyogbWVtYmVyIG9mIHVuaW9uCQkgKi8KLQkgICAgY2FzZSBDX1VOVEFHOgkvKiB1bmlvbiB0YWcJCQkgKi8KLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfRklMRToJLyogZmlsZSBuYW1lCQkJICovCi0JICAgIGNhc2UgQ19TVFJUQUc6CS8qIHN0cnVjdHVyZSB0YWcJCSAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfR1NZTToKLQkgICAgY2FzZSBDX0xTWU06Ci0JICAgIGNhc2UgQ19QU1lNOgotCSAgICBjYXNlIENfUlNZTToKLQkgICAgY2FzZSBDX1JQU1lNOgotCSAgICBjYXNlIENfU1RTWU06Ci0JICAgIGNhc2UgQ19CQ09NTToKLQkgICAgY2FzZSBDX0VDT01NOgotCSAgICBjYXNlIENfREVDTDoKLQkgICAgY2FzZSBDX0VOVFJZOgotCSAgICBjYXNlIENfRlVOOgotCSAgICBjYXNlIENfRVNUQVQ6Ci0jZW5kaWYKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfQklOQ0w6CS8qIGJlZ2lubmluZyBvZiBpbmNsdWRlIGZpbGUgICAgICovCi0JICAgIGNhc2UgQ19FSU5DTDoJLyogZW5kaW5nIG9mIGluY2x1ZGUgZmlsZSAgICAgICAgKi8KLQkgICAgICAvKiBUaGUgdmFsdWUgaXMgYWN0dWFsbHkgYSBwb2ludGVyIGludG8gdGhlIGxpbmUgbnVtYmVycwotICAgICAgICAgICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIGxvY2F0ZSB0aGUgbGluZSBudW1iZXIgZW50cnksIGFuZAotICAgICAgICAgICAgICAgICBzZXQgdGhlIHNlY3Rpb24gdG8gdGhlIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgaXQsIGFuZAotICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGhlIGluZGV4IGluIHRoYXQgc2VjdGlvbi4gICovCi0JICAgICAgewotCQlhc2VjdGlvbiAqc2VjOwotCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkJZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLQkJICBpZiAoc2VjLT5saW5lX2ZpbGVwb3MgPD0gKGZpbGVfcHRyKSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJICAgICAgJiYgKChmaWxlX3B0cikgKHNlYy0+bGluZV9maWxlcG9zCi0JCQkJICAgICAgKyBzZWMtPmxpbmVub19jb3VudCAqIExJTkVTWikKLQkJCSAgPiAoZmlsZV9wdHIpIHNyYy0+dS5zeW1lbnQubl92YWx1ZSkpCi0JCSAgICBicmVhazsKLQkJaWYgKHNlYyA9PSBOVUxMKQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gMDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGRzdC0+c3ltYm9sLnNlY3Rpb24gPSBzZWM7Ci0JCSAgICBkc3QtPnN5bWJvbC52YWx1ZSA9ICgoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJCSAgLSBzZWMtPmxpbmVfZmlsZXBvcykKLQkJCQkJIC8gTElORVNaKTsKLQkJICAgIHNyYy0+Zml4X2xpbmUgPSAxOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0JTVEFUOgotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQotCSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBhY3R1YWxseSBhIHN5bWJvbCBpbmRleC4gIFNhdmUgYSBwb2ludGVyCi0JCSB0byB0aGUgc3ltYm9sIGluc3RlYWQgb2YgdGhlIGluZGV4LiAgRklYTUU6IFRoaXMKLQkJIHNob3VsZCB1c2UgYSB1bmlvbi4gICovCi0JICAgICAgc3JjLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKGxvbmcpIChuYXRpdmVfc3ltYm9scyArIHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgc3JjLT5maXhfdmFsdWUgPSAxOwotCSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLQkgICAgY2FzZSBDX0JMT0NLOgkvKiAiLmJiIiBvciAiLmViIgkJICovCi0JICAgIGNhc2UgQ19GQ046CQkvKiAiLmJmIiBvciAiLmVmIiAob3IgUEUgIi5sZiIpCSAqLwotCSAgICBjYXNlIENfRUZDTjoJLyogcGh5c2ljYWwgZW5kIG9mIGZ1bmN0aW9uCSAqLwotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JICAgICAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0Ci0JCSBvZiB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoZHN0LT5zeW1ib2wubmFtZSwgIi5iZiIpICE9IDApCi0JCXsKLQkJICAvKiBQRSB1c2VzIGZ1bm55IHZhbHVlcyBmb3IgLmVmIGFuZCAubGY7IGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICByZWxvY2F0ZSB0aGVtLiAgKi8KLQkJICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORyB8IEJTRl9ERUJVR0dJTkdfUkVMT0M7Ci0jZWxzZQotCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSBzZWN0aW9uLiAgKi8KLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgICAvKiBQRSBETExzIHNvbWV0aW1lcyBoYXZlIHplcm9lZCBvdXQgc3ltYm9scyBmb3Igc29tZQotICAgICAgICAgICAgICAgICByZWFzb24uICBKdXN0IGlnbm9yZSB0aGVtIHdpdGhvdXQgYSB3YXJuaW5nLiAgKi8KLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3R5cGUgPT0gMAotCQkgICYmIHNyYy0+dS5zeW1lbnQubl92YWx1ZSA9PSAwCi0JCSAgJiYgc3JjLT51LnN5bWVudC5uX3NjbnVtID09IDApCi0JCWJyZWFrOwotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgQ19FWFRERUY6CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSAqLwotCSAgICBjYXNlIENfVUxBQkVMOgkvKiB1bmRlZmluZWQgbGFiZWwJCSAqLwotCSAgICBjYXNlIENfVVNUQVRJQzoJLyogdW5kZWZpbmVkIHN0YXRpYwkJICovCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgICAgICAgLyogQ19MSU5FIGluIHJlZ3VsYXIgY29mZiBpcyAweDY4LiAgTlQgaGFzIHRha2VuIG92ZXIgdGhpcyBzdG9yYWdlCi0gICAgICAgICAgICAgICBjbGFzcyB0byByZXByZXNlbnQgYSBzZWN0aW9uIHN5bWJvbCAqLwotCSAgICBjYXNlIENfTElORToJLyogbGluZSAjIHJlZm9ybWF0dGVkIGFzIHN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCSAgICAgIC8qIE5UIHVzZXMgMHg2NyBmb3IgYSB3ZWFrIHN5bWJvbCwgbm90IENfQUxJQVMuICAqLwotCSAgICBjYXNlIENfQUxJQVM6CS8qIGR1cGxpY2F0ZSB0YWcJCSAqLwotI2VuZGlmCi0JICAgICAgLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgVEljODAgKi8KLSNpZmRlZiBUSUM4MENPRkYKLQkgICAgY2FzZSBDX1VFWFQ6CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZW5kaWYKLQkgICAgY2FzZSBDX1NUQVRMQUI6CS8qIFN0YXRpYyBsb2FkIHRpbWUgbGFiZWwgKi8KLQkgICAgY2FzZSBDX0VYVExBQjoJLyogRXh0ZXJuYWwgbG9hZCB0aW1lIGxhYmVsICovCi0JICAgIGNhc2UgQ19ISURERU46CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLwotCSAgICBkZWZhdWx0OgotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IFVucmVjb2duaXplZCBzdG9yYWdlIGNsYXNzICVkIGZvciAlcyBzeW1ib2wgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNyYy0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCSBkc3QtPnN5bWJvbC5zZWN0aW9uLT5uYW1lLCBkc3QtPnN5bWJvbC5uYW1lKTsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0vKiAgICAgIEJGRF9BU1NFUlQoZHN0LT5zeW1ib2wuZmxhZ3MgIT0gMCk7Ki8KLQotCSAgZHN0LT5uYXRpdmUgPSBzcmM7Ci0KLQkgIGRzdC0+c3ltYm9sLnVkYXRhLmkgPSAwOwotCSAgZHN0LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLQkgIHRoaXNfaW5kZXggKz0gKHNyYy0+dS5zeW1lbnQubl9udW1hdXgpICsgMTsKLQkgIGRzdCsrOwotCSAgbnVtYmVyX29mX3N5bWJvbHMrKzsKLQl9CQkJLyogd2FsayB0aGUgbmF0aXZlIHN5bXRhYiAqLwotICAgIH0JCQkJLyogYmZkaXplIHRoZSBuYXRpdmUgc3ltdGFiICovCi0KLSAgb2JqX3N5bWJvbHMgKGFiZmQpID0gY2FjaGVkX2FyZWE7Ci0gIG9ial9yYXdfc3ltZW50cyAoYWJmZCkgPSBuYXRpdmVfc3ltYm9sczsKLQotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IG51bWJlcl9vZl9zeW1ib2xzOwotICBvYmpfY29udmVydCAoYWJmZCkgPSB0YWJsZV9wdHI7Ci0gIC8qIFNsdXJwIHRoZSBsaW5lIHRhYmxlcyBmb3IgZWFjaCBzZWN0aW9uIHRvbyAqLwotICB7Ci0gICAgYXNlY3Rpb24gKnA7Ci0gICAgcCA9IGFiZmQtPnNlY3Rpb25zOwotICAgIHdoaWxlIChwKQotICAgICAgewotCWNvZmZfc2x1cnBfbGluZV90YWJsZSAoYWJmZCwgcCk7Ci0JcCA9IHAtPm5leHQ7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CQkJCS8qIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKCkgKi8KLQotLyogQ2xhc3NpZnkgYSBDT0ZGIHN5bWJvbC4gIEEgY291cGxlIG9mIHRhcmdldHMgaGF2ZSBnbG9iYWxseSB2aXNpYmxlCi0gICBzeW1ib2xzIHdoaWNoIGFyZSBub3QgY2xhc3MgQ19FWFQsIGFuZCB0aGlzIGhhbmRsZXMgdGhvc2UuICBJdCBhbHNvCi0gICByZWNvZ25pemVzIHNvbWUgc3BlY2lhbCBQRSBjYXNlcy4gICovCi0KLXN0YXRpYyBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uCi1jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bWVudDsKLXsKLSAgLyogRklYTUU6IFRoaXMgcGFydGlhbGx5IGR1cGxpY2F0ZXMgdGhlIHN3aXRjaCBpbgotICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi0gIHN3aXRjaCAoc3ltZW50LT5uX3NjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBJOTYwCi0gICAgY2FzZSBDX0xFQUZFWFQ6Ci0jZW5kaWYKLSNpZmRlZiBBUk0KLSAgICBjYXNlIENfVEhVTUJFWFQ6Ci0gICAgY2FzZSBDX1RIVU1CRVhURlVOQzoKLSNlbmRpZgotI2lmZGVmIENfU1lTVEVNCi0gICAgY2FzZSBDX1NZU1RFTToKLSNlbmRpZgotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JewotCSAgaWYgKHN5bWVudC0+bl92YWx1ZSA9PSAwKQotCSAgICByZXR1cm4gQ09GRl9TWU1CT0xfVU5ERUZJTkVEOwotCSAgZWxzZQotCSAgICByZXR1cm4gQ09GRl9TWU1CT0xfQ09NTU9OOwotCX0KLSAgICAgIHJldHVybiBDT0ZGX1NZTUJPTF9HTE9CQUw7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIGlmIChzeW1lbnQtPm5fc2NsYXNzID09IENfU1RBVCkKLSAgICB7Ci0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JewotCSAgLyogVGhlIE1pY3Jvc29mdCBjb21waWxlciBzb21ldGltZXMgZ2VuZXJhdGVzIHRoZXNlIGlmIGEKLSAgICAgICAgICAgICBzbWFsbCBzdGF0aWMgZnVuY3Rpb24gaXMgaW5saW5lZCBldmVyeSB0aW1lIGl0IGlzIHVzZWQuCi0gICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGRpc2NhcmRlZCwgYnV0IHRoZSBzeW1ib2wgdGFibGUgZW50cnkKLSAgICAgICAgICAgICByZW1haW5zLiAgKi8KLQkgIHJldHVybiBDT0ZGX1NZTUJPTF9MT0NBTDsKLQl9Ci0KLSNpZmRlZiBTVFJJQ1RfUEVfRk9STUFUCi0gICAgICAvKiBUaGlzIGlzIGNvcnJlY3QgZm9yIE1pY3Jvc29mdCBnZW5lcmF0ZWQgb2JqZWN0cywgYnV0IGl0Ci0gICAgICAgICBicmVha3MgZ2FzIGdlbmVyYXRlZCBvYmplY3RzLiAgKi8KLQotICAgICAgaWYgKHN5bWVudC0+bl92YWx1ZSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bWVudC0+bl9zY251bSk7Ci0JICBpZiAoc2VjICE9IE5VTEwKLQkgICAgICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCSAgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW1lbnQsIGJ1ZikpCi0JCSAgPT0gMCkpCi0JICAgIHJldHVybiBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOwotCX0KLSNlbmRpZgotCi0gICAgICByZXR1cm4gQ09GRl9TWU1CT0xfTE9DQUw7Ci0gICAgfQotCi0gIGlmIChzeW1lbnQtPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICAvKiBJbiBzb21lIGNhc2VzIGluIGEgRExMIGdlbmVyYXRlZCBieSB0aGUgTWljcm9zb2Z0IGxpbmtlciwgdGhlCi0gICAgICAgICBuX3ZhbHVlIGZpZWxkIHdpbGwgY29udGFpbiBnYXJiYWdlLiAgRklYTUU6IFRoaXMgc2hvdWxkCi0gICAgICAgICBwcm9iYWJseSBiZSBoYW5kbGVkIGJ5IHRoZSBzd2FwcGluZyBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IDA7Ci0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JcmV0dXJuIENPRkZfU1lNQk9MX1VOREVGSU5FRDsKLSAgICAgIHJldHVybiBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOwotICAgIH0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotICAvKiBJZiBpdCBpcyBub3QgYSBnbG9iYWwgc3ltYm9sLCB3ZSBwcmVzdW1lIGl0IGlzIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQotICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0gICAgewotICAgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIndhcm5pbmc6ICVzOiBsb2NhbCBzeW1ib2wgYCVzJyBoYXMgbm8gc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW1lbnQsIGJ1ZikpOwotICAgIH0KLQotICByZXR1cm4gQ09GRl9TWU1CT0xfTE9DQUw7Ci19Ci0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JUmVhZGluZyByZWxvY2F0aW9ucwotCi0JQ29mZiByZWxvY2F0aW9ucyBhcmUgZWFzaWx5IHRyYW5zZm9ybWVkIGludG8gdGhlIGludGVybmFsIEJGRCBmb3JtCi0JKEBjb2Rle2FyZWxlbnR9KS4KLQotCVJlYWRpbmcgYSBjb2ZmIHJlbG9jYXRpb24gdGFibGUgaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHN0YWdlczoKLQotCW8gUmVhZCB0aGUgZW50aXJlIGNvZmYgcmVsb2NhdGlvbiB0YWJsZSBpbnRvIG1lbW9yeS4KLQotCW8gUHJvY2VzcyBlYWNoIHJlbG9jYXRpb24gaW4gdHVybjsgZmlyc3Qgc3dhcCBpdCBmcm9tIHRoZQotCWV4dGVybmFsIHRvIHRoZSBpbnRlcm5hbCBmb3JtLgotCi0JbyBUdXJuIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHN5bWJvbCBpbmRleAotCWludG8gYSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUuCi0JVGhpcyB0YWJsZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIGJ5IGEgY2FsbCB0bwotCUBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4gVGhlIGJhY2sgZW5kIHdpbGwgY2FsbCB0aGF0Ci0Jcm91dGluZSBhbmQgc2F2ZSB0aGUgcmVzdWx0IGlmIGEgY2Fub25pY2FsaXphdGlvbiBoYXNuJ3QgYmVlbiBkb25lLgotCi0JbyBUaGUgcmVsb2MgaW5kZXggaXMgdHVybmVkIGludG8gYSBwb2ludGVyIHRvIGEgaG93dG8KLQlzdHJ1Y3R1cmUsIGluIGEgYmFjayBlbmQgc3BlY2lmaWMgd2F5LiBGb3IgaW5zdGFuY2UsIHRoZSAzODYKLQlhbmQgOTYwIHVzZSB0aGUgQGNvZGV7cl90eXBlfSB0byBkaXJlY3RseSBwcm9kdWNlIGFuIGluZGV4Ci0JaW50byBhIGhvd3RvIHRhYmxlIHZlY3RvcjsgdGhlIDg4ayBzdWJ0cmFjdHMgYSBudW1iZXIgZnJvbSB0aGUKLQlAY29kZXtyX3R5cGV9IGZpZWxkIGFuZCBjcmVhdGVzIGFuIGFkZGVuZCBmaWVsZC4KLQotCi0qLwotCi0jaWZuZGVmIENBTENfQURERU5ECi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsgICAgICBcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOyAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci17Ci0gIFJFTE9DICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmF0aXZlX3JlbG9jcyA9Ci0gICAgKFJFTE9DICopIGJ1eV9hbmRfcmVhZCAoYWJmZCwKLQkJCSAgICBhc2VjdC0+cmVsX2ZpbGVwb3MsCi0JCQkgICAgU0VFS19TRVQsCi0JCQkgICAgKHNpemVfdCkgKFJFTFNaICoKLQkJCQkgICAgICBhc2VjdC0+cmVsb2NfY291bnQpKTsKLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgKHNpemVfdCkgKGFzZWN0LT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCkpKTsKLQotICBpZiAocmVsb2NfY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IGFzZWN0LT5yZWxvY19jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGRzdDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqc3JjOwotI2lmbmRlZiBSRUxPQ19QUk9DRVNTSU5HCi0gICAgICBhc3ltYm9sICpwdHI7Ci0jZW5kaWYKLQotICAgICAgY2FjaGVfcHRyID0gcmVsb2NfY2FjaGUgKyBpZHg7Ci0gICAgICBzcmMgPSBuYXRpdmVfcmVsb2NzICsgaWR4OwotCi0gICAgICBjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgJmRzdCk7Ci0KLSNpZmRlZiBSRUxPQ19QUk9DRVNTSU5HCi0gICAgICBSRUxPQ19QUk9DRVNTSU5HIChjYWNoZV9wdHIsICZkc3QsIHN5bWJvbHMsIGFiZmQsIGFzZWN0KTsKLSNlbHNlCi0gICAgICBjYWNoZV9wdHItPmFkZHJlc3MgPSBkc3Qucl92YWRkcjsKLQotICAgICAgaWYgKGRzdC5yX3N5bW5keCAhPSAtMSkKLQl7Ci0JICBpZiAoZHN0LnJfc3ltbmR4IDwgMCB8fCBkc3Qucl9zeW1uZHggPj0gb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZHN0LnJfc3ltbmR4KTsKLQkgICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgICAgcHRyID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IChzeW1ib2xzCi0JCQkJCSsgb2JqX2NvbnZlcnQgKGFiZmQpW2RzdC5yX3N5bW5keF0pOwotCSAgICAgIHB0ciA9ICooY2FjaGVfcHRyLT5zeW1fcHRyX3B0cik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcHRyID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2xzIGRlZmluaXRpb25zIHRoYXQgd2UgaGF2ZSByZWFkIGluIGhhdmUgYmVlbgotCSByZWxvY2F0ZWQgYXMgaWYgdGhlaXIgc2VjdGlvbnMgc3RhcnRlZCBhdCAwLiBCdXQgdGhlIG9mZnNldHMKLQkgcmVmZXJpbmcgdG8gdGhlIHN5bWJvbHMgaW4gdGhlIHJhdyBkYXRhIGhhdmUgbm90IGJlZW4KLQkgbW9kaWZpZWQsIHNvIHdlIGhhdmUgdG8gaGF2ZSBhIG5lZ2F0aXZlIGFkZGVuZCB0byBjb21wZW5zYXRlLgotCi0JIE5vdGUgdGhhdCBzeW1ib2xzIHdoaWNoIHVzZWQgdG8gYmUgY29tbW9uIG11c3QgYmUgbGVmdCBhbG9uZSAqLwotCi0gICAgICAvKiBDYWxjdWxhdGUgYW55IHJlbG9jIGFkZGVuZCBieSBsb29raW5nIGF0IHRoZSBzeW1ib2wgKi8KLSAgICAgIENBTENfQURERU5EIChhYmZkLCBwdHIsIGRzdCwgY2FjaGVfcHRyKTsKLQotICAgICAgY2FjaGVfcHRyLT5hZGRyZXNzIC09IGFzZWN0LT52bWE7Ci0vKiAhISAgICAgY2FjaGVfcHRyLT5zZWN0aW9uID0gKGFzZWN0aW9uICopIE5VTEw7Ki8KLQotICAgICAgLyogRmlsbCBpbiB0aGUgY2FjaGVfcHRyLT5ob3d0byBmaWVsZCBmcm9tIGRzdC5yX3R5cGUgKi8KLSAgICAgIFJUWVBFMkhPV1RPIChjYWNoZV9wdHIsICZkc3QpOwotI2VuZGlmCS8qIFJFTE9DX1BST0NFU1NJTkcgKi8KLQotICAgICAgaWYgKGNhY2hlX3B0ci0+aG93dG8gPT0gTlVMTCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBpbGxlZ2FsIHJlbG9jYXRpb24gdHlwZSAlZCBhdCBhZGRyZXNzIDB4JWx4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZHN0LnJfdHlwZSwgKGxvbmcpIGRzdC5yX3ZhZGRyKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotI2lmZGVmIFJUWVBFMkhPV1RPCi0KLS8qIEdldCB0aGUgaG93dG8gc3RydWN0dXJlIGZvciBhIHJlbG9jLiAgVGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIGZpbGUKLSAgIGluY2x1ZGluZyB0aGlzIG9uZSBkZWZpbmVzIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiB0byBiZQotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiwgc28gaXQgaXMgT0sgaWYgaXQgZG9lcyBub3QKLSAgIGFsd2F5cyB3b3JrLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBpbmNsdWRpbmcgZmlsZSB0bwotICAgbWFrZSBzdXJlIGl0IGlzIHJlYXNvbmFibGUgaWYgaXQgaXMgbmVlZGVkLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhcmVsZW50IGdlbnJlbDsKLQotICBSVFlQRTJIT1dUTyAoJmdlbnJlbCwgcmVsKTsKLSAgcmV0dXJuIGdlbnJlbC5ob3d0bzsKLX0KLQotI2Vsc2UgLyogISBkZWZpbmVkIChSVFlQRTJIT1dUTykgKi8KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIE5VTEwKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoUlRZUEUySE9XVE8pICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotCi0vKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUuICAqLwotc3RhdGljIGxvbmcKLWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKiByZWxwdHI7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICAvKiB0aGlzIHNlY3Rpb24gaGFzIHJlbG9jcyBtYWRlIHVwIGJ5IHVzLCB0aGV5IGFyZSBub3QgaW4gdGhlCi0gICAgICAgZmlsZSwgc28gdGFrZSB0aGVtIG91dCBvZiB0aGVpciBjaGFpbiBhbmQgcGxhY2UgdGhlbSBpbnRvCi0gICAgICAgdGhlIGRhdGEgYXJlYSBwcm92aWRlZCAqLwotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0KLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLSNpZmRlZiBHTlU5NjAKLWZpbGVfcHRyCi1jb2ZmX3N5bV9maWxlcG9zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWxvYzE2X2VzdGltYXRlCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBkdW1teV9yZWxvYzE2X2VzdGltYXRlCi0KLXN0YXRpYyBpbnQgZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLCB1bnNpZ25lZCBpbnQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1kdW1teV9yZWxvYzE2X2VzdGltYXRlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMKLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcwotCi0vKiBUaGlzIHdvcmtzIGV2ZW4gaWYgYWJvcnQgaXMgbm90IGRlY2xhcmVkIGluIGFueSBoZWFkZXIgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBhcmVsZW50ICosCi0JICAgYmZkX2J5dGUgKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9ieXRlICpkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0jZW5kaWYKLQotLyogSWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzIGRlZmluZWQsIHdlIGNhbiB1c2UgdGhlIG9wdGltaXplZCBDT0ZGCi0gICBiYWNrZW5kIGxpbmtlci4gIE90aGVyd2lzZSB3ZSBtdXN0IGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkIGxpbmtlci4gICovCi0jaWZkZWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgY29mZl9iZmRfZmluYWxfbGluayBfYmZkX2NvZmZfZmluYWxfbGluawotI2VuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbikgKi8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIE5VTEwKLSNpZm5kZWYgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZW5kaWYKLSNkZWZpbmUgY29mZl9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0jaWZuZGVmIGNvZmZfc3RhcnRfZmluYWxfbGluawotI2RlZmluZSBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9hZGp1c3Rfc3ltbmR4Ci0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBOVUxMCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIChhYmZkLCBpbmZvKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLQotc3RhdGljIGJvb2xlYW4gY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCAoYWJmZCwgcGZpbmZvKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfU1dBUF9hdXhfaW4KLSNkZWZpbmUgY29mZl9TV0FQX2F1eF9pbiBjb2ZmX3N3YXBfYXV4X2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3N5bV9pbgotI2RlZmluZSBjb2ZmX1NXQVBfc3ltX2luIGNvZmZfc3dhcF9zeW1faW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfbGluZW5vX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9saW5lbm9faW4gY29mZl9zd2FwX2xpbmVub19pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9hdXhfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9hdXhfb3V0IGNvZmZfc3dhcF9hdXhfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3N5bV9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9vdXQgY29mZl9zd2FwX3N5bV9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfbGluZW5vX291dAotI2RlZmluZSBjb2ZmX1NXQVBfbGluZW5vX291dCBjb2ZmX3N3YXBfbGluZW5vX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9yZWxvY19vdXQKLSNkZWZpbmUgY29mZl9TV0FQX3JlbG9jX291dCBjb2ZmX3N3YXBfcmVsb2Nfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2ZpbGVoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9maWxlaGRyX291dCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2FvdXRoZHJfb3V0IGNvZmZfc3dhcF9hb3V0aGRyX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zY25oZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9zY25oZHJfb3V0IGNvZmZfc3dhcF9zY25oZHJfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3JlbG9jX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9yZWxvY19pbiBjb2ZmX3N3YXBfcmVsb2NfaW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfZmlsZWhkcl9pbiBjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9hb3V0aGRyX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9hb3V0aGRyX2luIGNvZmZfc3dhcF9hb3V0aGRyX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfc2NuaGRyX2luIGNvZmZfc3dhcF9zY25oZHJfaW4KLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlID0KLXsKLSAgY29mZl9TV0FQX2F1eF9pbiwgY29mZl9TV0FQX3N5bV9pbiwgY29mZl9TV0FQX2xpbmVub19pbiwKLSAgY29mZl9TV0FQX2F1eF9vdXQsIGNvZmZfU1dBUF9zeW1fb3V0LAotICBjb2ZmX1NXQVBfbGluZW5vX291dCwgY29mZl9TV0FQX3JlbG9jX291dCwKLSAgY29mZl9TV0FQX2ZpbGVoZHJfb3V0LCBjb2ZmX1NXQVBfYW91dGhkcl9vdXQsCi0gIGNvZmZfU1dBUF9zY25oZHJfb3V0LAotICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaLCBTWU1FU1osIEFVWEVTWiwgUkVMU1osIExJTkVTWiwgRklMTk1MRU4sCi0jaWZkZWYgQ09GRl9MT05HX0ZJTEVOQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSAgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLAotICBjb2ZmX1NXQVBfZmlsZWhkcl9pbiwgY29mZl9TV0FQX2FvdXRoZHJfaW4sIGNvZmZfU1dBUF9zY25oZHJfaW4sCi0gIGNvZmZfU1dBUF9yZWxvY19pbiwgY29mZl9iYWRfZm9ybWF0X2hvb2ssIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICBjb2ZmX21rb2JqZWN0X2hvb2ssIHN0eXBfdG9fc2VjX2ZsYWdzLCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywKLSAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUsIHN5bW5hbWVfaW5fZGVidWdfaG9vaywgY29mZl9wb2ludGVyaXplX2F1eF9ob29rLAotICBjb2ZmX3ByaW50X2F1eCwgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUsCi0gIGNvZmZfY2xhc3NpZnlfc3ltYm9sLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLSAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCi0gIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAotICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLX07Ci0KLSNpZm5kZWYgY29mZl9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZQljb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwICAgICAgICAgICAgICBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbyAgICAgICAgICAgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lCWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgICAgICAgICAgIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhICAgICBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzICAgICAgICAgIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgCi0jZGVmaW5lIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgICAgIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCSAgICBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGNvZmZfcmVhZF9taW5pc3ltYm9scwkJICAgIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIGNvZmZfbWluaXN5bWJvbF90b19zeW1ib2wJICAgIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotI2VuZGlmCi0KLS8qIFRoZSByZWxvYyBsb29rdXAgcm91dGluZSBtdXN0IGJlIHN1cHBsaWVkIGJ5IGVhY2ggaW5kaXZpZHVhbCBDT0ZGCi0gICBiYWNrZW5kLiAgKi8KLSNpZm5kZWYgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJICAgIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24JCSAgICBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBjb2ZmX2JmZF9nY19zZWN0aW9ucwkJICAgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZW5kaWYKLQotI2RlZmluZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyhWQVIsIE5BTUUsIEVYVFJBX09fRkxBR1MsIEVYVFJBX1NfRkxBR1MsIFVOREVSLCBBTFRFUk5BVElWRSkJXAotY29uc3QgYmZkX3RhcmdldCBWQVIgPQkJCQkJCQlcCi17CQkJCQkJCQkJXAotICBOQU1FICwJCQkJCQkJCVwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCQkJCQkJXAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8JCVwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8JCVwKLSAgLyogb2JqZWN0IGZsYWdzICovCQkJCQkJCVwKLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAkJCVwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBFWFRSQV9PX0ZMQUdTKSwJCQlcCi0gIC8qIHNlY3Rpb24gZmxhZ3MgKi8JCQkJCQkJXAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgRVhUUkFfU19GTEFHUyksXAotICBVTkRFUiwJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCQlcCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8JCQlcCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwkJCVwKLSAgCQkJCQkJCQkJXAotICAvKiBEYXRhIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgKi8JCQkJCVwKLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAkJCQlcCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwJCQkJXAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCQkJCVwKLSAgCQkJCQkJCQkJXAotICAvKiBIZWFkZXIgY29udmVyc2lvbiBmdW5jdGlvbnMuICAqLwkJCQkJXAotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCQkJCVwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAkJCQlcCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJCQkJXAotCQkJCQkJCQkJXAotCS8qIGJmZF9jaGVja19mb3JtYXQgKi8JCQkJCQlcCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJCVwKLSAgICBfYmZkX2R1bW15X3RhcmdldCB9LAkJCQkJCVwKLQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwkJCQkJCVwKLSAgeyBiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZSB9LAlcCi0JLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCQkJCQlcCi0gIHsgYmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAlcCi0gICAgYmZkX2ZhbHNlIH0sCQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwJCQkJXAotICAJCQkJCQkJCQlcCi0gIEFMVEVSTkFUSVZFLAkJCQkJCQkJXAotICAJCQkJCQkJCQlcCi0gIENPRkZfU1dBUF9UQUJMRQkJCQkJCQlcCi19OwotCi0jZGVmaW5lIENSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDKFZBUiwgTkFNRSwgRVhUUkFfT19GTEFHUywgRVhUUkFfU19GTEFHUywgVU5ERVIsIEFMVEVSTkFUSVZFKQlcCi1jb25zdCBiZmRfdGFyZ2V0IFZBUiA9CQkJCQkJCVwKLXsJCQkJCQkJCQlcCi0gIE5BTUUgLAkJCQkJCQkJXAotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCQkJCQlcCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwkJXAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwlcCi0JLyogb2JqZWN0IGZsYWdzICovCQkJCQkJXAotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CQkJXAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEVYVFJBX09fRkxBR1MpLAkJCVwKLQkvKiBzZWN0aW9uIGZsYWdzICovCQkJCQkJXAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgRVhUUkFfU19GTEFHUyksXAotICBVTkRFUiwJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCQlcCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8JCQlcCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwkJCVwKLQkJCQkJCQkJCVwKLSAgLyogRGF0YSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCQkJCQlcCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwJCQkJXAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCQkJCVwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkJCQlcCi0gIC8qIEhlYWRlciBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCQkJCQlcCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwJCQkJXAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCQkJCVwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkJCQlcCi0JLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwkJCQkJCVwKLSAgeyBfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAkJXAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0IH0sCQkJCQkJXAotICAgICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCQkJCQkJXAotICB7IGJmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlIH0sCVwKLQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8JCQkJCVwKLSAgeyBiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCVwKLSAgICBiZmRfZmFsc2UgfSwJCQkJCQkJXAotCQkJCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAkJCQlcCi0JCQkJCQkJCQlcCi0gIEFMVEVSTkFUSVZFLAkJCQkJCQkJXAotICAJCQkJCQkJCQlcCi0gIENPRkZfU1dBUF9UQUJMRQkJCQkJCQlcCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmZnZW4uYyBiL2JmZC9jb2ZmZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2ExNWYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI0MzIgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgQ09GRiwgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBNb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20uCi0gICBTcGxpdCBvdXQgb2YgY29mZmNvZGUuaCBieSBJYW4gVGF5bG9yLCBpYW5AY3lnbnVzLmNvbS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBDT0ZGIGNvZGUgdGhhdCBpcyBub3QgZGVwZW5kZW50IG9uIGFueQotICAgcGFydGljdWxhciBDT0ZGIHRhcmdldC4gIFRoZXJlIGlzIG9ubHkgb25lIHZlcnNpb24gb2YgdGhpcyBmaWxlIGluCi0gICBsaWJiZmQuYSwgc28gbm8gdGFyZ2V0IHNwZWNpZmljIGNvZGUgbWF5IGJlIHB1dCBpbiBoZXJlLiAgT3IsIHRvCi0gICBwdXQgaXQgYW5vdGhlciB3YXksCi0KLSAgICoqKioqKioqKiogRE8gTk9UIFBVVCBUQVJHRVQgU1BFQ0lGSUMgQ09ERSBJTiBUSElTIEZJTEUgKioqKioqKioqKgotCi0gICBJZiB5b3UgbmVlZCB0byBhZGQgc29tZSB0YXJnZXQgc3BlY2lmaWMgYmVoYXZpb3VyLCBhZGQgYSBuZXcgaG9vawotICAgZnVuY3Rpb24gdG8gYmZkX2NvZmZfYmFja2VuZF9kYXRhLgotCi0gICBTb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWxzbyBjYWxsZWQgYnkgdGhlIEVDT0ZGIHJvdXRpbmVzLgotICAgVGhvc2UgZnVuY3Rpb25zIG1heSBub3QgdXNlIGFueSBDT0ZGIHNwZWNpZmljIGluZm9ybWF0aW9uLCBzdWNoIGFzCi0gICBjb2ZmX2RhdGEgKGFiZmQpLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyB2b2lkIGNvZmZfZml4X3N5bWJvbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgdW5zaWduZWQgaW50ICosCi0JICAgYmZkX3NpemVfdHlwZSAqLCBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCB1bnNpZ25lZCBpbnQgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgY29mZl9zeW1ib2xfdHlwZSAqLCB1bnNpZ25lZCBpbnQgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIGNvZmZfcG9pbnRlcml6ZV9hdXgKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqY29mZl9yZWFsX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCwgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKiwgCi0JICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOwotc3RhdGljIHZvaWQgZml4dXBfc3ltYm9sX3ZhbHVlCi0gIFBBUkFNUyAoKGJmZCAqLCBjb2ZmX3N5bWJvbF90eXBlICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotc3RhdGljIGNoYXIgKmJ1aWxkX2RlYnVnX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICpjb3B5X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgaW50KSk7Ci0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogVGFrZSBhIHNlY3Rpb24gaGVhZGVyIHJlYWQgZnJvbSBhIGNvZmYgZmlsZSAoaW4gSE9TVCBieXRlIG9yZGVyKSwKLSAgIGFuZCBtYWtlIGEgQkZEICJzZWN0aW9uIiBvdXQgb2YgaXQuICBUaGlzIGlzIHVzZWQgYnkgRUNPRkYuICAqLwotc3RhdGljIGJvb2xlYW4KLW1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSAoYWJmZCwgaGRyLCB0YXJnZXRfaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyOwotICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2luZGV4OwotewotICBhc2VjdGlvbiAqcmV0dXJuX3NlY3Rpb247Ci0gIGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IE5VTEw7Ci0KLSAgLyogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBpbiBQRS4gICovCi0gIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpCi0gICAgICAmJiBoZHItPnNfbmFtZVswXSA9PSAnLycpCi0gICAgewotICAgICAgY2hhciBidWZbU0NOTk1MRU5dOwotICAgICAgbG9uZyBzdHJpbmRleDsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmdzOwotCi0gICAgICBtZW1jcHkgKGJ1ZiwgaGRyLT5zX25hbWUgKyAxLCBTQ05OTUxFTiAtIDEpOwotICAgICAgYnVmW1NDTk5NTEVOIC0gMV0gPSAnXDAnOwotICAgICAgc3RyaW5kZXggPSBzdHJ0b2wgKGJ1ZiwgJnAsIDEwKTsKLSAgICAgIGlmICgqcCA9PSAnXDAnICYmIHN0cmluZGV4ID49IDApCi0JewotCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGSVhNRTogRm9yIGV4dHJhIHNhZmV0eSwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0Ci0gICAgICAgICAgICAgc3RyaW5kZXggZG9lcyBub3QgcnVuIHVzIHBhc3QgdGhlIGVuZCwgYnV0IHJpZ2h0IG5vdyB3ZQotICAgICAgICAgICAgIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIHN0cmluZ3MgKz0gc3RyaW5kZXg7Ci0JICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN0cmluZ3MpICsgMSk7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzdHJjcHkgKG5hbWUsIHN0cmluZ3MpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBBc3NvcnRlZCB3YXN0YWdlIHRvIG51bGwtdGVybWluYXRlIHRoZSBuYW1lLCB0aGFua3MgQVQmVCEgKi8KLSAgICAgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaGRyLT5zX25hbWUpICsgMSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN0cm5jcHkgKG5hbWUsIChjaGFyICopICZoZHItPnNfbmFtZVswXSwgc2l6ZW9mIChoZHItPnNfbmFtZSkpOwotICAgICAgbmFtZVtzaXplb2YgKGhkci0+c19uYW1lKV0gPSAwOwotICAgIH0KLQotICByZXR1cm5fc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKHJldHVybl9zZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybl9zZWN0aW9uLT52bWEgPSBoZHItPnNfdmFkZHI7Ci0gIHJldHVybl9zZWN0aW9uLT5sbWEgPSBoZHItPnNfcGFkZHI7Ci0gIHJldHVybl9zZWN0aW9uLT5fcmF3X3NpemUgPSBoZHItPnNfc2l6ZTsKLSAgcmV0dXJuX3NlY3Rpb24tPmZpbGVwb3MgPSBoZHItPnNfc2NucHRyOwotICByZXR1cm5fc2VjdGlvbi0+cmVsX2ZpbGVwb3MgPSBoZHItPnNfcmVscHRyOwotICByZXR1cm5fc2VjdGlvbi0+cmVsb2NfY291bnQgPSBoZHItPnNfbnJlbG9jOwotCi0gIGJmZF9jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgcmV0dXJuX3NlY3Rpb24sIGhkcik7Ci0KLSAgcmV0dXJuX3NlY3Rpb24tPmxpbmVfZmlsZXBvcyA9IGhkci0+c19sbm5vcHRyOwotCi0gIHJldHVybl9zZWN0aW9uLT5saW5lbm9fY291bnQgPSBoZHItPnNfbmxubm87Ci0gIHJldHVybl9zZWN0aW9uLT51c2VyZGF0YSA9IE5VTEw7Ci0gIHJldHVybl9zZWN0aW9uLT5uZXh0ID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIHJldHVybl9zZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0YXJnZXRfaW5kZXg7Ci0gIHJldHVybl9zZWN0aW9uLT5mbGFncyA9IGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2sgKGFiZmQsIGhkciwgbmFtZSwKLQkJCQkJCQkgICByZXR1cm5fc2VjdGlvbik7Ci0KLSAgLyogQXQgbGVhc3Qgb24gaTM4Ni1jb2ZmLCB0aGUgbGluZSBudW1iZXIgY291bnQgZm9yIGEgc2hhcmVkIGxpYnJhcnkKLSAgICAgc2VjdGlvbiBtdXN0IGJlIGlnbm9yZWQuICAqLwotICBpZiAoKHJldHVybl9zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5saW5lbm9fY291bnQgPSAwOwotCi0gIGlmIChoZHItPnNfbnJlbG9jICE9IDApCi0gICAgcmV0dXJuX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGNoZWNrICdoZHItPnNfc2l6ZSA+IDAnICovCi0gIGlmIChoZHItPnNfc2NucHRyICE9IDApCi0gICAgcmV0dXJuX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGluIGEgQ09GRiBvYmplY3QgYW5kIG1ha2UgaXQgaW50byBhIEJGRC4gIFRoaXMgaXMgdXNlZCBieQotICAgRUNPRkYgYXMgd2VsbC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNvZmZfcmVhbF9vYmplY3RfcCAoYWJmZCwgbnNjbnMsIGludGVybmFsX2YsIGludGVybmFsX2EpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbnNjbnM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqaW50ZXJuYWxfYTsKLXsKLSAgZmxhZ3dvcmQgb2ZsYWdzID0gYWJmZC0+ZmxhZ3M7Ci0gIGJmZF92bWEgb3N0YXJ0ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgUFRSIHRkYXRhOwotICBzaXplX3QgcmVhZHNpemU7CQkvKiBsZW5ndGggb2YgZmlsZV9pbmZvICovCi0gIHVuc2lnbmVkIGludCBzY25oc3o7Ci0gIGNoYXIgKmV4dGVybmFsX3NlY3Rpb25zOwotCi0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1JFTEZMRykpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0VYRUMpKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgaWYgKCEoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfTE5OTykpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTzsKLSAgaWYgKCEoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfTFNZTVMpKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MT0NBTFM7Ci0KLSAgLyogRklYTUU6IEhvdyBjYW4gd2Ugc2V0IERfUEFHRUQgY29ycmVjdGx5PyAgKi8KLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9FWEVDKSAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQ7Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBpbnRlcm5hbF9mLT5mX25zeW1zOwotICBpZiAoaW50ZXJuYWxfZi0+Zl9uc3ltcykKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICBpZiAoaW50ZXJuYWxfYSAhPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgTlVMTCkKLSAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gaW50ZXJuYWxfYS0+ZW50cnk7Ci0gIGVsc2UKLSAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gMDsKLQotICAvKiBTZXQgdXAgdGhlIHRkYXRhIGFyZWEuICBFQ09GRiB1c2VzIGl0cyBvd24gcm91dGluZSwgYW5kIG92ZXJyaWRlcwotICAgICBhYmZkLT5mbGFncy4gICovCi0gIHRkYXRhID0gYmZkX2NvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgKFBUUikgaW50ZXJuYWxfZiwgKFBUUikgaW50ZXJuYWxfYSk7Ci0gIGlmICh0ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIHNjbmhzeiA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0gIHJlYWRzaXplID0gbnNjbnMgKiBzY25oc3o7Ci0gIGV4dGVybmFsX3NlY3Rpb25zID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCByZWFkc2l6ZSk7Ci0gIGlmICghZXh0ZXJuYWxfc2VjdGlvbnMpCi0gICAgZ290byBmYWlsOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgZXh0ZXJuYWxfc2VjdGlvbnMsIDEsIHJlYWRzaXplLCBhYmZkKSAhPSByZWFkc2l6ZSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgLyogTm93IGNvcHkgZGF0YSBhcyByZXF1aXJlZDsgY29uc3RydWN0IGFsbCBhc2VjdGlvbnMgZXRjICovCi0gIGlmIChuc2NucyAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5zY25zOyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciB0bXA7Ci0JICBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwKLQkJCQkgICAoUFRSKSAoZXh0ZXJuYWxfc2VjdGlvbnMgKyBpICogc2NuaHN6KSwKLQkJCQkgICAoUFRSKSAmIHRtcCk7Ci0JICBpZiAoISBtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgKGFiZmQsICZ0bXAsIGkgKyAxKSkKLQkgICAgZ290byBmYWlsOwotCX0KLSAgICB9Ci0KLSAgLyogIG1ha2VfYWJzX3NlY3Rpb24gKGFiZmQpOyAqLwotCi0gIGlmIChiZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIChQVFIpIGludGVybmFsX2YpID09IGZhbHNlKQotICAgIGdvdG8gZmFpbDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotIGZhaWw6Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCB0ZGF0YSk7Ci0gIGFiZmQtPmZsYWdzID0gb2ZsYWdzOwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gb3N0YXJ0OwotICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLX0KLQotLyogVHVybiBhIENPRkYgZmlsZSBpbnRvIGEgQkZELCBidXQgZmFpbCB3aXRoIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQgaWYgaXQgaXMKLSAgIG5vdCBhIENPRkYgZmlsZS4gIFRoaXMgaXMgYWxzbyB1c2VkIGJ5IEVDT0ZGLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1jb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBmaWxoc3o7Ci0gIHVuc2lnbmVkIGludCBhb3V0c3o7Ci0gIGludCBuc2NuczsKLSAgUFRSIGZpbGVoZHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyIGludGVybmFsX2Y7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGludGVybmFsX2E7Ci0KLSAgLyogZmlndXJlIG91dCBob3cgbXVjaCB0byByZWFkICovCi0gIGZpbGhzeiA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0gIGFvdXRzeiA9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0KLSAgZmlsZWhkciA9IGJmZF9hbGxvYyAoYWJmZCwgZmlsaHN6KTsKLSAgaWYgKGZpbGVoZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGJmZF9yZWFkIChmaWxlaGRyLCAxLCBmaWxoc3osIGFiZmQpICE9IGZpbGhzeikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbiAoYWJmZCwgZmlsZWhkciwgJmludGVybmFsX2YpOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgZmlsZWhkcik7Ci0KLSAgaWYgKGJmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgJmludGVybmFsX2YpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBuc2NucyA9IGludGVybmFsX2YuZl9uc2NuczsKLQotICBpZiAoaW50ZXJuYWxfZi5mX29wdGhkcikKLSAgICB7Ci0gICAgICBQVFIgb3B0aGRyOwotCi0gICAgICBvcHRoZHIgPSBiZmRfYWxsb2MgKGFiZmQsIGFvdXRzeik7Ci0gICAgICBpZiAob3B0aGRyID09IE5VTEwpCi0JcmV0dXJuIDA7OwotICAgICAgaWYgKGJmZF9yZWFkIChvcHRoZHIsIDEsIGludGVybmFsX2YuZl9vcHRoZHIsIGFiZmQpCi0JICAhPSBpbnRlcm5hbF9mLmZfb3B0aGRyKQotCXsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgb3B0aGRyLCAoUFRSKSAmaW50ZXJuYWxfYSk7Ci0gICAgfQotCi0gIHJldHVybiBjb2ZmX3JlYWxfb2JqZWN0X3AgKGFiZmQsIG5zY25zLCAmaW50ZXJuYWxfZiwKLQkJCSAgICAgKGludGVybmFsX2YuZl9vcHRoZHIgIT0gMAotCQkJICAgICAgPyAmaW50ZXJuYWxfYQotCQkJICAgICAgOiAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgTlVMTCkpOwotfQotCi0vKiBHZXQgdGhlIEJGRCBzZWN0aW9uIGZyb20gYSBDT0ZGIHN5bWJvbCBzZWN0aW9uIG51bWJlci4gICovCi0KLWFzZWN0aW9uICoKLWNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGluZGV4OwotewotICBzdHJ1Y3Qgc2VjICphbnN3ZXIgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoaW5kZXggPT0gTl9BQlMpCi0gICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIGlmIChpbmRleCA9PSBOX1VOREVGKQotICAgIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICBpZiAoaW5kZXggPT0gTl9ERUJVRykKLSAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICB3aGlsZSAoYW5zd2VyKQotICAgIHsKLSAgICAgIGlmIChhbnN3ZXItPnRhcmdldF9pbmRleCA9PSBpbmRleCkKLQlyZXR1cm4gYW5zd2VyOwotICAgICAgYW5zd2VyID0gYW5zd2VyLT5uZXh0OwotICAgIH0KLQotICAvKiBXZSBzaG91bGQgbm90IHJlYWNoIHRoaXMgcG9pbnQsIGJ1dCB0aGUgU0NPIDMuMnY0IC9saWIvbGliY19zLmEKLSAgICAgaGFzIGEgYmFkIHN5bWJvbCB0YWJsZSBpbiBiaWdsaXRwb3cuby4gICovCi0gIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotfQotCi0vKiBHZXQgdGhlIHVwcGVyIGJvdW5kIG9mIGEgQ09GRiBzeW1ib2wgdGFibGUuICAqLwotCi1sb25nCi1jb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlICopKTsKLX0KLQotCi0vKiBDYW5vbmljYWxpemUgYSBDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0KLWxvbmcKLWNvZmZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBjb2ZmX3N5bWJvbF90eXBlICpzeW1iYXNlOwotICBjb2ZmX3N5bWJvbF90eXBlICoqbG9jYXRpb24gPSAoY29mZl9zeW1ib2xfdHlwZSAqKikgYWxvY2F0aW9uOwotCi0gIGlmICghYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3ltYmFzZSA9IG9ial9zeW1ib2xzIChhYmZkKTsKLSAgY291bnRlciA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICB3aGlsZSAoY291bnRlci0tID4gMCkKLSAgICAqbG9jYXRpb24rKyA9IHN5bWJhc2UrKzsKLQotICAqbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3ltYm9sLiAgVGhlIGNhbGxlciBtdXN0IHBhc3MgaW4gYSBidWZmZXIgb2Ygc2l6ZQotICAgPj0gU1lNTk1MRU4gKyAxLiAgKi8KLQotY29uc3QgY2hhciAqCi1fYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsIHN5bSwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgY2hhciAqYnVmOwotewotICAvKiBGSVhNRTogSXQncyBub3QgY2xlYXIgdGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGlmIHNpemVvZgotICAgICAoX25femVyb2VzKSAhPSA0LiAgKi8KLSAgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgIT0gMAotICAgICAgfHwgc3ltLT5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIG1lbWNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSAgICAgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmdzOwotCi0gICAgICBCRkRfQVNTRVJUIChzeW0tPl9uLl9uX24uX25fb2Zmc2V0ID49IFNUUklOR19TSVpFX1NJWkUpOwotICAgICAgc3RyaW5ncyA9IG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpOwotICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQl7Ci0JICBzdHJpbmdzID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKTsKLQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHJldHVybiBzdHJpbmdzICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLSAgICB9Ci19Ci0KLS8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIHJlbG9jcy4gIFRoaXMgcmV0dXJucyBhIGJ1ZmZlciBob2xkaW5nIHRoZQotICAgcmVsb2NzIGZvciBzZWN0aW9uIFNFQyBpbiBmaWxlIEFCRkQuICBJZiBDQUNIRSBpcyB0cnVlIGFuZAotICAgSU5URVJOQUxfUkVMT0NTIGlzIE5VTEwsIHRoZSByZWxvY3MgcmVhZCBpbiB3aWxsIGJlIHNhdmVkIGluIGNhc2UKLSAgIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYWdhaW4uICBJZiBFWFRFUk5BTF9SRUxPQ1MgaXMgbm90IE5VTEwsIGl0Ci0gICBpcyBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgdW5zd2FwcGVkIHJlbG9jcy4gIElmCi0gICBJTlRFUk5BTF9SRUxPQ1MgaXMgbm90IE5VTEwsIGl0IGlzIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkCi0gICB0aGUgc3dhcHBlZCByZWxvY3MuICBJZiBSRVFVSVJFX0lOVEVSTkFMIGlzIHRydWUsIHRoZW4gdGhlIHJldHVybgotICAgdmFsdWUgbXVzdCBiZSBJTlRFUk5BTF9SRUxPQ1MuICBUaGUgZnVuY3Rpb24gcmV0dXJucyBOVUxMIG9uIGVycm9yLiAgKi8KLQotc3RydWN0IGludGVybmFsX3JlbG9jICoKLV9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgc2VjLCBjYWNoZSwgZXh0ZXJuYWxfcmVsb2NzLAotCQkJCXJlcXVpcmVfaW50ZXJuYWwsIGludGVybmFsX3JlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBib29sZWFuIGNhY2hlOwotICAgICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzOwotICAgICBib29sZWFuIHJlcXVpcmVfaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotewotICBiZmRfc2l6ZV90eXBlIHJlbHN6OwotICBiZmRfYnl0ZSAqZnJlZV9leHRlcm5hbCA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZnJlZV9pbnRlcm5hbCA9IE5VTEw7Ci0gIGJmZF9ieXRlICplcmVsOwotICBiZmRfYnl0ZSAqZXJlbF9lbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTAotICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHJlcXVpcmVfaW50ZXJuYWwpCi0JcmV0dXJuIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7Ci0gICAgICBtZW1jcHkgKGludGVybmFsX3JlbG9jcywgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcywKLQkgICAgICBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLSAgICAgIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgfQotCi0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotCi0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlX2V4dGVybmFsID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQgKiByZWxzeik7Ci0gICAgICBpZiAoZnJlZV9leHRlcm5hbCA9PSBOVUxMICYmIHNlYy0+cmVsb2NfY291bnQgPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gZnJlZV9leHRlcm5hbDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIHJlbHN6LCBzZWMtPnJlbG9jX2NvdW50LCBhYmZkKQotCSAgIT0gcmVsc3ogKiBzZWMtPnJlbG9jX2NvdW50KSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZV9pbnRlcm5hbCA9ICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50Ci0JCQkJICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLSAgICAgIGlmIChmcmVlX2ludGVybmFsID09IE5VTEwgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBmcmVlX2ludGVybmFsOwotICAgIH0KLQotICAvKiBTd2FwIGluIHRoZSByZWxvY3MuICAqLwotICBlcmVsID0gZXh0ZXJuYWxfcmVsb2NzOwotICBlcmVsX2VuZCA9IGVyZWwgKyByZWxzeiAqIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIGZvciAoOyBlcmVsIDwgZXJlbF9lbmQ7IGVyZWwgKz0gcmVsc3osIGlyZWwrKykKLSAgICBiZmRfY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoUFRSKSBlcmVsLCAoUFRSKSBpcmVsKTsKLQotICBpZiAoZnJlZV9leHRlcm5hbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfZXh0ZXJuYWwpOwotICAgICAgZnJlZV9leHRlcm5hbCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChjYWNoZSAmJiBmcmVlX2ludGVybmFsICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JewotCSAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gTlVMTDsKLQl9Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gZnJlZV9pbnRlcm5hbDsKLSAgICB9Ci0KLSAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfZXh0ZXJuYWwgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dGVybmFsKTsKLSAgaWYgKGZyZWVfaW50ZXJuYWwgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2ludGVybmFsKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCBsaW5lbm9fY291bnQgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMgb2YgYSBDT0ZGIGZpbGUuICAqLwotCi1pbnQKLWNvZmZfY291bnRfbGluZW51bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGxpbWl0ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgdG90YWwgPSAwOwotICBhc3ltYm9sICoqcDsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGxpbWl0ID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBtYXkgYmUgZnJvbSB0aGUgYmFja2VuZCBsaW5rZXIsIGluIHdoaWNoIGNhc2UgdGhlCi0gICAgICAgICBsaW5lbm9fY291bnQgaW4gdGhlIHNlY3Rpb25zIGlzIGNvcnJlY3QuICAqLwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JdG90YWwgKz0gcy0+bGluZW5vX2NvdW50OwotICAgICAgcmV0dXJuIHRvdGFsOwotICAgIH0KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICBCRkRfQVNTRVJUIChzLT5saW5lbm9fY291bnQgPT0gMCk7Ci0KLSAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqcV9tYXliZSA9ICpwOwotCi0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAocV9tYXliZSkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSAqcSA9IGNvZmZzeW1ib2wgKHFfbWF5YmUpOwotCi0JICAvKiBUaGUgQUlYIDQuMSBjb21waWxlciBjYW4gc29tZXRpbWVzIGdlbmVyYXRlIGxpbmUgbnVtYmVycwotICAgICAgICAgICAgIGF0dGFjaGVkIHRvIGRlYnVnZ2luZyBzeW1ib2xzLiAgV2UgdHJ5IHRvIHNpbXBseSBpZ25vcmUKLSAgICAgICAgICAgICB0aG9zZSBoZXJlLiAgKi8KLQkgIGlmIChxLT5saW5lbm8gIT0gTlVMTAotCSAgICAgICYmIHEtPnN5bWJvbC5zZWN0aW9uLT5vd25lciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGxpbmUgbnVtYmVycy4gIEluY3JlbWVudCB0aGUgb3duaW5nCi0JICAgICAgICAgc2VjdGlvbidzIGxpbmVudW1iZXIgY291bnQuICAqLwotCSAgICAgIGFsZW50ICpsID0gcS0+bGluZW5vOwotCi0JICAgICAgKytxLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudDsKLQkgICAgICArK3RvdGFsOwotCSAgICAgICsrbDsKLQkgICAgICB3aGlsZSAobC0+bGluZV9udW1iZXIgIT0gMCkKLQkJewotCQkgICsrdG90YWw7Ci0JCSAgKytxLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudDsKLQkJICArK2w7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRvdGFsOwotfQotCi0vKiBUYWtlcyBhIGJmZCBhbmQgYSBzeW1ib2wsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb2ZmIHNwZWNpZmljCi0gICBhcmVhIG9mIHRoZSBzeW1ib2wgaWYgdGhlcmUgaXMgb25lLiAgKi8KLQotLypBUkdTVVNFRCovCi1jb2ZmX3N5bWJvbF90eXBlICoKLWNvZmZfc3ltYm9sX2Zyb20gKGlnbm9yZV9hYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltYm9sKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQotICBpZiAoYmZkX2FzeW1ib2xfYmZkIChzeW1ib2wpLT50ZGF0YS5jb2ZmX29ial9kYXRhID09IChjb2ZmX2RhdGFfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCi0gIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2w7Ci19Ci0KLXN0YXRpYyB2b2lkCi1maXh1cF9zeW1ib2xfdmFsdWUgKGFiZmQsIGNvZmZfc3ltYm9sX3B0ciwgc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltZW50OwotewotCi0gIC8qIE5vcm1hbGl6ZSB0aGUgc3ltYm9sIGZsYWdzICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIGEgY29tbW9uIHN5bWJvbCBpcyB1bmRlZmluZWQgd2l0aCBhIHZhbHVlICovCi0gICAgICBzeW1lbnQtPm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgc3ltZW50LT5uX3ZhbHVlID0gY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWU7Ci0gICAgfQotICBlbHNlIGlmICgoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwCi0JICAgJiYgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLmZsYWdzICYgQlNGX0RFQlVHR0lOR19SRUxPQykgPT0gMCkKLSAgICB7Ci0gICAgICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikpCi0gICAgewotICAgICAgc3ltZW50LT5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IDA7Ci0gICAgfQotICAvKiBGSVhNRTogRG8gd2UgbmVlZCB0byBoYW5kbGUgdGhlIGFic29sdXRlIHNlY3Rpb24gaGVyZT8gICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikKLQl7Ci0JICBzeW1lbnQtPm5fc2NudW0gPQotCSAgICBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCi0JICBzeW1lbnQtPm5fdmFsdWUgPSAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWUKLQkJCSAgICAgKyBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIGlmICghIG9ial9wZSAoYWJmZCkpCi0JICAgIHN5bWVudC0+bl92YWx1ZSArPQotCSAgICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKDApOwotCSAgLyogVGhpcyBjYW4gaGFwcGVuLCBidXQgSSBkb24ndCBrbm93IHdoeSB5ZXQgKHN0ZXZlQGN5Z251cy5jb20pICovCi0JICBzeW1lbnQtPm5fc2NudW0gPSBOX0FCUzsKLQkgIHN5bWVudC0+bl92YWx1ZSA9IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB3b3JrIG91dCB3aGF0Ci0gICB0aGVpciBpbmRleGVzIGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aWxsIGJlIHdoZW4gb3V0cHV0LgotCi0gICBDb2ZmIHJlcXVpcmVzIHRoYXQgZWFjaCBDX0ZJTEUgc3ltYm9sIHBvaW50cyB0byB0aGUgbmV4dCBvbmUgaW4gdGhlCi0gICBjaGFpbiwgYW5kIHRoYXQgdGhlIGxhc3Qgb25lIHBvaW50cyB0byB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiBXZQotICAgZG8gdGhhdCBoZXJlIHRvby4gICovCi0KLWJvb2xlYW4KLWNvZmZfcmVudW1iZXJfc3ltYm9scyAoYmZkX3B0ciwgZmlyc3RfdW5kZWYpCi0gICAgIGJmZCAqYmZkX3B0cjsKLSAgICAgaW50ICpmaXJzdF91bmRlZjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGJmZF9wdHIpOwotICBhc3ltYm9sICoqc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgbmF0aXZlX2luZGV4ID0gMDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqbGFzdF9maWxlID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikgTlVMTDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmRleDsKLQotICAvKiBDT0ZGIGRlbWFuZHMgdGhhdCB1bmRlZmluZWQgc3ltYm9scyBjb21lIGFmdGVyIGFsbCBvdGhlciBzeW1ib2xzLgotICAgICBTaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGltcG9zZSB0aGlzIGV4dHJhIGtub3dsZWRnZSBvbiBhbGwgb3VyCi0gICAgIGNsaWVudCBwcm9ncmFtcywgZGVhbCB3aXRoIHRoYXQgaGVyZS4gIFNvcnQgdGhlIHN5bWJvbCB0YWJsZTsKLSAgICAganVzdCBtb3ZlIHRoZSB1bmRlZmluZWQgc3ltYm9scyB0byB0aGUgZW5kLCBsZWF2aW5nIHRoZSByZXN0Ci0gICAgIGFsb25lLiAgVGhlIE8nUmVpbGx5IGJvb2sgc2F5cyB0aGF0IGRlZmluZWQgZ2xvYmFsIHN5bWJvbHMgY29tZQotICAgICBhdCB0aGUgZW5kIGJlZm9yZSB0aGUgdW5kZWZpbmVkIHN5bWJvbHMsIHNvIHdlIGRvIHRoYXQgaGVyZSBhcwotICAgICB3ZWxsLiAgKi8KLSAgLyogQEAgRG8gd2UgaGF2ZSBzb21lIGNvbmRpdGlvbiB3ZSBjb3VsZCB0ZXN0IGZvciwgc28gd2UgZG9uJ3QgYWx3YXlzCi0gICAgIGhhdmUgdG8gZG8gdGhpcz8gIEkgZG9uJ3QgdGhpbmsgcmVsb2NhdGFiaWxpdHkgaXMgcXVpdGUgcmlnaHQsIGJ1dAotICAgICBJJ20gbm90IGNlcnRhaW4uICBbcmFlYnVybjoxOTkyMDUwOC4xNzExRVNUXSAgKi8KLSAgewotICAgIGFzeW1ib2wgKipuZXdzeW1zOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGJmZF9wdHIsCi0JCQkJICAgICAgc2l6ZW9mIChhc3ltYm9sICopICogKHN5bWJvbF9jb3VudCArIDEpKTsKLSAgICBpZiAoIW5ld3N5bXMpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgYmZkX3B0ci0+b3V0c3ltYm9scyA9IG5ld3N5bXM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKQotICAgICAgaWYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMAotCSAgfHwgKCFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgICYmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwCi0JCSAgfHwgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkJICAgICAgPT0gMCkpKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9sX2NvdW50OyBpKyspCi0gICAgICBpZiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSA9PSAwCi0JICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKLQkgICYmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgIHx8ICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwCi0JCSAgJiYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkJICAgICAgIT0gMCkpKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0KLSAgICAqZmlyc3RfdW5kZWYgPSBuZXdzeW1zIC0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xfY291bnQ7IGkrKykKLSAgICAgIGlmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpID09IDAKLQkgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pKQotCSpuZXdzeW1zKysgPSBzeW1ib2xfcHRyX3B0cltpXTsKLSAgICAqbmV3c3ltcyA9IChhc3ltYm9sICopIE5VTEw7Ci0gICAgc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB9Ci0KLSAgZm9yIChzeW1ib2xfaW5kZXggPSAwOyBzeW1ib2xfaW5kZXggPCBzeW1ib2xfY291bnQ7IHN5bWJvbF9pbmRleCsrKQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0ciA9IGNvZmZfc3ltYm9sX2Zyb20gKGJmZF9wdHIsIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0pOwotICAgICAgc3ltYm9sX3B0cl9wdHJbc3ltYm9sX2luZGV4XS0+dWRhdGEuaSA9IHN5bWJvbF9pbmRleDsgCi0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyICYmIGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlKQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnMgPSBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZTsKLQkgIGludCBpOwotCi0JICBpZiAocy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgaWYgKGxhc3RfZmlsZSAhPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKSBOVUxMKQotCQlsYXN0X2ZpbGUtPm5fdmFsdWUgPSBuYXRpdmVfaW5kZXg7Ci0JICAgICAgbGFzdF9maWxlID0gJihzLT51LnN5bWVudCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCi0JICAgICAgLyogTW9kaWZ5IHRoZSBzeW1ib2wgdmFsdWVzIGFjY29yZGluZyB0byB0aGVpciBzZWN0aW9uIGFuZAotCSAgICAgICAgIHR5cGUgKi8KLQotCSAgICAgIGZpeHVwX3N5bWJvbF92YWx1ZSAoYmZkX3B0ciwgY29mZl9zeW1ib2xfcHRyLCAmKHMtPnUuc3ltZW50KSk7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBzLT51LnN5bWVudC5uX251bWF1eCArIDE7IGkrKykKLQkgICAgc1tpXS5vZmZzZXQgPSBuYXRpdmVfaW5kZXgrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmF0aXZlX2luZGV4Kys7Ci0JfQotICAgIH0KLSAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYmZkX3B0cikgPSBuYXRpdmVfaW5kZXg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJ1biB0aG9yb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFnYWluLCBhbmQgZml4IGl0IHNvIHRoYXQgYWxsCi0gICBwb2ludGVycyB0byBlbnRyaWVzIGFyZSBjaGFuZ2VkIHRvIHRoZSBlbnRyaWVzJyBpbmRleCBpbiB0aGUgb3V0cHV0Ci0gICBzeW1ib2wgdGFibGUuICAqLwotCi12b2lkCi1jb2ZmX21hbmdsZV9zeW1ib2xzIChiZmRfcHRyKQotICAgICBiZmQgKmJmZF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChiZmRfcHRyKTsKLSAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfcHRyID0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmRleDsKLQotICBmb3IgKHN5bWJvbF9pbmRleCA9IDA7IHN5bWJvbF9pbmRleCA8IHN5bWJvbF9jb3VudDsgc3ltYm9sX2luZGV4KyspCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyID0KLSAgICAgIGNvZmZfc3ltYm9sX2Zyb20gKGJmZF9wdHIsIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0pOwotCi0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyICYmIGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlKQotCXsKLQkgIGludCBpOwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlOwotCi0JICBpZiAocy0+Zml4X3ZhbHVlKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCB1c2UgYSB1bmlvbiBoZXJlLiAgKi8KLQkgICAgICBzLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKChjb21iaW5lZF9lbnRyeV90eXBlICopIHMtPnUuc3ltZW50Lm5fdmFsdWUpLT5vZmZzZXQ7Ci0JICAgICAgcy0+Zml4X3ZhbHVlID0gMDsKLQkgICAgfQotCSAgaWYgKHMtPmZpeF9saW5lKQotCSAgICB7Ci0JICAgICAgLyogVGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcwotICAgICAgICAgICAgICAgICBmb3IgdGhlIHN5bWJvbCdzIHNlY3Rpb24uICBPbiBvdXRwdXQsIHRoZSBzeW1ib2wncwotICAgICAgICAgICAgICAgICBzZWN0aW9uIHNob3VsZCBiZSBOX0RFQlVHLiAgKi8KLQkgICAgICBzLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJICsgcy0+dS5zeW1lbnQubl92YWx1ZSAqIGJmZF9jb2ZmX2xpbmVzeiAoYmZkX3B0cikpOwotCSAgICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24gPQotCQljb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGJmZF9wdHIsIE5fREVCVUcpOwotCSAgICAgIEJGRF9BU1NFUlQgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLmZsYWdzICYgQlNGX0RFQlVHR0lORyk7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBzLT51LnN5bWVudC5uX251bWF1eDsgaSsrKQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYSA9IHMgKyBpICsgMTsKLQkgICAgICBpZiAoYS0+Zml4X3RhZykKLQkJewotCQkgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LmwgPQotCQkgICAgYS0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF90YWcgPSAwOwotCQl9Ci0JICAgICAgaWYgKGEtPmZpeF9lbmQpCi0JCXsKLQkJICBhLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLQkJICAgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAtPm9mZnNldDsKLQkJICBhLT5maXhfZW5kID0gMDsKLQkJfQotCSAgICAgIGlmIChhLT5maXhfc2NubGVuKQotCQl7Ci0JCSAgYS0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sID0KLQkJICAgIGEtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF9zY25sZW4gPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY29mZl9maXhfc3ltYm9sX25hbWUgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCBzdHJpbmdfc2l6ZV9wLAotCQkgICAgICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhlbnQ7Ci0gIGNoYXIgKm5hbWUgPSAoY2hhciAqKSAoc3ltYm9sLT5uYW1lKTsKLQotICBpZiAobmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIGNvZmYgc3ltYm9scyBhbHdheXMgaGF2ZSBuYW1lcywgc28gd2UnbGwgbWFrZSBvbmUgdXAgKi8KLSAgICAgIHN5bWJvbC0+bmFtZSA9ICJzdHJhbmdlIjsKLSAgICAgIG5hbWUgPSAoY2hhciAqKSBzeW1ib2wtPm5hbWU7Ci0gICAgfQotICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFCi0gICAgICAmJiBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgZmlsbm1sZW47Ci0KLSAgICAgIHN0cm5jcHkgKG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbmFtZSwgIi5maWxlIiwgU1lNTk1MRU4pOwotICAgICAgYXV4ZW50ID0gJihuYXRpdmUgKyAxKS0+dS5hdXhlbnQ7Ci0KLSAgICAgIGZpbG5tbGVuID0gYmZkX2NvZmZfZmlsbm1sZW4gKGFiZmQpOwotCi0gICAgICBpZiAoYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMgKGFiZmQpKQotCXsKLQkgIGlmIChuYW1lX2xlbmd0aCA8PSBmaWxubWxlbikKLQkgICAgewotCSAgICAgIHN0cm5jcHkgKGF1eGVudC0+eF9maWxlLnhfZm5hbWUsIG5hbWUsIGZpbG5tbGVuKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXV4ZW50LT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gKnN0cmluZ19zaXplX3AgKyBTVFJJTkdfU0laRV9TSVpFOwotCSAgICAgIGF1eGVudC0+eF9maWxlLnhfbi54X3plcm9lcyA9IDA7Ci0JICAgICAgKnN0cmluZ19zaXplX3AgKz0gbmFtZV9sZW5ndGggKyAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cm5jcHkgKGF1eGVudC0+eF9maWxlLnhfZm5hbWUsIG5hbWUsIGZpbG5tbGVuKTsKLQkgIGlmIChuYW1lX2xlbmd0aCA+IGZpbG5tbGVuKQotCSAgICBuYW1lW2ZpbG5tbGVuXSA9ICdcMCc7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChuYW1lX2xlbmd0aCA8PSBTWU1OTUxFTikKLQl7Ci0JICAvKiBUaGlzIG5hbWUgd2lsbCBmaXQgaW50byB0aGUgc3ltYm9sIG5lYXRseSAqLwotCSAgc3RybmNweSAobmF0aXZlLT51LnN5bWVudC5fbi5fbl9uYW1lLCBzeW1ib2wtPm5hbWUsIFNZTU5NTEVOKTsKLQl9Ci0gICAgICBlbHNlIGlmICghYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwgJm5hdGl2ZS0+dS5zeW1lbnQpKQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAoKnN0cmluZ19zaXplX3AKLQkJCQkJCSsgU1RSSU5HX1NJWkVfU0laRSk7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICpzdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBmaWxlcG9zOwotCSAgYmZkX2J5dGUgYnVmWzJdOwotCi0JICAvKiBUaGlzIG5hbWUgc2hvdWxkIGJlIHdyaXR0ZW4gaW50byB0aGUgLmRlYnVnIHNlY3Rpb24uICBGb3IKLQkgICAgIHNvbWUgcmVhc29uIGVhY2ggbmFtZSBpcyBwcmVjZWRlZCBieSBhIHR3byBieXRlIGxlbmd0aAotCSAgICAgYW5kIGFsc28gZm9sbG93ZWQgYnkgYSBudWxsIGJ5dGUuICBGSVhNRTogV2UgYXNzdW1lIHRoYXQKLQkgICAgIHRoZSAuZGVidWcgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGFuZCB0aGF0IGl0Ci0JICAgICBpcyBsYXJnZSBlbm91Z2guICAqLwotCSAgaWYgKCpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wID09IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0JICBmaWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgbmFtZV9sZW5ndGggKyAxLCBidWYpOwotCSAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJCSAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCQkJIChQVFIpIGJ1ZiwKLQkJCQkJIChmaWxlX3B0cikgKmRlYnVnX3N0cmluZ19zaXplX3AsCi0JCQkJCSAoYmZkX3NpemVfdHlwZSkgMikKLQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJCQkgICAgKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JCQkJCSAgICAoUFRSKSBzeW1ib2wtPm5hbWUsCi0JCQkJCSAgICAoKGZpbGVfcHRyKSAqZGVidWdfc3RyaW5nX3NpemVfcAotCQkJCQkgICAgICsgMiksCi0JCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgbmFtZV9sZW5ndGggKyAxKSkKLQkgICAgYWJvcnQgKCk7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBhYm9ydCAoKTsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAqZGVidWdfc3RyaW5nX3NpemVfcCArIDI7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICpkZWJ1Z19zdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMzsKLQl9Ci0gICAgfQotfQotCi0vKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHN5bWJvbCBpbmRleCBzbyB0aGF0IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICB0aGUgcmVsb2NzIHdlIGNhbiBnZXQgdGhlIGluZGV4IGZvciBhIHN5bWJvbC4gIFRoaXMgbWV0aG9kIGlzIGEKLSAgIGhhY2suICBGSVhNRS4gICovCi0KLSNkZWZpbmUgc2V0X2luZGV4KHN5bWJvbCwgaWR4KQkoKHN5bWJvbCktPnVkYXRhLmkgPSAoaWR4KSkKLQotLyogV3JpdGUgYSBzeW1ib2wgb3V0IHRvIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfc3ltYm9sIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJICAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLSAgICAgdW5zaWduZWQgaW50ICp3cml0dGVuOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1hdXggPSBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4OwotICBpbnQgdHlwZSA9IG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlOwotICBpbnQgY2xhc3MgPSBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzOwotICBQVFIgYnVmOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLQotICBpZiAobmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0gICAgc3ltYm9sLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lORwotICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fREVCVUc7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9BQlM7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPQotCXN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgY29mZl9maXhfc3ltYm9sX25hbWUgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCBzdHJpbmdfc2l6ZV9wLAotCQkJZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgYnVmID0gYmZkX2FsbG9jIChhYmZkLCBzeW1lc3opOwotICBpZiAoIWJ1ZikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgJm5hdGl2ZS0+dS5zeW1lbnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgc3ltZXN6LCBhYmZkKSAhPSBzeW1lc3opCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgYnVmKTsKLQotICBpZiAobmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBhdXhlc3o7Ci0gICAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgICAgYXV4ZXN6ID0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKTsKLSAgICAgIGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgYXV4ZXN6KTsKLSAgICAgIGlmICghYnVmKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4OyBqKyspCi0JewotCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChhYmZkLAotCQkJCSAmKChuYXRpdmUgKyBqICsgMSktPnUuYXV4ZW50KSwKLQkJCQkgdHlwZSwKLQkJCQkgY2xhc3MsCi0JCQkJIGosCi0JCQkJIG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgsCi0JCQkJIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIGF1eGVzeiwgYWJmZCkgIT0gYXV4ZXN6KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1Zik7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSBpbmRleCBmb3IgdXNlIHdoZW4gd2Ugd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICBzZXRfaW5kZXggKHN5bWJvbCwgKndyaXR0ZW4pOwotCi0gICp3cml0dGVuICs9IG51bWF1eCArIDE7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzeW1ib2wgdG8gYSBDT0ZGIGZpbGUgdGhhdCBkb2VzIG5vdCBjb21lIGZyb20gYSBDT0ZGCi0gICBmaWxlIG9yaWdpbmFsbHkuICBUaGlzIHN5bWJvbCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIGxpbmtlciwKLSAgIG9yIHdlIG1heSBiZSBsaW5raW5nIGEgbm9uIENPRkYgZmlsZSB0byBhIENPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkJIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgKndyaXR0ZW47Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICBjb21iaW5lZF9lbnRyeV90eXBlIGR1bW15OwotCi0gIG5hdGl2ZSA9ICZkdW1teTsKLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSBUX05VTEw7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IDA7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBpc24ndCBtdWNoIHBvaW50IHRvIHdyaXRpbmcgb3V0IGEgZGVidWdnaW5nIHN5bWJvbAotICAgICAgICAgdW5sZXNzIHdlIGFyZSBwcmVwYXJlZCB0byBjb252ZXJ0IGl0IGludG8gQ09GRiBkZWJ1Z2dpbmcKLSAgICAgICAgIGZvcm1hdC4gIFNvLCB3ZSBqdXN0IGlnbm9yZSB0aGVtLiAgV2UgbXVzdCBjbG9iYmVyIHRoZSBzeW1ib2wKLSAgICAgICAgIG5hbWUgdG8ga2VlcCBpdCBmcm9tIGJlaW5nIHB1dCBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgICAgIHN5bWJvbC0+bmFtZSA9ICIiOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0KLQlzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSAoc3ltYm9sLT52YWx1ZQotCQkJCSAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQluYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBDb3B5IHRoZSBhbnkgZmxhZ3MgZnJvbSB0aGUgdGhlIGZpbGUgaGVhZGVyIGludG8gdGhlIHN5bWJvbC4KLSAgICAgICAgIEZJWE1FOiBXaHk/ICAqLwotICAgICAgewotCWNvZmZfc3ltYm9sX3R5cGUgKmMgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCWlmIChjICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwpCi0JICBuYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSBiZmRfYXN5bWJvbF9iZmQgKCZjLT5zeW1ib2wpLT5mbGFnczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSAwOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkKLSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0gICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IG9ial9wZSAoYWJmZCkgPyBDX05UX1dFQUsgOiBDX1dFQUtFWFQ7Ci0gIGVsc2UKLSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19FWFQ7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPSAwOwotCi0gIHJldHVybiBjb2ZmX3dyaXRlX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCQkgICAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCk7Ci19Ci0KLS8qIFdyaXRlIGEgbmF0aXZlIHN5bWJvbCB0byBhIENPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJCSAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb2ZmX3N5bWJvbF90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCAqd3JpdHRlbjsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKLSAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOwotICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmUgPSBzeW1ib2wtPm5hdGl2ZTsKLSAgYWxlbnQgKmxpbmVubyA9IHN5bWJvbC0+bGluZW5vOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBhc3NvY2lhdGVkIGxpbmUgbnVtYmVyLCB3ZSBtdXN0IHN0b3JlIHRoZQotICAgICBzeW1ib2wgaW5kZXggaW4gdGhlIGxpbmUgbnVtYmVyIGZpZWxkLiAgV2UgYWxzbyB0YWcgdGhlIGF1eGVudCB0bwotICAgICBwb2ludCB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIGxpbmVubyB0YWJsZS4gICovCi0gIGlmIChsaW5lbm8gJiYgIXN5bWJvbC0+ZG9uZV9saW5lbm8gJiYgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotICAgICAgbGluZW5vW2NvdW50XS51Lm9mZnNldCA9ICp3cml0dGVuOwotICAgICAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgpCi0JewotCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphID0gJigobmF0aXZlICsgMSktPnUuYXV4ZW50KTsKLQotCSAgYS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0KLQkgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm1vdmluZ19saW5lX2ZpbGVwb3M7Ci0JfQotCi0gICAgICAvKiBDb3VudCBhbmQgcmVsb2NhdGUgYWxsIG90aGVyIGxpbmVudW1iZXJzLiAgKi8KLSAgICAgIGNvdW50Kys7Ci0gICAgICB3aGlsZSAobGluZW5vW2NvdW50XS5saW5lX251bWJlciAhPSAwKQotCXsKLSNpZiAwCi0JICAvKiAxMyBhcHJpbCA5Mi4gc2FjIAotCSAgICAgSSd2ZSBiZWVuIHRvbGQgdGhpcywgYnV0IHN0aWxsIG5lZWQgcHJvb2Y6Ci0JICAgICA+IFRoZSBzZWNvbmQgYnVnIGlzIGFsc28gaW4gYGJmZC9jb2ZmY29kZS5oJy4gIFRoaXMgYnVnCi0JICAgICA+IGNhdXNlcyB0aGUgbGlua2VyIHRvIHNjcmV3IHVwIHRoZSBwYy1yZWxvY2F0aW9ucyBmb3IKLQkgICAgID4gYWxsIHRoZSBsaW5lIG51bWJlcnMgaW4gQ09GRiBjb2RlLiAgVGhpcyBidWcgaXNuJ3Qgb25seQotCSAgICAgPiBzcGVjaWZpYyB0byBBMjlLIGltcGxlbWVudGF0aW9ucywgYnV0IGFmZmVjdHMgYWxsCi0JICAgICA+IHN5c3RlbXMgdXNpbmcgQ09GRiBmb3JtYXQgYmluYXJpZXMuICBOb3RlIHRoYXQgaW4gQ09GRgotCSAgICAgPiBvYmplY3QgZmlsZXMsIHRoZSBsaW5lIG51bWJlciBjb3JlIG9mZnNldHMgb3V0cHV0IGJ5Ci0JICAgICA+IHRoZSBhc3NlbWJsZXIgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiBlYWNoCi0JICAgICA+IHByb2NlZHVyZSwgbm90IHRvIHRoZSBzdGFydCBvZiB0aGUgLnRleHQgc2VjdGlvbi4gIFRoaXMKLQkgICAgID4gcGF0Y2ggcmVsb2NhdGVzIHRoZSBsaW5lIG51bWJlcnMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICA+IGBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUnIGluc3RlYWQgb2YgdGhlIHNlY3Rpb24KLQkgICAgID4gdmlydHVhbCBhZGRyZXNzLgotCSAgICAgPiBtb2R1bGFyIW9sc29uQGNzLmFyaXpvbmEuZWR1IChKb24gT2xzb24pCi0JICAgKi8KLQkgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgKz0gbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwotI2Vsc2UKLQkgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgKz0KLQkgICAgKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICsgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgc3ltYm9sLT5kb25lX2xpbmVubyA9IHRydWU7Ci0KLSAgICAgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5tb3ZpbmdfbGluZV9maWxlcG9zICs9Ci0JY291bnQgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICAgIH0KLQotICByZXR1cm4gY29mZl93cml0ZV9zeW1ib2wgKGFiZmQsICYoc3ltYm9sLT5zeW1ib2wpLCBuYXRpdmUsIHdyaXR0ZW4sCi0JCQkgICAgc3RyaW5nX3NpemVfcCwgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCSAgICBkZWJ1Z19zdHJpbmdfc2l6ZV9wKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBDT0ZGIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1jb2ZmX3dyaXRlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzdHJpbmdfc2l6ZTsKLSAgYXNlY3Rpb24gKmRlYnVnX3N0cmluZ19zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGRlYnVnX3N0cmluZ19zaXplOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGxpbWl0ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCB3cml0dGVuID0gMDsKLSAgYXN5bWJvbCAqKnA7Ci0KLSAgc3RyaW5nX3NpemUgPSAwOwotICBkZWJ1Z19zdHJpbmdfc2VjdGlvbiA9IE5VTEw7Ci0gIGRlYnVnX3N0cmluZ19zaXplID0gMDsKLQotICAvKiBJZiB0aGlzIHRhcmdldCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMsIHRoZXkgbXVzdCBiZSBwdXQgaW50bwotICAgICB0aGUgc3RyaW5nIHRhYmxlLiAgVGhpcyBpcyBzdXBwb3J0ZWQgYnkgUEUuICBUaGlzIGNvZGUgbXVzdAotICAgICBoYW5kbGUgc2VjdGlvbiBuYW1lcyBqdXN0IGFzIHRoZXkgYXJlIGhhbmRsZWQgaW4KLSAgICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuICAqLwotICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgbGVuID0gc3RybGVuIChvLT5uYW1lKTsKLQkgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkgICAgc3RyaW5nX3NpemUgKz0gbGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIFNlZWsgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE91dHB1dCBhbGwgdGhlIHN5bWJvbHMgd2UgaGF2ZSAqLwotCi0gIHdyaXR0ZW4gPSAwOwotICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsgaSA8IGxpbWl0OyBpKyssIHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW1ib2wgPSAqcDsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNfc3ltYm9sID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLQotICAgICAgaWYgKGNfc3ltYm9sID09IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwKLQkgIHx8IGNfc3ltYm9sLT5uYXRpdmUgPT0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgTlVMTCkKLQl7Ci0JICBpZiAoIWNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sIChhYmZkLCBzeW1ib2wsICZ3cml0dGVuLCAmc3RyaW5nX3NpemUsCi0JCQkJCSZkZWJ1Z19zdHJpbmdfc2VjdGlvbiwKLQkJCQkJJmRlYnVnX3N0cmluZ19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIWNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCAoYWJmZCwgY19zeW1ib2wsICZ3cml0dGVuLAotCQkJCQkgJnN0cmluZ19zaXplLCAmZGVidWdfc3RyaW5nX3NlY3Rpb24sCi0JCQkJCSAmZGVidWdfc3RyaW5nX3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSB3cml0dGVuOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgc3RyaW5ncyAqLwotCi0gIGlmIChzdHJpbmdfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplID0gc3RyaW5nX3NpemUgKyBTVFJJTkdfU0laRV9TSVpFOwotICAgICAgYmZkX2J5dGUgYnVmZmVyW1NUUklOR19TSVpFX1NJWkVdOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNpemUsIGJ1ZmZlcik7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKSAhPSBzaXplb2YgKGJ1ZmZlcikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLiAgVGhpcyBjb2RlIG11c3QgaGFuZGxlIHNlY3Rpb24KLQkgbmFtZXMganVzdCBhcyB0aGV5IGFyZSBoYW5kbGVkIGluIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpKQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW47Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKG8tPm5hbWUpOwotCSAgICAgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkJewotCQkgIGlmIChiZmRfd3JpdGUgKG8tPm5hbWUsIDEsIGxlbiArIDEsIGFiZmQpICE9IGxlbiArIDEpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7Ci0JICAgaSA8IGxpbWl0OwotCSAgIGkrKywgcCsrKQotCXsKLQkgIGFzeW1ib2wgKnEgPSAqcDsKLQkgIHNpemVfdCBuYW1lX2xlbmd0aCA9IHN0cmxlbiAocS0+bmFtZSk7Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpjX3N5bWJvbCA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHEpOwotCSAgc2l6ZV90IG1heGxlbjsKLQotCSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSBzeW1ib2wgbmFtZSBzaG91bGQgZ28gaW4gdGhlIHN0cmluZwotCSAgICAgdGFibGUuICBTeW1ib2wgbmFtZXMgdGhhdCBhcmUgc2hvcnQgZW5vdWdoIGFyZSBzdG9yZWQKLQkgICAgIGRpcmVjdGx5IGluIHRoZSBzeW1lbnQgc3RydWN0dXJlLiAgRmlsZSBuYW1lcyBwZXJtaXQgYQotCSAgICAgZGlmZmVyZW50LCBsb25nZXIsIGxlbmd0aCBpbiB0aGUgc3ltZW50IHN0cnVjdHVyZS4gIE9uCi0JICAgICBYQ09GRiwgc29tZSBzeW1ib2wgbmFtZXMgYXJlIHN0b3JlZCBpbiB0aGUgLmRlYnVnIHNlY3Rpb24KLQkgICAgIHJhdGhlciB0aGFuIGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCi0JICBpZiAoY19zeW1ib2wgPT0gTlVMTAotCSAgICAgIHx8IGNfc3ltYm9sLT5uYXRpdmUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgbm90IGEgQ09GRiBzeW1ib2wsIHNvIGl0IGNlcnRhaW5seSBpcyBub3QgYQotCSAgICAgICAgIGZpbGUgbmFtZSwgbm9yIGRvZXMgaXQgZ28gaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgICAgICBtYXhsZW4gPSBTWU1OTUxFTjsKLQkgICAgfQotCSAgZWxzZSBpZiAoYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwKLQkJCQkJICAgICAgJmNfc3ltYm9sLT5uYXRpdmUtPnUuc3ltZW50KSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIG5hbWUgaXMgaW4gdGhlIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uLgotCSAgICAgICAgIERvbid0IHdyaXRlIGl0IGludG8gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICAgICAgbWF4bGVuID0gbmFtZV9sZW5ndGg7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGNfc3ltYm9sLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQotCQkgICAmJiBjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JICAgIG1heGxlbiA9IGJmZF9jb2ZmX2ZpbG5tbGVuIChhYmZkKTsKLQkgIGVsc2UKLQkgICAgbWF4bGVuID0gU1lNTk1MRU47Ci0KLQkgIGlmIChuYW1lX2xlbmd0aCA+IG1heGxlbikKLQkgICAgewotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChxLT5uYW1lKSwgMSwgbmFtZV9sZW5ndGggKyAxLCBhYmZkKQotCQkgICE9IG5hbWVfbGVuZ3RoICsgMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHdvdWxkIG5vcm1hbGx5IG5vdCB3cml0ZSBhbnl0aGluZyBoZXJlLCBidXQgd2UnbGwgd3JpdGUKLSAgICAgICAgIG91dCA0IHNvIHRoYXQgYW55IHN0dXBpZCBjb2ZmIHJlYWRlciB3aGljaCB0cmllcyB0byByZWFkIHRoZQotICAgICAgICAgc3RyaW5nIHRhYmxlIGV2ZW4gd2hlbiB0aGVyZSBpc24ndCBvbmUgd29uJ3QgY3JvYWsuICAqLwotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotICAgICAgYmZkX2J5dGUgYnVmZmVyW1NUUklOR19TSVpFX1NJWkVdOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNpemUsIGJ1ZmZlcik7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkKLQkgICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIC5kZWJ1ZyBzZWN0aW9uIHdhcyBjcmVhdGVkIHRvIGJlIHRoZSBjb3JyZWN0IHNpemUuCi0gICAgIFdlIHNob3VsZCBjcmVhdGUgaXQgb3Vyc2VsdmVzIG9uIHRoZSBmbHksIGJ1dCB3ZSBkb24ndCBiZWNhdXNlCi0gICAgIEJGRCB3b24ndCBsZXQgdXMgd3JpdGUgdG8gYW55IHNlY3Rpb24gdW50aWwgd2Uga25vdyBob3cgbGFyZ2UgYWxsCi0gICAgIHRoZSBzZWN0aW9ucyBhcmUuICBXZSBjb3VsZCBzdGlsbCBkbyBpdCBieSBtYWtpbmcgYW5vdGhlciBwYXNzCi0gICAgIG92ZXIgdGhlIHN5bWJvbHMuICBGSVhNRS4gICovCi0gIEJGRF9BU1NFUlQgKGRlYnVnX3N0cmluZ19zaXplID09IDAKLQkgICAgICB8fCAoZGVidWdfc3RyaW5nX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwKLQkJICAmJiAoQkZEX0FMSUdOIChkZWJ1Z19zdHJpbmdfc2l6ZSwKLQkJCQkgMSA8PCBkZWJ1Z19zdHJpbmdfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKQotCQkgICAgICA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbikpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWNvZmZfd3JpdGVfbGluZW51bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9zaXplX3R5cGUgbGluZXN6OwotICBQVFIgYnVmZjsKLQotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBidWZmID0gYmZkX2FsbG9jIChhYmZkLCBsaW5lc3opOwotICBpZiAoIWJ1ZmYpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKHMtPmxpbmVub19jb3VudCkKLQl7Ci0JICBhc3ltYm9sICoqcSA9IGFiZmQtPm91dHN5bWJvbHM7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHMtPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZpbmQgYWxsIHRoZSBsaW5lbnVtYmVycyBpbiB0aGlzIHNlY3Rpb24gKi8KLQkgIHdoaWxlICgqcSkKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKnAgPSAqcTsKLQkgICAgICBpZiAocC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gcykKLQkJewotCQkgIGFsZW50ICpsID0KLQkJICBCRkRfU0VORCAoYmZkX2FzeW1ib2xfYmZkIChwKSwgX2dldF9saW5lbm8sCi0JCQkgICAgKGJmZF9hc3ltYm9sX2JmZCAocCksIHApKTsKLQkJICBpZiAobCkKLQkJICAgIHsKLQkJICAgICAgLyogRm91bmQgYSBsaW5lbnVtYmVyIGVudHJ5LCBvdXRwdXQgKi8KLQkJICAgICAgc3RydWN0IGludGVybmFsX2xpbmVubyBvdXQ7Ci0JCSAgICAgIG1lbXNldCAoKFBUUikgJiBvdXQsIDAsIHNpemVvZiAob3V0KSk7Ci0JCSAgICAgIG91dC5sX2xubm8gPSAwOwotCQkgICAgICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7Ci0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7Ci0JCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBsKys7Ci0JCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlcikKLQkJCXsKLQkJCSAgb3V0LmxfbG5ubyA9IGwtPmxpbmVfbnVtYmVyOwotCQkJICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7Ci0JCQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgbCsrOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgcSsrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1ZmYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTVVNFRCAqLwotYWxlbnQgKgotY29mZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgcmV0dXJuIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubzsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scywgd2hpY2ggaGFzIGJlZW4KLSAgIGRpc2FibGVkLiAgKi8KLQotYXN5bWJvbCAqCi1jb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIG5hbWUpOwotICBhc3ltYm9sICpzeW07Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmNzeW07Ci0KLSAgc3ltID0gc2VjLT5zeW1ib2w7Ci0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW0pLT5uYXRpdmU7Ci0gIC8qIE1ha2Ugc3VyZSBiYWNrLWVuZCBDT0ZGIHN0dWZmIGlzIHRoZXJlLiAgKi8KLSAgaWYgKGNzeW0gPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZm9vCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSBzeW07Ci0JICAvKiBAQEZJWE1FIFRoaXMgc2hvdWxkbid0IHVzZSBhIGZpeGVkIHNpemUhISAgKi8KLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgZVsxMF07Ci0JfTsKLSAgICAgIHN0cnVjdCBmb28gKmY7Ci0gICAgICBmID0gKHN0cnVjdCBmb28gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCpmKSk7Ci0gICAgICBpZiAoIWYpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgZiwgMCwgc2l6ZW9mICgqZikpOwotICAgICAgY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltKS0+bmF0aXZlID0gY3N5bSA9IGYtPmU7Ci0gICAgfQotICBjc3ltWzBdLnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotICBjc3ltWzBdLnUuc3ltZW50Lm5fbnVtYXV4ID0gMTsKLS8qICBTRl9TRVRfU1RBVElDUyAoc3ltKTsgICAgICAgQEAgPz8/ICovCi0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9zY25sZW4gPSBzZWMtPl9yYXdfc2l6ZTsKLSAgY3N5bVsxXS51LmF1eGVudC54X3Njbi54X25yZWxvYyA9IHNlYy0+cmVsb2NfY291bnQ7Ci0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9ubGlubm8gPSBzZWMtPmxpbmVub19jb3VudDsKLQotICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0gICAgICBzZWMtPm91dHB1dF9vZmZzZXQgPSAwOwotICAgIH0KLQotICByZXR1cm4gc3ltOwotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIG9mZnNldHMgaW50byB0aGUgc3ltYm9sIHRhYmxlIGludG8KLSAgIHBvaW50ZXJzIHRvIHN5bWVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9wb2ludGVyaXplX2F1eCAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eGVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXg7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eGVudDsKLXsKLSAgdW5zaWduZWQgaW50IHR5cGUgPSBzeW1ib2wtPnUuc3ltZW50Lm5fdHlwZTsKLSAgdW5zaWduZWQgaW50IGNsYXNzID0gc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzczsKLQotICBpZiAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykKLSAgICB7Ci0gICAgICBpZiAoKCpjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKQotCSAgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXhlbnQpKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgYm90aGVyIGlmIHRoaXMgaXMgYSBmaWxlIG9yIGEgc2VjdGlvbiAqLwotICBpZiAoY2xhc3MgPT0gQ19TVEFUICYmIHR5cGUgPT0gVF9OVUxMKQotICAgIHJldHVybjsKLSAgaWYgKGNsYXNzID09IENfRklMRSkKLSAgICByZXR1cm47Ci0KLSAgLyogT3RoZXJ3aXNlIHBhdGNoIHVwICovCi0jZGVmaW5lIE5fVE1BU0sgY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0c2hmdAotICBpZiAoKElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpIHx8IGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04pCi0gICAgICAmJiBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPiAwKQotICAgIHsKLSAgICAgIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucCA9Ci0JdGFibGVfYmFzZSArIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLSAgICAgIGF1eGVudC0+Zml4X2VuZCA9IDE7Ci0gICAgfQotICAvKiBBIG5lZ2F0aXZlIHRhZ25keCBpcyBtZWFuaW5nbGVzcywgYnV0IHRoZSBTQ08gMy4ydjQgY2MgY2FuCi0gICAgIGdlbmVyYXRlIG9uZSwgc28gd2UgbXVzdCBiZSBjYXJlZnVsIHRvIGlnbm9yZSBpdC4gICovCi0gIGlmIChhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LmwgPiAwKQotICAgIHsKLSAgICAgIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucCA9Ci0JdGFibGVfYmFzZSArIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubDsKLSAgICAgIGF1eGVudC0+Zml4X3RhZyA9IDE7Ci0gICAgfQotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlICIuZGVidWciIHNlY3Rpb24sIGFuZCByZWFkIGl0LgotICAgV2UgZGlkIG5vdCByZWFkIHRoZSBkZWJ1ZyBzZWN0aW9uIHVudGlsIG5vdywgYmVjYXVzZQotICAgd2UgZGlkbid0IHdhbnQgdG8gZ28gdG8gdGhlIHRyb3VibGUgdW50aWwgc29tZW9uZSBuZWVkZWQgaXQuICovCi0KLXN0YXRpYyBjaGFyICoKLWJ1aWxkX2RlYnVnX3NlY3Rpb24gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqZGVidWdfc2VjdGlvbjsKLSAgbG9uZyBwb3NpdGlvbjsKLQotICBhc2VjdGlvbiAqc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0KLSAgaWYgKCFzZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBkZWJ1Z19zZWN0aW9uID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCkpOwotICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYC5kZWJ1Zycgc2VjdGlvbiBhbmQgcmVhZCBpdC4gCi0gICAgIFNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gZmlyc3Q7IGl0IGlzIG5lZWRlZCBieSBvdXIgY2FsbGVyLgotICAgICBUaGVuIHJlYWQgZGVidWcgc2VjdGlvbiBhbmQgcmVzZXQgdGhlIGZpbGUgcG9pbnRlci4gICovCi0KLSAgcG9zaXRpb24gPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdC0+ZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoZGVidWdfc2VjdGlvbiwKLQkJICAgIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCksIDEsIGFiZmQpCi0JICAhPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpKQotICAgICAgfHwgYmZkX3NlZWsgKGFiZmQsIHBvc2l0aW9uLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGRlYnVnX3NlY3Rpb247Ci19Ci0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIG1hbGxvYydkIGNvcHkgb2YgJ25hbWUnLiAgJ25hbWUnIG1heSBub3QgYmUKLSAgIFwwLXRlcm1pbmF0ZWQsIGJ1dCB3aWxsIG5vdCBleGNlZWQgJ21heGxlbicgY2hhcmFjdGVycy4gIFRoZSBjb3B5ICp3aWxsKgotICAgYmUgXDAtdGVybWluYXRlZC4gICovCi1zdGF0aWMgY2hhciAqCi1jb3B5X25hbWUgKGFiZmQsIG5hbWUsIG1heGxlbikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgbWF4bGVuOwotewotICBpbnQgbGVuOwotICBjaGFyICpuZXduYW1lOwotCi0gIGZvciAobGVuID0gMDsgbGVuIDwgbWF4bGVuOyArK2xlbikKLSAgICB7Ci0gICAgICBpZiAobmFtZVtsZW5dID09ICdcMCcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoKG5ld25hbWUgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpKSA9PSBOVUxMKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIHN0cm5jcHkgKG5ld25hbWUsIG5hbWUsIGxlbik7Ci0gIG5ld25hbWVbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiBuZXduYW1lOwotfQotCi0vKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzaXplX3Qgc2l6ZTsKLSAgUFRSIHN5bXM7Ci0KLSAgaWYgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBzaXplID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotCi0gIHN5bXMgPSAoUFRSKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChzeW1zLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICAgIGlmIChzeW1zICE9IE5VTEwpCi0JZnJlZSAoc3ltcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3RyaW5ncy4gIFRoZSBzdHJpbmdzIGFyZSBub3QgbG9hZGVkIHVudGlsCi0gICB0aGV5IGFyZSBuZWVkZWQuICBUaGlzIGlzIGJlY2F1c2Ugd2UgaGF2ZSBubyBzaW1wbGUgd2F5IG9mCi0gICBkZXRlY3RpbmcgYSBtaXNzaW5nIHN0cmluZyB0YWJsZSBpbiBhbiBhcmNoaXZlLiAgKi8KLQotY29uc3QgY2hhciAqCi1fYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBleHRzdHJzaXplW1NUUklOR19TSVpFX1NJWkVdOwotICBzaXplX3Qgc3Ryc2l6ZTsKLSAgY2hhciAqc3RyaW5nczsKLQotICBpZiAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCk7Ci0KLSAgaWYgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gIGlmIChiZmRfcmVhZCAoZXh0c3Ryc2l6ZSwgc2l6ZW9mIGV4dHN0cnNpemUsIDEsIGFiZmQpICE9IHNpemVvZiBleHRzdHJzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlcmUgaXMgbm8gc3RyaW5nIHRhYmxlLiAgKi8KLSAgICAgIHN0cnNpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIHN0cnNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHRzdHJzaXplKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotICAgIH0KLQotICBpZiAoc3Ryc2l6ZSA8IFNUUklOR19TSVpFX1NJWkUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBiYWQgc3RyaW5nIHRhYmxlIHNpemUgJWx1IiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAodW5zaWduZWQgbG9uZykgc3Ryc2l6ZSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdHJpbmdzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3Ryc2l6ZSk7Ci0gIGlmIChzdHJpbmdzID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9yZWFkIChzdHJpbmdzICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJc3Ryc2l6ZSAtIFNUUklOR19TSVpFX1NJWkUsIDEsIGFiZmQpCi0gICAgICAhPSBzdHJzaXplIC0gU1RSSU5HX1NJWkVfU0laRSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmdzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBvYmpfY29mZl9zdHJpbmdzIChhYmZkKSA9IHN0cmluZ3M7Ci0KLSAgcmV0dXJuIHN0cmluZ3M7Ci19Ci0KLS8qIEZyZWUgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHN0cmluZ3MgcmVhZCBmcm9tIGEgQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgIT0gTlVMTAotICAgICAgJiYgISBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpKQotICAgIHsKLSAgICAgIGZyZWUgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKLSAgICAgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgICB9Ci0gIGlmIChvYmpfY29mZl9zdHJpbmdzIChhYmZkKSAhPSBOVUxMCi0gICAgICAmJiAhIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyAoYWJmZCkpCi0gICAgewotICAgICAgZnJlZSAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkpOwotICAgICAgb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBzeW1ib2wgdGFibGUgaW50byBmcmVzaGx5IGJmZF9hbGxvY2F0ZWQgbWVtb3J5LCBzd2FwIGl0LCBhbmQKLSAgIGtuaXQgdGhlIHN5bWJvbCBuYW1lcyBpbnRvIGEgbm9ybWFsaXplZCBmb3JtLiAgQnkgbm9ybWFsaXplZCBoZXJlIEkKLSAgIG1lYW4gdGhhdCBhbGwgc3ltYm9scyBoYXZlIGFuIG5fb2Zmc2V0IHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBudWxsLQotICAgdGVybWluYXRlZCBzdHJpbmcuICAqLwotCi1jb21iaW5lZF9lbnRyeV90eXBlICoKLWNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsOwotICBjb21iaW5lZF9lbnRyeV90eXBlICppbnRlcm5hbF9wdHI7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbF9wdHI7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsX2VuZDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGNoYXIgKnJhd19zcmM7Ci0gIGNoYXIgKnJhd19lbmQ7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ190YWJsZSA9IE5VTEw7Ci0gIGNoYXIgKmRlYnVnX3NlY3Rpb24gPSBOVUxMOwotICB1bnNpZ25lZCBsb25nIHNpemU7Ci0KLSAgaWYgKG9ial9yYXdfc3ltZW50cyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLQotICBzaXplID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKTsKLSAgaW50ZXJuYWwgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGludGVybmFsID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICBpbnRlcm5hbF9lbmQgPSBpbnRlcm5hbCArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLQotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJhd19zcmMgPSAoY2hhciAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLQotICAvKiBtYXJrIHRoZSBlbmQgb2YgdGhlIHN5bWJvbHMgKi8KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgcmF3X2VuZCA9IChjaGFyICopIHJhd19zcmMgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0KLSAgLyogRklYTUUgU09NRURBWS4gIEEgc3RyaW5nIHRhYmxlIHNpemUgb2YgemVybyBpcyB2ZXJ5IHdlaXJkLCBidXQKLSAgICAgcHJvYmFibHkgcG9zc2libGUuICBJZiBvbmUgc2hvd3MgdXAsIGl0IHdpbGwgcHJvYmFibHkga2lsbCB1cy4gICovCi0KLSAgLyogU3dhcCBhbGwgdGhlIHJhdyBlbnRyaWVzICovCi0gIGZvciAoaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7Ci0gICAgICAgcmF3X3NyYyA8IHJhd19lbmQ7Ci0gICAgICAgcmF3X3NyYyArPSBzeW1lc3osIGludGVybmFsX3B0cisrKQotICAgIHsKLQotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgcmF3X3NyYywKLQkJCSAgICAoUFRSKSAmIGludGVybmFsX3B0ci0+dS5zeW1lbnQpOwotICAgICAgc3ltYm9sX3B0ciA9IGludGVybmFsX3B0cjsKLQotICAgICAgZm9yIChpID0gMDsKLQkgICBpIDwgc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9udW1hdXg7Ci0JICAgaSsrKQotCXsKLQkgIGludGVybmFsX3B0cisrOwotCSAgcmF3X3NyYyArPSBzeW1lc3o7Ci0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgcmF3X3NyYywKLQkJCQlzeW1ib2xfcHRyLT51LnN5bWVudC5uX3R5cGUsCi0JCQkJc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCQkJaSwgc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9udW1hdXgsCi0JCQkJJihpbnRlcm5hbF9wdHItPnUuYXV4ZW50KSk7Ci0JICBjb2ZmX3BvaW50ZXJpemVfYXV4IChhYmZkLCBpbnRlcm5hbCwgc3ltYm9sX3B0ciwgaSwKLQkJCSAgICAgICBpbnRlcm5hbF9wdHIpOwotCX0KLSAgICB9Ci0KLSAgLyogRnJlZSB0aGUgcmF3IHN5bWJvbHMsIGJ1dCBub3QgdGhlIHN0cmluZ3MgKGlmIHdlIGhhdmUgdGhlbSkuICAqLwotICBvYmpfY29mZl9rZWVwX3N0cmluZ3MgKGFiZmQpID0gdHJ1ZTsKLSAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsgaW50ZXJuYWxfcHRyIDwgaW50ZXJuYWxfZW5kOwotICAgICAgIGludGVybmFsX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQotCSAgJiYgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JewotCSAgLyogbWFrZSBhIGZpbGUgc3ltYm9sIHBvaW50IHRvIHRoZSBuYW1lIGluIHRoZSBhdXhlbnQsIHNpbmNlCi0JICAgICB0aGUgdGV4dCAiLmZpbGUiIGlzIHJlZHVuZGFudCAqLwotCSAgaWYgKChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfbi54X3plcm9lcyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogdGhlIGZpbGVuYW1lIGlzIGEgbG9uZyBvbmUsIHBvaW50IGludG8gdGhlIHN0cmluZyB0YWJsZSAqLwotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ190YWJsZSA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JCSAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkoKGxvbmcpCi0JCSAoc3RyaW5nX3RhYmxlCi0JCSAgKyAoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X24ueF9vZmZzZXQpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogT3JkaW5hcnkgc2hvcnQgZmlsZW5hbWUsIHB1dCBpbnRvIG1lbW9yeSBhbnl3YXkuICBUaGUKLSAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFBFIHRvb2xzIHNvbWV0aW1lcyBzdG9yZSBhIGZpbGVuYW1lIGluCi0gICAgICAgICAgICAgICAgIG11bHRpcGxlIEFVWCBlbnRyaWVzLiAgKi8KLQkgICAgICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCA+IDEKLQkJICAmJiBjb2ZmX2RhdGEgKGFiZmQpLT5wZSkKLQkJewotCQkgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkgICAgKChsb25nKQotCQkgICAgIGNvcHlfbmFtZSAoYWJmZCwKLQkJCQkoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X2ZuYW1lLAotCQkJCWludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXggKiBzeW1lc3opKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkgICAgKChsb25nKQotCQkgICAgIGNvcHlfbmFtZSAoYWJmZCwKLQkJCQkoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X2ZuYW1lLAotCQkJCWJmZF9jb2ZmX2ZpbG5tbGVuIChhYmZkKSkpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSAic2hvcnQiIG5hbWUuICBNYWtlIGl0IGxvbmcuICAqLwotCSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IDA7Ci0JICAgICAgY2hhciAqbmV3c3RyaW5nID0gTlVMTDsKLQotCSAgICAgIC8qIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyB3aXRob3V0IHdhbGtpbmcgaW50byBtZW1vcnkKLQkgICAgICAgICB0aGF0IGlzbid0IG91cnMuICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JCXsKLQkJICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lW2ldID09ICdcMCcpCi0JCSAgICB7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQkJLyogaWYgZW5kIG9mIHN0cmluZyAqLwotCQl9CQkvKiBwb3NzaWJsZSBsZW5ndGhzIG9mIHRoaXMgc3RyaW5nLiAqLwotCi0JICAgICAgaWYgKChuZXdzdHJpbmcgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsICsraSkpID09IE5VTEwpCi0JCXJldHVybiAoTlVMTCk7Ci0JICAgICAgbWVtc2V0IChuZXdzdHJpbmcsIDAsIGkpOwotCSAgICAgIHN0cm5jcHkgKG5ld3N0cmluZywgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lLCBpIC0gMSk7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkgbmV3c3RyaW5nOwotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0JICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZyBpbnQpICIiOwotCSAgZWxzZSBpZiAoIWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsICZpbnRlcm5hbF9wdHItPnUuc3ltZW50KSkKLQkgICAgewotCSAgICAgIC8qIExvbmcgbmFtZSBhbHJlYWR5LiAgUG9pbnQgc3ltYm9sIGF0IHRoZSBzdHJpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgIHRhYmxlLiAgKi8KLQkgICAgICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCi0JCXsKLQkJICBzdHJpbmdfdGFibGUgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCQkgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9Ci0JCSgobG9uZyBpbnQpCi0JCSAoc3RyaW5nX3RhYmxlCi0JCSAgKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIExvbmcgbmFtZSBpbiBkZWJ1ZyBzZWN0aW9uLiAgVmVyeSBzaW1pbGFyLiAgKi8KLQkgICAgICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQotCQlkZWJ1Z19zZWN0aW9uID0gYnVpbGRfZGVidWdfc2VjdGlvbiAoYWJmZCk7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkKLQkJKGRlYnVnX3NlY3Rpb24gKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KTsKLQkgICAgfQotCX0KLSAgICAgIGludGVybmFsX3B0ciArPSBpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4OwotICAgIH0KLQotICBvYmpfcmF3X3N5bWVudHMgKGFiZmQpID0gaW50ZXJuYWw7Ci0gIEJGRF9BU1NFUlQgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCSAgICAgID09ICh1bnNpZ25lZCBpbnQpIChpbnRlcm5hbF9wdHIgLSBpbnRlcm5hbCkpOwotCi0gIHJldHVybiAoaW50ZXJuYWwpOwotfQkJCQkvKiBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYigpICovCi0KLWxvbmcKLWNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLWFzeW1ib2wgKgotY29mZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgbWVtc2V0IChuZXcsIDAsIHNpemVvZiAqbmV3KTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IDA7Ci0gIG5ldy0+bmF0aXZlID0gMDsKLSAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLSAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogTWFrZSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotCi1hc3ltYm9sICoKLWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIChhYmZkLCBwdHIsIHN6KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgbG9uZyBzeiBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgLyogQEAgVGhlIDEwIGlzIGEgZ3Vlc3MgYXQgYSBwbGF1c2libGUgbWF4aW11bSBudW1iZXIgb2YgYXV4IGVudHJpZXMKLSAgICAgKGJ1dCBzaG91bGRuJ3QgYmUgYSBjb25zdGFudCkuICAqLwotICBuZXctPm5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSkgKiAxMCk7Ci0gIGlmICghbmV3LT5uYXRpdmUpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIG5ldy0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLSAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLypBUkdTVVNFRCAqLwotdm9pZAotY29mZl9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0gIGlmIChjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgIT0gTlVMTAotICAgICAgJiYgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLT5maXhfdmFsdWUpCi0gICAgewotICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqcHN5bTsKLQotICAgICAgcHN5bSA9ICgoY29tYmluZWRfZW50cnlfdHlwZSAqKQotCSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSk7Ci0gICAgICByZXQtPnZhbHVlID0gKGJmZF92bWEpIChwc3ltIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIENPRkYgc3ltZW50IGZvciBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bWJvbCwgcHN5bWVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnBzeW1lbnQ7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW07Ci0KLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0gIGlmIChjc3ltID09IE5VTEwgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKnBzeW1lbnQgPSBjc3ltLT5uYXRpdmUtPnUuc3ltZW50OwotCi0gIGlmIChjc3ltLT5uYXRpdmUtPmZpeF92YWx1ZSkKLSAgICBwc3ltZW50LT5uX3ZhbHVlID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBzeW1lbnQtPm5fdmFsdWUKLQkJCS0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgLyogRklYTUU6IFdlIHNob3VsZCBoYW5kbGUgZml4X2xpbmUgaGVyZS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgQ09GRiBhdXhlbnQgZm9yIGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltYm9sLCBpbmR4LCBwYXV4ZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgaW50IGluZHg7Ci0gICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bTsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50OwotCi0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCi0gIGlmIChjc3ltID09IE5VTEwKLSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0gICAgICB8fCBpbmR4ID49IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50ID0gY3N5bS0+bmF0aXZlICsgaW5keCArIDE7Ci0KLSAgKnBhdXhlbnQgPSBlbnQtPnUuYXV4ZW50OwotCi0gIGlmIChlbnQtPmZpeF90YWcpCi0gICAgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9zeW0ueF90YWduZHgucAotICAgICAgIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgaWYgKGVudC0+Zml4X2VuZCkKLSAgICBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLSAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICBpZiAoZW50LT5maXhfc2NubGVuKQotICAgIHBhdXhlbnQtPnhfY3NlY3QueF9zY25sZW4ubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9jc2VjdC54X3Njbmxlbi5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IENPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgImNvZmYgJXMgJXMiLAotCSAgICAgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgPyAibiIgOiAiZyIsCi0JICAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubyA/ICJsIiA6ICIgIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICBpZiAoY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgaW50IGF1eDsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmNvbWJpbmVkID0gY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlOwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcm9vdCA9IG9ial9yYXdfc3ltZW50cyAoYWJmZCk7Ci0JICBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsID0gY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vOwotCi0JICBmcHJpbnRmIChmaWxlLCAiWyUzbGRdIiwgKGxvbmcpIChjb21iaW5lZCAtIHJvb3QpKTsKLQotCSAgaWYgKCEgY29tYmluZWQtPmZpeF92YWx1ZSkKLQkgICAgdmFsID0gKHVuc2lnbmVkIGxvbmcpIGNvbWJpbmVkLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgZWxzZQotCSAgICB2YWwgPSAoKHVuc2lnbmVkIGxvbmcpCi0JCSAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBjb21iaW5lZC0+dS5zeW1lbnQubl92YWx1ZQotCQkgICAgLSByb290KSk7Ci0KLQkgIGZwcmludGYgKGZpbGUsCi0JCSAgICIoc2VjICUyZCkoZmwgMHglMDJ4KSh0eSAlM3gpKHNjbCAlM2QpIChueCAlZCkgMHglMDhseCAlcyIsCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX3NjbnVtLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9mbGFncywKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fdHlwZSwKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fc2NsYXNzLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9udW1hdXgsCi0JCSAgIHZhbCwKLQkJICAgc3ltYm9sLT5uYW1lKTsKLQotCSAgZm9yIChhdXggPSAwOyBhdXggPCBjb21iaW5lZC0+dS5zeW1lbnQubl9udW1hdXg7IGF1eCsrKQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4cCA9IGNvbWJpbmVkICsgYXV4ICsgMTsKLQkgICAgICBsb25nIHRhZ25keDsKLQotCSAgICAgIGlmIChhdXhwLT5maXhfdGFnKQotCQl0YWduZHggPSBhdXhwLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wIC0gcm9vdDsKLQkgICAgICBlbHNlCi0JCXRhZ25keCA9IGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4Lmw7Ci0KLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotCSAgICAgIGlmIChiZmRfY29mZl9wcmludF9hdXggKGFiZmQsIGZpbGUsIHJvb3QsIGNvbWJpbmVkLCBhdXhwLCBhdXgpKQotCQljb250aW51ZTsKLQotCSAgICAgIHN3aXRjaCAoY29tYmluZWQtPnUuc3ltZW50Lm5fc2NsYXNzKQotCQl7Ci0JCWNhc2UgQ19GSUxFOgotCQkgIGZwcmludGYgKGZpbGUsICJGaWxlICIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQ19TVEFUOgotCQkgIGlmIChjb21iaW5lZC0+dS5zeW1lbnQubl90eXBlID09IFRfTlVMTCkKLQkJICAgIC8qIHByb2JhYmx5IGEgc2VjdGlvbiBzeW1ib2w/ICovCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGZpbGUsICJBVVggc2NubGVuIDB4JWx4IG5yZWxvYyAlZCBubG5ubyAlZCIsCi0JCQkgICAgICAgKGxvbmcpIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfc2NubGVuLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfbnJlbG9jLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfbmxpbm5vKTsKLQkJICAgICAgaWYgKGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY2hlY2tzdW0gIT0gMAotCQkJICB8fCBhdXhwLT51LmF1eGVudC54X3Njbi54X2Fzc29jaWF0ZWQgIT0gMAotCQkJICB8fCBhdXhwLT51LmF1eGVudC54X3Njbi54X2NvbWRhdCAhPSAwKQotCQkJZnByaW50ZiAoZmlsZSwgIiBjaGVja3N1bSAweCVseCBhc3NvYyAlZCBjb21kYXQgJWQiLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2NoZWNrc3VtLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2Fzc29jaWF0ZWQsCi0JCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIENfRVhUOgotCQkgIGlmIChJU0ZDTiAoY29tYmluZWQtPnUuc3ltZW50Lm5fdHlwZSkpCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGZpbGUsCi0JCQkgICAgICAgXygiQVVYIHRhZ25keCAlbGQgdHRsc2l6IDB4JWx4IGxubm9zICVsZCBuZXh0ICVsZCIpLAotCQkJICAgICAgIHRhZ25keCwKLQkJCSAgICAgICBhdXhwLT51LmF1eGVudC54X3N5bS54X21pc2MueF9mc2l6ZSwKLQkJCSAgICAgICBhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsCi0JCQkgICAgICAgKGF1eHAtPmZpeF9lbmQKLQkJCQk/ICgobG9uZykKLQkJCQkgICAoYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucAotCQkJCSAgICAtIHJvb3QpKQotCQkJCTogYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCQlkZWZhdWx0OgotCQkgIGZwcmludGYgKGZpbGUsICJBVVggbG5ubyAlZCBzaXplIDB4JXggdGFnbmR4ICVsZCIsCi0JCQkgICBhdXhwLT51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywKLQkJCSAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJICAgdGFnbmR4KTsKLQkJICBpZiAoYXV4cC0+Zml4X2VuZCkKLQkJICAgIGZwcmludGYgKGZpbGUsICIgZW5kbmR4ICVsZCIsCi0JCQkgICAgICgobG9uZykKLQkJCSAgICAgIChhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0JCQkgICAgICAgLSByb290KSkpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGwpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4lcyA6IiwgbC0+dS5zeW0tPm5hbWUpOwotCSAgICAgIGwrKzsKLQkgICAgICB3aGlsZSAobC0+bGluZV9udW1iZXIpCi0JCXsKLQkJICBmcHJpbnRmIChmaWxlLCAiXG4lNGQgOiAweCVseCIsCi0JCQkgICBsLT5saW5lX251bWJlciwKLQkJCSAgICgodW5zaWduZWQgbG9uZykKLQkJCSAgICAobC0+dS5vZmZzZXQgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYSkpKTsKLQkJICBsKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCSAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzICVzICVzIiwKLQkJICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAotCQkgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgPyAibiIgOiAiZyIsCi0JCSAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubyA/ICJsIiA6ICIgIiwKLQkJICAgc3ltYm9sLT5uYW1lKTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBzeW1ib2wuICBJbiBDT0ZGLAotICAgbG9jYWwgc3ltYm9scyBnZW5lcmFsbHkgc3RhcnQgd2l0aCBgYC5MJycuICBNb3N0IHRhcmdldHMgdXNlIHRoaXMKLSAgIGZ1bmN0aW9uIGZvciB0aGUgaXNfbG9jYWxfbGFiZWxfbmFtZSBlbnRyeSBwb2ludCwgYnV0IHNvbWUgbWF5Ci0gICBvdmVycmlkZSBpdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnOwotfQotCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSAgIHdhbnRlZCBsb2NhdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBsaW5lX2Jhc2U7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2YgPSBjb2ZmX2RhdGEgKGFiZmQpOwotICAvKiBSdW4gdGhyb3VnaCB0aGUgcmF3IHN5bWVudHMgaWYgYXZhaWxhYmxlICovCi0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnA7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnBlbmQ7Ci0gIGFsZW50ICpsOwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICpzZWNfZGF0YTsKLQotICAvKiBCZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUsIHRyeSB0byB1c2UgYSAuc3RhYgotICAgICBzZWN0aW9uIHRvIGZpbmQgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmY29mZl9kYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAqZmlsZW5hbWVfcHRyID0gMDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSAwOwotICAqbGluZV9wdHIgPSAwOwotCi0gIC8qIERvbid0IHRyeSBhbmQgZmluZCBsaW5lIG51bWJlcnMgaW4gYSBub24gY29mZiBmaWxlICovCi0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IENfRklMRSBzeW1ib2wuICAqLwotICBwID0gY29mLT5yYXdfc3ltZW50czsKLSAgaWYgKCFwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwZW5kID0gcCArIGNvZi0+cmF3X3N5bWVudF9jb3VudDsKLSAgd2hpbGUgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGlmIChwLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JYnJlYWs7Ci0gICAgICBwICs9IDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKLSAgICB9Ci0KLSAgaWYgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGJmZF92bWEgc2VjX3ZtYTsKLSAgICAgIGJmZF92bWEgbWF4ZGlmZjsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBDX0ZJTEUgc3ltYm9scyB0byBmaW5kIHRoZSBiZXN0IG9uZS4gICovCi0gICAgICBzZWNfdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICAqZmlsZW5hbWVfcHRyID0gKGNoYXIgKikgcC0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQ7Ci0gICAgICBtYXhkaWZmID0gKGJmZF92bWEpIDAgLSAoYmZkX3ZtYSkgMTsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnAyOwotCi0JICBmb3IgKHAyID0gcCArIDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKLQkgICAgICAgcDIgPCBwZW5kOwotCSAgICAgICBwMiArPSAxICsgcDItPnUuc3ltZW50Lm5fbnVtYXV4KQotCSAgICB7Ci0JICAgICAgaWYgKHAyLT51LnN5bWVudC5uX3NjbnVtID4gMAotCQkgICYmIChzZWN0aW9uCi0JCSAgICAgID09IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCSAgICAgIHAyLT51LnN5bWVudC5uX3NjbnVtKSkpCi0JCWJyZWFrOwotCSAgICAgIGlmIChwMi0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgcDIgPSBwZW5kOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgLyogV2UgdXNlIDw9IE1BWERJRkYgaGVyZSBzbyB0aGF0IGlmIHdlIGdldCBhIHplcm8gbGVuZ3RoCi0gICAgICAgICAgICAgZmlsZSwgd2UgYWN0dWFsbHkgdXNlIHRoZSBuZXh0IGZpbGUgZW50cnkuICAqLwotCSAgaWYgKHAyIDwgcGVuZAotCSAgICAgICYmIG9mZnNldCArIHNlY192bWEgPj0gKGJmZF92bWEpIHAyLT51LnN5bWVudC5uX3ZhbHVlCi0JICAgICAgJiYgb2Zmc2V0ICsgc2VjX3ZtYSAtIChiZmRfdm1hKSBwMi0+dS5zeW1lbnQubl92YWx1ZSA8PSBtYXhkaWZmKQotCSAgICB7Ci0JICAgICAgKmZpbGVuYW1lX3B0ciA9IChjaGFyICopIHAtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0OwotCSAgICAgIG1heGRpZmYgPSBvZmZzZXQgKyBzZWNfdm1hIC0gcDItPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgIH0KLQotCSAgLyogQXZvaWQgZW5kbGVzcyBsb29wcyBvbiBlcnJvbmVvdXMgZmlsZXMgYnkgZW5zdXJpbmcgdGhhdAotCSAgICAgd2UgYWx3YXlzIG1vdmUgZm9yd2FyZCBpbiB0aGUgZmlsZS4gICovCi0JICBpZiAocCAtIGNvZi0+cmF3X3N5bWVudHMgPj0gcC0+dS5zeW1lbnQubl92YWx1ZSkKLQkgICAgYnJlYWs7Ci0KLQkgIHAgPSBjb2YtPnJhd19zeW1lbnRzICsgcC0+dS5zeW1lbnQubl92YWx1ZTsKLQkgIGlmIChwID4gcGVuZCB8fCBwLT51LnN5bWVudC5uX3NjbGFzcyAhPSBDX0ZJTEUpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHdhbmRlciB0aG91Z2ggdGhlIHJhdyBsaW5lbnVtYmVycyBvZiB0aGUgc2VjdGlvbiAqLwotICAvKiBJZiB3ZSBoYXZlIGJlZW4gY2FsbGVkIG9uIHRoaXMgc2VjdGlvbiBiZWZvcmUsIGFuZCB0aGUgb2Zmc2V0IHdlCi0gICAgIHdhbnQgaXMgZnVydGhlciBkb3duIHRoZW4gd2UgY2FuIHByaW1lIHRoZSBsb29rdXAgbG9vcC4gICovCi0gIHNlY19kYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoc2VjX2RhdGEgIT0gTlVMTAotICAgICAgJiYgc2VjX2RhdGEtPmkgPiAwCi0gICAgICAmJiBvZmZzZXQgPj0gc2VjX2RhdGEtPm9mZnNldCkKLSAgICB7Ci0gICAgICBpID0gc2VjX2RhdGEtPmk7Ci0gICAgICAqZnVuY3Rpb25uYW1lX3B0ciA9IHNlY19kYXRhLT5mdW5jdGlvbjsKLSAgICAgIGxpbmVfYmFzZSA9IHNlY19kYXRhLT5saW5lX2Jhc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaSA9IDA7Ci0gICAgICBsaW5lX2Jhc2UgPSAwOwotICAgIH0KLQotICBpZiAoc2VjdGlvbi0+bGluZW5vICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBsYXN0X3ZhbHVlID0gMDsKLQotICAgICAgbCA9ICZzZWN0aW9uLT5saW5lbm9baV07Ci0KLSAgICAgIGZvciAoOyBpIDwgc2VjdGlvbi0+bGluZW5vX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGwtPmxpbmVfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICAvKiBHZXQgdGhlIHN5bWJvbCB0aGlzIGxpbmUgbnVtYmVyIHBvaW50cyBhdCAqLwotCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmYgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSAobC0+dS5zeW0pOwotCSAgICAgIGlmIChjb2ZmLT5zeW1ib2wudmFsdWUgPiBvZmZzZXQpCi0JCWJyZWFrOwotCSAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gY29mZi0+c3ltYm9sLm5hbWU7Ci0JICAgICAgbGFzdF92YWx1ZSA9IGNvZmYtPnN5bWJvbC52YWx1ZTsKLQkgICAgICBpZiAoY29mZi0+bmF0aXZlKQotCQl7Ci0JCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmYtPm5hdGl2ZTsKLQkJICBzID0gcyArIDEgKyBzLT51LnN5bWVudC5uX251bWF1eDsKLQotCQkgIC8qIEluIFhDT0ZGIGEgZGVidWdnaW5nIHN5bWJvbCBjYW4gZm9sbG93IHRoZQotCQkgICAgIGZ1bmN0aW9uIHN5bWJvbC4gICovCi0JCSAgaWYgKHMtPnUuc3ltZW50Lm5fc2NudW0gPT0gTl9ERUJVRykKLQkJICAgIHMgPSBzICsgMSArIHMtPnUuc3ltZW50Lm5fbnVtYXV4OwotCi0JCSAgLyogUyBzaG91bGQgbm93IHBvaW50IHRvIHRoZSAuYmYgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkJICBpZiAocy0+dS5zeW1lbnQubl9udW1hdXgpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsaW5lbnVtYmVyIGlzIHN0b3JlZCBpbiB0aGUgYXV4ZW50LiAgKi8KLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphID0gJigocyArIDEpLT51LmF1eGVudCk7Ci0JCSAgICAgIGxpbmVfYmFzZSA9IGEtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOwotCQkgICAgICAqbGluZV9wdHIgPSBsaW5lX2Jhc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGwtPnUub2Zmc2V0ID4gb2Zmc2V0KQotCQlicmVhazsKLQkgICAgICAqbGluZV9wdHIgPSBsLT5saW5lX251bWJlciArIGxpbmVfYmFzZSAtIDE7Ci0JICAgIH0KLQkgIGwrKzsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGZlbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIGxvb3AsIHRoZW4gYXNzdW1lIHRoYXQgdGhpcwotCSBzeW1ib2wgaGFzIG5vIGxpbmUgbnVtYmVyIGluZm8uICBPdGhlcndpc2UsIHN5bWJvbHMgd2l0aCBubwotCSBsaW5lIG51bWJlciBpbmZvIGdldCByZXBvcnRlZCB3aXRoIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLQkgbGFzdCBsaW5lIG9mIHRoZSBsYXN0IHN5bWJvbCB3aGljaCBkb2VzIGhhdmUgbGluZSBudW1iZXIKLQkgaW5mby4gIFdlIHVzZSAweDEwMCBhcyBhIHNsb3AgdG8gYWNjb3VudCBmb3IgY2FzZXMgd2hlcmUgdGhlCi0JIGxhc3QgbGluZSBoYXMgZXhlY3V0YWJsZSBjb2RlLiAgKi8KLSAgICAgIGlmIChpID49IHNlY3Rpb24tPmxpbmVub19jb3VudAotCSAgJiYgbGFzdF92YWx1ZSAhPSAwCi0JICAmJiBvZmZzZXQgLSBsYXN0X3ZhbHVlID4gMHgxMDApCi0JewotCSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotCSAgKmxpbmVfcHRyID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciB0aGUgbmV4dCBjYWxsLiAgKi8KLSAgaWYgKHNlY19kYXRhID09IE5VTEwgJiYgc2VjdGlvbi0+b3duZXIgPT0gYWJmZCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9Ci0JKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0gICAgICBzZWNfZGF0YSA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICAgIH0KLSAgaWYgKHNlY19kYXRhICE9IE5VTEwpCi0gICAgewotICAgICAgc2VjX2RhdGEtPm9mZnNldCA9IG9mZnNldDsKLSAgICAgIHNlY19kYXRhLT5pID0gaTsKLSAgICAgIHNlY19kYXRhLT5mdW5jdGlvbiA9ICpmdW5jdGlvbm5hbWVfcHRyOwotICAgICAgc2VjX2RhdGEtPmxpbmVfYmFzZSA9IGxpbmVfYmFzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludAotY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgc2l6ZV90IHNpemU7Ci0KLSAgaWYgKHJlbG9jID09IGZhbHNlKQotICAgIHsKLSAgICAgIHNpemUgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgICB9Ci0KLSAgc2l6ZSArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIENoYW5nZSB0aGUgY2xhc3Mgb2YgYSBjb2ZmIHN5bWJvbCBoZWxkIGJ5IEJGRC4gICovCi1ib29sZWFuCi1iZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzIChhYmZkLCBzeW1ib2wsIGNsYXNzKQotICAgICBiZmQgKiAgICAgICAgIGFiZmQ7Ci0gICAgIGFzeW1ib2wgKiAgICAgc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgIGNsYXNzOwotewotICBjb2ZmX3N5bWJvbF90eXBlICogY3N5bTsKLQotICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLSAgaWYgKGNzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAoY3N5bS0+bmF0aXZlID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBhbGllbiBzeW1ib2wgd2hpY2ggbm8gbmF0aXZlIGNvZmYgYmFja2VuZCBkYXRhLgotCSBXZSBjaGVhdCBoZXJlIGJ5IGNyZWF0aW5nIGEgZmFrZSBuYXRpdmUgZW50cnkgZm9yIGl0IGFuZAotCSB0aGVuIGZpbGxpbmcgaW4gdGhlIGNsYXNzLiAgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoYXQgaW4KLQkgY29mZl93cml0ZV9hbGllbl9zeW1ib2woKS4gICovCi0gICAgICAKLSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiBuYXRpdmU7Ci0KLSAgICAgIG5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIG5hdGl2ZSkpOwotICAgICAgaWYgKG5hdGl2ZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWVtc2V0IChuYXRpdmUsIDAsIHNpemVvZiAoKiBuYXRpdmUpKTsKLSAgICAgIAotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgICA9IFRfTlVMTDsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBjbGFzczsKLSAgICAgIAotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQl7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9Ci0JICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IChzeW1ib2wtPnZhbHVlCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQkgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIAotCSAgLyogQ29weSB0aGUgYW55IGZsYWdzIGZyb20gdGhlIHRoZSBmaWxlIGhlYWRlciBpbnRvIHRoZSBzeW1ib2wuCi0JICAgICBGSVhNRTogV2h5PyAgKi8KLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IGJmZF9hc3ltYm9sX2JmZCAoJiBjc3ltLT5zeW1ib2wpLT5mbGFnczsKLQl9Ci0gICAgICAKLSAgICAgIGNzeW0tPm5hdGl2ZSA9IG5hdGl2ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gY2xhc3M7Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmbGluay5jIGIvYmZkL2NvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjQxNmQuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZsaW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDA1ICswLDAgQEAKLS8qIENPRkYgc3BlY2lmaWMgbGlua2VyIGNvZGUuCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIGNvZGUuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2FkZF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgY2hhciAqZG9yZXNfY29tIFBBUkFNUyAoKGNoYXIgKiwgYmZkICosIGludCkpOwotc3RhdGljIGNoYXIgKmdldF9uYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOwotc3RhdGljIGludCBwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgbWFya19yZWxvY3MgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci0KLS8qIERlZmluZSBtYWNyb3Mgc28gdGhhdCB0aGUgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4KLSAgIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCBpbiB0ZXJtcyBvZgotICAgTl9UTUFTSywgZXRjLiAgVGhlc2UgZGVmaW5pdGlvbnMgcmVxdWlyZSBhIHVzZXIgdG8gZGVmaW5lIGxvY2FsCi0gICB2YXJpYWJsZXMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbmFtZXMsIGFuZCB3aXRoIHZhbHVlcyBmcm9tIHRoZQotICAgY29mZl9kYXRhIChhYmZkKSBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotI2RlZmluZSBOX0JUTUFTSyBuX2J0bWFzawotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPnR5cGUgPSBUX05VTEw7Ci0gICAgICByZXQtPmNsYXNzID0gQ19OVUxMOwotICAgICAgcmV0LT5udW1hdXggPSAwOwotICAgICAgcmV0LT5hdXhiZmQgPSBOVUxMOwotICAgICAgcmV0LT5hdXggPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+c3RhYl9pbmZvID0gTlVMTDsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dHlwZXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEdpdmVuIGEgQ09GRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiBjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0dXJuIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgICAgKGFiZmQsIGluZm8sIGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGEgQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbjsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBjbGFzc2lmaWNhdGlvbiA9IGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0gICAgICBpZiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfR0xPQkFMCi0JICB8fCBjbGFzc2lmaWNhdGlvbiA9PSBDT0ZGX1NZTUJPTF9DT01NT04pCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBhbmQgaXMgZGVmaW5lZCBieSB0aGlzCi0gICAgICAgICAgICAgb2JqZWN0IGZpbGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JICAgICB1bmRlZmluZWQuICBJZiBhIHN5bWJvbCBpcyBjdXJyZW50bHkga25vd24gdG8gYmUgY29tbW9uLAotCSAgICAgQ09GRiBsaW5rZXJzIGRvIG5vdCBicmluZyBpbiBhbiBvYmplY3QgZmlsZSB3aGljaCBkZWZpbmVzCi0JICAgICBpdC4gICovCi0JICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICB9Ci0KLSAgLyogV2UgZG8gbm90IG5lZWQgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgbl90bWFzayA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdCA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBpbnQgbl9idG1hc2sgPSBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0bWFzazsKLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0gIGJvb2xlYW4gZGVmYXVsdF9jb3B5OwotICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0KLSAgLyogS2VlcCB0aGUgc3ltYm9scyBkdXJpbmcgdGhpcyBmdW5jdGlvbiwgaW4gY2FzZSB0aGUgbGlua2VyIG5lZWRzCi0gICAgIHRvIHJlYWQgdGhlIGdlbmVyaWMgc3ltYm9scyBpbiBvcmRlciB0byByZXBvcnQgYW4gZXJyb3IgbWVzc2FnZS4gICovCi0gIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCk7Ci0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBkZWZhdWx0X2NvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGRlZmF1bHRfY29weSA9IHRydWU7Ci0KLSAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIHBhcnRpY3VsYXIgc3ltYm9scy4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJICgoc2l6ZV90KSBzeW1jb3VudAotCQkJICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKSkpOwotICBpZiAoc3ltX2hhc2ggPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKSA9IHN5bV9oYXNoOwotICBtZW1zZXQgKHN5bV9oYXNoLCAwLAotCSAgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgQkZEX0FTU0VSVCAoc3ltZXN6ID09IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCkpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb247Ci0gICAgICBib29sZWFuIGNvcHk7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotICAgICAgY2xhc3NpZmljYXRpb24gPSBiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wgKGFiZmQsICZzeW0pOwotICAgICAgaWYgKGNsYXNzaWZpY2F0aW9uICE9IENPRkZfU1lNQk9MX0xPQ0FMKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkgIGJmZF92bWEgdmFsdWU7Ci0JICBib29sZWFuIGFkZGl0OwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFdlIG11c3QgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeSBpZiB3ZSBnb3QgaXQgZnJvbSB0aGUKLSAgICAgICAgICAgICBzeW1lbnQgaXRzZWxmLCByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGNvcHkgPSBkZWZhdWx0X2NvcHk7Ci0JICBpZiAoc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkgICAgICB8fCBzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgY29weSA9IHRydWU7Ci0KLQkgIHZhbHVlID0gc3ltLm5fdmFsdWU7Ci0KLQkgIHN3aXRjaCAoY2xhc3NpZmljYXRpb24pCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX0dMT0JBTDoKLQkgICAgICBmbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCSAgICAgIHNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCQl2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9VTkRFRklORUQ6Ci0JICAgICAgZmxhZ3MgPSAwOwotCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ09GRl9TWU1CT0xfQ09NTU9OOgotCSAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLQkgICAgICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX1BFX1NFQ1RJT046Ci0JICAgICAgZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfR0xPQkFMOwotCSAgICAgIHNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCSAgICAgIHx8IChvYmpfcGUgKGFiZmQpICYmIHN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspKQotCSAgICBmbGFncyA9IEJTRl9XRUFLOwotCi0JICBhZGRpdCA9IHRydWU7Ci0KLQkgIC8qIEluIHRoZSBQRSBmb3JtYXQsIHNlY3Rpb24gc3ltYm9scyBhY3R1YWxseSByZWZlciB0byB0aGUKLSAgICAgICAgICAgICBzdGFydCBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICBXZSBoYW5kbGUgdGhlbSBzcGVjaWFsbHkKLSAgICAgICAgICAgICBoZXJlLiAgKi8KLQkgIGlmIChvYmpfcGUgKGFiZmQpICYmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQkgICAgewotCSAgICAgICpzeW1faGFzaCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSBuYW1lLCBmYWxzZSwgY29weSwgZmFsc2UpOwotCSAgICAgIGlmICgqc3ltX2hhc2ggIT0gTlVMTCkKLQkJewotCQkgIGlmICgoKCpzeW1faGFzaCktPmNvZmZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MKSA9PSAwCi0JCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgICAoIldhcm5pbmc6IHN5bWJvbCBgJXMnIGlzIGJvdGggc2VjdGlvbiBhbmQgbm9uLXNlY3Rpb24iLAotCQkgICAgICAgbmFtZSk7Ci0KLQkJICBhZGRpdCA9IGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgLyogVGhlIE1pY3Jvc29mdCBWaXN1YWwgQyBjb21waWxlciBkb2VzIHN0cmluZyBwb29saW5nIGJ5Ci0JICAgICBoYXNoaW5nIHRoZSBjb25zdGFudHMgdG8gYW4gaW50ZXJuYWwgc3ltYm9sIG5hbWUsIGFuZAotCSAgICAgcmVseWluZyBvbiB0aGUgdGhlIGxpbmtlciBjb21kYXQgc3VwcG9ydCB0byBkaXNjYXJkCi0JICAgICBkdXBsaWNhdGUgbmFtZXMuICBIb3dldmVyLCBpZiBvbmUgc3RyaW5nIGlzIGEgbGl0ZXJhbCBhbmQKLQkgICAgIG9uZSBpcyBhIGRhdGEgaW5pdGlhbGl6ZXIsIG9uZSB3aWxsIGVuZCB1cCBpbiB0aGUgLmRhdGEKLQkgICAgIHNlY3Rpb24gYW5kIG9uZSB3aWxsIGVuZCB1cCBpbiB0aGUgLnJkYXRhIHNlY3Rpb24uICBUaGUKLQkgICAgIE1pY3Jvc29mdCBsaW5rZXIgd2lsbCBjb21iaW5lIHRoZW0gaW50byB0aGUgLmRhdGEKLQkgICAgIHNlY3Rpb24sIHdoaWNoIHNlZW1zIHRvIGJlIHdyb25nIHNpbmNlIGl0IG1pZ2h0IGNhdXNlIHRoZQotCSAgICAgbGl0ZXJhbCB0byBjaGFuZ2UuCi0KLQkgICAgIEFzIGxvbmcgYXMgdGhlcmUgYXJlIG5vIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8gdGhlCi0JICAgICBzeW1ib2xzLCB3aGljaCB0aGVyZSBzaG91bGRuJ3QgYmUsIHdlIGNhbiB0cmVhdCB0aGUgLmRhdGEKLQkgICAgIGFuZCAucmRhdGEgaW5zdGFuY2VzIGFzIHNlcGFyYXRlIHN5bWJvbHMuICBUaGUgY29tZGF0Ci0JICAgICBjb2RlIGluIHRoZSBsaW5rZXIgd2lsbCBkbyB0aGUgYXBwcm9wcmlhdGUgbWVyZ2luZy4gIEhlcmUKLQkgICAgIHdlIGF2b2lkIGdldHRpbmcgYSBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yIGZvciBvbmUgb2YKLQkgICAgIHRoZXNlIHNwZWNpYWwgc3ltYm9scy4KLQotCSAgICAgRklYTUU6IEkgZG9uJ3QgdGhpbmsgdGhpcyB3aWxsIHdvcmsgaW4gdGhlIGNhc2Ugd2hlcmUKLQkgICAgIHRoZXJlIGFyZSB0d28gb2JqZWN0IGZpbGVzIHdoaWNoIHVzZSB0aGUgY29uc3RhbnRzIGFzIGEKLQkgICAgIGxpdGVyYWwgYW5kIHR3byBvYmplY3QgZmlsZXMgd2hpY2ggdXNlIGl0IGFzIGEgZGF0YQotCSAgICAgaW5pdGlhbGl6ZXIuICBPbmUgb3IgdGhlIG90aGVyIG9mIHRoZSBzZWNvbmQgb2JqZWN0IGZpbGVzCi0JICAgICBpcyBnb2luZyB0byB3aW5kIHVwIHdpdGggYW4gaW5hcHByb3ByaWF0ZSByZWZlcmVuY2UuICAqLwotCSAgaWYgKG9ial9wZSAoYWJmZCkKLQkgICAgICAmJiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfR0xPQkFMCi0JCSAgfHwgY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfUEVfU0VDVElPTikKLQkgICAgICAmJiBzZWN0aW9uLT5jb21kYXQgIT0gTlVMTAotCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICI/P18iLCAzKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChuYW1lLCBzZWN0aW9uLT5jb21kYXQtPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKnN5bV9oYXNoID09IE5VTEwpCi0JCSpzeW1faGFzaCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgIG5hbWUsIGZhbHNlLCBjb3B5LCBmYWxzZSk7Ci0JICAgICAgaWYgKCpzeW1faGFzaCAhPSBOVUxMCi0JCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAmJiAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5jb21kYXQgIT0gTlVMTAotCQkgICYmIHN0cmNtcCAoKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbi0+Y29tZGF0LT5uYW1lLAotCQkJICAgICBzZWN0aW9uLT5jb21kYXQtPm5hbWUpID09IDApCi0JCWFkZGl0ID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGFkZGl0KQotCSAgICB7Ci0JICAgICAgaWYgKCEgKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMLCBjb3B5LCBmYWxzZSwKLQkJICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBpZiAob2JqX3BlIChhYmZkKSAmJiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0JICAgICgqc3ltX2hhc2gpLT5jb2ZmX2xpbmtfaGFzaF9mbGFncyB8PQotCSAgICAgIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MOwotCi0JICAvKiBMaW1pdCB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCB0byB0aGUgcG9zc2libGUKLSAgICAgICAgICAgICBhbGlnbm1lbnQgb2YgYSBzZWN0aW9uLiAgVGhlcmUgaXMgbm8gcG9pbnQgdG8gcGVybWl0dGluZwotICAgICAgICAgICAgIGEgaGlnaGVyIGFsaWdubWVudCBmb3IgYSBjb21tb24gc3ltYm9sOiB3ZSBjYW4gbm90Ci0gICAgICAgICAgICAgZ3VhcmFudGVlIGl0LCBhbmQgaXQgbWF5IGNhdXNlIHVzIHRvIGFsbG9jYXRlIGV4dHJhIHNwYWNlCi0gICAgICAgICAgICAgaW4gdGhlIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIGlmIChzZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIKLQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIKLQkJICA+IGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIgKGFiZmQpKSkKLQkgICAgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCSAgICAgID0gYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlciAoYWJmZCk7Ci0KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSBzeW1ib2wgaW5mb3JtYXRpb24gY3VycmVudGx5IGluCi0gICAgICAgICAgICAgICAgIHRoZSBoYXNoIHRhYmxlLCBvciBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN5bWJvbAotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCB0aGVuIHVwZGF0ZSB0aGUgc3ltYm9sIGNsYXNzIGFuZCB0eXBlIGluCi0gICAgICAgICAgICAgICAgIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgCSAgICAgIGlmICgoKCpzeW1faGFzaCktPmNsYXNzID09IENfTlVMTAotICAJCSAgICYmICgqc3ltX2hhc2gpLT50eXBlID09IFRfTlVMTCkKLSAgCQkgIHx8IHN5bS5uX3NjbnVtICE9IDAKLSAgCQkgIHx8IChzeW0ubl92YWx1ZSAhPSAwCi0gIAkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgCQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gIAkJewotICAJCSAgKCpzeW1faGFzaCktPmNsYXNzID0gc3ltLm5fc2NsYXNzOwotICAJCSAgaWYgKHN5bS5uX3R5cGUgIT0gVF9OVUxMKQotICAJCSAgICB7Ci0gIAkJICAgICAgLyogV2Ugd2FudCB0byB3YXJuIGlmIHRoZSB0eXBlIGNoYW5nZWQsIGJ1dCBub3QKLSAgCQkJIGlmIGl0IGNoYW5nZWQgZnJvbSBhbiB1bnNwZWNpZmllZCB0eXBlLgotICAJCQkgVGVzdGluZyB0aGUgd2hvbGUgdHlwZSBieXRlIG1heSB3b3JrLCBidXQgdGhlCi0gIAkJCSBjaGFuZ2UgZnJvbSAoZS5nLikgYSBmdW5jdGlvbiBvZiB1bnNwZWNpZmllZAotICAJCQkgdHlwZSB0byBmdW5jdGlvbiBvZiBrbm93biB0eXBlIGFsc28gd2FudHMgdG8KLSAgCQkJIHNraXAgdGhlIHdhcm5pbmcuICAqLwotICAJCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+dHlwZSAhPSBUX05VTEwKLSAgCQkJICAmJiAoKnN5bV9oYXNoKS0+dHlwZSAhPSBzeW0ubl90eXBlCi0gIAkJICAgICAgICAgICYmICEoRFRZUEUgKCgqc3ltX2hhc2gpLT50eXBlKSA9PSBEVFlQRSAoc3ltLm5fdHlwZSkKLSAgCQkgICAgICAgICAgICAgICAmJiAoQlRZUEUgKCgqc3ltX2hhc2gpLT50eXBlKSA9PSBUX05VTEwKLSAgCQkgICAgICAgICAgICAgICAgICAgfHwgQlRZUEUgKHN5bS5uX3R5cGUpID09IFRfTlVMTCkpKQotICAJCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgCQkJICAoXygiV2FybmluZzogdHlwZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgaW4gJXMiKSwKLSAgCQkJICAgbmFtZSwgKCpzeW1faGFzaCktPnR5cGUsIHN5bS5uX3R5cGUsCi0gIAkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAJCSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGZyb20gYSBtZWFuaW5nZnVsCi0gIAkJCSBiYXNlIHR5cGUgdG8gYSBudWxsIG9uZSwgYnV0IGlmIHdlIGtub3cKLSAgCQkJIG5vdGhpbmcsIHRha2Ugd2hhdCBsaXR0bGUgd2UgbWlnaHQgbm93IGtub3cuICAqLwotICAJCSAgICAgIGlmIChCVFlQRSAoc3ltLm5fdHlwZSkgIT0gVF9OVUxMCi0gIAkJCSAgfHwgKCpzeW1faGFzaCktPnR5cGUgPT0gVF9OVUxMKQotCQkJKCpzeW1faGFzaCktPnR5cGUgPSBzeW0ubl90eXBlOwotICAJCSAgICB9Ci0gIAkJICAoKnN5bV9oYXNoKS0+YXV4YmZkID0gYWJmZDsKLQkJICBpZiAoc3ltLm5fbnVtYXV4ICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYWxsb2M7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBpOwotCQkgICAgICBiZmRfYnl0ZSAqZWF1eDsKLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppYXV4OwotCi0JCSAgICAgICgqc3ltX2hhc2gpLT5udW1hdXggPSBzeW0ubl9udW1hdXg7Ci0JCSAgICAgIGFsbG9jID0gKCh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikKLQkJCSAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJICAoc3ltLm5fbnVtYXV4Ci0JCQkJCQkgICAqIHNpemVvZiAoKmFsbG9jKSkpKTsKLQkJICAgICAgaWYgKGFsbG9jID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgZm9yIChpID0gMCwgZWF1eCA9IGVzeW0gKyBzeW1lc3osIGlhdXggPSBhbGxvYzsKLQkJCSAgIGkgPCBzeW0ubl9udW1hdXg7Ci0JCQkgICBpKyssIGVhdXggKz0gc3ltZXN6LCBpYXV4KyspCi0JCQliZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgZWF1eCwgc3ltLm5fdHlwZSwKLQkJCQkJICAgICAgc3ltLm5fc2NsYXNzLCBpLCBzeW0ubl9udW1hdXgsCi0JCQkJCSAgICAgIChQVFIpIGlhdXgpOwotCQkgICAgICAoKnN5bV9oYXNoKS0+YXV4ID0gYWxsb2M7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfUEVfU0VDVElPTgotCSAgICAgICYmICgqc3ltX2hhc2gpLT5udW1hdXggIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFNvbWUgUEUgc2VjdGlvbnMgKHN1Y2ggYXMgLmJzcykgaGF2ZSBhIHplcm8gc2l6ZSBpbgotICAgICAgICAgICAgICAgICB0aGUgc2VjdGlvbiBoZWFkZXIsIGJ1dCBhIG5vbi16ZXJvIHNpemUgaW4gdGhlIEFVWAotICAgICAgICAgICAgICAgICByZWNvcmQuICBDb3JyZWN0IHRoYXQgaGVyZS4KLQotCQkgRklYTUU6IFRoaXMgaXMgbm90IGF0IGFsbCB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gdGhpcy4KLQkJIEZvciBleGFtcGxlLCBpdCB3b24ndCBoZWxwIG9iamR1bXAuICBUaGlzIG5lZWRzIHRvIGJlCi0JCSBkb25lIHdoZW4gd2Ugc3dhcCBpbiB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLwotCi0JICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPm51bWF1eCA9PSAxKTsKLQkgICAgICBpZiAoc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCXNlY3Rpb24tPl9yYXdfc2l6ZSA9ICgqc3ltX2hhc2gpLT5hdXhbMF0ueF9zY24ueF9zY25sZW47Ci0KLQkgICAgICAvKiBGSVhNRTogV2UgY291bGQgdGVzdCB3aGV0aGVyIHRoZSBzZWN0aW9uIHNpemVzCi0gICAgICAgICAgICAgICAgIG1hdGNoZXMgdGhlIHNpemUgaW4gdGhlIGF1eCBlbnRyeSwgYnV0IGFwcGFyZW50bHkKLSAgICAgICAgICAgICAgICAgdGhhdCBzb21ldGltZXMgZmFpbHMgdW5leHBlY3RlZGx5LiAgKi8KLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgICBzeW1faGFzaCArPSBzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bwotICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgYW55IC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIGluZm8tPnRyYWRpdGlvbmFsX2Zvcm1hdAotICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpCi0gICAgICAmJiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsICYmIGluZm8tPnN0cmlwICE9IHN0cmlwX2RlYnVnZ2VyKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3RhYiwgKnN0YWJzdHI7Ci0KLSAgICAgIHN0YWIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFiIik7Ci0gICAgICBpZiAoc3RhYiAhPSBOVUxMKQotCXsKLQkgIHN0YWJzdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFic3RyIik7Ci0KLQkgIGlmIChzdGFic3RyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotCSAgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY2RhdGE7Ci0KLQkgICAgICBzZWNkYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHN0YWIpOwotCSAgICAgIGlmIChzZWNkYXRhID09IE5VTEwpCi0JCXsKLQkJICBzdGFiLT51c2VkX2J5X2JmZCA9Ci0JCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLAotCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCQkgIGlmIChzdGFiLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc2VjZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzdGFiKTsKLQkJfQotCi0JICAgICAgdGFibGUgPSBjb2ZmX2hhc2hfdGFibGUgKGluZm8pOwotCi0JICAgICAgaWYgKCEgX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMgKGFiZmQsICZ0YWJsZS0+c3RhYl9pbmZvLAotCQkJCQkgICAgIHN0YWIsIHN0YWJzdHIsCi0JCQkJCSAgICAgJnNlY2RhdGEtPnN0YWJfaW5mbykpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBEbyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gZmluZm87Ci0gIGJvb2xlYW4gZGVidWdfbWVyZ2VfYWxsb2NhdGVkOwotICBib29sZWFuIGxvbmdfc2VjdGlvbl9uYW1lczsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby5sYXN0X2JmX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmdsb2JhbF90b19zdGF0aWMgPSBmYWxzZTsKLSAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gZmFsc2U7Ci0KLSAgY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvID0gaW5mbzsKLQotICBmaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoZmluZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQgKCZmaW5mby5kZWJ1Z19tZXJnZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IHRydWU7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMuICAqLwotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIENvdW50IHRoZSBsaW5lIG51bWJlcnMgYW5kIHJlbG9jYXRpb24gZW50cmllcyByZXF1aXJlZCBmb3IgdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9saW5lbm9fY291bnQgPSAwOwotICBtYXhfcmVsb2NfY291bnQgPSAwOwotCi0gIGxvbmdfc2VjdGlvbl9uYW1lcyA9IGZhbHNlOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JfQotCi0gICAgICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKQotCSAgJiYgc3RybGVuIChvLT5uYW1lKSA+IFNDTk5NTEVOKQotCXsKLQkgIC8qIFRoaXMgc2VjdGlvbiBoYXMgYSBsb25nIG5hbWUgd2hpY2ggbXVzdCBnbyBpbiB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgdGFibGUuICBUaGlzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgY29kZSBpbgotICAgICAgICAgICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHdoaWNoIHB1dHMgdGhlIHN0cmluZyBpbmRleAotICAgICAgICAgICAgIGludG8gdGhlIHNfbmFtZSBmaWVsZCBvZiB0aGUgc2VjdGlvbiBoZWFkZXIuICBUaGF0IGlzIHdoeQotICAgICAgICAgICAgIHdlIHBhc3MgaGFzaCBhcyBmYWxzZS4gICovCi0JICBpZiAoX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby5zdHJ0YWIsIG8tPm5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbG9uZ19zZWN0aW9uX25hbWVzID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcG9pbnRlcnMgd2UKLSAgICAgbmVlZCB0byBrZWVwLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogV2UgdXNlIHNlY3Rpb25fY291bnQgKyAxLCByYXRoZXIgdGhhbiBzZWN0aW9uX2NvdW50LCBiZWNhdXNlCi0gICAgICAgICB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkcyBhcmUgMSBiYXNlZC4gICovCi0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPQotCSgoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8gKikKLQkgYmZkX21hbGxvYyAoKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKQotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbykpKTsKLSAgICAgIGlmIChmaW5mby5zZWN0aW9uX2luZm8gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPD0gYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgPSBOVUxMOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHNpemUgb2YgdGhlIHJlbG9jcywgc28gd2UgY2FuIGRldGVybWluZSB0aGUgZmlsZQotICAgICBwb3NpdGlvbnMgb2YgdGhlIGxpbmUgbnVtYmVycy4gICovCi0gIGxpbmVfZmlsZXBvcyA9IHJlbF9maWxlcG9zOwotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKG8tPmxpbmVub19jb3VudCA9PSAwKQotCW8tPmxpbmVfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+bGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOwotCSAgbGluZV9maWxlcG9zICs9IG8tPmxpbmVub19jb3VudCAqIGxpbmVzejsKLQl9Ci0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCAhPSAwKQotCXsKLQkgIC8qIFdlIGRvbid0IGtub3cgdGhlIGluZGljZXMgb2YgZ2xvYmFsIHN5bWJvbHMgdW50aWwgd2UgaGF2ZQotICAgICAgICAgICAgIHdyaXR0ZW4gb3V0IGFsbCB0aGUgbG9jYWwgc3ltYm9scy4gIEZvciBlYWNoIHNlY3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgb3V0cHV0IGZpbGUsIHdlIGtlZXAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGFzaAotICAgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhCi0gICAgICAgICAgICAgcmVsb2MuICBXaGVuIHdlIGZpbmQgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgd2UKLSAgICAgICAgICAgICBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGNhbgotICAgICAgICAgICAgIGZpeCB1cCB0aGUgc3ltYm9sIGluZGV4IGFmdGVyIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZQotICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuCi0KLQkgICAgIEJlY2F1c2Ugb2YgdGhpcyBwcm9ibGVtLCB3ZSBhbHNvIGtlZXAgdGhlIHJlbG9jcyBpbgotCSAgICAgbWVtb3J5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIHdhc3RlcyBtZW1vcnksCi0JICAgICBidXQgb25seSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdoaWNoIGlzIG5vdCB0aGUKLQkgICAgIGNvbW1vbiBjYXNlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPQotCSAgICAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPQotCSAgICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50Ci0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9PSBOVUxMCi0JICAgICAgfHwgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID4gbWF4X291dHB1dF9yZWxvY19jb3VudCkKLQkgICAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IG8tPnJlbG9jX2NvdW50OwotCX0KLQotICAgICAgLyogUmVzZXQgdGhlIHJlbG9jIGFuZCBsaW5lbm8gY291bnRzLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0bwotCSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgfQotCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBsaW5lX2ZpbGVwb3M7Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhbiBpbnB1dCBCRkQuICBUYWtlCi0gICAgIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhciB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZHMgb2YgYWxsIHRoZQotICAgICBpbnB1dCBCRkQncy4gICovCi0gIG1heF9zeW1fY291bnQgPSAwOwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc3o7Ci0KLSAgICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICAgICAgc3ogPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKLSAgICAgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCi0JbWF4X3N5bV9jb3VudCA9IHN6OwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdXNlZCB3aGlsZSBsaW5raW5nLiAgKi8KLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOwotICBmaW5mby5zZWNfcHRycyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCQkgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gKGxvbmcgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAobG9uZykpOwotICBmaW5mby5vdXRzeW1zID0gKChiZmRfYnl0ZSAqKQotCQkgICBiZmRfbWFsbG9jICgoc2l6ZV90KSAoKG1heF9zeW1fY291bnQgKyAxKSAqIHN5bWVzeikpKTsKLSAgZmluZm8ubGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfbGluZW5vX2NvdW50Ci0JCQkJICAgICAgICogYmZkX2NvZmZfbGluZXN6IChhYmZkKSk7Ci0gIGZpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9ICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudAotCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLSAgaWYgKChmaW5mby5pbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc2VjX3B0cnMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5zeW1faW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgZmluZm8ub3V0c3ltcyA9PSBOVUxMCi0gICAgICB8fCAoZmluZm8ubGluZW5vcyA9PSBOVUxMICYmIG1heF9saW5lbm9fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLmNvbnRlbnRzID09IE5VTEwgJiYgbWF4X2NvbnRlbnRzX3NpemUgPiAwKQotICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9yZWxvY19jb3VudCA+IDApCi0gICAgICB8fCAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICYmIGZpbmZvLmludGVybmFsX3JlbG9jcyA9PSBOVUxMCi0JICAmJiBtYXhfcmVsb2NfY291bnQgPiAwKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSBub3cga25vdyB0aGUgcG9zaXRpb24gb2YgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgZXhjZXB0IHRoYXQKLSAgICAgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGVyZWZvcmUgd2UgZG9uJ3QKLSAgICAga25vdyB3aGVyZSB0aGUgc3RyaW5nIHRhYmxlIHN0YXJ0cy4gIFdlIGp1c3QgYnVpbGQgdGhlIHN0cmluZwotICAgICB0YWJsZSBpbiBtZW1vcnkgYXMgd2UgZ28gYWxvbmcuICBXZSBwcm9jZXNzIGFsbCB0aGUgcmVsb2NhdGlvbnMKLSAgICAgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9IDA7Ci0KLSAgaWYgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayAoYWJmZCwgaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgc3ViID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gKHN1YiwgJiBmaW5mbykpCi0JCXsKLQkJICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBiZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsICYgZmluZm8pKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAKLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IF9iZmRfY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgICAgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiAgV3JpdGUgaXQgb3V0IGFnYWluIGlmCi0gICAgIG5lY2Vzc2FyeS4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmICh1bnNpZ25lZCBpbnQpIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlICE9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgZG9pbmcgdGFzayBsaW5raW5nIChsZCAtLXRhc2stbGluaykgdGhlbiBtYWtlIGEgcGFzcyB0aHJvdWdoIHRoZQotICAgICBnbG9iYWwgc3ltYm9scywgd3JpdGluZyBvdXQgYW55IHRoYXQgYXJlIGRlZmluZWQsIGFuZCBtYWtpbmcgdGhlbQotICAgICBzdGF0aWMuICovCi0gIGlmIChpbmZvLT50YXNrX2xpbmspCi0gICAgewotICAgICAgZmluZm8uZmFpbGVkID0gZmFsc2U7Ci0gICAgICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscywKLQkJCSAgICAgICAoUFRSKSAmZmluZm8pOwotICAgICAgaWYgKGZpbmZvLmZhaWxlZCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0sCi0JCQkgICAoUFRSKSAmZmluZm8pOwotICBpZiAoZmluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBvdXRzeW1zIGJ1ZmZlciBpcyB1c2VkIGJ5IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLiAgKi8KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlICYmIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdwotCSB0aGUgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuCi0JIGZpbmFsbHkgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKChiZmRfYnl0ZSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeikpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGJmZF9ieXRlICplcmVsOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotCSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoKCpyZWxfaGFzaCktPmluZHggPj0gMCk7Ci0JCSAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkJfQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQkgICAgYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwIHx8IGxvbmdfc2VjdGlvbl9uYW1lcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLAotCQkgICAgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3RydGFiKSArIFNUUklOR19TSVpFX1NJWkUsCi0JCSAgICAoYmZkX2J5dGUgKikgc3RyYnVmKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0gICAgICBpZiAoYmZkX3dyaXRlIChzdHJidWYsIDEsIFNUUklOR19TSVpFX1NJWkUsIGFiZmQpICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLQotICAvKiBTZXR0aW5nIGJmZF9nZXRfc3ltY291bnQgdG8gMCB3aWxsIGNhdXNlIHdyaXRlX29iamVjdF9jb250ZW50cyB0bwotICAgICBub3QgdHJ5IHRvIHdyaXRlIG91dCB0aGUgc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGRlYnVnX21lcmdlX2FsbG9jYXRlZCkKLSAgICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSAoJmZpbmZvLmRlYnVnX21lcmdlKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogcGFyc2Ugb3V0IGEgLWhlYXAgPHJlc2VydmVkPiw8Y29tbWl0PiBsaW5lICovCi0KLXN0YXRpYyBjaGFyICoKLWRvcmVzX2NvbSAocHRyLCBvdXRwdXRfYmZkLCBoZWFwKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgaW50IGhlYXA7Ci17Ci0gIGlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKSAKLSAgICB7Ci0gICAgICBpbnQgdmFsID0gc3RydG91bCAocHRyLCAmcHRyLCAwKTsKLSAgICAgIGlmIChoZWFwKQotCXBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZIZWFwUmVzZXJ2ZSA9dmFsOwotICAgICAgZWxzZQotCXBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZTdGFja1Jlc2VydmUgPXZhbDsKLQotICAgICAgaWYgKHB0clswXSA9PSAnLCcpIAotCXsKLQkgIGludCB2YWwgPSBzdHJ0b3VsIChwdHIrMSwgJnB0ciwgMCk7Ci0JICBpZiAoaGVhcCkKLQkgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLlNpemVPZkhlYXBDb21taXQgPXZhbDsKLQkgIGVsc2UKLQkgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLlNpemVPZlN0YWNrQ29tbWl0ID12YWw7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIGNoYXIgKmdldF9uYW1lKHB0ciwgZHN0KQotY2hhciAqcHRyOwotY2hhciAqKmRzdDsKLXsKLSAgd2hpbGUgKCpwdHIgPT0gJyAnKQotICAgIHB0cisrOwotICAqZHN0ID0gcHRyOwotICB3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICcgJykKLSAgICBwdHIrKzsKLSAgKnB0ciA9IDA7Ci0gIHJldHVybiBwdHIrMTsKLX0KLQotLyogUHJvY2VzcyBhbnkgbWFnaWMgZW1iZWRkZWQgY29tbWFuZHMgaW4gYSBzZWN0aW9uIGNhbGxlZCAuZHJlY3R2ZSAqLwotCQkJCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzIChvdXRwdXRfYmZkLCBpbmZvLCAgYWJmZCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kcmVjdHZlIik7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgKmU7Ci0gIGNoYXIgKmNvcHk7Ci0gIGlmICghc2VjKSAKLSAgICByZXR1cm4gMTsKLSAgCi0gIGNvcHkgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzZWMtPl9yYXdfc2l6ZSk7Ci0gIGlmICghY29weSkgCi0gICAgcmV0dXJuIDA7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhhYmZkLCBzZWMsIGNvcHksIDAsIHNlYy0+X3Jhd19zaXplKSkgCi0gICAgewotICAgICAgZnJlZSAoY29weSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGUgPSBjb3B5ICsgc2VjLT5fcmF3X3NpemU7Ci0gIGZvciAocyA9IGNvcHk7ICBzIDwgZSA7ICkgCi0gICAgewotICAgICAgaWYgKHNbMF0hPSAnLScpIHsKLQlzKys7Ci0JY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoc3RybmNtcCAocywiLWF0dHIiLCA1KSA9PSAwKQotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICBjaGFyICphdHRyaWJzOwotCSAgYXNlY3Rpb24gKmFzZWM7Ci0KLQkgIGludCBsb29wID0gMTsKLQkgIGludCBoYWRfd3JpdGUgPSAwOwotCSAgaW50IGhhZF9yZWFkID0gMDsKLQkgIGludCBoYWRfZXhlYz0gMDsKLQkgIGludCBoYWRfc2hhcmVkPSAwOwotCSAgcyArPSA1OwotCSAgcyA9IGdldF9uYW1lKHMsICZuYW1lKTsKLQkgIHMgPSBnZXRfbmFtZShzLCAmYXR0cmlicyk7Ci0JICB3aGlsZSAobG9vcCkgewotCSAgICBzd2l0Y2ggKCphdHRyaWJzKyspIAotCSAgICAgIHsKLQkgICAgICBjYXNlICdXJzoKLQkJaGFkX3dyaXRlID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnUic6Ci0JCWhhZF9yZWFkID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnUyc6Ci0JCWhhZF9zaGFyZWQgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICdYJzoKLQkJaGFkX2V4ZWMgPSAxOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlsb29wID0gMDsKLQkgICAgICB9Ci0JICB9Ci0JICBhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGFzZWMpIHsKLQkgICAgaWYgKGhhZF9leGVjKQotCSAgICAgIGFzZWMtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICBpZiAoIWhhZF93cml0ZSkKLQkgICAgICBhc2VjLT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0JICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywiLWhlYXAiLCA1KSA9PSAwKQotCXsKLQkgIHMgPSBkb3Jlc19jb20gKHMrNSwgb3V0cHV0X2JmZCwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywiLXN0YWNrIiwgNikgPT0gMCkKLQl7Ci0JICBzID0gZG9yZXNfY29tIChzKzYsIG91dHB1dF9iZmQsIDApOwotCX0KLSAgICAgIGVsc2UgCi0JcysrOwotICAgIH0KLSAgZnJlZSAoY29weSk7Ci0gIHJldHVybiAxOwotfQotCi0vKiBQbGFjZSBhIG1hcmtlciBhZ2FpbnN0IGFsbCBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkIGJ5IHJlbG9jYXRpb25zLgotICAgVGhpcyBtYXJrZXIgY2FuIGJlIHBpY2tlZCB1cCBieSB0aGUgJ2RvIHdlIHNraXAgdGhpcyBzeW1ib2wgPycKLSAgIGxvb3AgaW4gX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKCkgYW5kIHVzZWQgdG8gcHJldmVudCBza2lwcGluZwotICAgdGhhdCBzeW1ib2wuIAotICAgKi8KLQotc3RhdGljIHZvaWQKLW1hcmtfcmVsb2NzIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKglmaW5mbzsKLSAgICAgYmZkICogCQkJCWlucHV0X2JmZDsKLXsKLSAgYXNlY3Rpb24gKiBhOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChpbnB1dF9iZmQpICYgSEFTX1NZTVMpID09IDApCi0gICAgcmV0dXJuOwotICAKLSAgZm9yIChhID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgYSAhPSAoYXNlY3Rpb24gKikgTlVMTDsgYSA9IGEtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaW50ZXJuYWxfcmVsb2NzOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaXJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqCWlyZWxlbmQ7Ci0KLSAgICAgIAotICAgICAgaWYgKChhLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCB8fCBhLT5yZWxvY19jb3VudCAgPCAxKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSByZWxvY3MuICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JKGlucHV0X2JmZCwgYSwgZmFsc2UsCi0JIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUsCi0JIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JICA/IChmaW5mby0+c2VjdGlvbl9pbmZvWyBhLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4IF0ucmVsb2NzICsgYS0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KQotCSAgOiBmaW5mby0+aW50ZXJuYWxfcmVsb2NzKQotCSk7Ci0gICAgICAKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgaXJlbCAgICAgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBpcmVsZW5kICA9IGlyZWwgKyBhLT5yZWxvY19jb3VudDsKLQotICAgICAgLyogUGxhY2UgYSBtYXJrIGluIHRoZSBzeW1faW5kaWNlcyBhcnJheSAod2hvc2UgZW50cmllcyBoYXZlCi0JIGJlZW4gaW5pdGlhbGlzZWQgdG8gMCkgZm9yIGFsbCBvZiB0aGUgc3ltYm9scyB0aGF0IGFyZSB1c2VkCi0JIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgVGhpcyB3aWxsIHRoZW4gYmUgcGlja2VkIHVwIGluIHRoZQotCSBza2lwL2Rvbid0IHBhc3MgKi8KLSAgICAgIAotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JewotCSAgZmluZm8tPnN5bV9pbmRpY2VzWyBpcmVsLT5yX3N5bW5keCBdID0gLTE7Ci0JfQotICAgIH0KLX0KLQotLyogTGluayBhbiBpbnB1dCBmaWxlIGludG8gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24KLSAgIGhhbmRsZXMgYWxsIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBuX3RtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBpbnQgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fYnRzaGZ0OwotI2lmIDAKLSAgdW5zaWduZWQgaW50IG5fYnRtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX2J0bWFzazsKLSNlbmRpZgotICBib29sZWFuICgqYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCSAgICBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkgICAgYm9vbGVhbiAqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBzeW1lbnRfYmFzZTsKLSAgYm9vbGVhbiBjb3B5LCBoYXNoOwotICBiZmRfc2l6ZV90eXBlIGlzeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgb3N5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICBhc2VjdGlvbiAqKnNlY3BwOwotICBsb25nICppbmRleHA7Ci0gIHVuc2lnbmVkIGxvbmcgb3V0cHV0X2luZGV4OwotICBiZmRfYnl0ZSAqb3V0c3ltOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgLyogTW92ZSBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN0cmluZ3MgPSBOVUxMOwotICBzeW1lbnRfYmFzZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgaXN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgb3N5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoaW5wdXRfYmZkKTsKLSAgQkZEX0FTU0VSVCAobGluZXN6ID09IGJmZF9jb2ZmX2xpbmVzeiAob3V0cHV0X2JmZCkpOwotCi0gIGNvcHkgPSBmYWxzZTsKLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSB0cnVlOwotICBoYXNoID0gdHJ1ZTsKLSAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgaGFzaCA9IGZhbHNlOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIHNlY3BwID0gZmluZm8tPnNlY19wdHJzOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIG91dHB1dF9pbmRleCA9IHN5bWVudF9iYXNlOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLQotICBpZiAoY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0gICAgewotICAgICAgaWYgKCEgcHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gcGVyZm9ybSByZWxvY2F0aW9ucyBhbmQgYWxzbyBzdHJpcC9kaXNjYXJkIHNvbWUgc3ltYm9scwotICAgICB0aGVuIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHN0cmlwL2Rpc2NhcmQgdGhvc2Ugc3ltYm9scyB0aGF0IGFyZQotICAgICBnb2luZyB0byBiZSBpbnZvbHZlZCBpbiB0aGUgcmVsb2NhdGlvbnMgKi8KLSAgaWYgKCggICBmaW5mby0+aW5mby0+c3RyaXAgICAhPSBzdHJpcF9ub25lCi0gICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgIT0gZGlzY2FyZF9ub25lKQotICAgICAgJiYgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBtYXJrIHRoZSBzeW1ib2wgYXJyYXkgYXMgJ25vdC11c2VkJyAqLwotICAgICAgbWVtc2V0IChpbmRleHAsIDAsIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogc2l6ZW9mICogaW5kZXhwKTsgCi0gICAgICAgCi0gICAgICBtYXJrX3JlbG9jcyAoZmluZm8sIGlucHV0X2JmZCk7Ci0gICAgfQotCi0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICAgICAgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbjsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICAgYm9vbGVhbiBkb250X3NraXBfc3ltYm9sOwotICAgICAgaW50IGFkZDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgKFBUUikgaXN5bXApOwotCi0gICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgotCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KLQkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCi0JIHRoZSBzeW1ib2wuICAqLwotICAgICAgaXN5bSA9ICppc3ltcDsKLQotICAgICAgY2xhc3NpZmljYXRpb24gPSBiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wgKGlucHV0X2JmZCwgJmlzeW0pOwotICAgICAgc3dpdGNoIChjbGFzc2lmaWNhdGlvbikKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgQ09GRl9TWU1CT0xfR0xPQkFMOgotCWNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQljYXNlIENPRkZfU1lNQk9MX0xPQ0FMOgotCSAgKnNlY3BwID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChpbnB1dF9iZmQsIGlzeW0ubl9zY251bSk7Ci0JICBicmVhazsKLQljYXNlIENPRkZfU1lNQk9MX0NPTU1PTjoKLQkgICpzZWNwcCA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIENPRkZfU1lNQk9MX1VOREVGSU5FRDoKLQkgICpzZWNwcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEV4dHJhY3QgdGhlIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN5bWJvbCBpcyB1c2VkIGJ5IGEKLSAgICAgICAgIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQotCSAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkICE9IGRpc2NhcmRfbm9uZSkKLQkgICYmIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JZG9udF9za2lwX3N5bWJvbCA9ICppbmRleHA7Ci0gICAgICBlbHNlCi0JZG9udF9za2lwX3N5bWJvbCA9IGZhbHNlOwotICAgICAgCi0gICAgICAqaW5kZXhwID0gLTE7Ci0KLSAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgIGdsb2JhbCA9IGZhbHNlOwotICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcgYWxsIHN5bWJvbHMsIHdlIHdhbnQgdG8gc2tpcCB0aGlzIG9uZS4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCAmJiAhIGRvbnRfc2tpcF9zeW1ib2wpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIGlmICghIHNraXApCi0JewotCSAgc3dpdGNoIChjbGFzc2lmaWNhdGlvbikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIENPRkZfU1lNQk9MX0dMT0JBTDoKLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9DT01NT046Ci0JICAgIGNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gIEdsb2JhbCBzeW1ib2xzIGNvbWUgYXQgdGhlCi0JCSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSwgc28gc2tpcCB0aGVtIGZvciBub3cuCi0JCSBMb2NhbGx5IGRlZmluZWQgZnVuY3Rpb24gc3ltYm9scywgaG93ZXZlciwgYXJlIGFuCi0JCSBleGNlcHRpb24sIGFuZCBhcmUgbm90IG1vdmVkIHRvIHRoZSBlbmQuICAqLwotCSAgICAgIGdsb2JhbCA9IHRydWU7Ci0JICAgICAgaWYgKCEgSVNGQ04gKGlzeW0ubl90eXBlKSkKLQkJc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9VTkRFRklORUQ6Ci0JICAgICAgLyogVW5kZWZpbmVkIHN5bWJvbHMgYXJlIGxlZnQgZm9yIHRoZSBlbmQuICAqLwotCSAgICAgIGdsb2JhbCA9IHRydWU7Ci0JICAgICAgc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9MT0NBTDoKLQkgICAgICAvKiBUaGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgU2tpcCBpdCBpZiB3ZSBhcmUgZGlzY2FyZGluZwotICAgICAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLiAgKi8KLQkgICAgICBpZiAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwgJiYgISBkb250X3NraXBfc3ltYm9sKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2Ugc3RyaXBwaW5nIGRlYnVnZ2luZyBzeW1ib2xzLCBhbmQgdGhpcyBpcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCB0aGVuIHNraXAgaXQuICBGSVhNRTogZ2FzIHNldHMgdGhlIHNlY3Rpb24gdG8gTl9BQlMKLSAgICAgICAgIGZvciBzb21lIHR5cGVzIG9mIGRlYnVnZ2luZyBzeW1ib2xzOyBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgICAgICAgYSBidWcgb3Igbm90LiAgSW4gYW55IGNhc2UsIHdlIGhhbmRsZSBpdCBoZXJlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcgotCSAgJiYgISBkb250X3NraXBfc3ltYm9sCi0JICAmJiAoaXN5bS5uX3NjbnVtID09IE5fREVCVUcKLQkgICAgICB8fCAoaXN5bS5uX3NjbnVtID09IE5fQUJTCi0JCSAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19BVVRPCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19SRUcKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX01PUwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfTU9FCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19NT1UKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0FSRwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfUkVHUEFSTQotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRklFTEQKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0VPUykpKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgc29tZSBzeW1ib2xzIGFyZSBzdHJpcHBlZCBiYXNlZCBvbiB0aGUgbmFtZSwgd29yayBvdXQgdGhlCi0JIG5hbWUgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHNraXAgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZG9udF9za2lwX3N5bWJvbAotCSAgICAgICYmICgoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkJICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsCi0JCQkJICAgIGZhbHNlKSA9PSBOVUxMKSkKLQkJICAgfHwgKCEgZ2xvYmFsCi0JCSAgICAgICAmJiBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkJICAgICAgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkpCi0JICAgIHNraXAgPSB0cnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBlbnVtLCBzdHJ1Y3QsIG9yIHVuaW9uIHRhZywgc2VlIGlmIHdlIGhhdmUKLSAgICAgICAgIGFscmVhZHkgb3V0cHV0IGFuIGlkZW50aWNhbCB0eXBlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIChmaW5mby0+b3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSA9PSAwCi0JICAmJiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VOVEFHCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1NUUlRBRwotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19VTlRBRykKLQkgICYmIGlzeW0ubl9udW1hdXggPT0gMSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKm1oOwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbXQ7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqKmVwcDsKLQkgIGJmZF9ieXRlICplc2wsICplc2xlbmQ7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc2xwOwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBJZ25vcmUgZmFrZSBuYW1lcyBpbnZlbnRlZCBieSBjb21waWxlcjsgdHJlYXQgdGhlbSBhbGwgYXMKLSAgICAgICAgICAgICB0aGUgc2FtZSBuYW1lLiAgKi8KLQkgIGlmICgqbmFtZSA9PSAnficgfHwgKm5hbWUgPT0gJy4nIHx8ICpuYW1lID09ICckJwotCSAgICAgIHx8ICgqbmFtZSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGlucHV0X2JmZCkKLQkJICAmJiAobmFtZVsxXSA9PSAnficgfHwgbmFtZVsxXSA9PSAnLicgfHwgbmFtZVsxXSA9PSAnJCcpKSkKLQkgICAgbmFtZSA9ICIiOwotCi0JICBtaCA9IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAgKCZmaW5mby0+ZGVidWdfbWVyZ2UsIG5hbWUsCi0JCQkJCSAgICAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAobWggPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0eXBlIGluZm9ybWF0aW9uLiAgSWYgdGhpcyB0dXJucwotICAgICAgICAgICAgIG91dCB0byBiZSBhIGR1cGxpY2F0ZSwgd2UgcGFzcyB0aGlzIGFkZHJlc3MgdG8KLSAgICAgICAgICAgICBiZmRfcmVsZWFzZS4gICovCi0JICBtdCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqKQotCQliZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCSAgIHNpemVvZiAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSkpKTsKLQkgIGlmIChtdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBtdC0+Y2xhc3MgPSBpc3ltLm5fc2NsYXNzOwotCi0JICAvKiBQaWNrIHVwIHRoZSBhdXggZW50cnksIHdoaWNoIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSB0YWcKLSAgICAgICAgICAgICBlbnRyaWVzLiAgKi8KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIChlc3ltICsgaXN5bWVzeiksCi0JCQkJaXN5bS5uX3R5cGUsIGlzeW0ubl9zY2xhc3MsIDAsIGlzeW0ubl9udW1hdXgsCi0JCQkJKFBUUikgJmF1eCk7Ci0KLQkgIC8qIEdhdGhlciB0aGUgZWxlbWVudHMuICAqLwotCSAgZXBwID0gJm10LT5lbGVtZW50czsKLQkgIG10LT5lbGVtZW50cyA9IE5VTEw7Ci0JICBpc2xwID0gaXN5bXAgKyAyOwotCSAgZXNsID0gZXN5bSArIDIgKiBpc3ltZXN6OwotCSAgZXNsZW5kID0gKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpCi0JCSAgICArIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sICogaXN5bWVzeik7Ci0JICB3aGlsZSAoZXNsIDwgZXNsZW5kKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqZWxlbmFtZTsKLQkgICAgICBjaGFyIGVsZWJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICAgIGNoYXIgKm5hbWVfY29weTsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzbCwgKFBUUikgaXNscCk7Ci0KLQkgICAgICAqZXBwID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICopCi0JCSAgICAgIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJCSBzaXplb2YgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQpKSk7Ci0JICAgICAgaWYgKCplcHAgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZWxlbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBpc2xwLAotCQkJCQkJCWVsZWJ1Zik7Ci0JICAgICAgaWYgKGVsZW5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgbmFtZV9jb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgIHN0cmxlbiAoZWxlbmFtZSkgKyAxKTsKLQkgICAgICBpZiAobmFtZV9jb3B5ID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzdHJjcHkgKG5hbWVfY29weSwgZWxlbmFtZSk7Ci0KLQkgICAgICAoKmVwcCktPm5hbWUgPSBuYW1lX2NvcHk7Ci0JICAgICAgKCplcHApLT50eXBlID0gaXNscC0+bl90eXBlOwotCSAgICAgICgqZXBwKS0+dGFnbmR4ID0gMDsKLQkgICAgICBpZiAoaXNscC0+bl9udW1hdXggPj0gMQotCQkgICYmIGlzbHAtPm5fdHlwZSAhPSBUX05VTEwKLQkJICAmJiBpc2xwLT5uX3NjbGFzcyAhPSBDX0VPUykKLQkJewotCQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBlbGVhdXg7Ci0JCSAgbG9uZyBpbmR4OwotCi0JCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgKGVzbCArIGlzeW1lc3opLAotCQkJCQlpc2xwLT5uX3R5cGUsIGlzbHAtPm5fc2NsYXNzLCAwLAotCQkJCQlpc2xwLT5uX251bWF1eCwgKFBUUikgJmVsZWF1eCk7Ci0JCSAgaW5keCA9IGVsZWF1eC54X3N5bS54X3RhZ25keC5sOwotCi0JCSAgLyogRklYTUU6IElmIHRoaXMgdGFnbmR4IGVudHJ5IHJlZmVycyB0byBhIHN5bWJvbAotCQkgICAgIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlLCB3ZSBqdXN0IGlnbm9yZSBpdC4KLQkJICAgICBIYW5kbGluZyB0aGlzIGNvcnJlY3RseSB3b3VsZCBiZSB0ZWRpb3VzLCBhbmQgbWF5Ci0JCSAgICAgbm90IGJlIHJlcXVpcmVkLiAgKi8KLQotCQkgIGlmIChpbmR4ID4gMAotCQkgICAgICAmJiAoaW5keAotCQkJICA8ICgoZXN5bSAtCi0JCQkgICAgICAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJCSAgICAgLyAobG9uZykgaXN5bWVzeikpKQotCQkgICAgewotCQkgICAgICAoKmVwcCktPnRhZ25keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICAgICAgaWYgKCgqZXBwKS0+dGFnbmR4IDwgMCkKLQkJCSgqZXBwKS0+dGFnbmR4ID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVwcCA9ICYoKmVwcCktPm5leHQ7Ci0JICAgICAgKmVwcCA9IE5VTEw7Ci0KLQkgICAgICBlc2wgKz0gKGlzbHAtPm5fbnVtYXV4ICsgMSkgKiBpc3ltZXN6OwotCSAgICAgIGlzbHAgKz0gaXNscC0+bl9udW1hdXggKyAxOwotCSAgICB9Ci0KLQkgIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uIHdoaWNoIG1hdGNoZXMgdGhpcwotICAgICAgICAgICAgIHR5cGUuICBXZSBhbHdheXMgb3V0cHV0IHRoZSB0eXBlIGlmIGl0IGhhcyBubyBlbGVtZW50cywKLSAgICAgICAgICAgICBmb3Igc2ltcGxpY2l0eS4gICovCi0JICBpZiAobXQtPmVsZW1lbnRzID09IE5VTEwpCi0JICAgIGJmZF9yZWxlYXNlIChpbnB1dF9iZmQsIChQVFIpIG10KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKm10bDsKLQotCSAgICAgIGZvciAobXRsID0gbWgtPnR5cGVzOyBtdGwgIT0gTlVMTDsgbXRsID0gbXRsLT5uZXh0KQotCQl7Ci0JCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbWUsICptZWw7Ci0KLQkJICBpZiAobXRsLT5jbGFzcyAhPSBtdC0+Y2xhc3MpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGZvciAobWUgPSBtdC0+ZWxlbWVudHMsIG1lbCA9IG10bC0+ZWxlbWVudHM7Ci0JCSAgICAgICBtZSAhPSBOVUxMICYmIG1lbCAhPSBOVUxMOwotCQkgICAgICAgbWUgPSBtZS0+bmV4dCwgbWVsID0gbWVsLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoc3RyY21wIChtZS0+bmFtZSwgbWVsLT5uYW1lKSAhPSAwCi0JCQkgIHx8IG1lLT50eXBlICE9IG1lbC0+dHlwZQotCQkJICB8fCBtZS0+dGFnbmR4ICE9IG1lbC0+dGFnbmR4KQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBpZiAobWUgPT0gTlVMTCAmJiBtZWwgPT0gTlVMTCkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAobXRsID09IE5VTEwgfHwgKGJmZF9zaXplX3R5cGUpIG10bC0+aW5keCA+PSBzeW1lbnRfYmFzZSkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IGRlZmluaXRpb24gb2YgdGhpcyB0eXBlLiAgKi8KLQkJICBtdC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkJICBtdC0+bmV4dCA9IG1oLT50eXBlczsKLQkJICBtaC0+dHlwZXMgPSBtdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWRlZmluaXRpb24gd2hpY2ggY2FuIGJlIG1lcmdlZC4gICovCi0JCSAgYmZkX3JlbGVhc2UgKGlucHV0X2JmZCwgKFBUUikgbXQpOwotCQkgICppbmRleHAgPSBtdGwtPmluZHg7Ci0JCSAgYWRkID0gKGVzbGVuZCAtIGVzeW0pIC8gaXN5bWVzejsKLQkJICBza2lwID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBub3cga25vdyB3aGV0aGVyIHdlIGFyZSB0byBza2lwIHRoaXMgc3ltYm9sIG9yIG5vdC4gICovCi0gICAgICBpZiAoISBza2lwKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIGluIG9yZGVyIHRvIG91dHB1dCBpdC4gICovCi0KLQkgIGlmIChpc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKLQkgICAgICAmJiBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIGxvbmcgbmFtZS4gIEVudGVyIGl0IGluIHRoZSBzdHJpbmcKLQkJIHRhYmxlIHdlIGFyZSBidWlsZGluZy4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgY2hlY2sKLQkJIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcuICBUaGF0IGlzIG9ubHkgdHJ1ZSBmb3IKLQkJIFhDT0ZGLCBhbmQgWENPRkYgcmVxdWlyZXMgZGlmZmVyZW50IGxpbmtpbmcgY29kZQotCQkgYW55aG93LiAgKi8KLQkgICAgICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLAotCQkJCQkJICAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgbmFtZSwgaGFzaCwgY29weSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoaXN5bS5uX3NjbGFzcykKLQkgICAgewotCSAgICBjYXNlIENfQVVUTzoKLQkgICAgY2FzZSBDX01PUzoKLQkgICAgY2FzZSBDX0VPUzoKLQkgICAgY2FzZSBDX01PRToKLQkgICAgY2FzZSBDX01PVToKLQkgICAgY2FzZSBDX1VOVEFHOgotCSAgICBjYXNlIENfU1RSVEFHOgotCSAgICBjYXNlIENfRU5UQUc6Ci0JICAgIGNhc2UgQ19UUERFRjoKLQkgICAgY2FzZSBDX0FSRzoKLQkgICAgY2FzZSBDX1VTVEFUSUM6Ci0JICAgIGNhc2UgQ19SRUc6Ci0JICAgIGNhc2UgQ19SRUdQQVJNOgotCSAgICBjYXNlIENfRklFTEQ6Ci0JICAgICAgLyogVGhlIHN5bWJvbCB2YWx1ZSBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiAgKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfRkNOOgotCSAgICAgIGlmIChvYmpfcGUgKGlucHV0X2JmZCkKLQkJICAmJiBzdHJjbXAgKGlzeW0ubl9uYW1lLCAiLmJmIikgIT0gMAotCQkgICYmIGlzeW0ubl9zY251bSA+IDApCi0JCXsKLQkJICAvKiBGb3IgUEUsIC5sZiBhbmQgLmVmIGdldCB0aGVpciB2YWx1ZSBsZWZ0IGFsb25lLAotCQkgICAgIHdoaWxlIC5iZiBnZXRzIHJlbG9jYXRlZC4gIEhvd2V2ZXIsIHRoZXkgYWxsIGhhdmUKLQkJICAgICAicmVhbCIgc2VjdGlvbiBudW1iZXJzLCBhbmQgbmVlZCB0byBiZSBtb3ZlZCBpbnRvCi0JCSAgICAgdGhlIG5ldyBzZWN0aW9uLiAgKi8KLQkJICBpc3ltLm5fc2NudW0gPSAoKnNlY3BwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgQ19MQUJFTDogIC8qIE5vdCBjb21wbGV0ZWx5IHN1cmUgYWJvdXQgdGhlc2UgMiAqLwotCSAgICBjYXNlIENfRVhUREVGOgotCSAgICBjYXNlIENfQkxPQ0s6Ci0JICAgIGNhc2UgQ19FRkNOOgotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgY2FzZSBDX0VYVDoKLQkgICAgY2FzZSBDX1NUQVQ6Ci0JICAgIGNhc2UgQ19TRUNUSU9OOgotCSAgICBjYXNlIENfTlRfV0VBSzoKLQkgICAgICAvKiBDb21wdXRlIG5ldyBzeW1ib2wgbG9jYXRpb24uICAqLwotCSAgICBpZiAoaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgICB7Ci0JCWlzeW0ubl9zY251bSA9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQlpc3ltLm5fdmFsdWUgKz0gKCpzZWNwcCktPm91dHB1dF9vZmZzZXQ7Ci0JCWlmICghIG9ial9wZSAoaW5wdXRfYmZkKSkKLQkJICBpc3ltLm5fdmFsdWUgLT0gKCpzZWNwcCktPnZtYTsKLQkJaWYgKCEgb2JqX3BlIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JCSAgaXN5bS5uX3ZhbHVlICs9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0ZJTEU6Ci0JICAgICAgLyogVGhlIHZhbHVlIG9mIGEgQ19GSUxFIHN5bWJvbCBpcyB0aGUgc3ltYm9sIGluZGV4IG9mCi0JCSB0aGUgbmV4dCBDX0ZJTEUgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotCQkgc3ltYm9sIGlzIHRoZSBzeW1ib2wgaW5kZXggdG8gdGhlIGZpcnN0IGV4dGVybmFsCi0JCSBzeW1ib2wgKGFjdHVhbGx5LCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgZG9lcyBub3QgZ2V0Ci0JCSB0aGlzIHJpZ2h0LS1pdCBqdXN0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotCQkgc3ltYm9sIHRvIHplcm8tLWFuZCBub2JvZHkgaGFzIGV2ZXIgY29tcGxhaW5lZCBhYm91dAotCQkgaXQpLiAgV2UgdHJ5IHRvIGdldCB0aGlzIHJpZ2h0LCBiZWxvdywganVzdCBiZWZvcmUgd2UKLQkJIHdyaXRlIHRoZSBzeW1ib2xzIG91dCwgYnV0IGluIHRoZSBnZW5lcmFsIGNhc2Ugd2UgbWF5Ci0JCSBoYXZlIHRvIHdyaXRlIHRoZSBzeW1ib2wgb3V0IHR3aWNlLiAgKi8KLQotCSAgICAgIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0JCSAgJiYgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlICE9IChsb25nKSBvdXRwdXRfaW5kZXgpCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNvcnJlY3QgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotICAgICAgICAgICAgICAgICAgICAgZW50cnkuICAqLwotCQkgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLQkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dCBmaWxlLiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4Ci0JCQkJCQkJLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QgQ19GSUxFCi0JCQkgc3ltYm9sLiAgV2UgbmVlZCB0byB3cml0ZSBpdCBvdXQgYWdhaW4uICBXZQotCQkJIGJvcnJvdyAqb3V0c3ltIHRlbXBvcmFyaWx5LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCQkgICAgICsgZmluZm8tPmxhc3RfZmlsZV9pbmRleCAqIG9zeW1lc3opLAotCQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkJICB8fCAoYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsIG91dHB1dF9iZmQpCi0JCQkgICAgICAhPSBvc3ltZXN6KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA9IG91dHB1dF9pbmRleDsKLQkgICAgICBmaW5mby0+bGFzdF9maWxlID0gaXN5bTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQgbm9ybWFsIGdsb2JhbCBmdW5jdGlvbiBzeW1ib2xzIHRvCi0JICAgICBzdGF0aWMgZnVuY3Rpb25zLiAqLwotCi0JICBpZiAoZmluZm8tPmluZm8tPnRhc2tfbGluawotCSAgICAgICYmIChpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JCSAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKLQkJICB8fCAob2JqX3BlIChpbnB1dF9iZmQpICYmIGlzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKSkpCi0JICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0KLQkgIC8qIE91dHB1dCB0aGUgc3ltYm9sLiAgKi8KLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLQotCSAgKmluZGV4cCA9IG91dHB1dF9pbmRleDsKLQotCSAgaWYgKGdsb2JhbCkKLQkgICAgewotCSAgICAgIGxvbmcgaW5keDsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpbmR4ID0gKChlc3ltIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCi0JCSAgICAgIC8gaXN5bWVzeik7Ci0JICAgICAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSB3ZXJlIGVycm9ycyBlYXJsaWVyIGluCi0gICAgICAgICAgICAgICAgICAgICB0aGUgbGluay4gICovCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaC0+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+c3RyaXAgPT0gc3RyaXBfc29tZSkKLSAgICB7Ci0gICAgICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgYmZkX2J5dGUgKmVsaW5lOwotCSAgYmZkX2J5dGUgKmVsaW5lZW5kOwotCSAgYmZkX2J5dGUgKm9lbGluZTsKLQkgIGJvb2xlYW4gc2tpcHBpbmc7Ci0KLQkgIC8qIEZJWE1FOiBJZiBTRUNfSEFTX0NPTlRFTlRTIGlzIG5vdCBmb3IgdGhlIHNlY3Rpb24sIHRoZW4KLQkgICAgIGJ1aWxkX2xpbmtfb3JkZXIgaW4gbGR3cml0ZS5jIHdpbGwgbm90IGhhdmUgY3JlYXRlZCBhCi0JICAgICBsaW5rIG9yZGVyLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgbm90IGhhdmUgc2VlbiB0aGlzCi0JICAgICBpbnB1dCBzZWN0aW9uIGluIF9iZmRfY29mZl9maW5hbF9saW5rLCB3aGljaCBtZWFucyB0aGF0Ci0JICAgICB3ZSB3aWxsIG5vdCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIGxpbmUgbnVtYmVycyBvZgotCSAgICAgdGhpcyBzZWN0aW9uLiAgSSBkb24ndCB0aGluayBsaW5lIG51bWJlcnMgY2FuIGJlCi0JICAgICBtZWFuaW5nZnVsIGZvciBhIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgaGF2ZQotCSAgICAgU0VDX0hBU19DT05URU5UUyBzZXQsIGJ1dCwgaWYgdGhleSBkbywgdGhpcyBtdXN0IGJlCi0JICAgICBjaGFuZ2VkLiAgKi8KLQkgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMAotCSAgICAgIHx8IChvLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LAotCQkJICAgaW5wdXRfYmZkKSAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7Ci0JICBlbGluZSA9IGZpbmZvLT5saW5lbm9zOwotCSAgb2VsaW5lID0gZmluZm8tPmxpbmVub3M7Ci0JICBlbGluZWVuZCA9IGVsaW5lICsgbGluZXN6ICogby0+bGluZW5vX2NvdW50OwotCSAgc2tpcHBpbmcgPSBmYWxzZTsKLQkgIGZvciAoOyBlbGluZSA8IGVsaW5lZW5kOyBlbGluZSArPSBsaW5lc3opCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGlsaW5lOwotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwgKFBUUikgZWxpbmUsIChQVFIpICZpbGluZSk7Ci0KLQkgICAgICBpZiAoaWxpbmUubF9sbm5vICE9IDApCi0JCWlsaW5lLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKLQkgICAgICBlbHNlIGlmIChpbGluZS5sX2FkZHIubF9zeW1uZHggPj0gMAotCQkgICAgICAgJiYgKCh1bnNpZ25lZCBsb25nKSBpbGluZS5sX2FkZHIubF9zeW1uZHgKLQkJCSAgIDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpKQotCQl7Ci0JCSAgbG9uZyBpbmR4OwotCi0JCSAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbGluZS5sX2FkZHIubF9zeW1uZHhdOwotCi0JCSAgaWYgKGluZHggPCAwKQotCQkgICAgewotCQkgICAgICAvKiBUaGVzZSBsaW5lIG51bWJlcnMgYXJlIGF0dGFjaGVkIHRvIGEgc3ltYm9sCi0JCQkgd2hpY2ggd2UgYXJlIHN0cmlwcGluZy4gIFdlIG11c3QgZGlzY2FyZCB0aGUKLQkJCSBsaW5lIG51bWJlcnMgYmVjYXVzZSByZWFkaW5nIHRoZW0gYmFjayB3aXRoCi0JCQkgbm8gYXNzb2NpYXRlZCBzeW1ib2wgKG9yIGFzc29jaWF0aW5nIHRoZW0gYWxsCi0JCQkgd2l0aCBzeW1ib2wgIzApIHdpbGwgZmFpbC4gIFdlIGNhbid0IHJlZ2FpbgotCQkJIHRoZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUsIGJ1dCBhdCBsZWFzdAotCQkJIHRoZXkncmUgZGVuc2UuICAqLwotCQkgICAgICBza2lwcGluZyA9IHRydWU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzOwotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgaWE7Ci0KLQkJICAgICAgLyogRml4IHVwIHRoZSBsbm5vcHRyIGZpZWxkIGluIHRoZSBhdXggZW50cnkgb2YKLQkJCSB0aGUgc3ltYm9sLiAgSXQgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QgZG8KLQkJCSB0aGlzIHdoZW4gd2UgbW9kaWZ5IHRoZSBzeW1ib2wgYXV4IGVudHJpZXMsCi0JCQkgYmVjYXVzZSBnYXMgc29tZXRpbWVzIHNjcmV3cyB1cCB0aGUgbG5ub3B0cgotCQkJIGZpZWxkIGFuZCBtYWtlcyBpdCBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQKLQkJCSBvZiB0aGUgbGluZSBudW1iZXJzIHJhdGhlciB0aGFuIGFuIGFic29sdXRlCi0JCQkgZmlsZSBpbmRleC4gICovCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLAotCQkJCQkgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCQkgICArICgoaW5keCAtIHN5bWVudF9iYXNlKQotCQkJCQkJICAgICAgKiBvc3ltZXN6KSksCi0JCQkJCSAgICAoUFRSKSAmaXMpOwotCQkgICAgICBpZiAoKElTRkNOIChpcy5uX3R5cGUpCi0JCQkgICB8fCBpcy5uX3NjbGFzcyA9PSBDX0JMT0NLKQotCQkJICAmJiBpcy5uX251bWF1eCA+PSAxKQotCQkJewotCQkJICBQVFIgYXV4cHRyOwotCi0JCQkgIGF1eHB0ciA9IChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkgICsgKChpbmR4IC0gc3ltZW50X2Jhc2UgKyAxKQotCQkJCQkgICAgICogb3N5bWVzeikpOwotCQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAob3V0cHV0X2JmZCwgYXV4cHRyLAotCQkJCQkJaXMubl90eXBlLCBpcy5uX3NjbGFzcywKLQkJCQkJCTAsIGlzLm5fbnVtYXV4LCAoUFRSKSAmaWEpOwotCQkJICBpYS54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPQotCQkJICAgIChvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudCAqIGxpbmVzegotCQkJICAgICArIGVsaW5lIC0gZmluZm8tPmxpbmVub3MpOwotCQkJICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpYSwKLQkJCQkJCSBpcy5uX3R5cGUsIGlzLm5fc2NsYXNzLCAwLAotCQkJCQkJIGlzLm5fbnVtYXV4LCBhdXhwdHIpOwotCQkJfQotCi0JCQlza2lwcGluZyA9IGZhbHNlOwotCQkgICAgfQotCi0JCSAgaWxpbmUubF9hZGRyLmxfc3ltbmR4ID0gaW5keDsKLQkJfQotCi0JICAgICAgaWYgKCFza2lwcGluZykKLQkgICAgICAgIHsKLQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpbGluZSwKLQkJCQkJICAgIChQVFIpIG9lbGluZSk7Ci0JCSAgb2VsaW5lICs9IGxpbmVzejsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCShvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KSwKLQkJCVNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF93cml0ZSAoZmluZm8tPmxpbmVub3MsIDEsIG9lbGluZSAtIGZpbmZvLT5saW5lbm9zLAotCQkJICAgICBvdXRwdXRfYmZkKQotCQkgICE9IChiZmRfc2l6ZV90eXBlKSAob2VsaW5lIC0gZmluZm8tPmxpbmVub3MpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICs9Ci0JICAgIChvZWxpbmUgLSBmaW5mby0+bGluZW5vcykgLyBsaW5lc3o7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBzd2FwcGVkIG91dCBhIENfRklMRSBzeW1ib2wsIGd1ZXNzIHRoYXQgdGhlIG5leHQgQ19GSUxFCi0gICAgIHN5bWJvbCB3aWxsIGJlIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG5leHQgaW5wdXQgZmlsZS4gIEluIHRoZQotICAgICBub3JtYWwgY2FzZSwgdGhpcyB3aWxsIHNhdmUgdXMgZnJvbSB3cml0aW5nIG91dCB0aGUgQ19GSUxFIHN5bWJvbAotICAgICBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLSAgICB7Ci0gICAgICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLSAJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4IC0gc3ltZW50X2Jhc2UpCi0gCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0gICAgfQotCi0gIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0c3ltcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICBvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpICsgc3ltZW50X2Jhc2UgKiBvc3ltZXN6LAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCW91dHB1dF9iZmQpCi0JICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgQkZEX0FTU0VSVCAoKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkgICArIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBvc3ltZXN6KQotCQkgID09IG91dHB1dF9pbmRleCk7Ci0KLSAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSA9IG91dHB1dF9pbmRleDsKLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc2VjdGlvbi4gICovCi0gIGFkanVzdF9zeW1uZHggPSBjb2ZmX2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+X2JmZF9jb2ZmX2FkanVzdF9zeW1uZHg7Ci0gIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICAgc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjZGF0YTsKLQotICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgKG8tPl9yYXdfc2l6ZSA9PSAwICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkpCi0JewotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgICAgICYmIG8tPnJlbG9jX2NvdW50ICE9IDApCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NzIGluIHNlY3Rpb24gYCVzJywgYnV0IGl0IGhhcyBubyBjb250ZW50cyIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQliZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBvKSkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgc2VjZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pOwotICAgICAgaWYgKHNlY2RhdGEgIT0gTlVMTCAmJiBzZWNkYXRhLT5jb250ZW50cyAhPSBOVUxMKQotCWNvbnRlbnRzID0gc2VjZGF0YS0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIG8sIGZpbmZvLT5jb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIG8tPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGNvbnRlbnRzID0gZmluZm8tPmNvbnRlbnRzOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBpbnQgdGFyZ2V0X2luZGV4OwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcy4gICovCi0JICB0YXJnZXRfaW5kZXggPSBvLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkJICAgICAoaW5wdXRfYmZkLCBvLCBmYWxzZSwgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkJCSAgICAgIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUsCi0JCQkgICAgICAoZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCQkJICAgICAgID8gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkJCQkgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KQotCQkJICAgICAgIDogZmluZm8tPmludGVybmFsX3JlbG9jcykpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBDYWxsIHByb2Nlc3NvciBzcGVjaWZpYyBjb2RlIHRvIHJlbG9jYXRlIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgY29udGVudHMuICAqLwotCSAgaWYgKCEgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSAgIGlucHV0X2JmZCwgbywKLQkJCQkJICAgY29udGVudHMsCi0JCQkJCSAgIGludGVybmFsX3JlbG9jcywKLQkJCQkJICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJCSAgIGZpbmZvLT5zZWNfcHRycykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZnNldDsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0KLQkgICAgICBvZmZzZXQgPSBvLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgby0+b3V0cHV0X29mZnNldCAtIG8tPnZtYTsKLQkgICAgICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgcmVsX2hhc2ggPSAoZmluZm8tPnNlY3Rpb25faW5mb1t0YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMKLQkJCSAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrKQotCQl7Ci0JCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCQkgIGJvb2xlYW4gYWRqdXN0ZWQ7Ci0KLQkJICAqcmVsX2hhc2ggPSBOVUxMOwotCi0JCSAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLwotCi0JCSAgaXJlbC0+cl92YWRkciArPSBvZmZzZXQ7Ci0KLQkJICBpZiAoaXJlbC0+cl9zeW1uZHggPT0gLTEpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChhZGp1c3Rfc3ltbmR4KQotCQkgICAgewotCQkgICAgICBpZiAoISAoKmFkanVzdF9zeW1uZHgpIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJICAgICAgaW5wdXRfYmZkLCBvLCBpcmVsLAotCQkJCQkgICAgICAmYWRqdXN0ZWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoYWRqdXN0ZWQpCi0JCQljb250aW51ZTsKLQkJICAgIH0KLQotCQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lyZWwtPnJfc3ltbmR4XTsKLQkJICBpZiAoaCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gICovCi0JCSAgICAgIGlmIChoLT5pbmR4ID49IDApCi0JCQlpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogVGhpcyBzeW1ib2wgaXMgYmVpbmcgd3JpdHRlbiBhdCB0aGUgZW5kCi0JCQkgICAgIG9mIHRoZSBmaWxlLCBhbmQgd2UgZG8gbm90IHlldCBrbm93IHRoZQotCQkJICAgICBzeW1ib2wgaW5kZXguICBXZSBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZQotCQkJICAgICBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZSByZWxfaGFzaCBsaXN0LgotCQkJICAgICBXZSBzZXQgdGhlIGluZHggZmllbGQgdG8gLTIgdG8gaW5kaWNhdGUKLQkJCSAgICAgdGhhdCB0aGlzIHN5bWJvbCBtdXN0IG5vdCBiZSBzdHJpcHBlZC4gICovCi0JCQkgICpyZWxfaGFzaCA9IGg7Ci0JCQkgIGgtPmluZHggPSAtMjsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2lyZWwtPnJfc3ltbmR4XTsKLQkJICAgICAgaWYgKGluZHggIT0gLTEpCi0JCQlpcmVsLT5yX3N5bW5keCA9IGluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXM7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkJCSAgLyogVGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcHBpbmcuICBUaGlzIHNob3VsZCBoYXZlIGJlZW4gaGFuZGxlZAotCQkJICAgICBieSB0aGUgJ2RvbnRfc2tpcF9zeW1ib2wnIGNvZGUgaW4gdGhlIHdoaWxlCi0JCQkgICAgIGxvb3AgYXQgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uLiAqLwotCQkJICAKLQkJCSAgaXMgPSBmaW5mby0+aW50ZXJuYWxfc3ltcyArIGlyZWwtPnJfc3ltbmR4OwotCi0JCQkgIG5hbWUgPSAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lCi0JCQkJICAoaW5wdXRfYmZkLCBpcywgYnVmKSk7Ci0JCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBvLAotCQkJCSAgaXJlbC0+cl92YWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICs9IG8tPnJlbG9jX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIG1vZGlmaWVkIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKHNlY2RhdGEgPT0gTlVMTCB8fCBzZWNkYXRhLT5zdGFiX2luZm8gPT0gTlVMTCkKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgIChvLT5fY29va2VkX3NpemUgIT0gMAotCQkJCQkgICA/IG8tPl9jb29rZWRfc2l6ZQotCQkJCQkgICA6IG8tPl9yYXdfc2l6ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLQkJIChvdXRwdXRfYmZkLCAmY29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnN0YWJfaW5mbywKLQkJICBvLCAmc2VjZGF0YS0+c3RhYl9pbmZvLCBjb250ZW50cykpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBnbG9iYWwgc3ltYm9sLiAgQ2FsbGVkIHZpYSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLQotICBpZiAoaC0+aW5keCA+PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLCBmYWxzZSwgZmFsc2UpCi0JCSAgPT0gTlVMTCkpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3ZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICB7Ci0JYXNlY3Rpb24gKnNlYzsKLQotCXNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkgIGlzeW0ubl9zY251bSA9IE5fQUJTOwotCWVsc2UKLQkgIGlzeW0ubl9zY251bSA9IHNlYy0+dGFyZ2V0X2luZGV4OwotCWlzeW0ubl92YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JaWYgKCEgb2JqX3BlIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JICBpc3ltLm5fdmFsdWUgKz0gc2VjLT52bWE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3ZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogSnVzdCBpZ25vcmUgdGhlc2UuICBUaGV5IGNhbid0IGJlIGhhbmRsZWQgYW55aG93LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSA8PSBTWU1OTUxFTikKLSAgICBzdHJuY3B5IChpc3ltLl9uLl9uX25hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFzaDsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICAgICAgaGFzaCA9IHRydWU7Ci0gICAgICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLQloYXNoID0gZmFsc2U7Ci0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoYXNoLAotCQkJCSBmYWxzZSk7Ci0gICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JewotCSAgZmluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaXN5bS5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgICBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0gICAgfQotCi0gIGlzeW0ubl9zY2xhc3MgPSBoLT5jbGFzczsKLSAgaXN5bS5uX3R5cGUgPSBoLT50eXBlOwotCi0gIGlmIChpc3ltLm5fc2NsYXNzID09IENfTlVMTCkKLSAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0KLSAgLyogSWYgZG9pbmcgdGFzayBsaW5raW5nIGFuZCB0aGlzIGlzIHRoZSBwYXNzIHdoZXJlIHdlIGNvbnZlcnQKLSAgICAgZGVmaW5lZCBnbG9iYWxzIHRvIHN0YXRpY3MsIHRoZW4gZG8gdGhhdCBjb252ZXJzaW9uIG5vdy4gIElmIHRoZQotICAgICBzeW1ib2wgaXMgbm90IGJlaW5nIGNvbnZlcnRlZCwganVzdCBpZ25vcmUgaXQgYW5kIGl0IHdpbGwgYmUKLSAgICAgb3V0cHV0IGR1cmluZyBhIGxhdGVyIHBhc3MuICovCi0gIGlmIChmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYykKLSAgICB7Ci0gICAgICBpZiAoaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX1dFQUtFWFQKLQkgICYmICghIG9ial9wZSAob3V0cHV0X2JmZCkgfHwgaXN5bS5uX3NjbGFzcyAhPSBDX05UX1dFQUspKQotCXsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gICAgfQotCi0gIGlzeW0ubl9udW1hdXggPSBoLT5udW1hdXg7Ci0gIAotICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBmaW5mby0+b3V0c3ltcyk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSAqIHN5bWVzeiksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBzeW1lc3osIDEsIG91dHB1dF9iZmQpICE9IHN5bWVzeikKLSAgICB7Ci0gICAgICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaC0+aW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgYW55IGFzc29jaWF0ZWQgYXV4IGVudHJpZXMuICBNb3N0IG9mIHRoZSBhdXggZW50cmllcwotICAgICB3aWxsIGhhdmUgYmVlbiBtb2RpZmllZCBpbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQuICBXZSBoYXZlIHRvCi0gICAgIGhhbmRsZSBzZWN0aW9uIGF1eCBlbnRyaWVzIGhlcmUsIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGZpbmFsCi0gICAgIHJlbG9jYXRpb24gYW5kIGxpbmUgbnVtYmVyIGNvdW50cy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBpc3ltLm5fbnVtYXV4OyBpKyspCi0gICAgewotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhwOwotCi0gICAgICBhdXhwID0gaC0+YXV4ICsgaTsKLQotICAgICAgLyogTG9vayBmb3IgYSBzZWN0aW9uIGF1eCBlbnRyeSBoZXJlIHVzaW5nIHRoZSBzYW1lIHRlc3RzIHRoYXQKLSAgICAgICAgIGNvZmZfc3dhcF9hdXhfb3V0IHVzZXMuICAqLwotICAgICAgaWYgKGkgPT0gMAotCSAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19TVEFUCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0hJRERFTikKLQkgICYmIGlzeW0ubl90eXBlID09IFRfTlVMTAotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9zY25sZW4gPSAoc2VjLT5fY29va2VkX3NpemUgIT0gMAotCQkJCSAgICAgID8gc2VjLT5fY29va2VkX3NpemUKLQkJCQkgICAgICA6IHNlYy0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIEZvciBQRSwgYW4gb3ZlcmZsb3cgb24gdGhlIGZpbmFsIGxpbmsgcmVwb3J0ZWRseSBkb2VzCi0gICAgICAgICAgICAgICAgIG5vdCBtYXR0ZXIuICBGSVhNRTogV2h5IG5vdD8gICovCi0KLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IDB4ZmZmZgotCQkgICYmICghIG9ial9wZSAob3V0cHV0X2JmZCkKLQkJICAgICAgfHwgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkpCi0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogJXM6IHJlbG9jIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlYyksCi0JCSAgIHNlYy0+cmVsb2NfY291bnQpOwotCi0JICAgICAgaWYgKHNlYy0+bGluZW5vX2NvdW50ID4gMHhmZmZmCi0JCSAgJiYgKCEgb2JqX3BlIChvdXRwdXRfYmZkKQotCQkgICAgICB8fCBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKSkKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgc2VjKSwKLQkJICAgc2VjLT5saW5lbm9fY291bnQpOwotCi0JICAgICAgYXV4cC0+eF9zY24ueF9ucmVsb2MgPSBzZWMtPnJlbG9jX2NvdW50OwotCSAgICAgIGF1eHAtPnhfc2NuLnhfbmxpbm5vID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9jaGVja3N1bSA9IDA7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9hc3NvY2lhdGVkID0gMDsKLQkgICAgICBhdXhwLT54X3Njbi54X2NvbWRhdCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgYXV4cCwgaXN5bS5uX3R5cGUsCi0JCQkgICAgIGlzeW0ubl9zY2xhc3MsIGksIGlzeW0ubl9udW1hdXgsCi0JCQkgICAgIChQVFIpIGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBzeW1lc3osIDEsIG91dHB1dF9iZmQpICE9IHN5bWVzeikKLQl7Ci0JICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0YXNrIGdsb2JhbCBzeW1ib2xzLCBjb252ZXJ0aW5nIHRoZW0gdG8gc3RhdGljcy4gIENhbGxlZAotICAgdmlhIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlLiAgQ2FsbHMgYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSB0byBkbwotICAgdGhlIGRpcnR5IHdvcmssIGlmIHRoZSBzeW1ib2wgd2UgYXJlIHByb2Nlc3NpbmcgbmVlZHMgY29udmVyc2lvbi4gKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYm9vbGVhbiBydG52YWwgPSB0cnVlOwotICBib29sZWFuIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKLQotICBpZiAoaC0+aW5keCA8IDApCi0gICAgewotICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JewotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgc2F2ZV9nbG9iYWxfdG9fc3RhdGljID0gZmluZm8tPmdsb2JhbF90b19zdGF0aWM7Ci0JICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHRydWU7Ci0JICBydG52YWwgPSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSAoaCwgZGF0YSk7Ci0JICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsCi0JCQkJICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoZmluZm8tPmluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICBob3d0by0+bmFtZSwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsCi0JCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuICBJdCB3aWxsIGdldAotICAgICBzd2FwcGVkIGFuZCB3cml0dGVuIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUuICAqLwotCi0gIGlyZWwgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLSAgcmVsX2hhc2hfcHRyID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcwotCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQotICBtZW1zZXQgKGlyZWwsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7Ci0gICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCi0gIGlyZWwtPnJfdmFkZHIgPSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBzb21laG93IGxvY2F0ZSBhIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbi4gIFRoZQotICAgICAgICAgc3ltYm9sIG11c3QgZWl0aGVyIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvLCBvciB3ZSBtdXN0IGFkanVzdAotICAgICAgICAgdGhlIGFkZGVuZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEZJWE1FOiBXcml0ZSB0aGlzCi0gICAgICAgICB3aGVuIHdlIG5lZWQgaXQuICBUaGUgb2xkIGxpbmtlciBjb3VsZG4ndCBoYW5kbGUgdGhpcyBhbnlob3cuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IE5VTEwpCi0JewotCSAgaWYgKGgtPmluZHggPj0gMCkKLQkgICAgaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2V0IHRoZSBpbmRleCB0byAtMiB0byBmb3JjZSB0aGlzIHN5bWJvbCB0byBnZXQKLQkJIHdyaXR0ZW4gb3V0LiAgKi8KLQkgICAgICBoLT5pbmR4ID0gLTI7Ci0JICAgICAgKnJlbF9oYXNoX3B0ciA9IGg7Ci0JICAgICAgaXJlbC0+cl9zeW1uZHggPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBJcyB0aGlzIGFsd2F5cyByaWdodD8gICovCi0gIGlyZWwtPnJfdHlwZSA9IGhvd3RvLT50eXBlOwotCi0gIC8qIHJfc2l6ZSBpcyBvbmx5IHVzZWQgb24gdGhlIFJTLzYwMDAsIHdoaWNoIG5lZWRzIGl0cyBvd24gbGlua2VyCi0gICAgIHJvdXRpbmVzIGFueWhvdy4gIHJfZXh0ZXJuIGlzIG9ubHkgdXNlZCBmb3IgRUNPRkYuICAqLwotCi0gIC8qIEZJWE1FOiBXaGF0IGlzIHRoZSByaWdodCB2YWx1ZSBmb3Igcl9vZmZzZXQ/ICBJcyB6ZXJvIE9LPyAgKi8KLQotICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQSBiYXNpYyByZWxvYyBoYW5kbGluZyByb3V0aW5lIHdoaWNoIG1heSBiZSB1c2VkIGJ5IHByb2Nlc3NvcnMgd2l0aAotICAgc2ltcGxlIHJlbG9jcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCQkgICAgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW1uZHggPCAwCi0JICAgICAgIHx8ICh1bnNpZ25lZCBsb25nKSBzeW1uZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICgiJXM6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiByZWxvY3MiLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgc3ltbmR4KTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQotICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAotICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKLSAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLwotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmYWRkZW5kKTsKLSAgICAgIGlmIChob3d0byA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSWYgd2UgYXJlIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZW4gd2UgY2FuIGp1c3QgaWdub3JlCi0gICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIHRoYXQgaXMgcGNyZWxfb2Zmc2V0LiAgSXQgd2lsbCBhbHJlYWR5Ci0gICAgICAgICBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlLiAgSWYgdGhpcyBpcyBub3QgYSByZWxvY2F0ZWFibGUgbGluaywKLSAgICAgICAgIHRoZW4gd2Ugc2hvdWxkIGlnbm9yZSB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnBjcmVsX29mZnNldCkKLQl7Ci0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkgICAgYWRkZW5kICs9IHN5bS0+bl92YWx1ZTsKLQl9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUpOwotCSAgICAgIGlmICghIG9ial9wZSAoaW5wdXRfYmZkKSkKLQkJdmFsIC09IHNlYy0+dm1hOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0JewotCSAgLyogRW1pdCBhIHJlbG9jIGlmIHRoZSBiYWNrZW5kIHRoaW5rcyBpdCBuZWVkcyBpdC4gKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YSAob3V0cHV0X2JmZCktPmluX3JlbG9jX3AgKG91dHB1dF9iZmQsIGhvd3RvKSkKLQkgICAgewotCSAgICAgIC8qIFJlbG9jYXRpb24gdG8gYSBzeW1ib2wgaW4gYSBzZWN0aW9uIHdoaWNoIGlzbid0Ci0JCSBhYnNvbHV0ZS4gIFdlIG91dHB1dCB0aGUgYWRkcmVzcyBoZXJlIHRvIGEgZmlsZS4KLQkJIFRoaXMgZmlsZSBpcyB0aGVuIHJlYWQgYnkgZGxsdG9vbCB3aGVuIGdlbmVyYXRpbmcgdGhlCi0JCSByZWxvYyBzZWN0aW9uLiAgTm90ZSB0aGF0IHRoZSBiYXNlIGZpbGUgaXMgbm90Ci0JCSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuICBXZSB3cml0ZSBvdXQgYSBsb25nIGhlcmUsCi0JCSBhbmQgZGxsdG9vbCByZWFkcyBpbiBhIGxvbmcuICAqLwotCSAgICAgIGxvbmcgYWRkciA9IChyZWwtPnJfdmFkZHIgCi0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSAKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgaWYgKGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnBlKQotCQlhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JICAgICAgaWYgKGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAobG9uZyksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSkKLQkJICAhPSBzaXplb2YgKGxvbmcpKQotCQl7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLSAgCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsCi0JCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJdmFsLCBhZGRlbmQpOwotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKLQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCmRpZmYgLS1naXQgYS9iZmQvY29mZnN3YXAuaCBiL2JmZC9jb2Zmc3dhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGE1ZjY2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2Zmc3dhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8qIEdlbmVyaWMgQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdXNlZCB0byBzd2FwIENPRkYgZGF0YS4gIEl0IGlzIGEgaGVhZGVyCi0gICBmaWxlIGJlY2F1c2UgdGhlIGRldGFpbHMgb2Ygc3dhcHBpbmcgZGVwZW5kIG9uIHRoZSBkZXRhaWxzIG9mIHRoZQotICAgc3RydWN0dXJlcyB1c2VkIGJ5IGVhY2ggQ09GRiBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMgaW5jbHVkZWQgYnkKLSAgIGNvZmZjb2RlLmgsIGFzIHdlbGwgYXMgYnkgdGhlIEVDT0ZGIGJhY2tlbmQuCi0KLSAgIEFueSBmaWxlIHdoaWNoIHVzZXMgdGhpcyBtdXN0IGZpcnN0IGluY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIgYW5kCi0gICAiY29mZi9DUFUuaCIuICBUaGUgZnVuY3Rpb25zIHdpbGwgdGhlbiBiZSBjb3JyZWN0IGZvciB0aGF0IENQVS4gICovCi0KLSNkZWZpbmUgUFVUV09SRCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgUFVUSEFMRiBiZmRfaF9wdXRfMTYKLSNkZWZpbmUJUFVUQllURSBiZmRfaF9wdXRfOAotCi0jaWZuZGVmIEdFVF9GQ05fTE5OT1BUUgotI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotCi0jaWZuZGVmIEdFVF9GQ05fRU5ETkRYCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotCi0jaWZuZGVmIFBVVF9GQ05fTE5OT1BUUgotI2RlZmluZSBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgaW4sIGV4dCkgIFBVVFdPUkQoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgUFVUV09SRChhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfTE5OTwotI2RlZmluZSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MTlNaX1NJWkUKLSNkZWZpbmUgR0VUX0xOU1pfU0laRShhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBQVVRfTE5TWl9MTk5PCi0jZGVmaW5lIFBVVF9MTlNaX0xOTk8oYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX1NJWkUKLSNkZWZpbmUgUFVUX0xOU1pfU0laRShhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9TQ05MRU4KLSNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fTlJFTE9DCi0jZGVmaW5lIEdFVF9TQ05fTlJFTE9DKGFiZmQsICBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fTkxJTk5PCi0jZGVmaW5lIEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbmxpbm5vKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fU0NOTEVOCi0jZGVmaW5lIFBVVF9TQ05fU0NOTEVOKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX05SRUxPQwotI2RlZmluZSBQVVRfU0NOX05SRUxPQyhhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX05MSU5OTwotI2RlZmluZSBQVVRfU0NOX05MSU5OTyhhYmZkLGluLCBleHQpICBiZmRfaF9wdXRfMTYoYWJmZCxpbiwgKGJmZF9ieXRlICAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MSU5FTk9fTE5OTwotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2VuZGlmCi0jaWZuZGVmIFBVVF9MSU5FTk9fTE5OTwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2VuZGlmCi0KLS8qIFRoZSBmX3N5bXB0ciBmaWVsZCBpbiB0aGUgZmlsZWhkciBpcyBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9GSUxFSERSX1NZTVBUUgotI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgYW91dGhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfQU9VVEhEUl9UU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9UU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9UU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9UU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9EU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9EU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9EU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9CU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9CU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9CU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9FTlRSWQotI2RlZmluZSBHRVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9FTlRSWQotI2RlZmluZSBQVVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVAotI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotLyogU29tZSBmaWVsZHMgaW4gdGhlIHNjbmhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIEdFVF9TQ05IRFJfUEFERFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9QQUREUgotI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9WQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1ZBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfVkFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TSVpFCi0jZGVmaW5lIEdFVF9TQ05IRFJfU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgUFVUX1NDTkhEUl9TSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfU0NOUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfU0NOUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0NOUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfUkVMUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfUkVMUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfUkVMUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUkVMUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfTE5OT1BUUgotI2RlZmluZSBHRVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX05SRUxPQwotI2RlZmluZSBHRVRfU0NOSERSX05SRUxPQyBiZmRfaF9nZXRfMTYKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX05SRUxPQwotI2RlZmluZSBQVVRfU0NOSERSX05SRUxPQyBiZmRfaF9wdXRfMTYKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX05MTk5PCi0jZGVmaW5lIEdFVF9TQ05IRFJfTkxOTk8gYmZkX2hfZ2V0XzE2Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9OTE5OTwotI2RlZmluZSBQVVRfU0NOSERSX05MTk5PIGJmZF9oX3B1dF8xNgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfRkxBR1MKLSNkZWZpbmUgR0VUX1NDTkhEUl9GTEFHUyBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0ZMQUdTCi0jZGVmaW5lIFBVVF9TQ05IRFJfRkxBR1MgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfYW91dGhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2FvdXRoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3Njbmhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3Njbmhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2lmbmRlZiBOT19DT0ZGX1JFTE9DUwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2VuZGlmIC8qIE5PX0NPRkZfUkVMT0NTICovCi0jaWZuZGVmIE5PX0NPRkZfU1lNQk9MUwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3N5bV9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfYXV4X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9hdXhfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci0jZW5kaWYgLyogTk9fQ09GRl9TWU1CT0xTICovCi0jaWZuZGVmIE5PX0NPRkZfTElORU5PUwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2xpbmVub19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2xpbmVub19vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZW5kaWYgLyogTk9fQ09GRl9MSU5FTk9TICovCi0KLSNpZm5kZWYgTk9fQ09GRl9SRUxPQ1MKLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7Ci0KLSAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7Ci0gIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF84KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlKTsKLSAgcmVsb2NfZHN0LT5yX3NpemUgPSBiZmRfaF9nZXRfOChhYmZkLCByZWxvY19zcmMtPnJfc2l6ZSk7Ci0jZWxzZQotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOwotI2VuZGlmCi0KLSNpZmRlZiBTV0FQX0lOX1JFTE9DX09GRlNFVAotICByZWxvY19kc3QtPnJfb2Zmc2V0ID0gU1dBUF9JTl9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCQkJICAgICAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX29mZnNldCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCXNyYzsKLSAgICAgUFRSCWRzdDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGJmZF9oX3B1dF84IChhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl90eXBlKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHJlbG9jX3NyYy0+cl9zaXplLCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3NpemUpOwotI2Vsc2UKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlLCAoYmZkX2J5dGUgKikKLQkgICAgICAgcmVsb2NfZHN0LT5yX3R5cGUpOwotI2VuZGlmCi0KLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19PRkZTRVQKLSAgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQlyZWxvY19zcmMtPnJfb2Zmc2V0LAotCQkJKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9vZmZzZXQpOwotI2VuZGlmCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfRVhUUkEKLSAgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCxyZWxvY19zcmMsIHJlbG9jX2RzdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gUkVMU1o7Ci19Ci0KLSNlbmRpZiAvKiBOT19DT0ZGX1JFTE9DUyAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2ZpbGVoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSCSAgICAgc3JjOwotICAgICBQVFIJICAgICBkc3Q7Ci17Ci0gIEZJTEhEUiAqZmlsZWhkcl9zcmMgPSAoRklMSERSICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGRzdDsKLSNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BSRQotICBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BSRSAoYWJmZCwgc3JjLCBkc3QpOwotI2VuZGlmCi0gIGZpbGVoZHJfZHN0LT5mX21hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9tYWdpYyk7Ci0gIGZpbGVoZHJfZHN0LT5mX25zY25zID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc2Nucyk7Ci0gIGZpbGVoZHJfZHN0LT5mX3RpbWRhdCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGltZGF0KTsKLSAgZmlsZWhkcl9kc3QtPmZfc3ltcHRyID0KLSAgICBHRVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9zeW1wdHIpOwotICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnN5bXMpOwotICBmaWxlaGRyX2RzdC0+Zl9vcHRoZHIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX29wdGhkcik7Ci0gIGZpbGVoZHJfZHN0LT5mX2ZsYWdzID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9mbGFncyk7Ci0jaWZkZWYgVElDODBfVEFSR0VUX0lECi0gIGZpbGVoZHJfZHN0LT5mX3RhcmdldF9pZCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGFyZ2V0X2lkKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUCi0gIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCAoYWJmZCwgc3JjLCBkc3QpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyAgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKW91dDsKLQotI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfdGltZGF0LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0jaWZkZWYgVElDODBfVEFSR0VUX0lECi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX3RhcmdldF9pZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3RhcmdldF9pZCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QKLSAgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVCAoYWJmZCwgaW4sIG91dCk7Ci0jZW5kaWYKLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotCi0jaWZuZGVmIE5PX0NPRkZfU1lNQk9MUwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIFNZTUVOVCAqZXh0ID0gKFNZTUVOVCAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKLQotICBpZiggZXh0LT5lLmVfbmFtZVswXSA9PSAwKSB7Ci0gICAgaW4tPl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICBpbi0+X24uX25fbi5fbl9vZmZzZXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKLSAgfQotICBlbHNlIHsKLSNpZiBTWU1OTUxFTiAhPSBFX1NZTU5NTEVOCi0gICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOwotI2Vsc2UKLSAgICBtZW1jcHkoaW4tPl9uLl9uX25hbWUsIGV4dC0+ZS5lX25hbWUsIFNZTU5NTEVOKTsKLSNlbmRpZgotICB9Ci0gIGluLT5uX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOyAKLSAgaW4tPm5fc2NudW0gPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpewotICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgaW4tPm5fc2NsYXNzID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX3NjbGFzcyk7Ci0gIGluLT5uX251bWF1eCA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9udW1hdXgpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgaW5wLCBleHRwKQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbnA7Ci0gICAgIFBUUglleHRwOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW5wOwotICBTWU1FTlQgKmV4dCA9KFNZTUVOVCAqKWV4dHA7Ci0gIGlmKGluLT5fbi5fbl9uYW1lWzBdID09IDApIHsKLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfemVyb2VzKTsKLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPl9uLl9uX24uX25fb2Zmc2V0LCAoYmZkX2J5dGUgKikgIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKLSAgfQotICBlbHNlIHsKLSNpZiBTWU1OTUxFTiAhPSBFX1NZTU5NTEVOCi0gICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIFNZTU5NTEVOITsKLSNlbHNlCi0gICAgbWVtY3B5KGV4dC0+ZS5lX25hbWUsIGluLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0jZW5kaWYKLSAgfQotICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3ZhbHVlICwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAgaW4tPm5fc2NudW0gLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKLSAgaWYgKHNpemVvZihleHQtPmVfdHlwZSkgPT0gMikKLSAgICAgIHsKLQliZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgICAgfQotICBlbHNlCi0gICAgICB7Ci0JYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICAgIH0KLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX3NjbGFzcyAsIGV4dC0+ZV9zY2xhc3MpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fbnVtYXV4ICwgZXh0LT5lX251bWF1eCk7Ci0gIHJldHVybiBTWU1FU1o7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgCSAgICAgIGV4dDE7Ci0gICAgIGludCAgICAgICAgICAgICB0eXBlOwotICAgICBpbnQgICAgICAgICAgICAgY2xhc3M7Ci0gICAgIGludAkgICAgICBpbmR4OwotICAgICBpbnQJICAgICAgbnVtYXV4OwotICAgICBQVFIgCSAgICAgIGluMTsKLXsKLSAgQVVYRU5UICAgICpleHQgPSAoQVVYRU5UICopZXh0MTsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbjE7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfSU5fUFJFCi0gIENPRkZfQURKVVNUX0FVWF9JTl9QUkUgKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSk7Ci0jZW5kaWYKLSAgc3dpdGNoIChjbGFzcykgewotICAgIGNhc2UgQ19GSUxFOgotICAgICAgaWYgKGV4dC0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgewotCSAgaW4tPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOwotCSAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQgPSAKLQkgICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0JfSBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0JICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBGSUxOTUxFTiE7Ci0jZWxzZQotCSAgICBpZiAobnVtYXV4ID4gMSkKLQkgICAgICB7Ci0JCWlmIChpbmR4ID09IDApCi0JCSAgbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsCi0JCQkgIG51bWF1eCAqIHNpemVvZiAoQVVYRU5UKSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQltZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotCSAgICAgIH0KLSNlbmRpZgotCSAgfQotICAgICAgZ290byBlbmQ7Ci0KLSAgICAgIC8qIFJTLzYwMDAgImNzZWN0IiBhdXhlbnRzICovCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfSElERVhUOgotICAgICAgaWYgKGluZHggKyAxID09IG51bWF1eCkKLQl7Ci0JICBpbi0+eF9jc2VjdC54X3Njbmxlbi5sID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPnhfY3NlY3QueF9zY25sZW4pOwotCSAgaW4tPnhfY3NlY3QueF9wYXJtaGFzaCA9IGJmZF9oX2dldF8zMiAoYWJmZCwKLQkJCQkJCSBleHQtPnhfY3NlY3QueF9wYXJtaGFzaCk7Ci0JICBpbi0+eF9jc2VjdC54X3NuaGFzaCAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPnhfY3NlY3QueF9zbmhhc2gpOwotCSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBoYWNrIGJpdGZpZWxkcyBpbiB4X3NtdHlwIGJlY2F1c2UgaXQncwotCSAgICAgZGVmaW5lZCBieSBzaGlmdHMtYW5kLWFuZHMsIHdoaWNoIGFyZSBlcXVpdmFsZW50IG9uIGFsbAotCSAgICAgYnl0ZSBvcmRlcnMuICAqLwotCSAgaW4tPnhfY3NlY3QueF9zbXR5cCAgICA9IGJmZF9oX2dldF84ICAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc210eXApOwotCSAgaW4tPnhfY3NlY3QueF9zbWNsYXMgICA9IGJmZF9oX2dldF84ICAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc21jbGFzKTsKLQkgIGluLT54X2NzZWN0Lnhfc3RhYiAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3N0YWIpOwotCSAgaW4tPnhfY3NlY3QueF9zbnN0YWIgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc25zdGFiKTsKLQkgIGdvdG8gZW5kOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIENfU1RBVDoKLSNpZmRlZiBDX0xFQUZTVEFUCi0gICAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gICAgY2FzZSBDX0hJRERFTjoKLSAgICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotCSAgaW4tPnhfc2NuLnhfc2NubGVuID0gR0VUX1NDTl9TQ05MRU4oYWJmZCwgZXh0KTsKLQkgIGluLT54X3Njbi54X25yZWxvYyA9IEdFVF9TQ05fTlJFTE9DKGFiZmQsIGV4dCk7Ci0JICBpbi0+eF9zY24ueF9ubGlubm8gPSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpOwotCi0JICAvKiBQRSBkZWZpbmVzIHNvbWUgZXh0cmEgZmllbGRzOyB3ZSB6ZXJvIHRoZW0gb3V0IGZvcgotICAgICAgICAgICAgIHNhZmV0eS4gICovCi0JICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IDA7Ci0JICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0gMDsKLQkgIGluLT54X3Njbi54X2NvbWRhdCA9IDA7Ci0KLQkgIGdvdG8gZW5kOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpbi0+eF9zeW0ueF90YWduZHgubCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0jaWZuZGVmIE5PX1RWTkRYCi0gIGluLT54X3N5bS54X3R2bmR4ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOwotI2VuZGlmCi0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9IEdFVF9GQ05fTE5OT1BUUiAoYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gR0VUX0ZDTl9FTkRORFggKGFiZmQsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTih0eXBlKSkgewotICAgIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vID0gR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpOwotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSA9IEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KTsKLSAgfQotCi1lbmQ6IDsKLSAgLyogdGhlIHNlbWljb2xvbiBpcyBiZWNhdXNlIE1TVkMgZG9lc24ndCBsaWtlIGxhYmVscyBhdAotICAgICBlbmQgb2YgYmxvY2suICovCi0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVCAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgICAqYWJmZDsKLSAgICAgUFRSIAlpbnA7Ci0gICAgIGludCAgIHR5cGU7Ci0gICAgIGludCAgIGNsYXNzOwotICAgICBpbnQgICBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCAgIG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIJZXh0cDsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbnA7Ci0gIEFVWEVOVCAqZXh0ID0gKEFVWEVOVCAqKWV4dHA7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRSAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKTsKLSNlbmRpZgotICBtZW1zZXQoKFBUUilleHQsIDAsIEFVWEVTWik7Ci0gIHN3aXRjaCAoY2xhc3MpIHsKLSAgY2FzZSBDX0ZJTEU6Ci0gICAgaWYgKGluLT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0gICAgICBQVVRXT1JEKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF96ZXJvZXMpOwotICAgICAgUFVUV09SRChhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0gICAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRklMTk1MRU4hOwotI2Vsc2UKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZ290byBlbmQ7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogUlMvNjAwMCAiY3NlY3QiIGF1eGVudHMgKi8KLSAgY2FzZSBDX0VYVDoKLSAgY2FzZSBDX0hJREVYVDoKLSAgICBpZiAoaW5keCArIDEgPT0gbnVtYXV4KQotICAgICAgewotCVBVVFdPUkQgKGFiZmQsIGluLT54X2NzZWN0Lnhfc2NubGVuLmwsCWV4dC0+eF9jc2VjdC54X3Njbmxlbik7Ci0JUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9wYXJtaGFzaCwJZXh0LT54X2NzZWN0LnhfcGFybWhhc2gpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25oYXNoLAlleHQtPnhfY3NlY3QueF9zbmhhc2gpOwotCS8qIFdlIGRvbid0IGhhdmUgdG8gaGFjayBiaXRmaWVsZHMgaW4geF9zbXR5cCBiZWNhdXNlIGl0J3MKLQkgICBkZWZpbmVkIGJ5IHNoaWZ0cy1hbmQtYW5kcywgd2hpY2ggYXJlIGVxdWl2YWxlbnQgb24gYWxsCi0JICAgYnl0ZSBvcmRlcnMuICAqLwotCVBVVEJZVEUgKGFiZmQsIGluLT54X2NzZWN0Lnhfc210eXAsCWV4dC0+eF9jc2VjdC54X3NtdHlwKTsKLQlQVVRCWVRFIChhYmZkLCBpbi0+eF9jc2VjdC54X3NtY2xhcywJZXh0LT54X2NzZWN0Lnhfc21jbGFzKTsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3N0YWIsCWV4dC0+eF9jc2VjdC54X3N0YWIpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25zdGFiLAlleHQtPnhfY3NlY3QueF9zbnN0YWIpOwotCWdvdG8gZW5kOwotICAgICAgfQotICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgY2FzZSBDX1NUQVQ6Ci0jaWZkZWYgQ19MRUFGU1RBVAotICBjYXNlIENfTEVBRlNUQVQ6Ci0jZW5kaWYKLSAgY2FzZSBDX0hJRERFTjoKLSAgICBpZiAodHlwZSA9PSBUX05VTEwpIHsKLSAgICAgIFBVVF9TQ05fU0NOTEVOKGFiZmQsIGluLT54X3Njbi54X3NjbmxlbiwgZXh0KTsKLSAgICAgIFBVVF9TQ05fTlJFTE9DKGFiZmQsIGluLT54X3Njbi54X25yZWxvYywgZXh0KTsKLSAgICAgIFBVVF9TQ05fTkxJTk5PKGFiZmQsIGluLT54X3Njbi54X25saW5ubywgZXh0KTsKLSAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIFBVVFdPUkQoYWJmZCwgaW4tPnhfc3ltLnhfdGFnbmR4LmwsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X3R2bmR4ICwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIGV4dCk7Ci0gICAgICBQVVRfRkNOX0VORE5EWChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04gKHR5cGUpKQotICAgIFBVVFdPUkQgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSwKLQkgICAgIChiZmRfYnl0ZSAqKSAgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQVVRfTE5TWl9MTk5PIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8sIGV4dCk7Ci0gICAgICBQVVRfTE5TWl9TSVpFIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsIGV4dCk7Ci0gICAgfQotCi1lbmQ6Ci0jaWZkZWYgQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUCi0gIENPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKTsKLSNlbmRpZgotICByZXR1cm4gQVVYRVNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9TWU1CT0xTICovCi0KLSNpZm5kZWYgTk9fQ09GRl9MSU5FTk9TCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgTElORU5PICpleHQgPSAoTElORU5PICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW4xOwotCi0gIGluLT5sX2FkZHIubF9zeW1uZHggPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLSAgaW4tPmxfbG5ubyA9IEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgaW5wLCBvdXRwKQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbnA7Ci0gICAgIFBUUglvdXRwOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW5wOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpleHQgPSAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKW91dHA7Ci0gIFBVVFdPUkQoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopCi0JICBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0KLSAgUFVUX0xJTkVOT19MTk5PIChhYmZkLCBpbi0+bF9sbm5vLCBleHQpOwotICByZXR1cm4gTElORVNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9MSU5FTk9TICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgYW91dGhkcl9leHQxLCBhb3V0aGRyX2ludDEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgYW91dGhkcl9leHQxOwotICAgICBQVFIgYW91dGhkcl9pbnQxOwotewotICBBT1VUSERSICAgICAgICAqYW91dGhkcl9leHQgPSAoQU9VVEhEUiAqKSBhb3V0aGRyX2V4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICphb3V0aGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHJfaW50MTsKLQotICBhb3V0aGRyX2ludC0+bWFnaWMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5tYWdpYyk7Ci0gIGFvdXRoZHJfaW50LT52c3RhbXAgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52c3RhbXApOwotICBhb3V0aGRyX2ludC0+dHNpemUgPQotICAgIEdFVF9BT1VUSERSX1RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kc2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5ic2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+YnNpemUpOwotICBhb3V0aGRyX2ludC0+ZW50cnkgPQotICAgIEdFVF9BT1VUSERSX0VOVFJZIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgPQotICAgIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dGV4dF9zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRhdGFfc3RhcnQpOwotCi0jaWZkZWYgSTk2MAotICBhb3V0aGRyX2ludC0+dGFnZW50cmllcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRhZ2VudHJpZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBBUE9MTE9fTTY4Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+b19pbmxpYiwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5vX2lubGliKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT5vX3NyaSwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5vX3NyaSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+dmlkWzBdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZpZCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+dmlkWzFdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZpZCArIDQpOwotI2VuZGlmCi0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBhb3V0aGRyX2ludC0+b190b2MgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fdG9jKTsKLSAgYW91dGhkcl9pbnQtPm9fc25lbnRyeSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPm9fc250ZXh0ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NudGV4dCk7Ci0gIGFvdXRoZHJfaW50LT5vX3NuZGF0YSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmRhdGEpOwotICBhb3V0aGRyX2ludC0+b19zbnRvYyA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbnRvYyk7Ci0gIGFvdXRoZHJfaW50LT5vX3NubG9hZGVyID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NubG9hZGVyKTsKLSAgYW91dGhkcl9pbnQtPm9fc25ic3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25ic3MpOwotICBhb3V0aGRyX2ludC0+b19hbGdudGV4dCA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19hbGdudGV4dCk7Ci0gIGFvdXRoZHJfaW50LT5vX2FsZ25kYXRhID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX2FsZ25kYXRhKTsKLSAgYW91dGhkcl9pbnQtPm9fbW9kdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19tb2R0eXBlKTsKLSAgYW91dGhkcl9pbnQtPm9fY3B1dHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19jcHV0eXBlKTsKLSAgYW91dGhkcl9pbnQtPm9fbWF4c3RhY2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fbWF4c3RhY2spOwotICBhb3V0aGRyX2ludC0+b19tYXhkYXRhID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5vX21heGRhdGEpOwotI2VuZGlmCi0KLSNpZmRlZiBNSVBTRUNPRkYKLSAgYW91dGhkcl9pbnQtPmJzc19zdGFydCA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+YnNzX3N0YXJ0KTsKLSAgYW91dGhkcl9pbnQtPmdwX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncF92YWx1ZSk7Ci0gIGFvdXRoZHJfaW50LT5ncHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncHJtYXNrKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbMF0pOwotICBhb3V0aGRyX2ludC0+Y3BybWFza1sxXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1sxXSk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzJdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzJdKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbM10pOwotI2VuZGlmCi0KLSNpZmRlZiBBTFBIQUVDT0ZGCi0gIGFvdXRoZHJfaW50LT5ic3Nfc3RhcnQgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPmJzc19zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5ncF92YWx1ZSA9IGJmZF9oX2dldF82NChhYmZkLCBhb3V0aGRyX2V4dC0+Z3BfdmFsdWUpOwotICBhb3V0aGRyX2ludC0+Z3BybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BybWFzayk7Ci0gIGFvdXRoZHJfaW50LT5mcHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5mcHJtYXNrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWluOwotICBBT1VUSERSICphb3V0aGRyX291dCA9IChBT1VUSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT5tYWdpYywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT52c3RhbXAsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dnN0YW1wKTsKLSAgUFVUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPnRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnRzaXplKTsKLSAgUFVUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmRzaXplKTsKLSAgUFVUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmJzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzaXplKTsKLSAgUFVUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIGFvdXRoZHJfaW4tPmVudHJ5LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmVudHJ5KTsKLSAgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+dGV4dF9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT50ZXh0X3N0YXJ0KTsKLSAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5kYXRhX3N0YXJ0KTsKLQotI2lmZGVmIEk5NjAKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPnRhZ2VudHJpZXMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dGFnZW50cmllcyk7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fdG9jLCBhb3V0aGRyX291dC0+b190b2MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25lbnRyeSwgYW91dGhkcl9vdXQtPm9fc25lbnRyeSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbnRleHQsIGFvdXRoZHJfb3V0LT5vX3NudGV4dCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmRhdGEsIGFvdXRoZHJfb3V0LT5vX3NuZGF0YSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbnRvYywgYW91dGhkcl9vdXQtPm9fc250b2MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25sb2FkZXIsIGFvdXRoZHJfb3V0LT5vX3NubG9hZGVyKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NuYnNzLCBhb3V0aGRyX291dC0+b19zbmJzcyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19hbGdudGV4dCwgYW91dGhkcl9vdXQtPm9fYWxnbnRleHQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fYWxnbmRhdGEsIGFvdXRoZHJfb3V0LT5vX2FsZ25kYXRhKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX21vZHR5cGUsIGFvdXRoZHJfb3V0LT5vX21vZHR5cGUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fY3B1dHlwZSwgYW91dGhkcl9vdXQtPm9fY3B1dHlwZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYW91dGhkcl9pbi0+b19tYXhzdGFjaywgYW91dGhkcl9vdXQtPm9fbWF4c3RhY2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbWF4ZGF0YSwgYW91dGhkcl9vdXQtPm9fbWF4ZGF0YSk7Ci0gIG1lbXNldCAoYW91dGhkcl9vdXQtPm9fcmVzdjIsIDAsIHNpemVvZiBhb3V0aGRyX291dC0+b19yZXN2Mik7Ci0jZW5kaWYKLQotI2lmZGVmIE1JUFNFQ09GRgotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+YnNzX3N0YXJ0LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzc19zdGFydCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncF92YWx1ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncHJtYXNrLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwcm1hc2spOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1swXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbMV0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzJdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1szXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzNdKTsKLSNlbmRpZgotCi0jaWZkZWYgQUxQSEFFQ09GRgotICAvKiBGSVhNRTogV2hhdCBkb2VzIGJsZHJldiBtZWFuPyAgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIChiZmRfdm1hKSAyLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJsZHJldik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAoYmZkX3ZtYSkgMCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5wYWRkaW5nKTsKLSAgYmZkX2hfcHV0XzY0KGFiZmQsIGFvdXRoZHJfaW4tPmJzc19zdGFydCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic3Nfc3RhcnQpOwotICBiZmRfaF9wdXRfNjQoYWJmZCwgYW91dGhkcl9pbi0+Z3BfdmFsdWUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BybWFzaywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmZwcm1hc2ssIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZnBybWFzayk7Ci0jZW5kaWYKLQotICByZXR1cm4gQU9VVFNaOwotfQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIGV4dDsKLSAgICAgUFRSCSAgICAgaW47Ci17Ci0gIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKikgZXh0OwotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFCi0gIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUgKGFiZmQsIGV4dCwgaW4pOwotI2VuZGlmCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0gIHNjbmhkcl9pbnQtPnNfc2NucHRyID0KLSAgICBHRVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgc2NuaGRyX2ludC0+c19yZWxwdHIgPQotICAgIEdFVF9TQ05IRFJfUkVMUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOwotICBzY25oZHJfaW50LT5zX2xubm9wdHIgPQotICAgIEdFVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7Ci0gIHNjbmhkcl9pbnQtPnNfZmxhZ3MgPQotICAgIEdFVF9TQ05IRFJfRkxBR1MgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPQotICAgIEdFVF9TQ05IRFJfTlJFTE9DIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0KLSAgICBHRVRfU0NOSERSX05MTk5PIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0jaWZkZWYgSTk2MAotICBzY25oZHJfaW50LT5zX2FsaWduID0KLSAgICBHRVRfU0NOSERSX0FMSUdOIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19hbGlnbik7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCAoYWJmZCwgZXh0LCBpbik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKilpbjsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKW91dDsKLSAgdW5zaWduZWQgaW50IHJldCA9IFNDTkhTWjsKLQotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFCi0gIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICBtZW1jcHkoc2NuaGRyX2V4dC0+c19uYW1lLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKLQotICBQVVRfU0NOSERSX1ZBRERSIChhYmZkLCBzY25oZHJfaW50LT5zX3ZhZGRyLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfdmFkZHIpOwotCi0KLSAgUFVUX1NDTkhEUl9QQUREUiAoYWJmZCwgc2NuaGRyX2ludC0+c19wYWRkciwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgUFVUX1NDTkhEUl9TSVpFIChhYmZkLCBzY25oZHJfaW50LT5zX3NpemUsCi0JCSAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0gIFBVVF9TQ05IRFJfU0NOUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX3NjbnB0ciwKLQkJICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zY25wdHIpOwotICBQVVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19yZWxwdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgUFVUX1NDTkhEUl9MTk5PUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX2xubm9wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBQVVRfU0NOSERSX0ZMQUdTIChhYmZkLCBzY25oZHJfaW50LT5zX2ZsYWdzLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfZmxhZ3MpOwotI2lmIGRlZmluZWQoTTg4KQotICBQVVRXT1JEKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgUFVUV09SRChhYmZkLCBzY25oZHJfaW50LT5zX25yZWxvYywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSNlbHNlCi0gIGlmIChzY25oZHJfaW50LT5zX25sbm5vIDw9IDB4ZmZmZikKLSAgICBQVVRIQUxGKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSArIDFdOwotCi0gICAgICBtZW1jcHkgKGJ1Ziwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICAgICAgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKV0gPSAnXDAnOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSBidWYsIHNjbmhkcl9pbnQtPnNfbmxubm8pOwotICAgICAgUFVUSEFMRiAoYWJmZCwgMHhmZmZmLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gICAgfQotICBpZiAoc2NuaGRyX2ludC0+c19ucmVsb2MgPD0gMHhmZmZmKQotICAgIFBVVEhBTEYoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkgKyAxXTsKLQotICAgICAgbWVtY3B5IChidWYsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpKTsKLSAgICAgIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSldID0gJ1wwJzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgIGJ1Ziwgc2NuaGRyX2ludC0+c19ucmVsb2MpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIFBVVEhBTEYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgICAgIHJldCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBJOTYwCi0gIFBVVF9TQ05IRFJfQUxJR04gKGFiZmQsIHNjbmhkcl9pbnQtPnNfYWxpZ24sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2FsaWduKTsKLSNlbmRpZgotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9iZmQvY29uZmlnLmJmZCBiL2JmZC9jb25maWcuYmZkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU0ODNjLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWcuYmZkCisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLSMgY29uZmlnLmJmZAotIyBDb252ZXJ0IGEgY2Fub25pY2FsIGhvc3QgdHlwZSBpbnRvIGEgQkZEIGhvc3QgdHlwZS4KLSMgU2V0IHNoZWxsIHZhcmlhYmxlIHRhcmcgdG8gY2Fub25pY2FsIHRhcmdldCBuYW1lLCBhbmQgcnVuCi0jIHVzaW5nIGBgLiBjb25maWcuYmZkJycuCi0jIFNldHMgdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICB0YXJnX2RlZnZlYwkJRGVmYXVsdCB2ZWN0b3IgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX3NlbHZlY3MJCVZlY3RvcnMgdG8gYnVpbGQgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX2FyY2hzCQlBcmNoaXRlY3R1cmVzIGZvciB0aGlzIHRhcmdldAotIyAgdGFyZ19jZmxhZ3MJCSQoQ0ZMQUdTKSBmb3IgdGhpcyB0YXJnZXQgKEZJWE1FOiBwcmV0dHkgYm9ndXMpCi0jICB0YXJnX3VuZGVyc2NvcmUJV2hldGhlciB1bmRlcnNjb3JlcyBhcmUgdXNlZDogeWVzIG9yIG5vCi0KLSMgUGFydCBvZiB0aGlzIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRhcmdtYXRjaC5zZWQgdG8gZ2VuZXJhdGUgdGhlCi0jIHRhcmdtYXRjaC5oIGZpbGUuICBUaGUgI2lmZGVmIGFuZCAjZW5kaWYgbGluZXMgdGhhdCBhcHBlYXIgYmVsb3cgYXJlCi0jIGNvcGllZCBkaXJlY3RseSBpbnRvIHRhcmdtYXRjaC5oLgotCi0jIFRoZSBiaW51dGlscyBjKytmaWx0IHByb2dyYW0gd2FudHMgdG8ga25vdyB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZQotIyBzdHJpcHBlZCBvciBub3QuICBUaGF0IGlzIHdoeSB3ZSBzZXQgdGFyZ191bmRlcnNjb3JlLiAgYysrZmlsdCB1c2VzCi0jIHRoaXMgaW5mb3JtYXRpb24gdG8gY2hvb3NlIGEgZGVmYXVsdC4gIFRoaXMgaW5mb3JtYXRpb24gaXMKLSMgZHVwbGljYXRlZCBpbiB0aGUgc3ltYm9sX2xlYWRpbmdfY2hhciBmaWVsZCBvZiB0aGUgQkZEIHRhcmdldAotIyB2ZWN0b3IsIGJ1dCBjKytmaWx0IGRvZXMgbm90IGRlYWwgd2l0aCBvYmplY3QgZmlsZXMgYW5kIGlzIG5vdAotIyBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuYS4gIEl0IGlzIG5vdCB0ZXJyaWJseSBpbXBvcnRhbnQgdGhhdCBjKytmaWx0Ci0jIGdldCB0aGlzIHJpZ2h0OyBpdCBpcyBqdXN0IGNvbnZlbmllbnQuCi0KLXRhcmdfZGVmdmVjPQotdGFyZ19zZWx2ZWNzPQotdGFyZ19jZmxhZ3M9Ci10YXJnX3VuZGVyc2NvcmU9bm8KLQotdGFyZ19jcHU9YGVjaG8gJHRhcmcgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotY2FzZSAiJHt0YXJnX2NwdX0iIGluCi1hbHBoYSopIHRhcmdfYXJjaHM9YmZkX2FscGhhX2FyY2ggOzsKLWFybSopCXRhcmdfYXJjaHM9YmZkX2FybV9hcmNoIDs7Ci1zdHJvbmdhcm0qKSB0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwotdGh1bWIqKQl0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwotYzMwKikJdGFyZ19hcmNocz1iZmRfdGljMzBfYXJjaCA7OwotaHBwYSopCXRhcmdfYXJjaHM9YmZkX2hwcGFfYXJjaCA7OwotaVszNDU2XTg2KSB0YXJnX2FyY2hzPWJmZF9pMzg2X2FyY2ggOzsKLW02OCopCXRhcmdfYXJjaHM9YmZkX202OGtfYXJjaCA7OwotbTg4KikJdGFyZ19hcmNocz1iZmRfbTg4a19hcmNoIDs7Ci1taXBzKikJdGFyZ19hcmNocz1iZmRfbWlwc19hcmNoIDs7Ci1waiopCXRhcmdfYXJjaHM9ImJmZF9wal9hcmNoIGJmZF9pMzg2X2FyY2giOzsKLXBvd2VycGMqKSB0YXJnX2FyY2hzPSJiZmRfcnM2MDAwX2FyY2ggYmZkX3Bvd2VycGNfYXJjaCIgOzsKLXJzNjAwMCkJdGFyZ19hcmNocz0iYmZkX3JzNjAwMF9hcmNoIGJmZF9wb3dlcnBjX2FyY2giIDs7Ci1zcGFyYyopIHRhcmdfYXJjaHM9YmZkX3NwYXJjX2FyY2ggOzsKLXY4NTAqKQl0YXJnX2FyY2hzPWJmZF92ODUwX2FyY2ggOzsKLXo4ayopCXRhcmdfYXJjaHM9YmZkX3o4a19hcmNoIDs7Ci0qKQl0YXJnX2FyY2hzPWJmZF8ke3RhcmdfY3B1fV9hcmNoIDs7Ci1lc2FjCi0KLQotIyBXSEVOIEFERElORyBFTlRSSUVTIFRPIFRISVMgTUFUUklYOgotIyAgTWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQgc2lkZSBhbHdheXMgaGFzIHR3byBkYXNoZXMuICBPdGhlcndpc2UgeW91Ci0jICBjYW4gZ2V0IHNwdXJpb3VzIG1hdGNoZXMuICBFdmVuIGZvciB1bmFtYmlndW91cyBjYXNlcywgZG8gdGhpcyBhcyBhCi0jICBjb252ZW50aW9uLCBlbHNlIHRoZSB0YWJsZSBiZWNvbWVzIGEgcmVhbCBtZXNzIHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLgotCi1jYXNlICIke3Rhcmd9IiBpbgotIyBTVEFSVCBPRiB0YXJnbWF0Y2guaAotI2lmZGVmIEJGRDY0Ci0gIGFscGhhKi0qLW5ldGJzZCogfCBhbHBoYSotKi1mcmVlYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfYWxwaGFfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1ubG0zMl9hbHBoYV92ZWMKLSAgICA7OwotICBhbHBoYSotKi1saW51eGVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjY0X2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4LWdudSogfCBhbHBoYSotKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9hbHBoYV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotKnZtcyopCi0gICAgdGFyZ19kZWZ2ZWM9dm1zX2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSNlbmRpZiAvKiBCRkQ2NCAqLwotCi0gIGFyYy0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FyY192ZWMKLSAgICA7OwotCi0gIGFybS0qLW5ldGJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtbmV0YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhcm0tKi1yaXNjaXgqKQotICAgIHRhcmdfZGVmdmVjPXJpc2NpeF92ZWMKLSAgICA7OwotICBhcm0tZXBvYy1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZV9iaWdfdmVjIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjIGFybV9lcG9jX3BlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT1ubwotICAgIDs7Ci0gIGFybS0qLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1wZV9saXR0bGVfdmVjIGFybXBlX2JpZ192ZWMgYXJtcGVpX2xpdHRsZV92ZWMgYXJtcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGFybS0qLWFvdXQgfCBhcm1lbC0qLWFvdXQpCQotICAgIHRhcmdfZGVmdmVjPWFvdXRfYXJtX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YW91dF9hcm1fYmlnX3ZlYwotICAgIDs7Ci0gIGFybWViLSotYW91dCkKLSAgICB0YXJnX2RlZnZlYz1hb3V0X2FybV9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFvdXRfYXJtX2xpdHRsZV92ZWMKLSAgICA7OwotICBhcm0tKi1jb2ZmKQotICAgIHRhcmdfZGVmdmVjPWFybWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hcm1jb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYXJtLSotZWxmIHwgYXJtKi0qLWxpbnV4LWdudSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIGFybS0qLW9hYmkpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0gICAgOzsKLQotICB0aHVtYi0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICB0aHVtYi0qLW9hYmkpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0gICAgOzsKLSAgdGh1bWItKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV92ZWMKLSAgICA7OwotICB0aHVtYi1lcG9jLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1fZXBvY19wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1fZXBvY19wZV9saXR0bGVfdmVjIGFybV9lcG9jX3BlX2JpZ192ZWMgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPW5vCi0gICAgOzsKLSAgdGh1bWItKi1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtcGVfbGl0dGxlX3ZlYyBhcm1wZV9iaWdfdmVjIGFybXBlaV9saXR0bGVfdmVjIGFybXBlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzdHJvbmdhcm0tKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV92ZWMKLSAgICA7OwotICBzdHJvbmdhcm0tKi1jb2ZmKQotICAgIHRhcmdfZGVmdmVjPWFybWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hcm1jb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBhMjlrLSotZWJtb24qIHwgYTI5ay0qLXVkaSogfCBhMjlrLSotY29mZiogfCBhMjlrLSotc3ltMSogfCBcCi0gIGEyOWstKi12eHdvcmtzKiB8IGEyOWstKi1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1hMjlrY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYTI5ay0qLWFvdXQqIHwgYTI5ay0qLWJzZCogfCBhMjlrLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGMzMC0qLSphb3V0KiB8IHRpYzMwLSotKmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXRpYzMwX2FvdXRfdmVjCi0gICAgOzsKLSAgYzMwLSotKmNvZmYqIHwgdGljMzAtKi0qY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9dGljMzBfY29mZl92ZWMKLSAgICA7OwotCi0gIGQxMHYtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9kMTB2X3ZlYwotICAgIDs7Ci0KLSAgZDMwdi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2QzMHZfdmVjCi0gICAgOzsKLQotICBmcjMwLSotZWxmKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9mcjMwX3ZlYwotICAgIDs7Ci0KLQotICBoODMwMCotKi0qKQotICAgIHRhcmdfZGVmdmVjPWg4MzAwY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBoODUwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9aDg1MDBjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGhwcGEqLSotKmVsZiogfCBocHBhKi0qLWxpbnV4LWdudSogfCBocHBhKi0qLWxpdGVzKiB8IGhwcGEqLSotc3lzdjQqIHwgaHBwYSotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0gIGhwcGEqLSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9ocHBhX3ZlYwotICAgIDs7Ci0gIGhwcGEqLSotaHB1eCogfCBocHBhKi0qLWhpdXgqIHwgaHBwYSotKi1tcGVpeCopCi0gICAgdGFyZ19kZWZ2ZWM9c29tX3ZlYwotICAgIDs7Ci0gIGhwcGEqLSotb3NmKikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9ocHBhX3ZlYwotICAgIDs7Ci0jZW5kaWYgLyogZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpICovCi0KLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqY29mZikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc3lzdjQqIHwgaVszNDU2XTg2LSotdW5peHdhcmUqIHwgaVszNDU2XTg2LSotc29sYXJpczIqIHwgXAotICBpWzM0NTZdODYtKi1lbGYgfCBpWzM0NTZdODYtKi1zY28zLjJ2NSogfCBcCi0gIGlbMzQ1Nl04Ni0qLWRndXgqIHwgaVszNDU2XTg2LSotc3lzdjUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1ydGVtc2VsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2Y29mZl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqIHwgaVszNDU2XSotKi1nbzMyKiB8IGlbMzQ1Nl04Ni1nbzMyLXJ0ZW1zKiApCi0gICAgdGFyZ19kZWZ2ZWM9Z28zMmNvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJnbzMyc3R1YmJlZGNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2KiB8IGlbMzQ1Nl04Ni0qLWlzYyogfCBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotY29mZiB8IFwKLSAgaVszNDU2XTg2LSotYWl4KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2kzODZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotIGlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmR5bml4X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWZyZWVic2Rhb3V0KiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdLiogfCBcCi0gIGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdKQotICAgIHRhcmdfZGVmdmVjPWkzODZmcmVlYnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1mcmVlYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4NmNvZmZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbmV0YnNkKiB8IGlbMzQ1Nl04Ni0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZuZXRic2RfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfaTM4Nl92ZWMgaTM4NmNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1saW51eCphb3V0KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2bGludXhfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bHlueF9jb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2bHlueF9hb3V0X3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbWFjaCogfCBpWzM0NTZdODYtKi1vc2YxbWsqKQotICAgIHRhcmdfZGVmdmVjPWkzODZtYWNoM192ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotb3M5aykKLSAgICB0YXJnX2RlZnZlYz1pMzg2b3M5a192ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2RvcyopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmFvdXRfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZtc2Rvc192ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tb3NzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZtc2Rvc192ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3NwZSopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NnBlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zZWxmKiB8IGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1pbnRlcml4KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2cGVpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyIKLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIGNoZWNrZWQgYXQgcnVudGltZS4KLSAgICB0YXJnX2NmbGFncz0tRFNUUklDVF9QRV9GT1JNQVQKLSAgICA7OwotICBpWzM0NTZdODYtKi1taW5ndzMyKiB8IGlbMzQ1Nl04Ni0qLWN5Z3dpbiogfCBpWzM0NTZdODYtKi13aW5udCB8IGlbMzQ1Nl04Ni0qLXBlKQotICAgIHRhcmdfZGVmdmVjPWkzODZwZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZwZV92ZWMgaTM4NnBlaV92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LW5vbmUtKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1hb3V0KiB8IGlbMzQ1Nl04NiotKi12c3RhKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqIHwgaTg2MC0qLWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPWk4NjBjb2ZmX3ZlYwotICAgIDs7Ci0gIGk4NjAtKi1zeXN2NCogfCBpODYwLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTg2MF92ZWMKLSAgICA7OwotCi0gIGk5NjAtKi12eHdvcmtzNCogfCBpOTYwLSotdnh3b3JrczUuMCkKLSAgICB0YXJnX2RlZnZlYz1iX291dF92ZWNfbGl0dGxlX2hvc3QKLSAgICB0YXJnX3NlbHZlY3M9ImJfb3V0X3ZlY19iaWdfaG9zdCBpY29mZl9saXR0bGVfdmVjIGljb2ZmX2JpZ192ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi12eHdvcmtzNS4qIHwgaTk2MC0qLWNvZmYqIHwgaTk2MC0qLXN5c3YqIHwgaTk2MC0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1pY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpY29mZl9iaWdfdmVjIGJfb3V0X3ZlY19saXR0bGVfaG9zdCBiX291dF92ZWNfYmlnX2hvc3QgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi12eHdvcmtzKiB8IGk5NjAtKi1hb3V0KiB8IGk5NjAtKi1ib3V0KiB8IGk5NjAtKi1uaW5keSopCi0gICAgdGFyZ19kZWZ2ZWM9Yl9vdXRfdmVjX2xpdHRsZV9ob3N0Ci0gICAgdGFyZ19zZWx2ZWNzPSJiX291dF92ZWNfYmlnX2hvc3QgaWNvZmZfbGl0dGxlX3ZlYyBpY29mZl9iaWdfdmVjIGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpOTYwLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTk2MF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Imljb2ZmX2xpdHRsZV92ZWMgaWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotCi0gIG0zMnItKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tMzJyX3ZlYwotICAgIDs7Ci0KLSAgbTY4Ki1hcG9sbG8tKikKLSAgICB0YXJnX2RlZnZlYz1hcG9sbG9jb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotYnVsbC1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZnVuX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLW1vdG9yb2xhLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPW02OGtzeXN2Y29mZl92ZWMKLSAgICA7OwotICBtNjgqLWhwLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aHAzMDBic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1hb3V0KikKLSAgICB0YXJnX2RlZnZlYz1hb3V0MF9iaWdfdmVjCi0gICAgIyBXZSBpbmNsdWRlIGNpc2NvX2NvcmVfYmlnX3ZlYyBoZXJlLCByYXRoZXIgdGhhbiBtYWtpbmcgYSBzZXBhcmF0ZSBjaXNjbwotICAgICMgY29uZmlndXJhdGlvbiwgc28gdGhhdCBjaXNjby1jb3JlLmMgZ2V0cyByb3V0aW5lbHkgdGVzdGVkIGF0Ci0gICAgIyBsZWFzdCBmb3IgY29tcGlsYXRpb24uCi0gICAgdGFyZ19zZWx2ZWNzPSJjaXNjb19jb3JlX2JpZ192ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1lbGYqIHwgbTY4Ki0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyBpZWVlX3ZlYyIKLSAgICA7OwotICBtNjgqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyBpZWVlX3ZlYyBhb3V0MF9iaWdfdmVjIgotICAgIDs7Ci0gIG02OCotKi1jb2ZmKiB8IG02OCotKi1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgaWVlZV92ZWMiCi0gICAgOzsKLSAgbTY4Ki0qLWhwdXgqKQotICAgIHRhcmdfZGVmdmVjPWhwMzAwaHB1eF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPW02OGtsaW51eF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrbGludXhfdmVjCi0gICAgOzsKLSAgbTY4Ki0qLWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgIyB0YXJnX3NlbHZlY3M9bTY4a21hY2gzX3ZlYwotICAgICMgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbTY4Ki0qLWx5bnhvcyopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2x5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTY4a2x5bnhfYW91dF92ZWMKLSAgICA7OwotICBtNjgqLWhwKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPW02OGs0a25ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtuZXRic2RfdmVjIGhwMzAwYnNkX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrbmV0YnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4azRrbmV0YnNkX3ZlYyBocDMwMGJzZF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLXN1bm9zKiB8IG02OCotKi1vczY4ayogfCBtNjgqLSotdnh3b3JrcyogfCBtNjgqLW5ldHgtKiB8IFwKLSAgbTY4Ki0qLWJzZCogfCBtNjgqLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLWVyaWNzc29uLSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyB0ZWtoZXhfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLWNibS0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrY29mZl92ZWMKLSAgICA7OwotICBtNjgqLWFwcGxlLWF1eCopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2F1eF9jb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotKi1wc29zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9aWVlZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtODgqLWhhcnJpcy1jeHV4KiB8IG04OCotKi1kZ3V4KiB8IG04OCotKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX204OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW04OGtiY3NfdmVjCi0gICAgOzsKLSAgbTg4Ki0qLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1tODhrbWFjaDNfdmVjCi0gICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbTg4Ki0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9bTg4a2Jjc192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtY29yZS0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWNvcmUtKi1wZSkKLSAgICB0YXJnX2RlZnZlYz1tY29yZV9wZV9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtY29yZV9wZV9iaWdfdmVjIG1jb3JlX3BlX2xpdHRsZV92ZWMgbWNvcmVfcGVpX2JpZ192ZWMgbWNvcmVfcGVpX2xpdHRsZV92ZWMiCi0gICAgOzsKLQotICBtaXBzKi1iaWctKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzLWRlYy1uZXRic2QqIHwgbWlwcyplbCotKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGVjb2ZmX2xpdHRsZV92ZWMgZWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotIG1pcHMqLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotZGVjLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbWlwcyotZGVjLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1hb3V0X21pcHNfbGl0dGxlX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG1pcHMqLWRlYy0qIHwgbWlwcyplbC0qLWVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2JpZ192ZWMKLSAgICA7OwotICBtaXBzKi0qLWVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKi0qLWlyaXg2KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotICBtaXBzKi1zZ2ktKiB8IG1pcHMqLSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKi0qLWxuZXdzKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdsaXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1tYWNoMyopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICA7OwotICBtaXBzKi0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2KiB8IG1pcHMqLSotcmlzY29zKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKmVsLSotZWxmKiB8IG1pcHMqZWwtKi1ydGVtcyogfCBtaXBzKmVsLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLWVsZiogfCBtaXBzKi0qLXJ0ZW1zKiB8IG1pcHMqLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLW5vbmUpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKmVsKi0qLWxpbnV4LWdudSogfCBtaXBzKmVsKi0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgZWNvZmZfbGl0dGxlX3ZlYyBlY29mZl9iaWdfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotbGludXgtZ251KiB8IG1pcHMqLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLQotICBtbjEwMjAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbW4xMDIwMF92ZWMKLSAgICA7OwotCi0gIG1uMTAzMDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tbjEwMzAwX3ZlYwotICAgIDs7Ci0KLSAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopCi0gICAgdGFyZ19kZWZ2ZWM9cGM1MzJtYWNoYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1saXRlcyogfCBuczMyay0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPXBjNTMybmV0YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIHBqLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcGpfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfcGpfdmVjIGJmZF9lbGYzMl9wamxfdmVjIgotICAgIDs7Ci0KLSAgcGpsLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcGpsX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3BqbF92ZWMgYmZkX2VsZjMyX3BqX3ZlYyBiZmRfZWxmMzJfaTM4Nl92ZWMiCi0gICAgOzsKLQotICBwb3dlcnBjLSotYWl4KiB8IHBvd2VycGMtKi1iZW9zKikKLSAgICB0YXJnX2RlZnZlYz1yczYwMDBjb2ZmX3ZlYwotICAgIDs7Ci0gIHBvd2VycGMtKi0qYnNkKiB8IHBvd2VycGMtKi1lbGYqIHwgcG93ZXJwYy0qLXN5c3Y0KiB8IHBvd2VycGMtKi1lYWJpKiB8IFwKLSAgcG93ZXJwYy0qLXNvbGFyaXMyKiB8IHBvd2VycGMtKi1saW51eC1nbnUqIHwgcG93ZXJwYy0qLXJ0ZW1zKiB8IFwKLSAgcG93ZXJwYy0qLXZ4d29ya3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0icnM2MDAwY29mZl92ZWMgYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMgcHBjYm9vdF92ZWMiCi0gICAgOzsKLSAgcG93ZXJwYy0qLW1hY29zKiB8IHBvd2VycGMtKi1tcHcqKQotICAgIHRhcmdfZGVmdmVjPXBtYWNfeGNvZmZfdmVjCi0gICAgOzsKLSAgcG93ZXJwYy0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfcG93ZXJwY192ZWMgcnM2MDAwY29mZl92ZWMiCi0gICAgOzsKLSAgcG93ZXJwY2xlLSotZWxmKiB8IHBvd2VycGNsZS0qLXN5c3Y0KiB8IHBvd2VycGNsZS0qLWVhYmkqIHwgXAotICBwb3dlcnBjbGUtKi1zb2xhcmlzMiogfCBwb3dlcnBjbGUtKi1saW51eC1nbnUqIHwgcG93ZXJwY2xlLSotdnh3b3JrcyogfFwKLSAgcG93ZXJwY2xlLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJyczYwMDBjb2ZmX3ZlYyBiZmRfZWxmMzJfcG93ZXJwY192ZWMgcHBjYm9vdF92ZWMiCi0gICAgOzsKLQotICBwb3dlcnBjbGUtKi1wZSB8IHBvd2VycGNsZS0qLXdpbm50KiB8IHBvd2VycGNsZS0qLWN5Z3dpbiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX3Bvd2VycGNsZV9wZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9wb3dlcnBjbGVfcGVpX3ZlYyBiZmRfcG93ZXJwY19wZWlfdmVjIGJmZF9wb3dlcnBjbGVfcGVfdmVjIGJmZF9wb3dlcnBjX3BlX3ZlYyIKLSAgICA7OwotCi0gIHJzNjAwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9cnM2MDAwY29mZl92ZWMKLSAgICA7OwotCi0gIHNoLSotZWxmKiB8IHNoLSotcnRlbXNlbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zaF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9zaGxfdmVjIHNoY29mZl92ZWMgc2hsY29mZl92ZWMgc2hjb2ZmX3NtYWxsX3ZlYyBzaGxjb2ZmX3NtYWxsX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc2gtKi0qIHwgc2gtKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9c2hjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ic2hjb2ZmX3ZlYyBzaGxjb2ZmX3ZlYyBzaGNvZmZfc21hbGxfdmVjIHNobGNvZmZfc21hbGxfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIHNwYXJjbGV0LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zcGFyY2xlX2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjODZ4LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyY2xpdGUtKi1lbGYqIHwgc3BhcmM4NngtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICA7OwotICBzcGFyYy0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjLSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJzcGFyY2xpbnV4X3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0gIHNwYXJjLSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY2x5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3BhcmNseW54X2FvdXRfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1uZXRic2QqIHwgc3BhcmMtKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY25ldGJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmMtKi1lbGYqIHwgc3BhcmMtKi1zb2xhcmlzMiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zdW5vc19iaWdfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIDs7Ci0gIHNwYXJjLSotbmV0d2FyZSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSNpZmRlZiBCRkQ2NAotICBzcGFyYzY0LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYzY0LSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc3BhcmNfdmVjIHNwYXJjbGludXhfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSAgc3BhcmM2NC0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgOzsgICAgCi0jZW5kaWYgLyogQkZENjQgKi8KLSAgc3BhcmMqLSotY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9c3BhcmNjb2ZmX3ZlYwotICAgIDs7Ci0gIHNwYXJjKi0qLSogfCBzcGFyYyotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0jaWYgSEFWRV9ob3N0X2FvdXRfdmVjCi0gIHRhaG9lLSotKikKLSAgICB0YXJnX2RlZnZlYz1ob3N0X2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0jZW5kaWYKLQotICB0aWM4MCotKi0qKQotICAgIHRhcmdfZGVmdmVjPXRpYzgwY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotCi0gIHY4NTAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl92ODUwX3ZlYwotICAgIDs7Ci0gIHY4NTBlLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKLSAgICA7OwotICB2ODUwZWEtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl92ODUwX3ZlYwotICAgIDs7Ci0jaWYgSEFWRV9ob3N0X2FvdXRfdmVjCi0gIHZheC0qLWJzZCogfCB2YXgtKi11bHRyaXgqKQotICAgIHRhcmdfZGVmdmVjPWhvc3RfYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSNlbmRpZgotCi0gIHZheCotKi0qdm1zKikKLSAgICB0YXJnX2RlZnZlYz12bXNfdmF4X3ZlYwotICAgIDs7Ci0KLSAgd2UzMmstKi0qKQotICAgIHRhcmdfZGVmdmVjPXdlMzJrY29mZl92ZWMKLSAgICA7OwotCi0gIHc2NS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9dzY1X3ZlYwotICAgIDs7Ci0KLSAgejhrKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9ejhrY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICAqLSotaWVlZSopCi0gICAgdGFyZ19kZWZ2ZWM9aWVlZV92ZWMKLSAgICA7OwotCi0gICotYWRvYmUtKikKLSAgICB0YXJnX2RlZnZlYz1hX291dF9hZG9iZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICAqLXNvbnktKikKLSAgICB0YXJnX2RlZnZlYz1uZXdzb3MzX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gICotdGFuZGVtLSopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWllZWVfdmVjCi0gICAgOzsKLSMgRU5EIE9GIHRhcmdtYXRjaC5oCi0gICopCi0gICAgZWNobyAxPiYyICIqKiogQkZEIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0ICR7dGFyZ30uIgotICAgIGVjaG8gMT4mMiAiKioqIExvb2sgaW4gYmZkL2NvbmZpZy5iZmQgZm9yIHN1cHBvcnRlZCB0YXJnZXRzLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi0jIElmIHdlIHN1cHBvcnQgYW55IEVMRiB0YXJnZXQsIHRoZW4gYXV0b21hdGljYWxseSBhZGQgc3VwcG9ydCBmb3IgdGhlCi0jIGdlbmVyaWMgRUxGIHRhcmdldHMuICBUaGlzIHBlcm1pdHMgYW4gb2JqZHVtcCB3aXRoIHNvbWUgRUxGIHN1cHBvcnQKLSMgdG8gYmUgdXNlZCBvbiBhbiBhcmJpdHJhcnkgRUxGIGZpbGUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4KLSMgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLWNhc2UgIiR7dGFyZ19kZWZ2ZWN9ICR7dGFyZ19zZWx2ZWNzfSIgaW4KLSAgKmJmZF9lbGY2NCopCi0gICAgdGFyZ19zZWx2ZWNzPSIke3Rhcmdfc2VsdmVjc30gYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYyBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYyIKLSAgICA7OwotICAqYmZkX2VsZjMyKikKLSAgICB0YXJnX3NlbHZlY3M9IiR7dGFyZ19zZWx2ZWNzfSBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMiCi0gICAgOzsKLWVzYWMKZGlmZiAtLWdpdCBhL2JmZC9jb25maWcuaW4gYi9iZmQvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmIyYzc4Li4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICAqLwotI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GQ05UTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZkb3BlbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GRE9QRU4KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Z2lkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVEdJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0dWlkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFVJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUFEVklTRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1wcm90ZWN0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01QUk9URUNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0aXRpbWVyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVElUSU1FUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c2NvbmYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1lTQ09ORgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRElSRU5UX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERERUZfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0RJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19GSUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Byb2Nmcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUFJPQ0ZTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBtYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLQotLyogRGVmaW5lIGlmIHJlYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DCi0KLS8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBEZWZpbmUgaWYgZ2V0ZW52IGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJzdGF0dXNfdC4gKi8KLSN1bmRlZiBIQVZFX1BSU1RBVFVTX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnN0YXR1c190LnByX3doby4gKi8KLSN1bmRlZiBIQVZFX1BSU1RBVFVTX1RfUFJfV0hPCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHN0YXR1c190LiAqLwotI3VuZGVmIEhBVkVfUFNUQVRVU19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJwc2luZm9fdC4gKi8KLSN1bmRlZiBIQVZFX1BSUFNJTkZPX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwc2luZm9fdC4gKi8KLSN1bmRlZiBIQVZFX1BTSU5GT19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIGx3cHN0YXR1c190LnByX2NvbnRleHQuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QucHJfcmVnLiAqLwotI3VuZGVmIEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHCi0KLS8qIE5hbWUgb2YgaG9zdCBzcGVjaWZpYyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIHRyYWQtY29yZS5jLiAqLwotI3VuZGVmIFRSQURfSEVBREVSCi0KLS8qIFVzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlPyAqLwotI3VuZGVmIFVTRV9NTUFQCi0KZGlmZiAtLWdpdCBhL2JmZC9jb25maWd1cmUgYi9iZmQvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZGMzMTZkLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw2MzU3ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWxpYmJmZC5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYwOTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MzA6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0ODogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4NjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgNzk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzMzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODQyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg5MzogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI2OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk3OTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDM2OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1iZmQKLQotVkVSU0lPTj0yLjkuNQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA5NTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTA4OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTM0OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMyNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzY2OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzOTA6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5MzogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0Mjk6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDU6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDgzOiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQ2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTUwOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDg6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY2MDogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjg2OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTcyMiAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcyMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3Nzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTY0LWJpdC1iZmQgb3IgLS1kaXNhYmxlLTY0LWJpdC1iZmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfNjRfYml0X2JmZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfNjRfYml0X2JmZCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50NjQ9ZmFsc2UKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbW1hcCBvciAtLXdpdGhvdXQtbW1hcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbW1hcCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9tbWFwIgotICBjYXNlICIke3dpdGh2YWx9IiBpbgotICB5ZXMpICB3YW50X21tYXA9dHJ1ZSA7OwotICBubykgICB3YW50X21tYXA9ZmFsc2UgOzsKLSAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgQkZEIHdpdGgtbW1hcCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50X21tYXA9ZmFsc2UKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDc5OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwMjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEwNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjExODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEzNTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE0NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTY2OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1ob3N0NjQ9ZmFsc2UKLXRhcmdldDY0PWZhbHNlCi0KLSMgaG9zdCBzdHVmZjoKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjA1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjM1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMxODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjMyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM2MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjU6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM5MzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDI3OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0ODI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MDc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI1MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjExOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjg2OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcyNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjczMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzU5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3OTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4OTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5Nzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI5NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMzMDc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzM3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzOTQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzOTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQyMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDU2OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ4OTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTA5OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mjg6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NTU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTgzOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MTg6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjkyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzgzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODU1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMTU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNDM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwNDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgUGVybWl0IGhvc3Qgc3BlY2lmaWMgc2V0dGluZ3MuCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDEzMTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1CRkRfSE9TVF82NEJJVF9MT05HPTAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTAKLUJGRF9IT1NUXzY0X0JJVD0KLUJGRF9IT1NUX1VfNjRfQklUPQotaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgPSAieGxvbmciOyB0aGVuCi0gIEJGRF9IT1NUXzY0QklUX0xPTkc9MQotZWxpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiAhPSAieCI7IHRoZW4KLSAgQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MQotICBCRkRfSE9TVF82NF9CSVQ9JHtIT1NUXzY0QklUX1RZUEV9Ci0gIEJGRF9IT1NUX1VfNjRfQklUPSR7SE9TVF9VXzY0QklUX1RZUEV9Ci1maQotCi0KLQotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi0KLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIxNDogY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2J1aWxkX2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ubwotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfYnVpbGRfZXhlZXh0IiAxPiY2Ci0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi0KLQotZm9yIGFjX2hkciBpbiBzdGRkZWYuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdGltZS5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI0MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQyNTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI4MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyODcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQyOTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMxOTogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl90aW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDMyNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1pbnQgbWFpbigpIHsKLXN0cnVjdCB0bSAqdHA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMzMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfdGltZSIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi1FT0YKLQotZmkKLQotYWNfaGVhZGVyX2RpcmVudD1ubwotZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNTg6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzYzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7Ci1ESVIgKmRpcnAgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNzE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLSMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KLWlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzOTY6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbGRpciIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0Mzc6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHggICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbHgiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gZmNudGwgZ2V0cGFnZXNpemUgc2V0aXRpbWVyIHN5c2NvbmYgZmRvcGVuIGdldHVpZCBnZXRnaWQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0ODE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0ODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cyopCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1NDQ6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NzA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTkxOiBjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBtYWxsb2MKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjE3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2Mzg6IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2NDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgcmVhbGxvYwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Njg1OiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZyZWUKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzMyOiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDczNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzU4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCi1FT0YKLQotZmkKLQotCi0jIElmIHdlIGFyZSBjb25maWd1cmVkIG5hdGl2ZSwgcGljayBhIGNvcmUgZmlsZSBzdXBwb3J0IGZpbGUuCi1DT1JFRklMRT0KLUNPUkVGTEFHPQotVFJBRF9IRUFERVI9Ci1pZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gIGFscGhhKi0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9hbHBoYWxpbnV4LmgiJwotCTs7Ci0gIGFscGhhKi0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIGFscGhhKi0qLSopCQlDT1JFRklMRT1vc2YtY29yZS5sbyA7OwotICBhcm0tKi1yaXNjaXgpCQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaHBwYSotKi1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaGl1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLW1wZWl4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotYnNkKikJCUNPUkVGSUxFPSJocHV4LWNvcmUubG8gaHBwYWJzZC1jb3JlLmxvIgotCQkJQ09SRUZMQUc9Ii1ESFBVWF9DT1JFIC1ESFBQQUJTRF9DT1JFIiA7OwotICBpWzM0NTZdODYtc2VxdWVudC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbzsKLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotICBpWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2YnNkLmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCi0JOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotCUNPUkVGSUxFPXNjbzUtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1pc2MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NnNjby5oIicKLQk7OwotICBpWzM0NTZdODYtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCi0JOzsKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZsaW51eC5oIicKLQk7OwotICBpWzM0NTZdODYtKi1pc2MqKQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaVszNDU2XTg2LSotYWl4KikJQ09SRUZJTEU9YWl4Mzg2LWNvcmUubG8gOzsKLSAgaTg2MC0qLW1hY2gzKiB8IGk4NjAtKi1vc2YxKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2k4NjBtYWNoMy5oIicKLQk7OwotICBtaXBzLWRlYy1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc2JzZC5oIicKLQk7OwotICBtaXBzLWRlYy1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLW5ldGJzZCogfCBtaXBzKi0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbWlwcy1kZWMtKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlY3N0YXRpb24uaCInCi0JOzsKLSAgbWlwcy1zZ2ktaXJpeDQqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDUqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDYqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotc3lzdjQqKQk7OwotICBtaXBzLSotc3lzdiogfCBtaXBzLSotcmlzY29zKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3Jpc2Nvcy5oIicKLQk7OwotICBtaXBzLXNvbnktYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MtbWlwcy5oIicKLQk7OwotICBtNjgqLWJ1bGwqLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZHB4Mi5oIicKLQk7OwotICBtNjgqLWhwLWhwdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgbTY4Ki1ocC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaHAzMDBic2QuaCInCi0JOzsKLSAgbTY4Ki0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrbGludXguaCInCi0JOzsKLSAgbTY4Ki1tb3Rvcm9sYS1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlbHRhNjguaCInCi0JOzsKLSAgbTY4Ki1zb255LSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLmgiJwotCTs7Ci0gIG02OCotKi1uZXRic2QqIHwgbTY4Ki0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbTY4Ki1hcHBsZS1hdXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2F1eC5oIicKLQk7OwotICBtODgqLSotc3lzdjQqKQk7OwotICBtODgqLW1vdG9yb2xhLXN5c3YqKQlDT1JFRklMRT1wdHJhY2UtY29yZS5sbyA7OwotICBtODgqLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTg4a21hY2gzLmgiJwotCTs7Ci0gIG5zMzJrLXBjNTMyLW1hY2gpCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9wYzUzMm1hY2guaCInCi0JOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHJzNjAwMC0qLWx5bngqKQlDT1JFRklMRT1seW54LWNvcmUubG8gOzsKLSAgcnM2MDAwLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLSopCQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotKmJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1iZW9zKikJOzsKLSAgcG93ZXJwYy0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHNwYXJjLSotbmV0YnNkKiB8IHNwYXJjLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICB0YWhvZS0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy90YWhvZS5oIicKLQk7OwotICB2YXgtKi11bHRyaXgyKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheGJzZC5oIicKLQk7OwotICBlc2FjCi0KLSAgY2FzZSAiJENPUkVGSUxFIiBpbgotICBhaXgzODYtY29yZS5sbykJQ09SRUZMQUc9LURBSVgzODZfQ09SRSA7OwotICBocHBhYnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ESFBQQUJTRF9DT1JFIDs7Ci0gIGhwdXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESFBVWF9DT1JFIDs7Ci0gIGlyaXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESVJJWF9DT1JFIDs7Ci0gIGx5bngtY29yZS5sbykJCUNPUkVGTEFHPS1ETFlOWF9DT1JFIDs7Ci0gIG5ldGJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tRE5FVEJTRF9DT1JFIDs7Ci0gIG9zZi1jb3JlLmxvKQkJQ09SRUZMQUc9LURPU0ZfQ09SRSA7OwotICBwdHJhY2UtY29yZS5sbykJQ09SRUZMQUc9LURQVFJBQ0VfQ09SRSA7OwotICByczYwMDAtY29yZS5sbykJQ09SRUZMQUc9IiRDT1JFRkxBRyAtREFJWF9DT1JFIiA7OwotICBzY281LWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EU0NPNV9DT1JFIiA7OwotICB0cmFkLWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EVFJBRF9DT1JFIiA7OwotICBlc2FjCi0KLSAgIyBFTEYgY29yZWZpbGUgc3VwcG9ydCBoYXMgc2V2ZXJhbCBmbGF2b3JzLCBidXQgYWxsIG9mCi0gICMgdGhlbSB1c2Ugc29tZXRoaW5nIGNhbGxlZCA8c3lzL3Byb2Nmcy5oPgotICBmb3IgYWNfaGRyIGluIHN5cy9wcm9jZnMuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5NTk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTY5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5OTc6IGNoZWNraW5nIGZvciBwcnN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTAwMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDA5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAzMTogY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXByc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfd2hvCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA0MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8gPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BSU1RBVFVTX1RfUFJfV0hPIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8iIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDY1OiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXBzdGF0dXNfdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA3NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwOTk6IGNoZWNraW5nIGZvciBwcnBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTEwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnBzaW5mb190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJQU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTEzMzogY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUxMzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHNpbmZvX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNDU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxNjc6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTc5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfY29udGV4dCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyMDE6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9jb250ZXh0IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyMDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotbHdwc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfY29udGV4dAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX3JlZyBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyMzU6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9yZWcgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX3JlZwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyNDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWc9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWciIDE+JjYKLQotICBmaQotZmkKLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUUkFEX0hFQURFUiAkVFJBRF9IRUFERVIKLUVPRgotCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIC1sa2VybmVsMzIiCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLQotCi0jIHRhcmdldCBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotZGVmdmVjPQotc2VsdmVjcz0KLXNlbGFyY2hzPQotVERFRklORVM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvY29uZmlnLmJmZAotCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCi0JICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKLQlmaQotCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0JVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCi0gICAgZmkKLWRvbmUKLQotCi0jIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCi0jIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCi0jIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0Ci0jIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAotIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS1lbmFibGUtdGFyZ2V0cz1hbGwiIGlzCi0jIHVzZWQuCi0KLSMgdW5pcSB0aGUgZGVmYXVsdCBhbmQgc2VsZWN0ZWQgdmVjdG9ycyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWx2ZWNzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbHZlY3M9IiRmIgotCi0KLSMgdW5pcSB0aGUgYXJjaGl0ZWN0dXJlcyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWxhcmNocyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWxhcmNocz0iJGYiCi0KLSMgVGFyZ2V0IGJhY2tlbmQgLm8gZmlsZXMuCi10Yj0KLQotZWxmPSJlbGYubG8gZWxmbGluay5sbyBkd2FyZjIubG8gZHdhcmYxLmxvIgotCi1mb3IgdmVjIGluICRzZWx2ZWNzCi1kbwotICAgIGNhc2UgIiR2ZWMiIGluCi0gICAgIyBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlCi0gICAgIyB3aXRoIHRoZSB0d28gdmVjdG9yIGxpc3RzIGluIHRhcmdldHMuYy4KLSAgICBhMjlrY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWEyOWsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYV9vdXRfYWRvYmVfdmVjKQkJdGI9IiR0YiBhb3V0LWFkb2JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhcm1jb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1jb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1uZXRic2RfdmVjKQkJdGI9IiR0YiBhcm1uZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFybXBlX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKLSAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYWxwaGFfdmVjKQl0Yj0iJHRiIGVsZjY0LWFscGhhLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k5NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pOTYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3BqX3ZlYykgICAgICAgICAgIHRiPSIkdGIgZWxmMzItcGoubG8gZWxmMzIubG8gJGVsZiI7OwotICAgIGJmZF9lbGYzMl9wamxfdmVjKSAgICAgICAgICB0Yj0iJHRiIGVsZjMyLXBqLmxvIGVsZjMyLmxvICRlbGYiOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY192ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3NoX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zaGxfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NwYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1zcGFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl92ODUwX3ZlYykJCXRiPSIkdGIgZWxmMzItdjg1MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjY0LXNwYXJjLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGNpc2NvX2NvcmVfYmlnX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBjaXNjb19jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OwotICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZsaW51eF92ZWMpCQl0Yj0iJHRiIGkzODZsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIGkzODZseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLWkzODZseW54LmxvIGNvZmZsaW5rLmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBpMzg2bWFjaDNfdmVjKQkJdGI9IiR0YiBpMzg2bWFjaDMubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZuZXRic2RfdmVjKQkJdGI9IiR0YiBpMzg2bmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2b3M5a192ZWMpCQl0Yj0iJHRiIGkzODZvczlrLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpODYwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTg2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1pOTYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGllZWVfdmVjKQkJCXRiPSIkdGIgaWVlZS5sbyIgOzsKLSAgICBtNjhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrY29mZnVuX3ZlYykJCXRiPSIkdGIgY29mZi11NjhrLmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrbGludXhfdmVjKQkJdGI9IiR0YiBtNjhrbGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBtNjhrbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1tNjhrbHlueC5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIG02OGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrNGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrNGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGthdXhfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXV4LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrc3lzdmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXN2bTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtODhrYmNzX3ZlYykJCXRiPSIkdGIgY29mZi1tODhrLmxvIiA7OwotICAgIG1jb3JlX3BlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZWktbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG5ld3NvczNfdmVjKQkJdGI9IiR0YiBuZXdzb3MzLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBubG0zMl9pMzg2X3ZlYykJCXRiPSIkdGIgbmxtMzItaTM4Ni5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgbmxtMzJfc3BhcmNfdmVjKQkJdGI9IiR0YiBubG0zMi1zcGFyYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgbmxtMzJfYWxwaGFfdmVjKQkJdGI9IiR0YiBubG0zMi1hbHBoYS5sbyBubG0zMi5sbyBubG0ubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHJpc2NpeF92ZWMpCQkJdGI9IiR0YiBhb3V0MzIubG8gcmlzY2l4LmxvIiA7OwotICAgIG5sbTMyX3Bvd2VycGNfdmVjKQkJdGI9IiR0YiBubG0zMi1wcGMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIHBjNTMybmV0YnNkX3ZlYykJCXRiPSIkdGIgbnMzMmtuZXRic2QubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwYzUzMm1hY2hhb3V0X3ZlYykJCXRiPSIkdGIgcGM1MzItbWFjaC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBtYWNfeGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXBtYWMubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIHJzNjAwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXJzNjAwMC5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNfcGVfdmVjKSAgICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjKSAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7ICAKLSAgICBiZmRfcG93ZXJwY19wZWlfdmVjKSAgICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY2xlX3BlaV92ZWMpICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBwcGNib290X3ZlYykJCXRiPSIkdGIgcHBjYm9vdC5sbyIgOzsKLSAgICBzaGNvZmZfdmVjKQkJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNvbV92ZWMpCQkJdGI9IiR0YiBzb20ubG8iIDs7Ci0gICAgc3BhcmNsZV9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC1zcGFyY2xlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2xpbnV4X3ZlYykJCXRiPSIkdGIgc3BhcmNsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBzcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLXNwYXJjbHlueC5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgc3BhcmNuZXRic2RfdmVjKQkJdGI9IiR0YiBzcGFyY25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zcGFyYy5sbyIgOzsKLSAgICBzcmVjX3ZlYykJCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgc3Vub3NfYmlnX3ZlYykJCXRiPSIkdGIgc3Vub3MubG8gYW91dDMyLmxvIiA7OwotICAgIHN5bWJvbHNyZWNfdmVjKQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHRla2hleF92ZWMpCQkJdGI9IiR0YiB0ZWtoZXgubG8iIDs7Ci0gICAgdGljMzBfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtdGljMzAubG8iIDs7Ci0gICAgdGljMzBfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljMzAubG8iIDs7Ci0gICAgdGljODBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWM4MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICB2ZXJzYWRvc192ZWMpCQl0Yj0iJHRiIHZlcnNhZG9zLmxvIiA7OwotICAgIHZtc19hbHBoYV92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIKLSAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHZtc192YXhfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iIDs7Ci0gICAgdzY1X3ZlYykJCQl0Yj0iJHRiIGNvZmYtdzY1LmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgd2UzMmtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi13ZTMyay5sbyIgOzsKLSAgICB6OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi16OGsubG8gcmVsb2MxNi5sbyIgOzsKLQotICAgICIiKQkJCTs7Ci0gICAgKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAqKiogdW5rbm93biB0YXJnZXQgdmVjdG9yICR2ZWMiIDE+JjI7IGV4aXQgMTsgfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IFlvdSBoYXZlIHJlcXVlc3RlZCBhIDY0IGJpdCBCRkQgY29uZmlndXJhdGlvbiwgYnV0IiAxPiYyCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IHlvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGUiIDE+JjIKLSAgICBmaQotICAgIDs7Ci0gIGZhbHNlLWZhbHNlLWZhbHNlKQotICAgIHdvcmRzaXplPTMyCi0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDMyX0JBQ0tFTkRTKScKLSAgICA7OwotZXNhYwotCi0KLQotCi0KLQotdGRlZmF1bHRzPSIiCi10ZXN0IC1uICIke2RlZnZlY30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EREVGQVVMVF9WRUNUT1I9JHtkZWZ2ZWN9IgotdGVzdCAtbiAiJHtzZWx2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfVkVDUz0nJHtzZWx2ZWNzfSciCi10ZXN0IC1uICIke3NlbGFyY2hzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfQVJDSElURUNUVVJFUz0nJHtzZWxhcmNoc30nIgotdGVzdCAtbiAiJHtoYXZldmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9ICR7aGF2ZXZlY3N9IgotCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjAwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTYwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NTYxMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjM5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NjQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2Njc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2OTI6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU3MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4NDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi1mb3IgYWNfZnVuYyBpbiBtYWR2aXNlIG1wcm90ZWN0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1ODY1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1ODcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4OTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWNhc2UgJHt3YW50X21tYXB9KyR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZH0gaW4KLSAgdHJ1ZSt5ZXMgKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9NTUFQIDEKLUVPRgotIDs7Ci1lc2FjCi0KLXJtIC1mIGRvYy9jb25maWcuc3RhdHVzCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEJGRF9IT1NUXzY0QklUX0xPTkdAJSRCRkRfSE9TVF82NEJJVF9MT05HJWcKLXMlQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCUkQkZEX0hPU1RfNjRfQklUX0RFRklORUQlZwotcyVAQkZEX0hPU1RfNjRfQklUQCUkQkZEX0hPU1RfNjRfQklUJWcKLXMlQEJGRF9IT1NUX1VfNjRfQklUQCUkQkZEX0hPU1RfVV82NF9CSVQlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKLXMlQENPUkVGSUxFQCUkQ09SRUZJTEUlZwotcyVAQ09SRUZMQUdAJSRDT1JFRkxBRyVnCi1zJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZwotcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCi1zJUBUREVGSU5FU0AlJFRERUZJTkVTJWcKLXMlQHdvcmRzaXplQCUkd29yZHNpemUlZwotcyVAYWxsX2JhY2tlbmRzQCUkYWxsX2JhY2tlbmRzJWcKLXMlQGJmZF9iYWNrZW5kc0AlJGJmZF9iYWNrZW5kcyVnCi1zJUBiZmRfbWFjaGluZXNAJSRiZmRfbWFjaGluZXMlZwotcyVAdGRlZmF1bHRzQCUkdGRlZmF1bHRzJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5jb20gYi9iZmQvY29uZmlndXJlLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5OTc3Yy4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0kIQotJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotJCEKLSQhIFdlIGRvIG5vdCB1c2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNpbmNlIHdlIGRvIG5vdCBoYXZlIC9iaW4vc2gKLSQhIHRvIGV4ZWN1dGUgaXQuCi0kIQotJCEgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotJCEKLSRhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkgICAgICAhIHZheD09MSwgYWxwaGE9PTIKLSRhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQhCi0kaWYgYXJjaCAuZXFzLiAiQWxwaGEiCi0kdGhlbgotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBmb3IgQWxwaGEgdGFyZ2V0IgotJCB0YXJnZXQgPSAiYWxwaGEiCi0kIQotJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwotJCEKLSQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQotICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKLSRERUNLCi0hCi0hICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKLSEKLSEKLSAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgIkNPTkZJR1VSRS5JTiIpOwotICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0FNX0lOSVRfQVVUT01BS0UoYmZkLCAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKLSAgIEVMU0U7Ci0gICAgIHZlcnMgOj0gInVua25vd24iOwotICAgRU5ESUY7Ci0KLSAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKLQotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAVkVSU0lPTkAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCh2ZXJzKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzY0Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzAnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ19fREVDQycpOwotICAgICAgU1BMSVRfTElORTsKLSAgICAgIENPUFlfVEVYVCgnI2luY2x1ZGUgPGludHMuaD4nKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9VXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgndWludDY0Jyk7Ci0gICBFTkRJRjsKLSAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7Ci0gICBRVUlUCi0kICBFT0QKLSQKLSRlbHNlCi0kCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIGZvciBWYXggdGFyZ2V0IgotJCB0YXJnZXQgPSAidmF4IgotJCEKLSQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKLSQhCi0kIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KLSAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCi0kREVDSwotIQotISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCi0hCi0hCi0gICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0KLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQodmVycyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCczMicpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCcwJyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKLSAgICAgIFNQTElUX0xJTkU7Ci0gICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kZW5kaWYKLSQKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGBiZmQuaCcgZnJvbSBgYmZkLWluMi5oJy4iCi0kIQotJCEKLSQhIGNyZWF0ZSB0YXJnbWF0Y2guaAotJCEKLSQgb3Blbi93cml0ZSB0ZmlsZSBbXXRhcmdtYXRjaC5oCi0kIHdyaXRlIHRmaWxlICJ7ICIiIiArIHRhcmdldCArICItKi0qdm1zKiIiIiArICIsIgotJCB3cml0ZSB0ZmlsZSAiI2lmIGRlZmluZWQgKFNFTEVDVF9WRUNTKSIKLSQgd3JpdGUgdGZpbGUgIlNFTEVDVF9WRUNTIgotJCB3cml0ZSB0ZmlsZSAiI2Vsc2UiCi0kIHdyaXRlIHRmaWxlICJVTlNVUFBPUlRFRF9UQVJHRVQiCi0kIHdyaXRlIHRmaWxlICIjZW5kaWYiCi0kIHdyaXRlIHRmaWxlICJ9LCIKLSQgY2xvc2UgdGZpbGUKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGB0YXJnbWF0Y2guaCciCi0kIQotJCEKLSQhIGNyZWF0ZSBjb25maWcuaAotJCEKLSQgY3JlYXRlIFtdY29uZmlnLmgKLS8qIGNvbmZpZy5oLXZtcy4gIEdlbmVyYXRlZCBieSBoYW5kIGJ5IEtsYXVzIEvkbXBmLCBra2FlbXBmQGRpZHltdXMucm1pLmRlLiAgKi8KLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotLyogV2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwotLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DICovCi0vKiBXaGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwotLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRSAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotLyogI2RlZmluZSBIQVZFX01NQVAgMSAqLwotLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi0vKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwotLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICAqLwotLyogI3VuZGVmIFRSQURfSEVBREVSICovCi0vKiBEZWZpbmUgb25seSBpZiA8c3lzL3Byb2Nmcy5oPiBpcyBhdmFpbGFibGUgKmFuZCogaXQgZGVmaW5lcyBwcnN0YXR1c190LiAgKi8KLS8qICN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSCAqLwotLyogRG8gd2UgcmVhbGx5IHdhbnQgdG8gdXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICAqLwotLyogI3VuZGVmIFVTRV9NTUFQICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX01BRFZJU0UgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtcHJvdGVjdCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfTVBST1RFQ1QgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERERUZfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1RJTUVfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLSQhCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgY29uZmlnLmgnIgotCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmhvc3QgYi9iZmQvY29uZmlndXJlLmhvc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNGNkNjAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5ob3N0CisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBvdmVycmlkZXMgc29tZSBvZiB0aGUgdG9vbHMgYW5kCi0jIGZsYWdzIHVzZWQgb24gYSBob3N0IHNwZWNpZmljIGJhc2lzLgotCi0jIFNpbmNlIHRoZSAiYmZkL2hvc3RzIiBkaXJlY3RvcnkgaXMgc2hhcmVkIGJ5IHRoZSBiZmQsIG9wY29kZXMsIGFuZAotIyBiaW51dGlscyBkaXJlY3RvcmllcyAoYXQgbGVhc3QpLCB0aGUgaW5kZXggdG8gaXQgaXMgYWxzbyBzaGFyZWQuCi0jIFRoaXMgaXMgdGhhdCBpbmRleC4gIEVhY2ggY29uZmlndXJlLmluIGZpbGUgc2hvdWxkIHNvdXJjZSB0aGlzIGZpbGUKLSMgaW4gaXRzIHBlci1ob3N0IHBhcnQuCi0KLSMgVGhpcyBzZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgSERFRklORVMJCWhvc3Qgc3BlY2lmaWMgY29tcGlsZXIgb3B0aW9ucwotIyAgaG9zdDY0CQlzZXQgdG8gdHJ1ZSBpZiA2NCBiaXQgdHlwZXMgYXJlIGFzIGZhc3QgYXMgMzIgYml0Ci0jICBIT1NUXzY0QklUX1RZUEUJaG9zdCA2NCBiaXQgdHlwZQotIyAgSE9TVF9VXzY0QklUX1RZUEUJdW5zaWduZWQgNjQgYml0IHR5cGUgKG5vdCBuZWVkZWQgaWYgNjRCSVRfVFlQRSBpcyBsb25nKQotCi1IREVGSU5FUz0KLWhvc3Q2ND1mYWxzZQotSE9TVF82NEJJVF9UWVBFPQotSE9TVF9VXzY0QklUX1RZUEU9Ci0KLWNhc2UgIiR7aG9zdH0iIGluCi0KLWFscGhhKi0qLSopCQlob3N0NjQ9dHJ1ZTsgSE9TVF82NEJJVF9UWVBFPWxvbmcgOzsKLQotaHBwYSotKi1ocHV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OwotaHBwYSotKi1oaXV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OwotaHBwYSotKi1tcGVpeCopCQlIREVGSU5FUz0tREhPU1RfSFBQQU1QRUlYIDs7Ci1ocHBhKi0qLWJzZCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUJTRCA7OwotaHBwYSotKi1vc2YqKQkJSERFRklORVM9LURIT1NUX0hQUEFPU0YgOzsKLQotaVszNDU2XTg2LXNlcXVlbnQtYnNkKikJSERFRklORVM9LURzaGFyZWQ9Z2Vuc2hhcmVkIDs7Ci1pWzM0NTZdODYtc2VxdWVudC1zeXN2NCopIDs7Ci1pWzM0NTZdODYtc2VxdWVudC1zeXN2KikJSERFRklORVM9LURzaGFyZWQ9Z2Vuc2hhcmVkIDs7Ci0KLW1pcHMqLWRlYy1uZXRic2QqKQk7OwotbWlwcyotKi1vcGVuYnNkKikJOzsKLW1pcHMqLWRlYy0qKQkJSERFRklORVM9Ii1HIDQiCTs7Ci1taXBzKi1zZ2ktaXJpeDMqKQlIREVGSU5FUz0iLUcgNCIgOzsKLW1pcHMqLXNnaS1pcml4NCopCUhERUZJTkVTPSItRyA0IiA7OwotbWlwcyotc2dpLWlyaXg2KikJaG9zdDY0PXRydWUKLQkJCUhPU1RfNjRCSVRfVFlQRT0ibG9uZyBsb25nIjsKLQkJCUhPU1RfVV82NEJJVF9UWVBFPSJ1bnNpZ25lZCBsb25nIGxvbmciOwotCQkJOzsKLW1pcHMqLSotc3lzdjQqKQkJOzsKLW1pcHMqLSotc3lzdiopCQlIREVGSU5FUz0iLUcgNCIgOzsKLW1pcHMqLSotcmlzY29zKikJSERFRklORVM9Ii1HIDQiIDs7Ci0KLW02OCotaHAtaHB1eCopCQlIREVGSU5FUz0tREhPU1RfSFAzMDBIUFVYIDs7Ci0KLSotKi1zb2xhcmlzKikJCUhPU1RfNjRCSVRfVFlQRT0ibG9uZyBsb25nIgotCQkJSE9TVF9VXzY0QklUX1RZUEU9InVuc2lnbmVkIGxvbmcgbG9uZyIKLQkJCTs7Ci0KLSotKi13aW5kb3dzKikKLQkJCUhPU1RfNjRCSVRfVFlQRT1fX2ludDY0Ci0JCQlIT1NUX1VfNjRCSVRfVFlQRT0idW5zaWduZWQgX19pbnQ2NCIKLSMgVGhlIGZvbGxvd2luZyBrcm9jayBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBjYW4ndCBydW4gdGhlIGJ1aWxkIGNvbXBpbGVyCi0jIChNU1ZDKSBvbiB0aGUgY29uZmlndXJlIGhvc3QsIHNvIHdlIGhhdmUgdG8gZXhwbGljaXRseSBzZXQgdGhlIHZhbHVlcyBoZXJlLgotIyBOb3RlIHRoYXQgdGhpcyBmaWxlIGlzIG5ldmVyIHJ1biB0aHJvdWdoIGF1dG9jb25mLCBzbyB3ZSBjYW4ndCB1c2UgYW55Ci0jIGF1dG9jb25mIG1hY3JvcyBoZXJlLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBoYXZlIHRvIG11Y2sgd2l0aCBhdXRvY29uZgotIyB2YXJpYWJsZXMgZXhwbGljaXRseS4KLQkJCWFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLQkJCWFjX2N2X2hlYWRlcl90aW1lPW5vCi0JCQlhY19jdl9mdW5jX2dldHBhZ2VzaXplPW5vCi0JCQlhY19jdl9mdW5jX21hZHZpc2U9bm8KLQkJCWFjX2N2X2Z1bmNfbXByb3RlY3Q9bm8KLQkJCWFjX2N2X2Z1bmNfZ2V0dWlkPW5vCi0JCQlhY19jdl9mdW5jX2dldGdpZD1ubwotCQkJYWNfY3ZfaGVhZGVyX3N5c19maWxlX2g9bm8KLQkJCWFjX2N2X2hlYWRlcl9zeXNfdGltZV9oPW5vCi0JCQlhY19jdl9oZWFkZXJfdW5pc3RkX2g9bm8KLQkJCTs7Ci1lc2FjCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmluIGIvYmZkL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3NmMzYS4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChsaWJiZmQuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotQUNfSVNDX1BPU0lYCi0KLUFNX0lOSVRfQVVUT01BS0UoYmZkLCAyLjkuNSkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLUFNX0RJU0FCTEVfU0hBUkVECi0KLUFNX1BST0dfTElCVE9PTAotCi1BQ19BUkdfRU5BQkxFKDY0LWJpdC1iZmQsCi1bICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbikgOzsKLWVzYWNdLFt3YW50NjQ9ZmFsc2VdKWRubAotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi1BQ19BUkdfV0lUSChtbWFwLAotWyAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGVdLAotW2Nhc2UgIiR7d2l0aHZhbH0iIGluCi0gIHllcykgIHdhbnRfbW1hcD10cnVlIDs7Ci0gIG5vKSAgIHdhbnRfbW1hcD1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEJGRCB3aXRoLW1tYXAgb3B0aW9uKSA7OwotZXNhY10sW3dhbnRfbW1hcD1mYWxzZV0pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLUFDX0FSR19QUk9HUkFNCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLWhvc3Q2ND1mYWxzZQotdGFyZ2V0NjQ9ZmFsc2UKLQotIyBob3N0IHN0dWZmOgotCi1BQ19QUk9HX0NDCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotIyBQZXJtaXQgaG9zdCBzcGVjaWZpYyBzZXR0aW5ncy4KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQUNfUFJPR19JTlNUQUxMCi0KLUJGRF9IT1NUXzY0QklUX0xPTkc9MAotQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MAotQkZEX0hPU1RfNjRfQklUPQotQkZEX0hPU1RfVV82NF9CSVQ9Ci1pZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiA9ICJ4bG9uZyI7IHRoZW4KLSAgQkZEX0hPU1RfNjRCSVRfTE9ORz0xCi1lbGlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iICE9ICJ4IjsgdGhlbgotICBCRkRfSE9TVF82NF9CSVRfREVGSU5FRD0xCi0gIEJGRF9IT1NUXzY0X0JJVD0ke0hPU1RfNjRCSVRfVFlQRX0KLSAgQkZEX0hPU1RfVV82NF9CSVQ9JHtIT1NUX1VfNjRCSVRfVFlQRX0KLWZpCi1BQ19TVUJTVChCRkRfSE9TVF82NEJJVF9MT05HKQotQUNfU1VCU1QoQkZEX0hPU1RfNjRfQklUX0RFRklORUQpCi1BQ19TVUJTVChCRkRfSE9TVF82NF9CSVQpCi1BQ19TVUJTVChCRkRfSE9TVF9VXzY0X0JJVCkKLQotQkZEX0NDX0ZPUl9CVUlMRAotCi1BQ19DSEVDS19IRUFERVJTKHN0ZGRlZi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB0aW1lLmggdW5pc3RkLmgpCi1BQ19DSEVDS19IRUFERVJTKGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oKQotQUNfSEVBREVSX1RJTUUKLUFDX0hFQURFUl9ESVJFTlQKLUFDX0NIRUNLX0ZVTkNTKGZjbnRsIGdldHBhZ2VzaXplIHNldGl0aW1lciBzeXNjb25mIGZkb3BlbiBnZXR1aWQgZ2V0Z2lkKQotCi1CRkRfQklOQVJZX0ZPUEVOCi0KLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHN0cnN0cikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKG1hbGxvYykKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHJlYWxsb2MpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihmcmVlKQotQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KQotCi0jIElmIHdlIGFyZSBjb25maWd1cmVkIG5hdGl2ZSwgcGljayBhIGNvcmUgZmlsZSBzdXBwb3J0IGZpbGUuCi1DT1JFRklMRT0KLUNPUkVGTEFHPQotVFJBRF9IRUFERVI9Ci1pZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gIGFscGhhKi0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9hbHBoYWxpbnV4LmgiJwotCTs7Ci0gIGFscGhhKi0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIGFscGhhKi0qLSopCQlDT1JFRklMRT1vc2YtY29yZS5sbyA7OwotICBhcm0tKi1yaXNjaXgpCQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaHBwYSotKi1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaGl1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLW1wZWl4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotYnNkKikJCUNPUkVGSUxFPSJocHV4LWNvcmUubG8gaHBwYWJzZC1jb3JlLmxvIgotCQkJQ09SRUZMQUc9Ii1ESFBVWF9DT1JFIC1ESFBQQUJTRF9DT1JFIiA7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG87Ci0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdjQqKSA7OwotICBpWzM0NTZdODYtc2VxdWVudC1zeXN2KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2YnNkLmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1uZXRic2QqIHwgaVszNDU2XTg2LSotb3BlbmJzZCopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LWVzaXgtc3lzdjMqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZXNpeC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXNjbzUtY29yZS5sbwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZzY28uaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLW1hY2gzKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZtYWNoMy5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZsaW51eC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotaXNjKikJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFpeCopCUNPUkVGSUxFPWFpeDM4Ni1jb3JlLmxvIDs7Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIGk4NjAtKi1tYWNoMyogfCBpODYwLSotb3NmMSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pODYwbWFjaDMuaCInCi0JOzsKLSAgbWlwcy1kZWMtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNic2QuaCInCi0JOzsKLSAgbWlwcy1kZWMtbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJwotCTs7Ci0gIG1pcHMtKi1uZXRic2QqIHwgbWlwcyotKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIG1pcHMtZGVjLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kZWNzdGF0aW9uLmgiJwotCTs7Ci0gIG1pcHMtc2dpLWlyaXg0KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtc2dpLWlyaXg1KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtc2dpLWlyaXg2KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLXN5c3Y0KikJOzsKLSAgbWlwcy0qLXN5c3YqIHwgbWlwcy0qLXJpc2NvcyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9yaXNjb3MuaCInCi0JOzsKLSAgbWlwcy1zb255LWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLW1pcHMuaCInCi0JOzsKLSAgbTY4Ki1idWxsKi1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RweDIuaCInCi0JOzsKLSAgbTY4Ki1ocC1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIG02OCotaHAtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2hwMzAwYnNkLmgiJwotCTs7Ci0gIG02OCotKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2xpbnV4LmgiJwotCTs7Ci0gIG02OCotbW90b3JvbGEtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kZWx0YTY4LmgiJwotCTs7Ci0gIG02OCotc29ueS0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy5oIicKLQk7OwotICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIG02OCotYXBwbGUtYXV4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL202OGthdXguaCInCi0JOzsKLSAgbTg4Ki0qLXN5c3Y0KikJOzsKLSAgbTg4Ki1tb3Rvcm9sYS1zeXN2KikJQ09SRUZJTEU9cHRyYWNlLWNvcmUubG8gOzsKLSAgbTg4Ki0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL204OGttYWNoMy5oIicKLQk7OwotICBuczMyay1wYzUzMi1tYWNoKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvcGM1MzJtYWNoLmgiJwotCTs7Ci0gIG5zMzJrLSotbmV0YnNkKiB8IG5zMzJrLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICByczYwMDAtKi1seW54KikJQ09SRUZJTEU9bHlueC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICByczYwMDAtKi0qKQkJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLSpic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXgqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYmVvcyopCTs7Ci0gIHBvd2VycGMtKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBzcGFyYy0qLW5ldGJzZCogfCBzcGFyYy0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgdGFob2UtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdGFob2UuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4MiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXhic2QuaCInCi0JOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRDT1JFRklMRSIgaW4KLSAgYWl4Mzg2LWNvcmUubG8pCUNPUkVGTEFHPS1EQUlYMzg2X0NPUkUgOzsKLSAgaHBwYWJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tREhQUEFCU0RfQ09SRSA7OwotICBocHV4LWNvcmUubG8pCQlDT1JFRkxBRz0tREhQVVhfQ09SRSA7OwotICBpcml4LWNvcmUubG8pCQlDT1JFRkxBRz0tRElSSVhfQ09SRSA7OwotICBseW54LWNvcmUubG8pCQlDT1JFRkxBRz0tRExZTlhfQ09SRSA7OwotICBuZXRic2QtY29yZS5sbykJQ09SRUZMQUc9LURORVRCU0RfQ09SRSA7OwotICBvc2YtY29yZS5sbykJCUNPUkVGTEFHPS1ET1NGX0NPUkUgOzsKLSAgcHRyYWNlLWNvcmUubG8pCUNPUkVGTEFHPS1EUFRSQUNFX0NPUkUgOzsKLSAgcnM2MDAwLWNvcmUubG8pCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURBSVhfQ09SRSIgOzsKLSAgc2NvNS1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFNDTzVfQ09SRSIgOzsKLSAgdHJhZC1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFRSQURfQ09SRSIgOzsKLSAgZXNhYwotCi0gICMgRUxGIGNvcmVmaWxlIHN1cHBvcnQgaGFzIHNldmVyYWwgZmxhdm9ycywgYnV0IGFsbCBvZgotICAjIHRoZW0gdXNlIHNvbWV0aGluZyBjYWxsZWQgPHN5cy9wcm9jZnMuaD4KLSAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvcHJvY2ZzLmgpCi0gIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Byb2Nmc19oIiA9IHllczsgdGhlbgotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwcnN0YXR1c190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIocHJzdGF0dXNfdCwgcHJfd2hvKQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwc3RhdHVzX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBycHNpbmZvX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBzaW5mb190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShsd3BzdGF0dXNfdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKGx3cHN0YXR1c190LCBwcl9jb250ZXh0KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIobHdwc3RhdHVzX3QsIHByX3JlZykKLSAgZmkKLWZpCi1BQ19TVUJTVChDT1JFRklMRSkKLUFDX1NVQlNUKENPUkVGTEFHKQotQUNfREVGSU5FX1VOUVVPVEVEKFRSQURfSEVBREVSLCAkVFJBRF9IRUFERVIsCi0gIFtOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy5dKQotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiAtbGtlcm5lbDMyIgotICBmaQotICA7OwotZXNhYwotQUNfU1VCU1QoV0lOMzJMREZMQUdTKQotQUNfU1VCU1QoV0lOMzJMSUJBREQpCi0KLSMgdGFyZ2V0IHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1kZWZ2ZWM9Ci1zZWx2ZWNzPQotc2VsYXJjaHM9Ci1UREVGSU5FUz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0gICAgZWxzZQotCS4gJHNyY2Rpci9jb25maWcuYmZkCi0JaWYgdGVzdCAieCR0YXJnIiA9ICJ4JHRhcmdldCI7IHRoZW4KLQkgICAgZGVmdmVjPSR0YXJnX2RlZnZlYwotCWZpCi0Jc2VsdmVjcz0iJHNlbHZlY3MgJHRhcmdfZGVmdmVjICR0YXJnX3NlbHZlY3MiCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLQlUREVGSU5FUz0iJFRERUZJTkVTICR0YXJnX2NmbGFncyIKLSAgICBmaQotZG9uZQotQUNfU1VCU1QoVERFRklORVMpCi0KLSMgVGhpcyBwcm9jZXNzaW5nIHN0aWxsIG5lZWRzIHRvIGJlIGRvbmUgaWYgd2UncmUgdG8gZGVjaWRlIHByb3Blcmx5IHdoZXRoZXIKLSMgNjQtYml0IHN1cHBvcnQgbmVlZHMgdG8gYmUgY29tcGlsZWQgaW4uICBDdXJyZW50bHksIGl0IHdpbGwgYmUgaW5jbHVkZWQgaWYKLSMgdGhlIGRlZmF1bHQgb3IgYW55IG90aGVyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHRhcmdldCByZXF1aXJlcyBpdDsgaXQKLSMgd2lsbCBub3QgYmUgaW5jbHVkZWQgb24gYSAzMi1iaXQgaG9zdCBpZiBubyA2NC1iaXQgdGFyZ2V0IGlzIHJlcXVlc3RlZCwgYW5kCi0jIG5vICItLXdpdGgtNjQtYml0LWJmZCIgb3B0aW9uIGlzIGdpdmVuLCBldmVuIGlmICItLWVuYWJsZS10YXJnZXRzPWFsbCIgaXMKLSMgdXNlZC4KLQotIyB1bmlxIHRoZSBkZWZhdWx0IGFuZCBzZWxlY3RlZCB2ZWN0b3JzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgotZj0iIgotZm9yIGkgaW4gJHNlbHZlY3MgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsdmVjcz0iJGYiCi0KLQotIyB1bmlxIHRoZSBhcmNoaXRlY3R1cmVzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgotZj0iIgotZm9yIGkgaW4gJHNlbGFyY2hzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbGFyY2hzPSIkZiIKLQotIyBUYXJnZXQgYmFja2VuZCAubyBmaWxlcy4KLXRiPQotCi1lbGY9ImVsZi5sbyBlbGZsaW5rLmxvIGR3YXJmMi5sbyBkd2FyZjEubG8iCi0KLWZvciB2ZWMgaW4gJHNlbHZlY3MKLWRvCi0gICAgY2FzZSAiJHZlYyIgaW4KLSAgICAjIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGNvbXBhcmUKLSAgICAjIHdpdGggdGhlIHR3byB2ZWN0b3IgbGlzdHMgaW4gdGFyZ2V0cy5jLgotICAgIGEyOWtjb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYTI5ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBhX291dF9hZG9iZV92ZWMpCQl0Yj0iJHRiIGFvdXQtYWRvYmUubG8gYW91dDMyLmxvIiA7OwotICAgIGFybWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybW5ldGJzZF92ZWMpCQl0Yj0iJHRiIGFybW5ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXJtcGVfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2JpZ192ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYW91dDBfYmlnX3ZlYykJCXRiPSIkdGIgYW91dDAubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfYXJtX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQtYXJtLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9saXR0bGVfdmVjKQl0Yj0iJHRiIGFvdXQtYXJtLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X21pcHNfYmlnX3ZlYykJCXRiPSIkdGIgbWlwc2JzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2xpdHRsZV92ZWMpCXRiPSIkdGIgbWlwc2JzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXBvbGxvY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXBvbGxvLmxvIiA7OwotICAgIGJfb3V0X3ZlY19iaWdfaG9zdCkJCXRiPSIkdGIgYm91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYl9vdXRfdmVjX2xpdHRsZV9ob3N0KQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJmZF9lbGY2NF9hbHBoYV92ZWMpCXRiPSIkdGIgZWxmNjQtYWxwaGEubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMpCXRiPSIkdGIgZWxmMzItYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMpCXRiPSIkdGIgZWxmYXJtLW5hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKSB0Yj0iJHRiIGVsZmFybS1vYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FyY192ZWMpCXRiPSIkdGIgZWxmMzItYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV92ZWMpCXRiPSIkdGIgZWxmYXJtLW5hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjKQl0Yj0iJHRiIGVsZmFybS1vYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmMzItZ2VuLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ21pcHNfdmVjKSAJdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmMzJfZDEwdl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWQxMHYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfZDMwdl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWQzMHYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfZnIzMF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWZyMzAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaHBwYV92ZWMpCQl0Yj0iJHRiIGVsZjMyLWhwcGEubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWkzODYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTg2MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWk4NjAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTk2MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWk5NjAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX20zMnJfdmVjKQkJdGI9IiR0YiBlbGYzMi1tMzJyLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX202OGtfdmVjKQkJdGI9IiR0YiBlbGYzMi1tNjhrLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX204OGtfdmVjKQkJdGI9IiR0YiBlbGYzMi1tODhrLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlbGYzMi1tY29yZS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMjAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMjAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21uMTAzMDBfdmVjKQl0Yj0iJHRiIGVsZi1tMTAzMDAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfcGpfdmVjKSAgICAgICAgICAgdGI9IiR0YiBlbGYzMi1wai5sbyBlbGYzMi5sbyAkZWxmIjs7Ci0gICAgYmZkX2VsZjMyX3BqbF92ZWMpICAgICAgICAgIHRiPSIkdGIgZWxmMzItcGoubG8gZWxmMzIubG8gJGVsZiI7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfc2hfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NobF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLXNwYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Y4NTBfdmVjKQkJdGI9IiR0YiBlbGYzMi12ODUwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMpIHRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9zcGFyY192ZWMpCXRiPSIkdGIgZWxmNjQtc3BhcmMubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgY2lzY29fY29yZV9iaWdfdmVjKQkJdGI9IiR0YiBjaXNjby1jb3JlLmxvIiA7OwotICAgIGNpc2NvX2NvcmVfbGl0dGxlX3ZlYykJdGI9IiR0YiBjaXNjby1jb3JlLmxvIiA7OwotICAgIGRlbW9fNjRfdmVjKQkJdGI9IiR0YiBkZW1vNjQubG8gYW91dDY0LmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBlY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7Ci0gICAgZWNvZmZfYmlnbGl0dGxlX3ZlYykJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYykJdGI9IiR0YiBjb2ZmLWFscGhhLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZ28zMmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgZ28zMnN0dWJiZWRjb2ZmX3ZlYykJdGI9IiR0YiBjb2ZmLXN0Z28zMi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBoODMwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWg4MzAwLmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgaDg1MDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODUwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGhvc3RfYW91dF92ZWMpCQl0Yj0iJHRiIGhvc3QtYW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaHAzMDBic2RfdmVjKQkJdGI9IiR0YiBocDMwMGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaHAzMDBocHV4X3ZlYykJCXRiPSIkdGIgaHAzMDBocHV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2YW91dF92ZWMpCQl0Yj0iJHRiIGkzODZhb3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2YnNkX3ZlYykJCXRiPSIkdGIgaTM4NmJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWkzODYubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmR5bml4X3ZlYykJCXRiPSIkdGIgaTM4NmR5bml4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2ZnJlZWJzZF92ZWMpCQl0Yj0iJHRiIGkzODZmcmVlYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bXNkb3NfdmVjKQkJdGI9IiR0YiBpMzg2bXNkb3MubG8iIDs7Ci0gICAgaTM4NnBlX3ZlYykJCQl0Yj0iJHRiIHBlLWkzODYubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZwZWlfdmVjKQkJdGI9IiR0YiBwZWktaTM4Ni5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmxpbnV4X3ZlYykJCXRiPSIkdGIgaTM4NmxpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgaTM4Nmx5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtaTM4Nmx5bngubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIGkzODZtYWNoM192ZWMpCQl0Yj0iJHRiIGkzODZtYWNoMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm5ldGJzZF92ZWMpCQl0Yj0iJHRiIGkzODZuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZvczlrX3ZlYykJCXRiPSIkdGIgaTM4Nm9zOWsubG8gYW91dDMyLmxvIiA7OwotICAgIGk4NjBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pODYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWVlZV92ZWMpCQkJdGI9IiR0YiBpZWVlLmxvIiA7OwotICAgIG02OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtjb2ZmdW5fdmVjKQkJdGI9IiR0YiBjb2ZmLXU2OGsubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtsaW51eF92ZWMpCQl0Yj0iJHRiIG02OGtsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIG02OGtseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLW02OGtseW54LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgbTY4a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGs0a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGs0a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2F1eF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hdXgubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtzeXN2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3ZtNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG04OGtiY3NfdmVjKQkJdGI9IiR0YiBjb2ZmLW04OGsubG8iIDs7Ci0gICAgbWNvcmVfcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgcGUtbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9iaWdfdmVjKQkJdGI9IiR0YiBwZWktbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbmV3c29zM192ZWMpCQl0Yj0iJHRiIG5ld3NvczMubG8gYW91dDMyLmxvIiA7OwotICAgIG5sbTMyX2kzODZfdmVjKQkJdGI9IiR0YiBubG0zMi1pMzg2LmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9zcGFyY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXNwYXJjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9hbHBoYV92ZWMpCQl0Yj0iJHRiIG5sbTMyLWFscGhhLmxvIG5sbTMyLmxvIG5sbS5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgcmlzY2l4X3ZlYykJCQl0Yj0iJHRiIGFvdXQzMi5sbyByaXNjaXgubG8iIDs7Ci0gICAgbmxtMzJfcG93ZXJwY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXBwYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgcGM1MzJuZXRic2RfdmVjKQkJdGI9IiR0YiBuczMya25ldGJzZC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBjNTMybWFjaGFvdXRfdmVjKQkJdGI9IiR0YiBwYzUzMi1tYWNoLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcG1hY194Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcG1hYy5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgcnM2MDAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcnM2MDAwLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY19wZV92ZWMpICAgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OyAgCi0gICAgYmZkX3Bvd2VycGNsZV9wZV92ZWMpICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYykgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHBwY2Jvb3RfdmVjKQkJdGI9IiR0YiBwcGNib290LmxvIiA7OwotICAgIHNoY29mZl92ZWMpCQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNoY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hsY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc29tX3ZlYykJCQl0Yj0iJHRiIHNvbS5sbyIgOzsKLSAgICBzcGFyY2xlX2FvdXRfdmVjKQkJdGI9IiR0YiBhb3V0LXNwYXJjbGUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbGludXhfdmVjKQkJdGI9IiR0YiBzcGFyY2xpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIHNwYXJjbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2Ytc3BhcmNseW54LmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBzcGFyY25ldGJzZF92ZWMpCQl0Yj0iJHRiIHNwYXJjbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNwYXJjLmxvIiA7OwotICAgIHNyZWNfdmVjKQkJCXRiPSIkdGIgc3JlYy5sbyIgOzsKLSAgICBzdW5vc19iaWdfdmVjKQkJdGI9IiR0YiBzdW5vcy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3ltYm9sc3JlY192ZWMpCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgdGVraGV4X3ZlYykJCQl0Yj0iJHRiIHRla2hleC5sbyIgOzsKLSAgICB0aWMzMF9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC10aWMzMC5sbyIgOzsKLSAgICB0aWMzMF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWMzMC5sbyIgOzsKLSAgICB0aWM4MGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzgwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHZlcnNhZG9zX3ZlYykJCXRiPSIkdGIgdmVyc2Fkb3MubG8iIDs7Ci0gICAgdm1zX2FscGhhX3ZlYykJCXRiPSIkdGIgdm1zLmxvIHZtcy1oZHIubG8gdm1zLWdzZC5sbyB2bXMtdGlyLmxvIHZtcy1taXNjLmxvIgotIAkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgdm1zX3ZheF92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIgOzsKLSAgICB3NjVfdmVjKQkJCXRiPSIkdGIgY29mZi13NjUubG8gcmVsb2MxNi5sbyIgOzsKLSAgICB3ZTMya2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXdlMzJrLmxvIiA7OwotICAgIHo4a2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXo4ay5sbyByZWxvYzE2LmxvIiA7OwotCi0gICAgIiIpCQkJOzsKLSAgICAqKSBBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IHZlY3RvciAkdmVjKSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBBQ19NU0dfV0FSTihbWW91IGhhdmUgcmVxdWVzdGVkIGEgNjQgYml0IEJGRCBjb25maWd1cmF0aW9uLCBidXRdKQotICAgICAgQUNfTVNHX1dBUk4oW3lvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGVdKQotICAgIGZpCi0gICAgOzsKLSAgZmFsc2UtZmFsc2UtZmFsc2UpCi0gICAgd29yZHNpemU9MzIKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZEMzJfQkFDS0VORFMpJwotICAgIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKHdvcmRzaXplKQotQUNfU1VCU1QoYWxsX2JhY2tlbmRzKQotQUNfU1VCU1QoYmZkX2JhY2tlbmRzKQotQUNfU1VCU1QoYmZkX21hY2hpbmVzKQotCi10ZGVmYXVsdHM9IiIKLXRlc3QgLW4gIiR7ZGVmdmVjfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURERUZBVUxUX1ZFQ1RPUj0ke2RlZnZlY30iCi10ZXN0IC1uICIke3NlbHZlY3N9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9WRUNTPScke3NlbHZlY3N9JyIKLXRlc3QgLW4gIiR7c2VsYXJjaHN9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9BUkNISVRFQ1RVUkVTPScke3NlbGFyY2hzfSciCi10ZXN0IC1uICIke2hhdmV2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gJHtoYXZldmVjc30iCi1BQ19TVUJTVCh0ZGVmYXVsdHMpCi0KLWRubCBBQ19DSEVDS19IRUFERVJTKHN5cy9tbWFuLmgpCi1BQ19GVU5DX01NQVAKLUFDX0NIRUNLX0ZVTkNTKG1hZHZpc2UgbXByb3RlY3QpCi1jYXNlICR7d2FudF9tbWFwfSske2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWR9IGluCi0gIHRydWUreWVzICkgIEFDX0RFRklORShVU0VfTU1BUCwgMSwgW1VzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlP10pIDs7Ci1lc2FjCi0KLXJtIC1mIGRvYy9jb25maWcuc3RhdHVzCi1BQ19PVVRQVVQoTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvYmZkL2NvcmVmaWxlLmMgYi9iZmQvY29yZWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyZjUxOS4uMDAwMDAwMAotLS0gYS9iZmQvY29yZWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBDb3JlIGZpbGUgZ2VuZXJpYyBpbnRlcmZhY2Ugcm91dGluZXMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JQ29yZSBmaWxlcwotCi1ERVNDUklQVElPTgotCVRoZXNlIGFyZSBmdW5jdGlvbnMgcGVydGFpbmluZyB0byBjb3JlIGZpbGVzLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSByZWFkLW9ubHkgc3RyaW5nIGV4cGxhaW5pbmcgd2hpY2ggcHJvZ3JhbSB3YXMgcnVubmluZwotCXdoZW4gaXQgZmFpbGVkIGFuZCBwcm9kdWNlZCB0aGUgY29yZSBmaWxlIEB2YXJ7YWJmZH0uCi0KLSovCi0KLUNPTlNUIGNoYXIgKgotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwgKGFiZmQpKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi1TWU5PUFNJUwotCWludCBiZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBjYXVzZWQgdGhlIGNvcmUgZHVtcCB3aGljaAotCWdlbmVyYXRlZCB0aGUgZmlsZSB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgYXR0YWNoZWQgdG8uCi0qLwotCi1pbnQKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCAoYWJmZCkpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi1TWU5PUFNJUwotCWJvb2xlYW4gY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0JCShiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gPDx0cnVlPj4gaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBAdmFye2NvcmVfYmZkfQotCXdhcyBnZW5lcmF0ZWQgYnkgYSBydW4gb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhdHRhY2hlZCB0bwotCUB2YXJ7ZXhlY19iZmR9LCA8PGZhbHNlPj4gb3RoZXJ3aXNlLgotKi8KLWJvb2xlYW4KLWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gICAgaWYgKChjb3JlX2JmZC0+Zm9ybWF0ICE9IGJmZF9jb3JlKSB8fCAoZXhlY19iZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSkgewotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIHJldHVybiBCRkRfU0VORCAoY29yZV9iZmQsIF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AsCi0JCSAgICAgKGNvcmVfYmZkLCBleGVjX2JmZCkpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hMjlrLmMgYi9iZmQvY3B1LWEyOWsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMjVhNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQU1EIDI5MDAwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hMjlrX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9hMjlrLAotICAgIDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgImEyOWsiLAotICAgICJhMjlrIiwKLSAgICA0LAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hbHBoYS5jIGIvYmZkL2NwdS1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODk5MDBiLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQWxwaGEgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE4oQklUU19XT1JELCBCSVRTX0FERFIsIE5VTUJFUiwgUFJJTlQsIERFRkFVTFQsIE5FWFQpIFwKLSAgewkJCQkJCQlcCi0gICAgQklUU19XT1JELCAvKiBiaXRzIGluIGEgd29yZCAqLwkJCVwKLSAgICBCSVRTX0FERFIsIC8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkJCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkJCVwKLSAgICBiZmRfYXJjaF9hbHBoYSwJCQkJCVwKLSAgICBOVU1CRVIsCQkJCQkJXAotICAgICJhbHBoYSIsCQkJCQkJXAotICAgIFBSSU5ULAkJCQkJCVwKLSAgICAzLAkJCQkJCQlcCi0gICAgREVGQVVMVCwJCQkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCQkJXAotICAgIE5FWFQsCQkJCQkJXAotICB9Ci0KLSNkZWZpbmUgTk4oaW5kZXgpICgmYXJjaF9pbmZvX3N0cnVjdFtpbmRleF0pCi0KLS8qIFRoZXNlIGV4aXN0IG9ubHkgc28gdGhhdCB3ZSBjYW4gcmVzb25hYmx5IGRpc2Fzc2VtYmxlIFBBTGNvZGUuICAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9hbHBoYV9ldjQsICJhbHBoYTpldjQiLCBmYWxzZSwgTk4oMSkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX2FscGhhX2V2NSwgImFscGhhOmV2NSIsIGZhbHNlLCBOTigyKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfYWxwaGFfZXY2LCAiYWxwaGE6ZXY2IiwgZmFsc2UsIDApLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hbHBoYV9hcmNoID0KLSAgTiAoNjQsIDY0LCAwLCAiYWxwaGEiLCB0cnVlLCBOTigwKSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LWFyYy5jIGIvYmZkL2NwdS1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlNTlkNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBUkMgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgQVJDKG1hY2gsIHByaW50X25hbWUsIGRlZmF1bHRfcCwgbmV4dCkgXAotewkJCQkJXAotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwkJXAotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JXAotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCVwKLSAgICBiZmRfYXJjaF9hcmMsCQkJXAotICAgIG1hY2gsCQkJCVwKLSAgICAiYXJjIiwJCQkJXAotICAgIHByaW50X25hbWUsCQkJCVwKLSAgICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwlcCi0gICAgZGVmYXVsdF9wLAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQlcCi0gICAgbmV4dCwJCQkJXAotICB9Ci0KLSNpZiAwIC8qID8/PyBOb3QgY3VycmVudGx5IG5lZWRlZCwgYnV0IGtlZXAgaW4gZm9yIGZ1dHVyZSByZWZlcmVuY2UuICAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICBBUkMgKGJmZF9tYWNoX2FyY19mb28sICJhcmMtZm9vIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgQVJDIChiZmRfbWFjaF9hcmNfYmFyLCAiYXJjLWJhciIsIGZhbHNlLCAwKSwKLX07Ci0jZW5kaWYKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcmNfYXJjaCA9Ci0gIEFSQyAoYmZkX21hY2hfYXJjX2Jhc2UsICJhcmMtYmFzZSIsIHRydWUsIDAgLyomYXJjaF9pbmZvX3N0cnVjdFswXSovKTsKLQwKLS8qIFV0aWxpdHkgcm91dGluZXMuICAqLwotCi0vKiBHaXZlbiBjcHUgdHlwZSBOQU1FLCByZXR1cm4gaXRzIGJmZF9tYWNoX2FyY194eHggdmFsdWUuCi0gICBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotYXJjX2dldF9tYWNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnA7Ci0KLSAgZm9yIChwID0gJmJmZF9hcmNfYXJjaDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiArNDogc2tpcCBvdmVyICJhcmMtIiAqLwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+cHJpbnRhYmxlX25hbWUgKyA0KSA9PSAwKQotCXJldHVybiBwLT5tYWNoOwotICAgIH0KLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hcm0uYyBiL2JmZC9jcHUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTljNDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFSTSBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHNjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHdoaWNoIEFSTQotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYjsKLXsKLSAgLyogSWYgYSAmIGIgYXJlIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIHdlIGNhbiBkbyBub3RoaW5nICovCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBhICYgYiBhcmUgZm9yIHRoZSBzYW1lIG1hY2hpbmUgdGhlbiBhbGwgaXMgd2VsbCAqLwotICBpZiAoYS0+bWFjaCA9PSBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIC8qIE90aGVyd2lzZSBpZiBlaXRoZXIgYSBvciBiIGlzIHRoZSAnZGVmYXVsdCcgbWFjaGluZSB0aGVuCi0gICAgIGl0IGNhbiBiZSBwb2x5bW9ycGhlZCBpbnRvIHRoZSBvdGhlciAqLwotICBpZiAoYS0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGI7Ci0gIAotICBpZiAoYi0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGE7Ci0KLSAgLyogU28gZmFyIGFsbCBuZXdlciBBUk0gYXJjaGl0ZWN0dXJlIGNvcmVzIGFyZSBzdXBlcnNldHMgb2YgcHJldmlvdXMgY29yZXMgKi8KLSAgaWYgKGEtPm1hY2ggPCBiLT5tYWNoKQotICAgIHJldHVybiBiOwotICBlbHNlIGlmIChhLT5tYWNoID4gYi0+bWFjaCkKLSAgICByZXR1cm4gYTsKLQotICAvKiBOZXZlciByZWFjaGVkISAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdAotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgY2hhciAqICAgICAgICAgICAgICAgIG5hbWU7Ci19Ci1wcm9jZXNzb3JzW10gPQotewotICB7IGJmZF9tYWNoX2FybV8yLCAgImFybTIiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTI1MCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTMiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTciICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTcxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTc1MDAiICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkaSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbWkiICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTd0ZG1pIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTkiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTkyMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTkyMHQiICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTl0ZG1pIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInNhMSIgICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybSJ9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybTExMCIgfSwKLSAgeyBiZmRfbWFjaF9hcm1fNCwgICJzdHJvbmdhcm0xMTAwIiB9LAotfTsKLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqIHN0cmluZzsKLXsKLSAgaW50ICBpOwotCi0gIC8qIEZpcnN0IHRlc3QgZm9yIGFuIGV4YWN0IG1hdGNoICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE5leHQgY2hlY2sgZm9yIGEgcHJvY2Vzc29yIG5hbWUgaW5zdGVhZCBvZiBhbiBBcmNoaXRlY3R1cmUgbmFtZSAqLwotICBmb3IgKGkgPSBzaXplb2YgKHByb2Nlc3NvcnMpIC8gc2l6ZW9mIChwcm9jZXNzb3JzWzBdKTsgaS0tOykKLSAgICB7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBwcm9jZXNzb3JzWyBpIF0ubmFtZSkgPT0gMCkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKGkgIT0gLTEgJiYgaW5mby0+YXJjaCA9PSBwcm9jZXNzb3JzWyBpIF0uYXJjaCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaW5hbGx5IGNoZWNrIGZvciB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgImFybSIpID09IDApCi0gICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OwotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9hcm0sIG51bWJlciwgImFybSIsIHByaW50LCA0LCBkZWZhdWx0LCBjb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTiggYmZkX21hY2hfYXJtXzIsICAiYXJtdjIiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFsxXSApLAotICBOKCBiZmRfbWFjaF9hcm1fMmEsICJhcm12MmEiLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzJdICksCi0gIE4oIGJmZF9tYWNoX2FybV8zLCAgImFybXYzIiwgIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbM10gKSwKLSAgTiggYmZkX21hY2hfYXJtXzNNLCAiYXJtdjNtIiwgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs0XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNCwgICJhcm12NCIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzVdICksCi0gIE4oIGJmZF9tYWNoX2FybV80VCwgImFybXY0dCIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbNl0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzUsICAiYXJtdjUiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs3XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNVQsICJhcm12NXQiLCBmYWxzZSwgTlVMTCApCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FybV9hcmNoID0KLSAgTiggMCwgImFybSIsIHRydWUsICYgYXJjaF9pbmZvX3N0cnVjdFswXSApOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1kMTB2LmMgYi9iZmQvY3B1LWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YzNiNy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgRDEwViBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGQxMHZfdHMzX2luZm8gPSAKLXsJCQkJCQotICAxNiwJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8JCQotICAxNiwJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCQotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKLSAgYmZkX2FyY2hfZDEwdiwKLSAgYmZkX21hY2hfZDEwdl90czMsCQkKLSAgImQxMHYiLAkJCQkKLSAgImQxMHY6dHMzIiwJCQkJCi0gIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCQotICBmYWxzZSwJCQkJCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkJCi0gIDAsCQkJCQotfTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBkMTB2X3RzMl9pbmZvID0gCi17Ci0gIDE2LAkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwkJCi0gIDE2LAkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCQotICBiZmRfYXJjaF9kMTB2LAotICBiZmRfbWFjaF9kMTB2X3RzMiwJCQotICAiZDEwdiIsCQkJCQotICAiZDEwdjp0czIiLAkJCQkKLSAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JCi0gIGZhbHNlLAkJCQkKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkKLSAgYmZkX2RlZmF1bHRfc2NhbiwJCQkKLSAgJmQxMHZfdHMzX2luZm8sCQkJCQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2ggPSAKLXsJCQkJCQotICAxNiwJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8JCQotICAxNiwJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCQotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKLSAgYmZkX2FyY2hfZDEwdiwKLSAgYmZkX21hY2hfZDEwdiwJCQotICAiZDEwdiIsCQkJCQotICAiZDEwdiIsCQkJCQotICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwkKLSAgdHJ1ZSwJCQkJCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkJCi0gICZkMTB2X3RzMl9pbmZvLAkJCQkKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWQzMHYuYyBiL2JmZC9jcHUtZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFkZmVlLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNaXRzdWJpc2hpIEQzMFYgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2ggPQotewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX2QzMHYsCi0gICAgMCwKLSAgICAiZDMwdiIsCi0gICAgImQzMHYiLAotICAgIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCi0gICAgdHJ1ZSwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWZyMzAuYyBiL2JmZC9jcHUtZnIzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzIwOGY4Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBGUjMwIHByb2Nlc3Nvci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZnIzMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIGJpdHMgcGVyIHdvcmQgKi8KLSAgMzIsCQkJCS8qIGJpdHMgcGVyIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogYml0cyBwZXIgYnl0ZSAqLwotICBiZmRfYXJjaF9mcjMwLAkJLyogYXJjaGl0ZWN0dXJlICovCi0gIGJmZF9tYWNoX2ZyMzAsCQkvKiBtYWNoaW5lICovCi0gICJmcjMwIiwJCQkvKiBhcmNoaXRlY3R1cmUgbmFtZSAqLwotICAiZnIzMCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgNCwJCQkJLyogc2VjdGlvbiBhbGlnbiBwb3dlciAqLwotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCA/ICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCS8qIGFyY2hpdGVjdHVyZSBjb21wYXJpc29uIGZuICovCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkvKiBzdHJpbmcgdG8gYXJjaGl0ZWN0dXJlIGNvbnZlcnQgZm4gKi8KLSAgTlVMTAkJCQkvKiBuZXh0IGluIGxpc3QgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWg4MzAwLmMgYi9iZmQvY3B1LWg4MzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2I3ZGYuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpIEg4LzMwMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2ggKCk7Ci0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmICgqc3RyaW5nICE9ICdoJyAmJiAqc3RyaW5nICE9ICdIJykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICc4JykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICcvJykKLSAgICBzdHJpbmcrKzsKLQotICBpZiAoKnN0cmluZyAhPSAnMycpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgIT0gJzAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICcwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyA9PSAnLScpCi0gICAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICdoJyB8fCAqc3RyaW5nID09ICdIJykKLSAgICB7Ci0gICAgICByZXR1cm4gKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaDgzMDBoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHJpbmcgPT0gJ3MnIHx8ICpzdHJpbmcgPT0gJ1MnKQotICAgIHsKLSAgICAgIHJldHVybiAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9oODMwMHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBpbmZvLT5tYWNoID09IGJmZF9tYWNoX2g4MzAwOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHdvcmtzIG91dCB0aGUgCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoaW4sIG91dCkKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogaW47Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIG91dDsKLXsKLSAgLyogSXQncyByZWFsbHkgbm90IGEgZ29vZCBpZGVhIHRvIG1peCBhbmQgbWF0Y2ggbW9kZXMuICAqLwotICBpZiAoaW4tPm1hY2ggIT0gb3V0LT5tYWNoKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGg4MzAwX2luZm9fc3RydWN0ID0KLXsKLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDAsCi0gICJoODMwMCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDgzMDAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgMCwKLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgaDgzMDBoX2luZm9fc3RydWN0ID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDBoLAotICAiaDgzMDBoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMGgiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIGZhbHNlLAkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgJmg4MzAwX2luZm9fc3RydWN0LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDBzLAotICAiaDgzMDBzIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMHMiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIGZhbHNlLAkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgJmg4MzAwaF9pbmZvX3N0cnVjdCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWg4NTAwLmMgYi9iZmQvY3B1LWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTQyZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1oODUwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIOC81MDAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmIDAKLQotLyogCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvMTZfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0KLSAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzE2KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84KGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLQotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9GRm5uX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgICAgICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIGFib3J0KCk7Ci0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIGFib3J0KCk7Ci0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Ci0gID0gTkVXSE9XVE8oaG93dG8xNl9jYWxsYmFjaywiYWJzMTYiLDEsZmFsc2UsZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAotICA9IE5FV0hPV1RPKGhvd3RvOF9jYWxsYmFjaywiYWJzOCIsMCxmYWxzZSxmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgotICA9IE5FV0hPV1RPKGhvd3RvOF9GRm5uX2NhbGxiYWNrLCJmZjAwK2FiczgiLDAsZmFsc2UsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCi0gID0gTkVXSE9XVE8oaG93dG84X3BjcmVsX2NhbGxiYWNrLCJwY3JlbDgiLDAsZmFsc2UsdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkgewotICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICByZXR1cm4gJmhvd3RvXzE2OwotICBjYXNlIEJGRF9SRUxPQ184X0ZGbm46Ci0gICAgcmV0dXJuICZob3d0b184X0ZGbm47Ci0gIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgcmV0dXJuICZob3d0b184OwotICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKLSAgfQotICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOwotfQotI2VuZGlmCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsImg4LzUwMCIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywiSDgvNTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJoODUwMCIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywiSDg1MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNpZiAwIC8qIG5vdCB1c2VkIGN1cnJlbnRseSAqLwotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBhLT5tYWNoICE9IGItPm1hY2gpCi0gICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGE7Ci19Ci0jZW5kaWYKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODUwMF9hcmNoID0KLXsKLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gIDI0LAkJCQkvKiAyNCBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODUwMCwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgImg4NTAwIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODUwMCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgMSwKLSAgdHJ1ZSwJCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICBzY2FuX21hY2gsCi0gIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1ocHBhLmMgYi9iZmQvY3B1LWhwcGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxNzc0My4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWhwcGEuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgSFAgUHJlY2lzaW9uIEFyY2hpdGVjdHVyZSBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGExMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9ocHBhLAotICAxMCwJCQkJLyogQnkgY29udmVudGlvbiBQQTEuMCA9IDEwICovCi0gICJocHBhIiwKLSAgImhwcGExLjAiLAotICAzLAotICB0cnVlLAkJCQkvKiBVbmxlc3Mgd2UgdXNlIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gIDAsCi19OwotCi0vKiBQQTIuMCBpbiBuYXJyb3cgbW9kZSAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTIwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDIwLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4wID0gMTAgKi8KLSAgImhwcGEiLAotICAiaHBwYTIuMCIsCi0gIDMsCi0gIGZhbHNlLAkJCS8qIFVubGVzcyB3ZSB1c2UgMS4xIHNwZWNpZmljIGZlYXR1cmVzICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgJmJmZF9ocHBhMTBfYXJjaCwKLX07Ci0KLS8qIFBBMi4wIGluIHdpZGUgbW9kZSAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTIwd19hcmNoID0KLXsKLSAgNjQsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDY0LAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9ocHBhLAotICAyNSwJCQkJLyogPz8/IEhvdyBiZXN0IHRvIGRlc2NyaWJlIHdpZGUgbW9kZSBoZXJlPyAgKi8KLSAgImhwcGEiLAotICAiaHBwYTIuMHciLAotICAzLAotICBmYWxzZSwJCQkvKiBVbmxlc3Mgd2UgdXNlIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZiZmRfaHBwYTIwX2FyY2gsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaHBwYSwKLSAgMTEsCQkJCS8qIEJ5IGNvbnZlbnRpb24gUEExLjEgPSAxMSAqLwotICAiaHBwYSIsCi0gICJocHBhMS4xIiwKLSAgMywKLSAgZmFsc2UsCQkJLyogMS4xIHNwZWNpZmljIGZlYXR1cmVzIHVzZWQgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2hwcGEyMHdfYXJjaCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWkzODYuYyBiL2JmZC9jcHUtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI5YjE4Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCAzODYgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCwKLSAgImkzODY6aW50ZWwiLAotICAiaTM4NjppbnRlbCIsCi0gIDMsCi0gIHRydWUsCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgMCwKLX07Ci1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGk4MDg2X2FyY2ggPQotewotICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAod2VsbCwgbm90IHJlYWxseSkgKi8KLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICBiZmRfbWFjaF9pMzg2X2k4MDg2LAotICAiaTgwODYiLAotICAiaTgwODYiLAotICAzLAotICBmYWxzZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXgsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pMzg2LAotICAiaTM4NiIsCi0gICJpMzg2IiwKLSAgMywKLSAgdHJ1ZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmaTgwODZfYXJjaCwKLX07Ci0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTg2MC5jIGIvYmZkL2NwdS1pODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yzg2N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEludGVsIDg2MCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENyZWF0ZWQgbW9zdGx5IGJ5IHN1YnN0aXR1dGluZyAiODYwIiBmb3IgIjM4NiIgaW4gY3B1LWkzODYuYwotICAgSGFycnkgRG9sYW4gPGRvbGFuQHNzZC5pbnRlbC5jb20+LCBPY3RvYmVyIDE5OTUKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTg2MF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfaTg2MCwKLSAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJpODYwIiwKLSAgICAiaTg2MCIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTk2MC5jIGIvYmZkL2NwdS1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjJjN2UuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGk5NjAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIGEgc3RyaW5nLCBhbmQgdHJpZXMgdG8gd29yayBvdXQgaWYgaXQKLSAgIGNvdWxkIHBvc3NpYmx5IHJlZmVyIHRvIHRoZSBpOTYwIG1hY2hpbmUgcG9pbnRlZCBhdCBpbiB0aGUKLSAgIGluZm9fc3RydWN0IHBvaW50ZXIgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNjYW5fOTYwX21hY2ggKGFwLCBzdHJpbmcpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotCi0gIC8qIExvb2sgZm9yIHRoZSBzdHJpbmcgaTk2MCwgb3Igc29tZXN1Y2ggYXQgdGhlIGZyb250IG9mIHRoZSBzdHJpbmcgICovCi0KLSAgaWYgKHN0cm5jbXAoImk5NjAiLHN0cmluZyw0KSA9PSAwKSB7Ci0gICAgc3RyaW5nKz00OwotICB9Ci0gIGVsc2UgewotICAgIC8qIG5vIG1hdGNoLCBjYW4gYmUgdXMgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHN0cmluZ1swXSA9PSAwKSB7Ci0gICAgLyogaTk2MCBvbiBpdCdzIG93biBtZWFucyBjb3JlIHRvIHVzKi8KLSAgICBpZiAoYXAtPm1hY2ggPT0gYmZkX21hY2hfaTk2MF9jb3JlKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoc3RyaW5nWzBdICE9ICc6JykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdHJpbmcrKzsKLSAgaWYgKHN0cmluZ1swXSA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHN0cmluZ1swXSA9PSAnYycgJiYgc3RyaW5nWzFdID09ICdvJyAmJiBzdHJpbmdbMl0gPT0gJ3InICYmCi0gICAgICBzdHJpbmdbM10gPT0gJ2UnICYmIHN0cmluZ1s0XSA9PSAnXDAnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3RyaW5nLCAia2Ffc2EiKSA9PSAwKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJjbXAgKHN0cmluZywgImtiX3NiIikgPT0gMCkKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLSAgZWxzZSBpZiAoc3RyaW5nWzFdID09ICdcMCcgfHwgc3RyaW5nWzJdICE9ICdcMCcpIC8qIHJlc3QgYXJlIDItY2hhciAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdrJyAmJiBzdHJpbmdbMV0gPT0gJ2InKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3MnICYmIHN0cmluZ1sxXSA9PSAnYicpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnbScgJiYgc3RyaW5nWzFdID09ICdjJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9tYzsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICd4JyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX3hhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2MnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY2E7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaycgJiYgc3RyaW5nWzFdID09ICdhJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdzJyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2onICYmIHN0cmluZ1sxXSA9PSAneCcpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfang7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaCcgJiYgc3RyaW5nWzFdID09ICd4JykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9oeDsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG1hY2hpbmUgPT0gYXAtPm1hY2gpICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHRoZSBpOTYwCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLQotICAvKiBUaGUgaTk2MCBoYXMgZGlzdGluY3Qgc3Vic3BlY2llcyB3aGljaCBtYXkgbm90IGludGVyYnJlZWQ6Ci0JQ09SRSBDQSAgICAgICAgICAKLQlDT1JFIEtBIEtCIE1DIFhBCi0JQ09SRSBIWCBKWAotICAgICBBbnkgYXJjaGl0ZWN0dXJlIG9uIHRoZSBzYW1lIGxpbmUgaXMgY29tcGF0aWJsZSwgdGhlIG9uZSBvbgotICAgICB0aGUgcmlnaHQgaXMgdGhlIGxlYXN0IHJlc3RyaWN0aXZlLiAgCi0gICAgIAotICAgICBXZSByZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhbiBhcnJheSwgZWFjaCBtYWNoaW5lIHRvIGEgc2lkZSAqLwotCi0jZGVmaW5lIEVSUk9SCTAKLSNkZWZpbmUgQ09SRQliZmRfbWFjaF9pOTYwX2NvcmUgIC8qMSovICAKLSNkZWZpbmUgS0EgCWJmZF9tYWNoX2k5NjBfa2Ffc2EgLyoyKi8gCi0jZGVmaW5lIEtCIAliZmRfbWFjaF9pOTYwX2tiX3NiIC8qMyovCi0jZGVmaW5lIE1DIAliZmRfbWFjaF9pOTYwX21jICAgIC8qNCovCi0jZGVmaW5lIFhBIAliZmRfbWFjaF9pOTYwX3hhICAgIC8qNSovCi0jZGVmaW5lIENBIAliZmRfbWFjaF9pOTYwX2NhICAgIC8qNiovCi0jZGVmaW5lIEpYCWJmZF9tYWNoX2k5NjBfanggICAgLyo3Ki8KLSNkZWZpbmUgSFgJYmZkX21hY2hfaTk2MF9oeCAgICAvKjgqLwotI2RlZmluZSBNQVhfQVJDSCAoKGludClIWCkKLQotICBzdGF0aWMgQ09OU1QgdW5zaWduZWQgbG9uZyBtYXRyaXhbTUFYX0FSQ0grMV1bTUFYX0FSQ0grMV0gPSAKLSAgICB7Ci0gICAgICB7IEVSUk9SLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBDT1JFLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBLQSwJS0EsCUtBLAlLQiwJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgS0IsCUtCLAlLQiwJS0IsCU1DLAlYQSwJRVJST1IsIAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBNQywJTUMsCU1DLAlNQywJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgWEEsCVhBLAlYQSwJWEEsCVhBLAlYQSwJRVJST1IsCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IENBLAlDQSwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUNBLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBKWCwJSlgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwgIEpYLAlIWCB9LAotICAgICAgeyBIWCwJSFgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJSFgsCUhYIH0sCi0gICAgfTsKLQotCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgbWF0cml4W2EtPm1hY2hdW2ItPm1hY2hdID09IEVSUk9SKSAKLSAgICB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICByZXR1cm4gKGEtPm1hY2ggID09ICBtYXRyaXhbYS0+bWFjaF1bYi0+bWFjaF0pID8gIGEgOiBiOwotICAgIH0KLX0KLQotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0jZGVmaW5lIE4oYSxiLGQsbikgXAoteyAzMiwgMzIsIDgsYmZkX2FyY2hfaTk2MCxhLCJpOTYwIixiLDMsZCxjb21wYXRpYmxlLHNjYW5fOTYwX21hY2gsbix9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17IAotICBOKGJmZF9tYWNoX2k5NjBfa2Ffc2EsImk5NjA6a2Ffc2EiLGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4oYmZkX21hY2hfaTk2MF9rYl9zYiwiaTk2MDprYl9zYiIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9pOTYwX21jLCAgICJpOTYwOm1jIiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbM10pLAotICBOKGJmZF9tYWNoX2k5NjBfeGEsICAgImk5NjA6eGEiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCi0gIE4oYmZkX21hY2hfaTk2MF9jYSwgICAiaTk2MDpjYSIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2p4LCAgICJpOTYwOmp4IiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbNl0pLAotICBOKGJmZF9tYWNoX2k5NjBfaHgsCSJpOTYwOmh4IiwgICBmYWxzZSwgMCksCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaCA9Ci0gIE4oYmZkX21hY2hfaTk2MF9jb3JlLCAiaTk2MDpjb3JlIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tMTAyMDAuYyBiL2JmZC9jcHUtbTEwMjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGE2NzguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTWF0c3VzaGl0YSAxMDIwMCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMjAwX2FyY2ggPQotICB7Ci0gICAgMTYsIC8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gICAgMjQsIC8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbW4xMDIwMCwKLSAgICAyMDAsCi0gICAgIm1uMTAyMDAiLAotICAgICJtbjEwMjAwIiwKLSAgICAyLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0xMDMwMC5jIGIvYmZkL2NwdS1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1ZDA5Ny4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMzAwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FtMzNfYXJjaCA9Ci0gIHsKLSAgICAzMiwgLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMzAwLAotICAgIDMzMCwKLSAgICAiYW0zMyIsCi0gICAgImFtMzMiLAotICAgIDIsCi0gICAgZmFsc2UsCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaCA9Ci0gIHsKLSAgICAzMiwgLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMzAwLAotICAgIDMwMCwKLSAgICAibW4xMDMwMCIsCi0gICAgIm1uMTAzMDAiLAotICAgIDIsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgJmJmZF9hbTMzX2FyY2gsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0zMnIuYyBiL2JmZC9jcHUtbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVhZDQxLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbTMyci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNMzJSIHByb2Nlc3Nvci4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9tMzJyLCBudW1iZXIsICJtMzJyIiwgcHJpbnQsIDQsIGRlZmF1bHQsIFwKLSAgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCB9Ci0KLSNkZWZpbmUgTkVYVCBOVUxMCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIE4gKGJmZF9tYWNoX20zMnJ4LCAibTMycngiLCBmYWxzZSwgTlVMTCkKLX07Ci0KLSN1bmRlZiBORVhUCi0jZGVmaW5lIE5FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tMzJyX2FyY2ggPQotICBOIChiZmRfbWFjaF9tMzJyLCAibTMyciIsIHRydWUsIE5FWFQpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tNjhrLmMgYi9iZmQvY3B1LW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0MTgyZC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIGFyY2hpdGVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKG5hbWUsIHByaW50LGQsbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbTY4aywgbmFtZSwgIm02OGsiLHByaW50LDIsZCxiZmRfZGVmYXVsdF9jb21wYXRpYmxlLGJmZF9kZWZhdWx0X3NjYW4sIG5leHQsIH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTihiZmRfbWFjaF9tNjgwMDAsICJtNjhrOjY4MDAwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTihiZmRfbWFjaF9tNjgwMDgsICJtNjhrOjY4MDA4IiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9tNjgwMTAsICJtNjhrOjY4MDEwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzNdKSwKLSAgTihiZmRfbWFjaF9tNjgwMjAsICJtNjhrOjY4MDIwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzRdKSwKLSAgTihiZmRfbWFjaF9tNjgwMzAsICJtNjhrOjY4MDMwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9tNjgwNDAsICJtNjhrOjY4MDQwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzZdKSwKLSAgTihiZmRfbWFjaF9jcHUzMiwgICJtNjhrOmNwdTMyIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzddKSwKLSAgTihiZmRfbWFjaF9tNjgwNjAsICJtNjhrOjY4MDYwIiwgZmFsc2UsIDApLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tNjhrX2FyY2ggPQotICBOKDAsICJtNjhrIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tODhrLmMgYi9iZmQvY3B1LW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTZjNS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgbTg4ayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTg4a19hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbTg4aywKLSAgICA4ODEwMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAibTg4ayIsCi0gICAgIm04OGs6ODgxMDAiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW1jb3JlLmMgYi9iZmQvY3B1LW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlM2FmMWYuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUgYXJjaGl0ZWN0dXJlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21jb3JlX2FyY2ggPQotewotICAzMiwJCSAgCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCSAgCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCSAgCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX21jb3JlLCAJCS8qIEFyY2hpdGVjdHVyZSAqLwotICAwLAkJICAJCS8qIE1hY2hpbmUgbnVtYmVyIC0gMCBmb3Igbm93ICovCi0gICJNQ29yZSIsCSAgCQkvKiBBcmNoaXRlY3R1cmUgbmFtZSAqLwotICAiTUNvcmUiLAkgIAkJLyogUHJpbnRhYmxlIG5hbWUgKi8KLSAgMywJCSAgCQkvKiBTZWN0aW9uIGFsaWduIHBvd2VyICovCi0gIHRydWUsCQkgIAkJLyogSXMgdGhpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgPyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAkvKiBBcmNoaXRlY3R1cmUgY29tcGFyaXNvbiBmdW5jdGlvbiAqLwotICBiZmRfZGVmYXVsdF9zY2FuLAkgICAJLyogU3RyaW5nIHRvIGFyY2hpdGVjdHVyZSBjb252ZXJzaW9uICovCi0gIE5VTEwJCQkgICAJLyogTmV4dCBpbiBsaXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1taXBzLmMgYi9iZmQvY3B1LW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzM2I4Yy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgbWlwcyBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihCSVRTX1dPUkQsIEJJVFNfQUREUiwgTlVNQkVSLCBQUklOVCwgREVGQVVMVCwgTkVYVCkJCVwKLSAgewkJCQkJCQlcCi0gICAgQklUU19XT1JELCAvKiAgYml0cyBpbiBhIHdvcmQgKi8JCQlcCi0gICAgQklUU19BRERSLCAvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCQlcCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwkJCQlcCi0gICAgYmZkX2FyY2hfbWlwcywJCQkJCVwKLSAgICBOVU1CRVIsCQkJCQkJXAotICAgICJtaXBzIiwJCQkJCQlcCi0gICAgUFJJTlQsCQkJCQkJXAotICAgIDMsCQkJCQkJCVwKLSAgICBERUZBVUxULAkJCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAJCQkJXAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCQkJCQlcCi0gICAgTkVYVCwJCQkJCQlcCi0gIH0KLQotZW51bSB7Ci1JX21pcHMzMDAwLCAKLUlfbWlwczM5MDAsIAotSV9taXBzNDAwMCwgCi1JX21pcHM0MDEwLCAKLUlfbWlwczQxMDAsIAotSV9taXBzNDExMSwKLUlfbWlwczQzMDAsIAotSV9taXBzNDQwMCwgCi1JX21pcHM0NjAwLCAKLUlfbWlwczQ2NTAsIAotSV9taXBzNTAwMCwgCi1JX21pcHM2MDAwLCAKLUlfbWlwczgwMDAsIAotSV9taXBzMTAwMDAsCi1JX21pcHMxNgotfTsKLQotCi0jZGVmaW5lIE5OKGluZGV4KSAoJmFyY2hfaW5mb19zdHJ1Y3RbKGluZGV4KSsxXSkKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoMzIsIDMyLCBiZmRfbWFjaF9taXBzMzAwMCwgIm1pcHM6MzAwMCIsIGZhbHNlLCBOTihJX21pcHMzMDAwKSksCi0gIE4gKDMyLCAzMiwgYmZkX21hY2hfbWlwczM5MDAsICJtaXBzOjM5MDAiLCBmYWxzZSwgTk4oSV9taXBzMzkwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MDAwLCAibWlwczo0MDAwIiwgZmFsc2UsIE5OKElfbWlwczQwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDAxMCwgIm1pcHM6NDAxMCIsIGZhbHNlLCBOTihJX21pcHM0MDEwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQxMDAsICJtaXBzOjQxMDAiLCBmYWxzZSwgTk4oSV9taXBzNDEwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MTExLCAibWlwczo0MTExIiwgZmFsc2UsIE5OKElfbWlwczQxMTEpKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDMwMCwgIm1pcHM6NDMwMCIsIGZhbHNlLCBOTihJX21pcHM0MzAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQ0MDAsICJtaXBzOjQ0MDAiLCBmYWxzZSwgTk4oSV9taXBzNDQwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0NjAwLCAibWlwczo0NjAwIiwgZmFsc2UsIE5OKElfbWlwczQ2MDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDY1MCwgIm1pcHM6NDY1MCIsIGZhbHNlLCBOTihJX21pcHM0NjUwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczUwMDAsICJtaXBzOjUwMDAiLCBmYWxzZSwgTk4oSV9taXBzNTAwMCkpLAotICBOICgzMiwgMzIsIGJmZF9tYWNoX21pcHM2MDAwLCAibWlwczo2MDAwIiwgZmFsc2UsIE5OKElfbWlwczYwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzODAwMCwgIm1pcHM6ODAwMCIsIGZhbHNlLCBOTihJX21pcHM4MDAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczEwMDAwLCAibWlwczoxMDAwMCIsIGZhbHNlLCBOTihJX21pcHMxMDAwMCkpLAotCi0KLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzMTYsICAgIm1pcHM6MTYiLCAgIGZhbHNlLCAwKSwKLX07Ci0KLS8qIFRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSBpcyBtaXBzOjMwMDAsIGJ1dCB3aXRoIGEgbWFjaGluZSBudW1iZXIgb2YKLSAgIHplcm8uICBUaGlzIGxldHMgdGhlIGxpbmtlciBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZGVmYXVsdCBzZXR0aW5nCi0gICBvZiBtaXBzLCBhbmQgYW4gZXhwbGljaXQgc2V0dGluZyBvZiBtaXBzOjMwMDAuICAqLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaCA9Ci1OICgzMiwgMzIsIDAsICJtaXBzIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1uczMyay5jIGIvYmZkL2NwdS1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzRlMjViLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbnMzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDg0NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIG5zMzJrIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDk0LCA5NSwgOTYsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQWxtb3N0IHRvdGFsbHkgcmV3cml0dGVuIGJ5IElhbiBEYWxsIGZyb20gaW5pdGlhbCB3b3JrCi0gICBieSBBbmRyZXcgQ2FnbmV5LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJuczMyay5oIgotCi0jZGVmaW5lIE4obWFjaGluZSwgcHJpbnRhYmxlLCBkLCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9uczMyaywgbWFjaGluZSwgIm5zMzJrIixwcmludGFibGUsMyxkLGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCwgfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17IAotICBOKDMyNTMyLCJuczMyazozMjUzMiIsdHJ1ZSwgMCksIC8qIHRoZSB3b3JkIG5zMzJrIHdpbGwgbWF0Y2ggdGhpcyB0b28gKi8KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbnMzMmtfYXJjaCA9Ci0gIE4oMzIwMzIsIm5zMzJrOjMyMDMyIixmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwotCi1zdGF0aWMgbG9uZwotbnMzMmtfc2lnbl9leHRlbmQodmFsdWUsIGJpdHMpCi0gICAgIGludCB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci17Ci0gIHZhbHVlID0gdmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKTsKLSAgcmV0dXJuICh2YWx1ZSAmICgxIDw8IChiaXRzLTEpKQotCSAgPyB2YWx1ZSB8ICh+KCgxIDw8IGJpdHMpIC0gMSkpCi0JICA6IHZhbHVlKTsKLX0KLQotbG9uZwotX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50KGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBsb25nIHZhbHVlOwotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQgKCpidWZmZXIsIDcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIrKyk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcisrKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLV9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCh2YWx1ZSwgYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKHZhbHVlIDwgLTY0IHx8IHZhbHVlID4gNjMpCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWUmPTB4N2Y7Ci0gICAgICAqYnVmZmVyKys9dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAodmFsdWUgPCAtODE5MiB8fCB2YWx1ZSA+IDgxOTEpCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWUmPTB4M2ZmZjsKLSAgICAgIHZhbHVlfD0weDgwMDA7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGlmICh2YWx1ZSA8IC0weDFmMDAwMDAwIHx8IHZhbHVlID49IDB4MjAwMDAwMDApCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWV8PTB4YzAwMDAwMDA7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj4yNCk7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj4xNik7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWxvbmcKLV9iZmRfbnMzMmtfZ2V0X2ltbWVkaWF0ZSAoYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGxvbmcgdmFsdWUgPSAwOwotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMzoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMjoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMToKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLV9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSAodmFsdWUsIGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBsb25nIHZhbHVlOwotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBidWZmZXIgKz0gb2Zmc2V0ICsgc2l6ZSAtIDE7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIGNhc2UgMzoKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7Ci0gICAgY2FzZSAxOgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBwZXJmb3JtX3JlbG9jYXRpb24gZXhjZXB0IHdlCi0gKiB1c2UgZ2V0X2RhdGEgYW5kIHB1dF9kYXRhIHdoaWNoIGtub3cgYWJvdXQgdGhlIG5zMzJrCi0gKiBzdG9yYWdlIG1ldGhvZHMuCi0gKiBUaGlzIGlzIHByb2JhYmx5IGEgbG90IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCBuZWVkcyB0byBiZSEKLSAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UsIGdldF9kYXRhLCBwdXRfZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgbG9uZyAoKmdldF9kYXRhKSgpOwotICAgICBpbnQgKCpwdXRfZGF0YSkoKTsKLXsKLSAgaW50IG92ZXJmbG93ID0gMDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLQotICBpZiAoKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotICAgICB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgQW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBhIHZhbHVlIG9mIHplcm8gKFNWUjQgQUJJLCBwLiA0LTI3KS4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICYmIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgV2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTgotCSB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFuZCB0aGUKLQkgbG9jYXRpb24uICBSRUxPQ0FUSU9OIGlzIGFscmVhZHkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KLQotCSBXZSBzdGFydCBieSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nCi0JIHRoZSBsb2NhdGlvbi4KLQotCSBJZiBwY3JlbF9vZmZzZXQgaXMgc2V0LCB3ZSBtdXN0IGZ1cnRoZXIgc3VidHJhY3QgdGhlIHBvc2l0aW9uCi0JIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBTb21lIHRhcmdldHMgYXJyYW5nZSBmb3IKLQkgdGhlIGFkZGVuZCB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbgotCSB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBleGFtcGxlLCBpMzg2LWFvdXQgZG9lcyB0aGlzLiAgRm9yCi0JIGkzODYtYW91dCwgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgU29tZSBvdGhlciB0YXJnZXRzIGRvIG5vdAotCSBpbmNsdWRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb247IGZvciBleGFtcGxlLCBtODhrYmNzLAotCSBvciBFTEYuICBGb3IgdGhvc2UgdGFyZ2V0cywgcGNyZWxfb2Zmc2V0IGlzIHRydWUuCi0KLQkgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGVuIHdlIG11c3QgZW5zdXJlCi0JIHRoYXQgdGhpcyByZWxvYyB3aWxsIGJlIGNvcnJlY3RseSBjb21wdXRlZCB3aGVuIHRoZSBmaW5hbAotCSByZWxvY2F0aW9uIGlzIGRvbmUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2Ugd2FudCB0byB3aW5kCi0JIHVwIHdpdGggdGhlIG5lZ2F0aXZlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sCi0JIHdoaWNoIG1lYW5zIHdlIG11c3QgYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYnkgdGhlIGNoYW5nZQotCSBpbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIHRydWUKLQkgd2UgZG8gbm90IHdhbnQgdG8gYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYXQgYWxsLgotCi0JIEZJWE1FOiBUaGlzIHNlZW1zIGxvZ2ljYWwgdG8gbWUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLQkgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgaXQgaXMgbm90IHdoYXQgdGhlIGNvZGUKLQkgYWN0dWFsbHkgZG9lcy4gIEkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgc2VlbXMKLQkgZmFyIHRvbyBsaWtlbHkgdGhhdCBzb21ldGhpbmcgd2lsbCBicmVhay4gICovCi0KLSAgICAgIHJlbG9jYXRpb24gLT0KLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgICAgIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgICAgIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBmbGFnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBidXQgaW5wbGFjZSwgc28gbW9kaWZ5IHRoZQotCSAgICAgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JICAgICBJZiB3ZSd2ZSByZWxvY2F0ZWQgd2l0aCBhIHN5bWJvbCB3aXRoIGEgc2VjdGlvbiwgY2hhbmdlCi0JICAgICBpbnRvIGEgcmVmIHRvIHRoZSBzZWN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3ltYm9sLiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogV1RGPz8gKi8KLQkgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwKQotCSAgICB7Ci0jaWYgMQotCSAgICAgIC8qIEZvciBtNjhrLWNvZmYsIHRoZSBhZGRlbmQgd2FzIGJlaW5nIHN1YnRyYWN0ZWQgdHdpY2UgZHVyaW5nCi0JCSByZWxvY2F0aW9uIHdpdGggLXIuICBSZW1vdmluZyB0aGUgbGluZSBiZWxvdyB0aGlzIGNvbW1lbnQKLQkJIGZpeGVzIHRoYXQgcHJvYmxlbTsgc2VlIFBSIDI5NTMuCi0KLUhvd2V2ZXIsIElhbiB3cm90ZSB0aGUgZm9sbG93aW5nLCByZWdhcmRpbmcgcmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3csCi13aGljaCBleHBsYWlucyB3aHkgaXQgaXMgc3RpbGwgZW5hYmxlZDogIC0tZGptCi0KLUlmIHlvdSBwdXQgYSBwYXRjaCBsaWtlIHRoYXQgaW50byBCRkQgeW91IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBDT0ZGCi1saW5rZXJzLiAgSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHBhdGNoIHdpbGwgYnJlYWsgY29mZi1pMzg2IChlLmcuLAotU0NPKTsgc2VlIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYyB3aGVyZSBJIHdvcmtlZCBhcm91bmQgdGhlCi1wcm9ibGVtIGluIGEgZGlmZmVyZW50IHdheS4gIFRoZXJlIG1heSB2ZXJ5IHdlbGwgYmUgYSByZWFzb24gdGhhdCB0aGUKLWNvZGUgd29ya3MgYXMgaXQgZG9lcy4KLQotSG1tbS4gIFRoZSBmaXJzdCBvYnZpb3VzIHBvaW50IGlzIHRoYXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzaG91bGQKLW5vdCBoYXZlIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBmbGF2b3VyLiAgSXQncyBzZWVtIGxpa2UKLWVudGlyZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3Igc3VjaCBhIHRoaW5nLiAgVGhlIHNlY29uZCBvYnZpb3VzIHBvaW50Ci1pcyB0aGF0IHRoZSBjdXJyZW50IGNvZGUgaWdub3JlcyB0aGUgcmVsb2MgYWRkZW5kIHdoZW4gcHJvZHVjaW5nCi1yZWxvY2F0ZWFibGUgb3V0cHV0IGZvciBDT0ZGLiAgVGhhdCdzIHBlY3VsaWFyLiAgSW4gZmFjdCwgSSByZWFsbHkKLWhhdmUgbm8gaWRlYSB3aGF0IHRoZSBwb2ludCBvZiB0aGUgbGluZSB5b3Ugd2FudCB0byByZW1vdmUgaXMuCi0KLUEgdHlwaWNhbCBDT0ZGIHJlbG9jIHN1YnRyYWN0cyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIGFkZHMgaW4KLXRoZSBuZXcgdmFsdWUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZSAoaWYgaXQncyBhIHBjCi1yZWxhdGl2ZSByZWxvYyBpdCBhZGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlCi1sb2NhdGlvbikuICBXaGVuIHJlbG9jYXRpbmcgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGF0IHByb3BlcnR5LgotCi1CRkQgaGFuZGxlcyB0aGlzIGJ5IHNldHRpbmcgdGhlIGFkZGVuZCB0byB0aGUgbmVnYXRpdmUgb2YgdGhlIG9sZAotdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFVuZm9ydHVuYXRlbHkgaXQgaGFuZGxlcyBjb21tb24gc3ltYm9scyBpbiBhCi1ub24tc3RhbmRhcmQgd2F5IChpdCBkb2Vzbid0IHN1YnRyYWN0IHRoZSBvbGQgdmFsdWUpIGJ1dCB0aGF0J3MgYQotZGlmZmVyZW50IHN0b3J5ICh3ZSBjYW4ndCBjaGFuZ2UgaXQgd2l0aG91dCBsb3NpbmcgYmFja3dhcmQKLWNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb2JqZWN0IGZpbGVzKSAoY29mZi1pMzg2IGRvZXMgc3VidHJhY3QgdGhlIG9sZAotdmFsdWUsIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBjb2ZmLWkzODYgdGFyZ2V0cywgbGlrZSBTQ08pLgotCi1TbyBldmVyeXRoaW5nIHdvcmtzIGZpbmUgd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBXaGVuCi13ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGxvZ2ljYWxseSB3ZSBzaG91bGQgZG8gZXhhY3RseQotd2hhdCB3ZSBkbyB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoZXJlZm9yZSwgeW91cgotcGF0Y2ggaXMgY29ycmVjdC4gIEluIGZhY3QsIGl0IHNob3VsZCBwcm9iYWJseSBhbHdheXMganVzdCBzZXQKLXJlbG9jX2VudHJ5LT5hZGRlbmQgdG8gMCBmb3IgYWxsIGNhc2VzLCBzaW5jZSBpdCBpcywgaW4gZmFjdCwgZ29pbmcgdG8KLWFkZCB0aGUgdmFsdWUgaW50byB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIHdvbid0IGh1cnQgdGhlIENPRkYgY29kZSwKLXdoaWNoIGRvZXNuJ3QgdXNlIHRoZSBhZGRlbmQ7IEknbSBub3Qgc3VyZSB3aGF0IGl0IHdpbGwgZG8gdG8gb3RoZXIKLWZvcm1hdHMgKHRoZSB0aGluZyB0byBjaGVjayBmb3Igd291bGQgYmUgd2hldGhlciBhbnkgZm9ybWF0cyBib3RoIHVzZQotdGhlIGFkZGVuZCBhbmQgc2V0IHBhcnRpYWxfaW5wbGFjZSkuCi0KLVdoZW4gSSB3YW50ZWQgdG8gbWFrZSBjb2ZmLWkzODYgcHJvZHVjZSByZWxvY2F0ZWFibGUgb3V0cHV0LCBJIHJhbgotaW50byB0aGUgcHJvYmxlbSB0aGF0IHlvdSBhcmUgcnVubmluZyBpbnRvOiBJIHdhbnRlZCB0byByZW1vdmUgdGhhdAotbGluZS4gIFJhdGhlciB0aGFuIHJpc2sgaXQsIEkgbWFkZSB0aGUgY29mZi1pMzg2IHJlbG9jcyB1c2UgYSBzcGVjaWFsCi1mdW5jdGlvbjsgaXQncyBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMuICBUaGUgZnVuY3Rpb24KLXNwZWNpZmljYWxseSBhZGRzIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgb2JqZWN0IGZpbGUsIGtub3dpbmcgdGhhdAotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBub3QgZ29pbmcgdG8uICBJZiB5b3UgcmVtb3ZlIHRoYXQgbGluZSwgdGhlbgotY29mZi1pMzg2LmMgd2lsbCB3aW5kIHVwIGFkZGluZyB0aGUgYWRkZW5kIGZpZWxkIGluIHR3aWNlLiAgSXQncwotdHJpdmlhbCB0byBmaXg7IGl0IGp1c3QgbmVlZHMgdG8gYmUgZG9uZS4KLQotVGhlIHByb2JsZW0gd2l0aCByZW1vdmluZyB0aGUgbGluZSBpcyBqdXN0IHRoYXQgaXQgbWF5IGJyZWFrIHNvbWUKLXdvcmtpbmcgY29kZS4gIFdpdGggQkZEIGl0J3MgaGFyZCB0byBiZSBzdXJlIG9mIGFueXRoaW5nLiAgVGhlIHJpZ2h0Ci13YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgc2ltcGx5IHRvIGJ1aWxkIGFuZCB0ZXN0IGF0IGxlYXN0IGFsbCB0aGUKLXN1cHBvcnRlZCBDT0ZGIHRhcmdldHMuICBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIGlmIHRpbWUgYW5kIGRpc2sKLXNwYWNlIGNvbnN1bWluZy4gIEZvciBlYWNoIHRhcmdldDoKLSAgICAxKSBidWlsZCB0aGUgbGlua2VyCi0gICAgMikgZ2VuZXJhdGUgc29tZSBleGVjdXRhYmxlLCBhbmQgbGluayBpdCB1c2luZyAtciAoSSB3b3VsZAotICAgICAgIHByb2JhYmx5IHVzZSBwYXJhbm9pYS5vIGFuZCBsaW5rIGFnYWluc3QgbmV3bGliL2xpYmMuYSwgd2hpY2gKLSAgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cyB3b3VsZCBiZSBhdmFpbGFibGUgaW4KLSAgICAgICAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9ILWhvc3QvdGFyZ2V0L2xpYi9saWJjLmEpLgotICAgIDMpIG1ha2UgdGhlIGNoYW5nZSB0byByZWxvYy5jCi0gICAgNCkgcmVidWlsZCB0aGUgbGlua2VyCi0gICAgNSkgcmVwZWF0IHN0ZXAgMgotICAgIDYpIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGVzIGFyZSB0aGUgc2FtZSwgeW91IGhhdmUgYXQgbGVhc3QKLSAgICAgICBtYWRlIGl0IG5vIHdvcnNlCi0gICAgNykgaWYgdGhleSBhcmUgZGlmZmVyZW50IHlvdSBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmVyc2lvbiBpcwotICAgICAgIHJpZ2h0Ci0qLwotCSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFRoaXMgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGJlZm9yZSB3ZSBnZXQgaGVyZS4gIEZvciBhIGNvcnJlY3QgY2hlY2sgd2UKLSAgICAgbmVlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBpbiBhIHNpemUgbGFyZ2VyIHRoYW4gYml0c2l6ZSwgYnV0IHdlCi0gICAgIGNhbid0IHJlYXNvbmFibHkgZG8gdGhhdCBmb3IgYSByZWxvYyB0aGUgc2FtZSBzaXplIGFzIGEgaG9zdAotICAgICBtYWNoaW5lIHdvcmQuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBkbyBvdmVyZmxvdyBjaGVja2luZyBvbiB0aGUgcmVzdWx0IGFmdGVyCi0gICAgIGFkZGluZyBpbiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGNoZWNrOwotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgcmVsb2NhdGlvbiwgYnV0Ci0JIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiB6ZXJvLiAgKi8KLSAgICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA+IGhvd3RvLT5iaXRwb3MpCi0JY2hlY2sgPSByZWxvY2F0aW9uID4+IChob3d0by0+cmlnaHRzaGlmdCAtIGhvd3RvLT5iaXRwb3MpOwotICAgICAgZWxzZQotCWNoZWNrID0gcmVsb2NhdGlvbiA8PCAoaG93dG8tPmJpdHBvcyAtIGhvd3RvLT5yaWdodHNoaWZ0KTsKLSAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQotCXsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKLQotCSAgICAvKiBUaGUgYWJvdmUgcmlnaHQgc2hpZnQgaXMgaW5jb3JyZWN0IGZvciBhIHNpZ25lZCB2YWx1ZS4KLQkgICAgICAgRml4IGl0IHVwIGJ5IGZvcmNpbmcgb24gdGhlIHVwcGVyIGJpdHMuICAqLwotCSAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPiBob3d0by0+Yml0cG9zCi0JCSYmIChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IDApCi0JICAgICAgY2hlY2sgfD0gKChiZmRfdm1hKSAtIDEKLQkJCSYgfigoYmZkX3ZtYSkgLSAxCi0JCQkgICAgPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcykpKTsKLQkgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgY2hlY2sgPiByZWxvY19zaWduZWRfbWF4Ci0JCXx8IChiZmRfc2lnbmVkX3ZtYSkgY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPQotCSAgICAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoKGJmZF92bWEpIGNoZWNrID4gcmVsb2NfdW5zaWduZWRfbWF4KQotCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY19iaXRzID0gKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLQkgICAgaWYgKCgoYmZkX3ZtYSkgY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gMAotCQkmJiAoKGJmZF92bWEpIGNoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkKLQkgICAgICB7Ci0JCS8qIFRoZSBhYm92ZSByaWdodCBzaGlmdCBpcyBpbmNvcnJlY3QgZm9yIGEgc2lnbmVkCi0JCSAgIHZhbHVlLiAgU2VlIGlmIHR1cm5pbmcgb24gdGhlIHVwcGVyIGJpdHMgZml4ZXMgdGhlCi0JCSAgIG92ZXJmbG93LiAgKi8KLQkJaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID4gaG93dG8tPmJpdHBvcwotCQkgICAgJiYgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgMCkKLQkJICB7Ci0JCSAgICBjaGVjayB8PSAoKGJmZF92bWEpIC0gMQotCQkJICAgICAgJiB+KChiZmRfdm1hKSAtIDEKLQkJCQkgID4+IChob3d0by0+cmlnaHRzaGlmdCAtIGhvd3RvLT5iaXRwb3MpKSk7Ci0JCSAgICBpZiAoKChiZmRfdm1hKSBjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAoLTEgJiB+cmVsb2NfYml0cykpCi0JCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JCSAgfQotCQllbHNlCi0JCSAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKgotICAgIEVpdGhlciB3ZSBhcmUgcmVsb2NhdGluZyBhbGwgdGhlIHdheSwgb3Igd2UgZG9uJ3Qgd2FudCB0byBhcHBseQotICAgIHRoZSByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSAocHJvYmFibHkgYmVjYXVzZSB0aGVyZSBpc24ndAotICAgIGFueSByb29tIGluIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGRlc2NyaWJlIGFkZGVuZHMgdG8gcmVsb2NzKQotICAgICovCi0KLSAgLyogVGhlIGNhc3QgdG8gYmZkX3ZtYSBhdm9pZHMgYSBidWcgaW4gdGhlIEFscGhhIE9TRi8xIEMgY29tcGlsZXIKLSAgICAgKE9TRiB2ZXJzaW9uIDEuMywgY29tcGlsZXIgdmVyc2lvbiAzLjExKS4gIEl0IG1pc2NvbXBpbGVzIHRoZQotICAgICBmb2xsb3dpbmcgcHJvZ3JhbToKLQotICAgICBzdHJ1Y3Qgc3RyCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBpbnQgaTA7Ci0gICAgIH0gcyA9IHsgMCB9OwotCi0gICAgIGludAotICAgICBtYWluICgpCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIHg7Ci0KLSAgICAgICB4ID0gMHgxMDAwMDAwMDA7Ci0gICAgICAgeCA8PD0gKHVuc2lnbmVkIGxvbmcpIHMuaTA7Ci0gICAgICAgaWYgKHggPT0gMCkKLQkgcHJpbnRmICgiZmFpbGVkXG4iKTsKLSAgICAgICBlbHNlCi0JIHByaW50ZiAoInN1Y2NlZWRlZCAoJWx4KVxuIiwgeCk7Ci0gICAgIH0KLSAgICAgKi8KLQotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKLQotICAvKiBXYWl0IGZvciB0aGUgZGF5IHdoZW4gYWxsIGhhdmUgdGhlIG1hc2sgaW4gdGhlbSAqLwotCi0gIC8qIFdoYXQgd2UgZG86Ci0gICAgIGkgaW5zdHJ1Y3Rpb24gdG8gYmUgbGVmdCBhbG9uZQotICAgICBvIG9mZnNldCB3aXRoaW4gaW5zdHJ1Y3Rpb24KLSAgICAgciByZWxvY2F0aW9uIG9mZnNldCB0byBhcHBseQotICAgICBTIHNyYyBtYXNrCi0gICAgIEQgZHN0IG1hc2sKLSAgICAgTiB+ZHN0IG1hc2sKLSAgICAgQSBwYXJ0IDEKLSAgICAgQiBwYXJ0IDIKLSAgICAgUiByZXN1bHQKLQotICAgICBEbyB0aGlzOgotICAgICBpIGkgaSBpIGkgbyBvIG8gbyBvICAgICAgICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgICAgICAgICBTIFMgUyBTIFMgICAgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByICB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgQSBBIEEgQSBBCi0gICAgIEFuZCB0aGlzOgotICAgICAuLi4gICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgTiBOIE4gTiBOICAgICAgICAgICAgZ2V0IGluc3RydWN0aW9uCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIC4uLiAgIEIgQiBCIEIgQgotCi0gICAgIEFuZCB0aGVuOgotICAgICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICAgIEEgQSBBIEEgQQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBSIFIgUiBSIFIgUiBSIFIgUiBSICAgICAgICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCAxKTsKLQlET0lUICh4KTsKLQlvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBpZiAocmVsb2NhdGlvbikKLQl7Ci0JICBzaG9ydCB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDIpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEsIGFkZHIsIDIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIGxvbmcgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCA0KTsKLQkgIERPSVQgKHgpOwotCSAgb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhLCBhZGRyLCA0KTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIC0yOgotICAgICAgewotCWxvbmcgIHggPSBnZXRfZGF0YShkYXRhLCBhZGRyLCA0KTsKLQlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0JRE9JVCh4KTsKLQlvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEgLCBhZGRyLCA0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogRG8gbm90aGluZyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0jaWZkZWYgQkZENjQKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIGJmZF92bWEgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCA4KTsKLQkgIERPSVQgKHgpOwotCSAgb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhLCBhZGRyLCA4KTsKLQl9Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotICAgIH0KLSAgaWYgKChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkgJiYgb3ZlcmZsb3cpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyogUmVsb2NhdGUgYSBnaXZlbiBsb2NhdGlvbiB1c2luZyBhIGdpdmVuIHZhbHVlIGFuZCBob3d0by4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9kb19uczMya19yZWxvY19jb250ZW50cyAoIGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uLAotCQkJICAgICAgZ2V0X2RhdGEsIHB1dF9kYXRhKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0gICAgIGxvbmcgKCpnZXRfZGF0YSkoKTsKLSAgICAgaW50ICgqcHV0X2RhdGEpKCk7Ci17Ci0gIGludCBzaXplOwotICBiZmRfdm1hIHg7Ci0gIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgLyogSWYgdGhlIHNpemUgaXMgbmVnYXRpdmUsIG5lZ2F0ZSBSRUxPQ0FUSU9OLiAgVGhpcyBpc24ndCB2ZXJ5Ci0gICAgIGdlbmVyYWwuICAqLwotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICAvKiBHZXQgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZWxvY2F0ZS4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgY2FzZSA4OgotI2VuZGlmCi0gICAgICB4ID0gZ2V0X2RhdGEgKGxvY2F0aW9uLCAwLCBzaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICBGSVhNRTogV2UgbWF5IGRyb3AgYml0cyBkdXJpbmcgdGhlIGFkZGl0aW9uCi0gICAgIHdoaWNoIHdlIGRvbid0IGNoZWNrIGZvci4gIFdlIG11c3QgZWl0aGVyIGNoZWNrIGF0IGV2ZXJ5IHNpbmdsZQotICAgICBvcGVyYXRpb24sIHdoaWNoIHdvdWxkIGJlIHRlZGlvdXMsIG9yIHdlIG11c3QgZG8gdGhlIGNvbXB1dGF0aW9ucwotICAgICBpbiBhIHR5cGUgbGFyZ2VyIHRoYW4gYmZkX3ZtYSwgd2hpY2ggd291bGQgYmUgaW5lZmZpY2llbnQuICAqLwotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLSAgICAgIGJmZF92bWEgYWRkOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKLQotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uOwotCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEcm9wIHVud2FudGVkIGJpdHMgZnJvbSB0aGUgdmFsdWUgd2UgYXJlIHJlbG9jYXRpbmcgdG8uICAqLwotCSAgY2hlY2sgPSByZWxvY2F0aW9uID4+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+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19CmRpZmYgLS1naXQgYS9iZmQvY3B1LXBqLmMgYi9iZmQvY3B1LXBqLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGRkMzMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1wai5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIFBpY28gSmF2YSBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgVHJhbnNtZXRhLiBzYWNAcG9ib3guY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjYXNlY21wIChpbmZvLT5wcmludGFibGVfbmFtZSwgc3RyaW5nKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAKLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCi0gICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotI2VuZGlmCi0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcGosCi0gICAgMCwKLSAgICAicGoiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAicGoiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMSwKLSAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIHNjYW5fbWFjaCwKLSAgICAwLAotICB9LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9wal9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9waiwKLSAgMCwKLSAgInBqIiwJCQkJLyogYXJjaF9uYW1lICAqLwotICAicGoiLAkJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgJmFyY2hfaW5mb19zdHJ1Y3QgWzBdCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1wb3dlcnBjLmMgYi9iZmQvY3B1LXBvd2VycGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmMGY4MC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXBvd2VycGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKiBCRkQgUG93ZXJQQyBDUFUgZGVmaW5pdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBUaGUgY29tbW9uIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgUlMvNjAwMC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnBvd2VycGNfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1wb3dlcnBjX2NvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIEJGRF9BU1NFUlQgKGEtPmFyY2ggPT0gYmZkX2FyY2hfcG93ZXJwYyk7Ci0gIHN3aXRjaCAoYi0+YXJjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSAgICAgIGlmIChhLT5tYWNoID09IDApCi0JcmV0dXJuIGE7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDMsIC8qIGZvciB0aGUgbXBjNjAzICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwMyIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzFdCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgNjA0LCAvKiBmb3IgdGhlIG1wYzYwNCAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzo2MDQiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFsyXQotICB9LAotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDQwMywgLyogZm9yIHRoZSA0MDMgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NDAzIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbM10KLSAgfSwKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDEsIC8qIGZvciB0aGUgbXBjNjAxICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwMSIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAKLSAgfQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9wb3dlcnBjX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDAsIC8qIGZvciB0aGUgUE9XRVIvUG93ZXJQQyBjb21tb24gYXJjaGl0ZWN0dXJlICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOmNvbW1vbiIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFswXQotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1yczYwMDAuYyBiL2JmZC9jcHUtcnM2MDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTJhZTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1yczYwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgcnM2MDAwIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEZJWE1FOiBDYW4gc29tZW9uZSBwcm92aWRlIGEgdHJhbnNsaXRlcmF0aW9uIG9mIHRoaXMgbmFtZSBpbnRvIEFTQ0lJPwotICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFycyBjYXVzZWQgYSBjb21waWxlciB3YXJuaW5nIG9uIEhJVVggKHNvIEkgcmVwbGFjZWQKLSAgIHRoZW0gd2l0aCBvY3RhbCBlc2NhcGVzKSwgYW5kIGlzbid0IHVzZWZ1bCB3aXRob3V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdAotICAgY2hhcmFjdGVyIHNldCBpdCBpcy4KLSAgIFdyaXR0ZW4gYnkgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSBvZiBJQk0KLSAgIGFuZCBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBUaGUgUlMvNjAwMCBhcmNoaXRlY3R1cmUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBQb3dlclBDIGNvbW1vbgotICAgYXJjaGl0ZWN0dXJlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqcnM2MDAwX2NvbXBhdGlibGUKLSAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotcnM2MDAwX2NvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIEJGRF9BU1NFUlQgKGEtPmFyY2ggPT0gYmZkX2FyY2hfcnM2MDAwKTsKLSAgc3dpdGNoIChiLT5hcmNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0gICAgICByZXR1cm4gYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSwgYik7Ci0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgaWYgKGItPm1hY2ggPT0gMCkKLQlyZXR1cm4gYjsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9yczYwMDBfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3JzNjAwMCwKLSAgICA2MDAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJyczYwMDAiLAotICAgICJyczYwMDA6NjAwMCIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgcnM2MDAwX2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1zaC5jIGIvYmZkL2NwdS1zaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFkZjkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtc2guYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgSGl0YWNoaS1TSCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjYXNlY21wIChpbmZvLT5wcmludGFibGVfbmFtZSwgc3RyaW5nKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAKLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCi0gICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotI2VuZGlmCi0KLSNkZWZpbmUgU0hfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFswXQotI2RlZmluZSBTSDNfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFsxXQotI2RlZmluZSBTSDNFX05FWFQgTlVMTAotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zaCwKLSAgICBiZmRfbWFjaF9zaDMsCi0gICAgInNoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICAgInNoMyIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIFNIM19ORVhUCi0gIH0sCi0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NoLAotICAgIGJmZF9tYWNoX3NoM2UsCi0gICAgInNoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICAgInNoM2UiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMSwKLSAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIHNjYW5fbWFjaCwKLSAgICBTSDNFX05FWFQKLSAgfSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc2hfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfc2gsCi0gIGJmZF9tYWNoX3NoLAotICAic2giLAkJCQkvKiBhcmNoX25hbWUgICovCi0gICJzaCIsCQkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgc2Nhbl9tYWNoLAotICBTSF9ORVhUCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1zcGFyYy5jIGIvYmZkL2NwdS1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRiZDkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIERvbid0IG1peCAzMiBiaXQgYW5kIDY0IGJpdCBmaWxlcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnNwYXJjX2NvbXBhdGlibGUKLSAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotc3BhcmNfY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5iaXRzX3Blcl93b3JkICE9IGItPmJpdHNfcGVyX3dvcmQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzpzcGFyY2xldCIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzFdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnNwYXJjbGl0ZSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzJdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY4cGx1cyIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzNdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OHBsdXNhIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNF0sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6c3BhcmNsaXRlX2xlIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNV0sCi0gIH0sCi0gIHsKLSAgICA2NCwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICA2NCwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzZdLAotICB9LAotICB7Ci0gICAgNjQsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgNjQsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjlhLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY5YSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH0KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc3BhcmNfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyYywKLSAgICAic3BhcmMiLAotICAgICJzcGFyYyIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgZGVmYXVsdCAqLwotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMF0sCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzMwLmMgYi9iZmQvY3B1LXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNzIzZjcuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWMzMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF90aWMzMCwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInRpYzMwIiwKLSAgInRtczMyMGMzMCIsCi0gIDIsCi0gIHRydWUsCQkJCS8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzgwLmMgYi9iZmQvY3B1LXRpYzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjg2NmUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBUSSBUTVMzMjBDODAgKE1WUCkgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIHN1cHBvcnQgKGZuZkBjeWdudXMuY29tKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWM4MF9hcmNoID0KLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfdGljODAsCQkvKiBiZmRfYXJjaGl0ZWN0dXJlIGVudW0gKi8KLSAgICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ0aWM4MCIsCQkJLyogYXJjaGl0ZWN0dXJlIG5hbWUgKi8KLSAgICAidGljODAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMiwJCQkJLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8KLSAgICB0cnVlLAkJCS8qIGRlZmF1bHQgbWFjaGluZSBmb3IgYXJjaGl0ZWN0dXJlICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICBOVUxMLAkJCQkvKiBQb2ludGVyIHRvIG5leHQgaW4gY2hhaW4gKi8KLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdjg1MC5jIGIvYmZkL2NwdS12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOTQxM2QuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBORUMgVjg1MCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLXN0YXRpYyBib29sZWFuIAotc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqIGluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7Ci17Ci0gIGNvbnN0IGNoYXIgKnB0cl9zcmM7Ci0gIGNvbnN0IGNoYXIgKnB0cl90c3Q7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBGaXJzdCB0ZXN0IGZvciBhbiBleGFjdCBtYXRjaCAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWUgaG93IG11Y2ggb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBtYXRjaGVzIHdpdGggdGhlCi0gICAgIGFyY2hpdGVjdHVyZSwgZWcgdGhlIHN0cmluZyBtNjhrOjY4MDIwIHdvdWxkIG1hdGNoIHRoZSBtNjhrIGVudHJ5Ci0gICAgIHVwIHRvIHRoZSA6LCB0aGVuIHdlIGdldCBsZWZ0IHdpdGggdGhlIG1hY2hpbmUgbnVtYmVyICovCi0KLSAgZm9yIChwdHJfc3JjID0gc3RyaW5nLCBwdHJfdHN0ID0gaW5mby0+YXJjaF9uYW1lOyAKLSAgICAgICAqcHRyX3NyYyAmJiAqcHRyX3RzdDsKLSAgICAgICBwdHJfc3JjKyssIHB0cl90c3QrKykgCi0gICAgewotICAgICAgaWYgKCpwdHJfc3JjICE9ICpwdHJfdHN0KSBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hld2VkIHVwIGFzIG11Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBhcyB3aWxsIG1hdGNoLCBza2lwIGFueQotICAgICBjb2xvbnMgKi8KLSAgaWYgKCpwdHJfc3JjID09ICc6JykKLSAgICBwdHJfc3JjKys7Ci0gIAotICBpZiAoKnB0cl9zcmMgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIG1vcmUsIHRoZW4gb25seSBrZWVwIHRoaXMgb25lIGlmIGl0IGlzIHRoZSBkZWZhdWx0Ci0JIG1hY2hpbmUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gICAgfQotCi0gIG51bWJlciA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKiBwdHJfc3JjICAtICcwJzsKLSAgICAgIHB0cl9zcmMrKzsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW1iZXIpIAotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgYXJjaCA9IGJmZF9hcmNoX3Y4NTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiBhcmNoID0gYmZkX2FyY2hfdjg1MDsgYnJlYWs7Ci0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX3Y4NTAsIG51bWJlciwgInY4NTAiLCBwcmludCwgMiwgZGVmYXVsdCwgXAotICAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KLQotI2RlZmluZSBORVhUIE5VTEwKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoYmZkX21hY2hfdjg1MGUsICAidjg1MGUiLCAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTiAoYmZkX21hY2hfdjg1MGVhLCAidjg1MGVhIiwgZmFsc2UsIE5VTEwpCi19OwotCi0jdW5kZWYgTkVYVAotI2RlZmluZSBORVhUICZhcmNoX2luZm9fc3RydWN0WzBdCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdjg1MF9hcmNoID0KLSAgTiAoYmZkX21hY2hfdjg1MCwgInY4NTAiLCB0cnVlLCBORVhUKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdmF4LmMgYi9iZmQvY3B1LXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM2ZDM5Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtdmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIHZheCBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdmF4X2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF92YXgsCi0gICAgMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAidmF4IiwKLSAgICAidmF4IiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS13NjUuYyBiL2JmZC9jcHUtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjY4YjMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBXREMgNjU4MTYgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1YmxpdzY1ZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3UgdzY1b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsInc2NSIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywidzY1ODE2IikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdzY1X2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3c2NSwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInc2NSIsCQkJLyogYXJjaF9uYW1lICAqLwotICAidzY1IiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXdlMzJrLmMgYi9iZmQvY3B1LXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGNiYzEuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13ZTMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciB3ZTMyayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3dlMzJrLAotICAgIDMyMDAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ3ZTMyayIsCi0gICAgIndlMzJrOjMyMDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS16OGsuYyBiL2JmZC9jcHUtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2U4ZWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS16OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgWjgwMG4gYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0jaWYgMAkJCQkvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KLS8qCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG8xNl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ob3d0bzhfRkZubl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotICBsb25nIHggPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGFib3J0ICgpOwotICBIT1dUT19QUkVQQVJFIChyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzggKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYWJvcnQgKCk7Ci0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Ci09IE5FV0hPV1RPIChob3d0bzE2X2NhbGxiYWNrLCAiYWJzMTYiLCAxLCBmYWxzZSwgZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAotPSBORVdIT1dUTyAoaG93dG84X2NhbGxiYWNrLCAiYWJzOCIsIDAsIGZhbHNlLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgotPSBORVdIT1dUTyAoaG93dG84X0ZGbm5fY2FsbGJhY2ssICJmZjAwK2FiczgiLCAwLCBmYWxzZSwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCi09IE5FV0hPV1RPIChob3d0bzhfcGNyZWxfY2FsbGJhY2ssICJwY3JlbDgiLCAwLCBmYWxzZSwgdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJmhvd3RvXzE2OwotICAgIGNhc2UgQkZEX1JFTE9DXzhfRkZubjoKLSAgICAgIHJldHVybiAmaG93dG9fOF9GRm5uOwotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICByZXR1cm4gJmhvd3RvXzg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotI2VuZGlmCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoICgpOwotCi1zdGF0aWMgYm9vbGVhbgotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjbXAgKHN0cmluZywgIno4MDAxIikgPT0gMCB8fCBzdHJjbXAgKHN0cmluZywgIno4ayIpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAxID09IGluZm8tPm1hY2g7Ci0gICAgfQotICBpZiAoc3RyY21wIChzdHJpbmcsICJ6ODAwMiIpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAyID09IGluZm8tPm1hY2g7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gYTsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHszMiwgMzIsIDgsIGJmZF9hcmNoX3o4aywgYmZkX21hY2hfejgwMDEsICJ6OGsiLCAiejgwMDEiLCAxLCBmYWxzZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAwLH0sCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3o4a19hcmNoID0KLXsKLSAgMzIsIDE2LCA4LCBiZmRfYXJjaF96OGssIGJmZF9tYWNoX3o4MDAyLCAiejhrIiwgIno4MDAyIiwgMSwgdHJ1ZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAmYXJjaF9pbmZvX3N0cnVjdFswXSwKLX07CmRpZmYgLS1naXQgYS9iZmQvZGVtbzY0LmMgYi9iZmQvZGVtbzY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTM4MWQuLjAwMDAwMDAKLS0tIGEvYmZkL2RlbW82NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGRlbW9uc3RyYXRpb24gNjQtYml0IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLSNkZWZpbmUgTVkoT1ApIENBVChkZW1vXzY0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAgImRlbW82NCIKLSNpbmNsdWRlICJhb3V0ZjEuaCIKZGlmZiAtLWdpdCBhL2JmZC9kZXAtaW4uc2VkIGIvYmZkL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGRkZTAuLjAwMDAwMDAKLS0tIGEvYmZkL2RlcC1pbi5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi06bG9vcAotL1xcJC9OCi1zL1xcXG4gKi8gL2cKLXQgbG9vcAotCi1zIVwubzohLmxvOiEKLXMhIEBCRkRfSEAhIWcKLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi1zIWhvc3RzL1teIF0qXC5oICEgIWcKLXMvIHN5c2RlcC5oLy9nCi1zISBcLlwuL2JmZC9zeXNkZXAuaCEhZwotcy8gbGliYmZkLmgvL2cKLXMvIGNvbmZpZy5oLy9nCi1zISBcJChJTkNESVIpL2ZvcGVuLVteIF0qXC5oISFnCi1zISBcJChJTkNESVIpL2Fuc2lkZWNsXC5oISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLXMvICo6LzovZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2JmZC9kb2MvQ2hhbmdlTG9nIGIvYmZkL2RvYy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllODIwN2EuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotVGh1IEZlYiAgNCAyMzoyMTozNiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggY3VycmVudCBhdXRvY29uZi9hdXRvbWFrZS4KLQotVGh1IEp1bCAyMyAwOTozNjo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmRpbnQudGV4aSAoQkZEIEVMRiBwcm9jZXNzb3IgcmVxdWlyZWQpOiBBZGQgcGFyYWdyYXBoCi0JZGVzY3JpYmluZyB0aGUgbmVjZXNzaXR5IHRvIGNyZWF0ZSAiaW5jbHVkZS9lbGYvQ1BVLmgiLgotCi1UaHUgTWF5ICA3IDE0OjQ1OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZXcubyk6IEFkZCAtSSBvcHRpb25zIGZvciBpbnRsIHNyY2RpciBhbmQKLQlvYmpkaXIuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAyNyAyMDoxOToyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGludC50ZXhpOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfVEVYSU5GT1MpOiBOZXcgdmFyaWFibGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAxMyAxNjo0ODo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByICA2IDE0OjA2OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFNUQUdFU1RVRkYpOiBSZW1vdmUgdmFyaWFibGUuCi0JKENMRUFORklMRVMpOiBEb24ndCByZW1vdmUgJChTVEFHRVNUVUZGKS4KLQkoRElTVENMRUFORklMRVMsIE1BSU5UQUlORVJDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDE2OjI1OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2hldy5jIChza2lwX3doaXRlX2FuZF9zdGFydHMpOiBSZW1vdmUgdW51c2VkIGRlY2xhcmF0aW9uLgotCShza2lwX3doaXRlX2FuZF9zdGFycyk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkoc2tpcF90cmFpbGluZ19uZXdsaW5lcywgcGFyYW1zdHVmZiwgY291cmllcml6ZSk6IExpa2V3aXNlLgotCShidWxsZXRpemUsIGRvX2ZhbmN5X3N0dWZmLCBpc2NvbW1hbmQpOiBMaWtld2lzZS4KLQkoa2lsbF9ib2d1c19saW5lcywgbmV4dHdvcmQsIG1haW4pOiBMaWtld2lzZS4KLQkobWFuZ2xlY29tbWVudHMpOiBDb21tZW50IG91dC4KLQkob3V0cHV0ZG90cywga2lsbF9ib2d1c19saW5lcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCShwZXJmb3JtLCBjb21waWxlKTogTGlrZXdpc2UuCi0JKGNvdXJpZXJpemUpOiBGdWxseSBwYXJlbnRoZXNpemUgZXhwcmVzc2lvbi4KLQkoY29weV9wYXN0X25ld2xpbmUpOiBEZWNsYXJlIHJldHVybiB2YWx1ZS4KLQkocHJpbnQpOiBDaGFuZ2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKG1haW4pOiBDYWxsIHVzYWdlIGZvciBhbiB1bnJlY29nbml6ZWQgb3B0aW9uLgotCi1GcmkgRmViIDEzIDE0OjM3OjE0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEphbiAyNiAxNTozODozNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jLnN0ciAoYm9keXRleHQpOiBEb24ndCBvdXRwdXQgQCogYXQgdGhlIGVuZC4KLQkqIGNoZXcuYyAoa2lsbF9ib2d1c19saW5lcyk6IE1ha2Ugc3VyZSB0aGF0IGEgcGVyaW9kIGF0IHRoZQotCWJlZ2lubmluZyBpcyByZWNvZ25pemVkLgotCShpbmRlbnQpOiBEb24ndCBwdXQgaW5kZW50YXRpb24gYXQgdGhlIGVuZC4KLQkoY29weV9wYXN0X25ld2xpbmUpOiBFeHBhbmQgdGFicy4KLQkqIE1ha2VmaWxlLmFtIChzLXJlbG9jLCBzLXN5bXMpOiBEZXBlbmQgb24gZG9jLnN0ci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgT2N0ICAxIDE0OjQxOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZC5oKTogRG9uJ3QgdXNlIGNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLCBvcgotCWVsZmNvZGUuaCBhcyBpbnB1dCBmaWxlczsgdGhleSBkb24ndCBjb250cmlidXRlIGFueXRoaW5nLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgMTUgMDQ6NTU6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBJbnZva2UgJChNS0RPQykgYXMgLi8kKE1LRE9DKS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXVnICAxIDEyOjU5OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENDX0ZPUl9CVUlMRCk6IERvbid0IHNldCBleHBsaWNpdGx5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKdWwgMzEgMjA6MDA6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQotVHVlIEp1bCAyMiAxNDo0NDowMCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2Ugc3RhbXAtKiBmaWxlcyB0byBzLSogZmlsZXMuICBVc2UgYmZkdC50ZXhpCi0JcmF0aGVyIHRoYW4gYmZkLnRleGkuCi0gCShET0NGSUxFUyk6IENoYW5nZSBiZmQudGV4aSB0byBiZmR0LnRleGkuCi0JKiBiZmQudGV4aW5mbzogSW5jbHVkZSBiZmR0LnRleGksIG5vdCBiZmQudGV4aS4KLQotTW9uIEp1biAxNiAxNTozMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQywgQ0ZMQUdTKTogU3Vic3RpdHV0ZSBmcm9tIGNvbmZpZ3VyZSBzY3JpcHQuCi0JRnJvbSBKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgotCi1UdWUgQXByIDE1IDEyOjM3OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFVzZSBta2luc3RhbGxkaXJzIHRvIGJ1aWxkCi0JJChpbmZvZGlyKS4KLQotVHVlIEFwciAgOCAxMjo0OTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBQZXJtaXQgaW5mbyBmaWxlcyB0byBiZSBpbiBzcmNkaXIuCi0JKHN0YW1wLSopOiBBZGQgYSBzdGFtcC1YIHRhcmdldCBmb3IgZWFjaCBYLnRleGkgdGFyZ2V0LgotCSgqLnRleGkpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLVguCi0JKGNsZWFuKTogUmVtb3ZlIHN0YW1wLSouCi0JKGRpc3RjbGVhbik6IERlcGVuZCB1cG9uIG1vc3RseWNsZWFuLiAgUmVtb3ZlIHN0YW1wLSouICBEb24ndAotCXJlbW92ZSAkKERPQ0ZJTEVTKS4KLQotTW9uIEFwciAgNyAxNToyMzoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgKi5pbmZvIGZpbGVzLgotCi1UaHUgRmViIDEzIDIwOjUwOjAyIDE5OTcgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAcHJvZ2lzLmRlKQotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCi1UdWUgSnVuIDE4IDE4OjMyOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2hldy5jIChraWxsX2JvZ3VzX2xpbmVzKTogUmVzZXQgc2wgd2hlbiBub3QgYXQgdGhlIHN0YXJ0IG9mIGEKLQlsaW5lLiAgRnJvbSBVd2UgT2hzZSA8dXdlQHRpcmthLmd1bi5kZT4uCi0KLVR1ZSBKYW4gMzAgMTQ6MTA6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogRGVwZW5kIHVwb24gcHJvdG8uc3RyLgotCShsaWJjb2ZmLmgsIGJmZC5oKTogTGlrZXdpc2UuCi0KLUZyaSBOb3YgIDMgMTQ6NDY6NDggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTUkNET0MsIFNSQ1BST1QsIGNvcmUudGV4aSwgYmZkLmgpOiAgVXNlIGNvcmVmaWxlLmMsIAotCXJlbmFtZWQgZnJvbSBjb3JlLmMuCi0KLVdlZCBOb3YgIDEgMTQ6Mjg6MjMgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNoZXcuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0KLUZyaSBPY3QgIDYgMTY6MjM6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBPbmx5IHJlbWFrZSB0aGlzIE1ha2VmaWxlLgotCi1XZWQgT2N0ICA0IDE1OjUxOjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjaGV3LmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgotCi1UdWUgU2VwIDEyIDE4OjE0OjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCi1UaHUgQXVnIDMxIDEyOjE4OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogQWRkIGFkZGl0aW9uYWwgI2VuZGlmIGF0IGVuZCBvZiBiZmQuaCBpZgotCV9fY3BsdXNwbHVzIGlzIGRlZmluZWQuCi0KLVR1ZSBOb3YgMjkgMTY6MTM6MzQgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2hldy5jICh3cml0ZV9idWZmZXIpOiBOZXcgYXJndW1lbnQgYGYnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgotCShzdGRvdXQsIHN0ZGVyciwgcHJpbnQsIGRyb3AsIGlkcm9wKTogTmV3IGZvcnRoIHdvcmRzLgotCSogcHJvdG8uc3RyIChDT01NRU5UKTogTmV3IGNvbW1hbmQuCi0JKiBkb2Muc3RyIChDT01NRU5UKTogTGlrZXdpc2UuCi0KLU1vbiBTZXAgMTIgMTE6NDQ6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBSZW1vdmUgY3Rvci50ZXhpLgotCShJUFJPVE9TKTogUmVtb3ZlIGN0b3IuaXAuCi0JKFNSQ0lQUk9UKTogUmVtb3ZlICQoc3JjZGlyKS8uLi9jdG9yLmMuCi0JKGN0b3IudGV4aSk6IFJlbW92ZSB0YXJnZXQuCi0JKGxpYmJmZC5oKTogUmVtb3ZlIGRlcGVuZGVuY3kgb24gJChzcmNkaXIpLy4uL2N0b3IuYy4gIFJlbW92ZQotCSQoTUtET0MpIHJ1biBvbiAkKHNyY2RpcikvLi4vY3Rvci5jLgotCSogYmZkLnRleGluZm8gKENvbnN0cnVjdG9ycyk6IFJlbW92ZSBzZWN0aW9uLgotCi1GcmkgU2VwICAyIDEzOjMzOjQ0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogSW5jbHVkZSBhc3NlcnQuaC4gIEFkZGVkIHByb3RvdHlwZXMgZm9yIG1vc3QgZnVuY3Rpb25zLgotCUNoYW5nZWQgbW9zdCB1c2VzIG9mIGludCB0byBsb25nLiAgRG8gYm91bmRzIGNoZWNraW5nIG9uIHRoZQotCXN0YWNrcy4gIEFkZGVkIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBkb2N1bWVudGluZyBtb3N0IG9mIHRoZQotCWludHJpbnNpY3MuICBMb3RzIG9mIHdoaXRlc3BhY2UgY2hhbmdlcy4gIFJlLW9yZGVyZWQgc29tZQotCWZ1bmN0aW9ucy4KLQkoZGllLCBjaGVja19yYW5nZSwgaWNoZWNrX3JhbmdlKTogTmV3IGZ1bmN0aW9ucy4KLQkoc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMsIHByaW50X3N0YWNrX2xldmVsKTogTmV3IGZ1bmN0aW9ucy4KLQkodHJhbnNsYXRlY29tbWVudHMpOiBEb24ndCBpbnNlcnQgdGFiIGJlZm9yZSAiLyoiLgotCShpc2NvbW1hbmQpOiBNaW5pbXVtIGNvbW1hbmQgbGVuZ3RoIGlzIG5vdyA0LgotCShuZXh0d29yZCk6IEhhbmRsZSBzb21lIFwtc2VxdWVuY2VzLgotCShwdXNoX2FkZHIpOiBEZWxldGVkLgotCShtYWluKTogQWRkIG5ldyBpbnRyaW5zaWNzIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIGFuZAotCXByaW50X3N0YWNrX2xldmVsLiAgQ29tcGxhaW4gYXQgZW5kIGlmIHN0YWNrIGNvbnRhaW5zIG1vcmUgdGhhbgotCW9uZSBlbGVtZW50LCBvciBsZXNzLgotCShyZW1jaGFyKTogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IGJlZm9yZSBjaG9wcGluZyBvZmYgYQotCWNoYXJhY3Rlci4KLQotCSogZG9jLnN0ciwgcHJvdG8uc3RyOiBIYW5kbGUgbmV3IGNvbW1hbmRzIFNFTlVNLCBFTlVNLCBFTlVNWCwKLQlFTlVNRVEsIEVOVU1FUVgsIEVOVU1ET0MuCi0KLVdlZCBKYW4gMTIgMTg6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogQWRkZWQgTGlua2VyIEZ1bmN0aW9ucyBub2RlLgotCSogZG9jL01ha2VmaWxlLmluIChET0NGSUxFUyk6IEFkZGVkIGxpbmtlci50ZXhpLgotCShTUkNET0MpOiBBZGRlZCBsaW5rZXIuYy4KLQkobGlua2VyLnRleGkpOiBOZXcgdGFyZ2V0LgotCi1UdWUgSmFuICA0IDEwOjUyOjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiBEb24ndCByZWx5IG9uIGEgY29ycmVjdCBkZWNsYXJhdGlvbiBvZiBleGl0LgotCShjaGV3X2V4aXQpOiBOZXcgZnVuY3Rpb24gd2hpY2gganVzdCBjYWxscyBleGl0LgotCShtYWluKTogVXNlIGl0LgotCi1Nb24gSmFuICAzIDExOjQwOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IEFkZGVkIEhhc2ggVGFibGVzIG5vZGUuCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBBZGRlZCBoYXNoLnRleGkuCi0JKFNSQ0RPQyk6IEFkZGVkIGhhc2guYy4KLQkoaGFzaC50ZXhpKTogTmV3IHRhcmdldC4KLQotVGh1IERlYyAzMCAxNjo1NzowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRGVsZXRlIGFsbCByZWZlcmVuY2VzIHRvIHNlY2xldC5jLCBzaW5jZSBpdCdzIGp1c3QKLQliZWVuIGRlbGV0ZWQuICBEb24ndCBtZW50aW9uIGhhc2guYywgbGlua2VyLmMsIG9yIGdlbmxpbmsuaCB5ZXQsCi0Jc2luY2UgdGhleSBkb24ndCBjb250YWluIGRvY3VtZW50YXRpb24geWV0IChoaW50LCBoaW50ISkuCi0KLUZyaSBOb3YgIDUgMTA6NTg6NTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogU21hbGwgY2xlYW51cHMuCi0KLUZyaSBOb3YgMTkgMDM6NDY6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXJjaHVyZXMudGV4aSk6IERlcGVuZHMgb24gJChNS0RPQykuCi0KLVR1ZSBBdWcgMTAgMTQ6MjI6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbyAoQkZEIGJhY2sgZW5kKTogRG9uJ3QgaW5jbHVkZSBlbGZjb2RlLnRleGksIHNpbmNlCi0JaXQncyBlbXB0eSBub3cgYW5kIHRoYXQgdHJpZ2dlcnMgYSBtYWtlaW5mbyBidWcuCi0KLU1vbiBBdWcgIDkgMTY6Mjc6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbyAoQkZEIGJhY2sgZW5kKTogTmV3IHNlY3Rpb24gb24gRUxGLCBpbmNsdWRlcwotCWVsZi50ZXhpIGFuZCBlbGZjb2RlLnRleGkuCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBJbmNsdWRlIGVsZi50ZXhpLCBlbGZjb2RlLnRleGkuCi0JKFNSQ0RPQyk6IEluY2x1ZGUgZWxmY29kZS5oLCBlbGYuYy4KLQkoZWxmLnRleGksIGVsZmNvZGUudGV4aSk6IE5ldyBpbnRlcm1lZGlhdGUgdGFyZ2V0cy4KLQotVGh1IEp1biAyNCAxMzo0ODoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICguYy5vLCBjaGV3Lm8pOiBQdXQgQ0ZMQUdTIGxhc3QuCi0JKiBiZmRzdW1tLnRleGk6IE5ldyBmaWxlLCBicm9rZW4gb3V0IG9mIGJmZC50ZXhpbmZvLCB0byBzaGFyZQotCXdpdGggbGQudGV4aW5mby4KLQotTW9uIEp1biAxNCAxMjowNzowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiByZW1vdmUgcGFyZW50ZGlyIGNydWZ0LCAKLQotV2VkIEp1biAgOSAxNjowMDozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNoZXcuby4KLQotVHVlIE1heSAyNSAxNDo0Njo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsaWJiZmQuaCk6IFVzZSBlbGZjb2RlLmgsIG5vdCBlbGYzMi5jLgotCi1Nb24gTWF5IDI0IDE1OjUwOjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjaGV3LmMgKGNvbXBpbGUpOiBBZGQgYSBjb3VwbGUgb2YgbWlzc2luZyBjYXN0cy4KLQotV2VkIE1heSAxMiAxNDo0NToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUsIGRlZmluZSB0byBiZSAkKENDKS4KLQkoY2hldy5vLCAkKE1LRE9DKSk6IEJ1aWxkIHVzaW5nIENDX0ZPUl9CVUlMRCByYXRoZXIgdGhhbiBDQywgc2luY2UKLQlpdCBtdXN0IHJ1biBvbiB0aGUgYnVpbGQgbWFjaGluZS4KLQotVHVlIEFwciAgNiAyMjozODoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZXcpOiAgRG9uJ3QgY29tcGlsZSBmcm9tIC5jIHRvIGV4ZWN1dGFibGUgaW4gYQotCXNpbmdsZSBzdGVwOyBpdCBwdXRzIGEgdGVtcG9yYXJ5IC5vIGZpbGVuYW1lIGludG8gdGhlIGV4ZWN1dGFibGUsCi0Jd2hpY2ggbWFrZXMgbXVsdGktc3RhZ2UgY29tcGFyaXNvbnMgZmFpbC4gIENvbXBpbGUgY2hldy5jIHRvCi0JY2hldy5vLCBhbmQgbGluayB0aGF0LCB3aGljaCBtYWtlcyBpZGVudGljYWwgZXhlY3V0YWJsZXMgZXZlcnkgdGltZS4KLQotV2VkIE1hciAyNCAxNzoyNjoyOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCB0eXBvIChiZmQudGV4aW5mbyBub3QgYmZkLnRleGlubykKLQotRnJpIE1hciAxOSAwMToxMzowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IFNpbmNlIEJGRCB2ZXJzaW9uIG51bWJlciBoYXMgYmVlbiBidW1wZWQsIGRvIHNhbWUKLQl0byAidmVyc2lvbiBudW1iZXIiIG9uIHRpdGxlIHBhZ2UsIGFuZCBlbHNld2hlcmUuICBTaG91bGQgYmUKLQlmaXhlZCB0byBleHRyYWN0IHJlYWwgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBNYXIgMTYgMTI6MTU6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCAqY2xlYW4gcnVsZXMuCi0KLU1vbiBKYW4gMTEgMTg6NDM6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGliYmZkLmgpOiBSZW1vdmVkIGR1cGxpY2F0ZSBpbml0LmMgYW5kIGxpYmJmZC5jLgotCUFkZGVkIHNlY2xldC5jLgotCShiZmQuaCk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYmZkLmMgYW5kIHNlY2xldC5jLiAgQWRkZWQgc2VjbGV0LmMKLQl0byBidWlsZC4KLQotVGh1IERlYyAxNyAxOTozNTo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdmkgdGFyZ2V0LCBkZWZpbmUgYW5kIHVzZSAkKFRFWEkyRFZJKQotCi1UaHUgRGVjICAzIDE3OjQyOjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRFWElESVIpOiBOZXcgdmFyaWFibGUuCi0JKGJmZC5kdmkpOiBMb29rIGZvciBiZmQudGV4aW5mbyBpbiAkKHNyY2RpcikuICBHZW5lcmF0ZSBpbmRleC4KLQotCSogYmZkLnRleGluZm86IE1pbm9yIGRvYyBmaXhlcy4KLQotVGh1IE5vdiAgNSAwMzoxMzo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFudXA6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcywgd2l0aCBQQVJBTVMuCi0KLSAJKiBkb2MvY2hldy5jIChleGZ1bnN0dWZmKTogIEVsaW1pbmF0ZS4KLQkocGFyYW1zdHVmZik6ICBSZXBsYWNlIGV4ZnVuc3R1ZmYgd2l0aCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBQQVJBTVMuCi0JKiBkb2MvcHJvdG8uc3RyOiAgVXNlIHBhcmFtc3R1ZmYgcmF0aGVyIHRoYW4gZXhmdW5zdHVmZi4KLQotTW9uIEF1ZyAxNyAxMjo0MDozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiB2YXJpb3VzIHBhdGNoZXMgcHJvdmlkZWQgYnkgSG93YXJkIENodS4KLQotRnJpIEp1biAxOSAxODo1OTo1NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogIEFkZCBlbGYuYyBhcyBhIHNvdXJjZSBvZiBwcm90b3R5cGVzLgotCi1Nb24gTWF5IDExIDE4OjU1OjU5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjaGV3LmM6ICBleGl0KCkgc2hvdWxkIGJlIGRlY2xhcmVkIGJ5IGNvbmZpZyBmaWxlcywgbm90IGJ5Ci0JcG9ydGFibGUgc291cmNlIGNvZGUuICBJdHMgdHlwZSBjb3VsZCBiZSBpbnQgb3Igdm9pZCBmdW5jdGlvbi4JCi0KLU1vbiBNYXkgIDQgMTM6NDU6NTcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYW5vdGhlciBDRkxBR1MgY29ycmVjdGlvbi4KLQotVHVlIEFwciAyOCAxMDoyMTozMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBEbyB0aGUgQ0ZMQUdTIHRoaW5nLgotCi1GcmkgQXByIDEwIDIyOjM0OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBBZGQgbWFjcm8gYW5kIGRlZmF1bHQgdG8gLWcuCi0KLUZyaSBNYXIgIDYgMTg6NTM6MTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogbm93IGhhcyAtdyBzd2l0Y2ggdHVybiBvbiB3YXJuaW5ncwotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotVHVlIERlYyAxMCAyMjoxMTowNSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBidWlsZCBjaGV3IGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQ29tcGxldGUKLQkgIHRoZSBNS0RPQyBtYWNybyB0cmFuc2l0aW9uLgotCi1UdWUgRGVjIDEwIDA4OjI2OjI4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IGRvbid0IGNvcmUgZHVtcCB3aGVuIGNhbid0IG9wZW4gZmlsZQotCSogTWFrZWZpbGUuaW46IGdldCBwcm90by5zdHIgZnJvbSB0aGUgcmlnaHQgcGxhY2Ugd2hlbiBidWlsdCBpbgotCW9kZCBkaXJlY3RvcmllcwotCi1UdWUgRGVjIDEwIDA0OjA3OjI1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1TYXQgRGVjICA3IDE3OjAxOjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IE11Y2ggbW9kaWZpZWQKLQkqIHByb3RvLnN0ciwgZG9jLnN0cjogTmV3IGZpbGVzIGZvciBleHRyYWN0aW5nIHRvIHByb2R1Y3QKLQlwcm90b3R5cGVzIGFuZCBkb2N1bWVudHMgcmVzcGVjdGl2ZWx5LgotCi0KLUZyaSBEZWMgIDYgMjI6NTc6MTIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydCwgaG9zdC9zaXRlL3RhcmdldAotCSAgaW5jbHVzaW9uIGhvb2tzLCBpbnN0YWxsIHVzaW5nIElOU1RBTExfREFUQSByYXRoZXIgdGhhbiBjcCwKLQkgIGRvbid0IGVjaG8gb24gaW5zdGFsbC4KLQotVGh1IERlYyAgNSAyMjo0NjoxNyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9kb2MvTWFrZWZpbGUuYW0gYi9iZmQvZG9jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUyNjhlLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLURPQ0ZJTEVTID0gYW91dHgudGV4aSAgYXJjaGl2ZS50ZXhpIGFyY2h1cmVzLnRleGkgXAotCWJmZHQudGV4aSAgY2FjaGUudGV4aSBjb2ZmY29kZS50ZXhpIFwKLQljb3JlLnRleGkgZWxmLnRleGkgZWxmY29kZS50ZXhpICBmb3JtYXQudGV4aSAgbGliYmZkLnRleGkgIFwKLQlvcG5jbHMudGV4aSAgcmVsb2MudGV4aSAgc2VjdGlvbi50ZXhpICBcCi0Jc3ltcy50ZXhpICB0YXJnZXRzLnRleGkgaW5pdC50ZXhpIGhhc2gudGV4aSBsaW5rZXIudGV4aQotCi1QUk9UT1MgPSBhcmNoaXZlLnAgYXJjaHVyZXMucCBiZmQucCBcCi0JIGNvcmUucCBmb3JtYXQucCBcCi0JbGliYmZkLnAgb3BuY2xzLnAgcmVsb2MucCBcCi0Jc2VjdGlvbi5wIHN5bXMucCB0YXJnZXRzLnAgIFwKLQlmb3JtYXQucCAgY29yZS5wIGluaXQucAotCi1JUFJPVE9TID0gY2FjaGUuaXAgbGliYmZkLmlwIHJlbG9jLmlwIGluaXQuaXAgYXJjaHVyZXMuaXAgY29mZmNvZGUuaXAKLQotIyBTUkNET0MsIFNSQ1BST1QsIFNSQ0lQUk9UIG9ubHkgdXNlZCB0byBzaWRlc3RlcCBTdW4gTWFrZSBidWcgaW4gaW50ZXJhY3Rpb24gCi0jIGJldHdlZW4gVlBBVEggYW5kIHN1ZmZpeCBydWxlcy4gIElmIHlvdSB1c2UgR05VIE1ha2UsIHBlcmhhcHMgb3RoZXIgTWFrZXMsCi0jIHlvdSBkb24ndCBuZWVkIHRoZXNlIHRocmVlOgotU1JDRE9DID0gJChzcmNkaXIpLy4uL2FvdXR4LmggICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS8uLi9iZmQuYyBcCi0JJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggXAotCSQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jICQoc3JjZGlyKS8uLi9lbGYuYyBcCi0JJChzcmNkaXIpLy4uL2VsZmNvZGUuaCAgJChzcmNkaXIpLy4uL2Zvcm1hdC5jIFwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpLy4uL29wbmNscy5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAgJChzcmNkaXIpLy4uL3NlY3Rpb24uYyBcCi0JJChzcmNkaXIpLy4uL3N5bXMuYyAgJChzcmNkaXIpLy4uL3RhcmdldHMuYyBcCi0JJChzcmNkaXIpLy4uL2hhc2guYyAkKHNyY2RpcikvLi4vbGlua2VyLmMKLQotU1JDUFJPVCA9ICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyBcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS8uLi9yZWxvYy5jIFwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS8uLi9zeW1zLmMgXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpLy4uL2luaXQuYwotCi1TUkNJUFJPVCA9ICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpLy4uL2NwdS1oODMwMC5jIFwKLQkkKHNyY2RpcikvLi4vY3B1LWk5NjAuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCi0JJChzcmNkaXIpLy4uL2luaXQuYwotCi1URVhJRElSID0gJChzcmNkaXIpLy4uLy4uL3RleGluZm8vZnNmCi0KLWluZm9fVEVYSU5GT1MgPSBiZmQudGV4aW5mbwotCi1NS0RPQyA9IGNoZXckKEVYRUVYVF9GT1JfQlVJTEQpCi0KLSQoTUtET0MpOiBjaGV3Lm8KLQkkKENDX0ZPUl9CVUlMRCkgLW8gJChNS0RPQykgY2hldy5vICQoTE9BRExJQkVTKSAkKExERkxBR1MpCi0KLWNoZXcubzogY2hldy5jCi0JJChDQ19GT1JfQlVJTEQpIC1jIC1JLi4gLUkkKHNyY2RpcikvLi4gLUkkKHNyY2RpcikvLi4vLi4vaW5jbHVkZSAtSSQoc3JjZGlyKS8uLi8uLi9pbnRsIC1JLi4vLi4vaW50bCAkKEhfQ0ZMQUdTKSAkKENGTEFHUykgJChzcmNkaXIpL2NoZXcuYwotCi1wcm90b3M6IGxpYmJmZC5oIGxpYmNvZmYuaCBiZmQuaAotCi1iZmQuaW5mbyBiZmQuZHZpOiAkKERPQ0ZJTEVTKSBiZmRzdW1tLnRleGkgYmZkLnRleGluZm8KLQotIyBXZSBjYW4ndCByZXBsYWNlIHRoZXNlIHJ1bGVzIHdpdGggYW4gaW1wbGljaXQgcnVsZSwgYmVjYXVzZQotIyBtYWtlcyB3aXRob3V0IFZQQVRIIHN1cHBvcnQgY291bGRuJ3QgZmluZCB0aGUgLmggZmlsZXMgaW4gYC4uJy4KLQotIyBXZSB1c2Ugcy1YWFggdGFyZ2V0cyBzbyB0aGF0IHdlIGNhbiBkaXN0cmlidXRlIHRoZSBpbmZvIGZpbGVzLAotIyBhbmQgcGVybWl0IHBlb3BsZSB0byByZWJ1aWxkIHRoZW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBtYWtlaW5mbwotIyBwcm9ncmFtLiAgSWYgc29tZWJvZHkgdHJpZXMgdG8gcmVidWlsZCBpbmZvLCBidXQgbm9uZSBvZiB0aGUgLnRleGkKLSMgZmlsZXMgaGF2ZSBjaGFuZ2VkLCB0aGVuIHRoaXMgTWFrZWZpbGUgd2lsbCBidWlsZCBjaGV3LCBhbmQgd2lsbAotIyBidWlsZCBhbGwgb2YgdGhlIHN0YW1wIGZpbGVzLCBidXQgd2lsbCBub3QgYWN0dWFsbHkgaGF2ZSB0byByZWJ1aWxkCi0jIGJmZC5pbmZvLgotCi1zLWFvdXR4OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYW91dHguaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9hb3V0eC5oID5hb3V0eC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYW91dHgudG1wIGFvdXR4LnRleGkKLQl0b3VjaCBzLWFvdXR4Ci1hb3V0eC50ZXhpOiBzLWFvdXR4Ci0KLXMtYXJjaGl2ZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgPmFyY2hpdmUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFyY2hpdmUudG1wIGFyY2hpdmUudGV4aQotCXRvdWNoIHMtYXJjaGl2ZQotYXJjaGl2ZS50ZXhpOiBzLWFyY2hpdmUKLQotcy1hcmNodXJlczogJChNS0RPQykgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPmFyY2h1cmVzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNodXJlcy50bXAgYXJjaHVyZXMudGV4aQotCXRvdWNoIHMtYXJjaHVyZXMKLWFyY2h1cmVzLnRleGk6IHMtYXJjaHVyZXMKLQotIyBXZSB1c2UgYmZkdC50ZXhpLCByYXRoZXIgdGhhbiBiZmQudGV4aSwgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aAotIyBiZmQudGV4aW5mbyBvbiBhbiA4LjMgZmlsZXN5c3RlbS4KLXMtYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2JmZC5jID5iZmQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGJmZC50bXAgYmZkdC50ZXhpCi0JdG91Y2ggcy1iZmQKLWJmZHQudGV4aTogcy1iZmQKLQotcy1jYWNoZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPmNhY2hlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjYWNoZS50bXAgY2FjaGUudGV4aQotCXRvdWNoIHMtY2FjaGUKLWNhY2hlLnRleGk6IHMtY2FjaGUKLQotcy1jb2ZmY29kZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vY29mZmNvZGUuaCA+Y29mZmNvZGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNvZmZjb2RlLnRtcCBjb2ZmY29kZS50ZXhpCi0JdG91Y2ggcy1jb2ZmY29kZQotY29mZmNvZGUudGV4aTogcy1jb2ZmY29kZQotCi1zLWNvcmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgPmNvcmUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNvcmUudG1wIGNvcmUudGV4aQotCXRvdWNoIHMtY29yZQotY29yZS50ZXhpOiBzLWNvcmUKLQotcy1lbGY6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9lbGYuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9lbGYuYyA+ZWxmLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBlbGYudG1wIGVsZi50ZXhpCi0JdG91Y2ggcy1lbGYKLWVsZi50ZXhpOiBzLWVsZgotCi1zLWVsZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9lbGZjb2RlLmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmY29kZS5oID5lbGZjb2RlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBlbGZjb2RlLnRtcCBlbGZjb2RlLnRleGkKLQl0b3VjaCBzLWVsZmNvZGUKLWVsZmNvZGUudGV4aTogcy1lbGZjb2RlCi0KLXMtZm9ybWF0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZm9ybWF0LmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZm9ybWF0LmMgPmZvcm1hdC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZm9ybWF0LnRtcCBmb3JtYXQudGV4aQotCXRvdWNoIHMtZm9ybWF0Ci1mb3JtYXQudGV4aTogcy1mb3JtYXQKLQotcy1saWJiZmQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vbGliYmZkLmMgPmxpYmJmZC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQudGV4aQotCXRvdWNoIHMtbGliYmZkCi1saWJiZmQudGV4aTogcy1saWJiZmQKLQotcy1vcG5jbHM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9vcG5jbHMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgIDwkKHNyY2RpcikvLi4vb3BuY2xzLmMgPm9wbmNscy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugb3BuY2xzLnRtcCBvcG5jbHMudGV4aQotCXRvdWNoIHMtb3BuY2xzCi1vcG5jbHMudGV4aTogcy1vcG5jbHMKLQotcy1yZWxvYzogJChNS0RPQykgJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vcmVsb2MuYyA+cmVsb2MudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHJlbG9jLnRtcCByZWxvYy50ZXhpCi0JdG91Y2ggcy1yZWxvYwotcmVsb2MudGV4aTogcy1yZWxvYwotCi1zLXNlY3Rpb246ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc2VjdGlvbi5jID5zZWN0aW9uLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzZWN0aW9uLnRtcCBzZWN0aW9uLnRleGkKLQl0b3VjaCBzLXNlY3Rpb24KLXNlY3Rpb24udGV4aTogcy1zZWN0aW9uCi0KLXMtc3ltczogJChNS0RPQykgJChzcmNkaXIpLy4uL3N5bXMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9zeW1zLmMgPnN5bXMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHN5bXMudG1wIHN5bXMudGV4aQotCXRvdWNoIHMtc3ltcwotc3ltcy50ZXhpOiBzLXN5bXMKLQotcy10YXJnZXRzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+dGFyZ2V0cy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdGFyZ2V0cy50bXAgdGFyZ2V0cy50ZXhpCi0JdG91Y2ggcy10YXJnZXRzCi10YXJnZXRzLnRleGk6IHMtdGFyZ2V0cwotCi1zLWluaXQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9pbml0LmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaW5pdC5jID5pbml0LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBpbml0LnRtcCBpbml0LnRleGkKLQl0b3VjaCBzLWluaXQKLWluaXQudGV4aTogcy1pbml0Ci0KLXMtaGFzaDogJChNS0RPQykgJChzcmNkaXIpLy4uL2hhc2guYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9oYXNoLmMgPmhhc2gudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGhhc2gudG1wIGhhc2gudGV4aQotCXRvdWNoIHMtaGFzaAotaGFzaC50ZXhpOiBzLWhhc2gKLQotcy1saW5rZXI6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9saW5rZXIuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9saW5rZXIuYyA+bGlua2VyLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBsaW5rZXIudG1wIGxpbmtlci50ZXhpCi0JdG91Y2ggcy1saW5rZXIKLWxpbmtlci50ZXhpOiBzLWxpbmtlcgotCi1saWJiZmQuaDogJChzcmNkaXIpLy4uL2xpYmJmZC1pbi5oCVwKLQkkKHNyY2RpcikvLi4vaW5pdC5jCQlcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jCQlcCi0JJChzcmNkaXIpLy4uL2NhY2hlLmMJCVwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYwkJXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaCA+bGliYmZkLmggCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9pbml0LmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vbGliYmZkLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vY2FjaGUuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9yZWxvYy5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vZWxmLmMgPj5saWJiZmQuaAotCi1saWJjb2ZmLmg6ICQoc3JjZGlyKS8uLi9saWJjb2ZmLWluLmgJXAotCSQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9saWJjb2ZmLWluLmggPmxpYmNvZmYuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCA+PmxpYmNvZmYuaAotCi1iZmQuaDogJChzcmNkaXIpLy4uL2JmZC1pbi5oIAkJXAotCSQoc3JjZGlyKS8uLi9pbml0LmMgCQlcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jIAkJXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAJCVwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jIAkJXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jCQlcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKLQkkKHNyY2RpcikvLi4vc3ltcy5jCQlcCi0JJChzcmNkaXIpLy4uL2JmZC5jCQlcCi0JJChzcmNkaXIpLy4uL2FyY2hpdmUuYwkJXAotCSQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jCQlcCi0JJChzcmNkaXIpLy4uL3RhcmdldHMuYwkJXAotCSQoc3JjZGlyKS8uLi9mb3JtYXQuYwkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vYmZkLWluLmggPmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9pbml0LmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vb3BuY2xzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vbGliYmZkLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc2VjdGlvbi5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9zeW1zLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYmZkLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vdGFyZ2V0cy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID4+YmZkLmgJCi0JZWNobyAiI2lmZGVmIF9fY3BsdXNwbHVzIiA+PmJmZC5oCi0JZWNobyAifSIgPj5iZmQuaAotCWVjaG8gIiNlbmRpZiIgPj5iZmQuaAotCWVjaG8gIiNlbmRpZiIgPj5iZmQuaAotCi1ub2luc3RfVEVYSU5GT1MgPSBiZmRpbnQudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChNS0RPQykgKi5vCi0KLUNMRUFORklMRVMgPSBzLSogKi5wICouaXAKLQotRElTVENMRUFORklMRVMgPSBiZmQuPz8gYmZkLj8/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCmRpZmYgLS1naXQgYS9iZmQvZG9jL01ha2VmaWxlLmluIGIvYmZkL2RvYy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxMzliMi4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLi4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX0hPU1RfNjRCSVRfTE9ORyA9IEBCRkRfSE9TVF82NEJJVF9MT05HQAotQkZEX0hPU1RfNjRfQklUID0gQEJGRF9IT1NUXzY0X0JJVEAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEID0gQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotQkZEX0hPU1RfVV82NF9CSVQgPSBAQkZEX0hPU1RfVV82NF9CSVRACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DT1JFRklMRSA9IEBDT1JFRklMRUAKLUNPUkVGTEFHID0gQENPUkVGTEFHQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVRERUZJTkVTID0gQFRERUZJTkVTQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKLVdJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAotYWxsX2JhY2tlbmRzID0gQGFsbF9iYWNrZW5kc0AKLWJmZF9iYWNrZW5kcyA9IEBiZmRfYmFja2VuZHNACi1iZmRfbWFjaGluZXMgPSBAYmZkX21hY2hpbmVzQAotbCA9IEBsQAotdGRlZmF1bHRzID0gQHRkZWZhdWx0c0AKLXdvcmRzaXplID0gQHdvcmRzaXplQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLURPQ0ZJTEVTID0gYW91dHgudGV4aSAgYXJjaGl2ZS50ZXhpIGFyY2h1cmVzLnRleGkgXAotCWJmZHQudGV4aSAgY2FjaGUudGV4aSBjb2ZmY29kZS50ZXhpIFwKLQljb3JlLnRleGkgZWxmLnRleGkgZWxmY29kZS50ZXhpICBmb3JtYXQudGV4aSAgbGliYmZkLnRleGkgIFwKLQlvcG5jbHMudGV4aSAgcmVsb2MudGV4aSAgc2VjdGlvbi50ZXhpICBcCi0Jc3ltcy50ZXhpICB0YXJnZXRzLnRleGkgaW5pdC50ZXhpIGhhc2gudGV4aSBsaW5rZXIudGV4aQotCi0KLVBST1RPUyA9IGFyY2hpdmUucCBhcmNodXJlcy5wIGJmZC5wIFwKLQkgY29yZS5wIGZvcm1hdC5wIFwKLQlsaWJiZmQucCBvcG5jbHMucCByZWxvYy5wIFwKLQlzZWN0aW9uLnAgc3ltcy5wIHRhcmdldHMucCAgXAotCWZvcm1hdC5wICBjb3JlLnAgaW5pdC5wCi0KLQotSVBST1RPUyA9IGNhY2hlLmlwIGxpYmJmZC5pcCByZWxvYy5pcCBpbml0LmlwIGFyY2h1cmVzLmlwIGNvZmZjb2RlLmlwCi0KLSMgU1JDRE9DLCBTUkNQUk9ULCBTUkNJUFJPVCBvbmx5IHVzZWQgdG8gc2lkZXN0ZXAgU3VuIE1ha2UgYnVnIGluIGludGVyYWN0aW9uIAotIyBiZXR3ZWVuIFZQQVRIIGFuZCBzdWZmaXggcnVsZXMuICBJZiB5b3UgdXNlIEdOVSBNYWtlLCBwZXJoYXBzIG90aGVyIE1ha2VzLAotIyB5b3UgZG9uJ3QgbmVlZCB0aGVzZSB0aHJlZToKLVNSQ0RPQyA9ICQoc3JjZGlyKS8uLi9hb3V0eC5oICAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jIFwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvLi4vYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oIFwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvLi4vZWxmLmMgXAotCSQoc3JjZGlyKS8uLi9lbGZjb2RlLmggICQoc3JjZGlyKS8uLi9mb3JtYXQuYyBcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS8uLi9vcG5jbHMuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgXAotCSQoc3JjZGlyKS8uLi9zeW1zLmMgICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgXAotCSQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpLy4uL2xpbmtlci5jCi0KLQotU1JDUFJPVCA9ICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyBcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS8uLi9yZWxvYy5jIFwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS8uLi9zeW1zLmMgXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpLy4uL2luaXQuYwotCi0KLVNSQ0lQUk9UID0gJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvLi4vY3B1LWg4MzAwLmMgXAotCSQoc3JjZGlyKS8uLi9jcHUtaTk2MC5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKLQkkKHNyY2RpcikvLi4vaW5pdC5jCi0KLQotVEVYSURJUiA9ICQoc3JjZGlyKS8uLi8uLi90ZXhpbmZvL2ZzZgotCi1pbmZvX1RFWElORk9TID0gYmZkLnRleGluZm8KLQotTUtET0MgPSBjaGV3JChFWEVFWFRfRk9SX0JVSUxEKQotCi1ub2luc3RfVEVYSU5GT1MgPSBiZmRpbnQudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChNS0RPQykgKi5vCi0KLUNMRUFORklMRVMgPSBzLSogKi5wICouaXAKLQotRElTVENMRUFORklMRVMgPSBiZmQuPz8gYmZkLj8/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCi1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gLi4vY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGJmZC5pbmZvCi1EVklTID0gYmZkLmR2aQotVEVYSU5GT1MgPSBiZmQudGV4aW5mbwotRElTVF9DT01NT04gPSAgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5kdmkgLmluZm8gLnBzIC50ZXhpIC50ZXhpbmZvIC50eGkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgZG9jL01ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0KLWJmZC5pbmZvOiBiZmQudGV4aW5mbwotYmZkLmR2aTogYmZkLnRleGluZm8KLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgYmZkLmF1eCBiZmQuY3AgYmZkLmNwcyBiZmQuZHZpIGJmZC5mbiBiZmQuZm5zIGJmZC5reSBiZmQua3lzIFwKLQkgIGJmZC5wcyBiZmQubG9nIGJmZC5wZyBiZmQudG9jIGJmZC50cCBiZmQudHBzIGJmZC52ciBiZmQudnJzIFwKLQkgIGJmZC5vcCBiZmQudHIgYmZkLmN2IGJmZC5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLXRhZ3M6IFRBR1MKLVRBR1M6Ci0KLQotZGlzdGRpciA9ICQodG9wX2J1aWxkZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi0KLXN1YmRpciA9IGRvYwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1hbQotZHZpLWFtOiAkKERWSVMpCi1kdmk6IGR2aS1hbQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stYW0KLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLWluc3RhbGwtZXhlYy1hbToKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi0KLWluc3RhbGwtZGF0YS1hbToKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLWFtCi11bmluc3RhbGwtYW06Ci11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotYWxsLWFtOiBNYWtlZmlsZQotYWxsLXJlZGlyZWN0OiBhbGwtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOgotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuLWFtOiAgY2xlYW4tYW1pbmZvIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLWFtCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKLQkJZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQotLlBIT05ZOiBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gbW9zdGx5Y2xlYW4tYW1pbmZvIFwKLWRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tYW1pbmZvIHRhZ3MgZGlzdGRpciBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIFwKLWFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi0kKE1LRE9DKTogY2hldy5vCi0JJChDQ19GT1JfQlVJTEQpIC1vICQoTUtET0MpIGNoZXcubyAkKExPQURMSUJFUykgJChMREZMQUdTKQotCi1jaGV3Lm86IGNoZXcuYwotCSQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4uIC1JJChzcmNkaXIpLy4uIC1JJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vLi4vaW50bCAtSS4uLy4uL2ludGwgJChIX0NGTEFHUykgJChDRkxBR1MpICQoc3JjZGlyKS9jaGV3LmMKLQotcHJvdG9zOiBsaWJiZmQuaCBsaWJjb2ZmLmggYmZkLmgKLQotYmZkLmluZm8gYmZkLmR2aTogJChET0NGSUxFUykgYmZkc3VtbS50ZXhpIGJmZC50ZXhpbmZvCi0KLSMgV2UgY2FuJ3QgcmVwbGFjZSB0aGVzZSBydWxlcyB3aXRoIGFuIGltcGxpY2l0IHJ1bGUsIGJlY2F1c2UKLSMgbWFrZXMgd2l0aG91dCBWUEFUSCBzdXBwb3J0IGNvdWxkbid0IGZpbmQgdGhlIC5oIGZpbGVzIGluIGAuLicuCi0KLSMgV2UgdXNlIHMtWFhYIHRhcmdldHMgc28gdGhhdCB3ZSBjYW4gZGlzdHJpYnV0ZSB0aGUgaW5mbyBmaWxlcywKLSMgYW5kIHBlcm1pdCBwZW9wbGUgdG8gcmVidWlsZCB0aGVtLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgbWFrZWluZm8KLSMgcHJvZ3JhbS4gIElmIHNvbWVib2R5IHRyaWVzIHRvIHJlYnVpbGQgaW5mbywgYnV0IG5vbmUgb2YgdGhlIC50ZXhpCi0jIGZpbGVzIGhhdmUgY2hhbmdlZCwgdGhlbiB0aGlzIE1ha2VmaWxlIHdpbGwgYnVpbGQgY2hldywgYW5kIHdpbGwKLSMgYnVpbGQgYWxsIG9mIHRoZSBzdGFtcCBmaWxlcywgYnV0IHdpbGwgbm90IGFjdHVhbGx5IGhhdmUgdG8gcmVidWlsZAotIyBiZmQuaW5mby4KLQotcy1hb3V0eDogJChNS0RPQykgJChzcmNkaXIpLy4uL2FvdXR4LmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYW91dHguaCA+YW91dHgudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFvdXR4LnRtcCBhb3V0eC50ZXhpCi0JdG91Y2ggcy1hb3V0eAotYW91dHgudGV4aTogcy1hb3V0eAotCi1zLWFyY2hpdmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID5hcmNoaXZlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNoaXZlLnRtcCBhcmNoaXZlLnRleGkKLQl0b3VjaCBzLWFyY2hpdmUKLWFyY2hpdmUudGV4aTogcy1hcmNoaXZlCi0KLXMtYXJjaHVyZXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID5hcmNodXJlcy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaHVyZXMudG1wIGFyY2h1cmVzLnRleGkKLQl0b3VjaCBzLWFyY2h1cmVzCi1hcmNodXJlcy50ZXhpOiBzLWFyY2h1cmVzCi0KLSMgV2UgdXNlIGJmZHQudGV4aSwgcmF0aGVyIHRoYW4gYmZkLnRleGksIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGgKLSMgYmZkLnRleGluZm8gb24gYW4gOC4zIGZpbGVzeXN0ZW0uCi1zLWJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2JmZC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9iZmQuYyA+YmZkLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQudG1wIGJmZHQudGV4aQotCXRvdWNoIHMtYmZkCi1iZmR0LnRleGk6IHMtYmZkCi0KLXMtY2FjaGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID5jYWNoZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY2FjaGUudG1wIGNhY2hlLnRleGkKLQl0b3VjaCBzLWNhY2hlCi1jYWNoZS50ZXhpOiBzLWNhY2hlCi0KLXMtY29mZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPmNvZmZjb2RlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb2ZmY29kZS50bXAgY29mZmNvZGUudGV4aQotCXRvdWNoIHMtY29mZmNvZGUKLWNvZmZjb2RlLnRleGk6IHMtY29mZmNvZGUKLQotcy1jb3JlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID5jb3JlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb3JlLnRtcCBjb3JlLnRleGkKLQl0b3VjaCBzLWNvcmUKLWNvcmUudGV4aTogcy1jb3JlCi0KLXMtZWxmOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmLmMgPmVsZi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmLnRtcCBlbGYudGV4aQotCXRvdWNoIHMtZWxmCi1lbGYudGV4aTogcy1lbGYKLQotcy1lbGZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZmNvZGUuaCA+ZWxmY29kZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmY29kZS50bXAgZWxmY29kZS50ZXhpCi0JdG91Y2ggcy1lbGZjb2RlCi1lbGZjb2RlLnRleGk6IHMtZWxmY29kZQotCi1zLWZvcm1hdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID5mb3JtYXQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGZvcm1hdC50bXAgZm9ybWF0LnRleGkKLQl0b3VjaCBzLWZvcm1hdAotZm9ybWF0LnRleGk6IHMtZm9ybWF0Ci0KLXMtbGliYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID5saWJiZmQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLnRleGkKLQl0b3VjaCBzLWxpYmJmZAotbGliYmZkLnRleGk6IHMtbGliYmZkCi0KLXMtb3BuY2xzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vb3BuY2xzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyICA8JChzcmNkaXIpLy4uL29wbmNscy5jID5vcG5jbHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIG9wbmNscy50bXAgb3BuY2xzLnRleGkKLQl0b3VjaCBzLW9wbmNscwotb3BuY2xzLnRleGk6IHMtb3BuY2xzCi0KLXMtcmVsb2M6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9yZWxvYy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3JlbG9jLmMgPnJlbG9jLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSByZWxvYy50bXAgcmVsb2MudGV4aQotCXRvdWNoIHMtcmVsb2MKLXJlbG9jLnRleGk6IHMtcmVsb2MKLQotcy1zZWN0aW9uOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+c2VjdGlvbi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc2VjdGlvbi50bXAgc2VjdGlvbi50ZXhpCi0JdG91Y2ggcy1zZWN0aW9uCi1zZWN0aW9uLnRleGk6IHMtc2VjdGlvbgotCi1zLXN5bXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zeW1zLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc3ltcy5jID5zeW1zLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzeW1zLnRtcCBzeW1zLnRleGkKLQl0b3VjaCBzLXN5bXMKLXN5bXMudGV4aTogcy1zeW1zCi0KLXMtdGFyZ2V0czogJChNS0RPQykgJChzcmNkaXIpLy4uL3RhcmdldHMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPnRhcmdldHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRhcmdldHMudG1wIHRhcmdldHMudGV4aQotCXRvdWNoIHMtdGFyZ2V0cwotdGFyZ2V0cy50ZXhpOiBzLXRhcmdldHMKLQotcy1pbml0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaW5pdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2luaXQuYyA+aW5pdC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaW5pdC50bXAgaW5pdC50ZXhpCi0JdG91Y2ggcy1pbml0Ci1pbml0LnRleGk6IHMtaW5pdAotCi1zLWhhc2g6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaGFzaC5jID5oYXNoLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBoYXNoLnRtcCBoYXNoLnRleGkKLQl0b3VjaCBzLWhhc2gKLWhhc2gudGV4aTogcy1oYXNoCi0KLXMtbGlua2VyOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGlua2VyLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vbGlua2VyLmMgPmxpbmtlci50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGlua2VyLnRtcCBsaW5rZXIudGV4aQotCXRvdWNoIHMtbGlua2VyCi1saW5rZXIudGV4aTogcy1saW5rZXIKLQotbGliYmZkLmg6ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaAlcCi0JJChzcmNkaXIpLy4uL2luaXQuYwkJXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jCQlcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliYmZkLWluLmggPmxpYmJmZC5oIAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vaW5pdC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2VsZi5jID4+bGliYmZkLmgKLQotbGliY29mZi5oOiAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oCVwKLQkkKHNyY2RpcikvLi4vY29mZmNvZGUuaAkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oID5saWJjb2ZmLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPj5saWJjb2ZmLmgKLQotYmZkLmg6ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCAJCVwKLQkkKHNyY2RpcikvLi4vaW5pdC5jIAkJXAotCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAJCVwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgCQlcCi0JJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCi0JJChzcmNkaXIpLy4uL3N5bXMuYwkJXAotCSQoc3JjZGlyKS8uLi9iZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9hcmNoaXZlLmMJCVwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYwkJXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMJCVwKLQkkKHNyY2RpcikvLi4vZm9ybWF0LmMJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2JmZC1pbi5oID5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vaW5pdC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL29wbmNscy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2xpYmJmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3JlbG9jLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc3ltcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2JmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+PmJmZC5oCQotCWVjaG8gIiNpZmRlZiBfX2NwbHVzcGx1cyIgPj5iZmQuaAotCWVjaG8gIn0iID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmQudGV4aW5mbyBiL2JmZC9kb2MvYmZkLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZGY4N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi1caW5wdXQgdGV4aW5mby50ZXgKLUBzZXRmaWxlbmFtZSBiZmQuaW5mbwotQGMgJElkJAotQHRleAotJSBOT1RFIExPQ0FMIEtMVUdFIFRPIEFWT0lEIFRPTyBNVUNIIFdISVRFU1BBQ0UKLVxnbG9iYWxcbG9uZ1xkZWZcZXhhbXBsZXslCi1cYmVnaW5ncm91cAotXGxldFxhYm92ZWVudmJyZWFrPVxwYXIKLVxsZXRcYWZ0ZXJlbnZicmVhaz1ccGFyCi1ccGFyc2tpcD0wcHQKLVxsaXNwfQotXGdsb2JhbFxsb25nXGRlZlxFZXhhbXBsZXslCi1cRWxpc3AKLVxlbmRncm91cAotXHZza2lwIC1ccGFyc2tpcCUgdG8gY2FuY2VsIG91dCBlZmZlY3Qgb2YgZm9sbG93aW5nIFxwYXIKLX0KLUBlbmQgdGV4Ci1Ac3luaW5kZXggZm4gY3AKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQmZkOiAoYmZkKS4gICAgICAgICAgICAgICAgICAgVGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEJGRCBsaWJyYXJ5LgotCi1Db3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgc3ViamVjdCB0byB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaW5jbHVkZXMgdGhlIHByb3Zpc2lvbiB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBjQGZpbmFsb3V0Ci1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb24KLUBjQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIExJQiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIExpYnJhcnkKLUB0aXRsZXBhZ2UKLUB0aXRsZXtsaWJiZmR9Ci1Ac3VidGl0bGV7VGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgTGlicmFyeX0KLUBzcCAxCi1Ac3VidGl0bGUgRmlyc3QgRWRpdGlvbi0tLUJGRCB2ZXJzaW9uIDwgMy4wCi1Ac3VidGl0bGUgQXByaWwgMTk5MQotQGF1dGhvciB7U3RldmUgQ2hhbWJlcmxhaW59Ci1AYXV0aG9yIHtDeWdudXMgU3VwcG9ydH0KLUBwYWdlCi0KLUB0ZXgKLVxkZWZcJCMxJHt7IzF9fSAgJSBLbHVnZTogY29sbGVjdCBSQ1MgcmV2aXNpb24gaW5mbyB3aXRob3V0ICQuLi4kCi1ceGRlZlxtYW52ZXJze1wkUmV2aXNpb24kfSAgJSBGb3IgdXNlIGluIGhlYWRlcnMsIGZvb3RlcnMgdG9vCi17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi1caGZpbGwgc2FjXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgQkZEfSwgXG1hbnZlcnNccGFyCi1caGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCi19Ci1cZ2xvYmFsXHBhcmluZGVudD0wcHQgJSBTdGV2ZSBsaWtlcyBpdCB0aGlzIHdheQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgc3ViamVjdCB0byB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaW5jbHVkZXMgdGhlIHByb3Zpc2lvbiB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi1AZW5kIGlmdGV4Ci0KLUBub2RlIFRvcCwgT3ZlcnZpZXcsIChkaXIpLCAoZGlyKQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgYmluYXJ5IGZpbGUgZGVzY3JpcHRvciBsaWJyYXJ5IGxpYmJmZC4KLUBlbmQgaWZpbmZvCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjoJCQlPdmVydmlldyBvZiBCRkQKLSogQkZEIGZyb250IGVuZDo6CQlCRkQgZnJvbnQgZW5kCi0qIEJGRCBiYWNrIGVuZHM6OgkJQkZEIGJhY2sgZW5kcwotKiBJbmRleDo6CQkJSW5kZXgKLUBlbmQgbWVudQotCi1Abm9kZSBPdmVydmlldywgQkZEIGZyb250IGVuZCwgVG9wLCBUb3AKLUBjaGFwdGVyIEludHJvZHVjdGlvbgotQGNpbmRleCBCRkQKLUBjaW5kZXggd2hhdCBpcyBpdD8KLUJGRCBpcyBhIHBhY2thZ2Ugd2hpY2ggYWxsb3dzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCi1zYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24gb2JqZWN0IGZpbGVzIHdoYXRldmVyIHRoZSBvYmplY3QgZmlsZQotZm9ybWF0LiAgQSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IGNhbiBiZSBzdXBwb3J0ZWQgc2ltcGx5IGJ5Ci1jcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZyBpdCB0byB0aGUgbGlicmFyeS4KLQotQkZEIGlzIHNwbGl0IGludG8gdHdvIHBhcnRzOiB0aGUgZnJvbnQgZW5kLCBhbmQgdGhlIGJhY2sgZW5kcyAob25lIGZvcgotZWFjaCBvYmplY3QgZmlsZSBmb3JtYXQpLgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gVGhlIGZyb250IGVuZCBvZiBCRkQgcHJvdmlkZXMgdGhlIGludGVyZmFjZSB0byB0aGUgdXNlci4gSXQgbWFuYWdlcwotbWVtb3J5IGFuZCB2YXJpb3VzIGNhbm9uaWNhbCBkYXRhIHN0cnVjdHVyZXMuIFRoZSBmcm9udCBlbmQgYWxzbwotZGVjaWRlcyB3aGljaCBiYWNrIGVuZCB0byB1c2UgYW5kIHdoZW4gdG8gY2FsbCBiYWNrIGVuZCByb3V0aW5lcy4KLUBpdGVtIFRoZSBiYWNrIGVuZHMgcHJvdmlkZSBCRkQgaXRzIHZpZXcgb2YgdGhlIHJlYWwgd29ybGQuIEVhY2ggYmFjawotZW5kIHByb3ZpZGVzIGEgc2V0IG9mIGNhbGxzIHdoaWNoIHRoZSBCRkQgZnJvbnQgZW5kIGNhbiB1c2UgdG8gbWFpbnRhaW4KLWl0cyBjYW5vbmljYWwgZm9ybS4gVGhlIGJhY2sgZW5kcyBhbHNvIG1heSBrZWVwIGFyb3VuZCBpbmZvcm1hdGlvbiBmb3IKLXRoZWlyIG93biB1c2UsIGZvciBncmVhdGVyIGVmZmljaWVuY3kuCi1AZW5kIGl0ZW1pemUKLUBtZW51Ci0qIEhpc3Rvcnk6OgkJCUhpc3RvcnkKLSogSG93IEl0IFdvcmtzOjoJCUhvdyBJdCBXb3JrcwotKiBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvOjoJV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbwotQGVuZCBtZW51Ci0KLUBub2RlIEhpc3RvcnksIEhvdyBJdCBXb3JrcywgT3ZlcnZpZXcsIE92ZXJ2aWV3Ci1Ac2VjdGlvbiBIaXN0b3J5Ci0KLU9uZSBzcHVyIGJlaGluZCBCRkQgd2FzIHRoZSBkZXNpcmUsIG9uIHRoZSBwYXJ0IG9mIHRoZSBHTlUgOTYwIHRlYW0gYXQKLUludGVsIE9yZWdvbiwgZm9yIGludGVyb3BlcmFiaWxpdHkgb2YgYXBwbGljYXRpb25zIG9uIHRoZWlyIENPRkYgYW5kCi1iLm91dCBmaWxlIGZvcm1hdHMuICBDeWdudXMgd2FzIHByb3ZpZGluZyBHTlUgc3VwcG9ydCBmb3IgdGhlIHRlYW0sIGFuZAotd2FzIGNvbnRyYWN0ZWQgdG8gcHJvdmlkZSB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4KLQotVGhlIG5hbWUgY2FtZSBmcm9tIGEgY29udmVyc2F0aW9uIERhdmlkIFdhbGxhY2Ugd2FzIGhhdmluZyB3aXRoIFJpY2hhcmQKLVN0YWxsbWFuIGFib3V0IHRoZSBsaWJyYXJ5OiBSTVMgc2FpZCB0aGF0IGl0IHdvdWxkIGJlIHF1aXRlIGhhcmQtLS1EYXZpZAotc2FpZCBgYEJGRCcnLiAgU3RhbGxtYW4gd2FzIHJpZ2h0LCBidXQgdGhlIG5hbWUgc3R1Y2suCi0KLUF0IHRoZSBzYW1lIHRpbWUsIFJlYWR5IFN5c3RlbXMgd2FudGVkIG11Y2ggdGhlIHNhbWUgdGhpbmcsIGJ1dCBmb3IKLWRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzOiBJRUVFLTY5NSwgT2FzeXMsIFNyZWNvcmRzLCBhLm91dCBhbmQgNjhrCi1jb2ZmLgotCi1CRkQgd2FzIGZpcnN0IGltcGxlbWVudGVkIGJ5IG1lbWJlcnMgb2YgQ3lnbnVzIFN1cHBvcnQ7IFN0ZXZlCi1DaGFtYmVybGFpbiAoQGNvZGV7c2FjQEBjeWdudXMuY29tfSksIEpvaG4gR2lsbW9yZQotKEBjb2Rle2dudUBAY3lnbnVzLmNvbX0pLCBLLiAgUmljaGFyZCBQaXhsZXkgKEBjb2Rle3JpY2hAQGN5Z251cy5jb219KQotYW5kIERhdmlkIEhlbmtlbC1XYWxsYWNlIChAY29kZXtndW1ieUBAY3lnbnVzLmNvbX0pLgotCi0KLQotQG5vZGUgSG93IEl0IFdvcmtzLCBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvLCBIaXN0b3J5LCBPdmVydmlldwotQHNlY3Rpb24gSG93IFRvIFVzZSBCRkQKLQotVG8gdXNlIHRoZSBsaWJyYXJ5LCBpbmNsdWRlIEBmaWxle2JmZC5ofSBhbmQgbGluayB3aXRoIEBmaWxle2xpYmJmZC5hfS4JCi0KLUJGRCBwcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgdG8gdGhlIHBhcnRzIG9mIGFuIG9iamVjdCBmaWxlCi1mb3IgYSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAKLQotV2hlbiBhbiBhcHBsaWNhdGlvbiBzdWNlc3NmdWxseSBvcGVucyBhIHRhcmdldCBmaWxlIChvYmplY3QsIGFyY2hpdmUsIG9yCi13aGF0ZXZlciksIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuIFRoaXMgcG9pbnRlcgotcG9pbnRzIHRvIGEgc3RydWN0dXJlIGNhbGxlZCBAY29kZXtiZmR9LCBkZXNjcmliZWQgaW4KLUBmaWxle2JmZC5ofS4gIE91ciBjb252ZW50aW9uIGlzIHRvIGNhbGwgdGhpcyBwb2ludGVyIGEgQkZELCBhbmQKLWluc3RhbmNlcyBvZiBpdCB3aXRoaW4gY29kZSBAY29kZXthYmZkfS4gIEFsbCBvcGVyYXRpb25zIG9uCi10aGUgdGFyZ2V0IG9iamVjdCBmaWxlIGFyZSBhcHBsaWVkIGFzIG1ldGhvZHMgdG8gdGhlIEJGRC4gIFRoZSBtYXBwaW5nIGlzCi1kZWZpbmVkIHdpdGhpbiBAY29kZXtiZmQuaH0gaW4gYSBzZXQgb2YgbWFjcm9zLCBhbGwgYmVnaW5uaW5nCi13aXRoIEBzYW1we2JmZF99IHRvIHJlZHVjZSBuYW1lc3BhY2UgcG9sbHV0aW9uLgotCi1Gb3IgZXhhbXBsZSwgdGhpcyBzZXF1ZW5jZSBkb2VzIHdoYXQgeW91IHdvdWxkIHByb2JhYmx5IGV4cGVjdDoKLXJldHVybiB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIGluIGFuIG9iamVjdCBmaWxlIGF0dGFjaGVkIHRvIGEgQkZECi1AY29kZXthYmZkfS4gCi0KLUBsaXNwCi1AYyBAY2FydG91Y2hlCi0jaW5jbHVkZSAiYmZkLmgiCi0KLXVuc2lnbmVkIGludCBudW1iZXJfb2Zfc2VjdGlvbnMoYWJmZCkKLWJmZCAqYWJmZDsKLUB7Ci0gIHJldHVybiBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCk7Ci1AfQotQGMgQGVuZCBjYXJ0b3VjaGUKLUBlbmQgbGlzcAotCi1UaGUgYWJzdHJhY3Rpb24gdXNlZCB3aXRoaW4gQkZEIGlzIHRoYXQgYW4gb2JqZWN0IGZpbGUgaGFzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotYSBoZWFkZXIsCi1AaXRlbQotYSBudW1iZXIgb2Ygc2VjdGlvbnMgY29udGFpbmluZyByYXcgZGF0YSAoQHB4cmVme1NlY3Rpb25zfSksCi1AaXRlbQotYSBzZXQgb2YgcmVsb2NhdGlvbnMgKEBweHJlZntSZWxvY2F0aW9uc30pLCBhbmQKLUBpdGVtCi1zb21lIHN5bWJvbCBpbmZvcm1hdGlvbiAoQHB4cmVme1N5bWJvbHN9KS4KLUBlbmQgaXRlbWl6ZQotQG5vaW5kZW50Ci1BbHNvLCBCRkRzIG9wZW5lZCBmb3IgYXJjaGl2ZXMgaGF2ZSB0aGUgYWRkaXRpb25hbCBhdHRyaWJ1dGUgb2YgYW4gaW5kZXgKLWFuZCBjb250YWluIHN1Ym9yZGluYXRlIEJGRHMuIFRoaXMgYXBwcm9hY2ggaXMgZmluZSBmb3IgYS5vdXQgYW5kIGNvZmYsCi1idXQgbG9zZXMgZWZmaWNpZW5jeSB3aGVuIGFwcGxpZWQgdG8gZm9ybWF0cyBzdWNoIGFzIFMtcmVjb3JkcyBhbmQKLUlFRUUtNjk1LgotCi1Abm9kZSBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvLCAgLCBIb3cgSXQgV29ya3MsIE92ZXJ2aWV3Ci1Ac2VjdGlvbiBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvCi1AaW5jbHVkZSBiZmRzdW1tLnRleGkKLQotQG5vZGUgQkZEIGZyb250IGVuZCwgQkZEIGJhY2sgZW5kcywgT3ZlcnZpZXcsIFRvcAotQGNoYXB0ZXIgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgYmZkdC50ZXhpCi0KLUBtZW51Ci0qIE1lbW9yeSBVc2FnZTo6Ci0qIEluaXRpYWxpemF0aW9uOjoKLSogU2VjdGlvbnM6OgotKiBTeW1ib2xzOjoKLSogQXJjaGl2ZXM6OgotKiBGb3JtYXRzOjoKLSogUmVsb2NhdGlvbnM6OgotKiBDb3JlIEZpbGVzOjoKLSogVGFyZ2V0czo6Ci0qIEFyY2hpdGVjdHVyZXM6OgotKiBPcGVuaW5nIGFuZCBDbG9zaW5nOjoKLSogSW50ZXJuYWw6OgotKiBGaWxlIENhY2hpbmc6OgotKiBMaW5rZXIgRnVuY3Rpb25zOjoKLSogSGFzaCBUYWJsZXM6OgotQGVuZCBtZW51Ci0KLUBub2RlIE1lbW9yeSBVc2FnZSwgSW5pdGlhbGl6YXRpb24sIEJGRCBmcm9udCBlbmQsIEJGRCBmcm9udCBlbmQKLUBzZWN0aW9uIE1lbW9yeSB1c2FnZQotQkZEIGtlZXBzIGFsbCBvZiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlcyBpbiBvYnN0YWNrcy4gVGhlcmUgaXMgb25lIG9ic3RhY2sKLXBlciBvcGVuIEJGRCBmaWxlLCBpbnRvIHdoaWNoIHRoZSBjdXJyZW50IHN0YXRlIGlzIHN0b3JlZC4gV2hlbiBhIEJGRCBpcwotY2xvc2VkLCB0aGUgb2JzdGFjayBpcyBkZWxldGVkLCBhbmQgc28gZXZlcnl0aGluZyB3aGljaCBoYXMgYmVlbgotYWxsb2NhdGVkIGJ5IEJGRCBmb3IgdGhlIGNsb3NpbmcgZmlsZSBpcyB0aHJvd24gYXdheS4KLQotQkZEIGRvZXMgbm90IGZyZWUgYW55dGhpbmcgY3JlYXRlZCBieSBhbiBhcHBsaWNhdGlvbiwgYnV0IHBvaW50ZXJzIGludG8KLUBjb2Rle2JmZH0gc3RydWN0dXJlcyBiZWNvbWUgaW52YWxpZCBvbiBhIEBjb2Rle2JmZF9jbG9zZX07IGZvciBleGFtcGxlLAotYWZ0ZXIgYSBAY29kZXtiZmRfY2xvc2V9IHRoZSB2ZWN0b3IgcGFzc2VkIHRvCi1AY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0gaXMgc3RpbGwgYXJvdW5kLCBzaW5jZSBpdCBoYXMgYmVlbgotYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYnV0IHRoZSBkYXRhIHRoYXQgaXQgcG9pbnRlZCB0byBhcmUKLWxvc3QuCi0KLVRoZSBnZW5lcmFsIHJ1bGUgaXMgdG8gbm90IGNsb3NlIGEgQkZEIHVudGlsIGFsbCBvcGVyYXRpb25zIGRlcGVuZGVudAotdXBvbiBkYXRhIGZyb20gdGhlIEJGRCBoYXZlIGJlZW4gY29tcGxldGVkLCBvciBhbGwgdGhlIGRhdGEgZnJvbSB3aXRoaW4KLXRoZSBmaWxlIGhhcyBiZWVuIGNvcGllZC4gVG8gaGVscCB3aXRoIHRoZSBtYW5hZ2VtZW50IG9mIG1lbW9yeSwgdGhlcmUKLWlzIGEgZnVuY3Rpb24gKEBjb2Rle2JmZF9hbGxvY19zaXplfSkgd2hpY2ggcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1pbiBvYnN0YWNrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cHBsaWVkIEJGRC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvCi1zZWxlY3QgdGhlIGdyZWVkaWVzdCBvcGVuIEJGRCwgY2xvc2UgaXQgdG8gcmVjbGFpbSB0aGUgbWVtb3J5LCBwZXJmb3JtCi1zb21lIG9wZXJhdGlvbiBhbmQgcmVvcGVuIHRoZSBCRkQgYWdhaW4sIHRvIGdldCBhIGZyZXNoIGNvcHkgb2YgdGhlIGRhdGEKLXN0cnVjdHVyZXMuCi0KLUBub2RlIEluaXRpYWxpemF0aW9uLCBTZWN0aW9ucywgTWVtb3J5IFVzYWdlLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgaW5pdC50ZXhpCi0KLUBub2RlIFNlY3Rpb25zLCBTeW1ib2xzLCBJbml0aWFsaXphdGlvbiwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIHNlY3Rpb24udGV4aQotCi1Abm9kZSBTeW1ib2xzLCBBcmNoaXZlcywgU2VjdGlvbnMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBzeW1zLnRleGkKLQotQG5vZGUgQXJjaGl2ZXMsIEZvcm1hdHMsIFN5bWJvbHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBhcmNoaXZlLnRleGkKLQotQG5vZGUgRm9ybWF0cywgUmVsb2NhdGlvbnMsIEFyY2hpdmVzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgZm9ybWF0LnRleGkKLQotQG5vZGUgUmVsb2NhdGlvbnMsIENvcmUgRmlsZXMsIEZvcm1hdHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICByZWxvYy50ZXhpCi0KLUBub2RlIENvcmUgRmlsZXMsIFRhcmdldHMsIFJlbG9jYXRpb25zLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgY29yZS50ZXhpCi0KLUBub2RlIFRhcmdldHMsIEFyY2hpdGVjdHVyZXMsIENvcmUgRmlsZXMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICB0YXJnZXRzLnRleGkKLQotQG5vZGUgQXJjaGl0ZWN0dXJlcywgT3BlbmluZyBhbmQgQ2xvc2luZywgVGFyZ2V0cywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGFyY2h1cmVzLnRleGkKLQotQG5vZGUgT3BlbmluZyBhbmQgQ2xvc2luZywgSW50ZXJuYWwsIEFyY2hpdGVjdHVyZXMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBvcG5jbHMudGV4aQotCi1Abm9kZSBJbnRlcm5hbCwgRmlsZSBDYWNoaW5nLCBPcGVuaW5nIGFuZCBDbG9zaW5nLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgbGliYmZkLnRleGkKLQotQG5vZGUgRmlsZSBDYWNoaW5nLCBMaW5rZXIgRnVuY3Rpb25zLCBJbnRlcm5hbCwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGNhY2hlLnRleGkKLQotQG5vZGUgTGlua2VyIEZ1bmN0aW9ucywgSGFzaCBUYWJsZXMsIEZpbGUgQ2FjaGluZywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGxpbmtlci50ZXhpCi0KLUBub2RlIEhhc2ggVGFibGVzLCAsIExpbmtlciBGdW5jdGlvbnMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBoYXNoLnRleGkKLQotQG5vZGUgQkZEIGJhY2sgZW5kcywgSW5kZXgsIEJGRCBmcm9udCBlbmQsIFRvcAotQGNoYXB0ZXIgQkZEIGJhY2sgZW5kcwotQG1lbnUKLSogV2hhdCB0byBQdXQgV2hlcmU6OgotKiBhb3V0IDo6CWEub3V0IGJhY2tlbmRzCi0qIGNvZmYgOjoJY29mZiBiYWNrZW5kcwotKiBlbGYgIDo6CWVsZiBiYWNrZW5kcwotQGlnbm9yZQotKiBvYXN5cyA6OglvYXN5cyBiYWNrZW5kcwotKiBpZWVlIDo6CWllZWUgYmFja2VuZAotKiBzcmVjb3JkIDo6CXMtcmVjb3JkIGJhY2tlbmQKLUBlbmQgaWdub3JlCi1AZW5kIG1lbnUKLUBub2RlIFdoYXQgdG8gUHV0IFdoZXJlLCBhb3V0LCBCRkQgYmFjayBlbmRzLCBCRkQgYmFjayBlbmRzCi1BbGwgb2YgQkZEIGxpdmVzIGluIG9uZSBkaXJlY3RvcnkuCi0KLUBub2RlIGFvdXQsIGNvZmYsIFdoYXQgdG8gUHV0IFdoZXJlLCBCRkQgYmFjayBlbmRzCi1AaW5jbHVkZSAgYW91dHgudGV4aQotCi1Abm9kZSBjb2ZmLCBlbGYsIGFvdXQsIEJGRCBiYWNrIGVuZHMKLUBpbmNsdWRlICBjb2ZmY29kZS50ZXhpCi0KLUBub2RlIGVsZiwgICwgY29mZiwgQkZEIGJhY2sgZW5kcwotQGluY2x1ZGUgIGVsZi50ZXhpCi1AYyBMZWF2ZSB0aGlzIG91dCB1bnRpbCB0aGUgZmlsZSBoYXMgc29tZSBhY3R1YWwgY29udGVudHMuLi4KLUBjIEBpbmNsdWRlICBlbGZjb2RlLnRleGkKLQotQG5vZGUgSW5kZXgsICAsIEJGRCBiYWNrIGVuZHMgLCBUb3AKLUB1bm51bWJlcmVkIEluZGV4Ci1AcHJpbnRpbmRleCBjcAotCi1AdGV4Ci0lIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCi0lIG1lYW50aW1lOgotXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKLVxjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KLVxjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9Ci1cY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQotXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KLVxjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQotXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KLVxjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQotXHBhZ2VcY29sb3Bob24KLSUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgotQGVuZCB0ZXgKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9iZmQvZG9jL2JmZGludC50ZXhpIGIvYmZkL2RvYy9iZmRpbnQudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwOWIzNC4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2JmZGludC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTg4NSArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGJmZGludC5pbmZvCi0KLUBzZXR0aXRsZSBCRkQgSW50ZXJuYWxzCi1AaWZ0ZXgKLUB0aXRsZXBhZ2UKLUB0aXRsZXtCRkQgSW50ZXJuYWxzfQotQGF1dGhvcntJYW4gTGFuY2UgVGF5bG9yfQotQGF1dGhvcntDeWdudXMgU29sdXRpb25zfQotQHBhZ2UKLUBlbmQgaWZ0ZXgKLQotQG5vZGUgVG9wCi1AdG9wIEJGRCBJbnRlcm5hbHMKLUByYWlzZXNlY3Rpb25zCi1AY2luZGV4IGJmZCBpbnRlcm5hbHMKLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgc29tZSBCRkQgaW50ZXJuYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlCi1oZWxwZnVsIHdoZW4gd29ya2luZyBvbiBCRkQuICBJdCBpcyB2ZXJ5IGluY29tcGxldGUuCi0KLVRoaXMgZG9jdW1lbnQgaXMgbm90IHVwZGF0ZWQgcmVndWxhcmx5LCBhbmQgbWF5IGJlIG91dCBvZiBkYXRlLiAgSXQgd2FzCi1sYXN0IG1vZGlmaWVkIG9uICREYXRlJC4KLQotVGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IHdhcyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IKLUBlbWFpbHtpYW5AQGN5Z251cy5jb219LgotCi1AbWVudQotKiBCRkQgb3ZlcnZpZXc6OgkJQkZEIG92ZXJ2aWV3Ci0qIEJGRCBndWlkZWxpbmVzOjoJCUJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi0qIEJGRCB0YXJnZXQgdmVjdG9yOjoJCUJGRCB0YXJnZXQgdmVjdG9yCi0qIEJGRCBnZW5lcmF0ZWQgZmlsZXM6OgkJQkZEIGdlbmVyYXRlZCBmaWxlcwotKiBCRkQgbXVsdGlwbGUgY29tcGlsYXRpb25zOjoJRmlsZXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgaW4gQkZECi0qIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nOjoJQkZEIHJlbG9jYXRpb24gaGFuZGxpbmcKLSogQkZEIEVMRiBzdXBwb3J0OjoJCUJGRCBFTEYgc3VwcG9ydAotKiBCRkQgZ2xvc3Nhcnk6OgkJR2xvc3NhcnkKLSogSW5kZXg6OgkJCUluZGV4Ci1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIG92ZXJ2aWV3Ci1Ac2VjdGlvbiBCRkQgb3ZlcnZpZXcKLQotQkZEIGlzIGEgbGlicmFyeSB3aGljaCBwcm92aWRlcyBhIHNpbmdsZSBpbnRlcmZhY2UgdG8gcmVhZCBhbmQgd3JpdGUKLW9iamVjdCBmaWxlcywgZXhlY3V0YWJsZXMsIGFyY2hpdmUgZmlsZXMsIGFuZCBjb3JlIGZpbGVzIGluIGFueSBmb3JtYXQuCi0KLUBtZW51Ci0qIEJGRCBsaWJyYXJ5IGludGVyZmFjZXM6OglCRkQgbGlicmFyeSBpbnRlcmZhY2VzCi0qIEJGRCBsaWJyYXJ5IHVzZXJzOjoJCUJGRCBsaWJyYXJ5IHVzZXJzCi0qIEJGRCB2aWV3OjoJCQlUaGUgQkZEIHZpZXcgb2YgYSBmaWxlCi0qIEJGRCBibGluZG5lc3M6OgkJQkZEIGxvc2VzIGluZm9ybWF0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotCi1PbmUgd2F5IHRvIGxvb2sgYXQgdGhlIEJGRCBsaWJyYXJ5IGlzIHRvIGRpdmlkZSBpdCBpbnRvIGZvdXIgcGFydHMgYnkKLXR5cGUgb2YgaW50ZXJmYWNlLgotCi1UaGUgZmlyc3QgaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgZ2VuZXJpYyBmdW5jdGlvbnMgd2hpY2ggcHJvZ3JhbXMgdXNpbmcKLXRoZSBCRkQgbGlicmFyeSB3aWxsIGNhbGwuICBUaGVzZSBnZW5lcmljIGZ1bmN0aW9uIG5vcm1hbGx5IHRyYW5zbGF0ZQotZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnRvIGNhbGxzIHRvIHJvdXRpbmVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBhCi1wYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIE1hbnkgb2YgdGhlc2UgZ2VuZXJpYyBmdW5jdGlvbnMgYXJlCi1hY3R1YWxseSBkZWZpbmVkIGFzIG1hY3JvcyBpbiBAZmlsZXtiZmQuaH0uICBUaGVzZSBmdW5jdGlvbnMgY29tcHJpc2UKLXRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLgotCi1UaGUgc2Vjb25kIGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIHRhcmdldAotdmVjdG9ycy4gIFRoaXMgaXMgdGhlIGJ1bGsgb2YgdGhlIGNvZGUgaW4gQkZELiAgQSB0YXJnZXQgdmVjdG9yIGlzIGEgc2V0Ci1vZiBmdW5jdGlvbiBwb2ludGVycyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlCi10YXJnZXQgdmVjdG9yIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBnZW5lcmljIEJGRCBmdW5jdGlvbnMuICBUaGVzZQotZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkIHRocm91Z2ggdGhlIHRhcmdldCB2ZWN0b3IsIGFuZCBhcmUgbmV2ZXIKLWNhbGxlZCBkaXJlY3RseS4gIFRoZSB0YXJnZXQgdmVjdG9yIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gQHJlZntCRkQKLXRhcmdldCB2ZWN0b3J9LiAgVGhlIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIGEgcGFydGljdWxhcgotdGFyZ2V0IHZlY3RvciBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhIEJGRCBiYWNrZW5kLgotCi1UaGUgdGhpcmQgaW50ZXJmYWNlIGlzIGEgc2V0IG9mIG9kZGJhbGwgZnVuY3Rpb25zIHdoaWNoIGFyZSB0eXBpY2FsbHkKLXNwZWNpZmljIHRvIGEgcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQsIGFyZSBub3QgZ2VuZXJpYyBmdW5jdGlvbnMsCi1hbmQgYXJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LiAgVGhlc2UgYXJlIHVzZWQgYXMgaG9va3MKLWJ5IHRoZSBsaW5rZXIgYW5kIHRoZSBhc3NlbWJsZXIgd2hlbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0Ci1yZXF1aXJlcyBzb21lIGFjdGlvbiB3aGljaCB0aGUgQkZEIGdlbmVyaWMgaW50ZXJmYWNlIGRvZXMgbm90IHByb3ZpZGUuCi1UaGVzZSBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBkZWNsYXJlZCBpbiBAZmlsZXtiZmQuaH0sIGJ1dCBpbiBtYW55Ci1jYXNlcyB0aGV5IGFyZSBvbmx5IHByb3ZpZGVkIHdoZW4gQkZEIGlzIGNvbmZpZ3VyZWQgd2l0aCBzdXBwb3J0IGZvciBhCi1wYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZXNlIGZ1bmN0aW9ucyBsaXZlIGluIGEgZ3JleSBhcmVhLCBhbmQKLWFyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UuCi0KLVRoZSBmb3VydGggaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgQkZEIHN1cHBvcnQgZnVuY3Rpb25zIHdoaWNoIGFyZQotY2FsbGVkIGJ5IHRoZSBvdGhlciBCRkQgZnVuY3Rpb25zLiAgVGhlc2UgbWFuYWdlIGlzc3VlcyBsaWtlIG1lbW9yeQotYWxsb2NhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGZpbGUgYWNjZXNzLCBoYXNoIHRhYmxlcywgc3dhcHBpbmcsIGFuZCB0aGUKLWxpa2UuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5ldmVyIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1Abm9kZSBCRkQgbGlicmFyeSB1c2VycwotQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgdXNlcnMKLQotQW5vdGhlciB3YXkgdG8gbG9vayBhdCB0aGUgQkZEIGxpYnJhcnkgaXMgdG8gZGl2aWRlIGl0IGludG8gdGhyZWUgcGFydHMKLWJ5IHRoZSBtYW5uZXIgaW4gd2hpY2ggaXQgaXMgdXNlZC4KLQotVGhlIGZpcnN0IHVzZSBpcyB0byByZWFkIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHJlYWRlcnMgYXJlCi1wcm9ncmFtcyBsaWtlIEBzYW1we2dkYn0sIEBzYW1we25tfSwgQHNhbXB7b2JqZHVtcH0sIGFuZCBAc2FtcHtvYmpjb3B5fS4KLVRoZXNlIHByb2dyYW1zIHVzZSBCRkQgdG8gdmlldyBhbiBvYmplY3QgZmlsZSBpbiBhIGdlbmVyaWMgZm9ybS4gIFRoZQotb2ZmaWNpYWwgQkZEIGludGVyZmFjZSBpcyBub3JtYWxseSBmdWxseSBhZGVxdWF0ZSBmb3IgdGhlc2UgcHJvZ3JhbXMuCi0KLVRoZSBzZWNvbmQgdXNlIGlzIHRvIHdyaXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHdyaXRlcnMgYXJlCi1wcm9ncmFtcyBsaWtlIEBzYW1we2dhc30gYW5kIEBzYW1we29iamNvcHl9LiAgVGhlc2UgcHJvZ3JhbXMgdXNlIEJGRCB0bwotY3JlYXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UgaXMgbm9ybWFsbHkgYWRlcXVhdGUKLWZvciB0aGVzZSBwcm9ncmFtcywgYnV0IGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgdGhlIGFzc2VtYmxlciBuZWVkcwotc29tZSBhZGRpdGlvbmFsIGhvb2tzIGluIG9yZGVyIHRvIHNldCBwYXJ0aWN1bGFyIGZsYWdzIG9yIG90aGVyCi1pbmZvcm1hdGlvbi4gIFRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlIGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBjb3B5Ci1wcml2YXRlIGluZm9ybWF0aW9uIGZyb20gb25lIG9iamVjdCBmaWxlIHRvIGFub3RoZXIsIGFuZCB0aGVzZSBmdW5jdGlvbnMKLWFyZSB1c2VkIGJ5IEBzYW1we29iamNvcHl9IHRvIGF2b2lkIGluZm9ybWF0aW9uIGxvc3MuCi0KLVRoZSB0aGlyZCB1c2UgaXMgdG8gbGluayBvYmplY3QgZmlsZXMuICBUaGVyZSBpcyBvbmx5IG9uZSBvYmplY3QgZmlsZQotbGlua2VyLCBAc2FtcHtsZH0uICBPcmlnaW5hbGx5LCBAc2FtcHtsZH0gd2FzIGFuIG9iamVjdCBmaWxlIHJlYWRlciBhbmQKLWFuIG9iamVjdCBmaWxlIHdyaXRlciwgYW5kIGl0IGRpZCB0aGUgbGluayBvcGVyYXRpb24gdXNpbmcgdGhlIGdlbmVyaWMKLUJGRCBzdHJ1Y3R1cmVzLiAgSG93ZXZlciwgdGhpcyB0dXJuZWQgb3V0IHRvIGJlIHRvbyBzbG93IGFuZCB0b28gbWVtb3J5Ci1pbnRlbnNpdmUuCi0KLVRoZSBvZmZpY2lhbCBCRkQgbGlua2VyIGZ1bmN0aW9ucyB3ZXJlIHdyaXR0ZW4gdG8gcGVybWl0IHNwZWNpZmljIEJGRAotYmFja2VuZHMgdG8gcGVyZm9ybSB0aGUgbGluayB3aXRob3V0IHRyYW5zbGF0aW5nIHRocm91Z2ggdGhlIGdlbmVyaWMKLXN0cnVjdHVyZXMsIGluIHRoZSBub3JtYWwgY2FzZSB3aGVyZSBhbGwgdGhlIGlucHV0IGZpbGVzIGFuZCBvdXRwdXQgZmlsZQotaGF2ZSB0aGUgc2FtZSBvYmplY3QgZmlsZSBmb3JtYXQuICBOb3QgYWxsIG9mIHRoZSBiYWNrZW5kcyBjdXJyZW50bHkKLWltcGxlbWVudCB0aGUgbmV3IGludGVyZmFjZSwgYW5kIHRoZXJlIGFyZSBkZWZhdWx0IGxpbmtpbmcgZnVuY3Rpb25zCi13aXRoaW4gQkZEIHdoaWNoIHVzZSB0aGUgZ2VuZXJpYyBzdHJ1Y3R1cmVzIGFuZCB3aGljaCB3b3JrIHdpdGggYWxsCi1iYWNrZW5kcy4KLQotRm9yIHNldmVyYWwgb2JqZWN0IGZpbGUgZm9ybWF0cyB0aGUgbGlua2VyIG5lZWRzIGFkZGl0aW9uYWwgaG9va3Mgd2hpY2gKLWFyZSBub3QgcHJvdmlkZWQgYnkgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UsIHBhcnRpY3VsYXJseSBmb3IgZHluYW1pYwotbGlua2luZyBzdXBwb3J0LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgY2FsbGVkIGZyb20gdGhlIGxpbmtlcgotZW11bGF0aW9uIHRlbXBsYXRlLgotCi1Abm9kZSBCRkQgdmlldwotQHN1YnNlY3Rpb24gVGhlIEJGRCB2aWV3IG9mIGEgZmlsZQotCi1CRkQgdXNlcyBnZW5lcmljIHN0cnVjdHVyZXMgdG8gbWFuYWdlIGluZm9ybWF0aW9uLiAgSXQgdHJhbnNsYXRlcyBkYXRhCi1pbnRvIHRoZSBnZW5lcmljIGZvcm0gd2hlbiByZWFkaW5nIGZpbGVzLCBhbmQgb3V0IG9mIHRoZSBnZW5lcmljIGZvcm0KLXdoZW4gd3JpdGluZyBmaWxlcy4KLQotQkZEIGRlc2NyaWJlcyBhIGZpbGUgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHtiZmR9IHR5cGUuICBBIEBzYW1we2JmZH0KLWlzIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMuICBUaGUgQkZEIGluZm9ybWF0aW9uIGNhbiBiZQotZGlzcGxheWVkIHVzaW5nIHRoZSBAc2FtcHtvYmpkdW1wfSBwcm9ncmFtIHdpdGggdmFyaW91cyBvcHRpb25zLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGdlbmVyYWwgaW5mb3JtYXRpb24KLVRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIGEgZmV3IGdlbmVyYWwgZmxhZ3MsIHRoZSBzdGFydCBhZGRyZXNzLgotQGl0ZW0gYXJjaGl0ZWN0dXJlCi1UaGUgYXJjaGl0ZWN0dXJlLCBpbmNsdWRpbmcgYm90aCBhIGdlbmVyYWwgcHJvY2Vzc29yIHR5cGUgKG02OGssIE1JUFMKLWV0Yy4pIGFuZCBhIHNwZWNpZmljIG1hY2hpbmUgbnVtYmVyIChtNjgwMDAsIFI0MDAwLCBldGMuKS4KLUBpdGVtIHNlY3Rpb25zCi1BIGxpc3Qgb2Ygc2VjdGlvbnMuCi1AaXRlbSBzeW1ib2xzCi1BIHN5bWJvbCB0YWJsZS4KLUBlbmQgdGFibGUKLQotQkZEIHJlcHJlc2VudHMgYSBzZWN0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXNlY3Rpb259IHR5cGUuICBFYWNoCi1zZWN0aW9uIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMgYWxzbyBoYXZlIGFuIGFzc29jaWF0ZWQKLWJsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgU2VjdGlvbnMgYWxzbyBoYXZlCi1hc3NvY2lhdGVkIGZsYWdzLCBhIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MsIGEgbG9hZCBtZW1vcnkgYWRkcmVzcywgYQotcmVxdWlyZWQgYWxpZ25tZW50LCBhIGxpc3Qgb2YgcmVsb2NhdGlvbnMsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzCi1pbmZvcm1hdGlvbi4KLQotQkZEIHJlcHJlc2VudHMgYSByZWxvY2F0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXJlbGVudH0gdHlwZS4gIEEKLXJlbG9jYXRpb24gZGVzY3JpYmVzIGFuIGFjdGlvbiB3aGljaCB0aGUgbGlua2VyIG11c3QgdGFrZSB0byBtb2RpZnkgdGhlCi1zZWN0aW9uIGNvbnRlbnRzLiAgUmVsb2NhdGlvbnMgaGF2ZSBhIHN5bWJvbCwgYW4gYWRkcmVzcywgYW4gYWRkZW5kLCBhbmQKLWEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgaG93IHRvIHBlcmZvcm0gdGhlCi1yZWxvY2F0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KLQotQkZEIHJlcHJlc2VudHMgYSBzeW1ib2wgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHthc3ltYm9sfSB0eXBlLiAgQQotc3ltYm9sIGhhcyBhIG5hbWUsIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuIG9mZnNldCB3aXRoaW4gdGhhdAotc2VjdGlvbiwgYW5kIHNvbWUgZmxhZ3MuCi0KLUFyY2hpdmUgZmlsZXMgZG8gbm90IGhhdmUgYW55IHNlY3Rpb25zIG9yIHN5bWJvbHMuICBJbnN0ZWFkLCBCRkQKLXJlcHJlc2VudHMgYW4gYXJjaGl2ZSBmaWxlIGFzIGEgZmlsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YKLUBzYW1we2JmZH1zLiAgQkZEIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhcmNoaXZlIHN5bWJvbCBtYXAsIGFzIGEKLWxpc3Qgb2Ygc3ltYm9sIG5hbWVzLiAgQkZEIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBAc2FtcHtiZmR9Ci13aXRoaW4gdGhlIGFyY2hpdmUgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGVudHJ5IGluIHRoZQotYXJjaGl2ZSBzeW1ib2wgbWFwLgotCi1Abm9kZSBCRkQgYmxpbmRuZXNzCi1Ac3Vic2VjdGlvbiBCRkQgbG9zZXMgaW5mb3JtYXRpb24KLQotTW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzIGhhdmUgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50IGluCi1pdHMgZ2VuZXJpYyBmb3JtLCBhdCBsZWFzdCBhcyBjdXJyZW50bHkgZGVmaW5lZC4KLQotVGhlcmUgaXMgb2Z0ZW4gZXhwbGljaXQgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50LiAgRm9yCi1leGFtcGxlLCB0aGUgQ09GRiB2ZXJzaW9uIHN0YW1wLCBvciB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMuICBCRkQKLXByb3ZpZGVzIHNwZWNpYWwgaG9va3MgdG8gaGFuZGxlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb3B5aW5nLAotcHJpbnRpbmcsIG9yIGxpbmtpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGUgQkZEIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhcgotb2JqZWN0IGZpbGUgZm9ybWF0IHdpbGwgbm9ybWFsbHkgc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBpbiBwcml2YXRlIGRhdGEKLWFuZCBoYW5kbGUgaXQgdXNpbmcgdGhlIHNwZWNpYWwgaG9va3MuCi0KLUluIHNvbWUgY2FzZXMgdGhlcmUgaXMgYWxzbyBpbXBsaWNpdCBpbmZvcm1hdGlvbiB3aGljaCBCRkQgY2FuIG5vdAotcmVwcmVzZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBNSVBTIHByb2Nlc3NvciBkaXN0aW5ndWlzaGVzIHNtYWxsIGFuZAotbGFyZ2Ugc3ltYm9scywgYW5kIHJlcXVpcmVzIHRoYXQgYWxsIHNtYWxsIHN5bWJscyBiZSB3aXRoaW4gMzJLIG9mIHRoZQotR1AgcmVnaXN0ZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIE1JUFMgYXNzZW1ibGVyIG11c3QgYmUgYWJsZSB0byBtYXJrCi12YXJpYWJsZXMgYXMgZWl0aGVyIHNtYWxsIG9yIGxhcmdlLCBhbmQgdGhlIE1JUFMgbGlua2VyIG11c3Qga25vdyB0byBwdXQKLXNtYWxsIHN5bWJvbHMgd2l0aGluIHJhbmdlIG9mIHRoZSBHUCByZWdpc3Rlci4gIFNpbmNlIEJGRCBjYW4gbm90Ci1yZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiwgdGhpcyBtZWFucyB0aGF0IHRoZSBhc3NlbWJsZXIgYW5kIGxpbmtlcgotbXVzdCBoYXZlIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCi1mb3JtYXQgd2hpY2ggaXMgb3V0c2lkZSBvZiB0aGUgQkZEIGxpYnJhcnkuCi0KLVRoaXMgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbmRpY2F0ZXMgYXJlYXMgd2hlcmUgdGhlIEJGRCBwYXJhZGlnbSBicmVha3MKLWRvd24uICBJdCBpcyBub3QgYWN0dWFsbHkgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSBteXJpYWQgZGlmZmVyZW5jZXMKLWFtb25nIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNpbmcgYSBzaW5nbGUgZ2VuZXJpYyBpbnRlcmZhY2UsIGF0IGxlYXN0IG5vdAotaW4gdGhlIG1hbm5lciB3aGljaCBCRkQgZG9lcyBpdCB0b2RheS4KLQotTmV2ZXJ0aGVsZXNzLCB0aGUgQkZEIGxpYnJhcnkgZG9lcyBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGRlYWxpbmcKLXdpdGggb2JqZWN0IGZpbGVzLCBhbmQgcGFydGljdWxhciBwcm9ibGVtcyBjYXVzZWQgYnkgaW5mb3JtYXRpb24gbG9zcwotY2FuIG5vcm1hbGx5IGJlIHNvbHZlZCB1c2luZyBzb21lIHNvcnQgb2YgcmVsYXRpdmVseSBjb25zdHJhaW5lZCBob29rCi1pbnRvIHRoZSBsaWJyYXJ5LgotCi0KLQotQG5vZGUgQkZEIGd1aWRlbGluZXMKLUBzZWN0aW9uIEJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi1AY2luZGV4IGJmZCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi1AY2luZGV4IHByb2dyYW1taW5nIGd1aWRlbGluZXMgZm9yIGJmZAotQGNpbmRleCBndWlkZWxpbmVzLCBiZmQgcHJvZ3JhbW1pbmcKLQotVGhlcmUgaXMgYSBsb3Qgb2YgcG9vcmx5IHdyaXR0ZW4gYW5kIGNvbmZ1c2luZyBjb2RlIGluIEJGRC4gIE5ldyBCRkQKLWNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYSBoaWdoZXIgc3RhbmRhcmQuICBNZXJlbHkgYmVjYXVzZSBzb21lIEJGRAotY29kZSBpcyB3cml0dGVuIGluIGEgcGFydGljdWxhciBtYW5uZXIgZG9lcyBub3QgbWVhbiB0aGF0IHlvdSBzaG91bGQKLWVtdWxhdGUgaXQuCi0KLUhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUZvbGxvdyB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBpdGVtCi1Bdm9pZCBnbG9iYWwgdmFyaWFibGVzLiAgV2UgaWRlYWxseSB3YW50IEJGRCB0byBiZSBmdWxseSByZWVudHJhbnQsIHNvCi10aGF0IGl0IGNhbiBiZSB1c2VkIGluIG11bHRpcGxlIHRocmVhZHMuICBBbGwgdXNlcyBvZiBnbG9iYWwgb3Igc3RhdGljCi12YXJpYWJsZXMgaW50ZXJmZXJlIHdpdGggdGhhdC4gIEluaXRpYWxpemVkIGNvbnN0YW50IHZhcmlhYmxlcyBhcmUgT0ssCi1hbmQgdGhleSBzaG91bGQgYmUgZXhwbGljaXRseSBtYXJrZWQgd2l0aCBjb25zdC4gIEluc3RlYWQgb2YgZ2xvYmFsCi12YXJpYWJsZXMsIHVzZSBkYXRhIGF0dGFjaGVkIHRvIGEgQkZEIG9yIHRvIGEgbGlua2VyIGhhc2ggdGFibGUuCi0KLUBpdGVtCi1BbGwgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZSBuYW1lcyB3aGljaCBzdGFydCB3aXRoCi1Ac2FtcHtiZmRffS4gIEFsbCBzdWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gc29tZSBoZWFkZXIgZmlsZSwKLXR5cGljYWxseSBAZmlsZXtiZmQuaH0uICBTZWUsIGZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBkZWNsYXJhdGlvbnMgbmVhcgotdGhlIGVuZCBvZiBAZmlsZXtiZmQtaW4uaH0sIHdoaWNoIG1vc3RseSBkZWNsYXJlIGZ1bmN0aW9ucyByZXF1aXJlZCBieQotc3BlY2lmaWMgbGlua2VyIGVtdWxhdGlvbnMuCi0KLUBpdGVtCi1BbGwgZnVuY3Rpb25zIHdoaWNoIG5lZWQgdG8gYmUgdmlzaWJsZSBmcm9tIG9uZSBmaWxlIHRvIGFub3RoZXIgd2l0aGluCi1CRkQsIGJ1dCBzaG91bGQgbm90IGJlIHZpc2libGUgb3V0c2lkZSBvZiBCRkQsIHNob3VsZCBzdGFydCB3aXRoCi1Ac2FtcHtfYmZkX30uICBBbHRob3VnaCBleHRlcm5hbCBuYW1lcyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtffSBhcmUKLXByb2hpYml0ZWQgYnkgdGhlIEFOU0kgc3RhbmRhcmQsIGluIHByYWN0aWNlIHRoaXMgdXNhZ2Ugd2lsbCBhbHdheXMKLXdvcmssIGFuZCBpdCBpcyByZXF1aXJlZCBieSB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBpdGVtCi1BbHdheXMgcmVtZW1iZXIgdGhhdCBwZW9wbGUgY2FuIGNvbXBpbGUgdXNpbmcgQHNhbXB7LS1lbmFibGUtdGFyZ2V0c30gdG8KLWJ1aWxkIHNldmVyYWwsIG9yIGFsbCwgdGFyZ2V0cyBhdCBvbmNlLiAgSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBsaW5rCi10b2dldGhlciB0aGUgZmlsZXMgZm9yIGFsbCB0YXJnZXRzLgotCi1AaXRlbQotQkZEIGNvZGUgc2hvdWxkIGNvbXBpbGUgd2l0aCBmZXcgb3Igbm8gd2FybmluZ3MgdXNpbmcgQHNhbXB7Z2NjIC1XYWxsfS4KLVNvbWUgd2FybmluZ3MgYXJlIE9LLCBsaWtlIHRoZSBhYnNlbmNlIG9mIGNlcnRhaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zCi13aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgV2FybmluZ3MgYWJvdXQKLWFtYmlndW91cyBleHByZXNzaW9ucyBhbmQgdGhlIGxpa2Ugc2hvdWxkIGFsd2F5cyBiZSBmaXhlZC4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvcgotQHNlY3Rpb24gQkZEIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggYmZkIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciBpbiBiZmQKLQotQkZEIHN1cHBvcnRzIG11bHRpcGxlIG9iamVjdCBmaWxlIGZvcm1hdHMgYnkgdXNpbmcgdGhlIEBkZm57dGFyZ2V0Ci12ZWN0b3J9LiAgVGhpcyBpcyBzaW1wbHkgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaW1wbGVtZW50Ci1iZWhhdmlvdXIgdGhhdCBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi1JbiB0aGlzIHNlY3Rpb24gSSBsaXN0IGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGUgdGFyZ2V0IHZlY3RvciBhbmQKLWRlc2NyaWJlIHdoYXQgdGhleSBkby4KLQotQG1lbnUKLSogQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91czo6CU1pc2NlbGxhbmVvdXMgY29uc3RhbnRzCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHN3YXA6OgkJU3dhcHBpbmcgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdDo6CQlGb3JtYXQgdHlwZSBkZXBlbmRlbnQgZnVuY3Rpb25zCi0qIEJGRF9KVU1QX1RBQkxFIG1hY3Jvczo6CQlCRkRfSlVNUF9UQUJMRSBtYWNyb3MKLSogQkZEIHRhcmdldCB2ZWN0b3IgZ2VuZXJpYzo6CQlHZW5lcmljIGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBjb3B5OjoJCUNvcHkgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGNvcmU6OgkJQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmU6OgkJQXJjaGl2ZSBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3Igc3ltYm9sczo6CQlTeW1ib2wgdGFibGUgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jczo6CQlSZWxvY2F0aW9uIHN1cHBvcnQKLSogQkZEIHRhcmdldCB2ZWN0b3Igd3JpdGU6OgkJT3V0cHV0IGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBsaW5rOjoJCUxpbmtlciBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYzo6CQlEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gZnVuY3Rpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91cwotQHN1YnNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb25zdGFudHMKLQotVGhlIHRhcmdldCB2ZWN0b3Igc3RhcnRzIHdpdGggYSBzZXQgb2YgY29uc3RhbnRzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIG5hbWUKLVRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyBhbiBhcmJpdHJhcnkgc3RyaW5nLiAgVGhpcyBpcwotaG93IHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIGluIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciB0b29scyB3aGljaAotdXNlIEJGRCwgc3VjaCBhcyB0aGUgQHNhbXB7LW9mb3JtYXR9IGxpbmtlciBvcHRpb24uCi0KLUBpdGVtIGZsYXZvdXIKLUEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiB0YXJnZXQuICBUaGUgZm9sbG93aW5nIGZsYXZvdXJzIGFyZQotY3VycmVudGx5IGRlZmluZWQ6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIKLVVuZGVmaW5lZCBvciB1bmtub3duLgotQGl0ZW0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLWEub3V0LgotQGl0ZW0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLUNPRkYuCi1AaXRlbSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLUVDT0ZGLgotQGl0ZW0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotRUxGLgotQGl0ZW0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIKLUlFRUUtNjk1LgotQGl0ZW0gYmZkX3RhcmdldF9ubG1fZmxhdm91cgotTkxNLgotQGl0ZW0gYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyCi1PQVNZUy4KLUBpdGVtIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIKLVRla3Ryb25peCBoZXggZm9ybWF0LgotQGl0ZW0gYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIKLU1vdG9yb2xhIFMtcmVjb3JkIGZvcm1hdC4KLUBpdGVtIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyCi1JbnRlbCBoZXggZm9ybWF0LgotQGl0ZW0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotU09NICh1c2VkIG9uIEhQL1VYKS4KLUBpdGVtIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyCi1vczkwMDAuCi1AaXRlbSBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIKLVZFUlNBZG9zLgotQGl0ZW0gYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyCi1NUy1ET1MuCi1AaXRlbSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotb3BlblZNUy4KLUBlbmQgdGFibGUKLQotQGl0ZW0gYnl0ZW9yZGVyCi1UaGUgYnl0ZSBvcmRlciBvZiBkYXRhIGluIHRoZSBvYmplY3QgZmlsZS4gIE9uZSBvZgotQHNhbXB7QkZEX0VORElBTl9CSUd9LCBAc2FtcHtCRkRfRU5ESUFOX0xJVFRMRX0sIG9yCi1Ac2FtcHtCRkRfRU5ESUFOX1VOS05PV059LiAgVGhlIGxhdHRlciB3b3VsZCBiZSB1c2VkIGZvciBhIGZvcm1hdCBzdWNoCi1hcyBTLXJlY29yZHMgd2hpY2ggZG8gbm90IHJlY29yZCB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBkYXRhLgotCi1AaXRlbSBoZWFkZXJfYnl0ZW9yZGVyCi1UaGUgYnl0ZSBvcmRlciBvZiBoZWFkZXIgaW5mb3JtYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLiAgTm9ybWFsbHkgdGhlCi1zYW1lIGFzIHRoZSBAc2FtcHtieXRlb3JkZXJ9IGZpZWxkLCBidXQgdGhlcmUgYXJlIGNlcnRhaW4gY2FzZXMgd2hlcmUgaXQKLW1heSBiZSBkaWZmZXJlbnQuCi0KLUBpdGVtIG9iamVjdF9mbGFncwotRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUgQHNhbXB7ZmxhZ3N9IGZpZWxkIG9mIGEgQkZEIHdpdGggdGhpcwotZm9ybWF0LgotCi1AaXRlbSBzZWN0aW9uX2ZsYWdzCi1GbGFncyB3aGljaCBtYXkgYXBwZWFyIGluIHRoZSBAc2FtcHtmbGFnc30gZmllbGQgb2YgYSBzZWN0aW9uIHdpdGhpbiBhCi1CRkQgd2l0aCB0aGlzIGZvcm1hdC4KLQotQGl0ZW0gc3ltYm9sX2xlYWRpbmdfY2hhcgotQSBjaGFyYWN0ZXIgd2hpY2ggdGhlIEMgY29tcGlsZXIgbm9ybWFsbHkgcHV0cyBiZWZvcmUgYSBzeW1ib2wuICBGb3IKLWV4YW1wbGUsIGFuIGEub3V0IGNvbXBpbGVyIHdpbGwgdHlwaWNhbGx5IGdlbmVyYXRlIHRoZSBzeW1ib2wKLUBzYW1we19mb299IGZvciBhIGZ1bmN0aW9uIG5hbWVkIEBzYW1we2Zvb30gaW4gdGhlIEMgc291cmNlLCBpbiB3aGljaAotY2FzZSB0aGlzIGZpZWxkIHdvdWxkIGJlIEBzYW1we199LiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBjaGFyYWN0ZXIsIHRoaXMKLWZpZWxkIHdpbGwgYmUgQHNhbXB7MH0uCi0KLUBpdGVtIGFyX3BhZF9jaGFyCi1UaGUgcGFkZGluZyBjaGFyYWN0ZXIgdG8gdXNlIGF0IHRoZSBlbmQgb2YgYW4gYXJjaGl2ZSBuYW1lLiAgTm9ybWFsbHkKLUBzYW1wey99LgotCi1AaXRlbSBhcl9tYXhfbmFtZWxlbgotVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2hvcnQgbmFtZSBpbiBhbiBhcmNoaXZlLiAgTm9ybWFsbHkgQHNhbXB7MTR9LgotCi1AaXRlbSBiYWNrZW5kX2RhdGEKLUEgcG9pbnRlciB0byBjb25zdGFudCBiYWNrZW5kIGRhdGEuICBUaGlzIGlzIHVzZWQgYnkgYmFja2VuZHMgdG8gc3RvcmUKLXdoYXRldmVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhleSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHNpbWlsYXIgdGFyZ2V0Ci12ZWN0b3JzIHdoaWNoIHVzZSB0aGUgc2FtZSBzZXRzIG9mIGZ1bmN0aW9ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3Igc3dhcAotQHN1YnNlY3Rpb24gU3dhcHBpbmcgZnVuY3Rpb25zCi0KLUV2ZXJ5IHRhcmdldCB2ZWN0b3IgaGFzIGZ1Y3Rpb24gcG9pbnRlcnMgdXNlZCBmb3Igc3dhcHBpbmcgaW5mb3JtYXRpb24KLWluIGFuZCBvdXQgb2YgdGhlIHRhcmdldCByZXByZXNlbnRhdGlvbi4gIFRoZXJlIGFyZSB0d28gc2V0cyBvZgotZnVuY3Rpb25zOiBvbmUgZm9yIGRhdGEgaW5mb3JtYXRpb24sIGFuZCBvbmUgZm9yIGhlYWRlciBpbmZvcm1hdGlvbi4KLUVhY2ggc2V0IGhhcyB0aHJlZSBzaXplczogNjQtYml0LCAzMi1iaXQsIGFuZCAxNi1iaXQuICBFYWNoIHNpemUgaGFzCi10aHJlZSBhY3R1YWwgZnVuY3Rpb25zOiBwdXQsIGdldCB1bnNpZ25lZCwgYW5kIGdldCBzaWduZWQuCi0KLVRoZXNlIDE4IGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb252ZXJ0IGRhdGEgYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0Ci1yZXByZXNlbnRhdGlvbnMuCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdAotQHN1YnNlY3Rpb24gRm9ybWF0IHR5cGUgZGVwZW5kZW50IGZ1bmN0aW9ucwotCi1FdmVyeSB0YXJnZXQgdmVjdG9yIGhhcyB0aHJlZSBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlCi1pbmRleGVkIGJ5IHRoZSBCRkQgZm9ybWF0IHR5cGUuICBUaGUgQkZEIGZvcm1hdCB0eXBlcyBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfdW5rbm93bgotVW5rbm93biBmb3JtYXQuICBOb3QgdXNlZCBmb3IgYW55dGhpbmcgdXNlZnVsLgotQGl0ZW0gYmZkX29iamVjdAotT2JqZWN0IGZpbGUuCi1AaXRlbSBiZmRfYXJjaGl2ZQotQXJjaGl2ZSBmaWxlLgotQGl0ZW0gYmZkX2NvcmUKLUNvcmUgZmlsZS4KLUBlbmQgdGFibGUKLQotVGhlIHRocmVlIGFycmF5cyBvZiBmdW5jdGlvbiBwb2ludGVycyBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfY2hlY2tfZm9ybWF0Ci1DaGVjayB3aGV0aGVyIHRoZSBCRkQgaXMgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCAob2JqZWN0IGZpbGUsIGFyY2hpdmUKLWZpbGUsIG9yIGNvcmUgZmlsZSkgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhcmdldCB2ZWN0b3IuICBUaGlzIGlzIGNhbGxlZAotYnkgdGhlIEBzYW1we2JmZF9jaGVja19mb3JtYXR9IGZ1bmN0aW9uIHdoZW4gZXhhbWluaW5nIGFuIGV4aXN0aW5nIEJGRC4KLUlmIHRoZSBCRkQgbWF0Y2hlcyB0aGUgZGVzaXJlZCBmb3JtYXQsIHRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGFueQotZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIEBzYW1we3RkYXRhfSBmaWVsZCBvZiB0aGUgQkZELgotVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIEJGRCB0YXJnZXQgdmVjdG9yIGZ1bmN0aW9uCi1vbiBhIGZpbGUgb3BlbmVkIGZvciByZWFkaW5nLgotCi1AaXRlbSBiZmRfc2V0X2Zvcm1hdAotU2V0IHRoZSBmb3JtYXQgb2YgYSBCRkQgd2hpY2ggd2FzIGNyZWF0ZWQgZm9yIG91dHB1dC4gIFRoaXMgaXMgY2FsbGVkIGJ5Ci10aGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGZ1bmN0aW9uIGFmdGVyIGNyZWF0aW5nIHRoZSBCRkQgd2l0aCBhCi1mdW5jdGlvbiBzdWNoIGFzIEBzYW1we2JmZF9vcGVud30uICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSBmb3JtYXQKLXNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHdyaXRlIG91dCBhbiBvYmplY3QgZmlsZSBvciB3aGF0ZXZlciBvZgotdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQKLXRhcmdldCB2ZWN0b3IgZnVuY3Rpb24gb24gYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KLQotQGl0ZW0gYmZkX3dyaXRlX2NvbnRlbnRzCi1Xcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBCRkQgaW4gdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgaXMgY2FsbGVkCi1ieSBAc2FtcHtiZmRfY2xvc2V9IGZ1bmN0aW9uIGZvciBhIEJGRCBvcGVuZWQgZm9yIHdyaXRpbmcuICBUaGlzIHJlYWxseQotc2hvdWxkIG5vdCBiZSBhbiBhcnJheSBzZWxlY3RlZCBieSBmb3JtYXQgdHlwZSwgYXMgdGhlCi1Ac2FtcHtiZmRfc2V0X2Zvcm1hdH0gZnVuY3Rpb24gcHJvdmlkZXMgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbi4KLUluIGZhY3QsIEJGRCB3aWxsIGZhaWwgaWYgYSBkaWZmZXJlbnQgZm9ybWF0IGlzIHVzZWQgd2hlbiBjYWxsaW5nCi10aHJvdWdoIHRoZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kIHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9Ci1hcnJheXM7IGZvcnR1bmF0ZWx5LCBzaW5jZSBAc2FtcHtiZmRfY2xvc2V9IGdldHMgaXQgcmlnaHQsIHRoaXMgaXMgYQotZGlmZmljdWx0IGVycm9yIHRvIG1ha2UuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRF9KVU1QX1RBQkxFIG1hY3JvcwotQHN1YnNlY3Rpb24gQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvcwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRX0KLQotTW9zdCB0YXJnZXQgdmVjdG9ycyBhcmUgZGVmaW5lZCB1c2luZyBAc2FtcHtCRkRfSlVNUF9UQUJMRX0gbWFjcm9zLgotVGhlc2UgbWFjcm9zIHRha2UgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIGEgcHJlZml4IGFwcGxpZWQgdG8gYSBzZXQKLW9mIGZ1bmN0aW9ucy4gIFRoZSBtYWNyb3MgYXJlIHRoZW4gdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhlCi10YXJnZXQgdmVjdG9yLgotCi1Gb3IgZXhhbXBsZSwgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gZGVmaW5lcyB0aHJlZQotZnVuY3Rpb25zOiBAc2FtcHtfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kfSwgQHNhbXB7X2Nhbm9uaWNhbGl6ZV9yZWxvY30sCi1hbmQgQHNhbXB7X2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBBIHJlZmVyZW5jZSBsaWtlCi1Ac2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGZvbyl9IHdpbGwgZXhwYW5kIGludG8gdGhyZWUgZnVuY3Rpb25zCi1wcmVmaXhlZCB3aXRoIEBzYW1we2Zvb306IEBzYW1we2Zvb19nZXRfcmVsb2NfdXBwZXJfZm91bmR9LCBldGMuICBUaGUKLUBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gd2lsbCBiZSBwbGFjZWQgc3VjaCB0aGF0IHRob3NlIHRocmVlCi1mdW5jdGlvbnMgaW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBCRkQgdGFyZ2V0IHZlY3Rvci4KLQotVGhpcyBpcyBkb25lIGJlY2F1c2UgaXQgdHVybnMgb3V0IHRoYXQgbWFueSBkaWZmZXJlbnQgdGFyZ2V0IHZlY3RvcnMgY2FuCi1zaGFyZSBjZXJ0YWluIGNsYXNzZXMgb2YgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGFyY2hpdmVzIGFyZSBzaW1pbGFyCi1vbiBtb3N0IHBsYXRmb3Jtcywgc28gbW9zdCB0YXJnZXQgdmVjdG9ycyBjYW4gdXNlIHRoZSBzYW1lIGFyY2hpdmUKLWZ1bmN0aW9ucy4gIFRob3NlIHRhcmdldCB2ZWN0b3JzIGFsbCB1c2UgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQVJDSElWRX0KLXdpdGggdGhlIHNhbWUgYXJndW1lbnQsIGNhbGxpbmcgYSBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGlzIGRlZmluZWQgaW4KLUBmaWxle2FyY2hpdmUuY30uCi0KLUVhY2ggb2YgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNyb3MgaXMgbWVudGlvbmVkIGJlbG93IGFsb25nIHdpdGgKLXRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaXQgZGVmaW5lcy4gIFRoZSBmdW5jdGlvbgotcG9pbnRlcnMgd2lsbCBiZSBkZXNjcmliZWQgdXNpbmcgdGhlIG5hbWUgd2l0aG91dCB0aGUgcHJlZml4IHdoaWNoIHRoZQotQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvIGRlZmluZXMuICBUaGlzIG5hbWUgaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMKLXRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUuICBBbnkgZGlmZmVyZW5jZXMKLXdpbGwgYmUgbm90ZWQuCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGdlbmVyaWMKLUBzdWJzZWN0aW9uIEdlbmVyaWMgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0dFTkVSSUN9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9HRU5FUklDfSBtYWNybyBpcyB1c2VkIGZvciBzb21lIGNhdGNoIGFsbAotZnVuY3Rpb25zIHdoaWNoIGRvbid0IGVhc2lseSBmaXQgaW50byBvdGhlciBjYXRlZ29yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9jbG9zZV9hbmRfY2xlYW51cAotRnJlZSBhbnkgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZELiAgVGhpcyBpcwotY2FsbGVkIHdoZW4gYW55IEJGRCBpcyBjbG9zZWQgKHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9IGZ1bmN0aW9uCi1tZW50aW9uZWQgZWFybGllciBpcyBvbmx5IGNhbGxlZCBmb3IgYSBCRkQgb3BlbmVkIGZvciB3cml0aW5nKS4gIE1vc3QKLXRhcmdldHMgdXNlIEBzYW1we2JmZF9hbGxvY30gdG8gYWxsb2NhdGUgYWxsIHRhcmdldCBzcGVjaWZpYwotaW5mb3JtYXRpb24sIGFuZCB0aGVyZWZvcmUgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotVGhpcyBmdW5jdGlvbiBwb2ludGVyIGlzIHR5cGljYWxseSBzZXQgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cH0sIHdoaWNoIHNpbXBseSByZXR1cm5zIHRydWUuCi0KLUBpdGVtIF9iZmRfZnJlZV9jYWNoZWRfaW5mbwotRnJlZSBhbnkgY2FjaGVkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZEIHdoaWNoIGNhbiBiZQotcmVjcmVhdGVkIGxhdGVyIGlmIG5lY2Vzc2FyeS4gIFRoaXMgaXMgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeQotY29uc3VtcHRpb24gcmVxdWlyZWQgYnkgcHJvZ3JhbXMgdXNpbmcgQkZELiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgdmlhCi10aGUgQHNhbXB7YmZkX2ZyZWVfY2FjaGVkX2luZm99IG1hY3JvLiAgSXQgaXMgdXNlZCBieSB0aGUgZGVmYXVsdAotYXJjaGl2ZSByb3V0aW5lcyB3aGVuIGNvbXB1dGluZyB0aGUgYXJjaGl2ZSBtYXAuICBNb3N0IHRhcmdldHMgZG8gbm90Ci1kbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzIGVudHJ5IHBvaW50LCBhbmQganVzdCBzZXQgaXQgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19mcmVlX2NhY2hlZF9pbmZvfSwgd2hpY2ggc2ltcGx5IHJldHVybnMgdHJ1ZS4KLQotQGl0ZW0gX25ld19zZWN0aW9uX2hvb2sKLVRoaXMgaXMgY2FsbGVkIGZyb20gQHNhbXB7YmZkX21ha2Vfc2VjdGlvbl9hbnl3YXl9IHdoZW5ldmVyIGEgbmV3Ci1zZWN0aW9uIGlzIGNyZWF0ZWQuICBNb3N0IHRhcmdldHMgdXNlIGl0IHRvIGluaXRpYWxpemUgc2VjdGlvbiBzcGVjaWZpYwotaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdGlvbgotY29ycmVzcG9uZHMgdG8gYW4gYWN0dWFsIHNlY3Rpb24gaW4gYW4gYWN0dWFsIEJGRC4KLQotQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzCi1HZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLUBzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30uICBNb3N0IHRhcmdldHMgc2V0IHRoaXMgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoIGRvZXMgYSBAc2FtcHtiZmRfc2Vla30KLWJhc2VkIG9uIHRoZSBzZWN0aW9uJ3MgQHNhbXB7ZmlsZXBvc30gZmllbGQgYW5kIGEgQHNhbXB7YmZkX3JlYWR9LiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfS4KLQotQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotU2V0IGEgQHNhbXB7YmZkX3dpbmRvd30gdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcwotY2FsbGVkIGZyb20gQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30uICBUaGUKLUBzYW1we2JmZF93aW5kb3d9IGlkZWEgbmV2ZXIgcmVhbGx5IGNhdWdodCBvbiwgYW5kIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcwotZXZlciBjYWxsZWQuICBQcmV0dHkgbXVjaCBhbGwgdGFyZ2V0cyBpbXBsZW1lbnQgdGhpcyBhcwotQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fSwgd2hpY2ggdXNlcwotQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfSB0byBkbyB0aGUgcmlnaHQgdGhpbmcuICBUaGUKLWNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29weQotQHN1YnNlY3Rpb24gQ29weSBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfQ09QWX0KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUFl9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBhcmUKLWNhbGxlZCB3aGVuIGNvcHlpbmcgQkZEcywgYW5kIGZvciBhIGNvdXBsZSBvZiBmdW5jdGlvbnMgd2hpY2ggZGVhbCB3aXRoCi1pbnRlcm5hbCBCRkQgaW5mb3JtYXRpb24uCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLVRoaXMgaXMgY2FsbGVkIHdoZW4gY29weWluZyBhIEJGRCwgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGF9LgotSWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgQkZEcyBoYXZlIHRoZSBzYW1lIGZvcm1hdCwgdGhpcyB3aWxsIGNvcHkgYW55Ci1wcml2YXRlIGluZm9ybWF0aW9uIG92ZXIuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIHNlY3Rpb24gY29udGVudHMKLWhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS4gIE9ubHkgYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbgotdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi1UaGlzIGlzIGNhbGxlZCB3aGVuIGxpbmtpbmcsIHZpYSBAc2FtcHtiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YX0uICBJdAotZ2l2ZXMgdGhlIGJhY2tlbmQgbGlua2VyIGNvZGUgYSBjaGFuY2UgdG8gc2V0IGFueSBzcGVjaWFsIGZsYWdzIGluIHRoZQotb3V0cHV0IGZpbGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBmaWxlLiAgT25seSBhIGZldyB0YXJnZXRzCi1kbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLVRoaXMgaXMgc2ltaWxhciB0byBAc2FtcHtfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YX0sIGJ1dCBpdCBpcyBjYWxsZWQKLWZvciBlYWNoIHNlY3Rpb24sIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YX0uICBUaGlzCi1mdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGFueSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuLiAgT25seQotYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGF9LCBidXQgSSBkb24ndAotdGhpbmsgYW55dGhpbmcgYWN0dWFsbHkgY2FsbHMgaXQuICBJZiBpdCB3ZXJlIGRlZmluZWQsIGl0IGNvdWxkIGJlIHVzZWQKLXRvIGNvcHkgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gIEhvd2V2ZXIsIG1vc3QgQkZEcwotc3RvcmUgZXh0cmEgc3ltYm9sIGluZm9ybWF0aW9uIGJ5IGFsbG9jYXRpbmcgc3BhY2Ugd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLXRoZSBAc2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmUgYW5kIHN0b3JpbmcgcHJpdmF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUKLWV4dHJhIHNwYWNlLiAgU2luY2UgQHNhbXB7b2JqY29weX0gYW5kIG90aGVyIHByb2dyYW1zIGNvcHkgc3ltYm9sCi1pbmZvcm1hdGlvbiBieSBjb3B5aW5nIHBvaW50ZXJzIHRvIEBzYW1we2FzeW1ib2x9IHN0cnVjdHVyZXMsIHRoZQotcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBjb3BpZWQgYXMgd2VsbC4gIE1vc3QKLXRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLVRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc2V0X3ByaXZhdGVfZmxhZ3N9LiAgSXQgaXMgYmFzaWNhbGx5IGEgaG9vawotZm9yIHRoZSBhc3NlbWJsZXIgdG8gc2V0IG1hZ2ljIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBQb3dlclBDCi1FTEYgYXNzZW1ibGVyIHVzZXMgaXQgdG8gc2V0IGZsYWdzIHdoaWNoIGFwcGVhciBpbiB0aGUgZV9mbGFncyBmaWVsZCBvZgotdGhlIEVMRiBoZWFkZXIuICBNb3N0IHRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotVGhpcyBpcyBjYWxsZWQgYnkgQHNhbXB7b2JqZHVtcH0gd2hlbiB0aGUgQHNhbXB7LXB9IG9wdGlvbiBpcyB1c2VkLiAgSXQKLWlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3ByaW50X3ByaXZhdGVfZGF0YX0uICBJdCBwcmludHMgYW55IGludGVyZXN0aW5nCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgQkZEIHdoaWNoIGNhbiBub3QgYmUgb3RoZXJ3aXNlIHJlcHJlc2VudGVkIGJ5IEJGRAotYW5kIHRodXMgY2FuIG5vdCBiZSBwcmludGVkIGJ5IEBzYW1we29iamR1bXB9LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBkbwotYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29yZQotQHN1YnNlY3Rpb24gQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUkV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1JFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBjb3JlIGZpbGVzLiAgT2J2aW91c2x5LCB0aGVzZSBmdW5jdGlvbnMgb25seSBkbyBzb21ldGhpbmcKLWludGVyZXN0aW5nIGZvciB0YXJnZXRzIHdoaWNoIGhhdmUgY29yZSBmaWxlIHN1cHBvcnQuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLUdpdmVuIGEgY29yZSBmaWxlLCB0aGlzIHJldHVybnMgdGhlIGNvbW1hbmQgd2hpY2ggd2FzIHJ1biB0byBwcm9kdWNlIHRoZQotY29yZSBmaWxlLgotCi1AaXRlbSBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi1HaXZlbiBhIGNvcmUgZmlsZSwgdGhpcyByZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIHdoaWNoIHByb2R1Y2VkIHRoZQotY29yZSBmaWxlLgotCi1AaXRlbSBfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi1HaXZlbiBhIGNvcmUgZmlsZSBhbmQgYSBCRkQgZm9yIGFuIGV4ZWN1dGFibGUsIHRoaXMgcmV0dXJucyB3aGV0aGVyIHRoZQotY29yZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dGFibGUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmUKLUBzdWJzZWN0aW9uIEFyY2hpdmUgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBhcmNoaXZlIGZpbGVzLiAgTW9zdCB0YXJnZXRzIHVzZSBDT0ZGIHN0eWxlIGFyY2hpdmUgZmlsZXMKLShpbmNsdWRpbmcgRUxGIHRhcmdldHMpLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9jb2ZmfSBhcyB0aGUKLWFyZ3VtZW50IHRvIEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9LiAgU29tZSB0YXJnZXRzIHVzZSBCU0QvYS5vdXQKLXN0eWxlIGFyY2hpdmVzLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9ic2R9LiAgKFRoZSBtYWluCi1kaWZmZXJlbmNlIGJldHdlZW4gQlNEIGFuZCBDT0ZGIGFyY2hpdmVzIGlzIHRoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUKLXN5bWJvbCB0YWJsZSkuICBUYXJnZXRzIHdpdGggbm8gYXJjaGl2ZSBzdXBwb3J0IHVzZQotQHNhbXB7X2JmZF9ub2FyY2hpdmV9LiAgRmluYWxseSwgYSBmZXcgdGFyZ2V0cyBoYXZlIHVudXN1YWwgYXJjaGl2ZQotaGFuZGxpbmcuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NsdXJwX2FybWFwCi1SZWFkIGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSwgc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcwotaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIGFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3NsdXJwX2FybWFwfS4KLQotQGl0ZW0gX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLVJlYWQgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgZnJvbSB0aGUgYXJjaGl2ZSwgaWYgdGhlcmUgaXMgb25lLAotc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUKLWFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZX0uCi0KLUBpdGVtIGNvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi1CdWlsZCBhbmQgcmV0dXJuIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUgaWYgb25lIGlzIG5lZWRlZCB0byB3cml0ZSBvdXQKLXRoZSBhcmNoaXZlLiAgVGhpcyBhbHNvIGFkanVzdHMgdGhlIGFyY2hpdmUgaGVhZGVycyB0byByZWZlciB0byB0aGUKLWV4dGVuZGVkIG5hbWUgdGFibGUgYXBwcm9wcmlhdGVseS4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlCi1hcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGV9LgotCi1AaXRlbSBfdHJ1bmNhdGVfYXJuYW1lCi1UaGlzIGNvcGllcyBhIGZpbGUgbmFtZSBpbnRvIGFuIGFyY2hpdmUgaGVhZGVyLCB0cnVuY2F0aW5nIGl0IGFzCi1yZXF1aXJlZC4gIEl0IGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfQotcm91dGluZS4gIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBpbnRlcmVzdGluZyBpbiB0YXJnZXRzIHdoaWNoIGRvIG5vdAotc3VwcG9ydCBleHRlbmRlZCBuYW1lIHRhYmxlcywgYnV0IEkgdGhpbmsgdGhlIEdOVSBAc2FtcHthcn0gcHJvZ3JhbQotYWx3YXlzIHVzZXMgZXh0ZW5kZWQgbmFtZSB0YWJsZXMgYW55aG93LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdHJ1bmNhdGVfYXJuYW1lfS4KLQotQGl0ZW0gX3dyaXRlX2FybWFwCi1Xcml0ZSBvdXQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIHVzaW5nIGNhbGxzIHRvIEBzYW1we2JmZF93cml0ZX0uCi1UaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLgotVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7d3JpdGVfYXJtYXB9Ci0obm8gbGVhZGluZyB1bmRlcnNjb3JlKS4KLQotQGl0ZW0gX3JlYWRfYXJfaGRyCi1SZWFkIGFuZCBwYXJzZSBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaGFuZGxlcyBleHBhbmRpbmcgdGhlIGFyY2hpdmUKLWhlYWRlciBuYW1lIGludG8gdGhlIHJlYWwgZmlsZSBuYW1lIHVzaW5nIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgVGhpcwotaXMgY2FsbGVkIGJ5IHJvdXRpbmVzIHdoaWNoIHJlYWQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIG9yIHRoZSBhcmNoaXZlCi1pdHNlbGYuICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9yZWFkX2FyX2hkcl9mbn0uCi0KLUBpdGVtIF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLUdpdmVuIGFuIGFyY2hpdmUgYW5kIGEgQkZEIHJlcHJlc2VudGluZyBhIGZpbGUgc3RvcmVkIHdpdGhpbiB0aGUKLWFyY2hpdmUsIHJldHVybiBhIEJGRCBmb3IgdGhlIG5leHQgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZX0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7b3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlfSAobm8gbGVhZGluZwotdW5kZXJzY29yZSkuCi0KLUBpdGVtIF9nZXRfZWx0X2F0X2luZGV4Ci1HaXZlbiBhbiBhcmNoaXZlIGFuZCBhbiBpbmRleCwgcmV0dXJuIGEgQkZEIGZvciB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZQotY29ycmVzcG9uZGluZyB0byB0aGF0IGVudHJ5IGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX2dldF9lbHRfYXRfaW5kZXh9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2VsdF9hdF9pbmRleH0uCi0KLUBpdGVtIF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLURvIGEgc3RhdCBvbiBhbiBlbGVtZW50IG9mIGFuIGFyY2hpdmUsIHJldHVybmluZyBpbmZvcm1hdGlvbiByZWFkIGZyb20KLXRoZSBhcmNoaXZlIGhlYWRlciAobW9kaWZpY2F0aW9uIHRpbWUsIHVpZCwgZ2lkLCBmaWxlIG1vZGUsIHNpemUpLiAgVGhpcwotaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc3RhdF9hcmNoX2VsdH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zdGF0X2FyY2hfZWx0fS4KLQotQGl0ZW0gX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLUFmdGVyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBoYXZlIGJlZW4gd3JpdHRlbiBvdXQsIHVwZGF0ZQotdGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdG8gYmUgbmV3ZXIgdGhhbiB0aGF0IG9mIHRoZQotZmlsZS4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGEub3V0IHN0eWxlIGFyY2hpdmVzLiAgVGhpcyBpcyBub3JtYWxseQotY2FsbGVkIGJ5IHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcKLWZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCB0YWJsZSBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfU1lNQk9MU30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1NZTUJPTFN9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZWFsCi13aXRoIHN5bWJvbHMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLVJldHVybiBhIHNlbnNpYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIHdpbGwgYmUKLXJlcXVpcmVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cyByZXR1cm4gdGhlCi1hbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yIGFsbCB0aGUKLXN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbCBzeW1ib2wKLWluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfZ2V0X3N5bXRhYgotUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4KLQotQGl0ZW0gX21ha2VfZW1wdHlfc3ltYm9sCi1DcmVhdGUgYW4gZW1wdHkgc3ltYm9sIGZvciB0aGUgQkZELiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBtb3N0IHRhcmdldHMKLXN0b3JlIGV4dHJhIGluZm9ybWF0aW9uIHdpdGggZWFjaCBzeW1ib2wgYnkgYWxsb2NhdGluZyBhIHN0cnVjdHVyZQotbGFyZ2VyIHRoYW4gYW4gQHNhbXB7YXN5bWJvbH0gYW5kIHN0b3JpbmcgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGF0IHRoZQotZW5kLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSByaWdodCBhbW91bnQgb2YgbWVtb3J5LCBhbmQgcmV0dXJuCi13aGF0IGxvb2tzIGxpa2UgYSBwb2ludGVyIHRvIGFuIGVtcHR5IEBzYW1we2FzeW1ib2x9LiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfbWFrZV9lbXB0eV9zeW1ib2x9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfbWFrZV9lbXB0eV9zeW1ib2x9LgotCi1AaXRlbSBfcHJpbnRfc3ltYm9sCi1QcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfcHJpbnRfc3ltYm9sfS4gIE9uZSBvZiB0aGUgYXJndW1lbnRzIGluZGljYXRlcyB3aGF0IHNvcnQgb2YKLWluZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGJmZF9wcmludF9zeW1ib2xfbmFtZQotSnVzdCBwcmludCB0aGUgc3ltYm9sIG5hbWUuCi1AaXRlbSBiZmRfcHJpbnRfc3ltYm9sX21vcmUKLVByaW50IHRoZSBzeW1ib2wgbmFtZSBhbmQgc29tZSBpbnRlcmVzdGluZyBmbGFncy4gIEkgZG9uJ3QgdGhpbmsKLWFueXRoaW5nIGFjdHVhbGx5IHVzZXMgdGhpcy4KLUBpdGVtIGJmZF9wcmludF9zeW1ib2xfYWxsCi1QcmludCBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgdXNlZCBieSBAc2FtcHtvYmpkdW1wfQotd2hlbiBydW4gd2l0aCB0aGUgQHNhbXB7LXR9IG9wdGlvbi4KLUBlbmQgdGFibGUKLVRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3ByaW50X3N5bWJvbH0uCi0KLUBpdGVtIF9nZXRfc3ltYm9sX2luZm8KLVJldHVybiBhIHN0YW5kYXJkIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfc3ltYm9sX2luZm99LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X3N5bWJvbF9pbmZvfS4KLQotQGl0ZW0gX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi1SZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIHdvdWxkIG5vcm1hbGx5IHJlcHJlc2VudCB0aGUgbmFtZSBvZiBhCi1sb2NhbCBsYWJlbC4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfaXNfbG9jYWxfbGFiZWx9IGFuZAotQHNhbXB7YmZkX2lzX2xvY2FsX2xhYmVsX25hbWV9LiAgTG9jYWwgbGFiZWxzIGFyZSBub3JtYWxseSBkaXNjYXJkZWQgYnkKLXRoZSBhc3NlbWJsZXIuICBJbiB0aGUgbGlua2VyLCB0aGlzIGRlZmluZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLUBzYW1wey14fSBhbmQgQHNhbXB7LVh9IG9wdGlvbnMuCi0KLUBpdGVtIF9nZXRfbGluZW5vCi1SZXR1cm4gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwKLWZvciBhIENPRkYgdGFyZ2V0LiAgVGhpcyBpcyBjYWxsZWQgd2hlbiB3cml0aW5nIG91dCBDT0ZGIGxpbmUgbnVtYmVycy4KLQotQGl0ZW0gX2ZpbmRfbmVhcmVzdF9saW5lCi1HaXZlbiBhbiBhZGRyZXNzIHdpdGhpbiBhIHNlY3Rpb24sIHVzZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGZpbmQKLXRoZSBtYXRjaGluZyBmaWxlIG5hbWUsIGZ1bmN0aW9uIG5hbWUsIGFuZCBsaW5lIG51bWJlciwgaWYgYW55LiAgVGhpcyBpcwotY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluZF9uZWFyZXN0X2xpbmV9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZmluZF9uZWFyZXN0X2xpbmV9LgotCi1AaXRlbSBfYmZkX21ha2VfZGVidWdfc3ltYm9sCi1NYWtlIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBhIENPRkYgdGFyZ2V0LAotd2hlcmUgaXQgc2ltcGx5IHJldHVybnMgYSBzeW1ib2wgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW4gdGhlCi1Ac2FtcHtOX0RFQlVHfSBzZWN0aW9uIHdoZW4gaXQgaXMgd3JpdHRlbiBvdXQuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9tYWtlX2RlYnVnX3N5bWJvbH0uCi0KLUBpdGVtIF9yZWFkX21pbmlzeW1ib2xzCi1NaW5pc3ltYm9scyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgcHJvZ3JhbXMgbGlrZQotQHNhbXB7bm19LiAgQSBtaW5pc3ltYm9sIGlzIGEgY29va2llIHBvaW50aW5nIHRvIGludGVybmFsIHN5bWJvbAotaW5mb3JtYXRpb24gd2hpY2ggdGhlIGNhbGxlciBjYW4gdXNlIHRvIGV4dHJhY3QgY29tcGxldGUgc3ltYm9sCi1pbmZvcm1hdGlvbi4gIFRoaXMgcGVybWl0cyBCRkQgdG8gbm90IGNvbnZlcnQgYWxsIHRoZSBzeW1ib2xzIGludG8KLWdlbmVyaWMgZm9ybSwgYnV0IHRvIGluc3RlYWQgY29udmVydCB0aGVtIG9uZSBhdCBhIHRpbWUuICBUaGlzIGlzIGNhbGxlZAotdmlhIEBzYW1we2JmZF9yZWFkX21pbmlzeW1ib2xzfS4gIE1vc3QgdGFyZ2V0cyBkbyBub3QgaW1wbGVtZW50IHRoaXMsCi1hbmQganVzdCB1c2UgZ2VuZXJpYyBzdXBwb3J0IHdoaWNoIGlzIGJhc2VkIG9uIHVzaW5nIHN0YW5kYXJkCi1Ac2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmVzLgotCi1AaXRlbSBfbWluaXN5bWJvbF90b19zeW1ib2wKLUNvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgc3RhbmRhcmQgQHNhbXB7YXN5bWJvbH0uICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9taW5pc3ltYm9sX3RvX3N5bWJvbH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jcwotQHN1YnNlY3Rpb24gUmVsb2NhdGlvbiBzdXBwb3J0Ci1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggcmVsb2NhdGlvbnMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9yZWxvY191cHBlcl9ib3VuZAotUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQotcmVxdWlyZWQgdG8gcmVhZCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4gIEluIHByYWN0aWNlIG1vc3QKLXRhcmdldHMgcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXJlbGVudH0KLXBvaW50ZXJzIGZvciBhbGwgdGhlIHJlbG9jYXRpb25zIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kCi1zdG9yZSB0aGUgYWN0dWFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gQkZEIHByaXZhdGUgZGF0YS4gIFRoaXMgaXMKLWNhbGxlZCB2aWEgQHNhbXB7YmZkX2dldF9yZWxvY191cHBlcl9ib3VuZH0uCi0KLUBpdGVtIF9jYW5vbmljYWxpemVfcmVsb2MKLVJldHVybiB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX3JlbG9jfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvY30uCi0KLUBpdGVtIF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLUdpdmVuIGEgcmVsb2NhdGlvbiBjb2RlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgaG93dG8gc3RydWN0dXJlCi0oQHB4cmVme0JGRCByZWxvY2F0aW9uIGNvZGVzfSkuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciB3cml0ZQotQHN1YnNlY3Rpb24gT3V0cHV0IGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9XUklURX0KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1dSSVRFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCB3cml0aW5nIG91dCBhIEJGRC4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfc2V0X2FyY2hfbWFjaAotU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgbnVtYmVyIGZvciBhIEJGRC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3NldF9hcmNoX21hY2h9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCB0aGlzIGJ5IGNhbGxpbmcKLUBzYW1we2JmZF9kZWZhdWx0X3NldF9hcmNoX21hY2h9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2V0X2FyY2hfbWFjaH0uCi0KLUBpdGVtIF9zZXRfc2VjdGlvbl9jb250ZW50cwotV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGxpbmsKLUBzdWJzZWN0aW9uIExpbmtlciBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfTElOS30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0xJTkt9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlCi1saW5rZXIuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NpemVvZl9oZWFkZXJzCi1SZXR1cm4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgYSBCRkQuICBUaGlzIGlzCi11c2VkIHRvIGltcGxlbWVudCB0aGUgQHNhbXB7U0laRU9GX0hFQURFUlN9IGxpbmtlciBzY3JpcHQgZnVuY3Rpb24uICBJdAotaXMgbm9ybWFsbHkgdXNlZCB0byBhbGlnbiB0aGUgZmlyc3Qgc2VjdGlvbiBhdCBhbiBlZmZpY2llbnQgcG9zaXRpb24gb24KLXRoZSBwYWdlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9zaXplb2ZfaGVhZGVyc30uICBUaGUKLWNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfc2l6ZW9mX2hlYWRlcnN9LgotCi1AaXRlbSBfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGFuZCBhcHBseSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLVRoaXMgaGFuZGxlcyBib3RoIGEgZmluYWwgbGluayBhbmQgYSByZWxvY2F0ZWFibGUgbGluazsgaW4gdGhlIGxhdHRlcgotY2FzZSwgaXQgYWRqdXN0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFzIHdlbGwuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCBpdCBieQotY2FsbGluZyBAc2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LgotCi1AaXRlbSBfYmZkX3JlbGF4X3NlY3Rpb24KLVRyeSB0byB1c2UgcmVsYXhhdGlvbiB0byBzaHJpbmsgdGhlIHNpemUgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQKLWJ5IHRoZSBsaW5rZXIgd2hlbiB0aGUgQHNhbXB7LXJlbGF4fSBvcHRpb24gaXMgdXNlZC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3JlbGF4X3NlY3Rpb259LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0IGFueSBzb3J0IG9mCi1yZWxheGF0aW9uLgotCi1AaXRlbSBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLUNyZWF0ZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgdG8gdXNlIGZvciB0aGUgbGlua2VyLiAgVGhpcyBsaW5rZXIgaG9vawotcGVybWl0cyB0aGUgYmFja2VuZCB0byBjb250cm9sIHRoZSBzaXplIGFuZCBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudHMKLWluIHRoZSBsaW5rZXIgc3ltYm9sIGhhc2ggdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlfS4KLQotQGl0ZW0gX2JmZF9saW5rX2FkZF9zeW1ib2xzCi1HaXZlbiBhbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlLCBhZGQgYWxsIHN5bWJvbHMgaW50byB0aGUgbGlua2VyCi1zeW1ib2wgaGFzaCB0YWJsZS4gIFVzZSBjYWxsYmFja3MgdG8gdGhlIGxpbmtlciB0byBpbmNsdWRlIGFyY2hpdmUKLWVsZW1lbnRzIGluIHRoZSBsaW5rLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9saW5rX2FkZF9zeW1ib2xzfS4KLQotQGl0ZW0gX2JmZF9maW5hbF9saW5rCi1GaW5pc2ggdGhlIGxpbmtpbmcgcHJvY2Vzcy4gIFRoZSBsaW5rZXIgY2FsbHMgdGhpcyBob29rIGFmdGVyIGFsbCBvZiB0aGUKLWlucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLCB3aGVuIGl0IGlzIHJlYWR5IHRvIGZpbmlzaCB0aGUgbGluayBhbmQKLWdlbmVyYXRlIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluYWxfbGlua30uCi0KLUBpdGVtIF9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi1JIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIE5vdGhpbmcgc2VlbXMgdG8gY2FsbCBpdC4gIFRoZSBvbmx5Ci1ub24tdHJpdmlhbCBkZWZpbml0aW9uIGlzIGluIEBmaWxle3NvbS5jfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYwotQHN1YnNlY3Rpb24gRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9EWU5BTUlDfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfRFlOQU1JQ30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIHJlYWQKLWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cwotcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yCi1hbGwgdGhlIHN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbAotc3ltYm9sIGluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KLXRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kfS4KLQotQGl0ZW0gX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotUmVhZCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWJ9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFifS4KLQotQGl0ZW0gX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLiAgSW4gcHJhY3RpY2UgbW9zdCB0YXJnZXRzCi1yZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCBAc2FtcHthcmVsZW50fSBwb2ludGVycyBmb3IKLWFsbCB0aGUgcmVsb2NhdGlvbnMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlCi1hY3R1YWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KLXRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLVJlYWQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCBnZW5lcmF0ZWQgZmlsZXMKLUBzZWN0aW9uIEJGRCBnZW5lcmF0ZWQgZmlsZXMKLUBjaW5kZXggZ2VuZXJhdGVkIGZpbGVzIGluIGJmZAotQGNpbmRleCBiZmQgZ2VuZXJhdGVkIGZpbGVzCi0KLUJGRCBjb250YWlucyBzZXZlcmFsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzLiAgVGhpcyBzZWN0aW9uCi1kZXNjcmliZXMgdGhlbS4gIFNvbWUgZmlsZXMgYXJlIGNyZWF0ZWQgYXQgY29uZmlndXJlIHRpbWUsIHdoZW4geW91Ci1jb25maWd1cmUgQkZELiAgU29tZSBmaWxlcyBhcmUgY3JlYXRlZCBhdCBtYWtlIHRpbWUsIHdoZW4geW91IGJ1aWxkCi10aW1lLiAgU29tZSBmaWxlcyBhcmUgYXV0b21hdGljYWxseSByZWJ1aWx0IGF0IG1ha2UgdGltZSwgYnV0IG9ubHkgaWYKLXlvdSBjb25maWd1cmUgd2l0aCB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24uICBTb21lCi1maWxlcyBsaXZlIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LS0tdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHlvdSBydW4KLWNvbmZpZ3VyZS0tLWFuZCBzb21lIGxpdmUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBBbGwgZmlsZXMgdGhhdCBsaXZlCi1pbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgY2hlY2tlZCBpbnRvIHRoZSBDVlMgcmVwb3NpdG9yeS4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBiZmQuaAotQGNpbmRleCBAZmlsZXtiZmQuaH0KLUBjaW5kZXggQGZpbGV7YmZkLWluMy5ofQotTGl2ZXMgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnkuICBDcmVhdGVkIGF0IG1ha2UgdGltZSBmcm9tCi1AZmlsZXtiZmQtaW4yLmh9IHZpYSBAZmlsZXtiZmQtaW4zLmh9LiAgQGZpbGV7YmZkLWluMy5ofSBpcyBjcmVhdGVkIGF0Ci1jb25maWd1cmUgdGltZSBmcm9tIEBmaWxle2JmZC1pbjIuaH0uICBUaGVyZSBhcmUgYXV0b21hdGljIGRlcGVuZGVuY2llcwotdG8gcmVidWlsZCBAZmlsZXtiZmQtaW4zLmh9IGFuZCBoZW5jZSBAZmlsZXtiZmQuaH0gaWYgQGZpbGV7YmZkLWluMi5ofQotY2hhbmdlcywgc28geW91IGNhbiBub3JtYWxseSBpZ25vcmUgQGZpbGV7YmZkLWluMy5ofSwgYW5kIGp1c3QgdGhpbmsKLWFib3V0IEBmaWxle2JmZC1pbjIuaH0gYW5kIEBmaWxle2JmZC5ofS4KLQotQGZpbGV7YmZkLmh9IGlzIGJ1aWx0IGJ5IHJlcGxhY2luZyBhIGZldyBzdHJpbmdzIGluIEBmaWxle2JmZC1pbjIuaH0uCi1UbyBzZWUgdGhlbSwgc2VhcmNoIGZvciBAc2FtcHtAQH0gaW4gQGZpbGV7YmZkLWluMi5ofS4gIFRoZXkgbWFpbmx5Ci1jb250cm9sIHdoZXRoZXIgQkZEIGlzIGJ1aWx0IGZvciBhIDMyIGJpdCB0YXJnZXQgb3IgYSA2NCBiaXQgdGFyZ2V0LgotCi1AaXRlbSBiZmQtaW4yLmgKLUBjaW5kZXggQGZpbGV7YmZkLWluMi5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7YmZkLWluLmh9IGFuZCBzZXZlcmFsCi1vdGhlciBCRkQgc291cmNlIGZpbGVzLiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2JmZC1pbjIuaH0gaXMgcmVidWlsdAotYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KLQotQGl0ZW0gZWxmMzItdGFyZ2V0LmgKLUBpdGVteCBlbGY2NC10YXJnZXQuaAotQGNpbmRleCBAZmlsZXtlbGYzMi10YXJnZXQuaH0KLUBjaW5kZXggQGZpbGV7ZWxmNjQtdGFyZ2V0Lmh9Ci1MaXZlIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2VsZnh4LXRhcmdldC5ofS4KLVRoZXNlIGZpbGVzIGFyZSB2ZXJzaW9ucyBvZiBAZmlsZXtlbGZ4eC10YXJnZXQuaH0gY3VzdG9taXplZCBmb3IgZWl0aGVyCi1hIDMyIGJpdCBFTEYgdGFyZ2V0IG9yIGEgNjQgYml0IEVMRiB0YXJnZXQuCi0KLUBpdGVtIGxpYmJmZC5oCi1AY2luZGV4IEBmaWxle2xpYmJmZC5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7bGliYmZkLWluLmh9IGFuZAotc2V2ZXJhbCBvdGhlciBCRkQgc291cmNlIGZpbGVzLiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2xpYmJmZC5ofSBpcyByZWJ1aWx0Ci1hdXRvbWF0aWNhbGx5IHdoZW4gYSBzb3VyY2UgZmlsZSBjaGFuZ2VzLgotCi1AaXRlbSBsaWJjb2ZmLmgKLUBjaW5kZXggQGZpbGV7bGliY29mZi5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7bGliY29mZi1pbi5ofSBhbmQKLUBmaWxle2NvZmZjb2RlLmh9LiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2xpYmNvZmYuaH0gaXMgcmVidWlsdAotYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KLQotQGl0ZW0gdGFyZ21hdGNoLmgKLUBjaW5kZXggQGZpbGV7dGFyZ21hdGNoLmh9Ci1MaXZlcyBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS4gIENyZWF0ZWQgYXQgbWFrZSB0aW1lIGZyb20KLUBmaWxle2NvbmZpZy5iZmR9LiAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gbWFwIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgaW50bwotQkZEIHRhcmdldCB2ZWN0b3IgdmFyaWFibGUgbmFtZXMgYXQgcnVuIHRpbWUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCBtdWx0aXBsZSBjb21waWxhdGlvbnMKLUBzZWN0aW9uIEZpbGVzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGluIEJGRAotU2V2ZXJhbCBmaWxlcyBpbiBCRkQgYXJlIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLiAgQnkgdGhpcyBJIG1lYW4gdGhhdAotdGhlcmUgYXJlIGhlYWRlciBmaWxlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgVGhlc2UgaGVhZGVyCi1maWxlcyBhcmUgaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMsIGFuZCB0aHVzIHRoZSBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkCi1vbmNlIHBlciBmaWxlIHdoaWNoIGluY2x1ZGVzIHRoZW0uCi0KLVByZXByb2Nlc3NvciBtYWNyb3MgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgY29tcGlsYXRpb24sIHNvIHRoYXQgZWFjaAotdGltZSB0aGUgZmlsZXMgYXJlIGNvbXBpbGVkIHRoZSByZXN1bHRpbmcgZnVuY3Rpb25zIGFyZSBzbGlnaHRseQotZGlmZmVyZW50LiAgTmF0dXJhbGx5LCBpZiB0aGV5IHdlcmVuJ3QgZGlmZmVyZW50LCB0aGVyZSB3b3VsZCBiZSBubwotcmVhc29uIHRvIGNvbXBpbGUgdGhlbSBtdWx0aXBsZSB0aW1lcy4KLQotVGhpcyBpcyBhIG5vdCBhIHBhcnRpY3VsYXJseSBnb29kIHByb2dyYW1taW5nIHRlY2huaXF1ZSwgYW5kIGZ1dHVyZSBCRkQKLXdvcmsgc2hvdWxkIGF2b2lkIGl0LgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotU2luY2UgdGhpcyB0ZWNobmlxdWUgaXMgcmFyZWx5IHVzZWQsIGV2ZW4gZXhwZXJpZW5jZWQgQyBwcm9ncmFtbWVycyBmaW5kCi1pdCBjb25mdXNpbmcuCi0KLUBpdGVtCi1JdCBpcyBkaWZmaWN1bHQgdG8gZGVidWcgcHJvZ3JhbXMgd2hpY2ggdXNlIEJGRCwgc2luY2UgdGhlcmUgaXMgbm8gd2F5Ci10byBkZXNjcmliZSB3aGljaCB2ZXJzaW9uIG9mIGEgcGFydGljdWxhciBmdW5jdGlvbiB5b3UgYXJlIGxvb2tpbmcgYXQuCi0KLUBpdGVtCi1Qcm9ncmFtcyB3aGljaCB1c2UgQkZEIHdpbmQgdXAgaW5jb3Jwb3JhdGluZyB0d28gb3IgbW9yZSBzbGlnaHRseQotZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLCB3aGljaCB3YXN0ZXMgc3BhY2UgaW4gdGhlCi1leGVjdXRhYmxlLgotCi1AaXRlbQotVGhpcyB0ZWNobmlxdWUgaXMgbmV2ZXIgcmVxdWlyZWQgbm9yIGlzIGl0IGVzcGVjaWFsbHkgZWZmaWNpZW50LiAgSXQgaXMKLWFsd2F5cyBwb3NzaWJsZSB0byB1c2Ugc3RhdGljYWxseSBpbml0aWFsaXplZCBzdHJ1Y3R1cmVzIGhvbGRpbmcKLWZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBtYWdpYyBjb25zdGFudHMgaW5zdGVhZC4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGFvdXQtdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7YW91dC10YXJnZXQuaH0KLURlc2NyaWJlcyBhIGZldyBmdW5jdGlvbnMgYW5kIHRoZSB0YXJnZXQgdmVjdG9yIGZvciBhLm91dCB0YXJnZXRzLiAgVGhpcwotaXMgdXNlZCBieSBpbmRpdmlkdWFsIGEub3V0IHRhcmdldHMgd2l0aCBkaWZmZXJlbnQgZGVmaW5pdGlvbnMgb2YKLUBzYW1we05fVFhUQUREUn0gYW5kIHNpbWlsYXIgYS5vdXQgbWFjcm9zLgotCi1AaXRlbSBhb3V0ZjEuaAotQGNpbmRleCBAZmlsZXthb3V0ZjEuaH0KLUltcGxlbWVudHMgc3RhbmRhcmQgU3VuT1MgYS5vdXQgZmlsZXMuICBJbiBwcmluY2lwbGUgaXQgc3VwcG9ydHMgNjQgYml0Ci1hLm91dCB0YXJnZXRzIGJhc2VkIG9uIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gQHNhbXB7QVJDSF9TSVpFfSwgYnV0Ci1zaW5jZSBhbGwga25vd24gYS5vdXQgdGFyZ2V0cyBhcmUgMzIgYml0cywgdGhpcyBjb2RlIG1heSBvciBtYXkgbm90Ci13b3JrLiAgVGhpcyBmaWxlIGlzIG9ubHkgaW5jbHVkZWQgYnkgYSBmZXcgb3RoZXIgZmlsZXMsIGFuZCBpdCBpcwotZGlmZmljdWx0IHRvIGp1c3RpZnkgaXRzIGV4aXN0ZW5jZS4KLQotQGl0ZW0gYW91dHguaAotQGNpbmRleCBAZmlsZXthb3V0eC5ofQotSW1wbGVtZW50cyBiYXNpYyBhLm91dCBzdXBwb3J0IHJvdXRpbmVzLiAgVGhpcyBmaWxlIGNhbiBiZSBjb21waWxlZCBmb3IKLWVpdGhlciAzMiBvciA2NCBiaXQgc3VwcG9ydC4gIFNpbmNlIGFsbCBrbm93biBhLm91dCB0YXJnZXRzIGFyZSAzMiBiaXRzLAotdGhlIDY0IGJpdCBzdXBwb3J0IG1heSBvciBtYXkgbm90IHdvcmsuICBJIGJlbGlldmUgdGhlIG9yaWdpbmFsCi1pbnRlbnRpb24gd2FzIHRoYXQgdGhpcyBmaWxlIHdvdWxkIG9ubHkgYmUgaW5jbHVkZWQgYnkgQHNhbXB7YW91dDMyLmN9Ci1hbmQgQHNhbXB7YW91dDY0LmN9LCBhbmQgdGhhdCBvdGhlciBhLm91dCB0YXJnZXRzIHdvdWxkIHNpbXBseSByZWZlciB0bwotdGhlIGZ1bmN0aW9ucyBpdCBkZWZpbmVkLiAgVW5mb3J0dW5hdGVseSwgc29tZSBvdGhlciBhLm91dCB0YXJnZXRzCi1zdGFydGVkIGluY2x1ZGluZyBpdCBkaXJlY3RseSwgbGVhZGluZyB0byBhIHNvbWV3aGF0IGNvbmZ1c2VkIHN0YXRlIG9mCi1hZmZhaXJzLgotCi1AaXRlbSBjb2ZmY29kZS5oCi1AY2luZGV4IEBmaWxle2NvZmZjb2RlLmh9Ci1JbXBsZW1lbnRzIGJhc2ljIENPRkYgc3VwcG9ydCByb3V0aW5lcy4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBldmVyeQotQ09GRiB0YXJnZXQuICBJdCBpbXBsZW1lbnRzIGNvZGUgd2hpY2ggaGFuZGxlcyBDT0ZGIG1hZ2ljIG51bWJlcnMgYXMKLXdlbGwgYXMgdmFyaW91cyBob29rIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIGdlbmVyaWMgQ09GRiBmdW5jdGlvbnMgaW4KLUBmaWxle2NvZmZnZW4uY30uICBUaGlzIGZpbGUgaXMgY29udHJvbGxlZCBieSBhIG51bWJlciBvZiBkaWZmZXJlbnQKLW1hY3JvcywgYW5kIG1vcmUgYXJlIGFkZGVkIHJlZ3VsYXJseS4KLQotQGl0ZW0gY29mZnN3YXAuaAotQGNpbmRleCBAZmlsZXtjb2Zmc3dhcC5ofQotSW1wbGVtZW50cyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5Ci1AZmlsZXtjb2ZmY29kZS5ofSwgYW5kIHRodXMgYnkgZXZlcnkgQ09GRiB0YXJnZXQuICBJdCBpbXBsZW1lbnRzIHRoZQotcm91dGluZXMgd2hpY2ggc3dhcCBDT0ZGIHN0cnVjdHVyZXMgYmV0d2VlbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwKLWZvcm1hdC4gIFRoZSBtYWluIGNvbnRyb2wgZm9yIHRoaXMgZmlsZSBpcyB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlCi1kZWZpbml0aW9ucyBpbiB0aGUgZmlsZXMgaW4gdGhlIEBmaWxle2luY2x1ZGUvY29mZn0gZGlyZWN0b3J5LiAgQSBDT0ZGCi10YXJnZXQgZmlsZSB3aWxsIGluY2x1ZGUgb25lIG9mIHRob3NlIGZpbGVzIGJlZm9yZSBpbmNsdWRpbmcKLUBmaWxle2NvZmZjb2RlLmh9IGFuZCB0aHVzIEBmaWxle2NvZmZzd2FwLmh9LiAgVGhlcmUgYXJlIGEgZmV3IG90aGVyCi1tYWNyb3Mgd2hpY2ggYWZmZWN0IEBmaWxle2NvZmZzd2FwLmh9IGFzIHdlbGwsIG1vc3RseSBkZXNjcmliaW5nIHdoZXRoZXIKLWNlcnRhaW4gZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmVzLgotCi1AaXRlbSBlY29mZnN3YXAuaAotQGNpbmRleCBAZmlsZXtlY29mZnN3YXAuaH0KLUltcGxlbWVudHMgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGlzIGlzIGxpa2UgQGZpbGV7Y29mZnN3YXAuaH0sIGJ1dAotZm9yIEVDT0ZGLiAgSXQgaXMgaW5jbHVkZWQgYnkgdGhlIEVDT0ZGIHRhcmdldCBmaWxlcyAob2Ygd2hpY2ggdGhlcmUgYXJlCi1vbmx5IHR3bykuICBUaGUgY29udHJvbCBpcyB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIEBzYW1we0VDT0ZGXzMyfSBvcgotQHNhbXB7RUNPRkZfNjR9LgotCi1AaXRlbSBlbGZjb2RlLmgKLUBjaW5kZXggQGZpbGV7ZWxmY29kZS5ofQotSW1wbGVtZW50cyBFTEYgZnVuY3Rpb25zIHRoYXQgdXNlIGV4dGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gIFRoaXMKLWZpbGUgaXMgaW5jbHVkZWQgYnkgdHdvIG90aGVyIGZpbGVzOiBAZmlsZXtlbGYzMi5jfSBhbmQgQGZpbGV7ZWxmNjQuY30uCi1JdCBpcyBjb250cm9sbGVkIGJ5IHRoZSBAc2FtcHtBUkNIX1NJWkV9IG1hY3JvIHdoaWNoIGlzIGRlZmluZWQgdG8gYmUKLUBzYW1wezMyfSBvciBAc2FtcHs2NH0gYmVmb3JlIGluY2x1ZGluZyBpdC4gIFRoZSBAc2FtcHtOQU1FfSBtYWNybyBpcwotdXNlZCBpbnRlcm5hbGx5IHRvIGdpdmUgdGhlIGZ1bmN0aW9ucyBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSB0d28gdGFyZ2V0Ci1zaXplcy4KLQotQGl0ZW0gZWxmY29yZS5oCi1AY2luZGV4IEBmaWxle2VsZmNvcmUuaH0KLUxpa2UgQGZpbGV7ZWxmY29kZS5ofSwgYnV0IGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gRUxGIGNvcmUKLWZpbGVzLiAgVGhpcyBpcyBpbmNsdWRlZCBvbmx5IGJ5IEBmaWxle2VsZmNvZGUuaH0uCi0KLUBpdGVtIGVsZmxpbmsuaAotQGNpbmRleCBAZmlsZXtlbGZsaW5rLmh9Ci1MaWtlIEBmaWxle2VsZmNvZGUuaH0sIGJ1dCBmb3IgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEVMRiBsaW5rZXIuICBUaGlzCi1pcyBpbmNsdWRlZCBvbmx5IGJ5IEBmaWxle2VsZmNvZGUuaH0uCi0KLUBpdGVtIGVsZnh4LXRhcmdldC5oCi1AY2luZGV4IEBmaWxle2VsZnh4LXRhcmdldC5ofQotVGhpcyBmaWxlIGlzIHRoZSBzb3VyY2UgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZXMgQGZpbGV7ZWxmMzItdGFyZ2V0Lmh9Ci1hbmQgQGZpbGV7ZWxmNjQtdGFyZ2V0Lmh9LCBvbmUgb2Ygd2hpY2ggaXMgaW5jbHVkZWQgYnkgZXZlcnkgRUxGIHRhcmdldC4KLUl0IGRlZmluZXMgdGhlIEVMRiB0YXJnZXQgdmVjdG9yLgotCi1AaXRlbSBmcmVlYnNkLmgKLUBjaW5kZXggQGZpbGV7ZnJlZWJzZC5ofQotUHJlc3VtYWJseSBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBhbGwgRnJlZUJTRCB0YXJnZXRzLCBidXQgaW4gZmFjdAotdGhlcmUgaXMgb25seSBvbmUgc3VjaCB0YXJnZXQsIEBzYW1we2kzODYtZnJlZWJzZH0uICBUaGlzIGRlZmluZXMgYQotZnVuY3Rpb24gdXNlZCB0byBzZXQgdGhlIHJpZ2h0IG1hZ2ljIG51bWJlciBmb3IgRnJlZUJTRCwgYXMgd2VsbCBhcwotdmFyaW91cyBtYWNyb3MsIGFuZCBpbmNsdWRlcyBAZmlsZXthb3V0LXRhcmdldC5ofS4KLQotQGl0ZW0gbmV0YnNkLmgKLUBjaW5kZXggQGZpbGV7bmV0YnNkLmh9Ci1MaWtlIEBmaWxle2ZyZWVic2QuaH0sIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsIGZpbGVzIHdoaWNoIGluY2x1ZGUKLWl0LgotCi1AaXRlbSBubG0tdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7bmxtLXRhcmdldC5ofQotRGVmaW5lcyB0aGUgdGFyZ2V0IHZlY3RvciBmb3IgYSBzdGFuZGFyZCBOTE0gdGFyZ2V0LgotCi1AaXRlbSBubG1jb2RlLmgKLUBjaW5kZXggQGZpbGV7bmxtY29kZS5ofQotTGlrZSBAZmlsZXtlbGZjb2RlLmh9LCBidXQgZm9yIE5MTSB0YXJnZXRzLiAgVGhpcyBpcyBvbmx5IGluY2x1ZGVkIGJ5Ci1AZmlsZXtubG0zMi5jfSBhbmQgQGZpbGV7bmxtNjQuY30sIGJvdGggb2Ygd2hpY2ggZGVmaW5lIHRoZSBtYWNybwotQHNhbXB7QVJDSF9TSVpFfSB0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gIFRoZXJlIGFyZSBubyA2NCBiaXQgTkxNCi10YXJnZXRzIGFueWhvdywgc28gdGhpcyBpcyBzb3J0IG9mIHVzZWxlc3MuCi0KLUBpdGVtIG5sbXN3YXAuaAotQGNpbmRleCBAZmlsZXtubG1zd2FwLmh9Ci1MaWtlIEBmaWxle2NvZmZzd2FwLmh9LCBidXQgZm9yIE5MTSB0YXJnZXRzLiAgVGhpcyBpcyBpbmNsdWRlZCBieSBlYWNoCi1OTE0gdGFyZ2V0LCBidXQgSSB0aGluayBpdCB3aW5kcyB1cCBjb21waWxpbmcgdG8gdGhlIGV4YWN0IHNhbWUgY29kZSBmb3IKLWV2ZXJ5IHRhcmdldCwgYW5kIGFzIHN1Y2ggaXMgZmFpcmx5IHVzZWxlc3MuCi0KLUBpdGVtIHBlaWNvZGUuaAotQGNpbmRleCBAZmlsZXtwZWljb2RlLmh9Ci1Qcm92aWRlcyBzd2FwcGluZyByb3V0aW5lcyBhbmQgb3RoZXIgaG9va3MgZm9yIFBFIHRhcmdldHMuCi1AZmlsZXtjb2ZmY29kZS5ofSB3aWxsIGluY2x1ZGUgdGhpcyByYXRoZXIgdGhhbiBAZmlsZXtjb2Zmc3dhcC5ofSBmb3IgYQotUEUgdGFyZ2V0LiAgVGhpcyBkZWZpbmVzIFBFIHNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBDT0ZGIHN3YXBwaW5nCi1yb3V0aW5lcywgYW5kIGFsc28gZGVmaW5lcyBzb21lIG1hY3JvcyB3aGljaCBjb250cm9sIEBmaWxle2NvZmZjb2RlLmh9Ci1pdHNlbGYuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nCi1Ac2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBoYW5kbGluZwotQGNpbmRleCBiZmQgcmVsb2NhdGlvbiBoYW5kbGluZwotQGNpbmRleCByZWxvY2F0aW9ucyBpbiBiZmQKLQotVGhlIGhhbmRsaW5nIG9mIHJlbG9jYXRpb25zIGlzIG9uZSBvZiB0aGUgbW9yZSBjb25mdXNpbmcgYXNwZWN0cyBvZiBCRkQuCi1SZWxvY2F0aW9uIGhhbmRsaW5nIGhhcyBiZWVuIGltcGxlbWVudGVkIGluIHZhcmlvdXMgZGlmZmVyZW50IHdheXMsIGFsbAotc29tZXdoYXQgaW5jb21wYXRpYmxlLCBub25lIHBlcmZlY3QuCi0KLUBtZW51Ci0qIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzOjoJQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKLSogQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zOjoJQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCi0qIEJGRCByZWxvY2F0aW9uIGNvZGVzOjoJQkZEIHJlbG9jYXRpb24gY29kZXMKLSogQkZEIHJlbG9jYXRpb24gZnV0dXJlOjoJQkZEIHJlbG9jYXRpb24gZnV0dXJlCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKLUBzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzCi0KLUEgcmVsb2NhdGlvbiBpcyBhbiBhY3Rpb24gd2hpY2ggdGhlIGxpbmtlciBtdXN0IHRha2Ugd2hlbiBsaW5raW5nLiAgSXQKLWRlc2NyaWJlcyBhIGNoYW5nZSB0byB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhlIGNoYW5nZSBpcyBub3JtYWxseQotYmFzZWQgb24gdGhlIGZpbmFsIHZhbHVlIG9mIG9uZSBvciBtb3JlIHN5bWJvbHMuICBSZWxvY2F0aW9ucyBhcmUKLWNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGNyZWF0ZXMgYW4gb2JqZWN0IGZpbGUuCi0KLU1vc3QgcmVsb2NhdGlvbnMgYXJlIHNpbXBsZS4gIEEgdHlwaWNhbCBzaW1wbGUgcmVsb2NhdGlvbiBpcyB0byBzZXQgMzIKLWJpdHMgYXQgYSBnaXZlbiBvZmZzZXQgaW4gYSBzZWN0aW9uIHRvIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gIFRoaXMgdHlwZQotb2YgcmVsb2NhdGlvbiB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIGNvZGUgbGlrZSBAY29kZXtpbnQgKnAgPSAmaTt9IHdoZXJlCi1Ac2FtcHtwfSBhbmQgQHNhbXB7aX0gYXJlIGdsb2JhbCB2YXJpYWJsZXMuICBBIHJlbG9jYXRpb24gZm9yIHRoZSBzeW1ib2wKLUBzYW1we2l9IHdvdWxkIGJlIGdlbmVyYXRlZCBzdWNoIHRoYXQgdGhlIGxpbmtlciB3b3VsZCBpbml0aWFsaXplIHRoZQotYXJlYSBvZiBtZW1vcnkgd2hpY2ggaG9sZHMgdGhlIHZhbHVlIG9mIEBzYW1we3B9IHRvIHRoZSB2YWx1ZSBvZiB0aGUKLXN5bWJvbCBAc2FtcHtpfS4KLQotU2xpZ2h0bHkgbW9yZSBjb21wbGV4IHJlbG9jYXRpb25zIG1heSBpbmNsdWRlIGFuIGFkZGVuZCwgd2hpY2ggaXMgYQotY29uc3RhbnQgdG8gYWRkIHRvIHRoZSBzeW1ib2wgdmFsdWUgYmVmb3JlIHVzaW5nIGl0LiAgSW4gc29tZSBjYXNlcyBhCi1yZWxvY2F0aW9uIHdpbGwgcmVxdWlyZSBhZGRpbmcgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUgZXhpc3RpbmcgY29udGVudHMKLW9mIHRoZSBzZWN0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4gIEluIG90aGVycyB0aGUgcmVsb2NhdGlvbiB3aWxsIHNpbXBseQotcmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgc3ltYm9sIHZhbHVlLiAgU29tZQotcmVsb2NhdGlvbnMgYXJlIFBDIHJlbGF0aXZlLCBzbyB0aGF0IHRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1zZWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGFuZCB0aGUgZmluYWwKLWFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGVudHMuCi0KLUluIGdlbmVyYWwsIHJlbG9jYXRpb25zIGNhbiBiZSBhcmJpdHJhcmlseSBjb21wbGV4LiAgRm9yIGV4YW1wbGUsCi1yZWxvY2F0aW9ucyB1c2VkIGluIGR5bmFtaWMgbGlua2luZyBzeXN0ZW1zIG9mdGVuIHJlcXVpcmUgdGhlIGxpbmtlciB0bwotYWxsb2NhdGUgc3BhY2UgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiBhbmQgdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoYXQKLXNlY3Rpb24gYXMgdGhlIHZhbHVlIHRvIHN0b3JlLiAgSW4gdGhlIElFRUUgb2JqZWN0IGZpbGUgZm9ybWF0LAotcmVsb2NhdGlvbnMgbWF5IGludm9sdmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zLgotCi1XaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZSBsaW5rZXIgbWF5IG9yIG1heSBub3QgaGF2ZSB0byBkbwotYW55dGhpbmcgd2l0aCBhIHJlbG9jYXRpb24sIGRlcGVuZGluZyB1cG9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotcmVsb2NhdGlvbi4gIFNpbXBsZSByZWxvY2F0aW9ucyBnZW5lcmFsbHkgZG8gbm90IHJlcXVpcmUgYW55IHNwZWNpYWwKLWFjdGlvbi4KLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCi1Ac3Vic2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBmdW5jdGlvbnMKLQotSW4gQkZELCBlYWNoIHNlY3Rpb24gaGFzIGFuIGFycmF5IG9mIEBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZXMuICBFYWNoCi1zdHJ1Y3R1cmUgaGFzIGEgcG9pbnRlciB0byBhIHN5bWJvbCwgYW4gYWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24sIGFuCi1hZGRlbmQsIGFuZCBhIHBvaW50ZXIgdG8gYSBAc2FtcHtyZWxvY19ob3d0b19zdHJ1Y3R9IHN0cnVjdHVyZS4gIFRoZQotaG93dG8gc3RydWN0dXJlIGhhcyBhIGJ1bmNoIG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSByZWxvYywgaW5jbHVkaW5nIGEKLXR5cGUgZmllbGQuICBUaGUgdHlwZSBmaWVsZCBpcyBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci1iYWNrZW5kOyBub25lIG9mIHRoZSBnZW5lcmljIGNvZGUgaW4gQkZEIGV4YW1pbmVzIGl0LgotCi1PcmlnaW5hbGx5LCB0aGUgZnVuY3Rpb24gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gd2FzIHN1cHBvc2VkIHRvCi1oYW5kbGUgYWxsIHJlbG9jYXRpb25zLiAgSW4gdGhlb3J5LCBtYW55IHJlbG9jYXRpb25zIHdvdWxkIGJlIHNpbXBsZQotZW5vdWdoIHRvIGJlIGRlc2NyaWJlZCBieSB0aGUgZmllbGRzIGluIHRoZSBob3d0byBzdHJ1Y3R1cmUuICBGb3IgdGhvc2UKLXRoYXQgd2VyZW4ndCwgdGhlIGhvd3RvIHN0cnVjdHVyZSBpbmNsdWRlZCBhIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259Ci1maWVsZCB0byB1c2UgYXMgYW4gZXNjYXBlLgotCi1XaGlsZSB0aGlzIHNlZW1zIHBsYXVzaWJsZSwgYSBsb29rIGF0IEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259Ci1zaG93cyB0aGF0IGl0IGZhaWxlZC4gIFRoZSBmdW5jdGlvbiBoYXMgb2RkIHNwZWNpYWwgY2FzZXMuICBTb21lIG9mIHRoZQotZmllbGRzIGluIHRoZSBob3d0byBzdHJ1Y3R1cmUsIHN1Y2ggYXMgQHNhbXB7cGNyZWxfb2Zmc2V0fSwgd2VyZSBub3QKLWFkZXF1YXRlbHkgZG9jdW1lbnRlZC4KLQotVGhlIGxpbmtlciB1c2VzIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHRvIGRvIGFsbCByZWxvY2F0aW9ucyB3aGVuCi10aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlIGhhdmUgZGlmZmVyZW50IGZvcm1hdHMgKGUuZy4sIHdoZW4gZ2VuZXJhdGluZwotUy1yZWNvcmRzKS4gIFRoZSBnZW5lcmljIGxpbmtlciBjb2RlLCB3aGljaCBpcyB1c2VkIGJ5IGFsbCB0YXJnZXRzIHdoaWNoCi1kbyBub3QgZGVmaW5lIHRoZWlyIG93biBzcGVjaWFsIHB1cnBvc2UgbGlua2VyLCB1c2VzCi1Ac2FtcHtiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSwgd2hpY2ggZm9yIG1vc3QgdGFyZ2V0cyB0dXJucwotaW50byBhIGNhbGwgdG8gQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSwgd2hpY2gKLWNhbGxzIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LiAgU28gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0KLWlzIHN0aWxsIHdpZGVseSB1c2VkLCB3aGljaCBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gY2hhbmdlLCBzaW5jZSBpdCBpcwotZGlmZmljdWx0IHRvIHRlc3QgYWxsIHBvc3NpYmxlIGNhc2VzLgotCi1UaGUgYXNzZW1ibGVyIHVzZWQgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gZm9yIGEgd2hpbGUuICBUaGlzCi10dXJuZWQgb3V0IHRvIGJlIHRoZSB3cm9uZyB0aGluZyB0byBkbywgc2luY2UKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHdhcyB3cml0dGVuIHRvIGhhbmRsZSByZWxvY2F0aW9ucyBvbiBhbgotZXhpc3Rpbmcgb2JqZWN0IGZpbGUsIHdoaWxlIHRoZSBhc3NlbWJsZXIgbmVlZGVkIHRvIGNyZWF0ZSByZWxvY2F0aW9ucwotaW4gYSBuZXcgb2JqZWN0IGZpbGUuICBUaGUgYXNzZW1ibGVyIHdhcyBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IGZ1bmN0aW9uCi1Ac2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSBpbnN0ZWFkLCBhbmQgQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0KLXdhcyBjcmVhdGVkIGFzIGEgY29weSBvZiBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufS4KLQotVW5mb3J0dW5hdGVseSwgdGhlIHdvcmsgZGlkIG5vdCBwcm9ncmVzcyBhbnkgZmFydGhlciwgc28KLUBzYW1we2JmZF9pbnN0YWxsX3JlbG9jYXRpb259IHJlbWFpbnMgYSBzaW1wbGUgY29weSBvZgotQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0sIHdpdGggYWxsIHRoZSBvZGQgc3BlY2lhbCBjYXNlcyBhbmQKLWNvbmZ1c2luZyBjb2RlLiAgVGhpcyBhZ2FpbiBpcyBkaWZmaWN1bHQgdG8gY2hhbmdlLCBiZWNhdXNlIGFnYWluIGFueQotY2hhbmdlIGNhbiBhZmZlY3QgYW55IGFzc2VtYmxlciB0YXJnZXQsIGFuZCBzbyBpcyBkaWZmaWN1bHQgdG8gdGVzdC4KLQotVGhlIG5ldyBsaW5rZXIsIHdoZW4gdXNpbmcgdGhlIHNhbWUgb2JqZWN0IGZpbGUgZm9ybWF0IGZvciBhbGwgaW5wdXQKLWZpbGVzIGFuZCB0aGUgb3V0cHV0IGZpbGUsIGRvZXMgbm90IGNvbnZlcnQgcmVsb2NhdGlvbnMgaW50bwotQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcywgc28gaXQgY2FuIG5vdCB1c2UKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IGF0IGFsbC4gIEluc3RlYWQsIHVzZXJzIG9mIHRoZSBuZXcgbGlua2VyCi1hcmUgZXhwZWN0ZWQgdG8gd3JpdGUgYSBAc2FtcHtyZWxvY2F0ZV9zZWN0aW9ufSBmdW5jdGlvbiB3aGljaCB3aWxsCi1oYW5kbGUgcmVsb2NhdGlvbnMgaW4gYSB0YXJnZXQgc3BlY2lmaWMgZmFzaGlvbi4KLQotVGhlcmUgYXJlIHR3byBoZWxwZXIgZnVuY3Rpb25zIGZvciB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbjoKLUBzYW1we19iZmRfZmluYWxfbGlua19yZWxvY2F0ZX0gYW5kIEBzYW1we19iZmRfcmVsb2NhdGVfY29udGVudHN9LgotVGhlc2UgZnVuY3Rpb25zIHVzZSBhIGhvd3RvIHN0cnVjdHVyZSwgYnV0IHRoZXkgQGVtcGh7ZG8gbm90fSB1c2UgdGhlCi1Ac2FtcHtzcGVjaWFsX2Z1bmN0aW9ufSBmaWVsZC4gIFNpbmNlIHRoZSBmdW5jdGlvbnMgYXJlIG5vcm1hbGx5IGNhbGxlZAotZnJvbSB0YXJnZXQgc3BlY2lmaWMgY29kZSwgdGhlIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkIGFkZHMKLWxpdHRsZTsgYW55IHJlbG9jYXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBjYW4gYmUgaGFuZGxlZAotd2l0aG91dCBjYWxsaW5nIHRob3NlIGZ1bmN0aW9ucy4KLQotU28sIGlmIHlvdSB3YW50IHRvIGFkZCBhIG5ldyB0YXJnZXQsIG9yIGFkZCBhIG5ldyByZWxvY2F0aW9uIHRvIGFuCi1leGlzdGluZyB0YXJnZXQsIHlvdSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1NYWtlIHN1cmUgeW91IGNsZWFybHkgdW5kZXJzdGFuZCB3aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBzaG91bGQKLWxvb2sgbGlrZSBhZnRlciBhc3NlbWJseSwgYWZ0ZXIgYSByZWxvY2F0ZWFibGUgbGluaywgYW5kIGFmdGVyIGEgZmluYWwKLWxpbmsuICBNYWtlIHN1cmUgeW91IGNsZWFybHkgdW5kZXJzdGFuZCB0aGUgb3BlcmF0aW9ucyB0aGUgbGlua2VyIG11c3QKLXBlcmZvcm0gZHVyaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsgYW5kIGR1cmluZyBhIGZpbmFsIGxpbmsuCi0KLUBpdGVtCi1Xcml0ZSBhIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlIHJlbG9jYXRpb24uICBUaGUgaG93dG8gc3RydWN0dXJlIGlzCi1mbGV4aWJsZSBlbm91Z2ggdG8gcmVwcmVzZW50IGFueSByZWxvY2F0aW9uIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGJ5Ci1zZXR0aW5nIGEgY29udGlndW91cyBiaXRmaWVsZCBpbiB0aGUgZGVzdGluYXRpb24gdG8gdGhlIHZhbHVlIG9mIGEKLXN5bWJvbCwgcG9zc2libHkgd2l0aCBhbiBhZGRlbmQsIHBvc3NpYmx5IGFkZGluZyB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotdmFsdWUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkZXN0aW5hdGlvbi4KLQotQGl0ZW0KLUNoYW5nZSB0aGUgYXNzZW1ibGVyIHRvIGdlbmVyYXRlIHlvdXIgcmVsb2NhdGlvbi4gIFRoZSBhc3NlbWJsZXIgd2lsbAotY2FsbCBAc2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSwgc28geW91ciBob3d0byBzdHJ1Y3R1cmUgaGFzIHRvIGJlCi1hYmxlIHRvIGhhbmRsZSB0aGF0LiAgWW91IG1heSBuZWVkIHRvIHNldCB0aGUgQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0KLWZpZWxkIHRvIGhhbmRsZSBhc3NlbWJseSBjb3JyZWN0bHkuICBCZSBjYXJlZnVsIHRvIGVuc3VyZSB0aGF0IGFueSBjb2RlCi15b3Ugd3JpdGUgdG8gaGFuZGxlIHRoZSBhc3NlbWJsZXIgd2lsbCBhbHNvIHdvcmsgY29ycmVjdGx5IHdoZW4gZG9pbmcgYQotcmVsb2NhdGVhYmxlIGxpbmsuICBGb3IgZXhhbXBsZSwgc2VlIEBzYW1we2JmZF9lbGZfZ2VuZXJpY19yZWxvY30uCi0KLUBpdGVtCi1UZXN0IHRoZSBhc3NlbWJsZXIuICBDb25zaWRlciB0aGUgY2FzZXMgb2YgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuCi11bmRlZmluZWQgc3ltYm9sLCBhIGNvbW1vbiBzeW1ib2wsIGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlIG9iamVjdCBmaWxlCi1pbiB0aGUgc2FtZSBzZWN0aW9uLCBhbmQgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUgaW4gYQotZGlmZmVyZW50IHNlY3Rpb24uICBUaGVzZSBjYXNlcyBtYXkgbm90IGFsbCBiZSBhcHBsaWNhYmxlIGZvciB5b3VyCi1yZWxvYy4KLQotQGl0ZW0KLUlmIHlvdXIgdGFyZ2V0IHVzZXMgdGhlIG5ldyBsaW5rZXIsIHdoaWNoIGlzIHJlY29tbWVuZGVkLCBhZGQgYW55Ci1yZXF1aXJlZCBoYW5kbGluZyB0byB0aGUgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb24gZnVuY3Rpb24uICBJbiBzaW1wbGUKLWNhc2VzIHRoaXMgd2lsbCBqdXN0IGludm9sdmUgYSBjYWxsIHRvIEBzYW1we19iZmRfZmluYWxfbGlua19yZWxvY2F0ZX0KLW9yIEBzYW1we19iZmRfcmVsb2NhdGVfY29udGVudHN9LCBkZXBlbmRpbmcgdXBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLXJlbG9jYXRpb24gYW5kIHdoZXRoZXIgdGhlIGxpbmsgaXMgcmVsb2NhdGVhYmxlIG9yIG5vdC4KLQotQGl0ZW0KLVRlc3QgdGhlIGxpbmtlci4gIFRlc3QgdGhlIGNhc2Ugb2YgYSBmaW5hbCBsaW5rLiAgSWYgdGhlIHJlbG9jYXRpb24gY2FuCi1vdmVyZmxvdywgdXNlIGEgbGlua2VyIHNjcmlwdCB0byBmb3JjZSBhbiBvdmVyZmxvdyBhbmQgbWFrZSBzdXJlIHRoZQotZXJyb3IgaXMgcmVwb3J0ZWQgY29ycmVjdGx5LiAgVGVzdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGV0aGVyIHRoZQotc3ltYm9sIGlzIGRlZmluZWQgb3IgdW5kZWZpbmVkIGluIHRoZSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgRm9yIGJvdGggdGhlCi1maW5hbCBhbmQgcmVsb2NhdGVhYmxlIGxpbmssIHRlc3QgdGhlIGNhc2Ugd2hlbiB0aGUgc3ltYm9sIGlzIGEgY29tbW9uCi1zeW1ib2wsIHdoZW4gdGhlIHN5bWJvbCBsb29rZWQgbGlrZSBhIGNvbW1vbiBzeW1ib2wgYnV0IGJlY2FtZSBhIGRlZmluZWQKLXN5bWJvbCwgd2hlbiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUsIGFuZCB3aGVuCi10aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuCi0KLUBpdGVtCi1JbiBvcmRlciBmb3IgbGlua2luZyB0byBhbm90aGVyIG9iamVjdCBmaWxlIGZvcm1hdCwgc3VjaCBhcyBTLXJlY29yZHMsCi10byB3b3JrIGNvcnJlY3RseSwgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gaGFzIHRvIGRvIHRoZSByaWdodAotdGhpbmcgZm9yIHRoZSByZWxvY2F0aW9uLiAgWW91IG1heSBuZWVkIHRvIHNldCB0aGUKLUBzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkIHRvIGhhbmRsZSB0aGlzIGNvcnJlY3RseS4gIFRlc3QgdGhpcyBieQotZG9pbmcgYSBsaW5rIGluIHdoaWNoIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzIFMtcmVjb3Jkcy4KLQotQGl0ZW0KLVVzaW5nIHRoZSBsaW5rZXIgdG8gZ2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCBpbiBhIGRpZmZlcmVudCBvYmplY3QKLWZpbGUgZm9ybWF0IGlzIGltcG9zc2libGUgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc28geW91IGdlbmVyYWxseSBkb24ndAotaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LiAgTGlua2luZyBpbnB1dCBmaWxlcyBvZiBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKLWZvcm1hdHMgdG9nZXRoZXIgaXMgcXVpdGUgdW51c3VhbCwgYnV0IGlmIHlvdSdyZSByZWFsbHkgZGVkaWNhdGVkIHlvdQotbWF5IHdhbnQgdG8gY29uc2lkZXIgdGVzdGluZyB0aGlzIGNhc2UsIGJvdGggd2hlbiB0aGUgb3V0cHV0IG9iamVjdCBmaWxlCi1mb3JtYXQgaXMgdGhlIHNhbWUgYXMgeW91ciBmb3JtYXQsIGFuZCB3aGVuIGl0IGlzIGRpZmZlcmVudC4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBjb2RlcwotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gY29kZXMKLQotQkZEIGhhcyBhbm90aGVyIHdheSBvZiBkZXNjcmliaW5nIHJlbG9jYXRpb25zIGJlc2lkZXMgdGhlIGhvd3RvCi1zdHJ1Y3R1cmVzIGRlc2NyaWJlZCBhYm92ZTogdGhlIGVudW0gQHNhbXB7YmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlfS4KLQotRXZlcnkga25vd24gcmVsb2NhdGlvbiB0eXBlIGNhbiBiZSBkZXNjcmliZWQgYXMgYSB2YWx1ZSBpbiB0aGlzCi1lbnVtZXJhdGlvbi4gIFRoZSBlbnVtZXJhdGlvbiBjb250YWlucyBtYW55IHRhcmdldCBzcGVjaWZpYyByZWxvY2F0aW9ucywKLWJ1dCB3aGVyZSB0d28gb3IgbW9yZSB0YXJnZXRzIGhhdmUgdGhlIHNhbWUgcmVsb2NhdGlvbiwgYSBzaW5nbGUgY29kZSBpcwotdXNlZC4gIEZvciBleGFtcGxlLCB0aGUgc2luZ2xlIHZhbHVlIEBzYW1we0JGRF9SRUxPQ18zMn0gaXMgdXNlZCBmb3IgYWxsCi1zaW1wbGUgMzIgYml0IHJlbG9jYXRpb24gdHlwZXMuCi0KLVRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyByZWxvY2F0aW9uIGNvZGUgaXMgdG8gZ2l2ZSB0aGUgYXNzZW1ibGVyIHNvbWUKLW1lY2hhbmlzbSB0byBjcmVhdGUgQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcy4gIEluIG9yZGVyIGZvciB0aGUKLWFzc2VtYmxlciB0byBjcmVhdGUgYW4gQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlLCBpdCBoYXMgdG8gYmUgYWJsZSB0bwotb2J0YWluIGEgaG93dG8gc3RydWN0dXJlLiAgVGhlIGZ1bmN0aW9uIEBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0sCi13aGljaCBzaW1wbHkgY2FsbHMgdGhlIHRhcmdldCB2ZWN0b3IgZW50cnkgcG9pbnQKLUBzYW1we3JlbG9jX3R5cGVfbG9va3VwfSwgdGFrZXMgYSByZWxvY2F0aW9uIGNvZGUgYW5kIHJldHVybnMgYSBob3d0bwotc3RydWN0dXJlLgotCi1UaGUgZnVuY3Rpb24gQHNhbXB7YmZkX2dldF9yZWxvY19jb2RlX25hbWV9IHJldHVybnMgdGhlIG5hbWUgb2YgYQotcmVsb2NhdGlvbiBjb2RlLiAgVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy4KLQotVXNpbmcgYm90aCBob3d0byBzdHJ1Y3R1cmVzIGFuZCByZWxvY2F0aW9uIGNvZGVzIGNhbiBiZSBzb21ld2hhdAotY29uZnVzaW5nLiAgVGhlcmUgYXJlIG1hbnkgcHJvY2Vzc29yIHNwZWNpZmljIHJlbG9jYXRpb24gY29kZXMuCi1Ib3dldmVyLCB0aGUgcmVsb2NhdGlvbiBpcyBvbmx5IGZ1bGx5IGRlZmluZWQgYnkgdGhlIGhvd3RvIHN0cnVjdHVyZS4KLVRoZSBzYW1lIHJlbG9jYXRpb24gY29kZSB3aWxsIG1hcCB0byBkaWZmZXJlbnQgaG93dG8gc3RydWN0dXJlcyBpbgotZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZXhhbXBsZSwgdGhlIGFkZGVuZCBoYW5kbGluZyBtYXkgYmUKLWRpZmZlcmVudC4KLQotTW9zdCBvZiB0aGUgcmVsb2NhdGlvbiBjb2RlcyBhcmUgbm90IHJlYWxseSBnZW5lcmFsLiAgVGhlIGFzc2VtYmxlciBjYW4KLW5vdCB1c2UgdGhlbSB3aXRob3V0IGFscmVhZHkgdW5kZXJzdGFuZGluZyB3aGF0IHNvcnRzIG9mIHJlbG9jYXRpb25zIGNhbgotYmUgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldC4gIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlCi1yZWxvY2F0aW9uIGNvZGVzIHdpdGggc29tZXRoaW5nIHNpbXBsZXIuCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGZ1dHVyZQotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gZnV0dXJlCi0KLUNsZWFybHkgdGhlIGN1cnJlbnQgQkZEIHJlbG9jYXRpb24gc3VwcG9ydCBpcyBpbiBiYWQgc2hhcGUuICBBCi13aG9sZXNjYWxlIHJld3JpdGUgd291bGQgYmUgdmVyeSBkaWZmaWN1bHQsIGJlY2F1c2UgaXQgd291bGQgcmVxdWlyZQotdGhvcm91Z2ggdGVzdGluZyBvZiBldmVyeSBCRkQgdGFyZ2V0LiAgU28gc29tZSBzb3J0IG9mIGluY3JlbWVudGFsCi1jaGFuZ2UgaXMgcmVxdWlyZWQuCi0KLU15IHZhZ3VlIHRob3VnaHRzIG9uIHRoaXMgd291bGQgaW52b2x2ZSBkZWZpbmluZyBhIG5ldywgY2xlYXJseSBkZWZpbmVkLAotaG93dG8gc3RydWN0dXJlLiAgU29tZSBtZWNoYW5pc20gd291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZQotb2YgaG93dG8gc3RydWN0dXJlIHdhcyBiZWluZyB1c2VkIGJ5IGEgcGFydGljdWxhciBmb3JtYXQuCi0KLVRoZSBuZXcgaG93dG8gc3RydWN0dXJlIHdvdWxkIGNsZWFybHkgZGVmaW5lIHRoZSByZWxvY2F0aW9uIGJlaGF2aW91ciBpbgotdGhlIGNhc2Ugb2YgYW4gYXNzZW1ibHksIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBhIGZpbmFsIGxpbmsuICBBdAotbGVhc3Qgb25lIHNwZWNpYWwgZnVuY3Rpb24gd291bGQgYmUgZGVmaW5lZCBhcyBhbiBlc2NhcGUsIGFuZCBpdCBtaWdodAotbWFrZSBzZW5zZSB0byBkZWZpbmUgbW9yZS4KLQotT25lIG9yIG1vcmUgZ2VuZXJpYyBmdW5jdGlvbnMgc2ltaWxhciB0byBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufQotd291bGQgYmUgd3JpdHRlbiB0byBoYW5kbGUgdGhlIG5ldyBob3d0byBzdHJ1Y3R1cmUuCi0KLVRoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gd3JpdGUgYSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIHJlbG9jYXRlCi1zZWN0aW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBuZXcgbGlua2VyLiAgVGhlIHRhcmdldCBzcGVjaWZpYyBjb2RlCi13b3VsZCBwcm92aWRlIHNvbWUgbWVjaGFuaXNtIChhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYW4gaW5pdGlhbAotY29udmVyc2lvbikgdG8gY29udmVydCB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbnMgaW50byBob3d0bwotc3RydWN0dXJlcy4KLQotSWRlYWxseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyBnZW5lcmljIHJlbG9jYXRlIHNlY3Rpb24KLWZ1bmN0aW9uIGZvciB0aGUgZ2VuZXJpYyBsaW5rZXIgYXMgd2VsbC4gIFRoYXQgaXMsIGl0IHdvdWxkIHJlcGxhY2UgdGhlCi1Ac2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9IGZ1bmN0aW9uIHdoaWNoIGlzCi1jdXJyZW50bHkgbm9ybWFsbHkgdXNlZC4KLQotRm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgRUxGIGR5bmFtaWMgbGlua2luZywgbW9yZSBjb25zaWRlcmF0aW9uIG5lZWRzIHRvCi1iZSBnaXZlbiB0byB3cml0aW5nIEVMRiBzcGVjaWZpYyBidXQgRUxGIHRhcmdldCBnZW5lcmljIGNvZGUgdG8gaGFuZGxlCi1zcGVjaWFsIHJlbG9jYXRpb24gdHlwZXMgc3VjaCBhcyBHT1QgYW5kIFBMVC4KLQotQG5vZGUgQkZEIEVMRiBzdXBwb3J0Ci1Ac2VjdGlvbiBCRkQgRUxGIHN1cHBvcnQKLUBjaW5kZXggZWxmIHN1cHBvcnQgaW4gYmZkCi1AY2luZGV4IGJmZCBlbGYgc3VwcG9ydAotCi1UaGUgRUxGIG9iamVjdCBmaWxlIGZvcm1hdCBpcyBkZWZpbmVkIGluIHR3byBwYXJ0czogYSBnZW5lcmljIEFCSSBhbmQgYQotcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBsZW1lbnQuICBUaGUgRUxGIHN1cHBvcnQgaW4gQkZEIGlzIHNwbGl0IGluIGEKLXNpbWlsYXIgZmFzaGlvbi4gIFRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBpcyBsYXJnZWx5IGtlcHQgd2l0aGluCi1hIHNpbmdsZSBmaWxlLiAgVGhlIGdlbmVyaWMgc3VwcG9ydCBpcyBwcm92aWRlZCBieSBzZXZlcmFsIG90aGVyIGZpbGVzLgotVGhlIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZAotY29uc3RhbnRzIHVzZWQgYnkgdGhlIGdlbmVyaWMgc3VwcG9ydC4KLQotQG1lbnUKLSogQkZEIEVMRiBzZWN0aW9ucyBhbmQgc2VnbWVudHM6OglFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi0qIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0OjoJCUJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQ6OglCRkQgRUxGIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0Ci0qIEJGRCBFTEYgY29yZSBmaWxlczo6CQkJQkZEIEVMRiBjb3JlIGZpbGVzCi0qIEJGRCBFTEYgZnV0dXJlOjoJCQlCRkQgRUxGIGZ1dHVyZQotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi1Ac3Vic2VjdGlvbiBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi0KLVRoZSBFTEYgQUJJIHBlcm1pdHMgYSBmaWxlIHRvIGhhdmUgZWl0aGVyIHNlY3Rpb25zIG9yIHNlZ21lbnRzIG9yIGJvdGguCi1SZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGVzIGNvbnZlbnRpb25hbGx5IGhhdmUgb25seSBzZWN0aW9ucy4KLUV4ZWN1dGFibGVzIGNvbnZlbnRpb25hbGx5IGhhdmUgYm90aC4gIENvcmUgZmlsZXMgY29udmVudGlvbmFsbHkgaGF2ZQotb25seSBwcm9ncmFtIHNlZ21lbnRzLgotCi1FTEYgc2VjdGlvbnMgYXJlIHNpbWlsYXIgdG8gc2VjdGlvbnMgaW4gb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0czogdGhleQotaGF2ZSBhIG5hbWUsIGEgVk1BLCBmaWxlIGNvbnRlbnRzLCBmbGFncywgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMKLWluZm9ybWF0aW9uLiAgRUxGIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgaW4gc2VjdGlvbnMgb2YgYSBwYXJ0aWN1bGFyCi10eXBlOyBCRkQgYXV0b21hdGljYWxseSBjb252ZXJ0cyB0aGVzZSBzZWN0aW9ucyBpbnRvIGludGVybmFsIHJlbG9jYXRpb24KLWluZm9ybWF0aW9uLgotCi1FTEYgcHJvZ3JhbSBzZWdtZW50cyBhcmUgaW50ZW5kZWQgZm9yIGZhc3QgaW50ZXJwcmV0YXRpb24gYnkgYSBzeXN0ZW0KLWxvYWRlci4gIFRoZXkgaGF2ZSBhIHR5cGUsIGEgVk1BLCBhbiBMTUEsIGZpbGUgY29udGVudHMsIGFuZCBhIGNvdXBsZSBvZgotb3RoZXIgZmllbGRzLiAgV2hlbiBhbiBFTEYgZXhlY3V0YWJsZSBpcyBydW4gb24gYSBVbml4IHN5c3RlbSwgdGhlCi1zeXN0ZW0gbG9hZGVyIHdpbGwgZXhhbWluZSB0aGUgcHJvZ3JhbSBzZWdtZW50cyB0byBkZWNpZGUgaG93IHRvIGxvYWQKLWl0LiAgVGhlIGxvYWRlciB3aWxsIGlnbm9yZSB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIExvYWRhYmxlIHByb2dyYW0KLXNlZ21lbnRzICh0eXBlIEBzYW1we1BUX0xPQUR9KSBhcmUgZGlyZWN0bHkgbG9hZGVkIGludG8gbWVtb3J5LiAgT3RoZXIKLXByb2dyYW0gc2VnbWVudHMgYXJlIGludGVycHJldGVkIGJ5IHRoZSBsb2FkZXIsIGFuZCBnZW5lcmFsbHkgcHJvdmlkZQotZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLgotCi1XaGVuIGFuIEVMRiBmaWxlIGhhcyBib3RoIHByb2dyYW0gc2VnbWVudHMgYW5kIHNlY3Rpb25zLCBhbiBFTEYgcHJvZ3JhbQotc2VnbWVudCBtYXkgZW5jb21wYXNzIG9uZSBvciBtb3JlIEVMRiBzZWN0aW9ucywgaW4gdGhlIHNlbnNlIHRoYXQgdGhlCi1wb3J0aW9uIG9mIHRoZSBmaWxlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9ncmFtIHNlZ21lbnQgbWF5IGluY2x1ZGUKLXRoZSBwb3J0aW9ucyBvZiB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBvciBtb3JlIHNlY3Rpb25zLiAgV2hlbgotdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIGEgbG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50LCB0aGUKLXJlbGF0aXZlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbiBjb250ZW50cyBpbiB0aGUgZmlsZSBtdXN0IGNvcnJlc3BvbmQKLXRvIHRoZSByZWxhdGl2ZSBwb3NpdGlvbnMgdGhleSBzaG91bGQgaG9sZCB3aGVuIHRoZSBwcm9ncmFtIHNlZ21lbnQgaXMKLWxvYWRlZC4gIFRoaXMgcmVxdWlyZW1lbnQgc2hvdWxkIGJlIG9idmlvdXMgaWYgeW91IGNvbnNpZGVyIHRoYXQgdGhlCi1zeXN0ZW0gbG9hZGVyIHdpbGwgbG9hZCBhbiBlbnRpcmUgcHJvZ3JhbSBzZWdtZW50IGF0IGEgdGltZS4KLQotT24gYSBzeXN0ZW0gd2hpY2ggc3VwcG9ydHMgZHluYW1pYyBwYWdpbmcsIHN1Y2ggYXMgYW55IG5hdGl2ZSBVbml4Ci1zeXN0ZW0sIHRoZSBjb250ZW50cyBvZiBhIGxvYWRhYmxlIHByb2dyYW0gc2VnbWVudCBtdXN0IGJlIGF0IHRoZSBzYW1lCi1vZmZzZXQgaW4gdGhlIGZpbGUgYXMgaW4gbWVtb3J5LCBtb2R1bG8gdGhlIG1lbW9yeSBwYWdlIHNpemUgdXNlZCBvbiB0aGUKLXN5c3RlbS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3lzdGVtIGxvYWRlciB3aWxsIG1hcCB0aGUgZmlsZSBpbnRvIG1lbW9yeQotc3RhcnRpbmcgYXQgdGhlIHN0YXJ0IG9mIGEgcGFnZS4gIFRoZSBzeXN0ZW0gbG9hZGVyIGNhbiBlYXNpbHkgcmVtYXAKLWVudGlyZSBwYWdlcyB0byB0aGUgY29ycmVjdCBsb2FkIGFkZHJlc3MuICBIb3dldmVyLCBpZiB0aGUgY29udGVudHMgb2YKLXRoZSBmaWxlIHdlcmUgbm90IGNvcnJlY3RseSBhbGlnbmVkIHdpdGhpbiB0aGUgcGFnZSwgdGhlIHN5c3RlbSBsb2FkZXIKLXdvdWxkIGhhdmUgdG8gc2hpZnQgdGhlIGNvbnRlbnRzIGFyb3VuZCB3aXRoaW4gdGhlIHBhZ2UsIHdoaWNoIGlzIHRvbwotZXhwZW5zaXZlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBMTUEgb2YgYSBsb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgaXMKLUBzYW1wezB4NDAwODB9IGFuZCB0aGUgcGFnZSBzaXplIGlzIEBzYW1wezB4MTAwMH0sIHRoZW4gdGhlIHBvc2l0aW9uIG9mCi10aGUgc2VnbWVudCBjb250ZW50cyB3aXRoaW4gdGhlIGZpbGUgbXVzdCBlcXVhbCBAc2FtcHsweDgwfSBtb2R1bG8KLUBzYW1wezB4MTAwMH0uCi0KLUJGRCBoYXMgb25seSBhIHNpbmdsZSBzZXQgb2Ygc2VjdGlvbnMuICBJdCBkb2VzIG5vdCBwcm92aWRlIGFueSBnZW5lcmljCi13YXkgdG8gZXhhbWluZSBib3RoIHNlY3Rpb25zIGFuZCBzZWdtZW50cy4gIFdoZW4gQkZEIGlzIHVzZWQgdG8gb3BlbiBhbgotb2JqZWN0IGZpbGUgb3IgZXhlY3V0YWJsZSwgdGhlIEJGRCBzZWN0aW9ucyB3aWxsIHJlcHJlc2VudCBFTEYgc2VjdGlvbnMuCi1XaGVuIEJGRCBpcyB1c2VkIHRvIG9wZW4gYSBjb3JlIGZpbGUsIHRoZSBCRkQgc2VjdGlvbnMgd2lsbCByZXByZXNlbnQKLUVMRiBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIGV4YW1pbmUgYW4gb2JqZWN0IGZpbGUgb3IgZXhlY3V0YWJsZSwgYW55IHByb2dyYW0KLXNlZ21lbnRzIHdpbGwgYmUgcmVhZCB0byBzZXQgdGhlIExNQSBvZiB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIGJlY2F1c2UKLUVMRiBzZWN0aW9ucyBvbmx5IGhhdmUgYSBWTUEsIHdoaWxlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGhhdmUgYm90aCBhIFZNQQotYW5kIGFuIExNQS4gIEFueSBwcm9ncmFtIHNlZ21lbnRzIHdpbGwgYmUgY29waWVkIGJ5IHRoZQotQHNhbXB7Y29weV9wcml2YXRlfSBlbnRyeSBwb2ludHMuICBUaGV5IHdpbGwgYmUgcHJpbnRlZCBieSB0aGUKLUBzYW1we3ByaW50X3ByaXZhdGV9IGVudHJ5IHBvaW50LiAgT3RoZXJ3aXNlLCB0aGUgcHJvZ3JhbSBzZWdtZW50cyBhcmUKLWlnbm9yZWQuICBJbiBwYXJ0aWN1bGFyLCBwcm9ncmFtcyB3aGljaCB1c2UgQkZEIGN1cnJlbnRseSBoYXZlIG5vIGRpcmVjdAotYWNjZXNzIHRvIHRoZSBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlLCB0aGUgcHJvZ3JhbSBzZWdtZW50cyB3aWxsIGJlCi1jcmVhdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGRvbmUgaW4KLXRoZSBmdW5jdGlvbiBAc2FtcHthc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzfSBpbiBAZmlsZXtlbGYuY30uCi1UaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHR3ZWFrZWQgbWFueSB0aW1lcywgYW5kIHByb2JhYmx5IHN0aWxsIGhhcwotcHJvYmxlbXMgdGhhdCBhcmlzZSBpbiBwYXJ0aWN1bGFyIGNhc2VzLgotCi1UaGVyZSBpcyBhIGhvb2sgd2hpY2ggbWF5IGJlIHVzZWQgdG8gZXhwbGljaXRseSBkZWZpbmUgdGhlIHByb2dyYW0KLXNlZ21lbnRzIHdoZW4gY3JlYXRpbmcgYW4gZXhlY3V0YWJsZTogdGhlIEBzYW1we2JmZF9yZWNvcmRfcGhkcn0KLWZ1bmN0aW9uIGluIEBmaWxle2JmZC5jfS4gIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBCRkQgd2lsbCBub3QKLWNyZWF0ZSBwcm9ncmFtIHNlZ21lbnRzIGl0c2VsZiwgYnV0IHdpbGwgb25seSBjcmVhdGUgdGhlIHByb2dyYW0KLXNlZ21lbnRzIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyLiAgVGhlIGxpbmtlciB1c2VzIHRoaXMgZnVuY3Rpb24gdG8KLWltcGxlbWVudCB0aGUgQHNhbXB7UEhEUlN9IGxpbmtlciBzY3JpcHQgY29tbWFuZC4KLQotQG5vZGUgQkZEIEVMRiBnZW5lcmljIHN1cHBvcnQKLUBzdWJzZWN0aW9uIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0Ci0KLUluIGdlbmVyYWwsIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgcmVhZCBleHRlcm5hbCBkYXRhIGZyb20gdGhlIEVMRiBmaWxlCi1hcmUgZm91bmQgaW4gQGZpbGV7ZWxmLmN9LiAgVGhleSBvcGVyYXRlIG9uIHRoZSBpbnRlcm5hbCBmb3JtcyBvZiB0aGUKLUVMRiBzdHJ1Y3R1cmVzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiBAZmlsZXtpbmNsdWRlL2VsZi9pbnRlcm5hbC5ofS4gIFRoZQotaW50ZXJuYWwgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBAc2FtcHtiZmRfdm1hfSwgYW5kIHNvIG1heQotYmUgdXNlZCBmb3IgYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBFTEYgdGFyZ2V0cy4KLQotVGhlIGZpbGUgQGZpbGV7ZWxmY29kZS5ofSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggb3BlcmF0ZSBvbiB0aGUKLWV4dGVybmFsIGRhdGEuICBAZmlsZXtlbGZjb2RlLmh9IGlzIGNvbXBpbGVkIHR3aWNlLCBvbmNlIHZpYQotQGZpbGV7ZWxmMzIuY30gd2l0aCBAc2FtcHtBUkNIX1NJWkV9IGRlZmluZWQgYXMgQHNhbXB7MzJ9LCBhbmQgb25jZSB2aWEKLUBmaWxle2VsZjY0LmN9IHdpdGggQHNhbXB7QVJDSF9TSVpFfSBkZWZpbmVkIGFzIEBzYW1wezY0fS4KLUBmaWxle2VsZmNvZGUuaH0gaW5jbHVkZXMgZnVuY3Rpb25zIHRvIHN3YXAgdGhlIEVMRiBzdHJ1Y3R1cmVzIGluIGFuZAotb3V0IG9mIGV4dGVybmFsIGZvcm0sIGFzIHdlbGwgYXMgYSBmZXcgbW9yZSBjb21wbGV4IGZ1bmN0aW9ucy4KLQotTGlua2VyIHN1cHBvcnQgaXMgZm91bmQgaW4gQGZpbGV7ZWxmbGluay5jfSBhbmQgQGZpbGV7ZWxmbGluay5ofS4gIFRoZQotbGF0dGVyIGZpbGUgaXMgY29tcGlsZWQgdHdpY2UsIGZvciBib3RoIDMyIGFuZCA2NCBiaXQgc3VwcG9ydC4gIFRoZQotbGlua2VyIHN1cHBvcnQgaXMgb25seSB1c2VkIGlmIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZSBkZWZpbmVzCi1Ac2FtcHtlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9ufSwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gcmVsb2NhdGUgdGhlCi1zZWN0aW9uIGNvbnRlbnRzLiAgSWYgdGhhdCBtYWNybyBpcyBub3QgZGVmaW5lZCwgdGhlIGdlbmVyaWMgbGlua2VyIGNvZGUKLWlzIHVzZWQsIGFuZCByZWxvY2F0aW9ucyBhcmUgaGFuZGxlZCB2aWEgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0uCi0KLVRoZSBjb3JlIGZpbGUgc3VwcG9ydCBpcyBpbiBAZmlsZXtlbGZjb3JlLmh9LCB3aGljaCBpcyBjb21waWxlZCB0d2ljZSwKLWZvciBib3RoIDMyIGFuZCA2NCBiaXQgc3VwcG9ydC4gIFRoZSBtb3JlIGludGVyZXN0aW5nIGNhc2VzIG9mIGNvcmUgZmlsZQotc3VwcG9ydCBvbmx5IHdvcmsgb24gYSBuYXRpdmUgc3lzdGVtIHdoaWNoIGhhcyB0aGUgQGZpbGV7c3lzL3Byb2Nmcy5ofQotaGVhZGVyIGZpbGUuICBXaXRob3V0IHRoYXQgZmlsZSwgdGhlIGNvcmUgZmlsZSBzdXBwb3J0IGRvZXMgbGl0dGxlIG1vcmUKLXRoYW4gcmVhZCB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMgYXMgQkZEIHNlY3Rpb25zLgotCi1UaGUgQkZEIGludGVybmFsIGhlYWRlciBmaWxlIEBmaWxle2VsZi1iZmQuaH0gaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgotYW1vbmcgdGhlc2UgZmlsZXMgYW5kIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZXMuCi0KLVRoZSBkZWZhdWx0IGVudHJpZXMgZm9yIHRoZSBCRkQgRUxGIHRhcmdldCB2ZWN0b3IgYXJlIGZvdW5kIG1haW5seSBpbgotQGZpbGV7ZWxmLmN9LiAgU29tZSBmdW5jdGlvbnMgYXJlIGZvdW5kIGluIEBmaWxle2VsZmNvZGUuaH0uCi0KLVRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZXMgbWF5IG92ZXJyaWRlIHBhcnRpY3VsYXIgZW50cmllcyBpbiB0aGUKLXRhcmdldCB2ZWN0b3IsIGJ1dCBtb3N0IGRvIG5vdCwgd2l0aCBvbmUgZXhjZXB0aW9uOiB0aGUKLUBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0gZW50cnkgcG9pbnQgaXMgYWx3YXlzIHByb2Nlc3NvciBzcGVjaWZpYy4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotQHN1YnNlY3Rpb24gQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotCi1CeSBjb252ZW50aW9uLCB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciBwcm9jZXNzb3IKLXdpbGwgYmUgZm91bmQgaW4gQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9LCB3aGVyZSBAdmFye25ufSBpcwotZWl0aGVyIDMyIG9yIDY0LCBhbmQgQHZhcntjcHV9IGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzb3IuCi0KLUBtZW51Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkOjoJUmVxdWlyZWQgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLSogQkZEIEVMRiBwcm9jZXNzb3IgbGlua2VyOjoJUHJvY2Vzc29yIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIG90aGVyOjoJT3RoZXIgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgb3B0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkCi1Ac3Vic3Vic2VjdGlvbiBSZXF1aXJlZCBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotCi1XaGVuIHdyaXRpbmcgYSBAZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30gZmlsZSwgeW91IG11c3QgZG8gdGhlCi1mb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1EZWZpbmUgZWl0aGVyIEBzYW1we1RBUkdFVF9CSUdfU1lNfSBvciBAc2FtcHtUQVJHRVRfTElUVExFX1NZTX0sIG9yCi1ib3RoLCB0byBhIHVuaXF1ZSBDIG5hbWUgdG8gdXNlIGZvciB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgbmFtZSBzaG91bGQKLWFwcGVhciBpbiB0aGUgbGlzdCBvZiB0YXJnZXQgdmVjdG9ycyBpbiBAZmlsZXt0YXJnZXRzLmN9LCBhbmQgd2lsbCBhbHNvCi1oYXZlIHRvIGFwcGVhciBpbiBAZmlsZXtjb25maWcuYmZkfSBhbmQgQGZpbGV7Y29uZmlndXJlLmlufS4gIERlZmluZQotQHNhbXB7VEFSR0VUX0JJR19TWU19IGZvciBhIGJpZy1lbmRpYW4gcHJvY2Vzc29yLAotQHNhbXB7VEFSR0VUX0xJVFRMRV9TWU19IGZvciBhIGxpdHRsZS1lbmRpYW4gcHJvY2Vzc29yLCBhbmQgZGVmaW5lIGJvdGgKLWZvciBhIGJpLWVuZGlhbiBwcm9jZXNzb3IuCi1AaXRlbQotRGVmaW5lIGVpdGhlciBAc2FtcHtUQVJHRVRfQklHX05BTUV9IG9yIEBzYW1we1RBUkdFVF9MSVRUTEVfTkFNRX0sIG9yCi1ib3RoLCB0byBhIHN0cmluZyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyB0aGUKLW5hbWUgd2hpY2ggYSB1c2VyIG9mIHRoZSBCRkQgdG9vbCB3b3VsZCB1c2UgdG8gc3BlY2lmeSB0aGUgb2JqZWN0IGZpbGUKLWZvcm1hdC4gIEl0IHdvdWxkIG5vcm1hbGx5IGFwcGVhciBpbiBhIGxpbmtlciBlbXVsYXRpb24gcGFyYW1ldGVycwotZmlsZS4KLUBpdGVtCi1EZWZpbmUgQHNhbXB7RUxGX0FSQ0h9IHRvIHRoZSBCRkQgYXJjaGl0ZWN0dXJlIChhbiBlbGVtZW50IG9mIHRoZQotQHNhbXB7YmZkX2FyY2hpdGVjdHVyZX0gZW51bSwgdHlwaWNhbGx5IEBzYW1we2JmZF9hcmNoX0B2YXJ7Y3B1fX0pLgotQGl0ZW0KLURlZmluZSBAc2FtcHtFTEZfTUFDSElORV9DT0RFfSB0byB0aGUgbWFnaWMgbnVtYmVyIHdoaWNoIHNob3VsZCBhcHBlYXIKLWluIHRoZSBAc2FtcHtlX21hY2hpbmV9IGZpZWxkIG9mIHRoZSBFTEYgaGVhZGVyLiAgQXMgb2YgdGhpcyB3cml0aW5nLAotdGhlc2UgbWFnaWMgbnVtYmVycyBhcmUgYXNzaWduZWQgYnkgU0NPOyBpZiB5b3Ugd2FudCB0byBnZXQgYSBtYWdpYwotbnVtYmVyIGZvciBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yLCB0cnkgc2VuZGluZyBhIG5vdGUgdG8KLUBlbWFpbHtyZWdpc3RyeUBAc2NvLmNvbX0uICBJbiB0aGUgQkZEIHNvdXJjZXMsIHRoZSBtYWdpYyBudW1iZXJzIGFyZQotZm91bmQgaW4gQGZpbGV7aW5jbHVkZS9lbGYvY29tbW9uLmh9OyB0aGV5IGhhdmUgbmFtZXMgYmVnaW5uaW5nIHdpdGgKLUBzYW1we0VNX30uCi1AaXRlbQotRGVmaW5lIEBzYW1we0VMRl9NQVhQQUdFU0laRX0gdG8gdGhlIG1heGltdW0gc2l6ZSBvZiBhIHZpcnR1YWwgcGFnZSBpbgotbWVtb3J5LiAgVGhpcyBjYW4gbm9ybWFsbHkgYmUgZm91bmQgYXQgdGhlIHN0YXJ0IG9mIGNoYXB0ZXIgNSBpbiB0aGUKLXByb2Nlc3NvciBzcGVjaWZpYyBzdXBwbGVtZW50LiAgRm9yIGEgcHJvY2Vzc29yIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkCi1pbiBhbiBlbWJlZGRlZCBzeXN0ZW0sIG9yIHdoaWNoIGhhcyBubyBtZW1vcnkgbWFuYWdlbWVudCBoYXJkd2FyZSwgdGhpcwotY2FuIHNpbXBseSBiZSBAc2FtcHsxfS4KLUBpdGVtCi1JZiB0aGUgZm9ybWF0IHNob3VsZCB1c2UgQHNhbXB7UmVsfSByYXRoZXIgdGhhbiBAc2FtcHtSZWxhfSByZWxvY2F0aW9ucywKLWRlZmluZSBAc2FtcHtVU0VfUkVMfS4gIFRoaXMgaXMgbm9ybWFsbHkgZGVmaW5lZCBpbiBjaGFwdGVyIDQgb2YgdGhlCi1wcm9jZXNzb3Igc3BlY2lmaWMgc3VwcGxlbWVudC4KLQotSW4gdGhlIGFic2VuY2Ugb2YgYSBzdXBwbGVtZW50LCBpdCdzIGVhc2llciB0byB3b3JrIHdpdGggQHNhbXB7UmVsYX0KLXJlbG9jYXRpb25zLiAgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMgd2lsbCByZXF1aXJlIG1vcmUgc3BhY2UgaW4gb2JqZWN0Ci1maWxlcyAoYnV0IG5vdCBpbiBleGVjdXRhYmxlcywgZXhjZXB0IHdoZW4gdXNpbmcgZHluYW1pYyBsaW5raW5nKS4KLUhvd2V2ZXIsIHRoaXMgaXMgb3V0d2VpZ2hlZCBieSB0aGUgc2ltcGxpY2l0eSBvZiBhZGRlbmQgaGFuZGxpbmcgd2hlbgotdXNpbmcgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMuICBXaXRoIEBzYW1we1JlbH0gcmVsb2NhdGlvbnMsIHRoZSBhZGRlbmQKLW11c3QgYmUgc3RvcmVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCB3aGljaCBtYWtlcyByZWxvY2F0ZWFibGUgbGlua3MKLW1vcmUgY29tcGxleC4KLQotRm9yIGV4YW1wbGUsIGNvbnNpZGVyIEMgY29kZSBsaWtlIEBjb2Rle2kgPSBhWzEwMDBdO30gd2hlcmUgQHNhbXB7YX0gaXMKLWEgZ2xvYmFsIGFycmF5LiAgVGhlIGluc3RydWN0aW9ucyB3aGljaCBsb2FkIHRoZSB2YWx1ZSBvZiBAc2FtcHthWzEwMDBdfQotd2lsbCBtb3N0IGxpa2VseSB1c2UgYSByZWxvY2F0aW9uIHdoaWNoIHJlZmVycyB0byB0aGUgc3ltYm9sCi1yZXByZXNlbnRpbmcgQHNhbXB7YX0sIHdpdGggYW4gYWRkZW5kIHRoYXQgZ2l2ZXMgdGhlIG9mZnNldCBmcm9tIHRoZQotc3RhcnQgb2YgQHNhbXB7YX0gdG8gZWxlbWVudCBAc2FtcHsxMDAwfS4gIFdoZW4gdXNpbmcgQHNhbXB7UmVsfQotcmVsb2NhdGlvbnMsIHRoYXQgYWRkZW5kIG11c3QgYmUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4KLUlmIHlvdSBhcmUgYWRkaW5nIHN1cHBvcnQgZm9yIGEgUklTQyBjaGlwIHdoaWNoIHVzZXMgdHdvIG9yIG1vcmUKLWluc3RydWN0aW9ucyB0byBsb2FkIGFuIGFkZHJlc3MsIHRoZW4gdGhlIGFkZGVuZCBtYXkgbm90IGZpdCBpbiBhIHNpbmdsZQotaW5zdHJ1Y3Rpb24sIGFuZCB3aWxsIGhhdmUgdG8gYmUgc29tZWhvdyBzcGxpdCBhbW9uZyB0aGUgaW5zdHJ1Y3Rpb25zLgotVGhpcyBtYWtlcyBsaW5raW5nIGF3a3dhcmQsIHBhcnRpY3VsYXJseSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsKLWluIHdoaWNoIHRoZSBhZGRlbmQgbWF5IGhhdmUgdG8gYmUgdXBkYXRlZC4gIEl0IGNhbiBiZSBkb25lLS0tdGhlIE1JUFMKLUVMRiBzdXBwb3J0IGRvZXMgaXQtLS1idXQgaXQgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbiBwb3NzaWJsZS4KLQotSXQgaXMgcG9zc2libGUsIHRob3VnaCBzb21ld2hhdCBhd2t3YXJkLCB0byBzdXBwb3J0IGJvdGggQHNhbXB7UmVsfSBhbmQKLUBzYW1we1JlbGF9IHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSB0YXJnZXQ7IEBmaWxle2VsZjY0LW1pcHMuY30gZG9lcyBpdAotYnkgb3ZlcnJpZGluZyB0aGUgcmVsb2NhdGlvbiByZWFkaW5nIGFuZCB3cml0aW5nIHJvdXRpbmVzLgotQGl0ZW0KLURlZmluZSBob3d0byBzdHJ1Y3R1cmVzIGZvciBhbGwgdGhlIHJlbG9jYXRpb24gdHlwZXMuCi1AaXRlbQotRGVmaW5lIGEgQHNhbXB7YmZkX3JlbG9jX3R5cGVfbG9va3VwfSByb3V0aW5lLiAgVGhpcyBtdXN0IGJlIG5hbWVkCi1Ac2FtcHtiZmRfZWxmQHZhcntubn1fYmZkX3JlbG9jX3R5cGVfbG9va3VwfSwgYW5kIG1heSBiZSBlaXRoZXIgYQotZnVuY3Rpb24gb3IgYSBtYWNyby4gIEl0IG11c3QgdHJhbnNsYXRlIGEgQkZEIHJlbG9jYXRpb24gY29kZSBpbnRvIGEKLWhvd3RvIHN0cnVjdHVyZS4gIFRoaXMgaXMgbm9ybWFsbHkgYSB0YWJsZSBsb29rdXAgb3IgYSBzaW1wbGUgc3dpdGNoLgotQGl0ZW0KLUlmIHVzaW5nIEBzYW1we1JlbH0gcmVsb2NhdGlvbnMsIGRlZmluZSBAc2FtcHtlbGZfaW5mb190b19ob3d0b19yZWx9LgotSWYgdXNpbmcgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMsIGRlZmluZSBAc2FtcHtlbGZfaW5mb190b19ob3d0b30uCi1FaXRoZXIgd2F5LCB0aGlzIGlzIGEgbWFjcm8gZGVmaW5lZCBhcyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHdoaWNoCi10YWtlcyBhbiBAc2FtcHthcmVsZW50fSBhbmQgYSBAc2FtcHtSZWx9IG9yIEBzYW1we1JlbGF9IHN0cnVjdHVyZSwgYW5kCi1zZXRzIHRoZSBAc2FtcHtob3d0b30gZmllbGQgb2YgdGhlIEBzYW1we2FyZWxlbnR9IGJhc2VkIG9uIHRoZQotQHNhbXB7UmVsfSBvciBAc2FtcHtSZWxhfSBzdHJ1Y3R1cmUuICBUaGlzIGlzIG5vcm1hbGx5IHVzZXMKLUBzYW1we0VMRkB2YXJ7bm59X1JfVFlQRX0gdG8gZ2V0IHRoZSBFTEYgcmVsb2NhdGlvbiB0eXBlIGFuZCB1c2VzIGl0IGFzCi1hbiBpbmRleCBpbnRvIGEgdGFibGUgb2YgaG93dG8gc3RydWN0dXJlcy4KLUBlbmQgaXRlbWl6ZQotCi1Zb3UgbXVzdCBhbHNvIGFkZCB0aGUgbWFnaWMgbnVtYmVyIGZvciB0aGlzIHByb2Nlc3NvciB0byB0aGUKLUBzYW1we3ByZXBfaGVhZGVyc30gZnVuY3Rpb24gaW4gQGZpbGV7ZWxmLmN9LgotCi1Zb3UgbXVzdCBhbHNvIGNyZWF0ZSBhIGhlYWRlciBmaWxlIGluIHRoZSBAZmlsZXtpbmNsdWRlL2VsZn0gZGlyZWN0b3J5Ci1jYWxsZWQgQGZpbGV7QHZhcntjcHV9Lmh9LiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgYW55IHRhcmdldCBzcGVjaWZpYyAKLWluZm9ybWF0aW9uIHdoaWNoIG1heSBiZSBuZWVkZWQgb3V0c2lkZSBvZiB0aGUgQkZEIGNvZGUuICBJbiBwYXJ0aWN1bGFyCi1pdCBzaG91bGQgdXNlIHRoZSBAc2FtcHtTVEFSVF9SRUxPQ19OVU1CRVJTfSwgQHNhbXB7UkVMT0NfTlVNQkVSfSwKLUBzYW1we0ZBS0VfUkVMT0N9LCBAc2FtcHtFTVBUWV9SRUxPQ30gYW5kIEBzYW1we0VORF9SRUxPQ19OVU1CRVJTfQotbWFjcm9zIHRvIGNyZWF0ZSBhIHRhYmxlIG1hcHBpbmcgdGhlIG51bWJlciB1c2VkIHRvIGluZGVudGlmeSBhCi1yZWxvY2F0aW9uIHRvIGEgbmFtZSBkZXNjcmliaW5nIHRoYXQgcmVsb2NhdGlvbi4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3IgbGlua2VyCi1Ac3Vic3Vic2VjdGlvbiBQcm9jZXNzb3Igc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQKLQotVGhlIGxpbmtlciB3aWxsIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgaWYgeW91IGRlZmluZSBhIHJlbG9jYXRlIHNlY3Rpb24KLWZ1bmN0aW9uLiAgVGhpcyB3aWxsIHBlcm1pdCBCRkQgdG8gdXNlIHRoZSBFTEYgc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQuCi0KLUlmIHlvdSBkbyBub3QgZGVmaW5lIGEgcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiwgQkZEIG11c3QgdXNlIHRoZQotZ2VuZXJpYyBsaW5rZXIgc3VwcG9ydCwgd2hpY2ggcmVxdWlyZXMgY29udmVydGluZyBhbGwgc3ltYm9scyBhbmQKLXJlbG9jYXRpb25zIGludG8gQkZEIEBzYW1we2FzeW1ib2x9IGFuZCBAc2FtcHthcmVsZW50fSBzdHJ1Y3R1cmVzLiAgSW4KLXRoaXMgY2FzZSwgcmVsb2NhdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IGNhbGxpbmcKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LCB3aGljaCB3aWxsIHVzZSB0aGUgaG93dG8gc3RydWN0dXJlcyB5b3UKLWhhdmUgZGVmaW5lZC4gIEB4cmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KLQotSW4gb3JkZXIgdG8gc3VwcG9ydCBsaW5raW5nIGludG8gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0LCBzdWNoIGFzCi1TLXJlY29yZHMsIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IG11c3Qgd29yayBjb3JyZWN0bHkgd2l0aCB5b3VyCi1ob3d0byBzdHJ1Y3R1cmVzLCBzbyB5b3UgY2FuJ3Qgc2tpcCB0aGF0IHN0ZXAuICBIb3dldmVyLCBpZiB5b3UgZGVmaW5lCi10aGUgcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiwgdGhlbiBpbiB0aGUgbm9ybWFsIGNhc2Ugb2YgbGlua2luZyBpbnRvCi1hbiBFTEYgZmlsZSB0aGUgbGlua2VyIHdpbGwgbm90IG5lZWQgdG8gY29udmVydCBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucywKLWFuZCB3aWxsIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQuCi0KLVRvIHVzZSBhIHJlbG9jYXRpb24gc2VjdGlvbiBmdW5jdGlvbiwgZGVmaW5lIHRoZSBtYWNybwotQHNhbXB7ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbn0gYXMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB3aGljaCB3aWxsCi10YWtlIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24sIGFzIHdlbGwgYXMgcmVsb2NhdGlvbiwgc3ltYm9sLCBhbmQgb3RoZXIKLWluZm9ybWF0aW9uLCBhbmQgbW9kaWZ5IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFjY29yZGluZyB0byB0aGUgcmVsb2NhdGlvbgotaW5mb3JtYXRpb24uICBJbiBzaW1wbGUgY2FzZXMsIHRoaXMgaXMgbGl0dGxlIG1vcmUgdGhhbiBhIGxvb3Agb3ZlciB0aGUKLXJlbG9jYXRpb25zIHdoaWNoIGNvbXB1dGVzIHRoZSB2YWx1ZSBvZiBlYWNoIHJlbG9jYXRpb24gYW5kIGNhbGxzCi1Ac2FtcHtfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGV9LiAgVGhlIGZ1bmN0aW9uIG11c3QgY2hlY2sgZm9yIGEKLXJlbG9jYXRlYWJsZSBsaW5rLCBhbmQgaW4gdGhhdCBjYXNlIG5vcm1hbGx5IG5lZWRzIHRvIGRvIG5vdGhpbmcgb3RoZXIKLXRoYW4gYWRqdXN0IHRoZSBhZGRlbmQgZm9yIHJlbG9jYXRpb25zIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbC4KLQotVGhlIGNvbXBsZXggY2FzZXMgZ2VuZXJhbGx5IGhhdmUgdG8gZG8gd2l0aCBkeW5hbWljIGxpbmtlciBzdXBwb3J0LiAgR09UCi1hbmQgUExUIHJlbG9jYXRpb25zIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHksIGFuZCB0aGUgbGlua2VyIG5vcm1hbGx5Ci1hcnJhbmdlcyB0byBzZXQgdXAgdGhlIEdPVCBhbmQgUExUIHNlY3Rpb25zIHdoaWxlIGhhbmRsaW5nIHJlbG9jYXRpb25zLgotV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHJhbmRvbSByZWxvY2F0aW9ucyBtdXN0IG5vcm1hbGx5IGJlCi1jb3BpZWQgaW50byB0aGUgc2hhcmVkIGxpYnJhcnksIG9yIGNvbnZlcnRlZCB0byBSRUxBVElWRSByZWxvY2F0aW9ucwotd2hlbiBwb3NzaWJsZS4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3Igb3RoZXIKLUBzdWJzdWJzZWN0aW9uIE90aGVyIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IG9wdGlvbnMKLQotVGhlcmUgYXJlIG1hbnkgb3RoZXIgbWFjcm9zIHdoaWNoIG1heSBiZSBkZWZpbmVkIGluCi1AZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30uICBUaGVzZSBtYWNyb3MgbWF5IGJlIGZvdW5kIGluCi1AZmlsZXtlbGZ4eC10YXJnZXQuaH0uCi0KLU1hY3JvcyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSBzb21lIG9mIHRoZSBnZW5lcmljIEVMRiB0YXJnZXQgdmVjdG9yCi1mdW5jdGlvbnMuCi0KLVNldmVyYWwgcHJvY2Vzc29yIHNwZWNpZmljIGhvb2sgZnVuY3Rpb25zIHdoaWNoIG1heSBiZSBkZWZpbmVkIGFzCi1tYWNyb3MuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGZvdW5kIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoZQotQHNhbXB7ZWxmX2JhY2tlbmRfZGF0YX0gc3RydWN0dXJlIGRlZmluZWQgaW4gQGZpbGV7ZWxmLWJmZC5ofS4gIEluCi1nZW5lcmFsLCBhIGhvb2sgZnVuY3Rpb24gaXMgc2V0IGJ5IGRlZmluaW5nIGEgbWFjcm8KLUBzYW1we2VsZl9iYWNrZW5kX0B2YXJ7bmFtZX19LgotCi1UaGVyZSBhcmUgYSBmZXcgcHJvY2Vzc29yIHNwZWNpZmljIGNvbnN0YW50cyB3aGljaCBtYXkgYWxzbyBiZSBkZWZpbmVkLgotVGhlc2UgYXJlIGFnYWluIGZvdW5kIGluIHRoZSBAc2FtcHtlbGZfYmFja2VuZF9kYXRhfSBzdHJ1Y3R1cmUuCi0KLUkgd2lsbCBub3QgZGVmaW5lIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGhlcmU7IHNlZSB0aGUKLWNvbW1lbnRzIGluIEBmaWxle2VsZi1iZmQuaH0uCi0KLU5vcm1hbGx5IGFueSBvZGQgY2hhcmFjdGVyaXN0aWMgb2YgYSBwYXJ0aWN1bGFyIEVMRiBwcm9jZXNzb3IgaXMgaGFuZGxlZAotdmlhIGEgaG9vayBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCB0aGUgc3BlY2lhbCBAc2FtcHtTSE5fTUlQU19TQ09NTU9OfQotc2VjdGlvbiBudW1iZXIgZm91bmQgaW4gTUlQUyBFTEYgaXMgaGFuZGxlZCB2aWEgdGhlIGhvb2tzCi1Ac2FtcHtzZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb259LCBAc2FtcHtzeW1ib2xfcHJvY2Vzc2luZ30sCi1Ac2FtcHthZGRfc3ltYm9sX2hvb2t9LCBhbmQgQHNhbXB7b3V0cHV0X3N5bWJvbF9ob29rfS4KLQotRHluYW1pYyBsaW5raW5nIHN1cHBvcnQsIHdoaWNoIGludm9sdmVzIHByb2Nlc3NvciBzcGVjaWZpYyByZWxvY2F0aW9ucwotcmVxdWlyaW5nIHNwZWNpYWwgaGFuZGxpbmcsIGlzIGFsc28gaW1wbGVtZW50ZWQgdmlhIGhvb2sgZnVuY3Rpb25zLgotCi1Abm9kZSBCRkQgRUxGIGNvcmUgZmlsZXMKLUBzdWJzZWN0aW9uIEJGRCBFTEYgY29yZSBmaWxlcwotQGNpbmRleCBlbGYgY29yZSBmaWxlcwotCi1PbiBuYXRpdmUgRUxGIFVuaXggc3lzdGVtcywgY29yZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIHdpdGhvdXQgYW55Ci1zZWN0aW9ucy4gIEluc3RlYWQsIHRoZXkgb25seSBoYXZlIHByb2dyYW0gc2VnbWVudHMuCi0KLVdoZW4gQkZEIGlzIHVzZWQgdG8gcmVhZCBhbiBFTEYgY29yZSBmaWxlLCB0aGUgQkZEIHNlY3Rpb25zIHdpbGwKLWFjdHVhbGx5IHJlcHJlc2VudCBwcm9ncmFtIHNlZ21lbnRzLiAgU2luY2UgRUxGIHByb2dyYW0gc2VnbWVudHMgZG8gbm90Ci1oYXZlIG5hbWVzLCBCRkQgd2lsbCBpbnZlbnQgbmFtZXMgbGlrZSBAc2FtcHtzZWdtZW50QHZhcntufX0gd2hlcmUKLUB2YXJ7bn0gaXMgYSBudW1iZXIuCi0KLUEgc2luZ2xlIEVMRiBwcm9ncmFtIHNlZ21lbnQgbWF5IGluY2x1ZGUgYm90aCBhbiBpbml0aWFsaXplZCBwYXJ0IGFuZCBhbgotdW5pbml0aWFsaXplZCBwYXJ0LiAgVGhlIHNpemUgb2YgdGhlIGluaXRpYWxpemVkIHBhcnQgaXMgZ2l2ZW4gYnkgdGhlCi1Ac2FtcHtwX2ZpbGVzen0gZmllbGQuICBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgc2VnbWVudCBpcyBnaXZlbiBieSB0aGUKLUBzYW1we3BfbWVtc3p9IGZpZWxkLiAgSWYgQHNhbXB7cF9tZW1zen0gaXMgbGFyZ2VyIHRoYW4gQHNhbXB7cF9maWxlc3p9LAotdGhlbiB0aGUgZXh0cmEgc3BhY2UgaXMgdW5pbml0aWFsaXplZCwgb3IsIG1vcmUgcHJlY2lzZWx5LCBpbml0aWFsaXplZAotdG8gemVyby4KLQotQkZEIHdpbGwgcmVwcmVzZW50IHN1Y2ggYSBwcm9ncmFtIHNlZ21lbnQgYXMgdHdvIGRpZmZlcmVudCBzZWN0aW9ucy4KLVRoZSBmaXJzdCwgbmFtZWQgQHNhbXB7c2VnbWVudEB2YXJ7bn1hfSwgd2lsbCByZXByZXNlbnQgdGhlIGluaXRpYWxpemVkCi1wYXJ0IG9mIHRoZSBwcm9ncmFtIHNlZ21lbnQuICBUaGUgc2Vjb25kLCBuYW1lZCBAc2FtcHtzZWdtZW50QHZhcntufWJ9LAotd2lsbCByZXByZXNlbnQgdGhlIHVuaW5pdGlhbGl6ZWQgcGFydC4KLQotRUxGIGNvcmUgZmlsZXMgc3RvcmUgc3BlY2lhbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlZ2lzdGVyIHZhbHVlcyBpbgotcHJvZ3JhbSBzZWdtZW50cyB3aXRoIHRoZSB0eXBlIEBzYW1we1BUX05PVEV9LiAgQkZEIHdpbGwgYXR0ZW1wdCB0bwotaW50ZXJwcmV0IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBzZWdtZW50cywgYW5kIHdpbGwgY3JlYXRlIGFkZGl0aW9uYWwKLXNlY3Rpb25zIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uLiAgU29tZSBvZiB0aGlzIGludGVycHJldGF0aW9uIHJlcXVpcmVzCi1pbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgaG9zdCBoZWFkZXIgZmlsZSBAZmlsZXtzeXMvcHJvY2ZzLmh9LCBhbmQgc28KLXdpbGwgb25seSB3b3JrIHdoZW4gQkZEIGlzIGJ1aWx0IG9uIGEgbmF0aXZlIHN5c3RlbS4KLQotQkZEIGRvZXMgbm90IGN1cnJlbnRseSBwcm92aWRlIGFueSB3YXkgdG8gY3JlYXRlIGFuIEVMRiBjb3JlIGZpbGUuICBJbgotZ2VuZXJhbCwgQkZEIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gY3JlYXRlIGNvcmUgZmlsZXMuICBUaGUgd2F5IHRvCi1pbXBsZW1lbnQgdGhpcyB3b3VsZCBiZSB0byB3cml0ZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kCi1Ac2FtcHtiZmRfd3JpdGVfY29udGVudHN9IHJvdXRpbmVzIGZvciB0aGUgQHNhbXB7YmZkX2NvcmV9IHR5cGU7IHNlZQotQHJlZntCRkQgdGFyZ2V0IHZlY3RvciBmb3JtYXR9LgotCi1Abm9kZSBCRkQgRUxGIGZ1dHVyZQotQHN1YnNlY3Rpb24gQkZEIEVMRiBmdXR1cmUKLQotVGhlIGN1cnJlbnQgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQgaGFzIHRvbyBtdWNoIGNvZGUgZHVwbGljYXRpb24uCi1XaGlsZSBlYWNoIHByb2Nlc3NvciBoYXMgcGFydGljdWxhciBkaWZmZXJlbmNlcywgbXVjaCBvZiB0aGUgZHluYW1pYwotbGlua2luZyBzdXBwb3J0IGlzIHF1aXRlIHNpbWlsYXIgZm9yIGVhY2ggcHJvY2Vzc29yLiAgVGhlIEdPVCBhbmQgUExUCi1hcmUgaGFuZGxlZCBpbiBmYWlybHkgc2ltaWxhciB3YXlzLCB0aGUgZGV0YWlscyBvZiAtQnN5bWJvbGljIGxpbmtpbmcKLWFyZSBnZW5lcmFsbHkgc2ltaWxhciwgZXRjLiAgVGhpcyBjb2RlIHNob3VsZCBiZSByZXdvcmtlZCB0byB1c2UgbW9yZQotZ2VuZXJpYyBmdW5jdGlvbnMsIGVsaW1pbmF0aW5nIHRoZSBkdXBsaWNhdGlvbi4KLQotU2ltaWxhcmx5LCB0aGUgcmVsb2NhdGlvbiBoYW5kbGluZyBoYXMgdG9vIG11Y2ggZHVwbGljYXRpb24uICBNYW55IG9mCi10aGUgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9IGFuZCBAc2FtcHtpbmZvX3RvX2hvd3RvfSBmdW5jdGlvbnMgYXJlCi1xdWl0ZSBzaW1pbGFyLiAgVGhlIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb25zIGFyZSBhbHNvIG9mdGVuIHF1aXRlCi1zaW1pbGFyLCBib3RoIGluIHRoZSBzdGFuZGFyZCBsaW5rZXIgaGFuZGxpbmcgYW5kIHRoZSBkeW5hbWljIGxpbmtlcgotaGFuZGxpbmcuICBNYW55IG9mIHRoZSBDT0ZGIHByb2Nlc3NvciBzcGVjaWZpYyBiYWNrZW5kcyBzaGFyZSBhIHNpbmdsZQotcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiAoQHNhbXB7X2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbn0pLAotYW5kIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzIGZvciB0aGUgRUxGIHRhcmdldHMKLWFzIHdlbGwuCi0KLVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgbWFnaWMgbnVtYmVyIGluCi1Ac2FtcHtwcmVwX2hlYWRlcnN9IGluIEBmaWxle2VsZi5jfSBpcyBzb21ld2hhdCBib2d1cy4gIEl0IHNob3VsZCBiZQotcG9zc2libGUgdG8gYWRkIHN1cHBvcnQgZm9yIGEgbmV3IHByb2Nlc3NvciB3aXRob3V0IGNoYW5naW5nIHRoZSBnZW5lcmljCi1zdXBwb3J0LgotCi1UaGUgcHJvY2Vzc29yIGZ1bmN0aW9uIGhvb2tzIGFuZCBjb25zdGFudHMgYXJlIGFkIGhvYyBhbmQgbmVlZCBiZXR0ZXIKLWRvY3VtZW50YXRpb24uCi0KLVdoZW4gYSBsaW5rZXIgc2NyaXB0IHVzZXMgQHNhbXB7U0laRU9GX0hFQURFUlN9LCB0aGUgRUxGIGJhY2tlbmQgbXVzdAotZ3Vlc3MgYXQgdGhlIG51bWJlciBvZiBwcm9ncmFtIHNlZ21lbnRzIHdoaWNoIHdpbGwgYmUgcmVxdWlyZWQsIGluCi1Ac2FtcHtnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZX0uICBUaGlzIGlzIGJlY2F1c2UgdGhlIGxpbmtlciBjYWxscwotQHNhbXB7YmZkX3NpemVvZl9oZWFkZXJzfSBiZWZvcmUgaXQga25vd3MgYWxsIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBhbmQKLXNpemVzLiAgVGhlIEVMRiBiYWNrZW5kIG1heSBsYXRlciBkaXNjb3Zlciwgd2hlbiBjcmVhdGluZyBwcm9ncmFtCi1zZWdtZW50cywgdGhhdCBtb3JlIHByb2dyYW0gc2VnbWVudHMgYXJlIHJlcXVpcmVkLiAgVGhpcyBpcyBjdXJyZW50bHkKLXJlcG9ydGVkIGFzIGFuIGVycm9yIGluIEBzYW1we2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHN9LgotCi1JbiBwcmFjdGljZSB0aGlzIG1ha2VzIGl0IGRpZmZpY3VsdCB0byB1c2UgQHNhbXB7U0laRU9GX0hFQURFUlN9IGV4Y2VwdAotd2l0aCBhIGNhcmVmdWxseSBkZWZpbmVkIGxpbmtlciBzY3JpcHQuICBVbmZvcnR1bmF0ZWx5LAotQHNhbXB7U0laRU9GX0hFQURFUlN9IGlzIHJlcXVpcmVkIGZvciBmYXN0IHByb2dyYW0gbG9hZGluZyBvbiBhIG5hdGl2ZQotc3lzdGVtLCBzaW5jZSBpdCBwZXJtaXRzIHRoZSBpbml0aWFsIGNvZGUgc2VjdGlvbiB0byBhcHBlYXIgb24gdGhlIHNhbWUKLXBhZ2UgYXMgdGhlIHByb2dyYW0gc2VnbWVudHMsIHNhdmluZyBhIHBhZ2UgcmVhZCB3aGVuIHRoZSBwcm9ncmFtIHN0YXJ0cwotcnVubmluZy4gIEZvcnR1bmF0ZWx5LCBuYXRpdmUgc3lzdGVtcyBwZXJtaXQgY2FyZWZ1bCBkZWZpbml0aW9uIG9mIHRoZQotbGlua2VyIHNjcmlwdC4gIFN0aWxsLCBpZGVhbGx5IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSByZWxheGF0aW9uIHRvCi1jb21wdXRlIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cy4KLQotQG5vZGUgQkZEIGdsb3NzYXJ5Ci1Ac2VjdGlvbiBCRkQgZ2xvc3NhcnkKLUBjaW5kZXggZ2xvc3NhcnkgZm9yIGJmZAotQGNpbmRleCBiZmQgZ2xvc3NhcnkKLQotVGhpcyBpcyBhIHNob3J0IGdsb3NzYXJ5IG9mIHNvbWUgQkZEIHRlcm1zLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGEub3V0Ci1UaGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIG9yaWdpbmFsIFVuaXggb2JqZWN0IGZpbGUgZm9ybWF0LgotU3RpbGwgdXNlZCBvbiBTdW5PUywgdGhvdWdoIG5vdCBTb2xhcmlzLiAgU3VwcG9ydHMgb25seSB0aHJlZSBzZWN0aW9ucy4KLQotQGl0ZW0gYXJjaGl2ZQotQSBjb2xsZWN0aW9uIG9mIG9iamVjdCBmaWxlcyBwcm9kdWNlZCBhbmQgbWFuaXB1bGF0ZWQgYnkgdGhlIEBzYW1we2FyfQotcHJvZ3JhbS4KLQotQGl0ZW0gYmFja2VuZAotVGhlIGltcGxlbWVudGF0aW9uIHdpdGhpbiBCRkQgb2YgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQotc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBwYXJ0aWN1bGFyIHRhcmdldCB2ZWN0b3IuCi0KLUBpdGVtIEJGRAotVGhlIEJGRCBsaWJyYXJ5IGl0c2VsZi4gIEFsc28sIGVhY2ggb2JqZWN0IGZpbGUsIGFyY2hpdmUsIG9yIGV4ZWN0YWJsZQotb3BlbmVkIGJ5IHRoZSBCRkQgbGlicmFyeSBoYXMgdGhlIHR5cGUgQHNhbXB7YmZkICp9LCBhbmQgaXMgc29tZXRpbWVzCi1yZWZlcnJlZCB0byBhcyBhIGJmZC4KLQotQGl0ZW0gQ09GRgotVGhlIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQuICBVc2VkIG9uIFVuaXggU1ZSMy4gIFVzZWQgYnkgc29tZQotZW1iZWRkZWQgdGFyZ2V0cywgYWx0aG91Z2ggRUxGIGlzIG5vcm1hbGx5IGJldHRlci4KLQotQGl0ZW0gRExMCi1BIHNoYXJlZCBsaWJyYXJ5IG9uIFdpbmRvd3MuCi0KLUBpdGVtIGR5bmFtaWMgbGlua2VyCi1XaGVuIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IGlzIHJ1biwgdGhlIGR5bmFtaWMKLWxpbmtlciB3aWxsIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgc2hhcmVkIGxpYnJhcnkgYW5kIGFycmFuZ2UgdG8gc29tZWhvdwotaW5jbHVkZSBpdCBpbiB0aGUgcnVubmluZyBpbWFnZS4KLQotQGl0ZW0gZHluYW1pYyBvYmplY3QKLUFub3RoZXIgbmFtZSBmb3IgYW4gRUxGIHNoYXJlZCBsaWJyYXJ5LgotCi1AaXRlbSBFQ09GRgotVGhlIEV4dGVuZGVkIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQuICBVc2VkIG9uIEFscGhhIERpZ2l0YWwgVW5peAotKGZvcm1lcmx5IE9TRi8xKSwgYXMgd2VsbCBhcyBVbHRyaXggYW5kIElyaXggNC4gIEEgdmFyaWFudCBvZiBDT0ZGLgotCi1AaXRlbSBFTEYKLVRoZSBFeGVjdXRhYmxlIGFuZCBMaW5raW5nIEZvcm1hdC4gIFRoZSBvYmplY3QgZmlsZSBmb3JtYXQgdXNlZCBvbiBtb3N0Ci1tb2Rlcm4gVW5peCBzeXN0ZW1zLCBpbmNsdWRpbmcgR05VL0xpbnV4LCBTb2xhcmlzLCBJcml4LCBhbmQgU1ZSNC4gIEFsc28KLXVzZWQgb24gbWFueSBlbWJlZGRlZCBzeXN0ZW1zLgotCi1AaXRlbSBleGVjdXRhYmxlCi1BIHByb2dyYW0sIHdpdGggaW5zdHJ1Y3Rpb25zIGFuZCBzeW1ib2xzLCBhbmQgcGVyaGFwcyBkeW5hbWljIGxpbmtpbmcKLWluZm9ybWF0aW9uLiAgTm9ybWFsbHkgcHJvZHVjZWQgYnkgYSBsaW5rZXIuCi0KLUBpdGVtIExNQQotTG9hZCBNZW1vcnkgQWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggYSBzZWN0aW9uIHdpbGwgYmUKLWxvYWRlZC4gIENvbXBhcmUgd2l0aCBWTUEsIGJlbG93LgotCi1AaXRlbSBOTE0KLU5ldFdhcmUgTG9hZGFibGUgTW9kdWxlLiAgVXNlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIGFuIG9iamVjdCB3aGljaAotYmUgbG9hZGVkIGludG8gTmV0V2FyZSwgd2hpY2ggaXMgc29tZSBraW5kIG9mIFBDIGJhc2VkIG5ldHdvcmsgc2VydmVyCi1wcm9ncmFtLgotCi1AaXRlbSBvYmplY3QgZmlsZQotQSBiaW5hcnkgZmlsZSBpbmNsdWRpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbi4gIE5vcm1hbGx5IHByb2R1Y2VkIGJ5IGFuIGFzc2VtYmxlci4KLQotQGl0ZW0gb2JqZWN0IGZpbGUgZm9ybWF0Ci1UaGUgZm9ybWF0IG9mIGFuIG9iamVjdCBmaWxlLiAgVHlwaWNhbGx5IG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMKLWZvciBhIHBhcnRpY3VsYXIgc3lzdGVtIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQsIGFsdGhvdWdoIGV4ZWN1dGFibGVzCi13aWxsIG5vdCBjb250YWluIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCi1AaXRlbSBQRQotVGhlIFBvcnRhYmxlIEV4ZWN1dGFibGUgZm9ybWF0LiAgVGhpcyBpcyB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZWQgZm9yCi1XaW5kb3dzIChzcGVjaWZpY2FsbHksIFdpbjMyKSBvYmplY3QgZmlsZXMuICBJdCBpcyBiYXNlZCBjbG9zZWx5IG9uCi1DT0ZGLCBidXQgaGFzIGEgZmV3IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLgotCi1AaXRlbSBQRUkKLVRoZSBQb3J0YWJsZSBFeGVjdXRhYmxlIEltYWdlIGZvcm1hdC4gIFRoaXMgaXMgdGhlIG9iamVjdCBmaWxlIGZvcm1hdAotdXNlZCBmb3IgV2luZG93cyAoc3BlY2lmaWNhbGx5LCBXaW4zMikgZXhlY3V0YWJsZXMuICBJdCBpcyB2ZXJ5IHNpbWlsYXIKLXRvIFBFLCBidXQgaW5jbHVkZXMgc29tZSBhZGRpdGlvbmFsIGhlYWRlciBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gcmVsb2NhdGlvbnMKLUluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIGxpbmtlciB0byBhZGp1c3Qgc2VjdGlvbiBjb250ZW50cy4gIEFsc28gY2FsbGVkCi1yZWxvY3MuCi0KLUBpdGVtIHNlY3Rpb24KLU9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZSBhcmUgY29tcG9zZWQgb2Ygc2VjdGlvbnMuICBTZWN0aW9ucyBoYXZlCi1vcHRpb25hbCBkYXRhIGFuZCBvcHRpb25hbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCi1AaXRlbSBzaGFyZWQgbGlicmFyeQotQSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB3aGljaCBtYXkgYmUgdXNlZCBieSBtYW55IGV4ZWN1dGFibGVzIHdpdGhvdXQKLWFjdHVhbGx5IGJlaW5nIGxpbmtlZCBpbnRvIGVhY2ggZXhlY3V0YWJsZS4gIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudAotaW1wbGVtZW50YXRpb25zIG9mIHNoYXJlZCBsaWJyYXJpZXMsIGVhY2ggaGF2aW5nIHNsaWdodGx5IGRpZmZlcmVudAotZmVhdHVyZXMuCi0KLUBpdGVtIHN5bWJvbAotRWFjaCBvYmplY3QgZmlsZSBhbmQgZXhlY3V0YWJsZSBtYXkgaGF2ZSBhIGxpc3Qgb2Ygc3ltYm9scywgb2Z0ZW4KLXJlZmVycmVkIHRvIGFzIHRoZSBzeW1ib2wgdGFibGUuICBBIHN5bWJvbCBpcyBiYXNpY2FsbHkgYSBuYW1lIGFuZCBhbgotYWRkcmVzcy4gIFRoZXJlIG1heSBhbHNvIGJlIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlIHRoZSB0eXBlIG9mCi1zeW1ib2wsIGFsdGhvdWdoIHRoZSB0eXBlIG9mIGEgc3ltYm9sIGlzIG5vcm1hbGx5IHNvbWV0aGluZyBzaW1wbGUgbGlrZQotZnVuY3Rpb24gb3Igb2JqZWN0LCBhbmQgc2hvdWxkIGJlIGNvbmZ1c2VkIHdpdGggdGhlIG1vcmUgY29tcGxleCBDCi1ub3Rpb24gb2YgdHlwZS4gIFR5cGljYWxseSBldmVyeSBnbG9iYWwgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGluIGEgQwotcHJvZ3JhbSB3aWxsIGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wuCi0KLUBpdGVtIHRhcmdldCB2ZWN0b3IKLUEgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCi1mb3JtYXQuICBUaGUgQHNhbXB7YmZkX3RhcmdldH0gc3RydWN0dXJlLgotCi1AaXRlbSBXaW4zMgotVGhlIGN1cnJlbnQgV2luZG93cyBBUEksIGltcGxlbWVudGVkIGJ5IFdpbmRvd3MgOTUgYW5kIGxhdGVyIGFuZCBXaW5kb3dzCi1OVCAzLjUxIGFuZCBsYXRlciwgYnV0IG5vdCBieSBXaW5kb3dzIDMuMS4KLQotQGl0ZW0gWENPRkYKLVRoZSBlWHRlbmRlZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBBSVguICBBIHZhcmlhbnQgb2YKLUNPRkYsIHdpdGggYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzeW1ib2wgdGFibGUgaW1wbGVtZW50YXRpb24uCi0KLUBpdGVtIFZNQQotVmlydHVhbCBNZW1vcnkgQWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYSBzZWN0aW9uIHdpbGwgaGF2ZSB3aGVuCi1hbiBleGVjdXRhYmxlIGlzIHJ1bi4gIENvbXBhcmUgd2l0aCBMTUEsIGFib3ZlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWRzZWMgSW5kZXgKLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmRzdW1tLnRleGkgYi9iZmQvZG9jL2JmZHN1bW0udGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0NTMxYS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2JmZHN1bW0udGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi1AYyBUaGlzIHN1bW1hcnkgb2YgQkZEIGlzIHNoYXJlZCBieSB0aGUgQkZEIGFuZCBMRCBkb2NzLgotV2hlbiBhbiBvYmplY3QgZmlsZSBpcyBvcGVuZWQsIEJGRCBzdWJyb3V0aW5lcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZQotdGhlIGZvcm1hdCBvZiB0aGUgaW5wdXQgb2JqZWN0IGZpbGUuICBUaGV5IHRoZW4gYnVpbGQgYSBkZXNjcmlwdG9yIGluCi1tZW1vcnkgd2l0aCBwb2ludGVycyB0byByb3V0aW5lcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhY2Nlc3MgZWxlbWVudHMgb2YKLXRoZSBvYmplY3QgZmlsZSdzIGRhdGEgc3RydWN0dXJlcy4KLQotQXMgZGlmZmVyZW50IGluZm9ybWF0aW9uIGZyb20gdGhlIHRoZSBvYmplY3QgZmlsZXMgaXMgcmVxdWlyZWQsCi1CRkQgcmVhZHMgZnJvbSBkaWZmZXJlbnQgc2VjdGlvbnMgb2YgdGhlIGZpbGUgYW5kIHByb2Nlc3NlcyB0aGVtLgotRm9yIGV4YW1wbGUsIGEgdmVyeSBjb21tb24gb3BlcmF0aW9uIGZvciB0aGUgbGlua2VyIGlzIHByb2Nlc3Npbmcgc3ltYm9sCi10YWJsZXMuICBFYWNoIEJGRCBiYWNrIGVuZCBwcm92aWRlcyBhIHJvdXRpbmUgZm9yIGNvbnZlcnRpbmcKLWJldHdlZW4gdGhlIG9iamVjdCBmaWxlJ3MgcmVwcmVzZW50YXRpb24gb2Ygc3ltYm9scyBhbmQgYW4gaW50ZXJuYWwKLWNhbm9uaWNhbCBmb3JtYXQuIFdoZW4gdGhlIGxpbmtlciBhc2tzIGZvciB0aGUgc3ltYm9sIHRhYmxlIG9mIGFuIG9iamVjdAotZmlsZSwgaXQgY2FsbHMgdGhyb3VnaCBhIG1lbW9yeSBwb2ludGVyIHRvIHRoZSByb3V0aW5lIGZyb20gdGhlCi1yZWxldmFudCBCRkQgYmFjayBlbmQgd2hpY2ggcmVhZHMgYW5kIGNvbnZlcnRzIHRoZSB0YWJsZSBpbnRvIGEgY2Fub25pY2FsCi1mb3JtLiAgVGhlIGxpbmtlciB0aGVuIG9wZXJhdGVzIHVwb24gdGhlIGNhbm9uaWNhbCBmb3JtLiBXaGVuIHRoZSBsaW5rIGlzCi1maW5pc2hlZCBhbmQgdGhlIGxpbmtlciB3cml0ZXMgdGhlIG91dHB1dCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLAotYW5vdGhlciBCRkQgYmFjayBlbmQgcm91dGluZSBpcyBjYWxsZWQgdG8gdGFrZSB0aGUgbmV3bHkKLWNyZWF0ZWQgc3ltYm9sIHRhYmxlIGFuZCBjb252ZXJ0IGl0IGludG8gdGhlIGNob3NlbiBvdXRwdXQgZm9ybWF0LgotCi1AbWVudQotKiBCRkQgaW5mb3JtYXRpb24gbG9zczo6CUluZm9ybWF0aW9uIExvc3MKLSogQ2Fub25pY2FsIGZvcm1hdDo6CQlUaGUgQkZECWNhbm9uaWNhbCBvYmplY3QtZmlsZSBmb3JtYXQgCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIGluZm9ybWF0aW9uIGxvc3MKLUBzdWJzZWN0aW9uIEluZm9ybWF0aW9uIExvc3MKLQotQGVtcGh7SW5mb3JtYXRpb24gY2FuIGJlIGxvc3QgZHVyaW5nIG91dHB1dC59IFRoZSBvdXRwdXQgZm9ybWF0cwotc3VwcG9ydGVkIGJ5IEJGRCBkbyBub3QgcHJvdmlkZSBpZGVudGljYWwgZmFjaWxpdGllcywgYW5kCi1pbmZvcm1hdGlvbiB3aGljaCBjYW4gYmUgZGVzY3JpYmVkIGluIG9uZSBmb3JtIGhhcyBub3doZXJlIHRvIGdvIGluCi1hbm90aGVyIGZvcm1hdC4gT25lIGV4YW1wbGUgb2YgdGhpcyBpcyBhbGlnbm1lbnQgaW5mb3JtYXRpb24gaW4KLUBjb2Rle2Iub3V0fS4gVGhlcmUgaXMgbm93aGVyZSBpbiBhbiBAY29kZXthLm91dH0gZm9ybWF0IGZpbGUgdG8gc3RvcmUKLWFsaWdubWVudCBpbmZvcm1hdGlvbiBvbiB0aGUgY29udGFpbmVkIGRhdGEsIHNvIHdoZW4gYSBmaWxlIGlzIGxpbmtlZAotZnJvbSBAY29kZXtiLm91dH0gYW5kIGFuIEBjb2Rle2Eub3V0fSBpbWFnZSBpcyBwcm9kdWNlZCwgYWxpZ25tZW50Ci1pbmZvcm1hdGlvbiB3aWxsIG5vdCBwcm9wYWdhdGUgdG8gdGhlIG91dHB1dCBmaWxlLiAoVGhlIGxpbmtlciB3aWxsCi1zdGlsbCB1c2UgdGhlIGFsaWdubWVudCBpbmZvcm1hdGlvbiBpbnRlcm5hbGx5LCBzbyB0aGUgbGluayBpcyBwZXJmb3JtZWQKLWNvcnJlY3RseSkuCi0KLUFub3RoZXIgZXhhbXBsZSBpcyBDT0ZGIHNlY3Rpb24gbmFtZXMuIENPRkYgZmlsZXMgbWF5IGNvbnRhaW4gYW4KLXVubGltaXRlZCBudW1iZXIgb2Ygc2VjdGlvbnMsIGVhY2ggb25lIHdpdGggYSB0ZXh0dWFsIHNlY3Rpb24gbmFtZS4gSWYKLXRoZSB0YXJnZXQgb2YgdGhlIGxpbmsgaXMgYSBmb3JtYXQgd2hpY2ggZG9lcyBub3QgaGF2ZSBtYW55IHNlY3Rpb25zIChlLmcuLAotQGNvZGV7YS5vdXR9KSBvciBoYXMgc2VjdGlvbnMgd2l0aG91dCBuYW1lcyAoZS5nLiwgdGhlIE9hc3lzIGZvcm1hdCksIHRoZQotbGluayBjYW5ub3QgYmUgZG9uZSBzaW1wbHkuIFlvdSBjYW4gY2lyY3VtdmVudCB0aGlzIHByb2JsZW0gYnkKLWRlc2NyaWJpbmcgdGhlIGRlc2lyZWQgaW5wdXQtdG8tb3V0cHV0IHNlY3Rpb24gbWFwcGluZyB3aXRoIHRoZSBsaW5rZXIgY29tbWFuZAotbGFuZ3VhZ2UuCi0KLUBlbXBoe0luZm9ybWF0aW9uIGNhbiBiZSBsb3N0IGR1cmluZyBjYW5vbmljYWxpemF0aW9uLn0gVGhlIEJGRAotaW50ZXJuYWwgY2Fub25pY2FsIGZvcm0gb2YgdGhlIGV4dGVybmFsIGZvcm1hdHMgaXMgbm90IGV4aGF1c3RpdmU7IHRoZXJlCi1hcmUgc3RydWN0dXJlcyBpbiBpbnB1dCBmb3JtYXRzIGZvciB3aGljaCB0aGVyZSBpcyBubyBkaXJlY3QKLXJlcHJlc2VudGF0aW9uIGludGVybmFsbHkuICBUaGlzIG1lYW5zIHRoYXQgdGhlIEJGRCBiYWNrIGVuZHMKLWNhbm5vdCBtYWludGFpbiBhbGwgcG9zc2libGUgZGF0YSByaWNobmVzcyB0aHJvdWdoIHRoZSB0cmFuc2Zvcm1hdGlvbgotYmV0d2VlbiBleHRlcm5hbCB0byBpbnRlcm5hbCBhbmQgYmFjayB0byBleHRlcm5hbCBmb3JtYXRzLgotCi1UaGlzIGxpbWl0YXRpb24gaXMgb25seSBhIHByb2JsZW0gd2hlbiBhbiBhcHBsaWNhdGlvbiByZWFkcyBvbmUKLWZvcm1hdCBhbmQgd3JpdGVzIGFub3RoZXIuICBFYWNoIEJGRCBiYWNrIGVuZCBpcyByZXNwb25zaWJsZSBmb3IKLW1haW50YWluaW5nIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHRoZSBpbnRlcm5hbCBCRkQKLWNhbm9uaWNhbCBmb3JtIGhhcyBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBvcGFxdWUgdG8gdGhlIEJGRCBjb3JlLAotYW5kIGV4cG9ydGVkIG9ubHkgdG8gdGhlIGJhY2sgZW5kcy4gV2hlbiBhIGZpbGUgaXMgcmVhZCBpbiBvbmUgZm9ybWF0LAotdGhlIGNhbm9uaWNhbCBmb3JtIGlzIGdlbmVyYXRlZCBmb3IgQkZEIGFuZCB0aGUgYXBwbGljYXRpb24uIEF0IHRoZQotc2FtZSB0aW1lLCB0aGUgYmFjayBlbmQgc2F2ZXMgYXdheSBhbnkgaW5mb3JtYXRpb24gd2hpY2ggbWF5IG90aGVyd2lzZQotYmUgbG9zdC4gSWYgdGhlIGRhdGEgaXMgdGhlbiB3cml0dGVuIGJhY2sgaW4gdGhlIHNhbWUgZm9ybWF0LCB0aGUgYmFjawotZW5kIHJvdXRpbmUgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgY2Fub25pY2FsIGZvcm0gcHJvdmlkZWQgYnkgdGhlCi1CRkQgY29yZSBhcyB3ZWxsIGFzIHRoZSBpbmZvcm1hdGlvbiBpdCBwcmVwYXJlZCBlYXJsaWVyLiAgU2luY2UKLXRoZXJlIGlzIGEgZ3JlYXQgZGVhbCBvZiBjb21tb25hbGl0eSBiZXR3ZWVuIGJhY2sgZW5kcywKLXRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIGxvc3Qgd2hlbgotbGlua2luZyBvciBjb3B5aW5nIGJpZyBlbmRpYW4gQ09GRiB0byBsaXR0bGUgZW5kaWFuIENPRkYsIG9yIEBjb2Rle2Eub3V0fSB0bwotQGNvZGV7Yi5vdXR9LiAgV2hlbiBhIG1peHR1cmUgb2YgZm9ybWF0cyBpcyBsaW5rZWQsIHRoZSBpbmZvcm1hdGlvbiBpcwotb25seSBsb3N0IGZyb20gdGhlIGZpbGVzIHdob3NlIGZvcm1hdCBkaWZmZXJzIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotCi1Abm9kZSBDYW5vbmljYWwgZm9ybWF0Ci1Ac3Vic2VjdGlvbiBUaGUgQkZEIGNhbm9uaWNhbCBvYmplY3QtZmlsZSBmb3JtYXQKLQotVGhlIGdyZWF0ZXN0IHBvdGVudGlhbCBmb3IgbG9zcyBvZiBpbmZvcm1hdGlvbiBvY2N1cnMgd2hlbiB0aGVyZSBpcyB0aGUgbGVhc3QKLW92ZXJsYXAgYmV0d2VlbiB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBmb3JtYXQsIHRoYXQKLXN0b3JlZCBieSB0aGUgY2Fub25pY2FsIGZvcm1hdCwgYW5kIHRoYXQgbmVlZGVkIGJ5IHRoZQotZGVzdGluYXRpb24gZm9ybWF0LiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBjYW5vbmljYWwgZm9ybSBtYXkgaGVscAoteW91IHVuZGVyc3RhbmQgd2hpY2gga2luZHMgb2YgZGF0YSB5b3UgY2FuIGNvdW50IG9uIHByZXNlcnZpbmcgYWNyb3NzCi1jb252ZXJzaW9ucy4KLUBjaW5kZXggQkZEIGNhbm9uaWNhbCBmb3JtYXQKLUBjaW5kZXggaW50ZXJuYWwgb2JqZWN0LWZpbGUgZm9ybWF0Ci0KLUB0YWJsZSBAZW1waAotQGl0ZW0gZmlsZXMKLUluZm9ybWF0aW9uIHN0b3JlZCBvbiBhIHBlci1maWxlIGJhc2lzIGluY2x1ZGVzIHRhcmdldCBtYWNoaW5lCi1hcmNoaXRlY3R1cmUsIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZm9ybWF0IHR5cGUsIGEgZGVtYW5kIHBhZ2VhYmxlCi1iaXQsIGFuZCBhIHdyaXRlIHByb3RlY3RlZCBiaXQuICBJbmZvcm1hdGlvbiBsaWtlIFVuaXggbWFnaWMgbnVtYmVycyBpcwotbm90IHN0b3JlZCBoZXJlLS0tb25seSB0aGUgbWFnaWMgbnVtYmVycycgbWVhbmluZywgc28gYSBAY29kZXtaTUFHSUN9Ci1maWxlIHdvdWxkIGhhdmUgYm90aCB0aGUgZGVtYW5kIHBhZ2VhYmxlIGJpdCBhbmQgdGhlIHdyaXRlIHByb3RlY3RlZAotdGV4dCBiaXQgc2V0LiAgVGhlIGJ5dGUgb3JkZXIgb2YgdGhlIHRhcmdldCBpcyBzdG9yZWQgb24gYSBwZXItZmlsZQotYmFzaXMsIHNvIHRoYXQgYmlnLSBhbmQgbGl0dGxlLWVuZGlhbiBvYmplY3QgZmlsZXMgbWF5IGJlIHVzZWQgd2l0aCBvbmUKLWFub3RoZXIuCi0KLUBpdGVtIHNlY3Rpb25zCi1FYWNoIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24sIHRoZQotc2VjdGlvbidzIG9yaWdpbmFsIGFkZHJlc3MgaW4gdGhlIG9iamVjdCBmaWxlLCBzaXplIGFuZCBhbGlnbm1lbnQKLWluZm9ybWF0aW9uLCB2YXJpb3VzIGZsYWdzLCBhbmQgcG9pbnRlcnMgaW50byBvdGhlciBCRkQgZGF0YQotc3RydWN0dXJlcy4KLQotQGl0ZW0gc3ltYm9scwotRWFjaCBzeW1ib2wgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG9iamVjdCBmaWxlCi13aGljaCBvcmlnaW5hbGx5IGRlZmluZWQgaXQsIGl0cyBuYW1lLCBpdHMgdmFsdWUsIGFuZCB2YXJpb3VzIGZsYWcKLWJpdHMuICBXaGVuIGEgQkZEIGJhY2sgZW5kIHJlYWRzIGluIGEgc3ltYm9sIHRhYmxlLCBpdCByZWxvY2F0ZXMgYWxsCi1zeW1ib2xzIHRvIG1ha2UgdGhlbSByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiB0aGUgc2VjdGlvbiB3aGVyZSB0aGV5IHdlcmUKLWRlZmluZWQuICBEb2luZyB0aGlzIGVuc3VyZXMgdGhhdCBlYWNoIHN5bWJvbCBwb2ludHMgdG8gaXRzIGNvbnRhaW5pbmcKLXNlY3Rpb24uICBFYWNoIHN5bWJvbCBhbHNvIGhhcyBhIHZhcnlpbmcgYW1vdW50IG9mIGhpZGRlbiBwcml2YXRlIGRhdGEKLWZvciB0aGUgQkZEIGJhY2sgZW5kLiAgU2luY2UgdGhlIHN5bWJvbCBwb2ludHMgdG8gdGhlIG9yaWdpbmFsIGZpbGUsIHRoZQotcHJpdmF0ZSBkYXRhIGZvcm1hdCBmb3IgdGhhdCBzeW1ib2wgaXMgYWNjZXNzaWJsZS4gIEBjb2Rle2xkfSBjYW4KLW9wZXJhdGUgb24gYSBjb2xsZWN0aW9uIG9mIHN5bWJvbHMgb2Ygd2lsZGx5IGRpZmZlcmVudCBmb3JtYXRzIHdpdGhvdXQKLXByb2JsZW1zLgotCi1Ob3JtYWwgZ2xvYmFsIGFuZCBzaW1wbGUgbG9jYWwgc3ltYm9scyBhcmUgbWFpbnRhaW5lZCBvbiBvdXRwdXQsIHNvIGFuCi1vdXRwdXQgZmlsZSAobm8gbWF0dGVyIGl0cyBmb3JtYXQpIHdpbGwgcmV0YWluIHN5bWJvbHMgcG9pbnRpbmcgdG8KLWZ1bmN0aW9ucyBhbmQgdG8gZ2xvYmFsLCBzdGF0aWMsIGFuZCBjb21tb24gdmFyaWFibGVzLiAgU29tZSBzeW1ib2wKLWluZm9ybWF0aW9uIGlzIG5vdCB3b3J0aCByZXRhaW5pbmc7IGluIEBjb2Rle2Eub3V0fSwgdHlwZSBpbmZvcm1hdGlvbiBpcwotc3RvcmVkIGluIHRoZSBzeW1ib2wgdGFibGUgYXMgbG9uZyBzeW1ib2wgbmFtZXMuICBUaGlzIGluZm9ybWF0aW9uIHdvdWxkCi1iZSB1c2VsZXNzIHRvIG1vc3QgQ09GRiBkZWJ1Z2dlcnM7IHRoZSBsaW5rZXIgaGFzIGNvbW1hbmQgbGluZSBzd2l0Y2hlcwotdG8gYWxsb3cgdXNlcnMgdG8gdGhyb3cgaXQgYXdheS4KLQotVGhlcmUgaXMgb25lIHdvcmQgb2YgdHlwZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIHN5bWJvbCwgc28gaWYgdGhlCi1mb3JtYXQgc3VwcG9ydHMgc3ltYm9sIHR5cGUgaW5mb3JtYXRpb24gd2l0aGluIHN5bWJvbHMgKGZvciBleGFtcGxlLCBDT0ZGLAotSUVFRSwgT2FzeXMpIGFuZCB0aGUgdHlwZSBpcyBzaW1wbGUgZW5vdWdoIHRvIGZpdCB3aXRoaW4gb25lIHdvcmQKLShuZWFybHkgZXZlcnl0aGluZyBidXQgYWdncmVnYXRlcyksIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHByZXNlcnZlZC4KLQotQGl0ZW0gcmVsb2NhdGlvbiBsZXZlbAotRWFjaCBjYW5vbmljYWwgQkZEIHJlbG9jYXRpb24gcmVjb3JkIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sIHRvCi1yZWxvY2F0ZSB0bywgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWxvY2F0ZSwgdGhlIHNlY3Rpb24gdGhlIGRhdGEKLWlzIGluLCBhbmQgYSBwb2ludGVyIHRvIGEgcmVsb2NhdGlvbiB0eXBlIGRlc2NyaXB0b3IuIFJlbG9jYXRpb24gaXMKLXBlcmZvcm1lZCBieSBwYXNzaW5nIG1lc3NhZ2VzIHRocm91Z2ggdGhlIHJlbG9jYXRpb24gdHlwZQotZGVzY3JpcHRvciBhbmQgdGhlIHN5bWJvbCBwb2ludGVyLiBUaGVyZWZvcmUsIHJlbG9jYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQKLW9uIG91dHB1dCBkYXRhIHVzaW5nIGEgcmVsb2NhdGlvbiBtZXRob2QgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBvbmUgb2YgdGhlCi1pbnB1dCBmb3JtYXRzLiBGb3IgaW5zdGFuY2UsIE9hc3lzIHByb3ZpZGVzIGEgYnl0ZSByZWxvY2F0aW9uIGZvcm1hdC4KLUEgcmVsb2NhdGlvbiByZWNvcmQgcmVxdWVzdGluZyB0aGlzIHJlbG9jYXRpb24gdHlwZSB3b3VsZCBwb2ludAotaW5kaXJlY3RseSB0byBhIHJvdXRpbmUgdG8gcGVyZm9ybSB0aGlzLCBzbyB0aGUgcmVsb2NhdGlvbiBtYXkgYmUKLXBlcmZvcm1lZCBvbiBhIGJ5dGUgYmVpbmcgd3JpdHRlbiB0byBhIDY4ayBDT0ZGIGZpbGUsIGV2ZW4gdGhvdWdoIDY4ayBDT0ZGCi1oYXMgbm8gc3VjaCByZWxvY2F0aW9uIHR5cGUuCi0KLUBpdGVtIGxpbmUgbnVtYmVycwotT2JqZWN0IGZvcm1hdHMgY2FuIGNvbnRhaW4sIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvbWUgZm9ybSBvZiBtYXBwaW5nCi1iZXR3ZWVuIHN5bWJvbHMsIHNvdXJjZSBsaW5lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMgaW4gdGhlIG91dHB1dCBmaWxlLgotVGhlc2UgYWRkcmVzc2VzIGhhdmUgdG8gYmUgcmVsb2NhdGVkIGFsb25nIHdpdGggdGhlIHN5bWJvbCBpbmZvcm1hdGlvbi4KLUVhY2ggc3ltYm9sIHdpdGggYW4gYXNzb2NpYXRlZCBsaXN0IG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgcG9pbnRzIHRvIHRoZQotZmlyc3QgcmVjb3JkIG9mIHRoZSBsaXN0LiAgVGhlIGhlYWQgb2YgYSBsaW5lIG51bWJlciBsaXN0IGNvbnNpc3RzIG9mIGEKLXBvaW50ZXIgdG8gdGhlIHN5bWJvbCwgd2hpY2ggYWxsb3dzIGZpbmRpbmcgb3V0IHRoZSBhZGRyZXNzIG9mIHRoZQotZnVuY3Rpb24gd2hvc2UgbGluZSBudW1iZXIgaXMgYmVpbmcgZGVzY3JpYmVkLiBUaGUgcmVzdCBvZiB0aGUgbGlzdCBpcwotbWFkZSB1cCBvZiBwYWlyczogb2Zmc2V0cyBpbnRvIHRoZSBzZWN0aW9uIGFuZCBsaW5lIG51bWJlcnMuIEFueSBmb3JtYXQKLXdoaWNoIGNhbiBzaW1wbHkgZGVyaXZlIHRoaXMgaW5mb3JtYXRpb24gY2FuIHBhc3MgaXQgc3VjY2Vzc2Z1bGx5Ci1iZXR3ZWVuIGZvcm1hdHMgKENPRkYsIElFRUUgYW5kIE9hc3lzKS4KLUBlbmQgdGFibGUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvY2hldy5jIGIvYmZkL2RvYy9jaGV3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYTY5YzIuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9jaGV3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc5ICswLDAgQEAKLS8qIGNoZXcKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBzdGV2ZSBjaGFtYmVybGFpbiBAY3lnbnVzCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogWWV0IGFub3RoZXIgd2F5IG9mIGV4dHJhY3RpbmcgZG9jdW1lbnRhdGlvbiBmcm9tIHNvdXJjZS4KLSAgIE5vLCBJIGhhdmVuJ3QgZmluaXNoZWQgaXQgeWV0LCBidXQgSSBob3BlIHlvdSBwZW9wbGUgbGlrZSBpdCBiZXR0ZXIKLSAgIHRoYW4gdGhlIG9sZCB3YXkKLSAgCi0gICBzYWMKLQotICAgQmFzaWNhbGx5LCB0aGlzIGlzIGEgc29ydCBvZiBzdHJpbmcgZm9ydGgsIG1heWJlIHdlIHNob3VsZCBjYWxsIGl0Ci0gICBzdHJ1dGg/Ci0KLSAgIFlvdSBkZWZpbmUgbmV3IHdvcmRzIHRodXM6Ci0gICA6IDxuZXd3b3JkPiA8b2xkd29yZHM+IDsKLQotKi8KLQotLyogUHJpbWl0aXZlcyBwcm92aWRlZCBieSB0aGUgcHJvZ3JhbToKLQotICAgVHdvIHN0YWNrcyBhcmUgcHJvdmlkZWQsIGEgc3RyaW5nIHN0YWNrIGFuZCBhbiBpbnRlZ2VyIHN0YWNrLgotCi0gICBJbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXM6Ci0JaW50ZXJuYWxfd2FudGVkIC0gaW5kaWNhdGVzIHdoZXRoZXIgYC1pJyB3YXMgcGFzc2VkCi0JaW50ZXJuYWxfbW9kZSAtIHVzZXItc2V0dGFibGUKLQotICAgQ29tbWFuZHM6Ci0JcHVzaF90ZXh0Ci0JISAtIHBvcCB0b3Agb2YgaW50ZWdlciBzdGFjayBmb3IgYWRkcmVzcywgcG9wIG5leHQgZm9yIHZhbHVlOyBzdG9yZQotCUAgLSB0cmVhdCB2YWx1ZSBvbiBpbnRlZ2VyIHN0YWNrIGFzIHRoZSBhZGRyZXNzIG9mIGFuIGludGVnZXI7IHB1c2gKLQkJdGhhdCBpbnRlZ2VyIG9uIHRoZSBpbnRlZ2VyIHN0YWNrIGFmdGVyIHBvcHBpbmcgdGhlICJhZGRyZXNzIgotCWhlbGxvIC0gcHJpbnQgImhlbGxvXG4iIHRvIHN0ZG91dAotCXN0ZG91dCAtIHB1dCBzdGRvdXQgbWFya2VyIG9uIFRPUwotCXN0ZGVyciAtIHB1dCBzdGRlcnIgbWFya2VyIG9uIFRPUwotCXByaW50IC0gcHJpbnQgVE9TLTEgb24gVE9TIChlZzogImhlbGxvXG4iIHN0ZG91dCBwcmludCkKLQlza2lwX3Bhc3RfbmV3bGluZQotCWNhdHN0ciAtIGZuIGljYXRzdHIKLQljb3B5X3Bhc3RfbmV3bGluZSAtIGFwcGVuZCBpbnB1dCwgdXAgdG8gYW5kIGluY2x1ZGluZyBuZXdsaW5lIGludG8gVE9TCi0JZHVwIC0gZm4gb3RoZXJfZHVwCi0JZHJvcCAtIGRpc2NhcmQgVE9TCi0JaWRyb3AgLSBkaXR0bwotCXJlbWNoYXIgLSBkZWxldGUgbGFzdCBjaGFyYWN0ZXIgZnJvbSBUT1MKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCWRvX2ZhbmN5X3N0dWZmIC0gdHJhbnNsYXRlIDw8Zm9vPj4gdG8gQGNvZGV7Zm9vfSBpbiBUT1MKLQlidWxsZXRpemUgLSBpZiAibyIgbGluZXMgZm91bmQsIHByZXBlbmQgQGl0ZW1pemUgQGJ1bGxldCB0byBUT1MKLQkJYW5kIEBpdGVtIHRvIGVhY2ggIm8iIGxpbmU7IGFwcGVuZCBAZW5kIGl0ZW1pemUKLQljb3VyaWVyaXplIC0gcHV0IEBleGFtcGxlIGFyb3VuZCAuIGFuZCB8IGxpbmVzLCB0cmFuc2xhdGUgeyogKn0geyB9Ci0JZXhpdCAtIGZuIGNoZXdfZXhpdAotCXN3YXAKLQlvdXRwdXRkb3RzIC0gc3RyaXAgb3V0IGxpbmVzIHdpdGhvdXQgbGVhZGluZyBkb3RzCi0JcGFyYW1zdHVmZiAtIGNvbnZlcnQgZnVsbCBkZWNsYXJhdGlvbiBpbnRvICJQQVJBTVMiIGZvcm0gaWYgbm90IGFscmVhZHkKLQltYXliZWNhdHN0ciAtIGRvIGNhdHN0ciBpZiBpbnRlcm5hbF9tb2RlID09IGludGVybmFsX3dhbnRlZCwgZGlzY2FyZAotCQl2YWx1ZSBpbiBhbnkgY2FzZQotCXRyYW5zbGF0ZWNvbW1lbnRzIC0gdHVybiB7KiBhbmQgKn0gaW50byBjb21tZW50IGRlbGltaXRlcnMKLQlraWxsX2JvZ3VzX2xpbmVzIC0gZ2V0IHJpZCBvZiBleHRyYSBuZXdsaW5lcwotCWluZGVudAotCWludGVybmFsbW9kZSAtIHBvcCBmcm9tIGludGVnZXIgc3RhY2ssIHNldCBgaW50ZXJuYWxtb2RlJyB0byB0aGF0IHZhbHVlCi0JcHJpbnRfc3RhY2tfbGV2ZWwgLSBwcmludCBjdXJyZW50IHN0YWNrIGRlcHRoIHRvIHN0ZGVycgotCXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIC0gZ28gYWhlYWQsIGd1ZXNzLi4uCi0JW3F1b3RlZCBzdHJpbmddIC0gcHVzaCBzdHJpbmcgb250byBzdHJpbmcgc3RhY2sKLQlbd29yZCBzdGFydGluZyB3aXRoIGRpZ2l0XSAtIHB1c2ggYXRvbChzdHIpIG9udG8gaW50ZWdlciBzdGFjawotCi0gICBBIGNvbW1hbmQgbXVzdCBiZSBhbGwgdXBwZXItY2FzZSwgYW5kIGFsb25lIG9uIGEgbGluZS4KLQotICAgRm9vLiAgKi8KLQotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNkZWZpbmUgREVGX1NJWkUgNTAwMAotI2RlZmluZSBTVEFDSyA1MAotCi1pbnQgaW50ZXJuYWxfd2FudGVkOwotaW50IGludGVybmFsX21vZGU7Ci0KLWludCB3YXJuaW5nOwotCi0vKiBIZXJlIGlzIGEgc3RyaW5nIHR5cGUgLi4uICovCi0KLXR5cGVkZWYgc3RydWN0IGJ1ZmZlciAKLXsKLSAgY2hhciAqcHRyOwotICB1bnNpZ25lZCBsb25nIHdyaXRlX2lkeDsKLSAgdW5zaWduZWQgbG9uZyBzaXplOwotfSBzdHJpbmdfdHlwZTsKLQotCi0jaWZkZWYgX19TVERDX18KLXN0YXRpYyB2b2lkIGluaXRfc3RyaW5nX3dpdGhfc2l6ZSAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGluaXRfc3RyaW5nIChzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyBpbnQgZmluZCAoc3RyaW5nX3R5cGUgKiwgY2hhciAqKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2J1ZmZlciAoc3RyaW5nX3R5cGUgKiwgRklMRSAqKTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV9zdHJpbmcgKHN0cmluZ190eXBlICopOwotc3RhdGljIGNoYXIgKmFkZHIgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgY2hhciBhdCAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGNhdGNoYXIgKHN0cmluZ190eXBlICosIGludCk7Ci1zdGF0aWMgdm9pZCBvdmVyd3JpdGVfc3RyaW5nIChzdHJpbmdfdHlwZSAqLCBzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIGNhdGJ1ZiAoc3RyaW5nX3R5cGUgKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIHZvaWQgY2F0dGV4dCAoc3RyaW5nX3R5cGUgKiwgY2hhciAqKTsKLXN0YXRpYyB2b2lkIGNhdHN0ciAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZCBERUZVTihpbml0X3N0cmluZ193aXRoX3NpemUsKGJ1ZmZlciwgc2l6ZSksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICB1bnNpZ25lZCBpbnQgc2l6ZSApCi17Ci0gICAgYnVmZmVyLT53cml0ZV9pZHggPSAwOwotICAgIGJ1ZmZlci0+c2l6ZSA9IHNpemU7Ci0gICAgYnVmZmVyLT5wdHIgPSBtYWxsb2Moc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGluaXRfc3RyaW5nLChidWZmZXIpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIpCi17Ci0gICAgaW5pdF9zdHJpbmdfd2l0aF9zaXplKGJ1ZmZlciwgREVGX1NJWkUpOwotCi19Ci0KLXN0YXRpYyBpbnQgREVGVU4oZmluZCwgKHN0ciwgd2hhdCksCi0JICBzdHJpbmdfdHlwZSAqc3RyIEFORAotCSAgY2hhciAqd2hhdCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBjaGFyICpwOwotICAgIHAgPSB3aGF0OwotICAgIGZvciAoaSA9IDA7IGkgPCBzdHItPndyaXRlX2lkeCAmJiAqcDsgaSsrKSAKLSAgICB7Ci0JaWYgKCpwID09IHN0ci0+cHRyW2ldKQotCSBwKys7Ci0JZWxzZQotCSBwID0gd2hhdDsKLSAgICB9Ci0gICAgcmV0dXJuICgqcCA9PSAwKTsKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgREVGVU4od3JpdGVfYnVmZmVyLChidWZmZXIsIGYpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgRklMRSAqZikKLXsKLSAgICBmd3JpdGUoYnVmZmVyLT5wdHIsIGJ1ZmZlci0+d3JpdGVfaWR4LCAxLCBmKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBERUZVTihkZWxldGVfc3RyaW5nLChidWZmZXIpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIpCi17Ci0gICAgZnJlZShidWZmZXItPnB0cik7Ci19Ci0KLQotc3RhdGljIGNoYXIgKkRFRlVOKGFkZHIsIChidWZmZXIsIGlkeCksCi0JICAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gICAgcmV0dXJuIGJ1ZmZlci0+cHRyICsgaWR4OwotfQotCi1zdGF0aWMgY2hhciBERUZVTihhdCwoYnVmZmVyLCBwb3MpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgdW5zaWduZWQgaW50IHBvcykgCi17Ci0gIGlmIChwb3MgPj0gYnVmZmVyLT53cml0ZV9pZHgpIAotICAgIHJldHVybiAwOwotICByZXR1cm4gYnVmZmVyLT5wdHJbcG9zXTsKLX0KLQotc3RhdGljIHZvaWQgREVGVU4oY2F0Y2hhciwoYnVmZmVyLCBjaCksIAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgaW50IGNoKQotewotICBpZiAoYnVmZmVyLT53cml0ZV9pZHggPT0gYnVmZmVyLT5zaXplKSAKLSAgICB7Ci0gICAgICBidWZmZXItPnNpemUgKj0yOwotICAgICAgYnVmZmVyLT5wdHIgPSByZWFsbG9jKGJ1ZmZlci0+cHRyLCBidWZmZXItPnNpemUpOwotICAgIH0KLQotICBidWZmZXItPnB0cltidWZmZXItPndyaXRlX2lkeCArKyBdID0gY2g7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4ob3ZlcndyaXRlX3N0cmluZywoZHN0LCAgIHNyYyksCi0JICAgc3RyaW5nX3R5cGUgKmRzdCBBTkQKLQkgICBzdHJpbmdfdHlwZSAqc3JjKQotewotICAgIGZyZWUoZHN0LT5wdHIpOwotICAgIGRzdC0+c2l6ZSA9IHNyYy0+c2l6ZTsKLSAgICBkc3QtPndyaXRlX2lkeCA9IHNyYy0+d3JpdGVfaWR4OwotICAgIGRzdC0+cHRyID0gc3JjLT5wdHI7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdGJ1ZiwoYnVmZmVyLCBidWYsIGxlbiksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICBjaGFyICpidWYgQU5ECi0JICAgdW5zaWduZWQgaW50IGxlbikKLXsKLSAgaWYgKGJ1ZmZlci0+d3JpdGVfaWR4ICsgbGVuID49IGJ1ZmZlci0+c2l6ZSkKLSAgICB7Ci0gICAgICB3aGlsZSAoYnVmZmVyLT53cml0ZV9pZHggKyBsZW4gPj0gYnVmZmVyLT5zaXplKQotCWJ1ZmZlci0+c2l6ZSAqPSAyOwotICAgICAgYnVmZmVyLT5wdHIgPSByZWFsbG9jIChidWZmZXItPnB0ciwgYnVmZmVyLT5zaXplKTsKLSAgICB9Ci0gIG1lbWNweSAoYnVmZmVyLT5wdHIgKyBidWZmZXItPndyaXRlX2lkeCwgYnVmLCBsZW4pOwotICBidWZmZXItPndyaXRlX2lkeCArPSBsZW47Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdHRleHQsKGJ1ZmZlciwgc3RyaW5nKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIGNoYXIgKnN0cmluZykKLXsKLSAgY2F0YnVmIChidWZmZXIsIHN0cmluZywgKHVuc2lnbmVkIGludCkgc3RybGVuIChzdHJpbmcpKTsKLX0KLQotc3RhdGljIHZvaWQgREVGVU4oY2F0c3RyLChkc3QsIHNyYyksCi0JICAgc3RyaW5nX3R5cGUgKmRzdCBBTkQKLQkgICBzdHJpbmdfdHlwZSAqc3JjKQotewotICBjYXRidWYgKGRzdCwgc3JjLT5wdHIsIHNyYy0+d3JpdGVfaWR4KTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IAotREVGVU4oc2tpcF93aGl0ZV9hbmRfc3RhcnMsKHNyYywgaWR4KSwKLSAgICAgIHN0cmluZ190eXBlICpzcmMgQU5ECi0gICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICBjaGFyIGM7Ci0gIHdoaWxlICgoYyA9IGF0KHNyYyxpZHgpKSwKLQkgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpCi0JIHx8IChjID09ICcqJwotCSAgICAgLyogRG9uJ3Qgc2tpcCBwYXN0IGVuZC1vZi1jb21tZW50IG9yIHN0YXIgYXMgZmlyc3QKLQkJY2hhcmFjdGVyIG9uIGl0cyBsaW5lLiAgKi8KLQkgICAgICYmIGF0KHNyYyxpZHggKzEpICE9ICcvJwotCSAgICAgJiYgYXQoc3JjLGlkeCAtMSkgIT0gJ1xuJykpIAotICAgIGlkeCsrOwotICByZXR1cm4gaWR4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RyaW5nX3R5cGUgc3RhY2tbU1RBQ0tdOwotc3RyaW5nX3R5cGUgKnRvczsKLQotdW5zaWduZWQgaW50IGlkeCA9IDA7IC8qIFBvcyBpbiBpbnB1dCBidWZmZXIgKi8KLXN0cmluZ190eXBlICpwdHI7IC8qIGFuZCB0aGUgYnVmZmVyICovCi10eXBlZGVmIHZvaWQgKCpzdGluc3RfdHlwZSkoKTsKLXN0aW5zdF90eXBlICpwYzsKLXN0aW5zdF90eXBlIHNzdGFja1tTVEFDS107Ci1zdGluc3RfdHlwZSAqc3NwID0gJnNzdGFja1swXTsKLWxvbmcgaXN0YWNrW1NUQUNLXTsKLWxvbmcgKmlzcCA9ICZpc3RhY2tbMF07Ci0KLXR5cGVkZWYgaW50ICp3b3JkX3R5cGU7Ci0KLQotCi1zdHJ1Y3QgZGljdF9zdHJ1Y3QKLXsKLSAgICBjaGFyICp3b3JkOwotICAgIHN0cnVjdCBkaWN0X3N0cnVjdCAqbmV4dDsKLSAgICBzdGluc3RfdHlwZSAqY29kZTsKLSAgICBpbnQgY29kZV9sZW5ndGg7Ci0gICAgaW50IGNvZGVfZW5kOwotICAgIGludCB2YXI7Ci0gICAgCi19OwotdHlwZWRlZiBzdHJ1Y3QgZGljdF9zdHJ1Y3QgZGljdF90eXBlOwotI2RlZmluZSBXT1JEKHgpIHN0YXRpYyB2b2lkIHgoKQotCi1zdGF0aWMgdm9pZAotZGllIChtc2cpCi0gICAgIGNoYXIgKm1zZzsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIG1zZyk7Ci0gIGV4aXQgKDEpOwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfcmFuZ2UgKCkKLXsKLSAgaWYgKHRvcyA8IHN0YWNrKQotICAgIGRpZSAoInVuZGVyZmxvdyBpbiBzdHJpbmcgc3RhY2siKTsKLSAgaWYgKHRvcyA+PSBzdGFjayArIFNUQUNLKQotICAgIGRpZSAoIm92ZXJmbG93IGluIHN0cmluZyBzdGFjayIpOwotfQotCi1zdGF0aWMgdm9pZAotaWNoZWNrX3JhbmdlICgpCi17Ci0gIGlmIChpc3AgPCBpc3RhY2spCi0gICAgZGllICgidW5kZXJmbG93IGluIGludGVnZXIgc3RhY2siKTsKLSAgaWYgKGlzcCA+PSBpc3RhY2sgKyBTVEFDSykKLSAgICBkaWUgKCJvdmVyZmxvdyBpbiBpbnRlZ2VyIHN0YWNrIik7Ci19Ci0KLSNpZmRlZiBfX1NURENfXwotc3RhdGljIHZvaWQgZXhlYyAoZGljdF90eXBlICopOwotc3RhdGljIHZvaWQgY2FsbCAodm9pZCk7Ci1zdGF0aWMgdm9pZCByZW1jaGFyICh2b2lkKSwgc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMgKHZvaWQpLCBwdXNoX251bWJlciAodm9pZCk7Ci1zdGF0aWMgdm9pZCBwdXNoX3RleHQgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVtb3ZlX25vbmNvbW1lbnRzIChzdHJpbmdfdHlwZSAqLCBzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YWNrX2xldmVsICh2b2lkKTsKLXN0YXRpYyB2b2lkIHBhcmFtc3R1ZmYgKHZvaWQpLCB0cmFuc2xhdGVjb21tZW50cyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRkb3RzICh2b2lkKSwgY291cmllcml6ZSAodm9pZCksIGJ1bGxldGl6ZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBkb19mYW5jeV9zdHVmZiAodm9pZCk7Ci1zdGF0aWMgaW50IGlzY29tbWFuZCAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBpbnQgY29weV9wYXN0X25ld2xpbmUgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBpY29weV9wYXN0X25ld2xpbmUgKHZvaWQpLCBraWxsX2JvZ3VzX2xpbmVzICh2b2lkKSwgaW5kZW50ICh2b2lkKTsKLXN0YXRpYyB2b2lkIGdldF9zdHVmZl9pbl9jb21tYW5kICh2b2lkKSwgc3dhcCAodm9pZCksIG90aGVyX2R1cCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBkcm9wICh2b2lkKSwgaWRyb3AgKHZvaWQpOwotc3RhdGljIHZvaWQgaWNhdHN0ciAodm9pZCksIHNraXBfcGFzdF9uZXdsaW5lICh2b2lkKSwgaW50ZXJuYWxtb2RlICh2b2lkKTsKLXN0YXRpYyB2b2lkIG1heWJlY2F0c3RyICh2b2lkKTsKLXN0YXRpYyBjaGFyICpuZXh0d29yZCAoY2hhciAqLCBjaGFyICoqKTsKLWRpY3RfdHlwZSAqbG9va3VwX3dvcmQgKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBwZXJmb3JtICh2b2lkKTsKLWRpY3RfdHlwZSAqbmV3ZW50cnkgKGNoYXIgKik7Ci11bnNpZ25lZCBpbnQgYWRkX3RvX2RlZmluaXRpb24gKGRpY3RfdHlwZSAqLCBzdGluc3RfdHlwZSk7Ci12b2lkIGFkZF9pbnRyaW5zaWMgKGNoYXIgKiwgdm9pZCAoKikoKSk7Ci12b2lkIGFkZF92YXIgKGNoYXIgKik7Ci12b2lkIGNvbXBpbGUgKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBiYW5nICh2b2lkKTsKLXN0YXRpYyB2b2lkIGF0c2lnbiAodm9pZCk7Ci1zdGF0aWMgdm9pZCBoZWxsbyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBzdGRvdXRfICh2b2lkKTsKLXN0YXRpYyB2b2lkIHN0ZGVycl8gKHZvaWQpOwotc3RhdGljIHZvaWQgcHJpbnQgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVhZF9pbiAoc3RyaW5nX3R5cGUgKiwgRklMRSAqKTsKLXN0YXRpYyB2b2lkIHVzYWdlICh2b2lkKTsKLXN0YXRpYyB2b2lkIGNoZXdfZXhpdCAodm9pZCk7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgREVGVU4oZXhlYywod29yZCksCi0JCSAgZGljdF90eXBlICp3b3JkKQotewotICBwYyA9IHdvcmQtPmNvZGU7Ci0gIHdoaWxlICgqcGMpIAotICAgICgqcGMpKCk7Ci19Ci1XT1JEKGNhbGwpCi17Ci0gICAgc3RpbnN0X3R5cGUgKm9sZHBjID0gcGM7Ci0gICAgZGljdF90eXBlICplOwotICAgIGUgPSAgKGRpY3RfdHlwZSAqKShwYyBbMV0pOwotICAgIGV4ZWMoZSk7Ci0gICAgcGMgPSBvbGRwYyArIDI7Ci0gICAgCi19Ci0KLVdPUkQocmVtY2hhcikKLXsKLSAgaWYgKHRvcy0+d3JpdGVfaWR4KQotICAgIHRvcy0+d3JpdGVfaWR4LS07ICAgIAotICBwYysrOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMgKCkKLXsKLSAgd2hpbGUgKChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYXQgKHRvcywgdG9zLT53cml0ZV9pZHggLSAxKSkKLQkgIHx8IGF0ICh0b3MsIHRvcy0+d3JpdGVfaWR4IC0gMSkgPT0gJ1xuJykKLQkgJiYgdG9zLT53cml0ZV9pZHggPiAwKQotICAgIHRvcy0+d3JpdGVfaWR4LS07Ci0gIHBjKys7Ci19Ci0KLVdPUkQocHVzaF9udW1iZXIpCi17Ci0gICAgaXNwKys7Ci0gICAgaWNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci0gICAgKmlzcCA9IChsb25nKSgqcGMpOwotICAgIHBjKys7Ci19Ci0KLVdPUkQocHVzaF90ZXh0KQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0gICAgcGMrKzsKLSAgICBjYXR0ZXh0KHRvcywqKChjaGFyICoqKXBjKSk7Ci0gICAgcGMrKzsKLSAgICAKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZXZlcnl0aGluZyBub3QgaW5zaWRlIGNvbW1lbnRzIHN0YXJ0aW5nIG9uCi0gICB0aGUgZmlyc3QgY2hhciBvZiB0aGUgbGluZSBmcm9tIHRoZSAgc3RyaW5nLCBhbHNvIHdoZW4gY29weWluZwotICAgY29tbWVudHMsIHJlbW92ZXMgYmxhbmsgc3BhY2UgYW5kIGxlYWRpbmcgKidzLgotICAgQmxhbmsgbGluZXMgYXJlIHR1cm5lZCBpbnRvIG9uZSBibGFuayBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQgCi1ERUZVTihyZW1vdmVfbm9uY29tbWVudHMsKHNyYyxkc3QpLAotCSAgIHN0cmluZ190eXBlICpzcmMgQU5ECi0JICAgc3RyaW5nX3R5cGUgKmRzdCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICAKLSAgICB3aGlsZSAoYXQoc3JjLGlkeCkpIAotICAgIHsKLQkvKiBOb3cgc2VlIGlmIHdlIGhhdmUgYSBjb21tZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSAqLwotCWlmIChhdChzcmMsaWR4KSA9PSAnXG4nIAotCSAgICAmJiBhdChzcmMsaWR4KzEpID09ICAnLycgCi0JICAgICYmIGF0KHNyYyxpZHgrMikgPT0gJyonKSAKLQl7Ci0JICAgIGlkeCs9MzsKLQkgICAgCi0JICAgIGlkeCA9IHNraXBfd2hpdGVfYW5kX3N0YXJzKHNyYyxpZHgpOwotCi0JICAgIC8qIFJlbW92ZSBsZWFkaW5nIGRvdCAqLwotCSAgICBpZiAoYXQoc3JjLCBpZHgpID09ICcuJykKLQkgICAgIGlkeCsrOwotCSAgICAKLQkgICAgLyogQ29weSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBvciB0aWxsIHRoZSBlbmQgb2YgdGhlCi0JICAgICAgIGNvbW1lbnQgKi8KLQkgICAgd2hpbGUgKGF0KHNyYywgaWR4KSkKLQkgICAgewotCQlpZiAoYXQoc3JjLCBpZHgpID09ICdcbicpIAotCQl7Ci0JCSAgICAvKiBlbmQgb2YgbGluZSwgZWNobyBhbmQgc2NyYXBlIG9mIGxlYWRpbmcgYmxhbmtzICAqLwotCQkgICAgaWYgKGF0KHNyYyxpZHggKzEpID09ICdcbicpCi0JCSAgICAgY2F0Y2hhcihkc3QsJ1xuJyk7Ci0JCSAgICBjYXRjaGFyKGRzdCwnXG4nKTsKLQkJICAgIGlkeCsrOwotCQkgICAgaWR4ID0gICBza2lwX3doaXRlX2FuZF9zdGFycyhzcmMsIGlkeCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXQoc3JjLCBpZHgpID09ICcqJyAmJiBhdChzcmMsaWR4KzEpID09ICcvJykgCi0JCXsKLQkJICAgIGlkeCArPTIgOwotCQkgICAgY2F0dGV4dChkc3QsIlxuRU5ERERcbiIpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJZWxzZSAKLQkJewotCQkgICAgY2F0Y2hhcihkc3QsIGF0KHNyYywgaWR4KSk7Ci0JCSAgICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgaWR4Kys7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhY2tfbGV2ZWwgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiY3VycmVudCBzdHJpbmcgc3RhY2sgZGVwdGggPSAlZCwgIiwgdG9zIC0gc3RhY2spOwotICBmcHJpbnRmIChzdGRlcnIsICJjdXJyZW50IGludGVnZXIgc3RhY2sgZGVwdGggPSAlZFxuIiwgaXNwIC0gaXN0YWNrKTsKLSAgcGMrKzsKLX0KLQotLyogdHVybjoKLSAgICAgZm9vYmFyIG5hbWUoc3R1ZmYpOwotICAgaW50bzoKLSAgICAgZm9vYmFyCi0gICAgIG5hbWUgUEFSQU1TICgoc3R1ZmYpKTsKLSAgIGFuZCBhIGJsYW5rIGxpbmUuCi0gKi8KLQotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQocGFyYW1zdHVmZikKLXsKLSAgICB1bnNpZ25lZCBpbnQgb3BlbnA7Ci0gICAgdW5zaWduZWQgaW50IGZuYW1lOwotICAgIHVuc2lnbmVkIGludCBpZHg7Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotCi0gICAgLyogbWFrZSBzdXJlIHRoYXQgaXQncyBub3QgYWxyZWFkeSBwYXJhbSdkIG9yIHByb3RvJ2QgKi8KLSAgICBpZihmaW5kKHRvcywiUEFSQU1TIikgfHwgZmluZCh0b3MsIlBST1RPIikgfHwgIWZpbmQodG9zLCIoIikpIHsKLQkgICAgY2F0c3RyKCZvdXQsdG9zKTsKLQl9Ci0gICAgZWxzZSAKLSAgICB7Ci0JLyogRmluZCB0aGUgb3BlbiBwYXJlbiAqLwotCWZvciAob3BlbnAgPSAwOyBhdCh0b3MsIG9wZW5wKSAhPSAnKCcgICYmIGF0KHRvcyxvcGVucCk7IG9wZW5wKyspCi0JIDsKLQotCWZuYW1lID0gb3BlbnA7Ci0JLyogU3RlcCBiYWNrIHRvIHRoZSBmbmFtZSAqLwotCWZuYW1lLS07Ci0Jd2hpbGUgKGZuYW1lICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcywgZm5hbWUpKSkKLQkgZm5hbWUgLS07Ci0Jd2hpbGUgKGZuYW1lCi0JICAgICAgICYmICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsZm5hbWUpKQotCSAgICAgICAmJiBhdCh0b3MsZm5hbWUpICE9ICcqJykKLQkgZm5hbWUtLTsKLQotCWZuYW1lKys7Ci0JCi0JZm9yIChpZHggPSAwOyBpZHggPCBmbmFtZTsgaWR4KyspIAkvKiBPdXRwdXQgdHlwZSAqLwotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsaWR4KSk7Ci0JfQotICAgIAotICAgICAgICBjYXR0ZXh0KCZvdXQsICJcbiIpOwkvKiBJbnNlcnQgYSBuZXdsaW5lIGJldHdlZW4gdHlwZSBhbmQgZm5uYW1lICovCi0KLQlmb3IgKGlkeCA9IGZuYW1lOyBpZHggPCBvcGVucDsgaWR4KyspIAkJLyogT3V0cHV0IGZubmFtZSAqLwotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsaWR4KSk7Ci0JfQotCi0JY2F0dGV4dCgmb3V0LCIgUEFSQU1TICgiKTsKLQotCXdoaWxlIChhdCh0b3MsaWR4KSAmJiBhdCh0b3MsaWR4KSAhPSc7JykgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLQljYXR0ZXh0KCZvdXQsIik7XG5cbiIpOwotICAgIH0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7ICAgIAotICAgIHBjKys7Ci0gICAgCi19Ci0KLQotCi0vKiB0dXJuIHsqCi0gICBhbmQgKn0gaW50byBjb21tZW50cyAqLwotCi1XT1JEKHRyYW5zbGF0ZWNvbW1lbnRzKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcyxpZHgpID09ICd7JyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiLyoiKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSAgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0KLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLS8qIHR1cm4gZXZlcnl0aGluZyBub3Qgc3RhcnRpbmcgd2l0aCBhIC4gaW50byBhIGNvbW1lbnQgKi8KLQotV09SRChtYW5nbGVjb21tZW50cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsaWR4KSA9PSAnXG4nICYmIGF0KHRvcyxpZHgrMSkgPT0nKicpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIJLyoiKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSAgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0KLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0jZW5kaWYKLQotLyogTW9kIHRvcyBzbyB0aGF0IG9ubHkgbGluZXMgd2l0aCBsZWFkaW5nIGRvdHMgcmVtYWluICovCi1zdGF0aWMgdm9pZAotREVGVU5fVk9JRChvdXRwdXRkb3RzKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nICYmIGF0KHRvcywgaWR4KzEpID09ICcuJykgCi0JewotCSAgY2hhciBjOwotCSAgaWR4ICs9IDI7Ci0JICAgIAotCSAgICB3aGlsZSAoKGMgPSBhdCh0b3MsIGlkeCkpICYmIGMgIT0gJ1xuJykKLQkgICAgewotCSAgICAgIGlmIChjID09ICd7JyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQkJewotCQkgICAgY2F0dGV4dCgmb3V0LCIgLyoiKTsKLQkJICAgIGlkeCs9MjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JCSAgICBpZHgrPTI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAgIGNhdGNoYXIoJm91dCwgYyk7Ci0JCSAgICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JICAgIGNhdGNoYXIoJm91dCwnXG4nKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9CQotCi0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOwotICAgIHBjKys7Ci0gICAgCi19Ci0KLS8qIEZpbmQgbGluZXMgc3RhcnRpbmcgd2l0aCAuIGFuZCB8IGFuZCBwdXQgZXhhbXBsZSBhcm91bmQgdGhlbSBvbiB0b3MgKi8KLVdPUkQoY291cmllcml6ZSkKLXsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgaW50IGNvbW1hbmQgPSAwOwotICAgIAotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotICAgIHdoaWxlIChhdCh0b3MsIGlkeCkpIAotICAgIHsKLQlpZiAoYXQodG9zLCBpZHgpID09ICdcbicgCi0JICAgICYmIChhdCh0b3MsIGlkeCArMSApID09ICcuJwotCQl8fCBhdCh0b3MsaWR4KzEpID09ICd8JykpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCJcbkBleGFtcGxlXG4iKTsKLQkgICAgZG8gCi0JICAgIHsKLQkJaWR4ICs9IDI7Ci0JCQotCQl3aGlsZSAoYXQodG9zLCBpZHgpICYmIGF0KHRvcywgaWR4KSE9J1xuJykKLQkJewotCQkgICAgaWYgKGF0KHRvcyxpZHgpPT0neycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIiAvKiIpOwotCQkJaWR4Kz0yOwotCQkgICAgfQotCQkgICAgZWxzZSBpZiAoYXQodG9zLGlkeCk9PScqJyAmJiBhdCh0b3MsaWR4KzEpID09J30nKSAKLQkJICAgIHsKLQkJCWNhdHRleHQoJm91dCwiKi8iKTsKLQkJCWlkeCs9MjsKLQkJICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAneycgJiYgIWNvbW1hbmQpCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIkB7Iik7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnfScgJiYgIWNvbW1hbmQpCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIkB9Iik7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkJICAgIGVsc2UgCi0JCSAgICB7Ci0JCQlpZiAoYXQodG9zLGlkeCkgPT0gJ0AnKQotCQkJICAgIGNvbW1hbmQgPSAxOwotCQkJZWxzZSBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCkpCi0JCQkJIHx8IGF0KHRvcyxpZHgpID09ICd9JykKLQkJCSAgICBjb21tYW5kID0gMDsKLQkJCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJCWlkeCsrOwotCQkgICAgfQotCQkgICAgCi0JCX0KLQkJY2F0Y2hhcigmb3V0LCdcbicpOwotCSAgICB9ICAKLQkgICAgd2hpbGUgKGF0KHRvcywgaWR4KSA9PSAnXG4nIAotCQkgICAmJiAoKGF0KHRvcywgaWR4KzEpID09ICcuJykKLQkJICAgICAgIHx8IChhdCh0b3MsaWR4KzEpID09ICd8JykpKQotCSAgICAgIDsKLQkgICAgY2F0dGV4dCgmb3V0LCJAZW5kIGV4YW1wbGUiKTsKLQl9Ci0JZWxzZSAKLQl7ICAgIAotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9ICAgIAotCi0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOwotICAgIHBjKys7Ci0KLSAgICAKLX0KLQotLyogRmluZHMgYW55IGxpbmVzIHN0YXJ0aW5nIHdpdGggIm8gIiwgaWYgdGhlcmUgYXJlIGFueSwgdGhlbiB0dXJucwotICAgb24gQGl0ZW1pemUgQGJ1bGxldCwgYW5kIEBpdGVtcyBlYWNoIG9mIHRoZW0uIFRoZW4gZW5kcyB3aXRoIEBlbmQKLSAgIGl0ZW1pemUsIGlucGxhY2UgYXQgVE9TKi8KLQotCi1XT1JEKGJ1bGxldGl6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBpbnQgb24gPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnQCcgJiYKLQkgICAgYXQodG9zLCBpZHgrMSkgPT0gJyonKSAKLQl7Ci0JICBjYXR0ZXh0KCZvdXQsIioiKTsKLQkgIGlkeCs9MjsKLQl9Ci0JCi0JZWxzZQotCSAgICBpZiAoYXQodG9zLCBpZHgpID09ICdcbicgJiYKLQkJYXQodG9zLCBpZHgrMSkgPT0gJ28nICYmCi0JCWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcywgaWR4ICsyKSkpCi0JICAgIHsKLQkJaWYgKCFvbikgCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiXG5AaXRlbWl6ZSBAYnVsbGV0XG4iKTsKLQkJICAgIG9uID0gMTsKLQkJICAgIAotCQl9Ci0JCWNhdHRleHQoJm91dCwiXG5AaXRlbVxuIik7Ci0JCWlkeCs9MzsKLQkgICAgfQotCSAgICBlbHNlIAotCSAgICB7Ci0JCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJaWYgKG9uICYmIGF0KHRvcywgaWR4KSA9PSAnXG4nICYmCi0JCSAgICBhdCh0b3MsIGlkeCsxKSA9PSAnXG4nICYmCi0JCSAgICBhdCh0b3MsIGlkeCsyKSAhPSAnbycpCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwgIkBlbmQgaXRlbWl6ZSIpOwotCQkgICAgb24gPSAwOwotCQl9Ci0JCWlkeCsrOwotCQkKLQkgICAgfQotCX0KLSAgICBpZiAob24pIAotICAgIHsKLQljYXR0ZXh0KCZvdXQsIkBlbmQgaXRlbWl6ZVxuIik7Ci0gICAgfQkKLQotICAgIGRlbGV0ZV9zdHJpbmcodG9zKTsKLSAgICAqdG9zID0gb3V0OwotICAgIHBjKys7Ci0gICAgCi19Ci0KLS8qIFR1cm4gPDxmb28+PiBpbnRvIEBjb2Rle2Zvb30gaW4gcGxhY2UgYXQgVE9TKi8KLSAgIAotCi1XT1JEKGRvX2ZhbmN5X3N0dWZmKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnPCcgCi0JICAgICYmIGF0KHRvcywgaWR4KzEpID09ICc8JwotCSAgICAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCArIDIpKSkgCi0JewotCSAgICAvKiBUaGlzIHF1YWxpZmllcyBhcyBhIDw8IHN0YXJ0dXAgKi8KLQkgICAgaWR4ICs9MjsKLQkgICAgY2F0dGV4dCgmb3V0LCJAY29kZXsiKTsKLQkgICAgd2hpbGUoYXQodG9zLGlkeCkgJiYKLQkJICBhdCh0b3MsaWR4KSAhPSAnPicgKQotCSAgICB7Ci0JCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJaWR4Kys7Ci0JCQotCSAgICB9Ci0JICAgIGNhdHRleHQoJm91dCwifSIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0gICAgcGMrKzsKLSAgICAKLX0KLS8qIEEgY29tbWFuZCBpcyBhbGwgdXBwZXIgY2FzZSxhbmQgYWxvbmUgb24gYSBsaW5lICovCi1zdGF0aWMgaW50IAotREVGVU4oIGlzY29tbWFuZCwocHRyLCBpZHgpLAotICAgICAgc3RyaW5nX3R5cGUgKnB0ciBBTkQKLSAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gICAgdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0gICAgd2hpbGUgKGF0KHB0cixpZHgpKSB7Ci0JICAgIGlmIChpc3VwcGVyKCh1bnNpZ25lZCBjaGFyKSBhdChwdHIsaWR4KSkgfHwgYXQocHRyLGlkeCkgPT0gJyAnIHx8Ci0JCWF0KHB0cixpZHgpID09ICdfJykgCi0JICAgIHsKLQkgICAgIGxlbisrOwotCSAgICAgaWR4Kys7Ci0JIH0KLQkgICAgZWxzZSBpZihhdChwdHIsaWR4KSA9PSAnXG4nKQotCSAgICB7Ci0JCWlmIChsZW4gPiAzKSByZXR1cm4gMTsKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgZWxzZSByZXR1cm4gMDsKLQl9Ci0gICAgcmV0dXJuIDA7Ci0KLX0KLQotCi1zdGF0aWMgaW50Ci1ERUZVTihjb3B5X3Bhc3RfbmV3bGluZSwocHRyLCBpZHgsIGRzdCksCi0gICAgICBzdHJpbmdfdHlwZSAqcHRyIEFORAotICAgICAgdW5zaWduZWQgaW50IGlkeCBBTkQKLSAgICAgIHN0cmluZ190eXBlICpkc3QpCi17Ci0gICAgaW50IGNvbHVtbiA9IDA7Ci0KLSAgICB3aGlsZSAoYXQocHRyLCBpZHgpICYmIGF0KHB0ciwgaWR4KSAhPSAnXG4nKSAKLSAgICB7Ci0JaWYgKGF0IChwdHIsIGlkeCkgPT0gJ1x0JykKLQkgIHsKLQkgICAgLyogRXhwYW5kIHRhYnMuICBOZWl0aGVyIG1ha2VpbmZvIG5vciBUZVggY2FuIGNvcGUgd2VsbCB3aXRoCi0JICAgICAgIHRoZW0uICAqLwotCSAgICBkbwotCSAgICAgIGNhdGNoYXIgKGRzdCwgJyAnKTsKLQkgICAgd2hpbGUgKCsrY29sdW1uICYgNyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBjYXRjaGFyKGRzdCwgYXQocHRyLCBpZHgpKTsKLQkgICAgY29sdW1uKys7Ci0JICB9Ci0JaWR4Kys7Ci0JCi0gICAgfSAgICAKLSAgICBjYXRjaGFyKGRzdCwgYXQocHRyLCBpZHgpKTsKLSAgICBpZHgrKzsKLSAgICByZXR1cm4gaWR4OwotCi19Ci0KLVdPUkQoaWNvcHlfcGFzdF9uZXdsaW5lKQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0gICAgaWR4ID0gY29weV9wYXN0X25ld2xpbmUocHRyLCBpZHgsIHRvcyk7Ci0gICAgcGMrKzsJCi19Ci0KLS8qIGluZGVudAotICAgVGFrZSB0aGUgc3RyaW5nIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBkbyBzb21lIHByZXR0eWluZyAqLwotCi0KLVdPUkQoa2lsbF9ib2d1c19saW5lcykKLXsKLSAgICBpbnQgc2wgOwotICAgIAotICAgIGludCBpZHggPSAwOwotICAgIGludCBjOwotICAgIGludCBkb3QgPSAwICAgIDsKLSAgICAKLSAgICBzdHJpbmdfdHlwZSBvdXQ7ICAgIAotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIC8qIERyb3AgbGVhZGluZyBubCAqLwotICAgIHdoaWxlIChhdCh0b3MsaWR4KSA9PSAnXG4nKQotICAgIHsKLQlpZHgrKzsKLSAgICB9Ci0gICAgYyA9IGlkeDsKLSAgICAKLSAgICAvKiBJZiB0aGUgZmlyc3QgY2hhciBpcyBhICcuJyBwcmVwZW5kIGEgbmV3bGluZSBzbyB0aGF0IGl0IGlzCi0gICAgICAgcmVjb2duaXplZCBwcm9wZXJseSBsYXRlci4gICovCi0gICAgaWYgKGF0ICh0b3MsIGlkeCkgPT0gJy4nKQotICAgICAgY2F0Y2hhciAoJm91dCwgJ1xuJyk7Ci0KLSAgICAvKiBGaW5kIHRoZSBsYXN0IGNoYXIgKi8KLSAgICB3aGlsZSAoYXQodG9zLGlkeCkpCi0gICAgewotCWlkeCsrOwotICAgIH0KLSAgICAKLSAgICAvKiBmaW5kIHRoZSBsYXN0IG5vbiB3aGl0ZSBiZWZvcmUgdGhlIG5sICovCi0gICAgaWR4LS07Ci0gICAgCi0gICAgd2hpbGUgKGlkeCAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsaWR4KSkpCi0gICAgIGlkeC0tOwotICAgIGlkeCsrOwotICAgIAotICAgIC8qIENvcHkgYnVmZmVyIHVwdG8gbGFzdCBjaGFyLCBidXQgYmxhbmsgbGluZXMgYmVmb3JlIGFuZCBhZnRlcgotICAgICAgIGRvdHMgZG9uJ3QgY291bnQgKi8KLSAgICBzbCA9IDE7Ci0KLSAgICB3aGlsZSAoYyA8IGlkeCkKLSAgICB7Ci0JaWYgKGF0KHRvcyxjKSA9PSAnXG4nIAotCSAgICAmJiBhdCh0b3MsYysxKSA9PSAnXG4nCi0JICAgICYmIGF0KHRvcyxjKzIpID09ICcuJykgCi0JewotCSAgICAvKiBJZ25vcmUgdHdvIG5ld2xpbmVzIGJlZm9yZSBhIGRvdCovCi0JICAgIGMrKzsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGMpID09ICcuJyAmJiBzbCkKLQl7Ci0JICAgIC8qIHJlbWVtYmVyIHRoYXQgdGhpcyBsaW5lIHN0YXJ0ZWQgd2l0aCBhIGRvdCAqLwotCSAgICBkb3Q9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGMpID09ICdcbicgCi0JCSAmJiBhdCh0b3MsYysxKSA9PSAnXG4nCi0JCSAmJiBkb3QpCi0JewotCSAgICBjKys7Ci0JICAgIC8qIElnbm9yZSB0d28gbmV3bGluZXMgd2hlbiBsYXN0IGxpbmUgd2FzIGRvdCAqLwotCX0KLQotCWNhdGNoYXIoJm91dCwgYXQodG9zLGMpKTsKLQlpZiAoYXQodG9zLGMpID09ICdcbicpCi0JewotCSAgICBzbCA9IDE7Ci0JICAgIAotCSAgICBpZiAoZG90ID09IDIpZG90PTE7ZWxzZSBkb3QgPSAwOwotCX0KLQllbHNlCi0JICBzbCA9IDA7Ci0JCi0JYysrOwkKLQotICAgIH0KLSAgICAKLSAgICAvKiBBcHBlbmQgbmwqLwotICAgIGNhdGNoYXIoJm91dCwgJ1xuJyk7Ci0gICAgcGMrKzsKLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLSAgICAKLSAgICAKLX0KLQotV09SRChpbmRlbnQpCi17Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGludCB0YWIgPSAwOwotICAgIGludCBpZHggPSAwOwotICAgIGludCBvbCA9MDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICB3aGlsZSAoYXQodG9zLGlkeCkpIHsKLQkgICAgc3dpdGNoIChhdCh0b3MsaWR4KSkgCi0JICAgIHsKLQkgICAgICBjYXNlICdcbic6Ci0JCWNhdHRleHQoJm91dCwiXG4iKTsKLQkJaWR4Kys7Ci0JCWlmICh0YWIgJiYgYXQodG9zLGlkeCkpCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiICAgICIpOwotCQl9Ci0JCW9sID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnKCc6Ci0JCXRhYisrOwotCQlpZiAob2wgPT0gMCkKLQkJICAgIGNhdHRleHQoJm91dCwiICAgIik7Ci0JCWlkeCsrOwotCQljYXR0ZXh0KCZvdXQsIigiKTsKLQkJb2wgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICcpJzoKLQkJdGFiLS07Ci0JCWNhdHRleHQoJm91dCwiKSIpOwotCQlpZHgrKzsKLQkJb2w9MTsKLQkJCi0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWNhdGNoYXIoJm91dCxhdCh0b3MsaWR4KSk7Ci0JCW9sPTE7Ci0JCQotCQlpZHgrKzsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9CQotCi0gICAgcGMrKzsKLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLQotfQotCi0KLVdPUkQoZ2V0X3N0dWZmX2luX2NvbW1hbmQpCi17Ci0gICAgdG9zKys7Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgaW5pdF9zdHJpbmcodG9zKTsKLQotICAgIHdoaWxlIChhdChwdHIsIGlkeCkpIHsKLQkgICAgaWYgKGlzY29tbWFuZChwdHIsIGlkeCkpICBicmVhazsKLQkgICAgaWR4ID0gICBjb3B5X3Bhc3RfbmV3bGluZShwdHIsIGlkeCwgdG9zKTsKLQl9Ci0gICAgcGMrKzsgICAgCi19Ci0KLVdPUkQoc3dhcCkKLXsKLSAgICBzdHJpbmdfdHlwZSB0OwotICAgIAotICAgIHQgPSB0b3NbMF07Ci0gICAgdG9zWzBdID0gdG9zWy0xXTsKLSAgICB0b3NbLTFdID10OyAKLSAgICBwYysrOwotICAgIAotfQotCi1XT1JEKG90aGVyX2R1cCkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIGNhdHN0cih0b3MsIHRvcy0xKTsKLSAgICBwYysrOwotfQotCi1XT1JEKGRyb3ApCi17Ci0gIHRvcy0tOwotICBjaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChpZHJvcCkKLXsKLSAgaXNwLS07Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChpY2F0c3RyKQotewotICAgIHRvcy0tOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGNhdHN0cih0b3MsIHRvcysxKTsKLSAgICBkZWxldGVfc3RyaW5nKHRvcysxKTsKLSAgICBwYysrOwotfQotCi1XT1JEKHNraXBfcGFzdF9uZXdsaW5lKQotewotICAgIHdoaWxlIChhdChwdHIsaWR4KSAKLQkgICAmJiBhdChwdHIsaWR4KSAhPSAnXG4nKQotICAgICBpZHgrKzsKLSAgICBpZHgrKzsKLSAgICBwYysrOwotfQotCi0KLVdPUkQoaW50ZXJuYWxtb2RlKQotewotICAgIGludGVybmFsX21vZGUgPSAqKGlzcCk7Ci0gICAgaXNwLS07Ci0gICAgaWNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci19Ci0KLVdPUkQobWF5YmVjYXRzdHIpCi17Ci0gICAgaWYgKGludGVybmFsX3dhbnRlZCA9PSBpbnRlcm5hbF9tb2RlKSAKLSAgICB7Ci0JY2F0c3RyKHRvcy0xLCB0b3MpOwotICAgIH0KLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgdG9zLS07Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgcGMrKzsKLX0KLQotY2hhciAqCi1ERUZVTihuZXh0d29yZCwoc3RyaW5nLCB3b3JkKSwKLSAgICAgIGNoYXIgKnN0cmluZyBBTkQKLSAgICAgIGNoYXIgKip3b3JkKQotewotICAgIGNoYXIgKndvcmRfc3RhcnQ7Ci0gICAgaW50IGlkeDsKLSAgICBjaGFyICpkc3Q7Ci0gICAgY2hhciAqc3JjOwotICAgIAotICAgIGludCBsZW5ndGggPSAwOwotICAgIAotICAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3RyaW5nKSB8fCAqc3RyaW5nID09ICctJykgewotCSAgICBpZiAoKnN0cmluZyA9PSAnLScpIAotCSAgICB7Ci0JCXdoaWxlICgqc3RyaW5nICYmICpzdHJpbmcgIT0gJ1xuJykgCi0JCSBzdHJpbmcrKzsKLQkJCi0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCSAgICBzdHJpbmcrKzsKLQkJfQotCX0KLSAgICBpZiAoISpzdHJpbmcpIHJldHVybiAwOwotICAgIAotICAgIHdvcmRfc3RhcnQgPSBzdHJpbmc7Ci0gICAgaWYgKCpzdHJpbmcgPT0gJyInKSAKLSAgICAgIHsKLQlkbwotCSAgewotCSAgICBzdHJpbmcrKzsKLQkgICAgbGVuZ3RoKys7Ci0JICAgIGlmICgqc3RyaW5nID09ICdcXCcpCi0JICAgICAgewotCQlzdHJpbmcgKz0gMjsKLQkJbGVuZ3RoICs9IDI7Ci0JICAgICAgfQotCSAgfQotCXdoaWxlICgqc3RyaW5nICE9ICciJyk7Ci0gICAgICB9Ci0gICAgZWxzZSAgICAgCi0gICAgICB7Ci0Jd2hpbGUgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3RyaW5nKSkgCi0JewotCSAgICBzdHJpbmcrKzsKLQkgICAgbGVuZ3RoKys7Ci0JCi0JfQotICAgIH0KLSAgICAKLSAgICAqd29yZCA9IG1hbGxvYyhsZW5ndGggKyAxKTsKLQotICAgIGRzdCA9ICp3b3JkOwotICAgIHNyYyA9IHdvcmRfc3RhcnQ7Ci0KLQotICAgIGZvciAoaWR4PSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSAKLSAgICAgIHsKLQlpZiAoc3JjW2lkeF0gPT0gJ1xcJykKLQkgIHN3aXRjaCAoc3JjW2lkeCsxXSkKLQkgICAgewotCSAgICBjYXNlICduJzoKLQkgICAgICAqZHN0KysgPSAnXG4nOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICciJzoKLQkgICAgY2FzZSAnXFwnOgotCSAgICAgICpkc3QrKyA9IHNyY1tpZHgrMV07Ci0JICAgICAgaWR4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKmRzdCsrID0gJ1xcJzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWVsc2UKLQkgICpkc3QrKyA9IHNyY1tpZHhdOwotICAgIH0KLSAgICAqZHN0KysgPSAwOwotCi0KLQotCi0KLSAgICBpZigqc3RyaW5nKSAgICAKLSAgICAgcmV0dXJuIHN0cmluZyArIDE7Ci0gICAgZWxzZSAKLSAgICAgcmV0dXJuIDA7Ci0gICAgCi19Ci1kaWN0X3R5cGUgKnJvb3Q7Ci1kaWN0X3R5cGUgKgotREVGVU4obG9va3VwX3dvcmQsKHdvcmQpLAotICAgICAgY2hhciAqd29yZCkKLXsKLSAgZGljdF90eXBlICpwdHIgPSByb290OwotICB3aGlsZSAocHRyKSB7Ci0gICAgICBpZiAoc3RyY21wKHB0ci0+d29yZCwgd29yZCkgPT0gMCkgcmV0dXJuIHB0cjsKLSAgICAgIHB0ciA9IHB0ci0+bmV4dDsKLQkgICAgCi0gICAgfQotICBpZiAod2FybmluZykKLSAgIGZwcmludGYoc3RkZXJyLCJDYW4ndCBmaW5kICVzXG4iLHdvcmQpOwotICByZXR1cm4gMDsKLSAgICAKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgREVGVU5fVk9JRChwZXJmb3JtKQotewotICB0b3MgPSBzdGFjazsKLSAgICAKLSAgd2hpbGUgKGF0KHB0ciwgaWR4KSkgewotICAgICAgLyogSXQncyB3b3J0aCBsb29raW5nIHRocm91Z2ggdGhlIGNvbW1hbmQgbGlzdCAqLwotICAgICAgaWYgKGlzY29tbWFuZChwdHIsIGlkeCkpCi0gICAgICB7Ci0JY2hhciAqbmV4dDsKLQlkaWN0X3R5cGUgKndvcmQgOwotCQkKLQkodm9pZCkJCW5leHR3b3JkKGFkZHIocHRyLCBpZHgpLCAmbmV4dCk7Ci0KLQotCXdvcmQgPSBsb29rdXBfd29yZChuZXh0KTsKLQotCi0JCQotCi0JaWYgKHdvcmQpIAotCXsKLQkgIGV4ZWMod29yZCk7Ci0JfQotCWVsc2UKLQl7Ci0JICBpZiAod2FybmluZykKLQkgICBmcHJpbnRmKHN0ZGVyciwid2FybmluZywgJXMgaXMgbm90IHJlY29nbmlzZWRcbiIsICBuZXh0KTsKLQkgIHNraXBfcGFzdF9uZXdsaW5lKCk7Ci0JfQotCQkKLSAgICAgIH0KLSAgICAgIGVsc2Ugc2tpcF9wYXN0X25ld2xpbmUoKTsKLQotICAgIH0KLX0KLQotZGljdF90eXBlICoKLURFRlVOKG5ld2VudHJ5LCh3b3JkKSwKLSAgICAgIGNoYXIgKndvcmQpCi17Ci0gICAgZGljdF90eXBlICpuZXcgPSAoZGljdF90eXBlICopbWFsbG9jKHNpemVvZihkaWN0X3R5cGUpKTsKLSAgICBuZXctPndvcmQgPSB3b3JkOwotICAgIG5ldy0+bmV4dCA9IHJvb3Q7Ci0gICAgcm9vdCA9IG5ldzsKLSAgICBuZXctPmNvZGUgPSAoc3RpbnN0X3R5cGUgKiltYWxsb2Moc2l6ZW9mKHN0aW5zdF90eXBlICkpOwotICAgIG5ldy0+Y29kZV9sZW5ndGggPSAxOwotICAgIG5ldy0+Y29kZV9lbmQgPSAwOwotICAgIHJldHVybiBuZXc7Ci0gICAgCi19Ci0KLQotdW5zaWduZWQgaW50Ci1ERUZVTihhZGRfdG9fZGVmaW5pdGlvbiwoZW50cnksIHdvcmQpLCAKLSAgICAgIGRpY3RfdHlwZSAqZW50cnkgQU5ECi0gICAgICBzdGluc3RfdHlwZSB3b3JkKQotewotICAgIGlmIChlbnRyeS0+Y29kZV9lbmQgPT0gZW50cnktPmNvZGVfbGVuZ3RoKSAKLSAgICB7Ci0JZW50cnktPmNvZGVfbGVuZ3RoICs9IDI7Ci0JZW50cnktPmNvZGUgPQotCSAoc3RpbnN0X3R5cGUgKikgcmVhbGxvYygoY2hhciAqKShlbnRyeS0+Y29kZSksCi0JCQkgICAgICAgZW50cnktPmNvZGVfbGVuZ3RoICpzaXplb2Yod29yZF90eXBlKSk7Ci0gICAgfQotICAgIGVudHJ5LT5jb2RlW2VudHJ5LT5jb2RlX2VuZF0gPSB3b3JkOwotICAgIAotcmV0dXJuICAgICBlbnRyeS0+Y29kZV9lbmQrKzsgIAotfQotCi0KLQotCi0KLQotCi12b2lkCi1ERUZVTihhZGRfaW50cmluc2ljLChuYW1lLCBmdW5jKSwKLSAgICAgIGNoYXIgKm5hbWUgQU5ECi0gICAgICB2b2lkICgqZnVuYykoKSkKLXsKLSAgICBkaWN0X3R5cGUgKm5ldyA9IG5ld2VudHJ5KG5hbWUpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgZnVuYyk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCAwKTsKLX0KLQotdm9pZAotREVGVU4oYWRkX3ZhciwobmFtZSksCi0gICAgICBjaGFyICpuYW1lKQotewotICAgIGRpY3RfdHlwZSAqbmV3ID0gbmV3ZW50cnkobmFtZSk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCBwdXNoX251bWJlcik7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCAoc3RpbnN0X3R5cGUpKCYobmV3LT52YXIpKSk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LDApOwotfQotCi0KLXZvaWQgCi1ERUZVTihjb21waWxlLCAoc3RyaW5nKSwgCi0gICAgICBjaGFyICpzdHJpbmcpCi17Ci0gICAgLyogYWRkIHdvcmRzIHRvIHRoZSBkaWN0aW9uYXJ5ICovCi0gICAgY2hhciAqd29yZDsKLSAgICBzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLSAgICB3aGlsZSAoc3RyaW5nICYmICpzdHJpbmcgJiYgd29yZFswXSkgCi0gICAgewotCWlmIChzdHJjbXAod29yZCwidmFyIik9PTApIAotCXsKLSBzdHJpbmc9bmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAKLQkgIGFkZF92YXIod29yZCk7Ci0gc3RyaW5nPW5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCX0KLWVsc2UJCi0JICAgIAotCWlmICh3b3JkWzBdID09ICc6JykKLQl7Ci0JICAgIGRpY3RfdHlwZSAqcHRyOwotCSAgICAvKiBDb21waWxlIGEgd29yZCBhbmQgYWRkIHRvIGRpY3Rpb25hcnkgKi8KLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAgIAotCSAgICBwdHIgPSBuZXdlbnRyeSh3b3JkKTsKLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAgIHdoaWxlICh3b3JkWzBdICE9ICc7JyApIAotCSAgICB7Ci0JCSBzd2l0Y2ggKHdvcmRbMF0pIAotCQkgewotCQkgICBjYXNlICciJzoKLQkJICAgICAvKiBnb3QgYSBzdHJpbmcsIGVtYmVkIG1hZ2ljIHB1c2ggc3RyaW5nCi0JCQlmdW5jdGlvbiAqLwotCQkgICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwgcHVzaF90ZXh0KTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSkod29yZCsxKSk7Ci0JCSAgICAgYnJlYWs7Ci0JCSAgIGNhc2UgJzAnOgotCQkgICBjYXNlICcxJzoKLQkJICAgY2FzZSAnMic6Ci0JCSAgIGNhc2UgJzMnOgotCQkgICBjYXNlICc0JzoKLQkJICAgY2FzZSAnNSc6Ci0JCSAgIGNhc2UgJzYnOgotCQkgICBjYXNlICc3JzoKLQkJICAgY2FzZSAnOCc6Ci0JCSAgIGNhc2UgJzknOgotCQkgICAgIC8qIEdvdCBhIG51bWJlciwgZW1iZWRkIHRoZSBtYWdpYyBwdXNoIG51bWJlcgotCQkJZnVuY3Rpb24gKi8KLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIHB1c2hfbnVtYmVyKTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSlhdG9sKHdvcmQpKTsKLQkJICAgICBicmVhazsKLQkJICAgZGVmYXVsdDoKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIGNhbGwpOwotCQkgICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwgKHN0aW5zdF90eXBlKWxvb2t1cF93b3JkKHdvcmQpKTsKLQkJIH0KLQotCQlzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsJCSAgICAgCi0JICAgIH0KLQkgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLDApOwotCSAgICBzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJzeW50YXggZXJyb3IgYXQgJXNcbiIsc3RyaW5nLTEpOwotCX0JICAgIAotICAgIH0KLQotfQotCi0gCi1zdGF0aWMgdm9pZCBERUZVTl9WT0lEKGJhbmcpCi17Ci0gICoobG9uZyAqKSgoaXNwWzBdKSkgPSBpc3BbLTFdOwotICBpc3AtPTI7Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChhdHNpZ24pCi17Ci0gICAgaXNwWzBdID0gKihsb25nICopKGlzcFswXSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChoZWxsbykKLXsKLSAgcHJpbnRmKCJoZWxsb1xuIik7Ci0gIHBjKys7ICAgIAotfQotCi1XT1JEKHN0ZG91dF8pCi17Ci0gIGlzcCsrOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gICppc3AgPSAxOwotICBwYysrOwotfQotCi1XT1JEKHN0ZGVycl8pCi17Ci0gIGlzcCsrOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gICppc3AgPSAyOwotICBwYysrOwotfQotCi1XT1JEKHByaW50KQotewotICBpZiAoKmlzcCA9PSAxKQotICAgIHdyaXRlX2J1ZmZlciAodG9zLCBzdGRvdXQpOwotICBlbHNlIGlmICgqaXNwID09IDIpCi0gICAgd3JpdGVfYnVmZmVyICh0b3MsIHN0ZGVycik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJwcmludDogaWxsZWdhbCBwcmludCBkZXN0aW5hdGlvbiBgJWxkJ1xuIiwgKmlzcCk7Ci0gIGlzcC0tOwotICB0b3MtLTsKLSAgaWNoZWNrX3JhbmdlICgpOwotICBjaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotCi1zdGF0aWMgdm9pZCBERUZVTihyZWFkX2luLCAoc3RyLCBmaWxlKSwgCi0JICAgc3RyaW5nX3R5cGUgKnN0ciBBTkQKLQkJICBGSUxFICpmaWxlKQotewotICAgIGNoYXIgYnVmZlsxMDAwMF07ICAgIAotICAgIHVuc2lnbmVkIGludCByOwotICAgIGRvIAotICAgIHsKLQlyID0gZnJlYWQoYnVmZiwgMSwgc2l6ZW9mKGJ1ZmYpLCBmaWxlKTsKLQljYXRidWYoc3RyLCBidWZmLCByKTsKLSAgICB9Ci0gICAgd2hpbGUgKHIpOwotICAgIGJ1ZmZbMF0gPSAwOwotICAgIAotICAgIGNhdGJ1ZihzdHIsIGJ1ZmYsMSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU5fVk9JRCh1c2FnZSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwidXNhZ2U6IC1bZHxpfGddIDxmaWxlID5maWxlXG4iKTsKLSAgICBleGl0KDMzKTsgICAgCi19Ci0KLS8qIFRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBkZWNsYXJlIGV4aXQuICBTb21ldGltZXMgaXQgcmV0dXJucwotICAgaW50LCBhbmQgc29tZXRpbWVzIGl0IHJldHVybnMgdm9pZC4gIFNvbWV0aW1lcyBpdCBjaGFuZ2VzIGJldHdlZW4KLSAgIE9TIHJlbGVhc2VzLiAgVHJ5aW5nIHRvIGdldCBpdCBkZWNsYXJlZCBjb3JyZWN0bHkgaW4gdGhlIGhvc3RzIGZpbGUKLSAgIGlzIGEgcG9pbnRsZXNzIHdhc3RlIG9mIHRpbWUuICAqLwotCi1zdGF0aWMgdm9pZAotY2hld19leGl0ICgpCi17Ci0gIGV4aXQgKDApOwotfQotCi1pbnQgREVGVU4obWFpbiwoYWMsYXYpLAotaW50IGFjIEFORAotY2hhciAqYXZbXSkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cmluZ190eXBlIGJ1ZmZlcjsKLSAgc3RyaW5nX3R5cGUgcHB0cjsKLQotICBpbml0X3N0cmluZygmYnVmZmVyKTsKLSAgaW5pdF9zdHJpbmcoJnBwdHIpOwotICBpbml0X3N0cmluZyhzdGFjayswKTsKLSAgdG9zPXN0YWNrKzE7Ci0gIHB0ciA9ICZwcHRyOwotICAgIAotICBhZGRfaW50cmluc2ljKCJwdXNoX3RleHQiLCBwdXNoX3RleHQpOwotICBhZGRfaW50cmluc2ljKCIhIiwgYmFuZyk7Ci0gIGFkZF9pbnRyaW5zaWMoIkAiLCBhdHNpZ24pOwotICBhZGRfaW50cmluc2ljKCJoZWxsbyIsaGVsbG8pOyAgICAKLSAgYWRkX2ludHJpbnNpYygic3Rkb3V0IixzdGRvdXRfKTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInN0ZGVyciIsc3RkZXJyXyk7ICAgIAotICBhZGRfaW50cmluc2ljKCJwcmludCIscHJpbnQpOyAgICAKLSAgYWRkX2ludHJpbnNpYygic2tpcF9wYXN0X25ld2xpbmUiLCBza2lwX3Bhc3RfbmV3bGluZSApOwotICBhZGRfaW50cmluc2ljKCJjYXRzdHIiLCBpY2F0c3RyICk7Ci0gIGFkZF9pbnRyaW5zaWMoImNvcHlfcGFzdF9uZXdsaW5lIiwgaWNvcHlfcGFzdF9uZXdsaW5lICk7Ci0gIGFkZF9pbnRyaW5zaWMoImR1cCIsIG90aGVyX2R1cCApOwotICBhZGRfaW50cmluc2ljKCJkcm9wIiwgZHJvcCk7Ci0gIGFkZF9pbnRyaW5zaWMoImlkcm9wIiwgaWRyb3ApOwotICBhZGRfaW50cmluc2ljKCJyZW1jaGFyIiwgcmVtY2hhciApOwotICBhZGRfaW50cmluc2ljKCJnZXRfc3R1ZmZfaW5fY29tbWFuZCIsIGdldF9zdHVmZl9pbl9jb21tYW5kICk7Ci0gIGFkZF9pbnRyaW5zaWMoImRvX2ZhbmN5X3N0dWZmIiwgZG9fZmFuY3lfc3R1ZmYgKTsKLSAgYWRkX2ludHJpbnNpYygiYnVsbGV0aXplIiwgYnVsbGV0aXplICk7Ci0gIGFkZF9pbnRyaW5zaWMoImNvdXJpZXJpemUiLCBjb3VyaWVyaXplICk7Ci0gIC8qIElmIHRoZSBmb2xsb3dpbmcgbGluZSBnaXZlcyBhbiBlcnJvciwgZXhpdCgpIGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUKLSAgICAgLi4vaG9zdHMvZm9vLmggZmlsZSBmb3IgdGhpcyBob3N0LiAgRml4IGl0IHRoZXJlLCBub3QgaGVyZSEgICovCi0gIC8qIE5vLCBkb24ndCBmaXggaXQgYW55d2hlcmU7IHNlZSBjb21tZW50IG9uIGNoZXdfZXhpdC0tSWFuIFRheWxvci4gICovCi0gIGFkZF9pbnRyaW5zaWMoImV4aXQiLCBjaGV3X2V4aXQgKTsKLSAgYWRkX2ludHJpbnNpYygic3dhcCIsIHN3YXAgKTsKLSAgYWRkX2ludHJpbnNpYygib3V0cHV0ZG90cyIsIG91dHB1dGRvdHMgKTsKLSAgYWRkX2ludHJpbnNpYygicGFyYW1zdHVmZiIsIHBhcmFtc3R1ZmYgKTsKLSAgYWRkX2ludHJpbnNpYygibWF5YmVjYXRzdHIiLCBtYXliZWNhdHN0ciApOwotICBhZGRfaW50cmluc2ljKCJ0cmFuc2xhdGVjb21tZW50cyIsIHRyYW5zbGF0ZWNvbW1lbnRzICk7Ci0gIGFkZF9pbnRyaW5zaWMoImtpbGxfYm9ndXNfbGluZXMiLCBraWxsX2JvZ3VzX2xpbmVzKTsKLSAgYWRkX2ludHJpbnNpYygiaW5kZW50IiwgaW5kZW50KTsKLSAgYWRkX2ludHJpbnNpYygiaW50ZXJuYWxtb2RlIiwgaW50ZXJuYWxtb2RlKTsKLSAgYWRkX2ludHJpbnNpYygicHJpbnRfc3RhY2tfbGV2ZWwiLCBwcmludF9zdGFja19sZXZlbCk7Ci0gIGFkZF9pbnRyaW5zaWMoInN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIiwgc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMpOwotICAgIAotICAvKiBQdXQgYSBubCBhdCB0aGUgc3RhcnQgKi8KLSAgY2F0Y2hhcigmYnVmZmVyLCdcbicpOwotCi0gIHJlYWRfaW4oJmJ1ZmZlciwgc3RkaW4pOyAKLSAgcmVtb3ZlX25vbmNvbW1lbnRzKCZidWZmZXIsIHB0cik7Ci0gIGZvciAoaT0gMTsgaSA8ICh1bnNpZ25lZCBpbnQpIGFjOyBpKyspIAotICB7Ci0gICAgaWYgKGF2W2ldWzBdID09ICctJykKLSAgICB7Ci0gICAgICBpZiAoYXZbaV1bMV0gPT0gJ2YnKQotICAgICAgewotCXN0cmluZ190eXBlIGI7Ci0JRklMRSAqZjsKLQlpbml0X3N0cmluZygmYik7Ci0KLQlmICA9IGZvcGVuKGF2W2krMV0sInIiKTsKLQlpZiAoIWYpIAotCXsKLQkgIGZwcmludGYoc3RkZXJyLCJDYW4ndCBvcGVuIHRoZSBpbnB1dCBmaWxlICVzXG4iLGF2W2krMV0pOwotCSAgcmV0dXJuIDMzOwotCX0KLQotCXJlYWRfaW4oJmIsIGYpOwotCWNvbXBpbGUoYi5wdHIpOwotCXBlcmZvcm0oKTsJCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdltpXVsxXSA9PSAnaScpIAotICAgICAgewotCWludGVybmFsX3dhbnRlZCA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdltpXVsxXSA9PSAndycpIAotICAgICAgewotCXdhcm5pbmcgPSAxOwotICAgICAgfQotICAgICAgZWxzZQotCXVzYWdlICgpOwotICAgIH0KLSAgfSAgICAgIAotICB3cml0ZV9idWZmZXIoc3RhY2srMCwgc3Rkb3V0KTsKLSAgaWYgKHRvcyAhPSBzdGFjaykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJmaW5pc2hpbmcgd2l0aCBjdXJyZW50IHN0YWNrIGxldmVsICVkXG4iLCB0b3MgLSBzdGFjayk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9kb2Muc3RyIGIvYmZkL2RvYy9kb2Muc3RyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI3NmZlLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvZG9jLnN0cgorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi06IERPQ0RECi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBraWxsX2JvZ3VzX2xpbmVzIGNhdHN0cgotCTsKLQotOiBFTkRERAotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotCi06IEVYQU1QTEUKLQlza2lwX3Bhc3RfbmV3bGluZQkKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBraWxsX2JvZ3VzX2xpbmVzIGRvX2ZhbmN5X3N0dWZmIHRyYW5zbGF0ZWNvbW1lbnRzIAotCWNvdXJpZXJpemUgY2F0c3RyCi0KLQk7Ci0KLTogSU5PREUgCi0JIkBub2RlICIgY2F0c3RyIHNraXBfcGFzdF9uZXdsaW5lIGNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciAKLQk7Ci0KLTogQ09ERV9GUkFHTUVOVAotCUVYQU1QTEUgCi0JOwotCi06IENPTU1FTlQKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0JZHJvcAotCTsKLQotOiBTWU5PUFNJUwotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBzdHJvbmd7U3lub3BzaXN9XG4iIGNhdHN0cgotCSJAZXhhbXBsZVxuIiBjYXRzdHIKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCAgCi0Ja2lsbF9ib2d1c19saW5lcwotCWluZGVudAotCWNhdHN0cgotCSJAZW5kIGV4YW1wbGVcbiIgY2F0c3RyCi0KLQk7Ci0KLTogZnVuYwotCSJAZmluZGV4ICIJLSBhCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCWR1cAkJLSBhIHggeCAKLQkiQHN1YnN1YnNlY3Rpb24gQGNvZGV7IiAtIGEgeCB4IGIgCi0Jc3dhcAotCXJlbWNoYXIKLQkifVxuIiAtIGEgeCBiIHggYwotCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAotCTsKLQotOiBGVU5DVElPTgotCSJAZmluZGV4ICIJLSBhCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCWR1cAkJLSBhIHggeCAKLQkiQHN1YnN1YnNlY3Rpb24gQGNvZGV7IiAtIGEgeCB4IGIgCi0Jc3dhcAotCXJlbWNoYXIKLQkifVxuIiAtIGEgeCBiIHggYwotCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAotCTsKLQotOiBib2R5dGV4dAotCWdldF9zdHVmZl9pbl9jb21tYW5kIAotCWJ1bGxldGl6ZQotCWtpbGxfYm9ndXNfbGluZXMKLQlkb19mYW5jeV9zdHVmZgotCWNvdXJpZXJpemUKLQljYXRzdHIKLQkiXG4iIGNhdHN0cgotCTsKLQotOiBhc2VjdGlvbgotCXNraXBfcGFzdF9uZXdsaW5lCi0JY2F0c3RyCi0JY29weV9wYXN0X25ld2xpbmUgCQotCWRvX2ZhbmN5X3N0dWZmIGNhdHN0ciAJCi0JYm9keXRleHQJCi0JOwotCi06IFNFQ1RJT04gCi0JIkBzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBTVUJTRUNUSU9OCi0JIkBzdWJzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBTVUJTVUJTRUNUSU9OCi0JIkBzdWJzdWJzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBzdWJoZWFkCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlib2R5dGV4dAotCTsKLQotCi0KLQkKLTogREVTQ1JJUFRJT04gCi0JIkBzdHJvbmd7RGVzY3JpcHRpb259QCpcbiIgY2F0c3RyIHN1YmhlYWQgOwotCi06IFJFVFVSTlMKLQkiQHN0cm9uZ3tSZXR1cm5zfUAqXG4iIGNhdHN0ciBzdWJoZWFkIDsKLQotOiBJTlRFUk5BTF9GVU5DVElPTgotCWZ1bmMgOwotCi0KLTogSU5URVJOQUxfREVGSU5JVElPTiAKLQlmdW5jIDsKLQotCi06IElOVEVSTkFMCi0JZnVuYyA7Ci0KLTogVFlQRURFRgotCUZVTkNUSU9OIDsKLQotOiBTRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkhlcmUgYXJlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIEBjb2Rle2VudW0gIgotCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIgY2F0c3RyCi0JIn06XG5cbiIgY2F0c3RyIGNhdHN0cgotCTsKLTogRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbiB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyIGNhdHN0cgotCTsKLTogRU5VTVgKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm54IHt9ICIKLQljb3B5X3Bhc3RfbmV3bGluZSBjYXRzdHIKLQljYXRzdHIKLQk7Ci06IEVOVU1FUQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbiB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyIGNhdHN0cgotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotOiBFTlVNRVFYCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiQGRlZmZueCB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyCi0JY2F0c3RyCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQk7Ci06IEVOVU1ET0MKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0Jc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKLQljYXRzdHIKLQkiXG5AZW5kIGRlZmZuXG4iIGNhdHN0cgotCTsKZGlmZiAtLWdpdCBhL2JmZC9kb2MvbWFrZWZpbGUudm1zIGIvYmZkL2RvYy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODU3YzAuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUNGTEFHUyA9IC9ub29wdC9pbmNsdWRlPShbXSxbLV0sWy0uLS5pbmNsdWRlXSkKLUxERkxBR1MgPSAvbm9tYXAKLUxETElCUyA9ICxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi0KLWFsbDogY2hldy5leGUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvcHJvdG8uc3RyIGIvYmZkL2RvYy9wcm90by5zdHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MzFjMTYuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9wcm90by5zdHIKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotCi06IFNZTk9QU0lTCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAkKLQlwYXJhbXN0dWZmCi0JaW5kZW50Ci0JbWF5YmVjYXRzdHIKLTsKLQotOiBpZ25vcmUKLQlza2lwX3Bhc3RfbmV3bGluZSAKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCW91dHB1dGRvdHMKLQltYXliZWNhdHN0cgotCTsKLQotOiBDT0RFX0ZSQUdNRU5UCi0JaWdub3JlIDsKLQotOiBleHRlcm5hbAotCTAgaW50ZXJuYWxtb2RlIGlnbm9yZSA7Ci0KLTogaW50ZXJuYWwgCi0JMSBpbnRlcm5hbG1vZGUgaWdub3JlIDsKLQotLSBpbnB1dCBzdGFjayB7IGEgYiB9IG91dHB1dCBiIGlmIGludGVybmFsLCBhIGlmIGV4dGVybmFsCi06IGlmaW50ZXJuYWwKLQkiIiBzd2FwIDEgaW50ZXJuYWxtb2RlIG1heWJlY2F0c3RyCi0Jc3dhcAotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQljYXRzdHIKLQk7Ci0KLS0gUHV0IG5vdGUgaW4gb3V0cHV0IHN0cmluZywgcmVnYXJkbGVzcyBvZiBpbnRlcm5hbCBtb2RlLgotOiBDT01NRU5UCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCXRyYW5zbGF0ZWNvbW1lbnRzCi0JY2F0c3RyCi0JOwotCi0tIFNFTlVNICAgIGVudW0tdHlwZS1uYW1lCi0tIEVOVU0gICAgIGVudW0tbmFtZQotLSBFTlVNWCAgICBhZGRsLWVudW0tbmFtZQotLSBFTlVNRE9DICBkb2MgZm9yIHByZWNlZGluZyBlbnVtcwotLSBFTkRTRU5VTSBtYXgtZW51bS1uYW1lCi0KLTogbWFrZV9lbnVtX2hlYWRlcgotCWR1cAotCSJlbnVtICIgc3dhcCBjYXRzdHIKLQkiIHtcbiIgY2F0c3RyCi0Jc3dhcCAiICBfZHVtbXlfZmlyc3RfIiBzd2FwIGNhdHN0ciBjYXRzdHIKLQkiLFxuIiBjYXRzdHIKLQk7Ci06IG1ha2Vfc3RyaW5nX3RhYmxlX2hlYWRlcgotCWR1cAotCSIjaWZkZWYgX0JGRF9NQUtFX1RBQkxFXyIgc3dhcCBjYXRzdHIgc3dhcAotCSJcblxuc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0ICIgc3dhcCBjYXRzdHIgY2F0c3RyCi0JIl9uYW1lc1tdID0geyBcIkBAdW5pbml0aWFsaXplZEBAXCIsXG4iIGNhdHN0cgotCTsKLTogU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNvcHlfcGFzdF9uZXdsaW5lCi0JcmVtY2hhcgotCWR1cAotCW1ha2VfZW51bV9oZWFkZXIKLQlzd2FwCi0JbWFrZV9zdHJpbmdfdGFibGVfaGVhZGVyCi0JaWZpbnRlcm5hbAotCWNhdHN0cgotCWdldF9zdHVmZl9pbl9jb21tYW5kIGNhdHN0cgotCXRyYW5zbGF0ZWNvbW1lbnRzIDsKLTogRU5EU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNvcHlfcGFzdF9uZXdsaW5lIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzCi0JZHVwCi0JIiAgIiBzd2FwIGNhdHN0ciAiIH07XG4iIGNhdHN0cglzd2FwCi0JIiBcIkBAb3ZlcmZsb3c6ICIgc3dhcCBjYXRzdHIgIkBAXCIsXG59O1xuI2VuZGlmXG5cbiIgY2F0c3RyCi0JaWZpbnRlcm5hbAotCWNhdHN0cgotCTsKLTogbWFrZV9lbnVtZXJhdG9yCi0JIiAgIiBzd2FwIGNhdHN0cgotCSIsXG4iIGNhdHN0cgotCTsKLTogbWFrZV9lbnVtZXJhdG9yX3N0cmluZwotCSIgIFwiIiBzd2FwIGNhdHN0cgotCSJcIixcbiIgY2F0c3RyCi0JOwotOiBFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCXJlbWNoYXIKLQlkdXAKLQltYWtlX2VudW1lcmF0b3IKLQlzd2FwCi0JbWFrZV9lbnVtZXJhdG9yX3N0cmluZwotCWlmaW50ZXJuYWwKLQk7Ci06IEVOVU1YIEVOVU0gY2F0c3RyIDsKLTogRU5VTUVRCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiI2RlZmluZSAiCi0JY29weV9wYXN0X25ld2xpbmUgcmVtY2hhcgotCWNhdHN0cgotCSIgIgotCWNhdHN0cgotCWNvcHlfcGFzdF9uZXdsaW5lCi0JY2F0c3RyCi0JIiIgc3dhcCAwIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCTsKLTogRU5VTUVRWCBFTlVNRVEgY2F0c3RyIDsKLTogRU5VTURPQwotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlzdHJpcF90cmFpbGluZ19uZXdsaW5lcwotCSJcbnsqICIgc3dhcCBjYXRzdHIgIiAqfVxuIiBjYXRzdHIKLQl0cmFuc2xhdGVjb21tZW50cwotCS0gZGlzY2FyZCBpdCBpZiB3ZSdyZSBkb2luZyBpbnRlcm5hbCBtb2RlCi0JIiIgc3dhcCAwIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCXN3YXAKLQljYXRzdHIgY2F0c3RyCi0JOwotOiBFTkRERCBleHRlcm5hbCA7Ci06IFNFQ1RJT04gaWdub3JlIDsKLTogU1VCU0VDVElPTiBpZ25vcmUgOwotOiBTVUJTVUJTRUNUSU9OIGlnbm9yZSA7Ci06IElOVEVSTkFMX0RFRklOSVRJT04gaW50ZXJuYWwgOwotOiBERVNDUklQVElPTiBpZ25vcmUgOwotOiBGVU5DVElPTiBleHRlcm5hbCA7Ci06IFJFVFVSTlMgaWdub3JlIDsKLTogVFlQRURFRiBleHRlcm5hbCA7Ci06IElOVEVSTkFMX0ZVTkNUSU9OIGludGVybmFsIDsKLTogSU5URVJOQUwgaW50ZXJuYWwgOwotOiBJTk9ERSBpZ25vcmUgOwpkaWZmIC0tZ2l0IGEvYmZkL2R3YXJmMS5jIGIvYmZkL2R3YXJmMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE4NGNjLi4wMDAwMDAwCi0tLSBhL2JmZC9kd2FyZjEuYworKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKiBEV0FSRiAxIGZpbmQgbmVhcmVzdCBsaW5lIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSkuCi0gICBDb3B5cmlnaHQgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotV3JpdHRlbiBieSBHYXZpbiBSb21pZy1Lb2NoIG9mIEN5Z251cyBTb2x1dGlvbnMgKGdhdmluQGN5Z251cy5jb20pLiAgCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZHdhcmYuaCIKLQotLyogZHdhcmYxX2RlYnVnIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgYWxsIGR3YXJmMSBpbmZvLiAqLwotCi1zdHJ1Y3QgZHdhcmYxX2RlYnVnIHsKLQotICAvKiBUaGUgYmZkIHdlIGFyZSB3b3JraW5nIHdpdGguICovCi0gIGJmZCogYWJmZDsKLQotICAvKiBMaXN0IG9mIGFscmVhZHkgcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXRzLiAqLwotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGxhc3RVbml0OwotCi0gIC8qIFRoZSBidWZmZXIgZm9yIHRoZSAuZGVidWcgc2VjdGlvbi4gCi0gICAgIFplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIC5kZWJ1ZyBzZWN0aW9uIGZhaWxlZCB0byBsb2FkLiAqLwotICBjaGFyKiBkZWJ1Z19zZWN0aW9uOwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBtZW1vcnkgYnVmZmVyLiAqLwotICBjaGFyKiBkZWJ1Z19zZWN0aW9uX2VuZDsKLQotICAvKiBUaGUgYnVmZmVyIGZvciB0aGUgLmxpbmUgc2VjdGlvbi4gKi8KLSAgY2hhciogbGluZV9zZWN0aW9uOwotCi0gIC8qIEVuZCBvZiB0aGF0IGJ1ZmZlci4gKi8KLSAgY2hhciogbGluZV9zZWN0aW9uX2VuZDsKLQotICAvKiBUaGUgY3VycmVudCBvciBuZXh0IHVucmVhZCBkaWUgd2l0aGluIHRoZSAuZGVidWcgc2VjdGlvbi4gKi8KLSAgY2hhciogY3VycmVudERpZTsKLX07Ci0KLS8qIE9uZSBkd2FyZjFfdW5pdCBmb3IgZWFjaCBwYXJzZWQgY29tcGlsYXRpb24gdW5pdCBkaWUuICovCi0KLXN0cnVjdCBkd2FyZjFfdW5pdCB7Ci0gIC8qIExpbmtlZCBzdGFydGluZyBmcm9tIHN0YXNoLT5sYXN0VW5pdC4gKi8KLSAgc3RydWN0IGR3YXJmMV91bml0KiBwcmV2OwotCi0gIC8qIE5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIGNoYXIqIG5hbWU7Ci0KLSAgLyogVGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBhZGRyZXNzIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci0KLSAgLyogRG9lcyB0aGlzIHVuaXQgaGF2ZSBhIHN0YXRlbWVudCBsaXN0PyAqLwotICBpbnQgaGFzX3N0bXRfbGlzdDsKLQotICAvKiBJZiBhbnksIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmUgbnVtYmVyIHRhYmxlIGluIHRoZSAubGluZSBzZWN0aW9uLiAqLwotICB1bnNpZ25lZCBsb25nIHN0bXRfbGlzdF9vZmZzZXQ7Ci0KLSAgLyogSWYgbm9uLXplcm8sIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyB1bml0LiAqLwotICBjaGFyKiBmaXJzdF9jaGlsZDsKLQotICAvKiBIb3cgbWFueSBsaW5lIGVudHJpZXM/ICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZV9jb3VudDsKLQotICAvKiBUaGUgZGVjb2RlZCBsaW5lIG51bWJlciB0YWJsZSAobGluZV9jb3VudCBlbnRyaWVzKS4gKi8KLSAgc3RydWN0IGxpbmVudW1iZXIqIGxpbmVudW1iZXJfdGFibGU7Ci0KLSAgLyogVGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGluIHRoaXMgdW5pdC4gKi8KLSAgc3RydWN0IGR3YXJmMV9mdW5jKiBmdW5jX2xpc3Q7Ci19OwotCi0KLQotLyogT25lIGR3YXJmMV9mdW5jIGZvciBlYWNoIHBhcnNlZCBmdW5jdGlvbiBkaWUuICAqLwotCi1zdHJ1Y3QgZHdhcmYxX2Z1bmMgewotICAvKiBMaW5rZWQgc3RhcnRpbmcgZnJvbSBhVW5pdC0+ZnVuY19saXN0LiAqLwotICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIHByZXY7Ci0gIAotICAvKiBOYW1lIG9mIGZ1bmN0aW9uLiAqLwotICBjaGFyKiBuYW1lOwotICAKLSAgLyogVGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBhZGRyZXNzIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci19OwotCi0KLS8qIFVzZWQgdG8gcmV0dXJuIGluZm8gYWJvdXQgYSBwYXJzZWQgZGllLiAqLwotc3RydWN0IGRpZV9pbmZvIHsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIHVuc2lnbmVkIGxvbmcgc2libGluZzsKLSAgdW5zaWduZWQgbG9uZyBsb3dfcGM7Ci0gIHVuc2lnbmVkIGxvbmcgaGlnaF9wYzsKLSAgdW5zaWduZWQgbG9uZyBzdG10X2xpc3Rfb2Zmc2V0OwotICAKLSAgY2hhciogbmFtZTsgCi0gIAotICBpbnQgaGFzX3N0bXRfbGlzdDsKLQotICB1bnNpZ25lZCBzaG9ydCB0YWc7Ci19OwotCi0KLS8qIFBhcnNlZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gKi8KLXN0cnVjdCBsaW5lbnVtYmVyIHsKLSAgLyogRmlyc3QgYWRkcmVzcyBpbiB0aGUgbGluZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBhZGRyOwotCi0gIC8qIFRoZSBsaW5lIG51bWJlci4gKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lbnVtYmVyOwotfTsKLQotCi0vKiBGaW5kIHRoZSBmb3JtIG9mIGFuIGF0dHIsIGZyb20gdGhlIGF0dHIgZmllbGQuICovCi0jZGVmaW5lIEZPUk1fRlJPTV9BVFRSKGF0dHIpCSgoYXR0cikgJiAweEYpCS8qIEltcGxpY2l0bHkgc3BlY2lmaWVkICovCi0KLQotLyogUmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGR3YXJmMV91bml0LiAgSXQgc2hvdWxkIGJlIGNsZWFyZWQgYW5kCi0gICB0aGVuIGF0dGFjaGVkIGludG8gdGhlICdzdGFzaCcgYXQgJ3N0YXNoLT5sYXN0VW5pdCcuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZHdhcmYxX3VuaXQqCi1hbGxvY19kd2FyZjFfdW5pdCAoc3Rhc2gpCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotewotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIHggPSAKLSAgICAoc3RydWN0IGR3YXJmMV91bml0KikgYmZkX3phbGxvYyAoc3Rhc2gtPmFiZmQsIAotCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGR3YXJmMV91bml0KSk7Ci0gIHgtPnByZXYgPSBzdGFzaC0+bGFzdFVuaXQ7Ci0gIHN0YXNoLT5sYXN0VW5pdCA9IHg7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkd2FyZjFfZnVuYy4gIEl0IG11c3QgYmUgY2xlYXJlZCBhbmQKLSAgIGF0dGFjaGVkIGludG8gJ2FVbml0JyBhdCAnYVVuaXQtPmZ1bmNfbGlzdCcuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZHdhcmYxX2Z1bmMqCi1hbGxvY19kd2FyZjFfZnVuYyAoc3Rhc2gsIGFVbml0KQotICAgICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgICAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgc3RydWN0IGR3YXJmMV9mdW5jKiB4ID0gCi0gICAgKHN0cnVjdCBkd2FyZjFfZnVuYyopIGJmZF96YWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBkd2FyZjFfZnVuYykpOwotICB4LT5wcmV2ID0gYVVuaXQtPmZ1bmNfbGlzdDsKLSAgYVVuaXQtPmZ1bmNfbGlzdCA9IHg7Ci0gIAotICByZXR1cm4geDsKLX0KLQotLyogcGFyc2VfZGllIC0gcGFyc2UgYSBEd2FyZjEgZGllLgotICAgUGFyc2UgdGhlIGRpZSBzdGFydGluZyBhdCAnYURpZVB0cicgaW50byAnYURpZUluZm8nLgotICAgJ2FiZmQnIG11c3QgYmUgdGhlIGJmZCBmcm9tIHdoaWNoIHRoZSBzZWN0aW9uIHRoYXQgJ2FEaWVQdHInCi0gICBwb2ludHMgdG8gd2FzIHB1bGxlZCBmcm9tLiAKLQotICAgUmV0dXJuIGZhbHNlIGlmIHRoZSBkaWUgaXMgaW52YWxpZGx5IGZvcm1hdHRlZDsgdHJ1ZSBvdGhlcndpc2UuICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9kaWUgKGFiZmQsIGFEaWVJbmZvLCBhRGllUHRyKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIHN0cnVjdCBkaWVfaW5mbyogYURpZUluZm87Ci0gICAgIGNoYXIqICAgICAgICAgICAgYURpZVB0cjsKLXsKLSAgY2hhciogdGhpc19kaWUgPSBhRGllUHRyOwotICBjaGFyKiB4cHRyID0gdGhpc19kaWU7Ci0KLSAgbWVtc2V0IChhRGllSW5mbywwLHNpemVvZigqYURpZUluZm8pKTsKLQotICAvKiBGaXJzdCBjb21lcyB0aGUgbGVuZ3RoLiAqLwotICBhRGllSW5mby0+bGVuZ3RoID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0gIHhwdHIgKz0gNDsKLSAgaWYgKGFEaWVJbmZvLT5sZW5ndGggPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChhRGllSW5mby0+bGVuZ3RoIDwgNikKLSAgICB7Ci0gICAgICAvKiBKdXN0IHBhZGRpbmcgYnl0ZXMuICovCi0gICAgICBhRGllSW5mby0+dGFnID0gVEFHX3BhZGRpbmc7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhlbiB0aGUgdGFnLiAqLwotICBhRGllSW5mby0+dGFnID0gYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7Ci0gIHhwdHIgKz0gMjsKLSAgICAgIAotICAvKiBUaGVuIHRoZSBhdHRyaWJ1dGVzLiAqLwotICB3aGlsZSAoeHB0ciA8ICh0aGlzX2RpZSArIGFEaWVJbmZvLT5sZW5ndGgpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGF0dHI7Ci0gICAgICAKLSAgICAgIC8qIFBhcnNlIHRoZSBhdHRyaWJ1dGUgYmFzZWQgb24gaXRzIGZvcm0uICBUaGlzIHNlY3Rpb24gCi0gICAgICAgICBtdXN0IGhhbmRsZSBhbGwgZHdhcmYxIGZvcm1zLCBidXQgbmVlZCBvbmx5IGhhbmRsZSB0aGUKLQkgYWN0dWFsIGF0dHJpYnV0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0LiAqLwotCi0gICAgICBhdHRyID0gYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7Ci0gICAgICB4cHRyICs9IDI7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAoRk9STV9GUk9NX0FUVFIgKGF0dHIpKQotCXsKLQljYXNlIEZPUk1fREFUQTI6Ci0JICB4cHRyICs9IDI7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fREFUQTQ6Ci0JY2FzZSBGT1JNX1JFRjoKLQkgIGlmIChhdHRyID09IEFUX3NpYmxpbmcpCi0JICAgIGFEaWVJbmZvLT5zaWJsaW5nID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICBlbHNlIGlmIChhdHRyID09IEFUX3N0bXRfbGlzdCkKLQkgICAgewotCSAgICAgIGFEaWVJbmZvLT5zdG10X2xpc3Rfb2Zmc2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICAgICAgYURpZUluZm8tPmhhc19zdG10X2xpc3QgPSAxOwotCSAgICB9Ci0JICB4cHRyICs9IDQ7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fREFUQTg6Ci0JICB4cHRyICs9IDg7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fQUREUjoKLQkgIGlmIChhdHRyID09IEFUX2xvd19wYykKLQkgICAgYURpZUluZm8tPmxvd19wYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgZWxzZSBpZiAoYXR0ciA9PSBBVF9oaWdoX3BjKQotCSAgICBhRGllSW5mby0+aGlnaF9wYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgeHB0ciArPSA0OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0JMT0NLMjoKLQkgIHhwdHIgKz0gMiArIGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0JMT0NLNDoKLQkgIHhwdHIgKz0gNCArIGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX1NUUklORzoKLQkgIGlmIChhdHRyID09IEFUX25hbWUpCi0JICAgIGFEaWVJbmZvLT5uYW1lID0geHB0cjsKLQkgIHhwdHIgKz0gc3RybGVuICh4cHRyKSArIDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIGR3YXJmMSBsaW5lIG51bWJlciB0YWJsZSBmb3IgJ2FVbml0LT5zdG10X2xpc3Rfb2Zmc2V0JwotICAgaW50byAnYVVuaXQtPmxpbmVudW1iZXJfdGFibGUnLiAgUmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIAotICAgb2NjdXJzOyB0cnVlIG90aGVyd2lzZS4gKi8KLSAgCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfbGluZV90YWJsZSAoc3Rhc2gsIGFVbml0KQotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgY2hhciogeHB0cjsKLQotICAvKiBMb2FkIHRoZSAiLmxpbmUiIHNlY3Rpb24gZnJvbSB0aGUgYmZkIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS4gKi8gCi0gIGlmIChzdGFzaC0+bGluZV9zZWN0aW9uID09IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci0gICAgICAKLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rhc2gtPmFiZmQsICIubGluZSIpOwotICAgICAgaWYgKCEgbXNlYykKLQlyZXR1cm4gZmFsc2U7Ci0JICAKLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmxpbmVfc2VjdGlvbiA9ICh1bnNpZ25lZCBjaGFyKikgYmZkX2FsbG9jIChzdGFzaC0+YWJmZCwgc2l6ZSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoLT5saW5lX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHN0YXNoLT5hYmZkLCBtc2VjLCBzdGFzaC0+bGluZV9zZWN0aW9uLCAwLCBzaXplKSkKLQl7Ci0JICBzdGFzaC0+bGluZV9zZWN0aW9uID0gMDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0YXNoLT5saW5lX3NlY3Rpb25fZW5kID0gc3Rhc2gtPmxpbmVfc2VjdGlvbiArIHNpemU7Ci0gICAgfQotCi0gIHhwdHIgPSBzdGFzaC0+bGluZV9zZWN0aW9uICsgYVVuaXQtPnN0bXRfbGlzdF9vZmZzZXQ7Ci0gIGlmICh4cHRyIDwgc3Rhc2gtPmxpbmVfc2VjdGlvbl9lbmQpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBlYWNoTGluZTsKLQotICAgICAgY2hhciogdGJsZW5kOwotICAgICAgdW5zaWduZWQgbG9uZyBiYXNlOwotCi0gICAgICAvKiBGaXJzdCBjb21lcyB0aGUgbGVuZ3RoLiAqLwotICAgICAgdGJsZW5kID0gYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpICsgeHB0cjsKLSAgICAgIHhwdHIgKz0gNDsKLQotICAgICAgLyogVGhlbiB0aGUgYmFzZSBhZGRyZXNzIGZvciBlYWNoIGFkZHJlc3MgaW4gdGhlIHRhYmxlLiAqLwotICAgICAgYmFzZSA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKTsKLSAgICAgIHhwdHIgKz0gNDsKLQotICAgICAgLyogSG93IG1hbnkgbGluZSBlbnRyeXM/Ci0JIDEwID0gNCAobGluZSBudW1iZXIpICsgMiAocG9zIGluIGxpbmUpICsgNCAoYWRkcmVzcyBpbiBsaW5lKSAqLwotICAgICAgYVVuaXQtPmxpbmVfY291bnQgPSAodGJsZW5kIC0geHB0cikgLyAxMDsKLQotICAgICAgLyogQWxsb2NhdGUgYW4gYXJyYXkgZm9yIHRoZSBlbnRyaWVzLiAqLwotICAgICAgYVVuaXQtPmxpbmVudW1iZXJfdGFibGUgPSAoc3RydWN0IGxpbmVudW1iZXIqKQotCWJmZF9hbGxvYyAoc3Rhc2gtPmFiZmQsIAotCQkgICBzaXplb2YgKHN0cnVjdCBsaW5lbnVtYmVyKSAqIGFVbml0LT5saW5lX2NvdW50KTsKLQkKLSAgICAgIGZvciAoZWFjaExpbmUgPSAwOyBlYWNoTGluZSA8IGFVbml0LT5saW5lX2NvdW50OyBlYWNoTGluZSsrKQotCXsKLQkgIC8qIEEgbGluZSBudW1iZXIuICovCi0JICBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtlYWNoTGluZV0ubGluZW51bWJlcgotCSAgICA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKTsKLQkgIHhwdHIgKz0gNDsKLQotCSAgLyogU2tpcCB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBsaW5lLiAqLwotCSAgeHB0ciArPSAyOwotCi0JICAvKiBBbmQgZmluYWxseSB0aGUgYWRkcmVzcy4gKi8KLQkgIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2VhY2hMaW5lXS5hZGRyIAotCSAgICA9IGJhc2UgKyBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0JICB4cHRyICs9IDQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgZWFjaCBmdW5jdGlvbiBkaWUgaW4gYSBjb21waWxhdGlvbiB1bml0ICdhVW5pdCcuCi0gICBUaGUgZmlyc3QgY2hpbGQgZGllIG9mICdhVW5pdCcgc2hvdWxkIGJlIGluICdhVW5pdC0+Zmlyc3RfY2hpbGQnLAotICAgdGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gJ2FVbml0LT5mdW5jX2xpc3QnLgotICAgUmV0dXJuIGZhbHNlIGlmIGVycm9yOyB0cnVlIG90aGVyd2lzZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2Z1bmN0aW9uc19pbl91bml0IChzdGFzaCwgYVVuaXQpCi0gICAgIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotICAgICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0OwotewotICBjaGFyKiBlYWNoRGllOwotCi0gIGlmIChhVW5pdC0+Zmlyc3RfY2hpbGQpCi0gICAgZm9yIChlYWNoRGllID0gYVVuaXQtPmZpcnN0X2NoaWxkOwotCSBlYWNoRGllIDwgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kOwotCSApCi0gICAgICB7Ci0Jc3RydWN0IGRpZV9pbmZvIGVhY2hEaWVJbmZvOwotCQotCWlmICghIHBhcnNlX2RpZSAoc3Rhc2gtPmFiZmQsICZlYWNoRGllSW5mbywgZWFjaERpZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JCi0JaWYgKGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfZ2xvYmFsX3N1YnJvdXRpbmUKLQkgICAgfHwgZWFjaERpZUluZm8udGFnID09IFRBR19zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfaW5saW5lZF9zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfZW50cnlfcG9pbnQpCi0JICB7Ci0JICAgIHN0cnVjdCBkd2FyZjFfZnVuYyogYUZ1bmMgPSBhbGxvY19kd2FyZjFfZnVuYyAoc3Rhc2gsYVVuaXQpOwotCSAgICAKLQkgICAgYUZ1bmMtPm5hbWUgPSBlYWNoRGllSW5mby5uYW1lOwotCSAgICBhRnVuYy0+bG93X3BjID0gZWFjaERpZUluZm8ubG93X3BjOwotCSAgICBhRnVuYy0+aGlnaF9wYyA9IGVhY2hEaWVJbmZvLmhpZ2hfcGM7Ci0JICB9Ci0JCi0JLyogTW92ZSB0byBuZXh0IHNpYmxpbmcsIGlmIG5vbmUsIGVuZCBsb29wICovCi0JaWYgKGVhY2hEaWVJbmZvLnNpYmxpbmcpCi0JICBlYWNoRGllID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBlYWNoRGllSW5mby5zaWJsaW5nOwotCWVsc2UKLQkgIGJyZWFrOwotICAgICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byAnYWRkcicgaW4gJ2FVbml0Jy4KLSAgIFJldHVybiB3aGV0aGVyIHdlIGZvdW5kIHRoZSBsaW5lIChvciBhIGZ1bmN0aW9uKSB3aXRob3V0IGVycm9yLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHN0YXNoLCBhVW5pdCwgYWRkciwgCi0JCSAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCSAgICAgICBsaW5lbnVtYmVyX3B0cikKLSAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcjsKLSAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIGludCBsaW5lX3AgPSBmYWxzZTsKLSAgaW50IGZ1bmNfcCA9IGZhbHNlOwotCi0gIGlmIChhVW5pdC0+bG93X3BjIDw9IGFkZHIgJiYgYWRkciA8IGFVbml0LT5oaWdoX3BjKQotICAgIHsKLSAgICAgIGlmIChhVW5pdC0+aGFzX3N0bXRfbGlzdCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGk7Ci0JICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIGVhY2hGdW5jOwotCi0JICBpZiAoISBhVW5pdC0+bGluZW51bWJlcl90YWJsZSkKLQkgICAgewotCSAgICAgIGlmICghIHBhcnNlX2xpbmVfdGFibGUgKHN0YXNoLCBhVW5pdCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoISBhVW5pdC0+ZnVuY19saXN0KQotCSAgICB7Ci0JICAgICAgaWYgKCEgcGFyc2VfZnVuY3Rpb25zX2luX3VuaXQgKHN0YXNoLCBhVW5pdCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYVVuaXQtPmxpbmVfY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChhVW5pdC0+bGluZW51bWJlcl90YWJsZVtpXS5hZGRyIDw9IGFkZHIKLQkJICAmJiBhZGRyIDwgYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbaSsxXS5hZGRyKQotCQl7Ci0JCSAgKmZpbGVuYW1lX3B0ciA9IGFVbml0LT5uYW1lOwotCQkgICpsaW5lbnVtYmVyX3B0ciA9IGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2ldLmxpbmVudW1iZXI7Ci0JCSAgbGluZV9wID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGZvciAoZWFjaEZ1bmMgPSBhVW5pdC0+ZnVuY19saXN0OyAKLQkgICAgICAgZWFjaEZ1bmM7IAotCSAgICAgICBlYWNoRnVuYyA9IGVhY2hGdW5jLT5wcmV2KQotCSAgICB7Ci0JICAgICAgaWYgKGVhY2hGdW5jLT5sb3dfcGMgPD0gYWRkcgotCQkgICYmIGFkZHIgPCBlYWNoRnVuYy0+aGlnaF9wYykKLQkJewotCQkgICpmdW5jdGlvbm5hbWVfcHRyID0gZWFjaEZ1bmMtPm5hbWU7Ci0JCSAgZnVuY19wID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gbGluZV9wIHx8IGZ1bmNfcDsKLX0KLQotCi0KLQotLyogVGhlIERXQVJGIDEgdmVyc2lvbiBvZiBmaW5kX25lYXJlc3QgbGluZS4KLSAgIFJldHVybiB0cnVlIGlmIHRoZSBsaW5lIGlzIGZvdW5kIHdpdGhvdXQgZXJyb3IuICovCi0KLWJvb2xlYW4KLV9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIHN0cnVjdCBkd2FyZjFfZGVidWcgKnN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYxX2ZpbmRfbGluZV9pbmZvOwotCi0gIHN0cnVjdCBkd2FyZjFfdW5pdCogZWFjaFVuaXQ7Ci0KLSAgLyogV2hhdCBhZGRyZXNzIGFyZSB3ZSBsb29raW5nIGZvcj8gKi8KLSAgYmZkX3ZtYSBhZGRyID0gb2Zmc2V0ICsgc2VjdGlvbi0+dm1hOwotCi0gICpmaWxlbmFtZV9wdHIgPSBOVUxMOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IE5VTEw7Ci0gICpsaW5lbnVtYmVyX3B0ciA9IDA7Ci0gIAotCi0gIGlmICghIHN0YXNoKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMV9maW5kX2xpbmVfaW5mbyA9Ci0JKHN0cnVjdCBkd2FyZjFfZGVidWcqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZjFfZGVidWcpKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWciKTsKLSAgICAgIGlmICghIG1zZWMpCi0JewotCSAgLyogTm8gZHdhcmYxIGluZm8uICBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgc3Rhc2gKLQkgICAgIGhhcyBiZWVuIGFsbG9jYXRlZCwgYnV0IGNvbnRhaW5zIHplcm9zLCB0aGlzIGxldHMKLQkgICAgIGZ1dHVyZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGZhaWwgcXVpY2tlci4gKi8KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmRlYnVnX3NlY3Rpb24gPSAodW5zaWduZWQgY2hhciopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoLT5kZWJ1Z19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCBzdGFzaC0+ZGVidWdfc2VjdGlvbiwgMCwgc2l6ZSkpCi0JewotCSAgc3Rhc2gtPmRlYnVnX3NlY3Rpb24gPSAwOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBzaXplOwotICAgICAgc3Rhc2gtPmN1cnJlbnREaWUgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbjsKLSAgICAgIHN0YXNoLT5hYmZkID0gYWJmZDsKLSAgICB9Ci0KLSAgLyogQSBudWxsIGRlYnVnX3NlY3Rpb24gaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIG5vIGR3YXJmMSBpbmZvCi0gICAgIG9yIHRoYXQgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBzdGFzaC4gKi8KLQotICBpZiAoISBzdGFzaC0+ZGVidWdfc2VjdGlvbikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotCi0gIC8qIExvb2sgYXQgdGhlIHByZXZpb3VzbHkgcGFyc2VkIHVuaXRzIHRvIHNlZSBpZiBhbnkgY29udGFpbgotICAgICB0aGUgYWRkci4gKi8KLSAgZm9yIChlYWNoVW5pdCA9IHN0YXNoLT5sYXN0VW5pdDsgZWFjaFVuaXQ7IGVhY2hVbml0ID0gZWFjaFVuaXQtPnByZXYpCi0gICAgewotICAgICAgaWYgKGVhY2hVbml0LT5sb3dfcGMgPD0gYWRkciAmJiBhZGRyIDwgZWFjaFVuaXQtPmhpZ2hfcGMpCi0JcmV0dXJuIGR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgZWFjaFVuaXQsIGFkZHIsCi0JCQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgCi0JCQkJCSAgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIAotCQkJCQkgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0gICAgfQotCi0gIHdoaWxlIChzdGFzaC0+Y3VycmVudERpZSA8IHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGllX2luZm8gYURpZUluZm87Ci0KLSAgICAgIGlmICghIHBhcnNlX2RpZSAoc3Rhc2gtPmFiZmQsICZhRGllSW5mbywgc3Rhc2gtPmN1cnJlbnREaWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgaWYgKGFEaWVJbmZvLnRhZyA9PSBUQUdfY29tcGlsZV91bml0KQotCXsKLQkgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQKLQkgICAgPSBhbGxvY19kd2FyZjFfdW5pdCAoc3Rhc2gpOwotCSAgCi0JICBhVW5pdC0+bmFtZSA9IGFEaWVJbmZvLm5hbWU7Ci0JICBhVW5pdC0+bG93X3BjID0gYURpZUluZm8ubG93X3BjOwotCSAgYVVuaXQtPmhpZ2hfcGMgPSBhRGllSW5mby5oaWdoX3BjOwotCSAgYVVuaXQtPmhhc19zdG10X2xpc3QgPSBhRGllSW5mby5oYXNfc3RtdF9saXN0OwotCSAgYVVuaXQtPnN0bXRfbGlzdF9vZmZzZXQgPSBhRGllSW5mby5zdG10X2xpc3Rfb2Zmc2V0OwotCSAgCi0JICAvKiBBIGRpZSBoYXMgYSBjaGlsZCBpZiBpdCdzIGZvbGxvd2VkIGJ5IGEgZGllIHRoYXQgaXMKLQkgICAgIG5vdCBpdCdzIHNpYmxpbmcuICovCi0JICBpZiAoYURpZUluZm8uc2libGluZyAKLQkgICAgICAmJiBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgPCBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQKLQkgICAgICAmJiBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aCAKLQkgICAgICAgICAgICAhPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIGFEaWVJbmZvLnNpYmxpbmcpCi0JICAgIGFVbml0LT5maXJzdF9jaGlsZCA9IHN0YXNoLT5jdXJyZW50RGllICsgYURpZUluZm8ubGVuZ3RoOwotCSAgZWxzZQotCSAgICBhVW5pdC0+Zmlyc3RfY2hpbGQgPSAwOwotCi0JICBpZiAoYVVuaXQtPmxvd19wYyA8PSBhZGRyICYmIGFkZHIgPCBhVW5pdC0+aGlnaF9wYykKLQkgICAgcmV0dXJuIGR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgYVVuaXQsIGFkZHIsIAotCQkJCQkJICBmaWxlbmFtZV9wdHIsIAotCQkJCQkJICBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkJCSAgbGluZW51bWJlcl9wdHIpOwotCX0KLSAgICAgIAotICAgICAgaWYgKGFEaWVJbmZvLnNpYmxpbmcgIT0gMCkKLQlzdGFzaC0+Y3VycmVudERpZSA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgYURpZUluZm8uc2libGluZzsKLSAgICAgIGVsc2UKLQlzdGFzaC0+Y3VycmVudERpZSArPSBhRGllSW5mby5sZW5ndGg7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2JmZC9kd2FyZjIuYyBiL2JmZC9kd2FyZjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4NzU3ZS4uMDAwMDAwMAotLS0gYS9iZmQvZHdhcmYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjE5ICswLDAgQEAKLS8qIERXQVJGIDIgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQWRhcHRlZCBmcm9tIGdkYi9kd2FyZjJyZWFkLmMgYnkgR2F2aW4gS29jaCBvZiBDeWdudXMgU29sdXRpb25zCi0gICAoZ2F2aW5AY3lnbnVzLmNvbSkuCi0KLSAgIEZyb20gdGhlIGR3YXJmMnJlYWQuYyBoZWFkZXI6Ci0gICBBZGFwdGVkIGJ5IEdhcnkgRnVuY2sgKGdhcnlAaW50cmVwaWQuY29tKSwgSW50cmVwaWQgVGVjaG5vbG9neSwKLSAgIEluYy4gIHdpdGggc3VwcG9ydCBmcm9tIEZsb3JpZGEgU3RhdGUgVW5pdmVyc2l0eSAodW5kZXIgY29udHJhY3QKLSAgIHdpdGggdGhlIEFkYSBKb2ludCBQcm9ncmFtIE9mZmljZSksIGFuZCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gICBJbml0aWFsIGNvbnRyaWJ1dGlvbiBieSBCcmVudCBCZW5zb24sIEhhcnJpcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuLAotICAgYmFzZWQgb24gRnJlZCBGaXNoJ3MgKEN5Z251cyBTdXBwb3J0KSBpbXBsZW1lbnRhdGlvbiBvZiBEV0FSRiAxCi0gICBzdXBwb3J0IGluIGR3YXJmcmVhZC5jCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCi0KLS8qIFRoZSBkYXRhIGluIHRoZSAuZGVidWdfbGluZSBzdGF0ZW1lbnQgcHJvbG9ndWUgbG9va3MgbGlrZSB0aGlzLiAgKi8KLXN0cnVjdCBsaW5lX2hlYWQKLSAgewotICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGg7Ci0gICAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLSAgICB1bnNpZ25lZCBpbnQgcHJvbG9ndWVfbGVuZ3RoOwotICAgIHVuc2lnbmVkIGNoYXIgbWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7Ci0gICAgdW5zaWduZWQgY2hhciBkZWZhdWx0X2lzX3N0bXQ7Ci0gICAgaW50IGxpbmVfYmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyIGxpbmVfcmFuZ2U7Ci0gICAgdW5zaWduZWQgY2hhciBvcGNvZGVfYmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyICpzdGFuZGFyZF9vcGNvZGVfbGVuZ3RoczsKLSAgfTsKLQotLyogQXR0cmlidXRlcyBoYXZlIGEgbmFtZSBhbmQgYSB2YWx1ZSAqLwotc3RydWN0IGF0dHJpYnV0ZQotICB7Ci0gICAgZW51bSBkd2FyZl9hdHRyaWJ1dGUgbmFtZTsKLSAgICBlbnVtIGR3YXJmX2Zvcm0gZm9ybTsKLSAgICB1bmlvbgotICAgICAgewotCWNoYXIgKnN0cjsKLQlzdHJ1Y3QgZHdhcmZfYmxvY2sgKmJsazsKLQl1bnNpZ25lZCBpbnQgdW5zbmQ7Ci0JaW50IHNuZDsKLQliZmRfdm1hIGFkZHI7Ci0gICAgICB9Ci0gICAgdTsKLSAgfTsKLQotLyogR2V0IGF0IHBhcnRzIG9mIGFuIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgKi8KLQotI2RlZmluZSBEV19TVFJJTkcoYXR0cikgICAgKChhdHRyKS0+dS5zdHIpCi0jZGVmaW5lIERXX1VOU05EKGF0dHIpICAgICAoKGF0dHIpLT51LnVuc25kKQotI2RlZmluZSBEV19CTE9DSyhhdHRyKSAgICAgKChhdHRyKS0+dS5ibGspCi0jZGVmaW5lIERXX1NORChhdHRyKSAgICAgICAoKGF0dHIpLT51LnNuZCkKLSNkZWZpbmUgRFdfQUREUihhdHRyKQkgICAoKGF0dHIpLT51LmFkZHIpCi0KLS8qIEJsb2NrcyBhcmUgYSBidW5jaCBvZiB1bnR5cGVkIGJ5dGVzLiAqLwotc3RydWN0IGR3YXJmX2Jsb2NrCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICBjaGFyICpkYXRhOwotICB9OwotCi0KLXN0cnVjdCBkd2FyZjJfZGVidWcgewotCi0gIC8qIEEgbGlzdCBvZiBhbGwgcHJldmlvdXNseSByZWFkIGNvbXBfdW5pdHMuICovCi0gIHN0cnVjdCBjb21wX3VuaXQqIGFsbF9jb21wX3VuaXRzOwotCi0gIC8qIFRoZSBuZXh0IHVucmVhZCBjb21waWxhdGlvbiB1bml0IHdpdGhpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4KLSAgICAgWmVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBoYXMgbm90IGJlZW4gbG9hZGVkCi0gICAgIGludG8gYSBidWZmZXIgeWV0LiovCi0gIGNoYXIqIGluZm9fcHRyOwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBtZW1vcnkgYnVmZmVyLiAqLwotICBjaGFyKiBpbmZvX3B0cl9lbmQ7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIGxvYWRlZCBpbnRvIG1lbW9yeS4gKi8KLSAgY2hhciogZHdhcmZfYWJicmV2X2J1ZmZlcjsKLQotICAvKiBMZW5ndGggb2YgdGhlIGxvYWRlZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uICovCi0gIHVuc2lnbmVkIGxvbmcgZHdhcmZfYWJicmV2X3NpemU7Ci0KLSAgLyogQnVmZmVyIGZvciBkZWNvZGVfbGluZV9pbmZvLiAgKi8KLSAgY2hhciAqZHdhcmZfbGluZV9idWZmZXI7Ci19OwotCi1zdHJ1Y3QgYXJhbmdlIHsKLSAgc3RydWN0IGFyYW5nZSAqbmV4dDsKLSAgYmZkX3ZtYSBsb3c7Ci0gIGJmZF92bWEgaGlnaDsKLX07Ci0KLQotLyogQSBtaW5pbWFsIGRlY29kaW5nIG9mIERXQVJGMiBjb21waWxhdGlvbiB1bml0cy4gIFdlIG9ubHkgZGVjb2RlCi0gICB3aGF0J3MgbmVlZGVkIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCi0KLXN0cnVjdCBjb21wX3VuaXQgewotCi0gIC8qIENoYWluIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcGlsYXRpb24gdW5pdHMuICovCi0gIHN0cnVjdCBjb21wX3VuaXQqIG5leHRfdW5pdDsKLQotICAvKiBLZWVwIHRoZSBiZGYgY29udmVuaWVudCAoZm9yIG1lbW9yeSBhbGxvY2F0aW9uKS4gKi8KLSAgYmZkKiBhYmZkOwotCi0gIC8qIFRoZSBsb3dlc3QgYW5kIGhpZ2VzdCBhZGRyZXNzZXMgY29udGFpbmVkIGluIHRoaXMgY29tcGlsYXRpb24KLSAgICAgdW5pdCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyLiAqLwotICBzdHJ1Y3QgYXJhbmdlIGFyYW5nZTsKLQotICAvKiBUaGUgRFdfQVRfbmFtZSBhdHRyaWJ1dGUgKGZvciBlcnJvciBtZXNzYWdlcykuICovCi0gIGNoYXIqIG5hbWU7Ci0KLSAgLyogVGhlIGFiYnJldiBoYXNoIHRhYmxlLiAqLwotICBzdHJ1Y3QgYWJicmV2X2luZm8qKiBhYmJyZXZzOwotCi0gIC8qIE5vdGUgdGhhdCBhbiBlcnJvciB3YXMgZm91bmQgYnkgY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lLiAqLwotICBpbnQgZXJyb3I7Ci0KLSAgLyogVGhlIERXX0FUX2NvbXBfZGlyIGF0dHJpYnV0ZSAqLwotICBjaGFyKiBjb21wX2RpcjsKLQotICAvKiBUcnVlIGlmIHRoZXJlIGlzIGEgbGluZSBudW1iZXIgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcC4gdW5pdC4gKi8KLSAgaW50IHN0bXRsaXN0OwotICAKLSAgLyogVGhlIG9mZnNldCBpbnRvIC5kZWJ1Z19saW5lIG9mIHRoZSBsaW5lIG51bWJlciB0YWJsZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lX29mZnNldDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBjaGlsZCBkaWUgZm9yIHRoZSBjb21wIHVuaXQuICovCi0gIGNoYXIgKmZpcnN0X2NoaWxkX2RpZV9wdHI7Ci0KLSAgLyogVGhlIGVuZCBvZiB0aGUgY29tcCB1bml0LiAqLwotICBjaGFyICplbmRfcHRyOwotCi0gIC8qIFRoZSBkZWNvZGVkIGxpbmUgbnVtYmVyLCBOVUxMIGlmIG5vdCB5ZXQgZGVjb2RlZC4gKi8KLSAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogbGluZV90YWJsZTsKLQotICAvKiBBIGxpc3Qgb2YgdGhlIGZ1bmN0aW9ucyBmb3VuZCBpbiB0aGlzIGNvbXAuIHVuaXQuICovCi0gIHN0cnVjdCBmdW5jaW5mbyogZnVuY3Rpb25fdGFibGU7IAotCi0gIC8qIEFkZHJlc3Mgc2l6ZSBmb3IgdGhpcyB1bml0IC0gZnJvbSB1bml0IGhlYWRlciAqLwotICB1bnNpZ25lZCBjaGFyIGFkZHJfc2l6ZTsKLX07Ci0KLQotCi0vKiBWRVJCQVRJTSAKLSAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdXAgdG8gdGhlIEVORCBWRVJCQVRJTSBtYXJrIGFyZSAKLSAgIGNvcGllZCBkaXJlY3RseSBmcm9tIGR3YXJmMnJlYWQuYy4gKi8KLQotLyogcmVhZCBkd2FyZiBpbmZvcm1hdGlvbiBmcm9tIGEgYnVmZmVyICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfMV9ieXRlIChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgaW50Ci1yZWFkXzFfc2lnbmVkX2J5dGUgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzJfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfMl9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfNF9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzhfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9uX2J5dGVzIChhYmZkLCBidWYsIHNpemUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIGJ1ZmZlciwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgZGF0YSB0byBhIGJ1ZmZlcgotICAgICBhbGxvY2F0ZWQgb24gdGhlIHRlbXBvcmFyeSBvYnN0YWNrLiAgKi8KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9zdHJpbmcgKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIHN0cmluZywgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgc3RyaW5nIHRvIGEgYnVmZmVyCi0gICAgIGFsbG9jYXRlZCBvbiB0aGUgdGVtcG9yYXJ5IG9ic3RhY2suICAqLwotICBpZiAoKmJ1ZiA9PSAnXDAnKQotICAgIHsKLSAgICAgICpieXRlc19yZWFkX3B0ciA9IDE7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICpieXRlc19yZWFkX3B0ciA9IHN0cmxlbiAoYnVmKSArIDE7Ci0gIHJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBidWYsIGJ5dGVzX3JlYWRfcHRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqYnVmOwotICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3JlYWRfcHRyOwotewotICB1bnNpZ25lZCBpbnQgIHJlc3VsdDsKLSAgdW5zaWduZWQgaW50ICBudW1fcmVhZDsKLSAgaW50ICAgICAgICAgICBzaGlmdDsKLSAgdW5zaWduZWQgY2hhciBieXRlOwotCi0gIHJlc3VsdCAgID0gMDsKLSAgc2hpZnQgICAgPSAwOwotICBudW1fcmVhZCA9IDA7Ci0gIAotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgICAgYnVmICsrOwotICAgICAgbnVtX3JlYWQgKys7Ci0gICAgICByZXN1bHQgfD0gKChieXRlICYgMHg3ZikgPDwgc2hpZnQpOwotICAgICAgc2hpZnQgKz0gNzsKLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0gIAotICAqIGJ5dGVzX3JlYWRfcHRyID0gbnVtX3JlYWQ7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1yZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqIGJ5dGVzX3JlYWRfcHRyOwotewotICBpbnQgICAgICAgICAgIHJlc3VsdDsKLSAgaW50ICAgICAgICAgICBzaGlmdDsKLSAgaW50ICAgICAgICAgICBudW1fcmVhZDsKLSAgdW5zaWduZWQgY2hhciBieXRlOwotCi0gIHJlc3VsdCA9IDA7Ci0gIHNoaWZ0ID0gMDsKLSAgbnVtX3JlYWQgPSAwOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgICBidWYgKys7Ci0gICAgICBudW1fcmVhZCArKzsKLSAgICAgIHJlc3VsdCB8PSAoKGJ5dGUgJiAweDdmKSA8PCBzaGlmdCk7Ci0gICAgICBzaGlmdCArPSA3OwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLSAgCi0gIGlmICgoc2hpZnQgPCAzMikgJiYgKGJ5dGUgJiAweDQwKSkKLSAgICByZXN1bHQgfD0gLSgxIDw8IHNoaWZ0KTsKLQotICAqIGJ5dGVzX3JlYWRfcHRyID0gbnVtX3JlYWQ7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBFTkQgVkVSQkFUSU0gKi8KLQotc3RhdGljIGJmZF92bWEKLXJlYWRfYWRkcmVzcyAodW5pdCwgYnVmKQotICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotICAgICBjaGFyICpidWY7Ci17Ci0gIGJmZF92bWEgcmV0dmFsID0gMDsKLQotICBpZiAodW5pdC0+YWRkcl9zaXplID09IDQpCi0gICAgewotICAgICAgcmV0dmFsID0gYmZkX2dldF8zMiAodW5pdC0+YWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHZhbCA9IGJmZF9nZXRfNjQgKHVuaXQtPmFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0KLQotCi0vKiBUaGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiBhbiBhYmJyZXYuICovCi1zdHJ1Y3QgYWJicmV2X2luZm8KLSAgewotICAgIHVuc2lnbmVkIGludCBudW1iZXI7CS8qIG51bWJlciBpZGVudGlmeWluZyBhYmJyZXYgKi8KLSAgICBlbnVtIGR3YXJmX3RhZyB0YWc7CQkvKiBkd2FyZiB0YWcgKi8KLSAgICBpbnQgaGFzX2NoaWxkcmVuOwkJLyogYm9vbGVhbiAqLwotICAgIHVuc2lnbmVkIGludCBudW1fYXR0cnM7CS8qIG51bWJlciBvZiBhdHRyaWJ1dGVzICovCi0gICAgc3RydWN0IGF0dHJfYWJicmV2ICphdHRyczsJLyogYW4gYXJyYXkgb2YgYXR0cmlidXRlIGRlc2NyaXB0aW9ucyAqLwotICAgIHN0cnVjdCBhYmJyZXZfaW5mbyAqbmV4dDsJLyogbmV4dCBpbiBjaGFpbiAqLwotICB9OwotCi1zdHJ1Y3QgYXR0cl9hYmJyZXYKLSAgewotICAgIGVudW0gZHdhcmZfYXR0cmlidXRlIG5hbWU7Ci0gICAgZW51bSBkd2FyZl9mb3JtIGZvcm07Ci0gIH07Ci0KLSNpZm5kZWYgQUJCUkVWX0hBU0hfU0laRQotI2RlZmluZSBBQkJSRVZfSEFTSF9TSVpFIDEyMQotI2VuZGlmCi0jaWZuZGVmIEFUVFJfQUxMT0NfQ0hVTksKLSNkZWZpbmUgQVRUUl9BTExPQ19DSFVOSyA0Ci0jZW5kaWYKLQotLyogTG9va3VwIGFuIGFiYnJldl9pbmZvIHN0cnVjdHVyZSBpbiB0aGUgYWJicmV2IGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGFiYnJldl9pbmZvICoKLWxvb2t1cF9hYmJyZXYgKG51bWJlcixhYmJyZXZzKQotICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOwotICAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKiphYmJyZXZzOwotewotICB1bnNpZ25lZCBpbnQgaGFzaF9udW1iZXI7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OwotCi0gIGhhc2hfbnVtYmVyID0gbnVtYmVyICUgQUJCUkVWX0hBU0hfU0laRTsKLSAgYWJicmV2ID0gYWJicmV2c1toYXNoX251bWJlcl07Ci0KLSAgd2hpbGUgKGFiYnJldikKLSAgICB7Ci0gICAgICBpZiAoYWJicmV2LT5udW1iZXIgPT0gbnVtYmVyKQotCXJldHVybiBhYmJyZXY7Ci0gICAgICBlbHNlCi0JYWJicmV2ID0gYWJicmV2LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluIERXQVJGIHZlcnNpb24gMiwgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMKLSAgIHN0b3JlZCBpbiBhIHNlcGFyYXRlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4gIEJlZm9yZSB3ZSByZWFkIGFueQotICAgZGllcyBmcm9tIGEgc2VjdGlvbiB3ZSByZWFkIGluIGFsbCBhYmJyZXZpYXRpb25zIGFuZCBpbnN0YWxsIHRoZW0KLSAgIGluIGEgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWJicmV2X2luZm8qKgotcmVhZF9hYmJyZXZzIChhYmZkLCBvZmZzZXQpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci17Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqKmFiYnJldnM7Ci0gIGNoYXIgKmFiYnJldl9wdHI7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqY3VyX2FiYnJldjsKLSAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGFiYnJldl9uYW1lOwotICB1bnNpZ25lZCBpbnQgYWJicmV2X2Zvcm0sIGhhc2hfbnVtYmVyOwotICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaDsKLQotICBzdGFzaCA9IGVsZl90ZGF0YShhYmZkKS0+ZHdhcmYyX2ZpbmRfbGluZV9pbmZvOwotCi0gIGlmICghIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfYWJicmV2Iik7Ci0gICAgICBpZiAoISBtc2VjKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiIpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgCi0gICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIgPSAoY2hhciopIGJmZF9hbGxvYyAoYWJmZCwgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKTsKLSAgICAgIGlmICghIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQotCSAgcmV0dXJuIDA7Ci0gICAgICAKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgCi0JCQkJICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIsIDAsCi0JCQkJICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKG9mZnNldCA+IHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBBYmJyZXYgb2Zmc2V0ICgldSkgYmlnZ2VyIHRoYW4gYWJicmV2IHNpemUgKCV1KS4iKSwgCi0JCQkgICAgIG9mZnNldCwgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhYmJyZXZzID0gKHN0cnVjdCBhYmJyZXZfaW5mbyoqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2Yoc3RydWN0IGFiYnJldl9pbmZvKikgKiBBQkJSRVZfSEFTSF9TSVpFKTsKLQotICBhYmJyZXZfcHRyID0gc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIgKyBvZmZzZXQ7Ci0gIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgLyogbG9vcCB1bnRpbCB3ZSByZWFjaCBhbiBhYmJyZXYgbnVtYmVyIG9mIDAgKi8KLSAgd2hpbGUgKGFiYnJldl9udW1iZXIpCi0gICAgewotICAgICAgY3VyX2FiYnJldiA9IChzdHJ1Y3QgYWJicmV2X2luZm8qKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFiYnJldl9pbmZvKSk7Ci0KLSAgICAgIC8qIHJlYWQgaW4gYWJicmV2IGhlYWRlciAqLwotICAgICAgY3VyX2FiYnJldi0+bnVtYmVyID0gYWJicmV2X251bWJlcjsKLSAgICAgIGN1cl9hYmJyZXYtPnRhZyA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBjdXJfYWJicmV2LT5oYXNfY2hpbGRyZW4gPSByZWFkXzFfYnl0ZSAoYWJmZCwgYWJicmV2X3B0cik7Ci0gICAgICBhYmJyZXZfcHRyICs9IDE7Ci0KLSAgICAgIC8qIG5vdyByZWFkIGluIGRlY2xhcmF0aW9ucyAqLwotICAgICAgYWJicmV2X25hbWUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYWJicmV2X2Zvcm0gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgd2hpbGUgKGFiYnJldl9uYW1lKQotCXsKLQkgIGlmICgoY3VyX2FiYnJldi0+bnVtX2F0dHJzICUgQVRUUl9BTExPQ19DSFVOSykgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cl9hYmJyZXYtPmF0dHJzID0gKHN0cnVjdCBhdHRyX2FiYnJldiAqKQotCQliZmRfcmVhbGxvYyAoY3VyX2FiYnJldi0+YXR0cnMsCi0JCQkgICAgIChjdXJfYWJicmV2LT5udW1fYXR0cnMgKyBBVFRSX0FMTE9DX0NIVU5LKQotCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGF0dHJfYWJicmV2KSk7Ci0JICAgICAgaWYgKCEgY3VyX2FiYnJldi0+YXR0cnMpCi0JCXJldHVybiAwOwotCSAgICB9Ci0JICBjdXJfYWJicmV2LT5hdHRyc1tjdXJfYWJicmV2LT5udW1fYXR0cnNdLm5hbWUgPSBhYmJyZXZfbmFtZTsKLQkgIGN1cl9hYmJyZXYtPmF0dHJzW2N1cl9hYmJyZXYtPm51bV9hdHRycysrXS5mb3JtID0gYWJicmV2X2Zvcm07Ci0JICBhYmJyZXZfbmFtZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JICBhYmJyZXZfZm9ybSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JfQotCi0gICAgICBoYXNoX251bWJlciA9IGFiYnJldl9udW1iZXIgJSBBQkJSRVZfSEFTSF9TSVpFOwotICAgICAgY3VyX2FiYnJldi0+bmV4dCA9IGFiYnJldnNbaGFzaF9udW1iZXJdOwotICAgICAgYWJicmV2c1toYXNoX251bWJlcl0gPSBjdXJfYWJicmV2OwotCi0gICAgICAvKiBHZXQgbmV4dCBhYmJyZXZpYXRpb24uCi0gICAgICAgICBVbmRlciBJcml4NiB0aGUgYWJicmV2aWF0aW9ucyBmb3IgYSBjb21waWxhdGlvbiB1bml0IGFyZSBub3QKLQkgYWx3YXlzIHByb3Blcmx5IHRlcm1pbmF0ZWQgd2l0aCBhbiBhYmJyZXYgbnVtYmVyIG9mIDAuCi0JIEV4aXQgbG9vcCBpZiB3ZSBlbmNvdW50ZXIgYW4gYWJicmV2aWF0aW9uIHdoaWNoIHdlIGhhdmUKLQkgYWxyZWFkeSByZWFkICh3aGljaCBtZWFucyB3ZSBhcmUgYWJvdXQgdG8gcmVhZCB0aGUgYWJicmV2aWF0aW9ucwotCSBmb3IgdGhlIG5leHQgY29tcGlsZSB1bml0KSBvciBpZiB0aGUgZW5kIG9mIHRoZSBhYmJyZXZpYXRpb24KLQkgdGFibGUgaXMgcmVhY2hlZC4gICovCi0gICAgICBpZiAoKHVuc2lnbmVkIGludCkgKGFiYnJldl9wdHIgLSBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlcikKLQkgICAgPj0gc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKQotCWJyZWFrOwotICAgICAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBpZiAobG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlcixhYmJyZXZzKSAhPSBOVUxMKQotCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYWJicmV2czsKLX0KLQotLyogUmVhZCBhbiBhdHRyaWJ1dGUgZGVzY3JpYmVkIGJ5IGFuIGFiYnJldmlhdGVkIGF0dHJpYnV0ZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXJlYWRfYXR0cmlidXRlIChhdHRyLCBhYmJyZXYsIHVuaXQsIGluZm9fcHRyKQotICAgICBzdHJ1Y3QgYXR0cmlidXRlICAgKmF0dHI7Ci0gICAgIHN0cnVjdCBhdHRyX2FiYnJldiAqYWJicmV2OwotICAgICBzdHJ1Y3QgY29tcF91bml0ICAgKnVuaXQ7Ci0gICAgIGNoYXIgICAgICAgICAgICAgICAqaW5mb19wdHI7Ci17Ci0gIGJmZCAqYWJmZCA9IHVuaXQtPmFiZmQ7Ci0gIHVuc2lnbmVkIGludCBieXRlc19yZWFkOwotICBzdHJ1Y3QgZHdhcmZfYmxvY2sgKmJsazsKLQotICBhdHRyLT5uYW1lID0gYWJicmV2LT5uYW1lOwotICBhdHRyLT5mb3JtID0gYWJicmV2LT5mb3JtOwotICBzd2l0Y2ggKGFiYnJldi0+Zm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgotICAgICAgRFdfQUREUiAoYXR0cikgPSByZWFkX2FkZHJlc3MgKHVuaXQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IHVuaXQtPmFkZHJfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMjsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDQ7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGEyOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE0OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF84X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3N0cmluZzoKLSAgICAgIERXX1NUUklORyAoYXR0cikgPSByZWFkX3N0cmluZyAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTE6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9mbGFnOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6Ci0gICAgICBEV19TTkQgKGF0dHIpID0gcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV91ZGF0YToKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWYxOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmMjoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWY0OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjg6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzhfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3N0cnA6Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBJbnZhbGlkIG9yIHVuaGFuZGxlZCBGT1JNIHZhbHVlOiAlZC4iKSwKLQkJCSAgICAgYWJicmV2LT5mb3JtKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLSAgcmV0dXJuIGluZm9fcHRyOwotfQotCi0KLS8qIFNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHRhYmxlIHJvdXRpbmVzLiAqLwotCi0jZGVmaW5lIEZJTEVfQUxMT0NfQ0hVTksgNQotI2RlZmluZSBESVJfQUxMT0NfQ0hVTksgNQotCi1zdHJ1Y3QgbGluZV9pbmZvIHsKLSAgc3RydWN0IGxpbmVfaW5mbyogcHJldl9saW5lOwotCi0gIGJmZF92bWEgYWRkcmVzczsKLSAgY2hhciogZmlsZW5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICBpbnQgZW5kX3NlcXVlbmNlOwkJLyogZW5kIG9mIChzZXF1ZW50aWFsKSBjb2RlIHNlcXVlbmNlICovCi19OwotCi1zdHJ1Y3QgZmlsZWluZm8gewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZGlyOwotICB1bnNpZ25lZCBpbnQgdGltZTsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi1zdHJ1Y3QgbGluZV9pbmZvX3RhYmxlIHsKLSAgYmZkKiBhYmZkOwotCi0gIHVuc2lnbmVkIGludCBudW1fZmlsZXM7Ci0gIHVuc2lnbmVkIGludCBudW1fZGlyczsKLQotICBjaGFyKiBjb21wX2RpcjsKLSAgY2hhcioqIGRpcnM7Ci0gIHN0cnVjdCBmaWxlaW5mbyogZmlsZXM7Ci0gIHN0cnVjdCBsaW5lX2luZm8qIGxhc3RfbGluZTsKLX07Ci0KLXN0YXRpYyB2b2lkIAotYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIGVuZF9zZXF1ZW5jZSkKLSAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgY2hhciogZmlsZW5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICAgICBpbnQgZW5kX3NlcXVlbmNlOwotewotICBzdHJ1Y3QgbGluZV9pbmZvKiBpbmZvID0gKHN0cnVjdCBsaW5lX2luZm8qKQotICAgIGJmZF9hbGxvYyAodGFibGUtPmFiZmQsIHNpemVvZiAoc3RydWN0IGxpbmVfaW5mbykpOwotCi0gIGluZm8tPnByZXZfbGluZSA9IHRhYmxlLT5sYXN0X2xpbmU7Ci0gIHRhYmxlLT5sYXN0X2xpbmUgPSBpbmZvOwotCi0gIGluZm8tPmFkZHJlc3MgPSBhZGRyZXNzOwotICBpbmZvLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBpbmZvLT5saW5lID0gbGluZTsKLSAgaW5mby0+Y29sdW1uID0gY29sdW1uOwotICBpbmZvLT5lbmRfc2VxdWVuY2UgPSBlbmRfc2VxdWVuY2U7Ci19Ci0KLXN0YXRpYyBjaGFyKiAKLWNvbmNhdF9maWxlbmFtZSAodGFibGUsIGZpbGUpCi0gICAgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOwotICAgICB1bnNpZ25lZCBpbnQgZmlsZTsKLXsKLSAgY2hhciogZmlsZW5hbWU7Ci0KLSAgaWYgKGZpbGUgLSAxID49IHRhYmxlLT5udW1fZmlsZXMpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciAiCi0JCQkgICAgICAgInNlY3Rpb24gKGJhZCBmaWxlIG51bWJlcikuIikpOwotICAgICAgcmV0dXJuICI8dW5rbm93bj4iOwotICAgIH0KLQotICBmaWxlbmFtZSA9IHRhYmxlLT5maWxlc1tmaWxlIC0gMV0ubmFtZTsKLSAgaWYgKCpmaWxlbmFtZSA9PSAnLycpCi0gICAgcmV0dXJuIGZpbGVuYW1lOwotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyKiBkaXJuYW1lID0gKHRhYmxlLT5maWxlc1tmaWxlIC0gMV0uZGlyCi0JCSAgICAgICA/IHRhYmxlLT5kaXJzW3RhYmxlLT5maWxlc1tmaWxlIC0gMV0uZGlyIC0gMV0KLQkJICAgICAgIDogdGFibGUtPmNvbXBfZGlyKTsKLSAgICAgIHJldHVybiAoY2hhciopIGNvbmNhdCAoZGlybmFtZSwgIi8iLCBmaWxlbmFtZSwgTlVMTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotYXJhbmdlX2FkZCAodW5pdCwgbG93X3BjLCBoaWdoX3BjKQotICAgICBzdHJ1Y3QgY29tcF91bml0ICp1bml0OwotICAgICBiZmRfdm1hIGxvd19wYzsKLSAgICAgYmZkX3ZtYSBoaWdoX3BjOwotewotICBzdHJ1Y3QgYXJhbmdlICphcmFuZ2U7Ci0KLSAgLyogZmlyc3Qgc2VlIGlmIHdlIGNhbiBjaGVhcGx5IGV4dGVuZCBhbiBleGlzdGluZyByYW5nZTogKi8KLSAgYXJhbmdlID0gJnVuaXQtPmFyYW5nZTsKLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG93X3BjID09IGFyYW5nZS0+aGlnaCkKLQl7Ci0JICBhcmFuZ2UtPmhpZ2ggPSBoaWdoX3BjOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChoaWdoX3BjID09IGFyYW5nZS0+bG93KQotCXsKLQkgIGFyYW5nZS0+bG93ID0gbG93X3BjOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGFyYW5nZSA9IGFyYW5nZS0+bmV4dDsKLSAgICB9Ci0gIHdoaWxlIChhcmFuZ2UpOwotCi0gIGlmICh1bml0LT5hcmFuZ2UuaGlnaCA9PSAwKQotICAgIHsKLSAgICAgIC8qIHRoaXMgaXMgdGhlIGZpcnN0IGFkZHJlc3MgcmFuZ2U6IHN0b3JlIGl0IGluIHVuaXQtPmFyYW5nZTogKi8KLSAgICAgIHVuaXQtPmFyYW5nZS5uZXh0ID0gMDsKLSAgICAgIHVuaXQtPmFyYW5nZS5sb3cgPSBsb3dfcGM7Ci0gICAgICB1bml0LT5hcmFuZ2UuaGlnaCA9IGhpZ2hfcGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYXJhbmdlIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgYXJhbmdlIGxpc3Q6ICovCi0gIGFyYW5nZSA9IGJmZF96YWxsb2MgKHVuaXQtPmFiZmQsIHNpemVvZiAoKmFyYW5nZSkpOwotICBhcmFuZ2UtPmxvdyA9IGxvd19wYzsKLSAgYXJhbmdlLT5oaWdoID0gaGlnaF9wYzsKLQotICBhcmFuZ2UtPm5leHQgPSB1bml0LT5hcmFuZ2UubmV4dDsKLSAgdW5pdC0+YXJhbmdlLm5leHQgPSBhcmFuZ2U7Ci19Ci0KLS8qIERlY29kZSB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIFVOSVQuICovCi0KLXN0YXRpYyBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKgotZGVjb2RlX2xpbmVfaW5mbyAodW5pdCkKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAqdW5pdDsKLXsKLSAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKLQotICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaDsKLQotICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiB0YWJsZTsKLQotICBjaGFyICpsaW5lX3B0cjsKLSAgY2hhciAqbGluZV9lbmQ7Ci0gIHN0cnVjdCBsaW5lX2hlYWQgbGg7Ci0gIHVuc2lnbmVkIGludCBpLCBieXRlc19yZWFkOwotICBjaGFyICpjdXJfZmlsZSwgKmN1cl9kaXI7Ci0gIHVuc2lnbmVkIGNoYXIgb3BfY29kZSwgZXh0ZW5kZWRfb3AsIGFkal9vcGNvZGU7Ci0KLSAgc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgaWYgKCEgc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfbGluZSIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19saW5lIHNlY3Rpb24uIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIGlmICghIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlcikKLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCAKLQkJCQkgICAgICBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIsIDAsCi0JCQkJICAgICAgc2l6ZSkpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBvdWdodCB0byBhcHBseSB0aGUgcmVsb2NzIGFnYWluc3QgdGhpcyBzZWN0aW9uIGJlZm9yZQotCSB3ZSBwcm9jZXNzIGl0Li4uLiAqLwotICAgIH0KLQotICB0YWJsZSA9IChzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKikgYmZkX2FsbG9jIChhYmZkLCAKLQkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGxpbmVfaW5mb190YWJsZSkpOwotICB0YWJsZS0+YWJmZCA9IGFiZmQ7Ci0gIHRhYmxlLT5jb21wX2RpciA9IHVuaXQtPmNvbXBfZGlyOwotCi0gIHRhYmxlLT5udW1fZmlsZXMgPSAwOwotICB0YWJsZS0+ZmlsZXMgPSBOVUxMOwotCi0gIHRhYmxlLT5udW1fZGlycyA9IDA7Ci0gIHRhYmxlLT5kaXJzID0gTlVMTDsKLQotICB0YWJsZS0+ZmlsZXMgPSBOVUxMOwotICB0YWJsZS0+bGFzdF9saW5lID0gTlVMTDsKLQotICBsaW5lX3B0ciA9IHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlciArIHVuaXQtPmxpbmVfb2Zmc2V0OwotCi0gIC8qIHJlYWQgaW4gdGhlIHByb2xvZ3VlICovCi0gIGxoLnRvdGFsX2xlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSA0OwotICBsaW5lX2VuZCA9IGxpbmVfcHRyICsgbGgudG90YWxfbGVuZ3RoOwotICBsaC52ZXJzaW9uID0gcmVhZF8yX2J5dGVzIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDI7Ci0gIGxoLnByb2xvZ3VlX2xlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSA0OwotICBsaC5taW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aCA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLmRlZmF1bHRfaXNfc3RtdCA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLmxpbmVfYmFzZSA9IHJlYWRfMV9zaWduZWRfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5saW5lX3JhbmdlID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGgub3Bjb2RlX2Jhc2UgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5zdGFuZGFyZF9vcGNvZGVfbGVuZ3RocyA9ICh1bnNpZ25lZCBjaGFyICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBsaC5vcGNvZGVfYmFzZSAqIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotCi0gIGxoLnN0YW5kYXJkX29wY29kZV9sZW5ndGhzWzBdID0gMTsKLSAgZm9yIChpID0gMTsgaSA8IGxoLm9wY29kZV9iYXNlOyArK2kpCi0gICAgewotICAgICAgbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbaV0gPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICAgICAgbGluZV9wdHIgKz0gMTsKLSAgICB9Ci0KLSAgLyogUmVhZCBkaXJlY3RvcnkgdGFibGUgICovCi0gIHdoaWxlICgoY3VyX2RpciA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBpZiAoKHRhYmxlLT5udW1fZGlycyAlIERJUl9BTExPQ19DSFVOSykgPT0gMCkKLQl7Ci0JICB0YWJsZS0+ZGlycyA9IChjaGFyICoqKQotCSAgICBiZmRfcmVhbGxvYyAodGFibGUtPmRpcnMsCi0JCQkgKHRhYmxlLT5udW1fZGlycyArIERJUl9BTExPQ19DSFVOSykgKiBzaXplb2YgKGNoYXIgKikpOwotCSAgaWYgKCEgdGFibGUtPmRpcnMpCi0JICAgIHJldHVybiAwOwotCX0KLSAgICAgIHRhYmxlLT5kaXJzW3RhYmxlLT5udW1fZGlycysrXSA9IGN1cl9kaXI7Ci0gICAgfQotICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCi0gIC8qIFJlYWQgZmlsZSBuYW1lIHRhYmxlICovCi0gIHdoaWxlICgoY3VyX2ZpbGUgPSByZWFkX3N0cmluZyAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgaWYgKCh0YWJsZS0+bnVtX2ZpbGVzICUgRklMRV9BTExPQ19DSFVOSykgPT0gMCkKLQl7Ci0JICB0YWJsZS0+ZmlsZXMgPSAoc3RydWN0IGZpbGVpbmZvICopCi0JICAgIGJmZF9yZWFsbG9jICh0YWJsZS0+ZmlsZXMsCi0JCQkgKHRhYmxlLT5udW1fZmlsZXMgKyBGSUxFX0FMTE9DX0NIVU5LKQotCQkJICogc2l6ZW9mIChzdHJ1Y3QgZmlsZWluZm8pKTsKLQkgIGlmICghIHRhYmxlLT5maWxlcykKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLm5hbWUgPSBjdXJfZmlsZTsKLSAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5kaXIgPQotCXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS50aW1lID0KLQlyZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uc2l6ZSA9Ci0JcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgdGFibGUtPm51bV9maWxlcysrOwotICAgIH0KLSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQotICAvKiBSZWFkIHRoZSBzdGF0ZW1lbnQgc2VxdWVuY2VzIHVudGlsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0LiAgKi8KLSAgd2hpbGUgKGxpbmVfcHRyIDwgbGluZV9lbmQpCi0gICAgewotICAgICAgLyogc3RhdGUgbWFjaGluZSByZWdpc3RlcnMgICovCi0gICAgICBiZmRfdm1hIGFkZHJlc3MgPSAwOwotICAgICAgY2hhciogZmlsZW5hbWUgPSBjb25jYXRfZmlsZW5hbWUgKHRhYmxlLCAxKTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lID0gMTsKLSAgICAgIHVuc2lnbmVkIGludCBjb2x1bW4gPSAwOwotICAgICAgaW50IGlzX3N0bXQgPSBsaC5kZWZhdWx0X2lzX3N0bXQ7Ci0gICAgICBpbnQgYmFzaWNfYmxvY2sgPSAwOwotICAgICAgaW50IGVuZF9zZXF1ZW5jZSA9IDAsIG5lZWRfbG93X3BjID0gMTsKLSAgICAgIGJmZF92bWEgbG93X3BjID0gMDsKLQotICAgICAgLyogRGVjb2RlIHRoZSB0YWJsZS4gKi8KLSAgICAgIHdoaWxlICghIGVuZF9zZXF1ZW5jZSkKLQl7Ci0JICBvcF9jb2RlID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLQkgIGxpbmVfcHRyICs9IDE7Ci0JICBzd2l0Y2ggKG9wX2NvZGUpCi0JICAgIHsKLQkgICAgY2FzZSBEV19MTlNfZXh0ZW5kZWRfb3A6Ci0JICAgICAgbGluZV9wdHIgKz0gMTsJLyogaWdub3JlIGxlbmd0aCAqLwotCSAgICAgIGV4dGVuZGVkX29wID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLQkgICAgICBsaW5lX3B0ciArPSAxOwotCSAgICAgIHN3aXRjaCAoZXh0ZW5kZWRfb3ApCi0JCXsKLQkJY2FzZSBEV19MTkVfZW5kX3NlcXVlbmNlOgotCQkgIGVuZF9zZXF1ZW5jZSA9IDE7Ci0JCSAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sCi0JCQkJIGVuZF9zZXF1ZW5jZSk7Ci0JCSAgaWYgKG5lZWRfbG93X3BjKQotCQkgICAgewotCQkgICAgICBuZWVkX2xvd19wYyA9IDA7Ci0JCSAgICAgIGxvd19wYyA9IGFkZHJlc3M7Ci0JCSAgICB9Ci0JCSAgYXJhbmdlX2FkZCAodW5pdCwgbG93X3BjLCBhZGRyZXNzKTsKLQkJICBicmVhazsKLQkJY2FzZSBEV19MTkVfc2V0X2FkZHJlc3M6Ci0JCSAgYWRkcmVzcyA9IHJlYWRfYWRkcmVzcyAodW5pdCwgbGluZV9wdHIpOwotCQkgIGxpbmVfcHRyICs9IHVuaXQtPmFkZHJfc2l6ZTsKLQkJICBicmVhazsKLQkJY2FzZSBEV19MTkVfZGVmaW5lX2ZpbGU6Ci0JCSAgY3VyX2ZpbGUgPSByZWFkX3N0cmluZyAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQkgIGlmICgodGFibGUtPm51bV9maWxlcyAlIEZJTEVfQUxMT0NfQ0hVTkspID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHRhYmxlLT5maWxlcyA9IChzdHJ1Y3QgZmlsZWluZm8gKikKLQkJCWJmZF9yZWFsbG9jICh0YWJsZS0+ZmlsZXMsCi0JCQkJICAgICAodGFibGUtPm51bV9maWxlcyArIEZJTEVfQUxMT0NfQ0hVTkspCi0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGZpbGVpbmZvKSk7Ci0JCSAgICAgIGlmICghIHRhYmxlLT5maWxlcykKLQkJCXJldHVybiAwOwotCQkgICAgfQotCQkgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5uYW1lID0gY3VyX2ZpbGU7Ci0JCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLmRpciA9Ci0JCSAgICByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQkgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS50aW1lID0KLQkJICAgIHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnNpemUgPQotCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJICB0YWJsZS0+bnVtX2ZpbGVzKys7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uLiIpKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19jb3B5OgotCSAgICAgIGFkZF9saW5lX2luZm8gKHRhYmxlLCBhZGRyZXNzLCBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCAwKTsKLQkgICAgICBiYXNpY19ibG9jayA9IDA7Ci0JICAgICAgaWYgKG5lZWRfbG93X3BjKQotCQl7Ci0JCSAgbmVlZF9sb3dfcGMgPSAwOwotCQkgIGxvd19wYyA9IGFkZHJlc3M7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKLQkgICAgICBhZGRyZXNzICs9IGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoCi0JCSogcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgotCSAgICAgIGxpbmUgKz0gcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX3NldF9maWxlOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IGZpbGU7Ci0KLQkJLyogVGhlIGZpbGUgYW5kIGRpcmVjdG9yeSB0YWJsZXMgYXJlIDAgYmFzZWQsIHRoZSByZWZlcmVuY2VzCi0JCSAgIGFyZSAxIGJhc2VkLiAgKi8KLQkJZmlsZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQlsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQlmaWxlbmFtZSA9IGNvbmNhdF9maWxlbmFtZSAodGFibGUsIGZpbGUpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGNhc2UgRFdfTE5TX3NldF9jb2x1bW46Ci0JICAgICAgY29sdW1uID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6Ci0JICAgICAgaXNfc3RtdCA9ICghaXNfc3RtdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX3NldF9iYXNpY19ibG9jazoKLQkgICAgICBiYXNpY19ibG9jayA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKLQkgICAgICBhZGRyZXNzICs9IGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoCi0JCSAgICAgICogKCgyNTUgLSBsaC5vcGNvZGVfYmFzZSkgLyBsaC5saW5lX3JhbmdlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYzoKLQkgICAgICBhZGRyZXNzICs9IHJlYWRfMl9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOwotCSAgICAgIGxpbmVfcHRyICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CQkvKiBzcGVjaWFsIG9wZXJhbmQgKi8KLQkgICAgICBhZGpfb3Bjb2RlID0gb3BfY29kZSAtIGxoLm9wY29kZV9iYXNlOwotCSAgICAgIGFkZHJlc3MgKz0gKGFkal9vcGNvZGUgLyBsaC5saW5lX3JhbmdlKQotCQkqIGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoOwotCSAgICAgIGxpbmUgKz0gbGgubGluZV9iYXNlICsgKGFkal9vcGNvZGUgJSBsaC5saW5lX3JhbmdlKTsKLQkgICAgICAvKiBhcHBlbmQgcm93IHRvIG1hdHJpeCB1c2luZyBjdXJyZW50IHZhbHVlcyAqLwotCSAgICAgIGFkZF9saW5lX2luZm8gKHRhYmxlLCBhZGRyZXNzLCBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCAwKTsKLQkgICAgICBiYXNpY19ibG9jayA9IDE7Ci0JICAgICAgaWYgKG5lZWRfbG93X3BjKQotCQl7Ci0JCSAgbmVlZF9sb3dfcGMgPSAwOwotCQkgIGxvd19wYyA9IGFkZHJlc3M7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRhYmxlOwotfQotCi0KLS8qIElmIEFERFIgaXMgd2l0aGluIFRBQkxFIHNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgYW5kIHJldHVybiB0cnVlLAotICAgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gIFRoZSBvdXRwdXQgcGFyYW1ldGVycywgRklMRU5BTUVfUFRSIGFuZAotICAgTElORU5VTUJFUl9QVFIsIGFyZSBwb2ludGVycyB0byB0aGUgb2JqZWN0cyB0byBiZSBmaWxsZWQgaW4uICovCi0KLXN0YXRpYyBib29sZWFuCi1sb29rdXBfYWRkcmVzc19pbl9saW5lX2luZm9fdGFibGUgKHRhYmxlLCAKLQkJCQkgICBhZGRyLAotCQkJCSAgIGZpbGVuYW1lX3B0ciwgCi0JCQkJICAgbGluZW51bWJlcl9wdHIpCi0gICAgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIHN0cnVjdCBsaW5lX2luZm8qIG5leHRfbGluZSA9IHRhYmxlLT5sYXN0X2xpbmU7Ci0gIHN0cnVjdCBsaW5lX2luZm8qIGVhY2hfbGluZTsKLSAgCi0gIGlmICghbmV4dF9saW5lKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlYWNoX2xpbmUgPSBuZXh0X2xpbmUtPnByZXZfbGluZTsKLQotICB3aGlsZSAoZWFjaF9saW5lICYmIG5leHRfbGluZSkKLSAgICB7Ci0gICAgICBpZiAoIWVhY2hfbGluZS0+ZW5kX3NlcXVlbmNlCi0JICAmJiBhZGRyID49IGVhY2hfbGluZS0+YWRkcmVzcyAmJiBhZGRyIDwgbmV4dF9saW5lLT5hZGRyZXNzKQotCXsKLQkgICpmaWxlbmFtZV9wdHIgPSBlYWNoX2xpbmUtPmZpbGVuYW1lOwotCSAgKmxpbmVudW1iZXJfcHRyID0gZWFjaF9saW5lLT5saW5lOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgbmV4dF9saW5lID0gZWFjaF9saW5lOwotICAgICAgZWFjaF9saW5lID0gZWFjaF9saW5lLT5wcmV2X2xpbmU7Ci0gICAgfQotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotICAKLQotCi0KLS8qIEZ1bmN0aW9uIHRhYmxlIGZ1bmN0aW9ucy4gKi8KLQotc3RydWN0IGZ1bmNpbmZvIHsKLSAgc3RydWN0IGZ1bmNpbmZvICpwcmV2X2Z1bmM7Ci0KLSAgY2hhciogbmFtZTsKLSAgYmZkX3ZtYSBsb3c7Ci0gIGJmZF92bWEgaGlnaDsKLX07Ci0KLQotLyogSWYgQUREUiBpcyB3aXRoaW4gVEFCTEUsIHNldCBGVU5DVElPTk5BTUVfUFRSLCBhbmQgcmV0dXJuIHRydWUuICovCi0KLXN0YXRpYyBib29sZWFuCi1sb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSAodGFibGUsIAotCQkJCSAgYWRkciwKLQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIpCi0gICAgIHN0cnVjdCBmdW5jaW5mbyogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci17Ci0gIHN0cnVjdCBmdW5jaW5mbyogZWFjaF9mdW5jOwotCi0gIGZvciAoZWFjaF9mdW5jID0gdGFibGU7Ci0gICAgICAgZWFjaF9mdW5jOwotICAgICAgIGVhY2hfZnVuYyA9IGVhY2hfZnVuYy0+cHJldl9mdW5jKQotICAgIHsKLSAgICAgIGlmIChhZGRyID49IGVhY2hfZnVuYy0+bG93ICYmIGFkZHIgPCBlYWNoX2Z1bmMtPmhpZ2gpCi0JewotCSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBlYWNoX2Z1bmMtPm5hbWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLQotCi0vKiBEV0FSRjIgQ29tcGlsYXRpb24gdW5pdCBmdW5jdGlvbnMuICovCi0KLQotLyogU2NhbiBvdmVyIGVhY2ggZGllIGluIGEgY29tcC4gdW5pdCBsb29raW5nIGZvciBmdW5jdGlvbnMgdG8gYWRkCi0gICB0byB0aGUgZnVuY3Rpb24gdGFibGUuICovCi0KLXN0YXRpYyBib29sZWFuCi1zY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyAodW5pdCkKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAqdW5pdDsKLXsKLSAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKLSAgY2hhciAqaW5mb19wdHIgPSB1bml0LT5maXJzdF9jaGlsZF9kaWVfcHRyOwotICBpbnQgbmVzdGluZ19sZXZlbCA9IDE7Ci0KLSAgd2hpbGUgKG5lc3RpbmdfbGV2ZWwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGk7Ci0gICAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKmFiYnJldjsKLSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLSAgICAgIHN0cnVjdCBmdW5jaW5mbyAqZnVuYzsKLSAgICAgIGNoYXIqIG5hbWUgPSAwOwotCi0gICAgICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotCi0gICAgICBpZiAoISBhYmJyZXZfbnVtYmVyKQotCXsKLQkgIG5lc3RpbmdfbGV2ZWwtLTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIAotICAgICAgYWJicmV2ID0gbG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlcix1bml0LT5hYmJyZXZzKTsKLSAgICAgIGlmICghIGFiYnJldikKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIpLCAKLQkJCSAgICAgYWJicmV2X251bWJlcik7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChhYmJyZXYtPnRhZyA9PSBEV19UQUdfc3VicHJvZ3JhbSkKLQl7Ci0JICBmdW5jID0gKHN0cnVjdCBmdW5jaW5mbyopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGZ1bmNpbmZvKSk7Ci0JICBmdW5jLT5wcmV2X2Z1bmMgPSB1bml0LT5mdW5jdGlvbl90YWJsZTsKLQkgIHVuaXQtPmZ1bmN0aW9uX3RhYmxlID0gZnVuYzsKLQl9Ci0gICAgICBlbHNlCi0JZnVuYyA9IE5VTEw7Ci0gIAotICAgICAgZm9yIChpID0gMDsgaSA8IGFiYnJldi0+bnVtX2F0dHJzOyArK2kpCi0JewotCSAgaW5mb19wdHIgPSByZWFkX2F0dHJpYnV0ZSAoJmF0dHIsICZhYmJyZXYtPmF0dHJzW2ldLCB1bml0LCBpbmZvX3B0cik7Ci0JICAKLQkgIGlmIChmdW5jKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChhdHRyLm5hbWUpCi0JCXsKLQkJY2FzZSBEV19BVF9uYW1lOgotCQkgIAotCQkgIG5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQotCQkgIC8qIFByZWZlciBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSBvdmVyIERXX0FUX25hbWUuICAqLwotCQkgIGlmIChmdW5jLT5uYW1lID09IE5VTEwpCi0JCSAgICBmdW5jLT5uYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgRFdfQVRfTUlQU19saW5rYWdlX25hbWU6Ci0JCSAgZnVuYy0+bmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfQVRfbG93X3BjOgotCQkgIGZ1bmMtPmxvdyA9IERXX0FERFIgKCZhdHRyKTsKLQkJICBicmVhazsKLQotCQljYXNlIERXX0FUX2hpZ2hfcGM6Ci0JCSAgZnVuYy0+aGlnaCA9IERXX0FERFIgKCZhdHRyKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQotCQl7Ci0JCWNhc2UgRFdfQVRfbmFtZToKLQkJICBuYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGFiYnJldi0+aGFzX2NoaWxkcmVuKQotCW5lc3RpbmdfbGV2ZWwrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0KLQotCi0vKiBQYXJzZSBhIERXQVJGMiBjb21waWxhdGlvbiB1bml0IHN0YXJ0aW5nIGF0IElORk9fUFRSLiAgVGhpcwotICAgaW5jbHVkZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyIHRoYXQgcHJvY2VlZHMgdGhlIERJRSdzLCBidXQKLSAgIGRvZXMgbm90IGluY2x1ZGUgdGhlIGxlbmd0aCBmaWVsZCB0aGF0IHByZWNlZWRzIGVhY2ggY29tcGlsYXRpb24KLSAgIHVuaXQgaGVhZGVyLiAgRU5EX1BUUiBwb2ludHMgb25lIHBhc3QgdGhlIGVuZCBvZiB0aGlzIGNvbXAgdW5pdC4KLSAgIElmIEFCQlJFVl9MRU5HVEggaXMgMCwgdGhlbiB0aGUgbGVuZ3RoIG9mIHRoZSBhYmJyZXZpYXRpb24gb2Zmc2V0Ci0gICBpcyBhc3N1bWVkIHRvIGJlIGZvdXIgYnl0ZXMuICBPdGhlcndpc2UsIGl0IGl0IGlzIHRoZSBzaXplIGdpdmVuLgotCi0gICBUaGlzIHJvdXRpbmUgZG9lcyBub3QgcmVhZCB0aGUgd2hvbGUgY29tcGlsYXRpb24gdW5pdDsgb25seSBlbm91Z2gKLSAgIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBjb21wX3VuaXQgKgotcGFyc2VfY29tcF91bml0IChhYmZkLCBpbmZvX3B0ciwgZW5kX3B0ciwgYWJicmV2X2xlbmd0aCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBpbmZvX3B0cjsKLSAgICAgY2hhciogZW5kX3B0cjsKLSAgICAgdW5zaWduZWQgaW50IGFiYnJldl9sZW5ndGg7Ci17Ci0gIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0KLSAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLSAgdW5zaWduZWQgaW50IGFiYnJldl9vZmZzZXQgPSAwOwotICB1bnNpZ25lZCBjaGFyIGFkZHJfc2l6ZTsKLSAgc3RydWN0IGFiYnJldl9pbmZvKiogYWJicmV2czsKLQotICB1bnNpZ25lZCBpbnQgYWJicmV2X251bWJlciwgYnl0ZXNfcmVhZCwgaTsKLSAgc3RydWN0IGFiYnJldl9pbmZvICphYmJyZXY7Ci0gIHN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQotICB2ZXJzaW9uID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IDI7Ci0gIEJGRF9BU1NFUlQgKGFiYnJldl9sZW5ndGggPT0gMAotCSAgICAgIHx8IGFiYnJldl9sZW5ndGggPT0gNAotCSAgICAgIHx8IGFiYnJldl9sZW5ndGggPT0gOCk7Ci0gIGlmIChhYmJyZXZfbGVuZ3RoID09IDAgfHwgYWJicmV2X2xlbmd0aCA9PSA0KQotICAgIGFiYnJldl9vZmZzZXQgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgZWxzZSBpZiAoYWJicmV2X2xlbmd0aCA9PSA4KQotICAgIGFiYnJldl9vZmZzZXQgPSByZWFkXzhfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgaW5mb19wdHIgKz0gYWJicmV2X2xlbmd0aDsKLSAgYWRkcl9zaXplID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgaW5mb19wdHIgKz0gMTsKLQotICBpZiAodmVyc2lvbiAhPSAyKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IGZvdW5kIGR3YXJmIHZlcnNpb24gJyVodScsIHRoaXMgcmVhZGVyIG9ubHkgaGFuZGxlcyB2ZXJzaW9uIDIgaW5mb3JtYXRpb24uIiksIHZlcnNpb24gKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChhZGRyX3NpemUgPiBzaXplb2YgKGJmZF92bWEpKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IGZvdW5kIGFkZHJlc3Mgc2l6ZSAnJXUnLCB0aGlzIHJlYWRlciBjYW4gbm90IGhhbmRsZSBzaXplcyBncmVhdGVyIHRoYW4gJyV1Jy4iKSwKLQkJCSBhZGRyX3NpemUsCi0JCQkgc2l6ZW9mIChiZmRfdm1hKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYWRkcl9zaXplICE9IDQgJiYgYWRkcl9zaXplICE9IDgpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRHdhcmYgRXJyb3I6IGZvdW5kIGFkZHJlc3Mgc2l6ZSAnJXUnLCB0aGlzIHJlYWRlciBjYW4gb25seSBoYW5kbGUgYWRkcmVzcyBzaXplcyAnNCcgYW5kICc4Jy4iLCBhZGRyX3NpemUgKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGFiYnJldnMgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdCBpbnRvIGEgdGFibGUgKi8KLSAgYWJicmV2cyA9IHJlYWRfYWJicmV2cyAoYWJmZCwgYWJicmV2X29mZnNldCk7Ci0gIGlmICghIGFiYnJldnMpCi0gICAgICByZXR1cm4gMDsKLQotICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gIGlmICghIGFiYnJldl9udW1iZXIpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQmFkIGFiYnJldiBudW1iZXI6ICVkLiIpLAotCQkJIGFiYnJldl9udW1iZXIpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWJicmV2ID0gbG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlciwgYWJicmV2cyk7Ci0gIGlmICghIGFiYnJldikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIpLAotCQkJIGFiYnJldl9udW1iZXIpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICB1bml0ID0gKHN0cnVjdCBjb21wX3VuaXQqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb21wX3VuaXQpKTsKLSAgdW5pdC0+YWJmZCA9IGFiZmQ7Ci0gIHVuaXQtPmFkZHJfc2l6ZSA9IGFkZHJfc2l6ZTsgCi0gIHVuaXQtPmFiYnJldnMgPSBhYmJyZXZzOwotICB1bml0LT5lbmRfcHRyID0gZW5kX3B0cjsKLQotICBmb3IgKGkgPSAwOyBpIDwgYWJicmV2LT5udW1fYXR0cnM7ICsraSkKLSAgICB7Ci0gICAgICBpbmZvX3B0ciA9IHJlYWRfYXR0cmlidXRlICgmYXR0ciwgJmFiYnJldi0+YXR0cnNbaV0sIHVuaXQsIGluZm9fcHRyKTsKLQotICAgICAgLyogU3RvcmUgdGhlIGRhdGEgaWYgaXQgaXMgb2YgYW4gYXR0cmlidXRlIHdlIHdhbnQgdG8ga2VlcCBpbiBhCi0JIHBhcnRpYWwgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQotCXsKLQljYXNlIERXX0FUX3N0bXRfbGlzdDoKLQkgIHVuaXQtPnN0bXRsaXN0ID0gMTsKLQkgIHVuaXQtPmxpbmVfb2Zmc2V0ID0gRFdfVU5TTkQgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9uYW1lOgotCSAgdW5pdC0+bmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2xvd19wYzoKLQkgIHVuaXQtPmFyYW5nZS5sb3cgPSBEV19BRERSICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfaGlnaF9wYzoKLQkgIHVuaXQtPmFyYW5nZS5oaWdoID0gRFdfQUREUiAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2NvbXBfZGlyOgotCSAgewotCSAgICBjaGFyKiBjb21wX2RpciA9IERXX1NUUklORyAoJmF0dHIpOwotCSAgICBpZiAoY29tcF9kaXIpCi0JICAgICAgewotCQkvKiBJcml4IDYuMiBuYXRpdmUgY2MgcHJlcGVuZHMgPG1hY2hpbmU+LjogdG8gdGhlIGNvbXBpbGF0aW9uCi0JCSAgIGRpcmVjdG9yeSwgZ2V0IHJpZCBvZiBpdC4gICovCi0JCWNoYXIgKmNwID0gKGNoYXIqKSBzdHJjaHIgKGNvbXBfZGlyLCAnOicpOwotCi0JCWlmIChjcCAmJiBjcCAhPSBjb21wX2RpciAmJiBjcFstMV0gPT0gJy4nICYmIGNwWzFdID09ICcvJykKLQkJICBjb21wX2RpciA9IGNwICsgMTsKLQkgICAgICB9Ci0JICAgIHVuaXQtPmNvbXBfZGlyID0gY29tcF9kaXI7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgdW5pdC0+Zmlyc3RfY2hpbGRfZGllX3B0ciA9IGluZm9fcHRyOwotICByZXR1cm4gdW5pdDsKLX0KLQotCi0KLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBVTklUIGNvbnRhaW5zIHRoZSBhZGRyZXNzIGdpdmVuIGJ5IEFERFIuICovCi0KLXN0YXRpYyBib29sZWFuCi1jb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAodW5pdCwgYWRkcikKLSAgICAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgYXJhbmdlICphcmFuZ2U7Ci0KLSAgaWYgKHVuaXQtPmVycm9yKQotICAgIHJldHVybiAwOwotCi0gIGFyYW5nZSA9ICZ1bml0LT5hcmFuZ2U7Ci0gIGRvCi0gICAgewotICAgICAgaWYgKGFkZHIgPj0gYXJhbmdlLT5sb3cgJiYgYWRkciA8IGFyYW5nZS0+aGlnaCkKLQlyZXR1cm4gMTsKLSAgICAgIGFyYW5nZSA9IGFyYW5nZS0+bmV4dDsKLSAgICB9Ci0gIHdoaWxlIChhcmFuZ2UpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBJZiBVTklUIGNvbnRhaW5zIEFERFIsIHNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgdG8gdGhlIHZhbHVlcyBmb3IKLSAgIHRoZSBsaW5lIGNvbnRhaW5pbmcgQUREUi4gIFRoZSBvdXRwdXQgcGFyYW1ldGVycywgRklMRU5BTUVfUFRSLAotICAgRlVOQ1RJT05OQU1FX1BUUiwgYW5kIExJTkVOVU1CRVJfUFRSLCBhcmUgcG9pbnRlcnMgdG8gdGhlIG9iamVjdHMKLSAgIHRvIGJlIGZpbGxlZCBpbi4gIAotCi0gICBSZXR1cm4gdHJ1ZSBvZiBVTklUIGNvbnRhaW5zIEFERFIsIGFuZCBubyBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZDsKLSAgIGZhbHNlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHVuaXQsIGFkZHIsCi0JCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgbGluZW51bWJlcl9wdHIpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIGJvb2xlYW4gbGluZV9wOwotICBib29sZWFuIGZ1bmNfcDsKLSAgCi0gIGlmICh1bml0LT5lcnJvcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgdW5pdC0+bGluZV90YWJsZSkKLSAgICB7Ci0gICAgICBpZiAoISB1bml0LT5zdG10bGlzdCkKLQl7Ci0JICB1bml0LT5lcnJvciA9IDE7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAKLSAgICAgIHVuaXQtPmxpbmVfdGFibGUgPSBkZWNvZGVfbGluZV9pbmZvICh1bml0KTsKLQotICAgICAgaWYgKCEgdW5pdC0+bGluZV90YWJsZSkKLQl7Ci0JICB1bml0LT5lcnJvciA9IDE7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgCi0gICAgICBpZiAoISBzY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyAodW5pdCkpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgbGluZV9wID0gbG9va3VwX2FkZHJlc3NfaW5fbGluZV9pbmZvX3RhYmxlICh1bml0LT5saW5lX3RhYmxlLAotCQkJCQkgICAgICBhZGRyLAotCQkJCQkgICAgICBmaWxlbmFtZV9wdHIsIAotCQkJCQkgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0gIGZ1bmNfcCA9IGxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlICh1bml0LT5mdW5jdGlvbl90YWJsZSwgCi0JCQkJCSAgICAgYWRkciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyKTsKLSAgcmV0dXJuIGxpbmVfcCB8fCBmdW5jX3A7Ci19Ci0KLS8qIFRoZSBEV0FSRjIgdmVyc2lvbiBvZiBmaW5kX25lYXJlc3QgbGluZS4gIFJldHVybiB0cnVlIGlmIHRoZSBsaW5lCi0gICBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAgQUREUl9TSVpFIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICBpbml0aWFsIC5kZWJ1Z19pbmZvIGxlbmd0aCBmaWVsZCBhbmQgaW4gdGhlIGFiYnJldmlhdGlvbiBvZmZzZXQuCi0gICBZb3UgbWF5IHVzZSB6ZXJvIHRvIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlCi0gICB1c2VkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCSAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkgICAgICAgbGluZW51bWJlcl9wdHIsCi0JCQkgICAgICAgYWRkcl9zaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCBhZGRyX3NpemU7Ci17Ci0gIC8qIFJlYWQgZWFjaCBjb21waWxhdGlvbiB1bml0IGZyb20gdGhlIHNlY3Rpb24gLmRlYnVnX2luZm8sIGFuZCBjaGVjawotICAgICB0byBzZWUgaWYgaXQgY29udGFpbnMgdGhlIGFkZHJlc3Mgd2UgYXJlIHNlYXJjaGluZyBmb3IuICBJZiB5ZXMsCi0gICAgIGxvb2t1cCB0aGUgYWRkcmVzcywgYW5kIHJldHVybiB0aGUgbGluZSBudW1iZXIgaW5mby4gIElmIG5vLCBnbwotICAgICBvbiB0byB0aGUgbmV4dCBjb21waWxhdGlvbiB1bml0LiAgCi0KLSAgICAgV2Uga2VlcCBhIGxpc3Qgb2YgYWxsIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcGlsYXRpb24gdW5pdHMsIGFuZAotICAgICBhIHBvaW50ZXIgdG8gdGhlIG5leHQgdW4tcmVhZCBjb21waWxhdGlvbiB1bml0LiAgQ2hlY2sgdGhlIAotICAgICBwcmV2aW91c2x5IHJlYWQgdW5pdHMgYmVmb3JlIHJlYWRpbmcgbW9yZS4KLSAgICAgKi8KLQotICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBXaGF0IGFkZHJlc3MgYXJlIHdlIGxvb2tpbmcgZm9yPyAqLwotICBiZmRfdm1hIGFkZHIgPSBvZmZzZXQgKyBzZWN0aW9uLT52bWE7Ci0KLSAgc3RydWN0IGNvbXBfdW5pdCogZWFjaDsKLSAgCi0gICpmaWxlbmFtZV9wdHIgPSBOVUxMOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IE5VTEw7Ci0gICpsaW5lbnVtYmVyX3B0ciA9IDA7Ci0KLSAgLyogVGhlIERXQVJGMiBzcGVjIHNheXMgdGhhdCB0aGUgaW5pdGlhbCBsZW5ndGggZmllbGQsIGFuZCB0aGUKLSAgICAgb2Zmc2V0IG9mIHRoZSBhYmJyZXZpYXRpb24gdGFibGUsIHNob3VsZCBib3RoIGJlIDQtYnl0ZSB2YWx1ZXMuCi0gICAgIEhvd2V2ZXIsIHNvbWUgY29tcGlsZXJzIGRvIHRoaW5ncyBkaWZmZXJlbnRseS4gICovCi0gIGlmIChhZGRyX3NpemUgPT0gMCkKLSAgICBhZGRyX3NpemUgPSA0OwotICBCRkRfQVNTRVJUIChhZGRyX3NpemUgPT0gNCB8fCBhZGRyX3NpemUgPT0gOCk7Ci0gICAgCi0gIGlmICghIHN0YXNoKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbyA9Ci0JKHN0cnVjdCBkd2FyZjJfZGVidWcqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZjJfZGVidWcpKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfaW5mbyIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAvKiBObyBkd2FyZjIgaW5mby4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzdGFzaAotCSAgICAgaGFzIGJlZW4gYWxsb2NhdGVkLCBidXQgY29udGFpbnMgemVyb3MsIHRoaXMgbGV0cwotCSAgICAgZnV0dXJlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gZmFpbCBxdWlja2VyLiAqLwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc3Rhc2gtPmluZm9fcHRyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gtPmluZm9fcHRyKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCBzdGFzaC0+aW5mb19wdHIsIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5pbmZvX3B0ciA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+aW5mb19wdHJfZW5kID0gc3Rhc2gtPmluZm9fcHRyICsgc2l6ZTsKLQotICAgICAgLyogRklYTUU6IFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKLQkgLmRlYnVnX2luZm8gc2VjdGlvbi4gIFRoZSAnbG93JyBhbmQgJ2hpZ2gnIGFkZHJlc3NlcyBvZiB0aGUKLQkgY29tcF91bml0cyBhcmUgY29tcHV0ZWQgYnkgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBpbiB0aGUKLQkgLnRleHQgc2VnbWVudC4gIFdlIG5lZWQgdGhlc2UgYWRkcmVzc2VzIGluIG9yZGVyIHRvIGRldGVybWluZQotCSB0aGUgbmVhcmVzdCBsaW5lIG51bWJlciwgYW5kIHNvIHdlIGhhdmUgdG8gcmVzb2x2ZSB0aGUKLQkgcmVsb2NzLiAgVGhlcmUgaXMgYSBzaW1pbGFyIHByb2JsZW0gd2hlbiB0aGUgLmRlYnVnX2xpbmUKLQkgc2VjdGlvbiBpcyBwcm9jZXNzZWQgYXMgd2VsbCAoZS5nLiwgdGhlcmUgbWF5IGJlIHJlbG9jcwotCSBhZ2FpbnN0IHRoZSBvcGVyYW5kIG9mIHRoZSBEV19MTkVfc2V0X2FkZHJlc3Mgb3BlcmF0b3IpLgotCSAKLQkgVW5mb3J0dW5hdGVseSBnZXR0aW5nIGhvbGQgb2YgdGhlIHJlbG9jIGluZm9ybWF0aW9uIGlzIGhhcmQuLi4KLQotCSBGb3Igbm93LCB0aGlzIG1lYW5zIHRoYXQgZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgKGFzCi0JIG9wcG9zZWQgdG8gZnVsbHkgZXhlY3V0YWJsZXMpIGRvZXMgbm90IGFsd2F5cyB3b3JrIGFzIHdlbGwgYXMKLQkgd2Ugd291bGQgbGlrZS4gICovCi0gICAgfQotICAKLSAgLyogQSBudWxsIGluZm9fcHRyIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGR3YXJmMiBpbmZvIAotICAgICAob3IgdGhhdCBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIHN0YXNoKS4gKi8KLQotICBpZiAoISBzdGFzaC0+aW5mb19wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENoZWNrIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcC4gdW5pdHMgZmlyc3QuICovCi0KLSAgZm9yIChlYWNoID0gc3Rhc2gtPmFsbF9jb21wX3VuaXRzOyBlYWNoOyBlYWNoID0gZWFjaC0+bmV4dF91bml0KQotICAgIGlmIChjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAoZWFjaCwgYWRkcikpCi0gICAgICByZXR1cm4gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLCBmaWxlbmFtZV9wdHIsIAotCQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKTsKLQotICAvKiBSZWFkIGVhY2ggcmVtYWluaW5nIGNvbXAuIHVuaXRzIGNoZWNraW5nIGVhY2ggYXMgdGhleSBhcmUgcmVhZC4gKi8KLSAgd2hpbGUgKHN0YXNoLT5pbmZvX3B0ciA8IHN0YXNoLT5pbmZvX3B0cl9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGNvbXBfdW5pdCogZWFjaDsKLSAgICAgIGJmZF92bWEgbGVuZ3RoOwotICAgICAgYm9vbGVhbiBmb3VuZDsKLQotICAgICAgaWYgKGFkZHJfc2l6ZSA9PSA0KQotCWxlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgc3Rhc2gtPmluZm9fcHRyKTsKLSAgICAgIGVsc2UKLQlsZW5ndGggPSByZWFkXzhfYnl0ZXMgKGFiZmQsIHN0YXNoLT5pbmZvX3B0cik7Ci0gICAgICBzdGFzaC0+aW5mb19wdHIgKz0gYWRkcl9zaXplOwotCi0gICAgICBpZiAobGVuZ3RoID4gMCkKLSAgICAgICAgewotCSAgZWFjaCA9IHBhcnNlX2NvbXBfdW5pdCAoYWJmZCwgc3Rhc2gtPmluZm9fcHRyLCAKLQkJCQkgIHN0YXNoLT5pbmZvX3B0ciArIGxlbmd0aCwKLQkJCQkgIGFkZHJfc2l6ZSk7Ci0JICBzdGFzaC0+aW5mb19wdHIgKz0gbGVuZ3RoOwotCi0JICBpZiAoZWFjaCkKLQkgICAgewotCSAgICAgIGVhY2gtPm5leHRfdW5pdCA9IHN0YXNoLT5hbGxfY29tcF91bml0czsKLQkgICAgICBzdGFzaC0+YWxsX2NvbXBfdW5pdHMgPSBlYWNoOwotCi0JICAgICAgLyogRFdfQVRfbG93X3BjIGFuZCBEV19BVF9oaWdoX3BjIGFyZSBvcHRpb25hbCBmb3IKLQkJIGNvbXBpbGF0aW9uIHVuaXRzLiAgSWYgd2UgZG9uJ3QgaGF2ZSB0aGVtIChpLmUuLAotCQkgdW5pdC0+aGlnaCA9PSAwKSwgd2UgbmVlZCB0byBjb25zdWx0IHRoZSBsaW5lIGluZm8KLQkJIHRhYmxlIHRvIHNlZSBpZiBhIGNvbXBpbGF0aW9uIHVuaXQgY29udGFpbnMgdGhlIGdpdmVuCi0JCSBhZGRyZXNzLiAqLwotCSAgICAgIGlmIChlYWNoLT5hcmFuZ2UuaGlnaCA+IDApCi0JCXsKLQkJICBpZiAoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MgKGVhY2gsIGFkZHIpKQotCQkgICAgcmV0dXJuIGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoZWFjaCwgYWRkciwKLQkJCQkJCSAgICAgICBmaWxlbmFtZV9wdHIsCi0JCQkJCQkgICAgICAgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJCSAgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmb3VuZCA9IGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoZWFjaCwgYWRkciwKLQkJCQkJCSAgICAgICBmaWxlbmFtZV9wdHIsCi0JCQkJCQkgICAgICAgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJCSAgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0JCSAgaWYgKGZvdW5kKQotCQkgICAgcmV0dXJuIHRydWU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2ZmLmMgYi9iZmQvZWNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxMzZlZS4uMDAwMDAwMAotLS0gYS9iZmQvZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4NDkgKzAsMCBAQAotLyogR2VuZXJpYyBFQ09GRiAoRXh0ZW5kZWQtQ09GRikgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCi0gICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIEZJWE1FOiBXZSBuZWVkIHRoZSBkZWZpbml0aW9ucyBvZiBOX1NFVFtBRFRCXSwgYnV0IGFvdXQ2NC5oIGRlZmluZXMKLSAgIHNvbWUgb3RoZXIgc3R1ZmYgd2hpY2ggd2UgZG9uJ3Qgd2FudCBhbmQgd2hpY2ggY29uZmxpY3RzIHdpdGggc3R1ZmYKLSAgIHdlIGRvIHdhbnQuICAqLwotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI3VuZGVmIE5fQUJTCi0jdW5kZWYgZXhlY19oZHIKLSN1bmRlZiBvYmpfc3ltX2ZpbGVwb3MKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGludCBlY29mZl9nZXRfbWFnaWMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyBlY29mZl9zZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgIGZsYWd3b3JkIGZsYWdzKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBTWU1SICplY29mZl9zeW0sCi0JCQkJCSAgIGFzeW1ib2wgKmFzeW0sIGludCBleHQsIGludCB3ZWFrKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSBQQVJBTVMgKChiZmQgKmFiZmQsIEZEUiAqZmRyLAotCQkJCQkgIGNoYXIgKnN0cmluZywKLQkJCQkJICBSTkRYUiAqcm5keCwgbG9uZyBpc3ltLAotCQkJCQkgIGNvbnN0IGNoYXIgKndoaWNoKSk7Ci1zdGF0aWMgY2hhciAqZWNvZmZfdHlwZV90b19zdHJpbmcgUEFSQU1TICgoYmZkICphYmZkLCBGRFIgKmZkciwKLQkJCQkJICAgdW5zaWduZWQgaW50IGluZHgpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQlhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGludCBlY29mZl9zb3J0X2hkcnMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9nZXRfZXh0ciBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHVuc2lnbmVkIGludCBlY29mZl9hcm1hcF9oYXNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKnMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmVoYXNoLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50IGhsb2cpKTsKLQwKLS8qIFRoaXMgc3R1ZmYgaXMgc29tZXdoYXQgY29waWVkIGZyb20gY29mZmNvZGUuaC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiBiZmRfZGVidWdfc2VjdGlvbiA9Ci17Ci0gIC8qIG5hbWUsICAgaW5kZXgsIG5leHQsIGZsYWdzLCBzZXRfdm1hLCByZWxvY19kb25lLCBsaW5rZXJfbWFyaywgZ2NfbWFyayAqLwotICAiKkRFQlVHKiIsIDAsICAgICAwLCAgICAwLCAgICAgMCwgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgIDAsCi0gIC8qIHZtYSwgbG1hLCBfY29va2VkX3NpemUsIF9yYXdfc2l6ZSwgb3V0cHV0X29mZnNldCwgb3V0cHV0X3NlY3Rpb24sICovCi0gIDAsICAgICAgMCwgICAwLCAgICAgICAgICAgIDAsICAgICAgICAgMCwgICAgICAgICAgICAgTlVMTCwKLSAgLyogYWxpZywgcmVsb2MuLi4sIG9yZWwuLi4sIHJlbG9jX2NvdW50LCBmaWxlcG9zLCByZWxfLi4uLCBsaW5lXy4uLiAqLwotICAwLCAgICAgICAwLCAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgIDAsICAgICAgIDAsIAkgICAwLAotICAvKiB1c2VyZGF0YSwgY29udGVudHMsIGxpbmVubywgbGluZW5vX2NvdW50ICovCi0gIDAsICAgICAgICAgICAwLCAgICAgICAgMCwgICAgICAwLAotICAvKiBjb21kYXRfaW5mbywgbW92aW5nX2xpbmVfZmlsZXBvcywgdGFyZ2V0X2luZGV4LCB1c2VkX2J5X2JmZCwgICovCi0gIE5VTEwsICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgIDAsCi0gIC8qIGNvbnMsIG93bmVyLCBzeW1ib2wgKi8KLSAgMCwgICAgICAgMCwgICAgIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopIE5VTEwsCi0gIC8qIHN5bWJvbF9wdHJfcHRyLCAgICAgICAgICAgICAgICAgICBsaW5rX29yZGVyX2hlYWQsIC4uLl90YWlsICovCi0gIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSBOVUxMLCBOVUxMLCAgICAgICAgICAgIE5VTEwKLX07Ci0KLS8qIENyZWF0ZSBhbiBFQ09GRiBvYmplY3QuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID0gKChzdHJ1Y3QgZWNvZmZfdGRhdGEgKikKLQkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX2RhdGFfdHlwZSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1QVFIKLV9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7Ci0gIGVjb2ZmX2RhdGFfdHlwZSAqZWNvZmY7Ci0KLSAgaWYgKF9iZmRfZWNvZmZfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIGVjb2ZmID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIGVjb2ZmLT5ncF9zaXplID0gODsKLSAgZWNvZmYtPnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0KLSAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGVjb2ZmLT50ZXh0X3N0YXJ0ID0gaW50ZXJuYWxfYS0+dGV4dF9zdGFydDsKLSAgICAgIGVjb2ZmLT50ZXh0X2VuZCA9IGludGVybmFsX2EtPnRleHRfc3RhcnQgKyBpbnRlcm5hbF9hLT50c2l6ZTsKLSAgICAgIGVjb2ZmLT5ncCA9IGludGVybmFsX2EtPmdwX3ZhbHVlOwotICAgICAgZWNvZmYtPmdwcm1hc2sgPSBpbnRlcm5hbF9hLT5ncHJtYXNrOwotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQllY29mZi0+Y3BybWFza1tpXSA9IGludGVybmFsX2EtPmNwcm1hc2tbaV07Ci0gICAgICBlY29mZi0+ZnBybWFzayA9IGludGVybmFsX2EtPmZwcm1hc2s7Ci0gICAgICBpZiAoaW50ZXJuYWxfYS0+bWFnaWMgPT0gRUNPRkZfQU9VVF9aTUFHSUMpCi0JYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKLSAgICAgIGVsc2UKLQlhYmZkLT5mbGFncyAmPX4gRF9QQUdFRDsKLSAgICB9Ci0KLSAgLyogSXQgdHVybnMgb3V0IHRoYXQgbm8gc3BlY2lhbCBhY3Rpb24gaXMgcmVxdWlyZWQgYnkgdGhlIE1JUFMgb3IKLSAgICAgQWxwaGEgRUNPRkYgYmFja2VuZHMuICBUaGV5IGhhdmUgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoZQotICAgICBhLm91dCBoZWFkZXIsIGJ1dCB3ZSBqdXN0IGNvcHkgaXQgYWxsIChlLmcuLCBncHJtYXNrLCBjcHJtYXNrIGFuZAotICAgICBmcHJtYXNrKSBhbmQgbGV0IHRoZSBzd2FwcGluZyByb3V0aW5lcyBlbnN1cmUgdGhhdCBvbmx5IHJlbGV2YW50Ci0gICAgIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLQotICByZXR1cm4gKFBUUikgZWNvZmY7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBuZXcgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSA0OwotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9URVhUKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9JTklUKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9GSU5JKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0RBVEEpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9TREFUQSkgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9SREFUQSkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJVDgpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSVQ0KSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUkNPTlNUKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUERBVEEpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfQlNTKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfU0JTUykgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBBbiBJcml4IDQgc2hhcmVkIGxpYmFyeS4gICovCi0gICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICB9Ci0KLSAgLyogUHJvYmFibHkgYW55IG90aGVyIHNlY3Rpb24gbmFtZSBpcyBTRUNfTkVWRVJfTE9BRCwgYnV0IEknbQotICAgICB1bmNlcnRhaW4gYWJvdXQgLmluaXQgb24gc29tZSBzeXN0ZW1zIGFuZCBJIGRvbid0IGtub3cgaG93IHNoYXJlZAotICAgICBsaWJyYXJpZXMgd29yay4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIHR5cGUuICBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gICB0aGUgZ2VuZXJpYyBDT0ZGIHJvdXRpbmVzLiAgSXQgaXMgdGhlIGludmVyc2Ugb2YgZWNvZmZfZ2V0X21hZ2ljLAotICAgYmVsb3cuICBUaGlzIGNvdWxkIGJlIGFuIEVDT0ZGIGJhY2tlbmQgcm91dGluZSwgd2l0aCBvbmUgdmVyc2lvbgotICAgZm9yIGVhY2ggdGFyZ2V0LCBidXQgdGhlcmUgYXJlbid0IGFsbCB0aGF0IG1hbnkgRUNPRkYgdGFyZ2V0cy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgdW5zaWduZWQgbG9uZyBtYWNoOwotCi0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBNSVBTX01BR0lDXzE6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRToKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoID0gMzAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRTI6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzI6Ci0gICAgICAvKiBNSVBTIElTQSBsZXZlbCAyOiB0aGUgcjYwMDAgKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbWFjaCA9IDYwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEUzOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUczOgotICAgICAgLyogTUlQUyBJU0EgbGV2ZWwgMzogdGhlIHI0MDAwICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICAgIG1hY2ggPSA0MDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2FscGhhOwotICAgICAgbWFjaCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIG1hY2ggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKTsKLX0KLQotLyogR2V0IHRoZSBtYWdpYyBudW1iZXIgdG8gdXNlIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUuCi0gICBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLCBhYm92ZS4gICovCi0KLXN0YXRpYyBpbnQKLWVjb2ZmX2dldF9tYWdpYyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgYmlnLCBsaXR0bGU7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSAwOgotCWNhc2UgMzAwMDoKLQkgIGJpZyA9IE1JUFNfTUFHSUNfQklHOwotCSAgbGl0dGxlID0gTUlQU19NQUdJQ19MSVRUTEU7Ci0JICBicmVhazsKLQotCWNhc2UgNjAwMDoKLQkgIGJpZyA9IE1JUFNfTUFHSUNfQklHMjsKLQkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA0MDAwOgotCSAgYmlnID0gTUlQU19NQUdJQ19CSUczOwotCSAgbGl0dGxlID0gTUlQU19NQUdJQ19MSVRUTEUzOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICByZXR1cm4gYmZkX2JpZ19lbmRpYW4gKGFiZmQpID8gYmlnIDogbGl0dGxlOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIHJldHVybiBBTFBIQV9NQUdJQzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogR2V0IHRoZSBzZWN0aW9uIHNfZmxhZ3MgdG8gdXNlIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgbG9uZwotZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MgKG5hbWUsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgbG9uZyBzdHlwOwotCi0gIHN0eXAgPSAwOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsIF9URVhUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1RFWFQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0RBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfU0RBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1JEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVDgpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElUODsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUNCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSVQ0OwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0gICAgc3R5cCA9IFNUWVBfQlNTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9TQlNTKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1NCU1M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0lOSVQpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRUNPRkZfSU5JVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRklOSSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9FQ09GRl9GSU5JOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9QREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9QREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfWERBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfWERBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQikgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9FQ09GRl9MSUI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0dPVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9HT1Q7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0hBU0gpID09IDApCi0gICAgc3R5cCA9IFNUWVBfSEFTSDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOQU1JQykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EWU5BTUlDOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSUJMSVNUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJQkxJU1Q7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JFTERZTikgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9SRUxEWU47Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0NPTkZMSUMpID09IDApCi0gICAgc3R5cCA9IFNUWVBfQ09ORkxJQzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOU1RSKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RZTlNUUjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOU1lNKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RZTlNZTTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQ09NTUVOVCkgPT0gMCkKLSAgICB7Ci0gICAgICBzdHlwID0gU1RZUF9DT01NRU5UOwotICAgICAgZmxhZ3MgJj1+IFNFQ19ORVZFUl9MT0FEOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkNPTlNUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1JDT05TVDsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfQ09ERSkgCi0gICAgc3R5cCA9IFNUWVBfVEVYVDsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfREFUQSkgCi0gICAgc3R5cCA9IFNUWVBfREFUQTsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfUkVBRE9OTFkpCi0gICAgc3R5cCA9IFNUWVBfUkRBVEE7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX0xPQUQpCi0gICAgc3R5cCA9IFNUWVBfUkVHOwotICBlbHNlCi0gICAgc3R5cCA9IFNUWVBfQlNTOwotCi0gIGlmIChmbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotICAgIHN0eXAgfD0gU1RZUF9OT0xPQUQ7Ci0KLSAgcmV0dXJuIHN0eXA7Ci19Ci0KLS8qIEdldCB0aGUgQkZEIGZsYWdzIHRvIHVzZSBmb3IgYSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1mbGFnd29yZAotX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyAoYWJmZCwgaGRyLCBuYW1lLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGhkcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOwotICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOwotICBmbGFnd29yZCBzZWNfZmxhZ3M9MDsKLQotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfVEVYVCkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOQU1JQykKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSUJMSVNUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1JFTERZTikKLSAgICAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT05GTElDCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOU1RSKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0RZTlNZTSkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9IQVNIKSkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfUkRBVEEpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1NEQVRBKQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9QREFUQQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9YREFUQQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9HT1QpCi0JICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1JDT05TVCkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX1JEQVRBKQotCSAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUkNPTlNUKQotCXNlY19mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9TQlNTKSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9MSVRBKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ4KQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ0KSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgIH0KLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotDAotLyogUmVhZCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyIGZvciBhbiBFQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgUFRSIHJhdyA9IE5VTEw7Ci0gIEhEUlIgKmludGVybmFsX3N5bWhkcjsKLQotICAvKiBTZWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIGl0IGluLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5tYWdpYyA9PSAKLSAgICAgIGJhY2tlbmQtPmRlYnVnX3N3YXAuc3ltX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSB3aGV0aGVyIHRoZXJlIGlzIGEgc3ltYm9saWMgaGVhZGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpIGhvbGRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scwotICAgICBhcyByZWFkIGZyb20gdGhlIGZpbGUgaGVhZGVyLCBidXQgb24gRUNPRkYgdGhpcyBpcyBhbHdheXMgdGhlCi0gICAgIHNpemUgb2YgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8KLSAgICAgaGFuZGxlIHRoaXMgd2hlbiB3ZSBmaXJzdCByZWFkIHRoZSBmaWxlIGluIGNvZmZnZW4uYy4gICovCi0gIGV4dGVybmFsX2hkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IGV4dGVybmFsX2hkcl9zaXplKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBoZWFkZXIuICAqLwotICByYXcgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChyYXcgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcywgU0VFS19TRVQpID09IC0xCi0gICAgICB8fCAoYmZkX3JlYWQgKHJhdywgZXh0ZXJuYWxfaGRyX3NpemUsIDEsIGFiZmQpCi0JICAhPSBleHRlcm5hbF9oZHJfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGludGVybmFsX3N5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0gICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2hkcl9pbikgKGFiZmQsIHJhdywgaW50ZXJuYWxfc3ltaGRyKTsKLQotICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5tYWdpYyAhPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN5bV9tYWdpYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gKGludGVybmFsX3N5bWhkci0+aXN5bU1heAotCQkJICAgICArIGludGVybmFsX3N5bWhkci0+aWV4dE1heCk7Ci0KLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgaW1wb3J0YW50IHN5bWJvbGljIGluZm9ybWF0aW9uIGZvciBhbiBFQ09GRgotICAgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGNhbGxlZCBieSBnZGIgdmlhIHRoZSByZWFkX2RlYnVnX2luZm8gZW50cnkKLSAgIHBvaW50IGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCBpZ25vcmUsIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBIRFJSICppbnRlcm5hbF9zeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X2Jhc2U7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X3NpemU7Ci0gIFBUUiByYXc7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGNoYXIgKmZyYXdfc3JjOwotICBjaGFyICpmcmF3X2VuZDsKLSAgc3RydWN0IGZkciAqZmRyX3B0cjsKLSAgYmZkX3NpemVfdHlwZSByYXdfZW5kOwotICBiZmRfc2l6ZV90eXBlIGNiX2VuZDsKLQotICBCRkRfQVNTRVJUIChkZWJ1ZyA9PSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UndmUgYWxyZWFkeSBnb3R0ZW4gaXQsIGFuZCB3aGV0aGVyIHRoZXJlJ3MgYW55IHRvCi0gICAgIGdldC4gICovCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+cmF3X3N5bWVudHMgIT0gKFBUUikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoISBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnRlcm5hbF9zeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLQotICAvKiBSZWFkIGFsbCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gYXQgb25jZS4gICovCi0gIHJhd19iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcwotCSAgICAgICsgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0KLSAgLyogQWxwaGEgZWNvZmYgbWFrZXMgdGhlIGRldGVybWluYXRpb24gb2YgcmF3X3NpemUgZGlmZmljdWx0LiBJdCBoYXMKLSAgICAgYW4gdW5kb2N1bWVudGVkIGRlYnVnIGRhdGEgc2VjdGlvbiBiZXR3ZWVuIHRoZSBzeW1oZHIgYW5kIHRoZSBmaXJzdAotICAgICBkb2N1bWVudGVkIHNlY3Rpb24uIEFuZCB0aGUgb3JkZXJpbmcgb2YgdGhlIHNlY3Rpb25zIHZhcmllcyBiZXR3ZWVuCi0gICAgIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcy4KLSAgICAgSWYgYmZkIHN1cHBvcnRzIFNFRUtfRU5EIHNvbWVkYXksIHRoaXMgY29kZSBjb3VsZCBiZSBzaW1wbGlmaWVkLiAgKi8KLQotICByYXdfZW5kID0gMDsKLQotI2RlZmluZSBVUERBVEVfUkFXX0VORChzdGFydCwgY291bnQsIHNpemUpIFwKLSAgY2JfZW5kID0gaW50ZXJuYWxfc3ltaGRyLT5zdGFydCArIGludGVybmFsX3N5bWhkci0+Y291bnQgKiAoc2l6ZSk7IFwKLSAgaWYgKGNiX2VuZCA+IHJhd19lbmQpIFwKLSAgICByYXdfZW5kID0gY2JfZW5kCi0KLSAgVVBEQVRFX1JBV19FTkQgKGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiRG5PZmZzZXQsIGlkbk1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9kbnJfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlBkT2Zmc2V0LCBpcGRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfcGRyX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JTeW1PZmZzZXQsIGlzeW1NYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfc3ltX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JPcHRPZmZzZXQsIGlvcHRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfb3B0X3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBVUERBVEVfUkFXX0VORCAoY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkZkT2Zmc2V0LCBpZmRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZmRyX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JSZmRPZmZzZXQsIGNyZmQsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfcmZkX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JFeHRPZmZzZXQsIGlleHRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgVVBEQVRFX1JBV19FTkQKLQotICByYXdfc2l6ZSA9IHJhd19lbmQgLSByYXdfYmFzZTsKLSAgaWYgKHJhd19zaXplID09IDApCi0gICAgewotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmF3ID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByYXdfc2l6ZSk7Ci0gIGlmIChyYXcgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcwotCQkgKyBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplKSwKLQkJU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChyYXcsIHJhd19zaXplLCAxLCBhYmZkKSAhPSByYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmF3KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnJhd19zeW1lbnRzID0gcmF3OwotCi0gIC8qIEdldCBwb2ludGVycyBmb3IgdGhlIG51bWVyaWMgb2Zmc2V0cyBpbiB0aGUgSERSUiBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBGSVgob2ZmMSwgb2ZmMiwgdHlwZSkgXAotICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5vZmYxID09IDApIFwKLSAgICBkZWJ1Zy0+b2ZmMiA9ICh0eXBlKSBOVUxMOyBcCi0gIGVsc2UgXAotICAgIGRlYnVnLT5vZmYyID0gKHR5cGUpICgoY2hhciAqKSByYXcgXAotCQkJICArIChpbnRlcm5hbF9zeW1oZHItPm9mZjEgXAotCQkJICAgICAtIHJhd19iYXNlKSkKLSAgRklYIChjYkxpbmVPZmZzZXQsIGxpbmUsIHVuc2lnbmVkIGNoYXIgKik7Ci0gIEZJWCAoY2JEbk9mZnNldCwgZXh0ZXJuYWxfZG5yLCBQVFIpOwotICBGSVggKGNiUGRPZmZzZXQsIGV4dGVybmFsX3BkciwgUFRSKTsKLSAgRklYIChjYlN5bU9mZnNldCwgZXh0ZXJuYWxfc3ltLCBQVFIpOwotICBGSVggKGNiT3B0T2Zmc2V0LCBleHRlcm5hbF9vcHQsIFBUUik7Ci0gIEZJWCAoY2JBdXhPZmZzZXQsIGV4dGVybmFsX2F1eCwgdW5pb24gYXV4X2V4dCAqKTsKLSAgRklYIChjYlNzT2Zmc2V0LCBzcywgY2hhciAqKTsKLSAgRklYIChjYlNzRXh0T2Zmc2V0LCBzc2V4dCwgY2hhciAqKTsKLSAgRklYIChjYkZkT2Zmc2V0LCBleHRlcm5hbF9mZHIsIFBUUik7Ci0gIEZJWCAoY2JSZmRPZmZzZXQsIGV4dGVybmFsX3JmZCwgUFRSKTsKLSAgRklYIChjYkV4dE9mZnNldCwgZXh0ZXJuYWxfZXh0LCBQVFIpOwotI3VuZGVmIEZJWAotCi0gIC8qIEkgZG9uJ3Qgd2FudCB0byBhbHdheXMgc3dhcCBhbGwgdGhlIGRhdGEsIGJlY2F1c2UgaXQgd2lsbCBqdXN0Ci0gICAgIHdhc3RlIHRpbWUgYW5kIG1vc3QgcHJvZ3JhbXMgd2lsbCBuZXZlciBsb29rIGF0IGl0LiAgVGhlIG9ubHkKLSAgICAgdGltZSB0aGUgbGlua2VyIG5lZWRzIG1vc3Qgb2YgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBzd2FwcGVkCi0gICAgIGlzIHdoZW4gbGlua2luZyBiaWctZW5kaWFuIGFuZCBsaXR0bGUtZW5kaWFuIE1JUFMgb2JqZWN0IGZpbGVzCi0gICAgIHRvZ2V0aGVyLCB3aGljaCBpcyBub3QgYSBjb21tb24gb2NjdXJyZW5jZS4KLQotICAgICBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIGZkciB0byBkZWFsIHdpdGggYSBsb3Qgb2YgaW5mb3JtYXRpb24gaW4KLSAgICAgdGhlIHN5bWJvbHMsIHNvIHdlIHN3YXAgdGhlbSBoZXJlLiAgKi8KLSAgZGVidWctPmZkciA9IChzdHJ1Y3QgZmRyICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJIChpbnRlcm5hbF9zeW1oZHItPmlmZE1heCAqCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgZmRyKSkpOwotICBpZiAoZGVidWctPmZkciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZXh0ZXJuYWxfZmRyX3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2Zkcl9zaXplOwotICBmZHJfcHRyID0gZGVidWctPmZkcjsKLSAgZnJhd19zcmMgPSAoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZmRyOwotICBmcmF3X2VuZCA9IGZyYXdfc3JjICsgaW50ZXJuYWxfc3ltaGRyLT5pZmRNYXggKiBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0gICAgKCpiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfZmRyX2luKSAoYWJmZCwgKFBUUikgZnJhd19zcmMsIGZkcl9wdHIpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgc3ltYm9sIHRhYmxlIHJvdXRpbmVzLiAgVGhlIEVDT0ZGIHN5bWJvbCB0YWJsZSBpcyBkZXNjcmliZWQKLSAgIGluIGdjYy9taXBzLXRmaWxlLmMuICAqLwotCi0vKiBFQ09GRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXIgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQKLSAgIHRvZ2V0aGVyLCBhbmQgdGhlbiByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcG9pbnRlciwgd2hpY2ggeWllbGRzCi0gICBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uCi0gICBzZWN0aW9uLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBlY29mZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBlY29mZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICplY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIENyZWF0ZSBhbiBlbXB0eSBzeW1ib2wuICAqLwotCi1hc3ltYm9sICoKLV9iZmRfZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKm5ldzsKLQotICBuZXcgPSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcgPT0gKGVjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwpCi0gICAgcmV0dXJuIChhc3ltYm9sICopIE5VTEw7Ci0gIG1lbXNldCAoKFBUUikgbmV3LCAwLCBzaXplb2YgKm5ldyk7Ci0gIG5ldy0+c3ltYm9sLnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgbmV3LT5mZHIgPSAoRkRSICopIE5VTEw7Ci0gIG5ldy0+bG9jYWwgPSBmYWxzZTsKLSAgbmV3LT5uYXRpdmUgPSBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogU2V0IHRoZSBCRkQgZmxhZ3MgYW5kIHNlY3Rpb24gZm9yIGFuIEVDT0ZGIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zZXRfc3ltYm9sX2luZm8gKGFiZmQsIGVjb2ZmX3N5bSwgYXN5bSwgZXh0LCB3ZWFrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFNZTVIgKmVjb2ZmX3N5bTsKLSAgICAgYXN5bWJvbCAqYXN5bTsKLSAgICAgaW50IGV4dDsKLSAgICAgaW50IHdlYWs7Ci17Ci0gIGFzeW0tPnRoZV9iZmQgPSBhYmZkOwotICBhc3ltLT52YWx1ZSA9IGVjb2ZmX3N5bS0+dmFsdWU7Ci0gIGFzeW0tPnNlY3Rpb24gPSAmYmZkX2RlYnVnX3NlY3Rpb247Ci0gIGFzeW0tPnVkYXRhLmkgPSAwOwotCi0gIC8qIE1vc3Qgc3ltYm9sIHR5cGVzIGFyZSBqdXN0IGZvciBkZWJ1Z2dpbmcuICAqLwotICBzd2l0Y2ggKGVjb2ZmX3N5bS0+c3QpCi0gICAgewotICAgIGNhc2Ugc3RHbG9iYWw6Ci0gICAgY2FzZSBzdFN0YXRpYzoKLSAgICBjYXNlIHN0TGFiZWw6Ci0gICAgY2FzZSBzdFByb2M6Ci0gICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHN0TmlsOgotICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0JewotCSAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAod2VhaykKLSAgICBhc3ltLT5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfV0VBSzsKLSAgZWxzZSBpZiAoZXh0KQotICAgIGFzeW0tPmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLSAgICAgIC8qIE5vcm1hbGx5LCBhIGxvY2FsIHN0UHJvYyBzeW1ib2wgd2lsbCBoYXZlIGEgY29ycmVzcG9uZGluZwotICAgICAgICAgZXh0ZXJuYWwgc3ltYm9sLiAgV2UgbWFyayB0aGUgbG9jYWwgc3ltYm9sIGFzIGEgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2wsIGluIG9yZGVyIHRvIHByZXZlbnQgbm0gZnJvbSBwcmludGluZyBib3RoIG91dC4KLSAgICAgICAgIFNpbWlsYXJseSwgd2UgbWFyayBzdExhYmVsIGFuZCBzdGFicyBzeW1ib2xzIGFzIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9scy4gIEluIGJvdGggY2FzZXMsIHdlIGRvIHdhbnQgdG8gc2V0IHRoZSB2YWx1ZQotICAgICAgICAgY29ycmVjdGx5IGJhc2VkIG9uIHRoZSBzeW1ib2wgY2xhc3MuICAqLwotICAgICAgaWYgKGVjb2ZmX3N5bS0+c3QgPT0gc3RQcm9jCi0JICB8fCBlY29mZl9zeW0tPnN0ID09IHN0TGFiZWwKLQkgIHx8IEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0JYXN5bS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgICB9Ci0gIHN3aXRjaCAoZWNvZmZfc3ltLT5zYykKLSAgICB7Ci0gICAgY2FzZSBzY05pbDoKLSAgICAgIC8qIFVzZWQgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBsYWJlbHMuICBMZWF2ZSB0aGVtIGluIHRoZQotCSBkZWJ1Z2dpbmcgc2VjdGlvbiwgYW5kIG1hcmsgdGhlbSBhcyBsb2NhbC4gIElmIEJTRl9ERUJVR0dJTkcKLQkgaXMgc2V0LCB0aGVuIG5tIGRvZXMgbm90IGRpc3BsYXkgdGhlbSBmb3Igc29tZSByZWFzb24uICBJZiBubwotCSBmbGFncyBhcmUgc2V0IHRoZW4gdGhlIGxpbmtlciB3aGluZXMgYWJvdXQgdGhlbS4gICovCi0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NUZXh0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50ZXh0Iik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjRGF0YToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZGF0YSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0JzczoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuYnNzIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjUmVnaXN0ZXI6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQWJzOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVW5kZWZpbmVkOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBhc3ltLT5mbGFncyA9IDA7Ci0gICAgICBhc3ltLT52YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQ2RiTG9jYWw6Ci0gICAgY2FzZSBzY0JpdHM6Ci0gICAgY2FzZSBzY0NkYlN5c3RlbToKLSAgICBjYXNlIHNjUmVnSW1hZ2U6Ci0gICAgY2FzZSBzY0luZm86Ci0gICAgY2FzZSBzY1VzZXJTdHJ1Y3Q6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjU0RhdGE6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNkYXRhIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjU0JzczoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2JzcyIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1JEYXRhOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yZGF0YSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1ZhcjoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NDb21tb246Ci0gICAgICBpZiAoYXN5bS0+dmFsdWUgPiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSkKLQl7Ci0JICBhc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGFzeW0tPmZsYWdzID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBzY1NDb21tb246Ci0gICAgICBpZiAoZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBlY29mZl9zY29tX3NlY3Rpb24ubmFtZSA9IFNDT01NT047Ci0JICBlY29mZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmZWNvZmZfc2NvbV9zeW1ib2xfcHRyOwotCSAgZWNvZmZfc2NvbV9zeW1ib2wubmFtZSA9IFNDT01NT047Ci0JICBlY29mZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgZWNvZmZfc2NvbV9zeW1ib2xfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+ZmxhZ3MgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1ZhclJlZ2lzdGVyOgotICAgIGNhc2Ugc2NWYXJpYW50OgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1NVbmRlZmluZWQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGFzeW0tPmZsYWdzID0gMDsKLSAgICAgIGFzeW0tPnZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NJbml0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5pbml0Iik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQmFzZWRWYXI6Ci0gICAgY2FzZSBzY1hEYXRhOgotICAgIGNhc2Ugc2NQRGF0YToKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NGaW5pOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5maW5pIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjUkNvbnN0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yY29uc3QiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3Igc3BlY2lhbCBjb25zdHJ1Y3RvcnMgc3ltYm9scyBhbmQgbWFrZSByZWxvY2F0aW9uIGVudHJpZXMKLSAgICAgaW4gYSBzcGVjaWFsIGNvbnN0cnVjdGlvbiBzZWN0aW9uLiAgVGhlc2UgYXJlIHByb2R1Y2VkIGJ5IHRoZQotICAgICAtZmdudS1saW5rZXIgYXJndW1lbnQgdG8gZysrLiAgKi8KLSAgaWYgKEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0gICAgewotICAgICAgc3dpdGNoIChFQ09GRl9VTk1BUktfU1RBQiAoZWNvZmZfc3ltLT5pbmRleCkpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgTl9TRVRBOgotCWNhc2UgTl9TRVRUOgotCWNhc2UgTl9TRVREOgotCWNhc2UgTl9TRVRCOgotCSAgewotCSAgICAvKiBUaGlzIGNvZGUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIEl0IHVzZWQgdG8gYmUgdXNlZCB0bwotCSAgICAgICBtYWtlIHRoZSBsaW5rZXIgaGFuZGxlIHNldCBzeW1ib2xzLCBidXQgdGhleSBhcmUgbm93Ci0JICAgICAgIGhhbmRsZWQgaW4gdGhlIGFkZF9zeW1ib2xzIHJvdXRpbmUgaW5zdGVhZC4gICovCi0jaWYgMAotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkgICAgYXJlbGVudF9jaGFpbiAqcmVsb2NfY2hhaW47Ci0JICAgIHVuc2lnbmVkIGludCBiaXRzaXplOwotCi0JICAgIC8qIEdldCBhIHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzeW1ib2wgKHVzdWFsbHkKLQkgICAgICAgX19DVE9SX0xJU1RfXyBvciBfX0RUT1JfTElTVF9fKS4gIEZJWE1FOiBnY2MgdXNlcyB0aGUKLQkgICAgICAgbmFtZSBfX19DVE9SX0xJU1QgKHRocmVlIHVuZGVyc2NvcmVzKS4gIFdlIG5lZWQKLQkgICAgICAgX19DVE9SX0xJU1QgKHR3byB1bmRlcnNjb3JlcyksIHNpbmNlIEVDT0ZGIGRvZXNuJ3QgdXNlCi0JICAgICAgIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBieSBnY2MsCi0JICAgICAgIGJ1dCBpbnN0ZWFkIHdlIGRvIGl0IGhlcmUuICBBY3R1YWxseSwgdGhpcyBzaG91bGQgYWxsCi0JICAgICAgIGJlIGRvbmUgZGlmZmVyZW50bHkgYW55aG93LiAgKi8KLQkgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKGFzeW0pOwotCSAgICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnXycgJiYgbmFtZVsyXSA9PSAnXycpCi0JICAgICAgewotCQkrK25hbWU7Ci0JCWFzeW0tPm5hbWUgPSBuYW1lOwotCSAgICAgIH0KLQkgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgICAgaWYgKHNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgICAgewotCQljaGFyICpjb3B5OwotCi0JCWNvcHkgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZSkgKyAxKTsKLQkJaWYgKCFjb3B5KQotCQkgIHJldHVybiBmYWxzZTsKLQkJc3RyY3B5IChjb3B5LCBuYW1lKTsKLQkJc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGNvcHkpOwotCSAgICAgIH0KLQotCSAgICAvKiBCdWlsZCBhIHJlbG9jIHBvaW50aW5nIHRvIHRoaXMgY29uc3RydWN0b3IuICAqLwotCSAgICByZWxvY19jaGFpbiA9Ci0JICAgICAgKGFyZWxlbnRfY2hhaW4gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnRfY2hhaW4pKTsKLQkgICAgaWYgKCFyZWxvY19jaGFpbikKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICAgIGJmZF9nZXRfc2VjdGlvbiAoYXN5bSktPnN5bWJvbF9wdHJfcHRyOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50LmFkZHJlc3MgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuYWRkZW5kID0gYXN5bS0+dmFsdWU7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuaG93dG8gPQotCSAgICAgIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5jb25zdHJ1Y3Rvcl9yZWxvYzsKLQotCSAgICAvKiBTZXQgdXAgdGhlIGNvbnN0cnVjdG9yIHNlY3Rpb24gdG8gaG9sZCB0aGUgcmVsb2MuICAqLwotCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19DT05TVFJVQ1RPUjsKLQkgICAgKytzZWN0aW9uLT5yZWxvY19jb3VudDsKLQotCSAgICAvKiBDb25zdHJ1Y3RvciBzZWN0aW9ucyBtdXN0IGJlIHJvdW5kZWQgdG8gYSBib3VuZGFyeQotCSAgICAgICBiYXNlZCBvbiB0aGUgYml0c2l6ZS4gIFRoZXNlIGFyZSBub3QgcmVhbCBzZWN0aW9ucy0tCi0JICAgICAgIHRoZXkgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IHRoZSBsaW5rZXItLXNvIHRoZSBFQ09GRgotCSAgICAgICAxNiBieXRlIGFsaWdubWVudCByZXN0cmljdGlvbiBkb2VzIG5vdCBhcHBseS4gICovCi0JICAgIGJpdHNpemUgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+Y29uc3RydWN0b3JfYml0c2l6ZTsKLQkgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMTsKLQkgICAgd2hpbGUgKCgxIDw8IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcikgPCBiaXRzaXplIC8gOCkKLQkgICAgICArK3NlY3Rpb24tPmFsaWdubWVudF9wb3dlcjsKLQotCSAgICByZWxvY19jaGFpbi0+bmV4dCA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotCSAgICBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbiA9IHJlbG9jX2NoYWluOwotCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgKz0gYml0c2l6ZSAvIDg7Ci0KLSNlbmRpZiAvKiAwICovCi0KLQkgICAgLyogTWFyayB0aGUgc3ltYm9sIGFzIGEgY29uc3RydWN0b3IuICAqLwotCSAgICBhc3ltLT5mbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbiBFQ09GRiBzeW1ib2wgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3N5bV9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9zeW1faW47Ci0gIGJmZF9zaXplX3R5cGUgaW50ZXJuYWxfc2l6ZTsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmludGVybmFsOwotICBlY29mZl9zeW1ib2xfdHlwZSAqaW50ZXJuYWxfcHRyOwotICBjaGFyICplcmF3X3NyYzsKLSAgY2hhciAqZXJhd19lbmQ7Ci0gIEZEUiAqZmRyX3B0cjsKLSAgRkRSICpmZHJfZW5kOwotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgcmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBkbyBub3RoaW5nLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5jYW5vbmljYWxfc3ltYm9scyAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEdldCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW50ZXJuYWxfc2l6ZSA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSk7Ci0gIGludGVybmFsID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgaW50ZXJuYWxfc2l6ZSk7Ci0gIGlmIChpbnRlcm5hbCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsKLSAgZXJhd19zcmMgPSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9leHQ7Ci0gIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JICAgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgKLQkJICogZXh0ZXJuYWxfZXh0X3NpemUpKTsKLSAgZm9yICg7IGVyYXdfc3JjIDwgZXJhd19lbmQ7IGVyYXdfc3JjICs9IGV4dGVybmFsX2V4dF9zaXplLCBpbnRlcm5hbF9wdHIrKykKLSAgICB7Ci0gICAgICBFWFRSIGludGVybmFsX2VzeW07Ci0KLSAgICAgICgqc3dhcF9leHRfaW4pIChhYmZkLCAoUFRSKSBlcmF3X3NyYywgJmludGVybmFsX2VzeW0pOwotICAgICAgaW50ZXJuYWxfcHRyLT5zeW1ib2wubmFtZSA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zc2V4dAotCQkJCSAgICsgaW50ZXJuYWxfZXN5bS5hc3ltLmlzcyk7Ci0gICAgICBpZiAoIWVjb2ZmX3NldF9zeW1ib2xfaW5mbyAoYWJmZCwgJmludGVybmFsX2VzeW0uYXN5bSwKLQkJCQkgICZpbnRlcm5hbF9wdHItPnN5bWJvbCwgMSwKLQkJCQkgIGludGVybmFsX2VzeW0ud2Vha2V4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLyogVGhlIGFscGhhIHVzZXMgYSBuZWdhdGl2ZSBpZmQgZmllbGQgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoaW50ZXJuYWxfZXN5bS5pZmQgPj0gMCkKLQlpbnRlcm5hbF9wdHItPmZkciA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5mZHIKLQkJCSAgICAgKyBpbnRlcm5hbF9lc3ltLmlmZCk7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfcHRyLT5mZHIgPSBOVUxMOwotICAgICAgaW50ZXJuYWxfcHRyLT5sb2NhbCA9IGZhbHNlOwotICAgICAgaW50ZXJuYWxfcHRyLT5uYXRpdmUgPSAoUFRSKSBlcmF3X3NyYzsKLSAgICB9Ci0KLSAgLyogVGhlIGxvY2FsIHN5bWJvbHMgbXVzdCBiZSBhY2Nlc3NlZCB2aWEgdGhlIGZkcidzLCBiZWNhdXNlIHRoZQotICAgICBzdHJpbmcgYW5kIGF1eCBpbmRpY2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgZmRyIGluZm9ybWF0aW9uLiAgKi8KLSAgZmRyX3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmZkcjsKLSAgZmRyX2VuZCA9IGZkcl9wdHIgKyBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OwotICBmb3IgKDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBjaGFyICpscmF3X3NyYzsKLSAgICAgIGNoYXIgKmxyYXdfZW5kOwotCi0gICAgICBscmF3X3NyYyA9ICgoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0KLQkJICArIGZkcl9wdHItPmlzeW1CYXNlICogZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgbHJhd19lbmQgPSBscmF3X3NyYyArIGZkcl9wdHItPmNzeW0gKiBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGZvciAoOwotCSAgIGxyYXdfc3JjIDwgbHJhd19lbmQ7Ci0JICAgbHJhd19zcmMgKz0gZXh0ZXJuYWxfc3ltX3NpemUsIGludGVybmFsX3B0cisrKQotCXsKLQkgIFNZTVIgaW50ZXJuYWxfc3ltOwotCi0JICAoKnN3YXBfc3ltX2luKSAoYWJmZCwgKFBUUikgbHJhd19zcmMsICZpbnRlcm5hbF9zeW0pOwotCSAgaW50ZXJuYWxfcHRyLT5zeW1ib2wubmFtZSA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zcwotCQkJCSAgICAgICArIGZkcl9wdHItPmlzc0Jhc2UKLQkJCQkgICAgICAgKyBpbnRlcm5hbF9zeW0uaXNzKTsKLQkgIGlmICghZWNvZmZfc2V0X3N5bWJvbF9pbmZvIChhYmZkLCAmaW50ZXJuYWxfc3ltLAotCQkJCSAgICAgICZpbnRlcm5hbF9wdHItPnN5bWJvbCwgMCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGludGVybmFsX3B0ci0+ZmRyID0gZmRyX3B0cjsKLQkgIGludGVybmFsX3B0ci0+bG9jYWwgPSB0cnVlOwotCSAgaW50ZXJuYWxfcHRyLT5uYXRpdmUgPSAoUFRSKSBscmF3X3NyYzsKLQl9Ci0gICAgfQotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5jYW5vbmljYWxfc3ltYm9scyA9IGludGVybmFsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoZSBjYW5vbmljYWwgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLS8qIEdldCB0aGUgY2Fub25pY2FsIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2Vjb2ZmX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICpzeW1iYXNlOwotICBlY29mZl9zeW1ib2xfdHlwZSAqKmxvY2F0aW9uID0gKGVjb2ZmX3N5bWJvbF90eXBlICoqKSBhbG9jYXRpb247Ci0KLSAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHN5bWJhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHM7Ci0gIHdoaWxlIChjb3VudGVyIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpCi0gICAgewotICAgICAgKihsb2NhdGlvbisrKSA9IHN5bWJhc2UrKzsKLSAgICAgIGNvdW50ZXIrKzsKLSAgICB9Ci0gICpsb2NhdGlvbisrID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogVHVybiBFQ09GRiB0eXBlIGluZm9ybWF0aW9uIGludG8gYSBwcmludGFibGUgc3RyaW5nLgotICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgYW5kIGVjb2ZmX3R5cGVfdG9fc3RyaW5nIGFyZSBmcm9tCi0gICBnY2MvbWlwcy10ZHVtcC5jLCB3aXRoIHN3YXBwaW5nIGFkZGVkIGFuZCB1c2VkX3B0ciByZW1vdmVkLiAgKi8KLQotLyogV3JpdGUgYWdncmVnYXRlIGluZm9ybWF0aW9uIHRvIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHN0cmluZywgcm5keCwgaXN5bSwgd2hpY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRkRSICpmZHI7Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgUk5EWFIgKnJuZHg7Ci0gICAgIGxvbmcgaXN5bTsKLSAgICAgY29uc3QgY2hhciAqd2hpY2g7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcCA9Ci0gICAgJmVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm8gPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIHVuc2lnbmVkIGludCBpZmQgPSBybmR4LT5yZmQ7Ci0gIHVuc2lnbmVkIGludCBpbmR4ID0gcm5keC0+aW5kZXg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIAotICBpZiAoaWZkID09IDB4ZmZmKQotICAgIGlmZCA9IGlzeW07Ci0KLSAgLyogQW4gaWZkIG9mIC0xIGlzIGFuIG9wYXF1ZSB0eXBlLiAgQW4gZXNjYXBlZCBpbmRleCBvZiAwIGlzIGEKLSAgICAgc3RydWN0IHJldHVybiB0eXBlIG9mIGEgcHJvY2VkdXJlIGNvbXBpbGVkIHdpdGhvdXQgLWcuICAqLwotICBpZiAoaWZkID09IDB4ZmZmZmZmZmYKLSAgICAgIHx8IChybmR4LT5yZmQgPT0gMHhmZmYgJiYgaW5keCA9PSAwKSkKLSAgICBuYW1lID0gIjx1bmRlZmluZWQ+IjsKLSAgZWxzZSBpZiAoaW5keCA9PSBpbmRleE5pbCkKLSAgICBuYW1lID0gIjxubyBuYW1lPiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTWU1SIHN5bTsKLQotICAgICAgaWYgKGRlYnVnX2luZm8tPmV4dGVybmFsX3JmZCA9PSBOVUxMKQotCWZkciA9IGRlYnVnX2luZm8tPmZkciArIGlmZDsKLSAgICAgIGVsc2UKLQl7Ci0JICBSRkRUIHJmZDsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3JmZF9pbikgKGFiZmQsCi0JCQkJICAgICAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3JmZAotCQkJCSAgICAgICArICgoZmRyLT5yZmRCYXNlICsgaWZkKQotCQkJCQkgICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpKSwKLQkJCQkgICAgICAmcmZkKTsKLQkgIGZkciA9IGRlYnVnX2luZm8tPmZkciArIHJmZDsKLQl9Ci0KLSAgICAgIGluZHggKz0gZmRyLT5pc3ltQmFzZTsKLQotICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsCi0JCQkJICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCQkJICAgKyBpbmR4ICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpLAotCQkJCSAgJnN5bSk7Ci0KLSAgICAgIG5hbWUgPSBkZWJ1Z19pbmZvLT5zcyArIGZkci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0gICAgfQotCi0gIHNwcmludGYgKHN0cmluZywKLQkgICAiJXMgJXMgeyBpZmQgPSAldSwgaW5kZXggPSAlbHUgfSIsCi0JICAgd2hpY2gsIG5hbWUsIGlmZCwKLQkgICAoKGxvbmcpIGluZHgKLQkgICAgKyBkZWJ1Z19pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpOwotfQotCi0vKiBDb252ZXJ0IHRoZSB0eXBlIGluZm9ybWF0aW9uIHRvIHN0cmluZyBmb3JtYXQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1lY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEZEUiAqZmRyOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLXsKLSAgdW5pb24gYXV4X2V4dCAqYXV4X3B0cjsKLSAgaW50IGJpZ2VuZGlhbjsKLSAgQVVYVSB1OwotICBzdHJ1Y3QgcXVhbCB7Ci0gICAgdW5zaWduZWQgaW50ICB0eXBlOwotICAgIGludCAgbG93X2JvdW5kOwotICAgIGludCAgaGlnaF9ib3VuZDsKLSAgICBpbnQgIHN0cmlkZTsKLSAgfSBxdWFsaWZpZXJzWzddOwotICB1bnNpZ25lZCBpbnQgYmFzaWNfdHlwZTsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmZmVyMVsxMDI0XTsKLSAgc3RhdGljIGNoYXIgYnVmZmVyMlsxMDI0XTsKLSAgY2hhciAqcDEgPSBidWZmZXIxOwotICBjaGFyICpwMiA9IGJ1ZmZlcjI7Ci0gIFJORFhSIHJuZHg7Ci0KLSAgYXV4X3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eCArIGZkci0+aWF1eEJhc2U7Ci0gIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKLQotICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotICAgIHsKLSAgICAgIHF1YWxpZmllcnNbaV0ubG93X2JvdW5kID0gMDsKLSAgICAgIHF1YWxpZmllcnNbaV0uaGlnaF9ib3VuZCA9IDA7Ci0gICAgICBxdWFsaWZpZXJzW2ldLnN0cmlkZSA9IDA7Ci0gICAgfQotCi0gIGlmIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0pID09IChiZmRfdm1hKSAtMSkKLSAgICByZXR1cm4gIi0xIChubyB0eXBlKSI7Ci0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsrXS5hX3RpLCAmdS50aSk7Ci0KLSAgYmFzaWNfdHlwZSA9IHUudGkuYnQ7Ci0gIHF1YWxpZmllcnNbMF0udHlwZSA9IHUudGkudHEwOwotICBxdWFsaWZpZXJzWzFdLnR5cGUgPSB1LnRpLnRxMTsKLSAgcXVhbGlmaWVyc1syXS50eXBlID0gdS50aS50cTI7Ci0gIHF1YWxpZmllcnNbM10udHlwZSA9IHUudGkudHEzOwotICBxdWFsaWZpZXJzWzRdLnR5cGUgPSB1LnRpLnRxNDsKLSAgcXVhbGlmaWVyc1s1XS50eXBlID0gdS50aS50cTU7Ci0gIHF1YWxpZmllcnNbNl0udHlwZSA9IHRxTmlsOwotCi0gIC8qCi0gICAqIEdvIGdldCB0aGUgYmFzaWMgdHlwZS4KLSAgICovCi0gIHN3aXRjaCAoYmFzaWNfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBidE5pbDoJCQkvKiB1bmRlZmluZWQgKi8KLSAgICAgIHN0cmNweSAocDEsICJuaWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEFkcjoJCQkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLwotICAgICAgc3RyY3B5IChwMSwgImFkZHJlc3MiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidENoYXI6CQkvKiBjaGFyYWN0ZXIgKi8KLSAgICAgIHN0cmNweSAocDEsICJjaGFyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVQ2hhcjoJCS8qIHVuc2lnbmVkIGNoYXJhY3RlciAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIGNoYXIiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFNob3J0OgkJLyogc2hvcnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJzaG9ydCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VVNob3J0OgkJLyogdW5zaWduZWQgc2hvcnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBzaG9ydCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0SW50OgkJCS8qIGludCAqLwotICAgICAgc3RyY3B5IChwMSwgImludCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VUludDoJCS8qIHVuc2lnbmVkIGludCAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIGludCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0TG9uZzoJCS8qIGxvbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJsb25nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVTG9uZzoJCS8qIHVuc2lnbmVkIGxvbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBsb25nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGbG9hdDoJCS8qIGZsb2F0IChyZWFsKSAqLwotICAgICAgc3RyY3B5IChwMSwgImZsb2F0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnREb3VibGU6CQkvKiBEb3VibGUgKHJlYWwpICovCi0gICAgICBzdHJjcHkgKHAxLCAiZG91YmxlIik7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogU3RydWN0dXJlcyBhZGQgMS0yIGF1eCB3b3JkczoKLQkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIHN0cnVjdCBkZWY7Ci0JIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCi0KLSAgICBjYXNlIGJ0U3RydWN0OgkJLyogU3RydWN0dXJlIChSZWNvcmQpICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJzdHJ1Y3QiKTsKLSAgICAgIGluZHgrKzsJCQkvKiBza2lwIGF1eCB3b3JkcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFVuaW9ucyBhZGQgMS0yIGF1eCB3b3JkczoKLQkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIHVuaW9uIGRlZjsKLQkgMm5kIHdvcmQgaXMgZmlsZSBpbmRleCBpZiAxc3Qgd29yZCByZmQgaXMgU1RfUkZERVNDQVBFLiAgKi8KLQotICAgIGNhc2UgYnRVbmlvbjoJCS8qIFVuaW9uICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJ1bmlvbiIpOwotICAgICAgaW5keCsrOwkJCS8qIHNraXAgYXV4IHdvcmRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogRW51bWVyYXRpb25zIGFkZCAxLTIgYXV4IHdvcmRzOgotCSAxc3Qgd29yZCBpcyBbU1RfUkZERVNDQVBFLCBvZmZzZXRdIHBvaW50ZXIgdG8gZW51bSBkZWY7Ci0JIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCi0KLSAgICBjYXNlIGJ0RW51bToJCS8qIEVudW1lcmF0aW9uICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJlbnVtIik7Ci0gICAgICBpbmR4Kys7CQkJLyogc2tpcCBhdXggd29yZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFR5cGVkZWY6CQkvKiBkZWZpbmVkIHZpYSBhIHR5cGVkZWYsIGlzeW1SZWYgcG9pbnRzICovCi0gICAgICBzdHJjcHkgKHAxLCAidHlwZWRlZiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0UmFuZ2U6CQkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJzdWJyYW5nZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0U2V0OgkJCS8qIHBhc2NhbCBzZXRzICovCi0gICAgICBzdHJjcHkgKHAxLCAic2V0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRDb21wbGV4OgkJLyogZm9ydHJhbiBjb21wbGV4ICovCi0gICAgICBzdHJjcHkgKHAxLCAiY29tcGxleCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RENvbXBsZXg6CQkvKiBmb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0gICAgICBzdHJjcHkgKHAxLCAiZG91YmxlIGNvbXBsZXgiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEluZGlyZWN0OgkJLyogZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYgKi8KLSAgICAgIHN0cmNweSAocDEsICJmb3J3YXJkL3VuYW1lZCB0eXBlZGVmIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGaXhlZERlYzoJCS8qIEZpeGVkIERlY2ltYWwgKi8KLSAgICAgIHN0cmNweSAocDEsICJmaXhlZCBkZWNpbWFsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGbG9hdERlYzoJCS8qIEZsb2F0IERlY2ltYWwgKi8KLSAgICAgIHN0cmNweSAocDEsICJmbG9hdCBkZWNpbWFsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRTdHJpbmc6CQkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCi0gICAgICBzdHJjcHkgKHAxLCAic3RyaW5nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRCaXQ6CQkJLyogQWxpZ25lZCBCaXQgU3RyaW5nICovCi0gICAgICBzdHJjcHkgKHAxLCAiYml0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRQaWN0dXJlOgkJLyogUGljdHVyZSAqLwotICAgICAgc3RyY3B5IChwMSwgInBpY3R1cmUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFZvaWQ6CQkvKiBWb2lkICovCi0gICAgICBzdHJjcHkgKHAxLCAidm9pZCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAocDEsIF8oIlVua25vd24gYmFzaWMgdHlwZSAlZCIpLCAoaW50KSBiYXNpY190eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBwMSArPSBzdHJsZW4gKGJ1ZmZlcjEpOwotCi0gIC8qCi0gICAqIElmIHRoaXMgaXMgYSBiaXRmaWVsZCwgZ2V0IHRoZSBiaXRzaXplLgotICAgKi8KLSAgaWYgKHUudGkuZkJpdGZpZWxkKQotICAgIHsKLSAgICAgIGludCBiaXRzaXplOwotCi0gICAgICBiaXRzaXplID0gQVVYX0dFVF9XSURUSCAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KytdKTsKLSAgICAgIHNwcmludGYgKHAxLCAiIDogJWQiLCBiaXRzaXplKTsKLSAgICAgIHAxICs9IHN0cmxlbiAoYnVmZmVyMSk7Ci0gICAgfQotCi0KLSAgLyoKLSAgICogRGVhbCB3aXRoIGFueSBxdWFsaWZpZXJzLgotICAgKi8KLSAgaWYgKHF1YWxpZmllcnNbMF0udHlwZSAhPSB0cU5pbCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogU25hcmYgdXAgYW55IGFycmF5IGJvdW5kcyBpbiB0aGUgY29ycmVjdCBvcmRlci4gIEFycmF5cwotICAgICAgICogc3RvcmUgNSBzdWNjZXNzaXZlIHdvcmRzIGluIHRoZSBhdXguIHRhYmxlOgotICAgICAgICoJd29yZCAwCVJORFhSIHRvIHR5cGUgb2YgdGhlIGJvdW5kcyAoaWUsIGludCkKLSAgICAgICAqCXdvcmQgMQlDdXJyZW50IGZpbGUgZGVzY3JpcHRvciBpbmRleAotICAgICAgICoJd29yZCAyCWxvdyBib3VuZAotICAgICAgICoJd29yZCAzCWhpZ2ggYm91bmQgKG9yIC0xIGlmIFtdKQotICAgICAgICoJd29yZCA0CXN0cmlkZSBzaXplIGluIGJpdHMKLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLQl7Ci0JICBpZiAocXVhbGlmaWVyc1tpXS50eXBlID09IHRxQXJyYXkpCi0JICAgIHsKLQkgICAgICBxdWFsaWZpZXJzW2ldLmxvd19ib3VuZCA9Ci0JCUFVWF9HRVRfRE5MT1cgKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsyXSk7Ci0JICAgICAgcXVhbGlmaWVyc1tpXS5oaWdoX2JvdW5kID0KLQkJQVVYX0dFVF9ETkhJR0ggKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCszXSk7Ci0JICAgICAgcXVhbGlmaWVyc1tpXS5zdHJpZGUgPQotCQlBVVhfR0VUX1dJRFRIIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrNF0pOwotCSAgICAgIGluZHggKz0gNTsKLQkgICAgfQotCX0KLQotICAgICAgLyoKLSAgICAgICAqIE5vdyBwcmludCBvdXQgdGhlIHF1YWxpZmllcnMuCi0gICAgICAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCSAgc3dpdGNoIChxdWFsaWZpZXJzW2ldLnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSB0cU5pbDoKLQkgICAgY2FzZSB0cU1heDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxUHRyOgotCSAgICAgIHN0cmNweSAocDIsICJwdHIgdG8gIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgicHRyIHRvICIpLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cVZvbDoKLQkgICAgICBzdHJjcHkgKHAyLCAidm9sYXRpbGUgIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgidm9sYXRpbGUgIiktMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxRmFyOgotCSAgICAgIHN0cmNweSAocDIsICJmYXIgIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgiZmFyICIpLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cVByb2M6Ci0JICAgICAgc3RyY3B5IChwMiwgImZ1bmMuIHJldC4gIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgiZnVuYy4gcmV0LiAiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxQXJyYXk6Ci0JICAgICAgewotCQlpbnQgZmlyc3RfYXJyYXkgPSBpOwotCQlpbnQgajsKLQotCQkvKiBQcmludCBhcnJheSBib3VuZHMgcmV2ZXJzZWQgKGllLCBpbiB0aGUgb3JkZXIgdGhlIEMKLQkJICAgcHJvZ3JhbW1lciB3cml0ZXMgdGhlbSkuICBDIGlzIHN1Y2ggYSBmdW4gbGFuZ3VhZ2UuLi4uICovCi0KLQkJd2hpbGUgKGkgPCA1ICYmIHF1YWxpZmllcnNbaSsxXS50eXBlID09IHRxQXJyYXkpCi0JCSAgaSsrOwotCi0JCWZvciAoaiA9IGk7IGogPj0gZmlyc3RfYXJyYXk7IGotLSkKLQkJICB7Ci0JCSAgICBzdHJjcHkgKHAyLCAiYXJyYXkgWyIpOwotCQkgICAgcDIgKz0gc2l6ZW9mICgiYXJyYXkgWyIpLTE7Ci0JCSAgICBpZiAocXVhbGlmaWVyc1tqXS5sb3dfYm91bmQgIT0gMCkKLQkJICAgICAgc3ByaW50ZiAocDIsCi0JCQkgICAgICAgIiVsZDolbGQgeyVsZCBiaXRzfSIsCi0JCQkgICAgICAgKGxvbmcpIHF1YWxpZmllcnNbal0ubG93X2JvdW5kLAotCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLmhpZ2hfYm91bmQsCi0JCQkgICAgICAgKGxvbmcpIHF1YWxpZmllcnNbal0uc3RyaWRlKTsKLQotCQkgICAgZWxzZSBpZiAocXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kICE9IC0xKQotCQkgICAgICBzcHJpbnRmIChwMiwKLQkJCSAgICAgICAiJWxkIHslbGQgYml0c30iLAotCQkJICAgICAgIChsb25nKSAocXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kICsgMSksCi0JCQkgICAgICAgKGxvbmcpIChxdWFsaWZpZXJzW2pdLnN0cmlkZSkpOwotCi0JCSAgICBlbHNlCi0JCSAgICAgIHNwcmludGYgKHAyLCAiIHslbGQgYml0c30iLCAobG9uZykgKHF1YWxpZmllcnNbal0uc3RyaWRlKSk7Ci0KLQkJICAgIHAyICs9IHN0cmxlbiAocDIpOwotCQkgICAgc3RyY3B5IChwMiwgIl0gb2YgIik7Ci0JCSAgICBwMiArPSBzaXplb2YgKCJdIG9mICIpLTE7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc3RyY3B5IChwMiwgYnVmZmVyMSk7Ci0gIHJldHVybiBidWZmZXIyOwotfQotCi0vKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgRUNPRkYgc3ltYm9sIFNZTUJPTCBpbiBSRVQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLV9iZmRfZWNvZmZfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBsb2NhbCBsYWJlbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICckJzsKLX0KLQotLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUNPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKWZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JewotCSAgU1lNUiBlY29mZl9zeW07Ci0JCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKLQkJCQkgICAgICAmZWNvZmZfc3ltKTsKLQkgIGZwcmludGYgKGZpbGUsICJlY29mZiBsb2NhbCAiKTsKLQkgIGZwcmludGZfdm1hIChmaWxlLCAoYmZkX3ZtYSkgZWNvZmZfc3ltLnZhbHVlKTsKLQkgIGZwcmludGYgKGZpbGUsICIgJXggJXgiLCAodW5zaWduZWQpIGVjb2ZmX3N5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9zeW0uc2MpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFWFRSIGVjb2ZmX2V4dDsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJICAgICAgJmVjb2ZmX2V4dCk7Ci0JICBmcHJpbnRmIChmaWxlLCAiZWNvZmYgZXh0ZXJuICIpOwotCSAgZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICV4ICV4IiwgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYyk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIC8qIFByaW50IG91dCB0aGUgc3ltYm9scyBpbiBhIHJlYXNvbmFibGUgd2F5ICovCi0gICAgICB7Ci0JY2hhciB0eXBlOwotCWludCBwb3M7Ci0JRVhUUiBlY29mZl9leHQ7Ci0JY2hhciBqbXB0Ymw7Ci0JY2hhciBjb2JvbF9tYWluOwotCWNoYXIgd2Vha2V4dDsKLQotCWlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JICB7Ci0JICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAotCQkJCQkmZWNvZmZfZXh0LmFzeW0pOwotCSAgICB0eXBlID0gJ2wnOwotCSAgICBwb3MgPSAoKCgoY2hhciAqKSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlCi0JCSAgICAgLSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0pCi0JCSAgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKQotCQkgICArIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KTsKLQkgICAgam1wdGJsID0gJyAnOwotCSAgICBjb2JvbF9tYWluID0gJyAnOwotCSAgICB3ZWFrZXh0ID0gJyAnOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJCSZlY29mZl9leHQpOwotCSAgICB0eXBlID0gJ2UnOwotCSAgICBwb3MgPSAoKChjaGFyICopIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUKLQkJICAgIC0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0KQotCQkgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQkgICAgam1wdGJsID0gZWNvZmZfZXh0LmptcHRibCA/ICdqJyA6ICcgJzsKLQkgICAgY29ib2xfbWFpbiA9IGVjb2ZmX2V4dC5jb2JvbF9tYWluID8gJ2MnIDogJyAnOwotCSAgICB3ZWFrZXh0ID0gZWNvZmZfZXh0LndlYWtleHQgPyAndycgOiAnICc7Ci0JICB9Ci0KLQlmcHJpbnRmIChmaWxlLCAiWyUzZF0gJWMgIiwKLQkJIHBvcywgdHlwZSk7Ci0JZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JZnByaW50ZiAoZmlsZSwgIiBzdCAleCBzYyAleCBpbmR4ICV4ICVjJWMlYyAlcyIsCi0JCSAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnN0LAotCQkgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYywKLQkJICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uaW5kZXgsCi0JCSBqbXB0YmwsIGNvYm9sX21haW4sIHdlYWtleHQsCi0JCSBzeW1ib2wtPm5hbWUpOwotCi0JaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5mZHIgIT0gTlVMTAotCSAgICAmJiBlY29mZl9leHQuYXN5bS5pbmRleCAhPSBpbmRleE5pbCkKLQkgIHsKLQkgICAgRkRSICpmZHI7Ci0JICAgIHVuc2lnbmVkIGludCBpbmR4OwotCSAgICBpbnQgYmlnZW5kaWFuOwotCSAgICBiZmRfc2l6ZV90eXBlIHN5bV9iYXNlOwotCSAgICB1bmlvbiBhdXhfZXh0ICphdXhfYmFzZTsKLQotCSAgICBmZHIgPSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+ZmRyOwotCSAgICBpbmR4ID0gZWNvZmZfZXh0LmFzeW0uaW5kZXg7Ci0KLQkgICAgLyogc3ltX2Jhc2UgaXMgdXNlZCB0byBtYXAgdGhlIGZkciByZWxhdGl2ZSBpbmRpY2VzIHdoaWNoCi0JICAgICAgIGFwcGVhciBpbiB0aGUgZmlsZSB0byB0aGUgcG9zaXRpb24gbnVtYmVyIHdoaWNoIHdlIGFyZQotCSAgICAgICB1c2luZy4gICovCi0JICAgIHN5bV9iYXNlID0gZmRyLT5pc3ltQmFzZTsKLQkgICAgaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKLQkgICAgICBzeW1fYmFzZSArPQotCQllY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLQotCSAgICAvKiBhdXhfYmFzZSBpcyB0aGUgc3RhcnQgb2YgdGhlIGF1eCBlbnRyaWVzIGZvciB0aGlzIGZpbGU7Ci0JICAgICAgIGFzeW0uaW5kZXggaXMgYW4gb2Zmc2V0IGZyb20gdGhpcy4gICovCi0JICAgIGF1eF9iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eAotCQkJKyBmZHItPmlhdXhCYXNlKTsKLQotCSAgICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXI7IHRoZQotCSAgICAgICBvcmRlciBpcyBpbmRpY2F0ZWQgYnkgYSBiaXQgaW4gdGhlIGZkci4gICovCi0JICAgIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKLQotCSAgICAvKiBUaGlzIHN3aXRjaCBpcyBiYXNpY2FsbHkgZnJvbSBnY2MvbWlwcy10ZHVtcC5jICAqLwotCSAgICBzd2l0Y2ggKGVjb2ZmX2V4dC5hc3ltLnN0KQotCSAgICAgIHsKLQkgICAgICBjYXNlIHN0TmlsOgotCSAgICAgIGNhc2Ugc3RMYWJlbDoKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RmlsZToKLQkgICAgICBjYXNlIHN0QmxvY2s6Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlbGQiKSwKLQkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RFbmQ6Ci0JCWlmIChlY29mZl9leHQuYXN5bS5zYyA9PSBzY1RleHQKLQkJICAgIHx8IGVjb2ZmX2V4dC5hc3ltLnNjID09IHNjSW5mbykKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIiksCi0JCQkgICAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBGaXJzdCBzeW1ib2w6ICVsZCIpLCAKLQkJCSAgICgobG9uZykKLQkJCSAgICAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sCi0JCQkJCSAgICZhdXhfYmFzZVtlY29mZl9leHQuYXN5bS5pbmRleF0pCi0JCQkgICAgICsgc3ltX2Jhc2UpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFByb2M6Ci0JICAgICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0JCWlmIChFQ09GRl9JU19TVEFCICgmZWNvZmZfZXh0LmFzeW0pKQotCQkgIDsKLQkJZWxzZSBpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIpLAotCQkJICAgKChsb25nKQotCQkJICAgIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwKLQkJCQkJICAgJmF1eF9iYXNlW2Vjb2ZmX2V4dC5hc3ltLmluZGV4XSkKLQkJCSAgICAgKyBzeW1fYmFzZSkpLAotCQkJICAgZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCArIDEpKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgTG9jYWwgc3ltYm9sOiAlbGQiKSwKLQkJCSAgICgobG9uZykgaW5keAotCQkJICAgICsgKGxvbmcpIHN5bV9iYXNlCi0JCQkgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCkKLQkJCSAgICAgICAtPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFN0cnVjdDoKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBzdHJ1Y3Q7IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0VW5pb246Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgdW5pb247IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RW51bToKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBlbnVtOyBFbmQrMSBzeW1ib2w6ICVsZCIpLAotCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJaWYgKCEgRUNPRkZfSVNfU1RBQiAoJmVjb2ZmX2V4dC5hc3ltKSkKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIFR5cGU6ICVzIiksCi0JCQkgICBlY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2NzX3NpemU7Ci0gIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKLSAgYXJlbGVudCAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoc2l6ZW9mIChhcmVsZW50KQotCQkJCQkgICAgKiBzZWN0aW9uLT5yZWxvY19jb3VudCkpOwotICBleHRlcm5hbF9yZWxvY19zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgZXh0ZXJuYWxfcmVsb2NzX3NpemUpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IChhcmVsZW50ICopIE5VTEwKLSAgICAgIHx8IGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCi0gICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMCwgcnB0ciA9IGludGVybmFsX3JlbG9jczsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyssIHJwdHIrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50ZXJuOwotCi0gICAgICAoKmJhY2tlbmQtPnN3YXBfcmVsb2NfaW4pIChhYmZkLAotCQkJCSBleHRlcm5hbF9yZWxvY3MgKyBpICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKLQkJCQkgJmludGVybik7Ci0KLSAgICAgIGlmIChpbnRlcm4ucl9leHRlcm4pCi0JewotCSAgLyogcl9zeW1uZHggaXMgYW4gaW5kZXggaW50byB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0JICBCRkRfQVNTRVJUIChpbnRlcm4ucl9zeW1uZHggPj0gMAotCQkgICAgICAmJiAoaW50ZXJuLnJfc3ltbmR4Ci0JCQkgIDwgKGVjb2ZmX2RhdGEgKGFiZmQpCi0JCQkgICAgIC0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpKTsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGludGVybi5yX3N5bW5keDsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW50ZXJuLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fTk9ORQotCSAgICAgICB8fCBpbnRlcm4ucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JewotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIENPTlNUIGNoYXIgKnNlY19uYW1lOwotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogcl9zeW1uZHggaXMgYSBzZWN0aW9uIGtleS4gICovCi0JICBzd2l0Y2ggKGludGVybi5yX3N5bW5keCkKLQkgICAgewotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fVEVYVDogIHNlY19uYW1lID0gIi50ZXh0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUkRBVEE6IHNlY19uYW1lID0gIi5yZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fREFUQTogIHNlY19uYW1lID0gIi5kYXRhIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6IHNlY19uYW1lID0gIi5zZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0JTUzogIHNlY19uYW1lID0gIi5zYnNzIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fQlNTOiAgIHNlY19uYW1lID0gIi5ic3MiOyAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fSU5JVDogIHNlY19uYW1lID0gIi5pbml0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODogIHNlY19uYW1lID0gIi5saXQ4IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUNDogIHNlY19uYW1lID0gIi5saXQ0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fWERBVEE6IHNlY19uYW1lID0gIi54ZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUERBVEE6IHNlY19uYW1lID0gIi5wZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fRklOSTogIHNlY19uYW1lID0gIi5maW5pIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVRBOiAgc2VjX25hbWUgPSAiLmxpdGEiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9SQ09OU1Q6IHNlY19uYW1lID0gIi5yY29uc3QiOyBicmVhazsKLQkgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlY19uYW1lKTsKLQkgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotCi0JICBycHRyLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JfQotCi0gICAgICBycHRyLT5hZGRyZXNzID0gaW50ZXJuLnJfdmFkZHIgLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQotICAgICAgLyogTGV0IHRoZSBiYWNrZW5kIHNlbGVjdCB0aGUgaG93dG8gZmllbGQgYW5kIGRvIGFueSBvdGhlcgotCSByZXF1aXJlZCBwcm9jZXNzaW5nLiAgKi8KLSAgICAgICgqYmFja2VuZC0+YWRqdXN0X3JlbG9jX2luKSAoYWJmZCwgJmludGVybiwgcnB0cik7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCBleHRlcm5hbF9yZWxvY3MpOwotCi0gIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBhIGNhbm9uaWNhbCBsaXN0IG9mIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbjsKLQotICAgICAgLyogVGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgbm90IHRoZSBmaWxlLCBzbyB0YWtlCi0JIHRoZW0gb3V0IG9mIHRoZWlyIGNoYWluIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRhdGEgYXJlYQotCSBwcm92aWRlZC4gICovCi0gICAgICBmb3IgKGNvdW50ID0gMCwgY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQkgICBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgIGNvdW50KyssIGNoYWluID0gY2hhaW4tPm5leHQpCi0JKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgeyAKLSAgICAgIGFyZWxlbnQgKnRibHB0cjsKLQotICAgICAgaWYgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSA9PSBmYWxzZSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0MCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSAgIHdhbnRlZCBsb2NhdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgaWdub3JlX3N5bWJvbHMsIG9mZnNldCwKLQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKippZ25vcmVfc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqcmV0bGluZV9wdHI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcAotICAgID0gJmVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm8gPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgRkRSJ3MuICAqLwotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCBkZWJ1Z19pbmZvKQotICAgICAgfHwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9Ci0JKChzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSkpKTsKLSAgICAgIGlmIChlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBsaW5lX2luZm8gPSBlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0KLSAgcmV0dXJuIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgZGVidWdfaW5mbywKLQkJCQkgZGVidWdfc3dhcCwgbGluZV9pbmZvLCBmaWxlbmFtZV9wdHIsCi0JCQkJIGZ1bmN0aW9ubmFtZV9wdHIsIHJldGxpbmVfcHRyKTsKLX0KLQwKLS8qIENvcHkgcHJpdmF0ZSBCRkQgZGF0YS4gIFRoaXMgaXMgY2FsbGVkIGJ5IG9iamNvcHkgYW5kIHN0cmlwLiAgV2UKLSAgIHVzZSBpdCB0byBjb3B5IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBvbmUgQkZEIHRvIHRoZQotICAgb3RoZXIuICBJdCB3b3VsZCBiZSB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgRUNPRkYKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSG93ZXZlciwgaXQgd291bGQgYmUgYQotICAgbG90IG9mIHdvcmssIGFuZCB0aGVyZSB3b3VsZCBiZSBsaXR0bGUgZ2FpbiAoZ2FzLCBnZGIsIGFuZCBsZAotICAgYWxyZWFkeSBhY2Nlc3MgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB2aWEgdGhlCi0gICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZSwgYW5kIHRoYXQgc3RydWN0dXJlIHdvdWxkIGhhdmUgdG8gYmUKLSAgIHJldGFpbmVkIGluIG9yZGVyIHRvIHN1cHBvcnQgRUNPRkYgZGVidWdnaW5nIGluIE1JUFMgRUxGKS4KLQotICAgVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIEVDT0ZGIGV4dGVybmFsIHN5bWJvbHMgY29tZXMgZnJvbQotICAgdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhpcyBmdW5jdGlvbiBvbmx5IGhhbmRsZXMgdGhlIG90aGVyIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaWluZm8gPSAmZWNvZmZfZGF0YSAoaWJmZCktPmRlYnVnX2luZm87Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvaW5mbyA9ICZlY29mZl9kYXRhIChvYmZkKS0+ZGVidWdfaW5mbzsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGFzeW1ib2wgKipzeW1fcHRyX3B0cjsKLSAgc2l6ZV90IGM7Ci0gIGJvb2xlYW4gbG9jYWw7Ci0KLSAgLyogV2Ugb25seSB3YW50IHRvIGNvcHkgaW5mb3JtYXRpb24gb3ZlciBpZiBib3RoIEJGRCdzIHVzZSBFQ09GRgotICAgICBmb3JtYXQuICAqLwotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENvcHkgdGhlIEdQIHZhbHVlIGFuZCB0aGUgcmVnaXN0ZXIgbWFza3MuICAqLwotICBlY29mZl9kYXRhIChvYmZkKS0+Z3AgPSBlY29mZl9kYXRhIChpYmZkKS0+Z3A7Ci0gIGVjb2ZmX2RhdGEgKG9iZmQpLT5ncHJtYXNrID0gZWNvZmZfZGF0YSAoaWJmZCktPmdwcm1hc2s7Ci0gIGVjb2ZmX2RhdGEgKG9iZmQpLT5mcHJtYXNrID0gZWNvZmZfZGF0YSAoaWJmZCktPmZwcm1hc2s7Ci0gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgZWNvZmZfZGF0YSAob2JmZCktPmNwcm1hc2tbaV0gPSBlY29mZl9kYXRhIChpYmZkKS0+Y3BybWFza1tpXTsKLQotICAvKiBDb3B5IHRoZSB2ZXJzaW9uIHN0YW1wLiAgKi8KLSAgb2luZm8tPnN5bWJvbGljX2hlYWRlci52c3RhbXAgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLnZzdGFtcDsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywgZG9uJ3QgY29weSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgYyA9IGJmZF9nZXRfc3ltY291bnQgKG9iZmQpOwotICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAob2JmZCk7Ci0gIGlmIChjID09IDAgfHwgc3ltX3B0cl9wdHIgPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlIGlmIHRoZXJlIGFyZSBhbnkgbG9jYWwgc3ltYm9scy4gICovCi0gIGxvY2FsID0gZmFsc2U7Ci0gIGZvciAoOyBjID4gMDsgYy0tLCBzeW1fcHRyX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bG9jYWwpCi0JewotCSAgbG9jYWwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobG9jYWwpCi0gICAgewotICAgICAgLyogVGhlcmUgYXJlIHNvbWUgbG9jYWwgc3ltYm9scy4gIFdlIGp1c3QgYnJpbmcgb3ZlciBhbGwgdGhlCi0JIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZJWE1FOiBUaGlzIGlzIG5vdCBxdWl0ZSB0aGUgcmlnaHQKLQkgdGhpbmcgdG8gZG8uICBJZiB0aGUgdXNlciBoYXMgYXNrZWQgdXMgdG8gZGlzY2FyZCBhbGwKLQkgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGVuIHdlIGFyZSBwcm9iYWJseSBnb2luZyB0byB3aW5kIHVwCi0JIGtlZXBpbmcgaXQgYmVjYXVzZSB0aGVyZSB3aWxsIHByb2JhYmx5IGJlIHNvbWUgbG9jYWwgc3ltYm9sCi0JIHdoaWNoIG9iamNvcHkgZGlkIG5vdCBkaXNjYXJkLiAgV2Ugc2hvdWxkIGFjdHVhbGx5IGJyZWFrCi0JIGFwYXJ0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIG9ubHkga2VlcCB0aGF0IHdoaWNoCi0JIGFwcGxpZXMgdG8gdGhlIHN5bWJvbHMgd2Ugd2FudCB0byBrZWVwLiAgKi8KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWxpbmVNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlsaW5lTWF4OwotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5jYkxpbmUgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmNiTGluZTsKLSAgICAgIG9pbmZvLT5saW5lID0gaWluZm8tPmxpbmU7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWRuTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pZG5NYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfZG5yID0gaWluZm8tPmV4dGVybmFsX2RucjsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pcGRNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlwZE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9wZHIgPSBpaW5mby0+ZXh0ZXJuYWxfcGRyOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzeW1NYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzeW1NYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfc3ltID0gaWluZm8tPmV4dGVybmFsX3N5bTsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pb3B0TWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pb3B0TWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX29wdCA9IGlpbmZvLT5leHRlcm5hbF9vcHQ7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWF1eE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWF1eE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9hdXggPSBpaW5mby0+ZXh0ZXJuYWxfYXV4OwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzc01heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaXNzTWF4OwotICAgICAgb2luZm8tPnNzID0gaWluZm8tPnNzOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX2ZkciA9IGlpbmZvLT5leHRlcm5hbF9mZHI7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuY3JmZCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuY3JmZDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9yZmQgPSBpaW5mby0+ZXh0ZXJuYWxfcmZkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSBkaXNjYXJkaW5nIGFsbCB0aGUgbG9jYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgTG9vawotCSB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gRkRSCi0JIG9yIGF1eCBpbmZvcm1hdGlvbi4gICovCi0gICAgICBjID0gYmZkX2dldF9zeW1jb3VudCAob2JmZCk7Ci0gICAgICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAob2JmZCk7Ci0gICAgICBmb3IgKDsgYyA+IDA7IGMtLSwgc3ltX3B0cl9wdHIrKykKLQl7Ci0JICBFWFRSIGVzeW07Ci0KLQkgICgqKGVjb2ZmX2JhY2tlbmQgKG9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luKSkKLQkgICAgKG9iZmQsIGVjb2Zmc3ltYm9sICgqc3ltX3B0cl9wdHIpLT5uYXRpdmUsICZlc3ltKTsKLQkgIGVzeW0uaWZkID0gaWZkTmlsOwotCSAgZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0JICAoKihlY29mZl9iYWNrZW5kIChvYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9vdXQpKQotCSAgICAob2JmZCwgJmVzeW0sIGVjb2Zmc3ltYm9sICgqc3ltX3B0cl9wdHIpLT5uYXRpdmUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZS4gIFRoZSBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIGlzIHN0b3JlZCBpbiB0aGUKLSAgIGJhY2tlbmQgcG9pbnRlci4gIFdlIGFsd2F5cyBzZXQgdGhlIGFyY2hpdGVjdHVyZSBhbnlob3csIHNpbmNlIG1hbnkKLSAgIGNhbGxlcnMgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0gIHJldHVybiBhcmNoID09IGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5hcmNoOwotfQotCi0vKiBHZXQgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1fYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICBpbnQgYzsKLSAgaW50IHJldDsKLQotICBjID0gMDsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgKytjOwotCi0gIHJldCA9IChiZmRfY29mZl9maWxoc3ogKGFiZmQpCi0JICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKQotCSArIGMgKiBiZmRfY29mZl9zY25oc3ogKGFiZmQpKTsKLSAgcmV0dXJuIEJGRF9BTElHTiAocmV0LCAxNik7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkJICAgIG9mZnNldCwgY291bnQpOwotfQotCi0vKiBTb3J0IHNlY3Rpb25zIGJ5IFZNQSwgYnV0IHB1dCBTRUNfQUxMT0Mgc2VjdGlvbnMgZmlyc3QuICBUaGlzIGlzCi0gICBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotZWNvZmZfc29ydF9oZHJzIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci17Ci0gIGNvbnN0IGFzZWN0aW9uICpoZHIxID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMTsKLSAgY29uc3QgYXNlY3Rpb24gKmhkcjIgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcyOwotCi0gIGlmICgoaGRyMS0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgaWYgKChoZHIyLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChoZHIyLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChoZHIxLT52bWEgPCBoZHIyLT52bWEpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChoZHIxLT52bWEgPiBoZHIyLT52bWEpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9uIGZvciBlYWNoIHNlY3Rpb24sIGFuZCBzZXQKLSAgIHJlbG9jX2ZpbGVwb3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIHNvZmFyLCBmaWxlX3NvZmFyOwotICBhc2VjdGlvbiAqKnNvcnRlZF9oZHJzOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZpbGVfcHRyIG9sZF9zb2ZhcjsKLSAgYm9vbGVhbiByZGF0YV9pbl90ZXh0OwotICBib29sZWFuIGZpcnN0X2RhdGEsIGZpcnN0X25vbmFsbG9jOwotICBjb25zdCBiZmRfdm1hIHJvdW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPnJvdW5kOwotCi0gIHNvZmFyID0gX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZmFsc2UpOwotICBmaWxlX3NvZmFyID0gc29mYXI7Ci0KLSAgLyogU29ydCB0aGUgc2VjdGlvbnMgYnkgVk1BLiAgKi8KLSAgc29ydGVkX2hkcnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKGFiZmQtPnNlY3Rpb25fY291bnQKLQkJCQkJICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBpZiAoc29ydGVkX2hkcnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zLCBpID0gMDsKLSAgICAgICBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGkrKykKLSAgICBzb3J0ZWRfaGRyc1tpXSA9IGN1cnJlbnQ7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0KLSAgcXNvcnQgKHNvcnRlZF9oZHJzLCBhYmZkLT5zZWN0aW9uX2NvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLAotCSBlY29mZl9zb3J0X2hkcnMpOwotCi0gIC8qIFNvbWUgdmVyc2lvbnMgb2YgdGhlIE9TRiBsaW5rZXIgcHV0IHRoZSAucmRhdGEgc2VjdGlvbiBpbiB0aGUKLSAgICAgdGV4dCBzZWdtZW50LCBhbmQgc29tZSBkbyBub3QuICAqLwotICByZGF0YV9pbl90ZXh0ID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPnJkYXRhX2luX3RleHQ7Ci0gIGlmIChyZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgY3VycmVudCA9IHNvcnRlZF9oZHJzW2ldOwotCSAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JEQVRBKSA9PSAwKQotCSAgICBicmVhazsKLQkgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkNPTlNUKSAhPSAwKQotCSAgICB7Ci0JICAgICAgcmRhdGFfaW5fdGV4dCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnJkYXRhX2luX3RleHQgPSByZGF0YV9pbl90ZXh0OwotCi0gIGZpcnN0X2RhdGEgPSB0cnVlOwotICBmaXJzdF9ub25hbGxvYyA9IHRydWU7Ci0gIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLQotICAgICAgY3VycmVudCA9IHNvcnRlZF9oZHJzW2ldOwotCi0gICAgICAvKiBGb3IgdGhlIEFscGhhIEVDT0ZGIC5wZGF0YSBzZWN0aW9uIHRoZSBsbm5vcHRyIGZpZWxkIGlzCi0JIHN1cHBvc2VkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgLnBkYXRhIGVudHJpZXMgdGhhdCBhcmUKLQkgcmVhbGx5IGluIHRoZSBzZWN0aW9uLiAgRWFjaCBlbnRyeSBpcyA4IGJ5dGVzLiAgV2Ugc3RvcmUgdGhpcwotCSBhd2F5IGluIGxpbmVfZmlsZXBvcyBiZWZvcmUgaW5jcmVhc2luZyB0aGUgc2VjdGlvbiBzaXplLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9QREFUQSkgPT0gMCkKLQljdXJyZW50LT5saW5lX2ZpbGVwb3MgPSBjdXJyZW50LT5fcmF3X3NpemUgLyA4OwotCi0gICAgICBhbGlnbm1lbnRfcG93ZXIgPSBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgICAgIC8qIE9uIFVsdHJpeCwgdGhlIGRhdGEgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBmaWxlIG11c3QgYmUKLQkgYWxpZ25lZCB0byBhIHBhZ2UgYm91bmRhcnkgd2l0aGluIHRoZSBmaWxlLiAgVGhpcyBkb2VzIG5vdAotCSBhZmZlY3QgdGhlIHNlY3Rpb24gc2l6ZSwgdGhvdWdoLiAgRklYTUU6IERvZXMgdGhpcyB3b3JrIGZvcgotCSBvdGhlciBwbGF0Zm9ybXM/ICBJdCByZXF1aXJlcyBzb21lIG1vZGlmaWNhdGlvbiBmb3IgdGhlCi0JIEFscGhhLCBiZWNhdXNlIC5yZGF0YSBvbiB0aGUgQWxwaGEgZ29lcyB3aXRoIHRoZSB0ZXh0LCBub3QKLQkgdGhlIGRhdGEuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMAotCSAgJiYgISBmaXJzdF9kYXRhCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgJiYgKCEgcmRhdGFfaW5fdGV4dAotCSAgICAgIHx8IHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JEQVRBKSAhPSAwKQotCSAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDAKLQkgICYmIHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JDT05TVCkgIT0gMCkKLQl7Ci0JICBzb2ZhciA9IChzb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaWxlX3NvZmFyID0gKGZpbGVfc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCSAgZmlyc3RfZGF0YSA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQl7Ci0JICAvKiBPbiBJcml4IDQsIHRoZSBsb2NhdGlvbiBvZiBjb250ZW50cyBvZiB0aGUgLmxpYiBzZWN0aW9uCi0JICAgICBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiBpcyBhbHNvIHJvdW5kZWQgdXAgdG8gYQotCSAgICAgcGFnZSBib3VuZGFyeS4gICovCi0KLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoZmlyc3Rfbm9uYWxsb2MKLQkgICAgICAgJiYgKGN1cnJlbnQtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0JICAgICAgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0JewotCSAgLyogU2tpcCB1cCB0byB0aGUgbmV4dCBwYWdlIGZvciBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLCBzdWNoCi0gICAgICAgICAgICAgYXMgdGhlIC5jb21tZW50IHNlY3Rpb24gb24gdGhlIEFscGhhLiAgVGhpcyBsZWF2ZXMgcm9vbQotICAgICAgICAgICAgIGZvciB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLQkgIGZpcnN0X25vbmFsbG9jID0gZmFsc2U7Ci0JICBzb2ZhciA9IChzb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaWxlX3NvZmFyID0gKGZpbGVfc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCX0KLQotICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCi0JIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICAqLwotICAgICAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQlmaWxlX3NvZmFyID0gQkZEX0FMSUdOIChmaWxlX3NvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JewotCSAgc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIHNvZmFyKSAlIHJvdW5kOwotCSAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICAgIGZpbGVfc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIGZpbGVfc29mYXIpICUgcm91bmQ7Ci0JfQotCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCkpICE9IDApCi0JY3VycmVudC0+ZmlsZXBvcyA9IGZpbGVfc29mYXI7Ci0KLSAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCWZpbGVfc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOwotCi0gICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGlzIHNlY3Rpb24gaXMgb2YgdGhlIHJpZ2h0IHNpemUgdG9vICovCi0gICAgICBvbGRfc29mYXIgPSBzb2ZhcjsKLSAgICAgIHNvZmFyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCBhbGlnbm1lbnRfcG93ZXIpOwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JZmlsZV9zb2ZhciA9IEJGRF9BTElHTiAoZmlsZV9zb2ZhciwgMSA8PCBhbGlnbm1lbnRfcG93ZXIpOwotICAgICAgY3VycmVudC0+X3Jhd19zaXplICs9IHNvZmFyIC0gb2xkX3NvZmFyOwotICAgIH0KLQotICBmcmVlIChzb3J0ZWRfaGRycyk7Ci0gIHNvcnRlZF9oZHJzID0gTlVMTDsKLQotICBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvcyA9IGZpbGVfc29mYXI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlbG9jcyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGUKLSAgIG91dHB1dCBmaWxlLCBhcyB3ZWxsIGFzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9saWMgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlCi1lY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9Ci0gICAgZWNvZmZfYmFja2VuZCAoYWJmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGZpbGVfcHRyIHJlbG9jX2Jhc2U7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGZpbGVfcHRyIHN5bV9iYXNlOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlhYm9ydCAoKTsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLSAgCi0gIHJlbG9jX2Jhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvczsKLQotICByZWxvY19zaXplID0gMDsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID09IDApCi0JY3VycmVudC0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zaXplX3R5cGUgcmVsc2l6ZTsKLQotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSByZWxvY19iYXNlOwotCSAgcmVsc2l6ZSA9IGN1cnJlbnQtPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLQkgIHJlbG9jX3NpemUgKz0gcmVsc2l6ZTsKLQkgIHJlbG9jX2Jhc2UgKz0gcmVsc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHN5bV9iYXNlID0gZWNvZmZfZGF0YSAoYWJmZCktPnJlbG9jX2ZpbGVwb3MgKyByZWxvY19zaXplOwotCi0gIC8qIEF0IGxlYXN0IG9uIFVsdHJpeCwgdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBleGVjdXRhYmxlIGZpbGUgbXVzdAotICAgICBiZSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeS4gIEZJWE1FOiBJcyB0aGlzIHRydWUgb24gb3RoZXIKLSAgICAgcGxhdGZvcm1zPyAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICBzeW1fYmFzZSA9ICgoc3ltX2Jhc2UgKyBlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQgLSAxKQotCQkmfiAoZWNvZmZfYmFja2VuZCAoYWJmZCktPnJvdW5kIC0gMSkpOwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9IHN5bV9iYXNlOwotCi0gIHJldHVybiByZWxvY19zaXplOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgLyogVGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QsIGJlY2F1c2UgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGlzCi0gICAgIGdvaW5nIHRvIHNldCBvdXRwdXRfaGFzX2JlZ3VuIHRvIHRydWUuICAqLwotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoISBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSAubGliIHNlY3Rpb24gc3BlY2lhbGx5IHNvIHRoYXQgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgd29yayBvdXQuICBTZWUgY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyBpbiBjb2ZmY29kZS5oLiAgKi8KLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqcmVjLCAqcmVjZW5kOwotCi0gICAgICByZWMgPSAoYmZkX2J5dGUgKikgbG9jYXRpb247Ci0gICAgICByZWNlbmQgPSByZWMgKyBjb3VudDsKLSAgICAgIHdoaWxlIChyZWMgPCByZWNlbmQpCi0JewotCSAgKytzZWN0aW9uLT5sbWE7Ci0JICByZWMgKz0gYmZkX2dldF8zMiAoYWJmZCwgcmVjKSAqIDQ7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChyZWMgPT0gcmVjZW5kKTsKLSAgICB9Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgR1AgdmFsdWUgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5Ci0gICBubG1jb252LiAgKi8KLQotYmZkX3ZtYQotYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICByZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotfQotCi0vKiBTZXQgdGhlIEdQIHZhbHVlIGZvciBhbiBFQ09GRiBmaWxlLiAgVGhpcyBpcyBhIGhvb2sgdXNlZCBieSB0aGUKLSAgIGFzc2VtYmxlci4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwX3ZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgZ3BfdmFsdWU7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gZ3BfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgcmVnaXN0ZXIgbWFza3MgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5Ci0gICB0aGUgYXNzZW1ibGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyAoYWJmZCwgZ3BybWFzaywgZnBybWFzaywgY3BybWFzaykKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKLSAgICAgdW5zaWduZWQgbG9uZyAqY3BybWFzazsKLXsKLSAgZWNvZmZfZGF0YV90eXBlICp0ZGF0YTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHRkYXRhID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIHRkYXRhLT5ncHJtYXNrID0gZ3BybWFzazsKLSAgdGRhdGEtPmZwcm1hc2sgPSBmcHJtYXNrOwotICBpZiAoY3BybWFzayAhPSAodW5zaWduZWQgbG9uZyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCXRkYXRhLT5jcHJtYXNrW2ldID0gY3BybWFza1tpXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBFQ09GRiBFWFRSIGluZm9ybWF0aW9uIGZvciBhbiBleHRlcm5hbCBzeW1ib2wuICBUaGlzIGZ1bmN0aW9uCi0gICBpcyBwYXNzZWQgdG8gYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9nZXRfZXh0ciAoc3ltLCBlc3ltKQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmVzeW07Ci17Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICplY29mZl9zeW1fcHRyOwotICBiZmQgKmlucHV0X2JmZDsKLQotICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGVjb2Zmc3ltYm9sIChzeW0pLT5uYXRpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBpbmNsdWRlIGRlYnVnZ2luZywgbG9jYWwsIG9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMAotCSAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBlc3ltLT5qbXB0YmwgPSAwOwotICAgICAgZXN5bS0+Y29ib2xfbWFpbiA9IDA7Ci0gICAgICBlc3ltLT53ZWFrZXh0ID0gKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMDsKLSAgICAgIGVzeW0tPnJlc2VydmVkID0gMDsKLSAgICAgIGVzeW0tPmlmZCA9IGlmZE5pbDsKLSAgICAgIC8qIEZJWE1FOiB3ZSBjYW4gZG8gYmV0dGVyIHRoYW4gdGhpcyBmb3Igc3QgYW5kIHNjLiAgKi8KLSAgICAgIGVzeW0tPmFzeW0uc3QgPSBzdEdsb2JhbDsKLSAgICAgIGVzeW0tPmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVzeW0tPmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgZXN5bS0+YXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGVjb2ZmX3N5bV9wdHIgPSBlY29mZnN5bWJvbCAoc3ltKTsKLQotICBpZiAoZWNvZmZfc3ltX3B0ci0+bG9jYWwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlucHV0X2JmZCA9IGJmZF9hc3ltYm9sX2JmZCAoc3ltKTsKLSAgKCooZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbikpCi0gICAgKGlucHV0X2JmZCwgZWNvZmZfc3ltX3B0ci0+bmF0aXZlLCBlc3ltKTsKLQotICAvKiBJZiB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIsIHRoZW4gZXN5bSB3aWxsIGJlCi0gICAgIHVuZGVmaW5lZCBidXQgc3ltIHdpbGwgbm90IGJlLiAgR2V0IGEgYmV0dGVyIGNsYXNzIGZvciBzdWNoIGEKLSAgICAgc3ltYm9sLiAgKi8KLSAgaWYgKChlc3ltLT5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0gICAgICAgfHwgZXN5bS0+YXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0gICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICBlc3ltLT5hc3ltLnNjID0gc2NBYnM7Ci0KLSAgLyogQWRqdXN0IHRoZSBGRFIgaW5kZXggZm9yIHRoZSBzeW1ib2wgYnkgdGhhdCB1c2VkIGZvciB0aGUgaW5wdXQKLSAgICAgQkZELiAgKi8KLSAgaWYgKGVzeW0tPmlmZCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWc7Ci0KLSAgICAgIGlucHV0X2RlYnVnID0gJmVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm87Ci0gICAgICBCRkRfQVNTRVJUIChlc3ltLT5pZmQgPCBpbnB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7Ci0gICAgICBpZiAoaW5wdXRfZGVidWctPmlmZG1hcCAhPSAoUkZEVCAqKSBOVUxMKQotCWVzeW0tPmlmZCA9IGlucHV0X2RlYnVnLT5pZmRtYXBbZXN5bS0+aWZkXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZGV4LiAgVGhpcyByb3V0aW5lIGlzIHBhc3NlZCB0bwotICAgYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zZXRfaW5kZXggKHN5bSwgaW5keCkKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci17Ci0gIGVjb2ZmX3NldF9zeW1faW5kZXggKHN5bSwgaW5keCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBFQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX3ZtYSByb3VuZCA9IGJhY2tlbmQtPnJvdW5kOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGZpbGhzeiA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgYW91dHN6ID0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBzY25oc3ogPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2hkcl9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9yZWxvY19zaXplOwotICB2b2lkICgqIGNvbnN0IGFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSkKLSAgICA9IGJhY2tlbmQtPmFkanVzdF9yZWxvY19vdXQ7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9yZWxvY19vdXQ7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWcgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsKLSAgYmZkX3ZtYSB0ZXh0X3N0YXJ0OwotICBib29sZWFuIHNldF90ZXh0X3N0YXJ0OwotICBiZmRfc2l6ZV90eXBlIGRhdGFfc2l6ZTsKLSAgYmZkX3ZtYSBkYXRhX3N0YXJ0OwotICBib29sZWFuIHNldF9kYXRhX3N0YXJ0OwotICBiZmRfc2l6ZV90eXBlIGJzc19zaXplOwotICBQVFIgYnVmZiA9IE5VTEw7Ci0gIFBUUiByZWxvY19idWZmID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgaW50ZXJuYWxfZjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgaW50ZXJuYWxfYTsKLSAgaW50IGk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoZXJlIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NzIHdpbGwgZ28gaW4gdGhlIG91dHB1dAotICAgICBmaWxlLiAgKi8KLSAgcmVsb2Nfc2l6ZSA9IGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpOwotCi0gIGNvdW50ID0gMTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgewotICAgICAgY3VycmVudC0+dGFyZ2V0X2luZGV4ID0gY291bnQ7Ci0gICAgICArK2NvdW50OwotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICB0ZXh0X3NpemUgPSBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCBmYWxzZSk7Ci0gIGVsc2UKLSAgICB0ZXh0X3NpemUgPSAwOwotICB0ZXh0X3N0YXJ0ID0gMDsKLSAgc2V0X3RleHRfc3RhcnQgPSBmYWxzZTsKLSAgZGF0YV9zaXplID0gMDsKLSAgZGF0YV9zdGFydCA9IDA7Ci0gIHNldF9kYXRhX3N0YXJ0ID0gZmFsc2U7Ci0gIGJzc19zaXplID0gMDsKLQotICAvKiBXcml0ZSBzZWN0aW9uIGhlYWRlcnMgdG8gdGhlIGZpbGUuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJ1ZmYgYmlnIGVub3VnaCB0byBob2xkIGEgc2VjdGlvbiBoZWFkZXIsCi0gICAgIGZpbGUgaGVhZGVyLCBvciBhLm91dCBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX3NpemVfdHlwZSBzaXo7Ci0gICAgc2l6ID0gc2NuaHN6OwotICAgIGlmIChzaXogPCBmaWxoc3opCi0gICAgICBzaXogPSBmaWxoc3o7Ci0gICAgaWYgKHNpeiA8IGFvdXRzeikKLSAgICAgIHNpeiA9IGFvdXRzejsKLSAgICBidWZmID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2l6KTsKLSAgICBpZiAoYnVmZiA9PSBOVUxMKQotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIH0KLQotICBpbnRlcm5hbF9mLmZfbnNjbnMgPSAwOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKGZpbGhzeiArIGFvdXRzeiksIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgdm1hOwotCi0gICAgICArK2ludGVybmFsX2YuZl9uc2NuczsKLQotICAgICAgc3RybmNweSAoc2VjdGlvbi5zX25hbWUsIGN1cnJlbnQtPm5hbWUsIHNpemVvZiBzZWN0aW9uLnNfbmFtZSk7Ci0KLSAgICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgY29ycmVjdCBmb3IgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotICAgICAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCk7Ci0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXNlY3Rpb24uc192YWRkciA9IDA7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3ZhZGRyID0gdm1hOwotCi0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSBjdXJyZW50LT5sbWE7Ci0gICAgICBzZWN0aW9uLnNfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyB1bmxvYWRhYmxlIHRoZW4gdGhlIHNjbnB0ciB3aWxsIGJlIDAuICAqLwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpKSA9PSAwKQotCXNlY3Rpb24uc19zY25wdHIgPSAwOwotICAgICAgZWxzZQotCXNlY3Rpb24uc19zY25wdHIgPSBjdXJyZW50LT5maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCi0gICAgICAvKiBGSVhNRTogdGhlIGxubm9wdHIgb2YgdGhlIC5zYnNzIG9yIC5zZGF0YSBzZWN0aW9uIG9mIGFuCi0JIG9iamVjdCBmaWxlIHByb2R1Y2VkIGJ5IHRoZSBhc3NlbWJsZXIgaXMgc3VwcG9zZWQgdG8gcG9pbnQgdG8KLQkgaW5mb3JtYXRpb24gYWJvdXQgaG93IG11Y2ggcm9vbSBpcyByZXF1aXJlZCBieSBvYmplY3RzIG9mCi0JIHZhcmlvdXMgZGlmZmVyZW50IHNpemVzLiAgSSB0aGluayB0aGlzIG9ubHkgbWF0dGVycyBpZiB3ZQotCSB3YW50IHRoZSBsaW5rZXIgdG8gY29tcHV0ZSB0aGUgYmVzdCBzaXplIHRvIHVzZSwgb3IKLQkgc29tZXRoaW5nLiAgSSBkb24ndCBrbm93IHdoYXQgaGFwcGVucyBpZiB0aGUgaW5mb3JtYXRpb24gaXMKLQkgbm90IHByZXNlbnQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSAhPSAwKQotCXNlY3Rpb24uc19sbm5vcHRyID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgQWxwaGEgRUNPRkYgLnBkYXRhIHNlY3Rpb24gdXNlcyB0aGUgbG5ub3B0ciBmaWVsZCB0bwotCSAgICAgaG9sZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24gKGVhY2ggZW50cnkgaXMKLQkgICAgIDggYnl0ZXMpLiAgV2Ugc3RvcmVkIHRoaXMgaW4gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZCBpbgotCSAgICAgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgKi8KLQkgIHNlY3Rpb24uc19sbm5vcHRyID0gY3VycmVudC0+bGluZV9maWxlcG9zOwotCX0KLQotICAgICAgc2VjdGlvbi5zX25yZWxvYyA9IGN1cnJlbnQtPnJlbG9jX2NvdW50OwotICAgICAgc2VjdGlvbi5zX25sbm5vID0gMDsKLSAgICAgIHNlY3Rpb24uc19mbGFncyA9IGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzIChjdXJyZW50LT5uYW1lLAotCQkJCQkJIGN1cnJlbnQtPmZsYWdzKTsKLQotICAgICAgaWYgKGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgKFBUUikgJnNlY3Rpb24sIGJ1ZmYpID09IDAKLQkgIHx8IGJmZF93cml0ZSAoYnVmZiwgMSwgc2NuaHN6LCBhYmZkKSAhPSBzY25oc3opCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9URVhUKSAhPSAwCi0JICB8fCAoKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfUkRBVEEpICE9IDAKLQkgICAgICAmJiBlY29mZl9kYXRhIChhYmZkKS0+cmRhdGFfaW5fdGV4dCkKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EWU5BTUlDKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSUJMSVNUKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SRUxEWU4pICE9IDAKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX0NPTkZMSUMKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RZTlNUUikgIT0gMAotCSAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfRFlOU1lNKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9IQVNIKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9GSU5JKSAhPSAwCi0JICB8fCBzZWN0aW9uLnNfZmxhZ3MgPT0gU1RZUF9SQ09OU1QpCi0JewotCSAgdGV4dF9zaXplICs9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0JICBpZiAoISBzZXRfdGV4dF9zdGFydCB8fCB0ZXh0X3N0YXJ0ID4gdm1hKQotCSAgICB7Ci0JICAgICAgdGV4dF9zdGFydCA9IHZtYTsKLQkgICAgICBzZXRfdGV4dF9zdGFydCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SREFUQSkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EQVRBKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJVEEpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfTElUOCkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSVQ0KSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1NEQVRBKSAhPSAwCi0JICAgICAgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1hEQVRBCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0dPVCkgIT0gMCkKLQl7Ci0JICBkYXRhX3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQkgIGlmICghIHNldF9kYXRhX3N0YXJ0IHx8IGRhdGFfc3RhcnQgPiB2bWEpCi0JICAgIHsKLQkgICAgICBkYXRhX3N0YXJ0ID0gdm1hOwotCSAgICAgIHNldF9kYXRhX3N0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0JTUykgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9TQlNTKSAhPSAwKQotCWJzc19zaXplICs9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0gICAgICBlbHNlIGlmIChzZWN0aW9uLnNfZmxhZ3MgPT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9MSUIpICE9IDAKLQkgICAgICAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfQ09NTUVOVCkKLQkvKiBEbyBub3RoaW5nICovIDsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9CQotCi0gIC8qIFNldCB1cCB0aGUgZmlsZSBoZWFkZXIuICAqLwotCi0gIGludGVybmFsX2YuZl9tYWdpYyA9IGVjb2ZmX2dldF9tYWdpYyAoYWJmZCk7Ci0KLSAgLyogV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeQotICAgICB0aW1lIHlvdSBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtCi0gICAgIHNvcnJ5LiAgVGhpcyBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28KLSAgICAgaXQgY29tcGFyZXMgdGhlIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0KLSAgICAgZ251QGN5Z251cy5jb20uICAqLwotICBpbnRlcm5hbF9mLmZfdGltZGF0ID0gMDsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgRUNPRkYgZl9uc3ltcyBmaWVsZCBpcyBub3QgYWN0dWFsbHkgdGhlIG51bWJlciBvZgotCSBzeW1ib2xzLCBpdCdzIHRoZSBzaXplIG9mIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gICovCi0gICAgICBpbnRlcm5hbF9mLmZfbnN5bXMgPSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX25zeW1zID0gMDsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSAwOwotICAgIH0KLQotICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gYW91dHN6OwotCi0gIGludGVybmFsX2YuZl9mbGFncyA9IEZfTE5OTzsKLSAgaWYgKHJlbG9jX3NpemUgPT0gMCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9SRUxGTEc7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xTWU1TOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRVhFQzsKLQotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXUjsKLSAgZWxzZQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXOwotCi0gIC8qIFNldCB1cCB0aGUgYGBvcHRpb25hbCcnIGhlYWRlci4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIGludGVybmFsX2EubWFnaWMgPSBFQ09GRl9BT1VUX1pNQUdJQzsKLSAgZWxzZQotICAgIGludGVybmFsX2EubWFnaWMgPSBFQ09GRl9BT1VUX09NQUdJQzsKLQotICAvKiBGSVhNRTogSXMgdGhpcyByZWFsbHkgY29ycmVjdD8gICovCi0gIGludGVybmFsX2EudnN0YW1wID0gc3ltaGRyLT52c3RhbXA7Ci0KLSAgLyogQXQgbGVhc3Qgb24gVWx0cml4LCB0aGVzZSBoYXZlIHRvIGJlIHJvdW5kZWQgdG8gcGFnZSBib3VuZGFyaWVzLgotICAgICBGSVhNRTogSXMgdGhpcyB0cnVlIG9uIG90aGVyIHBsYXRmb3Jtcz8gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSAodGV4dF9zaXplICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IHRleHRfc3RhcnQgJn4gKHJvdW5kIC0gMSk7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gKGRhdGFfc2l6ZSArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0gICAgICBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBkYXRhX3N0YXJ0ICZ+IChyb3VuZCAtIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSB0ZXh0X3NpemU7Ci0gICAgICBpbnRlcm5hbF9hLnRleHRfc3RhcnQgPSB0ZXh0X3N0YXJ0OwotICAgICAgaW50ZXJuYWxfYS5kc2l6ZSA9IGRhdGFfc2l6ZTsKLSAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGRhdGFfc3RhcnQ7Ci0gICAgfQotCi0gIC8qIE9uIFVsdHJpeCwgdGhlIGluaXRpYWwgcG9ydGlvbnMgb2YgdGhlIC5zYnNzIGFuZCAuYnNzIHNlZ21lbnRzCi0gICAgIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIHNlY3Rpb24uICBUaGUgYnNpemUgZmllbGQgaW4gdGhlCi0gICAgIG9wdGlvbmFsIGhlYWRlciByZWNvcmRzIGhvdyBtYW55IGJzcyBieXRlcyBhcmUgcmVxdWlyZWQgYmV5b25kCi0gICAgIHRob3NlIGluIHRoZSBkYXRhIHNlY3Rpb24uICBUaGUgdmFsdWUgaXMgbm90IHJvdW5kZWQgdG8gYSBwYWdlCi0gICAgIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGJzc19zaXplIDwgaW50ZXJuYWxfYS5kc2l6ZSAtIGRhdGFfc2l6ZSkKLSAgICBic3Nfc2l6ZSA9IDA7Ci0gIGVsc2UKLSAgICBic3Nfc2l6ZSAtPSBpbnRlcm5hbF9hLmRzaXplIC0gZGF0YV9zaXplOwotICBpbnRlcm5hbF9hLmJzaXplID0gYnNzX3NpemU7Ci0gIGludGVybmFsX2EuYnNzX3N0YXJ0ID0gaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ICsgaW50ZXJuYWxfYS5kc2l6ZTsKLQotICBpbnRlcm5hbF9hLmVudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICBpbnRlcm5hbF9hLmdwX3ZhbHVlID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotCi0gIGludGVybmFsX2EuZ3BybWFzayA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncHJtYXNrOwotICBpbnRlcm5hbF9hLmZwcm1hc2sgPSBlY29mZl9kYXRhIChhYmZkKS0+ZnBybWFzazsKLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICBpbnRlcm5hbF9hLmNwcm1hc2tbaV0gPSBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1tpXTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgYWRqdXN0IHRoZSBoZWFkZXJzIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChiYWNrZW5kLT5hZGp1c3RfaGVhZGVycykKLSAgICB7Ci0gICAgICBpZiAoISAoKmJhY2tlbmQtPmFkanVzdF9oZWFkZXJzKSAoYWJmZCwgJmludGVybmFsX2YsICZpbnRlcm5hbF9hKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIGhlYWRlciBhbmQgdGhlIG9wdGlvbmFsIGhlYWRlci4gICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIChQVFIpICZpbnRlcm5hbF9mLCBidWZmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgZmlsaHN6LCBhYmZkKSAhPSBmaWxoc3opCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2EsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBhb3V0c3osIGFiZmQpICE9IGFvdXRzeikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCi0gICAgIHdyaXRpbmcgb3V0IHRoZSByZWxvY3Mgc28gdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wgaW5kaWNlcy4gIFdlCi0gICAgIGRvbid0IGRvIHRoaXMgaWYgdGhpcyBCRkQgd2FzIGNyZWF0ZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyLAotICAgICBzaW5jZSBpdCB3aWxsIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBzeW1ib2xzIGFuZCByZWxvY3MuICAqLwotICBpZiAoISBlY29mZl9kYXRhIChhYmZkKS0+bGlua2VyKQotICAgIHsKLSAgICAgIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0gICAgICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ID0gZGVidWctPmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotICAgICAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBpZiAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCSAgICAgKCgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCi0JCQkJICAgICAgPyB0cnVlIDogZmFsc2UpLAotCQkJCSAgICAgZWNvZmZfZ2V0X2V4dHIsIGVjb2ZmX3NldF9pbmRleCkKLQkgID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0gICAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLQkgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotCXsKLQkgIGFyZWxlbnQgKipyZWxvY19wdHJfcHRyOwotCSAgYXJlbGVudCAqKnJlbG9jX2VuZDsKLQkgIGNoYXIgKm91dF9wdHI7Ci0KLQkgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgcmVsb2NfYnVmZiA9Ci0JICAgIGJmZF9hbGxvYyAoYWJmZCwgY3VycmVudC0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKTsKLQkgIGlmIChyZWxvY19idWZmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICByZWxvY19wdHJfcHRyID0gY3VycmVudC0+b3JlbG9jYXRpb247Ci0JICByZWxvY19lbmQgPSByZWxvY19wdHJfcHRyICsgY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBvdXRfcHRyID0gKGNoYXIgKikgcmVsb2NfYnVmZjsKLQkgIGZvciAoOwotCSAgICAgICByZWxvY19wdHJfcHRyIDwgcmVsb2NfZW5kOwotCSAgICAgICByZWxvY19wdHJfcHRyKyssIG91dF9wdHIgKz0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSkKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnJlbG9jOwotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW47Ci0JICAKLQkgICAgICBtZW1zZXQgKChQVFIpICZpbiwgMCwgc2l6ZW9mIGluKTsKLQotCSAgICAgIHJlbG9jID0gKnJlbG9jX3B0cl9wdHI7Ci0JICAgICAgc3ltID0gKnJlbG9jLT5zeW1fcHRyX3B0cjsKLQotCSAgICAgIGluLnJfdmFkZHIgPSAocmVsb2MtPmFkZHJlc3MKLQkJCSAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQpKTsKLQkgICAgICBpbi5yX3R5cGUgPSByZWxvYy0+aG93dG8tPnR5cGU7Ci0KLQkgICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JCXsKLQkJICBpbi5yX3N5bW5keCA9IGVjb2ZmX2dldF9zeW1faW5kZXggKCpyZWxvYy0+c3ltX3B0cl9wdHIpOwotCQkgIGluLnJfZXh0ZXJuID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENPTlNUIGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0JTUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9CU1M7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0lOSVQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnhkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9YREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1BEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkNPTlNUOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIGluLnJfZXh0ZXJuID0gMDsKLQkJfQotCi0JICAgICAgKCphZGp1c3RfcmVsb2Nfb3V0KSAoYWJmZCwgcmVsb2MsICZpbik7Ci0KLQkgICAgICAoKnN3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgJmluLCAoUFRSKSBvdXRfcHRyKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnQtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3dyaXRlIChyZWxvY19idWZmLAotCQkJIGV4dGVybmFsX3JlbG9jX3NpemUsIGN1cnJlbnQtPnJlbG9jX2NvdW50LCBhYmZkKQotCSAgICAgICE9IGV4dGVybmFsX3JlbG9jX3NpemUgKiBjdXJyZW50LT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0JICByZWxvY19idWZmID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0JewotCSAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKGJmZF9lY29mZl93cml0ZV9kZWJ1ZyAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCSAgICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zKQotCSAgICAgID09IGZhbHNlKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSAuYnNzIHNlY3Rpb24gb2YgYSBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZSBtdXN0IHJlY2VpdmUgYW4KLSAgICAgZW50aXJlIHBhZ2UuICBJZiB0aGVyZSBhcmUgc3ltYm9scywgdGhlIHN5bWJvbHMgd2lsbCBzdGFydCBvbiB0aGUKLSAgICAgbmV4dCBwYWdlLiAgSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIG11c3QgZmlsbCBvdXQgdGhlIHBhZ2UgYnkKLSAgICAgaGFuZC4gICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDAKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zIC0gMSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgPT0gMCkKLQljID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2J1ZmYgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX2J1ZmYgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEFyY2hpdmUgaGFuZGxpbmcuICBFQ09GRiB1c2VzIHdoYXQgYXBwZWFycyB0byBiZSBhIHVuaXF1ZSB0eXBlIG9mCi0gICBhcmNoaXZlIGhlYWRlciAoYXJtYXApLiAgVGhlIGJ5dGUgb3JkZXJpbmcgb2YgdGhlIGFybWFwIGFuZCB0aGUKLSAgIGNvbnRlbnRzIGFyZSBlbmNvZGVkIGluIHRoZSBuYW1lIG9mIHRoZSBhcm1hcCBpdHNlbGYuICBBdCBsZWFzdCBmb3IKLSAgIG5vdywgd2Ugb25seSBzdXBwb3J0IGFyY2hpdmVzIHdpdGggdGhlIHNhbWUgYnl0ZSBvcmRlcmluZyBpbiB0aGUKLSAgIGFybWFwIGFuZCB0aGUgY29udGVudHMuCi0KLSAgIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIGluIHRoZSBhcm1hcCBhcmUgdGhlIG51bWJlciBvZiBzeW1ib2wKLSAgIGRlZmluaXRpb25zLiAgVGhpcyBpcyBhbHdheXMgYSBwb3dlciBvZiB0d28uCi0KLSAgIFRoaXMgaXMgZm9sbG93ZWQgYnkgdGhlIHN5bWJvbCBkZWZpbml0aW9ucy4gIEVhY2ggc3ltYm9sIGRlZmluaXRpb24KLSAgIG9jY3VwaWVzIDggYnl0ZXMuICBUaGUgZmlyc3QgZm91ciBieXRlcyBhcmUgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgc3RhcnQgb2YgdGhlIGFybWFwIHN0cmluZ3MgdG8gdGhlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgbmFtaW5nCi0gICB0aGlzIHN5bWJvbC4gIFRoZSBzZWNvbmQgZm91ciBieXRlcyBhcmUgdGhlIGZpbGUgb2Zmc2V0IHRvIHRoZQotICAgYXJjaGl2ZSBtZW1iZXIgd2hpY2ggZGVmaW5lcyB0aGlzIHN5bWJvbC4gIElmIHRoZSBzZWNvbmQgZm91ciBieXRlcwotICAgYXJlIDAsIHRoZW4gdGhpcyBpcyBub3QgYWN0dWFsbHkgYSBzeW1ib2wgZGVmaW5pdGlvbiwgYW5kIGl0IHNob3VsZAotICAgYmUgaWdub3JlZC4KLQotICAgVGhlIHN5bWJvbHMgYXJlIGhhc2hlZCBpbnRvIHRoZSBhcm1hcCB3aXRoIGEgY2xvc2VkIGhhc2hpbmcgc2NoZW1lLgotICAgU2VlIHRoZSBmdW5jdGlvbnMgYmVsb3cgZm9yIHRoZSBkZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0uCi0KLSAgIEFmdGVyIHRoZSBzeW1ib2wgZGVmaW5pdGlvbnMgY29tZXMgZm91ciBieXRlcyBob2xkaW5nIHRoZSBzaXplIG9mCi0gICB0aGUgc3RyaW5nIHRhYmxlLCBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIHRhYmxlIGl0c2VsZi4gICovCi0KLS8qIFRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgaGVhZGVycyBsb29rcyBsaWtlIHRoaXM6Ci0gICBfX19fX19fX19fRVtCTF1FW0JMXV8gKHdpdGggYSB0cmFpbGluZyBzcGFjZSkuCi0gICBUaGUgdHJhaWxpbmcgc3BhY2UgaXMgY2hhbmdlZCB0byBhbiBYIGlmIHRoZSBhcmNoaXZlIGlzIGNoYW5nZWQgdG8KLSAgIGluZGljYXRlIHRoYXQgdGhlIGFybWFwIGlzIG91dCBvZiBkYXRlLgotCi0gICBUaGUgQWxwaGEgc2VlbXMgdG8gdXNlIF9fX19fX19fNjRFW0JMXUVbQkxdXy4gICovCi0KLSNkZWZpbmUgQVJNQVBfQklHX0VORElBTiAnQicKLSNkZWZpbmUgQVJNQVBfTElUVExFX0VORElBTiAnTCcKLSNkZWZpbmUgQVJNQVBfTUFSS0VSICdFJwotI2RlZmluZSBBUk1BUF9TVEFSVF9MRU5HVEggMTAKLSNkZWZpbmUgQVJNQVBfSEVBREVSX01BUktFUl9JTkRFWCAxMAotI2RlZmluZSBBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYIDExCi0jZGVmaW5lIEFSTUFQX09CSkVDVF9NQVJLRVJfSU5ERVggMTIKLSNkZWZpbmUgQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWCAxMwotI2RlZmluZSBBUk1BUF9FTkRfSU5ERVggMTQKLSNkZWZpbmUgQVJNQVBfRU5EICJfICIKLQotLyogVGhpcyBpcyBhIG1hZ2ljIG51bWJlciB1c2VkIGluIHRoZSBoYXNoaW5nIGFsZ29yaXRobS4gICovCi0jZGVmaW5lIEFSTUFQX0hBU0hfTUFHSUMgMHg5ZGQ2OGFiNQotCi0vKiBUaGlzIHJldHVybnMgdGhlIGhhc2ggdmFsdWUgdG8gdXNlIGZvciBhIHN0cmluZy4gIEl0IGFsc28gc2V0cwotICAgKlJFSEFTSCB0byB0aGUgcmVoYXNoIGFkanVzdG1lbnQgaWYgdGhlIGZpcnN0IHNsb3QgaXMgdGFrZW4uICBTSVpFCi0gICBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIGFuZCBITE9HIGlzIHRoZSBsb2cKLSAgIGJhc2UgMiBvZiBTSVpFLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZWNvZmZfYXJtYXBfaGFzaCAocywgcmVoYXNoLCBzaXplLCBobG9nKQotICAgICBDT05TVCBjaGFyICpzOwotICAgICB1bnNpZ25lZCBpbnQgKnJlaGFzaDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHVuc2lnbmVkIGludCBobG9nOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoaGxvZyA9PSAwKQotICAgIHJldHVybiAwOwotICBoYXNoID0gKnMrKzsKLSAgd2hpbGUgKCpzICE9ICdcMCcpCi0gICAgaGFzaCA9ICgoaGFzaCA+PiAyNykgfCAoaGFzaCA8PCA1KSkgKyAqcysrOwotICBoYXNoICo9IEFSTUFQX0hBU0hfTUFHSUM7Ci0gICpyZWhhc2ggPSAoaGFzaCAmIChzaXplIC0gMSkpIHwgMTsKLSAgcmV0dXJuIGhhc2ggPj4gKDMyIC0gaGxvZyk7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGFybWFwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgcGFyc2VkX3NpemU7Ci0gIGNoYXIgKnJhd19hcm1hcDsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBjaGFyICpyYXdfcHRyOwotICBzdHJ1Y3Qgc3ltZGVmICpzeW1kZWZfcHRyOwotICBjaGFyICpzdHJpbmdiYXNlOwotICAKLSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBlbGVtZW50LiAgKi8KLSAgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotICBpZiAoaSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJcml4IDQuMC41RiBhcHBhcmVudGx5IGNhbiB1c2UgZWl0aGVyIGFuIEVDT0ZGIGFybWFwIG9yIGEKLSAgICAgc3RhbmRhcmQgQ09GRiBhcm1hcC4gIFdlIGNvdWxkIG1vdmUgdGhlIEVDT0ZGIGFybWFwIHN0dWZmIGludG8KLSAgICAgYmZkX3NsdXJwX2FybWFwLCBidXQgdGhhdCBzZWVtcyBpbmFwcHJvcHJpYXRlIHNpbmNlIG5vIG90aGVyCi0gICAgIHRhcmdldCB1c2VzIHRoaXMgZm9ybWF0LiAgSW5zdGVhZCwgd2UgY2hlY2sgZGlyZWN0bHkgZm9yIGEgQ09GRgotICAgICBhcm1hcC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKLSAgICByZXR1cm4gYmZkX3NsdXJwX2FybWFwIChhYmZkKTsKLQotICAvKiBTZWUgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJtYXAuICAqLwotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5hcm1hcF9zdGFydCwKLQkgICAgICAgQVJNQVBfU1RBUlRfTEVOR1RIKSAhPSAwCi0gICAgICB8fCBuZXh0bmFtZVtBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYXSAhPSBBUk1BUF9NQVJLRVIKLSAgICAgIHx8IChuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9CSUdfRU5ESUFOCi0JICAmJiBuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9MSVRUTEVfRU5ESUFOKQotICAgICAgfHwgbmV4dG5hbWVbQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWF0gIT0gQVJNQVBfTUFSS0VSCi0gICAgICB8fCAobmV4dG5hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gIT0gQVJNQVBfQklHX0VORElBTgotCSAgJiYgbmV4dG5hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gIT0gQVJNQVBfTElUVExFX0VORElBTikKLSAgICAgIHx8IHN0cm5jbXAgKG5leHRuYW1lICsgQVJNQVBfRU5EX0lOREVYLAotCQkgIEFSTUFQX0VORCwgc2l6ZW9mIEFSTUFQX0VORCAtIDEpICE9IDApCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGJ5dGUgb3JkZXJpbmcuICAqLwotICBpZiAoKChuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSA9PSBBUk1BUF9CSUdfRU5ESUFOKQotICAgICAgIF4gKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpKQotICAgICAgfHwgKChuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSA9PSBBUk1BUF9CSUdfRU5ESUFOKQotCSAgXiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIGFybWFwLiAgKi8KLSAgYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gKHN0cnVjdCBhcmVsdGRhdGEgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLSAgICAKLSAgcmF3X2FybWFwID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBwYXJzZWRfc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gKGNoYXIgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBwYXJzZWRfc2l6ZSwgYWJmZCkgIT0gcGFyc2VkX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gIGFyZGF0YS0+dGRhdGEgPSAoUFRSKSByYXdfYXJtYXA7Ci0KLSAgY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSAwOwotICBhcmRhdGEtPmNhY2hlID0gKHN0cnVjdCBhcl9jYWNoZSAqKSBOVUxMOwotCi0gIC8qIFRoaXMgY29kZSB1c2VkIHRvIG92ZXJsYXkgdGhlIHN5bWRlZnMgb3ZlciB0aGUgcmF3IGFyY2hpdmUgZGF0YSwKLSAgICAgYnV0IHRoYXQgZG9lc24ndCB3b3JrIG9uIGEgNjQgYml0IGhvc3QuICAqLwotCi0gIHN0cmluZ2Jhc2UgPSByYXdfYXJtYXAgKyBjb3VudCAqIDggKyA4OwotCi0jaWZkZWYgQ0hFQ0tfQVJNQVBfSEFTSAotICB7Ci0gICAgdW5zaWduZWQgaW50IGhsb2c7Ci0KLSAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBJIGhhdmUgdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHJpZ2h0IGJ5IG1ha2luZwotICAgICAgIHN1cmUgdGhhdCBldmVyeSBzeW1ib2wgY2FuIGJlIGxvb2tlZCB1cCBzdWNjZXNzZnVsbHkuICAqLwotICAgIGhsb2cgPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSA8PD0gMSkKLSAgICAgIGhsb2crKzsKLSAgICBCRkRfQVNTRVJUIChpID09IGNvdW50KTsKLQotICAgIHJhd19wdHIgPSByYXdfYXJtYXAgKyA0OwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IG5hbWVfb2Zmc2V0LCBmaWxlX29mZnNldDsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoLCBzcmNoOwotICAgICAgCi0JbmFtZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIHJhd19wdHIpOwotCWZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAocmF3X3B0ciArIDQpKTsKLQlpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQkgIGNvbnRpbnVlOwotCWhhc2ggPSBlY29mZl9hcm1hcF9oYXNoIChzdHJpbmdiYXNlICsgbmFtZV9vZmZzZXQsICZyZWhhc2gsIGNvdW50LAotCQkJCSBobG9nKTsKLQlpZiAoaGFzaCA9PSBpKQotCSAgY29udGludWU7Ci0KLQkvKiBTZWUgaWYgd2UgY2FuIHJlaGFzaCB0byB0aGlzIGxvY2F0aW9uLiAgKi8KLQlmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoY291bnQgLSAxKTsKLQkgICAgIHNyY2ggIT0gaGFzaCAmJiBzcmNoICE9IGk7Ci0JICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGNvdW50IC0gMSkpCi0JICBCRkRfQVNTRVJUIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfYXJtYXAgKyA4ICsgc3JjaCAqIDgpKQotCQkgICAgICAhPSAwKTsKLQlCRkRfQVNTRVJUIChzcmNoID09IGkpOwotICAgICAgfQotICB9Ci0KLSNlbmRpZiAvKiBDSEVDS19BUk1BUF9IQVNIICovCi0KLSAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19wdHIgKyA0KSkgIT0gMCkKLSAgICAgICsrYXJkYXRhLT5zeW1kZWZfY291bnQ7Ci0KLSAgc3ltZGVmX3B0ciA9ICgoc3RydWN0IHN5bWRlZiAqKQotCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkgICBhcmRhdGEtPnN5bWRlZl9jb3VudCAqIHNpemVvZiAoc3RydWN0IHN5bWRlZikpKTsKLSAgaWYgKCFzeW1kZWZfcHRyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIHN5bWRlZl9wdHI7Ci0KLSAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5hbWVfb2Zmc2V0LCBmaWxlX29mZnNldDsKLQotICAgICAgZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfcHRyICsgNCkpOwotICAgICAgaWYgKGZpbGVfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0gICAgICBuYW1lX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X3B0cik7Ci0gICAgICBzeW1kZWZfcHRyLT5zLm5hbWUgPSBzdHJpbmdiYXNlICsgbmFtZV9vZmZzZXQ7Ci0gICAgICBzeW1kZWZfcHRyLT5maWxlX29mZnNldCA9IGZpbGVfb2Zmc2V0OwotICAgICAgKytzeW1kZWZfcHRyOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuICAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyAlIDI7Ci0KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGFybWFwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICB1bnNpZ25lZCBpbnQgaGFzaHNpemUsIGhhc2hsb2c7Ci0gIHVuc2lnbmVkIGludCBzeW1kZWZzaXplOwotICBpbnQgcGFkaXQ7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZTsKLSAgZmlsZV9wdHIgZmlyc3RyZWFsOwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIGJmZF9ieXRlICpoYXNodGFibGU7Ci0gIGJmZCAqY3VycmVudDsKLSAgYmZkICpsYXN0X2VsdDsKLQotICAvKiBVbHRyaXggYXBwZWFycyB0byB1c2UgYXMgYSBoYXNoIHRhYmxlIHNpemUgdGhlIGxlYXN0IHBvd2VyIG9mIHR3bwotICAgICBncmVhdGVyIHRoYW4gdHdpY2UgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLSAgZm9yIChoYXNobG9nID0gMDsgKCh1bnNpZ25lZCBpbnQpIDEgPDwgaGFzaGxvZykgPD0gMiAqIG9ybF9jb3VudDsgaGFzaGxvZysrKQotICAgIDsKLSAgaGFzaHNpemUgPSAxIDw8IGhhc2hsb2c7Ci0KLSAgc3ltZGVmc2l6ZSA9IGhhc2hzaXplICogODsKLSAgcGFkaXQgPSBzdHJpZHggJSAyOwotICBzdHJpbmdzaXplID0gc3RyaWR4ICsgcGFkaXQ7Ci0KLSAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHN5bWRlZnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLwotICBtYXBzaXplID0gc3ltZGVmc2l6ZSArIHN0cmluZ3NpemUgKyA4OwotCi0gIGZpcnN0cmVhbCA9IFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBtYXBzaXplICsgZWxlbmd0aDsKLQotICBtZW1zZXQgKChQVFIpICZoZHIsIDAsIHNpemVvZiBoZHIpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBFQ09GRiBhcm1hcCBuYW1lLiAgKi8KLSAgc3RyY3B5IChoZHIuYXJfbmFtZSwgZWNvZmZfYmFja2VuZCAoYWJmZCktPmFybWFwX3N0YXJ0KTsKLSAgaGRyLmFyX25hbWVbQVJNQVBfSEVBREVSX01BUktFUl9JTkRFWF0gPSBBUk1BUF9NQVJLRVI7Ci0gIGhkci5hcl9uYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdID0KLSAgICAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKQotICAgICA/IEFSTUFQX0JJR19FTkRJQU4KLSAgICAgOiBBUk1BUF9MSVRUTEVfRU5ESUFOKTsKLSAgaGRyLmFyX25hbWVbQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWF0gPSBBUk1BUF9NQVJLRVI7Ci0gIGhkci5hcl9uYW1lW0FSTUFQX09CSkVDVF9FTkRJQU5fSU5ERVhdID0KLSAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkgPyBBUk1BUF9CSUdfRU5ESUFOIDogQVJNQVBfTElUVExFX0VORElBTjsKLSAgbWVtY3B5IChoZHIuYXJfbmFtZSArIEFSTUFQX0VORF9JTkRFWCwgQVJNQVBfRU5ELCBzaXplb2YgQVJNQVBfRU5EIC0gMSk7Ci0KLSAgLyogV3JpdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgdG8gYmUganVzdCBhIGxpdHRsZSBiaXQKLSAgICAgbGF0ZXIgdGhhbiB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaWxlLCBvdGhlcndpc2UgdGhlIGxpbmtlciB3aWxsCi0gICAgIGNvbXBsYWluIHRoYXQgdGhlIGluZGV4IGlzIG91dCBvZiBkYXRlLiAgQWN0dWFsbHksIHRoZSBVbHRyaXgKLSAgICAgbGlua2VyIGp1c3QgY2hlY2tzIHRoZSBhcmNoaXZlIG5hbWU7IHRoZSBHTlUgbGlua2VyIG1heSBjaGVjayB0aGUKLSAgICAgZGF0ZS4gICovCi0gIHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmc3RhdGJ1Zik7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIChzdGF0YnVmLnN0X210aW1lICsgNjApKTsKLQotICAvKiBUaGUgREVDc3RhdGlvbiB1c2VzIHplcm9lcyBmb3IgdGhlIHVpZCwgZ2lkIGFuZCBtb2RlIG9mIHRoZQotICAgICBhcm1hcC4gICovCi0gIGhkci5hcl91aWRbMF0gPSAnMCc7Ci0gIGhkci5hcl9naWRbMF0gPSAnMCc7Ci0jaWYgMAotICBoZHIuYXJfbW9kZVswXSA9ICcwJzsKLSNlbHNlCi0gIC8qIEJ1aWxkaW5nIGdjYyBlbmRzIHVwIGV4dHJhY3RpbmcgdGhlIGFybWFwIGFzIGEgZmlsZSAtIHR3aWNlLiAqLwotICBoZHIuYXJfbW9kZVswXSA9ICc2JzsKLSAgaGRyLmFyX21vZGVbMV0gPSAnNCc7Ci0gIGhkci5hcl9tb2RlWzJdID0gJzQnOwotI2VuZGlmCi0KLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotCi0gIGhkci5hcl9mbWFnWzBdID0gJ2AnOwotICBoZHIuYXJfZm1hZ1sxXSA9ICdcMDEyJzsKLQotICAvKiBUdXJuIGFsbCBudWxsIGJ5dGVzIGluIHRoZSBoZWFkZXIgaW50byBzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgaWYgKCgoY2hhciAqKSgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgKCgoY2hhciAqKSgmaGRyKSlbaV0pID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBoYXNoc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaGFzaHRhYmxlID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHN5bWRlZnNpemUpOwotICBpZiAoIWhhc2h0YWJsZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY3VycmVudCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgbGFzdF9lbHQgPSBjdXJyZW50OwotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKLQotICAgICAgLyogQWR2YW5jZSBmaXJzdHJlYWwgdG8gdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhpcyBhcmNoaXZlCi0JIGVsZW1lbnQuICAqLwotICAgICAgaWYgKCgoYmZkICopIG1hcFtpXS5wb3MpICE9IGxhc3RfZWx0KQotCXsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBmaXJzdHJlYWwgKz0gYXJlbHRfc2l6ZSAoY3VycmVudCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCSAgICAgIGZpcnN0cmVhbCArPSBmaXJzdHJlYWwgJSAyOwotCSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIG1hcFtpXS5wb3MpOwotCX0KLQotICAgICAgbGFzdF9lbHQgPSBjdXJyZW50OwotCi0gICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoKm1hcFtpXS5uYW1lLCAmcmVoYXNoLCBoYXNoc2l6ZSwgaGFzaGxvZyk7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKGhhc2ggKiA4KSArIDQpKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBzcmNoOwotCi0JICAvKiBUaGUgZGVzaXJlZCBzbG90IGlzIGFscmVhZHkgdGFrZW4uICAqLwotCSAgZm9yIChzcmNoID0gKGhhc2ggKyByZWhhc2gpICYgKGhhc2hzaXplIC0gMSk7Ci0JICAgICAgIHNyY2ggIT0gaGFzaDsKLQkgICAgICAgc3JjaCA9IChzcmNoICsgcmVoYXNoKSAmIChoYXNoc2l6ZSAtIDEpKQotCSAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpKSA9PSAwKQotCSAgICAgIGJyZWFrOwotCi0JICBCRkRfQVNTRVJUIChzcmNoICE9IGhhc2gpOwotCi0JICBoYXNoID0gc3JjaDsKLQl9Ci0JCi0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBtYXBbaV0ubmFtaWR4LAotCQkgICAgKFBUUikgKGhhc2h0YWJsZSArIGhhc2ggKiA4KSk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBmaXJzdHJlYWwsCi0JCSAgICAoUFRSKSAoaGFzaHRhYmxlICsgaGFzaCAqIDggKyA0KSk7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2h0YWJsZSwgMSwgc3ltZGVmc2l6ZSwgYWJmZCkgIT0gc3ltZGVmc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGhhc2h0YWJsZSk7Ci0KLSAgLyogTm93IHdyaXRlIHRoZSBzdHJpbmdzLiAgKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3RyaW5nc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoKm1hcFtpXS5uYW1lKSArIDE7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoKm1hcFtpXS5uYW1lKSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBERUNzdGF0aW9uIGFyIHdlIHVzZSBhIG51bGwuICAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgdGhpcyBCRkQgaXMgYW4gYXJjaGl2ZS4gIElmIGl0IGlzLCByZWFkIGluIHRoZSBhcm1hcAotICAgYW5kIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1fYmZkX2Vjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKLSAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKLQotICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQotICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YKLSAgICAgYXNzaWdubWVudC4gICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9Ci0gICAgKHN0cnVjdCBhcnRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKTsKLQotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEwpCi0gICAgewotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotICAgIH0KLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gU0FSTUFHOwotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotICAKLSAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpID09IGZhbHNlCi0gICAgICB8fCBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmQgKmZpcnN0OwotCi0gICAgICAvKiBUaGlzIGFyY2hpdmUgaGFzIGEgbWFwLCBzbyB3ZSBtYXkgcHJlc3VtZSB0aGF0IHRoZSBjb250ZW50cwotCSBhcmUgb2JqZWN0IGZpbGVzLiAgTWFrZSBzdXJlIHRoYXQgaWYgdGhlIGZpcnN0IGZpbGUgaW4gdGhlCi0JIGFyY2hpdmUgY2FuIGJlIHJlY29nbml6ZWQgYXMgYW4gb2JqZWN0IGZpbGUsIGl0IGlzIGZvciB0aGlzCi0JIHRhcmdldC4gIElmIG5vdCwgYXNzdW1lIHRoYXQgdGhpcyBpcyB0aGUgd3JvbmcgZm9ybWF0LiAgSWYKLQkgdGhlIGZpcnN0IGZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlLCBzb21lYm9keSBpcyBkb2luZwotCSBzb21ldGhpbmcgd2VpcmQsIGFuZCB3ZSBwZXJtaXQgaXQgc28gdGhhdCBhciAtdCB3aWxsIHdvcmsuICAqLwotCi0gICAgICBmaXJzdCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgICBpZiAoZmlyc3QgIT0gTlVMTCkKLQl7Ci0JICBib29sZWFuIGZhaWw7Ci0KLQkgIGZpcnN0LT50YXJnZXRfZGVmYXVsdGVkID0gZmFsc2U7Ci0JICBmYWlsID0gZmFsc2U7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlyc3QsIGJmZF9vYmplY3QpCi0JICAgICAgJiYgZmlyc3QtPnh2ZWMgIT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGZpcnN0KTsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotCSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgLyogV2Ugb3VnaHQgdG8gY2xvc2UgZmlyc3QgaGVyZSwgYnV0IHdlIGNhbid0LCBiZWNhdXNlIHdlCi0gICAgICAgICAgICAgaGF2ZSBubyB3YXkgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFyY2hpdmUgY2FjaGUuICBGSVhNRS4gICovCi0JfQotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQwKLS8qIEVDT0ZGIGxpbmtlciBjb2RlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWNvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgUFRSLCBjaGFyICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT5hYmZkID0gTlVMTDsKLSAgICAgIHJldC0+d3JpdHRlbiA9IDA7Ci0gICAgICByZXQtPnNtYWxsID0gMDsKLSAgICB9Ci0gIG1lbXNldCAoKFBUUikgJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIHJldC0+ZXN5bSk7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBFQ09GRiBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgZWNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEdpdmVuIGFuIEVDT0ZGIEJGRCwgYWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGFzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlIGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLgotICAgVGhpcyBsb29rcyB0aHJvdWdoIHRoZSB1bmRlZmluZWQgc3ltYm9scywgbG9va3MgZWFjaCBvbmUgdXAgaW4gdGhlCi0gICBhcmNoaXZlIGhhc2ggdGFibGUsIGFuZCBhZGRzIGFueSBhc3NvY2lhdGVkIG9iamVjdCBmaWxlLiAgV2UgZG8gbm90Ci0gICB1c2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyBiZWNhdXNlIEVDT0ZGIGFyY2hpdmVzCi0gICBhbHJlYWR5IGhhdmUgYSBoYXNoIHRhYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8gY29uc3RydWN0Ci0gICBhbm90aGVyIG9uZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9ieXRlICpyYXdfYXJtYXA7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqcHVuZGVmOwotICB1bnNpZ25lZCBpbnQgYXJtYXBfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBhcm1hcF9sb2c7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBiZmRfYnl0ZSAqaGFzaHRhYmxlOwotICBjb25zdCBjaGFyICpzdHJpbmdiYXNlOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSByYXcgZGF0YSBmb3IgdGhpcyBhcmNoaXZlLCBhcyBjYW4gaGFwcGVuIG9uCi0gICAgIElyaXggNC4wLjVGLCB3ZSBjYWxsIHRoZSBnZW5lcmljIHJvdXRpbmUuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9yZSBjbGV2ZXIgYWJvdXQgdGhpcywgc2luY2Ugc29tZWRheSB0ZGF0YQotICAgICBtYXkgZ2V0IHRvIHNvbWV0aGluZyBmb3IgYSBnZW5lcmljIGFyY2hpdmUuICAqLwotICByYXdfYXJtYXAgPSAoY29uc3QgYmZkX2J5dGUgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhOwotICBpZiAocmF3X2FybWFwID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHJldHVybiAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCSAgICAoYWJmZCwgaW5mbywgZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKLQotICBhcm1hcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwKTsKLQotICBhcm1hcF9sb2cgPSAwOwotICBmb3IgKGkgPSAxOyBpIDwgYXJtYXBfY291bnQ7IGkgPDw9IDEpCi0gICAgYXJtYXBfbG9nKys7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gYXJtYXBfY291bnQpOwotCi0gIGhhc2h0YWJsZSA9IHJhd19hcm1hcCArIDQ7Ci0gIHN0cmluZ2Jhc2UgPSAoY29uc3QgY2hhciAqKSByYXdfYXJtYXAgKyBhcm1hcF9jb3VudCAqIDggKyA4OwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scy4gICovCi0gIHB1bmRlZiA9ICZpbmZvLT5oYXNoLT51bmRlZnM7Ci0gIHdoaWxlICgqcHVuZGVmICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKLSAgICAgIHVuc2lnbmVkIGludCBmaWxlX29mZnNldDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmQgKmVsZW1lbnQ7Ci0KLSAgICAgIGggPSAqcHVuZGVmOwotCi0gICAgICAvKiBXaGVuIGEgc3ltYm9sIGlzIGRlZmluZWQsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20KLQkgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgLyogUmVtb3ZlIHRoaXMgZW50cnkgZnJvbSB0aGUgbGlzdCwgZm9yIGdlbmVyYWwgY2xlYW5saW5lc3MKLQkgICAgIGFuZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGxpc3QgYWdhaW4KLQkgICAgIGlmIHdlIHNlYXJjaCBhbnkgbW9yZSBsaWJyYXJpZXMuICBXZSBjYW4ndCByZW1vdmUgdGhlCi0JICAgICBlbnRyeSBpZiBpdCBpcyB0aGUgdGFpbCwgYmVjYXVzZSB0aGF0IHdvdWxkIGxvc2UgYW55Ci0JICAgICBlbnRyaWVzIHdlIGFkZCB0byB0aGUgbGlzdCBsYXRlciBvbi4gICovCi0JICBpZiAoKnB1bmRlZiAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKLQkgICAgKnB1bmRlZiA9ICgqcHVuZGVmKS0+bmV4dDsKLQkgIGVsc2UKLQkgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTmF0aXZlIEVDT0ZGIGxpbmtlcnMgZG8gbm90IHB1bGwgaW4gYXJjaGl2ZSBlbGVtZW50cyBtZXJlbHkKLQkgdG8gc2F0aXNmeSBjb21tb24gZGVmaW5pdGlvbnMsIHNvIG5laXRoZXIgZG8gd2UuICBXZSBsZWF2ZQotCSB0aGVtIG9uIHRoZSBsaXN0LCB0aG91Z2gsIGluIGNhc2Ugd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBzb21lCi0JIG90aGVyIG9iamVjdCBmb3JtYXQuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0gICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoaC0+cm9vdC5zdHJpbmcsICZyZWhhc2gsIGFybWFwX2NvdW50LAotCQkJICAgICAgIGFybWFwX2xvZyk7Ci0KLSAgICAgIGZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoaGFzaCAqIDgpICsgNCk7Ci0gICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQl7Ci0JICAvKiBOb3RoaW5nIGluIHRoaXMgc2xvdC4gICovCi0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKGhhc2ggKiA4KSk7Ci0gICAgICBpZiAobmFtZVswXSAhPSBoLT5yb290LnN0cmluZ1swXQotCSAgfHwgc3RyY21wIChuYW1lLCBoLT5yb290LnN0cmluZykgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc3JjaDsKLQkgIGJvb2xlYW4gZm91bmQ7Ci0KLQkgIC8qIFRoYXQgd2FzIHRoZSB3cm9uZyBzeW1ib2wuICBUcnkgcmVoYXNoaW5nLiAgKi8KLQkgIGZvdW5kID0gZmFsc2U7Ci0JICBmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoYXJtYXBfY291bnQgLSAxKTsKLQkgICAgICAgc3JjaCAhPSBoYXNoOwotCSAgICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGFybWFwX2NvdW50IC0gMSkpCi0JICAgIHsKLQkgICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpOwotCSAgICAgIGlmIChmaWxlX29mZnNldCA9PSAwKQotCQlicmVhazsKLQkgICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSk7Ci0JICAgICAgaWYgKG5hbWVbMF0gPT0gaC0+cm9vdC5zdHJpbmdbMF0KLQkJICAmJiBzdHJjbXAgKG5hbWUsIGgtPnJvb3Quc3RyaW5nKSA9PSAwKQotCQl7Ci0JCSAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZm91bmQpCi0JICAgIHsKLQkgICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGhhc2ggPSBzcmNoOwotCX0KLQotICAgICAgZWxlbWVudCA9ICgqYmFja2VuZC0+Z2V0X2VsdF9hdF9maWxlcG9zKSAoYWJmZCwgZmlsZV9vZmZzZXQpOwotICAgICAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBVbmxpa2UgdGhlIGdlbmVyaWMgbGlua2VyLCB3ZSBrbm93IHRoYXQgdGhpcyBlbGVtZW50IHByb3ZpZGVzCi0JIGEgZGVmaW5pdGlvbiBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgd2Uga25vdyB0aGF0IHdlIHdhbnQKLQkgdG8gaW5jbHVkZSBpdC4gIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYW55dGhpbmcuICAqLwotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBlbGVtZW50LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoZWxlbWVudCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgaWYgd2UgdXNlZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gICBiZWNhdXNlIHdlIHdlcmUgbm90IGRlYWxpbmcgd2l0aCBhbiBFQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgSERSUiAqc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKLSAgc2l6ZV90IGVzaXplOwotICBjaGFyICpzc2V4dCA9IE5VTEw7Ci0gIGNoYXIgKmV4dF9wdHI7Ci0gIGNoYXIgKmV4dF9lbmQ7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICBpZiAoISBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICBzeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIGV4dGVybmFsIHN0cmluZ3MuICAqLwotICBleHRlcm5hbF9leHRfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGVzaXplID0gc3ltaGRyLT5pZXh0TWF4ICogZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGV4dGVybmFsX2V4dCA9IChQVFIpIGJmZF9tYWxsb2MgKGVzaXplKTsKLSAgaWYgKGV4dGVybmFsX2V4dCA9PSBOVUxMICYmIGVzaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGV4dGVybmFsX2V4dCwgMSwgZXNpemUsIGFiZmQpICE9IGVzaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNzZXh0ID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3ltaGRyLT5pc3NFeHRNYXgpOwotICBpZiAoc3NleHQgPT0gTlVMTCAmJiBzeW1oZHItPmlzc0V4dE1heCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltaGRyLT5jYlNzRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChzc2V4dCwgMSwgc3ltaGRyLT5pc3NFeHRNYXgsIGFiZmQpICE9Ci0JICAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pc3NFeHRNYXgpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhleSBkZWZpbmUgc29tZQotICAgICBzeW1ib2wgdGhhdCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLiAgKi8KLSAgZXh0X3B0ciA9IChjaGFyICopIGV4dGVybmFsX2V4dDsKLSAgZXh0X2VuZCA9IGV4dF9wdHIgKyBlc2l6ZTsKLSAgZm9yICg7IGV4dF9wdHIgPCBleHRfZW5kOyBleHRfcHRyICs9IGV4dGVybmFsX2V4dF9zaXplKQotICAgIHsKLSAgICAgIEVYVFIgZXN5bTsKLSAgICAgIGJvb2xlYW4gZGVmOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXh0X3B0ciwgJmVzeW0pOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBzb21ldGhpbmcuICAqLwotICAgICAgaWYgKGVzeW0uYXN5bS5zdCAhPSBzdEdsb2JhbAotCSAgJiYgZXN5bS5hc3ltLnN0ICE9IHN0TGFiZWwKLQkgICYmIGVzeW0uYXN5bS5zdCAhPSBzdFByb2MpCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoZXN5bS5hc3ltLnNjKQotCXsKLQljYXNlIHNjVGV4dDoKLQljYXNlIHNjRGF0YToKLQljYXNlIHNjQnNzOgotCWNhc2Ugc2NBYnM6Ci0JY2FzZSBzY1NEYXRhOgotCWNhc2Ugc2NTQnNzOgotCWNhc2Ugc2NSRGF0YToKLQljYXNlIHNjQ29tbW9uOgotCWNhc2Ugc2NTQ29tbW9uOgotCWNhc2Ugc2NJbml0OgotCWNhc2Ugc2NGaW5pOgotCWNhc2Ugc2NSQ29uc3Q6Ci0JICBkZWYgPSB0cnVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRlZiA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISBkZWYpCi0JY29udGludWU7Ci0KLSAgICAgIG5hbWUgPSBzc2V4dCArIGVzeW0uYXN5bS5pc3M7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFVubGlrZSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHdlIGRvIG5vdCBwdWxsIGluIGVsZW1lbnRzIGJlY2F1c2UKLQkgb2YgY29tbW9uIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEluY2x1ZGUgdGhpcyBlbGVtZW50LiAgKi8KLSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAqcG5lZWRlZCA9IHRydWU7Ci0gICAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotICAgIH0KLQotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAoZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfZXh0KTsKLSAgaWYgKHNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoc3NleHQpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFQ09GRiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKLSAgc2l6ZV90IGVzaXplOwotICBjaGFyICpzc2V4dCA9IE5VTEw7Ci0gIGJvb2xlYW4gcmVzdWx0OwotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltaGRyID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKLQotICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBleHRlcm5hbCBzdHJpbmdzLiAgKi8KLSAgZXh0ZXJuYWxfZXh0X3NpemUgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgZXNpemUgPSBzeW1oZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZXh0ZXJuYWxfZXh0ID0gKFBUUikgYmZkX21hbGxvYyAoZXNpemUpOwotICBpZiAoZXh0ZXJuYWxfZXh0ID09IE5VTEwgJiYgZXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfZXh0LCAxLCBlc2l6ZSwgYWJmZCkgIT0gZXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3NleHQgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzeW1oZHItPmlzc0V4dE1heCk7Ci0gIGlmIChzc2V4dCA9PSBOVUxMICYmIHN5bWhkci0+aXNzRXh0TWF4ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiU3NFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKHNzZXh0LCAxLCBzeW1oZHItPmlzc0V4dE1heCwgYWJmZCkKLQkgICE9IChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlzc0V4dE1heCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVzdWx0ID0gZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KTsKLQotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICByZXR1cm4gcmVzdWx0OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBvZiBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlcgotICAgaGFzaCB0YWJsZS4gIFRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBzdHJpbmdzIHdlIGFyZSBwYXNzZWQgYXJlCi0gICBqdXN0IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGFuZCB3aWxsIGJlIGRpc2NhcmRlZC4gIFdlIG11c3QKLSAgIGV4cGxpY2l0bHkgc2F2ZSBhbnkgaW5mb3JtYXRpb24gd2UgbWF5IG5lZWQgbGF0ZXIgb24gaW4gdGhlIGxpbmsuCi0gICBXZSBkbyBub3Qgd2FudCB0byByZWFkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gYWdhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBQVFIgZXh0ZXJuYWxfZXh0OwotICAgICBjaGFyICpzc2V4dDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9leHRfaW47Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICB1bnNpZ25lZCBsb25nIGV4dF9jb3VudDsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBjaGFyICpleHRfcHRyOwotICBjaGFyICpleHRfZW5kOwotCi0gIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSBleHRfY291bnQgKiBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0gIGlmICghc3ltX2hhc2gpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IHN5bV9oYXNoOwotCi0gIGV4dF9wdHIgPSAoY2hhciAqKSBleHRlcm5hbF9leHQ7Ci0gIGV4dF9lbmQgPSBleHRfcHRyICsgZXh0X2NvdW50ICogZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGZvciAoOyBleHRfcHRyIDwgZXh0X2VuZDsgZXh0X3B0ciArPSBleHRlcm5hbF9leHRfc2l6ZSwgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBFWFRSIGVzeW07Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgKnN5bV9oYXNoID0gTlVMTDsKLQotICAgICAgKCpzd2FwX2V4dF9pbikgKGFiZmQsIChQVFIpIGV4dF9wdHIsICZlc3ltKTsKLQotICAgICAgLyogU2tpcCBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0gICAgICBza2lwID0gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKGVzeW0uYXN5bS5zdCkKLQl7Ci0JY2FzZSBzdEdsb2JhbDoKLQljYXNlIHN0U3RhdGljOgotCWNhc2Ugc3RMYWJlbDoKLQljYXNlIHN0UHJvYzoKLQljYXNlIHN0U3RhdGljUHJvYzoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBza2lwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNraXApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIHZhbHVlID0gZXN5bS5hc3ltLnZhbHVlOwotICAgICAgc3dpdGNoIChlc3ltLmFzeW0uc2MpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBzY05pbDoKLQljYXNlIHNjUmVnaXN0ZXI6Ci0JY2FzZSBzY0NkYkxvY2FsOgotCWNhc2Ugc2NCaXRzOgotCWNhc2Ugc2NDZGJTeXN0ZW06Ci0JY2FzZSBzY1JlZ0ltYWdlOgotCWNhc2Ugc2NJbmZvOgotCWNhc2Ugc2NVc2VyU3RydWN0OgotCWNhc2Ugc2NWYXI6Ci0JY2FzZSBzY1ZhclJlZ2lzdGVyOgotCWNhc2Ugc2NWYXJpYW50OgotCWNhc2Ugc2NCYXNlZFZhcjoKLQljYXNlIHNjWERhdGE6Ci0JY2FzZSBzY1BEYXRhOgotCSAgc2VjdGlvbiA9IE5VTEw7Ci0JICBicmVhazsKLQljYXNlIHNjVGV4dDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGV4dCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0RhdGE6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRhdGEiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NCc3M6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmJzcyIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0FiczoKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1VuZGVmaW5lZDoKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NEYXRhOgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NCc3M6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNic3MiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NSRGF0YToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmRhdGEiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NDb21tb246Ci0JICBpZiAodmFsdWUgPiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSkKLQkgICAgewotCSAgICAgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2Ugc2NTQ29tbW9uOgotCSAgaWYgKGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPSBTQ09NTU9OOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wubmFtZSA9IFNDT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2xfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgICB9Ci0JICBzZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGJyZWFrOwotCWNhc2Ugc2NTVW5kZWZpbmVkOgotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjSW5pdDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuaW5pdCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0Zpbmk6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmZpbmkiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NSQ29uc3Q6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJjb25zdCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IHNzZXh0ICsgZXN5bS5hc3ltLmlzczsKLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLAotCSAgICAgIGVzeW0ud2Vha2V4dCA/IEJTRl9XRUFLIDogQlNGX0dMT0JBTCwKLQkgICAgICBzZWN0aW9uLCB2YWx1ZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwgdHJ1ZSwgdHJ1ZSwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAqc3ltX2hhc2ggPSBoOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gRUNPRkYgaGFzaCB0YWJsZSwgc2F2ZSB0aGUgZXh0ZXJuYWwKLQkgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCi0JewotCSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMCi0JICAgICAgfHwgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQotCQkgICYmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikKLQkJICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpKSkKLQkgICAgewotCSAgICAgIGgtPmFiZmQgPSBhYmZkOwotCSAgICAgIGgtPmVzeW0gPSBlc3ltOwotCSAgICB9Ci0KLQkgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhpcyBzeW1ib2wgd2FzIHNtYWxsIHVuZGVmaW5lZC4gICovCi0JICBpZiAoZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkgICAgaC0+c21hbGwgPSAxOwotCi0JICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgZXZlciBzbWFsbCB1bmRlZmluZWQsIGl0IG5lZWRzIHRvIHdpbmQKLQkgICAgIHVwIGluIGEgR1AgcmVsYXRpdmUgc2VjdGlvbi4gIFdlIGNhbid0IGNvbnRyb2wgdGhlCi0JICAgICBzZWN0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wsIGJ1dCB3ZSBjYW4gY29udHJvbCB0aGUKLQkgICAgIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sLiAgVGhpcyBjYXNlIGlzIGFjdHVhbGx5IG5lZWRlZAotCSAgICAgb24gVWx0cml4IDQuMiB0byBoYW5kbGUgdGhlIHN5bWJvbCBjcmVkIGluIC1sY2tyYi4gICovCi0JICBpZiAoaC0+c21hbGwKLQkgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm5hbWUsIFNDT01NT04pICE9IDApCi0JICAgIHsKLQkgICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLAotCQkJCQkJCQkgU0NPTU1PTik7Ci0JICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQ29tbW9uOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIGZpbmFsIGxpbmsgcm91dGluZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBQVFIgaGFuZGxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gZWNvZmZfbGlua193cml0ZV9leHRlcm5hbC4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotLyogRUNPRkYgZmluYWwgbGluayByb3V0aW5lLiAgVGhpcyBsb29rcyB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEcwotICAgYW5kIGdhdGhlcnMgdG9nZXRoZXIgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGFuZCB0aGVuCi0gICBwcm9jZXNzZXMgYWxsIHRoZSBsaW5rIG9yZGVyIGluZm9ybWF0aW9uLiAgVGhpcyBtYXkgY2F1c2UgaXQgdG8KLSAgIGNsb3NlIGFuZCByZW9wZW4gc29tZSBpbnB1dCBCRkRzOyBJJ2xsIHNlZSBob3cgYmFkIHRoaXMgaXMuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOwotICBIRFJSICpzeW1oZHI7Ci0gIFBUUiBoYW5kbGU7Ci0gIHJlZ2lzdGVyIGJmZCAqaW5wdXRfYmZkOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzdHJ1Y3QgZXh0c3ltX2luZm8gZWluZm87Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGNvdW50cyBpbiB0aGUgc3ltYm9saWMKLSAgICAgaGVhZGVyLiAgKi8KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIHN5bWhkci0+dnN0YW1wID0gMDsKLSAgc3ltaGRyLT5pbGluZU1heCA9IDA7Ci0gIHN5bWhkci0+Y2JMaW5lID0gMDsKLSAgc3ltaGRyLT5pZG5NYXggPSAwOwotICBzeW1oZHItPmlwZE1heCA9IDA7Ci0gIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0gIHN5bWhkci0+aW9wdE1heCA9IDA7Ci0gIHN5bWhkci0+aWF1eE1heCA9IDA7Ci0gIHN5bWhkci0+aXNzTWF4ID0gMDsKLSAgc3ltaGRyLT5pc3NFeHRNYXggPSAwOwotICBzeW1oZHItPmlmZE1heCA9IDA7Ci0gIHN5bWhkci0+Y3JmZCA9IDA7Ci0gIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGl0c2VsZiBpbiB0aGUgZGVidWdfaW5mbwotICAgICBzdHJ1Y3R1cmUuICAqLwotICBkZWJ1Zy0+bGluZSA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfcGRyID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLSAgZGVidWctPnNzID0gTlVMTDsKLSAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9mZHIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2V4dCA9IGRlYnVnLT5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKLQotICBoYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLCBpbmZvKTsKLSAgaWYgKGhhbmRsZSA9PSAoUFRSKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIGVhY2ggaW5wdXQgQkZELiAgKi8KLSAgZm9yIChpbnB1dF9iZmQgPSBpbmZvLT5pbnB1dF9iZmRzOwotICAgICAgIGlucHV0X2JmZCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYm9vbGVhbiByZXQ7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotCXsKLQkgIC8qIEFiaXRyYXJpbHkgc2V0IHRoZSBzeW1ib2xpYyBoZWFkZXIgdnN0YW1wIHRvIHRoZSB2c3RhbXAKLQkgICAgIG9mIHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbiB0aGUgbGluay4gICovCi0JICBpZiAoc3ltaGRyLT52c3RhbXAgPT0gMCkKLQkgICAgc3ltaGRyLT52c3RhbXAKLQkgICAgICA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLnZzdGFtcDsKLQkgIHJldCA9IGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSAoYWJmZCwgaW5wdXRfYmZkLCBpbmZvLAotCQkJCQkJICAgaGFuZGxlKTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0ID0gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIgKGhhbmRsZSwgYWJmZCwKLQkJCQkJCWRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwKLQkJCQkJCWlucHV0X2JmZCwgaW5mbyk7Ci0gICAgICBpZiAoISByZXQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDb21iaW5lIHRoZSByZWdpc3RlciBtYXNrcy4gICovCi0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3BybWFzayB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncHJtYXNrOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmZwcm1hc2sgfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZnBybWFzazsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzBdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbMF07Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1sxXSB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5jcHJtYXNrWzFdOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbMl0gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1syXTsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzNdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbM107Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gIGVpbmZvLmFiZmQgPSBhYmZkOwotICBlaW5mby5pbmZvID0gaW5mbzsKLSAgZWNvZmZfbGlua19oYXNoX3RyYXZlcnNlIChlY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLAotCQkJICAgIChQVFIpICZlaW5mbyk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIG1ha2UgYSBwYXNzIG92ZXIgdGhlIGxpbmtfb3JkZXJzIHRvIGNvdW50IHVwIHRoZQotCSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgd2Ugd2lsbCBuZWVkIHRvIG91dHB1dCwgc28gdGhhdCB3ZSBrbm93Ci0JIGhvdyBtdWNoIHNwYWNlIHRoZXkgd2lsbCB0YWtlIHVwLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgICAgby0+cmVsb2NfY291bnQgKz0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgICAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIENvbXB1dGUgdGhlIHJlbG9jIGFuZCBzeW1ib2wgZmlsZSBwb3NpdGlvbnMuICAqLwotICBlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAoaGFuZGxlLCBhYmZkLCBkZWJ1ZywKLQkJCQkJICAgJmJhY2tlbmQtPmRlYnVnX3N3YXAsIGluZm8sCi0JCQkJCSAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9lY29mZl9kZWJ1Z19mcmVlIChoYW5kbGUsIGFiZmQsIGRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwgaW5mbyk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBOb3cgcmVzZXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0Ci0JIEJGRCB0byAwLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55Ci0JIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCB0aHVzIGZhci4gICovCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0Jby0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBHZXQgYSB2YWx1ZSBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IChoLT51LmRlZi52YWx1ZQotCQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBiZmRfdm1hIGxvOwotCi0JICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLwotCSAgbG8gPSAoYmZkX3ZtYSkgLTE7Ci0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoby0+dm1hIDwgbG8KLQkJICAmJiAoc3RyY21wIChvLT5uYW1lLCBfU0JTUykgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9TREFUQSkgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9MSVQ0KSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX0xJVDgpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCBfTElUQSkgPT0gMCkpCi0JCWxvID0gby0+dm1hOwotCSAgICB9Ci0JICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBsbyArIDB4ODAwMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYwotCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKLQkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCi0JfQotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltaGRyLT5pZXh0TWF4ICsgc3ltaGRyLT5pc3ltTWF4OwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGFuIGlucHV0IEJGRCBpbnRvIHRoZQotICAgb3V0cHV0IEJGRC4gIFRoaXMgbXVzdCByZWFkIGluIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBvZiB0aGUKLSAgIGlucHV0IEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgaGFuZGxlKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgUFRSIGhhbmRsZTsKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotICAgICZlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwOwotICBIRFJSICpzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYm9vbGVhbiByZXQ7Ci0KLSNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCi0gICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAotICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCi0JewkJCQkJCQkJXAotICAgICAgICAgIHJldCA9IGZhbHNlOwkJCQkJCQlcCi0gICAgICAgICAgZ290byByZXR1cm5fc29tZXRoaW5nOwkJCQkJXAotCX0JCQkJCQkJCVwKLSAgICAgIGlmICgoYmZkX3NlZWsgKGlucHV0X2JmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpCVwKLQkgICAhPSAwKQkJCQkJCQlcCi0JICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCi0JCQlpbnB1dF9iZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCVwKLQl7CQkJCQkJCQlcCi0gICAgICAgICAgcmV0ID0gZmFsc2U7CQkJCQkJCVwKLSAgICAgICAgICBnb3RvIHJldHVybl9zb21ldGhpbmc7CQkJCQlcCi0JfQkJCQkJCQkJXAotICAgIH0KLQotICAvKiBJZiByYXdfc3ltZW50cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgZGF0YSB3YXMgYWxyZWFkeSBieSByZWFkIGJ5Ci0gICAgIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mby4gICovCi0gIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLAotCSAgICB1bnNpZ25lZCBjaGFyICopOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgICAgIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JICAgIHVuaW9uIGF1eF9leHQgKik7Ci0gICAgICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7Ci0gICAgfQotI3VuZGVmIFJFQUQKLQotICAvKiBXZSBkbyBub3QgcmVhZCB0aGUgZXh0ZXJuYWwgc3RyaW5ncyBvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0KLSAgcmV0ID0gKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JIChoYW5kbGUsIG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKLQkgICZlY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+ZGVidWdfc3dhcCwKLQkgIGlucHV0X2JmZCwgZGVidWcsIHN3YXAsIGluZm8pKTsKLQotIHJldHVybl9zb21ldGhpbmc6Ci0gIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5saW5lKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOwotICAgICAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5zcyk7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGFjY2lkZW50YWxseSBmb2xsb3cgb25lIG9mIHRoZXNlIHBvaW50ZXJzCi0JIGludG8gZnJlZWQgbWVtb3J5LiAgKi8KLSAgICAgIGRlYnVnLT5saW5lID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX3BkciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfc3ltID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2F1eCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+c3MgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUHV0IG91dCBpbmZvcm1hdGlvbiBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgVGhlc2UgY29tZSBvbmx5IGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQgPSBlaW5mby0+YWJmZDsKLSAgYm9vbGVhbiBzdHJpcDsKLQotICAvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIGJlaW5nIHN0cmlwcGVkLiAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwIHx8IGgtPndyaXR0ZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKLSAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7Ci0gICAgICBoLT5lc3ltLndlYWtleHQgPSAwOwotICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKLSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICBlbHNlCi0JewotCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCQotCSAgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NEQVRBKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkRBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0JTUykgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSU5JVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRklOSSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUERBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUERhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9YREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NYRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JDT05TVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSQ29uc3Q7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCX0KLQotICAgICAgaC0+ZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+ZXN5bS5pZmQgIT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZQotCSBpbnB1dCBCRkQuICAqLwotICAgICAgZGVidWcgPSAmZWNvZmZfZGF0YSAoaC0+YWJmZCktPmRlYnVnX2luZm87Ci0gICAgICBCRkRfQVNTRVJUIChoLT5lc3ltLmlmZCA+PSAwCi0JCSAgJiYgaC0+ZXN5bS5pZmQgPCBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGRlYnVnLT5pZmRtYXBbaC0+ZXN5bS5pZmRdOwotICAgIH0KLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyAhPSBzY1VuZGVmaW5lZAotCSAgJiYgaC0+ZXN5bS5hc3ltLnNjICE9IHNjU1VuZGVmaW5lZCkKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCSAgfHwgaC0+ZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjICE9IHNjQ29tbW9uCi0JICAmJiBoLT5lc3ltLmFzeW0uc2MgIT0gc2NTQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQ29tbW9uOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgdXNlcyBpZXh0TWF4IHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHN5bWJvbCBudW1iZXIuICAqLwotICBoLT5pbmR4ID0gZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7Ci0gIGgtPndyaXR0ZW4gPSAxOwotCi0gIHJldHVybiAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotCSAgKG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKLQkgICAmZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmRlYnVnX3N3YXAsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JICAgJmgtPmVzeW0pKTsKLX0KLQotLyogUmVsb2NhdGUgYW5kIHdyaXRlIGFuIEVDT0ZGIHNlY3Rpb24gaW50byBhbiBFQ09GRiBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9pbmRpcmVjdF9saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZDsKLSAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY3Rpb25fdGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgY29va2VkX3NpemU7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKLSAgUFRSIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0KLSAgQkZEX0FTU0VSVCAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOwotCi0gIGlmIChsaW5rX29yZGVyLT5zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0KLSAgcmF3X3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGNvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotICBpZiAoY29va2VkX3NpemUgPT0gMCkKLSAgICBjb29rZWRfc2l6ZSA9IHJhd19zaXplOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOwotICBCRkRfQVNTRVJUIChjb29rZWRfc2l6ZSA9PSBsaW5rX29yZGVyLT5zaXplKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICBXZSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBsYXJnZXIgb2YKLSAgICAgdGhlIHNpemUgYmVmb3JlIHJlbG9jYXRpbmcgYW5kIHRoZSBzaXplIGFmdGVyIHJlbG9jYXRpbmcuICAqLwotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChyYXdfc2l6ZSA+PSBjb29rZWRfc2l6ZQotCQkJCSAgICAgID8gKHNpemVfdCkgcmF3X3NpemUKLQkJCQkgICAgICA6IChzaXplX3QpIGNvb2tlZF9zaXplKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgcmF3X3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHRoZSBjb250ZW50cyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvCi0gICAgIG1lbW9yeSwgaW4gd2hpY2ggY2FzZSB3ZSBjb3B5IHRoZW0gaW50byBvdXIgbmV3IGJ1ZmZlci4gIFdlIGRvbid0Ci0gICAgIHNpbXBseSByZXVzZSB0aGUgb2xkIGJ1ZmZlciBpbiBjYXNlIGNvb2tlZF9zaXplID4gcmF3X3NpemUuICAqLwotICBpZiAoc2VjdGlvbl90ZGF0YSAhPSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgJiYgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgbWVtY3B5IChjb250ZW50cywgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMsIChzaXplX3QpIHJhd19zaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIChQVFIpIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHJlbG9jcy4gIElmIHdlIGFyZSByZWxheGluZyBNSVBTIGNvZGUsIHRoZXkgd2lsbCBhbHJlYWR5Ci0gICAgIGhhdmUgYmVlbiByZWFkIGluLiAgT3RoZXJ3aXNlLCB3ZSByZWFkIHRoZW0gaW4gbm93LiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGV4dGVybmFsX3JlbG9jc19zaXplID0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGlmIChzZWN0aW9uX3RkYXRhICE9IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMCi0gICAgICAmJiBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBleHRlcm5hbF9yZWxvY3MgPSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7Ci0gICAgICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgZXh0ZXJuYWxfcmVsb2NzX3NpemUgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBpbnB1dF9iZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghICgoKmVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPnJlbG9jYXRlX3NlY3Rpb24pCi0JIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCSAgZXh0ZXJuYWxfcmVsb2NzKSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0ZWQgc2VjdGlvbi4gICovCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwKLQkJCQkgIG91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgY29udGVudHMsCi0JCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgY29va2VkX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIHJlbG9jcyB3ZXJlCi0gICAgIG1vZGlmaWVkLCBhbmQgd2Ugd3JpdGUgdGhlbSBvdXQgbm93LiAgV2UgdXNlIHRoZSByZWxvY19jb3VudAotICAgICBmaWVsZCBvZiBvdXRwdXRfc2VjdGlvbiB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdlCi0gICAgIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgICAgKG91dHB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcyArCi0JCSAgICAgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgb3V0cHV0X2JmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMICYmIHNlY3Rpb25fdGRhdGEgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwgJiYgc2VjdGlvbl90ZGF0YSA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSByZWxvYwotICAgcmVxdWVzdGVkIGJ5IHRoZSBsaW5rZXIsIGFuZCBkb2VzIGNvbWUgZnJvbSBhbnkgaW5wdXQgZmlsZS4gIFRoaXMKLSAgIGlzIHVzZWQgdG8gYnVpbGQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzIHdoZW4gbGlua2luZwotICAgd2l0aCAtVXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUgdHlwZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF92bWEgYWRkZW5kOwotICBhcmVsZW50IHJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jIGluOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9ieXRlICpyYnVmOwotICBib29sZWFuIG9rOwotCi0gIHR5cGUgPSBsaW5rX29yZGVyLT50eXBlOwotICBzZWN0aW9uID0gTlVMTDsKLSAgYWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7Ci0KLSAgLyogV2Ugc2V0IHVwIGFuIGFyZWxlbnQgdG8gcGFzcyB0byB0aGUgYmFja2VuZCBhZGp1c3RfcmVsb2Nfb3V0Ci0gICAgIHJvdXRpbmUuICAqLwotICByZWwuYWRkcmVzcyA9IGxpbmtfb3JkZXItPm9mZnNldDsKLQotICByZWwuaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAocmVsLmhvd3RvID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh0eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uOwotICAgICAgcmVsLnN5bV9wdHJfcHRyID0gc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sIGFzIHRob3VnaCBpdCB3ZXJlCi0gICAgICAgICBhY3R1YWxseSBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgdHlwZSA9IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI7Ci0JICBzZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JICAvKiBJdCBzZWVtcyB0aGF0IHdlIG91Z2h0IHRvIGFkZCB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotICAgICAgICAgICAgIGFkZGVuZCBoZXJlLCBidXQgaW4gcHJhY3RpY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgICAgICAgIGJlY2F1c2UgaXQgd2FzIHBhc3NlZCB0byBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4gICovCi0JICBhZGRlbmQgKz0gc2VjdGlvbi0+dm1hICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3Qgc2V0IHVwIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBjb3JyZWN0bHksCi0JICAgICBiZWNhdXNlIHdlIGhhdmUgbm8gYXN5bWJvbCBzdHJ1Y3R1cmUuICBDdXJyZW50bHkgbm8KLQkgICAgIGFkanVzdF9yZWxvY19vdXQgcm91dGluZSBjYXJlcy4gICovCi0JICByZWwuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIEFsbCBFQ09GRiByZWxvY3MgYXJlIGluLXBsYWNlLiAgUHV0IHRoZSBhZGRlbmQgaW50byB0aGUgb2JqZWN0Ci0gICAgIGZpbGUuICAqLwotCi0gIEJGRF9BU1NFUlQgKHJlbC5ob3d0by0+cGFydGlhbF9pbnBsYWNlKTsKLSAgaWYgKGFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWwuaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChyZWwuaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlY3Rpb24pCi0JCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAotCQkgIHJlbC5ob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWwuYWRkZW5kID0gMDsKLQotICAvKiBNb3ZlIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgaW50ZXJuYWxfcmVsb2Mgc3RydWN0dXJlLiAgKi8KLSAgaW4ucl92YWRkciA9IChyZWwuYWRkcmVzcwotCQkrIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKSk7Ci0gIGluLnJfdHlwZSA9IHJlbC5ob3d0by0+dHlwZTsKLQotICBpZiAodHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9ICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+aW5keCAhPSAtMSkKLQlpbi5yX3N5bW5keCA9IGgtPmluZHg7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGluLnJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICBpbi5yX2V4dGVybiA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQ09OU1QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBzZWN0aW9uKTsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi54ZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgICBpbi5yX2V4dGVybiA9IDA7Ci0gICAgfQotCi0gIC8qIExldCB0aGUgQkZEIGJhY2tlbmQgYWRqdXN0IHRoZSByZWxvYy4gICovCi0gICgqZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmFkanVzdF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmcmVsLCAmaW4pOwotCi0gIC8qIEdldCBzb21lIG1lbW9yeSBhbmQgc3dhcCBvdXQgdGhlIHJlbG9jLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5leHRlcm5hbF9yZWxvY19zaXplOwotICByYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX3JlbG9jX3NpemUpOwotICBpZiAocmJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKCplY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+c3dhcF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmaW4sIChQVFIpIHJidWYpOwotCi0gIG9rID0gKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgIChvdXRwdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MgKwotCQkgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKSwKLQkJICBTRUVLX1NFVCkgPT0gMAotCSYmIChiZmRfd3JpdGUgKChQVFIpIHJidWYsIDEsIGV4dGVybmFsX3JlbG9jX3NpemUsIG91dHB1dF9iZmQpCi0JICAgID09IGV4dGVybmFsX3JlbG9jX3NpemUpKTsKLQotICBpZiAob2spCi0gICAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZnJlZSAocmJ1Zik7Ci0KLSAgcmV0dXJuIG9rOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2ZmbGluay5jIGIvYmZkL2Vjb2ZmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWZjOTY2Li4wMDAwMDAwCi0tLSBhL2JmZC9lY29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OTkgKzAsMCBAQAotLyogUm91dGluZXMgdG8gbGluayBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAib2JqYWxsb2MuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLQwKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2FkZF9ieXRlcyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCQkJCQlzaXplX3QgbmVlZCkpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RyaW5nX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9hbGlnbl9kZWJ1ZyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJICAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3dyaXRlX3N5bWhkciBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiwKLQkJCQkJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiwKLQkJCQkJICAgZmlsZV9wdHIgd2hlcmUpKTsKLXN0YXRpYyBpbnQgY21wX2ZkcnRhYl9lbnRyeSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGJvb2xlYW4gbWtfZmRydGFiIFBBUkFNUyAoKGJmZCAqLAotCQkJCSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsCi0JCQkJICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopKTsKLXN0YXRpYyBsb25nIGZkcnRhYl9sb29rdXAgUEFSQU1TICgoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBsb29rdXBfbGluZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LCBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopKTsKLQwKLS8qIFJvdXRpbmVzIHRvIHN3YXAgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBJIGFtIGFzc3VtaW5nCi0gICB0aGF0IHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gZm9ybWF0IGlzIGFsd2F5cyBnb2luZyB0byBiZSB0YXJnZXQKLSAgIGluZGVwZW5kZW50LiAgKi8KLQotLyogU3dhcCBpbiBhIHR5cGUgaW5mb3JtYXRpb24gcmVjb3JkLgotICAgQklHRU5EIHNheXMgd2hldGhlciBBVVggc3ltYm9scyBhcmUgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuOyB0aGlzCi0gICBpbmZvIGNvbWVzIGZyb20gdGhlIGZpbGUgaGVhZGVyIHJlY29yZCAoZmgtZkJpZ2VuZGlhbikuICAqLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfdGlyX2luIChiaWdlbmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCB0aXJfZXh0ICpleHRfY29weTsKLSAgICAgVElSICppbnRlcm47Ci17Ci0gIHN0cnVjdCB0aXJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKmV4dF9jb3B5OwkJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBpbnRlcm4tPmZCaXRmaWVsZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0ZCSVRGSUVMRF9CSUcpOwotICAgIGludGVybi0+Y29udGludWVkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQ09OVElOVUVEX0JJRyk7Ci0gICAgaW50ZXJuLT5idCAgICAgICAgICA9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQlRfQklHKQotCQkJPj4JCSAgICBUSVJfQklUUzFfQlRfU0hfQklHOwotICAgIGludGVybi0+dHE0ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTRfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTRfU0hfQklHOwotICAgIGludGVybi0+dHE1ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTVfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTVfU0hfQklHOwotICAgIGludGVybi0+dHEwICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTBfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTBfU0hfQklHOwotICAgIGludGVybi0+dHExICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTFfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTFfU0hfQklHOwotICAgIGludGVybi0+dHEyICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTJfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTJfU0hfQklHOwotICAgIGludGVybi0+dHEzICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTNfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTNfU0hfQklHOwotICB9IGVsc2UgewotICAgIGludGVybi0+ZkJpdGZpZWxkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfRkJJVEZJRUxEX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5jb250aW51ZWQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9DT05USU5VRURfTElUVExFKTsKLSAgICBpbnRlcm4tPmJ0ICAgICAgICAgID0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9CVF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTMV9CVF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTQgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTUgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNV9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNV9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTAgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTEgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMV9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMV9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTIgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRMl9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMl9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTMgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRM19MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRM19TSF9MSVRUTEU7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSB0eXBlIGluZm9ybWF0aW9uIHJlY29yZC4KLSAgIEJJR0VORCBzYXlzIHdoZXRoZXIgQVVYIHN5bWJvbHMgYXJlIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbjsgdGhpcwotICAgaW5mbyBjb21lcyBmcm9tIHRoZSBmaWxlIGhlYWRlciByZWNvcmQgKGZoLWZCaWdlbmRpYW4pLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQgKGJpZ2VuZCwgaW50ZXJuX2NvcHksIGV4dCkKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3QgVElSICppbnRlcm5fY29weTsKLSAgICAgc3RydWN0IHRpcl9leHQgKmV4dDsKLXsKLSAgVElSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGV4dC0+dF9iaXRzMVswXSA9ICgoaW50ZXJuLT5mQml0ZmllbGQgPyBUSVJfQklUUzFfRkJJVEZJRUxEX0JJRyA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmNvbnRpbnVlZCA/IFRJUl9CSVRTMV9DT05USU5VRURfQklHIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmJ0IDw8IFRJUl9CSVRTMV9CVF9TSF9CSUcpCi0JCQkgICYgVElSX0JJVFMxX0JUX0JJRykpOwotICAgIGV4dC0+dF90cTQ1WzBdID0gKCgoaW50ZXJuLT50cTQgPDwgVElSX0JJVFNfVFE0X1NIX0JJRykKLQkJICAgICAgICYgVElSX0JJVFNfVFE0X0JJRykKLQkJICAgICAgfCAoKGludGVybi0+dHE1IDw8IFRJUl9CSVRTX1RRNV9TSF9CSUcpCi0JCQkgJiBUSVJfQklUU19UUTVfQklHKSk7Ci0gICAgZXh0LT50X3RxMDFbMF0gPSAoKChpbnRlcm4tPnRxMCA8PCBUSVJfQklUU19UUTBfU0hfQklHKQotCQkgICAgICAgJiBUSVJfQklUU19UUTBfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTEgPDwgVElSX0JJVFNfVFExX1NIX0JJRykKLQkJCSAmIFRJUl9CSVRTX1RRMV9CSUcpKTsKLSAgICBleHQtPnRfdHEyM1swXSA9ICgoKGludGVybi0+dHEyIDw8IFRJUl9CSVRTX1RRMl9TSF9CSUcpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMl9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMyA8PCBUSVJfQklUU19UUTNfU0hfQklHKQotCQkJICYgVElSX0JJVFNfVFEzX0JJRykpOwotICB9IGVsc2UgewotICAgIGV4dC0+dF9iaXRzMVswXSA9ICgoaW50ZXJuLT5mQml0ZmllbGQgPyBUSVJfQklUUzFfRkJJVEZJRUxEX0xJVFRMRSA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmNvbnRpbnVlZCA/IFRJUl9CSVRTMV9DT05USU5VRURfTElUVExFIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmJ0IDw8IFRJUl9CSVRTMV9CVF9TSF9MSVRUTEUpCi0JCQkgICYgVElSX0JJVFMxX0JUX0xJVFRMRSkpOwotICAgIGV4dC0+dF90cTQ1WzBdID0gKCgoaW50ZXJuLT50cTQgPDwgVElSX0JJVFNfVFE0X1NIX0xJVFRMRSkKLQkJICAgICAgICYgVElSX0JJVFNfVFE0X0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+dHE1IDw8IFRJUl9CSVRTX1RRNV9TSF9MSVRUTEUpCi0JCQkgJiBUSVJfQklUU19UUTVfTElUVExFKSk7Ci0gICAgZXh0LT50X3RxMDFbMF0gPSAoKChpbnRlcm4tPnRxMCA8PCBUSVJfQklUU19UUTBfU0hfTElUVExFKQotCQkgICAgICAgJiBUSVJfQklUU19UUTBfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTEgPDwgVElSX0JJVFNfVFExX1NIX0xJVFRMRSkKLQkJCSAmIFRJUl9CSVRTX1RRMV9MSVRUTEUpKTsKLSAgICBleHQtPnRfdHEyM1swXSA9ICgoKGludGVybi0+dHEyIDw8IFRJUl9CSVRTX1RRMl9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMl9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMyA8PCBUSVJfQklUU19UUTNfU0hfTElUVExFKQotCQkJICYgVElSX0JJVFNfVFEzX0xJVFRMRSkpOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYSByZWxhdGl2ZSBzeW1ib2wgcmVjb3JkLiAgQklHRU5EIHNheXMgd2hldGhlciBpdCBpcyBpbgotICAgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGZvcm1hdC4qLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kLCBleHRfY29weSwgaW50ZXJuKQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKmV4dF9jb3B5OwotICAgICBSTkRYUiAqaW50ZXJuOwotewotICBzdHJ1Y3Qgcm5keF9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqZXh0X2NvcHk7CQkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGludGVybi0+cmZkICAgPSAoZXh0LT5yX2JpdHNbMF0gPDwgUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9CSUcpCi0JCSAgfCAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9SRkRfQklHKQotCQkgICAgCQkgICAgPj4gUk5EWF9CSVRTMV9SRkRfU0hfQklHKTsKLSAgICBpbnRlcm4tPmluZGV4ID0gKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfSU5ERVhfQklHKQotCQkgICAgCQkgICAgPDwgUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRykKLQkJICB8IChleHQtPnJfYml0c1syXSA8PCBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQotCQkgIHwgKGV4dC0+cl9iaXRzWzNdIDw8IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcpOwotICB9IGVsc2UgewotICAgIGludGVybi0+cmZkICAgPSAoZXh0LT5yX2JpdHNbMF0gPDwgUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9MSVRUTEUpCi0JCSAgfCAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9SRkRfTElUVExFKQotCQkgICAgCQkgICAgPDwgUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUpOwotICAgIGludGVybi0+aW5kZXggPSAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUpCi0JCSAgICAJCSAgICA+PiBSTkRYX0JJVFMxX0lOREVYX1NIX0xJVFRMRSkKLQkJICB8IChleHQtPnJfYml0c1syXSA8PCBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfTElUVExFKQotCQkgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+cl9iaXRzWzNdCi0JCSAgICAgPDwgUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSk7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSByZWxhdGl2ZSBzeW1ib2wgcmVjb3JkLiAgQklHRU5EIHNheXMgd2hldGhlciBpdCBpcyBpbgotICAgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGZvcm1hdC4qLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQgKGJpZ2VuZCwgaW50ZXJuX2NvcHksIGV4dCkKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3QgUk5EWFIgKmludGVybl9jb3B5OwotICAgICBzdHJ1Y3Qgcm5keF9leHQgKmV4dDsKLXsKLSAgUk5EWFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgZXh0LT5yX2JpdHNbMF0gPSBpbnRlcm4tPnJmZCA+PiBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0JJRzsKLSAgICBleHQtPnJfYml0c1sxXSA9ICgoKGludGVybi0+cmZkIDw8IFJORFhfQklUUzFfUkZEX1NIX0JJRykKLQkJICAgICAgICYgUk5EWF9CSVRTMV9SRkRfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMxX0lOREVYX1NIX0xFRlRfQklHKQotCQkJICYgUk5EWF9CSVRTMV9JTkRFWF9CSUcpKTsKLSAgICBleHQtPnJfYml0c1syXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRzsKLSAgICBleHQtPnJfYml0c1szXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRzsKLSAgfSBlbHNlIHsKLSAgICBleHQtPnJfYml0c1swXSA9IGludGVybi0+cmZkID4+IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFOwotICAgIGV4dC0+cl9iaXRzWzFdID0gKCgoaW50ZXJuLT5yZmQgPj4gUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUpCi0JCSAgICAgICAmIFJORFhfQklUUzFfUkZEX0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+aW5kZXggPDwgUk5EWF9CSVRTMV9JTkRFWF9TSF9MSVRUTEUpCi0JCQkgJiBSTkRYX0JJVFMxX0lOREVYX0xJVFRMRSkpOwotICAgIGV4dC0+cl9iaXRzWzJdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfTElUVExFOwotICAgIGV4dC0+cl9iaXRzWzNdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0MCi0vKiBUaGUgbWluaW11bSBhbW91bnQgb2YgZGF0YSB0byBhbGxvY2F0ZS4gICovCi0jZGVmaW5lIEFMTE9DX1NJWkUgKDQwNjQpCi0KLS8qIEFkZCBieXRlcyB0byBhIGJ1ZmZlci4gIFJldHVybiBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIG5lZWQpCi0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHNpemVfdCBuZWVkOwotewotICBzaXplX3QgaGF2ZTsKLSAgc2l6ZV90IHdhbnQ7Ci0gIGNoYXIgKm5ld2J1ZjsKLQotICBoYXZlID0gKmJ1ZmVuZCAtICpidWY7Ci0gIGlmIChoYXZlID4gbmVlZCkKLSAgICB3YW50ID0gQUxMT0NfU0laRTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHdhbnQgPSBuZWVkIC0gaGF2ZTsKLSAgICAgIGlmICh3YW50IDwgQUxMT0NfU0laRSkKLQl3YW50ID0gQUxMT0NfU0laRTsKLSAgICB9Ci0gIG5ld2J1ZiA9IChjaGFyICopIGJmZF9yZWFsbG9jICgqYnVmLCBoYXZlICsgd2FudCk7Ci0gIGlmIChuZXdidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpidWYgPSBuZXdidWY7Ci0gICpidWZlbmQgPSAqYnVmICsgaGF2ZSArIHdhbnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBrZWVwIGEgaGFzaCB0YWJsZSB3aGljaCBtYXBzIHN0cmluZ3MgdG8gbnVtYmVycy4gIFdlIHVzZSBpdCB0bwotICAgbWFwIEZEUiBuYW1lcyB0byBpbmRpY2VzIGluIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHRvIG1hcCBsb2NhbAotICAgc3RyaW5ncyB3aGVuIGNvbWJpbmluZyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEZEUiBpbmRleCBvciBzdHJpbmcgdGFibGUgb2Zmc2V0LiAgKi8KLSAgbG9uZyB2YWw7Ci0gIC8qIE5leHQgZW50cnkgaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpuZXh0OwotfTsKLQotc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLX07Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0cmluZ19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT52YWwgPSAtMTsKLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3RyaW5nX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogV2UgY2FuJ3QgYWZmb3JkIHRvIHJlYWQgaW4gYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hlbiB3ZSBkbwotICAgYSBsaW5rLiAgSW5zdGVhZCwgd2UgYnVpbGQgYSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgdG8gc2hvdyBob3cKLSAgIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgaW5wdXQgZmlsZSBtYXAgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RydWN0IHNodWZmbGUKLXsKLSAgLyogVGhlIG5leHQgZW50cnkgaW4gdGhpcyBsaW5rZWQgbGlzdC4gICovCi0gIHN0cnVjdCBzaHVmZmxlICpuZXh0OwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgLyogV2hldGhlciB0aGlzIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gYSBmaWxlIG9yIG5vdC4gICovCi0gIGJvb2xlYW4gZmlsZXA7Ci0gIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0JewotCSAgLyogVGhlIEJGRCB0aGUgZGF0YSBjb21lcyBmcm9tLiAgKi8KLQkgIGJmZCAqaW5wdXRfYmZkOwotCSAgLyogVGhlIG9mZnNldCB3aXRoaW4gaW5wdXRfYmZkLiAgKi8KLQkgIGZpbGVfcHRyIG9mZnNldDsKLQl9IGZpbGU7Ci0gICAgICAvKiBUaGUgZGF0YSB0byBiZSB3cml0dGVuIG91dC4gICovCi0gICAgICBQVFIgbWVtb3J5OwotICAgIH0gdTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFjcm9zcyBjYWxscyB0bwotICAgYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUuICAqLwotCi1zdHJ1Y3QgYWNjdW11bGF0ZQotewotICAvKiBUaGUgRkRSIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgZmRyX2hhc2g7Ci0gIC8qIFRoZSBzdHJpbmdzIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgc3RyX2hhc2g7Ci0gIC8qIExpbmtlZCBsaXN0cyBkZXNjcmliaW5nIGhvdyB0byBzaHVmZmxlIHRoZSBpbnB1dCBkZWJ1ZwotICAgICBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGtlZXAgYSBwb2ludGVyIHRvIGJvdGggdGhlCi0gICAgIGhlYWQgYW5kIHRoZSB0YWlsLiAgKi8KLSAgc3RydWN0IHNodWZmbGUgKmxpbmU7Ci0gIHN0cnVjdCBzaHVmZmxlICpsaW5lX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnBkcjsKLSAgc3RydWN0IHNodWZmbGUgKnBkcl9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpzeW07Ci0gIHN0cnVjdCBzaHVmZmxlICpzeW1fZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqb3B0OwotICBzdHJ1Y3Qgc2h1ZmZsZSAqb3B0X2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKmF1eDsKLSAgc3RydWN0IHNodWZmbGUgKmF1eF9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpzczsKLSAgc3RydWN0IHNodWZmbGUgKnNzX2VuZDsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzc19oYXNoOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNzX2hhc2hfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqZmRyOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqZmRyX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnJmZDsKLSAgc3RydWN0IHNodWZmbGUgKnJmZF9lbmQ7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGZpbGUgc2h1ZmZsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGFyZ2VzdF9maWxlX3NodWZmbGU7Ci0gIC8qIEFuIG9iamFsbG9jIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3Qgb2JqYWxsb2MgKm1lbW9yeTsKLX07Ci0KLS8qIEFkZCBhIGZpbGUgZW50cnkgdG8gYSBzaHVmZmxlIGxpc3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfZmlsZV9zaHVmZmxlIFBBUkFNUyAoKHN0cnVjdCBhY2N1bXVsYXRlICosCi0JCQkJICAgICAgc3RydWN0IHNodWZmbGUgKiosCi0JCQkJICAgICAgc3RydWN0IHNodWZmbGUgKiosIGJmZCAqLCBmaWxlX3B0ciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1hZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgaGVhZCwgdGFpbCwgaW5wdXRfYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbzsKLSAgICAgc3RydWN0IHNodWZmbGUgKipoZWFkOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWw7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLXsKLSAgc3RydWN0IHNodWZmbGUgKm47Ci0KLSAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMCi0gICAgICAmJiAoKnRhaWwpLT5maWxlcAotICAgICAgJiYgKCp0YWlsKS0+dS5maWxlLmlucHV0X2JmZCA9PSBpbnB1dF9iZmQKLSAgICAgICYmICgqdGFpbCktPnUuZmlsZS5vZmZzZXQgKyAoKnRhaWwpLT5zaXplID09ICh1bnNpZ25lZCBsb25nKSBvZmZzZXQpCi0gICAgewotICAgICAgLyogSnVzdCBtZXJnZSB0aGlzIGVudHJ5IG9udG8gdGhlIGV4aXN0aW5nIG9uZS4gICovCi0gICAgICAoKnRhaWwpLT5zaXplICs9IHNpemU7Ci0gICAgICBpZiAoKCp0YWlsKS0+c2l6ZSA+IGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSkKLQlhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAoKnRhaWwpLT5zaXplOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG4gPSAoc3RydWN0IHNodWZmbGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBzaHVmZmxlKSk7Ci0gIGlmICghbikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5zaXplID0gc2l6ZTsKLSAgbi0+ZmlsZXAgPSB0cnVlOwotICBuLT51LmZpbGUuaW5wdXRfYmZkID0gaW5wdXRfYmZkOwotICBuLT51LmZpbGUub2Zmc2V0ID0gb2Zmc2V0OwotICBpZiAoKmhlYWQgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKmhlYWQgPSBuOwotICBpZiAoKnRhaWwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKCp0YWlsKS0+bmV4dCA9IG47Ci0gICp0YWlsID0gbjsKLSAgaWYgKHNpemUgPiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpCi0gICAgYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlID0gc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIG1lbW9yeSBlbnRyeSB0byBhIHNodWZmbGUgbGlzdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGFkZF9tZW1vcnlfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAotCQkJCQkgICBzdHJ1Y3Qgc2h1ZmZsZSAqKmhlYWQsCi0JCQkJCSAgIHN0cnVjdCBzaHVmZmxlICoqdGFpbCwKLQkJCQkJICAgYmZkX2J5dGUgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkpOwotCi1zdGF0aWMgYm9vbGVhbgotYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgaGVhZCwgdGFpbCwgZGF0YSwgc2l6ZSkKLSAgICAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKmhlYWQ7Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqdGFpbDsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLXsKLSAgc3RydWN0IHNodWZmbGUgKm47Ci0gICAgIAotICBuID0gKHN0cnVjdCBzaHVmZmxlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LAotCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2h1ZmZsZSkpOwotICBpZiAoIW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+c2l6ZSA9IHNpemU7Ci0gIG4tPmZpbGVwID0gZmFsc2U7Ci0gIG4tPnUubWVtb3J5ID0gKFBUUikgZGF0YTsKLSAgaWYgKCpoZWFkID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICpoZWFkID0gbjsKLSAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICgqdGFpbCktPm5leHQgPSBuOwotICAqdGFpbCA9IG47Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBGRFIgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBhIGhhbmRsZSB3aGljaCBpcyB0aGVuCi0gICBwYXNzZWQgaW4gdG8gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUsIGV0LiBhbC4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1iZmRfZWNvZmZfZGVidWdfaW5pdCAob3V0cHV0X2JmZCwgb3V0cHV0X2RlYnVnLCBvdXRwdXRfc3dhcCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotCi0gIGFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGFjY3VtdWxhdGUpKTsKLSAgaWYgKCFhaW5mbykKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jLAotCQkJICAgICAgIDEwMjEpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFpbmZvLT5saW5lID0gTlVMTDsKLSAgYWluZm8tPmxpbmVfZW5kID0gTlVMTDsKLSAgYWluZm8tPnBkciA9IE5VTEw7Ci0gIGFpbmZvLT5wZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnN5bSA9IE5VTEw7Ci0gIGFpbmZvLT5zeW1fZW5kID0gTlVMTDsKLSAgYWluZm8tPm9wdCA9IE5VTEw7Ci0gIGFpbmZvLT5vcHRfZW5kID0gTlVMTDsKLSAgYWluZm8tPmF1eCA9IE5VTEw7Ci0gIGFpbmZvLT5hdXhfZW5kID0gTlVMTDsKLSAgYWluZm8tPnNzID0gTlVMTDsKLSAgYWluZm8tPnNzX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5zc19oYXNoID0gTlVMTDsKLSAgYWluZm8tPnNzX2hhc2hfZW5kID0gTlVMTDsKLSAgYWluZm8tPmZkciA9IE5VTEw7Ci0gIGFpbmZvLT5mZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnJmZCA9IE5VTEw7Ci0gIGFpbmZvLT5yZmRfZW5kID0gTlVMTDsKLQotICBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAwOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmYWluZm8tPnN0cl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgaXMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gICAgICBvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSAxOwotICAgIH0KLQotICBhaW5mby0+bWVtb3J5ID0gb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAoYWluZm8tPm1lbW9yeSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoUFRSKSBhaW5mbzsKLX0KLQotLyogRnJlZSB0aGUgYWNjdW11bGF0ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfZWNvZmZfZGVidWdfZnJlZSAoaGFuZGxlLCBvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLCBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIAotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlKTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFpbmZvLT5zdHJfaGFzaC50YWJsZSk7Ci0KLSAgb2JqYWxsb2NfZnJlZSAoYWluZm8tPm1lbW9yeSk7Ci0KLSAgZnJlZSAoYWluZm8pOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBJTlBVVF9CRkQgaW50bwotICAgT1VUUFVUX0JGRC4gIFRoZSBJTlBVVF9ERUJVRyBhcmd1bWVudCBwb2ludHMgdG8gc29tZSBFQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHdlIHdhbnQgdG8gbGluayBpbnRvIHRoZSBpbmZvcm1hdGlvbgotICAgcG9pbnRlZCB0byBieSB0aGUgT1VUUFVUX0RFQlVHIGFyZ3VtZW50LiAgT1VUUFVUX1NXQVAgYW5kCi0gICBJTlBVVF9TV0FQIHBvaW50IHRvIHRoZSBzd2FwcGluZyBpbmZvcm1hdGlvbiBuZWVkZWQuICBJTkZPIGlzIHRoZQotICAgbGlua2VyIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIEhBTkRMRSBpcyByZXR1cm5lZCBieQotICAgYmZkX2Vjb2ZmX2RlYnVnX2luaXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsCi0JCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwKLQkJCSAgICBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQotICAgID0gaW5wdXRfc3dhcC0+c3dhcF9zeW1faW47Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9yZmRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpCi0gICAgPSBpbnB1dF9zd2FwLT5zd2FwX3JmZF9pbjsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpCi0gICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9zeW1fb3V0OwotICB2b2lkICgqIGNvbnN0IHN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKQotICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfZmRyX291dDsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3JmZF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpCi0gICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9yZmRfb3V0OwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX29wdF9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX29wdF9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JmZF9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3JmZF9zaXplOwotICBIRFJSICogY29uc3Qgb3V0cHV0X3N5bWhkciA9ICZvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgSERSUiAqIGNvbnN0IGlucHV0X3N5bWhkciA9ICZpbnB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBiZmRfdm1hIHNlY3Rpb25fYWRqdXN0W3NjTWF4XTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX2J5dGUgKmZkcl9zdGFydDsKLSAgYmZkX2J5dGUgKmZkcl9wdHI7Ci0gIGJmZF9ieXRlICpmZHJfZW5kOwotICBiZmRfc2l6ZV90eXBlIGZkcl9hZGQ7Ci0gIHVuc2lnbmVkIGludCBjb3BpZWQ7Ci0gIFJGRFQgaTsKLSAgdW5zaWduZWQgbG9uZyBzejsKLSAgYmZkX2J5dGUgKnJmZF9vdXQ7Ci0gIGJmZF9ieXRlICpyZmRfaW47Ci0gIGJmZF9ieXRlICpyZmRfZW5kOwotICBsb25nIG5ld3JmZGJhc2UgPSAwOwotICBsb25nIG9sZHJmZGJhc2UgPSAwOwotICBiZmRfYnl0ZSAqZmRyX291dDsKLQotICAvKiBVc2Ugc2VjdGlvbl9hZGp1c3QgdG8gaG9sZCB0aGUgdmFsdWUgdG8gYWRkIHRvIGEgc3ltYm9sIGluIGEKLSAgICAgcGFydGljdWxhciBzZWN0aW9uLiAgKi8KLSAgbWVtc2V0ICgoUFRSKSBzZWN0aW9uX2FkanVzdCwgMCwgc2l6ZW9mIHNlY3Rpb25fYWRqdXN0KTsKLQotI2RlZmluZSBTRVQobmFtZSwgaW5keCkgXAotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKTsgXAotICBpZiAoc2VjICE9IE5VTEwpIFwKLSAgICBzZWN0aW9uX2FkanVzdFtpbmR4XSA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgXAotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0IFwKLQkJCSAgICAtIHNlYy0+dm1hKTsKLQotICBTRVQgKCIudGV4dCIsIHNjVGV4dCk7Ci0gIFNFVCAoIi5kYXRhIiwgc2NEYXRhKTsKLSAgU0VUICgiLmJzcyIsIHNjQnNzKTsKLSAgU0VUICgiLnNkYXRhIiwgc2NTRGF0YSk7Ci0gIFNFVCAoIi5zYnNzIiwgc2NTQnNzKTsKLSAgLyogc2NSZGF0YSBzZWN0aW9uIG1heSBiZSBlaXRoZXIgLnJkYXRhIG9yIC5yb2RhdGEuICAqLwotICBTRVQgKCIucmRhdGEiLCBzY1JEYXRhKTsKLSAgU0VUICgiLnJvZGF0YSIsIHNjUkRhdGEpOwotICBTRVQgKCIuaW5pdCIsIHNjSW5pdCk7Ci0gIFNFVCAoIi5maW5pIiwgc2NGaW5pKTsKLSAgU0VUICgiLnJjb25zdCIsIHNjUkNvbnN0KTsKLQotI3VuZGVmIFNFVAotCi0gIC8qIEZpbmQgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIEZEUidzLiAgV2UgbmVlZAotICAgICB0byBoYW5kbGUgdGhlbSB3aGV0aGVyIHRoZXkgYXJlIHN3YXBwZWQgb3Igbm90LiAgKi8KLSAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZkcl9zdGFydCA9IChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZmRyOwotICAgICAgZmRyX2FkZCA9IHNpemVvZiAoRkRSKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmZHJfc3RhcnQgPSAoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX2ZkcjsKLSAgICAgIGZkcl9hZGQgPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKLSAgICB9Ci0gIGZkcl9lbmQgPSBmZHJfc3RhcnQgKyBpbnB1dF9zeW1oZHItPmlmZE1heCAqIGZkcl9hZGQ7Ci0KLSAgaW5wdXRfZGVidWctPmlmZG1hcCA9IChSRkRUICopIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJCQkgICAgKGlucHV0X3N5bWhkci0+aWZkTWF4Ci0JCQkJCSAgICAgKiBzaXplb2YgKFJGRFQpKSk7Ci0KLSAgc3ogPSAoaW5wdXRfc3ltaGRyLT5jcmZkICsgaW5wdXRfc3ltaGRyLT5pZmRNYXgpICogZXh0ZXJuYWxfcmZkX3NpemU7Ci0gIHJmZF9vdXQgPSAoYmZkX2J5dGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksIHN6KTsKLSAgaWYgKCFpbnB1dF9kZWJ1Zy0+aWZkbWFwIHx8ICFyZmRfb3V0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnJmZCwgJmFpbmZvLT5yZmRfZW5kLCByZmRfb3V0LCBzeikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvcGllZCA9IDA7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBGRFIncyB0byBzZWUgd2hpY2ggb25lcyB3ZSBhcmUgZ29pbmcgdG8gaW5jbHVkZQotICAgICBpbiB0aGUgZmluYWwgb3V0cHV0LiAgV2UgZG8gbm90IHdhbnQgZHVwbGljYXRlIEZEUiBpbmZvcm1hdGlvbgotICAgICBmb3IgaGVhZGVyIGZpbGVzLCBiZWNhdXNlIEVDT0ZGIGRlYnVnZ2luZyBpcyBvZnRlbiB2ZXJ5IGxhcmdlLgotICAgICBXaGVuIHdlIGZpbmQgYW4gRkRSIHdpdGggbm8gbGluZSBpbmZvcm1hdGlvbiB3aGljaCBjYW4gYmUgbWVyZ2VkLAotICAgICB3ZSBsb29rIGl0IHVwIGluIGEgaGFzaCB0YWJsZSB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IGluY2x1ZGUgaXQKLSAgICAgb25jZS4gIFdlIGtlZXAgYSB0YWJsZSBtYXBwaW5nIEZEUiBudW1iZXJzIHRvIHRoZSBmaW5hbCBudW1iZXIKLSAgICAgdGhleSBnZXQgd2l0aCB0aGUgQkZELCBzbyB0aGF0IHdlIGNhbiByZWZlciB0byBpdCB3aGVuIHdlIHdyaXRlCi0gICAgIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gIGZvciAoZmRyX3B0ciA9IGZkcl9zdGFydCwgaSA9IDA7Ci0gICAgICAgZmRyX3B0ciA8IGZkcl9lbmQ7Ci0gICAgICAgZmRyX3B0ciArPSBmZHJfYWRkLCBpKyssIHJmZF9vdXQgKz0gZXh0ZXJuYWxfcmZkX3NpemUpCi0gICAgewotICAgICAgRkRSIGZkcjsKLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotCWZkciA9ICooRkRSICopIGZkcl9wdHI7Ci0gICAgICBlbHNlCi0JKCppbnB1dF9zd2FwLT5zd2FwX2Zkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgZmRyX3B0ciwgJmZkcik7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIEZEUiBjYW4gYmUgbWVyZ2VkIHdpdGggYW4gZXhpc3Rpbmcgb25lLiAgKi8KLSAgICAgIGlmIChmZHIuY2JMaW5lID09IDAgJiYgZmRyLnJzcyAhPSAtMSAmJiBmZHIuZk1lcmdlKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyICpsb29rdXA7Ci0JICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmZoOwotCi0JICAvKiBXZSBsb29rIHVwIGEgc3RyaW5nIGZvcm1lZCBmcm9tIHRoZSBmaWxlIG5hbWUgYW5kIHRoZQotCSAgICAgbnVtYmVyIG9mIHN5bWJvbHMgYW5kIGF1eCBlbnRyaWVzLiAgU29tZXRpbWVzIGFuIGluY2x1ZGUKLQkgICAgIGZpbGUgd2lsbCBjb25kaXRpb25hbGx5IGRlZmluZSBhIHR5cGVkZWYgb3Igc29tZXRoaW5nCi0JICAgICBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgaW5jbHVkZSBmaWxlcy4gIFVzaW5nIHRoZSBudW1iZXIgb2YKLQkgICAgIHN5bWJvbHMgYW5kIGF1eCBlbnRyaWVzIGFzIGEgaGFzaCByZWR1Y2VzIHRoZSBjaGFuY2UgdGhhdAotCSAgICAgd2Ugd2lsbCBtZXJnZSBzeW1ib2wgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgbm90IGJlCi0JICAgICBtZXJnZWQuICAqLwotCSAgbmFtZSA9IGlucHV0X2RlYnVnLT5zcyArIGZkci5pc3NCYXNlICsgZmRyLnJzczsKLQotCSAgbG9va3VwID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDIwKTsKLQkgIGlmIChsb29rdXAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3ByaW50ZiAobG9va3VwLCAiJXMgJWx4ICVseCIsIG5hbWUsIGZkci5jc3ltLCBmZHIuY2F1eCk7Ci0KLQkgIGZoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmYWluZm8tPmZkcl9oYXNoLCBsb29rdXAsIHRydWUsIHRydWUpOwotCSAgZnJlZSAobG9va3VwKTsKLQkgIGlmIChmaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGZoLT52YWwgIT0gLTEpCi0JICAgIHsKLQkgICAgICBpbnB1dF9kZWJ1Zy0+aWZkbWFwW2ldID0gZmgtPnZhbDsKLQkgICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsIGlucHV0X2RlYnVnLT5pZmRtYXAgKyBpLAotCQkJICAgICAgIChQVFIpIHJmZF9vdXQpOwotCi0JICAgICAgLyogRG9uJ3QgY29weSB0aGlzIEZEUi4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgZmgtPnZhbCA9IG91dHB1dF9zeW1oZHItPmlmZE1heCArIGNvcGllZDsKLQl9Ci0KLSAgICAgIGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPSBvdXRwdXRfc3ltaGRyLT5pZmRNYXggKyBjb3BpZWQ7Ci0gICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsIGlucHV0X2RlYnVnLT5pZmRtYXAgKyBpLCAoUFRSKSByZmRfb3V0KTsKLSAgICAgICsrY29waWVkOwotICAgIH0KLQotICBuZXdyZmRiYXNlID0gb3V0cHV0X3N5bWhkci0+Y3JmZDsKLSAgb3V0cHV0X3N5bWhkci0+Y3JmZCArPSBpbnB1dF9zeW1oZHItPmlmZE1heDsKLQotICAvKiBDb3B5IG92ZXIgYW55IGV4aXN0aW5nIFJGRCdzLiAgUkZEJ3MgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUKLSAgICAgbGlua2VyLCBzbyB0aGlzIHdpbGwgb25seSBoYXBwZW4gZm9yIGlucHV0IGZpbGVzIHdoaWNoIGFyZSB0aGUKLSAgICAgcmVzdWx0IG9mIGEgcGFydGlhbCBsaW5rLiAgKi8KLSAgcmZkX2luID0gKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5leHRlcm5hbF9yZmQ7Ci0gIHJmZF9lbmQgPSByZmRfaW4gKyBpbnB1dF9zeW1oZHItPmNyZmQgKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKLSAgZm9yICg7Ci0gICAgICAgcmZkX2luIDwgcmZkX2VuZDsKLSAgICAgICByZmRfaW4gKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpCi0gICAgewotICAgICAgUkZEVCByZmQ7Ci0KLSAgICAgICgqc3dhcF9yZmRfaW4pIChpbnB1dF9iZmQsIChQVFIpIHJmZF9pbiwgJnJmZCk7Ci0gICAgICBCRkRfQVNTRVJUIChyZmQgPj0gMCAmJiByZmQgPCBpbnB1dF9zeW1oZHItPmlmZE1heCk7Ci0gICAgICByZmQgPSBpbnB1dF9kZWJ1Zy0+aWZkbWFwW3JmZF07Ci0gICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsICZyZmQsIChQVFIpIHJmZF9vdXQpOwotICAgICAgcmZkX291dCArPSBleHRlcm5hbF9yZmRfc2l6ZTsKLSAgICB9Ci0KLSAgb2xkcmZkYmFzZSA9IG91dHB1dF9zeW1oZHItPmNyZmQ7Ci0gIG91dHB1dF9zeW1oZHItPmNyZmQgKz0gaW5wdXRfc3ltaGRyLT5jcmZkOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgRkRSJ3MgYW5kIGNvcHkgb3ZlciBhbGwgYXNzb2NpYXRlZCBkZWJ1Z2dpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBzeiA9IGNvcGllZCAqIGV4dGVybmFsX2Zkcl9zaXplOwotICBmZHJfb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0gIGlmICghZmRyX291dCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5mZHIsICZhaW5mby0+ZmRyX2VuZCwgZmRyX291dCwgc3opKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChmZHJfcHRyID0gZmRyX3N0YXJ0LCBpID0gMDsKLSAgICAgICBmZHJfcHRyIDwgZmRyX2VuZDsKLSAgICAgICBmZHJfcHRyICs9IGZkcl9hZGQsIGkrKykKLSAgICB7Ci0gICAgICBGRFIgZmRyOwotICAgICAgYmZkX3ZtYSBmZHJfYWRyOwotICAgICAgYmZkX2J5dGUgKnN5bV9vdXQ7Ci0gICAgICBiZmRfYnl0ZSAqbHJhd19zcmM7Ci0gICAgICBiZmRfYnl0ZSAqbHJhd19lbmQ7Ci0gICAgICBib29sZWFuIGZnb3RmaWxlbmFtZTsKLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPCBvdXRwdXRfc3ltaGRyLT5pZmRNYXgpCi0JewotCSAgLyogV2UgYXJlIG5vdCBjb3B5aW5nIHRoaXMgRkRSLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotCWZkciA9ICooRkRSICopIGZkcl9wdHI7Ci0gICAgICBlbHNlCi0JKCppbnB1dF9zd2FwLT5zd2FwX2Zkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgZmRyX3B0ciwgJmZkcik7Ci0KLSAgICAgIGZkcl9hZHIgPSBmZHIuYWRyOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIEZEUiBhZGRyZXNzIGZvciBhbnkgY2hhbmdlcyB0aGF0IG1heSBoYXZlIGJlZW4KLQkgbWFkZSBieSByZWxheGluZy4gICovCi0gICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCXsKLQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLQotCSAgZm9yIChhZGp1c3QgPSBpbnB1dF9kZWJ1Zy0+YWRqdXN0OwotCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkgICAgICAgYWRqdXN0ID0gYWRqdXN0LT5uZXh0KQotCSAgICBpZiAoZmRyX2FkciA+PSBhZGp1c3QtPnN0YXJ0Ci0JCSYmIGZkcl9hZHIgPCBhZGp1c3QtPmVuZCkKLQkgICAgICBmZHIuYWRyICs9IGFkanVzdC0+YWRqdXN0OwotCX0KLQotICAgICAgLyogRklYTUU6IEl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgdGhpcyBGRFIgcG9pbnRzIHRvIHRoZSAuaW5pdCBvcgotCSAuZmluaSBzZWN0aW9uLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBub3QgZG8gdGhlIHJpZ2h0Ci0JIHRoaW5nLiAgKi8KLSAgICAgIGZkci5hZHIgKz0gc2VjdGlvbl9hZGp1c3Rbc2NUZXh0XTsKLQotICAgICAgLyogU3dhcCBpbiB0aGUgbG9jYWwgc3ltYm9scywgYWRqdXN0IHRoZWlyIHZhbHVlcywgYW5kIHN3YXAgdGhlbQotCSBvdXQgYWdhaW4uICAqLwotICAgICAgZmdvdGZpbGVuYW1lID0gZmFsc2U7Ci0gICAgICBzeiA9IGZkci5jc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBzeW1fb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0gICAgICBpZiAoIXN5bV9vdXQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnN5bSwgJmFpbmZvLT5zeW1fZW5kLCBzeW1fb3V0LAotCQkJICAgICAgIHN6KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBscmF3X3NyYyA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3N5bQotCQkgICsgZmRyLmlzeW1CYXNlICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgbHJhd19lbmQgPSBscmF3X3NyYyArIGZkci5jc3ltICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBmb3IgKDsgIGxyYXdfc3JjIDwgbHJhd19lbmQ7ICBscmF3X3NyYyArPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSkKLQl7Ci0JICBTWU1SIGludGVybmFsX3N5bTsKLQotCSAgKCpzd2FwX3N5bV9pbikgKGlucHV0X2JmZCwgKFBUUikgbHJhd19zcmMsICZpbnRlcm5hbF9zeW0pOwotCi0JICBCRkRfQVNTRVJUIChpbnRlcm5hbF9zeW0uc2MgIT0gc2NDb21tb24KLQkJICAgICAgJiYgaW50ZXJuYWxfc3ltLnNjICE9IHNjU0NvbW1vbik7Ci0KLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgIHN3aXRjaCAoaW50ZXJuYWxfc3ltLnN0KQotCSAgICB7Ci0JICAgIGNhc2Ugc3ROaWw6Ci0JICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZpbnRlcm5hbF9zeW0pKQotCQlicmVhazsKLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIHN0R2xvYmFsOgotCSAgICBjYXNlIHN0U3RhdGljOgotCSAgICBjYXNlIHN0TGFiZWw6Ci0JICAgIGNhc2Ugc3RQcm9jOgotCSAgICBjYXNlIHN0U3RhdGljUHJvYzoKLQkgICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCQl7Ci0JCSAgYmZkX3ZtYSB2YWx1ZTsKLQkJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Ci0KLQkJICB2YWx1ZSA9IGludGVybmFsX3N5bS52YWx1ZTsKLQkJICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7Ci0JCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkJICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKLQkJICAgIGlmICh2YWx1ZSA+PSBhZGp1c3QtPnN0YXJ0Ci0JCQkmJiB2YWx1ZSA8IGFkanVzdC0+ZW5kKQotCQkgICAgICBpbnRlcm5hbF9zeW0udmFsdWUgKz0gYWRqdXN0LT5hZGp1c3Q7Ci0JCX0KLQkgICAgICBpbnRlcm5hbF9zeW0udmFsdWUgKz0gc2VjdGlvbl9hZGp1c3RbaW50ZXJuYWxfc3ltLnNjXTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmssIHdlIGhhc2ggYWxsIHRoZSBzdHJpbmdzIGluCi0JICAgICB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlIHRvZ2V0aGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQKLQkgICAgIG9mIHNwYWNlIHJlcXVpcmVkIGJ5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdlIGRvbid0IGRvCi0JICAgICB0aGlzIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rIGJlY2F1c2UgaXQgd291bGQKLQkgICAgIHByZXZlbnQgdXMgZnJvbSBlYXNpbHkgbWVyZ2luZyBkaWZmZXJlbnQgRkRSJ3MuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBmZmlsZW5hbWU7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIGlmICghIGZnb3RmaWxlbmFtZSAmJiBpbnRlcm5hbF9zeW0uaXNzID09IGZkci5yc3MpCi0JCWZmaWxlbmFtZSA9IHRydWU7Ci0JICAgICAgZWxzZQotCQlmZmlsZW5hbWUgPSBmYWxzZTsKLQotCSAgICAgIC8qIEhhc2ggdGhlIG5hbWUgaW50byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgICAgICBuYW1lID0gaW5wdXRfZGVidWctPnNzICsgZmRyLmlzc0Jhc2UgKyBpbnRlcm5hbF9zeW0uaXNzOwotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQlpbnRlcm5hbF9zeW0uaXNzID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOwotCi0JCSAgc2ggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+c3RyX2hhc2gsIG5hbWUsIHRydWUsIHRydWUpOwotCQkgIGlmIChzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaWYgKHNoLT52YWwgPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIHNoLT52YWwgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7Ci0JCSAgICAgIG91dHB1dF9zeW1oZHItPmlzc01heCArPSBzdHJsZW4gKG5hbWUpICsgMTsKLQkJICAgICAgaWYgKGFpbmZvLT5zc19oYXNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJCWFpbmZvLT5zc19oYXNoID0gc2g7Ci0JCSAgICAgIGlmIChhaW5mby0+c3NfaGFzaF9lbmQKLQkJCSAgIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQkJYWluZm8tPnNzX2hhc2hfZW5kLT5uZXh0ID0gc2g7Ci0JCSAgICAgIGFpbmZvLT5zc19oYXNoX2VuZCA9IHNoOwotCQkgICAgfQotCQkgIGludGVybmFsX3N5bS5pc3MgPSBzaC0+dmFsOwotCQl9Ci0KLQkgICAgICBpZiAoZmZpbGVuYW1lKQotCQl7Ci0JCSAgZmRyLnJzcyA9IGludGVybmFsX3N5bS5pc3M7Ci0JCSAgZmdvdGZpbGVuYW1lID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0KLQkgICgqc3dhcF9zeW1fb3V0KSAob3V0cHV0X2JmZCwgJmludGVybmFsX3N5bSwgc3ltX291dCk7Ci0JICBzeW1fb3V0ICs9IGV4dGVybmFsX3N5bV9zaXplOwotCX0KLQotICAgICAgZmRyLmlzeW1CYXNlID0gb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKLSAgICAgIG91dHB1dF9zeW1oZHItPmlzeW1NYXggKz0gZmRyLmNzeW07Ci0KLSAgICAgIC8qIENvcHkgdGhlIGluZm9ybWF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCBzd2FwcGluZy4gICovCi0KLSAgICAgIC8qIEZJWE1FOiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsaW5lCi0JIG51bWJlcnMuICBGcmFua2x5LCBmb3JnZXQgaXQuICBBbnlib2R5IHVzaW5nIHN0YWJzIGRlYnVnZ2luZwotCSBpbmZvcm1hdGlvbiB3aWxsIG5vdCB1c2UgdGhpcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiwgYW5kCi0JIHN0YWJzIGFyZSBhZGp1c3RlZCBjb3JyZWN0bHkuICAqLwotICAgICAgaWYgKGZkci5jYkxpbmUgPiAwKQotCXsKLQkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+bGluZSwgJmFpbmZvLT5saW5lX2VuZCwKLQkJCQkgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zeW1oZHItPmNiTGluZU9mZnNldCArIGZkci5jYkxpbmVPZmZzZXQsCi0JCQkJIGZkci5jYkxpbmUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmZHIuaWxpbmVCYXNlID0gb3V0cHV0X3N5bWhkci0+aWxpbmVNYXg7Ci0JICBmZHIuY2JMaW5lT2Zmc2V0ID0gb3V0cHV0X3N5bWhkci0+Y2JMaW5lOwotCSAgb3V0cHV0X3N5bWhkci0+aWxpbmVNYXggKz0gZmRyLmNsaW5lOwotCSAgb3V0cHV0X3N5bWhkci0+Y2JMaW5lICs9IGZkci5jYkxpbmU7Ci0JfQotICAgICAgaWYgKGZkci5jYXV4ID4gMCkKLQl7Ci0JICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPmF1eCwgJmFpbmZvLT5hdXhfZW5kLAotCQkJCSBpbnB1dF9iZmQsCi0JCQkJIChpbnB1dF9zeW1oZHItPmNiQXV4T2Zmc2V0Ci0JCQkJICArIGZkci5pYXV4QmFzZSAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpLAotCQkJCSBmZHIuY2F1eCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmZHIuaWF1eEJhc2UgPSBvdXRwdXRfc3ltaGRyLT5pYXV4TWF4OwotCSAgb3V0cHV0X3N5bWhkci0+aWF1eE1heCArPSBmZHIuY2F1eDsKLQl9Ci0gICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCi0JICAvKiBXaGVuIGFyZSBhcmUgaGFzaGluZyBzdHJpbmdzLCB3ZSBsaWUgYWJvdXQgdGhlIG51bWJlciBvZgotCSAgICAgc3RyaW5ncyBhdHRhY2hlZCB0byBlYWNoIEZEUi4gIFdlIG5lZWQgdG8gc2V0IGNiU3MKLQkgICAgIGJlY2F1c2Ugc29tZSB2ZXJzaW9ucyBvZiBkYnggYXBwYXJlbnRseSB1c2UgaXQgdG8gZGVjaWRlCi0JICAgICBob3cgbXVjaCBvZiB0aGUgc3RyaW5nIHRhYmxlIHRvIHJlYWQgaW4uICAqLwotCSAgZmRyLmlzc0Jhc2UgPSAwOwotCSAgZmRyLmNiU3MgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7Ci0JfQotICAgICAgZWxzZSBpZiAoZmRyLmNiU3MgPiAwKQotCXsKLQkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3MsICZhaW5mby0+c3NfZW5kLAotCQkJCSBpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3N5bWhkci0+Y2JTc09mZnNldCArIGZkci5pc3NCYXNlLAotCQkJCSBmZHIuY2JTcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGZkci5pc3NCYXNlID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OwotCSAgb3V0cHV0X3N5bWhkci0+aXNzTWF4ICs9IGZkci5jYlNzOwotCX0KLQotICAgICAgaWYgKChvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCi0JICAgPT0gaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKQotCSAgJiYgaW5wdXRfZGVidWctPmFkanVzdCA9PSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCXsKLQkgIC8qIFRoZSB0d28gQkZEJ3MgaGF2ZSB0aGUgc2FtZSBlbmRpYW5uZXNzLCBhbmQgd2UgZG9uJ3QgaGF2ZQotCSAgICAgdG8gYWRqdXN0IHRoZSBQRFIgYWRkcmVzc2VzLCBzbyBzaW1wbHkgY29weWluZyB0aGUKLQkgICAgIGluZm9ybWF0aW9uIHdpbGwgc3VmZmljZS4gICovCi0JICBCRkRfQVNTRVJUIChleHRlcm5hbF9wZHJfc2l6ZSA9PSBpbnB1dF9zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICBpZiAoZmRyLmNwZCA+IDApCi0JICAgIHsKLQkgICAgICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnBkciwgJmFpbmZvLT5wZHJfZW5kLAotCQkJCSAgICAgaW5wdXRfYmZkLAotCQkJCSAgICAgKGlucHV0X3N5bWhkci0+Y2JQZE9mZnNldAotCQkJCSAgICAgICsgZmRyLmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpLAotCQkJCSAgICAgZmRyLmNwZCAqIGV4dGVybmFsX3Bkcl9zaXplKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBCRkRfQVNTRVJUIChleHRlcm5hbF9vcHRfc2l6ZSA9PSBpbnB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0JICBpZiAoZmRyLmNvcHQgPiAwKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5vcHQsICZhaW5mby0+b3B0X2VuZCwKLQkJCQkgICAgIGlucHV0X2JmZCwKLQkJCQkgICAgIChpbnB1dF9zeW1oZHItPmNiT3B0T2Zmc2V0Ci0JCQkJICAgICAgKyBmZHIuaW9wdEJhc2UgKiBleHRlcm5hbF9vcHRfc2l6ZSksCi0JCQkJICAgICBmZHIuY29wdCAqIGV4dGVybmFsX29wdF9zaXplKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zaXplX3R5cGUgb3V0c3osIGluc3o7Ci0JICBiZmRfYnl0ZSAqaW47Ci0JICBiZmRfYnl0ZSAqZW5kOwotCSAgYmZkX2J5dGUgKm91dDsKLQotCSAgLyogVGhlIHR3byBCRkQncyBoYXZlIGRpZmZlcmVudCBlbmRpYW5uZXNzLCBzbyB3ZSBtdXN0IHN3YXAKLQkgICAgIGV2ZXJ5dGhpbmcgaW4gYW5kIG91dC4gIFRoaXMgY29kZSB3b3VsZCBhbHdheXMgd29yaywgYnV0Ci0JICAgICBpdCB3b3VsZCBiZSB1bm5lY2Vzc2FyaWx5IHNsb3cgaW4gdGhlIG5vcm1hbCBjYXNlLiAgKi8KLQkgIG91dHN6ID0gZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICBpbnN6ID0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICBpbiA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3BkcgotCQkrIGZkci5pcGRGaXJzdCAqIGluc3opOwotCSAgZW5kID0gaW4gKyBmZHIuY3BkICogaW5zejsKLQkgIHN6ID0gZmRyLmNwZCAqIG91dHN6OwotCSAgb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0JICBpZiAoIW91dCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnBkciwgJmFpbmZvLT5wZHJfZW5kLCBvdXQsCi0JCQkJICAgc3opKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmb3IgKDsgaW4gPCBlbmQ7IGluICs9IGluc3osIG91dCArPSBvdXRzeikKLQkgICAgewotCSAgICAgIFBEUiBwZHI7Ci0KLQkgICAgICAoKmlucHV0X3N3YXAtPnN3YXBfcGRyX2luKSAoaW5wdXRfYmZkLCAoUFRSKSBpbiwgJnBkcik7Ci0KLQkgICAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gcmVsYXhpbmcsIHdlIG1heSBoYXZlIHRvIGFkanVzdCB0aGUKLQkJIGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+YWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCi0JCXsKLQkJICBiZmRfdm1hIGFkcjsKLQkJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Ci0KLQkJICBhZHIgPSBmZHJfYWRyICsgcGRyLmFkcjsKLQkJICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7Ci0JCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkJICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKLQkJICAgIGlmIChhZHIgPj0gYWRqdXN0LT5zdGFydAotCQkJJiYgYWRyIDwgYWRqdXN0LT5lbmQpCi0JCSAgICAgIHBkci5hZHIgKz0gYWRqdXN0LT5hZGp1c3Q7Ci0JCX0KLQotCSAgICAgICgqb3V0cHV0X3N3YXAtPnN3YXBfcGRyX291dCkgKG91dHB1dF9iZmQsICZwZHIsIChQVFIpIG91dCk7Ci0JICAgIH0KLQotCSAgLyogU3dhcCBvdmVyIHRoZSBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24uICAqLwotCSAgb3V0c3ogPSBleHRlcm5hbF9vcHRfc2l6ZTsKLQkgIGluc3ogPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZTsKLQkgIGluID0gKChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZXh0ZXJuYWxfb3B0Ci0JCSsgZmRyLmlvcHRCYXNlICogaW5zeik7Ci0JICBlbmQgPSBpbiArIGZkci5jb3B0ICogaW5zejsKLQkgIHN6ID0gZmRyLmNvcHQgKiBvdXRzejsKLQkgIG91dCA9IChiZmRfYnl0ZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwgc3opOwotCSAgaWYgKCFvdXQpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5vcHQsICZhaW5mby0+b3B0X2VuZCwgb3V0LAotCQkJCSAgIHN6KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZm9yICg7IGluIDwgZW5kOyBpbiArPSBpbnN6LCBvdXQgKz0gb3V0c3opCi0JICAgIHsKLQkgICAgICBPUFRSIG9wdDsKLQotCSAgICAgICgqaW5wdXRfc3dhcC0+c3dhcF9vcHRfaW4pIChpbnB1dF9iZmQsIChQVFIpIGluLCAmb3B0KTsKLQkgICAgICAoKm91dHB1dF9zd2FwLT5zd2FwX29wdF9vdXQpIChvdXRwdXRfYmZkLCAmb3B0LCAoUFRSKSBvdXQpOwotCSAgICB9Ci0JfQotCi0gICAgICBmZHIuaXBkRmlyc3QgPSBvdXRwdXRfc3ltaGRyLT5pcGRNYXg7Ci0gICAgICBvdXRwdXRfc3ltaGRyLT5pcGRNYXggKz0gZmRyLmNwZDsKLSAgICAgIGZkci5pb3B0QmFzZSA9IG91dHB1dF9zeW1oZHItPmlvcHRNYXg7Ci0gICAgICBvdXRwdXRfc3ltaGRyLT5pb3B0TWF4ICs9IGZkci5jb3B0OwotCi0gICAgICBpZiAoZmRyLmNyZmQgPD0gMCkKLQl7Ci0JICAvKiBQb2ludCB0aGlzIEZEUiBhdCB0aGUgdGFibGUgb2YgUkZEJ3Mgd2UgY3JlYXRlZC4gICovCi0JICBmZHIucmZkQmFzZSA9IG5ld3JmZGJhc2U7Ci0JICBmZHIuY3JmZCA9IGlucHV0X3N5bWhkci0+aWZkTWF4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQb2ludCB0aGlzIEZEUiBhdCB0aGUgcmVtYXBwZWQgUkZEJ3MuICAqLwotCSAgZmRyLnJmZEJhc2UgKz0gb2xkcmZkYmFzZTsKLQl9Ci0KLSAgICAgICgqc3dhcF9mZHJfb3V0KSAob3V0cHV0X2JmZCwgJmZkciwgZmRyX291dCk7Ci0gICAgICBmZHJfb3V0ICs9IGV4dGVybmFsX2Zkcl9zaXplOwotICAgICAgKytvdXRwdXRfc3ltaGRyLT5pZmRNYXg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBzdHJpbmcgdG8gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3ZSBhcmUgYWNjdW11bGF0aW5nLgotICAgUmV0dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmRyIHN0cmluZyBiYXNlLiAgKi8KLQotc3RhdGljIGxvbmcgZWNvZmZfYWRkX3N0cmluZyBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAotCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiwKLQkJCQkgICAgICBGRFIgKmZkciwgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLXN0YXRpYyBsb25nCi1lY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgZGVidWcsIGZkciwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIEZEUiAqZmRyOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIEhEUlIgKnN5bWhkcjsKLSAgc2l6ZV90IGxlbjsKLSAgYmZkX3NpemVfdHlwZSByZXQ7Ci0KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3MsICZhaW5mby0+c3NfZW5kLCAoUFRSKSBzdHJpbmcsCi0JCQkgICAgICAgbGVuICsgMSkpCi0JcmV0dXJuIC0xOwotICAgICAgcmV0ID0gc3ltaGRyLT5pc3NNYXg7Ci0gICAgICBzeW1oZHItPmlzc01heCArPSBsZW4gKyAxOwotICAgICAgZmRyLT5jYlNzICs9IGxlbiArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLQotICAgICAgc2ggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+c3RyX2hhc2gsIHN0cmluZywgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBpZiAoc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChzaC0+dmFsID09IC0xKQotCXsKLQkgIHNoLT52YWwgPSBzeW1oZHItPmlzc01heDsKLQkgIHN5bWhkci0+aXNzTWF4ICs9IGxlbiArIDE7Ci0JICBpZiAoYWluZm8tPnNzX2hhc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhaW5mby0+c3NfaGFzaCA9IHNoOwotCSAgaWYgKGFpbmZvLT5zc19oYXNoX2VuZAotCSAgICAgICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgYWluZm8tPnNzX2hhc2hfZW5kLT5uZXh0ID0gc2g7Ci0JICBhaW5mby0+c3NfaGFzaF9lbmQgPSBzaDsKLQl9Ci0gICAgICByZXQgPSBzaC0+dmFsOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBZGQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBub24tRUNPRkYgZmlsZS4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1ZywKLQkJCQkgIG91dHB1dF9zd2FwLCBpbnB1dF9iZmQsIGluZm8pCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKQotICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfc3ltX291dDsKLSAgSERSUiAqb3V0cHV0X3N5bWhkciA9ICZvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgRkRSIGZkcjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gIGFzeW1ib2wgKipzeW1fcHRyOwotICBhc3ltYm9sICoqc3ltX2VuZDsKLSAgbG9uZyBzeW1zaXplOwotICBsb25nIHN5bWNvdW50OwotICBQVFIgZXh0ZXJuYWxfZmRyOwotCi0gIG1lbXNldCAoKFBUUikgJmZkciwgMCwgc2l6ZW9mIGZkcik7Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi50ZXh0Iik7Ci0gIGlmIChzZWMgIT0gTlVMTCkKLSAgICBmZHIuYWRyID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUU6IFdoYXQgYWJvdXQgLmluaXQgb3IgLmZpbmk/ICAqLwotICAgICAgZmRyLmFkciA9IDA7Ci0gICAgfQotCi0gIGZkci5pc3NCYXNlID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OwotICBmZHIuY2JTcyA9IDA7Ci0gIGZkci5yc3MgPSBlY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgb3V0cHV0X2RlYnVnLCAmZmRyLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0gIGlmIChmZHIucnNzID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgZmRyLmlzeW1CYXNlID0gb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKLQotICAvKiBHZXQgdGhlIGxvY2FsIHN5bWJvbHMgZnJvbSB0aGUgaW5wdXQgQkZELiAgKi8KLSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQpOwotICBpZiAoc3ltc2l6ZSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc3ltc2l6ZSk7Ci0gIGlmIChzeW1ib2xzID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaW5wdXRfYmZkLCBzeW1ib2xzKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bV9lbmQgPSBzeW1ib2xzICsgc3ltY291bnQ7Ci0KLSAgLyogSGFuZGxlIHRoZSBsb2NhbCBzeW1ib2xzLiAgQW55IGV4dGVybmFsIHN5bWJvbHMgYXJlIGhhbmRsZWQKLSAgICAgc2VwYXJhdGVseS4gICovCi0gIGZkci5jc3ltID0gMDsKLSAgZm9yIChzeW1fcHRyID0gc3ltYm9sczsgc3ltX3B0ciAhPSBzeW1fZW5kOyBzeW1fcHRyKyspCi0gICAgewotICAgICAgU1lNUiBpbnRlcm5hbF9zeW07Ci0gICAgICBQVFIgZXh0ZXJuYWxfc3ltOwotCi0gICAgICBpZiAoKCgqc3ltX3B0ciktPmZsYWdzICYgQlNGX0VYUE9SVCkgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIG1lbXNldCAoKFBUUikgJmludGVybmFsX3N5bSwgMCwgc2l6ZW9mIGludGVybmFsX3N5bSk7Ci0gICAgICBpbnRlcm5hbF9zeW0uaXNzID0gZWNvZmZfYWRkX3N0cmluZyAoYWluZm8sIGluZm8sIG91dHB1dF9kZWJ1ZywgJmZkciwKLQkJCQkJICAgKCpzeW1fcHRyKS0+bmFtZSk7Ci0KLSAgICAgIGlmIChpbnRlcm5hbF9zeW0uaXNzID09IC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKCgqc3ltX3B0ciktPnNlY3Rpb24pCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKCgqc3ltX3B0ciktPnNlY3Rpb24pKQotCWludGVybmFsX3N5bS52YWx1ZSA9ICgqc3ltX3B0ciktPnZhbHVlOwotICAgICAgZWxzZQotCWludGVybmFsX3N5bS52YWx1ZSA9ICgoKnN5bV9wdHIpLT52YWx1ZQotCQkJICAgICAgKyAoKnN5bV9wdHIpLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICArICgqc3ltX3B0ciktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgaW50ZXJuYWxfc3ltLnN0ID0gc3ROaWw7Ci0gICAgICBpbnRlcm5hbF9zeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgIGludGVybmFsX3N5bS5pbmRleCA9IGluZGV4TmlsOwotCi0gICAgICBleHRlcm5hbF9zeW0gPSAoUFRSKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKLQkJCQkJICAgb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIGlmICghZXh0ZXJuYWxfc3ltKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICgqc3dhcF9zeW1fb3V0KSAob3V0cHV0X2JmZCwgJmludGVybmFsX3N5bSwgZXh0ZXJuYWxfc3ltKTsKLSAgICAgIGFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3ltLCAmYWluZm8tPnN5bV9lbmQsCi0JCQkgIGV4dGVybmFsX3N5bSwgb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgICsrZmRyLmNzeW07Ci0gICAgICArK291dHB1dF9zeW1oZHItPmlzeW1NYXg7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChvdXRwdXRfYmZkLCAoUFRSKSBzeW1ib2xzKTsKLQotICAvKiBMZWF2ZSBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIEZEUiB6ZXJvZWQgb3V0LiAgVGhpcyB3aWxsIGNhdXNlCi0gICAgIHRoZSBsYW5nIGZpZWxkIHRvIGJlIGxhbmdDLiAgVGhlIGZCaWdlbmRpYW4gZmllbGQgd2lsbAotICAgICBpbmRpY2F0ZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UKLSAgICAgaXQgb25seSBhcHBsaWVzIHRvIGF1eCBmaWVsZHMgYW5kIHRoZXJlIGFyZSBub25lLiAgKi8KLSAgZXh0ZXJuYWxfZmRyID0gKFBUUikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJICAgICAgIG91dHB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIGlmICghZXh0ZXJuYWxfZmRyKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKCpvdXRwdXRfc3dhcC0+c3dhcF9mZHJfb3V0KSAob3V0cHV0X2JmZCwgJmZkciwgZXh0ZXJuYWxfZmRyKTsKLSAgYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5mZHIsICZhaW5mby0+ZmRyX2VuZCwKLQkJICAgICAgZXh0ZXJuYWxfZmRyLCBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotCi0gICsrb3V0cHV0X3N5bWhkci0+aWZkTWF4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdXAgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4KLSAgIEZJWE1FOiBUaGlzIGlzIGRvbmUgdXNpbmcgYSBtZW1vcnkgYnVmZmVyLCBidXQgaXQgc2hvdWxkIGJlCi0gICBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvIHVzZSBhIHNodWZmbGUgc3RydWN0dXJlLiAgVGhlIGFzc2VtYmxlciB1c2VzCi0gICB0aGlzIGludGVyZmFjZSwgc28gdGhhdCBtdXN0IGJlIGNoYW5nZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChhYmZkLCBkZWJ1Zywgc3dhcCwgcmVsb2NhdGVhYmxlLCBnZXRfZXh0ciwKLQkJCSAgIHNldF9pbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYm9vbGVhbiAoKmdldF9leHRyKSBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotICAgICB2b2lkICgqc2V0X2luZGV4KSBQQVJBTVMgKChhc3ltYm9sICosIGJmZF9zaXplX3R5cGUpKTsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7Ci0gIHNpemVfdCBjOwotCi0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bV9wdHJfcHRyID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChjID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltX3B0cjsKLSAgICAgIEVYVFIgZXN5bTsKLQotICAgICAgc3ltX3B0ciA9ICpzeW1fcHRyX3B0cjsKLQotICAgICAgLyogR2V0IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCgqZ2V0X2V4dHIpIChzeW1fcHRyLCAmZXN5bSkgPT0gZmFsc2UpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlJ3JlIHByb2R1Y2luZyBhbiBleGVjdXRhYmxlLCBtb3ZlIGNvbW1vbiBzeW1ib2xzIGludG8KLQkgYnNzLiAgKi8KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgPT0gZmFsc2UpCi0JewotCSAgaWYgKGVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQkgICAgZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0JICBlbHNlIGlmIChlc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotCSAgICBlc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0JfQotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1fcHRyLT5zZWN0aW9uKQotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1fcHRyLT5zZWN0aW9uKQotCSAgfHwgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgLyogRklYTUU6IGdhcyBkb2VzIG5vdCBrZWVwIHRoZSB2YWx1ZSBvZiBhIHNtYWxsIHVuZGVmaW5lZAotCSAgICAgc3ltYm9sIGluIHRoZSBzeW1ib2wgaXRzZWxmLCBiZWNhdXNlIG9mIHJlbG9jYXRpb24KLQkgICAgIHByb2JsZW1zLiAgKi8KLQkgIGlmIChlc3ltLmFzeW0uc2MgIT0gc2NTVW5kZWZpbmVkCi0JICAgICAgfHwgZXN5bS5hc3ltLnZhbHVlID09IDAKLQkgICAgICB8fCBzeW1fcHRyLT52YWx1ZSAhPSAwKQotCSAgICBlc3ltLmFzeW0udmFsdWUgPSBzeW1fcHRyLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JZXN5bS5hc3ltLnZhbHVlID0gKHN5bV9wdHItPnZhbHVlCi0JCQkgICArIHN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgICAgIGlmIChzZXRfaW5kZXgpCi0JKCpzZXRfaW5kZXgpIChzeW1fcHRyLCAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pZXh0TWF4KTsKLQotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgZGVidWcsIHN3YXAsCi0JCQkJCSAgc3ltX3B0ci0+bmFtZSwgJmVzeW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHNpbmdsZSBleHRlcm5hbCBzeW1ib2wgdG8gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsIGRlYnVnLCBzd2FwLCBuYW1lLCBlc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVYVFIgKmVzeW07Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpCi0gICAgPSBzd2FwLT5zd2FwX2V4dF9vdXQ7Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgc2l6ZV90IG5hbWVsZW47Ci0KLSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgaWYgKChzaXplX3QpIChkZWJ1Zy0+c3NleHRfZW5kIC0gZGVidWctPnNzZXh0KQotICAgICAgPCBzeW1oZHItPmlzc0V4dE1heCArIG5hbWVsZW4gKyAxKQotICAgIHsKLSAgICAgIGlmIChlY29mZl9hZGRfYnl0ZXMgKChjaGFyICoqKSAmZGVidWctPnNzZXh0LAotCQkJICAgKGNoYXIgKiopICZkZWJ1Zy0+c3NleHRfZW5kLAotCQkJICAgc3ltaGRyLT5pc3NFeHRNYXggKyBuYW1lbGVuICsgMSkKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoc2l6ZV90KSAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dF9lbmQKLQkJLSAoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KQotICAgICAgPCAoc3ltaGRyLT5pZXh0TWF4ICsgMSkgKiBleHRlcm5hbF9leHRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoZWNvZmZfYWRkX2J5dGVzICgoY2hhciAqKikgJmRlYnVnLT5leHRlcm5hbF9leHQsCi0JCQkgICAoY2hhciAqKikgJmRlYnVnLT5leHRlcm5hbF9leHRfZW5kLAotCQkJICAgKHN5bWhkci0+aWV4dE1heCArIDEpICogZXh0ZXJuYWxfZXh0X3NpemUpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVzeW0tPmFzeW0uaXNzID0gc3ltaGRyLT5pc3NFeHRNYXg7Ci0KLSAgKCpzd2FwX2V4dF9vdXQpIChhYmZkLCBlc3ltLAotCQkgICAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dAotCQkgICAgKyBzeW1oZHItPmlleHRNYXggKiBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOwotCi0gICsrc3ltaGRyLT5pZXh0TWF4OwotCi0gIHN0cmNweSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgsIG5hbWUpOwotICBzeW1oZHItPmlzc0V4dE1heCArPSBuYW1lbGVuICsgMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxpZ24gdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYmZkX3NpemVfdHlwZSBkZWJ1Z19hbGlnbiwgYXV4X2FsaWduLCByZmRfYWxpZ247Ci0gIHNpemVfdCBhZGQ7Ci0KLSAgLyogQWRqdXN0IHRoZSBjb3VudHMgc28gdGhhdCBzdHJ1Y3R1cmVzIGFyZSBhbGlnbmVkLiAgKi8KLSAgZGVidWdfYWxpZ24gPSBzd2FwLT5kZWJ1Z19hbGlnbjsKLSAgYXV4X2FsaWduID0gZGVidWdfYWxpZ24gLyBzaXplb2YgKHVuaW9uIGF1eF9leHQpOwotICByZmRfYWxpZ24gPSBkZWJ1Z19hbGlnbiAvIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplOwotCi0gIGFkZCA9IGRlYnVnX2FsaWduIC0gKHN5bWhkci0+Y2JMaW5lICYgKGRlYnVnX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGRlYnVnX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+bGluZSAhPSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5saW5lICsgc3ltaGRyLT5jYkxpbmUpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5jYkxpbmUgKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmlzc01heCAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPnNzICE9IChjaGFyICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPnNzICsgc3ltaGRyLT5pc3NNYXgpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5pc3NNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmlzc0V4dE1heCAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPnNzZXh0ICE9IChjaGFyICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5pc3NFeHRNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBhdXhfYWxpZ24gLSAoc3ltaGRyLT5pYXV4TWF4ICYgKGF1eF9hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBhdXhfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9hdXggIT0gKHVuaW9uIGF1eF9leHQgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICsgc3ltaGRyLT5pYXV4TWF4KSwgMCwKLQkJYWRkICogc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gICAgICBzeW1oZHItPmlhdXhNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSByZmRfYWxpZ24gLSAoc3ltaGRyLT5jcmZkICYgKHJmZF9hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSByZmRfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gKFBUUikgTlVMTCkKLQltZW1zZXQgKChQVFIpICgoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkCi0JCSAgICAgICArIHN5bWhkci0+Y3JmZCAqIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKSwKLQkJMCwgKHNpemVfdCkgKGFkZCAqIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKSk7Ci0gICAgICBzeW1oZHItPmNyZmQgKz0gYWRkOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBzaXplIHJlcXVpcmVkIGJ5IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1iZmRfc2l6ZV90eXBlCi1iZmRfZWNvZmZfZGVidWdfc2l6ZSAoYWJmZCwgZGVidWcsIHN3YXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLXsKLSAgYmZkX3NpemVfdHlwZSB0b3Q7Ci0KLSAgZWNvZmZfYWxpZ25fZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwKTsKLSAgdG90ID0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemU7Ci0KLSNkZWZpbmUgQUREKGNvdW50LCBzaXplKSBcCi0gIHRvdCArPSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNvdW50ICogc2l6ZQotCi0gIEFERCAoY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgQUREIChpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplKTsKLSAgQUREIChpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgQUREIChpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gIEFERCAoaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOwotICBBREQgKGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBBREQgKGlzc01heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIEFERCAoaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgQUREIChpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgQUREIChjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSk7Ci0gIEFERCAoaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgQURECi0KLSAgcmV0dXJuIHRvdDsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBFQ09GRiBzeW1ib2xpYyBoZWFkZXIsIGdpdmVuIHRoZSBmaWxlIHBvc2l0aW9uIGl0IGlzCi0gICBnb2luZyB0byBiZSBwbGFjZWQgYXQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY291bnRzIGFyZSBzZXQKLSAgIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBjaGFyICpidWZmID0gTlVMTDsKLQotICBlY29mZl9hbGlnbl9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXApOwotCi0gIC8qIEdvIHRvIHRoZSByaWdodCBsb2NhdGlvbiBpbiB0aGUgZmlsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgd2hlcmUsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICB3aGVyZSArPSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZTsKLQotICBzeW1oZHItPm1hZ2ljID0gc3dhcC0+c3ltX21hZ2ljOwotCi0gIC8qIEZpbGwgaW4gdGhlIGZpbGUgb2Zmc2V0cy4gICovCi0jZGVmaW5lIFNFVChvZmZzZXQsIGNvdW50LCBzaXplKSBcCi0gIGlmIChzeW1oZHItPmNvdW50ID09IDApIFwKLSAgICBzeW1oZHItPm9mZnNldCA9IDA7IFwKLSAgZWxzZSBcCi0gICAgeyBcCi0gICAgICBzeW1oZHItPm9mZnNldCA9IHdoZXJlOyBcCi0gICAgICB3aGVyZSArPSBzeW1oZHItPmNvdW50ICogc2l6ZTsgXAotICAgIH0KLQotICBTRVQgKGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgU0VUIChjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplKTsKLSAgU0VUIChjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgU0VUIChjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICBTRVQgKGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIFNFVCAoY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBTRVQgKGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgU0VUIChjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOwotICBTRVQgKGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0jdW5kZWYgU0VUCi0KLSAgYnVmZiA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKTsKLSAgaWYgKGJ1ZmYgPT0gTlVMTCAmJiBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICgqc3dhcC0+c3dhcF9oZHJfb3V0KSAoYWJmZCwgc3ltaGRyLCBidWZmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUsIGFiZmQpCi0gICAgICAhPSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYnVmZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1ZmYpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMKLSAgIHRoYXQgdGhlIGluZm9ybWF0aW9uICh0aGUgcG9pbnRlcnMgYW5kIGNvdW50cykgaW4gKkRFQlVHIGhhdmUgYmVlbgotICAgc2V0IGNvcnJlY3RseS4gIFdIRVJFIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byB3cml0ZSB0aGUKLSAgIGluZm9ybWF0aW9uIHRvLiAgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZmlsZSBvZmZzZXRzIGluIHRoZQotICAgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgZmlsZV9wdHIgd2hlcmU7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLQotICBpZiAoISBlY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jZGVmaW5lIFdSSVRFKHB0ciwgY291bnQsIHNpemUsIG9mZnNldCkgXAotICBCRkRfQVNTRVJUIChzeW1oZHItPm9mZnNldCA9PSAwIFwKLQkgICAgICB8fCAoYmZkX3ZtYSkgYmZkX3RlbGwgKGFiZmQpID09IHN5bWhkci0+b2Zmc2V0KTsgXAotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWJ1Zy0+cHRyLCBzaXplLCBzeW1oZHItPmNvdW50LCBhYmZkKSBcCi0gICAgICAhPSBzaXplICogc3ltaGRyLT5jb3VudCkgXAotICAgIHJldHVybiBmYWxzZTsKLQotICBXUklURSAobGluZSwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLCBjYkxpbmVPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfZG5yLCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBjYkRuT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX3BkciwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSwgY2JQZE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9zeW0sIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBjYlN5bU9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9vcHQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBjYk9wdE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9hdXgsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksIGNiQXV4T2Zmc2V0KTsKLSAgV1JJVEUgKHNzLCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNiU3NPZmZzZXQpOwotICBXUklURSAoc3NleHQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSwgY2JTc0V4dE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9mZHIsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIGNiRmRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfcmZkLCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgY2JSZmRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfZXh0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgY2JFeHRPZmZzZXQpOwotI3VuZGVmIFdSSVRFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHNodWZmbGUgbGlzdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX3dyaXRlX3NodWZmbGUgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqLAotCQkJCQkgICAgc3RydWN0IHNodWZmbGUgKiwgUFRSIHNwYWNlKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBzaHVmZmxlLCBzcGFjZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgc3RydWN0IHNodWZmbGUgKnNodWZmbGU7Ci0gICAgIFBUUiBzcGFjZTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHNodWZmbGUgKmw7Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0KLSAgdG90YWwgPSAwOwotICBmb3IgKGwgPSBzaHVmZmxlOyBsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBsLT5maWxlcCkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlIChsLT51Lm1lbW9yeSwgMSwgbC0+c2l6ZSwgYWJmZCkgIT0gbC0+c2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGwtPnUuZmlsZS5pbnB1dF9iZmQsIGwtPnUuZmlsZS5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKHNwYWNlLCAxLCBsLT5zaXplLCBsLT51LmZpbGUuaW5wdXRfYmZkKSAhPSBsLT5zaXplCi0JICAgICAgfHwgYmZkX3dyaXRlIChzcGFjZSwgMSwgbC0+c2l6ZSwgYWJmZCkgIT0gbC0+c2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHRvdGFsICs9IGwtPnNpemU7Ci0gICAgfQotCi0gIGlmICgodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGJmZF9ieXRlICpzOwotCi0gICAgICBpID0gc3dhcC0+ZGVidWdfYWxpZ24gLSAodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSk7Ci0gICAgICBzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGkpOwotICAgICAgaWYgKHMgPT0gTlVMTCAmJiBpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKLQl7Ci0JICBmcmVlIChzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdXNpbmcgYWNjdW11bGF0ZWQgbGlua2VyCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAoaGFuZGxlLCBhYmZkLCBkZWJ1Zywgc3dhcCwgaW5mbywgd2hlcmUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICBQVFIgc3BhY2UgPSBOVUxMOwotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3N5bWhkciAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzcGFjZSA9IChQVFIpIGJmZF9tYWxsb2MgKGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSk7Ci0gIGlmIChzcGFjZSA9PSBOVUxMICYmIGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5saW5lLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnBkciwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5zeW0sIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+b3B0LCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPmF1eCwgc3BhY2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUgaXMgd3JpdHRlbiBvdXQgZnJvbSB0aGUgaGFzaCB0YWJsZSBpZiB0aGlzIGlzIGEKLSAgICAgZmluYWwgbGluay4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKTsKLSAgICAgIGlmICghIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5zcywgc3BhY2UpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0gICAgICBiZmRfYnl0ZSBudWxsOwotICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLQotICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKTsKLSAgICAgIG51bGwgPSAwOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJm51bGwsIDEsIDEsIGFiZmQpICE9IDEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICB0b3RhbCA9IDE7Ci0gICAgICBCRkRfQVNTRVJUIChhaW5mby0+c3NfaGFzaCA9PSBOVUxMIHx8IGFpbmZvLT5zc19oYXNoLT52YWwgPT0gMSk7Ci0gICAgICBmb3IgKHNoID0gYWluZm8tPnNzX2hhc2g7Ci0JICAgc2ggIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMOwotCSAgIHNoID0gc2gtPm5leHQpCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgbGVuID0gc3RybGVuIChzaC0+cm9vdC5zdHJpbmcpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc2gtPnJvb3Quc3RyaW5nLCAxLCBsZW4gKyAxLCBhYmZkKSAhPSBsZW4gKyAxKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHRvdGFsICs9IGxlbiArIDE7Ci0JfQotCi0gICAgICBpZiAoKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBiZmRfYnl0ZSAqczsKLQotCSAgaSA9IHN3YXAtPmRlYnVnX2FsaWduIC0gKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpOwotCSAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKLQkgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG1lbXNldCAoKFBUUikgcywgMCwgaSk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLCAxLCBpLCBhYmZkKSAhPSBpKQotCSAgICB7Ci0JICAgICAgZnJlZSAocyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGZyZWUgKHMpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGV4dGVybmFsIHN0cmluZ3MgYW5kIHN5bWJvbCBhcmUgbm90IGNvbnZlcnRlZCBvdmVyIHRvIHVzaW5nCi0gICAgIHNodWZmbGVzLiAgRklYTUU6IFRoZXkgcHJvYmFibHkgc2hvdWxkIGJlLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoZGVidWctPnNzZXh0LCAxLCBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCwgYWJmZCkKLSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgYmZkX2J5dGUgKnM7Ci0KLSAgICAgIGkgPSAoc3dhcC0+ZGVidWdfYWxpZ24KLQkgICAtIChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSk7Ci0gICAgICBzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGkpOwotICAgICAgaWYgKHMgPT0gTlVMTCAmJiBpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKLQl7Ci0JICBmcmVlIChzKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICAgIGZyZWUgKHMpOwotICAgIH0KLQotICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+ZmRyLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnJmZCwgc3BhY2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIEJGRF9BU1NFUlQgKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuY2JFeHRPZmZzZXQgPT0gMAotCSAgICAgIHx8IChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNiRXh0T2Zmc2V0Ci0JCSAgPT0gKGJmZF92bWEpIGJmZF90ZWxsIChhYmZkKSkpOwotCi0gIGlmIChiZmRfd3JpdGUgKGRlYnVnLT5leHRlcm5hbF9leHQsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLAotCQkgZGVidWctPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4LCBhYmZkKQotICAgICAgIT0gZGVidWctPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4ICogc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHNwYWNlICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2UpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHNwYWNlICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2UpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBIYW5kbGUgdGhlIGZpbmRfbmVhcmVzdF9saW5lIGZ1bmN0aW9uIGZvciBib3RoIEVDT0ZGIGFuZCBNSVBTIEVMRgotICAgZmlsZXMuICAqLwotCi0vKiBDb21wYXJlIEZEUiBlbnRyaWVzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotY21wX2ZkcnRhYl9lbnRyeSAobGVmdHAsIHJpZ2h0cCkKLSAgICAgY29uc3QgUFRSIGxlZnRwOwotICAgICBjb25zdCBQVFIgcmlnaHRwOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpscCA9Ci0gICAgKGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKikgbGVmdHA7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnJwID0KLSAgICAoY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqKSByaWdodHA7Ci0KLSAgaWYgKGxwLT5iYXNlX2FkZHIgPCBycC0+YmFzZV9hZGRyKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGxwLT5iYXNlX2FkZHIgPiBycC0+YmFzZV9hZGRyKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotLyogRWFjaCBmaWxlIGRlc2NyaXB0b3IgKEZEUikgaGFzIGEgbWVtb3J5IGFkZHJlc3MsIHRvIHNpbXBsaWZ5Ci0gICBsb29raW5nIHVwIGFuIEZEUiBieSBhZGRyZXNzLCB3ZSBidWlsZCBhIHRhYmxlIGNvdmVyaW5nIGFsbCBGRFJzCi0gICB0aGF0IGhhdmUgYSBsZWFzdCBvbmUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgaW4gdGhlbS4gIFRoZSBmaW5hbAotICAgdGFibGUgd2lsbCBiZSBzb3J0ZWQgYnkgYWRkcmVzcyBzbyB3ZSBjYW4gbG9vayBpdCB1cCB2aWEgYmluYXJ5Ci0gICBzZWFyY2guICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWtfZmRydGFiIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXA7Ci0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLXsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOwotICBGRFIgKmZkcl9wdHI7Ci0gIEZEUiAqZmRyX3N0YXJ0OwotICBGRFIgKmZkcl9lbmQ7Ci0gIGJvb2xlYW4gc3RhYnM7Ci0gIGxvbmcgbGVuOwotCi0gIGZkcl9zdGFydCA9IGRlYnVnX2luZm8tPmZkcjsKLSAgZmRyX2VuZCA9IGZkcl9zdGFydCArIGRlYnVnX2luZm8tPnN5bWJvbGljX2hlYWRlci5pZmRNYXg7Ci0KLSAgLyogRmlyc3QsIGxldCdzIHNlZSBob3cgbG9uZyB0aGUgdGFibGUgbmVlZHMgdG8gYmU6ICovCi0gIGZvciAobGVuID0gMCwgZmRyX3B0ciA9IGZkcl9zdGFydDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoZmRyX3B0ci0+Y3BkID09IDApCS8qIHNraXAgRkRScyB0aGF0IGhhdmUgbm8gUERScyAqLwotCWNvbnRpbnVlOwotICAgICAgKytsZW47Ci0gICAgfQotCi0gIC8qIE5vdywgY3JlYXRlIGFuZCBmaWxsIGluIHRoZSB0YWJsZTogKi8KLQotICBsaW5lX2luZm8tPmZkcnRhYiA9ICgoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSopCi0JCSAgICAgICBiZmRfemFsbG9jIChhYmZkLAotCQkJCSAgIGxlbiAqIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSkpKTsKLSAgaWYgKGxpbmVfaW5mby0+ZmRydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsaW5lX2luZm8tPmZkcnRhYl9sZW4gPSBsZW47Ci0KLSAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7Ci0gIGZvciAoZmRyX3B0ciA9IGZkcl9zdGFydDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoZmRyX3B0ci0+Y3BkID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBmaWxlIGhhcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbgotCSBhIGZpbGUgd2l0aCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZSBzZWNvbmQgbG9jYWwKLQkgc3ltYm9sIGlzIG5hbWVkIEBzdGFicy4gICovCi0gICAgICBzdGFicyA9IGZhbHNlOwotICAgICAgaWYgKGZkcl9wdHItPmNzeW0gPj0gMikKLQl7Ci0JICBjaGFyICpzeW1fcHRyOwotCSAgU1lNUiBzeW07Ci0KLQkgIHN5bV9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCSAgICAgKyAoZmRyX3B0ci0+aXN5bUJhc2UgKyAxKSpkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0JICBpZiAoc3RyY21wIChkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzLAotCQkgICAgICBTVEFCU19TWU1CT0wpID09IDApCi0JICAgIHN0YWJzID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmICghc3RhYnMpCi0JewotCSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLQkgIGNoYXIgKnBkcl9wdHI7Ci0JICBQRFIgcGRyOwotCi0JICBleHRlcm5hbF9wZHJfc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotCi0JICBwZHJfcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3BkcgotCQkgICAgICsgZmRyX3B0ci0+aXBkRmlyc3QgKiBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcik7Ci0JICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgUERSIGlzIHRoZSBvZmZzZXQgb2YgdGhhdAotCSAgICAgcHJvY2VkdXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlsZSBGRFIuICAqLwotCSAgdGFiLT5iYXNlX2FkZHIgPSBmZHJfcHRyLT5hZHIgLSBwZHIuYWRyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBYWFggSSBkb24ndCBrbm93IGFib3V0IHN0YWJzLCBzbyB0aGlzIGlzIGEgZ3Vlc3MKLQkgICAgIChkYXZpZG1AY3MuYXJpem9uYS5lZHUpOiAqLwotCSAgdGFiLT5iYXNlX2FkZHIgPSBmZHJfcHRyLT5hZHI7Ci0JfQotICAgICAgdGFiLT5mZHIgPSBmZHJfcHRyOwotICAgICAgKyt0YWI7Ci0gICAgfQotCi0gIC8qIEZpbmFsbHksIHRoZSB0YWJsZSBpcyBzb3J0ZWQgaW4gaW5jcmVhc2luZyBtZW1vcnktYWRkcmVzcyBvcmRlci4KLSAgICAgVGhlIHRhYmxlIGlzIG1vc3RseSBzb3J0ZWQgYWxyZWFkeSwgYnV0IHRoZXJlIGFyZSBjYXNlcyAoZS5nLiwKLSAgICAgc3RhdGljIGZ1bmN0aW9ucyBpbiBpbmNsdWRlIGZpbGVzKSwgd2hlcmUgdGhpcyBkb2VzIG5vdCBob2xkLgotICAgICBVc2UgIm9kdW1wIC1QRnYiIHRvIHZlcmlmeS4uLiAgKi8KLSAgcXNvcnQgKChQVFIpIGxpbmVfaW5mby0+ZmRydGFiLCBsZW4sCi0JIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSksIGNtcF9mZHJ0YWJfZW50cnkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gaW5kZXggb2YgZmlyc3QgRkRSIHRoYXQgY292ZXJzIHRvIE9GRlNFVC4gICovCi0KLXN0YXRpYyBsb25nCi1mZHJ0YWJfbG9va3VwIChsaW5lX2luZm8sIG9mZnNldCkKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotICAgICBiZmRfdm1hIG9mZnNldDsKLXsKLSAgbG9uZyBsb3csIGhpZ2gsIGxlbjsKLSAgbG9uZyBtaWQgPSAtMTsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOwotCi0gIGxlbiA9IGxpbmVfaW5mby0+ZmRydGFiX2xlbjsKLSAgaWYgKGxlbiA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICB0YWIgPSBsaW5lX2luZm8tPmZkcnRhYjsKLSAgZm9yIChsb3cgPSAwLCBoaWdoID0gbGVuIC0gMSA7IGxvdyAhPSBoaWdoIDspCi0gICAgewotICAgICAgbWlkID0gKGhpZ2ggKyBsb3cpIC8gMjsKLSAgICAgIGlmIChvZmZzZXQgPj0gdGFiW21pZF0uYmFzZV9hZGRyICYmIG9mZnNldCA8IHRhYlttaWQgKyAxXS5iYXNlX2FkZHIpCi0JZ290byBmaW5kX21pbjsKLQotICAgICAgaWYgKHRhYlttaWRdLmJhc2VfYWRkciA+IG9mZnNldCkKLQloaWdoID0gbWlkOwotICAgICAgZWxzZQotCWxvdyA9IG1pZCArIDE7Ci0gICAgfQotICArK21pZDsKLQotICAvKiBsYXN0IGVudHJ5IGlzIGNhdGNoLWFsbCBmb3IgYWxsIGhpZ2hlciBhZGRyZXNzZXM6ICovCi0gIGlmIChvZmZzZXQgPCB0YWJbbWlkXS5iYXNlX2FkZHIpCi0gICAgcmV0dXJuIC0xOwotCi0gZmluZF9taW46Ci0KLSAgd2hpbGUgKG1pZCA+IDAgJiYgdGFiW21pZCAtIDFdLmJhc2VfYWRkciA9PSB0YWJbbWlkXS5iYXNlX2FkZHIpCi0gICAgLS1taWQ7Ci0KLSAgcmV0dXJuIG1pZDsKLX0KLQotLyogTG9vayB1cCBhIGxpbmUgZ2l2ZW4gYW4gYWRkcmVzcywgc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gaW4KLSAgIExJTkVfSU5GTy0+Y2FjaGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbG9va3VwX2xpbmUgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcDsKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotewotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICp0YWI7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBib29sZWFuIHN0YWJzOwotICBGRFIgKmZkcl9wdHI7Ci0gIGludCBpOwotICAKLSAgb2Zmc2V0ID0gbGluZV9pbmZvLT5jYWNoZS5zdGFydDsKLSAgICAgCi0gIC8qIEJ1aWxkIEZEUiB0YWJsZSAoc29ydGVkIGJ5IG9iamVjdCBmaWxlJ3MgYmFzZS1hZGRyZXNzKSBpZiB3ZQotICAgICBkb24ndCBoYXZlIGl0IGFscmVhZHkuICAqLwotICBpZiAobGluZV9pbmZvLT5mZHJ0YWIgPT0gTlVMTAotICAgICAgJiYgIW1rX2ZkcnRhYiAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7Ci0KLSAgLyogZmluZCBmaXJzdCBGRFIgZm9yIGFkZHJlc3MgT0ZGU0VUICovCi0gIGkgPSBmZHJ0YWJfbG9va3VwIChsaW5lX2luZm8sIG9mZnNldCk7Ci0gIGlmIChpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7CQkvKiBubyBGRFIsIG5vIGZ1bi4uLiAqLwotICBmZHJfcHRyID0gdGFiW2ldLmZkcjsKLQotICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgZmlsZSBoYXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSW4gYQotICAgICBmaWxlIHdpdGggc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGUgc2Vjb25kIGxvY2FsIHN5bWJvbCBpcwotICAgICBuYW1lZCBAc3RhYnMuICAqLwotICBzdGFicyA9IGZhbHNlOwotICBpZiAoZmRyX3B0ci0+Y3N5bSA+PSAyKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bV9wdHI7Ci0gICAgICBTWU1SIHN5bTsKLQotICAgICAgc3ltX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMSkgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0gICAgICBpZiAoc3RyY21wIChkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzLAotCQkgIFNUQUJTX1NZTUJPTCkgPT0gMCkKLQlzdGFicyA9IHRydWU7Ci0gICAgfQotCi0gIGlmICghc3RhYnMpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLSAgICAgIGNoYXIgKnBkcl9wdHI7Ci0gICAgICBjaGFyICpiZXN0X3BkciA9IE5VTEw7Ci0gICAgICBGRFIgKmJlc3RfZmRyOwotICAgICAgYmZkX3ZtYSBiZXN0X2Rpc3QgPSB+MDsKLSAgICAgIFBEUiBwZHI7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpsaW5lX3B0cjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmxpbmVfZW5kOwotICAgICAgaW50IGxpbmVubzsKLSAgICAgIC8qIFRoaXMgZmlsZSB1c2VzIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEVhY2ggRkRSIGhhcyBhCi0gICAgICAgICBsaXN0IG9mIHByb2NlZHVyZSBkZXNjcmlwdG9ycyAoUERSKS4gIFRoZSBhZGRyZXNzIGluIHRoZSBGRFIKLSAgICAgICAgIGlzIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwcm9jZWR1cmUuICBUaGUgYWRkcmVzcwotICAgICAgICAgaW4gdGhlIGZpcnN0IFBEUiBnaXZlcyB0aGUgb2Zmc2V0IG9mIHRoYXQgcHJvY2VkdXJlIHJlbGF0aXZlCi0gICAgICAgICB0byB0aGUgb2JqZWN0IGZpbGUncyBiYXNlLWFkZHJlc3MuICBUaGUgYWRkcmVzc2VzIGluCi0gICAgICAgICBzdWJzZXF1ZW50IFBEUnMgc3BlY2lmeSBlYWNoIHByb2NlZHVyZSdzIGFkZHJlc3MgcmVsYXRpdmUgdG8KLSAgICAgICAgIHRoZSBvYmplY3QgZmlsZSdzIGJhc2UtYWRkcmVzcy4gIFRvIG1ha2UgdGhpbmdzIG1vcmUganVpY3ksCi0gICAgICAgICB3aGVuZXZlciB0aGUgUFJPRiBiaXQgaW4gdGhlIFBEUiBpcyBzZXQsIHRoZSByZWFsIGVudHJ5IHBvaW50Ci0gICAgICAgICBvZiB0aGUgcHJvY2VkdXJlIG1heSBiZSAxNiBieXRlcyBiZWxvdyB3aGF0IHdvdWxkIG5vcm1hbGx5IGJlCi0gICAgICAgICB0aGUgcHJvY2VkdXJlJ3MgZW50cnkgcG9pbnQuICBJbnN0ZWFkLCBERUMgY2FtZSB1cCB3aXRoIGEKLSAgICAgICAgIHdpY2tlZCBzY2hlbWUgdG8gY3JlYXRlIHByb2ZpbGVkIGxpYnJhcmllcyAib24gdGhlIGZseSI6Ci0gICAgICAgICBpbnN0ZWFkIG9mIHNoaXBwaW5nIGEgcmVndWxhciBhbmQgYSBwcm9maWxlZCB2ZXJzaW9uIG9mIGVhY2gKLSAgICAgICAgIGxpYnJhcnksIHRoZXkgaW5zZXJ0IDE2IGJ5dGVzIG9mIHVudXNlZCBzcGFjZSBpbiBmcm9udCBvZgotICAgICAgICAgZWFjaCBwcm9jZWR1cmUgYW5kIHNldCB0aGUgInByb2YiIGJpdCBpbiB0aGUgUERSIHRvIGluZGljYXRlCi0gICAgICAgICB0aGF0IHRoZXJlIGlzIGEgZ2FwIHRoZXJlICh0aGlzIGlzIGRvbmUgYXV0b21hZ2ljYWxseSBieSAiYXMiCi0gICAgICAgICB3aGVuIG9wdGlvbiAiLXBnIiBpcyBzcGVjaWZpZWQpLiAgVGh1cywgbm9ybWFsbHksIHlvdSBsaW5rCi0gICAgICAgICBhZ2FpbnN0IHN1Y2ggYSBsaWJyYXJ5IGFuZCwgZXhjZXB0IGZvciBsb3RzIG9mIDE2IGJ5dGUgZ2FwcwotICAgICAgICAgYmV0d2VlbiBmdW5jdGlvbnMsIHRoaW5ncyB3aWxsIGJlaGF2ZSBhcyB1c3VhbC4gIEhvd2V2ZXIsCi0gICAgICAgICB3aGVuIGludm9raW5nICJsZCIgd2l0aCBvcHRpb24gIi1wZyIsIGl0IHdpbGwgZmlsbCB0aG9zZSBnYXBzCi0gICAgICAgICB3aXRoIGNvZGUgdGhhdCBjYWxscyBtY291bnQoKS4gIEl0IHRoZW4gbW92ZXMgdGhlIGZ1bmN0aW9uJ3MKLSAgICAgICAgIGVudHJ5IHBvaW50IGRvd24gYnkgMTYgYnl0ZXMsIGFuZCBvdXQgcG9wcyBhIGJpbmFyeSB0aGF0IGhhcwotICAgICAgICAgYWxsIGZ1bmN0aW9ucyBwcm9maWxlZC4KLQotICAgICAgICAgTk9URTogTmVpdGhlciBGRFJzIG5vciBQRFJzIGFyZSBzdHJpY3RseSBzb3J0ZWQgaW4gbWVtb3J5Ci0gICAgICAgICAgICAgICBvcmRlci4gIEZvciBleGFtcGxlLCB3aGVuIGluY2x1ZGluZyBoZWFkZXItZmlsZXMgdGhhdAotICAgICAgICAgICAgICAgZGVmaW5lIGZ1bmN0aW9ucywgdGhlIEZEUnMgZm9sbG93IGJlaGluZCB0aGUgaW5jbHVkaW5nCi0gICAgICAgICAgICAgICBmaWxlLCBldmVuIHRob3VnaCB0aGVpciBjb2RlIG1heSBoYXZlIGJlZW4gZ2VuZXJhdGVkIGF0Ci0gICAgICAgICAgICAgICBhIGxvd2VyIGFkZHJlc3MuICBGaWxlIGNvZmYtYWxwaGEuYyBmcm9tIGxpYmJmZAotICAgICAgICAgICAgICAgaWxsdXN0cmF0ZXMgdGhpcyAodXNlICJvZHVtcCAtUEZ2IiB0byBsb29rIGF0IGEgZmlsZSdzCi0gICAgICAgICAgICAgICBGRFIvUERSKS4gIFNpbWlsYXJseSwgUERScyBhcmUgc29tZXRpbWVzIG91dCBvZiBvcmRlcgotICAgICAgICAgICAgICAgYXMgd2VsbC4gIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBPU0YvMSB2My4wIGxpYmMncwotICAgICAgICAgICAgICAgbWFsbG9jLmMuICBJJ20gbm90IHN1cmUgd2h5IHRoaXMgaGFwcGVucywgYnV0IGl0IGNvdWxkCi0gICAgICAgICAgICAgICBiZSBkdWUgdG8gb3B0aW1pemF0aW9ucyB0aGF0IHJlb3JkZXIgYSBmdW5jdGlvbidzCi0gICAgICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYW4gb2JqZWN0LWZpbGUuCi0gICAgICAgIAotICAgICAgICAgU3RyYXRlZ3k6Ci0gICAgICAgICAKLSAgICAgICAgIE9uIHRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIHdlIGJ1aWxkIGEgdGFibGUgb2YgRkRScwotICAgICAgICAgdGhhdCBpcyBzb3J0ZWQgYnkgdGhlIGJhc2UtYWRkcmVzcyBvZiB0aGUgb2JqZWN0LWZpbGUgdGhlIEZEUgotICAgICAgICAgaXMgcmVmZXJyaW5nIHRvLiAgTm90aWNlIHRoYXQgZWFjaCBvYmplY3QtZmlsZSBtYXkgY29udGFpbgotICAgICAgICAgY29kZSBmcm9tIG11bHRpcGxlIHNvdXJjZSBmaWxlcyAoZS5nLiwgZHVlIHRvIGNvZGUgZGVmaW5lZCBpbgotICAgICAgICAgaW5jbHVkZSBmaWxlcykuICBUaHVzLCBmb3IgYW55IGdpdmVuIGJhc2UtYWRkcmVzcywgdGhlcmUgbWF5Ci0gICAgICAgICBiZSBtdWx0aXBsZSBGRFJzIChidXQgdGhpcyBjYXNlIGlzLCBmb3J0dW5hdGVseSwgdW5jb21tb24pLgotICAgICAgICAgbG9va3VwKGFkZHIpIGd1YXJhbnRlZXMgdG8gcmV0dXJuIHRoZSBmaXJzdCBGRFIgdGhhdCBhcHBsaWVzCi0gICAgICAgICB0byBhZGRyZXNzIEFERFIuICBUaHVzLCBhZnRlciBpbnZva2luZyBsb29rdXAoKSwgd2UgaGF2ZSBhCi0gICAgICAgICBsaXN0IG9mIEZEUnMgdGhhdCBtYXkgY29udGFpbiB0aGUgUERSIGZvciBBRERSLiAgTmV4dCwgd2UKLSAgICAgICAgIHdhbGsgdGhyb3VnaCB0aGUgUERScyBvZiB0aGVzZSBGRFJzIGFuZCBsb2NhdGUgdGhlIG9uZSB0aGF0Ci0gICAgICAgICBpcyBjbG9zZXN0IHRvIEFERFIgKGkuZS4sIGZvciB3aGljaCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICAgICAgICBBRERSIGFuZCB0aGUgUERSJ3MgZW50cnkgcG9pbnQgaXMgcG9zaXRpdmUgYW5kIG1pbmltYWwpLgotICAgICAgICAgT25jZSwgdGhlIHJpZ2h0IEZEUiBhbmQgUERSIGFyZSBsb2NhdGVkLCB3ZSBzaW1wbHkgd2FsawotICAgICAgICAgdGhyb3VnaCB0aGUgbGluZS1udW1iZXIgdGFibGUgdG8gbG9va3VwIHRoZSBsaW5lLW51bWJlciB0aGF0Ci0gICAgICAgICBiZXN0IG1hdGNoZXMgQUREUi4gIE9idmlvdXNseSwgdGhpbmdzIGNvdWxkIGJlIHNwZWQgdXAgYnkKLSAgICAgICAgIGtlZXBpbmcgYSBzb3J0ZWQgbGlzdCBvZiBQRFJzIGluc3RlYWQgb2YgYSBzb3J0ZWQgbGlzdCBvZgotICAgICAgICAgRkRScy4gIEhvd2V2ZXIsIHRoaXMgd291bGQgaW5jcmVhc2Ugc3BhY2UgcmVxdWlyZW1lbnRzCi0gICAgICAgICBjb25zaWRlcmFibHksIHdoaWNoIGlzIHVuZGVzaXJhYmxlLiAgKi8KLSAgICAgIGV4dGVybmFsX3Bkcl9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIG9iamVjdCBmaWxlJ3Mgc3RhcnQtYWRkcmVzczogKi8KLSAgICAgIG9mZnNldCAtPSB0YWJbaV0uYmFzZV9hZGRyOwotICAgICAgLyogU2VhcmNoIEZEUiBsaXN0IHN0YXJ0aW5nIGF0IHRhYltpXSBmb3IgdGhlIFBEUiB0aGF0IGJlc3QgbWF0Y2hlcwotICAgICAgICAgT0ZGU0VULiAgTm9ybWFsbHksIHRoZSBGRFIgbGlzdCBpcyBvbmx5IG9uZSBlbnRyeSBsb25nLiAgKi8KLSAgICAgIGJlc3RfZmRyID0gTlVMTDsKLSAgICAgIGRvCi0JewotCSAgYmZkX3ZtYSBkaXN0LCBtaW5fZGlzdCA9IDA7Ci0JICBjaGFyICpwZHJfaG9sZDsKLQkgIGNoYXIgKnBkcl9lbmQ7Ci0JICAKLQkgIGZkcl9wdHIgPSB0YWJbaV0uZmRyOwotCSAgCi0JICBwZHJfcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3BkcgotCQkgICAgICsgZmRyX3B0ci0+aXBkRmlyc3QgKiBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICBwZHJfZW5kID0gcGRyX3B0ciArIGZkcl9wdHItPmNwZCAqIGV4dGVybmFsX3Bkcl9zaXplOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOwotCSAgLyogRmluZCBQRFIgdGhhdCBpcyBjbG9zZXN0IHRvIE9GRlNFVC4gIElmIHBkci5wcm9mIGlzIHNldCwKLQkgICAgIHRoZSBwcm9jZWR1cmUgZW50cnktcG9pbnQgKm1heSogYmUgMHgxMCBiZWxvdyBwZHIuYWRyLiAgV2UKLQkgICAgIHNpbXBseSBwcmV0ZW5kIHRoYXQgcGRyLnByb2YgKmltcGxpZXMqIGEgbG93ZXIgZW50cnktcG9pbnQuCi0JICAgICBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpdCBqdXN0IG1lYW5zIHRoYXQgbWF5IGlkZW50aWZ5IDQgTk9QcwotCSAgICAgaW4gZnJvbnQgb2YgdGhlIGZ1bmN0aW9uIGFzIGJlbG9uZ2luZyB0byB0aGUgZnVuY3Rpb24uICAqLwotCSAgZm9yIChwZHJfaG9sZCA9IE5VTEw7Ci0JICAgICAgIHBkcl9wdHIgPCBwZHJfZW5kOwotCSAgICAgICAocGRyX3B0ciArPSBleHRlcm5hbF9wZHJfc2l6ZSwKLQkJKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpKSkKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgPj0gKHBkci5hZHIgLSAweDEwICogcGRyLnByb2YpKQotCQl7Ci0JCSAgZGlzdCA9IG9mZnNldCAtIChwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mKTsKLQkJICBpZiAoIXBkcl9ob2xkIHx8IGRpc3QgPCBtaW5fZGlzdCkKLQkJICAgIHsKLQkJICAgICAgbWluX2Rpc3QgPSBkaXN0OwotCQkgICAgICBwZHJfaG9sZCA9IHBkcl9wdHI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgCi0JICBpZiAoIWJlc3RfcGRyIHx8IG1pbl9kaXN0IDwgYmVzdF9kaXN0KQotCSAgICB7Ci0JICAgICAgYmVzdF9kaXN0ID0gbWluX2Rpc3Q7Ci0JICAgICAgYmVzdF9mZHIgPSBmZHJfcHRyOwotCSAgICAgIGJlc3RfcGRyID0gcGRyX2hvbGQ7Ci0JICAgIH0KLQkgIC8qIGNvbnRpbnVlIGxvb3BpbmcgdW50aWwgYmFzZV9hZGRyIG9mIG5leHQgZW50cnkgaXMgZGlmZmVyZW50OiAqLwotCX0KLSAgICAgIHdoaWxlICgrK2kgPCBsaW5lX2luZm8tPmZkcnRhYl9sZW4KLQkgICAgICYmIHRhYltpXS5iYXNlX2FkZHIgPT0gdGFiW2kgLSAxXS5iYXNlX2FkZHIpOwotCi0gICAgICBpZiAoIWJlc3RfZmRyIHx8ICFiZXN0X3BkcikKLQlyZXR1cm4gZmFsc2U7CQkJLyogc2hvdWxkbid0IGhhcHBlbi4uLiAqLwotCi0gICAgICAvKiBwaGV3LCBmaW5hbGx5IHdlIGdvdCBzb21ldGhpbmcgdGhhdCB3ZSBjYW4gaG9sZCBvbnRvOiAqLwotICAgICAgZmRyX3B0ciA9IGJlc3RfZmRyOwotICAgICAgcGRyX3B0ciA9IGJlc3RfcGRyOwotICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOwotICAgICAgLyogTm93IHdlIGNhbiBsb29rIGZvciB0aGUgYWN0dWFsIGxpbmUgbnVtYmVyLiAgVGhlIGxpbmUgbnVtYmVycwotICAgICAgICAgYXJlIHN0b3JlZCBpbiBhIHZlcnkgZnVua3kgZm9ybWF0LCB3aGljaCBJIHdvbid0IHRyeSB0bwotICAgICAgICAgZGVzY3JpYmUuICBUaGUgc2VhcmNoIGlzIGJvdW5kZWQgYnkgdGhlIGVuZCBvZiB0aGUgRkRScyBsaW5lCi0gICAgICAgICBudW1iZXIgZW50cmllcy4gICovCi0gICAgICBsaW5lX2VuZCA9IGRlYnVnX2luZm8tPmxpbmUgKyBmZHJfcHRyLT5jYkxpbmVPZmZzZXQgKyBmZHJfcHRyLT5jYkxpbmU7Ci0KLSAgICAgIC8qIE1ha2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIHByb2NlZHVyZSBlbnRyeTogKi8KLSAgICAgIG9mZnNldCAtPSBwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mOwotICAgICAgbGluZW5vID0gcGRyLmxuTG93OwotICAgICAgbGluZV9wdHIgPSBkZWJ1Z19pbmZvLT5saW5lICsgZmRyX3B0ci0+Y2JMaW5lT2Zmc2V0ICsgcGRyLmNiTGluZU9mZnNldDsKLSAgICAgIHdoaWxlIChsaW5lX3B0ciA8IGxpbmVfZW5kKQotCXsKLQkgIGludCBkZWx0YTsKLQkgIHVuc2lnbmVkIGludCBjb3VudDsKLQotCSAgZGVsdGEgPSAqbGluZV9wdHIgPj4gNDsKLQkgIGlmIChkZWx0YSA+PSAweDgpCi0JICAgIGRlbHRhIC09IDB4MTA7Ci0JICBjb3VudCA9ICgqbGluZV9wdHIgJiAweGYpICsgMTsKLQkgICsrbGluZV9wdHI7Ci0JICBpZiAoZGVsdGEgPT0gLTgpCi0JICAgIHsKLQkgICAgICBkZWx0YSA9ICgoKGxpbmVfcHRyWzBdKSAmIDB4ZmYpIDw8IDgpICsgKChsaW5lX3B0clsxXSkgJiAweGZmKTsKLQkgICAgICBpZiAoZGVsdGEgPj0gMHg4MDAwKQotCQlkZWx0YSAtPSAweDEwMDAwOwotCSAgICAgIGxpbmVfcHRyICs9IDI7Ci0JICAgIH0KLQkgIGxpbmVubyArPSBkZWx0YTsKLQkgIGlmIChvZmZzZXQgPCBjb3VudCAqIDQpCi0JICAgIHsKLQkgICAgICBsaW5lX2luZm8tPmNhY2hlLnN0b3AgKz0gY291bnQgKiA0IC0gb2Zmc2V0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvZmZzZXQgLT0gY291bnQgKiA0OwotCX0KLQotICAgICAgLyogSWYgZmRyX3B0ci0+cnNzIGlzIC0xLCB0aGVuIHRoaXMgZmlsZSBkb2VzIG5vdCBoYXZlIGZ1bGwKLSAgICAgICAgIHN5bWJvbHMsIGF0IGxlYXN0IGFjY29yZGluZyB0byBnZGIvbWlwc3JlYWQuYy4gICovCi0gICAgICBpZiAoZmRyX3B0ci0+cnNzID09IC0xKQotCXsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBOVUxMOwotCSAgaWYgKHBkci5pc3ltID09IC0xKQotCSAgICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBFWFRSIHByb2NfZXh0OwotCi0JICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikKLQkJKGFiZmQsCi0JCSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfZXh0Ci0JCSAgKyBwZHIuaXN5bSAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKSwKLQkJICZwcm9jX2V4dCk7Ci0JICAgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSAoZGVidWdfaW5mby0+c3NleHQKLQkJCQkJICAgICAgICsgcHJvY19leHQuYXN5bS5pc3MpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFNZTVIgcHJvY19zeW07Ci0KLQkgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSAoZGVidWdfaW5mby0+c3MKLQkJCQkgICAgICAgKyBmZHJfcHRyLT5pc3NCYXNlCi0JCQkJICAgICAgICsgZmRyX3B0ci0+cnNzKTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pCi0JICAgIChhYmZkLAotCSAgICAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCSAgICAgICsgKChmZHJfcHRyLT5pc3ltQmFzZSArIHBkci5pc3ltKQotCQkgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSkpLAotCSAgICAgJnByb2Nfc3ltKTsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gKGRlYnVnX2luZm8tPnNzCi0JCQkJCSAgICsgZmRyX3B0ci0+aXNzQmFzZQotCQkJCQkgICArIHByb2Nfc3ltLmlzcyk7Ci0JfQotICAgICAgaWYgKGxpbmVubyA9PSBpbGluZU5pbCkKLQlsaW5lbm8gPSAwOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IGxpbmVubzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplOwotICAgICAgY29uc3QgY2hhciAqZGlyZWN0b3J5X25hbWU7Ci0gICAgICBjb25zdCBjaGFyICptYWluX2ZpbGVfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmN1cnJlbnRfZmlsZV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmxpbmVfZmlsZV9uYW1lOwotICAgICAgYmZkX3ZtYSBsb3dfZnVuY192bWE7Ci0gICAgICBiZmRfdm1hIGxvd19saW5lX3ZtYTsKLSAgICAgIGJvb2xlYW4gcGFzdF9saW5lOwotICAgICAgYm9vbGVhbiBwYXN0X2ZuOwotICAgICAgY2hhciAqc3ltX3B0ciwgKnN5bV9wdHJfZW5kOwotICAgICAgc2l6ZV90IGxlbiwgZnVuY2xlbjsKLSAgICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgIC8qIFRoaXMgZmlsZSB1c2VzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdoZW4gZ2NjIGlzIG5vdAotCSBvcHRpbWl6aW5nLCBpdCB3aWxsIHB1dCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYmVmb3JlCi0JIHRoZSBmdW5jdGlvbiBuYW1lIHN0YWJzIGVudHJ5LiAgV2hlbiBnY2MgaXMgb3B0aW1pemluZywgaXQKLQkgd2lsbCBwdXQgdGhlIHN0YWJzIGVudHJ5IGZvciBhbGwgdGhlIGZ1bmN0aW9uIGZpcnN0LCBmb2xsb3dlZAotCSBieSB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAoVGhpcyBhcHBlYXJzIHRvIGhhcHBlbgotCSBiZWNhdXNlIG9mIHRoZSB0d28gb3V0cHV0IGZpbGVzIHVzZWQgYnkgdGhlIC1tZ3BvcHQgc3dpdGNoLAotCSB3aGljaCBpcyBpbXBsaWVkIGJ5IC1PKS4gIFRoaXMgbWVhbnMgdGhhdCB3ZSBtdXN0IGtlZXAKLQkgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2xzIHVudGlsIHdlIGZpbmQgYm90aCBhIGxpbmUgbnVtYmVyCi0JIGFuZCBhIGZ1bmN0aW9uIG5hbWUgd2hpY2ggYXJlIGJleW9uZCB0aGUgYWRkcmVzcyB3ZSB3YW50LiAgKi8KLQotICAgICAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtID0gMDsKLQotICAgICAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotICAgICAgbWFpbl9maWxlX25hbWUgPSBOVUxMOwotICAgICAgY3VycmVudF9maWxlX25hbWUgPSBOVUxMOwotICAgICAgZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBsb3dfZnVuY192bWEgPSAwOwotICAgICAgbG93X2xpbmVfdm1hID0gMDsKLSAgICAgIHBhc3RfbGluZSA9IGZhbHNlOwotICAgICAgcGFzdF9mbiA9IGZhbHNlOwotCi0gICAgICBleHRlcm5hbF9zeW1fc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotCi0gICAgICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkgKyAoZmRyX3B0ci0+aXN5bUJhc2UgKyAyKSAqIGV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIHN5bV9wdHJfZW5kID0gc3ltX3B0ciArIChmZHJfcHRyLT5jc3ltIC0gMikgKiBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGZvciAoOwotCSAgIHN5bV9wdHIgPCBzeW1fcHRyX2VuZCAmJiAoISBwYXN0X2xpbmUgfHwgISBwYXN0X2ZuKTsKLQkgICBzeW1fcHRyICs9IGV4dGVybmFsX3N5bV9zaXplKQotCXsKLQkgIFNZTVIgc3ltOwotCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0KLQkgIGlmIChFQ09GRl9JU19TVEFCICgmc3ltKSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoRUNPRkZfVU5NQVJLX1NUQUIgKHN5bS5pbmRleCkpCi0JCXsKLQkJY2FzZSBOX1NPOgotCQkgIG1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPQotCQkgICAgZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQotCQkgIC8qIENoZWNrIHRoZSBuZXh0IHN5bWJvbCB0byBzZWUgaWYgaXQgaXMgYWxzbyBhbgotICAgICAgICAgICAgICAgICAgICAgTl9TTyBzeW1ib2wuICAqLwotCQkgIGlmIChzeW1fcHRyICsgZXh0ZXJuYWxfc3ltX3NpemUgPCBzeW1fcHRyX2VuZCkKLQkJICAgIHsKLQkJICAgICAgU1lNUiBuZXh0c3ltOwotCi0JCSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLAotCQkJCQkJICBzeW1fcHRyICsgZXh0ZXJuYWxfc3ltX3NpemUsCi0JCQkJCQkgICZuZXh0c3ltKTsKLQkJICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZuZXh0c3ltKQotCQkJICAmJiBFQ09GRl9VTk1BUktfU1RBQiAobmV4dHN5bS5pbmRleCkgPT0gTl9TTykKLQkJCXsKLSAJCQkgIGRpcmVjdG9yeV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JCQkgIG1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPQotCQkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIG5leHRzeW0uaXNzOwotCQkJICBzeW1fcHRyICs9IGV4dGVybmFsX3N5bV9zaXplOwotCQkJfQotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgTl9TT0w6Ci0JCSAgY3VycmVudF9maWxlX25hbWUgPQotCQkgICAgZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQkJICBicmVhazsKLQotCQljYXNlIE5fRlVOOgotCQkgIGlmIChzeW0udmFsdWUgPiBvZmZzZXQpCi0JCSAgICBwYXN0X2ZuID0gdHJ1ZTsKLQkJICBlbHNlIGlmIChzeW0udmFsdWUgPj0gbG93X2Z1bmNfdm1hKQotCQkgICAgewotCQkgICAgICBsb3dfZnVuY192bWEgPSBzeW0udmFsdWU7Ci0JCSAgICAgIGZ1bmN0aW9uX25hbWUgPQotCQkJZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzeW0uc3QgPT0gc3RMYWJlbCAmJiBzeW0uaW5kZXggIT0gaW5kZXhOaWwpCi0JICAgIHsKLQkgICAgICBpZiAoc3ltLnZhbHVlID4gb2Zmc2V0KQotCQlwYXN0X2xpbmUgPSB0cnVlOwotCSAgICAgIGVsc2UgaWYgKHN5bS52YWx1ZSA+PSBsb3dfbGluZV92bWEpCi0JCXsKLQkJICBsb3dfbGluZV92bWEgPSBzeW0udmFsdWU7Ci0JCSAgbGluZV9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQkJICBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtID0gc3ltLmluZGV4OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtICE9IDApCi0JbWFpbl9maWxlX25hbWUgPSBsaW5lX2ZpbGVfbmFtZTsKLQotICAgICAgLyogV2UgbmVlZCB0byByZW1vdmUgdGhlIHN0dWZmIGFmdGVyIHRoZSBjb2xvbiBpbiB0aGUgZnVuY3Rpb24KLSAgICAgICAgIG5hbWUuICBXZSBhbHNvIG5lZWQgdG8gcHV0IHRoZSBkaXJlY3RvcnkgbmFtZSBhbmQgdGhlIGZpbGUKLSAgICAgICAgIG5hbWUgdG9nZXRoZXIuICAqLwotICAgICAgaWYgKGZ1bmN0aW9uX25hbWUgPT0gTlVMTCkKLQlsZW4gPSBmdW5jbGVuID0gMDsKLSAgICAgIGVsc2UKLQlsZW4gPSBmdW5jbGVuID0gc3RybGVuIChmdW5jdGlvbl9uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChtYWluX2ZpbGVfbmFtZSAhPSBOVUxMCi0JICAmJiBkaXJlY3RvcnlfbmFtZSAhPSBOVUxMCi0JICAmJiBtYWluX2ZpbGVfbmFtZVswXSAhPSAnLycpCi0JbGVuICs9IHN0cmxlbiAoZGlyZWN0b3J5X25hbWUpICsgc3RybGVuIChtYWluX2ZpbGVfbmFtZSkgKyAxOwotCi0gICAgICBpZiAobGVuICE9IDApCi0JewotCSAgaWYgKGxpbmVfaW5mby0+ZmluZF9idWZmZXIgIT0gTlVMTCkKLQkgICAgZnJlZSAobGluZV9pbmZvLT5maW5kX2J1ZmZlcik7Ci0JICBidWZmZXIgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChsZW4pOwotCSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBsaW5lX2luZm8tPmZpbmRfYnVmZmVyID0gYnVmZmVyOwotCX0KLQotICAgICAgaWYgKGZ1bmN0aW9uX25hbWUgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpjb2xvbjsKLQotCSAgc3RyY3B5IChidWZmZXIsIGZ1bmN0aW9uX25hbWUpOwotCSAgY29sb24gPSBzdHJjaHIgKGJ1ZmZlciwgJzonKTsKLQkgIGlmIChjb2xvbiAhPSBOVUxMKQotCSAgICAqY29sb24gPSAnXDAnOwotCSAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBidWZmZXI7Ci0JfQotCi0gICAgICBpZiAobWFpbl9maWxlX25hbWUgIT0gTlVMTCkKLQl7Ci0JICBpZiAoZGlyZWN0b3J5X25hbWUgPT0gTlVMTCB8fCBtYWluX2ZpbGVfbmFtZVswXSA9PSAnLycpCi0JICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBtYWluX2ZpbGVfbmFtZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNwcmludGYgKGJ1ZmZlciArIGZ1bmNsZW4sICIlcyVzIiwgZGlyZWN0b3J5X25hbWUsCi0JCSAgICAgICBtYWluX2ZpbGVfbmFtZSk7Ci0JICAgICAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IGJ1ZmZlciArIGZ1bmNsZW47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEbyB0aGUgd29yayBvZiBmaW5kX25lYXJlc3RfbGluZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwKLQkJCWxpbmVfaW5mbywgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCByZXRsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwOwotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyOwotewotICBvZmZzZXQgKz0gc2VjdGlvbi0+dm1hOwotCi0gIGlmIChsaW5lX2luZm8tPmNhY2hlLnNlY3QgPT0gTlVMTAotICAgICAgfHwgbGluZV9pbmZvLT5jYWNoZS5zZWN0ICE9IHNlY3Rpb24KLSAgICAgIHx8IG9mZnNldCA8IGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQKLSAgICAgIHx8IG9mZnNldCA+PSBsaW5lX2luZm8tPmNhY2hlLnN0b3ApCi0gICAgewotICAgICAgbGluZV9pbmZvLT5jYWNoZS5zZWN0ID0gc2VjdGlvbjsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQgPSBvZmZzZXQ7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLnN0b3AgPSBvZmZzZXQ7Ci0gICAgICBpZiAoISBsb29rdXBfbGluZSAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKSkKLQl7Ci0JICBsaW5lX2luZm8tPmNhY2hlLnNlY3QgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWU7Ci0gICpyZXRsaW5lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGVzZSByb3V0aW5lcyBjb3B5IHN5bWJvbGljIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLgotCi0gICBGSVhNRTogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBzaHVmZmxlIGNvZGUgaXMgdG8gYXZvaWQgc3RvcmluZwotICAgZXZlcnl0aGluZyBpbiBtZW1vcnksIHNpbmNlIHRoZSBsaW5rZXIgaXMgc3VjaCBhIG1lbW9yeSBob2cuICBUaGlzCi0gICBjb2RlIG1ha2VzIHRoYXQgZWZmb3J0IHVzZWxlc3MuICBJdCBpcyBvbmx5IGNhbGxlZCBieSB0aGUgTUlQUyBFTEYKLSAgIGNvZGUgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHNvIGl0IGlzIG5vdCB0aGF0IGJpZyBhCi0gICBkZWFsLCBidXQgaXQgc2hvdWxkIGJlIGZpeGVkIGV2ZW50dWFsbHkuICAqLwotCi0vKiBDb2xsZWN0IGEgc2h1ZmZsZSBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3Qgc2h1ZmZsZSAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9jb2xsZWN0X3NodWZmbGUgKGwsIGJ1ZmYpCi0gICAgIHN0cnVjdCBzaHVmZmxlICpsOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLQotICB0b3RhbCA9IDA7Ci0gIGZvciAoOyBsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBsLT5maWxlcCkKLQltZW1jcHkgKGJ1ZmYsIGwtPnUubWVtb3J5LCBsLT5zaXplKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGwtPnUuZmlsZS5pbnB1dF9iZmQsIGwtPnUuZmlsZS5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKGJ1ZmYsIDEsIGwtPnNpemUsIGwtPnUuZmlsZS5pbnB1dF9iZmQpICE9IGwtPnNpemUpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB0b3RhbCArPSBsLT5zaXplOwotICAgICAgYnVmZiArPSBsLT5zaXplOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBQRFIgaW5mb3JtYXRpb24gaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgKGhhbmRsZSwgYnVmZikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSAoYWluZm8tPnBkciwgYnVmZik7Ci19Ci0KLS8qIENvcHkgc3ltYm9sIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIChoYW5kbGUsIGJ1ZmYpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBlY29mZl9jb2xsZWN0X3NodWZmbGUgKGFpbmZvLT5zeW0sIGJ1ZmYpOwotfQotCi0vKiBDb3B5IHRoZSBzdHJpbmcgdGFibGUgaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyAoaGFuZGxlLCBidWZmKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIGlzIHdyaXR0ZW4gb3V0IGZyb20gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhCi0gICAgIGZpbmFsIGxpbmsuICAqLwotICBCRkRfQVNTRVJUIChhaW5mby0+c3MgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpOwotICAqYnVmZisrID0gJ1wwJzsKLSAgdG90YWwgPSAxOwotICBCRkRfQVNTRVJUIChhaW5mby0+c3NfaGFzaCA9PSBOVUxMIHx8IGFpbmZvLT5zc19oYXNoLT52YWwgPT0gMSk7Ci0gIGZvciAoc2ggPSBhaW5mby0+c3NfaGFzaDsKLSAgICAgICBzaCAhPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEw7Ci0gICAgICAgc2ggPSBzaC0+bmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKHNoLT5yb290LnN0cmluZyk7Ci0gICAgICBtZW1jcHkgKGJ1ZmYsIChQVFIpIHNoLT5yb290LnN0cmluZywgbGVuICsgMSk7Ci0gICAgICB0b3RhbCArPSBsZW4gKyAxOwotICAgICAgYnVmZiArPSBsZW4gKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lY29mZnN3YXAuaCBiL2JmZC9lY29mZnN3YXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyOGQxNi4uMDAwMDAwMAotLS0gYS9iZmQvZWNvZmZzd2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NTMgKzAsMCBAQAotLyogR2VuZXJpYyBFQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGEgaGVhZGVyIGZpbGUsIGJ1dCBpdCBjb250YWlucyBleGVjdXRhYmxlIHJvdXRpbmVzLgotICAgVGhpcyBpcyBkb25lIHRoaXMgd2F5IGJlY2F1c2UgdGhlc2Ugcm91dGluZXMgYXJlIHN1YnN0YW50aWFsbHkKLSAgIHNpbWlsYXIsIGJ1dCBhcmUgbm90IGlkZW50aWNhbCwgZm9yIGFsbCBFQ09GRiB0YXJnZXRzLgotCi0gICBUaGVzZSBhcmUgcm91dGluZXMgdG8gc3dhcCB0aGUgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24gaW4gYW5kCi0gICBvdXQuICBUaGUgcm91dGluZXMgYXJlIGRlZmluZWQgc3RhdGljYWxseS4gIFlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzCi0gICBvbiB0aGVtIGluIGdkYiBieSBuYW1pbmcgdGhlIGluY2x1ZGluZyBzb3VyY2UgZmlsZTsgZS5nLiwKLSAgICdjb2ZmLW1pcHMuYyc6ZWNvZmZfc3dhcF9oZHJfaW4uCi0KLSAgIEJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZSwgb25lIG9mIEVDT0ZGXzMyIG9yIEVDT0ZGXzY0IG11c3QKLSAgIGJlIGRlZmluZWQuICBUaGVzZSBhcmUgY2hlY2tlZCB3aGVuIHN3YXBwaW5nIGluZm9ybWF0aW9uIHRoYXQKLSAgIGRlcGVuZHMgdXBvbiB0aGUgdGFyZ2V0IHNpemUuICBUaGlzIGNvZGUgd29ya3MgZm9yIDMyIGJpdCBhbmQgNjQKLSAgIGJpdCBFQ09GRiwgYnV0IG1heSBuZWVkIHRvIGJlIGdlbmVyYWxpemVkIGluIHRoZSBmdXR1cmUuCi0KLSAgIFNvbWUgaGVhZGVyIGZpbGUgd2hpY2ggZGVmaW5lcyB0aGUgZXh0ZXJuYWwgZm9ybXMgb2YgdGhlc2UKLSAgIHN0cnVjdHVyZXMgbXVzdCBhbHNvIGJlIGluY2x1ZGVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZS4KLSAgIEN1cnJlbnRseSB0aGlzIGlzIGVpdGhlciBjb2ZmL21pcHMuaCBvciBjb2ZmL2FscGhhLmguCi0KLSAgIElmIHRoZSBzeW1ib2wgVEVTVCBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCBhCi0gICBjb21wYXJpc29uIGlzIG1hZGUgdG8gZW5zdXJlIHRoYXQsIGluIGZhY3QsIHRoZSBvdXRwdXQgaXMKLSAgIGJpdC1mb3ItYml0IHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4gIE9mIGNvdXJzZSwgdGhpcyBzeW1ib2wgc2hvdWxkCi0gICBvbmx5IGJlIGRlZmluZWQgd2hlbiBkZWxpYmVyYXRlbHkgdGVzdGluZyB0aGUgY29kZSBvbiBhIG1hY2hpbmUKLSAgIHdpdGggdGhlIHByb3BlciBieXRlIHNleCBhbmQgc3VjaC4gICovCi0KLSNpZmRlZiBFQ09GRl8zMgotI2RlZmluZSBlY29mZl9nZXRfb2ZmIGJmZF9oX2dldF8zMgotI2RlZmluZSBlY29mZl9wdXRfb2ZmIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSNkZWZpbmUgZWNvZmZfZ2V0X29mZiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgZWNvZmZfcHV0X29mZiBiZmRfaF9wdXRfNjQKLSNlbmRpZgotCi0vKiBFQ09GRiBhdXhpbGlhcnkgaW5mb3JtYXRpb24gc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdGhlIHNhbWUKLSAgIGZvciBhbGwgRUNPRkYgdGFyZ2V0cywgc28gdGhleSBhcmUgZGVmaW5lZCBpbiBlY29mZmxpbmsuYy4gICovCi0KLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4KLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqLCBUSVIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQKLSAgUEFSQU1TICgoaW50LCBjb25zdCBUSVIgKiwgc3RydWN0IHRpcl9leHQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4KLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKiwgUk5EWFIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgUk5EWFIgKiwgc3RydWN0IHJuZHhfZXh0ICopKTsKLQotLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgSERSUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2hkcl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEhEUlIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Zkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBGRFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9mZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3Bkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQRFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9wZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZXh0X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9leHRfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9yZmRfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3JmZF9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IFJGRFQgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX29wdF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBPUFRSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfb3B0X291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgT1BUUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZG5yX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEROUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Rucl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEROUiAqLCBQVFIpKTsKLQotLyogU3dhcCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfaGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgSERSUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgaGRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGhkcl9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaW50ZXJuLT5tYWdpYyAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX21hZ2ljKTsKLSAgaW50ZXJuLT52c3RhbXAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX3ZzdGFtcCk7Ci0gIGludGVybi0+aWxpbmVNYXggICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lsaW5lTWF4KTsKLSAgaW50ZXJuLT5jYkxpbmUgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZSk7Ci0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmVPZmZzZXQpOwotICBpbnRlcm4tPmlkbk1heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZG5NYXgpOwotICBpbnRlcm4tPmNiRG5PZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JEbk9mZnNldCk7Ci0gIGludGVybi0+aXBkTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lwZE1heCk7Ci0gIGludGVybi0+Y2JQZE9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlBkT2Zmc2V0KTsKLSAgaW50ZXJuLT5pc3ltTWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXN5bU1heCk7Ci0gIGludGVybi0+Y2JTeW1PZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlN5bU9mZnNldCk7Ci0gIGludGVybi0+aW9wdE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lvcHRNYXgpOwotICBpbnRlcm4tPmNiT3B0T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JPcHRPZmZzZXQpOwotICBpbnRlcm4tPmlhdXhNYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pYXV4TWF4KTsKLSAgaW50ZXJuLT5jYkF1eE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiQXV4T2Zmc2V0KTsKLSAgaW50ZXJuLT5pc3NNYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXNzTWF4KTsKLSAgaW50ZXJuLT5jYlNzT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NPZmZzZXQpOwotICBpbnRlcm4tPmlzc0V4dE1heCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NFeHRNYXgpOwotICBpbnRlcm4tPmNiU3NFeHRPZmZzZXQgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc0V4dE9mZnNldCk7Ci0gIGludGVybi0+aWZkTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lmZE1heCk7Ci0gIGludGVybi0+Y2JGZE9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkZkT2Zmc2V0KTsKLSAgaW50ZXJuLT5jcmZkICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY3JmZCk7Ci0gIGludGVybi0+Y2JSZmRPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlJmZE9mZnNldCk7Ci0gIGludGVybi0+aWV4dE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lleHRNYXgpOwotICBpbnRlcm4tPmNiRXh0T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JFeHRPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfaGRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgSERSUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgaGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBoZHJfZXh0ICopIGV4dF9wdHI7Ci0gIEhEUlIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7Ci0KLSAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT5tYWdpYywgKGJmZF9ieXRlICopZXh0LT5oX21hZ2ljKTsKLSAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT52c3RhbXAsIChiZmRfYnl0ZSAqKWV4dC0+aF92c3RhbXApOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmVNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pbGluZU1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lLCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmVPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWRuTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWRuTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkRuT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JEbk9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pcGRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pcGRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiUGRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlBkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW1NYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3ltTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlN5bU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3ltT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pb3B0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYk9wdE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiT3B0T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlhdXhNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pYXV4TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkF1eE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiQXV4T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc01heCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc01heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTc09mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzRXh0TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXNzRXh0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzRXh0T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc0V4dE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pZmRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZmRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiRmRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkZkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNyZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jcmZkKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlJmZE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUmZkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlleHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZXh0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkV4dE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRXh0T2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Zkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEZEUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZmRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGZkcl9leHQgKikgZXh0X2NvcHk7Ci0gIAotICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfYWRyKTsKLSAgaW50ZXJuLT5yc3MgICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfcnNzKTsKLSNpZmRlZiBFQ09GRl82NAotICBpZiAoaW50ZXJuLT5yc3MgPT0gMHhmZmZmZmZmZikKLSAgICBpbnRlcm4tPnJzcyA9IC0xOwotI2VuZGlmCi0gIGludGVybi0+aXNzQmFzZSAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lzc0Jhc2UpOwotICBpbnRlcm4tPmNiU3MgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JTcyk7Ci0gIGludGVybi0+aXN5bUJhc2UgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lzeW1CYXNlKTsKLSAgaW50ZXJuLT5jc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3N5bSk7Ci0gIGludGVybi0+aWxpbmVCYXNlICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lsaW5lQmFzZSk7Ci0gIGludGVybi0+Y2xpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NsaW5lKTsKLSAgaW50ZXJuLT5pb3B0QmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaW9wdEJhc2UpOwotICBpbnRlcm4tPmNvcHQgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jb3B0KTsKLSNpZmRlZiBFQ09GRl8zMgotICBpbnRlcm4tPmlwZEZpcnN0ICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGludGVybi0+Y3BkICAgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBpbnRlcm4tPmlwZEZpcnN0ICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGludGVybi0+Y3BkICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSAgaW50ZXJuLT5pYXV4QmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaWF1eEJhc2UpOwotICBpbnRlcm4tPmNhdXggICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYXV4KTsKLSAgaW50ZXJuLT5yZmRCYXNlICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfcmZkQmFzZSk7Ci0gIGludGVybi0+Y3JmZCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NyZmQpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgaW50ZXJuLT5sYW5nICAgICAgICA9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfTEFOR19CSUcpCi0JCQkJCT4+IEZEUl9CSVRTMV9MQU5HX1NIX0JJRzsKLSAgICBpbnRlcm4tPmZNZXJnZSAgICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZNRVJHRV9CSUcpOwotICAgIGludGVybi0+ZlJlYWRpbiAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRlJFQURJTl9CSUcpOwotICAgIGludGVybi0+ZkJpZ2VuZGlhbiAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRkJJR0VORElBTl9CSUcpOwotICAgIGludGVybi0+Z2xldmVsICAgICAgPSAoZXh0LT5mX2JpdHMyWzBdICYgRkRSX0JJVFMyX0dMRVZFTF9CSUcpCi0JCQkJCT4+IEZEUl9CSVRTMl9HTEVWRUxfU0hfQklHOwotICB9IGVsc2UgewotICAgIGludGVybi0+bGFuZyAgICAgICAgPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0xBTkdfTElUVExFKQotCQkJCQk+PiBGRFJfQklUUzFfTEFOR19TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT5mTWVyZ2UgICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GTUVSR0VfTElUVExFKTsKLSAgICBpbnRlcm4tPmZSZWFkaW4gICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFKTsKLSAgICBpbnRlcm4tPmZCaWdlbmRpYW4gID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFKTsKLSAgICBpbnRlcm4tPmdsZXZlbCAgICAgID0gKGV4dC0+Zl9iaXRzMlswXSAmIEZEUl9CSVRTMl9HTEVWRUxfTElUVExFKQotCQkJCQk+PiBGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRTsKLSAgfQotICBpbnRlcm4tPnJlc2VydmVkID0gMDsKLQotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lT2Zmc2V0KTsKLSAgaW50ZXJuLT5jYkxpbmUgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZmRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRkRSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBmZHJfZXh0ICpleHQgPSAoc3RydWN0IGZkcl9leHQgKikgZXh0X3B0cjsKLSAgRkRSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5hZHIsIChiZmRfYnl0ZSAqKWV4dC0+Zl9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cnNzLCAoYmZkX2J5dGUgKilleHQtPmZfcnNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc0Jhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3NCYXNlKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzLCAoYmZkX2J5dGUgKilleHQtPmZfY2JTcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lzeW1CYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNzeW0sIChiZmRfYnl0ZSAqKWV4dC0+Zl9jc3ltKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lsaW5lQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jbGluZSwgKGJmZF9ieXRlICopZXh0LT5mX2NsaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHRCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaW9wdEJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y29wdCwgKGJmZF9ieXRlICopZXh0LT5mX2NvcHQpOwotI2lmZGVmIEVDT0ZGXzMyCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5pcGRGaXJzdCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmNwZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXBkRmlyc3QsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jcGQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pYXV4QmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lhdXhCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNhdXgsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJmZEJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yZmRCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNyZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcmZkKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGV4dC0+Zl9iaXRzMVswXSA9ICgoKGludGVybi0+bGFuZyA8PCBGRFJfQklUUzFfTEFOR19TSF9CSUcpCi0JCQkmIEZEUl9CSVRTMV9MQU5HX0JJRykKLQkJICAgICAgIHwgKGludGVybi0+Zk1lcmdlID8gRkRSX0JJVFMxX0ZNRVJHRV9CSUcgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mUmVhZGluID8gRkRSX0JJVFMxX0ZSRUFESU5fQklHIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZkJpZ2VuZGlhbiA/IEZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRyA6IDApKTsKLSAgICBleHQtPmZfYml0czJbMF0gPSAoKGludGVybi0+Z2xldmVsIDw8IEZEUl9CSVRTMl9HTEVWRUxfU0hfQklHKQotCQkgICAgICAgJiBGRFJfQklUUzJfR0xFVkVMX0JJRyk7Ci0gICAgZXh0LT5mX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmZfYml0czJbMl0gPSAwOwotICB9IGVsc2UgewotICAgIGV4dC0+Zl9iaXRzMVswXSA9ICgoKGludGVybi0+bGFuZyA8PCBGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUpCi0JCQkmIEZEUl9CSVRTMV9MQU5HX0xJVFRMRSkKLQkJICAgICAgIHwgKGludGVybi0+Zk1lcmdlID8gRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mUmVhZGluID8gRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZkJpZ2VuZGlhbiA/IEZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRSA6IDApKTsKLSAgICBleHQtPmZfYml0czJbMF0gPSAoKGludGVybi0+Z2xldmVsIDw8IEZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFKQotCQkgICAgICAgJiBGRFJfQklUUzJfR0xFVkVMX0xJVFRMRSk7Ci0gICAgZXh0LT5mX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmZfYml0czJbMl0gPSAwOwotICB9Ci0KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmVPZmZzZXQpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZSwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLSNpZm5kZWYgTVBXX0MKLQotLyogU3dhcCBpbiB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgUERSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBwZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfY29weTsKLQotICBtZW1zZXQgKChQVFIpIGludGVybiwgMCwgc2l6ZW9mICgqaW50ZXJuKSk7Ci0KLSAgaW50ZXJuLT5hZHIgICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGludGVybi0+aXN5bSAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBpbnRlcm4tPmlsaW5lICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGludGVybi0+cmVnbWFzayAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBpbnRlcm4tPnJlZ29mZnNldCAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGludGVybi0+aW9wdCAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgaW50ZXJuLT5mcmVnbWFzayAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBpbnRlcm4tPmZyZWdvZmZzZXQgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lb2Zmc2V0ICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZXJlZyAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBpbnRlcm4tPnBjcmVnICAgICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGludGVybi0+bG5Mb3cgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgaW50ZXJuLT5sbkhpZ2ggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBFQ09GRl82NAotICBpbnRlcm4tPmdwX3Byb2xvZ3VlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnBfZ3BfcHJvbG9ndWUpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBpbnRlcm4tPmdwX3VzZWQgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfR1BfVVNFRF9CSUcpOwotICAgICAgaW50ZXJuLT5yZWdfZnJhbWUgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRyk7Ci0gICAgICBpbnRlcm4tPnByb2YgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUFJPRl9CSUcpOwotICAgICAgaW50ZXJuLT5yZXNlcnZlZCA9ICgoKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcpCi0JCQkgICA8PCBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcpCi0JCQkgIHwgKChleHQtPnBfYml0czJbMF0gJiBQRFJfQklUUzJfUkVTRVJWRURfQklHKQotCQkJICAgICA+PiBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuLT5ncF91c2VkID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX0dQX1VTRURfTElUVExFKTsKLSAgICAgIGludGVybi0+cmVnX2ZyYW1lID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUpOwotICAgICAgaW50ZXJuLT5wcm9mID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1BST0ZfTElUVExFKTsKLSAgICAgIGludGVybi0+cmVzZXJ2ZWQgPSAoKChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFKQotCQkJICAgPj4gUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRSkKLQkJCSAgfCAoKGV4dC0+cF9iaXRzMlswXSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUpCi0JCQkgICAgIDw8IFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRSkpOwotICAgIH0KLSAgaW50ZXJuLT5sb2NhbG9mZiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5wX2xvY2Fsb2ZmKTsKLSNlbmRpZiAgCi0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBQRFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHBkcl9leHQgKmV4dCA9IChzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfcHRyOwotICBQRFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmFkciwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZSwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0LCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5wY3JlZywgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuTG93LCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5IaWdoLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgRUNPRkZfNjQKLSAgYmZkX2hfcHV0XzggKGFiZmQsIGludGVybi0+Z3BfcHJvbG9ndWUsIChiZmRfYnl0ZSAqKSBleHQtPnBfZ3BfcHJvbG9ndWUpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHQtPnBfYml0czFbMF0gPSAoKGludGVybi0+Z3BfdXNlZCA/IFBEUl9CSVRTMV9HUF9VU0VEX0JJRyA6IDApCi0JCQkgfCAoaW50ZXJuLT5yZWdfZnJhbWUgPyBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRyA6IDApCi0JCQkgfCAoaW50ZXJuLT5wcm9mID8gUERSX0JJVFMxX1BST0ZfQklHIDogMCkKLQkJCSB8ICgoaW50ZXJuLT5yZXNlcnZlZAotCQkJICAgICA+PiBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcpCi0JCQkgICAgJiBQRFJfQklUUzFfUkVTRVJWRURfQklHKSk7Ci0gICAgICBleHQtPnBfYml0czJbMF0gPSAoKGludGVybi0+cmVzZXJ2ZWQgPDwgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRykKLQkJCSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dC0+cF9iaXRzMVswXSA9ICgoaW50ZXJuLT5ncF91c2VkID8gUERSX0JJVFMxX0dQX1VTRURfTElUVExFIDogMCkKLQkJCSB8IChpbnRlcm4tPnJlZ19mcmFtZSA/IFBEUl9CSVRTMV9SRUdfRlJBTUVfTElUVExFIDogMCkKLQkJCSB8IChpbnRlcm4tPnByb2YgPyBQRFJfQklUUzFfUFJPRl9MSVRUTEUgOiAwKQotCQkJIHwgKChpbnRlcm4tPnJlc2VydmVkIDw8IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUpCi0JCQkgICAgJiBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFKSk7Ci0gICAgICBleHQtPnBfYml0czJbMF0gPSAoKGludGVybi0+cmVzZXJ2ZWQgPj4KLQkJCSAgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFKQotCQkJICYgUERSX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSk7Ci0gICAgfQotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW50ZXJuLT5sb2NhbG9mZiwgKGJmZF9ieXRlICopIGV4dC0+cF9sb2NhbG9mZik7Ci0jZW5kaWYgIAotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0jZWxzZSAvKiBNUFdfQyAqLwotLyogU2FtZSByb3V0aW5lcywgYnV0IHdpdGggRUNPRkZfNjQgY29kZSByZW1vdmVkLCBzbyBeJiUkIyYhIE1QVyBDIGRvZXNuJ3QKLSAgIGNvcnJ1cHQgaXRzZWxmIGFuZCB0aGVuIGZyZWFrIG91dC4gKi8KLS8qIFN3YXAgaW4gdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIFBEUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgcGRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IHBkcl9leHQgKikgZXh0X2NvcHk7Ci0gIAotICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgaW50ZXJuLT5pc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGludGVybi0+aWxpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgaW50ZXJuLT5yZWdtYXNrICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGludGVybi0+cmVnb2Zmc2V0ICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5pb3B0ICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBpbnRlcm4tPmZyZWdtYXNrICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGludGVybi0+ZnJlZ29mZnNldCAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVvZmZzZXQgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lcmVnICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGludGVybi0+cGNyZWcgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgaW50ZXJuLT5sbkxvdyAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBpbnRlcm4tPmxuSGlnaCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFBEUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgcGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9wdHI7Ci0gIFBEUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+YWRyLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW0sIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5mcmFtZXJlZywgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPnBjcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5Mb3csIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkhpZ2gsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0jZW5kaWYgLyogTVBXX0MgKi8KLQotLyogU3dhcCBpbiBhIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBTWU1SICppbnRlcm47Ci17Ci0gIHN0cnVjdCBzeW1fZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3Qgc3ltX2V4dCAqKSBleHRfY29weTsKLSAgCi0gIGludGVybi0+aXNzICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5zX2lzcyk7Ci0gIGludGVybi0+dmFsdWUgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+c192YWx1ZSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBpbnRlcm4tPnN0ICAgICAgICAgID0gIChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU1RfQklHKQotCQkJCQkgICA+PiBTWU1fQklUUzFfU1RfU0hfQklHOwotICAgIGludGVybi0+c2MgICAgICAgICAgPSAoKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TQ19CSUcpCi0JCQkJCSAgIDw8IFNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRykKLQkJCXwgKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfU0NfQklHKQotCQkJCQkgICA+PiBTWU1fQklUUzJfU0NfU0hfQklHKTsKLSAgICBpbnRlcm4tPnJlc2VydmVkICAgID0gMCAhPSAoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1JFU0VSVkVEX0JJRyk7Ci0gICAgaW50ZXJuLT5pbmRleCAgICAgICA9ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX0lOREVYX0JJRykKLQkJCQkJICAgPDwgU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQotCQkJfCAoZXh0LT5zX2JpdHMzWzBdIDw8IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRykKLQkJCXwgKGV4dC0+c19iaXRzNFswXSA8PCBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcpOwotICB9IGVsc2UgewotICAgIGludGVybi0+c3QgICAgICAgICAgPSAgKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TVF9MSVRUTEUpCi0JCQkJCSAgID4+IFNZTV9CSVRTMV9TVF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT5zYyAgICAgICAgICA9ICgoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NDX0xJVFRMRSkKLQkJCQkJICAgPj4gU1lNX0JJVFMxX1NDX1NIX0xJVFRMRSkKLQkJCXwgKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfU0NfTElUVExFKQotCQkJCQkgICA8PCBTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUpOwotICAgIGludGVybi0+cmVzZXJ2ZWQgICAgPSAwICE9IChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfUkVTRVJWRURfTElUVExFKTsKLSAgICBpbnRlcm4tPmluZGV4ICAgICAgID0gKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfSU5ERVhfTElUVExFKQotCQkJCQkgICA+PiBTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFKQotCQkJfCAoZXh0LT5zX2JpdHMzWzBdIDw8IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSkKLQkJCXwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+c19iaXRzNFswXQotCQkJICAgPDwgU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFKTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBTWU1SICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBzeW1fZXh0ICpleHQgPSAoc3RydWN0IHN5bV9leHQgKikgZXh0X3B0cjsKLSAgU1lNUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3MsIChiZmRfYnl0ZSAqKWV4dC0+c19pc3MpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPnZhbHVlLCAoYmZkX2J5dGUgKilleHQtPnNfdmFsdWUpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgZXh0LT5zX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5zdCA8PCBTWU1fQklUUzFfU1RfU0hfQklHKQotCQkJJiBTWU1fQklUUzFfU1RfQklHKQotCQkgICAgICAgfCAoKGludGVybi0+c2MgPj4gU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHKQotCQkJICAmIFNZTV9CSVRTMV9TQ19CSUcpKTsKLSAgICBleHQtPnNfYml0czJbMF0gPSAoKChpbnRlcm4tPnNjIDw8IFNZTV9CSVRTMl9TQ19TSF9CSUcpCi0JCQkmIFNZTV9CSVRTMl9TQ19CSUcpCi0JCSAgICAgICB8IChpbnRlcm4tPnJlc2VydmVkID8gU1lNX0JJVFMyX1JFU0VSVkVEX0JJRyA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQkgICYgU1lNX0JJVFMyX0lOREVYX0JJRykpOwotICAgIGV4dC0+c19iaXRzM1swXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRykgJiAweGZmOwotICAgIGV4dC0+c19iaXRzNFswXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRykgJiAweGZmOwotICB9IGVsc2UgewotICAgIGV4dC0+c19iaXRzMVswXSA9ICgoKGludGVybi0+c3QgPDwgU1lNX0JJVFMxX1NUX1NIX0xJVFRMRSkKLQkJCSYgU1lNX0JJVFMxX1NUX0xJVFRMRSkKLQkJICAgICAgIHwgKChpbnRlcm4tPnNjIDw8IFNZTV9CSVRTMV9TQ19TSF9MSVRUTEUpCi0JCQkgICYgU1lNX0JJVFMxX1NDX0xJVFRMRSkpOwotICAgIGV4dC0+c19iaXRzMlswXSA9ICgoKGludGVybi0+c2MgPj4gU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFKQotCQkJJiBTWU1fQklUUzJfU0NfTElUVExFKQotCQkgICAgICAgfCAoaW50ZXJuLT5yZXNlcnZlZCA/IFNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+aW5kZXggPDwgU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRSkKLQkJCSAgJiBTWU1fQklUUzJfSU5ERVhfTElUVExFKSk7Ci0gICAgZXh0LT5zX2JpdHMzWzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFKSAmIDB4ZmY7Ci0gICAgZXh0LT5zX2JpdHM0WzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFKSAmIDB4ZmY7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhbiBleHRlcm5hbCBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZXh0X2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgRVhUUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZXh0X2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGV4dF9leHQgKikgZXh0X2NvcHk7Ci0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGludGVybi0+am1wdGJsICAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0pNUFRCTF9CSUcpOwotICAgIGludGVybi0+Y29ib2xfbWFpbiAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHKTsKLSAgICBpbnRlcm4tPndlYWtleHQgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9XRUFLRVhUX0JJRyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5qbXB0YmwgICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfSk1QVEJMX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5jb2JvbF9tYWluICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUpOwotICAgIGludGVybi0+d2Vha2V4dCAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFKTsKLSAgfQotICBpbnRlcm4tPnJlc2VydmVkID0gMDsKLQotI2lmZGVmIEVDT0ZGXzMyCi0gIGludGVybi0+aWZkICAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGludGVybi0+aWZkICAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotCi0gIGVjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAmZXh0LT5lc19hc3ltLCAmaW50ZXJuLT5hc3ltKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYW4gZXh0ZXJuYWwgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2V4dF9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVYVFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGV4dF9leHQgKmV4dCA9IChzdHJ1Y3QgZXh0X2V4dCAqKSBleHRfcHRyOwotICBFWFRSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBleHQtPmVzX2JpdHMxWzBdID0gKChpbnRlcm4tPmptcHRibCA/IEVYVF9CSVRTMV9KTVBUQkxfQklHIDogMCkKLQkJCXwgKGludGVybi0+Y29ib2xfbWFpbiA/IEVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRyA6IDApCi0JCQl8IChpbnRlcm4tPndlYWtleHQgPyBFWFRfQklUUzFfV0VBS0VYVF9CSUcgOiAwKSk7Ci0gICAgZXh0LT5lc19iaXRzMlswXSA9IDA7Ci0jaWZkZWYgRUNPRkZfNjQKLSAgICBleHQtPmVzX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmVzX2JpdHMyWzJdID0gMDsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIGV4dC0+ZXNfYml0czFbMF0gPSAoKGludGVybi0+am1wdGJsID8gRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUgOiAwKQotCQkJfCAoaW50ZXJuLT5jb2JvbF9tYWluID8gRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFIDogMCkKLQkJCXwgKGludGVybi0+d2Vha2V4dCA/IEVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRSA6IDApKTsKLSAgICBleHQtPmVzX2JpdHMyWzBdID0gMDsKLSNpZmRlZiBFQ09GRl82NAotICAgIGV4dC0+ZXNfYml0czJbMV0gPSAwOwotICAgIGV4dC0+ZXNfYml0czJbMl0gPSAwOwotI2VuZGlmCi0gIH0KLQotI2lmZGVmIEVDT0ZGXzMyCi0gIGJmZF9oX3B1dF9zaWduZWRfMTYgKGFiZmQsIGludGVybi0+aWZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBiZmRfaF9wdXRfc2lnbmVkXzMyIChhYmZkLCBpbnRlcm4tPmlmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0KLSAgZWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAmaW50ZXJuLT5hc3ltLCAmZXh0LT5lc19hc3ltKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3JmZF9pbiAoYWJmZCwgZXh0X3B0ciwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfcHRyOwotICAgICBSRkRUICppbnRlcm47Ci17Ci0gIHN0cnVjdCByZmRfZXh0ICpleHQgPSAoc3RydWN0IHJmZF9leHQgKikgZXh0X3B0cjsKLQotICAqaW50ZXJuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnJmZCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcmZkX291dCAoYWJmZCwgaW50ZXJuLCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFJGRFQgKmludGVybjsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCByZmRfZXh0ICpleHQgPSAoc3RydWN0IHJmZF9leHQgKikgZXh0X3B0cjsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsICppbnRlcm4sIChiZmRfYnl0ZSAqKWV4dC0+cmZkKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhbiBvcHRpbWl6YXRpb24gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfb3B0X2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgT1BUUiAqaW50ZXJuOwotewotICBzdHJ1Y3Qgb3B0X2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IG9wdF9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgaW50ZXJuLT5vdCA9IGV4dC0+b19iaXRzMVswXTsKLSAgICAgIGludGVybi0+dmFsdWUgPSAoKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzMlswXQotCQkJPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHKQotCQkgICAgICAgfCAoKHVuc2lnbmVkIGludCkgZXh0LT5vX2JpdHMzWzBdCi0JCQkgIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRykKLQkJICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzNFswXQotCQkJICA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm4tPm90ID0gZXh0LT5vX2JpdHMxWzBdOwotICAgICAgaW50ZXJuLT52YWx1ZSA9ICgoZXh0LT5vX2JpdHMyWzBdIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRSkKLQkJICAgICAgIHwgKGV4dC0+b19iaXRzM1swXSA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUpCi0JCSAgICAgICB8IChleHQtPm9fYml0czRbMF0gPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFKSk7Ci0gICAgfQotCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpLAotCQkJICAgJmV4dC0+b19ybmR4LCAmaW50ZXJuLT5ybmR4KTsKLQotICBpbnRlcm4tPm9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+b19vZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhbiBvcHRpbWl6YXRpb24gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfb3B0X291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgT1BUUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3Qgb3B0X2V4dCAqZXh0ID0gKHN0cnVjdCBvcHRfZXh0ICopIGV4dF9wdHI7Ci0gIE9QVFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0LT5vX2JpdHMxWzBdID0gaW50ZXJuLT5vdDsKLSAgICAgIGV4dC0+b19iaXRzMlswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5vX2JpdHMzWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPm9fYml0czRbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0JJRzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHQtPm9fYml0czFbMF0gPSBpbnRlcm4tPm90OwotICAgICAgZXh0LT5vX2JpdHMyWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPm9fYml0czNbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+b19iaXRzNFswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFOwotICAgIH0KLQotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCksCi0JCQkgICAgJmludGVybi0+cm5keCwgJmV4dC0+b19ybmR4KTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+dmFsdWUsIChiZmRfYnl0ZSAqKSBleHQtPm9fb2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhIGRlbnNlIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Rucl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEROUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZG5yX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGRucl9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaW50ZXJuLT5yZmQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfcmZkKTsKLSAgaW50ZXJuLT5pbmRleCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZF9pbmRleCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgZGVuc2UgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZG5yX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRE5SICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBkbnJfZXh0ICpleHQgPSAoc3RydWN0IGRucl9leHQgKikgZXh0X3B0cjsKLSAgRE5SIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfcmZkKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmluZGV4LCAoYmZkX2J5dGUgKikgZXh0LT5kX2luZGV4KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGYtYmZkLmggYi9iZmQvZWxmLWJmZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmU3NGMxLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYtYmZkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIEVMRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQkVMRl9IXwotI2RlZmluZSBfTElCRUxGX0hfIDEKLQotI2luY2x1ZGUgImVsZi9jb21tb24uaCIKLSNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIElmIHNpemUgaXNuJ3Qgc3BlY2lmaWVkIGFzIDY0IG9yIDMyLCBOQU1FIG1hY3JvIHNob3VsZCBmYWlsLiAgKi8KLSNpZm5kZWYgTkFNRQotI2lmIEFSQ0hfU0laRT09NjQKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCw2NCxfLHkpCi0jZW5kaWYKLSNpZiBBUkNIX1NJWkU9PTMyCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsMzIsXyx5KQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOQU1FCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsTk9TSVpFLF8seSkKLSNlbmRpZgotCi0jZGVmaW5lIEVsZk5BTUUoWCkJTkFNRShFbGYsWCkKLSNkZWZpbmUgZWxmTkFNRShYKQlOQU1FKGVsZixYKQotCi0vKiBJbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgc3ltYm9sLiAgVGhlIGZpcnN0IGZpZWxkIGlzIHRoZQotICAgY29ycmVzcG9uZGluZyBhc3ltYm9sLiAgRXZlcnkgc3ltYm9sIGlzIGFuIEVMRiBmaWxlIGlzIGFjdHVhbGx5IGEKLSAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFsdGhvdWdoIGl0IGlzIG9mdGVuIGhhbmRsZWQgYXMgYQotICAgcG9pbnRlciB0byBhbiBhc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIEJGRCBzeW1ib2wuICAqLwotICBhc3ltYm9sIHN5bWJvbDsKLSAgLyogRUxGIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9TeW0gaW50ZXJuYWxfZWxmX3N5bTsKLSAgLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhwcGFfYXJnX3JlbG9jOwotICAgICAgUFRSIG1pcHNfZXh0cjsKLSAgICAgIFBUUiBhbnk7Ci0gICAgfQotICB0Y19kYXRhOwotCi0gIC8qIFZlcnNpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGZyb20gYW4gRWxmX0ludGVybmFsX1ZlcnN5bQotICAgICBzdHJ1Y3R1cmUgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgSXQgaXMgemVybyBpZiB0aGVyZSBpcyBubwotICAgICB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLQotfSBlbGZfc3ltYm9sX3R5cGU7Ci0MCi0vKiBFTEYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBpbml0aWFsaXplZCB0byAtMS4gIEl0IGlzCi0gICAgIHNldCB0byAtMiBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgc2l6ZS4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAvKiBTeW1ib2wgaW5kZXggYXMgYSBkeW5hbWljIHN5bWJvbC4gIEluaXRpYWxpemVkIHRvIC0xLCBhbmQgcmVtYWlucwotICAgICAtMSBpZiB0aGlzIGlzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgLyogPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnRseSB1c2VkIGFzIGEgc3lub255bSBmb3IgdGVzdHMKLSAgICAgYWdhaW5zdCB3aGV0aGVyIHdlIGNhbiBwZXJmb3JtIHZhcmlvdXMgc2ltcGxpZnlpbmcgdHJhbnNmb3JtYXRpb25zCi0gICAgIHRvIHRoZSBjb2RlLiAgKEUuZy4gY2hhbmdpbmcgYSBwYy1yZWxhdGl2ZSBqdW1wIHRvIGEgUExUIGVudHJ5Ci0gICAgIGludG8gYSBwYy1yZWxhdGl2ZSBqdW1wIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24uKSAgVGhhdCB0ZXN0LCB3aGljaAotICAgICBpcyBvZnRlbiByZWxhdGl2ZWx5IGNvbXBsZXgsIGFuZCBzb21lcGxhY2VzIHdyb25nIG9yIGluY29tcGxldGUsCi0gICAgIHNob3VsZCByZWFsbHkgYmUgcmVwbGFjZWQgYnkgYSBwcmVkaWNhdGUgaW4gZWxmbGluay5jLgotCi0gICAgIEVuZCByZXN1bHQ6IHRoaXMgZmllbGQgLTEgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgc3ltYm9sIGlzCi0gICAgIG5vdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCByYXRoZXIgdGhhdCB0aGUgc3ltYm9sIGlzCi0gICAgIG5vdCB2aXNpYmxlIG91dHNpZGUgdGhpcyBEU08uICAqLwotICBsb25nIGR5bmluZHg7Ci0KLSAgLyogU3RyaW5nIHRhYmxlIGluZGV4IGluIC5keW5zdHIgaWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5zdHJfaW5kZXg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGlzCi0gICAgIGZpZWxkIHBvaW50cyB0byBhIGRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUsIGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gIE90aGVyd2lzZSBpdCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgcmVxdWlyZXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZQotICAgICBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZCB1c2VzIHRoaXMgZmllbGQgdG8gdHJhY2sgdXNhZ2UgYW5kCi0gICAgIGZpbmFsIG9mZnNldC4gIFdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvIGRvY3VtZW50Ci0gICAgIHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZCBzaG91bGQgYmUKLSAgICAgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2ggcG9pbnQgdGhlCi0gICAgIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiB0aGlzIGZpZWxkIGlzIC0xLAotICAgICB0aGVuIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHJlZmNvdW50OwotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgfSBnb3Q7Ci0KLSAgLyogU2FtZSwgYnV0IHRyYWNrcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWZjb3VudDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0OwotICAgIH0gcGx0OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gdGhlIGxpbmtlciBjcmVhdGVkIHNlY3Rpb25zLCB0aGUgcHJvY2Vzc29yCi0gICAgIHNwZWNpZmljIGJhY2tlbmQgdXNlcyB0aGlzIGZpZWxkIHRvIG1hcCB0aGUgZmllbGQgaW50byB0aGUgb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXI7Ci0KLSAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gIHsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEKLSAgICAgICByZWd1bGFyIG9iamVjdC4gIEl0IHBvaW50cyB0byB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiByZWFkIGluCi0gICAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QuICAqLwotICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnZlcmRlZjsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0gICAgICAgb2JqZWN0LiAgSXQgaXMgc2V0IHVwIGluIHNpemVfZHluYW1pY19zZWN0aW9ucy4gIEl0IHBvaW50cyB0bwotICAgICAgIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdlIHNob3VsZCB3cml0ZSBvdXQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnRyZWU7Ci0gIH0gdmVyaW5mbzsKLQotICAvKiBWaXJ0dWFsIHRhYmxlIGVudHJ5IHVzZSBpbmZvcm1hdGlvbi4gIFRoaXMgYXJyYXkgaXMgbm9taW5hbGx5IG9mIHNpemUKLSAgICAgc2l6ZS9zaXplb2YodGFyZ2V0X3ZvaWRfcG9pbnRlciksIHRob3VnaCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gYXNzdW1lCi0gICAgIGFuZCB0cmFjayBhIHNpemUgd2hpbGUgdGhlIHN5bWJvbCBpcyBzdGlsbCB1bmRlZmluZWQuICBJdCBpcyBpbmRleGVkCi0gICAgIHZpYSBvZmZzZXQvc2l6ZW9mKHRhcmdldF92b2lkX3BvaW50ZXIpLiAgKi8KLSAgc2l6ZV90IHZ0YWJsZV9lbnRyaWVzX3NpemU7Ci0gIGJvb2xlYW4gKnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0KLSAgLyogVmlydHVhbCB0YWJsZSBkZXJpdmF0aW9uIGluZm8uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqdnRhYmxlX3BhcmVudDsKLQotICAvKiBTeW1ib2wgdHlwZSAoU1RUX05PVFlQRSwgU1RUX09CSkVDVCwgZXRjLikuICAqLwotICBjaGFyIHR5cGU7Ci0KLSAgLyogU3ltYm9sIHN0X290aGVyIHZhbHVlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvdGhlcjsKLQotICAvKiBIYXNoIHZhbHVlIG9mIHRoZSBuYW1lIGNvbXB1dGVkIHVzaW5nIHRoZSBFTEYgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgZWxmX2hhc2hfdmFsdWU7Ci0KLSAgLyogU29tZSBmbGFnczsgbGVnYWwgdmFsdWVzIGZvbGxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGVsZl9saW5rX2hhc2hfZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSIDAxCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSIDAyCi0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMgMDQKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyAwMTAKLSAgLyogU3ltYm9sIGhhcyBhIG5vbi13ZWFrIHJlZmVyZW5jZSBmcm9tIGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsgMDIwCi0gIC8qIER5bmFtaWMgc3ltYm9sIGhhcyBiZWVuIGFkanVzdGQuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RZTkFNSUNfQURKVVNURUQgMDQwCi0gIC8qIFN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX05FRURTX0NPUFkgMDEwMAotICAvKiBTeW1ib2wgbmVlZHMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIDAyMDAKLSAgLyogU3ltYm9sIGFwcGVhcnMgaW4gYSBub24tRUxGIGlucHV0IGZpbGUuICAqLwotI2RlZmluZSBFTEZfTElOS19OT05fRUxGIDA0MDAKLSAgLyogU3ltYm9sIHNob3VsZCBiZSBtYXJrZWQgYXMgaGlkZGVuIGluIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSElEREVOIDAxMDAwCi0gIC8qIFN5bWJvbCB3YXMgZm9yY2VkIHRvIGxvY2FsIHNjb3BlIGR1ZSB0byBhIHZlcnNpb24gc2NyaXB0IGZpbGUuICAqLwotI2RlZmluZSBFTEZfTElOS19GT1JDRURfTE9DQUwgMDIwMDAKLSAgLyogU3ltYm9sIHdhcyBtYXJrZWQgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTUFSSyAwNDAwMAotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIG5vbi1HT1Qvbm9uLVBMVCByZWxvY2F0aW9uLiAgVGhpcyBpcwotICAgICBub3QgY3VycmVudGx5IHNldCBieSBhbGwgdGhlIGJhY2tlbmRzLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfTk9OX0dPVF9SRUYgMDEwMDAwCi19OwotCi0vKiBSZWNvcmRzIGxvY2FsIHN5bWJvbHMgdG8gYmUgZW1pdHRlZCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotCi1zdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqbmV4dDsKLQotICAvKiBUaGUgaW5wdXQgYmZkIHRoaXMgc3ltYm9sIGNhbWUgZnJvbS4gICovCi0gIGJmZCAqaW5wdXRfYmZkOwotCi0gIC8qIFRoZSBpbmRleCBvZiB0aGUgbG9jYWwgc3ltYm9sIGJlaW5nIGNvcGllZC4gICovCi0gIGxvbmcgaW5wdXRfaW5keDsKLQotICAvKiBUaGUgaW5kZXggaW4gdGhlIG91dGdvaW5nIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLSAgbG9uZyBkeW5pbmR4OwotICAKLSAgLyogQSBjb3B5IG9mIHRoZSBpbnB1dCBzeW1ib2wuICAqLwotICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci19OwotCi0vKiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotICAvKiBXaGV0aGVyIHdlIGhhdmUgY3JlYXRlZCB0aGUgc3BlY2lhbCBkeW5hbWljIHNlY3Rpb25zIHJlcXVpcmVkCi0gICAgIHdoZW4gbGlua2luZyBhZ2FpbnN0IG9yIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQ7Ci0gIC8qIFRoZSBCRkQgdXNlZCB0byBob2xkIHNwZWNpYWwgc2VjdGlvbnMgY3JlYXRlZCBieSB0aGUgbGlua2VyLgotICAgICBUaGlzIHdpbGwgYmUgdGhlIGZpcnN0IEJGRCBmb3VuZCB3aGljaCByZXF1aXJlcyB0aGVzZSBzZWN0aW9ucyB0bwotICAgICBiZSBjcmVhdGVkLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3VuZCBpbiB0aGUgbGluayB3aGljaCBtdXN0IGJlIHB1dCBpbnRvCi0gICAgIHRoZSAuZHluc3ltIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIGR5bnN5bWNvdW50OwotICAvKiBUaGUgc3RyaW5nIHRhYmxlIG9mIGR5bmFtaWMgc3ltYm9scywgd2hpY2ggYmVjb21lcyB0aGUgLmR5bnN0cgotICAgICBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gdGhlIGhhc2ggdGFibGUgaW4gdGhlIC5oYXNoIHNlY3Rpb24uCi0gICAgIFRoaXMgaXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMuICAqLwotICBiZmRfc2l6ZV90eXBlIGJ1Y2tldGNvdW50OwotICAvKiBBIGxpbmtlZCBsaXN0IG9mIERUX05FRURFRCBuYW1lcyBmb3VuZCBpbiBkeW5hbWljIG9iamVjdHMKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKLSAgLyogVGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGdvdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEEgbGlua2VkIGxpc3Qgb2YgbG9jYWwgc3ltYm9scyB0byBiZSBhZGRlZCB0byAuZHluc3ltLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKmR5bmxvY2FsOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0MCi0vKiBDb25zdGFudCBpbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgYmFja2VuZC4gICovCi0KLXN0cnVjdCBlbGZfc2l6ZV9pbmZvIHsKLSAgdW5zaWduZWQgY2hhciBzaXplb2ZfZWhkciwgc2l6ZW9mX3BoZHIsIHNpemVvZl9zaGRyOwotICB1bnNpZ25lZCBjaGFyIHNpemVvZl9yZWwsIHNpemVvZl9yZWxhLCBzaXplb2Zfc3ltLCBzaXplb2ZfZHluLCBzaXplb2Zfbm90ZTsKLQotICAvKiBUaGUgc2l6ZSBvZiBlbnRyaWVzIGluIHRoZSAuaGFzaCBzZWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplb2ZfaGFzaF9lbnRyeTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGludGVybmFsIHJlbG9jYXRpb25zIHRvIGFsbG9jYXRlIHBlciBleHRlcm5hbAotICAgICByZWxvY2F0aW9uIGVudHJ5LiAgKi8KLSAgdW5zaWduZWQgY2hhciBpbnRfcmVsc19wZXJfZXh0X3JlbDsKLQotICB1bnNpZ25lZCBjaGFyIGFyY2hfc2l6ZSwgZmlsZV9hbGlnbjsKLSAgdW5zaWduZWQgY2hhciBlbGZjbGFzcywgZXZfY3VycmVudDsKLSAgaW50ICgqd3JpdGVfb3V0X3BoZHJzKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7Ci0gIGJvb2xlYW4gKCp3cml0ZV9zaGRyc19hbmRfZWhkcikgUEFSQU1TICgoYmZkICopKTsKLSAgdm9pZCAoKndyaXRlX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotICB2b2lkICgqc3dhcF9zeW1ib2xfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBQVFIpKTsKLSAgYm9vbGVhbiAoKnNsdXJwX3JlbG9jX3RhYmxlKQotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIGxvbmcgKCpzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0gIHZvaWQgKCpzd2FwX2R5bl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRHluICosIFBUUikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCB0byBzd2FwIGluIGEgUkVMCi0gICAgIHJlbG9jYXRpb24uICBJZiBhbiBleHRlcm5hbCByZWxvY2F0aW9uIGNvcnJlc3BvbmRzIHRvIG1vcmUgdGhhbgotICAgICBvbmUgaW50ZXJuYWwgcmVsb2NhdGlvbiwgdGhlbiBhbGwgcmVsb2NhdGlvbnMgYXJlIHN3YXBwZWQgaW4gYXQKLSAgICAgb25jZS4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jX2luKQotICAgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgdG8gc3dhcCBvdXQgYSBSRUwKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jX291dCkKLSAgICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBiZmRfYnl0ZSAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIHRvIHN3YXAgaW4gYSBSRUxBCi0gICAgIHJlbG9jYXRpb24uICBJZiBhbiBleHRlcm5hbCByZWxvY2F0aW9uIGNvcnJlc3BvbmRzIHRvIG1vcmUgdGhhbgotICAgICBvbmUgaW50ZXJuYWwgcmVsb2NhdGlvbiwgdGhlbiBhbGwgcmVsb2NhdGlvbnMgYXJlIHN3YXBwZWQgaW4gYXQKLSAgICAgb25jZS4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jYV9pbikKLSAgICBQQVJBTVMgKChiZmQgKiwgY29uc3QgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCB0byBzd2FwIG91dCBhIFJFTEEKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jYV9vdXQpCi0gICAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICopKTsKLQotfTsKLQotI2RlZmluZSBlbGZfc3ltYm9sX2Zyb20oQUJGRCxTKSBcCi0JKCgoUyktPnRoZV9iZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91ciBcCi0JICAmJiAoUyktPnRoZV9iZmQtPnRkYXRhLmVsZl9vYmpfZGF0YSAhPSAwKSBcCi0JID8gKGVsZl9zeW1ib2xfdHlwZSAqKSAoUykgXAotCSA6IDApCi0KLXN0cnVjdCBlbGZfYmFja2VuZF9kYXRhCi17Ci0gIC8qIFRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qIFRoZSBFTEYgbWFjaGluZSBjb2RlIChFTV94eHh4KSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgaW50IGVsZl9tYWNoaW5lX2NvZGU7Ci0KLSAgLyogVGhlIG1heGltdW0gcGFnZSBzaXplIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBiZmRfdm1hIG1heHBhZ2VzaXplOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gdHJhbnNsYXRlIGFuIEVMRiBSRUxBIHJlbG9jYXRpb24gdG8gYSBCRkQgYXJlbGVudAotICAgICBzdHJ1Y3R1cmUuICAqLwotICB2b2lkICgqZWxmX2luZm9fdG9faG93dG8pIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byB0cmFuc2xhdGUgYW4gRUxGIFJFTCByZWxvY2F0aW9uIHRvIGEgQkZEIGFyZWxlbnQKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdm9pZCAoKmVsZl9pbmZvX3RvX2hvd3RvX3JlbCkgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKLQkJCQkJIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgZ2xvYmFsIHdoZW4KLSAgICAgcGFydGl0aW9uaW5nIHRoZSBzeW1ib2wgdGFibGUgaW50byBsb2NhbCBhbmQgZ2xvYmFsIHN5bWJvbHMuCi0gICAgIFRoaXMgc2hvdWxkIGJlIE5VTEwgZm9yIG1vc3QgdGFyZ2V0cywgaW4gd2hpY2ggY2FzZSB0aGUgY29ycmVjdAotICAgICB0aGluZyB3aWxsIGJlIGRvbmUuICBNSVBTIEVMRiwgYXQgbGVhc3Qgb24gdGhlIElyaXggNSwgaGFzCi0gICAgIHNwZWNpYWwgcmVxdWlyZW1lbnRzLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLQotICAvKiBUaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBhcmUgaG9va3Mgd2hpY2ggYXJlIGNhbGxlZCBvbmx5IGlmIHRoZXkKLSAgICAgYXJlIG5vdCBOVUxMLiAgKi8KLQotICAvKiBBIGZ1bmN0aW9uIHRvIHBlcm1pdCBhIGJhY2tlbmQgc3BlY2lmaWMgY2hlY2sgb24gd2hldGhlciBhCi0gICAgIHBhcnRpY3VsYXIgQkZEIGZvcm1hdCBpcyByZWxldmFudCBmb3IgYW4gb2JqZWN0IGZpbGUsIGFuZCB0bwotICAgICBwZXJtaXQgdGhlIGJhY2tlbmQgdG8gc2V0IGFueSBnbG9iYWwgaW5mb3JtYXRpb24gaXQgd2lzaGVzLiAgV2hlbgotICAgICB0aGlzIGlzIGNhbGxlZCBlbGZfZWxmaGVhZGVyIGlzIHNldCwgYnV0IGFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlCi0gICAgIHVzZWQgd2l0aCBjYXV0aW9uLiAgSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgY2hlY2tfZm9ybWF0Ci0gICAgIHJvdXRpbmUgd2lsbCByZXR1cm4gYSBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0IGVycm9yLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYWRkaXRpb25hbCBzeW1ib2wgcHJvY2Vzc2luZyB3aGVuIHJlYWRpbmcgdGhlCi0gICAgIEVMRiBzeW1ib2wgdGFibGUuICBUaGlzIGlzIHdoZXJlIGFueSBwcm9jZXNzb3Itc3BlY2lmaWMgc3BlY2lhbAotICAgICBzZWN0aW9uIGluZGljZXMgYXJlIGhhbmRsZWQuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgc3ltYm9sIHByb2Nlc3NpbmcgYWZ0ZXIgcmVhZGluZyB0aGUKLSAgICAgZW50aXJlIEVMRiBzeW1ib2wgdGFibGUuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJCSAgZWxmX3N5bWJvbF90eXBlICosCi0JCQkJCQkJICB1bnNpZ25lZCBpbnQpKTsKLQotICAgLyogQSBmdW5jdGlvbiB0byBzZXQgdGhlIHR5cGUgb2YgdGhlIGluZm8gZmllbGQuICBQcm9jZXNzb3Itc3BlY2lmaWMKLSAgICAgdHlwZXMgc2hvdWxkIGJlIGhhbmRsZWQgaGVyZS4gKi8KLSAgaW50ICgqZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKSBQQVJBTVMgKCggRWxmX0ludGVybmFsX1N5bSAqLCBpbnQpKTsgCi0gCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG9uIHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIKLSAgICAganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBUaGlzIGlzIHVzZWQgdG8gc2V0IHRoZSBmbGFncyBhbmQKLSAgICAgdHlwZSBmaWVsZHMgZm9yIHNvbWUgc2VjdGlvbnMsIG9yIHRvIGFjdHVhbGx5IHdyaXRlIG91dCBkYXRhIGZvcgotICAgICB1bnVzdWFsIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZykgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gaGFuZGxlIHVudXN1YWwgc2VjdGlvbiB0eXBlcyB3aGVuIGNyZWF0aW5nIEJGRAotICAgICBzZWN0aW9ucyBmcm9tIEVMRiBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJICAgIGNoYXIgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gaGFuZGxlIHVudXN1YWwgcHJvZ3JhbSBzZWdtZW50IHR5cGVzIHdoZW4gY3JlYXRpbmcgQkZECi0gICAgIHNlY3Rpb25zIGZyb20gRUxGIHByb2dyYW0gc2VnbWVudHMuICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkcikgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgRWxmMzJfSW50ZXJuYWxfUGhkciAqLAotCQkJCQkJICAgIGludCkpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gc2V0IHVwIHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIgZm9yIGEgQkZEIHNlY3Rpb24gaW4KLSAgICAgcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyBpcyB3aGVyZSB0aGUgZmxhZ3MgYW5kIHR5cGUKLSAgICAgZmllbGRzIGFyZSBzZXQgZm9yIHVudXN1YWwgc2VjdGlvbnMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucykgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCWFzZWN0aW9uICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGdldCB0aGUgRUxGIHNlY3Rpb24gaW5kZXggZm9yIGEgQkZEIHNlY3Rpb24uICBJZgotICAgICB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIHNlY3Rpb24gd2FzIGZvdW5kLiAgSWYgaXQgaXMgYSBub3JtYWwgRUxGCi0gICAgIHNlY3Rpb24sICpSRVRWQUwgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkLiAgSWYgaXQgaXMgbm90IGEgbm9ybWFsCi0gICAgIEVMRiBzZWN0aW9uICpSRVRWQUwgc2hvdWxkIGJlIHNldCB0byB0aGUgU0hOX3h4eHggaW5kZXguICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKQotICAgIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGludCAqcmV0dmFsKSk7Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgaXQgaXMgY2FsbGVkIGJ5IHRoZSBhZGRfc3ltYm9scyBwaGFzZQotICAgICBvZiBhIGxpbmsganVzdCBiZWZvcmUgYWRkaW5nIGEgc3ltYm9sIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2gKLSAgICAgdGFibGUuICBJdCBtYXkgbW9kaWZ5IGFueSBvZiB0aGUgZmllbGRzIGFzIGl0IHdpc2hlcy4gIElmICpOQU1FCi0gICAgIGlzIHNldCB0byBOVUxMLCB0aGUgc3ltYm9sIHdpbGwgYmUgc2tpcHBlZCByYXRoZXIgdGhhbiBiZWluZwotICAgICBhZGRlZCB0byB0aGUgaGFzaCB0YWJsZS4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yCi0gICAgIGhhbmRsaW5nIGFsbCBwcm9jZXNzb3IgZGVwZW5kZW50IHN5bWJvbCBiaW5kaW5ncyBhbmQgc2VjdGlvbgotICAgICBpbmRpY2VzLCBhbmQgbXVzdCBzZXQgYXQgbGVhc3QgKkZMQUdTIGFuZCAqU0VDIGZvciBlYWNoIHByb2Nlc3NvcgotICAgICBkZXBlbmRlbnQgY2FzZTsgZmFpbHVyZSB0byBkbyBzbyB3aWxsIGNhdXNlIGEgbGluayBlcnJvci4gICovCi0gIGJvb2xlYW4gKCplbGZfYWRkX3N5bWJvbF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIGNvbnN0IGNoYXIgKipuYW1lLAotCSAgICAgZmxhZ3dvcmQgKmZsYWdzLCBhc2VjdGlvbiAqKnNlYywgYmZkX3ZtYSAqdmFsdWUpKTsKLQotICAvKiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCBpdCBpcyBjYWxsZWQgYnkgdGhlIGVsZl9saW5rX291dHB1dF9zeW0KLSAgICAgcGhhc2Ugb2YgYSBsaW5rIGZvciBlYWNoIHN5bWJvbCB3aGljaCB3aWxsIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBjb25zdCBjaGFyICosCi0JICAgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLQotICAvKiBUaGUgQ1JFQVRFX0RZTkFNSUNfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAotICAgICBsaW5rZXIgdGhlIGZpcnN0IHRpbWUgaXQgZW5jb3VudGVycyBhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLgotICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgY3JlYXRlIGFueSBzZWN0aW9ucyByZXF1aXJlZCBmb3IgZHluYW1pYwotICAgICBsaW5raW5nLiAgVGhlIEFCRkQgYXJndW1lbnQgaXMgYSBkeW5hbWljIG9iamVjdC4gIFRoZSAuaW50ZXJwLAotICAgICAuZHluYW1pYywgLmR5bnN5bSwgLmR5bnN0ciwgYW5kIC5oYXNoIGZ1bmN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbgotICAgICBjcmVhdGVkLCBhbmQgdGhpcyBmdW5jdGlvbiBtYXkgbW9kaWZ5IHRoZSBzZWN0aW9uIGZsYWdzIGlmCi0gICAgIGRlc2lyZWQuICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm9ybWFsbHkgY3JlYXRlIHRoZSAuZ290IGFuZCAucGx0Ci0gICAgIHNlY3Rpb25zLCBidXQgZGlmZmVyZW50IGJhY2tlbmRzIGhhdmUgZGlmZmVyZW50IHJlcXVpcmVtZW50cy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogVGhlIENIRUNLX1JFTE9DUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFkZF9zeW1ib2xzIHBoYXNlIG9mCi0gICAgIHRoZSBFTEYgYmFja2VuZCBsaW5rZXIuICBJdCBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzZWN0aW9uIHdpdGgKLSAgICAgcmVsb2NzIG9mIGFuIG9iamVjdCBmaWxlLCBqdXN0IGFmdGVyIHRoZSBzeW1ib2xzIGZvciB0aGUgb2JqZWN0Ci0gICAgIGZpbGUgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZnVuY3Rpb24gbXVzdCBsb29rIHRocm91Z2ggdGhlIHJlbG9jcyBhbmQgZG8gYW55IHNwZWNpYWwgaGFuZGxpbmcKLSAgICAgcmVxdWlyZWQuICBUaGlzIGdlbmVyYWxseSBtZWFucyBhbGxvY2F0aW5nIHNwYWNlIGluIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLCBhbmQgcGVyaGFwcyBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIHJlbG9jLiAgVGhlCi0gICAgIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgICB6ZXJvLiAgKi8KLSAgYm9vbGVhbiAoKmNoZWNrX3JlbG9jcykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotICAvKiBUaGUgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGZvciBldmVyeSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZAotICAgICByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlCi0gICAgIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBzZWVuLCBidXQgYmVmb3JlIHRoZSBTSVpFX0RZTkFNSUNfU0VDVElPTlMKLSAgICAgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLiAgVGhlIGhhc2ggdGFibGUgZW50cnkgc2hvdWxkIGJlCi0gICAgIGJmZF9saW5rX2hhc2hfZGVmaW5lZCBvcmUgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLCBhbmQgaXQgc2hvdWxkIGJlCi0gICAgIGRlZmluZWQgaW4gYSBzZWN0aW9uIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIER5bmFtaWMgb2JqZWN0Ci0gICAgIHNlY3Rpb25zIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIGxpbmssIGFuZCB0aGlzIGZ1bmN0aW9uIGlzCi0gICAgIHJlc3BvbnNpYmxlIGZvciBjaGFuZ2luZyB0aGUgdmFsdWUgdG8gc29tZXRoaW5nIHdoaWNoIHRoZSByZXN0IG9mCi0gICAgIHRoZSBsaW5rIGNhbiBkZWFsIHdpdGguICBUaGlzIHdpbGwgbm9ybWFsbHkgaW52b2x2ZSBhZGRpbmcgYW4KLSAgICAgZW50cnkgdG8gdGhlIC5wbHQgb3IgLmdvdCBvciBzb21lIHN1Y2ggc2VjdGlvbiwgYW5kIHNldHRpbmcgdGhlCi0gICAgIHN5bWJvbCB0byBwb2ludCB0byB0aGF0LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgpKTsKLQotICAvKiBUaGUgQUxXQVlTX1NJWkVfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlcgotICAgICBhZnRlciBhbGwgdGhlIGxpbmtlciBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiBidXQgYmVmb3JlIHRoZQotICAgICBzZWN0aW9uIHNpemVzIGhhdmUgYmVlbiBzZXQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgotICAgICBBREpVU1RfRFlOQU1JQ19TWU1CT0wsIGJ1dCBiZWZvcmUgU0laRV9EWU5BTUlDX1NFQ1RJT05TLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBUaGUgU0laRV9EWU5BTUlDX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGFmdGVyIGFsbCB0aGUgbGlua2VyIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBzZWVuIGJ1dCBiZWZvcmUKLSAgICAgdGhlIHNlY3Rpb25zIHNpemVzIGhhdmUgYmVlbiBzZXQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgotICAgICBBREpVU1RfRFlOQU1JQ19TWU1CT0wgaGFzIGJlZW4gY2FsbGVkIG9uIGFsbCBhcHByb3ByaWF0ZSBzeW1ib2xzLgotICAgICBJdCBpcyBvbmx5IGNhbGxlZCB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgSXQgbXVzdAotICAgICBzZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLCBhbmQgbWF5IGZpbGwgaW4gdGhlaXIKLSAgICAgY29udGVudHMgYXMgd2VsbC4gIFRoZSBnZW5lcmljIEVMRiBsaW5rZXIgY2FuIGhhbmRsZSB0aGUgLmR5bnN5bSwKLSAgICAgLmR5bnN0ciBhbmQgLmhhc2ggc2VjdGlvbnMuICBUaGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlIHRoZQotICAgICAuaW50ZXJwIHNlY3Rpb24gYW5kIGFueSBzZWN0aW9ucyBjcmVhdGVkIGJ5IHRoZQotICAgICBDUkVBVEVfRFlOQU1JQ19TRUNUSU9OUyBlbnRyeSBwb2ludC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi0gIC8qIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyCi0gICAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICAgIHplcm8uCi0KLSAgICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgICAgbmVjZXNzYXJ5LgotCi0gICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICAgIGFjY29yZGluZ2x5LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICAgIGJmZCAqaW5wdXRfYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgYmZkX2J5dGUgKmNvbnRlbnRzLAotCSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywKLQkgICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnMpKTsKLQotICAvKiBUaGUgRklOSVNIX0RZTkFNSUNfU1lNQk9MIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGp1c3QgYmVmb3JlIGl0IHdyaXRlcyBhIHN5bWJvbCBvdXQgdG8gdGhlIC5keW5zeW0gc2VjdGlvbi4KLSAgICAgVGhlIHByb2Nlc3NvciBiYWNrZW5kIG1heSBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50IHRvIHRoZQotICAgICBzeW1ib2wuICBJdCBtYXkgYWxzbyB0YWtlIHRoZSBvcHBvcnR1bml0eSB0byBzZXQgY29udGVudHMgb2YgdGhlCi0gICAgIGR5bmFtaWMgc2VjdGlvbnMuICBOb3RlIHRoYXQgRklOSVNIX0RZTkFNSUNfU1lNQk9MIGlzIGNhbGxlZCBvbgotICAgICBhbGwgLmR5bnN5bSBzeW1ib2xzLCB3aGlsZSBBREpVU1RfRFlOQU1JQ19TWU1CT0wgaXMgb25seSBjYWxsZWQKLSAgICAgb24gdGhvc2Ugc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCkKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIEVsZl9JbnRlcm5hbF9TeW0gKnN5bSkpOwotCi0gIC8qIFRoZSBGSU5JU0hfRFlOQU1JQ19TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBqdXN0IGJlZm9yZSBpdCB3cml0ZXMgYWxsIHRoZSBkeW5hbWljIHNlY3Rpb25zIG91dCB0byB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBUaGUgRklOSVNIX0RZTkFNSUNfU1lNQk9MIHdpbGwgaGF2ZSBiZWVuIGNhbGxlZCBvbgotICAgICBhbGwgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFueSBiZWdpbm5pbmcgcHJvY2Vzc2luZyBuZWVkZWQgZm9yIHRoZSBFTEYgZmlsZQotICAgICBiZWZvcmUgYnVpbGRpbmcgdGhlIEVMRiBoZWFkZXJzIGFuZCBjb21wdXRpbmcgZmlsZSBwb3NpdGlvbnMuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZykKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYW55IGZpbmFsIHByb2Nlc3NpbmcgbmVlZGVkIGZvciB0aGUgRUxGIGZpbGUKLSAgICAgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhlIExJTktFUiBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgQkZECi0gICAgIHdhcyBjcmVhdGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZykKLSAgICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiBsaW5rZXIpKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4gIEl0IHNob3VsZAotICAgICByZXR1cm4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHByb2dyYW0gc2VnbWVudHMgd2hpY2ggdGhpcyBCRkQKLSAgICAgd2lsbCBuZWVkLiAgSXQgc2hvdWxkIHJldHVybiAtMSBvbiBlcnJvci4gICovCi0gIGludCAoKmVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIG1vZGlmeSBhbiBleGlzdGluZyBzZWdtZW50IG1hcCBpbiBhCi0gICAgIGJhY2tlbmQgc3BlY2lmaWMgZmFzaGlvbi4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIHNlY3Rpb24gZ2MgdG8gZGlzY292ZXIgdGhlIHNlY3Rpb24gYQotICAgICBwYXJ0aWN1bGFyIHJlbG9jYXRpb24gcmVmZXJzIHRvLiAgSXQgbmVlZCBub3QgYmUgZGVmaW5lZCBmb3IgaG9zdHMKLSAgICAgdGhhdCBoYXZlIG5vIHF1ZWVyIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBzd2VlcCBwaGFzZSBvZiBnYwotICAgICBpbiBvcmRlciB0aGF0IGEgYmFja2VuZCBtaWdodCB1cGRhdGUgYW55IGRhdGEgc3RydWN0dXJlcyBpdCBtaWdodAotICAgICBiZSBtYWludGFpbmluZy4gICovCi0gIGJvb2xlYW4gKCpnY19zd2VlcF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCBhZnRlciB0aGUgRUxGIGhlYWRlcnMgaGF2ZQotICAgICBiZWVuIGNyZWF0ZWQuICBUaGlzIGFsbG93cyBmb3IgdGhpbmdzIGxpa2UgdGhlIE9TIGFuZCBBQkkgdmVyc2lvbnMKLSAgICAgdG8gYmUgY2hhbmdlZC4gICovCi0gIHZvaWQgKCplbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycykKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIHByaW50cyBhIHN5bWJvbCB0byBmaWxlIGFuZCByZXR1cm5zIHRoZQotICAgICBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gYmUgcHJpbnRlZC4gIEl0IHNob3VsZCByZXR1cm4gTlVMTCB0byBmYWxsCi0gICAgIGJhY2sgdG8gZGVmYXVsdCBzeW1ib2wgcHJpbnRpbmcuICAqLwotICBjb25zdCBjaGFyICooKmVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwpCi0gICAgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIGFmdGVyIGFsbCBsb2NhbCBzeW1ib2xzIGFuZAotICAgICBnbG9iYWwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gbG9jYWxzIGFyZSBlbWl0ZWQgaW50byB0aGUgc3ltdGFiCi0gICAgIHNlY3Rpb24uICBJdCBhbGxvd3MgdGhlIGJhY2tlbmQgdG8gZW1pdCBzcGVjaWFsIGdsb2JhbCBzeW1ib2xzCi0gICAgIG5vdCBoYW5kbGVkIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIFBUUiwKLQkgICAgYm9vbGVhbiAoKikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0gICAgICAgICAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSkpKTsKLQotICAvKiBUaGUgc3dhcHBpbmcgdGFibGUgdG8gdXNlIHdoZW4gZGVhbGluZyB3aXRoIEVDT0ZGIGluZm9ybWF0aW9uLgotICAgICBVc2VkIGZvciB0aGUgTUlQUyBFTEYgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgLyogQWx0ZXJuYXRlIEVNX3h4eHggbWFjaGluZSBjb2RlcyBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgaW50IGVsZl9tYWNoaW5lX2FsdDE7Ci0gIGludCBlbGZfbWFjaGluZV9hbHQyOwotCi0gIGNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvICpzOwotCi0gIC8qIG9mZnNldCBvZiB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgLmdvdCBzZWN0aW9uICovCi0gIGJmZF92bWEgZ290X3N5bWJvbF9vZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGhlYWRlcnMgZm9yIHRoZSBHT1QgYW5kIFBMVC4gIFRoaXMgaW5jbHVkZXMKLSAgICAgdGhlIHNvLWNhbGxlZCByZXNlcnZlZCBlbnRyaWVzIG9uIHNvbWUgc3lzdGVtcy4gICovCi0gIGJmZF92bWEgZ290X2hlYWRlcl9zaXplOwotICBiZmRfdm1hIHBsdF9oZWFkZXJfc2l6ZTsKLQotICAvKiBUaGlzIGlzIHRydWUgaWYgdGhlIGxpbmtlciBzaG91bGQgYWN0IGxpa2UgY29sbGVjdCBhbmQgZ2F0aGVyCi0gICAgIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGJ5IG5hbWUuICBUaGlzIGlzIHRydWUgZm9yCi0gICAgIE1JUFMgRUxGIGJlY2F1c2UgdGhlIElyaXggNSB0b29scyBjYW4gbm90IGhhbmRsZSB0aGUgLmluaXQKLSAgICAgc2VjdGlvbi4gICovCi0gIHVuc2lnbmVkIGNvbGxlY3QgOiAxOwotCi0gIC8qIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgbGlua2VyIHNob3VsZCBpZ25vcmUgY2hhbmdlcyB0byB0aGUgdHlwZSBvZiBhCi0gICAgIHN5bWJvbC4gIFRoaXMgaXMgdHJ1ZSBmb3IgTUlQUyBFTEYgYmVjYXVzZSBzb21lIElyaXggNSBvYmplY3RzCi0gICAgIHJlY29yZCB1bmRlZmluZWQgZnVuY3Rpb25zIGFzIFNUVF9PQkpFQ1QgYWx0aG91Z2ggdGhlIGRlZmluaXRpb25zCi0gICAgIGFyZSBTVFRfRlVOQy4gICovCi0gIHVuc2lnbmVkIHR5cGVfY2hhbmdlX29rIDogMTsKLQotICAvKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG1heSB1c2UgUkVMIHJlbG9jYXRpb25zLiAgKFNvbWUgYmFja2VuZHMgdXNlCi0gICAgIGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zLCBhbmQgdGhpcyBmbGFnIGlzIHNldCBmb3IgdGhvc2UKLSAgICAgYmFja2VuZHMuKSAgKi8KLSAgdW5zaWduZWQgbWF5X3VzZV9yZWxfcCA6IDE7Ci0gICAgCi0gIC8qIFdoZXRoZXIgdGhlIGJhY2tlbmQgbWF5IHVzZSBSRUxBIHJlbG9jYXRpb25zLiAgKFNvbWUgYmFja2VuZHMgdXNlCi0gICAgIGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zLCBhbmQgdGhpcyBmbGFnIGlzIHNldCBmb3IgdGhvc2UKLSAgICAgYmFja2VuZHMuKSAgKi8KLSAgdW5zaWduZWQgbWF5X3VzZV9yZWxhX3AgOiAxOwotCi0gIC8qIFdoZXRoZXIgdGhlIGRlZmF1bHQgcmVsb2NhdGlvbiB0eXBlIGlzIFJFTEEuICBJZiBhIGJhY2tlbmQgd2l0aAotICAgICB0aGlzIGZsYWcgc2V0IHdhbnRzIFJFTCByZWxvY2F0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHNlY3Rpb24sCi0gICAgIGl0IG11c3Qgbm90ZSB0aGF0IGV4cGxpY2l0bHkuICBTaW1pbGFybHksIGlmIHRoaXMgZmxhZyBpcyBjbGVhciwKLSAgICAgYW5kIHRoZSBiYWNrZW5kIHdhbnRzIFJFTEEgcmVsb2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciAKLSAgICAgc2VjdGlvbi4gICovICAgCi0gIHVuc2lnbmVkIGRlZmF1bHRfdXNlX3JlbGFfcCA6IDE7Ci0KLSAgLyogVHJ1ZSBpZiBhZGRyZXNzZXMgIm5hdHVyYWxseSIgc2lnbiBleHRlbmQuICBUaGlzIGlzIHVzZWQgd2hlbgotICAgICBzd2FwcGluZyBpbiBmcm9tIEVsZjMyIHdoZW4gQkZENjQuICAqLwotICB1bnNpZ25lZCBzaWduX2V4dGVuZF92bWEgOiAxOwotCi0gIHVuc2lnbmVkIHdhbnRfZ290X3BsdCA6IDE7Ci0gIHVuc2lnbmVkIHBsdF9yZWFkb25seSA6IDE7Ci0gIHVuc2lnbmVkIHdhbnRfcGx0X3N5bSA6IDE7Ci0gIHVuc2lnbmVkIHBsdF9ub3RfbG9hZGVkIDogMTsKLSAgdW5zaWduZWQgcGx0X2FsaWdubWVudCA6IDQ7Ci0gIHVuc2lnbmVkIGNhbl9nY19zZWN0aW9ucyA6IDE7Ci0gIHVuc2lnbmVkIHdhbnRfZHluYnNzIDogMTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHN0b3JlZCBmb3IgZWFjaCBCRkQgc2VjdGlvbiBpbiBhbiBFTEYgZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgZWxmX25ld19zZWN0aW9uX2hvb2suICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEKLXsKLSAgLyogVGhlIEVMRiBoZWFkZXIgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHRoaXNfaGRyOwotICAvKiBUaGUgRUxGIGhlYWRlciBmb3IgdGhlIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgc2VjdGlvbiwgaWYgYW55LiAgKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgcmVsX2hkcjsKLSAgLyogSWYgdGhlcmUgaXMgYSBzZWNvbmQgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZWN0aW9uLAotICAgICBhcyBjYW4gaGFwcGVuIG9uIElyaXggNiwgdGhpcyBmaWVsZCBwb2ludHMgdG8gdGhlIGhlYWRlci4gICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyMjsKLSAgLyogVGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyBjdXJyZW50bHkgYXNzaWduZWQgdG8gUkVMX0hEUi4gICovCi0gIHVuc2lnbmVkIGludCByZWxfY291bnQ7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgY3VycmVudGx5IGFzc2lnbmVkIHRvIFJFTF9IRFIyLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlbF9jb3VudDI7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhpcyBzZWN0aW9uLiAgT25seSB1c2VkIGZvciBhbiBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGludCB0aGlzX2lkeDsKLSAgLyogVGhlIEVMRiBzZWN0aW9uIG51bWJlciBvZiB0aGUgcmVsb2Mgc2VjdGlvbiBpbmRpY2F0ZWQgYnkKLSAgICAgUkVMX0hEUiBpZiBhbnkuICBPbmx5IHVzZWQgZm9yIGFuIG91dHB1dCBmaWxlLiAgKi8KLSAgaW50IHJlbF9pZHg7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHJlbG9jIHNlY3Rpb24gaW5kaWNhdGVkIGJ5Ci0gICAgIFJFTF9IRFIyIGlmIGFueS4gIE9ubHkgdXNlZCBmb3IgYW4gb3V0cHV0IGZpbGUuICAqLwotICBpbnQgcmVsX2lkeDI7Ci0gIC8qIFVzZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyIHRvIHN0b3JlIHRoZSBzeW1ib2wgaGFzaCB0YWJsZSBlbnRyaWVzCi0gICAgIGFzc29jaWF0ZWQgd2l0aCByZWxvY3MgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKLSAgLyogQSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIHJlbG9jcy4gIElmIHRoZSBzZWN0aW9uIHVzZXMgUkVMIHJlbG9jcywKLSAgICAgcmF0aGVyIHRoYW4gUkVMQSwgYWxsIHRoZSByX2FkZGVuZCBmaWVsZHMgd2lsbCBiZSB6ZXJvLiAgVGhpcwotICAgICBwb2ludGVyIG1heSBiZSBOVUxMLiAgSXQgaXMgdXNlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIuICAqLwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAvKiBVc2VkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlciB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB0bwotICAgICByZWNvcmQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGV4IGZvciBhIHNlY3Rpb24gc3ltYm9sCi0gICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzZWN0aW9uLiAgQSB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgdGhlcmUgaXMKLSAgICAgbm8gZHluYW1pYyBzeW1ib2wgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIGxvbmcgZHluaW5keDsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEEgcG9pbnRlciBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgRUxGIGJhY2tlbmQuICAqLwotICBQVFIgdGRhdGE7Ci0gIC8qIE5vbnplcm8gaWYgdGhpcyBzZWN0aW9uIHVzZXMgUkVMQSByZWxvY2F0aW9ucywgcmF0aGVyIHRoYW4gUkVMLiAgKi8KLSAgdW5zaWduZWQgaW50IHVzZV9yZWxhX3A6MTsKLX07Ci0KLSNkZWZpbmUgZWxmX3NlY3Rpb25fZGF0YShzZWMpICAoKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSopc2VjLT51c2VkX2J5X2JmZCkKLQotI2RlZmluZSBnZXRfZWxmX2JhY2tlbmRfZGF0YShhYmZkKSBcCi0gICgoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKikgKGFiZmQpLT54dmVjLT5iYWNrZW5kX2RhdGEpCi0KLS8qIEVudW1lcmF0aW9uIHRvIHNwZWNpZnkgdGhlIHNwZWNpYWwgc2VjdGlvbi4gICovCi10eXBlZGVmIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0KLXsKLSAgTElOS0VSX1NFQ1RJT05fVU5LTk9XTiwJCS8qIG5vdCB1c2VkICovCi0gIExJTktFUl9TRUNUSU9OX0dPVCwJCQkvKiAuZ290IHNlY3Rpb24gZm9yIGdsb2JhbCBvZmZzZXQgcG9pbnRlcnMgKi8KLSAgTElOS0VSX1NFQ1RJT05fUExULAkJCS8qIC5wbHQgc2VjdGlvbiBmb3IgZ2VuZXJhdGVkIHByb2NlZHVyZSBzdHVicyAqLwotICBMSU5LRVJfU0VDVElPTl9TREFUQSwJCQkvKiAuc2RhdGEvLnNic3Mgc2VjdGlvbiBmb3IgUG93ZXJQQyAqLwotICBMSU5LRVJfU0VDVElPTl9TREFUQTIsCQkvKiAuc2RhdGEyLy5zYnNzMiBzZWN0aW9uIGZvciBQb3dlclBDICovCi0gIExJTktFUl9TRUNUSU9OX01BWAkJCS8qICMgb2YgbGlua2VyIHNlY3Rpb25zICovCi19IGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Q7Ci0KLS8qIFNlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbgotewotICBjaGFyICpuYW1lOwkJCQkvKiBuYW1lIG9mIHRoZSBzZWN0aW9uICovCi0gIGNoYXIgKnJlbF9uYW1lOwkJCS8qIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgLnJlbHssYX0uIHNlY3Rpb24gKi8KLSAgY2hhciAqYnNzX25hbWU7CQkJLyogbmFtZSBvZiBhIHJlbGF0ZWQgLmJzcyBzZWN0aW9uICovCi0gIGNoYXIgKnN5bV9uYW1lOwkJCS8qIG5hbWUgb2Ygc3ltYm9sIHRvIHJlZmVyZW5jZSB0aGlzIHNlY3Rpb24gKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247CQkJLyogcG9pbnRlciB0byB0aGUgc2VjdGlvbiAqLwotICBhc2VjdGlvbiAqYnNzX3NlY3Rpb247CQkvKiBwb2ludGVyIHRvIHRoZSBic3Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyAqLwotICBhc2VjdGlvbiAqcmVsX3NlY3Rpb247CQkvKiBwb2ludGVyIHRvIHRoZSByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIHRoaXMgc2VjdGlvbiAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7CS8qIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgc3ltYm9sIGhhc2ggdmFsdWUgKi8KLSAgYmZkX3ZtYSBpbml0aWFsX3NpemU7CQkJLyogaW5pdGlhbCBzaXplIGJlZm9yZSBhbnkgbGlua2VyIGdlbmVyYXRlZCBhbGxvY2F0aW9ucyAqLwotICBiZmRfdm1hIHN5bV9vZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIHN5bWJvbCBmcm9tIGJlZ2lubmluZyBvZiBzZWN0aW9uICovCi0gIGJmZF92bWEgaG9sZV9zaXplOwkJCS8qIHNpemUgb2YgcmVzZXJ2ZWQgYWRkcmVzcyBob2xlIGluIGFsbG9jYXRpb24gKi8KLSAgYmZkX3ZtYSBob2xlX29mZnNldDsJCQkvKiBjdXJyZW50IG9mZnNldCBmb3IgdGhlIGhvbGUgKi8KLSAgYmZkX3ZtYSBtYXhfaG9sZV9vZmZzZXQ7CQkvKiBtYXhpbXVtIG9mZnNldCBmb3IgdGhlIGhvbGUgKi8KLSAgZWxmX2xpbmtlcl9zZWN0aW9uX2VudW1fdCB3aGljaDsJLyogd2hpY2ggc2VjdGlvbiB0aGlzIGlzICovCi0gIGJvb2xlYW4gaG9sZV93cml0dGVuX3A7CQkvKiB3aGV0aGVyIHRoZSBob2xlIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0gIHVuc2lnbmVkIGludCBhbGlnbm1lbnQ7CQkvKiBhbGlnbm1lbnQgZm9yIHRoZSBzZWN0aW9uICovCi0gIGZsYWd3b3JkIGZsYWdzOwkJCS8qIGZsYWdzIHRvIHVzZSB0byBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLX0gZWxmX2xpbmtlcl9zZWN0aW9uX3Q7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGFsbG9jYXRlZCBwb2ludGVyIGVudHJpZXMuICBUaGlzIGhhbmdzIG9mZiBvZiB0aGUgc3ltYm9sIGxpc3RzLCBhbmQKLSAgIHByb3ZpZGVzIGFsbG93cyB1cyB0byByZXR1cm4gZGlmZmVyZW50IHBvaW50ZXJzLCBiYXNlZCBvbiBkaWZmZXJlbnQgYWRkZW5kJ3MuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMKLXsKLSAgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVycyAqbmV4dDsJLyogbmV4dCBhbGxvY2F0ZWQgcG9pbnRlciBmb3IgdGhpcyBzeW1ib2wgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7CQkJCS8qIG9mZnNldCBvZiBwb2ludGVyIGZyb20gYmVnaW5uaW5nIG9mIHNlY3Rpb24gKi8KLSAgYmZkX3NpZ25lZF92bWEgYWRkZW5kOwkJCS8qIGFkZGVuZCB1c2VkICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7CQkvKiB3aGljaCBsaW5rZXIgc2VjdGlvbiB0aGlzIGlzICovCi0gIGJvb2xlYW4gd3JpdHRlbl9hZGRyZXNzX3A7CQkJLyogd2hldGhlciBhZGRyZXNzIHdhcyB3cml0dGVuIHlldCAqLwotfSBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdDsKLQotLyogU29tZSBwcml2YXRlIGRhdGEgaXMgc3Rhc2hlZCBhd2F5IGZvciBmdXR1cmUgdXNlIHVzaW5nIHRoZSB0ZGF0YSBwb2ludGVyCi0gICBpbiB0aGUgYmZkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBlbGZfb2JqX3RkYXRhCi17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyIGVsZl9oZWFkZXJbMV07CS8qIEFjdHVhbCBkYXRhLCBidXQgcmVmIGxpa2UgcHRyICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICoqZWxmX3NlY3RfcHRyOwotICBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqc2VnbWVudF9tYXA7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYl9wdHI7Ci0gIGludCBudW1fbG9jYWxzOwotICBpbnQgbnVtX2dsb2JhbHM7Ci0gIGFzeW1ib2wgKipzZWN0aW9uX3N5bXM7CQkvKiBTVFRfU0VDVElPTiBzeW1ib2xzIGZvciBlYWNoIHNlY3Rpb24gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgc2hzdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBzdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW5zeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW5zdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJzeW1faGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJyZWZfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJkZWZfaGRyOwotICB1bnNpZ25lZCBpbnQgc3ltdGFiX3NlY3Rpb24sIHNoc3RydGFiX3NlY3Rpb247Ci0gIHVuc2lnbmVkIGludCBzdHJ0YWJfc2VjdGlvbiwgZHluc3ltdGFiX3NlY3Rpb247Ci0gIHVuc2lnbmVkIGludCBkeW52ZXJzeW1fc2VjdGlvbiwgZHludmVyZGVmX3NlY3Rpb24sIGR5bnZlcnJlZl9zZWN0aW9uOwotICBmaWxlX3B0ciBuZXh0X2ZpbGVfcG9zOwotI2lmIDAKLSAgLyogd2UgZG9uJ3QgbmVlZCB0aGVzZSBpbnNpZGUgYmZkIGFueW1vcmUsIGFuZCBJIHRoaW5rCi0gICAgIHRoZXNlIHdlcmVuJ3QgdXNlZCBvdXRzaWRlIGJmZC4gKi8KLSAgdm9pZCAqcHJzdGF0dXM7CQkJLyogVGhlIHJhdyAvcHJvYyBwcnN0YXR1cyBzdHJ1Y3R1cmUgKi8KLSAgdm9pZCAqcHJwc2luZm87CQkJLyogVGhlIHJhdyAvcHJvYyBwcnBzaW5mbyBzdHJ1Y3R1cmUgKi8KLSNlbmRpZgotICBiZmRfdm1hIGdwOwkJCQkvKiBUaGUgZ3AgdmFsdWUgKE1JUFMgb25seSwgZm9yIG5vdykgKi8KLSAgdW5zaWduZWQgaW50IGdwX3NpemU7CQkJLyogVGhlIGdwIHNpemUgKE1JUFMgb25seSwgZm9yIG5vdykgKi8KLQotICAvKiBJbmZvcm1hdGlvbiBncmFiYmVkIGZyb20gYW4gZWxmIGNvcmUgZmlsZS4gKi8KLSAgaW50IGNvcmVfc2lnbmFsOwotICBpbnQgY29yZV9waWQ7Ci0gIGludCBjb3JlX2x3cGlkOwotICBjaGFyKiBjb3JlX3Byb2dyYW07Ci0gIGNoYXIqIGNvcmVfY29tbWFuZDsKLQotICAvKiBUaGlzIGlzIHNldCB0byB0cnVlIGlmIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYnkgdGhlIGJhY2tlbmQKLSAgICAgbGlua2VyLiAgKi8KLSAgYm9vbGVhbiBsaW5rZXI7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gZXh0ZXJuYWwgc3ltYm9scyB0byBlbnRyaWVzIGluIHRoZSBsaW5rZXIgaGFzaAotICAgICB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGlzIGlzIGluZGV4ZWQgYnkgdGhlIHN5bWJvbCBpbmRleAotICAgICBtaW51cyB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltYm9sIHRhYmxlIGhlYWRlci4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgZ2xvYmFsIG9mZnNldAotICAgICB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGlzIGlzIGluZGV4ZWQgYnkgdGhlIHN5bWJvbCBpbmRleC4KLSAgICAgTGlrZSBmb3IgdGhlIGdsb2JhbHMsIHdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvCi0gICAgIGRvY3VtZW50IHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZAotICAgICBzaG91bGQgYmUgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2gKLSAgICAgcG9pbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiBhbiBlbnRyeQotICAgICBpcyAtMSwgdGhlbiB0aGUgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hICpyZWZjb3VudHM7Ci0gICAgICBiZmRfdm1hICpvZmZzZXRzOwotICAgIH0gbG9jYWxfZ290OwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSB2YXJpb3VzIGxpbmtlcgotICAgICBzZWN0aW9ucyBhZGRlZC4gIFRoaXMgaXMgaW5kZXggYnkgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqbGlua2VyX3NlY3Rpb25fcG9pbnRlcnM7Ci0KLSAgLyogVGhlIGxpbmtlciBFTEYgZW11bGF0aW9uIGNvZGUgbmVlZHMgdG8gbGV0IHRoZSBiYWNrZW5kIEVMRiBsaW5rZXIKLSAgICAga25vdyB3aGF0IGZpbGVuYW1lIHNob3VsZCBiZSB1c2VkIGZvciBhIGR5bmFtaWMgb2JqZWN0IGlmIHRoZQotICAgICBkeW5hbWljIG9iamVjdCBpcyBmb3VuZCB1c2luZyBhIHNlYXJjaC4gIFRoZSBlbXVsYXRpb24gY29kZSB0aGVuCi0gICAgIHNvbWV0aW1lcyBuZWVkcyB0byBrbm93IHdoYXQgbmFtZSB3YXMgYWN0dWFsbHkgdXNlZC4gIFVudGlsIHRoZQotICAgICBmaWxlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBsaW5rZXIgc3ltYm9sIHRhYmxlLCB0aGlzIGZpZWxkIGhvbGRzCi0gICAgIHRoZSBuYW1lIHRoZSBsaW5rZXIgd2FudHMuICBBZnRlciBpdCBoYXMgYmVlbiBhZGRlZCwgaXQgaG9sZHMgdGhlCi0gICAgIG5hbWUgYWN0dWFsbHkgdXNlZCwgd2hpY2ggd2lsbCBiZSB0aGUgRFRfU09OQU1FIGVudHJ5IGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gICovCi0gIGNvbnN0IGNoYXIgKmR0X25hbWU7Ci0KLSAgLyogSXJpeCA1IG9mdGVuIHNjcmV3cyB1cCB0aGUgc3ltYm9sIHRhYmxlLCBzb3J0aW5nIGxvY2FsIHN5bWJvbHMKLSAgICAgYWZ0ZXIgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGZsYWcgaXMgc2V0IGlmIHRoZSBzeW1ib2wgdGFibGUgaW4KLSAgICAgdGhpcyBCRkQgYXBwZWFycyB0byBiZSBzY3Jld2VkIHVwLiAgSWYgaXQgaXMsIHdlIGlnbm9yZSB0aGUKLSAgICAgc2hfaW5mbyBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGhlYWRlciwgYW5kIGFsd2F5cyByZWFkIGFsbCB0aGUKLSAgICAgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gYmFkX3N5bXRhYjsKLQotICAvKiBSZWNvcmRzIHRoZSByZXN1bHQgb2YgYGdldF9wcm9ncmFtX2hlYWRlcl9zaXplJy4gICovCi0gIGJmZF9zaXplX3R5cGUgcHJvZ3JhbV9oZWFkZXJfc2l6ZTsKLQotICAvKiBVc2VkIGJ5IGZpbmRfbmVhcmVzdF9saW5lIGVudHJ5IHBvaW50LiAgKi8KLSAgUFRSIGxpbmVfaW5mbzsKLQotICAvKiBVc2VkIGJ5IE1JUFMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIGVudHJ5IHBvaW50LiAgVGhlIHN0cnVjdHVyZQotICAgICBjb3VsZCBiZSBpbmNsdWRlZCBkaXJlY3RseSBpbiB0aGlzIG9uZSwgYnV0IHRoZXJlJ3Mgbm8gcG9pbnQgdG8KLSAgICAgd2FzdGluZyB0aGUgbWVtb3J5IGp1c3QgZm9yIHRoZSBpbmZyZXF1ZW50bHkgY2FsbGVkCi0gICAgIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmluZF9saW5lX2luZm87Ci0KLSAgLyogQSBwbGFjZSB0byBzdGFzaCBkd2FyZjEgaW5mbyBmb3IgdGhpcyBiZmQuICovCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcgKmR3YXJmMV9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBBIHBsYWNlIHRvIHN0YXNoIGR3YXJmMiBpbmZvIGZvciB0aGlzIGJmZC4gKi8KLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqZHdhcmYyX2ZpbmRfbGluZV9pbmZvOwotCi0gIC8qIEFuIGFycmF5IG9mIHN0dWIgc2VjdGlvbnMgaW5kZXhlZCBieSBzeW1ib2wgbnVtYmVyLCB1c2VkIGJ5IHRoZQotICAgICBNSVBTIEVMRiBsaW5rZXIuICBGSVhNRTogV2Ugc2hvdWxkIGZpZ3VyZSBvdXQgc29tZSB3YXkgdG8gb25seQotICAgICBpbmNsdWRlIHRoaXMgZmllbGQgZm9yIGEgTUlQUyBFTEYgdGFyZ2V0LiAgKi8KLSAgYXNlY3Rpb24gKipsb2NhbF9zdHViczsKLQotICAvKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgZV9mbGFncyBmaWVsZCBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotICBib29sZWFuIGZsYWdzX2luaXQ7Ci0KLSAgLyogTnVtYmVyIG9mIHN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb25zIHdlIGFyZSBhYm91dCB0byBlbWl0LiAgKi8KLSAgdW5zaWduZWQgaW50IGN2ZXJkZWZzOwotCi0gIC8qIE51bWJlciBvZiBzeW1ib2wgdmVyc2lvbiByZWZlcmVuY2VzIHdlIGFyZSBhYm91dCB0byBlbWl0LiAgKi8KLSAgdW5zaWduZWQgaW50IGN2ZXJyZWZzOwotCi0gIC8qIFN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb25zIGluIGV4dGVybmFsIG9iamVjdHMuICAqLwotICBFbGZfSW50ZXJuYWxfVmVyZGVmICp2ZXJkZWY7Ci0KLSAgLyogU3ltYm9sIHZlcnNpb24gcmVmZXJlbmNlcyB0byBleHRlcm5hbCBvYmplY3RzLiAgKi8KLSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnZlcnJlZjsKLQotICAvKiBMaW5rZXIgc2VjdGlvbnMgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb24gKmxpbmtlcl9zZWN0aW9uWyAoaW50KUxJTktFUl9TRUNUSU9OX01BWCBdOwotfTsKLQotI2RlZmluZSBlbGZfdGRhdGEoYmZkKQkJKChiZmQpIC0+IHRkYXRhLmVsZl9vYmpfZGF0YSkKLSNkZWZpbmUgZWxmX2VsZmhlYWRlcihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBlbGZfaGVhZGVyKQotI2RlZmluZSBlbGZfZWxmc2VjdGlvbnMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZWxmX3NlY3RfcHRyKQotI2RlZmluZSBlbGZfc2hzdHJ0YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3RydGFiX3B0cikKLSNkZWZpbmUgZWxmX29uZXN5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzeW10YWJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnN5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW5zeW10YWJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcnN5bShiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJzeW1fc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcmRlZihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJkZWZfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcnJlZihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJyZWZfc2VjdGlvbikKLSNkZWZpbmUgZWxmX251bV9sb2NhbHMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gbnVtX2xvY2FscykKLSNkZWZpbmUgZWxmX251bV9nbG9iYWxzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IG51bV9nbG9iYWxzKQotI2RlZmluZSBlbGZfc2VjdGlvbl9zeW1zKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHNlY3Rpb25fc3ltcykKLSNkZWZpbmUgY29yZV9wcnBzaW5mbyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBwcnBzaW5mbykKLSNkZWZpbmUgY29yZV9wcnN0YXR1cyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBwcnN0YXR1cykKLSNkZWZpbmUgZWxmX2dwKGJmZCkJCShlbGZfdGRhdGEoYmZkKSAtPiBncCkKLSNkZWZpbmUgZWxmX2dwX3NpemUoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZ3Bfc2l6ZSkKLSNkZWZpbmUgZWxmX3N5bV9oYXNoZXMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3ltX2hhc2hlcykKLSNkZWZpbmUgZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMoYmZkKSAoZWxmX3RkYXRhKGJmZCkgLT4gbG9jYWxfZ290LnJlZmNvdW50cykKLSNkZWZpbmUgZWxmX2xvY2FsX2dvdF9vZmZzZXRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxvY2FsX2dvdC5vZmZzZXRzKQotI2RlZmluZSBlbGZfbG9jYWxfcHRyX29mZnNldHMoYmZkKSAoZWxmX3RkYXRhKGJmZCkgLT4gbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMpCi0jZGVmaW5lIGVsZl9kdF9uYW1lKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGR0X25hbWUpCi0jZGVmaW5lIGVsZl9iYWRfc3ltdGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGJhZF9zeW10YWIpCi0jZGVmaW5lIGVsZl9mbGFnc19pbml0KGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGZsYWdzX2luaXQpCi0jZGVmaW5lIGVsZl9saW5rZXJfc2VjdGlvbihiZmQsbikgKGVsZl90ZGF0YShiZmQpIC0+IGxpbmtlcl9zZWN0aW9uWyhpbnQpbl0pCi0MCi1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRlZiAqLCBFbGZfSW50ZXJuYWxfVmVyZGVmICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRlZiAqLCBFbGZfRXh0ZXJuYWxfVmVyZGVmICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRhdXggKiwgRWxmX0ludGVybmFsX1ZlcmRhdXggKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRhdXggKiwgRWxmX0V4dGVybmFsX1ZlcmRhdXggKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqLCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqLCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJuYXV4ICosIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuYXV4ICosIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyc3ltICosIEVsZl9JbnRlcm5hbF9WZXJzeW0gKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVyc3ltICosIEVsZl9FeHRlcm5hbF9WZXJzeW0gKikpOwotCi1leHRlcm4gaW50IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCkpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwKLQkJCQkJICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLSNkZWZpbmUgZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIoYWJmZCxzdHJpbmRleCkgXAotICAgICBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKGFiZmQsZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keCxzdHJpbmRleCkKLQotI2RlZmluZSBiZmRfZWxmMzJfcHJpbnRfc3ltYm9sCWJmZF9lbGZfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGJmZF9lbGY2NF9wcmludF9zeW1ib2wJYmZkX2VsZl9wcmludF9zeW1ib2wKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmZkX2VsZl9oYXNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkgICAgYXJlbGVudCAqLAotCQkJCQkJCSAgICBhc3ltYm9sICosCi0JCQkJCQkJICAgIFBUUiwKLQkJCQkJCQkgICAgYXNlY3Rpb24gKiwKLQkJCQkJCQkgICAgYmZkICosCi0JCQkJCQkJICAgIGNoYXIgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfbWtjb3JlZmlsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9TaGRyICpiZmRfZWxmX2ZpbmRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgRWxmX0ludGVybmFsX1NoZHIgKmhkciwgY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkcgotICBQQVJBTVMgKChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9QaGRyICpoZHIsIGludCBpbmRleCwgY29uc3QgY2hhciAqdHlwZW5hbWUpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLQkJCQkJCSAgICAgICBmaWxlX3B0ciwKLQkJCQkJCSAgICAgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0JCQkJCQkgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwKLQkJCQkJCQkgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICAgIHN5bWJvbF9pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFsZW50ICpfYmZkX2VsZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJCXVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgIGFzeW1ib2wgKiosCi0JCQkJCQkgICAgYmZkX3ZtYSwgQ09OU1QgY2hhciAqKiwKLQkJCQkJCSAgICBDT05TVCBjaGFyICoqLAotCQkJCQkJICAgIHVuc2lnbmVkIGludCAqKSk7Ci0jZGVmaW5lIF9iZmRfZWxmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgX2JmZF9lbGZfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi1leHRlcm4gaW50IF9iZmRfZWxmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIgCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBib29sZWFuKSk7Ci0KLS8qIElmIHRoZSB0YXJnZXQgZG9lc24ndCBoYXZlIHJlbG9jIGhhbmRsaW5nIHdyaXR0ZW4geWV0OiAgKi8KLWV4dGVybiB2b2lkIF9iZmRfZWxmX25vX2luZm9fdG9faG93dG8gUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKLQkJCQkJICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3NlY3Rpb25fZnJvbV9zaGRyIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgc2hpbmRleCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NlY3Rpb25fZnJvbV9waGRyIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLQotZXh0ZXJuIGludCBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci0KLWFzZWN0aW9uICpiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50KSk7Ci1ib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1ib29sZWFuCi1fYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLWxvbmcKLV9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHggUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgIGJmZCAqLCBsb25nKSk7Ci1ib29sZWFuCi1fYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotdm9pZCBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyBQQVJBTVMgKChiZmQgKikpOwotZmlsZV9wdHIgX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gUEFSQU1TICgoRWxmX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCQkgICAgZmlsZV9wdHIsCi0JCQkJCQkJICAgIGJvb2xlYW4pKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKikpOwotCi1ib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1ib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci11bnNpZ25lZCBsb25nIF9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKl9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSwKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqZGVmYXVsdHMpKTsKLQotZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKl9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbgotICBQQVJBTVMgKChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzLAotCSAgIGJmZF9zaWduZWRfdm1hIGFkZGVuZCwKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoKSk7Ci0KLWJvb2xlYW4gYmZkX2VsZjMyX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgY29uc3QgRWxmMzJfSW50ZXJuYWxfUmVsYSAqcmVsKSk7Ci0KLWJmZF92bWEgYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2FiZmQsCi0JICAgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkgICBjb25zdCBFbGYzMl9JbnRlcm5hbF9SZWxhICpyZWwsCi0JICAgaW50IHJlbGF0aXZlX3JlbG9jKSk7Ci0KLWJvb2xlYW4gYmZkX2VsZjY0X2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVsYSAqcmVsKSk7Ci0KLWJmZF92bWEgYmZkX2VsZjY0X2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2FiZmQsCi0JICAgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWxhICpyZWwsCi0JICAgaW50IHJlbGF0aXZlX3JlbG9jKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhCi0gIFBBUkFNUyAoKGJmZCAqZHlub2JqLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBpbnQgYWxpZ25tZW50KSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGYzMl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGYzMl9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGYzMl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGYzMl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJCSBiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1N5bSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVsICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICosIEVsZjMyX0V4dGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9waGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9QaGRyICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBFbGYzMl9FeHRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX2R5bl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9EeW4gKiwgUFRSKSk7Ci1leHRlcm4gbG9uZyBiZmRfZWxmMzJfc2x1cnBfc3ltYm9sX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfd3JpdGVfc2hkcnNfYW5kX2VoZHIgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjMyX3dyaXRlX291dF9waGRycwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBFbGZfSW50ZXJuYWxfUmVsYSAqX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIEVsZl9JbnRlcm5hbF9SZWxhICosIGJvb2xlYW4pKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGY2NF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGY2NF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGY2NF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGY2NF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJCSBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9TeW0gKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIFBUUikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlbCAqLCBFbGZfSW50ZXJuYWxfUmVsICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBFbGY2NF9FeHRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZjY0X0V4dGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcGhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUGhkciAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9waGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgRWxmNjRfRXh0ZXJuYWxfUGhkciAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9keW5faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9keW5fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRHluICosIFBUUikpOwotZXh0ZXJuIGxvbmcgYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gRWxmX0ludGVybmFsX1JlbGEgKl9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBib29sZWFuKSk7Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIFwKLSAgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIFwKLSAgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLQotYm9vbGVhbiBfYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBsb25nKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGxvbmcpKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIFBUUiwKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX2NvbW1vbl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19jb21tb25fZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX3JlY29yZF92dGluaGVyaXQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19yZWNvcmRfdnRlbnRyeQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotCi0vKiBNSVBTIEVMRiBzcGVjaWZpYyByb3V0aW5lcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBhc2VjdGlvbiAqIF9iZmRfbWlwc19lbGZfZ2NfbWFya19ob29rIAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfbWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIAotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBpbnQgX2JmZF9taXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi0jZW5kaWYgLyogX0xJQkVMRl9IXyAqLwpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1ocHBhLmggYi9iZmQvZWxmLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljYzE3ZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NzkgKzAsMCBAQAotLyogQ29tbW9uIGNvZGUgZm9yIFBBIEVMRiBpbXBsZW1lbnRhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBFTEZfSE9XVE9fVEFCTEVfU0laRSAgICAgICBSX1BBUklTQ19VTklNUExFTUVOVEVEICsgMQotCi0vKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgbXVsdGlwbGUgUEEgRUxGIEJGRCBiYWNrZW5kcyB3aXRoIGRpZmZlcmVudAotICAgc2l6ZXMuCi0KLSAgIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGFyZSB3cml0dGVuIHRvIGJlIHNpemUgaW5kZXBlbmRlbnQsIGJ1dCBzb21ldGltZXMKLSAgIGV4dGVybmFsIGNvbnN0cmFpbnRzIHJlcXVpcmUgMzIgb3IgNjQgYml0IHNwZWNpZmljIGNvZGUuICBXZSByZW1hcAotICAgdGhlIGRlZmluaXRpb25zL2Z1bmN0aW9ucyBhcyBuZWNlc3NhcnkgaGVyZS4gICovCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIEVMRl9SX1RZUEUoWCkgICBFTEY2NF9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGX1JfU1lNKFgpICAgRUxGNjRfUl9TWU0oWCkKLSNkZWZpbmUgX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSBfYmZkX2VsZjY0X2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSNkZWZpbmUgZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbiBlbGY2NF9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZl9iZmRfZmluYWxfbGluayBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgZWxmX2hwcGFfZmluYWxfbGluayBlbGY2NF9ocHBhX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBFTEZfUl9UWVBFKFgpICAgRUxGMzJfUl9UWVBFKFgpCi0jZGVmaW5lIEVMRl9SX1NZTShYKSAgIEVMRjMyX1JfU1lNKFgpCi0jZGVmaW5lIF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUgX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlCi0jZGVmaW5lIGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24gZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZfYmZkX2ZpbmFsX2xpbmsgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCi0jZGVmaW5lIGVsZl9ocHBhX2ZpbmFsX2xpbmsgZWxmMzJfaHBwYV9maW5hbF9saW5rCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotICAgICAgICAgICBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosCi0gICAgICAgICAgIGJmZF9ieXRlICosIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0gICAgICAgICAgIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKikpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2hwcGFfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfaHBwYV9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgdm9pZCBlbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLS8qIEVMRi9QQSByZWxvY2F0aW9uIGhvd3RvIGVudHJpZXMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfaHBwYV9ob3d0b190YWJsZVtFTEZfSE9XVE9fVEFCTEVfU0laRV0gPQotewotICB7Ul9QQVJJU0NfTk9ORSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19OT05FIn0sCi0KLSAgLyogVGhlIHZhbHVlcyBpbiBESVIzMiBhcmUgdG8gcGxhY2F0ZSB0aGUgY2hlY2sgaW4KLSAgICAgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICB7Ul9QQVJJU0NfRElSMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjMyIiwgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfUEFSSVNDX0RJUjIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMjFMIn0sCi0gIHtSX1BBUklTQ19ESVIxN1IsIDAsIDAsIDE3LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE3UiJ9LAotICB7Ul9QQVJJU0NfRElSMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxN0YifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRElSMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDMyLCAwLCAwLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMzIifSwKLQotICB7Ul9QQVJJU0NfUENSRUwyMUwsIDAsIDAsIDIxLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwyMUwifSwKLSAge1JfUEFSSVNDX1BDUkVMMTdSLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTdSIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE3RiwgMCwgMCwgMTcsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE3RiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxN0MsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxN0MifSwKLSAge1JfUEFSSVNDX1BDUkVMMTRSLCAwLCAwLCAxNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE0RiwgMCwgMCwgMTQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RQUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19EUFJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfRFBSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMTRXUiJ9LAotCi0gIHtSX1BBUklTQ19EUFJFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RQUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19EUFJFTDE0UiJ9LAotICB7Ul9QQVJJU0NfRFBSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfRExUUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwxNFIifSwKLSAge1JfUEFSSVNDX0RMVFJFTDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVElORDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUSU5EMTRSIn0sCi0gIHtSX1BBUklTQ19ETFRJTkQxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVElORDE0RiJ9LAotCi0gIHtSX1BBUklTQ19TRVRCQVNFLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1NFVEJBU0UifSwKLSAge1JfUEFSSVNDX1NFQ1JFTDMyLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1NFQ1JFTDMyIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTdSLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTdSIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTdGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxNFIifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxNEYifSwKLSAge1JfUEFSSVNDX1NFR0JBU0UsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VHQkFTRSJ9LAotICB7Ul9QQVJJU0NfU0VHUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VHUkVMMzIifSwKLQotICB7Ul9QQVJJU0NfUExUT0ZGMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0UiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjMyIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9GUFRSMTRSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0ZQVFI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19GUFRSNjQifSwKLSAge1JfUEFSSVNDX1BMQUJFTDMyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwzMiJ9LAotICB7Ul9QQVJJU0NfUExBQkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfUExBQkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUENSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDY0In0sCi0gIHtSX1BBUklTQ19QQ1JFTDIyQywgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDIyQyJ9LAotICB7Ul9QQVJJU0NfUENSRUwyMkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwyMkYifSwKLSAge1JfUEFSSVNDX1BDUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0V1IifSwKLSAge1JfUEFSSVNDX1BDUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0RFIifSwKLSAge1JfUEFSSVNDX1BDUkVMMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTZGIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNldGIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNkRGIn0sCi0KLSAge1JfUEFSSVNDX0RJUjY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjY0In0sCi0gIHtSX1BBUklTQ19OT05FLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX05PTkUifSwKLSAge1JfUEFSSVNDX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTk9ORSJ9LAotICB7Ul9QQVJJU0NfRElSMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNFdSIn0sCi0gIHtSX1BBUklTQ19ESVIxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE0RFIifSwKLSAge1JfUEFSSVNDX0RJUjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNkYifSwKLSAge1JfUEFSSVNDX0RJUjE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTZXRiJ9LAotICB7Ul9QQVJJU0NfRElSMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNkRGIn0sCi0gIHtSX1BBUklTQ19HUFJFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0dQUkVMNjQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVFJFTDE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMTRXUiJ9LAotICB7Ul9QQVJJU0NfRExUUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19HUFJFTDE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19HUFJFTDE2RiJ9LAotICB7Ul9QQVJJU0NfR1BSRUwxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0dQUkVMMTZXRiJ9LAotICB7Ul9QQVJJU0NfR1BSRUwxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0dQUkVMMTZERiJ9LAotICB7Ul9QQVJJU0NfTFRPRkY2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRjY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNFdSIn0sCi0KLSAge1JfUEFSSVNDX0RMVElORDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUSU5EMTREUiJ9LAotICB7Ul9QQVJJU0NfTFRPRkYxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkYxNkYifSwKLSAge1JfUEFSSVNDX0xUT0ZGMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRjE2REYifSwKLSAge1JfUEFSSVNDX0xUT0ZGMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRjE2REYifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CU0VSRUwxNFdSIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1NFR1JFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1NFR1JFTDY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNFdSIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0RFIifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNkYifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTZXRiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNkRGIn0sCi0KLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1IifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19DT1BZLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0NPUFkifSwKLSAge1JfUEFSSVNDX0lQTFQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfSVBMVCJ9LAotCi0gIHtSX1BBUklTQ19FUExULCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0VQTFQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwzMiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9UUDE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9UUDE0RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVFBSRUw2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19UUFJFTDE0V1IifSwKLQotICB7Ul9QQVJJU0NfVFBSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1RQUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVFBSRUwxNkYifSwKLSAge1JfUEFSSVNDX1RQUkVMMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19UUFJFTDE2V0YifSwKLSAge1JfUEFSSVNDX1RQUkVMMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19UUFJFTDE2REYifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfVFA2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE0V1IifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE0RFIifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX0xUT0ZGX1RQMTZGIn0sCi0KLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE2V0YifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE2REYifSwKLX07Ci0KLSNkZWZpbmUgT0ZGU0VUXzE0Ul9GUk9NXzIxTCA0Ci0jZGVmaW5lIE9GRlNFVF8xNEZfRlJPTV8yMUwgNQotCi0vKiBSZXR1cm4gb25lIChvciBtb3JlKSBCRkQgcmVsb2NhdGlvbnMgd2hpY2ggaW1wbGVtZW50IHRoZSBiYXNlCi0gICByZWxvY2F0aW9uIHdpdGggbW9kaWZpY2F0aW9ucyBiYXNlZCBvbiBmb3JtYXQgYW5kIGZpZWxkLiAgKi8KLQotZWxmX2hwcGFfcmVsb2NfdHlwZSAqKgotX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSAoYWJmZCwgYmFzZV90eXBlLCBmb3JtYXQsIGZpZWxkLCBpZ25vcmUsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbGZfaHBwYV9yZWxvY190eXBlIGJhc2VfdHlwZTsKLSAgICAgaW50IGZvcm1hdDsKLSAgICAgaW50IGZpZWxkOwotICAgICBpbnQgaWdub3JlOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGVsZl9ocHBhX3JlbG9jX3R5cGUgKmZpbmFsdHlwZTsKLSAgZWxmX2hwcGFfcmVsb2NfdHlwZSAqKmZpbmFsX3R5cGVzOwotCi0gIC8qIEFsbG9jYXRlIHNsb3RzIGZvciB0aGUgQkZEIHJlbG9jYXRpb24uICAqLwotICBmaW5hbF90eXBlcyA9ICgoZWxmX2hwcGFfcmVsb2NfdHlwZSAqKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfaHBwYV9yZWxvY190eXBlICopICogMikpOwotICBpZiAoZmluYWxfdHlwZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlbG9jYXRpb24gaXRzZWxmLiAgKi8KLSAgZmluYWx0eXBlID0gKChlbGZfaHBwYV9yZWxvY190eXBlICopCi0JICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfaHBwYV9yZWxvY190eXBlKSkpOwotICBpZiAoZmluYWx0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgZmluYWxfdHlwZXNbMF0gPSBmaW5hbHR5cGU7Ci0gIGZpbmFsX3R5cGVzWzFdID0gTlVMTDsKLQotI2RlZmluZSBmaW5hbF90eXBlIGZpbmFsdHlwZVswXQotCi0gIGZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0KLSAgLyogSnVzdCBhIHRhbmdsZSBvZiBuZXN0ZWQgc3dpdGNoIHN0YXRlbWVudHMgdG8gZGVhbCB3aXRoIHRoZSBicmFpbmRhbWFnZQotICAgICB0aGF0IGEgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9yIG1lYW5zIGEgY29tcGxldGVseSBkaWZmZXJlbnQgcmVsb2NhdGlvbgotICAgICBmb3IgUEEgRUxGLiAgKi8KLSAgc3dpdGNoIChiYXNlX3R5cGUpCi0gICAgewotICAgIC8qIFdlIGhhdmUgYmVlbiB1c2luZyBnZW5lcmljIHJlbG9jYXRpb24gdHlwZXMuICBIb3dldmVyLCB0aGF0IG1heSBub3QKLSAgICAgICByZWFsbHkgbWFrZSBzZW5zZS4gIEFueXdheSwgd2UgbmVlZCB0byBzdXBwb3J0IGJvdGggUl9QQVJJU0NfRElSNjQKLSAgICAgICBhbmQgUl9QQVJJU0NfRElSMzIgaGVyZS4gICovCi0gICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjY0OgotICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgotICAgICAgc3dpdGNoIChmb3JtYXQpCi0JewotCWNhc2UgMTQ6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3J0c2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ETFRJTkQxNFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9ydHBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfdHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUSU5EMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDE3OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMTdGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxN1I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xzZWw6Ci0JICAgIGNhc2UgZV9scnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfbHRzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RMVElORDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2x0cHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfTFRPRkZfRlBUUjIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2xwc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAzMjoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjMyOwotCSAgICAgIC8qIFdoZW4gaW4gNjRiaXQgbW9kZSwgYSAzMmJpdCByZWxvY2F0aW9uIGlzIHN1cHBvc2VkIHRvCi0JCSBiZSBhIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gIER3YXJmMiAoZm9yIGV4YW1wbGUpCi0JCSB1c2VzIDMyYml0IHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotCSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MgIT0gMzIpCi0JICAgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfU0VDUkVMMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9wc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwzMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDY0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9wc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19GUFRSNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9HT1RPRkY6Ci0gICAgICBzd2l0Y2ggKGZvcm1hdCkKLQl7Ci0JY2FzZSAxNDoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gYmFzZV90eXBlICsgT0ZGU0VUXzE0Ul9GUk9NXzIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IGJhc2VfdHlwZSArIE9GRlNFVF8xNEZfRlJPTV8yMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xyc2VsOgotCSAgICBjYXNlIGVfbHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfUENSRUxfQ0FMTDoKLSAgICAgIHN3aXRjaCAoZm9ybWF0KQotCXsKLQljYXNlIDE0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMTc6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTdSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxN0Y7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMjoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMjJGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMjE6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9sc2VsOgotCSAgICBjYXNlIGVfbHJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QQVJJU0NfU0VHUkVMMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19TRUdCQVNFOgotICAgICAgLyogVGhlIGRlZmF1bHRzIGFyZSBmaW5lIGZvciB0aGVzZSBjYXNlcy4gICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpbmFsX3R5cGVzOwotfQotCi0vKiBUcmFuc2xhdGUgZnJvbSBhbiBlbGYgaW50byBmaWVsZCBpbnRvIGEgaG93dG8gcmVsb2NhdGlvbiBwb2ludGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9ocHBhX2luZm9fdG9faG93dG8gKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGX1JfVFlQRShlbGZfcmVsb2MtPnJfaW5mbykKLQkgICAgICA8ICh1bnNpZ25lZCBpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpOwotICBiZmRfcmVsb2MtPmhvd3RvID0gJmVsZl9ocHBhX2hvd3RvX3RhYmxlW0VMRl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKV07Ci19Ci0KLS8qIFRyYW5zbGF0ZSBmcm9tIGFuIGVsZiBpbnRvIGZpZWxkIGludG8gYSBob3d0byByZWxvY2F0aW9uIHBvaW50ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2hwcGFfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbCAqZWxmX3JlbG9jOwotewotICBCRkRfQVNTRVJUIChFTEZfUl9UWVBFKGVsZl9yZWxvYy0+cl9pbmZvKQotCSAgICAgIDwgKHVuc2lnbmVkIGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCk7Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZWxmX2hwcGFfaG93dG9fdGFibGVbRUxGX1JfVFlQRSAoZWxmX3JlbG9jLT5yX2luZm8pXTsKLX0KLQotLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBob3d0byB0YWJsZSBlbnRyeSB0byBwZXJmb3JtIHRoZSBDT0RFCi0gICByZWxvY2F0aW9uIGZvciBhbiBBUkNIIG1hY2hpbmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaWYgKChpbnQpIGNvZGUgPCAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKChpbnQpIGVsZl9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdLnR5cGUgPT0gKGludCkgY29kZSk7Ci0gICAgICByZXR1cm4gJmVsZl9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIGludCBtYWNoID0gYmZkX2dldF9tYWNoIChhYmZkKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPSB+KEVGX1BBUklTQ19BUkNIIHwgRUZfUEFSSVNDX1RSQVBOSUwKLQkJCQkgICAgIHwgRUZfUEFSSVNDX0VYVCB8IEVGX1BBUklTQ19MU0IKLQkJCQkgICAgIHwgRUZfUEFSSVNDX1dJREUgfCBFRl9QQVJJU0NfTk9fS0FCUAotCQkJCSAgICAgfCBFRl9QQVJJU0NfTEFaWVNXQVApOwotCi0gIGlmIChtYWNoID09IDEwKQotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGQV9QQVJJU0NfMV8wOwotICBlbHNlIGlmIChtYWNoID09IDExKQotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGQV9QQVJJU0NfMV8xOwotICBlbHNlIGlmIChtYWNoID09IDIwKQotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGQV9QQVJJU0NfMl8wOwotICBlbHNlIGlmIChtYWNoID09IDI1KQotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IChFRl9QQVJJU0NfV0lERQotCQkJCSAgICAgIHwgRUZBX1BBUklTQ18yXzAKLQkJCQkgICAgICAvKiBUaGUgR05VIHRvb2xzIGhhdmUgdHJhcHBlZCB3aXRob3V0Ci0JCQkJCSBvcHRpb24gc2luY2UgMTk5Mywgc28gbmVlZCB0byB0YWtlCi0JCQkJCSBhIHN0ZXAgYmFja3dhcmRzIHdpdGggdGhlIEVMRgotCQkJCQkgYmFzZWQgdG9vbGNoYWlucy4gICovCi0JCQkJICAgICAgfCBFRl9QQVJJU0NfVFJBUE5JTCk7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIFNZTSByZXByZXNlbnRzIGEgbG9jYWwgbGFiZWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGFuIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBFbGY2NF9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuUEFSSVNDLnVud2luZCIpID09IDApCi0gICAgewotICAgICAgaW50IGluZHg7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0xPUFJPQyArIDE7Ci0gICAgICAvKiA/IT8gSG93IGFyZSB1bndpbmRzIHN1cHBvc2VkIHRvIHdvcmsgZm9yIHN5bWJvbHMgaW4gYXJiaXRyYXJ5Ci0JIHNlY3Rpb25zPyAgT3Igd2hhdCBpZiB3ZSBoYXZlIG11bHRpcGxlIC50ZXh0IHNlY3Rpb25zIGluIGEgc2luZ2xlCi0JIC5vIGZpbGU/ICBIUCByZWFsbHkgbWVzc2VkIHVwIG9uIHRoaXMgb25lLgotCi0JIFVnaC4gIFdlIGNhbiBub3QgdXNlIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4IGF0IHRoaXMKLQkgcG9pbnQgYmVjYXVzZSBpdCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LgotCi0JIFNvIHdlIChnYXNwKSByZWNvbXB1dGUgaXQgaGVyZS4gIEhvcGVmdWxseSBub2JvZHkgZXZlciBjaGFuZ2VzIHRoZQotCSB3YXkgc2VjdGlvbnMgYXJlIG51bWJlcmVkIGluIGVsZi5jISAgKi8KLSAgICAgIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnMsIGluZHggPSAxOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCwgaW5keCsrKQotCXsKLQkgIGlmIChzZWMtPm5hbWUgJiYgc3RyY21wIChzZWMtPm5hbWUsICIudGV4dCIpID09IDApCi0JICAgIHsKLQkgICAgICBoZHItPnNoX2luZm8gPSBpbmR4OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJIGhhdmUgbm8gaWRlYSBpZiB0aGlzIGlzIHJlYWxseSBuZWNlc3Nhcnkgb3Igd2hhdCBpdCBtZWFucy4gICovCi0gICAgICBoZHItPnNoX2VudHNpemUgPSA0OwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBIUCdzIGxpYnJhcmllcyBkZWZpbmUgc3ltYm9scyB3aXRoIEhQIHNwZWNpZmljIHNlY3Rpb24KLSAgIGluZGljZXMsIHdoaWNoIHdlIGhhdmUgdG8gaGFuZGxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpbnQgaW5kZXggPSBzeW0tPnN0X3NobmR4OwotCi0gIHN3aXRjaCAoaW5kZXgpCi0gICAgewotICAgIGNhc2UgU0hOX1BBUklTQ19BTlNJX0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLlBBUklTQy5hbnNpLmNvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9QQVJJU0NfSFVHRV9DT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5QQVJJU0MuaHVnZS5jb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWRhdGE7Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBzeW1ib2wgaXMKLSAgICAgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBsaWJyYXJ5IGJ1dCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZSwgdGhlbgotICAgICB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgd2FybiB0aGF0IGl0IGlzIHVuZGVmaW5lZC4KLQotICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZGVzaXJhYmxlIG9uIEhQcyBzaW5jZSB0aGUgc3RhbmRhcmQgc2hhcmVkCi0gICAgIGxpYnJhcmllcyBjb250YWluIHJlZXJlbmNlcyB0byB1bmRlZmluZWQgc3ltYm9scy4KLQotICAgICBTbyB3ZSB0d2lkZGxlIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggc3VjaCBzeW1ib2xzIHNvIHRoYXQgdGhleQotICAgICB3aWxsIG5vdCB0cmlnZ2VyIHRoZSB3YXJuaW5nLiAgPyE/IEZJWE1FLiAgVGhpcyBpcyBob3JyaWJseSBmcmFnbGllLgotCi0gICAgIFVsdGltYXRlbHkgd2Ugc2hvdWxkIGhhdmUgYmV0dGVyIGNvbnRyb2xzIG92ZXIgdGhlIGdlbmVyaWMgRUxGIEJGRAotICAgICBsaW5rZXIgY29kZS4gICovCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISAoaW5mby0+c2hhcmVkCi0JICAgICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IDB4ODAwMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX3JlbWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWRhdGE7Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBzeW1ib2wgaXMKLSAgICAgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBsaWJyYXJ5IGJ1dCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZSwgdGhlbgotICAgICB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgd2FybiB0aGF0IGl0IGlzIHVuZGVmaW5lZC4KLQotICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZGVzaXJhYmxlIG9uIEhQcyBzaW5jZSB0aGUgc3RhbmRhcmQgc2hhcmVkCi0gICAgIGxpYnJhcmllcyBjb250YWluIHJlZXJlbmNlcyB0byB1bmRlZmluZWQgc3ltYm9scy4KLQotICAgICBTbyB3ZSB0d2lkZGxlIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggc3VjaCBzeW1ib2xzIHNvIHRoYXQgdGhleQotICAgICB3aWxsIG5vdCB0cmlnZ2VyIHRoZSB3YXJuaW5nLiAgPyE/IEZJWE1FLiAgVGhpcyBpcyBob3JyaWJseSBmcmFnaWxlLgotCi0gICAgIFVsdGltYXRlbHkgd2Ugc2hvdWxkIGhhdmUgYmV0dGVyIGNvbnRyb2xzIG92ZXIgdGhlIGdlbmVyaWMgRUxGIEJGRAotICAgICBsaW5rZXIgY29kZS4gICovCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISAoaW5mby0+c2hhcmVkCi0JICAgICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIDB4ODAwMCkgIT0gMCkKLSAgICB7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH4weDgwMDA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgdGhlIGxvd2VzdCBhZGRyZXNzIGZvciB0aGUgZGF0YSBhbmQgdGV4dCBzZWdtZW50cy4gICovCi1zdGF0aWMgdm9pZAotZWxmX2hwcGFfcmVjb3JkX3NlZ21lbnRfYWRkcnMgKGFiZmQsIHNlY3Rpb24sIGRhdGEpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotICBiZmRfdm1hIHZhbHVlOwotIAotICBocHBhX2luZm8gPSAoc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICopZGF0YTsKLQotICB2YWx1ZSA9IHNlY3Rpb24tPnZtYSAtIHNlY3Rpb24tPmZpbGVwb3M7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSkKLSAgICAgICA9PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkpKQotICAgICAgJiYgdmFsdWUgPCBocHBhX2luZm8tPnRleHRfc2VnbWVudF9iYXNlKQotICAgIGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2UgPSB2YWx1ZTsKLSAgZWxzZSBpZiAoKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZKQotICAgICAgID09IChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpCi0gICAgICAmJiB2YWx1ZSA8IGhwcGFfaW5mby0+ZGF0YV9zZWdtZW50X2Jhc2UpCi0gICAgaHBwYV9pbmZvLT5kYXRhX3NlZ21lbnRfYmFzZSA9IHZhbHVlOwotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMvc2VjdGlvbnMsIGJ1dCBiZWZvcmUKLSAgIGZpbmFsIHN5bWJvbCByZXNvbHV0aW9uIGFuZCBzZWN0aW9uIHBsYWNlbWVudCBoYXMgYmVlbiBkZXRlcm1pbmVkLgotCi0gICBXZSB1c2UgdGhpcyBob29rIHRvIChwb3NzaWJseSkgcHJvdmlkZSBhIHZhbHVlIGZvciBfX2dwLCB0aGVuIHdlCi0gICBmYWxsIGJhY2sgdG8gdGhlIGdlbmVyaWMgRUxGIGZpbmFsIGxpbmsgcm91dGluZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuIHJldHZhbDsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmdwOwotICAgICAgYmZkX3ZtYSBncF92YWw7Ci0gICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbzsKLQotICAgICAgaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICAgICAgLyogVGhlIGxpbmtlciBzY3JpcHQgZGVmaW5lcyBhIHZhbHVlIGZvciBfX2dwIGlmZiBpdCB3YXMgcmVmZXJlbmNlZAotCSBieSBvbmUgb2YgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkLiAgRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbAotCSBpbiB0aGUgaGFzaCB0YWJsZS4gIElmIHRoYXQgZmFpbHMsIGp1c3QgY29tcHV0ZSB0aGUgdmFsdWUgX19ncAotCSBzaG91bGQgaGF2ZSBoYWQuICAqLwotICAgICAgZ3AgPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAiX19ncCIsIGZhbHNlLAotCQkJCSBmYWxzZSwgZmFsc2UpOwotCi0gICAgICBpZiAoZ3ApCi0JewotCi0JICAvKiBBZGp1c3QgdGhlIHZhbHVlIG9mIF9fZ3AgYXMgd2UgbWF5IHdhbnQgdG8gc2xpZGUgaXQgaW50byB0aGUKLQkgICAgIC5wbHQgc2VjdGlvbiBzbyB0aGF0IHRoZSBzdHVicyBjYW4gYWNjZXNzIFBMVCBlbnRyaWVzIHdpdGhvdXQKLQkgICAgIHVzaW5nIGFuIGFkZGlsIHNlcXVlbmNlLiAgKi8KLQkgIGdwLT5yb290LnUuZGVmLnZhbHVlICs9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdwX29mZnNldDsKLQotCSAgZ3BfdmFsID0gKGdwLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgZ3AtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyBncC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0gIAotCi0JICAvKiBGaXJzdCBsb29rIGZvciBhIC5wbHQgc2VjdGlvbi4gIElmIGZvdW5kLCB0aGVuIF9fZ3AgaXMgdGhlCi0JICAgICBhZGRyZXNzIG9mIHRoZSAucGx0ICsgZ3Bfb2Zmc2V0LgotCi0JICAgICBJZiBubyAucGx0IGlzIGZvdW5kLCB0aGVuIGxvb2sgZm9yIC5kbHQsIC5vcGQgYW5kIC5kYXRhIChpbgotCSAgICAgdGhhdCBvcmRlcikgYW5kIHNldCBfX2dwIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2Ygd2hpY2hldmVyIHNlY3Rpb24KLQkgICAgaXMgZm91bmQgZmlyc3QuICAqLwotCi0JICBzZWMgPSBocHBhX2luZm8tPnBsdF9zZWM7Ci0JICBpZiAoc2VjKQotCSAgICBncF92YWwgPSAoc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaHBwYV9pbmZvLT5ncF9vZmZzZXQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gaHBwYV9pbmZvLT5kbHRfc2VjOwotCSAgICAgIGlmICghc2VjKQotCQlzZWMgPSBocHBhX2luZm8tPm9wZF9zZWM7Ci0JICAgICAgaWYgKCFzZWMpCi0JCXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRhdGEiKTsKLQkgICAgICBpZiAoIXNlYykKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZ3BfdmFsID0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJbnN0YWxsIHdoYXRldmVyIHZhbHVlIHdlIGZvdW5kL2NvbXB1dGVkIGZvciBfX2dwLiAgKi8KLSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChhYmZkLCBncF92YWwpOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGtub3cgdGhlIGJhc2Ugb2YgdGhlIHRleHQgYW5kIGRhdGEgc2VnbWVudHMgc28gdGhhdCB3ZQotICAgICBjYW4gcGVyZm9ybSBTRUdSRUwgcmVsb2NhdGlvbnMuICBXZSB3aWxsIHJlY29yZSB0aGUgYmFzZSBhZGRyZXNzZXMKLSAgICAgd2hlbiB3ZSBlbmNvdW50ZXIgdGhlIGZpcnN0IFNFR1JFTCByZWxvY2F0aW9uLiAgKi8KLSAgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+dGV4dF9zZWdtZW50X2Jhc2UgPSAoYmZkX3ZtYSktMTsKLSAgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+ZGF0YV9zZWdtZW50X2Jhc2UgPSAoYmZkX3ZtYSktMTsKLQotICAvKiBIUCdzIHNoYXJlZCBsaWJyYXJpZXMgaGF2ZSByZWZlcmVuY2VzIHRvIHN5bWJvbHMgdGhhdCBhcmUgbm90Ci0gICAgIGRlZmluZWQgYW55d2hlcmUuICBUaGUgZ2VuZXJpYyBFTEYgQkZEIGxpbmtlciBjb2RlIHdpbGwgY29tcGxhaW0KLSAgICAgYWJvdXQgc3VjaCBzeW1ib2xzLgotCi0gICAgIFNvIHdlIGRldGVjdCB0aGUgbG9zaW5nIGNhc2UgYW5kIGFycmFuZ2UgZm9yIHRoZSBmbGFncyBvbiB0aGUgc3ltYm9sCi0gICAgIHRvIGluZGljYXRlIHRoYXQgaXQgd2FzIG5ldmVyIHJlZmVyZW5jZWQuICBUaGlzIGtlZXBzIHRoZSBnZW5lcmljCi0gICAgIEVMRiBCRkQgbGluayBjb2RlIGhhcHB5IGFuZCBhcHBlYXJzIHRvIG5vdCBjcmVhdGUgYW55IHNlY29uZGFyeQotICAgICBwcm9ibGVtcy4gIFVsdGltYXRlbHkgd2UgbmVlZCBhIHdheSB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUKLSAgICAgZ2VuZXJpYyBFTEYgQkZEIGxpbmsgY29kZSBiZXR0ZXIuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scywKLQkJCSAgaW5mbyk7Ci0KLSAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLwotICByZXR2YWwgPSBiZmRfZWxmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKTsKLQotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9ocHBhX3JlbWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scywKLQkJCSAgaW5mbyk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogUmVsb2NhdGUgYW4gSFBQQSBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyBFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0gICAgICBjaGFyICpkeW5fbmFtZTsKLSAgICAgIGNoYXIgKmR5bmhfYnVmID0gTlVMTDsKLSAgICAgIHNpemVfdCBkeW5oX2J1ZmxlbiA9IDA7Ci0gICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2ggPSBOVUxMOwotCi0gICAgICByX3R5cGUgPSBFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc3ltX3NlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHN5bV9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHN5bV9zZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICAvKiBUaGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgPyAwIDogc3ltLT5zdF92YWx1ZSkKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIFBBNjQgZHluYW1pYyBoYXNoCi0JICAgICB0YWJsZSwgdGhlbiBnZXQgaXQuICAqLwotCSAgZHluX25hbWUgPSBnZXRfZHluX25hbWUgKGlucHV0X2JmZCwgaCwgcmVsLAotCQkJCSAgICZkeW5oX2J1ZiwgJmR5bmhfYnVmbGVuKTsKLQkgIGR5bl9oID0gZWxmNjRfaHBwYV9keW5faGFzaF9sb29rdXAgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCQkgICAgICBkeW5fbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIG5vdCBhIGxvY2FsIHN5bWJvbC4gICovCi0JICBsb25nIGluZHg7Ci0KLQkgIGluZHggPSByX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHN5bV9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIFBBNjQgZHluYW1pYyBoYXNoCi0JCSB0YWJsZSwgdGhlbiBnZXQgaXQuICAqLwotCSAgICAgIGR5bl9uYW1lID0gZ2V0X2R5bl9uYW1lIChpbnB1dF9iZmQsIGgsIHJlbCwKLQkJCQkgICAgICAgJmR5bmhfYnVmLCAmZHluaF9idWZsZW4pOwotCSAgICAgIGR5bl9oID0gZWxmNjRfaHBwYV9keW5faGFzaF9sb29rdXAgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCQkJICBkeW5fbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCSAgICAgIC8qIElmIHdlIGhhdmUgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiBhCi0JCSBzaGFyZWQgbGlicmFyeSBhbmQgd2UgaGF2ZSBub3QgY3JlYXRlZCBhbiBlbnRyeSBpbiB0aGUKLQkJIFBBNjQgZHluYW1pYyBzeW1ib2wgaGFzaCB0YWJsZSBmb3IgaXQsIHRoZW4gd2UgbG9zZS4gICovCi0JICAgICAgaWYgKHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwgJiYgZHluX2ggPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24pCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgICAgIC8qIFZhbHVlIHdpbGwgYmUgcHJvdmlkZWQgdmlhIG9uZSBvZiB0aGUgb2Zmc2V0cyBpbiB0aGUKLQkJIGR5bl9oIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIC8qIEFsbG93IHVuZGVmaW5lZCBzeW1ib2xzIGluIHNoYXJlZCBsaWJyYXJpZXMuICAqLwotICAgICAgICAgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUEE2NCBkeW5hbWljIGhhc2gKLQkJIHRhYmxlLCB0aGVuIGdldCBpdC4gICovCi0JICAgICAgZHluX25hbWUgPSBnZXRfZHluX25hbWUgKGlucHV0X2JmZCwgaCwgcmVsLAotCQkJCSAgICAgICAmZHluaF9idWYsICZkeW5oX2J1Zmxlbik7Ci0JICAgICAgZHluX2ggPSBlbGY2NF9ocHBhX2R5bl9oYXNoX2xvb2t1cCAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJCQkgIGR5bl9uYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgaWYgKGR5bl9oID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCXN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCSAgaWYgKHN5bV9uYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICgqc3ltX25hbWUgPT0gJ1wwJykKLQkgICAgc3ltX25hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHN5bV9zZWMpOwotCX0KLQotICAgICAgciA9IGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKHJlbCwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJcmVsb2NhdGlvbiwgaW5mbywgc3ltX3NlYywKLQkJCQkJaCwgZHluX2gpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAoaW5mbywgc3ltX25hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDb21wdXRlIHRoZSB2YWx1ZSBmb3IgYSByZWxvY2F0aW9uIChSRUwpIGR1cmluZyBhIGZpbmFsIGxpbmsgc3RhZ2UsCi0gICB0aGVuIGluc2VydCB0aGUgdmFsdWUgaW50byB0aGUgcHJvcGVyIGxvY2F0aW9uIGluIENPTlRFTlRTLiAKLQotICAgVkFMVUUgaXMgYSB0ZW50YXRpdmUgdmFsdWUgZm9yIHRoZSByZWxvY2F0aW9uIGFuZCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgYW5kIG1vZGlmaWVkIGhlcmUgYmFzZWQgb24gdGhlIHNwZWNpZmljIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotCi0gICBGb3IgZXhhbXBsZSB3ZSBkbyBjb252ZXJzaW9ucyBmb3IgUEMtcmVsYXRpdmUgYnJhbmNoZXMgaW4gdGhpcyByb3V0aW5lCi0gICBvciByZWRpcmVjdGlvbiBvZiBjYWxscyB0byBleHRlcm5hbCByb3V0aW5lcyB0byBzdHVicy4gCi0KLSAgIFRoZSB3b3JrIG9mIGFjdHVhbGx5IGFwcGx5aW5nIHRoZSByZWxvY2F0aW9uIGlzIGxlZnQgdG8gYSBoZWxwZXIKLSAgIHJvdXRpbmUgaW4gYW4gYXR0ZW1wdCB0byByZWR1Y2UgdGhlIGNvbXBsZXhpdHkgYW5kIHNpemUgb2YgdGhpcwotICAgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlIChyZWwsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCB2YWx1ZSwKLQkJCSAgICAgIGluZm8sIHN5bV9zZWMsIGgsIGR5bl9oKQotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBvZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICBiZmRfdm1hIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyBFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgcl9maWVsZCA9IGVfZnNlbDsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9QQVJJU0NfTk9ORToKLSAgICAgIGJyZWFrOwotCi0gICAgLyogUmFuZG9tIFBDIHJlbGF0aXZlIHJlbG9jcy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZERjoKLSAgICAgIHsKLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMjFMKQotCSAgcl9maWVsZCA9IGVfbHNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE2RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTZERikKLQkgIHJfZmllbGQgPSBlX2ZzZWw7Ci0JZWxzZQotCSAgcl9maWVsZCA9IGVfcnNlbDsKLQotCS8qIElmIHRoaXMgaXMgYSBjYWxsIHRvIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhbm90aGVyIGR5bmFtaWMKLQkgICBsaWJyYXJ5LCB0aGVuIHJlZGlyZWN0IHRoZSBjYWxsIHRvIHRoZSBsb2NhbCBzdHViIGZvciB0aGlzCi0JICAgZnVuY3Rpb24uICAqLwotCWlmIChzeW1fc2VjID09IE5VTEwgfHwgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgIHZhbHVlID0gKGR5bl9oLT5zdHViX29mZnNldCArIGhwcGFfaW5mby0+c3R1Yl9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgCi0JLyogVHVybiBWQUxVRSBpbnRvIGEgcHJvcGVyIFBDIHJlbGF0aXZlIGFkZHJlc3MuICAqLwotCXZhbHVlIC09IChvZmZzZXQgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCS8qIEFkanVzdCBmb3IgYW55IGZpZWxkIHNlbGVjdG9ycy4gICovCi0JdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIC04ICsgYWRkZW5kLCByX2ZpZWxkKTsKLQotCS8qIEFwcGx5IHRoZSByZWxvY2F0aW9uIHRvIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgLyogQmFzaWMgZnVuY3Rpb24gY2FsbCBzdXBwb3J0LiAgSSdtIG5vdCBlbnRpcmVseSBzdXJlIGlmIFBDUkVMMTRGIGlzCi0gICAgICAgYWN0dWFsbHkgbmVlZGVkIG9yIGV2ZW4gaGFuZGxlZCBjb3JyZWN0bHkuCi0KLSAgICAgICBOb3RlIGZvciBhIGNhbGwgdG8gYSBmdW5jdGlvbiBkZWZpbmVkIGluIGFub3RoZXIgZHluYW1pYyBsaWJyYXJ5Ci0gICAgICAgd2Ugd2FudCB0byByZWRpcmVjdCB0aGUgY2FsbCB0byBhIHN0dWIuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMkY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjJDOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0M6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKLSAgICAgIHsKLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdSKQotCSAgcl9maWVsZCA9IGVfcnNlbDsKLQllbHNlCi0JICByX2ZpZWxkID0gZV9mc2VsOwotCi0JLyogSWYgdGhpcyBpcyBhIGNhbGwgdG8gYSBmdW5jdGlvbiBkZWZpbmVkIGluIGFub3RoZXIgZHluYW1pYwotCSAgIGxpYnJhcnksIHRoZW4gcmVkaXJlY3QgdGhlIGNhbGwgdG8gdGhlIGxvY2FsIHN0dWIgZm9yIHRoaXMKLQkgICBmdW5jdGlvbi4gICovCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCB8fCBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgdmFsdWUgPSAoZHluX2gtPnN0dWJfb2Zmc2V0ICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X29mZnNldAotCQkgICArIGhwcGFfaW5mby0+c3R1Yl9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAKLQkvKiBUdXJuIFZBTFVFIGludG8gYSBwcm9wZXIgUEMgcmVsYXRpdmUgYWRkcmVzcy4gICovCi0JdmFsdWUgLT0gKG9mZnNldCArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JLyogQWRqdXN0IGZvciBhbnkgZmllbGQgc2VsZWN0b3JzLiAgKi8KLQl2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgLTggKyBhZGRlbmQsIGVfZnNlbCk7Ci0KLQkvKiBBbGwgYnJhbmNoZXMgYXJlIGltcGxpY2l0bHkgc2hpZnRlZCBieSAyIHBsYWNlcy4gICovCi0JdmFsdWUgPj49IDI7Ci0KLQkvKiBBcHBseSB0aGUgcmVsb2NhdGlvbiB0byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICAqLwotCWluc24gPSBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCB2YWx1ZSwgcl90eXBlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIC8qIEluZGlyZWN0IHJlZmVyZW5jZXMgdG8gZGF0YSB0aHJvdWdoIHRoZSBETFQuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTRGOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVElORDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNkRGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkYxNkY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogSWYgdGhpcyByZWxvY2F0aW9uIHdhcyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCB0aGVuIHdlIHN0aWxsCi0JICAgaGF2ZSBub3Qgc2V0IHVwIHRoZSBETFQgZW50cnkgKGl0J3Mgbm90IGNvbnZpZW5lbnQgdG8gZG8gc28KLQkgICBpbiB0aGUgImZpbmFsaXplX2RsdCIgcm91dGluZSBiZWNhdXNlIGl0IGlzIGRpZmZpY3VsdCB0byBnZXQKLQkgICB0byB0aGUgbG9jYWwgc3ltYm9sJ3MgdmFsdWUpLgotCi0JICAgU28sIGlmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wgKGggPT0gTlVMTCksIHRoZW4gd2UgbmVlZCB0bwotCSAgIGZpbGwgaW4gaXRzIERMVCBlbnRyeS4gCi0KLQkgICBTaW1pbGFybHkgd2UgbWF5IHN0aWxsIG5lZWQgdG8gc2V0IHVwIGFuIGVudHJ5IGluIC5vcGQgZm9yCi0JICAgYSBsb2NhbCBmdW5jdGlvbiB3aGljaCBoYWQgaXRzIGFkZHJlc3MgdGFrZW4uICAqLwotCWlmIChkeW5faC0+aCA9PSBOVUxMKQotCSAgewotCSAgICBiZmRfcHV0XzY0IChocHBhX2luZm8tPmRsdF9zZWMtPm93bmVyLAotCQkJdmFsdWUsCi0JCQlocHBhX2luZm8tPmRsdF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPmRsdF9vZmZzZXQpOwotCi0JICAgIC8qIE5vdyBoYW5kbGUgLm9wZCBjcmVhdGlvbiBpZiBuZWVkZWQuICAqLwotCSAgICBpZiAocl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIKLQkJfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSCi0JCXx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUgotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjIxTAotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2RgotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YKLQkJfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkRGKQotCSAgICAgIHsKLQkJLyogVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBhbiAub3BkIGVudHJ5IGFyZSB6ZXJvLiAgKi8KLQkJbWVtc2V0IChocHBhX2luZm8tPm9wZF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQsCi0JCQkwLCAxNik7Ci0KLQkJLyogVGhlIG5leHQgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uICAqLwotCQliZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCSAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICAgICArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpKTsKLQotCQkvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLQkJdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZQotCQkJICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpOwotCQliZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCSAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICAgICArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpKTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBXZSB3YW50IHRoZSB2YWx1ZSBvZiB0aGUgRExUIG9mZnNldCBmb3IgdGhpcyBzeW1ib2wsIG5vdAotCSAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gIE5vdGUgdGhhdCBfX2dwIG1heSBub3QgcG9pbnQKLQkgICB0byB0aGUgc3RhcnQgb2YgdGhlIERMVCwgc28gd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZQotCSAgIGFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLQl2YWx1ZSA9IChkeW5faC0+ZGx0X29mZnNldAotCQkgKyBocHBhX2luZm8tPmRsdF9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQl2YWx1ZSAtPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0KLQotCS8qIEFsbCBETFRJTkQgcmVsb2NhdGlvbnMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhdCB0aGlzIHBvaW50LAotCSAgIGV4Y2VwdCB0aGF0IHdlIG5lZWQgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9ycyBmb3IgdGhlIDIxYml0Ci0JICAgdmVyc2lvbiB2cyB0aGUgMTRiaXQgdmVyc2lvbnMuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRExUSU5EMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ETFRJTkQxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkYxNkRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkYxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfVFAxNkYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDE2V0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDE2REYpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2ZzZWwpOwotCWVsc2UKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfcnJzZWwpOwotCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFdSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUwxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUwxNkRGOgotICAgICAgewotCS8qIFN1YnRyYWN0IG91dCB0aGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWUgdG8gbWFrZSB2YWx1ZSBhIERMVAotCSAgIHJlbGF0aXZlIGFkZHJlc3MuICAqLwotCXZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotCS8qIEFsbCBETFRSRUwgcmVsb2NhdGlvbnMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhdCB0aGlzIHBvaW50LAotCSAgIGV4Y2VwdCB0aGF0IHdlIG5lZWQgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9ycyBmb3IgdGhlIDIxYml0Ci0JICAgdmVyc2lvbiB2cyB0aGUgMTRiaXQgdmVyc2lvbnMuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRExUUkVMMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19EUFJFTDIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ETFRSRUwxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19EUFJFTDE0RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0dQUkVMMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfR1BSRUwxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfR1BSRUwxNkRGKQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9mc2VsKTsKLQllbHNlCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX3Jyc2VsKTsKLQotCWluc24gPSBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCB2YWx1ZSwgcl90eXBlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9QQVJJU0NfRElSMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNkY6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZERjoKLSAgICAgIHsKLQkvKiBBbGwgRElSIHJlbG9jYXRpb25zIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgYXQgdGhpcyBwb2ludCwKLQkgICBleGNlcHQgdGhhdCB3ZSBuZWVkIGRpZmZlcmVudCBmaWVsZCBzZWxlY3RvcnMgZm9yIHRoZSAyMWJpdAotCSAgIHZlcnNpb24gdnMgdGhlIDE0Yml0IHZlcnNpb25zLiAgKi8KLQlpZiAocl90eXBlID09IFJfUEFSSVNDX0RJUjIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxN0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxNkYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfRElSMTZERikKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfZnNlbCk7Ci0JZWxzZQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9ycnNlbCk7Ci0KLQlpbnNuID0gZWxmX2hwcGFfcmVsb2NhdGVfaW5zbiAoaW5zbiwgdmFsdWUsIHJfdHlwZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIFBMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPnBsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5wbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+cGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCi0JLyogQWxsIFBMVE9GRiByZWxvY2F0aW9ucyBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGF0IHRoaXMgcG9pbnQsCi0JICAgZXhjZXB0IHRoYXQgd2UgbmVlZCBkaWZmZXJlbnQgZmllbGQgc2VsZWN0b3JzIGZvciB0aGUgMjFiaXQKLQkgICB2ZXJzaW9uIHZzIHRoZSAxNGJpdCB2ZXJzaW9ucy4gICovCi0JaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTFRPRkYyMUwpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2xyc2VsKTsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BMVE9GRjE2REYpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2ZzZWwpOwotCWVsc2UKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfcnJzZWwpOwotCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMzI6Ci0gICAgICB7Ci0JLyogV2UgbWF5IHN0aWxsIG5lZWQgdG8gY3JlYXRlIHRoZSBGUFRSIGl0c2VsZiBpZiBpdCB3YXMgZm9yCi0JICAgYSBsb2NhbCBzeW1ib2wuICAqLwotCWlmIChkeW5faC0+aCA9PSBOVUxMKQotCSAgewotCSAgICAvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGFuIC5vcGQgZW50cnkgYXJlIHplcm8uICAqLwotCSAgICBtZW1zZXQgKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0JICAgIC8qIFRoZSBuZXh0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgYmZkX3B1dF82NCAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vd25lciwgdmFsdWUsCi0JCQkoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICsgZHluX2gtPm9wZF9vZmZzZXQgKyAxNikpOwotCi0JICAgIC8qIFRoZSBsYXN0IHdvcmQgaXMgb3VyIGxvY2FsIF9fZ3AgdmFsdWUuICAqLwotCSAgICB2YWx1ZSA9IF9iZmRfZ2V0X2dwX3ZhbHVlCi0JCSAgICAgIChocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpOwotCSAgfQotCi0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIERMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPmRsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+ZGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSNjQ6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDY0OgotICAgICAgewotCS8qIFdlIG1heSBzdGlsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgRlBUUiBpdHNlbGYgaWYgaXQgd2FzIGZvcgotCSAgIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQlpZiAoZHluX2gtPmggPT0gTlVMTCAmJiByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjY0KQotCSAgewotCSAgICAvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGFuIC5vcGQgZW50cnkgYXJlIHplcm8uICAqLwotCSAgICBtZW1zZXQgKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0JICAgIC8qIFRoZSBuZXh0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgYmZkX3B1dF82NCAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vd25lciwgdmFsdWUsCi0JCQkoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICsgZHluX2gtPm9wZF9vZmZzZXQgKyAxNikpOwotCi0JICAgIC8qIFRoZSBsYXN0IHdvcmQgaXMgb3VyIGxvY2FsIF9fZ3AgdmFsdWUuICAqLwotCSAgICB2YWx1ZSA9IF9iZmRfZ2V0X2dwX3ZhbHVlCi0JCSAgICAgIChocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpOwotCSAgfQotCi0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIERMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPmRsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+ZGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCWJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjY0OgotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUw2NDoKLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWUgdG8gbWFrZSB2YWx1ZSBhIERMVAotCSByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLSAgICAgIHZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkY2NDoKLQkvKiBXZSB3YW50IHRoZSB2YWx1ZSBvZiB0aGUgRExUIG9mZnNldCBmb3IgdGhpcyBzeW1ib2wsIG5vdAotCSAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gIE5vdGUgdGhhdCBfX2dwIG1heSBub3QgcG9pbnQKLQkgICB0byB0aGUgc3RhcnQgb2YgdGhlIERMVCwgc28gd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZQotCSAgIGFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLSAgICAgIHZhbHVlID0gKGR5bl9oLT5kbHRfb2Zmc2V0Ci0JICAgICAgICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIHZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwzMjoKLSAgICAgIHsKLQkvKiBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYW5vdGhlciBkeW5hbWljCi0JICAgbGlicmFyeSwgdGhlbiByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgbG9jYWwgc3R1YiBmb3IgdGhpcwotCSAgIGZ1bmN0aW9uLiAgKi8KLQlpZiAoc3ltX3NlYyA9PSBOVUxMIHx8IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICB2YWx1ZSA9IChkeW5faC0+c3R1Yl9vZmZzZXQgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gIAotCS8qIFR1cm4gVkFMVUUgaW50byBhIHByb3BlciBQQyByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLQl2YWx1ZSAtPSAob2Zmc2V0ICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQl2YWx1ZSArPSBhZGRlbmQ7Ci0JdmFsdWUgLT0gODsKLQliZmRfcHV0XzY0IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0JcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9QQVJJU0NfUENSRUw2NDoKLSAgICAgIHsKLQkvKiBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYW5vdGhlciBkeW5hbWljCi0JICAgbGlicmFyeSwgdGhlbiByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgbG9jYWwgc3R1YiBmb3IgdGhpcwotCSAgIGZ1bmN0aW9uLiAgKi8KLQlpZiAoc3ltX3NlYyA9PSBOVUxMIHx8IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICB2YWx1ZSA9IChkeW5faC0+c3R1Yl9vZmZzZXQgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gIAotICAKLQkvKiBUdXJuIFZBTFVFIGludG8gYSBwcm9wZXIgUEMgcmVsYXRpdmUgYWRkcmVzcy4gICovCi0JdmFsdWUgLT0gKG9mZnNldCArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JdmFsdWUgKz0gYWRkZW5kOwotCXZhbHVlIC09IDg7Ci0JYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotCXJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICB9Ci0KLQotICAgIGNhc2UgUl9QQVJJU0NfRlBUUjY0OgotICAgICAgewotCS8qIFdlIG1heSBzdGlsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgRlBUUiBpdHNlbGYgaWYgaXQgd2FzIGZvcgotCSAgIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQlpZiAoZHluX2gtPmggPT0gTlVMTCkKLQkgIHsKLQkgICAgLyogVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBhbiAub3BkIGVudHJ5IGFyZSB6ZXJvLiAgKi8KLQkgICAgbWVtc2V0IChocHBhX2luZm8tPm9wZF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQsIDAsIDE2KTsKLQotCSAgICAvKiBUaGUgbmV4dCB3b3JkIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gICovCi0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMKLQkJCSArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpKTsKLQotCSAgICAvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLQkgICAgdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZQotCQkgICAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpOwotCSAgICBiZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCWhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCArIDI0KTsKLQkgIH0KLQotCS8qIFdlIHdhbnQgdGhlIHZhbHVlIG9mIHRoZSBPUEQgb2Zmc2V0IGZvciB0aGlzIHN5bWJvbCwgbm90Ci0gICAgICAgICAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gICovCi0JdmFsdWUgPSAoZHluX2gtPm9wZF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+b3BkX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgIAotCWJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19TRUNSRUwzMjoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkJICAodmFsdWUgKyBhZGRlbmQKLQkJICAgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSwKLQkJICBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX1BBUklTQ19TRUdSRUwzMjoKLSAgICBjYXNlIFJfUEFSSVNDX1NFR1JFTDY0OgotICAgICAgewotCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IFNFR1JFTCByZWxvY2F0aW9uLCB0aGVuIGluaXRpYWxpemUKLQkgICB0aGUgc2VnbWVudCBiYXNlIHZhbHVlcy4gICovCi0JaWYgKGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2UgPT0gKGJmZF92bWEpIC0xKQotCSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBlbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycywKLQkJCQkgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKSk7Ci0KLQkvKiBWQUxVRSBob2xkcyB0aGUgYWJzb2x1dGUgYWRkcmVzcy4gIFdlIHdhbnQgdG8gaW5jbHVkZSB0aGUKLQkgICBhZGRlbmQsIHRoZW4gdHVybiBpdCBpbnRvIGEgc2VnbWVudCByZWxhdGl2ZSBhZGRyZXNzLgotCi0JICAgVGhlIHNlZ21lbnQgaXMgZGVyaXZlZCBmcm9tIFNZTV9TRUMuICBXZSBhc3N1bWUgdGhhdCB0aGVyZSBhcmUKLQkgICBvbmx5IHR3byBzZWdtZW50cyBvZiBub3RlIGluIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZS9zaGxpYi4KLQkgICBBIHJlYWRvbmx5IHNlZ21lbnQgKC50ZXh0KSBhbmQgYSByZWFkd3JpdGUgc2VnbWVudCAoLmRhdGEpLiAgKi8KLQl2YWx1ZSArPSBhZGRlbmQ7Ci0KLQlpZiAoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgIHZhbHVlIC09IGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2U7Ci0JZWxzZQotCSAgdmFsdWUgLT0gaHBwYV9pbmZvLT5kYXRhX3NlZ21lbnRfYmFzZTsKLQotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfU0VHUkVMMzIpCi0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0JZWxzZQotCSAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotICAgICAgCi0KLSAgICAvKiBTb21ldGhpbmcgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEpOwotICByZXR1cm4gKGJmZF9yZWxvY19vayk7Ci19Ci0KLS8qIFJlbG9jYXRlIHRoZSBnaXZlbiBJTlNOLiAgVkFMVUUgc2hvdWxkIGJlIHRoZSBhY3R1YWwgdmFsdWUgd2Ugd2FudAotICAgdG8gaW5zZXJ0IGludG8gdGhlIGluc3RydWN0aW9uLCBpZSBieSB0aGlzIHBvaW50IHdlIHNob3VsZCBub3QgYmUKLSAgIGNvbmNlcm5lZCB3aXRoIGNvbXB1dGluZyBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIERMVCwgUEMsIGV0Yy4KLSAgIEluc3RlYWQgdGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGhhbmRsZSB0aGUgYml0IG1hbmlwdWxhdGlvbnMgbmVlZGVkCi0gICB0byBpbnNlcnQgdGhlIHJlbG9jYXRpb24gaW50byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWxmX2hwcGFfcmVsb2NhdGVfaW5zbiAoaW5zbiwgc3ltX3ZhbHVlLCByX3R5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyBzeW1fdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl90eXBlOwotewotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgLyogVGhpcyBpcyBhbnkgMjJiaXQgYnJhbmNoLiAgSW4gUEEyLjAgc3ludGF4IGl0IGNvcnJlc3BvbmRzIHRvCi0gICAgICAgdGhlICJCIiBpbnN0cnVjdGlvbi4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIyRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjJDOgotICAgICAgewotCXVuc2lnbmVkIGludCB3MywgdzIsIHcxLCB3OwotCi0JLyogVGhlc2UgYXJlIDIyIGJpdCBicmFuY2hlcy4gIE1hc2sgb2ZmIGJpdHMgd2UgZG8gbm90IGNhcmUKLQkgICBhYm91dC4gICovCi0Jc3ltX3ZhbHVlICY9IDB4M2ZmZmZmOwotCi0JLyogTm93IGV4dHJhY3QgdGhlIFcxLCBXMiwgVzMgYW5kIFcgZmllbGRzIGZyb20gdGhlIHZhbHVlLiAgKi8KLQlkaXNfYXNzZW1ibGVfMjIgKHN5bV92YWx1ZSwgJnczLCAmdzEsICZ3MiwgJncpOwotCi0JLyogTWFzayBvdXQgYml0cyBmb3IgdGhlIHZhbHVlIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiAmPSAweGZjMDBlMDAyOwotCi0JLyogSW5zZXJ0IHRoZSBiaXRzIGZvciB0aGUgVzEsIFcyIGFuZCBXIGZpZWxkcyBpbnRvIHRoZQotCSAgIGluc3RydWN0aW9uLiAgKi8KLQlpbnNuIHw9ICh3MyA8PCAyMSkgfCAodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdzsKLQlyZXR1cm4gaW5zbjsKLSAgICAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIGFueSAxN2JpdCBicmFuY2guICBJbiBQQTIuMCBzeW50YXggaXQgYWxzbyBjb3JyZXNwb25kcyB0bwotICAgICAgIHRoZSAiQiIgaW5zdHJ1Y3Rpb24gYXMgd2VsbCBhcyBCRS4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdDOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN1I6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHcyLCB3MSwgdzsKLQotCS8qIFRoZXNlIGFyZSAxNyBiaXQgYnJhbmNoZXMuICBNYXNrIG9mZiBiaXRzIHdlIGRvIG5vdCBjYXJlCi0JICAgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZmZmOwotCi0JLyogTm93IGV4dHJhY3QgdGhlIFcxLCBXMiBhbmQgVyBmaWVsZHMgZnJvbSB0aGUgdmFsdWUuICAqLwotCWRpc19hc3NlbWJsZV8xNyAoc3ltX3ZhbHVlLCAmdzEsICZ3MiwgJncpOwotCi0JLyogTWFzayBvdXQgYml0cyBmb3IgdGhlIHZhbHVlIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiAmPSAweGZmZTBlMDAyOwotCi0JLyogSW5zZXJ0IHRoZSBiaXRzIGZvciB0aGUgVzEsIFcyIGFuZCBXIGZpZWxkcyBpbnRvIHRoZQotCSAgIGluc3RydWN0aW9uLiAgKi8KLQlpbnNuIHw9ICh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3OwotCXJldHVybiBpbnNuOwotICAgICAgfQotCi0gICAgLyogQURESUwgb3IgTERJTCBpbnN0cnVjdGlvbnMuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjIxTDoKLSAgICAgIHsKLSAgICAgICAgaW50IHc7Ci0KLQkvKiBNYXNrIG9mZiBiaXRzIGluIElOU04gd2UgZG8gbm90IHdhbnQuICAqLwotCWluc24gJj0gMHhmZmUwMDAwMDsKLQotCS8qIFR1cm4gdGhlIDIxYml0IHZhbHVlIGludG8gdGhlIHByb3BlciBmb3JtYXQuICAqLwotCWRpc19hc3NlbWJsZV8yMSAoc3ltX3ZhbHVlLCAmdyk7Ci0KLQkvKiBBbmQgaW5zZXJ0IHRoZSBwcm9wZXIgYml0cyBpbnRvIElOU04uICAqLwotICAgICAgICByZXR1cm4gaW5zbiB8IHc7Ci0gICAgICB9Ci0KLSAgICAvKiBMRE8gYW5kIGludGVnZXIgbG9hZHMvc3RvcmVzIHdpdGggMTRiaXQgZGlzcGxhY2VtZW50cy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19HUFJFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGMTZGOgotICAgICAgewotICAgICAgICBpbnQgdzsKLQotCS8qIE1hc2sgb2ZmIGJpdHMgaW4gSU5TTiB3ZSBkbyBub3Qgd2FudC4gICovCi0JaW5zbiAmPSAweGZmZmZjMDAwOwotCi0JLyogVHVybiB0aGUgMTRiaXQgdmFsdWUgaW50byB0aGUgcHJvcGVyIGZvcm1hdC4gICovCi0JbG93X3NpZ25fdW5leHQgKHN5bV92YWx1ZSwgMTQsICZ3KTsKLQotCS8qIEFuZCBpbnNlcnQgdGhlIHByb3BlciBiaXRzIGludG8gSU5TTi4gICovCi0gICAgICAgIHJldHVybiBpbnNuIHwgdzsKLSAgICAgIH0KLQotICAgIC8qIERvdWJsZXdvcmQgbG9hZHMgYW5kIHN0b3JlcyB3aXRoIGEgMTRiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNkRGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE2REY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogTWFzayBvZmYgYml0cyBpbiBJTlNOIHdlIGRvIG5vdCB3YW50LiAgKi8KLQlpbnNuICY9IDB4ZmZmZmMwMGU7Ci0KLQkvKiBUaGUgc2lnbiBiaXQgYXQgMTQgbW92ZXMgaW50byBiaXQgemVybyBpbiB0aGUgZGVzdGluYXRpb24uICAqLwotICAgICAgICBpbnNuIHw9ICgoc3ltX3ZhbHVlICYgMHgyMDAwKSA+PiAxMyk7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgYml0cyBpbiBzeW1fdmFsdWUgd2UgZG8gbm90IGNhcmUgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZjg7Ci0KLQkvKiBOb3cgc2hpZnQgaXQgb25lIGJpdCBwb3NpdGlvbiBsZWZ0IHNvIHRoYXQgaXQgbGluZXMgdXAgd2l0aCB0aGUKLQkgICBkZXN0aW5hdGlvbiBmaWVsZCBpbiBJTlNOLiAgKi8KLQlzeW1fdmFsdWUgPDw9IDE7Ci0KLQlyZXR1cm4gaW5zbiB8IHN5bV92YWx1ZTsKLSAgICAgIH0KLQotICAgIC8qIEZsb2F0aW5nIHBvaW50IHNpbmdsZSB3b3JkIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNFdSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2V0Y6Ci0gICAgICB7Ci0JLyogTWFzayBvZmYgYml0cyBpbiBJTlNOIHdlIGRvIG5vdCB3YW50LiAgKi8KLQlpbnNuICY9IDB4ZmZmZmMwMDY7Ci0KLQkvKiBUaGUgc2lnbiBiaXQgYXQgMTQgbW92ZXMgaW50byBiaXQgemVybyBpbiB0aGUgZGVzdGluYXRpb24uICAqLwotICAgICAgICBpbnNuIHw9ICgoc3ltX3ZhbHVlICYgMHgyMDAwKSA+PiAxMyk7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgYml0cyBpbiBzeW1fdmFsdWUgd2UgZG8gbm90IGNhcmUgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZmM7Ci0KLQkvKiBOb3cgc2hpZnQgaXQgb25lIGJpdCBwb3NpdGlvbiBsZWZ0IHNvIHRoYXQgaXQgbGluZXMgdXAgd2l0aCB0aGUKLQkgICBkZXN0aW5hdGlvbiBmaWVsZCBpbiBJTlNOLiAgKi8KLQlzeW1fdmFsdWUgPDw9IDE7Ci0KLQlyZXR1cm4gaW5zbiB8IHN5bV92YWx1ZTsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gaW5zbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDIwMC5jIGIvYmZkL2VsZi1tMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1NTZmYi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNSArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMjAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtbjEwMjAwX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX01OMTAyMDBfTk9ORSA9IDAsCi0gIFJfTU4xMDIwMF8zMiwKLSAgUl9NTjEwMjAwXzE2LAotICBSX01OMTAyMDBfOCwKLSAgUl9NTjEwMjAwXzI0LAotICBSX01OMTAyMDBfUENSRUw4LAotICBSX01OMTAyMDBfUENSRUwxNiwKLSAgUl9NTjEwMjAwX1BDUkVMMjQsCi0gIFJfTU4xMDIwMF9NQVgKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBEdW1teSByZWxvY2F0aW9uLiAgRG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDIwMF9OT05FLAotCSAwLAotCSAyLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfTk9ORSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8zMiIsCi0JIGZhbHNlLAotCSAweGZmZmZmZmZmLAotCSAweGZmZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDE2IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8xNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCA4IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDI0IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMjQsCi0JIDAsCi0JIDIsCi0JIDI0LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8yNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU2ltcGxlIDggcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF9QQ1JFTDgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAxNiBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwxNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwxNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIGEgMSBieXRlIGFkanVzdG1lbnQKLSAgICAgdG8gZ2V0IHRoZSBwYy1yZWxhdGl2ZSBvZmZzZXQgY29ycmVjdC4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwyNCwKLQkgMCwKLQkgMiwKLQkgMjQsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwyNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIHRydWUpLAotfTsKLQotc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwIG1uMTAyMDBfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX01OMTAyMDBfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTU4xMDIwMF8zMiwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTU4xMDIwMF8xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9NTjEwMjAwXzgsIH0sCi0gIHsgQkZEX1JFTE9DXzI0LCBSX01OMTAyMDBfMjQsIH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDgsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAyMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfMjRfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDI0LCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKG1uMTAyMDBfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKG1uMTAyMDBfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW21uMTAyMDBfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNTjEwMjAwIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMjAwX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTU4xMDIwMF9NQVgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBpc19sb2NhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzMyOgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzE2OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF84OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmIHx8IChsb25nKXZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfMjQ6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIHZhbHVlICY9IDB4ZmZmZmZmOwotICAgICAgdmFsdWUgfD0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmZjAwMDAwMCk7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUw4OgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IChvZmZzZXQgKyAxKTsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHhmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUwxNjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMik7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUwyNDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMyk7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwMDAwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgdmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmMDAwMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotfQotCi0MCi0vKiBSZWxvY2F0ZSBhbiBNTjEwMjAwIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaG93dG8gPSBlbGZfbW4xMDIwMF9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgciA9IG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kLAotCQkJCQkgICBpbmZvLCBzZWMsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY29uc3QgY2hhciAqbXNnID0gKGNvbnN0IGNoYXIgKikwOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIG1uMTAyMDAuCi0KLSAgIFRoZXJlJ3MgcXVpdGUgYSBmZXcgcmVsYXhpbmcgb3Bwb3J0dW5pdGVzIGF2YWlsYWJsZSBvbiB0aGUgbW4xMDIwMDoKLQotCSoganNyOjI0IC0+IGpzcjoxNiAJCQkJCSAgIDIgYnl0ZXMKLQotCSogam1wOjI0IC0+IGptcDoxNgkJCQkJICAgMiBieXRlcwotCSogam1wOjE2IC0+IGJyYTo4CQkJCQkgICAxIGJ5dGUKLQotCQkqIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaAotCQlhcm91bmQgdGhlIGp1bXAvYnJhLCB3ZSBtYXkgYmUgYWJsZSB0byByZXZlcnNlIGl0cyBjb25kaXRpb24KLQkJYW5kIGNoYW5nZSBpdHMgdGFyZ2V0IHRvIHRoZSBqdW1wJ3MgdGFyZ2V0LiAgVGhlIGp1bXAvYnJhCi0JCWNhbiB0aGVuIGJlIGRlbGV0ZWQuCQkJCSAgIDIgYnl0ZXMKLQotCSogbW92IGFiczI0IC0+IG1vdiBhYnMxNgkyIGJ5dGUgc2F2aW5ncwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMjQgY2FuIHJlbGF4IHRvIGltbTE2ICAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMTYgY2FuIHJlbGF4IHRvIGltbTggICAxIGJ5dGUKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGQyNCBjYW4gcmVsYXggdG8gZDE2CSAgIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBkMTYgY2FuIHJlbGF4IHRvIGQ4CSAgIDEgYnl0ZQotCi0JYWJzMjQsIGltbTI0LCBkMjQgYWxsIGxvb2sgdGhlIHNhbWUgYXQgdGhlIHJlbG9jIGxldmVsLiAgSXQKLQltaWdodCBtYWtlIHRoZSBjb2RlIHNpbXBsZXIgaWYgd2UgaGFkIGRpZmZlcmVudCByZWxvY3MgZm9yCi0JdGhlIHZhcmlvdXMgcmVsYXhhYmxlIG9wZXJhbmQgdHlwZXMuCi0gICAKLQlXZSBkb24ndCBoYW5kbGUgaW1tMTYtPmltbTggb3IgZDE2LT5kOCBhcyB0aGV5J3JlIHZlcnkgcmFyZQotCWFuZCBzb21ld2hhdCBtb3JlIGRpZmZpY3VsdCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1tbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIEFzc3VtZSBub3RoaW5nIGNoYW5nZXMuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogV2FsayB0aHJvdWdoIHRoZW0gbG9va2luZyBmb3IgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlbGF4ZWQsIHRoZW4gaWdub3JlCi0JIHRoaXMgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfTk9ORQotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF84Ci0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX01BWCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDI0Yml0IHBjLXJlbGF0aXZlIGJyYW5jaC9jYWxsIGludG8gYSAxNmJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2gvY2FsbC4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDI0KQotCXsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gKGlyZWwtPnJfb2Zmc2V0ICsgMyk7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmZmYgKyAyIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSB0d28gYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwMDEgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZTAgJiYgY29kZSAhPSAweGUxKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhlMCkKLQkJYmZkX3B1dF84IChhYmZkLCAweGZjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGUxKQotCQliZmRfcHV0XzggKGFiZmQsIDB4ZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDIwMF9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUgb2Zmc2V0LiAgKi8KLQkgICAgICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JICAgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgOGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2guICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfUENSRUwxNikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDIpOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gOCBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmICsgMSBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgb25lIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MCAmJiAobG9uZyl2YWx1ZSA+IC0weDgwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZmMpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZWEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDIwMF9QQ1JFTDgpOwotCi0JICAgICAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCSAgICAgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICBpcmVsLT5yX29mZnNldCArIDEsIDEpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byBlbGltaW5hdGUgYW4gdW5jb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gKLQkgd2hpY2ggaW1tZWRpYXRlbHkgZm9sbG93cyBhIGNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaCBhcm91bmQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLgotCi0JICAgIG9yaWdpbmFsOgkJbmV3OgotCSAgICBiQ0MgbGFiMQkJYkNDJyBsYWIyCi0JICAgIGJyYSBsYWIyCi0JICAgbGFiMToJICAgICAgIGxhYjE6Ci0KLQotCSBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgYkNDIGNhbid0IHJlYWNoIGxhYjIgYXQgYXNzZW1ibHkgdGltZSwKLQkgYnV0IGR1ZSB0byBvdGhlciByZWxheGF0aW9ucyBpdCBjYW4gcmVhY2ggYXQgbGluayB0aW1lLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX1BDUkVMOCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0JICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gKGlyZWwtPnJfb2Zmc2V0ICsgMSk7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogRG8gbm90aGluZyBpZiB0aGlzIHJlbG9jIGlzIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IHNlYy0+X2Nvb2tlZF9zaXplKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VlIGlmIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGFuIHVuY29uZGl0aW9uYWwgcGMtcmVsYXRpdmUKLQkgICAgIGJyYW5jaCwgbW9yZSBvZnRlbiB0aGFuIG5vdCB0aGlzIHRlc3Qgd2lsbCBmYWlsLCBzbyB3ZQotCSAgICAgdGVzdCBpdCBmaXJzdCB0byBzcGVlZCB0aGluZ3MgdXAuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhlYSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEFsc28gbWFrZSBzdXJlIHRoZSBuZXh0IHJlbG9jYXRpb24gYXBwbGllcyB0byB0aGUgbmV4dAotCSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoYXQgaXQncyBhIHBjLXJlbGF0aXZlIDggYml0IGJyYW5jaC4gICovCi0JICBucmVsID0gaXJlbCArIDE7Ci0JICBpZiAobnJlbCA9PSBpcmVsZW5kCi0JICAgICAgfHwgaXJlbC0+cl9vZmZzZXQgKyAyICE9IG5yZWwtPnJfb2Zmc2V0Ci0JICAgICAgfHwgRUxGMzJfUl9UWVBFIChucmVsLT5yX2luZm8pICE9IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgb3VyIGRlc3RpbmF0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlCi0JICAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0JICBpZiAoc3ltdmFsICE9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIGlyZWwtPnJfb2Zmc2V0ICsgMykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3cgbWFrZSBzdXJlIHdlIGFyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaC4gIFRoaXMgbWF5IG5vdAotCSAgICAgYmUgbmVjZXNzYXJ5LCBidXQgd2h5IHRha2UgdGhlIGNoYW5jZS4gCi0KLQkgICAgIE5vdGUgdGhlc2UgY2hlY2tzIGFzc3VtZSB0aGF0IFJfTU4xMDIwMF9QQ1JFTDggcmVsb2NzCi0JICAgICBvbmx5IG9jY3VyIG9uIGJDQyBhbmQgYkNDeCBpbnNucy4gIElmIHRoZXkgb2NjdXJlZAotCSAgICAgZWxzZXdoZXJlLCB3ZSdkIG5lZWQgdG8ga25vdyB0aGUgc3RhcnQgb2YgdGhpcyBpbnNuCi0JICAgICBmb3IgdGhpcyBjaGVjayB0byBiZSBhY2N1cmF0ZS4gICovCi0JICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICBpZiAoY29kZSAhPSAweGUwICYmIGNvZGUgIT0gMHhlMSAmJiBjb2RlICE9IDB4ZTIKLQkgICAgICAmJiBjb2RlICE9IDB4ZTMgJiYgY29kZSAhPSAweGU0ICYmIGNvZGUgIT0gMHhlNQotCSAgICAgICYmIGNvZGUgIT0gMHhlNiAmJiBjb2RlICE9IDB4ZTcgJiYgY29kZSAhPSAweGU4Ci0JICAgICAgJiYgY29kZSAhPSAweGU5ICYmIGNvZGUgIT0gMHhlYyAmJiBjb2RlICE9IDB4ZWQKLQkgICAgICAmJiBjb2RlICE9IDB4ZWUgJiYgY29kZSAhPSAweGVmICYmIGNvZGUgIT0gMHhmYwotCSAgICAgICYmIGNvZGUgIT0gMHhmZCAmJiBjb2RlICE9IDB4ZmUgJiYgY29kZSAhPSAweGZmKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgYWxzbyBoYXZlIHRvIGJlIHN1cmUgdGhlcmUgaXMgbm8gc3ltYm9sL2xhYmVsCi0JICAgICBhdCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotCSAgaWYgKG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIHNlYywgZXh0c3ltcywKLQkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0JICBzd2l0Y2ggKGNvZGUpCi0JICAgIHsKLQkgICAgICBjYXNlIDB4ZmM6Ci0JCWNvZGUgPSAweGZkOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmQ6Ci0JCWNvZGUgPSAweGZjOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmU6Ci0JCWNvZGUgPSAweGZmOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmY6Ci0JCWNvZGUgPSAweGZlOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTg6Ci0JCWNvZGUgPSAweGU5OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTk6Ci0JCWNvZGUgPSAweGU4OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTA6Ci0JCWNvZGUgPSAweGUyOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTI6Ci0JCWNvZGUgPSAweGUwOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTM6Ci0JCWNvZGUgPSAweGUxOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTE6Ci0JCWNvZGUgPSAweGUzOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTQ6Ci0JCWNvZGUgPSAweGU2OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTY6Ci0JCWNvZGUgPSAweGU0OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTc6Ci0JCWNvZGUgPSAweGU1OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTU6Ci0JCWNvZGUgPSAweGU3OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWM6Ci0JCWNvZGUgPSAweGVkOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWQ6Ci0JCWNvZGUgPSAweGVjOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWU6Ci0JCWNvZGUgPSAweGVmOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWY6Ci0JCWNvZGUgPSAweGVlOwotCQlicmVhazsKLQkgICAgfQotCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAKLQkgIC8qIFNldCB0aGUgcmVsb2MgdHlwZSBhbmQgc3ltYm9sIGZvciB0aGUgZmlyc3QgYnJhbmNoCi0JICAgICBmcm9tIHRoZSBzZWNvbmQgYnJhbmNoLiAgKi8KLQkgIGlyZWwtPnJfaW5mbyA9IG5yZWwtPnJfaW5mbzsKLQotCSAgLyogTWFrZSB0aGUgcmVsb2MgZm9yIHRoZSBzZWNvbmQgYnJhbmNoIGEgbnVsbCByZWxvYy4gICovCi0JICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCSAgICAgICBSX01OMTAyMDBfTk9ORSk7Ci0KLQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgKmFnYWluID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMjRiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF8yNCkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMuIAotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBBbGwgaW5zbnMgd2hpY2ggaGF2ZSAyNGJpdCBvcGVyYW5kcyBhcmUgNSBieXRlcyBsb25nLAotCQkgdGhlIGZpcnN0IGJ5dGUgd2lsbCBhbHdheXMgYmUgMHhmNCwgYnV0IHdlIGRvdWJsZSBjaGVjawotCQkgaXQganVzdCBpbiBjYXNlLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGY0KQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgc3dpdGNoIChjb2RlICYgMHhmYykKLQkJewotCQkvKiBtb3YgaW1tMjQsZG4gLT4gbW92IGltbTE2LGRuICovCi0JCWNhc2UgMHg3MDoKLQkJICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCi0JCSAgaWYgKHZhbHVlICYgMHg4MDAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZjggKyAoY29kZSAmIDB4MDMpLAotCQkJICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgUl9NTjEwMjAwXzE2KTsKLQotCQkgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKLQkJICAgICBvZmZzZXQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogbW92IGltbTI0LGFuIC0+IG1vdiBpbW0xNixhbiAKLQkJICAgY21wIGltbTI0LGFuIC0+IGNtcCBpbW0xNixhbgotCQkgICBtb3YgKGFiczI0KSxkbiAtPiBtb3YgKGFiczE2KSxkbgotCQkgICBtb3YgZG4sKGFiczI0KSAtPiBtb3YgZG4sKGFiczE2KQotCQkgICBtb3ZiIGRuLChhYnMyNCkgLT4gbW92YiBkbiwoYWJzMTYpCi0JCSAgIG1vdmJ1IChhYnMyNCksZG4gLT4gbW92YnUgKGFiczE2KSxkbiAqLwotCQljYXNlIDB4NzQ6Ci0JCWNhc2UgMHg3YzoKLQkJY2FzZSAweGMwOgotCQljYXNlIDB4NDA6Ci0JCWNhc2UgMHg0NDoKLQkJY2FzZSAweGM4OgotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxkZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgaWYgKChjb2RlICYgMHhmYykgPT0gMHg3NCkKLQkJICAgIGNvZGUgPSAweGRjICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4N2MpCi0JCSAgICBjb2RlID0gMHhlYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGMwKQotCQkgICAgY29kZSA9IDB4YzggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg0MCkKLQkJICAgIGNvZGUgPSAweGMwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NDQpCi0JCSAgICBjb2RlID0gMHhjNCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGM4KQotCQkgICAgY29kZSA9IDB4Y2MgKyAoY29kZSAmIDB4MDMpOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCi0JCSAgICAgb2Zmc2V0LiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIGNtcCBpbW0yNCxkbiAtPiBjbXAgaW1tMTYsZG4KLQkJICAgbW92IChhYnMyNCksYW4gLT4gbW92IChhYnMxNiksYW4KLQkJICAgbW92IGFuLChhYnMyNCkgLT4gbW92IGFuLChhYnMxNikKLQkJICAgYWRkIGltbTI0LGRuIC0+IGFkZCBpbW0xNixkbgotCQkgICBhZGQgaW1tMjQsYW4gLT4gYWRkIGltbTE2LGFuCi0JCSAgIHN1YiBpbW0yNCxkbiAtPiBzdWIgaW1tMTYsZG4KLQkJICAgc3ViIGltbTI0LGFuIC0+IHN1YiBpbW0xNixhbiAKLQkJICAgQW5kIGFsbCBkMjQtPmQxNiBpbiBtZW1vcnkgb3BzLiAgKi8KLQkJY2FzZSAweDc4OgotCQljYXNlIDB4ZDA6Ci0JCWNhc2UgMHg1MDoKLQkJY2FzZSAweDYwOgotCQljYXNlIDB4NjQ6Ci0JCWNhc2UgMHg2ODoKLQkJY2FzZSAweDZjOgotCQljYXNlIDB4ODA6Ci0JCWNhc2UgMHhmMDoKLQkJY2FzZSAweDAwOgotCQljYXNlIDB4MTA6Ci0JCWNhc2UgMHhiMDoKLQkJY2FzZSAweDMwOgotCQljYXNlIDB4YTA6Ci0JCWNhc2UgMHgyMDoKLQkJY2FzZSAweDkwOgotCQkgIC8qIE5vdCBzYWZlIGlmIHRoZSBoaWdoIGJpdCBpcyBvbiBhcyByZWxheGluZyBtYXkKLQkJICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KLQkJICBpZiAoKChjb2RlICYgMHhmYykgPT0gMHg3OAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDYwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4NjQKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2OAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDZjCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4ODAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHhmMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDAwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4MTAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHhiMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDMwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4YTAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgyMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDkwKQotCQkgICAgICAgJiYgKHZhbHVlICYgMHg4MDAwKSAhPSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZjcsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NzgpCi0JCSAgICBjb2RlID0gMHg0OCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGQwKQotCQkgICAgY29kZSA9IDB4MzAgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg1MCkKLQkJICAgIGNvZGUgPSAweDIwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NjApCi0JCSAgICBjb2RlID0gMHgxOCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDY0KQotCQkgICAgY29kZSA9IDB4MDggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg2OCkKLQkJICAgIGNvZGUgPSAweDFjICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NmMpCi0JCSAgICBjb2RlID0gMHgwYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDgwKQotCQkgICAgY29kZSA9IDB4YzAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhmMCkKLQkJICAgIGNvZGUgPSAweGIwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MDApCi0JCSAgICBjb2RlID0gMHg4MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDEwKQotCQkgICAgY29kZSA9IDB4YTAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhiMCkKLQkJICAgIGNvZGUgPSAweDcwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MzApCi0JCSAgICBjb2RlID0gMHg2MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGEwKQotCQkgICAgY29kZSA9IDB4ZDAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHgyMCkKLQkJICAgIGNvZGUgPSAweDkwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4OTApCi0JCSAgICBjb2RlID0gMHg1MCArIChjb2RlICYgMHgwNyk7Ci0KLQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOwotCi0JCSAgLyogRGVsZXRlIG9uZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIG1vdmIgKGFiczI0KSxkbiAtPm1vdmJ1IChhYnMxNiksZG4gZXh0eGIgYm4gKi8KLQkJY2FzZSAweGM0OgotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxkZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGNjICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGI4ICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgcmVsb2Mgd2lsbCBiZSBhcHBsaWVkIG9uZSBieXRlIGluIGZyb250IG9mIGl0cwotCQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAvKiBEZWxldGUgb25lIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAyLCAxKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpKQotCWlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGEgc3ltYm9sIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgZWxzZSByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBpbnQgc2huZHg7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2gsICoqc3ltX2hhc2hfZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgLyogRXhhbWluZSBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hfZW5kID0gKHN5bV9oYXNoCi0JCSAgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKQotCQkgICAgIC0gc3ltdGFiX2hkci0+c2hfaW5mbykpOwotICBmb3IgKDsgc3ltX2hhc2ggPCBzeW1faGFzaF9lbmQ7IHN5bV9oYXNoKyspCi0gICAgewotICAgICAgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID09IGFkZHIpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgICAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBtZW1jcHkgKGRhdGEsIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0KLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCWV4dGVybmFsX3N5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGV4dGVybmFsX3N5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpOwotCSAgaWYgKGV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIHN5bXRhYl9oZHItPnNoX2luZm8sIGlucHV0X2JmZCkKLQkJICAhPSAoc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkgICAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7ICsrZXN5bSwgKytpc3ltcCwgKytzZWNwcCkKLQl7Ci0JICBhc2VjdGlvbiAqaXNlYzsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID4gMCAmJiBpc3ltcC0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdobyBrbm93cz8gICovCi0JICAgICAgaXNlYyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnNlY3BwID0gaXNlYzsKLQl9Ci0KLSAgICAgIGlmICghIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX21uMTAyMDBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbW4xMDIwMCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21uMTAyMDAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfTU4xMDIwMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1uMTAyMDBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJMAotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCW1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDMwMC5jIGIvYmZkL2VsZi1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiZDJkNi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk3NyArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMzAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCi0KLXN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeQotewotICAvKiBUaGUgYmFzaWMgZWxmIGxpbmsgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcwotICAgICBjYWxsZWQgZGlyZWN0bHkgKGllIGJ5IG5hbWUpLiAgKi8KLSAgdW5zaWduZWQgaW50IGRpcmVjdF9jYWxsczsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgdGhlIHNpemUgb2YgdGhpcyBmdW5jdGlvbidzIHN0YWNrCi0gICAgIChpZiA8PSAyNTUgYnl0ZXMpLiAgV2Ugc3R1ZmYgdGhpcyBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMKLSAgICAgdG8gdGhpcyB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLgotCi0gICAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzdGFjayBhbGxvY2F0ZWQgYnkgbW92bSEgICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhY2tfc2l6ZTsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgYXJndW1lbnRzIChpZiBhbnkpIGZvciBtb3ZtIGluc3RydWN0aW9uCi0gICAgIGluIHRoZSBwcm9sb2d1ZS4gIFdlIHN0dWZmIHRoaXMgdmFsdWUgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zCi0gICAgIHRvIHRoZSB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX2FyZ3M7Ci0KLSAgLyogRm9yIGZ1bnRpb24gc3ltYm9scywgdGhlIGFtb3VudCBvZiBzdGFjayBzcGFjZSB0aGF0IHdvdWxkIGJlIGFsbG9jYXRlZAotICAgICBieSB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggbW92bV9hcmdzLCBidXQgd2UKLSAgICAgYWRkIGl0IHRvIHRoZSBoYXNoIHRhYmxlIHRvIGF2b2lkIGNvbXB1dGluZyBpdCBvdmVyIGFuZCBvdmVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX3N0YWNrX3NpemU7Ci0KLS8qIFdoZW4gc2V0LCBjb252ZXJ0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvIHRoaXMgdGFyZ2V0IGludG8gImNhbGxzIgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMgMHgxCi0KLS8qIFVzZWQgdG8gbWFyayBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBoYWQgcmVkdW5kYW50IHBhcnRzIG9mIHRoZWlyCi0gICBwcm9sb2d1ZSBkZWxldGVkLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTIDB4MgotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwotfTsKLQotLyogV2UgZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBtYWluIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBzbwotICAgd2UgY2FuIHN0b3JlIHN0YXRlIHZhcmlhYmxlcyBhbmQgYSBzZWNvbmRhcnkgaGFzaCB0YWJsZSB3aXRob3V0Ci0gICByZXNvcnRpbmcgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gICovCi1zdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogQSBoYXNoIHRhYmxlIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgV2UgY291bGQgZGVyaXZlIGEgbmV3IGhhc2ggdGFibGUKLSAgICAgaW5zdGVhZCBvZiB1c2luZyB0aGUgZnVsbCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSBpZiB3ZSB3YW50ZWQKLSAgICAgdG8gc2F2ZSBzb21lIG1lbW9yeS4gICovCi0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqc3RhdGljX2hhc2hfdGFibGU7Ci0KLSAgLyogUmFuZG9tIGxpbmtlciBzdGF0ZSBmbGFncy4gICovCi0jZGVmaW5lIE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEIDB4MQotICBjaGFyIGZsYWdzOwotfTsKLQotLyogRm9yIE1OMTAzMDAgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBHZXQgdGhlIE1OMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG1uMTAzMDBfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKm1uMTAzMDBfZWxmX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgY29tcHV0ZV9mdW5jdGlvbl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21uMTAzMDBfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIER1bW15IHJlbG9jYXRpb24uICBEb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX05PTkUsCi0JIDAsCi0JIDIsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9OT05FIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8zMiwKLQkgMCwKLQkgMiwKLQkgMzIsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzMyIiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMTYgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8xNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDggYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF84LAotCSAwLAotCSAwLAotCSA4LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF84IiwKLQkgZmFsc2UsCi0JIDB4ZmYsCi0JIDB4ZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX1BDUkVMMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMMzIiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmZmZiwKLQkgMHhmZmZmZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFN0YW5kYXJkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9QQ1JFTDE2LAotCSAwLAotCSAxLAotCSAxNiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSB0cnVlKSwKLSAgLyogU3RhbmRhcmQgOCBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfUENSRUw4LAotCSAwLAotCSAwLAotCSA4LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSB0cnVlKSwKLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX01OMTAzMDBfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRFTlRSWSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwXzI0LAotCSAwLAotCSAyLAotCSAyNCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSBmYWxzZSksCi0KLX07Ci0KLXN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCBtbjEwMzAwX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMzAwX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAzMDBfMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAzMDBfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDMwMF84LCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAzMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMOCwgfSwKLSAgeyBCRkRfUkVMT0NfMjQsIFJfTU4xMDMwMF8yNCwgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAobW4xMDMwMF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgbW4xMDMwMF9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAobW4xMDMwMF9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX21uMTAzMDBfaG93dG9fdGFibGVbbW4xMDMwMF9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIE1OMTAzMDAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1uMTAzMDBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NTjEwMzAwX01BWCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21uMTAzMDBfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQkvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1uMTAzMDBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBpc19sb2NhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01OMTAzMDBfTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8zMjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8yNDoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlICYgMHhmZiwgaGl0X2RhdGEpOwotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsICh2YWx1ZSA+PiA4KSAmIDB4ZmYsIGhpdF9kYXRhICsgMSk7Ci0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgKHZhbHVlID4+IDE2KSAmIDB4ZmYsIGhpdF9kYXRhICsgMik7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfMTY6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzg6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9QQ1JFTDg6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX1BDUkVMMTY6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfUENSRUwzMjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci19Ci0KLQwKLS8qIFJlbG9jYXRlIGFuIE1OMTAzMDAgRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqKQotCQkgKGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGhvd3RvID0gZWxmX21uMTAzMDBfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIC8qIEp1c3Qgc2tpcCB0aGUgdnRhYmxlIGdjIHJlbG9jcy4gICovCi0gICAgICBpZiAocl90eXBlID09IFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUCi0JICB8fCByX3R5cGUgPT0gUl9NTjEwMzAwX0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICByID0gbW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCSAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQsCi0JCQkJCSAgIGluZm8sIHNlYywgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjb25zdCBjaGFyICptc2cgPSAoY29uc3QgY2hhciAqKTA7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggaW5pdGlhbGl6aW5nIG9uZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5IChnZW5fZW50cnksIGluX2FyZ3MpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZ2VuX2VudHJ5OwotICAgICBQVFIgaW5fYXJncyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmVudHJ5OwotICB1bnNpZ25lZCBpbnQgYnl0ZV9jb3VudCA9IDA7Ci0KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotCi0gIC8qIElmIHdlIGFscmVhZHkga25vdyB3ZSB3YW50IHRvIGNvbnZlcnQgImNhbGwiIHRvICJjYWxscyIgZm9yIGNhbGxzCi0gICAgIHRvIHRoaXMgc3ltYm9sLCB0aGVuIHJldHVybiBub3cuICAqLwotICBpZiAoZW50cnktPmZsYWdzID09IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBuYW1lZCBjYWxscyB0byB0aGlzIHN5bWJvbCwgb3IgdGhlcmUncyBub3RoaW5nIHdlCi0gICAgIGNhbiBtb3ZlIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4KLSAgICAgbm90ZSB0aGF0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byAiY2FsbHMiCi0gICAgIGluc3RydWN0aW9ucyBhbmQgcmV0dXJuLiAgKi8KLSAgaWYgKGVudHJ5LT5kaXJlY3RfY2FsbHMgPT0gMAotICAgICAgfHwgKGVudHJ5LT5zdGFja19zaXplID09IDAgJiYgZW50cnktPm1vdm1fYXJncyA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIGEgbm90ZSB0aGF0IHdlIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgotCSBpbnN0cnVjdGlvbnMgZm9yIGNhbGxzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGVudHJ5LT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBtYXkgYmUgYWJsZSB0byBtb3ZlIHNvbWUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvCi0gICAgIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICBDb3VudCBob3cgbWFueSBieXRlcyB3ZSBtaWdodCBiZSBhYmxlIHRvCi0gICAgIGVsaW1pbmF0ZSBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLQotICAvKiBBIG1vdm0gaW5zdHJ1Y3Rpb24gaXMgdHdvIGJ5dGVzLiAgKi8KLSAgaWYgKGVudHJ5LT5tb3ZtX2FyZ3MpCi0gICAgYnl0ZV9jb3VudCArPSAyOwotCi0gIC8qIENvdW50IHRoZSBpbnNuIHRvIGFsbG9jYXRlIHN0YWNrIHNwYWNlIHRvby4gICovCi0gIGlmIChlbnRyeS0+c3RhY2tfc2l6ZSA+IDAgJiYgZW50cnktPnN0YWNrX3NpemUgPD0gMTI4KQotICAgIGJ5dGVfY291bnQgKz0gMzsKLSAgZWxzZSBpZiAoZW50cnktPnN0YWNrX3NpemUgPiAwICYmIGVudHJ5LT5zdGFja19zaXplIDwgMjU2KQotICAgIGJ5dGVfY291bnQgKz0gNDsKLQotICAvKiBJZiB1c2luZyAiY2FsbCIgd2lsbCByZXN1bHQgaW4gbGFyZ2VyIGNvZGUsIHRoZW4gdHVybiBhbGwKLSAgICAgdGhlIGFzc29jaWF0ZWQgImNhbGwiIGluc3RydWN0aW9ucyBpbnRvICJjYWxscyIgaW5zdHJ1dGlvbnMuICAqLwotICBpZiAoYnl0ZV9jb3VudCA8IGVudHJ5LT5kaXJlY3RfY2FsbHMpCi0gICAgZW50cnktPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOwotCi0gIC8qIFRoaXMgcm91dGluZSBuZXZlciBmYWlscy4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMzAwLgotCi0gICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAzMDA6Ci0KLQkqIGNhbGxzOjMyIC0+IGNhbGxzOjE2IAkJCQkJICAgMiBieXRlcwotCSogY2FsbDozMiAgLT4gY2FsbDoxNgkJCQkJICAgMiBieXRlcwotCi0JKiBjYWxsOjMyIC0+IGNhbGxzOjMyCQkJCQkgICAxIGJ5dGUKLQkqIGNhbGw6MTYgLT4gY2FsbHM6MTYJCQkJCSAgIDEgYnl0ZQotCQkqIFRoZXNlIGFyZSBkb25lIGFueXRpbWUgdXNpbmcgImNhbGxzIiB3b3VsZCByZXN1bHQKLQkJaW4gc21hbGxlciBjb2RlLCBvciB3aGVuIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSB0aGUKLQkJbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS4KLQotCSogY2FsbDozMgkJCQkJCSAgIHZhcmllcwotCSogY2FsbDoxNgotCQkqIEluIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSBjYW4gbW92ZSBpbnN0cnVjdGlvbnMKLQkJZnJvbSBhIGZ1bmN0aW9uIHByb2xvZ3VlIGludG8gYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JCVRoaXMgaXMgb25seSBkb25lIGlmIHRoZSByZXN1bHRpbmcgY29kZSBpcyBubyBsYXJnZXIKLQkJdGhhbiB0aGUgb3JpZ2luYWwgY29kZS4KLQotCi0JKiBqbXA6MzIgLT4gam1wOjE2CQkJCQkgICAyIGJ5dGVzCi0JKiBqbXA6MTYgLT4gYnJhOjgJCQkJCSAgIDEgYnl0ZQotCi0JCSogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoCi0JCWFyb3VuZCB0aGUganVtcC9icmEsIHdlIG1heSBiZSBhYmxlIHRvIHJldmVyc2UgaXRzIGNvbmRpdGlvbgotCQlhbmQgY2hhbmdlIGl0cyB0YXJnZXQgdG8gdGhlIGp1bXAncyB0YXJnZXQuICBUaGUganVtcC9icmEKLQkJY2FuIHRoZW4gYmUgZGVsZXRlZC4JCQkJICAgMiBieXRlcwotCi0JKiBtb3YgYWJzMzIgLT4gbW92IGFiczE2CQkJCSAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMzIgY2FuIHJlbGF4IHRvIGltbTE2ICAxIG9yIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBpbW0xNiBjYW4gcmVsYXggdG8gaW1tOCAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDMyIGNhbiByZWxheCB0byBkMTYJICAgMSBvciAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIG9yIDIgYnl0ZXMKLQotCVdlIGRvbid0IGhhbmRsZSBpbW0xNi0+aW1tOCBvciBkMTYtPmQ4IGFzIHRoZXkncmUgdmVyeSByYXJlCi0JYW5kIHNvbWV3aGF0IG1vcmUgZGlmZmljdWx0IHRvIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIG1uMTAzMDAgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBmaWVsZHMgaW4gZWFjaCBoYXNoIHRhYmxlIGVudHJ5IHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICAqLwotICBpZiAoKGhhc2hfdGFibGUtPmZsYWdzICYgTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQpID09IDApCi0gICAgewotICAgICAgYmZkICppbnB1dF9iZmQ7Ci0KLSAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGlucHV0IGJmZHMuICAqLwotICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0JICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0JICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCi0JICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0gICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLSAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLSAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQotICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgfQotCi0JICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KLQkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotCSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCSAgICAgIGNoYXIgKm5ld19uYW1lOwotCi0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IG9mIHNlY3Rpb24gY29udGVudHMgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UgaWYgKHNlY3Rpb24tPl9yYXdfc2l6ZSAhPSAwKQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIHNlY3Rpb24sCi0JCQkJCQkgY29udGVudHMsIChmaWxlX3B0cikgMCwKLQkJCQkJCSBzZWN0aW9uLT5fcmF3X3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb250ZW50cyA9IE5VTEw7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzLCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0JICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCQkgICYmIHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0JCXsKLQotCQkgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0JCSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJCSAgICAgKGlucHV0X2JmZCwgc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCQkgICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0JCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0JCSAgLyogTm93IGV4YW1pbmUgZWFjaCByZWxvY2F0aW9uLiAgKi8KLQkJICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGlyZWxlbmQgPSBpcmVsICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JCSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgcl90eXBlOwotCQkgICAgICB1bnNpZ25lZCBsb25nIHJfaW5kZXg7Ci0JCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCQkgICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7Ci0JCSAgICAgIHJfaW5kZXggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKTsKLQotCQkgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludClSX01OMTAzMDBfTUFYKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogV2UgbmVlZCB0aGUgbmFtZSBhbmQgaGFzaCB0YWJsZSBlbnRyeSBvZiB0aGUgdGFyZ2V0Ci0JCQkgc3ltYm9sISAgKi8KLQkJICAgICAgaGFzaCA9IE5VTEw7Ci0JCSAgICAgIHN5bSA9IE5VTEw7Ci0JCSAgICAgIHN5bV9zZWMgPSBOVUxMOwotCi0JCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJCXsKLQkJCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCQkJICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLQkJCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgZXh0c3ltcyArIHJfaW5kZXgsICZpc3ltKTsKLQotCQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwCi0JCQkJICAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCQkgICAgc3ltX3NlYwotCQkJICAgICAgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBpc3ltLnN0X3NobmR4KTsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICBpc3ltLnN0X25hbWUpOwotCi0JCQkgIC8qIElmIGl0IGlzbid0IGEgZnVuY3Rpb24sIHRoZW4gd2UgZG9uJ3QgY2FyZQotCQkJICAgICBhYm91dCBpdC4gICovCi0JCQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJICAgICAgJiYgRUxGX1NUX1RZUEUgKGlzeW0uc3RfaW5mbykgIT0gU1RUX0ZVTkMpCi0JCQkgICAgY29udGludWU7Ci0KLQkJCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcwotCQkJICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkJCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkJCSAgaWYgKG5ld19uYW1lID09IDApCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkJCSAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCQkgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkJICAgICAgICAgc3ltX25hbWUsIHRydWUsCi0JCQkJCQkgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0JCQkgIGZyZWUgKG5ld19uYW1lKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICByX2luZGV4IC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCQkgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkJICAgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9pbmRleF07Ci0JCQl9Ci0KLQkJICAgICAgLyogSWYgdGhpcyBpcyBub3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4gd2UKLQkJCSBzaG91bGQgY29udmVydCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvICJjYWxscyIKLQkJCSBpbnN0cnVjdGlvbnMuICAqLwotCQkgICAgICBjb2RlID0gYmZkX2dldF84IChpbnB1dF9iZmQsCi0JCQkJCWNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkJICAgICAgaWYgKGNvZGUgIT0gMHhkZCAmJiBjb2RlICE9IDB4Y2QpCi0JCQloYXNoLT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLQotCQkgICAgICAvKiBJZiB0aGlzIGlzIGEganVtcC9jYWxsLCB0aGVuIGJ1bXAgdGhlIGRpcmVjdF9jYWxscwotCQkJIGNvdW50ZXIuICBFbHNlIGZvcmNlICJjYWxsIiB0byAiY2FsbHMiIGNvbnZlcnNpb25zLiAgKi8KLQkJICAgICAgaWYgKHJfdHlwZSA9PSBSX01OMTAzMDBfUENSRUwzMgotCQkJICB8fCByX3R5cGUgPT0gUl9NTjEwMzAwX1BDUkVMMTYpCi0JCQloYXNoLT5kaXJlY3RfY2FsbHMrKzsKLQkJICAgICAgZWxzZQotCQkJaGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIE5vdyBsb29rIGF0IHRoZSBhY3R1YWwgY29udGVudHMgdG8gZ2V0IHRoZSBzdGFjayBzaXplLAotCQkgYW5kIGEgbGlzdCBvZiB3aGF0IHJlZ2lzdGVycyB3ZXJlIHNhdmVkIGluIHRoZSBwcm9sb2d1ZQotCQkgKGllIG1vdm1fYXJncykuICAqLwotCSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkJewotCi0JCSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQkJICBpbnQgaWR4LCBzaG5keDsKLQotCQkgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICBzZWN0aW9uKTsKLQotCi0JCSAgLyogTG9vayBhdCBlYWNoIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uIGFuZAotCQkgICAgIHVwZGF0ZSBpbmZvIGZvciB0aGF0IGZ1bmN0aW9uLiAgKi8KLQkJICBlc3ltID0gZXh0c3ltczsKLQkJICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0JCSAgICB7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkJICAmJiBFTEZfU1RfVFlQRSAoaXN5bS5zdF9pbmZvKSA9PSBTVFRfRlVOQykKLQkJCXsKLQkJCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMAotCQkJCSAgICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQkJICAgIHN5bV9zZWMKLQkJCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgaXN5bS5zdF9zaG5keCk7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkJCSAgICBzeW1fc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJaXN5bS5zdF9uYW1lKTsKLQotCQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkJICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJCSAgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkJICAgICAgICAgIHN5bV9uYW1lLCB0cnVlLAotCQkJCQkJICAgICAgICAgIHRydWUsIGZhbHNlKTsKLQkJCSAgZnJlZSAobmV3X25hbWUpOwotCQkJICBjb21wdXRlX2Z1bmN0aW9uX2luZm8gKGlucHV0X2JmZCwgaGFzaCwKLQkJCQkJICAgICAgICAgaXN5bS5zdF92YWx1ZSwgY29udGVudHMpOwotCQkJfQotCQkgICAgfQotCi0JCSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCQkgIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUKLQkJCQkgICAgICAgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotCQkgIGZvciAoaWR4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaWR4KyspCi0JCSAgICB7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgICAgICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICAgIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lkeF07Ci0JCSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCQkgICYmIEVMRl9TVF9UWVBFIChpc3ltLnN0X2luZm8pID09IFNUVF9GVU5DCi0JCQkgICYmIChoYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjdGlvbgotCQkJICAmJiAoKGhhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgIHx8IChoYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJCWNvbXB1dGVfZnVuY3Rpb25faW5mbyAoaW5wdXRfYmZkLCBoYXNoLAotCQkJCQkgICAgICAgKGhhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUsCi0JCQkJCSAgICAgICBjb250ZW50cyk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotCQl7Ci0JCSAgZnJlZSAoZnJlZV9yZWxvY3MpOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgfQotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHN5bWJvbHMuICAqLwotCSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoZnJlZV9leHRzeW1zKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JCX0KLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOb3cgaXRlcmF0ZSBvbiBlYWNoIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgcGVyZm9ybQotCSB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgb24gZWFjaC4gICovCi0gICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSAoaGFzaF90YWJsZSwKLQkJCQkJZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSwKLQkJCQkJTlVMTCk7Ci0gICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSAoaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUsCi0JCQkJCWVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnksCi0JCQkJCU5VTEwpOwotCi0gICAgICAvKiBBbGwgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuICAqLwotICAgICAgaGFzaF90YWJsZS0+ZmxhZ3MgfD0gTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQ7Ci0KLSAgICAgIC8qIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGdvIHRocm91Z2ggZWFjaAotCSBjb2RlIHNlY3Rpb24gYW5kIGRlbGV0ZSBhbnkgcHJvbG9ndWUgaW5zbnMgd2hpY2ggd2lsbCBiZQotCSByZWR1bmRhbnQgYmVjYXVzZSB0aGVpciBvcGVyYXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkIGJ5Ci0JIGEgImNhbGwiIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzOwotCSAgIGlucHV0X2JmZCAhPSBOVUxMOwotCSAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIGFsbCB0aGUgc3ltYm9scyBmb3IgZWFjaCBiZmQuICAqLwotCSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLSAgICAgICAgICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotICAgICAgICAgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0gICAgICAgICAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0gICAgICAgICAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICAgICAgICAgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGlucHV0X2JmZCkKLSAgICAgICAgICAgICAgICAgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgIH0KLQotCSAgLyogV2FsayBvdmVyIGVhY2ggc2VjdGlvbiBpbiB0aGlzIGJmZC4gICovCi0JICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgICBzZWN0aW9uICE9IE5VTEw7Ci0JICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IHNobmR4OwotCSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0JICAgICAgaW50IGlkeDsKLQotCSAgICAgIC8qIFNraXAgbm9uLWNvZGUgc2VjdGlvbnMgYW5kIGVtcHR5IHNlY3Rpb25zLiAgKi8KLQkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDAgfHwgc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0JCXsKLSAgICAgICAgICAgICAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICAgICAgICAgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0X2JmZCwgc2VjdGlvbiwgKFBUUikgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgICAgICAgICAgICAgICAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJfQotCi0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IG9mIHNlY3Rpb24gY29udGVudHMgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKWJmZF9tYWxsb2MgKHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkJICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBzZWN0aW9uLAotCQkJCQkJIGNvbnRlbnRzLCAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgc2VjdGlvbi0+X3Jhd19zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQotCSAgICAgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChpbnB1dF9iZmQsIHNlY3Rpb24pOwotCi0JICAgICAgLyogTm93IGxvb2sgZm9yIGFueSBmdW5jdGlvbiBpbiB0aGlzIHNlY3Rpb24gd2hpY2ggbmVlZHMKLQkJIGluc25zIGRlbGV0ZWQgZnJvbSBpdHMgcHJvbG9ndWUuICAqLwotCSAgICAgIGVzeW0gPSBleHRzeW1zOwotCSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkJICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCQkgIGNoYXIgKm5ld19uYW1lOwotCi0JCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sICZpc3ltKTsKLQotCQkgIGlmIChpc3ltLnN0X3NobmR4ICE9IHNobmR4KQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCSAgICBzeW1fc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMCAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkJICAgIHN5bV9zZWMKLQkJICAgICAgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JCSAgICBzeW1fc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJaXN5bS5zdF9uYW1lKTsKLQotCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkJICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkgIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJCSAgICAgICAgICBzeW1fbmFtZSwgZmFsc2UsCi0JCQkJCSAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotCi0JCSAgZnJlZSAobmV3X25hbWUpOwotCQkgIGlmIChzeW1faGFzaCA9PSBOVUxMKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykKLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVMpKQotCQkgICAgewotCQkgICAgICBpbnQgYnl0ZXMgPSAwOwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoaW5ncy4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKilleHRzeW1zOwotCQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAgIC8qIENvdW50IGhvdyBtYW55IGJ5dGVzIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZS4gICovCi0JCSAgICAgIGlmIChzeW1faGFzaC0+bW92bV9hcmdzKQotCQkJYnl0ZXMgKz0gMjsKLQotCQkgICAgICBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPD0gMTI4KQotCQkJYnl0ZXMgKz0gMzsKLQkJICAgICAgZWxzZSBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUKLQkJCSAgICAgICAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8IDI1NikKLQkJCWJ5dGVzICs9IDQ7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGRlbGV0ZWQgcHJvbG9ndWUgYnl0ZXMgZm9yIHRoaXMKLQkJCSBmdW5jdGlvbi4gICovCi0JCSAgICAgIHN5bV9oYXNoLT5mbGFncyB8PSBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVM7Ci0KLQkJICAgICAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0JCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc2VjdGlvbiwKLQkJCQkJCQkgICBpc3ltLnN0X3ZhbHVlLAotCQkJCQkJCSAgIGJ5dGVzKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAgIC8qIFNvbWV0aGluZyBjaGFuZ2VkLiAgTm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0Ci0JCQkgbWF5IGxlYWQgdG8gbW9yZSByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLQkJICAgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogTG9vayBmb3IgYW55IGdsb2JhbCBmdW5jdGlvbnMgaW4gdGhpcyBzZWN0aW9uIHdoaWNoCi0JCSBuZWVkIGluc25zIGRlbGV0ZWQgZnJvbSB0aGVpciBwcm9sb2d1ZXMuICAqLwotCSAgICAgIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplCi0JCQkJICAgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotCSAgICAgIGZvciAoaWR4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaWR4KyspCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JCSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotCQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0JCSAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgICAgKGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lkeF0pOwotCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCSAgICAgICYmIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlY3Rpb24KLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykKLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVMpKQotCQkgICAgewotCQkgICAgICBpbnQgYnl0ZXMgPSAwOwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoaW5ncy4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKilleHRzeW1zOwotCQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAgIC8qIENvdW50IGhvdyBtYW55IGJ5dGVzIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZS4gICovCi0JCSAgICAgIGlmIChzeW1faGFzaC0+bW92bV9hcmdzKQotCQkJYnl0ZXMgKz0gMjsKLQotCQkgICAgICBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPD0gMTI4KQotCQkJYnl0ZXMgKz0gMzsKLQkJICAgICAgZWxzZSBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUKLQkJCSAgICAgICAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8IDI1NikKLQkJCWJ5dGVzICs9IDQ7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGRlbGV0ZWQgcHJvbG9ndWUgYnl0ZXMgZm9yIHRoaXMKLQkJCSBmdW5jdGlvbi4gICovCi0JCSAgICAgIHN5bV9oYXNoLT5mbGFncyB8PSBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVM7Ci0KLQkJICAgICAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0JCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc2VjdGlvbiwKLQkJCQkJCQkgICAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUsCi0JCQkJCQkJICAgYnl0ZXMpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogU29tZXRoaW5nIGNoYW5nZWQuICBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQKLQkJCSBtYXkgbGVhZCB0byBtb3JlIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotCQkgICAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgcmVsb2NzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSBjb250ZW50cy4gICovCi0JICAgICAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLQkJewotCQkgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIH0KLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSBzeW1ib2xzLiAgKi8KLQkgIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCQl9Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICAvKiAoUmUpaW5pdGlhbGl6ZSBmb3IgdGhlIGJhc2ljIGluc3RydWN0aW9uIHNob3J0ZW5pbmcvcmVsYXhpbmcgcGFzcy4gICovCi0gIGNvbnRlbnRzID0gTlVMTDsKLSAgZXh0c3ltcyA9IE5VTEw7Ci0gIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgYSByZWxvY2F0ZWFibGUgbGluaywgaWYKLSAgICAgdGhpcyBzZWN0aW9uIGRvZXMgbm90IGhhdmUgcmVsb2NzLCBvciBpZiB0aGlzIGlzIG5vdCBhCi0gICAgIGNvZGUgc2VjdGlvbi4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIC8qIFdhbGsgdGhyb3VnaCB0aGVtIGxvb2tpbmcgZm9yIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotICAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQotICAgICAgLyogSWYgdGhpcyBpc24ndCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVsYXhlZCwgdGhlbiBpZ25vcmUKLQkgdGhpcyByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF9OT05FCi0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwXzgKLQkgIHx8IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfTUFYKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCSAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0JICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgIGNoYXIgKm5ld19uYW1lOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+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+cl9pbmZvOwotCi0JICAvKiBNYWtlIHRoZSByZWxvYyBmb3IgdGhlIHNlY29uZCBicmFuY2ggYSBudWxsIHJlbG9jLiAgKi8KLQkgIG5yZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCi0JCQkJICAgICAgIFJfTU4xMDMwMF9OT05FKTsKLQotCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDIpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAqYWdhaW4gPSB0cnVlOwotCX0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAyNCBpbW1lZGlhdGUsIGRpc3BsYWNlbWVudCBvciBhYnNvbHV0ZSBhZGRyZXNzCi0JIGludG8gYSA4IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfMjQpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDggYml0cy4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmICYmIChsb25nKXZhbHVlID4gLTB4ODApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBBTTMzIGluc25zIHdoaWNoIGhhdmUgMjQgb3BlcmFuZHMgYXJlIDYgYnl0ZXMgbG9uZyBhbmQKLQkJIHdpbGwgaGF2ZSAweGZkIGFzIHRoZSBmaXJzdCBieXRlLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMyk7Ci0KLQkgICAgICBpZiAoY29kZSA9PSAweGZkKQotCQl7Ci0JICAgICAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIC8qIFdlIGNhbiBub3QgcmVsYXggMHg2YiwgMHg3YiwgMHg4YiwgMHg5YiBhcyBubyAyNGJpdAotCQkgICAgIGVxdWl2YWxlbnQgaW5zdHJ1Y3Rpb25zIGV4aXN0cy4gICovCi0JICAgICAgICAgIGlmIChjb2RlICE9IDB4NmIgJiYgY29kZSAhPSAweDdiCi0JCSAgICAgICYmIGNvZGUgIT0gMHg4YiAmJiBjb2RlICE9IDB4OWIKLQkJICAgICAgJiYgKChjb2RlICYgMHgwZikgPT0gMHgwOSB8fCAoY29kZSAmIDB4MGYpID09IDB4MDgKLQkJCSAgfHwgKGNvZGUgJiAweDBmKSA9PSAweDBhIHx8IChjb2RlICYgMHgwZikgPT0gMHgwYgotCQkJICB8fCAoY29kZSAmIDB4MGYpID09IDB4MGUpKQotCQkgICAgewotCQkgICAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0Ci0JCSAgICAgICAgIGluIGEgc2lnbmVkIDhiaXQgdmFsdWUuICBUaGlzIGlzIGN1cnJlbnRseSBvdmVyCi0JCSAgICAgICAgIGNvbnNlcnZhdGl2ZS4gICovCi0JCSAgICAgIGlmICgodmFsdWUgJiAweDgwKSA9PSAwKQotCQkJewotCQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywKLQkJCSAgICAgZXRjLiAgKi8KLQkJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDMpOwotCQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJCSAgaXJlbC0+cl9pbmZvCi0JCQkgICAgPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJICAgICAgICAgUl9NTjEwMzAwXzgpOwotCi0JCQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXgKLQkJCSAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdAotCQkJICAgICAgbWF5IGJlIHNsb3cuICAqLwotCQkJICAqYWdhaW4gPSB0cnVlOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMzJiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF8zMikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gMjQgYml0cy4KLQkgICAgIFdlIGFsbG93IGFueSAxNmJpdCBtYXRjaCBoZXJlLiAgV2UgcHJ1bmUgdGhvc2Ugd2UgY2FuJ3QKLQkgICAgIGhhbmRsZSBiZWxvdy4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmZmZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEFNMzMgaW5zbnMgd2hpY2ggaGF2ZSAzMmJpdCBvcGVyYW5kcyBhcmUgNyBieXRlcyBsb25nIGFuZAotCQkgd2lsbCBoYXZlIDB4ZmUgYXMgdGhlIGZpcnN0IGJ5dGUuICAqLwotCi0JICAgICAgLyogR2V0IHRoZSBmaXJzdCBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAzKTsKLQotCSAgICAgIGlmIChjb2RlID09IDB4ZmUpCi0JCXsKLQkgICAgICAgICAgLyogR2V0IHRoZSBzZWNvbmQgb3Bjb2RlLiAgKi8KLQkgICAgICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogQWxsIHRoZSBhbTMzIDMyIC0+IDI0IHJlbGF4aW5nIHBvc3NpYmlsaXRpZXMuICAqLwotCQkgIC8qIFdlIGNhbiBub3QgcmVsYXggMHg2YiwgMHg3YiwgMHg4YiwgMHg5YiBhcyBubyAyNGJpdAotCQkgICAgIGVxdWl2YWxlbnQgaW5zdHJ1Y3Rpb25zIGV4aXN0cy4gICovCi0JICAgICAgICAgIGlmIChjb2RlICE9IDB4NmIgJiYgY29kZSAhPSAweDdiCi0JCSAgICAgICYmIGNvZGUgIT0gMHg4YiAmJiBjb2RlICE9IDB4OWIKLQkJICAgICAgJiYgKChjb2RlICYgMHgwZikgPT0gMHgwOSB8fCAoY29kZSAmIDB4MGYpID09IDB4MDgKLQkJCSAgfHwgKGNvZGUgJiAweDBmKSA9PSAweDBhIHx8IChjb2RlICYgMHgwZikgPT0gMHgwYgotCQkJICB8fCAoY29kZSAmIDB4MGYpID09IDB4MGUpKQotCQkgICAgewotCQkgICAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0Ci0JCSAgICAgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgVGhpcyBpcyBjdXJyZW50bHkgb3ZlcgotCQkgICAgICAgICBjb25zZXJ2YXRpdmUuICAqLwotCQkgICAgICBpZiAoKHZhbHVlICYgMHg4MDAwKSA9PSAwKQotCQkJewotCQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywKLQkJCSAgICAgZXRjLiAgKi8KLQkJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDMpOwotCQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJCSAgaXJlbC0+cl9pbmZvCi0JCQkgICAgPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJICAgICAgICAgUl9NTjEwMzAwXzI0KTsKLQotCQkJICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMywgMSkpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXgKLQkJCSAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdAotCQkJICAgICAgbWF5IGJlIHNsb3cuICAqLwotCQkJICAqYWdhaW4gPSB0cnVlOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQotCQl9Ci0JICAgIH0KLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLgotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBNb3N0IGluc25zIHdoaWNoIGhhdmUgMzJiaXQgb3BlcmFuZHMgYXJlIDYgYnl0ZXMgbG9uZzsKLQkJIGV4Y2VwdGlvbnMgYXJlIHBjcmVsIGluc25zIGFuZCBiaXQgaW5zbnMuCi0KLQkJIFdlIGhhbmRsZSBwY3JlbCBpbnNucyBhYm92ZS4gIFdlIGRvbid0IGJvdGhlciB0cnlpbmcKLQkJIHRvIGhhbmRsZSB0aGUgYml0IGluc25zIGhlcmUuCi0KLQkJIFRoZSBmaXJzdCBieXRlIG9mIHRoZSByZW1haW5pbmcgaW5zbnMgd2lsbCBiZSAweGZjLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGZjKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKChjb2RlICYgMHhmMCkgPCAweDgwKQotCQlzd2l0Y2ggKGNvZGUgJiAweGYwKQotCQkgIHsKLQkJICAvKiBtb3YgKGQzMixhbSksZG4gICAtPiBtb3YgKGQzMixhbSksZG4KLQkJICAgICBtb3YgZG0sKGQzMixhbSkgICAtPiBtb3YgZG4sKGQzMixhbSkKLQkJICAgICBtb3YgKGQzMixhbSksYW4gICAtPiBtb3YgKGQzMixhbSksYW4KLQkJICAgICBtb3YgZG0sKGQzMixhbSkgICAtPiBtb3YgZG4sKGQzMixhbSkKLQkJICAgICBtb3ZidSAoZDMyLGFtKSxkbiAtPiBtb3ZidSAoZDMyLGFtKSxkbgotCQkgICAgIG1vdmJ1IGRtLChkMzIsYW0pIC0+IG1vdmJ1IGRuLChkMzIsYW0pCi0JCSAgICAgbW92aHUgKGQzMixhbSksZG4gLT4gbW92aHUgKGQzMixhbSksZG4KLQkJICAgICBtb3ZodSBkbSwoZDMyLGFtKSAtPiBtb3ZodSBkbiwoZDMyLGFtKSAqLwotCQkgIGNhc2UgMHgwMDoKLQkJICBjYXNlIDB4MTA6Ci0JCSAgY2FzZSAweDIwOgotCQkgIGNhc2UgMHgzMDoKLQkJICBjYXNlIDB4NDA6Ci0JCSAgY2FzZSAweDUwOgotCQkgIGNhc2UgMHg2MDoKLQkJICBjYXNlIDB4NzA6Ci0JCSAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICAqLwotCQkgICAgaWYgKGNvZGUgPT0gMHhjYwotCQkJJiYgKHZhbHVlICYgMHg4MDAwKSkKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMikpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYwKSA9PSAweDgwCi0JCSAgICAgICB8fCAoY29kZSAmIDB4ZjApID09IDB4OTApCi0JCXN3aXRjaCAoY29kZSAmIDB4ZjMpCi0JCSAgewotCQkgIC8qIG1vdiBkbiwoYWJzMzIpICAgLT4gbW92IGRuLChhYnMxNikKLQkJICAgICBtb3ZidSBkbiwoYWJzMzIpIC0+IG1vdmJ1IGRuLChhYnMxNikKLQkJICAgICBtb3ZodSBkbiwoYWJzMzIpIC0+IG1vdmh1IGRuLChhYnMxNikgICovCi0JCSAgY2FzZSAweDgxOgotCQkgIGNhc2UgMHg4MjoKLQkJICBjYXNlIDB4ODM6Ci0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgaWYgKChjb2RlICYgMHhmMykgPT0gMHg4MSkKLQkJICAgICAgY29kZSA9IDB4MDEgKyAoY29kZSAmIDB4MGMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYzKSA9PSAweDgyKQotCQkgICAgICBjb2RlID0gMHgwMiArIChjb2RlICYgMHgwYyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZjMpID09IDB4ODMpCi0JCSAgICAgIGNvZGUgPSAweDAzICsgKGNvZGUgJiAweDBjKTsKLQkJICAgIGVsc2UKLQkJICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogVGhlIG9wY29kZSBnb3Qgc2hvcnRlciB0b28sIHNvIHdlIGhhdmUgdG8gZml4IHRoZQotCQkgICAgICAgYWRkZW5kIGFuZCBvZmZzZXQgdG9vISAgKi8KLQkJICAgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAgIC8qIERlbGV0ZSB0aHJlZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMykpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQotCQkgIC8qIG1vdiBhbSwoYWJzMzIpICAgIC0+IG1vdiBhbSwoYWJzMTYpCi0JCSAgICAgbW92IGFtLChkMzIsc3ApICAgLT4gbW92IGFtLChkMTYsc3ApCi0JCSAgICAgbW92IGRtLChkMzIsc3ApICAgLT4gbW92IGRtLChkMzIsc3ApCi0JCSAgICAgbW92YnUgZG0sKGQzMixzcCkgLT4gbW92YnUgZG0sKGQzMixzcCkKLQkJICAgICBtb3ZodSBkbSwoZDMyLHNwKSAtPiBtb3ZodSBkbSwoZDMyLHNwKSAqLwotCQkgIGNhc2UgMHg4MDoKLQkJICBjYXNlIDB4OTA6Ci0JCSAgY2FzZSAweDkxOgotCQkgIGNhc2UgMHg5MjoKLQkJICBjYXNlIDB4OTM6Ci0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgICAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDIsIDIpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIGVsc2UgaWYgKChjb2RlICYgMHhmMCkgPCAweGYwKQotCQlzd2l0Y2ggKGNvZGUgJiAweGZjKQotCQkgIHsKLQkJICAvKiBtb3YgaW1tMzIsZG4gICAgIC0+IG1vdiBpbW0xNixkbgotCQkgICAgIG1vdiBpbW0zMixhbiAgICAgLT4gbW92IGltbTE2LGFuCi0JCSAgICAgbW92IChhYnMzMiksZG4gICAtPiBtb3YgKGFiczE2KSxkbgotCQkgICAgIG1vdmJ1IChhYnMzMiksZG4gLT4gbW92YnUgKGFiczE2KSxkbgotCQkgICAgIG1vdmh1IChhYnMzMiksZG4gLT4gbW92aHUgKGFiczE2KSxkbiAgKi8KLQkJICBjYXNlIDB4Y2M6Ci0JCSAgY2FzZSAweGRjOgotCQkgIGNhc2UgMHhhNDoKLQkJICBjYXNlIDB4YTg6Ci0JCSAgY2FzZSAweGFjOgotCQkgICAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQotCQkgICAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KLQkJICAgIGlmIChjb2RlID09IDB4Y2MKLQkJCSYmICh2YWx1ZSAmIDB4ODAwMCkpCi0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjYykKLQkJICAgICAgY29kZSA9IDB4MmMgKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGRjKQotCQkgICAgICBjb2RlID0gMHgyNCArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YTQpCi0JCSAgICAgIGNvZGUgPSAweDMwICsgKGNvZGUgJiAweDAzKTsKLQkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhOCkKLQkJICAgICAgY29kZSA9IDB4MzQgKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGFjKQotCQkgICAgICBjb2RlID0gMHgzOCArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKLQkJICAgICAgIGFkZGVuZCBhbmQgb2Zmc2V0IHRvbyEgICovCi0JCSAgICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgICAvKiBEZWxldGUgdGhyZWUgYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDEsIDMpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0KLQkJICAvKiBtb3YgKGFiczMyKSxhbiAgICAtPiBtb3YgKGFiczE2KSxhbgotCQkgICAgIG1vdiAoZDMyLHNwKSxhbiAgIC0+IG1vdiAoZDMyLHNwKSxhbgotCQkgICAgIG1vdiAoZDMyLHNwKSxkbiAgIC0+IG1vdiAoZDMyLHNwKSxkbgotCQkgICAgIG1vdmJ1IChkMzIsc3ApLGRuIC0+IG1vdmJ1IChkMzIsc3ApLGRuCi0JCSAgICAgbW92aHUgKGQzMixzcCksZG4gLT4gbW92aHUgKGQzMixzcCksZG4KLQkJICAgICBhZGQgaW1tMzIsZG4gICAgICAtPiBhZGQgaW1tMTYsZG4KLQkJICAgICBjbXAgaW1tMzIsZG4gICAgICAtPiBjbXAgaW1tMTYsZG4KLQkJICAgICBhZGQgaW1tMzIsYW4gICAgICAtPiBhZGQgaW1tMTYsYW4KLQkJICAgICBjbXAgaW1tMzIsYW4gICAgICAtPiBjbXAgaW1tMTYsYW4KLQkJICAgICBhbmQgaW1tMzIsZG4gICAgICAtPiBhbmQgaW1tMzIsZG4KLQkJICAgICBvciBpbW0zMixkbiAgICAgICAtPiBvciBpbW0zMixkbgotCQkgICAgIHhvciBpbW0zMixkbiAgICAgIC0+IHhvciBpbW0zMixkbgotCQkgICAgIGJ0c3QgaW1tMzIsZG4gICAgIC0+IGJ0c3QgaW1tMzIsZG4gKi8KLQotCQkgIGNhc2UgMHhhMDoKLQkJICBjYXNlIDB4YjA6Ci0JCSAgY2FzZSAweGIxOgotCQkgIGNhc2UgMHhiMjoKLQkJICBjYXNlIDB4YjM6Ci0JCSAgY2FzZSAweGMwOgotCQkgIGNhc2UgMHhjODoKLQotCQkgIGNhc2UgMHhkMDoKLQkJICBjYXNlIDB4ZDg6Ci0JCSAgY2FzZSAweGUwOgotCQkgIGNhc2UgMHhlMToKLQkJICBjYXNlIDB4ZTI6Ci0JCSAgY2FzZSAweGUzOgotCQkgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSBSX01OMTAzMDBfMTYpOwotCi0JCSAgICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZmUpCi0JCXsKLQkJICAvKiBhZGQgaW1tMzIsc3AgLT4gYWRkIGltbTE2LHNwICAqLwotCi0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIHN0YWNrIHNpemUgYW5kIG1vdm0gYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24KLSAgIHJlZmVycmVkIHRvIGJ5IEhBU0ggYXQgYWRkcmVzcyBBRERSIGluIHNlY3Rpb24gd2l0aAotICAgY29udGVudHMgQ09OVEVOVFMsIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgdm9pZAotY29tcHV0ZV9mdW5jdGlvbl9pbmZvIChhYmZkLCBoYXNoLCBhZGRyLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZTEsIGJ5dGUyOwotICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgYSB2ZXJ5IHNtYWxsIHN1YnNldCBvZiB0aGUgcG9zc2libGUgcHJvbG9ndWUKLSAgICAgc2VxdWVuY2VzIGhlcmUuICBCYXNpY2FsbHkgd2UgbG9vayBmb3I6Ci0KLSAgICAgbW92bSBbZDIsZDMsYTIsYTNdLHNwIChvcHRpb25hbCkKLSAgICAgYWRkIDxzaXplPixzcCAob3B0aW9uYWwsIGFuZCBvbmx5IGZvciBzaXplcyB3aGljaCBmaXQgaW4gYW4gdW5zaWduZWQKLQkJICAgIDggYml0IG51bWJlcikKLQotICAgICBJZiB3ZSBmaW5kIGFueXRoaW5nIGVsc2UsIHdlIHF1aXQuICAqLwotCi0gIC8qIExvb2sgZm9yIG1vdm0gW3JlZ3NdLHNwICovCi0gIGJ5dGUxID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIpOwotICBieXRlMiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMSk7Ci0KLSAgaWYgKGJ5dGUxID09IDB4Y2YpCi0gICAgewotICAgICAgaGFzaC0+bW92bV9hcmdzID0gYnl0ZTI7Ci0gICAgICBhZGRyICs9IDI7Ci0gICAgICBieXRlMSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgICAgIGJ5dGUyID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAxKTsKLSAgICB9Ci0KLSAgLyogTm93IGZpZ3VyZSBvdXQgaG93IG11Y2ggc3RhY2sgc3BhY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhlIG1vdm0KLSAgICAgaW5zdHJ1Y3Rpb24uICBXZSBuZWVkIHRoaXMga2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBmdW50aW9uJ3Mgbm9ybWFsCi0gICAgIHN0YWNrIHNwYWNlLiAgKi8KLSAgaWYgKGhhc2gtPm1vdm1fYXJncykKLSAgICB7Ci0gICAgICAvKiBTcGFjZSBmb3IgZDIuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4ODApCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFNwYWNlIGZvciBkMy4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHg0MCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNDsKLQotICAgICAgLyogU3BhY2UgZm9yIGEyLiAgKi8KLSAgICAgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDIwKQotCWhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA0OwotCi0gICAgICAvKiBTcGFjZSBmb3IgYTMuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4MTApCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7Ci0KLSAgICAgIC8qICJvdGhlciIgc3BhY2UuICBkMCwgZDEsIGEwLCBhMSwgbWRyLCBsaXIsIGxhciwgNCBieXRlIHBhZC4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgwOCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gOCAqIDQ7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2FtMzMpCi0JewotCSAgLyogImV4b3RoZXIiIHNwYWNlLiAgZTAsIGUxLCBtZHJxLCBtY3JoLCBtY3JsLCBtY3ZmICovCi0JICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgxKQotCSAgICBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNiAqIDQ7Ci0KLQkgIC8qIGV4cmVnMSBzcGFjZS4gIGU0LCBlNSwgZTYsIGU3ICovCi0JICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgyKQotCSAgICBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNCAqIDQ7Ci0KLQkgIC8qIGV4cmVnMCBzcGFjZS4gIGUyLCBlMyAgKi8KLQkgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDQpCi0JICAgIGhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSAyICogNDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBsb29rIGZvciB0aGUgdHdvIHN0YWNrIGFkanVzdG1lbnQgdmFyaWFudHMuICAqLwotICBpZiAoYnl0ZTEgPT0gMHhmOCAmJiBieXRlMiA9PSAweGZlKQotICAgIHsKLSAgICAgIGludCB0ZW1wID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgICAgIHRlbXAgPSAoKHRlbXAgJiAweGZmKSBeICh+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+c3RhdGljX2hhc2hfdGFibGUpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyBpbnQKLWVsZl9tbjEwMzAwX21hY2ggKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01OMTAzMDBfTUFDSCkKLSAgICB7Ci0gICAgICBjYXNlIEVfTU4xMDMwMF9NQUNIX01OMTAzMDA6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gYmZkX21hY2hfbW4xMDMwMDsKLQotICAgICAgY2FzZSBFX01OMTAzMDBfTUFDSF9BTTMzOgotICAgICAgICByZXR1cm4gYmZkX21hY2hfYW0zMzsKLSAgICB9Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgYSBNTjEwMzAwIEVMRiBvYmplY3QKLSAgIGZpbGUuICBUaGlzIGdldHMgdGhlIE1OMTAzMDAgYXJjaGl0ZWN0dXJlIHJpZ2h0IGJhc2VkIG9uIHRoZSBtYWNoaW5lCi0gICBudW1iZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLV9iZmRfbW4xMDMwMF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBiZmRfbWFjaF9tbjEwMzAwOgotCXZhbCA9IEVfTU4xMDMwMF9NQUNIX01OMTAzMDA7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgYmZkX21hY2hfYW0zMzoKLQl2YWwgPSBFX01OMTAzMDBfTUFDSF9BTTMzOwotCWJyZWFrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPSB+IChFRl9NTjEwMzAwX01BQ0gpOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfbW4xMDMwMF9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbW4xMDMwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmX21uMTAzMDBfbWFjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0KLWJvb2xlYW4KLV9iZmRfbW4xMDMwMF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0gICAgICAmJiBiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X21hY2ggKGliZmQpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9tbjEwMzAwX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLW1uMTAzMDAiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tbjEwMzAwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX01OMTAzMDAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJbW4xMDMwMF9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJMAotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJMQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJbW4xMDMwMF9lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawltbjEwMzAwX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgltbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbgltbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCQltbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQllbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLQotLyogU28gd2UgY2FuIHNldCBiaXRzIGluIGVfZmxhZ3MuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AgICAgICAgICAgICBfYmZkX21uMTAzMDBfZWxmX29iamVjdF9wCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYmZkX21uMTAzMDBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmLmMgYi9iZmQvZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYzg3YWYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQwOSArMCwwIEBACi0vKiBFTEYgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0KLVNFQ1RJT04KLQlFTEYgYmFja2VuZHMKLQotCUJGRCBzdXBwb3J0IGZvciBFTEYgZm9ybWF0cyBpcyBiZWluZyB3b3JrZWQgb24uCi0JQ3VycmVudGx5LCB0aGUgYmVzdCBzdXBwb3J0ZWQgYmFjayBlbmRzIGFyZSBmb3Igc3BhcmMgYW5kIGkzODYKLQkocnVubmluZyBzdnI0IG9yIFNvbGFyaXMgMikuCi0KLQlEb2N1bWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHN1cHBvcnQgY29kZSBzdGlsbCBuZWVkcwotCXRvIGJlIHdyaXR0ZW4uICBUaGUgY29kZSBpcyBjaGFuZ2luZyBxdWlja2x5IGVub3VnaCB0aGF0IHdlCi0JaGF2ZW4ndCBib3RoZXJlZCB5ZXQuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNkZWZpbmUgQVJDSF9TSVpFIDAKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLXN0YXRpYyBJTkxJTkUgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWFrZV9tYXBwaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG1hcF9zZWN0aW9uc190b19zZWdtZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBlbGZfc29ydF9zZWN0aW9ucyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3dhcF9vdXRfc3ltcyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqZWxmX3JlYWQgUEFSQU1TICgoYmZkICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgZWxmX2Zha2Vfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX3NlY3Rpb25fbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIElOTElORSBpbnQgc3ltX2lzX2dsb2JhbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWFwX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGdldF9wcm9ncmFtX2hlYWRlcl9zaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZjb3JlX3JlYWRfbm90ZXMgUEFSQU1TICgoYmZkICosIGJmZF92bWEsIGJmZF92bWEpKTsKLQotLyogU3dhcCB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBUaGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcwotICAgY3VycmVudGx5IHNpemUgaW5kZXBlbmRlbnQuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwKLSAgIG5lZWQgdG8gbW92ZSBpbnRvIGVsZmNvZGUuaC4gICovCi0KLS8qIFN3YXAgaW4gYSBWZXJkZWYgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkZWYgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqZHN0OwotewotICBkc3QtPnZkX3ZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfdmVyc2lvbik7Ci0gIGRzdC0+dmRfZmxhZ3MgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9mbGFncyk7Ci0gIGRzdC0+dmRfbmR4ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9uZHgpOwotICBkc3QtPnZkX2NudCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfY250KTsKLSAgZHN0LT52ZF9oYXNoICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX2hhc2gpOwotICBkc3QtPnZkX2F1eCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfYXV4KTsKLSAgZHN0LT52ZF9uZXh0ICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcmRlZiBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkZWYgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfdmVyc2lvbiwgZHN0LT52ZF92ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX2ZsYWdzLCBkc3QtPnZkX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX25keCwgZHN0LT52ZF9uZHgpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfY250LCBkc3QtPnZkX2NudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9oYXNoLCBkc3QtPnZkX2hhc2gpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dmRfYXV4LCBkc3QtPnZkX2F1eCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9uZXh0LCBkc3QtPnZkX25leHQpOwotfQotCi0vKiBTd2FwIGluIGEgVmVyZGF1eCBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICpkc3Q7Ci17Ci0gIGRzdC0+dmRhX25hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRhX25hbWUpOwotICBkc3QtPnZkYV9uZXh0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkYV9uZXh0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBWZXJkYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkYXV4ICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZGFfbmFtZSwgZHN0LT52ZGFfbmFtZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZGFfbmV4dCwgZHN0LT52ZGFfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJuZWVkIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKmRzdDsKLXsKLSAgZHN0LT52bl92ZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuX3ZlcnNpb24pOwotICBkc3QtPnZuX2NudCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5fY250KTsKLSAgZHN0LT52bl9maWxlICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX2ZpbGUpOwotICBkc3QtPnZuX2F1eCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fYXV4KTsKLSAgZHN0LT52bl9uZXh0ICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcm5lZWQgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuX3ZlcnNpb24sIGRzdC0+dm5fdmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bl9jbnQsIGRzdC0+dm5fY250KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX2ZpbGUsIGRzdC0+dm5fZmlsZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bl9hdXgsIGRzdC0+dm5fYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX25leHQsIGRzdC0+dm5fbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJuYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5hdXggKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmRzdDsKLXsKLSAgZHN0LT52bmFfaGFzaCAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5hX2hhc2gpOwotICBkc3QtPnZuYV9mbGFncyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bmFfZmxhZ3MpOwotICBkc3QtPnZuYV9vdGhlciA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bmFfb3RoZXIpOwotICBkc3QtPnZuYV9uYW1lICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bmFfbmFtZSk7Ci0gIGRzdC0+dm5hX25leHQgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuYV9uZXh0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBWZXJuYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuYXV4ICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfaGFzaCwgZHN0LT52bmFfaGFzaCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bmFfZmxhZ3MsIGRzdC0+dm5hX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuYV9vdGhlciwgZHN0LT52bmFfb3RoZXIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX25hbWUsIGRzdC0+dm5hX25hbWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX25leHQsIGRzdC0+dm5hX25leHQpOwotfQotCi0vKiBTd2FwIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyc3ltICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9WZXJzeW0gKmRzdDsKLXsKLSAgZHN0LT52c192ZXJzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZzX3ZlcnMpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcnN5bSBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJzeW0gKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dnNfdmVycywgZHN0LT52c192ZXJzKTsKLX0KLQotLyogU3RhbmRhcmQgRUxGIGhhc2ggZnVuY3Rpb24uICBEbyBub3QgY2hhbmdlIHRoaXMgZnVuY3Rpb247IHlvdSB3aWxsCi0gICBjYXVzZSBpbnZhbGlkIGhhc2ggdGFibGVzIHRvIGJlIGdlbmVyYXRlZC4gICovCi0KLXVuc2lnbmVkIGxvbmcKLWJmZF9lbGZfaGFzaCAobmFtZWFyZykKLSAgICAgY29uc3QgY2hhciAqbmFtZWFyZzsKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG5hbWVhcmc7Ci0gIHVuc2lnbmVkIGxvbmcgaCA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgZzsKLSAgaW50IGNoOwotCi0gIHdoaWxlICgoY2ggPSAqbmFtZSsrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGggPSAoaCA8PCA0KSArIGNoOwotICAgICAgaWYgKChnID0gKGggJiAweGYwMDAwMDAwKSkgIT0gMCkKLQl7Ci0JICBoIF49IGcgPj4gMjQ7Ci0JICAvKiBUaGUgRUxGIEFCSSBzYXlzIGBoICY9IH5nJywgYnV0IHRoaXMgaXMgZXF1aXZhbGVudCBpbgotCSAgICAgdGhpcyBjYXNlIGFuZCBvbiBzb21lIG1hY2hpbmVzIG9uZSBpbnNuIGluc3RlYWQgb2YgdHdvLiAgKi8KLQkgIGggXj0gZzsKLQl9Ci0gICAgfQotICByZXR1cm4gaDsKLX0KLQotLyogUmVhZCBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0IGluIGFuIEVMRgotICAgZmlsZSwgaW50byBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZQotICAgYnVmZmVyLiAqLwotCi1zdGF0aWMgY2hhciAqCi1lbGZfcmVhZCAoYWJmZCwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKiBhYmZkOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAoKGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgYnVmLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gYnVmOwotfQotCi1ib29sZWFuCi1iZmRfZWxmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICAvKiB0aGlzIGp1c3QgZG9lcyBpbml0aWFsaXphdGlvbiAqLwotICAvKiBjb2ZmX21rb2JqZWN0IHphbGxvYydzIHNwYWNlIGZvciB0ZGF0YS5jb2ZmX29ial9kYXRhIC4uLiAqLwotICBlbGZfdGRhdGEgKGFiZmQpID0gKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpOwotICBpZiAoZWxmX3RkYXRhIChhYmZkKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogc2luY2UgZXZlcnl0aGluZyBpcyBkb25lIGF0IGNsb3NlIHRpbWUsIGRvIHdlIG5lZWQgYW55Ci0gICAgIGluaXRpYWxpemF0aW9uPyAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfZWxmX21rY29yZWZpbGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIC8qIEkgdGhpbmsgdGhpcyBjYW4gYmUgZG9uZSBqdXN0IGxpa2UgYW4gb2JqZWN0IGZpbGUuICovCi0gIHJldHVybiBiZmRfZWxmX21rb2JqZWN0IChhYmZkKTsKLX0KLQotY2hhciAqCi1iZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgY2hhciAqc2hzdHJ0YWIgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc2hzdHJ0YWJzaXplOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpZiAoaV9zaGRycCA9PSAwIHx8IGlfc2hkcnBbc2hpbmRleF0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBzaHN0cnRhYiA9IChjaGFyICopIGlfc2hkcnBbc2hpbmRleF0tPmNvbnRlbnRzOwotICBpZiAoc2hzdHJ0YWIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyBjYWNoZWQgb25lLCBhdHRlbXB0IHRvIHJlYWQsIGFuZCBjYWNoZSB3aGF0IHdlIHJlYWQuICovCi0gICAgICBvZmZzZXQgPSBpX3NoZHJwW3NoaW5kZXhdLT5zaF9vZmZzZXQ7Ci0gICAgICBzaHN0cnRhYnNpemUgPSBpX3NoZHJwW3NoaW5kZXhdLT5zaF9zaXplOwotICAgICAgc2hzdHJ0YWIgPSBlbGZfcmVhZCAoYWJmZCwgb2Zmc2V0LCBzaHN0cnRhYnNpemUpOwotICAgICAgaV9zaGRycFtzaGluZGV4XS0+Y29udGVudHMgPSAoUFRSKSBzaHN0cnRhYjsKLSAgICB9Ci0gIHJldHVybiBzaHN0cnRhYjsKLX0KLQotY2hhciAqCi1iZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBzaGluZGV4LCBzdHJpbmRleCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci0gICAgIHVuc2lnbmVkIGludCBzdHJpbmRleDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotICBpZiAoc3RyaW5kZXggPT0gMCkKLSAgICByZXR1cm4gIiI7Ci0KLSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XTsKLQotICBpZiAoaGRyLT5jb250ZW50cyA9PSBOVUxMCi0gICAgICAmJiBiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoc3RyaW5kZXggPj0gaGRyLT5zaF9zaXplKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogaW52YWxpZCBzdHJpbmcgb2Zmc2V0ICV1ID49ICVsdSBmb3Igc2VjdGlvbiBgJXMnIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdHJpbmRleCwgKHVuc2lnbmVkIGxvbmcpIGhkci0+c2hfc2l6ZSwKLQkgKChzaGluZGV4ID09IGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgKLQkgICAmJiBzdHJpbmRleCA9PSBoZHItPnNoX25hbWUpCi0JICA/ICIuc2hzdHJ0YWIiCi0JICA6IGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiIChhYmZkLCBoZHItPnNoX25hbWUpKSk7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gIHJldHVybiAoKGNoYXIgKikgaGRyLT5jb250ZW50cykgKyBzdHJpbmRleDsKLX0KLQotLyogTWFrZSBhIEJGRCBzZWN0aW9uIGZyb20gYW4gRUxGIHNlY3Rpb24uICBXZSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlCi0gICBCRkQgc2VjdGlvbiBpbiB0aGUgYmZkX3NlY3Rpb24gZmllbGQgb2YgdGhlIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChzdHJjbXAgKG5hbWUsCi0JCQkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uKSkgPT0gMCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3c2VjdC0+ZmlsZXBvcyA9IGhkci0+c2hfb2Zmc2V0OwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIG5ld3NlY3QsIGhkci0+c2hfYWRkcikKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIG5ld3NlY3QsIGhkci0+c2hfc2l6ZSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgbmV3c2VjdCwKLQkJCQkgICAgICBiZmRfbG9nMiAoaGRyLT5zaF9hZGRyYWxpZ24pKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0gIGlmIChoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUykKLSAgICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgICAgaWYgKGhkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCWZsYWdzIHw9IFNFQ19MT0FEOwotICAgIH0KLSAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikgIT0gMCkKLSAgICBmbGFncyB8PSBTRUNfQ09ERTsKLSAgZWxzZSBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgZmxhZ3MgfD0gU0VDX0RBVEE7Ci0KLSAgLyogVGhlIGRlYnVnZ2luZyBzZWN0aW9ucyBhcHBlYXIgdG8gYmUgcmVjb2duaXplZCBvbmx5IGJ5IG5hbWUsIG5vdAotICAgICBhbnkgc29ydCBvZiBmbGFnLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0gICAgICB8fCBzdHJuY21wIChuYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDAKLSAgICAgIHx8IHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIHNpemVvZiAiLnN0YWIiIC0gMSkgPT0gMCkKLSAgICBmbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgaWYgdGhlIG5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSwgd2UKLSAgICAgb25seSBsaW5rIGEgc2luZ2xlIGNvcHkgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAotICAgICBnKysuICBnKysgd2lsbCBlbWl0IGVhY2ggdGVtcGxhdGUgZXhwYW5zaW9uIGluIGl0cyBvd24gc2VjdGlvbi4KLSAgICAgVGhlIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGFzIHdlYWssIHNvIHRoYXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgYXJlIHBlcm1pdHRlZC4gIFRoZSBHTlUgbGlua2VyIGV4dGVuc2lvbiBpcyB0byBhY3R1YWxseSBkaXNjYXJkCi0gICAgIGFsbCBidXQgb25lIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmIChzdHJuY21wIChuYW1lLCAiLmdudS5saW5rb25jZSIsIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0LCBmbGFncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBwaGRycyB0byBzZWUgaWYgd2UgbmVlZCB0byBhZGp1c3QgdGhlIGxtYS4KLSAgICAgICAgIElmIGFsbCB0aGUgcF9wYWRkciBmaWVsZHMgYXJlIHplcm8sIHdlIGlnbm9yZSB0aGVtLCBzaW5jZQotICAgICAgICAgc29tZSBFTEYgbGlua2VycyBwcm9kdWNlIHN1Y2ggb3V0cHV0LiAgKi8KLSAgICAgIHBoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotICAgICAgZm9yIChpID0gMDsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOyBpKyssIHBoZHIrKykKLQl7Ci0JICBpZiAocGhkci0+cF9wYWRkciAhPSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBpZiAoaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtKQotCXsKLQkgIHBoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotCSAgZm9yIChpID0gMDsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOyBpKyssIHBoZHIrKykKLQkgICAgewotCSAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRAotCQkgICYmIHBoZHItPnBfdmFkZHIgIT0gcGhkci0+cF9wYWRkcgotCQkgICYmIHBoZHItPnBfdmFkZHIgPD0gaGRyLT5zaF9hZGRyCi0JCSAgJiYgKHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6Ci0JCSAgICAgID49IGhkci0+c2hfYWRkciArIGhkci0+c2hfc2l6ZSkKLQkJICAmJiAoKGZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkJICAgICAgfHwgKHBoZHItPnBfb2Zmc2V0IDw9IChiZmRfdm1hKSBoZHItPnNoX29mZnNldAotCQkJICAmJiAocGhkci0+cF9vZmZzZXQgKyBwaGRyLT5wX2ZpbGVzegotCQkJICAgICAgPj0gaGRyLT5zaF9vZmZzZXQgKyBoZHItPnNoX3NpemUpKSkpCi0JCXsKLQkJICBuZXdzZWN0LT5sbWEgKz0gcGhkci0+cF9wYWRkciAtIHBoZHItPnBfdmFkZHI7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaGRyLT5iZmRfc2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKG5ld3NlY3QpLT50aGlzX2hkciA9ICpoZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9lbGZfZmluZF9zZWN0aW9uCi0KLVNZTk9QU0lTCi0Jc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICpiZmRfZWxmX2ZpbmRfc2VjdGlvbiAoYmZkICphYmZkLCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlIZWxwZXIgZnVuY3Rpb25zIGZvciBHREIgdG8gbG9jYXRlIHRoZSBzdHJpbmcgdGFibGVzLgotCVNpbmNlIEJGRCBoaWRlcyBzdHJpbmcgdGFibGVzIGZyb20gY2FsbGVycywgR0RCIG5lZWRzIHRvIHVzZSBhbgotCWludGVybmFsIGhvb2sgdG8gZmluZCB0aGVtLiAgU3VuJ3MgLnN0YWJzdHIsIGluIHBhcnRpY3VsYXIsCi0JaXNuJ3QgZXZlbiBwb2ludGVkIHRvIGJ5IHRoZSAuc3RhYiBzZWN0aW9uLCBzbyBvcmRpbmFyeQotCW1lY2hhbmlzbXMgd291bGRuJ3Qgd29yayB0byBmaW5kIGl0LCBldmVuIGlmIHdlIGhhZCBzb21lLgotKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICoKLWJmZF9lbGZfZmluZF9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7Ci0gIGNoYXIgKnNoc3RydGFiOwotICB1bnNpZ25lZCBpbnQgbWF4OwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLSAgaWYgKGlfc2hkcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaHN0cnRhYiA9IGJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uCi0JKGFiZmQsIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4KTsKLSAgICAgIGlmIChzaHN0cnRhYiAhPSBOVUxMKQotCXsKLQkgIG1heCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotCSAgZm9yIChpID0gMTsgaSA8IG1heDsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoJnNoc3RydGFiW2lfc2hkcnBbaV0tPnNoX25hbWVdLCBuYW1lKSkKLQkgICAgICByZXR1cm4gaV9zaGRycFtpXTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotY29uc3QgY2hhciAqY29uc3QgYmZkX2VsZl9zZWN0aW9uX3R5cGVfbmFtZXNbXSA9IHsKLSAgIlNIVF9OVUxMIiwgIlNIVF9QUk9HQklUUyIsICJTSFRfU1lNVEFCIiwgIlNIVF9TVFJUQUIiLAotICAiU0hUX1JFTEEiLCAiU0hUX0hBU0giLCAiU0hUX0RZTkFNSUMiLCAiU0hUX05PVEUiLAotICAiU0hUX05PQklUUyIsICJTSFRfUkVMIiwgIlNIVF9TSExJQiIsICJTSFRfRFlOU1lNIiwKLX07Ci0KLS8qIEVMRiByZWxvY3MgYXJlIGFnYWluc3Qgc3ltYm9scy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlCi0gICBvdXRwdXQsIGFuZCB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nCi0gICBoYXMgZ2l2ZW4gdXMgYW55IGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbwotICAgYmUgYWdhaW5zdCB0aGUgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0bwotICAgY2hhbmdlIGFueXRoaW5nIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwKLSAgIGFsbCBiZSBkb25lIGF0IGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZQotICAgaW50byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQwKLS8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgZmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmFyZzsKLXsKLSAgRklMRSAqZiA9IChGSUxFICopIGZhcmc7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKmR5bmJ1ZiA9IE5VTEw7Ci0KLSAgcCA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGksIGM7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuUHJvZ3JhbSBIZWFkZXI6XG4iKSk7Ci0gICAgICBjID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrLCBwKyspCi0JewotCSAgY29uc3QgY2hhciAqczsKLQkgIGNoYXIgYnVmWzIwXTsKLQotCSAgc3dpdGNoIChwLT5wX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBQVF9OVUxMOiBzID0gIk5VTEwiOyBicmVhazsKLQkgICAgY2FzZSBQVF9MT0FEOiBzID0gIkxPQUQiOyBicmVhazsKLQkgICAgY2FzZSBQVF9EWU5BTUlDOiBzID0gIkRZTkFNSUMiOyBicmVhazsKLQkgICAgY2FzZSBQVF9JTlRFUlA6IHMgPSAiSU5URVJQIjsgYnJlYWs7Ci0JICAgIGNhc2UgUFRfTk9URTogcyA9ICJOT1RFIjsgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU0hMSUI6IHMgPSAiU0hMSUIiOyBicmVhazsKLQkgICAgY2FzZSBQVF9QSERSOiBzID0gIlBIRFIiOyBicmVhazsKLQkgICAgZGVmYXVsdDogc3ByaW50ZiAoYnVmLCAiMHglbHgiLCBwLT5wX3R5cGUpOyBzID0gYnVmOyBicmVhazsKLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIiU4cyBvZmYgICAgMHgiLCBzKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX29mZnNldCk7Ci0JICBmcHJpbnRmIChmLCAiIHZhZGRyIDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF92YWRkcik7Ci0JICBmcHJpbnRmIChmLCAiIHBhZGRyIDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9wYWRkcik7Ci0JICBmcHJpbnRmIChmLCAiIGFsaWduIDIqKiV1XG4iLCBiZmRfbG9nMiAocC0+cF9hbGlnbikpOwotCSAgZnByaW50ZiAoZiwgIiAgICAgICAgIGZpbGVzeiAweCIpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfZmlsZXN6KTsKLQkgIGZwcmludGYgKGYsICIgbWVtc3ogMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX21lbXN6KTsKLQkgIGZwcmludGYgKGYsICIgZmxhZ3MgJWMlYyVjIiwKLQkJICAgKHAtPnBfZmxhZ3MgJiBQRl9SKSAhPSAwID8gJ3InIDogJy0nLAotCQkgICAocC0+cF9mbGFncyAmIFBGX1cpICE9IDAgPyAndycgOiAnLScsCi0JCSAgIChwLT5wX2ZsYWdzICYgUEZfWCkgIT0gMCA/ICd4JyA6ICctJyk7Ci0JICBpZiAoKHAtPnBfZmxhZ3MgJn4gKFBGX1IgfCBQRl9XIHwgUEZfWCkpICE9IDApCi0JICAgIGZwcmludGYgKGYsICIgJWx4IiwgcC0+cF9mbGFncyAmfiAoUEZfUiB8IFBGX1cgfCBQRl9YKSk7Ci0JICBmcHJpbnRmIChmLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGVsZnNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGluazsKLSAgICAgIGJmZF9ieXRlICpleHRkeW4sICpleHRkeW5lbmQ7Ci0gICAgICBzaXplX3QgZXh0ZHluc2l6ZTsKLSAgICAgIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuRHluYW1pYyBTZWN0aW9uOlxuIikpOwotCi0gICAgICBkeW5idWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAocy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChkeW5idWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKFBUUikgZHluYnVmLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgcy0+X3Jhd19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLSAgICAgIGlmIChlbGZzZWMgPT0gLTEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCi0gICAgICBleHRkeW5zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZHluOwotICAgICAgc3dhcF9keW5faW4gPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnN3YXBfZHluX2luOwotCi0gICAgICBleHRkeW4gPSBkeW5idWY7Ci0gICAgICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemU7Ci0gICAgICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4gKz0gZXh0ZHluc2l6ZSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGFiWzIwXTsKLQkgIGJvb2xlYW4gc3RyaW5ncDsKLQotCSAgKCpzd2FwX2R5bl9pbikgKGFiZmQsIChQVFIpIGV4dGR5biwgJmR5bik7Ci0KLQkgIGlmIChkeW4uZF90YWcgPT0gRFRfTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIHN0cmluZ3AgPSBmYWxzZTsKLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc3ByaW50ZiAoYWIsICIweCVseCIsICh1bnNpZ25lZCBsb25nKSBkeW4uZF90YWcpOwotCSAgICAgIG5hbWUgPSBhYjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX05FRURFRDogbmFtZSA9ICJORUVERUQiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiUExUUkVMU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6IG5hbWUgPSAiUExUR09UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSEFTSDogbmFtZSA9ICJIQVNIIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1RSVEFCOiBuYW1lID0gIlNUUlRBQiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTVRBQjogbmFtZSA9ICJTWU1UQUIiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBOiBuYW1lID0gIlJFTEEiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBU1o6IG5hbWUgPSAiUkVMQVNaIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMQUVOVDogbmFtZSA9ICJSRUxBRU5UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1RSU1o6IG5hbWUgPSAiU1RSU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TWU1FTlQ6IG5hbWUgPSAiU1lNRU5UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSU5JVDogbmFtZSA9ICJJTklUIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfRklOSTogbmFtZSA9ICJGSU5JIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU09OQU1FOiBuYW1lID0gIlNPTkFNRSI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9SUEFUSDogbmFtZSA9ICJSUEFUSCI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9TWU1CT0xJQzogbmFtZSA9ICJTWU1CT0xJQyI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTDogbmFtZSA9ICJSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxTWjogbmFtZSA9ICJSRUxTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEVOVDogbmFtZSA9ICJSRUxFTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUw6IG5hbWUgPSAiUExUUkVMIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfREVCVUc6IG5hbWUgPSAiREVCVUciOyBicmVhazsKLQkgICAgY2FzZSBEVF9URVhUUkVMOiBuYW1lID0gIlRFWFRSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6IG5hbWUgPSAiSk1QUkVMIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfQVVYSUxJQVJZOiBuYW1lID0gIkFVWElMSUFSWSI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9GSUxURVI6IG5hbWUgPSAiRklMVEVSIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUlNZTTogbmFtZSA9ICJWRVJTWU0iOyBicmVhazsKLQkgICAgY2FzZSBEVF9WRVJERUY6IG5hbWUgPSAiVkVSREVGIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSREVGTlVNOiBuYW1lID0gIlZFUkRFRk5VTSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUk5FRUQ6IG5hbWUgPSAiVkVSTkVFRCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUk5FRUROVU06IG5hbWUgPSAiVkVSTkVFRE5VTSI7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGZwcmludGYgKGYsICIgICUtMTFzICIsIG5hbWUpOwotCSAgaWYgKCEgc3RyaW5ncCkKLQkgICAgZnByaW50ZiAoZiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIGR5bi5kX3VuLmRfdmFsKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotCSAgICAgIHN0cmluZyA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkJZHluLmRfdW4uZF92YWwpOwotCSAgICAgIGlmIChzdHJpbmcgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnByaW50ZiAoZiwgIiVzIiwgc3RyaW5nKTsKLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIlxuIik7Ci0JfQotCi0gICAgICBmcmVlIChkeW5idWYpOwotICAgICAgZHluYnVmID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9PSBOVUxMKQotICAgICAgfHwgKGVsZl9keW52ZXJyZWYgKGFiZmQpICE9IDAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnQ7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuVmVyc2lvbiBkZWZpbml0aW9uczpcbiIpKTsKLSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dmRfbmV4dGRlZikKLQl7Ci0JICBmcHJpbnRmIChmLCAiJWQgMHglMi4yeCAweCU4LjhseCAlc1xuIiwgdC0+dmRfbmR4LAotCQkgICB0LT52ZF9mbGFncywgdC0+dmRfaGFzaCwgdC0+dmRfbm9kZW5hbWUpOwotCSAgaWYgKHQtPnZkX2F1eHB0ci0+dmRhX25leHRwdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICphOwotCi0JICAgICAgZnByaW50ZiAoZiwgIlx0Iik7Ci0JICAgICAgZm9yIChhID0gdC0+dmRfYXV4cHRyLT52ZGFfbmV4dHB0cjsKLQkJICAgYSAhPSBOVUxMOwotCQkgICBhID0gYS0+dmRhX25leHRwdHIpCi0JCWZwcmludGYgKGYsICIlcyAiLCBhLT52ZGFfbm9kZW5hbWUpOwotCSAgICAgIGZwcmludGYgKGYsICJcbiIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5WZXJzaW9uIFJlZmVyZW5jZXM6XG4iKSk7Ci0gICAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7IHQgIT0gTlVMTDsgdCA9IHQtPnZuX25leHRyZWYpCi0JewotCSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkgIGZwcmludGYgKGYsIF8oIiAgcmVxdWlyZWQgZnJvbSAlczpcbiIpLCB0LT52bl9maWxlbmFtZSk7Ci0JICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCSAgICBmcHJpbnRmIChmLCAiICAgIDB4JTguOGx4IDB4JTIuMnggJTIuMmQgJXNcbiIsIGEtPnZuYV9oYXNoLAotCQkgICAgIGEtPnZuYV9mbGFncywgYS0+dm5hX290aGVyLCBhLT52bmFfbm9kZW5hbWUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChkeW5idWYgIT0gTlVMTCkKLSAgICBmcmVlIChkeW5idWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERpc3BsYXkgRUxGLXNwZWNpZmljIGZpZWxkcyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLWJmZF9lbGZfcHJpbnRfc3ltYm9sIChhYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgImVsZiAiKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIHN5bWJvbC0+ZmxhZ3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWU7Ci0JQ09OU1QgY2hhciAqbmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQkKLQlzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPyBzeW1ib2wtPnNlY3Rpb24tPm5hbWUgOiAiKCpub25lKikiOwotCi0JYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCWlmIChiZWQtPmVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwpCi0JICAgIG5hbWUgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbCkgKGFiZmQsIGZpbGVwLCBzeW1ib2wpOwotCi0JaWYgKG5hbWUgPT0gTlVMTCkKLQkgIHsKLQkgICAgbmFtZSA9IHN5bWJvbC0+bmFtZTsgIAotCSAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCSAgfQotCi0JZnByaW50ZiAoZmlsZSwgIiAlc1x0Iiwgc2VjdGlvbl9uYW1lKTsKLQkvKiBQcmludCB0aGUgIm90aGVyIiB2YWx1ZSBmb3IgYSBzeW1ib2wuICBGb3IgY29tbW9uIHN5bWJvbHMsCi0JICAgd2UndmUgYWxyZWFkeSBwcmludGVkIHRoZSBzaXplOyBub3cgcHJpbnQgdGhlIGFsaWdubWVudC4KLQkgICBGb3Igb3RoZXIgc3ltYm9scywgd2UgaGF2ZSBubyBzcGVjaWZpZWQgYWxpZ25tZW50LCBhbmQKLQkgICB3ZSd2ZSBwcmludGVkIHRoZSBhZGRyZXNzOyBub3cgcHJpbnQgdGhlIHNpemUuICAqLwotCWZwcmludGZfdm1hIChmaWxlLAotCQkgICAgIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLQkJICAgICAgPyAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlCi0JCSAgICAgIDogKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplKSk7Ci0KLQkvKiBJZiB3ZSBoYXZlIHZlcnNpb24gaW5mb3JtYXRpb24sIHByaW50IGl0LiAgKi8KLQlpZiAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX3NlY3Rpb24gIT0gMAotCSAgICAmJiAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX3NlY3Rpb24gIT0gMAotCQl8fCBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfc2VjdGlvbiAhPSAwKSkKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHZlcm51bTsKLQkgICAgY29uc3QgY2hhciAqdmVyc2lvbl9zdHJpbmc7Ci0KLQkgICAgdmVybnVtID0gKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+dmVyc2lvbiAmIFZFUlNZTV9WRVJTSU9OOwotCi0JICAgIGlmICh2ZXJudW0gPT0gMCkKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9ICIiOwotCSAgICBlbHNlIGlmICh2ZXJudW0gPT0gMSkKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9ICJCYXNlIjsKLQkgICAgZWxzZSBpZiAodmVybnVtIDw9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzKQotCSAgICAgIHZlcnNpb25fc3RyaW5nID0KLQkJZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmW3Zlcm51bSAtIDFdLnZkX25vZGVuYW1lOwotCSAgICBlbHNlCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotCQl2ZXJzaW9uX3N0cmluZyA9ICIiOwotCQlmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7Ci0JCSAgICAgdCAhPSBOVUxMOwotCQkgICAgIHQgPSB0LT52bl9uZXh0cmVmKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0JCSAgICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgICAgICB7Ci0JCQlpZiAoYS0+dm5hX290aGVyID09IHZlcm51bSkKLQkJCSAgewotCQkJICAgIHZlcnNpb25fc3RyaW5nID0gYS0+dm5hX25vZGVuYW1lOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmICgoKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+dmVyc2lvbiAmIFZFUlNZTV9ISURERU4pID09IDApCi0JICAgICAgZnByaW50ZiAoZmlsZSwgIiAgJS0xMXMiLCB2ZXJzaW9uX3N0cmluZyk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBpOwotCi0JCWZwcmludGYgKGZpbGUsICIgKCVzKSIsIHZlcnNpb25fc3RyaW5nKTsKLQkJZm9yIChpID0gMTAgLSBzdHJsZW4gKHZlcnNpb25fc3RyaW5nKTsgaSA+IDA7IC0taSkKLQkJICBwdXRjICgnICcsIGZpbGUpOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIElmIHRoZSBzdF9vdGhlciBmaWVsZCBpcyBub3QgemVybywgcHJpbnQgaXQuICAqLwotCWlmICgoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyICE9IDApCi0JICBmcHJpbnRmIChmaWxlLCAiIDB4JTAyeCIsCi0JCSAgICgodW5zaWduZWQgaW50KQotCQkgICAgKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcikpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlcyIsIG5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT5zaXplID0gMDsKLSAgICAgIHJldC0+ZHluaW5keCA9IC0xOwotICAgICAgcmV0LT5keW5zdHJfaW5kZXggPSAwOwotICAgICAgcmV0LT53ZWFrZGVmID0gTlVMTDsKLSAgICAgIHJldC0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlciA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci0gICAgICByZXQtPnZlcmluZm8udmVyZGVmID0gTlVMTDsKLSAgICAgIHJldC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9IE5VTEw7Ci0gICAgICByZXQtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSAwOwotICAgICAgcmV0LT52dGFibGVfcGFyZW50ID0gTlVMTDsKLSAgICAgIHJldC0+dHlwZSA9IFNUVF9OT1RZUEU7Ci0gICAgICByZXQtPm90aGVyID0gMDsKLSAgICAgIC8qIEFzc3VtZSB0aGF0IHdlIGhhdmUgYmVlbiBjYWxsZWQgYnkgYSBub24tRUxGIHN5bWJvbCByZWFkZXIuCi0gICAgICAgICBUaGlzIGZsYWcgaXMgdGhlbiByZXNldCBieSB0aGUgY29kZSB3aGljaCByZWFkcyBhbiBFTEYgaW5wdXQKLSAgICAgICAgIGZpbGUuICBUaGlzIGVuc3VyZXMgdGhhdCBhIHN5bWJvbCBjcmVhdGVkIGJ5IGEgbm9uLUVMRiBzeW1ib2wKLSAgICAgICAgIHJlYWRlciB3aWxsIGhhdmUgdGhlIGZsYWcgc2V0IGNvcnJlY3RseS4gICovCi0gICAgICByZXQtPmVsZl9saW5rX2hhc2hfZmxhZ3MgPSBFTEZfTElOS19OT05fRUxGOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IGZhbHNlOwotICB0YWJsZS0+ZHlub2JqID0gTlVMTDsKLSAgLyogVGhlIGZpcnN0IGR5bmFtaWMgc3ltYm9sIGlzIGEgZHVtbXkuICAqLwotICB0YWJsZS0+ZHluc3ltY291bnQgPSAxOwotICB0YWJsZS0+ZHluc3RyID0gTlVMTDsKLSAgdGFibGUtPmJ1Y2tldGNvdW50ID0gMDsKLSAgdGFibGUtPm5lZWRlZCA9IE5VTEw7Ci0gIHRhYmxlLT5oZ290ID0gTlVMTDsKLSAgdGFibGUtPnN0YWJfaW5mbyA9IE5VTEw7Ci0gIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0IChyZXQsIGFiZmQsIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogVGhpcyBpcyBhIGhvb2sgZm9yIHRoZSBFTEYgZW11bGF0aW9uIGNvZGUgaW4gdGhlIGdlbmVyaWMgbGlua2VyIHRvCi0gICB0ZWxsIHRoZSBiYWNrZW5kIGxpbmtlciB3aGF0IGZpbGUgbmFtZSB0byB1c2UgZm9yIHRoZSBEVF9ORUVERUQKLSAgIGVudHJ5IGZvciBhIGR5bmFtaWMgb2JqZWN0LiAgVGhlIGdlbmVyaWMgbGlua2VyIHBhc3NlcyBuYW1lIGFzIGFuCi0gICBlbXB0eSBzdHJpbmcgdG8gaW5kaWNhdGUgdGhhdCBubyBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGJlIG1hZGUuICAqLwotCi12b2lkCi1iZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgICBlbGZfZHRfbmFtZSAoYWJmZCkgPSBuYW1lOwotfQotCi0vKiBHZXQgdGhlIGxpc3Qgb2YgRFRfTkVFREVEIGVudHJpZXMgZm9yIGEgbGluay4gIFRoaXMgaXMgYSBob29rIGZvcgotICAgdGhlIGxpbmtlciBFTEYgZW11bGF0aW9uIGNvZGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKgotYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgYWN0dWFsbHkgdXNlZCBmb3IgYSBkeW5hbWljIG9iamVjdCBmb3IgYSBsaW5rLiAgVGhpcwotICAgaXMgdGhlIFNPTkFNRSBlbnRyeSBpZiB0aGVyZSBpcyBvbmUuICBPdGhlcndpc2UsIGl0IGlzIHRoZSBzdHJpbmcKLSAgIHBhc3NlZCB0byBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSwgb3IgaXQgaXMgdGhlIGZpbGVuYW1lLiAgKi8KLQotY29uc3QgY2hhciAqCi1iZmRfZWxmX2dldF9kdF9zb25hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIGVsZl9kdF9uYW1lIChhYmZkKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdldCB0aGUgbGlzdCBvZiBEVF9ORUVERUQgZW50cmllcyBmcm9tIGEgQkZELiAgVGhpcyBpcyBhIGhvb2sgZm9yCi0gICB0aGUgRUxGIGxpbmtlciBlbXVsYXRpb24gY29kZS4gICovCi0KLWJvb2xlYW4KLWJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCAoYWJmZCwgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKipwbmVlZGVkOwotewotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKmR5bmJ1ZiA9IE5VTEw7Ci0gIGludCBlbGZzZWM7Ci0gIHVuc2lnbmVkIGxvbmcgbGluazsKLSAgYmZkX2J5dGUgKmV4dGR5biwgKmV4dGR5bmVuZDsKLSAgc2l6ZV90IGV4dGR5bnNpemU7Ci0gIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0KLSAgKnBuZWVkZWQgPSBOVUxMOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwgfHwgcy0+X3Jhd19zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHluYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChkeW5idWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIChQVFIpIGR5bmJ1ZiwgKGZpbGVfcHRyKSAwLAotCQkJCSAgcy0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotICBpZiAoZWxmc2VjID09IC0xKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLSAgZXh0ZHluc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2R5bjsKLSAgc3dhcF9keW5faW4gPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnN3YXBfZHluX2luOwotCi0gIGV4dGR5biA9IGR5bmJ1ZjsKLSAgZXh0ZHluZW5kID0gZXh0ZHluICsgcy0+X3Jhd19zaXplOwotICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4gKz0gZXh0ZHluc2l6ZSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQotICAgICAgKCpzd2FwX2R5bl9pbikgKGFiZmQsIChQVFIpIGV4dGR5biwgJmR5bik7Ci0KLSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfTlVMTCkKLQlicmVhazsKLQotICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQpCi0JewotCSAgY29uc3QgY2hhciAqc3RyaW5nOwotCSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0JICBzdHJpbmcgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAotCQkJCQkJICAgIGR5bi5kX3VuLmRfdmFsKTsKLQkgIGlmIChzdHJpbmcgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGwgPSAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICpsKTsKLQkgIGlmIChsID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBsLT5ieSA9IGFiZmQ7Ci0JICBsLT5uYW1lID0gc3RyaW5nOwotCSAgbC0+bmV4dCA9ICpwbmVlZGVkOwotCSAgKnBuZWVkZWQgPSBsOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAoZHluYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEFsbG9jYXRlIGFuIEVMRiBzdHJpbmcgdGFibGUtLWZvcmNlIHRoZSBmaXJzdCBieXRlIHRvIGJlIHplcm8uICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpCi17Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnJldDsKLQotICByZXQgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsb2M7Ci0KLSAgICAgIGxvYyA9IF9iZmRfc3RyaW5ndGFiX2FkZCAocmV0LCAiIiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgQkZEX0FTU0VSVCAobG9jID09IDAgfHwgbG9jID09IChiZmRfc2l6ZV90eXBlKSAtMSk7Ci0gICAgICBpZiAobG9jID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQl7Ci0JICBfYmZkX3N0cmluZ3RhYl9mcmVlIChyZXQpOwotCSAgcmV0ID0gTlVMTDsKLQl9Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotDAotLyogRUxGIC5vL2V4ZWMgZmlsZSByZWFkaW5nICovCi0KLS8qIENyZWF0ZSBhIG5ldyBiZmQgc2VjdGlvbiBmcm9tIGFuIEVMRiBzZWN0aW9uIGhlYWRlci4gKi8KLQotYm9vbGVhbgotYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBzaGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaGluZGV4OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XTsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmVoZHIgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgY2hhciAqbmFtZTsKLQotICBuYW1lID0gZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIgKGFiZmQsIGhkci0+c2hfbmFtZSk7Ci0KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX05VTEw6Ci0gICAgICAvKiBJbmFjdGl2ZSBzZWN0aW9uLiBUaHJvdyBpdCBhd2F5LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSBTSFRfUFJPR0JJVFM6CS8qIE5vcm1hbCBzZWN0aW9uIHdpdGggY29udGVudHMuICAqLwotICAgIGNhc2UgU0hUX0RZTkFNSUM6CS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgY2FzZSBTSFRfTk9CSVRTOgkvKiAuYnNzIHNlY3Rpb24uICAqLwotICAgIGNhc2UgU0hUX0hBU0g6CS8qIC5oYXNoIHNlY3Rpb24uICAqLwotICAgIGNhc2UgU0hUX05PVEU6CS8qIC5ub3RlIHNlY3Rpb24uICAqLwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLSAgICBjYXNlIFNIVF9TWU1UQUI6CQkvKiBBIHN5bWJvbCB0YWJsZSAqLwotICAgICAgaWYgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IHNoaW5kZXgpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfZW50c2l6ZSA9PSBiZWQtPnMtPnNpemVvZl9zeW0pOwotICAgICAgQkZEX0FTU0VSVCAoZWxmX29uZXN5bXRhYiAoYWJmZCkgPT0gMCk7Ci0gICAgICBlbGZfb25lc3ltdGFiIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyID0gKmhkcjsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gICAgICAvKiBTb21ldGltZXMgYSBzaGFyZWQgb2JqZWN0IHdpbGwgbWFwIGluIHRoZSBzeW1ib2wgdGFibGUuICBJZgotICAgICAgICAgU0hGX0FMTE9DIGlzIHNldCwgYW5kIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCB0aGVuIHdlIGFsc28KLSAgICAgICAgIHRyZWF0IHRoaXMgc2VjdGlvbiBhcyBhIEJGRCBzZWN0aW9uLiAgV2UgY2FuIG5vdCBiYXNlIHRoZQotICAgICAgICAgZGVjaXNpb24gcHVyZWx5IG9uIFNIRl9BTExPQywgYmVjYXVzZSB0aGF0IGZsYWcgaXMgc29tZXRpbWVzCi0gICAgICAgICBzZXQgaW4gYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdGhlCi0gICAgICAgICBsaW5rZXIuICAqLwotICAgICAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JICAmJiAhIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgU0hUX0RZTlNZTToJCS8qIEEgZHluYW1pYyBzeW1ib2wgdGFibGUgKi8KLSAgICAgIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSBzaGluZGV4KQotCXJldHVybiB0cnVlOwotCi0gICAgICBCRkRfQVNTRVJUIChoZHItPnNoX2VudHNpemUgPT0gYmVkLT5zLT5zaXplb2Zfc3ltKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApOwotICAgICAgZWxmX2R5bnN5bXRhYiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkciA9ICpoZHI7Ci0gICAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICAgICAgLyogQmVzaWRlcyBiZWluZyBhIHN5bWJvbCB0YWJsZSwgd2UgYWxzbyB0cmVhdCB0aGlzIGFzIGEgcmVndWxhcgotCSBzZWN0aW9uLCBzbyB0aGF0IG9iamNvcHkgY2FuIGhhbmRsZSBpdC4gICovCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1NUUlRBQjoJCS8qIEEgc3RyaW5nIHRhYmxlICovCi0gICAgICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotCXJldHVybiB0cnVlOwotICAgICAgaWYgKGVoZHItPmVfc2hzdHJuZHggPT0gc2hpbmRleCkKLQl7Ci0JICBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIgPSAqaGRyOwotCSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHI7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgZWhkci0+ZV9zaG51bTsgaSsrKQotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyMiA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaV07Ci0JICAgIGlmIChoZHIyLT5zaF9saW5rID09IHNoaW5kZXgpCi0JICAgICAgewotCQlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IGkpCi0JCSAgewotCQkgICAgZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkciA9ICpoZHI7Ci0JCSAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0KLQkJICAgICAgJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJICB9Ci0JCWlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSBpKQotCQkgIHsKLQkJICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnN0cnRhYl9oZHIgPSAqaGRyOwotCQkgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkciA9Ci0JCSAgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zdHJ0YWJfaGRyOwotCQkgICAgLyogV2UgYWxzbyB0cmVhdCB0aGlzIGFzIGEgcmVndWxhciBzZWN0aW9uLCBzbwotCQkgICAgICAgdGhhdCBvYmpjb3B5IGNhbiBoYW5kbGUgaXQuICAqLwotCQkgICAgYnJlYWs7Ci0JCSAgfQotI2lmIDAgLyogTm90IGhhbmRsaW5nIG90aGVyIHN0cmluZyB0YWJsZXMgc3BlY2lhbGx5IHJpZ2h0IG5vdy4gICovCi0JCWhkcjIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2ldOwkvKiBpbiBjYXNlIGl0IG1vdmVkICovCi0JCS8qIFdlIGhhdmUgYSBzdHJ0YWIgZm9yIHNvbWUgcmFuZG9tIG90aGVyIHNlY3Rpb24uICAqLwotCQluZXdzZWN0ID0gKGFzZWN0aW9uICopIGhkcjItPmJmZF9zZWN0aW9uOwotCQlpZiAoIW5ld3NlY3QpCi0JCSAgYnJlYWs7Ci0JCWhkci0+YmZkX3NlY3Rpb24gPSBuZXdzZWN0OwotCQloZHIyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG5ld3NlY3QpLT5zdHJfaGRyOwotCQkqaGRyMiA9ICpoZHI7Ci0JCWVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIyOwotI2VuZGlmCi0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1JFTDoKLSAgICBjYXNlIFNIVF9SRUxBOgotICAgICAgLyogKlRoZXNlKiBkbyBhIGxvdCBvZiB3b3JrIC0tIGJ1dCBidWlsZCBubyBzZWN0aW9ucyEgICovCi0gICAgICB7Ci0JYXNlY3Rpb24gKnRhcmdldF9zZWN0OwotCUVsZl9JbnRlcm5hbF9TaGRyICpoZHIyOwotCi0JLyogQ2hlY2sgZm9yIGEgYm9ndXMgbGluayB0byBhdm9pZCBjcmFzaGluZy4gICovCi0JaWYgKGhkci0+c2hfbGluayA+PSBlaGRyLT5lX3NobnVtKQotCSAgewotCSAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAoXygiJXM6IGludmFsaWQgbGluayAlbHUgZm9yIHJlbG9jIHNlY3Rpb24gJXMgKGluZGV4ICV1KSIpLAotCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBoZHItPnNoX2xpbmssIG5hbWUsIHNoaW5kZXgpKTsKLQkgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0JICB9Ci0KLQkvKiBGb3Igc29tZSBpbmNvbXByZWhlbnNpYmxlIHJlYXNvbiBPcmFjbGUgZGlzdHJpYnV0ZXMKLQkgICBsaWJyYXJpZXMgZm9yIFNvbGFyaXMgaW4gd2hpY2ggc29tZSBvZiB0aGUgb2JqZWN0cyBoYXZlCi0JICAgYm9ndXMgc2hfbGluayBmaWVsZHMuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGp1c3QKLQkgICByZWplY3QgdGhlbSwgYnV0LCB1bmZvcnR1bmF0ZWx5LCBzb21lIHBlb3BsZSBuZWVkIHRvIHVzZQotCSAgIHRoZW0uICBXZSBzY2FuIHRocm91Z2ggdGhlIHNlY3Rpb24gaGVhZGVyczsgaWYgd2UgZmluZCBvbmx5Ci0JICAgb25lIHN1aXRhYmxlIHN5bWJvbCB0YWJsZSwgd2UgY2xvYmJlciB0aGUgc2hfbGluayB0byBwb2ludAotCSAgIHRvIGl0LiAgSSBob3BlIHRoaXMgZG9lc24ndCBicmVhayBhbnl0aGluZy4gICovCi0JaWYgKGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCCi0JICAgICYmIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfRFlOU1lNKQotCSAgewotCSAgICBpbnQgc2NhbjsKLQkgICAgaW50IGZvdW5kOwotCi0JICAgIGZvdW5kID0gMDsKLQkgICAgZm9yIChzY2FuID0gMTsgc2NhbiA8IGVoZHItPmVfc2hudW07IHNjYW4rKykKLQkgICAgICB7Ci0JCWlmIChlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NjYW5dLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLQkJICAgIHx8IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2Nhbl0tPnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkKLQkJICB7Ci0JCSAgICBpZiAoZm91bmQgIT0gMCkKLQkJICAgICAgewotCQkJZm91bmQgPSAwOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGZvdW5kID0gc2NhbjsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoZm91bmQgIT0gMCkKLQkgICAgICBoZHItPnNoX2xpbmsgPSBmb3VuZDsKLQkgIH0KLQotCS8qIEdldCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQlpZiAoZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLQkgICAgJiYgISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfbGluaykpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBJZiB0aGlzIHJlbG9jIHNlY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBtYWluIHN5bWJvbCB0YWJsZSB3ZQotCSAgIGRvbid0IHRyZWF0IGl0IGFzIGEgcmVsb2Mgc2VjdGlvbi4gIEJGRCBjYW4ndCBhZGVxdWF0ZWx5Ci0JICAgcmVwcmVzZW50IHN1Y2ggYSBzZWN0aW9uLCBzbyBhdCBsZWFzdCBmb3Igbm93LCB3ZSBkb24ndAotCSAgIHRyeS4gIFdlIGp1c3QgcHJlc2VudCBpdCBhcyBhIG5vcm1hbCBzZWN0aW9uLiAgKi8KLQlpZiAoaGRyLT5zaF9saW5rICE9IGVsZl9vbmVzeW10YWIgKGFiZmQpKQotCSAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLQlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfaW5mbykpCi0JICByZXR1cm4gZmFsc2U7Ci0JdGFyZ2V0X3NlY3QgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaGRyLT5zaF9pbmZvKTsKLQlpZiAodGFyZ2V0X3NlY3QgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQotCWlmICgodGFyZ2V0X3NlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICAgIHx8IHRhcmdldF9zZWN0LT5yZWxvY19jb3VudCA9PSAwKQotCSAgaGRyMiA9ICZlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHI7Ci0JZWxzZQotCSAgewotCSAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID09IE5VTEwpOwotCSAgICBoZHIyID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaGRyMikpOwotCSAgICBlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID0gaGRyMjsKLQkgIH0KLQkqaGRyMiA9ICpoZHI7Ci0JZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkcjI7Ci0JdGFyZ2V0X3NlY3QtPnJlbG9jX2NvdW50ICs9IGhkci0+c2hfc2l6ZSAvIGhkci0+c2hfZW50c2l6ZTsKLQl0YXJnZXRfc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCXRhcmdldF9zZWN0LT5yZWxvY2F0aW9uID0gTlVMTDsKLQl0YXJnZXRfc2VjdC0+cmVsX2ZpbGVwb3MgPSBoZHItPnNoX29mZnNldDsKLQkvKiBJbiB0aGUgc2VjdGlvbiB0byB3aGljaCB0aGUgcmVsb2NhdGlvbnMgYXBwbHksIG1hcmsgd2hldGhlcgotCSAgIGl0cyByZWxvY2F0aW9ucyBhcmUgb2YgdGhlIFJFTCBvciBSRUxBIHZhcmlldHkuICAqLwotCWVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+dXNlX3JlbGFfcCAKLQkgID0gKGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSk7Ci0JYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotCXJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9HTlVfdmVyZGVmOgotICAgICAgZWxmX2R5bnZlcmRlZiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkciA9ICpoZHI7Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfR05VX3ZlcnN5bToKLSAgICAgIGVsZl9keW52ZXJzeW0gKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9oZHIgPSAqaGRyOwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX0dOVV92ZXJuZWVkOgotICAgICAgZWxmX2R5bnZlcnJlZiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX2hkciA9ICpoZHI7Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfU0hMSUI6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBDaGVjayBmb3IgYW55IHByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLSAgICAgIHsKLQlpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikKLQkgICgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdpdmVuIGFuIEVMRiBzZWN0aW9uIG51bWJlciwgcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgQkZECi0gICBzZWN0aW9uLiAgKi8KLQotYXNlY3Rpb24gKgotYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRleDsKLXsKLSAgQkZEX0FTU0VSVCAoaW5kZXggPiAwICYmIGluZGV4IDwgU0hOX0xPUkVTRVJWRSk7Ci0gIGlmIChpbmRleCA+PSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaW5kZXhdLT5iZmRfc2VjdGlvbjsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2RhdGE7Ci0KLSAgc2RhdGEgPSAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKnNkYXRhKSk7Ci0gIGlmICghc2RhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWMtPnVzZWRfYnlfYmZkID0gKFBUUikgc2RhdGE7Ci0KLSAgLyogSW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzZWN0aW9uIHNob3VsZCB1c2UgUkVMQSByZWxvY2F0aW9ucy4gICovCi0gIHNkYXRhLT51c2VfcmVsYV9wIAotICAgID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5kZWZhdWx0X3VzZV9yZWxhX3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBiZmQgc2VjdGlvbiBmcm9tIGFuIEVMRiBwcm9ncmFtIGhlYWRlci4KLQotICAgU2luY2UgcHJvZ3JhbSBzZWdtZW50cyBoYXZlIG5vIG5hbWVzLCB3ZSBnZW5lcmF0ZSBhIHN5bnRoZXRpYyBuYW1lCi0gICBvZiB0aGUgZm9ybSBzZWdtZW50PE5VTT4sIHdoZXJlIE5VTSBpcyBnZW5lcmFsbHkgdGhlIGluZGV4IGluIHRoZQotICAgcHJvZ3JhbSBoZWFkZXIgdGFibGUuICBGb3Igc2VnbWVudHMgdGhhdCBhcmUgc3BsaXQgKHNlZSBiZWxvdykgd2UKLSAgIGdlbmVyYXRlIHRoZSBuYW1lcyBzZWdtZW50PE5VTT5hIGFuZCBzZWdtZW50PE5VTT5iLgotCi0gICBOb3RlIHRoYXQgc29tZSBwcm9ncmFtIHNlZ21lbnRzIG1heSBoYXZlIGEgZmlsZSBzaXplIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4KLSAgIChsZXNzIHRoYW4pIHRoZSBtZW1vcnkgc2l6ZS4gIEFsbCB0aGlzIG1lYW5zIGlzIHRoYXQgYXQgZXhlY3V0aW9uIHRoZQotICAgc3lzdGVtIG11c3QgYWxsb2NhdGUgdGhlIGFtb3VudCBvZiBtZW1vcnkgc3BlY2lmaWVkIGJ5IHRoZSBtZW1vcnkgc2l6ZSwKLSAgIGJ1dCBvbmx5IGluaXRpYWxpemUgaXQgd2l0aCB0aGUgZmlyc3QgImZpbGUgc2l6ZSIgYnl0ZXMgcmVhZCBmcm9tIHRoZQotICAgZmlsZS4gIFRoaXMgd291bGQgb2NjdXIgZm9yIGV4YW1wbGUsIHdpdGggcHJvZ3JhbSBzZWdtZW50cyBjb25zaXN0aW5nCi0gICBvZiBjb21iaW5lZCBkYXRhK2Jzcy4KLQotICAgVG8gaGFuZGxlIHRoZSBhYm92ZSBzaXR1YXRpb24sIHRoaXMgcm91dGluZSBnZW5lcmF0ZXMgVFdPIGJmZCBzZWN0aW9ucwotICAgZm9yIHRoZSBzaW5nbGUgcHJvZ3JhbSBzZWdtZW50LiAgVGhlIGZpcnN0IGhhcyB0aGUgbGVuZ3RoIHNwZWNpZmllZCBieQotICAgdGhlIGZpbGUgc2l6ZSBvZiB0aGUgc2VnbWVudCwgYW5kIHRoZSBzZWNvbmQgaGFzIHRoZSBsZW5ndGggc3BlY2lmaWVkCi0gICBieSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gc2l6ZXMuICBJbiBlZmZlY3QsIHRoZSBzZWdtZW50IGlzIHNwbGl0Ci0gICBpbnRvIGl0J3MgaW5pdGlhbGl6ZWQgYW5kIHVuaW5pdGlhbGl6ZWQgcGFydHMuCi0KLSAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCB0eXBlbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaGRyOwotICAgICBpbnQgaW5kZXg7Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGVuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lYnVmWzY0XTsKLSAgaW50IHNwbGl0OwotCi0gIHNwbGl0ID0gKChoZHItPnBfbWVtc3ogPiAwKQotCSAgICAmJiAoaGRyLT5wX2ZpbGVzeiA+IDApCi0JICAgICYmIChoZHItPnBfbWVtc3ogPiBoZHItPnBfZmlsZXN6KSk7Ci0gIHNwcmludGYgKG5hbWVidWYsICIlcyVkJXMiLCB0eXBlbmFtZSwgaW5kZXgsIHNwbGl0ID8gImEiIDogIiIpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWVidWYpICsgMSk7Ci0gIGlmICghbmFtZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgbmFtZWJ1Zik7Ci0gIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld3NlY3QtPnZtYSA9IGhkci0+cF92YWRkcjsKLSAgbmV3c2VjdC0+bG1hID0gaGRyLT5wX3BhZGRyOwotICBuZXdzZWN0LT5fcmF3X3NpemUgPSBoZHItPnBfZmlsZXN6OwotICBuZXdzZWN0LT5maWxlcG9zID0gaGRyLT5wX29mZnNldDsKLSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLSAgaWYgKGhkci0+cF90eXBlID09IFBUX0xPQUQpCi0gICAgewotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0gICAgICBpZiAoaGRyLT5wX2ZsYWdzICYgUEZfWCkKLQl7Ci0JICAvKiBGSVhNRTogYWxsIHdlIGtub3duIGlzIHRoYXQgaXQgaGFzIGV4ZWN1dGUgUEVSTUlTU0lPTiwKLQkgICAgIG1heSBiZSBkYXRhLiAqLwotCSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JfQotICAgIH0KLSAgaWYgKCEoaGRyLT5wX2ZsYWdzICYgUEZfVykpCi0gICAgewotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICAgIH0KLQotICBpZiAoc3BsaXQpCi0gICAgewotICAgICAgc3ByaW50ZiAobmFtZWJ1ZiwgIiVzJWRiIiwgdHlwZW5hbWUsIGluZGV4KTsKLSAgICAgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZWJ1ZikgKyAxKTsKLSAgICAgIGlmICghbmFtZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJjcHkgKG5hbWUsIG5hbWVidWYpOwotICAgICAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgICAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuZXdzZWN0LT52bWEgPSBoZHItPnBfdmFkZHIgKyBoZHItPnBfZmlsZXN6OwotICAgICAgbmV3c2VjdC0+bG1hID0gaGRyLT5wX3BhZGRyICsgaGRyLT5wX2ZpbGVzejsKLSAgICAgIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IGhkci0+cF9tZW1zeiAtIGhkci0+cF9maWxlc3o7Ci0gICAgICBpZiAoaGRyLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQl7Ci0JICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBpZiAoaGRyLT5wX2ZsYWdzICYgUEZfWCkKLQkgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JfQotICAgICAgaWYgKCEoaGRyLT5wX2ZsYWdzICYgUEZfVykpCi0JbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotYmZkX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyICpoZHI7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBzd2l0Y2ggKGhkci0+cF90eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX05VTEw6Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgIm51bGwiKTsKLQotICAgIGNhc2UgUFRfTE9BRDoKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAibG9hZCIpOwotCi0gICAgY2FzZSBQVF9EWU5BTUlDOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJkeW5hbWljIik7Ci0KLSAgICBjYXNlIFBUX0lOVEVSUDoKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAiaW50ZXJwIik7Ci0KLSAgICBjYXNlIFBUX05PVEU6Ci0gICAgICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAibm90ZSIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGVsZmNvcmVfcmVhZF9ub3RlcyAoYWJmZCwgaGRyLT5wX29mZnNldCwgaGRyLT5wX2ZpbGVzeikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIFBUX1NITElCOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJzaGxpYiIpOwotCi0gICAgY2FzZSBQVF9QSERSOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJwaGRyIik7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQ2hlY2sgZm9yIGFueSBwcm9jZXNzb3Itc3BlY2lmaWMgcHJvZ3JhbSBzZWdtZW50IHR5cGVzLgotICAgICAgICAgSWYgbm8gaGFuZGxlciBmb3IgdGhlbSwgZGVmYXVsdCB0byBtYWtpbmcgInNlZ21lbnQiIHNlY3Rpb25zLiAqLwotICAgICAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpCi0JcmV0dXJuICgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkcikgKGFiZmQsIGhkciwgaW5kZXgpOwotICAgICAgZWxzZQotCXJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAic2VnbWVudCIpOwotICAgIH0KLX0KLQotLyogSW5pdGlhbGl6ZSBSRUxfSERSLCB0aGUgc2VjdGlvbi1oZWFkZXIgZm9yIG5ldyBzZWN0aW9uLCBjb250YWluaW5nCi0gICByZWxvY2F0aW9ucyBhZ2FpbnN0IEFTRUNULiAgSWYgVVNFX1JFTEFfUCBpcyB0cnVlLCB3ZSB1c2UgUkVMQQotICAgcmVsb2NhdGlvbnM7IG90aGVyd2lzZSwgd2UgdXNlIFJFTCByZWxvY2F0aW9ucy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciAoYWJmZCwgcmVsX2hkciwgYXNlY3QsIHVzZV9yZWxhX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYm9vbGVhbiB1c2VfcmVsYV9wOwotewotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICIucmVsYSIgKyBzdHJsZW4gKGFzZWN0LT5uYW1lKSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzcHJpbnRmIChuYW1lLCAiJXMlcyIsIHVzZV9yZWxhX3AgPyAiLnJlbGEiIDogIi5yZWwiLCBhc2VjdC0+bmFtZSk7Ci0gIHJlbF9oZHItPnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX3Noc3RydGFiIChhYmZkKSwgbmFtZSwKLQkJCQkgICAgICAgdHJ1ZSwgZmFsc2UpOwotICBpZiAocmVsX2hkci0+c2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJlbF9oZHItPnNoX3R5cGUgPSB1c2VfcmVsYV9wID8gU0hUX1JFTEEgOiBTSFRfUkVMOwotICByZWxfaGRyLT5zaF9lbnRzaXplID0gKHVzZV9yZWxhX3AKLQkJCSA/IGJlZC0+cy0+c2l6ZW9mX3JlbGEKLQkJCSA6IGJlZC0+cy0+c2l6ZW9mX3JlbCk7Ci0gIHJlbF9oZHItPnNoX2FkZHJhbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLSAgcmVsX2hkci0+c2hfZmxhZ3MgPSAwOwotICByZWxfaGRyLT5zaF9hZGRyID0gMDsKLSAgcmVsX2hkci0+c2hfc2l6ZSA9IDA7Ci0gIHJlbF9oZHItPnNoX29mZnNldCA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB1cCBhbiBFTEYgaW50ZXJuYWwgc2VjdGlvbiBoZWFkZXIgZm9yIGEgc2VjdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWVsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBhc2VjdCwgZmFpbGVkcHRyYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgUFRSIGZhaWxlZHB0cmFyZzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgYm9vbGVhbiAqZmFpbGVkcHRyID0gKGJvb2xlYW4gKikgZmFpbGVkcHRyYXJnOwotICBFbGZfSW50ZXJuYWxfU2hkciAqdGhpc19oZHI7Ci0KLSAgaWYgKCpmYWlsZWRwdHIpCi0gICAgewotICAgICAgLyogV2UgYWxyZWFkeSBmYWlsZWQ7IGp1c3QgZ2V0IG91dCBvZiB0aGUgYmZkX21hcF9vdmVyX3NlY3Rpb25zCi0gICAgICAgICBsb29wLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT50aGlzX2hkcjsKLQotICB0aGlzX2hkci0+c2hfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9zaHN0cnRhYiAoYWJmZCksCi0JCQkJCQkJICBhc2VjdC0+bmFtZSwKLQkJCQkJCQkgIHRydWUsIGZhbHNlKTsKLSAgaWYgKHRoaXNfaGRyLT5zaF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLSAgICB7Ci0gICAgICAqZmFpbGVkcHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19oZHItPnNoX2ZsYWdzID0gMDsKLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgfHwgYXNlY3QtPnVzZXJfc2V0X3ZtYSkKLSAgICB0aGlzX2hkci0+c2hfYWRkciA9IGFzZWN0LT52bWE7Ci0gIGVsc2UKLSAgICB0aGlzX2hkci0+c2hfYWRkciA9IDA7Ci0KLSAgdGhpc19oZHItPnNoX29mZnNldCA9IDA7Ci0gIHRoaXNfaGRyLT5zaF9zaXplID0gYXNlY3QtPl9yYXdfc2l6ZTsKLSAgdGhpc19oZHItPnNoX2xpbmsgPSAwOwotICB0aGlzX2hkci0+c2hfYWRkcmFsaWduID0gMSA8PCBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyOwotICAvKiBUaGUgc2hfZW50c2l6ZSBhbmQgc2hfaW5mbyBmaWVsZHMgbWF5IGhhdmUgYmVlbiBzZXQgYWxyZWFkeSBieQotICAgICBjb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLiAgKi8KLQotICB0aGlzX2hkci0+YmZkX3NlY3Rpb24gPSBhc2VjdDsKLSAgdGhpc19oZHItPmNvbnRlbnRzID0gTlVMTDsKLQotICAvKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGJhc2VkIG9uIHNlY3Rpb24gbmFtZXMuICAqLwotICBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5keW5zdHIiKSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5oYXNoIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9IQVNIOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9oYXNoX2VudHJ5OwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5keW5zeW0iKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0RZTlNZTTsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5keW5hbWljIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9EWU5BTUlDOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9keW47Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCSAgICYmIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+bWF5X3VzZV9yZWxhX3ApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUkVMQTsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfcmVsYTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLnJlbCIsIDQpID09IDAKLQkgICAmJiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPm1heV91c2VfcmVsX3ApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUkVMOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9yZWw7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5ub3RlIiwgNSkgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9OT1RFOwotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMAotCSAgICYmIHN0cmNtcCAoYXNlY3QtPm5hbWUgKyBzdHJsZW4gKGFzZWN0LT5uYW1lKSAtIDMsICJzdHIiKSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5nbnUudmVyc2lvbiIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfR05VX3ZlcnN5bTsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyc3ltKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZ251LnZlcnNpb25fZCIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfR05VX3ZlcmRlZjsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIC8qIG9iamNvcHkgb3Igc3RyaXAgd2lsbCBjb3B5IG92ZXIgc2hfaW5mbywgYnV0IG1heSBub3Qgc2V0Ci0gICAgICAgICBjdmVyZGVmcy4gIFRoZSBsaW5rZXIgd2lsbCBzZXQgY3ZlcmRlZnMsIGJ1dCBzaF9pbmZvIHdpbGwgYmUKLSAgICAgICAgIHplcm8uICAqLwotICAgICAgaWYgKHRoaXNfaGRyLT5zaF9pbmZvID09IDApCi0JdGhpc19oZHItPnNoX2luZm8gPSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmczsKLSAgICAgIGVsc2UKLQlCRkRfQVNTRVJUIChlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcyA9PSAwCi0JCSAgICB8fCB0aGlzX2hkci0+c2hfaW5mbyA9PSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcyk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmdudS52ZXJzaW9uX3IiKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJuZWVkOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgLyogb2JqY29weSBvciBzdHJpcCB3aWxsIGNvcHkgb3ZlciBzaF9pbmZvLCBidXQgbWF5IG5vdCBzZXQKLSAgICAgICAgIGN2ZXJyZWZzLiAgVGhlIGxpbmtlciB3aWxsIHNldCBjdmVycmVmcywgYnV0IHNoX2luZm8gd2lsbCBiZQotICAgICAgICAgemVyby4gICovCi0gICAgICBpZiAodGhpc19oZHItPnNoX2luZm8gPT0gMCkKLQl0aGlzX2hkci0+c2hfaW5mbyA9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzOwotICAgICAgZWxzZQotCUJGRF9BU1NFUlQgKGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzID09IDAKLQkJICAgIHx8IHRoaXNfaGRyLT5zaF9pbmZvID09IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAmJiAoYXNlY3QtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0gIGVsc2UgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAmJiAoKGFzZWN0LT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKSkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXaG8ga25vd3M/ICAqLwotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0gICAgfQotCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0M7Ci0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfV1JJVEU7Ci0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0NPREUpICE9IDApCi0gICAgdGhpc19oZHItPnNoX2ZsYWdzIHw9IFNIRl9FWEVDSU5TVFI7Ci0KLSAgLyogQ2hlY2sgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucykKLSAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucykgKGFiZmQsIHRoaXNfaGRyLCBhc2VjdCk7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gaGFzIHJlbG9jcywgc2V0IHVwIGEgc2VjdGlvbiBoZWFkZXIgZm9yIHRoZQotICAgICBTSFRfUkVMW0FdIHNlY3Rpb24uICBJZiB0d28gcmVsb2NhdGlvbiBzZWN0aW9ucyBhcmUgcmVxdWlyZWQgZm9yCi0gICAgIHRoaXMgc2VjdGlvbiwgaXQgaXMgdXAgdG8gdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBiYWNrLWVuZCB0bwotICAgICBjcmVhdGUgdGhlIG90aGVyLiAgKi8gCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiAhX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyIChhYmZkLCAKLQkJCQkgICAgJmVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KS0+cmVsX2hkciwKLQkJCQkgICAgYXNlY3QsIAotCQkJCSAgICBlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCktPnVzZV9yZWxhX3ApKQotICAgICpmYWlsZWRwdHIgPSB0cnVlOwotfQotCi0vKiBBc3NpZ24gYWxsIEVMRiBzZWN0aW9uIG51bWJlcnMuICBUaGUgZHVtbXkgZmlyc3Qgc2VjdGlvbiBpcyBoYW5kbGVkIGhlcmUKLSAgIHRvby4gIFRoZSBsaW5rL2luZm8gcG9pbnRlcnMgZm9yIHRoZSBzdGFuZGFyZCBzZWN0aW9uIHR5cGVzIGFyZSBmaWxsZWQKLSAgIGluIGhlcmUgdG9vLCB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hc3NpZ25fc2VjdGlvbl9udW1iZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICp0ID0gZWxmX3RkYXRhIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fbnVtYmVyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgc2VjdGlvbl9udW1iZXIgPSAxOwotCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqZCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyk7Ci0KLSAgICAgIGQtPnRoaXNfaWR4ID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQlkLT5yZWxfaWR4ID0gMDsKLSAgICAgIGVsc2UKLQlkLT5yZWxfaWR4ID0gc2VjdGlvbl9udW1iZXIrKzsKLQotICAgICAgaWYgKGQtPnJlbF9oZHIyKQotCWQtPnJlbF9pZHgyID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICAgIGVsc2UKLQlkLT5yZWxfaWR4MiA9IDA7Ci0gICAgfQotCi0gIHQtPnNoc3RydGFiX3NlY3Rpb24gPSBzZWN0aW9uX251bWJlcisrOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCA9IHQtPnNoc3RydGFiX3NlY3Rpb247Ci0gIHQtPnNoc3RydGFiX2hkci5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICB0LT5zeW10YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gICAgICB0LT5zdHJ0YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtID0gc2VjdGlvbl9udW1iZXI7Ci0KLSAgLyogU2V0IHVwIHRoZSBsaXN0IG9mIHNlY3Rpb24gaGVhZGVyIHBvaW50ZXJzLCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUKLSAgICAgaW5kaWNlcy4gICovCi0gIGlfc2hkcnAgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICoqKQotCSAgICAgYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uX251bWJlciAqIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIgKikpKTsKLSAgaWYgKGlfc2hkcnAgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaV9zaGRycFswXSA9ICgoRWxmX0ludGVybmFsX1NoZHIgKikKLQkJYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSkpOwotICBpZiAoaV9zaGRycFswXSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpX3NoZHJwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbXNldCAoaV9zaGRycFswXSwgMCwgc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkcikpOwotCi0gIGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgPSBpX3NoZHJwOwotCi0gIGlfc2hkcnBbdC0+c2hzdHJ0YWJfc2VjdGlvbl0gPSAmdC0+c2hzdHJ0YWJfaGRyOwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIGlfc2hkcnBbdC0+c3ltdGFiX3NlY3Rpb25dID0gJnQtPnN5bXRhYl9oZHI7Ci0gICAgICBpX3NoZHJwW3QtPnN0cnRhYl9zZWN0aW9uXSA9ICZ0LT5zdHJ0YWJfaGRyOwotICAgICAgdC0+c3ltdGFiX2hkci5zaF9saW5rID0gdC0+c3RydGFiX3NlY3Rpb247Ci0gICAgfQotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmQgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBpX3NoZHJwW2QtPnRoaXNfaWR4XSA9ICZkLT50aGlzX2hkcjsKLSAgICAgIGlmIChkLT5yZWxfaWR4ICE9IDApCi0JaV9zaGRycFtkLT5yZWxfaWR4XSA9ICZkLT5yZWxfaGRyOwotICAgICAgaWYgKGQtPnJlbF9pZHgyICE9IDApCi0JaV9zaGRycFtkLT5yZWxfaWR4Ml0gPSBkLT5yZWxfaGRyMjsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgc2hfbGluayBhbmQgc2hfaW5mbyBmaWVsZHMgd2hpbGUgd2UncmUgYXQgaXQuICAqLwotCi0gICAgICAvKiBzaF9saW5rIG9mIGEgcmVsb2Mgc2VjdGlvbiBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc3ltYm9sCi0JIHRhYmxlLiAgc2hfaW5mbyBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc2VjdGlvbiB0byB3aGljaAotCSB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGFwcGx5LiAgKi8KLSAgICAgIGlmIChkLT5yZWxfaWR4ICE9IDApCi0JewotCSAgZC0+cmVsX2hkci5zaF9saW5rID0gdC0+c3ltdGFiX3NlY3Rpb247Ci0JICBkLT5yZWxfaGRyLnNoX2luZm8gPSBkLT50aGlzX2lkeDsKLQl9Ci0gICAgICBpZiAoZC0+cmVsX2lkeDIgIT0gMCkKLQl7Ci0JICBkLT5yZWxfaGRyMi0+c2hfbGluayA9IHQtPnN5bXRhYl9zZWN0aW9uOwotCSAgZC0+cmVsX2hkcjItPnNoX2luZm8gPSBkLT50aGlzX2lkeDsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoZC0+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+ZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZykgKGFiZmQsIGxpbmtfaW5mbyk7Ci0KLSAgaWYgKCEgcHJlcF9oZWFkZXJzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUG9zdCBwcm9jZXNzIHRoZSBoZWFkZXJzIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKQotICAgICgqYmVkLT5lbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycykgKGFiZmQsIGxpbmtfaW5mbyk7Ci0KLSAgZmFpbGVkID0gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZWxmX2Zha2Vfc2VjdGlvbnMsICZmYWlsZWQpOwotICBpZiAoZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIWFzc2lnbl9zZWN0aW9uX251bWJlcnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgYmFja2VuZCBsaW5rZXIgYnVpbGRzIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBpdHNlbGYuICAqLwotICBpZiAobGlua19pbmZvID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIC8qIE5vbi16ZXJvIGlmIGRvaW5nIGEgcmVsb2NhdGFibGUgbGluay4gICovCi0gICAgICBpbnQgcmVsb2NhdGFibGVfcCA9ICEgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKTsKLQotICAgICAgaWYgKCEgc3dhcF9vdXRfc3ltcyAoYWJmZCwgJnN0cnRhYiwgcmVsb2NhdGFibGVfcCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzaHN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+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+c2VjdGlvbnMsIChzaXplX3QpIG0tPmNvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLAotCSAgICAgICBlbGZfc29ydF9zZWN0aW9ucyk7Ci0KLSAgICAgIHAtPnBfdHlwZSA9IG0tPnBfdHlwZTsKLSAgICAgIHAtPnBfZmxhZ3MgPSBtLT5wX2ZsYWdzOwotCi0gICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQKLQkgICYmIG0tPmNvdW50ID4gMAotCSAgJiYgKG0tPnNlY3Rpb25zWzBdLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQkgICAgb2ZmICs9IChtLT5zZWN0aW9uc1swXS0+dm1hIC0gb2ZmKSAlIGJlZC0+bWF4cGFnZXNpemU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGFsaWduOwotCi0JICAgICAgYWxpZ24gPSAwOwotCSAgICAgIGZvciAoaSA9IDAsIHNlY3BwID0gbS0+c2VjdGlvbnM7IGkgPCBtLT5jb3VudDsgaSsrLCBzZWNwcCsrKQotCQl7Ci0JCSAgYmZkX3NpemVfdHlwZSBzZWNhbGlnbjsKLQotCQkgIHNlY2FsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgKnNlY3BwKTsKLQkJICBpZiAoc2VjYWxpZ24gPiBhbGlnbikKLQkJICAgIGFsaWduID0gc2VjYWxpZ247Ci0JCX0KLQotCSAgICAgIG9mZiArPSAobS0+c2VjdGlvbnNbMF0tPnZtYSAtIG9mZikgJSAoMSA8PCBhbGlnbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChtLT5jb3VudCA9PSAwKQotCXAtPnBfdmFkZHIgPSAwOwotICAgICAgZWxzZQotCXAtPnBfdmFkZHIgPSBtLT5zZWN0aW9uc1swXS0+dm1hOwotCi0gICAgICBpZiAobS0+cF9wYWRkcl92YWxpZCkKLQlwLT5wX3BhZGRyID0gbS0+cF9wYWRkcjsKLSAgICAgIGVsc2UgaWYgKG0tPmNvdW50ID09IDApCi0JcC0+cF9wYWRkciA9IDA7Ci0gICAgICBlbHNlCi0JcC0+cF9wYWRkciA9IG0tPnNlY3Rpb25zWzBdLT5sbWE7Ci0KLSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQlwLT5wX2FsaWduID0gYmVkLT5tYXhwYWdlc2l6ZTsKLSAgICAgIGVsc2UgaWYgKG0tPmNvdW50ID09IDApCi0JcC0+cF9hbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLSAgICAgIGVsc2UKLQlwLT5wX2FsaWduID0gMDsKLQotICAgICAgcC0+cF9vZmZzZXQgPSAwOwotICAgICAgcC0+cF9maWxlc3ogPSAwOwotICAgICAgcC0+cF9tZW1zeiA9IDA7Ci0KLSAgICAgIGlmIChtLT5pbmNsdWRlc19maWxlaGRyKQotCXsKLQkgIGlmICghIG0tPnBfZmxhZ3NfdmFsaWQpCi0JICAgIHAtPnBfZmxhZ3MgfD0gUEZfUjsKLQkgIHAtPnBfb2Zmc2V0ID0gMDsKLQkgIHAtPnBfZmlsZXN6ID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkgIHAtPnBfbWVtc3ogPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCSAgaWYgKG0tPmNvdW50ID4gMCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKTsKLQotCSAgICAgIGlmIChwLT5wX3ZhZGRyIDwgKGJmZF92bWEpIG9mZikKLQkJewotCQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IE5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzLCB0cnkgbGlua2luZyB3aXRoIC1OIiksCi0JCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgcC0+cF92YWRkciAtPSBvZmY7Ci0JICAgICAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJcC0+cF9wYWRkciAtPSBvZmY7Ci0JICAgIH0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgewotCSAgICAgIGZpbGVoZHJfdmFkZHIgPSBwLT5wX3ZhZGRyOwotCSAgICAgIGZpbGVoZHJfcGFkZHIgPSBwLT5wX3BhZGRyOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobS0+aW5jbHVkZXNfcGhkcnMpCi0JewotCSAgaWYgKCEgbS0+cF9mbGFnc192YWxpZCkKLQkgICAgcC0+cF9mbGFncyB8PSBQRl9SOwotCi0JICBpZiAobS0+aW5jbHVkZXNfZmlsZWhkcikKLQkgICAgewotCSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkJewotCQkgIHBoZHJzX3ZhZGRyID0gcC0+cF92YWRkciArIGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0JCSAgcGhkcnNfcGFkZHIgPSBwLT5wX3BhZGRyICsgYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwLT5wX29mZnNldCA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0KLQkgICAgICBpZiAobS0+Y291bnQgPiAwKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAocC0+cF90eXBlID09IFBUX0xPQUQpOwotCQkgIHAtPnBfdmFkZHIgLT0gb2ZmIC0gcC0+cF9vZmZzZXQ7Ci0JCSAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJICAgIHAtPnBfcGFkZHIgLT0gb2ZmIC0gcC0+cF9vZmZzZXQ7Ci0JCX0KLQotCSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkJewotCQkgIHBoZHJzX3ZhZGRyID0gcC0+cF92YWRkcjsKLQkJICBwaGRyc19wYWRkciA9IHAtPnBfcGFkZHI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXBoZHJzX3ZhZGRyID0gYmVkLT5tYXhwYWdlc2l6ZSArIGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0JICAgIH0KLQotCSAgcC0+cF9maWxlc3ogKz0gYWxsb2MgKiBiZWQtPnMtPnNpemVvZl9waGRyOwotCSAgcC0+cF9tZW1zeiArPSBhbGxvYyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0JfQotCi0gICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQKLQkgIHx8IChwLT5wX3R5cGUgPT0gUFRfTk9URSAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpKQotCXsKLQkgIGlmICghIG0tPmluY2x1ZGVzX2ZpbGVoZHIgJiYgISBtLT5pbmNsdWRlc19waGRycykKLQkgICAgcC0+cF9vZmZzZXQgPSBvZmY7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlX3B0ciBhZGp1c3Q7Ci0KLQkgICAgICBhZGp1c3QgPSBvZmYgLSAocC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeik7Ci0JICAgICAgcC0+cF9maWxlc3ogKz0gYWRqdXN0OwotCSAgICAgIHAtPnBfbWVtc3ogKz0gYWRqdXN0OwotCSAgICB9Ci0JfQotCi0gICAgICB2b2ZmID0gb2ZmOwotCi0gICAgICBmb3IgKGkgPSAwLCBzZWNwcCA9IG0tPnNlY3Rpb25zOyBpIDwgbS0+Y291bnQ7IGkrKywgc2VjcHArKykKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICBiZmRfc2l6ZV90eXBlIGFsaWduOwotCi0JICBzZWMgPSAqc2VjcHA7Ci0JICBmbGFncyA9IHNlYy0+ZmxhZ3M7Ci0JICBhbGlnbiA9IDEgPDwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjKTsKLQotCSAgLyogVGhlIHNlY3Rpb24gbWF5IGhhdmUgYXJ0aWZpY2lhbCBhbGlnbm1lbnQgZm9yY2VkIGJ5IGEKLQkgICAgIGxpbmsgc2NyaXB0LiAgTm90aWNlIHRoaXMgY2FzZSBieSB0aGUgZ2FwIGJldHdlZW4gdGhlCi0JICAgICBjdW11bGF0aXZlIHBoZHIgdm1hIGFuZCB0aGUgc2VjdGlvbidzIHZtYS4gICovCi0JICBpZiAocC0+cF92YWRkciArIHAtPnBfbWVtc3ogPCBzZWMtPnZtYSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgYWRqdXN0ID0gc2VjLT52bWEgLSAocC0+cF92YWRkciArIHAtPnBfbWVtc3opOwotCi0JICAgICAgcC0+cF9tZW1zeiArPSBhZGp1c3Q7Ci0JICAgICAgb2ZmICs9IGFkanVzdDsKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXAtPnBfZmlsZXN6ICs9IGFkanVzdDsKLQkgICAgfQotCi0JICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQpCi0JICAgIHsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSBhZGp1c3Q7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBhZGp1c3QgPSBzZWMtPmxtYSAtIChwLT5wX3BhZGRyICsgcC0+cF9tZW1zeik7Ci0JCSAgaWYgKGFkanVzdCA8IDApCi0JCSAgICBhZGp1c3QgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQl7Ci0JCSAgLyogVGhlIHNlY3Rpb24gVk1BIG11c3QgZXF1YWwgdGhlIGZpbGUgcG9zaXRpb24KLQkJICAgICBtb2R1bG8gdGhlIHBhZ2Ugc2l6ZS4gIEZJWE1FOiBJJ20gbm90IHN1cmUgaWYKLQkJICAgICB0aGlzIGFkanVzdG1lbnQgaXMgcmVhbGx5IG5lY2Vzc2FyeS4gIFdlIHVzZWQgdG8KLQkJICAgICBub3QgaGF2ZSB0aGUgU0VDX0xPQUQgY2FzZSBqdXN0IGFib3ZlLCBhbmQgdGhlbgotCQkgICAgIHRoaXMgd2FzIG5lY2Vzc2FyeSwgYnV0IG5vdyBJJ20gbm90IHN1cmUuICAqLwotCQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCQkgICAgYWRqdXN0ID0gKHNlYy0+dm1hIC0gdm9mZikgJSBiZWQtPm1heHBhZ2VzaXplOwotCQkgIGVsc2UKLQkJICAgIGFkanVzdCA9IChzZWMtPnZtYSAtIHZvZmYpICUgYWxpZ247Ci0JCX0KLQkgICAgICBlbHNlCi0JCWFkanVzdCA9IDA7Ci0KLQkgICAgICBpZiAoYWRqdXN0ICE9IDApCi0JCXsKLQkJICBpZiAoaSA9PSAwKQotCQkgICAgewotCQkgICAgICAoKiBfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiRXJyb3I6IEZpcnN0IHNlY3Rpb24gaW4gc2VnbWVudCAoJXMpIHN0YXJ0cyBhdCAweCV4IiksCi0JCQkgYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgc2VjLT5sbWEpOwotCQkgICAgICAoKiBfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiICAgICAgIHdoZXJlYXMgc2VnbWVudCBzdGFydHMgYXQgMHgleCIpLAotCQkJIHAtPnBfcGFkZHIpOwotCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBwLT5wX21lbXN6ICs9IGFkanVzdDsKLQkJICBvZmYgKz0gYWRqdXN0OwotCQkgIHZvZmYgKz0gYWRqdXN0OwotCQkgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJICAgIHAtPnBfZmlsZXN6ICs9IGFkanVzdDsKLQkJfQotCi0JICAgICAgc2VjLT5maWxlcG9zID0gb2ZmOwotCi0JICAgICAgLyogV2UgY2hlY2sgU0VDX0hBU19DT05URU5UUyBoZXJlIGJlY2F1c2UgaWYgTk9MT0FEIGlzCi0gICAgICAgICAgICAgICAgIHVzZWQgaW4gYSBsaW5rZXIgc2NyaXB0IHdlIG1heSBoYXZlIGEgc2VjdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgIFNFQ19MT0FEIGNsZWFyIGJ1dCB3aGljaCBpcyBzdXBwb3NlZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkJICB8fCAoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCQlvZmYgKz0gc2VjLT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQl2b2ZmICs9IHNlYy0+X3Jhd19zaXplOwotCSAgICB9Ci0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTk9URSAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpCi0JICAgIHsKLQkgICAgICBpZiAoaSA9PSAwKQkvKiB0aGUgYWN0dWFsICJub3RlIiBzZWdtZW50ICovCi0JCXsJCS8qIHRoaXMgb25lIGFjdHVhbGx5IGNvbnRhaW5zIGV2ZXJ5dGhpbmcuICovCi0JCSAgc2VjLT5maWxlcG9zID0gb2ZmOwotCQkgIHAtPnBfZmlsZXN6ID0gc2VjLT5fcmF3X3NpemU7Ci0JCSAgb2ZmICs9IHNlYy0+X3Jhd19zaXplOwotCQkgIHZvZmYgPSBvZmY7Ci0JCX0KLQkgICAgICBlbHNlCS8qIGZha2Ugc2VjdGlvbnMgLS0gZG9uJ3QgbmVlZCB0byBiZSB3cml0dGVuICovCi0JCXsKLQkJICBzZWMtPmZpbGVwb3MgPSAwOwotCQkgIHNlYy0+X3Jhd19zaXplID0gMDsKLQkJICBmbGFncyA9IHNlYy0+ZmxhZ3MgPSAwOwkvKiBubyBjb250ZW50cyAqLwotCQl9Ci0JICAgICAgcC0+cF9tZW1zeiA9IDA7Ci0JICAgICAgcC0+cF9hbGlnbiA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHAtPnBfbWVtc3ogKz0gc2VjLT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXAtPnBfZmlsZXN6ICs9IHNlYy0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGFsaWduID4gcC0+cF9hbGlnbgotCQkgICYmIChwLT5wX3R5cGUgIT0gUFRfTE9BRCB8fCAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwKSkKLQkJcC0+cF9hbGlnbiA9IGFsaWduOwotCSAgICB9Ci0KLQkgIGlmICghIG0tPnBfZmxhZ3NfdmFsaWQpCi0JICAgIHsKLQkgICAgICBwLT5wX2ZsYWdzIHw9IFBGX1I7Ci0JICAgICAgaWYgKChmbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCQlwLT5wX2ZsYWdzIHw9IFBGX1g7Ci0JICAgICAgaWYgKChmbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQkJcC0+cF9mbGFncyB8PSBQRl9XOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHNldCB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucywgd2UgY2FuIHNldCB1cAotICAgICB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBub24gUFRfTE9BRCBzZWdtZW50cy4gICovCi0gIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwLCBwID0gcGhkcnM7Ci0gICAgICAgbSAhPSBOVUxMOwotICAgICAgIG0gPSBtLT5uZXh0LCBwKyspCi0gICAgewotICAgICAgaWYgKHAtPnBfdHlwZSAhPSBQVF9MT0FEICYmIG0tPmNvdW50ID4gMCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIG0tPmluY2x1ZGVzX2ZpbGVoZHIgJiYgISBtLT5pbmNsdWRlc19waGRycyk7Ci0JICBwLT5wX29mZnNldCA9IG0tPnNlY3Rpb25zWzBdLT5maWxlcG9zOwotCX0KLSAgICAgIGlmIChtLT5jb3VudCA9PSAwKQotCXsKLQkgIGlmIChtLT5pbmNsdWRlc19maWxlaGRyKQotCSAgICB7Ci0JICAgICAgcC0+cF92YWRkciA9IGZpbGVoZHJfdmFkZHI7Ci0JICAgICAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJcC0+cF9wYWRkciA9IGZpbGVoZHJfcGFkZHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG0tPmluY2x1ZGVzX3BoZHJzKQotCSAgICB7Ci0JICAgICAgcC0+cF92YWRkciA9IHBoZHJzX3ZhZGRyOwotCSAgICAgIGlmICghIG0tPnBfcGFkZHJfdmFsaWQpCi0JCXAtPnBfcGFkZHIgPSBwaGRyc19wYWRkcjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQ2xlYXIgb3V0IGFueSBwcm9ncmFtIGhlYWRlcnMgd2UgYWxsb2NhdGVkIGJ1dCBkaWQgbm90IHVzZS4gICovCi0gIGZvciAoOyBjb3VudCA8IGFsbG9jOyBjb3VudCsrLCBwKyspCi0gICAgewotICAgICAgbWVtc2V0IChwLCAwLCBzaXplb2YgKnApOwotICAgICAgcC0+cF90eXBlID0gUFRfTlVMTDsKLSAgICB9Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IHBoZHJzOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGJlZC0+cy0+c2l6ZW9mX2VoZHIsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZWQtPnMtPndyaXRlX291dF9waGRycyAoYWJmZCwgcGhkcnMsIGFsbG9jKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBwcm9ncmFtIGhlYWRlci4KLQotICAgSWYgdGhpcyBpcyBjYWxsZWQgYnkgdGhlIGxpbmtlciBiZWZvcmUgYW55IG9mIHRoZSBzZWN0aW9uIFZNQSdzIGFyZSBzZXQsIGl0Ci0gICBjYW4ndCBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGEgc3RyYW5nZSBtZW1vcnkgbGF5b3V0LiAgVGhpcyBvbmx5Ci0gICBoYXBwZW5zIHdoZW4gU0laRU9GX0hFQURFUlMgaXMgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQuICBJbiB0aGlzIGNhc2UsCi0gICBTT1JURURfSERSUyBpcyBOVUxMIGFuZCB3ZSBhc3N1bWUgdGhlIG5vcm1hbCBzY2VuYXJpbyBvZiBvbmUgdGV4dCBhbmQgb25lCi0gICBkYXRhIHNlZ21lbnQgKGV4Y2x1c2l2ZSBvZiAuaW50ZXJwIGFuZCAuZHluYW1pYykuCi0KLSAgID8/PyBVc2VyIHdyaXR0ZW4gc2NyaXB0cyBtdXN0IGVpdGhlciBub3QgdXNlIFNJWkVPRl9IRUFERVJTLCBvciBhc3N1bWUgdGhlcmUKLSAgIHdpbGwgYmUgdHdvIHNlZ21lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUKLWdldF9wcm9ncmFtX2hlYWRlcl9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNpemVfdCBzZWdzOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICAvKiBXZSBjYW4ndCByZXR1cm4gYSBkaWZmZXJlbnQgcmVzdWx0IGVhY2ggdGltZSB3ZSdyZSBjYWxsZWQuICAqLwotICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSAhPSAwKQotICAgIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOwotCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0KLSAgICAgIHNlZ3MgPSAwOwotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JKytzZWdzOwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSA9IHNlZ3MgKiBiZWQtPnMtPnNpemVvZl9waGRyOwotICAgICAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci0gICAgfQotCi0gIC8qIEFzc3VtZSB3ZSB3aWxsIG5lZWQgZXhhY3RseSB0d28gUFRfTE9BRCBzZWdtZW50czogb25lIGZvciB0ZXh0Ci0gICAgIGFuZCBvbmUgZm9yIGRhdGEuICAqLwotICBzZWdzID0gMjsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBhIGxvYWRhYmxlIGludGVycHJldGVyIHNlY3Rpb24sIHdlIG5lZWQgYQotCSBQVF9JTlRFUlAgc2VnbWVudC4gIEluIHRoaXMgY2FzZSwgYXNzdW1lIHdlIGFsc28gbmVlZCBhCi0JIFBUX1BIRFIgc2VnbWVudCwgYWx0aG91Z2ggdGhhdCBtYXkgbm90IGJlIHRydWUgZm9yIGFsbAotCSB0YXJnZXRzLiAgKi8KLSAgICAgIHNlZ3MgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgYSBQVF9EWU5BTUlDIHNlZ21lbnQuICAqLwotICAgICAgKytzZWdzOwotICAgIH0KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkgICYmIHN0cm5jbXAgKHMtPm5hbWUsICIubm90ZSIsIDUpID09IDApCi0JewotCSAgLyogV2UgbmVlZCBhIFBUX05PVEUgc2VnbWVudC4gICovCi0JICArK3NlZ3M7Ci0JfQotICAgIH0KLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgY291bnQgdXAgYW55IHByb2dyYW0gaGVhZGVycyBpdCBtaWdodCBuZWVkLiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpCi0gICAgewotICAgICAgaW50IGE7Ci0KLSAgICAgIGEgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpIChhYmZkKTsKLSAgICAgIGlmIChhID09IC0xKQotCWFib3J0ICgpOwotICAgICAgc2VncyArPSBhOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplID0gc2VncyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOwotfQotCi0vKiBXb3JrIG91dCB0aGUgZmlsZSBwb3NpdGlvbnMgb2YgYWxsIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgY2FsbGVkIGJ5Ci0gICBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICBBbGwgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kCi0gICBWTUFzIG11c3QgYmUga25vd24gYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgotCi0gICBXZSBkbyBub3QgY29uc2lkZXIgcmVsb2Mgc2VjdGlvbnMgYXQgdGhpcyBwb2ludCwgdW5sZXNzIHRoZXkgZm9ybQotICAgcGFydCBvZiB0aGUgbG9hZGFibGUgaW1hZ2UuICBSZWxvYyBzZWN0aW9ucyBhcmUgYXNzaWduZWQgZmlsZQotICAgcG9zaXRpb25zIGluIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzLCB3aGljaCBpcyBjYWxsZWQgYnkKLSAgIHdyaXRlX29iamVjdF9jb250ZW50cyBhbmQgZmluYWxfbGluay4KLQotICAgV2UgYWxzbyBkb24ndCBzZXQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgLnN5bXRhYiBhbmQgLnN0cnRhYiBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICogY29uc3QgdGRhdGEgPSBlbGZfdGRhdGEgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfRWhkciAqIGNvbnN0IGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiogY29uc3QgaV9zaGRycHAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBmaWxlX3B0ciBvZmY7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMAotICAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9jb3JlKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogU3RhcnQgYWZ0ZXIgdGhlIEVMRiBoZWFkZXIuICAqLwotICAgICAgb2ZmID0gaV9laGRycC0+ZV9laHNpemU7Ci0KLSAgICAgIC8qIFdlIGFyZSBub3QgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBhcmUKLQkgbm90IGNyZWF0aW5nIGEgcHJvZ3JhbSBoZWFkZXIsIGFuZCB0aGF0IHRoZSBhY3R1YWwgb3JkZXIgb2YKLQkgdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIGlzIHVuaW1wb3J0YW50LiAgKi8KLSAgICAgIGZvciAoaSA9IDEsIGhkcnBwID0gaV9zaGRycHAgKyAxOyBpIDwgaV9laGRycC0+ZV9zaG51bTsgaSsrLCBoZHJwcCsrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkgIGhkciA9ICpoZHJwcDsKLQkgIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0JICAgIHsKLQkgICAgICBoZHItPnNoX29mZnNldCA9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAoaSA9PSB0ZGF0YS0+c3ltdGFiX3NlY3Rpb24KLQkgICAgICB8fCBpID09IHRkYXRhLT5zdHJ0YWJfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGhkci0+c2hfb2Zmc2V0ID0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqKmhkcnBwOwotCi0gICAgICAvKiBBc3NpZ24gZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBsb2FkZWQgc2VjdGlvbnMgYmFzZWQgb24gdGhlCi0gICAgICAgICBhc3NpZ25tZW50IG9mIHNlY3Rpb25zIHRvIHNlZ21lbnRzLiAgKi8KLSAgICAgIGlmICghIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgb3RoZXIgc2VjdGlvbnMuICAqLwotCi0gICAgICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOwotICAgICAgZm9yIChpID0gMSwgaGRycHAgPSBpX3NoZHJwcCArIDE7IGkgPCBpX2VoZHJwLT5lX3NobnVtOyBpKyssIGhkcnBwKyspCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotCSAgaGRyID0gKmhkcnBwOwotCSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICAgICYmIGhkci0+YmZkX3NlY3Rpb24tPmZpbGVwb3MgIT0gMCkKLQkgICAgaGRyLT5zaF9vZmZzZXQgPSBoZHItPmJmZF9zZWN0aW9uLT5maWxlcG9zOwotCSAgZWxzZSBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogd2FybmluZzogYWxsb2NhdGVkIHNlY3Rpb24gYCVzJyBub3QgaW4gc2VnbWVudCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJKGhkci0+YmZkX3NlY3Rpb24gPT0gTlVMTAotCQkgPyAiKnVua25vd24qIgotCQkgOiBoZHItPmJmZF9zZWN0aW9uLT5uYW1lKSkpOwotCSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCQlvZmYgKz0gKGhkci0+c2hfYWRkciAtIG9mZikgJSBiZWQtPm1heHBhZ2VzaXplOwotCSAgICAgIGVsc2UKLQkJb2ZmICs9IChoZHItPnNoX2FkZHIgLSBvZmYpICUgaGRyLT5zaF9hZGRyYWxpZ247Ci0JICAgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLAotCQkJCQkJCSAgICAgICBmYWxzZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMCi0JCSAgIHx8IGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMQQotCQkgICB8fCBoZHIgPT0gaV9zaGRycHBbdGRhdGEtPnN5bXRhYl9zZWN0aW9uXQotCQkgICB8fCBoZHIgPT0gaV9zaGRycHBbdGRhdGEtPnN0cnRhYl9zZWN0aW9uXSkKLQkgICAgaGRyLT5zaF9vZmZzZXQgPSAtMTsKLQkgIGVsc2UKLQkgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQl9Ci0gICAgfQotCi0gIC8qIFBsYWNlIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotICBvZmYgPSBhbGlnbl9maWxlX3Bvc2l0aW9uIChvZmYsIGJlZC0+cy0+ZmlsZV9hbGlnbik7Ci0gIGlfZWhkcnAtPmVfc2hvZmYgPSBvZmY7Ci0gIG9mZiArPSBpX2VoZHJwLT5lX3NobnVtICogaV9laGRycC0+ZV9zaGVudHNpemU7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXByZXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9QaGRyICppX3BoZHJwID0gMDsgLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICBpbnQgY291bnQ7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnNoc3RydGFiOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0KLSAgc2hzdHJ0YWIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKHNoc3RydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9zaHN0cnRhYiAoYWJmZCkgPSBzaHN0cnRhYjsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzBdID0gRUxGTUFHMDsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9NQUcxXSA9IEVMRk1BRzE7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMl0gPSBFTEZNQUcyOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzNdID0gRUxGTUFHMzsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX0NMQVNTXSA9IGJlZC0+cy0+ZWxmY2xhc3M7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfREFUQV0gPQotICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IEVMRkRBVEEyTVNCIDogRUxGREFUQTJMU0I7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfVkVSU0lPTl0gPSBiZWQtPnMtPmV2X2N1cnJlbnQ7Ci0KLSAgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZPU0FCSV9TWVNWOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX0FCSVZFUlNJT05dID0gMDsKLQotICBmb3IgKGNvdW50ID0gRUlfUEFEOyBjb3VudCA8IEVJX05JREVOVDsgY291bnQrKykKLSAgICBpX2VoZHJwLT5lX2lkZW50W2NvdW50XSA9IDA7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfRFlOOwotICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfRVhFQzsKLSAgZWxzZSBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9jb3JlKQotICAgIGlfZWhkcnAtPmVfdHlwZSA9IEVUX0NPUkU7Ci0gIGVsc2UKLSAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9SRUw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3Vua25vd246Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9OT05FOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGlmIChiZWQtPnMtPmFyY2hfc2l6ZSA9PSA2NCkKLQlpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TUEFSQ1Y5OwotICAgICAgZWxzZQotCWlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1NQQVJDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fMzg2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fNjhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tODhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pODYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fOTYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgkvKiBNSVBTIFJ4eHh4ICovCi0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NSVBTOwkvKiBvbmx5IE1JUFMgUjMwMDAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaHBwYToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BBUklTQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BQQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9BTFBIQTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19EMTBWOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9kMzB2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX0QzMFY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2ZyMzA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfRlIzMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NQ09SRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfdjg1MDoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIDA6ICAgICAgICAgICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX1Y4NTA7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgY2FzZSBiZmRfYXJjaF9hcmM6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfQVJDOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0FSTTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbTMycjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19NMzJSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX01OMTAyMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAzMDA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfTU4xMDMwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfcGo6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9QSjsKLSAgICAgIGJyZWFrOwotICAgICAgLyogYWxzbyBub3RlIHRoYXQgRU1fTTMyLCBBVCZUIFdFMzIxMDAgaXMgdW5rbm93biB0byBiZmQgKi8KLSAgICBkZWZhdWx0OgotICAgICAgaV9laGRycC0+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+c2hfaW5mbyA9IGloZHItPnNoX2luZm87Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPnVzZV9yZWxhX3AKLSAgICA9IGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT51c2VfcmVsYV9wOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IHByaXZhdGUgc3ltYm9sIGluZm9ybWF0aW9uLiAgSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBzZWN0aW9uCi0gICB3aGljaCB3ZSBkaWQgbm90IG1hcCBpbnRvIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBtYXAgdGhlIHNlY3Rpb24KLSAgIGluZGV4IGNvcnJlY3RseS4gIFdlIHVzZSBzcGVjaWFsIG1hY3JvIGRlZmluaXRpb25zIGZvciB0aGUgbWFwcGVkCi0gICBzZWN0aW9uIGluZGljZXM7IHRoZXNlIGRlZmluaXRpb25zIGFyZSBpbnRlcnByZXRlZCBieSB0aGUKLSAgIHN3YXBfb3V0X3N5bXMgZnVuY3Rpb24uICAqLwotCi0jZGVmaW5lIE1BUF9PTkVTWU1UQUIgKFNITl9MT1JFU0VSVkUgLSAxKQotI2RlZmluZSBNQVBfRFlOU1lNVEFCIChTSE5fTE9SRVNFUlZFIC0gMikKLSNkZWZpbmUgTUFQX1NUUlRBQiAoU0hOX0xPUkVTRVJWRSAtIDMpCi0jZGVmaW5lIE1BUF9TSFNUUlRBQiAoU0hOX0xPUkVTRVJWRSAtIDQpCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bWFyZywgb2JmZCwgb3N5bWFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBhc3ltYm9sICppc3ltYXJnOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKm9zeW1hcmc7Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqaXN5bSwgKm9zeW07Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlzeW0gPSBlbGZfc3ltYm9sX2Zyb20gKGliZmQsIGlzeW1hcmcpOwotICBvc3ltID0gZWxmX3N5bWJvbF9mcm9tIChvYmZkLCBvc3ltYXJnKTsKLQotICBpZiAoaXN5bSAhPSBOVUxMCi0gICAgICAmJiBvc3ltICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaXN5bS0+c3ltYm9sLnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaG5keDsKLQotICAgICAgc2huZHggPSBpc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotICAgICAgaWYgKHNobmR4ID09IGVsZl9vbmVzeW10YWIgKGliZmQpKQotCXNobmR4ID0gTUFQX09ORVNZTVRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl9keW5zeW10YWIgKGliZmQpKQotCXNobmR4ID0gTUFQX0RZTlNZTVRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl90ZGF0YSAoaWJmZCktPnN0cnRhYl9zZWN0aW9uKQotCXNobmR4ID0gTUFQX1NUUlRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl90ZGF0YSAoaWJmZCktPnNoc3RydGFiX3NlY3Rpb24pCi0Jc2huZHggPSBNQVBfU0hTVFJUQUI7Ci0gICAgICBvc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ID0gc2huZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zd2FwX291dF9zeW1zIChhYmZkLCBzdHRwLCByZWxvY2F0YWJsZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKipzdHRwOwotICAgICBpbnQgcmVsb2NhdGFibGVfcDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICBpZiAoIWVsZl9tYXBfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIER1bXAgb3V0IHRoZSBzeW10YWJzLiAqLwotICB7Ci0gICAgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgYXN5bWJvbCAqKnN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0dDsKLSAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltc3RydGFiX2hkcjsKLSAgICBjaGFyICpvdXRib3VuZF9zeW1zOwotICAgIGludCBpZHg7Ci0KLSAgICBzdHQgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICBpZiAoc3R0ID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgc3ltdGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TWU1UQUI7Ci0gICAgc3ltdGFiX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICBzeW10YWJfaGRyLT5zaF9zaXplID0gc3ltdGFiX2hkci0+c2hfZW50c2l6ZSAqIChzeW1jb3VudCArIDEpOwotICAgIHN5bXRhYl9oZHItPnNoX2luZm8gPSBlbGZfbnVtX2xvY2FscyAoYWJmZCkgKyAxOwotICAgIHN5bXRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLQotICAgIHN5bXN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLQotICAgIG91dGJvdW5kX3N5bXMgPSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgICAgICAgKDEgKyBzeW1jb3VudCkgKiBiZWQtPnMtPnNpemVvZl9zeW0pOwotICAgIGlmIChvdXRib3VuZF9zeW1zID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoUFRSKSBvdXRib3VuZF9zeW1zOwotCi0gICAgLyogbm93IGdlbmVyYXRlIHRoZSBkYXRhIChmb3IgImNvbnRlbnRzIikgKi8KLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHplcm90aCBzeW1ib2wgYW5kIHN3YXAgaXQgb3V0LiAgKi8KLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgc3ltLnN0X25hbWUgPSAwOwotICAgICAgc3ltLnN0X3ZhbHVlID0gMDsKLSAgICAgIHN5bS5zdF9zaXplID0gMDsKLSAgICAgIHN5bS5zdF9pbmZvID0gMDsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBiZWQtPnMtPnN3YXBfc3ltYm9sX291dCAoYWJmZCwgJnN5bSwgKFBUUikgb3V0Ym91bmRfc3ltcyk7Ci0gICAgICBvdXRib3VuZF9zeW1zICs9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICB9Ci0gICAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgICB7Ci0JRWxmX0ludGVybmFsX1N5bSBzeW07Ci0JYmZkX3ZtYSB2YWx1ZSA9IHN5bXNbaWR4XS0+dmFsdWU7Ci0JZWxmX3N5bWJvbF90eXBlICp0eXBlX3B0cjsKLQlmbGFnd29yZCBmbGFncyA9IHN5bXNbaWR4XS0+ZmxhZ3M7Ci0JaW50IHR5cGU7Ci0KLQlpZiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JICAvKiBTZWN0aW9uIHN5bWJvbHMgaGF2ZSBubyBuYW1lcy4gICovCi0JICBzeW0uc3RfbmFtZSA9IDA7Ci0JZWxzZQotCSAgewotCSAgICBzeW0uc3RfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKHN0dCwKLQkJCQkJCQkgICAgICBzeW1zW2lkeF0tPm5hbWUsCi0JCQkJCQkJICAgICAgdHJ1ZSwgZmFsc2UpOwotCSAgICBpZiAoc3ltLnN0X25hbWUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCXR5cGVfcHRyID0gZWxmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1zW2lkeF0pOwotCi0JaWYgKChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotCSAgICAmJiBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNbaWR4XS0+c2VjdGlvbikpCi0JICB7Ci0JICAgIC8qIEVMRiBjb21tb24gc3ltYm9scyBwdXQgdGhlIGFsaWdubWVudCBpbnRvIHRoZSBgdmFsdWUnIGZpZWxkLAotCSAgICAgICBhbmQgdGhlIHNpemUgaW50byB0aGUgYHNpemUnIGZpZWxkLiAgVGhpcyBpcyBiYWNrd2FyZHMgZnJvbQotCSAgICAgICBob3cgQkZEIGhhbmRsZXMgaXQsIHNvIHJldmVyc2UgaXQgaGVyZS4gICovCi0JICAgIHN5bS5zdF9zaXplID0gdmFsdWU7Ci0JICAgIGlmICh0eXBlX3B0ciA9PSBOVUxMCi0JCXx8IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlID09IDApCi0JICAgICAgc3ltLnN0X3ZhbHVlID0gdmFsdWUgPj0gMTYgPyAxNiA6ICgxIDw8IGJmZF9sb2cyICh2YWx1ZSkpOwotCSAgICBlbHNlCi0JICAgICAgc3ltLnN0X3ZhbHVlID0gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWU7Ci0JICAgIHN5bS5zdF9zaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotCSAgICAgIChhYmZkLCBzeW1zW2lkeF0tPnNlY3Rpb24pOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNlY3Rpb24gKnNlYyA9IHN5bXNbaWR4XS0+c2VjdGlvbjsKLQkgICAgaW50IHNobmR4OwotCi0JICAgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uKQotCSAgICAgIHsKLQkJdmFsdWUgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQlzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCSAgICAgIH0KLQkgICAgLyogRG9uJ3QgYWRkIGluIHRoZSBzZWN0aW9uIHZtYSBmb3IgcmVsb2NhdGFibGUgb3V0cHV0LiAgKi8KLQkgICAgaWYgKCEgcmVsb2NhdGFibGVfcCkKLQkgICAgICB2YWx1ZSArPSBzZWMtPnZtYTsKLQkgICAgc3ltLnN0X3ZhbHVlID0gdmFsdWU7Ci0JICAgIHN5bS5zdF9zaXplID0gdHlwZV9wdHIgPyB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplIDogMDsKLQotCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0JCSYmIHR5cGVfcHRyICE9IE5VTEwKLQkJJiYgdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHggIT0gMCkKLQkgICAgICB7Ci0JCS8qIFRoaXMgc3ltYm9sIGlzIGluIGEgcmVhbCBFTEYgc2VjdGlvbiB3aGljaCB3ZSBkaWQKLSAgICAgICAgICAgICAgICAgICBub3QgY3JlYXRlIGFzIGEgQkZEIHNlY3Rpb24uICBVbmRvIHRoZSBtYXBwaW5nIGRvbmUKLSAgICAgICAgICAgICAgICAgICBieSBjb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEuICAqLwotCQlzaG5keCA9IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotCQlzd2l0Y2ggKHNobmR4KQotCQkgIHsKLQkJICBjYXNlIE1BUF9PTkVTWU1UQUI6Ci0JCSAgICBzaG5keCA9IGVsZl9vbmVzeW10YWIgKGFiZmQpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBNQVBfRFlOU1lNVEFCOgotCQkgICAgc2huZHggPSBlbGZfZHluc3ltdGFiIChhYmZkKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgTUFQX1NUUlRBQjoKLQkJICAgIHNobmR4ID0gZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX3NlY3Rpb247Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIE1BUF9TSFNUUlRBQjoKLQkJICAgIHNobmR4ID0gZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfc2VjdGlvbjsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotCQlpZiAoc2huZHggPT0gLTEpCi0JCSAgewotCQkgICAgYXNlY3Rpb24gKnNlYzI7Ci0KLQkJICAgIC8qIFdyaXRpbmcgdGhpcyB3b3VsZCBiZSBhIGhlbGwgb2YgYSBsb3QgZWFzaWVyIGlmCi0JCSAgICAgICB3ZSBoYWQgc29tZSBkZWNlbnQgZG9jdW1lbnRhdGlvbiBvbiBiZmQsIGFuZAotCQkgICAgICAga25ldyB3aGF0IHRvIGV4cGVjdCBvZiB0aGUgbGlicmFyeSwgYW5kIHdoYXQgdG8KLQkJICAgICAgIGRlbWFuZCBvZiBhcHBsaWNhdGlvbnMuICBGb3IgZXhhbXBsZSwgaXQKLQkJICAgICAgIGFwcGVhcnMgdGhhdCBgb2JqY29weScgbWlnaHQgbm90IHNldCB0aGUKLQkJICAgICAgIHNlY3Rpb24gb2YgYSBzeW1ib2wgdG8gYmUgYSBzZWN0aW9uIHRoYXQgaXMKLQkJICAgICAgIGFjdHVhbGx5IGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCSAgICBzZWMyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlYy0+bmFtZSk7Ci0JCSAgICBCRkRfQVNTRVJUIChzZWMyICE9IDApOwotCQkgICAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYzIpOwotCQkgICAgQkZEX0FTU0VSVCAoc2huZHggIT0gLTEpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgc3ltLnN0X3NobmR4ID0gc2huZHg7Ci0JICB9Ci0KLQlpZiAoKGZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCSAgdHlwZSA9IFNUVF9GVU5DOwotCWVsc2UgaWYgKChmbGFncyAmIEJTRl9PQkpFQ1QpICE9IDApCi0JICB0eXBlID0gU1RUX09CSkVDVDsKLQllbHNlCi0JICB0eXBlID0gU1RUX05PVFlQRTsKLQotICAgICAgICAvKiBQcm9jZXNzb3Itc3BlY2lmaWMgdHlwZXMgKi8KLSAgICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKQotICAgICAgICAgIHR5cGUgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKSAoJnR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLCB0eXBlKTsKLQotCWlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotCWVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIHR5cGUpOwotCWVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKCgoZmxhZ3MgJiBCU0ZfV0VBSykKLQkJCQkgICAgICA/IFNUQl9XRUFLCi0JCQkJICAgICAgOiBTVEJfR0xPQkFMKSwKLQkJCQkgICAgIHR5cGUpOwotCWVsc2UgaWYgKGZsYWdzICYgQlNGX0ZJTEUpCi0JICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9GSUxFKTsKLQllbHNlCi0JICB7Ci0JICAgIGludCBiaW5kID0gU1RCX0xPQ0FMOwotCi0JICAgIGlmIChmbGFncyAmIEJTRl9MT0NBTCkKLQkgICAgICBiaW5kID0gU1RCX0xPQ0FMOwotCSAgICBlbHNlIGlmIChmbGFncyAmIEJTRl9XRUFLKQotCSAgICAgIGJpbmQgPSBTVEJfV0VBSzsKLQkgICAgZWxzZSBpZiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCSAgICAgIGJpbmQgPSBTVEJfR0xPQkFMOwotCi0JICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGJpbmQsIHR5cGUpOwotCSAgfQotCi0JaWYgKHR5cGVfcHRyICE9IE5VTEwpCi0JICBzeW0uc3Rfb3RoZXIgPSB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcjsKLQllbHNlCi0JICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0JYmVkLT5zLT5zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sIChQVFIpIG91dGJvdW5kX3N5bXMpOwotCW91dGJvdW5kX3N5bXMgKz0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgICAgfQotCi0gICAgKnN0dHAgPSBzdHQ7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKHN0dCk7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0KLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLgotCi0gICBOb3RlIHRoYXQgd2UgYmFzZSBpdCBvbiB0aGUgY291bnQgcGx1cyAxLCBzaW5jZSB3ZSB3aWxsIG51bGwgdGVybWluYXRlCi0gICB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIHNpemUuICBIb3dldmVyLCB0aGUgRUxGIHN5bWJvbCB0YWJsZQotICAgYWx3YXlzIGhhcyBhIGR1bW15IGVudHJ5IGFzIHN5bWJvbCAjMCwgc28gaXQgZW5kcyB1cCBldmVuLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplOwotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9zeW07Ci0gIHN5bXRhYl9zaXplID0gKHN5bWNvdW50IC0gMSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0KLSAgcmV0dXJuIHN5bXRhYl9zaXplOwotfQotCi1sb25nCi1fYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzeW10YWJfc2l6ZTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2Zfc3ltOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCAtIDEgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIHJldHVybiBzeW10YWJfc2l6ZTsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIENhbm9uaWNhbGl6ZSB0aGUgcmVsb2NzLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoISBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3JlbG9jX3RhYmxlIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24sCi0JCQkJCQkJICAgc3ltYm9scywKLQkJCQkJCQkgICBmYWxzZSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgaSsrKQotICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIGxvbmcgc3ltY291bnQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3N5bWJvbF90YWJsZQotICAgIChhYmZkLCBhbG9jYXRpb24sIGZhbHNlKTsKLQotICBpZiAoc3ltY291bnQgPj0gMCkKLSAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bWNvdW50OwotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHJldHVybiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3N5bWJvbF90YWJsZQotICAgIChhYmZkLCBhbG9jYXRpb24sIHRydWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIHNpemUgcmVxdWlyZWQgZm9yIHRoZSBkeW5hbWljIHJlbG9jIGVudHJpZXMuICBBbnkKLSAgIHNlY3Rpb24gdGhhdCB3YXMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZQotICAgU0hUX1JFTCBvciBTSFRfUkVMQSwgYW5kIHVzZXMgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcwotICAgY29uc2lkZXJlZCB0byBiZSBhIGR5bmFtaWMgcmVsb2Mgc2VjdGlvbi4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgcmV0OwotICBhc2VjdGlvbiAqczsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXQgPSBzaXplb2YgKGFyZWxlbnQgKik7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+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+dm5fbmV4dCkpOwotCX0KLQotICAgICAgZnJlZSAoY29udGVudHMpOwotICAgICAgY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi1hc3ltYm9sICoKLV9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqbmV3c3ltOwotCi0gIG5ld3N5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXdzeW0pCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgICAgIHJldHVybiAmbmV3c3ltLT5zeW1ib2w7Ci0gICAgfQotfQotCi12b2lkCi1fYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBzeW1ib2wuICBNb3N0IHRhcmdldHMKLSAgIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciB0aGUgaXNfbG9jYWxfbGFiZWxfbmFtZSBlbnRyeSBwb2ludCwgYnV0IHNvbWUKLSAgIG92ZXJyaWRlIGl0LiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIE5vcm1hbCBsb2NhbCBzeW1ib2xzIHN0YXJ0IHdpdGggYGAuTCcnLiAgKi8KLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEF0IGxlYXN0IHNvbWUgU1ZSNCBjb21waWxlcnMgKGUuZy4sIFVuaXhXYXJlIDIuMSBjYykgZ2VuZXJhdGUKLSAgICAgRFdBUkYgZGVidWdnaW5nIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBgYC4uJycuICAqLwotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogZ2NjIHdpbGwgc29tZXRpbWVzIGdlbmVyYXRlIHN5bWJvbHMgYmVnaW5uaW5nIHdpdGggYGBfLkxfJycgd2hlbgotICAgICBlbWl0dGluZyBEV0FSRiBkZWJ1Z2dpbmcgb3V0cHV0LiAgSSBzdXNwZWN0IHRoaXMgaXMgYWN0dWFsbHkgYQotICAgICBzbWFsbCBidWcgaW4gZ2NjIChpdCBjYWxscyBBU01fT1VUUFVUX0xBQkVMIHdoZW4gaXQgc2hvdWxkIGNhbGwKLSAgICAgQVNNX0dFTkVSQVRFX0lOVEVSTkFMX0xBQkVMLCBhbmQgdGhpcyBjYXVzZXMgdGhlIGxlYWRpbmcKLSAgICAgdW5kZXJzY29yZSB0byBiZSBlbWl0dGVkIG9uIHNvbWUgRUxGIHRhcmdldHMpLiAgRm9yIGVhc2Ugb2YgdXNlLAotICAgICB3ZSB0cmVhdCBzdWNoIHN5bWJvbHMgYXMgbG9jYWwuICAqLwotICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnTCcgJiYgbmFtZVszXSA9PSAnXycpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1hbGVudCAqCi1fYmZkX2VsZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgLyogSWYgdGhpcyBpc24ndCB0aGUgcmlnaHQgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIGJhY2tlbmQsIGFuZCB0aGlzCi0gICAgIGlzbid0IHRoZSBnZW5lcmljIGJhY2tlbmQsIGZhaWwuICAqLwotICBpZiAoYXJjaCAhPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmFyY2gKLSAgICAgICYmIGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bgotICAgICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5hcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHRvIGEgcGFydGljdWxhciBzZWN0aW9uIGFuZCBvZmZzZXQsIGZvciBlcnJvcgotICAgcmVwb3J0aW5nLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsCi0JCQkgICAgc2VjdGlvbiwKLQkJCSAgICBzeW1ib2xzLAotCQkJICAgIG9mZnNldCwKLQkJCSAgICBmaWxlbmFtZV9wdHIsCi0JCQkgICAgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCSAgICBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGFzeW1ib2wgKmZ1bmM7Ci0gIGJmZF92bWEgbG93X2Z1bmM7Ci0gIGFzeW1ib2wgKipwOwotCi0gIGlmIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkgICAgIGxpbmVfcHRyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc3ltYm9scywgc2VjdGlvbiwgb2Zmc2V0LAotCQkJCQkgICAgICZmb3VuZCwgZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyLAotCQkJCQkgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5saW5lX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzeW1ib2xzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgZnVuYyA9IE5VTEw7Ci0gIGxvd19mdW5jID0gMDsKLQotICBmb3IgKHAgPSBzeW1ib2xzOyAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgZWxmX3N5bWJvbF90eXBlICpxOwotCi0gICAgICBxID0gKGVsZl9zeW1ib2xfdHlwZSAqKSAqcDsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoJnEtPnN5bWJvbCkgIT0gc2VjdGlvbikKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChFTEZfU1RfVFlQRSAocS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCWNhc2UgU1RUX0ZJTEU6Ci0JICBmaWxlbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCZxLT5zeW1ib2wpOwotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfTk9UWVBFOgotCWNhc2UgU1RUX0ZVTkM6Ci0JICBpZiAocS0+c3ltYm9sLnNlY3Rpb24gPT0gc2VjdGlvbgotCSAgICAgICYmIHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfZnVuYwotCSAgICAgICYmIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICBmdW5jID0gKGFzeW1ib2wgKikgcTsKLQkgICAgICBsb3dfZnVuYyA9IHEtPnN5bWJvbC52YWx1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZnVuYyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqZmlsZW5hbWVfcHRyID0gZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gYmZkX2FzeW1ib2xfbmFtZSAoZnVuYyk7Ci0gICpsaW5lX3B0ciA9IDA7Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQKLV9iZmRfZWxmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jOwotewotICBpbnQgcmV0OwotCi0gIHJldCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2VoZHI7Ci0gIGlmICghIHJlbG9jKQotICAgIHJldCArPSBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSAoYWJmZCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4KLSAgICAgICYmICEgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zCi0gICAgICAoYWJmZCwgKHN0cnVjdCBiZmRfbGlua19pbmZvICopIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBoZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQgKyBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkCi1fYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0jaWYgMAotdm9pZAotX2JmZF9lbGZfbm9faW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbCAqZHN0OwotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi0vKiBUcnkgdG8gY29udmVydCBhIG5vbi1FTEYgcmVsb2MgaW50byBhbiBFTEYgb25lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIGFyZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICphcmVsb2M7Ci17Ci0gIC8qIENoZWNrIHdoZXRoZXIgd2UgcmVhbGx5IGhhdmUgYW4gRUxGIGhvd3RvLiAqLwotCi0gIGlmICgoKmFyZWxvYy0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICAgICAgLyogQWxpZW4gcmVsb2M6IFRyeSB0byBkZXRlcm1pbmUgaXRzIHR5cGUgdG8gcmVwbGFjZSBpdCB3aXRoIGFuCi0JIGVxdWl2YWxlbnQgRUxGIHJlbG9jLiAqLwotCi0gICAgICBpZiAoYXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JewotCSAgc3dpdGNoIChhcmVsb2MtPmhvd3RvLT5iaXRzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgODoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTI6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxNjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMjRfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzI6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSA2NDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzY0X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgfQotCi0JICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSk7Ci0KLQkgIGlmIChhcmVsb2MtPmhvd3RvLT5wY3JlbF9vZmZzZXQgIT0gaG93dG8tPnBjcmVsX29mZnNldCkKLQkgICAgewotCSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCQlhcmVsb2MtPmFkZGVuZCArPSBhcmVsb2MtPmFkZHJlc3M7Ci0JICAgICAgZWxzZQotCQlhcmVsb2MtPmFkZGVuZCAtPSBhcmVsb2MtPmFkZHJlc3M7IC8qIGFkZGVuZCBpcyB1bnNpZ25lZCEhICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChhcmVsb2MtPmhvd3RvLT5iaXRzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgODoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzg7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxNjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMjY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzI6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSA2NDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzY0OwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgfQotCi0JICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSk7Ci0JfQotCi0gICAgICBpZiAoaG93dG8pCi0JYXJlbG9jLT5ob3d0byA9IGhvd3RvOwotICAgICAgZWxzZQotCWdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBmYWlsOgotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAlcyIpLAotICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYXJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX3Noc3RydGFiIChhYmZkKSAhPSBOVUxMKQotCV9iZmRfc3RyaW5ndGFiX2ZyZWUgKGVsZl9zaHN0cnRhYiAoYWJmZCkpOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKTsKLX0KLQotLyogRm9yIFJlbCB0YXJnZXRzLCB3ZSBlbmNvZGUgbWVhbmluZ2Z1bCBkYXRhIGZvciBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi0gICBpbiB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4gIFRodXMgd2UgY2Fubm90IGFsbG93IGFueSBzb3J0IG9mIHNhbml0eQotICAgcmFuZ2UtY2hlY2tpbmcgdG8gaW50ZXJmZXJlLiAgVGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIGRvIGluIHByb2Nlc3NpbmcKLSAgIHRoaXMgcmVsb2MuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4gKGFiZmQsIHJlLCBzeW1ib2wsIGRhdGEsIGlzLCBvYmZkLCBlcnJtc2cpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qIEVsZiBjb3JlIGZpbGUgc3VwcG9ydC4gIE11Y2ggb2YgdGhpcyBvbmx5IHdvcmtzIG9uIG5hdGl2ZQotICAgdG9vbGNoYWlucywgc2luY2Ugd2UgcmVseSBvbiBrbm93aW5nIHRoZQotICAgbWFjaGluZS1kZXBlbmRlbnQgcHJvY2ZzIHN0cnVjdHVyZSBpbiBvcmRlciB0byBwaWNrCi0gICBvdXQgZGV0YWlscyBhYm91dCB0aGUgY29yZWZpbGUuICovCi0KLSNpZmRlZiBIQVZFX1NZU19QUk9DRlNfSAotIyBpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci0jZW5kaWYKLQotCi0vKiBEZWZpbmUgb2Zmc2V0b2YgZm9yIHRob3NlIHN5c3RlbXMgd2hpY2ggbGFjayBpdC4gKi8KLQotI2lmbmRlZiBvZmZzZXRvZgotIyBkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQotI2VuZGlmCi0KLQotLyogRklYTUU6IHRoaXMgaXMga2luZGEgd3JvbmcsIGJ1dCBpdCdzIHdoYXQgZ2RiIHdhbnRzLiAqLwotCi1zdGF0aWMgaW50Ci1lbGZjb3JlX21ha2VfcGlkIChhYmZkKQotICAgICBiZmQqIGFiZmQ7Ci17Ci0gIHJldHVybiAoKGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfbHdwaWQgPDwgMTYpCi0JICArIChlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3BpZCkpOwotfQotCi0KLS8qIElmIHRoZXJlIGlzbid0IGEgc2VjdGlvbiBjYWxsZWQgTkFNRSwgbWFrZSBvbmUsIHVzaW5nCi0gICBkYXRhIGZyb20gU0VDVC4gIE5vdGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhCi0gICByZWZlcmVuY2UgdG8gTkFNRSwgc28geW91IHNob3VsZG4ndCBkZWFsbG9jYXRlIG9yCi0gICBvdmVyd3JpdGUgaXQuICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgbmFtZSwgc2VjdCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBuYW1lOwotICAgICBhc2VjdGlvbiogc2VjdDsKLXsKLSAgYXNlY3Rpb24qIHNlY3QyOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0MiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdDIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc2VjdDItPl9yYXdfc2l6ZSA9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgc2VjdDItPmZpbGVwb3MgPSBzZWN0LT5maWxlcG9zOwotICBzZWN0Mi0+ZmxhZ3MgPSBzZWN0LT5mbGFnczsKLSAgc2VjdDItPmFsaWdubWVudF9wb3dlciA9IHNlY3QtPmFsaWdubWVudF9wb3dlcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogcHJzdGF0dXNfdCBleGlzdHMgb246Ci0gICAgIHNvbGFyaXMgMi5bNTY3XQotICAgICBsaW51eCAyLlswMV0gKyBnbGliYwotICAgICB1bml4d2FyZSA0LjIKLSovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3Byc3RhdHVzIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBwcnN0YXR1c190IHByc3RhdDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciogbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKHByc3RhdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmcHJzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChwcnN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbCA9IHByc3RhdC5wcl9jdXJzaWc7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHJzdGF0LnByX3BpZDsKLQotICAvKiBwcl93aG8gZXhpc3RzIG9uOgotICAgICAgIHNvbGFyaXMgMi5bNTY3XQotICAgICAgIHVuaXh3YXJlIDQuMgotICAgICBwcl93aG8gZG9lc24ndCBleGlzdCBvbjoKLSAgICAgICBsaW51eCAyLlswMV0KLSAgKi8KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1RfUFJfV0hPKQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkID0gcHJzdGF0LnByX3dobzsKLSNlbmRpZgotCi0gIC8qIE1ha2UgYSAiLnJlZy85OTkiIHNlY3Rpb24uICovCi0KLSAgc3ByaW50ZiAoYnVmLCAiLnJlZy8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChwcnN0YXQucHJfcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAocHJzdGF0dXNfdCwgcHJfcmVnKTsKLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZyIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpICovCi0KLQotLyogVGhlcmUgaXNuJ3QgYSBjb25zaXN0ZW50IHByZnByZWdzZXRfdCBhY3Jvc3MgcGxhdGZvcm1zLAotICAgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8gcGljayB0aGlzCi0gICBkYXRhIHN0cnVjdHVyZSBhcGFydC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wcmZwcmVnIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyKiBuYW1lOwotICBhc2VjdGlvbiogc2VjdDsKLQotICAvKiBNYWtlIGEgIi5yZWcyLzk5OSIgc2VjdGlvbi4gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnMi8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjdC0+X3Jhd19zaXplID0gbm90ZS0+ZGVzY3N6OwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvczsKLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZzIiLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpCi0jIGRlZmluZSBlbGZjb3JlX3BzaW5mb190IHBycHNpbmZvX3QKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkKLSMgZGVmaW5lIGVsZmNvcmVfcHNpbmZvX3QgcHNpbmZvX3QKLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0KLS8qIHJldHVybiBhIG1hbGxvYydlZCBjb3B5IG9mIGEgc3RyaW5nIGF0IFNUQVJUIHdoaWNoIGlzIGF0Ci0gICBtb3N0IE1BWCBieXRlcyBsb25nLCBwb3NzaWJseSB3aXRob3V0IGEgdGVybWluYXRpbmcgJ1wwJy4KLSAgIHRoZSBjb3B5IHdpbGwgYWx3YXlzIGhhdmUgYSB0ZXJtaW5hdGluZyAnXDAnLiAqLwotCi1zdGF0aWMgY2hhcioKLWVsZmNvcmVfc3RybmR1cCAoYWJmZCwgc3RhcnQsIG1heCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBzdGFydDsKLSAgICAgaW50IG1heDsKLXsKLSAgY2hhciogZHVwOwotICBjaGFyKiBlbmQgPSBtZW1jaHIgKHN0YXJ0LCAnXDAnLCBtYXgpOwotICBpbnQgbGVuOwotCi0gIGlmIChlbmQgPT0gTlVMTCkKLSAgICBsZW4gPSBtYXg7Ci0gIGVsc2UKLSAgICBsZW4gPSBlbmQgLSBzdGFydDsKLQotICBkdXAgPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOwotICBpZiAoZHVwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbWVtY3B5IChkdXAsIHN0YXJ0LCBsZW4pOwotICBkdXBbbGVuXSA9ICdcMCc7Ci0KLSAgcmV0dXJuIGR1cDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wc2luZm8gKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIGVsZmNvcmVfcHNpbmZvX3QgcHNpbmZvOwotCi0gIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChlbGZjb3JlX3BzaW5mb190KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCZwc2luZm8sIG5vdGUtPmRlc2NkYXRhLCBub3RlLT5kZXNjc3opOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcHJvZ3JhbQotICAgID0gZWxmY29yZV9zdHJuZHVwIChhYmZkLCBwc2luZm8ucHJfZm5hbWUsIHNpemVvZiAocHNpbmZvLnByX2ZuYW1lKSk7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9jb21tYW5kCi0gICAgPSBlbGZjb3JlX3N0cm5kdXAgKGFiZmQsIHBzaW5mby5wcl9wc2FyZ3MsIHNpemVvZiAocHNpbmZvLnByX3BzYXJncykpOwotCi0gIC8qIE5vdGUgdGhhdCBmb3Igc29tZSByZWFzb24sIGEgc3B1cmlvdXMgc3BhY2UgaXMgdGFja2VkCi0gICAgIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJncyBpbiBzb21lIChhdCBsZWFzdCBvbmUgYW55d2F5KQotICAgICBpbXBsZW1lbnRhdGlvbnMsIHNvIHN0cmlwIGl0IG9mZiBpZiBpdCBleGlzdHMuICovCi0KLSAgewotICAgIGNoYXIqIGNvbW1hbmQgPSBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQ7Ci0gICAgaW50IG4gPSBzdHJsZW4gKGNvbW1hbmQpOwotCi0gICAgaWYgKDAgPCBuICYmIGNvbW1hbmRbbiAtIDFdID09ICcgJykKLSAgICAgIGNvbW1hbmRbbiAtIDFdID0gJ1wwJzsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkgfHwgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkgKi8KLQotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3BzdGF0dXMgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHBzdGF0dXNfdCBwc3RhdDsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAocHN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJnBzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChwc3RhdCkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHN0YXQucHJfcGlkOwotCi0gIC8qIENvdWxkIGdyYWIgc29tZSBtb3JlIGRldGFpbHMgZnJvbSB0aGUgInJlcHJlc2VudGF0aXZlIgotICAgICBsd3BzdGF0dXNfdCBpbiBwc3RhdC5wcl9sd3AsIGJ1dCB3ZSdsbCBjYXRjaCBpdCBhbGwgaW4gYW4KLSAgICAgTlRfTFdQU1RBVFVTIG5vdGUsIHByZXN1bWFibHkuICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpICovCi0KLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX2x3cHN0YXR1cyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgbHdwc3RhdHVzX3QgbHdwc3RhdDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciogbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKGx3cHN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJmx3cHN0YXQsIG5vdGUtPmRlc2NkYXRhLCBzaXplb2YgKGx3cHN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkID0gbHdwc3RhdC5wcl9sd3BpZDsKLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWwgPSBsd3BzdGF0LnByX2N1cnNpZzsKLQotICAvKiBNYWtlIGEgIi5yZWcvOTk5IiBzZWN0aW9uLiAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIi5yZWcvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5IChuYW1lLCBidWYpOwotCi0gIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKHNlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9jb250ZXh0LnVjX21jb250ZXh0LmdyZWdzKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MKLSAgICArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfY29udGV4dC51Y19tY29udGV4dC5ncmVncyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX3JlZyk7Ci0jZW5kaWYKLQotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCFlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWciLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTWFrZSBhICIucmVnMi85OTkiIHNlY3Rpb24gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnMi8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVCkKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX2NvbnRleHQudWNfbWNvbnRleHQuZnByZWdzKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MKLSAgICArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfY29udGV4dC51Y19tY29udGV4dC5mcHJlZ3MpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0ZQUkVHKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfZnByZWcpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfZnByZWcpOwotI2VuZGlmCi0KLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnMiIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UKSAqLwotCi0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19ub3RlIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBzd2l0Y2ggKG5vdGUtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVCkKLSAgICBjYXNlIE5UX1BSU1RBVFVTOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wcnN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfUFNUQVRVU19UKQotICAgIGNhc2UgTlRfUFNUQVRVUzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpCi0gICAgY2FzZSBOVF9MV1BTVEFUVVM6Ci0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX2x3cHN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotICAgIGNhc2UgTlRfRlBSRUdTRVQ6CQkvKiBGSVhNRTogcmVuYW1lIHRvIE5UX1BSRlBSRUcgKi8KLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHJmcHJlZyAoYWJmZCwgbm90ZSk7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0gICAgY2FzZSBOVF9QUlBTSU5GTzoKLSAgICBjYXNlIE5UX1BTSU5GTzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHNpbmZvIChhYmZkLCBub3RlKTsKLSNlbmRpZgotICAgIH0KLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9yZWFkX25vdGVzIChhYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgc2l6ZTsKLXsKLSAgY2hhciogYnVmOwotICBjaGFyKiBwOwotCi0gIGlmIChzaXplIDw9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYnVmID0gYmZkX21hbGxvYyAoKHNpemVfdCkgc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9yZWFkIChidWYsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgIGVycm9yOgotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcCA9IGJ1ZjsKLSAgd2hpbGUgKHAgPCBidWYgKyBzaXplKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBiYWQgYWxpZ25tZW50IGFzc3VtcHRpb24uICovCi0gICAgICBFbGZfRXh0ZXJuYWxfTm90ZSogeG5wID0gKEVsZl9FeHRlcm5hbF9Ob3RlKikgcDsKLSAgICAgIEVsZl9JbnRlcm5hbF9Ob3RlIGluOwotCi0gICAgICBpbi50eXBlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT50eXBlKTsKLQotICAgICAgaW4ubmFtZXN6ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT5uYW1lc3opOwotICAgICAgaW4ubmFtZWRhdGEgPSB4bnAtPm5hbWU7Ci0KLSAgICAgIGluLmRlc2NzeiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhucC0+ZGVzY3N6KTsKLSAgICAgIGluLmRlc2NkYXRhID0gaW4ubmFtZWRhdGEgKyBCRkRfQUxJR04gKGluLm5hbWVzeiwgNCk7Ci0gICAgICBpbi5kZXNjcG9zID0gb2Zmc2V0ICsgKGluLmRlc2NkYXRhIC0gYnVmKTsKLQotICAgICAgaWYgKCEgZWxmY29yZV9ncm9rX25vdGUgKGFiZmQsICZpbikpCi0JZ290byBlcnJvcjsKLQotICAgICAgcCA9IGluLmRlc2NkYXRhICsgQkZEX0FMSUdOIChpbi5kZXNjc3osIDQpOwotICAgIH0KLQotICBmcmVlIChidWYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBpcyBub3cgdW5uZWNlc3NhcnkuICBDYWxsZXJzIGNhbiBqdXN0IGNhbGwKLSAgIGJmZF9zZWN0aW9uX2Zyb21fcGhkciBkaXJlY3RseS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgcGhkciwgc2VjX251bSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciogcGhkcjsKLSAgICAgaW50IHNlY19udW07Ci17Ci0gIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgcGhkciwgc2VjX251bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLQwKLS8qIFByb3ZpZGluZyBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZS4gICovCi0KLS8qIFJldHVybiBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIGEKLSAgIGNvcHkgb2YgQUJGRCdzIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMuICBSZXR1cm4gLTEgaWYgYW4gZXJyb3IKLSAgIG9jY3VyczsgYmZkX2dldF9lcnJvciB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSBjb2RlLiAgKi8KLWxvbmcKLWJmZF9nZXRfZWxmX3BoZHJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bQotCSAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci19Ci0KLQotLyogQ29weSBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcyB0byAqUEhEUlMuICBUaGUgZW50cmllcwotICAgd2lsbCBiZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgRWxmX0ludGVybmFsX1BoZHIgc3RydWN0dXJlcywgYXMKLSAgIGRlZmluZWQgaW4gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4gIFRvIGZpbmQgb3V0IGhvdyBsYXJnZSB0aGUKLSAgIGJ1ZmZlciBuZWVkcyB0byBiZSwgY2FsbCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHJlYWQsIG9yIC0xIGlmIGFuCi0gICBlcnJvciBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1pbnQKLWJmZF9nZXRfZWxmX3BoZHJzIChhYmZkLCBwaGRycykKLSAgICAgYmZkICphYmZkOwotICAgICB2b2lkICpwaGRyczsKLXsKLSAgaW50IG51bV9waGRyczsKLQotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBudW1fcGhkcnMgPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bTsKLSAgbWVtY3B5IChwaGRycywgZWxmX3RkYXRhIChhYmZkKS0+cGhkciwgCi0JICBudW1fcGhkcnMgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci0KLSAgcmV0dXJuIG51bV9waGRyczsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1hcmMuYyBiL2JmZC9lbGYzMi1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4ZGM3MC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyogQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9hcmMuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBhcmNfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyBib29sZWFuIGFyY19lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi0vKiBUcnkgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBzcGFjZSBvY2N1cGllZCBieSByZWxvY2F0aW9uIHRhYmxlcwotICAgb24gdGhlIFJPTSAobm90IHRoYXQgdGhlIFJPTSB3b24ndCBiZSBzd2FtcGVkIGJ5IG90aGVyIEVMRiBvdmVyaGVhZCkuICAqLwotI2RlZmluZSBVU0VfUkVMCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9hcmNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfQVJDX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJDX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9BUkNfMzIsCQkvKiB0eXBlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ18zMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwgICAJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9BUkNfQjI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ19CMjYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIyIGJpdCBicmFuY2g7IGJpdHMgMjEtMiBhcmUgc3RvcmVkIGluIGJpdHMgMjYtNy4gICovCi0gIEhPV1RPIChSX0FSQ19CMjJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA3LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfQjIyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwN2ZmZmY4MCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZmZmODAsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBBUkMgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGFyY19yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX3JlbG9jX21hcCBhcmNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0FSQ19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9BUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9BUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfQVJDX0IyNiwgUl9BUkNfQjI2IH0sCi0gIHsgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsIFJfQVJDX0IyMl9QQ1JFTCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgYXJjX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9hcmNfaG93dG9fdGFibGVbYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gQVJDIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1hcmNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9BUkNfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfYXJjX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGFuIEFSQyBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hcmNfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBtYWNoOwotICB1bnNpZ25lZCBsb25nIGFyY2ggPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FSQ19NQUNIOwotCi0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBFX0FSQ19NQUNIX0JBU0U6Ci0gICAgICBtYWNoID0gYmZkX21hY2hfYXJjX2Jhc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVW5rbm93biBjcHUgdHlwZS4gID8/PyBXaGF0IHRvIGRvPyAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FyYywgbWFjaCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGFuIEFSQyBFTEYgb2JqZWN0IGZpbGUuCi0gICBUaGlzIGdldHMgdGhlIEFSQyBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBtYWNoOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBzd2l0Y2ggKG1hY2ggPSBiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX2FyY19iYXNlOgotICAgICAgdmFsID0gRV9BUkNfTUFDSF9CQVNFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX0FSQ19NQUNIOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1saXR0bGVhcmMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfYmlnYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1iaWdhcmMiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9hcmMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfQVJDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJYXJjX2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCWFyY19lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJYXJjX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1hcm0uaCBiL2JmZC9lbGYzMi1hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1ZTBjZC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjI1ICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNCi0gICBDb3B5cmlnaHQgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgaW5zbjMyOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgaW5zbjE2OwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgaW50IGVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUKLSAgUEFSQU1TICgoIEVsZl9JbnRlcm5hbF9TeW0gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjMyX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLXN0YXRpYyBpbnNuMzIgaW5zZXJ0X3RodW1iX2JyYW5jaAotICBQQVJBTVMgKChpbnNuMzIsIGludCkpOwotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpmaW5kX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgQ09OU1QgY2hhciAqLCBiZmQgKikpOwotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpmaW5kX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IGVsZjMyX2FybV90b190aHVtYl9zdHViCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIGFzZWN0aW9uICosIGJmZF92bWEsIGJmZF9zaWduZWRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50IGVsZjMyX3RodW1iX3RvX2FybV9zdHViCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIGFzZWN0aW9uICosIGJmZF92bWEsIGJmZF9zaWduZWRfdm1hLCBiZmRfdm1hKSk7Ci0KLS8qIFRoZSBsaW5rZXIgc2NyaXB0IGtub3dzIHRoZSBzZWN0aW9uIG5hbWVzIGZvciBwbGFjZW1lbnQuCi0gICBUaGUgZW50cnlfbmFtZXMgYXJlIHVzZWQgdG8gZG8gc2ltcGxlIG5hbWUgbWFuZ2xpbmcgb24gdGhlIHN0dWJzLgotICAgR2l2ZW4gYSBmdW5jdGlvbiBuYW1lLCBhbmQgaXRzIHR5cGUsIHRoZSBzdHViIGNhbiBiZSBmb3VuZC4gVGhlCi0gICBuYW1lIGNhbiBiZSBjaGFuZ2VkLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGUgJXMgYmUgcHJlc2VudC4KLSAqLwotCi0jZGVmaW5lIElOVEVSV09SS19GTEFHKCBhYmZkICkgICAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0KLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83dCIKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fdGh1bWIiCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83IgotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV9hcm0iCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAgICAgIi91c3IvbGliL2xkLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTYKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZQotICAgdGhpcy4gIEl0IGlzIHNldCB1cCBzbyB0aGF0IGFueSBzaGFyZWQgbGlicmFyeSBmdW5jdGlvbiB0aGF0IGlzCi0gICBjYWxsZWQgYmVmb3JlIHRoZSByZWxvY2F0aW9uIGhhcyBiZWVuIHNldCB1cCBjYWxscyB0aGUgZHluYW1pYwotICAgbGlua2VyIGZpcnN0ICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGYzMl9hcm1fcGx0MF9lbnRyeSBbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHgwNCwgMHhlMCwgMHgyZCwgMHhlNSwJLyogc3RyICAgbHIsIFtzcCwgIy00XSEgICAgICovCi0gIDB4MTAsIDB4ZTAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgIGxyLCBbcGMsICMxNl0gICAgICAqLwotICAweDBlLCAweGUwLCAweDhmLCAweGUwLAkvKiBhZHIgICBsciwgcGMsIGxyICAgICAgICAgKi8KLSAgMHgwOCwgMHhmMCwgMHhiZSwgMHhlNQkvKiBsZHIgICBwYywgW2xyLCAjOF0hICAgICAgKi8KLX07Ci0KLS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZQotICAgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGYzMl9hcm1fcGx0X2VudHJ5IFtQTFRfRU5UUllfU0laRV0gPQotewotICAweDA0LCAweGMwLCAweDlmLCAweGU1LAkvKiBsZHIgICBpcCwgW3BjLCAjNF0gICAgICAgKi8KLSAgMHgwYywgMHhjMCwgMHg4ZiwgMHhlMCwJLyogYWRkICAgaXAsIHBjLCBpcCAgICAgICAgICovCi0gIDB4MDAsIDB4ZjAsIDB4OWMsIDB4ZTUsCS8qIGxkciAgIHBjLCBbaXBdICAgICAgICAgICAqLwotICAweDAwLCAweDAwLCAweDAwLCAweDAwICAgICAgICAvKiBvZmZzZXQgdG8gc3ltYm9sIGluIGdvdCAgKi8KLX07Ci0KLQotLyogVGhlIEFSTSBsaW5rZXIgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHJlbG9jcyB0aGF0IGl0Ci0gICBkZWNpZGVzIHRvIGNvcHkgaW4gY2hlY2tfcmVsb2NzIGZvciBlYWNoIHN5bWJvbC4gIFRoaXMgaXMgc28gdGhhdAotICAgaXQgY2FuIGRpc2NhcmQgUEMgcmVsYXRpdmUgcmVsb2NzIGlmIGl0IGRvZXNuJ3QgbmVlZCB0aGVtIHdoZW4KLSAgIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLiAgV2Ugc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIGEgZmllbGQKLSAgIGV4dGVuZGluZyB0aGUgcmVndWxhciBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyB3ZQotICAgaGF2ZSBjb3BpZWQgZm9yIGEgZ2l2ZW4gc3ltYm9sLiAgKi8KLQotc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIG5leHQ7Ci0gIC8qIEEgc2VjdGlvbiBpbiBkeW5vYmouICAqLwotICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBBcm0gRUxGIGxpbmtlciBoYXNoIGVudHJ5LiAgKi8KLQotc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBwY3JlbF9yZWxvY3NfY29waWVkOwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBUcmF2ZXJzZSBhbiBhcm0gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9hcm1fbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgQVJNIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGVsZjMyX2FybV9oYXNoX3RhYmxlKGluZm8pIFwKLSAgKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSAoKGluZm8pLT5oYXNoKSkKLQotLyogQVJNIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSAqLwotc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUKLSAgewotICAgIC8qIFRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgVGh1bWItdG8tQVJNIGdsdWUuICAqLwotICAgIGxvbmcgaW50IHRodW1iX2dsdWVfc2l6ZTsKLQotICAgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBBUk0tdG8tVGh1bWIgZ2x1ZS4gICovCi0gICAgbG9uZyBpbnQgYXJtX2dsdWVfc2l6ZTsKLQotICAgIC8qIEFuIGFyYml0YXJ5IGlucHV0IEJGRCBjaG9zZW4gdG8gaG9sZCB0aGUgZ2x1ZSBzZWN0aW9ucy4gICovCi0gICAgYmZkICogYmZkX29mX2dsdWVfb3duZXI7Ci0KLSAgICAvKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtub3dsZWRnZSBvZiB0aGUgQVJNJ3MgcGlwZWxpbmUKLSAgICAgICBsZW5ndGggc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgaW50IG5vX3BpcGVsaW5lX2tub3dsZWRnZTsKLSAgfTsKLQotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gQVJNIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmMzJfYXJtX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqIHRhYmxlOwotICAgICBjb25zdCBjaGFyICogc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqIHJldCA9Ci0gICAgKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IE5VTEw7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gQVJNIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoIV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgIGVsZjMyX2FybV9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT50aHVtYl9nbHVlX3NpemUgPSAwOwotICByZXQtPmFybV9nbHVlX3NpemUgPSAwOwotICByZXQtPmJmZF9vZl9nbHVlX293bmVyID0gTlVMTDsKLSAgcmV0LT5ub19waXBlbGluZV9rbm93bGVkZ2UgPSAwOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgY2hhciAqdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBXZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgYXJtZWxmIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLwotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotICAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgaGFzaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChoYXNoID09IE5VTEwpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBoYXNoOwotfQotCi1zdGF0aWMgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF9hcm1fZ2x1ZSAobGlua19pbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIGVsZmFybSBzcGVjaWZpYyBoYXNoIHRhYmxlLiAgKi8KLSAgaGFzaF90YWJsZSA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0gICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAotICAgICgmKGhhc2hfdGFibGUpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAobXloID09IE5VTEwpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICByZXR1cm4gbXloOwotfQotCi0vKgotICAgQVJNLT5UaHVtYiBnbHVlOgotCi0gICAuYXJtCi0gICBfX2Z1bmNfZnJvbV9hcm06Ci0gICBsZHIgcjEyLCBfX2Z1bmNfYWRkcgotICAgYnggIHIxMgotICAgX19mdW5jX2FkZHI6Ci0gICAud29yZCBmdW5jICAgIEAgYmVoYXZlIGFzIGlmIHlvdSBzYXcgYSBBUk1fMzIgcmVsb2MKLSAqLwotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NJWkUgMTIKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0MV9sZHJfaW5zbiA9IDB4ZTU5ZmMwMDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDJfYnhfcjEyX2luc24gPSAweGUxMmZmZjFjOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQzX2Z1bmNfYWRkcl9pbnNuID0gMHgwMDAwMDAwMTsKLQotLyoKLSAgIFRodW1iLT5BUk06ICAgICAgICAgICAgICAgICAgICAgICAgICBUaHVtYi0+KG5vbi1pbnRlcndvcmtpbmcgYXdhcmUpIEFSTQotCi0gICAudGh1bWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRodW1iCi0gICAuYWxpZ24gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduIDIKLSAgIF9fZnVuY19mcm9tX3RodW1iOiAgICAgICAgICAgICAgX19mdW5jX2Zyb21fdGh1bWI6Ci0gICBieCBwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCB7cjYsIGxyfQotICAgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkciAgcjYsIF9fZnVuY19hZGRyCi0gICAuYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YgIGxyLCBwYwotICAgX19mdW5jX2NoYW5nZV90b19hcm06ICAgICAgICAgICAgICAgICAgICAgICAgYnggICByNgotICAgYiBmdW5jICAgICAgICAgICAgICAgICAgICAgICAuYXJtCi0gICBfX2Z1bmNfYmFja190b190aHVtYjoKLSAgIGxkbWlhIHIxMyEge3I2LCBscn0KLSAgIGJ4ICAgIGxyCi0gICBfX2Z1bmNfYWRkcjoKLSAgIC53b3JkICAgICAgICBmdW5jCi0gKi8KLQotI2RlZmluZSBUSFVNQjJBUk1fR0xVRV9TSVpFIDgKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9ieF9wY19pbnNuID0gMHg0Nzc4Owotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX25vb3BfaW5zbiA9IDB4NDZjMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhM19iX2luc24gPSAweGVhMDAwMDAwOwotCi1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfcHVzaF9pbnNuID0gMHhiNTQwOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX2xkcl9pbnNuID0gMHg0ZTAzOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEzX21vdl9pbnNuID0gMHg0NmZlOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmE0X2J4X2luc24gPSAweDQ3MzA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTVfcG9wX2luc24gPSAweGU4YmQ0MDQwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE2X2J4X2luc24gPSAweGUxMmZmZjFlOwotCi1ib29sZWFuCi1iZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBhc2VjdGlvbiAqIHM7Ci0gIGJmZF9ieXRlICogZm9vOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPmFybV9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgaWYgKGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAobGlua19pbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotewotICBjb25zdCBjaGFyICogbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogczsKLSAgY2hhciAqIHRtcF9uYW1lOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLSAgICAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0gICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAotICAgICgmKGdsb2JhbHMpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAobXloICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAodG1wX25hbWUpOwotICAgICAgcmV0dXJuOwkJCS8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICAvKiBUaGUgb25seSB0cmljayBoZXJlIGlzIHVzaW5nIGhhc2hfdGFibGUtPmFybV9nbHVlX3NpemUgYXMgdGhlIHZhbHVlLiBFdmVuCi0gICAgIHRob3VnaCB0aGUgc2VjdGlvbiBpc24ndCBhbGxvY2F0ZWQgeWV0LCB0aGlzIGlzIHdoZXJlIHdlIHdpbGwgYmUgcHV0dGluZwotICAgICBpdC4gICovCi0KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGxpbmtfaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCSAgICBCU0ZfR0xPQkFMLAotCQkJCSAgICBzLCBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICsgMSwKLQkJCQkgICAgTlVMTCwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJm15aCk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKz0gQVJNMlRIVU1CX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGxpbmtfaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgY2hhciAqdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpoYXNoX3RhYmxlOwotICBjaGFyIGJpbmQ7Ci0KLSAgaGFzaF90YWJsZSA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKGhhc2hfdGFibGUgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47CQkJLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChsaW5rX2luZm8sIGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCSAgICAgQlNGX0dMT0JBTCwgcywgaGFzaF90YWJsZS0+dGh1bWJfZ2x1ZV9zaXplICsgMSwKLQkJCQkgICAgTlVMTCwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJm15aCk7Ci0KLSAgLyogSWYgd2UgbWFyayBpdCAndGh1bWInLCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgZG8gYSBiZXR0ZXIgam9iLiAgKi8KLSAgYmluZCA9IEVMRl9TVF9CSU5EIChteWgtPnR5cGUpOwotICBteWgtPnR5cGUgPSBFTEZfU1RfSU5GTyAoYmluZCwgU1RUX0FSTV9URlVOQyk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIC8qIEFsbG9jYXRlIGFub3RoZXIgc3ltYm9sIHRvIG1hcmsgd2hlcmUgd2Ugc3dpdGNoIHRvIGFybSBtb2RlLiAgKi8KLQotI2RlZmluZSBDSEFOR0VfVE9fQVJNICJfXyVzX2NoYW5nZV90b19hcm0iCi0jZGVmaW5lIEJBQ0tfRlJPTV9BUk0gIl9fJXNfYmFja19mcm9tX2FybSIKLQotICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKENIQU5HRV9UT19BUk0pICsgMSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBDSEFOR0VfVE9fQVJNLCBuYW1lKTsKLQotICBteWggPSBOVUxMOwotCi0gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChsaW5rX2luZm8sIGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCSAgICAgIEJTRl9MT0NBTCwgcywgaGFzaF90YWJsZS0+dGh1bWJfZ2x1ZV9zaXplICsgNCwKLQkJCQkgICAgTlVMTCwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJm15aCk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIGhhc2hfdGFibGUtPnRodW1iX2dsdWVfc2l6ZSArPSBUSFVNQjJBUk1fR0xVRV9TSVpFOwotCi0gIHJldHVybjsKLX0KLQotLyogU2VsZWN0IGEgQkZEIHRvIGJlIHVzZWQgdG8gaG9sZCB0aGUgc2VjdGlvbnMgdXNlZCBieSB0aGUgZ2x1ZSBjb2RlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgbGlua2VyIHNjcmlwdHMgaW4gbGQvZW11bHRlbXBsLwotICAge2FybWVsZi9wZX0uZW0gICovCi1ib29sZWFuCi1iZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmdsb2JhbHM7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIC8qIElmIHdlIGFyZSBvbmx5IHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsgZG8gbm90IGJvdGhlcgotICAgICBnZXR0aW5nIGEgYmZkIHRvIGhvbGQgdGhlIGdsdWUuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm90ZTogd2UgZG8gbm90IGluY2x1ZGUgdGhlIGZsYWcgU0VDX0xJTktFUl9DUkVBVEVELCBhcyB0aGlzCi0JIHdpbGwgcHJldmVudCBlbGZfbGlua19pbnB1dF9iZmQoKSBmcm9tIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzCi0JIG9mIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfQ09ERSB8IFNFQ19SRUFET05MWTsKLQotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIGdjIG1hcmsgdG8gcHJldmVudCB0aGUgc2VjdGlvbiBmcm9tIGJlaW5nIHJlbW92ZWQgYnkgZ2FyYmFnZQotCSBjb2xsZWN0aW9uLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgbm8gcmVsb2NzIHJlZmVyIHRvIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBzZWMtPmdjX21hcmsgPSAxOwotICAgIH0KLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0NPREUgfCBTRUNfUkVBRE9OTFk7Ci0KLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc2VjLT5nY19tYXJrID0gMTsKLSAgICB9Ci0KLSAgLyogU2F2ZSB0aGUgYmZkIGZvciBsYXRlciB1c2UuICAqLwotICBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciA9IGFiZmQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgbGlua19pbmZvLCBub19waXBlbGluZV9rbm93bGVkZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgaW50IG5vX3BpcGVsaW5lX2tub3dsZWRnZTsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmdsb2JhbHM7Ci0KLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIHRvIGNvbnN0cnVjdCBhbnkgZ2x1ZS4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBIZXJlIHdlIGhhdmUgYSBiZmQgdGhhdCBpcyB0byBiZSBpbmNsdWRlZCBvbiB0aGUgbGluay4gIFdlIGhhdmUgYSBob29rCi0gICAgIHRvIGRvIHJlbG9jIHJ1bW1hZ2luZywgYmVmb3JlIHNlY3Rpb24gc2l6ZXMgYXJlIG5haWxlZCBkb3duLiAgKi8KLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgZ2xvYmFscy0+bm9fcGlwZWxpbmVfa25vd2xlZGdlID0gbm9fcGlwZWxpbmVfa25vd2xlZGdlOwotCi0gIC8qIFJ1bW1hZ2UgYXJvdW5kIGFsbCB0aGUgcmVsb2NzIGFuZCBtYXAgdGhlIGdsdWUgdmVjdG9ycy4gICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKDsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgICAvKiBMb2FkIHRoZSByZWxvY3MuICAqLwotCi0gICAgICBpcmVsID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLAotCQkJCQkoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLQotICAgICAgQkZEX0FTU0VSVCAoaXJlbCAhPSAwKTsKLQotICAgICAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JewotCSAgbG9uZyByX3R5cGU7Ci0JICB1bnNpZ25lZCBsb25nIHJfaW5kZXg7Ci0KLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7Ci0JICByX2luZGV4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyk7Ci0KLQkgIC8qIFRoZXNlIGFyZSB0aGUgb25seSByZWxvY2F0aW9uIHR5cGVzIHdlIGNhcmUgYWJvdXQgKi8KLQkgIGlmICggICByX3R5cGUgIT0gUl9BUk1fUEMyNAotCSAgICAgICYmIHJfdHlwZSAhPSBSX0FSTV9USE1fUEMyMikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCQljb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkJICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLQkgIGlmIChleHRzeW1zID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkJZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JCSAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJCSAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIG5vdCBhZ2FpbnN0IGEgc3ltYm9sIGl0IGNhbm5vdCBjb25jZXJuIHVzLiAqLwotCi0JICBoID0gTlVMTDsKLQotCSAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBsb2NhbCBzeW1ib2xzICovCi0JICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCAqLwotCSAgcl9pbmRleCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgICBlbGZfc3ltX2hhc2hlcyAoYWJmZClbcl9pbmRleF07Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIGFnYWluc3QgYSBzdGF0aWMgc3ltYm9sIGl0IG11c3QgYmUgd2l0aGluCi0JICAgICB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCBzbyBjYW5ub3QgYmUgYSBjcm9zcyBBUk0vVGh1bWIgcmVsb2NhdGlvbi4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX0FSTV9QQzI0OgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIGFybSBjb2RlLiAgV2UgbmVlZCB0byBsb29rIHVwCi0JICAgICAgICAgdGhlIHRhcmdldCBvZiB0aGUgY2FsbC4gSWYgaXQgaXMgYSB0aHVtYiB0YXJnZXQsIHdlCi0JICAgICAgICAgaW5zZXJ0IGdsdWUuICAqLwotCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFKGgtPnR5cGUpID09IFNUVF9BUk1fVEZVTkMpCi0JCXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAobGlua19pbmZvLCBoKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfQVJNX1RITV9QQzIyOgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIHRodW1iIGNvZGUuICBXZSBsb29rCi0JICAgICAgICAgdXAgdGhlIHRhcmdldCBvZiB0aGUgY2FsbC4gSWYgaXQgaXMgbm90IGEgdGh1bWIKLSAgICAgICAgICAgICAgICAgdGFyZ2V0LCB3ZSBpbnNlcnQgZ2x1ZS4gICovCi0KLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKGgtPnR5cGUpICE9IFNUVF9BUk1fVEZVTkMpCi0JCXJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSAobGlua19pbmZvLCBoKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLWVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotCi19Ci0KLS8qIFRoZSB0aHVtYiBmb3JtIG9mIGEgbG9uZyBicmFuY2ggaXMgYSBiaXQgZmluaWNreSwgYmVjYXVzZSB0aGUgb2Zmc2V0Ci0gICBlbmNvZGluZyBpcyBzcGxpdCBvdmVyIHR3byBmaWVsZHMsIGVhY2ggaW4gaXQncyBvd24gaW5zdHJ1Y3Rpb24uIFRoZXkKLSAgIGNhbiBvY2N1ciBpbiBhbnkgb3JkZXIuIFNvIGdpdmVuIGEgdGh1bWIgZm9ybSBvZiBsb25nIGJyYW5jaCwgYW5kIGFuCi0gICBvZmZzZXQsIGluc2VydCB0aGUgb2Zmc2V0IGludG8gdGhlIHRodW1iIGJyYW5jaCBhbmQgcmV0dXJuIGZpbmlzaGVkCi0gICBpbnN0cnVjdGlvbi4KLQotICAgSXQgdGFrZXMgdHdvIHRodW1iIGluc3RydWN0aW9ucyB0byBlbmNvZGUgdGhlIHRhcmdldCBhZGRyZXNzLiBFYWNoIGhhcwotICAgMTEgYml0cyB0byBpbnZlc3QuIFRoZSB1cHBlciAxMSBiaXRzIGFyZSBzdG9yZWQgaW4gb25lIChpZGVudGlmZWQgYnkKLSAgIEgtMC4uIHNlZSBiZWxvdyksIHRoZSBsb3dlciAxMSBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIG90aGVyIChpZGVudGlmaWVkCi0gICBieSBILTEpLgotCi0gICBDb21iaW5lIHRvZ2V0aGVyIGFuZCBzaGlmdGVkIGxlZnQgYnkgMSAoaXQncyBhIGhhbGYgd29yZCBhZGRyZXNzKSBhbmQKLSAgIHRoZXJlIHlvdSBoYXZlIGl0LgotCi0gICBPcDogMTExMSA9IEYsCi0gICBILTAsIHVwcGVyIGFkZHJlc3MtMCA9IDAwMAotICAgT3A6IDExMTEgPSBGLAotICAgSC0xLCBsb3dlciBhZGRyZXNzLTAgPSA4MDAKLQotICAgVGhleSBjYW4gYmUgb3JkZXJlZCBlaXRoZXIgd2F5LCBidXQgdGhlIGFybSB0b29scyBJJ3ZlIHNlZW4gYWx3YXlzIHB1dAotICAgdGhlIGxvd2VyIG9uZSBmaXJzdC4gSXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIuIGtya0BjeWdudXMuY29tCi0KLSAgIFhYWDogIEFjdHVhbGx5IHRoZSBvcmRlciBkb2VzIG1hdHRlci4gIFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gKEgtMSkKLSAgIG1vdmVzIHRoZSBjb21wdXRlZCBhZGRyZXNzIGludG8gdGhlIFBDLCBzbyBpdCBtdXN0IGJlIHRoZSBzZWNvbmQgb25lCi0gICBpbiB0aGUgc2VxdWVuY2UuICBUaGUgcHJvYmxlbSwgaG93ZXZlciBpcyB0aGF0IHdoaWxzdCBsaXR0bGUgZW5kaWFuIGNvZGUKLSAgIHN0b3JlcyB0aGUgaW5zdHJ1Y3Rpb25zIGluIEhJIHRoZW4gTE9XIG9yZGVyLCBiaWcgZW5kaWFuIGNvZGUgZG9lcyB0aGUKLSAgIHJldmVyc2UuICBuaWNrY0BjeWdudXMuY29tICAqLwotCi0jZGVmaW5lIExPV19ISV9PUkRFUiAweEY4MDBGMDAwCi0jZGVmaW5lIEhJX0xPV19PUkRFUiAweEYwMDBGODAwCi0KLXN0YXRpYyBpbnNuMzIKLWluc2VydF90aHVtYl9icmFuY2ggKGJyX2luc24sIHJlbF9vZmYpCi0gICAgIGluc24zMiBicl9pbnNuOwotICAgICBpbnQgcmVsX29mZjsKLXsKLSAgdW5zaWduZWQgaW50IGxvd19iaXRzOwotICB1bnNpZ25lZCBpbnQgaGlnaF9iaXRzOwotCi0KLSAgQkZEX0FTU0VSVCAoKHJlbF9vZmYgJiAxKSAhPSAxKTsKLQotICByZWxfb2ZmID4+PSAxOwkJLyogaGFsZiB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLwotICBsb3dfYml0cyA9IHJlbF9vZmYgJiAweDAwMDAwN0ZGOwkvKiB0aGUgYm90dG9tIDExIGJpdHMgKi8KLSAgaGlnaF9iaXRzID0gKHJlbF9vZmYgPj4gMTEpICYgMHgwMDAwMDdGRjsJLyogdGhlIHRvcCAxMSBiaXRzICovCi0KLSAgaWYgKChicl9pbnNuICYgTE9XX0hJX09SREVSKSA9PSBMT1dfSElfT1JERVIpCi0gICAgYnJfaW5zbiA9IExPV19ISV9PUkRFUiB8IChsb3dfYml0cyA8PCAxNikgfCBoaWdoX2JpdHM7Ci0gIGVsc2UgaWYgKChicl9pbnNuICYgSElfTE9XX09SREVSKSA9PSBISV9MT1dfT1JERVIpCi0gICAgYnJfaW5zbiA9IEhJX0xPV19PUkRFUiB8IChoaWdoX2JpdHMgPDwgMTYpIHwgbG93X2JpdHM7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsJCQkvKiBlcnJvciAtIG5vdCBhIHZhbGlkIGJyYW5jaCBpbnN0cnVjdGlvbiBmb3JtICovCi0KLSAgLyogRklYTUU6IGFib3J0IGlzIHByb2JhYmx5IG5vdCB0aGUgcmlnaHQgY2FsbC4ga3JrQGN5Z251cy5jb20gKi8KLQotICByZXR1cm4gYnJfaW5zbjsKLX0KLQotLyogVGh1bWIgY29kZSBjYWxsaW5nIGFuIEFSTSBmdW5jdGlvbiAqLwotc3RhdGljIGludAotZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBoaXRfZGF0YSwgc3ltX3NlYywgb2Zmc2V0LCBhZGRlbmQsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIG5hbWU7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBoaXRfZGF0YTsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBzeW1fc2VjOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICAgYmZkX3NpZ25lZF92bWEgICAgICAgICBhZGRlbmQ7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgdmFsOwotewotICBhc2VjdGlvbiAqIHMgPSAwOwotICBsb25nIGludCBteV9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHRtcDsKLSAgbG9uZyBpbnQgcmV0X29mZnNldDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBteWggPSBmaW5kX3RodW1iX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0gIGlmIChteWggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwKLQkJCSAgICAgICBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPmNvbnRlbnRzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKTsKLQotICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0gICAgewotICAgICAgaWYgKHN5bV9zZWMgIT0gTlVMTAotCSAgJiYgc3ltX3NlYy0+b3duZXIgIT0gTlVMTAotCSAgJiYgIUlOVEVSV09SS19GTEFHIChzeW1fc2VjLT5vd25lcikpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JICAgIChfICgiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzeW1fc2VjLT5vd25lciksIG5hbWUpOwotCSAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JICAgIChfICgiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogdGh1bWIgY2FsbCB0byBhcm0iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCi0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAtLW15X29mZnNldDsKLSAgICAgIG15aC0+cm9vdC51LmRlZi52YWx1ZSA9IG15X29mZnNldDsKLQotICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9ieF9wY19pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQotICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9ub29wX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAyKTsKLQotICAgICAgcmV0X29mZnNldCA9Ci0JKChiZmRfc2lnbmVkX3ZtYSkgdmFsKQkvKiBBZGRyZXNzIG9mIGRlc3RpbmF0aW9uIG9mIHRoZSBzdHViICovCi0JLSAoKGJmZF9zaWduZWRfdm1hKQotCSAgIChzLT5vdXRwdXRfb2Zmc2V0CS8qIE9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgc3R1YnMuICAqLwotCSAgICArIG15X29mZnNldAkJLyogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGlzIHN0dWIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkgICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hKQkvKiBBZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLQkgICArIDQJCQkvKiBUaGUgYnJhbmNoIGluc3RydWN0aW9uIGlzIDQgYnl0ZXMgaW50byB0aGUgc3R1Yi4gICovCi0JICAgKyA4KTsJCS8qIEFSTSBicmFuY2hlcyB3b3JrIGZyb20gdGhlIHBjIG9mIHRoZSBpbnN0cnVjdGlvbiArIDguICAqLwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIHQyYTNfYl9pbnNuIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRiksCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0KLSAgLyogTm93IGdvIGJhY2sgYW5kIGZpeCB1cCB0aGUgb3JpZ2luYWwgQkwgaW5zbiB0byBwb2ludAotICAgICB0byBoZXJlLiAgKi8KLSAgcmV0X29mZnNldCA9Ci0gICAgcy0+b3V0cHV0X29mZnNldAotICAgICsgbXlfb2Zmc2V0Ci0gICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICsgb2Zmc2V0ICsgYWRkZW5kKQotICAgIC0gNDsKLQotICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhCi0JCSAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkgICAgICBpbnNlcnRfdGh1bWJfYnJhbmNoICh0bXAsIHJldF9vZmZzZXQpLAotCSAgICAgIGhpdF9kYXRhIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXJtIGNvZGUgY2FsbGluZyBhIFRodW1iIGZ1bmN0aW9uICovCi1zdGF0aWMgaW50Ci1lbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJIGhpdF9kYXRhLCBzeW1fc2VjLCBvZmZzZXQsIGFkZGVuZCwgdmFsKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgbmFtZTsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGhpdF9kYXRhOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIHN5bV9zZWM7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgb2Zmc2V0OwotICAgICBiZmRfc2lnbmVkX3ZtYSAgICAgICAgIGFkZGVuZDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICB2YWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHRtcDsKLSAgbG9uZyBpbnQgbXlfb2Zmc2V0OwotICBhc2VjdGlvbiAqIHM7Ci0gIGxvbmcgaW50IHJldF9vZmZzZXQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgbXloID0gZmluZF9hcm1fZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIG15X29mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwKLQkJCSAgICAgICBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0KLSAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotICAgIHsKLSAgICAgIGlmIChzeW1fc2VjICE9IE5VTEwKLQkgICYmIHN5bV9zZWMtPm93bmVyICE9IE5VTEwKLQkgICYmICFJTlRFUldPUktfRkxBRyAoc3ltX3NlYy0+b3duZXIpKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc3ltX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IGFybSBjYWxsIHRvIHRodW1iIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQl9Ci0gICAgICAtLW15X29mZnNldDsKLSAgICAgIG15aC0+cm9vdC51LmRlZi52YWx1ZSA9IG15X29mZnNldDsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0MV9sZHJfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDJfYnhfcjEyX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQotICAgICAgLyogSXQncyBhIHRodW1iIGFkZHJlc3MuICBBZGQgdGhlIGxvdyBvcmRlciBiaXQuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsIHwgYTJ0M19mdW5jX2FkZHJfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDgpOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0KLSAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0gIHRtcCA9IHRtcCAmIDB4RkYwMDAwMDA7Ci0KLSAgLyogU29tZWhvdyB0aGVzZSBhcmUgYm90aCA0IHRvbyBmYXIsIHNvIHN1YnRyYWN0IDguICovCi0gIHJldF9vZmZzZXQgPSBzLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyBteV9vZmZzZXQKLSAgICArIHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgKyBvZmZzZXQgKyBhZGRlbmQpCi0gICAgLSA4OwotICAKLSAgdG1wID0gdG1wIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRik7Ci0KLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdG1wLCBoaXRfZGF0YQotCSAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwgdmFsdWUsCi0JCQkgICAgICAgaW5mbywgc3ltX3NlYywgc3ltX25hbWUsIHN5bV9mbGFncywgaCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICB2YWx1ZTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIHN5bV9zZWM7Ci0gICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgc3ltX25hbWU7Ci0gICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgc3ltX2ZsYWdzOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgaGl0X2RhdGEgPSBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQ7Ci0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGR5bm9iaiA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKiAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2dvdF9vZmZzZXRzOwotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICBzZ290ID0gTlVMTDsKLSAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgc3BsdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgIHNyZWxvYyA9IE5VTEw7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgYmZkX3NpZ25lZF92bWEgICAgICAgICAgICAgICAgc2lnbmVkX2FkZGVuZDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGlmIChkeW5vYmopCi0gICAgewotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICB9Ci0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0jaWZkZWYgVVNFX1JFTAotICBhZGRlbmQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIGhvd3RvLT5zcmNfbWFzazsKLQotICBpZiAoYWRkZW5kICYgKChob3d0by0+c3JjX21hc2sgKyAxKSA+PiAxKSkKLSAgICB7Ci0gICAgICBzaWduZWRfYWRkZW5kID0gLTE7Ci0gICAgICBzaWduZWRfYWRkZW5kICY9IH4gaG93dG8tPnNyY19tYXNrOwotICAgICAgc2lnbmVkX2FkZGVuZCB8PSBhZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgc2lnbmVkX2FkZGVuZCA9IGFkZGVuZDsKLSNlbHNlCi0gIGFkZGVuZCA9IHNpZ25lZF9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotI2VuZGlmCi0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9BUk1fTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0gICAgY2FzZSBSX0FSTV9BQlMzMjoKLSAgICBjYXNlIFJfQVJNX1JFTDMyOgotICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMgYXJlIGNvcGllZAotCSBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4gdGltZS4gKi8KLQotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKHJfdHlwZSAhPSBSX0FSTV9QQzI0Ci0gCSAgICAgIHx8IChoICE9IE5VTEwKLQkgICAgICAgICAgJiYgaC0+ZHluaW5keCAhPSAtMQotCQkgICYmICghIGluZm8tPnN5bWJvbGljCi0JCSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQkgIGJvb2xlYW4gc2tpcCwgcmVsb2NhdGU7Ci0KLQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotCi0JICAgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgIChpbnB1dF9iZmQsCi0JCSAgICAgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkgICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCXJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0JICAgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JCQkgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJCQkgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkgICAgIG5hbWUgKyA0KSA9PSAwKTsKLQotCSAgICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBza2lwID0gZmFsc2U7Ci0KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JICAgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJICAgICAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAmIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpKTsKLQkgICAgICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJc2tpcCA9IHRydWU7Ci0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCSAgICB9Ci0KLQkgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgaWYgKHNraXApCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCSAgICAgIHJlbG9jYXRlID0gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX0FSTV9QQzI0KQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMICYmIGgtPmR5bmluZHggIT0gLTEpOwotCSAgICAgIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbG9jYXRlID0gZmFsc2U7Ci0JICAgICAgZWxzZQotCQlyZWxvY2F0ZSA9IHRydWU7Ci0JICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fUEMyNCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChoID09IE5VTEwKLQkJICB8fCAoKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JCXsKLQkJICByZWxvY2F0ZSA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCSAgZWxzZQotCQkgICAgcmVsb2NhdGUgPSB0cnVlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfQVJNX0FCUzMyKTsKLQkJfQotCSAgICB9Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJICAgICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkgICAgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCSAgCi0JICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkbyBub3Qgd2FudCB0bwotCSAgICAgZmlkZGxlIHdpdGggdGhlIGFkZGVuZC4gIE90aGVyd2lzZSwgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBzeW1ib2wKLQkgICAgIHZhbHVlIHNvIHRoYXQgaXQgYmVjb21lcyBhbiBhZGRlbmQgZm9yIHRoZSBkeW5hbWljIHJlbG9jLiAqLwotCSAgaWYgKCEgcmVsb2NhdGUpCi0JICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLQkgIAotCSAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotCQkJCQkgICAoYmZkX3ZtYSkgMCk7Ci0JfQotICAgICAgZWxzZSBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX0FSTV9QQzI0OgotCSAgLyogQXJtIEIvQkwgaW5zdHJ1Y3Rpb24gKi8KLQotCSAgLyogQ2hlY2sgZm9yIGFybSBjYWxsaW5nIHRodW1iIGZ1bmN0aW9uLiAgKi8KLQkgIGlmIChzeW1fZmxhZ3MgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgewotCSAgICAgIGVsZjMyX2FybV90b190aHVtYl9zdHViIChpbmZvLCBzeW1fbmFtZSwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLCBoaXRfZGF0YSwgc3ltX3NlYywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgICAgc2lnbmVkX2FkZGVuZCwgdmFsdWUpOwotCSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0JICAgIH0KLQotCSAgaWYgKCAgIHN0cmNtcCAoYmZkX2dldF90YXJnZXQgKGlucHV0X2JmZCksICJlbGYzMi1saXR0bGVhcm0tb2FiaSIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItYmlnYXJtLW9hYmkiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhlIG9sZCB3YXkgb2YgZG9pbmcgdGhpbmdzLiAgVHJlYXJpbmcgdGhlIGFkZGVuZCBhcyBhCi0JCSBieXRlIHNpemVkIGZpZWxkIGFuZCBhZGRpbmcgaW4gdGhlIHBpcGVsaW5lIG9mZnNldC4gICovCi0KLQkgICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB2YWx1ZSAtPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotCSAgICAgIGlmICghIGdsb2JhbHMtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSkKLQkJdmFsdWUgLT0gODsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhlIEFSTSBFTEYgQUJJIHNheXMgdGhhdCB0aGlzIHJlbG9jIGlzIGNvbXB1dGVkIGFzOiBTIC0gUCArIEEKLQkJIHdoZXJlOgotCQkgIFMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBpbiB0aGUgcmVsb2NhdGlvbi4KLQkJICBQIGlzIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIGJlaW5nIHJlbG9jYXRlZC4KLQkJICBBIGlzIHRoZSBhZGRlbmQgKGV4dHJhY3RlZCBmcm9tIHRoZSBpbnN0cnVjdGlvbikgaW4gYnl0ZXMuCi0KLQkJIFMgaXMgaGVsZCBpbiAndmFsdWUnLgotCQkgUCBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGluc3RydWN0aW9uCi0JCSAgIHBsdXMgdGhlIG9mZnNldCBvZiB0aGUgcmVsb2MgaW50byB0aGF0IHNlY3Rpb24sIGllOgotCQkgICAgIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJICAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpLgotCQkgQSBpcyB0aGUgYWRkZW5kLCBjb252ZXJ0ZWQgaW50byBieXRlcywgaWU6Ci0JCSAgICAgKHNpZ25lZF9hZGRlbmQgKiA0KQotCi0JCSBOb3RlOiBOb25lIG9mIHRoZXNlIG9wZXJhdGlvbnMgaGF2ZSBrbm93bGVkZ2Ugb2YgdGhlIHBpcGVsaW5lCi0JCSBzaXplIG9mIHRoZSBwcm9jZXNzb3IsIHRodXMgaXQgaXMgdXAgdG8gdGhlIGFzc2VtYmxlciB0byBlbmNvZGUKLQkJIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgYWRkZW5kLiAgKi8KLQotCSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIHZhbHVlIC09IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgdmFsdWUgKz0gKHNpZ25lZF9hZGRlbmQgPDwgaG93dG8tPnNpemUpOwotCi0JICAgICAgLyogUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBjb2RlIGFsc28gdXNlZCB0byBhZGQgaW4gdGhlIHBpcGVsaW5lCi0JCSBvZmZzZXQgaGVyZS4gIFRoaXMgaXMgd3JvbmcgYmVjYXVzZSB0aGUgbGlua2VyIGlzIG5vdCBzdXBwb3NlZAotCQkgdG8ga25vdyBhYm91dCBzdWNoIHRoaW5ncywgYW5kIG9uZSBkYXkgaXQgbWlnaHQgY2hhbmdlLiAgSW4gb3JkZXIKLQkJIHRvIHN1cHBvcnQgb2xkIGJpbmFyaWVzIHRoYXQgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciBob3dldmVyLCBzbwotCQkgd2UgYXR0ZW1wdCB0byBkZXRlY3Qgd2hpY2ggQUJJIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcmVsb2MuICAqLwotCSAgICAgIGlmICghIGdsb2JhbHMtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSkKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9FaGRyICogaV9laGRycDsgLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0KLQkJICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKTsKLQotCQkgIGlmIChpX2VoZHJwLT5lX2lkZW50W0VJX09TQUJJXSA9PSAwKQotCQkgICAgdmFsdWUgLT0gODsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEl0IGlzIG5vdCBhbiBlcnJvciBmb3IgYW4gdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlIHRvIGJlCi0JICAgICBvdXQgb2YgcmFuZ2UuICBBbnkgcHJvZ3JhbSB0aGF0IGJyYW5jaGVzIHRvIHN1Y2ggYSBzeW1ib2wKLQkgICAgIGlzIGdvaW5nIHRvIGNyYXNoIGFueXdheSwgc28gdGhlcmUgaXMgbm8gcG9pbnQgd29ycnlpbmcgCi0JICAgICBhYm91dCBnZXR0aW5nIHRoZSBkZXN0aW5hdGlvbiBleGFjdGx5IHJpZ2h0LiAgKi8JICAgICAKLQkgIGlmICghIGggfHwgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogUGVyZm9ybSBhIHNpZ25lZCByYW5nZSBjaGVjay4gICovCi0JICAgICAgc2lnbmVkX2FkZGVuZCA9IHZhbHVlOwotCSAgICAgIHNpZ25lZF9hZGRlbmQgPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotCSAgICAgIGlmIChzaWduZWRfYWRkZW5kID4gKChiZmRfc2lnbmVkX3ZtYSkoaG93dG8tPmRzdF9tYXNrID4+IDEpKQotCQkgIHx8IHNpZ25lZF9hZGRlbmQgPCAtICgoYmZkX3NpZ25lZF92bWEpICgoaG93dG8tPmRzdF9tYXNrICsgMSkgPj4gMSkpKQotCQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgICB9Ci0JICAgICAgCi0JICB2YWx1ZSA9IChzaWduZWRfYWRkZW5kICYgaG93dG8tPmRzdF9tYXNrKQotCSAgICB8IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmICh+IGhvd3RvLT5kc3RfbWFzaykpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQVJNX0FCUzMyOgotCSAgdmFsdWUgKz0gYWRkZW5kOwotCSAgaWYgKHN5bV9mbGFncyA9PSBTVFRfQVJNX1RGVU5DKQotCSAgICB2YWx1ZSB8PSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQVJNX1JFTDMyOgotCSAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSArPSBhZGRlbmQ7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzg6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZiB8fCAobG9uZykgdmFsdWUgPCAtMHg4MCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzE2OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZmZmIHx8IChsb25nKSB2YWx1ZSA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fQUJTMTI6Ci0gICAgICAvKiBTdXBwb3J0IGxkciBhbmQgc3RyIGluc3RydWN0aW9uIGZvciB0aGUgYXJtICovCi0gICAgICAvKiBBbHNvIHRodW1iIGIgKHVuY29uZGl0aW9uYWwgYnJhbmNoKS4gID8/PyBSZWFsbHk/ICAqLwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZmYgfHwgKGxvbmcpIHZhbHVlIDwgLTB4ODAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIHZhbHVlIHw9IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIDB4ZmZmZmYwMDApOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fVEhNX0FCUzU6Ci0gICAgICAvKiBTdXBwb3J0IGxkciBhbmQgc3RyIGluc3RydWN0aW9ucyBmb3IgdGhlIHRodW1iLiAqLwotI2lmZGVmIFVTRV9SRUwKLSAgICAgIC8qIE5lZWQgdG8gcmVmZXRjaCBhZGRlbmQuICAqLwotICAgICAgYWRkZW5kID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiBob3d0by0+c3JjX21hc2s7Ci0gICAgICAvKiA/Pz8gTmVlZCB0byBkZXRlcm1pbmUgc2hpZnQgYW1vdW50IGZyb20gb3BlcmFuZCBzaXplLiAgKi8KLSAgICAgIGFkZGVuZCA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0jZW5kaWYKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgLyogPz8/IElzbid0IHZhbHVlIHVuc2lnbmVkPyAgKi8KLSAgICAgIGlmICgobG9uZykgdmFsdWUgPiAweDFmIHx8IChsb25nKSB2YWx1ZSA8IC0weDEwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIC8qID8/PyBWYWx1ZSBuZWVkcyB0byBiZSBwcm9wZXJseSBzaGlmdGVkIGludG8gcGxhY2UgZmlyc3QuICAqLwotICAgICAgdmFsdWUgfD0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGY4M2Y7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLSAgICAgIC8qIFRodW1iIEJMIChicmFuY2ggbG9uZyBpbnN0cnVjdGlvbikuICovCi0gICAgICB7Ci0JYmZkX3ZtYSAgICAgICAgcmVsb2NhdGlvbjsKLQlib29sZWFuICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOwotCWJmZF92bWEgICAgICAgIHVwcGVyX2luc24gPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGhpdF9kYXRhKTsKLQliZmRfdm1hICAgICAgICBsb3dlcl9pbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSArIDIpOwotCWJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCWJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9taW4gPSB+IHJlbG9jX3NpZ25lZF9tYXg7Ci0JYmZkX3ZtYSAgICAgICAgY2hlY2s7Ci0JYmZkX3NpZ25lZF92bWEgc2lnbmVkX2NoZWNrOwotCi0jaWZkZWYgVVNFX1JFTAotCS8qIE5lZWQgdG8gcmVmZXRjaCB0aGUgYWRkZW5kIGFuZCBzcXVpc2ggdGhlIHR3byAxMSBiaXQgcGllY2VzCi0JICAgdG9nZXRoZXIuICAqLwotCXsKLQkgIGJmZF92bWEgdXBwZXIgPSB1cHBlcl9pbnNuICYgMHg3ZmY7Ci0JICBiZmRfdm1hIGxvd2VyID0gbG93ZXJfaW5zbiAmIDB4N2ZmOwotCSAgdXBwZXIgPSAodXBwZXIgXiAweDQwMCkgLSAweDQwMDsgLyogc2lnbiBleHRlbmQgKi8KLQkgIGFkZGVuZCA9ICh1cHBlciA8PCAxMikgfCAobG93ZXIgPDwgMSk7Ci0JICBzaWduZWRfYWRkZW5kID0gYWRkZW5kOwotCX0KLSNlbmRpZgotCi0gICAgICAgIC8qIElmIGl0IGlzIG5vdCBhIGNhbGwgdG8gdGh1bWIsIGFzc3VtZSBjYWxsIHRvIGFybS4KLQkgICBJZiBpdCBpcyBhIGNhbGwgcmVsYXRpdmUgdG8gYSBzZWN0aW9uIG5hbWUsIHRoZW4gaXQgaXMgbm90IGEKLQkgICBmdW5jdGlvbiBjYWxsIGF0IGFsbCwgYnV0IHJhdGhlciBhIGxvbmcganVtcC4gICovCi0JaWYgKHN5bV9mbGFncyAhPSBTVFRfQVJNX1RGVU5DICYmIHN5bV9mbGFncyAhPSBTVFRfU0VDVElPTikKLQkgIHsKLQkgICAgaWYgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViCi0JCShpbmZvLCBzeW1fbmFtZSwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgaGl0X2RhdGEsIHN5bV9zZWMsIHJlbC0+cl9vZmZzZXQsIHNpZ25lZF9hZGRlbmQsIHZhbHVlKSkKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JICB9Ci0KLQlyZWxvY2F0aW9uID0gdmFsdWUgKyBzaWduZWRfYWRkZW5kOwotCi0JcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIHJlbC0+cl9vZmZzZXQpOwotCQotCWlmICghIGdsb2JhbHMtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSkKLQkgIHsKLQkgICAgRWxmX0ludGVybmFsX0VoZHIgKiBpX2VoZHJwOyAvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLQkgICAgCi0JICAgIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpOwotCi0JICAgIC8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSBhbHNvIHVzZWQgdG8gYWRkIGluIHRoZSBwaXBsaW5lCi0JICAgICAgIG9mZnNldCBoZXJlLiAgVGhpcyBpcyB3cm9uZyBiZWNhdXNlIHRoZSBsaW5rZXIgaXMgbm90IHN1cHBvc2VkCi0JICAgICAgIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIGFuZCBvbmUgZGF5IGl0IG1pZ2h0IGNoYW5nZS4gIEluIG9yZGVyCi0JICAgICAgIHRvIHN1cHBvcnQgb2xkIGJpbmFyaWVzIHRoYXQgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciBob3dldmVyLCBzbwotCSAgICAgICB3ZSBhdHRlbXB0IHRvIGRldGVjdCB3aGljaCBBQkkgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSByZWxvYy4gICovCi0JICAgIGlmICggICBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItbGl0dGxlYXJtLW9hYmkiKSA9PSAwCi0JCXx8IHN0cmNtcCAoYmZkX2dldF90YXJnZXQgKGlucHV0X2JmZCksICJlbGYzMi1iaWdhcm0tb2FiaSIpID09IDAKLQkJfHwgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gMCkKLQkgICAgICByZWxvY2F0aW9uICs9IDQ7Ci0JICB9Ci0KLQljaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLQkvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkgICBsZWFkaW5nIDEgYml0cyAoYXNzdW1pbmcgdHdvcyBjb21wbGVtZW50KS4gICovCi0JaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCSAgc2lnbmVkX2NoZWNrID0gY2hlY2s7Ci0JZWxzZQotCSAgc2lnbmVkX2NoZWNrID0gY2hlY2sgfCB+KChiZmRfdm1hKSAtMSA+PiBob3d0by0+cmlnaHRzaGlmdCk7Ci0KLQkvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCWlmIChzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4IHx8IHNpZ25lZF9jaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICBvdmVyZmxvdyA9IHRydWU7Ci0KLQkvKiBQdXQgUkVMT0NBVElPTiBiYWNrIGludG8gdGhlIGluc24uICAqLwotCXVwcGVyX2luc24gPSAodXBwZXJfaW5zbiAmIH4oYmZkX3ZtYSkgMHg3ZmYpIHwgKChyZWxvY2F0aW9uID4+IDEyKSAmIDB4N2ZmKTsKLQlsb3dlcl9pbnNuID0gKGxvd2VyX2luc24gJiB+KGJmZF92bWEpIDB4N2ZmKSB8ICgocmVsb2NhdGlvbiA+PiAxKSAmIDB4N2ZmKTsKLQotCS8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlOiAgKi8KLQliZmRfcHV0XzE2IChpbnB1dF9iZmQsIHVwcGVyX2luc24sIGhpdF9kYXRhKTsKLQliZmRfcHV0XzE2IChpbnB1dF9iZmQsIGxvd2VyX2luc24sIGhpdF9kYXRhICsgMik7Ci0KLQlyZXR1cm4gKG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FSTV9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9DT1BZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX0dMT0JfREFUOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX0pVTVBfU0xPVDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SRUxBVElWRToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9HT1RPRkY6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICAgIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgICAKLSAgICAgIC8qIE5vdGUgdGhhdCBzZ290LT5vdXRwdXRfb2Zmc2V0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGlzCi0gICAgICAgICBjYWxjdWxhdGlvbi4gIFdlIGFsd2F5cyB3YW50IHRoZSBzdGFydCBvZiAuZ290LiAgSWYgd2UKLSAgICAgICAgIGRlZmluZSBfR0xPQkFMX09GRlNFVF9UQUJMRSBpbiBhIGRpZmZlcmVudCB3YXksIGFzIGlzCi0gICAgICAgICBwZXJtaXR0ZWQgYnkgdGhlIEFCSSwgd2UgbWlnaHQgaGF2ZSB0byBjaGFuZ2UgdGhpcwotICAgICAgICAgY2FsY3VsYXRpb24uICovCi0KLSAgICAgIHZhbHVlIC09IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fR09UUEM6Ci0gICAgICAvKiBVc2UgZ2xvYmFsIG9mZnNldCB0YWJsZSBhcyBzeW1ib2wgdmFsdWUuICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0KLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fR09UMzI6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAqLwotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQotCSAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICBpZiAoIWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHx8Ci0JICAgICAgKGluZm8tPnNoYXJlZCAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYyBsaW5rCi0JCSBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGxvY2FsbHkuICBXZSBtdXN0IGluaXRpYWxpemUgdGhpcwotCQkgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QKLQkJIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0Ci0JCSB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290IHJlbG9jYXRpb24KLQkJIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcyBpcyBkb25lIGluIHRoZQotCQkgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICovCi0KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWx1ZSwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJfQotCSAgICB9Ci0KLQkgIHZhbHVlID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwgJiYKLQkJICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQotCSAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UgdGhlCi0JICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5Ci0JICAgICBnZW5lcmF0ZWQgdGhlIG5lY2Vzc2FyeSByZWxvYy4gKi8KLQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkgICAgb2ZmICY9IH4xOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICBhc2VjdGlvbiAqIHNyZWxnb3Q7Ci0JCSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0KLQkJICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICsgb2ZmKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0JCSAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCSAgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkgICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQl9Ci0KLQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkgICAgfQotCi0JICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JfQotICAgICAgCi0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fUExUMzI6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSAgICAgIC8qIFJlc29sdmUgYSBQTFQzMiByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAotICAgICAgICAgd2l0aG91dCB1c2luZyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAJCQkJIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLSAgICAgICAgCQkJCSAoYmZkX3ZtYSkgMCk7Ci0KLSAgICAgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLSAgICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0gICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCXJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0JCQkJCSAoYmZkX3ZtYSkgMCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQoc3BsdCAhPSBOVUxMKTsKLSAgICAgIGlmIChzcGx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICB2YWx1ZSA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCSAgICAgICArIGgtPnBsdC5vZmZzZXQpOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgCQkJICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLSAgICAgICAgCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fU0JSRUwzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9BTVBfVkNBTEw5OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JTQlJFTDMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1RITV9SUEMyMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SUkVMMzI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUkFCUzMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JQQzI0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JCQVNFOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotfQotCi0jaWZkZWYgVVNFX1JFTAotLyogQWRkIElOQ1JFTUVOVCB0byB0aGUgcmVsb2MgKG9mIHR5cGUgSE9XVE8pIGF0IEFERFJFU1MuICAqLwotc3RhdGljIHZvaWQKLWFybV9hZGRfdG9fcmVsIChhYmZkLCBhZGRyZXNzLCBob3d0bywgaW5jcmVtZW50KQotICAgICBiZmQgKiAgICAgICAgICAgICAgYWJmZDsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgIGFkZHJlc3M7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLSAgICAgYmZkX3NpZ25lZF92bWEgICAgIGluY3JlbWVudDsKLXsKLSAgYmZkX3ZtYSAgICAgICAgY29udGVudHM7Ci0gIGJmZF9zaWduZWRfdm1hIGFkZGVuZDsKLQotICBjb250ZW50cyA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHJlc3MpOwotCi0gIC8qIEdldCB0aGUgKHNpZ25lZCkgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBhZGRlbmQgPSBjb250ZW50cyAmIGhvd3RvLT5zcmNfbWFzazsKLSAgaWYgKGFkZGVuZCAmICgoaG93dG8tPnNyY19tYXNrICsgMSkgPj4gMSkpCi0gICAgewotICAgICAgYmZkX3NpZ25lZF92bWEgbWFzazsKLSAgICAgIAotICAgICAgbWFzayA9IC0xOwotICAgICAgbWFzayAmPSB+IGhvd3RvLT5zcmNfbWFzazsKLSAgICAgIGFkZGVuZCB8PSBtYXNrOwotICAgIH0KLQotICAvKiBBZGQgaW4gdGhlIGluY3JlbWVudCwgKHdoaWNoIGlzIGEgYnl0ZSB2YWx1ZSkuICAqLwotICBzd2l0Y2ggKGhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfQVJNX1RITV9QQzIyOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhZGRlbmQgKz0gaW5jcmVtZW50OwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0gICAgICBhZGRlbmQgPDw9IGhvd3RvLT5zaXplOwotICAgICAgYWRkZW5kICs9ICBpbmNyZW1lbnQ7Ci0gICAgICAKLSAgICAgIC8qIFNob3VsZCB3ZSBjaGVjayBmb3Igb3ZlcmZsb3cgaGVyZSA/ICAqLwotCi0gICAgICAvKiBEcm9wIGFueSB1bmRlc2lyZWQgYml0cy4gICovCi0gICAgICBhZGRlbmQgPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgY29udGVudHMgPSAoY29udGVudHMgJiB+IGhvd3RvLT5kc3RfbWFzaykgfCAoYWRkZW5kICYgaG93dG8tPmRzdF9tYXNrKTsKLSAgCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvbnRlbnRzLCBhZGRyZXNzKTsKLX0KLSNlbmRpZiAvKiBVU0VfUkVMICovCi0KLS8qIFJlbG9jYXRlIGFuIEFSTSBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kOwotICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICBuYW1lOwotCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOwotICAgICAgYXJlbGVudCAgICAgICAgICAgICAgICAgICAgICBiZmRfcmVsb2M7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSAgID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmICggICByX3R5cGUgPT0gUl9BUk1fR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9BUk1fR05VX1ZUSU5IRVJJVCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvIChpbnB1dF9iZmQsICYgYmZkX3JlbG9jLCByZWwpOwotICAgICAgaG93dG8gPSBiZmRfcmVsb2MuaG93dG87Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotI2lmZGVmIFVTRV9SRUwKLQkJICBhcm1fYWRkX3RvX3JlbCAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQsCi0JCQkJICBob3d0bywgc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZSk7Ci0jZWxzZQotCQkgIHJlbC0+cl9hZGRlbmQgKz0gKHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWUpCi0JCSAgICA+PiBob3d0by0+cmlnaHRzaGlmdDsKLSNlbmRpZgotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGludCByZWxvY2F0aW9uX25lZWRlZCA9IDE7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbiB2YWx1ZS4KLQkgICAgICAgICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lIG9ic2N1cmUgY2FzZXMKLQkgICAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gKi8KLQkgICAgICBzd2l0Y2ggKHJfdHlwZSkKLQkJewotCSAgICAgICAgY2FzZSBSX0FSTV9QQzI0OgotCSAgICAgICAgY2FzZSBSX0FSTV9BQlMzMjoKLQkgICAgICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICAgICAgICAgJiYgKAotCSAgICAgICAgICAgICAgCSAgKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCSAgICAgICAgICAgICAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCQkJICApCi0JICAgICAgICAgICAgICAmJiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgICApCi0JICAgICAgICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgIGJyZWFrOwotCi0JICAgICAgICBjYXNlIFJfQVJNX0dPVFBDOgotCSAgICAgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkgICAgICAgIGNhc2UgUl9BUk1fR09UMzI6Ci0JICAgICAgICAgIGlmIChlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICAgICAgICAgICAgICAmJiAoIWluZm8tPnNoYXJlZAotCSAgICAgICAgICAgICAgICAgIHx8ICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkgICAgICAgICAgICAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkJCSAgKQotCQkgICAgICApCi0JICAgICAgICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgIGJyZWFrOwotCi0JICAgICAgICBjYXNlIFJfQVJNX1BMVDMyOgotCSAgICAgICAgICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSktMSkKLQkgICAgICAgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkgICAgICAgIGRlZmF1bHQ6Ci0JCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JCSAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKHJlbG9jYXRpb25fbmVlZGVkKQotCQlyZWxvY2F0aW9uID0gaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBlbHNlCi0JewotCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JfQotCi0gICAgICByID0gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLAotCQkJCQkgcmVsb2NhdGlvbiwgaW5mbywgc2VjLCBuYW1lLAotCQkJCQkgKGggPyBFTEZfU1RfVFlQRSAoaC0+dHlwZSkgOgotCQkJCQkgIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pKSwgaCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgMDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBrZWVwIEFSTSBzcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlci4gKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBpZiAoZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0gICAgICAmJiBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAhPSBmbGFncykKLSAgICB7Ci0gICAgICBpZiAoZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGVsc2UKLQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICAgICAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBpbl9mbGFnczsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoZWxmX2ZsYWdzX2luaXQgKG9iZmQpICYmIGluX2ZsYWdzICE9IG91dF9mbGFncykKLSAgICB7Ci0gICAgICAvKiBDYW5ub3QgbWl4IFBJQyBhbmQgbm9uLVBJQyBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9QSUMpICE9IChvdXRfZmxhZ3MgJiBFRl9QSUMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2Fubm90IG1peCBBUENTMjYgYW5kIEFQQ1MzMiBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTXzI2KSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU18yNikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDYW5ub3QgbWl4IGZsb2F0IEFQQ1MgYW5kIG5vbi1mbG9hdCBBUENTIGNvZGUuICAqLwotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzCi0gICAgICAgICB0aGVuIHR1cm4gb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9JTlRFUldPUkspICE9IChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspKQotCXsKLQkgIGlmIChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmsgZmxhZyBpbiAlcyBiZWNhdXNlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBsaW5rZWQgd2l0aCBpdCIpLAotCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBpbl9mbGFncyAmPSB+RUZfSU5URVJXT1JLOwotCX0KLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOCi0gICAgICAmJiBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgYmZkX2JpZ19lbmRpYW4gKGliZmQpID8gImJpZyIgOiAibGl0dGxlIiwKLQkgYmZkX2JpZ19lbmRpYW4gKG9iZmQpID8gImJpZyIgOiAibGl0dGxlIik7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgQkZEIG11c3QgaGF2ZSBoYWQgaXRzIGZsYWdzIGluaXRpYWxpc2VkLiAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBzZWVtcyBib2d1cyB0byBtZSAtLSBUaGUgZmxhZ3MgYXJlIGluaXRpYWxpemVkIGluCi0gICAgIHRoZSBhc3NlbWJsZXIgYnV0IEkgZG9uJ3QgdGhpbmsgYW4gZWxmX2ZsYWdzX2luaXQgZmllbGQgaXMKLSAgICAgd3JpdHRlbiBpbnRvIHRoZSBvYmplY3QgKi8KLSAgLyogQkZEX0FTU0VSVCAoZWxmX2ZsYWdzX2luaXQgKGliZmQpKTsgKi8KLQotICBpbl9mbGFncyAgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotICAgICAgICAgYm90aGVyIHNldHRpbmcgdGhlIGZsYWdzIGZvciB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSwKLSAgICAgICAgIGluc3RlYWQgYWxsb3cgZnV0dXJlIG1lcmdlcyB0byBkbyB0aGlzLiAgSWYgbm8gZnV0dXJlCi0gICAgICAgICBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0gICAgICAgICB1bml0aWFsaXNlZCB2YWx1ZXMsIHdoaWNoIHN1cnByaXNlIHN1cnByaXNlLCBjb3JyZXNwb25kCi0gICAgICAgICB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChpYmZkKS0+dGhlX2RlZmF1bHQpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBDaGVjayBmbGFnIGNvbXBhdGliaWxpdHkuICAqLwotICBpZiAoaW5fZmxhZ3MgPT0gb3V0X2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENvbXBsYWluIGFib3V0IHZhcmlvdXMgZmxhZyBtaXNtYXRjaGVzLiAgKi8KLQotICBpZiAoKGluX2ZsYWdzICYgRUZfQVBDU18yNikgIT0gKG91dF9mbGFncyAmIEVGX0FQQ1NfMjYpKQotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLUVycm9yOiAlcyBjb21waWxlZCBmb3IgQVBDUy0lZCwgd2hlcmVhcyAlcyBpcyBjb21waWxlZCBmb3IgQVBDUy0lZCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQlpbl9mbGFncyAmIEVGX0FQQ1NfMjYgPyAyNiA6IDMyLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCQlvdXRfZmxhZ3MgJiBFRl9BUENTXzI2ID8gMjYgOiAzMik7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1FcnJvcjogJXMgcGFzc2VzIGZsb2F0cyBpbiAlcyByZWdpc3RlcnMsIHdoZXJlYXMgJXMgcGFzc2VzIHRoZW0gaW4gJXMgcmVnaXN0ZXJzIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJICAgICBpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQgPyBfICgiZmxvYXQiKSA6IF8gKCJpbnRlZ2VyIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJICAgICAgb3V0X2ZsYWdzICYgRUZfQVBDU18yNiA/IF8gKCJmbG9hdCIpIDogXyAoImludGVnZXIiKSk7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX1BJQykgIT0gKG91dF9mbGFncyAmIEVGX1BJQykpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotRXJyb3I6ICVzIGlzIGNvbXBpbGVkIGFzIHBvc2l0aW9uICVzIGNvZGUsIHdoZXJlYXMgJXMgaXMgbm90IiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJICAgIGluX2ZsYWdzICYgRUZfUElDID8gXyAoImluZGVwZW5kZW50IikgOiBfICgiZGVwZW5kZW50IiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgLyogSW50ZXJ3b3JraW5nIG1pc21hdGNoIGlzIG9ubHkgYSB3YXJuaW5nLiAqLwotICBpZiAoKGluX2ZsYWdzICYgRUZfSU5URVJXT1JLKSAhPSAob3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLKSkKLSAgICB7Ci0gICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiAlcyAlcyBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgJXMiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICBpbl9mbGFncyAmIEVGX0lOVEVSV09SSyA/IF8gKCJzdXBwb3J0cyIpIDogXyAoImRvZXMgbm90IHN1cHBvcnQiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICBvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUksgPyBfICgiZG9lcyBub3QiKSA6IF8gKCJkb2VzIikpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLQotICAvKiBQcmludCBub3JtYWwgRUxGIHByaXZhdGUgZGF0YS4gICovCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0KLSAgLyogSWdub3JlIGluaXQgZmxhZyAtIGl0IG1heSBub3QgYmUgc2V0LCBkZXNwaXRlIHRoZSBmbGFncyBmaWVsZCBjb250YWluaW5nIHZhbGlkIGRhdGEuICAqLwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8gKCJwcml2YXRlIGZsYWdzID0gJWx4OiIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2ludGVyd29ya2luZyBlbmFibGVkXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2ludGVyd29ya2luZyBub3QgZW5hYmxlZF0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQVBDU18yNikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtBUENTLTI2XSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW0FQQ1MtMzJdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfUElDKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2Fic29sdXRlIHBvc2l0aW9uXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUgKGVsZl9zeW0sIHR5cGUpCi0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBlbGZfc3ltOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKEVMRl9TVF9UWVBFIChlbGZfc3ltLT5zdF9pbmZvKSA9PSBTVFRfQVJNX1RGVU5DKQotICAgIHJldHVybiBFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gdHlwZTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZjMyX2FybV9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBXZSBkb24ndCBzdXBwb3J0IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBHT1QgYW5kIFBMVCByZWxvY3MgeWV0LiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICByZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbF9lbmQ7Ci0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzZ290LCAqc3JlbGdvdCwgKnNyZWxvYzsKLSAgYmZkX3ZtYSAqIGxvY2FsX2dvdF9vZmZzZXRzOwotICAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIHNnb3QgPSBzcmVsZ290ID0gc3JlbG9jID0gTlVMTDsKLSAgCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotICAgICAgCi0gICAgICAvKiBTb21lIHJlbG9jcyByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFJfQVJNX0dPVDMyOgotCSAgICBjYXNlIFJfQVJNX0dPVE9GRjoKLQkgICAgY2FzZSBSX0FSTV9HT1RQQzoKLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotCSAgY2FzZSBSX0FSTV9HT1QzMjoKLQkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgICB7Ci0JICAgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgICAgfQotCi0JICAgIC8qIEdldCB0aGUgZ290IHJlbG9jYXRpb24gc2VjdGlvbiBpZiBuZWNlc3NhcnkuICAqLwotCSAgICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgICAgewotCSAgICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkKLQkgICAgICAgIC8qIElmIG5vIGdvdCByZWxvY2F0aW9uIHNlY3Rpb24sIG1ha2Ugb25lIGFuZCBpbml0aWFsaXplLiAgKi8KLQkgICAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCSAgewotCQkgICAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJICAJCQkJICAgIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCSAgICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCi0JICAgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCSAgICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0gICAgIAkgICAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCi0gICAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHNpemVfdCBzaXplOwotCQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICAgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKLQkJICB9Ci0KLQkgICAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCi0JICAgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCSAgICAgb3V0cHV0IGEgUl9BUk1fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkgICAgIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICAgIH0KLQotCSAgICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkgICAgYnJlYWs7Ci0KLSAgCSAgY2FzZSBSX0FSTV9QTFQzMjoKLQkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCi0gICAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQotICAgICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLSAgICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoaCA9PSBOVUxMKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFJfQVJNX0FCUzMyOgotCSAgY2FzZSBSX0FSTV9SRUwzMjoKLQkgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIGlzIGEgcmVsb2MKLSAgICAgICAgICAgICAgIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBvciBhIG5vbiBQQyByZWxhdGl2ZSByZWxvYwotICAgICAgICAgICAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jCi0gICAgICAgICAgICAgICBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBsaW5raW5nIHdpdGgKLSAgICAgICAgICAgICAgIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgYSByZWxvYyBhZ2FpbnN0IGEKLSAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlCi0gICAgICAgICAgICAgICBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCkuICBBdAotICAgICAgICAgICAgICAgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzCi0gICAgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldAotICAgICAgICAgICAgICAgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAotICAgICAgICAgICAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgICAgICAgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfQVJNX1BDMjQKLQkgICAgICAgIHx8IChoICE9IE5VTEwKLQkJICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCSAgICAgIHsKLQkgICAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCi0gICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkJICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAgIChhYmZkLAotCQkJICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkgCSAgICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJICAgbmFtZSArIDQpID09IDApOwotCi0JCSAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgICAgewotCQkgICAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCSAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0JCSAgfQotCi0JICAgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGFuZCB0aGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwgc28gdGhhdAotICAgICAgICAgICAgICAgICAgIHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIGVsZl9pMzg2IGxpbmtlcgotICAgICAgICAgICAgICAgICAgIGhhc2ggdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvCi0gICAgICAgICAgICAgICAgICAgYW4gZWxmX2kzODZfbGlua19oYXNoX2VudHJ5LiAgKi8KLQkgICAgICAgIGlmIChoICE9IE5VTEwgJiYgaW5mby0+c3ltYm9saWMKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfQVJNX1BDMjQpCi0JCSAgewotCQkgICAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiBlaDsKLQkJICAgIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHA7Ci0KLQkJICAgIGVoID0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkJICAgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCi0JCSAgICAgICAgYnJlYWs7Ci0KLQkJICAgIGlmIChwID09IE5VTEwpCi0JCSAgICAgIHsKLQkJICAgICAgICBwID0gKChzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKikKLQkJCSAgICAgYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAqIHApKTsKLQotCQkgICAgICAgIGlmIChwID09IE5VTEwpCi0JCQkgIHJldHVybiBmYWxzZTsKLQkJICAgICAgICBwLT5uZXh0ID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci0JCSAgICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7Ci0JCSAgICAgICAgcC0+Y291bnQgPSAwOwotCQkgICAgICB9Ci0KLQkJICAgICsrcC0+Y291bnQ7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQkgIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBhbmQgb2Zmc2V0LCBmb3IgZXJyb3IKLSAgIHJlcG9ydGluZy4gICBUaGlzIGNvZGUgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGNvZGUgaW4gZWxmLmMsIGV4Y2VwdAotICAgdGhhdCBpdCBhbHNvIGFjY2VwdHMgU1RUX0FSTV9URlVOQyBhcyBhIHN5bWJvbCB0aGF0IG5hbWVzIGEgZnVuY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUKLSAgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICogICAgICAgICAgYWJmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKiAgICAgc3ltYm9sczsKLSAgICAgYmZkX3ZtYSAgICAgICAgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqICBmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKiogIGZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqIGxpbmVfcHRyOwotewotICBib29sZWFuICAgICAgZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsKLSAgYXN5bWJvbCAqICAgIGZ1bmM7Ci0gIGJmZF92bWEgICAgICBsb3dfZnVuYzsKLSAgYXN5bWJvbCAqKiAgIHA7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0ciwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmZWxmX3RkYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzeW1ib2xzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgZnVuYyA9IE5VTEw7Ci0gIGxvd19mdW5jID0gMDsKLQotICBmb3IgKHAgPSBzeW1ib2xzOyAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgZWxmX3N5bWJvbF90eXBlICpxOwotCi0gICAgICBxID0gKGVsZl9zeW1ib2xfdHlwZSAqKSAqcDsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoJnEtPnN5bWJvbCkgIT0gc2VjdGlvbikKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChFTEZfU1RfVFlQRSAocS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCWNhc2UgU1RUX0ZJTEU6Ci0JICBmaWxlbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCZxLT5zeW1ib2wpOwotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfTk9UWVBFOgotCWNhc2UgU1RUX0ZVTkM6Ci0JY2FzZSBTVFRfQVJNX1RGVU5DOgotCSAgaWYgKHEtPnN5bWJvbC5zZWN0aW9uID09IHNlY3Rpb24KLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmMKLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZnVuYyA9IChhc3ltYm9sICopIHE7Ci0JICAgICAgbG93X2Z1bmMgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpOwotICAqbGluZV9wdHIgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgYmZkICogZHlub2JqOwotICBhc2VjdGlvbiAqIHM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAotICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDApCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFQzMiByZWxvYyBpbiBhbiBpbnB1dAotICAgICAgICAgICAgIGZpbGUsIGJ1dCB0aGUgc3ltYm9sIHdhcyBuZXZlciByZWZlcnJlZCB0byBieSBhIGR5bmFtaWMKLSAgICAgICAgICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAotICAgICAgICAgICAgIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFBDMzIKLSAgICAgICAgICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKLQkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gNDsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfQVJNX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KLSAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiAzKQotICAgIHBvd2VyX29mX3R3byA9IDM7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbC5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsCi0gICAgIFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotICAgICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2UKLSAgICAgd2lsbCBub3QgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgIGVsZjMyX2FybV9kaXNjYXJkX2NvcGllcywKLQkJCQkgIChQVFIpIE5VTEwpOwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWwuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICogdGFyZ2V0OwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCi0gICAgICAgICAgICAgICAgIHRoYW4gLnJlbC5wbHQuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsLnBsdCIpICE9IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpvdXRuYW1lOwotCi0JCSAgcmVsb2NzID0gdHJ1ZTsKLQotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMCi0JCSAgICAgZW50cnkuICBUaGUgZW50cmllcyBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbgotCQkgICAgIHJlYWxseSBhcHBseSB0byB0aGUgLmdvdCBzZWN0aW9uLCB3aGljaCB3ZQotCQkgICAgIGNyZWF0ZWQgb3Vyc2VsdmVzIGFuZCBzbyBrbm93IGlzIG5vdCByZWFkb25seS4gICovCi0JCSAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkJICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JCSAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA0KTsKLQkJICAKLQkJICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWx0ZXh0ID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBhc2VjdGlvbiAqKiBzcHA7Ci0KLQkgIGZvciAoc3BwID0gJnMtPm91dHB1dF9zZWN0aW9uLT5vd25lci0+c2VjdGlvbnM7Ci0JICAgICAgICpzcHAgIT0gcy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgICAgIHNwcCA9ICYoKnNwcCktPm5leHQpCi0JICAgIDsKLQkgICpzcHAgPSBzLT5vdXRwdXRfc2VjdGlvbi0+bmV4dDsKLQkgIC0tcy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLT5zZWN0aW9uX2NvdW50OwotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMRU5ULAotCQkJCQkJc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGYzMl9hcm1fbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUKLSAgIGRlZmluZWQgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZQotICAgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlCi0gICByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgUFRSIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogc3ltOwotewotICBiZmQgKiBkeW5vYmo7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogc3BsdDsKLSAgICAgIGFzZWN0aW9uICogc2dvdDsKLSAgICAgIGFzZWN0aW9uICogc3JlbDsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLQkgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5kZXggaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHdoaWNoCi0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgc3ltYm9sLiAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2wKLQkgaW4gYWxsIHRoZSBzeW1ib2xzIGZvciB3aGljaCB3ZSBhcmUgbWFraW5nIHBsdCBlbnRyaWVzLiAgVGhlCi0JIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyByZXNlcnZlZC4gICovCi0gICAgICBwbHRfaW5kZXggPSBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSAxOwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZ290IHRhYmxlIG9mIHRoZSBlbnRyeSB0aGF0Ci0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgZnVuY3Rpb24uICBFYWNoIC5nb3QgZW50cnkgaXMgNCBieXRlcy4KLQkgVGhlIGZpcnN0IHRocmVlIGFyZSByZXNlcnZlZC4gICovCi0gICAgICBnb3Rfb2Zmc2V0ID0gKHBsdF9pbmRleCArIDMpICogNDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LAotICAgICAgICAgICAgICBlbGYzMl9hcm1fcGx0X2VudHJ5LAotCSAgICAgIFBMVF9FTlRSWV9TSVpFKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldAotCQkgICAgICAgLSBzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAtIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgIC0gaC0+cGx0Lm9mZnNldCAtIDEyKSwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMTIpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldCksCi0JCSAgc2dvdC0+Y29udGVudHMgKyBnb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgZ290X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9KVU1QX1NMT1QpOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogc2dvdDsKLSAgICAgIGFzZWN0aW9uICogc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLQkgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIFRoZSBlbnRyeSBpbgotCSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluCi0JIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9HTE9CX0RBVCk7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKLQkJCQkgKyBzcmVsLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9DT1BZKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzLT5jb250ZW50cwotCQkJCSArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGJmZCAqIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzZ290OwotICBhc2VjdGlvbiAqIHNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKiBuYW1lOwotCSAgYXNlY3Rpb24gKiBzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsLnBsdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgICAvKiBNeSByZWFkaW5nIG9mIHRoZSBTVlI0IEFCSSBpbmRpY2F0ZXMgdGhhdCB0aGUKLQkJIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHJlbG9jcyAoRFRfSk1QUkVMKSBzaG91bGQgYmUKLQkJIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMKS4gIFRoaXMgaXMKLQkJIHdoYXQgU29sYXJpcyBkb2VzLiAgSG93ZXZlciwgVW5peFdhcmUgY2FuIG5vdCBoYW5kbGUKLQkJIHRoYXQgY2FzZS4gIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTFNaIGVudHJ5Ci0JCSBoZXJlIHRvIG1ha2UgaXQgbm90IGluY2x1ZGUgdGhlIEpNUFJFTCByZWxvY3MuICBTaW5jZQotCQkgdGhlIGxpbmtlciBzY3JpcHQgYXJyYW5nZXMgZm9yIC5yZWwucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUwgZW50cnkuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWwucGx0Iik7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fcmF3X3NpemU7Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmMzJfYXJtX3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQotICAgICAgLyogVW5peFdhcmUgc2V0cyB0aGUgZW50c2l6ZSBvZiAucGx0IHRvIDQsIGFsdGhvdWdoIHRoYXQgZG9lc24ndAotCSByZWFsbHkgc2VlbSBsaWtlIHRoZSByaWdodCB2YWx1ZS4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBmaXJzdCB0aHJlZSBlbnRyaWVzIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgOCk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgRWxmX0ludGVybmFsX0VoZHIgKiBpX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLQotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0KLSAgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gICAgICA9IEFSTV9FTEZfT1NfQUJJX1ZFUlNJT047Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfQUJJVkVSU0lPTl0gPSBBUk1fRUxGX0FCSV9WRVJTSU9OOwotfQotCi0KLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9hcm0KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fQVJNCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4ODAwMAotCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgCWVsZjMyX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIAllbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQllbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCWVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAgICBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIAllbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lCSAgICAgICAgZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlICAgICAgICAgICAgIGVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICAgICAgICAgIGVsZjMyX2FybV9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgICAgIGVsZjMyX2FybV9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBlbGYzMl9hcm1fY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gICAgCWVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbAllbGYzMl9hcm1fYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAllbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCWVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMJZWxmMzJfYXJtX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycwllbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgICAgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgICAgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gICAgMAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkxMgotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJUExUX0VOVFJZX1NJWkUKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWQxMHYuYyBiL2JmZC9lbGYzMi1kMTB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZGViN2MuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKiBEMTBWLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0vKiAjaW5jbHVkZSAiZWxmL2QxMHYuaCIgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZDEwdl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotCi0KLS8qIFVzZSBSRUwgaW5zdGVhZCBvZiBSRUxBIHRvIHNhdmUgc3BhY2UgKi8KLSNkZWZpbmUgVVNFX1JFTAotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUl9EMTBWX05PTkUgPSAwLAotICBSX0QxMFZfMTBfUENSRUxfUiwKLSAgUl9EMTBWXzEwX1BDUkVMX0wsCi0gIFJfRDEwVl8xNiwKLSAgUl9EMTBWXzE4LAotICBSX0QxMFZfMThfUENSRUwsCi0gIFJfRDEwVl8zMiwKLSAgUl9EMTBWX0dOVV9WVElOSEVSSVQsCi0gIFJfRDEwVl9HTlVfVlRFTlRSWSwKLSAgUl9EMTBWX21heAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2QxMHZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRDEwVl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMiAgKi8KLSAgLyogcmlnaHQgY29udGFpbmVyICovCi0gIEhPV1RPIChSX0QxMFZfMTBfUENSRUxfUiwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTBfUENSRUxfUiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCSAgICAgICAgLyogc3JjX21hc2sgKi8KLQkgMHhmZiwgICAJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIFBDIFJlbGF0aXZlIDEwLWJpdCByZWxvY2F0aW9uLCBzaGlmdGVkIGJ5IDIgICovCi0gIC8qIGxlZnQgY29udGFpbmVyICovCi0gIEhPV1RPIChSX0QxMFZfMTBfUENSRUxfTCwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMTUsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzEwX1BDUkVMX0wiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmODAwMCwJCSAgICAgICAgLyogc3JjX21hc2sgKi8KLQkgMHgwN2Y4MDAwLCAgIAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMTBWXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiAxOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCAyICovCi0gIEhPV1RPIChSX0QxMFZfMTgsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzE4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTggYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMiAgKi8KLSAgSE9XVE8gKFJfRDEwVl8xOF9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMThfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QxMFZfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8zMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0QxMFZfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRDEwVl9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfRDEwVl9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRDEwVl9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gCi19OwotCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEQxMFYgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGQxMHZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0gc3RhdGljIGNvbnN0IHN0cnVjdCBkMTB2X3JlbG9jX21hcCBkMTB2X3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9EMTBWX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiwgUl9EMTBWXzEwX1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MLCBSX0QxMFZfMTBfUENSRUxfTCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9EMTBWXzE2IH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMTgsIFJfRDEwVl8xOCB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMLCBSX0QxMFZfMThfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfRDEwVl8zMiB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9EMTBWX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX0QxMFZfR05VX1ZURU5UUlkgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChkMTB2X3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBkMTB2X3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChkMTB2X3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfZDEwdl9ob3d0b190YWJsZVtkMTB2X3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRDEwViBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotZDEwdl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0QxMFZfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfZDEwdl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmMzJfZDEwdl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfRDEwVl9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX0QxMFZfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICBlbHNlCi0gICAgIHsKLSAgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLSAgICAgICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotICAgICAgICAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0gICAgICAgICAgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9kMTB2X2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBkMTB2ICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1lbGYzMl9kMTB2X2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfRDEwVl9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgRDEwViBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfZDEwdl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl90eXBlID09IFJfRDEwVl9HTlVfVlRFTlRSWQotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX0QxMFZfR05VX1ZUSU5IRVJJVCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IGVsZl9kMTB2X2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCX0KLSAgICAgIAotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgMDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZDEwdgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19EMTBWCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2QxMHZfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWQxMHYiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JICAgICAgICAgICAgIDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCSAgICAgICAgICAgICBkMTB2X2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCSAgICAgICAgICAgICAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgICAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICBlbGYzMl9kMTB2X2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgICAgICAgZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICBlbGYzMl9kMTB2X2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICAgZWxmMzJfZDEwdl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAgICAgICAgICAxCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1kMzB2LmMgYi9iZmQvZWxmMzItZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNiNWMwLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1kMzB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyogRDMwVi1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X2luZm9fdG9faG93dG9fcmVsYQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9kMzB2X3JlbG9jIFBBUkFNUyAoKAotICAgICBiZmQgKmFiZmQsCi0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICBhc3ltYm9sICpzeW1ib2wsCi0gICAgIFBUUiBkYXRhLAotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEgUEFSQU1TICgoCi0gICAgIGJmZCAqYWJmZCwKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgIGFzeW1ib2wgKnN5bWJvbCwKLSAgICAgUFRSIGRhdGEsCi0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7Ci0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX0QzMFZfTk9ORSA9IDAsCi0gIFJfRDMwVl82LAotICBSX0QzMFZfOV9QQ1JFTCwKLSAgUl9EMzBWXzlfUENSRUxfUiwKLSAgUl9EMzBWXzE1LAotICBSX0QzMFZfMTVfUENSRUwsCi0gIFJfRDMwVl8xNV9QQ1JFTF9SLAotICBSX0QzMFZfMjEsCi0gIFJfRDMwVl8yMV9QQ1JFTCwKLSAgUl9EMzBWXzIxX1BDUkVMX1IsCi0gIFJfRDMwVl8zMiwKLSAgUl9EMzBWXzMyX1BDUkVMLAotICBSX0QzMFZfMzJfTk9STUFMLAotICBSX0QzMFZfbWF4Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfZDMwdl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9EMzBWX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl82LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl82IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDkgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzlfUENSRUwsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfOV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDkgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzlfUENSRUxfUiwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl85X1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1LAkJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzE1IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1X1BDUkVMLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1X1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzE1X1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAyMSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAzICovCi0gIEhPV1RPIChSX0QzMFZfMjEsCQkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMjEiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIxIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8yMV9QQ1JFTCwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMjFfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjEgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMywgaW4gdGhlIFJpZ2h0IGNvbnRhaW5lciAqLwotICBIT1dUTyAoUl9EMzBWXzIxX1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxX1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgRDMwViAzMiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMzBWXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDMyIGJpdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfMzJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzMyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZ3VsYXIgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl8zMl9OT1JNQUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8zMl9OT1JNQUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotI2RlZmluZSBNSU4zMiAobG9uZyBsb25nKTB4ZmZmZmZmZmY4MDAwMDAwMExMCi0jZGVmaW5lIE1BWDMyIDB4N2ZmZmZmZmZMTAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2QzMHZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBsb25nIGxvbmcgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbjEsIGluMiwgbnVtOwotICBiZmRfdm1hIHRtcF9hZGRyID0gMDsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBpbnQgbWFrZV9hYnNvbHV0ZSA9IDA7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsgCi0KLSAgLyogYSBoYWNrZWQtdXAgdmVyc2lvbiBvZiBiZmRfcGVyZm9ybV9yZWxvYygpIGZvbGxvd3MgKi8KLSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+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+IDEyKSkgPDwgMTIpOwotICBlbHNlCi0gICAgaW4xIHw9IHJlbG9jYXRpb24gJiBtYXNrOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGluMSwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgCi0gIHJldHVybiBmbGFnOwotfSAgIAotCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEQzMFYgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGQzMHZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZDMwdl9yZWxvY19tYXAgZDMwdl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfRDMwVl9OT05FLCB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzYsIFJfRDMwVl82IH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCwgUl9EMzBWXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IsIFJfRDMwVl85X1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8xNSwgUl9EMzBWXzE1IH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwsIFJfRDMwVl8xNV9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsIFJfRDMwVl8xNV9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMjEsIFJfRDMwVl8yMSB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMLCBSX0QzMFZfMjFfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SLCBSX0QzMFZfMjFfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzMyLCBSX0QzMFZfMzIgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTCwgUl9EMzBWXzMyX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX0QzMFZfMzJfTk9STUFMIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAoZDMwdl9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZDMwdl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAoZDMwdl9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX2QzMHZfaG93dG9fdGFibGVbZDMwdl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEQzMFYgRUxGIHJlbG9jICh0eXBlIFJFTCkuICAqLwotCi1zdGF0aWMgdm9pZAotZDMwdl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0QzMFZfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfZDMwdl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEQzMFYgRUxGIHJlbG9jICh0eXBlIFJFTEEpLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0QzMFZfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfZDMwdl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9kMzB2Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0QzMFYKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfZDMwdl92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItZDMwdiIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwlkMzB2X2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJZDMwdl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcJMAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZnIzMC5jIGIvYmZkL2VsZjMyLWZyMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjN2QzNy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLS8qIEZSMzAtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9mcjMwLmgiCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZnIzMF9lbGZfaTIwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmcjMwX2VsZl9pMzJfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGZyMzBfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBmcjMwX2VsZl9nY19zd2VlcF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKiBmcjMwX2VsZl9nY19tYXJrX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBmcjMwX2VsZl9ob3d0b190YWJsZSBbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjAgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzIwLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZnIzMF9lbGZfaTIwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMjAiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGYwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGludG8gNDggYml0cyBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF80OCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGZyMzBfZWxmX2kzMl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzQ4IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzZfSU5fNCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfNl9JTl80IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEFuIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzhfSU5fOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOF9JTl84IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEEgOSBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfOV9JTl84LAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDQsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF85X0lOXzgiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogQSAxMCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfMTBfSU5fOCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMTBfSU5fOCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwZmYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBQQyByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDEuICAqLwotICBIT1dUTyAoUl9GUjMwXzlfUENSRUwsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDksCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgMTIgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMS4gICovCi0gIEhPV1RPIChSX0ZSMzBfMTJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzEyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRlIzMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfRlIzMF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRlIzMF9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gCi19OwotDAotLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfRlIzMF8yMCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZWxmX2kyMF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgYXJlbGVudCAqICByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqICBzeW1ib2w7Ci0gICAgIFBUUiAgICAgICAgZGF0YTsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKiAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogICAgZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hICAgICAgIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgeDsKLSAgCi0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgcmVsb2NhdGlvbiA9Ci0gICAgc3ltYm9sLT52YWx1ZQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jYXRpb24gPiAoKDFVIDw8IDIwKSAtIDEpKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHggPSAoeCAmIDB4ZmYwZjAwMDApIHwgKHJlbG9jYXRpb24gJiAweDAwMDBmZmZmKSB8ICgocmVsb2NhdGlvbiAmIDB4MDAwZjAwMDApIDw8IDQpOwotICBiZmRfcHV0XzMyIChhYmZkLCB4LCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qIFV0aWxpdHkgdG8gYWN0dWFsbHkgcGVyZm9ybSBhIFJfRlIzMF80OCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZWxmX2kzMl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgYXJlbGVudCAqICByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqICBzeW1ib2w7Ci0gICAgIFBUUiAgICAgICAgZGF0YTsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKiAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogICAgZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hICAgICAgIHJlbG9jYXRpb247Ci0KLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICByZWxvY2F0aW9uID0KLSAgICBzeW1ib2wtPnZhbHVlCi0gICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY2F0aW9uLCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgKyAyKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBGUjMwIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBmcjMwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgaW50IGZyMzBfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmcjMwX3JlbG9jX21hcCBmcjMwX3JlbG9jX21hcCBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsICAgICAgICAgICBSX0ZSMzBfTk9ORSB9LAotICB7IEJGRF9SRUxPQ184LCAgICAgICAgICAgICAgUl9GUjMwXzggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF8yMCwgICAgICAgIFJfRlIzMF8yMCB9LAotICB7IEJGRF9SRUxPQ18zMiwgICAgICAgICAgICAgUl9GUjMwXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfNDgsICAgICAgICBSX0ZSMzBfNDggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF82X0lOXzQsICAgIFJfRlIzMF82X0lOXzQgfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF84X0lOXzgsICAgIFJfRlIzMF84X0lOXzggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF85X0lOXzgsICAgIFJfRlIzMF85X0lOXzggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF8xMF9JTl84LCAgIFJfRlIzMF8xMF9JTl84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTCwgICBSX0ZSMzBfOV9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMLCAgUl9GUjMwXzEyX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX0ZSMzBfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksICAgUl9GUjMwX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1mcjMwX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSBzaXplb2YgKGZyMzBfcmVsb2NfbWFwKSAvIHNpemVvZiAoZnIzMF9yZWxvY19tYXBbMF0pOwotICAgICAgIC0taTspCi0gICAgaWYgKGZyMzBfcmVsb2NfbWFwIFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0gICAgICByZXR1cm4gJiBmcjMwX2VsZl9ob3d0b190YWJsZSBbZnIzMF9yZWxvY19tYXBbaV0uZnIzMF9yZWxvY192YWxdOwotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRlIzMCBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKiBkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfRlIzMF9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJiBmcjMwX2VsZl9ob3d0b190YWJsZSBbcl90eXBlXTsKLX0KLQwKLS8qIFBlcmZvcm0gYSBzaW5nbGUgcmVsb2NhdGlvbi4gIEJ5IGRlZmF1bHQgd2UgdXNlIHRoZSBzdGFuZGFyZCBCRkQKLSAgIHJvdXRpbmVzLCBidXQgYSBmZXcgcmVsb2NzLCB3ZSBoYXZlIHRvIGRvIHRoZW0gb3Vyc2VsdmVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLCByZWxvY2F0aW9uKQotICAgICByZWxvY19ob3d0b190eXBlICogIGhvd3RvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICByZWxvY2F0aW9uOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgciA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSAgICAgICAgICAgICAgIHg7Ci0gIGJmZF9zaWduZWRfdm1hCXNyZWw7Ci0gIAotICBzd2l0Y2ggKGhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfRlIzMF8yMDoKLSAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQotICAgICAgaWYgKHJlbG9jYXRpb24gPiAoKDEgPDwgMjApIC0gMSkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmZjBmMDAwMCkgfCAocmVsb2NhdGlvbiAmIDB4MDAwMGZmZmYpIHwgKChyZWxvY2F0aW9uICYgMHgwMDBmMDAwMCkgPDwgNCk7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0ZSMzBfNDg6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQgKyAyOwotICAgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9GUjMwXzlfUENSRUw6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQgKyAxOwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbjsKLSAgICAgIHNyZWwgKz0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgLT0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgLT0gMjsgIC8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgYWRkIDIgdG8gdGhlIFBDLi4uICovCi0gICAgICBzcmVsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJICAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIGlmIChzcmVsID4gKCgxIDw8IDgpIC0gMSkgfHwgKHNyZWwgPCAtICgxIDw8IDgpKSkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgc3JlbCA+PiAxLCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9GUjMwXzEyX1BDUkVMOgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbjsKLSAgICAgIHNyZWwgKz0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgLT0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgLT0gMjsgLyogQnJhbmNoIGluc3RydWN0aW9ucyBhZGQgMiB0byB0aGUgUEMuLi4gKi8KLSAgICAgIHNyZWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCQkgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgCi0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgaWYgKHNyZWwgPiAoKDEgPDwgMTEpIC0gMSkgfHwgKHNyZWwgPCAtICgxIDw8IDExKSkpCi0JICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGY4MDApIHwgKChzcmVsID4+IDEpICYgMHg3ZmYpOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi0MCi0vKiBSZWxvY2F0ZSBhbiBGUjMwIEVMRiBzZWN0aW9uLgotICAgVGhlcmUgaXMgc29tZSBhdHRlbXB0IHRvIG1ha2UgdGhpcyBmdW5jdGlvbiB1c2FibGUgZm9yIG1hbnkgYXJjaGl0ZWN0dXJlcywKLSAgIGJvdGggVVNFX1JFTCBhbmQgVVNFX1JFTEEgWyd0d291bGQgYmUgbmljZSBpZiBzdWNoIGEgY3JpdHRlciBleGlzdGVkXSwKLSAgIGlmIG9ubHkgdG8gc2VydmUgYXMgYSBsZWFybmluZyB0b29sLgotCi0gICBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIG5ldyBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlCi0gICBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMgbmVjZXNzYXJ5LgotCi0gICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdF9zaG5keCBmaWVsZCBvZiBlYWNoIGxvY2FsIHN5bWJvbC4KLQotICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlCi0gICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYWRkZW5kIG11c3QgYmUgYWRqdXN0ZWQKLSAgIGFjY29yZGluZ2x5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogIGluZm87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICAgbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICByZWxlbmQgICAgID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsICsrKQotICAgIHsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgcjsKLSAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJfdHlwZTsKLSAgICAgIAotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmICggICByX3R5cGUgPT0gUl9GUjMwX0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSX0ZSMzBfR05VX1ZURU5UUlkpCi0JY29udGludWU7Ci0gICAgICAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICAKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9ucyBbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaG93dG8gID0gZnIzMF9lbGZfaG93dG9fdGFibGUgKyBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGggICAgICA9IE5VTEw7Ci0gICAgICBzeW0gICAgPSBOVUxMOwotICAgICAgc2VjICAgID0gTlVMTDsKLSAgICAgIAotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9ucyBbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCSAgCi0JICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCSAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotCSAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpIDogbmFtZTsKLSNpZiAwCi0JICBmcHJpbnRmIChzdGRlcnIsICJsb2NhbDogc2VjOiAlcywgc3ltOiAlcyAoJWQpLCB2YWx1ZTogJXggKyAleCArICV4IGFkZGVuZCAleFxuIiwKLQkJICAgc2VjLT5uYW1lLCBuYW1lLCBzeW0tPnN0X25hbWUsCi0JCSAgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkgICBzeW0tPnN0X3ZhbHVlLCByZWwtPnJfYWRkZW5kKTsKLSNlbmRpZgotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlcyBbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIAotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0jaWYgMAotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgICJkZWZpbmVkOiBzZWM6ICVzLCBuYW1lOiAlcywgdmFsdWU6ICV4ICsgJXggKyAleCBnaXZlczogJXhcbiIsCi0JCSAgICAgICBzZWMtPm5hbWUsIG5hbWUsIGgtPnJvb3QudS5kZWYudmFsdWUsCi0JCSAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEsIHNlYy0+b3V0cHV0X29mZnNldCwgcmVsb2NhdGlvbik7Ci0jZW5kaWYKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICB7Ci0jaWYgMAotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInVuZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXNcbiIsCi0JCSAgICAgICBzZWMtPm5hbWUsIG5hbWUpOwotI2VuZGlmCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAidW5rbm93bjogbmFtZTogJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIHIgPSBmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICBjb250ZW50cywgcmVsLCByZWxvY2F0aW9uKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBtc2cgPSAoY29uc3QgY2hhciAqKSBOVUxMOwotCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cKLQkJKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICByID0gaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sCi0JCShpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyByZWxvY2F0aW9uIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChtc2cpCi0JICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPndhcm5pbmcKLQkgICAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpOwotCi0JICBpZiAoISByKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1mcjMwX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgIHJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfRlIzMF9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9GUjMwX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgIGluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiByZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLWZyMzBfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfRlIzMF9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9GUjMwX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9mcjMwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0ZSMzAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfZnIzMF92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItZnIzMCIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCQlOVUxMCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkJZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJCWZyMzBfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCQlmcjMwX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBmcjMwX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJCTEKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQlmcjMwX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1nZW4uYyBiL2JmZC9lbGYzMi1nZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkYTUzYi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiBHZW5lcmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk1LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IHNob3VsZCBiZQotICAgZ29vZCBlbm91Z2ggZm9yIEdEQiBvciBvYmpkdW1wIHRvIHJlYWQgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBkdW1teSA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlVOS05PV04iLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfcmVsb2MtPmhvd3RvID0gJmR1bW15OwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2dlbmVyaWNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfcmVsb2MtPmhvd3RvID0gJmR1bW15OwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1iaWciCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfdW5rbm93bgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9OT05FCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0b19yZWwKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWhwcGEuYyBiL2JmZC9lbGYzMi1ocHBhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NGZkNmUuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWhwcGEuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMjkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUCBQQS1SSVNDIEVMRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieQotCi0JQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0JRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCi0JVW5pdmVyc2l0eSBvZiBVdGFoCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvaHBwYS5oIgotI2luY2x1ZGUgImxpYmhwcGEuaCIKLSNpbmNsdWRlICJlbGYzMi1ocHBhLmgiCi0jZGVmaW5lIEFSQ0hfU0laRQkJMzIKLSNpbmNsdWRlICJlbGYtaHBwYS5oIgotCi0KLS8qIFdlIHVzZSB0aHJlZSBkaWZmZXJlbnQgaGFzaCB0YWJsZXMgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IKLSAgIGxpbmtpbmcgUEEgRUxGIG9iamVjdHMuCi0KLSAgIFRoZSBmaXJzdCBpcyB0aGUgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgd2hpY2ggaXMgZGVyaXZlZAotICAgZnJvbSB0aGUgc3RhbmRhcmQgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UgdXNlIHRoaXMgYXMgYSBwbGFjZSB0bwotICAgYXR0YWNoIG90aGVyIGhhc2ggdGFibGVzIGFuZCBzdGF0aWMgaW5mb3JtYXRpb24uCi0KLSAgIFRoZSBzZWNvbmQgaXMgdGhlIHN0dWIgaGFzaCB0YWJsZSB3aGljaCBpcyBkZXJpdmVkIGZyb20gdGhlCi0gICBiYXNlIEJGRCBoYXNoIHRhYmxlLiAgVGhlIHN0dWIgaGFzaCB0YWJsZSBob2xkcyB0aGUgaW5mb3JtYXRpb24KLSAgIG5lY2Vzc2FyeSB0byBidWlsZCB0aGUgbGlua2VyIHN0dWJzIGR1cmluZyBhIGxpbmsuICAqLwotCi0vKiBIYXNoIHRhYmxlIGZvciBsaW5rZXIgc3R1YnMuICAqLwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkKLXsKLSAgLyogQmFzZSBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgd2UgY2FuIGdldCB0aGUgbmFtZSBvZiB0aGUgc3R1YgotICAgICAoYW5kIHRodXMga25vdyBleGFjdGx5IHdoYXQgYWN0aW9ucyBpdCBwZXJmb3JtcykgZnJvbSB0aGUgYmFzZQotICAgICBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzdHViLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0KLSAgLyogR2l2ZW4gdGhlIHN5bWJvbCdzIHZhbHVlIGFuZCBpdHMgc2VjdGlvbiB3ZSBjYW4gZGV0ZXJtaW5lIGl0cyBmaW5hbAotICAgICB2YWx1ZSB3aGVuIGJ1aWxkaW5nIHRoZSBzdHVicyAoc28gdGhlIHN0dWIga25vd3Mgd2hlcmUgdG8ganVtcC4gICovCi0gIHN5bXZhbHVlIHRhcmdldF92YWx1ZTsKLSAgYXNlY3Rpb24gKnRhcmdldF9zZWN0aW9uOwotfTsKLQotc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBzdHViIEJGRC4gICovCi0gIGJmZCAqc3R1Yl9iZmQ7Ci0KLSAgLyogV2hlcmUgdG8gcGxhY2UgdGhlIG5leHQgc3R1Yi4gICovCi0gIGJmZF9ieXRlICpsb2NhdGlvbjsKLQotICAvKiBDdXJyZW50IG9mZnNldCBpbiB0aGUgc3R1YiBzZWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLQotfTsKLQotc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogVGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotCi0gIC8qIEEgY291bnQgb2YgdGhlIG51bWJlciBvZiBvdXRwdXQgc3ltYm9scy4gICovCi0gIHVuc2lnbmVkIGludCBvdXRwdXRfc3ltYm9sX2NvdW50OwotCi0gIC8qIFN0dWZmIHNvIHdlIGNhbiBoYW5kbGUgRFAgcmVsYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBsb25nIGdsb2JhbF92YWx1ZTsKLSAgaW50IGdsb2JhbF9zeW1fZGVmaW5lZDsKLX07Ci0KLS8qIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0Ci0KLQlUaGlzIGZpbGUgY29udGFpbnMgRUxGMzIvSFBQQSByZWxvY2F0aW9uIHN1cHBvcnQgYXMgc3BlY2lmaWVkCi0JaW4gdGhlIFN0cmF0dXMgRlRYL0dvbGYgT2JqZWN0IEZpbGUgRm9ybWF0IChTRUQtMTc2MikgZGF0ZWQKLQlGZWJydWFyeSAxOTk0LiAgKi8KLQotI2luY2x1ZGUgImVsZjMyLWhwcGEuaCIKLSNpbmNsdWRlICJocHBhX3N0dWJzLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhwcGFfZWxmX3JlbG9jYXRlX2luc24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGxvbmcsCi0JICAgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEsIGJmZF92bWEsIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgYXNlY3Rpb24gKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9ocHBhX3N0dWJfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICopKSkpOwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWxmMzJfaHBwYV9zaXplX29mX3N0dWIKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViCi0gIFBBUkFNUyAoKGJmZF92bWEsIGJmZF92bWEsIGNoYXIgKikpOwotCi0vKiBGb3IgbGlua2VyIHN0dWIgaGFzaCB0YWJsZXMuICAqLwotI2RlZmluZSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotI2RlZmluZSBlbGYzMl9ocHBhX3N0dWJfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykgXAotICAoYmZkX2hhc2hfdHJhdmVyc2UgXAotICAgKCYodGFibGUpLT5yb290LCBcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLCBcCi0gICAgKGluZm8pKSkKLQotLyogRm9yIEhQUEEgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZjMyX2hwcGFfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdylcCi0gICgoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX2VudHJ5ICopCQkJCVwKLSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0jZGVmaW5lIGVsZjMyX2hwcGFfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBQQSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZjMyX2hwcGFfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0KLS8qIEFzc29ydGVkIGhhc2ggdGFibGUgZnVuY3Rpb25zLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhbiBlbnRyeSBpbiB0aGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9ocHBhX3N0dWJfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnJldDsKLQotICByZXQgPSAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPm9mZnNldCA9IDA7Ci0gICAgICByZXQtPnRhcmdldF92YWx1ZSA9IDA7Ci0gICAgICByZXQtPnRhcmdldF9zZWN0aW9uID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGEgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBzdHViX2JmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICpzdHViX2JmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPm9mZnNldCA9IDA7Ci0gIHRhYmxlLT5sb2NhdGlvbiA9IDA7Ci0gIHRhYmxlLT5zdHViX2JmZCA9IHN0dWJfYmZkOwotICByZXR1cm4gKGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgbmV3ZnVuYykpOwotfQotCi0vKiBDcmVhdGUgdGhlIGRlcml2ZWQgbGlua2VyIGhhc2ggdGFibGUuICBUaGUgUEEgRUxGIHBvcnQgdXNlcyB0aGUgZGVyaXZlZAotICAgaGFzaCB0YWJsZSB0byBrZWVwIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBQQSBFTEYgbGlua2VyICh3aXRob3V0Ci0gICB1c2luZyBzdGF0aWMgdmFyaWFibGVzKS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoIV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0LT5zdHViX2hhc2hfdGFibGUgPSBOVUxMOwotICByZXQtPm91dHB1dF9zeW1ib2xfY291bnQgPSAwOwotICByZXQtPmdsb2JhbF92YWx1ZSA9IDA7Ci0gIHJldC0+Z2xvYmFsX3N5bV9kZWZpbmVkID0gMDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBSZWxvY2F0ZSB0aGUgZ2l2ZW4gSU5TTiBnaXZlbiB0aGUgdmFyaW91cyBpbnB1dCBwYXJhbWV0ZXJzLgotCi0gICBGSVhNRTogZW5kaWFubmVzcyBhbmQgc2l6ZW9mIChsb25nKSBpc3N1ZXMgYWJvdW5kIGhlcmUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaHBwYV9lbGZfcmVsb2NhdGVfaW5zbiAoYWJmZCwgaW5wdXRfc2VjdCwgaW5zbiwgYWRkcmVzcywgc3ltX3ZhbHVlLAotCQkJcl9hZGRlbmQsIHJfZm9ybWF0LCByX2ZpZWxkLCBwY3JlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdDsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0gICAgIGxvbmcgc3ltX3ZhbHVlOwotICAgICBsb25nIHJfYWRkZW5kOwotICAgICB1bnNpZ25lZCBsb25nIHJfZm9ybWF0OwotICAgICB1bnNpZ25lZCBsb25nIHJfZmllbGQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlID0gZ2V0X29wY29kZSAoaW5zbik7Ci0gIGxvbmcgY29uc3RhbnRfdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGNvZGUpCi0gICAgewotICAgIGNhc2UgTERPOgotICAgIGNhc2UgTERCOgotICAgIGNhc2UgTERIOgotICAgIGNhc2UgTERXOgotICAgIGNhc2UgTERXTToKLSAgICBjYXNlIFNUQjoKLSAgICBjYXNlIFNUSDoKLSAgICBjYXNlIFNUVzoKLSAgICBjYXNlIFNUV006Ci0gICAgY2FzZSBDT01JQ0xSOgotICAgIGNhc2UgU1VCSToKLSAgICBjYXNlIEFERElUOgotICAgIGNhc2UgQURESToKLSAgICBjYXNlIExESUw6Ci0gICAgY2FzZSBBRERJTDoKLSAgICAgIGNvbnN0YW50X3ZhbHVlID0gSFBQQV9SX0NPTlNUQU5UIChyX2FkZGVuZCk7Ci0KLSAgICAgIGlmIChwY3JlbCkKLQlzeW1fdmFsdWUgLT0gYWRkcmVzczsKLQotICAgICAgc3ltX3ZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOwotICAgICAgcmV0dXJuIGhwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCBzeW1fdmFsdWUsIHJfZm9ybWF0KTsKLQotICAgIGNhc2UgQkw6Ci0gICAgY2FzZSBCRToKLSAgICBjYXNlIEJMRToKLSAgICAgIC8qIFhYWCBjb21wdXRpbmcgY29uc3RhbnRfdmFsdWUgaXMgbm90IG5lZWRlZD8/PyAqLwotICAgICAgY29uc3RhbnRfdmFsdWUgPSBhc3NlbWJsZV8xNyAoKGluc24gJiAweDAwMWYwMDAwKSA+PiAxNiwKLQkJCQkgICAgKGluc24gJiAweDAwMDAxZmZjKSA+PiAyLAotCQkJCSAgICBpbnNuICYgMSk7Ci0KLSAgICAgIGNvbnN0YW50X3ZhbHVlID0gKGNvbnN0YW50X3ZhbHVlIDw8IDE1KSA+PiAxNTsKLSAgICAgIGlmIChwY3JlbCkKLQl7Ci0JICBzeW1fdmFsdWUgLT0KLQkgICAgYWRkcmVzcyArIGlucHV0X3NlY3QtPm91dHB1dF9vZmZzZXQKLQkgICAgKyBpbnB1dF9zZWN0LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgc3ltX3ZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgLTgsIHJfZmllbGQpOwotCX0KLSAgICAgIGVsc2UKLQlzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCk7Ci0KLSAgICAgIHJldHVybiBocHBhX3JlYnVpbGRfaW5zbiAoYWJmZCwgaW5zbiwgc3ltX3ZhbHVlID4+IDIsIHJfZm9ybWF0KTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAob3Bjb2RlID09IDApCi0JewotCSAgY29uc3RhbnRfdmFsdWUgPSBIUFBBX1JfQ09OU1RBTlQgKHJfYWRkZW5kKTsKLQotCSAgaWYgKHBjcmVsKQotCSAgICBzeW1fdmFsdWUgLT0gYWRkcmVzczsKLQotCSAgcmV0dXJuIGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIGNvbnN0YW50X3ZhbHVlLCByX2ZpZWxkKTsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBSZWxvY2F0ZSBhbiBIUFBBIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBob3d0byA9IGVsZl9ocHBhX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc3ltX3NlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHN5bV9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHN5bV9zZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9ICgoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04KLQkJCSAgID8gMCA6IHN5bS0+c3RfdmFsdWUpCi0JCQkgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBpbmR4OwotCi0JICBpbmR4ID0gcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZHhdOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzeW1fc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0Jc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgZWxzZQotCXsKLQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCSAgICAgIHN5bS0+c3RfbmFtZSk7Ci0JICBpZiAoc3ltX25hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCpzeW1fbmFtZSA9PSAnXDAnKQotCSAgICBzeW1fbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc3ltX3NlYyk7Ci0JfQotCi0gICAgICByID0gZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JCQkJCSAgICAgIHJlbC0+cl9vZmZzZXQsIHJlbG9jYXRpb24sCi0JCQkJCSAgICAgIHJlbC0+cl9hZGRlbmQsIGluZm8sIHN5bV9zZWMsCi0JCQkJCSAgICAgIHN5bV9uYW1lLCBoID09IE5VTEwpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBmb3IgRFAgcmVsYXRpdmUgcmVsb2NzIGlmICRnbG9iYWwkIGlzCi0JICAgICAgIHVuZGVmaW5lZC4gIFRoaXMgaXMgYSBwYW5pYyBzaXR1YXRpb24gc28gd2UgZG9uJ3QgdHJ5Ci0JICAgICAgIHRvIGNvbnRpbnVlLiAgKi8KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgIiRnbG9iYWwkIiwgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIHsKLQkJLyogV2UgdXNlIHRoaXMgcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgd2UgcGVyZm9ybWVkCi0JCSAgIGEgImRhbmdlcm91cyIgcmVsb2NhdGlvbi4gIFRoaXMgZG9lc24ndCBtZWFuIHdlIGRpZAotCQkgICB0aGUgd3JvbmcgdGhpbmcsIGl0IGp1c3QgbWVhbnMgdGhlcmUgbWF5IGJlIHNvbWUgY2xlYW51cAotCQkgICB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaGVyZS4KLQotCQkgICBJbiBwYXJ0aWN1bGFyIHdlIGhhZCB0byBzd2FwIHRoZSBsYXN0IGNhbGwgaW5zbiBhbmQgaXRzCi0JCSAgIGRlbGF5IHNsb3QuICBJZiB0aGUgZGVsYXkgc2xvdCBpbnNuIG5lZWRlZCBhIHJlbG9jYXRpb24sCi0JCSAgIHRoZW4gd2UnbGwgbmVlZCB0byBhZGp1c3QgdGhlIG5leHQgcmVsb2NhdGlvbiBlbnRyeSdzCi0JCSAgIG9mZnNldCB0byBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IHRoZSBpbnNuIG1vdmVkLgotCi0JCSAgIFRoaXMgaGFpciB3b3VsZG4ndCBiZSBuZWNlc3NhcnkgaWYgd2UgaW5zZXJ0ZWQgc3R1YnMKLQkJICAgYmV0d2VlbiBwcm9jZWR1cmVzIGFuZCB1c2VkIGEgImJsIiB0byBnZXQgdG8gdGhlIHN0dWIuICAqLwotCQlpZiAocmVsICE9IHJlbGVuZCkKLQkJICB7Ci0JCSAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbmV4dF9yZWwgPSByZWwgKyAxOwotCi0JCSAgICBpZiAocmVsLT5yX29mZnNldCArIDQgPT0gbmV4dF9yZWwtPnJfb2Zmc2V0KQotCQkgICAgICBuZXh0X3JlbC0+cl9vZmZzZXQgLT0gNDsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQlpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgIChpbmZvLCBzeW1fbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFjdHVhbGx5IHBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgVGhpcyBjYW4gZ2V0Ci0gICByYXRoZXIgaGFpcnkgd2hlbiBsaW5rZXIgc3R1YnMgYXJlIG5lZWRlZC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSAgICBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIHN5bV9uYW1lLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICBpbnQgaXNfbG9jYWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyByX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgdW5zaWduZWQgbG9uZyByX2Zvcm1hdCA9IGhvd3RvLT5iaXRzaXplOwotICB1bnNpZ25lZCBsb25nIHJfZmllbGQgPSBlX2ZzZWw7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OwotICBib29sZWFuIHJfcGNyZWwgPSBob3d0by0+cGNfcmVsYXRpdmU7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsdWUgZm9yICRnbG9iYWwkLiAgRklYTUUgaXNuJ3QgdGhpcyBlZmZlY3RpdmVseQotICAgICBqdXN0IGxpa2UgdGhlIGdwIHBvaW50ZXIgb24gTUlQUz8gIENhbiB3ZSB1c2UgdGhvc2Ugcm91dGluZXMgZm9yIHRoaXMKLSAgICAgcHVycG9zZT8gICovCi0gIGlmICghZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3N5bV9kZWZpbmVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksICIkZ2xvYmFsJCIsIGZhbHNlLAotCQkJCSBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpc24ndCBhICRnbG9iYWwkLCB0aGVuIHdlJ3JlIGluIGRlZXAgdHJvdWJsZS4gICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICAvKiBJZiAkZ2xvYmFsJCBpc24ndCBhIGRlZmluZWQgc3ltYm9sLCB0aGVuIHdlJ3JlIHN0aWxsIGluIGRlZXAKLQkgdHJvdWJsZS4gICovCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQlyZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF9zeW1fZGVmaW5lZCA9IDE7Ci0gICAgfQotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUEFSSVNDX05PTkU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QQVJJU0NfRElSMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxN0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3QzoKLSAgICAgIHJfZmllbGQgPSBlX2ZzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjFMOgotICAgICAgcl9maWVsZCA9IGVfbHJzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNFI6Ci0gICAgICByX2ZpZWxkID0gZV9ycnNlbDsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotCi0gICAgLyogRm9yIGFsbCB0aGUgRFAgcmVsYXRpdmUgcmVsb2NhdGlvbnMsIHdlIG5lZWQgdG8gZXhhbWluZSB0aGUgc3ltYm9sJ3MKLSAgICAgICBzZWN0aW9uLiAgSWYgaXQncyBhIGNvZGUgc2VjdGlvbiwgdGhlbiAiZGF0YSBwb2ludGVyIHJlbGF0aXZlIiBtYWtlcwotICAgICAgIG5vIHNlbnNlLiAgSW4gdGhhdCBjYXNlIHdlIGRvbid0IGFkanVzdCB0aGUgInZhbHVlIiwgYW5kIGZvciAyMSBiaXQKLSAgICAgICBhZGRpbCBpbnN0cnVjdGlvbnMsIHdlIGNoYW5nZSB0aGUgc291cmNlIGFkZGVuZCByZWdpc3RlciBmcm9tICVkcCB0bwotICAgICAgICVyMC4gICovCi0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDIxTDoKLSAgICAgIHJfZmllbGQgPSBlX2xyc2VsOwotICAgICAgaWYgKHN5bV9zZWMtPmZsYWdzICYgU0VDX0NPREUpCi0JewotCSAgaWYgKChpbnNuICYgMHhmYzAwMDAwMCkgPj4gMjYgPT0gMHhhCi0JICAgICAgICYmIChpbnNuICYgMHgwM2UwMDAwMCkgPj4gMjEgPT0gMHgxYikKLQkgICAgaW5zbiAmPSB+MHgwM2UwMDAwMDsKLQl9Ci0gICAgICBlbHNlCi0JdmFsdWUgLT0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0UjoKLSAgICAgIHJfZmllbGQgPSBlX3Jyc2VsOwotICAgICAgaWYgKChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNEY6Ci0gICAgICByX2ZpZWxkID0gZV9mc2VsOwotICAgICAgaWYgKChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotCi0gICAgLyogVGhlc2UgY2FzZXMgYXJlIHNlcGFyYXRlIGFzIHRoZXkgbWF5IGludm9sdmUgYSBsb3QgbW9yZSB3b3JrCi0gICAgICAgdG8gZGVhbCB3aXRoIGxpbmtlciBzdHVicy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwzMjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMQUJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMQUJFTDE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgotICAgICAgewotCWJmZF92bWEgbG9jYXRpb247Ci0JdW5zaWduZWQgaW50IGxlbjsKLQljaGFyICpuZXdfbmFtZSwgKnN0dWJfbmFtZTsKLQotCS8qIEdldCB0aGUgZmllbGQgc2VsZWN0b3IgcmlnaHQuICBXZSdsbCBuZWVkIGl0IGluIGEgbWludXRlLiAgKi8KLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdGCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19QTEFCRUwzMikKLQkgIHJfZmllbGQgPSBlX2ZzZWw7Ci0JZWxzZSBpZiAocl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDIxTCkKLQkgIHJfZmllbGQgPSBlX2xyc2VsOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTEFCRUwxNFIpCi0JICByX2ZpZWxkID0gZV9ycnNlbDsKLQotCS8qIEZpbmQgb3V0IHdoZXJlIHdlIGFyZSBhbmQgd2hlcmUgd2UncmUgZ29pbmcuICAqLwotCWxvY2F0aW9uID0gKG9mZnNldCArCi0JCSAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKLQkJICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JbGVuID0gc3RybGVuIChzeW1fbmFtZSkgKyAxOwotCWlmIChpc19sb2NhbCkKLQkgIGxlbiArPSA5OwotCW5ld19uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKLQlpZiAoIW5ld19uYW1lKQotCSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0Jc3RyY3B5IChuZXdfbmFtZSwgc3ltX25hbWUpOwotCi0JLyogTG9jYWwgc3ltYm9scyBoYXZlIHVuaXF1ZSBJRHMuICAqLwotCWlmIChpc19sb2NhbCkKLQkgIHNwcmludGYgKG5ld19uYW1lICsgbGVuIC0gMTAsICJfJTA4eCIsIChpbnQpc3ltX3NlYyk7Ci0KLQkvKiBBbnkga2luZCBvZiBsaW5rZXIgc3R1YiBuZWVkZWQ/ICAqLwotCWlmICgoKGludCkodmFsdWUgLSBsb2NhdGlvbikgPiAweDNmZmZmKQotCSAgICB8fCAoKGludCkodmFsdWUgLSBsb2NhdGlvbikgPCAoaW50KTB4ZmZmYzAwMDApKQotCSAgewotCSAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZTsKLQkgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICpzdHViX2hhc2g7Ci0JICAgIGFzZWN0aW9uICpzdHViX3NlY3Rpb247Ci0KLQkgICAgLyogQnVpbGQgYSBuYW1lIGZvciB0aGUgc3R1Yi4gICovCi0KLQkgICAgbGVuID0gc3RybGVuIChuZXdfbmFtZSk7Ci0JICAgIGxlbiArPSAyMzsKLQkgICAgc3R1Yl9uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKLQkgICAgaWYgKCFzdHViX25hbWUpCi0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0JICAgIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChsb2NhdGlvbiwgdmFsdWUsIHN0dWJfbmFtZSk7Ci0JICAgIHN0cmNhdCAoc3R1Yl9uYW1lLCBuZXdfbmFtZSk7Ci0JICAgIGZyZWUgKG5ld19uYW1lKTsKLQotCSAgICBzdHViX2hhc2hfdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5zdHViX2hhc2hfdGFibGU7Ci0KLQkgICAgc3R1Yl9oYXNoCi0JICAgICAgPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9uYW1lLAotCQkJCQkgICAgIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgLyogV2UncmUgZG9uZSB3aXRoIHRoYXQgbmFtZS4gICovCi0JICAgIGZyZWUgKHN0dWJfbmFtZSk7Ci0KLQkgICAgLyogVGhlIHN0dWIgQkZEIG9ubHkgaGFzIG9uZSBzZWN0aW9uLiAgKi8KLQkgICAgc3R1Yl9zZWN0aW9uID0gc3R1Yl9oYXNoX3RhYmxlLT5zdHViX2JmZC0+c2VjdGlvbnM7Ci0KLQkgICAgaWYgKHN0dWJfaGFzaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3RikKLQkJICB7Ci0JCSAgICB1bnNpZ25lZCBsb25nIGRlbGF5X2luc247Ci0JCSAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlLCBydG5fcmVnLCBsZG9fdGFyZ2V0X3JlZywgbGRvX3NyY19yZWc7Ci0KLQkJICAgIC8qIFdlJ2xsIG5lZWQgdG8gcGVlayBhdCB0aGUgbmV4dCBpbnNuLiAgKi8KLQkJICAgIGRlbGF5X2luc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhICsgNCk7Ci0JCSAgICBvcGNvZGUgPSBnZXRfb3Bjb2RlIChkZWxheV9pbnNuKTsKLQotCQkgICAgLyogV2UgYWxzbyBuZWVkIHRvIGtub3cgdGhlIHJldHVybiByZWdpc3RlciBmb3IgdGhpcwotCQkgICAgICAgY2FsbC4gICovCi0JCSAgICBydG5fcmVnID0gKGluc24gJiAweDAzZTAwMDAwKSA+PiAyMTsKLQotCQkgICAgbGRvX3NyY19yZWcgPSAoZGVsYXlfaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxOwotCQkgICAgbGRvX3RhcmdldF9yZWcgPSAoZGVsYXlfaW5zbiAmIDB4MDAxZjAwMDApID4+IDE2OwotCi0JCSAgICAvKiBNdW5nZSB1cCB0aGUgdmFsdWUgYW5kIG90aGVyIHBhcmFtZXRlcnMgZm9yCi0JCSAgICAgICBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuLiAgKi8KLQotCQkgICAgdmFsdWUgPSAoc3R1Yl9oYXNoLT5vZmZzZXQKLQkJCSAgICAgKyBzdHViX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgKyBzdHViX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JCSAgICByX2Zvcm1hdCA9IDE3OwotCQkgICAgcl9maWVsZCA9IGVfZnNlbDsKLQkJICAgIHJfcGNyZWwgPSAwOwotCQkgICAgYWRkZW5kID0gMDsKLQotCQkgICAgLyogV2UgbmVlZCB0byBwZWVrIGF0IHRoZSBkZWxheSBpbnNuIGFuZCBkZXRlcm1pbmUgaWYKLQkJICAgICAgIHdlJ2xsIG5lZWQgdG8gc3dhcCB0aGUgYnJhbmNoIGFuZCBpdHMgZGVsYXkgaW5zbi4gICovCi0JCSAgICBpZiAoKGluc24gJiAyKQotCQkJfHwgKG9wY29kZSA9PSBMRE8KLQkJCSAgICAmJiBsZG9fdGFyZ2V0X3JlZyA9PSBydG5fcmVnKQotCQkJfHwgKGRlbGF5X2luc24gPT0gMHgwODAwMDI0MCkpCi0JCSAgICAgIHsKLQkJCS8qIE5vIG5lZWQgdG8gc3dhcCB0aGUgYnJhbmNoIGFuZCBpdHMgZGVsYXkgc2xvdCwgYnV0Ci0JCQkgICB3ZSBkbyBuZWVkIHRvIG1ha2Ugc3VyZSB0byBqdW1wIHBhc3QgdGhlIHJldHVybgotCQkJICAgcG9pbnRlciB1cGRhdGUgaW4gdGhlIHN0dWIuICAqLwotCQkJdmFsdWUgKz0gNDsKLQotCQkJLyogSWYgdGhlIGRlbGF5IGluc24gZG9lcyBhIHJldHVybiBwb2ludGVyIGFkanVzdG1lbnQsCi0JCQkgICB0aGVuIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGl0IHN0YXlzIHZhbGlkLiAgKi8KLQkJCWlmIChvcGNvZGUgPT0gTERPCi0JCQkgICAgJiYgbGRvX3RhcmdldF9yZWcgPT0gcnRuX3JlZykKLQkJCSAgewotCQkJICAgIGRlbGF5X2luc24gJj0gMHhmYzAwZmZmZjsKLQkJCSAgICBkZWxheV9pbnNuIHw9ICgoMzEgPDwgMjEpIHwgKDMxIDw8IDE2KSk7Ci0JCQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBkZWxheV9pbnNuLCBoaXRfZGF0YSArIDQpOwotCQkJICB9Ci0JCQkvKiBVc2UgYSBCTEUgdG8gcmVhY2ggdGhlIHN0dWIuICAqLwotCQkJaW5zbiA9IEJMRV9TUjRfUjA7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogV29uZGVyZnVsLCB3ZSBoYXZlIHRvIHN3YXAgdGhlIGNhbGwgaW5zbiBhbmQgaXRzCi0JCQkgICBkZWxheSBzbG90LiAgKi8KLQkJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgZGVsYXlfaW5zbiwgaGl0X2RhdGEpOwotCQkJLyogVXNlIGEgQkxFLG4gdG8gcmVhY2ggdGhlIHN0dWIuICAqLwotCQkJaW5zbiA9IChCTEVfU1I0X1IwIHwgMHgyKTsKLQkJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEgKyA0KTsKLQkJCWluc24gPSBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSAgICAgICBpbnNuLCBvZmZzZXQgKyA0LAotCQkJCQkJICAgICAgIHZhbHVlLCBhZGRlbmQsCi0JCQkJCQkgICAgICAgcl9mb3JtYXQsIHJfZmllbGQsCi0JCQkJCQkgICAgICAgcl9wY3JlbCk7Ci0JCQkvKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIHdvcmQuICAqLwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSArIDQpOwotCQkJcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgICBlbHNlCi0JCSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0JICAgICAgfQotCSAgfQotCWdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgICAgfQotCi1kb19iYXNpY190eXBlXzE6Ci0gICAgICBpbnNuID0gaHBwYV9lbGZfcmVsb2NhdGVfaW5zbiAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBpbnNuLAotCQkJCSAgICAgb2Zmc2V0LCB2YWx1ZSwgYWRkZW5kLCByX2Zvcm1hdCwKLQkJCQkgICAgIHJfZmllbGQsIHJfcGNyZWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTb21ldGhpbmcgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEpOwotICByZXR1cm4gKGJmZF9yZWxvY19vayk7Ci19Ci0KLS8qIFVuZG8gdGhlIGdlbmVyaWMgRUxGIGNvZGUncyBzdWJ0cmFjdGlvbiBvZiBzZWN0aW9uLT52bWEgZnJvbSB0aGUKLSAgIHZhbHVlIG9mIGVhY2ggZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICAqdmFscCArPSAoKnNlY3ApLT52bWE7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIHN0dWIgbmVlZGVkIHRvIHBlcmZvcm0gYSBjYWxsIGFzc3VtaW5nIHRoZQotICAgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGZvciBjYWxsZXIgYW5kIGNhbGxlZSBhcmUgaW4gQ0FMTEVSIGFuZCBDQUxMRUUKLSAgIGZvciBhIGNhbGwgZnJvbSBMT0NBVElPTiB0byBERVNUSU5BVElPTi4gIENvcHkgdGhlIG5hbWUgaW50byBTVFVCX05BTUUuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIgKGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3R1Yl9uYW1lKQotICAgICBiZmRfdm1hIGxvY2F0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgZGVzdGluYXRpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqc3R1Yl9uYW1lOwotewotICBzdHJjcHkgKHN0dWJfbmFtZSwgIl9fX19fbG9uZ19icmFuY2hfc3R1Yl8iKTsKLX0KLQotLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBuZWVkZWQgdG8gY2FsbCBmcm9tIExPQ0FUSU9OIHRvIERFU1RJTkFUSU9OCi0gICAoYSBmdW5jdGlvbiBuYW1lZCBTWU1fTkFNRSksIHdpdGggYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIENBTExFUiBhbmQKLSAgIENBTExFRS4gIFJldHVybiB6ZXJvIGlmIG5vIHN0dWIgaXMgbmVlZGVkIHRvIHBlcmZvcm0gc3VjaCBhIGNhbGwuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1lbGYzMl9ocHBhX3NpemVfb2Zfc3R1YiAobG9jYXRpb24sIGRlc3RpbmF0aW9uLCBzeW1fbmFtZSkKLSAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247Ci0gICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotewotICAvKiBEZXRlcm1pbmUgaWYgYSBsb25nIGJyYW5jaCBzdHViIGlzIG5lZWRlZC4gICovCi0gIGlmICghKCgoaW50KShsb2NhdGlvbiAtIGRlc3RpbmF0aW9uKSA+IDB4M2ZmZmYpCi0JfHwgKChpbnQpKGxvY2F0aW9uIC0gZGVzdGluYXRpb24pIDwgKGludCkweGZmZmMwMDAwKSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKCFzdHJuY21wICgiJCQiLCBzeW1fbmFtZSwgMikKLSAgICAgICYmIHN0cmNtcCAoIiQkZHluY2FsbCIsIHN5bV9uYW1lKSkKLSAgICByZXR1cm4gMTI7Ci0gIGVsc2UKLSAgICByZXR1cm4gMTY7Ci19Ci0KLS8qIEJ1aWxkIG9uZSBsaW5rZXIgc3R1YiBhcyBkZWZpbmVkIGJ5IHRoZSBzdHViIGhhc2ggdGFibGUgZW50cnkgR0VOX0VOVFJZLgotICAgSU5fQVJHUyBjb250YWlucyB0aGUgc3R1YiBCRkQgYW5kIGxpbmsgaW5mbyBwb2ludGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX2J1aWxkX29uZV9zdHViIChnZW5fZW50cnksIGluX2FyZ3MpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZ2VuX2VudHJ5OwotICAgICBQVFIgaW5fYXJnczsKLXsKLSAgdm9pZCAqKmFyZ3MgPSAodm9pZCAqKilpbl9hcmdzOwotICBiZmQgKnN0dWJfYmZkID0gKGJmZCAqKWFyZ3NbMF07Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopYXJnc1sxXTsKLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICplbnRyeTsKLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICpzdHViX2hhc2hfdGFibGU7Ci0gIGJmZF9ieXRlICpsb2M7Ci0gIHN5bXZhbHVlIHN5bV92YWx1ZTsKLSAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0KLSAgLyogSW5pdGlhbGl6ZSBwb2ludGVycyB0byB0aGUgc3R1YiBoYXNoIHRhYmxlLCB0aGUgcGFydGljdWxhciBlbnRyeSB3ZQotICAgICBhcmUgYnVpbGRpbmcgYSBzdHViIGZvciwgYW5kIHdoZXJlIChpbiBtZW1vcnkpIHdlIHNob3VsZCBwbGFjZSB0aGUgc3R1YgotICAgICBpbnN0cnVjdGlvbnMuICAqLwotICBlbnRyeSA9IChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKilnZW5fZW50cnk7Ci0gIHN0dWJfaGFzaF90YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZShpbmZvKS0+c3R1Yl9oYXNoX3RhYmxlOwotICBsb2MgPSBzdHViX2hhc2hfdGFibGUtPmxvY2F0aW9uOwotCi0gIC8qIE1ha2UgYSBub3RlIG9mIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBzdHVicyBmb3IgdGhpcyBlbnRyeS4gICovCi0gIGVudHJ5LT5vZmZzZXQgPSBzdHViX2hhc2hfdGFibGUtPm9mZnNldDsKLQotICAvKiBUaGUgc3ltYm9sJ3MgbmFtZSBzdGFydHMgYXQgb2Zmc2V0IDIyLiAgKi8KLSAgc3ltX25hbWUgPSBlbnRyeS0+cm9vdC5zdHJpbmcgKyAyMjsKLQotICBzeW1fdmFsdWUgPSAoZW50cnktPnRhcmdldF92YWx1ZQotCSAgICAgICArIGVudHJ5LT50YXJnZXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCSAgICAgICArIGVudHJ5LT50YXJnZXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgaWYgKDEpCi0gICAgewotICAgICAgLyogQ3JlYXRlIG9uZSBvZiB0d28gdmFyaWFudCBsb25nIGJyYW5jaCBzdHVicy4gIE9uZSBmb3IgJCRkeW5jYWxsIGFuZAotCSBub3JtYWwgY2FsbHMsIHRoZSBvdGhlciBmb3IgY2FsbHMgdG8gbWlsbGljb2RlLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgIGludCBtaWxsaWNvZGVfY2FsbCA9IDA7Ci0KLSAgICAgIGlmICghc3RybmNtcCAoIiQkIiwgc3ltX25hbWUsIDIpICYmIHN0cmNtcCAoIiQkZHluY2FsbCIsIHN5bV9uYW1lKSkKLQltaWxsaWNvZGVfY2FsbCA9IDE7Ci0KLSAgICAgIC8qIEZpcnN0IHRoZSByZXR1cm4gcG9pbnRlciBhZGp1c3RtZW50LiAgRGVwZW5kaW5nIG9uIGV4YWN0IGNhbGxpbmcKLQkgc2VxdWVuY2UgdGhpcyBpbnN0cnVjdGlvbiBtYXkgYmUgc2tpcHBlZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERPX000X1IzMV9SMzEsIGxvYyk7Ci0KLSAgICAgIC8qIFRoZSBuZXh0IHR3byBpbnN0cnVjdGlvbnMgYXJlIHRoZSBsb25nIGJyYW5jaCBpdHNlbGYuICBBIGxvbmcgYnJhbmNoCi0JIGlzIGZvcm1lZCB3aXRoICJsZGlsIiBsb2FkaW5nIHRoZSB1cHBlciBiaXRzIG9mIHRoZSB0YXJnZXQgYWRkcmVzcwotCSBpbnRvIGEgcmVnaXN0ZXIsIHRoZW4gYnJhbmNoaW5nIHdpdGggImJlIiB3aGljaCBhZGRzIGluIHRoZSBsb3dlciBiaXRzLgotCSBMb25nIGJyYW5jaGVzIHRvIG1pbGxpY29kZSBudWxsaWZ5IHRoZSBkZWxheSBzbG90IG9mIHRoZSAiYmUiLiAgKi8KLSAgICAgIGluc24gPSBocHBhX3JlYnVpbGRfaW5zbiAoc3R1Yl9iZmQsIExESUxfUjEsCi0JCQkJaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgMCwgZV9scnNlbCksIDIxKTsKLSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBpbnNuLCBsb2MgKyA0KTsKLSAgICAgIGluc24gPSBocHBhX3JlYnVpbGRfaW5zbiAoc3R1Yl9iZmQsIEJFX1NSNF9SMSB8IChtaWxsaWNvZGVfY2FsbCA/IDIgOiAwKSwKLQkJCQlocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAwLCBlX3Jyc2VsKSA+PiAyLAotCQkJCTE3KTsKLSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBpbnNuLCBsb2MgKyA4KTsKLQotICAgICAgaWYgKCFtaWxsaWNvZGVfY2FsbCkKLQl7Ci0JICAvKiBUaGUgc2VxdWVuY2UgdG8gY2FsbCB0aGlzIHN0dWIgcGxhY2VzIHRoZSByZXR1cm4gcG9pbnRlciBpbnRvICVyMzEsCi0JICAgICB0aGUgZmluYWwgdGFyZ2V0IGV4cGVjdHMgdGhlIHJldHVybiBwb2ludGVyIGluICVyMiwgc28gY29weSB0aGUKLQkgICAgICByZXR1cm4gcG9pbnRlciBpbnRvIHRoZSBwcm9wZXIgcmVnaXN0ZXIuICAqLwotCSAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIENPUFlfUjMxX1IyLCBsb2MgKyAxMik7Ci0KLQkgIC8qIFVwZGF0ZSB0aGUgbG9jYXRpb24gYW5kIG9mZnNldHMuICAqLwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbiArPSAxNjsKLQkgIHN0dWJfaGFzaF90YWJsZS0+b2Zmc2V0ICs9IDE2OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBVcGRhdGUgdGhlIGxvY2F0aW9uIGFuZCBvZmZzZXRzLiAgKi8KLQkgIHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb24gKz0gMTI7Ci0JICBzdHViX2hhc2hfdGFibGUtPm9mZnNldCArPSAxMjsKLQl9Ci0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFeHRlcm5hbCBlbnRyeSBwb2ludHMgZm9yIHNpemluZyBhbmQgYnVpbGRpbmcgbGlua2VyIHN0dWJzLiAgKi8KLQotLyogQnVpbGQgYWxsIHRoZSBzdHVicyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgb3V0cHV0IGZpbGUuICBUaGUKLSAgIHN0dWJzIGFyZSBrZXB0IGluIGEgaGFzaCB0YWJsZSBhdHRhY2hlZCB0byB0aGUgbWFpbiBsaW5rZXIgaGFzaAotICAgdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEgaHBwYWVsZl9maW5pc2ggaW4gdGhlIGxpbmtlci4gICovCi0KLWJvb2xlYW4KLWVsZjMyX2hwcGFfYnVpbGRfc3R1YnMgKHN0dWJfYmZkLCBpbmZvKQotICAgICBiZmQgKnN0dWJfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgLyogVGhlIHN0dWIgQkZEIG9ubHkgaGFzIG9uZSBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0dWJfc2VjID0gc3R1Yl9iZmQtPnNlY3Rpb25zOwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnRhYmxlOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgdm9pZCAqYXJnc1syXTsKLQotICAvKiBTbyB3ZSBjYW4gcGFzcyBib3RoIHRoZSBCRkQgZm9yIHRoZSBzdHVicyBhbmQgdGhlIGxpbmsgaW5mbwotICAgICBzdHJ1Y3R1cmUgdG8gdGhlIHJvdXRpbmUgd2hpY2ggYWN0dWFsbHkgYnVpbGRzIHN0dWJzLiAgKi8KLSAgYXJnc1swXSA9IHN0dWJfYmZkOwotICBhcmdzWzFdID0gaW5mbzsKLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0aGUgbGlua2VyIHN0dWJzLiAgKi8KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLCBzdHViX3NlYyk7Ci0gIHN0dWJfc2VjLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKHN0dWJfYmZkLCBzaXplKTsKLSAgaWYgKHN0dWJfc2VjLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLSAgdGFibGUtPmxvY2F0aW9uID0gc3R1Yl9zZWMtPmNvbnRlbnRzOwotCi0gIC8qIEJ1aWxkIHRoZSBzdHVicyBhcyBkaXJlY3RlZCBieSB0aGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLSAgZWxmMzJfaHBwYV9zdHViX2hhc2hfdHJhdmVyc2UgKHRhYmxlLCBlbGYzMl9ocHBhX2J1aWxkX29uZV9zdHViLCBhcmdzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIGFuZCBzZXQgdGhlIHNpemUgb2YgdGhlIHN0dWIgc2VjdGlvbiBmb3IgYSBmaW5hbCBsaW5rLgotCi0gICBUaGUgYmFzaWMgaWRlYSBoZXJlIGlzIHRvIGV4YW1pbmUgYWxsIHRoZSByZWxvY2F0aW9ucyBsb29raW5nIGZvcgotICAgUEMtcmVsYXRpdmUgY2FsbHMgdG8gYSB0YXJnZXQgdGhhdCBpcyB1bnJlYWNoYWJsZSB3aXRoIGEgImJsIgotICAgaW5zdHJ1Y3Rpb24gb3IgY2FsbHMgd2hlcmUgdGhlIGNhbGxlciBhbmQgY2FsbGVlIGRpc2FncmVlIG9uIHRoZQotICAgbG9jYXRpb24gb2YgdGhlaXIgYXJndW1lbnRzIG9yIHJldHVybiB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLWVsZjMyX2hwcGFfc2l6ZV9zdHVicyAoc3R1Yl9iZmQsIG91dHB1dF9iZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICpzdHViX2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBhc2VjdGlvbiAqc2VjdGlvbiwgKnN0dWJfc2VjID0gMDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsICoqYWxsX2xvY2FsX3N5bXM7Ci0gIHVuc2lnbmVkIGludCBpLCBpbmRleCwgYmZkX2NvdW50ID0gMDsKLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICpzdHViX2hhc2hfdGFibGUgPSAwOwotCi0gIC8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLSAgc3R1Yl9oYXNoX3RhYmxlID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKikKLQkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSkpKTsKLSAgaWYgKCFzdHViX2hhc2hfdGFibGUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCFlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZV9pbml0IChzdHViX2hhc2hfdGFibGUsIHN0dWJfYmZkLAotCQkJCQllbGYzMl9ocHBhX3N0dWJfaGFzaF9uZXdmdW5jKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBBdHRhY2ggdGhlIGhhc2ggdGFibGVzIHRvIHRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICBlbGYzMl9ocHBhX2hhc2hfdGFibGUobGlua19pbmZvKS0+c3R1Yl9oYXNoX3RhYmxlID0gc3R1Yl9oYXNoX3RhYmxlOwotCi0gIC8qIENvdW50IHRoZSBudW1iZXIgb2YgaW5wdXQgQkZEcy4gICovCi0gIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzOwotICAgICAgIGlucHV0X2JmZCAhPSBOVUxMOwotICAgICAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0KQotICAgICBiZmRfY291bnQrKzsKLQotICAvKiBNYWdpYyBhcyB3ZSBrbm93IHRoZSBzdHViIGJmZCBvbmx5IGhhcyBvbmUgc2VjdGlvbi4gICovCi0gIHN0dWJfc2VjID0gc3R1Yl9iZmQtPnNlY3Rpb25zOwotCi0gIC8qIElmIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUsIHRoZW4gd2UgZG9uJ3QKLSAgICAgaGF2ZSB0byBleGFtaW5lIHRoZSByZWxvY3MuICAqLwotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGFyZ3VtZW50IGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBhbGwgdGhlIGdsb2JhbAotICAgICBmdW5jdGlvbnMgd2UgY2FuIHN0YXJ0IGxvb2tpbmcgZm9yIHN0dWJzLiAgKi8KLSAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHMsIGluZGV4ID0gMDsKLSAgICAgICBpbnB1dF9iZmQgIT0gTlVMTDsKLSAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCwgaW5kZXgrKykKLSAgICB7Ci0gICAgICAvKiBXZSdsbCBuZWVkIHRoZSBzeW1ib2wgdGFibGUgaW4gYSBzZWNvbmQuICAqLwotICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gICAgICBpZiAoc3ltdGFiX2hkci0+c2hfaW5mbyA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBsb2NhbF9zeW1zID0gYWxsX2xvY2FsX3N5bXNbaW5kZXhdOwotCi0gICAgICAvKiBXYWxrIG92ZXIgZWFjaCBzZWN0aW9uIGF0dGFjaGVkIHRvIHRoZSBpbnB1dCBiZmQuICAqLwotICAgICAgZm9yIChzZWN0aW9uID0gaW5wdXRfYmZkLT5zZWN0aW9uczsKLQkgICBzZWN0aW9uICE9IE5VTEw7Ci0JICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKmlucHV0X3JlbF9oZHI7Ci0JICBFbGYzMl9FeHRlcm5hbF9SZWxhICpleHRlcm5hbF9yZWxvY3MsICplcmVsYWVuZCwgKmVyZWxhOwotCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcywgKmlyZWxhZW5kLCAqaXJlbGE7Ci0KLQkgIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzLCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0JICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICAgICAgfHwgc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZXh0ZXJuYWwgcmVsb2NhdGlvbnMuICAqLwotCSAgZXh0ZXJuYWxfcmVsb2NzCi0JICAgID0gKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JICAgICAgIGJmZF9tYWxsb2MgKHNlY3Rpb24tPnJlbG9jX2NvdW50Ci0JCQkgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKTsKLQkgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogTGlrZXdpc2UgZm9yIHRoZSBpbnRlcm5hbCByZWxvY2F0aW9ucy4gICovCi0JICBpbnRlcm5hbF9yZWxvY3MKLQkgICAgPSAoKEVsZl9JbnRlcm5hbF9SZWxhICopCi0JICAgICAgIGJmZF9tYWxsb2MgKHNlY3Rpb24tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCByZWxvY3MuICAqLwotCSAgaW5wdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsX2hkcjsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBpbnB1dF9yZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSwKLQkJCSAgIGlucHV0X2JmZCkgIT0gaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSkKLQkgICAgewotCSAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0JICAgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIFN3YXAgaW4gdGhlIHJlbG9jcy4gICovCi0JICBlcmVsYSA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGVyZWxhZW5kID0gZXJlbGEgKyBzZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZm9yICg7IGVyZWxhIDwgZXJlbGFlbmQ7IGVyZWxhKyssIGlyZWxhKyspCi0JICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbiAoaW5wdXRfYmZkLCBlcmVsYSwgaXJlbGEpOwotCi0JICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGV4dGVybmFsIHJlbG9jcywgZnJlZSB0aGVtLiAgKi8KLQkgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0KLQkgIC8qIE5vdyBleGFtaW5lIGVhY2ggcmVsb2NhdGlvbi4gICovCi0JICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLQkgIGlyZWxhZW5kID0gaXJlbGEgKyBzZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyByX3R5cGUsIHNpemVfb2Zfc3R1YjsKLQkgICAgICB1bnNpZ25lZCBsb25nIHJfaW5kZXg7Ci0JICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0JICAgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICpzdHViX2hhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotCSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCSAgICAgIHN5bXZhbHVlIHN5bV92YWx1ZTsKLQkgICAgICBiZmRfdm1hIGxvY2F0aW9uLCBkZXN0aW5hdGlvbjsKLQkgICAgICBjaGFyICpuZXdfbmFtZSA9IE5VTEw7Ci0KLQkgICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGlyZWxhLT5yX2luZm8pOwotCSAgICAgIHJfaW5kZXggPSBFTEYzMl9SX1NZTSAoaXJlbGEtPnJfaW5mbyk7Ci0KLQkgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLQkJewotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQkgICAgaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBPbmx5IGxvb2sgZm9yIHN0dWJzIG9uIGNhbGwgaW5zdHJ1Y3Rpb25zIG9yIHBsYWJlbAotCQkgcmVmZXJlbmNlcy4gICovCi0JICAgICAgaWYgKHJfdHlwZSAhPSBSX1BBUklTQ19QQ1JFTDE3RgotCQkgICYmIHJfdHlwZSAhPSBSX1BBUklTQ19QTEFCRUwzMgotCQkgICYmIHJfdHlwZSAhPSBSX1BBUklTQ19QTEFCRUwyMUwKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMTRSKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdyBkZXRlcm1pbmUgdGhlIGNhbGwgdGFyZ2V0LCBpdHMgbmFtZSwgdmFsdWUsIHNlY3Rpb24KLQkJIGFuZCBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMuICAqLwotCSAgICAgIGhhc2ggPSBOVUxMOwotCSAgICAgIHN5bSA9IE5VTEw7Ci0JICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0JICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCQl7Ci0JCSAgLyogSXQncyBhIGxvY2FsIHN5bWJvbC4gICovCi0JCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotCQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX2luZGV4OwotCQkgIGhkciA9IGVsZl9lbGZzZWN0aW9ucyAoaW5wdXRfYmZkKVtzeW0tPnN0X3NobmR4XTsKLQkJICBzeW1fc2VjID0gaGRyLT5iZmRfc2VjdGlvbjsKLQkJICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgc3ltX3ZhbHVlID0gKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OCi0JCQkgICAgICAgPyAwIDogc3ltLT5zdF92YWx1ZSk7Ci0JCSAgZGVzdGluYXRpb24gPSAoc3ltX3ZhbHVlCi0JCQkJICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAotCQkJCSArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBsb2NhbAotCQkgICAgIHN5bWJvbCBpbiB0aGUgc3R1YiBvciBhcmcgaW5mbyBoYXNoIHRhYmxlcy4gICovCi0JCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEl0J3MgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkJICBsb25nIGluZGV4OwotCi0JCSAgaW5kZXggPSByX2luZGV4IC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkJICBoYXNoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5kZXhdOwotCQkgIGlmIChoYXNoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGhhc2gtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICB7Ci0JCSAgICAgIHN5bV9zZWMgPSBoYXNoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgICAgIHN5bV9uYW1lID0gaGFzaC0+cm9vdC5yb290LnN0cmluZzsKLQkJICAgICAgc3ltX3ZhbHVlID0gaGFzaC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgICAgZGVzdGluYXRpb24gPSAoc3ltX3ZhbHVlCi0JCQkJICAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICAgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIE5vdyBkZXRlcm1pbmUgd2hlcmUgdGhlIGNhbGwgcG9pbnQgaXMuICAqLwotCSAgICAgIGxvY2F0aW9uID0gKHNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgKyBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgaXJlbGEtPnJfb2Zmc2V0KTsKLQotCSAgICAgIC8qIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZGVzdGluYXRpb24gZm9yIFBDUkVMIGZ1bmN0aW9uCi0JCSBjYWxscyAoZWcuIHdlIGRvbid0IGNhcmUgZm9yIFBMQUJFTFMpLiAgKi8KLQkgICAgICBpZiAocl90eXBlICE9IFJfUEFSSVNDX1BDUkVMMTdGKQotCQlsb2NhdGlvbiA9IGRlc3RpbmF0aW9uOwotCi0JICAgICAgLyogRGV0ZXJtaW5lIHdoYXQgKGlmIGFueSkgbGlua2VyIHN0dWIgaXMgbmVlZGVkIGFuZCBpdHMKLQkJIHNpemUgKGluIGJ5dGVzKS4gICovCi0JICAgICAgc2l6ZV9vZl9zdHViID0gZWxmMzJfaHBwYV9zaXplX29mX3N0dWIgKGxvY2F0aW9uLAotCQkJCQkJICAgICAgZGVzdGluYXRpb24sCi0JCQkJCQkgICAgICBzeW1fbmFtZSk7Ci0JICAgICAgaWYgKHNpemVfb2Zfc3R1YiAhPSAwKQotCQl7Ci0JCSAgY2hhciAqc3R1Yl9uYW1lOwotCQkgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkJICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBzdHViLiAgKi8KLQkJICBsZW4gPSBzdHJsZW4gKHN5bV9uYW1lKTsKLQkJICBsZW4gKz0gMjM7Ci0KLQkJICBzdHViX25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotCQkgIGlmICghc3R1Yl9uYW1lKQotCQkgICAgewotCQkgICAgICAvKiBCZWNhdXNlIHN5bV9uYW1lIHdhcyBtYWxsb2NkIGFib3ZlIGZvciBsb2NhbAotCQkJIHN5bWJvbHMuICAqLwotCQkgICAgICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JCQlmcmVlIChuZXdfbmFtZSk7Ci0KLQkJICAgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCSAgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIgKGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3R1Yl9uYW1lKTsKLQkJICBzdHJjYXQgKHN0dWJfbmFtZSArIDIyLCBzeW1fbmFtZSk7Ci0KLQkJICAvKiBCZWNhdXNlIHN5bV9uYW1lIHdhcyBtYWxsb2NlZCBhYm92ZSBmb3IgbG9jYWwgc3ltYm9scy4gICovCi0JCSAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCQkgICAgZnJlZSAobmV3X25hbWUpOwotCi0JCSAgc3R1Yl9oYXNoCi0JCSAgICA9IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCAoc3R1Yl9oYXNoX3RhYmxlLCBzdHViX25hbWUsCi0JCQkJCQkgICBmYWxzZSwgZmFsc2UpOwotCQkgIGlmIChzdHViX2hhc2ggIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIHByb3BlciBzdHViIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgbm90aGluZwotCQkJIGVsc2UgdG8gZG8uICAqLwotCQkgICAgICBmcmVlIChzdHViX25hbWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLCBzdHViX3NlYywKLQkJCQkJICAgIChiZmRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwKLQkJCQkJCQkgICAgICAgc3R1Yl9zZWMpCi0JCQkJCSAgICAgKyBzaXplX29mX3N0dWIpKTsKLQotCQkgICAgICAvKiBFbnRlciB0aGlzIGVudHJ5IGludG8gdGhlIGxpbmtlciBzdHViIGhhc2ggdGFibGUuICAqLwotCQkgICAgICBzdHViX2hhc2gKLQkJCT0gZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwIChzdHViX2hhc2hfdGFibGUsCi0JCQkJCQkgICAgICAgc3R1Yl9uYW1lLCB0cnVlLCB0cnVlKTsKLQkJICAgICAgaWYgKHN0dWJfaGFzaCA9PSBOVUxMKQotCQkJewotCQkJICBmcmVlIChzdHViX25hbWUpOwotCQkJICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkJICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCQkgICAgaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkJICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCi0JCSAgICAgIC8qIFdlJ2xsIG5lZWQgdGhlc2UgdG8gZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIHRoYXQgdGhlCi0JCQkgc3R1YiB3aWxsIGJyYW5jaCB0by4gICovCi0JCSAgICAgIHN0dWJfaGFzaC0+dGFyZ2V0X3ZhbHVlID0gc3ltX3ZhbHVlOwotCQkgICAgICBzdHViX2hhc2gtPnRhcmdldF9zZWN0aW9uID0gc3ltX3NlYzsKLQkJICAgIH0KLQkJICBmcmVlIChzdHViX25hbWUpOwotCQl9Ci0JICAgIH0KLQkgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgaW50ZXJuYWwgcmVsb2NzLCBmcmVlIHRoZW0uICAqLwotCSAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQl9Ci0gICAgfQotICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGxvY2FsIHN5bWJvbHMsIGZyZWUgdGhlbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0gICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0gIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLSAgcmV0dXJuIHRydWU7Ci0KLWVycm9yX3JldHVybjoKLSAgLyogUmV0dXJuIGdyYWNlZnVsbHksIGF2b2lkaW5nIGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gdGhlIGhhc2ggdGFibGVzLiAgKi8KLSAgaWYgKHN0dWJfaGFzaF90YWJsZSkKLSAgICB7Ci0gICAgICBlbGYzMl9ocHBhX2hhc2hfdGFibGUobGlua19pbmZvKS0+c3R1Yl9oYXNoX3RhYmxlID0gTlVMTDsKLSAgICAgIGZyZWUgKHN0dWJfaGFzaF90YWJsZSk7Ci0gICAgfQotICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIHN0dWIgc2VjdGlvbiB0byB6ZXJvIHNpbmNlIHdlJ3JlIG5ldmVyIGdvaW5nCi0gICAgIHRvIGNyZWF0ZSB0aGVtLiAgIEF2b2lkcyBsb3Npbmcgd2hlbiB3ZSB0cnkgdG8gZ2V0IGl0cyBjb250ZW50cwotICAgICB0b28uICAqLwotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsIHN0dWJfc2VjLCAwKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBNaXNjIEJGRCBzdXBwb3J0IGNvZGUuICAqLwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQllbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUJZWxmX2hwcGFfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAgICAgICAgICAgICAgIAllbGZfaHBwYV9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCAgICAgICAgICAgCWVsZl9ocHBhX2luZm9fdG9faG93dG9fcmVsCi0KLS8qIFN0dWZmIGZvciB0aGUgQkZEIGxpbmtlci4gICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCWVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCWVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCQllbGZfaHBwYV9mYWtlX3NlY3Rpb25zCi0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2hwcGFfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWhwcGEiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9ocHBhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUEFSSVNDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1ocHBhLmggYi9iZmQvZWxmMzItaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVmYzEzLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBFTEYzMi9IUFBBIHN1cHBvcnQKLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0IGFzIHNwZWNpZmllZAotICAgaW4gdGhlIFN0cmF0dXMgRlRYL0dvbGYgT2JqZWN0IEZpbGUgRm9ybWF0IChTRUQtMTc2MikgZGF0ZWQKLSAgIEZlYnJ1YXJ5IDE5OTQuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnk6Ci0KLSAgIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotICAgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWgKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEYzMl9IUFBBX0gKLSNkZWZpbmUgX0VMRjMyX0hQUEFfSAotCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImxpYmhwcGEuaCIKLSNpbmNsdWRlICJlbGYvaHBwYS5oIgotCi1ib29sZWFuIGVsZjMyX2hwcGFfc2l6ZV9zdHVicwotICBQQVJBTVMgKChiZmQgKiwgYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotYm9vbGVhbiBlbGYzMl9ocHBhX2J1aWxkX3N0dWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBlbGZfaHBwYV9yZWxvY190eXBlICoqIF9iZmRfZWxmMzJfaHBwYV9nZW5fcmVsb2NfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgZWxmX2hwcGFfcmVsb2NfdHlwZSwgaW50LCBpbnQsIGludCwgYXN5bWJvbCAqKSk7Ci0KLS8qIERlZmluZSBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAotICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAotICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KLQotICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgotICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2NhdGlvbgotICAgYXMgYXBwcm9wcmlhdGUuICBUaGlzIGFsbG93cyBHQVMgdG8gc2hhcmUgbXVjaCBtb3JlIGNvZGUKLSAgIGJldHdlZW4gdGhlIHR3byB0YXJnZXQgb2JqZWN0IGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIFJfSFBQQV9OT05FCQkJUl9QQVJJU0NfTk9ORQotI2RlZmluZSBSX0hQUEEJCQkJUl9QQVJJU0NfRElSMzIKLSNkZWZpbmUgUl9IUFBBX0dPVE9GRgkJCVJfUEFSSVNDX0RQUkVMMjFMCi0jZGVmaW5lIFJfSFBQQV9QQ1JFTF9DQUxMCQlSX1BBUklTQ19QQ1JFTDIxTAotI2RlZmluZSBSX0hQUEFfQUJTX0NBTEwJCQlSX1BBUklTQ19ESVIxN0YKLSNkZWZpbmUgUl9IUFBBX0NPTVBMRVgJCQlSX1BBUklTQ19VTklNUExFTUVOVEVECi0KLSNlbmRpZiAvKiBfRUxGMzJfSFBQQV9IICovCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTM4Ni5jIGIvYmZkL2VsZjMyLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1MTRhYy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk1MSArMCwwIEBACi0vKiBJbnRlbCA4MDM4Ni84MDQ4Ni1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgOTQtOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICplbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIHZvaWQgZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgVVNFX1JFTAkxCQkvKiAzODYgdXNlcyBSRUwgcmVsb2NhdGlvbnMgaW5zdGVhZCBvZiBSRUxBICovCi0KLSNpbmNsdWRlICJlbGYvaTM4Ni5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfaG93dG9fdGFibGVbXT0KLXsKLSAgSE9XVE8oUl8zODZfTk9ORSwJIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X05PTkUiLAkgICAgdHJ1ZSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl8zMiwJIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2XzMyIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUEMzMiwJIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDMzIiLAkgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfMzg2X0dPVDMyLAkgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfR09UMzIiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BMVDMyLAkgMCwyLDMyLHRydWUsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QTFQzMiIsICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzM4Nl9DT1BZLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0NPUFkiLAkgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9HTE9CX0RBVCwgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dMT0JfREFUIiwgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9KVU1QX1NMT1QsIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0pVTVBfU0xPVCIsdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9SRUxBVElWRSwgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1JFTEFUSVZFIiwgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9HT1RPRkYsICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVE9GRiIsICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9HT1RQQywgICAgIDAsMiwzMix0cnVlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfR09UUEMiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLSAgRU1QVFlfSE9XVE8gKDEyKSwKLSAgRU1QVFlfSE9XVE8gKDEzKSwKLSAgRU1QVFlfSE9XVE8gKDE0KSwKLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwKLSAgRU1QVFlfSE9XVE8gKDE3KSwKLSAgRU1QVFlfSE9XVE8gKDE4KSwKLSAgRU1QVFlfSE9XVE8gKDE5KSwKLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbi4gICovCi0gIEhPV1RPKFJfMzg2XzE2LAkgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfMTYiLAkgICAgdHJ1ZSwweGZmZmYsMHhmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUEMxNiwJIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDMTYiLAkgICAgdHJ1ZSwweGZmZmYsMHhmZmZmLHRydWUpLAotICBIT1dUTyhSXzM4Nl84LAkgMCwwLDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl84IiwJICAgIHRydWUsMHhmZiwweGZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUEM4LAkgMCwwLDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUEM4IiwJICAgIHRydWUsMHhmZiwweGZmLHRydWUpLAotfTsKLQotLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl8zODZfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl8zODZfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7Ci0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSXzM4Nl9HTlVfVlRFTlRSWSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfMzg2X0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsKLQotI2lmZGVmIERFQlVHX0dFTl9SRUxPQwotI2RlZmluZSBUUkFDRShzdHIpIGZwcmludGYgKHN0ZGVyciwgImkzODYgYmZkIHJlbG9jIGxvb2t1cCAlZCAoJXMpXG4iLCBjb2RlLCBzdHIpCi0jZWxzZQotI2RlZmluZSBUUkFDRShzdHIpCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfTk9ORSIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfTk9ORSBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19DVE9SIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl8zMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19QQzMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9QQzMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dPVDMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfUExUMzI6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfUExUMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1BMVDMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfQ09QWToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9DT1BZIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9DT1BZIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR0xPQl9EQVQ6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR0xPQl9EQVQiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dMT0JfREFUIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfSlVNUF9TTE9UOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfSlVNUF9TTE9UIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfUkVMQVRJVkU6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfUkVMQVRJVkUiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1JFTEFUSVZFIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UT0ZGOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dPVE9GRiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UT0ZGIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UUEMiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dPVFBDIF07Ci0KLSAgICAgIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMTYiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2XzE2XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMTZfUENSRUwiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2X1BDMTZdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzgiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2XzhdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzhfUENSRUwiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2X1BDOF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIik7Ci0gICAgICByZXR1cm4gJmVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfVlRBQkxFX0VOVFJZIik7Ci0gICAgICByZXR1cm4gJmVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgVFJBQ0UgKCJVbmtub3duIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2kzODZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZAkJKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudAkJKmNhY2hlX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICBlbnVtIGVsZl9pMzg2X3JlbG9jX3R5cGUgdHlwZTsKLQotICB0eXBlID0gKGVudW0gZWxmX2kzODZfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIGlmICh0eXBlID09IFJfMzg2X0dOVV9WVElOSEVSSVQpCi0gICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0bzsKLSAgZWxzZSBpZiAodHlwZSA9PSBSXzM4Nl9HTlVfVlRFTlRSWSkKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bzsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBSXzM4Nl9tYXgpOwotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IEZJUlNUX0lOVkFMSURfUkVMT0MgfHwgdHlwZSA+IExBU1RfSU5WQUxJRF9SRUxPQyk7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9ob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIGxhYmVsLiAgVGhlIFVuaXhXYXJlCi0gICAyLjEgY2MgZ2VuZXJhdGVzIHRlbXBvcmFyeSBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCAuWCwgc28gd2UKLSAgIHJlY29nbml6ZSB0aGVtIGhlcmUuICBGSVhNRTogZG8gb3RoZXIgU1ZSNCBjb21waWxlcnMgYWxzbyB1c2UgLlg/LgotICAgSWYgc28sIHdlIHNob3VsZCBtb3ZlIHRoZSAuWCByZWNvZ25pdGlvbiBpbnRvCi0gICBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ1gnKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIGkzODYgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9saWJjLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTYKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGFuIGFic29sdXRlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UKLSAgIHRoaXMuICBTZWUgdGhlIFNWUjQgQUJJIGkzODYgc3VwcGxlbWVudCB0byBzZWUgaG93IHRoaXMgd29ya3MuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGx0MF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweDM1LAkvKiBwdXNobCBjb250ZW50cyBvZiBhZGRyZXNzICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiAuZ290ICsgNC4gICovCi0gIDB4ZmYsIDB4MjUsCS8qIGptcCBpbmRpcmVjdCAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgLmdvdCArIDguICAqLwotICAwLCAwLCAwLCAwCS8qIHBhZCBvdXQgdG8gMTYgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGFuIGFic29sdXRlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZQotICAgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9wbHRfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHgyNSwJLyogam1wIGluZGlyZWN0ICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiB0aGlzIHN5bWJvbCBpbiAuZ290LiAgKi8KLSAgMHg2OCwJCS8qIHB1c2hsIGltbWVkaWF0ZSAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLwotICAweGU5LAkJLyogam1wIHJlbGF0aXZlICovCi0gIDAsIDAsIDAsIDAJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3RhcnQgb2YgLnBsdC4gICovCi19OwotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSBQSUMgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGljX3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHhiMywgNCwgMCwgMCwgMCwJLyogcHVzaGwgNCglZWJ4KSAqLwotICAweGZmLCAweGEzLCA4LCAwLCAwLCAwLAkvKiBqbXAgKjgoJWVieCkgKi8KLSAgMCwgMCwgMCwgMAkJCS8qIHBhZCBvdXQgdG8gMTYgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgUElDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZSB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BpY19wbHRfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHhhMywJLyogam1wICpvZmZzZXQoJWVieCkgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgb2YgdGhpcyBzeW1ib2wgaW4gLmdvdC4gICovCi0gIDB4NjgsCQkvKiBwdXNobCBpbW1lZGlhdGUgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLSAgMHhlOSwJCS8qIGptcCByZWxhdGl2ZSAqLwotICAwLCAwLCAwLCAwCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLwotfTsKLQotLyogVGhlIGkzODYgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQKLSAgIGl0IGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuCi0gICBsaW5raW5nIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkCi0gICBleHRlbmRpbmcgdGhlIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UKLSAgIGhhdmUgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBpMzg2IEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfaTM4Nl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JICAgIHsKLQkgICAgY2FzZSBSXzM4Nl9HT1QzMjoKLQkgICAgY2FzZSBSXzM4Nl9HT1RPRkY6Ci0JICAgIGNhc2UgUl8zODZfR09UUEM6Ci0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl8zODZfR09UMzI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotICAgICAJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfMzg2X1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlIGR5bmFtaWMKLSAgICAgICAgICAgICAgICAgICAgIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9QTFQzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCi0gICAgICAgICAgICAgbmV2ZXIgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5Ci0gICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgLyogSWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgcmVzb2x2ZSBpdCBkaXJlY3RseSB3aXRob3V0Ci0gICAgICAgICAgICAgY3JlYXRpbmcgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2XzMyOgotCWNhc2UgUl8zODZfUEMzMjoKLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfTk9OX0dPVF9SRUY7Ci0KLQkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBpcyBhIHJlbG9jCi0gICAgICAgICAgICAgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIG9yIGEgbm9uIFBDIHJlbGF0aXZlIHJlbG9jCi0gICAgICAgICAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jCi0gICAgICAgICAgICAgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICBIb3dldmVyLCBpZiB3ZSBhcmUgbGlua2luZyB3aXRoCi0gICAgICAgICAgICAgLUJzeW1ib2xpYywgd2UgZG8gbm90IG5lZWQgdG8gY29weSBhIHJlbG9jIGFnYWluc3QgYQotICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlCi0gICAgICAgICAgICAgaW5jbHVkaW5nIGluIHRoZSBsaW5rIChpLmUuLCBERUZfUkVHVUxBUiBpcyBzZXQpLiAgQXQKLSAgICAgICAgICAgICB0aGlzIHBvaW50IHdlIGhhdmUgbm90IHNlZW4gYWxsIHRoZSBpbnB1dCBmaWxlcywgc28gaXQgaXMKLSAgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldAotICAgICAgICAgICAgIGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLSAgICAgICAgICAgICBwb3NzaWJpbGl0eSBiZWxvdyBieSBzdG9yaW5nIGluZm9ybWF0aW9uIGluIHRoZQotICAgICAgICAgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgICAgJiYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfMzg2X1BDMzIKLQkJICB8fCAoaCAhPSBOVUxMCi0JCSAgICAgICYmICghIGluZm8tPnN5bWJvbGljCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JICAgIHsKLQkgICAgICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0gICAgICAgICAgICAgICAgIHJlbG9jIHR5cGVzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA0KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgYW5kIHRoaXMgaXMgYQotICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgd2UgY2FuIGRpc2NhcmQgdGhlbSBhZ2FpbiBpZiB0aGUgc3ltYm9sIGlzIGxhdGVyCi0gICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBlbGZfaTM4NiBsaW5rZXIKLSAgICAgICAgICAgICAgICAgaGFzaCB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8KLSAgICAgICAgICAgICAgICAgYW4gZWxmX2kzODZfbGlua19oYXNoX2VudHJ5LiAgKi8KLQkgICAgICBpZiAoaCAhPSBOVUxMICYmIGluZm8tPnN5bWJvbGljCi0JCSAgJiYgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl8zODZfUEMzMikKLQkJewotCQkgIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKmVoOwotCQkgIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpwOwotCi0JCSAgZWggPSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JCSAgZm9yIChwID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JCSAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgaWYgKHAgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgcCA9ICgoc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKikKLQkJCSAgIGJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKnApKTsKLQkJICAgICAgaWYgKHAgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgcC0+bmV4dCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOwotCQkgICAgICBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IHA7Ci0JCSAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7Ci0JCSAgICAgIHAtPmNvdW50ID0gMDsKLQkJICAgIH0KLQotCQkgICsrcC0+Y291bnQ7Ci0JCX0KLQkgICAgfQotCi0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl8zODZfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfMzg2X0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmX2kzODZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl8zODZfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfMzg2X0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogPz8/IEl0IHdvdWxkIHNlZW0gdGhhdCB0aGUgZXhpc3RpbmcgaTM4NiBjb2RlIGRvZXMgbm8gc29ydAotICAgICBvZiByZWZlcmVuY2UgY291bnRpbmcgb3Igd2hhdG5vdCBvbiBpdHMgR09UIGFuZCBQTFQgZW50cmllcywKLSAgICAgc28gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdhcmJhZ2UgY29sbGVjdCB0aGVtIGF0IHRoaXMgdGltZS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAotICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDApCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFQzMiByZWxvYyBpbiBhbiBpbnB1dAotICAgICAgICAgICAgIGZpbGUsIGJ1dCB0aGUgc3ltYm9sIHdhcyBuZXZlciByZWZlcnJlZCB0byBieSBhIGR5bmFtaWMKLSAgICAgICAgICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAotICAgICAgICAgICAgIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFBDMzIKLSAgICAgICAgICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKLQkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gNDsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wgdGhhdCBkbyBub3QgdXNlIHRoZQotICAgICBHT1QsIHdlIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBjb3B5IHJlbG9jLiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0dPVF9SRUYpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfMzg2X0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KLSAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiAzKQotICAgIHBvd2VyX29mX3R3byA9IDM7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbC5nb3Qgc2VjdGlvbi4KLSAgICAgICAgIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLSAgICAgICAgIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWwuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgc2hhcmVkIGxpbmssIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGFsbAotICAgICBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KLSAgICAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlCi0gICAgIHdpbGwgbm90IGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCAmJiBpbmZvLT5zeW1ib2xpYykKLSAgICBlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9pMzg2X2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSBlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcywKLQkJCQkgKFBUUikgTlVMTCk7Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICBwbHQgPSBmYWxzZTsKLSAgcmVsb2NzID0gZmFsc2U7Ci0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsLmJzcyBhbmQKLQkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCi0gICAgICAgICAgICAgICAgIHRoYW4gLnJlbC5wbHQuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsLnBsdCIpICE9IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpvdXRuYW1lOwotCi0JCSAgcmVsb2NzID0gdHJ1ZTsKLQotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMCi0JCSAgICAgZW50cnkuICBUaGUgZW50cmllcyBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbgotCQkgICAgIHJlYWxseSBhcHBseSB0byB0aGUgLmdvdCBzZWN0aW9uLCB3aGljaCB3ZQotCQkgICAgIGNyZWF0ZWQgb3Vyc2VsdmVzIGFuZCBzbyBrbm93IGlzIG5vdCByZWFkb25seS4gICovCi0JCSAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkJICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JCSAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA0KTsKLQkJICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWx0ZXh0ID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUwpCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY3MpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUwsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxFTlQsCi0JCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSBpZiB3ZSBhcmUKLSAgIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCB3aXRoIC1Cc3ltYm9saWMuICBJdCBkaXNjYXJkcyB0aGUgc3BhY2UKLSAgIGFsbG9jYXRlZCB0byBjb3B5IFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgd2hpY2ggYXJlCi0gICBkZWZpbmVkIGluIHJlZ3VsYXIgb2JqZWN0cy4gIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUKLSAgIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2Ugd29uJ3QgZmlsbCB0aGVtIGluIGluIHRoZQotICAgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMgKGgsIGlnbm9yZSkKLSAgICAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYW4gaTM4NiBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPT0gUl8zODZfR05VX1ZUSU5IRVJJVAotCSAgfHwgcl90eXBlID09IFJfMzg2X0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHJfdHlwZSA8IDAKLQkgIHx8IHJfdHlwZSA+PSAoaW50KSBSXzM4Nl9tYXgKLQkgIHx8IChyX3R5cGUgPj0gKGludCkgRklSU1RfSU5WQUxJRF9SRUxPQwotCSAgICAgICYmIHJfdHlwZSA8PSAoaW50KSBMQVNUX0lOVkFMSURfUkVMT0MpKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgYmZkX3ZtYSB2YWw7Ci0KLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgdmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIHZhbCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAocl90eXBlID09IFJfMzg2X0dPVFBDCi0JCSAgfHwgKHJfdHlwZSA9PSBSXzM4Nl9QTFQzMgotCQkgICAgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAocl90eXBlID09IFJfMzg2X0dPVDMyCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAocl90eXBlID09IFJfMzg2XzMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSXzM4Nl9QQzMyKQotCQkgICAgICAmJiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCQkgIC8qIERXQVJGIHdpbGwgZW1pdCBSXzM4Nl8zMiByZWxvY2F0aW9ucyBpbiBpdHMKLQkJCSAgICAgc2VjdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgZXh0ZXJuYWxseQotCQkJICAgICBpbiBzaGFyZWQgbGlicmFyaWVzLiAgV2UgY2FuJ3QgZG8gYW55dGhpbmcKLQkJCSAgICAgd2l0aCB0aGVtIGhlcmUuICAqLwotCQkJICB8fCAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSXzM4Nl9HT1QzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0JICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkJICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCQkgICAgIGxvY2FsbHksIG9yIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbAotCQkgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZSBtdXN0IGluaXRpYWxpemUKLQkJICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlCi0JCSAgICAgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UgdXNlIHRoZQotCQkgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSAgICAgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLSAgICAgICAgICAgICAgICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgIGFscmVhZHkgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkJICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0KLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X0dPVE9GRjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwgb2Zmc2V0Ci0JICAgICB0YWJsZS4gICovCi0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIE5vdGUgdGhhdCBzZ290LT5vdXRwdXRfb2Zmc2V0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGlzCi0JICAgICBjYWxjdWxhdGlvbi4gIFdlIGFsd2F5cyB3YW50IHRoZSBzdGFydCBvZiAuZ290LiAgSWYgd2UKLQkgICAgIGRlZmluZWQgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcwotCSAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKLQkgICAgIGNhbGN1bGF0aW9uLiAgKi8KLQkgIHJlbG9jYXRpb24gLT0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X0dPVFBDOgotCSAgLyogVXNlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXMgc3ltYm9sIHZhbHVlLiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9QTFQzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLQkgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogUmVzb2x2ZSBhIFBMVDMyIHJlbG9jIGFnYWluIGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAotICAgICAgICAgICAgIHdpdGhvdXQgdXNpbmcgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0gICAgICAgICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLSAgICAgICAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl8zMjoKLQljYXNlIFJfMzg2X1BDMzI6Ci0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgICAgJiYgKHJfdHlwZSAhPSBSXzM4Nl9QQzMyCi0JCSAgfHwgKGggIT0gTlVMTAotCQkgICAgICAmJiBoLT5keW5pbmR4ICE9IC0xCi0JCSAgICAgICYmICghIGluZm8tPnN5bWJvbGljCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXAsIHJlbG9jYXRlOwotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLQkJIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0JCSB0aW1lLiAgKi8KLQotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGlucHV0X2JmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA0KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJewotCQkgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSXzM4Nl9QQzMyKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMICYmIGgtPmR5bmluZHggIT0gLTEpOwotCQkgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfUEMzMik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCQkgIGlmIChoID09IE5VTEwKLQkJICAgICAgfHwgKChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQkJICAgIHsKLQkJICAgICAgcmVsb2NhdGUgPSB0cnVlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICAgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfMzIpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkbwotCQkgbm90IHdhbnQgdG8gZmlkZGxlIHdpdGggdGhlIGFkZGVuZC4gIE90aGVyd2lzZSwgd2UKLQkJIG5lZWQgdG8gaW5jbHVkZSB0aGUgc3ltYm9sIHZhbHVlIHNvIHRoYXQgaXQgYmVjb21lcwotCQkgYW4gYWRkZW5kIGZvciB0aGUgZHluYW1pYyByZWxvYy4gICovCi0JICAgICAgaWYgKCEgcmVsb2NhdGUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sIChiZmRfdm1hKSAwKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFNldAotCSBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgd2hpY2gKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBzeW1ib2wuICBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbAotCSBpbiBhbGwgdGhlIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGFyZSBtYWtpbmcgcGx0IGVudHJpZXMuICBUaGUKLQkgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIHBsdF9pbmRleCA9IGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDE7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIC5nb3QgdGFibGUgb2YgdGhlIGVudHJ5IHRoYXQKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBmdW5jdGlvbi4gIEVhY2ggLmdvdCBlbnRyeSBpcyA0IGJ5dGVzLgotCSBUaGUgZmlyc3QgdGhyZWUgYXJlIHJlc2VydmVkLiAgKi8KLSAgICAgIGdvdF9vZmZzZXQgPSAocGx0X2luZGV4ICsgMykgKiA0OwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfaTM4Nl9wbHRfZW50cnksCi0JCSAgUExUX0VOVFJZX1NJWkUpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBnb3Rfb2Zmc2V0KSwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfaTM4Nl9waWNfcGx0X2VudHJ5LAotCQkgIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGdvdF9vZmZzZXQsCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDIpOwotCX0KLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2luZGV4ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDcpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgLSAoaC0+cGx0Lm9mZnNldCArIFBMVF9FTlRSWV9TSVpFKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAxMik7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaC0+cGx0Lm9mZnNldAotCQkgICArIDYpLAotCQkgIHNnb3QtPmNvbnRlbnRzICsgZ290X29mZnNldCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfSlVNUF9TTE9UKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNldCBpdAotCSB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgTGlrZXdpc2UgaWYKLQkgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuCi0JIFRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCi0JIGluaXRpYWxpemVkIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9HTE9CX0RBVCk7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKLQkJCQkgKyBzcmVsLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAiLnJlbC5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbC5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X0NPUFkpOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHMtPmNvbnRlbnRzCi0JCQkJICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIC8qIE1hcmsgX0RZTkFNSUMgYW5kIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc2R5bjsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsLnBsdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgICAvKiBNeSByZWFkaW5nIG9mIHRoZSBTVlI0IEFCSSBpbmRpY2F0ZXMgdGhhdCB0aGUKLQkJIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHJlbG9jcyAoRFRfSk1QUkVMKSBzaG91bGQgYmUKLQkJIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMKS4gIFRoaXMgaXMKLQkJIHdoYXQgU29sYXJpcyBkb2VzLiAgSG93ZXZlciwgVW5peFdhcmUgY2FuIG5vdCBoYW5kbGUKLQkJIHRoYXQgY2FzZS4gIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTFNaIGVudHJ5Ci0JCSBoZXJlIHRvIG1ha2UgaXQgbm90IGluY2x1ZGUgdGhlIEpNUFJFTCByZWxvY3MuICBTaW5jZQotCQkgdGhlIGxpbmtlciBzY3JpcHQgYXJyYW5nZXMgZm9yIC5yZWwucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUwgZW50cnkuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWwucGx0Iik7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fcmF3X3NpemU7Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBpZiAoc3BsdCAmJiBzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfaTM4Nl9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0LAotCQkJICBzcGx0LT5jb250ZW50cyArIDIpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgOCwKLQkJCSAgc3BsdC0+Y29udGVudHMgKyA4KTsKLQkgICAgfQotCi0JICAvKiBVbml4V2FyZSBzZXRzIHRoZSBlbnRzaXplIG9mIC5wbHQgdG8gNCwgYWx0aG91Z2ggdGhhdCBkb2Vzbid0Ci0JICAgICByZWFsbHkgc2VlbSBsaWtlIHRoZSByaWdodCB2YWx1ZS4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCX0KLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfaTM4Nl92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItaTM4NiIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNXzM4NgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEwMDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZl9pMzg2X2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQllbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0JCQkJCWVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQllbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwllbGZfaTM4Nl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCWVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCWVsZl9pMzg2X2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCWVsZl9pMzg2X2djX3N3ZWVwX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQJMQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkJMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0JMAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCVBMVF9FTlRSWV9TSVpFCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1pODYwLmMgYi9iZmQvZWxmMzItaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJkMmQ5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBJbnRlbCA4NjAgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JIGJmZF9lbGYzMl9pODYwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICJlbGYzMi1pODYwIgotI2RlZmluZSBFTEZfQVJDSAkgYmZkX2FyY2hfaTg2MAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNXzg2MAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgIDEgLyogRklYTUU6IFRoaXMgbnVtYmVyIGlzIHdyb25nLCAgSXQgc2hvdWxkIGJlIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTk2MC5jIGIvYmZkL2VsZjMyLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5ZmMzZC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qIEludGVsIDg2MCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pOTYwLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmMzJfaTk2MF9yZWxvY2F0ZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICplbGYzMl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotI2RlZmluZSBVU0VfUkVMIDEKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZjMyX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZjMyX2k5NjBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZjMyX2k5NjBfaW5mb190b19ob3d0b19yZWwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hvd3RvX3RhYmxlW109Ci17Ci0gIEhPV1RPKFJfOTYwX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQllbGYzMl9pOTYwX3JlbG9jYXRlLCAiUl85NjBfTk9ORSIsIHRydWUsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEhPV1RPIChSXzk2MF8zMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQllbGYzMl9pOTYwX3JlbG9jYXRlLCAiUl85NjBfMzIiLCB0cnVlLAotCTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfOTYwX0lQMjQsIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JZWxmMzJfaTk2MF9yZWxvY2F0ZSwgIlJfOTYwX0lQMjQgIiwgdHJ1ZSwKLQkweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSksCi0gIEVNUFRZX0hPV1RPICg0KSwKLSAgRU1QVFlfSE9XVE8gKDUpLAotICBFTVBUWV9IT1dUTyAoNiksCi0gIEVNUFRZX0hPV1RPICg3KQotfTsKLQotc3RhdGljIGVudW0gZWxmX2k5NjBfcmVsb2NfdHlwZQotZWxmMzJfaTk2MF9iZmRfdG9fcmVsb2NfdHlwZSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpCi17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBSXzk2MF9OT05FOwotICAgIGNhc2UgQkZEX1JFTE9DX0k5NjBfQ0FMTEo6Ci0gICAgICByZXR1cm4gUl85NjBfT1BUQ0FMTDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuIFJfOTYwXzMyOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0X1BDUkVMOgotICAgICAgcmV0dXJuIFJfOTYwX0lQMjQ7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZWxmMzJfaTk2MF9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkCQkqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50CQkqY2FjaGVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZjMyX2k5NjBfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgZW51bSBlbGZfaTk2MF9yZWxvY190eXBlIHR5cGU7Ci0KLSAgdHlwZSA9IChlbnVtIGVsZl9pOTYwX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUICh0eXBlIDwgUl85NjBfbWF4KTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9ob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLX0KLQotLyogRUxGIHJlbG9jcyBhcmUgYWdhaW5zdCBzeW1ib2xzLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUKLSAgIG91dHB1dCwgYW5kIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcKLSAgIGhhcyBnaXZlbiB1cyBhbnkgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvCi0gICBiZSBhZ2FpbnN0IHRoZSBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvCi0gICBjaGFuZ2UgYW55dGhpbmcgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbAotICAgYWxsIGJlIGRvbmUgYXQgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlCi0gICBpbnRvIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjMyX2k5NjBfcmVsb2NhdGUgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBIQUNLOiBJIHRoaW5rIHRoaXMgZmlyc3QgY29uZGl0aW9uIGlzIG5lY2Vzc2FyeSB3aGVuIHByb2R1Y2luZwotICAgICByZWxvY2F0YWJsZSBvdXRwdXQuICBBZnRlciB0aGUgZW5kIG9mIEhBQ0ssIHRoZSBjb2RlIGlzIGlkZW50aWNhbAotICAgICB0byBiZmRfZWxmX2dlbmVyaWNfcmVsb2MoKS4gIEkgd291bGQgX2d1ZXNzXyB0aGUgZmlyc3QgY2hhbmdlCi0gICAgIGJlbG9uZ3MgdGhlcmUgcmF0aGVyIHRoYW4gaGVyZS4gIG1hcnRpbmRvIDE5OTgtMTAtMjMuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5ob3d0by0+cGNfcmVsYXRpdmUKLSAgICAgICYmICFyZWxvY19lbnRyeS0+aG93dG8tPnBjcmVsX29mZnNldCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kIC09IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotICAvKiBUaGlzIGlzIG1vcmUgZHViaW91cy4gKi8KLSAgZWxzZSBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLQkgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kIC09IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBlbmQgb2YgSEFDSyAqLwotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0JICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotCSAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgICAgICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotCXsKLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICByZXR1cm4gYmZkX3JlbG9jX29rOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmMzJfaTk2MF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICByZXR1cm4gZWxmX2hvd3RvX3RhYmxlICsgZWxmMzJfaTk2MF9iZmRfdG9fcmVsb2NfdHlwZSAoY29kZSk7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX2k5NjBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItaTk2MCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2k5NjAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV85NjAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFICAJMSAvKiBGSVhNRTogVGhpcyBudW1iZXIgaXMgd3JvbmcsICBJdCBzaG91bGQgYmUgdGhlIHBhZ2Ugc2l6ZSBpbiBieXRlcy4gICovCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tMzJyLmMgYi9iZmQvZWxmMzItbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNlNTViLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tMzJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDg4ICswLDAgQEAKLS8qIE0zMlItc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tMzJyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfMTBfcGNyZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgbTMycl9lbGZfcmVsb2NhdGVfaGkxNgotICBQQVJBTVMgKChiZmQgKiwgaW50LCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLWJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9sbzE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9zZGExNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG0zMnJfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLWJvb2xlYW4gX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXZvaWQgX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0jaWYgMCAvKiBub3QgeWV0ICovCi1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIG0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0jZGVmaW5lIE5PUF9JTlNOCQkweDcwMDAKLSNkZWZpbmUgTUFLRV9QQVJBTExFTChpbnNuKQkoKGluc24pIHwgMHg4MDAwKQotCi0vKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlLgotICAgVGhpcyBvbmx5IHNhdmVzIHNwYWNlIGluIGxpYnJhcmllcyBhbmQgb2JqZWN0IGZpbGVzLCBidXQgcGVyaGFwcwotICAgcmVsb2NzIHdpbGwgYmUgcHV0IGluIFJPTT8gIEFsbCBpbiBhbGwgdGhvdWdoLCBSRUwgcmVsb2NzIGFyZSBhIHBhaW4KLSAgIHRvIHdvcmsgd2l0aC4gICovCi0jZGVmaW5lIFVTRV9SRUwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbTMycl9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX00zMlJfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NMzJSXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjQgYml0IGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSXzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMi4KLSAgICAgVGhpcyByZWxvYyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIHJlbG9jYXRpb25zIGFyZSByZWxhdGl2ZSB0byBwYyAmIC00LgotICAgICBpLmUuIGJyYW5jaGVzIGluIHRoZSByaWdodCBpbnNuIHNsb3QgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBsZWZ0IGluc24KLSAgICAgc2xvdCBmb3IgcGMuICAqLwotICAvKiA/Pz8gSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGlzIHNob3VsZCBoYXZlIHBhcnRpYWxfaW5wbGFjZSBzZXQgb3Igbm90LgotICAgICBCcmFuY2ggcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBjYW4gc3RvcmUgdGhlIGFkZGVuZCBpbiB0aGUgaW5zbiwKLSAgICAgYW5kIGlmIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gZ2V0cyBjYWxsZWQgdGhlIGFkZGVuZCBtYXkgZ2V0IGFkZGVkCi0gICAgIGFnYWluLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8xMF9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMTBfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9NMzJSXzE4X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjYgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0gIC8qID8/PyBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoaXMgc2hvdWxkIGhhdmUgcGFydGlhbF9pbnBsYWNlIHNldCBvciBub3QuCi0gICAgIEJyYW5jaCByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGNhbiBzdG9yZSB0aGUgYWRkZW5kIGluIHRoZSBpbnNuLAotICAgICBhbmQgaWYgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBnZXRzIGNhbGxlZCB0aGUgYWRkZW5kIG1heSBnZXQgYWRkZWQKLSAgICAgYWdhaW4uICAqLwotICBIT1dUTyAoUl9NMzJSXzI2X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8yNl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgYWRkcmVzcyB3aGVuIGxvd2VyIDE2IGlzIG9yJ2QgaW4uICAqLwotICBIT1dUTyAoUl9NMzJSX0hJMTZfVUxPLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfSEkxNl9VTE8iLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGFkZHJlc3Mgd2hlbiBsb3dlciAxNiBpcyBhZGRlZCBpbi4gICovCi0gIEhPV1RPIChSX00zMlJfSEkxNl9TTE8sCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9ISTE2X1NMTyIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3dlciAxNiBiaXRzIG9mIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTbWFsbCBkYXRhIGFyZWEgMTYgYml0cyBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9NMzJSX1NEQTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX3NkYTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfU0RBMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAvKiBGSVhNRTogY29ycmVjdD8gKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX00zMlJfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotDAotLyogSGFuZGxlIHRoZSBSX00zMlJfMTBfUENSRUwgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIHJldHVybiBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnktPmhvd3RvLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgIGRhdGEsIHJlbG9jX2VudHJ5LT5hZGRyZXNzLAotCQkJCSAgICAgc3ltYm9sLT5zZWN0aW9uLAotCQkJCSAgICAgKHN5bWJvbC0+dmFsdWUKLQkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKLQkJCQkgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotfQotCi0vKiBVdGlsaXR5IHRvIGFjdHVhbGx5IHBlcmZvcm0gYW4gUl9NMzJSXzEwX1BDUkVMIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MgKGFiZmQsIGhvd3RvLCBpbnB1dF9zZWN0aW9uLCBkYXRhLCBvZmZzZXQsCi0JCQkgICAgc3ltYm9sX3NlY3Rpb24sIHN5bWJvbF92YWx1ZSwgYWRkZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBhc2VjdGlvbiAqc3ltYm9sX3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBzeW1ib2xfdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBiZmRfc2lnbmVkX3ZtYSByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHg7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzdGF0dXM7Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzIChvZmZzZXQgaW4gc2VjdGlvbikuICAqLwotICBpZiAob2Zmc2V0ID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gc3ltYm9sX3ZhbHVlICsgYWRkZW5kOwotICAvKiBNYWtlIGl0IHBjIHJlbGF0aXZlLiAgKi8KLSAgcmVsb2NhdGlvbiAtPQkoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgLyogVGhlc2UganVtcHMgbWFzayBvZmYgdGhlIGxvd2VyIHR3byBiaXRzIG9mIHRoZSBjdXJyZW50IGFkZHJlc3MKLSAgICAgYmVmb3JlIGRvaW5nIHBjcmVsIGNhbGN1bGF0aW9ucy4gICovCi0gIHJlbG9jYXRpb24gLT0gKG9mZnNldCAmIC00TCk7Ci0KLSAgaWYgKHJlbG9jYXRpb24gPCAtMHgyMDAgfHwgcmVsb2NhdGlvbiA+IDB4MWZmKQotICAgIHN0YXR1cyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHN0YXR1cyA9IGJmZF9yZWxvY19vazsKLQotICB4ID0gYmZkX2dldF8xNiAoYWJmZCwgZGF0YSArIG9mZnNldCk7Ci0gIHJlbG9jYXRpb24gPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotICByZWxvY2F0aW9uIDw8PSBob3d0by0+Yml0cG9zOwotICB4ID0gKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spOwotICBiZmRfcHV0XzE2IChhYmZkLCB4LCBkYXRhICsgb2Zmc2V0KTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKiBIYW5kbGUgdGhlIFJfTTMyUl9ISTE2X1tTVV1MTyByZWxvY3MuCi0gICBISTE2X1NMTyBpcyBmb3IgdGhlIGFkZDMgYW5kIGxvYWQvc3RvcmUgd2l0aCBkaXNwbGFjZW1lbnQgaW5zdHJ1Y3Rpb25zLgotICAgSEkxNl9VTE8gaXMgZm9yIHRoZSBvcjMgaW5zdHJ1Y3Rpb24uCi0gICBGb3IgUl9NMzJSX0hJMTZfU0xPLCB0aGUgbG93ZXIgMTYgYml0cyBhcmUgc2lnbiBleHRlbmRlZCB3aGVuIGFkZGVkIHRvCi0gICB0aGUgaGlnaCAxNiBieXRlcyBzbyBpZiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgbmVnYXRpdmUgKGJpdCAxNSA9PSAxKSB0aGVuCi0gICB3ZSBtdXN0IGFkZCBvbmUgdG8gdGhlIGhpZ2ggMTYgYnl0ZXMgKHdoaWNoIHdpbGwgZ2V0IHN1YnRyYWN0ZWQgb2ZmIHdoZW4KLSAgIHRoZSBsb3cgMTYgYml0cyBhcmUgYWRkZWQpLgotICAgVGhlc2UgcmVsb2NzIGhhdmUgdG8gYmUgZG9uZSBpbiBjb21iaW5hdGlvbiB3aXRoIGFuIFJfTTMyUl9MTzE2IHJlbG9jCi0gICBiZWNhdXNlIHRoZXJlIGlzIGEgY2FycnkgZnJvbSB0aGUgTE8xNiB0byB0aGUgSEkxNi4gIEhlcmUgd2UganVzdCBzYXZlCi0gICB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZDsgd2UgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uIHdoZW4gd2Ugc2VlIHRoZSBMTzE2LgotICAgVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIHRoZSBlbGYzMi1taXBzLmMuICBXZSBhbHNvIHN1cHBvcnQgYW4gYXJiaXRyYXJ5Ci0gICBudW1iZXIgb2YgSEkxNiByZWxvY3MgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIExPMTYgcmVsb2MuICBUaGUKLSAgIGFzc2VtYmxlciBzb3J0cyB0aGUgcmVsb2NzIHRvIGVuc3VyZSBlYWNoIEhJMTYgaW1tZWRpYXRlbHkgcHJlY2VkZXMgaXRzCi0gICBMTzE2LiAgSG93ZXZlciBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29waWVzLCB0aGUgYXNzZW1ibGVyIG1heSBub3QgZmluZAotICAgdGhlIHJlYWwgTE8xNiBzbyBpdCBwaWNrcyB0aGUgZmlyc3Qgb25lIGl0IGZpbmRzLiAgKi8KLQotc3RydWN0IG0zMnJfaGkxNgotewotICBzdHJ1Y3QgbTMycl9oaTE2ICpuZXh0OwotICBiZmRfYnl0ZSAqYWRkcjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGEgc3RhdGljIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtMzJyX2hpMTYgKm0zMnJfaGkxNl9saXN0OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9oaTE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbTMycl9oaTE2ICpuOwotCi0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4KLSAgICAgSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzIChvZmZzZXQgaW4gc2VjdGlvbikuICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJldCA9IGJmZF9yZWxvY19vazsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgTE8xNiBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLwotICBuID0gKHN0cnVjdCBtMzJyX2hpMTYgKikgYmZkX21hbGxvYyAoc2l6ZW9mICpuKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gIG4tPmFkZHIgPSAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBuLT5hZGRlbmQgPSByZWxvY2F0aW9uOwotICBuLT5uZXh0ID0gbTMycl9oaTE2X2xpc3Q7Ci0gIG0zMnJfaGkxNl9saXN0ID0gbjsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBIYW5kbGUgYW4gTTMyUiBFTEYgSEkxNiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHR5cGUsIHJlbGhpLCByZWxsbywgY29udGVudHMsIGFkZGVuZCkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsaGk7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxsbzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIGFkZGxvOwotCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsaGktPnJfb2Zmc2V0KTsKLQotICBhZGRsbyA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxsby0+cl9vZmZzZXQpOwotICBpZiAodHlwZSA9PSBSX00zMlJfSEkxNl9TTE8pCi0gICAgYWRkbG8gPSAoKGFkZGxvICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7Ci0gIGVsc2UKLSAgICBhZGRsbyAmPSAweGZmZmY7Ci0KLSAgYWRkZW5kICs9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgYWRkbG87Ci0KLSAgLyogUmVhY2NvdW50IGZvciBzaWduIGV4dGVuc2lvbiBvZiBsb3cgcGFydC4gICovCi0gIGlmICh0eXBlID09IFJfTTMyUl9ISTE2X1NMTwotICAgICAgJiYgKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCkKLSAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgKGluc24gJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZiksCi0JICAgICAgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotfQotCi0vKiBEbyBhbiBSX00zMlJfTE8xNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQKLSAgIGlucGxhY2UgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlCi0gICBSX00zMlJfSEkxNl9bU1VdTE8gcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2xvMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChtMzJyX2hpMTZfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtMzJyX2hpMTYgKmw7Ci0KLSAgICAgIGwgPSBtMzJyX2hpMTZfbGlzdDsKLSAgICAgIHdoaWxlIChsICE9IE5VTEwpCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICB1bnNpZ25lZCBsb25nIHZhbGxvOwotCSAgc3RydWN0IG0zMnJfaGkxNiAqbmV4dDsKLQotCSAgLyogRG8gdGhlIEhJMTYgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndCBuZWVkCi0JICAgICB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBMTzE2IGl0c2VsZiwgZXhjZXB0IHdoZXJlIHRvCi0JICAgICBmaW5kIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG5lZWRlZCBieSB0aGUgTE8xNi4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9ICgoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpIF4gMHg4MDAwKSAtIDB4ODAwMDsKLQkgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0JICB2YWwgKz0gbC0+YWRkZW5kOwotCi0JICAvKiBSZWFjY291bnQgZm9yIHNpZ24gZXh0ZW5zaW9uIG9mIGxvdyBwYXJ0LiAgKi8KLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG0zMnJfaGkxNl9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBMTzE2IHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCWlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBIYW5kbGUgdGhlIFJfTTMyUl9TREExNiByZWxvYy4KLSAgIFRoaXMgcmVsb2MgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBhZGRyZXNzIG9mIG9iamVjdHMgaW4gdGhlIHNtYWxsIGRhdGEgYXJlYQotICAgYW5kIHRvIHBlcmZvcm0gbG9hZHMgYW5kIHN0b3JlcyBmcm9tIHRoYXQgYXJlYS4KLSAgIFRoZSBsb3dlciAxNiBiaXRzIGFyZSBzaWduIGV4dGVuZGVkIGFuZCBhZGRlZCB0byB0aGUgcmVnaXN0ZXIgc3BlY2lmaWVkCi0gICBpbiB0aGUgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIGFzc3VtZWQgdG8gcG9pbnQgdG8gX1NEQV9CQVNFXy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX3NkYTE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICAvKiBGSVhNRTogbm90IHN1cmUgd2hhdCB0byBkbyBoZXJlIHlldC4gIEJ1dCB0aGVuIGFnYWluLCB0aGUgbGlua2VyCi0gICAgIG1heSBuZXZlciBjYWxsIHVzLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0MCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIE0zMlIgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IG0zMnJfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG0zMnJfcmVsb2NfbWFwIG0zMnJfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX00zMlJfTk9ORSB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9NMzJSXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX00zMlJfMzIgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl8yNCwgUl9NMzJSXzI0IH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMTBfUENSRUwsIFJfTTMyUl8xMF9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMLCBSX00zMlJfMThfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTCwgUl9NMzJSXzI2X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8sIFJfTTMyUl9ISTE2X1VMTyB9LAotICB7IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPLCBSX00zMlJfSEkxNl9TTE8gfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9MTzE2LCBSX00zMlJfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NMzJSX1NEQTE2LCBSX00zMlJfU0RBMTYgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfTTMyUl9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9NMzJSX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAobTMycl9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgbTMycl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAobTMycl9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmbTMycl9lbGZfaG93dG9fdGFibGVbbTMycl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIE0zMlIgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NMzJSX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmbTMycl9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQwKLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgKi8KLQotYm9vbGVhbgotX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGhkciwgc2VjLCByZXR2YWwpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgaW50ICpyZXR2YWw7Ci17Ci0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnNjb21tb24iKSA9PSAwKQotICAgIHsKLSAgICAgICpyZXR2YWwgPSBTSE5fTTMyUl9TQ09NTU9OOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIE0zMlIgRUxGIHVzZXMgdHdvIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlIG90aGVyCi0gICBpcyBmb3Igc21hbGwgb2JqZWN0cy4gIEFsbCB0aGUgc21hbGwgb2JqZWN0cyBhcmUga2VwdCB0b2dldGhlciwgYW5kIHRoZW4KLSAgIHJlZmVyZW5jZWQgdmlhIG9uZSByZWdpc3Rlciwgd2hpY2ggeWllbGRzIGZhc3RlciBhc3NlbWJsZXIgY29kZS4gIEl0IGlzCi0gICB1cCB0byB0aGUgY29tcGlsZXIgdG8gZW1pdCBhbiBpbnN0cnVjdGlvbiB0byBsb2FkIHRoZSByZWdpc3RlciB3aXRoCi0gICBfU0RBX0JBU0UuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICBUaGlzCi0gICBhcHByb2FjaCBpcyBjb3BpZWQgZnJvbSBlbGYzMi1taXBzLmMuICAqLwotc3RhdGljIGFzZWN0aW9uIG0zMnJfZWxmX3Njb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sIG0zMnJfZWxmX3Njb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKm0zMnJfZWxmX3Njb21fc3ltYm9sX3B0cjsKLQotLyogSGFuZGxlIHRoZSBzcGVjaWFsIE0zMlIgc2VjdGlvbiBudW1iZXJzIHRoYXQgYSBzeW1ib2wgbWF5IHVzZS4gICovCi0KLXZvaWQKLV9iZmRfbTMycl9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgKGFiZmQsIGFzeW0pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0KLSAgc3dpdGNoIChlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgIGlmIChtMzJyX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbDsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbC5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG0zMnJfZWxmX3Njb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHIgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgaGVyZS4KLSAgIFdlIGFsc28ga2VlcCB3YXRjaGluZyBmb3Igd2hldGhlciB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc2RhdGEgc3BlY2lhbAotICAgbGlua2VyIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgKCpuYW1lcClbMF0gPT0gJ18nICYmICgqbmFtZXApWzFdID09ICdTJwotICAgICAgJiYgc3RyY21wICgqbmFtZXAsICJfU0RBX0JBU0VfIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIHNpbXBsZXIgdGhhbiB1c2luZyBfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24KLQkgKG91ciBuZWVkcyBhcmUgc2ltcGxlciB0aGFuIHBwYydzIG5lZWRzKS4gIEFsc28KLQkgX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIGN1cnJlbnRseSBoYXMgYSBidWcgd2hlcmUgaWYgYSAuc2RhdGEKLQkgc2VjdGlvbiBhbHJlYWR5IGV4aXN0cyBhIG5ldyBvbmUgaXMgY3JlYXRlZCB0aGF0IGZvbGxvd3MgaXQgd2hpY2gKLQkgc2NyZXdzIG9mIF9TREFfQkFTRV8gYWRkcmVzcyBjYWxjcyBiZWNhdXNlIG91dHB1dF9vZmZzZXQgIT0gMC4gICovCi0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICpzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKLQotICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBjb2JibGVkIGZyb20gZWxmMzItcHBjLmMgYW5kIGVsZmxpbmsuYy4gICovCi0KLSAgICAgIGlmIChzID09IE5VTEwpCi0JewotCSAgaW50IGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotCSAgcyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnNkYXRhIik7Ci0JICBpZiAocyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpOwotCX0KLQotICAgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCWJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX1NEQV9CQVNFXyIsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICBpZiAoKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAmJiAhKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLAotCQkJCQkJIGFiZmQsCi0JCQkJCQkgIl9TREFfQkFTRV8iLAotCQkJCQkJIEJTRl9HTE9CQUwsCi0JCQkJCQkgcywKLQkJCQkJCSAzMjc2OCwKLQkJCQkJCSAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkJIGZhbHNlLAotCQkJCQkJIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkJCQkJCSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0gICAgfQotCi0gIHN3aXRjaCAoc3ltLT5zdF9zaG5keCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fTTMyUl9TQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIFNEQV9CQVNFIHZhbHVlLCBzbyB0aGF0IHdlIGNhbiBhZGp1c3QgdGhlCi0gICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9TREFfQkFTRV8gaW4gdGhlIG91dHB1dAotICAgQkZELiAgSWYgd2UgY2FuJ3QgZmluZCBpdCwgd2UncmUgc3R1Y2suICBXZSBjYWNoZSBpdCBpbiB0aGUgRUxGCi0gICB0YXJnZXQgZGF0YS4gIFdlIGRvbid0IG5lZWQgdG8gYWRqdXN0IHRoZSBzeW1ib2wgdmFsdWUgZm9yIGFuCi0gICBleHRlcm5hbCBzeW1ib2wgaWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UgKG91dHB1dF9iZmQsIGluZm8sIGVycm9yX21lc3NhZ2UsIHBzYikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci0gICAgIGJmZF92bWEgKnBzYjsKLXsKLSAgaWYgKGVsZl9ncCAob3V0cHV0X2JmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX1NEQV9CQVNFXyIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JZWxmX2dwIChvdXRwdXRfYmZkKSA9IChoLT51LmRlZi52YWx1ZQotCQkJICAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotCSAgKnBzYiA9IGVsZl9ncCAob3V0cHV0X2JmZCkgPSA0OwotCSAgKmVycm9yX21lc3NhZ2UgPQotCSAgICAoY29uc3QgY2hhciAqKSBfKCJTREEgcmVsb2NhdGlvbiB3aGVuIF9TREFfQkFTRV8gbm90IGRlZmluZWQiKTsKLQkgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCX0KLSAgICB9Ci0gICpwc2IgPSBlbGZfZ3AgKG91dHB1dF9iZmQpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogUmVsb2NhdGUgYW4gTTMyUi9EIEVMRiBzZWN0aW9uLgotICAgVGhlcmUgaXMgc29tZSBhdHRlbXB0IHRvIG1ha2UgdGhpcyBmdW5jdGlvbiB1c2FibGUgZm9yIG1hbnkgYXJjaGl0ZWN0dXJlcywKLSAgIGJvdGggVVNFX1JFTCBhbmQgVVNFX1JFTEEgWyd0d291bGQgYmUgbmljZSBpZiBzdWNoIGEgY3JpdHRlciBleGlzdGVkXSwKLSAgIGlmIG9ubHkgdG8gc2VydmUgYXMgYSBsZWFybmluZyB0b29sLgotCi0gICBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIG5ldyBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgLyogQXNzdW1lIHN1Y2Nlc3MuICAqLwotICBib29sZWFuIHJldCA9IHRydWU7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIC8qIFdlIGNhbid0IG1vZGlmeSByX2FkZGVuZCBoZXJlIGFzIGVsZl9saW5rX2lucHV0X2JmZCBoYXMgYW4gYXNzZXJ0IHRvCi0JIGVuc3VyZSBpdCdzIHplcm8gKHdlIHVzZSBSRUwgcmVsb2NzLCBub3QgUkVMQSkuICBUaGVyZWZvcmUgdGhpcwotCSBzaG91bGQgYmUgYXNzaWduaW5nIHplcm8gdG8gYGFkZGVuZCcsIGJ1dCBmb3IgY2xhcml0eSB3ZSB1c2UKLQkgYHJfYWRkZW5kJy4gICovCi0gICAgICBiZmRfdm1hIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBiZmRfdm1hIG9mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICAgICAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX00zMlJfbWF4KQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpIHJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocl90eXBlID09IFJfTTMyUl9HTlVfVlRFTlRSWQotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX00zMlJfR05VX1ZUSU5IRVJJVCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGhvd3RvID0gbTMycl9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIHNlYyA9IE5VTEw7Ci0JICBpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIC8qIEV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogTG9jYWwgc3ltYm9sLiAgKi8KLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHN5bV9uYW1lID0gIjxsb2NhbCBzeW1ib2w+IjsKLQkgIC8qIFNUVF9TRUNUSU9OOiBzeW1ib2wgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbi4gICovCi0JICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX1NFQ1RJT04pCi0JICAgIHsKLQkgICAgICAvKiBTeW1ib2wgaXNuJ3QgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbi4gIE5vdGhpbmcgdG8gZG8uICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIGFkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotI2lmbmRlZiBVU0VfUkVMCi0JICAvKiBUaGlzIGNhbid0IGJlIGRvbmUgZm9yIFVTRV9SRUwgYmVjYXVzZSBpdCBkb2Vzbid0IG1lYW4gYW55dGhpbmcKLQkgICAgIGFuZCBlbGZfbGlua19pbnB1dF9iZmQgYXNzZXJ0cyB0aGlzIHN0YXlzIHplcm8uICAqLwotCSAgcmVsLT5yX2FkZGVuZCA9IGFkZGVuZDsKLSNlbmRpZgotCi0jaWZuZGVmIFVTRV9SRUwKLQkgIC8qIEFkZGVuZHMgYXJlIHN0b3JlZCB3aXRoIHJlbG9jcy4gIFdlJ3JlIGRvbmUuICAqLwotCSAgY29udGludWU7Ci0jZWxzZSAvKiBVU0VfUkVMICovCi0JICAvKiBJZiBwYXJ0aWFsX2lucGxhY2UsIHdlIG5lZWQgdG8gc3RvcmUgYW55IGFkZGl0aW9uYWwgYWRkZW5kCi0JICAgICBiYWNrIGluIHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmICghIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogPz8/IEhlcmUgaXMgYSBuaWNlIHBsYWNlIHRvIGNhbGwgYSBzcGVjaWFsX2Z1bmN0aW9uCi0JICAgICBsaWtlIGhhbmRsZXIuICAqLwotCSAgaWYgKHJfdHlwZSAhPSBSX00zMlJfSEkxNl9TTE8gJiYgcl90eXBlICE9IFJfTTMyUl9ISTE2X1VMTykKLQkgICAgciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCi0JCQkJCWFkZGVuZCwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JICAgICAgLyogV2UgYWxsb3cgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyBiZWZvcmUgdGhlCi0JCSBMTzE2IHJlbG9jLiAgVGhpcyBwZXJtaXRzIGdjYyB0byBlbWl0IHRoZSBISSBhbmQgTE8gcmVsb2NzCi0JCSBpdHNlbGYuICAqLwotCSAgICAgIGZvciAobG9yZWwgPSByZWwgKyAxOwotCQkgICAobG9yZWwgPCByZWxlbmQKLQkJICAgICYmIChFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1NMTwotCQkJfHwgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9VTE8pKTsKLQkJICAgbG9yZWwrKykKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGxvcmVsIDwgcmVsZW5kCi0JCSAgJiYgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfTE8xNikKLQkJewotCQkgIG0zMnJfZWxmX3JlbG9jYXRlX2hpMTYgKGlucHV0X2JmZCwgcl90eXBlLCByZWwsIGxvcmVsLAotCQkJCQkgIGNvbnRlbnRzLCBhZGRlbmQpOwotCQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkgICAgYWRkZW5kLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICAgIH0KLSNlbmRpZiAvKiBVU0VfUkVMICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotCSAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotCSAgc3ltID0gTlVMTDsKLQkgIHNlYyA9IE5VTEw7Ci0KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICAvKiBMb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICAgICAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCSAgICAgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICArIHN5bS0+c3RfdmFsdWUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBFeHRlcm5hbCBzeW1ib2wuICAqLwotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgICAgIHN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQotCSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJewotCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JCSAgZWxzZQotCQkgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgaW5wdXRfc2VjdGlvbiwgb2Zmc2V0KSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MuICAqLwotCSAgaWYgKG9mZnNldCA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgewotCSAgICAgIHIgPSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQkgICAgICBnb3RvIGNoZWNrX3JlbG9jOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoKGludCkgcl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgKGludCkgUl9NMzJSXzEwX1BDUkVMIDoKLQkgICAgICByID0gbTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MgKGlucHV0X2JmZCwgaG93dG8sIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzLCBvZmZzZXQsCi0JCQkJCSAgICAgIHNlYywgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIChpbnQpIFJfTTMyUl9ISTE2X1NMTyA6Ci0JICAgIGNhc2UgKGludCkgUl9NMzJSX0hJMTZfVUxPIDoKLQkgICAgICB7Ci0JCUVsZl9JbnRlcm5hbF9SZWxhICpsb3JlbDsKLQotCQkvKiBXZSBhbGxvdyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIGJlZm9yZSB0aGUKLQkJICAgTE8xNiByZWxvYy4gIFRoaXMgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcwotCQkgICBpdHNlbGYuICAqLwotCQlmb3IgKGxvcmVsID0gcmVsICsgMTsKLQkJICAgICAobG9yZWwgPCByZWxlbmQKLQkJICAgICAgJiYgKEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfU0xPCi0JCQkgIHx8IEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfVUxPKSk7Ci0JCSAgICAgbG9yZWwrKykKLQkJICBjb250aW51ZTsKLQkJaWYgKGxvcmVsIDwgcmVsZW5kCi0JCSAgICAmJiBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9MTzE2KQotCQkgIHsKLQkJICAgIG0zMnJfZWxmX3JlbG9jYXRlX2hpMTYgKGlucHV0X2JmZCwgcl90eXBlLCByZWwsIGxvcmVsLAotCQkJCQkgICAgY29udGVudHMsIHJlbG9jYXRpb24gKyBhZGRlbmQpOwotCQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkJICB9Ci0JCWVsc2UKLQkJICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkJY29udGVudHMsIG9mZnNldCwKLQkJCQkJCXJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgKGludCkgUl9NMzJSX1NEQTE2IDoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotCQluYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLQkJaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChuYW1lLCAiLnNjb21tb24iKSA9PSAwKQotCQkgIHsKLQkJICAgIGJmZF92bWEgc2RhX2Jhc2U7Ci0JCSAgICBiZmQgKm91dF9iZmQgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLQotCQkgICAgciA9IG0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlIChvdXRfYmZkLCBpbmZvLAotCQkJCQkJICZlcnJtc2csCi0JCQkJCQkgJnNkYV9iYXNlKTsKLQkJICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkJICAgICAgewotCQkJcmV0ID0gZmFsc2U7Ci0JCQlnb3RvIGNoZWNrX3JlbG9jOwotCQkgICAgICB9Ci0KLQkJICAgIC8qIEF0IHRoaXMgcG9pbnQgYHJlbG9jYXRpb24nIGNvbnRhaW5zIHRoZSBvYmplY3QncwotCQkgICAgICAgYWRkcmVzcy4gICovCi0JCSAgICByZWxvY2F0aW9uIC09IHNkYV9iYXNlOwotCQkgICAgLyogTm93IGl0IGNvbnRhaW5zIHRoZSBvZmZzZXQgZnJvbSBfU0RBX0JBU0VfLiAgKi8KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYW4gJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgc2VjdGlvbiAoJXMpIiksCi0JCQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJCSAgIHN5bV9uYW1lLAotCQkJCQkgICBtMzJyX2VsZl9ob3d0b190YWJsZVsoaW50KSByX3R5cGVdLm5hbWUsCi0JCQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpKTsKLQkJICAgIC8qYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7ID8/PyB3aHk/ICovCi0JCSAgICByZXQgPSBmYWxzZTsKLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgZGVmYXVsdCA6Ci0JICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLCBvZmZzZXQsCi0JCQkJCSAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgY2hlY2tfcmVsb2M6Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICAvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgZ2VuZXJpYyBlbm91Z2ggdG8gZ28gaW4gYSB1dGlsaXR5LiAgKi8KLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLQkJbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgfQotCi0JICBpZiAoZXJybXNnICE9IE5VTEwpCi0JICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIG9mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICBvZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgZXJybXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBlcnJtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBlcnJtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBlcnJtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBlcnJtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotDAotI2lmIDAgLyogcmVsYXhpbmcgbm90IHN1cHBvcnRlZCB5ZXQgKi8KLQotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciB0aGUgbTMyci4KLSAgIFJlbGF4aW5nIG9uIHRoZSBtMzJyIGlzIHRyaWNreSBiZWNhdXNlIG9mIGluc3RydWN0aW9uIGFsaWdubWVudAotICAgcmVxdWlyZW1lbnRzICg0IGJ5dGUgaW5zdHJ1Y3Rpb25zIG11c3QgYmUgYWxpZ25lZCBvbiA0IGJ5dGUgYm91bmRhcmllcykuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcyBhcmUgaGFuZGxlZDoKLQotICAgc2V0aC9hZGQzL2psIC0+IGJsMjQgb3IgYmw4Ci0gICBzZXRoL2FkZDMgLT4gbGQyNAotCi0gICBJdCB3b3VsZCBiZSBuaWNlIHRvIGhhbmRsZSBibDI0IC0+IGJsOCBidXQgZ2l2ZW46Ci0KLSAgIC0gNCBieXRlIGluc25zIG11c3QgYmUgb24gNCBieXRlIGJvdW5kYXJpZXMKLSAgIC0gYnJhbmNoIGluc3RydWN0aW9ucyBvbmx5IGJyYW5jaCB0byBpbnNucyBvbiA0IGJ5dGUgYm91bmRhcmllcwotCi0gICB0aGlzIGlzbid0IG11Y2ggb2YgYSB3aW4gYmVjYXVzZSB0aGUgaW5zbiBpbiB0aGUgMiAiZGVsZXRlZCIgYnl0ZXMKLSAgIG11c3QgYmVjb21lIGEgbm9wLiAgV2l0aCBzb21lIGNvbXBsZXhpdHkgc29tZSByZWFsIHJlbGF4YXRpb24gY291bGQgYmUKLSAgIGRvbmUgYnV0IHRoZSBmcmVxdWVuY3kganVzdCB3b3VsZG4ndCBtYWtlIGl0IHdvcnRoIGl0OyBpdCdzIGJldHRlciB0bwotICAgdHJ5IHRvIGRvIGFsbCB0aGUgY29kZSBjb21wYWN0aW9uIG9uZSBjYW4gZWxzZXdoZXJlLgotICAgV2hlbiB0aGUgY2hpcCBzdXBwb3J0cyBwYXJhbGxlbCAxNiBiaXQgaW5zbnMsIHRoaW5ncyBtYXkgY2hhbmdlLgotKi8KLQotc3RhdGljIGJvb2xlYW4gCi1tMzJyX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICAvKiBUaGUgUmVsYSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGhlcmUgYmVjYXVzZSB0aGF0J3Mgd2hhdAotICAgICBfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MgdXNlcyBbZm9yIGNvbnZlbmllbmNlIC0gaXQgc2V0cyB0aGUgYWRkZW5kCi0gICAgIGZpZWxkIHRvIDBdLiAgKi8KLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgYSByZWxvY2F0ZWFibGUgbGluaywgaWYKLSAgICAgdGhpcyBzZWN0aW9uIGRvZXMgbm90IGhhdmUgcmVsb2NzLCBvciBpZiB0aGlzIGlzIG5vdCBhCi0gICAgIGNvZGUgc2VjdGlvbi4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotICAgICAgfHwgMCAvKiBGSVhNRTogY2hlY2sgU0hGX00zMlJfQ0FOX1JFTEFYICovKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogV2FsayB0aHJvdWdoIHRoZW0gbG9va2luZyBmb3IgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlbGF4ZWQsIHRoZW4gaWdub3JlCi0JIHRoaXMgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX00zMlJfSEkxNl9TTE8pCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JICBhc2VjdGlvbiAqc3ltX3NlYzsKLQotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICZpc3ltKTsKLQotCSAgc3ltX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkgIHN5bXZhbCA9IChpc3ltLnN0X3ZhbHVlCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBBbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCSAgaW5keCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07Ci0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICBzeW1ib2wuICBKdXN0IGlnbm9yZSBpdC0taXQgd2lsbCBiZSBjYXVnaHQgYnkgdGhlCi0gICAgICAgICAgICAgICAgIHJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLSAgICAgIC8qIFRyeSB0byBjaGFuZ2UgYSBzZXRoL2FkZDMvamwgc3Vicm91dGluZSBjYWxsIHRvIGJsMjQgb3IgYmw4LgotCSBUaGlzIHNlcXVlbmNlIGlzIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgd2hlbiBjb21waWxpbmcgaW4KLQkgMzIgYml0IG1vZGUuICBBbHNvIGxvb2sgZm9yIHNldGgvYWRkMyAtPiBsZDI0LiAgKi8KLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX00zMlJfSEkxNl9TTE8pCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKm5yZWw7Ci0JICBiZmRfdm1hIHBjID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBpcmVsLT5yX29mZnNldCk7Ci0JICBiZmRfc2lnbmVkX3ZtYSBwY3JlbF92YWx1ZSA9IHN5bXZhbCAtIHBjOwotCSAgdW5zaWduZWQgaW50IGNvZGUscmVnOwotCSAgaW50IGFkZGVuZCxub3BfcCxibDhfcCx0b19kZWxldGU7Ci0KLQkgIC8qIFRoZSB0ZXN0cyBhcmUgb3JkZXJlZCBzbyB0aGF0IHdlIGdldCBvdXQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZQotCSAgICAgaWYgdGhpcyBpc24ndCBzb21ldGhpbmcgd2UgY2FuIHJlbGF4LCB0YWtpbmcgaW50byBhY2NvdW50IHRoYXQKLQkgICAgIHdlIGFyZSBsb29raW5nIGZvciB0d28gc2VwYXJhdGUgcG9zc2liaWxpdGllcyAoamwvbGQyNCkuICAqLwotCi0JICAvKiBEbyBub3RoaW5nIGlmIG5vIHJvb20gaW4gdGhlIHNlY3Rpb24gZm9yIHRoaXMgdG8gYmUgd2hhdCB3ZSdyZQotCSAgICAgbG9va2luZyBmb3IuICAqLwotCSAgaWYgKGlyZWwtPnJfb2Zmc2V0ID4gc2VjLT5fY29va2VkX3NpemUgLSA4KQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJlbG9jYXRpb24gYXBwbGllcyB0byB0aGUgbmV4dAotCSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoYXQgaXQncyB0aGUgYWRkMydzIHJlbG9jLiAgKi8KLQkgIG5yZWwgPSBpcmVsICsgMTsKLQkgIGlmIChucmVsID09IGlyZWxlbmQKLQkgICAgICB8fCBpcmVsLT5yX29mZnNldCArIDQgIT0gbnJlbC0+cl9vZmZzZXQKLQkgICAgICB8fCBFTEYzMl9SX1RZUEUgKG5yZWwtPnJfaW5mbykgIT0gKGludCkgUl9NMzJSX0xPMTYpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTZWUgaWYgdGhlIGluc3RydWN0aW9ucyBhcmUgc2V0aC9hZGQzLiAgKi8KLQkgIC8qIEZJWE1FOiBUaGlzIGlzIHdoZXJlIG1hY3JvcyBmcm9tIGNnZW4gY2FuIGNvbWUgaW4uICAqLwotCSAgY29kZSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAwKTsKLQkgIGlmICgoY29kZSAmIDB4ZjBmZikgIT0gMHhkMGMwKQotCSAgICBjb250aW51ZTsgLyogbm90IHNldGggck4sZm9vICovCi0JICByZWcgPSAoY29kZSAmIDB4MGYwMCkgPj4gODsKLQkgIGNvZGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgNCk7Ci0JICBpZiAoY29kZSAhPSAoMHg4MGEwIHwgcmVnIHwgKHJlZyA8PCA4KSkpCi0JICAgIGNvbnRpbnVlOyAvKiBub3QgYWRkMyByTixyTixmb28gKi8KLQotCSAgLyogQXQgdGhpcyBwb2ludCB3ZSd2ZSBjb25maXJtZWQgd2UgaGF2ZSBzZXRoL2FkZDMuICBOb3cgY2hlY2sKLQkgICAgIHdoZXRoZXIgdGhlIG5leHQgaW5zbiBpcyBhIGpsLCBpbiB3aGljaCBjYXNlIHRyeSB0byBjaGFuZ2UgdGhpcwotCSAgICAgdG8gYmwyNCBvciBibDguICAqLwotCi0JICAvKiBFbnN1cmUgdGhlIGJyYW5jaCB0YXJnZXQgaXMgaW4gcmFuZ2UuCi0JICAgICBUaGUgYmwyNCBpbnN0cnVjdGlvbiBoYXMgYSAyNCBiaXQgb3BlcmFuZCB3aGljaCBpcyB0aGUgdGFyZ2V0Ci0JICAgICBhZGRyZXNzIHJpZ2h0IHNoaWZ0ZWQgYnkgMiwgZ2l2aW5nIGEgc2lnbmVkIHJhbmdlIG9mIDI2IGJpdHMuCi0JICAgICBOb3RlIHRoYXQgNCBieXRlcyBhcmUgYWRkZWQgdG8gdGhlIGhpZ2ggdmFsdWUgYmVjYXVzZSB0aGUgdGFyZ2V0Ci0JICAgICB3aWxsIGJlIGF0IGxlYXN0IDQgYnl0ZXMgY2xvc2VyIGlmIHdlIGNhbiByZWxheC4gIEl0J2xsIGFjdHVhbGx5Ci0JICAgICBiZSA0IG9yIDggYnl0ZXMgY2xvc2VyLCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBqdXN0IHlldCBhbmQKLQkgICAgIHRoZSBkaWZmZXJlbmNlIGlzbid0IHNpZ25pZmljYW50IGVub3VnaCB0byB3b3JyeSBhYm91dC4gICovCi0jaWZuZGVmIFVTRV9SRUwgLyogcHV0IGluIGZvciBsZWFybmluZyBwdXJwb3NlcyAqLwotCSAgcGNyZWxfdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0jZWxzZQotCSAgYWRkZW5kID0gYmZkX2dldF9zaWduZWRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAyKTsKLQkgIHBjcmVsX3ZhbHVlICs9IGFkZGVuZDsKLSNlbmRpZgotCi0JICBpZiAocGNyZWxfdmFsdWUgPj0gLSgxIDw8IDI1KSAmJiBwY3JlbF92YWx1ZSA8ICgxIDw8IDI1KSArIDQKLQkgICAgICAvKiBEbyBub3RoaW5nIGlmIG5vIHJvb20gaW4gdGhlIHNlY3Rpb24gZm9yIHRoaXMgdG8gYmUgd2hhdCB3ZSdyZQotCQkgbG9va2luZyBmb3IuICAqLwotCSAgICAgICYmIChpcmVsLT5yX29mZnNldCA8PSBzZWMtPl9jb29rZWRfc2l6ZSAtIDEyKQotCSAgICAgIC8qIEVuc3VyZSB0aGUgbmV4dCBpbnNuIGlzICJqbCByTiIuICAqLwotCSAgICAgICYmICgoY29kZSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA4KSksCi0JCSAgY29kZSAhPSAoMHgxZWMwIHwgcmVnKSkpCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4gcmVsYXggdG8gYmwyNC9ibDguICAqLwotCi0JICAgICAgLyogU2VlIGlmIHRoZXJlJ3MgYSBub3AgZm9sbG93aW5nIHRoZSBqbC4KLQkJIEFsc28gc2VlIGlmIHdlIGNhbiB1c2UgYSBibDggaW5zbi4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAxMCk7Ci0JICAgICAgbm9wX3AgPSAoY29kZSAmIDB4N2ZmZikgPT0gTk9QX0lOU047Ci0JICAgICAgYmw4X3AgPSBwY3JlbF92YWx1ZSA+PSAtMHgyMDAgJiYgcGNyZWxfdmFsdWUgPCAweDIwMDsKLQotCSAgICAgIGlmIChibDhfcCkKLQkJewotCQkgIC8qIENoYW5nZSAic2V0aCByTixmb28iIHRvICJibDggZm9vIHx8IG5vcCIuCi0JCSAgICAgV2UgT1IgaW4gQ09ERSBqdXN0IGluIGNhc2UgaXQncyBub3QgYSBub3AgKHRlY2huaWNhbGx5LAotCQkgICAgIENPREUgY3VycmVudGx5IG11c3QgYmUgYSBub3AsIGJ1dCBmb3IgY2xlYW5uZXNzIHdlCi0JCSAgICAgYWxsb3cgaXQgdG8gYmUgYW55dGhpbmcpLiAgKi8KLSNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCi0JCSAgY29kZSA9IDB4N2UwMDAwMDAgfCBNQUtFX1BBUkFMTEVMIChjb2RlKTsKLSNlbHNlCi0JCSAgY29kZSA9ICgweDdlMDAwMDAwICsgKCgoYWRkZW5kID4+IDIpICYgMHhmZikgPDwgMTYpKSB8IE1BS0VfUEFSQUxMRUwgKGNvZGUpOwotI2VuZGlmCi0JCSAgdG9fZGVsZXRlID0gODsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIENoYW5nZSB0aGUgc2V0aCByTixmb28gdG8gYSBibDI0IGZvby4gICovCi0jaWZuZGVmIFVTRV9SRUwgLyogcHV0IGluIGZvciBsZWFybmluZyBwdXJwb3NlcyAqLwotCQkgIGNvZGUgPSAweGZlMDAwMDAwOwotI2Vsc2UKLQkJICBjb2RlID0gMHhmZTAwMDAwMCArICgoYWRkZW5kID4+IDIpICYgMHhmZmZmZmYpOwotI2VuZGlmCi0JCSAgdG9fZGVsZXRlID0gbm9wX3AgPyA4IDogNDsKLQkJfQotCi0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0KLQkgICAgICAvKiBTZXQgdGhlIG5ldyByZWxvYyB0eXBlLiAgKi8KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCQkgICBibDhfcCA/IFJfTTMyUl8xMF9QQ1JFTCA6IFJfTTMyUl8yNl9QQ1JFTCk7Ci0KLQkgICAgICAvKiBEZWxldGUgdGhlIGFkZDMgcmVsb2MgYnkgbWFraW5nIGl0IGEgbnVsbCByZWxvYy4gICovCi0JICAgICAgbnJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9NMzJSX05PTkUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGRlbmQgPj0gMAotCQkgICAmJiBzeW12YWwgKyBhZGRlbmQgPD0gMHhmZmZmZmYpCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4gcmVsYXggdG8gbGQyNC4gICovCi0KLQkgICAgICBjb2RlID0gMHhlMDAwMDAwMCB8IChyZWcgPDwgMjQpIHwgKGFkZGVuZCAmIDB4ZmZmZmZmKTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQkgICAgICB0b19kZWxldGUgPSA0OwotCSAgICAgIC8qIFRlbGwgdGhlIGZvbGxvd2luZyBjb2RlIGEgbm9wIGZpbGxlciBpc24ndCBuZWVkZWQuICAqLwotCSAgICAgIG5vcF9wID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogQ2FuJ3QgZG8gYW55dGhpbmcgaGVyZS4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgLyogRGVsZXRlIFRPX0RFTEVURSBieXRlcyBvZiBkYXRhLiAgKi8KLQkgIGlmICghbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCSAgICBpcmVsLT5yX29mZnNldCArIDQsIHRvX2RlbGV0ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBOb3cgdGhhdCB0aGUgZm9sbG93aW5nIGJ5dGVzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIHBsYWNlLCBzZWUgaWYKLQkgICAgIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgamwgd2l0aCBhIG5vcC4gIFRoaXMgaGFwcGVucyB3aGVuIHdlIGhhZAotCSAgICAgdG8gdXNlIGEgYmwyNCBpbnNuIGFuZCB0aGUgaW5zbiBmb2xsb3dpbmcgdGhlIGpsIGlzbid0IGEgbm9wLgotCSAgICAgVGVjaG5pY2FsbHksIHRoaXMgc2l0dWF0aW9uIGNhbid0IGhhcHBlbiAoc2luY2UgdGhlIGluc24gY2FuCi0JICAgICBuZXZlciBiZSBleGVjdXRlZCkgYnV0IHRvIGJlIGNsZWFuIHdlIGRvIHRoaXMuICBXaGVuIHRoZSBjaGlwCi0JICAgICBzdXBwb3J0cyBwYXJhbGxlbCAxNiBiaXQgaW5zbnMgdGhpbmdzIG1heSBjaGFuZ2UuCi0JICAgICBXZSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgaW4gdGhlIGNhc2Ugb2YgcmVsYXhpbmcgdG8gbGQyNCwKLQkgICAgIGFuZCB0aGUgYWJvdmUgY29kZSBzZXRzIG5vcF9wIHNvIHRoaXMgaXNuJ3QgZG9uZS4gICovCi0JICBpZiAoISBub3BfcCAmJiB0b19kZWxldGUgPT0gNCkKLQkgICAgYmZkX3B1dF8xNiAoYWJmZCwgTk9QX0lOU04sIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA0KTsKLQotCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICphZ2FpbiA9IHRydWU7Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogbG9vcCB0byB0cnkgdGhlIG5leHQgcmVsb2MgKi8KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpKQotCWlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLW0zMnJfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBtZW1jcHkgKGRhdGEsIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0KLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCWV4dGVybmFsX3N5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGV4dGVybmFsX3N5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpOwotCSAgaWYgKGV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIHN5bXRhYl9oZHItPnNoX2luZm8sIGlucHV0X2JmZCkKLQkJICAhPSAoc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkgICAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7ICsrZXN5bSwgKytpc3ltcCwgKytzZWNwcCkKLQl7Ci0JICBhc2VjdGlvbiAqaXNlYzsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID4gMCAmJiBpc3ltcC0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fTTMyUl9TQ09NTU9OKQotCSAgICBpc2VjID0gJm0zMnJfZWxmX3Njb21fc2VjdGlvbjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdobyBrbm93cz8gICovCi0JICAgICAgaXNlYyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnNlY3BwID0gaXNlYzsKLQl9Ci0KLSAgICAgIGlmICghIG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0JZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLQlmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotCWZyZWUgKGV4dGVybmFsX3N5bXMpOwotICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0JZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKLSAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotI2VuZGlmIC8qICNpZiAwICovCi0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTTMyUl9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9NMzJSX0FSQ0g6ICAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX20zMnIsIGJmZF9tYWNoX20zMnIpOyAgYnJlYWs7Ci0gICAgY2FzZSBFX00zMlJYX0FSQ0g6ICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTMyciwgYmZkX21hY2hfbTMycngpOyBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KLXN0YXRpYyB2b2lkCi1tMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbTMycjogIHZhbCA9IEVfTTMyUl9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX20zMnJ4OiB2YWwgPSBFX00zMlJYX0FSQ0g7IGJyZWFrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfTTMyUl9BUkNIOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGtlZXAgTTMyUiBzcGVjaWZpYyBmaWxlIGZsYWdzLiAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICogICAgYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKLQkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOwotCi0gIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyAgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgdGhlbiBkbyBub3QKLQkgYm90aGVyIHNldHRpbmcgdGhlIGZsYWdzIGZvciB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSwKLQkgaW5zdGVhZCBhbGxvdyBmdXR1cmUgbWVyZ2VzIHRvIGRvIHRoaXMuICBJZiBubyBmdXR1cmUKLQkgbWVyZ2VzIGV2ZXIgc2V0IHRoZXNlIGZsYWdzIHRoZW4gdGhleSB3aWxsIHJldGFpbiB0aGVpcgotCSB1bml0aWFsaXNlZCB2YWx1ZXMsIHdoaWNoIHN1cnByaXNlIHN1cnByaXNlLCBjb3JyZXNwb25kCi0JIHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCi0gICAgICBpZiAoYmZkX2dldF9hcmNoX2luZm8gKGliZmQpLT50aGVfZGVmYXVsdCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIAotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gaW5fZmxhZ3M7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9nZXRfYXJjaCAoaWJmZCkKLQkgICYmIGJmZF9nZXRfYXJjaF9pbmZvIChvYmZkKS0+dGhlX2RlZmF1bHQpCi0JewotCSAgcmV0dXJuIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLCBiZmRfZ2V0X21hY2ggKGliZmQpKTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBDaGVjayBmbGFnIGNvbXBhdGliaWxpdHkuICAqLwotICBpZiAoaW5fZmxhZ3MgPT0gb3V0X2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpICE9IChvdXRfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpKQotICAgIHsKLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpICE9IEVfTTMyUl9BUkNIKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IEluc3RydWN0aW9uIHNldCBtaXNtYXRjaCB3aXRoIHByZXZpb3VzIG1vZHVsZXMiKSwKLQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgUFRSICAgICBwdHI7Ci17Ci0gIEZJTEUgKiBmaWxlID0gKEZJTEUgKikgcHRyOwotICAKLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKQotICAKLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLSAgCi0gIGZwcmludGYgKGZpbGUsIF8oInByaXZhdGUgZmxhZ3MgPSAlbHgiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotICAKLSAgc3dpdGNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX00zMlJfQVJDSCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVfTTMyUl9BUkNIOiAgZnByaW50ZiAoZmlsZSwgXygiOiBtMzJyIGluc3RydWN0aW9ucyIpKTsgIGJyZWFrOwotICAgIGNhc2UgRV9NMzJSWF9BUkNIOiBmcHJpbnRmIChmaWxlLCBfKCI6IG0zMnJ4IGluc3RydWN0aW9ucyIpKTsgYnJlYWs7Ci0gICAgfQotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWFzZWN0aW9uICoKLW0zMnJfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfTTMyUl9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0gCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotIAotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIG0zMnIgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX00zMlJfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0MCi0KLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX20zMnIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfTTMyUgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MSAvKiBFeHBsaWNpdGx5IHJlcXVlc3RlZCBieSBNaXRzdWJpc2hpLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfbTMycl92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItbTMyciIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJCTAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkJbTMycl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCV9iZmRfbTMycl9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQltMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgbTMycl9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBtMzJyX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBtMzJyX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgICAgICAgICAgICAgMQotI2lmIDAgLyogbm90IHlldCAqLwotLyogcmVsYXggc3VwcG9ydCAqLwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JCW0zMnJfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCQltMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkJbTMycl9lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAJbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEJbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCQkJCQkKLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tNjhrLmMgYi9iZmQvZWxmMzItbTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODdlYzdhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjA5ICswLDAgQEAKLS8qIE1vdG9yb2xhIDY4ayBzZXJpZXMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpyZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZl9tNjhrX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmVsZl9tNjhrX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2djX3N3ZWVwX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfbTY4a19zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX202OGtfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IHsKLSAgSE9XVE8oUl82OEtfTk9ORSwgICAgICAgMCwgMCwgMCwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX05PTkUiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMDAwLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfMzIsICAgICAgICAgMCwgMiwzMiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLXzMyIiwgICAgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfMTYsICAgICAgICAgMCwgMSwxNiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLXzE2IiwgICAgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfOCwgICAgICAgICAgMCwgMCwgOCwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLXzgiLCAgICAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfUEMzMiwgICAgICAgMCwgMiwzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BDMzIiLCAgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QQzE2LCAgICAgICAwLCAxLDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUEMxNiIsICAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BDOCwgICAgICAgIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QQzgiLCAgICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfR09UMzIsICAgICAgMCwgMiwzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDMyIiwgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QxNiwgICAgICAwLCAxLDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMTYiLCAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDgsICAgICAgIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1Q4IiwgICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfR09UMzJPLCAgICAgMCwgMiwzMiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDMyTyIsICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfR09UMTZPLCAgICAgMCwgMSwxNiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDE2TyIsICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfR09UOE8sICAgICAgMCwgMCwgOCwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDhPIiwgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfUExUMzIsICAgICAgMCwgMiwzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDMyIiwgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QTFQxNiwgICAgICAwLCAxLDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMTYiLCAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BMVDgsICAgICAgIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQ4IiwgICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUExUMzJPLCAgICAgMCwgMiwzMiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDMyTyIsICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfUExUMTZPLCAgICAgMCwgMSwxNiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDE2TyIsICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfUExUOE8sICAgICAgMCwgMCwgOCwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDhPIiwgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfQ09QWSwgICAgICAgMCwgMCwgMCwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0NPUFkiLCAgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfR0xPQl9EQVQsICAgMCwgMiwzMiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dMT0JfREFUIiwgIGZhbHNlLCAwLCAweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfSk1QX1NMT1QsICAgMCwgMiwzMiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0pNUF9TTE9UIiwgIGZhbHNlLCAwLCAweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl82OEtfUkVMQVRJVkUsICAgMCwgMiwzMiwgZmFsc2UsMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1JFTEFUSVZFIiwgIGZhbHNlLCAwLCAweGZmZmZmZmZmLGZhbHNlKSwKLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfNjhLX0dOVV9WVElOSEVSSVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfNjhLX0dOVV9WVElOSEVSSVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl82OEtfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSXzY4S19HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCi19OwotCi1zdGF0aWMgdm9pZAotcnR5cGVfdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl82OEtfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b190YWJsZVtFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pXTsKLX0KLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBydHlwZV90b19ob3d0bwotCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfdmFsOwotICBpbnQgZWxmX3ZhbDsKLX0gcmVsb2NfbWFwW10gPSB7Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfNjhLX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfNjhLXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSXzY4S18xNiB9LAotICB7IEJGRF9SRUxPQ184LCBSXzY4S184IH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSXzY4S19QQzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSXzY4S19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfNjhLX1BDOCB9LAotICB7IEJGRF9SRUxPQ18zMl9HT1RfUENSRUwsIFJfNjhLX0dPVDMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwgUl82OEtfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfOF9HT1RfUENSRUwsIFJfNjhLX0dPVDggfSwKLSAgeyBCRkRfUkVMT0NfMzJfR09UT0ZGLCBSXzY4S19HT1QzMk8gfSwKLSAgeyBCRkRfUkVMT0NfMTZfR09UT0ZGLCBSXzY4S19HT1QxNk8gfSwKLSAgeyBCRkRfUkVMT0NfOF9HT1RPRkYsIFJfNjhLX0dPVDhPIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCwgUl82OEtfUExUMzIgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUExUX1BDUkVMLCBSXzY4S19QTFQxNiB9LAotICB7IEJGRF9SRUxPQ184X1BMVF9QQ1JFTCwgUl82OEtfUExUOCB9LAotICB7IEJGRF9SRUxPQ18zMl9QTFRPRkYsIFJfNjhLX1BMVDMyTyB9LAotICB7IEJGRF9SRUxPQ18xNl9QTFRPRkYsIFJfNjhLX1BMVDE2TyB9LAotICB7IEJGRF9SRUxPQ184X1BMVE9GRiwgUl82OEtfUExUOE8gfSwKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl82OEtfQ09QWSB9LAotICB7IEJGRF9SRUxPQ182OEtfR0xPQl9EQVQsIFJfNjhLX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DXzY4S19KTVBfU0xPVCwgUl82OEtfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFLCBSXzY4S19SRUxBVElWRSB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSXzY4S18zMiB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl82OEtfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfNjhLX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocmVsb2NfbWFwKSAvIHNpemVvZiAocmVsb2NfbWFwWzBdKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChyZWxvY19tYXBbaV0uYmZkX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmaG93dG9fdGFibGVbcmVsb2NfbWFwW2ldLmVsZl92YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCByZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBFTEZfQVJDSCBiZmRfYXJjaF9tNjhrCi0vKiBlbmQgY29kZSBnZW5lcmF0ZWQgYnkgZWxmLmVsICovCi0KLSNkZWZpbmUgVVNFX1JFTEEKLQotDAotLyogRnVuY3Rpb25zIGZvciB0aGUgbTY4ayBFTEYgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xpYmMuc28uMSIKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAyMAotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rcyBsaWtlIHRoaXMuICBTZWUKLSAgIHRoZSBTVlI0IEFCSSBtNjhrIHN1cHBsZW1lbnQgdG8gc2VlIGhvdyB0aGlzIHdvcmtzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9tNjhrX3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHgyZiwgMHgzYiwgMHgwMSwgMHg3MCwgLyogbW92ZS5sICglcGMsYWRkciksLSglc3ApICovCi0gIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIC5nb3QgKyA0LiAgKi8KLSAgMHg0ZSwgMHhmYiwgMHgwMSwgMHg3MSwgLyogam1wIChbJXBjLGFkZHJdKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgOC4gICovCi0gIDAsIDAsIDAsIDAJCSAgLyogcGFkIG91dCB0byAyMCBieXRlcy4gICovCi19OwotCi0vKiBTdWJzZXF1ZW50IGVudHJpZXMgaW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfbTY4a19wbHRfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHg0ZSwgMHhmYiwgMHgwMSwgMHg3MSwgLyogam1wIChbJXBjLHN5bWJvbEBHT1RQQ10pICovCi0gIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN5bWJvbCdzIC5nb3QgZW50cnkuICAqLwotICAweDJmLCAweDNjLAkJICAvKiBtb3ZlLmwgI29mZnNldCwtKCVzcCkgKi8KLSAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLSAgMHg2MCwgMHhmZiwJCSAgLyogYnJhLmwgLnBsdCAqLwotICAwLCAwLCAwLCAwCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLwotfTsKLQotI2RlZmluZSBDUFUzMl9GTEFHKGFiZmQpICAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9DUFUzMikKLQotI2RlZmluZSBQTFRfQ1BVMzJfRU5UUllfU0laRSAyNAotLyogUHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cmllcyBmb3IgdGhlIGNwdTMyICovCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2NwdTMyX3BsdDBfZW50cnlbUExUX0NQVTMyX0VOVFJZX1NJWkVdID0KLXsKLSAgMHgyMiwgMHg3YiwgMHgwMSwgMHg3MCwgLyogbW92ZWFsICVwY0AoMHhjKSwgJWExICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIC5nb3QgKyA0LiAgKi8KLSAgMHg0ZSwgMHhkMSwgICAgICAgICAgICAgLyogam1wICVhMUAgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgLyogcmVwbGFjZSB3aXRoIG9mZnNldCB0byAuZ290ICs4LiAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiBwYWQgb3V0IHRvIDI0IGJ5dGVzLiAgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgLyogcGFkIG91dCB0byAyNCBieXRlcy4gICovCi0gIDAsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfY3B1MzJfcGx0X2VudHJ5W1BMVF9DUFUzMl9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MjIsIDB4N2IsIDB4MDEsIDB4NzAsICAvKiBtb3ZlYWwgJXBjQCgweGMpLCAlYTEgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN5bWJvbCdzIC5nb3QgZW50cnkuICAqLwotICAweDRlLCAweGQxLCAgICAgICAgICAgICAgLyogam1wICVhMUAgKi8KLSAgMHgyZiwgMHgzYywgICAgICAgICAgICAgIC8qIG1vdmUubCAjb2Zmc2V0LC0oJXNwKSAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLSAgMHg2MCwgMHhmZiwgICAgICAgICAgICAgIC8qIGJyYS5sIC5wbHQgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLwotICAwLCAwCi19OwotCi0vKiBUaGUgbTY4ayBsaW5rZXIgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHJlbG9jcyB0aGF0IGl0Ci0gICBkZWNpZGVzIHRvIGNvcHkgaW4gY2hlY2tfcmVsb2NzIGZvciBlYWNoIHN5bWJvbC4gIFRoaXMgaXMgc28gdGhhdCBpdAotICAgY2FuIGRpc2NhcmQgUEMgcmVsYXRpdmUgcmVsb2NzIGlmIGl0IGRvZXNuJ3QgbmVlZCB0aGVtIHdoZW4gbGlua2luZwotICAgd2l0aCAtQnN5bWJvbGljLiAgV2Ugc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIGEgZmllbGQgZXh0ZW5kaW5nIHRoZQotICAgcmVndWxhciBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyB3ZSBoYXZlCi0gICBjb3BpZWQgZm9yIGEgZ2l2ZW4gc3ltYm9sLiAgKi8KLQotc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQKLXsKLSAgLyogTmV4dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQgKm5leHQ7Ci0gIC8qIEEgc2VjdGlvbiBpbiBkeW5vYmouICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgLyogTnVtYmVyIG9mIHJlbG9jcyBjb3BpZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLX07Ci0KLS8qIG02OGsgRUxGIGxpbmtlciBoYXNoIGVudHJ5LiAgKi8KLQotc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpwY3JlbF9yZWxvY3NfY29waWVkOwotfTsKLQotLyogbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBEZWNsYXJlIHRoaXMgbm93IHRoYXQgdGhlIGFib3ZlIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19kaXNjYXJkX2NvcGllcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBUcmF2ZXJzZSBhbiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmX202OGtfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZl9tNjhrX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikgKHApLT5oYXNoKQotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZl9tNjhrX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogS2VlcCBtNjhrLXNwZWNpZmljIGZsYWdzIGluIHRoZSBFTEYgaGVhZGVyICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbTY4a19zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IG02OGstc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX202OGtfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotIAotICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotIAotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyAgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gaW5fZmxhZ3M7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX202OGtfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLQotICAvKiBQcmludCBub3JtYWwgRUxGIHByaXZhdGUgZGF0YS4gICovCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0KLSAgLyogSWdub3JlIGluaXQgZmxhZyAtIGl0IG1heSBub3QgYmUgc2V0LCBkZXNwaXRlIHRoZSBmbGFncyBmaWVsZCBjb250YWluaW5nIHZhbGlkIGRhdGEuICAqLwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8gKCJwcml2YXRlIGZsYWdzID0gJWx4OiIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQ1BVMzIpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbY3B1MzJdIikpOwotCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbGdvdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfNjhLX0dPVDg6Ci0JY2FzZSBSXzY4S19HT1QxNjoKLQljYXNlIFJfNjhLX0dPVDMyOgotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfNjhLX0dPVDhPOgotCWNhc2UgUl82OEtfR09UMTZPOgotCWNhc2UgUl82OEtfR09UMzJPOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogQ3JlYXRlIHRoZSAuZ290IHNlY3Rpb24uICAqLwotCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoIV9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgKFNFQ19BTExPQwotCQkJCQkJICB8IFNFQ19MT0FECi0JCQkJCQkgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290LnJlZmNvdW50ID09IC0xKQotCQl7Ci0JCSAgaC0+Z290LnJlZmNvdW50ID0gMTsKLQotCQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIEFsbG9jYXRlIHNwYWNlIGluIHRoZSAuZ290IHNlY3Rpb24uICAqLwotCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCQkgIC8qIEFsbG9jYXRlIHJlbG9jYXRpb24gc3BhY2UuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQl9Ci0JICAgICAgZWxzZQotCQloLT5nb3QucmVmY291bnQrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3NpZ25lZF92bWEpOwotCQkgIGxvY2FsX2dvdF9yZWZjb3VudHMgPSAoKGJmZF9zaWduZWRfdm1hICopCi0JCQkJCSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpKTsKLQkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKSA9IGxvY2FsX2dvdF9yZWZjb3VudHM7Ci0JCSAgbWVtc2V0IChsb2NhbF9nb3RfcmVmY291bnRzLCAtMSwgc2l6ZSk7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gLTEpCi0JCXsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9IDE7Ci0KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLQkJCSBvdXRwdXQgYSBSXzY4S19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZSBkeW5hbWljCi0JCQkgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0rKzsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX1BMVDg6Ci0JY2FzZSBSXzY4S19QTFQxNjoKLQljYXNlIFJfNjhLX1BMVDMyOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0JICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aGljaCBpcwotICAgICAgICAgICAgIG5ldmVyIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB3ZQotICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQotICAgICAgICAgICAgIGFmdGVyIGFsbC4gICovCi0KLQkgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHdlIHJlc29sdmUgaXQgZGlyZWN0bHkgd2l0aG91dAotCSAgICAgY3JlYXRpbmcgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JICAgIGgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JICBlbHNlCi0JICAgIGgtPnBsdC5yZWZjb3VudCsrOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX1BMVDhPOgotCWNhc2UgUl82OEtfUExUMTZPOgotCWNhc2UgUl82OEtfUExUMzJPOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgdGhpcyByZWxvY2F0aW9uIGZvciBhCi0JCSBsb2NhbCBzeW1ib2wuICBGSVhNRTogZG9lcyBpdD8gIEhvdyB0byBoYW5kbGUgaXQgaWYKLQkJIGl0IGRvZXMgbWFrZSBzZW5zZT8gICovCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QQzg6Ci0JY2FzZSBSXzY4S19QQzE2OgotCWNhc2UgUl82OEtfUEMzMjoKLQkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5IGFuZCB0aGlzIGlzIG5vdCBhIGxvY2FsCi0JICAgICBzeW1ib2wsIHdlIG5lZWQgdG8gY29weSB0aGUgcmVsb2MgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuCi0JICAgICBIb3dldmVyIHdoZW4gbGlua2luZyB3aXRoIC1Cc3ltYm9saWMgYW5kIHRoaXMgaXMgYSBnbG9iYWwKLQkgICAgIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGluIGFuIG9iamVjdCB3ZSBhcmUgaW5jbHVkaW5nIGluIHRoZQotCSAgICAgbGluayAoaS5lLiwgREVGX1JFR1VMQVIgaXMgc2V0KSwgdGhlbiB3ZSBjYW4gcmVzb2x2ZSB0aGUKLQkgICAgIHJlbG9jIGRpcmVjdGx5LiAgQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQKLQkgICAgIGZpbGVzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dAotCSAgICAgd2lsbCBiZSBzZXQgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAotCSAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKLQkgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgaWYgKCEoaW5mby0+c2hhcmVkCi0JCSYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSYmIGggIT0gTlVMTAotCQkmJiAoIWluZm8tPnN5bWJvbGljCi0JCSAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQl7Ci0JCSAgLyogTWFrZSBzdXJlIGEgcGx0IGVudHJ5IGlzIGNyZWF0ZWQgZm9yIHRoaXMgc3ltYm9sIGlmCi0JCSAgICAgaXQgdHVybnMgb3V0IHRvIGJlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGR5bmFtaWMKLQkJICAgICBvYmplY3QuICAqLwotCQkgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JCSAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCQkgIGVsc2UKLQkJICAgIGgtPnBsdC5yZWZjb3VudCsrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S184OgotCWNhc2UgUl82OEtfMTY6Ci0JY2FzZSBSXzY4S18zMjoKLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBNYWtlIHN1cmUgYSBwbHQgZW50cnkgaXMgY3JlYXRlZCBmb3IgdGhpcyBzeW1ib2wgaWYgaXQKLQkJIHR1cm5zIG91dCB0byBiZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0JICAgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkJaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgICAgICBlbHNlCi0JCWgtPnBsdC5yZWZjb3VudCsrOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBuZWVkIHRvIGNvcHkgdGhlCi0JICAgICByZWxvYyBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0JCSByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCi0JCSBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGlzIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLAotCQkJCQkJICAgICAoU0VDX0FMTE9DCi0JCQkJCQkgICAgICB8IFNFQ19MT0FECi0JCQkJCQkgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgICAgIHwgU0VDX1JFQURPTkxZKSkKLQkJCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgd2UgY291bnQgdGhlIG51bWJlciBvZgotCQkgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwKLQkJIHNvIHRoYXQgd2UgY2FuIGRpc2NhcmQgdGhlbSBhZ2FpbiBpZiB0aGUgc3ltYm9sIGlzIGxhdGVyCi0JCSBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcwotCQkgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIG02OGtlbGYgbGlua2VyIGhhc2ggdGFibGUsCi0JCSB3aGljaCBtZWFucyB0aGF0IGggaXMgcmVhbGx5IGEgcG9pbnRlciB0byBhbgotCQkgZWxmX202OGtfbGlua19oYXNoX2VudHJ5LiAgKi8KLQkgICAgICBpZiAoKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDOAotIAkJICAgfHwgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl82OEtfUEMxNgotIAkJICAgfHwgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl82OEtfUEMzMikKLQkJICAmJiBpbmZvLT5zeW1ib2xpYykKLQkJewotCQkgIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKmVoOwotCQkgIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpwOwotCi0JCSAgZWggPSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JCSAgZm9yIChwID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JCSAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgaWYgKHAgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgcCA9ICgoc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQgKikKLQkJCSAgIGJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKnApKTsKLQkJICAgICAgaWYgKHAgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgcC0+bmV4dCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOwotCQkgICAgICBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IHA7Ci0JCSAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7Ci0JCSAgICAgIHAtPmNvdW50ID0gMDsKLQkJICAgIH0KLQotCQkgICsrcC0+Y291bnQ7Ci0JCX0KLQkgICAgfQotCi0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl82OEtfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfNjhLX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmX202OGtfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl82OEtfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfNjhLX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGlmIChkeW5vYmopCi0gICAgewotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgIH0KLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfNjhLX0dPVDg6Ci0JY2FzZSBSXzY4S19HT1QxNjoKLQljYXNlIFJfNjhLX0dPVDMyOgotCWNhc2UgUl82OEtfR09UOE86Ci0JY2FzZSBSXzY4S19HT1QxNk86Ci0JY2FzZSBSXzY4S19HT1QzMk86Ci0JICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JICBpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0JCXsKLQkJICAtLWgtPmdvdC5yZWZjb3VudDsKLQkJICBpZiAoaC0+Z290LnJlZmNvdW50ID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIC5nb3QgZW50cnkgYW55IG1vcmUuICAqLwotCQkgICAgICBzZ290LT5fcmF3X3NpemUgLT0gNDsKLQkJICAgICAgc3JlbGdvdC0+X3Jhd19zaXplIC09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID4gMCkKLQkJewotCQkgIC0tbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF07Ci0JCSAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIC5nb3QgZW50cnkgYW55IG1vcmUuICAqLwotCQkgICAgICBzZ290LT5fcmF3X3NpemUgLT0gNDsKLQkJICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJCXNyZWxnb3QtPl9yYXdfc2l6ZSAtPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQljYXNlIFJfNjhLX1BMVDhPOgotCWNhc2UgUl82OEtfUExUMTZPOgotCWNhc2UgUl82OEtfUExUMzJPOgotCWNhc2UgUl82OEtfUEM4OgotCWNhc2UgUl82OEtfUEMxNjoKLQljYXNlIFJfNjhLX1BDMzI6Ci0JY2FzZSBSXzY4S184OgotCWNhc2UgUl82OEtfMTY6Ci0JY2FzZSBSXzY4S18zMjoKLQkgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgICBpZiAoaC0+cGx0LnJlZmNvdW50ID4gMCkKLQkJLS1oLT5wbHQucmVmY291bnQ7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIsCi0gICAgIHdoZW4gd2Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgPT0gMAotCSAgLyogV2UgbXVzdCBhbHdheXMgY3JlYXRlIHRoZSBwbHQgZW50cnkgaWYgaXQgd2FzIHJlZmVyZW5jZWQKLQkgICAgIGJ5IGEgUExUeHhPIHJlbG9jYXRpb24uICBJbiB0aGlzIGNhc2Ugd2UgYWxyZWFkeSByZWNvcmRlZAotCSAgICAgaXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAmJiBoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgUExUeHggcmVsb2MgaW4gYW4gaW5wdXQKLQkgICAgIGZpbGUsIGJ1dCB0aGUgc3ltYm9sIHdhcyBuZXZlciByZWZlcnJlZCB0byBieSBhIGR5bmFtaWMKLQkgICAgIG9iamVjdC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkCi0JICAgICBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBQQ3h4Ci0JICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOwotCSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogR0MgbWF5IGhhdmUgcmVuZGVyZWQgdGhpcyBlbnRyeSB1bnVzZWQuICAqLwotICAgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA8PSAwKQotCXsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgLnBsdCBlbnRyeSwgbWFrZSByb29tIGZvciB0aGUgc3BlY2lhbAotCSBmaXJzdCBlbnRyeS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JewotCSAgaWYgKENQVTMyX0ZMQUcgKGR5bm9iaikpCi0JICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfQ1BVMzJfRU5UUllfU0laRTsKLQkgIGVsc2UKLQkgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoIWluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCX0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIGlmIChDUFUzMl9GTEFHIChkeW5vYmopKQotICAgICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0NQVTMyX0VOVFJZX1NJWkU7Ci0gICAgICBlbHNlCi0gICAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5nb3QucGx0IHNlY3Rpb24sIHdoaWNoCi0JIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAuZ290IHNlY3Rpb24gYnkgdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZWluaXRpYWxpemUgdGhlIHBsdCBvZmZzZXQgbm93IHRoYXQgaXQgaXMgbm90IHVzZWQgYXMgYSByZWZlcmVuY2UKLSAgICAgY291bnQgYW55IG1vcmUuICAqLwotICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfNjhLX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KLSAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbGEuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiAzKQotICAgIHBvd2VyX29mX3R3byA9IDM7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoIWluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCBzZWN0aW9uLgotCSBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0JIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWxhLmdvdCwKLQkgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLQkgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgc2hhcmVkIGxpbmssIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGFsbCBQQwotICAgICByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gIFdlCi0gICAgIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZSB3aWxsIG5vdAotICAgICBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQgJiYgaW5mby0+c3ltYm9saWMpCi0gICAgZWxmX202OGtfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfbTY4a19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgZWxmX202OGtfZGlzY2FyZF9jb3BpZXMsCi0JCQkJIChQVFIpIE5VTEwpOwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KLQkgICAgICBwbHQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKLQkJIC5yZWxhLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvYyBzZWN0aW9ucyBvdGhlcgotICAgICAgICAgICAgICAgICB0aGFuIC5yZWxhLnBsdC4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpICE9IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpvdXRuYW1lOwotCi0JCSAgcmVsb2NzID0gdHJ1ZTsKLQotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMCi0JCSAgICAgZW50cnkuICAucmVsYS5wbHQgaXMgYWN0dWFsbHkgYXNzb2NpYXRlZCB3aXRoCi0JCSAgICAgLmdvdC5wbHQsIHdoaWNoIGlzIG5ldmVyIHJlYWRvbmx5LiAgKi8KLQkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCQkgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgIHJlbHRleHQgPSB0cnVlOwotCQl9Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoIWluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocGx0KQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY3MpCi0JewotCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSBpZiB3ZSBhcmUKLSAgIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCB3aXRoIC1Cc3ltYm9saWMuICBJdCBkaXNjYXJkcyB0aGUgc3BhY2UKLSAgIGFsbG9jYXRlZCB0byBjb3B5IFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQKLSAgIGluIHJlZ3VsYXIgb2JqZWN0cy4gIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzCi0gICByb3V0aW5lLCBidXQgd2Ugd29uJ3QgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19kaXNjYXJkX2NvcGllcyAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+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+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbGEucGx0IjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVFJFTFNaOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWxhLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgLyogVGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHJlbG9jcyAoRFRfSk1QUkVMKSBzaG91bGQKLQkJIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTEEpLgotCQkgVGhlcmVmb3JlLCB3ZSBvdmVycmlkZSB0aGUgRFRfUkVMQVNaIGVudHJ5IGhlcmUgdG8KLQkJIG1ha2UgaXQgbm90IGluY2x1ZGUgdGhlIEpNUFJFTCByZWxvY3MuICBTaW5jZSB0aGUKLQkJIGxpbmtlciBzY3JpcHQgYXJyYW5nZXMgZm9yIC5yZWxhLnBsdCB0byBmb2xsb3cgYWxsCi0JCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMQSBlbnRyeS4gICovCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbGEucGx0Iik7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fcmF3X3NpemU7Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotICAgICAgICAgIGlmICghQ1BVMzJfRkxBRyAob3V0cHV0X2JmZCkpCi0gICAgICAgICAgICB7Ci0JICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX202OGtfcGx0MF9lbnRyeSwgUExUX0VOVFJZX1NJWkUpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDQKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMikpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA4Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDEwKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDEyKTsKLSAgICAgICAgICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplIAotICAgICAgICAgICAgICAgPSBQTFRfRU5UUllfU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIC8qIGNwdTMyICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9jcHUzMl9wbHQwX2VudHJ5LCBQTFRfQ1BVMzJfRU5UUllfU0laRSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgNAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAyKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMTApKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgMTApOwotICAgICAgICAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgCi0gICAgICAgICAgICAgICA9IFBMVF9DUFUzMl9FTlRSWV9TSVpFOwotICAgICAgICAgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjMyX202OGtfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1tNjhrIgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV82OEsKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgyMDAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQkJZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsJX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxfbGluawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwllbGZfbTY4a19jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCWVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCWVsZl9tNjhrX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCWVsZl9tNjhrX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLW04OGsuYyBiL2JmZC9lbGYzMi1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZGUyMmEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIE1vdG9yb2xhIDg4ay1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0vKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYW55IHJlbG9jYXRpb25zLCBidXQgc2hvdWxkIGJlIGdvb2QgZW5vdWdoCi0gICBmb3IgR0RCLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX204OGtfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLW04OGsiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tODhrCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fODhLCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAgCTEgLyogRklYTUU6IFRoaXMgbnVtYmVyIGlzIHdyb25nLCAgSXQgc2hvdWxkIGJlIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMuICAqLwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tY29yZS5jIGIvYmZkL2VsZjMyLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOGI3MGEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjQgKzAsMCBAQAotLyogTW90b3JvbGEgTUNvcmUgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGEgcHJlbGltaW5hcnkgUkNFIEVMRiBBQkkuICBUaGUKLSAgIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdGhlIGZpbmFsIFJDRSBFTEYgQUJJLiAgICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tY29yZS5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jZGVmaW5lCVVTRV9SRUxBCS8qIE9ubHkgVVNFX1JFTCBpcyBhY3R1YWxseSBzaWduaWZpY2FudCwgYnV0IHRoaXMgaXMKLQkJCSAgIGhlcmUgYXJlIGEgcmVtaW5kZXIuLi4gKi8KLQotc3RhdGljIHZvaWQgbWNvcmVfZWxmX2hvd3RvX2luaXQKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBtY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgbWNvcmVfZWxmX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIG1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSBSX01DT1JFX21heF07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1jb3JlX2VsZl9ob3d0b19yYXdbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTUNPUkVfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsICAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfTk9ORSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUNPUkVfQUREUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkFERFIzMiIsCQkvKiBuYW1lICovLyogRm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBjb2ZmL3BlIHBvcnQuICAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdHMgKyAyIHplcm8gYml0czsgam1waS9qc3JpL2xydyBpbnN0cnVjdGlvbnMuCi0gICAgIFNob3VsZCBub3QgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4gKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU04Qlk0LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMSU1NOEJZNCIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIGJzci9idC9iZi9iciBpbnN0cnVjdGlvbnM7IDExIGJpdHMgKyAxIHplcm8gYml0IAotICAgICBTcGFuIDJrIGluc3RydWN0aW9ucyA9PSA0ayBieXRlcy4KLSAgICAgT25seSB1c2VmdWwgcGllY2VzIGF0IHRoZSByZWxvY2F0ZWQgYWRkcmVzcyBhcmUgdGhlIG9wY29kZSAoNSBiaXRzKSAqLwotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTElNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTElNTTExQlkyIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXRzICsgMSB6ZXJvIGJpdDsgJ2xvb3B0JyBpbnN0cnVjdGlvbiBvbmx5OyB1bnN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU00QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxJTU00QlkyIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUENSRUxJTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKLSAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCi0gICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAotICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAotICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAotICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcwotICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX01DT1JFX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX01DT1JFX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9NQ09SRV9HTlVfVlRFTlRSWSwgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfTUNPUkVfR05VX1ZURU5UUlkiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEhPV1RPIChSX01DT1JFX1JFTEFUSVZFLCAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUkVMQVRJVkUiLCAgICAvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jaWZuZGVmIE5VTV9FTEVNCi0jZGVmaW5lIE5VTV9FTEVNKGEpIChzaXplb2YgKGEpIC8gc2l6ZW9mIChhKVswXSkKLSNlbmRpZgotDAotLyogSW5pdGlhbGl6ZSB0aGUgbWNvcmVfZWxmX2hvd3RvX3RhYmxlLCBzbyB0aGF0IGxpbmVhciBhY2Nlc3NlcyBjYW4gYmUgZG9uZS4gICovCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2hvd3RvX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gTlVNX0VMRU0gKG1jb3JlX2VsZl9ob3d0b19yYXcpOyBpLS07KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB0eXBlOwotICAgICAgCi0gICAgICB0eXBlID0gbWNvcmVfZWxmX2hvd3RvX3Jhd1tpXS50eXBlOwotICAgICAgCi0gICAgICBCRkRfQVNTRVJUICh0eXBlIDwgTlVNX0VMRU0gKG1jb3JlX2VsZl9ob3d0b190YWJsZSkpOwotICAgICAgCi0gICAgICBtY29yZV9lbGZfaG93dG9fdGFibGUgW3R5cGVdID0gJiBtY29yZV9lbGZfaG93dG9fcmF3IFtpXTsKLSAgICB9Ci19Ci0KLQwKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1jb3JlX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgZW51bSBlbGZfbWNvcmVfcmVsb2NfdHlwZSBtY29yZV9yZWxvYyA9IFJfTUNPUkVfTk9ORTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6CQkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9OT05FOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCQkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9BRERSMzI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQ6CSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSU1NOEJZNDsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTI6ICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxJTU0xMUJZMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMjoJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxJTU00QlkyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJCSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMMzI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjogbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDogICAgICAgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9HTlVfVlRJTkhFUklUOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6ICAgICAgICAgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9HTlVfVlRFTlRSWTsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOiAgICAgICAgICAgICAgICAgICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUkVMQVRJVkU7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOwotICAgIH0KLQotICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKLQotICByZXR1cm4gbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSBtY29yZV9yZWxvY107Ci19OwotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGEgUkNFIEVMRiByZWxvYy4gICovCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKiBkc3Q7Ci17Ci0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9NQ09SRV9tYXgpOwotICAKLSAgY2FjaGVfcHRyLT5ob3d0byA9IG1jb3JlX2VsZl9ob3d0b190YWJsZSBbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0vKiBGdW5jdGlvbiB0byBzZXQgd2hldGhlciBhIG1vZHVsZSBuZWVkcyB0aGUgLW1yZWxvY2F0YWJsZSBiaXQgc2V0LiAqLwotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghIGVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbi5cbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLSAgICAgICAgIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIAotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCS8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUUgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIERvbid0IHByZXRlbmQgd2UgY2FuIGRlYWwgd2l0aCB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqIHN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICogb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgQkZEX0FTU0VSVCAocmVsb2NfZW50cnktPmhvd3RvICE9IChyZWxvY19ob3d0b190eXBlICopMCk7Ci0gIAotICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBSZWxvY2F0aW9uICVzICglZCkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSwKLQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+bmFtZSwKLQkJICAgICAgcmVsb2NfZW50cnktPmhvd3RvLT50eXBlKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotDAotLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsID0gcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYWxsZWQgZm9yICVzIHNlY3Rpb24gJXMsICVsZCByZWxvY2F0aW9ucyVzXG4iLAotCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgYmZkX3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLAotCSAgIChsb25nKSBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCwKLQkgICAoaW5mby0+cmVsb2NhdGVhYmxlKSA/ICIgKHJlbG9jYXRhYmxlKSIgOiAiIik7Ci0jZW5kaWYKLQotICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKLQotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlICAgIHJfdHlwZSA9IChlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgciA9IGJmZF9yZWxvY19vdGhlcjsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjID0gKGFzZWN0aW9uICopIDA7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW0gPSAoRWxmX0ludGVybmFsX1N5bSAqKSAwOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAwOwotICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICBvbGRpbnN0OwotICAgICAgCi0gICAgICAvKiBVbmtub3duIHJlbG9jYXRpb24gaGFuZGxpbmcgKi8KLSAgICAgIGlmICgodW5zaWduZWQpIHJfdHlwZSA+PSAodW5zaWduZWQpIFJfTUNPUkVfbWF4Ci0JICB8fCAhIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludClyX3R5cGVdKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkXG4iKSwKLQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkgICAgICAoaW50KSByX3R5cGUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotICAgICAgCi0gICAgICBob3d0byA9IG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgcl90eXBlXTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIAotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICAKLQkgICAgICBpZiAoKHVuc2lnbmVkKUVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkJICAgaG93dG8tPm5hbWUsIChpbnQpIHJfdHlwZSwgcl9zeW1uZHgsIChsb25nKSBvZmZzZXQsIChsb25nKSBhZGRlbmQpOwotI2VuZGlmCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLQotICAgICAgLyogQ29tcGxhaW4gYWJvdXQga25vd24gcmVsb2NhdGlvbiB0aGF0IGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLwotICAgICAgaWYgKGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uID09IG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYykKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBSZWxvY2F0aW9uICVzICglZCkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSwKLQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkgICAgICBob3d0by0+bmFtZSwKLQkJCSAgICAgIChpbnQpcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9ucyBbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlcyBbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIGlmICggICBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgCSBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHJldCA9IGZhbHNlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyOgotCSAgb2xkaW5zdCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMgKyBvZmZzZXQpOwotI2RlZmluZQlNQ09SRV9JTlNUX0JTUgkweEY4MDAKLQkgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgTUNPUkVfSU5TVF9CU1IsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGJyZWFrOwotCX0KLQotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCi0JICAgICAgIGhvd3RvLT5uYW1lLCByX3R5cGUsIHJfc3ltbmR4LCAobG9uZykgb2Zmc2V0LCAobG9uZykgYWRkZW5kKTsKLSNlbmRpZgotCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0JKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vayAmJiByX3R5cGUgPT0gUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMikKLQl7Ci0JICAvKiBXYXNuJ3Qgb2ssIGJhY2sgaXQgb3V0IGFuZCBnaXZlIHVwLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgb2xkaW5zdCwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgciA9IGJmZF9yZWxvY19vazsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICByZXQgPSBmYWxzZTsKLQkgIAotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICogbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKLQkJICAgIAotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGlmICgqIG5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0KLQkJKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgb2Zmc2V0KTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWNvcmVfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NQ09SRV9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgIGluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiByZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGFzZWN0aW9uICogc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsX2VuZDsKLSAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIAotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIAotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzIFtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotIAotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX01DT1JFX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0JICAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTUNPUkVfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItbWNvcmUtYmlnIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICAgICBiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAiZWxmMzItbWNvcmUtbGl0dGxlIgotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tY29yZQotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX01DT1JFCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCQkvKiA0aywgaWYgd2UgZXZlciBoYXZlICdlbSAqLwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwltY29yZV9lbGZfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJTlVMTAotCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEJbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJbWNvcmVfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCW1jb3JlX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQltY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJCW1jb3JlX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawkJbWNvcmVfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgICAgIG1jb3JlX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJCTEKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLW1pcHMuYyBiL2JmZC9lbGYzMi1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYjljMjMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDg4NjcgKzAsMCBAQAotLyogTUlQUy1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBNb3N0IG9mIHRoZSBpbmZvcm1hdGlvbiBhZGRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwKLSAgIDxpYW5AY3lnbnVzLmNvbT4uCi0gICBOMzIvNjQgQUJJIHN1cHBvcnQgYWRkZWQgYnkgTWFyayBNaXRjaGVsbCwgQ29kZVNvdXJjZXJ5LCBMTEMuCi0gICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBoYW5kbGVzIE1JUFMgRUxGIHRhcmdldHMuICBTR0kgSXJpeCA1IHVzZXMgYSBzbGlnaHRseQotICAgZGlmZmVyZW50IE1JUFMgRUxGIGZyb20gb3RoZXIgdGFyZ2V0cy4gIFRoaXMgbWF0dGVycyB3aGVuIGxpbmtpbmcuCi0gICBUaGlzIGZpbGUgc3VwcG9ydHMgYm90aCwgc3dpdGNoaW5nIGF0IHJ1bnRpbWUuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gICovCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL21pcHMuaCIKLSNkZWZpbmUgRUNPRkZfMzIKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIC5nb3QgaW5mb3JtYXRpb24gd2hlbiBsaW5raW5nLiAgSXQKLSAgIGlzIHN0b3JlZCBpbiB0aGUgdGRhdGEgZmllbGQgb2YgdGhlIGJmZF9lbGZfc2VjdGlvbl9kYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBtaXBzX2dvdF9pbmZvCi17Ci0gIC8qIFRoZSBnbG9iYWwgc3ltYm9sIGluIHRoZSBHT1Qgd2l0aCB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpnbG9iYWxfZ290c3ltOwotICAvKiBUaGUgbnVtYmVyIG9mIGdsb2JhbCAuZ290IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsX2dvdG5vOwotICAvKiBUaGUgbnVtYmVyIG9mIGxvY2FsIC5nb3QgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGludCBsb2NhbF9nb3RubzsKLSAgLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMgd2UgaGF2ZSB1c2VkLiAgKi8KLSAgdW5zaWduZWQgaW50IGFzc2lnbmVkX2dvdG5vOwotfTsKLQotLyogVGhlIE1JUFMgRUxGIGxpbmtlciBuZWVkcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBlYWNoIHN5bWJvbCBpbgotICAgdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIEV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVYVFIgZXN5bTsKLQotICAvKiBOdW1iZXIgb2YgUl9NSVBTXzMyLCBSX01JUFNfUkVMMzIsIG9yIFJfTUlQU182NCByZWxvY3MgYWdhaW5zdAotICAgICB0aGlzIHN5bWJvbC4gICovIAotICB1bnNpZ25lZCBpbnQgcG9zc2libHlfZHluYW1pY19yZWxvY3M7Ci0KLSAgLyogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkeW5hbWljIHJlbG9jYXRpb24gKGluIHRoZSAucmVsLmR5bgotICAgICBzZWN0aW9uKSBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgaW50IG1pbl9keW5fcmVsb2NfaW5kZXg7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBzdHViIHRoYXQgMzIgYml0IGZ1bmN0aW9ucyBzaG91bGQgdXNlIHRvIGNhbGwgdGhpcwotICAgICAxNiBiaXQgZnVuY3Rpb24sIHRoaXMgcG9pbnRzIHRvIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHN0dWIuICAqLwotICBhc2VjdGlvbiAqZm5fc3R1YjsKLQotICAvKiBXaGV0aGVyIHdlIG5lZWQgdGhlIGZuX3N0dWI7IHRoaXMgaXMgc2V0IGlmIHRoaXMgc3ltYm9sIGFwcGVhcnMKLSAgICAgaW4gYW55IHJlbG9jcyBvdGhlciB0aGFuIGEgMTYgYml0IGNhbGwuICAqLwotICBib29sZWFuIG5lZWRfZm5fc3R1YjsKLQotICAvKiBJZiB0aGVyZSBpcyBhIHN0dWIgdGhhdCAxNiBiaXQgZnVuY3Rpb25zIHNob3VsZCB1c2UgdG8gY2FsbCB0aGlzCi0gICAgIDMyIGJpdCBmdW5jdGlvbiwgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgc3R1Yi4gICovCi0gIGFzZWN0aW9uICpjYWxsX3N0dWI7Ci0KLSAgLyogVGhpcyBpcyBsaWtlIHRoZSBjYWxsX3N0dWIgZmllbGQsIGJ1dCBpdCBpcyB1c2VkIGlmIHRoZSBmdW5jdGlvbgotICAgICBiZWluZyBjYWxsZWQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLiAgKi8KLSAgYXNlY3Rpb24gKmNhbGxfZnBfc3R1YjsKLX07Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwczMyXzY0Yml0X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2luZm9fdG9faG93dG9fcmVsYQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX2dwdGFiICosIEVsZjMyX2dwdGFiICopKTsKLXN0YXRpYyB2b2lkIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9ncHRhYiAqLCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9tc3ltX2luIAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfTXN5bSAqLCBFbGYzMl9JbnRlcm5hbF9Nc3ltICopKTsKLXN0YXRpYyB2b2lkIGJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9JbnRlcm5hbF9Nc3ltICosIEVsZjMyX0V4dGVybmFsX01zeW0gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc3ltX2lzX2dsb2JhbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlCi0gIFBBUkFNUyAoKFBUUiwgYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOwotc3RhdGljIElOTElORSBpbnQgZWxmX21pcHNfaXNhIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci1zdGF0aWMgSU5MSU5FIGludCBlbGZfbWlwc19tYWNoIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci1zdGF0aWMgSU5MSU5FIGNoYXIqIGVsZl9taXBzX2FiaV9uYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGdwdGFiX2NvbXBhcmUgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwczE2X2p1bXBfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMxNl9ncHJlbF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19lbGZfZmluYWxfZ3AKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKmVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKm1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZl9pcml4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wgCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfc2lnbl9leHRlbmQgUEFSQU1TICgoYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9vdmVyZmxvd19wIFBBUkFNUyAoKGJmZF92bWEsIGludCkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfaGlnaCBQQVJBTVMgKChiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9oaWdoZXIgUEFSQU1TICgoYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfaGlnaGVzdCBQQVJBTVMgKChiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9sb2NhbF9nb3RfaW5kZXgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleAotICBQQVJBTVMgKChiZmQgKiwgYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9nb3RfcGFnZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKm1pcHNfZWxmX25leHRfbG8xNl9yZWxvY2F0aW9uCi0gIFBBUkFNUyAoKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEsIHJlbG9jX2hvd3RvX3R5cGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICosIGNvbnN0IGNoYXIgKiosCi0JICAgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9vYnRhaW5fY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmQgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHJlbG9jX2hvd3RvX3R5cGUgKiwgCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSwKLQkgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfYXNzaWduX2dwIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZV9mIAotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKiBtaXBzX2VsZl9nb3Rfc2VjdGlvbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHN0cnVjdCBtaXBzX2dvdF9pbmZvICptaXBzX2VsZl9nb3RfaW5mbyAKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9sb2NhbF9yZWxvY2F0aW9uX3AKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IG1pcHNfZ290X2luZm8gKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfZ290MTZfZW50cnkgCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uIAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIGFzZWN0aW9uICosCi0JICAgYmZkX3ZtYSwgYmZkX3ZtYSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZl9hbGxvY2F0ZV9keW5hbWljX3JlbG9jYXRpb25zIAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9zdHViX3NlY3Rpb25fcCAKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLQotLyogVGhlIGxldmVsIG9mIElSSVggY29tcGF0aWJpbGl0eSB3ZSdyZSBzdHJpdmluZyBmb3IuICAqLwotCi10eXBlZGVmIGVudW0gewotICBpY3Rfbm9uZSwKLSAgaWN0X2lyaXg1LAotICBpY3RfaXJpeDYKLX0gaXJpeF9jb21wYXRfdDsKLQotLyogTm9uemVybyBpZiBBQkZEIGlzIHVzaW5nIHRoZSBOMzIgQUJJLiAgKi8KLQotI2RlZmluZSBBQklfTjMyX1AoYWJmZCkgXAotICAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkyKSAhPSAwKQotCi0vKiBOb256ZXJvIGlmIEFCRkQgaXMgdXNpbmcgdGhlIDY0LWJpdCBBQkkuICBGSVhNRTogVGhpcyBpcyBuZXZlcgotICAgdHJ1ZSwgeWV0LiAgKi8KLSNkZWZpbmUgQUJJXzY0X1AoYWJmZCkgXAotICAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzY0KSAhPSAwKQotCi0vKiBXaGF0IHZlcnNpb24gb2YgSXJpeCB3ZSBhcmUgdHJ5aW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aC4gIEZJWE1FOgotICAgQXQgdGhlIG1vbWVudCwgd2UgbmV2ZXIgZ2VuZXJhdGUgIm5vcm1hbCIgTUlQUyBFTEYgQUJJIGV4ZWN1dGFibGVzOwotICAgd2UgYWx3YXlzIHVzZSBzb21lIHZlcnNpb24gb2YgSXJpeC4gICovCi0KLSNkZWZpbmUgSVJJWF9DT01QQVQoYWJmZCkgXAotICAoKEFCSV9OMzJfUCAoYWJmZCkgfHwgQUJJXzY0X1AgKGFiZmQpKSA/IGljdF9pcml4NiA6IGljdF9pcml4NSkKLQotLyogV2hldGhlciB3ZSBhcmUgdHJ5aW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJUklYIGF0IGFsbC4gICovCi0KLSNkZWZpbmUgU0dJX0NPTVBBVChhYmZkKSBcCi0gIChJUklYX0NPTVBBVCAoYWJmZCkgIT0gaWN0X25vbmUpCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBtc3ltIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRShhYmZkKSAiLm1zeW0iCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBzcmRhdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1NSREFUQV9TRUNUSU9OX05BTUUoYWJmZCkgIi5zcmRhdGEiCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBvcHRpb25zIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRShhYmZkKSBcCi0gIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2ID8gIi5NSVBTLm9wdGlvbnMiIDogIi5vcHRpb25zIikKLQotLyogVGhlIG5hbWUgb2YgdGhlIHN0dWIgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FKGFiZmQpIFwKLSAgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYgPyAiLk1JUFMuc3R1YnMiIDogIi5zdHViIikKLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUoYWJmZCkgIi5yZWwuZHluIgotCi0vKiBUaGUgc2l6ZSBvZiBhbiBleHRlcm5hbCBSRUwgcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1JFTF9TSVpFKGFiZmQpIFwKLSAgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3JlbCkKLQotLyogVGhlIHNpemUgb2YgYW4gZXh0ZXJuYWwgZHluYW1pYyB0YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIE1JUFNfRUxGX0RZTl9TSVpFKGFiZmQpIFwKLSAgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2R5bikKLQotLyogVGhlIHNpemUgb2YgYSBHT1QgZW50cnkuICAqLwotI2RlZmluZSBNSVBTX0VMRl9HT1RfU0laRShhYmZkKSBcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPmFyY2hfc2l6ZSAvIDgpCi0KLS8qIFRoZSBzaXplIG9mIGEgc3ltYm9sLXRhYmxlIGVudHJ5LiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfU1lNX1NJWkUoYWJmZCkgXAotICAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2Zfc3ltKQotCi0vKiBUaGUgZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHNlY3Rpb25zLCBhcyBhIHBvd2VyIG9mIHR3by4gICovCi0jZGVmaW5lIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOKGFiZmQpCQkJCVwKLSAgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+ZmlsZV9hbGlnbiA9PSA4ID8gMyA6IDIpCi0KLS8qIEdldCB3b3JkLXNpemVkIGRhdGEuICAqLwotI2RlZmluZSBNSVBTX0VMRl9HRVRfV09SRChhYmZkLCBwdHIpIFwKLSAgKEFCSV82NF9QIChhYmZkKSA/IGJmZF9nZXRfNjQgKGFiZmQsIHB0cikgOiBiZmRfZ2V0XzMyIChhYmZkLCBwdHIpKQotCi0vKiBQdXQgb3V0IHdvcmQtc2l6ZWQgZGF0YS4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1BVVF9XT1JEKGFiZmQsIHZhbCwgcHRyKQlcCi0gIChBQklfNjRfUCAoYWJmZCkgCQkJCVwKLSAgID8gYmZkX3B1dF82NCAoYWJmZCwgdmFsLCBwdHIpIAkJXAotICAgOiBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHB0cikpCi0KLS8qIEFkZCBhIGR5bmFtaWMgc3ltYm9sIHRhYmxlLWVudHJ5LiAgKi8KLSNpZmRlZiBCRkQ2NAotI2RlZmluZSBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWShpbmZvLCB0YWcsIHZhbCkgXAotICAoQUJJXzY0X1AgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqKQkgICBcCi0gICA/IGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgdGFnLCB2YWwpICBcCi0gICA6IGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgdGFnLCB2YWwpKQotI2Vsc2UKLSNkZWZpbmUgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkoaW5mbywgdGFnLCB2YWwpIFwKLSAgKEFCSV82NF9QIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaikJICAgXAotICAgPyAoYWJvcnQgKCksIGZhbHNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgOiBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKSkKLSNlbmRpZgotCi0vKiBUaGUgbnVtYmVyIG9mIGxvY2FsIC5nb3QgZW50cmllcyB3ZSByZXNlcnZlLiAgKi8KLSNkZWZpbmUgTUlQU19SRVNFUlZFRF9HT1ROTyAoMikKLQotLyogSW5zdHJ1Y3Rpb25zIHdoaWNoIGFwcGVhciBpbiBhIHN0dWIuICBGb3Igc29tZSByZWFzb24gdGhlIHN0dWIgaXMKLSAgIHNsaWdodGx5IGRpZmZlcmVudCBvbiBhbiBTR0kgc3lzdGVtLiAgKi8KLSNkZWZpbmUgRUxGX01JUFNfR1BfT0ZGU0VUKGFiZmQpIChTR0lfQ09NUEFUIChhYmZkKSA/IDB4N2ZmMCA6IDB4ODAwMCkKLSNkZWZpbmUgU1RVQl9MVyhhYmZkKQkJCQkJCVwKLSAgKFNHSV9DT01QQVQgKGFiZmQpCQkJCQkJXAotICAgPyAoQUJJXzY0X1AgKGFiZmQpICAJCQkJCQlcCi0gICAgICA/IDB4ZGY5OTgwMTAJCS8qIGxkIHQ5LDB4ODAxMChncCkgKi8JCVwKLSAgICAgIDogMHg4Zjk5ODAxMCkgICAgICAgICAgICAgLyogbHcgdDksMHg4MDEwKGdwKSAqLwkJXAotICAgOiAweDhmOTk4MDAwKQkJLyogbHcgdDksMHg4MDAwKGdwKSAqLwotI2RlZmluZSBTVFVCX01PVkUgMHgwM2UwNzgyNQkvKiBtb3ZlIHQ3LHJhICovCi0jZGVmaW5lIFNUVUJfSkFMUiAweDAzMjBmODA5CS8qIGphbCB0OSAqLwotI2RlZmluZSBTVFVCX0xJMTYgMHgzNDE4MDAwMAkvKiBvcmkgdDgsemVybywwICovCi0jZGVmaW5lIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFICgxNikKLQotI2lmIDAKLS8qIFdlIG5vIGxvbmdlciB0cnkgdG8gaWRlbnRpZnkgcGFydGljdWxhciBzZWN0aW9ucyBmb3IgdGhlIC5keW5zeW0KLSAgIHNlY3Rpb24uICBXaGVuIHdlIGRvLCB3ZSB3aW5kIHVwIGNyYXNoaW5nIGlmIHRoZXJlIGFyZSBvdGhlciByYW5kb20KLSAgIHNlY3Rpb25zIHdpdGggcmVsb2NhdGlvbnMuICAqLwotCi0vKiBOYW1lcyBvZiBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIC5keW5zeW0gc2VjdGlvbiBpbiBhbiBJcml4IDUKLSAgIGV4ZWN1dGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXNbXSA9Ci17Ci0gICIudGV4dCIsCi0gICIuaW5pdCIsCi0gICIuZmluaSIsCi0gICIuZGF0YSIsCi0gICIucm9kYXRhIiwKLSAgIi5zZGF0YSIsCi0gICIuc2JzcyIsCi0gICIuYnNzIiwKLSAgTlVMTAotfTsKLQotI2RlZmluZSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVMgXAotICAoc2l6ZW9mIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXMgLyBzaXplb2YgbWlwc19lbGZfZHluc3ltX3NlY19uYW1lc1swXSkKLQotLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXMgd2hpY2ggZ28gaW4gdGhlCi0gICB0ZXh0IHNlZ21lbnQuICAqLwotCi0jZGVmaW5lIE1JUFNfVEVYVF9EWU5TWU1fU0VDTk8gKDMpCi0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFRoZSBuYW1lcyBvZiB0aGUgcnVudGltZSBwcm9jZWR1cmUgdGFibGUgc3ltYm9scyB1c2VkIG9uIElyaXggNS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1tdID0KLXsKLSAgIl9wcm9jZWR1cmVfdGFibGUiLAotICAiX3Byb2NlZHVyZV9zdHJpbmdfdGFibGUiLAotICAiX3Byb2NlZHVyZV90YWJsZV9zaXplIiwKLSAgTlVMTAotfTsKLQotLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24gb24KLSAgIElyaXggNS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaWQxOwkJLyogQWx3YXlzIG9uZT8gICovCi0gIHVuc2lnbmVkIGxvbmcgbnVtOwkJLyogTnVtYmVyIG9mIGNvbXBhY3QgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpZDI7CQkvKiBBbHdheXMgdHdvPyAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CQkvKiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkMDsJLyogWmVybz8gICovCi0gIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQxOwkvKiBaZXJvPyAgKi8KLX0gRWxmMzJfY29tcGFjdF9yZWw7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGJmZF9ieXRlIGlkMVs0XTsKLSAgYmZkX2J5dGUgbnVtWzRdOwotICBiZmRfYnl0ZSBpZDJbNF07Ci0gIGJmZF9ieXRlIG9mZnNldFs0XTsKLSAgYmZkX2J5dGUgcmVzZXJ2ZWQwWzRdOwotICBiZmRfYnl0ZSByZXNlcnZlZDFbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBpbnQgY3R5cGUgOiAxOwkvKiAxOiBsb25nIDA6IHNob3J0IGZvcm1hdC4gU2VlIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgaW50IHJ0eXBlIDogNDsJLyogUmVsb2NhdGlvbiB0eXBlcy4gU2VlIGJlbG93LiAqLwotICB1bnNpZ25lZCBpbnQgZGlzdDJ0byA6IDg7Ci0gIHVuc2lnbmVkIGludCByZWx2YWRkciA6IDE5OwkvKiAoVkFERFIgLSB2YWRkciBvZiB0aGUgcHJldmlvdXMgZW50cnkpLyA0ICovCi0gIHVuc2lnbmVkIGxvbmcga29uc3Q7CQkvKiBLT05TVCBmaWVsZC4gU2VlIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgbG9uZyB2YWRkcjsJCS8qIFZBRERSIHRvIGJlIHJlbG9jYXRlZC4gICovCi19IEVsZjMyX2NyaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50IGN0eXBlIDogMTsJLyogMTogbG9uZyAwOiBzaG9ydCBmb3JtYXQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGludCBydHlwZSA6IDQ7CS8qIFJlbG9jYXRpb24gdHlwZXMuIFNlZSBiZWxvdy4gKi8KLSAgdW5zaWduZWQgaW50IGRpc3QydG8gOiA4OwotICB1bnNpZ25lZCBpbnQgcmVsdmFkZHIgOiAxOTsJLyogKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KS8gNCAqLwotICB1bnNpZ25lZCBsb25nIGtvbnN0OwkJLyogS09OU1QgZmllbGQuIFNlZSBiZWxvdy4gICovCi19IEVsZjMyX2NyaW5mbzI7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGJmZF9ieXRlIGluZm9bNF07Ci0gIGJmZF9ieXRlIGtvbnN0WzRdOwotICBiZmRfYnl0ZSB2YWRkcls0XTsKLX0gRWxmMzJfRXh0ZXJuYWxfY3JpbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpbmZvWzRdOwotICBiZmRfYnl0ZSBrb25zdFs0XTsKLX0gRWxmMzJfRXh0ZXJuYWxfY3JpbmZvMjsKLQotLyogVGhlc2UgYXJlIHRoZSBjb25zdGFudHMgdXNlZCB0byBzd2FwIHRoZSBiaXRmaWVsZHMgaW4gYSBjcmluZm8uICAqLwotCi0jZGVmaW5lIENSSU5GT19DVFlQRSAoMHgxKQotI2RlZmluZSBDUklORk9fQ1RZUEVfU0ggKDMxKQotI2RlZmluZSBDUklORk9fUlRZUEUgKDB4ZikKLSNkZWZpbmUgQ1JJTkZPX1JUWVBFX1NIICgyNykKLSNkZWZpbmUgQ1JJTkZPX0RJU1QyVE8gKDB4ZmYpCi0jZGVmaW5lIENSSU5GT19ESVNUMlRPX1NIICgxOSkKLSNkZWZpbmUgQ1JJTkZPX1JFTFZBRERSICgweDdmZmZmKQotI2RlZmluZSBDUklORk9fUkVMVkFERFJfU0ggKDApCi0KLS8qIEEgY29tcGFjdCByZWxvY2F0aW9uIGluZm8gaGFzIGxvbmcgKDMgd29yZHMpIG9yIHNob3J0ICgyIHdvcmRzKQotICAgZm9ybWF0cy4gIEEgc2hvcnQgZm9ybWF0IGRvZXNuJ3QgaGF2ZSBWQUREUiBmaWVsZCBhbmQgcmVsdmFkZHIKLSAgIGZpZWxkcyBjb250YWlucyAoKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KSA+PiAyKS4gICovCi0jZGVmaW5lIENSRl9NSVBTX0xPTkcJCQkxCi0jZGVmaW5lIENSRl9NSVBTX1NIT1JUCQkJMAotCi0vKiBUaGVyZSBhcmUgNCB0eXBlcyBvZiBjb21wYWN0IHJlbG9jYXRpb24gYXQgbGVhc3QuIFRoZSB2YWx1ZSBLT05TVAotICAgaGFzIGRpZmZlcmVudCBtZWFuaW5nIGZvciBlYWNoIHR5cGU6Ci0KLSAgICh0eXBlKQkJKGtvbnN0KQotICAgQ1RfTUlQU19SRUwzMglBZGRyZXNzIGluIGRhdGEKLSAgIENUX01JUFNfV09SRAkJQWRkcmVzcyBpbiB3b3JkIChYWFgpCi0gICBDVF9NSVBTX0dQSElfTE8JR1AgLSB2YWRkcgotICAgQ1RfTUlQU19KTVBBRAlBZGRyZXNzIHRvIGp1bXAKLSAgICovCi0KLSNkZWZpbmUgQ1JUX01JUFNfUkVMMzIJCQkweGEKLSNkZWZpbmUgQ1JUX01JUFNfV09SRAkJCTB4YgotI2RlZmluZSBDUlRfTUlQU19HUEhJX0xPCQkweGMKLSNkZWZpbmUgQ1JUX01JUFNfSk1QQUQJCQkweGQKLQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfZm9ybWF0KHgsZm9ybWF0KQkoKHgpLmN0eXBlID0gKGZvcm1hdCkpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl90eXBlKHgsdHlwZSkJCSgoeCkucnR5cGUgPSAodHlwZSkpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl9kaXN0MnRvKHgsdikJCSgoeCkuZGlzdDJ0byA9ICh2KSkKLSNkZWZpbmUgbWlwc19lbGZfc2V0X2NyX3JlbHZhZGRyKHgsZCkJCSgoeCkucmVsdmFkZHIgPSAoZCk8PDIpCi0KLXN0YXRpYyB2b2lkIGJmZF9lbGYzMl9zd2FwX2NvbXBhY3RfcmVsX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfY29tcGFjdF9yZWwgKiwgRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwgKikpOwotc3RhdGljIHZvaWQgYmZkX2VsZjMyX3N3YXBfY3JpbmZvX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfY3JpbmZvICosIEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSk7Ci0KLSNkZWZpbmUgVVNFX1JFTAkxCQkvKiBNSVBTIHVzZXMgUkVMIHJlbG9jYXRpb25zIGluc3RlYWQgb2YgUkVMQSAqLwotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDI2IGJpdCBicmFuY2ggYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18yNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1QxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1BDMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IGNhbGwgdGhyb3VnaCBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAgIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBkZWZpbmVkIG9uIElyaXggNSwgYWx0aG91Z2ggdGhleSBhcmUKLSAgICAgICBub3QgZGVmaW5lZCBieSB0aGUgQUJJLiAgKi8KLSAgICBFTVBUWV9IT1dUTyAoMTMpLAotICAgIEVNUFRZX0hPV1RPICgxNCksCi0gICAgRU1QVFlfSE9XVE8gKDE1KSwKLQotICAvKiBBIDUgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5OyBhIHNwZWNpYWwgZnVuY3Rpb24gaXMKLSAgICAgbmVlZGVkIHRvIHB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzQsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHMzMl82NGJpdF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0RJU1AiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IHRvIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX1BBR0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9QQUdFIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE9mZnNldCBmcm9tIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX09GU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9PRlNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCBzdWJ0cmFjdGlvbi4gIFVzZWQgaW4gdGhlIE4zMiBBQkkuICAqLwotICBIT1dUTyAoUl9NSVBTX1NVQiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NVQiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgdG8gY2F1c2UgdGhlIGxpbmtlciB0byBpbnNlcnQgYW5kIGRlbGV0ZSBpbnN0cnVjdGlvbnM/ICAqLwotICBFTVBUWV9IT1dUTyAoUl9NSVBTX0lOU0VSVF9BKSwKLSAgRU1QVFlfSE9XVE8gKFJfTUlQU19JTlNFUlRfQiksCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfREVMRVRFKSwKLQotICAvKiBHZXQgdGhlIGhpZ2hlciB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFUiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVSIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2VjdGlvbiBkaXNwbGFjZW1lbnQuICAqLwotICBIT1dUTyAoUl9NSVBTX1NDTl9ESVNQLCAgICAgICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NDTl9ESVNQIiwgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKFJfTUlQU19SRUwxNiksCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfQUREX0lNTUVESUFURSksCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfUEpVTVApLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX1JFTEdPVCksCi0KLSAgLyogUHJvdGVjdGVkIGp1bXAgY29udmVyc2lvbi4gIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGhpbnQuICBObyAKLSAgICAgcmVsb2NhdGlvbiBpcyByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3MuICAqLwotICBIT1dUTyAoUl9NSVBTX0pBTFIsCSAgICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0pBTFIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBUaGUgcmVsb2MgdXNlZCBmb3IgQkZEX1JFTE9DX0NUT1Igd2hlbiBkb2luZyBhIDY0IGJpdCBsaW5rLiAgVGhpcwotICAgaXMgYSBoYWNrIHRvIG1ha2UgdGhlIGxpbmtlciB0aGluayB0aGF0IHdlIG5lZWQgNjQgYml0IHZhbHVlcy4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19jdG9yNjRfaG93dG8gPQotICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHMzMl82NGJpdF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogVGhlIHJlbG9jIHVzZWQgZm9yIHRoZSBtaXBzMTYganVtcCBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwczE2X2p1bXBfaG93dG8gPQotICBIT1dUTyAoUl9NSVBTMTZfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBtaXBzMTZfanVtcF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTMTZfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogVGhlIHJlbG9jIHVzZWQgZm9yIHRoZSBtaXBzMTYgZ3ByZWwgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHMxNl9ncHJlbF9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFMxNl9HUFJFTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHMxNl9ncHJlbF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTMTZfR1BSRUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZjAwMWYsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmYwMDFmLAkgICAgICAgIC8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQU19HTlVfVlRJTkhFUklULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQU19HTlVfVlRFTlRSWSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogRG8gYSBSX01JUFNfSEkxNiByZWxvY2F0aW9uLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBpbiBjb21iaW5hdGlvbgotICAgd2l0aCBhIFJfTUlQU19MTzE2IHJlbG9jLCBiZWNhdXNlIHRoZXJlIGlzIGEgY2FycnkgZnJvbSB0aGUgTE8xNiB0bwotICAgdGhlIEhJMTYuICBIZXJlIHdlIGp1c3Qgc2F2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZDsgd2UgZG8gdGhlCi0gICBhY3R1YWwgcmVsb2NhdGlvbiB3aGVuIHdlIHNlZSB0aGUgTE8xNi4gIE1JUFMgRUxGIHJlcXVpcmVzIHRoYXQgdGhlCi0gICBMTzE2IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgSEkxNi4gIEFzIGEgR05VIGV4dGVuc2lvbiwgd2UgcGVybWl0IGFuCi0gICBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBMTzE2Ci0gICByZWxvYy4gIFRoaXMgZXh0ZW5zaW9uIHBlcm1pdHMgZ2NjIHRvIG91dHB1dCB0aGUgSEkgYW5kIExPIHJlbG9jcwotICAgaXRzZWxmLiAgKi8KLQotc3RydWN0IG1pcHNfaGkxNgotewotICBzdHJ1Y3QgbWlwc19oaTE2ICpuZXh0OwotICBiZmRfYnl0ZSAqYWRkcjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGEgc3RhdGljIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX2hpMTYgKm1pcHNfaGkxNl9saXN0OwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyAoYWJmZCwKLQkJICAgICByZWxvY19lbnRyeSwKLQkJICAgICBzeW1ib2wsCi0JCSAgICAgZGF0YSwKLQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbWlwc19oaTE2ICpuOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIHJldCA9IGJmZF9yZWxvY19vazsKLQotICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLCAiX2dwX2Rpc3AiKSA9PSAwKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICAgYmZkX3ZtYSBncDsKLQotICAgICAgaWYgKHJldCA9PSBiZmRfcmVsb2NfdW5kZWZpbmVkKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotCXJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gICAgICBlbHNlCi0JewotCSAgcmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0JICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0JfQotCi0gICAgICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsCi0JCQkgICAgICAgZXJyb3JfbWVzc2FnZSwgJmdwKTsKLSAgICAgIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotCXJldHVybiByZXQ7Ci0KLSAgICAgIHJlbG9jYXRpb24gPSBncCAtIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLQkgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCXJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JcmVsb2NhdGlvbiA9IDA7Ci0gICAgICBlbHNlCi0JcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgTE8xNiBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLwotICBuID0gKHN0cnVjdCBtaXBzX2hpMTYgKikgYmZkX21hbGxvYyAoc2l6ZW9mICpuKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gIG4tPmFkZHIgPSAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBuLT5hZGRlbmQgPSByZWxvY2F0aW9uOwotICBuLT5uZXh0ID0gbWlwc19oaTE2X2xpc3Q7Ci0gIG1pcHNfaGkxNl9saXN0ID0gbjsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBEbyBhIFJfTUlQU19MTzE2IHJlbG9jYXRpb24uICBUaGlzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIDE2IGJpdAotICAgaW5wbGFjZSByZWxvY2F0aW9uOyB0aGlzIGZ1bmN0aW9uIGV4aXN0cyBpbiBvcmRlciB0byBkbyB0aGUKLSAgIFJfTUlQU19ISTE2IHJlbG9jYXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgc3ltYm9sLAotCQkgICAgIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLAotCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBhcmVsZW50IGdwX2Rpc3BfcmVsZW50OwotCi0gIGlmIChtaXBzX2hpMTZfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX2hpMTYgKmw7Ci0KLSAgICAgIGwgPSBtaXBzX2hpMTZfbGlzdDsKLSAgICAgIHdoaWxlIChsICE9IE5VTEwpCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICB1bnNpZ25lZCBsb25nIHZhbGxvOwotCSAgc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKLQotCSAgLyogRG8gdGhlIEhJMTYgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndCBuZWVkCi0JICAgICB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBMTzE2IGl0c2VsZiwgZXhjZXB0IHdoZXJlIHRvCi0JICAgICBmaW5kIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG5lZWRlZCBieSB0aGUgTE8xNi4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotCQkgICAmIDB4ZmZmZik7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCi0JICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCi0JICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKLQkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCi0JICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KLQkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0JICAgIHZhbCAtPSAweDEwMDAwOwotCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0JICAgIHZhbCArPSAweDEwMDAwOwotCi0JICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKLQkgICAgewotCSAgICAgIGdwX2Rpc3BfcmVsZW50ID0gKnJlbG9jX2VudHJ5OwotCSAgICAgIHJlbG9jX2VudHJ5ID0gJmdwX2Rpc3BfcmVsZW50OwotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSBsLT5hZGRlbmQ7Ci0JICAgIH0KLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbWlwc19oaTE2X2xpc3QgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLCAiX2dwX2Rpc3AiKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gICAgICBiZmRfdm1hIGdwLCByZWxvY2F0aW9uOwotCi0gICAgICAvKiBGSVhNRTogRG9lcyB0aGlzIGNhc2UgZXZlciBvY2N1cj8gICovCi0KLSAgICAgIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHRydWUsIGVycm9yX21lc3NhZ2UsICZncCk7Ci0gICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLQlyZXR1cm4gcmV0OwotCi0gICAgICByZWxvY2F0aW9uID0gZ3AgLSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgICAgIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgICAgIGdwX2Rpc3BfcmVsZW50ID0gKnJlbG9jX2VudHJ5OwotICAgICAgcmVsb2NfZW50cnkgPSAmZ3BfZGlzcF9yZWxlbnQ7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbiAtIDQ7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgTE8xNiByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogRG8gYSBSX01JUFNfR09UMTYgcmVsb2MuICBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGUgZ2xvYmFsIG9mZnNldAotICAgdGFibGUgdXNlZCBmb3IgUElDIGNvZGUuICBJZiB0aGUgc3ltYm9sIGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgdGhlCi0gICBpbnN0cnVjdGlvbiBpcyBtb2RpZmllZCB0byBjb250YWluIHRoZSBvZmZzZXQgb2YgdGhlIGFwcHJvcHJpYXRlCi0gICBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIElmIHRoZSBzeW1ib2wgaXMgYSBzZWN0aW9uCi0gICBzeW1ib2wsIHRoZSBuZXh0IHJlbG9jIGlzIGEgUl9NSVBTX0xPMTYgcmVsb2MuICBUaGUgdHdvIDE2IGJpdAotICAgYWRkZW5kcyBhcmUgY29tYmluZWQgdG8gZm9ybSB0aGUgcmVhbCBhZGRlbmQgYWdhaW5zdCB0aGUgc2VjdGlvbgotICAgc3ltYm9sOyB0aGUgR09UMTYgaXMgbW9kaWZpZWQgdG8gY29udGFpbiB0aGUgb2Zmc2V0IG9mIGFuIGVudHJ5IGluCi0gICB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgYW5kIHRoZSBMTzE2IGlzIG1vZGlmaWVkIHRvIG9mZnNldCBpdAotICAgYXBwcm9wcmlhdGVseS4gIFRodXMgYW4gb2Zmc2V0IGxhcmdlciB0aGFuIDE2IGJpdHMgcmVxdWlyZXMgYQotICAgbW9kaWZpZWQgdmFsdWUgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0KLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gc3VmZmljZXMgZm9yIHRoZSBhc3NlbWJsZXIsIGJ1dCB0aGUgbGlua2VyIGRvZXMKLSAgIG5vdCB5ZXQga25vdyBob3cgdG8gY3JlYXRlIGdsb2JhbCBvZmZzZXQgdGFibGVzLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jIChhYmZkLAotCQkgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgc3ltYm9sLAotCQkgICAgICBkYXRhLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHdlIGNhbiBoYW5kbGUgaXQKLSAgICAganVzdCBsaWtlIEhJMTYuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHJldHVybiBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkJICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLQotICBhYm9ydCAoKTsKLX0KLQotLyogU2V0IHRoZSBHUCB2YWx1ZSBmb3IgT1VUUFVUX0JGRC4gIFJldHVybnMgZmFsc2UgaWYgdGhpcyBpcyBhCi0gICBkYW5nZXJvdXMgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9hc3NpZ25fZ3AgKG91dHB1dF9iZmQsIHBncCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBiZmRfdm1hICpwZ3A7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYXN5bWJvbCAqKnN5bTsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSWYgd2UndmUgYWxyZWFkeSBmaWd1cmVkIG91dCB3aGF0IEdQIHdpbGwgYmUsIGp1c3QgcmV0dXJuIGl0LiAgKi8KLSAgKnBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgaWYgKCpwZ3ApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLSAgc3ltID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLQotICAvKiBUaGUgbGlua2VyIHNjcmlwdCB3aWxsIGhhdmUgY3JlYXRlZCBhIHN5bWJvbCBuYW1lZCBgX2dwJyB3aXRoIHRoZQotICAgICBhcHByb3ByaWF0ZSB2YWx1ZS4gICovCi0gIGlmIChzeW0gPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgaSA9IGNvdW50OwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bSsrKQotCXsKLQkgIHJlZ2lzdGVyIENPTlNUIGNoYXIgKm5hbWU7Ci0KLQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqc3ltKTsKLQkgIGlmICgqbmFtZSA9PSAnXycgJiYgc3RyY21wIChuYW1lLCAiX2dwIikgPT0gMCkKLQkgICAgewotCSAgICAgICpwZ3AgPSBiZmRfYXN5bWJvbF92YWx1ZSAoKnN5bSk7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoaSA+PSBjb3VudCkKLSAgICB7Ci0gICAgICAvKiBPbmx5IGdldCB0aGUgZXJyb3Igb25jZS4gICovCi0gICAgICAqcGdwID0gNDsKLSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCAqcGdwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgZ3AgdmFsdWUsIHNvIHRoYXQgd2UgY2FuIGFkanVzdCB0aGUKLSAgIHN5bWJvbCB2YWx1ZSBjb3JyZWN0bHkuICBXZSBsb29rIHVwIHRoZSBzeW1ib2wgX2dwIGluIHRoZSBvdXRwdXQKLSAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVMRgotICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgotICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwgZXJyb3JfbWVzc2FnZSwgcGdwKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotICAgICBiZmRfdm1hICpwZ3A7Ci17Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmICEgcmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgICpwZ3AgPSAwOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0gICAgfQotCi0gICpwZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gIGlmICgqcGdwID09IDAKLSAgICAgICYmICghIHJlbG9jYXRlYWJsZQotCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApKQotICAgIHsKLSAgICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JewotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgICpwZ3AgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAweDQwMDA7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgKnBncCk7Ci0JfQotICAgICAgZWxzZSBpZiAoIW1pcHNfZWxmX2Fzc2lnbl9ncCAob3V0cHV0X2JmZCwgcGdwKSkKLQl7Ci0JICAqZXJyb3JfbWVzc2FnZSA9Ci0JICAgIChjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBfZ3Agbm90IGRlZmluZWQiKTsKLQkgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogRG8gYSBSX01JUFNfR1BSRUwxNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCB2YWx1ZSB3aGljaCBtdXN0Ci0gICBiZWNvbWUgdGhlIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgZnVuY3Rpb24gYWxzbyBoYW5kbGVzCi0gICBSX01JUFNfTElURVJBTCByZWxvY2F0aW9ucywgYWx0aG91Z2ggdGhvc2UgY2FuIGJlIGhhbmRsZWQgbW9yZQotICAgY2xldmVybHkgYmVjYXVzZSB0aGUgZW50cmllcyBpbiB0aGUgLmxpdDggYW5kIC5saXQ0IHNlY3Rpb25zIGNhbiBiZQotICAgbWVyZ2VkLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBncHJlbDE2X3dpdGhfZ3AgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgICAgIGJvb2xlYW4sIFBUUiwgYmZkX3ZtYSkpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRoIG5vCi0gICAgIGFkZGVuZCwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcuICBXZSB3aWxsIG9ubHkgaGF2ZSBhbgotICAgICBhZGRlbmQgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgcmVsb2MsIG5vdCByZWFkIGZyb20gYW4gRUxGCi0gICAgIGZpbGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY2F0ZWFibGUgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gICAgICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0gICAgfQotCi0gIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwgZXJyb3JfbWVzc2FnZSwKLQkJCSAgICZncCk7Ci0gIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotICAgIHJldHVybiByZXQ7Ci0KLSAgcmV0dXJuIGdwcmVsMTZfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgcmVsb2NhdGVhYmxlLCBkYXRhLCBncCk7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWdwcmVsMTZfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwgcmVsb2NhdGVhYmxlLCBkYXRhLAotCQkgZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBncDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgLyogU2V0IHZhbCB0byB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb3Igc3ltYm9sLiAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5ob3d0by0+c3JjX21hc2sgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2Ugb2NjdXJzIHdpdGggdGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkuICAqLwotICAgICAgdmFsID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAoKGluc24gJiAweGZmZmYpICsgcmVsb2NfZW50cnktPmFkZGVuZCkgJiAweGZmZmY7Ci0gICAgICBpZiAodmFsICYgMHg4MDAwKQotCXZhbCAtPSAweDEwMDAwOwotICAgIH0KLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKCEgcmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB2YWwgKz0gcmVsb2NhdGlvbiAtIGdwOwotCi0gIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKHZhbCAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmIChyZWxvY2F0ZWFibGUpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBNYWtlIHN1cmUgaXQgZml0IGluIDE2IGJpdHMuICAqLwotICBpZiAodmFsID49IDB4ODAwMCAmJiB2YWwgPCAweGZmZmY4MDAwKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogRG8gYSBSX01JUFNfR1BSRUwzMiByZWxvY2F0aW9uLiAgSXMgdGhpcyAzMiBiaXQgdmFsdWUgdGhlIG9mZnNldAotICAgZnJvbSB0aGUgZ3AgcmVnaXN0ZXI/IFhYWCAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdwcmVsMzJfd2l0aF9ncCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkJICAgICAgYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgICAgYm9vbGVhbiwgUFRSLCBiZmRfdm1hKSk7Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jIChhYmZkLAotCQkJcmVsb2NfZW50cnksCi0JCQlzeW1ib2wsCi0JCQlkYXRhLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopCi0JXygiMzJiaXRzIGdwIHJlbGF0aXZlIHJlbG9jYXRpb24gb2NjdXJzIGZvciBhbiBleHRlcm5hbCBzeW1ib2wiKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gICAgICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLAotCQkJICAgICAgIGVycm9yX21lc3NhZ2UsICZncCk7Ci0gICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLQlyZXR1cm4gcmV0OwotICAgIH0KLQotICByZXR1cm4gZ3ByZWwzMl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWxvY2F0ZWFibGUsIGRhdGEsIGdwKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ3ByZWwzMl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLCByZWxvY2F0ZWFibGUsIGRhdGEsCi0JCSBncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIGdwOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT5zcmNfbWFzayA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBhcmlzZXMgd2l0aCB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4gICovCi0gICAgICB2YWwgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEFkanVzdCB2YWwgZm9yIHRoZSBmaW5hbCBzZWN0aW9uIGxvY2F0aW9uIGFuZCBHUCB2YWx1ZS4gIElmIHdlCi0gICAgIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvcgotICAgICBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotICBpZiAoISByZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHZhbCArPSByZWxvY2F0aW9uIC0gZ3A7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIGEgNjQgYml0IHJlbG9jIGluIGEgMzIgYml0IE1JUFMgRUxGIGZpbGUuICBUaGVzZSBhcmUKLSAgIGdlbmVyYXRlZCB3aGVuIGFkZHJlc2VzIGFyZSA2NCBiaXRzLiAgVGhlIHVwcGVyIDMyIGJpdHMgYXJlIGEgc2ltbGUKLSAgIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczMyXzY0Yml0X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhcmVsZW50IHJlbG9jMzI7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICBiZmRfc2l6ZV90eXBlIGFkZHI7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsKLQotICAvKiBEbyBhIG5vcm1hbCAzMiBiaXQgcmVsb2NhdGlvbiBvbiB0aGUgbG93ZXIgMzIgYml0cy4gICovCi0gIHJlbG9jMzIgPSAqcmVsb2NfZW50cnk7Ci0gIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgcmVsb2MzMi5hZGRyZXNzICs9IDQ7Ci0gIHJlbG9jMzIuaG93dG8gPSAmZWxmX21pcHNfaG93dG9fdGFibGVbUl9NSVBTXzMyXTsKLSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsICZyZWxvYzMyLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0KLSAgLyogU2lnbiBleHRlbmQgaW50byB0aGUgdXBwZXIgMzIgYml0cy4gICovCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2MzMi5hZGRyZXNzKTsKLSAgaWYgKCh2YWwgJiAweDgwMDAwMDAwKSAhPSAwKQotICAgIHZhbCA9IDB4ZmZmZmZmZmY7Ci0gIGVsc2UKLSAgICB2YWwgPSAwOwotICBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgYWRkciArPSA0OwotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIEhhbmRsZSBhIG1pcHMxNiBqdW1wLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczE2X2p1bXBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIEZJWE1FLiAgKi8KLSAgewotICAgIHN0YXRpYyBib29sZWFuIHdhcm5lZDsKLQotICAgIGlmICghIHdhcm5lZCkKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCJMaW5raW5nIG1pcHMxNiBvYmplY3RzIGludG8gJXMgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQiKSwKLQkgYmZkX2dldF90YXJnZXQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcikpOwotICAgIHdhcm5lZCA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotLyogSGFuZGxlIGEgbWlwczE2IEdQIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczE2X2dwcmVsX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotICB1bnNpZ25lZCBzaG9ydCBleHRlbmQsIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgZmluYWw7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsCi0JCQkgICAmZ3ApOwotICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLSAgICByZXR1cm4gcmV0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogUGljayB1cCB0aGUgbWlwczE2IGV4dGVuZCBpbnN0cnVjdGlvbiBhbmQgdGhlIHJlYWwgaW5zdHJ1Y3Rpb24uICAqLwotICBleHRlbmQgPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgKyAyKTsKLQotICAvKiBTdHVmZiB0aGUgY3VycmVudCBhZGRlbmQgYmFjayBhcyBhIDMyIGJpdCB2YWx1ZSwgZG8gdGhlIHVzdWFsCi0gICAgIHJlbG9jYXRpb24sIGFuZCB0aGVuIGNsZWFuIHVwLiAgKi8KLSAgYmZkX3B1dF8zMiAoYWJmZCwKLQkgICAgICAoKChleHRlbmQgJiAweDFmKSA8PCAxMSkKLQkgICAgICAgfCAoZXh0ZW5kICYgMHg3ZTApCi0JICAgICAgIHwgKGluc24gJiAweDFmKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgcmV0ID0gZ3ByZWwxNl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOwotCi0gIGZpbmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsCi0JICAgICAgKChleHRlbmQgJiAweGY4MDApCi0JICAgICAgIHwgKChmaW5hbCA+PiAxMSkgJiAweDFmKQotCSAgICAgICB8IChmaW5hbCAmIDB4N2UwKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsCi0JICAgICAgKChpbnNuICYgMHhmZmUwKQotCSAgICAgICB8IChmaW5hbCAmIDB4MWYpKSwKLQkgICAgICAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmV0dXJuIHRoZSBJU0EgZm9yIGEgTUlQUyBlX2ZsYWdzIHZhbHVlLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWVsZl9taXBzX2lzYSAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BUkNIKQotICAgIHsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzE6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzI6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzM6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzQ6Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0gIHJldHVybiA0OwotfQotCi0vKiBSZXR1cm4gdGhlIE1BQ0ggZm9yIGEgTUlQUyBlX2ZsYWdzIHZhbHVlLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWVsZl9taXBzX21hY2ggKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfTUFDSCkKLSAgICB7Ci0gICAgY2FzZSBFX01JUFNfTUFDSF8zOTAwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHMzOTAwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MDEwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MDEwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MTAwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MTAwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MTExOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MTExOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80NjUwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0NjUwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBFX01JUFNfQVJDSF8xOgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHMzMDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTUlQU19BUkNIXzI6Ci0JICByZXR1cm4gYmZkX21hY2hfbWlwczYwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NSVBTX0FSQ0hfMzoKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzNDAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01JUFNfQVJDSF80OgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHM4MDAwOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHByaW50YWJsZSBuYW1lIGZvciBBQkkuICovCi0KLXN0YXRpYyBJTkxJTkUgY2hhcioKLWVsZl9taXBzX2FiaV9uYW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmIChBQklfTjMyX1AgKGFiZmQpKQotICAgIHJldHVybiAiTjMyIjsKLSAgZWxzZSBpZiAoQUJJXzY0X1AgKGFiZmQpKQotICAgIHJldHVybiAiNjQiOwotICAgICAgCi0gIGZsYWdzID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3M7Ci0gIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX0FCSSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuICJub25lIjsKLSAgICBjYXNlIEVfTUlQU19BQklfTzMyOgotICAgICAgcmV0dXJuICJPMzIiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9PNjQ6Ci0gICAgICByZXR1cm4gIk82NCI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX0VBQkkzMjoKLSAgICAgIHJldHVybiAiRUFCSTMyIjsKLSAgICBjYXNlIEVfTUlQU19BQklfRUFCSTY0OgotICAgICAgcmV0dXJuICJFQUJJNjQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gInVua25vd24gYWJpIjsKLSAgICB9Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBNSVBTIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBlbGZfcmVsb2NfbWFwIG1pcHNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX01JUFNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTUlQU18xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NSVBTXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzY0LCBSX01JUFNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19KTVAsIFJfTUlQU18yNiB9LAotICB7IEJGRF9SRUxPQ19ISTE2X1MsIFJfTUlQU19ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX0xPMTYsIFJfTUlQU19MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR1BSRUwsIFJfTUlQU19HUFJFTDE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfTElURVJBTCwgUl9NSVBTX0xJVEVSQUwgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1QxNiwgUl9NSVBTX0dPVDE2IH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01JUFNfUEMxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTEwxNiwgUl9NSVBTX0NBTEwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIsIFJfTUlQU19HUFJFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYsIFJfTUlQU19HT1RfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LCBSX01JUFNfR09UX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsIFJfTUlQU19DQUxMX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYsIFJfTUlQU19DQUxMX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19TVUIsIFJfTUlQU19TVUIgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRSwgUl9NSVBTX0dPVF9QQUdFIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX09GU1QsIFJfTUlQU19HT1RfT0ZTVCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQLCBSX01JUFNfR09UX0RJU1AgfQotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgdHlwZSwgcmV0dXJuIGEgaG93dG8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAobWlwc19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobWlwc19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX21pcHNfaG93dG9fdGFibGVbKGludCkgbWlwc19yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgLyogV2UgbmVlZCB0byBoYW5kbGUgQkZEX1JFTE9DX0NUT1Igc3BlY2lhbGx5LgotCSBTZWxlY3QgdGhlIHJpZ2h0IHJlbG9jYXRpb24gKFJfTUlQU18zMiBvciBSX01JUFNfNjQpIGJhc2VkIG9uIHRoZQotCSBzaXplIG9mIGFkZHJlc3NlcyBvbiB0aGlzIGFyY2hpdGVjdHVyZS4gICovCi0gICAgICBpZiAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkgPT0gMzIpCi0JcmV0dXJuICZlbGZfbWlwc19ob3d0b190YWJsZVsoaW50KSBSX01JUFNfMzJdOwotICAgICAgZWxzZQotCXJldHVybiAmZWxmX21pcHNfY3RvcjY0X2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUlQUzE2X0pNUDoKLSAgICAgIHJldHVybiAmZWxmX21pcHMxNl9qdW1wX2hvd3RvOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9HUFJFTDoKLSAgICAgIHJldHVybiAmZWxmX21pcHMxNl9ncHJlbF9ob3d0bzsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0bzsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvOwotICAgIH0KLX0KLQotLyogR2l2ZW4gYSBNSVBTIEVsZjMyX0ludGVybmFsX1JlbCwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1pcHNfcnR5cGVfdG9faG93dG8gKHJfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHJfdHlwZTsKLXsKLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9NSVBTMTZfMjY6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTMTZfR1BSRUw6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfZ3ByZWxfaG93dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NSVBTX21heCk7Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIEdpdmVuIGEgTUlQUyBFbGYzMl9JbnRlcm5hbF9SZWwsIGZpbGwgaW4gYW4gYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9IG1pcHNfcnR5cGVfdG9faG93dG8gKHJfdHlwZSk7Ci0KLSAgLyogVGhlIGFkZGVuZCBmb3IgYSBHUFJFTDE2IG9yIExJVEVSQUwgcmVsb2NhdGlvbiBjb21lcyBmcm9tIHRoZSBHUAotICAgICB2YWx1ZSBmb3IgdGhlIG9iamVjdCBmaWxlLiAgV2UgZ2V0IHRoZSBhZGRlbmQgbm93LCByYXRoZXIgdGhhbgotICAgICB3aGVuIHdlIGRvIHRoZSByZWxvY2F0aW9uLCBiZWNhdXNlIHRoZSBzeW1ib2wgbWFuaXB1bGF0aW9ucyBkb25lCi0gICAgIGJ5IHRoZSBsaW5rZXIgbWF5IGNhdXNlIHVzIHRvIGxvc2UgdHJhY2sgb2YgdGhlIGlucHV0IEJGRC4gICovCi0gIGlmICgoKCpjYWNoZV9wdHItPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLSAgICAgICYmIChyX3R5cGUgPT0gKHVuc2lnbmVkIGludCkgUl9NSVBTX0dQUkVMMTYKLQkgIHx8IHJfdHlwZSA9PSAodW5zaWduZWQgaW50KSBSX01JUFNfTElURVJBTCkpCi0gICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBlbGZfZ3AgKGFiZmQpOwotfQotCi0vKiBHaXZlbiBhIE1JUFMgRWxmMzJfSW50ZXJuYWxfUmVsYSwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIC8qIFNpbmNlIGFuIEVsZjMyX0ludGVybmFsX1JlbCBpcyBhbiBpbml0aWFsIHByZWZpeCBvZiBhbgotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhLCB3ZSBjYW4ganVzdCB1c2UgbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotICAgICBhYm92ZS4gICovCi0gIG1pcHNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgKEVsZjMyX0ludGVybmFsX1JlbCAqKSBkc3QpOwotCi0gIC8qIElmIHdlIGV2ZXIgbmVlZCB0byBkbyBhbnkgZXh0cmEgcHJvY2Vzc2luZyB3aXRoIGRzdC0+cl9hZGRlbmQKLSAgICAgKHRoZSBmaWVsZCBvbWl0dGVkIGluIGFuIEVsZjMyX0ludGVybmFsX1JlbCkgd2UgY2FuIGRvIGl0IGhlcmUuICAqLwotfQotDAotLyogQSAucmVnaW5mbyBzZWN0aW9uIGhvbGRzIGEgc2luZ2xlIEVsZjMyX1JlZ0luZm8gc3RydWN0dXJlLiAgVGhlc2UKLSAgIHJvdXRpbmVzIHN3YXAgdGhpcyBzdHJ1Y3R1cmUgaW4gYW5kIG91dC4gIFRoZXkgYXJlIHVzZWQgb3V0c2lkZSBvZgotICAgQkZELCBzbyB0aGV5IGFyZSBnbG9iYWxseSB2aXNpYmxlLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci0gICAgIEVsZjMyX1JlZ0luZm8gKmluOwotewotICBpbi0+cmlfZ3BybWFzayA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzFdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBpbi0+cmlfY3BybWFza1syXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGluLT5yaV9ncF92YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLXZvaWQKLWJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9SZWdJbmZvICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncHJtYXNrLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwcm1hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1swXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMV0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzJdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1szXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzNdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2dwX3ZhbHVlLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwX3ZhbHVlKTsKLX0KLQotLyogSW4gdGhlIDY0IGJpdCBBQkksIHRoZSAuTUlQUy5vcHRpb25zIHNlY3Rpb24gaG9sZHMgcmVnaXN0ZXIKLSAgIGluZm9ybWF0aW9uIGluIGFuIEVsZjY0X1JlZ2luZm8gc3RydWN0dXJlLiAgVGhlc2Ugcm91dGluZXMgc3dhcAotICAgdGhlbSBpbiBhbmQgb3V0LiAgVGhleSBhcmUgZ2xvYmFsbHkgdmlzaWJsZSBiZWNhdXNlIHRoZXkgYXJlIHVzZWQKLSAgIG91dHNpZGUgb2YgQkZELiAgVGhlc2Ugcm91dGluZXMgYXJlIGhlcmUgc28gdGhhdCBnYXMgY2FuIGNhbGwgdGhlbQotICAgd2l0aG91dCB3b3JyeWluZyBhYm91dCB3aGV0aGVyIHRoZSA2NCBiaXQgQUJJIGhhcyBiZWVuIGluY2x1ZGVkLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKmluOwotewotICBpbi0+cmlfZ3BybWFzayA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgaW4tPnJpX3BhZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9wYWQpOwotICBpbi0+cmlfY3BybWFza1swXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzBdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMV0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1sxXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzJdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMl0pOwotICBpbi0+cmlfY3BybWFza1szXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzNdKTsKLSAgaW4tPnJpX2dwX3ZhbHVlID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2dwX3ZhbHVlKTsKLX0KLQotdm9pZAotYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKmluOwotICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2dwcm1hc2ssCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9wYWQsCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfcGFkKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMF0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzFdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1syXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbM10sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncF92YWx1ZSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLS8qIFN3YXAgYW4gZW50cnkgaW4gYSAuZ3B0YWIgc2VjdGlvbi4gIE5vdGUgdGhhdCB0aGVzZSByb3V0aW5lcyByZWx5Ci0gICBvbiB0aGUgZXF1aXZhbGVuY2Ugb2YgdGhlIHR3byBlbGVtZW50cyBvZiB0aGUgdW5pb24uICAqLwotCi1zdGF0aWMgdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX0V4dGVybmFsX2dwdGFiICpleDsKLSAgICAgRWxmMzJfZ3B0YWIgKmluOwotewotICBpbi0+Z3RfZW50cnkuZ3RfZ192YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPmd0X2VudHJ5Lmd0X2dfdmFsdWUpOwotICBpbi0+Z3RfZW50cnkuZ3RfYnl0ZXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5ndF9lbnRyeS5ndF9ieXRlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX2dwdGFiICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+Z3RfZW50cnkuZ3RfZ192YWx1ZSwKLQkJZXgtPmd0X2VudHJ5Lmd0X2dfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+Z3RfZW50cnkuZ3RfYnl0ZXMsCi0JCWV4LT5ndF9lbnRyeS5ndF9ieXRlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9jb21wYWN0X3JlbCAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmlkMSwgZXgtPmlkMSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5udW0sIGV4LT5udW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+aWQyLCBleC0+aWQyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPm9mZnNldCwgZXgtPm9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yZXNlcnZlZDAsIGV4LT5yZXNlcnZlZDApOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmVzZXJ2ZWQxLCBleC0+cmVzZXJ2ZWQxKTsKLX0KLQotc3RhdGljIHZvaWQKLWJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9jcmluZm8gKmluOwotICAgICBFbGYzMl9FeHRlcm5hbF9jcmluZm8gKmV4OwotewotICB1bnNpZ25lZCBsb25nIGw7Ci0KLSAgbCA9ICgoKGluLT5jdHlwZSAmIENSSU5GT19DVFlQRSkgPDwgQ1JJTkZPX0NUWVBFX1NIKQotICAgICAgIHwgKChpbi0+cnR5cGUgJiBDUklORk9fUlRZUEUpIDw8IENSSU5GT19SVFlQRV9TSCkKLSAgICAgICB8ICgoaW4tPmRpc3QydG8gJiBDUklORk9fRElTVDJUTykgPDwgQ1JJTkZPX0RJU1QyVE9fU0gpCi0gICAgICAgfCAoKGluLT5yZWx2YWRkciAmIENSSU5GT19SRUxWQUREUikgPDwgQ1JJTkZPX1JFTFZBRERSX1NIKSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGwsIGV4LT5pbmZvKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmtvbnN0LCBleC0+a29uc3QpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+dmFkZHIsIGV4LT52YWRkcik7Ci19Ci0KLS8qIFN3YXAgaW4gYW4gb3B0aW9ucyBoZWFkZXIuICAqLwotCi12b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX09wdGlvbnMgKmV4OwotICAgICBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqaW47Ci17Ci0gIGluLT5raW5kID0gYmZkX2hfZ2V0XzggKGFiZmQsIGV4LT5raW5kKTsKLSAgaW4tPnNpemUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXgtPnNpemUpOwotICBpbi0+c2VjdGlvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXgtPnNlY3Rpb24pOwotICBpbi0+aW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPmluZm8pOwotfQotCi0vKiBTd2FwIG91dCBhbiBvcHRpb25zIGhlYWRlci4gICovCi0KLXZvaWQKLWJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX09wdGlvbnMgKmluOwotICAgICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqZXg7Ci17Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBpbi0+a2luZCwgZXgtPmtpbmQpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW4tPnNpemUsIGV4LT5zaXplKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+c2VjdGlvbiwgZXgtPnNlY3Rpb24pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5pbmZvLCBleC0+aW5mbyk7Ci19Ci0KLS8qIFN3YXAgaW4gYW4gTVNZTSBlbnRyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9tc3ltX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfRXh0ZXJuYWxfTXN5bSAqZXg7Ci0gICAgIEVsZjMyX0ludGVybmFsX01zeW0gKmluOwotewotICBpbi0+bXNfaGFzaF92YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPm1zX2hhc2hfdmFsdWUpOwotICBpbi0+bXNfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPm1zX2luZm8pOwotfQotCi0vKiBTd2FwIG91dCBhbiBNU1lNIGVudHJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLWJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfSW50ZXJuYWxfTXN5bSAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX01zeW0gKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5tc19oYXNoX3ZhbHVlLCBleC0+bXNfaGFzaF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPm1zX2luZm8sIGV4LT5tc19pbmZvKTsKLX0KLQotDAotLyogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgZ2xvYmFsIGZvciB0aGUgcHVycG9zZXMgb2Ygc3BsaXR0aW5nCi0gICB0aGUgc3ltYm9sIHRhYmxlIGludG8gZ2xvYmFsIHN5bWJvbHMgYW5kIGxvY2FsIHN5bWJvbHMuICBBdCBsZWFzdAotICAgb24gSXJpeCA1LCB0aGlzIHNwbGl0IG11c3QgYmUgYmV0d2VlbiBzZWN0aW9uIHN5bWJvbHMgYW5kIGFsbCBvdGhlcgotICAgc3ltYm9scy4gIE9uIG1vc3QgRUxGIHRhcmdldHMgdGhlIHNwbGl0IGlzIGJldHdlZW4gc3RhdGljIHN5bWJvbHMKLSAgIGFuZCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3N5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgcmV0dXJuIChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotfQotDAotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYSBNSVBTIEVMRiBmaWxlLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogSXJpeCA1IGFuZCA2IGlzIGJyb2tlbi4gIE9iamVjdCBmaWxlIHN5bWJvbCB0YWJsZXMgYXJlIG5vdCBhbHdheXMKLSAgICAgc29ydGVkIGNvcnJlY3RseSBzdWNoIHRoYXQgbG9jYWwgc3ltYm9scyBwcmVjZWRlIGdsb2JhbCBzeW1ib2xzLAotICAgICBhbmQgdGhlIHNoX2luZm8gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBpcyBub3QgYWx3YXlzIHJpZ2h0LiAgKi8KLSAgZWxmX2JhZF9zeW10YWIgKGFiZmQpID0gdHJ1ZTsKLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9taXBzLAotCQkJICAgICBlbGZfbWlwc19tYWNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIGZpbmFsIHByb2Nlc3NpbmcgZG9uZSBqdXN0IGJlZm9yZSB3cml0aW5nIG91dCBhIE1JUFMgRUxGIG9iamVjdAotICAgZmlsZS4gIFRoaXMgZ2V0cyB0aGUgTUlQUyBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUKLSAgIG51bWJlci4gIFRoaXMgaXMgdXNlZCBieSBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1fYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbWlwczMwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8xOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMSB8IEVfTUlQU19NQUNIXzM5MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDEwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDEwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDExMToKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQ2NTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF80OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLQotICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgZm9yIC5ncHRhYiBzZWN0aW9ucyBhbmQgb3RoZXIgYXBwcm9wcmlhdGUKLSAgICAgaW5mbyBmb3IgZWFjaCBzcGVjaWFsIHNlY3Rpb24uICAqLwotICBmb3IgKGkgPSAxLCBoZHJwcCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgKyAxOwotICAgICAgIGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsKLSAgICAgICBpKyssIGhkcnBwKyspCi0gICAgewotICAgICAgc3dpdGNoICgoKmhkcnBwKS0+c2hfdHlwZSkKLQl7Ci0JY2FzZSBTSFRfTUlQU19NU1lNOgotCWNhc2UgU0hUX01JUFNfTElCTElTVDoKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX0dQVEFCOgotCSAgQkZEX0FTU0VSVCAoKCpoZHJwcCktPmJmZF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCAoKmhkcnBwKS0+YmZkX3NlY3Rpb24pOwotCSAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApOwotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxKTsKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfQ09OVEVOVDoKLQkgIEJGRF9BU1NFUlQgKCgqaGRycHApLT5iZmRfc2VjdGlvbiAhPSBOVUxMKTsKLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgKCpoZHJwcCktPmJmZF9zZWN0aW9uKTsKLQkgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTAotCQkgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsCi0JCQkJICBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSkgPT0gMCk7Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJIG5hbWUgKyBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSk7Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX1NZTUJPTF9MSUI6Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpYmxpc3QiKTsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgKCpoZHJwcCktPnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTUlQU19FVkVOVFM6Ci0JICBCRkRfQVNTRVJUICgoKmhkcnBwKS0+YmZkX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsICgqaGRycHApLT5iZmRfc2VjdGlvbik7Ci0JICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwpOwotCSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5ldmVudHMiLCBzaXplb2YgIi5NSVBTLmV2ZW50cyIgLSAxKSA9PSAwKQotCSAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJICAgbmFtZSArIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5NSVBTLnBvc3RfcmVsIiwKLQkJCQkgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpID09IDApOwotCSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgICAgIChuYW1lCi0JCQkJCSAgICAgICsgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSk7Ci0JICAgIH0KLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCX0KLSAgICB9Ci19Ci0MCi0vKiBGdW5jdGlvbiB0byBrZWVwIE1JUFMgc3BlY2lmaWMgZmlsZSBmbGFncyBsaWtlIGFzIEVGX01JUFNfUElDLiAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKLQkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOwotCi0gIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb2xkX2ZsYWdzOwotICBmbGFnd29yZCBuZXdfZmxhZ3M7Ci0gIGJvb2xlYW4gb2s7Ci0KLSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgc2FtZSBlbmRpYW5lc3MgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbXNnOwotCi0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGliZmQpKQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4iKTsKLSAgICAgIGVsc2UKLQltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBiaWcgZW5kaWFuIik7Ci0KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IG5ld19mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdIAotCT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfaWRlbnRbRUlfQ0xBU1NdOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJCSAgIGJmZF9nZXRfbWFjaCAoaWJmZCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLQotICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfTk9SRU9SREVSOwotICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfTk9SRU9SREVSOwotCi0gIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9rID0gdHJ1ZTsKLQotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfUElDKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19QSUMpKQotICAgIHsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19QSUM7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIFBJQyBmaWxlcyB3aXRoIG5vbi1QSUMgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpICE9IChvbGRfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpKQotICAgIHsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19DUElDOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0NQSUM7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGxpbmtpbmcgYWJpY2FsbHMgZmlsZXMgd2l0aCBub24tYWJpY2FsbHMgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ29tcGFyZSB0aGUgSVNBJ3MuICovCi0gIGlmICgobmV3X2ZsYWdzICYgKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCkpCi0gICAgICAhPSAob2xkX2ZsYWdzICYgKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCkpKQotICAgIHsKLSAgICAgIGludCBuZXdfbWFjaCA9IG5ld19mbGFncyAmIEVGX01JUFNfTUFDSDsKLSAgICAgIGludCBvbGRfbWFjaCA9IG9sZF9mbGFncyAmIEVGX01JUFNfTUFDSDsKLSAgICAgIGludCBuZXdfaXNhID0gZWxmX21pcHNfaXNhIChuZXdfZmxhZ3MpOwotICAgICAgaW50IG9sZF9pc2EgPSBlbGZfbWlwc19pc2EgKG9sZF9mbGFncyk7Ci0KLSAgICAgIC8qIElmIGVpdGhlciBoYXMgbm8gbWFjaGluZSBzcGVjaWZpZWQsIGp1c3QgY29tcGFyZSB0aGUgZ2VuZXJhbCBpc2Ency4KLQkgU29tZSBjb21iaW5hdGlvbnMgb2YgbWFjaGluZXMgYXJlIG9rLCBpZiB0aGUgaXNhJ3MgbWF0Y2guICovCi0gICAgICBpZiAoISBuZXdfbWFjaCAKLQkgIHx8ICEgb2xkX21hY2gKLQkgIHx8IG5ld19tYWNoID09IG9sZF9tYWNoCi0JICApCi0JewotCSAgLyogRG9uJ3Qgd2FybiBhYm91dCBtaXhpbmcgLW1pcHMxIGFuZCAtbWlwczIgY29kZSwgb3IgbWl4aW5nIC1taXBzMwotCSAgICAgYW5kIC1taXBzNCBjb2RlLiAgVGhleSB3aWxsIG5vcm1hbGx5IHVzZSB0aGUgc2FtZSBkYXRhIHNpemVzIGFuZAotCSAgICAgY2FsbGluZyBjb252ZW50aW9ucy4gICovCi0KLQkgIGlmICgobmV3X2lzYSA9PSAxIHx8IG5ld19pc2EgPT0gMikKLQkgICAgICA/IChvbGRfaXNhICE9IDEgJiYgb2xkX2lzYSAhPSAyKQotCSAgICAgIDogKG9sZF9pc2EgPT0gMSB8fCBvbGRfaXNhID09IDIpKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogSVNBIG1pc21hdGNoICgtbWlwcyVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKC1taXBzJWQpIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCBuZXdfaXNhLCBvbGRfaXNhKTsKLQkgICAgICBvayA9IGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogSVNBIG1pc21hdGNoICglZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICglZCkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgICAgZWxmX21pcHNfbWFjaCAobmV3X2ZsYWdzKSwKLQkgICAgIGVsZl9taXBzX21hY2ggKG9sZF9mbGFncykpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIG5ld19mbGFncyAmPSB+IChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpOwotICAgICAgb2xkX2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gICAgfQotCi0gIC8qIENvbXBhcmUgQUJJJ3MuICBUaGUgNjQtYml0IEFCSSBkb2VzIG5vdCB1c2UgRUZfTUlQU19BQkkuICBCdXQsIGl0Ci0gICAgIGRvZXMgc2V0IEVJX0NMQVNTIGRpZmZlcmVudGx5IGZyb20gYW55IDMyLWJpdCBBQkkuICAqLwotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfQUJJKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19BQkkpCi0gICAgICB8fCAoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfaWRlbnRbRUlfQ0xBU1NdIAotCSAgIT0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdKSkKLSAgICB7Ci0gICAgICAvKiBPbmx5IGVycm9yIGlmIGJvdGggYXJlIHNldCAodG8gZGlmZmVyZW50IHZhbHVlcykuICovCi0gICAgICBpZiAoKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgJiYgKG9sZF9mbGFncyAmIEVGX01JUFNfQUJJKSkKLQkgIHx8IChlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9pZGVudFtFSV9DTEFTU10gCi0JICAgICAgIT0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdKSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBBQkkgbWlzbWF0Y2g6IGxpbmtpbmcgJXMgbW9kdWxlIHdpdGggcHJldmlvdXMgJXMgbW9kdWxlcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19hYmlfbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19hYmlfbmFtZSAob2JmZCkpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0gICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfQUJJOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0FCSTsKLSAgICB9Ci0KLSAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksICh1bnNpZ25lZCBsb25nKSBuZXdfZmxhZ3MsCi0JICh1bnNpZ25lZCBsb25nKSBvbGRfZmxhZ3MpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgb2spCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHB0cjsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHB0cjsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotCi0gIC8qIFByaW50IG5vcm1hbCBFTEYgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9PMzIpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU8zMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX082NCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9TzY0XSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfRUFCSTMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1FQUJJMzJdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9FQUJJNjQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPUVBQkk2NF0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmkgdW5rbm93bl0iKSk7Ci0gIGVsc2UgaWYgKEFCSV9OMzJfUCAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU4zMl0iKSk7Ci0gIGVsc2UgaWYgKEFCSV82NF9QIChhYmZkKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9NjRdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbm8gYWJpIHNldF0iKSk7Ci0KLSAgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMV0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzM10iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfNCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzNF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFt1bmtub3duIElTQV0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU18zMkJJVE1PREUpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbMzJiaXRtb2RlXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW25vdCAzMmJpdG1vZGVdIikpOwotCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhhbmRsZSBhIE1JUFMgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLgotICAgVGhpcyByb3V0aW5lIHN1cHBvcnRzIGJvdGggdGhlIDMyLWJpdCBhbmQgNjQtYml0IEVMRiBBQkkuCi0KLSAgIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgU0hGX01JUFNfR1BSRUwgZmxhZywgYnV0IEknbSBub3Qgc3VyZQotICAgaG93IHRvLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzID0gMDsKLQotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gIEZvcnR1bmF0ZWx5LCB0aGUgQUJJIGdpdmVzCi0gICAgIHN1Z2dlc3RlZCBuYW1lcyBmb3IgYWxsIHRoZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLCBzbyB3ZSB3aWxsCi0gICAgIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdGhpcy4gICovCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9NSVBTX0xJQkxJU1Q6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmxpYmxpc3QiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTToKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTkZMSUNUOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5jb25mbGljdCIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19HUFRBQjoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfVUNPREU6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnVjb2RlIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RFQlVHOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gU0VDX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfUkVHSU5GTzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpICE9IDAKLQkgIHx8IGhkci0+c2hfc2l6ZSAhPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLmludGVyZmFjZXMiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfQ09OVEVOVDoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfT1BUSU9OUzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RXQVJGOgotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWdfIiwgc2l6ZW9mICIuZGVidWdfIiAtIDEpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLnN5bWxpYiIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCSAgICAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKLQkJCQkgICAgfCBmbGFncykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIHNob3VsZCByZWNvcmQgc2hfaW5mbyBmb3IgYSAuZ3B0YWIgc2VjdGlvbi4gICovCi0KLSAgLyogRm9yIGEgLnJlZ2luZm8gc2VjdGlvbiwgc2V0IHRoZSBncCB2YWx1ZSBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24KLSAgICAgZnJvbSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgV2UgbmVlZCB0aGUgZ3AgdmFsdWUgd2hpbGUKLSAgICAgcHJvY2Vzc2luZyByZWxvY3MsIHNvIHdlIGp1c3QgZ2V0IGl0IG5vdy4gIFRoZSAucmVnaW5mbyBzZWN0aW9uCi0gICAgIGlzIG5vdCB1c2VkIGluIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19SRUdJTkZPKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OwotICAgICAgRWxmMzJfUmVnSW5mbyBzOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4gKGFiZmQsICZleHQsICZzKTsKLSAgICAgIGVsZl9ncCAoYWJmZCkgPSBzLnJpX2dwX3ZhbHVlOwotICAgIH0KLQotICAvKiBGb3IgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24sIGxvb2sgZm9yIGEgT0RLX1JFR0lORk8gZW50cnksIGFuZAotICAgICBzZXQgdGhlIGdwIHZhbHVlIGJhc2VkIG9uIHdoYXQgd2UgZmluZC4gIFdlIG1heSBzZWUgYm90aAotICAgICBTSFRfTUlQU19SRUdJTkZPIGFuZCBTSFRfTUlQU19PUFRJT05TL09ES19SRUdJTkZPOyBpbiB0aGF0IGNhc2UsCi0gICAgIHRoZXkgc2hvdWxkIGFncmVlLiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIGhkci0+c2hfc2l6ZSkpCi0JewotCSAgZnJlZSAoY29udGVudHMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChBQklfNjRfUCAoYWJmZCkgJiYgaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIGludHJlZzsKLQotCSAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbgotCQkoYWJmZCwKLQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkgIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpKSwKLQkJICZpbnRyZWcpOwotCSAgICAgIGVsZl9ncCAoYWJmZCkgPSBpbnRyZWcucmlfZ3BfdmFsdWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgRWxmMzJfUmVnSW5mbyBpbnRyZWc7Ci0KLQkgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4KLQkJKGFiZmQsCi0JCSAoKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikKLQkJICAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKSksCi0JCSAmaW50cmVnKTsKLQkgICAgICBlbGZfZ3AgKGFiZmQpID0gaW50cmVnLnJpX2dwX3ZhbHVlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIE1JUFMgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saWJsaXN0IikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19MSUJMSVNUOwotICAgICAgaGRyLT5zaF9pbmZvID0gc2VjLT5fcmF3X3NpemUgLyBzaXplb2YgKEVsZjMyX0xpYik7Ci0gICAgICAvKiBUaGUgc2hfbGluayBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuY29uZmxpY3QiKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0NPTkZMSUNUOwotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0dQVEFCOwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0gICAgICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIudWNvZGUiKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1VDT0RFOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19ERUJVRzsKLSAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5tZGVidWcgc2VjdGlvbiBoYXMgYW4KLSAgICAgICAgIGVudHNpemUgb2YgMC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KLSAgICAgIGlmIChTR0lfQ09NUEFUIChhYmZkKSAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCWhkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19SRUdJTkZPOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBoYXMgYW4KLSAgICAgICAgIGVudHNpemUgb2YgMHgxOC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KLSAgICAgIGlmIChTR0lfQ09NUEFUIChhYmZkKSAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCWhkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0JICAgJiYgKHN0cmNtcCAobmFtZSwgIi5oYXNoIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluYW1pYyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApKQotICAgIHsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDA7Ci0jaWYgMAotICAgICAgLyogVGhpcyBpc24ndCBob3cgdGhlIElyaXggNiBsaW5rZXIgYmVoYXZlcy4gICovCi0gICAgICBoZHItPnNoX2luZm8gPSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVM7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5nb3QiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0gICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19HUFJFTDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuaW50ZXJmYWNlcyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfSUZBQ0U7Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsIHN0cmxlbiAoIi5NSVBTLmNvbnRlbnQiKSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19DT05URU5UOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgICAgLyogVGhlIHNoX2luZm8gZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfT1BUSU9OUzsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDE7Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIHNpemVvZiAiLmRlYnVnXyIgLSAxKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0RXQVJGOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5zeW1saWIiKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1NZTUJPTF9MSUI7Ci0gICAgICAvKiBUaGUgc2hfbGluayBhbmQgc2hfaW5mbyBmaWVsZHMgYXJlIHNldCBpbgotICAgICAgICAgZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuZXZlbnRzIiwgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSkgPT0gMAotCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCSAgICAgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfRVZFTlRTOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgICAgLyogVGhlIHNoX2xpbmsgZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfTVNZTTsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gODsKLSAgICB9Ci0KLSAgLyogVGhlIGdlbmVyaWMgZWxmX2Zha2Vfc2VjdGlvbnMgd2lsbCBzZXQgdXAgUkVMX0hEUiB1c2luZyB0aGUKLSAgICAgZGVmYXVsdCBraW5kIG9mIHJlbG9jYXRpb25zLiAgQnV0LCB3ZSBtYXkgYWN0dWFsbHkgbmVlZCBib3RoCi0gICAgIGtpbmRzIG9mIHJlbG9jYXRpb25zLCBzbyB3ZSBzZXQgdXAgdGhlIHNlY29uZCBoZWFkZXIgaGVyZS4gICovCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmVzZDsKLQotICAgICAgZXNkID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVzZC0+cmVsX2hkcjIgPT0gTlVMTCk7Ci0gICAgICBlc2QtPnJlbF9oZHIyIAotCT0gKEVsZl9JbnRlcm5hbF9TaGRyICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKTsKLSAgICAgIGlmICghZXNkLT5yZWxfaGRyMikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIgKGFiZmQsIGVzZC0+cmVsX2hkcjIsIHNlYywKLQkJCQkhZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dXNlX3JlbGFfcCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIEJGRCBzZWN0aW9uLCB0cnkgdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVMRiBzZWN0aW9uCi0gICBpbmRleC4gIFRoaXMgaXMgdXNlZCBieSBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLgotICAgQWN0dWFsbHksIGl0J3Mgbm90IGNsZWFyIHRvIG1lIHRoYXQgdGhlIDY0LWJpdCBBQkkgc3VwcG9ydHMgdGhlc2UsCi0gICBidXQgZm9yIG5vbi1QSUMgb2JqZWN0cyB3ZSB3aWxsIGNlcnRhaW5seSB3YW50IHN1cHBvcnQgZm9yIGF0IGxlYXN0Ci0gICB0aGUgLnNjb21tb24gc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBoZHIsIHNlYywgcmV0dmFsKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCAqcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICAqcmV0dmFsID0gU0hOX01JUFNfU0NPTU1PTjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuYWNvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NSVBTX0FDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV2hlbiBhcmUgd3JpdGluZyBvdXQgdGhlIC5vcHRpb25zIG9yIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiwKLSAgIHJlbWVtYmVyIHRoZSBieXRlcyB3ZSBhcmUgd3JpdGluZyBvdXQsIHNvIHRoYXQgd2UgY2FuIGluc3RhbGwgdGhlCi0gICBHUCB2YWx1ZSBpbiB0aGUgc2VjdGlvbl9wcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgKmM7Ci0KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpKTsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBpZiAoYyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgaWYgKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICBzaXplID0gc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgZWxzZQotCSAgICBzaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgYyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50ZGF0YSA9IChQVFIpIGM7Ci0JfQotCi0gICAgICBtZW1jcHkgKGMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwKLQkJCQkJY291bnQpOwotfQotCi0vKiBXb3JrIG92ZXIgYSBzZWN0aW9uIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICBGSVhNRTogV2UgcmVjb2duaXplCi0gICBzZWN0aW9ucyB0aGF0IG5lZWQgdGhlIFNIRl9NSVBTX0dQUkVMIGZsYWcgYnkgbmFtZTsgdGhlcmUgaGFzIHRvIGJlCi0gICBhIGJldHRlciB3YXkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfUkVHSU5GTwotICAgICAgJiYgaGRyLT5zaF9zaXplID4gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBidWZbNF07Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfc2l6ZSA9PSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+Y29udGVudHMgPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIGhkci0+c2hfb2Zmc2V0ICsgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSAtIDQsCi0JCSAgICBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgZWxmX2dwIChhYmZkKSwgYnVmKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgKGJmZF9zaXplX3R5cGUpIDEsIChiZmRfc2l6ZV90eXBlKSA0LCBhYmZkKSAhPSA0KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TCi0gICAgICAmJiBoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICAvKiBXZSBzdG9yZWQgdGhlIHNlY3Rpb24gY29udGVudHMgaW4gdGhlIGVsZl9zZWN0aW9uX2RhdGEgdGRhdGEKLQkgZmllbGQgaW4gdGhlIHNldF9zZWN0aW9uX2NvbnRlbnRzIHJvdXRpbmUuICBXZSBzYXZlIHRoZQotCSBzZWN0aW9uIGNvbnRlbnRzIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZWFkIHRoZW0gYWdhaW4uCi0JIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IGVsZl9ncCBpcyBzZXQsIHNvIHdlIGNhbiBsb29rCi0JIHRocm91Z2ggdGhlIHNlY3Rpb24gY29udGVudHMgdG8gc2VlIGlmIHRoZXJlIGlzIGFuCi0JIE9ES19SRUdJTkZPIHN0cnVjdHVyZS4gICovCi0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YTsKLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChBQklfNjRfUCAoYWJmZCkgJiYgaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSBidWZbOF07Ci0KLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCQkgICAgKGhkci0+c2hfb2Zmc2V0Ci0JCQkgICAgICsgKGwgLSBjb250ZW50cykKLQkJCSAgICAgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKQotCQkJICAgICArIChzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pIC0gOCkpLAotCQkJICAgICBTRUVLX1NFVCkgPT0gLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBiZmRfaF9wdXRfNjQgKGFiZmQsIGVsZl9ncCAoYWJmZCksIGJ1Zik7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhYmZkKSAhPSA4KQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgYnVmWzRdOwotCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkJICAgIChoZHItPnNoX29mZnNldAotCQkJICAgICArIChsIC0gY29udGVudHMpCi0JCQkgICAgICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKLQkJCSAgICAgKyAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSAtIDQpKSwKLQkJCSAgICAgU0VFS19TRVQpID09IC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBlbGZfZ3AgKGFiZmQpLCBidWYpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICB9Ci0KLSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24pOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCSAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwCi0JICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLQl7Ci0JICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQyB8IFNIRl9NSVBTX0dQUkVMOwotCSAgaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5jb21wYWN0X3JlbCIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyA9IDA7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJ0cHJvYyIpID09IDApCi0JewotCSAgaWYgKGhkci0+c2hfYWRkcmFsaWduICE9IDAgJiYgaGRyLT5zaF9lbnRzaXplID09IDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWRqdXN0OwotCi0JICAgICAgYWRqdXN0ID0gaGRyLT5zaF9zaXplICUgaGRyLT5zaF9hZGRyYWxpZ247Ci0JICAgICAgaWYgKGFkanVzdCAhPSAwKQotCQloZHItPnNoX3NpemUgKz0gaGRyLT5zaF9hZGRyYWxpZ24gLSBhZGp1c3Q7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBNSVBTIEVMRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXIgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQKLSAgIHRvZ2V0aGVyLCBhbmQgdGhlbiByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcG9pbnRlciwgd2hpY2ggeWllbGRzCi0gICBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uCi0gICBzZWN0aW9uLiAgVGhpcyBhcHByb2FjaCBpcyBjb3BpZWQgZnJvbSBlY29mZi5jLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtaXBzX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBtaXBzX2VsZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptaXBzX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIE1JUFMgRUxGIGFsc28gdXNlcyBhbiBhY29tbW9uIHNlY3Rpb24sIHdoaWNoIHJlcHJlc2VudHMgYW4KLSAgIGFsbG9jYXRlZCBjb21tb24gc3ltYm9sIHdoaWNoIG1heSBiZSBvdmVycmlkZGVuIGJ5IGEKLSAgIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeS4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCi0vKiBUaGUgSXJpeCA1IHN1cHBvcnQgdXNlcyB0d28gdmlydHVhbCBzZWN0aW9ucywgd2hpY2ggcmVwcmVzZW50Ci0gICB0ZXh0L2RhdGEgc3ltYm9scyBkZWZpbmVkIGluIGR5bmFtaWMgb2JqZWN0cy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfdGV4dF9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyOwotCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfZGF0YV9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTUlQUyBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLgotICAgVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotdm9pZAotX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0gIHN3aXRjaCAoZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9NSVBTX0FDT01NT046Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlIGZpbGUuCi0JIEl0IGlzIGFuIGFsbG9jYXRlZCBjb21tb24gc2VjdGlvbi4gIFRoZSBkeW5hbWljIGxpbmtlciBjYW4KLQkgZWl0aGVyIHJlc29sdmUgdGhlc2Ugc3ltYm9scyB0byBzb21ldGhpbmcgaW4gYSBzaGFyZWQKLQkgbGlicmFyeSwgb3IgaXQgY2FuIGp1c3QgbGVhdmUgdGhlbSBoZXJlLiAgRm9yIG91ciBwdXJwb3NlcywKLQkgd2UgY2FuIGNvbnNpZGVyIHRoZXNlIHN5bWJvbHMgdG8gYmUgaW4gYSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBhY29tbW9uIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPSAiLmFjb21tb24iOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0FMTE9DOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2wubmFtZSA9ICIuYWNvbW1vbiI7Ci0JICBtaXBzX2VsZl9hY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMgb24gSVJJWDUuICAqLwotICAgICAgaWYgKGFzeW0tPnZhbHVlID4gZWxmX2dwX3NpemUgKGFiZmQpCi0JICB8fCBJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2KQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIFNITl9NSVBTX1NDT01NT046Ci0gICAgICBpZiAobWlwc19lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2wubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19TVU5ERUZJTkVEOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotI2lmIDAgLyogZm9yIFNHSV9DT01QQVQgKi8KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19EQVRBOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0KLX0KLQwKLS8qIFdoZW4gY3JlYXRpbmcgYW4gSXJpeCA1IGV4ZWN1dGFibGUsIHdlIG5lZWQgUkVHSU5GTyBhbmQgUlRQUk9DCi0gICBzZWdtZW50cy4gICovCi0KLWludAotX2JmZF9taXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgaW50IHJldCA9IDA7Ci0KLSAgaWYgKCFTR0lfQ09NUEFUIChhYmZkKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZWUgaWYgd2UgbmVlZCBhIFBUX01JUFNfUkVHSU5GTyBzZWdtZW50LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKLSAgaWYgKHMgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpKQotICAgICsrcmV0OwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIGEgUFRfTUlQU19PUFRJT05TIHNlZ21lbnQuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NgotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIAotCQkJCSAgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSkKLSAgICArK3JldDsKLQotICAvKiBTZWUgaWYgd2UgbmVlZCBhIFBUX01JUFNfUlRQUk9DIHNlZ21lbnQuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NQotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpCi0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKSkKLSAgICArK3JldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBNb2RpZnkgdGhlIHNlZ21lbnQgbWFwIGZvciBhbiBJcml4IDUgZXhlY3V0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOwotCi0gIGlmICghIFNHSV9DT01QQVQgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgLnJlZ2luZm8gc2VjdGlvbiwgd2UgbmVlZCBhIFBUX01JUFNfUkVHSU5GTwotICAgICBzZWdtZW50LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQlpZiAobS0+cF90eXBlID09IFBUX01JUFNfUkVHSU5GTykKLQkgIGJyZWFrOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQl7Ci0JICBtID0gKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICptKTsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgbS0+cF90eXBlID0gUFRfTUlQU19SRUdJTkZPOwotCSAgbS0+Y291bnQgPSAxOwotCSAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCi0JICAvKiBXZSB3YW50IHRvIHB1dCBpdCBhZnRlciB0aGUgUEhEUiBhbmQgSU5URVJQIHNlZ21lbnRzLiAgKi8KLQkgIHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOwotCSAgd2hpbGUgKCpwbSAhPSBOVUxMCi0JCSAmJiAoKCpwbSktPnBfdHlwZSA9PSBQVF9QSERSCi0JCSAgICAgfHwgKCpwbSktPnBfdHlwZSA9PSBQVF9JTlRFUlApKQotCSAgICBwbSA9ICYoKnBtKS0+bmV4dDsKLQotCSAgbS0+bmV4dCA9ICpwbTsKLQkgICpwbSA9IG07Ci0JfQotICAgIH0KLQotICAvKiBGb3IgSVJJWCA2LCB3ZSBkb24ndCBoYXZlIC5tZGVidWcgc2VjdGlvbnMsIG5vciBkb2VzIGFueXRoaW5nIGJ1dAotICAgICAuZHluYW1pYyBlbmQgdXAgaW4gUFRfRFlOQU1JQy4gIEhvd2V2ZXIsIHdlIGRvIGhhdmUgdG8gaW5zZXJ0IGEKLSAgICAgUFRfT1BUSU9OUyBzZWdlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHByb2dyYW0gaGVhZGVyCi0gICAgIHRhYmxlLiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQlpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUykKLQkgIGJyZWFrOwotCi0gICAgICBpZiAocykKLQl7Ci0JICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICpvcHRpb25zX3NlZ21lbnQ7Ci0KLQkgIC8qIFVzdWFsbHksIHRoZXJlJ3MgYSBwcm9ncmFtIGhlYWRlciB0YWJsZS4gIEJ1dCwgc29tZXRpbWVzCi0JICAgICB0aGVyZSdzIG5vdCAobGlrZSB3aGVuIHJ1bm5pbmcgdGhlIGBsZCcgdGVzdHN1aXRlKS4gIFNvLAotCSAgICAgaWYgdGhlcmUncyBubyBwcm9ncmFtIGhlYWRlciB0YWJsZSwgd2UganVzdCBwdXQgdGhlCi0JICAgICBvcHRpb25zIHNlZ2VtZW50IGF0IHRoZSBlbmQuICAqLwotCSAgZm9yIChwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgCi0JICAgICAgICpwbSAhPSBOVUxMOwotCSAgICAgICBwbSA9ICYoKnBtKS0+bmV4dCkKLQkgICAgaWYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfUEhEUikKLQkgICAgICBicmVhazsKLQotCSAgb3B0aW9uc19zZWdtZW50ID0gYmZkX3phbGxvYyAoYWJmZCwgCi0JCQkJCXNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpOwotCSAgb3B0aW9uc19zZWdtZW50LT5uZXh0ID0gKnBtOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX3R5cGUgPSBQVF9NSVBTX09QVElPTlM7Ci0JICBvcHRpb25zX3NlZ21lbnQtPnBfZmxhZ3MgPSBQRl9SOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX2ZsYWdzX3ZhbGlkID0gdHJ1ZTsKLQkgIG9wdGlvbnNfc2VnbWVudC0+Y291bnQgPSAxOwotCSAgb3B0aW9uc19zZWdtZW50LT5zZWN0aW9uc1swXSA9IHM7Ci0JICAqcG0gPSBvcHRpb25zX3NlZ21lbnQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGFyZSAuZHluYW1pYyBhbmQgLm1kZWJ1ZyBzZWN0aW9ucywgd2UgbWFrZSBhIHJvb20KLQkgZm9yIHRoZSBSVFBST0MgaGVhZGVyLiAgRklYTUU6IFJld3JpdGUgd2l0aG91dCBzZWN0aW9uIG5hbWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKSA9PSBOVUxMCi0JICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikgIT0gTlVMTAotCSAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIikgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQkgICAgaWYgKG0tPnBfdHlwZSA9PSBQVF9NSVBTX1JUUFJPQykKLQkgICAgICBicmVhazsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtID0gKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICptKTsKLQkgICAgICBpZiAobSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBtLT5wX3R5cGUgPSBQVF9NSVBTX1JUUFJPQzsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQl7Ci0JCSAgbS0+Y291bnQgPSAwOwotCQkgIG0tPnBfZmxhZ3MgPSAwOwotCQkgIG0tPnBfZmxhZ3NfdmFsaWQgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbS0+Y291bnQgPSAxOwotCQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQkJfQotCi0JICAgICAgLyogV2Ugd2FudCB0byBwdXQgaXQgYWZ0ZXIgdGhlIERZTkFNSUMgc2VnbWVudC4gICovCi0JICAgICAgcG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7Ci0JICAgICAgd2hpbGUgKCpwbSAhPSBOVUxMICYmICgqcG0pLT5wX3R5cGUgIT0gUFRfRFlOQU1JQykKLQkJcG0gPSAmKCpwbSktPm5leHQ7Ci0JICAgICAgaWYgKCpwbSAhPSBOVUxMKQotCQlwbSA9ICYoKnBtKS0+bmV4dDsKLQotCSAgICAgIG0tPm5leHQgPSAqcG07Ci0JICAgICAgKnBtID0gbTsKLQkgICAgfQotCX0KLQotICAgICAgLyogT24gSXJpeCA1LCB0aGUgUFRfRFlOQU1JQyBzZWdtZW50IGluY2x1ZGVzIHRoZSAuZHluYW1pYywKLQkgLmR5bnN0ciwgLmR5bnN5bSwgYW5kIC5oYXNoIHNlY3Rpb25zLCBhbmQgZXZlcnl0aGluZyBpbgotCSBiZXR3ZWVuLiAgKi8KLSAgICAgIGZvciAocG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7ICpwbSAhPSBOVUxMOyBwbSA9ICYoKnBtKS0+bmV4dCkKLQlpZiAoKCpwbSktPnBfdHlwZSA9PSBQVF9EWU5BTUlDKQotCSAgYnJlYWs7Ci0gICAgICBtID0gKnBtOwotICAgICAgaWYgKG0gIT0gTlVMTAotCSAgJiYgbS0+Y291bnQgPT0gMQotCSAgJiYgc3RyY21wIChtLT5zZWN0aW9uc1swXS0+bmFtZSwgIi5keW5hbWljIikgPT0gMCkKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciAqc2VjX25hbWVzW10gPQotCSAgeyAiLmR5bmFtaWMiLCAiLmR5bnN0ciIsICIuZHluc3ltIiwgIi5oYXNoIiB9OwotCSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0JICB1bnNpZ25lZCBpbnQgaSwgYzsKLQkgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm47Ci0KLQkgIGxvdyA9IDB4ZmZmZmZmZmY7Ci0JICBoaWdoID0gMDsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Ygc2VjX25hbWVzIC8gc2l6ZW9mIHNlY19uYW1lc1swXTsgaSsrKQotCSAgICB7Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzZWNfbmFtZXNbaV0pOwotCSAgICAgIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIHN6OwotCi0JCSAgaWYgKGxvdyA+IHMtPnZtYSkKLQkJICAgIGxvdyA9IHMtPnZtYTsKLQkJICBzeiA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBpZiAoc3ogPT0gMCkKLQkJICAgIHN6ID0gcy0+X3Jhd19zaXplOwotCQkgIGlmIChoaWdoIDwgcy0+dm1hICsgc3opCi0JCSAgICBoaWdoID0gcy0+dm1hICsgc3o7Ci0JCX0KLQkgICAgfQotCi0JICBjID0gMDsKLQkgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkJJiYgcy0+dm1hID49IGxvdwotCQkmJiAoKHMtPnZtYQotCQkgICAgICsgKHMtPl9jb29rZWRfc2l6ZSAhPSAwID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKSkKLQkJICAgIDw9IGhpZ2gpKQotCSAgICAgICsrYzsKLQotCSAgbiA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKm4gKyAoYyAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKm4gPSAqbTsKLQkgIG4tPmNvdW50ID0gYzsKLQotCSAgaSA9IDA7Ci0JICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCQkgICYmIHMtPnZtYSA+PSBsb3cKLQkJICAmJiAoKHMtPnZtYQotCQkgICAgICAgKyAocy0+X2Nvb2tlZF9zaXplICE9IDAgPwotCQkJICBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpKQotCQkgICAgICA8PSBoaWdoKSkKLQkJewotCQkgIG4tPnNlY3Rpb25zW2ldID0gczsKLQkJICArK2k7Ci0JCX0KLQkgICAgfQotCi0JICAqcG0gPSBuOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBydW50aW1lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgdGhlCi0gICBsb2FkZXIgZm9yIHVzZSBieSB0aGUgc3RhdGljIGV4Y2VwdGlvbiBzeXN0ZW0uICAqLwotCi10eXBlZGVmIHN0cnVjdCBydW50aW1lX3BkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJlZ21hc2s7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJZnJlZ29mZnNldDsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyYW1lb2Zmc2V0OwkvKiBmcmFtZSBzaXplICovCi0Jc2hvcnQJZnJhbWVyZWc7CS8qIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgKi8KLQlzaG9ydAlwY3JlZzsJCS8qIG9mZnNldCBvciByZWcgb2YgcmV0dXJuIHBjICovCi0JbG9uZwlpcnBzczsJCS8qIGluZGV4IGludG8gdGhlIHJ1bnRpbWUgc3RyaW5nIHRhYmxlICovCi0JbG9uZwlyZXNlcnZlZDsKLQlzdHJ1Y3QgZXhjZXB0aW9uX2luZm8gKmV4Y2VwdGlvbl9pbmZvOy8qIHBvaW50ZXIgdG8gZXhjZXB0aW9uIGFycmF5ICovCi19IFJQRFIsICpwUlBEUjsKLSNkZWZpbmUgY2JSUERSIHNpemVvZihSUERSKQotI2RlZmluZSBycGROaWwgKChwUlBEUikgMCkKLQotLyogU3dhcCBSUERSIChydW50aW1lIHByb2NlZHVyZSB0YWJsZSBlbnRyeSkgZm9yIG91dHB1dC4gICovCi0KLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcnBkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IFJQRFIgKiwgc3RydWN0IHJwZHJfZXh0ICopKTsKLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcnBkcl9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBSUERSICppbjsKLSAgICAgc3RydWN0IHJwZHJfZXh0ICpleDsKLXsKLSAgLyogZWNvZmZfcHV0X29mZiB3YXMgZGVmaW5lZCBpbiBlY29mZnN3YXAuaC4gICovCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGluLT5hZHIsIChiZmRfYnl0ZSAqKSBleC0+cF9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5yZWdtYXNrLCAoYmZkX2J5dGUgKikgZXgtPnBfcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopIGV4LT5wX3JlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKikgZXgtPnBfZnJlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5mcmVnb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfZnJlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfZnJhbWVvZmZzZXQpOwotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPmZyYW1lcmVnLCAoYmZkX2J5dGUgKikgZXgtPnBfZnJhbWVyZWcpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT5wY3JlZywgKGJmZF9ieXRlICopIGV4LT5wX3BjcmVnKTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5pcnBzcywgKGJmZF9ieXRlICopIGV4LT5wX2lycHNzKTsKLSNpZiAwIC8qIEZJWE1FICovCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGluLT5leGNlcHRpb25faW5mbywgKGJmZF9ieXRlICopIGV4LT5wX2V4Y2VwdGlvbl9pbmZvKTsKLSNlbmRpZgotfQotDAotLyogUmVhZCBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIC5tZGVidWcgc2VjdGlvbiBpbnRvIGEKLSAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIHNlY3Rpb24sIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci17Ci0gIEhEUlIgKnN5bWhkcjsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIGNoYXIgKmV4dF9oZHIgPSBOVUxMOwotCi0gIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIG1lbXNldCAoZGVidWcsIDAsIHNpemVvZigqZGVidWcpKTsKLQotICBleHRfaGRyID0gKGNoYXIgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpOwotICBpZiAoZXh0X2hkciA9PSBOVUxMICYmIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgZXh0X2hkciwgKGZpbGVfcHRyKSAwLAotCQkJCXN3YXAtPmV4dGVybmFsX2hkcl9zaXplKQotICAgICAgPT0gZmFsc2UpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gICgqc3dhcC0+c3dhcF9oZHJfaW4pIChhYmZkLCBleHRfaGRyLCBzeW1oZHIpOwotCi0gIC8qIFRoZSBzeW1ib2xpYyBoZWFkZXIgY29udGFpbnMgYWJzb2x1dGUgZmlsZSBvZmZzZXRzIGFuZCBzaXplcyB0bwotICAgICByZWFkLiAgKi8KLSNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCi0gICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAotICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIHN5bWhkci0+b2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAlcCi0JICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCi0JCQlhYmZkKSAhPSBzaXplICogc3ltaGRyLT5jb3VudCkpCQkJXAotCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKLSAgICB9Ci0KLSAgUkVBRCAobGluZSwgY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksIHVuc2lnbmVkIGNoYXIgKik7Ci0gIFJFQUQgKGV4dGVybmFsX2RuciwgY2JEbk9mZnNldCwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfb3B0LCBjYk9wdE9mZnNldCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JdW5pb24gYXV4X2V4dCAqKTsKLSAgUkVBRCAoc3MsIGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKLSAgUkVBRCAoc3NleHQsIGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZXh0LCBjYkV4dE9mZnNldCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsIFBUUik7Ci0jdW5kZWYgUkVBRAotCi0gIGRlYnVnLT5mZHIgPSBOVUxMOwotICBkZWJ1Zy0+YWRqdXN0ID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGV4dF9oZHIgIT0gTlVMTCkKLSAgICBmcmVlIChleHRfaGRyKTsKLSAgaWYgKGRlYnVnLT5saW5lICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmxpbmUpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2RuciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9kbnIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3N5bSAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9zeW0pOwotICBpZiAoZGVidWctPmV4dGVybmFsX29wdCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9vcHQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOwotICBpZiAoZGVidWctPnNzICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzKTsKLSAgaWYgKGRlYnVnLT5zc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5zc2V4dCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Zkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3JmZCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIE1JUFMgRUxGIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICckJywgbm90ICdMJy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJyQnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE9uIElyaXggNiwgdGhlIGxhYmVscyBnbyBiYWNrIHRvIHN0YXJ0aW5nIHdpdGggJy4nLCBzbyB3ZSBhY2NlcHQKLSAgICAgdGhlIGdlbmVyaWMgRUxGIGxvY2FsIGxhYmVsIHN5bnRheCBhcyB3ZWxsLiAgKi8KLSAgcmV0dXJuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0vKiBNSVBTIEVMRiB1c2VzIGEgc3BlY2lhbCBmaW5kX25lYXJlc3RfbGluZSByb3V0aW5lIGluIG9yZGVyIHRoZQotICAgaGFuZGxlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lCi17Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGQ7Ci0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgaTsKLX07Ci0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJCSBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYXNlY3Rpb24gKm1zZWM7Ci0KLSAgaWYgKF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0ciwgCi0JCQkJICAgICBBQklfNjRfUCAoYWJmZCkgPyA4IDogMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpOwotICBpZiAobXNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIG9yaWdmbGFnczsKLSAgICAgIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpOwotICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBzd2FwID0KLQlnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgZHVyaW5nIGEgbGluaywgbWlwc19lbGZfZmluYWxfbGluayBtYXkgaGF2ZQotCSBjbGVhcmVkIHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZpZWxkLiAgV2UgZm9yY2UgaXQgYmFjayBvbiBoZXJlCi0JIGlmIGFwcHJvcHJpYXRlICh3aGljaCBpdCBub3JtYWxseSB3aWxsIGJlKS4gICovCi0gICAgICBvcmlnZmxhZ3MgPSBtc2VjLT5mbGFnczsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChtc2VjKS0+dGhpc19oZHIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCW1zZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIGZpID0gZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0gICAgICBpZiAoZmkgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotCSAgY2hhciAqZnJhd19zcmM7Ci0JICBjaGFyICpmcmF3X2VuZDsKLQkgIHN0cnVjdCBmZHIgKmZkcl9wdHI7Ci0KLQkgIGZpID0gKChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSkpKTsKLQkgIGlmIChmaSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBtc2VjLCAmZmktPmQpKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFN3YXAgaW4gdGhlIEZEUiBpbmZvcm1hdGlvbi4gICovCi0JICBmaS0+ZC5mZHIgPSAoKHN0cnVjdCBmZHIgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgIChmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICoKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBmZHIpKSkpOwotCSAgaWYgKGZpLT5kLmZkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBleHRlcm5hbF9mZHJfc2l6ZSA9IHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotCSAgZmRyX3B0ciA9IGZpLT5kLmZkcjsKLQkgIGZyYXdfc3JjID0gKGNoYXIgKikgZmktPmQuZXh0ZXJuYWxfZmRyOwotCSAgZnJhd19lbmQgPSAoZnJhd19zcmMKLQkJICAgICAgKyBmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemUpOwotCSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0JICAgICgqc3dhcC0+c3dhcF9mZHJfaW4pIChhYmZkLCAoUFRSKSBmcmF3X3NyYywgZmRyX3B0cik7Ci0KLQkgIGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID0gZmk7Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gZXZlciBmcmVlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgZmluZF9uZWFyZXN0X2xpbmUgaXMgZWl0aGVyIGNhbGxlZCBhbGwgdGhlIHRpbWUsIGFzIGluCi0gICAgICAgICAgICAgb2JqZHVtcCAtbCwgc28gdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBzYXZlZCwgb3IgaXQgaXMKLSAgICAgICAgICAgICByYXJlbHkgY2FsbGVkLCBhcyBpbiBsZCBlcnJvciBtZXNzYWdlcywgc28gdGhlIG1lbW9yeQotICAgICAgICAgICAgIHdhc3RlZCBpcyB1bmltcG9ydGFudC4gIFN0aWxsLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBhCi0gICAgICAgICAgICAgZ29vZCBpZGVhIGZvciBmcmVlX2NhY2hlZF9pbmZvIHRvIHRocm93IGl0IGF3YXkuICAqLwotCX0KLQotICAgICAgaWYgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgJmZpLT5kLCBzd2FwLAotCQkJCSAgJmZpLT5pLCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICBsaW5lX3B0cikpCi0JewotCSAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotICAgIH0KLQotICAvKiBGYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUuICAqLwotCi0gIHJldHVybiBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIpOwotfQotDAotICAvKiBUaGUgbWlwczE2IGNvbXBpbGVyIHVzZXMgYSBjb3VwbGUgb2Ygc3BlY2lhbCBzZWN0aW9ucyB0byBoYW5kbGUKLSAgICAgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzLgotCi0gICAgIFNlY3Rpb24gbmFtZXMgdGhhdCBsb29rIGxpa2UgLm1pcHMxNi5mbi5GTk5BTUUgY29udGFpbiBzdHVicyB0aGF0Ci0gICAgIGNvcHkgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGZyb20gdGhlIGZwIHJlZ3MgdG8gdGhlIGdwIHJlZ3MgYW5kCi0gICAgIHRoZW4ganVtcCB0byBGTk5BTUUuICBJZiBhbnkgMzIgYml0IGZ1bmN0aW9uIGNhbGxzIEZOTkFNRSwgdGhlCi0gICAgIGNhbGwgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIHN0dWIgaW5zdGVhZC4gIElmIG5vIDMyIGJpdAotICAgICBmdW5jdGlvbiBjYWxscyBGTk5BTUUsIHRoZSBzdHViIHNob3VsZCBiZSBkaXNjYXJkZWQuICBXZSBuZWVkIHRvCi0gICAgIGNvbnNpZGVyIGFueSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uLCBub3QganVzdCBhIGNhbGwsIGJlY2F1c2UKLSAgICAgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGlzIHRha2VuIHdlIHdpbGwgbmVlZCB0aGUgc3R1YiwKLSAgICAgc2luY2UgdGhlIGFkZHJlc3MgbWlnaHQgYmUgcGFzc2VkIHRvIGEgMzIgYml0IGZ1bmN0aW9uLgotCi0gICAgIFNlY3Rpb24gbmFtZXMgdGhhdCBsb29rIGxpa2UgLm1pcHMxNi5jYWxsLkZOTkFNRSBjb250YWluIHN0dWJzCi0gICAgIHRoYXQgY29weSBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgZnJvbSB0aGUgZ3AgcmVncyB0byB0aGUgZnAKLSAgICAgcmVncyBhbmQgdGhlbiBqdW1wIHRvIEZOTkFNRS4gIElmIEZOTkFNRSBpcyBhIDMyIGJpdCBmdW5jdGlvbiwKLSAgICAgdGhlbiBhbnkgMTYgYml0IGZ1bmN0aW9uIHRoYXQgY2FsbHMgRk5OQU1FIHNob3VsZCBiZSByZWRpcmVjdGVkCi0gICAgIHRvIHRoZSBzdHViIGluc3RlYWQuICBJZiBGTk5BTUUgaXMgbm90IGEgMzIgYml0IGZ1bmN0aW9uLCB0aGUKLSAgICAgc3R1YiBzaG91bGQgYmUgZGlzY2FyZGVkLgotCi0gICAgIC5taXBzMTYuY2FsbC5mcC5GTk5BTUUgc2VjdGlvbnMgYXJlIHNpbWlsYXIsIGJ1dCBjb250YWluIHN0dWJzCi0gICAgIHdoaWNoIGNhbGwgRk5OQU1FIGFuZCB0aGVuIGNvcHkgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBmcCByZWdzCi0gICAgIHRvIHRoZSBncCByZWdzLiAgVGhlc2Ugc3R1YnMgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSBpbiAkMTggd2hpbGUKLSAgICAgY2FsbGluZyBGTk5BTUU7IGFueSBmdW5jdGlvbiB3aGljaCBtaWdodCBjYWxsIG9uZSBvZiB0aGVzZSBzdHVicwotICAgICBtdXN0IGFycmFuZ2UgdG8gc2F2ZSAkMTggYXJvdW5kIHRoZSBjYWxsLiAgKFRoaXMgY2FzZSBpcyBub3QKLSAgICAgbmVlZGVkIGZvciAzMiBiaXQgZnVuY3Rpb25zIHRoYXQgY2FsbCAxNiBiaXQgZnVuY3Rpb25zLCBiZWNhdXNlCi0gICAgIDE2IGJpdCBmdW5jdGlvbnMgYWx3YXlzIHJldHVybiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gYm90aAotICAgICAkZjAvJGYxIGFuZCAkMi8kMy4pCi0KLSAgICAgTm90ZSB0aGF0IGluIGFsbCBjYXNlcyBGTk5BTUUgbWlnaHQgYmUgZGVmaW5lZCBzdGF0aWNhbGx5LgotICAgICBUaGVyZWZvcmUsIEZOTkFNRSBpcyBub3QgdXNlZCBsaXRlcmFsbHkuICBJbnN0ZWFkLCB0aGUgcmVsb2NhdGlvbgotICAgICBpbmZvcm1hdGlvbiB3aWxsIGluZGljYXRlIHdoaWNoIHN5bWJvbCB0aGUgc2VjdGlvbiBpcyBmb3IuCi0KLSAgICAgV2UgcmVjb3JkIGFueSBzdHVicyB0aGF0IHdlIGZpbmQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLSNkZWZpbmUgRk5fU1RVQiAiLm1pcHMxNi5mbi4iCi0jZGVmaW5lIENBTExfU1RVQiAiLm1pcHMxNi5jYWxsLiIKLSNkZWZpbmUgQ0FMTF9GUF9TVFVCICIubWlwczE2LmNhbGwuZnAuIgotCi0vKiBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSNpZiAwCi0gIC8qIFdlIG5vIGxvbmdlciB1c2UgdGhpcy4gICovCi0gIC8qIFN0cmluZyBzZWN0aW9uIGluZGljZXMgZm9yIHRoZSBkeW5hbWljIHNlY3Rpb24gc3ltYm9scy4gICovCi0gIGJmZF9zaXplX3R5cGUgZHluc3ltX3NlY19zdHJpbmRleFtTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVNdOwotI2VuZGlmCi0gIC8qIFRoZSBudW1iZXIgb2YgLnJ0cHJvYyBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBwcm9jZWR1cmVfY291bnQ7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSAuY29tcGFjdF9yZWwgc2VjdGlvbiAoaWYgU0dJX0NPTVBBVCkuICAqLwotICBiZmRfc2l6ZV90eXBlIGNvbXBhY3RfcmVsX3NpemU7Ci0gIC8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgRFRfTUlQU19STERfTUFQIGR5bmFtaWMKLSAgICAgZW50cnkgaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIF9fcmxkX29ial9oZWFkIGFzIGluIElyaXggNS4gKi8KLSAgYm9vbGVhbiB1c2VfcmxkX29ial9oZWFkOwotICAvKiBUaGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgX19ybGRfbWFwIG9yIF9fcmxkX29ial9oZWFkIHN5bWJvbC4gICovCi0gIGJmZF92bWEgcmxkX3ZhbHVlOwotICAvKiBUaGlzIGlzIHNldCBpZiB3ZSBzZWUgYW55IG1pcHMxNiBzdHViIHNlY3Rpb25zLiAqLwotICBib29sZWFuIG1pcHMxNl9zdHVic19zZWVuOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9vdXRwdXRfZXh0c3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1taXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIG1lbXNldCAoJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIChFWFRSKSk7Ci0gICAgICAvKiBXZSB1c2UgLTIgYXMgYSBtYXJrZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5mb3JtYXRpb24gaGFzCi0JIG5vdCBiZWVuIHNldC4gIC0xIG1lYW5zIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgaWZkLiAgKi8KLSAgICAgIHJldC0+ZXN5bS5pZmQgPSAtMjsKLSAgICAgIHJldC0+cG9zc2libHlfZHluYW1pY19yZWxvY3MgPSAwOwotICAgICAgcmV0LT5taW5fZHluX3JlbG9jX2luZGV4ID0gMDsKLSAgICAgIHJldC0+Zm5fc3R1YiA9IE5VTEw7Ci0gICAgICByZXQtPm5lZWRfZm5fc3R1YiA9IGZhbHNlOwotICAgICAgcmV0LT5jYWxsX3N0dWIgPSBOVUxMOwotICAgICAgcmV0LT5jYWxsX2ZwX3N0dWIgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgbWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWYgMAotICAvKiBXZSBubyBsb25nZXIgdXNlIHRoaXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTOyBpKyspCi0gICAgcmV0LT5keW5zeW1fc2VjX3N0cmluZGV4W2ldID0gKGJmZF9zaXplX3R5cGUpIC0xOwotI2VuZGlmCi0gIHJldC0+cHJvY2VkdXJlX2NvdW50ID0gMDsKLSAgcmV0LT5jb21wYWN0X3JlbF9zaXplID0gMDsKLSAgcmV0LT51c2VfcmxkX29ial9oZWFkID0gZmFsc2U7Ci0gIHJldC0+cmxkX3ZhbHVlID0gMDsKLSAgcmV0LT5taXBzMTZfc3R1YnNfc2VlbiA9IGZhbHNlOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSBtdXN0IGhhbmRsZSB0aGUgc3BlY2lhbCBNSVBTIHNlY3Rpb24gbnVtYmVycyBoZXJlLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChTR0lfQ09NUEFUIChhYmZkKQotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgc3RyY21wICgqbmFtZXAsICJfcmxkX25ld19pbnRlcmZhY2UiKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFNraXAgSXJpeCA1IHJsZCBlbnRyeSBuYW1lLiAgKi8KLSAgICAgICpuYW1lcCA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3dpdGNoIChzeW0tPnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMuICAqLwotICAgICAgaWYgKHN5bS0+c3Rfc2l6ZSA+IGVsZl9ncF9zaXplIChhYmZkKQotCSAgfHwgSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NikKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBTSE5fTUlQU19TQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgaWYgKG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzZWN0aW9uLiAgKi8KLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5uYW1lID0gIi50ZXh0IjsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9IE5VTEw7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sX3B0cjsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLm5hbWUgPSAiLnRleHQiOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfRFlOQU1JQzsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3NlY3Rpb247Ci0JfQotICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gZG8gKnNlY3AgPSBiZmRfdW5kX3NlY3Rpb25fcHRyIGlmCi0gICAgICAgICBpbmZvLT5zaGFyZWQuICBJIGRvbid0IGtub3cgd2h5LCBhbmQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UsCi0gICAgICAgICBzbyBJIHRvb2sgaXQgb3V0LiAgKi8KLSAgICAgICpzZWNwID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19BQ09NTU9OOgotICAgICAgLyogRmFsbCB0aHJvdWdoLiBYWFggQ2FuIHdlIHRyZWF0IHRoaXMgYXMgYWxsb2NhdGVkIGRhdGE/ICAqLwotICAgIGNhc2UgU0hOX01JUFNfREFUQToKLSAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0gICAgICBpZiAobWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0ciA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLm5hbWUgPSAiLmRhdGEiOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLmZsYWdzID0gU0VDX05PX0ZMQUdTOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gTlVMTDsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wubmFtZSA9ICIuZGF0YSI7Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTSB8IEJTRl9EWU5BTUlDOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl9kYXRhX3NlY3Rpb247Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyID0gJm1pcHNfZWxmX2RhdGFfc2VjdGlvbjsKLQl9Ci0gICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBkbyAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHIgaWYKLSAgICAgICAgIGluZm8tPnNoYXJlZC4gIEkgZG9uJ3Qga25vdyB3aHksIGFuZCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSwKLSAgICAgICAgIHNvIEkgdG9vayBpdCBvdXQuICAqLwotICAgICAgKnNlY3AgPSBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1NVTkRFRklORUQ6Ci0gICAgICAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0gICAgICAmJiAhIGluZm8tPnNoYXJlZAotICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCi0gICAgICAmJiBzdHJjbXAgKCpuYW1lcCwgIl9fcmxkX29ial9oZWFkIikgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogTWFyayBfX3JsZF9vYmpfaGVhZCBhcyBkeW5hbWljLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgYWJmZCwgKm5hbWVwLCBCU0ZfR0xPQkFMLCAqc2VjcCwKLQkgICAgICAoYmZkX3ZtYSkgKnZhbHAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbWlwczE2IHRleHQgc3ltYm9sLCBhZGQgMSB0byB0aGUgdmFsdWUgdG8gbWFrZSBpdAotICAgICBvZGQuICBUaGlzIHdpbGwgY2F1c2Ugc29tZXRoaW5nIGxpa2UgLndvcmQgU1lNIHRvIGNvbWUgdXAgd2l0aAotICAgICB0aGUgcmlnaHQgdmFsdWUgd2hlbiBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMuICAqLwotICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KQotICAgICsrKnZhbHA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gbWlwc19lbGZfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHdyaXRlIG91dCBFQ09GRiBkZWJ1Z2dpbmcgZXh0ZXJuYWwgc3ltYm9sCi0gICBpbmZvcm1hdGlvbi4gIEl0IGlzIGNhbGxlZCB2aWEgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgVGhlCi0gICBFQ09GRiBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gbXVzdCBtYXRjaCB0aGUgRUxGIGV4dGVybmFsCi0gICBzeW1ib2wgaW5mb3JtYXRpb24uICBVbmZvcnR1bmF0ZWx5LCBhdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cKLSAgIHdoZXRoZXIgYSBzeW1ib2wgaXMgcmVxdWlyZWQgYnkgcmVsb2MgaW5mb3JtYXRpb24sIHNvIHRoZSB0d28KLSAgIHRhYmxlcyBtYXkgd2luZCB1cCBiZWluZyBkaWZmZXJlbnQuICBXZSBtdXN0IHNvcnQgb3V0IHRoZSBleHRlcm5hbAotICAgc3ltYm9sIGluZm9ybWF0aW9uIGJlZm9yZSB3ZSBjYW4gc2V0IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAubWRlYnVnCi0gICBzZWN0aW9uLCBhbmQgd2UgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlIC5tZGVidWcgc2VjdGlvbiBiZWZvcmUgd2UKLSAgIGNhbiByZWxvY2F0ZSBhbnkgc2VjdGlvbnMsIGFuZCB3ZSBjYW4ndCBrbm93IHdoaWNoIHN5bWJvbHMgYXJlCi0gICByZXF1aXJlZCBieSByZWxvY2F0aW9uIHVudGlsIHdlIHJlbG9jYXRlIHRoZSBzZWN0aW9ucy4KLSAgIEZvcnR1bmF0ZWx5LCBpdCBpcyByZWxhdGl2ZWx5IHVubGlrZWx5IHRoYXQgYW55IHN5bWJvbCB3aWxsIGJlCi0gICBzdHJpcHBlZCBidXQgcmVxdWlyZWQgYnkgYSByZWxvYy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBub3QgaGFwcGVuCi0gICB3aGVuIGdlbmVyYXRpbmcgYSBmaW5hbCBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBib29sZWFuIHN0cmlwOwotICBhc2VjdGlvbiAqc2VjLCAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgaWYgKGgtPnJvb3QuaW5keCA9PSAtMikKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgfHwgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCi0JICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UgaWYgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgICB8fCAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChlaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5lc3ltLmlmZCA9PSAtMikKLSAgICB7Ci0gICAgICBoLT5lc3ltLmptcHRibCA9IDA7Ci0gICAgICBoLT5lc3ltLmNvYm9sX21haW4gPSAwOwotICAgICAgaC0+ZXN5bS53ZWFrZXh0ID0gMDsKLSAgICAgIGgtPmVzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5pZmQgPSBpZmROaWw7Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RHbG9iYWw7Ci0KLSAgICAgIGlmIChTR0lfQ09NUEFUIChlaW5mby0+YWJmZCkKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAvKiBVc2UgdW5kZWZpbmVkIGNsYXNzLiAgQWxzbywgc2V0IGNsYXNzIGFuZCB0eXBlIGZvciBzb21lCi0gICAgICAgICAgICAgc3BlY2lhbCBzeW1ib2xzLiAgKi8KLQkgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzFdKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzJdKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPQotCQltaXBzX2VsZl9oYXNoX3RhYmxlIChlaW5mby0+aW5mbyktPnByb2NlZHVyZV9jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBlbGZfZ3AgKGVpbmZvLT5hYmZkKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgc3ltYm9sIGggaXMgdGhlIG9uZSBmcm9tCi0JICAgICB0aGUgYW5vdGhlciBzaGFyZWQgbGlicmFyeSwgT1VUUFVUX1NFQ1RJT04gbWF5IGJlIG51bGwuICAqLwotCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJvZGF0YSIpID09IDAKLQkJICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotCSAgICAgIGVsc2UKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGgtPmVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICBlbHNlIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIGVsc2UKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNldCB0eXBlIGFuZCB2YWx1ZSBmb3IgYSBzeW1ib2wgd2l0aCBhIGZ1bmN0aW9uIHN0dWIuICAqLwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RQcm9jOwotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QucGx0Lm9mZnNldAotCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0JfQotI2lmIDAgLyogRklYTUU/ICAqLwotICAgICAgaC0+ZXN5bS5pZmQgPSAwOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGVpbmZvLT5hYmZkLCBlaW5mby0+ZGVidWcsIGVpbmZvLT5zd2FwLAotCQkJCSAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCQkgICAgICAmaC0+ZXN5bSkpCi0gICAgewotICAgICAgZWluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBydW50aW1lIHByb2NlZHVyZSB0YWJsZSBmcm9tIHRoZSAubWRlYnVnIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAoaGFuZGxlLCBhYmZkLCBpbmZvLCBzLCBkZWJ1ZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIEhEUlIgKmhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBSUERSICpycGRyLCAqcnA7Ci0gIHN0cnVjdCBycGRyX2V4dCAqZXJwOwotICBQVFIgcnRwcm9jOwotICBzdHJ1Y3QgcGRyX2V4dCAqZXBkcjsKLSAgc3RydWN0IHN5bV9leHQgKmVzeW07Ci0gIGNoYXIgKnNzLCAqKnN2OwotICBjaGFyICpzdHI7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY291bnQ7Ci0gIHVuc2lnbmVkIGxvbmcgc2luZGV4OwotICB1bnNpZ25lZCBsb25nIGk7Ci0gIFBEUiBwZHI7Ci0gIFNZTVIgc3ltOwotICBjb25zdCBjaGFyICpub19uYW1lX2Z1bmMgPSBfKCJzdGF0aWMgcHJvY2VkdXJlIChubyBuYW1lKSIpOwotCi0gIGVwZHIgPSBOVUxMOwotICBycGRyID0gTlVMTDsKLSAgZXN5bSA9IE5VTEw7Ci0gIHNzID0gTlVMTDsKLSAgc3YgPSBOVUxMOwotCi0gIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgc2luZGV4ID0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKLSAgY291bnQgPSBoZHItPmlwZE1heDsKLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBzaXplID0gc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgICAgIGVwZHIgPSAoc3RydWN0IHBkcl9leHQgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKLSAgICAgIGlmIChlcGRyID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciAoaGFuZGxlLCAoUFRSKSBlcGRyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2l6ZSA9IHNpemVvZiAoUlBEUik7Ci0gICAgICBycCA9IHJwZHIgPSAoUlBEUiAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKHJwZHIgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc3YgPSAoY2hhciAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChjaGFyICopICogY291bnQpOwotICAgICAgaWYgKHN2ID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNvdW50ID0gaGRyLT5pc3ltTWF4OwotICAgICAgc2l6ZSA9IHN3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZXN5bSA9IChzdHJ1Y3Qgc3ltX2V4dCAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKGVzeW0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKCEgX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIChoYW5kbGUsIChQVFIpIGVzeW0pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjb3VudCA9IGhkci0+aXNzTWF4OwotICAgICAgc3MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChjb3VudCk7Ci0gICAgICBpZiAoc3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIChoYW5kbGUsIChQVFIpIHNzKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY291bnQgPSBoZHItPmlwZE1heDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBycCsrKQotCXsKLQkgICgqc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSAoZXBkciArIGkpLCAmcGRyKTsKLQkgICgqc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCAoUFRSKSAmZXN5bVtwZHIuaXN5bV0sICZzeW0pOwotCSAgcnAtPmFkciA9IHN5bS52YWx1ZTsKLQkgIHJwLT5yZWdtYXNrID0gcGRyLnJlZ21hc2s7Ci0JICBycC0+cmVnb2Zmc2V0ID0gcGRyLnJlZ29mZnNldDsKLQkgIHJwLT5mcmVnbWFzayA9IHBkci5mcmVnbWFzazsKLQkgIHJwLT5mcmVnb2Zmc2V0ID0gcGRyLmZyZWdvZmZzZXQ7Ci0JICBycC0+ZnJhbWVvZmZzZXQgPSBwZHIuZnJhbWVvZmZzZXQ7Ci0JICBycC0+ZnJhbWVyZWcgPSBwZHIuZnJhbWVyZWc7Ci0JICBycC0+cGNyZWcgPSBwZHIucGNyZWc7Ci0JICBycC0+aXJwc3MgPSBzaW5kZXg7Ci0JICBzdltpXSA9IHNzICsgc3ltLmlzczsKLQkgIHNpbmRleCArPSBzdHJsZW4gKHN2W2ldKSArIDE7Ci0JfQotICAgIH0KLQotICBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMikgKyBzaW5kZXg7Ci0gIHNpemUgPSBCRkRfQUxJR04gKHNpemUsIDE2KTsKLSAgcnRwcm9jID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKHJ0cHJvYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSAwOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSBjb3VudCArIDI7Ci0KLSAgZXJwID0gKHN0cnVjdCBycGRyX2V4dCAqKSBydHByb2M7Ci0gIG1lbXNldCAoZXJwLCAwLCBzaXplb2YgKHN0cnVjdCBycGRyX2V4dCkpOwotICBlcnArKzsKLSAgc3RyID0gKGNoYXIgKikgcnRwcm9jICsgc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMik7Ci0gIHN0cmNweSAoc3RyLCBub19uYW1lX2Z1bmMpOwotICBzdHIgKz0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgZWNvZmZfc3dhcF9ycGRyX291dCAoYWJmZCwgcnBkciArIGksIGVycCArIGkpOwotICAgICAgc3RyY3B5IChzdHIsIHN2W2ldKTsKLSAgICAgIHN0ciArPSBzdHJsZW4gKHN2W2ldKSArIDE7Ci0gICAgfQotICBlY29mZl9wdXRfb2ZmIChhYmZkLCAoYmZkX3ZtYSkgLTEsIChiZmRfYnl0ZSAqKSAoZXJwICsgY291bnQpLT5wX2Fkcik7Ci0KLSAgLyogU2V0IHRoZSBzaXplIGFuZCBjb250ZW50cyBvZiAucnRwcm9jIHNlY3Rpb24uICAqLwotICBzLT5fcmF3X3NpemUgPSBzaXplOwotICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBydHByb2M7Ci0KLSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLSAgcy0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0gIGlmIChlcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZXBkcik7Ci0gIGlmIChycGRyICE9IE5VTEwpCi0gICAgZnJlZSAocnBkcik7Ci0gIGlmIChlc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXN5bSk7Ci0gIGlmIChzcyAhPSBOVUxMKQotICAgIGZyZWUgKHNzKTsKLSAgaWYgKHN2ICE9IE5VTEwpCi0gICAgZnJlZSAoc3YpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXBkciAhPSBOVUxMKQotICAgIGZyZWUgKGVwZHIpOwotICBpZiAocnBkciAhPSBOVUxMKQotICAgIGZyZWUgKHJwZHIpOwotICBpZiAoZXN5bSAhPSBOVUxMKQotICAgIGZyZWUgKGVzeW0pOwotICBpZiAoc3MgIT0gTlVMTCkKLSAgICBmcmVlIChzcyk7Ci0gIGlmIChzdiAhPSBOVUxMKQotICAgIGZyZWUgKHN2KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIGNvbXBhcmlzb24gcm91dGluZSB1c2VkIHRvIHNvcnQgLmdwdGFiIGVudHJpZXMuICAqLwotCi1zdGF0aWMgaW50Ci1ncHRhYl9jb21wYXJlIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBFbGYzMl9ncHRhYiAqYTEgPSAoY29uc3QgRWxmMzJfZ3B0YWIgKikgcDE7Ci0gIGNvbnN0IEVsZjMyX2dwdGFiICphMiA9IChjb25zdCBFbGYzMl9ncHRhYiAqKSBwMjsKLQotICByZXR1cm4gYTEtPmd0X2VudHJ5Lmd0X2dfdmFsdWUgLSBhMi0+Z3RfZW50cnkuZ3RfZ192YWx1ZTsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGxpbmsgcm91dGluZSB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIGFuZAotICAgdGhlIC5tZGVidWcgc2VjdGlvbnMuICBXZSBuZWVkIHRvIG1lcmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlc2UKLSAgIHNlY3Rpb25zIHRvZ2V0aGVyLCBub3Qgd3JpdGUgdGhlbSBhbGwgb3V0IHNlcXVlbnRpYWxseS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKipzZWNwcDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgYXNlY3Rpb24gKnJ0cHJvY19zZWM7Ci0gIEVsZjMyX1JlZ0luZm8gcmVnaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotICAvKiBJZiBhbGwgdGhlIHRoaW5ncyB3ZSBsaW5rZWQgdG9nZXRoZXIgd2VyZSBQSUMsIGJ1dCB3ZSdyZQotICAgICBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSAocmF0aGVyIHRoYW4gYSBzaGFyZWQgb2JqZWN0KSwgdGhlbiB0aGUKLSAgICAgcmVzdWx0aW5nIGZpbGUgaXMgQ1BJQyAoaS5lLiwgaXQgY2FsbHMgUElDIGNvZGUuKSAgKi8KLSAgaWYgKCFpbmZvLT5zaGFyZWQKLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19QSUMpCi0gICAgewotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfTUlQU19DUElDOwotICAgIH0KLQotICAvKiBXZSdkIGNhcmVmdWxseSBhcnJhbmdlZCB0aGUgZHluYW1pYyBzeW1ib2wgaW5kaWNlcywgYW5kIHRoZW4gdGhlCi0gICAgIGdlbmVyaWMgc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJlbnVtYmVyZWQgdGhlbSBvdXQgZnJvbSB1bmRlciB1cy4KLSAgICAgUmF0aGVyIHRoYW4gdHJ5aW5nIHNvbWVob3cgdG8gcHJldmVudCB0aGUgcmVudW1iZXJpbmcsIGp1c3QgZG8KLSAgICAgdGhlIHNvcnQgYWdhaW4uICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBhc2VjdGlvbiAqZ290OwotICAgICAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgICAgIC8qIFdoZW4gd2UgcmVzb3J0LCB3ZSBtdXN0IHRlbGwgbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIHdoYXQKLQkgdGhlIGxvd2VzdCBpbmRleCBpdCBtYXkgdXNlIGlzLiAgVGhhdCdzIHRoZSBudW1iZXIgb2Ygc2VjdGlvbgotCSBzeW1ib2xzIHdlJ3JlIGdvaW5nIHRvIGFkZC4gIFRoZSBnZW5lcmljIEVMRiBsaW5rZXIgb25seQotCSBhZGRzIHRoZXNlIHN5bWJvbHMgd2hlbiBidWlsZGluZyBhIHNoYXJlZCBvYmplY3QuICBOb3RlIHRoYXQKLQkgd2UgY291bnQgdGhlIHNlY3Rpb25zIGFmdGVyIChwb3NzaWJseSkgcmVtb3ZpbmcgdGhlIC5vcHRpb25zCi0JIHNlY3Rpb24gYWJvdmUuICAqLwotICAgICAgaWYgKCFtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGUgKGluZm8sIChpbmZvLT5zaGFyZWQgCi0JCQkJCSAgICA/IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgKyAxCi0JCQkJCSAgICA6IDEpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgZGlkbid0IGdyb3cgdGhlIGdsb2JhbCAuZ290IHJlZ2lvbi4gICovCi0gICAgICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgICAgIGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKGdvdCktPnRkYXRhOwotCi0gICAgICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSAhPSBOVUxMKQotCUJGRF9BU1NFUlQgKChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50Ci0JCSAgICAgLSBnLT5nbG9iYWxfZ290c3ltLT5keW5pbmR4KQotCQkgICAgPD0gZy0+Z2xvYmFsX2dvdG5vKTsKLSAgICB9Ci0KLSAgLyogT24gSVJJWDUsIHdlIG9taXQgdGhlIC5vcHRpb25zIHNlY3Rpb24uICBPbiBJUklYNiwgaG93ZXZlciwgd2UKLSAgICAgaW5jbHVkZSBpdCwgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgcHJvY2VzcyBpdCBxdWl0ZSByaWdodC4gIChTb21lCi0gICAgIGVudHJpZXMgYXJlIHN1cHBvc2VkIHRvIGJlIG1lcmdlZC4pICBFbXBpcmljYWxseSwgd2Ugc2VlbSB0byBiZQotICAgICBiZXR0ZXIgb2ZmIGluY2x1ZGluZyBpdCB0aGVuIG5vdC4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1KQotICAgIGZvciAoc2VjcHAgPSAmYWJmZC0+c2VjdGlvbnM7ICpzZWNwcCAhPSBOVUxMOyBzZWNwcCA9ICYoKnNlY3BwKS0+bmV4dCkKLSAgICAgIHsKLQlpZiAoc3RyY21wICgoKnNlY3BwKS0+bmFtZSwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwKQotCSAgewotCSAgICBmb3IgKHAgPSAoKnNlY3BwKS0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQlwLT51LmluZGlyZWN0LnNlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICAoKnNlY3BwKS0+bGlua19vcmRlcl9oZWFkID0gTlVMTDsKLQkgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgIC0tYWJmZC0+c2VjdGlvbl9jb3VudDsKLQkgICAgCi0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotCi0gIC8qIEdldCBhIHZhbHVlIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBpZiAoZWxmX2dwIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAoYWJmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGJmZF92bWEgbG87Ci0KLQkgIC8qIEZpbmQgdGhlIEdQLXJlbGF0aXZlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXN0IG9mZnNldC4gICovCi0JICBsbyA9IChiZmRfdm1hKSAtMTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgaWYgKG8tPnZtYSA8IGxvIAotCQkmJiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLnNoX2ZsYWdzICYgU0hGX01JUFNfR1BSRUwpKQotCSAgICAgIGxvID0gby0+dm1hOwotCi0JICAvKiBBbmQgY2FsY3VsYXRlIEdQIHJlbGF0aXZlIHRvIHRoYXQuICAqLwotCSAgZWxmX2dwIChhYmZkKSA9IGxvICsgRUxGX01JUFNfR1BfT0ZGU0VUIChhYmZkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYwotCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKLQkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCi0JfQotICAgIH0KLQotICAvKiBHbyB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY29sbGVjdCB0aGUgLnJlZ2luZm8gYW5kIC5tZGVidWcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZWdpbmZvX3NlYyA9IE5VTEw7Ci0gIG1kZWJ1Z19zZWMgPSBOVUxMOwotICBncHRhYl9kYXRhX3NlYyA9IE5VTEw7Ci0gIGdwdGFiX2Jzc19zZWMgPSBOVUxMOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKLQl7Ci0JICBtZW1zZXQgKCZyZWdpbmZvLCAwLCBzaXplb2YgcmVnaW5mbyk7Ci0KLQkgIC8qIFdlIGhhdmUgZm91bmQgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCSAgICAgTG9vayB0aHJvdWdoIGFsbCB0aGUgbGlua19vcmRlcnMgY29tcHJpc2luZyBpdCBhbmQgbWVyZ2UKLQkgICAgIHRoZSBpbmZvcm1hdGlvbiB0b2dldGhlci4gICovCi0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OwotCSAgICAgIEVsZjMyX1JlZ0luZm8gc3ViOwotCi0JICAgICAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCXsKLQkJICBpZiAocC0+dHlwZSA9PSBiZmRfZmlsbF9saW5rX29yZGVyKQotCQkgICAgY29udGludWU7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0JICAgICAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0KLQkgICAgICAvKiBUaGUgbGlua2VyIGVtdWxhdGlvbiBjb2RlIGhhcyBwcm9iYWJseSBjbG9iYmVyZWQgdGhlCi0gICAgICAgICAgICAgICAgIHNpemUgdG8gYmUgemVybyBieXRlcy4gICovCi0JICAgICAgaWYgKGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQotCQlpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIChQVFIpICZleHQsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJICAgICAgc2l6ZW9mIGV4dCkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoaW5wdXRfYmZkLCAmZXh0LCAmc3ViKTsKLQotCSAgICAgIHJlZ2luZm8ucmlfZ3BybWFzayB8PSBzdWIucmlfZ3BybWFzazsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gfD0gc3ViLnJpX2Nwcm1hc2tbMF07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzFdIHw9IHN1Yi5yaV9jcHJtYXNrWzFdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1syXSB8PSBzdWIucmlfY3BybWFza1syXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gfD0gc3ViLnJpX2Nwcm1hc2tbM107Ci0KLQkgICAgICAvKiByaV9ncF92YWx1ZSBpcyBzZXQgYnkgdGhlIGZ1bmN0aW9uCi0JCSBtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyB3aGVuIHRoZSBzZWN0aW9uIGlzCi0JCSBmaW5hbGx5IHdyaXR0ZW4gb3V0LiAgKi8KLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICAvKiBTaXplIGhhcyBiZWVuIHNldCBpbiBtaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyAgKi8KLQkgIEJGRF9BU1NFUlQoby0+X3Jhd19zaXplID09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgcmVnaW5mb19zZWMgPSBvOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5tZGVidWciKSA9PSAwKQotCXsKLQkgIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQkgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgdmVyc2lvbiBzdGFtcCBiZT8gICovCi0JICBzeW1oZHItPnZzdGFtcCA9IDA7Ci0JICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLQkgIHN5bWhkci0+Y2JMaW5lID0gMDsKLQkgIHN5bWhkci0+aWRuTWF4ID0gMDsKLQkgIHN5bWhkci0+aXBkTWF4ID0gMDsKLQkgIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0JICBzeW1oZHItPmlvcHRNYXggPSAwOwotCSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzTWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWZkTWF4ID0gMDsKLQkgIHN5bWhkci0+Y3JmZCA9IDA7Ci0JICBzeW1oZHItPmlleHRNYXggPSAwOwotCi0JICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZQotCSAgICAgZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCSAgZGVidWcubGluZSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9kbnIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcGRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9vcHQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLQkgIGRlYnVnLnNzID0gTlVMTDsKLQkgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9yZmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0KLQkgIG1kZWJ1Z19oYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLQkgIGlmIChtZGVidWdfaGFuZGxlID09IChQVFIpIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0JICAgICAgRVhUUiBlc3ltOwotCSAgICAgIGJmZF92bWEgbGFzdDsKLQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVbXSA9Ci0JCXsgIi50ZXh0IiwgIi5pbml0IiwgIi5maW5pIiwgIi5kYXRhIiwKLQkJICAgICIucm9kYXRhIiwgIi5zZGF0YSIsICIuc2JzcyIsICIuYnNzIiB9OwotCSAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2NbXSA9IHsgc2NUZXh0LCBzY0luaXQsIHNjRmluaSwgc2NEYXRhLAotCQkJCQkgIHNjUkRhdGEsIHNjU0RhdGEsIHNjU0Jzcywgc2NCc3MgfTsKLQotCSAgICAgIGVzeW0uam1wdGJsID0gMDsKLQkgICAgICBlc3ltLmNvYm9sX21haW4gPSAwOwotCSAgICAgIGVzeW0ud2Vha2V4dCA9IDA7Ci0JICAgICAgZXN5bS5yZXNlcnZlZCA9IDA7Ci0JICAgICAgZXN5bS5pZmQgPSBpZmROaWw7Ci0JICAgICAgZXN5bS5hc3ltLmlzcyA9IGlzc05pbDsKLQkgICAgICBlc3ltLmFzeW0uc3QgPSBzdExvY2FsOwotCSAgICAgIGVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0JICAgICAgZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0JICAgICAgbGFzdCA9IDA7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJewotCQkgIGVzeW0uYXN5bS5zYyA9IHNjW2ldOwotCQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZVtpXSk7Ci0JCSAgaWYgKHMgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZXN5bS5hc3ltLnZhbHVlID0gcy0+dm1hOwotCQkgICAgICBsYXN0ID0gcy0+dm1hICsgcy0+X3Jhd19zaXplOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGVzeW0uYXN5bS52YWx1ZSA9IGxhc3Q7Ci0KLQkJICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChhYmZkLCAmZGVidWcsIHN3YXAsCi0JCQkJCQkgICAgICBuYW1lW2ldLCAmZXN5bSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwOwotCSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGlucHV0X2RlYnVnOwotCSAgICAgIGNoYXIgKmVyYXdfc3JjOwotCSAgICAgIGNoYXIgKmVyYXdfZW5kOwotCi0JICAgICAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCXsKLQkJICBpZiAocC0+dHlwZSA9PSBiZmRfZmlsbF9saW5rX29yZGVyKQotCQkgICAgY29udGludWU7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0JICAgICAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0KLQkgICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChpbnB1dF9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJICB8fCAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGlucHV0X2JmZCkKLQkJICAgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKSA9PSBOVUxMKQotCQl7Ci0JCSAgLyogSSBkb24ndCBrbm93IHdoYXQgYSBub24gTUlQUyBFTEYgYmZkIHdvdWxkIGJlCi0JCSAgICAgZG9pbmcgd2l0aCBhIC5tZGVidWcgc2VjdGlvbiwgYnV0IEkgZG9uJ3QgcmVhbGx5Ci0JCSAgICAgd2FudCB0byBkZWFsIHdpdGggaXQuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zd2FwID0gKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCQkgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnNpemUgPT0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIFRoZSBFQ09GRiBsaW5raW5nIGNvZGUgZXhwZWN0cyB0aGF0IHdlIGhhdmUgYWxyZWFkeQotCQkgcmVhZCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBzZXQgdXAgYW4KLQkJIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBzbyB3ZSBkbyB0aGF0IG5vdy4gICovCi0JICAgICAgaWYgKCEgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSAgICZpbnB1dF9kZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCQkgICAgIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGlucHV0X2JmZCwKLQkJICAgICAgJmlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLCBpbmZvKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIEZvciBlYWNoIG9uZSB3aXRoCi0JCSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiwgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbgotCQkgdGhlIGxpbmtlciBnbG9iYWwgaGFzaCB0YWJsZSBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24KLQkJIGZvciB0aGUgb3V0cHV0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotCSAgICAgIGVyYXdfc3JjID0gaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0OwotCSAgICAgIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JCQkgICsgKGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCQkgICAgICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKLQkgICAgICBmb3IgKDsKLQkJICAgZXJhd19zcmMgPCBlcmF3X2VuZDsKLQkJICAgZXJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0JCXsKLQkJICBFWFRSIGV4dDsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICAoKmlucHV0X3N3YXAtPnN3YXBfZXh0X2luKSAoaW5wdXRfYmZkLCAoUFRSKSBlcmF3X3NyYywgJmV4dCk7Ci0JCSAgaWYgKGV4dC5hc3ltLnNjID09IHNjTmlsCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgbmFtZSA9IGlucHV0X2RlYnVnLnNzZXh0ICsgZXh0LmFzeW0uaXNzOwotCQkgIGggPSBtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwgfHwgaC0+ZXN5bS5pZmQgIT0gLTIpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChleHQuaWZkICE9IC0xKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChleHQuaWZkCi0JCQkJICA8IGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZmRNYXgpOwotCQkgICAgICBleHQuaWZkID0gaW5wdXRfZGVidWcuaWZkbWFwW2V4dC5pZmRdOwotCQkgICAgfQotCi0JCSAgaC0+ZXN5bSA9IGV4dDsKLQkJfQotCi0JICAgICAgLyogRnJlZSB1cCB0aGUgaW5mb3JtYXRpb24gd2UganVzdCByZWFkLiAgKi8KLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5saW5lKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9kbnIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3Bkcik7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfc3ltKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9vcHQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2F1eCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuc3MpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzZXh0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9mZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3JmZCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0KTsKLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgLyogQ3JlYXRlIC5ydHByb2Mgc2VjdGlvbi4gICovCi0JICAgICAgcnRwcm9jX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOwotCSAgICAgIGlmIChydHByb2Nfc2VjID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZCBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCB8IFNFQ19SRUFET05MWSk7Ci0KLQkJICBydHByb2Nfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5ydHByb2MiKTsKLQkJICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBydHByb2Nfc2VjLCBmbGFncykKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBydHByb2Nfc2VjLCA0KSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwKLQkJCQkJCSAgICAgaW5mbywgcnRwcm9jX3NlYywgJmRlYnVnKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCSAgZWluZm8uYWJmZCA9IGFiZmQ7Ci0JICBlaW5mby5pbmZvID0gaW5mbzsKLQkgIGVpbmZvLmRlYnVnID0gJmRlYnVnOwotCSAgZWluZm8uc3dhcCA9IHN3YXA7Ci0JICBlaW5mby5mYWlsZWQgPSBmYWxzZTsKLQkgIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgICAgIG1pcHNfZWxmX291dHB1dF9leHRzeW0sCi0JCQkJICAgICAgIChQVFIpICZlaW5mbyk7Ci0JICBpZiAoZWluZm8uZmFpbGVkKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgIG8tPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCAmZGVidWcsIHN3YXApOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgbWRlYnVnX3NlYyA9IG87Ci0JfQotCi0gICAgICBpZiAoc3RybmNtcCAoby0+bmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKLQl7Ci0JICBjb25zdCBjaGFyICpzdWJuYW1lOwotCSAgdW5zaWduZWQgaW50IGM7Ci0JICBFbGYzMl9ncHRhYiAqdGFiOwotCSAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKmV4dF90YWI7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgLyogVGhlIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3Mgc2VjdGlvbnMgaG9sZAotCSAgICAgaW5mb3JtYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIHNtYWxsIGRhdGEgYXJlYSB3b3VsZAotCSAgICAgY2hhbmdlIGRlcGVuZGluZyB1cG9uIHRoZSAtRyBzd2l0Y2guICBUaGVzZSBzZWN0aW9ucwotCSAgICAgbm90IHVzZWQgaW4gZXhlY3V0YWJsZXMgZmlsZXMuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotCSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JCSAgIHAgPSBwLT5uZXh0KQotCQl7Ci0JCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0KLQkJICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJICAgIHsKLQkJICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJCWNvbnRpbnVlOwotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIH0KLQotCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkJICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJICAgICBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCQkgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCQl9Ci0KLQkgICAgICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzCi0JCSBjdXJyZW50bHkgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgICAgICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgICAgICAvKiBSZWFsbHkgcmVtb3ZlIHRoZSBzZWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOwotCQkgICAqc2VjcHAgIT0gbzsKLQkJICAgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0JCTsKLQkgICAgICAqc2VjcHAgPSAoKnNlY3BwKS0+bmV4dDsKLQkgICAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBUaGVyZSBpcyBvbmUgZ3B0YWIgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCBvbmUgZm9yCi0JICAgICB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zZGF0YSIpID09IDApCi0JICAgIGdwdGFiX2RhdGFfc2VjID0gbzsKLQkgIGVsc2UgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zYnNzIikgPT0gMCkKLQkgICAgZ3B0YWJfYnNzX3NlYyA9IG87Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFRoZSBsaW5rZXIgc2NyaXB0IGFsd2F5cyBjb21iaW5lcyAuZ3B0YWIuZGF0YSBhbmQKLQkgICAgIC5ncHRhYi5zZGF0YSBpbnRvIC5ncHRhYi5zZGF0YSwgYW5kIGxpa2V3aXNlIGZvcgotCSAgICAgLmdwdGFiLmJzcyBhbmQgLmdwdGFiLnNic3MuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzCi0JICAgICBubyAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGluIHdoaWNoCi0JICAgICBjYXNlIHdlIG11c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAobyA9PSBncHRhYl9kYXRhX3NlYykKLQkJby0+bmFtZSA9ICIuZ3B0YWIuZGF0YSI7Ci0JICAgICAgZWxzZQotCQlvLT5uYW1lID0gIi5ncHRhYi5ic3MiOwotCSAgICAgIHN1Ym5hbWUgPSBvLT5uYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMTsKLQkgICAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3VibmFtZSkgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgLyogU2V0IHVwIHRoZSBmaXJzdCBlbnRyeS4gICovCi0JICBjID0gMTsKLQkgIHRhYiA9IChFbGYzMl9ncHRhYiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChFbGYzMl9ncHRhYikpOwotCSAgaWYgKHRhYiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X2N1cnJlbnRfZ192YWx1ZSA9IGVsZl9ncF9zaXplIChhYmZkKTsKLQkgIHRhYlswXS5ndF9oZWFkZXIuZ3RfdW51c2VkID0gMDsKLQotCSAgLyogQ29tYmluZSB0aGUgaW5wdXQgc2VjdGlvbnMuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBsYXN0OwotCSAgICAgIGJmZF9zaXplX3R5cGUgZ3BlbnRyeTsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogQ29tYmluZSB0aGUgZ3B0YWIgZW50cmllcyBmb3IgdGhpcyBpbnB1dCBzZWN0aW9uIG9uZQotCQkgYnkgb25lLiAgV2Uga25vdyB0aGF0IHRoZSBpbnB1dCBncHRhYiBlbnRyaWVzIGFyZQotCQkgc29ydGVkIGJ5IGFzY2VuZGluZyAtRyB2YWx1ZS4gICovCi0JICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0JICAgICAgbGFzdCA9IDA7Ci0JICAgICAgZm9yIChncGVudHJ5ID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0JCSAgIGdwZW50cnkgPCBzaXplOwotCQkgICBncGVudHJ5ICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKQotCQl7Ci0JCSAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgZXh0X2dwdGFiOwotCQkgIEVsZjMyX2dwdGFiIGludF9ncHRhYjsKLQkJICB1bnNpZ25lZCBsb25nIHZhbDsKLQkJICB1bnNpZ25lZCBsb25nIGFkZDsKLQkJICBib29sZWFuIGV4YWN0OwotCQkgIHVuc2lnbmVkIGludCBsb29rOwotCi0JCSAgaWYgKCEgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpICZleHRfZ3B0YWIsCi0JCQkgIGdwZW50cnksIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKSkpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHRhYik7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4gKGlucHV0X2JmZCwgJmV4dF9ncHRhYiwKLQkJCQkJCSZpbnRfZ3B0YWIpOwotCQkgIHZhbCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9nX3ZhbHVlOwotCQkgIGFkZCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9ieXRlcyAtIGxhc3Q7Ci0KLQkJICBleGFjdCA9IGZhbHNlOwotCQkgIGZvciAobG9vayA9IDE7IGxvb2sgPCBjOyBsb29rKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA+PSB2YWwpCi0JCQl0YWJbbG9va10uZ3RfZW50cnkuZ3RfYnl0ZXMgKz0gYWRkOwotCi0JCSAgICAgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9PSB2YWwpCi0JCQlleGFjdCA9IHRydWU7Ci0JCSAgICB9Ci0KLQkJICBpZiAoISBleGFjdCkKLQkJICAgIHsKLQkJICAgICAgRWxmMzJfZ3B0YWIgKm5ld190YWI7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBtYXg7Ci0KLQkJICAgICAgLyogV2UgbmVlZCBhIG5ldyB0YWJsZSBlbnRyeS4gICovCi0JCSAgICAgIG5ld190YWIgPSAoKEVsZjMyX2dwdGFiICopCi0JCQkJIGJmZF9yZWFsbG9jICgoUFRSKSB0YWIsCi0JCQkJCSAgICAgIChjICsgMSkgKiBzaXplb2YgKEVsZjMyX2dwdGFiKSkpOwotCQkgICAgICBpZiAobmV3X3RhYiA9PSBOVUxMKQotCQkJewotCQkJICBmcmVlICh0YWIpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIHRhYiA9IG5ld190YWI7Ci0JCSAgICAgIHRhYltjXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID0gdmFsOwotCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfYnl0ZXMgPSBhZGQ7Ci0KLQkJICAgICAgLyogTWVyZ2UgaW4gdGhlIHNpemUgZm9yIHRoZSBuZXh0IHNtYWxsZXN0IC1HCi0JCQkgdmFsdWUsIHNpbmNlIHRoYXQgd2lsbCBiZSBpbXBsaWVkIGJ5IHRoaXMgbmV3Ci0JCQkgdmFsdWUuICAqLwotCQkgICAgICBtYXggPSAwOwotCQkgICAgICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQotCQkJewotCQkJICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPCB2YWwKLQkJCSAgICAgICYmIChtYXggPT0gMAotCQkJCSAgfHwgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlCi0JCQkJICAgICAgPiB0YWJbbWF4XS5ndF9lbnRyeS5ndF9nX3ZhbHVlKSkpCi0JCQkgICAgbWF4ID0gbG9vazsKLQkJCX0KLQkJICAgICAgaWYgKG1heCAhPSAwKQotCQkJdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzICs9Ci0JCQkgIHRhYlttYXhdLmd0X2VudHJ5Lmd0X2J5dGVzOwotCi0JCSAgICAgICsrYzsKLQkJICAgIH0KLQotCQkgIGxhc3QgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXM7Ci0JCX0KLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICAvKiBUaGUgdGFibGUgbXVzdCBiZSBzb3J0ZWQgYnkgLUcgdmFsdWUuICAqLwotCSAgaWYgKGMgPiAyKQotCSAgICBxc29ydCAodGFiICsgMSwgYyAtIDEsIHNpemVvZiAodGFiWzBdKSwgZ3B0YWJfY29tcGFyZSk7Ci0KLQkgIC8qIFN3YXAgb3V0IHRoZSB0YWJsZS4gICovCi0JICBleHRfdGFiID0gKChFbGYzMl9FeHRlcm5hbF9ncHRhYiAqKQotCQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgYyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKSk7Ci0JICBpZiAoZXh0X3RhYiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAodGFiKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQkgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIHRhYiArIGksIGV4dF90YWIgKyBpKTsKLQkgIGZyZWUgKHRhYik7Ci0KLQkgIG8tPl9yYXdfc2l6ZSA9IGMgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKTsKLQkgIG8tPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dF90YWI7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLwotICBpZiAoQUJJXzY0X1AgKGFiZmQpKQotICAgIHsKLSNpZmRlZiBCRkQ2NAotICAgICAgaWYgKCFiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZiAvKiBCRkQ2NCAqLwotICAgIH0KLSAgZWxzZSBpZiAoIWJmZF9lbGYzMl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgdGhlIGNvbXB1dGVkIHNlY3Rpb25zLiAgKi8KLQotICBpZiAocmVnaW5mb19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0KLSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsICZyZWdpbmZvLCAmZXh0KTsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcmVnaW5mb19zZWMsIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChtZGVidWdfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOwotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsCi0JCQkJCSAgICAgICBzd2FwLCBpbmZvLAotCQkJCQkgICAgICAgbWRlYnVnX3NlYy0+ZmlsZXBvcykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfZWNvZmZfZGVidWdfZnJlZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLSAgICB9Ci0KLSAgaWYgKGdwdGFiX2RhdGFfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfZGF0YV9zZWMsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChncHRhYl9ic3Nfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfYnNzX3NlYywKLQkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLSAgICB7Ci0gICAgICBydHByb2Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnRwcm9jIik7Ci0gICAgICBpZiAocnRwcm9jX3NlYyAhPSBOVUxMKQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcnRwcm9jX3NlYywKLQkJCQkJICBydHByb2Nfc2VjLT5jb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgcnRwcm9jX3NlYy0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybnMgdGhlIEdPVCBzZWN0aW9uIGZvciBBQkZELiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1pcHNfZWxmX2dvdF9zZWN0aW9uIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKTsKLX0KLQotLyogUmV0dXJucyB0aGUgR09UIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluayBpbmRpY2F0ZWQgYnkKLSAgIElORk8uICBJZiBTR09UUCBpcyBub24tTlVMTCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIEdPVCAKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfZ290X2luZm8gKgotbWlwc19lbGZfZ290X2luZm8gKGFiZmQsIHNnb3RwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICoqc2dvdHA7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBzZ290ID0gbWlwc19lbGZfZ290X3NlY3Rpb24gKGFiZmQpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgaWYgKHNnb3RwKQotICAgICpzZ290cCA9IHNnb3Q7Ci0gIHJldHVybiBnOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9sb2NhbF9yZWxvY2F0aW9uX3AgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0KLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGlmICghIGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIHJldHVybiByX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIHRhYmxlIGRvZXMgbm90IGZvbGxvdyB0aGUgcnVsZSB0aGF0IGxvY2FsIHN5bWJvbHMKLQkgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWxzLiAgKi8KLSAgICAgIHJldHVybiBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0gIT0gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFNpZ24tZXh0ZW5kIFZBTFVFLCB3aGljaCBoYXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2YgQklUUy4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9zaWduX2V4dGVuZCAodmFsdWUsIGJpdHMpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotewotICBpZiAodmFsdWUgJiAoKGJmZF92bWEpMSA8PCAoYml0cyAtIDEpKSkKLSAgICAvKiBWQUxVRSBpcyBuZWdhdGl2ZS4gICovCi0gICAgdmFsdWUgfD0gKChiZmRfdm1hKSAtIDEpIDw8IGJpdHM7ICAgICAgCi0gIAotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiB0aGUgaW5kaWNhdGVkIFZBTFVFIGhhcyBvdmVyZmxvd2VkIHRoZSBtYXhpbXVtCi0gICByYW5nZSBleHByZXNzYWJsZSBieSBhIHNpZ25lZCBudW1iZXIgd2l0aCB0aGUgaW5kaWNhdGVkIG51bWJlciBvZgotICAgQklUUy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgYml0cykKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci17Ci0gIGJmZF9zaWduZWRfdm1hIHN2YWx1ZSA9IChiZmRfc2lnbmVkX3ZtYSkgdmFsdWU7Ci0KLSAgaWYgKHN2YWx1ZSA+ICgxIDw8IChiaXRzIC0gMSkpIC0gMSkKLSAgICAvKiBUaGUgdmFsdWUgaXMgdG9vIGJpZy4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0gIGVsc2UgaWYgKHN2YWx1ZSA8IC0oMSA8PCAoYml0cyAtIDEpKSkKLSAgICAvKiBUaGUgdmFsdWUgaXMgdG9vIHNtYWxsLiAgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgLyogQWxsIGlzIHdlbGwuICAqLwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgJWhpZ2ggZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfaGlnaCAodmFsdWUpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHJldHVybiAoKHZhbHVlICsgKGJmZF92bWEpIDB4ODAwMCkgPj4gMTYpICYgMHhmZmZmOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlICVoaWdoZXIgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfaGlnaGVyICh2YWx1ZSkKLSAgICAgYmZkX3ZtYSB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIHJldHVybiAoKHZhbHVlICsgKGJmZF92bWEpIDB4ODAwMDgwMDApID4+IDMyKSAmIDB4ZmZmZjsKLSNlbHNlCi0gIGFib3J0ICgpOwotICByZXR1cm4gKGJmZF92bWEpIC0xOwotI2VuZGlmCi19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgJWhpZ2hlc3QgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYSAKLW1pcHNfZWxmX2hpZ2hlc3QgKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgQkZENjQKLSAgcmV0dXJuICgodmFsdWUgKyAoYmZkX3ZtYSkgMHg4MDAwODAwMDgwMDApID4+IDQ4KSAmIDB4ZmZmZjsKLSNlbHNlCi0gIGFib3J0ICgpOwotICByZXR1cm4gKGJmZF92bWEpIC0xOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybnMgdGhlIEdPVCBpbmRleCBmb3IgdGhlIGdsb2JhbCBzeW1ib2wgaW5kaWNhdGVkIGJ5IEguICAqLwotCi1zdGF0aWMgYmZkX3ZtYSAKLW1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXggKGFiZmQsIGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZF92bWEgaW5kZXg7Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGFiZmQsICZzZ290KTsKLQotICAvKiBPbmNlIHdlIGRldGVybWluZSB0aGUgZ2xvYmFsIEdPVCBlbnRyeSB3aXRoIHRoZSBsb3dlc3QgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUgaW5kZXgsIHdlIG11c3QgcHV0IGFsbCBkeW5hbWljIHN5bWJvbHMgd2l0aCBncmVhdGVyCi0gICAgIGluZGljZXMgaW50byB0aGUgR09ULiAgVGhhdCBtYWtlcyBpdCBlYXN5IHRvIGNhbGN1bGF0ZSB0aGUgR09UCi0gICAgIG9mZnNldC4gICovCi0gIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggPj0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keCk7Ci0gIGluZGV4ID0gKChoLT5keW5pbmR4IC0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keCArIGctPmxvY2FsX2dvdG5vKSAKLQkgICAqIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKGluZGV4IDwgc2dvdC0+X3Jhd19zaXplKTsKLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFJldHVybnMgdGhlIG9mZnNldCBmb3IgdGhlIGVudHJ5IGF0IHRoZSBJTkRFWHRoIHBvc2l0aW9uCi0gICBpbiB0aGUgR09ULiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleCAoZHlub2JqLCBvdXRwdXRfYmZkLCBpbmRleCkKLSAgICAgYmZkICpkeW5vYmo7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkX3ZtYSBpbmRleDsKLXsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChkeW5vYmopOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIGluZGV4IC0gCi0JICBncCk7Ci19Ci0KLS8qIElmIEggaXMgYSBzeW1ib2wgdGhhdCBuZWVkcyBhIGdsb2JhbCBHT1QgZW50cnksIGJ1dCBoYXMgYSBkeW5hbWljCi0gICBzeW1ib2wgdGFibGUgaW5kZXggbG93ZXIgdGhhbiBhbnkgd2UndmUgc2VlbiB0byBkYXRlLCByZWNvcmQgaXQgZm9yCi0gICBwb3N0ZXJpdHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sIChoLCBpbmZvLCBnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEEgZ2xvYmFsIHN5bWJvbCBpbiB0aGUgR09UIG11c3QgYWxzbyBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wKLSAgICAgdGFibGUuICAqLwotICBpZiAoaC0+ZHluaW5keCA9PSAtMQotICAgICAgJiYgIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogSWYgd2UndmUgYWxyZWFkeSBtYXJrZWQgdGhpcyBlbnRyeSBhcyBuZWVkIEdPVCBzcGFjZSwgd2UgZG9uJ3QKLSAgICAgbmVlZCB0byBkbyBpdCBhZ2Fpbi4gICovCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtIDEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQnkgc2V0dGluZyB0aGlzIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiAtMSwgd2UgYXJlIGluZGljYXRpbmcgdGhhdAotICAgICB0aGVyZSBuZWVkcyB0byBiZSBhIEdPVCBlbnRyeSBmb3IgSC4gICovCi0gIGgtPmdvdC5vZmZzZXQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2Ygd2hlbiBzb3J0aW5nCi0gICB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgICAgCi1zdHJ1Y3QgbWlwc19lbGZfaGFzaF9zb3J0X2RhdGEKLXsKLSAgLyogVGhlIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIEdPVCB3aXRoIHRoZSBsb3dlc3QgZHluYW1pYyBzeW1ib2wgdGFibGUKLSAgICAgaW5kZXguICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbG93OwotICAvKiBUaGUgbGVhc3QgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggY29ycmVzcG9uZGluZyB0byBhIHN5bWJvbAotICAgICB3aXRoIGEgR09UIGVudHJ5LiAgKi8KLSAgbG9uZyBtaW5fZ290X2R5bmluZHg7Ci0gIC8qIFRoZSBncmVhdGVzdCBkeW5hbWljIHN5bWJvbCB0YWJsZSBpbmRleCBub3QgY29ycmVzcG9uZGluZyB0byBhCi0gICAgIHN5bWJvbCB3aXRob3V0IGEgR09UIGVudHJ5LiAgKi8KLSAgbG9uZyBtYXhfbm9uX2dvdF9keW5pbmR4OwotfTsKLQotLyogSWYgSCBuZWVkcyBhIEdPVCBlbnRyeSwgYXNzaWduIGl0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBkeW5hbWljCi0gICBpbmRleC4gIE90aGVyd2lzZSwgYXNzaWduIGl0IHRoZSBsb3dlc3QgYXZhaWxhYmxlIGR5bmFtaWMgCi0gICBpbmRleC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZiAoaCwgZGF0YSkKLSAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9oYXNoX3NvcnRfZGF0YSAqaHNkIAotICAgID0gKHN0cnVjdCBtaXBzX2VsZl9oYXNoX3NvcnRfZGF0YSAqKSBkYXRhOwotCi0gIC8qIFN5bWJvbHMgd2l0aG91dCBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIGFyZW4ndCBpbnRlcmVzdGluZwotICAgICBhdCBhbGwuICAqLwotICBpZiAoaC0+cm9vdC5keW5pbmR4ID09IC0xKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5yb290LmdvdC5vZmZzZXQgIT0gMCkKLSAgICBoLT5yb290LmR5bmluZHggPSBoc2QtPm1heF9ub25fZ290X2R5bmluZHgrKzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGgtPnJvb3QuZHluaW5keCA9IC0taHNkLT5taW5fZ290X2R5bmluZHg7Ci0gICAgICBoc2QtPmxvdyA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU29ydCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgc28gdGhhdCBzeW1ib2xzIHRoYXQgbmVlZCBHT1QgZW50cmllcwotICAgYXBwZWFyIHRvd2FyZHMgdGhlIGVuZC4gIFRoaXMgcmVkdWNlcyB0aGUgYW1vdW50IG9mIEdPVCBzcGFjZQotICAgcmVxdWlyZWQuICBNQVhfTE9DQUwgaXMgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBsb2NhbCBzeW1ib2xzCi0gICBrbm93biB0byBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBEdXJpbmcKLSAgIG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucywgdGhpcyB2YWx1ZSBpcyAxLiAgQWZ0ZXJ3YXJkLCB0aGUKLSAgIHNlY3Rpb24gc3ltYm9scyBhcmUgYWRkZWQgYW5kIHRoZSBjb3VudCBpcyBoaWdoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIChpbmZvLCBtYXhfbG9jYWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIG1heF9sb2NhbDsKLXsKLSAgc3RydWN0IG1pcHNfZWxmX2hhc2hfc29ydF9kYXRhIGhzZDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGhzZC5sb3cgPSBOVUxMOwotICBoc2QubWluX2dvdF9keW5pbmR4ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgaHNkLm1heF9ub25fZ290X2R5bmluZHggPSBtYXhfbG9jYWw7Ci0gIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopIAotCQkJCWVsZl9oYXNoX3RhYmxlIChpbmZvKSksIAotCQkJICAgICAgIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZV9mLCAKLQkJCSAgICAgICAmaHNkKTsKLQotICAvKiBUaGVyZSBzaG91ZCBoYXZlIGJlZW4gZW5vdWdoIHJvb20gaW4gdGhlIHN5bWJvbCB0YWJsZSB0bwotICAgICBhY2NvbW9kYXRlIGJvdGggdGhlIEdPVCBhbmQgbm9uLUdPVCBzeW1ib2xzLiAgKi8KLSAgQkZEX0FTU0VSVCAoaHNkLm1pbl9nb3RfZHluaW5keCA9PSBoc2QubWF4X25vbl9nb3RfZHluaW5keCk7Ci0KLSAgLyogTm93IHdlIGtub3cgd2hpY2ggZHluYW1pYyBzeW1ib2wgaGFzIHRoZSBsb3dlc3QgZHluYW1pYyBzeW1ib2wKLSAgICAgdGFibGUgaW5kZXggaW4gdGhlIEdPVC4gICovCi0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZHlub2JqLCBOVUxMKTsKLSAgZy0+Z2xvYmFsX2dvdHN5bSA9IGhzZC5sb3c7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIGxvY2FsIEdPVCBlbnRyeSBmb3IgVkFMVUUuICBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbnRyeSwKLSAgIG9yIC0xIGlmIGl0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkgKGFiZmQsIGcsIHNnb3QsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgaWYgKGctPmFzc2lnbmVkX2dvdG5vID49IGctPmxvY2FsX2dvdG5vKQotICAgIHsKLSAgICAgIC8qIFdlIGRpZG4ndCBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gdGhlIEdPVC4gICovCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygibm90IGVub3VnaCBHT1Qgc3BhY2UgZm9yIGxvY2FsIEdPVCBlbnRyaWVzIikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICBNSVBTX0VMRl9QVVRfV09SRCAoYWJmZCwgdmFsdWUsCi0JCSAgICAgKHNnb3QtPmNvbnRlbnRzIAotCQkgICAgICArIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIGctPmFzc2lnbmVkX2dvdG5vKSk7Ci0gIHJldHVybiBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubysrOwotfQotCi0vKiBSZXR1cm5zIHRoZSBHT1Qgb2Zmc2V0IGF0IHdoaWNoIHRoZSBpbmRpY2F0ZWQgYWRkcmVzcyBjYW4gYmUgZm91bmQuCi0gICBJZiB0aGVyZSBpcyBub3QgeWV0IGEgR09UIGVudHJ5IGZvciB0aGlzIHZhbHVlLCBjcmVhdGUgb25lLiAgUmV0dXJucwotICAgLTEgaWYgbm8gc2F0aXNmYWN0b3J5IEdPVCBvZmZzZXQgY2FuIGJlIGZvdW5kLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2xvY2FsX2dvdF9pbmRleCAoYWJmZCwgaW5mbywgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgYmZkX2J5dGUgKmVudHJ5OwotCi0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosICZzZ290KTsKLQotICAvKiBMb29rIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnkuICAqLwotICBmb3IgKGVudHJ5ID0gKHNnb3QtPmNvbnRlbnRzIAotCQkrIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIE1JUFNfUkVTRVJWRURfR09UTk8pOyAKLSAgICAgICBlbnRyeSAhPSBzZ290LT5jb250ZW50cyArIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIGctPmFzc2lnbmVkX2dvdG5vOwotICAgICAgIGVudHJ5ICs9IE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3MgPSBNSVBTX0VMRl9HRVRfV09SRCAoYWJmZCwgZW50cnkpOwotICAgICAgaWYgKGFkZHJlc3MgPT0gdmFsdWUpCi0JcmV0dXJuIGVudHJ5IC0gc2dvdC0+Y29udGVudHM7Ci0gICAgfQotCi0gIHJldHVybiBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSk7Ci19Ci0KLS8qIEZpbmQgYSBHT1QgZW50cnkgdGhhdCBpcyB3aXRoaW4gMzJLQiBvZiB0aGUgVkFMVUUuICBUaGVzZSBlbnRyaWVzCi0gICBhcmUgc3VwcG9zZWQgdG8gYmUgcGxhY2VkIGF0IHNtYWxsIG9mZnNldHMgaW4gdGhlIEdPVCwgaS5lLiwKLSAgIHdpdGhpbiAzMktCIG9mIEdQLiAgUmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBHT1QgZm9yIHRoaXMgcGFnZSwKLSAgIGFuZCBzdG9yZSB0aGUgb2Zmc2V0IGZyb20gdGhpcyBlbnRyeSB0byB0aGUgZGVzaXJlZCBhZGRyZXNzIGluCi0gICBPRkZTRVRQLCBpZiBpdCBpcyBub24tTlVMTC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9nb3RfcGFnZSAoYWJmZCwgaW5mbywgdmFsdWUsIG9mZnNldHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgKm9mZnNldHA7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgYmZkX2J5dGUgKmVudHJ5OwotICBiZmRfYnl0ZSAqbGFzdF9lbnRyeTsKLSAgYmZkX3ZtYSBpbmRleDsKLSAgYmZkX3ZtYSBhZGRyZXNzOwotCi0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosICZzZ290KTsKLQotICAvKiBMb29rIHRvIHNlZSBpZiB3ZSBhbGVhZHkgaGF2ZSBhbiBhcHByb3ByaWF0ZSBlbnRyeS4gICovCi0gIGxhc3RfZW50cnkgPSBzZ290LT5jb250ZW50cyArIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIGctPmFzc2lnbmVkX2dvdG5vOwotICBmb3IgKGVudHJ5ID0gKHNnb3QtPmNvbnRlbnRzIAotCQkrIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIE1JUFNfUkVTRVJWRURfR09UTk8pOwotICAgICAgIGVudHJ5ICE9IGxhc3RfZW50cnk7Ci0gICAgICAgZW50cnkgKz0gTUlQU19FTEZfR09UX1NJWkUgKGFiZmQpKQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBNSVBTX0VMRl9HRVRfV09SRCAoYWJmZCwgZW50cnkpOwotCi0gICAgICBpZiAoIW1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlIC0gYWRkcmVzcywgMTYpKQotCXsKLQkgIC8qIFRoaXMgZW50cnkgd2lsbCBzZXJ2ZSBhcyB0aGUgcGFnZSBwb2ludGVyLiAgV2UgY2FuIGFkZCBhCi0JICAgICAxNi1iaXQgbnVtYmVyIHRvIGl0IHRvIGdldCB0aGUgYWN0dWFsIGFkZHJlc3MuICAqLwotCSAgaW5kZXggPSBlbnRyeSAtIHNnb3QtPmNvbnRlbnRzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSBlbnRyeSwgd2UgY3JlYXRlIG9uZSBub3cuICAqLwotICBpZiAoZW50cnkgPT0gbGFzdF9lbnRyeSkKLSAgICBpbmRleCA9IG1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkgKGFiZmQsIGcsIHNnb3QsIHZhbHVlKTsKLQotICBpZiAob2Zmc2V0cCkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gTUlQU19FTEZfR0VUX1dPUkQgKGFiZmQsIGVudHJ5KTsKLSAgICAgICpvZmZzZXRwID0gdmFsdWUgLSBhZGRyZXNzOwotICAgIH0KLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIEZpbmQgYSBHT1QgZW50cnkgd2hvc2UgaGlnaGVyLW9yZGVyIDE2IGJpdHMgYXJlIHRoZSBzYW1lIGFzIHRob3NlCi0gICBmb3IgdmFsdWUuICBSZXR1cm4gdGhlIGluZGV4IGludG8gdGhlIEdPVCBmb3IgdGhpcyBlbnRyeS4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9nb3QxNl9lbnRyeSAoYWJmZCwgaW5mbywgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgYmZkX2J5dGUgKmVudHJ5OwotICBiZmRfYnl0ZSAqbGFzdF9lbnRyeTsKLSAgYmZkX3ZtYSBpbmRleDsKLSAgYmZkX3ZtYSBhZGRyZXNzOwotCi0gIC8qIEFsdGhvdWdoIHRoZSBBQkkgc2F5cyB0aGF0IGl0IGlzICJ0aGUgaGlnaC1vcmRlciAxNiBiaXRzIiB0aGF0IHdlCi0gICAgIHdhbnQsIGl0IGlzIHJlYWxseSB0aGUgJWhpZ2ggdmFsdWUuICBUaGUgY29tcGxldGUgdmFsdWUgaXMKLSAgICAgY2FsY3VsYXRlZCB3aXRoIGEgYGFkZGl1JyBvZiBhIExPMTYgcmVsb2NhdGlvbiwganVzdCBhcyB3aXRoIGEKLSAgICAgSEkxNi9MTzE2IHBhaXIuICAqLwotICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2ggKHZhbHVlKSA8PCAxNjsKLSAgZyA9IG1pcHNfZWxmX2dvdF9pbmZvIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgJnNnb3QpOwotCi0gIC8qIExvb2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBhcHByb3ByaWF0ZSBlbnRyeS4gICovCi0gIGxhc3RfZW50cnkgPSBzZ290LT5jb250ZW50cyArIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIGctPmFzc2lnbmVkX2dvdG5vOwotICBmb3IgKGVudHJ5ID0gKHNnb3QtPmNvbnRlbnRzIAotCQkrIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIE1JUFNfUkVTRVJWRURfR09UTk8pOwotICAgICAgIGVudHJ5ICE9IGxhc3RfZW50cnk7Ci0gICAgICAgZW50cnkgKz0gTUlQU19FTEZfR09UX1NJWkUgKGFiZmQpKQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBNSVBTX0VMRl9HRVRfV09SRCAoYWJmZCwgZW50cnkpOwotICAgICAgaWYgKChhZGRyZXNzICYgMHhmZmZmMDAwMCkgPT0gdmFsdWUpCi0JewotCSAgLyogVGhpcyBlbnRyeSBoYXMgdGhlIHJpZ2h0IGhpZ2gtb3JkZXIgMTYgYml0cy4gICovCi0JICBpbmRleCA9IGVudHJ5IC0gc2dvdC0+Y29udGVudHM7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGRpZG4ndCBoYXZlIGFuIGFwcHJvcHJpYXRlIGVudHJ5LCB3ZSBjcmVhdGUgb25lIG5vdy4gICovCi0gIGlmIChlbnRyeSA9PSBsYXN0X2VudHJ5KQotICAgIGluZGV4ID0gbWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSAoYWJmZCwgZywgc2dvdCwgdmFsdWUpOwotCi0gIHJldHVybiBpbmRleDsKLX0KLQotLyogUmV0dXJucyB0aGUgZmlyc3QgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbiBmb3VuZCwgYmVnaW5uaW5nIHdpdGgKLSAgIFJFTE9DQVRJT04uICBSRUxFTkQgaXMgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgcmVsb2NhdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqCi1taXBzX2VsZl9uZXh0X2xvMTZfcmVsb2NhdGlvbiAocmVsb2NhdGlvbiwgcmVsZW5kKQotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLXsKLSAgLyogQWNjb3JkaW5nIHRvIHRoZSBNSVBTIEVMRiBBQkksIHRoZSBSX01JUFNfTE8xNiByZWxvY2F0aW9uIG11c3QgYmUKLSAgICAgaW1tZWRpYXRlbHkgZm9sbG93aW5nLiAgSG93ZXZlciwgZm9yIHRoZSBJUklYNiBBQkksIHRoZSBuZXh0Ci0gICAgIHJlbG9jYXRpb24gbWF5IGJlIGEgY29tcG9zZWQgcmVsb2NhdGlvbiBjb25zaXN0aW5nIG9mIHNldmVyYWwKLSAgICAgcmVsb2NhdGlvbnMgZm9yIHRoZSBzYW1lIGFkZHJlc3MuICBJbiB0aGF0IGNhc2UsIHRoZSBSX01JUFNfTE8xNgotICAgICByZWxvY2F0aW9uIG1heSBvY2N1ciBhcyBvbmUgb2YgdGhlc2UuICBXZSBwZXJtaXQgYSBzaW1pbGFyCi0gICAgIGV4dGVuc2lvbiBpbiBnZW5lcmFsLCBhcyB0aGF0IGlzIHVzZWZ1bCBmb3IgR0NDLiAgKi8KLSAgd2hpbGUgKHJlbG9jYXRpb24gPCByZWxlbmQpCi0gICAgewotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKSA9PSBSX01JUFNfTE8xNikKLQlyZXR1cm4gcmVsb2NhdGlvbjsKLQotICAgICAgKytyZWxvY2F0aW9uOwotICAgIH0KLQotICAvKiBXZSBkaWRuJ3QgZmluZCBpdC4gICovCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQ3JlYXRlIGEgcmVsLmR5biByZWxvY2F0aW9uIGZvciB0aGUgZHluYW1pYyBsaW5rZXIgdG8gcmVzb2x2ZS4gIFJFTAotICAgaXMgdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24sIHdoaWNoIGlzIG5vdyBiZWluZyB0cmFuc2Zvcm1lZCBpbnRvIGEKLSAgIGR5YW5taWMgcmVsb2NhdGlvbi4gIFRoZSBBRERFTkRQIGlzIGFkanVzdGVkIGlmIG5lY2Vzc2FyeTsgdGhlCi0gICBjYWxsZXIgc2hvdWxkIHN0b3JlIHRoZSByZXN1bHQgaW4gcGxhY2Ugb2YgdGhlIG9yaWdpbmFsIGFkZGVuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCByZWwsIGgsIHNlYywKLQkJCQkgICAgc3ltYm9sLCBhZGRlbmRwLCBpbnB1dF9zZWN0aW9uKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIHN5bWJvbDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotICBib29sZWFuIHNraXA7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGJmZCAqZHlub2JqOwotICBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3JlbG9jIAotICAgID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwKLQkJCSAgICAgICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpOwotICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0KLSAgc2tpcCA9IGZhbHNlOwotCi0gIC8qIFdlIGJlZ2luIGJ5IGFzc3VtaW5nIHRoYXQgdGhlIG9mZnNldCBmb3IgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbgotICAgICBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24uICBXZSdsbCBhZGp1c3QgdGhpcwotICAgICBsYXRlciB0byByZWZsZWN0IHRoZSBjb3JyZWN0IG91dHB1dCBvZmZzZXRzLiAgKi8KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLSAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICBlbHNlCi0gICAgewotICAgICAgLyogRXhjZXB0IHRoYXQgaW4gYSBzdGFiIHNlY3Rpb24gdGhpbmdzIGFyZSBtb3JlIGNvbXBsZXguCi0JIEJlY2F1c2Ugd2UgY29tcHJlc3Mgc3RhYiBpbmZvcm1hdGlvbiwgdGhlIG9mZnNldCBnaXZlbiBpbiB0aGUKLQkgcmVsb2NhdGlvbiBtYXkgbm90IGJlIHRoZSBvbmUgd2Ugd2FudDsgd2UgbXVzdCBsZXQgdGhlIHN0YWJzCi0JIG1hY2hpbmVyeSB0ZWxsIHVzIHRoZSBvZmZzZXQuICAqLwotICAgICAgb3V0cmVsLnJfb2Zmc2V0IAotCT0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCSAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JICAgIGlucHV0X3NlY3Rpb24sCi0JICAgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCSAgICByZWwtPnJfb2Zmc2V0KSk7Ci0gICAgICAvKiBJZiB3ZSBkaWRuJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbiBhdCBhbGwsIHRoaXMgdmFsdWUgd2lsbCBiZQotCSAtMS4gICovCi0gICAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQlza2lwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UndmUgZGVjaWRlZCB0byBza2lwIHRoaXMgcmVsb2NhdGlvbiwganVzdCBvdXRwdXQgYW4gZW10cHkKLSAgICAgcmVjb3JkLiAgTm90ZSB0aGF0IFJfTUlQU19OT05FID09IDAsIHNvIHRoYXQgdGhpcyBjYWxsIHRvIG1lbXNldAotICAgICBpcyBhIHdheSBvZiBzZXR0aW5nIFJfVFlQRSB0byBSX01JUFNfTk9ORS4gICovCi0gIGlmIChza2lwKQotICAgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIChvdXRyZWwpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5keDsKLSAgICAgIGJmZF92bWEgc2VjdGlvbl9vZmZzZXQ7Ci0KLSAgICAgIC8qIFdlIG11c3Qgbm93IGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggdG8gdXNlCi0JIGluIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmICghIGluZm8tPnN5bWJvbGljIHx8IChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCXsKLQkgIGluZHggPSBoLT5yb290LmR5bmluZHg7Ci0JICBCRkRfQVNTRVJUIChpbmR4ICE9IC0xKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkgICAgaW5keCA9IDA7Ci0JICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMtPm91dHB1dF9zZWN0aW9uKS0+ZHluaW5keDsKLQkgICAgICBpZiAoaW5keCA9PSAwKQotCQlhYm9ydCAoKTsKLQkgICAgfQotCi0JICAvKiBGaWd1cmUgb3V0IGhvdyBmYXIgdGhlIHRhcmdldCBvZiB0aGUgcmVsb2NhdGlvbiBpcyBmcm9tCi0JICAgICB0aGUgYmVnaW5uaW5nIG9mIGl0cyBzZWN0aW9uLiAgKi8KLQkgIHNlY3Rpb25fb2Zmc2V0ID0gc3ltYm9sIC0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgLyogVGhlIHJlbG9jYXRpb24gd2UncmUgYnVpbGRpbmcgaXMgc2VjdGlvbi1yZWxhdGl2ZS4KLQkgICAgIFRoZXJlZm9yZSwgdGhlIG9yaWdpbmFsIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkIGJ5IHRoZQotCSAgICAgc2VjdGlvbiBvZmZzZXQuICAqLwotCSAgKmFkZGVuZHAgKz0gc3ltYm9sIC0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgLyogTm93LCB0aGUgcmVsb2NhdGlvbiBpcyBqdXN0IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotCSAgc3ltYm9sID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCX0KLSAgICAgIAotICAgICAgLyogSWYgdGhlIHJlbG9jYXRpb24gd2FzIHByZXZpb3VzbHkgYW4gYWJzb2x1dGUgcmVsb2NhdGlvbiwgd2UKLQkgbXVzdCBhZGp1c3QgaXQgYnkgdGhlIHZhbHVlIHdlIGdpdmUgaXQgaW4gdGhlIGR5bmFtaWMgc3ltYm9sCi0JIHRhYmxlLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgIT0gUl9NSVBTX1JFTDMyKQotCSphZGRlbmRwICs9IHN5bWJvbDsKLQotICAgICAgLyogVGhlIHJlbG9jYXRpb24gaXMgYWx3YXlzIGFuIFJFTDMyIHJlbG9jYXRpb24gYmVjYXVzZSB3ZSBkb24ndAotCSBrbm93IHdoZXJlIHRoZSBzaGFyZWQgbGlicmFyeSB3aWxsIHdpbmQgdXAgYXQgbG9hZC10aW1lLiAgKi8KLSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIFJfTUlQU19SRUwzMik7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgb3V0cHV0IG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiB0byByZWZlcmVuY2UgdGhlCi0JIGNvcnJlY3QgbG9jYXRpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgIH0KLQotICAvKiBQdXQgdGhlIHJlbG9jYXRpb24gYmFjayBvdXQuICBXZSBoYXZlIHRvIHVzZSB0aGUgc3BlY2lhbAotICAgICByZWxvY2F0aW9uIG91dHB1dHRlciBpbiB0aGUgNjQtYml0IGNhc2Ugc2luY2UgdGhlIDY0LWJpdAotICAgICByZWxvY2F0aW9uIGZvcm1hdCBpcyBub24tc3RhbmRhcmQuICAqLwotICBpZiAoQUJJXzY0X1AgKG91dHB1dF9iZmQpKQotICAgIHsKLSAgICAgICgqZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpLT5zLT5zd2FwX3JlbG9jX291dCkKLQkob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkgKHNyZWxvYy0+Y29udGVudHMgCi0JICArIHNyZWxvYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsKSkpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCSAgICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCXNyZWxvYy0+Y29udGVudHMpCi0JCQkgICAgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcmVsb2NhdGlvbiByZWZlcmVuY2luZyBILiAgVGhpcwotICAgICBpbmZvcm1hdGlvbiBpcyBsYXRlciBlbWl0dGVkIGluIHRoZSAubXN5bSBzZWN0aW9uLiAgKi8KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgKGgtPm1pbl9keW5fcmVsb2NfaW5kZXggPT0gMCAKLQkgIHx8IHNyZWxvYy0+cmVsb2NfY291bnQgPCBoLT5taW5fZHluX3JlbG9jX2luZGV4KSkKLSAgICBoLT5taW5fZHluX3JlbG9jX2luZGV4ID0gc3JlbG9jLT5yZWxvY19jb3VudDsKLQotICAvKiBXZSd2ZSBub3cgYWRkZWQgYW5vdGhlciByZWxvY2F0aW9uLiAgKi8KLSAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgb3V0cHV0IHNlY3Rpb24gaXMgd3JpdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIKLSAgICAgd2lsbCBiZSB3cml0aW5nIHRvIGl0LiAgKi8KLSAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9mbGFncwotICAgIHw9IFNIRl9XUklURTsKLQotICAvKiBPbiBJUklYNSwgbWFrZSBhbiBlbnRyeSBvZiBjb21wYWN0IHJlbG9jYXRpb24gaW5mby4gICovCi0gIGlmICghIHNraXAgJiYgSVJJWF9DT01QQVQgKG91dHB1dF9iZmQpID09IGljdF9pcml4NSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiogc2NwdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuY29tcGFjdF9yZWwiKTsKLSAgICAgIGJmZF9ieXRlICpjcjsKLQotICAgICAgaWYgKHNjcHQpCi0JewotCSAgRWxmMzJfY3JpbmZvIGNwdHJlbDsKLQotCSAgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCAoY3B0cmVsLCBDUkZfTUlQU19MT05HKTsKLQkgIGNwdHJlbC52YWRkciA9IChyZWwtPnJfb2Zmc2V0Ci0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKHJfdHlwZSA9PSBSX01JUFNfUkVMMzIpCi0JICAgIG1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX1JFTDMyKTsKLQkgIGVsc2UKLQkgICAgbWlwc19lbGZfc2V0X2NyX3R5cGUgKGNwdHJlbCwgQ1JUX01JUFNfV09SRCk7Ci0JICBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byAoY3B0cmVsLCAwKTsKLQkgIGNwdHJlbC5rb25zdCA9ICphZGRlbmRwOwotCi0JICBjciA9IChzY3B0LT5jb250ZW50cwotCQkrIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpKTsKLQkgIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKG91dHB1dF9iZmQsICZjcHRyZWwsCi0JCQkJICAgICAoKEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSBjcgotCQkJCSAgICAgICsgc2NwdC0+cmVsb2NfY291bnQpKTsKLQkgICsrc2NwdC0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUgUkVMT0NBVElPTiAod2hpY2ggY29tZXMgZnJvbQotICAgdGhlIElOUFVUX0JGRCkuICBUaGUgQURERU5EIGlzIHRoZSBhZGRlbmQgdG8gdXNlIGZvciB0aGlzCi0gICBSRUxPQ0FUSU9OOyBSRUxPQ0FUSU9OLT5SX0FEREVORCBpcyBpZ25vcmVkLgotCi0gICBUaGUgcmVzdWx0IG9mIHRoZSByZWxvY2F0aW9uIGNhbGN1bGF0aW9uIGlzIHN0b3JlZCBpbiBWQUxVRVAuCi0gICBSRVFVSVJFX0pBTFhQIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgb3Bjb2RlIHVzZWQgd2l0aCB0aGlzCi0gICByZWxvY2F0aW9uIG11c3QgYmUgSkFMWC4KLQotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJmZF9yZWxvY19jb250aW51ZSBpZiB0aGUgY2FsbGVyIG5lZWQgdGFrZSBubwotICAgZnVydGhlciBhY3Rpb24gcmVnYXJkaW5nIHRoaXMgcmVsb2NhdGlvbiwgYmZkX3JlbG9jX25vdHN1cHBvcnRlZCBpZgotICAgc29tZXRoaW5nIGdvZXMgZHJhbWF0aWNhbGx5IHdyb25nLCBiZmRfcmVsb2Nfb3ZlcmZsb3cgaWYgYW4KLSAgIG92ZXJmbG93IG9jY3VycywgYW5kIGJmZF9yZWxvY19vayB0byBpbmRpY2F0ZSBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gKGFiZmQsIAotCQkJICAgICAgIGlucHV0X2JmZCwKLQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgIGluZm8sCi0JCQkgICAgICAgcmVsb2NhdGlvbiwKLQkJCSAgICAgICBhZGRlbmQsCi0JCQkgICAgICAgaG93dG8sCi0JCQkgICAgICAgbG9jYWxfc3ltcywKLQkJCSAgICAgICBsb2NhbF9zZWN0aW9ucywKLQkJCSAgICAgICB2YWx1ZXAsCi0JCQkgICAgICAgbmFtZXAsCi0JCQkgICAgICAgcmVxdWlyZV9qYWx4cCkgCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLSAgICAgYmZkX3ZtYSAqdmFsdWVwOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGJvb2xlYW4gKnJlcXVpcmVfamFseHA7Ci17Ci0gIC8qIFRoZSBldmVudHVhbCB2YWx1ZSB3ZSB3aWxsIHJldHVybi4gICovCi0gIGJmZF92bWEgdmFsdWU7Ci0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYWdhaW5zdCB3aGljaCB0aGUgcmVsb2NhdGlvbiBpcwotICAgICBvY2N1cnJpbmcuICAqLwotICBiZmRfdm1hIHN5bWJvbCA9IDA7Ci0gIC8qIFRoZSBmaW5hbCBHUCB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgcmVsb2NhdGFibGUsIGV4ZWN1dGFibGUsIG9yCi0gICAgIHNoYXJlZCBvYmplY3QgZmlsZSBiZWluZyBwcm9kdWNlZC4gICovCi0gIGJmZF92bWEgZ3AgPSAoYmZkX3ZtYSkgLSAxOwotICAvKiBUaGUgcGxhY2UgKHNlY3Rpb24gb2Zmc2V0IG9yIGFkZHJlc3MpIG9mIHRoZSBzdG9yYWdlIHVuaXQgYmVpbmcKLSAgICAgcmVsb2NhdGVkLiAgKi8KLSAgYmZkX3ZtYSBwOwotICAvKiBUaGUgdmFsdWUgb2YgR1AgdXNlZCB0byBjcmVhdGUgdGhlIHJlbG9jYXRhYmxlIG9iamVjdC4gICovCi0gIGJmZF92bWEgZ3AwID0gKGJmZF92bWEpIC0gMTsKLSAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGF0IHdoaWNoIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSByZWxvY2F0aW9uIGVudHJ5IHN5bWJvbCwgYWRqdXN0ZWQgYnkgdGhlIGFkZGVuZCwgcmVzaWRlcwotICAgICBkdXJpbmcgZXhlY3V0aW9uLiAgKi8KLSAgYmZkX3ZtYSBnID0gKGJmZF92bWEpIC0gMTsKLSAgLyogVGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhlIHN5bWJvbCByZWZlcmVuY2VkIGJ5IHRoZSByZWxvY2F0aW9uIGlzCi0gICAgIGxvY2F0ZWQuICAqLwotICBhc2VjdGlvbiAqc2VjID0gTlVMTDsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSogaCA9IE5VTEw7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGlzIHJlbG9jYXRpb24gaXMgYSBsb2NhbAotICAgICBzeW1ib2wuICAqLwotICBib29sZWFuIGxvY2FsX3A7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGlzIHJlbG9jYXRpb24gaXMgIl9ncF9kaXNwIi4gICovCi0gIGJvb2xlYW4gZ3BfZGlzcF9wID0gZmFsc2U7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzaXplX3QgZXh0c3ltb2ZmOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBpbnQgcl90eXBlOwotICAvKiBUcnVlIGlmIG92ZXJmbG93IG9jY3VycmVkIGR1cmluZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gdmFsdWUuICAqLwotICBib29sZWFuIG92ZXJmbG93ZWRfcDsKLSAgLyogVHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gcmVmZXJzIHRvIGEgTUlQUzE2IGZ1bmN0aW9uLiAgKi8KLSAgYm9vbGVhbiB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCA9IGZhbHNlOwotCi0gIC8qIFBhcnNlIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWxvY2F0aW9uLT5yX2luZm8pOwotICBwID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgCi0gICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgKyByZWxvY2F0aW9uLT5yX29mZnNldCk7Ci0KLSAgLyogQXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBvdmVyZmxvdy4gICovCi0gIG92ZXJmbG93ZWRfcCA9IGZhbHNlOwotCi0gIC8qIEZpZ3VyZSBvdXQgd2hldGhlciBvciBub3QgdGhlIHN5bWJvbCBpcyBsb2NhbCwgYW5kIGdldCB0aGUgb2Zmc2V0Ci0gICAgIHVzZWQgaW4gdGhlIGFycmF5IG9mIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBsb2NhbF9wID0gbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wIChpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSBsb2NhbF9zZWN0aW9ucyk7Ci0gIGlmICghIGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIGV4dHN5bW9mZiA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIHRhYmxlIGRvZXMgbm90IGZvbGxvdyB0aGUgcnVsZSB0aGF0IGxvY2FsIHN5bWJvbHMKLQkgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWxzLiAgKi8KLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICAgICAgCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotICBpZiAobG9jYWxfcCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0KLSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQotICAgICAgc3ltYm9sID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OKQotCXN5bWJvbCArPSBzeW0tPnN0X3ZhbHVlOwotCi0gICAgICAvKiBNSVBTMTYgdGV4dCBsYWJlbHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2RkLiAgKi8KLSAgICAgIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYpCi0JKytzeW1ib2w7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbCwgZm9yIG91ciBjYWxsZXIuICAqLwotICAgICAgKm5hbWVwID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCXN5bS0+c3RfbmFtZSk7Ci0gICAgICBpZiAoKm5hbWVwID09ICdcMCcpCi0JKm5hbWVwID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCi0gICAgICB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCA9IChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBnbG9iYWwgc3ltYm9scyB3ZSBsb29rIHVwIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2gtdGFibGUuICAqLwotICAgICAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAKLQkgICBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKSBbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKLSAgICAgIC8qIEZpbmQgdGhlIHJlYWwgaGFzaC10YWJsZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnJvb3QudS5pLmxpbms7Ci0gICAgICAKLSAgICAgIC8qIFJlY29yZCB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbCwgZm9yIG91ciBjYWxsZXIuICAqLwotICAgICAgKm5hbWVwID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBpcyB0aGUgc3BlY2lhbCBfZ3BfZGlzcCBzeW1ib2wuICBOb3RlIHRoYXQgc3VjaCBhCi0JIHN5bWJvbCBtdXN0IGFsd2F5cyBiZSBhIGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCAiX2dwX2Rpc3AiKSA9PSAwKQotCXsKLQkgIC8qIFJlbG9jYXRpb25zIGFnYWluc3QgX2dwX2Rpc3AgYXJlIHBlcm1pdHRlZCBvbmx5IHdpdGgKLQkgICAgIFJfTUlQU19ISTE2IGFuZCBSX01JUFNfTE8xNiByZWxvY2F0aW9ucy4gICovCi0JICBpZiAocl90eXBlICE9IFJfTUlQU19ISTE2ICYmIHJfdHlwZSAhPSBSX01JUFNfTE8xNikKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLQkgIGdwX2Rpc3BfcCA9IHRydWU7Ci0JfQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCwgY2FsY3VsYXRlIGl0cyBhZGRyZXNzLiAgTm90ZSB0aGF0Ci0JIF9ncF9kaXNwIGlzIGEgbWFnaWMgc3ltYm9sLCBhbHdheXMgaW1wbGljaXRseSBkZWZpbmVkIGJ5IHRoZQotCSBsaW5rZXIsIHNvIGl0J3MgaW5hcHByb3ByaWF0ZSB0byBjaGVjayB0byBzZWUgd2hldGhlciBvciBub3QKLQkgaXRzIGRlZmluZWQuICAqLwotICAgICAgZWxzZSBpZiAoKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKQotCXsKLQkgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgIHN5bWJvbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUgCi0JCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIGVsc2UKLQkgICAgc3ltYm9sID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCS8qIFdlIGFsbG93IHJlbG9jYXRpb25zIGFnYWluc3QgdW5kZWZpbmVkIHdlYWsgc3ltYm9scywgZ2l2aW5nCi0JICAgaXQgdGhlIHZhbHVlIHplcm8sIHNvIHRoYXQgeW91IGNhbiB1bmRlZmluZWQgd2VhayBmdW5jdGlvbnMKLQkgICBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZXkgZXhpc3QgYnkgbG9va2luZyBhdCB0aGVpcgotCSAgIGFkZHJlc3Nlcy4gICovCi0Jc3ltYm9sID0gMDsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQlzeW1ib2wgPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQ19MSU5LIikgPT0gMCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBsaW5rLCB3ZSBzaG91bGQgaGF2ZSBjcmVhdGVkIGEKLQkgICAgIF9EWU5BTUlDX0xJTksgc3ltYm9sIGluIG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCSAgICAgT3RoZXJ3aXNlLCB3ZSBzaG91bGQgZGVmaW5lIHRoZSBzeW1ib2wgd2l0aCBhIHZhbHVlIG9mIDAuCi0JICAgICBGSVhNRTogSXQgc2hvdWxkIHByb2JhYmx5IGdldCBpbnRvIHRoZSBzeW1ib2wgdGFibGUKLQkgICAgIHNvbWVob3cgYXMgd2VsbC4gICovCi0JICBCRkRfQVNTRVJUICghIGluZm8tPnNoYXJlZCk7Ci0JICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikgPT0gTlVMTCk7Ci0JICBzeW1ib2wgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2NhdGlvbi0+cl9vZmZzZXQpOwotCSAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0JfQotCi0gICAgICB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCA9IChoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpOwotICAgIH0KLSAgCi0gIC8qIElmIHRoaXMgaXMgYSAzMi1iaXQgY2FsbCB0byBhIDE2LWJpdCBmdW5jdGlvbiB3aXRoIGEgc3R1Yiwgd2UKLSAgICAgbmVlZCB0byByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgc3R1YiwgdW5sZXNzIHdlJ3JlIGFscmVhZHkgKmluKgotICAgICBhIHN0dWIuICAqLwotICBpZiAocl90eXBlICE9IFJfTUlQUzE2XzI2ICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICgoaCAhPSBOVUxMICYmIGgtPmZuX3N0dWIgIT0gTlVMTCkKLQkgIHx8IChsb2NhbF9wICYmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfc3R1YnMgIT0gTlVMTAotCSAgICAgICYmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfc3R1YnNbcl9zeW1uZHhdICE9IE5VTEwpKQotICAgICAgJiYgIW1pcHNfZWxmX3N0dWJfc2VjdGlvbl9wIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSAzMi1iaXQgY2FsbCB0byBhIDE2LWJpdCBmdW5jdGlvbi4gIFdlIHNob3VsZAotCSBoYXZlIGFscmVhZHkgbm90aWNlZCB0aGF0IHdlIHdlcmUgZ29pbmcgdG8gbmVlZCB0aGUKLQkgc3R1Yi4gICovCi0gICAgICBpZiAobG9jYWxfcCkKLQlzZWMgPSBlbGZfdGRhdGEgKGlucHV0X2JmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XTsKLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUIChoLT5uZWVkX2ZuX3N0dWIpOwotCSAgc2VjID0gaC0+Zm5fc3R1YjsKLQl9Ci0KLSAgICAgIHN5bWJvbCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci0gIC8qIElmIHRoaXMgaXMgYSAxNi1iaXQgY2FsbCB0byBhIDMyLWJpdCBmdW5jdGlvbiB3aXRoIGEgc3R1Yiwgd2UKLSAgICAgbmVlZCB0byByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgc3R1Yi4gICovCi0gIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNiAmJiAhaW5mby0+cmVsb2NhdGVhYmxlCi0JICAgJiYgaCAhPSBOVUxMIAotCSAgICYmIChoLT5jYWxsX3N0dWIgIT0gTlVMTCB8fCBoLT5jYWxsX2ZwX3N0dWIgIT0gTlVMTCkKLQkgICAmJiAhdGFyZ2V0X2lzXzE2X2JpdF9jb2RlX3ApCi0gICAgewotICAgICAgLyogSWYgYm90aCBjYWxsX3N0dWIgYW5kIGNhbGxfZnBfc3R1YiBhcmUgZGVmaW5lZCwgd2UgY2FuIGZpZ3VyZQotCSBvdXQgd2hpY2ggb25lIHRvIHVzZSBieSBzZWVpbmcgd2hpY2ggb25lIGFwcGVhcnMgaW4gdGhlIGlucHV0Ci0JIGZpbGUuICAqLwotICAgICAgaWYgKGgtPmNhbGxfc3R1YiAhPSBOVUxMICYmIGgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICBzZWMgPSBOVUxMOwotCSAgZm9yIChvID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBvKSwKLQkJCSAgIENBTExfRlBfU1RVQiwgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0JCXsKLQkJICBzZWMgPSBoLT5jYWxsX2ZwX3N0dWI7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKHNlYyA9PSBOVUxMKQotCSAgICBzZWMgPSBoLT5jYWxsX3N0dWI7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+Y2FsbF9zdHViICE9IE5VTEwpCi0Jc2VjID0gaC0+Y2FsbF9zdHViOwotICAgICAgZWxzZQotCXNlYyA9IGgtPmNhbGxfZnBfc3R1YjsKLQotICAgICAgQkZEX0FTU0VSVCAoc2VjLT5fcmF3X3NpemUgPiAwKTsKLSAgICAgIHN5bWJvbCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci0KLSAgLyogQ2FsbHMgZnJvbSAxNi1iaXQgY29kZSB0byAzMi1iaXQgY29kZSBhbmQgdmljZSB2ZXJzYSByZXF1aXJlIHRoZQotICAgICBzcGVjaWFsIGphbHggaW5zdHJ1Y3Rpb24uICAqLwotICAqcmVxdWlyZV9qYWx4cCA9ICghaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICAmJiAoKHJfdHlwZSA9PSBSX01JUFMxNl8yNikgIT0gdGFyZ2V0X2lzXzE2X2JpdF9jb2RlX3ApKTsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZGV0ZXJtaW5lZCB0aGUgR09UIG9mZnNldCwgb3IgdGhlIEdQIHZhbHVlLAotICAgICBhbmQgd2UncmUgZ29pbmcgdG8gbmVlZCBpdCwgZ2V0IGl0IG5vdy4gICovCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfTUlQU19DQUxMMTY6Ci0gICAgY2FzZSBSX01JUFNfR09UMTY6Ci0gICAgY2FzZSBSX01JUFNfR09UX0RJU1A6Ci0gICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0gICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotICAgIGNhc2UgUl9NSVBTX0dPVF9MTzE2OgotICAgIGNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLSAgICAgIC8qIEZpbmQgdGhlIGluZGV4IGludG8gdGhlIEdPVCB3aGVyZSB0aGlzIHZhbHVlIGlzIGxvY2F0ZWQuICAqLwotICAgICAgaWYgKCFsb2NhbF9wKQotCXsKLQkgIEJGRF9BU1NFUlQgKGFkZGVuZCA9PSAwKTsKLQkgIGcgPSBtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4IAotCSAgICAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JICAgICAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkqKSBoKTsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTX0dPVDE2KQotCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBjcmVhdGUgYSBsb2NhbCBHT1QgZW50cnkgaGVyZTsgdGhlCi0JICAgY2FsY3VsYXRpb24gZm9yIGEgbG9jYWwgR09UMTYgZW50cnkgZG9lcyBub3QgaW52b2x2ZSBHLiAgKi8KLQlicmVhazsKLSAgICAgIGVsc2UKLQl7Ci0JICBnID0gbWlwc19lbGZfbG9jYWxfZ290X2luZGV4IChhYmZkLCBpbmZvLCBzeW1ib2wgKyBhZGRlbmQpOwotCSAgaWYgKGcgPT0gKGJmZF92bWEpIC0xKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBDb252ZXJ0IEdPVCBpbmRpY2VzIHRvIGFjdHVhbCBvZmZzZXRzLiAgKi8KLSAgICAgIGcgPSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkgIGFiZmQsIGcpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19ISTE2OgotICAgIGNhc2UgUl9NSVBTX0xPMTY6Ci0gICAgY2FzZSBSX01JUFNfR1BSRUwxNjoKLSAgICBjYXNlIFJfTUlQU19HUFJFTDMyOgotICAgIGNhc2UgUl9NSVBTX0xJVEVSQUw6Ci0gICAgICBncDAgPSBfYmZkX2dldF9ncF92YWx1ZSAoaW5wdXRfYmZkKTsKLSAgICAgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIHJlbG9jYXRpb24gaXMgYmVpbmcgcGVyZm9ybWVkLiAgKi8KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9NSVBTX05PTkU6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gICAgY2FzZSBSX01JUFNfMTY6Ci0gICAgICB2YWx1ZSA9IHN5bWJvbCArIG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KTsKLSAgICAgIG92ZXJmbG93ZWRfcCA9IG1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlLCAxNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTXzMyOgotICAgIGNhc2UgUl9NSVBTX1JFTDMyOgotICAgIGNhc2UgUl9NSVBTXzY0OgotICAgICAgaWYgKChpbmZvLT5zaGFyZWQKLQkgICB8fCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgICAgICAgJiYgaCAhPSBOVUxMCi0JICAgICAgICYmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikKLQkJICAgPT0gMCkpKQotCSAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXsKLQkgIC8qIElmIHdlJ3JlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIG9yIHRoaXMgcmVsb2NhdGlvbiBpcwotCSAgICAgYWdhaW5zdCBhIHN5bWJvbCBpbiBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHdlIGNhbid0IGtub3cKLQkgICAgIHdoZXJlIHRoZSBzeW1ib2wgd2lsbCBlbmQgdXAuICBTbywgd2UgY3JlYXRlIGEgcmVsb2NhdGlvbgotCSAgICAgcmVjb3JkIGluIHRoZSBvdXRwdXQsIGFuZCBsZWF2ZSB0aGUgam9iIHVwIHRvIHRoZSBkeW5hbWljCi0JICAgICBsaW5rZXIuICAqLwotCSAgdmFsdWUgPSBhZGRlbmQ7Ci0JICBpZiAoIW1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24gKGFiZmQsIAotCQkJCQkJICAgaW5mbywgCi0JCQkJCQkgICByZWxvY2F0aW9uLAotCQkJCQkJICAgaCwKLQkJCQkJCSAgIHNlYywKLQkJCQkJCSAgIHN5bWJvbCwKLQkJCQkJCSAgICZ2YWx1ZSwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChyX3R5cGUgIT0gUl9NSVBTX1JFTDMyKQotCSAgICB2YWx1ZSA9IHN5bWJvbCArIGFkZGVuZDsKLQkgIGVsc2UKLQkgICAgdmFsdWUgPSBhZGRlbmQ7Ci0JfQotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQUzE2XzI2OgotICAgICAgLyogVGhlIGNhbGN1bGF0aW9uIGZvciBSX01JUFNfMjYgaXMganVzdCB0aGUgc2FtZSBhcyBmb3IgYW4KLQkgUl9NSVBTXzI2LiAgSXQncyBvbmx5IHRoZSBzdG9yYWdlIG9mIHRoZSByZWxvY2F0ZWQgZmllbGQgaW50bwotCSB0aGUgb3V0cHV0IGZpbGUgdGhhdCdzIGRpZmZlcmVudC4gIFRoYXQncyBoYW5kbGVkIGluCi0JIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4gIFNvLCB3ZSBqdXN0IGZhbGwgdGhyb3VnaCB0byB0aGUKLQkgUl9NSVBTXzI2IGNhc2UgaGVyZS4gICovCi0gICAgY2FzZSBSX01JUFNfMjY6Ci0gICAgICBpZiAobG9jYWxfcCkKLQl2YWx1ZSA9ICgoKGFkZGVuZCA8PCAyKSB8IChwICYgMHhmMDAwMDAwMCkpICsgc3ltYm9sKSA+PiAyOwotICAgICAgZWxzZQotCXZhbHVlID0gKG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQgPDwgMiwgMjgpICsgc3ltYm9sKSA+PiAyOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19ISTE2OgotICAgICAgaWYgKCFncF9kaXNwX3ApCi0JewotCSAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoIChhZGRlbmQgKyBzeW1ib2wpOwotCSAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2ggKGFkZGVuZCArIGdwIC0gcCk7Ci0JICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfTE8xNjoKLSAgICAgIGlmICghZ3BfZGlzcF9wKQotCXZhbHVlID0gKHN5bWJvbCArIGFkZGVuZCkgJiBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSBhZGRlbmQgKyBncCAtIHAgKyA0OwotCSAgLyogVGhlIE1JUFMgQUJJIHJlcXVpcmVzIGNoZWNraW5nIHRoZSBSX01JUFNfTE8xNiByZWxvY2F0aW9uCi0JICAgICBmb3Igb3ZlcmZsb3cuICBCdXQsIG9uLCBzYXksIElyaXggNSwgcmVsb2NhdGlvbnMgYWdhaW5zdAotCSAgICAgX2dwX2Rpc3AgYXJlIG5vcm1hbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSAuY3Bsb2FkCi0JICAgICBwc2V1ZG8tb3AuICBJdCBnZW5lcmF0ZXMgY29kZSB0aGF0IG5vcm1hbGx5IGxvb2tzIGxpa2UKLQkgICAgIHRoaXM6Ci0KLQkgICAgICAgbHVpICAgICRncCwlaGkoX2dwX2Rpc3ApCi0JICAgICAgIGFkZGl1ICAkZ3AsJGdwLCVsbyhfZ3BfZGlzcCkKLQkgICAgICAgYWRkdSAgICRncCwkZ3AsJHQ5Ci0KLQkgICAgIEhlcmUgJHQ5IGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQsCi0JICAgICBhcyByZXF1aXJlZCBieSB0aGUgTUlQUyBFTEYgQUJJLiAgVGhlIFJfTUlQU19MTzE2Ci0JICAgICByZWxvY2F0aW9uIGNhbiBlYXNpbHkgb3ZlcmZsb3cgaW4gdGhpcyBzaXR1YXRpb24sIGJ1dCB0aGUKLQkgICAgIFJfTUlQU19ISTE2IHJlbG9jYXRpb24gd2lsbCBoYW5kbGUgdGhlIG92ZXJmbG93LgotCSAgICAgVGhlcmVmb3JlLCB3ZSBjb25zaWRlciB0aGlzIGEgYnVnIGluIHRoZSBNSVBTIEFCSSwgYW5kIGRvCi0JICAgICBub3QgY2hlY2sgZm9yIG92ZXJmbG93IGhlcmUuICAqLwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfTElURVJBTDoKLSAgICAgIC8qIEJlY2F1c2Ugd2UgZG9uJ3QgbWVyZ2UgbGl0ZXJhbCBzZWN0aW9ucywgd2UgY2FuIGhhbmRsZSB0aGlzCi0JIGp1c3QgbGlrZSBSX01JUFNfR1BSRUwxNi4gIEluIHRoZSBsb25nIHJ1biwgd2Ugc2hvdWxkIG1lcmdlCi0JIHNoYXJlZCBsaXRlcmFscywgYW5kIHRoZW4gd2Ugd2lsbCBuZWVkIHRvIGFkZGl0aW9uYWwgd29yawotCSBoZXJlLiAgKi8KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQotICAgIGNhc2UgUl9NSVBTMTZfR1BSRUw6Ci0gICAgICAvKiBUaGUgUl9NSVBTMTZfR1BSRUwgcGVyZm9ybXMgdGhlIHNhbWUgY2FsY3VsYXRpb24gYXMKLQkgUl9NSVBTX0dQUkVMMTYsIGJ1dCBzdG9yZXMgdGhlIHJlbG9jYXRlZCBiaXRzIGluIGEgZGlmZmVyZW50Ci0JIG9yZGVyLiAgV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGhlcmU7IHRoZQotCSBkaWZmZXJlbmNlcyBhcmUgaGFuZGxlZCBpbiBtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9NSVBTX0dQUkVMMTY6Ci0gICAgICBpZiAobG9jYWxfcCkKLQl2YWx1ZSA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KSArIHN5bWJvbCArIGdwMCAtIGdwOwotICAgICAgZWxzZQotCXZhbHVlID0gbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCwgMTYpICsgc3ltYm9sIC0gZ3A7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19HT1QxNjoKLSAgICAgIGlmIChsb2NhbF9wKQotCXsKLQkgIHZhbHVlID0gbWlwc19lbGZfZ290MTZfZW50cnkgKGFiZmQsIGluZm8sIHN5bWJvbCArIGFkZGVuZCk7Ci0JICBpZiAodmFsdWUgPT0gKGJmZF92bWEpIC0xKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB2YWx1ZSAKLQkgICAgPSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkgICAgICBhYmZkLAotCQkJCQkgICAgICB2YWx1ZSk7Ci0JICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCi0gICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgIGNhc2UgUl9NSVBTX0dPVF9ESVNQOgotICAgICAgdmFsdWUgPSBnOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfR1BSRUwzMjoKLSAgICAgIHZhbHVlID0gKGFkZGVuZCArIHN5bWJvbCArIGdwMCAtIGdwKSAmIGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfUEMxNjoKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCwgMTYpICsgc3ltYm9sIC0gcDsKLSAgICAgIHZhbHVlID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHZhbHVlIC8gNCk7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HT1RfSEkxNjoKLSAgICBjYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0gICAgICAvKiBXZSdyZSBhbGxvd2VkIHRvIGhhbmRsZSB0aGVzZSB0d28gcmVsb2NhdGlvbnMgaWRlbnRpY2FsbHkuCi0JIFRoZSBkeW5hbWljIGxpbmtlciBpcyBhbGxvd2VkIHRvIGhhbmRsZSB0aGUgQ0FMTCByZWxvY2F0aW9ucwotCSBkaWZmZXJlbnRseSBieSBjcmVhdGluZyBhIGxhenkgZXZhbHVhdGlvbiBzdHViLiAgKi8KLSAgICAgIHZhbHVlID0gZzsKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfaGlnaCAodmFsdWUpOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLSAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0gICAgICB2YWx1ZSA9IGcgJiBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0dPVF9QQUdFOgotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9nb3RfcGFnZSAoYWJmZCwgaW5mbywgc3ltYm9sICsgYWRkZW5kLCBOVUxMKTsKLSAgICAgIGlmICh2YWx1ZSA9PSAoYmZkX3ZtYSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkgICAgICBhYmZkLAotCQkJCQkgICAgICB2YWx1ZSk7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19HT1RfT0ZTVDoKLSAgICAgIG1pcHNfZWxmX2dvdF9wYWdlIChhYmZkLCBpbmZvLCBzeW1ib2wgKyBhZGRlbmQsICZ2YWx1ZSk7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19TVUI6Ci0gICAgICB2YWx1ZSA9IHN5bWJvbCAtIGFkZGVuZDsKLSAgICAgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfSElHSEVSOgotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoZXIgKGFkZGVuZCArIHN5bWJvbCk7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0hJR0hFU1Q6Ci0gICAgICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2hlc3QgKGFkZGVuZCArIHN5bWJvbCk7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9NSVBTX1NDTl9ESVNQOgotICAgICAgdmFsdWUgPSBzeW1ib2wgKyBhZGRlbmQgLSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX1BKVU1QOgotICAgIGNhc2UgUl9NSVBTX0pBTFI6Ci0gICAgICAvKiBCb3RoIG9mIHRoZXNlIG1heSBiZSBpZ25vcmVkLiAgUl9NSVBTX0pBTFIgaXMgYW4gb3B0aW1pemF0aW9uCi0JIGhpbnQ7IHdlIGNvdWxkIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkgaG9ub3JpbmcgdGhhdCBoaW50LiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgICBjYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotICAgICAgLyogV2UgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGVzZSBhdCBwcmVzZW50LiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQW4gdW5yZWNvZ25pemVkIHJlbG9jYXRpb24gdHlwZS4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIFZBTFVFIGZvciBvdXIgY2FsbGVyLiAgKi8KLSAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gb3ZlcmZsb3dlZF9wID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotfQotCi0vKiBPYnRhaW4gdGhlIGZpZWxkIHJlbG9jYXRlZCBieSBSRUxPQ0FUSU9OLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX29idGFpbl9jb250ZW50cyAoaG93dG8sIHJlbG9jYXRpb24sIGlucHV0X2JmZCwgY29udGVudHMpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgYmZkX3ZtYSB4OwotICBiZmRfYnl0ZSAqbG9jYXRpb24gPSBjb250ZW50cyArIHJlbG9jYXRpb24tPnJfb2Zmc2V0OwotCi0gIC8qIE9idGFpbiB0aGUgYnl0ZXMuICAqLwotICB4ID0gYmZkX2dldCAoOCAqIGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pLCBpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLQotICBpZiAoKEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKSA9PSBSX01JUFMxNl8yNgotICAgICAgIHx8IEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKSA9PSBSX01JUFMxNl9HUFJFTCkKLSAgICAgICYmIGJmZF9saXR0bGVfZW5kaWFuIChpbnB1dF9iZmQpKQotICAgIC8qIFRoZSB0d28gMTYtYml0IHdvcmRzIHdpbGwgYmUgcmV2ZXJzZWQgb24gYSBsaXR0bGUtZW5kaWFuCi0gICAgICAgc3lzdGVtLiAgU2VlIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KLSAgICB4ID0gKCgoeCAmIDB4ZmZmZikgPDwgMTYpIHwgKCh4ICYgMHhmZmZmMDAwMCkgPj4gMTYpKTsKLQotICByZXR1cm4geDsKLX0KLQotLyogSXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIFJFTE9DQVRJT04gaXMgdGhlCi0gICBWQUxVRS4gIFVzZSBIT1dUTyB0byBwbGFjZSBWQUxVRSBpbnRvIHRoZSBvdXRwdXQgZmlsZSBhdCB0aGUKLSAgIGFwcHJvcHJpYXRlIHBvc2l0aW9uLiAgVGhlIFNFQ1RJT04gaXMgdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhlCi0gICByZWxvY2F0aW9uIGFwcGxpZXMuICBJZiBSRVFVSVJFX0pBTFggaXMgdHJ1ZSwgdGhlbiB0aGUgb3Bjb2RlIHVzZWQKLSAgIGZvciB0aGUgcmVsb2NhdGlvbiBtdXN0IGJlIGVpdGhlciBKQUwgb3IgSkFMWCwgYW5kIGl0IGlzCi0gICB1bmNvbmRpdGlvbmFsbHkgY29udmVydGVkIHRvIEpBTFguCi0KLSAgIFJldHVybnMgZmFsc2UgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGluZm8sIGhvd3RvLCByZWxvY2F0aW9uLCB2YWx1ZSwKLQkJCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAKLQkJCSAgICAgY29udGVudHMsIHJlcXVpcmVfamFseCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9qYWx4OwotewotICBiZmRfdm1hIHg7Ci0gIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgaW50IHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLQotICAvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSByZWxvY2F0aW9uIGlzIG9jY3VycmluZy4gICovCi0gIGxvY2F0aW9uID0gY29udGVudHMgKyByZWxvY2F0aW9uLT5yX29mZnNldDsKLQotICAvKiBPYnRhaW4gdGhlIGN1cnJlbnQgdmFsdWUuICAqLwotICB4ID0gbWlwc19lbGZfb2J0YWluX2NvbnRlbnRzIChob3d0bywgcmVsb2NhdGlvbiwgaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0KLSAgLyogQ2xlYXIgdGhlIGZpZWxkIHdlIGFyZSBzZXR0aW5nLiAgKi8KLSAgeCAmPSB+aG93dG8tPmRzdF9tYXNrOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIFJfTUlQUzE2XzI2IHJlbG9jYXRpb24sIHdlIG11c3Qgc3RvcmUgdGhlCi0gICAgIHZhbHVlIGluIGEgZnVubnkgd2F5LiAgKi8KLSAgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNikKLSAgICB7Ci0gICAgICAvKiBSX01JUFMxNl8yNiBpcyB1c2VkIGZvciB0aGUgbWlwczE2IGphbCBhbmQgamFseCBpbnN0cnVjdGlvbnMuCi0JIE1vc3QgbWlwczE2IGluc3RydWN0aW9ucyBhcmUgMTYgYml0cywgYnV0IHRoZXNlIGluc3RydWN0aW9ucwotCSBhcmUgMzIgYml0cy4KLQotCSBUaGUgZm9ybWF0IG9mIHRoZXNlIGluc3RydWN0aW9ucyBpczoKLQotCSArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JICEgICAgIEpBTFggICAgICEgWCEgICBJbW0gMjA6MTYgICEgICBJbW0gMjU6MjEgICEKLQkgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAhCSAgCSAgSW1tZWRpYXRlICAxNTowCQkgICAgIQotCSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JIAotCSBKQUxYIGlzIHRoZSA1LWJpdCB2YWx1ZSAwMDAxMS4gIFggaXMgMCBmb3IgamFsLCAxIGZvciBqYWx4LgotCSBOb3RlIHRoYXQgdGhlIGltbWVkaWF0ZSB2YWx1ZSBpbiB0aGUgZmlyc3Qgd29yZCBpcyBzd2FwcGVkLgotCi0JIFdoZW4gcHJvZHVjaW5nIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLCBSX01JUFMxNl8yNiBpcwotCSBoYW5kbGVkIG1vc3RseSBsaWtlIFJfTUlQU18yNi4gIEluIHBhcnRpY3VsYXIsIHRoZSBhZGRlbmQgaXMKLQkgc3RvcmVkIGFzIGEgc3RyYWlnaHQgMjYtYml0IHZhbHVlIGluIGEgMzItYml0IGluc3RydWN0aW9uLgotCSAoZ2FzIG1ha2VzIGxpZmUgc2ltcGxlciBmb3IgaXRzZWxmIGJ5IG5ldmVyIGFkanVzdGluZyBhCi0JIFJfTUlQUzE2XzI2IHJlbG9jIHRvIGJlIGFnYWluc3QgYSBzZWN0aW9uLCBzbyB0aGUgYWRkZW5kIGlzCi0JIGFsd2F5cyB6ZXJvKS4gIEhvd2V2ZXIsIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gaXMgc3RvcmVkIGFzIDIKLQkgMTYtYml0IHZhbHVlcywgcmF0aGVyIHRoYW4gYSBzaW5nbGUgMzItYml0IHZhbHVlLiAgSW4gYQotCSBiaWctZW5kaWFuIGZpbGUsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWU7IGluIGEgbGl0dGxlLWVuZGlhbgotCSBmaWxlLCB0aGUgdHdvIDE2LWJpdCBoYWx2ZXMgb2YgdGhlIDMyIGJpdCB2YWx1ZSBhcmUgc3dhcHBlZC4KLQkgVGhpcyBpcyBzbyB0aGF0IGEgZGlzYXNzZW1ibGVyIGNhbiByZWNvZ25pemUgdGhlIGphbAotCSBpbnN0cnVjdGlvbi4KLQotCSBXaGVuIGRvaW5nIGEgZmluYWwgbGluaywgUl9NSVBTMTZfMjYgaXMgdHJlYXRlZCBhcyBhIDMyIGJpdAotCSBpbnN0cnVjdGlvbiBzdG9yZWQgYXMgdHdvIDE2LWJpdCB2YWx1ZXMuICBUaGUgYWRkZW5kIEEgaXMgdGhlCi0JIGNvbnRlbnRzIG9mIHRoZSB0YXJnMjYgZmllbGQuICBUaGUgY2FsY3VsYXRpb24gaXMgdGhlIHNhbWUgYXMKLQkgUl9NSVBTXzI2LiAgV2hlbiBzdG9yaW5nIHRoZSBjYWxjdWxhdGVkIHZhbHVlLCByZW9yZGVyIHRoZQotCSBpbW1lZGlhdGUgdmFsdWUgYXMgc2hvd24gYWJvdmUsIGFuZCBkb24ndCBmb3JnZXQgdG8gc3RvcmUgdGhlCi0JIHZhbHVlIGFzIHR3byAxNi1iaXQgdmFsdWVzLgotCi0JIFRvIHB1dCBpdCBpbiBNSVBTIEFCSSB0ZXJtcywgdGhlIHJlbG9jYXRpb24gZmllbGQgaXMgVC10YXJnMjYtMTYsCi0JIGRlZmluZWQgYXMKLQkgCi0JIGJpZy1lbmRpYW46Ci0JICstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwKLQkgfCAgICAgICAgfCAgICB0YXJnMjYtMTYgICAgICAgICB8Ci0JIHwzMSAgICAyNnwyNSAgICAgICAgICAgICAgICAgICAwfAotCSArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgCi0JIGxpdHRsZS1lbmRpYW46Ci0JICstLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tKwotCSB8ICAgICAgICAgIHwgICAgICB8ICAgICAgICAgICAgIHwKLQkgfCAgc3ViMSAgICB8ICAgICAgfCAgICAgc3ViMiAgICB8Ci0JIHwwICAgICAgICA5fDEwICAxNXwxNiAgICAgICAgIDMxfAotCSArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgd2hlcmUgdGFyZzI2LTE2IGlzIHN1YjEgZm9sbG93ZWQgYnkgc3ViMiAoaS5lLiwgdGhlIGFkZGVuZCBmaWVsZCBBIGlzCi0JICgoc3ViMSA8PCAxNikgfCBzdWIyKSkuCi0JIAotCSBXaGVuIHByb2R1Y2luZyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgdGhlIGNhbGN1bGF0aW9uIGlzCi0JICgoKEEgPCAyKSB8IChQICYgMHhmMDAwMDAwMCkgKyBTKSA+PiAyKQotCSBXaGVuIHByb2R1Y2luZyBhIGZ1bGx5IGxpbmtlZCBmaWxlLCB0aGUgY2FsY3VsYXRpb24gaXMKLQkgbGV0IFIgPSAoKChBIDwgMikgfCAoUCAmIDB4ZjAwMDAwMDApICsgUykgPj4gMikKLQkgKChSICYgMHgxZjAwMDApIDw8IDUpIHwgKChSICYgMHgzZTAwMDAwKSA+PiA1KSB8IChSICYgMHhmZmZmKSAgKi8KLQotICAgICAgaWYgKCFpbmZvLT5yZWxvY2F0ZWFibGUpCi0JLyogU2h1ZmZsZSB0aGUgYml0cyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgYWJvdmUuICAqLwotCXZhbHVlID0gKCgodmFsdWUgJiAweDFmMDAwMCkgPDwgNSkgCi0JCSB8ICgodmFsdWUgJiAweDNlMDAwMDApID4+IDUpIAotCQkgfCAodmFsdWUgJiAweGZmZmYpKTsKLSAgICAgIAotICAgIH0KLSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQUzE2X0dQUkVMKQotICAgIHsKLSAgICAgIC8qIFJfTUlQUzE2X0dQUkVMIGlzIHVzZWQgZm9yIEdQLXJlbGF0aXZlIGFkZHJlc3NpbmcgaW4gbWlwczE2Ci0JIG1vZGUuICBBIHR5cGljYWwgaW5zdHJ1Y3Rpb24gd2lsbCBoYXZlIGEgZm9ybWF0IGxpa2UgdGhpczoKLQotCSArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JICEgICAgRVhURU5EICAgICEgICAgIEltbSAxMDo1ICAgICEgICBJbW0gMTU6MTEgICEKLQkgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAhICAgIE1ham9yICAgICAhICAgcnggICAhICAgcnkgICAhICAgSW1tICA0OjAgICAhCi0JICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgCi0JIEVYVEVORCBpcyB0aGUgZml2ZSBiaXQgdmFsdWUgMTExMTAuICBNYWpvciBpcyB0aGUgaW5zdHJ1Y3Rpb24KLQkgb3Bjb2RlLgotCSAKLQkgVGhpcyBpcyBoYW5kbGVkIGV4YWN0bHkgbGlrZSBSX01JUFNfR1BSRUwxNiwgZXhjZXB0IHRoYXQgdGhlCi0JIGFkZGVuZCBpcyByZXRyaWV2ZWQgYW5kIHN0b3JlZCBhcyBzaG93biBpbiB0aGlzIGRpYWdyYW07IHRoYXQKLQkgaXMsIHRoZSBJbW0gZmllbGRzIGFib3ZlIHJlcGxhY2UgdGhlIFYtcmVsMTYgZmllbGQuICAKLQotICAgICAgICAgQWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyBzaHVmZmxlIHRoZSBiaXRzIGFwcHJvcHJpYXRlbHkuICBBcwotCSBhYm92ZSwgdGhlIHR3byAxNi1iaXQgaGFsdmVzIG11c3QgYmUgc3dhcHBlZCBvbiBhCi0JIGxpdHRsZS1lbmRpYW4gc3lzdGVtLiAgKi8KLSAgICAgIHZhbHVlID0gKCgodmFsdWUgJiAweDdlMCkgPDwgMTYpCi0JICAgICAgIHwgKCh2YWx1ZSAmIDB4ZjgwMCkgPDwgNSkKLQkgICAgICAgfCAodmFsdWUgJiAweDFmKSk7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmllbGQuICAqLwotICB4IHw9ICh2YWx1ZSAmIGhvd3RvLT5kc3RfbWFzayk7Ci0KLSAgLyogSWYgcmVxdWlyZWQsIHR1cm4gSkFMIGludG8gSkFMWC4gICovCi0gIGlmIChyZXF1aXJlX2phbHgpCi0gICAgewotICAgICAgYm9vbGVhbiBvazsKLSAgICAgIGJmZF92bWEgb3Bjb2RlID0geCA+PiAyNjsKLSAgICAgIGJmZF92bWEgamFseF9vcGNvZGU7Ci0KLSAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgb3Bjb2RlIGlzIGFscmVhZHkgSkFMIG9yIEpBTFguICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNikKLQl7Ci0JICBvayA9ICgob3Bjb2RlID09IDB4NikgfHwgKG9wY29kZSA9PSAweDcpKTsKLQkgIGphbHhfb3Bjb2RlID0gMHg3OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvayA9ICgob3Bjb2RlID09IDB4MykgfHwgKG9wY29kZSA9PSAweDFkKSk7Ci0JICBqYWx4X29wY29kZSA9IDB4MWQ7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgb3Bjb2RlIGlzIG5vdCBKQUwgb3IgSkFMWCwgdGhlcmUncyBhIHByb2JsZW0uICAqLwotICAgICAgaWYgKCFvaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiAlcysweCVseDoganVtcCB0byBzdHViIHJvdXRpbmUgd2hpY2ggaXMgbm90IGphbCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICAgIGlucHV0X3NlY3Rpb24tPm5hbWUsCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsb2NhdGlvbi0+cl9vZmZzZXQpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBNYWtlIHRoaXMgdGhlIEpBTFggb3Bjb2RlLiAgKi8KLSAgICAgIHggPSAoeCAmIH4oMHgzZiA8PCAyNikpIHwgKGphbHhfb3Bjb2RlIDw8IDI2KTsKLSAgICB9Ci0KLSAgLyogU3dhcCB0aGUgaGlnaC0gYW5kIGxvdy1vcmRlciAxNiBiaXRzIG9uIGxpdHRsZS1lbmRpYW4gc3lzdGVtcwotICAgICB3aGVuIGRvaW5nIGEgTUlQUzE2IHJlbG9jYXRpb24uICAqLwotICBpZiAoKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCB8fCByX3R5cGUgPT0gUl9NSVBTMTZfMjYpCi0gICAgICAmJiBiZmRfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSkKLSAgICB4ID0gKCgoeCAmIDB4ZmZmZikgPDwgMTYpIHwgKCh4ICYgMHhmZmZmMDAwMCkgPj4gMTYpKTsKLSAgCi0gIC8qIFB1dCB0aGUgdmFsdWUgaW50byB0aGUgb3V0cHV0LiAgKi8KLSAgYmZkX3B1dCAoOCAqIGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pLCBpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiBTRUNUSU9OIGlzIGEgTUlQUzE2IHN0dWIgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9zdHViX3NlY3Rpb25fcCAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBjb25zdCBjaGFyICpuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pOwotCi0gIHJldHVybiAoc3RybmNtcCAobmFtZSwgRk5fU1RVQiwgc2l6ZW9mIEZOX1NUVUIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChuYW1lLCBDQUxMX1NUVUIsIHNpemVvZiBDQUxMX1NUVUIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChuYW1lLCBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKTsKLX0KLQotLyogUmVsb2NhdGUgYSBNSVBTIEVMRiBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotICBiZmRfdm1hIGFkZGVuZDsKLSAgYm9vbGVhbiB1c2Vfc2F2ZWRfYWRkZW5kX3AgPSBmYWxzZTsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAob3V0cHV0X2JmZCk7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgKytyZWwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJvb2xlYW4gcmVxdWlyZV9qYWx4OwotICAgICAgLyogVHJ1ZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBhIFJFTEEgcmVsb2NhdGlvbiwgcmF0aGVyIHRoYW4gYQotICAgICAgICAgUkVMIHJlbG9jYXRpb24uICAqLwotICAgICAgYm9vbGVhbiByZWxhX3JlbG9jYXRpb25fcCA9IHRydWU7Ci0gICAgICBpbnQgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHJlbG9jYXRpb24gaG93dG8gZm9yIHRoaXMgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAocl90eXBlID09IFJfTUlQU182NCAmJiAhQUJJXzY0X1AgKG91dHB1dF9iZmQpKQotCXsKLQkgIC8qIFNvbWUgMzItYml0IGNvZGUgdXNlcyBSX01JUFNfNjQuICBJbiBwYXJ0aWN1bGFyLCBwZW9wbGUgdXNlCi0JICAgICA2NC1iaXQgY29kZSwgYnV0IG1ha2Ugc3VyZSBhbGwgdGhlaXIgYWRkcmVzc2VzIGFyZSBpbiB0aGUgCi0JICAgICBsb3dlcm1vc3Qgb3IgdXBwZXJtb3N0IDMyLWJpdCBzZWN0aW9uIG9mIHRoZSA2NC1iaXQgYWRkcmVzcwotCSAgICAgc3BhY2UuICBUaHVzLCB3aGVuIHRoZXkgdXNlIGFuIFJfTUlQU182NCB0aGV5IG1lYW4gd2hhdCBpcwotCSAgICAgdXN1YWxseSBtZWFudCBieSBSX01JUFNfMzIsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZQotCSAgICAgc3RvcmVkIHZhbHVlIGlzIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cy4gICovCi0JICBob3d0byA9IGVsZl9taXBzX2hvd3RvX3RhYmxlICsgUl9NSVBTXzMyOwotCi0JICAvKiBPbiBiaWctZW5kaWFuIHN5c3RlbXMsIHdlIG5lZWQgdG8gbGllIGFib3V0IHRoZSBwb3NpdGlvbgotCSAgICAgb2YgdGhlIHJlbG9jLiAgKi8KLQkgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkgICAgICByZWwtPnJfb2Zmc2V0ICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCWhvd3RvID0gbWlwc19ydHlwZV90b19ob3d0byAocl90eXBlKTsKLQotICAgICAgaWYgKCF1c2Vfc2F2ZWRfYWRkZW5kX3ApCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0KLQkgIC8qIElmIHRoZXNlIHJlbG9jYXRpb25zIHdlcmUgb3JpZ2luYWxseSBvZiB0aGUgUkVMIHZhcmlldHksCi0JICAgICB3ZSBtdXN0IHB1bGwgdGhlIGFkZGVuZCBvdXQgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZQotCSAgICAgcmVsb2NhdGVkLiAgT3RoZXJ3aXNlLCB3ZSBzaW1wbHkgdXNlIHRoZSBjb250ZW50cyBvZiB0aGUKLQkgICAgIFJFTEEgcmVsb2NhdGlvbi4gIFRvIGRldGVybWluZSB3aGljaCBmbGF2b3Igb3IgcmVsb2NhdGlvbgotCSAgICAgdGhpcyBpcywgd2UgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIElOUFVUX1NFQ1RJT04ncwotCSAgICAgUkVMX0hEUiBpcyByZWFkIGJlZm9yZSBpdHMgUkVMX0hEUjIuICAqLwotCSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkcjsKLQkgIGlmICgoc2l6ZV90KSAocmVsIC0gcmVsb2NzKQotCSAgICAgID49IChyZWxfaGRyLT5zaF9zaXplIC8gcmVsX2hkci0+c2hfZW50c2l6ZQotCQkgICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkpCi0JICAgIHJlbF9oZHIgPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkcjI7Ci0JICBpZiAocmVsX2hkci0+c2hfZW50c2l6ZSA9PSBNSVBTX0VMRl9SRUxfU0laRSAoaW5wdXRfYmZkKSkKLQkgICAgewotCSAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIGlzIGEgUkVMIHJlbG9jYXRpb24uICAqLwotCSAgICAgIHJlbGFfcmVsb2NhdGlvbl9wID0gZmFsc2U7Ci0KLQkgICAgICAvKiBHZXQgdGhlIGFkZGVuZCwgd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBpbnB1dCBmaWxlLiAgKi8KLQkgICAgICBhZGRlbmQgPSBtaXBzX2VsZl9vYnRhaW5fY29udGVudHMgKGhvd3RvLCAKLQkJCQkJCSByZWwsCi0JCQkJCQkgaW5wdXRfYmZkLAotCQkJCQkJIGNvbnRlbnRzKTsKLQkgICAgICBhZGRlbmQgJj0gaG93dG8tPnNyY19tYXNrOwotCi0JICAgICAgLyogRm9yIHNvbWUga2luZHMgb2YgcmVsb2NhdGlvbnMsIHRoZSBBRERFTkQgaXMgYQotCQkgY29tYmluYXRpb24gb2YgdGhlIGFkZGVuZCBzdG9yZWQgaW4gdHdvIGRpZmZlcmVudAotCQkgcmVsb2NhdGlvbnMuICAgKi8KLQkgICAgICBpZiAocl90eXBlID09IFJfTUlQU19ISTE2Ci0JCSAgfHwgKHJfdHlwZSA9PSBSX01JUFNfR09UMTYKLQkJICAgICAgJiYgbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wIChpbnB1dF9iZmQsIHJlbCwKLQkJCQkJCSAgICAgIGxvY2FsX3NlY3Rpb25zKSkpCi0JCXsKLQkJICBiZmRfdm1hIGw7Ci0JCSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKmxvMTZfcmVsb2NhdGlvbjsKLQkJICByZWxvY19ob3d0b190eXBlICpsbzE2X2hvd3RvOwotCi0JCSAgLyogVGhlIGNvbWJpbmVkIHZhbHVlIGlzIHRoZSBzdW0gb2YgdGhlIEhJMTYgYWRkZW5kLAotCQkgICAgIGxlZnQtc2hpZnRlZCBieSBzaXh0ZWVuIGJpdHMsIGFuZCB0aGUgTE8xNgotCQkgICAgIGFkZGVuZCwgc2lnbiBleHRlbmRlZC4gIChVc3VhbGx5LCB0aGUgY29kZSBkb2VzCi0JCSAgICAgYSBgbHVpJyBvZiB0aGUgSEkxNiB2YWx1ZSwgYW5kIHRoZW4gYW4gYGFkZGl1JyBvZgotCQkgICAgIHRoZSBMTzE2IHZhbHVlLikgIAotCi0JCSAgICAgU2NhbiBhaGVhZCB0byBmaW5kIGEgbWF0Y2hpbmcgUl9NSVBTX0xPMTYKLQkJICAgICByZWxvY2F0aW9uLiAgKi8KLQkJICBsbzE2X3JlbG9jYXRpb24gCi0JCSAgICA9IG1pcHNfZWxmX25leHRfbG8xNl9yZWxvY2F0aW9uIChyZWwsIHJlbGVuZCk7IAotCQkgIGlmIChsbzE2X3JlbG9jYXRpb24gPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIC8qIE9idGFpbiB0aGUgYWRkZW5kIGtlcHQgdGhlcmUuICAqLwotCQkgIGxvMTZfaG93dG8gPSBtaXBzX3J0eXBlX3RvX2hvd3RvIChSX01JUFNfTE8xNik7Ci0JCSAgbCA9IG1pcHNfZWxmX29idGFpbl9jb250ZW50cyAobG8xNl9ob3d0bywKLQkJCQkJCWxvMTZfcmVsb2NhdGlvbiwKLQkJCQkJCWlucHV0X2JmZCwgY29udGVudHMpOwotCQkgIGwgJj0gbG8xNl9ob3d0by0+c3JjX21hc2s7Ci0JCSAgbCA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChsLCAxNik7Ci0KLQkJICBhZGRlbmQgPDw9IDE2OwotCi0JCSAgLyogQ29tcHV0ZSB0aGUgY29tYmluZWQgYWRkZW5kLiAgKi8KLQkJICBhZGRlbmQgKz0gbDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCkKLQkJewotCQkgIC8qIFRoZSBhZGRlbmQgaXMgc2NyYW1ibGVkIGluIHRoZSBvYmplY3QgZmlsZS4gIFNlZQotCQkgICAgIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUKLQkJICAgICBmb3JtYXQuICAqLwotCQkgIGFkZGVuZCA9ICgoKGFkZGVuZCAmIDB4MWYwMDAwKSA+PiA1KQotCQkJICAgIHwgKChhZGRlbmQgJiAweDdlMDAwMDApID4+IDE2KQotCQkJICAgIHwgKGFkZGVuZCAmIDB4MWYpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLQkgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0KLQkgIC8qIFNpbmNlIHdlJ3JlIGp1c3QgcmVsb2NhdGluZywgYWxsIHdlIG5lZWQgdG8gZG8gaXMgY29weQotCSAgICAgdGhlIHJlbG9jYXRpb25zIGJhY2sgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdW5sZXNzCi0JICAgICB0aGV5J3JlIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkCi0JICAgICB0byBhZGp1c3QgYnkgdGhlIHNlY3Rpb24gb2Zmc2V0LCBvciB1bmxlc3MgdGhleSdyZSBHUAotCSAgICAgcmVsYXRpdmUgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCBieSB0aGUgYW1vdW50Ci0JICAgICB0aGF0IHdlJ3JlIGFkanVzdGluZyBHUCBpbiB0aGlzIHJlbG9jYXRlYWJsZSBvYmplY3QuICAqLwotCi0JICBpZiAoIW1pcHNfZWxmX2xvY2FsX3JlbG9jYXRpb25fcCAoaW5wdXRfYmZkLCByZWwsIGxvY2FsX3NlY3Rpb25zKSkKLQkgICAgLyogVGhlcmUncyBub3RoaW5nIHRvIGRvIGZvciBub24tbG9jYWwgcmVsb2NhdGlvbnMuICAqLwotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCAKLQkgICAgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dQUkVMMTYKLQkgICAgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dQUkVMMzIKLQkgICAgICB8fCByX3R5cGUgPT0gUl9NSVBTX0xJVEVSQUwpCi0JICAgIGFkZGVuZCAtPSAoX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpCi0JCSAgICAgICAtIF9iZmRfZ2V0X2dwX3ZhbHVlIChpbnB1dF9iZmQpKTsKLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfMjYgfHwgcl90eXBlID09IFJfTUlQUzE2XzI2KQotCSAgICAvKiBUaGUgYWRkZW5kIGlzIHN0b3JlZCB3aXRob3V0IGl0cyB0d28gbGVhc3QKLQkgICAgICAgc2lnbmlmaWNhbnQgYml0cyAod2hpY2ggYXJlIGFsd2F5cyB6ZXJvLikgIEluIGEKLQkgICAgICAgbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCBjYWxjdWxhdGVfcmVsb2NhdGlvbiB3aWxsIGRvCi0JICAgICAgIHRoaXMgc2hpZnQ7IGhlcmUsIHdlIG11c3QgZG8gaXQgb3Vyc2VsdmVzLiAgKi8KLQkgICAgYWRkZW5kIDw8PSAyOwotCi0JICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JICAgIC8qIEFkanVzdCB0aGUgYWRkZW5kIGFwcHJvcHJpYXRlbHkuICAqLwotCSAgICBhZGRlbmQgKz0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdLT5vdXRwdXRfb2Zmc2V0OwotCSAgCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBSX01JUFNfSEkxNiBvciBSX01JUFNfR09UMTYsCi0JICAgICB0aGVuIHdlIG9ubHkgd2FudCB0byB3cml0ZSBvdXQgdGhlIGhpZ2gtb3JkZXIgMTYgYml0cy4KLQkgICAgIFRoZSBzdWJzZXF1ZW50IFJfTUlQU19MTzE2IHdpbGwgaGFuZGxlIHRoZSBsb3ctb3JkZXIgYml0cy4gICovCi0JICBpZiAocl90eXBlID09IFJfTUlQU19ISTE2IHx8IHJfdHlwZSA9PSBSX01JUFNfR09UMTYpCi0JICAgIGFkZGVuZCA9IG1pcHNfZWxmX2hpZ2ggKGFkZGVuZCk7Ci0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYW4gUl9NSVBTXzI2IHJlbG9jYXRpb24sIHRoZW4KLQkgICAgIHRoZSB0d28gbG93LW9yZGVyIGJpdHMgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIG9iamVjdCBmaWxlOwotCSAgICAgdGhleSBhcmUgaW1wbGljaXRseSB6ZXJvLiAgKi8KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfMjYgfHwgcl90eXBlID09IFJfTUlQUzE2XzI2KQotCSAgICBhZGRlbmQgPj49IDI7Ci0KLQkgIGlmIChyZWxhX3JlbG9jYXRpb25fcCkKLQkgICAgLyogSWYgdGhpcyBpcyBhIFJFTEEgcmVsb2NhdGlvbiwganVzdCB1cGRhdGUgdGhlIGFkZGVuZC4KLSAgICAgICAgICAgICAgIFdlIGhhdmUgdG8gY2FzdCBhd2F5IGNvbnN0bmVzcyBmb3IgUkVMLiAgKi8KLQkgICAgcmVsLT5yX2FkZGVuZCA9IGFkZGVuZDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE90aGVyd2lzZSwgd2UgaGF2ZSB0byB3cml0ZSB0aGUgdmFsdWUgYmFjayBvdXQuICBOb3RlCi0JCSB0aGF0IHdlIHVzZSB0aGUgc291cmNlIG1hc2ssIHJhdGhlciB0aGFuIHRoZQotCQkgZGVzdGluYXRpb24gbWFzayBiZWNhdXNlIHRoZSBwbGFjZSB0byB3aGljaCB3ZSBhcmUKLQkJIHdyaXRpbmcgd2lsbCBiZSBzb3VyY2Ugb2YgdGhlIGFkZGVuZCBpbiB0aGUgZmluYWwKLQkJIGxpbmsuICAqLwotCSAgICAgIGFkZGVuZCAmPSBob3d0by0+c3JjX21hc2s7Ci0JICAgICAgaWYgKCFtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGluZm8sIGhvd3RvLCByZWwsIGFkZGVuZCwKLQkJCQkJCWlucHV0X2JmZCwgIGlucHV0X3NlY3Rpb24sIAotCQkJCQkJY29udGVudHMsIGZhbHNlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEdvIG9uIHRvIHRoZSBuZXh0IHJlbG9jYXRpb24uICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJbiB0aGUgTjMyIGFuZCA2NC1iaXQgQUJJcyB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgY29uc2VjdXRpdmUKLQkgcmVsb2NhdGlvbnMgZm9yIHRoZSBzYW1lIG9mZnNldC4gIEluIHRoYXQgY2FzZSB3ZSBhcmUKLQkgc3VwcG9zZWQgdG8gdHJlYXQgdGhlIG91dHB1dCBvZiBlYWNoIHJlbG9jYXRpb24gYXMgdGhlIGFkZGVuZAotCSBmb3IgdGhlIG5leHQuICAqLwotICAgICAgaWYgKHJlbCArIDEgPCByZWxlbmQgCi0JICAmJiByZWwtPnJfb2Zmc2V0ID09IHJlbFsxXS5yX29mZnNldAotCSAgJiYgRUxGMzJfUl9UWVBFIChyZWxbMV0ucl9pbmZvKSAhPSBSX01JUFNfTk9ORSkKLQl1c2Vfc2F2ZWRfYWRkZW5kX3AgPSB0cnVlOwotICAgICAgZWxzZQotCXVzZV9zYXZlZF9hZGRlbmRfcCA9IGZhbHNlOwotCi0gICAgICAvKiBGaWd1cmUgb3V0IHdoYXQgdmFsdWUgd2UgYXJlIHN1cHBvc2VkIHRvIHJlbG9jYXRlLiAgKi8KLSAgICAgIHN3aXRjaCAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gKG91dHB1dF9iZmQsIAotCQkJCQkgICAgIGlucHV0X2JmZCwKLQkJCQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgIGluZm8sCi0JCQkJCSAgICAgcmVsLAotCQkJCQkgICAgIGFkZGVuZCwKLQkJCQkJICAgICBob3d0bywKLQkJCQkJICAgICBsb2NhbF9zeW1zLAotCQkJCQkgICAgIGxvY2FsX3NlY3Rpb25zLAotCQkJCQkgICAgICZ2YWx1ZSwKLQkJCQkJICAgICAmbmFtZSwKLQkJCQkJICAgICAmcmVxdWlyZV9qYWx4KSkKLQl7Ci0JY2FzZSBiZmRfcmVsb2NfY29udGludWU6Ci0JICAvKiBUaGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLwotCSAgY29udGludWU7Ci0KLQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAvKiBtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbiBhbHJlYWR5IGNhbGxlZCB0aGUKLSAgICAgICAgICAgICB1bmRlZmluZWRfc3ltYm9sIGNhbGxiYWNrLiAgVGhlcmUncyBubyByZWFsIHBvaW50IGluCi0JICAgICB0cnlpbmcgdG8gcGVyZm9ybSB0aGUgcmVsb2NhdGlvbiBhdCB0aGlzIHBvaW50LCBzbyB3ZQotCSAgICAganVzdCBza2lwIGFoZWFkIHRvIHRoZSBuZXh0IHJlbG9jYXRpb24uICAqLwotCSAgY29udGludWU7Ci0KLQljYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAodXNlX3NhdmVkX2FkZGVuZF9wKQotCSAgICAvKiBJZ25vcmUgb3ZlcmZsb3cgdW50aWwgd2UgcmVhY2ggdGhlIGxhc3QgcmVsb2NhdGlvbiBmb3IKLQkgICAgICAgYSBnaXZlbiBsb2NhdGlvbi4gICovCi0JICAgIDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTCk7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGdvdCBhbm90aGVyIHJlbG9jYXRpb24gZm9yIHRoZSBhZGRyZXNzLCBrZWVwIGdvaW5nCi0JIHVudGlsIHdlIHJlYWNoIHRoZSBsYXN0IG9uZS4gICovCi0gICAgICBpZiAodXNlX3NhdmVkX2FkZGVuZF9wKQotCXsKLQkgIGFkZGVuZCA9IHZhbHVlOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocl90eXBlID09IFJfTUlQU182NCAmJiAhQUJJXzY0X1AgKG91dHB1dF9iZmQpKQotCS8qIFNlZSB0aGUgY29tbWVudCBhYm92ZSBhYm91dCB1c2luZyBSX01JUFNfNjQgaW4gdGhlIDMyLWJpdAotCSAgIEFCSS4gIFVudGlsIG5vdywgd2UndmUgYmVlbiB1c2luZyB0aGUgSE9XVE8gZm9yIFJfTUlQU18zMjsKLQkgICB0aGF0IGNhbGN1bGF0ZWQgdGhlIHJpZ2h0IHZhbHVlLiAgTm93LCBob3dldmVyLCB3ZQotCSAgIHNpZ24tZXh0ZW5kIHRoZSAzMi1iaXQgcmVzdWx0IHRvIDY0LWJpdHMsIGFuZCBzdG9yZSBpdCBhcyBhCi0JICAgNjQtYml0IHZhbHVlLiAgV2UgYXJlIGVzcGVjaWFsbHkgZ2VuZXJvdXMgaGVyZSBpbiB0aGF0IHdlCi0JICAgZ28gdG8gZXh0cmVtZSBsZW5ndGhzIHRvIHN1cHBvcnQgdGhpcyB1c2FnZSBvbiBzeXN0ZW1zIHdpdGgKLQkgICBvbmx5IGEgMzItYml0IFZNQS4gICovCi0JewotCSAgYmZkX3ZtYSBzaWduX2JpdHM7Ci0JICBiZmRfdm1hIGxvd19iaXRzOwotCSAgYmZkX3ZtYSBoaWdoX2JpdHM7Ci0KLQkgIGlmICh2YWx1ZSAmIDB4ODAwMDAwMDApCi0JICAgIHNpZ25fYml0cyA9IDB4ZmZmZmZmZmY7Ci0JICBlbHNlCi0JICAgIHNpZ25fYml0cyA9IDA7Ci0KLQkgIC8qIElmIG9ubHkgYSAzMi1iaXQgVk1BIGlzIGF2YWlsYWJsZSBkbyB0d28gc2VwYXJhdGUKLQkgICAgIHN0b3Jlcy4gICovCi0JICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAvKiBVbmRvIHdoYXQgd2UgZGlkIGFib3ZlLiAgKi8KLQkgICAgICByZWwtPnJfb2Zmc2V0IC09IDQ7Ci0JICAgICAgLyogU3RvcmUgdGhlIHNpZ24tYml0cyAod2hpY2ggYXJlIG1vc3Qgc2lnbmlmaWNhbnQpCi0JCSBmaXJzdC4gICovCi0JICAgICAgbG93X2JpdHMgPSBzaWduX2JpdHM7Ci0JICAgICAgaGlnaF9iaXRzID0gdmFsdWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxvd19iaXRzID0gdmFsdWU7Ci0JICAgICAgaGlnaF9iaXRzID0gc2lnbl9iaXRzOwotCSAgICB9Ci0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGxvd19iaXRzLCAKLQkJICAgICAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaGlnaF9iaXRzLCAKLQkJICAgICAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0ICsgNCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFjdHVhbGx5IHBlcmZvcm0gdGhlIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKCFtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGluZm8sIGhvd3RvLCByZWwsIHZhbHVlLCBpbnB1dF9iZmQsIAotCQkJCQlpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJcmVxdWlyZV9qYWx4KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGhvb2sgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgbGlua2VyIHdyaXRlcyBvdXQgYSBnbG9iYWwKLSAgIHN5bWJvbC4gIFdlIG1hcmsgc3ltYm9scyBhcyBzbWFsbCBjb21tb24gaWYgYXBwcm9wcmlhdGUuICBUaGlzIGlzCi0gICBhbHNvIHdoZXJlIHdlIHVuZG8gdGhlIGluY3JlbWVudCBvZiB0aGUgdmFsdWUgZm9yIGEgbWlwczE2IHN5bWJvbC4gICovCi0KLS8qQVJHU0lHTk9SRUQqLwotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgbmFtZSwgc3ltLCBpbnB1dF9zZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlYzsKLXsKLSAgLyogSWYgd2Ugc2VlIGEgY29tbW9uIHN5bWJvbCwgd2hpY2ggaW1wbGllcyBhIHJlbG9jYXRhYmxlIGxpbmssIHRoZW4KLSAgICAgaWYgYSBzeW1ib2wgd2FzIHNtYWxsIGNvbW1vbiBpbiBhbiBpbnB1dCBmaWxlLCBtYXJrIGl0IGFzIHNtYWxsCi0gICAgIGNvbW1vbiBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCi0gICAgICAmJiBzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfU0NPTU1PTjsKLQotICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2Ci0gICAgICAmJiAoc3ltLT5zdF92YWx1ZSAmIDEpICE9IDApCi0gICAgLS1zeW0tPnN0X3ZhbHVlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRnVuY3Rpb25zIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUihhYmZkKSAJCVwKLSAgIChBQklfTjMyX1AgKGFiZmQpID8gIi91c3IvbGliMzIvbGliYy5zby4xIiAJXAotICAgIDogQUJJXzY0X1AgKGFiZmQpID8gIi91c3IvbGliNjQvbGliYy5zby4xIiAJXAotICAgIDogIi91c3IvbGliL2xpYmMuc28uMSIpCi0KLS8qIENyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIHdoZW4gbGlua2luZyBhZ2FpbnN0IGEgZHluYW1pYyBvYmplY3QuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBjb25zdCBjaGFyICogY29uc3QgKm5hbWVwOwotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCB8IFNFQ19SRUFET05MWSk7Ci0KLSAgLyogTWlwcyBBQkkgcmVxdWVzdHMgdGhlIC5keW5hbWljIHNlY3Rpb24gdG8gYmUgcmVhZCBvbmx5LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSB0aGUgLm1zeW0gc2VjdGlvbiBvbiBJUklYNi4gIEl0IGlzIHVzZWQgYnkgdGhlIGR5bmFtaWMKLSAgICAgbGlua2VyIHRvIHNwZWVkIHVwIGR5bmFtaWMgcmVsb2NhdGlvbnMsIGFuZCB0byBhdm9pZCBjb21wdXRpbmcKLSAgICAgdGhlIEVMRiBoYXNoIGZvciBzeW1ib2xzLiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYKLSAgICAgICYmICFtaXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKiBDcmVhdGUgLnN0dWIgc2VjdGlvbi4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgCi0JCQkgICAgICAgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAoYWJmZCkpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX0NPREUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsCi0JCQkJCSAgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04gKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1Ci0gICAgICAmJiAhaW5mby0+c2hhcmVkCi0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ybGRfbWFwIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5ybGRfbWFwIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgJiB+U0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLAotCQkJCQkgIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBPbiBJUklYNSwgd2UgYWRqdXN0IGFkZCBzb21lIGFkZGl0aW9uYWwgc3ltYm9scyBhbmQgY2hhbmdlIHRoZQotICAgICBhbGlnbm1lbnRzIG9mIHNldmVyYWwgc2VjdGlvbnMuICBUaGVyZSBpcyBubyBBQkkgZG9jdW1lbnRhdGlvbgotICAgICBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpcyBuZWNlc3Nhcnkgb24gSVJJWDYsIG5vciBhbnkgZXZpZGVuY2UgdGhhdAotICAgICB0aGUgbGlua2VyIHRha2VzIHN1Y2ggYWN0aW9uLiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDUpCi0gICAgewotICAgICAgZm9yIChuYW1lcCA9IG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXM7ICpuYW1lcCAhPSBOVUxMOyBuYW1lcCsrKQotCXsKLQkgIGggPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgKm5hbWVwLCBCU0ZfR0xPQkFMLCBiZmRfdW5kX3NlY3Rpb25fcHRyLAotCQkgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkJICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCSAgaC0+dHlwZSA9IFNUVF9TRUNUSU9OOwotCi0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIC5jb21wYWN0X3JlbCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIENoYW5nZSBhbGlnbWVudHMgb2Ygc29tZSBzZWN0aW9ucy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaGFzaCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3RyIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICB9Ci0KLSAgaWYgKCFpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCAiX0RZTkFNSUNfTElOSyIsIEJTRl9HTE9CQUwsIGJmZF9hYnNfc2VjdGlvbl9wdHIsCi0JICAgICAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICAgIGgtPnR5cGUgPSBTVFRfU0VDVElPTjsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkKQotCXsKLQkgIC8qIF9fcmxkX21hcCBpcyBhIGZvdXIgYnl0ZSB3b3JkIGxvY2F0ZWQgaW4gdGhlIC5kYXRhIHNlY3Rpb24KLQkgICAgIGFuZCBpcyBmaWxsZWQgaW4gYnkgdGhlIHJ0bGQgdG8gY29udGFpbiBhIHBvaW50ZXIgdG8KLQkgICAgIHRoZSBfcl9kZWJ1ZyBzdHJ1Y3R1cmUuIEl0cyBzeW1ib2wgdmFsdWUgd2lsbCBiZSBzZXQgaW4KLQkgICAgIG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbC4gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmxkX21hcCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgaCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCAiX19ybGRfbWFwIiwgQlNGX0dMT0JBTCwgcywKLQkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIHRoZSAuY29tcGFjdF9yZWwgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmNvbXBhY3RfcmVsIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCSAgICAgICB8IFNFQ19SRUFET05MWSk7Ci0KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmNvbXBhY3RfcmVsIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsCi0JCQkJCSAgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04gKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIHRoZSAuZ290IHNlY3Rpb24gdG8gaG9sZCB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgaWYgKG1pcHNfZWxmX2dvdF9zZWN0aW9uIChhYmZkKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZQotICAgICBsaW5rZXIgc2NyaXB0IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIHN5bWJvbCBpZiB3ZQotICAgICBhcmUgbm90IGNyZWF0aW5nIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGggPSBOVUxMOwotICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgKGluZm8sIGFiZmQsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBCU0ZfR0xPQkFMLCBzLAotCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAmJiAhIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBmaXJzdCBzZXZlcmFsIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcyBhcmUgcmVzZXJ2ZWQuICAqLwotICBzLT5fcmF3X3NpemUgPSBNSVBTX1JFU0VSVkVEX0dPVE5PICogTUlQU19FTEZfR09UX1NJWkUgKGFiZmQpOwotCi0gIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IG1pcHNfZ290X2luZm8pKTsKLSAgaWYgKGcgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGctPmdsb2JhbF9nb3RzeW0gPSBOVUxMOwotICBnLT5sb2NhbF9nb3RubyA9IE1JUFNfUkVTRVJWRURfR09UTk87Ci0gIGctPmFzc2lnbmVkX2dvdG5vID0gTUlQU19SRVNFUlZFRF9HT1ROTzsKLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpID09IE5VTEwpCi0gICAgewotICAgICAgcy0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKSk7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocykgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGRhdGEgPSAoUFRSKSBnOwotICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZmxhZ3MgCi0gICAgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybnMgdGhlIC5tc3ltIHNlY3Rpb24gZm9yIEFCRkQsIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90Ci0gICBhbHJlYWR5IGV4aXN0LiAgUmV0dXJucyBOVUxMIHRvIGluZGljYXRlIGVycm9yLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpOwotICBpZiAoIXMpIAotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpOwotICAgICAgaWYgKCFzCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAKLQkJCQkgICAgIFNFQ19BTExPQwotCQkJCSAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCAKLQkJCQkgICAgIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsCi0JCQkJCSBNSVBTX0VMRl9MT0dfRklMRV9BTElHTiAoYWJmZCkpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gczsKLX0KLQotLyogQWRkIHJvb20gZm9yIE4gcmVsb2NhdGlvbnMgdG8gdGhlIC5yZWwuZHluIHNlY3Rpb24gaW4gQUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZl9hbGxvY2F0ZV9keW5hbWljX3JlbG9jYXRpb25zIChhYmZkLCBuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBuOwotewotICBhc2VjdGlvbiAqczsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChhYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIAotICBpZiAocy0+X3Jhd19zaXplID09IDApCi0gICAgewotICAgICAgLyogTWFrZSByb29tIGZvciBhIG51bGwgZWxlbWVudC4gKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBNSVBTX0VMRl9SRUxfU0laRSAoYWJmZCk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLSAgcy0+X3Jhd19zaXplICs9IG4gKiBNSVBTX0VMRl9SRUxfU0laRSAoYWJmZCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICBzaXplX3QgZXh0c3ltb2ZmOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBleHRzeW1vZmYgPSAoZWxmX2JhZF9zeW10YWIgKGFiZmQpKSA/IDAgOiBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gIC8qIENoZWNrIGZvciB0aGUgbWlwczE2IHN0dWIgc2VjdGlvbnMuICAqLwotCi0gIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLSAgaWYgKHN0cm5jbXAgKG5hbWUsIEZOX1NUVUIsIHNpemVvZiBGTl9TVFVCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCi0gICAgICAvKiBMb29rIGF0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hpY2ggc3ltYm9sCi0gICAgICAgICB0aGlzIGlzIGZvci4gICovCi0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbG9jcy0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfc3ltbmR4IDwgZXh0c3ltb2ZmCi0JICB8fCBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICAvKiBUaGlzIHN0dWIgaXMgZm9yIGEgbG9jYWwgc3ltYm9sLiAgVGhpcyBzdHViIHdpbGwgb25seSBiZQotICAgICAgICAgICAgIG5lZWRlZCBpZiB0aGVyZSBpcyBzb21lIHJlbG9jYXRpb24gaW4gdGhpcyBCRkQsIG90aGVyCi0gICAgICAgICAgICAgdGhhbiBhIDE2IGJpdCBmdW5jdGlvbiBjYWxsLCB3aGljaCByZWZlcnMgdG8gdGhpcyBzeW1ib2wuICAqLwotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqc2VjX3JlbG9jczsKLQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqciwgKnJlbmQ7Ci0KLQkgICAgICAvKiBXZSBjYW4gaWdub3JlIHN0dWIgc2VjdGlvbnMgd2hlbiBsb29raW5nIGZvciByZWxvY3MuICAqLwotCSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkJICB8fCBvLT5yZWxvY19jb3VudCA9PSAwCi0JCSAgfHwgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCBGTl9TVFVCLAotCQkJICAgICAgc2l6ZW9mIEZOX1NUVUIgLSAxKSA9PSAwCi0JCSAgfHwgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCBDQUxMX1NUVUIsCi0JCQkgICAgICBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgPT0gMAotCQkgIHx8IHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgQ0FMTF9GUF9TVFVCLAotCQkJICAgICAgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc2VjX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAgICAoYWJmZCwgbywgKFBUUikgTlVMTCwKLQkJCSAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgICAgIGluZm8tPmtlZXBfbWVtb3J5KSk7Ci0JICAgICAgaWYgKHNlY19yZWxvY3MgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgcmVuZCA9IHNlY19yZWxvY3MgKyBvLT5yZWxvY19jb3VudDsKLQkgICAgICBmb3IgKHIgPSBzZWNfcmVsb2NzOyByIDwgcmVuZDsgcisrKQotCQlpZiAoRUxGMzJfUl9TWU0gKHItPnJfaW5mbykgPT0gcl9zeW1uZHgKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAoci0+cl9pbmZvKSAhPSBSX01JUFMxNl8yNikKLQkJICBicmVhazsKLQotCSAgICAgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotCQlmcmVlIChzZWNfcmVsb2NzKTsKLQotCSAgICAgIGlmIChyIDwgcmVuZCkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG8gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoZXJlIGlzIG5vIG5vbi1jYWxsIHJlbG9jIGZvciB0aGlzIHN0dWIsIHNvIHdlIGRvCi0gICAgICAgICAgICAgICAgIG5vdCBuZWVkIGl0LiAgU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlCi0gICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMsIHdlCi0gICAgICAgICAgICAgICAgIGNhbiBlYXNpbHkgZGlzY2FyZCBpdCBieSBzZXR0aW5nIHRoZSBTRUNfRVhDTFVERQotICAgICAgICAgICAgICAgICBmbGFnLiAgKi8KLQkgICAgICBzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkgIC8qIFJlY29yZCB0aGlzIHN0dWIgaW4gYW4gYXJyYXkgb2YgbG9jYWwgc3ltYm9sIHN0dWJzIGZvcgotICAgICAgICAgICAgIHRoaXMgQkZELiAqLwotCSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPmxvY2FsX3N0dWJzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHN5bWNvdW50OwotCSAgICAgIGFzZWN0aW9uICoqbjsKLQotCSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0JCXN5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHN5bXRhYl9oZHItPnNoX2VudHNpemU7Ci0JICAgICAgZWxzZQotCQlzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICAgICAgbiA9IChhc2VjdGlvbiAqKikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJICAgIHN5bWNvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0JICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmxvY2FsX3N0dWJzID0gbjsKLQkgICAgfQotCi0JICBlbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9zdHVic1tyX3N5bW5keF0gPSBzZWM7Ci0KLQkgIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IG1pcHMxNl9zdHVic19zZWVuIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICBUaGF0IGZsYWcgaXMgdXNlZCB0byBzZWUgd2hldGhlciB3ZSBuZWVkIHRvIGxvb2sgdGhyb3VnaAotICAgICAgICAgICAgIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGZvciBzdHVicy4gIFdlIGRvbid0IG5lZWQgdG8gc2V0Ci0gICAgICAgICAgICAgaXQgaGVyZSwgYmVjYXVzZSB3ZSBqdXN0IGhhdmUgYSBsb2NhbCBzdHViLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgICAgICBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSk7Ci0KLQkgIC8qIEggaXMgdGhlIHN5bWJvbCB0aGlzIHN0dWIgaXMgZm9yLiAgKi8KLQotCSAgaC0+Zm5fc3R1YiA9IHNlYzsKLQkgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbiA9IHRydWU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgQ0FMTF9TVFVCLCBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgPT0gMAotCSAgIHx8IHN0cm5jbXAgKG5hbWUsIENBTExfRlBfU1RVQiwgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqKmxvYzsKLQotICAgICAgLyogTG9vayBhdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHdoaWNoIHN5bWJvbAotICAgICAgICAgdGhpcyBpcyBmb3IuICAqLwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWxvY3MtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZgotCSAgfHwgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0gPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGlzIHN0dWIgd2FzIGFjdHVhbGx5IGJ1aWx0IGZvciBhIHN0YXRpYyBzeW1ib2wgZGVmaW5lZAotCSAgICAgaW4gdGhlIHNhbWUgZmlsZS4gIFdlIGFzc3VtZSB0aGF0IGFsbCBzdGF0aWMgc3ltYm9scyBpbgotCSAgICAgbWlwczE2IGNvZGUgYXJlIHRoZW1zZWx2ZXMgbWlwczE2LCBzbyB3ZSBjYW4gc2ltcGx5Ci0JICAgICBkaXNjYXJkIHRoaXMgc3R1Yi4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZQotCSAgICAgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucywgd2UgY2FuCi0JICAgICBlYXNpbHkgZGlzY2FyZCBpdCBieSBzZXR0aW5nIHRoZSBTRUNfRVhDTFVERSBmbGFnLiAgKi8KLQkgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGggPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSk7Ci0KLSAgICAgIC8qIEggaXMgdGhlIHN5bWJvbCB0aGlzIHN0dWIgaXMgZm9yLiAgKi8KLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIENBTExfRlBfU1RVQiwgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0JbG9jID0gJmgtPmNhbGxfZnBfc3R1YjsKLSAgICAgIGVsc2UKLQlsb2MgPSAmaC0+Y2FsbF9zdHViOwotCi0gICAgICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgc3R1YiBmb3IgdGhpcyBmdW5jdGlvbiwgd2UKLQkgZG9uJ3QgbmVlZCBhbm90aGVyIG9uZSwgc28gd2UgY2FuIGRpc2NhcmQgdGhpcyBvbmUuICBTaW5jZQotCSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zCi0JIHRvIG91dHB1dCBzZWN0aW9ucywgd2UgY2FuIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlCi0JIFNFQ19FWENMVURFIGZsYWcuICBXZSBjYW4gYWxzbyBkaXNjYXJkIHRoaXMgc2VjdGlvbiBpZiB3ZQotCSBoYXBwZW4gdG8gYWxyZWFkeSBrbm93IHRoYXQgdGhpcyBpcyBhIG1pcHMxNiBmdW5jdGlvbjsgaXQgaXMKLQkgbm90IG5lY2Vzc2FyeSB0byBjaGVjayB0aGlzIGhlcmUsIGFzIGl0IGlzIGNoZWNrZWQgbGF0ZXIsIGJ1dAotCSBpdCBpcyBzbGlnaHRseSBmYXN0ZXIgdG8gY2hlY2sgbm93LiAgKi8KLSAgICAgIGlmICgqbG9jICE9IE5VTEwgfHwgaC0+cm9vdC5vdGhlciA9PSBTVE9fTUlQUzE2KQotCXsKLQkgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgICpsb2MgPSBzZWM7Ci0gICAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+bWlwczE2X3N0dWJzX3NlZW4gPSB0cnVlOwotICAgIH0KLQotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgewotICAgICAgc2dvdCA9IE5VTEw7Ci0gICAgICBnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZ290ID0gbWlwc19lbGZfZ290X3NlY3Rpb24gKGR5bm9iaik7Ci0gICAgICBpZiAoc2dvdCA9PSBOVUxMKQotCWcgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotCSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0JICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotCX0KLSAgICB9Ci0KLSAgc3JlbG9jID0gTlVMTDsKLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudCAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyArK3JlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfc3ltbmR4IDwgZXh0c3ltb2ZmKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXTsKLQotCSAgLyogVGhpcyBtYXkgYmUgYW4gaW5kaXJlY3Qgc3ltYm9sIGNyZWF0ZWQgYmVjYXVzZSBvZiBhIHZlcnNpb24uICAqLwotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLQkJaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTb21lIHJlbG9jcyByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwgfHwgc2dvdCA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaCAocl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgUl9NSVBTX0dPVDE2OgotCSAgICBjYXNlIFJfTUlQU19DQUxMMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLQkgICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotCSAgICBjYXNlIFJfTUlQU19HT1RfSEkxNjoKLQkgICAgY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9QQUdFOgotCSAgICBjYXNlIFJfTUlQU19HT1RfT0ZTVDoKLQkgICAgY2FzZSBSX01JUFNfR09UX0RJU1A6Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZyA9IG1pcHNfZWxmX2dvdF9pbmZvIChkeW5vYmosICZzZ290KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfTUlQU18zMjoKLQkgICAgY2FzZSBSX01JUFNfUkVMMzI6Ci0JICAgIGNhc2UgUl9NSVBTXzY0OgotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTAotCQkgICYmIChpbmZvLT5zaGFyZWQgfHwgaCAhPSBOVUxMKQotCQkgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCFoICYmIChyX3R5cGUgPT0gUl9NSVBTX0NBTExfTE8xNgotCQkgfHwgcl90eXBlID09IFJfTUlQU19HT1RfTE8xNgotCQkgfHwgcl90eXBlID09IFJfTUlQU19HT1RfRElTUCkpCi0JewotCSAgLyogV2UgbWF5IG5lZWQgYSBsb2NhbCBHT1QgZW50cnkgZm9yIHRoaXMgcmVsb2NhdGlvbi4gIFdlCi0JICAgICBkb24ndCBjb3VudCBSX01JUFNfR09UX1BBR0UgYmVjYXVzZSB3ZSBjYW4gZXN0aW1hdGUgdGhlCi0JICAgICBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyBuZWVkZWQgYnkgbG9va2luZyBhdCB0aGUgc2l6ZSBvZgotCSAgICAgdGhlIHNlZ21lbnQuICBTaW1pbGFyIGNvbW1lbnRzIGFwcGx5IHRvIFJfTUlQU19HT1QxNi4gIFdlCi0JICAgICBkb24ndCBjb3VudCBSX01JUFNfR09UX0hJMTYsIG9yIFJfTUlQU19DQUxMX0hJMTYgYmVjYXVzZQotCSAgICAgdGhlc2UgYXJlIGFsd2F5cyBmb2xsb3dlZCBieSBhbiBSX01JUFNfR09UX0xPMTYgb3IKLQkgICAgIFJfTUlQU19DQUxMX0xPMTYuCi0KLQkgICAgIFRoaXMgZXN0aW1hdGlvbiBpcyB2ZXJ5IGNvbnNlcnZhdGl2ZSBzaW5jZSB3ZSBjYW4gbWVyZ2UKLQkgICAgIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBHT1QuICBJbiBvcmRlciB0byBiZSBsZXNzCi0JICAgICBjb25zZXJ2YXRpdmUsIHdlIGNvdWxkIGFjdHVhbGx5IGJ1aWxkIHRoZSBHT1QgaGVyZSwKLQkgICAgIHJhdGhlciB0aGFuIGluIHJlbG9jYXRlX3NlY3Rpb24uICAqLwotCSAgZy0+bG9jYWxfZ290bm8rKzsKLQkgIHNnb3QtPl9yYXdfc2l6ZSArPSBNSVBTX0VMRl9HT1RfU0laRSAoZHlub2JqKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfTUlQU19DQUxMMTY6Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogQ0FMTDE2IHJlbG9jIGF0IDB4JWx4IG5vdCBhZ2FpbnN0IGdsb2JhbCBzeW1ib2wiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcmVsLT5yX29mZnNldCk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCi0JY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotCWNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCSAgICAgIGlmICghbWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sIChoLCBpbmZvLCBnKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogV2UgbmVlZCBhIHN0dWIsIG5vdCBhIHBsdCBlbnRyeSBmb3IgdGhlIHVuZGVmaW5lZAotCQkgZnVuY3Rpb24uICBCdXQgd2UgcmVjb3JkIGl0IGFzIGlmIGl0IG5lZWRzIHBsdC4gIFNlZQotCQkgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCBpbiBlbGZsaW5rLmguICAqLwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgICAgaC0+dHlwZSA9IFNUVF9GVU5DOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9NSVBTX0dPVDE2OgotCWNhc2UgUl9NSVBTX0dPVF9ISTE2OgotCWNhc2UgUl9NSVBTX0dPVF9MTzE2OgotCWNhc2UgUl9NSVBTX0dPVF9ESVNQOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmIChoICYmICFtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgKGgsIGluZm8sIGcpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgUl9NSVBTXzMyOgotCWNhc2UgUl9NSVBTX1JFTDMyOgotCWNhc2UgUl9NSVBTXzY0OgotCSAgaWYgKChpbmZvLT5zaGFyZWQgfHwgaCAhPSBOVUxMKQotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZSA9IE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChkeW5vYmopOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLAotCQkJCQkJICAgICAgKFNFQ19BTExPQwotCQkJCQkJICAgICAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZKSkKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywKLQkJCQkJCQkgIDQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCQkgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZSBhcyBSX01JUFNfUkVMMzIKLQkJICAgcmVsb2NzLiAgV2UgbWFrZSByb29tIGZvciB0aGlzIHJlbG9jIGluIHRoZQotCQkgICAucmVsLmR5biByZWxvYyBzZWN0aW9uLiAgKi8KLQkJbWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucyAoZHlub2JqLCAxKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpobWlwczsKLQotCQkgIC8qIFdlIG9ubHkgbmVlZCB0byBjb3B5IHRoaXMgcmVsb2MgaWYgdGhlIHN5bWJvbCBpcwotICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQkJICBobWlwcyA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JCSAgKytobWlwcy0+cG9zc2libHlfZHluYW1pY19yZWxvY3M7Ci0JCX0KLQkgICAgIAotCSAgICAgIC8qIEV2ZW4gdGhvdWdoIHdlIGRvbid0IGRpcmVjdGx5IG5lZWQgYSBHT1QgZW50cnkgZm9yCi0JCSB0aGlzIHN5bWJvbCwgYSBzeW1ib2wgbXVzdCBoYXZlIGEgZHluYW1pYyBzeW1ib2wKLQkJIHRhYmxlIGluZGV4IGdyZWF0ZXIgdGhhdCBEVF9NSVBTX0dPVFNZTSBpZiB0aGVyZSBhcmUKLQkJIGR5bmFtaWMgcmVsb2NhdGlvbnMgYWdhaW5zdCBpdC4gICovCi0JICAgICAgaWYgKGggIT0gTlVMTAotCQkgICYmICFtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgKGgsIGluZm8sIGcpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKFNHSV9DT01QQVQgKGR5bm9iaikpCi0JICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplICs9Ci0JICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jcmluZm8pOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfTUlQU18yNjoKLQljYXNlIFJfTUlQU19HUFJFTDE2OgotCWNhc2UgUl9NSVBTX0xJVEVSQUw6Ci0JY2FzZSBSX01JUFNfR1BSRUwzMjoKLQkgIGlmIChTR0lfQ09NUEFUIChkeW5vYmopKQotCSAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Y29tcGFjdF9yZWxfc2l6ZSArPQotCSAgICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY3JpbmZvKTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIHJlbG9jIGlzIG5vdCBhIDE2IGJpdCBjYWxsLCBhbmQgaXQgaGFzIGEgZ2xvYmFsCi0gICAgICAgICBzeW1ib2wsIHRoZW4gd2Ugd2lsbCBuZWVkIHRoZSBmbl9zdHViIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgICAgIFJlZmVyZW5jZXMgZnJvbSBhIHN0dWIgc2VjdGlvbiBkbyBub3QgY291bnQuICovCi0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiByX3R5cGUgIT0gUl9NSVBTMTZfMjYKLQkgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBGTl9TVFVCLAotCQkgICAgICBzaXplb2YgRk5fU1RVQiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBDQUxMX1NUVUIsCi0JCSAgICAgIHNpemVvZiBDQUxMX1NUVUIgLSAxKSAhPSAwCi0JICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgQ0FMTF9GUF9TVFVCLAotCQkgICAgICBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgIT0gMCkKLQl7Ci0JICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICptaDsKLQotCSAgbWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCSAgbWgtPm5lZWRfZm5fc3R1YiA9IHRydWU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotYXNlY3Rpb24gKgotX2JmZF9taXBzX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIC8qID8/PyBEbyBtaXBzMTYgc3R1YiBzZWN0aW9ucyBuZWVkIHRvIGJlIGhhbmRsZWQgc3BlY2lhbD8gICovCi0KLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgMAotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfTUlQU19HT1QxNjoKLSAgICAgIGNhc2UgUl9NSVBTX0NBTEwxNjoKLSAgICAgIGNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLSAgICAgIGNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLSAgICAgIGNhc2UgUl9NSVBTX0dPVF9ISTE2OgotICAgICAgY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0JLyogPz8/IEl0IHdvdWxkIHNlZW0gdGhhdCB0aGUgZXhpc3RpbmcgTUlQUyBjb2RlIGRvZXMgbm8gc29ydAotCSAgIG9mIHJlZmVyZW5jZSBjb3VudGluZyBvciB3aGF0bm90IG9uIGl0cyBHT1QgYW5kIFBMVCBlbnRyaWVzLAotCSAgIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBnYXJiYWdlIGNvbGxlY3QgdGhlbSBhdCB0aGlzIHRpbWUuICAqLwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmhtaXBzOwotICBhc2VjdGlvbiAqczsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0LCB3ZSBuZWVkIHRvIGNvcHkKLSAgICAgYW55IFJfTUlQU18zMiBvciBSX01JUFNfUkVMMzIgcmVsb2NzIGFnYWluc3QgaXQgaW50byB0aGUgb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICBobWlwcyA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgaG1pcHMtPnBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICBtaXBzX2VsZl9hbGxvY2F0ZV9keW5hbWljX3JlbG9jYXRpb25zIChkeW5vYmosIAotCQkJCQkgICBobWlwcy0+cG9zc2libHlfZHluYW1pY19yZWxvY3MpOwotCi0gIC8qIEZvciBhIGZ1bmN0aW9uLCBjcmVhdGUgYSBzdHViLCBpZiBuZWVkZWQuICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotCXJldHVybiB0cnVlOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgdGhlbiBzZXQKLQkgdGhlIHN5bWJvbCB0byB0aGUgc3R1YiBsb2NhdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZQotCSBmdW5jdGlvbiBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbAotCSBleGVjdXRhYmxlIGFuZCB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBXZSBuZWVkIC5zdHViIHNlY3Rpb24uICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgICAgICBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAoZHlub2JqKSk7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotCSAgLyogWFhYIFdyaXRlIHRoaXMgc3R1YiBhZGRyZXNzIHNvbWV3aGVyZS4gICovCi0JICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0JICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgc3R1YiBjb2RlLiAgKi8KLQkgIHMtPl9yYXdfc2l6ZSArPSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRTsKLQotCSAgLyogVGhlIGxhc3QgaGFsZiB3b3JkIG9mIHRoZSBzdHViIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGluZGV4Ci0JICAgICBvZiB0aGlzIHN5bWJvbCBpbiAuZHluc3ltIHNlY3Rpb24uICAqLwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gcmVhZCwKLSAgIGFuZCB0aGUgaW5wdXQgc2VjdGlvbnMgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIG91dHB1dCBzZWN0aW9ucy4gIFdlCi0gICBjaGVjayBmb3IgYW55IG1pcHMxNiBzdHViIHNlY3Rpb25zIHRoYXQgd2UgY2FuIGRpc2NhcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMKLSAgUEFSQU1TICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnJpOwotCi0gIC8qIFRoZSAucmVnaW5mbyBzZWN0aW9uIGhhcyBhIGZpeGVkIHNpemUuICAqLwotICByaSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlZ2luZm8iKTsKLSAgaWYgKHJpICE9IE5VTEwpCi0gICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHJpLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAhIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgIG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicywKLQkJCSAgICAgICAoUFRSKSBOVUxMKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgdGhlIG1pcHMxNiBzdHVicyBmb3IgYSBwYXJ0aWN1bGFyIHN5bWJvbCwgYW5kIHNlZSBpZiB3ZSBjYW4KLSAgIGRpc2NhcmQgdGhlbS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGgtPmZuX3N0dWIgIT0gTlVMTAotICAgICAgJiYgISBoLT5uZWVkX2ZuX3N0dWIpCi0gICAgewotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgZm5fc3R1YjsgdGhlIG9ubHkgcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbAotICAgICAgICAgYXJlIDE2IGJpdCBjYWxscy4gIENsb2JiZXIgdGhlIHNpemUgdG8gMCB0byBwcmV2ZW50IGl0IGZyb20KLSAgICAgICAgIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgICAgIGgtPmZuX3N0dWItPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICBoLT5mbl9zdHViLT5fY29va2VkX3NpemUgPSAwOwotICAgICAgaC0+Zm5fc3R1Yi0+ZmxhZ3MgJj0gfiBTRUNfUkVMT0M7Ci0gICAgICBoLT5mbl9zdHViLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBoLT5mbl9zdHViLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgICB9Ci0KLSAgaWYgKGgtPmNhbGxfc3R1YiAhPSBOVUxMCi0gICAgICAmJiBoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpCi0gICAgewotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY2FsbF9zdHViOyB0aGlzIGlzIGEgMTYgYml0IGZ1bmN0aW9uLCBzbwotICAgICAgICAgY2FsbHMgZnJvbSBvdGhlciAxNiBiaXQgZnVuY3Rpb25zIGFyZSBPSy4gIENsb2JiZXIgdGhlIHNpemUKLSAgICAgICAgIHRvIDAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgICAgIGgtPmNhbGxfc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfc3R1Yi0+X2Nvb2tlZF9zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfc3R1Yi0+ZmxhZ3MgJj0gfiBTRUNfUkVMT0M7Ci0gICAgICBoLT5jYWxsX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmNhbGxfc3R1Yi0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gICAgfQotCi0gIGlmIChoLT5jYWxsX2ZwX3N0dWIgIT0gTlVMTAotICAgICAgJiYgaC0+cm9vdC5vdGhlciA9PSBTVE9fTUlQUzE2KQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGNhbGxfc3R1YjsgdGhpcyBpcyBhIDE2IGJpdCBmdW5jdGlvbiwgc28KLSAgICAgICAgIGNhbGxzIGZyb20gb3RoZXIgMTYgYml0IGZ1bmN0aW9ucyBhcmUgT0suICBDbG9iYmVyIHRoZSBzaXplCi0gICAgICAgICB0byAwIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0gICAgICBoLT5jYWxsX2ZwX3N0dWItPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICBoLT5jYWxsX2ZwX3N0dWItPl9jb29rZWRfc2l6ZSA9IDA7Ci0gICAgICBoLT5jYWxsX2ZwX3N0dWItPmZsYWdzICY9IH4gU0VDX1JFTE9DOwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBoLT5jYWxsX2ZwX3N0dWItPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmcgPSBOVUxMOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSAKLQkgICAgPSBzdHJsZW4gKEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSIChvdXRwdXRfYmZkKSkgKyAxOwotCSAgcy0+Y29udGVudHMgCi0JICAgID0gKGJmZF9ieXRlICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSIChvdXRwdXRfYmZkKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSBvbmx5IHN0cmlwIHRoZSBzZWN0aW9uIGlmIHRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lCi0gICAgICAgICAgICAgICAgIGhhcyB0aGUgc2FtZSBuYW1lLiAgT3RoZXJ3aXNlLCB0aGVyZSBtaWdodCBiZSBzZXZlcmFsCi0gICAgICAgICAgICAgICAgIGlucHV0IHNlY3Rpb25zIGZvciB0aGlzIG91dHB1dCBzZWN0aW9uLiAgRklYTUU6IFRoaXMKLSAgICAgICAgICAgICAgICAgY29kZSBpcyBwcm9iYWJseSBub3QgbmVlZGVkIHRoZXNlIGRheXMgYW55aG93LCBzaW5jZQotICAgICAgICAgICAgICAgICB0aGUgbGlua2VyIG5vdyBkb2VzIG5vdCBjcmVhdGUgZW1wdHkgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQkgICAgICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotCQkgICYmIHN0cmNtcCAobmFtZSwKLQkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm91dHB1dF9zZWN0aW9uLT5vd25lciwKLQkJCQkJCSAgIHMtPm91dHB1dF9zZWN0aW9uKSkgPT0gMCkKLQkJc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0gICAgICAgICAgICAgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuCi0gICAgICAgICAgICAgICAgIElmIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gaXMgLnJlbC5keW4sIHdlIGFsd2F5cwotICAgICAgICAgICAgICAgICBhc3NlcnQgYSBEVF9URVhUUkVMIGVudHJ5IHJhdGhlciB0aGFuIHRlc3Rpbmcgd2hldGhlcgotICAgICAgICAgICAgICAgICB0aGVyZSBleGlzdHMgYSByZWxvY2F0aW9uIHRvIGEgcmVhZCBvbmx5IHNlY3Rpb24gb3IKLSAgICAgICAgICAgICAgICAgbm90LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDQpOwotCSAgICAgIGlmICgodGFyZ2V0ICE9IE5VTEwKLQkJICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgfHwgc3RyY21wIChvdXRuYW1lLCAKLQkJCSAgICAgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKSA9PSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAKLQkJCSAgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKSAhPSAwKQotCQlzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpID09IDApCi0JewotCSAgaW50IGk7Ci0gCSAgYmZkX3NpemVfdHlwZSBsb2FkYWJsZV9zaXplID0gMDsKLSAJICBiZmRfc2l6ZV90eXBlIGxvY2FsX2dvdG5vOwotIAkgIHN0cnVjdCBfYmZkICpzdWI7Ci0KLSAJICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzKSAhPSBOVUxMKTsKLQkgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRkYXRhOwotIAkgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAJICAvKiBDYWxjdWxhdGUgdGhlIHRvdGFsIGxvYWRhYmxlIHNpemUgb2YgdGhlIG91dHB1dC4gIFRoYXQKLSAJICAgICB3aWxsIGdpdmUgdXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIEdPVF9QQUdFIGVudHJpZXMKLSAJICAgICByZXF1aXJlZC4gICovCi0gCSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWI7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotIAkgICAgewotIAkgICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLSAKLSAJICAgICAgZm9yIChzdWJzZWN0aW9uID0gc3ViLT5zZWN0aW9uczsgCi0gCQkgICBzdWJzZWN0aW9uOyAKLSAJCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotIAkJewotIAkJICBpZiAoKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotIAkJICAgIGNvbnRpbnVlOwotIAkJICBsb2FkYWJsZV9zaXplICs9IChzdWJzZWN0aW9uLT5fcmF3X3NpemUgKyAweGYpICYgfjB4ZjsKLSAJCX0KLSAJICAgIH0KLSAJICBsb2FkYWJsZV9zaXplICs9IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCi0gCSAgLyogQXNzdW1lIHRoZXJlIGFyZSB0d28gbG9hZGFibGUgc2VnbWVudHMgY29uc2lzdGluZyBvZgotIAkgICAgIGNvbnRpZ3VvdXMgc2VjdGlvbnMuICBJcyA1IGVub3VnaD8gICovCi0gCSAgbG9jYWxfZ290bm8gPSAobG9hZGFibGVfc2l6ZSA+PiAxNikgKyA1OwotCSAgaWYgKElSSVhfQ09NUEFUIChvdXRwdXRfYmZkKSA9PSBpY3RfaXJpeDYpCi0JICAgIC8qIEl0J3MgcG9zc2libGUgd2Ugd2lsbCBuZWVkIEdPVF9QQUdFIGVudHJpZXMgYXMgd2VsbCBhcwotCSAgICAgICBHT1QxNiBlbnRyaWVzLiAgT2Z0ZW4sIHRoZXNlIHdpbGwgYmUgYWJsZSB0byBzaGFyZSBHT1QKLQkgICAgICAgZW50cmllcywgYnV0IG5vdCBhbHdheXMuICAqLwotCSAgICBsb2NhbF9nb3RubyAqPSAyOwotCi0gCSAgZy0+bG9jYWxfZ290bm8gKz0gbG9jYWxfZ290bm87Ci0gCSAgcy0+X3Jhd19zaXplICs9IGxvY2FsX2dvdG5vICogTUlQU19FTEZfR09UX1NJWkUgKGR5bm9iaik7Ci0KLSAJICAvKiBUaGVyZSBoYXMgdG8gYmUgYSBnbG9iYWwgR09UIGVudHJ5IGZvciBldmVyeSBzeW1ib2wgd2l0aAotIAkgICAgIGEgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggb2YgRFRfTUlQU19HT1RTWU0gb3IKLSAJICAgICBoaWdoZXIuICBUaGVyZWZvcmUsIGl0IG1ha2Ugc2Vuc2UgdG8gcHV0IHRob3NlIHN5bWJvbHMKLSAJICAgICB0aGF0IG5lZWQgR09UIGVudHJpZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLiAgV2UKLSAJICAgICBkbyB0aGF0IGhlcmUuICAqLwotIAkgIGlmICghbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIChpbmZvLCAxKSkKLSAJICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGctPmdsb2JhbF9nb3RzeW0gIT0gTlVMTCkKLQkgICAgaSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgLSBnLT5nbG9iYWxfZ290c3ltLT5keW5pbmR4OwotCSAgZWxzZQotCSAgICAvKiBJZiB0aGVyZSBhcmUgbm8gZ2xvYmFsIHN5bWJvbHMsIG9yIG5vbmUgcmVxdWlyaW5nCi0JICAgICAgIHJlbG9jYXRpb25zLCB0aGVuIEdMT0JBTF9HT1RTWU0gd2lsbCBiZSBOVUxMLiAgKi8KLQkgICAgaSA9IDA7Ci0JICBnLT5nbG9iYWxfZ290bm8gPSBpOwotCSAgcy0+X3Jhd19zaXplICs9IGkgKiBNSVBTX0VMRl9HT1RfU0laRSAoZHlub2JqKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkgPT0gMCkKLQl7Ci0JICAvKiBJcml4IHJsZCBhc3N1bWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHN0dWIgaXNuJ3QgYXQgdGhlIGVuZAotCSAgICAgb2YgLnRleHQgc2VjdGlvbi4gU28gcHV0IGEgZHVtbXkuIFhYWCAgKi8KLQkgIHMtPl9yYXdfc2l6ZSArPSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRTsKLQl9Ci0gICAgICBlbHNlIGlmICghIGluZm8tPnNoYXJlZAotCSAgICAgICAmJiAhIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIucmxkX21hcCIsIDgpID09IDApCi0JewotCSAgLyogV2UgYWRkIGEgcm9vbSBmb3IgX19ybGRfbWFwLiBJdCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUKLQkgICAgIHJ0bGQgdG8gY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIF9yX2RlYnVnIHN0cnVjdHVyZS4gICovCi0JICBzLT5fcmF3X3NpemUgKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKQotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmNvbXBhY3RfcmVsIiwgMTIpID09IDApCi0Jcy0+X3Jhd19zaXplICs9IG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpCi0JICAgICAgID09IDApCi0Jcy0+X3Jhd19zaXplID0gKHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfTXN5bSkgCi0JCQkqIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50Ci0JCQkgICArIGJmZF9jb3VudF9zZWN0aW9ucyAob3V0cHV0X2JmZCkpKTsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuaW5pdCIsIDUpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfbWlwc19maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotCSAgICB7Ci0JICAgICAgLyogU0dJIG9iamVjdCBoYXMgdGhlIGVxdWl2YWxlbmNlIG9mIERUX0RFQlVHIGluIHRoZQotCQkgRFRfTUlQU19STERfTUFQIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19STERfTUFQLCAwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfUExUR09ULCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLAotCQkJCSAgIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChkeW5vYmopKSkKLQl7Ci0JICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfUkVMU1osIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9SRUxFTlQsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19DT05GTElDVE5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0xJQkxJU1ROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb25mbGljdCIpICE9IE5VTEwpCi0JewotCSAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfQ09ORkxJQ1QsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmxpYmxpc3QiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0xJQkxJU1QsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19STERfVkVSU0lPTiwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19GTEFHUywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgMAotICAgICAgLyogVGltZSBzdGFtcHMgaW4gZXhlY3V0YWJsZSBmaWxlcyBhcmUgYSBiYWQgaWRlYS4gICovCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19USU1FX1NUQU1QLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotI2lmIDAgLyogRklYTUUgICovCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19JQ0hFQ0tTVU0sIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0jaWYgMCAvKiBGSVhNRSAgKi8KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0lWRVJTSU9OLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfQkFTRV9BRERSRVNTLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0xPQ0FMX0dPVE5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX1NZTVRBQk5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX1VOUkVGRVhUTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfR09UU1lNLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChJUklYX0NPTVBBVCAoZHlub2JqKSA9PSBpY3RfaXJpeDUKLQkgICYmICEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfSElQQUdFTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKElSSVhfQ09NUEFUIChkeW5vYmopID09IGljdF9pcml4NgotCSAgJiYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIAotCSAgICAgIChkeW5vYmosIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChkeW5vYmopKSkKLQkgICYmICFNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19PUFRJT05TLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgICBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoZHlub2JqKSkKLQkgICYmICFNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19NU1lNLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJZiBOQU1FIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBJUklYNiBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIGxpbmtlciwKLSAgIGFkanVzdCBpdCBhcHByb3ByaWF0ZWx5IG5vdy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZl9pcml4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wgKGFiZmQsIG5hbWUsIHN5bSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgLyogVGhlIGxpbmtlciBzY3JpcHQgdGFrZXMgY2FyZSBvZiBwcm92aWRpbmcgbmFtZXMgYW5kIHZhbHVlcyBmb3IKLSAgICAgdGhlc2UsIGJ1dCB3ZSBtdXN0IHBsYWNlIHRoZW0gaW50byB0aGUgcmlnaHQgc2VjdGlvbnMuICAqLwotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgdGV4dF9zZWN0aW9uX3N5bWJvbHNbXSA9IHsKLSAgICAiX2Z0ZXh0IiwKLSAgICAiX2V0ZXh0IiwKLSAgICAiX19kc29fZGlzcGxhY2VtZW50IiwKLSAgICAiX19lbGZfaGVhZGVyIiwKLSAgICAiX19wcm9ncmFtX2hlYWRlcl90YWJsZSIsCi0gICAgTlVMTAotICB9OwotCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBkYXRhX3NlY3Rpb25fc3ltYm9sc1tdID0gewotICAgICJfZmRhdGEiLAotICAgICJfZWRhdGEiLAotICAgICJfZW5kIiwKLSAgICAiX2Zic3MiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBjb25zdCAqcDsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkKLSAgICBmb3IgKHAgPSAoaSA9PSAwKSA/IHRleHRfc2VjdGlvbl9zeW1ib2xzIDogZGF0YV9zZWN0aW9uX3N5bWJvbHM7IAotCSAqcDsKLQkgKytwKQotICAgICAgaWYgKHN0cmNtcCAoKnAsIG5hbWUpID09IDApCi0JewotCSAgLyogQWxsIG9mIHRoZXNlIHN5bWJvbHMgYXJlIGdpdmVuIHR5cGUgU1RUX1NFQ1RJT04gYnkgdGhlCi0JICAgICBJUklYNiBsaW5rZXIuICAqLwotCSAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLQkgIAotCSAgLyogVGhlIElSSVggbGlua2VyIHB1dHMgdGhlc2Ugc3ltYm9scyBpbiBzcGVjaWFsIHNlY3Rpb25zLiAgKi8KLQkgIGlmIChpID09IDApCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19URVhUOwotCSAgZWxzZQotCSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfREFUQTsKLQkgIAotCSAgYnJlYWs7Ci0JfQotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotICBiZmRfdm1hIGd2YWw7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc21zeW07Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICptaDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZ3ZhbCA9IHN5bS0+c3RfdmFsdWU7Ci0gIG1oID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBiZmRfYnl0ZSAqcDsKLSAgICAgIGJmZF9ieXRlIHN0dWJbTUlQU19GVU5DVElPTl9TVFVCX1NJWkVdOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYSBzdHViLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgICBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAoZHlub2JqKSk7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBGaWxsIHRoZSBzdHViLiAgKi8KLSAgICAgIHAgPSBzdHViOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9MVyhvdXRwdXRfYmZkKSwgcCk7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX01PVkUsIHApOwotICAgICAgcCArPSA0OwotCi0gICAgICAvKiBGSVhNRTogQ2FuIGgtPmR5bmluZGV4IGJlIG1vcmUgdGhhbiA2NEs/ICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggJiAweGZmZmYwMDAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9KQUxSLCBwKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfTEkxNiArIGgtPmR5bmluZHgsIHApOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5wbHQub2Zmc2V0IDw9IHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBtZW1jcHkgKHMtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgc3R1YiwgTUlQU19GVU5DVElPTl9TVFVCX1NJWkUpOwotCi0gICAgICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLiAgcGx0Lm9mZnNldCAhPSAtMSBvY2N1cnMKLQkgb25seSBmb3IgdGhlIHJlZmVyZW5jZWQgc3ltYm9sLiAgKi8KLSAgICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0KLSAgICAgIC8qIFRoZSBydW4tdGltZSBsaW5rZXIgdXNlcyB0aGUgc3RfdmFsdWUgZmllbGQgb2YgdGhlIHN5bWJvbAotCSB0byByZXNldCB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgdGhpcyBleHRlcm5hbAotCSB0byBpdHMgc3R1YiBhZGRyZXNzIHdoZW4gdW5saW5raW5nIGEgc2hhcmVkIG9iamVjdC4gICovCi0gICAgICBndmFsID0gcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQgKyBoLT5wbHQub2Zmc2V0OwotICAgICAgc3ltLT5zdF92YWx1ZSA9IGd2YWw7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gIHNnb3QgPSBtaXBzX2VsZl9nb3Rfc2VjdGlvbiAoZHlub2JqKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0gIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotCi0gIC8qIFJ1biB0aHJvdWdoIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlLCBjcmVhdGluZyBHT1QgZW50cmllcyBmb3IgYWxsCi0gICAgIHRoZSBzeW1ib2xzIHRoYXQgbmVlZCB0aGVtLiAgKi8KLSAgaWYgKGctPmdsb2JhbF9nb3RzeW0gIT0gTlVMTAotICAgICAgJiYgaC0+ZHluaW5keCA+PSBnLT5nbG9iYWxfZ290c3ltLT5keW5pbmR4KQotICAgIHsKLSAgICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLQotICAgICAgaWYgKHN5bS0+c3RfdmFsdWUpCi0JdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotICAgICAgZWxzZQotCS8qIEZvciBhbiBlbnRpdHkgZGVmaW5lZCBpbiBhIHNoYXJlZCBvYmplY3QsIHRoaXMgd2lsbCBiZQotCSAgIE5VTEwuICAoRm9yIGZ1bmN0aW9ucyBpbiBzaGFyZWQgb2JqZWN0cyBmb3IKLQkgICB3aGljaCB3ZSBoYXZlIGNyZWF0ZWQgc3R1YnMsIFNUX1ZBTFVFIHdpbGwgYmUgbm9uLU5VTEwuCi0JICAgVGhhdCdzIGJlY2F1c2Ugc3VjaCB0aGUgZnVuY3Rpb25zIGFyZSBub3cgbm8gbG9uZ2VyIGRlZmluZWQKLQkgICBpbiBhIHNoYXJlZCBvYmplY3QuKSAgKi8KLQl2YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgICAgIG9mZnNldCA9IG1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXggKGR5bm9iaiwgaCk7Ci0gICAgICBNSVBTX0VMRl9QVVRfV09SRCAob3V0cHV0X2JmZCwgdmFsdWUsIHNnb3QtPmNvbnRlbnRzICsgb2Zmc2V0KTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGEgLm1zeW0gZW50cnksIGlmIGFwcHJvcHJpYXRlLiAgKi8KLSAgc21zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgICBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoZHlub2JqKSk7Ci0gIGlmIChzbXN5bSkKLSAgICB7Ci0gICAgICBFbGYzMl9JbnRlcm5hbF9Nc3ltIG1zeW07Ci0KLSAgICAgIG1zeW0ubXNfaGFzaF92YWx1ZSA9IGJmZF9lbGZfaGFzaCAoaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gICAgICAvKiBJdCBpcyB1bmRvY3VtZW50ZWQgd2hhdCB0aGUgYDEnIGluZGljYXRlcywgYnV0IElSSVg2IHVzZXMKLQkgdGhpcyB2YWx1ZS4gICovCi0gICAgICBtc3ltLm1zX2luZm8gPSBFTEYzMl9NU19JTkZPIChtaC0+bWluX2R5bl9yZWxvY19pbmRleCwgMSk7Ci0gICAgICBiZmRfbWlwc19lbGZfc3dhcF9tc3ltX291dCAKLQkoZHlub2JqLCAmbXN5bSwKLQkgKChFbGYzMl9FeHRlcm5hbF9Nc3ltICopIHNtc3ltLT5jb250ZW50cykgKyBoLT5keW5pbmR4KTsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIGlmIChzdHJjbXAgKG5hbWUsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAobmFtZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9EWU5BTUlDX0xJTksiKSA9PSAwKQotICAgIHsKLSAgICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotICAgICAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS0+c3RfdmFsdWUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIl9ncF9kaXNwIikgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQkgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7Ci0JICBzeW0tPnN0X3ZhbHVlID0gZWxmX2dwIChvdXRwdXRfYmZkKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMF0pID09IDAKLQkgICAgICAgfHwgc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzFdKSA9PSAwKQotCXsKLQkgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7Ci0JICBzeW0tPnN0X290aGVyID0gU1RPX1BST1RFQ1RFRDsKLQkgIHN5bS0+c3RfdmFsdWUgPSAwOwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX0RBVEE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzJdKSA9PSAwKQotCXsKLQkgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7Ci0JICBzeW0tPnN0X290aGVyID0gU1RPX1BST1RFQ1RFRDsKLQkgIHN5bS0+c3RfdmFsdWUgPSBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cHJvY2VkdXJlX2NvdW50OwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQUJTKQotCXsKLQkgIGlmIChoLT50eXBlID09IFNUVF9GVU5DKQotCSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfVEVYVDsKLQkgIGVsc2UgaWYgKGgtPnR5cGUgPT0gU1RUX09CSkVDVCkKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX0RBVEE7Ci0JfQotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIElSSVg2LXNwZWNpZmljIHN5bWJvbHMuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKG91dHB1dF9iZmQpID09IGljdF9pcml4NikKLSAgICBtaXBzX2VsZl9pcml4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIG5hbWUsIHN5bSk7Ci0KLSAgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpCi0gICAgICAmJiAhIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBpZiAoISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgJiYgc3RyY21wIChuYW1lLCAiX19ybGRfbWFwIikgPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmxkX21hcCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHN5bS0+c3RfdmFsdWUgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzLT5jb250ZW50cyk7Ci0JICBpZiAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZSA9PSAwKQotCSAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID0gc3ltLT5zdF92YWx1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICJfX3JsZF9vYmpfaGVhZCIpID09IDApCi0JewotCSAgLyogSVJJWDYgZG9lcyBub3QgdXNlIGEgLnJsZF9tYXAgc2VjdGlvbi4gICovCi0JICBpZiAoSVJJWF9DT01QQVQgKG91dHB1dF9iZmQpID09IGljdF9pcml4NSkKLQkgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ybGRfbWFwIikgCi0JCQkhPSBOVUxMKTsKLQkgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIG1pcHMxNiBzeW1ib2wsIGZvcmNlIHRoZSB2YWx1ZSB0byBiZSBldmVuLiAgKi8KLSAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNgotICAgICAgJiYgKHN5bS0+c3RfdmFsdWUgJiAxKSAhPSAwKQotICAgIC0tc3ltLT5zdF92YWx1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIHNnb3QgPSBtaXBzX2VsZl9nb3Rfc2VjdGlvbiAoZHlub2JqKTsKLSAgaWYgKHNnb3QgPT0gTlVMTCkKLSAgICBnID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotICAgICAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gICAgICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmI7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7Ci0gICAgICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotCi0gICAgICBmb3IgKGIgPSBzZHluLT5jb250ZW50czsKLQkgICBiIDwgc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemU7Ci0JICAgYiArPSBNSVBTX0VMRl9EWU5fU0laRSAoZHlub2JqKSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBzaXplX3QgZWxlbXNpemU7Ci0JICBhc2VjdGlvbiAqczsKLQkgIGJvb2xlYW4gc3dhcF9vdXRfcDsKLQotCSAgLyogUmVhZCBpbiB0aGUgY3VycmVudCBkeW5hbWljIGVudHJ5LiAgKi8KLQkgICgqZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaiktPnMtPnN3YXBfZHluX2luKSAoZHlub2JqLCBiLCAmZHluKTsKLQkgIAotCSAgLyogQXNzdW1lIHRoYXQgd2UncmUgZ29pbmcgdG8gbW9kaWZ5IGl0IGFuZCB3cml0ZSBpdCBvdXQuICAqLwotCSAgc3dhcF9vdXRfcCA9IHRydWU7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUkVMRU5UOgotCSAgICAgIHMgPSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JCSAgIChkeW5vYmosCi0JCSAgICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAoZHlub2JqKSkpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBNSVBTX0VMRl9SRUxfU0laRSAoZHlub2JqKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1NUUlNaOgotCSAgICAgIC8qIFJld3JpdGUgRFRfU1RSU1ouICAqLwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0KLQkJX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUR09UOgotCSAgICAgIG5hbWUgPSAiLmdvdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1Q6Ci0JICAgICAgbmFtZSA9ICIuY29uZmxpY3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1Q6Ci0JICAgICAgbmFtZSA9ICIubGlibGlzdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19STERfVkVSU0lPTjoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IDE7IC8qIFhYWCAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19GTEFHUzoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IFJIRl9OT1RQT1Q7IC8qIFhYWCAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19DT05GTElDVE5POgotCSAgICAgIG5hbWUgPSAiLmNvbmZsaWN0IjsKLQkgICAgICBlbGVtc2l6ZSA9IHNpemVvZiAoRWxmMzJfQ29uZmxpY3QpOwotCSAgICAgIGdvdG8gc2V0X2VsZW1ubzsKLQotCSAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgotCSAgICAgIG5hbWUgPSAiLmxpYmxpc3QiOwotCSAgICAgIGVsZW1zaXplID0gc2l6ZW9mIChFbGYzMl9MaWIpOwotCSAgICBzZXRfZWxlbW5vOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplIC8gZWxlbXNpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemUgLyBlbGVtc2l6ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJICAgIGR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfVElNRV9TVEFNUDoKLQkgICAgICB0aW1lICgodGltZV90ICopICZkeW4uZF91bi5kX3ZhbCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0lDSEVDS1NVTToKLQkgICAgICAvKiBYWFggRklYTUU6ICovCi0JICAgICAgc3dhcF9vdXRfcCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19JVkVSU0lPTjoKLQkgICAgICAvKiBYWFggRklYTUU6ICovCi0JICAgICAgc3dhcF9vdXRfcCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19CQVNFX0FERFJFU1M6Ci0JICAgICAgcyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWEgJiB+KDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0xPQ0FMX0dPVE5POgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gZy0+bG9jYWxfZ290bm87Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX1VOUkVGRVhUTk86Ci0JICAgICAgLyogVGhlIGluZGV4IGludG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHdoaWNoIGlzIHRoZQotCQkgZW50cnkgb2YgdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbCB0aGF0IGlzIG5vdAotCQkgcmVmZXJlbmNlZCB3aXRoaW4gdGhlIHNhbWUgb2JqZWN0LiAgKi8KLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGJmZF9jb3VudF9zZWN0aW9ucyAob3V0cHV0X2JmZCkgKyAxOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19HT1RTWU06Ci0JICAgICAgaWYgKGctPmdsb2JhbF9nb3RzeW0pCi0JCXsKLQkJICBkeW4uZF91bi5kX3ZhbCA9IGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHg7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAvKiBJbiBjYXNlIGlmIHdlIGRvbid0IGhhdmUgZ2xvYmFsIGdvdCBzeW1ib2xzIHdlIGRlZmF1bHQKLQkJIHRvIHNldHRpbmcgRFRfTUlQU19HT1RTWU0gdG8gdGhlIHNhbWUgdmFsdWUgYXMKLQkJIERUX01JUFNfU1lNVEFCTk8sIHNvIHdlIGp1c3QgZmFsbCB0aHJvdWdoLiAgKi8KLQotCSAgICBjYXNlIERUX01JUFNfU1lNVEFCTk86Ci0JICAgICAgbmFtZSA9ICIuZHluc3ltIjsKLQkgICAgICBlbGVtc2l6ZSA9IE1JUFNfRUxGX1NZTV9TSVpFIChvdXRwdXRfYmZkKTsKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplIC8gZWxlbXNpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZSAvIGVsZW1zaXplOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19ISVBBR0VOTzoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGctPmxvY2FsX2dvdG5vIC0gTUlQU19SRVNFUlZFRF9HT1ROTzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfUkxEX01BUDoKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX09QVElPTlM6Ci0JICAgICAgcyA9IChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAKLQkJICAgKG91dHB1dF9iZmQsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19NU1lNOgotCSAgICAgIHMgPSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JCSAgIChvdXRwdXRfYmZkLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHN3YXBfb3V0X3AgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3dhcF9vdXRfcCkKLQkgICAgKCpnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZHlub2JqKS0+cy0+c3dhcF9keW5fb3V0KSAKLQkgICAgICAoZHlub2JqLCAmZHluLCBiKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGJlIGZpbGxlZCBhdAotICAgICBydW50aW1lLiBUaGUgc2Vjb25kIGVudHJ5IHdpbGwgYmUgdXNlZCBieSBzb21lIHJ1bnRpbWUgbG9hZGVycy4KLSAgICAgVGhpcyBpc24ndCB0aGUgY2FzZSBvZiBJcml4IHJsZC4gKi8KLSAgaWYgKHNnb3QgIT0gTlVMTCAmJiBzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIE1JUFNfRUxGX1BVVF9XT1JEIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgTUlQU19FTEZfUFVUX1dPUkQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAweDgwMDAwMDAwLCAKLQkJCSBzZ290LT5jb250ZW50cyArIE1JUFNfRUxGX0dPVF9TSVpFIChvdXRwdXRfYmZkKSk7Ci0gICAgfQotCi0gIGlmIChzZ290ICE9IE5VTEwpCi0gICAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplCi0gICAgICA9IE1JUFNfRUxGX0dPVF9TSVpFIChvdXRwdXRfYmZkKTsKLQotICB7Ci0gICAgYXNlY3Rpb24gKnNtc3ltOwotICAgIGFzZWN0aW9uICpzOwotICAgIEVsZjMyX2NvbXBhY3RfcmVsIGNwdDsKLQotICAgIC8qID8/PyBUaGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zIHdlcmUgc2V0IHVwIGluCi0gICAgICAgX2JmZF9lbGZfZmluYWxfbGluay4gIFNHSSBzZXRzIHRoZSBTVFRfTk9UWVBFIGF0dHJpYnV0ZSBmb3IgdGhlc2UKLSAgICAgICBzeW1ib2xzLiAgU2hvdWxkIHdlIGRvIHNvPyAgKi8KLQotICAgIHNtc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgICBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoZHlub2JqKSk7Ci0gICAgaWYgKHNtc3ltICE9IE5VTEwpCi0gICAgICB7Ci0JRWxmMzJfSW50ZXJuYWxfTXN5bSBtc3ltOwotCi0JbXN5bS5tc19oYXNoX3ZhbHVlID0gMDsKLQltc3ltLm1zX2luZm8gPSBFTEYzMl9NU19JTkZPICgwLCAxKTsKLQotCWZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgewotCSAgICBsb25nIGR5bmluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keDsKLQotCSAgICBiZmRfbWlwc19lbGZfc3dhcF9tc3ltX291dCAKLQkgICAgICAob3V0cHV0X2JmZCwgJm1zeW0sCi0JICAgICAgICgoKEVsZjMyX0V4dGVybmFsX01zeW0gKikgc21zeW0tPmNvbnRlbnRzKQotCQkrIGR5bmluZHgpKTsKLQkgIH0KLSAgICAgIH0KLQotICAgIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLSAgICAgIHsKLQkvKiBXcml0ZSAuY29tcGFjdF9yZWwgc2VjdGlvbiBvdXQuICAqLwotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbXBhY3RfcmVsIik7Ci0JaWYgKHMgIT0gTlVMTCkKLQkgIHsKLQkgICAgY3B0LmlkMSA9IDE7Ci0JICAgIGNwdC5udW0gPSBzLT5yZWxvY19jb3VudDsKLQkgICAgY3B0LmlkMiA9IDI7Ci0JICAgIGNwdC5vZmZzZXQgPSAocy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MKLQkJCSAgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKSk7Ci0JICAgIGNwdC5yZXNlcnZlZDAgPSAwOwotCSAgICBjcHQucmVzZXJ2ZWQxID0gMDsKLQkgICAgYmZkX2VsZjMyX3N3YXBfY29tcGFjdF9yZWxfb3V0IChvdXRwdXRfYmZkLCAmY3B0LAotCQkJCQkgICAgKChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCAqKQotCQkJCQkgICAgIHMtPmNvbnRlbnRzKSk7Ci0KLQkgICAgLyogQ2xlYW4gdXAgYSBkdW1teSBzdHViIGZ1bmN0aW9uIGVudHJ5IGluIC50ZXh0LiAgKi8KLQkgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCQkgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotCSAgICBpZiAocyAhPSBOVUxMKQotCSAgICAgIHsKLQkJZmlsZV9wdHIgZHVtbXlfb2Zmc2V0OwotCi0JCUJGRF9BU1NFUlQgKHMtPl9yYXdfc2l6ZSA+PSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0JCWR1bW15X29mZnNldCA9IHMtPl9yYXdfc2l6ZSAtIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCQltZW1zZXQgKHMtPmNvbnRlbnRzICsgZHVtbXlfb2Zmc2V0LCAwLAotCQkJTUlQU19GVU5DVElPTl9TVFVCX1NJWkUpOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIENsZWFuIHVwIGEgZmlyc3QgcmVsb2NhdGlvbiBpbiAucmVsLmR5bi4gICovCi0gICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAoZHlub2JqKSk7Ci0gICAgaWYgKHMgIT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgPiAwKQotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgTUlQU19FTEZfUkVMX1NJWkUgKGR5bm9iaikpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gYmZkX2dlbmVyaWNfZ2V0Xy4uLiBleGNlcHQgdGhhdCBzb21lCi0gICBNSVBTIHJlbG9jYXRpb25zIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHkuICBTaWdoLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLWVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCSAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiByZWFkIGluIHRoZSBzZWN0aW9uICovCi0gIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJIChQVFIpIGRhdGEsCi0JCQkJIDAsCi0JCQkJIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2UncmUgbm90IHJlbGF4aW5nIHRoZSBzZWN0aW9uLCBzbyBqdXN0IGNvcHkgdGhlIHNpemUgaW5mbyAqLwotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudDsKLSAgICAgIC8qIGZvciBtaXBzICovCi0gICAgICBpbnQgZ3BfZm91bmQ7Ci0gICAgICBiZmRfdm1hIGdwID0gMHgxMjM0NTY3ODsJLyogaW5pdGlhbGl6ZSBqdXN0IHRvIHNodXQgZ2NjIHVwICovCi0KLSAgICAgIHsKLQlzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmg7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmxoOwotCS8qIFNraXAgYWxsIHRoaXMgc3R1ZmYgaWYgd2UgYXJlbid0IG1peGluZyBmb3JtYXRzLiAgKi8KLQlpZiAoYWJmZCAmJiBpbnB1dF9iZmQKLQkgICAgJiYgYWJmZC0+eHZlYyA9PSBpbnB1dF9iZmQtPnh2ZWMpCi0JICBsaCA9IDA7Ci0JZWxzZQotCSAgewotCSAgICBoID0gYmZkX2hhc2hfbG9va3VwICgmbGlua19pbmZvLT5oYXNoLT50YWJsZSwgIl9ncCIsIGZhbHNlLCBmYWxzZSk7Ci0JICAgIGxoID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JICB9Ci0gICAgICBsb29rdXA6Ci0JaWYgKGxoKQotCSAgewotCSAgICBzd2l0Y2ggKGxoLT50eXBlKQotCSAgICAgIHsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkJZ3BfZm91bmQgPSAwOwotCQlicmVhazsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkJZ3BfZm91bmQgPSAxOwotCQlncCA9IGxoLT51LmRlZi52YWx1ZTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotCQlsaCA9IGxoLT51LmkubGluazsKLQkJLyogQEBGSVhNRSAgaWdub3Jpbmcgd2FybmluZyBmb3Igbm93ICovCi0JCWdvdG8gbG9va3VwOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0JICAgICAgZGVmYXVsdDoKLQkJYWJvcnQgKCk7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIGdwX2ZvdW5kID0gMDsKLSAgICAgIH0KLSAgICAgIC8qIGVuZCBtaXBzICovCi0gICAgICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudCAhPSAoYXJlbGVudCAqKSBOVUxMOwotCSAgIHBhcmVudCsrKQotCXsKLQkgIGNoYXIgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBOVUxMOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLQkgIC8qIFNwZWNpZmljIHRvIE1JUFM6IERlYWwgd2l0aCByZWxvY2F0aW9uIHR5cGVzIHRoYXQgcmVxdWlyZQotCSAgICAga25vd2luZyB0aGUgZ3Agb2YgdGhlIG91dHB1dCBiZmQuICAqLwotCSAgYXN5bWJvbCAqc3ltID0gKigqcGFyZW50KS0+c3ltX3B0cl9wdHI7Ci0JICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pICYmIGFiZmQpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgc3BlY2lhbF9mdW5jdGlvbiB3b3VsZG4ndCBnZXQgY2FsbGVkIGFueXdheXMuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmICghZ3BfZm91bmQpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgZ3AgaXNuJ3QgdGhlcmU7IGxldCB0aGUgc3BlY2lhbCBmdW5jdGlvbiBjb2RlCi0JCSBmYWxsIG92ZXIgb24gaXRzIG93bi4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKCgqcGFyZW50KS0+aG93dG8tPnNwZWNpYWxfZnVuY3Rpb24KLQkJICAgPT0gX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jKQotCSAgICB7Ci0JICAgICAgLyogYnlwYXNzIHNwZWNpYWxfZnVuY3Rpb24gY2FsbCAqLwotCSAgICAgIHIgPSBncHJlbDE2X3dpdGhfZ3AgKGlucHV0X2JmZCwgc3ltLCAqcGFyZW50LCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgIHJlbG9jYXRlYWJsZSwgKFBUUikgZGF0YSwgZ3ApOwotCSAgICAgIGdvdG8gc2tpcF9iZmRfcGVyZm9ybV9yZWxvY2F0aW9uOwotCSAgICB9Ci0JICAvKiBlbmQgbWlwcyBzcGVjaWZpYyBzdHVmZiAqLwotCi0JICByID0gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLAotCQkJCSAgICAgICpwYXJlbnQsCi0JCQkJICAgICAgKFBUUikgZGF0YSwKLQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIHJlbG9jYXRlYWJsZSA/IGFiZmQgOiAoYmZkICopIE5VTEwsCi0JCQkJICAgICAgJmVycm9yX21lc3NhZ2UpOwotCXNraXBfYmZkX3BlcmZvcm1fcmVsb2NhdGlvbjoKLQotCSAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpvcyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0JICAgICAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcyAqLwotCSAgICAgIG9zLT5vcmVsb2NhdGlvbltvcy0+cmVsb2NfY291bnRdID0gKnBhcmVudDsKLQkgICAgICBvcy0+cmVsb2NfY291bnQrKzsKLQkgICAgfQotCi0JICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHIpCi0JCXsKLQkJY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JCSAgQkZEX0FTU0VSVCAoZXJyb3JfbWVzc2FnZSAhPSAoY2hhciAqKSBOVUxMKTsKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCQkobGlua19pbmZvLCBlcnJvcl9tZXNzYWdlLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgKCpwYXJlbnQpLT5ob3d0by0+bmFtZSwgKCpwYXJlbnQpLT5hZGRlbmQsCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZGF0YTsKLQotZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCBtaXBzX2VsZjMyX2Vjb2ZmX2RlYnVnX3N3YXAgPQotewotICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgbWFnaWNTeW0sCi0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgNCwKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gIGVjb2ZmX3N3YXBfcGRyX2luLAotICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gIGVjb2ZmX3N3YXBfZmRyX2luLAotICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgZWNvZmZfc3dhcF9leHRfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgZWNvZmZfc3dhcF9leHRfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICBfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbwotfTsKLQwKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGYzMi1saXR0bGVtaXBzIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItYmlnbWlwcyIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9taXBzCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX01JUFMKLQotLyogVGhlIFNWUjQgTUlQUyBBQkkgc2F5cyB0aGF0IHRoaXMgc2hvdWxkIGJlIDB4MTAwMDAsIGJ1dCBJcml4IDUgdXNlcwotICAgYSB2YWx1ZSBvZiAweDEwMDAsIGFuZCB3ZSBhcmUgY29tcGF0aWJsZS4gICovCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NvbGxlY3QJCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9zaWduX2V4dGVuZF92bWEJdHJ1ZQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJbWlwc19pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQltaXBzX2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwJbWlwc19lbGZfc3ltX2lzX2dsb2JhbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJX2JmZF9taXBzX2VsZl9vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcglfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBcCi0JCQkJCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZwlfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZwlfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJX2JmZF9taXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCSZtaXBzX2VsZjMyX2Vjb2ZmX2RlYnVnX3N3YXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCV9iZmRfbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCV9iZmRfbWlwc19lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJX2JmZF9taXBzX2VsZl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCSg0Kk1JUFNfUkVTRVJWRURfR09UTk8pCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLQkJCQkJbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmMzJfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmMzJfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQlfYmZkX21pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCV9iZmRfbWlwc19lbGZfZmluYWxfbGluawotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItcGouYyBiL2JmZC9lbGYzMi1wai5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk2OTQ5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1wai5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qIHBpY29KYXZhIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhbiBvZiBUcmFuc21ldGEgKHNhY0Bwb2JveC5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9wai5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBqX2VsZl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpwal9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgcGpfZWxmX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBwal9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9QSl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICBTZXR0aW5nIHBhcnRpYWxfaW5wbGFjZSB0byB0cnVlIGFuZAotICAgICBzcmNfbWFzayB0byBhIG5vbi16ZXJvIHZhbHVlIGlzIHNpbWlsYXIgdG8gdGhlIENPRkYgdG9vbGNoYWluLiAgKi8KLSAgSE9XVE8gKFJfUEpfREFUQV9ESVIzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfRElSMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUEpfQ09ERV9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUEpfQ09ERV9SRUwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmNncgKi8KLQkgcGpfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QSl9SRUwxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgRU1QVFlfSE9XVE8gKDQpLAotICBFTVBUWV9IT1dUTyAoNSksCi0gIEhPV1RPIChSX1BKX0NPREVfRElSMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfQ09ERV9ESVIzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBFTVBUWV9IT1dUTyAoNyksCi0gIEVNUFRZX0hPV1RPICg4KSwKLSAgRU1QVFlfSE9XVE8gKDkpLAotICBFTVBUWV9IT1dUTyAoMTApLAotICBFTVBUWV9IT1dUTyAoMTEpLAotICBFTVBUWV9IT1dUTyAoMTIpLAotCi0gIEhPV1RPIChSX1BKX0NPREVfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcGpfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QSl9MTzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0KLSAgICBIT1dUTyAoUl9QSl9DT0RFX0hJMTYsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX0hJMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfUEpfR05VX1ZUSU5IRVJJVCwgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfUEpfR05VX1ZUSU5IRVJJVCIsICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9QSl9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfUEpfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0KLX07Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igbm9ybWFsIHJlbG9jcy4gIFRoaXMgaXMgbGlrZSB0aGUgQ09GRgotICAgZnVuY3Rpb24sIGFuZCBpcyBhbG1vc3QgY2VydGFpbmx5IGluY29ycmVjdCBmb3Igb3RoZXIgRUxGIHRhcmdldHMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wal9lbGZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF92bWEgc3ltX3ZhbHVlOwotICBlbnVtIGVsZl9wal9yZWxvY190eXBlIHJfdHlwZTsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGFkZHIgKyAoYmZkX2J5dGUgKikgZGF0YTsKLQotICByX3R5cGUgPSAoZW51bSBlbGZfcGpfcmVsb2NfdHlwZSkgcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nLS1kbyBub3RoaW5nLiAgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAoc3ltYm9sX2luICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHN5bV92YWx1ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgCi0gICAgc3ltX3ZhbHVlID0gKHN5bWJvbF9pbi0+dmFsdWUgKwotCQkgc3ltYm9sX2luLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9QSl9EQVRBX0RJUjMyOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBSZWxvY2F0aW9ucyBpbiBjb2RlIGFyZSBhbHdheXMgYmlnZW5kaWFuLCBubyBtYXR0ZXIgd2hhdCB0aGUKLQkgZGF0YSBlbmRpYW5uZXNzIGlzLiAqLwotCi0gICAgY2FzZSBSX1BKX0NPREVfRElSMzI6Ci0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgYmZkX3B1dGIzMiAoaW5zbiwgaGl0X2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfUEpfQ09ERV9SRUwxNjoKLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQKLSAgICAgICAgLSAgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBiZmRfcHV0YjE2IChpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUEpfQ09ERV9MTzE2OgotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRiMTYgKGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1BKX0NPREVfSEkxNjoKLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IChzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kKSA+PiAxNjsKLSAgICAgIGJmZF9wdXRiMTYgKGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIEJGRCByZWxvYyBjb2RlcyB0byBQSiBFTEYgcmVsb2NzLiAgKi8KLQotc3RydWN0IGVsZl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLS8qIEFuIGFycmF5IG1hcHBpbmcgQkZEIHJlbG9jIGNvZGVzIHRvIFBKIEVMRiByZWxvY3MuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZl9yZWxvY19tYXAgcGpfcmVsb2NfbWFwW10gPQotewotICAgIHsgQkZEX1JFTE9DX05PTkUsIAkJUl9QSl9OT05FICAgICAgICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfMzIsIAkJUl9QSl9EQVRBX0RJUjMyICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNiwgCVJfUEpfQ09ERV9ESVIxNiAgICB9LAotICAgIHsgQkZEX1JFTE9DX1BKX0NPREVfRElSMzIsIAlSX1BKX0NPREVfRElSMzIgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0xPMTYsIAlSX1BKX0NPREVfTE8xNiAgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0hJMTYsIAlSX1BKX0NPREVfSEkxNiAgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX1JFTDMyLCAgUl9QSl9DT0RFX1JFTDMyICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNiwgIFJfUEpfQ09ERV9SRUwxNiAgICB9LAotICAgIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1BKX0dOVV9WVElOSEVSSVQgfSwKLSAgICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksICAgUl9QSl9HTlVfVlRFTlRSWSAgIH0sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCi0gICBjb3JyZXNwb25kaW5nIFBKIEVMZiByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXBqX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBqX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChwal9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmcGpfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHBqX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdpdmVuIGFuIEVMRiByZWxvYywgZmlsbCBpbiB0aGUgaG93dG8gZmllbGQgb2YgYSByZWxlbnQuICAqLwotCi1zdGF0aWMgdm9pZAotcGpfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcjsKLQotICByID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAociA8ICh1bnNpZ25lZCBpbnQpIFJfUEpfbWF4KTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gJnBqX2VsZl9ob3d0b190YWJsZVtyXTsKLX0KLQotLyogVGFrZSB0aGlzIG1vbWVudCB0byBmaWxsIGluIHRoZSBzcGVjaWFsIHBpY29KYXZhIGJpdHMgaW4gdGhlCi0gICBlX2ZsYWdzIGZpZWxkLiAqLwotCi1zdGF0aWMgdm9pZAotcGpfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1BJQ09KQVZBX0FSQ0g7Ci0gICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfUElDT0pBVkFfR05VQ0FMTFM7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9wal92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItcGoiCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9wamxfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItcGpsIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfcGoKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9QSgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkgICAgICAgICAgICAgcGpfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgICAgICAgICAgIHBqX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkgICAgICAgICAgICAgcGpfZWxmX2luZm9fdG9faG93dG8KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1wcGMuYyBiL2JmZC9lbGYzMi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlMTk3Yi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzU4ICswLDAgQEAKLS8qIFBvd2VyUEMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gYSBwcmVsaW1pbmFyeSBQb3dlclBDIEVMRiBBQkkuICBUaGUKLSAgIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdGhlIGZpbmFsIFBvd2VyUEMgRUxGIEFCSS4gIEl0IGluY2x1ZGVzCi0gICBzdWdnZXN0aW9ucyBmcm9tIHRoZSBpbi1wcm9ncmVzcyBFbWJlZGRlZCBQb3dlclBDIEFCSSwgYW5kIHRoYXQKLSAgIGluZm9ybWF0aW9uIG1heSBhbHNvIG5vdCBtYXRjaC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9wcGMuaCIKLQotI2RlZmluZSBVU0VfUkVMQQkJLyogd2Ugd2FudCBSRUxBIHJlbG9jYXRpb25zLCBub3QgUkVMICovCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqY2FjaGVfcHRyLCBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfaG93dG9faW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1zdGF0aWMgaW50IHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkciBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJICBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci0KLXN0YXRpYyBlbGZfbGlua2VyX3NlY3Rpb25fdCAqcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0pKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9jaGVja19yZWxvY3MgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICBhc2VjdGlvbiAqLAotCQkJCQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIGFzZWN0aW9uICogcHBjX2VsZl9nY19tYXJrX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCQlFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLAotCQkJCQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JCQkJCQlFbGZfSW50ZXJuYWxfU3ltICpzeW0pKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9nY19zd2VlcF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgICAgIGFzZWN0aW9uICpzZWMsCi0JCQkJCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkJIGJmZCAqLAotCQkJCQkJIGFzZWN0aW9uICosCi0JCQkJCQkgYmZkX2J5dGUgKiwKLQkJCQkJCSBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzLAotCQkJCQkJIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JCQkJCQkgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sgIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCQkJIGNvbnN0IGNoYXIgKiosCi0JCQkJCQkgZmxhZ3dvcmQgKiwKLQkJCQkJCSBhc2VjdGlvbiAqKiwKLQkJCQkJCSBiZmRfdm1hICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgQlJBTkNIX1BSRURJQ1RfQklUIDB4MjAwMDAwCQkvKiBicmFuY2ggcHJlZGljdGlvbiBiaXQgZm9yIGJyYW5jaCB0YWtlbiByZWxvY3MgKi8KLSNkZWZpbmUgUkFfUkVHSVNURVJfTUFTSyAweDAwMWYwMDAwCQkvKiBtYXNrIHRvIHNldCBSQSBpbiBtZW1vcnkgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFJBX1JFR0lTVEVSX1NISUZUIDE2CQkJLyogdmFsdWUgdG8gc2hpZnQgcmVnaXN0ZXIgYnkgdG8gaW5zZXJ0IFJBICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotLyogVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGx0IHJlc2VydmVkIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotI2RlZmluZSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFIDcyCi0vKiBUaGUgc2l6ZSBvZiB0aGUgZ2FwIGJldHdlZW4gZW50cmllcyBpbiB0aGUgUExULiAgKi8KLSNkZWZpbmUgUExUX1NMT1RfU0laRSA4Ci0vKiBUaGUgbnVtYmVyIG9mIHNpbmdsZS1zbG90IFBMVCBlbnRyaWVzICh0aGUgcmVzdCB1c2UgdHdvIHNsb3RzKS4gICovCi0jZGVmaW5lIFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMgODE5MgotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClSX1BQQ19tYXggXTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2VsZl9ob3d0b19yYXdbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfUFBDX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9QUENfQUREUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAyNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgotICAgICBGSVhNRTogd2UgZG9uJ3QgY2hlY2sgdGhhdCwgd2UganVzdCBjbGVhciB0aGVtLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjI0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCByZWxvY2F0aW9uIHdpdGhvdXQgb3ZlcmZsb3cuICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIG9yZGVyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MsIHBsdXMgMSBpZiB0aGUgY29udGVudHMgb2YKLSAgICAgdGhlIGxvdyAxNiBiaXRzLCB0cmVhdGVkIGFzIGEgc2lnbmVkIG51bWJlciwgaXMgbmVnYXRpdmUuCSovCi0gIEhPV1RPIChSX1BQQ19BRERSMTZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2g7IHRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlIHplcm8uCi0gICAgIEZJWE1FOiB3ZSBkb24ndCBjaGVjayB0aGF0LCB3ZSBqdXN0IGNsZWFyIHRoZW0uICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2gsIGZvciB3aGljaCBiaXQgMTAgc2hvdWxkIGJlIHNldCB0bwotICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uCVRoZSBsb3dlciB0d28KLSAgICAgYml0cyBtdXN0IGJlIHplcm8uCSAqLwotICBIT1dUTyAoUl9QUENfQUREUjE0X0JSVEFLRU4sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0X0JSVEFLRU4iLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMTYgYml0IGJyYW5jaCwgZm9yIHdoaWNoIGJpdCAxMCBzaG91bGQgYmUgc2V0IHRvCi0gICAgIGluZGljYXRlIHRoYXQgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIKLSAgICAgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNF9CUk5UQUtFTiwgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTRfQlJOVEFLRU4iLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgkgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4JICovCi0gIEhPV1RPIChSX1BQQ19SRUwxNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMTQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2guCUJpdCAxMCBzaG91bGQgYmUgc2V0IHRvIGluZGljYXRlIHRoYXQKLSAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbi4gIFRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlCi0gICAgIHplcm8uICAqLwotICBIT1dUTyAoUl9QUENfUkVMMTRfQlJUQUtFTiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwxNF9CUlRBS0VOIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2guCUJpdCAxMCBzaG91bGQgYmUgc2V0IHRvIGluZGljYXRlIHRoYXQKLSAgICAgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIgdHdvIGJpdHMgbXVzdAotICAgICBiZSB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDE0X0JSTlRBS0VOLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTDE0X0JSTlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2LCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yIHRoZQotICAgICBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0xPLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTZfTE8sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEksIGJ1dCByZWZlcnJpbmcgdG8gdGhlIEdPVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19HT1QxNl9ISSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTZfSEkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCSAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9IQSwgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dPVDE2X0hBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX1JFTDI0LCBidXQgcmVmZXJyaW5nIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotICAgICBlbnRyeSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFRSRUwyNCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUUkVMMjQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgaXMgdXNlZCBvbmx5IGJ5IHRoZSBkeW5hbWljIGxpbmtlci4gIFRoZSBzeW1ib2wgc2hvdWxkIGV4aXN0Ci0gICAgIGJvdGggaW4gdGhlIG9iamVjdCBiZWluZyBydW4gYW5kIGluIHNvbWUgc2hhcmVkIGxpYnJhcnkuICBUaGUKLSAgICAgZHluYW1pYyBsaW5rZXIgY29waWVzIHRoZSBkYXRhIGFkZHJlc3NlZCBieSB0aGUgc3ltYm9sIGZyb20gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGludG8gdGhlIG9iamVjdCwgYmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nCi0gICAgIHJ1biBoYXMgdG8gaGF2ZSB0aGUgZGF0YSBhdCBzb21lIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX1BQQ19DT1BZLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQ09QWSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMzIsIGJ1dCB1c2VkIHdoZW4gc2V0dGluZyBnbG9iYWwgb2Zmc2V0IHRhYmxlCi0gICAgIGVudHJpZXMuICAqLwotICBIT1dUTyAoUl9QUENfR0xPQl9EQVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dMT0JfREFUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTWFya3MgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBmb3IgYSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfSk1QX1NMT1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0pNUF9TTE9UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBXaGVuIHRoZSBvYmplY3QgaXMgcnVuLCB0aGlzCi0gICAgIGxvbmd3b3JkIGlzIHNldCB0byB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBvYmplY3QsIHBsdXMgdGhlCi0gICAgIGFkZGVuZC4gICovCi0gIEhPV1RPIChSX1BQQ19SRUxBVElWRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMQVRJVkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX1JFTDI0LCBidXQgdXNlcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB3aXRoaW4gdGhlCi0gICAgIG9iamVjdCByYXRoZXIgdGhhbiB0aGUgZmluYWwgdmFsdWUuICBOb3JtYWxseSB1c2VkIGZvcgotICAgICBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICAqLwotICBIT1dUTyAoUl9QUENfTE9DQUwyNFBDLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0xPQ0FMMjRQQyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMzIsIGJ1dCBtYXkgYmUgdW5hbGlnbmVkLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1VBRERSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1VBRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNiwgYnV0IG1heSBiZSB1bmFsaWduZWQuICAqLwotICBIT1dUTyAoUl9QUENfVUFERFIxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfVUFERFIxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IFBDIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX1BQQ19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgcmVsb2NhdGlvbiB0byB0aGUgc3ltYm9sJ3MgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICAgIEZJWE1FOiBub3Qgc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9QUENfUExUMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB0byB0aGUgc3ltYm9sJ3MgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICAgIEZJWE1FOiBub3Qgc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9QUENfUExUUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFRSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9MTywgYnV0IHJlZmVycmluZyB0byB0aGUgUExUIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hJLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBQTFQgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEEsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIFBMVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFQxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQxNl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzaWduLWV4dGVuZGVkIDE2IGJpdCB2YWx1ZSByZWxhdGl2ZSB0byBfU0RBX0JBU0VfLCBmb3IgdXNlIHdpdGgKLSAgICAgc21hbGwgZGF0YSBpdGVtcy4gICovCi0gIEhPV1RPIChSX1BQQ19TREFSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0RBUkVMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gIEhPV1RPIChSX1BQQ19TRUNUT0ZGLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYtYml0IGxvd2VyIGhhbGYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRl9MTywJICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYtYml0IHVwcGVyIGhhbGYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRl9ISSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCB1cHBlciBoYWxmIGFkanVzdGVkIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGZyb20gdGhlIEVtYmVkZGVkIEVMRiBBQkksIGFuZCBhcmUgbm90Ci0gICAgIGluIHRoZSBTVlI0IEVMRiBBQkkuICAqLwotCi0gIC8qIDMyIGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHZhbHVlIHJlc3VsdGluZyBmcm9tIHRoZSBhZGRlbmQgbWludXMgdGhlIHN5bWJvbCAqLwotICBIT1dUTyAoUl9QUENfRU1CX05BRERSMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfQUREUjE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbWludXMgdGhlIHN5bWJvbCAqLwotICBIT1dUTyAoUl9QUENfRU1CX05BRERSMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTZfSEkiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIG9yZGVyIDE2IGJpdHMgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWRkZW5kIG1pbnVzIHRoZSBhZGRyZXNzLAotICAgICBwbHVzIDEgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb3cgMTYgYml0cywgdHJlYXRlZCBhcyBhIHNpZ25lZCBudW1iZXIsCi0gICAgIGlzIG5lZ2F0aXZlLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTZfSEEiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhbGxvY2F0aW5nIGEgNCBieXRlIHdvcmQgdG8gaG9sZCBhbgotICAgICBhZGRyZXNzIGluIHRoZSAuc2RhdGEgc2VjdGlvbiwgYW5kIHJldHVybmluZyB0aGUgb2Zmc2V0IGZyb20KLSAgICAgX1NEQV9CQVNFXyBmb3IgdGhhdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBSTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREFJMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhbGxvY2F0aW5nIGEgNCBieXRlIHdvcmQgdG8gaG9sZCBhbgotICAgICBhZGRyZXNzIGluIHRoZSAuc2RhdGEyIHNlY3Rpb24sIGFuZCByZXR1cm5pbmcgdGhlIG9mZnNldCBmcm9tCi0gICAgIF9TREEyX0JBU0VfIGZvciB0aGF0IHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9TREEySTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEySTE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHNpZ24tZXh0ZW5kZWQgMTYgYml0IHZhbHVlIHJlbGF0aXZlIHRvIF9TREEyX0JBU0VfLCBmb3IgdXNlIHdpdGgKLSAgICAgc21hbGwgZGF0YSBpdGVtcy4JICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMlJFTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1NEQTJSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlbG9jYXRlIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8gb3IgX1NEQTJfQkFTRV8sIGZpbGxpbmcgaW4gdGhlIDE2IGJpdAotICAgICBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJhc2UsIGFuZCBmaWxsaW5nIGluIHRoZSByZWdpc3RlcgotICAgICBmaWVsZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAoMCwgMiwgb3IgMTMpLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9TREEyMSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1NEQTIxIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfTVJLUkVGICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTRUMxNiAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU1RfTE8gKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX1JFTFNUX0hJICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTVF9IQSAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfQklUX0ZMRCAqLwotCi0gIC8qIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gYWdhaW5zdCBlaXRoZXIgX1NEQV9CQVNFXyBvciBfU0RBMl9CQVNFXywgZmlsbGluZwotICAgICBpbiB0aGUgMTYgYml0IHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgYmFzZSwgYW5kIGZpbGxpbmcgaW4gdGhlCi0gICAgIHJlZ2lzdGVyIGZpZWxkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyICgwLCAyLCBvciAxMykuICAqLwotICBIT1dUTyAoUl9QUENfRU1CX1JFTFNEQSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfUkVMU0RBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9QUENfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9QUENfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFBob255IHJlbG9jIHRvIGhhbmRsZSBBSVggc3R5bGUgVE9DIGVudHJpZXMgKi8KLSAgSE9XVE8gKFJfUFBDX1RPQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfVE9DMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLQwKLS8qIEluaXRpYWxpemUgdGhlIHBwY19lbGZfaG93dG9fdGFibGUsIHNvIHRoYXQgbGluZWFyIGFjY2Vzc2VzIGNhbiBiZSBkb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lbGZfaG93dG9faW5pdCAoKQotewotICB1bnNpZ25lZCBpbnQgaSwgdHlwZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwcGNfZWxmX2hvd3RvX3JhdykgLyBzaXplb2YgKHBwY19lbGZfaG93dG9fcmF3WzBdKTsgaSsrKQotICAgIHsKLSAgICAgIHR5cGUgPSBwcGNfZWxmX2hvd3RvX3Jhd1tpXS50eXBlOwotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IHNpemVvZihwcGNfZWxmX2hvd3RvX3RhYmxlKSAvIHNpemVvZihwcGNfZWxmX2hvd3RvX3RhYmxlWzBdKSk7Ci0gICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlW3R5cGVdID0gJnBwY19lbGZfaG93dG9fcmF3W2ldOwotICAgIH0KLX0KLQotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciB0aGUgUFBDIHdpdGggb3B0aW9uIC0tbXBjODYwYzBbPTxuPl0uCi0KLSAgIFRoZSBNUEM4NjAsIHJldmlzaW9uIEMwIG9yIGVhcmxpZXIgY29udGFpbnMgYSBidWcgaW4gdGhlIGRpZS4KLSAgIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWUsIHRoZSBuZXh0IGluc3RydWN0aW9uCi0gICB0byBiZSBleGVjdXRlZCAqbWF5KiBiZSB0cmVhdGVkIGFzIGEgbm8tb3AuCi0gICAxLyBBIGZvcndhcmQgYnJhbmNoIGlzIGV4ZWN1dGVkLgotICAgMi8gVGhlIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90IHRha2VuLgotICAgMy8gVGhlIGJyYW5jaCBpcyB0YWtlbi4KLSAgIDQvIFRoZSBicmFuY2ggaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCA1IHdvcmRzIG9mIGEgcGFnZS4KLSAgICAgIChUaGUgRU9QIGxpbWl0IGlzIDUgYnkgZGVmYXVsdCBidXQgbWF5IGJlIHNwZWNpZmllZCBhcyBhbnkgdmFsdWUgZnJvbSAxLTEwLikKLSAgIAotICAgT3VyIHNvZnR3YXJlIHNvbHV0aW9uIGlzIHRvIGRldGVjdCB0aGVzZSBwcm9ibGVtYXRpYyBicmFuY2hlcyBpbiBhCi0gICBsaW5rZXIgcGFzcyBhbmQgbW9kaWZ5IHRoZW0gYXMgZm9sbG93czoKLSAgIDEvIFVuY29uZGl0aW9uYWwgYnJhbmNoZXMgLSBTaW5jZSB0aGVzZSBhcmUgYWx3YXlzIHByZWRpY3RlZCB0YWtlbiwKLSAgICAgIHRoZXJlIGlzIG5vIHByb2JsZW0gYW5kIG5vIGFjdGlvbiBpcyByZXF1aXJlZC4KLSAgIDIvIENvbmRpdGlvbmFsIGJhY2t3YXJkIGJyYW5jaGVzIC0gTm8gcHJvYmxlbSwgbm8gYWN0aW9uIHJlcXVpcmVkLgotICAgMy8gQ29uZGl0aW9uYWwgZm9yd2FyZCBicmFuY2hlcyAtIEVuc3VyZSB0aGF0IHRoZSAiaW52ZXJzZSBwcmVkaWN0aW9uCi0gICAgICBiaXQiIGlzIHNldCAoZW5zdXJlIGl0IGlzIHByZWRpY3RlZCB0YWtlbikuCi0gICA0LyBDb25kaXRpb25hbCByZWdpc3RlciBicmFuY2hlcyAtIEVuc3VyZSB0aGF0IHRoZSAieSBiaXQiIGlzIHNldAotICAgICAgKGVuc3VyZSBpdCBpcyBwcmVkaWN0ZWQgdGFrZW4pLgotKi8KLQotLyogU29ydCBzZWN0aW9ucyBieSBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGludAotcHBjX2VsZl9zb3J0X3JlbGEgKGFyZzEsIGFyZzIpCi0gICAgY29uc3Qgdm9pZCAqYXJnMTsKLSAgICBjb25zdCB2b2lkICphcmcyOwotewotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGExID0gKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhKiopIGFyZzE7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICoqcmVsYTIgPSAoY29uc3QgRWxmX0ludGVybmFsX1JlbGEqKikgYXJnMjsKLQotICAvKiBTb3J0IGJ5IG9mZnNldC4gKi8KLSAgcmV0dXJuICgoKnJlbGExKS0+cl9vZmZzZXQgLSAoKnJlbGEyKS0+cl9vZmZzZXQpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBpc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgIGJmZCAqYWJmZDsKLSAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgIGJvb2xlYW4gKmFnYWluOwotewotI2RlZmluZSBQQUdFU0laRSAweDEwMDAKLQotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGFfY29tYiA9IE5VTEw7Ci0gIGludCBjb21iX2N1cnIsIGNvbWJfY291bnQ7Ci0KLSAgLyogV2UgbmV2ZXIgaGF2ZSB0byBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIHBlciBpbnB1dCBzZWN0aW9uLiAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBJZiBuZWVkZWQsIGluaXRpYWxpemUgdGhpcyBzZWN0aW9uJ3MgY29va2VkIHNpemUuICAqLwotICBpZiAoaXNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgICBpc2VjLT5fY29va2VkX3NpemUgPSBpc2VjLT5fcmF3X3NpemU7Ci0KLSAgLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIHRleHQgc2VjdGlvbnMgd2hpY2ggb3ZlcmxhcCB0aGUKLSAgdHJvdWJsZXNvbWUgYXJlYSBhdCB0aGUgZW5kIG9mIGEgcGFnZS4gKi8KLSAgaWYgKGxpbmtfaW5mby0+bXBjODYwYzAgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0NPREUpICYmIGlzZWMtPl9jb29rZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGRvdCwgZW5kX3BhZ2UsIGVuZF9zZWN0aW9uOwotICAgICAgYm9vbGVhbiBzZWN0aW9uX21vZGlmaWVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICovCi0gICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGlzZWMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpc2VjLCBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIGlzZWMtPl9yYXdfc2l6ZSkpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBjb21iX2N1cnIgPSAwOwotICAgICAgY29tYl9jb3VudCA9IDA7Ci0gICAgICBpZiAoaXNlYy0+cmVsb2NfY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBuOwotCi0gICAgICAgICAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgICAgICBpbnRlcm5hbF9yZWxvY3MgPSBfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MgKAotICAgIAkgICAgYWJmZCwgaXNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIAotICAgIAkgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSk7Ci0gICAgICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIAkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIAkgICAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAKLSAgICAgICAgICAvKiBTZXR1cCBhIGZhc3RlciBhY2Nlc3MgbWV0aG9kIGZvciB0aGUgcmVsb2MgaW5mbyB3ZSBuZWVkLiAqLwotICAgICAgICAgIHJlbGFfY29tYiA9IChFbGZfSW50ZXJuYWxfUmVsYSoqKQotCSAgICBiZmRfbWFsbG9jIChpc2VjLT5yZWxvY19jb3VudCpzaXplb2YoRWxmX0ludGVybmFsX1JlbGEqKSk7Ci0gICAgICAgICAgaWYgKHJlbGFfY29tYiA9PSBOVUxMKQotICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICBmb3IgKG49MDsgbjxpc2VjLT5yZWxvY19jb3VudDsgKytuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsb25nIHJfdHlwZTsKLSAgICAKLSAgICAgICAgICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpbnRlcm5hbF9yZWxvY3Nbbl0ucl9pbmZvKTsKLSAgICAgICAgICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpUl9QUENfbWF4KQotICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgCi0gICAgICAgICAgICAgIC8qIFByb2xvZ3VlIGNvbnN0YW50cyBhcmUgc29tZXRpbWVzIHByZXNlbnQgaW4gdGhlICIudGV4dCIKLSAgICAgICAgICAgICAgc2VjdGlvbnMgYW5kIHRoZXkgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYXNzb2NpYXRlZCByZWxvY2F0aW9uLgotICAgICAgICAgICAgICBXZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgdGhvc2Ugd29yZHMgYW5kIHNvbWUgb3RoZXJzIHdoaWNoCi0gICAgICAgICAgICAgIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgcmVsb2NhdGlvbnMuICBIb3dldmVyLCBub3QgYWxsCi0gICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHdpbGwgaGF2ZSBhIHJlbG9jYXRpb24gc28gd2Ugd2lsbAotICAgICAgICAgICAgICBvbmx5IGlnbm9yZSB3b3JkcyB0aGF0IDEpIGhhdmUgYSByZWxvYywgYW5kIDIpIHRoZSByZWxvYwotICAgICAgICAgICAgICBpcyBub3QgYXBwbGljYWJsZSB0byBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KLSAgICAgICAgICAgICAgVGhlIGFycmF5IHJlbGFfY29tYiBpcyBidWlsdCBoZXJlIGZvciB1c2UgaW4gdGhlIEVPUCBzY2FuIGxvb3AuICovCi0gICAgICAgICAgICAgIHN3aXRjaCAocl90eXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJfUFBDX0FERFIxNF9CUk5UQUtFTjogICAgIC8qIGFic29sdXRlLCBwcmVkaWN0ZWQgbm90IHRha2VuICovCi0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19SRUwxNDogICAgICAgICAgICAgICAvKiByZWxhdGl2ZSBjb25kLiBici4gKi8KLSAgICAgICAgICAgICAgICBjYXNlIFJfUFBDX1JFTDE0X0JSTlRBS0VOOiAgICAgIC8qIHJlbC4gY29uZC4gYnIuLCBwcmVkaWN0ZWQgbm90IHRha2VuICovCi0gICAgICAgICAgICAgICAgICAvKiBXZSBzaG91bGQgY2hlY2sgdGhlIGluc3RydWN0aW9uLiAqLwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIC8qIFRoZSB3b3JkIGlzIG5vdCBhIGNvbmRpdGlvbmFsIGJyYW5jaCAtIGlnbm9yZSBpdC4gKi8KLSAgICAgICAgICAgICAgICAgIHJlbGFfY29tYltjb21iX2NvdW50KytdID0gJmludGVybmFsX3JlbG9jc1tuXTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29tYl9jb3VudCA+IDEpCi0gICAgICAgICAgICAgIHFzb3J0IChyZWxhX2NvbWIsIChzaXplX3QpIGNvbWJfY291bnQsIHNpemVvZiAoaW50KSwgcHBjX2VsZl9zb3J0X3JlbGEpOwotICAgICAgICB9Ci0KLSAgICAgIC8qIEVudW1lcmF0ZSBlYWNoIEVPUCByZWdpb24gdGhhdCBvdmVybGFwcyB0aGlzIHNlY3Rpb24uICovCi0gICAgICBlbmRfc2VjdGlvbiA9IGlzZWMtPnZtYSArIGlzZWMtPl9jb29rZWRfc2l6ZTsKLSAgICAgIGRvdCA9IGVuZF9wYWdlID0gKGlzZWMtPnZtYSB8IChQQUdFU0laRSAtIDEpKSArIDE7Ci0gICAgICBkb3QgLT0gbGlua19pbmZvLT5tcGM4NjBjMDsKLSAgICAgIHNlY3Rpb25fbW9kaWZpZWQgPSBmYWxzZTsKLSAgICAgIGlmIChkb3QgPCBpc2VjLT52bWEpICAgICAgLyogSW5jcmVtZW50IHRoZSBzdGFydCBwb3NpdGlvbiBpZiB0aGlzIHNlY3Rpb24gKi8KLSAgICAgICAgICBkb3QgPSBpc2VjLT52bWE7ICAgICAgLyogYmVnaW5zIGluIHRoZSBtaWRkbGUgb2YgaXRzIGZpcnN0IEVPUCByZWdpb24uICovCi0gICAgICBmb3IgKDsKLSAgICAgICAgICAgZG90IDwgZW5kX3NlY3Rpb247Ci0gICAgICAgICAgIGRvdCArPSBQQUdFU0laRSwgZW5kX3BhZ2UgKz0gUEFHRVNJWkUpCi0gICAgICAgIHsKLQotICAgICAgICAgIC8qIENoZWNrIGVhY2ggd29yZCBpbiB0aGlzIEVPUCByZWdpb24uICovCi0gICAgICAgICAgZm9yICg7IGRvdCA8IGVuZF9wYWdlOyBkb3QgKz0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmZkX3ZtYSBpc2VjX29mZnNldDsKLSAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgICAgICAgICBib29sZWFuIHNraXAsIG1vZGlmaWVkOwotCi0gICAgICAgICAgICAgIC8qIERvbid0IHByb2Nlc3MgdGhpcyB3b3JkIGlmIHRoZXJlIGlzIGEgcmVsb2NhdGlvbiBmb3IgaXQgYW5kCi0gICAgICAgICAgICAgIHRoZSByZWxvY2F0aW9uIGluZGljYXRlcyB0aGUgd29yZCBpcyBub3QgYSBjb25kaXRpb25hbCBicmFuY2guICovCi0gICAgICAgICAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgaXNlY19vZmZzZXQgPSBkb3QgLSBpc2VjLT52bWE7Ci0gICAgICAgICAgICAgIGZvciAoOyBjb21iX2N1cnI8Y29tYl9jb3VudDsgKytjb21iX2N1cnIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmZkX3ZtYSByX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgcl9vZmZzZXQgPSByZWxhX2NvbWJbY29tYl9jdXJyXS0+cl9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICBpZiAocl9vZmZzZXQgPj0gaXNlY19vZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocl9vZmZzZXQgPT0gaXNlY19vZmZzZXQpIHNraXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc2tpcCkgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGN1cnJlbnQgd29yZCBmb3IgYSBwcm9ibGVtYXRpYyBjb25kaXRpb25hbCBicmFuY2guICovCi0jZGVmaW5lIEJPMChpbnNuKSAoKGluc24pICYgMHgwMjAwMDAwMCkKLSNkZWZpbmUgQk8yKGluc24pICgoaW5zbikgJiAweDAwODAwMDAwKQotI2RlZmluZSBCTzQoaW5zbikgKChpbnNuKSAmIDB4MDAyMDAwMDApCi0gICAgICAgICAgICAgIGluc24gPSAodW5zaWduZWQgbG9uZykgYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBpc2VjX29mZnNldCk7Ci0gICAgICAgICAgICAgIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlmICgoaW5zbiAmIDB4RmMwMDAwMDApID09IDB4NDAwMDAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gaXMgQkN4ICovCi0gICAgICAgICAgICAgICAgICBpZiAoKCFCTzAoaW5zbikgfHwgIUJPMihpbnNuKSkgJiYgIUJPNChpbnNuKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGJmZF92bWEgdGFyZ2V0OwotICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyAibm9ybWFsIi4KLSAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gaW5zbiAmIDB4MDAwMEZmZmM7ICAgICAgICAgICAgICAgLypleHRyYWN0Ki8KLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAodGFyZ2V0IF4gMHg4MDAwKSAtIDB4ODAwMDsgICAgICAvKnNpZ24gZXh0ZW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAweDAwMDAwMDAyKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgKz0gZG90OyAgICAgICAgICAgICAgICAgICAgICAgIC8qY29udmVydCB0byBhYnMqLwotICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPiBkb3QpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoKGluc24gJiAweEZjMDBGZmZlKSA9PSAweDRjMDAwNDIwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDQ1RSeCAqLwotICAgICAgICAgICAgICAgICAgaWYgKCghQk8wKGluc24pIHx8ICFCTzIoaW5zbikpICYmICFCTzQoaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyBub3QtdGFrZW4uCi0JCSAgICAgIElmIHRoaXMgaXMgYSBmb3J3YXJkIGJyYW5jaCwgaXQgaXMgcHJvYmxlbWF0aWMuCi0gICAgICAgICAgICAgICAgICAgICAgU2luY2Ugd2UgY2FuJ3QgdGVsbCBzdGF0aWNhbGx5IGlmIGl0IHdpbGwgYnJhbmNoIGZvcndhcmQsCi0gICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGUgcHJlZGljdGlvbiBiaXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgaW5zbiB8PSAweDAwMjAwMDAwOyAgIC8qIHNldCB0aGUgcHJlZGljdGlvbiBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4RmMwMEZmZmUpID09IDB4NGMwMDAwMjApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gaXMgQkNMUnggKi8KLSAgICAgICAgICAgICAgICAgIGlmICgoIUJPMChpbnNuKSB8fCAhQk8yKGluc24pKSAmJiAhQk80KGluc24pKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90LXRha2VuLgotCQkgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLgotICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGNhbid0IHRlbGwgc3RhdGljYWxseSBpZiBpdCB3aWxsIGJyYW5jaCBmb3J3YXJkLAotICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhlIHByZWRpY3Rpb24gYml0LiAqLwotICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLSN1bmRlZiBCTzAKLSN1bmRlZiBCTzIKLSN1bmRlZiBCTzQKLSAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkKQotCSAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBpc2VjX29mZnNldCk7Ci0JCSAgc2VjdGlvbl9tb2RpZmllZCA9IHRydWU7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGlmIChzZWN0aW9uX21vZGlmaWVkKQotCXsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAocmVsYV9jb21iICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocmVsYV9jb21iKTsKLSAgICAgIHJlbGFfY29tYiA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxhX2NvbWIgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxhX2NvbWIpOwotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotDAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBlbnVtIGVsZl9wcGNfcmVsb2NfdHlwZSBwcGNfcmVsb2MgPSBSX1BQQ19OT05FOwotCi0gIGlmICghcHBjX2VsZl9ob3d0b190YWJsZVtSX1BQQ19BRERSMzJdKQotICAgIC8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgcHBjX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIHN3aXRjaCAoKGludCljb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6CQlwcGNfcmVsb2MgPSBSX1BQQ19OT05FOwkJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CQTI2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjI0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6CQkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNl9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTZfSEk7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkExNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNF9CUlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTjoJcHBjX3JlbG9jID0gUl9QUENfQUREUjE0X0JSTlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjI2OgkJcHBjX3JlbG9jID0gUl9QUENfUkVMMjQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjE2OgkJcHBjX3JlbG9jID0gUl9QUENfUkVMMTQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX1JFTDE0X0JSVEFLRU47CWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX1JFTDE0X0JSTlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfR09UT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfR09UMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X0dPVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRjoJcHBjX3JlbG9jID0gUl9QUENfR09UMTZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QTFRfUENSRUw6CXBwY19yZWxvYyA9IFJfUFBDX1BMVFJFTDI0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0NPUFk6CQlwcGNfcmVsb2MgPSBSX1BQQ19DT1BZOwkJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19HTE9CX0RBVDoJcHBjX3JlbG9jID0gUl9QUENfR0xPQl9EQVQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfTE9DQUwyNFBDOglwcGNfcmVsb2MgPSBSX1BQQ19MT0NBTDI0UEM7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfUExUMzI7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRfUENSRUw6CXBwY19yZWxvYyA9IFJfUFBDX1BMVFJFTDMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNl9QTFRPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19QTFQxNl9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUExUT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfSEk7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1NfUExUT0ZGOglwcGNfcmVsb2MgPSBSX1BQQ19QTFQxNl9IQTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19TREFSRUwxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX0JBU0VSRUw6CQlwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNl9CQVNFUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGX0xPOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGX0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUw6CXBwY19yZWxvYyA9IFJfUFBDX1NFQ1RPRkZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX1RPQzE2OgkJcHBjX3JlbG9jID0gUl9QUENfVE9DMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzI6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTzoJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTZfTE87CWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISToJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTZfSEk7CWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQToJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTZfSEE7CWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfU0RBSTE2OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfU0RBMkkxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTDoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTJSRUw7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTIxOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfU0RBMjE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX01SS1JFRjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX01SS1JFRjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTRUMxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE86CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTVF9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEk6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTVF9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTVF9IQTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRDoJcHBjX3JlbG9jID0gUl9QUENfRU1CX0JJVF9GTEQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1JFTFNEQTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOglwcGNfcmVsb2MgPSBSX1BQQ19HTlVfVlRJTkhFUklUOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6CXBwY19yZWxvYyA9IFJfUFBDX0dOVV9WVEVOVFJZOwkJYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXBwY19yZWxvYyBdOwotfTsKLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhIFBvd2VyUEMgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgaWYgKCFwcGNfZWxmX2hvd3RvX3RhYmxlWyBSX1BQQ19BRERSMzIgXSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBwcGNfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1BQQ19tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gcHBjX2VsZl9ob3d0b190YWJsZVtFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKV07Ci19Ci0KLS8qIEhhbmRsZSB0aGUgUl9QUENfQUREUjE2X0hBIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICByZWxvY19lbnRyeS0+YWRkZW5kICs9IChyZWxvY2F0aW9uICYgMHg4MDAwKSA8PCAxOwotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIHNldCB3aGV0aGVyIGEgbW9kdWxlIG5lZWRzIHRoZSAtbXJlbG9jYXRhYmxlIGJpdCBzZXQuICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nICovCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb2xkX2ZsYWdzOwotICBmbGFnd29yZCBuZXdfZmxhZ3M7Ci0gIGJvb2xlYW4gZXJyb3I7Ci0KLSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgc2FtZSBlbmRpYW5lc3MgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbXNnOwotCi0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGliZmQpKQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4iKTsKLSAgICAgIGVsc2UKLQltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBiaWcgZW5kaWFuIik7Ci0KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotICBpZiAoIWVsZl9mbGFnc19pbml0IChvYmZkKSkJLyogRmlyc3QgY2FsbCwgbm8gZmxhZ3Mgc2V0ICovCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotICAgIH0KLQotICBlbHNlIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQkvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLwotICAgIDsKLQotICBlbHNlCQkJCQkvKiBJbmNvbXBhdGlibGUgZmxhZ3MgKi8KLSAgICB7Ci0gICAgICAvKiBXYXJuIGFib3V0IC1tcmVsb2NhdGFibGUgbWlzbWF0Y2guICBBbGxvdyAtbXJlbG9jYXRhYmxlLWxpYiB0byBiZSBsaW5rZWQKLSAgICAgICAgIHdpdGggZWl0aGVyLiAgKi8KLSAgICAgIGVycm9yID0gZmFsc2U7Ci0gICAgICBpZiAoKG5ld19mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRSkgIT0gMAotCSAgJiYgKG9sZF9mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCKSkgPT0gMCkKLQl7Ci0JICBlcnJvciA9IHRydWU7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgbm9ybWFsbHkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQl9Ci0gICAgICBlbHNlIGlmICgobmV3X2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKSA9PSAwCi0JICAgICAgICYmIChvbGRfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEUpICE9IDApCi0JewotCSAgZXJyb3IgPSB0cnVlOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogY29tcGlsZWQgbm9ybWFsbHkgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0JfQotCi0gICAgICAvKiBUaGUgb3V0cHV0IGlzIC1tcmVsb2NhdGFibGUtbGliIGlmZiBib3RoIHRoZSBpbnB1dCBmaWxlcyBhcmUuICAqLwotICAgICAgaWYgKCEgKG5ld19mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKQotCWVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzICY9IH5FRl9QUENfUkVMT0NBVEFCTEVfTElCOwotCi0gICAgICAvKiBUaGUgb3V0cHV0IGlzIC1tcmVsb2NhdGFibGUgaWZmIGl0IGNhbid0IGJlIC1tcmVsb2NhdGFibGUtbGliLAotICAgICAgICAgYnV0IGVhY2ggaW5wdXQgZmlsZSBpcyBlaXRoZXIgLW1yZWxvY2F0YWJsZSBvciAtbXJlbG9jYXRhYmxlLWxpYi4gICovCi0gICAgICBpZiAoISAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKQotCSAgJiYgKG5ld19mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX1JFTE9DQVRBQkxFKSkKLQkgICYmIChvbGRfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiB8IEVGX1BQQ19SRUxPQ0FUQUJMRSkpKQotCWVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IEVGX1BQQ19SRUxPQ0FUQUJMRTsKLQotICAgICAgLyogRG8gbm90IHdhcm4gYWJvdXQgZWFiaSB2cy4gVi40IG1pc21hdGNoLCBqdXN0IG9yIGluIHRoZSBiaXQgaWYgYW55IG1vZHVsZSB1c2VzIGl0ICovCi0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyB8PSAobmV3X2ZsYWdzICYgRUZfUFBDX0VNQik7Ci0KLSAgICAgIG5ld19mbGFncyAmPSB+IChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX0VNQik7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiB8IEVGX1BQQ19FTUIpOwotCi0gICAgICAvKiBXYXJuIGFib3V0IGFueSBvdGhlciBtaXNtYXRjaGVzICovCi0gICAgICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLQl7Ci0JICBlcnJvciA9IHRydWU7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgKGxvbmcpbmV3X2ZsYWdzLCAobG9uZylvbGRfZmxhZ3MpOwotCX0KLQotICAgICAgaWYgKGVycm9yKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEhhbmRsZSBhIFBvd2VyUEMgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuZXdzZWN0ID0gaGRyLT5iZmRfc2VjdGlvbjsKLSAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QpOwotICBpZiAoaGRyLT5zaF9mbGFncyAmIFNIRl9FWENMVURFKQotICAgIGZsYWdzIHw9IFNFQ19FWENMVURFOwotCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX09SREVSRUQpCi0gICAgZmxhZ3MgfD0gU0VDX1NPUlRfRU5UUklFUzsKLQotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QsIGZsYWdzKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB1cCBhbnkgb3RoZXIgc2VjdGlvbiBmbGFncyBhbmQgc3VjaCB0aGF0IG1heSBiZSBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBzaGRyLCBhc2VjdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKnNoZHI7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLXsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkKLSAgICBzaGRyLT5zaF9mbGFncyB8PSBTSEZfRVhDTFVERTsKLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19TT1JUX0VOVFJJRVMpICE9IDApCi0gICAgc2hkci0+c2hfdHlwZSA9IFNIVF9PUkRFUkVEOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBDcmVhdGUgYSBzcGVjaWFsIGxpbmtlciBzZWN0aW9uICovCi1zdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtIHdoaWNoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaXJzdCBiZmQgc2VjdGlvbiB0aGF0IG5lZWRzIHRoZSBzcGVjaWFsIHNlY3Rpb24gKi8KLSAgaWYgKCFkeW5vYmopCi0gICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUsIGNyZWF0ZSB0aGUgc2VjdGlvbiAqLwotICBsc2VjdCA9IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCk7Ci0gIGlmICghbHNlY3QpCi0gICAgewotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgZGVmYXVsdHM7Ci0gICAgICBzdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgemVyb19zZWN0aW9uOwotCi0gICAgICBkZWZhdWx0cyA9IHplcm9fc2VjdGlvbjsKLSAgICAgIGRlZmF1bHRzLndoaWNoID0gd2hpY2g7Ci0gICAgICBkZWZhdWx0cy5ob2xlX3dyaXR0ZW5fcCA9IGZhbHNlOwotICAgICAgZGVmYXVsdHMuYWxpZ25tZW50ID0gMjsKLQotICAgICAgLyogQm90aCBvZiB0aGVzZSBzZWN0aW9ucyBhcmUgKHRlY2huaWNhbGx5KSBjcmVhdGVkIGJ5IHRoZSB1c2VyCi0JIHB1dHRpbmcgZGF0YSBpbiB0aGVtLCBzbyB0aGV5IHNob3VsZG4ndCBiZSBtYXJrZWQKLQkgU0VDX0xJTktFUl9DUkVBVEVELgotCi0JIFRoZSBsaW5rZXIgY3JlYXRlcyB0aGVtIHNvIGl0IGhhcyBzb21ld2hlcmUgdG8gYXR0YWNoIHRoZWlyCi0JIHJlc3BlY3RpdmUgc3ltYm9scy4gSW4gZmFjdCwgaWYgdGhleSB3ZXJlIGVtcHR5IGl0IHdvdWxkCi0JIGJlIE9LIHRvIGxlYXZlIHRoZSBzeW1ib2wgc2V0IHRvIDAgKG9yIGFueSByYW5kb20gbnVtYmVyKSwgYmVjYXVzZQotCSB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgc2hvdWxkIG5ldmVyIGJlIHVzZWQuICAqLwotICAgICAgZGVmYXVsdHMuZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQl8IFNFQ19JTl9NRU1PUlkpOwotCi0gICAgICBzd2l0Y2ggKHdoaWNoKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVW5rbm93biBzcGVjaWFsIGxpbmtlciB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAoaW50KXdoaWNoKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKLQotCWNhc2UgTElOS0VSX1NFQ1RJT05fU0RBVEE6CS8qIC5zZGF0YS8uc2JzcyBzZWN0aW9uICovCi0JICBkZWZhdWx0cy5uYW1lCQkgID0gIi5zZGF0YSI7Ci0JICBkZWZhdWx0cy5yZWxfbmFtZQkgID0gIi5yZWxhLnNkYXRhIjsKLQkgIGRlZmF1bHRzLmJzc19uYW1lCSAgPSAiLnNic3MiOwotCSAgZGVmYXVsdHMuc3ltX25hbWUJICA9ICJfU0RBX0JBU0VfIjsKLQkgIGRlZmF1bHRzLnN5bV9vZmZzZXQJICA9IDMyNzY4OwotCSAgYnJlYWs7Ci0KLQljYXNlIExJTktFUl9TRUNUSU9OX1NEQVRBMjoJLyogLnNkYXRhMi8uc2JzczIgc2VjdGlvbiAqLwotCSAgZGVmYXVsdHMubmFtZQkJICA9ICIuc2RhdGEyIjsKLQkgIGRlZmF1bHRzLnJlbF9uYW1lCSAgPSAiLnJlbGEuc2RhdGEyIjsKLQkgIGRlZmF1bHRzLmJzc19uYW1lCSAgPSAiLnNic3MyIjsKLQkgIGRlZmF1bHRzLnN5bV9uYW1lCSAgPSAiX1NEQTJfQkFTRV8iOwotCSAgZGVmYXVsdHMuc3ltX29mZnNldAkgID0gMzI3Njg7Ci0JICBkZWZhdWx0cy5mbGFncwkgfD0gU0VDX1JFQURPTkxZOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBsc2VjdCA9IF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgd2hpY2gsICZkZWZhdWx0cyk7Ci0gICAgfQotCi0gIHJldHVybiBsc2VjdDsKLX0KLQotDAotLyogSWYgd2UgaGF2ZSBhIG5vbi16ZXJvIHNpemVkIC5zYnNzMiBvciAuUFBDLkVNQi5zYnNzMCBzZWN0aW9ucywgd2UgbmVlZCB0byBidW1wIHVwCi0gICB0aGUgbnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGludCByZXQ7Ci0KLSAgcmV0ID0gMDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgKytyZXQ7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNic3MyIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAgJiYgcy0+X3Jhd19zaXplID4gMCkKLSAgICArK3JldDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuUFBDLkVNQi5zYnNzMCIpOwotICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgKytyZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogTW9kaWZ5IHRoZSBzZWdtZW50IG1hcCBpZiBuZWVkZWQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBXZSBoYXZlIHRvIGNyZWF0ZSAuZHluc2JzcyBhbmQgLnJlbGEuc2JzcyBoZXJlIHNvIHRoYXQgdGhleSBnZXQgbWFwcGVkCi0gICB0byBvdXRwdXQgc2VjdGlvbnMgKGp1c3QgbGlrZSBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBoYXMKLSAgIHRvIGNyZWF0ZSAuZHluYnNzIGFuZCAucmVsYS5ic3MpLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoIV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnNic3MiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIFNFQ19BTExPQykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yZWxhLnNic3MiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotICBiZmRfdm1hIHBsdF9vZmZzZXQ7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCBjYWxsZWQgZm9yICVzXG4iLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSNlbmRpZgotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAotICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICB8fCAoKCFpbmZvLT5zaGFyZWQgfHwgaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkKLQkgIHx8IChpbmZvLT5zaGFyZWQgJiYgaC0+cGx0LnJlZmNvdW50IDw9IDApKQotCXsKLQkgIC8qIEEgUExUIGVudHJ5IGlzIG5vdCByZXF1aXJlZC9hbGxvd2VkIHdoZW46Ci0KLQkgICAgIDEuIFdlIGFyZSBub3QgdXNpbmcgbGQuc287IGJlY2F1c2UgdGhlbiB0aGUgUExUIGVudHJ5Ci0JICAgICBjYW4ndCBiZSBzZXQgdXAsIHNvIHdlIGNhbid0IHVzZSBvbmUuCi0KLQkgICAgIDIuIFdlIGtub3cgZm9yIGNlcnRhaW4gdGhhdCBhIHN5bWJvbCBpcyBkZWZpbmVkIGluCi0JICAgICB0aGlzIG9iamVjdCwgYmVjYXVzZSB0aGlzIG9iamVjdCBpcyB0aGUgYXBwbGljYXRpb24sCi0JICAgICBpcyBsaW5rZWQgd2l0aCAtQnN5bWJvbGljLCBvciBiZWNhdXNlIHRoZSBzeW1ib2wgaXMgbG9jYWwuCi0KLQkgICAgIDMuIEdDIGhhcyByZW5kZXJlZCB0aGUgZW50cnkgdW51c2VkLgotCSAgICAgTm90ZSwgaG93ZXZlciwgdGhhdCBpbiBhbiBleGVjdXRhYmxlIGFsbCByZWZlcmVuY2VzIHRvIHRoZQotCSAgICAgc3ltYm9sIGdvIHRvIHRoZSBQTFQsIHNvIHdlIGNhbid0IHR1cm4gaXQgb2ZmIGluIHRoYXQgY2FzZS4KLQkgICAgID8/PyBUaGUgY29ycmVjdCB0aGluZyB0byBkbyBoZXJlIGlzIHRvIHJlZmVyZW5jZSBjb3VudAotCSAgICAgYWxsIHVzZXMgb2YgdGhlIHN5bWJvbCwgbm90IGp1c3QgdGhvc2UgdG8gdGhlIEdPVCBvciBQTFQuICAqLwotCSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKLQkgZmlyc3QgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBUaGUgUG93ZXJQQyBQTFQgaXMgYWN0dWFsbHkgY29tcG9zZWQgb2YgdHdvIHBhcnRzLCB0aGUgZmlyc3QgcGFydAotCSBpcyAyIHdvcmRzIChmb3IgYSBsb2FkIGFuZCBhIGp1bXApLCBhbmQgdGhlbiB0aGVyZSBpcyBhIHJlbWFpbmluZwotCSB3b3JkIGF2YWlsYWJsZSBhdCB0aGUgZW5kLiAgKi8KLSAgICAgIHBsdF9vZmZzZXQgPSAoUExUX0lOSVRJQUxfRU5UUllfU0laRQotCQkgICAgKyAoUExUX1NMT1RfU0laRQotCQkgICAgICAgKiAoKHMtPl9yYXdfc2l6ZSAtIFBMVF9JTklUSUFMX0VOVFJZX1NJWkUpCi0JCQkgIC8gUExUX0VOVFJZX1NJWkUpKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBwbHRfb2Zmc2V0OwotCX0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHBsdF9vZmZzZXQ7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gIEFmdGVyIHRoZSA4MTkybmQgZW50cnksIHJvb20KLSAgICAgICAgIGZvciB0d28gZW50cmllcyBpcyBhbGxvY2F0ZWQuICAqLwotICAgICAgaWYgKChzLT5fcmF3X3NpemUgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKSAvIFBMVF9FTlRSWV9TSVpFCi0JICA+PSBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTKQotCXMtPl9yYXdfc2l6ZSArPSAyICogUExUX0VOVFJZX1NJWkU7Ci0gICAgICBlbHNlCi0Jcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4KLQotICAgICBPZiBjb3Vyc2UsIGlmIHRoZSBzeW1ib2wgaXMgc3VmZmljaWVudGx5IHNtYWxsLCB3ZSBtdXN0IGluc3RlYWQKLSAgICAgYWxsb2NhdGUgaXQgaW4gLnNic3MuICBGSVhNRTogSXQgd291bGQgYmUgYmV0dGVyIHRvIGRvIHRoaXMgaWYgYW5kCi0gICAgIG9ubHkgaWYgdGhlcmUgd2VyZSBhY3R1YWxseSBTREFSRUwgcmVsb2NzIGZvciB0aGF0IHN5bWJvbC4gICovCi0KLSAgaWYgKGgtPnNpemUgPD0gZWxmX2dwX3NpemUgKGR5bm9iaikpCi0gICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc2JzcyIpOwotICBlbHNlCi0gICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfUFBDX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KLSAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbGEuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgaWYgKGgtPnNpemUgPD0gZWxmX2dwX3NpemUgKGR5bm9iaikpCi0Jc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5zYnNzIik7Ci0gICAgICBlbHNlCi0Jc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiA0KQotICAgIHBvd2VyX29mX3R3byA9IDQ7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3QsIC5yZWxhLnNkYXRhLCBhbmQKLQkgLnJlbGEuc2RhdGEyIHNlY3Rpb25zLiAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUKLQkgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbCBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldAotCSB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsIGV0IGFsLCB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldAotCSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZSBiZWxvdy4gICovCi0gICAgICBzdGF0aWMgY2hhciAqcmVsYV9zZWN0aW9uc1tdID0geyAiLnJlbGEuZ290IiwgIi5yZWxhLnNkYXRhIiwKLQkJCQkgICAgICAgIi5yZWxhLnNkYXRhMiIsICIucmVsYS5zYnNzIiwKLQkJCQkgICAgICAgKGNoYXIgKikwIH07Ci0gICAgICBjaGFyICoqcDsKLQotICAgICAgZm9yIChwID0gcmVsYV9zZWN0aW9uczsgKnAgIT0gKGNoYXIgKikwOyBwKyspCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICpwKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9uIHNlY3Rpb25zLiAqLwotCSAgICAgIHJlbG9jcyA9IHRydWU7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5nb3QiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YTsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhMjsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgYXNlY3Rpb24gKnNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbGdvdCA9IE5VTEw7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfY2hlY2tfcmVsb2NzIGNhbGxlZCBmb3Igc2VjdGlvbiAlcyBpbiAlc1xuIiwKLQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0jZW5kaWYKLQotICAvKiBDcmVhdGUgdGhlIGxpbmtlciBnZW5lcmF0ZWQgc2VjdGlvbnMgYWxsIHRoZSB0aW1lIHNvIHRoYXQgdGhlCi0gICAgIHNwZWNpYWwgc3ltYm9scyBhcmUgY3JlYXRlZC4gICovCi0KLSAgaWYgKChzZGF0YSA9IGVsZl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgTElOS0VSX1NFQ1RJT05fU0RBVEEpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNkYXRhID0gcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIExJTktFUl9TRUNUSU9OX1NEQVRBKTsKLSAgICAgIGlmICghc2RhdGEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIGlmICgoc2RhdGEyID0gZWxmX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBMSU5LRVJfU0VDVElPTl9TREFUQTIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNkYXRhMiA9IHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBMSU5LRVJfU0VDVElPTl9TREFUQTIpOwotICAgICAgaWYgKCFzZGF0YTIpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICAvKiBJZiBhIHJlbG9jYXRpb24gcmVmZXJzIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgY3JlYXRlIHRoZSAuZ290LgotCSBUaGlzIHNob3dzIHVwIGluIHBhcnRpY3VsYXIgaW4gYW4gUl9QUENfQUREUjMyIGluIHRoZSBlYWJpCi0JIHN0YXJ0dXAgY29kZS4gICovCi0gICAgICBpZiAoaCAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCXsKLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQkvKiBHT1QxNiByZWxvY2F0aW9ucyAqLwotCWNhc2UgUl9QUENfR09UMTY6Ci0JY2FzZSBSX1BQQ19HT1QxNl9MTzoKLQljYXNlIFJfUFBDX0dPVDE2X0hJOgotCWNhc2UgUl9QUENfR09UMTZfSEE6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAgKFNFQ19BTExPQwotCQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290LnJlZmNvdW50ID09IC0xKQotCQl7Ci0JCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgIGlmICghYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgLyogQWxsb2NhdGUgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCQkgIC8qIEFsbG9jYXRlIHJlbG9jYXRpb24gc3BhY2UuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JCSAgaC0+Z290LnJlZmNvdW50ID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF9zaWduZWRfdm1hKTsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzID0gKGJmZF9zaWduZWRfdm1hICopCi0JCSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpID0gbG9jYWxfZ290X3JlZmNvdW50czsKLQkJICBtZW1zZXQgKGxvY2FsX2dvdF9yZWZjb3VudHMsIC0xLCBzaXplKTsKLQkJfQotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9PSAtMSkKLQkJewotCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCi0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSX1BQQ19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JCSAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQlsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSsrOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIEluZGlyZWN0IC5zZGF0YSByZWxvY2F0aW9uICovCi0JY2FzZSBSX1BQQ19FTUJfU0RBSTE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgIlJfUFBDX0VNQl9TREFJMTYiKSk7Ci0JICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoIWJmZF9lbGYzMl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgc2RhdGEsIGgsIHJlbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEyIHJlbG9jYXRpb24gKi8KLQljYXNlIFJfUFBDX0VNQl9TREEySTE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgIlJfUFBDX0VNQl9TREEySTE2IikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoIWJmZF9lbGYzMl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgc2RhdGEyLCBoLCByZWwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQQ19TREFSRUwxNjoKLQljYXNlIFJfUFBDX0VNQl9TREEyUkVMOgotCWNhc2UgUl9QUENfRU1CX1NEQTIxOgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJcHBjX2VsZl9ob3d0b190YWJsZVsoaW50KUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pXS0+bmFtZSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFBDX1BMVDMyOgotCWNhc2UgUl9QUENfUExUUkVMMjQ6Ci0JY2FzZSBSX1BQQ19QTFQxNl9MTzoKLQljYXNlIFJfUFBDX1BMVDE2X0hJOgotCWNhc2UgUl9QUENfUExUMTZfSEE6Ci0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIlJlbG9jIHJlcXVpcmVzIGEgUExUIGVudHJ5XG4iKTsKLSNlbmRpZgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgICAgICAgICAgICAgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICB7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGgtPnBsdC5yZWZjb3VudCsrOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoZSBmb2xsb3dpbmcgcmVsb2NhdGlvbnMgZG9uJ3QgbmVlZCB0byBwcm9wYWdhdGUgdGhlCi0JICAgICByZWxvY2F0aW9uIGlmIGxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0IHNpbmNlIHRoZXkgYXJlCi0JICAgICBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQljYXNlIFJfUFBDX1NFQ1RPRkY6Ci0JY2FzZSBSX1BQQ19TRUNUT0ZGX0xPOgotCWNhc2UgUl9QUENfU0VDVE9GRl9ISToKLQljYXNlIFJfUFBDX1NFQ1RPRkZfSEE6Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWZlcnMgb25seSB0byBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkgKi8KLQljYXNlIFJfUFBDX0xPQ0FMMjRQQzoKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX1BQQ19HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9QUENfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0JICAgICByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotCSAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAgKi8KLQljYXNlIFJfUFBDX1JFTDI0OgotCWNhc2UgUl9QUENfUkVMMTQ6Ci0JY2FzZSBSX1BQQ19SRUwxNF9CUlRBS0VOOgotCWNhc2UgUl9QUENfUkVMMTRfQlJOVEFLRU46Ci0JY2FzZSBSX1BQQ19SRUwzMjoKLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JZGVmYXVsdDoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfY2hlY2tfcmVsb2NzIG5lZWQgdG8gY3JlYXRlIHJlbG9jYXRpb24gZm9yICVzXG4iLAotCQkgICAgICAgKGggJiYgaC0+cm9vdC5yb290LnN0cmluZykgPyBoLT5yb290LnJvb3Quc3RyaW5nIDogIjx1bmtub3duPiIpOwotI2VuZGlmCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBoZXJlIGRvIHdoYXQgdGhlIG02OGsgYW5kIGkzODYKLQkJIGJhY2tlbmRzIGRvOiBpZiB0aGUgcmVsb2MgaXMgcGMtcmVsYXRpdmUsIHJlY29yZCBpdAotCQkgaW4gY2FzZSBpdCB0dXJucyBvdXQgdGhhdCB0aGUgcmVsb2MgaXMgdW5uZWNlc3NhcnkKLQkJIGJlY2F1c2UgdGhlIHN5bWJvbCBpcyBmb3JjZWQgbG9jYWwgYnkgdmVyc2lvbmluZyBvcgotCQkgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQmR5bmFtaWMuICBGb3J0dW5hdGVseSB0aGlzCi0JCSBjYXNlIGlzIG5vdCBmcmVxdWVudC4gICovCi0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLXBwY19lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9QUENfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfUFBDX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2OgotICAgICAgY2FzZSBSX1BQQ19HT1QxNl9MTzoKLSAgICAgIGNhc2UgUl9QUENfR09UMTZfSEk6Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2X0hBOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+Z290LnJlZmNvdW50LS07Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPiAwKQotCSAgICAgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdLS07Ci0JICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFJfUFBDX1BMVDMyOgotICAgICAgY2FzZSBSX1BQQ19QTFRSRUwyNDoKLSAgICAgIGNhc2UgUl9QUENfUExUMTZfTE86Ci0gICAgICBjYXNlIFJfUFBDX1BMVDE2X0hJOgotICAgICAgY2FzZSBSX1BQQ19QTFQxNl9IQToKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQotCSAgICAgIGgtPnBsdC5yZWZjb3VudC0tOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIHVzZSBpdCB0byBwdXQgLmNvbW0gaXRlbXMgaW4gLnNic3MsIGFuZCBub3QgLmJzcy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCi0gICAgICAmJiAhaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBzeW0tPnN0X3NpemUgPD0gKGJmZF92bWEpIGJmZF9nZXRfZ3Bfc2l6ZSAoYWJmZCkpCi0gICAgewotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIC1HIG5uIGJ5dGVzIGFyZSBhdXRvbWF0aWNhbGx5Ci0JIHB1dCBpbnRvIC5zZGF0YS4gICovCi0gICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEKLQk9IHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBMSU5LRVJfU0VDVElPTl9TREFUQSk7Ci0KLSAgICAgIGlmICghc2RhdGEtPmJzc19zZWN0aW9uKQotCXsKLQkgIC8qIFdlIGRvbid0IGdvIHRocm91Z2ggYmZkX21ha2Vfc2VjdGlvbiwgYmVjYXVzZSB3ZSBkb24ndAotICAgICAgICAgICAgIHdhbnQgdG8gYXR0YWNoIHRoaXMgY29tbW9uIHNlY3Rpb24gdG8gRFlOT0JKLiAgVGhlIGxpbmtlcgotICAgICAgICAgICAgIHdpbGwgbW92ZSB0aGUgc3ltYm9scyB0byB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IHNlY3Rpb24KLSAgICAgICAgICAgICB3aGVuIGl0IGRlZmluZXMgY29tbW9uIHN5bWJvbHMuICAqLwotCSAgc2RhdGEtPmJzc19zZWN0aW9uID0gKChhc2VjdGlvbiAqKQotCQkJCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKSk7Ci0JICBpZiAoc2RhdGEtPmJzc19zZWN0aW9uID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+bmFtZSA9IHNkYXRhLT5ic3NfbmFtZTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IHNkYXRhLT5ic3Nfc2VjdGlvbjsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sID0KLQkgICAgKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyID0KLQkgICAgKGFzeW1ib2wgKiopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0JICBpZiAoc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wgPT0gTlVMTAotCSAgICAgIHx8IHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wtPm5hbWUgPSBzZGF0YS0+YnNzX25hbWU7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbC0+ZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbC0+c2VjdGlvbiA9IHNkYXRhLT5ic3Nfc2VjdGlvbjsKLQkgICpzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyID0gc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2w7Ci0JfQotCi0gICAgICAqc2VjcCA9IHNkYXRhLT5ic3Nfc2VjdGlvbjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBjYWxsZWQgZm9yICVzIiwKLQkgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSNlbmRpZgotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLSAgICAgIGJmZF92bWEgcmVsb2NfaW5kZXg7Ci0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLCBwbHRfb2Zmc2V0ID0gJWQiLCBoLT5wbHQub2Zmc2V0KTsKLSNlbmRpZgotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0gICAgICAgICBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRvIGZpbGwgaW4gdGhlIC5wbHQuICBUaGUgcHBjIGR5bmFtaWMgbGlua2VyCi0JIHdpbGwgZmlsbCBpdCBpbi4gICovCi0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBoLT5wbHQub2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1BQQ19KTVBfU0xPVCk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLQotICAgICAgcmVsb2NfaW5kZXggPSAoaC0+cGx0Lm9mZnNldCAtIFBMVF9JTklUSUFMX0VOVFJZX1NJWkUpIC8gUExUX1NMT1RfU0laRTsKLSAgICAgIGlmIChyZWxvY19pbmRleCA+IFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMpCi0JcmVsb2NfaW5kZXggLT0gKHJlbG9jX2luZGV4IC0gUExUX05VTV9TSU5HTEVfRU5UUklFUykgLyAyOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgcmVsb2NfaW5kZXgpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLSAgICAgICAgIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBUaGUgZW50cnkgaW4KLQkgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbgotCSB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JewotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfUFBDX1JFTEFUSVZFKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCgoaC0+Z290Lm9mZnNldCAmIDEpID09IDApOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9QUENfR0xPQl9EQVQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbHMgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIsIGNvcHkiKTsKLSNlbmRpZgotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgaWYgKGgtPnNpemUgPD0gZWxmX2dwX3NpemUgKGR5bm9iaikpCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICAgIi5yZWxhLnNic3MiKTsKLSAgICAgIGVsc2UKLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgICAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9QUENfQ09QWSk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgcy0+Y29udGVudHMKLQkJCQkgICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSNlbmRpZgotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqc2R5bjsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYm9vbGVhbiBzaXplOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0IjsJICBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyAgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgZGVmYXVsdDoJICAgICAgbmFtZSA9IE5VTEw7CSAgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAobmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBzaXplKQotCQkgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGQgYSBibHJsIGluc3RydWN0aW9uIGF0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy00IHNvIHRoYXQgYSBmdW5jdGlvbiBjYW4KLSAgICAgZWFzaWx5IGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4gICovCi0gIGlmIChzZ290KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzID0gc2dvdC0+Y29udGVudHM7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDRlODAwMDIxIC8qIGJscmwgKi8sIGNvbnRlbnRzKTsKLQotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgY29udGVudHMrNCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgY29udGVudHMrNCk7Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uLgotCi0gICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgemVyby4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlIHJlbG9jIGFkZGVuZCBhcwotICAgbmVjZXNzYXJ5LgotCi0gICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdF9zaG5keCBmaWVsZCBvZiBlYWNoIGxvY2FsIHN5bWJvbC4KLQotICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlCi0gICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYWRkZW5kIG11c3QgYmUgYWRqdXN0ZWQKLSAgIGFjY29yZGluZ2x5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyCQkgID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGJmZCAqZHlub2JqCQkJCSAgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhCQkgID0gKGR5bm9iaikgPyBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgTElOS0VSX1NFQ1RJT05fU0RBVEEpICA6IE5VTEw7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YTIJCSAgPSAoZHlub2JqKSA/IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCBMSU5LRVJfU0VDVElPTl9TREFUQTIpIDogTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbAkJICA9IHJlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZAkJICA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBhc2VjdGlvbiAqc3JlbG9jCQkJICA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGJvb2xlYW4gcmV0CQkJCSAgPSB0cnVlOwotICBsb25nIGluc247Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gY2FsbGVkIGZvciAlcyBzZWN0aW9uICVzLCAlbGQgcmVsb2NhdGlvbnMlc1xuIiwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgIGJmZF9zZWN0aW9uX25hbWUoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkgICAobG9uZylpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCwKLQkgICAoaW5mby0+cmVsb2NhdGVhYmxlKSA/ICIgKHJlbG9jYXRhYmxlKSIgOiAiIik7Ci0jZW5kaWYKLQotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbIFJfUFBDX0FERFIzMiBdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBzcGx0ID0gc2dvdCA9IE5VTEw7Ci0gIGlmIChkeW5vYmogIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgIH0KLQotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBlbnVtIGVsZl9wcGNfcmVsb2NfdHlwZSByX3R5cGUJPSAoZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUpRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBiZmRfdm1hIG9mZnNldAkJCT0gcmVsLT5yX29mZnNldDsKLSAgICAgIGJmZF92bWEgYWRkZW5kCQkJPSByZWwtPnJfYWRkZW5kOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIJCT0gYmZkX3JlbG9jX290aGVyOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltCQk9IChFbGZfSW50ZXJuYWxfU3ltICopMDsKLSAgICAgIGFzZWN0aW9uICpzZWMJCQk9IChhc2VjdGlvbiAqKTA7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaAk9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKTA7Ci0gICAgICBjb25zdCBjaGFyICpzeW1fbmFtZQkJPSAoY29uc3QgY2hhciAqKTA7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgICAgIC8qIFVua25vd24gcmVsb2NhdGlvbiBoYW5kbGluZyAqLwotICAgICAgaWYgKCh1bnNpZ25lZClyX3R5cGUgPj0gKHVuc2lnbmVkKVJfUFBDX21heCB8fCAhcHBjX2VsZl9ob3d0b190YWJsZVsoaW50KXJfdHlwZV0pCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludClyX3R5cGUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBob3d0byA9IHBwY19lbGZfaG93dG9fdGFibGVbKGludClyX3R5cGVdOwotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmICgodW5zaWduZWQpRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCQkgICBob3d0by0+bmFtZSwKLQkJICAgKGludClyX3R5cGUsCi0JCSAgIHJfc3ltbmR4LAotCQkgICAobG9uZylvZmZzZXQsCi0JCSAgIChsb25nKWFkZGVuZCk7Ci0jZW5kaWYKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICBzeW1fbmFtZSA9ICI8bG9jYWwgc3ltYm9sPiI7Ci0KLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGlmICgocl90eXBlID09IFJfUFBDX1BMVDMyCi0JCSAgICYmIGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIHx8IChyX3R5cGUgPT0gUl9QUENfTE9DQUwyNFBDCi0JCSAgICAgICYmIHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICB8fCAoKHJfdHlwZSA9PSBSX1BQQ19HT1QxNgotCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX0dPVDE2X0xPCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfR09UMTZfSEkKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19HT1QxNl9IQSkKLQkJICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgICAgJiYgKCEgaW5mby0+c2hhcmVkCi0JCQkgIHx8ICghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JCSAgICAgICYmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJCSAgLyogVGVzdGluZyBTRUNfREVCVUdHSU5HIGhlcmUgbWF5IGJlIHdyb25nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCdzIGhlcmUgdG8gYXZvaWQgYSBjcmFzaCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB3aXRoIERXQVJGCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0JCSAgICAgICAgICB8fCAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCQkgICAgICAmJiAocl90eXBlID09IFJfUFBDX0FERFIzMgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjI0Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNl9MTwotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2X0hJCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfSEEKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE0X0JSVEFLRU4KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNF9CUk5UQUtFTgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfUExUUkVMMjQKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0NPUFkKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0dMT0JfREFUCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19KTVBfU0xPVAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfVUFERFIzMgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfVUFERFIxNgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfU0RBUkVMMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTZfTE8KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2X0hJCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNl9IQQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQUkxNgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQTJJMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREEyUkVMCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMjEKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9NUktSRUYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9CSVRfRkxECi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfUkVMU0RBCi0JCQkgIHx8ICgocl90eXBlID09IFJfUFBDX1JFTDI0Ci0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDMyCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDE0Ci0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDE0X0JSVEFLRU4KLQkJCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfUkVMMTRfQlJOVEFLRU4KLQkJCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfUkVMQVRJVkUpCi0JCQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgIT0gMCkpKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgIG9ic2N1cmUgY2FzZXMgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICAqLwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgICAgewotICAgICAgICAgICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgICAgICAgICAgIChfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLSAgICAgICAgICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgICB9Ci0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpKGluZm8sCi0JCQkJCQkJIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCQkJIGlucHV0X2JmZCwKLQkJCQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCQkgcmVsLT5yX29mZnNldCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoICgoaW50KXJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIGZvciBzeW1ib2wgJXMiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludClyX3R5cGUsIHN5bV9uYW1lKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCi0JLyogUmVsb2NhdGlvbnMgdGhhdCBuZWVkIG5vIHNwZWNpYWwgcHJvY2Vzc2luZy4gICovCi0JY2FzZSAoaW50KVJfUFBDX0xPQ0FMMjRQQzoKLQkgIC8qIEl0IG1ha2VzIG5vIHNlbnNlIHRvIHBvaW50IGEgbG9jYWwgcmVsb2NhdGlvbgotCSAgICAgYXQgYSBzeW1ib2wgbm90IGluIHRoaXMgb2JqZWN0LiAgKi8KLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgJiYgc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpIChpbmZvLAotCQkJCQkJCSAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJCQkgIGlucHV0X2JmZCwKLQkJCQkJCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkJICByZWwtPnJfb2Zmc2V0KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgbWF5IG5lZWQgdG8gYmUgcHJvcGFnYXRlZCBpZiB0aGlzIGlzIGEgc2hhcmVkCi0gICAgICAgICAgIG9iamVjdC4gICovCi0JY2FzZSAoaW50KVJfUFBDX1JFTDI0OgotCWNhc2UgKGludClSX1BQQ19SRUwzMjoKLQljYXNlIChpbnQpUl9QUENfUkVMMTQ6Ci0JICAvKiBJZiB0aGVzZSByZWxvY2F0aW9ucyBhcmUgbm90IHRvIGEgbmFtZWQgc3ltYm9sLCB0aGV5IGNhbiBiZQotCSAgICAgaGFuZGxlZCByaWdodCBoZXJlLCBubyBuZWVkIHRvIGJvdGhlciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCS8qIGZhbGwgdGhyb3VnaCAqLwotCi0JLyogUmVsb2NhdGlvbnMgdGhhdCBhbHdheXMgbmVlZCB0byBiZSBwcm9wYWdhdGVkIGlmIHRoaXMgaXMgYSBzaGFyZWQKLSAgICAgICAgICAgb2JqZWN0LiAgKi8KLQljYXNlIChpbnQpUl9QUENfTk9ORToKLQljYXNlIChpbnQpUl9QUENfQUREUjMyOgotCWNhc2UgKGludClSX1BQQ19BRERSMjQ6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNjoKLQljYXNlIChpbnQpUl9QUENfQUREUjE2X0xPOgotCWNhc2UgKGludClSX1BQQ19BRERSMTZfSEk6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNl9IQToKLQljYXNlIChpbnQpUl9QUENfQUREUjE0OgotCWNhc2UgKGludClSX1BQQ19VQUREUjMyOgotCWNhc2UgKGludClSX1BQQ19VQUREUjE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXA7Ci0KLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBuZWVkIHRvIGNyZWF0ZSByZWxvY2F0aW9uIGZvciAlc1xuIiwKLQkJICAgICAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iKTsKLSNlbmRpZgotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLSAgICAgICAgICAgICAgICAgdGltZS4gICovCi0KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChpbnB1dF9iZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF92bWEgb2ZmOwotCi0JCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCX0KLQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChza2lwKQotCQltZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKLQkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKLQkJICBvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIpCi0JCSAgICB7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfUFBDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQl9Ci0JCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQlpbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0JCQkgIEJGRF9BU1NFUlQoaW5keCA+IDApOwotI2lmZGVmIERFQlVHCi0JCQkgIGlmIChpbmR4IDw9IDApCi0JCQkgICAgewotCQkJICAgICAgcHJpbnRmKCJpbmR4PSVkIHNlY3Rpb249JXMgZmxhZ3M9JTA4eCBuYW1lPSVzXG4iLAotCQkJCSAgICAgaW5keCwgb3NlYy0+bmFtZSwgb3NlYy0+ZmxhZ3MsCi0JCQkJICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJCSAgICB9Ci0jZW5kaWYKLQkJCX0KLQotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCByX3R5cGUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotICAgICAgICAgICAgICAgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoc2tpcAotCQkgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgIHx8IEVMRjMyX1JfVFlQRSAob3V0cmVsLnJfaW5mbykgIT0gUl9QUENfUkVMQVRJVkUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEFyaXRobWV0aWMgYWRqdXN0IHJlbG9jYXRpb25zIHRoYXQgYXJlbid0IGdvaW5nIGludG8gYQotCSAgICAgc2hhcmVkIG9iamVjdC4gICovCi0JICBpZiAocl90eXBlID09IFJfUFBDX0FERFIxNl9IQQotCSAgICAgIC8qIEl0J3MganVzdCBwb3NzaWJsZSB0aGF0IHRoaXMgc3ltYm9sIGlzIGEgd2VhayBzeW1ib2wKLQkJIHRoYXQncyBub3QgYWN0dWFsbHkgZGVmaW5lZCBhbnl3aGVyZS4gSW4gdGhhdCBjYXNlLAotCQkgJ3NlYycgd291bGQgYmUgTlVMTCwgYW5kIHdlIHNob3VsZCBsZWF2ZSB0aGUgc3ltYm9sCi0JCSBhbG9uZSAoaXQgd2lsbCBiZSBzZXQgdG8gemVybyBlbHNld2hlcmUgaW4gdGhlIGxpbmspLiAgKi8KLQkgICAgICAmJiBzZWMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFkZGVuZCArPSAoKHJlbG9jYXRpb24gKyBhZGRlbmQpICYgMHg4MDAwKSA8PCAxOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIGJyYW5jaCB0YWtlbiBwcmVkaWN0aW9uIHJlbG9jYXRpb25zICovCi0JY2FzZSAoaW50KVJfUFBDX0FERFIxNF9CUlRBS0VOOgotCWNhc2UgKGludClSX1BQQ19SRUwxNF9CUlRBS0VOOgotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKG91dHB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGlmICgocmVsb2NhdGlvbiAtIG9mZnNldCkgJiAweDgwMDApCi0JICAgIGluc24gJj0gfkJSQU5DSF9QUkVESUNUX0JJVDsKLQkgIGVsc2UKLQkgICAgaW5zbiB8PSBCUkFOQ0hfUFJFRElDVF9CSVQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBicmVhazsKLQotCS8qIGJyYW5jaCBub3QgdGFrZW4gcHJlZGljaXRpb24gcmVsb2NhdGlvbnMgKi8KLQljYXNlIChpbnQpUl9QUENfQUREUjE0X0JSTlRBS0VOOgotCWNhc2UgKGludClSX1BQQ19SRUwxNF9CUk5UQUtFTjoKLQkgIGluc24gPSBiZmRfZ2V0XzMyIChvdXRwdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBpZiAoKHJlbG9jYXRpb24gLSBvZmZzZXQpICYgMHg4MDAwKQotCSAgICBpbnNuIHw9IEJSQU5DSF9QUkVESUNUX0JJVDsKLQkgIGVsc2UKLQkgICAgaW5zbiAmPSB+QlJBTkNIX1BSRURJQ1RfQklUOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgYnJlYWs7Ci0KLQkvKiBHT1QxNiByZWxvY2F0aW9ucyAqLwotCWNhc2UgKGludClSX1BQQ19HT1QxNjoKLQljYXNlIChpbnQpUl9QUENfR09UMTZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX0dPVDE2X0hJOgotCWNhc2UgKGludClSX1BQQ19HT1QxNl9IQToKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0gICAgICAgICAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgbG9jYWxseS4gIFdlIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlIHRoZSBvZmZzZXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UgdXNlIHRoZSBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsYS5nb3QKLQkJICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCQkgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KLQkJICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgICBvZmYgJj0gfjE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgICAgICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gNDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLQkJIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBlbnRyeS4gICovCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgUl9QUENfUkVMQVRJVkUgcmVsb2MKLQkJCSBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJCSArIG9mZik7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfUFBDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbjsKLQkJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCQkgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gNDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEgcmVsb2NhdGlvbiAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfU0RBSTE2OgotCSAgQkZEX0FTU0VSVCAoc2RhdGEgIT0gTlVMTCk7Ci0JICByZWxvY2F0aW9uID0gYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sCi0JCQkJCQkJCXNkYXRhLCBoLCByZWxvY2F0aW9uLCByZWwsCi0JCQkJCQkJCVJfUFBDX1JFTEFUSVZFKTsKLQkgIGJyZWFrOwotCi0JLyogSW5kaXJlY3QgLnNkYXRhMiByZWxvY2F0aW9uICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9TREEySTE2OgotCSAgQkZEX0FTU0VSVCAoc2RhdGEyICE9IE5VTEwpOwotCSAgcmVsb2NhdGlvbiA9IGJmZF9lbGYzMl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLAotCQkJCQkJCQlzZGF0YTIsIGgsIHJlbG9jYXRpb24sIHJlbCwKLQkJCQkJCQkJUl9QUENfUkVMQVRJVkUpOwotCSAgYnJlYWs7Ci0KLQkvKiBIYW5kbGUgdGhlIFRPQzE2IHJlbG9jLiAgV2Ugd2FudCB0byB1c2UgdGhlIG9mZnNldCB3aXRoaW4gdGhlIC5nb3QKLQkgICBzZWN0aW9uLCBub3QgdGhlIGFjdHVhbCBWTUEuICBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gZ2VuZXJhdGluZwotCSAgIGFuIGVtYmVkZGVkIEVMRiBvYmplY3QsIGZvciB3aGljaCB0aGUgLmdvdCBzZWN0aW9uIGFjdHMgbGlrZSB0aGUKLQkgICBBSVggLnRvYyBzZWN0aW9uLiAgKi8KLQljYXNlIChpbnQpUl9QUENfVE9DMTY6CQkJLyogcGhvbnkgR09UMTYgcmVsb2NhdGlvbnMgKi8KLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKQotCQkgICAgICB8fCBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLmdvdCIpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5jZ290IikgPT0gMCkKLQotCSAgYWRkZW5kIC09IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCArIDB4ODAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAoaW50KVJfUFBDX1BMVFJFTDI0OgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMQotCSAgICAgIHx8IHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkJKyBoLT5wbHQub2Zmc2V0KTsKLSAJICBicmVhazsKLQotCS8qIHJlbG9jYXRlIGFnYWluc3QgX1NEQV9CQVNFXyAqLwotCWNhc2UgKGludClSX1BQQ19TREFSRUwxNjoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSAhPSAwCi0JCSYmIHN0cmNtcCAobmFtZSwgIi5zYnNzIikgIT0gMCkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKLQkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICAgc3ltX25hbWUsCi0JCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJICAgICAgIG5hbWUpOwotCSAgICAgIH0KLQkgICAgYWRkZW5kIC09IChzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQotCS8qIHJlbG9jYXRlIGFnYWluc3QgX1NEQTJfQkFTRV8gKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX1NEQTJSRUw6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpICE9IDAgJiYgc3RyY21wIChuYW1lLCAiLnNic3MyIikgIT0gMCkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKLQkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICAgc3ltX25hbWUsCi0JCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJICAgICAgIG5hbWUpOwotCQkKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCXJldCA9IGZhbHNlOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIGFkZGVuZCAtPSAoc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIH0KLQkgIGJyZWFrOwotCi0KLQkvKiByZWxvY2F0ZSBhZ2FpbnN0IGVpdGhlciBfU0RBX0JBU0VfLCBfU0RBMl9CQVNFXywgb3IgMCAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfU0RBMjE6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTREE6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGludCByZWc7Ci0KLQkgICAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JICAgICAgewotCQlyZWcgPSAxMzsKLQkJYWRkZW5kIC09IChzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEyIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICIuc2JzczIiKSA9PSAwKQotCSAgICAgIHsKLQkJcmVnID0gMjsKLQkJYWRkZW5kIC09IChzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuUFBDLkVNQi5zZGF0YTAiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgIi5QUEMuRU1CLnNic3MwIikgPT0gMCkKLQkgICAgICB7Ci0JCXJlZyA9IDA7Ci0JICAgICAgfQotCi0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKLQkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICAgc3ltX25hbWUsCi0JCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJICAgICAgIG5hbWUpOwotCi0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlyZXQgPSBmYWxzZTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGlmIChyX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxKQotCSAgICAgIHsJCQkvKiBmaWxsIGluIHJlZ2lzdGVyIGZpZWxkICovCi0JCWluc24gPSBiZmRfZ2V0XzMyIChvdXRwdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0JCWluc24gPSAoaW5zbiAmIH5SQV9SRUdJU1RFUl9NQVNLKSB8IChyZWcgPDwgUkFfUkVHSVNURVJfU0hJRlQpOwotCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQkvKiBSZWxvY2F0ZSBhZ2FpbnN0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gKi8KLQljYXNlIChpbnQpUl9QUENfU0VDVE9GRjoKLQljYXNlIChpbnQpUl9QUENfU0VDVE9GRl9MTzoKLQljYXNlIChpbnQpUl9QUENfU0VDVE9GRl9ISToKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgIGFkZGVuZCAtPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQotCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGX0hBOgotCSAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgYWRkZW5kIC09IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIGFkZGVuZCArPSAoKHJlbG9jYXRpb24gKyBhZGRlbmQpICYgMHg4MDAwKSA8PCAxOwotCSAgYnJlYWs7Ci0KLQkvKiBOZWdhdGl2ZSByZWxvY2F0aW9ucyAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIzMjoKLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTY6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2X0xPOgotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNl9ISToKLQkgIGFkZGVuZCAtPSAyKnJlbG9jYXRpb247Ci0JICBicmVhazsKLQotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNl9IQToKLQkgIGFkZGVuZCAtPSAyKnJlbG9jYXRpb247Ci0JICBhZGRlbmQgKz0gKChyZWxvY2F0aW9uICsgYWRkZW5kKSAmIDB4ODAwMCkgPDwgMTsKLQkgIGJyZWFrOwotCi0JLyogTk9QIHJlbG9jYXRpb24gdGhhdCBwcmV2ZW50cyBnYXJiYWdlIGNvbGxlY3RpbmcgbGlua2VycyBmcm9tIG9taXR0aW5nIGEKLQkgICByZWZlcmVuY2UuICAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfTVJLUkVGOgotCSAgY29udGludWU7Ci0KLQljYXNlIChpbnQpUl9QUENfQ09QWToKLQljYXNlIChpbnQpUl9QUENfR0xPQl9EQVQ6Ci0JY2FzZSAoaW50KVJfUFBDX0pNUF9TTE9UOgotCWNhc2UgKGludClSX1BQQ19SRUxBVElWRToKLQljYXNlIChpbnQpUl9QUENfUExUMzI6Ci0JY2FzZSAoaW50KVJfUFBDX1BMVFJFTDMyOgotCWNhc2UgKGludClSX1BQQ19QTFQxNl9MTzoKLQljYXNlIChpbnQpUl9QUENfUExUMTZfSEk6Ci0JY2FzZSAoaW50KVJfUFBDX1BMVDE2X0hBOgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU0VDMTY6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTVF9MTzoKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNUX0hJOgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU1RfSEE6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9CSVRfRkxEOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogUmVsb2NhdGlvbiAlcyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3Igc3ltYm9sICVzLiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAotCQkJCSBzeW1fbmFtZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAoaW50KVJfUFBDX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSAoaW50KVJfUFBDX0dOVV9WVEVOVFJZOgotCSAgLyogVGhlc2UgYXJlIG5vLW9wcyBpbiB0aGUgZW5kLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIG5hbWUgPSAlcywgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkgICAgICAgaG93dG8tPm5hbWUsCi0JICAgICAgIChpbnQpcl90eXBlLAotCSAgICAgICBzeW1fbmFtZSwKLQkgICAgICAgcl9zeW1uZHgsCi0JICAgICAgIChsb25nKW9mZnNldCwKLQkgICAgICAgKGxvbmcpYWRkZW5kKTsKLSNlbmRpZgotCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkgICAgaW5wdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywKLQkJCQkgICAgb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLAotCQkJCSAgICBhZGRlbmQpOwotCi0gICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2spCi0JOwotICAgICAgZWxzZSBpZiAociA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLQkJICAmJiBob3d0by0+cGNfcmVsYXRpdmUpCi0JCXsKLQkJICAvKiBBc3N1bWUgdGhpcyBpcyBhIGNhbGwgcHJvdGVjdGVkIGJ5IG90aGVyIGNvZGUgdGhhdAotCQkgICAgIGRldGVjdCB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsCi0JCSAgICAgd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIG92ZXJmbG93LiAgSWYgbm90LCB0aGUKLQkJICAgICBwcm9ncmFtIGlzIGhvc2VkIGFueXdheSwgYW5kIGEgbGl0dGxlIHdhcm5pbmcgaXNuJ3QKLQkJICAgICBnb2luZyB0byBoZWxwLiAgKi8KLQotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykoaW5mbywKLQkJCQkJCSAgIG5hbWUsCi0JCQkJCQkgICBob3d0by0+bmFtZSwKLQkJCQkJCSAgIChiZmRfdm1hKSAwLAotCQkJCQkJICAgaW5wdXRfYmZkLAotCQkJCQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSAgIG9mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0ID0gZmFsc2U7Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXQ7Ci19Ci0KLQwKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1wb3dlcnBjbGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfcG93ZXJwY192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItcG93ZXJwYyIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3Bvd2VycGMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9QUEMKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCXBwY19lbGZfaW5mb190b19ob3d0bwotCi0jaWZkZWYgIEVNX0NZR05VU19QT1dFUlBDCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEJRU1fQ1lHTlVTX1BPV0VSUEMKLSNlbmRpZgotCi0jaWZkZWYgRU1fUFBDX09MRAotI2RlZmluZSBFTEZfTUFDSElORV9BTFQyCUVNX1BQQ19PTEQKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQJNAotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCVBMVF9JTklUSUFMX0VOVFJZX1NJWkUKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQlwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJcHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbiAgICAgICAgICAgICBwcGNfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJcHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQlwcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawkJX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxfbGluawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJcHBjX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawkJcHBjX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCQlwcGNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCXBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwlwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwkJcHBjX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCXBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCXBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAlwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwlwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJCXBwY19lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwlwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAkJcHBjX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXNoLmMgYi9iZmQvZWxmMzItc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1YmQ5Zi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItc2guYworKysgL2Rldi9udWxsCkBAIC0xLDIxMTQgKzAsMCBAQAotLyogSGl0YWNoaSBTSCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9zaC5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX2VsZl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc2hfZWxmX2lnbm9yZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpzaF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgc2hfZWxmX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfYWxpZ25fbG9hZHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX3N3YXBfaW5zbnMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBiZmRfYnl0ZSAqc2hfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzaF9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9TSF9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICBTZXR0aW5nIHBhcnRpYWxfaW5wbGFjZSB0byB0cnVlIGFuZAotICAgICBzcmNfbWFzayB0byBhIG5vbi16ZXJvIHZhbHVlIGlzIHNpbWlsYXIgdG8gdGhlIENPRkYgdG9vbGNoYWluLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1NIX1JFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggZGl2aWRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOFdQTiwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4V1BOIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IFBDIHJlbGF0aXZlIGJyYW5jaCBkaXZpZGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9TSF9JTkQxMlcsCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0lORDEyVyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IHVuc2lnbmVkIFBDIHJlbGF0aXZlIGRpdmlkZWQgYnkgNC4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUEwsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4V1BMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgdW5zaWduZWQgUEMgcmVsYXRpdmUgZGl2aWRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOFdQWiwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhXUFoiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUuICBGSVhNRTogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmIHdlIGhhdmUgc29tZQotICAgICBzcGVjaWFsIHN5bWJvbCBmb3IgdGhlIEdCUiByZWxhdGl2ZSBhcmVhLCBhbmQgdGhhdCBpcyBub3QKLSAgICAgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4QlAsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOEJQIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUgZGl2aWRlZCBieSAyLiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZgotICAgICB3ZSBoYXZlIHNvbWUgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQKLSAgICAgaXMgbm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOFcsCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFciLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IEdCUiByZWxhdGl2ZSBkaXZpZGVkIGJ5IDQuICBGSVhNRTogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmCi0gICAgIHdlIGhhdmUgc29tZSBzcGVjaWFsIHN5bWJvbCBmb3IgdGhlIEdCUiByZWxhdGl2ZSBhcmVhLCBhbmQgdGhhdAotICAgICBpcyBub3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4TCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4TCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDEwKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLSAgRU1QVFlfSE9XVE8gKDEyKSwKLSAgRU1QVFlfSE9XVE8gKDEzKSwKLSAgRU1QVFlfSE9XVE8gKDE0KSwKLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwKLSAgRU1QVFlfSE9XVE8gKDE3KSwKLSAgRU1QVFlfSE9XVE8gKDE4KSwKLSAgRU1QVFlfSE9XVE8gKDE5KSwKLSAgRU1QVFlfSE9XVE8gKDIwKSwKLSAgRU1QVFlfSE9XVE8gKDIxKSwKLSAgRU1QVFlfSE9XVE8gKDIyKSwKLSAgRU1QVFlfSE9XVE8gKDIzKSwKLSAgRU1QVFlfSE9XVE8gKDI0KSwKLQotICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgYSBHTlUgZXh0ZW5zaW9uIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhlCi0gICAgIGZpbmFsIHBhc3Mgb2YgdGhlIGxpbmtlciBuZXZlciBuZWVkcyB0byBkbyBhbnl0aGluZyB3aXRoIGFueSBvZgotICAgICB0aGVzZSByZWxvY3MuICBBbnkgcmVxdWlyZWQgb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUKLSAgICAgcmVsYXhhdGlvbiBjb2RlLiAgKi8KLQotICAvKiBBIDE2IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkuICBUaGlzIGlzIGdlbmVyYXRlZCBmb3IgYW4gZXhwcmVzc2lvbgotICAgICBzdWNoIGFzIGBgLndvcmQgTDEgLSBMMicnLiAgVGhlIG9mZnNldCBob2xkcyB0aGUgZGlmZmVyZW5jZQotICAgICBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCBMMi4gICovCi0gIEhPV1RPIChSX1NIX1NXSVRDSDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9TV0lUQ0gxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBzd2l0Y2ggdGFibGUgZW50cnkuICBUaGlzIGlzIGdlbmVyYXRlZCBmb3IgYW4gZXhwcmVzc2lvbgotICAgICBzdWNoIGFzIGBgLmxvbmcgTDEgLSBMMicnLiAgVGhlIG9mZnNldCBob2xkcyB0aGUgZGlmZmVyZW5jZQotICAgICBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCBMMi4gICovCi0gIEhPV1RPIChSX1NIX1NXSVRDSDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9TV0lUQ0gzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbmRpY2F0ZXMgYSAudXNlcyBwc2V1ZG8tb3AuICBUaGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSAudXNlcwotICAgICBwc2V1ZG8tb3BzIHdoZW4gaXQgZmluZHMgYSBmdW5jdGlvbiBjYWxsIHdoaWNoIGNhbiBiZSByZWxheGVkLgotICAgICBUaGUgb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gdGhlIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIGxvYWRzIHRoZSByZWdpc3RlciB1c2VkIGluIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLSAgSE9XVE8gKFJfU0hfVVNFUywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9VU0VTIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgdGhpcyByZWxvYyBmb3IgYWRkcmVzc2VzIHJlZmVycmVkIHRvCi0gICAgIGJ5IHRoZSByZWdpc3RlciBsb2FkcyBhc3NvY2lhdGVkIHdpdGggVVNFUyByZWxvY3MuICBUaGUgb2Zmc2V0Ci0gICAgIGZpZWxkIGhvbGRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFkZHJlc3MgaXMgcmVmZXJlbmNlZCBpbiB0aGUKLSAgICAgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoUl9TSF9DT1VOVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9DT1VOVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5kaWNhdGVzIGFuIGFsaWdubWVudCBzdGF0ZW1lbnQuICBUaGUgb2Zmc2V0IGZpZWxkIGlzIHRoZSBwb3dlcgotICAgICBvZiAyIHRvIHdoaWNoIHN1YnNlcXVlbnQgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlIG11c3QgYmUKLSAgICAgYWxpZ25lZC4gICovCi0gIEhPV1RPIChSX1NIX0FMSUdOLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0FMSUdOIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSB0aGlzIHJlbG9jIGJlZm9yZSBhIGJsb2NrIG9mCi0gICAgIGluc3RydWN0aW9ucy4gIEEgc2VjdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkIGFzIGFzc3VtaW5pbmcgaXQKLSAgICAgY29udGFpbnMgZGF0YSwgdW5sZXNzIHRoaXMgcmVsb2MgaXMgc2Vlbi4gICovCi0gIEhPV1RPIChSX1NIX0NPREUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfQ09ERSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIHRoaXMgcmVsb2MgYWZ0ZXIgYSBibG9jayBvZgotICAgICBpbnN0cnVjdGlvbnMgd2hlbiBpdCBzZWVzIGRhdGEgdGhhdCBpcyBub3QgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgSE9XVE8gKFJfU0hfREFUQSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9EQVRBIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIGdlbmVyYXRlcyB0aGlzIHJlbG9jIGZvciBlYWNoIGxhYmVsIHdpdGhpbiBhIGJsb2NrCi0gICAgIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvIGF2b2lkIHN3YXBwaW5nCi0gICAgIGluc3RydWN0aW9ucyB3aGljaCBhcmUgdGhlIHRhcmdldHMgb2YgYnJhbmNoZXMuICAqLwotICBIT1dUTyAoUl9TSF9MQUJFTCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9MQUJFTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gOCBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC53b3JkIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0g4LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX1NXSVRDSDgiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfU0hfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfU0hfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX1NIX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9TSF9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igbm9ybWFsIHJlbG9jcy4gIFRoaXMgaXMgbGlrZSB0aGUgQ09GRgotICAgZnVuY3Rpb24sIGFuZCBpcyBhbG1vc3QgY2VydGFpbmx5IGluY29ycmVjdCBmb3Igb3RoZXIgRUxGIHRhcmdldHMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zaF9lbGZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF92bWEgc3ltX3ZhbHVlOwotICBlbnVtIGVsZl9zaF9yZWxvY190eXBlIHJfdHlwZTsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGFkZHIgKyAoYmZkX2J5dGUgKikgZGF0YTsKLQotICByX3R5cGUgPSAoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nLS1kbyBub3RoaW5nLiAgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0IGJlCi0gICAgIGRvbmUgZm9yIHRoZW0sIGl0IGhhcyBiZWVuIGRvbmUgaW4gc2hfcmVsYXhfc2VjdGlvbi4gICovCi0gIGlmIChyX3R5cGUgIT0gUl9TSF9ESVIzMgotICAgICAgJiYgKHJfdHlwZSAhPSBSX1NIX0lORDEyVwotCSAgfHwgKHN5bWJvbF9pbi0+ZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICBzeW1fdmFsdWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlIAotICAgIHN5bV92YWx1ZSA9IChzeW1ib2xfaW4tPnZhbHVlICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSBzeW1ib2xfaW4tPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfU0hfRElSMzI6Ci0gICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1NIX0lORDEyVzoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBzeW1fdmFsdWUgKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIHN5bV92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIGFkZHIKLQkJICAgICsgNCk7Ci0gICAgICBzeW1fdmFsdWUgKz0gKGluc24gJiAweGZmZikgPDwgMTsKLSAgICAgIGlmIChpbnNuICYgMHg4MDApCi0Jc3ltX3ZhbHVlIC09IDB4MTAwMDsKLSAgICAgIGluc24gPSAoaW5zbiAmIDB4ZjAwMCkgfCAoc3ltX3ZhbHVlICYgMHhmZmYpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgICAgaWYgKHN5bV92YWx1ZSA8IChiZmRfdm1hKSAtMHgxMDAwIHx8IHN5bV92YWx1ZSA+PSAweDEwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHJlbG9jcyB3aGljaCBhcmUgb25seSB1c2VkIGZvciByZWxheGluZywKLSAgIHdoaWNoIHRoZSBsaW5rZXIgc2hvdWxkIG90aGVyd2lzZSBpZ25vcmUuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zaF9lbGZfaWdub3JlX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIEVMRiByZWxvY3MuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotLyogQW4gYXJyYXkgbWFwcGluZyBCRkQgcmVsb2MgY29kZXMgdG8gU0ggRUxGIHJlbG9jcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzaF9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU0hfTk9ORSB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9ESVIzMiB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NIX0RJUjMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NIX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIsIFJfU0hfRElSOFdQTiB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiwgUl9TSF9JTkQxMlcgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLCBSX1NIX0RJUjhXUFogfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX0RJUjhXUEwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TSF9TV0lUQ0g4IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDE2IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLCBSX1NIX1NXSVRDSDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1VTRVMsIFJfU0hfVVNFUyB9LAotICB7IEJGRF9SRUxPQ19TSF9DT1VOVCwgUl9TSF9DT1VOVCB9LAotICB7IEJGRF9SRUxPQ19TSF9BTElHTiwgUl9TSF9BTElHTiB9LAotICB7IEJGRF9SRUxPQ19TSF9DT0RFLCBSX1NIX0NPREUgfSwKLSAgeyBCRkRfUkVMT0NfU0hfREFUQSwgUl9TSF9EQVRBIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0xBQkVMLCBSX1NIX0xBQkVMIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NIX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NIX0dOVV9WVEVOVFJZIH0sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCi0gICBjb3JyZXNwb25kaW5nIFNIIEVMZiByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzaF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2hfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnNoX2VsZl9ob3d0b190YWJsZVsoaW50KSBzaF9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhbiBFTEYgcmVsb2MsIGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkIG9mIGEgcmVsZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNoX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHI7Ci0KLSAgciA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKHIgPCAodW5zaWduZWQgaW50KSBSX1NIX21heCk7Ci0gIEJGRF9BU1NFUlQgKHIgPCBSX1NIX0ZJUlNUX0lOVkFMSURfUkVMT0MgfHwgciA+IFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DKTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gJnNoX2VsZl9ob3d0b190YWJsZVtyXTsKLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgU0ggRUxGLiAgU2VlIHRoZSBjb3JyZXNwb25kaW5nCi0gICBmdW5jdGlvbiBpbiBjb2ZmLXNoLmMgZm9yIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIGRvZXMuICBGSVhNRToKLSAgIFRoZXJlIGlzIGEgbG90IG9mIGR1cGxpY2F0aW9uIGhlcmUgYmV0d2VlbiB0aGlzIGNvZGUgYW5kIHRoZSBDT0ZGCi0gICBzcGVjaWZpYyBjb2RlLiAgVGhlIGZvcm1hdCBvZiByZWxvY3MgYW5kIHN5bWJvbHMgaXMgd291bmQgZGVlcGx5Ci0gICBpbnRvIHRoaXMgY29kZSwgYnV0IGl0IHdvdWxkIHN0aWxsIGJlIGJldHRlciBpZiB0aGUgZHVwbGljYXRpb24KLSAgIGNvdWxkIGJlIGVsaW1pbmF0ZWQgc29tZWhvdy4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IGFsdGhvdWdoIGJvdGgKLSAgIGZ1bmN0aW9ucyB1c2Ugc3ltYm9scyBsaWtlIFJfU0hfQ09ERSwgdGhvc2Ugc3ltYm9scyBoYXZlIGRpZmZlcmVudAotICAgdmFsdWVzOyBpbiBjb2ZmLXNoLmMgdGhleSBjb21lIGZyb20gaW5jbHVkZS9jb2ZmL3NoLmgsIHdoZXJlYXMgaGVyZQotICAgdGhleSBjb21lIGZyb20gZW51bSBlbGZfc2hfcmVsb2NfdHlwZSBpbiBpbmNsdWRlL2VsZi9zaC5oLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1zaF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgYm9vbGVhbiBoYXZlX2NvZGU7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgaGF2ZV9jb2RlID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxhZGRyLCBwYWRkciwgc3ltdmFsOwotICAgICAgdW5zaWduZWQgc2hvcnQgaW5zbjsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsZm4sICppcmVsc2NhbiwgKmlyZWxjb3VudDsKLSAgICAgIGJmZF9zaWduZWRfdm1hIGZvZmY7Ci0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9DT0RFKQotCWhhdmVfY29kZSA9IHRydWU7Ci0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9VU0VTKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUaGUgcl9hZGRlbmQgZmllbGQgb2YgdGhlIFJfU0hfVVNFUyByZWxvYyB3aWxsIHBvaW50IHVzIHRvCi0gICAgICAgICB0aGUgcmVnaXN0ZXIgbG9hZC4gIFRoZSA0IGlzIGJlY2F1c2UgdGhlIHJfYWRkZW5kIGZpZWxkIGlzCi0gICAgICAgICBjb21wdXRlZCBhcyB0aG91Z2ggaXQgd2VyZSBhIGp1bXAgb2Zmc2V0LCB3aGljaCBhcmUgYmFzZWQKLSAgICAgICAgIGZyb20gNCBieXRlcyBhZnRlciB0aGUganVtcCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBsYWRkciA9IGlyZWwtPnJfb2Zmc2V0ICsgNCArIGlyZWwtPnJfYWRkZW5kOwotICAgICAgaWYgKGxhZGRyID49IHNlYy0+X3Jhd19zaXplKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGxhZGRyKTsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBtb3YubCBOTixyTiwgd2UgZG9uJ3Qga25vdyB3aGF0IHRvCi0gICAgICAgICBkby4gICovCi0gICAgICBpZiAoKGluc24gJiAweGYwMDApICE9IDB4ZDAwMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogUl9TSF9VU0VTIHBvaW50cyB0byB1bnJlY29nbml6ZWQgaW5zbiAweCV4IiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQsIGluc24pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzIGJlaW5nIGxvYWRlZC4gIFRoZQotICAgICAgCSBkaXNwbGFjZW1lbnQgaW4gdGhlIG1vdi5sIGluc3RydWN0aW9uIGlzIHF1YWRydXBsZWQuICBJdCBpcyBhCi0gICAgICAJIGRpc3BsYWNlbWVudCBmcm9tIGZvdXIgYnl0ZXMgYWZ0ZXIgdGhlIG1vdmwgaW5zdHJ1Y3Rpb24sIGJ1dCwKLSAgICAgIAkgYmVmb3JlIGFkZGluZyBpbiB0aGUgUEMgYWRkcmVzcywgdHdvIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLSAgICAgIAkgb2YgdGhlIFBDIGFyZSBjbGVhcmVkLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlY3Rpb24gaXMgYWxpZ25lZAotICAgICAgCSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0gICAgICBwYWRkciA9IGluc24gJiAweGZmOwotICAgICAgcGFkZHIgKj0gNDsKLSAgICAgIHBhZGRyICs9IChsYWRkciArIDQpICZ+IDM7Ci0gICAgICBpZiAocGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHJlbG9jIGZvciB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSByZWdpc3RlciBpcwotICAgICAgICAgYmVpbmcgbG9hZGVkLiAgVGhpcyByZWxvYyB3aWxsIHRlbGwgdXMgd2hpY2ggZnVuY3Rpb24gaXMKLSAgICAgICAgIGFjdHVhbGx5IGJlaW5nIGNhbGxlZC4gICovCi0gICAgICBmb3IgKGlyZWxmbiA9IGludGVybmFsX3JlbG9jczsgaXJlbGZuIDwgaXJlbGVuZDsgaXJlbGZuKyspCi0JaWYgKGlyZWxmbi0+cl9vZmZzZXQgPT0gcGFkZHIKLQkgICAgJiYgRUxGMzJfUl9UWVBFIChpcmVsZm4tPnJfaW5mbykgPT0gKGludCkgUl9TSF9ESVIzMikKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxmbiA+PSBpcmVsZW5kKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBpZiAoaXN5bS5zdF9zaG5keCAhPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYykpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChpc3ltLnN0X3ZhbHVlCi0JCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaW5keCA9IEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIHN5bXZhbCArPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHBhZGRyKTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgZnVuY3Rpb24gY2FsbCBjYW4gYmUgc2hvcnRlbmVkLiAgKi8KLSAgICAgIGZvZmYgPSAoc3ltdmFsCi0JICAgICAgLSAoaXJlbC0+cl9vZmZzZXQKLQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgKyA0KSk7Ci0gICAgICBpZiAoZm9mZiA8IC0weDEwMDAgfHwgZm9mZiA+PSAweDEwMDApCi0JewotCSAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgd2UgY2FuJ3Qgc2hvcnRlbiB0aGlzIGZ1bmN0aW9uIGNhbGwuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBTaG9ydGVuIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgICAgIC8qIFJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLQotICAgICAgLyogQ2hhbmdlIHRoZSBSX1NIX1VTRVMgcmVsb2MgaW50byBhbiBSX1NIX0lORDEyVyByZWxvYywgYW5kCi0gICAgICAgICByZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCi0gICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbyksIFJfU0hfSU5EMTJXKTsKLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICAvKiBJZiB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgYmVjYXVzZSBvZiBmdXR1cmUgcmVsYXhpbmcsCi0gICAgICAgICAgICAgaXQgd2lsbCBiZSBoYW5kbGVkIGhlcmUgbGlrZSBvdGhlciBpbnRlcm5hbCBJTkQxMlcKLSAgICAgICAgICAgICByZWxvY3MuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgMHhiMDAwIHwgKChmb2ZmID4+IDEpICYgMHhmZmYpLAotCQkgICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3QgZnVsbHkgcmVzb2x2ZSB0aGlzIHlldCwgYmVjYXVzZSB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYnkgZnV0dXJlIHJlbGF4aW5nLiAgV2UgbGV0Ci0gICAgICAgICAgICAgdGhlIGZpbmFsIGxpbmsgcGhhc2UgaGFuZGxlIGl0LiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIDB4YjAwMCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0JfQotCi0gICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBSX1NIX1VTRVMgcmVsb2MgcmVmZXJyaW5nIHRvIHRoZSBzYW1lCi0gICAgICAgICByZWdpc3RlciBsb2FkLiAgKi8KLSAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbGVuZDsgaXJlbHNjYW4rKykKLQlpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX1VTRVMKLQkgICAgJiYgbGFkZHIgPT0gaXJlbHNjYW4tPnJfb2Zmc2V0ICsgNCArIGlyZWxzY2FuLT5yX2FkZGVuZCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxzY2FuIDwgaXJlbGVuZCkKLQl7Ci0JICAvKiBTb21lIG90aGVyIGZ1bmN0aW9uIGNhbGwgZGVwZW5kcyB1cG9uIHRoaXMgcmVnaXN0ZXIgbG9hZCwKLQkgICAgIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgY29udmVydGVkIHRoYXQgZnVuY3Rpb24gY2FsbC4KLQkgICAgIEluZGVlZCwgd2UgbWF5IG5ldmVyIGJlIGFibGUgdG8gY29udmVydCBpdC4gIFRoZXJlIGlzCi0JICAgICBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciBhIFJfU0hfQ09VTlQgcmVsb2Mgb24gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZQotICAgICAgICAgZnVuY3Rpb24gYWRkcmVzcyBpcyBzdG9yZWQuICBEbyB0aGlzIGJlZm9yZSBkZWxldGluZyBhbnkKLSAgICAgICAgIGJ5dGVzLCB0byBhdm9pZCBjb25mdXNpb24gYWJvdXQgdGhlIGFkZHJlc3MuICAqLwotICAgICAgZm9yIChpcmVsY291bnQgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxjb3VudCA8IGlyZWxlbmQ7IGlyZWxjb3VudCsrKQotCWlmIChpcmVsY291bnQtPnJfb2Zmc2V0ID09IHBhZGRyCi0JICAgICYmIEVMRjMyX1JfVFlQRSAoaXJlbGNvdW50LT5yX2luZm8pID09IChpbnQpIFJfU0hfQ09VTlQpCi0JICBicmVhazsKLQotICAgICAgLyogRGVsZXRlIHRoZSByZWdpc3RlciBsb2FkLiAgKi8KLSAgICAgIGlmICghIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgbGFkZHIsIDIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIGp1c3QgaW4gY2FzZSBpdCBwZXJtaXRzIHNvbWUKLSAgICAgICAgIG90aGVyIGZ1bmN0aW9uIGNhbGwgdG8gY29tZSB3aXRoaW4gcmFuZ2UsIHdlIHNob3VsZCByZWxheAotICAgICAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0gICAgICAqYWdhaW4gPSB0cnVlOwotCi0gICAgICAvKiBOb3cgY2hlY2sgd2hldGhlciB3ZSBnb3QgYSBDT1VOVCByZWxvYy4gICovCi0gICAgICBpZiAoaXJlbGNvdW50ID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIENPVU5UIHJlbG9jIiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhlIG51bWJlciBvZiB1c2VzIGlzIHN0b3JlZCBpbiB0aGUgcl9hZGRlbmQgZmllbGQuICBXZSd2ZQotICAgICAgICAganVzdCBkZWxldGVkIG9uZS4gICovCi0gICAgICBpZiAoaXJlbGNvdW50LT5yX2FkZGVuZCA9PSAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiAweCVseDogd2FybmluZzogYmFkIGNvdW50IiksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAtLWlyZWxjb3VudC0+cl9hZGRlbmQ7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHVzZXMsIHdlIGNhbiBkZWxldGUgdGhlIGFkZHJlc3MuICBSZWxvYWQKLSAgICAgICAgIHRoZSBhZGRyZXNzIGZyb20gaXJlbGZuLCBpbiBjYXNlIGl0IHdhcyBjaGFuZ2VkIGJ5IHRoZQotICAgICAgICAgcHJldmlvdXMgY2FsbCB0byBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfYWRkZW5kID09IDApCi0JewotCSAgaWYgKCEgc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBpcmVsZm4tPnJfb2Zmc2V0LCA0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSd2ZSBkb25lIGFsbCB3ZSBjYW4gd2l0aCB0aGF0IGZ1bmN0aW9uIGNhbGwuICAqLwotICAgIH0KLQotICAvKiBMb29rIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCB3ZSBjYW4gYWxpZ24gb24gZm91cgotICAgICBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoaGF2ZV9jb2RlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gc3dhcHBlZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgc2hfZWxmX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsCi0JCQkJJnN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc3dhcHBlZCkKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JfQotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICBGSVhNRTogVGhlcmUgaXMgYQotICAgbG90IG9mIGR1cGxpY2F0aW9uIGJldHdlZW4gdGhpcyBmdW5jdGlvbiBhbmQgc2hfcmVsYXhfZGVsZXRlX2J5dGVzCi0gICBpbiBjb2ZmLXNoLmMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0gIGFzZWN0aW9uICpvOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0KLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfQUxJR04KLQkgICYmIGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgJiYgY291bnQgPCAoMSA8PCBpcmVsLT5yX2FkZGVuZCkpCi0JewotCSAgaXJlbGFsaWduID0gaXJlbDsKLQkgIHRvYWRkciA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgaWYgKGlyZWxhbGlnbiA9PSBOVUxMKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSNkZWZpbmUgTk9QX09QQ09ERSAoMHgwMDA5KQotCi0gICAgICBCRkRfQVNTRVJUICgoY291bnQgJiAxKSA9PSAwKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSAyKQotCWJmZF9wdXRfMTYgKGFiZmQsIE5PUF9PUENPREUsIGNvbnRlbnRzICsgdG9hZGRyIC0gY291bnQgKyBpKTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbnJhZGRyLCBzdG9wOwotICAgICAgYmZkX3ZtYSBzdGFydCA9IDA7Ci0gICAgICBpbnQgaW5zbiA9IDA7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBvZmYsIGFkanVzdCwgb2luc247Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSB2b2ZmID0gMDsKLSAgICAgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgbnJhZGRyID0gaXJlbC0+cl9vZmZzZXQ7Ci0gICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKQotCSAgfHwgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0FMSUdOCi0JICAgICAgJiYgaXJlbC0+cl9vZmZzZXQgPT0gdG9hZGRyKSkKLQlucmFkZHIgLT0gY291bnQ7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIHdhcyBmb3IgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZCwgaW4gd2hpY2gKLQkgY2FzZSB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCBpdC4gIERvbid0IGRlbGV0ZSByZWxvY3Mgd2hpY2gKLQkgcmVwcmVzZW50IGFkZHJlc3NlcywgdGhvdWdoLiAgKi8KLSAgICAgIGlmIChpcmVsLT5yX29mZnNldCA+PSBhZGRyCi0JICAmJiBpcmVsLT5yX29mZnNldCA8IGFkZHIgKyBjb3VudAotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQUxJR04KLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0NPREUKLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0RBVEEKLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0xBQkVMKQotCWlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICAoaW50KSBSX1NIX05PTkUpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHNlZSBpZiB0aGUgcmFuZ2UgaXQgY292ZXJzCi0gICAgICAgICBpbmNsdWRlcyB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLiAgKi8KLSAgICAgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUE46Ci0JY2FzZSBSX1NIX0lORDEyVzoKLQljYXNlIFJfU0hfRElSOFdQWjoKLQljYXNlIFJfU0hfRElSOFdQTDoKLQkgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykpCi0JewotCWRlZmF1bHQ6Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSMzI6Ci0JICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGlzCi0gICAgICAgICAgICAgc2VjdGlvbiwgYW5kIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUgYWRqdXN0ZWQgYmVsb3csIHdlCi0gICAgICAgICAgICAgbXVzdCBjaGVjayB0aGUgYWRkZW5kIHRvIHNlZSBpdCB3aWxsIHB1dCB0aGUgdmFsdWUgaW4KLSAgICAgICAgICAgICByYW5nZSB0byBiZSBhZGp1c3RlZCwgYW5kIGhlbmNlIG11c3QgYmUgY2hhbmdlZC4gICovCi0JICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCQlleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSZzeW0pOwotCSAgICAgIGlmIChzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkJICAmJiAoc3ltLnN0X3ZhbHVlIDw9IGFkZHIKLQkJICAgICAgfHwgc3ltLnN0X3ZhbHVlID49IHRvYWRkcikpCi0JCXsKLQkJICBiZmRfdm1hIHZhbDsKLQotCQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkJICB2YWwgKz0gc3ltLnN0X3ZhbHVlOwotCQkgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LCBjb250ZW50cyArIG5yYWRkcik7Ci0JCX0KLQkgICAgfQotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUE46Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIGlmIChvZmYgJiAweDgwKQotCSAgICBvZmYgLT0gMHgxMDA7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfSU5EMTJXOgotCSAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvZmYgPSBpbnNuICYgMHhmZmY7Ci0JICAgICAgaWYgKG9mZiAmIDB4ODAwKQotCQlvZmYgLT0gMHgxMDAwOwotCSAgICAgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUFo6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSBzdGFydCArIDQgKyBvZmYgKiAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTDoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IChzdGFydCAmfiAoYmZkX3ZtYSkgMykgKyA0ICsgb2ZmICogNDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1NXSVRDSDg6Ci0JY2FzZSBSX1NIX1NXSVRDSDE2OgotCWNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgIC8qIFRoZXNlIHJlbG9jcyB0eXBlcyByZXByZXNlbnQKLQkgICAgICAgLndvcmQgTDItTDEKLQkgICAgIFRoZSByX2FkZGVuZCBmaWVsZCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYwotCSAgICAgYWRkcmVzcyBhbmQgTDEuICBUaGF0IGlzIHRoZSBzdGFydCBvZiB0aGUgcmVsb2MsIGFuZAotCSAgICAgYWRkaW5nIGluIHRoZSBjb250ZW50cyBnaXZlcyB1cyB0aGUgdG9wLiAgV2UgbXVzdCBhZGp1c3QKLQkgICAgIGJvdGggdGhlIHJfb2Zmc2V0IGZpZWxkIGFuZCB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQkgICAgIE4uQi4gaW4gZ2FzIC8gY29mZiBiZmQsIHRoZSBlbGYgYmZkIHJfYWRkZW5kIGlzIGNhbGxlZCByX29mZnNldCwKLQkgICAgIGFuZCB0aGUgZWxmIGJmZCByX29mZnNldCBpcyBjYWxsZWQgcl92YWRkci4gICovCi0KLQkgIHN0b3AgPSBpcmVsLT5yX29mZnNldDsKLQkgIHN0YXJ0ID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0b3AgLSAobG9uZykgaXJlbC0+cl9hZGRlbmQpOwotCi0JICBpZiAoc3RhcnQgPiBhZGRyCi0JICAgICAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICAgICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9hZGRlbmQgKz0gY291bnQ7Ci0JICBlbHNlIGlmIChzdG9wID4gYWRkcgotCQkgICAmJiBzdG9wIDwgdG9hZGRyCi0JCSAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfYWRkZW5kIC09IGNvdW50OwotCi0JICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfU1dJVENIMTYpCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZSBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfU1dJVENIOCkKLQkgICAgdm9mZiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyB2b2ZmKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfVVNFUzoKLQkgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0Ci0JCQkgICAgKyAobG9uZykgaXJlbC0+cl9hZGRlbmQKLQkJCSAgICArIDQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc3RhcnQgPiBhZGRyCi0JICAmJiBzdGFydCA8IHRvYWRkcgotCSAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JYWRqdXN0ID0gY291bnQ7Ci0gICAgICBlbHNlIGlmIChzdG9wID4gYWRkcgotCSAgICAgICAmJiBzdG9wIDwgdG9hZGRyCi0JICAgICAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JYWRqdXN0ID0gLSBjb3VudDsKLSAgICAgIGVsc2UKLQlhZGp1c3QgPSAwOwotCi0gICAgICBpZiAoYWRqdXN0ICE9IDApCi0JewotCSAgb2luc24gPSBpbnNuOwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BOOgotCSAgICBjYXNlIFJfU0hfRElSOFdQWjoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9JTkQxMlc6Ci0JICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfRElSOFdQTDoKLQkgICAgICBCRkRfQVNTRVJUIChhZGp1c3QgPT0gY291bnQgfHwgY291bnQgPj0gNCk7Ci0JICAgICAgaWYgKGNvdW50ID49IDQpCi0JCWluc24gKz0gYWRqdXN0IC8gNDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGlyZWwtPnJfb2Zmc2V0ICYgMykgPT0gMCkKLQkJICAgICsraW5zbjsKLQkJfQotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMTY6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgaWYgKHZvZmYgPCAtIDB4ODAwMCB8fCB2b2ZmID49IDB4ODAwMCkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfc2lnbmVkXzE2IChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGJmZF9wdXRfc2lnbmVkXzMyIChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1VTRVM6Ci0JICAgICAgaXJlbC0+cl9hZGRlbmQgKz0gYWRqdXN0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlyZWwtPnJfb2Zmc2V0ID0gbnJhZGRyOwotICAgIH0KLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBvdGhlciBzZWN0aW9ucy4gIElmIHRoZXJlIGNvbnRhaW4gYW55IElNTTMyCi0gICAgIHJlbG9jcyBhZ2FpbnN0IGludGVybmFsIHN5bWJvbHMgd2hpY2ggd2UgYXJlIG5vdCBnb2luZyB0byBhZGp1c3QKLSAgICAgYmVsb3csIHdlIG1heSBuZWVkIHRvIGFkanVzdCB0aGUgYWRkZW5kcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbHNjYW4sICppcmVsc2NhbmVuZDsKLSAgICAgIGJmZF9ieXRlICpvY29udGVudHM7Ci0KLSAgICAgIGlmIChvID09IHNlYwotCSAgfHwgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICB8fCBvLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHJlbG9jcy4gIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzCi0gICAgICAgICBmYWxzZSwgd2Ugc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywgd2hlbiB3ZQotICAgICAgICAgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoYWJmZCwgbywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgIHRydWUpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG9jb250ZW50cyA9IE5VTEw7Ci0gICAgICBpcmVsc2NhbmVuZCA9IGludGVybmFsX3JlbG9jcyArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsc2NhbmVuZDsgaXJlbHNjYW4rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLQotCSAgLyogRHdhcmYgbGluZSBudW1iZXJzIHVzZSBSX1NIX1NXSVRDSDMyIHJlbG9jcy4gICovCi0JICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX1NXSVRDSDMyKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSB2b2ZmOwotCi0JICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCQkgICAgb2NvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB3ZSBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotCQkgICAgICBvY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8sIG9jb250ZW50cywKLQkJCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJCSAgICAgIG8tPl9yYXdfc2l6ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyA9IG9jb250ZW50czsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3RvcCA9IGlyZWxzY2FuLT5yX29mZnNldDsKLQkgICAgICBzdGFydAotCQk9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdG9wIC0gKGxvbmcpIGlyZWxzY2FuLT5yX2FkZGVuZCk7Ci0KLQkgICAgICAvKiBTVE9QIGlzIGluIGEgZGlmZmVyZW50IHNlY3Rpb24sIHNvIGl0IHdvbid0IGNoYW5nZS4gICovCi0JICAgICAgaWYgKHN0YXJ0ID4gYWRkciAmJiBzdGFydCA8IHRvYWRkcikKLQkJaXJlbHNjYW4tPnJfYWRkZW5kICs9IGNvdW50OwotCi0JICAgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICAgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyB2b2ZmKTsKLQotCSAgICAgIGlmIChzdGFydCA+IGFkZHIKLQkJICAmJiBzdGFydCA8IHRvYWRkcgotCQkgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCQliZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiArIGNvdW50LAotCQkJCSAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgICAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkJICAgICAgICYmIHN0b3AgPCB0b2FkZHIKLQkJICAgICAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JCWJmZF9wdXRfc2lnbmVkXzMyIChhYmZkLCB2b2ZmIC0gY291bnQsCi0JCQkJICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgfQotCi0JICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0RJUjMyKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKEVMRjMyX1JfU1lNIChpcmVsc2Nhbi0+cl9pbmZvKSA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICBjb250aW51ZTsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWxzY2FuLT5yX2luZm8pLAotCQkJCSAgICAmc3ltKTsKLQotCSAgaWYgKHN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgICAgICYmIChzeW0uc3RfdmFsdWUgPD0gYWRkcgotCQkgIHx8IHN5bS5zdF92YWx1ZSA+PSB0b2FkZHIpKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCXsKLQkJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCSAgICBvY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHM7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0JCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAotCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzID0gb2NvbnRlbnRzOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICAgIHZhbCArPSBzeW0uc3RfdmFsdWU7Ci0JICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwKLQkJCSAgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogU2VlIGlmIHdlIGNhbiBtb3ZlIHRoZSBBTElHTiByZWxvYyBmb3J3YXJkLiAgV2UgaGF2ZSBhZGp1c3RlZAotICAgICByX29mZnNldCBmb3IgaXQgYWxyZWFkeS4gICovCi0gIGlmIChpcmVsYWxpZ24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFsaWdudG8sIGFsaWduYWRkcjsKLQotICAgICAgYWxpZ250byA9IEJGRF9BTElHTiAodG9hZGRyLCAxIDw8IGlyZWxhbGlnbi0+cl9hZGRlbmQpOwotICAgICAgYWxpZ25hZGRyID0gQkZEX0FMSUdOIChpcmVsYWxpZ24tPnJfb2Zmc2V0LAotCQkJICAgICAxIDw8IGlyZWxhbGlnbi0+cl9hZGRlbmQpOwotICAgICAgaWYgKGFsaWdudG8gIT0gYWxpZ25hZGRyKQotCXsKLQkgIC8qIFRhaWwgcmVjdXJzaW9uLiAgKi8KLQkgIHJldHVybiBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFsaWduYWRkciwKLQkJCQkJICAgIGFsaWdudG8gLSBhbGlnbmFkZHIpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgZm9yIGxvYWRzIGFuZCBzdG9yZXMgd2hpY2ggd2UgY2FuIGFsaWduIHRvIGZvdXIgYnl0ZQotICAgYm91bmRhcmllcy4gIFRoaXMgaXMgbGlrZSBzaF9hbGlnbl9sb2FkcyBpbiBjb2ZmLXNoLmMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsIHBzd2FwcGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX3ZtYSAqbGFiZWxzID0gTlVMTDsKLSAgYmZkX3ZtYSAqbGFiZWwsICpsYWJlbF9lbmQ7Ci0KLSAgKnBzd2FwcGVkID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogR2V0IGFsbCB0aGUgYWRkcmVzc2VzIHdpdGggbGFiZWxzIG9uIHRoZW0uICAqLwotICBsYWJlbHMgPSAoYmZkX3ZtYSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChiZmRfdm1hKSk7Ci0gIGlmIChsYWJlbHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbGFiZWxfZW5kID0gbGFiZWxzOwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0xBQkVMKQotCXsKLQkgICpsYWJlbF9lbmQgPSBpcmVsLT5yX29mZnNldDsKLQkgICsrbGFiZWxfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTm90ZSB0aGF0IHRoZSBhc3NlbWJsZXIgY3VycmVudGx5IGFsd2F5cyBvdXRwdXRzIHJlbG9jcyBpbgotICAgICBhZGRyZXNzIG9yZGVyLiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gc29ydAotICAgICB0aGUgbGFiZWwgdmFsdWVzIGFuZCB0aGUgcmVsb2NzLiAgKi8KLQotICBsYWJlbCA9IGxhYmVsczsKLQotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0NPREUpCi0JY29udGludWU7Ci0KLSAgICAgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0KLSAgICAgIGZvciAoaXJlbCsrOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCWlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9EQVRBKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbCA8IGlyZWxlbmQpCi0Jc3RvcCA9IGlyZWwtPnJfb2Zmc2V0OwotICAgICAgZWxzZQotCXN0b3AgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICAgICAgaWYgKCEgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHNoX2VsZl9zd2FwX2luc25zLAotCQkJCSAgICAgKFBUUikgaW50ZXJuYWxfcmVsb2NzLCAmbGFiZWwsCi0JCQkJICAgICBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZyZWUgKGxhYmVscyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsYWJlbHMgIT0gTlVMTCkKLSAgICBmcmVlIChsYWJlbHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFN3YXAgdHdvIFNIIGluc3RydWN0aW9ucy4gIFRoaXMgaXMgbGlrZSBzaF9zd2FwX2luc25zIGluIGNvZmYtc2guYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfc3dhcF9pbnNucyAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiByZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIHJlbG9jczsKLSAgdW5zaWduZWQgc2hvcnQgaTEsIGkyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0KLSAgLyogU3dhcCB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICAqLwotICBpMSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGkyID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkyLCBjb250ZW50cyArIGFkZHIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMSwgY29udGVudHMgKyBhZGRyICsgMik7Ci0KLSAgLyogQWRqdXN0IGFsbCByZWxvYyBhZGRyZXNzZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgdHlwZTsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIHR5cGVzIG9mIHJlbG9jcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgIGFkanVzdC4gIFRoZXNlIHJlbG9jcyBkbyBub3QgYXBwbHkgdG8gdGhlIGluc3RydWN0aW9uIGl0c2VsZiwKLSAgICAgICAgIGJ1dCBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MuICAqLwotICAgICAgdHlwZSA9IChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAodHlwZSA9PSBSX1NIX0FMSUdOCi0JICB8fCB0eXBlID09IFJfU0hfQ09ERQotCSAgfHwgdHlwZSA9PSBSX1NIX0RBVEEKLQkgIHx8IHR5cGUgPT0gUl9TSF9MQUJFTCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgYW4gUl9TSF9VU0VTIHJlbG9jIHBvaW50cyB0byBvbmUgb2YgdGhlIGFkZHJlc3NlcyBiZWluZwotICAgICAgICAgc3dhcHBlZCwgd2UgbXVzdCBhZGp1c3QgaXQuICBJdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZG8gdGhpcwotICAgICAgICAgZm9yIGEganVtcCwgdGhvdWdoLCBzaW5jZSB3ZSB3YW50IHRvIGV4ZWN1dGUgYm90aAotICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBqdW1wLiAgKFdlIGhhdmUgYXZvaWRlZCBzd2FwcGluZwotICAgICAgICAgYXJvdW5kIGEgbGFiZWwsIHNvIHRoZSBqdW1wIHdpbGwgbm90IHdpbmQgdXAgZXhlY3V0aW5nIGFuCi0gICAgICAgICBpbnN0cnVjdGlvbiBpdCBzaG91bGRuJ3QpLiAgKi8KLSAgICAgIGlmICh0eXBlID09IFJfU0hfVVNFUykKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQotCSAgb2ZmID0gaXJlbC0+cl9vZmZzZXQgKyA0ICsgaXJlbC0+cl9hZGRlbmQ7Ci0JICBpZiAob2ZmID09IGFkZHIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0ICs9IDI7Ci0JICBlbHNlIGlmIChvZmYgPT0gYWRkciArIDIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0IC09IDI7Ci0JfQotCi0gICAgICBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gYWRkcikKLQl7Ci0JICBpcmVsLT5yX29mZnNldCArPSAyOwotCSAgYWRkID0gLTI7Ci0JfQotICAgICAgZWxzZSBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gYWRkciArIDIpCi0JewotCSAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKLQkgIGFkZCA9IDI7Ci0JfQotICAgICAgZWxzZQotCWFkZCA9IDA7Ci0KLSAgICAgIGlmIChhZGQgIT0gMCkKLQl7Ci0JICBiZmRfYnl0ZSAqbG9jOwotCSAgdW5zaWduZWQgc2hvcnQgaW5zbiwgb2luc247Ci0JICBib29sZWFuIG92ZXJmbG93OwotCi0JICBsb2MgPSBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0OwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BOOgotCSAgICBjYXNlIFJfU0hfRElSOFdQWjoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0lORDEyVzoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUEw6Ci0JICAgICAgLyogVGhpcyByZWxvYyBpZ25vcmVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCAzIGJpdHMgb2YKLSAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gY291bnRlciBiZWZvcmUgYWRkaW5nIGluIHRoZSBvZmZzZXQuCi0gICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBpZiBBRERSIGlzIGF0IGFuIGV2ZW4gYWRkcmVzcywgdGhlCi0gICAgICAgICAgICAgICAgIHN3YXAgd2lsbCBub3QgYWZmZWN0IHRoZSBvZmZzZXQuICBJZiBBRERSIGlzIGFuIGF0IGFuCi0gICAgICAgICAgICAgICAgIG9kZCBhZGRyZXNzLCB0aGVuIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyb3NzaW5nIGEKLSAgICAgICAgICAgICAgICAgZm91ciBieXRlIGJvdW5kYXJ5LCBhbmQgbXVzdCBiZSBhZGp1c3RlZC4gICovCi0JICAgICAgaWYgKChhZGRyICYgMykgIT0gMCkKLQkJewotCQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCQkgIG9pbnNuID0gaW5zbjsKLQkJICBpbnNuICs9IGFkZCAvIDI7Ci0JCSAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCQkgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVsb2NhdGUgYW4gU0ggRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfdm1hIGFkZGVuZCA9IChiZmRfdm1hKTA7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0gICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICAvKiBNYW55IG9mIHRoZSByZWxvY3MgYXJlIG9ubHkgdXNlZCBmb3IgcmVsYXhpbmcsIGFuZCBhcmUKLSAgICAgICAgIGhhbmRsZWQgZW50aXJlbHkgYnkgdGhlIHJlbGF4YXRpb24gY29kZS4gICovCi0gICAgICBpZiAocl90eXBlID4gKGludCkgUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgPCAwCi0JICB8fCByX3R5cGUgPj0gKGludCkgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgY2VydGFpbmx5IGluY29ycmVjdC4gIEhvd2V2ZXIsIGl0IGlzIGhvdyB0aGUKLSAgICAgICAgIENPRkYgbGlua2VyIHdvcmtzLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgIT0gKGludCkgUl9TSF9ESVIzMgotCSAgJiYgcl90eXBlICE9IChpbnQpIFJfU0hfSU5EMTJXKQotCWNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IHNoX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGZvciBhbiBpbnRlcm5hbCBJTkQxMlcKLSAgICAgICAgICAgICByZWxvY2F0aW9uLiAgRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIGhvdwotICAgICAgICAgICAgIHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotCSAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQkgICAgY29udGludWU7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgaG93IHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQlyZWxvY2F0aW9uIC09IDQ7Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWNhc2UgKGludClSX1NIX0RJUjMyOgotCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ09GRiByZWxvY3MgZG9uJ3QgdXNlIHRoZSBhZGRlbmQuIFRoZSBhZGRlbmQgaXMgdXNlZCBmb3IgUl9TSF9ESVIzMiAKLQkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGNvbXBpbGVycy4gKi8KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1zaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCWRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotCWZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0JZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLQlmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMCi0gICAgICAmJiBpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1zdGF0aWMgYXNlY3Rpb24gKgotc2hfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9TSF9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX1NIX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBzaC4gKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotIAotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1NIX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1NIX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9zaF92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItc2giCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9zaGxfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItc2hsIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfc2gKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9TSAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MQotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJc2hfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlzaF9lbGZfaW5mb190b19ob3d0bwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24Jc2hfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbglzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQkJCXNoX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgIHNoX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICBzaF9lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgIHNoX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXNwYXJjLmMgYi9iZmQvZWxmMzItc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5ZDI1Yi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OTAgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL3NwYXJjLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICplbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBlbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0MCi0vKiBUaGUgcmVsb2NhdGlvbiAiaG93dG8iIHRhYmxlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotcmVsb2NfaG93dG9fdHlwZSBfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QTFQzMiwgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QTFQzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVBMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19MT1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDMyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDMyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMCwgICAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEwIiwgICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTEsICAgICAgICAwLDIsMTEsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMSIsICAgICAgZmFsc2UsMCwweDAwMDAwN2ZmLHRydWUpLAotICAvKiBUaGVzZSBhcmUgZm9yIHNwYXJjNjQgaW4gYSA2NCBiaXQgZW52aXJvbm1lbnQuCi0gICAgIFZhbHVlcyBuZWVkIHRvIGJlIGhlcmUgYmVjYXVzZSB0aGUgdGFibGUgaXMgaW5kZXhlZCBieSByZWxvYyBudW1iZXIuICAqLwotICBIT1dUTyhSX1NQQVJDXzY0LCAgICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfT0xPMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISDIyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hNMTAsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ISDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ19ISDIyIiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hNMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENfTE0yMiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgLyogRW5kIHNwYXJjNjQgaW4gNjQgYml0IGVudmlyb25tZW50IHZhbHVlcy4KLSAgICAgVGhlIGZvbGxvd2luZyBhcmUgZm9yIHNwYXJjNjQgaW4gYSAzMiBiaXQgZW52aXJvbm1lbnQuICAqLwotICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVWMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVWMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLX07Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl9TUEFSQ19HTlVfVlRJTkhFUklULCAwLDIsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1NQQVJDX0dOVV9WVElOSEVSSVQiLCBmYWxzZSwwLCAwLCBmYWxzZSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfU1BBUkNfR05VX1ZURU5UUlksIDAsMiwwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwiUl9TUEFSQ19HTlVfVlRFTlRSWSIsIGZhbHNlLDAsMCwgZmFsc2UpOwotCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KLS8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLSAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAotICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAotICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKLSAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1JFVjMyLCBSX1NQQVJDX1JFVjMyIH0sCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfU1BBUkNfR05VX1ZUSU5IRVJJVH0sCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NQQVJDX0dOVV9WVEVOVFJZfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmZWxmMzJfc3BhcmNfdnRpbmhlcml0X2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgcmV0dXJuICZlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNwYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNwYXJjX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JICAgIHJldHVybiAmX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGVbKGludCkgc3BhcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgICAgICB9Ci0gICAgfQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBXZSBuZWVkIHRvIHVzZSBFTEYzMl9SX1RZUEUgc28gd2UgaGF2ZSBvdXIgb3duIGNvcHkgb2YgdGhpcyBmdW5jdGlvbiwKLSAgIGFuZCBlbGY2NC1zcGFyYy5jIGhhcyBpdHMgb3duIGNvcHkuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmMzJfc3BhcmNfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHN3aXRjaCAoRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKSkKLSAgICB7Ci0gICAgY2FzZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX3NwYXJjX3Z0aW5oZXJpdF9ob3d0bzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4X3N0ZCk7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJl9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRShkc3QtPnJfaW5mbyldOwotICAgIH0KLX0KLQwKLS8qIEZvciB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jIChhYmZkLAotCQkJICAgICByZWxvY19lbnRyeSwKLQkJCSAgICAgc3ltYm9sLAotCQkJICAgICBkYXRhLAotCQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICBvdXRwdXRfYmZkLAotCQkJICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotLyogSGFuZGxlIHRoZSBXRElTUDE2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MgKGFiZmQsCi0JCQkgcmVsb2NfZW50cnksCi0JCQkgc3ltYm9sLAotCQkJIGRhdGEsCi0JCQkgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLAotCQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSB4OwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUKLQkJKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0JKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLSAgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICB4IHw9ICgoKChyZWxvY2F0aW9uID4+IDIpICYgMHhjMDAwKSA8PCA2KQotCXwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAtIDB4NDAwMDAKLSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBTUEFSQyBFTEYgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xkLnNvLjEiCi0KLS8qIFRoZSBub3Agb3Bjb2RlIHdlIHVzZS4gICovCi0KLSNkZWZpbmUgU1BBUkNfTk9QIDB4MDEwMDAwMDAKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotCi0vKiBUaGUgZmlyc3QgZm91ciBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYXJlIHJlc2VydmVkLAotICAgYW5kIHRoZSBpbml0aWFsIGNvbnRlbnRzIGFyZSB1bmltcG9ydGFudCAod2UgemVybyB0aGVtIG91dCkuCi0gICBTdWJzZXF1ZW50IGVudHJpZXMgbG9vayBsaWtlIHRoaXMuICBTZWUgdGhlIFNWUjQgQUJJIFNQQVJDCi0gICBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLS8qIHNldGhpICVoaSguLS5wbHQwKSwlZzEuICBXZSBmaWxsIGluIHRoZSBhZGRyZXNzIGxhdGVyLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQwIDB4MDMwMDAwMDAKLS8qIGIsYSAucGx0MC4gIFdlIGZpbGwgaW4gdGhlIG9mZnNldCBsYXRlci4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMSAweDMwODAwMDAwCi0vKiBub3AuICAqLwotI2RlZmluZSBQTFRfRU5UUllfV09SRDIgU1BBUkNfTk9QCi0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0JCSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X29mZnNldHMgPSAoYmZkX3ZtYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCkgPSBsb2NhbF9nb3Rfb2Zmc2V0czsKLQkJICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCX0KLQkgICAgfQotCi0JICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQotCSAgLyogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlIHRoYW4gMHgxMDAwIGJ5dGVzLCB3ZSBhZGQKLQkgICAgIDB4MTAwMCB0byB0aGUgdmFsdWUgb2YgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBzbyB0aGF0IDEzCi0JICAgICBiaXQgcmVsb2NhdGlvbnMgaGF2ZSBhIGdyZWF0ZXIgY2hhbmNlIG9mIHdvcmtpbmcuICAqLwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+PSAweDEwMDAKLQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPT0gMCkKLQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID0gMHgxMDAwOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0Ci0gICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgU29sYXJpcyBuYXRpdmUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgYSBXUExUMzAKLSAgICAgICAgICAgICAgICAgcmVsb2MgZm9yIGEgbG9jYWwgc3ltYm9sIGlmIHlvdSBhc3NlbWJsZSBhIGNhbGwgZnJvbQotICAgICAgICAgICAgICAgICBvbmUgc2VjdGlvbiB0byBhbm90aGVyIHdoZW4gdXNpbmcgLUsgcGljLiAgV2UgdHJlYXQKLSAgICAgICAgICAgICAgICAgaXQgYXMgV0RJU1AzMC4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX05PTl9HT1RfUkVGOwotCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX05PTl9HT1RfUkVGOwotCi0JICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkKLSAgICAgICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzCi0gICAgICAgICAgICAgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlIGluY2x1ZGluZyBpbiB0aGUgbGluayAoaS5lLiwKLSAgICAgICAgICAgICBERUZfUkVHVUxBUiBpcyBzZXQpLiAgRklYTUU6IEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3QKLSAgICAgICAgICAgICBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQKLSAgICAgICAgICAgICBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQgd2lsbCBiZSBzZXQgbGF0ZXIgKGl0IGlzCi0gICAgICAgICAgICAgbmV2ZXIgY2xlYXJlZCkuICBUaGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgaW4KLSAgICAgICAgICAgICBlbGYzMi1pMzg2LmMuICAqLwotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8IChpbmZvLT5zeW1ib2xpYwotCQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfODoKLQljYXNlIFJfU1BBUkNfMTY6Ci0JY2FzZSBSX1NQQVJDXzMyOgotCWNhc2UgUl9TUEFSQ19ISTIyOgotCWNhc2UgUl9TUEFSQ18yMjoKLQljYXNlIFJfU1BBUkNfMTM6Ci0JY2FzZSBSX1NQQVJDX0xPMTA6Ci0JY2FzZSBSX1NQQVJDX1VBMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX05PTl9HT1RfUkVGOwotCi0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotICAgICAgICAgICAgICAgICByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGUgcmVsb2MuICAqLwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCi0JICBicmVhazsKLQotICAgICAgICBjYXNlIFJfU1BBUkNfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJfU1BBUkNfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9zcGFyY19nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotCi0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0KLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1NQQVJDX0dPVDEwOgotICAgICAgY2FzZSBSX1NQQVJDX0dPVDEzOgotICAgICAgY2FzZSBSX1NQQVJDX0dPVDIyOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+Z290LnJlZmNvdW50LS07Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPiAwKQotCSAgICAgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdLS07Ci0JICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFJfU1BBUkNfUExUMzI6Ci0gICAgICBjYXNlIFJfU1BBUkNfSElQTFQyMjoKLSAgICAgIGNhc2UgUl9TUEFSQ19MT1BMVDEwOgotICAgICAgY2FzZSBSX1NQQVJDX1BDUExUMzI6Ci0gICAgICBjYXNlIFJfU1BBUkNfUENQTFQxMDoKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQotCSAgICAgIGgtPnBsdC5yZWZjb3VudC0tOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlcgotICAgICAoYWx0aG91Z2ggd2UgY291bGQgYWN0dWFsbHkgZG8gaXQgaGVyZSkuICBUaGUgU1RUX05PVFlQRQotICAgICBjb25kaXRpb24gaXMgYSBoYWNrIHNwZWNpZmljYWxseSBmb3IgdGhlIE9yYWNsZSBsaWJyYXJpZXMKLSAgICAgZGVsaXZlcmVkIGZvciBTb2xhcmlzOyBmb3Igc29tZSBpbmV4cGxpY2FibGUgcmVhc29uLCB0aGV5IGRlZmluZQotICAgICBzb21lIG9mIHRoZWlyIGZ1bmN0aW9ucyBhcyBTVFRfTk9UWVBFIHdoZW4gdGhleSByZWFsbHkgc2hvdWxkIGJlCi0gICAgIFNUVF9GVU5DLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICB8fCAoKCFpbmZvLT5zaGFyZWQgfHwgaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBXUExUMzAgcmVsb2MgaW4gYW4gaW5wdXQKLQkgICAgIGZpbGUsIGJ1dCBub25lIG9mIHRoZSBpbnB1dCBmaWxlcyB3ZXJlIGR5bmFtaWMgb2JqZWN0cy4KLQkgICAgIE9yLCB3aGVuIGxpbmtpbmcgdGhlIG1haW4gYXBwbGljYXRpb24gb3IgYSAtQnN5bWJvbGljCi0JICAgICBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IFBJQyBjb2RlLiAgT3Igd2hlbiBhIGdsb2JhbCBzeW1ib2wKLQkgICAgIGhhcyBiZWVuIG1hZGUgcHJpdmF0ZSwgZS5nLiB2aWEgdmVyc2lvbmluZy4KLQotCSAgICAgSW4gdGhlc2UgY2FzZXMgd2Uga25vdyB3aGF0IHZhbHVlIHRoZSBzeW1ib2wgd2lsbCByZXNvbHZlCi0JICAgICB0bywgc28gd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZCBhIHByb2NlZHVyZSBsaW5rYWdlCi0JICAgICB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgV0RJU1AzMCByZWxvYyBpbnN0ZWFkLiAgKi8KLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogVGhlIGZpcnN0IGZvdXIgZW50cmllcyBpbiAucGx0IGFyZSByZXNlcnZlZC4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplID0gNCAqIFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaGFzIGEgbWF4aW11bSBzaXplLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gMHg0MDAwMDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0gICAgICAgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0gICAgICAgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLSAgICAgICBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotICAgICAgIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgIGlmICghIGluZm8tPnNoYXJlZAotCSYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICAgIHsKLQloLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCWgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0gICAgICB9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIHRoYXQgZG8gbm90IHVzZSB0aGUKLSAgICAgR09ULCB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgY29weSByZWxvYy4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX05PTl9HT1RfUkVGKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1NQQVJDX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIKLSAgICAgdG8gY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBib29sZWFuIHJlbHBsdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLQotICAgICAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIHRyYWlsaW5nIG5vcCBpbiAucGx0LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPiAwKQotCXMtPl9yYXdfc2l6ZSArPSA0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIHJlbHBsdCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKLQkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJcmVsdGV4dCA9IHRydWU7Ci0KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbGEucGx0IikgPT0gMCkKLQkJcmVscGx0ID0gdHJ1ZTsKLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgIT0gMAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuZ290IikgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVscGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhIFNQQVJDIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBiZmRfdm1hIGdvdF9iYXNlOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNwbHQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QgPT0gTlVMTCkKLSAgICBnb3RfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBnb3RfYmFzZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX0dOVV9WVElOSEVSSVQgCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfR05VX1ZURU5UUlkpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9TUEFSQ19tYXhfc3RkKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+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/IiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIHJfdHlwZSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0gICAgICAgICAgICAgICAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0gICAgICAgICAgICAgICAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChza2lwCi0JCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgfHwgRUxGMzJfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQotCQljb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocl90eXBlID09IFJfU1BBUkNfV0RJU1AxNikKLQl7Ci0JICBiZmRfdm1hIHg7Ci0KLQkgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgcmVsb2NhdGlvbiAtPSByZWwtPnJfb2Zmc2V0OwotCi0JICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQkJfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAotCSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0JICAgIHIgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICBlbHNlCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfU1BBUkNfUkVWMzIpCi0JewotCSAgYmZkX3ZtYSB4OwotCi0JICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0KLQkgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICB4ID0geCArIHJlbG9jYXRpb247Ci0JICBiZmRfcHV0bDMyICgvKmlucHV0X2JmZCwqLyB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgciA9IGJmZF9yZWxvY19vazsKLQl9Ci0gICAgICBlbHNlCi0JciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLSAgICAgICAgIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIFBMVF9FTlRSWV9XT1JEMCArIGgtPnBsdC5vZmZzZXQsCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKFBMVF9FTlRSWV9XT1JEMQotCQkgICArICgoKC0gKGgtPnBsdC5vZmZzZXQgKyA0KSkgPj4gMikgJiAweDNmZmZmZikpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0VOVFJZX1dPUkQyLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDgpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19KTVBfU0xPVCk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDQpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLSAgICAgICAgIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0dMT0JfREFUKTsKLQl9Ci0KLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfQ09QWSk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgcy0+Y29udGVudHMKLQkJCQkgICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotICBhc2VjdGlvbiAqc2dvdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBib29sZWFuIHNpemU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENsZWFyIHRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLAotCSBhbmQgcHV0IGEgbm9wIGluIHRoZSBsYXN0IGZvdXIgYnl0ZXMuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgbWVtc2V0IChzcGx0LT5jb250ZW50cywgMCwgNCAqIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX05PUCwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBzcGx0LT5fcmF3X3NpemUgLSA0KTsKLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JUExUX0VOVFJZX1NJWkU7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIGVfZmxhZ3MgZmllbGQuCi0KLSAgIFdlIGRvbid0IGRlZmluZSBzZXRfcHJpdmF0ZV9mbGFncyBvciBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgYmVjYXVzZQotICAgdGhlIG9ubHkgY3VycmVudGx5IGRlZmluZWQgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgYmZkIG1hY2ggbnVtYmVyLAotICAgc28gd2UgdXNlIHRoZSBsYXR0ZXIgaW5zdGVhZCBhbmQgZGVmZXIgc2V0dGluZyBlX2ZsYWdzIHVudGlsIHRoZQotICAgZmlsZSBpcyB3cml0dGVuIG91dC4gICovCi0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgYm9vbGVhbiBlcnJvcjsKLSAgLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBzdGF0aWMuICAqLwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2aW91c19pYmZkX2VfZmxhZ3MgPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVycm9yID0gZmFsc2U7Ci0KLSNpZiAwCi0gIC8qID8/PyBUaGUgbmF0aXZlIGxpbmtlciBkb2Vzbid0IGRvIHRoaXMgc28gd2UgY2FuJ3QgKG90aGVyd2lzZSBnY2Mgd291bGQKLSAgICAgaGF2ZSB0byBrbm93IHdoaWNoIGxpbmtlciBpcyBiZWluZyB1c2VkKS4gIEluc3RlYWQsIHRoZSBuYXRpdmUgbGlua2VyCi0gICAgIGJ1bXBzIHVwIHRoZSBhcmNoaXRlY3R1cmUgbGV2ZWwgd2hlbiBpdCBoYXMgdG8uICBIb3dldmVyLCBJIHN0aWxsIHRoaW5rCi0gICAgIHdhcm5pbmdzIGxpa2UgdGhlc2UgYXJlIGdvb2QsIHNvIGl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSB0aGVtIHR1cm5lZCBvbgotICAgICBieSBzb21lIG9wdGlvbi4gICovCi0KLSAgLyogSWYgdGhlIG91dHB1dCBtYWNoaW5lIGlzIG5vcm1hbCBzcGFyYywgd2UgY2FuJ3QgYWxsb3cgdjkgaW5wdXQgZmlsZXMuICAqLwotICBpZiAoYmZkX2dldF9tYWNoIChvYmZkKSA9PSBiZmRfbWFjaF9zcGFyYwotICAgICAgJiYgKGJmZF9nZXRfbWFjaCAoaWJmZCkgPT0gYmZkX21hY2hfc3BhcmNfdjhwbHVzCi0JICB8fCBiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpKQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICB9Ci0gIC8qIElmIHRoZSBvdXRwdXQgbWFjaGluZSBpcyB2OSwgd2UgY2FuJ3QgYWxsb3cgdjkrdmlzIGlucHV0IGZpbGVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPT0gYmZkX21hY2hfc3BhcmNfdjhwbHVzCi0gICAgICAmJiBiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpCi0gICAgewotICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXNhIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4cGx1cyIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotI2Vsc2UKLSAgaWYgKGJmZF9nZXRfbWFjaCAoaWJmZCkgPj0gYmZkX21hY2hfc3BhcmNfdjkpCi0gICAgewotICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSA2NCBiaXQgc3lzdGVtIGFuZCB0YXJnZXQgaXMgMzIgYml0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPCBiZmRfZ2V0X21hY2ggKGliZmQpKQotICAgIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfYXJjaF9zcGFyYywgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0jZW5kaWYKLQotICBpZiAoKChlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX0xFREFUQSkKLSAgICAgICAhPSBwcmV2aW91c19pYmZkX2VfZmxhZ3MpCi0gICAgICAmJiBwcmV2aW91c19pYmZkX2VfZmxhZ3MgIT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogbGlua2luZyBsaXR0bGUgZW5kaWFuIGZpbGVzIHdpdGggYmlnIGVuZGlhbiBmaWxlcyIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICBlcnJvciA9IHRydWU7Ci0gICAgfQotICBwcmV2aW91c19pYmZkX2VfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX0xFREFUQTsKLQotICBpZiAoZXJyb3IpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9PSBFTV9TUEFSQzMyUExVUykKLSAgICB7Ci0gICAgICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19TVU5fVVMxKQotCXJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywKLQkJCQkJICBiZmRfbWFjaF9zcGFyY192OHBsdXNhKTsKLSAgICAgIGVsc2UgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfMzJQTFVTKQotCXJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywKLQkJCQkJICBiZmRfbWFjaF9zcGFyY192OHBsdXMpOwotICAgICAgZWxzZQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfTEVEQVRBKQotICAgIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmMpOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IHRoZSBvYmplY3QgZmlsZS4KLSAgIFdlIG5lZWQgdG8gc2V0IHRoZSBlX21hY2hpbmUgZmllbGQgYXBwcm9wcmlhdGVseS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjIDoKLSAgICAgIGJyZWFrOyAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgOgotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX1NQQVJDMzJQTFVTOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX1NQQVJDXzMyUExVU19NQVNLOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfMzJQTFVTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXNhIDoKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9TUEFSQzMyUExVUzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9TUEFSQ18zMlBMVVNfTUFTSzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUyB8IEVGX1NQQVJDX1NVTl9VUzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSA6Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID0gRU1fU1BBUkM7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9TUEFSQ19MRURBVEE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmMzJfc3BhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmMzItc3BhcmMiCi0jZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgRU1fU1BBUkMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSBFTV9TUEFSQzMyUExVUwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgMHgxMDAwMAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCWVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCWVsZjMyX3NwYXJjX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQllbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgZWxmMzJfc3BhcmNfZ2Nfc3dlZXBfaG9vawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSA0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSAoNCpQTFRfRU5UUllfU0laRSkKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXY4NTAuYyBiL2JmZC9lbGYzMi12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWU1OTguLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXY4NTAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMzYgKzAsMCBAQAotLyogVjg1MC1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0KLS8qIFhYWCBGSVhNRTogVGhpcyBjb2RlIGlzIGxpdHRlcmVkIHdpdGggMzJiaXQgaW50LCAxNmJpdCBzaG9ydCwgOGJpdCBjaGFyCi0gICBkZXBlbmRlbmNpZXMuICBBcyBpcyB0aGUgZ2FzICYgc2ltdWxhdG9yIGNvZGUgb3IgdGhlIHY4NTAuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi92ODUwLmgiCi0KLS8qIHNpZ24tZXh0ZW5kIGEgMjQtYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUMjQoeCkJKCgoKHgpICYgMHhmZmZmZmYpIF4gKH4gMHg3ZmZmZmYpKSArIDB4ODAwMDAwKQotICAgICAgCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqdjg1MF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsYQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdjg1MF9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgaW50LCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIHJlbWVtYmVyX2hpMTZzX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKiBmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJmZF92bWEsCi0JICAgYmZkX3ZtYSwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCB2ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLQotLyogTm90ZTogSXQgaXMgUkVRVUlSRUQgdGhhdCB0aGUgJ3R5cGUnIHZhbHVlIG9mIGVhY2ggZW50cnkgaW4gdGhpcyBhcnJheQotICAgbWF0Y2ggdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgYXJyYXkuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgdjg1MF9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9OT05FLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX05PTkUiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBQQyByZWxhdGl2ZSA5IGJpdCBicmFuY2guICovCi0gIEhPV1RPIChSX1Y4NTBfOV9QQ1JFTCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF85X1BDUkVMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgMjIgYml0IGJyYW5jaC4gKi8KLSAgSE9XVE8gKFJfVjg1MF8yMl9QQ1JFTCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjIsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNywJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfMjJfUENSRUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZmZmODAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmZmY4MCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX1Y4NTBfSEkxNl9TLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9ISTE2X1MiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0hJMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0hJMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0xPMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0xPMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaW1wbGUgMzJiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9WODUwXzMyLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF8zMiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDE2Yml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF8xNiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDhiaXQgcmVsb2MuCSAqLwotICBIT1dUTyAoUl9WODUwXzgsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzgiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTUgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMSwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZSwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNSBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZSwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfNl84X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMSwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV82XzhfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2UsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4N2UsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzdfOF9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfN184X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzdfN19PRkZTRVQsCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDcsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfN183X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyISAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA1IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzRfNV9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfNF81X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDBmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDBmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV80XzRfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzRfNF9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUwMDIwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUwMDIwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX0NBTExUXzZfN19PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNywJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0NBTExUXzZfN19PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9WODUwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1Y4NTBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX1Y4NTBfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1Y4NTBfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBWODUwIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXAKLXsKLSAgLyogQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUIGlzIDI1OCwgd2hpY2ggd2lsbCBub3QgZml4IGluIGFuCi0gICAgIHVuc2lnbmVkIGNoYXIuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXAgdjg1MF9lbGZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLAkJUl9WODUwX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF85X1BDUkVMLAlSX1Y4NTBfOV9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMLAlSX1Y4NTBfMjJfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLAkJUl9WODUwX0hJMTZfUyB9LAotICB7IEJGRF9SRUxPQ19ISTE2LAkJUl9WODUwX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTE8xNiwJCVJfVjg1MF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLAkJUl9WODUwXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LAkJUl9WODUwXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzgsCQlSX1Y4NTBfOCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQsIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VULCBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQsIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQsICAgUl9WODUwX1REQV82XzhfT0ZGU0VUICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVCwgICBSX1Y4NTBfVERBXzdfOF9PRkZTRVQgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VULCAgIFJfVjg1MF9UREFfN183X09GRlNFVCAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCwgICAgICAgICBSX1Y4NTBfVERBXzRfNV9PRkZTRVQgICAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VULCAgICAgICAgIFJfVjg1MF9UREFfNF80X09GRlNFVCAgICAgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULCBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQsICAgICAgIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUICAgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULCAgICAgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCAgICAgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsICAgICAgICAgICAgICAgUl9WODUwX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgICAgICAgICAgICAgICAgUl9WODUwX0dOVV9WVEVOVFJZIH0sCi0KLX07Ci0KLQwKLS8qIE1hcCBhIGJmZCByZWxvY2F0aW9uIGludG8gdGhlIGFwcHJvcHJpYXRlIGhvd3RvIHN0cnVjdHVyZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotdjg1MF9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAodjg1MF9lbGZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IHY4NTBfZWxmX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmICh2ODUwX2VsZl9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXsKLQkgIEJGRF9BU1NFUlQgKHY4NTBfZWxmX2hvd3RvX3RhYmxlW3Y4NTBfZWxmX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXS50eXBlID09IHY4NTBfZWxmX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsKTsKLQkgIAotCSAgcmV0dXJuICYgdjg1MF9lbGZfaG93dG9fdGFibGVbdjg1MF9lbGZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQwKLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gVjg1MCBFTEYgcmVsb2MuICAqLwotc3RhdGljIHZvaWQKLXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqICAgICAgICAgICAgIGNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICogIGRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9WODUwX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmdjg1MF9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhIFY4NTAgRUxGIHJlbG9jICh0eXBlIFJFTEEpLiAqLwotc3RhdGljIHZvaWQKLXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiAgICAgICAgICAgICBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgICAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1Y4NTBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZ2ODUwX2VsZl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgcmVsb2NzOwotewotICBib29sZWFuIHJldCA9IHRydWU7Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgZW51bSB2ODUwX3JlbG9jX3R5cGUgcl90eXBlOwotICBpbnQgb3RoZXIgPSAwOwotICBjb25zdCBjaGFyICpjb21tb24gPSAoY29uc3QgY2hhciAqKTA7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInY4NTBfZWxmX2NoZWNrX3JlbG9jcyBjYWxsZWQgZm9yIHNlY3Rpb24gJXMgaW4gJXNcbiIsCi0JICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICByX3R5cGUgPSAoZW51bSB2ODUwX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBSX1Y4NTBfTk9ORToKLQljYXNlIFJfVjg1MF85X1BDUkVMOgotCWNhc2UgUl9WODUwXzIyX1BDUkVMOgotCWNhc2UgUl9WODUwX0hJMTZfUzoKLQljYXNlIFJfVjg1MF9ISTE2OgotCWNhc2UgUl9WODUwX0xPMTY6Ci0JY2FzZSBSX1Y4NTBfMzI6Ci0JY2FzZSBSX1Y4NTBfMTY6Ci0JY2FzZSBSX1Y4NTBfODoKLQljYXNlIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOgotCWNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKLQkgIGJyZWFrOwotCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0JY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLQljYXNlIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfU0RBOwotCSAgY29tbW9uID0gIi5zY29tbW9uIjsKLQkgIGdvdG8gc21hbGxfZGF0YV9jb21tb247Ci0JICAKLQljYXNlIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDoKLQkgIG90aGVyID0gVjg1MF9PVEhFUl9aREE7Ci0JICBjb21tb24gPSAiLnpjb21tb24iOwotCSAgZ290byBzbWFsbF9kYXRhX2NvbW1vbjsKLQkgIAotCWNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV82XzhfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV83XzhfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV83XzdfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfVERBOwotCSAgY29tbW9uID0gIi50Y29tbW9uIjsKLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0jZGVmaW5lIFY4NTBfT1RIRVJfTUFTSyAoVjg1MF9PVEhFUl9UREEgfCBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBKQotCi0Jc21hbGxfZGF0YV9jb21tb246Ci0JICBpZiAoaCkKLQkgICAgewotCSAgICAgIGgtPm90aGVyIHw9IG90aGVyOwkvKiBmbGFnIHdoaWNoIHR5cGUgb2YgcmVsb2NhdGlvbiB3YXMgdXNlZCAqLwotCSAgICAgIGlmICgoaC0+b3RoZXIgJiBWODUwX09USEVSX01BU0spICE9IChvdGhlciAmIFY4NTBfT1RIRVJfTUFTSykKLQkJICAmJiAoaC0+b3RoZXIgJiBWODUwX09USEVSX0VSUk9SKSA9PSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqIG1zZzsKLQkJICBzdGF0aWMgY2hhciAgYnVmZlsyMDBdOyAvKiBYWFggKi8KLQotCQkgIHN3aXRjaCAoaC0+b3RoZXIgJiBWODUwX09USEVSX01BU0spCi0JCSAgICB7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBvY2N1cHkgaW4gbXVsdGlwbGUgc21hbGwgZGF0YSByZWdpb25zIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2FuIG9ubHkgYmUgaW4gb25lIG9mIHRoZSBzbWFsbCwgemVybywgYW5kIHRpbnkgZGF0YSByZWdpb25zIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB6ZXJvIGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1REQToKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFY4NTBfT1RIRVJfWkRBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IGJlIGluIGJvdGggemVybyBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBzcHJpbnRmIChidWZmLCBtc2csIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkgIGluZm8tPmNhbGxiYWNrcy0+d2FybmluZyAoaW5mbywgYnVmZiwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJICAgIGFiZmQsIGgtPnJvb3QudS5kZWYuc2VjdGlvbiwgMCk7Ci0KLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBoLT5vdGhlciB8PSBWODUwX09USEVSX0VSUk9SOwotCQkgIHJldCA9IGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgaC0+cm9vdC51LmMucAotCSAgICAgICYmICFzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoLT5yb290LnUuYy5wLT5zZWN0aW9uKSwgIkNPTU1PTiIpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlY3Rpb24gPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBjb21tb24pOwotCSAgICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJ2ODUwX2VsZl9jaGVja19yZWxvY3MsIGZvdW5kICVzIHJlbG9jYXRpb24gZm9yICVzJXNcbiIsCi0JCSAgIHY4NTBfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLm5hbWUsCi0JCSAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iLAotCQkgICAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSA/ICIsIHN5bWJvbCBpcyBjb21tb24iIDogIiIpOwotI2VuZGlmCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBJbiB0aGUgb2xkIHZlcnNpb24sIHdoZW4gYW4gZW50cnkgd2FzIGNoZWNrZWQgb3V0IGZyb20gdGhlIHRhYmxlLAotICogaXQgd2FzIGRlbGV0ZWQuICBUaGlzIHByb2R1Y2VkIGFuIGVycm9yIGlmIHRoZSBlbnRyeSB3YXMgbmVlZGVkCi0gKiBtb3JlIHRoYW4gb25jZSwgYXMgdGhlIHNlY29uZCBhdHRlbXB0ZWQgcmV0cnkgZmFpbGVkLgotICoKLSAqIEluIHRoZSBjdXJyZW50IHZlcnNpb24sIHRoZSBlbnRyeSBpcyBub3QgZGVsZXRlZCwgaW5zdGVhZCB3ZSBzZXQKLSAqIHRoZSBmaWVsZCAnZm91bmQnIHRvIHRydWUuICBJZiBhIHNlY29uZCBsb29rdXAgbWF0Y2hlcyB0aGUgc2FtZQotICogZW50cnksIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBoaTE2cyByZWxvYyBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQKLSAqIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHVwZGF0ZWQgYSBzZWNvbmQgdGltZS4KLSAqCi0gKiBUT0RPIC0gVE9GSVg6IElmIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byByZXN0b3JlIDIgZGlmZmVyZW50Ci0gKiBhZGRyZXNzZXMgZnJvbSB0aGUgc2FtZSB0YWJsZSBlbnRyeSwgd2hlcmUgdGhlIGZpcnN0IGdlbmVyYXRlcyBhbgotICogb3ZlcmZsb3csIHdoaWxzdCB0aGUgc2Vjb25kIGRvIG5vdCwgdGhlbiB0aGlzIGNvZGUgd2lsbCBmYWlsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IGhpMTZzX2xvY2F0aW9uCi17Ci0gIGJmZF92bWEgICAgICAgYWRkZW5kOwotICBiZmRfYnl0ZSAqICAgIGFkZHJlc3M7Ci0gIHVuc2lnbmVkIGxvbmcgY291bnRlcjsKLSAgYm9vbGVhbiAgICAgICBmb3VuZDsKLSAgc3RydWN0IGhpMTZzX2xvY2F0aW9uICogbmV4dDsKLX0KLWhpMTZzX2xvY2F0aW9uOwotCi1zdGF0aWMgaGkxNnNfbG9jYXRpb24gKiAgcHJldmlvdXNfaGkxNnM7Ci1zdGF0aWMgaGkxNnNfbG9jYXRpb24gKiAgZnJlZV9oaTE2czsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICAgICBoaTE2c19jb3VudGVyOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfaGkxNnNfcmVsb2MgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcykKLSAgICAgYmZkICogICAgICBhYmZkOwotICAgICBiZmRfdm1hICAgIGFkZGVuZDsKLSAgICAgYmZkX2J5dGUgKiBhZGRyZXNzOwotewotICBoaTE2c19sb2NhdGlvbiAqIGVudHJ5ID0gTlVMTDsKLSAgCi0gIC8qIEZpbmQgYSBmcmVlIHN0cnVjdHVyZS4gICovCi0gIGlmIChmcmVlX2hpMTZzID09IE5VTEwpCi0gICAgZnJlZV9oaTE2cyA9IChoaTE2c19sb2NhdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKCogZnJlZV9oaTE2cykpOwotCi0gIGVudHJ5ICAgICAgPSBmcmVlX2hpMTZzOwotICBmcmVlX2hpMTZzID0gZnJlZV9oaTE2cy0+bmV4dDsKLSAgCi0gIGVudHJ5LT5hZGRlbmQgID0gYWRkZW5kOwotICBlbnRyeS0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGVudHJ5LT5jb3VudGVyID0gaGkxNnNfY291bnRlciArKzsKLSAgZW50cnktPmZvdW5kICAgPSBmYWxzZTsKLSAgZW50cnktPm5leHQgICAgPSBwcmV2aW91c19oaTE2czsKLSAgcHJldmlvdXNfaGkxNnMgPSBlbnRyeTsKLSAgCi0gIC8qIENvcGUgd2l0aCB3cmFwIGFyb3VuZCBvZiBvdXIgY291bnRlci4gICovCi0gIGlmIChoaTE2c19jb3VudGVyID09IDApCi0gICAgewotICAgICAgLyogWFhYIC0gQXNzdW1lIHRoYXQgYWxsIGNvdW50ZXIgZW50cmllcyBkaWZmZXIgb25seSBpbiB0aGVpciBsb3cgMTYgYml0cy4gICovCi0gICAgICBmb3IgKGVudHJ5ID0gcHJldmlvdXNfaGkxNnM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JZW50cnktPmNvdW50ZXIgJj0gMHhmZmZmOwotCi0gICAgICBoaTE2c19jb3VudGVyID0gMHgxMDAwMDsKLSAgICB9Ci0gIAotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1maW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MgKGFkZGVuZCwgYWxyZWFkeV9mb3VuZCkKLSAgICAgYmZkX3ZtYSAgIGFkZGVuZDsKLSAgICAgYm9vbGVhbiAqIGFscmVhZHlfZm91bmQ7Ci17Ci0gIGhpMTZzX2xvY2F0aW9uICogbWF0Y2ggPSBOVUxMOwotICBoaTE2c19sb2NhdGlvbiAqIGVudHJ5OwotICBoaTE2c19sb2NhdGlvbiAqIHByZXZpb3VzID0gTlVMTDsKLSAgaGkxNnNfbG9jYXRpb24gKiBwcmV2OwotICBiZmRfYnl0ZSAqICAgICAgIGFkZHI7Ci0gIAotICAvKiBTZWFyY2ggdGhlIHRhYmxlLiAgUmVjb3JkIHRoZSBtb3N0IHJlY2VudCBlbnRyeSB0aGF0IG1hdGNoZXMuICAqLwotICBmb3IgKGVudHJ5ID0gcHJldmlvdXNfaGkxNnM7IGVudHJ5OyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChlbnRyeS0+YWRkZW5kID09IGFkZGVuZAotCSAgJiYgKG1hdGNoID09IE5VTEwgfHwgbWF0Y2gtPmNvdW50ZXIgPCBlbnRyeS0+Y291bnRlcikpCi0JewotCSAgcHJldmlvdXMgPSBwcmV2OwotCSAgbWF0Y2ggICAgPSBlbnRyeTsKLQl9Ci0gICAgICAKLSAgICAgIHByZXYgPSBlbnRyeTsKLSAgICB9Ci0KLSAgaWYgKG1hdGNoID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogRXh0cmFjdCB0aGUgYWRkcmVzcy4gICovCi0gIGFkZHIgPSBtYXRjaC0+YWRkcmVzczsKLQotICAvKiBSZW1lYmVyIGlmIHRoaXMgZW50cnkgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGJlZm9yZS4gICovCi0gIGlmIChhbHJlYWR5X2ZvdW5kKQotICAgICogYWxyZWFkeV9mb3VuZCA9IG1hdGNoLT5mb3VuZDsKLQotICAvKiBOb3RlIHRoYXQgdGhpcyBlbnRyeSBoYXMgbm93IGJlZW4gdXNlZC4gICovCi0gIG1hdGNoLT5mb3VuZCA9IHRydWU7Ci0gIAotICByZXR1cm4gYWRkcjsKLX0gICAgIAotCi0vKiBGSVhNRTogIFRoZSBjb2RlIGhlcmUgcHJvYmFibHkgb3VnaHQgdG8gYmUgcmVtb3ZlZCBhbmQgdGhlIGNvZGUgaW4gcmVsb2MuYwotICAgYWxsb3dlZCB0byBkbyBpdHMgIHN0dWZmIGluc3RlYWQuICBBdCBsZWFzdCBmb3IgbW9zdCBvZiB0aGUgcmVsb2NzLCBhbnd5YXkuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uIChhYmZkLCByX3R5cGUsIGFkZGVuZCwgYWRkcmVzcykKLSAgICAgYmZkICogICAgICBhYmZkOwotICAgICBpbnQgICAgICAgIHJfdHlwZTsKLSAgICAgYmZkX3ZtYSAgICBhZGRlbmQ7Ci0gICAgIGJmZF9ieXRlICogYWRkcmVzczsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfc2lnbmVkX3ZtYSBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gIAotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIGZwcmludGYgKHN0ZGVyciwgInJlbG9jIHR5cGUgJWQgbm90IFNVUFBPUlRFRFxuIiwgcl90eXBlICk7ICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzMyOgotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF8yMl9QQ1JFTDoKLSAgICAgIGlmIChzYWRkZW5kID4gMHgxZmZmZmYgfHwgc2FkZGVuZCA8IC0weDIwMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoKGFkZGVuZCAlIDIpICE9IDApCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBpbnNuICY9IH4weGZmZmUwMDNmOwotICAgICAgaW5zbiB8PSAoKChhZGRlbmQgJiAweGZmZmUpIDw8IDE2KSB8ICgoYWRkZW5kICYgMHgzZjAwMDApID4+IDE2KSk7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF85X1BDUkVMOgotICAgICAgaWYgKHNhZGRlbmQgPiAweGZmIHx8IHNhZGRlbmQgPCAtMHgxMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKChhZGRlbmQgJSAyKSAhPSAwKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgaW5zbiAmPSB+IDB4Zjg3MDsKLSAgICAgIGluc24gfD0gKChhZGRlbmQgJiAweDFmMCkgPDwgNykgfCAoKGFkZGVuZCAmIDB4MGUpIDw8IDMpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9ISTE2OgotICAgICAgYWRkZW5kICs9IChiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKSA8PCAxNik7Ci0gICAgICBhZGRlbmQgPSAoYWRkZW5kID4+IDE2KTsKLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0hJMTZfUzoKLSAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIHRoaXMgcmVsb2NhdGlvbiB0b29rIHBsYWNlLiAgKi8KLSAgICAgIHJlbWVtYmVyX2hpMTZzX3JlbG9jIChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpOwotCi0gICAgICBhZGRlbmQgKz0gKGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpIDw8IDE2KTsKLSAgICAgIGFkZGVuZCA9IChhZGRlbmQgPj4gMTYpICsgKChhZGRlbmQgJiAweDgwMDApICE9IDApOwotICAgICAgCi0gICAgICAvKiBUaGlzIHJlbG9jYXRpb24gY2Fubm90IG92ZXJmbG93LiAqLwotICAgICAgaWYgKGFkZGVuZCA+IDB4N2ZmZikKLQlhZGRlbmQgPSAwOwotICAgICAgCi0gICAgICBpbnNuID0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9MTzE2OgotICAgICAgLyogQ2FsY3VsYXRlIHRoZSBzdW0gb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHRoZQotCSBhZGRlbmQgYW5kIGNoZWNrIGZvciBvdmVyZmxvdyBmcm9tIHRoZSBsb3cgMTYgYml0cyBpbnRvIHRoZSBoaWdoCi0JIDE2IGJpdHMuICBUaGUgYXNzZW1ibGVyIGhhcyBhbHJlYWR5IGRvbmUgc29tZSBvZiB0aGlzOiAgSWYgdGhlCi0JIHZhbHVlIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGl0cyAxNXRoIGJpdCBzZXQsIChjb3VudGluZwotCSBmcm9tIHplcm8pIHRoZW4gdGhlIGFzc2VtYmxlciB3aWxsIGhhdmUgYWRkZWQgMSB0byB0aGUgdmFsdWUKLQkgc3RvcmVkIGluIHRoZSBhc3NvY2lhdGVkIEhJMTZTIHJlbG9jLiAgU28gZm9yIGV4YW1wbGUsIHRoZXNlCi0JIHJlbG9jYXRpb25zOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCApLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkICksIHIxLCByMQotCi0JIHdpbGwgc3RvcmUgMCBpbiB0aGUgdmFsdWUgZmllbGRzIGZvciB0aGUgTU9WSEkgYW5kIE1PVkVBIGluc3RydWN0aW9ucwotCSBhbmQgYWRkZW5kIHdpbGwgYmUgdGhlIGFkZHJlc3Mgb2YgZnJlZCwgYnV0IGZvciB0aGVzZSBpbnN0cnVjdGlvbnM6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMjM0NTYpLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMjM0NTYpLCByMSwgcjEKLQotCSB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNT1ZISSBpbnN0cnVjdGlvbiB3aWxsIGJlIDB4MTIgYW5kIHRoZSB2YWx1ZQotCSBzdG9yZWQgaW4gdGhlIE1PVkVBIGluc3RydWN0aW9uIHdpbGwgYmUgMHgzNDU2LiAgSWYgaG93ZXZlciB0aGUKLQkgaW5zdHJ1Y3Rpb25zIHdlcmU6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMGZmZmYpLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMGZmZmYpLCByMSwgcjEKLQotCSB0aGVuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1PVkhJIGluc3RydWN0aW9uIHdvdWxkIGJlIDB4MTEgKG5vdAotCSAweDEwKSBhbmQgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24gd291bGQgYmUgMHhmZmZmLgotCSBUaHVzIChhc3N1bWluZyBmb3IgdGhlIG1vbWVudCB0aGF0IHRoZSBhZGRlbmQgaXMgMCksIGF0IHJ1biB0aW1lIHRoZQotCSBNT1ZISSBpbnN0cnVjdGlvbiBsb2FkcyAweDExMDAwMCBpbnRvIHIxLCB0aGVuIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbgotCSBhZGRzIDB4ZmZmZmZmZmYgKHNpZ24gZXh0ZW5zaW9uISkgcHJvZHVjaW5nIDB4MTBmZmZmLiAgU2ltaWxhcmx5IGlmCi0JIHRoZSBpbnN0cnVjdGlvbnMgd2VyZToKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgLSAxKSwgcjAsIHIxCi0JICAgICBtb3ZlYSBsbyggZnJlZCAtIDEpLCByMSwgcjEKLQotCSB0aGVuIDAgaXMgc3RvcmVkIGluIHRoZSBNT1ZISSBpbnN0cnVjdGlvbiBhbmQgLTEgaXMgc3RvcmVkIGluIHRoZQotCSBNT1ZFQSBpbnN0cnVjdGlvbi4KLQotCSBPdmVyZmxvdyBjYW4gb2NjdXIgaWYgdGhlIGFkZGl0aW9uIG9mIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlCi0JIGluc3RydWN0aW9uIHBsdXMgdGhlIGFkZGVuZCBzZXRzIHRoZSAxNXRoIGJpdCB3aGVuIGJlZm9yZSBpdCB3YXMgY2xlYXIuCi0JIFRoaXMgaXMgYmVjYXVzZSB0aGUgMTV0aCBiaXQgd2lsbCBiZSBzaWduIGV4dGVuZGVkIGludG8gdGhlIGhpZ2ggcGFydCwKLQkgdGh1cyByZWR1Y2luZyBpdHMgdmFsdWUgYnkgb25lLCBidXQgc2luY2UgdGhlIDE1dGggYml0IHdhcyBvcmlnaW5hbGx5Ci0JIGNsZWFyLCB0aGUgYXNzZW1ibGVyIHdpbGwgbm90IGhhdmUgYWRkZWQgMSB0byB0aGUgcHJldmlvdXMgSEkxNlMgcmVsb2MKLQkgdG8gY29tcGVuc2F0ZSBmb3IgdGhpcyBlZmZlY3QuICBGb3IgZXhhbXBsZToKLQotCSAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTIzNDU2KSwgcjAsIHIxCi0JICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMjM0NTYpLCByMSwgcjEKLQotCSBUaGUgdmFsdWUgc3RvcmVkIGluIEhJMTZTIHJlbG9jIGlzIDB4MTIsIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIExPMTYKLQkgcmVsb2MgaXMgMHgzNDU2LiAgSWYgd2UgYXNzdW1lIHRoYXQgdGhlIGFkZHJlc3Mgb2YgZnJlZCBpcyAweDAwMDA3MDAwCi0JIHRoZW4gdGhlIHJlbG9jYXRpb25zIGJlY29tZToKLQotCSAgIEhJMTZTOiAweDAwMTIgKyAoMHgwMDAwNzAwMCA+PiAxNikgICAgPSAweDEyCi0JICAgTE8xNjogIDB4MzQ1NiArICgweDAwMDA3MDAwICYgMHhmZmZmKSA9IDB4YTQ1NgotCi0JIGJ1dCB3aGVuIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGV4ZWN1dGVkLCB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24ncyB2YWx1ZQotCSBpcyBzaWduZWQgZXh0ZW5kZWQsIHNvIHRoZSBzdW0gYmVjb21lczoKLQotCSAgICAgIDB4MDAxMjAwMDAKLQkgICAgKyAweGZmZmZhNDU2Ci0JICAgIC0tLS0tLS0tLS0tLQotCSAgICAgIDB4MDAxMWE0NTYgICAgYnV0ICdmcmVkICsgMHgxMjM0NTYnID0gMHgwMDEyYTQ1NgotCi0JIE5vdGUgdGhhdCBpZiB0aGUgMTV0aCBiaXQgd2FzIHNldCBpbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBMTzE2Ci0JIHJlbG9jLCB0aGVuIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGFueXRoaW5nOgotCi0JICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMGZmZmYpLCByMCwgcjEKLQkgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEwZmZmZiksIHIxLCByMQotCi0JICAgIEhJMTZTOiAgMHgwMDExICsgKDB4MDAwMDcwMDAgPj4gMTYpICAgID0gMHgxMQotCSAgICBMTzE2OiAgIDB4ZmZmZiArICgweDAwMDA3MDAwICYgMHhmZmZmKSA9IDB4NmZmZgotCi0JICAgICAgMHgwMDExMDAwMAotCSAgICArIDB4MDAwMDZmZmYKLQkgICAgLS0tLS0tLS0tLS0tCi0JICAgICAgMHgwMDExNmZmZiAgPSBmcmVkICsgMHgxMGZmZmYgPSAweDcwMDAgKyAweDEwZmZmZgotCi0JIAotCSBPdmVyZmxvdyBjYW4gYWxzbyBvY2N1ciBpZiB0aGUgY29tcHV0YXRpb24gY2FycmllcyBpbnRvIHRoZSAxNnRoIGJpdAotCSBhbmQgaXQgYWxzbyByZXN1bHRzIGluIHRoZSAxNXRoIGJpdCBoYXZpbmcgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIDE1dGgKLQkgYml0IG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4gICBXaGF0IGhhcHBlbnMgaXMgdGhhdCB0aGUgSEkxNlMgcmVsb2MKLQkgd2lsbCBoYXZlIGFscmVhZHkgZXhhbWluZWQgdGhlIDE1dGggYml0IG9mIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbmQKLQkgYWRkZWQgMSB0byB0aGUgaGlnaCBwYXJ0IGlmIHRoZSBiaXQgaXMgc2V0LiAgVGhpcyBjb21wZW5zYXRlcyBmb3IgdGhlCi0JIHNpZ24gZXh0ZW5zaW9uIG9mIDE1dGggYml0IG9mIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiAgQnV0IG5vdwotCSB0aGVyZSBpcyBhIGNhcnJ5IGludG8gdGhlIDE2dGggYml0LCBhbmQgdGhpcyBoYXMgbm90IGJlZW4gYWxsb3dlZCBmb3IuCi0KLQkgU28sIGZvciBleGFtcGxlIGlmIGZyZWQgaXMgYXQgYWRkcmVzcyAweGYwMDA6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4ZmZmZiksIHIwLCByMSAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgc2V0XQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHhmZmZmKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAxICsgKDB4MDAwMGYwMDAgPj4gMTYpICAgID0gMHgwMDAxCi0JICAgTE8xNjogIDB4ZmZmZiArICgweDAwMDBmMDAwICYgMHhmZmZmKSA9IDB4ZWZmZiAgIChjYXJyeSBpbnRvIGJpdCAxNiBpcyBsb3N0KQotCi0JICAgICAweDAwMDEwMDAwCi0JICAgKyAweGZmZmZlZmZmCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDBlZmZmICAgYnV0ICdmcmVkICsgMHhmZmZmJyA9IDB4MDAwMWVmZmYKLQotCSBTaW1pbGFybHksIGlmIHRoZSAxNXRoIGJpdCByZW1haW5zIGNsZWFyLCBidXQgb3ZlcmZsb3cgb2NjdXJzIGludG8KLQkgdGhlIDE2dGggYml0IHRoZW4gKGFzc3VtaW5nIHRoZSBhZGRyZXNzIG9mIGZyZWQgaXMgMHhmMDAwKToKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHg3MDAwKSwgcjAsIHIxICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBjbGVhcl0KLQkgICBtb3ZlYSBsbyggZnJlZCArIDB4NzAwMCksIHIxLCByMQotCi0JICAgSEkxNlM6IDB4MDAwMCArICgweDAwMDBmMDAwID4+IDE2KSAgICA9IDB4MDAwMAotCSAgIExPMTY6ICAweDcwMDAgKyAoMHgwMDAwZjAwMCAmIDB4ZmZmZikgPSAweDZmZmYgIChjYXJyeSBpbnRvIGJpdCAxNiBpcyBsb3N0KQotCi0JICAgICAweDAwMDAwMDAwCi0JICAgKyAweDAwMDA2ZmZmCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDA2ZmZmICAgYnV0ICdmcmVkICsgMHg3MDAwJyA9IDB4MDAwMTZmZmYKLQkgICAKLQkgTm90ZSAtIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGlmIGEgY2Fycnkgb2NjdXJzLCBhbmQgdGhlCi0JIDE1dGggYml0IGNoYW5nZXMgaXRzIHZhbHVlIGZyb20gYmVpbmcgc2V0IHRvIGJlaW5nIGNsZWFyLCBhcyB0aGUgSEkxNlMKLQkgcmVsb2Mgd2lsbCBoYXZlIGFscmVhZHkgYWRkZWQgaW4gMSB0byB0aGUgaGlnaCBwYXJ0IGZvciB1czoKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHhmZmZmKSwgcjAsIHIxICAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgc2V0XQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHhmZmZmKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAxICsgKDB4MDAwMDcwMDAgPj4gMTYpCi0JICAgTE8xNjogIDB4ZmZmZiArICgweDAwMDA3MDAwICYgMHhmZmZmKSA9IDB4NmZmZiAgKGNhcnJ5IGludG8gYml0IDE2IGlzIGxvc3QpCi0KLQkgICAgIDB4MDAwMTAwMDAKLQkgICArIDB4MDAwMDZmZmYgICAoYml0IDE1IG5vdCBzZXQsIHNvIHRoZSB0b3AgaGFsZiBpcyB6ZXJvKQotCSAgIC0tLS0tLS0tLS0tLQotCSAgICAgMHgwMDAxNmZmZiAgIHdoaWNoIGlzIHJpZ2h0IChhc3N1bWluZyB0aGF0IGZyZWQgaXMgYXQgMHg3MDAwKQotCi0JIGJ1dCBpZiB0aGUgMTV0aCBiaXQgZ29lcyBmcm9tIGJlaW5nIGNsZWFyIHRvIGJlaW5nIHNldCwgdGhlbiB3ZSBtdXN0Ci0JIG9uY2UgYWdhaW4gaGFuZGxlIG92ZXJmbG93OgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweDcwMDApLCByMCwgcjEgICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBjbGVhcl0KLQkgICBtb3ZlYSBsbyggZnJlZCArIDB4NzAwMCksIHIxLCByMQotCi0JICAgSEkxNlM6IDB4MDAwMCArICgweDAwMDBmZmZmID4+IDE2KQotCSAgIExPMTY6ICAweDcwMDAgKyAoMHgwMDAwZmZmZiAmIDB4ZmZmZikgPSAweDZmZmYgIChjYXJyeSBpbnRvIGJpdCAxNikKLQotCSAgICAgMHgwMDAwMDAwMAotCSAgICsgMHgwMDAwNmZmZiAgIChiaXQgMTUgbm90IHNldCwgc28gdGhlIHRvcCBoYWxmIGlzIHplcm8pCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDA2ZmZmICAgd2hpY2ggaXMgd3JvbmcgKGFzc3VtaW5nIHRoYXQgZnJlZCBpcyBhdCAweGZmZmYpCi0JICovCi0KLSAgICAgIHsKLQlsb25nIHJlc3VsdDsKLQotCWluc24gICA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotCXJlc3VsdCA9IGluc24gKyBhZGRlbmQ7Ci0KLSNkZWZpbmUgQklUMTVfU0VUKHgpICgoeCkgJiAweDgwMDApCi0jZGVmaW5lIE9WRVJGTE9XUyhhLGkpICgoKChhKSAmIDB4ZmZmZikgKyAoaSkpID4gMHhmZmZmKQotCQotCWlmICgoQklUMTVfU0VUIChyZXN1bHQpICYmICEgQklUMTVfU0VUIChhZGRlbmQpKQotCSAgICB8fCAoT1ZFUkZMT1dTIChhZGRlbmQsIGluc24pCi0JCSYmICgoISBCSVQxNV9TRVQgKGluc24pKSB8fCAoQklUMTVfU0VUIChhZGRlbmQpKSkpKQotCSAgewotCSAgICBib29sZWFuIGFscmVhZHlfdXBkYXRlZDsKLQkgICAgYmZkX2J5dGUgKiBoaTE2c19hZGRyZXNzID0gZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jCi0JICAgICAgKGFkZGVuZCwgJiBhbHJlYWR5X3VwZGF0ZWQpOwotCSAgICAKLQkgICAgLyogQW1lbmQgdGhlIG1hdGNoaW5nIEhJMTZfUyByZWxvY2F0aW9uLiAgKi8KLQkgICAgaWYgKGhpMTZzX2FkZHJlc3MgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmICghIGFscmVhZHlfdXBkYXRlZCkKLQkJICB7Ci0JCSAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgaGkxNnNfYWRkcmVzcyk7Ci0JCSAgICBpbnNuICs9IDE7Ci0JCSAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaTE2c19hZGRyZXNzKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlmcHJpbnRmIChzdGRlcnIsIF8oIkZBSUxFRCB0byBmaW5kIHByZXZpb3VzIEhJMTYgcmVsb2NcbiIpKTsKLQkJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgICAgICB9Ci0JICB9Ci0JCi0JLyogRG8gbm90IGNvbXBsYWluIGlmIHZhbHVlIGhhcyB0b3AgYml0IHNldCwgYXMgdGhpcyBoYXMgYmVlbiBhbnRpY2lwYXRlZC4gICovCi0JaW5zbiA9IHJlc3VsdCAmIDB4ZmZmZjsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9WODUwXzg6Ci0gICAgICBhZGRlbmQgKz0gKGNoYXIpIGJmZF9nZXRfOCAoYWJmZCwgYWRkcmVzcyk7Ci0KLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmIHx8IHNhZGRlbmQgPCAtMHg4MCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIGFkZGVuZCwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOgotICAgICAgYWRkZW5kICs9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmZmZmIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzE2OgotCi0gICAgICAvKiBkcm9wIHRocm91Z2ggKi8gICAgICAgICAgICAKLSAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVDoKLSAgICAgIGFkZGVuZCArPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2ZmZiB8fCBzYWRkZW5kIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpbnNuID0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKGluc24gJiAweGZmZmUpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZmZlIHx8IHNhZGRlbmQgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAxKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiA9IChhZGRlbmQgJiB+MSkgfCAoaW5zbiAmIDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfNl84X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweDdlKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmMgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDMpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZjgxOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfN184X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweDdmKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmUgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZjgwOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfN183X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSBpbnNuICYgMHg3ZjsKLQkKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZjgwOwotICAgICAgaW5zbiB8PSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4ZikgPDwgMSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDFlIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAxKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmZmMDsKLSAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNF9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gaW5zbiAmIDB4ZjsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZiB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmZmMDsKLSAgICAgIGluc24gfD0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZlMDAwMCkgPj4gMTYpICsgKChpbnNuICYgMHgyMCkgPj4gNSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmZmYgfHwgc2FkZGVuZCA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweDAwMDFmZmRmOwotICAgICAgaW5zbiB8PSAoYWRkZW5kICYgMSkgPDwgNTsKLSAgICAgIGluc24gfD0gKGFkZGVuZCAmIH4xKSA8PCAxNjsKLSAgICAgIAotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweDNmKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2UgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZjgwOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIH0KLQotICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBhZGRyZXNzKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotDAotLyogSW5zZXJ0IHRoZSBhZGRlbmQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdjg1MF9lbGZfcmVsb2MgKGFiZmQsIHJlbG9jLCBzeW1ib2wsIGRhdGEsIGlzZWN0aW9uLCBvYmZkLCBlcnIpCi0gICAgIGJmZCAqICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqICAgcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiAgIHN5bWJvbDsKLSAgICAgUFRSICAgICAgICAgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqICBpc2VjdGlvbjsKLSAgICAgYmZkICogICAgICAgb2JmZDsKLSAgICAgY2hhciAqKiAgICAgZXJyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbjsKLSAgCi0gIC8qIElmIHRoZXJlIGlzIGFuIG91dHB1dCBCRkQsCi0gICAgIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBhIHNlY3Rpb24gbmFtZSAod2hpY2ggaXMgb25seSBkZWZpbmVkIGF0IGZpbmFsIGxpbmsgdGltZSksCi0gICAgIGFuZCBlaXRoZXIgd2UgYXJlIG5vdCBwdXR0aW5nIHRoZSBhZGRlbmQgaW50byB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgICAgIG9yIHRoZSBhZGRlbmQgaXMgemVybywgc28gdGhlcmUgaXMgbm90aGluZyB0byBhZGQgaW50byB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgdGhlbiBqdXN0IGZpeHVwIHRoZSBhZGRyZXNzIGFuZCByZXR1cm4uICAqLwotICBpZiAob2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvYy0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2MtPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvYy0+YWRkcmVzcyArPSBpc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotI2lmIDAgIAotICBlbHNlIGlmIChvYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgCi0gIC8qIENhdGNoIHJlbG9jcyBpbnZvbHZpbmcgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogV2UgaGFuZGxlIGZpbmFsIGxpbmtpbmcgb2Ygc29tZSByZWxvY3Mgb3Vyc2VsdmVzLiAgKi8KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jLT5hZGRyZXNzID4gaXNlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gIAotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLSAgCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotICAKLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZSArIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvYy0+YWRkZW5kOwotICAKLSAgaWYgKHJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotCSBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIAotICAgICAgLyogRGVhbCB3aXRoIHBjcmVsX29mZnNldCAqLwotICAgICAgcmVsb2NhdGlvbiAtPSByZWxvYy0+YWRkcmVzczsKLSAgICB9Ci0KLSAgcmVsb2MtPmFkZGVuZCA9IHJlbG9jYXRpb247CQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqICBuYW1lOwotewotICByZXR1cm4gKCAgIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAnTCcgfHwgbmFtZVsxXSA9PSAnLicpKQotCSAgfHwgKG5hbWVbMF0gPT0gJ18nICYmICBuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09ICdMJyAmJiBuYW1lWzNdID09ICdfJykpOwotfQotCi0MCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgICAgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgaG93dG87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgICBjb250ZW50czsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgb2Zmc2V0OwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICB2YWx1ZTsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgYWRkZW5kOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICBpbmZvOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICBzeW1fc2VjOwotICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpc19sb2NhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nICByX3R5cGUgICA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqICAgICBoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OwotCi0gIC8qIEFkanVzdCB0aGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9WODUwXzlfUENSRUw6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBSX1Y4NTBfMjJfUENSRUw6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJKyBvZmZzZXQpOwotCi0gICAgICAvKiBJZiB0aGUgc2lnbiBleHRlbnNpb24gd2lsbCBjb3JydXB0IHRoZSB2YWx1ZSB0aGVuIHdlIGhhdmUgb3ZlcmZsb3dlZC4gICovCi0gICAgICBpZiAoKCh2YWx1ZSAmIDB4ZmYwMDAwMDApICE9IDB4MCkgJiYgKCh2YWx1ZSAmIDB4ZmYwMDAwMDApICE9IDB4ZmYwMDAwMDApKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIHZhbHVlID0gU0VYVDI0ICh2YWx1ZSk7ICAvKiBPbmx5IHRoZSBib3R0b20gMjQgYml0cyBvZiB0aGUgUEMgYXJlIHZhbGlkICovCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0hJMTZfUzoKLSAgICBjYXNlIFJfVjg1MF9ISTE2OgotICAgIGNhc2UgUl9WODUwX0xPMTY6Ci0gICAgY2FzZSBSX1Y4NTBfMTY6Ci0gICAgY2FzZSBSX1Y4NTBfMzI6Ci0gICAgY2FzZSBSX1Y4NTBfODoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDoJCi0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotICAgICAgaWYgKHN5bV9zZWMgPT0gTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQkgIAotICAgICAgdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBncDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLQlpZiAoc3ltX3NlYyA9PSBOVUxMKQotCSAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0JICAKLQkvKiBHZXQgdGhlIHZhbHVlIG9mIF9fZ3AuICAqLwotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKLQotCWdwID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCXZhbHVlIC09IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JdmFsdWUgLT0gKGdwIC0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9UREFfNF80X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfNF81X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV83XzdfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV83XzhfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV82XzhfT0ZGU0VUOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgZXA7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCQotCS8qIEdldCB0aGUgdmFsdWUgb2YgX19lcC4gICovCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX19lcCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOyAgLyogQWN0dWFsbHkgdGhpcyBpbmRpY2F0ZXMgdGhhdCBfX2VwIGNvdWxkIG5vdCBiZSBmb3VuZC4gKi8KLQotCWVwID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCXZhbHVlIC09IGVwOwotICAgICAgfQotICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgUl9WODUwX0NBTExUXzZfN19PRkZTRVQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBjdGJwOwotCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQkKLQkvKiBHZXQgdGhlIHZhbHVlIG9mIF9fY3RicC4gICovCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX19jdGJwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiAoYmZkX3JlbG9jX2Rhbmdlcm91cyArIDEpOyAgLyogQWN0dWFsbHkgdGhpcyBpbmRpY2F0ZXMgdGhhdCBfX2N0YnAgY291bGQgbm90IGJlIGZvdW5kLiAqLwotCi0JY3RicCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JdmFsdWUgLT0gY3RicDsKLSAgICAgIH0KLSAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBjdGJwOwotCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQotCWlmIChzeW1fc2VjID09IE5VTEwpCi0JICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQkgIAotCS8qIEdldCB0aGUgdmFsdWUgb2YgX19jdGJwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2N0YnAiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk7Ci0KLQljdGJwID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCXZhbHVlIC09IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JdmFsdWUgLT0gKGN0YnAgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIH0KLSAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX05PTkU6Ci0gICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFBlcmZvcm0gdGhlIHJlbG9jYXRpb24uICAqLwotICByZXR1cm4gdjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJfdHlwZSwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsgCi19Ci0KLQwKLS8qIFJlbG9jYXRlIGFuIFY4NTAgRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICByZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICBsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0KLSAgaWYgKHN5bV9oYXNoZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5jYWxsYmFja3MtPndhcm5pbmcKLQkoaW5mbywgIm5vIGhhc2ggdGFibGUgYXZhaWxhYmxlIiwgTlVMTCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAwKTsKLQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgCi0gIC8qIFJlc2V0IHRoZSBsaXN0IG9mIHJlbWVtYmVyZWQgSEkxNlMgcmVsb2NzIHRvIGVtcHR5LiAgKi8KLSAgZnJlZV9oaTE2cyAgICAgPSBwcmV2aW91c19oaTE2czsKLSAgcHJldmlvdXNfaGkxNnMgPSBOVUxMOwotICBoaTE2c19jb3VudGVyICA9IDA7Ci0gIAotICByZWwgICAgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgcjsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgcl90eXBlICAgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX1Y4NTBfR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9WODUwX0dOVV9WVElOSEVSSVQpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IHY4NTBfZWxmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0gICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLSNpZiAwCi0JICB7Ci0JICAgIGNoYXIgKiBuYW1lOwotCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotCSAgICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyAiPG5vbmU+IiA6IG5hbWU7Ci1mcHJpbnRmIChzdGRlcnIsICJsb2NhbDogc2VjOiAlcywgc3ltOiAlcyAoJWQpLCB2YWx1ZTogJXggKyAleCArICV4IGFkZGVuZCAleFxuIiwKLQkgc2VjLT5uYW1lLCBuYW1lLCBzeW0tPnN0X25hbWUsCi0JIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LCBzeW0tPnN0X3ZhbHVlLCByZWwtPnJfYWRkZW5kKTsKLQkgIH0KLSNlbmRpZgotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgCi0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIAotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotI2lmIDAKLWZwcmludGYgKHN0ZGVyciwgImRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzLCB2YWx1ZTogJXggKyAleCArICV4IGdpdmVzOiAleFxuIiwKLQkgc2VjLT5uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoLT5yb290LnUuZGVmLnZhbHVlLCBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEsIHNlYy0+b3V0cHV0X29mZnNldCwgcmVsb2NhdGlvbik7Ci0jZW5kaWYKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICB7Ci0jaWYgMAotZnByaW50ZiAoc3RkZXJyLCAidW5kZWZpbmVkOiBzZWM6ICVzLCBuYW1lOiAlc1xuIiwKLQkgc2VjLT5uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0jaWYgMAotZnByaW50ZiAoc3RkZXJyLCAidW5rbm93bjogbmFtZTogJXNcbiIsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotI2VuZGlmCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgdXNlIHRoZSBhZGRlbmQsIGJ1dCB0aGUgQ09GRiByZWxvY2F0aW9ucwotICAgICAgICAgZG9uJ3QuICAqLwotICAgICAgciA9IHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQlyZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kLAotCQkJCQlpbmZvLCBzZWMsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbmFtZTsKLQkgIGNvbnN0IGNoYXIgKiBtc2cgPSAoY29uc3QgY2hhciAqKTA7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLQkJbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgcmVsb2NhdGlvbiIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX290aGVyOgotCSAgICAgIG1zZyA9IF8oImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZ3AiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19jb250aW51ZToKLQkgICAgICBtc2cgPSBfKCJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2VwIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSAoYmZkX3JlbG9jX2Rhbmdlcm91cyArIDEpOgotCSAgICAgIG1zZyA9IF8oImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fY3RicCIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIE5vIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIHY4NTAtZWxmICovCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotdjg1MF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVfVjg1MF9BUkNIOiAgICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCAwKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFX0FSQ0g6ICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfdjg1MCwgYmZkX21hY2hfdjg1MGUpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVBX0FSQ0g6ICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCBiZmRfbWFjaF92ODUwZWEpOyBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDogdmFsID0gRV9WODUwX0FSQ0g7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6ICB2YWwgPSBFX1Y4NTBFX0FSQ0g7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiB2YWwgPSBFX1Y4NTBFQV9BUkNIOyAgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9WODUwX0FSQ0g7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBWODUwIHNwZWNpZmljIGZpbGUgZmxhZ3MuICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiAgICBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghIGVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgaW5wdXQgaXMgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIHRoZW4gZG8gbm90Ci0JIGJvdGhlciBzZXR0aW5nIHRoZSBmbGFncyBmb3IgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUsCi0JIGluc3RlYWQgYWxsb3cgZnV0dXJlIG1lcmdlcyB0byBkbyB0aGlzLiAgSWYgbm8gZnV0dXJlCi0JIG1lcmdlcyBldmVyIHNldCB0aGVzZSBmbGFncyB0aGVuIHRoZXkgd2lsbCByZXRhaW4gdGhlaXIKLQkgdW5pdGlhbGlzZWQgdmFsdWVzLCB3aGljaCBzdXJwcmlzZSBzdXJwcmlzZSwgY29ycmVzcG9uZAotCSB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChpYmZkKS0+dGhlX2RlZmF1bHQpCi0JcmV0dXJuIHRydWU7Ci0gICAgICAKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIHJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLSAgaWYgKGluX2ZsYWdzID09IG91dF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGluX2ZsYWdzICYgRUZfVjg1MF9BUkNIKSAhPSAob3V0X2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotICAgICAgJiYgKGluX2ZsYWdzICYgRUZfVjg1MF9BUkNIKSAhPSBFX1Y4NTBfQVJDSCkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLwotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIFBUUiAgICAgcHRyOwotewotICBGSUxFICogZmlsZSA9IChGSUxFICopIHB0cjsKLSAgCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0gIAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICVseDogIiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLSAgCi0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX1Y4NTBfQVJDSDogZnByaW50ZiAoZmlsZSwgXygidjg1MCBhcmNoaXRlY3R1cmUiKSk7IGJyZWFrOwotICAgIGNhc2UgRV9WODUwRV9BUkNIOiAgZnByaW50ZiAoZmlsZSwgXygidjg1MGUgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVBX0FSQ0g6IGZwcmludGYgKGZpbGUsIF8oInY4NTBlYSBhcmNoaXRlY3R1cmUiKSk7IGJyZWFrOwotICAgIH0KLSAgCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBWODUwIEVMRiB1c2VzIGZvdXIgY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUKLSAgIG90aGVycyBhcmUgZm9yIChzbWFsbCkgb2JqZWN0cyBpbiBvbmUgb2YgdGhlIHNwZWNpYWwgZGF0YSBhcmVhczoKLSAgIHNtYWxsLCB0aW55IGFuZCB6ZXJvLiAgQWxsIHRoZSBvYmplY3RzIGFyZSBrZXB0IHRvZ2V0aGVyLCBhbmQgdGhlbgotICAgcmVmZXJlbmNlZCB2aWEgdGhlIGdwIHJlZ2lzdGVyLCB0aGUgZXAgcmVnaXN0ZXIgb3IgdGhlIHIwIHJlZ2lzdGVyCi0gICByZXNwZWN0aXZlbHksIHdoaWNoIHlpZWxkcyBzbWFsbGVyLCBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzCi0gICBhcHByb2FjaCBpcyBjb3BpZWQgZnJvbSBlbGYzMi1taXBzLmMuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sICAgdjg1MF9lbGZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0cjsKLXN0YXRpYyBhc2VjdGlvbiAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgICB2ODUwX2VsZl90Y29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICogdjg1MF9lbGZfdGNvbV9zeW1ib2xfcHRyOwotc3RhdGljIGFzZWN0aW9uICB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgIHY4NTBfZWxmX3pjb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKiB2ODUwX2VsZl96Y29tX3N5bWJvbF9wdHI7Ci0KLQotLyogR2l2ZW4gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIGxvY2F0ZSB0aGUgY29ycmVzcG9uZGluZyBFTEYgc2VjdGlvbgotICAgaW5kZXguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBoZHIsIHNlYywgcmV0dmFsKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogaGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICBzZWM7Ci0gICAgIGludCAqICAgICAgICAgICAgICAgICByZXR2YWw7Ci17Ci0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnNjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9TQ09NTU9OOwotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnRjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9UQ09NTU9OOwotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnpjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9aQ09NTU9OOwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgc3BlY2lhbCBWODUwIHNlY3Rpb24gbnVtYmVycyB0aGF0IGEgc3ltYm9sIG1heSB1c2UuICAqLwotCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgKGFiZmQsIGFzeW0pCi0gICAgIGJmZCAqICAgICBhYmZkOwotICAgICBhc3ltYm9sICogYXN5bTsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICogZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOwotICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKLSAgCi0gIGluZGV4ID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotCi0gIC8qIElmIHRoZSBzZWN0aW9uIGluZGV4IGlzIGFuICJvcmRpbmFyeSIgaW5kZXgsIHRoZW4gaXQgbWF5Ci0gICAgIHJlZmVyIHRvIGEgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlci4KLSAgICAgQ2hlY2sgdGhlIHNlY3Rpb24ncyB0eXBlIGFuZCBjaGFuZ2UgdGhlIGluZGV4IGl0IG1hdGNoZXMuCi0gICAgIAotICAgICBGSVhNRTogU2hvdWxkIHdlIGFsdGVyIHRoZSBzdF9zaG5keCBmaWVsZCBhcyB3ZWxsID8gICovCi0gIAotICBpZiAoaW5kZXggPCBlbGZfZWxmaGVhZGVyKGFiZmQpWzBdLmVfc2hudW0pCi0gICAgc3dpdGNoIChlbGZfZWxmc2VjdGlvbnMoYWJmZClbaW5kZXhdLT5zaF90eXBlKQotICAgICAgewotICAgICAgY2FzZSBTSFRfVjg1MF9TQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfVENPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1RDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1pDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9aQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLSAgCi0gIHN3aXRjaCAoaW5kZXgpCi0gICAgewotICAgIGNhc2UgU0hOX1Y4NTBfU0NPTU1PTjoKLSAgICAgIGlmICh2ODUwX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OIHwgU0VDX0FMTE9DIHwgU0VDX0RBVEE7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2w7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0cjsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbC5mbGFncyAgICAgICAgICAgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0ciAgICAgICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICYgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSE5fVjg1MF9UQ09NTU9OOgotICAgICAgaWYgKHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgdGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIudGNvbW1vbiI7Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHI7Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnRjb21tb24iOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wuZmxhZ3MgICAgICAgICAgID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHIgICAgICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX1Y4NTBfWkNPTU1PTjoKLSAgICAgIGlmICh2ODUwX2VsZl96Y29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHpjb21tb24gc2VjdGlvbi4gICovCi0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnpjb21tb24iOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLmZsYWdzICAgICAgICAgID0gU0VDX0lTX0NPTU1PTjsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi56Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLmZsYWdzICAgICAgICAgICA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyICAgICAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJiB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgdjg1MCBzZWN0aW9uIG51bWJlcnMgaGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgIGluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqIHN5bTsKLSAgICAgY29uc3QgY2hhciAqKiAgICAgICAgICAgIG5hbWVwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZsYWd3b3JkICogICAgICAgICAgICAgICBmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICAgIHNlY3A7Ci0gICAgIGJmZF92bWEgKiAgICAgICAgICAgICAgICB2YWxwOwotewotICBpbnQgaW5kZXggPSBzeW0tPnN0X3NobmR4OwotICAKLSAgLyogSWYgdGhlIHNlY3Rpb24gaW5kZXggaXMgYW4gIm9yZGluYXJ5IiBpbmRleCwgdGhlbiBpdCBtYXkKLSAgICAgcmVmZXIgdG8gYSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gY3JlYXRlZCBieSB0aGUgYXNzZW1ibGVyLgotICAgICBDaGVjayB0aGUgc2VjdGlvbidzIHR5cGUgYW5kIGNoYW5nZSB0aGUgaW5kZXggaXQgbWF0Y2hlcy4KLSAgICAgCi0gICAgIEZJWE1FOiBTaG91bGQgd2UgYWx0ZXIgdGhlIHN0X3NobmR4IGZpZWxkIGFzIHdlbGwgPyAgKi8KLSAgCi0gIGlmIChpbmRleCA8IGVsZl9lbGZoZWFkZXIoYWJmZClbMF0uZV9zaG51bSkKLSAgICBzd2l0Y2ggKGVsZl9lbGZzZWN0aW9ucyhhYmZkKVtpbmRleF0tPnNoX3R5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIFNIVF9WODUwX1NDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9TQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9UQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfVENPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfWkNPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1pDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotICAKLSAgc3dpdGNoIChpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fVjg1MF9TQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNITl9WODUwX1RDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50Y29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0hOX1Y4NTBfWkNPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnpjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTSUdOT1JFRCovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgaW5wdXRfc2VjKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIHN5bTsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWM7Ci17Ci0gIC8qIElmIHdlIHNlZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGltcGxpZXMgYSByZWxvY2F0YWJsZSBsaW5rLCB0aGVuCi0gICAgIGlmIGEgc3ltYm9sIHdhcyBpbiBhIHNwZWNpYWwgY29tbW9uIHNlY3Rpb24gaW4gYW4gaW5wdXQgZmlsZSwgbWFyawotICAgICBpdCBhcyBhIHNwZWNpYWwgY29tbW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIAotICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi5zY29tbW9uIikgPT0gMCkKLQlzeW0tPnN0X3NobmR4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnRjb21tb24iKSA9PSAwKQotCXN5bS0+c3Rfc2huZHggPSBTSE5fVjg1MF9UQ09NTU9OOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuemNvbW1vbiIpID09IDApCi0Jc3ltLT5zdF9zaG5keCA9IFNITl9WODUwX1pDT01NT047Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICogICAgICAgICAgICAgICBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgICAgY2hhciAqICAgICAgICAgICAgICBuYW1lOwotewotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gICovCi0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX1Y4NTBfU0NPTU1PTjoKLSAgICBjYXNlIFNIVF9WODUwX1RDT01NT046Ci0gICAgY2FzZSBTSFRfVjg1MF9aQ09NTU9OOgotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKLQkJCQkgICAgfCBTRUNfSVNfQ09NTU9OKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGEgVjg1MCBFTEYgc2VjdGlvbi4gIFdlIGRvIHRoaXMgYnkgdGhlCi0gICBzZWN0aW9uIG5hbWUsIHdoaWNoIGlzIGEgaGFjaywgYnV0IG91Z2h0IHRvIHdvcmsuICAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogaGRyOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgc2VjOwotewotICByZWdpc3RlciBjb25zdCBjaGFyICogbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfVjg1MF9TQ09NTU9OOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnRjb21tb24iKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9WODUwX1RDT01NT047Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuemNvbW1vbiIpID09IDApCi0gICAgaGRyLT5zaF90eXBlID0gU0hUX1Y4NTBfWkNPTU1PTjsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0KLQwKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCQliZmRfZWxmMzJfdjg1MF92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkJImVsZjMyLXY4NTAiCi0jZGVmaW5lIEVMRl9BUkNICQkJCWJmZF9hcmNoX3Y4NTAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJCUVNX0NZR05VU19WODUwCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCQkweDEwMDAKLQkKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQl2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkJdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWwKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJCXY4NTBfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgIAl2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkJdjg1MF9lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAJdjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gCXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZwkJdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQl2ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgCXY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCQl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCQl2ODUwX2VsZl9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICAgICB2ODUwX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgICAgIHY4NTBfZWxmX2djX3N3ZWVwX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCXY4NTBfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJdjg1MF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgCXY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgCXY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcgkJCSdfJwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzIuYyBiL2JmZC9lbGYzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjIyOTY5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogRUxGIDMyLWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFCQkzMgotCi0KLSNpbmNsdWRlICJlbGZjb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmNjQtYWxwaGEuYyBiL2JmZC9lbGY2NC1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTE0YmNjLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcwMSArMCwwIEBACi0vKiBBbHBoYSBzcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV2UgbmVlZCBhIHB1Ymxpc2hlZCBBQkkgc3BlYyBmb3IgdGhpcy4gIFVudGlsIG9uZSBjb21lcyBvdXQsIGRvbid0Ci0gICBhc3N1bWUgdGhpcydsbCByZW1haW4gdW5jaGFuZ2VkIGZvcmV2ZXIuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0KLSNkZWZpbmUgQUxQSEFFQ09GRgotCi0jZGVmaW5lIE5PX0NPRkZfUkVMT0NTCi0jZGVmaW5lIE5PX0NPRkZfU1lNQk9MUwotI2RlZmluZSBOT19DT0ZGX0xJTkVOT1MKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIE5lZWRlZCBmb3IgdGhlIGRlYnVnIGluZm9ybWF0aW9uLiAqLwotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9hbHBoYS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiBlbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBlbGY2NF9hbHBoYV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMoKGJmZCAqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfcmVsb2NfbmlsCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX3JlbG9jX2JhZAotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AKLSAgUEFSQU1TKChiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9yZWxvY19ncGRpc3AKLSAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBlbGY2NF9hbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBlbGY2NF9hbHBoYV9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgRWxmNjRfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX29iamVjdF9wCi0gIFBBUkFNUygoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUygoYmZkICosIEVsZjY0X0ludGVybmFsX1NoZHIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9mYWtlX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIEVsZjY0X0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvCi0gIFBBUkFNUygoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUKLSAgUEFSQU1TKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeTsKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltCi0gIFBBUkFNUygoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzCi0gIFBBUkFNUygoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBlbGY2NF9hbHBoYV9tZXJnZV9nb3RzCi0gIFBBUkFNUygoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzX2Zvcl9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMKLSAgUEFSQU1TICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICpzZWMsCi0JICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5hbF9saW5rCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotDAotc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBFeHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFWFRSIGVzeW07Ci0KLSAgLyogQ3VtdWxhdGl2ZSBmbGFncyBmb3IgYWxsIHRoZSAuZ290IGVudHJpZXMuICAqLwotICBpbnQgZmxhZ3M7Ci0KLSAgLyogQ29udGV4dHMgKExJVFVTRSkgaW4gd2hpY2ggYSBsaXRlcmFsIHdhcyByZWZlcmVuY2VkLiAgKi8KLSNkZWZpbmUgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSIDB4MDEKLSNkZWZpbmUgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9NRU0gIDB4MDIKLSNkZWZpbmUgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9CWVRFIDB4MDQKLSNkZWZpbmUgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DIDB4MDgKLQotICAvKiBVc2VkIHRvIGltcGxlbWVudCBtdWx0aXBsZSAuZ290IHN1YnNlY3Rpb25zLiAgKi8KLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkKLSAgewotICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpuZXh0OwotCi0gICAgLyogd2hpY2ggLmdvdCBzdWJzZWN0aW9uPyAgKi8KLSAgICBiZmQgKmdvdG9iajsKLQotICAgIC8qIHRoZSBhZGRlbmQgaW4gZWZmZWN0IGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICBiZmRfdm1hIGFkZGVuZDsKLQotICAgIC8qIHRoZSAuZ290IG9mZnNldCBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgaW50IGdvdF9vZmZzZXQ7Ci0KLSAgICBpbnQgZmxhZ3M7Ci0KLSAgICAvKiBBbiBhZGRpdGlvbmFsIGZsYWcuICAqLwotI2RlZmluZSBBTFBIQV9FTEZfR09UX0VOVFJZX1JFTE9DU19ET05FIDB4MTAKLQotICAgIGludCB1c2VfY291bnQ7Ci0gIH0gKmdvdF9lbnRyaWVzOwotCi0gIC8qIHVzZWQgdG8gY291bnQgbm9uLWdvdCwgbm9uLXBsdCByZWxvY2F0aW9ucyBmb3IgZGVsYXllZCBzaXppbmcKLSAgICAgb2YgcmVsb2NhdGlvbiBzZWN0aW9ucy4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkKLSAgewotICAgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKm5leHQ7Ci0KLSAgICAvKiB3aGljaCAucmVsb2Mgc2VjdGlvbj8gKi8KLSAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgIC8qIHdoYXQga2luZCBvZiByZWxvY2F0aW9uPyAqLwotICAgIHVuc2lnbmVkIGxvbmcgcnR5cGU7Ci0KLSAgICAvKiBob3cgbWFueSBkaWQgd2UgZmluZD8gICovCi0gICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLSAgfSAqcmVsb2NfZW50cmllczsKLX07Ci0KLS8qIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogVGhlIGhlYWQgb2YgYSBsaXN0IG9mIC5nb3Qgc3Vic2VjdGlvbnMgbGlua2VkIHRocm91Z2gKLSAgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5nb3RfbGlua19uZXh0LiAgKi8KLSAgYmZkICpnb3RfbGlzdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBHZXQgdGhlIG9iamVjdCdzIHN5bWJvbHMgYXMgb3VyIG93biBlbnRyeSB0eXBlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfc3ltX2hhc2hlcyhhYmZkKSBcCi0gICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiopZWxmX3N5bV9oYXNoZXMoYWJmZCkpCi0KLS8qIFNob3VsZCB3ZSBkbyBkeW5hbWljIHRoaW5ncyB0byB0aGlzIHN5bWJvbD8gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AoaCwgaW5mbykgCQkJCVwKLSAgKCgoKGluZm8pLT5zaGFyZWQgJiYgIShpbmZvKS0+c3ltYm9saWMpCQkJCVwKLSAgICB8fCAoKChoKS0+ZWxmX2xpbmtfaGFzaF9mbGFncwkJCQkJXAotCSAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpCVwKLSAgICAgICAgPT0gKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkJXAotICAgIHx8IChoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCQkJXAotICAgIHx8IChoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykJCQkJXAotICAgJiYgKGgpLT5keW5pbmR4ICE9IC0xKQotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICBtZW1zZXQgKCZyZXQtPmVzeW0sIDAsIHNpemVvZiAoRVhUUikpOwotICAgICAgLyogV2UgdXNlIC0yIGFzIGEgbWFya2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIGluZm9ybWF0aW9uIGhhcwotCSBub3QgYmVlbiBzZXQuICAtMSBtZWFucyB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGlmZC4gICovCi0gICAgICByZXQtPmVzeW0uaWZkID0gLTI7Ci0gICAgICByZXQtPmZsYWdzID0gMDsKLSAgICAgIHJldC0+Z290X2VudHJpZXMgPSBOVUxMOwotICAgICAgcmV0LT5yZWxvY19lbnRyaWVzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIGVsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotDAotLyogV2UgaGF2ZSBzb21lIHByaXZhdGUgZmllbGRzIGhhbmdpbmcgb2ZmIG9mIHRoZSBlbGZfdGRhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEKLXsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgcm9vdDsKLQotICAvKiBGb3IgZXZlcnkgaW5wdXQgZmlsZSwgdGhlc2UgYXJlIHRoZSBnb3QgZW50cmllcyBmb3IgdGhhdCBvYmplY3QncwotICAgICBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKiogbG9jYWxfZ290X2VudHJpZXM7Ci0KLSAgLyogRm9yIGV2ZXJ5IGlucHV0IGZpbGUsIHRoaXMgaXMgdGhlIG9iamVjdCB0aGF0IG93bnMgdGhlIGdvdCB0aGF0Ci0gICAgIHRoaXMgaW5wdXQgZmlsZSB1c2VzLiAgKi8KLSAgYmZkICpnb3RvYmo7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyBhIGxpbmtlZCBsaXN0IHRocm91Z2ggdGhlIG9iamVjdHMgdXNpbmcgdGhpcyBnb3QgKi8KLSAgYmZkICppbl9nb3RfbGlua19uZXh0OwotCi0gIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgYSBsaW5rIHRvIHRoZSBuZXh0IGdvdCBzdWJzZWdtZW50LiAgKi8KLSAgYmZkICpnb3RfbGlua19uZXh0OwotCi0gIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgdGhlIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqZ290OwotCi0gIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgaXQncyB0b3RhbCBudW1iZXIgb2YgKmVudHJpZXMqLiAgKi8KLSAgaW50IHRvdGFsX2dvdF9lbnRyaWVzOwotCi0gIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyIG9mICplbnRyaWVzKiByZXF1aXJlZAotICAgICB0byBob2xkIGFsbCBvZiB0aGUgbWVtYmVyIG9iamVjdCdzIGxvY2FsIGdvdC4gICovCi0gIGludCBuX2xvY2FsX2dvdF9lbnRyaWVzOwotfTsKLQotI2RlZmluZSBhbHBoYV9lbGZfdGRhdGEoYWJmZCkgXAotICAoKHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhICopIChhYmZkKS0+dGRhdGEuYW55KQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+dGRhdGEuYW55ID0gYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSkpOwotICBpZiAoYWJmZC0+dGRhdGEuYW55ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIEFsbG9jYXRlIG91ciBzcGVjaWFsIHRhcmdldCBkYXRhLiAgKi8KLSAgc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEgKm5ld190ZGF0YTsKLSAgbmV3X3RkYXRhID0gYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSkpOwotICBpZiAobmV3X3RkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuZXdfdGRhdGEtPnJvb3QgPSAqYWJmZC0+dGRhdGEuZWxmX29ial9kYXRhOwotICBhYmZkLT50ZGF0YS5hbnkgPSBuZXdfdGRhdGE7Ci0KLSAgLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYW4gQWxwaGEgRUxGIGZpbGUuICAqLwotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfYWxwaGEsIDApOwotfQotDAotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjY0X2FscGhhX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9BTFBIQV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfbmlsLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJOT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9BTFBIQV9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9BTFBIQV9SRUZRVUFELAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgR1AgcmVsYXRpdmUgb2Zmc2V0LiAgVGhpcyBpcyBqdXN0IGxpa2UgUkVGTE9ORyBleGNlcHQKLSAgICAgdGhhdCB3aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIHRoZSB2YWx1ZSBvZiB0aGUgZ3AgcmVnaXN0ZXIgd2lsbCBiZQotICAgICBhZGRlZCBpbi4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiRUxGX0xJVEVSQUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBvbmx5IGFwcGVhcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFuIEVMRl9MSVRFUkFMIHJlbG9jLgotICAgICBJdCBpZGVudGlmaWVzIGEgdXNlIG9mIHRoZSBsaXRlcmFsLiAgVGhlIHN5bWJvbCBpbmRleCBpcyBzcGVjaWFsOgotICAgICAxIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIGJhc2UgcmVnaXN0ZXIgb2YgYSBtZW1vcnkKLSAgICAgZm9ybWF0IGluc3RydWN0aW9uOyAyIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIGJ5dGUKLSAgICAgb2Zmc2V0IHJlZ2lzdGVyIG9mIGEgYnl0ZS1tYW5pcHVsYXRpb24gaW5zdHJ1Y3Rpb247IDMgbWVhbnMgdGhlCi0gICAgIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgdGFyZ2V0IHJlZ2lzdGVyIG9mIGEganNyIGluc3RydWN0aW9uLgotICAgICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfTElUVVNFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX25pbCwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElUVVNFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb2FkIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgaXMgYWx3YXlzIHVzZWQgZm9yIGEgbGRhaCBpbnN0cnVjdGlvbgotICAgICB3aGljaCBsb2FkcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgZ3AgcmVnaXN0ZXIuICBUaGUgc3ltYm9sCi0gICAgIGluZGV4IG9mIHRoZSBHUERJU1AgaW5zdHJ1Y3Rpb24gaXMgYW4gb2Zmc2V0IGluIGJ5dGVzIHRvIHRoZSBsZGEKLSAgICAgaW5zdHJ1Y3Rpb24gdGhhdCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSB2YWx1ZSB0byB1c2UgZm9yCi0gICAgIHRoZSByZWxvY2F0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdQIHZhbHVlIGFuZCB0aGUKLSAgICAgY3VycmVudCBsb2NhdGlvbjsgdGhlIGxvYWQgd2lsbCBhbHdheXMgYmUgZG9uZSBhZ2FpbnN0IGEgcmVnaXN0ZXIKLSAgICAgaG9sZGluZyB0aGUgY3VycmVudCBhZGRyZXNzLgotCi0gICAgIE5PVEU6IFVubGlrZSBFQ09GRiwgcGFydGlhbCBpbi1wbGFjZSByZWxvY2F0aW9uIGlzIG5vdCBkb25lLiAgSWYKLSAgICAgYW55IG9mZnNldCBpcyBwcmVzZW50IGluIHRoZSBpbnN0cnVjdGlvbnMsIGl0IGlzIGFuIG9mZnNldCBmcm9tCi0gICAgIHRoZSByZWdpc3RlciB0byB0aGUgbGRhaCBpbnN0cnVjdGlvbi4gIFRoaXMgbGV0cyB1cyBhdm9pZCBhbnkKLSAgICAgc3R1cGlkIGhhY2tlcnkgbGlrZSBpbnZlbnRpbmcgYSBncCB2YWx1ZSB0byBkbyBwYXJ0aWFsIHJlbG9jYXRpb24KLSAgICAgYWdhaW5zdC4gIEFsc28gdW5saWtlIEVDT0ZGLCB3ZSBkbyB0aGUgd2hvbGUgcmVsb2NhdGlvbiBvZmYgb2YKLSAgICAgdGhlIEdQRElTUCByYXRoZXIgdGhhbiBhIEdQRElTUF9ISTE2L0dQRElTUF9MTzE2IHBhaXIuICBBbiBvZGQsCi0gICAgIHNwYWNlIGNvbnN1bWluZyBiaXQsIHRoYXQsIHNpbmNlIGFsbCB0aGUgaW5mb3JtYXRpb24gd2FzIHByZXNlbnQKLSAgICAgaW4gdGhlIEdQRElTUF9ISTE2IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BESVNQLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19ncGRpc3AsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQRElTUCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICAqLwotICBIT1dUTyAoUl9BTFBIQV9CUkFERFIsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIxLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIGhpbnQgZm9yIGEganVtcCB0byBhIHJlZ2lzdGVyLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSElOVCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1NSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1NSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9TUkVMNjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9PUF9QVVNILAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QVVNIIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdG9yZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2sgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICBTdG9yZSBpdCBpbgotICAgICBhIGJpdGZpZWxkIG9mIHNpemUgcl9zaXplIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiByX29mZnNldC4gICovCi0gIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9PUF9TVE9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCi0gIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9PUF9QU1VCLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKLSAgICAgZ2l2ZW4gdmFsdWUuICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfUFJTSElGVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFJTSElGVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBHUCB1c2VkIGJ5ICtyX2FkZGVuZCB1bnRpbCB0aGUgbmV4dCBHUFZBTFVFIG9yIHRoZQotICAgICBlbmQgb2YgdGhlIGlucHV0IGJmZC4gICovCi0gIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUFZBTFVFLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BWQUxVRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggMTYgYml0cyBvZiB0aGUgZGlzcGxhY2VtZW50IGZyb20gR1AgdG8gdGhlIHRhcmdldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQUkVMSElHSCwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMSElHSCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgbG93IDE2IGJpdHMgb2YgdGhlIGRpc3BsYWNlbWVudCBmcm9tIEdQIHRvIHRoZSB0YXJnZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUFJFTExPVywKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTExPVyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2LWJpdCBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgR1AgdG8gdGhlIHRhcmdldC4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfR1BfMTYsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9HUF8xNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBiaXRzIG9mIGEgMzItYml0IGRpc3BsYWNlbWVudCBmcm9tIHRoZSBHUCB0byB0aGUgdGFyZ2V0OyB0aGUKLSAgICAgbG93IGJpdHMgYXJlIHN1cHBsaWVkIGluIHRoZSBzdWJzZXF1ZW50IFJfQUxQSEFfSU1NRURfTE8zMiByZWxvY3MuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0dQX0hJMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9HUF9ISTMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBiaXRzIG9mIGEgMzItYml0IGRpc3BsYWNlbWVudCB0byB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUKLSAgICAgY3VycmVudCBzZWN0aW9uICh0aGUgcmVsb2NhdGlvbiB0YXJnZXQgaXMgaWdub3JlZCk7IHRoZSBsb3cgYml0cyBhcmUgCi0gICAgIHN1cHBsaWVkIGluIHRoZSBzdWJzZXF1ZW50IFJfQUxQSEFfSU1NRURfTE8zMiByZWxvY3MuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX1NDTl9ISTMyLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfU0NOX0hJMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIGJpdHMgb2YgYSAzMi1iaXQgZGlzcGxhY2VtZW50IGZyb20gdGhlIHByZXZpb3VzIGJyLCBic3IsIGpzcgotICAgICBvciBqbXAgaW5zbiAoYXMgdGFnZ2VkIGJ5IGEgQlJBRERSIG9yIEhJTlQgcmVsb2MpIHRvIHRoZSB0YXJnZXQ7IHRoZQotICAgICBsb3cgYml0cyBhcmUgc3VwcGxpZWQgYnkgc3Vic2VxdWVudCBSX0FMUEhBX0lNTUVEX0xPMzIgcmVsb2NzLiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9CUl9ISTMyLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfQlJfSEkzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIGEgZGlzcGxhY2VtZW50IGNhbGN1bGF0ZWQgaW4gYSBwcmV2aW91cyBISTMyIHJlbG9jLiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9MTzMyLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfTE8zMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTWlzYyBFTEYgcmVsb2NhdGlvbnMuICovCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gdG8gY29weSB0aGUgdGFyZ2V0IGludG8gb3VyIC5keW5ic3Mgc2VjdGlvbi4gICovCi0gIC8qIE5vdCBnZW5lcmF0ZWQsIGFzIGFsbCBBbHBoYSBvYmplY3RzIHVzZSBQSUMsIHNvIGl0IGlzIG5vdCBuZWVkZWQuICBJdAotICAgICBpcyBwcmVzZW50IGJlY2F1c2UgZXZlcnkgb3RoZXIgRUxGIGhhcyBvbmUsIGJ1dCBzaG91bGQgbm90IGJlIHVzZWQKLSAgICAgYmVjYXVzZSAuZHluYnNzIGlzIGFuIHVnbHkgdGhpbmcuICAqLwotICBIT1dUTyAoUl9BTFBIQV9DT1BZLAotCSAwLAotCSAwLAotCSAwLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiQ09QWSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSB0cnVlKSwKLQotICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgYSAuZ290IGVudHJ5LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR0xPQl9EQVQsCi0JIDAsCi0JIDAsCi0JIDAsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJHTE9CX0RBVCIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSB0cnVlKSwKLQotICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgYSAucGx0IGVudHJ5LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSk1QX1NMT1QsCi0JIDAsCi0JIDAsCi0JIDAsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJKTVBfU0xPVCIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSB0cnVlKSwKLQotICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiB0byBhZGQgdGhlIGJhc2Ugb2YgdGhlIERTTyB0byBhIDY0LWJpdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1JFTEFUSVZFLAotCSAwLAotCSAwLAotCSAwLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUkVMQVRJVkUiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSkKLX07Ci0KLS8qIEEgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aGljaCBkb2Vzbid0IGRvIGFueXRoaW5nLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmNjRfYWxwaGFfcmVsb2NfbmlsIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkKQotICAgIHJlbG9jLT5hZGRyZXNzICs9IHNlYy0+b3V0cHV0X29mZnNldDsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogQSByZWxvY2F0aW9uIGZ1bmN0aW9uIHVzZWQgZm9yIGFuIHVuc3VwcG9ydGVkIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmNjRfYWxwaGFfcmVsb2NfYmFkIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkKQotICAgIHJlbG9jLT5hZGRyZXNzICs9IHNlYy0+b3V0cHV0X29mZnNldDsKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLS8qIERvIHRoZSB3b3JrIG9mIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX2RvX3JlbG9jX2dwZGlzcCAoYWJmZCwgZ3BkaXNwLCBwX2xkYWgsIHBfbGRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgZ3BkaXNwOwotICAgICBiZmRfYnl0ZSAqcF9sZGFoOwotICAgICBiZmRfYnl0ZSAqcF9sZGE7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgYWRkZW5kOwotICB1bnNpZ25lZCBsb25nIGlfbGRhaCwgaV9sZGE7Ci0KLSAgaV9sZGFoID0gYmZkX2dldF8zMiAoYWJmZCwgcF9sZGFoKTsKLSAgaV9sZGEgPSBiZmRfZ2V0XzMyIChhYmZkLCBwX2xkYSk7Ci0KLSAgLyogQ29tcGxhaW4gaWYgdGhlIGluc3RydWN0aW9ucyBhcmUgbm90IGNvcnJlY3QuICAqLwotICBpZiAoKChpX2xkYWggPj4gMjYpICYgMHgzZikgIT0gMHgwOQotICAgICAgfHwgKChpX2xkYSA+PiAyNikgJiAweDNmKSAhPSAweDA4KQotICAgIHJldCA9IGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0KLSAgLyogRXh0cmFjdCB0aGUgdXNlci1zdXBwbGllZCBvZmZzZXQsIG1pcnJvcmluZyB0aGUgc2lnbiBleHRlbnNpb25zCi0gICAgIHRoYXQgdGhlIGluc3RydWN0aW9ucyBwZXJmb3JtLiAgKi8KLSAgYWRkZW5kID0gKChpX2xkYWggJiAweGZmZmYpIDw8IDE2KSB8IChpX2xkYSAmIDB4ZmZmZik7Ci0gIGFkZGVuZCA9IChhZGRlbmQgXiAweDgwMDA4MDAwKSAtIDB4ODAwMDgwMDA7Ci0KLSAgZ3BkaXNwICs9IGFkZGVuZDsKLQotICBpZiAoKGJmZF9zaWduZWRfdm1hKSBncGRpc3AgPCAtKGJmZF9zaWduZWRfdm1hKSAweDgwMDAwMDAwCi0gICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIGdwZGlzcCA+PSAoYmZkX3NpZ25lZF92bWEpIDB4N2ZmZjgwMDApCi0gICAgcmV0ID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBzaWduIGV4dGVuc2lvbiBhZ2Fpbi4gICovCi0gIGlfbGRhaCA9ICgoaV9sZGFoICYgMHhmZmZmMDAwMCkKLQkgICAgfCAoKChncGRpc3AgPj4gMTYpICsgKChncGRpc3AgPj4gMTUpICYgMSkpICYgMHhmZmZmKSk7Ci0gIGlfbGRhID0gKGlfbGRhICYgMHhmZmZmMDAwMCkgfCAoZ3BkaXNwICYgMHhmZmZmKTsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBpX2xkYWgsIHBfbGRhaCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGlfbGRhLCBwX2xkYSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHRoZSBHUERJU1AgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9yZWxvY19ncGRpc3AgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW0sIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgIG91dHB1dF9iZmQsIGVycl9tc2cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJfbXNnOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwLCByZWxvY2F0aW9uOwotICBiZmRfYnl0ZSAqcF9sZGFoLCAqcF9sZGE7Ci0KLSAgLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UncmUgbm90IGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChvdXRwdXRfYmZkKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgfHwKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgcmVsb2NfZW50cnktPmFkZGVuZCA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogVGhlIGdwIHVzZWQgaW4gdGhlIHBvcnRpb24gb2YgdGhlIG91dHB1dCBvYmplY3QgdG8gd2hpY2ggdGhpcwotICAgICBpbnB1dCBvYmplY3QgYmVsb25ncyBpcyBjYWNoZWQgb24gdGhlIGlucHV0IGJmZC4gICovCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpOwotCi0gIHJlbG9jYXRpb24gPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgcF9sZGFoID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgcF9sZGEgPSBwX2xkYWggKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIHJldCA9IGVsZjY0X2FscGhhX2RvX3JlbG9jX2dwZGlzcCAoYWJmZCwgZ3AgLSByZWxvY2F0aW9uLCBwX2xkYWgsIHBfbGRhKTsKLQotICAvKiBDb21wbGFpbiBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgY29ycmVjdC4gICovCi0gIGlmIChyZXQgPT0gYmZkX3JlbG9jX2Rhbmdlcm91cykKLSAgICAqZXJyX21zZyA9IF8oIkdQRElTUCByZWxvY2F0aW9uIGRpZCBub3QgZmluZCBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zIik7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQSBtYXBwaW5nIGZyb20gQkZEIHJlbG9jIHR5cGVzIHRvIEFscGhhIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICBpbnQgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBlbGY2NF9hbHBoYV9yZWxvY19tYXBbXSA9Ci17Ci0gIHtCRkRfUkVMT0NfTk9ORSwJCVJfQUxQSEFfTk9ORX0sCi0gIHtCRkRfUkVMT0NfMzIsCQlSX0FMUEhBX1JFRkxPTkd9LAotICB7QkZEX1JFTE9DXzY0LAkJUl9BTFBIQV9SRUZRVUFEfSwKLSAge0JGRF9SRUxPQ19DVE9SLAkJUl9BTFBIQV9SRUZRVUFEfSwKLSAge0JGRF9SRUxPQ19HUFJFTDMyLAkJUl9BTFBIQV9HUFJFTDMyfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTCwJUl9BTFBIQV9MSVRFUkFMfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9MSVRVU0UsCVJfQUxQSEFfTElUVVNFfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9HUERJU1AsCVJfQUxQSEFfR1BESVNQfSwKLSAge0JGRF9SRUxPQ18yM19QQ1JFTF9TMiwJUl9BTFBIQV9CUkFERFJ9LAotICB7QkZEX1JFTE9DX0FMUEhBX0hJTlQsCVJfQUxQSEFfSElOVH0sCi0gIHtCRkRfUkVMT0NfMTZfUENSRUwsCQlSX0FMUEhBX1NSRUwxNn0sCi0gIHtCRkRfUkVMT0NfMzJfUENSRUwsCQlSX0FMUEhBX1NSRUwzMn0sCi0gIHtCRkRfUkVMT0NfNjRfUENSRUwsCQlSX0FMUEhBX1NSRUw2NH0sCi0KLS8qIFRoZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl8qIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgdG8gcHJvY2VzcwotICAgdGhlIGV4cGxpY2l0ICE8cmVsb2M+IXNlcXVlbmNlIHJlbG9jYXRpb25zLCBhbmQgYXJlIG1hcHBlZCBpbnRvIHRoZSBub3JtYWwKLSAgIHJlbG9jYXRpb25zIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZy4gKi8KLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwsCVJfQUxQSEFfTElURVJBTH0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRSwJUl9BTFBIQV9MSVRVU0V9LAotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRiwJUl9BTFBIQV9MSVRVU0V9LAotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUiwJUl9BTFBIQV9MSVRVU0V9LAotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BESVNQLAkJUl9BTFBIQV9HUERJU1B9LAotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdILAlSX0FMUEhBX0dQUkVMSElHSH0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVywJUl9BTFBIQV9HUFJFTExPV30sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyB0eXBlLCByZXR1cm4gYSBIT1dUTyBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGY2NF9hbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwICppLCAqZTsKLSAgaSA9IGUgPSBlbGY2NF9hbHBoYV9yZWxvY19tYXA7Ci0gIGUgKz0gc2l6ZW9mIChlbGY2NF9hbHBoYV9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7Ci0gIGZvciAoOyBpICE9IGU7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoaS0+YmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmNjRfYWxwaGFfaG93dG9fdGFibGVbaS0+ZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogR2l2ZW4gYW4gQWxwaGEgRUxGIHJlbG9jIHR5cGUsIGZpbGwgaW4gYW4gYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmNjRfYWxwaGFfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEY2NF9SX1RZUEUoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0FMUEhBX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmNjRfYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQwKLS8qIFRoZXNlIGZ1bmN0aW9ucyBkbyByZWxheGF0aW9uIGZvciBBbHBoYSBFTEYuIAotCi0gICBDdXJyZW50bHkgSSdtIG9ubHkgaGFuZGxpbmcgd2hhdCBJIGNhbiBkbyB3aXRoIGV4aXN0aW5nIGNvbXBpbGVyCi0gICBhbmQgYXNzZW1ibGVyIHN1cHBvcnQsIHdoaWNoIG1lYW5zIG5vIGluc3RydWN0aW9ucyBhcmUgcmVtb3ZlZCwKLSAgIHRob3VnaCBzb21lIG1heSBiZSBub3BwZWQuICBBdCB0aGlzIHRpbWUgR0NDIGRvZXMgbm90IGVtaXQgZW5vdWdoCi0gICBpbmZvcm1hdGlvbiB0byBkbyBhbGwgb2YgdGhlIHJlbGF4aW5nIHRoYXQgaXMgcG9zc2libGUuICBJdCB3aWxsCi0gICB0YWtlIHNvbWUgbm90IHNtYWxsIGFtb3VudCBvZiB3b3JrIGZvciB0aGF0IHRvIGhhcHBlbi4KLQotICAgVGhlcmUgYXJlIGEgY291cGxlIG9mIGludGVyZXN0aW5nIHBhcGVycyB0aGF0IEkgb25jZSByZWFkIG9uIHRoaXMKLSAgIHN1YmplY3QsIHRoYXQgSSBjYW5ub3QgZmluZCByZWZlcmVuY2VzIHRvIGF0IHRoZSBtb21lbnQsIHRoYXQKLSAgIHJlbGF0ZWQgdG8gQWxwaGEgaW4gcGFydGljdWxhci4gIFRoZXkgYXJlIGJ5IERhdmlkIFdhbGwsIHRoZW4gb2YKLSAgIERFQyBXUkwuICAqLwotCi0jZGVmaW5lIE9QX0xEQQkJMHgwOAotI2RlZmluZSBPUF9MREFICQkweDA5Ci0jZGVmaW5lIElOU05fSlNSCTB4NjgwMDQwMDAKLSNkZWZpbmUgSU5TTl9KU1JfTUFTSwkweGZjMDBjMDAwCi0jZGVmaW5lIE9QX0xEUQkJMHgyOQotI2RlZmluZSBPUF9CUgkJMHgzMAotI2RlZmluZSBPUF9CU1IJCTB4MzQKLSNkZWZpbmUgSU5TTl9VTk9QCTB4MmZlMDAwMDAKLQotc3RydWN0IGFscGhhX3JlbGF4X2luZm8KLXsKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MsICpyZWxlbmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gIGJvb2xlYW4gY2hhbmdlZF9jb250ZW50czsKLSAgYm9vbGVhbiBjaGFuZ2VkX3JlbG9jczsKLSAgYmZkX3ZtYSBncDsKLSAgYmZkICpnb3RvYmo7Ci0gIGFzZWN0aW9uICp0c2VjOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLSAgdW5zaWduZWQgY2hhciBvdGhlcjsKLX07Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfUmVsYSAqIGVsZjY0X2FscGhhX3JlbGF4X3dpdGhfbGl0dXNlCi0gIFBBUkFNUygoc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm8sIGJmZF92bWEgc3ltdmFsLCAKLSAgICAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxlbmQpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UKLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbywgYmZkX3ZtYSBzeW12YWwsIAotICAgICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsKSk7Ci0KLXN0YXRpYyBiZmRfdm1hIGVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsCi0gIFBBUkFNUygoc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm8sIGJmZF92bWEgc3ltdmFsKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0JICBib29sZWFuICphZ2FpbikpOwotCi1zdGF0aWMgRWxmX0ludGVybmFsX1JlbGEgKgotZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMgKHJlbCwgcmVsZW5kLCBvZmZzZXQsIHR5cGUpCi0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBpbnQgdHlwZTsKLXsKLSAgd2hpbGUgKHJlbCA8IHJlbGVuZCkKLSAgICB7Ci0gICAgICBpZiAocmVsLT5yX29mZnNldCA9PSBvZmZzZXQgJiYgRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gdHlwZSkKLQlyZXR1cm4gcmVsOwotICAgICAgKytyZWw7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIEVsZl9JbnRlcm5hbF9SZWxhICoKLWVsZjY0X2FscGhhX3JlbGF4X3dpdGhfbGl0dXNlIChpbmZvLCBzeW12YWwsIGlyZWwsIGlyZWxlbmQpCi0gICAgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotewotICBFbGZfSW50ZXJuYWxfUmVsYSAqdXJlbDsKLSAgaW50IGZsYWdzLCBjb3VudCwgaTsKLSAgYmZkX3NpZ25lZF92bWEgZGlzcDsKLSAgYm9vbGVhbiBmaXRzMTY7Ci0gIGJvb2xlYW4gZml0czMyOwotICBib29sZWFuIGxpdF9yZXVzZWQgPSBmYWxzZTsKLSAgYm9vbGVhbiBhbGxfb3B0aW1pemVkID0gdHJ1ZTsKLSAgdW5zaWduZWQgaW50IGxpdF9pbnNuOwotCi0gIGxpdF9pbnNuID0gYmZkX2dldF8zMiAoaW5mby0+YWJmZCwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0gIGlmIChsaXRfaW5zbiA+PiAyNiAhPSBPUF9MRFEpCi0gICAgewotICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICgiJXM6ICVzKzB4JWx4OiB3YXJuaW5nOiBMSVRFUkFMIHJlbG9jYXRpb24gYWdhaW5zdCB1bmV4cGVjdGVkIGluc24iLAotCWJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpLCBpbmZvLT5zZWMtPm5hbWUsCi0JKHVuc2lnbmVkIGxvbmcpaXJlbC0+cl9vZmZzZXQpKTsKLSAgICAgIHJldHVybiBpcmVsOwotICAgIH0KLQotICAvKiBTdW1tYXJpemUgaG93IHRoaXMgcGFydGljdWxhciBMSVRFUkFMIGlzIHVzZWQuICAqLwotICBmb3IgKHVyZWwgPSBpcmVsKzEsIGZsYWdzID0gY291bnQgPSAwOyB1cmVsIDwgaXJlbGVuZDsgKyt1cmVsLCArK2NvdW50KQotICAgIHsKLSAgICAgIGlmIChFTEY2NF9SX1RZUEUgKHVyZWwtPnJfaW5mbykgIT0gUl9BTFBIQV9MSVRVU0UpCi0JYnJlYWs7Ci0gICAgICBpZiAodXJlbC0+cl9hZGRlbmQgPj0gMCAmJiB1cmVsLT5yX2FkZGVuZCA8PSAzKQotCWZsYWdzIHw9IDEgPDwgdXJlbC0+cl9hZGRlbmQ7Ci0gICAgfQotCi0gIC8qIEEgbGl0dGxlIHByZXBhcmF0aW9uIGZvciB0aGUgbG9vcC4uLiAqLwotICBkaXNwID0gc3ltdmFsIC0gaW5mby0+Z3A7Ci0gIGZpdHMxNiA9IChkaXNwID49IC0oYmZkX3NpZ25lZF92bWEpMHg4MDAwICYmIGRpc3AgPCAweDgwMDApOwotICBmaXRzMzIgPSAoZGlzcCA+PSAtKGJmZF9zaWduZWRfdm1hKTB4ODAwMDAwMDAgJiYgZGlzcCA8IDB4N2ZmZjgwMDApOwotCi0gIGZvciAodXJlbCA9IGlyZWwrMSwgaSA9IDA7IGkgPCBjb3VudDsgKytpLCArK3VyZWwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5mby0+YWJmZCwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7Ci0KLSAgICAgIHN3aXRjaCAodXJlbC0+cl9hZGRlbmQpCi0JewotCWRlZmF1bHQ6IC8qIDAgPSBBRERSRVNTIEZPUk1BVCAqLwotCSAgLyogVGhpcyB0eXBlIGlzIHJlYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgdG8gbm90ZSB0aGF0IGFsbAotCSAgICAgdXNlcyBjYW5ub3QgYmUgb3B0aW1pemVkLCBidXQgdG8gc3RpbGwgYWxsb3cgc29tZS4gICovCi0JICBhbGxfb3B0aW1pemVkID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgMTogLyogTUVNIEZPUk1BVCAqLwotCSAgLyogV2UgY2FuIGFsd2F5cyBvcHRpbWl6ZSAxNi1iaXQgZGlzcGxhY2VtZW50cy4gICovCi0JICBpZiAoZml0czE2KQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IHNhbml0eSBjaGVjayB0aGUgaW5zbiBmb3IgbWVtIGZvcm1hdCB3aXRoCi0JCSB6ZXJvIGFkZGVuZC4gICovCi0KLQkgICAgICAvKiBUYWtlIHRoZSBvcCBjb2RlIGFuZCBkZXN0IGZyb20gdGhpcyBpbnNuLCB0YWtlIHRoZSBiYXNlIAotCQkgcmVnaXN0ZXIgZnJvbSB0aGUgbGl0ZXJhbCBpbnNuLiAgTGVhdmUgdGhlIG9mZnNldCBhbG9uZS4gICovCi0JICAgICAgaW5zbiA9IChpbnNuICYgMHhmZmUwMDAwMCkgfCAobGl0X2luc24gJiAweDAwMWYwMDAwKTsKLQkgICAgICB1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX0FMUEhBX0dQUkVMTE9XKTsKLQkgICAgICB1cmVsLT5yX2FkZGVuZCA9IGlyZWwtPnJfYWRkZW5kOwotCSAgICAgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLQotCSAgICAgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCSAgICB9Ci0KLQkgIC8qIElmIGFsbCBtZW0rYnl0ZSwgd2UgY2FuIG9wdGltaXplIDMyLWJpdCBtZW0gZGlzcGxhY2VtZW50cy4gICovCi0JICBlbHNlIGlmIChmaXRzMzIgJiYgIShmbGFncyAmIH42KSkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBzYW5pdHkgY2hlY2sgdGhhdCBsaXQgaW5zbiBSYSBpcyBtZW0gaW5zbiBSYiwgYW5kCi0JCSB0aGF0IG1lbV9pbnNuIGRpc3AgaXMgemVyby4gICovCi0KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX0FMUEhBX0dQUkVMSElHSCk7Ci0JICAgICAgbGl0X2luc24gPSAoT1BfTERBSCA8PCAyNikgfCAobGl0X2luc24gJiAweDAzZmYwMDAwKTsKLQkgICAgICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBsaXRfaW5zbiwKLQkJCSAgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0JICAgICAgbGl0X3JldXNlZCA9IHRydWU7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0KLQkgICAgICB1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX0FMUEhBX0dQUkVMTE9XKTsKLQkgICAgICB1cmVsLT5yX2FkZGVuZCA9IGlyZWwtPnJfYWRkZW5kOwotCSAgICAgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBhbGxfb3B0aW1pemVkID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgMjogLyogQllURSBPRkZTRVQgRk9STUFUICovCi0JICAvKiBXZSBjYW4gYWx3YXlzIG9wdGltaXplIGJ5dGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotCSAgLyogRklYTUU6IHNhbml0eSBjaGVjayB0aGUgaW5zbiBmb3IgYnl0ZSBvcC4gIENoZWNrIHRoYXQgdGhlCi0JICAgICBsaXRlcmFsIGRlc3QgcmVnIGlzIGluZGVlZCBSYiBpbiB0aGUgYnl0ZSBpbnNuLiAgKi8KLQotCSAgaW5zbiA9IChpbnNuICYgfjB4MDAxZmYwMDApIHwgKChzeW12YWwgJiA3KSA8PCAxMykgfCAweDEwMDA7Ci0KLQkgIHVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9BTFBIQV9OT05FKTsKLQkgIHVyZWwtPnJfYWRkZW5kID0gMDsKLQkgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLQotCSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7Ci0JICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOiAvKiBDQUxMIEZPUk1BVCAqLwotCSAgewotCSAgICAvKiBJZiBub3QgemVybywgcGxhY2UgdG8ganVtcCB3aXRob3V0IG5lZWRpbmcgcHYuICAqLwotCSAgICBiZmRfdm1hIG9wdGRlc3QgPSBlbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbCAoaW5mbywgc3ltdmFsKTsKLQkgICAgYmZkX3ZtYSBvcmcgPSAoaW5mby0+c2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGluZm8tPnNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgKyB1cmVsLT5yX29mZnNldCArIDQpOwotCSAgICBiZmRfc2lnbmVkX3ZtYSBvZGlzcDsKLQotCSAgICBvZGlzcCA9IChvcHRkZXN0ID8gb3B0ZGVzdCA6IHN5bXZhbCkgLSBvcmc7Ci0JICAgIGlmIChvZGlzcCA+PSAtMHg0MDAwMDAgJiYgb2Rpc3AgPCAweDQwMDAwMCkKLQkgICAgICB7Ci0JCUVsZl9JbnRlcm5hbF9SZWxhICp4cmVsOwotCi0JCS8qIFByZXNlcnZlIGJyYW5jaCBwcmVkaWN0aW9uIGNhbGwgc3RhY2sgd2hlbiBwb3NzaWJsZS4gKi8KLQkJaWYgKChpbnNuICYgSU5TTl9KU1JfTUFTSykgPT0gSU5TTl9KU1IpCi0JCSAgaW5zbiA9IChPUF9CU1IgPDwgMjYpIHwgKGluc24gJiAweDAzZTAwMDAwKTsKLQkJZWxzZQotCQkgIGluc24gPSAoT1BfQlIgPDwgMjYpIHwgKGluc24gJiAweDAzZTAwMDAwKTsKLQkJICAKLQkJdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICBSX0FMUEhBX0JSQUREUik7Ci0JCXVyZWwtPnJfYWRkZW5kID0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkJaWYgKG9wdGRlc3QpCi0JCSAgdXJlbC0+cl9hZGRlbmQgKz0gb3B0ZGVzdCAtIHN5bXZhbDsKLQkJZWxzZQotCQkgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQotCQliZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQotCQkvKiBLaWxsIGFueSBISU5UIHJlbG9jIHRoYXQgbWlnaHQgZXhpc3QgZm9yIHRoaXMgaW5zbi4gICovCi0JCXhyZWwgPSAoZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMKLQkJCShpbmZvLT5yZWxvY3MsIGluZm8tPnJlbGVuZCwgdXJlbC0+cl9vZmZzZXQsIAotCQkJIFJfQUxQSEFfSElOVCkpOwotCQlpZiAoeHJlbCkKLQkJICB4cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfQUxQSEFfTk9ORSk7Ci0KLQkJaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0JCWluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBhbGxfb3B0aW1pemVkID0gZmFsc2U7Ci0KLQkgICAgLyogPz8/IElmIHRhcmdldCBncCA9PSBjdXJyZW50IGdwIHdlIGNhbiBlbGltaW5hdGUgdGhlIGdwIHJlbG9hZC4KLQkgICAgICAgVGhpcyBkb2VzIGRlcGVuZCBvbiBldmVyeSBwbGFjZSBhIGdwIGNvdWxkIGJlIHJlbG9hZGVkIHdpbGwKLQkgICAgICAgYmUsIHdoaWNoIGN1cnJlbnRseSBoYXBwZW5zIGZvciBhbGwgY29kZSBwcm9kdWNlZCBieSBnY2MsIGJ1dAotCSAgICAgICBub3QgbmVjZXNzYXJpbHkgYnkgaGFuZC1jb2RlZCBhc3NlbWJseSwgb3IgaWYgc2libGluZyBjYWxscwotCSAgICAgICBhcmUgZW5hYmxlZCBpbiBnY2MuIAotCi0JICAgICAgIFBlcmhhcHMgY29uZGl0aW9uYWxpemUgdGhpcyBvbiBhIGZsYWcgYmVpbmcgc2V0IGluIHRoZSB0YXJnZXQKLQkgICAgICAgb2JqZWN0IGZpbGUncyBoZWFkZXIsIGFuZCBoYXZlIGdjYyBzZXQgaXQ/ICAqLwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiBhbGwgY2FzZXMgd2VyZSBvcHRpbWl6ZWQsIHdlIGNhbiByZWR1Y2UgdGhlIHVzZSBjb3VudCBvbiB0aGlzCi0gICAgIGdvdCBlbnRyeSBieSBvbmUsIHBvc3NpYmx5IGVsaW1pbmF0aW5nIGl0LiAgKi8KLSAgaWYgKGFsbF9vcHRpbWl6ZWQpCi0gICAgewotICAgICAgaW5mby0+Z290ZW50LT51c2VfY291bnQgLT0gMTsKLSAgICAgIGFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT50b3RhbF9nb3RfZW50cmllcyAtPSAxOwotICAgICAgaWYgKCFpbmZvLT5oKQotCWFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT5uX2xvY2FsX2dvdF9lbnRyaWVzIC09IDE7Ci0KLSAgICAgIC8qIElmIHRoZSBsaXRlcmFsIGluc3RydWN0aW9uIGlzIG5vIGxvbmdlciBuZWVkZWQgKGl0IG1heSBoYXZlIGJlZW4KLQkgcmV1c2VkLiAgV2UgY2FuIGVsaW1pbmF0ZSBpdC4KLQkgPz8/IEZvciBub3csIEkgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggY29tcGFjdGluZyB0aGUgc2VjdGlvbiwKLQkgc28ganVzdCBub3AgaXQgb3V0LiAgKi8KLSAgICAgIGlmICghbGl0X3JldXNlZCkKLQl7Ci0JICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfQUxQSEFfTk9ORSk7Ci0JICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0KLQkgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIElOU05fVU5PUCwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0JICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBpcmVsICsgY291bnQ7Ci19Ci0KLXN0YXRpYyBiZmRfdm1hCi1lbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbCAoaW5mbywgc3ltdmFsKQotICAgICBzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBzeW12YWw7Ci17Ci0gIC8qIElmIHRoZSBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgZ3AsIGFuZCB3ZSBjYW4gaWRlbnRpZnkgdGhhdCB0aGUKLSAgICAgZnVuY3Rpb24gZG9lcyBub3QgdXNlIGl0cyBmdW5jdGlvbiBwb2ludGVyLCB3ZSBjYW4gZWxpbWluYXRlIHRoZQotICAgICBhZGRyZXNzIGxvYWQuICAqLwotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgbWFya2VkIE5PUFYsIHdlIGFyZSBiZWluZyB0b2xkIHRoZSBmdW5jdGlvbiBuZXZlcgotICAgICBuZWVkcyBpdHMgcHJvY2VkdXJlIHZhbHVlLiAgKi8KLSAgaWYgKGluZm8tPm90aGVyID09IFNUT19BTFBIQV9OT1BWKQotICAgIHJldHVybiBzeW12YWw7Ci0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgU1REX0dQLCB3ZSBhcmUgYmVpbmcgdG9sZCB0aGUgZnVuY3Rpb24gZG9lcwotICAgICBhIG5vcm1hbCBsZGdwIGluIHRoZSBmaXJzdCB0d28gd29yZHMuICAqLyAKLSAgZWxzZSBpZiAoaW5mby0+b3RoZXIgPT0gU1RPX0FMUEhBX1NURF9HUExPQUQpCi0gICAgOwotCi0gIC8qIE90aGVyd2lzZSwgd2UgbWF5IGJlIGFibGUgdG8gaWRlbnRpZnkgYSBHUCBsb2FkIGluIHRoZSBmaXJzdCB0d28KLSAgICAgd29yZHMsIHdoaWNoIHdlIGNhbiB0aGVuIHNraXAuICAqLwotICBlbHNlIAotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICp0c2VjX3JlbG9jcywgKnRzZWNfcmVsZW5kLCAqdHNlY19mcmVlLCAqZ3BkaXNwOwotICAgICAgYmZkX3ZtYSBvZnM7Ci0KLSAgICAgIC8qIExvYWQgdGhlIHJlbG9jYXRpb25zIGZyb20gdGhlIHNlY3Rpb24gdGhhdCB0aGUgdGFyZ2V0IHN5bWJvbCBpcyBpbi4gKi8KLSAgICAgIGlmIChpbmZvLT5zZWMgPT0gaW5mby0+dHNlYykKLQl7Ci0JICB0c2VjX3JlbG9jcyA9IGluZm8tPnJlbG9jczsKLQkgIHRzZWNfcmVsZW5kID0gaW5mby0+cmVsZW5kOwotCSAgdHNlY19mcmVlID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdHNlY19yZWxvY3MgPSAoX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgICAgIChpbmZvLT5hYmZkLCBpbmZvLT50c2VjLCAoUFRSKSBOVUxMLAotCQkJIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJIGluZm8tPmxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgIGlmICh0c2VjX3JlbG9jcyA9PSBOVUxMKQotCSAgICByZXR1cm4gMDsKLQkgIHRzZWNfcmVsZW5kID0gdHNlY19yZWxvY3MgKyBpbmZvLT50c2VjLT5yZWxvY19jb3VudDsKLQkgIHRzZWNfZnJlZSA9IChpbmZvLT5saW5rX2luZm8tPmtlZXBfbWVtb3J5ID8gTlVMTCA6IHRzZWNfcmVsb2NzKTsKLQl9Ci0KLSAgICAgIC8qIFJlY292ZXIgdGhlIHN5bWJvbCdzIG9mZnNldCB3aXRoaW4gdGhlIHNlY3Rpb24uICAqLwotICAgICAgb2ZzID0gKHN5bXZhbCAtIGluZm8tPnRzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgIC0gaW5mby0+dHNlYy0+b3V0cHV0X29mZnNldCk7Ci0gIAotICAgICAgLyogTG9vayBmb3IgYSBHUERJU1AgcmVsb2MuICAqLwotICAgICAgZ3BkaXNwID0gKGVsZjY0X2FscGhhX2ZpbmRfcmVsb2NfYXRfb2ZzCi0JCSh0c2VjX3JlbG9jcywgdHNlY19yZWxlbmQsIG9mcywgUl9BTFBIQV9HUERJU1ApKTsKLQotICAgICAgaWYgKCFncGRpc3AgfHwgZ3BkaXNwLT5yX2FkZGVuZCAhPSA0KQotCXsKLQkgIGlmICh0c2VjX2ZyZWUpCi0JICAgIGZyZWUgKHRzZWNfZnJlZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBpZiAodHNlY19mcmVlKQotICAgICAgICBmcmVlICh0c2VjX2ZyZWUpOwotICAgIH0KLQotICAvKiBXZSd2ZSBub3cgZGV0ZXJtaW5lZCB0aGF0IHdlIGNhbiBza2lwIGFuIGluaXRpYWwgZ3AgbG9hZC4gIFZlcmlmeSAKLSAgICAgdGhhdCB0aGUgY2FsbCBhbmQgdGhlIHRhcmdldCB1c2UgdGhlIHNhbWUgZ3AuICAgKi8KLSAgaWYgKGluZm8tPmxpbmtfaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBpbmZvLT50c2VjLT5vd25lci0+eHZlYwotICAgICAgfHwgaW5mby0+Z290b2JqICE9IGFscGhhX2VsZl90ZGF0YSAoaW5mby0+dHNlYy0+b3duZXIpLT5nb3RvYmopCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIHN5bXZhbCArIDg7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZSAoaW5mbywgc3ltdmFsLCBpcmVsKQotICAgICBzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBzeW12YWw7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsOwotewotICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgYmZkX3NpZ25lZF92bWEgZGlzcDsKLQotICAvKiBHZXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGluZm8tPmFiZmQsIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCi0gIGlmIChpbnNuID4+IDI2ICE9IE9QX0xEUSkKLSAgICB7Ci0gICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgKCIlczogJXMrMHglbHg6IHdhcm5pbmc6IExJVEVSQUwgcmVsb2NhdGlvbiBhZ2FpbnN0IHVuZXhwZWN0ZWQgaW5zbiIsCi0JYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIGluZm8tPnNlYy0+bmFtZSwKLQkodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBTbyB3ZSBhcmVuJ3QgdG9sZCBtdWNoLiAgRG8gd2hhdCB3ZSBjYW4gd2l0aCB0aGUgYWRkcmVzcyBsb2FkIGFuZAotICAgICBmYWtlIHRoZSByZXN0LiAgQWxsIG9mIHRoZSBvcHRpbWl6YXRpb25zIGhlcmUgcmVxdWlyZSB0aGF0IHRoZQotICAgICBvZmZzZXQgZnJvbSB0aGUgR1AgZml0IGluIDE2IGJpdHMuICAqLwotCi0gIGRpc3AgPSBzeW12YWwgLSBpbmZvLT5ncDsKLSAgaWYgKGRpc3AgPCAtMHg4MDAwIHx8IGRpc3AgPj0gMHg4MDAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE9uIHRoZSBMSVRFUkFMIGluc3RydWN0aW9uIGl0c2VsZiwgY29uc2lkZXIgZXhjaGFuZ2luZwotICAgICBgbGRxIFIsWChncCknIGZvciBgbGRhIFIsWShncCknLiAgKi8KLQotICBpbnNuID0gKE9QX0xEQSA8PCAyNikgfCAoaW5zbiAmIDB4MDNmZjAwMDApOwotICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLSAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0KLSAgaXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwgUl9BTFBIQV9HUFJFTExPVyk7Ci0gIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLQotICAvKiBSZWR1Y2UgdGhlIHVzZSBjb3VudCBvbiB0aGlzIGdvdCBlbnRyeSBieSBvbmUsIHBvc3NpYmx5Ci0gICAgIGVsaW1pbmF0aW5nIGl0LiAgKi8KLSAgaW5mby0+Z290ZW50LT51c2VfY291bnQgLT0gMTsKLSAgYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPnRvdGFsX2dvdF9lbnRyaWVzIC09IDE7Ci0gIGlmICghaW5mby0+aCkKLSAgICBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+bl9sb2NhbF9nb3RfZW50cmllcyAtPSAxOwotCi0gIC8qID8/PyBTZWFyY2ggZm9yd2FyZCB0aHJvdWdoIHRoaXMgYmFzaWMgYmxvY2sgbG9va2luZyBmb3IgaW5zbnMKLSAgICAgdGhhdCB1c2UgdGhlIHRhcmdldCByZWdpc3Rlci4gIFN0b3AgYWZ0ZXIgYW4gaW5zbiBtb2RpZnlpbmcgdGhlCi0gICAgIHJlZ2lzdGVyIGlzIHNlZW4sIG9yIGFmdGVyIGEgYnJhbmNoIG9yIGNhbGwuCi0KLSAgICAgQW55IHN1Y2ggbWVtb3J5IGxvYWQgaW5zbiBtYXkgYmUgc3Vic3RpdHV0ZWQgYnkgYSBsb2FkIGRpcmVjdGx5Ci0gICAgIG9mZiB0aGUgR1AuICBUaGlzIGFsbG93cyB0aGUgbWVtb3J5IGxvYWQgaW5zbiB0byBiZSBpc3N1ZWQgYmVmb3JlCi0gICAgIHRoZSBjYWxjdWxhdGVkIEdQIHJlZ2lzdGVyIHdvdWxkIG90aGVyd2lzZSBiZSByZWFkeS4gCi0KLSAgICAgQW55IHN1Y2gganNyIGluc24gY2FuIGJlIHJlcGxhY2VkIGJ5IGEgYnNyIGlmIGl0IGlzIGluIHJhbmdlLgotCi0gICAgIFRoaXMgd291bGQgbWVhbiB0aGF0IHdlJ2QgaGF2ZSB0byBfYWRkXyByZWxvY2F0aW9ucywgdGhlIHBhaW4gb2YKLSAgICAgd2hpY2ggZ2l2ZXMgb25lIHBhdXNlLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGY2NF9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGY2NF9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXM7Ci0gIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvIGluZm87Ci0KLSAgLyogV2UgYXJlIG5vdCBjdXJyZW50bHkgY2hhbmdpbmcgYW55IHNpemVzLCBzbyBvbmx5IG9uZSBwYXNzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YShhYmZkKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0KLSAgLyogTG9hZCB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotICBpbmZvLmFiZmQgPSBhYmZkOwotICBpbmZvLnNlYyA9IHNlYzsKLSAgaW5mby5saW5rX2luZm8gPSBsaW5rX2luZm87Ci0gIGluZm8ucmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotICBpbmZvLnJlbGVuZCA9IGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEZpbmQgdGhlIEdQIGZvciB0aGlzIG9iamVjdC4gICovCi0gIGluZm8uZ290b2JqID0gYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+Z290b2JqOwotICBpZiAoaW5mby5nb3RvYmopCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGluZm8uZ290b2JqKS0+Z290OwotICAgICAgaW5mby5ncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChpbmZvLmdvdG9iaik7Ci0gICAgICBpZiAoaW5mby5ncCA9PSAwKQotCXsKLQkgIGluZm8uZ3AgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICsgMHg4MDAwKTsKLQkgIF9iZmRfc2V0X2dwX3ZhbHVlIChpbmZvLmdvdG9iaiwgaW5mby5ncCk7Ci0JfQotICAgIH0KLQotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gICAgICBpZiAoRUxGNjRfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfQUxQSEFfTElURVJBTCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChpbmZvLmNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGluZm8uY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChpbmZvLmNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBpbmZvLmNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGluZm8uY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGY2NF9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHRzeW1zID0gKChFbGY2NF9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0JICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGluZm8udHNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMCAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaW5mby50c2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpbmZvLnRzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpbmZvLnRzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZSAKLQkgICAgY29udGludWU7CS8qIHdobyBrbm93cy4gKi8KLQotCSAgaW5mby5oID0gTlVMTDsKLQkgIGluZm8ub3RoZXIgPSBpc3ltLnN0X290aGVyOwotCSAgZ290ZW50ID0gbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0oaXJlbC0+cl9pbmZvKV07Ci0JICBzeW12YWwgPSBpc3ltLnN0X3ZhbHVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaW5keCA9IEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07Ci0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0JICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICAvKiBXZSBjYW4ndCBkbyBhbnRoaW5nIHdpdGggdW5kZWZpbmVkIG9yIGR5bmFtaWMgc3ltYm9scy4gICovCi0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotCSAgICAgIHx8IGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgbGlua19pbmZvKSkKLQkgICAgY29udGludWU7Ci0KLQkgIGluZm8uaCA9IGg7Ci0JICBpbmZvLmdvdGVudCA9IGdvdGVudDsKLQkgIGluZm8udHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgaW5mby5vdGhlciA9IGgtPnJvb3Qub3RoZXI7Ci0JICBnb3RlbnQgPSBoLT5nb3RfZW50cmllczsKLQkgIHN5bXZhbCA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZTsKLQl9Ci0KLSAgICAgIC8qIFNlYXJjaCBmb3IgdGhlIGdvdCBlbnRyeSB0byBiZSB1c2VkIGJ5IHRoaXMgcmVsb2NhdGlvbi4gICovCi0gICAgICB3aGlsZSAoZ290ZW50LT5nb3RvYmogIT0gaW5mby5nb3RvYmogfHwgZ290ZW50LT5hZGRlbmQgIT0gaXJlbC0+cl9hZGRlbmQpCi0JZ290ZW50ID0gZ290ZW50LT5uZXh0OwotICAgICAgaW5mby5nb3RlbnQgPSBnb3RlbnQ7Ci0KLSAgICAgIHN5bXZhbCArPSBpbmZvLnRzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbmZvLnRzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBzeW12YWwgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLSAgICAgIEJGRF9BU1NFUlQoaW5mby5nb3RlbnQgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGV4aXN0IExJVFVTRSByZWxvY2F0aW9ucyBpbW1lZGlhdGVseSBmb2xsb3dpbmcsIHRoaXMKLQkgb3BlbnMgdXAgYWxsIHNvcnRzIG9mIGludGVyZXN0aW5nIG9wdGltaXphdGlvbnMsIGJlY2F1c2Ugd2UKLQkgbm93IGtub3cgZXZlcnkgbG9jYXRpb24gdGhhdCB0aGlzIGFkZHJlc3MgbG9hZCBpcyB1c2VkLiAgKi8KLQotICAgICAgaWYgKGlyZWwrMSA8IGlyZWxlbmQgJiYgRUxGNjRfUl9UWVBFIChpcmVsWzFdLnJfaW5mbykgPT0gUl9BTFBIQV9MSVRVU0UpCi0JewotCSAgaXJlbCA9IGVsZjY0X2FscGhhX3JlbGF4X3dpdGhfbGl0dXNlICgmaW5mbywgc3ltdmFsLCBpcmVsLCBpcmVsZW5kKTsKLQkgIGlmIChpcmVsID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIWVsZjY0X2FscGhhX3JlbGF4X3dpdGhvdXRfbGl0dXNlICgmaW5mbywgc3ltdmFsLCBpcmVsKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoIWVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby5jaGFuZ2VkX3JlbG9jcykKLSAgICB7Ci0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgfQotICBlbHNlIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICB9Ci0KLSAgaWYgKGluZm8uY2hhbmdlZF9jb250ZW50cykKLSAgICB7Ci0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGluZm8uY29udGVudHM7Ci0gICAgfQotICBlbHNlIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gaW5mby5jb250ZW50czsKLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JfQotICAgIH0KLQotICAqYWdhaW4gPSBpbmZvLmNoYW5nZWRfY29udGVudHMgfHwgaW5mby5jaGFuZ2VkX3JlbG9jczsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogUExUL0dPVCBTdHVmZiAqLwotI2RlZmluZSBQTFRfSEVBREVSX1NJWkUgMzIKLSNkZWZpbmUgUExUX0hFQURFUl9XT1JEMQkweGMzNjAwMDAwCS8qIGJyICAgJDI3LC4rNCAgICAgKi8KLSNkZWZpbmUgUExUX0hFQURFUl9XT1JEMgkweGE3N2IwMDBjCS8qIGxkcSAgJDI3LDEyKCQyNykgKi8KLSNkZWZpbmUgUExUX0hFQURFUl9XT1JEMwkweDQ3ZmYwNDFmCS8qIG5vcCAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUExUX0hFQURFUl9XT1JENAkweDZiN2IwMDAwCS8qIGptcCAgJDI3LCgkMjcpICAgKi8KLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotI2RlZmluZSBQTFRfRU5UUllfV09SRDEJCTB4YzM4MDAwMDAJLyogYnIgICAkMjgsIHBsdDAgICAqLwotI2RlZmluZSBQTFRfRU5UUllfV09SRDIJCTAKLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQzCQkwCi0KLSNkZWZpbmUgTUFYX0dPVF9FTlRSSUVTCQkoNjQqMTAyNCAvIDgpCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xkLnNvIgotDAotLyogSGFuZGxlIGFuIEFscGhhIHNwZWNpZmljIHNlY3Rpb24gd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgVGhpcwotICAgaXMgY2FsbGVkIHdoZW4gZWxmY29kZS5oIGZpbmRzIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZS4KLSAgIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgU0hGX0FMUEhBX0dQUkVMIGZsYWcsIGJ1dCBJJ20gbm90IHN1cmUKLSAgIGhvdyB0by4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjY0X0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0KLSAgLyogVGhlcmUgb3VnaHQgdG8gYmUgYSBwbGFjZSB0byBrZWVwIEVMRiBiYWNrZW5kIHNwZWNpZmljIGZsYWdzLCBidXQKLSAgICAgYXQgdGhlIG1vbWVudCB0aGVyZSBpc24ndCBvbmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHNlY3Rpb25zIGJ5IHRoZWlyIG5hbWUsIGluc3RlYWQuICBGb3J0dW5hdGVseSwgdGhlIEFCSSBnaXZlcwotICAgICBzdWdnZXN0ZWQgbmFtZXMgZm9yIGFsbCB0aGUgTUlQUyBzcGVjaWZpYyBzZWN0aW9ucywgc28gd2Ugd2lsbAotICAgICBwcm9iYWJseSBnZXQgYXdheSB3aXRoIHRoaXMuICAqLwotICBzd2l0Y2ggKGhkci0+c2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfQUxQSEFfREVCVUc6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLm1kZWJ1ZyIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICAgIGNhc2UgU0hUX0FMUEhBX1JFR0lORk86Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSAhPSAwCi0JICB8fCBoZHItPnNoX3NpemUgIT0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuZXdzZWN0ID0gaGRyLT5iZmRfc2VjdGlvbjsKLQotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9BTFBIQV9ERUJVRykKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QsCi0JCQkJICAgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCkKLQkJCQkgICAgfCBTRUNfREVCVUdHSU5HKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgLyogRm9yIGEgLnJlZ2luZm8gc2VjdGlvbiwgc2V0IHRoZSBncCB2YWx1ZSBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24KLSAgICAgZnJvbSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgV2UgbmVlZCB0aGUgZ3AgdmFsdWUgd2hpbGUKLSAgICAgcHJvY2Vzc2luZyByZWxvY3MsIHNvIHdlIGp1c3QgZ2V0IGl0IG5vdy4gICovCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX0FMUEhBX1JFR0lORk8pCi0gICAgewotICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0gICAgICBFbGY2NF9SZWdJbmZvIHM7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbmV3c2VjdCwgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX3JlZ2luZm9faW4gKGFiZmQsICZleHQsICZzKTsKLSAgICAgIGVsZl9ncCAoYWJmZCkgPSBzLnJpX2dwX3ZhbHVlOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYW4gQWxwaGEgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjY0X0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9BTFBIQV9ERUJVRzsKLSAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5tZGVidWcgc2VjdGlvbiBoYXMgYW4KLSAgICAgICAgIGVudHNpemUgb2YgMC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwICkKLQloZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgZWxzZQotCWhkci0+c2hfZW50c2l6ZSA9IDE7Ci0gICAgfQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9BTFBIQV9SRUdJTkZPOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBoYXMgYW4KLSAgICAgICAgIGVudHNpemUgb2YgMHgxOC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCWhkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLQotICAgICAgLyogRm9yY2UgdGhlIHNlY3Rpb24gc2l6ZSB0byB0aGUgY29ycmVjdCB2YWx1ZSwgZXZlbiBpZiB0aGUKLQkgbGlua2VyIHRoaW5rcyBpdCBpcyBsYXJnZXIuICBUaGUgbGluayByb3V0aW5lIGJlbG93IHdpbGwgb25seQotCSB3cml0ZSBvdXQgdGhpcyBtdWNoIGRhdGEgZm9yIC5yZWdpbmZvLiAgKi8KLSAgICAgIGhkci0+c2hfc2l6ZSA9IHNlYy0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5oYXNoIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5hbWljIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5zdHIiKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICBoZHItPnNoX2luZm8gPSBTSVpFT0ZfQUxQSEFfRFlOU1lNX1NFQ05BTUVTOwotICAgIH0KLSNlbmRpZgotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMUEhBX0dQUkVMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgdXNlIGl0IHRvIHB1dCAuY29tbSBpdGVtcyBpbiAuc2JzcywgYW5kIG5vdCAuYnNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCi0gICAgICAmJiAhaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBzeW0tPnN0X3NpemUgPD0gYmZkX2dldF9ncF9zaXplIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gLUcgbm4gYnl0ZXMgYXJlCi0JIGF1dG9tYXRpY2FsbHkgcHV0IGludG8gLnNic3MuICAqLwotCi0gICAgICBhc2VjdGlvbiAqc2NvbW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zY29tbW9uIik7Ci0KLSAgICAgIGlmIChzY29tbSA9PSBOVUxMKQotCXsKLQkgIHNjb21tID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5zY29tbW9uIik7Ci0JICBpZiAoc2NvbW0gPT0gTlVMTAotCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNjb21tLCAoU0VDX0FMTE9DCi0JCQkJCQkgICAgICAgfCBTRUNfSVNfQ09NTU9OCi0JCQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgKnNlY3AgPSBzY29tbTsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIHRoZSAuZ290IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nb3QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQpKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT5nb3QgPSBzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYWxsIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgLyogV2UgbmVlZCB0byBjcmVhdGUgLnBsdCwgLnJlbGEucGx0LCAuZ290LCBhbmQgLnJlbGEuZ290IHNlY3Rpb25zLiAgKi8KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5wbHQiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCSAgICB8IFNFQ19DT0RFKSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8gYXQgdGhlIHN0YXJ0IG9mIHRoZQotICAgICAucGx0IHNlY3Rpb24uICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JIChpbmZvLCBhYmZkLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yZWxhLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGNyZWF0ZWQgYSAuZ290IHNlY3Rpb24gZm9yIHRoaXMgb2JqZWN0LCBidXQKLSAgICAgd2UgZGVmaW5pdGVseSBoYXZuJ3QgZG9uZSB0aGUgcmVzdCBvZiB0aGUgd29yay4gICovCi0KLSAgaWYgKCFlbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbihhYmZkLCAiLnJlbGEuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKLSAgICAgZHlub2JqJ3MgLmdvdCBzZWN0aW9uLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgbGlua2VyIHNjcmlwdAotICAgICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgaWYgd2UgYXJlIG5vdCBjcmVhdGluZwotICAgICBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsCi0JIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+Z290LCAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkgZmFsc2UsIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290ID0gaDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlYWQgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSAubWRlYnVnIHNlY3Rpb24gaW50byBhCi0gICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIHNlY3Rpb24sIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci17Ci0gIEhEUlIgKnN5bWhkcjsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIGNoYXIgKmV4dF9oZHIgPSBOVUxMOwotCi0gIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIG1lbXNldCAoZGVidWcsIDAsIHNpemVvZigqZGVidWcpKTsKLQotICBleHRfaGRyID0gKGNoYXIgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpOwotICBpZiAoZXh0X2hkciA9PSBOVUxMICYmIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgZXh0X2hkciwgKGZpbGVfcHRyKSAwLAotCQkJCXN3YXAtPmV4dGVybmFsX2hkcl9zaXplKQotICAgICAgPT0gZmFsc2UpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gICgqc3dhcC0+c3dhcF9oZHJfaW4pIChhYmZkLCBleHRfaGRyLCBzeW1oZHIpOwotCi0gIC8qIFRoZSBzeW1ib2xpYyBoZWFkZXIgY29udGFpbnMgYWJzb2x1dGUgZmlsZSBvZmZzZXRzIGFuZCBzaXplcyB0bwotICAgICByZWFkLiAgKi8KLSNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCi0gICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAotICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIHN5bWhkci0+b2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAlcCi0JICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCi0JCQlhYmZkKSAhPSBzaXplICogc3ltaGRyLT5jb3VudCkpCQkJXAotCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKLSAgICB9Ci0KLSAgUkVBRCAobGluZSwgY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksIHVuc2lnbmVkIGNoYXIgKik7Ci0gIFJFQUQgKGV4dGVybmFsX2RuciwgY2JEbk9mZnNldCwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfb3B0LCBjYk9wdE9mZnNldCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JdW5pb24gYXV4X2V4dCAqKTsKLSAgUkVBRCAoc3MsIGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKLSAgUkVBRCAoc3NleHQsIGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZXh0LCBjYkV4dE9mZnNldCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsIFBUUik7Ci0jdW5kZWYgUkVBRAotCi0gIGRlYnVnLT5mZHIgPSBOVUxMOwotICBkZWJ1Zy0+YWRqdXN0ID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGV4dF9oZHIgIT0gTlVMTCkKLSAgICBmcmVlIChleHRfaGRyKTsKLSAgaWYgKGRlYnVnLT5saW5lICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmxpbmUpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2RuciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9kbnIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3N5bSAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9zeW0pOwotICBpZiAoZGVidWctPmV4dGVybmFsX29wdCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9vcHQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOwotICBpZiAoZGVidWctPnNzICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzKTsKLSAgaWYgKGRlYnVnLT5zc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5zc2V4dCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Zkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3JmZCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWxwaGEgRUxGIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICckJy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICckJzsKLX0KLQotLyogQWxwaGEgRUxGIGZvbGxvd3MgTUlQUyBFTEYgaW4gdXNpbmcgYSBzcGVjaWFsIGZpbmRfbmVhcmVzdF9saW5lCi0gICByb3V0aW5lIGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2UKLSAgIHN0aWxsIGNhbGwgdGhpcyBtaXBzX2VsZl9maW5kX2xpbmUgYmVjYXVzZSBvZiB0aGUgc2xvdAotICAgZmluZF9saW5lX2luZm8gaW4gZWxmX29ial90ZGF0YSBpcyBkZWNsYXJlZCB0aGF0IHdheS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZDsKLSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSBpOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwKLQkJCSAgICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYXNlY3Rpb24gKm1zZWM7Ci0KLSAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpOwotICBpZiAobXNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIG9yaWdmbGFnczsKLSAgICAgIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpOwotICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBzd2FwID0KLQlnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgZHVyaW5nIGEgbGluaywgYWxwaGFfZWxmX2ZpbmFsX2xpbmsgbWF5IGhhdmUKLQkgY2xlYXJlZCB0aGUgU0VDX0hBU19DT05URU5UUyBmaWVsZC4gIFdlIGZvcmNlIGl0IGJhY2sgb24gaGVyZQotCSBpZiBhcHByb3ByaWF0ZSAod2hpY2ggaXQgbm9ybWFsbHkgd2lsbCBiZSkuICAqLwotICAgICAgb3JpZ2ZsYWdzID0gbXNlYy0+ZmxhZ3M7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobXNlYyktPnRoaXNfaGRyLnNoX3R5cGUgIT0gU0hUX05PQklUUykKLQltc2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gICAgICBmaSA9IGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvOwotICAgICAgaWYgKGZpID09IE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKLQkgIGNoYXIgKmZyYXdfc3JjOwotCSAgY2hhciAqZnJhd19lbmQ7Ci0JICBzdHJ1Y3QgZmRyICpmZHJfcHRyOwotCi0JICBmaSA9ICgoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqKQotCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUpKSk7Ci0JICBpZiAoZmkgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoIWVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgbXNlYywgJmZpLT5kKSkKLQkgICAgewotCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBTd2FwIGluIHRoZSBGRFIgaW5mb3JtYXRpb24uICAqLwotCSAgZmktPmQuZmRyID0gKChzdHJ1Y3QgZmRyICopCi0JCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAoZmktPmQuc3ltYm9saWNfaGVhZGVyLmlmZE1heCAqCi0JCQkJICAgc2l6ZW9mIChzdHJ1Y3QgZmRyKSkpKTsKLQkgIGlmIChmaS0+ZC5mZHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZXh0ZXJuYWxfZmRyX3NpemUgPSBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKLQkgIGZkcl9wdHIgPSBmaS0+ZC5mZHI7Ci0JICBmcmF3X3NyYyA9IChjaGFyICopIGZpLT5kLmV4dGVybmFsX2ZkcjsKLQkgIGZyYXdfZW5kID0gKGZyYXdfc3JjCi0JCSAgICAgICsgZmktPmQuc3ltYm9saWNfaGVhZGVyLmlmZE1heCAqIGV4dGVybmFsX2Zkcl9zaXplKTsKLQkgIGZvciAoOyBmcmF3X3NyYyA8IGZyYXdfZW5kOyBmcmF3X3NyYyArPSBleHRlcm5hbF9mZHJfc2l6ZSwgZmRyX3B0cisrKQotCSAgICAoKnN3YXAtPnN3YXBfZmRyX2luKSAoYWJmZCwgKFBUUikgZnJhd19zcmMsIGZkcl9wdHIpOwotCi0JICBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9IGZpOwotCi0JICAvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHRvIGV2ZXIgZnJlZSB0aGlzIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgIGZpbmRfbmVhcmVzdF9saW5lIGlzIGVpdGhlciBjYWxsZWQgYWxsIHRoZSB0aW1lLCBhcyBpbgotICAgICAgICAgICAgIG9iamR1bXAgLWwsIHNvIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgc2F2ZWQsIG9yIGl0IGlzCi0gICAgICAgICAgICAgcmFyZWx5IGNhbGxlZCwgYXMgaW4gbGQgZXJyb3IgbWVzc2FnZXMsIHNvIHRoZSBtZW1vcnkKLSAgICAgICAgICAgICB3YXN0ZWQgaXMgdW5pbXBvcnRhbnQuICBTdGlsbCwgaXQgd291bGQgcHJvYmFibHkgYmUgYQotICAgICAgICAgICAgIGdvb2QgaWRlYSBmb3IgZnJlZV9jYWNoZWRfaW5mbyB0byB0aHJvdyBpdCBhd2F5LiAgKi8KLQl9Ci0KLSAgICAgIGlmIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsICZmaS0+ZCwgc3dhcCwKLQkJCQkgICZmaS0+aSwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgbGluZV9wdHIpKQotCXsKLQkgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLSAgICB9Ci0KLSAgLyogRmFsbCBiYWNrIG9uIHRoZSBnZW5lcmljIEVMRiBmaW5kX25lYXJlc3RfbGluZSByb3V0aW5lLiAgKi8KLQotICByZXR1cm4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyKTsKLX0KLQwKLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gYWxwaGFfZWxmX291dHB1dF9leHRzeW0uICAqLwotCi1zdHJ1Y3QgZXh0c3ltX2luZm8KLXsKLSAgYmZkICphYmZkOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBib29sZWFuIHN0cmlwOwotICBhc2VjdGlvbiAqc2VjLCAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgaWYgKGgtPnJvb3QuaW5keCA9PSAtMikKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICAgICAgfHwgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCi0gICAgICAgICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICAgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UgaWYgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLSAgICAgICAgICB8fCAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLSAgICAgICAgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChlaW5mby0+aW5mby0+a2VlcF9oYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5lc3ltLmlmZCA9PSAtMikKLSAgICB7Ci0gICAgICBoLT5lc3ltLmptcHRibCA9IDA7Ci0gICAgICBoLT5lc3ltLmNvYm9sX21haW4gPSAwOwotICAgICAgaC0+ZXN5bS53ZWFrZXh0ID0gMDsKLSAgICAgIGgtPmVzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5pZmQgPSBpZmROaWw7Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RHbG9iYWw7Ci0KLSAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgICAgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQotICAgICAgICAgLyogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgc3ltYm9sIGggaXMgdGhlIG9uZSBmcm9tCi0gICAgICAgICAgICB0aGUgYW5vdGhlciBzaGFyZWQgbGlicmFyeSwgT1VUUFVUX1NFQ1RJT04gbWF5IGJlIG51bGwuICAqLwotICAgICAgICAgaWYgKG91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0gICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCi0gICAgICAgICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0RhdGE7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJvZGF0YSIpID09IDAKLSAgICAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSRGF0YTsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0luaXQ7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotICAgICAgICAgICB9Ci0gICAgICAgfQotCi0gICAgICBoLT5lc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgfQotCi0gIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBoLT5yb290LnJvb3QudS5jLnNpemU7Ci0gIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjU0NvbW1vbikKLSAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0KLSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgICAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgZWxzZQotICAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgLyogU2V0IHR5cGUgYW5kIHZhbHVlIGZvciBhIHN5bWJvbCB3aXRoIGEgZnVuY3Rpb24gc3R1Yi4gICovCi0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdFByb2M7Ci0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZWluZm8tPmFiZmQsICIucGx0Iik7Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QucGx0Lm9mZnNldAotCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0JfQotI2lmIDAgLyogRklYTUU/ICAqLwotICAgICAgaC0+ZXN5bS5pZmQgPSAwOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGVpbmZvLT5hYmZkLCBlaW5mby0+ZGVidWcsIGVpbmZvLT5zd2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+ZXN5bSkpCi0gICAgewotICAgICAgZWluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGSVhNRTogIENyZWF0ZSBhIHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIGZyb20gdGhlIC5tZGVidWcgc2VjdGlvbi4KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKGhhbmRsZSwgYWJmZCwgaW5mbywgcywgZGVidWcpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0qLwotDAotLyogSGFuZGxlIGR5bmFtaWMgcmVsb2NhdGlvbnMgd2hlbiBkb2luZyBhbiBBbHBoYSBFTEYgbGluay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgY29uc3QgY2hhciAqcmVsX3NlY19uYW1lOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKmxvY2FsX2dvdF9lbnRyaWVzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICBpbnQgZ290X2NyZWF0ZWQ7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0KLSAgc3JlbG9jID0gTlVMTDsKLSAgcmVsX3NlY19uYW1lID0gTlVMTDsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyhhYmZkKTsKLSAgbG9jYWxfZ290X2VudHJpZXMgPSBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmxvY2FsX2dvdF9lbnRyaWVzOwotICBnb3RfY3JlYXRlZCA9IDA7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgKytyZWwpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keCwgcl90eXBlOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0JfQotICAgICAgcl90eXBlID0gRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfQUxQSEFfTElURVJBTDoKLQkgIHsKLQkgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQkgICAgaW50IGZsYWdzID0gMDsKLQotCSAgICBpZiAoaCkKLQkgICAgICB7Ci0JCS8qIFNlYXJjaCBmb3IgYW5kIHBvc3NpYmx5IGNyZWF0ZSBhIGdvdCBlbnRyeS4gICovCi0JCWZvciAoZ290ZW50ID0gaC0+Z290X2VudHJpZXM7IGdvdGVudCA7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQkJICBpZiAoZ290ZW50LT5nb3RvYmogPT0gYWJmZCAmJgotCQkgICAgICBnb3RlbnQtPmFkZGVuZCA9PSByZWwtPnJfYWRkZW5kKQotCQkgICAgYnJlYWs7Ci0KLQkJaWYgKCFnb3RlbnQpCi0JCSAgewotCQkgICAgZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKQotCQkJICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSkpKTsKLQkJICAgIGlmICghZ290ZW50KQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIGdvdGVudC0+Z290b2JqID0gYWJmZDsKLQkJICAgIGdvdGVudC0+YWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJICAgIGdvdGVudC0+Z290X29mZnNldCA9IC0xOwotCQkgICAgZ290ZW50LT5mbGFncyA9IDA7Ci0JCSAgICBnb3RlbnQtPnVzZV9jb3VudCA9IDE7Ci0KLQkJICAgIGdvdGVudC0+bmV4dCA9IGgtPmdvdF9lbnRyaWVzOwotCQkgICAgaC0+Z290X2VudHJpZXMgPSBnb3RlbnQ7Ci0KLQkJICAgIGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPnRvdGFsX2dvdF9lbnRyaWVzKys7Ci0JCSAgfQotCQllbHNlCi0JCSAgZ290ZW50LT51c2VfY291bnQgKz0gMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIFRoaXMgaXMgYSBsb2NhbCAuZ290IGVudHJ5IC0tIHJlY29yZCBmb3IgbWVyZ2UuICAqLwotCQlpZiAoIWxvY2FsX2dvdF9lbnRyaWVzKQotCQkgIHsKLQkJICAgIHNpemVfdCBzaXplOwotCQkgICAgc2l6ZSA9IChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkgICAgKiBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICopKTsKLQotCQkgICAgbG9jYWxfZ290X2VudHJpZXMgPSAoKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqKQotCQkJCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplKSk7Ci0JCSAgICBpZiAoIWxvY2FsX2dvdF9lbnRyaWVzKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIG1lbXNldCAobG9jYWxfZ290X2VudHJpZXMsIDAsIHNpemUpOwotCQkgICAgYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfZ290X2VudHJpZXMgPQotCQkgICAgICBsb2NhbF9nb3RfZW50cmllczsKLQkJICB9Ci0KLQkJZm9yIChnb3RlbnQgPSBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyldOwotCQkgICAgIGdvdGVudCAhPSBOVUxMICYmIGdvdGVudC0+YWRkZW5kICE9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICAgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCQkgIGNvbnRpbnVlOwotCQlpZiAoIWdvdGVudCkKLQkJICB7Ci0JCSAgICBnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICopCi0JCQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5KSkpOwotCQkgICAgaWYgKCFnb3RlbnQpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgZ290ZW50LT5nb3RvYmogPSBhYmZkOwotCQkgICAgZ290ZW50LT5hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQkgICAgZ290ZW50LT5nb3Rfb2Zmc2V0ID0gLTE7Ci0JCSAgICBnb3RlbnQtPmZsYWdzID0gMDsKLQkJICAgIGdvdGVudC0+dXNlX2NvdW50ID0gMTsKLQotCQkgICAgZ290ZW50LT5uZXh0ID0gbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pXTsKLQkJICAgIGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKV0gPSBnb3RlbnQ7Ci0KLQkJICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+dG90YWxfZ290X2VudHJpZXMrKzsKLQkJICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+bl9sb2NhbF9nb3RfZW50cmllcysrOwotCQkgIH0KLQkJZWxzZQotCQkgIGdvdGVudC0+dXNlX2NvdW50ICs9IDE7Ci0JICAgICAgfQotCi0JICAgIC8qIFJlbWVtYmVyIGhvdyB0aGlzIGxpdGVyYWwgaXMgdXNlZCBmcm9tIGl0cyBMSVRVU0VzLgotCSAgICAgICBUaGlzIHdpbGwgYmUgaW1wb3J0YW50IHdoZW4gaXQgY29tZXMgdG8gZGVjaWRlIGlmIHdlIGNhbgotCSAgICAgICBjcmVhdGUgYSAucGx0IGVudHJ5IGZvciBhIGZ1bmN0aW9uIHN5bWJvbC4gICovCi0JICAgIGlmIChyZWwrMSA8IHJlbGVuZAotCQkmJiBFTEY2NF9SX1RZUEUgKHJlbFsxXS5yX2luZm8pID09IFJfQUxQSEFfTElUVVNFKQotCSAgICAgIHsKLQkJZG8KLQkJICB7Ci0JCSAgICArK3JlbDsKLQkJICAgIGlmIChyZWwtPnJfYWRkZW5kID49IDEgJiYgcmVsLT5yX2FkZGVuZCA8PSAzKQotCQkgICAgICBmbGFncyB8PSAxIDw8IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgfQotCQl3aGlsZSAocmVsKzEgPCByZWxlbmQgJiYKLQkJICAgICAgIEVMRjY0X1JfVFlQRSAocmVsWzFdLnJfaW5mbykgPT0gUl9BTFBIQV9MSVRVU0UpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogTm8gTElUVVNFcyAtLSBwcmVzdW1hYmx5IHRoZSBhZGRyZXNzIGlzIG5vdCBiZWluZwotCQkgICBsb2FkZWQgZm9yIG5vdGhpbmcuICAqLwotCQlmbGFncyA9IEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUjsKLQkgICAgICB9Ci0KLQkgICAgZ290ZW50LT5mbGFncyB8PSBmbGFnczsKLQkgICAgaWYgKGgpCi0JICAgICAgewotCQkvKiBNYWtlIGEgZ3Vlc3MgYXMgdG8gd2hldGhlciBhIC5wbHQgZW50cnkgd2lsbCBiZSBuZWVkZWQuICAqLwotCQlpZiAoKGgtPmZsYWdzIHw9IGZsYWdzKSA9PSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMpCi0JCSAgaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCQllbHNlCi0JCSAgaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgICB9Ci0JICB9Ci0JICAvKiBGQUxMVEhSVSAqLwotCi0JY2FzZSBSX0FMUEhBX0dQRElTUDoKLQljYXNlIFJfQUxQSEFfR1BSRUwzMjoKLQljYXNlIFJfQUxQSEFfR1BSRUxISUdIOgotCWNhc2UgUl9BTFBIQV9HUFJFTExPVzoKLQkgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgLmdvdCBoZXJlLCBidXQgdGhlIHNlY3Rpb25zIG11c3QKLQkgICAgIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkgICAgIHNlY3Rpb25zLiAgKi8KLQkgIGlmICghZ290X2NyZWF0ZWQpCi0JICAgIHsKLQkgICAgICBpZiAoIWVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgb2JqZWN0J3MgZ290b2JqIGlzIHNldCB0byBpdHNlbGYgc28KLQkJIHRoYXQgd2UgZGVmYXVsdCB0byBldmVyeSBvYmplY3Qgd2l0aCBpdHMgb3duIC5nb3QuCi0JCSBXZSdsbCBtZXJnZSAuZ290cyBsYXRlciBvbmNlIHdlJ3ZlIGNvbGxlY3RlZCBlYWNoCi0JCSBvYmplY3QncyBpbmZvLiAgKi8KLQkgICAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmdvdG9iaiA9IGFiZmQ7Ci0KLQkgICAgICBnb3RfY3JlYXRlZCA9IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FMUEhBX1NSRUwxNjoKLQljYXNlIFJfQUxQSEFfU1JFTDMyOgotCWNhc2UgUl9BTFBIQV9TUkVMNjQ6Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZBTExUSFJVICovCi0KLQljYXNlIFJfQUxQSEFfUkVGTE9ORzoKLQljYXNlIFJfQUxQSEFfUkVGUVVBRDoKLQkgIGlmIChyZWxfc2VjX25hbWUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHJlbF9zZWNfbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgICAgICAoYWJmZCwgZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgICAgICBlbGZfc2VjdGlvbl9kYXRhKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCSAgICAgIGlmIChyZWxfc2VjX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAocmVsX3NlY19uYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJICAgICByZWxfc2VjX25hbWUrNSkgPT0gMCk7Ci0JICAgIH0KLQotCSAgLyogV2UgbmVlZCB0byBjcmVhdGUgdGhlIHNlY3Rpb24gaGVyZSBub3cgd2hldGhlciB3ZSBldmVudHVhbGx5Ci0JICAgICB1c2UgaXQgb3Igbm90IHNvIHRoYXQgaXQgZ2V0cyBtYXBwZWQgdG8gYW4gb3V0cHV0IHNlY3Rpb24gYnkKLQkgICAgIHRoZSBsaW5rZXIuICBJZiBub3QgdXNlZCwgd2UnbGwga2lsbCBpdCBpbgotCSAgICAgc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KLQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIHJlbF9zZWNfbmFtZSk7Ci0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCByZWxfc2VjX25hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAoU0VDX0FMTE9DfFNFQ19MT0FECi0JCQkJCQkgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDMpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGgpCi0JICAgIHsKLQkgICAgICAvKiBTaW5jZSB3ZSBoYXZuJ3Qgc2VlbiBhbGwgb2YgdGhlIGlucHV0IHN5bWJvbHMgeWV0LCB3ZQotCQkgZG9uJ3Qga25vdyB3aGV0aGVyIHdlJ2xsIGFjdHVhbGx5IG5lZWQgYSBkeW5hbWljIHJlbG9jYXRpb24KLQkJIGVudHJ5IGZvciB0aGlzIHJlbG9jLiAgU28gbWFrZSBhIHJlY29yZCBvZiBpdC4gIE9uY2Ugd2UKLQkJIGZpbmQgb3V0IGlmIHRoaXMgdGhpbmcgbmVlZHMgZHluYW1pYyByZWxvY2F0aW9uIHdlJ2xsCi0JCSBleHBhbmQgdGhlIHJlbG9jYXRpb24gc2VjdGlvbnMgYnkgdGhlIGFwcHJvcHJpYXRlIGFtb3VudC4gKi8KLQotCSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKnJlbnQ7Ci0KLQkgICAgICBmb3IgKHJlbnQgPSBoLT5yZWxvY19lbnRyaWVzOyByZW50OyByZW50ID0gcmVudC0+bmV4dCkKLQkJaWYgKHJlbnQtPnJ0eXBlID09IHJfdHlwZSAmJiByZW50LT5zcmVsID09IHNyZWxvYykKLQkJICBicmVhazsKLQotCSAgICAgIGlmICghcmVudCkKLQkJewotCQkgIHJlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKikKLQkJCSAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5KSkpOwotCQkgIGlmICghcmVudCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIHJlbnQtPnNyZWwgPSBzcmVsb2M7Ci0JCSAgcmVudC0+cnR5cGUgPSByX3R5cGU7Ci0JCSAgcmVudC0+Y291bnQgPSAxOwotCi0JCSAgcmVudC0+bmV4dCA9IGgtPnJlbG9jX2VudHJpZXM7Ci0JCSAgaC0+cmVsb2NfZW50cmllcyA9IHJlbnQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbnQtPmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCBhIFJFTEFUSVZFIHJlbG9jLiAgKi8KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqYWg7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgYWggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloOwotCi0gIC8qIE5vdyB0aGF0IHdlJ3ZlIHNlZW4gYWxsIG9mIHRoZSBpbnB1dCBzeW1ib2xzLCBmaW5hbGl6ZSBvdXIgZGVjaXNpb24KLSAgICAgYWJvdXQgd2hldGhlciB0aGlzIHN5bWJvbCBzaG91bGQgZ2V0IGEgLnBsdCBlbnRyeS4gICovCi0KLSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgJiYgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKGgsIGluZm8pCi0gICAgICAmJiAoKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLQkgICAmJiAhKGFoLT5mbGFncyAmIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUikpCi0JICB8fCAoaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0JICAgICAgJiYgYWgtPmZsYWdzID09IEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQykpCi0gICAgICAvKiBEb24ndCBwcmV2ZW50IG90aGVyd2lzZSB2YWxpZCBwcm9ncmFtcyBmcm9tIGxpbmtpbmcgYnkgYXR0ZW1wdGluZwotCSB0byBjcmVhdGUgYSBuZXcgLmdvdCBlbnRyeSBzb21ld2hlcmUuICBBIENvcnJlY3QgU29sdXRpb24gd291bGQgYmUKLQkgdG8gYWRkIGEgbmV3IC5nb3Qgc2VjdGlvbiB0byBhIG5ldyBvYmplY3QgZmlsZSBhbmQgbGV0IGl0IGJlIG1lcmdlZAotCSBzb21ld2hlcmUgbGF0ZXIuICBCdXQgZm9yIG5vdyBkb24ndCBib3RoZXIuICAqLwotICAgICAgJiYgYWgtPmdvdF9lbnRyaWVzKQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShkeW5vYmosICIucGx0Iik7Ci0gICAgICBpZiAoIXMgJiYgIWVsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChkeW5vYmosIGluZm8pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIGZpcnN0IGJpdCBvZiB0aGUgLnBsdCBpcyByZXNlcnZlZC4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplID0gUExUX0hFQURFUl9TSVpFOwotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZSBub3QKLQkgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoZSBsb2NhdGlvbgotCSBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbiBwb2ludGVycyBjb21wYXJlCi0JIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZCB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+cGx0Lm9mZnNldDsKLQl9Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCBhIEpNUF9TTE9UIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgVGhlIEFscGhhLCBzaW5jZSBpdCB1c2VzIC5nb3QgZW50cmllcyBmb3IgYWxsCi0gICAgIHN5bWJvbHMgZXZlbiBpbiByZWd1bGFyIG9iamVjdHMsIGRvZXMgbm90IG5lZWQgdGhlIGhhY2tlcnkgb2YgYQotICAgICAuZHluYnNzIHNlY3Rpb24gYW5kIENPUFkgZHluYW1pYyByZWxvY2F0aW9ucy4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN5bWJvbCB2ZXJzaW9uaW5nIGNhbiBjcmVhdGUgbmV3IHN5bWJvbHMsIGFuZCBtYWtlIG91ciBvbGQgc3ltYm9scwotICAgaW5kaXJlY3QgdG8gdGhlIG5ldyBvbmVzLiAgQ29uc29saWRhdGUgdGhlIGdvdCBhbmQgcmVsb2MgaW5mb3JtYXRpb24KLSAgIGluIHRoZXNlIHNpdHVhdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfbWVyZ2VfaW5kX3N5bWJvbHMgKGhpLCBkdW1teSkKLSAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmhpOwotICAgICBQVFIgZHVtbXk7Ci17Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoczsKLQotICBpZiAoaGktPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGhzID0gaGk7Ci0gIGRvIHsKLSAgICBocyA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWhzLT5yb290LnJvb3QudS5pLmxpbms7Ci0gIH0gd2hpbGUgKGhzLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KTsKLQotICAvKiBNZXJnZSB0aGUgZmxhZ3MuICBXaGVlLiAgKi8KLQotICBocy0+ZmxhZ3MgfD0gaGktPmZsYWdzOwotCi0gIC8qIE1lcmdlIHRoZSAuZ290IGVudHJpZXMuICBDYW5uaWJhbGl6ZSB0aGUgb2xkIHN5bWJvbCdzIGxpc3QgaW4KLSAgICAgZG9pbmcgc28sIHNpbmNlIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZS4gICovCi0KLSAgaWYgKGhzLT5nb3RfZW50cmllcyA9PSBOVUxMKQotICAgIGhzLT5nb3RfZW50cmllcyA9IGhpLT5nb3RfZW50cmllczsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnaSwgKmdzLCAqZ2luLCAqZ3NoOwotCi0gICAgICBnc2ggPSBocy0+Z290X2VudHJpZXM7Ci0gICAgICBmb3IgKGdpID0gaGktPmdvdF9lbnRyaWVzOyBnaSA7IGdpID0gZ2luKQotCXsKLQkgIGdpbiA9IGdpLT5uZXh0OwotCSAgZm9yIChncyA9IGdzaDsgZ3MgOyBncyA9IGdzLT5uZXh0KQotCSAgICBpZiAoZ2ktPmdvdG9iaiA9PSBncy0+Z290b2JqICYmIGdpLT5hZGRlbmQgPT0gZ3MtPmFkZGVuZCkKLQkgICAgICBnb3RvIGdvdF9mb3VuZDsKLQkgIGdpLT5uZXh0ID0gaHMtPmdvdF9lbnRyaWVzOwotCSAgaHMtPmdvdF9lbnRyaWVzID0gZ2k7Ci0JZ290X2ZvdW5kOjsKLQl9Ci0gICAgfQotICBoaS0+Z290X2VudHJpZXMgPSBOVUxMOwotCi0gIC8qIEFuZCBzaW1pbGFyIGZvciB0aGUgcmVsb2MgZW50cmllcy4gICovCi0KLSAgaWYgKGhzLT5yZWxvY19lbnRyaWVzID09IE5VTEwpCi0gICAgaHMtPnJlbG9jX2VudHJpZXMgPSBoaS0+cmVsb2NfZW50cmllczsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKnJpLCAqcnMsICpyaW4sICpyc2g7Ci0KLSAgICAgIHJzaCA9IGhzLT5yZWxvY19lbnRyaWVzOwotICAgICAgZm9yIChyaSA9IGhpLT5yZWxvY19lbnRyaWVzOyByaSA7IHJpID0gcmluKQotCXsKLQkgIHJpbiA9IHJpLT5uZXh0OwotCSAgZm9yIChycyA9IHJzaDsgcnMgOyBycyA9IHJzLT5uZXh0KQotCSAgICBpZiAocmktPnJ0eXBlID09IHJzLT5ydHlwZSkKLQkgICAgICB7Ci0JCXJzLT5jb3VudCArPSByaS0+Y291bnQ7Ci0JCWdvdG8gZm91bmRfcmVsb2M7Ci0JICAgICAgfQotCSAgcmktPm5leHQgPSBocy0+cmVsb2NfZW50cmllczsKLQkgIGhzLT5yZWxvY19lbnRyaWVzID0gcmk7Ci0JZm91bmRfcmVsb2M6OwotCX0KLSAgICB9Ci0gIGhpLT5yZWxvY19lbnRyaWVzID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSXMgaXQgcG9zc2libGUgdG8gbWVyZ2UgdHdvIG9iamVjdCBmaWxlJ3MgLmdvdCB0YWJsZXM/ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMgKGEsIGIpCi0gICAgIGJmZCAqYSwgKmI7Ci17Ci0gIGludCB0b3RhbCA9IGFscGhhX2VsZl90ZGF0YSAoYSktPnRvdGFsX2dvdF9lbnRyaWVzOwotICBiZmQgKmJzdWI7Ci0KLSAgLyogVHJpdmlhbCBxdWljayBmYWxsb3V0IHRlc3QuICAqLwotICBpZiAodG90YWwgKyBhbHBoYV9lbGZfdGRhdGEgKGIpLT50b3RhbF9nb3RfZW50cmllcyA8PSBNQVhfR09UX0VOVFJJRVMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQnkgdGhlaXIgbmF0dXJlLCBsb2NhbCAuZ290IGVudHJpZXMgY2Fubm90IGJlIG1lcmdlZC4gICovCi0gIGlmICgodG90YWwgKz0gYWxwaGFfZWxmX3RkYXRhIChiKS0+bl9sb2NhbF9nb3RfZW50cmllcykgPiBNQVhfR09UX0VOVFJJRVMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZhaWxpbmcgdGhlIGNvbW1vbiB0cml2aWFsIGNvbXBhcmlzb24sIHdlIG11c3QgZWZmZWN0aXZlbHkKLSAgICAgcGVyZm9ybSB0aGUgbWVyZ2UuICBOb3QgYWN0dWFsbHkgcGVyZm9ybWluZyB0aGUgbWVyZ2UgbWVhbnMgdGhhdAotICAgICB3ZSBkb24ndCBoYXZlIHRvIHN0b3JlIHVuZG8gaW5mb3JtYXRpb24gaW4gY2FzZSB3ZSBmYWlsLiAgKi8KLSAgZm9yIChic3ViID0gYjsgYnN1YiA7IGJzdWIgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqaGFzaGVzID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGJzdWIpOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChic3ViKS0+c3ltdGFiX2hkcjsKLSAgICAgIGludCBpLCBuOwotCi0gICAgICBuID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHN5bXRhYl9oZHItPnNoX2VudHNpemUgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKLQl7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqYWUsICpiZTsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gaGFzaGVzW2ldOwotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIGZvciAoYmUgPSBoLT5nb3RfZW50cmllczsgYmUgOyBiZSA9IGJlLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKGJlLT51c2VfY291bnQgPT0gMCkKLQkgICAgICAgIGNvbnRpbnVlOwotCSAgICAgIGlmIChiZS0+Z290b2JqICE9IGIpCi0JICAgICAgICBjb250aW51ZTsKLQotCSAgICAgIGZvciAoYWUgPSBoLT5nb3RfZW50cmllczsgYWUgOyBhZSA9IGFlLT5uZXh0KQotCSAgICAgICAgaWYgKGFlLT5nb3RvYmogPT0gYSAmJiBhZS0+YWRkZW5kID09IGJlLT5hZGRlbmQpCi0JCSAgZ290byBnbG9iYWxfZm91bmQ7Ci0KLQkgICAgICBpZiAoKyt0b3RhbCA+IE1BWF9HT1RfRU5UUklFUykKLQkgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgZ2xvYmFsX2ZvdW5kOjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFjdHVhbGx5IG1lcmdlIHR3byAuZ290IHRhYmxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGY2NF9hbHBoYV9tZXJnZV9nb3RzIChhLCBiKQotICAgICBiZmQgKmEsICpiOwotewotICBpbnQgdG90YWwgPSBhbHBoYV9lbGZfdGRhdGEgKGEpLT50b3RhbF9nb3RfZW50cmllczsKLSAgYmZkICpic3ViOwotCi0gIC8qIFJlbWVtYmVyIGxvY2FsIGV4cGFuc2lvbi4gICovCi0gIHsKLSAgICBpbnQgZSA9IGFscGhhX2VsZl90ZGF0YSAoYiktPm5fbG9jYWxfZ290X2VudHJpZXM7Ci0gICAgdG90YWwgKz0gZTsKLSAgICBhbHBoYV9lbGZfdGRhdGEgKGEpLT5uX2xvY2FsX2dvdF9lbnRyaWVzICs9IGU7Ci0gIH0KLQotICBmb3IgKGJzdWIgPSBiOyBic3ViIDsgYnN1YiA9IGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmluX2dvdF9saW5rX25leHQpCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllczsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqaGFzaGVzOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gICAgICBpbnQgaSwgbjsKLQotICAgICAgLyogTGV0IHRoZSBsb2NhbCAuZ290IGVudHJpZXMga25vdyB0aGV5IGFyZSBwYXJ0IG9mIGEgbmV3IHN1YnNlZ21lbnQuICAqLwotICAgICAgbG9jYWxfZ290X2VudHJpZXMgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5sb2NhbF9nb3RfZW50cmllczsKLSAgICAgIGlmIChsb2NhbF9nb3RfZW50cmllcykKLSAgICAgICAgewotCSAgbiA9IGVsZl90ZGF0YSAoYnN1YiktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZW50OwotCSAgICAgIGZvciAoZW50ID0gbG9jYWxfZ290X2VudHJpZXNbaV07IGVudDsgZW50ID0gZW50LT5uZXh0KQotCSAgICAgICAgZW50LT5nb3RvYmogPSBhOwotCSAgICB9Ci0gICAgICAgIH0KLQotICAgICAgLyogTWVyZ2UgdGhlIGdsb2JhbCAuZ290IGVudHJpZXMuICAqLwotICAgICAgaGFzaGVzID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGJzdWIpOwotICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGJzdWIpLT5zeW10YWJfaGRyOwotCi0gICAgICBuID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHN5bXRhYl9oZHItPnNoX2VudHNpemUgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKLSAgICAgICAgewotCSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmFlLCAqYmUsICoqcGJlLCAqKnN0YXJ0OwotCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSBoYXNoZXNbaV07Ci0JICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSAgICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgc3RhcnQgPSAmaC0+Z290X2VudHJpZXM7Ci0JICBmb3IgKHBiZSA9IHN0YXJ0LCBiZSA9ICpzdGFydDsgYmUgOyBwYmUgPSAmYmUtPm5leHQsIGJlID0gYmUtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoYmUtPnVzZV9jb3VudCA9PSAwKQotCSAgICAgICAgewotCQkgICpwYmUgPSBiZS0+bmV4dDsKLQkJICBjb250aW51ZTsKLQkgICAgICAgIH0KLQkgICAgICBpZiAoYmUtPmdvdG9iaiAhPSBiKQotCSAgICAgICAgY29udGludWU7Ci0KLQkgICAgICBmb3IgKGFlID0gKnN0YXJ0OyBhZSA7IGFlID0gYWUtPm5leHQpCi0JICAgICAgICBpZiAoYWUtPmdvdG9iaiA9PSBhICYmIGFlLT5hZGRlbmQgPT0gYmUtPmFkZGVuZCkKLQkJICB7Ci0JCSAgICBhZS0+ZmxhZ3MgfD0gYmUtPmZsYWdzOwotCQkgICAgYWUtPnVzZV9jb3VudCArPSBiZS0+dXNlX2NvdW50OwotCQkgICAgKnBiZSA9IGJlLT5uZXh0OwotCQkgICAgZ290byBnbG9iYWxfZm91bmQ7Ci0JCSAgfQotCSAgICAgIGJlLT5nb3RvYmogPSBhOwotCSAgICAgIHRvdGFsICs9IDE7Ci0KLQkgICAgZ2xvYmFsX2ZvdW5kOjsKLQkgICAgfQotICAgICAgICB9Ci0KLSAgICAgIGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmdvdG9iaiA9IGE7Ci0gICAgfQotICBhbHBoYV9lbGZfdGRhdGEgKGEpLT50b3RhbF9nb3RfZW50cmllcyA9IHRvdGFsOwotCi0gIC8qIE1lcmdlIHRoZSB0d28gaW5fZ290IGNoYWlucy4gICovCi0gIHsKLSAgICBiZmQgKm5leHQ7Ci0KLSAgICBic3ViID0gYTsKLSAgICB3aGlsZSAoKG5leHQgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0KSAhPSBOVUxMKQotICAgICAgYnN1YiA9IG5leHQ7Ci0KLSAgICBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0ID0gYjsKLSAgfQotfQotCi0vKiBDYWxjdWxhdGUgdGhlIG9mZnNldHMgZm9yIHRoZSBnb3QgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzX2Zvcl9zeW1ib2wgKGgsIGFyZykKLSAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBhcmc7Ci17Ci0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgZm9yIChnb3RlbnQgPSBoLT5nb3RfZW50cmllczsgZ290ZW50OyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0gICAgaWYgKGdvdGVudC0+dXNlX2NvdW50ID4gMCkKLSAgICAgIHsKLQliZmRfc2l6ZV90eXBlICpwbGdlCi0JICA9ICZhbHBoYV9lbGZfdGRhdGEgKGdvdGVudC0+Z290b2JqKS0+Z290LT5fcmF3X3NpemU7Ci0KLQlnb3RlbnQtPmdvdF9vZmZzZXQgPSAqcGxnZTsKLQkqcGxnZSArPSA4OwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyAoaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaSwgKmdvdF9saXN0ID0gYWxwaGFfZWxmX2hhc2hfdGFibGUoaW5mbyktPmdvdF9saXN0OwotCi0gIC8qIEZpcnN0LCB6ZXJvIG91dCB0aGUgLmdvdCBzaXplcywgYXMgd2UgbWF5IGJlIHJlY2FsY3VsYXRpbmcgdGhlCi0gICAgIC5nb3QgYWZ0ZXIgb3B0aW1pemluZyBpdC4gICovCi0gIGZvciAoaSA9IGdvdF9saXN0OyBpIDsgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKLSAgICBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X3Jhd19zaXplID0gMDsKLQotICAvKiBOZXh0LCBmaWxsIGluIHRoZSBvZmZzZXRzIGZvciBhbGwgdGhlIGdsb2JhbCBlbnRyaWVzLiAgKi8KLSAgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCWVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbCwKLQkJCQlOVUxMKTsKLQotICAvKiBGaW5hbGx5LCBmaWxsIGluIHRoZSBvZmZzZXRzIGZvciB0aGUgbG9jYWwgZW50cmllcy4gICovCi0gIGZvciAoaSA9IGdvdF9saXN0OyBpIDsgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGdvdF9vZmZzZXQgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X3Jhd19zaXplOwotICAgICAgYmZkICpqOwotCi0gICAgICBmb3IgKGogPSBpOyBqIDsgaiA9IGFscGhhX2VsZl90ZGF0YShqKS0+aW5fZ290X2xpbmtfbmV4dCkKLQl7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKmxvY2FsX2dvdF9lbnRyaWVzLCAqZ290ZW50OwotCSAgaW50IGssIG47Ci0KLQkgIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhKGopLT5sb2NhbF9nb3RfZW50cmllczsKLQkgIGlmICghbG9jYWxfZ290X2VudHJpZXMpCi0JICAgIGNvbnRpbnVlOwotCi0JICBmb3IgKGsgPSAwLCBuID0gZWxmX3RkYXRhKGopLT5zeW10YWJfaGRyLnNoX2luZm87IGsgPCBuOyArK2spCi0JICAgIGZvciAoZ290ZW50ID0gbG9jYWxfZ290X2VudHJpZXNba107IGdvdGVudDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCSAgICAgIGlmIChnb3RlbnQtPnVzZV9jb3VudCA+IDApCi0JICAgICAgICB7Ci0JCSAgZ290ZW50LT5nb3Rfb2Zmc2V0ID0gZ290X29mZnNldDsKLQkJICBnb3Rfb2Zmc2V0ICs9IDg7Ci0JICAgICAgICB9Ci0JfQotCi0gICAgICBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X3Jhd19zaXplID0gZ290X29mZnNldDsKLSAgICAgIGFscGhhX2VsZl90ZGF0YShpKS0+Z290LT5fY29va2VkX3NpemUgPSBnb3Rfb2Zmc2V0OwotICAgIH0KLX0KLQotLyogQ29uc3RydWN0cyB0aGUgZ290cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICppLCAqZ290X2xpc3QsICpjdXJfZ290X29iajsKLSAgaW50IHNvbWV0aGluZ19jaGFuZ2VkID0gMDsKLQotICBnb3RfbGlzdCA9IGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Z290X2xpc3Q7Ci0KLSAgLyogT24gdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwgcHJldGVuZCB3ZSBoYXZlIGFuIGV4aXN0aW5nIGdvdCBsaXN0Ci0gICAgIGNvbnNpc3Rpbmcgb2YgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gIGlmIChnb3RfbGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IGluZm8tPmlucHV0X2JmZHM7IGkgOyBpID0gaS0+bGlua19uZXh0KQotCXsKLQkgIGJmZCAqdGhpc19nb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGkpLT5nb3RvYmo7Ci0JICBpZiAodGhpc19nb3QgPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFdlIGFyZSBhc3N1bWluZyBubyBtZXJnaW5nIGhhcyB5ZXQgb2N1cnJlZC4gICovCi0JICBCRkRfQVNTRVJUICh0aGlzX2dvdCA9PSBpKTsKLQotICAgICAgICAgIGlmIChhbHBoYV9lbGZfdGRhdGEgKHRoaXNfZ290KS0+dG90YWxfZ290X2VudHJpZXMgPiBNQVhfR09UX0VOVFJJRVMpCi0JICAgIHsKLQkgICAgICAvKiBZaWtlcyEgQSBzaW5nbGUgb2JqZWN0IGZpbGUgaGFzIHRvbyBtYW55IGVudHJpZXMuICAqLwotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAgKF8oIiVzOiAuZ290IHN1YnNlZ21lbnQgZXhjZWVkcyA2NEsgKHNpemUgJWQpIiksCi0JICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaSksCi0JICAgICAgICAgYWxwaGFfZWxmX3RkYXRhICh0aGlzX2dvdCktPnRvdGFsX2dvdF9lbnRyaWVzICogOCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChnb3RfbGlzdCA9PSBOVUxMKQotCSAgICBnb3RfbGlzdCA9IHRoaXNfZ290OwotCSAgZWxzZQotCSAgICBhbHBoYV9lbGZfdGRhdGEoY3VyX2dvdF9vYmopLT5nb3RfbGlua19uZXh0ID0gdGhpc19nb3Q7Ci0JICBjdXJfZ290X29iaiA9IHRoaXNfZ290OwotCX0KLQotICAgICAgLyogU3RyYW5nZSBkZWdlbmVyYXRlIGNhc2Ugb2Ygbm8gZ290IHJlZmVyZW5jZXMuICAqLwotICAgICAgaWYgKGdvdF9saXN0ID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Z290X2xpc3QgPSBnb3RfbGlzdDsKLQotICAgICAgLyogRm9yY2UgZ290IG9mZnNldHMgdG8gYmUgcmVjYWxjdWxhdGVkLiAgKi8KLSAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0gMTsKLSAgICB9Ci0KLSAgY3VyX2dvdF9vYmogPSBnb3RfbGlzdDsKLSAgaSA9IGFscGhhX2VsZl90ZGF0YShjdXJfZ290X29iaiktPmdvdF9saW5rX25leHQ7Ci0gIHdoaWxlIChpICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzIChjdXJfZ290X29iaiwgaSkpCi0JewotCSAgZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyAoY3VyX2dvdF9vYmosIGkpOwotCSAgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dDsKLQkgIGFscGhhX2VsZl90ZGF0YShjdXJfZ290X29iaiktPmdvdF9saW5rX25leHQgPSBpOwotCSAgc29tZXRoaW5nX2NoYW5nZWQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjdXJfZ290X29iaiA9IGk7Ci0JICBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0OwotCX0KLSAgICB9Ci0KLSAgLyogT25jZSB0aGUgZ290cyBoYXZlIGJlZW4gbWVyZ2VkLCBmaWxsIGluIHRoZSBnb3Qgb2Zmc2V0cyBmb3IKLSAgICAgZXZlcnl0aGluZyB0aGVyZWluLiAgKi8KLSAgaWYgKDEgfHwgc29tZXRoaW5nX2NoYW5nZWQpCi0gICAgZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyAoaW5mbyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICppOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRmlyc3QsIHRha2UgY2FyZSBvZiB0aGUgaW5kaXJlY3Qgc3ltYm9scyBjcmVhdGVkIGJ5IHZlcnNpb25pbmcuICAqLwotICBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlIChhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJZWxmNjRfYWxwaGFfbWVyZ2VfaW5kX3N5bWJvbHMsCi0JCQkJTlVMTCk7Ci0KLSAgaWYgKCFlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgb2YgdGhlIC5nb3Qgc3Vic2VjdGlvbnMuICAqLwotICBpID0gYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbGlzdDsKLSAgZm9yICggOyBpIDsgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqcyA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290OwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoaSwgcy0+X3Jhd19zaXplKTsKLQkgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV29yayBvdXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyAoaCwgaW5mbykKLSAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICAvKiBJZiB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0Ci0gICAgIGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbiBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlCi0gICAgIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgc3ltYm9sIGluIGEgY29tbW9uCi0gICAgIHNlY3Rpb24gYnV0IHRoZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSIGZsYWcgd2lsbCBub3QgaGF2ZSBiZWVuCi0gICAgIHNldC4gIFRoaXMgaXMgZG9uZSBmb3IgZHluYW1pYyBzeW1ib2xzIGluCi0gICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgYnV0IHRoaXMgaXMgbm90IGRvbmUgZm9yIG5vbi1keW5hbWljCi0gICAgIHN5bWJvbHMsIHNvbWVob3cuICAqLwotICBpZiAoKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MKLSAgICAgICAmIChFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0JICB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkgIHwgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykpCi0gICAgICAgPT0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikKLSAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmICEoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpKQotICAgIHsKLSAgICAgIGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICAgIH0KLQotICAvKiBJZiB0aGUgc3ltYm9sIGlzIGR5bmFtaWMsIHdlJ2xsIG5lZWQgYWxsIHRoZSByZWxvY2F0aW9ucyBpbiB0aGVpcgotICAgICBuYXR1cmFsIGZvcm0uICBJZiB0aGlzIGlzIGEgc2hhcmVkIG9iamVjdCwgYW5kIGl0IGhhcyBiZWVuIGZvcmNlZAotICAgICBsb2NhbCwgd2UnbGwgbmVlZCB0aGUgc2FtZSBudW1iZXIgb2YgUkVMQVRJVkUgcmVsb2NhdGlvbnMuICAqLwotCi0gIGlmIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGluZm8pIHx8IGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpyZWxlbnQ7Ci0gICAgICBiZmQgKmR5bm9iajsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIGZvciAocmVsZW50ID0gaC0+cmVsb2NfZW50cmllczsgcmVsZW50OyByZWxlbnQgPSByZWxlbnQtPm5leHQpCi0JaWYgKHJlbGVudC0+cnR5cGUgPT0gUl9BTFBIQV9SRUZMT05HCi0JICAgIHx8IHJlbGVudC0+cnR5cGUgPT0gUl9BTFBIQV9SRUZRVUFEKQotCSAgewotCSAgICByZWxlbnQtPnNyZWwtPl9yYXdfc2l6ZSArPQotCSAgICAgIHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHJlbGVudC0+Y291bnQ7Ci0JICB9Ci0KLSAgICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gICAgICBjb3VudCA9IDA7Ci0KLSAgICAgIGZvciAoZ290ZW50ID0gaC0+Z290X2VudHJpZXM7IGdvdGVudCA7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQljb3VudCsrOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgdXNpbmcgYSAucGx0IGVudHJ5LCBzdWJ0cmFjdCBvbmUsIGFzIHRoZSBmaXJzdAotCSByZWZlcmVuY2UgdXNlcyBhIC5yZWxhLnBsdCBlbnRyeSBpbnN0ZWFkLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnBsdC5vZmZzZXQgIT0gTUlOVVNfT05FKQotCWNvdW50LS07Ci0KLSAgICAgIGlmIChjb3VudCA+IDApCi0JewotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0JICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLSAgYm9vbGVhbiByZWxwbHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0KLSAgICAgIC8qIE5vdyB0aGF0IHdlJ3ZlIHNlZW4gYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgd2UgY2FuIGRlY2lkZSB3aGljaAotCSBzeW1ib2xzIG5lZWQgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMgYW5kIHdoaWNoIGRvbid0LiAgV2UndmUKLQkgY29sbGVjdGVkIGluZm9ybWF0aW9uIGluIGNoZWNrX3JlbG9jcyB0aGF0IHdlIGNhbiBub3cgYXBwbHkgdG8KLQkgc2l6ZSB0aGUgZHluYW1pYyByZWxvY2F0aW9uIHNlY3Rpb25zLiAgKi8KLSAgICAgIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAgZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMsCi0JCQkJICAgIGluZm8pOwotCi0gICAgICAvKiBXaGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGVhY2ggbG9jYWwgLmdvdCBlbnRyeSBuZWVkcyBhCi0JIFJFTEFUSVZFIHJlbG9jLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JewotCSAgYmZkICppOwotCSAgYXNlY3Rpb24gKnNyZWw7Ci0JICBiZmRfc2l6ZV90eXBlIGNvdW50OwotCi0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLQotCSAgZm9yIChpID0gYWxwaGFfZWxmX2hhc2hfdGFibGUoaW5mbyktPmdvdF9saXN0LCBjb3VudCA9IDA7Ci0JICAgICAgIGkgIT0gTlVMTDsKLQkgICAgICAgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKLQkgICAgY291bnQgKz0gYWxwaGFfZWxmX3RkYXRhKGkpLT5uX2xvY2FsX2dvdF9lbnRyaWVzOwotCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gY291bnQgKiBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JfQotICAgIH0KLSAgLyogZWxzZSB3ZSdyZSBub3QgZHluYW1pYyBhbmQgYnkgZGVmaW5pdGlvbiB3ZSBkb24ndCBuZWVkIHN1Y2ggdGhpbmdzLiAgKi8KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHJlbHRleHQgPSBmYWxzZTsKLSAgcmVscGx0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICghKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQkgVGhpcyBpcyB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZCAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBpdAotCSBpbiBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSBpdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlCi0JIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMuICBUaGUKLQkgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kCi0JIGl0IGlzIHRoYXQgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvCi0JIGdvIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMCkKLQl7Ci0JICBzdHJpcCA9IChzLT5fcmF3X3NpemUgPT0gMCk7Ci0KLQkgIGlmICghc3RyaXApCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgaWYgKHN0cmNtcChuYW1lLCAiLnJlbGEucGx0IikgPT0gMCkKLQkJcmVscGx0ID0gdHJ1ZTsKLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIGR5bmFtaWMgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCV9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLQkgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCFiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgIHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYW4gQWxwaGEgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLSAgYXNlY3Rpb24gKnNlYywgKnNnb3QsICpzcmVsLCAqc3JlbGdvdDsKLSAgYmZkICpkeW5vYmosICpnb3RvYmo7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgc3JlbGdvdCA9IHNyZWwgPSBOVUxMOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGlmIChkeW5vYmopCi0gICAgewotICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICB9Ci0KLSAgLyogRmluZCB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgaW5wdXQgYmZkLiAgKi8KLSAgc2dvdCA9IE5VTEw7Ci0gIGdwID0gMDsKLSAgZ290b2JqID0gYWxwaGFfZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5nb3RvYmo7Ci0gIGlmIChnb3RvYmopCi0gICAgewotICAgICAgc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoZ290b2JqKS0+Z290OwotICAgICAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoZ290b2JqKTsKLSAgICAgIGlmIChncCA9PSAwKQotCXsKLQkgIGdwID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSsgMHg4MDAwKTsKLQkgIF9iZmRfc2V0X2dwX3ZhbHVlIChnb3RvYmosIGdwKTsKLQl9Ci0gICAgfQotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjY0X1JfVFlQRShyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9BTFBIQV9tYXgpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBlbGY2NF9hbHBoYV9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQotCSAgLyogVGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggR1BESVNQIGFuZCBMSVRVU0UgaXMgCi0JICAgICBpbW1hdGVyaWFsLiAgT25seSB0aGUgYWRkZW5kIGlzIHNpZ25pZmljYW50LiAgKi8KLQkgIGlmIChyX3R5cGUgPT0gUl9BTFBIQV9HUERJU1AgfHwgcl90eXBlID09IFJfQUxQSEFfTElUVVNFKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLQotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0JICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSNpZiBydGhfbm90ZGVmCi0JICAgICAgaWYgKChyX3R5cGUgPT0gUl9BTFBIQV9MSVRFUkFMCi0JCSAgICYmIGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgJiYgKCFpbmZvLT5zaGFyZWQKLQkJICAgICAgIHx8ICFpbmZvLT5zeW1ib2xpYwotCQkgICAgICAgfHwgIShoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICghaW5mby0+c3ltYm9saWMKLQkJCSAgfHwgIShoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpCi0JCSAgICAgICYmIChyX3R5cGUgPT0gUl9BTFBIQV9SRUZMT05HCi0JCQkgIHx8IHJfdHlwZSA9PSBSX0FMUEhBX1JFRlFVQUQKLQkJCSAgfHwgcl90eXBlID09IFJfQUxQSEFfTElURVJBTCkpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24gdmFsdWUuCi0JCSAgICAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZSBvYnNjdXJlIGNhc2VzCi0JCSAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICAqLwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0jZWxzZQotCSAgICAgIC8qIEZJWE1FOiBBcmUgbm90IHRoZXNlIG9ic2N1cmUgY2FzZXMgc2ltcGx5IGJ1Z3M/ICBMZXQncwotCQkgZ2V0IHNvbWV0aGluZyB3b3JraW5nIGFuZCBjb21lIGJhY2sgdG8gdGhpcy4gICovCi0JICAgICAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJcmVsb2NhdGlvbiA9IDA7Ci0jZW5kaWYgLyogcnRoX25vdGRlZiAqLwotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9BTFBIQV9HUERJU1A6Ci0JICB7Ci0JICAgIGJmZF9ieXRlICpwX2xkYWgsICpwX2xkYTsKLQotCSAgICBCRkRfQVNTRVJUKGdwICE9IDApOwotCi0JICAgIHJlbG9jYXRpb24gPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICBwX2xkYWggPSBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIHBfbGRhID0gcF9sZGFoICsgcmVsLT5yX2FkZGVuZDsKLQotCSAgICByID0gZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwIChpbnB1dF9iZmQsIGdwIC0gcmVsb2NhdGlvbiwKLQkJCQkJICAgICBwX2xkYWgsIHBfbGRhKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FMUEhBX09QX1BVU0g6Ci0JY2FzZSBSX0FMUEhBX09QX1NUT1JFOgotCWNhc2UgUl9BTFBIQV9PUF9QU1VCOgotCWNhc2UgUl9BTFBIQV9PUF9QUlNISUZUOgotCSAgLyogV2UgaGF0ZSB0aGVzZSBzaWxseSBiZWFzdHMuICAqLwotCSAgYWJvcnQoKTsKLQotCWNhc2UgUl9BTFBIQV9MSVRFUkFMOgotCSAgewotCSAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCSAgICBib29sZWFuIGR5bmFtaWNfc3ltYm9sOwotCi0JICAgIEJGRF9BU1NFUlQoc2dvdCAhPSBOVUxMKTsKLQkgICAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJZ290ZW50ID0gaC0+Z290X2VudHJpZXM7Ci0JCWR5bmFtaWNfc3ltYm9sID0gYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBpbmZvKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWdvdGVudCA9IChhbHBoYV9lbGZfdGRhdGEoaW5wdXRfYmZkKS0+Ci0JCQkgIGxvY2FsX2dvdF9lbnRyaWVzW3Jfc3ltbmR4XSk7Ci0JCWR5bmFtaWNfc3ltYm9sID0gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIEJGRF9BU1NFUlQoZ290ZW50ICE9IE5VTEwpOwotCi0JICAgIHdoaWxlIChnb3RlbnQtPmdvdG9iaiAhPSBnb3RvYmogfHwgZ290ZW50LT5hZGRlbmQgIT0gYWRkZW5kKQotCSAgICAgIGdvdGVudCA9IGdvdGVudC0+bmV4dDsKLQotCSAgICBCRkRfQVNTRVJUKGdvdGVudC0+dXNlX2NvdW50ID49IDEpOwotCi0JICAgIC8qIEluaXRpYWxpemUgdGhlIC5nb3QgZW50cnkncyB2YWx1ZS4gICovCi0JICAgIGlmICghKGdvdGVudC0+ZmxhZ3MgJiBBTFBIQV9FTEZfR09UX0VOVFJZX1JFTE9DU19ET05FKSkKLQkgICAgICB7Ci0JCWJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24rYWRkZW5kLAotCQkJICAgIHNnb3QtPmNvbnRlbnRzICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQotCQkvKiBJZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGZvcmNlZCBsb2NhbCwgb3V0cHV0IGEKLQkJICAgUkVMQVRJVkUgcmVsb2MsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGhhbmRsZWQgaW4KLQkJICAgZmluaXNoX2R5bmFtaWNfc3ltYm9sLiAgKi8KLQkJaWYgKGluZm8tPnNoYXJlZCAmJiAhZHluYW1pY19zeW1ib2wpCi0JCSAgewotCQkgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICBCRkRfQVNTRVJUKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCSAgICAgICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JCSAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKDAsIFJfQUxQSEFfUkVMQVRJVkUpOwotCQkgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQotCQkgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICAgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkgICAgICAgKyBzcmVsZ290LT5yZWxvY19jb3VudCsrKTsKLQkJICAgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKQotCQkJCSogc3JlbGdvdC0+cmVsb2NfY291bnQKLQkJCQk8PSBzcmVsZ290LT5fY29va2VkX3NpemUpOwotCQkgIH0KLQotCQlnb3RlbnQtPmZsYWdzIHw9IEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkU7Ci0JICAgICAgfQotCi0JICAgIC8qIEZpZ3VyZSB0aGUgZ3ByZWwgcmVsb2NhdGlvbi4gICovCi0JICAgIGFkZGVuZCA9IDA7Ci0JICAgIHJlbG9jYXRpb24gPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCSAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCSAgICByZWxvY2F0aW9uIC09IGdwOwotCSAgfQotCSAgLyogb3ZlcmZsb3cgaGFuZGxlZCBieSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKi8KLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWNhc2UgUl9BTFBIQV9HUFJFTDMyOgotCWNhc2UgUl9BTFBIQV9HUFJFTExPVzoKLQkgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0JICByZWxvY2F0aW9uIC09IGdwOwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX0dQUkVMSElHSDoKLQkgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0JICByZWxvY2F0aW9uIC09IGdwOwotCSAgcmVsb2NhdGlvbiArPSBhZGRlbmQ7Ci0JICBhZGRlbmQgPSAwOwotCSAgcmVsb2NhdGlvbiA9ICgoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID4+IDE2KQotCQkJKyAoKHJlbG9jYXRpb24gPj4gMTUpICYgMSkpOwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX0JSQUREUjoKLQljYXNlIFJfQUxQSEFfSElOVDoKLQkgIC8qIFRoZSByZWd1bGFyIFBDLXJlbGF0aXZlIHN0dWZmIG1lYXN1cmVzIGZyb20gdGhlIHN0YXJ0IG9mCi0JICAgICB0aGUgaW5zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gdGhlIGVuZC4gICovCi0JICBhZGRlbmQgLT0gNDsKLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWNhc2UgUl9BTFBIQV9SRUZMT05HOgotCWNhc2UgUl9BTFBIQV9SRUZRVUFEOgotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAvKiBDYXJlZnVsIGhlcmUgdG8gcmVtZW1iZXIgUkVMQVRJVkUgcmVsb2NhdGlvbnMgZm9yIGdsb2JhbAotCSAgICAgICB2YXJpYWJsZXMgZm9yIHN5bWJvbGljIHNoYXJlZCBvYmplY3RzLiAgKi8KLQotCSAgICBpZiAoaCAmJiBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGluZm8pKQotCSAgICAgIHsKLQkJQkZEX0FTU0VSVChoLT5yb290LmR5bmluZHggIT0gLTEpOwotCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKGgtPnJvb3QuZHluaW5keCwgcl90eXBlKTsKLQkJb3V0cmVsLnJfYWRkZW5kID0gYWRkZW5kOwotCQlhZGRlbmQgPSAwLCByZWxvY2F0aW9uID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgICB7Ci0JCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7Ci0JCW91dHJlbC5yX2FkZGVuZCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JICAgIGlmICghc3JlbCkKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkoaW5wdXRfYmZkLCBlbGZfZWxmaGVhZGVyKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgZWxmX3NlY3Rpb25fZGF0YShpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCUJGRF9BU1NFUlQobmFtZSAhPSBOVUxMKTsKLQotCQlzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCUJGRF9BU1NFUlQoc3JlbCAhPSBOVUxMKTsKLQkgICAgICB9Ci0KLQkgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYmZkX3ZtYSBvZmY7Ci0KLQkJb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkgICAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCWlucHV0X3NlY3Rpb24sCi0JCQkmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCXJlbC0+cl9vZmZzZXQpKTsKLQkJaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgc2tpcCA9IHRydWU7Ci0JCW91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgc2tpcCkKLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIGVsc2UKLQkgICAgICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCi0JICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQlzcmVsLT5jb250ZW50cykKLQkJCQkgICAgICAgKyBzcmVsLT5yZWxvY19jb3VudCsrKTsKLQkgICAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogc3JlbC0+cmVsb2NfY291bnQKLQkJCTw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7Ci0JICB9Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQlkZWZhdWx0OgotCWRlZmF1bHRfcmVsb2M6Ci0JICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwgcmVsb2NhdGlvbiwKLQkJCQkJYWRkZW5kKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChyKQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCShpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgICB9Ci0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gTUlOVVNfT05FKQotICAgIHsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIC5wbHQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGFzZWN0aW9uICpzcGx0LCAqc2dvdCwgKnNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0gICAgICBiZmRfdm1hIGdvdF9hZGRyLCBwbHRfYWRkcjsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCAuZ290IGVudHJ5IHdpbGwgYmUgdXBkYXRlZCBieSB0aGUgLnBsdCB3aXRoIHRoZQotCSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgZnVuY3Rpb24uICAqLwotICAgICAgZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoKS0+Z290X2VudHJpZXM7Ci0gICAgICBCRkRfQVNTRVJUIChnb3RlbnQgJiYgZ290ZW50LT5hZGRlbmQgPT0gMCk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoZ290ZW50LT5nb3RvYmopLT5nb3Q7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCi0gICAgICBnb3RfYWRkciA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotICAgICAgcGx0X2FkZHIgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICsgaC0+cGx0Lm9mZnNldCk7Ci0KLSAgICAgIHBsdF9pbmRleCA9IChoLT5wbHQub2Zmc2V0IC0gUExUX0hFQURFUl9TSVpFKSAvIFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgewotCXVuc2lnbmVkIGluc24xLCBpbnNuMiwgaW5zbjM7Ci0KLQlpbnNuMSA9IFBMVF9FTlRSWV9XT1JEMSB8ICgoLShoLT5wbHQub2Zmc2V0ICsgNCkgPj4gMikgJiAweDFmZmZmZik7Ci0JaW5zbjIgPSBQTFRfRU5UUllfV09SRDI7Ci0JaW5zbjMgPSBQTFRfRU5UUllfV09SRDM7Ci0KLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuMSwgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0KTsKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuMiwgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgNCk7Ci0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbjMsIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDgpOwotICAgICAgfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gZ290X2FkZHI7Ci0gICAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKGgtPmR5bmluZHgsIFJfQUxQSEFfSk1QX1NMT1QpOwotICAgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopc3JlbC0+Y29udGVudHMKLQkJCQkgICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICghKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluIHRoZQotCSAgICAgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyaWVzIGluIHRoZSAuZ290LiAgKi8KLSAgICAgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHBsdF9hZGRyLCBzZ290LT5jb250ZW50cyArIGdvdGVudC0+Z290X29mZnNldCk7Ci0KLSAgICAgIC8qIFN1YnNlcXVlbnQgLmdvdCBlbnRyaWVzIHdpbGwgY29udGludWUgdG8gYm91bmNlIHRocm91Z2ggdGhlIC5wbHQuICAqLwotICAgICAgaWYgKGdvdGVudC0+bmV4dCkKLQl7Ci0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgQkZEX0FTU0VSVCAoISBpbmZvLT5zaGFyZWQgfHwgc3JlbCAhPSBOVUxMKTsKLQotCSAgZ290ZW50ID0gZ290ZW50LT5uZXh0OwotCSAgZG8KLQkgICAgewotCSAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEoZ290ZW50LT5nb3RvYmopLT5nb3Q7Ci0JICAgICAgQkZEX0FTU0VSVChzZ290ICE9IE5VTEwpOwotCSAgICAgIEJGRF9BU1NFUlQoZ290ZW50LT5hZGRlbmQgPT0gMCk7Ci0KLQkgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCBwbHRfYWRkciwKLQkJICAgICAgICAgIHNnb3QtPmNvbnRlbnRzICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTygwLCBSX0FMUEhBX1JFTEFUSVZFKTsKLQkJICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0JCSAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgICAgc3JlbC0+Y29udGVudHMpCi0JCQkJCSAgICAgKyBzcmVsLT5yZWxvY19jb3VudCsrKTsKLQkJICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCQkJICAgICAgPD0gc3JlbC0+X2Nvb2tlZF9zaXplKTsKLQkJfQotCi0JICAgICAgZ290ZW50ID0gZ290ZW50LT5uZXh0OwotCSAgICB9Ci0gICAgICAgICAgd2hpbGUgKGdvdGVudCAhPSBOVUxMKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoaCwgaW5mbykpCi0gICAgewotICAgICAgLyogRmlsbCBpbiB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBmb3IgdGhpcyBzeW1ib2wncyAuZ290IGVudHJpZXMuICAqLwotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLQotICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BTFBIQV9HTE9CX0RBVCk7Ci0gICAgICBmb3IgKGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmdvdF9lbnRyaWVzOwotCSAgIGdvdGVudCAhPSBOVUxMOwotCSAgIGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQl7Ci0JICBhc2VjdGlvbiAqc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoZ290ZW50LT5nb3RvYmopLT5nb3Q7Ci0JICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCSAgb3V0cmVsLnJfYWRkZW5kID0gZ290ZW50LT5hZGRlbmQ7Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKilzcmVsLT5jb250ZW50cwotCQkJCSAgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKykpOwotCSAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogc3JlbC0+cmVsb2NfY291bnQKLQkJICAgICAgPD0gc3JlbC0+X2Nvb2tlZF9zaXplKTsKLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmNjRfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOgotCSAgICAgIG5hbWUgPSAiLnBsdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOgotCSAgICAgIG5hbWUgPSAiLnJlbGEucGx0IjsKLQkgICAgICBnb3RvIGdldF9zaXplOwotCSAgICBjYXNlIERUX0pNUFJFTDoKLQkgICAgICBuYW1lID0gIi5yZWxhLnBsdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCi0JICAgIGNhc2UgRFRfUkVMQVNaOgotCSAgICAgIC8qIE15IGludGVycHJldGF0aW9uIG9mIHRoZSBUSVMgdjEuMSBFTEYgZG9jdW1lbnQgaW5kaWNhdGVzCi0JCSB0aGF0IFJFTEFTWiBzaG91bGQgbm90IGluY2x1ZGUgSk1QUkVMLiAgVGhpcyBpcyBub3Qgd2hhdAotCQkgdGhlIHJlc3Qgb2YgdGhlIEJGRCBkb2VzLiAgSXQgaXMsIGhvd2V2ZXIsIHdoYXQgdGhlCi0JCSBnbGliYyBsZC5zbyB3YW50cy4gIERvIHRoaXMgZml4dXAgaGVyZSB1bnRpbCB3ZSBmb3VuZAotCQkgb3V0IHdobyBpcyByaWdodC4gICovCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbGEucGx0Iik7Ci0JICAgICAgaWYgKHMpCi0JCXsKLQkJICBkeW4uZF91bi5kX3ZhbCAtPQotCQkgICAgKHMtPl9jb29rZWRfc2l6ZSA/IHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSAocyA/IHMtPnZtYSA6IDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGdldF9zaXplOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPQotCQkocy0+X2Nvb2tlZF9zaXplID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBiZmRfZWxmNjRfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCX0KLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgUExUMCBlbnRyeSAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JEMSwgc3BsdC0+Y29udGVudHMpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JEMiwgc3BsdC0+Y29udGVudHMgKyA0KTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDMsIHNwbHQtPmNvbnRlbnRzICsgOCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQ0LCBzcGx0LT5jb250ZW50cyArIDEyKTsKLQotCSAgLyogVGhlIG5leHQgdHdvIHdvcmRzIHdpbGwgYmUgZmlsbGVkIGluIGJ5IGxkLnNvICovCi0JICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCAwLCBzcGx0LT5jb250ZW50cyArIDE2KTsKLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIDAsIHNwbHQtPmNvbnRlbnRzICsgMjQpOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCSAgICBQTFRfSEVBREVSX1NJWkU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGxpbmsgcm91dGluZSB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIGFuZAotICAgdGhlIC5tZGVidWcgc2VjdGlvbnMuICBXZSBuZWVkIHRvIG1lcmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlc2UKLSAgIHNlY3Rpb25zIHRvZ2V0aGVyLCBub3Qgd3JpdGUgdGhlbSBhbGwgb3V0IHNlcXVlbnRpYWxseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBhc2VjdGlvbiAqcmVnaW5mb19zZWMsICptZGVidWdfc2VjLCAqZ3B0YWJfZGF0YV9zZWMsICpncHRhYl9ic3Nfc2VjOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1ZzsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAKLSAgICA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgSERSUiAqc3ltaGRyID0gJmRlYnVnLnN5bWJvbGljX2hlYWRlcjsKLSAgUFRSIG1kZWJ1Z19oYW5kbGUgPSBOVUxMOwotCi0jaWYgMAotCSAgICAgIGlmICgrK25nb3RzID09IDIpCi0JCXsKLQkJICAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBfKCJ1c2luZyBtdWx0aXBsZSBncCB2YWx1ZXMiKSwgKGNoYXIgKikgTlVMTCwKLQkJICAgICBvdXRwdXRfYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApOwotCQl9Ci0jZW5kaWYKLQotICAvKiBHbyB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY29sbGVjdCB0aGUgLnJlZ2luZm8gYW5kIC5tZGVidWcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZWdpbmZvX3NlYyA9IE5VTEw7Ci0gIG1kZWJ1Z19zZWMgPSBOVUxMOwotICBncHRhYl9kYXRhX3NlYyA9IE5VTEw7Ci0gIGdwdGFiX2Jzc19zZWMgPSBOVUxMOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIucmVnaW5mbyIpID09IDApCi0JewotCSAgbWVtc2V0ICgmcmVnaW5mbywgMCwgc2l6ZW9mIHJlZ2luZm8pOwotCi0JICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAucmVnaW5mbyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLQkgICAgICBFbGY2NF9SZWdJbmZvIHN1YjsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBoYXMgcHJvYmFibHkgY2xvYmJlcmVkIHRoZQotICAgICAgICAgICAgICAgICBzaXplIHRvIGJlIHplcm8gYnl0ZXMuICAqLwotCSAgICAgIGlmIChpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICAoUFRSKSAmZXh0LAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgICAgIHNpemVvZiBleHQpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX2luIChpbnB1dF9iZmQsICZleHQsICZzdWIpOwotCi0JICAgICAgcmVnaW5mby5yaV9ncHJtYXNrIHw9IHN1Yi5yaV9ncHJtYXNrOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1swXSB8PSBzdWIucmlfY3BybWFza1swXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMV0gfD0gc3ViLnJpX2Nwcm1hc2tbMV07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzJdIHw9IHN1Yi5yaV9jcHJtYXNrWzJdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1szXSB8PSBzdWIucmlfY3BybWFza1szXTsKLQotCSAgICAgIC8qIHJpX2dwX3ZhbHVlIGlzIHNldCBieSB0aGUgZnVuY3Rpb24KLQkJIGFscGhhX2VsZl9zZWN0aW9uX3Byb2Nlc3Npbmcgd2hlbiB0aGUgc2VjdGlvbiBpcwotCQkgZmluYWxseSB3cml0dGVuIG91dC4gICovCi0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogRm9yY2UgdGhlIHNlY3Rpb24gc2l6ZSB0byB0aGUgdmFsdWUgd2Ugd2FudC4gICovCi0JICBvLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgcmVnaW5mb19zZWMgPSBvOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLm1kZWJ1ZyIpID09IDApCi0JewotCSAgc3RydWN0IGV4dHN5bV9pbmZvIGVpbmZvOwotCi0JICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAubWRlYnVnIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCSAgICAgTG9vayB0aHJvdWdoIGFsbCB0aGUgbGlua19vcmRlcnMgY29tcHJpc2luZyBpdCBhbmQgbWVyZ2UKLQkgICAgIHRoZSBpbmZvcm1hdGlvbiB0b2dldGhlci4gICovCi0JICBzeW1oZHItPm1hZ2ljID0gc3dhcC0+c3ltX21hZ2ljOwotCSAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHRoZSB2ZXJzaW9uIHN0YW1wIGJlPyAgKi8KLQkgIHN5bWhkci0+dnN0YW1wID0gMDsKLQkgIHN5bWhkci0+aWxpbmVNYXggPSAwOwotCSAgc3ltaGRyLT5jYkxpbmUgPSAwOwotCSAgc3ltaGRyLT5pZG5NYXggPSAwOwotCSAgc3ltaGRyLT5pcGRNYXggPSAwOwotCSAgc3ltaGRyLT5pc3ltTWF4ID0gMDsKLQkgIHN5bWhkci0+aW9wdE1heCA9IDA7Ci0JICBzeW1oZHItPmlhdXhNYXggPSAwOwotCSAgc3ltaGRyLT5pc3NNYXggPSAwOwotCSAgc3ltaGRyLT5pc3NFeHRNYXggPSAwOwotCSAgc3ltaGRyLT5pZmRNYXggPSAwOwotCSAgc3ltaGRyLT5jcmZkID0gMDsKLQkgIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0KLQkgIC8qIFdlIGFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpdHNlbGYgaW4gdGhlCi0JICAgICBkZWJ1Z19pbmZvIHN0cnVjdHVyZS4gICovCi0JICBkZWJ1Zy5saW5lID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2RuciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9wZHIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfc3ltID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX29wdCA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9hdXggPSBOVUxMOwotCSAgZGVidWcuc3MgPSBOVUxMOwotCSAgZGVidWcuc3NleHQgPSBkZWJ1Zy5zc2V4dF9lbmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZmRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3JmZCA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9leHQgPSBkZWJ1Zy5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKLQotCSAgbWRlYnVnX2hhbmRsZSA9IGJmZF9lY29mZl9kZWJ1Z19pbml0IChhYmZkLCAmZGVidWcsIHN3YXAsIGluZm8pOwotCSAgaWYgKG1kZWJ1Z19oYW5kbGUgPT0gKFBUUikgTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoMSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCSAgICAgIEVYVFIgZXN5bTsKLQkgICAgICBiZmRfdm1hIGxhc3Q7Ci0JICAgICAgdW5zaWduZWQgaW50IGk7Ci0JICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lW10gPQotCQl7Ci0JCSAgIi50ZXh0IiwgIi5pbml0IiwgIi5maW5pIiwgIi5kYXRhIiwKLQkJICAiLnJvZGF0YSIsICIuc2RhdGEiLCAiLnNic3MiLCAiLmJzcyIKLQkJfTsKLQkgICAgICBzdGF0aWMgY29uc3QgaW50IHNjW10gPSB7IHNjVGV4dCwgc2NJbml0LCBzY0ZpbmksIHNjRGF0YSwKLQkJCQkJICBzY1JEYXRhLCBzY1NEYXRhLCBzY1NCc3MsIHNjQnNzIH07Ci0KLQkgICAgICBlc3ltLmptcHRibCA9IDA7Ci0JICAgICAgZXN5bS5jb2JvbF9tYWluID0gMDsKLQkgICAgICBlc3ltLndlYWtleHQgPSAwOwotCSAgICAgIGVzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uaWZkID0gaWZkTmlsOwotCSAgICAgIGVzeW0uYXN5bS5pc3MgPSBpc3NOaWw7Ci0JICAgICAgZXN5bS5hc3ltLnN0ID0gc3RMb2NhbDsKLQkgICAgICBlc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJICBlc3ltLmFzeW0uc2MgPSBzY1tpXTsKLQkJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVbaV0pOwotCQkgIGlmIChzICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVzeW0uYXN5bS52YWx1ZSA9IHMtPnZtYTsKLQkJICAgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBlc3ltLmFzeW0udmFsdWUgPSBsYXN0OwotCi0JCSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgJmRlYnVnLCBzd2FwLAotCQkJCQkJICAgICAgbmFtZVtpXSwgJmVzeW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcDsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBpbnB1dF9kZWJ1ZzsKLQkgICAgICBjaGFyICplcmF3X3NyYzsKLQkgICAgICBjaGFyICplcmF3X2VuZDsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JCSAgfHwgKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCSAgICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCkgPT0gTlVMTCkKLQkJewotCQkgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IGEgbm9uIEFMUEhBIEVMRiBiZmQgd291bGQgYmUKLQkJICAgICBkb2luZyB3aXRoIGEgLm1kZWJ1ZyBzZWN0aW9uLCBidXQgSSBkb24ndCByZWFsbHkKLQkJICAgICB3YW50IHRvIGRlYWwgd2l0aCBpdC4gICovCi0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGlucHV0X3N3YXAgPSAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGlucHV0X2JmZCkKLQkJCSAgICAtPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApOwotCi0JICAgICAgQkZEX0FTU0VSVCAocC0+c2l6ZSA9PSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0JICAgICAgLyogVGhlIEVDT0ZGIGxpbmtpbmcgY29kZSBleHBlY3RzIHRoYXQgd2UgaGF2ZSBhbHJlYWR5Ci0JCSByZWFkIGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIHNldCB1cCBhbgotCQkgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUsIHNvIHdlIGRvIHRoYXQgbm93LiAgKi8KLQkgICAgICBpZiAoIWVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkJJmlucHV0X2RlYnVnKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgaWYgKCEgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JCSAgICAgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5wdXRfYmZkLAotCQkgICAgICAmaW5wdXRfZGVidWcsIGlucHV0X3N3YXAsIGluZm8pKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogTG9vcCB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgRm9yIGVhY2ggb25lIHdpdGgKLQkJIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLCB0cnkgdG8gZmluZCB0aGUgc3ltYm9sIGluCi0JCSB0aGUgbGlua2VyIGdsb2JhbCBoYXNoIHRhYmxlIGFuZCBzYXZlIHRoZSBpbmZvcm1hdGlvbgotCQkgZm9yIHRoZSBvdXRwdXQgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0JICAgICAgZXJhd19zcmMgPSBpbnB1dF9kZWJ1Zy5leHRlcm5hbF9leHQ7Ci0JICAgICAgZXJhd19lbmQgPSAoZXJhd19zcmMKLQkJCSAgKyAoaW5wdXRfZGVidWcuc3ltYm9saWNfaGVhZGVyLmlleHRNYXgKLQkJCSAgICAgKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOwotCSAgICAgIGZvciAoOwotCQkgICBlcmF3X3NyYyA8IGVyYXdfZW5kOwotCQkgICBlcmF3X3NyYyArPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkKLQkJewotCQkgIEVYVFIgZXh0OwotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICAoKmlucHV0X3N3YXAtPnN3YXBfZXh0X2luKSAoaW5wdXRfYmZkLCAoUFRSKSBlcmF3X3NyYywgJmV4dCk7Ci0JCSAgaWYgKGV4dC5hc3ltLnNjID09IHNjTmlsCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgbmFtZSA9IGlucHV0X2RlYnVnLnNzZXh0ICsgZXh0LmFzeW0uaXNzOwotCQkgIGggPSBhbHBoYV9lbGZfbGlua19oYXNoX2xvb2t1cCAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwgfHwgaC0+ZXN5bS5pZmQgIT0gLTIpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChleHQuaWZkICE9IC0xKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChleHQuaWZkCi0JCQkJICA8IGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZmRNYXgpOwotCQkgICAgICBleHQuaWZkID0gaW5wdXRfZGVidWcuaWZkbWFwW2V4dC5pZmRdOwotCQkgICAgfQotCi0JCSAgaC0+ZXN5bSA9IGV4dDsKLQkJfQotCi0JICAgICAgLyogRnJlZSB1cCB0aGUgaW5mb3JtYXRpb24gd2UganVzdCByZWFkLiAgKi8KLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5saW5lKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9kbnIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3Bkcik7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfc3ltKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9vcHQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2F1eCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuc3MpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzZXh0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9mZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3JmZCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0KTsKLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSAucnRwcm9jIHNlY3Rpb24uICAqLwotCSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgICAgICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgfCBTRUNfUkVBRE9OTFkpOwotCi0JCSAgcnRwcm9jX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnRwcm9jIik7Ci0JCSAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcnRwcm9jX3NlYywgZmxhZ3MpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcnRwcm9jX3NlYywgMTIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoISBhbHBoYV9lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwKLQkJCQkJCSAgICAgaW5mbywgcnRwcm9jX3NlYywgJmRlYnVnKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0jZW5kaWYKLQotCi0JICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQkgIGVpbmZvLmFiZmQgPSBhYmZkOwotCSAgZWluZm8uaW5mbyA9IGluZm87Ci0JICBlaW5mby5kZWJ1ZyA9ICZkZWJ1ZzsKLQkgIGVpbmZvLnN3YXAgPSBzd2FwOwotCSAgZWluZm8uZmFpbGVkID0gZmFsc2U7Ci0JICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICBlbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltLAotCQkJCSAgKFBUUikgJmVpbmZvKTsKLQkgIGlmIChlaW5mby5mYWlsZWQpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAubWRlYnVnIHNlY3Rpb24uICAqLwotCSAgby0+X3Jhd19zaXplID0gYmZkX2Vjb2ZmX2RlYnVnX3NpemUgKGFiZmQsICZkZWJ1Zywgc3dhcCk7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICBtZGVidWdfc2VjID0gbzsKLQl9Ci0KLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgICBpZiAoc3RybmNtcCAoby0+bmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKLQl7Ci0JICBjb25zdCBjaGFyICpzdWJuYW1lOwotCSAgdW5zaWduZWQgaW50IGM7Ci0JICBFbGY2NF9ncHRhYiAqdGFiOwotCSAgRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgKmV4dF90YWI7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgLyogVGhlIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3Mgc2VjdGlvbnMgaG9sZAotCSAgICAgaW5mb3JtYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIHNtYWxsIGRhdGEgYXJlYSB3b3VsZAotCSAgICAgY2hhbmdlIGRlcGVuZGluZyB1cG9uIHRoZSAtRyBzd2l0Y2guICBUaGVzZSBzZWN0aW9ucwotCSAgICAgbm90IHVzZWQgaW4gZXhlY3V0YWJsZXMgZmlsZXMuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotCSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JCSAgIHAgPSBwLT5uZXh0KQotCQl7Ci0JCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0KLQkJICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJICAgIHsKLQkJICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJCWNvbnRpbnVlOwotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIH0KLQotCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkJICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJICAgICBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCQkgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCQl9Ci0KLQkgICAgICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzCi0JCSBjdXJyZW50bHkgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgICAgICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgICAgICAvKiBSZWFsbHkgcmVtb3ZlIHRoZSBzZWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOwotCQkgICAqc2VjcHAgIT0gbzsKLQkJICAgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0JCTsKLQkgICAgICAqc2VjcHAgPSAoKnNlY3BwKS0+bmV4dDsKLQkgICAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBUaGVyZSBpcyBvbmUgZ3B0YWIgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCBvbmUgZm9yCi0JICAgICB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zZGF0YSIpID09IDApCi0JICAgIGdwdGFiX2RhdGFfc2VjID0gbzsKLQkgIGVsc2UgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zYnNzIikgPT0gMCkKLQkgICAgZ3B0YWJfYnNzX3NlYyA9IG87Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFRoZSBsaW5rZXIgc2NyaXB0IGFsd2F5cyBjb21iaW5lcyAuZ3B0YWIuZGF0YSBhbmQKLQkgICAgIC5ncHRhYi5zZGF0YSBpbnRvIC5ncHRhYi5zZGF0YSwgYW5kIGxpa2V3aXNlIGZvcgotCSAgICAgLmdwdGFiLmJzcyBhbmQgLmdwdGFiLnNic3MuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzCi0JICAgICBubyAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGluIHdoaWNoCi0JICAgICBjYXNlIHdlIG11c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAobyA9PSBncHRhYl9kYXRhX3NlYykKLQkJby0+bmFtZSA9ICIuZ3B0YWIuZGF0YSI7Ci0JICAgICAgZWxzZQotCQlvLT5uYW1lID0gIi5ncHRhYi5ic3MiOwotCSAgICAgIHN1Ym5hbWUgPSBvLT5uYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMTsKLQkgICAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3VibmFtZSkgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgLyogU2V0IHVwIHRoZSBmaXJzdCBlbnRyeS4gICovCi0JICBjID0gMTsKLQkgIHRhYiA9IChFbGY2NF9ncHRhYiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChFbGY2NF9ncHRhYikpOwotCSAgaWYgKHRhYiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X2N1cnJlbnRfZ192YWx1ZSA9IGVsZl9ncF9zaXplIChhYmZkKTsKLQkgIHRhYlswXS5ndF9oZWFkZXIuZ3RfdW51c2VkID0gMDsKLQotCSAgLyogQ29tYmluZSB0aGUgaW5wdXQgc2VjdGlvbnMuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBsYXN0OwotCSAgICAgIGJmZF9zaXplX3R5cGUgZ3BlbnRyeTsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogQ29tYmluZSB0aGUgZ3B0YWIgZW50cmllcyBmb3IgdGhpcyBpbnB1dCBzZWN0aW9uIG9uZQotCQkgYnkgb25lLiAgV2Uga25vdyB0aGF0IHRoZSBpbnB1dCBncHRhYiBlbnRyaWVzIGFyZQotCQkgc29ydGVkIGJ5IGFzY2VuZGluZyAtRyB2YWx1ZS4gICovCi0JICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0JICAgICAgbGFzdCA9IDA7Ci0JICAgICAgZm9yIChncGVudHJ5ID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9ncHRhYik7Ci0JCSAgIGdwZW50cnkgPCBzaXplOwotCQkgICBncGVudHJ5ICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpKQotCQl7Ci0JCSAgRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgZXh0X2dwdGFiOwotCQkgIEVsZjY0X2dwdGFiIGludF9ncHRhYjsKLQkJICB1bnNpZ25lZCBsb25nIHZhbDsKLQkJICB1bnNpZ25lZCBsb25nIGFkZDsKLQkJICBib29sZWFuIGV4YWN0OwotCQkgIHVuc2lnbmVkIGludCBsb29rOwotCi0JCSAgaWYgKCEgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpICZleHRfZ3B0YWIsCi0JCQkgIGdwZW50cnksIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpKSkpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHRhYik7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX2dwdGFiX2luIChpbnB1dF9iZmQsICZleHRfZ3B0YWIsCi0JCQkJCQkmaW50X2dwdGFiKTsKLQkJICB2YWwgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfZ192YWx1ZTsKLQkJICBhZGQgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXMgLSBsYXN0OwotCi0JCSAgZXhhY3QgPSBmYWxzZTsKLQkJICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQotCQkgICAgewotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPj0gdmFsKQotCQkJdGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2J5dGVzICs9IGFkZDsKLQotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPT0gdmFsKQotCQkJZXhhY3QgPSB0cnVlOwotCQkgICAgfQotCi0JCSAgaWYgKCEgZXhhY3QpCi0JCSAgICB7Ci0JCSAgICAgIEVsZjY0X2dwdGFiICpuZXdfdGFiOwotCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4OwotCi0JCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgdGFibGUgZW50cnkuICAqLwotCQkgICAgICBuZXdfdGFiID0gKChFbGY2NF9ncHRhYiAqKQotCQkJCSBiZmRfcmVhbGxvYyAoKFBUUikgdGFiLAotCQkJCQkgICAgICAoYyArIDEpICogc2l6ZW9mIChFbGY2NF9ncHRhYikpKTsKLQkJICAgICAgaWYgKG5ld190YWIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgZnJlZSAodGFiKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICB0YWIgPSBuZXdfdGFiOwotCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9IHZhbDsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzID0gYWRkOwotCi0JCSAgICAgIC8qIE1lcmdlIGluIHRoZSBzaXplIGZvciB0aGUgbmV4dCBzbWFsbGVzdCAtRwotCQkJIHZhbHVlLCBzaW5jZSB0aGF0IHdpbGwgYmUgaW1wbGllZCBieSB0aGlzIG5ldwotCQkJIHZhbHVlLiAgKi8KLQkJICAgICAgbWF4ID0gMDsKLQkJICAgICAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJCXsKLQkJCSAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlIDwgdmFsCi0JCQkgICAgICAmJiAobWF4ID09IDAKLQkJCQkgIHx8ICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZQotCQkJCSAgICAgID4gdGFiW21heF0uZ3RfZW50cnkuZ3RfZ192YWx1ZSkpKQotCQkJICAgIG1heCA9IGxvb2s7Ci0JCQl9Ci0JCSAgICAgIGlmIChtYXggIT0gMCkKLQkJCXRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyArPQotCQkJICB0YWJbbWF4XS5ndF9lbnRyeS5ndF9ieXRlczsKLQotCQkgICAgICArK2M7Ci0JCSAgICB9Ci0KLQkJICBsYXN0ID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzOwotCQl9Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogVGhlIHRhYmxlIG11c3QgYmUgc29ydGVkIGJ5IC1HIHZhbHVlLiAgKi8KLQkgIGlmIChjID4gMikKLQkgICAgcXNvcnQgKHRhYiArIDEsIGMgLSAxLCBzaXplb2YgKHRhYlswXSksIGdwdGFiX2NvbXBhcmUpOwotCi0JICAvKiBTd2FwIG91dCB0aGUgdGFibGUuICAqLwotCSAgZXh0X3RhYiA9ICgoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgKikKLQkJICAgICBiZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkpOwotCSAgaWYgKGV4dF90YWIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHRhYik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0JICAgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX2dwdGFiX291dCAoYWJmZCwgdGFiICsgaSwgZXh0X3RhYiArIGkpOwotCSAgZnJlZSAodGFiKTsKLQotCSAgby0+X3Jhd19zaXplID0gYyAqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpOwotCSAgby0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0X3RhYjsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JfQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLwotICBpZiAoISBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHRoZSBjb21wdXRlZCBzZWN0aW9ucy4gICovCi0KLSAgLyogVGhlIC5nb3Qgc3Vic2VjdGlvbnMuLi4gICovCi0gIHsKLSAgICBiZmQgKmksICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICAgIGZvciAoaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdDsKLQkgaSAhPSBOVUxMOwotCSBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotICAgICAgewotCWFzZWN0aW9uICpzZ290OwotCi0JLyogZWxmX2JmZF9maW5hbF9saW5rIGFscmVhZHkgZGlkIGV2ZXJ5dGhpbmcgaW4gZHlub2JqLiAgKi8KLQlpZiAoaSA9PSBkeW5vYmopCi0JICBjb250aW51ZTsKLQotCXNnb3QgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdDsKLQlpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNnb3QtPm91dHB1dF9zZWN0aW9uLAotCQkJCQlzZ290LT5jb250ZW50cywgc2dvdC0+b3V0cHV0X29mZnNldCwKLQkJCQkJc2dvdC0+X3Jhd19zaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICBpZiAocmVnaW5mb19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0KLSAgICAgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCAmcmVnaW5mbywgJmV4dCk7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHJlZ2luZm9fc2VjLCAoUFRSKSAmZXh0LAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChtZGVidWdfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOwotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsCi0JCQkJCSAgICAgICBzd2FwLCBpbmZvLAotCQkJCQkgICAgICAgbWRlYnVnX3NlYy0+ZmlsZXBvcykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfZWNvZmZfZGVidWdfZnJlZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLSAgICB9Ci0KLSAgaWYgKGdwdGFiX2RhdGFfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfZGF0YV9zZWMsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChncHRhYl9ic3Nfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfYnNzX3NlYywKLQkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUKLSAgIC5tZGVidWcgc2VjdGlvbiwgd2hpY2ggaXMgaW4gdGhlIEVDT0ZGIGRlYnVnZ2luZyBmb3JtYXQuICBDb3BpZWQKLSAgIGZyb20gZWxmMzItbWlwcy5jLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwCi1lbGY2NF9hbHBoYV9lY29mZl9kZWJ1Z19zd2FwID0KLXsKLSAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljU3ltMiwKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICA4LAotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX2luLAotICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gIGVjb2ZmX3N3YXBfc3ltX2luLAotICBlY29mZl9zd2FwX29wdF9pbiwKLSAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gIGVjb2ZmX3N3YXBfcmZkX2luLAotICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICBlY29mZl9zd2FwX29wdF9vdXQsCi0gIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gIGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbwotfTsKLQwKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjY0X2FscGhhX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjY0LWFscGhhIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfYWxwaGEKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERSAJRU1fQUxQSEEKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIAkweDEwMDAwCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKLSAgZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIFwKLSAgZWxmNjRfYWxwaGFfaW5mb190b19ob3d0bwotCi0jZGVmaW5lIGJmZF9lbGY2NF9ta29iamVjdCBcCi0gIGVsZjY0X2FscGhhX21rb2JqZWN0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wIFwKLSAgZWxmNjRfYWxwaGFfb2JqZWN0X3AKLQotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkciBcCi0gIGVsZjY0X2FscGhhX3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9mYWtlX3NlY3Rpb25zCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgZWxmNjRfYWxwaGFfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmNjRfZmluZF9uZWFyZXN0X2xpbmUgXAotICBlbGY2NF9hbHBoYV9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbGF4X3NlY3Rpb24gXAotICBlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rIFwKLSAgZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyBcCi0gIGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0gIGVsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0gIGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyBcCi0gIGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0gIGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIFwKLSAgZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotICBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgXAotICBlbGY2NF9hbHBoYV9maW5hbF9saW5rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCBcCi0gICZlbGY2NF9hbHBoYV9lY29mZl9kZWJ1Z19zd2FwCi0KLS8qCi0gKiBBIGZldyBjb25zdGFudHMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSAucGx0IHNlY3Rpb24gaXMgc2V0IHVwLgotICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSBQTFRfSEVBREVSX1NJWkUKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LWdlbi5jIGIvYmZkL2VsZjY0LWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRjMDlkLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1nZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIEdlbmVyaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgc2hvdWxkIGJlCi0gICBnb29kIGVub3VnaCBmb3IgR0RCIG9yIG9iamR1bXAgdG8gcmVhZCB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGR1bW15ID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVU5LTk9XTiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbCAqZWxmX3JlbG9jOwotewotICBiZmRfcmVsb2MtPmhvd3RvID0gJmR1bW15OwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjY0LWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGY2NC1iaWciCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfdW5rbm93bgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9OT05FCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0b19yZWwKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LW1pcHMuYyBiL2JmZC9lbGY2NC1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzBkY2QuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOTAgKzAsMCBAQAotLyogTUlQUy1zcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0gICBMaW5rZXIgc3VwcG9ydCBhZGRlZCBieSBNYXJrIE1pdGNoZWxsLCBDb2RlU291cmNlcnksIExMQy4KLSAgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLgotCi0gICBUaGUgTUlQUyA2NC1iaXQgRUxGIEFCSSB1c2VzIGFuIHVudXN1YWwgcmVsb2MgZm9ybWF0LiAgVGhpcyBmaWxlCi0gICBvdmVycmlkZXMgdGhlIHVzdWFsIEVMRiByZWxvYyBoYW5kbGluZywgYW5kIGhhbmRsZXMgcmVhZGluZyBhbmQKLSAgIHdyaXRpbmcgdGhlIHJlbG9jYXRpb25zIGhlcmUuCi0KLSAgIFRoZSBNSVBTIDY0LWJpdCBFTEYgQUJJIGFsc28gdXNlcyBhbiB1bnVzdWFsIGFyY2hpdmUgbWFwIGZvcm1hdC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZSA2NC1iaXQgQUJJIGlzIG5vdCBzdXBwb3NlZCB0bwotICAgdXNlIEVDT0ZGLiAgSG93ZXZlciwgd2Ugc3VwcG9ydCBpdCBhbnlob3cgZm9yIGFuIGVhc2llciBjaGFuZ2VvdmVyLiAgKi8KLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotLyogVGhlIDY0IGJpdCB2ZXJzaW9ucyBvZiB0aGUgbWRlYnVnIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gYWxwaGEuaC4gICovCi0jaW5jbHVkZSAiY29mZi9hbHBoYS5oIgotI2RlZmluZSBFQ09GRl82NAotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotCi1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICosCi0JICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICosCi0JICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICosCi0JICAgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqLAotCSAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGxvbmcgbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3dyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3dyaXRlX2FybWFwCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKTsKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLS8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzIHdlIHJlc2VydmUuICAqLwotI2RlZmluZSBNSVBTX1JFU0VSVkVEX0dPVE5PICgyKQotCi0vKiBUaGUgcmVsb2NhdGlvbiB0YWJsZSB1c2VkIGZvciBTSFRfUkVMIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDI2IGJpdCBicmFuY2ggYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18yNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1QxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfUEMxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgY2FsbCB0aHJvdWdoIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTEwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICB7IDEzIH0sCi0gICAgeyAxNCB9LAotICAgIHsgMTUgfSwKLQotICAvKiBBIDUgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5OyBhIHNwZWNpYWwgZnVuY3Rpb24gaXMKLSAgICAgbmVlZGVkIHRvIHB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzQsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfRElTUCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgdG8gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX1BBR0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9QQUdFIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE9mZnNldCBmcm9tIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCBzdWJzdHJhY3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TVUIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TVUIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9BLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0EiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24sIGFuZCBjaGFuZ2UgYWxsIHJlbG9jYXRpb25zCi0gICAgIHRvIHJlZmVyIHRvIHRoZSBvbGQgaW5zdHJ1Y3Rpb24gYXQgdGhlIGFkZHJlc3MuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9CIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERlbGV0ZSBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0RFTEVURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ERUxFVEUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVSLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEknbSBub3Qgc3VyZSB3aGF0IHRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSwgYnV0IHRoZXkgYXJlIGRlZmluZWQKLSAgICAgb24gSXJpeCA2LiAgKi8KLQotICBIT1dUTyAoUl9NSVBTX1NDTl9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0NOX0RJU1AiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19BRERfSU1NRURJQVRFIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUEpVTVAsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEpVTVAiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUxHT1QsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMR09UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVGhlIHJlbG9jYXRpb24gdGFibGUgdXNlZCBmb3IgU0hUX1JFTEEgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbGFbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfTE8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTE8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1BDMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgY2FsbCB0aHJvdWdoIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTEwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAgeyAxMyB9LAotICAgIHsgMTQgfSwKLSAgICB7IDE1IH0sCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNiBiaXQgc2hpZnQgZmllbGQuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHk7IGEgc3BlY2lhbCBmdW5jdGlvbiBpcwotICAgICBuZWVkZWQgdG8gcHV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiB0aGUgcmlnaHQgcGxhY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzQsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgdG8gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX1BBR0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9QQUdFIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfT0ZTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX09GU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3Vic3RyYWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfU1VCLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU1VCIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9BLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0EiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24sIGFuZCBjaGFuZ2UgYWxsIHJlbG9jYXRpb25zCi0gICAgIHRvIHJlZmVyIHRvIHRoZSBvbGQgaW5zdHJ1Y3Rpb24gYXQgdGhlIGFkZHJlc3MuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9CIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERlbGV0ZSBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0RFTEVURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ERUxFVEUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVSLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXN0IHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEknbSBub3Qgc3VyZSB3aGF0IHRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSwgYnV0IHRoZXkgYXJlIGRlZmluZWQKLSAgICAgb24gSXJpeCA2LiAgKi8KLQotICBIT1dUTyAoUl9NSVBTX1NDTl9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0NOX0RJU1AiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19BRERfSU1NRURJQVRFIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUEpVTVAsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEpVTVAiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUxHT1QsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMR09UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogU3dhcCBpbiBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX3N5bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zeW0pOwotICBkc3QtPnJfc3N5bSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3NzeW0pOwotICBkc3QtPnJfdHlwZTMgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMyk7Ci0gIGRzdC0+cl90eXBlMiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUyKTsKLSAgZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlKTsKLX0KLQotLyogU3dhcCBpbiBhIE1JUFMgNjQtYml0IFJlbGEgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9zeW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3ltKTsKLSAgZHN0LT5yX3NzeW0gPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zc3ltKTsKLSAgZHN0LT5yX3R5cGUzID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTMpOwotICBkc3QtPnJfdHlwZTIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMik7Ci0gIGRzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZSk7Ci0gIGRzdC0+cl9hZGRlbmQgPSBiZmRfaF9nZXRfc2lnbmVkXzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2FkZGVuZCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKLX0KLQotLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKLSAgYmZkX2hfcHV0XzY0IChhYmZkLCBzcmMtPnJfYWRkZW5kLCAoYmZkX2J5dGUgKikgZHN0LT5yX2FkZGVuZCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWwgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBiZmRfYnl0ZSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsIG1pcmVsOwotCi0gIG1pcHNfZWxmNjRfc3dhcF9yZWxvY19pbiAoYWJmZCwgCi0JCQkgICAgKGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICopIHNyYywKLQkJCSAgICAmbWlyZWwpOwotCi0gIGRzdFswXS5yX29mZnNldCA9IG1pcmVsLnJfb2Zmc2V0OwotICBkc3RbMF0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChtaXJlbC5yX3N5bSwgbWlyZWwucl90eXBlKTsKLSAgZHN0WzFdLnJfb2Zmc2V0ID0gbWlyZWwucl9vZmZzZXQ7Ci0gIGRzdFsxXS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKG1pcmVsLnJfc3N5bSwgbWlyZWwucl90eXBlMik7Ci0gIGRzdFsyXS5yX29mZnNldCA9IG1pcmVsLnJfb2Zmc2V0OwotICBkc3RbMl0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChTVE5fVU5ERUYsIG1pcmVsLnJfdHlwZTMpOwotfQotCi0vKiBTd2FwIGluIGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBiZmRfYnl0ZSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgbWlyZWxhOwotCi0gIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIAotCQkJICAgICAoY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICopIHNyYywKLQkJCSAgICAgJm1pcmVsYSk7Ci0KLSAgZHN0WzBdLnJfb2Zmc2V0ID0gbWlyZWxhLnJfb2Zmc2V0OwotICBkc3RbMF0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChtaXJlbGEucl9zeW0sIG1pcmVsYS5yX3R5cGUpOwotICBkc3RbMF0ucl9hZGRlbmQgPSBtaXJlbGEucl9hZGRlbmQ7Ci0gIGRzdFsxXS5yX29mZnNldCA9IG1pcmVsYS5yX29mZnNldDsKLSAgZHN0WzFdLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAobWlyZWxhLnJfc3N5bSwgbWlyZWxhLnJfdHlwZTIpOwotICBkc3RbMV0ucl9hZGRlbmQgPSAwOwotICBkc3RbMl0ucl9vZmZzZXQgPSBtaXJlbGEucl9vZmZzZXQ7Ci0gIGRzdFsyXS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKFNUTl9VTkRFRiwgbWlyZWxhLnJfdHlwZTMpOwotICBkc3RbMl0ucl9hZGRlbmQgPSAwOwotfQotCi0vKiBTd2FwIG91dCBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X2JlX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIGJmZF9ieXRlICpkc3Q7Ci17Ci0gIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsIG1pcmVsOwotCi0gIG1pcmVsLnJfb2Zmc2V0ID0gc3JjLT5yX29mZnNldDsKLSAgbWlyZWwucl90eXBlID0gRUxGMzJfUl9UWVBFIChzcmMtPnJfaW5mbyk7Ci0gIG1pcmVsLnJfc3ltID0gRUxGMzJfUl9TWU0gKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWwucl90eXBlMiA9IFJfTUlQU19OT05FOwotICBtaXJlbC5yX3NzeW0gPSBTVE5fVU5ERUY7Ci0gIG1pcmVsLnJfdHlwZTMgPSBSX01JUFNfTk9ORTsKLQotICBtaXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmbWlyZWwsIAotCQkJICAgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKikgZHN0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqc3JjOwotICAgICBiZmRfYnl0ZSAqZHN0OwotewotICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgbWlyZWxhOwotCi0gIG1pcmVsYS5yX29mZnNldCA9IHNyYy0+cl9vZmZzZXQ7Ci0gIG1pcmVsYS5yX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWxhLnJfYWRkZW5kID0gc3JjLT5yX2FkZGVuZDsKLSAgbWlyZWxhLnJfc3ltID0gRUxGMzJfUl9TWU0gKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWxhLnJfdHlwZTIgPSBSX01JUFNfTk9ORTsKLSAgbWlyZWxhLnJfc3N5bSA9IFNUTl9VTkRFRjsKLSAgbWlyZWxhLnJfdHlwZTMgPSBSX01JUFNfTk9ORTsKLQotICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJm1pcmVsYSwgCi0JCQkgICAgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICopIGRzdCk7Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBNSVBTIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAotICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NSVBTX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfU1VCLCBSX01JUFNfU1VCIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UsIFJfTUlQU19HT1RfUEFHRSB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNULCBSX01JUFNfR09UX09GU1QgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfRElTUCwgUl9NSVBTX0dPVF9ESVNQIH0KLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQl7Ci0JICBpbnQgdjsKLQotCSAgdiA9IChpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWw7Ci0JICByZXR1cm4gJm1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsW3ZdOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNpbmNlIGVhY2ggZW50cnkgaW4gYW4gU0hUX1JFTCBvciBTSFRfUkVMQSBzZWN0aW9uIGNhbiByZXByZXNlbnQgdXAKLSAgIHRvIHRocmVlIHJlbG9jcywgd2UgbXVzdCB0ZWxsIHRoZSB1c2VyIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UuICAqLwotCi1zdGF0aWMgbG9uZwotbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gKHNlYy0+cmVsb2NfY291bnQgKiAzICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIFJlYWQgdGhlIHJlbG9jYXRpb25zIGZyb20gb25lIHJlbG9jIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCByZWxfaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotewotICBQVFIgYWxsb2NhdGVkID0gTlVMTDsKLSAgYmZkX2J5dGUgKm5hdGl2ZV9yZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbGVudHM7Ci0gIGFyZWxlbnQgKnJlbGVudDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvX3RhYmxlOwotCi0gIGFsbG9jYXRlZCA9IChQVFIpIGJmZF9tYWxsb2MgKHJlbF9oZHItPnNoX3NpemUpOwotICBpZiAoYWxsb2NhdGVkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCByZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGFsbG9jYXRlZCwgMSwgcmVsX2hkci0+c2hfc2l6ZSwgYWJmZCkgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7Ci0KLSAgcmVsZW50cyA9IGFzZWN0LT5yZWxvY2F0aW9uICsgYXNlY3QtPnJlbG9jX2NvdW50OwotCi0gIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOwotICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpCi0JICAgICAgfHwgZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSkpOwotCi0gIGNvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIGVudHNpemU7Ci0KLSAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCkpCi0gICAgaG93dG9fdGFibGUgPSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbDsKLSAgZWxzZQotICAgIGhvd3RvX3RhYmxlID0gbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxhOwotCi0gIHJlbGVudCA9IHJlbGVudHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBuYXRpdmVfcmVsb2NzICs9IGVudHNpemUpCi0gICAgewotICAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIHJlbGE7Ci0gICAgICBib29sZWFuIHVzZWRfc3ltLCB1c2VkX3NzeW07Ci0gICAgICBpbnQgaXI7Ci0KLSAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhKSkKLQltaXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luIChhYmZkLAotCQkJCSAgIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgbmF0aXZlX3JlbG9jcywKLQkJCQkgICAmcmVsYSk7Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgcmVsOwotCi0JICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4gKGFiZmQsCi0JCQkJICAgIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqKSBuYXRpdmVfcmVsb2NzLAotCQkJCSAgICAmcmVsKTsKLQkgIHJlbGEucl9vZmZzZXQgPSByZWwucl9vZmZzZXQ7Ci0JICByZWxhLnJfc3ltID0gcmVsLnJfc3ltOwotCSAgcmVsYS5yX3NzeW0gPSByZWwucl9zc3ltOwotCSAgcmVsYS5yX3R5cGUzID0gcmVsLnJfdHlwZTM7Ci0JICByZWxhLnJfdHlwZTIgPSByZWwucl90eXBlMjsKLQkgIHJlbGEucl90eXBlID0gcmVsLnJfdHlwZTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogRWFjaCBlbnRyeSByZXByZXNlbnRzIHVwIHRvIHRocmVlIGFjdHVhbCByZWxvY2F0aW9ucy4gICovCi0KLSAgICAgIHVzZWRfc3ltID0gZmFsc2U7Ci0gICAgICB1c2VkX3NzeW0gPSBmYWxzZTsKLSAgICAgIGZvciAoaXIgPSAwOyBpciA8IDM7IGlyKyspCi0JewotCSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIHR5cGU7Ci0KLQkgIHN3aXRjaCAoaXIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSAwOgotCSAgICAgIHR5cGUgPSAoZW51bSBlbGZfbWlwc19yZWxvY190eXBlKSByZWxhLnJfdHlwZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOgotCSAgICAgIHR5cGUgPSAoZW51bSBlbGZfbWlwc19yZWxvY190eXBlKSByZWxhLnJfdHlwZTI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICB0eXBlID0gKGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSkgcmVsYS5yX3R5cGUzOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICh0eXBlID09IFJfTUlQU19OT05FKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgcmVsb2NhdGlvbnMgaW4gdGhpcyBlbnRyeS4gIElmIHRoaXMKLSAgICAgICAgICAgICAgICAgaXMgdGhlIGZpcnN0IGVudHJ5LCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZHVtbXkKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBzbyB0aGF0IHRoZSBnZW5lcmljIGxpbmtlciBrbm93cyB0aGF0Ci0gICAgICAgICAgICAgICAgIHRoZXJlIGhhcyBiZWVuIGEgYnJlYWsgaW4gdGhlIHNlcXVlbmNlIG9mIHJlbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgIGFwcGx5aW5nIHRvIGEgcGFydGljdWxhciBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAoaXIgPT0gMCkKLQkJewotCQkgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkJICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLQkJICBlbHNlCi0JCSAgICByZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0IC0gYXNlY3QtPnZtYTsKLQkJICByZWxlbnQtPmFkZGVuZCA9IDA7Ci0JCSAgcmVsZW50LT5ob3d0byA9ICZob3d0b190YWJsZVsoaW50KSBSX01JUFNfTk9ORV07Ci0JCSAgKytyZWxlbnQ7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBTb21lIHR5cGVzIHJlcXVpcmUgc3ltYm9scywgd2hlcmVhcyBzb21lIGRvIG5vdC4gICovCi0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX01JUFNfTk9ORToKLQkgICAgY2FzZSBSX01JUFNfTElURVJBTDoKLQkgICAgY2FzZSBSX01JUFNfSU5TRVJUX0E6Ci0JICAgIGNhc2UgUl9NSVBTX0lOU0VSVF9COgotCSAgICBjYXNlIFJfTUlQU19ERUxFVEU6Ci0JICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKCEgdXNlZF9zeW0pCi0JCXsKLQkJICBpZiAocmVsYS5yX3N5bSA9PSAwKQotCQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXN5bWJvbCAqKnBzLCAqczsKLQotCQkgICAgICBwcyA9IHN5bWJvbHMgKyByZWxhLnJfc3ltIC0gMTsKLQkJICAgICAgcyA9ICpwczsKLQkJICAgICAgaWYgKChzLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkJCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBwczsKLQkJICAgICAgZWxzZQotCQkJcmVsZW50LT5zeW1fcHRyX3B0ciA9IHMtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCQkgICAgfQotCi0JCSAgdXNlZF9zeW0gPSB0cnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoISB1c2VkX3NzeW0pCi0JCXsKLQkJICBzd2l0Y2ggKHJlbGEucl9zc3ltKQotCQkgICAgewotCQkgICAgY2FzZSBSU1NfVU5ERUY6Ci0JCSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPQotCQkJYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIFJTU19HUDoKLQkJICAgIGNhc2UgUlNTX0dQMDoKLQkJICAgIGNhc2UgUlNTX0xPQzoKLQkJICAgICAgLyogRklYTUU6IEkgdGhpbmsgdGhlc2UgbmVlZCB0byBiZSBoYW5kbGVkIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCBob3d0byBzdHJ1Y3R1cmVzLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBCRkRfQVNTRVJUICgwKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICB1c2VkX3NzeW0gPSB0cnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4KLQkgICAgIG9iamVjdCBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvcgotCSAgICAgc2hhcmVkIGxpYnJhcnkuICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMKLQkgICAgIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLQkgIGVsc2UKLQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7Ci0KLQkgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKLQotCSAgcmVsZW50LT5ob3d0byA9ICZob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLQotCSAgKytyZWxlbnQ7Ci0JfQotICAgIH0KLQotICBhc2VjdC0+cmVsb2NfY291bnQgKz0gcmVsZW50IC0gcmVsZW50czsKLQotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICBPbiBJcml4IDYsIHRoZXJlIGNhbiBiZSB0d28gcmVsb2Mgc2VjdGlvbnMKLSAgIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKiBjb25zdCBkID0gZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpOwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbiAhPSBOVUxMCi0gICAgICB8fCAoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBhc2VjdC0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgMyBhcmVsZW50IHN0cnVjdHVyZXMgZm9yIGVhY2ggUmVsIHN0cnVjdHVyZS4gICovCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gKChhcmVsZW50ICopCi0JCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICBhc2VjdC0+cmVsb2NfY291bnQgKiAzICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIHNsdXJwX29uZV9yZWxvY190YWJsZSByb3V0aW5lIGluY3JlbWVudHMgcmVsb2NfY291bnQuICAqLwotICBhc2VjdC0+cmVsb2NfY291bnQgPSAwOwotCi0gIGlmICghIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgJmQtPnJlbF9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGQtPnJlbF9oZHIyICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLAotCQkJCQkgICAgICBkLT5yZWxfaGRyMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3dyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBib29sZWFuICpmYWlsZWRwID0gKGJvb2xlYW4gKikgZGF0YTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqZXh0X3JlbGE7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIGFzeW1ib2wgKmxhc3Rfc3ltID0gMDsKLSAgaW50IGxhc3Rfc3ltX2lkeCA9IDA7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAoKmZhaWxlZHApCi0gICAgcmV0dXJuOwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhlIGxpbmtlciBiYWNrZW5kIHdyaXRlcyB0aGUgcmVsb2NzIG91dCBpdHNlbGYsIGFuZCBzZXRzIHRoZQotICAgICByZWxvY19jb3VudCBmaWVsZCB0byB6ZXJvIHRvIGluaGliaXQgd3JpdGluZyB0aGVtIGhlcmUuICBBbHNvLAotICAgICBzb21ldGltZXMgdGhlIFNFQ19SRUxPQyBmbGFnIGdldHMgc2V0IGV2ZW4gd2hlbiB0aGVyZSBhcmVuJ3QgYW55Ci0gICAgIHJlbG9jcy4gICovCi0gIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIGNhbiBjb21iaW5lIHVwIHRvIHRocmVlIHJlbG9jcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGFkZHJlc3MKLSAgICAgaWYgdGhlIGxhdHRlciByZWxvY3MgaGF2ZSBubyBhc3NvY2lhdGVkIHN5bWJvbC4gICovCi0gIGNvdW50ID0gMDsKLSAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgKytjb3VudDsKLQotICAgICAgYWRkciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XS0+YWRkcmVzczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCSAgYXJlbGVudCAqcjsKLQotCSAgaWYgKGlkeCArIDEgPj0gc2VjLT5yZWxvY19jb3VudCkKLQkgICAgYnJlYWs7Ci0JICByID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQkgIGlmIChyLT5hZGRyZXNzICE9IGFkZHIKLQkgICAgICB8fCAhIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgfHwgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlICE9IDApCi0JICAgIGJyZWFrOwotCi0JICAvKiBXZSBjYW4gbWVyZ2UgdGhlIHJlbG9jIGF0IElEWCArIDEgd2l0aCB0aGUgcmVsb2MgYXQgSURYLiAgKi8KLQotCSAgKytpZHg7Ci0JfQotICAgIH0KLQotICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOwotCi0gIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBjb3VudDsKLSAgcmVsYV9oZHItPmNvbnRlbnRzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxhX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChyZWxhX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqZmFpbGVkcCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGV4dF9yZWxhID0gKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyssIGV4dF9yZWxhKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcHRyOwotICAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIGludF9yZWxhOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgaW50IG47Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCWludF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotICAgICAgZWxzZQotCWludF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLSAgICAgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotICAgICAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQluID0gbGFzdF9zeW1faWR4OwotICAgICAgZWxzZQotCXsKLQkgIGxhc3Rfc3ltID0gc3ltOwotCSAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgaWYgKG4gPCAwKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgbGFzdF9zeW1faWR4ID0gbjsKLQl9Ci0KLSAgICAgIGludF9yZWxhLnJfc3ltID0gbjsKLQotICAgICAgaW50X3JlbGEucl9hZGRlbmQgPSBwdHItPmFkZGVuZDsKLQotICAgICAgaW50X3JlbGEucl9zc3ltID0gUlNTX1VOREVGOwotCi0gICAgICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjCi0JICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQotCXsKLQkgICpmYWlsZWRwID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGludF9yZWxhLnJfdHlwZSA9IHB0ci0+aG93dG8tPnR5cGU7Ci0gICAgICBpbnRfcmVsYS5yX3R5cGUyID0gKGludCkgUl9NSVBTX05PTkU7Ci0gICAgICBpbnRfcmVsYS5yX3R5cGUzID0gKGludCkgUl9NSVBTX05PTkU7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCSAgYXJlbGVudCAqcjsKLQotCSAgaWYgKGlkeCArIDEgPj0gc2VjLT5yZWxvY19jb3VudCkKLQkgICAgYnJlYWs7Ci0JICByID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQkgIGlmIChyLT5hZGRyZXNzICE9IHB0ci0+YWRkcmVzcwotCSAgICAgIHx8ICEgYmZkX2lzX2Fic19zZWN0aW9uICgoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikKLQkgICAgICB8fCAoKnItPnN5bV9wdHJfcHRyKS0+dmFsdWUgIT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIC8qIFdlIGNhbiBtZXJnZSB0aGUgcmVsb2MgYXQgSURYICsgMSB3aXRoIHRoZSByZWxvYyBhdCBJRFguICAqLwotCi0JICBpZiAoaSA9PSAwKQotCSAgICBpbnRfcmVsYS5yX3R5cGUyID0gci0+aG93dG8tPnR5cGU7Ci0JICBlbHNlCi0JICAgIGludF9yZWxhLnJfdHlwZTMgPSByLT5ob3d0by0+dHlwZTsKLQotCSAgKytpZHg7Ci0JfQotCi0gICAgICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmludF9yZWxhLCBleHRfcmVsYSk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGV4dF9yZWxhIC0gKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHMKLQkgICAgICA9PSBjb3VudCk7Ci19Ci0MCi0vKiBJcml4IDYgZGVmaW5lcyBhIGJyYW5kIG5ldyBhcmNoaXZlIG1hcCBmb3JtYXQsIHNvIHRoYXQgdGhleSBjYW4KLSAgIGhhdmUgYXJjaGl2ZXMgbW9yZSB0aGFuIDQgR0IgaW4gc2l6ZS4gICovCi0KLS8qIFJlYWQgYW4gSXJpeCA2IGFybWFwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgZmlsZV9wdHIgYXJoZHJwb3M7Ci0gIGJmZF9zaXplX3R5cGUgaSwgcGFyc2VkX3NpemUsIG5zeW16LCBzdHJpbmdzaXplLCBjYXJzeW1fc2l6ZSwgcHRyc2l6ZTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgYmZkX2J5dGUgaW50X2J1Zls4XTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgYmZkX2J5dGUgKnJhd19hcm1hcCA9IE5VTEw7Ci0gIGNhcnN5bSAqY2Fyc3ltczsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSBOVUxMOwotCi0gIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgZWxlbWVudC4gICovCi0gIGFyaGRycG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFyY2hpdmVzIHdpdGggdHJhZGl0aW9uYWwgYXJtYXBzIGFyZSBzdGlsbCBwZXJtaXR0ZWQuICAqLwotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICIvICAgICAgICAgICAgICAgIiwgMTYpID09IDApCi0gICAgcmV0dXJuIGJmZF9zbHVycF9hcm1hcCAoYWJmZCk7Ci0KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiL1NZTTY0LyAgICAgICAgICIsIDE2KSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLQotICBpZiAoYmZkX3JlYWQgKGludF9idWYsIDEsIDgsIGFiZmQpICE9IDgpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG5zeW16ID0gYmZkX2dldGI2NCAoaW50X2J1Zik7Ci0gIHN0cmluZ3NpemUgPSBwYXJzZWRfc2l6ZSAtIDggKiBuc3lteiAtIDg7Ci0KLSAgY2Fyc3ltX3NpemUgPSBuc3lteiAqIHNpemVvZiAoY2Fyc3ltKTsKLSAgcHRyc2l6ZSA9IDggKiBuc3ltejsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF96YWxsb2MgKGFiZmQsIGNhcnN5bV9zaXplICsgc3RyaW5nc2l6ZSArIDEpOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjYXJzeW1zID0gYXJkYXRhLT5zeW1kZWZzOwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIGFyZGF0YS0+c3ltZGVmcykgKyBjYXJzeW1fc2l6ZTsKLQotICByYXdfYXJtYXAgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBwdHJzaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfcmVhZCAocmF3X2FybWFwLCAxLCBwdHJzaXplLCBhYmZkKSAhPSBwdHJzaXplCi0gICAgICB8fCBiZmRfcmVhZCAoc3RyaW5nYmFzZSwgMSwgc3RyaW5nc2l6ZSwgYWJmZCkgIT0gc3RyaW5nc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbnN5bXo7IGkrKykKLSAgICB7Ci0gICAgICBjYXJzeW1zLT5maWxlX29mZnNldCA9IGJmZF9nZXRiNjQgKHJhd19hcm1hcCArIGkgKiA4KTsKLSAgICAgIGNhcnN5bXMtPm5hbWUgPSBzdHJpbmdiYXNlOwotICAgICAgc3RyaW5nYmFzZSArPSBzdHJsZW4gKHN0cmluZ2Jhc2UpICsgMTsKLSAgICAgICsrY2Fyc3ltczsKLSAgICB9Ci0gICpzdHJpbmdiYXNlID0gJ1wwJzsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IG5zeW16OwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGFyaGRycG9zICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIHBhcnNlZF9zaXplOwotCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCByYXdfYXJtYXApOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAocmF3X2FybWFwICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJhd19hcm1hcCk7Ci0gIGlmIChhcmRhdGEtPnN5bWRlZnMgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYXJkYXRhLT5zeW1kZWZzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gSXJpeCA2IGFybWFwLiAgVGhlIElyaXggNiB0b29scyBhcmUgc3VwcG9zZWQgdG8gYmUKLSAgIGFibGUgdG8gaGFuZGxlIG9yZGluYXJ5IEVMRiBhcm1hcHMsIGJ1dCBhdCBsZWFzdCBvbiBJcml4IDYuMiB0aGUKLSAgIGxpbmtlciBjcmFzaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgc3ltYm9sX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgdW5zaWduZWQgaW50IHJhbmxpYnNpemUgPSAoc3ltYm9sX2NvdW50ICogOCkgKyA4OwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZSA9IHN0cmlkeDsKLSAgdW5zaWduZWQgaW50IG1hcHNpemUgPSBzdHJpbmdzaXplICsgcmFubGlic2l6ZTsKLSAgZmlsZV9wdHIgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHI7Ci0gIGJmZCAqY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBwYWRkaW5nOwotICBiZmRfYnl0ZSBidWZbOF07Ci0KLSAgcGFkZGluZyA9IEJGRF9BTElHTiAobWFwc2l6ZSwgOCkgLSBtYXBzaXplOwotICBtYXBzaXplICs9IHBhZGRpbmc7Ci0KLSAgLyogd29yayBvdXQgd2hlcmUgdGhlIGZpcnN0IG9iamVjdCBmaWxlIHdpbGwgZ28gaW4gdGhlIGFyY2hpdmUgKi8KLSAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgPSAobWFwc2l6ZQotCQkJICAgICArIGVsZW5ndGgKLQkJCSAgICAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCi0JCQkgICAgICsgU0FSTUFHKTsKLQotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIHN0cmNweSAoaGRyLmFyX25hbWUsICIvU1lNNjQvIik7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBtYXBzaXplKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgdGltZSAoTlVMTCkpOwotICAvKiBUaGlzLCBhdCBsZWFzdCwgaXMgd2hhdCBJbnRlbCBjb2ZmIHNldHMgdGhlIHZhbHVlcyB0by46ICovCi0gIHNwcmludGYgKChoZHIuYXJfdWlkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfZ2lkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfbW9kZSksICIlLTdvIiwgKHVuc2lnbmVkKSAwKTsKLSAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgLyogV3JpdGUgdGhlIGFyIGhlYWRlciBmb3IgdGhpcyBpdGVtIGFuZCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dGI2NCAoc3ltYm9sX2NvdW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDgsIGFyY2gpICE9IDgpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFR3byBwYXNzZXMsIGZpcnN0IHdyaXRlIHRoZSBmaWxlIG9mZnNldHMgZm9yIGVhY2ggc3ltYm9sIC0KLSAgICAgcmVtZW1iZXJpbmcgdGhhdCBlYWNoIG9mZnNldCBpcyBvbiBhIHR3byBieXRlIGJvdW5kYXJ5LiAgKi8KLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggZWFjaAotICAgICBzeW1ib2wsIGFuZCByZW1lbWJlciB0byBrZWVwIHRoZSBvZmZzZXRzIHBhZGRlZCBvdXQuICAqLwotCi0gIGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKGN1cnJlbnQgIT0gKGJmZCAqKSBOVUxMICYmIGNvdW50IDwgc3ltYm9sX2NvdW50KQotICAgIHsKLSAgICAgIC8qIEZvciBlYWNoIHN5bWJvbCB3aGljaCBpcyB1c2VkIGRlZmluZWQgaW4gdGhpcyBvYmplY3QsIHdyaXRlIG91dAotCSB0aGUgb2JqZWN0IGZpbGUncyBhZGRyZXNzIGluIHRoZSBhcmNoaXZlICovCi0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKSA9PSBjdXJyZW50KQotCXsKLQkgIGJmZF9wdXRiNjQgKGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyLCBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhcmNoKSAhPSA4KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBjb3VudCsrOwotCX0KLSAgICAgIC8qIEFkZCBzaXplIG9mIHRoaXMgYXJjaGl2ZSBlbnRyeSAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gKGFyZWx0X3NpemUgKGN1cnJlbnQpCi0JCQkJICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgLyogcmVtZW1iZXIgYWJvdXQgdGhlIGV2ZW4gYWxpZ25tZW50ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciAlIDI7Ci0gICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLSAgICB9Ci0KLSAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3ltYm9sX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhpcyBzaG91bGQgYmUgcGFkZGVkIHRvIGFuIDggYnl0ZSBib3VuZGFyeS4KLSAgICAgSG93ZXZlciwgdGhlIElyaXggNi4yIHRvb2xzIGRvIG5vdCBhcHBlYXIgdG8gZG8gdGhpcy4gICovCi0gIHdoaWxlIChwYWRkaW5nICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLS1wYWRkaW5nOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCBtaXBzX2VsZjY0X2Vjb2ZmX2RlYnVnX3N3YXAgPQotewotICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgbWFnaWNTeW0yLAotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIDgsCi0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gIGVjb2ZmX3N3YXBfZG5yX2luLAotICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgZWNvZmZfc3dhcF9zeW1faW4sCi0gIGVjb2ZmX3N3YXBfb3B0X2luLAotICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gIGVjb2ZmX3N3YXBfZXh0X2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0vKiBSZWxvY2F0aW9ucyBpbiB0aGUgNjQgYml0IE1JUFMgRUxGIEFCSSBhcmUgbW9yZSBjb21wbGV4IHRoYW4gaW4KLSAgIHN0YW5kYXJkIEVMRi4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVkaXJlY3QgdGhlIHJlbG9jYXRpb24KLSAgIGhhbmRsaW5nIHJvdXRpbmVzLiAgKi8KLQotY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gbWlwc19lbGY2NF9zaXplX2luZm8gPQotewotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0VoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1BoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1NoZHIpLAotICBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsKSwKLSAgc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfRHluKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfTm90ZSksCi0gIDQsICAgICAgICAgICAgLyogaGFzaC10YWJsZSBlbnRyeSBzaXplICovCi0gIDMsICAgICAgICAgICAgLyogaW50ZXJuYWwgcmVsb2NhdGlvbnMgcGVyIGV4dGVybmFsIHJlbG9jYXRpb25zICovCi0gIDY0LAkJLyogYXJjaF9zaXplICovCi0gIDgsCQkvKiBmaWxlX2FsaWduICovCi0gIEVMRkNMQVNTNjQsCi0gIEVWX0NVUlJFTlQsCi0gIGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMsCi0gIGJmZF9lbGY2NF93cml0ZV9zaGRyc19hbmRfZWhkciwKLSAgbWlwc19lbGY2NF93cml0ZV9yZWxvY3MsCi0gIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQsCi0gIG1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiwKLSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCwKLSAgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luLAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2Nfb3V0LAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luLAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dAotfTsKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjY0LWxpdHRsZW1pcHMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjY0X2JpZ21pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGY2NC1iaWdtaXBzIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX21pcHMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTUlQUwotCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NvbGxlY3QJCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2luZm8JCW1pcHNfZWxmNjRfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQlfYmZkX21pcHNfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwlfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAlfYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAJJm1pcHNfZWxmNjRfZWNvZmZfZGVidWdfc3dhcAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwlfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotCQkJCQlfYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICBfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgXAotCQkJCQlfYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJX2JmZF9taXBzX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawlfYmZkX21pcHNfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCSg0Kk1JUFNfUkVTRVJWRURfR09UTk8pCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AgICAgICAgMQotCi0vKiBXZSBkb24ndCBzZXQgYmZkX2VsZjY0X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJlY2F1c2UgdGhlIDMyLWJpdCAKLSAgIE1JUFMtc3BlY2lmaWMgZnVuY3Rpb24gb25seSBhcHBsaWVzIHRvIElSSVg1LCB3aGljaCBoYWQgbm8gNjQtYml0Ci0gICBBQkkuICAqLwotI2RlZmluZSBiZmRfZWxmNjRfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmNjRfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQlfYmZkX21pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rCV9iZmRfbWlwc19lbGZfZmluYWxfbGluawotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3NldF9wcml2YXRlX2ZsYWdzCV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCBtaXBzX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwCW1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZnVuY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3NsdXJwX2FybWFwCW1pcHNfZWxmNjRfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLQkJCQkJX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3dyaXRlX2FybWFwCW1pcHNfZWxmNjRfd3JpdGVfYXJtYXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfcmVhZF9hcl9oZHIJX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCBcCi0JCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLQkJCQkJX2JmZF9hcmNoaXZlX2NvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LXNwYXJjLmMgYi9iZmQvZWxmNjQtc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyNzg5Ny4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OTAgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0vKiBUaGlzIGlzIGRlZmluZWQgaWYgb25lIHdhbnRzIHRvIGJ1aWxkIHVwd2FyZCBjb21wYXRpYmxlIGJpbmFyaWVzCi0gICB3aXRoIHRoZSBvcmlnaW5hbCBzcGFyYzY0LWVsZiB0b29sY2hhaW4uICBUaGUgc3VwcG9ydCBpcyBrZXB0IGluIGZvcgotICAgbm93IGJ1dCBpcyB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQuICBkamUgOTcwOTMwICAqLwotLyojZGVmaW5lIFNQQVJDNjRfT0xEX1JFTE9DUyovCi0KLSNpbmNsdWRlICJlbGYvc3BhcmMuaCIKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZS4gICovCi0jZGVmaW5lIE1JTlVTX09ORSAofiAoYmZkX3ZtYSkgMCkKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogc3BhcmM2NF9lbGZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TKChiZmQgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi1zdGF0aWMgdm9pZCBzcGFyYzY0X2VsZl9idWlsZF9wbHQKLSAgUEFSQU1TKChiZmQgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hIHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQKLSAgUEFSQU1TKChpbnQpKTsKLXN0YXRpYyBiZmRfdm1hIHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0Ci0gIFBBUkFNUygoaW50LCBpbnQpKTsKLQotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICpzZWMsCi0JICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGludCBzcGFyYzY0X2VsZl9nZXRfc3ltYm9sX3R5cGUKLSAgUEFSQU1TICgoIEVsZl9JbnRlcm5hbF9TeW0gKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLSAgICAgICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotc3RhdGljIHZvaWQgc3BhcmM2NF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3BhcmM2NF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgbG9uZyBzcGFyYzY0X2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfc2x1cnBfb25lX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9zbHVycF9yZWxvY190YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGxvbmcgc3BhcmM2NF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyB2b2lkIHNwYXJjNjRfZWxmX3dyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0MCi0vKiBUaGUgcmVsb2NhdGlvbiAiaG93dG8iIHRhYmxlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbm90c3VwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX2hpeDIyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbG94MTBfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ184LCAgICAgICAgIDAsMCwgOCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzgiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTYsICAgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzMyLCAgICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQOCwgICAgIDAsMCwgOCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1A4IiwgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDE2LCAgICAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQMTYiLCAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AzMiwgICAgMCwyLDMyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDMyIiwgIGZhbHNlLDAsMHgwMGZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDMwLCAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMzAiLCBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AyMiwgICAyLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDIyIiwgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hJMjIsICAgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSEkyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18yMiwgICAgICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzIyIiwgICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTMsICAgICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMyIsICAgICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPMTAsICAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTE8xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMCwgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDEwIiwgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTMsICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMyIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDIyLCAgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMjIiLCAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzEwLCAgICAgIDAsMiwxMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMyMiwgICAgIDEwLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dQTFQzMCwgICAgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV1BMVDMwIiwgIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19DT1BZLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0NPUFkiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR0xPQl9EQVQsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HTE9CX0RBVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0pNUF9TTE9ULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSk1QX1NMT1QiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUxBVElWRSwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1JFTEFUSVZFIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUEzMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VQTMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2lmbmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MKLSAgLyogVGhlc2UgYXJlbid0IGltcGxlbWVudGVkIHlldC4gICovCi0gIEhPV1RPKFJfU1BBUkNfUExUMzIsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QTFQzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVBMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX0hJUExUMjIiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPUExUMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfTE9QTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQzMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QQ1BMVDMyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BDUExUMjIiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDUExUMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUENQTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0jZW5kaWYKLSAgSE9XVE8oUl9TUEFSQ18xMCwgICAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEwIiwgICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTEsICAgICAgICAwLDIsMTEsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMSIsICAgICAgZmFsc2UsMCwweDAwMDAwN2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzY0LCAgICAgICAgMCw0LDY0LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNjQiLCAgICAgIGZhbHNlLDAsTUlOVVNfT05FLCB0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19PTE8xMCwgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX09MTzEwIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEgyMiwgICAgIDQyLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hNMTAsICAgICAzMiwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSE0xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xNMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfSEgyMiwgIDQyLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hNMTAsICAzMiwyLDEwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUENfSE0xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19MTTIyLCAgMTAsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDX0xNMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AxNiwgICAyLDIsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYywiUl9TUEFSQ19XRElTUDE2IiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMTksICAgMiwyLDE5LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AxOSIsIGZhbHNlLDAsMHgwMDA3ZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VTlVTRURfNDIsIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VOVVNFRF80MiIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzcsICAgICAgICAgMCwyLCA3LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNyIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDA3Zix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ181LCAgICAgICAgIDAsMiwgNSxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzUiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwMWYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNiwgICAgICAgICAwLDIsIDYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ182IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDNmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A2NCwgICAgMCw0LDY0LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDY0IiwgIGZhbHNlLDAsTUlOVVNfT05FLCB0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QTFQ2NCwgICAgIDAsNCw2NCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BMVDY0IiwgICBmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0hJWDIyLCAgICAgMCw0LCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsc3BhcmNfZWxmX2hpeDIyX3JlbG9jLCAgIlJfU1BBUkNfSElYMjIiLCAgIGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfTE9YMTAsICAgICAwLDQsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbG94MTBfcmVsb2MsICAiUl9TUEFSQ19MT1gxMCIsICAgZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19INDQsICAgICAgMjIsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0g0NCIsICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX000NCwgICAgICAxMiwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTTQ0IiwgICAgIGZhbHNlLDAsMHgwMDAwMDNmZixmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfTDQ0LCAgICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MNDQiLCAgICAgZmFsc2UsMCwweDAwMDAwZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUdJU1RFUiwgIDAsNCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1JFR0lTVEVSIixmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX1VBNjQsICAgICAgICAwLDQsNjQsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VQTY0IiwgICAgICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUExNiwgICAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKQotfTsKLQotc3RydWN0IGVsZl9yZWxvY19tYXAgewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBlbGZfcmVsb2NfbWFwIHNwYXJjX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9TUEFSQ19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9TUEFSQ18xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9TUEFSQ184IH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfU1BBUkNfRElTUDggfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9TUEFSQ182NCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9TUEFSQ18zMiB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9TUEFSQ19ESVNQMzIgfSwKLSAgeyBCRkRfUkVMT0NfSEkyMiwgUl9TUEFSQ19ISTIyIH0sCi0gIHsgQkZEX1JFTE9DX0xPMTAsIFJfU1BBUkNfTE8xMCwgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUxfUzIsIFJfU1BBUkNfV0RJU1AzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzIyLCBSX1NQQVJDXzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMTMsIFJfU1BBUkNfMTMgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMTAsIFJfU1BBUkNfR09UMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMTMsIFJfU1BBUkNfR09UMTMgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMjIsIFJfU1BBUkNfR09UMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMxMCwgUl9TUEFSQ19QQzEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMjIsIFJfU1BBUkNfUEMyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19XUExUMzAsIFJfU1BBUkNfV1BMVDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0NPUFksIFJfU1BBUkNfQ09QWSB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCwgUl9TUEFSQ19HTE9CX0RBVCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVCwgUl9TUEFSQ19KTVBfU0xPVCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSwgUl9TUEFSQ19SRUxBVElWRSB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLCBSX1NQQVJDX1dESVNQMjIgfSwKLSAgLyogPz8/IERvZXNuJ3QgZHdhcmYgdXNlIHRoaXM/ICAqLwotLyp7IEJGRF9SRUxPQ19TUEFSQ19VQTMyLCBSX1NQQVJDX1VBMzIgfSwgbm90IHVzZWQ/PyAqLwotICB7QkZEX1JFTE9DX1NQQVJDXzEwLCBSX1NQQVJDXzEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ18xMSwgUl9TUEFSQ18xMX0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNjQsIFJfU1BBUkNfNjR9LAotICB7QkZEX1JFTE9DX1NQQVJDX09MTzEwLCBSX1NQQVJDX09MTzEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ISDIyLCBSX1NQQVJDX0hIMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX0hNMTAsIFJfU1BBUkNfSE0xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTE0yMiwgUl9TUEFSQ19MTTIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ISDIyLCBSX1NQQVJDX1BDX0hIMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAsIFJfU1BBUkNfUENfSE0xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiwgUl9TUEFSQ19QQ19MTTIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE2LCBSX1NQQVJDX1dESVNQMTZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1dESVNQMTksIFJfU1BBUkNfV0RJU1AxOX0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNywgUl9TUEFSQ183fSwKLSAge0JGRF9SRUxPQ19TUEFSQ181LCBSX1NQQVJDXzV9LAotICB7QkZEX1JFTE9DX1NQQVJDXzYsIFJfU1BBUkNfNn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfRElTUDY0LCBSX1NQQVJDX0RJU1A2NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUExUNjQsIFJfU1BBUkNfUExUNjR9LAotICB7QkZEX1JFTE9DX1NQQVJDX0hJWDIyLCBSX1NQQVJDX0hJWDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19MT1gxMCwgUl9TUEFSQ19MT1gxMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSDQ0LCBSX1NQQVJDX0g0NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTTQ0LCBSX1NQQVJDX000NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTDQ0LCBSX1NQQVJDX0w0NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIsIFJfU1BBUkNfUkVHSVNURVJ9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zcGFyYzY0X2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNwYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbKGludCkgc3BhcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGNjRfUl9UWVBFX0lEIChkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heF9zdGQpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJnNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlW0VMRjY0X1JfVFlQRV9JRCAoZHN0LT5yX2luZm8pXTsKLX0KLQwKLS8qIER1ZSB0byB0aGUgd2F5IGhvdyB3ZSBoYW5kbGUgUl9TUEFSQ19PTE8xMCwgZWFjaCBlbnRyeSBpbiBhIFNIVF9SRUxBCi0gICBzZWN0aW9uIGNhbiByZXByZXNlbnQgdXAgdG8gdHdvIHJlbG9jcywgd2UgbXVzdCB0ZWxsIHRoZSB1c2VyIHRvIGFsbG9jYXRlCi0gICBtb3JlIHNwYWNlLiAgKi8KLSAgIAotc3RhdGljIGxvbmcKLXNwYXJjNjRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiAoc2VjLT5yZWxvY19jb3VudCAqIDIgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotc3RhdGljIGxvbmcKLXNwYXJjNjRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkgKiAyOwotfQotCi0vKiBSZWFkICByZWxvY2F0aW9ucyBmb3IgQVNFQ1QgZnJvbSBSRUxfSERSLiAgVGhlcmUgYXJlIFJFTE9DX0NPVU5UIG9mIAotICAgdGhlbS4gIFdlIGNhbm5vdCB1c2UgZ2VuZXJpYyBlbGYgcm91dGluZXMgZm9yIHRoaXMsICBiZWNhdXNlIFJfU1BBUkNfT0xPMTAKLSAgIGhhcyBzZWNvbmRhcnkgYWRkZW5kIGluIEVMRjY0X1JfVFlQRV9EQVRBLiAgV2UgaGFuZGxlIGl0IGFzIHR3byByZWxvY2F0aW9ucwotICAgZm9yIHRoZSBzYW1lIGxvY2F0aW9uLCAgUl9TUEFSQ19MTzEwIGFuZCBSX1NQQVJDXzEzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX3NsdXJwX29uZV9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHJlbF9oZHIsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIFBUUiBhbGxvY2F0ZWQgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmF0aXZlX3JlbG9jczsKLSAgYXJlbGVudCAqcmVsZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gIGFyZWxlbnQgKnJlbGVudHM7Ci0KLSAgYWxsb2NhdGVkID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChhbGxvY2F0ZWQgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHJlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoYWxsb2NhdGVkLCAxLCByZWxfaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7Ci0KLSAgcmVsZW50cyA9IGFzZWN0LT5yZWxvY2F0aW9uICsgYXNlY3QtPnJlbG9jX2NvdW50OwotCi0gIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOwotICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpOwotICAKLSAgY291bnQgPSByZWxfaGRyLT5zaF9zaXplIC8gZW50c2l6ZTsKLQotICBmb3IgKGkgPSAwLCByZWxlbnQgPSByZWxlbnRzOyBpIDwgY291bnQ7Ci0gICAgICAgaSsrLCByZWxlbnQrKywgbmF0aXZlX3JlbG9jcyArPSBlbnRzaXplKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgKEVsZjY0X0V4dGVybmFsX1JlbGEgKikgbmF0aXZlX3JlbG9jcywgJnJlbGEpOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIG5vcm1hbCBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUsCi0JIGFuZCB0aGUgYWRkcmVzcyBvZiBhIGR5bmFtaWMgcmVsb2MgaXMgYWJzb2x1dGUuLiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAgfHwgZHluYW1pYykKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0OwotICAgICAgZWxzZQotCXJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQgLSBhc2VjdC0+dm1hOwotCi0gICAgICBpZiAoRUxGNjRfUl9TWU0gKHJlbGEucl9pbmZvKSA9PSAwKQotCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc3ltYm9sICoqcHMsICpzOwotCi0JICBwcyA9IHN5bWJvbHMgKyBFTEY2NF9SX1NZTSAocmVsYS5yX2luZm8pIC0gMTsKLQkgIHMgPSAqcHM7Ci0KLQkgIC8qIENhbm9uaWNhbGl6ZSBFTEYgc2VjdGlvbiBzeW1ib2xzLiAgRklYTUU6IFdoeT8gICovCi0JICBpZiAoKHMtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gcHM7Ci0JICBlbHNlCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKLQotICAgICAgQkZEX0FTU0VSVCAoRUxGNjRfUl9UWVBFX0lEIChyZWxhLnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heF9zdGQpOwotICAgICAgaWYgKEVMRjY0X1JfVFlQRV9JRCAocmVsYS5yX2luZm8pID09IFJfU1BBUkNfT0xPMTApCi0JewotCSAgcmVsZW50LT5ob3d0byA9ICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtSX1NQQVJDX0xPMTBdOwotCSAgcmVsZW50WzFdLmFkZHJlc3MgPSByZWxlbnQtPmFkZHJlc3M7Ci0JICByZWxlbnQrKzsKLQkgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJlbGVudC0+YWRkZW5kID0gRUxGNjRfUl9UWVBFX0RBVEEgKHJlbGEucl9pbmZvKTsKLQkgIHJlbGVudC0+aG93dG8gPSAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbUl9TUEFSQ18xM107Ci0JfQotICAgICAgZWxzZQotCXJlbGVudC0+aG93dG8gPSAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbRUxGNjRfUl9UWVBFX0lEIChyZWxhLnJfaW5mbyldOwotICAgIH0KLQotICBhc2VjdC0+cmVsb2NfY291bnQgKz0gcmVsZW50IC0gcmVsZW50czsKLQotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqIGNvbnN0IGQgPSBlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjI7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+cmVsX2hkcjsKLSAgICAgIHJlbF9oZHIyID0gZC0+cmVsX2hkcjI7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGFzZWN0LT5yZWxfZmlsZXBvcyA9PSByZWxfaGRyLT5zaF9vZmZzZXQKLQkJICB8fCAocmVsX2hkcjIgJiYgYXNlY3QtPnJlbF9maWxlcG9zID09IHJlbF9oZHIyLT5zaF9vZmZzZXQpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgQVNFQ1QtPlJFTE9DX0NPVU5UIHRlbmRzIG5vdCB0byBiZSBhY2N1cmF0ZSBpbiB0aGlzCi0JIGNhc2UgYmVjYXVzZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoaXMgc2VjdGlvbiBtYXkgdXNlIHRoZQotCSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgYW5kIGluIHRoYXQgY2FzZSBiZmRfc2VjdGlvbl9mcm9tX3NoZHIKLQkgaW4gZWxmLmMgZG9lcyBub3QgdXBkYXRlIHRoZSBSRUxPQ19DT1VOVC4gICovCi0gICAgICBpZiAoYXNlY3QtPl9yYXdfc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICByZWxfaGRyID0gJmQtPnRoaXNfaGRyOwotICAgICAgYXNlY3QtPnJlbG9jX2NvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemU7Ci0gICAgICByZWxfaGRyMiA9IE5VTEw7Ci0gICAgfQotCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gKChhcmVsZW50ICopIAotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCAKLQkJCQkgIGFzZWN0LT5yZWxvY19jb3VudCAqIDIgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3BhcmM2NF9lbGZfc2x1cnBfb25lX3JlbG9jX3RhYmxlIHJvdXRpbmUgaW5jcmVtZW50cyByZWxvY19jb3VudC4gICovCi0gIGFzZWN0LT5yZWxvY19jb3VudCA9IDA7Ci0gICAgCi0gIGlmICghc3BhcmM2NF9lbGZfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgcmVsX2hkciwgc3ltYm9scywKLQkJCQkJICBkeW5hbWljKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpZiAocmVsX2hkcjIgCi0gICAgICAmJiAhc3BhcmM2NF9lbGZfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgcmVsX2hkcjIsIHN5bWJvbHMsCi0JCQkJCSAgICAgZHluYW1pYykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYW5vbmljYWxpemUgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgTm90ZSB0aGF0IHdlIHJldHVybgotICAgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXMgYSBzaW5nbGUgYmxvY2ssIGFsdGhvdWdoIHRoZXkgYXJlCi0gICBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggcGFydGljdWxhciBzZWN0aW9uczsgdGhlIGludGVyZmFjZSwgd2hpY2gKLSAgIHdhcyBkZXNpZ25lZCBmb3IgU3VuT1Mgc3R5bGUgc2hhcmVkIGxpYnJhcmllcywgZXhwZWN0cyB0aGF0IHRoZXJlCi0gICBpcyBvbmx5IG9uZSBzZXQgb2YgZHluYW1pYyByZWxvY3MuICBBbnkgc2VjdGlvbiB0aGF0IHdhcyBhY3R1YWxseQotICAgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZSBTSFRfUkVMIG9yIFNIVF9SRUxBLCBhbmQgdXNlcwotICAgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgZHluYW1pYyByZWxvYwotICAgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBsb25nCi1zcGFyYzY0X2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgc3RvcmFnZSwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICoqc3RvcmFnZTsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBsb25nIHJldDsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXQgPSAwOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPT0gZWxmX2R5bnN5bXRhYiAoYWJmZCkKLQkgICYmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkpCi0JewotCSAgYXJlbGVudCAqcDsKLQkgIGxvbmcgY291bnQsIGk7Ci0KLQkgIGlmICghIHNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzLCBzeW1zLCB0cnVlKSkKLQkgICAgcmV0dXJuIC0xOwotCSAgY291bnQgPSBzLT5yZWxvY19jb3VudDsKLQkgIHAgPSBzLT5yZWxvY2F0aW9uOwotCSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JICAgICpzdG9yYWdlKysgPSBwKys7Ci0JICByZXQgKz0gY291bnQ7Ci0JfQotICAgIH0KLQotICAqc3RvcmFnZSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotCi1zdGF0aWMgdm9pZAotc3BhcmM2NF9lbGZfd3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJvb2xlYW4gKmZhaWxlZHAgPSAoYm9vbGVhbiAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZjY0X0V4dGVybmFsX1JlbGEgKm91dGJvdW5kX3JlbG9jYXM7Ci0gIHVuc2lnbmVkIGludCBpZHgsIGNvdW50OwotICBhc3ltYm9sICpsYXN0X3N5bSA9IDA7Ci0gIGludCBsYXN0X3N5bV9pZHggPSAwOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKCpmYWlsZWRwKQotICAgIHJldHVybjsKLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFRoZSBsaW5rZXIgYmFja2VuZCB3cml0ZXMgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLCBhbmQgc2V0cyB0aGUKLSAgICAgcmVsb2NfY291bnQgZmllbGQgdG8gemVybyB0byBpbmhpYml0IHdyaXRpbmcgdGhlbSBoZXJlLiAgQWxzbywKLSAgICAgc29tZXRpbWVzIHRoZSBTRUNfUkVMT0MgZmxhZyBnZXRzIHNldCBldmVuIHdoZW4gdGhlcmUgYXJlbid0IGFueQotICAgICByZWxvY3MuICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBXZSBjYW4gY29tYmluZSB0d28gcmVsb2NzIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgYWRkcmVzcwotICAgICBpbnRvIFJfU1BBUkNfT0xPMTAgaWYgZmlyc3Qgb25lIGlzIFJfU1BBUkNfTE8xMCBhbmQgdGhlCi0gICAgIGxhdHRlciBpcyBSX1NQQVJDXzEzIHdpdGggbm8gYXNzb2NpYXRlZCBzeW1ib2wuICAqLwotICBjb3VudCA9IDA7Ci0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgICsrY291bnQ7Ci0KLSAgICAgIGFkZHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF0tPmFkZHJlc3M7Ci0gICAgICBpZiAoc2VjLT5vcmVsb2NhdGlvbltpZHhdLT5ob3d0by0+dHlwZSA9PSBSX1NQQVJDX0xPMTAKLQkgICYmIGlkeCA8IHNlYy0+cmVsb2NfY291bnQgLSAxKQotCXsKLQkgIGFyZWxlbnQgKnIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeCArIDFdOwotCi0JICBpZiAoci0+aG93dG8tPnR5cGUgPT0gUl9TUEFSQ18xMwotCSAgICAgICYmIHItPmFkZHJlc3MgPT0gYWRkcgotCSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IDApCi0JICAgICsraWR4OwotCX0KLSAgICB9Ci0KLSAgcmVsYV9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkcjsKLQotICByZWxhX2hkci0+c2hfc2l6ZSA9IHJlbGFfaGRyLT5zaF9lbnRzaXplICogY291bnQ7Ci0gIHJlbGFfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsYV9oZHItPnNoX3NpemUpOwotICBpZiAocmVsYV9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgKmZhaWxlZHAgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHJlbG9jYXRpb25zIGFyZSBSRUxBIG9yIFJFTCByZWxvY2F0aW9ucy4gICovCi0gIGlmIChyZWxhX2hkci0+c2hfdHlwZSAhPSBTSFRfUkVMQSkKLSAgICBhYm9ydCAoKTsKLQotICAvKiBvcmVsb2NhdGlvbiBoYXMgdGhlIGRhdGEsIHJlbG9jX2NvdW50IGhhcyB0aGUgY291bnQuLi4gKi8KLSAgb3V0Ym91bmRfcmVsb2NhcyA9IChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIGRzdF9yZWxhOwotICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVsYSAqc3JjX3JlbGE7Ci0gICAgICBhcmVsZW50ICpwdHI7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBpbnQgbjsKLQotICAgICAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOwotICAgICAgc3JjX3JlbGEgPSBvdXRib3VuZF9yZWxvY2FzICsgaWR4OwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCWRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotICAgICAgZWxzZQotCWRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLSAgICAgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotICAgICAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQluID0gbGFzdF9zeW1faWR4OwotICAgICAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pICYmIHN5bS0+dmFsdWUgPT0gMCkKLQluID0gU1ROX1VOREVGOwotICAgICAgZWxzZQotCXsKLQkgIGxhc3Rfc3ltID0gc3ltOwotCSAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgaWYgKG4gPCAwKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgbGFzdF9zeW1faWR4ID0gbjsKLQl9Ci0KLSAgICAgIGlmICgoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkICE9IE5VTEwKLQkgICYmICgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgJiYgISBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgcHRyKSkKLQl7Ci0JICAqZmFpbGVkcCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAocHRyLT5ob3d0by0+dHlwZSA9PSBSX1NQQVJDX0xPMTAKLQkgICYmIGlkeCA8IHNlYy0+cmVsb2NfY291bnQgLSAxKQotCXsKLQkgIGFyZWxlbnQgKnIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeCArIDFdOwotCi0JICBpZiAoci0+aG93dG8tPnR5cGUgPT0gUl9TUEFSQ18xMwotCSAgICAgICYmIHItPmFkZHJlc3MgPT0gcHRyLT5hZGRyZXNzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uICgoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikKLQkgICAgICAmJiAoKnItPnN5bV9wdHJfcHRyKS0+dmFsdWUgPT0gMCkKLQkgICAgewotCSAgICAgIGlkeCsrOwotCSAgICAgIGRzdF9yZWxhLnJfaW5mbwotCQk9IEVMRjY0X1JfSU5GTyAobiwgRUxGNjRfUl9UWVBFX0lORk8gKHItPmFkZGVuZCwKLQkJCQkJCSAgICAgIFJfU1BBUkNfT0xPMTApKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBkc3RfcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKG4sIFJfU1BBUkNfTE8xMCk7Ci0JfQotICAgICAgZWxzZQotCWRzdF9yZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAobiwgcHRyLT5ob3d0by0+dHlwZSk7Ci0KLSAgICAgIGRzdF9yZWxhLnJfYWRkZW5kID0gcHRyLT5hZGRlbmQ7Ci0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCAmZHN0X3JlbGEsIHNyY19yZWxhKTsKLSAgICB9Ci19Ci0MCi0vKiBTcGFyYzY0IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzcGFyYzY0X2VsZl9hcHBfcmVnCi17Ci0gIHVuc2lnbmVkIGNoYXIgYmluZDsKLSAgdW5zaWduZWQgc2hvcnQgc2huZHg7Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqbmFtZTsKLX07Ci0KLXN0cnVjdCBzcGFyYzY0X2VsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICBzdHJ1Y3Qgc3BhcmM2NF9lbGZfYXBwX3JlZyBhcHBfcmVncyBbNF07Ci19OwotCi0vKiBHZXQgdGhlIFNwYXJjNjQgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBzcGFyYzY0X2VsZl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotICAKLS8qIENyZWF0ZSBhIFNwYXJjNjQgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXNwYXJjNjRfZWxmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzcGFyYzY0X2VsZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBzcGFyYzY0X2VsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0MCi0vKiBVdGlsaXR5IGZvciBwZXJmb3JtaW5nIHRoZSBzdGFuZGFyZCBpbml0aWFsIHdvcmsgb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgIHJlbG9jYXRpb24uCi0gICAqUFJFTE9DQVRJT04gd2lsbCBjb250YWluIHRoZSByZWxvY2F0ZWQgaXRlbS4KLSAgICpQSU5TTiB3aWxsIGNvbnRhaW4gdGhlIGluc3RydWN0aW9uIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgIElmIHRoZSByZXN1bHQgaXMgYGJmZF9yZWxvY19vdGhlcicgdGhlIGNhbGxlciBjYW4gY29udGludWUgd2l0aAotICAgcGVyZm9ybWluZyB0aGUgcmVsb2NhdGlvbi4gIE90aGVyd2lzZSBpdCBtdXN0IHN0b3AgYW5kIHJldHVybiB0aGUKLSAgIHZhbHVlIHRvIGl0cyBjYWxsZXIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1pbml0X2luc25fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIHByZWxvY2F0aW9uLAotCQkgcGluc24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgKnByZWxvY2F0aW9uOwotICAgICBiZmRfdm1hICpwaW5zbjsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISBob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBUaGlzIHdvcmtzIGJlY2F1c2UgcGFydGlhbF9pbnBsYWNlID09IGZhbHNlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgKnByZWxvY2F0aW9uID0gcmVsb2NhdGlvbjsKLSAgKnBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci19Ci0KLS8qIEZvciB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfbm90c3VwX3JlbG9jIChhYmZkLAotCQkJcmVsb2NfZW50cnksCi0JCQlzeW1ib2wsCi0JCQlkYXRhLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgV0RJU1AxNiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICBpbnNuID0gKGluc24gJiB+MHgzMDNmZmYpIHwgKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCi0JCQkgICAgICAgfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAotICAgICAgfHwgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID4gMHgzZmZmZikKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIHRoZSBISVgyMiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9oaXgyMl9yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIHJlbG9jYXRpb24gXj0gTUlOVVNfT05FOwotICBpbnNuID0gKGluc24gJiB+MHgzZmZmZmYpIHwgKChyZWxvY2F0aW9uID4+IDEwKSAmIDB4M2ZmZmZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKChyZWxvY2F0aW9uICYgfiAoYmZkX3ZtYSkgMHhmZmZmZmZmZikgIT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIHRoZSBMT1gxMCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9sb3gxMF9yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIGluc24gPSAoaW5zbiAmIH4weDFmZmYpIHwgMHgxYzAwIHwgKHJlbG9jYXRpb24gJiAweDNmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBQTFQvR09UIHN0dWZmICovCi0KLS8qIEJvdGggdGhlIGhlYWRlcnMgYW5kIHRoZSBlbnRyaWVzIGFyZSBpY2FjaGUgYWxpZ25lZC4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFCQkzMgotI2RlZmluZSBQTFRfSEVBREVSX1NJWkUJCSg0ICogUExUX0VOVFJZX1NJWkUpCi0jZGVmaW5lIExBUkdFX1BMVF9USFJFU0hPTEQJMzI3NjgKLSNkZWZpbmUgR09UX1JFU0VSVkVEX0VOVFJJRVMJMQotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9zcGFyY3Y5L2xkLnNvLjEiCi0KLQotLyogRmlsbCBpbiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNwYXJjNjRfZWxmX2J1aWxkX3BsdCAob3V0cHV0X2JmZCwgY29udGVudHMsIG5lbnRyaWVzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICAgICBpbnQgbmVudHJpZXM7Ci17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBub3AgPSAweDAxMDAwMDAwOwotICBpbnQgaSwgajsKLSAgCi0gIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgYXJlIHJlc2VydmVkLCBhbmQgYXJlIGluaXRpYWxseSB1bmRlZmluZWQuCi0gICAgIFdlIGZpbGwgdGhlbSB3aXRoIGBpbGx0cmFwIDAnIHRvIGZvcmNlIGxkLnNvIHRvIGRvIHNvbWV0aGluZy4gICovCi0KLSAgZm9yIChpID0gMDsgaSA8IFBMVF9IRUFERVJfU0laRS80OyArK2kpCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgY29udGVudHMraSo0KTsKLQotICAvKiBUaGUgZmlyc3QgMzI3NjggZW50cmllcyBhcmUgY2xvc2UgZW5vdWdoIHRvIHBsdDEgdG8gZ2V0IHRoZXJlIHZpYQotICAgICBhIHN0cmFpZ2h0IGJyYW5jaC4gICovCi0KLSAgZm9yIChpID0gNDsgaSA8IExBUkdFX1BMVF9USFJFU0hPTEQgJiYgaSA8IG5lbnRyaWVzOyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqZW50cnkgPSBjb250ZW50cyArIGkgKiBQTFRfRU5UUllfU0laRTsKLSAgICAgIHVuc2lnbmVkIGludCBzZXRoaSwgYmE7Ci0KLSAgICAgIC8qIHNldGhpICguIC0gcGx0MCksICVnMSAqLwotICAgICAgc2V0aGkgPSAweDAzMDAwMDAwIHwgKGkgKiBQTFRfRU5UUllfU0laRSk7Ci0KLSAgICAgIC8qIGJhLGEscHQgJXhjYywgcGx0MSAqLwotICAgICAgYmEgPSAweDMwNjgwMDAwIHwgKCgoY29udGVudHMrUExUX0VOVFJZX1NJWkUpIC0gKGVudHJ5KzQpKSAvIDQgJiAweDdmZmZmKTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgc2V0aGksIGVudHJ5KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGJhLCBlbnRyeSs0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrOCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzEyKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMTYpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsyMCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzI0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMjgpOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRyaWNreSBiaXQuICBFbnRyaWVzIDMyNzY4IGFuZCBoaWdoZXIgYXJlIGdyb3VwZWQgaW4gYmxvY2tzIG9mCi0gICAgIDE2MDogMTYwIGVudHJpZXMgYW5kIDE2MCBwb2ludGVycy4gIFRoaXMgaXMgdG8gc2VwYXJhdGUgY29kZSBmcm9tIGRhdGEsCi0gICAgIHdoaWNoIGlzIG11Y2ggZnJpZW5kbGllciBvbiB0aGUgY2FjaGUuICAqLwotICAKLSAgZm9yICg7IGkgPCBuZW50cmllczsgaSArPSAxNjApCi0gICAgewotICAgICAgaW50IGJsb2NrID0gKGkgKyAxNjAgPD0gbmVudHJpZXMgPyAxNjAgOiBuZW50cmllcyAtIGkpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2NrOyArK2opCi0JewotCSAgdW5zaWduZWQgY2hhciAqZW50cnksICpwdHI7Ci0JICB1bnNpZ25lZCBpbnQgbGR4OwotCi0JICBlbnRyeSA9IGNvbnRlbnRzICsgaSpQTFRfRU5UUllfU0laRSArIGoqNCo2OwotCSAgcHRyID0gY29udGVudHMgKyBpKlBMVF9FTlRSWV9TSVpFICsgYmxvY2sqNCo2ICsgaio4OwotCi0JICAvKiBsZHggWyVvNyArIHB0ciAtIGVudHJ5KzRdLCAlZzEgKi8KLQkgIGxkeCA9IDB4YzI1YmUwMDAgfCAoKHB0ciAtIGVudHJ5KzQpICYgMHgxZmZmKTsKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg4YTEwMDAwZiwgZW50cnkpOyAgICAvKiBtb3YgJW83LCVnNSAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0MDAwMDAwMiwgZW50cnkrNCk7ICAvKiBjYWxsIC4rOCAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSs4KTsgICAgICAgICAvKiBub3AgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxkeCwgZW50cnkrMTIpOyAgICAgICAgLyogbGR4IFslbzcrUF0sJWcxICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDgzYzNjMDAxLCBlbnRyeSsxNik7IC8qIGptcGwgJW83KyVnMSwlZzEgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4OWUxMDAwMDUsIGVudHJ5KzIwKTsgLyogbW92ICVnNSwlbzcgKi8KLQotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgY29udGVudHMgLSAoZW50cnkrNCksIHB0cik7Ci0JfQotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBvZmZzZXQgb2YgYSBwYXJ0aWN1bGFyIHBsdCBlbnRyeSB3aXRoaW4gdGhlIC5wbHQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1zcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChpbmRleCkKLSAgICAgaW50IGluZGV4OwotewotICBpbnQgYmxvY2ssIG9mczsKLQotICBpZiAoaW5kZXggPCBMQVJHRV9QTFRfVEhSRVNIT0xEKQotICAgIHJldHVybiBpbmRleCAqIFBMVF9FTlRSWV9TSVpFOwotCi0gIC8qIFNlZSBhYm92ZSBmb3IgZGV0YWlscy4gICovCi0KLSAgYmxvY2sgPSAoaW5kZXggLSBMQVJHRV9QTFRfVEhSRVNIT0xEKSAvIDE2MDsKLSAgb2ZzID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgJSAxNjA7Ci0KLSAgcmV0dXJuICgoYmZkX3ZtYSkoTEFSR0VfUExUX1RIUkVTSE9MRCArIGJsb2NrKjE2MCkgKiBQTFRfRU5UUllfU0laRQotCSAgKyBvZnMgKiA2KjQpOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgKGluZGV4LCBtYXgpCi0gICAgIGludCBpbmRleCwgbWF4OwotewotICBpbnQgYmxvY2ssIG9mcywgbGFzdDsKLQotICBCRkRfQVNTRVJUKGluZGV4ID49IExBUkdFX1BMVF9USFJFU0hPTEQpOwotCi0gIC8qIFNlZSBhYm92ZSBmb3IgZGV0YWlscy4gICovCi0KLSAgYmxvY2sgPSAoKChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpIC8gMTYwKSAqIDE2MCkKLQkgICsgTEFSR0VfUExUX1RIUkVTSE9MRDsKLSAgb2ZzID0gaW5kZXggLSBibG9jazsKLSAgaWYgKGJsb2NrICsgMTYwID4gbWF4KQotICAgIGxhc3QgPSAobWF4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgJSAxNjA7Ci0gIGVsc2UKLSAgICBsYXN0ID0gMTYwOwotCi0gIHJldHVybiAoYmxvY2sgKiBQTFRfRU5UUllfU0laRQotCSAgKyBsYXN0ICogNio0Ci0JICArIG9mcyAqIDgpOwotfQotCi0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgIShzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjY0X1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIHN3aXRjaCAoRUxGNjRfUl9UWVBFX0lEIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9TUEFSQ19HT1QxMDoKLQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JY2FzZSBSX1NQQVJDX0dPVDIyOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogQ3JlYXRlIHRoZSAuZ290IHNlY3Rpb24uICAqLwotCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMykpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGY2NF9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0JCSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X29mZnNldHMgPSAoYmZkX3ZtYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCkgPSBsb2NhbF9nb3Rfb2Zmc2V0czsKLQkJICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JCX0KLQkgICAgfQotCi0JICBzZ290LT5fcmF3X3NpemUgKz0gODsKLQotI2lmIDAKLQkgIC8qIERvZXNuJ3Qgd29yayBmb3IgNjQtYml0IC1mUElDLCBzaW5jZSBzZXRoaS9vciBidWlsZHMKLQkgICAgIHVuc2lnbmVkIG51bWJlcnMuICBJZiB3ZSBwZXJtaXQgb3Vyc2VsdmVzIHRvIG1vZGlmeQotCSAgICAgY29kZSBzbyB3ZSBnZXQgc2V0aGkveG9yLCB0aGlzIGNvdWxkIHdvcmsuCi0JICAgICBRdWVzdGlvbjogZG8gd2UgY29uc2lkZXIgY29uZGl0aW9uYWxseSByZS1lbmFibGluZwotICAgICAgICAgICAgIHRoaXMgZm9yIC1mcGljLCBvbmNlIHdlIGtub3cgYWJvdXQgb2JqZWN0IGNvZGUgbW9kZWxzPyAgKi8KLQkgIC8qIElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZSB0aGFuIDB4MTAwMCBieXRlcywgd2UgYWRkCi0JICAgICAweDEwMDAgdG8gdGhlIHZhbHVlIG9mIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgc28gdGhhdCAxMwotCSAgICAgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPj0gMHgxMDAwCi0JICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID09IDApCi0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLSNlbmRpZgotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JY2FzZSBSX1NQQVJDX1BMVDMyOgotCWNhc2UgUl9TUEFSQ19ISVBMVDIyOgotCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDIyOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCWNhc2UgUl9TUEFSQ19QTFQ2NDoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdpdGhvdXQKLSAgICAgICAgICAgICBsaW5raW5nIGluIGFueSBkeW5hbWljIG9iamVjdHMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QKLSAgICAgICAgICAgICBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgICAgICAgICAgICAgIHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGY2NF9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfUEMxMDoKLQljYXNlIFJfU1BBUkNfUEMyMjoKLQljYXNlIFJfU1BBUkNfUENfSEgyMjoKLQljYXNlIFJfU1BBUkNfUENfSE0xMDoKLQljYXNlIFJfU1BBUkNfUENfTE0yMjoKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDX0RJU1A4OgotCWNhc2UgUl9TUEFSQ19ESVNQMTY6Ci0JY2FzZSBSX1NQQVJDX0RJU1AzMjoKLQljYXNlIFJfU1BBUkNfRElTUDY0OgotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ184OgotCWNhc2UgUl9TUEFSQ18xNjoKLQljYXNlIFJfU1BBUkNfMzI6Ci0JY2FzZSBSX1NQQVJDX0hJMjI6Ci0JY2FzZSBSX1NQQVJDXzIyOgotCWNhc2UgUl9TUEFSQ18xMzoKLQljYXNlIFJfU1BBUkNfTE8xMDoKLQljYXNlIFJfU1BBUkNfVUEzMjoKLQljYXNlIFJfU1BBUkNfMTA6Ci0JY2FzZSBSX1NQQVJDXzExOgotCWNhc2UgUl9TUEFSQ182NDoKLQljYXNlIFJfU1BBUkNfT0xPMTA6Ci0JY2FzZSBSX1NQQVJDX0hIMjI6Ci0JY2FzZSBSX1NQQVJDX0hNMTA6Ci0JY2FzZSBSX1NQQVJDX0xNMjI6Ci0JY2FzZSBSX1NQQVJDXzc6Ci0JY2FzZSBSX1NQQVJDXzU6Ci0JY2FzZSBSX1NQQVJDXzY6Ci0JY2FzZSBSX1NQQVJDX0hJWDIyOgotCWNhc2UgUl9TUEFSQ19MT1gxMDoKLQljYXNlIFJfU1BBUkNfSDQ0OgotCWNhc2UgUl9TUEFSQ19NNDQ6Ci0JY2FzZSBSX1NQQVJDX0w0NDoKLQljYXNlIFJfU1BBUkNfVUE2NDoKLQljYXNlIFJfU1BBUkNfVUExNjoKLQkgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UgcmVsb2NzCi0JICAgICBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jIHNlY3Rpb24gaW4KLQkgICAgIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGUgcmVsb2MuIAotCi0JICAgICBCdXQgZG9uJ3QgZG8gdGhpcyBmb3IgZGVidWdnaW5nIHNlY3Rpb25zIC0tIHRoaXMgc2hvd3MgdXAKLQkgICAgIHdpdGggRFdBUkYyIC0tIGZpcnN0IGJlY2F1c2UgdGhleSBhcmUgbm90IGxvYWRlZCwgYW5kCi0JICAgICBzZWNvbmQgYmVjYXVzZSBEV0FSRiBzZXogdGhlIGRlYnVnIGluZm8gaXMgbm90IHRvIGJlCi0JICAgICBiaWFzZWQgYnkgdGhlIGxvYWQgYWRkcmVzcy4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSkKLQkgICAgewotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfUkVHSVNURVI6Ci0JICAvKiBOb3RoaW5nIHRvIGRvLiAgKi8KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKShfKCIlczogY2hlY2tfcmVsb2NzOiB1bmhhbmRsZWQgcmVsb2MgdHlwZSAlZCIpLAotCQkJCWJmZF9nZXRfZmlsZW5hbWUoYWJmZCksCi0JCQkJRUxGNjRfUl9UWVBFX0lEIChyZWwtPnJfaW5mbykpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSB1c2UgaXQgZm9yIFNUVF9SRUdJU1RFUiBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBzdGF0aWMgY2hhciAqc3R0X3R5cGVzW10gPSB7ICJOT1RZUEUiLCAiT0JKRUNUIiwgIkZVTkNUSU9OIiB9OwotCi0gIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfUkVHSVNURVIpCi0gICAgewotICAgICAgaW50IHJlZzsKLSAgICAgIHN0cnVjdCBzcGFyYzY0X2VsZl9hcHBfcmVnICpwOwotICAgICAgCi0gICAgICByZWcgPSAoaW50KXN5bS0+c3RfdmFsdWU7Ci0gICAgICBzd2l0Y2ggKHJlZyAmIH4xKQotCXsKLQljYXNlIDI6IHJlZyAtPSAyOyBicmVhazsKLQljYXNlIDY6IHJlZyAtPSA0OyBicmVhazsKLQlkZWZhdWx0OgotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgKF8oIiVzOiBPbmx5IHJlZ2lzdGVycyAlJWdbMjM2N10gY2FuIGJlIGRlY2xhcmVkIHVzaW5nIFNUVF9SRUdJU1RFUiIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMKLQkgIHx8IChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgICAgIHsKLQkgIC8qIFNUVF9SRUdJU1RFUiBvbmx5IHdvcmtzIHdoZW4gbGlua2luZyBhbiBlbGY2NF9zcGFyYyBvYmplY3QuCi0JICAgICBJZiBTVFRfUkVHSVNURVIgY29tZXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCBkb24ndCBwdXQgaXQgaW50bwotCSAgICAgdGhlIG91dHB1dCBiZmQuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCByZWNoZWNrIGl0LiAgKi8KLQkgICpuYW1lcCA9IE5VTEw7Ci0JICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICBwID0gc3BhcmM2NF9lbGZfaGFzaF90YWJsZShpbmZvKS0+YXBwX3JlZ3MgKyByZWc7Ci0KLSAgICAgIGlmIChwLT5uYW1lICE9IE5VTEwgJiYgc3RyY21wIChwLT5uYW1lLCAqbmFtZXApKQotCXsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCJSZWdpc3RlciAlJWclZCB1c2VkIGluY29tcGF0aWJseTogIgotICAgICAgICAgICAgICAgInByZXZpb3VzbHkgZGVjbGFyZWQgaW4gJXMgdG8gJXMsIGluICVzIHJlZGVmaW5lZCB0byAlcyIpLAotICAgICAgICAgICAgIChpbnQpc3ltLT5zdF92YWx1ZSwKLSAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChwLT5hYmZkKSwgKnAtPm5hbWUgPyBwLT5uYW1lIDogIiNzY3JhdGNoIiwKLSAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKipuYW1lcCA/ICpuYW1lcCA6ICIjc2NyYXRjaCIpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHAtPm5hbWUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoKipuYW1lcCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgICAgIAotCSAgICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkJYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICpuYW1lcCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQl7Ci0JCSAgdW5zaWduZWQgY2hhciB0eXBlID0gaC0+dHlwZTsKLQotCQkgIGlmICh0eXBlID4gU1RUX0ZVTkMpIHR5cGUgPSAwOwotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIlN5bWJvbCBgJXMnIGhhcyBkaWZmZXJpbmcgdHlwZXM6ICIKLQkJICAgICAgICJwcmV2aW91c2x5ICVzLCBSRUdJU1RFUiBpbiAlcyIpLAotCQkgICAgICpuYW1lcCwgc3R0X3R5cGVzIFt0eXBlXSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgcC0+bmFtZSA9IGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCSAgIHN0cmxlbiAoKm5hbWVwKSArIDEpOwotCSAgICAgIGlmICghcC0+bmFtZSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgc3RyY3B5IChwLT5uYW1lLCAqbmFtZXApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHAtPm5hbWUgPSAiIjsKLQkgIHAtPmJpbmQgPSBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKTsKLQkgIHAtPmFiZmQgPSBhYmZkOwotCSAgcC0+c2huZHggPSBzeW0tPnN0X3NobmR4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocC0+YmluZCA9PSBTVEJfV0VBSwotCSAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9HTE9CQUwpCi0JICAgIHsKLQkgICAgICBwLT5iaW5kID0gU1RCX0dMT0JBTDsKLQkgICAgICBwLT5hYmZkID0gYWJmZDsKLQkgICAgfQotCX0KLSAgICAgICpuYW1lcCA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgKm5hbWVwIHx8ICEgKipuYW1lcCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcgKnA7Ci0KLSAgICAgIHAgPSBzcGFyYzY0X2VsZl9oYXNoX3RhYmxlKGluZm8pLT5hcHBfcmVnczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIHArKykKLQlpZiAocC0+bmFtZSAhPSBOVUxMICYmICEgc3RyY21wIChwLT5uYW1lLCAqbmFtZXApKQotCSAgewotCSAgICB1bnNpZ25lZCBjaGFyIHR5cGUgPSBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKTsKLQotCSAgICBpZiAodHlwZSA+IFNUVF9GVU5DKSB0eXBlID0gMDsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgKF8oIlN5bWJvbCBgJXMnIGhhcyBkaWZmZXJpbmcgdHlwZXM6ICIKLQkJICJSRUdJU1RFUiBpbiAlcywgJXMgaW4gJXMiKSwKLQkgICAgICAgKm5hbWVwLCBiZmRfZ2V0X2ZpbGVuYW1lIChwLT5hYmZkKSwgc3R0X3R5cGVzIFt0eXBlXSwKLQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGVtaXRpbmcgU1RUX1JFR0lTVEVSIHN5bWJvbHMKLSAgIHdoaWNoIHdlIGNhbm5vdCBlYXNpbHkga2VlcCBpbiB0aGUgc3ltYm9sIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfb3V0cHV0X2FyY2hfc3ltcyAob3V0cHV0X2JmZCwgaW5mbywgZmluZm8sIGZ1bmMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIFBUUiBmaW5mbzsKLSAgICAgYm9vbGVhbiAoKmZ1bmMpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotCQkJICAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci17Ci0gIGludCByZWc7Ci0gIHN0cnVjdCBzcGFyYzY0X2VsZl9hcHBfcmVnICphcHBfcmVncyA9Ci0gICAgc3BhcmM2NF9lbGZfaGFzaF90YWJsZShpbmZvKS0+YXBwX3JlZ3M7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotCi0gIC8qIFdlIGFycmFuZ2VkIGluIHNpemVfZHluYW1pY19zZWN0aW9ucyB0byBwdXQgdGhlIFNUVF9SRUdJU1RFUiBlbnRyaWVzCi0gICAgIGF0IHRoZSBlbmQgb2YgdGhlIGR5bmxvY2FsIGxpc3QsIHNvIHRoZXkgY2FtZSBhdCB0aGUgZW5kIG9mIHRoZSBsb2NhbAotICAgICBzeW1ib2xzIGluIHRoZSBzeW10YWIuICBFeGNlcHQgdGhhdCB0aGV5IGFyZW4ndCBTVEJfTE9DQUwsIHNvIHdlIG5lZWQKLSAgICAgdG8gYmFjayB1cCBzeW10YWItPnNoX2luZm8uICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbCkKLSAgICB7Ci0gICAgICBiZmQgKiBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgICAgIGFzZWN0aW9uICpkeW5zeW1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKmU7Ci0KLSAgICAgIGZvciAoZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWw7IGUgOyBlID0gZS0+bmV4dCkKLQlpZiAoZS0+aW5wdXRfaW5keCA9PSAtMSkKLQkgIGJyZWFrOwotICAgICAgaWYgKGUpCi0JewotCSAgZWxmX3NlY3Rpb25fZGF0YSAoZHluc3ltc2VjLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8KLQkgICAgPSBlLT5keW5pbmR4OwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHJlZyA9IDA7IHJlZyA8IDQ7IHJlZysrKQotICAgIGlmIChhcHBfcmVncyBbcmVnXS5uYW1lICE9IE5VTEwpCi0gICAgICB7Ci0JaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgJiYgYmZkX2hhc2hfbG9va3VwIChpbmZvLT5rZWVwX2hhc2gsCi0JCQkJYXBwX3JlZ3MgW3JlZ10ubmFtZSwKLQkJCQlmYWxzZSwgZmFsc2UpID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCXN5bS5zdF92YWx1ZSA9IHJlZyA8IDIgPyByZWcgKyAyIDogcmVnICsgNDsKLQlzeW0uc3Rfc2l6ZSA9IDA7Ci0Jc3ltLnN0X290aGVyID0gMDsKLQlzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChhcHBfcmVncyBbcmVnXS5iaW5kLCBTVFRfUkVHSVNURVIpOwotCXN5bS5zdF9zaG5keCA9IGFwcF9yZWdzIFtyZWddLnNobmR4OwotCWlmICghICgqZnVuYykgKGZpbmZvLCBhcHBfcmVncyBbcmVnXS5uYW1lLCAmc3ltLAotCQkgICAgICAgc3ltLnN0X3NobmR4ID09IFNITl9BQlMKLQkJCSA/IGJmZF9hYnNfc2VjdGlvbl9wdHIgOiBiZmRfdW5kX3NlY3Rpb25fcHRyKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludAotc3BhcmM2NF9lbGZfZ2V0X3N5bWJvbF90eXBlIChlbGZfc3ltLCB0eXBlKQotICAgICBFbGZfSW50ZXJuYWxfU3ltICogZWxmX3N5bTsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGlmIChFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbykgPT0gU1RUX1JFR0lTVEVSKQotICAgIHJldHVybiBTVFRfUkVHSVNURVI7Ci0gIGVsc2UKLSAgICByZXR1cm4gdHlwZTsKLX0KLQotLyogQSBTVEJfR0xPQkFMLFNUVF9SRUdJU1RFUiBzeW1ib2wgc2hvdWxkIGJlIEJTRl9HTE9CQUwKLSAgIGV2ZW4gaW4gU0hOX1VOREVGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc3BhcmM2NF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgKGFiZmQsIGFzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqYXN5bTsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICplbGZzeW07Ci0KLSAgZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOwotICBpZiAoZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8KLSAgICAgID09IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfUkVHSVNURVIpKQotICAgIHsKLSAgICAgIGFzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0gICAgfQotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlcgotICAgICAoYWx0aG91Z2ggd2UgY291bGQgYWN0dWFsbHkgZG8gaXQgaGVyZSkuICBUaGUgU1RUX05PVFlQRQotICAgICBjb25kaXRpb24gaXMgYSBoYWNrIHNwZWNpZmljYWxseSBmb3IgdGhlIE9yYWNsZSBsaWJyYXJpZXMKLSAgICAgZGVsaXZlcmVkIGZvciBTb2xhcmlzOyBmb3Igc29tZSBpbmV4cGxpY2FibGUgcmVhc29uLCB0aGV5IGRlZmluZQotICAgICBzb21lIG9mIHRoZWlyIGZ1bmN0aW9ucyBhcyBTVFRfTk9UWVBFIHdoZW4gdGhleSByZWFsbHkgc2hvdWxkIGJlCi0gICAgIFNUVF9GVU5DLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgV1BMVDMwIHJlbG9jIGluIGFuIGlucHV0Ci0gICAgICAgICAgICAgZmlsZSwgYnV0IG5vbmUgb2YgdGhlIGlucHV0IGZpbGVzIHdlcmUgZHluYW1pYyBvYmplY3RzLgotICAgICAgICAgICAgIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkIGEKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgV0RJU1AzMAotICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogVGhlIGZpcnN0IGZvdXIgYml0IGluIC5wbHQgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IFBMVF9IRUFERVJfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIC8qIFRvIHNpbXBsaWZ5IG1hdHRlcnMgbGF0ZXIsIGp1c3Qgc3RvcmUgdGhlIHBsdCBpbmRleCBoZXJlLiAgKi8KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBwbHQgZW50cmllcyBhcmUgcmVzZXJ2ZWQsIGFuZCB0aGUgcmVsb2NhdGlvbnMgbXVzdAotCSBwYWlyIHVwIGV4YWN0bHkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSAoUExUX0hFQURFUl9TSVpFL1BMVF9FTlRSWV9TSVpFCi0JCQkgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKTsKLQotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBzaXplIGlzIGJvdW5kZWQgYnkgdGhlIG1hZ25pdHVkZQotCSBvZiB0aGUgb2Zmc2V0IHdlIGNhbiBkZXNjcmliZSBpbiB0aGUgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+PSAoYmZkX3ZtYSkxIDw8IDMyKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfU1BBUkNfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlcgotICAgICB0byBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgMTYtYnl0ZXMgaXMgdGhlIHNpemUKLSAgICAgb2YgdGhlIGxhcmdlc3QgdHlwZSB0aGF0IHJlcXVpcmVzIGhhcmQgYWxpZ25tZW50IC0tIGxvbmcgZG91YmxlLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKLSAgICBwb3dlcl9vZl90d28gPSA0OwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGJvb2xlYW4gcmVscGx0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIHJlbHBsdCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKLQkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDAKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICBaZXJvIHRoZSBtZW1vcnkKLQkgZm9yIHRoZSBiZW5lZml0IG9mIC5yZWxhLnBsdCwgd2hpY2ggaGFzIDQgdW51c2VkIGVudHJpZXMKLQkgYXQgdGhlIGJlZ2lubmluZywgYW5kIHdlIGRvbid0IHdhbnQgZ2FyYmFnZS4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpbnQgcmVnOwotICAgICAgc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcgKiBhcHBfcmVnczsKLSAgICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmR5bnN0cjsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICplaHQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBBZGQgZHluYW1pYyBTVFRfUkVHSVNURVIgc3ltYm9scyBhbmQgY29ycmVzcG9uZGluZyBEVF9TUEFSQ19SRUdJU1RFUgotCSBlbnRyaWVzIGlmIG5lZWRlZC4gICovCi0gICAgICBhcHBfcmVncyA9IHNwYXJjNjRfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5hcHBfcmVnczsKLSAgICAgIGR5bnN0ciA9IGVodC0+ZHluc3RyOwotCi0gICAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IDQ7IHJlZysrKQotCWlmIChhcHBfcmVncyBbcmVnXS5uYW1lICE9IE5VTEwpCi0JICB7Ci0JICAgIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICplbnRyeSwgKmU7Ci0JICAgICAgCi0JICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1BBUkNfUkVHSVNURVIsIDApKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBlbnRyeSA9IChzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqKQotCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsIHNpemVvZiAoKmVudHJ5KSk7Ci0JICAgIGlmIChlbnRyeSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICAvKiBXZSBjaGVhdCBoZXJlIGEgbGl0dGxlIGJpdDogdGhlIHN5bWJvbCB3aWxsIG5vdCBiZSBsb2NhbCwgc28gd2UKLQkgICAgICAgcHV0IGl0IGF0IHRoZSBlbmQgb2YgdGhlIGR5bmxvY2FsIGxpbmtlZCBsaXN0LiAgV2Ugd2lsbCBmaXggaXQKLQkgICAgICAgbGF0ZXIgb24sIGFzIHdlIGhhdmUgdG8gZml4IG90aGVyIGZpZWxkcyBhbnl3YXkuICAqLwotCSAgICBlbnRyeS0+aXN5bS5zdF92YWx1ZSA9IHJlZyA8IDIgPyByZWcgKyAyIDogcmVnICsgNDsKLQkgICAgZW50cnktPmlzeW0uc3Rfc2l6ZSA9IDA7Ci0JICAgIGlmICgqYXBwX3JlZ3MgW3JlZ10ubmFtZSAhPSAnXDAnKQotCSAgICAgIGVudHJ5LT5pc3ltLnN0X25hbWUKLQkJPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGR5bnN0ciwgYXBwX3JlZ3NbcmVnXS5uYW1lLCB0cnVlLCBmYWxzZSk7Ci0JICAgIGVsc2UKLQkgICAgICBlbnRyeS0+aXN5bS5zdF9uYW1lID0gMDsKLQkgICAgZW50cnktPmlzeW0uc3Rfb3RoZXIgPSAwOwotCSAgICBlbnRyeS0+aXN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGFwcF9yZWdzIFtyZWddLmJpbmQsCi0JCQkJCSAgICAgICBTVFRfUkVHSVNURVIpOwotCSAgICBlbnRyeS0+aXN5bS5zdF9zaG5keCA9IGFwcF9yZWdzIFtyZWddLnNobmR4OwotCSAgICBlbnRyeS0+bmV4dCA9IE5VTEw7Ci0JICAgIGVudHJ5LT5pbnB1dF9iZmQgPSBvdXRwdXRfYmZkOwotCSAgICBlbnRyeS0+aW5wdXRfaW5keCA9IC0xOwotCi0JICAgIGlmIChlaHQtPmR5bmxvY2FsID09IE5VTEwpCi0JICAgICAgZWh0LT5keW5sb2NhbCA9IGVudHJ5OwotCSAgICBlbHNlCi0JICAgICAgewotCQlmb3IgKGUgPSBlaHQtPmR5bmxvY2FsOyBlLT5uZXh0OyBlID0gZS0+bmV4dCkKLQkJICA7Ci0JCWUtPm5leHQgPSBlbnRyeTsKLQkgICAgICB9Ci0JICAgIGVodC0+ZHluc3ltY291bnQrKzsKLQkgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSZWxvY2F0ZSBhIFNQQVJDNjQgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGJmZF92bWEgZ290X2Jhc2U7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlKGluZm8pLT5oZ290ID09IE5VTEwpCi0gICAgZ290X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgZ290X2Jhc2UgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgc2dvdCA9IHNwbHQgPSBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGNjRfUl9UWVBFX0lEIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9TUEFSQ19tYXhfc3RkKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gc3BhcmM2NF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcF9pdCA9IGZhbHNlOwotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQkJY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0JCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgotCQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQkJY2FzZSBSX1NQQVJDX1BDUExUMjI6Ci0JCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JCSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX0dPVDEwOgotCQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkJICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoIWluZm8tPnNoYXJlZAotCQkJICB8fCAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8ICEoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX1BDMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQzIyOgotCQljYXNlIFJfU1BBUkNfUENfSEgyMjoKLQkJY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQ19MTTIyOgotCQkgIGlmICghc3RyY21wKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSkKLQkJICAgIGJyZWFrOwotCQkgIC8qIEZBTExUSFJVICovCi0KLQkJY2FzZSBSX1NQQVJDXzg6Ci0JCWNhc2UgUl9TUEFSQ18xNjoKLQkJY2FzZSBSX1NQQVJDXzMyOgotCQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQMTY6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCQljYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQkJY2FzZSBSX1NQQVJDX0hJMjI6Ci0JCWNhc2UgUl9TUEFSQ18yMjoKLQkJY2FzZSBSX1NQQVJDXzEzOgotCQljYXNlIFJfU1BBUkNfTE8xMDoKLQkJY2FzZSBSX1NQQVJDX1VBMzI6Ci0JCWNhc2UgUl9TUEFSQ18xMDoKLQkJY2FzZSBSX1NQQVJDXzExOgotCQljYXNlIFJfU1BBUkNfNjQ6Ci0JCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQkJY2FzZSBSX1NQQVJDX0hIMjI6Ci0JCWNhc2UgUl9TUEFSQ19ITTEwOgotCQljYXNlIFJfU1BBUkNfTE0yMjoKLQkJY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCQljYXNlIFJfU1BBUkNfNzoKLQkJY2FzZSBSX1NQQVJDXzU6Ci0JCWNhc2UgUl9TUEFSQ182OgotCQljYXNlIFJfU1BBUkNfRElTUDY0OgotCQljYXNlIFJfU1BBUkNfSElYMjI6Ci0JCWNhc2UgUl9TUEFSQ19MT1gxMDoKLQkJY2FzZSBSX1NQQVJDX0g0NDoKLQkJY2FzZSBSX1NQQVJDX000NDoKLQkJY2FzZSBSX1NQQVJDX0w0NDoKLQkJY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JCWNhc2UgUl9TUEFSQ19VQTE2OgotCQkgIGlmIChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgICBza2lwX2l0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgaWYgKHNraXBfaXQpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgY29waWVkCi0JIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1biB0aW1lLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSkKLQl7Ci0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfU1BBUkNfUEMxMDoKLQkgICAgY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQ19ISDIyOgotCSAgICBjYXNlIFJfU1BBUkNfUENfSE0xMDoKLQkgICAgY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JICAgICAgaWYgKGggIT0gTlVMTAotCQkgICYmICFzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSkKLQkJYnJlYWs7Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBSX1NQQVJDX0RJU1A4OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDE2OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDMyOgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19XRElTUDE5OgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgICAgY2FzZSBSX1NQQVJDX0RJU1A2NDoKLQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQlicmVhazsKLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFJfU1BBUkNfODoKLQkgICAgY2FzZSBSX1NQQVJDXzE2OgotCSAgICBjYXNlIFJfU1BBUkNfMzI6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISTIyOgotCSAgICBjYXNlIFJfU1BBUkNfMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMzoKLQkgICAgY2FzZSBSX1NQQVJDX0xPMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19VQTMyOgotCSAgICBjYXNlIFJfU1BBUkNfMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMToKLQkgICAgY2FzZSBSX1NQQVJDXzY0OgotCSAgICBjYXNlIFJfU1BBUkNfT0xPMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISDIyOgotCSAgICBjYXNlIFJfU1BBUkNfSE0xMDoKLQkgICAgY2FzZSBSX1NQQVJDX0xNMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ183OgotCSAgICBjYXNlIFJfU1BBUkNfNToKLQkgICAgY2FzZSBSX1NQQVJDXzY6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISVgyMjoKLQkgICAgY2FzZSBSX1NQQVJDX0xPWDEwOgotCSAgICBjYXNlIFJfU1BBUkNfSDQ0OgotCSAgICBjYXNlIFJfU1BBUkNfTTQ0OgotCSAgICBjYXNlIFJfU1BBUkNfTDQ0OgotCSAgICBjYXNlIFJfU1BBUkNfVUE2NDoKLQkgICAgY2FzZSBSX1NQQVJDX1VBMTY6Ci0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JCWJvb2xlYW4gc2tpcDsKLQotCQlpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmFtZSA9Ci0JCSAgICAgIChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgICAoaW5wdXRfYmZkLAotCQkJZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCWVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkJJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsCi0JCQkJCQkJCWlucHV0X3NlY3Rpb24pLAotCQkJCQkgICBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgICAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQkgIH0KLQotCQlza2lwID0gZmFsc2U7Ci0KLQkJaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCQllbHNlCi0JCSAgewotCQkgICAgYmZkX3ZtYSBvZmY7Ci0KLQkJICAgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgICBpZiAob2ZmID09IE1JTlVTX09ORSkKLQkJICAgICAgc2tpcCA9IHRydWU7Ci0JCSAgICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCSAgfQotCi0JCW91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCS8qIE9wdGltaXplIHVuYWxpZ25lZCByZWxvYyB1c2FnZSBub3cgdGhhdCB3ZSBrbm93IHdoZXJlCi0JCSAgIGl0IGZpbmFsbHkgcmVzaWRlcy4gICovCi0JCXN3aXRjaCAocl90eXBlKQotCQkgIHsKLQkJICBjYXNlIFJfU1BBUkNfMTY6Ci0JCSAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ICYgMSkgcl90eXBlID0gUl9TUEFSQ19VQTE2OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDX1VBMTY6Ci0JCSAgICBpZiAoIShvdXRyZWwucl9vZmZzZXQgJiAxKSkgcl90eXBlID0gUl9TUEFSQ18xNjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ18zMjoKLQkJICAgIGlmIChvdXRyZWwucl9vZmZzZXQgJiAzKSByX3R5cGUgPSBSX1NQQVJDX1VBMzI7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfVUEzMjoKLQkJICAgIGlmICghKG91dHJlbC5yX29mZnNldCAmIDMpKSByX3R5cGUgPSBSX1NQQVJDXzMyOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDXzY0OgotCQkgICAgaWYgKG91dHJlbC5yX29mZnNldCAmIDcpIHJfdHlwZSA9IFJfU1BBUkNfVUE2NDsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ19VQTY0OgotCQkgICAgaWYgKCEob3V0cmVsLnJfb2Zmc2V0ICYgNykpIHJfdHlwZSA9IFJfU1BBUkNfNjQ7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJaWYgKHNraXApCi0JCSAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkJLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhlIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0JCSAgIGJlY29tZSBsb2NhbC4gICovCi0JCWVsc2UgaWYgKGggIT0gTlVMTAotCQkJICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHsKLQkJICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgICAgb3V0cmVsLnJfaW5mbwotCQkgICAgICA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwKLQkJCQkgICAgICBFTEY2NF9SX1RZUEVfSU5GTyAoCi0JCQkJCUVMRjY0X1JfVFlQRV9EQVRBIChyZWwtPnJfaW5mbyksCi0JCQkJCQkJICAgcl90eXBlKSk7Ci0JCSAgICBvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmIChyX3R5cGUgPT0gUl9TUEFSQ182NCkKLQkJICAgICAgewotCQkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JCQlvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlsb25nIGluZHg7Ci0KLQkJCWlmIChoID09IE5VTEwpCi0JCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkJfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgICAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkJICB9Ci0JCQlpZiAoc2VjICE9IE5VTEwgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotCQkJICBpbmR4ID0gMDsKLQkJCWVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCSAgewotCQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkJCSAgICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0KLQkJCSAgICAvKiBGSVhNRTogd2UgcmVhbGx5IHNob3VsZCBiZSBhYmxlIHRvIGxpbmsgbm9uLXBpYwotCQkJICAgICAgIHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCQkJICAgIGlmIChpbmR4ID09IDApCi0JCQkgICAgICB7Ci0JCQkJQkZEX0ZBSUwgKCk7Ci0JCQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkJICAoXygiJXM6IHByb2JhYmx5IGNvbXBpbGVkIHdpdGhvdXQgLWZQSUM/IiksCi0JCQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JCQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJICAgICAgfQotCQkJICB9Ci0KLQkJCW91dHJlbC5yX2luZm8KLQkJCSAgPSBFTEY2NF9SX0lORk8gKGluZHgsCi0JCQkJCSAgRUxGNjRfUl9UWVBFX0lORk8gKAotCQkJCQkgICAgRUxGNjRfUl9UWVBFX0RBVEEgKHJlbC0+cl9pbmZvKSwKLQkJCQkJCQkgICAgICAgcl90eXBlKSk7Ci0JCQlvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgICAgfQotCQkgIH0KLQotCQliZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAoKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICAgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCQkrK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkJLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvIHRoZXJlJ3Mgbm8KLQkJICAgbmVlZCB0byBkbyBhbnl0aGluZyBub3csIHVubGVzcyB0aGlzIGlzIGEgUkVMQVRJVkUKLQkJICAgcmVsb2MgaW4gYW4gdW5hbGxvY2F0ZWQgc2VjdGlvbi4gICovCi0JCWlmIChza2lwCi0JCSAgICB8fCAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICAgIHx8IEVMRjY0X1JfVFlQRV9JRCAob3V0cmVsLnJfaW5mbykgIT0gUl9TUEFSQ19SRUxBVElWRSkKLQkJICBjb250aW51ZTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX1NQQVJDX0dPVDEwOgotCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGdsb2JhbAotCSAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhIC1Cc3ltYm9saWMKLQkJICAgICBsaW5rIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQgbG9jYWxseSwgb3IgdGhlIHN5bWJvbAotCQkgICAgIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4gIFdlCi0JCSAgICAgbXVzdCBpbml0aWFsaXplIHRoaXMgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0JCSAgICAgU2luY2UgdGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDgsIHdlCi0JCSAgICAgdXNlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UKLQkJICAgICBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsYS5nb3QKLQkJICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcyBpcwotCQkgICAgIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KLQotCQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgIG9mZiAmPSB+MTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgICAgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgIH0KLQkJfQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTCk7Ci0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCSAgICAgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDguICBXZSB1c2UKLQkJIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBlbnRyeS4gICovCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSB8PSAxOwotCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYwotCQkJIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbjsKLQkJICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAoKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCQkgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCQl9Ci0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSBnb3RfYmFzZTsKLQkgICAgfQotCSAgZ290byBkb19kZWZhdWx0OwotCi0JY2FzZSBSX1NQQVJDX1dQTFQzMDoKLQljYXNlIFJfU1BBUkNfUExUMzI6Ci0JY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0JY2FzZSBSX1NQQVJDX0xPUExUMTA6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMzI6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMjI6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMTA6Ci0JY2FzZSBSX1NQQVJDX1BMVDY0OgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLQkJIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLQkJIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCSAgICAgIGdvdG8gZG9fZGVmYXVsdDsKLQkgICAgfQotCi0JICBpZiAoc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkJKyBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChoLT5wbHQub2Zmc2V0KSk7Ci0JICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLQljYXNlIFJfU1BBUkNfT0xPMTA6Ci0JICB7Ci0JICAgIGJmZF92bWEgeDsKLQotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICAgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiAmIDB4M2ZmKSArIEVMRjY0X1JfVFlQRV9EQVRBIChyZWwtPnJfaW5mbyk7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4MWZmZikgfCAocmVsb2NhdGlvbiAmIDB4MWZmZik7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICByID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkJICAgIGhvd3RvLT5iaXRzaXplLCBob3d0by0+cmlnaHRzaGlmdCwKLQkJCQkgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgcmVsb2NhdGlvbik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICAvKiBBZGp1c3QgZm9yIHBjLXJlbGF0aXZlLW5lc3MuICAqLwotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICByZWxvY2F0aW9uIC09IHJlbC0+cl9vZmZzZXQ7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4MzAzZmZmKSB8ICgoKChyZWxvY2F0aW9uID4+IDIpICYgMHhjMDAwKSA8PCA2KQotCQkJCSAgIHwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICByID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkJICAgIGhvd3RvLT5iaXRzaXplLCBob3d0by0+cmlnaHRzaGlmdCwKLQkJCQkgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgcmVsb2NhdGlvbik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19ISVgyMjoKLQkgIHsKLQkgICAgYmZkX3ZtYSB4OwotCi0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgICAgcmVsb2NhdGlvbiA9IHJlbG9jYXRpb24gXiBNSU5VU19PTkU7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4M2ZmZmZmKSB8ICgocmVsb2NhdGlvbiA+PiAxMCkgJiAweDNmZmZmZik7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICByID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkJICAgIGhvd3RvLT5iaXRzaXplLCBob3d0by0+cmlnaHRzaGlmdCwKLQkJCQkgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgcmVsb2NhdGlvbik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19MT1gxMDoKLQkgIHsKLQkgICAgYmZkX3ZtYSB4OwotCi0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgICAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uICYgMHgzZmYpIHwgMHgxYzAwOwotCi0JICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICAgIHggPSAoeCAmIH4weDFmZmYpIHwgcmVsb2NhdGlvbjsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JZG9fZGVmYXVsdDoKLQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQlyZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChyKQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotCQkgICAgJiYgaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgIHsKLQkJICAgIC8qIEFzc3VtZSB0aGlzIGlzIGEgY2FsbCBwcm90ZWN0ZWQgYnkgb3RoZXIgY29kZSB0aGF0Ci0JCSAgICAgICBkZXRlY3QgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBJZiB0aGlzIGlzIHRoZSBjYXNlLAotCQkgICAgICAgd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIG92ZXJmbG93LiAgSWYgbm90LCB0aGUgCi0JCSAgICAgICBwcm9ncmFtIGlzIGhvc2VkIGFueXdheSwgYW5kIGEgbGl0dGxlIHdhcm5pbmcgaXNuJ3QKLQkJICAgICAgIGdvaW5nIHRvIGhlbHAuICAqLwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQkgIAotCSAgICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCShpbnB1dF9iZmQsCi0JCQkgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCSBzeW0tPnN0X25hbWUpKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmICgqbmFtZSA9PSAnXDAnKQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgICAgfQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCWJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIFBMVC4gIFNldCBpdCB1cC4gKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIGlmIChoLT5wbHQub2Zmc2V0IDwgTEFSR0VfUExUX1RIUkVTSE9MRCkKLQl7Ci0JICByZWxhLnJfb2Zmc2V0ID0gc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaC0+cGx0Lm9mZnNldCk7Ci0JICByZWxhLnJfYWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IG1heCA9IHNwbHQtPl9yYXdfc2l6ZSAvIFBMVF9FTlRSWV9TSVpFOwotCSAgcmVsYS5yX29mZnNldCA9IHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0IChoLT5wbHQub2Zmc2V0LCBtYXgpOwotCSAgcmVsYS5yX2FkZGVuZCA9IC0oc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaC0+cGx0Lm9mZnNldCkgKyA0KQotCQkJICAtKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICByZWxhLnJfb2Zmc2V0ICs9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc3BsdC0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19KTVBfU0xPVCk7Ci0KLSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIGgtPnBsdC5vZmZzZXQpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIEdPVC4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgTGlrZXdpc2UgaWYKLQkgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuCi0JIFRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCi0JIGluaXRpYWxpemVkIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCSAgcmVsYS5yX2FkZGVuZCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0dMT0JfREFUKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfQ09QWSk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikgcy0+Y29udGVudHMKLQkJCQkgICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGludCBzdHRfcmVnaWR4ID0gLTE7Ci0gIGFzZWN0aW9uICpzZHluOwotICBhc2VjdGlvbiAqc2dvdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmNjRfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBib29sZWFuIHNpemU7Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBjYXNlIERUX1NQQVJDX1JFR0lTVEVSOgotCSAgICAgIGlmIChzdHRfcmVnaWR4ID09IC0xKQotCQl7Ci0JCSAgc3R0X3JlZ2lkeCA9Ci0JCSAgICBfYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4IChpbmZvLCBvdXRwdXRfYmZkLCAtMSk7Ci0JCSAgaWYgKHN0dF9yZWdpZHggPT0gLTEpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IHN0dF9yZWdpZHgrKzsKLQkgICAgICBiZmRfZWxmNjRfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIC8qIGZhbGx0aHJvdWdoICovCi0JICAgIGRlZmF1bHQ6CSAgICAgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSAucGx0IHNlY3Rpb24uICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgc3BhcmM2NF9lbGZfYnVpbGRfcGx0KG91dHB1dF9iZmQsIHNwbHQtPmNvbnRlbnRzLAotCQkJCXNwbHQtPl9yYXdfc2l6ZSAvIFBMVF9FTlRSWV9TSVpFKTsKLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JUExUX0VOVFJZX1NJWkU7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF82NCAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA4OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIGVfZmxhZ3MgZmllbGQuICovCi0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgYm9vbGVhbiBlcnJvcjsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzLCBvbGRfZmxhZ3M7Ci0gIGludCBuZXdfbW0sIG9sZF9tbTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKSAgIC8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpICAgICAgLyogQ29tcGF0aWJsZSBmbGFncyBhcmUgb2sgKi8KLSAgICA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jb21wYXRpYmxlIGZsYWdzICovCi0gICAgewotICAgICAgZXJyb3IgPSBmYWxzZTsKLSAgCi0gICAgICBvbGRfZmxhZ3MgfD0gKG5ld19mbGFncyAmIChFRl9TUEFSQ19TVU5fVVMxfEVGX1NQQVJDX0hBTF9SMSkpOwotICAgICAgbmV3X2ZsYWdzIHw9IChvbGRfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKTsKLSAgICAgIGlmICgob2xkX2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzF8RUZfU1BBUkNfSEFMX1IxKSkgPT0KLSAgICAgICAgICAgKEVGX1NQQVJDX1NVTl9VUzF8RUZfU1BBUkNfSEFMX1IxKSkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCIlczogbGlua2luZyBVbHRyYVNQQVJDIHNwZWNpZmljIHdpdGggSEFMIHNwZWNpZmljIGNvZGUiKSwKLSAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAvKiBDaG9vc2UgdGhlIG1vc3QgcmVzdHJpY3RpdmUgbWVtb3J5IG9yZGVyaW5nICovCi0gICAgICBvbGRfbW0gPSAob2xkX2ZsYWdzICYgRUZfU1BBUkNWOV9NTSk7Ci0gICAgICBuZXdfbW0gPSAobmV3X2ZsYWdzICYgRUZfU1BBUkNWOV9NTSk7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfkVGX1NQQVJDVjlfTU07Ci0gICAgICBuZXdfZmxhZ3MgJj0gfkVGX1NQQVJDVjlfTU07Ci0gICAgICBpZiAobmV3X21tIDwgb2xkX21tKSBvbGRfbW0gPSBuZXdfbW07Ci0gICAgICBvbGRfZmxhZ3MgfD0gb2xkX21tOwotICAgICAgbmV3X2ZsYWdzIHw9IG9sZF9tbTsKLQotICAgICAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICAgICAgaWYgKG5ld19mbGFncyAhPSBvbGRfZmxhZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgICAoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLSAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgKGxvbmcpbmV3X2ZsYWdzLCAobG9uZylvbGRfZmxhZ3MpOwotICAgICAgICB9Ci0KLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gb2xkX2ZsYWdzOwotCi0gICAgICBpZiAoZXJyb3IpCi0gICAgICAgIHsKLSAgICAgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogUHJpbnQgYSBTVFRfUkVHSVNURVIgc3ltYm9sIHRvIGZpbGUgRklMRS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXNwYXJjNjRfZWxmX3ByaW50X3N5bWJvbF9hbGwgKGFiZmQsIGZpbGVwLCBzeW1ib2wpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLSAgaW50IHJlZywgdHlwZTsKLSAgCi0gIGlmIChFTEZfU1RfVFlQRSAoKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKQotICAgICAgIT0gU1RUX1JFR0lTVEVSKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJlZyA9ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWU7Ci0gIHR5cGUgPSBzeW1ib2wtPmZsYWdzOwotICBmcHJpbnRmIChmaWxlLCAiUkVHXyVjJWMlMTFzJWMlYyAgICBSIiwgIkdPTEkiIFtyZWcgLyA4XSwgJzAnICsgKHJlZyAmIDcpLCAiIiwKLQkJICgodHlwZSAmIEJTRl9MT0NBTCkKLQkJICA/ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnIScgOiAnbCcKLSAgCSAgICAgICAgICA6ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnZycgOiAnICcpLAotICAJICAgICAgICAgKHR5cGUgJiBCU0ZfV0VBSykgPyAndycgOiAnICcpOwotICBpZiAoc3ltYm9sLT5uYW1lID09IE5VTEwgfHwgc3ltYm9sLT5uYW1lIFswXSA9PSAnXDAnKQotICAgIHJldHVybiAiI3NjcmF0Y2giOwotICBlbHNlCi0gICAgcmV0dXJuIHN5bWJvbC0+bmFtZTsKLX0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGEgU1BBUkM2NCBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIG1hY2ggPSBiZmRfbWFjaF9zcGFyY192OTsKLSAgCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0gICAgbWFjaCA9IGJmZF9tYWNoX3NwYXJjX3Y5YTsKLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBtYWNoKTsKLX0KLQotLyogUmVsb2NhdGlvbnMgaW4gdGhlIDY0IGJpdCBTUEFSQyBFTEYgQUJJIGFyZSBtb3JlIGNvbXBsZXggdGhhbiBpbgotICAgc3RhbmRhcmQgRUxGLCBiZWNhdXNlIFJfU1BBUkNfT0xPMTAgaGFzIHNlY29uZGFyeSBhZGRlbmQgaW4KLSAgIEVMRjY0X1JfVFlQRV9EQVRBIGZpZWxkLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZWRpcmVjdCB0aGUKLSAgIHJlbG9jYXRpb24gaGFuZGxpbmcgcm91dGluZXMuICAqLwotCi1jb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBzcGFyYzY0X2VsZl9zaXplX2luZm8gPQotewotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0VoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1BoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1NoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbCksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU3ltKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9EeW4pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9Ob3RlKSwKLSAgNCwJCS8qIGhhc2gtdGFibGUgZW50cnkgc2l6ZSAqLwotICAvKiBpbnRlcm5hbCByZWxvY2F0aW9ucyBwZXIgZXh0ZXJuYWwgcmVsb2NhdGlvbnMuCi0gICAgIEZvciBsaW5rIHB1cnBvc2VzIHdlIHVzZSBqdXN0IDEgaW50ZXJuYWwgcGVyCi0gICAgIDEgZXh0ZXJuYWwsIGZvciBhc3NlbWJseSBhbmQgc2x1cnAgc3ltYm9sIHRhYmxlCi0gICAgIHdlIHVzZSAyLiAqLwotICAxLAotICA2NCwJCS8qIGFyY2hfc2l6ZSAqLwotICA4LAkJLyogZmlsZV9hbGlnbiAqLwotICBFTEZDTEFTUzY0LAotICBFVl9DVVJSRU5ULAotICBiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzLAotICBiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIsCi0gIHNwYXJjNjRfZWxmX3dyaXRlX3JlbG9jcywKLSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCwKLSAgc3BhcmM2NF9lbGZfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiwKLSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTAotfTsKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmNjRfc3BhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmNjQtc3BhcmMiCi0jZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAweDEwMDAwMAotCi0vKiBUaGlzIGlzIHRoZSBvZmZpY2lhbCBBQkkgdmFsdWUuICAqLwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNX1NQQVJDVjkKLQotLyogVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3ZSB1c2VkIGJlZm9yZSB0aGUgQUJJIHdhcyByZWxlYXNlZC4gICovCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgRU1fT0xEX1NQQVJDVjkKLQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBzcGFyYzY0X2VsZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gXAotICBzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGJmZF9lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICBzcGFyYzY0X2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZjY0X2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgc3BhcmM2NF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZjY0X2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgc3BhcmM2NF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIHNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sgXAotICBzcGFyYzY0X2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlIFwKLSAgc3BhcmM2NF9lbGZfZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nIFwKLSAgc3BhcmM2NF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzIFwKLSAgc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0gIHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotICBzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBcCi0gIHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLSAgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLSAgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbCBcCi0gIHNwYXJjNjRfZWxmX3ByaW50X3N5bWJvbF9hbGwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcyBcCi0gIHNwYXJjNjRfZWxmX291dHB1dF9hcmNoX3N5bXMKLQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICBzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvIFwKLSAgc3BhcmM2NF9lbGZfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wIFwKLSAgc3BhcmM2NF9lbGZfb2JqZWN0X3AKLQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotCi0vKiBTZWN0aW9uIDUuMi40IG9mIHRoZSBBQkkgc3BlY2lmaWVzIGEgMjU2LWJ5dGUgYm91bmRhcnkgZm9yIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQgOAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSA4Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSBQTFRfSEVBREVSX1NJWkUKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LmMgYi9iZmQvZWxmNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmYjViNS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIEVMRiA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRQkJNjQKLQotI2luY2x1ZGUgImVsZmNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGZhcm0tbmFiaS5jIGIvYmZkL2VsZmFybS1uYWJpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Nzc4YjcuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmFybS1uYWJpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyogMzItYml0IEVMRiBzdXBwb3J0IGZvciBBUk0gbmV3IGFiaSBvcHRpb24uCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAgKHNpemVvZiAoYSkgLyAoc2l6ZW9mIChhKVswXSkpCi0jZW5kaWYKLQotI2RlZmluZSBVU0VfUkVMCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgICAgICAgICAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0iCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgICAgICAgICAgYmZkX2VsZjMyX2JpZ2FybV92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgICAgICAgICAgICAiZWxmMzItYmlnYXJtIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgICAgICAgICAgIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvCi0KLSNkZWZpbmUgQVJNX0VMRl9BQklfVkVSU0lPTgkJMAotI2RlZmluZSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OCQlFTEZPU0FCSV9BUk0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUEMyNCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIHN0YW5kYXJkIDMyYml0IHBjLXJlbGF0aXZlIHJlbG9jICovCi0gIEhPV1RPIChSX0FSTV9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX1BDMTMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzEzIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA4ZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX0FCUzUsCS8qIHR5cGUgKi8KLQkgNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fU0JSRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU0JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMyMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZjA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmYwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzgsCSAgICAgICAgLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX0FNUF9WQ0FMTDksCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FNUF9WQ0FMTDkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TV0kyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TV0kyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fU1dJOCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1NXSTgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGVzZSBuZXh0IHR3byByZWxvY3MgYXJlIGRlZmluZWQsIGJ1dCBJIGRvIG5vdCBrbm93IHdoYXQgdGhleSBkby4gICovCi0gIAotICBIT1dUTyAoUl9BUk1fWFBDMjUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fWFBDMjUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1hQQzIyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1hQQzIyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIFRoZXNlIG5leHQgdGhyZWUgcmVsb2NzIGFyZSBub3QgZGVmaW5lZCwgYnV0IHdlIG5lZWQgdG8gZmlsbCB0aGUgc3BhY2UuICAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE3IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE4IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlbG9jcyB1c2VkIGluIEFSTSBMaW51eCAqLwotICAKLSAgSE9XVE8gKFJfQVJNX0NPUFksCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fQ09QWSIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX0dMT0JfREFULAkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR0xPQl9EQVQiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0pVTVBfU0xPVCwJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0pVTVBfU0xPVCIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fUkVMQVRJVkUsCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9SRUxBVElWRSIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UT0ZGLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVE9GRiIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UUEMsCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR09UUEMiLAkJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UMzIsCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBFbmQgb2YgcmVsb2NzIHVzZWQgaW4gQVJNIExpbnV4ICovIAotCi0gIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUkFCUzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SQUJTMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JQQzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SQkFTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpOyAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1fdGhtX3BjMTFfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMTEsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMTEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3RobV9wYzlfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fVEhNX1BDOSwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEM5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotIAotc3RhdGljIHZvaWQKLWVsZjMyX2FybV9pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKiBlbGZfcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIAotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FSTV9HTlVfVlRJTkhFUklUOgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3Z0aW5oZXJpdF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9HTlVfVlRFTlRSWToKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV92dGVudHJ5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfQVJNX1RITV9QQzExOgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfQVJNX1RITV9QQzk6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdGhtX3BjOV9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChyX3R5cGUgPj0gTlVNX0VMRU0gKGVsZjMyX2FybV9ob3d0b190YWJsZSkpCi0JYmZkX3JlbG9jLT5ob3d0byA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV9ob3d0b190YWJsZVtyX3R5cGVdOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotICAKLXN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwCi0gIHsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGJmZF9yZWxvY192YWw7Ci0gICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgICBlbGZfcmVsb2NfdmFsOwotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAgZWxmMzJfYXJtX3JlbG9jX21hcFtdID0KLXsKLSAge0JGRF9SRUxPQ19OT05FLCAgICAgICAgICAgICAgICAgUl9BUk1fTk9ORX0sCi0gIHtCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIFJfQVJNX1BDMjR9LAotICB7QkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMzMn0sCi0gIHtCRkRfUkVMT0NfMzJfUENSRUwsICAgICAgICAgICAgIFJfQVJNX1JFTDMyfSwKLSAge0JGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTOH0sCi0gIHtCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzE2fSwKLSAge0JGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSwgICAgICAgUl9BUk1fQUJTMTJ9LAotICB7QkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQsICAgICBSX0FSTV9USE1fQUJTNX0sCi0gIHtCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIFJfQVJNX1RITV9QQzIyfSwKLSAge0JGRF9SRUxPQ19BUk1fQ09QWSwgICAgICAgICAgICAgUl9BUk1fQ09QWX0sCi0gIHtCRkRfUkVMT0NfQVJNX0dMT0JfREFULCAgICAgICAgIFJfQVJNX0dMT0JfREFUfSwKLSAge0JGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULCAgICAgICAgUl9BUk1fSlVNUF9TTE9UfSwKLSAge0JGRF9SRUxPQ19BUk1fUkVMQVRJVkUsICAgICAgICAgUl9BUk1fUkVMQVRJVkV9LAotICB7QkZEX1JFTE9DX0FSTV9HT1RPRkYsICAgICAgICAgICBSX0FSTV9HT1RPRkZ9LAotICB7QkZEX1JFTE9DX0FSTV9HT1RQQywgICAgICAgICAgICBSX0FSTV9HT1RQQ30sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVDMyLCAgICAgICAgICAgIFJfQVJNX0dPVDMyfSwKLSAge0JGRF9SRUxPQ19BUk1fUExUMzIsICAgICAgICAgICAgUl9BUk1fUExUMzJ9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgotICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTSAoZWxmMzJfYXJtX3JlbG9jX21hcCk7IGkgKyspCi0JaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgICAKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotfQotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW9hYmkuYyBiL2JmZC9lbGZhcm0tb2FiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmY2MmYyLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tb2FiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG9sZCBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0tb2FiaS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBVU0VfUkVMQQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0tb2FiaSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgICAgICAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybS1vYWJpIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgZWxmMzJfYXJtX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICAwCi0KLSNkZWZpbmUgQVJNX0VMRl9BQklfVkVSU0lPTgkJMAotI2RlZmluZSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OCQkwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9QQzI0LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMxMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwOGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fQUJTNSwJLyogdHlwZSAqLwotCSA2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TQlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TQlJFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQU1QX1ZDQUxMOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEMxMSwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMxMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEM5LAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotICAKLSAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotCi0gIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JBQlMzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUlBDMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogTG9jYXRlIGEgcmVsb2MgaW4gdGhlIGhvd3RvIHRhYmxlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQKLSAgIHdoZW4gdGhlIGVudHJ5IG51bWJlciBpcyBpcyA+IFJfQVJNX0dOVV9WVElOSEVSSVQuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZmluZF9ob3d0byAocl90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgcl90eXBlOwotewotICBpbnQgaTsKLSAgCi0gIGZvciAoaSA9IE5VTV9FTEVNIChlbGYzMl9hcm1faG93dG9fdGFibGUpOyBpLS07KQotICAgIGlmIChlbGYzMl9hcm1faG93dG9fdGFibGUgW2ldLnR5cGUgPT0gcl90eXBlKQotICAgICAgcmV0dXJuIGVsZjMyX2FybV9ob3d0b190YWJsZSArIGk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKTsKLQotICBpZiAocl90eXBlIDw9IFJfQVJNX0dOVV9WVElOSEVSSVQpCi0gICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gIGVsc2UKLSAgICBiZmRfcmVsb2MtPmhvd3RvID0gZmluZF9ob3d0byAocl90eXBlKTsKLX0KLQotc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAKLSAgewotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICAgIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwIGVsZjMyX2FybV9yZWxvY19tYXBbXSA9Ci17Ci0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX05PTkUgfSwKLSAge0JGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgUl9BUk1fUEMyNCB9LAotICB7QkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMzMiB9LAotICB7QkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICBSX0FSTV9SRUwzMiB9LAotICB7QkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlM4IH0sCi0gIHtCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzE2IH0sCi0gIHtCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0sICAgICAgIFJfQVJNX0FCUzEyIH0sCi0gIHtCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwgICAgIFJfQVJNX1RITV9BQlM1IH0sCi0gIHtCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIFJfQVJNX1RITV9QQzIyIH0sCi0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX1NCUkVMMzIgfSwKLSAge0JGRF9SRUxPQ19OT05FLCAgICAgICAgICAgICAgICAgUl9BUk1fQU1QX1ZDQUxMOSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLCBSX0FSTV9USE1fUEMxMSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDksICBSX0FSTV9USE1fUEM5IH0sICAKLSAge0JGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgICAgICAgUl9BUk1fR05VX1ZUSU5IRVJJVCB9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICAgICAgICBSX0FSTV9HTlVfVlRFTlRSWSB9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChlbGYzMl9hcm1fcmVsb2NfbWFwKTsgaS0tOykKLSAgICBpZiAoZWxmMzJfYXJtX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1faG93dG9fdGFibGUgW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMikKLSAgICByZXR1cm4gZmluZF9ob3d0byAoUl9BUk1fUExUMzIpOwotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmY29kZS5oIGIvYmZkL2VsZmNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlZGY5Yi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0NiArMCwwIEBACi0vKiBFTEYgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuICBTdWZmaWNpZW50IHN1cHBvcnQgZm9yIGdkYi4KLQotICAgUmV3cml0dGVuIGJ5IE1hcmsgRWljaGluIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24KLSAgIHB1Ymxpc2hlZCBpbiAiU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSIsIGNoYXB0ZXJzIDQKLSAgIGFuZCA1LCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzICJQcm9jZXNzb3IgU3VwcGxlbWVudCIgZG9jdW1lbnRzCi0gICBkZXJpdmVkIGZyb20gaXQuIEFkZGVkIHN1cHBvcnQgZm9yIGFzc2VtYmxlciBhbmQgb3RoZXIgb2JqZWN0IGZpbGUKLSAgIHV0aWxpdGllcy4gIEZ1cnRoZXIgd29yayBkb25lIGJ5IEtlbiBSYWVidXJuIChDeWdudXMgU3VwcG9ydCksIE1pY2hhZWwKLSAgIE1laXNzbmVyIChPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24pLCBhbmQgUGV0ZXIgSG9vZ2VuYm9vbSAoVW5pdmVyc2l0eQotICAgb2YgVXRhaCkgdG8gZmluaXNoIGFuZCBleHRlbmQgdGhpcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBQcm9ibGVtcyBhbmQgb3RoZXIgaXNzdWVzIHRvIHJlc29sdmUuCi0KLSAgICgxKQlCRkQgZXhwZWN0cyB0aGVyZSB0byBiZSBzb21lIGZpeGVkIG51bWJlciBvZiAic2VjdGlvbnMiIGluCi0gICAgICAgIHRoZSBvYmplY3QgZmlsZS4gIEkuRS4gdGhlcmUgaXMgYSAic2VjdGlvbl9jb3VudCIgdmFyaWFibGUgaW4gdGhlCi0JYmZkIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zLiAgSG93ZXZlciwgRUxGCi0Jc3VwcG9ydHMgbXVsdGlwbGUgInZpZXdzIiBvZiBhIGZpbGUuICBJbiBwYXJ0aWN1bGFyLCB3aXRoIGN1cnJlbnQKLQlpbXBsZW1lbnRhdGlvbnMsIGV4ZWN1dGFibGUgZmlsZXMgdHlwaWNhbGx5IGhhdmUgdHdvIHRhYmxlcywgYQotCXByb2dyYW0gaGVhZGVyIHRhYmxlIGFuZCBhIHNlY3Rpb24gaGVhZGVyIHRhYmxlLCBib3RoIG9mIHdoaWNoCi0JcGFydGl0aW9uIHRoZSBleGVjdXRhYmxlLgotCi0JSW4gRUxGLXNwZWFrLCB0aGUgImxpbmtpbmcgdmlldyIgb2YgdGhlIGZpbGUgdXNlcyB0aGUgc2VjdGlvbiBoZWFkZXIKLQl0YWJsZSB0byBhY2Nlc3MgInNlY3Rpb25zIiB3aXRoaW4gdGhlIGZpbGUsIGFuZCB0aGUgImV4ZWN1dGlvbiB2aWV3IgotCXVzZXMgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlIHRvIGFjY2VzcyAic2VnbWVudHMiIHdpdGhpbiB0aGUgZmlsZS4KLQkiU2VnbWVudHMiIHR5cGljYWxseSBtYXkgY29udGFpbiBhbGwgdGhlIGRhdGEgZnJvbSBvbmUgb3IgbW9yZQotCSJzZWN0aW9ucyIuCi0KLQlOb3RlIHRoYXQgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGlzIG9wdGlvbmFsIGluIEVMRiBleGVjdXRhYmxlcywKLQlidXQgaXQgaXMgdGhpcyBpbmZvcm1hdGlvbiB0aGF0IGlzIG1vc3QgdXNlZnVsIHRvIGdkYi4gIElmIHRoZQotCXNlY3Rpb24gaGVhZGVyIHRhYmxlIGlzIG1pc3NpbmcsIHRoZW4gZ2RiIHNob3VsZCBwcm9iYWJseSB0cnkKLQl0byBtYWtlIGRvIHdpdGggdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKEZJWE1FKQotCi0gICAoMikgIFRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBjb21waWxlZCB0d2ljZSwgb25jZSBpbiAzMi1iaXQgbW9kZSBhbmQKLQlvbmNlIGluIDY0LWJpdCBtb2RlLiAgTW9yZSBvZiBpdCBzaG91bGQgYmUgbWFkZSBzaXplLWluZGVwZW5kZW50Ci0JYW5kIG1vdmVkIGludG8gZWxmLmMuCi0KLSAgICgzKQlFTEYgc2VjdGlvbiBzeW1ib2xzIGFyZSBoYW5kbGVkIHJhdGhlciBzbG9wcGlseSBub3cuICBUaGlzIHNob3VsZAotCWJlIGNsZWFuZWQgdXAsIGFuZCBFTEYgc2VjdGlvbiBzeW1ib2xzIHJlY29uY2lsZWQgd2l0aCBCRkQgc2VjdGlvbgotCXN5bWJvbHMuCi0KLSAgICg0KSAgV2UgbmVlZCBhIHB1Ymxpc2hlZCBzcGVjIGZvciA2NC1iaXQgRUxGLiAgV2UndmUgZ290IHNvbWUgc3R1ZmYgaGVyZQotCXRoYXQgd2UncmUgdXNpbmcgZm9yIFNQQVJDIFY5IDY0LWJpdCBjaGlwcywgYnV0IGRvbid0IGFzc3VtZSB0aGF0Ci0JaXQncyBjYXN0IGluIHN0b25lLgotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0vKiBSZW5hbWluZyBzdHJ1Y3R1cmVzLCB0eXBlZGVmcywgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdG8gYmUgc2l6ZS1zcGVjaWZpYy4gICovCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9FaGRyCU5BTUUoRWxmLEV4dGVybmFsX0VoZHIpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9TeW0JTkFNRShFbGYsRXh0ZXJuYWxfU3ltKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfU2hkcglOQU1FKEVsZixFeHRlcm5hbF9TaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUGhkcglOQU1FKEVsZixFeHRlcm5hbF9QaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUmVsCU5BTUUoRWxmLEV4dGVybmFsX1JlbCkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1JlbGEJTkFNRShFbGYsRXh0ZXJuYWxfUmVsYSkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX0R5bglOQU1FKEVsZixFeHRlcm5hbF9EeW4pCi0KLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpCi0jZGVmaW5lIGVsZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBcCi0gIE5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZGVmaW5lIGVsZl9vYmplY3RfcAkJCU5BTUUoYmZkX2VsZixvYmplY3RfcCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9wCQkJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9wKQotI2RlZmluZSBlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlOQU1FKGJmZF9lbGYsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIE5BTUUoYmZkX2VsZixnZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY19pbikKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2NhX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY2FfaW4pCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jX291dAkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2Nfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9yZWxvY2Ffb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY2Ffb3V0KQotI2RlZmluZSBlbGZfc3dhcF9zeW1ib2xfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3N5bWJvbF9pbikKLSNkZWZpbmUgZWxmX3N3YXBfc3ltYm9sX291dAkJTkFNRShiZmRfZWxmLHN3YXBfc3ltYm9sX291dCkKLSNkZWZpbmUgZWxmX3N3YXBfcGhkcl9pbgkJTkFNRShiZmRfZWxmLHN3YXBfcGhkcl9pbikKLSNkZWZpbmUgZWxmX3N3YXBfcGhkcl9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3BoZHJfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9keW5faW4JCQlOQU1FKGJmZF9lbGYsc3dhcF9keW5faW4pCi0jZGVmaW5lIGVsZl9zd2FwX2R5bl9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX2R5bl9vdXQpCi0jZGVmaW5lIGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQJTkFNRShiZmRfZWxmLGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJTkFNRShiZmRfZWxmLGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNkZWZpbmUgZWxmX3NsdXJwX3N5bWJvbF90YWJsZQkJTkFNRShiZmRfZWxmLHNsdXJwX3N5bWJvbF90YWJsZSkKLSNkZWZpbmUgZWxmX2dldF9zeW10YWIJCQlOQU1FKGJmZF9lbGYsZ2V0X3N5bXRhYikKLSNkZWZpbmUgZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gIE5BTUUoYmZkX2VsZixjYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0jZGVmaW5lIGVsZl9tYWtlX2VtcHR5X3N5bWJvbAkJTkFNRShiZmRfZWxmLG1ha2VfZW1wdHlfc3ltYm9sKQotI2RlZmluZSBlbGZfZ2V0X3N5bWJvbF9pbmZvCQlOQU1FKGJmZF9lbGYsZ2V0X3N5bWJvbF9pbmZvKQotI2RlZmluZSBlbGZfZ2V0X2xpbmVubwkJCU5BTUUoYmZkX2VsZixnZXRfbGluZW5vKQotI2RlZmluZSBlbGZfc2V0X2FyY2hfbWFjaAkJTkFNRShiZmRfZWxmLHNldF9hcmNoX21hY2gpCi0jZGVmaW5lIGVsZl9maW5kX25lYXJlc3RfbGluZQkJTkFNRShiZmRfZWxmLGZpbmRfbmVhcmVzdF9saW5lKQotI2RlZmluZSBlbGZfc2l6ZW9mX2hlYWRlcnMJCU5BTUUoYmZkX2VsZixzaXplb2ZfaGVhZGVycykKLSNkZWZpbmUgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCU5BTUUoYmZkX2VsZixzZXRfc2VjdGlvbl9jb250ZW50cykKLSNkZWZpbmUgZWxmX25vX2luZm9fdG9faG93dG8JCU5BTUUoYmZkX2VsZixub19pbmZvX3RvX2hvd3RvKQotI2RlZmluZSBlbGZfbm9faW5mb190b19ob3d0b19yZWwJTkFNRShiZmRfZWxmLG5vX2luZm9fdG9faG93dG9fcmVsKQotI2RlZmluZSBlbGZfZmluZF9zZWN0aW9uCQlOQU1FKGJmZF9lbGYsZmluZF9zZWN0aW9uKQotI2RlZmluZSBlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMJTkFNRShiZmRfZWxmLGJmZF9saW5rX2FkZF9zeW1ib2xzKQotI2RlZmluZSBlbGZfYWRkX2R5bmFtaWNfZW50cnkJCU5BTUUoYmZkX2VsZixhZGRfZHluYW1pY19lbnRyeSkKLSNkZWZpbmUgZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyCU5BTUUoYmZkX2VsZix3cml0ZV9zaGRyc19hbmRfZWhkcikKLSNkZWZpbmUgZWxmX3dyaXRlX291dF9waGRycwkJTkFNRShiZmRfZWxmLHdyaXRlX291dF9waGRycykKLSNkZWZpbmUgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBOQU1FKGJmZF9lbGYsbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucykKLSNkZWZpbmUgZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sICBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmZkX2ZpbmFsX2xpbmsJCU5BTUUoYmZkX2VsZixiZmRfZmluYWxfbGluaykKLSNkZWZpbmUgZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIE5BTUUoYmZkX2VsZixjcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIE5BTUUoYmZkX2VsZixmaW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2djX3NlY3Rpb25zCQkJTkFNRShfYmZkX2VsZixnY19zZWN0aW9ucykKLSNkZWZpbmUgZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyBcCi0gIE5BTUUoX2JmZF9lbGYsZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKQotI2RlZmluZSBlbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmsJTkFNRShfYmZkX2VsZixnY19jb21tb25fZmluYWxfbGluaykKLSNkZWZpbmUgZWxmX2djX3JlY29yZF92dGluaGVyaXQJCU5BTUUoX2JmZF9lbGYsZ2NfcmVjb3JkX3Z0aW5oZXJpdCkKLSNkZWZpbmUgZWxmX2djX3JlY29yZF92dGVudHJ5CQlOQU1FKF9iZmRfZWxmLGdjX3JlY29yZF92dGVudHJ5KQotI2RlZmluZSBlbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wgXAotICBOQU1FKF9iZmRfZWxmLGxpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKQotCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIEVMRl9SX0lORk8oWCxZKQlFTEY2NF9SX0lORk8oWCxZKQotI2RlZmluZSBFTEZfUl9TWU0oWCkJRUxGNjRfUl9TWU0oWCkKLSNkZWZpbmUgRUxGX1JfVFlQRShYKQlFTEY2NF9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGQ0xBU1MJRUxGQ0xBU1M2NAotI2RlZmluZSBGSUxFX0FMSUdOCTgKLSNkZWZpbmUgTE9HX0ZJTEVfQUxJR04JMwotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIEVMRl9SX0lORk8oWCxZKQlFTEYzMl9SX0lORk8oWCxZKQotI2RlZmluZSBFTEZfUl9TWU0oWCkJRUxGMzJfUl9TWU0oWCkKLSNkZWZpbmUgRUxGX1JfVFlQRShYKQlFTEYzMl9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGQ0xBU1MJRUxGQ0xBU1MzMgotI2RlZmluZSBGSUxFX0FMSUdOCTQKLSNkZWZpbmUgTE9HX0ZJTEVfQUxJR04JMgotI2VuZGlmCi0KLS8qIFN0YXRpYyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHZvaWQgZWxmX3N3YXBfZWhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX0VoZHIgKiwgRWxmX0ludGVybmFsX0VoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX3N3YXBfZWhkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9FaGRyICosIEVsZl9FeHRlcm5hbF9FaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zd2FwX3NoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9TaGRyICosIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zd2FwX3NoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqLCBFbGZfRXh0ZXJuYWxfU2hkciAqKSk7Ci0KLSNkZWZpbmUgZWxmX3N0cmluZ3RhYl9pbml0IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0Ci0KLSNkZWZpbmUgc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleAotCi1zdGF0aWMgYm9vbGVhbiBlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYmZkX3NpemVfdHlwZSwKLQkgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGVsZl9zbHVycF9yZWxvY190YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZCB3cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZmlsZV9wIFBBUkFNUyAoKEVsZl9FeHRlcm5hbF9FaGRyICopKTsKLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCBlbGZfZGVidWdfc2VjdGlvbiBQQVJBTVMgKChpbnQsIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9kZWJ1Z19maWxlIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9FaGRyICopKTsKLXN0YXRpYyBjaGFyICplbGZfc3ltYm9sX2ZsYWdzIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci0jZW5kaWYKLQwKLS8qIFN0cnVjdHVyZSBzd2FwcGluZyByb3V0aW5lcyAqLwotCi0vKiBTaG91bGQgcGVyaGFwcyB1c2UgcHV0X29mZnNldCwgcHV0X3dvcmQsIGV0Yy4gIEZvciBub3csIHRoZSB0d28gdmVyc2lvbnMKLSAgIGNhbiBiZSBoYW5kbGVkIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyAzMiBiaXRzIG9yICJ0aGUgbG9uZyB0eXBlIi4gICovCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF82NAotI2RlZmluZSBwdXRfc2lnbmVkX3dvcmQJYmZkX2hfcHV0X3NpZ25lZF82NAotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfNjQKLSNkZWZpbmUgZ2V0X3NpZ25lZF93b3JkCWJmZF9oX2dldF9zaWduZWRfNjQKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgcHV0X3NpZ25lZF93b3JkCWJmZF9oX3B1dF9zaWduZWRfMzIKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIGdldF9zaWduZWRfd29yZAliZmRfaF9nZXRfc2lnbmVkXzMyCi0jZW5kaWYKLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzeW1ib2wgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIHN5bWJvbCBpbiBpbnRlcm5hbAotICAgZm9ybWF0LiAqLwotCi12b2lkCi1lbGZfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9TeW0gKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqZHN0OwotewotICBpbnQgc2lnbmVkX3ZtYSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+c2lnbl9leHRlbmRfdm1hOwotCi0gIGRzdC0+c3RfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfbmFtZSk7Ci0gIGlmIChzaWduZWRfdm1hKQotICAgIGRzdC0+c3RfdmFsdWUgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3ZhbHVlKTsKLSAgZWxzZQotICAgIGRzdC0+c3RfdmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfdmFsdWUpOwotICBkc3QtPnN0X3NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3Rfc2l6ZSk7Ci0gIGRzdC0+c3RfaW5mbyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9pbmZvKTsKLSAgZHN0LT5zdF9vdGhlciA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9vdGhlcik7Ci0gIGRzdC0+c3Rfc2huZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3NobmR4KTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzeW1ib2wgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbAotICAgZm9ybWF0LiAqLwotCi12b2lkCi1lbGZfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCBzcmMsIGNkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3JjOwotICAgICBQVFIgY2RzdDsKLXsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZHN0ID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgY2RzdDsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnN0X25hbWUsIGRzdC0+c3RfbmFtZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnN0X3ZhbHVlLCBkc3QtPnN0X3ZhbHVlKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c3Rfc2l6ZSwgZHN0LT5zdF9zaXplKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3RfaW5mbywgZHN0LT5zdF9pbmZvKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3Rfb3RoZXIsIGRzdC0+c3Rfb3RoZXIpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+c3Rfc2huZHgsIGRzdC0+c3Rfc2huZHgpOwotfQotCi0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIGZpbGUgaGVhZGVyIGluCi0gICBpbnRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9laGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfRWhkciAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfRWhkciAqZHN0OwotewotICBtZW1jcHkgKGRzdC0+ZV9pZGVudCwgc3JjLT5lX2lkZW50LCBFSV9OSURFTlQpOwotICBkc3QtPmVfdHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV90eXBlKTsKLSAgZHN0LT5lX21hY2hpbmUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfbWFjaGluZSk7Ci0gIGRzdC0+ZV92ZXJzaW9uID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3ZlcnNpb24pOwotICBkc3QtPmVfZW50cnkgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9lbnRyeSk7Ci0gIGRzdC0+ZV9waG9mZiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3Bob2ZmKTsKLSAgZHN0LT5lX3Nob2ZmID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hvZmYpOwotICBkc3QtPmVfZmxhZ3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfZmxhZ3MpOwotICBkc3QtPmVfZWhzaXplID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX2Voc2l6ZSk7Ci0gIGRzdC0+ZV9waGVudHNpemUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhlbnRzaXplKTsKLSAgZHN0LT5lX3BobnVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3BobnVtKTsKLSAgZHN0LT5lX3NoZW50c2l6ZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaGVudHNpemUpOwotICBkc3QtPmVfc2hudW0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hudW0pOwotICBkc3QtPmVfc2hzdHJuZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hzdHJuZHgpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBmaWxlIGhlYWRlciBpbgotICAgZXh0ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotZWxmX3N3YXBfZWhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9FaGRyICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9FaGRyICpkc3Q7Ci17Ci0gIG1lbWNweSAoZHN0LT5lX2lkZW50LCBzcmMtPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0gIC8qIG5vdGUgdGhhdCBhbGwgZWxlbWVudHMgb2YgZHN0IGFyZSAqYXJyYXlzIG9mIHVuc2lnbmVkIGNoYXIqIGFscmVhZHkuLi4gKi8KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfdHlwZSwgZHN0LT5lX3R5cGUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9tYWNoaW5lLCBkc3QtPmVfbWFjaGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5lX3ZlcnNpb24sIGRzdC0+ZV92ZXJzaW9uKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9lbnRyeSwgZHN0LT5lX2VudHJ5KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9waG9mZiwgZHN0LT5lX3Bob2ZmKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9zaG9mZiwgZHN0LT5lX3Nob2ZmKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPmVfZmxhZ3MsIGRzdC0+ZV9mbGFncyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX2Voc2l6ZSwgZHN0LT5lX2Voc2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BoZW50c2l6ZSwgZHN0LT5lX3BoZW50c2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BobnVtLCBkc3QtPmVfcGhudW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaGVudHNpemUsIGRzdC0+ZV9zaGVudHNpemUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaG51bSwgZHN0LT5lX3NobnVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfc2hzdHJuZHgsIGRzdC0+ZV9zaHN0cm5keCk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9TaGRyICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpkc3Q7Ci17Ci0gIGludCBzaWduZWRfdm1hID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zaWduX2V4dGVuZF92bWE7Ci0KLSAgZHN0LT5zaF9uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9uYW1lKTsKLSAgZHN0LT5zaF90eXBlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF90eXBlKTsKLSAgZHN0LT5zaF9mbGFncyA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9mbGFncyk7Ci0gIGlmIChzaWduZWRfdm1hKQotICAgIGRzdC0+c2hfYWRkciA9IGdldF9zaWduZWRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcik7Ci0gIGVsc2UKLSAgICBkc3QtPnNoX2FkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcik7Ci0gIGRzdC0+c2hfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX29mZnNldCk7Ci0gIGRzdC0+c2hfc2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9zaXplKTsKLSAgZHN0LT5zaF9saW5rID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9saW5rKTsKLSAgZHN0LT5zaF9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9pbmZvKTsKLSAgZHN0LT5zaF9hZGRyYWxpZ24gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcmFsaWduKTsKLSAgZHN0LT5zaF9lbnRzaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2VudHNpemUpOwotICBkc3QtPmJmZF9zZWN0aW9uID0gTlVMTDsKLSAgZHN0LT5jb250ZW50cyA9IE5VTEw7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4KLSAgIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9zaGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1NoZHIgKmRzdDsKLXsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfbmFtZSwgZHN0LT5zaF9uYW1lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX3R5cGUsIGRzdC0+c2hfdHlwZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2ZsYWdzLCBkc3QtPnNoX2ZsYWdzKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkciwgZHN0LT5zaF9hZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfb2Zmc2V0LCBkc3QtPnNoX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX3NpemUsIGRzdC0+c2hfc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9saW5rLCBkc3QtPnNoX2xpbmspOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfaW5mbywgZHN0LT5zaF9pbmZvKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkcmFsaWduLCBkc3QtPnNoX2FkZHJhbGlnbik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2VudHNpemUsIGRzdC0+c2hfZW50c2l6ZSk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotdm9pZAotZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1BoZHIgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKmRzdDsKLXsKLSAgaW50IHNpZ25lZF92bWEgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnNpZ25fZXh0ZW5kX3ZtYTsKLQotICBkc3QtPnBfdHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF90eXBlKTsKLSAgZHN0LT5wX2ZsYWdzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2ZsYWdzKTsKLSAgZHN0LT5wX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX29mZnNldCk7Ci0gIGlmIChzaWduZWRfdm1hKQotICAgIHsKLSAgICAgIGRzdC0+cF92YWRkciA9IGdldF9zaWduZWRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF92YWRkcik7Ci0gICAgICBkc3QtPnBfcGFkZHIgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfcGFkZHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRzdC0+cF92YWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3ZhZGRyKTsKLSAgICAgIGRzdC0+cF9wYWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3BhZGRyKTsKLSAgICB9Ci0gIGRzdC0+cF9maWxlc3ogPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9maWxlc3opOwotICBkc3QtPnBfbWVtc3ogPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9tZW1zeik7Ci0gIGRzdC0+cF9hbGlnbiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2FsaWduKTsKLX0KLQotdm9pZAotZWxmX3N3YXBfcGhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9QaGRyICpkc3Q7Ci17Ci0gIC8qIG5vdGUgdGhhdCBhbGwgZWxlbWVudHMgb2YgZHN0IGFyZSAqYXJyYXlzIG9mIHVuc2lnbmVkIGNoYXIqIGFscmVhZHkuLi4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnBfdHlwZSwgZHN0LT5wX3R5cGUpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX29mZnNldCwgZHN0LT5wX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfdmFkZHIsIGRzdC0+cF92YWRkcik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfcGFkZHIsIGRzdC0+cF9wYWRkcik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfZmlsZXN6LCBkc3QtPnBfZmlsZXN6KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9tZW1zeiwgZHN0LT5wX21lbXN6KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnBfZmxhZ3MsIGRzdC0+cF9mbGFncyk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfYWxpZ24sIGRzdC0+cF9hbGlnbik7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgcmVsb2MgZnJvbSBleHRlcm5hbCBmb3JtYXQgdG8gaW50ZXJuYWwgZm9ybWF0LiAqLwotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9pbmZvID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfaW5mbyk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOwotICBkc3QtPnJfaW5mbyA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2luZm8pOwotICBkc3QtPnJfYWRkZW5kID0gZ2V0X3NpZ25lZF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2FkZGVuZCk7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgcmVsb2MgZnJvbSBpbnRlcm5hbCBmb3JtYXQgdG8gZXh0ZXJuYWwgZm9ybWF0LiAqLwotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfb2Zmc2V0LCBkc3QtPnJfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9pbmZvLCBkc3QtPnJfaW5mbyk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfUmVsYSAqZHN0OwotewotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX29mZnNldCwgZHN0LT5yX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfaW5mbywgZHN0LT5yX2luZm8pOwotICBwdXRfc2lnbmVkX3dvcmQgKGFiZmQsIHNyYy0+cl9hZGRlbmQsIGRzdC0+cl9hZGRlbmQpOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfZHluX2luIChhYmZkLCBwLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUFRSIHA7Ci0gICAgIEVsZl9JbnRlcm5hbF9EeW4gKmRzdDsKLXsKLSAgY29uc3QgRWxmX0V4dGVybmFsX0R5biAqc3JjID0gKGNvbnN0IEVsZl9FeHRlcm5hbF9EeW4gKikgcDsKLQotICBkc3QtPmRfdGFnID0gZ2V0X3dvcmQgKGFiZmQsIHNyYy0+ZF90YWcpOwotICBkc3QtPmRfdW4uZF92YWwgPSBnZXRfd29yZCAoYWJmZCwgc3JjLT5kX3VuLmRfdmFsKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX2R5bl9vdXQgKGFiZmQsIHNyYywgcCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfRHluICpzcmM7Ci0gICAgIFBUUiBwOwotewotICBFbGZfRXh0ZXJuYWxfRHluICpkc3QgPSAoRWxmX0V4dGVybmFsX0R5biAqKSBwOwotCi0gIHB1dF93b3JkIChhYmZkLCBzcmMtPmRfdGFnLCBkc3QtPmRfdGFnKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZF91bi5kX3ZhbCwgZHN0LT5kX3VuLmRfdmFsKTsKLX0KLQwKLS8qIEVMRiAuby9leGVjIGZpbGUgcmVhZGluZyAqLwotCi0KLS8qIEJlZ2luIHByb2Nlc3NpbmcgYSBnaXZlbiBvYmplY3QuCi0KLSAgIEZpcnN0IHdlIHZhbGlkYXRlIHRoZSBmaWxlIGJ5IHJlYWRpbmcgaW4gdGhlIEVMRiBoZWFkZXIgYW5kIGNoZWNraW5nCi0gICB0aGUgbWFnaWMgbnVtYmVyLiAgKi8KLQotc3RhdGljIElOTElORSBib29sZWFuCi1lbGZfZmlsZV9wICh4X2VoZHJwKQotICAgICBFbGZfRXh0ZXJuYWxfRWhkciAqeF9laGRycDsKLXsKLSAgcmV0dXJuICgoeF9laGRycC0+ZV9pZGVudFtFSV9NQUcwXSA9PSBFTEZNQUcwKQotCSAgJiYgKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMV0gPT0gRUxGTUFHMSkKLQkgICYmICh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzJdID09IEVMRk1BRzIpCi0JICAmJiAoeF9laGRycC0+ZV9pZGVudFtFSV9NQUczXSA9PSBFTEZNQUczKSk7Ci19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggQUJGRCBtYXRjaGVzIHRoZSB0YXJnZXQgdmVjdG9yCi0gICB0aGF0IEFCRkQgcG9pbnRzIHRvLgotCi0gICBOb3RlIHRoYXQgd2UgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHdpdGggdGhlIHNhbWUgQUJGRCwgYnV0IGRpZmZlcmVudAotICAgdGFyZ2V0IHZlY3RvcnMsIG1vc3Qgb2Ygd2hpY2ggd2lsbCBub3QgbWF0Y2guICBXZSBoYXZlIHRvIGF2b2lkIGxlYXZpbmcKLSAgIGFueSBzaWRlIGVmZmVjdHMgaW4gQUJGRCwgb3IgYW55IGRhdGEgaXQgcG9pbnRzIHRvIChsaWtlIHRkYXRhKSwgaWYgdGhlCi0gICBmaWxlIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfRXh0ZXJuYWxfU2hkciB4X3NoZHI7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5LCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICppX3NoZHJwID0gTlVMTDsgLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci0gIGNoYXIgKnNoc3RydGFiOwkJLyogSW50ZXJuYWwgY29weSBvZiBzZWN0aW9uIGhlYWRlciBzdHJpbmd0YWIgKi8KLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZDsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IGVsZl90ZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOwotICBhc2VjdGlvbiAqczsKLQotICAvKiBSZWFkIGluIHRoZSBFTEYgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHhfZWhkcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogTm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgdmFsaWQgRUxGIGZpbGUsIGFuZCBvbmUgdGhhdCBCRkQgY2FuCi0gICAgIG1ha2UgdXNlIG9mLiAgVGhlIG1hZ2ljIG51bWJlciBtdXN0IG1hdGNoLCB0aGUgYWRkcmVzcyBzaXplICgnY2xhc3MnKQotICAgICBhbmQgYnl0ZS1zd2FwcGluZyBtdXN0IG1hdGNoIG91ciBYVkVDIGVudHJ5LCBhbmQgaXQgbXVzdCBoYXZlIGEKLSAgICAgc2VjdGlvbiBoZWFkZXIgdGFibGUgKEZJWE1FOiBTZWUgY29tbWVudHMgcmUgc2VjdGlvbnMgYXQgdG9wIG9mIHRoaXMKLSAgICAgZmlsZSkuICovCi0KLSAgaWYgKChlbGZfZmlsZV9wICgmeF9laGRyKSA9PSBmYWxzZSkgfHwKLSAgICAgICh4X2VoZHIuZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKSB8fAotICAgICAgKHhfZWhkci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUykpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIENoZWNrIHRoYXQgZmlsZSdzIGJ5dGUgb3JkZXIgbWF0Y2hlcyB4dmVjJ3MgKi8KLSAgc3dpdGNoICh4X2VoZHIuZV9pZGVudFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjoJCS8qIEJpZy1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjoJCS8qIExpdHRsZS1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBTk9ORToJCS8qIE5vIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCi0gICAgZGVmYXVsdDoJCQkvKiBVbmtub3duIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCi0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBlbGZfb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bwotICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KLQotICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9vYmpfdGRhdGEpKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLSAgZWxmX3RkYXRhIChhYmZkKSA9IG5ld190ZGF0YTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBieXRlIG9yZGVyLCBzd2FwIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgKi8KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBlbGZfc3dhcF9laGRyX2luIChhYmZkLCAmeF9laGRyLCBpX2VoZHJwKTsKLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0KLSAgLyogUmVqZWN0IEVUX0NPUkUgKGhlYWRlciBpbmRpY2F0ZXMgY29yZSBmaWxlLCBub3Qgb2JqZWN0IGZpbGUpICovCi0gIGlmIChpX2VoZHJwLT5lX3R5cGUgPT0gRVRfQ09SRSkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogSWYgdGhlcmUgaXMgbm8gc2VjdGlvbiBoZWFkZXIgdGFibGUsIHdlJ3JlIGhvc2VkLiAqLwotICBpZiAoaV9laGRycC0+ZV9zaG9mZiA9PSAwKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBBcyBhIHNpbXBsZSBzYW5pdHkgY2hlY2ssIHZlcmlmeSB0aGF0IHRoZSB3aGF0IEJGRCB0aGlua3MgaXMgdGhlCi0gICAgIHNpemUgb2YgZWFjaCBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBhY3R1YWxseSBtYXRjaGVzIHRoZSBzaXplCi0gICAgIHJlY29yZGVkIGluIHRoZSBmaWxlLiAqLwotICBpZiAoaV9laGRycC0+ZV9zaGVudHNpemUgIT0gc2l6ZW9mICh4X3NoZHIpKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgRUxGIGVfbWFjaGluZSBmaWVsZCBtYXRjaGVzIHdoYXQgdGhpcyBwYXJ0aWN1bGFyCi0gICAgIEJGRCBmb3JtYXQgZXhwZWN0cy4gICovCi0gIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gaV9laGRycC0+ZV9tYWNoaW5lCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQxID09IDAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MSkKLSAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDIgPT0gMCB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQyKSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldF9wdHI7Ci0KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gIExldCBpdCBtYXRjaCBhbnkgRUxGIHRhcmdldAotCSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyBiYWNrZW5kLiAgKi8KLSAgICAgIGZvciAodGFyZ2V0X3B0ciA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0X3B0ciAhPSBOVUxMOyB0YXJnZXRfcHRyKyspCi0JewotCSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJhY2s7Ci0KLQkgIGlmICgoKnRhcmdldF9wdHIpLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIGNvbnRpbnVlOwotCSAgYmFjayA9IChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoKnRhcmdldF9wdHIpLT5iYWNrZW5kX2RhdGE7Ci0JICBpZiAoYmFjay0+ZWxmX21hY2hpbmVfY29kZSA9PSBpX2VoZHJwLT5lX21hY2hpbmUKLQkgICAgICB8fCAoYmFjay0+ZWxmX21hY2hpbmVfYWx0MSAhPSAwCi0JCSAgJiYgYmFjay0+ZWxmX21hY2hpbmVfYWx0MSA9PSBpX2VoZHJwLT5lX21hY2hpbmUpCi0JICAgICAgfHwgKGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgIT0gMAotCQkgICYmIGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgPT0gaV9laGRycC0+ZV9tYWNoaW5lKSkKLQkgICAgewotCSAgICAgIC8qIHRhcmdldF9wdHIgaXMgYW4gRUxGIGJhY2tlbmQgd2hpY2ggbWF0Y2hlcyB0aGlzCi0JCSBvYmplY3QgZmlsZSwgc28gcmVqZWN0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICAqLwotCSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGlfZWhkcnAtPmVfdHlwZSA9PSBFVF9FWEVDKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgZWxzZSBpZiAoaV9laGRycC0+ZV90eXBlID09IEVUX0RZTikKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGlmIChpX2VoZHJwLT5lX3BobnVtID4gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotCi0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGViZC0+YXJjaCwgMCkpCi0gICAgewotICAgICAgLyogSXQncyBPSyBpZiB0aGlzIGZhaWxzIGZvciB0aGUgZ2VuZXJpYyB0YXJnZXQuICAqLwotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3BlY2lmaWVkIGluIHRoZSBFTEYgZmlsZSBoZWFkZXIuICovCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvcHkgb2YgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluCi0gICAgIGludGVybmFsIGZvcm0sIHNlZWsgdG8gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluIHRoZSBmaWxlLAotICAgICByZWFkIGl0IGluLCBhbmQgY29udmVydCBpdCB0byBpbnRlcm5hbCBmb3JtLiAgKi8KLSAgaV9zaGRycCA9ICgoRWxmX0ludGVybmFsX1NoZHIgKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaV9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSk7Ci0gIGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICoqKQotCQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChpX3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgaWYgKCFpX3NoZHJwIHx8ICFlbGZfZWxmc2VjdGlvbnMgKGFiZmQpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfc2hvZmYsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBmb3IgKHNoaW5kZXggPSAwOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X3NoZHIsIHNpemVvZiB4X3NoZHIsIDEsIGFiZmQpICE9IHNpemVvZiAoeF9zaGRyKSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICAgIGVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsICZ4X3NoZHIsIGlfc2hkcnAgKyBzaGluZGV4KTsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBpX3NoZHJwICsgc2hpbmRleDsKLQotICAgICAgLyogSWYgdGhlIHNlY3Rpb24gaXMgbG9hZGVkLCBidXQgbm90IHBhZ2UgYWxpZ25lZCwgY2xlYXIKLSAgICAgICAgIERfUEFHRUQuICAqLwotICAgICAgaWYgKChpX3NoZHJwW3NoaW5kZXhdLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JICAmJiBpX3NoZHJwW3NoaW5kZXhdLnNoX3R5cGUgIT0gU0hUX05PQklUUwotCSAgJiYgKCgoaV9zaGRycFtzaGluZGV4XS5zaF9hZGRyIC0gaV9zaGRycFtzaGluZGV4XS5zaF9vZmZzZXQpCi0JICAgICAgICUgZWJkLT5tYXhwYWdlc2l6ZSkKLQkgICAgICAhPSAwKSkKLQlhYmZkLT5mbGFncyAmPSB+RF9QQUdFRDsKLSAgICB9Ci0gIGlmIChpX2VoZHJwLT5lX3Noc3RybmR4KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaV9laGRycC0+ZV9zaHN0cm5keCkpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIGlmIChpX2VoZHJwLT5lX3BobnVtID09IDApCi0gICAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaV9waGRyOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSAoKEVsZl9JbnRlcm5hbF9QaGRyICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaV9laGRycC0+ZV9waG51bQotCQkJCQkgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSkpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5waGRyID09IE5VTEwpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfcGhvZmYsIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgICAgaV9waGRyID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpX2VoZHJwLT5lX3BobnVtOyBpKyssIGlfcGhkcisrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9QaGRyIHhfcGhkcjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmeF9waGRyLCBzaXplb2YgeF9waGRyLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiB4X3BoZHIpCi0JICAgIGdvdG8gZ290X25vX21hdGNoOwotCSAgZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgJnhfcGhkciwgaV9waGRyKTsKLQl9Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgc2VjdGlvbnMuICBXZQotICAgICB3aWxsIG5lZWQgdGhlIGJhc2UgcG9pbnRlciB0byB0aGlzIHRhYmxlIGxhdGVyLiAqLwotICAvKiBXZSByZWFkIHRoaXMgaW5saW5lIG5vdywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGdvIHRocm91Z2gKLSAgICAgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIHdpdGggaXQgKHNpbmNlIHRoaXMgcGFydGljdWxhciBzdHJ0YWIgaXMKLSAgICAgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUgRUxGIHNlY3Rpb24gbmFtZXMuKSAqLwotCi0gIHNoc3RydGFiID0gYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24gKGFiZmQsIGlfZWhkcnAtPmVfc2hzdHJuZHgpOwotICBpZiAoIXNoc3RydGFiKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIC8qIE9uY2UgYWxsIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMgaGF2ZSBiZWVuIHJlYWQgYW5kIGNvbnZlcnRlZCwgd2UKLSAgICAgY2FuIHN0YXJ0IHByb2Nlc3NpbmcgdGhlbS4gIE5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIgaXMKLSAgICAgYSBkdW1teSBwbGFjZWhvbGRlciBlbnRyeSwgc28gd2UgaWdub3JlIGl0LiAgKi8KLQotICBmb3IgKHNoaW5kZXggPSAxOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgc2hpbmRleCkpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIExldCB0aGUgYmFja2VuZCBkb3VibGUgY2hlY2sgdGhlIGZvcm1hdCBhbmQgb3ZlcnJpZGUgZ2xvYmFsCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfb2JqZWN0X3ApCi0gICAgewotICAgICAgaWYgKCgqZWJkLT5lbGZfYmFja2VuZF9vYmplY3RfcCkgKGFiZmQpID09IGZhbHNlKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGFueSByZWxvYyBzZWN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgZGVidWdnaW5nIHNlY3Rpb25zLCBtYXJrIHRoZSByZWxvYyBzZWN0aW9ucyBhcyBkZWJ1Z2dpbmcgYXMgd2VsbC4gICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAotCSAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKQotCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2luZm8gPiAwKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGFyZ19pbmRleDsKLQkgIGFzZWN0aW9uICp0YXJnX3NlYzsKLQotCSAgdGFyZ19pbmRleCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9pbmZvOwotCSAgdGFyZ19zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgdGFyZ19pbmRleCk7Ci0JICBpZiAodGFyZ19zZWMgIT0gTlVMTAotCSAgICAgICYmICh0YXJnX3NlYy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgICBzLT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChhYmZkLT54dmVjKTsKLQotIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I6Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotIGdvdF9ub19tYXRjaDoKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMCi0gICAgICAmJiBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0ciAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0cik7Ci0gIGlmIChpX3NoZHJwICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIGlfc2hkcnApOwotICBpZiAobmV3X3RkYXRhICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5ld190ZGF0YSk7Ci0gIGVsZl90ZGF0YSAoYWJmZCkgPSBwcmVzZXJ2ZWRfdGRhdGE7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0MCi0vKiBFTEYgLm8vZXhlYyBmaWxlIHdyaXRpbmcgKi8KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJvb2xlYW4gKmZhaWxlZHAgPSAoYm9vbGVhbiAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZl9FeHRlcm5hbF9SZWxhICpvdXRib3VuZF9yZWxvY2FzOwotICBFbGZfRXh0ZXJuYWxfUmVsICpvdXRib3VuZF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIGludCB1c2VfcmVsYV9wOwotICBhc3ltYm9sICpsYXN0X3N5bSA9IDA7Ci0gIGludCBsYXN0X3N5bV9pZHggPSAwOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKCpmYWlsZWRwKQotICAgIHJldHVybjsKLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFRoZSBsaW5rZXIgYmFja2VuZCB3cml0ZXMgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLCBhbmQgc2V0cyB0aGUKLSAgICAgcmVsb2NfY291bnQgZmllbGQgdG8gemVybyB0byBpbmhpYml0IHdyaXRpbmcgdGhlbSBoZXJlLiAgQWxzbywKLSAgICAgc29tZXRpbWVzIHRoZSBTRUNfUkVMT0MgZmxhZyBnZXRzIHNldCBldmVuIHdoZW4gdGhlcmUgYXJlbid0IGFueQotICAgICByZWxvY3MuICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOwotCi0gIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBzZWMtPnJlbG9jX2NvdW50OwotICByZWxhX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbGFfaGRyLT5zaF9zaXplKTsKLSAgaWYgKHJlbGFfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSByZWxvY2F0aW9ucyBhcmUgUkVMQSBvciBSRUwgcmVsb2NhdGlvbnMuICAqLwotICBpZiAocmVsYV9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0gICAgdXNlX3JlbGFfcCA9IHRydWU7Ci0gIGVsc2UgaWYgKHJlbGFfaGRyLT5zaF90eXBlID09IFNIVF9SRUwpCi0gICAgdXNlX3JlbGFfcCA9IGZhbHNlOwotICBlbHNlCi0gICAgLyogRXZlcnkgcmVsb2NhdGlvbiBzZWN0aW9uIHNob3VsZCBiZSBlaXRoZXIgYW4gU0hUX1JFTEEgb3IgYW4KLSAgICAgICBTSFRfUkVMIHNlY3Rpb24uICAqLwotICAgIGFib3J0ICgpOwotCi0gIC8qIG9yZWxvY2F0aW9uIGhhcyB0aGUgZGF0YSwgcmVsb2NfY291bnQgaGFzIHRoZSBjb3VudC4uLiAqLwotICBpZiAodXNlX3JlbGFfcCkKLSAgICB7Ci0gICAgICBvdXRib3VuZF9yZWxvY2FzID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSBkc3RfcmVsYTsKLQkgIEVsZl9FeHRlcm5hbF9SZWxhICpzcmNfcmVsYTsKLQkgIGFyZWxlbnQgKnB0cjsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIGludCBuOwotCi0JICBwdHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF07Ci0JICBzcmNfcmVsYSA9IG91dGJvdW5kX3JlbG9jYXMgKyBpZHg7Ci0KLQkgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKLQkgICAgIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgZHN0X3JlbGEucl9vZmZzZXQgPSBwdHItPmFkZHJlc3M7Ci0JICBlbHNlCi0JICAgIGRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLQkgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotCSAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQkgICAgbiA9IGxhc3Rfc3ltX2lkeDsKLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSAmJiBzeW0tPnZhbHVlID09IDApCi0JICAgIG4gPSBTVE5fVU5ERUY7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsYXN0X3N5bSA9IHN5bTsKLQkgICAgICBuID0gX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0JICAgICAgaWYgKG4gPCAwKQotCQl7Ci0JCSAgKmZhaWxlZHAgPSB0cnVlOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JICAgIH0KLQotCSAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmICgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgICAgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JICAgIHsKLQkgICAgICAqZmFpbGVkcCA9IHRydWU7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGRzdF9yZWxhLnJfaW5mbyA9IEVMRl9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0JICBkc3RfcmVsYS5yX2FkZGVuZCA9IHB0ci0+YWRkZW5kOwotCSAgZWxmX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmRzdF9yZWxhLCBzcmNfcmVsYSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIC8qIFJFTCByZWxvY2F0aW9ucyAqLwotICAgIHsKLSAgICAgIG91dGJvdW5kX3JlbG9jcyA9IChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGRzdF9yZWw7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsICpzcmNfcmVsOwotCSAgYXJlbGVudCAqcHRyOwotCSAgaW50IG47Ci0JICBhc3ltYm9sICpzeW07Ci0KLQkgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLQkgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotCSAgc3JjX3JlbCA9IG91dGJvdW5kX3JlbG9jcyArIGlkeDsKLQotCSAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSAgICAgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0JICAgICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCSAgICBkc3RfcmVsLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotCSAgZWxzZQotCSAgICBkc3RfcmVsLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLQkgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JICAgIG4gPSBsYXN0X3N5bV9pZHg7Ci0JICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgc3ltLT52YWx1ZSA9PSAwKQotCSAgICBuID0gU1ROX1VOREVGOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbGFzdF9zeW0gPSBzeW07Ci0JICAgICAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgICAgIGlmIChuIDwgMCkKLQkJewotCQkgICpmYWlsZWRwID0gdHJ1ZTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBsYXN0X3N5bV9pZHggPSBuOwotCSAgICB9Ci0KLQkgIGlmICgoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkICE9IE5VTEwKLQkgICAgICAmJiAoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMKLQkgICAgICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBkc3RfcmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0JICBlbGZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZkc3RfcmVsLCBzcmNfcmVsKTsKLQl9Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0KLWludAotZWxmX3dyaXRlX291dF9waGRycyAoYWJmZCwgcGhkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1BoZHIgZXh0cGhkcjsKLSAgICAgIGVsZl9zd2FwX3BoZHJfb3V0IChhYmZkLCBwaGRyLCAmZXh0cGhkcik7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmZXh0cGhkciwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkciksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBwaGRyKys7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGhlYWRlcnMgYW5kIHRoZSBFTEYgZmlsZSBoZWFkZXIuICAqLwotCi1ib29sZWFuCi1lbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfRXh0ZXJuYWxfU2hkciAqeF9zaGRycDsJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLQotICAvKiBzd2FwIHRoZSBoZWFkZXIgYmVmb3JlIHNwaXR0aW5nIGl0IG91dC4uLiAqLwotCi0jaWYgREVCVUcgJiAxCi0gIGVsZl9kZWJ1Z19maWxlIChpX2VoZHJwKTsKLSNlbmRpZgotICBlbGZfc3dhcF9laGRyX291dCAoYWJmZCwgaV9laGRycCwgJnhfZWhkcik7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJiB4X2VoZHIsIHNpemVvZiAoeF9laGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoeF9laGRyKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGF0IHRoaXMgcG9pbnQgd2UndmUgY29uY29jdGVkIGFsbCB0aGUgRUxGIHNlY3Rpb25zLi4uICovCi0gIHhfc2hkcnAgPSAoRWxmX0V4dGVybmFsX1NoZHIgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKnhfc2hkcnApICogKGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgaWYgKCF4X3NoZHJwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBpX2VoZHJwLT5lX3NobnVtOyBjb3VudCsrKQotICAgIHsKLSNpZiBERUJVRyAmIDIKLSAgICAgIGVsZl9kZWJ1Z19zZWN0aW9uIChjb3VudCwgaV9zaGRycFtjb3VudF0pOwotI2VuZGlmCi0gICAgICBlbGZfc3dhcF9zaGRyX291dCAoYWJmZCwgaV9zaGRycFtjb3VudF0sIHhfc2hkcnAgKyBjb3VudCk7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgaV9laGRycC0+ZV9zaG9mZiwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpIHhfc2hkcnAsIHNpemVvZiAoKnhfc2hkcnApLCBpX2VoZHJwLT5lX3NobnVtLCBhYmZkKQotCSAgIT0gc2l6ZW9mICgqeF9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogbmVlZCB0byBkdW1wIHRoZSBzdHJpbmcgdGFibGUgdG9vLi4uICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWVsZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQsIHN5bXB0cnMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXB0cnM7CQkvKiBCdWZmZXIgZm9yIGdlbmVyYXRlZCBiZmQgc3ltYm9scyAqLwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICp2ZXJoZHI7Ci0gIHVuc2lnbmVkIGxvbmcgc3ltY291bnQ7CS8qIE51bWJlciBvZiBleHRlcm5hbCBFTEYgc3ltYm9scyAqLwotICBlbGZfc3ltYm9sX3R5cGUgKnN5bTsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBiZmQgc3ltYm9sICovCi0gIGVsZl9zeW1ib2xfdHlwZSAqc3ltYmFzZTsJLyogQnVmZmVyIGZvciBnZW5lcmF0ZWQgYmZkIHN5bWJvbHMgKi8KLSAgRWxmX0ludGVybmFsX1N5bSBpX3N5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqeF9zeW1wID0gTlVMTDsKLSAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqeF92ZXJzeW1wID0gTlVMTDsKLQotICAvKiBSZWFkIGVhY2ggcmF3IEVMRiBzeW1ib2wsIGNvbnZlcnRpbmcgZnJvbSBleHRlcm5hbCBFTEYgZm9ybSB0bwotICAgICBpbnRlcm5hbCBFTEYgZm9ybSwgYW5kIHRoZW4gdXNpbmcgdGhlIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBhCi0gICAgIGNhbm9uaWNhbCBiZmQgc3ltYm9sIHRhYmxlIGVudHJ5LgotCi0gICAgIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSB0aGUgaW5pdGlhbCBiZmQgY2Fub25pY2FsIHN5bWJvbCBidWZmZXIKLSAgICAgYmFzZWQgb24gYSBvbmUtdG8tb25lIG1hcHBpbmcgb2YgdGhlIEVMRiBzeW1ib2xzIHRvIGNhbm9uaWNhbAotICAgICBzeW1ib2xzLiAgV2UgYWN0dWFsbHkgdXNlIGFsbCB0aGUgRUxGIHN5bWJvbHMsIHNvIHRoZXJlIHdpbGwgYmUgbm8KLSAgICAgc3BhY2UgbGVmdCBvdmVyIGF0IHRoZSBlbmQuICBXaGVuIHdlIGhhdmUgYWxsIHRoZSBzeW1ib2xzLCB3ZQotICAgICBidWlsZCB0aGUgY2FsbGVyJ3MgcG9pbnRlciB2ZWN0b3IuICovCi0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIHZlcmhkciA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0gICAgICBpZiAoZWxmX2R5bnZlcnN5bSAoYWJmZCkgPT0gMCkKLQl2ZXJoZHIgPSBOVUxMOwotICAgICAgZWxzZQotCXZlcmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1faGRyOwotICAgICAgaWYgKChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfc2VjdGlvbiAhPSAwCi0JICAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0JICB8fCAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX3NlY3Rpb24gIT0gMAotCSAgICAgICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZiA9PSBOVUxMKSkKLQl7Ci0JICBpZiAoISBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyAoYWJmZCkpCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIGlmIChzeW1jb3VudCA9PSAwKQotICAgIHN5bSA9IHN5bWJhc2UgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIC0xOwotCi0gICAgICBzeW1iYXNlID0gKChlbGZfc3ltYm9sX3R5cGUgKikKLQkJIGJmZF96YWxsb2MgKGFiZmQsIHN5bWNvdW50ICogc2l6ZW9mIChlbGZfc3ltYm9sX3R5cGUpKSk7Ci0gICAgICBpZiAoc3ltYmFzZSA9PSAoZWxmX3N5bWJvbF90eXBlICopIE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgc3ltID0gc3ltYmFzZTsKLQotICAgICAgLyogVGVtcG9yYXJpbHkgYWxsb2NhdGUgcm9vbSBmb3IgdGhlIHJhdyBFTEYgc3ltYm9scy4gICovCi0gICAgICB4X3N5bXAgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJYmZkX21hbGxvYyAoc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoeF9zeW1wID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB4X3N5bXAsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIHN5bWNvdW50LCBhYmZkKQotCSAgIT0gc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBSZWFkIHRoZSByYXcgRUxGIHZlcnNpb24gc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQotICAgICAgaWYgKHZlcmhkciAhPSBOVUxMCi0JICAmJiB2ZXJoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pICE9IHN5bWNvdW50KQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHZlcnNpb24gY291bnQgKCVsZCkgZG9lcyBub3QgbWF0Y2ggc3ltYm9sIGNvdW50ICglbGQpIiksCi0JICAgICBhYmZkLT5maWxlbmFtZSwKLQkgICAgIChsb25nKSAodmVyaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyc3ltKSksCi0JICAgICBzeW1jb3VudCk7Ci0KLQkgIC8qIFNsdXJwIGluIHRoZSBzeW1ib2xzIHdpdGhvdXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgc2luY2UgdGhhdCBpcyBtb3JlIGhlbHBmdWwgdGhhbiBqdXN0IHF1aXR0aW5nLiAgKi8KLQkgIHZlcmhkciA9IE5VTEw7Ci0JfQotCi0gICAgICBpZiAodmVyaGRyICE9IE5VTEwpCi0JewotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCB2ZXJoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICB4X3ZlcnN5bXAgPSAoRWxmX0V4dGVybmFsX1ZlcnN5bSAqKSBiZmRfbWFsbG9jICh2ZXJoZHItPnNoX3NpemUpOwotCSAgaWYgKHhfdmVyc3ltcCA9PSBOVUxMICYmIHZlcmhkci0+c2hfc2l6ZSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB4X3ZlcnN5bXAsIDEsIHZlcmhkci0+c2hfc2l6ZSwgYWJmZCkKLQkgICAgICAhPSB2ZXJoZHItPnNoX3NpemUpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogU2tpcCBmaXJzdCBzeW1ib2wsIHdoaWNoIGlzIGEgbnVsbCBkdW1teS4gICovCi0gICAgICBmb3IgKGkgPSAxOyBpIDwgc3ltY291bnQ7IGkrKykKLQl7Ci0JICBlbGZfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIHhfc3ltcCArIGksICZpX3N5bSk7Ci0JICBtZW1jcHkgKCZzeW0tPmludGVybmFsX2VsZl9zeW0sICZpX3N5bSwgc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0jaWZkZWYgRUxGX0tFRVBfRVhUU1lNCi0JICBtZW1jcHkgKCZzeW0tPm5hdGl2ZV9lbGZfc3ltLCB4X3N5bXAgKyBpLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKTsKLSNlbmRpZgotCSAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLQkgIHN5bS0+c3ltYm9sLm5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLAotCQkJCQkJCSAgICAgIGhkci0+c2hfbGluaywKLQkJCQkJCQkgICAgICBpX3N5bS5zdF9uYW1lKTsKLQotCSAgc3ltLT5zeW1ib2wudmFsdWUgPSBpX3N5bS5zdF92YWx1ZTsKLQotCSAgaWYgKGlfc3ltLnN0X3NobmR4ID4gMCAmJiBpX3N5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwKLQkJCQkJCQkgICAgaV9zeW0uc3Rfc2huZHgpOwotCSAgICAgIGlmIChzeW0tPnN5bWJvbC5zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICAvKiBUaGlzIHN5bWJvbCBpcyBpbiBhIHNlY3Rpb24gZm9yIHdoaWNoIHdlIGRpZCBub3QKLQkJICAgICBjcmVhdGUgYSBCRkQgc2VjdGlvbi4gIEp1c3QgdXNlIGJmZF9hYnNfc2VjdGlvbiwKLQkJICAgICBhbHRob3VnaCBpdCBpcyB3cm9uZy4gIEZJWE1FLiAgKi8KLQkJICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChpX3N5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgICAvKiBFbGYgcHV0cyB0aGUgYWxpZ25tZW50IGludG8gdGhlIGB2YWx1ZScgZmllbGQsIGFuZAotCQkgdGhlIHNpemUgaW50byB0aGUgYHNpemUnIGZpZWxkLiAgQkZEIHdhbnRzIHRvIHNlZSB0aGUKLQkJIHNpemUgaW4gdGhlIHZhbHVlIGZpZWxkLCBhbmQgZG9lc24ndCBjYXJlIChhdCB0aGUKLQkJIG1vbWVudCkgYWJvdXQgdGhlIGFsaWdubWVudC4gICovCi0JICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBpX3N5bS5zdF9zaXplOwotCSAgICB9Ci0JICBlbHNlIGlmIChpX3N5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotCSAgLyogSWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBmaWxlLCB0aGVuIHRoZSBzeW1ib2wgdmFsdWUgaXMKLSAgICAgICAgICAgICBhbHJlYWR5IHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgIT0gMCkKLQkgICAgc3ltLT5zeW1ib2wudmFsdWUgLT0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCi0JICBzd2l0Y2ggKEVMRl9TVF9CSU5EIChpX3N5bS5zdF9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFNUQl9MT0NBTDoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RCX0dMT0JBTDoKLQkgICAgICBpZiAoaV9zeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGCi0JCSAgJiYgaV9zeW0uc3Rfc2huZHggIT0gU0hOX0NPTU1PTikKLQkJc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVEJfV0VBSzoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfV0VBSzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzd2l0Y2ggKEVMRl9TVF9UWVBFIChpX3N5bS5zdF9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFNUVF9TRUNUSU9OOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTSB8IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RUX0ZJTEU6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZJTEUgfCBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUVF9GVU5DOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVFRfT0JKRUNUOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGR5bmFtaWMpCi0JICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9EWU5BTUlDOwotCi0JICBpZiAoeF92ZXJzeW1wICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfVmVyc3ltIGl2ZXJzeW07Ci0KLQkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiAoYWJmZCwgeF92ZXJzeW1wICsgaSwgJml2ZXJzeW0pOwotCSAgICAgIHN5bS0+dmVyc2lvbiA9IGl2ZXJzeW0udnNfdmVyczsKLQkgICAgfQotCi0JICAvKiBEbyBzb21lIGJhY2tlbmQtc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiB0aGlzIHN5bWJvbC4gICovCi0JICB7Ci0JICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICplYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0JICAgIGlmIChlYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKQotCSAgICAgICgqZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZykgKGFiZmQsICZzeW0tPnN5bWJvbCk7Ci0JICB9Ci0KLQkgIHN5bSsrOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gc29tZSBiYWNrZW5kLXNwZWNpZmljIHByb2Nlc3Npbmcgb24gdGhpcyBzeW1ib2wgdGFibGUuICAqLwotICB7Ci0gICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgICBpZiAoZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZykKLSAgICAgICgqZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZykgKGFiZmQsIHN5bWJhc2UsIHN5bWNvdW50KTsKLSAgfQotCi0gIC8qIFdlIHJlbHkgb24gdGhlIHphbGxvYyB0byBjbGVhciBvdXQgdGhlIGZpbmFsIHN5bWJvbCBlbnRyeS4gICovCi0KLSAgc3ltY291bnQgPSBzeW0gLSBzeW1iYXNlOwotCi0gIC8qIEZpbGwgaW4gdGhlIHVzZXIncyBzeW1ib2wgcG9pbnRlciB2ZWN0b3IgaWYgbmVlZGVkLiAgKi8KLSAgaWYgKHN5bXB0cnMpCi0gICAgewotICAgICAgbG9uZyBsID0gc3ltY291bnQ7Ci0KLSAgICAgIHN5bSA9IHN5bWJhc2U7Ci0gICAgICB3aGlsZSAobC0tID4gMCkKLQl7Ci0JICAqc3ltcHRycysrID0gJnN5bS0+c3ltYm9sOwotCSAgc3ltKys7Ci0JfQotICAgICAgKnN5bXB0cnMgPSAwOwkJLyogRmluYWwgbnVsbCBwb2ludGVyICovCi0gICAgfQotCi0gIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3ZlcnN5bXApOwotICBpZiAoeF9zeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF9zeW1wKTsKLSAgcmV0dXJuIHN5bWNvdW50OwotZXJyb3JfcmV0dXJuOgotICBpZiAoeF92ZXJzeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF92ZXJzeW1wKTsKLSAgaWYgKHhfc3ltcCAhPSBOVUxMKQotICAgIGZyZWUgKHhfc3ltcCk7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogUmVhZCAgcmVsb2NhdGlvbnMgZm9yIEFTRUNUIGZyb20gUkVMX0hEUi4gIFRoZXJlIGFyZSBSRUxPQ19DT1VOVCBvZiAKLSAgIHRoZW0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbiAoYWJmZCwgYXNlY3QsIHJlbF9oZHIsIHJlbG9jX2NvdW50LAotCQkJCSAgICByZWxlbnRzLCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gICAgIGFyZWxlbnQgKnJlbGVudHM7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICogY29uc3QgZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBQVFIgYWxsb2NhdGVkID0gTlVMTDsKLSAgYmZkX2J5dGUgKm5hdGl2ZV9yZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbGVudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBlbnRzaXplOwotCi0gIGFsbG9jYXRlZCA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9oZHItPnNoX3NpemUpOwotICBpZiAoYWxsb2NhdGVkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCByZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGFsbG9jYXRlZCwgMSwgcmVsX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkgICE9IHJlbF9oZHItPnNoX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIG5hdGl2ZV9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYWxsb2NhdGVkOwotCi0gIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOwotICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkKLQkgICAgICB8fCBlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLQotICBmb3IgKGkgPSAwLCByZWxlbnQgPSByZWxlbnRzOwotICAgICAgIGkgPCByZWxvY19jb3VudDsKLSAgICAgICBpKyssIHJlbGVudCsrLCBuYXRpdmVfcmVsb2NzICs9IGVudHNpemUpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICBpZiAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSkKLQllbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfUmVsYSAqKSBuYXRpdmVfcmVsb2NzLCAmcmVsYSk7Ci0gICAgICBlbHNlCi0JewotCSAgZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfUmVsICopIG5hdGl2ZV9yZWxvY3MsICZyZWwpOwotCSAgcmVsYS5yX29mZnNldCA9IHJlbC5yX29mZnNldDsKLQkgIHJlbGEucl9pbmZvID0gcmVsLnJfaW5mbzsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgVGhlIGFkZHJlc3Mgb2YgYSBub3JtYWwgQkZEIHJlbG9jIGlzIGFsd2F5cyBzZWN0aW9uIHJlbGF0aXZlLAotCSBhbmQgdGhlIGFkZHJlc3Mgb2YgYSBkeW5hbWljIHJlbG9jIGlzIGFic29sdXRlLi4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwIHx8IGR5bmFtaWMpCi0JcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLSAgICAgIGVsc2UKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0IC0gYXNlY3QtPnZtYTsKLQotICAgICAgaWYgKEVMRl9SX1NZTSAocmVsYS5yX2luZm8pID09IDApCi0JcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgZWxzZQotCXsKLQkgIGFzeW1ib2wgKipwcywgKnM7Ci0KLQkgIHBzID0gc3ltYm9scyArIEVMRl9SX1NZTSAocmVsYS5yX2luZm8pIC0gMTsKLQkgIHMgPSAqcHM7Ci0KLQkgIC8qIENhbm9uaWNhbGl6ZSBFTEYgc2VjdGlvbiBzeW1ib2xzLiAgRklYTUU6IFdoeT8gICovCi0JICBpZiAoKHMtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gcHM7Ci0JICBlbHNlCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKLQotICAgICAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpCi0JKCplYmQtPmVsZl9pbmZvX3RvX2hvd3RvKSAoYWJmZCwgcmVsZW50LCAmcmVsYSk7Ci0gICAgICBlbHNlCi0JKCplYmQtPmVsZl9pbmZvX3RvX2hvd3RvX3JlbCkgKGFiZmQsIHJlbGVudCwgJnJlbCk7Ci0gICAgfQotCi0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGFuZCBzd2FwIHRoZSBleHRlcm5hbCByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqIGNvbnN0IGQgPSBlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjI7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQyOwotICBhcmVsZW50ICpyZWxlbnRzOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbiAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIGR5bmFtaWMpCi0gICAgewotICAgICAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgIHx8IGFzZWN0LT5yZWxvY19jb3VudCA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICByZWxfaGRyID0gJmQtPnJlbF9oZHI7Ci0gICAgICByZWxvY19jb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplOwotICAgICAgcmVsX2hkcjIgPSBkLT5yZWxfaGRyMjsKLSAgICAgIHJlbG9jX2NvdW50MiA9IChyZWxfaGRyMiAKLQkJICAgICAgPyAocmVsX2hkcjItPnNoX3NpemUgLyByZWxfaGRyMi0+c2hfZW50c2l6ZSkKLQkJICAgICAgOiAwKTsKLQotICAgICAgQkZEX0FTU0VSVCAoYXNlY3QtPnJlbG9jX2NvdW50ID09IHJlbG9jX2NvdW50ICsgcmVsb2NfY291bnQyKTsKLSAgICAgIEJGRF9BU1NFUlQgKGFzZWN0LT5yZWxfZmlsZXBvcyA9PSByZWxfaGRyLT5zaF9vZmZzZXQKLQkJICB8fCAocmVsX2hkcjIgJiYgYXNlY3QtPnJlbF9maWxlcG9zID09IHJlbF9oZHIyLT5zaF9vZmZzZXQpKTsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBBU0VDVC0+UkVMT0NfQ09VTlQgdGVuZHMgbm90IHRvIGJlIGFjY3VyYXRlIGluIHRoaXMKLQkgY2FzZSBiZWNhdXNlIHJlbG9jYXRpb25zIGFnYWluc3QgdGhpcyBzZWN0aW9uIG1heSB1c2UgdGhlCi0JIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBhbmQgaW4gdGhhdCBjYXNlIGJmZF9zZWN0aW9uX2Zyb21fc2hkcgotCSBpbiBlbGYuYyBkb2VzIG5vdCB1cGRhdGUgdGhlIFJFTE9DX0NPVU5ULiAgKi8KLSAgICAgIGlmIChhc2VjdC0+X3Jhd19zaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+dGhpc19oZHI7Ci0gICAgICByZWxvY19jb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplOwotICAgICAgcmVsX2hkcjIgPSBOVUxMOwotICAgICAgcmVsb2NfY291bnQyID0gMDsKLSAgICB9Ci0KLSAgcmVsZW50cyA9ICgoYXJlbGVudCAqKSAKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgCi0JCQkocmVsb2NfY291bnQgKyByZWxvY19jb3VudDIpICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAocmVsZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIWVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24gKGFiZmQsIGFzZWN0LAotCQkJCQkgICByZWxfaGRyLCByZWxvY19jb3VudCwKLQkJCQkJICAgcmVsZW50cywKLQkJCQkJICAgc3ltYm9scywgZHluYW1pYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaWYgKHJlbF9oZHIyIAotICAgICAgJiYgIWVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24gKGFiZmQsIGFzZWN0LAotCQkJCQkgICAgICByZWxfaGRyMiwgcmVsb2NfY291bnQyLAotCQkJCQkgICAgICByZWxlbnRzICsgcmVsb2NfY291bnQsCi0JCQkJCSAgICAgIHN5bWJvbHMsIGR5bmFtaWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAKLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxlbnRzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZAotZWxmX2RlYnVnX3NlY3Rpb24gKG51bSwgaGRyKQotICAgICBpbnQgbnVtOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotewotICBmcHJpbnRmIChzdGRlcnIsICJcblNlY3Rpb24jJWQgJyVzJyAweCUuOGx4XG4iLCBudW0sCi0JICAgaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMID8gaGRyLT5iZmRfc2VjdGlvbi0+bmFtZSA6ICIiLAotCSAgIChsb25nKSBoZHIpOwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgInNoX25hbWUgICAgICA9ICVsZFx0c2hfdHlwZSAgICAgID0gJWxkXHRzaF9mbGFncyAgICAgPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfbmFtZSwKLQkgICAobG9uZykgaGRyLT5zaF90eXBlLAotCSAgIChsb25nKSBoZHItPnNoX2ZsYWdzKTsKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJzaF9hZGRyICAgICAgPSAlbGRcdHNoX29mZnNldCAgICA9ICVsZFx0c2hfc2l6ZSAgICAgID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX2FkZHIsCi0JICAgKGxvbmcpIGhkci0+c2hfb2Zmc2V0LAotCSAgIChsb25nKSBoZHItPnNoX3NpemUpOwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgInNoX2xpbmsgICAgICA9ICVsZFx0c2hfaW5mbyAgICAgID0gJWxkXHRzaF9hZGRyYWxpZ24gPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfbGluaywKLQkgICAobG9uZykgaGRyLT5zaF9pbmZvLAotCSAgIChsb25nKSBoZHItPnNoX2FkZHJhbGlnbik7Ci0gIGZwcmludGYgKHN0ZGVyciwgInNoX2VudHNpemUgICA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9lbnRzaXplKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2RlYnVnX2ZpbGUgKGVoZHJwKQotICAgICBFbGZfSW50ZXJuYWxfRWhkciAqZWhkcnA7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfZW50cnkgICAgICA9IDB4JS44bHhcbiIsIChsb25nKSBlaGRycC0+ZV9lbnRyeSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfcGhvZmYgICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3Bob2ZmKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9waG51bSAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfcGhudW0pOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3BoZW50c2l6ZSAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9waGVudHNpemUpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3Nob2ZmICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9zaG9mZik7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfc2hudW0gICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3NobnVtKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9zaGVudHNpemUgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfc2hlbnRzaXplKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZWxmX3N5bWJvbF9mbGFncyAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci0KLSAgYnVmZmVyWzBdID0gJ1wwJzsKLSAgaWYgKGZsYWdzICYgQlNGX0xPQ0FMKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGxvY2FsIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0dMT0JBTCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBnbG9iYWwiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGRlYnVnIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0ZVTkNUSU9OKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGZ1bmN0aW9uIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0tFRVApCi0gICAgc3RyY2F0IChidWZmZXIsICIga2VlcCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9LRUVQX0cpCi0gICAgc3RyY2F0IChidWZmZXIsICIga2VlcF9nIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX1dFQUspCi0gICAgc3RyY2F0IChidWZmZXIsICIgd2VhayIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBzZWN0aW9uLXN5bSIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9PTERfQ09NTU9OKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIG9sZC1jb21tb24iKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBub3QtYXQtZW5kIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGNvbnN0cnVjdG9yIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX1dBUk5JTkcpCi0gICAgc3RyY2F0IChidWZmZXIsICIgd2FybmluZyIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9JTkRJUkVDVCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBpbmRpcmVjdCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9GSUxFKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGZpbGUiKTsKLQotICBpZiAoZmxhZ3MgJiBEWU5BTUlDKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGR5bmFtaWMiKTsKLQotICBpZiAoZmxhZ3MgJiB+KEJTRl9MT0NBTAotCQl8IEJTRl9HTE9CQUwKLQkJfCBCU0ZfREVCVUdHSU5HCi0JCXwgQlNGX0ZVTkNUSU9OCi0JCXwgQlNGX0tFRVAKLQkJfCBCU0ZfS0VFUF9HCi0JCXwgQlNGX1dFQUsKLQkJfCBCU0ZfU0VDVElPTl9TWU0KLQkJfCBCU0ZfT0xEX0NPTU1PTgotCQl8IEJTRl9OT1RfQVRfRU5ECi0JCXwgQlNGX0NPTlNUUlVDVE9SCi0JCXwgQlNGX1dBUk5JTkcKLQkJfCBCU0ZfSU5ESVJFQ1QKLQkJfCBCU0ZfRklMRQotCQl8IEJTRl9EWU5BTUlDKSkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiB1bmtub3duLWJpdHMiKTsKLQotICByZXR1cm4gYnVmZmVyOwotfQotI2VuZGlmCi0MCi0jaW5jbHVkZSAiZWxmY29yZS5oIgotI2luY2x1ZGUgImVsZmxpbmsuaCIKLQwKLS8qIFNpemUtZGVwZW5kZW50IGRhdGEgYW5kIGZ1bmN0aW9ucy4gICovCi1jb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykgPSB7Ci0gIHNpemVvZiAoRWxmX0V4dGVybmFsX0VoZHIpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU2hkciksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9EeW4pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9Ob3RlKSwKLSAgQVJDSF9TSVpFIC8gOCwKLSAgMSwKLSAgQVJDSF9TSVpFLCBGSUxFX0FMSUdOLAotICBFTEZDTEFTUywgRVZfQ1VSUkVOVCwKLSAgZWxmX3dyaXRlX291dF9waGRycywKLSAgZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyLAotICB3cml0ZV9yZWxvY3MsCi0gIGVsZl9zd2FwX3N5bWJvbF9vdXQsCi0gIGVsZl9zbHVycF9yZWxvY190YWJsZSwKLSAgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgZWxmX3N3YXBfZHluX2luLAotICBlbGZfc3dhcF9keW5fb3V0LAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2VsZmNvcmUuaCBiL2JmZC9lbGZjb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDU0YWEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBFTEYgY29yZSBmaWxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLWNoYXIqCi1lbGZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9jb21tYW5kOwotfQotCi1pbnQKLWVsZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfc2lnbmFsOwotfQotCi0KLWJvb2xlYW4KLWVsZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZDsKLSAgICAgYmZkICpleGVjX2JmZDsKLXsKLSAgY2hhciogY29yZW5hbWU7Ci0KLSAgLyogeHZlY3MgbXVzdCBtYXRjaCBpZiBib3RoIGFyZSBFTEYgZmlsZXMgZm9yIHRoZSBzYW1lIHRhcmdldC4gKi8KLQotICBpZiAoY29yZV9iZmQtPnh2ZWMgIT0gZXhlY19iZmQtPnh2ZWMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIHRoZSBuYW1lIGluIHRoZSBjb3JlZmlsZSBtYXRjaGVzIHRoZSBleGVjdXRhYmxlIG5hbWUuICovCi0KLSAgY29yZW5hbWUgPSBlbGZfdGRhdGEgKGNvcmVfYmZkKS0+Y29yZV9wcm9ncmFtOwotICBpZiAoY29yZW5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyKiBleGVjbmFtZSA9IHN0cnJjaHIgKGV4ZWNfYmZkLT5maWxlbmFtZSwgJy8nKTsKLSAgICAgIGV4ZWNuYW1lID0gZXhlY25hbWUgPyBleGVjbmFtZSArIDEgOiBleGVjX2JmZC0+ZmlsZW5hbWU7Ci0KLSAgICAgIGlmIChzdHJjbXAoZXhlY25hbWUsIGNvcmVuYW1lKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogIENvcmUgZmlsZXMgYXJlIHNpbXBseSBzdGFuZGFyZCBFTEYgZm9ybWF0dGVkIGZpbGVzIHRoYXQgcGFydGl0aW9uCi0gICAgdGhlIGZpbGUgdXNpbmcgdGhlIGV4ZWN1dGlvbiB2aWV3IG9mIHRoZSBmaWxlIChwcm9ncmFtIGhlYWRlciB0YWJsZSkKLSAgICByYXRoZXIgdGhhbiB0aGUgbGlua2luZyB2aWV3LiAgSW4gZmFjdCwgdGhlcmUgaXMgbm8gc2VjdGlvbiBoZWFkZXIKLSAgICB0YWJsZSBpbiBhIGNvcmUgZmlsZS4KLQotICAgIFRoZSBwcm9jZXNzIHN0YXR1cyBpbmZvcm1hdGlvbiAoaW5jbHVkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2VuZXJhbAotICAgIHJlZ2lzdGVyIHNldCkgYW5kIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzZXQgYXJlIHN0b3JlZCBpbiBhCi0gICAgc2VnbWVudCBvZiB0eXBlIFBUX05PVEUuICBXZSBoYW5kY3JhZnQgYSBjb3VwbGUgb2YgZXh0cmEgYmZkIHNlY3Rpb25zCi0gICAgdGhhdCBhbGxvdyBzdGFuZGFyZCBiZmQgYWNjZXNzIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyAoLnJlZykgYW5kIHRoZQotICAgIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAoLnJlZzIpLgotCi0gKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbGZfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfUGhkciAqaV9waGRycDsJLyogRWxmIHByb2dyYW0gaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIGludCBwaGluZGV4OwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkOwotCi0gIC8qIFJlYWQgaW4gdGhlIEVMRiBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0LiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHhfZWhkcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoZSBtYWdpYyBudW1iZXIuICovCi0gIGlmIChlbGZfZmlsZV9wICgmeF9laGRyKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgd3Jvbmc6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBGSVhNRTogQ2hlY2sgRUlfVkVSU0lPTiBoZXJlICEgKi8KLQotICAvKiBDaGVjayB0aGUgYWRkcmVzcyBzaXplICgiY2xhc3MiKS4gKi8KLSAgaWYgKHhfZWhkci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUykKLSAgICBnb3RvIHdyb25nOwotCi0gIC8qIENoZWNrIHRoZSBieXRlb3JkZXIuICovCi0gIHN3aXRjaCAoeF9laGRyLmVfaWRlbnRbRUlfREFUQV0pCi0gICAgewotICAgIGNhc2UgRUxGREFUQTJNU0I6CQkvKiBCaWctZW5kaWFuICovCi0gICAgICBpZiAoISBiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZ290byB3cm9uZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUxGREFUQTJMU0I6CQkvKiBMaXR0bGUtZW5kaWFuICovCi0gICAgICBpZiAoISBiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0JZ290byB3cm9uZzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBnb3RvIHdyb25nOwotICAgIH0KLQotICAvKiBHaXZlIGFiZmQgYW4gZWxmX29ial90ZGF0YS4gKi8KLSAgZWxmX3RkYXRhIChhYmZkKSA9Ci0gICAgKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9vYmpfdGRhdGEpKTsKLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBGSVhNRTogZnJvbSBoZXJlIG9uIGRvd24sICJnb3RvIHdyb25nIiB3aWxsIGxlYWsgbWVtb3J5LiAgKi8KLQotICAvKiBTd2FwIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIsIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGJ5dGUgb3JkZXIuICovCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgZWxmX3N3YXBfZWhkcl9pbiAoYWJmZCwgJnhfZWhkciwgaV9laGRycCk7Ci0KLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0KLSAgZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIENoZWNrIHRoYXQgdGhlIEVMRiBlX21hY2hpbmUgZmllbGQgbWF0Y2hlcyB3aGF0IHRoaXMgcGFydGljdWxhcgotICAgICBCRkQgZm9ybWF0IGV4cGVjdHMuICAqLwotCi0gIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gaV9laGRycC0+ZV9tYWNoaW5lCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQxID09IDAKLQkgIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDEpCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQyID09IDAKLQkgIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDIpKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0X3B0cjsKLQotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gd3Jvbmc7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gIExldCBpdCBtYXRjaCBhbnkgRUxGIHRhcmdldAotCSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyBiYWNrZW5kLiAgKi8KLQotICAgICAgZm9yICh0YXJnZXRfcHRyID0gYmZkX3RhcmdldF92ZWN0b3I7ICp0YXJnZXRfcHRyICE9IE5VTEw7IHRhcmdldF9wdHIrKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmFjazsKLQotCSAgaWYgKCgqdGFyZ2V0X3B0ciktPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgY29udGludWU7Ci0JICBiYWNrID0gKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopICgqdGFyZ2V0X3B0ciktPmJhY2tlbmRfZGF0YTsKLQkgIGlmIChiYWNrLT5lbGZfbWFjaGluZV9jb2RlID09IGlfZWhkcnAtPmVfbWFjaGluZSkKLQkgICAgewotCSAgICAgIC8qIHRhcmdldF9wdHIgaXMgYW4gRUxGIGJhY2tlbmQgd2hpY2ggbWF0Y2hlcyB0aGlzCi0JCSBvYmplY3QgZmlsZSwgc28gcmVqZWN0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICAqLwotCSAgICAgIGdvdG8gd3Jvbmc7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIG5vIHByb2dyYW0gaGVhZGVyLCBvciB0aGUgdHlwZSBpcyBub3QgYSBjb3JlIGZpbGUsIHRoZW4KLSAgICAgd2UgYXJlIGhvc2VkLiAqLwotICBpZiAoaV9laGRycC0+ZV9waG9mZiA9PSAwIHx8IGlfZWhkcnAtPmVfdHlwZSAhPSBFVF9DT1JFKQotICAgIGdvdG8gd3Jvbmc7Ci0KLSAgLyogRG9lcyBCRkQncyBpZGVhIG9mIHRoZSBwaGRyIHNpemUgbWF0Y2ggdGhlIHNpemUKLSAgICAgcmVjb3JkZWQgaW4gdGhlIGZpbGU/ICovCi0gIGlmIChpX2VoZHJwLT5lX3BoZW50c2l6ZSAhPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSkKLSAgICBnb3RvIHdyb25nOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAqLwotICBpX3BoZHJwID0gKEVsZl9JbnRlcm5hbF9QaGRyICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCppX3BoZHJwKSAqIGlfZWhkcnAtPmVfcGhudW0pOwotICBpZiAoIWlfcGhkcnApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IGlfcGhkcnA7Ci0KLSAgLyogUmVhZCBhbmQgY29udmVydCB0byBpbnRlcm5hbCBmb3JtLiAqLwotICBmb3IgKHBoaW5kZXggPSAwOyBwaGluZGV4IDwgaV9laGRycC0+ZV9waG51bTsgKytwaGluZGV4KQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9QaGRyIHhfcGhkcjsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJnhfcGhkciwgc2l6ZW9mICh4X3BoZHIpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mICh4X3BoZHIpKQotCXJldHVybiBOVUxMOwotCi0gICAgICBlbGZfc3dhcF9waGRyX2luIChhYmZkLCAmeF9waGRyLCBpX3BoZHJwICsgcGhpbmRleCk7Ci0gICAgfQotCi0gIC8qIFByb2Nlc3MgZWFjaCBwcm9ncmFtIGhlYWRlci4gKi8KLSAgZm9yIChwaGluZGV4ID0gMDsgcGhpbmRleCA8IGlfZWhkcnAtPmVfcGhudW07ICsrcGhpbmRleCkKLSAgICB7Ci0gICAgICBpZiAoIV9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaV9waGRycCArIHBoaW5kZXgsIHBoaW5kZXgpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBTZXQgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAqLwotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBlYmQtPmFyY2gsIDApKQotICAgIHsKLSAgICAgIC8qIEl0J3MgT0sgaWYgdGhpcyBmYWlscyBmb3IgdGhlIGdlbmVyaWMgdGFyZ2V0LiAgKi8KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2F2ZSB0aGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgRUxGIGhlYWRlci4gKi8KLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGlfZWhkcnAtPmVfZW50cnk7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWxmbGluay5jIGIvYmZkL2VsZmxpbmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwOTE1Yi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8qIEVMRiBsaW5raW5nIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jZGVmaW5lIEFSQ0hfU0laRSAwCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1ib29sZWFuCi1fYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGludCBwdHJhbGlnbjsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZ290IikgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGJlZC0+cy0+YXJjaF9zaXplKQotICAgIHsKLSAgICBjYXNlIDMyOiBwdHJhbGlnbiA9IDI7IGJyZWFrOwotICAgIGNhc2UgNjQ6IHB0cmFsaWduID0gMzsgYnJlYWs7Ci0gICAgZGVmYXVsdDogYWJvcnQoKTsKLSAgICB9Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nb3QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmVkLT53YW50X2dvdF9wbHQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290LnBsdCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUgLmdvdAotICAgICAob3IgLmdvdC5wbHQpIHNlY3Rpb24uICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBsaW5rZXIgc2NyaXB0Ci0gICAgIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIHN5bWJvbCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nCi0gICAgIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGggPSBOVUxMOwotICBpZiAoIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCShpbmZvLCBhYmZkLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgYmVkLT5nb3Rfc3ltYm9sX29mZnNldCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JIGJlZC0+Y29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290ID0gaDsKLQotICAvKiBUaGUgZmlyc3QgYml0IG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGlzIHRoZSBoZWFkZXIuICAqLwotICBzLT5fcmF3X3NpemUgKz0gYmVkLT5nb3RfaGVhZGVyX3NpemUgKyBiZWQtPmdvdF9zeW1ib2xfb2Zmc2V0OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBDcmVhdGUgZHluYW1pYyBzZWN0aW9ucyB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzLCBwbHRmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGludCBwdHJhbGlnbiA9IDA7Ci0KLSAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKLSAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5wbHQsIC5yZWxbYV0ucGx0LCAuZ290LCAuZ290LnBsdCwgLmR5bmJzcywgYW5kCi0gICAgIC5yZWxbYV0uYnNzIHNlY3Rpb25zLiAgKi8KLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIHBsdGZsYWdzID0gZmxhZ3M7Ci0gIHBsdGZsYWdzIHw9IFNFQ19DT0RFOwotICBpZiAoYmVkLT5wbHRfbm90X2xvYWRlZCkKLSAgICBwbHRmbGFncyAmPSB+IChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotICBpZiAoYmVkLT5wbHRfcmVhZG9ubHkpCi0gICAgcGx0ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgcGx0ZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIGJlZC0+cGx0X2FsaWdubWVudCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPndhbnRfcGx0X3N5bSkKLSAgICB7Ci0gICAgICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKLQkgLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgCi0JCQliZWQtPmRlZmF1bHRfdXNlX3JlbGFfcCA/ICIucmVsYS5wbHQiIDogIi5yZWwucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmVkLT53YW50X2R5bmJzcykKLSAgICB7Ci0gICAgICAvKiBUaGUgLmR5bmJzcyBzZWN0aW9uIGlzIGEgcGxhY2UgdG8gcHV0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQKLQkgYnkgZHluYW1pYyBvYmplY3RzLCBhcmUgcmVmZXJlbmNlZCBieSByZWd1bGFyIG9iamVjdHMsIGFuZCBhcmUKLQkgbm90IGZ1bmN0aW9ucy4gIFdlIG11c3QgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIHByb2Nlc3MKLQkgaW1hZ2UgYW5kIHVzZSBhIFJfKl9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0JIGluaXRpYWxpemUgdGhlbSBhdCBydW4gdGltZS4gIFRoZSBsaW5rZXIgc2NyaXB0IHB1dHMgdGhlIC5keW5ic3MKLQkgc2VjdGlvbiBpbnRvIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGZpbmFsIGltYWdlLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bmJzcyIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIFNFQ19BTExPQykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLnJlbFthXS5ic3Mgc2VjdGlvbiBob2xkcyBjb3B5IHJlbG9jcy4gIFRoaXMgc2VjdGlvbiBpcyBub3QKLSAgICAgbm9ybWFsbHkgbmVlZGVkLiAgV2UgbmVlZCB0byBjcmVhdGUgaXQgaGVyZSwgdGhvdWdoLCBzbyB0aGF0IHRoZQotICAgICBsaW5rZXIgd2lsbCBtYXAgaXQgdG8gYW4gb3V0cHV0IHNlY3Rpb24uICBXZSBjYW4ndCBqdXN0IGNyZWF0ZSBpdAotICAgICBvbmx5IGlmIHdlIG5lZWQgaXQsIGJlY2F1c2Ugd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHdlIG5lZWQgaXQKLSAgICAgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIGFuZCB0aGUgZmlyc3QgdGltZSB0aGUKLSAgICAgbWFpbiBsaW5rZXIgY29kZSBjYWxscyBCRkQgYWZ0ZXIgZXhhbWluaW5nIGFsbCB0aGUgaW5wdXQgZmlsZXMKLSAgICAgKHNpemVfZHluYW1pY19zZWN0aW9ucykgdGhlIGlucHV0IHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCi0gICAgIG1hcHBlZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgSWYgdGhlIHNlY3Rpb24gdHVybnMgb3V0IG5vdCB0bwotICAgICBiZSBuZWVkZWQsIHdlIGNhbiBkaXNjYXJkIGl0IGxhdGVyLiAgV2Ugd2lsbCBuZXZlciBuZWVkIHRoaXMKLSAgICAgc2VjdGlvbiB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCBzaW5jZSB0aGV5IGRvIG5vdCB1c2UKLSAgICAgY29weSByZWxvY3MuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAKLQkJCQkoYmVkLT5kZWZhdWx0X3VzZV9yZWxhX3AgCi0JCQkJID8gIi5yZWxhLmJzcyIgOiAiLnJlbC5ic3MiKSk7IAotCSAgaWYgKHMgPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0KLS8qIFJlY29yZCBhIG5ldyBkeW5hbWljIHN5bWJvbC4gIFdlIHJlY29yZCB0aGUgZHluYW1pYyBzeW1ib2xzIGFzIHdlCi0gICByZWFkIHRoZSBpbnB1dCBmaWxlcywgc2luY2Ugd2UgbmVlZCB0byBoYXZlIGEgbGlzdCBvZiBhbGwgb2YgdGhlbQotICAgYmVmb3JlIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbmFsIHNpemVzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0gICBOb3RlIHRoYXQgd2UgbWF5IGFjdHVhbGx5IGNhbGwgdGhpcyBmdW5jdGlvbiBldmVuIHRob3VnaCB3ZSBhcmUgbm90Ci0gICBnb2luZyB0byBvdXRwdXQgYW55IGR5bmFtaWMgc3ltYm9sczsgaW4gc29tZSBjYXNlcyB3ZSBrbm93IHRoYXQgYQotICAgc3ltYm9sIHNob3VsZCBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCBvbmx5IGlmIHRoZXJlIGlzCi0gICBvbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7Ci0gICAgICBjaGFyICpwLCAqYWxjOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gY29weTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICAgICAgaC0+ZHluaW5keCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gICAgICArK2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0KLSAgICAgIGR5bnN0ciA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyOwotICAgICAgaWYgKGR5bnN0ciA9PSBOVUxMKQotCXsKLQkgIC8qIENyZWF0ZSBhIHN0cnRhYiB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbCBuYW1lcy4gICovCi0JICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9IGR5bnN0ciA9IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotCSAgaWYgKGR5bnN0ciA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBXZSBkb24ndCBwdXQgYW55IHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIGR5bmFtaWMgc3RyaW5nCi0gICAgICAgICB0YWJsZS4gICovCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIHAgPSBzdHJjaHIgKG5hbWUsIEVMRl9WRVJfQ0hSKTsKLSAgICAgIGlmIChwID09IE5VTEwpCi0JewotCSAgYWxjID0gTlVMTDsKLQkgIGNvcHkgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYWxjID0gYmZkX21hbGxvYyAocCAtIG5hbWUgKyAxKTsKLQkgIGlmIChhbGMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3RybmNweSAoYWxjLCBuYW1lLCBwIC0gbmFtZSk7Ci0JICBhbGNbcCAtIG5hbWVdID0gJ1wwJzsKLQkgIG5hbWUgPSBhbGM7Ci0JICBjb3B5ID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGR5bnN0ciwgbmFtZSwgdHJ1ZSwgY29weSk7Ci0KLSAgICAgIGlmIChhbGMgIT0gTlVMTCkKLQlmcmVlIChhbGMpOwotCi0gICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZHluc3RyX2luZGV4ID0gaW5keDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgZHluaW5kZXggb2YgYSBsb2NhbCBkeW5hbWljIHN5bWJvbC4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHggKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfaW5keCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBsb25nIGlucHV0X2luZHg7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICplOwotCi0gIGZvciAoZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWw7IGUgOyBlID0gZS0+bmV4dCkKLSAgICBpZiAoZS0+aW5wdXRfYmZkID09IGlucHV0X2JmZCAmJiBlLT5pbnB1dF9pbmR4ID09IGlucHV0X2luZHgpCi0gICAgICByZXR1cm4gZS0+ZHluaW5keDsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVudW1iZXIgdGhlIGR5bmFtaWMgc3ltYm9scywgaWYgc29tZSBvZgotICAgdGhlbSBhcmUgcmVtb3ZlZCBiZWNhdXNlIHRoZXkgYXJlIG1hcmtlZCBhcyBsb2NhbC4gIFRoaXMgaXMgY2FsbGVkCi0gICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX3JlbnVtYmVyX2hhc2hfdGFibGVfZHluc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX3JlbnVtYmVyX2hhc2hfdGFibGVfZHluc3ltcyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzaXplX3QgKmNvdW50ID0gKHNpemVfdCAqKSBkYXRhOwotCi0gIGlmIChoLT5keW5pbmR4ICE9IC0xKQotICAgIGgtPmR5bmluZHggPSArKygqY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBc3NpZ24gZHluc3ltIGluZGljaWVzLiAgSW4gYSBzaGFyZWQgbGlicmFyeSB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KLSAgIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbiwgd2hpY2ggY29tZSBmaXJzdC4gIE5leHQgY29tZSBhbGwgb2YKLSAgIHRoZSBiYWNrLWVuZCBhbGxvY2F0ZWQgbG9jYWwgZHluYW1pYyBzeW1zLCBmb2xsb3dlZCBieSB0aGUgcmVzdCBvZgotICAgdGhlIGdsb2JhbCBzeW1ib2xzLiAgKi8KLQotdW5zaWduZWQgbG9uZwotX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBsb25nIGR5bnN5bWNvdW50ID0gMDsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpwOwotICAgICAgZm9yIChwID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHAgOyBwID0gcC0+bmV4dCkKLQllbGZfc2VjdGlvbl9kYXRhIChwKS0+ZHluaW5keCA9ICsrZHluc3ltY291bnQ7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICpwOwotICAgICAgZm9yIChwID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbDsgcCA7IHAgPSBwLT5uZXh0KQotCXAtPmR5bmluZHggPSArK2R5bnN5bWNvdW50OwotICAgIH0KLQotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9saW5rX3JlbnVtYmVyX2hhc2hfdGFibGVfZHluc3ltcywKLQkJCSAgJmR5bnN5bWNvdW50KTsKLQotICAvKiBUaGVyZSBpcyBhbiB1bnVzZWQgTlVMTCBlbnRyeSBhdCB0aGUgaGVhZCBvZiB0aGUgdGFibGUgd2hpY2gKLSAgICAgd2UgbXVzdCBhY2NvdW50IGZvciBpbiBvdXIgY291bnQuICBVbmxlc3MgdGhlcmUgd2VyZW4ndCBhbnkKLSAgICAgc3ltYm9scywgd2hpY2ggbWVhbnMgd2UnbGwgaGF2ZSBubyB0YWJsZSBhdCBhbGwuICAqLwotICBpZiAoZHluc3ltY291bnQgIT0gMCkKLSAgICArK2R5bnN5bWNvdW50OwotCi0gIHJldHVybiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0gZHluc3ltY291bnQ7Ci19Ci0MCi0vKiBDcmVhdGUgYSBzcGVjaWFsIGxpbmtlciBzZWN0aW9uLCBvciByZXR1cm4gYSBwb2ludGVyIHRvIGEgbGlua2VyCi0gICBzZWN0aW9uIGFscmVhZHkgY3JlYXRlZCAqLwotCi1lbGZfbGlua2VyX3NlY3Rpb25fdCAqCi1fYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoLCBkZWZhdWx0cykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSB3aGljaDsKLSAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmRlZmF1bHRzOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaXJzdCBiZmQgc2VjdGlvbiB0aGF0IG5lZWRzIHRoZSBzcGVjaWFsIHNlY3Rpb24gKi8KLSAgaWYgKCFkeW5vYmopCi0gICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUsIGNyZWF0ZSB0aGUgc2VjdGlvbiAqLwotICBsc2VjdCA9IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCk7Ci0gIGlmICghbHNlY3QpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGxzZWN0ID0gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopCi0JYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAoZWxmX2xpbmtlcl9zZWN0aW9uX3QpKTsKLQotICAgICAgKmxzZWN0ID0gKmRlZmF1bHRzOwotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIHdoaWNoKSA9IGxzZWN0OwotICAgICAgbHNlY3QtPndoaWNoID0gd2hpY2g7Ci0gICAgICBsc2VjdC0+aG9sZV93cml0dGVuX3AgPSBmYWxzZTsKLQotICAgICAgLyogU2VlIGlmIHRoZSBzZWN0aW9ucyBhbHJlYWR5IGV4aXN0ICovCi0gICAgICBsc2VjdC0+c2VjdGlvbiA9IHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBsc2VjdC0+bmFtZSk7Ci0gICAgICBpZiAoIXMgfHwgKHMtPmZsYWdzICYgZGVmYXVsdHMtPmZsYWdzKSAhPSBkZWZhdWx0cy0+ZmxhZ3MpCi0JewotCSAgbHNlY3QtPnNlY3Rpb24gPSBzID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGR5bm9iaiwgbHNlY3QtPm5hbWUpOwotCi0JICBpZiAocyA9PSBOVUxMKQotCSAgICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKLQotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHMsIGRlZmF1bHRzLT5mbGFncyk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIGxzZWN0LT5hbGlnbm1lbnQpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykgPCBsc2VjdC0+YWxpZ25tZW50KQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgbHNlY3QtPmFsaWdubWVudCk7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGFsaWduX3Bvd2VyIChzLT5fcmF3X3NpemUsIGxzZWN0LT5hbGlnbm1lbnQpOwotCi0gICAgICAvKiBJcyB0aGVyZSBhIGhvbGUgd2UgaGF2ZSB0byBwcm92aWRlPyAgSWYgc28gY2hlY2sgd2hldGhlciB0aGUgc2VnbWVudCBpcwotCSB0b28gYmlnIGFscmVhZHkgKi8KLSAgICAgIGlmIChsc2VjdC0+aG9sZV9zaXplKQotCXsKLQkgIGxzZWN0LT5ob2xlX29mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQkgIHMtPl9yYXdfc2l6ZSArPSBsc2VjdC0+aG9sZV9zaXplOwotCSAgaWYgKGxzZWN0LT5ob2xlX29mZnNldCA+IGxzZWN0LT5tYXhfaG9sZV9vZmZzZXQpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBTZWN0aW9uICVzIGlzIGFscmVhZHkgdG8gbGFyZ2UgdG8gcHV0IGhvbGUgb2YgJWxkIGJ5dGVzIGluIiksCi0JCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgICAgIGxzZWN0LT5uYW1lLAotCQkJCSAgICAgKGxvbmcpbHNlY3QtPmhvbGVfc2l6ZSk7Ci0KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKLQkgICAgfQotCX0KLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJDcmVhdGluZyBzZWN0aW9uICVzLCBjdXJyZW50IHNpemUgPSAlbGRcbiIsCi0JICAgICAgIGxzZWN0LT5uYW1lLCAobG9uZylzLT5fcmF3X3NpemUpOwotI2VuZGlmCi0KLSAgICAgIGlmIChsc2VjdC0+c3ltX25hbWUpCi0JewotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJBZGRpbmcgJXMgdG8gc2VjdGlvbiAlc1xuIiwKLQkJICAgbHNlY3QtPnN5bV9uYW1lLAotCQkgICBsc2VjdC0+bmFtZSk7Ci0jZW5kaWYKLQkgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIGxzZWN0LT5zeW1fbmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgIGlmICgoaCA9PSBOVUxMIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICAgICAmJiAhKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLAotCQkJCQkJICAgICBhYmZkLAotCQkJCQkJICAgICBsc2VjdC0+c3ltX25hbWUsCi0JCQkJCQkgICAgIEJTRl9HTE9CQUwsCi0JCQkJCQkgICAgIHMsCi0JCQkJCQkgICAgICgobHNlY3QtPmhvbGVfc2l6ZSkKLQkJCQkJCSAgICAgID8gcy0+X3Jhd19zaXplIC0gbHNlY3QtPmhvbGVfc2l6ZSArIGxzZWN0LT5zeW1fb2Zmc2V0Ci0JCQkJCQkgICAgICA6IGxzZWN0LT5zeW1fb2Zmc2V0KSwKLQkJCQkJCSAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSAgICAgZmFsc2UsCi0JCQkJCQkgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkJCQkJCSAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCSAgICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKLQotCSAgaWYgKChkZWZhdWx0cy0+d2hpY2ggIT0gTElOS0VSX1NFQ1RJT05fU0RBVEEpCi0JICAgICAgJiYgKGRlZmF1bHRzLT53aGljaCAhPSBMSU5LRVJfU0VDVElPTl9TREFUQTIpKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUM7Ci0KLQkgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCSAgbHNlY3QtPnN5bV9oYXNoID0gaDsKLQotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKLQl9Ci0gICAgfQotCi0jaWYgMAotICAvKiBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2UuICBUaGUgc2VjdGlvbnMgd2hpY2ggbWF5IGV4aXN0IGluIHRoZQotICAgICBvYmplY3QgZmlsZSBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgc2VjdGlvbnMgd2Ugd2FudCB0bwotICAgICBjcmVhdGUuICAqLwotCi0gIC8qIEZpbmQgdGhlIHJlbGF0ZWQgc2VjdGlvbnMgaWYgdGhleSBoYXZlIGJlZW4gY3JlYXRlZCAqLwotICBpZiAobHNlY3QtPmJzc19uYW1lICYmICFsc2VjdC0+YnNzX3NlY3Rpb24pCi0gICAgbHNlY3QtPmJzc19zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPmJzc19uYW1lKTsKLQotICBpZiAobHNlY3QtPnJlbF9uYW1lICYmICFsc2VjdC0+cmVsX3NlY3Rpb24pCi0gICAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSNlbmRpZgotCi0gIHJldHVybiBsc2VjdDsKLX0KLQotDAotLyogRmluZCBhIGxpbmtlciBnZW5lcmF0ZWQgcG9pbnRlciB3aXRoIGEgZ2l2ZW4gYWRkZW5kIGFuZCB0eXBlLiAgKi8KLQotZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKgotX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChsaW5rZXJfcG9pbnRlcnMsIGFkZGVuZCwgd2hpY2gpCi0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfcG9pbnRlcnM7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGFkZGVuZDsKLSAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX2VudW1fdCB3aGljaDsKLXsKLSAgZm9yICggOyBsaW5rZXJfcG9pbnRlcnMgIT0gTlVMTDsgbGlua2VyX3BvaW50ZXJzID0gbGlua2VyX3BvaW50ZXJzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICh3aGljaCA9PSBsaW5rZXJfcG9pbnRlcnMtPndoaWNoICYmIGFkZGVuZCA9PSBsaW5rZXJfcG9pbnRlcnMtPmFkZGVuZCkKLQlyZXR1cm4gbGlua2VyX3BvaW50ZXJzOwotICAgIH0KLQotICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopMDsKLX0KLQotDAotLyogTWFrZSB0aGUgLnJlbGEgc2VjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnZW5lcmF0ZWQgbGlua2VyIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEgKGR5bm9iaiwgbHNlY3QsIGFsaWdubWVudCkKLSAgICAgYmZkICpkeW5vYmo7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKLSAgICAgaW50IGFsaWdubWVudDsKLXsKLSAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBsc2VjdC0+cmVsX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBsc2VjdC0+cmVsX25hbWUpOwotICBpZiAobHNlY3QtPnJlbF9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBsc2VjdC0+cmVsX25hbWUpOwotICAgICAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbiA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLAotCQkJCSAgICAgIGxzZWN0LT5yZWxfc2VjdGlvbiwKLQkJCQkgICAgICAoU0VDX0FMTE9DCi0JCQkJICAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgbHNlY3QtPnJlbF9zZWN0aW9uLCBhbGlnbm1lbnQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWxmbGluay5oIGIvYmZkL2VsZmxpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2NzlhNy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmbGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsNjU5OCArMCwwIEBACi0vKiBFTEYgbGlua2VyIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBFTEYgbGlua2VyIGNvZGUuICAqLwotCi0vKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gcm91dGluZXMgY2FsbGVkIHZpYQotICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSB3aGljaCBtdXN0IHJldHVybiBmYWlsdXJlLiAgKi8KLQotc3RydWN0IGVsZl9pbmZvX2ZhaWxlZAotewotICBib29sZWFuIGZhaWxlZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci19OwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tZXJnZV9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfdm1hICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqLAotCSAgIGJvb2xlYW4gKiwgYm9vbGVhbiAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9leHBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2ZpeF9zeW1ib2xfZmxhZ3MKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24KLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfY29sbGVjdF9oYXNoX2NvZGVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uIAotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgUFRSLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfbGlua19vdXRwdXRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGVsZl9saW5rX2FkanVzdF9yZWxvY3MgCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBpbnQsIAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLS8qIEdpdmVuIGFuIEVMRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1lbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0dXJuIGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0MCi0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gRUxGIGFyY2hpdmUgZmlsZSB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBXZQotICAgZG9uJ3QgdXNlIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgYmVjYXVzZSBvZiBhCi0gICBwcm9ibGVtIHdoaWNoIGFyaXNlcyBvbiBVbml4V2FyZS4gIFRoZSBVbml4V2FyZSBsaWJjLnNvIGlzIGFuCi0gICBhcmNoaXZlIHdoaWNoIGluY2x1ZGVzIGFuIGVudHJ5IGxpYmMuc28uMSB3aGljaCBkZWZpbmVzIGEgYnVuY2ggb2YKLSAgIHN5bWJvbHMuICBUaGUgbGliYy5zbyBhcmNoaXZlIGFsc28gaW5jbHVkZXMgYSBudW1iZXIgb2Ygb3RoZXIKLSAgIG9iamVjdCBmaWxlcywgd2hpY2ggYWxzbyBkZWZpbmUgc3ltYm9scywgc29tZSBvZiB3aGljaCBhcmUgdGhlIHNhbWUKLSAgIGFzIHRob3NlIGRlZmluZWQgaW4gbGliYy5zby4xLiAgQ29ycmVjdCBsaW5raW5nIHJlcXVpcmVzIHRoYXQgd2UKLSAgIGNvbnNpZGVyIGVhY2ggb2JqZWN0IGZpbGUgaW4gdHVybiwgYW5kIGluY2x1ZGUgaXQgaWYgaXQgZGVmaW5lcyBhbnkKLSAgIHN5bWJvbHMgd2UgbmVlZC4gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgZG9lcyBub3QgZG8KLSAgIHRoaXM7IGl0IGxvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBpbmNsdWRlcwotICAgYW55IG9iamVjdCBmaWxlIHdoaWNoIGRlZmluZXMgdGhlbS4gIFdoZW4gdGhpcyBhbGdvcml0aG0gaXMgdXNlZCBvbgotICAgVW5peFdhcmUsIGl0IHdpbmRzIHVwIHB1bGxpbmcgaW4gbGliYy5zby4xIGVhcmx5IGFuZCBkZWZpbmluZyBhCi0gICBidW5jaCBvZiBzeW1ib2xzLiAgVGhpcyBtZWFucyB0aGF0IHNvbWUgb2YgdGhlIG90aGVyIG9iamVjdHMgaW4gdGhlCi0gICBhcmNoaXZlIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGxpbmssIHdoaWNoIGlzIGluY29ycmVjdCBzaW5jZSB0aGV5Ci0gICBwcmVjZWRlIGxpYmMuc28uMSBpbiB0aGUgYXJjaGl2ZS4KLQotICAgRm9ydHVuYXRlbHksIEVMRiBhcmNoaXZlIGhhbmRsaW5nIGlzIHNpbXBsZXIgdGhhbiB0aGF0IGRvbmUgYnkKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMsIHdoaWNoIGhhcyB0byBhbGxvdyBmb3IgYS5vdXQKLSAgIG9kZGl0aWVzLiAgSW4gRUxGLCBpZiB3ZSBmaW5kIGEgc3ltYm9sIGluIHRoZSBhcmNoaXZlIG1hcCwgYW5kIHRoZQotICAgc3ltYm9sIGlzIGN1cnJlbnRseSB1bmRlZmluZWQsIHdlIGtub3cgdGhhdCB3ZSBtdXN0IHB1bGwgaW4gdGhhdAotICAgb2JqZWN0IGZpbGUuCi0KLSAgIFVuZm9ydHVuYXRlbHksIHdlIGRvIGhhdmUgdG8gbWFrZSBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgc3ltYm9sCi0gICB0YWJsZSB1bnRpbCBub3RoaW5nIGZ1cnRoZXIgaXMgcmVzb2x2ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3ltaW5kZXggYzsKLSAgYm9vbGVhbiAqZGVmaW5lZCA9IE5VTEw7Ci0gIGJvb2xlYW4gKmluY2x1ZGVkID0gTlVMTDsKLSAgY2Fyc3ltICpzeW1kZWZzOwotICBib29sZWFuIGxvb3A7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEtlZXAgdHJhY2sgb2YgYWxsIHN5bWJvbHMgd2Uga25vdyB0byBiZSBhbHJlYWR5IGRlZmluZWQsIGFuZCBhbGwKLSAgICAgZmlsZXMgd2Uga25vdyB0byBiZSBhbHJlYWR5IGluY2x1ZGVkLiAgVGhpcyBpcyB0byBzcGVlZCB1cCB0aGUKLSAgICAgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHBhc3Nlcy4gICovCi0gIGMgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50OwotICBpZiAoYyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBkZWZpbmVkID0gKGJvb2xlYW4gKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoYm9vbGVhbikpOwotICBpbmNsdWRlZCA9IChib29sZWFuICopIGJmZF9tYWxsb2MgKGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgaWYgKGRlZmluZWQgPT0gKGJvb2xlYW4gKikgTlVMTCB8fCBpbmNsdWRlZCA9PSAoYm9vbGVhbiAqKSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKGRlZmluZWQsIDAsIGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgbWVtc2V0IChpbmNsdWRlZCwgMCwgYyAqIHNpemVvZiAoYm9vbGVhbikpOwotCi0gIHN5bWRlZnMgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmczsKLQotICBkbwotICAgIHsKLSAgICAgIGZpbGVfcHRyIGxhc3Q7Ci0gICAgICBzeW1pbmRleCBpOwotICAgICAgY2Fyc3ltICpzeW1kZWY7Ci0gICAgICBjYXJzeW0gKnN5bWRlZmVuZDsKLQotICAgICAgbG9vcCA9IGZhbHNlOwotICAgICAgbGFzdCA9IC0xOwotCi0gICAgICBzeW1kZWYgPSBzeW1kZWZzOwotICAgICAgc3ltZGVmZW5kID0gc3ltZGVmICsgYzsKLSAgICAgIGZvciAoaSA9IDA7IHN5bWRlZiA8IHN5bWRlZmVuZDsgc3ltZGVmKyssIGkrKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIGJmZCAqZWxlbWVudDsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnNfdGFpbDsKLQkgIHN5bWluZGV4IG1hcms7Ci0KLQkgIGlmIChkZWZpbmVkW2ldIHx8IGluY2x1ZGVkW2ldKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChzeW1kZWYtPmZpbGVfb2Zmc2V0ID09IGxhc3QpCi0JICAgIHsKLQkgICAgICBpbmNsdWRlZFtpXSA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIHN5bWRlZi0+bmFtZSwKLQkJCQkgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGFyICpwLCAqY29weTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBkZWZhdWx0IHZlcnNpb24gKHRoZSBuYW1lIGNvbnRhaW5zIEBAKSwKLQkJIGxvb2sgdXAgdGhlIHN5bWJvbCBhZ2FpbiB3aXRob3V0IHRoZSB2ZXJzaW9uLiAgVGhlCi0JCSBlZmZlY3QgaXMgdGhhdCByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgd2l0aG91dCB0aGUKLQkJIHZlcnNpb24gd2lsbCBiZSBtYXRjaGVkIGJ5IHRoZSBkZWZhdWx0IHN5bWJvbCBpbiB0aGUKLQkJIGFyY2hpdmUuICAqLwotCi0JICAgICAgcCA9IHN0cmNociAoc3ltZGVmLT5uYW1lLCBFTEZfVkVSX0NIUik7Ci0JICAgICAgaWYgKHAgPT0gTlVMTCB8fCBwWzFdICE9IEVMRl9WRVJfQ0hSKQotCQljb250aW51ZTsKLQotCSAgICAgIGNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHAgLSBzeW1kZWYtPm5hbWUgKyAxKTsKLQkgICAgICBpZiAoY29weSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBtZW1jcHkgKGNvcHksIHN5bWRlZi0+bmFtZSwgcCAtIHN5bWRlZi0+bmFtZSk7Ci0JICAgICAgY29weVtwIC0gc3ltZGVmLT5uYW1lXSA9ICdcMCc7Ci0KLQkgICAgICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgY29weSwKLQkJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29weSk7Ci0JICAgIH0KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlkZWZpbmVkW2ldID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGluY2x1ZGUgdGhpcyBhcmNoaXZlIG1lbWJlci4gICovCi0KLQkgIGVsZW1lbnQgPSBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgc3ltZGVmLT5maWxlX29mZnNldCk7Ci0JICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIERvdWJsZWNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgaW5jbHVkZWQgdGhpcyBvYmplY3QKLQkgICAgIGFscmVhZHktLWl0IHNob3VsZCBiZSBpbXBvc3NpYmxlLCBidXQgdGhlcmUgbWF5IGJlCi0JICAgICBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgYXJjaGl2ZS4gICovCi0JICBpZiAoZWxlbWVudC0+YXJjaGl2ZV9wYXNzICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gMTsKLQotCSAgdW5kZWZzX3RhaWwgPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbDsKLQotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBlbGVtZW50LAotCQkJCQkJCSBzeW1kZWYtPm5hbWUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmICghIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoZWxlbWVudCwgaW5mbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBJZiB0aGVyZSBhcmUgYW55IG5ldyB1bmRlZmluZWQgc3ltYm9scywgd2UgbmVlZCB0byBtYWtlCi0JICAgICBhbm90aGVyIHBhc3MgdGhyb3VnaCB0aGUgYXJjaGl2ZSBpbiBvcmRlciB0byBzZWUgd2hldGhlcgotCSAgICAgdGhleSBjYW4gYmUgZGVmaW5lZC4gIEZJWE1FOiBUaGlzIGlzbid0IHBlcmZlY3QsIGJlY2F1c2UKLQkgICAgIGNvbW1vbiBzeW1ib2xzIHdpbmQgdXAgb24gdW5kZWZzX3RhaWwgYW5kIGJlY2F1c2UgYW4KLQkgICAgIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBsYXRlciBvbiBpbiB0aGlzIHBhc3MKLQkgICAgIGRvZXMgbm90IHJlcXVpcmUgYW5vdGhlciBwYXNzLiAgVGhpcyBpc24ndCBhIGJ1ZywgYnV0IGl0Ci0JICAgICBkb2VzIG1ha2UgdGhlIGNvZGUgbGVzcyBlZmZpY2llbnQgdGhhbiBpdCBjb3VsZCBiZS4gICovCi0JICBpZiAodW5kZWZzX3RhaWwgIT0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwpCi0JICAgIGxvb3AgPSB0cnVlOwotCi0JICAvKiBMb29rIGJhY2t3YXJkIHRvIG1hcmsgYWxsIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlCi0JICAgICB3aGljaCB3ZSBoYXZlIGFscmVhZHkgc2VlbiBpbiB0aGlzIHBhc3MuICAqLwotCSAgbWFyayA9IGk7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaW5jbHVkZWRbbWFya10gPSB0cnVlOwotCSAgICAgIGlmIChtYXJrID09IDApCi0JCWJyZWFrOwotCSAgICAgIC0tbWFyazsKLQkgICAgfQotCSAgd2hpbGUgKHN5bWRlZnNbbWFya10uZmlsZV9vZmZzZXQgPT0gc3ltZGVmLT5maWxlX29mZnNldCk7Ci0KLQkgIC8qIFdlIG1hcmsgc3Vic2VxdWVudCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBhcyB3ZSBnbwotCSAgICAgb24gdGhyb3VnaCB0aGUgbG9vcC4gICovCi0JICBsYXN0ID0gc3ltZGVmLT5maWxlX29mZnNldDsKLQl9Ci0gICAgfQotICB3aGlsZSAobG9vcCk7Ci0KLSAgZnJlZSAoZGVmaW5lZCk7Ci0gIGZyZWUgKGluY2x1ZGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGRlZmluZWQgIT0gKGJvb2xlYW4gKikgTlVMTCkKLSAgICBmcmVlIChkZWZpbmVkKTsKLSAgaWYgKGluY2x1ZGVkICE9IChib29sZWFuICopIE5VTEwpCi0gICAgZnJlZSAoaW5jbHVkZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBkZWZpbmUgYSBuZXcgc3ltYm9sLiAgSXQKLSAgIGhhbmRsZXMgdGhlIHZhcmlvdXMgY2FzZXMgd2hpY2ggYXJpc2Ugd2hlbiB3ZSBmaW5kIGEgZGVmaW5pdGlvbiBpbgotICAgYSBkeW5hbWljIG9iamVjdCwgb3Igd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgZGVmaW5pdGlvbiBpbiBhCi0gICBkeW5hbWljIG9iamVjdC4gIFRoZSBuZXcgc3ltYm9sIGlzIGRlc2NyaWJlZCBieSBOQU1FLCBTWU0sIFBTRUMsCi0gICBhbmQgUFZBTFVFLiAgV2Ugc2V0IFNZTV9IQVNIIHRvIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgV2Ugc2V0Ci0gICBPVkVSUklERSBpZiB0aGUgb2xkIHN5bWJvbCBpcyBvdmVycmlkaW5nIGEgbmV3IGRlZmluaXRpb24uICBXZSBzZXQKLSAgIFRZUEVfQ0hBTkdFX09LIGlmIGl0IGlzIE9LIGZvciB0aGUgdHlwZSB0byBjaGFuZ2UuICBXZSBzZXQKLSAgIFNJWkVfQ0hBTkdFX09LIGlmIGl0IGlzIE9LIGZvciB0aGUgc2l6ZSB0byBjaGFuZ2UuICBCeSBPSyB0bwotICAgY2hhbmdlLCB3ZSBtZWFuIHRoYXQgd2Ugc2hvdWxkbid0IHdhcm4gaWYgdGhlIHR5cGUgb3Igc2l6ZSBkb2VzCi0gICBjaGFuZ2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgbmFtZSwgc3ltLCBwc2VjLCBwdmFsdWUsIHN5bV9oYXNoLAotCQkgIG92ZXJyaWRlLCB0eXBlX2NoYW5nZV9vaywgc2l6ZV9jaGFuZ2Vfb2spCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgYXNlY3Rpb24gKipwc2VjOwotICAgICBiZmRfdm1hICpwdmFsdWU7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gICAgIGJvb2xlYW4gKm92ZXJyaWRlOwotICAgICBib29sZWFuICp0eXBlX2NoYW5nZV9vazsKLSAgICAgYm9vbGVhbiAqc2l6ZV9jaGFuZ2Vfb2s7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBpbnQgYmluZDsKLSAgYmZkICpvbGRiZmQ7Ci0gIGJvb2xlYW4gbmV3ZHluLCBvbGRkeW4sIG9sZGRlZiwgbmV3ZGVmLCBuZXdkeW5jb21tb24sIG9sZGR5bmNvbW1vbjsKLQotICAqb3ZlcnJpZGUgPSBmYWxzZTsKLQotICBzZWMgPSAqcHNlYzsKLSAgYmluZCA9IEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pOwotCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgZWxzZQotICAgIGggPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGZhbHNlLCBmYWxzZSkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKnN5bV9oYXNoID0gaDsKLQotICAvKiBUaGlzIGNvZGUgaXMgZm9yIGNvcGluZyB3aXRoIGR5bmFtaWMgb2JqZWN0cywgYW5kIGlzIG9ubHkgdXNlZnVsCi0gICAgIGlmIHdlIGFyZSBkb2luZyBhbiBFTEYgbGluay4gICovCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRm9yIG1lcmdpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCByZWFsIHN5bWJvbHMuICAqLwotCi0gIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotICAvKiBJZiB3ZSBqdXN0IGNyZWF0ZWQgdGhlIHN5bWJvbCwgbWFyayBpdCBhcyBiZWluZyBhbiBFTEYgc3ltYm9sLgotICAgICBPdGhlciB0aGFuIHRoYXQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8tLXRoZXJlIGlzIG5vIG1lcmdlIGlzc3VlCi0gICAgIHdpdGggYSBuZXdseSBkZWZpbmVkIHN5bWJvbC0tc28gd2UganVzdCByZXR1cm4uICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBPTERCRkQgaXMgYSBCRkQgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGlzdGluZyBzeW1ib2wuICAqLwotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgb2xkYmZkID0gTlVMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgb2xkYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgb2xkYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm93bmVyOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEluIGNhc2VzIGludm9sdmluZyB3ZWFrIHZlcnNpb25lZCBzeW1ib2xzLCB3ZSBtYXkgd2luZCB1cCB0cnlpbmcKLSAgICAgdG8gbWVyZ2UgYSBzeW1ib2wgd2l0aCBpdHNlbGYuICBDYXRjaCB0aGF0IGhlcmUsIHRvIGF2b2lkIHRoZQotICAgICBjb25mdXNpb24gdGhhdCByZXN1bHRzIGlmIHdlIHRyeSB0byBvdmVycmlkZSBhIHN5bWJvbCB3aXRoCi0gICAgIGl0c2VsZi4gIFRoZSBhZGRpdGlvbmFsIHRlc3RzIGNhdGNoIGNhc2VzIGxpa2UKLSAgICAgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCB3aGljaCBhcmUgcmVndWxhciBzeW1ib2xzIGRlZmluZWQgaW4gYQotICAgICBkeW5hbWljIG9iamVjdCwgd2hpY2ggd2UgZG8gd2FudCB0byBoYW5kbGUgaGVyZS4gICovCi0gIGlmIChhYmZkID09IG9sZGJmZAotICAgICAgJiYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDAKLQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTkVXRFlOIGFuZCBPTEREWU4gaW5kaWNhdGUgd2hldGhlciB0aGUgbmV3IG9yIG9sZCBzeW1ib2wsCi0gICAgIHJlc3BlY3RpdmVseSwgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICBuZXdkeW4gPSB0cnVlOwotICBlbHNlCi0gICAgbmV3ZHluID0gZmFsc2U7Ci0KLSAgaWYgKG9sZGJmZCAhPSBOVUxMKQotICAgIG9sZGR5biA9IChvbGRiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpoc2VjOwotCi0gICAgICAvKiBUaGlzIGNvZGUgaGFuZGxlcyB0aGUgc3BlY2lhbCBTSE5fTUlQU197VEVYVCxEQVRBfSBzZWN0aW9uCi0gICAgICAgICBpbmRpY2VzIHVzZWQgYnkgTUlQUyBFTEYuICAqLwotICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBoc2VjID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgaHNlYyA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChoc2VjID09IE5VTEwpCi0Jb2xkZHluID0gZmFsc2U7Ci0gICAgICBlbHNlCi0Jb2xkZHluID0gKGhzZWMtPnN5bWJvbC0+ZmxhZ3MgJiBCU0ZfRFlOQU1JQykgIT0gMDsKLSAgICB9Ci0KLSAgLyogTkVXREVGIGFuZCBPTERERUYgaW5kaWNhdGUgd2hldGhlciB0aGUgbmV3IG9yIG9sZCBzeW1ib2wsCi0gICAgIHJlc3BlY3RpdmVseSwgYXBwZWFyIHRvIGJlIGEgZGVmaW5pdGlvbiByYXRoZXIgdGhhbiByZWZlcmVuY2UuICAqLwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotICAgIG5ld2RlZiA9IGZhbHNlOwotICBlbHNlCi0gICAgbmV3ZGVmID0gdHJ1ZTsKLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICBvbGRkZWYgPSBmYWxzZTsKLSAgZWxzZQotICAgIG9sZGRlZiA9IHRydWU7Ci0KLSAgLyogTkVXRFlOQ09NTU9OIGFuZCBPTEREWU5DT01NT04gaW5kaWNhdGUgd2hldGhlciB0aGUgbmV3IG9yIG9sZAotICAgICBzeW1ib2wsIHJlc3BlY3RpdmVseSwgYXBwZWFycyB0byBiZSBhIGNvbW1vbiBzeW1ib2wgaW4gYSBkeW5hbWljCi0gICAgIG9iamVjdC4gIElmIGEgc3ltYm9sIGFwcGVhcnMgaW4gYW4gdW5pbml0aWFsaXplZCBzZWN0aW9uLCBhbmQgaXMKLSAgICAgbm90IHdlYWssIGFuZCBpcyBub3QgYSBmdW5jdGlvbiwgdGhlbiBpdCBtYXkgYmUgYSBjb21tb24gc3ltYm9sCi0gICAgIHdoaWNoIHdhcyByZXNvbHZlZCB3aGVuIHRoZSBkeW5hbWljIG9iamVjdCB3YXMgY3JlYXRlZC4gIFdlIHdhbnQKLSAgICAgdG8gdHJlYXQgc3VjaCBzeW1ib2xzIHNwZWNpYWxseSwgYmVjYXVzZSB0aGV5IHJhaXNlIHNwZWNpYWwKLSAgICAgY29uc2lkZXJhdGlvbnMgd2hlbiBzZXR0aW5nIHRoZSBzeW1ib2wgc2l6ZTogaWYgdGhlIHN5bWJvbAotICAgICBhcHBlYXJzIGFzIGEgY29tbW9uIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0LCBhbmQgdGhlIHNpemUgaW4KLSAgICAgdGhlIHJlZ3VsYXIgb2JqZWN0IGlzIGxhcmdlciwgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSB1c2UgdGhlCi0gICAgIGxhcmdlciBzaXplLiAgVGhpcyBwcm9ibGVtYXRpYyBjYXNlIGNhbiBhbHdheXMgYmUgYXZvaWRlZCBpbiBDLAotICAgICBidXQgaXQgbXVzdCBiZSBoYW5kbGVkIGNvcnJlY3RseSB3aGVuIHVzaW5nIEZvcnRyYW4gc2hhcmVkCi0gICAgIGxpYnJhcmllcy4KLQotICAgICBOb3RlIHRoYXQgaWYgTkVXRFlOQ09NTU9OIGlzIHNldCwgTkVXREVGIHdpbGwgYmUgc2V0LCBhbmQKLSAgICAgbGlrZXdpc2UgZm9yIE9MRERZTkNPTU1PTiBhbmQgT0xEREVGLgotCi0gICAgIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMganVzdCBhIGhldXJpc3RpYywgYW5kIHRoYXQgaXQgaXMgcXVpdGUKLSAgICAgcG9zc2libGUgdG8gaGF2ZSBhbiB1bmluaXRpYWxpemVkIHN5bWJvbCBpbiBhIHNoYXJlZCBvYmplY3Qgd2hpY2gKLSAgICAgaXMgcmVhbGx5IGEgZGVmaW5pdGlvbiwgcmF0aGVyIHRoYW4gYSBjb21tb24gc3ltYm9sLiAgVGhpcyBjb3VsZAotICAgICBsZWFkIHRvIHNvbWUgbWlub3IgY29uZnVzaW9uIHdoZW4gdGhlIHN5bWJvbCByZWFsbHkgaXMgYSBjb21tb24KLSAgICAgc3ltYm9sIGluIHNvbWUgcmVndWxhciBvYmplY3QuICBIb3dldmVyLCBJIHRoaW5rIGl0IHdpbGwgYmUKLSAgICAgaGFybWxlc3MuICAqLwotCi0gIGlmIChuZXdkeW4KLSAgICAgICYmIG5ld2RlZgotICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0xPQUQpID09IDAKLSAgICAgICYmIHN5bS0+c3Rfc2l6ZSA+IDAKLSAgICAgICYmIGJpbmQgIT0gU1RCX1dFQUsKLSAgICAgICYmIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9GVU5DKQotICAgIG5ld2R5bmNvbW1vbiA9IHRydWU7Ci0gIGVsc2UKLSAgICBuZXdkeW5jb21tb24gPSBmYWxzZTsKLQotICBpZiAob2xkZHluCi0gICAgICAmJiBvbGRkZWYKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLSAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDAKLSAgICAgICYmIGgtPnNpemUgPiAwCi0gICAgICAmJiBoLT50eXBlICE9IFNUVF9GVU5DKQotICAgIG9sZGR5bmNvbW1vbiA9IHRydWU7Ci0gIGVsc2UKLSAgICBvbGRkeW5jb21tb24gPSBmYWxzZTsKLQotICAvKiBJdCdzIE9LIHRvIGNoYW5nZSB0aGUgdHlwZSBpZiBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBvciB0aGUKLSAgICAgbmV3IHN5bWJvbCBpcyB3ZWFrLiAgKi8KLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0gICAgICB8fCBiaW5kID09IFNUQl9XRUFLKQotICAgICp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgLyogSXQncyBPSyB0byBjaGFuZ2UgdGhlIHNpemUgaWYgZWl0aGVyIHRoZSBleGlzdGluZyBzeW1ib2wgb3IgdGhlCi0gICAgIG5ldyBzeW1ib2wgaXMgd2Vhaywgb3IgaWYgdGhlIG9sZCBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgKi8KLQotICBpZiAoKnR5cGVfY2hhbmdlX29rCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0gICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAvKiBJZiBib3RoIHRoZSBvbGQgYW5kIHRoZSBuZXcgc3ltYm9scyBsb29rIGxpa2UgY29tbW9uIHN5bWJvbHMgaW4gYQotICAgICBkeW5hbWljIG9iamVjdCwgc2V0IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdG8gdGhlIGxhcmdlciBvZiB0aGUKLSAgICAgdHdvLiAgKi8KLQotICBpZiAob2xkZHluY29tbW9uCi0gICAgICAmJiBuZXdkeW5jb21tb24KLSAgICAgICYmIHN5bS0+c3Rfc2l6ZSAhPSBoLT5zaXplKQotICAgIHsKLSAgICAgIC8qIFNpbmNlIHdlIHRoaW5rIHdlIGhhdmUgdHdvIGNvbW1vbiBzeW1ib2xzLCBpc3N1ZSBhIG11bHRpcGxlCi0gICAgICAgICBjb21tb24gd2FybmluZyBpZiBkZXNpcmVkLiAgTm90ZSB0aGF0IHdlIG9ubHkgd2FybiBpZiB0aGUKLSAgICAgICAgIHNpemUgaXMgZGlmZmVyZW50LiAgSWYgdGhlIHNpemUgaXMgdGhlIHNhbWUsIHdlIHNpbXBseSBsZXQKLSAgICAgICAgIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlIHRoZSBuZXcgb25lIGFzIG5vcm1hbGx5IGhhcHBlbnMgd2l0aAotICAgICAgICAgc3ltYm9scyBkZWZpbmVkIGluIGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIG9sZGJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sCi0JICAgICAgaC0+c2l6ZSwgYWJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHN5bS0+c3Rfc2l6ZSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHN5bS0+c3Rfc2l6ZSA+IGgtPnNpemUpCi0JaC0+c2l6ZSA9IHN5bS0+c3Rfc2l6ZTsKLQotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGxvb2tpbmcgYXQgYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGhhdmUgZm91bmQgYQotICAgICBkZWZpbml0aW9uLCB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgc3ltYm9sIHdhcyBhbHJlYWR5IGRlZmluZWQgYnkKLSAgICAgc29tZSBvdGhlciBvYmplY3QuICBJZiBzbywgd2Ugd2FudCB0byB1c2UgdGhlIGV4aXN0aW5nCi0gICAgIGRlZmluaXRpb24sIGFuZCB3ZSBkbyBub3Qgd2FudCB0byByZXBvcnQgYSBtdWx0aXBsZSBzeW1ib2wKLSAgICAgZGVmaW5pdGlvbiBlcnJvcjsgd2UgZG8gdGhpcyBieSBjbG9iYmVyaW5nICpQU0VDIHRvIGJlCi0gICAgIGJmZF91bmRfc2VjdGlvbl9wdHIuCi0KLSAgICAgV2UgdHJlYXQgYSBjb21tb24gc3ltYm9sIGFzIGEgZGVmaW5pdGlvbiBpZiB0aGUgc3ltYm9sIGluIHRoZQotICAgICBzaGFyZWQgbGlicmFyeSBpcyBhIGZ1bmN0aW9uLCBzaW5jZSBjb21tb24gc3ltYm9scyBhbHdheXMKLSAgICAgcmVwcmVzZW50IHZhcmlhYmxlczsgdGhpcyBjYW4gY2F1c2UgY29uZnVzaW9uIGluIHByaW5jaXBsZSwgYnV0Ci0gICAgIGFueSBzdWNoIGNvbmZ1c2lvbiB3b3VsZCBzZWVtIHRvIGluZGljYXRlIGFuIGVycm9uZW91cyBwcm9ncmFtIG9yCi0gICAgIHNoYXJlZCBsaWJyYXJ5LiAgV2UgYWxzbyBwZXJtaXQgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhcgotICAgICBvYmplY3QgdG8gb3ZlcnJpZGUgYSB3ZWFrIHN5bWJvbCBpbiBhIHNoYXJlZCBvYmplY3QuCi0KLSAgICAgV2UgcHJlZmVyIGEgbm9uLXdlYWsgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZCBsaWJyYXJ5IHRvIGEgd2VhawotICAgICBkZWZpbml0aW9uIGluIHRoZSBleGVjdXRhYmxlLiAgKi8KLQotICBpZiAobmV3ZHluCi0gICAgICAmJiBuZXdkZWYKLSAgICAgICYmIChvbGRkZWYKLQkgIHx8IChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiAoYmluZCA9PSBTVEJfV0VBSwotCQkgIHx8IEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9GVU5DKSkpCi0gICAgICAmJiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCSAgfHwgYmluZCA9PSBTVEJfV0VBSykpCi0gICAgewotICAgICAgKm92ZXJyaWRlID0gdHJ1ZTsKLSAgICAgIG5ld2RlZiA9IGZhbHNlOwotICAgICAgbmV3ZHluY29tbW9uID0gZmFsc2U7Ci0KLSAgICAgICpwc2VjID0gc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIC8qIElmIHdlIGdldCBoZXJlIHdoZW4gdGhlIG9sZCBzeW1ib2wgaXMgYSBjb21tb24gc3ltYm9sLCB0aGVuCi0gICAgICAgICB3ZSBhcmUgZXhwbGljaXRseSBsZXR0aW5nIGl0IG92ZXJyaWRlIGEgd2VhayBzeW1ib2wgb3IKLSAgICAgICAgIGZ1bmN0aW9uIGluIGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBkb24ndCB3YW50IHRvIHdhcm4gYWJvdXQKLSAgICAgICAgIGEgdHlwZSBjaGFuZ2UuICBJZiB0aGUgb2xkIHN5bWJvbCBpcyBhIGRlZmluZWQgc3ltYm9sLCBhIHR5cGUKLSAgICAgICAgIGNoYW5nZSB3YXJuaW5nIG1heSBzdGlsbCBiZSBhcHByb3ByaWF0ZS4gICovCi0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JKnR5cGVfY2hhbmdlX29rID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYW4gb2xkIGNvbW1vbiBzeW1ib2wgbWVyZ2luZyB3aXRoIGEKLSAgICAgbmV3IHN5bWJvbCB3aGljaCBsb29rcyBsaWtlIGEgY29tbW9uIHN5bWJvbCBpbiBhIHNoYXJlZCBvYmplY3QuCi0gICAgIFdlIGNoYW5nZSAqUFNFQyBhbmQgKlBWQUxVRSB0byBtYWtlIHRoZSBuZXcgc3ltYm9sIGxvb2sgbGlrZSBhCi0gICAgIGNvbW1vbiBzeW1ib2wsIGFuZCBsZXQgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgd2lsbCBkbwotICAgICB0aGUgcmlnaHQgdGhpbmcuICAqLwotCi0gIGlmIChuZXdkeW5jb21tb24KLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICB7Ci0gICAgICAqb3ZlcnJpZGUgPSB0cnVlOwotICAgICAgbmV3ZGVmID0gZmFsc2U7Ci0gICAgICBuZXdkeW5jb21tb24gPSBmYWxzZTsKLSAgICAgICpwdmFsdWUgPSBzeW0tPnN0X3NpemU7Ci0gICAgICAqcHNlYyA9IHNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGUgb2xkIHN5bWJvbCBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QsIGFuZCB0aGUgbmV3IHN5bWJvbCBpcwotICAgICBhIGRlZmluaXRpb24gd2hpY2ggaXMgbm90IGZyb20gYSBkeW5hbWljIG9iamVjdCwgdGhlbiB0aGUgbmV3Ci0gICAgIHN5bWJvbCBvdmVycmlkZXMgdGhlIG9sZCBzeW1ib2wuICBTeW1ib2xzIGZyb20gcmVndWxhciBmaWxlcwotICAgICBhbHdheXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgc3ltYm9scyBmcm9tIGR5bmFtaWMgb2JqZWN0cywgZXZlbiBpZgotICAgICB0aGV5IGFyZSBkZWZpbmVkIGFmdGVyIHRoZSBkeW5hbWljIG9iamVjdCBpbiB0aGUgbGluay4KLQotICAgICBBcyBhYm92ZSwgd2UgYWdhaW4gcGVybWl0IGEgY29tbW9uIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IHRvCi0gICAgIG92ZXJyaWRlIGEgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZCBvYmplY3QgaWYgdGhlIHNoYXJlZCBvYmplY3QKLSAgICAgc3ltYm9sIGlzIGEgZnVuY3Rpb24gb3IgaXMgd2Vhay4KLQotICAgICBBcyBhYm92ZSwgd2UgcGVybWl0IGEgbm9uLXdlYWsgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZCBvYmplY3QgdG8KLSAgICAgb3ZlcnJpZGUgYSB3ZWFrIGRlZmluaXRpb24gaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0KLSAgaWYgKCEgbmV3ZHluCi0gICAgICAmJiAobmV3ZGVmCi0JICB8fCAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICB8fCBoLT50eXBlID09IFNUVF9GVU5DKSkpCi0gICAgICAmJiBvbGRkeW4KLSAgICAgICYmIG9sZGRlZgotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoYmluZCAhPSBTVEJfV0VBSwotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgLyogQ2hhbmdlIHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIHVuZGVmaW5lZCwgYW5kIGxldAotCSBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCBkbyB0aGUgcmlnaHQgdGhpbmcgd2l0aCB0aGUKLQkgbmV3IGRlZmluaXRpb24uICAqLwotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIG9sZGRlZiA9IGZhbHNlOwotICAgICAgb2xkZHluY29tbW9uID0gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIGFnYWluIHBlcm1pdCBhIHR5cGUgY2hhbmdlIHdoZW4gYSBjb21tb24gc3ltYm9sIG1heSBiZQotICAgICAgICAgb3ZlcnJpZGluZyBhIGZ1bmN0aW9uLiAgKi8KLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQkqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gICAgICAvKiBUaGlzIHVuaW9uIG1heSBoYXZlIGJlZW4gc2V0IHRvIGJlIG5vbi1OVUxMIHdoZW4gdGhpcyBzeW1ib2wKLQkgd2FzIHNlZW4gaW4gYSBkeW5hbWljIG9iamVjdC4gIFdlIG11c3QgZm9yY2UgdGhlIHVuaW9uIHRvIGJlCi0JIE5VTEwsIHNvIHRoYXQgaXQgaXMgY29ycmVjdCBmb3IgYSByZWd1bGFyIHN5bWJvbC4gICovCi0KLSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IE5VTEw7Ci0KLSAgICAgIC8qIEluIHRoaXMgc3BlY2lhbCBjYXNlLCBpZiBIIGlzIHRoZSB0YXJnZXQgb2YgYW4gaW5kaXJlY3Rpb24sCi0gICAgICAgICB3ZSB3YW50IHRoZSBjYWxsZXIgdG8gZnJvYiB3aXRoIEggcmF0aGVyIHRoYW4gd2l0aCB0aGUKLSAgICAgICAgIGluZGlyZWN0IHN5bWJvbC4gIFRoYXQgd2lsbCBwZXJtaXQgdGhlIGNhbGxlciB0byByZWRlZmluZSB0aGUKLSAgICAgICAgIHRhcmdldCBvZiB0aGUgaW5kaXJlY3Rpb24sIHJhdGhlciB0aGFuIHRoZSBpbmRpcmVjdCBzeW1ib2wKLSAgICAgICAgIGl0c2VsZi4gIEZJWE1FOiBUaGlzIHdpbGwgYnJlYWsgdGhlIC15IG9wdGlvbiBpZiB3ZSBzdG9yZSBhCi0gICAgICAgICBzeW1ib2wgd2l0aCBhIGRpZmZlcmVudCBuYW1lLiAgKi8KLSAgICAgICpzeW1faGFzaCA9IGg7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbmV3IGNvbW1vbiBzeW1ib2wgbWVyZ2luZyB3aXRoIGFuCi0gICAgIG9sZCBzeW1ib2wgdGhhdCBsb29rcyBsaWtlIGl0IG1pZ2h0IGJlIGEgY29tbW9uIHN5bWJvbCBkZWZpbmVkIGluCi0gICAgIGEgc2hhcmVkIG9iamVjdC4gIE5vdGUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGUgY2FzZSBpbgotICAgICB3aGljaCBhIG5ldyBjb21tb24gc3ltYm9sIHNob3VsZCBzaW1wbHkgb3ZlcnJpZGUgdGhlIGRlZmluaXRpb24KLSAgICAgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotICBpZiAoISBuZXdkeW4KLSAgICAgICYmIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKQotICAgICAgJiYgb2xkZHluY29tbW9uKQotICAgIHsKLSAgICAgIC8qIEl0IHdvdWxkIGJlIGJlc3QgaWYgd2UgY291bGQgc2V0IHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIGEKLQkgY29tbW9uIHN5bWJvbCwgYnV0IHdlIGRvbid0IGtub3cgd2hhdCB0byB1c2UgZm9yIHRoZSBzZWN0aW9uCi0JIG9yIHRoZSBhbGlnbm1lbnQuICAqLwotICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgb2xkYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwKLQkgICAgICBoLT5zaXplLCBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc3ltLT5zdF9zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGUgcHJlZHVtZWQgY29tbW9uIHN5bWJvbCBpbiB0aGUgZHluYW1pYyBvYmplY3QgaXMKLSAgICAgICAgIGxhcmdlciwgcHJldGVuZCB0aGF0IHRoZSBuZXcgc3ltYm9sIGhhcyBpdHMgc2l6ZS4gICovCi0KLSAgICAgIGlmIChoLT5zaXplID4gKnB2YWx1ZSkKLQkqcHZhbHVlID0gaC0+c2l6ZTsKLQotICAgICAgLyogRklYTUU6IFdlIG5vIGxvbmdlciBrbm93IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgdGhlIHN5bWJvbAotCSBpbiB0aGUgZHluYW1pYyBvYmplY3QsIHNvIHdlIGp1c3Qgd2luZCB1cCB1c2luZyB0aGUgb25lIGZyb20KLQkgdGhlIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLQotICAgICAgb2xkZGVmID0gZmFsc2U7Ci0gICAgICBvbGRkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0gICAgICBoLT5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0KLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgICAqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSBOVUxMOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIHdlYWsgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0Ci0gICAgIGZvbGxvd2VkIGJ5IGEgbm9uLXdlYWsgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZCBvYmplY3QuICBJbiB0aGlzCi0gICAgIGNhc2UsIHdlIHByZWZlciB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgc2hhcmVkIG9iamVjdC4gICovCi0gIGlmIChvbGRkZWYKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgICYmIG5ld2RlZgotICAgICAgJiYgbmV3ZHluCi0gICAgICAmJiBiaW5kICE9IFNUQl9XRUFLKQotICAgIHsKLSAgICAgIC8qIFRvIG1ha2UgdGhpcyB3b3JrIHdlIGhhdmUgdG8gZnJvYiB0aGUgZmxhZ3Mgc28gdGhhdCB0aGUgcmVzdAotICAgICAgICAgb2YgdGhlIGNvZGUgZG9lcyBub3QgdGhpbmsgd2UgYXJlIHVzaW5nIHRoZSByZWd1bGFyCi0gICAgICAgICBkZWZpbml0aW9uLiAgKi8KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOwotICAgICAgZWxzZSBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgotCQkJCSAgIHwgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyk7Ci0KLSAgICAgIC8qIElmIEggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdGlvbiwgd2Ugd2FudCB0aGUgY2FsbGVyIHRvCi0gICAgICAgICB1c2UgSCByYXRoZXIgdGhhbiB0aGUgaW5kaXJlY3Qgc3ltYm9sLiAgT3RoZXJ3aXNlIGlmIHdlIGFyZQotICAgICAgICAgZGVmaW5pbmcgYSBuZXcgaW5kaXJlY3Qgc3ltYm9sIHdlIHdpbGwgd2luZCB1cCBhdHRhY2hpbmcgaXQKLSAgICAgICAgIHRvIHRoZSBlbnRyeSB3ZSBhcmUgb3ZlcnJpZGluZy4gICovCi0gICAgICAqc3ltX2hhc2ggPSBoOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIG5vbi13ZWFrIGRlZmluaXRpb24gaW4gYSBzaGFyZWQKLSAgICAgb2JqZWN0IGZvbGxvd2VkIGJ5IGEgd2VhayBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QuICBJbgotICAgICB0aGlzIGNhc2Ugd2UgcHJlZmVyIHRvIGRlZmluaXRpb24gaW4gdGhlIHNoYXJlZCBvYmplY3QuICBUbyBtYWtlCi0gICAgIHRoaXMgd29yayB3ZSBoYXZlIHRvIHRlbGwgdGhlIGNhbGxlciB0byBub3QgdHJlYXQgdGhlIG5ldyBzeW1ib2wKLSAgICAgYXMgYSBkZWZpbml0aW9uLiAgKi8KLSAgaWYgKG9sZGRlZgotICAgICAgJiYgb2xkZHluCi0gICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICAmJiBuZXdkZWYKLSAgICAgICYmICEgbmV3ZHluCi0gICAgICAmJiBiaW5kID09IFNUQl9XRUFLKQotICAgICpvdmVycmlkZSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gRUxGIG9iamVjdCBmaWxlIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gKCphZGRfc3ltYm9sX2hvb2spIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkJCQkgICAgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLAotCQkJCSAgICAgIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLSAgYm9vbGVhbiAoKmNoZWNrX3JlbG9jcykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgYXNlY3Rpb24gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotICBib29sZWFuIGNvbGxlY3Q7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIHNpemVfdCBzeW1jb3VudDsKLSAgc2l6ZV90IGV4dHN5bWNvdW50OwotICBzaXplX3QgZXh0c3ltb2ZmOwotICBFbGZfRXh0ZXJuYWxfU3ltICpidWYgPSBOVUxMOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBib29sZWFuIGR5bmFtaWM7Ci0gIGJmZF9ieXRlICpkeW52ZXIgPSBOVUxMOwotICBFbGZfRXh0ZXJuYWxfVmVyc3ltICpleHR2ZXJzeW0gPSBOVUxMOwotICBFbGZfRXh0ZXJuYWxfVmVyc3ltICpldmVyOwotICBFbGZfRXh0ZXJuYWxfRHluICpkeW5idWYgPSBOVUxMOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqd2Vha3M7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW07Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW1lbmQ7Ci0KLSAgYWRkX3N5bWJvbF9ob29rID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYWRkX3N5bWJvbF9ob29rOwotICBjb2xsZWN0ID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0OwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIGR5bmFtaWMgPSBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGR5bmFtaWMgPSB0cnVlOwotCi0gICAgICAvKiBZb3UgY2FuJ3QgdXNlIC1yIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gIEFsc28sIHRoZXJlJ3Mgbm8KLQkgaG9wZSBvZiB1c2luZyBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoIGRvZXMgbm90IGV4YWN0bHkgbWF0Y2gKLQkgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSB8fCBpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBhbnkgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIG5hbWVkCi0gICAgIC5nbnUud2FybmluZy5TWU1CT0wgYXJlIHRyZWF0ZWQgYXMgd2FybmluZyBzeW1ib2xzIGZvciB0aGUgZ2l2ZW4KLSAgICAgc3ltYm9sLiAgVGhpcyBkaWZmZXJzIGZyb20gLmdudS53YXJuaW5nIHNlY3Rpb25zLCB3aGljaCBnZW5lcmF0ZQotICAgICB3YXJuaW5ncyB3aGVuIHRoZXkgYXJlIGluY2x1ZGVkIGluIGFuIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpOwotCSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDApCi0JICAgIHsKLQkgICAgICBjaGFyICptc2c7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzejsKLQotCSAgICAgIG5hbWUgKz0gc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDE7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2hhcmVkIG9iamVjdCwgdGhlbiBsb29rIHVwIHRoZSBzeW1ib2wKLQkJIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgaXQgaXMgdGhlcmUsIGFuZCBpdCBpcyBhbHJlYWR5Ci0JCSBiZWVuIGRlZmluZWQsIHRoZW4gd2Ugd2lsbCBub3QgYmUgdXNpbmcgdGhlIGVudHJ5Ci0JCSBmcm9tIHRoaXMgc2hhcmVkIG9iamVjdCwgc28gd2UgZG9uJ3QgbmVlZCB0byB3YXJuLgotCQkgRklYTUU6IElmIHdlIHNlZSB0aGUgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0Ci0JCSBsYXRlciBvbiwgd2Ugd2lsbCB3YXJuLCBidXQgd2Ugc2hvdWxkbid0LiAgVGhlIG9ubHkKLQkJIGZpeCBpcyB0byBrZWVwIHRyYWNrIG9mIHdoYXQgd2FybmluZ3Mgd2UgYXJlIHN1cHBvc2VkCi0JCSB0byBlbWl0LCBhbmQgdGhlbiBoYW5kbGUgdGhlbSBhbGwgYXQgdGhlIGVuZCBvZiB0aGUKLQkJIGxpbmsuICAqLwotCSAgICAgIGlmIChkeW5hbWljICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLQkJewotCQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JCSAgLyogRklYTUU6IFdoYXQgYWJvdXQgYmZkX2xpbmtfaGFzaF9jb21tb24/ICAqLwotCQkgIGlmIChoICE9IE5VTEwKLQkJICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaXNzdWUgdGhpcyB3YXJuaW5nLiAgQ2xvYmJlcgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZWN0aW9uIHNpemUgc28gdGhhdCB0aGUgd2FybmluZyBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCQkgICAgICBzLT5fcmF3X3NpemUgPSAwOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3ogPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzKTsKLQkgICAgICBtc2cgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN6ICsgMSk7Ci0JICAgICAgaWYgKG1zZyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgbXNnLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBtc2dbc3pdID0gJ1wwJzsKLQotCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBCU0ZfV0FSTklORywgcywgKGJmZF92bWEpIDAsIG1zZywKLQkJICAgICAgZmFsc2UsIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJewotCQkgIC8qIENsb2JiZXIgdGhlIHNlY3Rpb24gc2l6ZSBzbyB0aGF0IHRoZSB3YXJuaW5nIGRvZXMKLSAgICAgICAgICAgICAgICAgICAgIG5vdCBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJICBzLT5fcmF3X3NpemUgPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIG9iamVjdCwgd2UgYWx3YXlzIGxpbmsgYWdhaW5zdCB0aGUgLmR5bnN5bQotICAgICBzeW1ib2wgdGFibGUsIG5vdCB0aGUgLnN5bXRhYiBzeW1ib2wgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIKLSAgICAgd2lsbCBvbmx5IHNlZSB0aGUgLmR5bnN5bSBzeW1ib2wgdGFibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwotICAgICBsb29rIGF0IC5zeW10YWIgZm9yIGEgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIGlmICghIGR5bmFtaWMgfHwgZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZWxzZQotICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIC8qIFJlYWQgaW4gYW55IHZlcnNpb24gZGVmaW5pdGlvbnMuICAqLwotCi0gICAgICBpZiAoISBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFJlYWQgaW4gdGhlIHN5bWJvbCB2ZXJzaW9ucywgYnV0IGRvbid0IGJvdGhlciB0byBjb252ZXJ0IHRoZW0KLSAgICAgICAgIHRvIGludGVybmFsIGZvcm1hdC4gICovCi0gICAgICBpZiAoZWxmX2R5bnZlcnN5bSAoYWJmZCkgIT0gMCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqdmVyc3ltaGRyOwotCi0JICB2ZXJzeW1oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX2hkcjsKLQkgIGV4dHZlcnN5bSA9IChFbGZfRXh0ZXJuYWxfVmVyc3ltICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0JICBpZiAoZXh0dmVyc3ltID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCB2ZXJzeW1oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKChQVFIpIGV4dHZlcnN5bSwgMSwgdmVyc3ltaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICE9IHZlcnN5bWhkci0+c2hfc2l6ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW10YWIgaGVhZGVyIHRlbGxzIHVzIHdoZXJlIHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzIHN0YXJ0LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbG9jYWwgc3ltYm9scyBhdAotICAgICB0aGlzIHBvaW50LiAgKi8KLSAgaWYgKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHRzeW1jb3VudCA9IHN5bWNvdW50OwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRzeW1jb3VudCA9IHN5bWNvdW50IC0gaGRyLT5zaF9pbmZvOwotICAgICAgZXh0c3ltb2ZmID0gaGRyLT5zaF9pbmZvOwotICAgIH0KLQotICBidWYgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkgYmZkX21hbGxvYyAoZXh0c3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGlmIChidWYgPT0gTlVMTCAmJiBleHRzeW1jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeSBmb3IgZWFjaCBleHRlcm5hbAotICAgICBzeW1ib2wuICAqLwotICBzeW1faGFzaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIGV4dHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotICBpZiAoc3ltX2hhc2ggPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgZWxmX3N5bV9oYXNoZXMgKGFiZmQpID0gc3ltX2hhc2g7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgY3JlYXRlIGFsbCB0aGUgZHluYW1pYwotICAgICAgICAgc2VjdGlvbnMgaW1tZWRpYXRlbHkuICBXZSBuZWVkIHRvIGF0dGFjaCB0aGVtIHRvIHNvbWV0aGluZywKLSAgICAgICAgIHNvIHdlIGF0dGFjaCB0aGVtIHRvIHRoaXMgQkZELCBwcm92aWRlZCBpdCBpcyB0aGUgcmlnaHQKLSAgICAgICAgIGZvcm1hdC4gIEZJWE1FOiBJZiB0aGVyZSBhcmUgbm8gaW5wdXQgQkZEJ3Mgb2YgdGhlIHNhbWUKLSAgICAgICAgIGZvcm1hdCBhcyB0aGUgb3V0cHV0LCB3ZSBjYW4ndCBtYWtlIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotCXsKLQkgIGlmICghIGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgYm9vbGVhbiBhZGRfbmVlZGVkOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZF9zaXplX3R5cGUgb2xkc2l6ZTsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3RyaW5kZXg7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIG5hbWUgdG8gdXNlIGluIGEgRFRfTkVFREVEIGVudHJ5IHRoYXQgcmVmZXJzIHRvIHRoaXMKLQkgb2JqZWN0LiAgSWYgdGhlIG9iamVjdCBoYXMgYSBEVF9TT05BTUUgZW50cnksIHdlIHVzZSBpdC4KLQkgT3RoZXJ3aXNlLCBpZiB0aGUgZ2VuZXJpYyBsaW5rZXIgc3R1Y2sgc29tZXRoaW5nIGluCi0JIGVsZl9kdF9uYW1lLCB3ZSB1c2UgdGhhdC4gIE90aGVyd2lzZSwgd2UganVzdCB1c2UgdGhlIGZpbGUKLQkgbmFtZS4gIElmIHRoZSBnZW5lcmljIGxpbmtlciBwdXQgYSBudWxsIHN0cmluZyBpbnRvCi0JIGVsZl9kdF9uYW1lLCB3ZSBkb24ndCBtYWtlIGEgRFRfTkVFREVEIGVudHJ5IGF0IGFsbCwgZXZlbiBpZgotCSB0aGVyZSBpcyBhIERUX1NPTkFNRSBlbnRyeS4gICovCi0gICAgICBhZGRfbmVlZGVkID0gdHJ1ZTsKLSAgICAgIG5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICAgIGlmIChlbGZfZHRfbmFtZSAoYWJmZCkgIT0gTlVMTCkKLQl7Ci0JICBuYW1lID0gZWxmX2R0X25hbWUgKGFiZmQpOwotCSAgaWYgKCpuYW1lID09ICdcMCcpCi0JICAgIGFkZF9uZWVkZWQgPSBmYWxzZTsKLQl9Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfRHluICpleHRkeW47Ci0JICBFbGZfRXh0ZXJuYWxfRHluICpleHRkeW5lbmQ7Ci0JICBpbnQgZWxmc2VjOwotCSAgdW5zaWduZWQgbG9uZyBsaW5rOwotCi0JICBkeW5idWYgPSAoRWxmX0V4dGVybmFsX0R5biAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotCSAgaWYgKGR5bmJ1ZiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCAoUFRSKSBkeW5idWYsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBzLT5fcmF3X3NpemUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLQkgIGlmIChlbGZzZWMgPT0gLTEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbGluayA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbZWxmc2VjXS0+c2hfbGluazsKLQotCSAgewotCSAgICAvKiBUaGUgc2hhcmVkIGxpYnJhcmllcyBkaXN0cmlidXRlZCB3aXRoIGhwdXgxMSBoYXZlIGEgYm9ndXMKLQkgICAgICAgc2hfbGluayBmaWVsZCBmb3IgdGhlICIuZHluYW1pYyIgc2VjdGlvbi4gIFRoaXMgY29kZSBkZXRlY3RzCi0JICAgICAgIHdoZW4gTElOSyByZWZlcnMgdG8gYSBzZWN0aW9uIHRoYXQgaXMgbm90IGEgc3RyaW5nIHRhYmxlIGFuZAotCSAgICAgICB0cmllcyB0byBmaW5kIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoZSAiLmR5bnN5bSIgc2VjdGlvbgotCSAgICAgICBpbnN0ZWFkLiAgKi8KLQkgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbbGlua107Ci0JICAgIGlmIChoZHItPnNoX3R5cGUgIT0gU0hUX1NUUlRBQikKLQkgICAgICB7Ci0JCWFzZWN0aW9uICpzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0JCWludCBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotCQlpZiAoZWxmc2VjID09IC0xKQotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQlsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCSAgICAgIH0KLQkgIH0KLQotCSAgZXh0ZHluID0gZHluYnVmOwotCSAgZXh0ZHluZW5kID0gZXh0ZHluICsgcy0+X3Jhd19zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKTsKLQkgIGZvciAoOyBleHRkeW4gPCBleHRkeW5lbmQ7IGV4dGR5bisrKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0KLQkgICAgICBlbGZfc3dhcF9keW5faW4gKGFiZmQsIGV4dGR5biwgJmR5bik7Ci0JICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9TT05BTUUpCi0JCXsKLQkJICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQkgIGR5bi5kX3VuLmRfdmFsKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX05FRURFRCkKLQkJewotCQkgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbiwgKipwbjsKLQkJICBjaGFyICpmbm0sICphbm07Ci0KLQkJICBuID0gKChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QpKSk7Ci0JCSAgZm5tID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQkgZHluLmRfdW4uZF92YWwpOwotCQkgIGlmIChuID09IE5VTEwgfHwgZm5tID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBhbm0gPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoZm5tKSArIDEpOwotCQkgIGlmIChhbm0gPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cmNweSAoYW5tLCBmbm0pOwotCQkgIG4tPm5hbWUgPSBhbm07Ci0JCSAgbi0+YnkgPSBhYmZkOwotCQkgIG4tPm5leHQgPSBOVUxMOwotCQkgIGZvciAocG4gPSAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci0JCSAgICAgICAqcG4gIT0gTlVMTDsKLQkJICAgICAgIHBuID0gJigqcG4pLT5uZXh0KQotCQkgICAgOwotCQkgICpwbiA9IG47Ci0JCX0KLQkgICAgfQotCi0JICBmcmVlIChkeW5idWYpOwotCSAgZHluYnVmID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgYW55IG9mIHRoZSBzZWN0aW9ucyBpbiBhIGR5bmFtaWMKLQkgb2JqZWN0IGluIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGhhY2sgYnkgc2ltcGx5IGNsb2JiZXJpbmcgdGhlCi0JIGxpc3Qgb2Ygc2VjdGlvbnMgaW4gdGhlIEJGRC4gIFRoaXMgY291bGQgYmUgaGFuZGxlZCBtb3JlCi0JIGNsZWFubHkgYnksIHNheSwgYSBuZXcgc2VjdGlvbiBmbGFnOyB0aGUgZXhpc3RpbmcKLQkgU0VDX05FVkVSX0xPQUQgZmxhZyBpcyBub3QgdGhlIG9uZSB3ZSB3YW50LCBiZWNhdXNlIHRoYXQgb25lCi0JIHN0aWxsIGltcGxpZXMgdGhhdCB0aGUgc2VjdGlvbiB0YWtlcyB1cCBzcGFjZSBpbiB0aGUgb3V0cHV0Ci0JIGZpbGUuICAqLwotICAgICAgYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotICAgICAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDA7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIHRoZSBsaW5rLCBjcmVhdGUKLQkgdGhlIHNwZWNpYWwgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgbGlua2luZy4gICovCi0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQl7Ci0JICBpZiAoISBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGFkZF9uZWVkZWQpCi0JewotCSAgLyogQWRkIGEgRFRfTkVFREVEIGVudHJ5IGZvciB0aGlzIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQkgIG9sZHNpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0JICBzdHJpbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsIG5hbWUsCi0JCQkJCSB0cnVlLCBmYWxzZSk7Ci0JICBpZiAoc3RyaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG9sZHNpemUgPT0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNkeW47Ci0JICAgICAgRWxmX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0JICAgICAgLyogVGhlIGhhc2ggdGFibGUgc2l6ZSBkaWQgbm90IGNoYW5nZSwgd2hpY2ggbWVhbnMgdGhhdAotCQkgdGhlIGR5bmFtaWMgb2JqZWN0IG5hbWUgd2FzIGFscmVhZHkgZW50ZXJlZC4gIElmIHdlCi0JCSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgdGhpcyBkeW5hbWljIG9iamVjdCBpbiB0aGUKLQkJIGxpbmssIGp1c3QgaWdub3JlIGl0LiAgVGhlcmUgaXMgbm8gcmVhc29uIHRvIGluY2x1ZGUKLQkJIGEgcGFydGljdWxhciBkeW5hbWljIG9iamVjdCBtb3JlIHRoYW4gb25jZS4gICovCi0JICAgICAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICAgICAgIi5keW5hbWljIik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLQotCSAgICAgIGR5bmNvbiA9IChFbGZfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotCSAgICAgIGR5bmNvbmVuZCA9IChFbGZfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArCi0JCQkJCQlzZHluLT5fcmF3X3NpemUpOwotCSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0KLQkJICBlbGZfc3dhcF9keW5faW4gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCBkeW5jb24sCi0JCQkJICAgJmR5bik7Ci0JCSAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQKLQkJICAgICAgJiYgZHluLmRfdW4uZF92YWwgPT0gc3RyaW5kZXgpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChidWYgIT0gTlVMTCkKLQkJCWZyZWUgKGJ1Zik7Ci0JCSAgICAgIGlmIChleHR2ZXJzeW0gIT0gTlVMTCkKLQkJCWZyZWUgKGV4dHZlcnN5bSk7Ci0JCSAgICAgIHJldHVybiB0cnVlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ORUVERUQsIHN0cmluZGV4KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBTYXZlIHRoZSBTT05BTUUsIGlmIHRoZXJlIGlzIG9uZSwgYmVjYXVzZSBzb21ldGltZXMgdGhlCi0gICAgICAgICBsaW5rZXIgZW11bGF0aW9uIGNvZGUgd2lsbCBuZWVkIHRvIGtub3cgaXQuICAqLwotICAgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgZWxmX2R0X25hbWUgKGFiZmQpID0gbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQloZHItPnNoX29mZnNldCArIGV4dHN5bW9mZiAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKChQVFIpIGJ1Ziwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgZXh0c3ltY291bnQsIGFiZmQpCi0JICAhPSBleHRzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdlYWtzID0gTlVMTDsKLQotICBldmVyID0gZXh0dmVyc3ltICE9IE5VTEwgPyBleHR2ZXJzeW0gKyBleHRzeW1vZmYgOiBOVUxMOwotICBlc3ltZW5kID0gYnVmICsgZXh0c3ltY291bnQ7Ci0gIGZvciAoZXN5bSA9IGJ1ZjsKLSAgICAgICBlc3ltIDwgZXN5bWVuZDsKLSAgICAgICBlc3ltKyssIHN5bV9oYXNoKyssIGV2ZXIgPSAoZXZlciAhPSBOVUxMID8gZXZlciArIDEgOiBOVUxMKSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBiaW5kOwotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgICAgIGJvb2xlYW4gc2l6ZV9jaGFuZ2Vfb2ssIHR5cGVfY2hhbmdlX29rOwotICAgICAgYm9vbGVhbiBuZXdfd2Vha2RlZjsKLSAgICAgIHVuc2lnbmVkIGludCBvbGRfYWxpZ25tZW50OwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZzeW0pOwotCi0gICAgICBmbGFncyA9IEJTRl9OT19GTEFHUzsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICB2YWx1ZSA9IHN5bS5zdF92YWx1ZTsKLSAgICAgICpzeW1faGFzaCA9IE5VTEw7Ci0KLSAgICAgIGJpbmQgPSBFTEZfU1RfQklORCAoc3ltLnN0X2luZm8pOwotICAgICAgaWYgKGJpbmQgPT0gU1RCX0xPQ0FMKQotCXsKLQkgIC8qIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUsIHNpbmNlIEVMRiByZXF1aXJlcyB0aGF0IGFsbAotCSAgICAgZ2xvYmFsIHN5bWJvbHMgZm9sbG93IGFsbCBsb2NhbCBzeW1ib2xzLCBhbmQgdGhhdCBzaF9pbmZvCi0JICAgICBwb2ludCB0byB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gIFVuZm9ydHVuYXRlYWx5LCBJcml4IDUKLQkgICAgIHNjcmV3cyB0aGlzIHVwLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGJpbmQgPT0gU1RCX0dMT0JBTCkKLQl7Ci0JICBpZiAoc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRgotCSAgICAgICYmIHN5bS5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKQotCSAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBlbHNlCi0JICAgIGZsYWdzID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChiaW5kID09IFNUQl9XRUFLKQotCWZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBlbHNlCi0JewotCSAgLyogTGVhdmUgaXQgdXAgdG8gdGhlIHByb2Nlc3NvciBiYWNrZW5kLiAgKi8KLQl9Ci0KLSAgICAgIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChzeW0uc3Rfc2huZHggPiAwICYmIHN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JewotCSAgc2VjID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLnN0X3NobmR4KTsKLQkgIGlmIChzZWMgPT0gTlVMTCkKLQkgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgIT0gMCkKLQkgICAgdmFsdWUgLT0gc2VjLT52bWE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0Jc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCXsKLQkgIHNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAvKiBXaGF0IEVMRiBjYWxscyB0aGUgc2l6ZSB3ZSBjYWxsIHRoZSB2YWx1ZS4gIFdoYXQgRUxGCi0JICAgICBjYWxscyB0aGUgdmFsdWUgd2UgY2FsbCB0aGUgYWxpZ25tZW50LiAgKi8KLQkgIHZhbHVlID0gc3ltLnN0X3NpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExlYXZlIGl0IHVwIHRvIHRoZSBwcm9jZXNzb3IgYmFja2VuZC4gICovCi0JfQotCi0gICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLCBzeW0uc3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYWRkX3N5bWJvbF9ob29rKQotCXsKLQkgIGlmICghICgqYWRkX3N5bWJvbF9ob29rKSAoYWJmZCwgaW5mbywgJnN5bSwgJm5hbWUsICZmbGFncywgJnNlYywKLQkJCQkgICAgJnZhbHVlKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFRoZSBob29rIGZ1bmN0aW9uIHNldHMgdGhlIG5hbWUgdG8gTlVMTCBpZiB0aGlzIHN5bWJvbAotCSAgICAgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHNvbWUgcmVhc29uLiAgKi8KLQkgIGlmIChuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogU2FuaXR5IGNoZWNrIHRoYXQgYWxsIHBvc3NpYmlsaXRpZXMgd2VyZSBoYW5kbGVkLiAgKi8KLSAgICAgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQlkZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgICAgIHNpemVfY2hhbmdlX29rID0gZmFsc2U7Ci0gICAgICB0eXBlX2NoYW5nZV9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+dHlwZV9jaGFuZ2Vfb2s7Ci0gICAgICBvbGRfYWxpZ25tZW50ID0gMDsKLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyOwotCSAgdW5zaWduZWQgaW50IHZlcm51bSA9IDA7Ci0JICBib29sZWFuIG92ZXJyaWRlOwotCi0JICBpZiAoZXZlciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4gKGFiZmQsIGV2ZXIsICZpdmVyKTsKLQkgICAgICB2ZXJudW0gPSBpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fVkVSU0lPTjsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBoaWRkZW4gc3ltYm9sLCBvciBpZiBpdCBpcyBub3QgdmVyc2lvbgotICAgICAgICAgICAgICAgICAxLCB3ZSBhcHBlbmQgdGhlIHZlcnNpb24gbmFtZSB0byB0aGUgc3ltYm9sIG5hbWUuCi0gICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHdlIGRvIG5vdCBtb2RpZnkgYSBub24taGlkZGVuIGFic29sdXRlCi0gICAgICAgICAgICAgICAgIHN5bWJvbCwgYmVjYXVzZSBpdCBtaWdodCBiZSB0aGUgdmVyc2lvbiBzeW1ib2wKLSAgICAgICAgICAgICAgICAgaXRzZWxmLiAgRklYTUU6IFdoYXQgaWYgaXQgaXNuJ3Q/ICAqLwotCSAgICAgIGlmICgoaXZlci52c192ZXJzICYgVkVSU1lNX0hJRERFTikgIT0gMAotCQkgIHx8ICh2ZXJudW0gPiAxICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKSkKLQkJewotCQkgIGNvbnN0IGNoYXIgKnZlcnN0cjsKLQkJICBpbnQgbmFtZWxlbiwgbmV3bGVuOwotCQkgIGNoYXIgKm5ld25hbWUsICpwOwotCi0JCSAgaWYgKHN5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYpCi0JCSAgICB7Ci0JCSAgICAgIGlmICh2ZXJudW0gPiBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyLnNoX2luZm8pCi0JCQl7Ci0JCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAgIChfKCIlczogJXM6IGludmFsaWQgdmVyc2lvbiAldSAobWF4ICVkKSIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgdmVybnVtLAotCQkJICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyLnNoX2luZm8pOwotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHZlcm51bSA+IDEpCi0JCQl2ZXJzdHIgPQotCQkJICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWZbdmVybnVtIC0gMV0udmRfbm9kZW5hbWU7Ci0JCSAgICAgIGVsc2UKLQkJCXZlcnN0ciA9ICIiOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgY2Fubm90IHNpbXBseSB0ZXN0IGZvciB0aGUgbnVtYmVyIG9mCi0JCQkgZW50cmllcyBpbiB0aGUgVkVSTkVFRCBzZWN0aW9uIHNpbmNlIHRoZQotCQkJIG51bWJlcnMgZm9yIHRoZSBuZWVkZWQgdmVyc2lvbnMgZG8gbm90IHN0YXJ0Ci0JCQkgYXQgMC4gICovCi0JCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotCi0JCSAgICAgIHZlcnN0ciA9IE5VTEw7Ci0JCSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsKLQkJCSAgIHQgIT0gTlVMTDsKLQkJCSAgIHQgPSB0LT52bl9uZXh0cmVmKQotCQkJewotCQkJICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQkJICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChhLT52bmFfb3RoZXIgPT0gdmVybnVtKQotCQkJCXsKLQkJCQkgIHZlcnN0ciA9IGEtPnZuYV9ub2RlbmFtZTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgIGlmIChhICE9IE5VTEwpCi0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGlmICh2ZXJzdHIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiAlczogaW52YWxpZCBuZWVkZWQgdmVyc2lvbiAlZCIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgdmVybnVtKTsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQkgICAgfQotCi0JCSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0JCSAgbmV3bGVuID0gbmFtZWxlbiArIHN0cmxlbiAodmVyc3RyKSArIDI7Ci0JCSAgaWYgKChpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fSElEREVOKSA9PSAwKQotCQkgICAgKytuZXdsZW47Ci0KLQkJICBuZXduYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBuZXdsZW4pOwotCQkgIGlmIChuZXduYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCQkgIHAgPSBuZXduYW1lICsgbmFtZWxlbjsKLQkJICAqcCsrID0gRUxGX1ZFUl9DSFI7Ci0JCSAgaWYgKChpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fSElEREVOKSA9PSAwKQotCQkgICAgKnArKyA9IEVMRl9WRVJfQ0hSOwotCQkgIHN0cmNweSAocCwgdmVyc3RyKTsKLQotCQkgIG5hbWUgPSBuZXduYW1lOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgbmFtZSwgJnN5bSwgJnNlYywgJnZhbHVlLAotCQkJCSAgc3ltX2hhc2gsICZvdmVycmlkZSwgJnR5cGVfY2hhbmdlX29rLAotCQkJCSAgJnNpemVfY2hhbmdlX29rKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvdmVycmlkZSkKLQkgICAgZGVmaW5pdGlvbiA9IGZhbHNlOwotCi0JICBoID0gKnN5bV9oYXNoOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLQkgIC8qIFJlbWVtYmVyIHRoZSBvbGQgYWxpZ25tZW50IGlmIHRoaXMgaXMgYSBjb21tb24gc3ltYm9sLCBzbwotICAgICAgICAgICAgIHRoYXQgd2UgZG9uJ3QgcmVkdWNlIHRoZSBhbGlnbm1lbnQgbGF0ZXIgb24uICBXZSBjYW4ndAotICAgICAgICAgICAgIGNoZWNrIGxhdGVyLCBiZWNhdXNlIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gICAgICAgICAgICAgd2lsbCBzZXQgYSBkZWZhdWx0IGZvciB0aGUgYWxpZ25tZW50IHdoaWNoIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICBvdmVycmlkZS4gICovCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICBvbGRfYWxpZ25tZW50ID0gaC0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmICE9IE5VTEwKLQkgICAgICAmJiAhIG92ZXJyaWRlCi0JICAgICAgJiYgdmVybnVtID4gMQotCSAgICAgICYmIGRlZmluaXRpb24pCi0JICAgIGgtPnZlcmluZm8udmVyZGVmID0gJmVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZlt2ZXJudW0gLSAxXTsKLQl9Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWMsIHZhbHVlLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCSAgICAgIGZhbHNlLCBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGggPSAqc3ltX2hhc2g7Ci0gICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotICAgICAgKnN5bV9oYXNoID0gaDsKLQotICAgICAgbmV3X3dlYWtkZWYgPSBmYWxzZTsKLSAgICAgIGlmIChkeW5hbWljCi0JICAmJiBkZWZpbml0aW9uCi0JICAmJiAoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgJiYgRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSAhPSBTVFRfRlVOQwotCSAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JICAmJiBoLT53ZWFrZGVmID09IE5VTEwpCi0JewotCSAgLyogS2VlcCBhIGxpc3Qgb2YgYWxsIHdlYWsgZGVmaW5lZCBub24gZnVuY3Rpb24gc3ltYm9scyBmcm9tCi0JICAgICBhIGR5bmFtaWMgb2JqZWN0LCB1c2luZyB0aGUgd2Vha2RlZiBmaWVsZC4gIExhdGVyIGluIHRoaXMKLQkgICAgIGZ1bmN0aW9uIHdlIHdpbGwgc2V0IHRoZSB3ZWFrZGVmIGZpZWxkIHRvIHRoZSBjb3JyZWN0Ci0JICAgICB2YWx1ZS4gIFdlIG9ubHkgcHV0IG5vbi1mdW5jdGlvbiBzeW1ib2xzIGZyb20gZHluYW1pYwotCSAgICAgb2JqZWN0cyBvbiB0aGlzIGxpc3QsIGJlY2F1c2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRoZSBvbmx5Ci0JICAgICB0aW1lIHdlIG5lZWQgdG8ga25vdyB0aGUgbm9ybWFsIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIGEKLQkgICAgIHdlYWsgc3ltYm9sLCBhbmQgdGhlIGluZm9ybWF0aW9uIGlzIHRpbWUgY29uc3VtaW5nIHRvCi0JICAgICBmaWd1cmUgb3V0LiAgSWYgdGhlIHdlYWtkZWYgZmllbGQgaXMgbm90IGFscmVhZHkgTlVMTCwKLQkgICAgIHRoZW4gdGhpcyBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZCBieSBzb21lIHByZXZpb3VzCi0JICAgICBkeW5hbWljIG9iamVjdCwgYW5kIHdlIHdpbGwgYmUgdXNpbmcgdGhhdCBwcmV2aW91cwotCSAgICAgZGVmaW5pdGlvbiBhbnlob3cuICAqLwotCi0JICBoLT53ZWFrZGVmID0gd2Vha3M7Ci0JICB3ZWFrcyA9IGg7Ci0JICBuZXdfd2Vha2RlZiA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCi0JICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgdW5zaWduZWQgaW50IGFsaWduOwotCi0JICBhbGlnbiA9IGJmZF9sb2cyIChzeW0uc3RfdmFsdWUpOwotCSAgaWYgKGFsaWduID4gb2xkX2FsaWdubWVudCkKLQkgICAgaC0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ247Ci0JfQotCi0gICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGludCBvbGRfZmxhZ3M7Ci0JICBib29sZWFuIGR5bnN5bTsKLQkgIGludCBuZXdfZmxhZzsKLQotCSAgLyogUmVtZW1iZXIgdGhlIHN5bWJvbCBzaXplIGFuZCB0eXBlLiAgKi8KLQkgIGlmIChzeW0uc3Rfc2l6ZSAhPSAwCi0JICAgICAgJiYgKGRlZmluaXRpb24gfHwgaC0+c2l6ZSA9PSAwKSkKLQkgICAgewotCSAgICAgIGlmIChoLT5zaXplICE9IDAgJiYgaC0+c2l6ZSAhPSBzeW0uc3Rfc2l6ZSAmJiAhIHNpemVfY2hhbmdlX29rKQotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiV2FybmluZzogc2l6ZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWx1IHRvICVsdSBpbiAlcyIpLAotCQkgICBuYW1lLCAodW5zaWduZWQgbG9uZykgaC0+c2l6ZSwgKHVuc2lnbmVkIGxvbmcpIHN5bS5zdF9zaXplLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgICAgICBoLT5zaXplID0gc3ltLnN0X3NpemU7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4gd2UgYWx3YXlzIHdhbnQgSC0+U0laRQotICAgICAgICAgICAgIHRvIGJlIHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgVGhlIGNvZGUganVzdCBhYm92ZQotICAgICAgICAgICAgIHdvbid0IGZpeCB0aGUgc2l6ZSBpZiBhIGNvbW1vbiBzeW1ib2wgYmVjb21lcyBsYXJnZXIuICBXZQotICAgICAgICAgICAgIGRvbid0IHdhcm4gYWJvdXQgYSBzaXplIGNoYW5nZSBoZXJlLCBiZWNhdXNlIHRoYXQgaXMKLSAgICAgICAgICAgICBjb3ZlcmVkIGJ5IC0td2Fybi1jb21tb24uICAqLwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgaC0+c2l6ZSA9IGgtPnJvb3QudS5jLnNpemU7Ci0KLQkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pICE9IFNUVF9OT1RZUEUKLQkgICAgICAmJiAoZGVmaW5pdGlvbiB8fCBoLT50eXBlID09IFNUVF9OT1RZUEUpKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnR5cGUgIT0gU1RUX05PVFlQRQotCQkgICYmIGgtPnR5cGUgIT0gRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKQotCQkgICYmICEgdHlwZV9jaGFuZ2Vfb2spCi0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIpLAotCQkgICBuYW1lLCBoLT50eXBlLCBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgICAgICBoLT50eXBlID0gRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKTsKLQkgICAgfQotCi0JICBpZiAoc3ltLnN0X290aGVyICE9IDAKLQkgICAgICAmJiAoZGVmaW5pdGlvbiB8fCBoLT5vdGhlciA9PSAwKSkKLQkgICAgaC0+b3RoZXIgPSBzeW0uc3Rfb3RoZXI7Ci0KLQkgIC8qIFNldCBhIGZsYWcgaW4gdGhlIGhhc2ggdGFibGUgZW50cnkgaW5kaWNhdGluZyB0aGUgdHlwZSBvZgotCSAgICAgcmVmZXJlbmNlIG9yIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4gIEtlZXAgYSBjb3VudCBvZgotCSAgICAgdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgd2UgZmluZC4gIEEgZHluYW1pYyBzeW1ib2wKLQkgICAgIGlzIG9uZSB3aGljaCBpcyByZWZlcmVuY2VkIG9yIGRlZmluZWQgYnkgYm90aCBhIHJlZ3VsYXIKLQkgICAgIG9iamVjdCBhbmQgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLQkgIG9sZF9mbGFncyA9IGgtPmVsZl9saW5rX2hhc2hfZmxhZ3M7Ci0JICBkeW5zeW0gPSBmYWxzZTsKLQkgIGlmICghIGR5bmFtaWMpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWZpbml0aW9uKQotCQl7Ci0JCSAgbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOwotCQkgIGlmIChiaW5kICE9IFNUQl9XRUFLKQotCQkgICAgbmV3X2ZsYWcgfD0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLOwotCQl9Ci0JICAgICAgZWxzZQotCQluZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICAgICAgaWYgKGluZm8tPnNoYXJlZAotCQkgIHx8IChvbGRfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQwotCQkJCSAgIHwgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykpICE9IDApCi0JCWR5bnN5bSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGRlZmluaXRpb24pCi0JCW5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLQkgICAgICBlbHNlCi0JCW5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQzsKLQkgICAgICBpZiAoKG9sZF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0JCQkJfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkgIT0gMAotCQkgIHx8IChoLT53ZWFrZGVmICE9IE5VTEwKLQkJICAgICAgJiYgISBuZXdfd2Vha2RlZgotCQkgICAgICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ICE9IC0xKSkKLQkJZHluc3ltID0gdHJ1ZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IG5ld19mbGFnOwotCi0JICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYSB2ZXJzaW9uLCBhbmQgaXQgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICB2ZXJzaW9uLCB3ZSBjcmVhdGUgYW4gaW5kaXJlY3Qgc3ltYm9sIGZyb20gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICBuYW1lIHRvIHRoZSBmdWxseSBkZWNvcmF0ZWQgbmFtZS4gIFRoaXMgd2lsbCBjYXVzZQotICAgICAgICAgICAgIGV4dGVybmFsIHJlZmVyZW5jZXMgd2hpY2ggZG8gbm90IHNwZWNpZnkgYSB2ZXJzaW9uIHRvIGJlCi0gICAgICAgICAgICAgYm91bmQgdG8gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICAqLwotCSAgaWYgKGRlZmluaXRpb24pCi0JICAgIHsKLQkgICAgICBjaGFyICpwOwotCi0JICAgICAgcCA9IHN0cmNociAobmFtZSwgRUxGX1ZFUl9DSFIpOwotCSAgICAgIGlmIChwICE9IE5VTEwgJiYgcFsxXSA9PSBFTEZfVkVSX0NIUikKLQkJewotCQkgIGNoYXIgKnNob3J0bmFtZTsKLQkJICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGk7Ci0JCSAgYm9vbGVhbiBvdmVycmlkZTsKLQotCQkgIHNob3J0bmFtZSA9IGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCQkgcCAtIG5hbWUgKyAxKTsKLQkJICBpZiAoc2hvcnRuYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJuY3B5IChzaG9ydG5hbWUsIG5hbWUsIHAgLSBuYW1lKTsKLQkJICBzaG9ydG5hbWVbcCAtIG5hbWVdID0gJ1wwJzsKLQotCQkgIC8qIFdlIGFyZSBnb2luZyB0byBjcmVhdGUgYSBuZXcgc3ltYm9sLiAgTWVyZ2UgaXQKLSAgICAgICAgICAgICAgICAgICAgIHdpdGggYW55IGV4aXN0aW5nIHN5bWJvbCB3aXRoIHRoaXMgbmFtZS4gIEZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzIG9mIHRoZSBtZXJnZSwgYWN0IGFzIHRob3VnaCB3ZSB3ZXJlCi0gICAgICAgICAgICAgICAgICAgICBkZWZpbmluZyB0aGUgc3ltYm9sIHdlIGp1c3QgZGVmaW5lZCwgYWx0aG91Z2ggd2UKLSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IGdvaW5nIHRvIGRlZmluZSBhbiBpbmRpcmVjdCBzeW1ib2wuICAqLwotCQkgIHR5cGVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgc2l6ZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLQkJICBpZiAoISBlbGZfbWVyZ2Vfc3ltYm9sIChhYmZkLCBpbmZvLCBzaG9ydG5hbWUsICZzeW0sICZzZWMsCi0JCQkJCSAgJnZhbHVlLCAmaGksICZvdmVycmlkZSwKLQkJCQkJICAmdHlwZV9jaGFuZ2Vfb2ssICZzaXplX2NoYW5nZV9vaykpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIGlmICghIG92ZXJyaWRlKQotCQkgICAgewotCQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJCSAgICAgKGluZm8sIGFiZmQsIHNob3J0bmFtZSwgQlNGX0lORElSRUNULAotCQkJICAgICAgYmZkX2luZF9zZWN0aW9uX3B0ciwgKGJmZF92bWEpIDAsIG5hbWUsIGZhbHNlLAotCQkJICAgICAgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGkpKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogSW4gdGhpcyBjYXNlIHRoZSBzeW1ib2wgbmFtZWQgU0hPUlROQU1FIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGluZyB0aGUgaW5kaXJlY3Qgc3ltYm9sIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGQuICBXZSB3ZXJlIHBsYW5uaW5nIG9uIG1ha2luZyBTSE9SVE5BTUUgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdCBzeW1ib2wgcmVmZXJyaW5nIHRvIE5BTUUuICBTSE9SVE5BTUUKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgbmFtZSB3aXRob3V0IGEgdmVyc2lvbi4gIE5BTUUgaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgdmVyc2lvbmVkIG5hbWUsIGFuZCBpdCBpcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24uCi0KLQkJCSBPdmVycmlkaW5nIG1lYW5zIHRoYXQgd2UgYWxyZWFkeSBzYXcgYQotCQkJIGRlZmluaXRpb24gZm9yIHRoZSBzeW1ib2wgU0hPUlROQU1FIGluIGEKLQkJCSByZWd1bGFyIG9iamVjdCwgYW5kIGl0IGlzIG92ZXJyaWRpbmcgdGhlCi0JCQkgc3ltYm9sIGRlZmluZWQgaW4gdGhlIGR5bmFtaWMgb2JqZWN0LgotCi0JCQkgV2hlbiB0aGlzIGhhcHBlbnMsIHdlIGFjdHVhbGx5IHdhbnQgdG8gY2hhbmdlCi0JCQkgTkFNRSwgdGhlIHN5bWJvbCB3ZSBqdXN0IGFkZGVkLCB0byByZWZlciB0bwotCQkJIFNIT1JUTkFNRS4gIFRoaXMgd2lsbCBjYXVzZSByZWZlcmVuY2VzIHRvCi0JCQkgTkFNRSBpbiB0aGUgc2hhcmVkIG9iamVjdCB0byBiZWNvbWUKLQkJCSByZWZlcmVuY2VzIHRvIFNIT1JUTkFNRSBpbiB0aGUgcmVndWxhcgotCQkJIG9iamVjdC4gIFRoaXMgaXMgd2hhdCB3ZSBleHBlY3Qgd2hlbiB3ZQotCQkJIG92ZXJyaWRlIGEgZnVuY3Rpb24gaW4gYSBzaGFyZWQgb2JqZWN0OiB0aGF0Ci0JCQkgdGhlIHJlZmVyZW5jZXMgaW4gdGhlIHNoYXJlZCBvYmplY3Qgd2lsbCBiZQotCQkJIG1hcHBlZCB0byB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgcmVndWxhcgotCQkJIG9iamVjdC4gICovCi0KLQkJICAgICAgd2hpbGUgKGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkJICAgICB8fCBoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJCWhpID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGhpLT5yb290LnUuaS5saW5rOwotCi0JCSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q7Ci0JCSAgICAgIGgtPnJvb3QudS5pLmxpbmsgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaGk7Ci0JCSAgICAgIGlmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykKLQkJCXsKLQkJCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQzsKLQkJCSAgaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLQkJCSAgaWYgKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCQkgICAgewotCQkJICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sCi0JCQkJCQkJCQkgaGkpKQotCQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICAvKiBOb3cgc2V0IEhJIHRvIEgsIHNvIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBzZXQgdGhlIG90aGVyIGZpZWxkcyBjb3JyZWN0bHkuICAqLwotCQkgICAgICBoaSA9IGg7Ci0JCSAgICB9Ci0KLQkJICAvKiBJZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uIHNvbWV3aGVyZSwKLQkJICAgICB0aGVuIEhJIG1heSBub3QgcG9pbnQgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sLiAgV2UKLQkJICAgICB3aWxsIGhhdmUgcmVwb3J0ZWQgYW4gZXJyb3IgdG8gdGhlIHVzZXIgaW4gdGhhdAotCQkgICAgIGNhc2UuICAqLwotCi0JCSAgaWYgKGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmh0OwotCi0JCSAgICAgIC8qIElmIHRoZSBzeW1ib2wgYmVjYW1lIGluZGlyZWN0LCB0aGVuIHdlIGFzc3VtZQotCQkJIHRoYXQgd2UgaGF2ZSBub3Qgc2VlbiBhIGRlZmluaXRpb24gYmVmb3JlLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQwotCQkJCSAgICAgIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCQkJICA9PSAwKTsKLQotCQkgICAgICBodCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoaS0+cm9vdC51LmkubGluazsKLQotCQkgICAgICAvKiBDb3B5IGRvd24gYW55IHJlZmVyZW5jZXMgdGhhdCB3ZSBtYXkgaGF2ZQotCQkJIGFscmVhZHkgc2VlbiB0byB0aGUgc3ltYm9sIHdoaWNoIGp1c3QgYmVjYW1lCi0JCQkgaW5kaXJlY3QuICAqLwotCQkgICAgICBodC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PQotCQkJKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgJiAoRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQwotCQkJICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLCi0JCQkgICAgfCBFTEZfTElOS19OT05fR09UX1JFRikpOwotCi0JCSAgICAgIC8qIENvcHkgb3ZlciB0aGUgZ2xvYmFsIGFuZCBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotCQkJIG9mZnNldCBlbnRyaWVzLiAgVGhlc2UgbWF5IGhhdmUgYmVlbiBhbHJlYWR5IHNldAotCQkJIHVwIGJ5IGEgY2hlY2tfcmVsb2NzIHJvdXRpbmUuICAqLwotCQkgICAgICBpZiAoaHQtPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCQkJewotCQkJICBodC0+Z290Lm9mZnNldCA9IGhpLT5nb3Qub2Zmc2V0OwotCQkJICBoaS0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCX0KLQkJICAgICAgQkZEX0FTU0VSVCAoaGktPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotCQkgICAgICBpZiAoaHQtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCQkJewotCQkJICBodC0+cGx0Lm9mZnNldCA9IGhpLT5wbHQub2Zmc2V0OwotCQkJICBoaS0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCX0KLQkJICAgICAgQkZEX0FTU0VSVCAoaGktPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotCQkgICAgICBpZiAoaHQtPmR5bmluZHggPT0gLTEpCi0JCQl7Ci0JCQkgIGh0LT5keW5pbmR4ID0gaGktPmR5bmluZHg7Ci0JCQkgIGh0LT5keW5zdHJfaW5kZXggPSBoaS0+ZHluc3RyX2luZGV4OwotCQkJICBoaS0+ZHluaW5keCA9IC0xOwotCQkJICBoaS0+ZHluc3RyX2luZGV4ID0gMDsKLQkJCX0KLQkJICAgICAgQkZEX0FTU0VSVCAoaGktPmR5bmluZHggPT0gLTEpOwotCi0JCSAgICAgIC8qIEZJWE1FOiBUaGVyZSBtYXkgYmUgb3RoZXIgaW5mb3JtYXRpb24gdG8gY29weQotCQkJIG92ZXIgZm9yIHBhcnRpY3VsYXIgdGFyZ2V0cy4gICovCi0KLQkJICAgICAgLyogU2VlIGlmIHRoZSBuZXcgZmxhZ3MgbGVhZCB1cyB0byByZWFsaXplIHRoYXQKLQkJCSB0aGUgc3ltYm9sIG11c3QgYmUgZHluYW1pYy4gICovCi0JCSAgICAgIGlmICghIGR5bnN5bSkKLQkJCXsKLQkJCSAgaWYgKCEgZHluYW1pYykKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoaW5mby0+c2hhcmVkCi0JCQkJICB8fCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykKLQkJCQkgICAgICAhPSAwKSkKLQkJCQlkeW5zeW0gPSB0cnVlOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDApCi0JCQkJZHluc3ltID0gdHJ1ZTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICAvKiBXZSBhbHNvIG5lZWQgdG8gZGVmaW5lIGFuIGluZGlyZWN0aW9uIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICBub25kZWZhdWx0IHZlcnNpb24gb2YgdGhlIHN5bWJvbC4gICovCi0KLQkJICBzaG9ydG5hbWUgPSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJIHN0cmxlbiAobmFtZSkpOwotCQkgIGlmIChzaG9ydG5hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cm5jcHkgKHNob3J0bmFtZSwgbmFtZSwgcCAtIG5hbWUpOwotCQkgIHN0cmNweSAoc2hvcnRuYW1lICsgKHAgLSBuYW1lKSwgcCArIDEpOwotCi0JCSAgLyogT25jZSBhZ2FpbiwgbWVyZ2Ugd2l0aCBhbnkgZXhpc3Rpbmcgc3ltYm9sLiAgKi8KLQkJICB0eXBlX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIHNpemVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgaWYgKCEgZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgc2hvcnRuYW1lLCAmc3ltLCAmc2VjLAotCQkJCQkgICZ2YWx1ZSwgJmhpLCAmb3ZlcnJpZGUsCi0JCQkJCSAgJnR5cGVfY2hhbmdlX29rLCAmc2l6ZV9jaGFuZ2Vfb2spKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICBpZiAob3ZlcnJpZGUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEhlcmUgU0hPUlROQU1FIGlzIGEgdmVyc2lvbmVkIG5hbWUsIHNvIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgZXhwZWN0IHRvIHNlZSB0aGUgdHlwZSBvZiBvdmVycmlkZSB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGRvIGluIHRoZSBjYXNlIGFib3ZlLiAgKi8KLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiJXM6IHdhcm5pbmc6IHVuZXhwZWN0ZWQgcmVkZWZpbml0aW9uIG9mIGAlcyciKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc2hvcnRuYW1lKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkJICAgICAoaW5mbywgYWJmZCwgc2hvcnRuYW1lLCBCU0ZfSU5ESVJFQ1QsCi0JCQkgICAgICBiZmRfaW5kX3NlY3Rpb25fcHRyLCAoYmZkX3ZtYSkgMCwgbmFtZSwgZmFsc2UsCi0JCQkgICAgICBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoaSkpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogSWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBzb21ld2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBISSBtYXkgbm90IHBvaW50IHRvIGFuIGluZGlyZWN0IHN5bWJvbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICBXZSB3aWxsIGhhdmUgcmVwb3J0ZWQgYW4gZXJyb3IgdG8gdGhlIHVzZXIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNhc2UuICAqLwotCi0JCSAgICAgIGlmIChoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JCQl7Ci0JCQkgIC8qIElmIHRoZSBzeW1ib2wgYmVjYW1lIGluZGlyZWN0LCB0aGVuIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZSB0aGF0IHdlIGhhdmUgbm90IHNlZW4gYSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZS4gICovCi0JCQkgIEJGRF9BU1NFUlQgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICAgICAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJCSAgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCQkgICAgICA9PSAwKTsKLQotCQkJICAvKiBDb3B5IGRvd24gYW55IHJlZmVyZW5jZXMgdGhhdCB3ZSBtYXkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHNlZW4gdG8gdGhlIHN5bWJvbCB3aGljaCBqdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2FtZSBpbmRpcmVjdC4gICovCi0JCQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0KLQkJCSAgICAoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgJiAoRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQwotCQkJCXwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCXwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLCi0JCQkJfCBFTEZfTElOS19OT05fR09UX1JFRikpOwotCi0JCQkgIC8qIENvcHkgb3ZlciB0aGUgZ2xvYmFsIGFuZCBwcm9jZWR1cmUgbGlua2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSBvZmZzZXQgZW50cmllcy4gIFRoZXNlIG1heSBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBzZXQgdXAgYnkgYSBjaGVja19yZWxvY3Mgcm91dGluZS4gICovCi0JCQkgIGlmIChoLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gaGktPmdvdC5vZmZzZXQ7Ci0JCQkgICAgICBoaS0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCSAgICB9Ci0JCQkgIEJGRF9BU1NFUlQgKGhpLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7Ci0KLQkJCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPnBsdC5vZmZzZXQgPSBoaS0+cGx0Lm9mZnNldDsKLQkJCSAgICAgIGhpLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJICAgIH0KLQkJCSAgQkZEX0FTU0VSVCAoaGktPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotCQkJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5keW5pbmR4ID0gaGktPmR5bmluZHg7Ci0JCQkgICAgICBoLT5keW5zdHJfaW5kZXggPSBoaS0+ZHluc3RyX2luZGV4OwotCQkJICAgICAgaGktPmR5bmluZHggPSAtMTsKLQkJCSAgICAgIGhpLT5keW5zdHJfaW5kZXggPSAwOwotCQkJICAgIH0KLQkJCSAgQkZEX0FTU0VSVCAoaGktPmR5bmluZHggPT0gLTEpOwotCi0JCQkgIC8qIEZJWE1FOiBUaGVyZSBtYXkgYmUgb3RoZXIgaW5mb3JtYXRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSBvdmVyIGZvciBwYXJ0aWN1bGFyIHRhcmdldHMuICAqLwotCi0JCQkgIC8qIFNlZSBpZiB0aGUgbmV3IGZsYWdzIGxlYWQgdXMgdG8gcmVhbGl6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBzeW1ib2wgbXVzdCBiZSBkeW5hbWljLiAgKi8KLQkJCSAgaWYgKCEgZHluc3ltKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICghIGR5bmFtaWMpCi0JCQkJewotCQkJCSAgaWYgKGluZm8tPnNoYXJlZAotCQkJCSAgICAgIHx8ICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkJICAgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKQotCQkJCQkgICE9IDApKQotCQkJCSAgICBkeW5zeW0gPSB0cnVlOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBpZiAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMCkKLQkJCQkgICAgZHluc3ltID0gdHJ1ZTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGR5bnN5bSAmJiBoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgJiYgISBuZXdfd2Vha2RlZgotCQkgICYmIGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywKLQkJCQkJCQkgICAgIGgtPndlYWtkZWYpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTm93IHNldCB0aGUgd2Vha2RlZnMgZmllbGQgY29ycmVjdGx5IGZvciBhbGwgdGhlIHdlYWsgZGVmaW5lZAotICAgICBzeW1ib2xzIHdlIGZvdW5kLiAgVGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2VhcmNoIGFsbCB0aGUKLSAgICAgc3ltYm9scy4gIFNpbmNlIHdlIG9ubHkgbmVlZCB0aGUgaW5mb3JtYXRpb24gZm9yIG5vbiBmdW5jdGlvbnMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzLCB0aGF0J3MgdGhlIG9ubHkgdGltZSB3ZSBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24KLSAgICAgdGhlIGxpc3QgV0VBS1MuICBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gc28gdGhhdCBpZiBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0IHJlZmVycyB0byBhIHN5bWJvbCBkZWZpbmVkIHdlYWtseSBpbiBhIGR5bmFtaWMgb2JqZWN0LCB0aGUKLSAgICAgcmVhbCBzeW1ib2wgaW4gdGhlIGR5bmFtaWMgb2JqZWN0IGlzIGFsc28gcHV0IGluIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbHM7IHdlIGFsc28gbXVzdCBhcnJhbmdlIGZvciBib3RoIHN5bWJvbHMgdG8gcG9pbnQgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uLiAgV2UgY291bGQgaGFuZGxlIHRoZSBnZW5lcmFsIGNhc2Ugb2Ygc3ltYm9sCi0gICAgIGFsaWFzaW5nLCBidXQgYSBnZW5lcmFsIHN5bWJvbCBhbGlhcyBjYW4gb25seSBiZSBnZW5lcmF0ZWQgaW4KLSAgICAgYXNzZW1ibGVyIGNvZGUsIGhhbmRsaW5nIGl0IGNvcnJlY3RseSB3b3VsZCBiZSB2ZXJ5IHRpbWUKLSAgICAgY29uc3VtaW5nLCBhbmQgb3RoZXIgRUxGIGxpbmtlcnMgZG9uJ3QgaGFuZGxlIGdlbmVyYWwgYWxpYXNpbmcKLSAgICAgZWl0aGVyLiAgKi8KLSAgd2hpbGUgKHdlYWtzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhsb29rOwotICAgICAgYXNlY3Rpb24gKnNsb29rOwotICAgICAgYmZkX3ZtYSB2bG9vazsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqaHBwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipocHBlbmQ7Ci0KLSAgICAgIGhsb29rID0gd2Vha3M7Ci0gICAgICB3ZWFrcyA9IGhsb29rLT53ZWFrZGVmOwotICAgICAgaGxvb2stPndlYWtkZWYgPSBOVUxMOwotCi0gICAgICBCRkRfQVNTRVJUIChobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk7Ci0gICAgICBzbG9vayA9IGhsb29rLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICB2bG9vayA9IGhsb29rLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICBocHAgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gICAgICBocHBlbmQgPSBocHAgKyBleHRzeW1jb3VudDsKLSAgICAgIGZvciAoOyBocHAgPCBocHBlbmQ7IGhwcCsrKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKmhwcDsKLQkgIGlmIChoICE9IE5VTEwgJiYgaCAhPSBobG9vawotCSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2xvb2sKLQkgICAgICAmJiBoLT5yb290LnUuZGVmLnZhbHVlID09IHZsb29rKQotCSAgICB7Ci0JICAgICAgaGxvb2stPndlYWtkZWYgPSBoOwotCi0JICAgICAgLyogSWYgdGhlIHdlYWsgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCi0JCSBzeW1ib2xzLCBtYWtlIHN1cmUgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBwdXQgdGhlcmUKLQkJIGFzIHdlbGwuICAqLwotCSAgICAgIGlmIChobG9vay0+ZHluaW5keCAhPSAtMQotCQkgICYmIGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCi0gICAgICAgICAgICAgICAgIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUgd2VhayBkZWZpbml0aW9uIGlzIHB1dCB0aGVyZQotICAgICAgICAgICAgICAgICBhcyB3ZWxsLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB0aGUgZHluYW1pYwotICAgICAgICAgICAgICAgICBsb2FkZXIgbWlnaHQgbm90IG1lcmdlIHRoZSBlbnRyaWVzIGZvciB0aGUgcmVhbAotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCB0aGUgd2VhayBkZWZpbml0aW9uLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIGhsb29rLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGhsb29rKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBidWYgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZXh0dmVyc3ltKTsKLSAgICAgIGV4dHZlcnN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgb2JqZWN0IGlzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3V0cHV0IG9iamVjdCwgYW5kIGl0IGlzCi0gICAgIG5vdCBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGxldCB0aGUgYmFja2VuZCBsb29rIHRocm91Z2ggdGhlCi0gICAgIHJlbG9jcy4KLQotICAgICBUaGlzIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcyBhbmQgdG8KLSAgICAgYXJyYW5nZSBmb3IgZHluYW1pYyByZWxvY3MuICBJdCBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZQotICAgICBwYXJ0aWN1bGFyIGNvbW1vbiBjYXNlIG9mIGxpbmtpbmcgbm9uIFBJQyBjb2RlLCBldmVuIHdoZW4gbGlua2luZwotICAgICBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHdheSBvZgotICAgICBrbm93aW5nIHdoZXRoZXIgYW4gb2JqZWN0IGZpbGUgaGFzIGJlZW4gY29tcGlsZWQgUElDIG9yIG5vdC4KLSAgICAgTG9va2luZyB0aHJvdWdoIHRoZSByZWxvY3MgaXMgbm90IHBhcnRpY3VsYXJseSB0aW1lIGNvbnN1bWluZy4KLSAgICAgVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBtdXN0IGVpdGhlciAoMSkga2VlcCB0aGUgcmVsb2NzIGluIG1lbW9yeSwKLSAgICAgd2hpY2ggY2F1c2VzIHRoZSBsaW5rZXIgdG8gcmVxdWlyZSBhZGRpdGlvbmFsIHJ1bnRpbWUgbWVtb3J5IG9yCi0gICAgICgyKSByZWFkIHRoZSByZWxvY3MgdHdpY2UgZnJvbSB0aGUgaW5wdXQgZmlsZSwgd2hpY2ggd2FzdGVzIHRpbWUuCi0gICAgIFRoaXMgd291bGQgYmUgYSBnb29kIGNhc2UgZm9yIHVzaW5nIG1tYXAuCi0KLSAgICAgSSBoYXZlIG5vIGlkZWEgaG93IHRvIGhhbmRsZSBsaW5raW5nIFBJQyBjb2RlIGludG8gYSBmaWxlIG9mIGEKLSAgICAgZGlmZmVyZW50IGZvcm1hdC4gIEl0IHByb2JhYmx5IGNhbid0IGJlIGRvbmUuICAqLwotICBjaGVja19yZWxvY3MgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNoZWNrX3JlbG9jczsKLSAgaWYgKCEgZHluYW1pYwotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiBjaGVja19yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQkgIGJvb2xlYW4gb2s7Ci0KLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgICB8fCBvLT5yZWxvY19jb3VudCA9PSAwCi0JICAgICAgfHwgKChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIpCi0JCSAgJiYgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG8tPm91dHB1dF9zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkgICAgIChhYmZkLCBvLCAoUFRSKSBOVUxMLAotCQkJICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgICAgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgb2sgPSAoKmNoZWNrX3JlbG9jcykgKGFiZmQsIGluZm8sIG8sIGludGVybmFsX3JlbG9jcyk7Ci0KLQkgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCi0JICBpZiAoISBvaykKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bwotICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgdGhlIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgZHluYW1pYwotICAgICAgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgaW5mby0+dHJhZGl0aW9uYWxfZm9ybWF0Ci0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfZGVidWdnZXIpKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdGFiLCAqc3RhYnN0cjsKLQotICAgICAgc3RhYiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGlmIChzdGFiICE9IE5VTEwpCi0JewotCSAgc3RhYnN0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotCSAgaWYgKHN0YWJzdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2VjZGF0YTsKLQotCSAgICAgIHNlY2RhdGEgPSBlbGZfc2VjdGlvbl9kYXRhIChzdGFiKTsKLQkgICAgICBpZiAoISBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwKLQkJCQkJICAgICAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkJCSAgICAgc3RhYiwgc3RhYnN0ciwKLQkJCQkJICAgICAmc2VjZGF0YS0+c3RhYl9pbmZvKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIGlmIChkeW52ZXIgIT0gTlVMTCkKLSAgICBmcmVlIChkeW52ZXIpOwotICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0dmVyc3ltKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDcmVhdGUgc29tZSBzZWN0aW9ucyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGR5bmFtaWMgbGlua2luZwotICAgaW5mb3JtYXRpb24uICBBQkZEIGlzIGFuIGlucHV0IGZpbGUgd2hpY2ggcmVxdWlyZXMgZHluYW1pYyBzZWN0aW9ucwotICAgdG8gYmUgY3JlYXRlZC4gIFRoZSBkeW5hbWljIHNlY3Rpb25zIHRha2UgdXAgdmlydHVhbCBtZW1vcnkgc3BhY2UKLSAgIHdoZW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUgaXMgcnVuLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZQotICAgYWRkcmVzc2VzIGFyZSBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgV2Ugd29yayBvdXQgdGhlCi0gICBhY3R1YWwgY29udGVudHMgYW5kIHNpemUgb2YgdGhlc2Ugc2VjdGlvbnMgbGF0ZXIuICAqLwotCi1ib29sZWFuCi1lbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIGR5bmFtaWMgc2VjdGlvbnMgdXNlIHRoZSBzYW1lIGlucHV0IEJGRC4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgZWxzZQotICAgIGFiZmQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcgZm9yIGFsbCBvZiB0aGVzZQotICAgICBzZWN0aW9ucy4gICovCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCSAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgLyogQSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSBoYXMgYSAuaW50ZXJwIHNlY3Rpb24sIGJ1dCBhCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGRvZXMgbm90LiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmludGVycCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBzZWN0aW9ucyB0byBob2xkIHZlcnNpb24gaW5mb3JtYXRpb25zLiAgVGhlc2UgYXJlIHJlbW92ZWQKLSAgICAgaWYgdGhleSBhcmUgbm90IG5lZWRlZC4gICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX2QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX3IiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN5bSIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3RyIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSBhIHN0cnRhYiB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbCBuYW1lcy4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID0gZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3BlY2lhbCBzeW1ib2wgX0RZTkFNSUMgaXMgYWx3YXlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5keW5hbWljIHNlY3Rpb24uICBUaGlzIGNhbGwgb2NjdXJzIGJlZm9yZSB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUKLSAgICAgc3ltYm9scyBmb3IgYW55IGR5bmFtaWMgb2JqZWN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0Ci0gICAgIG92ZXJyaWRpbmcgYSBkeW5hbWljIGRlZmluaXRpb24uICBXZSBjb3VsZCBzZXQgX0RZTkFNSUMgaW4gYQotICAgICBsaW5rZXIgc2NyaXB0LCBidXQgd2Ugb25seSB3YW50IHRvIGRlZmluZSBpdCBpZiB3ZSBhcmUsIGluIGZhY3QsCi0gICAgIGNyZWF0aW5nIGEgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIGl0IGlmIHRoZXJlCi0gICAgIGlzIG5vIC5keW5hbWljIHNlY3Rpb24sIHNpbmNlIG9uIHNvbWUgRUxGIHBsYXRmb3JtcyB0aGUgc3RhcnQgdXAKLSAgICAgY29kZSBleGFtaW5lcyBpdCB0byBkZWNpZGUgaG93IHRvIGluaXRpYWxpemUgdGhlIHByb2Nlc3MuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JIChpbmZvLCBhYmZkLCAiX0RZTkFNSUMiLCBCU0ZfR0xPQkFMLCBzLCAoYmZkX3ZtYSkgMCwKLQkgIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuaGFzaCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfaGFzaF9lbnRyeTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgY3JlYXRlIHRoZSByZXN0IG9mIHRoZSBzZWN0aW9ucy4gIFRoaXMgbGV0cyB0aGUKLSAgICAgYmFja2VuZCBzZXQgdGhlIHJpZ2h0IGZsYWdzLiAgVGhlIGJhY2tlbmQgd2lsbCBub3JtYWxseSBjcmVhdGUKLSAgICAgdGhlIC5nb3QgYW5kIC5wbHQgc2VjdGlvbnMuICAqLwotICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYW4gZW50cnkgdG8gdGhlIC5keW5hbWljIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCB0YWcsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdGFnOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgc2l6ZV90IG5ld3NpemU7Ci0gIGJmZF9ieXRlICpuZXdjb250ZW50czsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgbmV3c2l6ZSA9IHMtPl9yYXdfc2l6ZSArIHNpemVvZiAoRWxmX0V4dGVybmFsX0R5bik7Ci0gIG5ld2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChzLT5jb250ZW50cywgbmV3c2l6ZSk7Ci0gIGlmIChuZXdjb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkeW4uZF90YWcgPSB0YWc7Ci0gIGR5bi5kX3VuLmRfdmFsID0gdmFsOwotICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sCi0JCSAgICAoRWxmX0V4dGVybmFsX0R5biAqKSAobmV3Y29udGVudHMgKyBzLT5fcmF3X3NpemUpKTsKLQotICBzLT5fcmF3X3NpemUgPSBuZXdzaXplOwotICBzLT5jb250ZW50cyA9IG5ld2NvbnRlbnRzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBuZXcgbG9jYWwgZHluYW1pYyBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1lbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfaW5keCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBsb25nIGlucHV0X2luZHg7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICplbnRyeTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKmVodDsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICBFbGZfRXh0ZXJuYWxfU3ltIGVzeW07Ci0gIHVuc2lnbmVkIGxvbmcgZHluc3RyX2luZGV4OwotICBjaGFyICpuYW1lOwotCi0gIC8qIFNlZSBpZiB0aGUgZW50cnkgZXhpc3RzIGFscmVhZHkuICAqLwotICBmb3IgKGVudHJ5ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbDsgZW50cnkgOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgIGlmIChlbnRyeS0+aW5wdXRfYmZkID09IGlucHV0X2JmZCAmJiBlbnRyeS0+aW5wdXRfaW5keCA9PSBpbnB1dF9pbmR4KQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgZW50cnkgPSAoc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKikKLSAgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwgc2l6ZW9mICgqZW50cnkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdvIGZpbmQgdGhlIHN5bWJvbCwgc28gdGhhdCB3ZSBjYW4gZmluZCBpdCdzIG5hbWUuICAqLwotICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwKLQkJKGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkci5zaF9vZmZzZXQKLQkJICsgaW5wdXRfaW5keCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgmZXN5bSwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgMSwgaW5wdXRfYmZkKQotCSAgIT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgJmVzeW0sICZlbnRyeS0+aXN5bSk7Ci0KLSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JICAoaW5wdXRfYmZkLCBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHIuc2hfbGluaywKLQkgICBlbnRyeS0+aXN5bS5zdF9uYW1lKSk7Ci0KLSAgZHluc3RyID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHI7Ci0gIGlmIChkeW5zdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bnN0cl9pbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZHluc3RyLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChkeW5zdHJfaW5kZXggPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgZW50cnktPmlzeW0uc3RfbmFtZSA9IGR5bnN0cl9pbmRleDsKLQotICBlaHQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgZW50cnktPm5leHQgPSBlaHQtPmR5bmxvY2FsOwotICBlaHQtPmR5bmxvY2FsID0gZW50cnk7Ci0gIGVudHJ5LT5pbnB1dF9iZmQgPSBpbnB1dF9iZmQ7Ci0gIGVudHJ5LT5pbnB1dF9pbmR4ID0gaW5wdXRfaW5keDsKLSAgZWh0LT5keW5zeW1jb3VudCsrOwotCi0gIC8qIFdoYXRldmVyIGJpbmRpbmcgdGhlIHN5bWJvbCBoYWQgYmVmb3JlLCBpdCdzIG5vdyBsb2NhbC4gICovCi0gIGVudHJ5LT5pc3ltLnN0X2luZm8KLSAgICA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIEVMRl9TVF9UWVBFIChlbnRyeS0+aXN5bS5zdF9pbmZvKSk7Ci0KLSAgLyogVGhlIGR5bmluZHggd2lsbCBiZSBzZXQgYXQgdGhlIGVuZCBvZiBzaXplX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZnJvbSB0aGUgc2VjdGlvbiBpbmRpY2F0ZWQgYnkgU0hEUi4gIFRoaXMKLSAgIG1heSBiZSBlaXRoZXIgYSBSRUwgb3IgYSBSRUxBIHNlY3Rpb24uICBUaGUgcmVsb2NhdGlvbnMgYXJlCi0gICB0cmFuc2xhdGVkIGludG8gUkVMQSByZWxvY2F0aW9ucyBhbmQgc3RvcmVkIGluIElOVEVSTkFMX1JFTE9DUywKLSAgIHdoaWNoIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgdG8gY29udGFpbiBlbm91Z2ggc3BhY2UuCi0gICBUaGUgRVhURVJOQUxfUkVMT0NTIGFyZSBhIGJ1ZmZlciB3aGVyZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUKLSAgIHJlbG9jYXRpb25zIHNob3VsZCBiZSBzdG9yZWQuCi0KLSAgIFJldHVybnMgZmFsc2UgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uIChhYmZkLCBzaGRyLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJICAgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzaGRyOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NhdGlvbnMsIHRoYXQncyBPSy4gICovCi0gIGlmICghc2hkcikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBQb3NpdGlvbiBvdXJzZWx2ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWFkIHRoZSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBzaGRyLT5zaF9zaXplLCBhYmZkKQotICAgICAgIT0gc2hkci0+c2hfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIENvbnZlcnQgdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zIHRvIHRoZSBpbnRlcm5hbCBmb3JtYXQuICAqLwotICBpZiAoc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsZW5kOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbCAqaXJlbDsKLQotICAgICAgZXJlbCA9IChFbGZfRXh0ZXJuYWxfUmVsICopIGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGVyZWxlbmQgPSBlcmVsICsgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7Ci0gICAgICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGlyZWwgPSBiZmRfYWxsb2MgKGFiZmQsIChiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsCi0JCQkgICAgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWwpKSk7Ci0gICAgICBmb3IgKDsgZXJlbCA8IGVyZWxlbmQ7IGVyZWwrKywgaXJlbGEgKz0gYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIGk7Ci0KLQkgIGlmIChiZWQtPnMtPnN3YXBfcmVsb2NfaW4pCi0JICAgICgqYmVkLT5zLT5zd2FwX3JlbG9jX2luKSAoYWJmZCwgKGJmZF9ieXRlICopIGVyZWwsIGlyZWwpOwotCSAgZWxzZQotCSAgICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgaXJlbCk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOyArK2kpCi0JICAgIHsKLQkgICAgICBpcmVsYVtpXS5yX29mZnNldCA9IGlyZWxbaV0ucl9vZmZzZXQ7Ci0JICAgICAgaXJlbGFbaV0ucl9pbmZvID0gaXJlbFtpXS5yX2luZm87Ci0JICAgICAgaXJlbGFbaV0ucl9hZGRlbmQgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYWVuZDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKLQotICAgICAgQkZEX0FTU0VSVCAoc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0KLSAgICAgIGVyZWxhID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGVyZWxhZW5kID0gZXJlbGEgKyBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yICg7IGVyZWxhIDwgZXJlbGFlbmQ7IGVyZWxhKyssIGlyZWxhICs9IGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWwpCi0JewotCSAgaWYgKGJlZC0+cy0+c3dhcF9yZWxvY2FfaW4pCi0JICAgICgqYmVkLT5zLT5zd2FwX3JlbG9jYV9pbikgKGFiZmQsIChiZmRfYnl0ZSAqKSBlcmVsYSwgaXJlbGEpOwotCSAgZWxzZQotCSAgICBlbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIGVyZWxhLCBpcmVsYSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gTy4gIFRoZXkgbWF5IGhhdmUgYmVlbgotICAgY2FjaGVkLiAgSWYgdGhlIEVYVEVSTkFMX1JFTE9DUyBhbmQgSU5URVJOQUxfUkVMT0NTIGFyZ3VtZW50cyBhcmUKLSAgIG5vdCBOVUxMLCB0aGV5IGFyZSB1c2VkIGFzIGJ1ZmZlcnMgdG8gcmVhZCBpbnRvLiAgVGhleSBhcmUga25vd24gdG8KLSAgIGJlIGxhcmdlIGVub3VnaC4gIElmIHRoZSBJTlRFUk5BTF9SRUxPQ1MgcmVsb2NzIGFyZ3VtZW50IGlzIE5VTEwsCi0gICB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsbG9jYXRlZCB1c2luZyBlaXRoZXIgbWFsbG9jIG9yIGJmZF9hbGxvYywKLSAgIGFjY29yZGluZyB0byB0aGUgS0VFUF9NRU1PUlkgYXJndW1lbnQuICBJZiBPIGhhcyB0d28gcmVsb2NhdGlvbgotICAgc2VjdGlvbnMgKGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zKSwgdGhlbiB0aGUgUkVMX0hEUgotICAgcmVsb2NhdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QgaW4gSU5URVJOQUxfUkVMT0NTLCBmb2xsb3dlZCBieSB0aGUKLSAgIFJFTF9IRFIyIHJlbG9jYXRpb25zLiAgKi8KLQotRWxmX0ludGVybmFsX1JlbGEgKgotTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKSAoYWJmZCwgbywgZXh0ZXJuYWxfcmVsb2NzLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJIGtlZXBfbWVtb3J5KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpvOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBib29sZWFuIGtlZXBfbWVtb3J5OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgUFRSIGFsbG9jMSA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICphbGxvYzIgPSBOVUxMOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzICE9IE5VTEwpCi0gICAgcmV0dXJuIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY3M7Ci0KLSAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLQotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IHNpemU7Ci0KLSAgICAgIHNpemUgPSAoby0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsIAotCSAgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpOwotICAgICAgaWYgKGtlZXBfbWVtb3J5KQotCWludGVybmFsX3JlbG9jcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgZWxzZQotCWludGVybmFsX3JlbG9jcyA9IGFsbG9jMiA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZTsKLQotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMikKLQlzaXplICs9IChzaXplX3QpIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMi0+c2hfc2l6ZTsKLSAgICAgIGFsbG9jMSA9IChQVFIpIGJmZF9tYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGFsbG9jMSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gYWxsb2MxOwotICAgIH0KLQotICBpZiAoIWVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbiAoYWJmZCwgcmVsX2hkciwKLQkJCQkJICBleHRlcm5hbF9yZWxvY3MsCi0JCQkJCSAgaW50ZXJuYWxfcmVsb2NzKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCFlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gCi0gICAgICAoYWJmZCwgCi0gICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLAotICAgICAgICgoYmZkX2J5dGUgKikgZXh0ZXJuYWxfcmVsb2NzKSArIHJlbF9oZHItPnNoX3NpemUsCi0gICAgICAgaW50ZXJuYWxfcmVsb2NzICsgKHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplCi0JCQkgICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciBuZXh0IHRpbWUsIGlmIHdlIGNhbi4gICovCi0gIGlmIChrZWVwX21lbW9yeSkKLSAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotCi0gIC8qIERvbid0IGZyZWUgYWxsb2MyLCBzaW5jZSBpZiBpdCB3YXMgYWxsb2NhdGVkIHdlIGFyZSBwYXNzaW5nIGl0Ci0gICAgIGJhY2sgKHVuZGVyIHRoZSBuYW1lIG9mIGludGVybmFsX3JlbG9jcykuICAqLwotCi0gIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotICBpZiAoYWxsb2MyICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MyKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IHRvIGEgc3ltYm9sIG1hZGUgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1OQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUsIHByb3ZpZGUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBwcm92aWRlOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgYW5kIGl0IGlzCi0gICAgIGN1cnJlbnRseSBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGJ1dCBub3QgYnkgYSByZWd1bGFyCi0gICAgIG9iamVjdCwgdGhlbiBtYXJrIGl0IGFzIHVuZGVmaW5lZCBzbyB0aGF0IHRoZSBnZW5lcmljIGxpbmtlciB3aWxsCi0gICAgIGZvcmNlIHRoZSBjb3JyZWN0IHZhbHVlLiAgKi8KLSAgaWYgKHByb3ZpZGUKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyBwcm92aWRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgYW5kIGl0IGlzCi0gICAgIGN1cnJlbnRseSBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGJ1dCBub3QgYnkgYSByZWd1bGFyIG9iamVjdCwKLSAgICAgdGhlbiBjbGVhciBvdXQgYW55IHZlcnNpb24gaW5mb3JtYXRpb24gYmVjYXVzZSB0aGUgc3ltYm9sIHdpbGwgbm90IGJlCi0gICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHluYW1pYyBvYmplY3QgYW55IG1vcmUuICAqLwotICBpZiAoIXByb3ZpZGUKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIGgtPnZlcmluZm8udmVyZGVmID0gTlVMTDsKLQotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0KLSAgLyogV2hlbiBwb3NzaWJsZSwga2VlcCB0aGUgb3JpZ2luYWwgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0gIGlmIChoLT50eXBlID09IFNUVF9OT1RZUEUpCi0gICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKCgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICB8IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpKSAhPSAwCi0gICAgICAgfHwgaW5mby0+c2hhcmVkKQotICAgICAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbmVkIHN5bWJvbCwgYW5kIHdlIGtub3cgYSBjb3JyZXNwb25kaW5nCi0JIHJlYWwgc3ltYm9sIGZyb20gdGhlIHNhbWUgZHluYW1pYyBvYmplY3QsIG1ha2Ugc3VyZSB0aGUgcmVhbAotCSBzeW1ib2wgaXMgYWxzbyBtYWRlIGludG8gYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoLT53ZWFrZGVmKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbi4gICovCi0KLXN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8KLXsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIFZlcnNpb24gdHJlZS4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyZGVmczsKLSAgLyogV2hldGhlciB3ZSBhcmUgZXhwb3J0aW5nIGFsbCBkeW5hbWljIHN5bWJvbHMuICAqLwotICBib29sZWFuIGV4cG9ydF9keW5hbWljOwotICAvKiBXaGV0aGVyIHdlIGhhZCBhIGZhaWx1cmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcy4gICovCi0KLXN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbwotewotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgdmVyczsKLSAgLyogV2hldGhlciB3ZSBoYWQgYSBmYWlsdXJlLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi0vKiBBcnJheSB1c2VkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGhhc2ggdGFibGUgYnVja2V0cyB0byB1c2UKLSAgIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0aGVyZSBhcmUuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgotICAgMyBzeW1ib2xzIHdlIHVzZSAxIGJ1Y2tldCwgZmV3ZXIgdGhhbiAxNyBzeW1ib2xzIHdlIHVzZSAzIGJ1Y2tldHMsCi0gICBmZXdlciB0aGFuIDM3IHdlIHVzZSAxNyBidWNrZXRzLCBhbmQgc28gZm9ydGguICBXZSBuZXZlciB1c2UgbW9yZQotICAgdGhhbiAzMjc3MSBidWNrZXRzLiAgKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBlbGZfYnVja2V0c1tdID0KLXsKLSAgMSwgMywgMTcsIDM3LCA2NywgOTcsIDEzMSwgMTk3LCAyNjMsIDUyMSwgMTAzMSwgMjA1MywgNDA5OSwgODIwOSwKLSAgMTY0MTEsIDMyNzcxLCAwCi19OwotCi0vKiBDb21wdXRlIGJ1Y2tldCBjb3VudCBmb3IgaGFzaGluZyB0YWJsZS4gIFdlIGRvIG5vdCB1c2UgYSBzdGF0aWMgc2V0Ci0gICBvZiBwb3NzaWJsZSB0YWJsZXMgc2l6ZXMgYW55bW9yZS4gIEluc3RlYWQgd2UgZGV0ZXJtaW5lIGZvciBhbGwKLSAgIHBvc3NpYmxlIHJlYXNvbmFibGUgc2l6ZXMgb2YgdGhlIHRhYmxlIHRoZSBvdXRjb21lIChpLmUuLCB0aGUKLSAgIG51bWJlciBvZiBjb2xsaXNpb25zIGV0YykgYW5kIGNob29zZSB0aGUgYmVzdCBzb2x1dGlvbi4gIFRoZQotICAgd2VpZ2h0aW5nIGZ1bmN0aW9ucyBhcmUgbm90IHRvbyBzaW1wbGUgdG8gYWxsb3cgdGhlIHRhYmxlIHRvIGdyb3cKLSAgIHdpdGhvdXQgYm91bmRzLiAgSW5zdGVhZCBvbmUgb2YgdGhlIHdlaWdodGluZyBmYWN0b3JzIGlzIHRoZSBzaXplLgotICAgVGhlcmVmb3JlIHRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZ29vZCBwYXlvZmYgYmV0d2VlbiBmZXcgY29sbGlzaW9ucwotICAgKD0gc2hvcnQgY2hhaW4gbGVuZ3RocykgYW5kIHRhYmxlIHNpemUuICAqLwotc3RhdGljIHNpemVfdAotY29tcHV0ZV9idWNrZXRfY291bnQgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzaXplX3QgZHluc3ltY291bnQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICBzaXplX3QgYmVzdF9zaXplID0gMDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2RlczsKLSAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2Rlc3A7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIGFsbCBleHBvcnRlZCBzeW1ib2xzLiAgQXQgdGhlIHNhbWUKLSAgICAgdGltZSBzdG9yZSB0aGUgdmFsdWVzIGluIGFuIGFycmF5IHNvIHRoYXQgd2UgY291bGQgdXNlIHRoZW0gZm9yCi0gICAgIG9wdGltaXphdGlvbnMuICAqLwotICBoYXNoY29kZXMgPSAodW5zaWduZWQgbG9uZyBpbnQgKikgYmZkX21hbGxvYyAoZHluc3ltY291bnQKLQkJCQkJCSogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOwotICBpZiAoaGFzaGNvZGVzID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIGhhc2hjb2Rlc3AgPSBoYXNoY29kZXM7Ci0KLSAgLyogUHV0IGFsbCBoYXNoIHZhbHVlcyBpbiBIQVNIQ09ERVMuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9jb2xsZWN0X2hhc2hfY29kZXMsICZoYXNoY29kZXNwKTsKLQotLyogV2UgaGF2ZSBhIHByb2JsZW0gaGVyZS4gIFRoZSBmb2xsb3dpbmcgY29kZSB0byBvcHRpbWl6ZSB0aGUgdGFibGUKLSAgIHNpemUgcmVxdWlyZXMgYW4gaW50ZWdlciB0eXBlIHdpdGggbW9yZSB0aGUgMzIgYml0cy4gIElmCi0gICBCRkRfSE9TVF9VXzY0X0JJVCBpcyBzZXQgd2Uga25vdyBhYm91dCBzdWNoIGEgdHlwZS4gICovCi0jaWZkZWYgQkZEX0hPU1RfVV82NF9CSVQKLSAgaWYgKGluZm8tPm9wdGltaXplID09IHRydWUpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbnN5bXMgPSBoYXNoY29kZXNwIC0gaGFzaGNvZGVzOwotICAgICAgc2l6ZV90IG1pbnNpemU7Ci0gICAgICBzaXplX3QgbWF4c2l6ZTsKLSAgICAgIEJGRF9IT1NUX1VfNjRfQklUIGJlc3RfY2hsZW4gPSB+KChCRkRfSE9TVF9VXzY0X0JJVCkgMCk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCAqY291bnRzIDsKLQotICAgICAgLyogUG9zc2libGUgb3B0aW1pemF0aW9uIHBhcmFtZXRlcnM6IGlmIHdlIGhhdmUgTlNZTVMgc3ltYm9scyB3ZSBzYXkKLQkgdGhhdCB0aGUgaGFzaGluZyB0YWJsZSBtdXN0IGF0IGxlYXN0IGhhdmUgTlNZTVMvNCBhbmQgYXQgbW9zdAotCSAyKk5TWU1TIGJ1Y2tldHMuICAqLwotICAgICAgbWluc2l6ZSA9IG5zeW1zIC8gNDsKLSAgICAgIGlmIChtaW5zaXplID09IDApCi0JbWluc2l6ZSA9IDE7Ci0gICAgICBiZXN0X3NpemUgPSBtYXhzaXplID0gbnN5bXMgKiAyOwotCi0gICAgICAvKiBDcmVhdGUgYXJyYXkgd2hlcmUgd2UgY291bnQgdGhlIGNvbGxpc2lvbnMgaW4uICBXZSBtdXN0IHVzZSBiZmRfbWFsbG9jCi0JIHNpbmNlIHRoZSBzaXplIGNvdWxkIGJlIGxhcmdlLiAgKi8KLSAgICAgIGNvdW50cyA9ICh1bnNpZ25lZCBsb25nIGludCAqKSBiZmRfbWFsbG9jIChtYXhzaXplCi0JCQkJCQkgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSk7Ci0gICAgICBpZiAoY291bnRzID09IE5VTEwpCi0JewotCSAgZnJlZSAoaGFzaGNvZGVzKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ29tcHV0ZSB0aGUgIm9wdGltYWwiIHNpemUgZm9yIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGNyaXRlcmlhIGlzIGEKLQkgbWluaW1hbCBjaGFpbiBsZW5ndGguICBUaGUgbWlub3IgY3JpdGVyaWEgaXMgKG9mIGNvdXJzZSkgdGhlIHNpemUKLQkgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGZvciAoaSA9IG1pbnNpemU7IGkgPCBtYXhzaXplOyArK2kpCi0JewotCSAgLyogV2FsayB0aHJvdWdoIHRoZSBhcnJheSBvZiBoYXNoY29kZXMgYW5kIGNvdW50IHRoZSBjb2xsaXNpb25zLiAgKi8KLQkgIEJGRF9IT1NUX1VfNjRfQklUIG1heDsKLQkgIHVuc2lnbmVkIGxvbmcgaW50IGo7Ci0JICB1bnNpZ25lZCBsb25nIGludCBmYWN0OwotCi0JICBtZW1zZXQgKGNvdW50cywgJ1wwJywgaSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKTsKLQotCSAgLyogRGV0ZXJtaW5lIGhvdyBvZnRlbiBlYWNoIGhhc2ggYnVja2V0IGlzIHVzZWQuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyArK2opCi0JICAgICsrY291bnRzW2hhc2hjb2Rlc1tqXSAlIGldOwotCi0JICAvKiBGb3IgdGhlIHdlaWdodCBmdW5jdGlvbiB3ZSBuZWVkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICAgICBwYWdlc2l6ZSBvbiB0aGUgdGFyZ2V0LiAgVGhpcyBpcyBpbmZvcm1hdGlvbiBuZWVkIG5vdCBiZSAxMDAlCi0JICAgICBhY2N1cmF0ZS4gIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSAoc28gZmFyKSB3ZQotCSAgICAgZGVmaW5lIGl0IGhlcmUgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuICBJZiBpdCBpcyBjcnVjaWFsCi0JICAgICB0byBoYXZlIGEgYmV0dGVyIHZhbHVlIHNvbWUgZGF5IHNpbXBseSBkZWZpbmUgdGhpcyB2YWx1ZS4gICovCi0jIGlmbmRlZiBCRkRfVEFSR0VUX1BBR0VTSVpFCi0jICBkZWZpbmUgQkZEX1RBUkdFVF9QQUdFU0laRQkoNDA5NikKLSMgZW5kaWYKLQotCSAgLyogV2UgaW4gYW55IGNhc2UgbmVlZCAyICsgTlNZTVMgZW50cmllcyBmb3IgdGhlIHNpemUgdmFsdWVzIGFuZAotCSAgICAgdGhlIGNoYWlucy4gICovCi0JICBtYXggPSAoMiArIG5zeW1zKSAqIChBUkNIX1NJWkUgLyA4KTsKLQotIyBpZiAxCi0JICAvKiBWYXJpYW50IDE6IG9wdGltaXplIGZvciBzaG9ydCBjaGFpbnMuICBXZSBhZGQgdGhlIHNxdWFyZXMKLQkgICAgIG9mIGFsbCB0aGUgY2hhaW4gbGVuZ3RocyAod2hpY2ggZmF2b3VzIG1hbnkgc21hbGwgY2hhaW4KLQkgICAgIG92ZXIgYSBmZXcgbG9uZyBjaGFpbnMpLiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBpOyArK2opCi0JICAgIG1heCArPSBjb3VudHNbal0gKiBjb3VudHNbal07Ci0KLQkgIC8qIFRoaXMgYWRkcyBwZW5hbHRpZXMgZm9yIHRoZSBvdmVyYWxsIHNpemUgb2YgdGhlIHRhYmxlLiAgKi8KLQkgIGZhY3QgPSBpIC8gKEJGRF9UQVJHRVRfUEFHRVNJWkUgLyAoQVJDSF9TSVpFIC8gOCkpICsgMTsKLQkgIG1heCAqPSBmYWN0ICogZmFjdDsKLSMgZWxzZQotCSAgLyogVmFyaWFudCAyOiBPcHRpbWl6ZSBhIGxvdCBtb3JlIGZvciBzbWFsbCB0YWJsZS4gIEhlcmUgd2UKLQkgICAgIGFsc28gYWRkIHNxdWFyZXMgb2YgdGhlIHNpemUgYnV0IHdlIGFsc28gYWRkIHBlbmFsdGllcyBmb3IKLQkgICAgIGVtcHR5IHNsb3RzICh0aGUgKzEgdGVybSkuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKLQkgICAgbWF4ICs9ICgxICsgY291bnRzW2pdKSAqICgxICsgY291bnRzW2pdKTsKLQotCSAgLyogVGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgdGFibGUgaXMgY29uc2lkZXJlZCwgYnV0IG5vdCBhcwotCSAgICAgc3Ryb25nIGFzIGluIHZhcmlhbnQgMSwgd2hlcmUgaXQgaXMgc3F1YXJlZC4gICovCi0JICBmYWN0ID0gaSAvIChCRkRfVEFSR0VUX1BBR0VTSVpFIC8gKEFSQ0hfU0laRSAvIDgpKSArIDE7Ci0JICBtYXggKj0gZmFjdDsKLSMgZW5kaWYKLQotCSAgLyogQ29tcGFyZSB3aXRoIGN1cnJlbnQgYmVzdCByZXN1bHRzLiAgKi8KLQkgIGlmIChtYXggPCBiZXN0X2NobGVuKQotCSAgICB7Ci0JICAgICAgYmVzdF9jaGxlbiA9IG1heDsKLQkgICAgICBiZXN0X3NpemUgPSBpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcmVlIChjb3VudHMpOwotICAgIH0KLSAgZWxzZQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9IT1NUX1VfNjRfQklUKSAqLwotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIGZhbGxiYWNrIHNvbHV0aW9uIGlmIG5vIDY0Yml0IHR5cGUgaXMgYXZhaWxhYmxlIG9yIGlmIHdlCi0JIGFyZSBub3Qgc3VwcG9zZWQgdG8gc3BlbmQgbXVjaCB0aW1lIG9uIG9wdGltaXphdGlvbnMuICBXZSBzZWxlY3QgdGhlCi0JIGJ1Y2tldCBjb3VudCB1c2luZyBhIGZpeGVkIHNldCBvZiBudW1iZXJzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGVsZl9idWNrZXRzW2ldICE9IDA7IGkrKykKLQl7Ci0JICBiZXN0X3NpemUgPSBlbGZfYnVja2V0c1tpXTsKLQkgIGlmIChkeW5zeW1jb3VudCA8IGVsZl9idWNrZXRzW2kgKyAxXSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBGcmVlIHRoZSBhcnJheXMgd2UgbmVlZGVkLiAgKi8KLSAgZnJlZSAoaGFzaGNvZGVzKTsKLQotICByZXR1cm4gYmVzdF9zaXplOwotfQotCi0vKiBTZXQgdXAgdGhlIHNpemVzIGFuZCBjb250ZW50cyBvZiB0aGUgRUxGIGR5bmFtaWMgc2VjdGlvbnMuICBUaGlzIGlzCi0gICBjYWxsZWQgYnkgdGhlIEVMRiBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZQotICAgbXVzdCBzZXQgdGhlIHNpemVzIG9mIHRoZSBzZWN0aW9ucyBiZWZvcmUgdGhlIGxpbmtlciBzZXRzIHRoZQotICAgYWRkcmVzc2VzIG9mIHRoZSB2YXJpb3VzIHNlY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykgKG91dHB1dF9iZmQsIHNvbmFtZSwgcnBhdGgsCi0JCQkJICAgICBleHBvcnRfZHluYW1pYywgZmlsdGVyX3NobGliLAotCQkJCSAgICAgYXV4aWxpYXJ5X2ZpbHRlcnMsIGluZm8sIHNpbnRlcnBwdHIsCi0JCQkJICAgICB2ZXJkZWZzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcnBhdGg7Ci0gICAgIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9zaGxpYjsKLSAgICAgY29uc3QgY2hhciAqIGNvbnN0ICphdXhpbGlhcnlfZmlsdGVyczsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICoqc2ludGVycHB0cjsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJkZWZzOwotewotICBiZmRfc2l6ZV90eXBlIHNvbmFtZV9pbmR4OwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLSAgc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyBhc3ZpbmZvOwotCi0gICpzaW50ZXJwcHRyID0gTlVMTDsKLQotICBzb25hbWVfaW5keCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZSBiYWNrZW5kIG1heSBoYXZlIHRvIGNyZWF0ZSBzb21lIHNlY3Rpb25zIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICAgICB3ZSdyZSBkeW5hbWljIG9yIG5vdC4gICovCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKTsKLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgICAgICYmICEgKCpiZWQtPmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIElmIHRoZXJlIHdlcmUgbm8gZHluYW1pYyBvYmplY3RzIGluIHRoZSBsaW5rLCB0aGVyZSBpcyBub3RoaW5nIHRvCi0gICAgIGRvIGhlcmUuICAqLwotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgYXJlIHN1cHBvc2VkIHRvIGV4cG9ydCBhbGwgc3ltYm9scyBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbAotICAgICB0YWJsZSAodGhpcyBpcyBub3QgdGhlIG5vcm1hbCBjYXNlKSwgdGhlbiBkbyBzby4gICovCi0gIGlmIChleHBvcnRfZHluYW1pYykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkIGVpZjsKLQotICAgICAgZWlmLmZhaWxlZCA9IGZhbHNlOwotICAgICAgZWlmLmluZm8gPSBpbmZvOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfZXhwb3J0X3N5bWJvbCwKLQkJCSAgICAgIChQVFIpICZlaWYpOwotICAgICAgaWYgKGVpZi5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCBlaWY7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3Ryc2l6ZTsKLQotICAgICAgKnNpbnRlcnBwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotICAgICAgQkZEX0FTU0VSVCAoKnNpbnRlcnBwdHIgIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpOwotCi0gICAgICBpZiAoc29uYW1lICE9IE5VTEwpCi0JewotCSAgc29uYW1lX2luZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgc29uYW1lLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChzb25hbWVfaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU09OQU1FLCBzb25hbWVfaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5zeW1ib2xpYykKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NZTUJPTElDLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJwYXRoICE9IE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwgcnBhdGgsCi0JCQkJICAgICB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMQotCSAgICAgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SUEFUSCwgaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChmaWx0ZXJfc2hsaWIgIT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCSAgICAgZmlsdGVyX3NobGliLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMQotCSAgICAgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9GSUxURVIsIGluZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYXV4aWxpYXJ5X2ZpbHRlcnMgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICogY29uc3QgKnA7Ci0KLQkgIGZvciAocCA9IGF1eGlsaWFyeV9maWx0ZXJzOyAqcCAhPSBOVUxMOyBwKyspCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICpwLCB0cnVlLCB0cnVlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkJICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfQVVYSUxJQVJZLCBpbmR4KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBdHRhY2ggYWxsIHRoZSBzeW1ib2xzIHRvIHRoZWlyIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICAgICAgYXN2aW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLSAgICAgIGFzdmluZm8uaW5mbyA9IGluZm87Ci0gICAgICBhc3ZpbmZvLnZlcmRlZnMgPSB2ZXJkZWZzOwotICAgICAgYXN2aW5mby5leHBvcnRfZHluYW1pYyA9IGV4cG9ydF9keW5hbWljOwotICAgICAgYXN2aW5mby5mYWlsZWQgPSBmYWxzZTsKLQotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uLAotCQkJICAgICAgKFBUUikgJmFzdmluZm8pOwotICAgICAgaWYgKGFzdmluZm8uZmFpbGVkKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRmluZCBhbGwgc3ltYm9scyB3aGljaCB3ZXJlIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCBhbmQgbWFrZQotCSB0aGUgYmFja2VuZCBwaWNrIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IgdGhlbS4gICovCi0gICAgICBlaWYuZmFpbGVkID0gZmFsc2U7Ci0gICAgICBlaWYuaW5mbyA9IGluZm87Ci0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotCQkJICAgICAgKFBUUikgJmVpZik7Ci0gICAgICBpZiAoZWlmLmZhaWxlZCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHNvbWUgb2YgdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmX2JmZF9maW5hbF9saW5rLCBidXQgd2UgbXVzdCBhZGQgdGhlIGVudHJpZXMKLQkgbm93IHNvIHRoYXQgd2Uga25vdyB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gICovCi0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBpbml0aWFsaXphdGlvbiBhbmQvb3IgZmluYWxpemF0aW9uIGZ1bmN0aW9ucyB0bwotCSBjYWxsIHRoZW4gYWRkIHRoZSBjb3JyZXNwb25kaW5nIERUX0lOSVQvRFRfRklOSSBlbnRyaWVzLiAgKi8KLSAgICAgIGggPSAoaW5mby0+aW5pdF9mdW5jdGlvbgotCSAgID8gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgaW5mby0+aW5pdF9mdW5jdGlvbiwgZmFsc2UsCi0JCQkJICAgZmFsc2UsIGZhbHNlKQotCSAgIDogTlVMTCk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJCXwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpICE9IDApCi0JewotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9JTklULCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGggPSAoaW5mby0+ZmluaV9mdW5jdGlvbgotCSAgID8gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgaW5mby0+ZmluaV9mdW5jdGlvbiwgZmFsc2UsCi0JCQkJICAgZmFsc2UsIGZhbHNlKQotCSAgIDogTlVMTCk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJCXwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpICE9IDApCi0JewotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9GSU5JLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc3Ryc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKLSAgICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSEFTSCwgMCkKLQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TVFJUQUIsIDApCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1lNVEFCLCAwKQotCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NUUlNaLCBzdHJzaXplKQotCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NZTUVOVCwKLQkJCQkgICAgICBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBiYWNrZW5kIG11c3Qgd29yayBvdXQgdGhlIHNpemVzIG9mIGFsbCB0aGUgb3RoZXIgZHluYW1pYwotICAgICBzZWN0aW9ucy4gICovCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwotICAgICAgJiYgISAoKmJlZC0+ZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBzaXplX3QgZHluc3ltY291bnQ7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIHNpemVfdCBidWNrZXRjb3VudCA9IDA7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0gICAgICBzaXplX3QgaGFzaF9lbnRyeV9zaXplOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uX2QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgYWRkaXRpb25hbCB2ZXJzaW9uIGRlZmluaXRpb25zIGlmIHdlIGFyZQotICAgICAgICAganVzdCBsaW5raW5nIGEgcmVndWxhciBhcHBsaWNhdGlvbi4gICovCi0gICAgICB2ZXJkZWZzID0gYXN2aW5mby52ZXJkZWZzOwotCi0gICAgICBpZiAodmVyZGVmcyA9PSBOVUxMKQotCV9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGNkZWZzOwotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp0OwotCSAgYmZkX2J5dGUgKnA7Ci0JICBFbGZfSW50ZXJuYWxfVmVyZGVmIGRlZjsKLQkgIEVsZl9JbnRlcm5hbF9WZXJkYXV4IGRlZmF1eDsKLQotCSAgY2RlZnMgPSAwOwotCSAgc2l6ZSA9IDA7Ci0KLQkgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSBiYXNlIHZlcnNpb24uICAqLwotCSAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICsrY2RlZnM7Ci0KLQkgIGZvciAodCA9IHZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm47Ci0KLQkgICAgICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICAgICAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgICArK2NkZWZzOwotCi0JICAgICAgZm9yIChuID0gdC0+ZGVwczsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgfQotCi0JICBzLT5fcmF3X3NpemUgPSBzaXplOwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogRmlsbCBpbiB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24uICAqLwotCi0JICBwID0gcy0+Y29udGVudHM7Ci0KLQkgIGRlZi52ZF92ZXJzaW9uID0gVkVSX0RFRl9DVVJSRU5UOwotCSAgZGVmLnZkX2ZsYWdzID0gVkVSX0ZMR19CQVNFOwotCSAgZGVmLnZkX25keCA9IDE7Ci0JICBkZWYudmRfY250ID0gMTsKLQkgIGRlZi52ZF9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgZGVmLnZkX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKQotCQkJICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCkpOwotCi0JICBpZiAoc29uYW1lX2luZHggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICB7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKHNvbmFtZSk7Ci0JICAgICAgZGVmYXV4LnZkYV9uYW1lID0gc29uYW1lX2luZHg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgbmFtZSA9IG91dHB1dF9iZmQtPmZpbGVuYW1lOwotCSAgICAgIGRlZi52ZF9oYXNoID0gYmZkX2VsZl9oYXNoIChuYW1lKTsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgIG5hbWUsIHRydWUsIGZhbHNlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBpbmR4OwotCSAgICB9Ci0JICBkZWZhdXgudmRhX25leHQgPSAwOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQgKG91dHB1dF9iZmQsICZkZWYsCi0JCQkJICAgIChFbGZfRXh0ZXJuYWxfVmVyZGVmICopcCk7Ci0JICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCSAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCSAgZm9yICh0ID0gdmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBjZGVwczsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm47Ci0JICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBjZGVwcyA9IDA7Ci0JICAgICAgZm9yIChuID0gdC0+ZGVwczsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJKytjZGVwczsKLQotCSAgICAgIC8qIEFkZCBhIHN5bWJvbCByZXByZXNlbnRpbmcgdGhpcyB2ZXJzaW9uLiAgKi8KLQkgICAgICBoID0gTlVMTDsKLQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJICAgICAoaW5mbywgZHlub2JqLCB0LT5uYW1lLCBCU0ZfR0xPQkFMLCBiZmRfYWJzX3NlY3Rpb25fcHRyLAotCQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopLT5jb2xsZWN0LAotCQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH4gRUxGX0xJTktfTk9OX0VMRjsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICAgICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0JICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQotCSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZGVmLnZkX3ZlcnNpb24gPSBWRVJfREVGX0NVUlJFTlQ7Ci0JICAgICAgZGVmLnZkX2ZsYWdzID0gMDsKLQkgICAgICBpZiAodC0+Z2xvYmFscyA9PSBOVUxMICYmIHQtPmxvY2FscyA9PSBOVUxMICYmICEgdC0+dXNlZCkKLQkJZGVmLnZkX2ZsYWdzIHw9IFZFUl9GTEdfV0VBSzsKLQkgICAgICBkZWYudmRfbmR4ID0gdC0+dmVybnVtICsgMTsKLQkgICAgICBkZWYudmRfY250ID0gY2RlcHMgKyAxOwotCSAgICAgIGRlZi52ZF9oYXNoID0gYmZkX2VsZl9oYXNoICh0LT5uYW1lKTsKLQkgICAgICBkZWYudmRfYXV4ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgICAgICBpZiAodC0+bmV4dCAhPSBOVUxMKQotCQlkZWYudmRfbmV4dCA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpCi0JCQkgICAgICAgKyAoY2RlcHMgKyAxKSAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpKTsKLQkgICAgICBlbHNlCi0JCWRlZi52ZF9uZXh0ID0gMDsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAob3V0cHV0X2JmZCwgJmRlZiwKLQkJCQkJKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgcCk7Ci0JICAgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCi0JICAgICAgZGVmYXV4LnZkYV9uYW1lID0gaC0+ZHluc3RyX2luZGV4OwotCSAgICAgIGlmICh0LT5kZXBzID09IE5VTEwpCi0JCWRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0JICAgICAgZWxzZQotCQlkZWZhdXgudmRhX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgICB0LT5uYW1lX2luZHggPSBkZWZhdXgudmRhX25hbWU7Ci0KLQkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCQkgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCSAgICAgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0KLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQl7Ci0JCSAgaWYgKG4tPnZlcnNpb25fbmVlZGVkID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlCi0JCQkgdmVyc2lvbiBzY3JpcHQuICAqLwotCQkgICAgICBkZWZhdXgudmRhX25hbWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGRlZmF1eC52ZGFfbmFtZSA9IG4tPnZlcnNpb25fbmVlZGVkLT5uYW1lX2luZHg7Ci0JCSAgaWYgKG4tPm5leHQgPT0gTlVMTCkKLQkJICAgIGRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0JCSAgZWxzZQotCQkgICAgZGVmYXV4LnZkYV9uZXh0ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0KLQkJICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCQkgICAgIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSBwKTsKLQkJICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJERUYsIDApCi0JICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUkRFRk5VTSwgY2RlZnMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJkZWZzID0gY2RlZnM7Ci0JfQotCi0gICAgICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgdmVyc2lvbiByZWZlcmVuY2Ugc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uX3IiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICB7Ci0Jc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvIHNpbmZvOwotCi0Jc2luZm8ub3V0cHV0X2JmZCA9IG91dHB1dF9iZmQ7Ci0Jc2luZm8uaW5mbyA9IGluZm87Ci0Jc2luZm8udmVycyA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJkZWZzOwotCWlmIChzaW5mby52ZXJzID09IDApCi0JICBzaW5mby52ZXJzID0gMTsKLQlzaW5mby5mYWlsZWQgPSBmYWxzZTsKLQotCWVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQllbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzLAotCQkJCShQVFIpICZzaW5mbyk7Ci0KLQlpZiAoZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmID09IE5VTEwpCi0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOwotCWVsc2UKLQkgIHsKLQkgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7Ci0JICAgIHVuc2lnbmVkIGludCBzaXplOwotCSAgICB1bnNpZ25lZCBpbnQgY3JlZnM7Ci0JICAgIGJmZF9ieXRlICpwOwotCi0JICAgIC8qIEJ1aWxkIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0JICAgIHNpemUgPSAwOwotCSAgICBjcmVmcyA9IDA7Ci0JICAgIGZvciAodCA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZjsKLQkJIHQgIT0gTlVMTDsKLQkJIHQgPSB0LT52bl9uZXh0cmVmKQotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkJc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKLQkJKytjcmVmczsKLQkJZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQkJICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5hdXgpOwotCSAgICAgIH0KLQotCSAgICBzLT5fcmF3X3NpemUgPSBzaXplOwotCSAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHNpemUpOwotCSAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgcCA9IHMtPmNvbnRlbnRzOwotCSAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWY7Ci0JCSB0ICE9IE5VTEw7Ci0JCSB0ID0gdC0+dm5fbmV4dHJlZikKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBjYXV4OwotCQlFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQkJYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JCWNhdXggPSAwOwotCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgICsrY2F1eDsKLQotCQl0LT52bl92ZXJzaW9uID0gVkVSX05FRURfQ1VSUkVOVDsKLQkJdC0+dm5fY250ID0gY2F1eDsKLQkJaWYgKGVsZl9kdF9uYW1lICh0LT52bl9iZmQpICE9IE5VTEwpCi0JCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAgICAgZWxmX2R0X25hbWUgKHQtPnZuX2JmZCksCi0JCQkJCSAgICAgdHJ1ZSwgZmFsc2UpOwotCQllbHNlCi0JCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAgICAgdC0+dm5fYmZkLT5maWxlbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCQlpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQl0LT52bl9maWxlID0gaW5keDsKLQkJdC0+dm5fYXV4ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCk7Ci0JCWlmICh0LT52bl9uZXh0cmVmID09IE5VTEwpCi0JCSAgdC0+dm5fbmV4dCA9IDA7Ci0JCWVsc2UKLQkJICB0LT52bl9uZXh0ID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpCi0JCQkJKyBjYXV4ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCkpOwotCi0JCV9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQgKG91dHB1dF9iZmQsIHQsCi0JCQkJCSAgIChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSBwKTsKLQkJcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKLQotCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgIHsKLQkJICAgIGEtPnZuYV9oYXNoID0gYmZkX2VsZl9oYXNoIChhLT52bmFfbm9kZW5hbWUpOwotCQkgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAgICAgICBhLT52bmFfbm9kZW5hbWUsIHRydWUsIGZhbHNlKTsKLQkJICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgYS0+dm5hX25hbWUgPSBpbmR4OwotCQkgICAgaWYgKGEtPnZuYV9uZXh0cHRyID09IE5VTEwpCi0JCSAgICAgIGEtPnZuYV9uZXh0ID0gMDsKLQkJICAgIGVsc2UKLQkJICAgICAgYS0+dm5hX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KTsKLQotCQkgICAgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCAob3V0cHV0X2JmZCwgYSwKLQkJCQkJICAgICAgIChFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKSBwKTsKLQkJICAgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUk5FRUQsIDApCi0JCXx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJORUVETlVNLCBjcmVmcykpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJyZWZzID0gY3JlZnM7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIEFzc2lnbiBkeW5zeW0gaW5kaWNpZXMuICBJbiBhIHNoYXJlZCBsaWJyYXJ5IHdlIGdlbmVyYXRlIGEgCi0JIHNlY3Rpb24gc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLCB3aGljaCBjb21lIGZpcnN0LgotCSBOZXh0IGNvbWUgYWxsIG9mIHRoZSBiYWNrLWVuZCBhbGxvY2F0ZWQgbG9jYWwgZHluYW1pYyBzeW1zLAotCSBmb2xsb3dlZCBieSB0aGUgcmVzdCBvZiB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLwotCi0gICAgICBkeW5zeW1jb3VudCA9IF9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyAob3V0cHV0X2JmZCwgaW5mbyk7Ci0KLSAgICAgIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdmVyc2lvbiBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaWYgKGR5bnN5bWNvdW50ID09IDAKLQkgIHx8ICh2ZXJkZWZzID09IE5VTEwgJiYgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmID09IE5VTEwpKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICAvKiBUaGUgRFlOU1lNQ09VTlQgbWlnaHQgaGF2ZSBjaGFuZ2VkIGlmIHdlIHdlcmUgZ29pbmcgdG8KLQkgICAgIG91dHB1dCBhIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJ5IGZvciBTLiAgKi8KLQkgIGR5bnN5bWNvdW50ID0gX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIChvdXRwdXRfYmZkLCBpbmZvKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcy0+X3Jhd19zaXplID0gZHluc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pOwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLQkgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSU1lNLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAuZHluc3ltIGFuZCAuaGFzaCBzZWN0aW9ucy4gIFdlIGNvdW50ZWQKLQkgdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgaW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLgotCSBXZSB3aWxsIGJ1aWxkIHRoZSBjb250ZW50cyBvZiAuZHluc3ltIGFuZCAuaGFzaCB3aGVuIHdlIGJ1aWxkCi0JIHRoZSBmaW5hbCBzeW1ib2wgdGFibGUsIGJlY2F1c2UgdW50aWwgdGhlbiB3ZSBkbyBub3Qga25vdyB0aGUKLQkgY29ycmVjdCB2YWx1ZSB0byBnaXZlIHRoZSBzeW1ib2xzLiAgV2UgYnVpbHQgdGhlIC5keW5zdHIKLQkgc2VjdGlvbiBhcyB3ZSB3ZW50IGFsb25nIGluIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiAuZHluc3ltIGlzIGEgZHVtbXkgc3ltYm9sLiAgKi8KLSAgICAgIGlzeW0uc3RfdmFsdWUgPSAwOwotICAgICAgaXN5bS5zdF9zaXplID0gMDsKLSAgICAgIGlzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBpc3ltLnN0X2luZm8gPSAwOwotICAgICAgaXN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBpc3ltLnN0X3NobmR4ID0gMDsKLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZpc3ltLAotCQkJICAgKFBUUikgKEVsZl9FeHRlcm5hbF9TeW0gKikgcy0+Y29udGVudHMpOwotCi0gICAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBoYXNoaW5nIHRhYmxlLiAgQXMgYSBzaWRlIGVmZmVjdCB0aGlzCi0JIGNvbXB1dGVzIHRoZSBoYXNoIHZhbHVlcyBmb3IgYWxsIHRoZSBuYW1lcyB3ZSBleHBvcnQuICAqLwotICAgICAgYnVja2V0Y291bnQgPSBjb21wdXRlX2J1Y2tldF9jb3VudCAoaW5mbyk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBoYXNoX2VudHJ5X3NpemUgPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZW50c2l6ZTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9ICgoMiArIGJ1Y2tldGNvdW50ICsgZHluc3ltY291bnQpICogaGFzaF9lbnRyeV9zaXplKTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0KLSAgICAgIGJmZF9wdXQgKDggKiBoYXNoX2VudHJ5X3NpemUsIG91dHB1dF9iZmQsIGJ1Y2tldGNvdW50LCBzLT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0ICg4ICogaGFzaF9lbnRyeV9zaXplLCBvdXRwdXRfYmZkLCBkeW5zeW1jb3VudCwgCi0JICAgICAgIHMtPmNvbnRlbnRzICsgaGFzaF9lbnRyeV9zaXplKTsKLQotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudCA9IGJ1Y2tldGNvdW50OwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0KLSAgICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTlVMTCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZpeCB1cCB0aGUgZmxhZ3MgZm9yIGEgc3ltYm9sLiAgVGhpcyBoYW5kbGVzIHZhcmlvdXMgY2FzZXMgd2hpY2gKLSAgIGNhbiBvbmx5IGJlIGZpeGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgYXJlIHNlZW4uICBUaGlzIGlzCi0gICBjdXJyZW50bHkgY2FsbGVkIGJ5IGJvdGggYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGFuZAotICAgYXNzaWduX3N5bV92ZXJzaW9uLCB3aGljaCBpcyB1bm5lY2Vzc2FyeSBidXQgcGVyaGFwcyBtb3JlIHJvYnVzdCBpbgotICAgdGhlIGZhY2Ugb2YgZnV0dXJlIGNoYW5nZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2ZpeF9zeW1ib2xfZmxhZ3MgKGgsIGVpZikKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZjsKLXsKLSAgLyogSWYgdGhpcyBzeW1ib2wgd2FzIG1lbnRpb25lZCBpbiBhIG5vbi1FTEYgZmlsZSwgdHJ5IHRvIHNldAotICAgICBERUZfUkVHVUxBUiBhbmQgUkVGX1JFR1VMQVIgY29ycmVjdGx5LiAgVGhpcyBpcyB0aGUgb25seSB3YXkgdG8KLSAgICAgcGVybWl0IGEgbm9uLUVMRiBmaWxlIHRvIGNvcnJlY3RseSByZWZlciB0byBhIHN5bWJvbCBkZWZpbmVkIGluCi0gICAgIGFuIEVMRiBkeW5hbWljIG9iamVjdC4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX05PTl9FTEYpICE9IDApCi0gICAgewotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCSAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKSkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCSAgICAgICB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyk7Ci0JICBlbHNlCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQl9Ci0KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xCi0JICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKSkKLQl7Ci0JICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoZWlmLT5pbmZvLCBoKSkKLQkgICAgewotCSAgICAgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVW5mb3J0dW5hdGVseSwgRUxGX0xJTktfTk9OX0VMRiBpcyBvbmx5IGNvcnJlY3QgaWYgdGhlIHN5bWJvbAotICAgICAgICAgd2FzIGZpcnN0IHNlZW4gaW4gYSBub24tRUxGIGZpbGUuICBGb3J0dW5hdGVseSwgaWYgdGhlIHN5bWJvbAotICAgICAgICAgd2FzIGZpcnN0IHNlZW4gaW4gYW4gRUxGIGZpbGUsIHdlJ3JlIHByb2JhYmx5IE9LIHVubGVzcyB0aGUKLSAgICAgICAgIHN5bWJvbCB3YXMgZGVmaW5lZCBpbiBhIG5vbi1FTEYgZmlsZS4gIENhdGNoIHRoYXQgY2FzZSBoZXJlLgotICAgICAgICAgRklYTUU6IFdlJ3JlIHN0aWxsIGluIHRyb3VibGUgaWYgdGhlIHN5bWJvbCB3YXMgZmlyc3Qgc2VlbiBpbgotICAgICAgICAgYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoZW4gbGF0ZXIgaW4gYSBub24tRUxGIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICA/IChiZmRfZ2V0X2ZsYXZvdXIgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIpCi0JCSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICAgIDogKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKQotCQkgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDApKSkKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCBhbmQgdGhlIHN5bWJvbCB3YXMgZGVmaW5lZCBhcyBhIGNvbW1vbgotICAgICBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLCBhbmQgdGhlcmUgd2FzIG5vIGRlZmluaXRpb24gaW4KLSAgICAgYW55IGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBsaW5rZXIgd2lsbCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IKLSAgICAgdGhlIHN5bWJvbCBpbiBhIGNvbW1vbiBzZWN0aW9uIGJ1dCB0aGUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgotICAgICBmbGFnIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0KLSAgLyogSWYgLUJzeW1ib2xpYyB3YXMgdXNlZCAod2hpY2ggbWVhbnMgdG8gYmluZCByZWZlcmVuY2VzIHRvIGdsb2JhbAotICAgICBzeW1ib2xzIHRvIHRoZSBkZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIG9iamVjdCksIGFuZCB0aGlzCi0gICAgIHN5bWJvbCB3YXMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LCB0aGVuIGl0IGFjdHVhbGx5IGRvZXNuJ3QKLSAgICAgbmVlZCBhIFBMVCBlbnRyeS4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICAmJiBlaWYtPmluZm8tPnNoYXJlZAotICAgICAgJiYgZWlmLT5pbmZvLT5zeW1ib2xpYwotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGtub3cKLSAgICAgdGhlIHJlYWwgZGVmaW5pdGlvbiBpbiB0aGUgZHluYW1pYyBvYmplY3QsIGNvcHkgaW50ZXJlc3RpbmcgZmxhZ3MKLSAgICAgb3ZlciB0byB0aGUgcmVhbCBkZWZpbml0aW9uLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqd2Vha2RlZjsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgd2Vha2RlZiA9IGgtPndlYWtkZWY7Ci0gICAgICBCRkRfQVNTRVJUICh3ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgd2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBCRkRfQVNTRVJUICh3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyk7Ci0KLSAgICAgIC8qIElmIHRoZSByZWFsIGRlZmluaXRpb24gaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsCi0JIGRvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwuICBTZWUgdGhlIGxvbmdlciBkZXNjcmlwdGlvbiBpbgotCSBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLCBiZWxvdy4gICovCi0gICAgICBpZiAoKHdlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKQotCWgtPndlYWtkZWYgPSBOVUxMOwotICAgICAgZWxzZQotCXdlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0KLQkgIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JICAgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCSAgICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLCi0JICAgICAgfCBFTEZfTElOS19OT05fR09UX1JFRikpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSB0aGUgYmFja2VuZCBwaWNrIGEgZ29vZCB2YWx1ZSBmb3IgYSBkeW5hbWljIHN5bWJvbC4gIFRoaXMgaXMKLSAgIGNhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSwgYW5kIGFsc28gY2FsbHMgaXRzZWxmCi0gICByZWN1cnNpdmVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZiA9IChzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICopIGRhdGE7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIC8qIElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhlc2UgYXJlIGFkZGVkIGJ5IHRoZSB2ZXJzaW9uaW5nIGNvZGUuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRml4IHRoZSBzeW1ib2wgZmxhZ3MuICAqLwotICBpZiAoISBlbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgZWlmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIFBMVCBlbnRyeSwgYW5kIGl0IGlzIG5vdAotICAgICBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIG9yIGlzIG5vdCByZWZlcmVuY2VkIGJ5IGEgcmVndWxhcgotICAgICBvYmplY3QsIGlnbm9yZSBpdC4gIFdlIGRvIGhhdmUgdG8gaGFuZGxlIGEgd2VhayBkZWZpbmVkIHN5bWJvbCwKLSAgICAgZXZlbiBpZiBubyByZWd1bGFyIG9iamVjdCByZWZlcnMgdG8gaXQsIGlmIHdlIGRlY2lkZWQgdG8gYWRkIGl0Ci0gICAgIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEZJWE1FOiBEbyB3ZSBub3JtYWxseSBuZWVkIHRvIHdvcnJ5Ci0gICAgIGFib3V0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgYnkgb25lIGR5bmFtaWMgb2JqZWN0IGFuZAotICAgICByZWZlcmVuY2VkIGJ5IGFub3RoZXIgb25lPyAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpID09IDAKLSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDAKLQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMAotCSAgICAgICYmIChoLT53ZWFrZGVmID09IE5VTEwgfHwgaC0+d2Vha2RlZi0+ZHluaW5keCA9PSAtMSkpKSkKLSAgICB7Ci0gICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgYWRqdXN0ZWQgdGhpcyBzeW1ib2wsIGRvbid0IGRvIGl0IGFnYWluLiAgVGhpcwotICAgICBjYW4gaGFwcGVuIHZpYSBhIHJlY3Vyc2l2ZSBjYWxsLiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIERvbid0IGxvb2sgYXQgdGhpcyBzeW1ib2wgYWdhaW4uICBOb3RlIHRoYXQgd2UgbXVzdCBzZXQgdGhpcwotICAgICBhZnRlciBjaGVja2luZyB0aGUgYWJvdmUgY29uZGl0aW9ucywgYmVjYXVzZSB3ZSBtYXkgbG9vayBhdCBhCi0gICAgIHN5bWJvbCBvbmNlLCBkZWNpZGUgbm90IHRvIGRvIGFueXRoaW5nLCBhbmQgdGhlbiBnZXQgY2FsbGVkCi0gICAgIHJlY3Vyc2l2ZWx5IGxhdGVyIGFmdGVyIFJFRl9SRUdVTEFSIGlzIHNldCBiZWxvdy4gICovCi0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEOwotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIGRlZmluaXRpb24sIGFuZCB3ZSBrbm93IGEgcmVhbCBkZWZpbml0aW9uLCBhbmQKLSAgICAgdGhlIHJlYWwgc3ltYm9sIGlzIG5vdCBpdHNlbGYgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsCi0gICAgIHRoZW4gZ2V0IGEgZ29vZCB2YWx1ZSBmb3IgdGhlIHJlYWwgZGVmaW5pdGlvbi4gIFdlIGhhbmRsZSB0aGUKLSAgICAgcmVhbCBzeW1ib2wgZmlyc3QsIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGJhY2tlbmQgcm91dGluZS4KLQotICAgICBOb3RlIHRoYXQgdGhlcmUgaXMgYSBjb25mdXNpbmcgY2FzZSBoZXJlLiAgSWYgdGhlIHJlYWwgZGVmaW5pdGlvbgotICAgICBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwgd2UgZG9uJ3QgZ2V0IHRoZSByZWFsIHN5bWJvbAotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCwgYnV0IHdlIGRvIGdldCB0aGUgd2VhayBzeW1ib2wuICBJZiB0aGUKLSAgICAgcHJvY2Vzc29yIGJhY2tlbmQgdXNlcyBhIENPUFkgcmVsb2MsIHRoZW4gaWYgc29tZSByb3V0aW5lIGluIHRoZQotICAgICBkeW5hbWljIG9iamVjdCBjaGFuZ2VzIHRoZSByZWFsIHN5bWJvbCwgd2Ugd2lsbCBub3Qgc2VlIHRoYXQKLSAgICAgY2hhbmdlIGluIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgc3ltYm9sLiAgVGhpcyBpcyB0aGUgd2F5IG90aGVyCi0gICAgIEVMRiBsaW5rZXJzIHdvcmsgYXMgd2VsbCwgYW5kIHNlZW1zIHRvIGJlIGEgcmVzdWx0IG9mIHRoZSBzaGFyZWQKLSAgICAgbGlicmFyeSBtb2RlbC4KLQotICAgICBJIHdpbGwgY2xhcmlmeSB0aGlzIGlzc3VlLiAgTW9zdCBTVlI0IHNoYXJlZCBsaWJyYXJpZXMgZGVmaW5lIHRoZQotICAgICB2YXJpYWJsZSBfdGltZXpvbmUgYW5kIGRlZmluZSB0aW1lem9uZSBhcyBhIHdlYWsgc3lub255bS4gIFRoZQotICAgICB0enNldCBjYWxsIGNoYW5nZXMgX3RpbWV6b25lLiAgSWYgeW91IHdyaXRlCi0gICAgICAgZXh0ZXJuIGludCB0aW1lem9uZTsKLSAgICAgICBpbnQgX3RpbWV6b25lID0gNTsKLSAgICAgICBpbnQgbWFpbiAoKSB7IHR6c2V0ICgpOyBwcmludGYgKCIlZCAlZFxuIiwgdGltZXpvbmUsIF90aW1lem9uZSk7IH0KLSAgICAgeW91IG1pZ2h0IGV4cGVjdCB0aGF0LCBzaW5jZSB0aW1lem9uZSBpcyBhIHN5bm9ueW0gZm9yIF90aW1lem9uZSwKLSAgICAgdGhlIHNhbWUgbnVtYmVyIHdpbGwgcHJpbnQgYm90aCB0aW1lcy4gIEhvd2V2ZXIsIGlmIHRoZSBwcm9jZXNzb3IKLSAgICAgYmFja2VuZCB1c2VzIGEgQ09QWSByZWxvYywgdGhlbiBhY3R1YWxseSB0aW1lem9uZSB3aWxsIGJlIGNvcGllZAotICAgICBpbnRvIHlvdXIgcHJvY2VzcyBpbWFnZSwgYW5kLCBzaW5jZSB5b3UgZGVmaW5lIF90aW1lem9uZQotICAgICB5b3Vyc2VsZiwgX3RpbWV6b25lIHdpbGwgbm90LiAgVGh1cyB0aW1lem9uZSBhbmQgX3RpbWV6b25lIHdpbGwKLSAgICAgd2luZCB1cCBhdCBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9ucy4gIFRoZSB0enNldCBjYWxsIHdpbGwgc2V0Ci0gICAgIF90aW1lem9uZSwgbGVhdmluZyB0aW1lem9uZSB1bmNoYW5nZWQuICAqLwotCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgLyogSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHdlIGtub3cgdGhlcmUgaXMgYW4gaW1wbGljaXQKLQkgcmVmZXJlbmNlIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSB2aWEgdGhlIHdlYWsgc3ltYm9sIEguCi0JIEZJWE1FOiBJcyB0aGlzIHJlYWxseSB0cnVlPyAgV2hhdCBpZiB0aGUgdHJhdmVyc2FsIGZpbmRzCi0JIEgtPldFQUtERUYgYmVmb3JlIGl0IGZpbmRzIEg/ICAqLwotICAgICAgaC0+d2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOwotCi0gICAgICBpZiAoISBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChoLT53ZWFrZGVmLCAoUFRSKSBlaWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgYSBzeW1ib2wgaGFzIG5vIHR5cGUgYW5kIG5vIHNpemUgYW5kIGRvZXMgbm90IHJlcXVpcmUgYSBQTFQKLSAgICAgZW50cnksIHRoZW4gd2UgYXJlIHByb2JhYmx5IGFib3V0IHRvIGRvIHRoZSB3cm9uZyB0aGluZyBoZXJlOiB3ZQotICAgICBhcmUgcHJvYmFibHkgZ29pbmcgdG8gY3JlYXRlIGEgQ09QWSByZWxvYyBmb3IgYW4gZW1wdHkgb2JqZWN0LgotICAgICBUaGlzIGNhc2UgY2FuIGFyaXNlIHdoZW4gYSBzaGFyZWQgb2JqZWN0IGlzIGJ1aWx0IHdpdGggYXNzZW1ibHkKLSAgICAgY29kZSwgYW5kIHRoZSBhc3NlbWJseSBjb2RlIGZhaWxzIHRvIHNldCB0aGUgc3ltYm9sIHR5cGUuICAqLwotICBpZiAoaC0+c2l6ZSA9PSAwCi0gICAgICAmJiBoLT50eXBlID09IFNUVF9OT1RZUEUKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpID09IDApCi0gICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAoXygid2FybmluZzogdHlwZSBhbmQgc2l6ZSBvZiBkeW5hbWljIHN5bWJvbCBgJXMnIGFyZSBub3QgZGVmaW5lZCIpLAotCSBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoZWlmLT5pbmZvKS0+ZHlub2JqOwotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZHlub2JqKTsKLSAgaWYgKCEgKCpiZWQtPmVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCkgKGVpZi0+aW5mbywgaCkpCi0gICAgewotICAgICAgZWlmLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGV4cG9ydCBhbGwgZGVmaW5lZCBzeW1ib2xzIGludG8gdGhlIGR5bmFtaWMKLSAgIHN5bWJvbCB0YWJsZS4gIEl0IGlzIGNhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZXhwb3J0X3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICplaWYgPSAoc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqKSBkYXRhOwotCi0gIC8qIElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhlc2UgYXJlIGFkZGVkIGJ5IHRoZSB2ZXJzaW9uaW5nIGNvZGUuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmR5bmluZHggPT0gLTEKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JICAmIChFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGVpZi0+aW5mbywgaCkpCi0JewotCSAgZWlmLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgaW4gb3RoZXIgc2hhcmVkCi0gICBsaWJyYXJpZXMgYW5kIHJlZmVyZW5jZWQgaGVyZS4gIFVwZGF0ZSB0aGUgbGlzdCBvZiB2ZXJzaW9uCi0gICBkZXBlbmRlbmNpZXMuICBUaGlzIHdpbGwgYmUgcHV0IGludG8gdGhlIC5nbnUudmVyc2lvbl9yIHNlY3Rpb24uCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbyAqcmluZm8gPSAoc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvICopIGRhdGE7Ci0gIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgc3ltYm9scyBkZWZpbmVkIGluIHNoYXJlZCBvYmplY3RzIHdpdGggdmVyc2lvbgotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMAotICAgICAgfHwgaC0+ZHluaW5keCA9PSAtMQotICAgICAgfHwgaC0+dmVyaW5mby52ZXJkZWYgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWUgaWYgd2UgYWxyZWFkeSBrbm93IGFib3V0IHRoaXMgdmVyc2lvbi4gICovCi0gIGZvciAodCA9IGVsZl90ZGF0YSAocmluZm8tPm91dHB1dF9iZmQpLT52ZXJyZWY7IHQgIT0gTlVMTDsgdCA9IHQtPnZuX25leHRyZWYpCi0gICAgewotICAgICAgaWYgKHQtPnZuX2JmZCAhPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfYmZkKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCWlmIChhLT52bmFfbm9kZW5hbWUgPT0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX25vZGVuYW1lKQotCSAgcmV0dXJuIHRydWU7Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgbmV3IHZlcnNpb24uICBBZGQgaXQgdG8gdHJlZSB3ZSBhcmUgYnVpbGRpbmcuICAqLwotCi0gIGlmICh0ID09IE5VTEwpCi0gICAgewotICAgICAgdCA9IChFbGZfSW50ZXJuYWxfVmVybmVlZCAqKSBiZmRfemFsbG9jIChyaW5mby0+b3V0cHV0X2JmZCwgc2l6ZW9mICp0KTsKLSAgICAgIGlmICh0ID09IE5VTEwpCi0JewotCSAgcmluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB0LT52bl9iZmQgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfYmZkOwotICAgICAgdC0+dm5fbmV4dHJlZiA9IGVsZl90ZGF0YSAocmluZm8tPm91dHB1dF9iZmQpLT52ZXJyZWY7Ci0gICAgICBlbGZfdGRhdGEgKHJpbmZvLT5vdXRwdXRfYmZkKS0+dmVycmVmID0gdDsKLSAgICB9Ci0KLSAgYSA9IChFbGZfSW50ZXJuYWxfVmVybmF1eCAqKSBiZmRfemFsbG9jIChyaW5mby0+b3V0cHV0X2JmZCwgc2l6ZW9mICphKTsKLQotICAvKiBOb3RlIHRoYXQgd2UgYXJlIGNvcHlpbmcgYSBzdHJpbmcgcG9pbnRlciBoZXJlLCBhbmQgdGVzdGluZyBpdAotICAgICBhYm92ZS4gIElmIGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gaXMgZXZlciBjaGFuZ2VkIHRvCi0gICAgIGRpc2NhcmQgdGhlIHN0cmluZyBkYXRhIHdoZW4gbG93IGluIG1lbW9yeSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUKLSAgICAgZml4ZWQuICAqLwotICBhLT52bmFfbm9kZW5hbWUgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfbm9kZW5hbWU7Ci0KLSAgYS0+dm5hX2ZsYWdzID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2ZsYWdzOwotICBhLT52bmFfbmV4dHB0ciA9IHQtPnZuX2F1eHB0cjsKLQotICBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vID0gcmluZm8tPnZlcnM7Ci0gICsrcmluZm8tPnZlcnM7Ci0KLSAgYS0+dm5hX290aGVyID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2V4cF9yZWZubyArIDE7Ci0KLSAgdC0+dm5fYXV4cHRyID0gYTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmlndXJlIG91dCBhcHByb3ByaWF0ZSB2ZXJzaW9ucyBmb3IgYWxsIHRoZSBzeW1ib2xzLiAgV2UgbWF5IG5vdAotICAgaGF2ZSB0aGUgdmVyc2lvbiBudW1iZXIgc2NyaXB0IHVudGlsIHdlIGhhdmUgcmVhZCBhbGwgb2YgdGhlIGlucHV0Ci0gICBmaWxlcywgc28gdW50aWwgdGhhdCBwb2ludCB3ZSBkb24ndCBrbm93IHdoaWNoIHN5bWJvbHMgc2hvdWxkIGJlCi0gICBsb2NhbC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvICpzaW5mbyA9Ci0gICAgKHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8gKikgZGF0YTsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSBzaW5mby0+aW5mbzsKLSAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCBlaWY7Ci0gIGNoYXIgKnA7Ci0KLSAgLyogRml4IHRoZSBzeW1ib2wgZmxhZ3MuICAqLwotICBlaWYuZmFpbGVkID0gZmFsc2U7Ci0gIGVpZi5pbmZvID0gaW5mbzsKLSAgaWYgKCEgZWxmX2ZpeF9zeW1ib2xfZmxhZ3MgKGgsICZlaWYpKQotICAgIHsKLSAgICAgIGlmIChlaWYuZmFpbGVkKQotCXNpbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXZSBvbmx5IG5lZWQgdmVyc2lvbiBudW1iZXJzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gcmVndWxhcgotICAgICBvYmplY3RzLiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBwID0gc3RyY2hyIChoLT5yb290LnJvb3Quc3RyaW5nLCBFTEZfVkVSX0NIUik7Ci0gIGlmIChwICE9IE5VTEwgJiYgaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp0OwotICAgICAgYm9vbGVhbiBoaWRkZW47Ci0KLSAgICAgIGhpZGRlbiA9IHRydWU7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSB0d28gY29uc2VjdXRpdmUgRUxGX1ZFUl9DSFIgY2hhcmFjdGVycyBpZiB0aGlzIGlzCi0gICAgICAgICBub3QgYSBoaWRkZW4gc3ltYm9sLiAgKi8KLSAgICAgICsrcDsKLSAgICAgIGlmICgqcCA9PSBFTEZfVkVSX0NIUikKLQl7Ci0JICBoaWRkZW4gPSBmYWxzZTsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHZlcnNpb24gc3RyaW5nLCB3ZSBjYW4ganVzdCByZXR1cm4gb3V0LiAgKi8KLSAgICAgIGlmICgqcCA9PSAnXDAnKQotCXsKLQkgIGlmIChoaWRkZW4pCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSElEREVOOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciB0aGUgdmVyc2lvbi4gIElmIHdlIGZpbmQgaXQsIGl0IGlzIG5vIGxvbmdlciB3ZWFrLiAgKi8KLSAgICAgIGZvciAodCA9IHNpbmZvLT52ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCXsKLQkgIGlmIChzdHJjbXAgKHQtPm5hbWUsIHApID09IDApCi0JICAgIHsKLQkgICAgICBpbnQgbGVuOwotCSAgICAgIGNoYXIgKmFsYzsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmQ7Ci0KLQkgICAgICBsZW4gPSBwIC0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICBhbGMgPSBiZmRfYWxsb2MgKHNpbmZvLT5vdXRwdXRfYmZkLCBsZW4pOwotCSAgICAgIGlmIChhbGMgPT0gTlVMTCkKLQkgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICBzdHJuY3B5IChhbGMsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGxlbiAtIDEpOwotCSAgICAgIGFsY1tsZW4gLSAxXSA9ICdcMCc7Ci0JICAgICAgaWYgKGFsY1tsZW4gLSAyXSA9PSBFTEZfVkVSX0NIUikKLQkgICAgICAgIGFsY1tsZW4gLSAyXSA9ICdcMCc7Ci0KLQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCSAgICAgIHQtPnVzZWQgPSB0cnVlOwotCSAgICAgIGQgPSBOVUxMOwotCi0JICAgICAgaWYgKHQtPmdsb2JhbHMgIT0gTlVMTCkKLQkJewotCQkgIGZvciAoZCA9IHQtPmdsb2JhbHM7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0JCSAgICBpZiAoKCpkLT5tYXRjaCkgKGQsIGFsYykpCi0JCSAgICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gZm9yY2UgdGhpcyBzeW1ib2wgdG8KLSAgICAgICAgICAgICAgICAgbG9jYWwgc2NvcGUuICAqLwotCSAgICAgIGlmIChkID09IE5VTEwgJiYgdC0+bG9jYWxzICE9IE5VTEwpCi0JCXsKLQkJICBmb3IgKGQgPSB0LT5sb2NhbHM7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgoKmQtPm1hdGNoKSAoZCwgYWxjKSkKLQkJCXsKLQkJCSAgaWYgKGgtPmR5bmluZHggIT0gLTEKLQkJCSAgICAgICYmIGluZm8tPnNoYXJlZAotCQkJICAgICAgJiYgISBzaW5mby0+ZXhwb3J0X2R5bmFtaWMpCi0JCQkgICAgewotCQkJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JCQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fgotCQkJCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCQkJICAgICAgaC0+ZHluaW5keCA9IC0xOwotCQkJICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCSAgICAgIC8qIEZJWE1FOiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGhhcwotCQkJCSBhbHJlYWR5IGJlZW4gcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMKLQkJCQkgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLwotCQkJICAgIH0KLQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX3JlbGVhc2UgKHNpbmZvLT5vdXRwdXRfYmZkLCBhbGMpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gYXBwbGljYXRpb24sIHdlIG5lZWQgdG8gY3JlYXRlIGEKLSAgICAgICAgIHZlcnNpb24gbm9kZSBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgICAgIGlmICh0ID09IE5VTEwgJiYgISBpbmZvLT5zaGFyZWQpCi0JewotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICoqcHA7Ci0JICBpbnQgdmVyc2lvbl9pbmRleDsKLQotCSAgLyogSWYgd2UgYXJlbid0IGdvaW5nIHRvIGV4cG9ydCB0aGlzIHN5bWJvbCwgd2UgZG9uJ3QgbmVlZAotICAgICAgICAgICAgIHRvIHdvcnJ5IGFib3V0IGl0LiAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHJldHVybiB0cnVlOwotCi0JICB0ID0gKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikKLQkgICAgICAgYmZkX2FsbG9jIChzaW5mby0+b3V0cHV0X2JmZCwgc2l6ZW9mICp0KSk7Ci0JICBpZiAodCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHQtPm5leHQgPSBOVUxMOwotCSAgdC0+bmFtZSA9IHA7Ci0JICB0LT5nbG9iYWxzID0gTlVMTDsKLQkgIHQtPmxvY2FscyA9IE5VTEw7Ci0JICB0LT5kZXBzID0gTlVMTDsKLQkgIHQtPm5hbWVfaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOwotCSAgdC0+dXNlZCA9IHRydWU7Ci0KLQkgIHZlcnNpb25faW5kZXggPSAxOwotCSAgZm9yIChwcCA9ICZzaW5mby0+dmVyZGVmczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCSAgICArK3ZlcnNpb25faW5kZXg7Ci0JICB0LT52ZXJudW0gPSB2ZXJzaW9uX2luZGV4OwotCi0JICAqcHAgPSB0OwotCi0JICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCX0KLSAgICAgIGVsc2UgaWYgKHQgPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBjb3VsZCBub3QgZmluZCB0aGUgdmVyc2lvbiBmb3IgYSBzeW1ib2wgd2hlbgotICAgICAgICAgICAgIGdlbmVyYXRpbmcgYSBzaGFyZWQgYXJjaGl2ZS4gIFJldHVybiBhbiBlcnJvci4gICovCi0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bmRlZmluZWQgdmVyc2lvbmVkIHN5bWJvbCBuYW1lICVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzaW5mby0+b3V0cHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBzaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChoaWRkZW4pCi0JaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19ISURERU47Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IGhhdmUgYSB2ZXJzaW9uIGZvciB0aGlzIHN5bWJvbCwgc2VlIGlmIHdlIGNhbiBmaW5kCi0gICAgIHNvbWV0aGluZy4gICovCi0gIGlmIChoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCAmJiBzaW5mby0+dmVyZGVmcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqZGVmbHQ7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmQ7Ci0KLSAgICAgIC8qIFNlZSBpZiBjYW4gZmluZCB3aGF0IHZlcnNpb24gdGhpcyBzeW1ib2wgaXMgaW4uICBJZiB0aGUKLSAgICAgICAgIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSBsb2NhbCwgdGhlbiBkb24ndCBhY3R1YWxseSByZWdpc3RlcgotICAgICAgICAgaXQuICAqLwotICAgICAgZGVmbHQgPSBOVUxMOwotICAgICAgZm9yICh0ID0gc2luZm8tPnZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgaWYgKHQtPmdsb2JhbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoZCA9IHQtPmdsb2JhbHM7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0JCXsKLQkJICBpZiAoKCpkLT5tYXRjaCkgKGQsIGgtPnJvb3Qucm9vdC5zdHJpbmcpKQotCQkgICAgewotCQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGQgIT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHQtPmxvY2FscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChkID0gdC0+bG9jYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQl7Ci0JCSAgaWYgKGQtPnBhdHRlcm5bMF0gPT0gJyonICYmIGQtPnBhdHRlcm5bMV0gPT0gJ1wwJykKLQkJICAgIGRlZmx0ID0gdDsKLQkJICBlbHNlIGlmICgoKmQtPm1hdGNoKSAoZCwgaC0+cm9vdC5yb290LnN0cmluZykpCi0JCSAgICB7Ci0JCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JCSAgICAgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JCQkgICYmIGluZm8tPnNoYXJlZAotCQkJICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKLQkJCXsKLQkJCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JCQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCQkJICBoLT5keW5pbmR4ID0gLTE7Ci0JCQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JCQkgIC8qIEZJWE1FOiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGhhcyBhbHJlYWR5Ci0JCQkgICAgIGJlZW4gcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlCi0JCQkgICAgIHNlY3Rpb24uICAqLwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGQgIT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChkZWZsdCAhPSBOVUxMICYmIGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotCXsKLQkgIGgtPnZlcmluZm8udmVydHJlZSA9IGRlZmx0OwotCSAgaWYgKGgtPmR5bmluZHggIT0gLTEKLQkgICAgICAmJiBpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKLQkgICAgewotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgICAgIGgtPmR5bmluZHggPSAtMTsKLQkgICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCSAgICAgIC8qIEZJWE1FOiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4KLQkJIHJlY29yZGVkIGluIHRoZSBkeW5hbWljIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAgKi8KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGaW5hbCBwaGFzZSBvZiBFTEYgbGlua2VyLiAgKi8KLQotLyogQSBzdHJ1Y3R1cmUgd2UgdXNlIHRvIGF2b2lkIHBhc3NpbmcgbGFyZ2UgbnVtYmVycyBvZiBhcmd1bWVudHMuICAqLwotCi1zdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbwotewotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogU3ltYm9sIHN0cmluZyB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN5bXN0cnRhYjsKLSAgLyogLmR5bnN5bSBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKmR5bnN5bV9zZWM7Ci0gIC8qIC5oYXNoIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqaGFzaF9zZWM7Ci0gIC8qIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24gKC5nbnUudmVyc2lvbikuICAqLwotICBhc2VjdGlvbiAqc3ltdmVyX3NlYzsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgUFRSIGV4dGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGludGVybmFsIHJlbG9jcyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsb2NhbCBzeW1ib2xzIG9mIGFueSBpbnB1dAotICAgICBCRkQuICAqLwotICBFbGZfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgaW50ZXJuYWwgbG9jYWwgc3ltYm9scyBvZiBhbnkgaW5wdXQKLSAgICAgQkZELiAgKi8KLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltczsKLSAgLyogQXJyYXkgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBzeW1ib2wgaW5kZXggZm9yIGVhY2ggbG9jYWwgc3ltYm9sCi0gICAgIG9mIGFueSBpbnB1dCBCRkQuICAqLwotICBsb25nICppbmRpY2VzOwotICAvKiBBcnJheSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHNlY3Rpb24gcG9pbnRlciBmb3IgZWFjaCBsb2NhbAotICAgICBzeW1ib2wgb2YgYW55IGlucHV0IEJGRC4gICovCi0gIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci0gIC8qIEJ1ZmZlciB0byBob2xkIHN3YXBwZWQgb3V0IHN5bWJvbHMuICAqLwotICBFbGZfRXh0ZXJuYWxfU3ltICpzeW1idWY7Ci0gIC8qIE51bWJlciBvZiBzd2FwcGVkIG91dCBzeW1ib2xzIGluIGJ1ZmZlci4gICovCi0gIHNpemVfdCBzeW1idWZfY291bnQ7Ci0gIC8qIE51bWJlciBvZiBzeW1ib2xzIHdoaWNoIGZpdCBpbiBzeW1idWYuICAqLwotICBzaXplX3Qgc3ltYnVmX3NpemU7Ci19OwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19vdXRwdXRfc3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX291dHB1dF9leHRzeW0KLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBlbGZfbGlua19vdXRwdXRfZXh0c3ltLiAgKi8KLQotc3RydWN0IGVsZl9vdXRleHRfaW5mbwotewotICBib29sZWFuIGZhaWxlZDsKLSAgYm9vbGVhbiBsb2NhbHN5bXM7Ci0gIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLX07Ci0KLS8qIENvbXB1dGUgdGhlIHNpemUgb2YsIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IsIFJFTF9IRFIgd2hpY2ggaXMgdGhlCi0gICBzZWN0aW9uIGhlYWRlciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgcmVsb2NhdGlvbnMgZm9yIE8uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uIChhYmZkLCByZWxfaGRyLCBvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICAgICBhc2VjdGlvbiAqbzsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipwLCAqKnBlbmQ7Ci0gIHVuc2lnbmVkIHJlbG9jX2NvdW50OwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgcmVsb2NhdGlvbnMgdGhlcmUgd2lsbCBiZS4gICovCi0gIGlmIChyZWxfaGRyID09ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcikKLSAgICByZWxvY19jb3VudCA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQ7Ci0gIGVsc2UKLSAgICByZWxvY19jb3VudCA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQyOwotCi0gIC8qIFRoYXQgYWxsb3dzIHVzIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHJlbF9oZHItPnNoX3NpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplICogcmVsb2NfY291bnQ7Ci0KLSAgLyogVGhlIGNvbnRlbnRzIGZpZWxkIG11c3QgbGFzdCBpbnRvIHdyaXRlX29iamVjdF9jb250ZW50cywgc28gd2UKLSAgICAgYWxsb2NhdGUgaXQgd2l0aCBiZmRfYWxsb2MgcmF0aGVyIHRoYW4gbWFsbG9jLiAgKi8KLSAgcmVsX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbF9oZHItPnNoX3NpemUpOwotICBpZiAocmVsX2hkci0+Y29udGVudHMgPT0gTlVMTCAmJiByZWxfaGRyLT5zaF9zaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogV2Ugb25seSBhbGxvY2F0ZSBvbmUgc2V0IG9mIGhhc2ggZW50cmllcywgc28gd2Ugb25seSBkbyBpdCB0aGUKLSAgICAgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkLiAgKi8KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzID09IE5VTEwpCi0gICAgewotICAgICAgcCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKLQkJICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotICAgICAgaWYgKHAgPT0gTlVMTCAmJiBvLT5yZWxvY19jb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgPSBwOwotICAgICAgcGVuZCA9IHAgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoOyBwIDwgcGVuZDsgcCsrKQotCSpwID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGUgaW5wdXQgcmVsb2NhdGlvbnMgYXJlCi0gICBwcmVzZXJ2ZWQuICBCdXQsIGlmIHRoZXkgcmVmZXJlbmNlIGdsb2JhbCBzeW1ib2xzLCB0aGUgaW5kaWNlcwotICAgcmVmZXJlbmNlZCBtdXN0IGJlIHVwZGF0ZWQuICBVcGRhdGUgYWxsIHRoZSByZWxvY2F0aW9ucyBpbgotICAgUkVMX0hEUiAodGhlcmUgYXJlIENPVU5UIG9mIHRoZW0pLCB1c2luZyB0aGUgZGF0YSBpbiBSRUxfSEFTSC4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfbGlua19hZGp1c3RfcmVsb2NzIChhYmZkLCByZWxfaGRyLCBjb3VudCwgcmVsX2hhc2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIHVuc2lnbmVkIGludCBjb3VudDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJlbF9oYXNoKyspCi0gICAgewotICAgICAgaWYgKCpyZWxfaGFzaCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBCRkRfQVNTRVJUICgoKnJlbF9oYXNoKS0+aW5keCA+PSAwKTsKLQotICAgICAgaWYgKHJlbF9oZHItPnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOwotCSAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotCSAgCi0JICBlcmVsID0gKEVsZl9FeHRlcm5hbF9SZWwgKikgcmVsX2hkci0+Y29udGVudHMgKyBpOwotCSAgZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIGVyZWwsICZpcmVsKTsKLQkgIGlyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCi0JCQkJICAgIEVMRl9SX1RZUEUgKGlyZWwucl9pbmZvKSk7Ci0JICBlbGZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZpcmVsLCBlcmVsKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotCSAgRWxmX0ludGVybmFsX1JlbGEgaXJlbGE7Ci0JICAKLQkgIEJGRF9BU1NFUlQgKHJlbF9oZHItPnNoX2VudHNpemUKLQkJICAgICAgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotCSAgCi0JICBlcmVsYSA9IChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxfaGRyLT5jb250ZW50cyArIGk7Ci0JICBlbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIGVyZWxhLCAmaXJlbGEpOwotCSAgaXJlbGEucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCi0JCQkJICAgICBFTEZfUl9UWVBFIChpcmVsYS5yX2luZm8pKTsKLQkgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZpcmVsYSwgZXJlbGEpOwotCX0KLSAgICB9Ci19Ci0KLS8qIERvIHRoZSBmaW5hbCBzdGVwIG9mIGFuIEVMRiBsaW5rLiAgKi8KLQotYm9vbGVhbgotZWxmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuIGR5bmFtaWM7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyBmaW5mbzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKm87Ci0gIHJlZ2lzdGVyIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgcmVnaXN0ZXIgYmZkICpzdWI7Ci0gIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKLSAgc2l6ZV90IG1heF9leHRlcm5hbF9yZWxvY19zaXplOwotICBzaXplX3QgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X3N5bV9jb3VudDsKLSAgZmlsZV9wdHIgb2ZmOwotICBFbGZfSW50ZXJuYWxfU3ltIGVsZnN5bTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltc3RydGFiX2hkcjsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGVsZl9vdXRleHRfaW5mbyBlb2luZm87Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGR5bmFtaWMgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZDsKLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgZmluZm8uaW5mbyA9IGluZm87Ci0gIGZpbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBmaW5mby5zeW1zdHJ0YWIgPSBlbGZfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChmaW5mby5zeW1zdHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBmaW5mby5keW5zeW1fc2VjID0gTlVMTDsKLSAgICAgIGZpbmZvLmhhc2hfc2VjID0gTlVMTDsKLSAgICAgIGZpbmZvLnN5bXZlcl9zZWMgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpbmZvLmR5bnN5bV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgZmluZm8uaGFzaF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKGZpbmZvLmR5bnN5bV9zZWMgIT0gTlVMTCAmJiBmaW5mby5oYXNoX3NlYyAhPSBOVUxMKTsKLSAgICAgIGZpbmZvLnN5bXZlcl9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uIik7Ci0gICAgICAvKiBOb3RlIHRoYXQgaXQgaXMgT0sgaWYgc3ltdmVyX3NlYyBpcyBOVUxMLiAgKi8KLSAgICB9Ci0KLSAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmluZGljZXMgPSBOVUxMOwotICBmaW5mby5zZWN0aW9ucyA9IE5VTEw7Ci0gIGZpbmZvLnN5bWJ1ZiA9IE5VTEw7Ci0gIGZpbmZvLnN5bWJ1Zl9jb3VudCA9IDA7Ci0KLSAgLyogQ291bnQgdXAgdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyB3ZSB3aWxsIG91dHB1dCBmb3IgZWFjaCBvdXRwdXQKLSAgICAgc2VjdGlvbiwgc28gdGhhdCB3ZSBrbm93IHRoZSBzaXplcyBvZiB0aGUgcmVsb2Mgc2VjdGlvbnMuICBXZQotICAgICBhbHNvIGZpZ3VyZSBvdXQgc29tZSBtYXhpbXVtIHNpemVzLiAgKi8KLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IDA7Ci0gIG1heF9pbnRlcm5hbF9yZWxvY19jb3VudCA9IDA7Ci0gIG1heF9zeW1fY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotCi0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCSAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICArK28tPnJlbG9jX2NvdW50OwotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCi0JCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAotCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCi0JICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLQkgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCQlvLT5yZWxvY19jb3VudCArPSBzZWMtPnJlbG9jX2NvdW50OwotCi0JICAgICAgaWYgKHNlYy0+X3Jhd19zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0JICAgICAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLQkgICAgICAvKiBXZSBhcmUgaW50ZXJlc3RlZCBpbiBqdXN0IGxvY2FsIHN5bWJvbHMsIG5vdCBhbGwKLQkJIHN5bWJvbHMuICAqLwotCSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHNlYy0+b3duZXIpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJICAmJiAoc2VjLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotCQl7Ci0JCSAgc2l6ZV90IHN5bV9jb3VudDsKLQotCQkgIGlmIChlbGZfYmFkX3N5bXRhYiAoc2VjLT5vd25lcikpCi0JCSAgICBzeW1fY291bnQgPSAoZWxmX3RkYXRhIChzZWMtPm93bmVyKS0+c3ltdGFiX2hkci5zaF9zaXplCi0JCQkJIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSk7Ci0JCSAgZWxzZQotCQkgICAgc3ltX2NvdW50ID0gZWxmX3RkYXRhIChzZWMtPm93bmVyKS0+c3ltdGFiX2hkci5zaF9pbmZvOwotCi0JCSAgaWYgKHN5bV9jb3VudCA+IG1heF9zeW1fY291bnQpCi0JCSAgICBtYXhfc3ltX2NvdW50ID0gc3ltX2NvdW50OwotCi0JCSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCQkgICAgewotCQkgICAgICBzaXplX3QgZXh0X3NpemU7Ci0KLQkJICAgICAgZXh0X3NpemUgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX3NpemU7Ci0JCSAgICAgIGlmIChleHRfc2l6ZSA+IG1heF9leHRlcm5hbF9yZWxvY19zaXplKQotCQkJbWF4X2V4dGVybmFsX3JlbG9jX3NpemUgPSBleHRfc2l6ZTsKLQkJICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQpCi0JCQltYXhfaW50ZXJuYWxfcmVsb2NfY291bnQgPSBzZWMtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCA+IDApCi0Jby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEV4cGxpY2l0bHkgY2xlYXIgdGhlIFNFQ19SRUxPQyBmbGFnLiAgVGhlIGxpbmtlciB0ZW5kcyB0bwotCSAgICAgc2V0IGl0ICh0aGlzIGlzIHByb2JhYmx5IGEgYnVnKSBhbmQgaWYgaXQgaXMgc2V0Ci0JICAgICBhc3NpZ25fc2VjdGlvbl9udW1iZXJzIHdpbGwgY3JlYXRlIGEgcmVsb2Mgc2VjdGlvbi4gICovCi0JICBvLT5mbGFncyAmPX4gU0VDX1JFTE9DOwotCX0KLQotICAgICAgLyogSWYgdGhlIFNFQ19BTExPQyBmbGFnIGlzIG5vdCBzZXQsIGZvcmNlIHRoZSBzZWN0aW9uIFZNQSB0bwotCSB6ZXJvLiAgVGhpcyBpcyBkb25lIGluIGVsZl9mYWtlX3NlY3Rpb25zIGFzIHdlbGwsIGJ1dCBmb3JjaW5nCi0JIHRoZSBWTUEgdG8gMCBoZXJlIHdpbGwgZW5zdXJlIHRoYXQgcmVsb2NzIGFnYWluc3QgdGhlc2UKLQkgc2VjdGlvbnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKLQkgICYmICEgby0+dXNlcl9zZXRfdm1hKQotCW8tPnZtYSA9IDA7Ci0gICAgfQotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBldmVyeXRoaW5nIGJ1dCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIGFuZCB0aGUgcmVsb2NzLiAgV2Ugc2V0IHN5bWNvdW50IHRvIGZvcmNlIGFzc2lnbl9zZWN0aW9uX251bWJlcnMKLSAgICAgdG8gY3JlYXRlIGEgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgPyAwIDogMTsKLSAgQkZEX0FTU0VSVCAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKLSAgaWYgKCEgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkLCBpbmZvKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBGaWd1cmUgb3V0IGhvdyBtYW55IHJlbG9jYXRpb25zIHdlIHdpbGwgaGF2ZSBpbiBlYWNoIHNlY3Rpb24uCi0gICAgIEp1c3QgdXNpbmcgUkVMT0NfQ09VTlQgaXNuJ3QgZ29vZCBlbm91Z2ggc2luY2UgdGhhdCBkb2Vzbid0Ci0gICAgIG1haW50YWluIGEgc2VwYXJhdGUgdmFsdWUgZm9yIFJFTCB2cy4gUkVMQSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCSAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHNlY3Rpb24gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbGluay4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgb3V0cHV0X3NlY3Rpb24gPSBvLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkgICAgICAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmVzZGkgCi0JCT0gZWxmX3NlY3Rpb25fZGF0YSAobyk7Ci0JICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICplc2RvIAotCQk9IGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB1bnNpZ25lZCBpbnQgKnJlbF9jb3VudDsKLQkgICAgICB1bnNpZ25lZCBpbnQgKnJlbF9jb3VudDI7Ci0KLQkgICAgICAvKiBXZSBtdXN0IGJlIGNhcmVmdWwgdG8gYWRkIHRoZSByZWxvY2F0aW9uIGZyb21zIHRoZQotCQkgaW5wdXQgc2VjdGlvbiB0byB0aGUgcmlnaHQgb3V0cHV0IGNvdW50LiAgKi8KLQkgICAgICBpZiAoZXNkaS0+cmVsX2hkci5zaF9lbnRzaXplID09IGVzZG8tPnJlbF9oZHIuc2hfZW50c2l6ZSkKLQkJewotCQkgIHJlbF9jb3VudCA9ICZlc2RvLT5yZWxfY291bnQ7Ci0JCSAgcmVsX2NvdW50MiA9ICZlc2RvLT5yZWxfY291bnQyOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsX2NvdW50ID0gJmVzZG8tPnJlbF9jb3VudDI7Ci0JCSAgcmVsX2NvdW50MiA9ICZlc2RvLT5yZWxfY291bnQ7Ci0JCX0KLQkgICAgICAKLQkgICAgICAqcmVsX2NvdW50ICs9IChlc2RpLT5yZWxfaGRyLnNoX3NpemUgCi0JCQkgICAgIC8gZXNkaS0+cmVsX2hkci5zaF9lbnRzaXplKTsKLQkgICAgICBpZiAoZXNkaS0+cmVsX2hkcjIpCi0JCSpyZWxfY291bnQyICs9IChlc2RpLT5yZWxfaGRyMi0+c2hfc2l6ZSAKLQkJCQkvIGVzZGktPnJlbF9oZHIyLT5zaF9lbnRzaXplKTsKLQkgICAgfQotCX0KLQotICAvKiBUaGF0IGNyZWF0ZWQgdGhlIHJlbG9jIHNlY3Rpb25zLiAgU2V0IHRoZWlyIHNpemVzLCBhbmQgYXNzaWduCi0gICAgIHRoZW0gZmlsZSBwb3NpdGlvbnMsIGFuZCBhbGxvY2F0ZSBzb21lIGJ1ZmZlcnMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGlmICghZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uIChhYmZkLAotCQkJCQkgICAgJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyLAotCQkJCQkgICAgbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyCi0JICAgICAgJiYgIWVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbiAoYWJmZCwKLQkJCQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMiwKLQkJCQkJICAgICAgIG8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIE5vdywgcmVzZXQgUkVMX0NPVU5UIGFuZCBSRUxfQ09VTlQyIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtCi0JIHRvIGNvdW50IHVwd2FyZHMgd2hpbGUgYWN0dWFsbHkgb3V0cHV0dGluZyB0aGUgcmVsb2NhdGlvbnMuICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2NvdW50ID0gMDsKLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQyID0gMDsKLSAgICB9Ci0KLSAgX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MgKGFiZmQpOwotCi0gIC8qIFdlIGhhdmUgbm93IGFzc2lnbmVkIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zIGV4Y2VwdAotICAgICAuc3ltdGFiIGFuZCAuc3RydGFiLiAgV2Ugc3RhcnQgdGhlIC5zeW10YWIgc2VjdGlvbiBhdCB0aGUgY3VycmVudAotICAgICBmaWxlIHBvc2l0aW9uLCBhbmQgd3JpdGUgZGlyZWN0bHkgdG8gaXQuICBXZSBidWlsZCB0aGUgLnN0cnRhYgotICAgICBzZWN0aW9uIGluIG1lbW9yeS4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAvKiBzaF9uYW1lIGlzIHNldCBpbiBwcmVwX2hlYWRlcnMuICAqLwotICBzeW10YWJfaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQjsKLSAgc3ltdGFiX2hkci0+c2hfZmxhZ3MgPSAwOwotICBzeW10YWJfaGRyLT5zaF9hZGRyID0gMDsKLSAgc3ltdGFiX2hkci0+c2hfc2l6ZSA9IDA7Ci0gIHN5bXRhYl9oZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAvKiBzaF9saW5rIGlzIHNldCBpbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLiAgKi8KLSAgLyogc2hfaW5mbyBpcyBzZXQgYmVsb3cuICAqLwotICAvKiBzaF9vZmZzZXQgaXMgc2V0IGp1c3QgYmVsb3cuICAqLwotICBzeW10YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSA0OyAgLyogRklYTUU6IHN5c3RlbSBkZXBlbmRlbnQ/ICAqLwotCi0gIG9mZiA9IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3M7Ci0gIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChzeW10YWJfaGRyLCBvZmYsIHRydWUpOwotCi0gIC8qIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgaXMKLSAgICAgaW5jb3JyZWN0LiAgV2UgZG8gbm90IHlldCBrbm93IHRoZSBzaXplIG9mIHRoZSAuc3ltdGFiIHNlY3Rpb24uCi0gICAgIFdlIGNvcnJlY3QgbmV4dF9maWxlX3BvcyBiZWxvdywgYWZ0ZXIgd2UgZG8ga25vdyB0aGUgc2l6ZS4gICovCi0KLSAgLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCBzd2FwcGVkIG91dCBzeW1ib2xzLiAgVGhpcyBpcyB0byBhdm9pZAotICAgICBjb250aW51b3VzbHkgc2Vla2luZyB0byB0aGUgcmlnaHQgcG9zaXRpb24gaW4gdGhlIGZpbGUuICAqLwotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSB8fCBtYXhfc3ltX2NvdW50IDwgMjApCi0gICAgZmluZm8uc3ltYnVmX3NpemUgPSAyMDsKLSAgZWxzZQotICAgIGZpbmZvLnN5bWJ1Zl9zaXplID0gbWF4X3N5bV9jb3VudDsKLSAgZmluZm8uc3ltYnVmID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JCSAgYmZkX21hbGxvYyAoZmluZm8uc3ltYnVmX3NpemUgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGlmIChmaW5mby5zeW1idWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBTdGFydCB3cml0aW5nIG91dCB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIGZpcnN0IHN5bWJvbCBpcyBhbHdheXMgYQotICAgICBkdW1teSBzeW1ib2wuICAqLwotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsIHx8IGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBlbGZzeW0uc3RfdmFsdWUgPSAwOwotICAgICAgZWxmc3ltLnN0X3NpemUgPSAwOwotICAgICAgZWxmc3ltLnN0X2luZm8gPSAwOwotICAgICAgZWxmc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGVsZnN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKCZmaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgJmVsZnN5bSwgYmZkX3VuZF9zZWN0aW9uX3B0cikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0jaWYgMAotICAvKiBTb21lIHN0YW5kYXJkIEVMRiBsaW5rZXJzIGRvIHRoaXMsIGJ1dCB3ZSBkb24ndCBiZWNhdXNlIGl0IGNhdXNlcwotICAgICBib290c3RyYXAgY29tcGFyaXNvbiBmYWlsdXJlcy4gICovCi0gIC8qIE91dHB1dCBhIGZpbGUgc3ltYm9sIGZvciB0aGUgb3V0cHV0IGZpbGUgYXMgdGhlIHNlY29uZCBzeW1ib2wuCi0gICAgIFdlIG91dHB1dCB0aGlzIGV2ZW4gaWYgd2UgYXJlIGRpc2NhcmRpbmcgbG9jYWwgc3ltYm9scywgYWx0aG91Z2gKLSAgICAgSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdC4gICovCi0gIGVsZnN5bS5zdF92YWx1ZSA9IDA7Ci0gIGVsZnN5bS5zdF9zaXplID0gMDsKLSAgZWxmc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfRklMRSk7Ci0gIGVsZnN5bS5zdF9vdGhlciA9IDA7Ci0gIGVsZnN5bS5zdF9zaG5keCA9IFNITl9BQlM7Ci0gIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKCZmaW5mbywgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgICZlbGZzeW0sIGJmZF9hYnNfc2VjdGlvbl9wdHIpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotI2VuZGlmCi0KLSAgLyogT3V0cHV0IGEgc3ltYm9sIGZvciBlYWNoIHNlY3Rpb24uICBXZSBvdXRwdXQgdGhlc2UgZXZlbiBpZiB3ZSBhcmUKLSAgICAgZGlzY2FyZGluZyBsb2NhbCBzeW1ib2xzLCBzaW5jZSB0aGV5IGFyZSB1c2VkIGZvciByZWxvY3MuICBUaGVzZQotICAgICBzeW1ib2xzIGhhdmUgbm8gbmFtZXMuICBXZSBzdG9yZSB0aGUgaW5kZXggb2YgZWFjaCBvbmUgaW4gdGhlCi0gICAgIGluZGV4IGZpZWxkIG9mIHRoZSBzZWN0aW9uLCBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0IGFnYWluIHdoZW4KLSAgICAgb3V0cHV0dGluZyByZWxvY3MuICAqLwotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsIHx8IGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBlbGZzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIGVsZnN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07IGkrKykKLQl7Ci0JICBvID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaSk7Ci0JICBpZiAobyAhPSBOVUxMKQotCSAgICBvLT50YXJnZXRfaW5kZXggPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGVsZnN5bS5zdF9zaG5keCA9IGk7Ci0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8IG8gPT0gTlVMTCkKLQkgICAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKLQkgIGVsc2UKLQkgICAgZWxmc3ltLnN0X3ZhbHVlID0gby0+dm1hOwotCSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICAgJmVsZnN5bSwgbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgdG8gaG9sZCBpbmZvcm1hdGlvbiByZWFkIGluIGZyb20gdGhlIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgZmluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jIChtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9ICgoRWxmX0ludGVybmFsX1JlbGEgKikKLQkJCSAgIGJmZF9tYWxsb2MgKG1heF9pbnRlcm5hbF9yZWxvY19jb3VudAotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpCi0JCQkJICAgICAgICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkpOwotICBmaW5mby5leHRlcm5hbF9zeW1zID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgZmluZm8uaW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8uc2VjdGlvbnMgPSAoKGFzZWN0aW9uICoqKQotCQkgICAgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplICE9IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X2V4dGVybmFsX3JlbG9jX3NpemUgIT0gMCkKLSAgICAgIHx8IChmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLmludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCi0gICAgICB8fCAoZmluZm8uaW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5zZWN0aW9ucyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU2luY2UgRUxGIHBlcm1pdHMgcmVsb2NhdGlvbnMgdG8gYmUgYWdhaW5zdCBsb2NhbCBzeW1ib2xzLCB3ZQotICAgICBtdXN0IGhhdmUgdGhlIGxvY2FsIHN5bWJvbHMgYXZhaWxhYmxlIHdoZW4gd2UgZG8gdGhlIHJlbG9jYXRpb25zLgotICAgICBTaW5jZSB3ZSB3b3VsZCByYXRoZXIgb25seSByZWFkIHRoZSBsb2NhbCBzeW1ib2xzIG9uY2UsIGFuZCB3ZQotICAgICB3b3VsZCByYXRoZXIgbm90IGtlZXAgdGhlbSBpbiBtZW1vcnksIHdlIGhhbmRsZSBhbGwgdGhlCi0gICAgIHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgICAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiBsb2NhbAotICAgICBzeW1ib2xzIHVudGlsIHdlIGhhdmUgc2VlbiBhbGwgb2YgdGhlbSwgYW5kIHRoZSBsb2NhbCBzeW1ib2wKLSAgICAgaW5kaWNlcyBwcmVjZWRlIHRoZSBnbG9iYWwgc3ltYm9sIGluZGljZXMuICBUaGlzIG1lYW5zIHRoYXQgd2hlbgotICAgICB3ZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2Ugc2VlIGEgcmVsb2MgYWdhaW5zdAotICAgICBhIGdsb2JhbCBzeW1ib2wsIHdlIGNhbiBub3Qga25vdyB0aGUgc3ltYm9sIGluZGV4IHVudGlsIHdlIGhhdmUKLSAgICAgZmluaXNoZWQgZXhhbWluaW5nIGFsbCB0aGUgbG9jYWwgc3ltYm9scyB0byBzZWUgd2hpY2ggb25lcyB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gb3V0cHV0LiAgVG8gZGVhbCB3aXRoIHRoaXMsIHdlIGtlZXAgdGhlIHJlbG9jYXRpb25zIGluCi0gICAgIG1lbW9yeSwgYW5kIGRvbid0IG91dHB1dCB0aGVtIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIGlzCi0gICAgIGFuIHVuZm9ydHVuYXRlIHdhc3RlIG9mIG1lbW9yeSwgYnV0IEkgZG9uJ3Qgc2VlIGEgZ29vZCB3YXkgYXJvdW5kCi0gICAgIGl0LiAgRm9ydHVuYXRlbHksIGl0IG9ubHkgaGFwcGVucyB3aGVuIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUKLSAgICAgbGluaywgd2hpY2ggaXMgbm90IHRoZSBjb21tb24gY2FzZS4gIEZJWE1FOiBJZiBrZWVwX21lbW9yeSBpcyBzZXQKLSAgICAgd2UgY291bGQgd3JpdGUgdGhlIHJlbG9jcyBvdXQgYW5kIHRoZW4gcmVhZCB0aGVtIGFnYWluOyBJIGRvbid0Ci0gICAgIGtub3cgaG93IGJhZCB0aGUgbWVtb3J5IGxvc3Mgd2lsbCBiZS4gICovCi0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBzdWIgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1bikKLQkJewotCQkgIGlmICghIGVsZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBzdWIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISBlbGZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUaGF0IHdyb3RlIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGaW5pc2ggdXAgdGhlIHN5bWJvbCB0YWJsZQotICAgICB3aXRoIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0KLSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCAmJiBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgLyogT3V0cHV0IGFueSBnbG9iYWwgc3ltYm9scyB0aGF0IGdvdCBjb252ZXJ0ZWQgdG8gbG9jYWwgaW4gYQotICAgICAgICAgdmVyc2lvbiBzY3JpcHQuICBXZSBkbyB0aGlzIGluIGEgc2VwYXJhdGUgc3RlcCBzaW5jZSBFTEYKLSAgICAgICAgIHJlcXVpcmVzIGFsbCBsb2NhbCBzeW1ib2xzIHRvIGFwcGVhciBwcmlvciB0byBhbnkgZ2xvYmFsCi0gICAgICAgICBzeW1ib2xzLiAgRklYTUU6IFdlIHNob3VsZCBvbmx5IGRvIHRoaXMgaWYgc29tZSBnbG9iYWwKLSAgICAgICAgIHN5bWJvbHMgd2VyZSwgaW4gZmFjdCwgY29udmVydGVkIHRvIGJlY29tZSBsb2NhbC4gIEZJWE1FOgotICAgICAgICAgV2lsbCB0aGlzIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIElyaXggNSBsaW5rZXI/ICAqLwotICAgICAgZW9pbmZvLmZhaWxlZCA9IGZhbHNlOwotICAgICAgZW9pbmZvLmZpbmZvID0gJmZpbmZvOwotICAgICAgZW9pbmZvLmxvY2Fsc3ltcyA9IHRydWU7Ci0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGVsZl9saW5rX291dHB1dF9leHRzeW0sCi0JCQkgICAgICAoUFRSKSAmZW9pbmZvKTsKLSAgICAgIGlmIChlb2luZm8uZmFpbGVkKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHNoX2luZm8gZmllbGQgcmVjb3JkcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbiBsb2NhbCBzeW1ib2wuICAqLwotICBzeW10YWJfaGRyLT5zaF9pbmZvID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBFbGZfRXh0ZXJuYWxfU3ltICpkeW5zeW0gPQotCShFbGZfRXh0ZXJuYWxfU3ltICopZmluZm8uZHluc3ltX3NlYy0+Y29udGVudHM7Ci0gICAgICBsb25nIGxhc3RfbG9jYWwgPSAwOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkKQotCXsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBzeW0uc3Rfc2l6ZSA9IDA7Ci0JICBzeW0uc3RfbmFtZSA9IDA7Ci0JICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLQkgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLQkgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IGluZHg7Ci0JICAgICAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgICAgICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7Ci0JICAgICAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQkgICAgICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7Ci0KLQkgICAgICBlbGZfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmc3ltLAotCQkJCSAgIGR5bnN5bSArIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4KTsKLQkgICAgfQotCi0JICBsYXN0X2xvY2FsID0gYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKTsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbG9jYWwgZHluc3ltcy4gICovCi0gICAgICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbCkKLQl7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqZTsKLQkgIGZvciAoZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWw7IGUgOyBlID0gZS0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCi0JICAgICAgc3ltLnN0X3NpemUgPSBlLT5pc3ltLnN0X3NpemU7Ci0JICAgICAgc3ltLnN0X290aGVyID0gZS0+aXN5bS5zdF9vdGhlcjsKLQotCSAgICAgIC8qIENvcHkgdGhlIGludGVybmFsIHN5bWJvbCBhcyBpcy4KLQkJIE5vdGUgdGhhdCB3ZSBzYXZlZCBhIHdvcmQgb2Ygc3RvcmFnZSBhbmQgb3Zlcndyb3RlCi0gICAgICAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBzdF9uYW1lIHdpdGggdGhlIGR5bnN0cl9pbmRleC4gICovCi0gICAgICAgICAgICAgIHN5bSA9IGUtPmlzeW07Ci0KLQkgICAgICBpZiAoZS0+aXN5bS5zdF9zaG5keCA+IDAgJiYgZS0+aXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCXsKLQkJICBzID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGUtPmlucHV0X2JmZCwKLQkJCQkJCSAgZS0+aXN5bS5zdF9zaG5keCk7Ci0KLQkJICBzeW0uc3Rfc2huZHggPQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAocy0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2lkeDsKLQkJICBzeW0uc3RfdmFsdWUgPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICArIGUtPmlzeW0uc3RfdmFsdWUpOwotCQl9Ci0KLQkgICAgICBpZiAobGFzdF9sb2NhbCA8IGUtPmR5bmluZHgpCi0JCWxhc3RfbG9jYWwgPSBlLT5keW5pbmR4OwotCi0JICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJnN5bSwgZHluc3ltICsgZS0+ZHluaW5keCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKGZpbmZvLmR5bnN5bV9zZWMtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9Ci0JbGFzdF9sb2NhbCArIDE7Ci0gICAgfQotCi0gIC8qIFdlIGdldCB0aGUgZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGVvaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgZW9pbmZvLmxvY2Fsc3ltcyA9IGZhbHNlOwotICBlb2luZm8uZmluZm8gPSAmZmluZm87Ci0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSwKLQkJCSAgKFBUUikgJmVvaW5mbyk7Ci0gIGlmIChlb2luZm8uZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiBiYWNrZW5kIG5lZWRzIHRvIG91dHB1dCBzb21lIHN5bWJvbHMgbm90IHByZXNlbnQgaW4gdGhlIGhhc2gKLSAgICAgdGFibGUsIGRvIGl0IG5vdy4gICovCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMpCi0gICAgewotICAgICAgaWYgKCEgKCpiZWQtPmVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMpCi0JICAgICAgKGFiZmQsIGluZm8sIChQVFIpICZmaW5mbywKLQkgICAgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotCSAgICAgICAgICAgICAgICAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSkpCi0JICAgICAgIGVsZl9saW5rX291dHB1dF9zeW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9ICAgICAgCi0KLSAgLyogRmx1c2ggYWxsIHN5bWJvbHMgdG8gdGhlIGZpbGUuICAqLwotICBpZiAoISBlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyAoJmZpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdlIGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bXRhYiBzZWN0aW9uLiAgKi8KLSAgb2ZmICs9IHN5bXRhYl9oZHItPnNoX3NpemU7Ci0KLSAgLyogRmluaXNoIHVwIGFuZCB3cml0ZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgKC5zdHJ0YWIpCi0gICAgIHNlY3Rpb24uICAqLwotICBzeW1zdHJ0YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0gIC8qIHNoX25hbWUgd2FzIHNldCBpbiBwcmVwX2hlYWRlcnMuICAqLwotICBzeW1zdHJ0YWJfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgc3ltc3RydGFiX2hkci0+c2hfZmxhZ3MgPSAwOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9hZGRyID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN5bXN0cnRhYik7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2VudHNpemUgPSAwOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9saW5rID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7Ci0gIC8qIHNoX29mZnNldCBpcyBzZXQganVzdCBiZWxvdy4gICovCi0gIHN5bXN0cnRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDE7Ci0KLSAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHN5bXN0cnRhYl9oZHIsIG9mZiwgdHJ1ZSk7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXN0cnRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZmluZm8uc3ltc3RydGFiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgcmVsb2NzIHRvIGhhdmUgdGhlIGNvcnJlY3Qgc3ltYm9sIGluZGljZXMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBlbGZfbGlua19hZGp1c3RfcmVsb2NzIChhYmZkLCAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIsIAotCQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudCwKLQkJCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjIgIT0gTlVMTCkKLQllbGZfbGlua19hZGp1c3RfcmVsb2NzIChhYmZkLCBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjIsCi0JCQkJZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudDIsCi0JCQkJKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzIAotCQkJCSArIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQpKTsKLQotICAgICAgLyogU2V0IHRoZSByZWxvY19jb3VudCBmaWVsZCB0byAwIHRvIHByZXZlbnQgd3JpdGVfcmVsb2NzIGZyb20KLQkgdHJ5aW5nIHRvIHN3YXAgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LCBvciBnZW5lcmF0aW5nIGEKLSAgICAgc2hhcmVkIGxpYnJhcnksIGZpbmlzaCB1cCB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICAvKiBGaXggdXAgLmR5bmFtaWMgZW50cmllcy4gICovCi0gICAgICBvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gICAgICBCRkRfQVNTRVJUIChvICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmX0V4dGVybmFsX0R5biAqKSBvLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGZfRXh0ZXJuYWxfRHluICopIChvLT5jb250ZW50cyArIG8tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotCSAgZWxmX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSU5JVDoKLQkgICAgICBuYW1lID0gaW5mby0+aW5pdF9mdW5jdGlvbjsKLQkgICAgICBnb3RvIGdldF9zeW07Ci0JICAgIGNhc2UgRFRfRklOSToKLQkgICAgICBuYW1lID0gaW5mby0+ZmluaV9mdW5jdGlvbjsKLQkgICAgZ2V0X3N5bToKLQkgICAgICB7Ci0JCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCWggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAotCQkJCQkgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWlmIChoICE9IE5VTEwKLQkJICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQl8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJICB7Ci0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICBvID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgaWYgKG8tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JCSAgICAgIGR5bi5kX3VuLmRfdmFsICs9IChvLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIG8tPm91dHB1dF9vZmZzZXQpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBUaGUgc3ltYm9sIGlzIGltcG9ydGVkIGZyb20gYW5vdGhlciBzaGFyZWQKLQkJCSAgIGxpYnJhcnkgYW5kIGRvZXMgbm90IGFwcGx5IHRvIHRoaXMgb25lLiAgKi8KLQkJCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkJICAgICAgfQotCi0JCSAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX0hBU0g6Ci0JICAgICAgbmFtZSA9ICIuaGFzaCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1NUUlRBQjoKLQkgICAgICBuYW1lID0gIi5keW5zdHIiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9TWU1UQUI6Ci0JICAgICAgbmFtZSA9ICIuZHluc3ltIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfVkVSREVGOgotCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uX2QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9WRVJORUVEOgotCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uX3IiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9WRVJTWU06Ci0JICAgICAgbmFtZSA9ICIuZ251LnZlcnNpb24iOwotCSAgICBnZXRfdm1hOgotCSAgICAgIG8gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAobyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IG8tPnZtYTsKLQkgICAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUw6Ci0JICAgIGNhc2UgRFRfUkVMQToKLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9SRUwgfHwgZHluLmRfdGFnID09IERUX1JFTFNaKQotCQl0eXBlID0gU0hUX1JFTDsKLQkgICAgICBlbHNlCi0JCXR5cGUgPSBTSFRfUkVMQTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JICAgICAgZm9yIChpID0gMTsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOyBpKyspCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0JCSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpXTsKLQkJICBpZiAoaGRyLT5zaF90eXBlID09IHR5cGUKLQkJICAgICAgJiYgKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfUkVMU1ogfHwgZHluLmRfdGFnID09IERUX1JFTEFTWikKLQkJCWR5bi5kX3VuLmRfdmFsICs9IGhkci0+c2hfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAoZHluLmRfdW4uZF92YWwgPT0gMAotCQkJICAgICAgfHwgaGRyLT5zaF9hZGRyIDwgZHluLmRfdW4uZF92YWwpCi0JCQkgICAgZHluLmRfdW4uZF92YWwgPSBoZHItPnNoX2FkZHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgY3JlYXRlZCBhbnkgZHluYW1pYyBzZWN0aW9ucywgdGhlbiBvdXRwdXQgdGhlbS4gICovCi0gIGlmIChkeW5vYmogIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpIChhYmZkLCBpbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZm9yIChvID0gZHlub2JqLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgICAgIHx8IG8tPl9yYXdfc2l6ZSA9PSAwKQotCSAgICBjb250aW51ZTsKLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHNlY3Rpb25zCi0gICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAoKGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfdHlwZQotCSAgICAgICAhPSBTSFRfU1RSVEFCKQotCSAgICAgIHx8IHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCAiLmR5bnN0ciIpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBvLT5jb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbGVfcHRyIG9mZjsKLQotCSAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGUgLmR5bnN0ciBzZWN0aW9uIGFyZSBhY3R1YWxseSBpbiBhCi0gICAgICAgICAgICAgICAgIHN0cmluZ3RhYi4gICovCi0JICAgICAgb2ZmID0gZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9vZmZzZXQ7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLAotCQkJCQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBvcHRpbWl6ZWQgc3RhYnMgc3RyaW5ncywgb3V0cHV0IHRoZW0uICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAoYWJmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN5bXN0cnRhYik7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW5kaWNlcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmluZGljZXMpOwotICBpZiAoZmluZm8uc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zZWN0aW9ucyk7Ci0gIGlmIChmaW5mby5zeW1idWYgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1idWYpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAhPSBOVUxMKQotCWZyZWUgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKLSAgICB9Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+bGlua2VyID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN5bXN0cnRhYik7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW5kaWNlcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmluZGljZXMpOwotICBpZiAoZmluZm8uc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zZWN0aW9ucyk7Ci0gIGlmIChmaW5mby5zeW1idWYgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1idWYpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAhPSBOVUxMKQotCWZyZWUgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsIGVsZnN5bSwgaW5wdXRfc2VjKQotICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmVsZnN5bTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlYzsKLXsKLSAgYm9vbGVhbiAoKm91dHB1dF9zeW1ib2xfaG9vaykgUEFSQU1TICgoYmZkICosCi0JCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkJCQkJIGNvbnN0IGNoYXIgKiwKLQkJCQkJIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkJCQkJIGFzZWN0aW9uICopKTsKLQotICBvdXRwdXRfc3ltYm9sX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpLT4KLSAgICBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vazsKLSAgaWYgKG91dHB1dF9zeW1ib2xfaG9vayAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgoKm91dHB1dF9zeW1ib2xfaG9vaykKLQkgICAgIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIG5hbWUsIGVsZnN5bSwgaW5wdXRfc2VjKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0gICAgZWxmc3ltLT5zdF9uYW1lID0gMDsKLSAgZWxzZSBpZiAoaW5wdXRfc2VjLT5mbGFncyAmIFNFQ19FWENMVURFKQotICAgIGVsZnN5bS0+c3RfbmFtZSA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbGZzeW0tPnN0X25hbWUgPSAodW5zaWduZWQgbG9uZykgX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3ltc3RydGFiLAotCQkJCQkJCSAgICBuYW1lLCB0cnVlLAotCQkJCQkJCSAgICBmYWxzZSk7Ci0gICAgICBpZiAoZWxmc3ltLT5zdF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChmaW5mby0+c3ltYnVmX2NvdW50ID49IGZpbmZvLT5zeW1idWZfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyAoZmluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWxmX3N3YXBfc3ltYm9sX291dCAoZmluZm8tPm91dHB1dF9iZmQsIGVsZnN5bSwKLQkJICAgICAgIChQVFIpIChmaW5mby0+c3ltYnVmICsgZmluZm8tPnN5bWJ1Zl9jb3VudCkpOwotICArK2ZpbmZvLT5zeW1idWZfY291bnQ7Ci0KLSAgKysgYmZkX2dldF9zeW1jb3VudCAoZmluZm8tPm91dHB1dF9iZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGbHVzaCB0aGUgb3V0cHV0IHN5bWJvbHMgdG8gdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKGZpbmZvKQotICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci17Ci0gIGlmIChmaW5mby0+c3ltYnVmX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiOwotCi0gICAgICBzeW10YWIgPSAmZWxmX3RkYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoZmluZm8tPm91dHB1dF9iZmQsIHN5bXRhYi0+c2hfb2Zmc2V0ICsgc3ltdGFiLT5zaF9zaXplLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKChQVFIpIGZpbmZvLT5zeW1idWYsIGZpbmZvLT5zeW1idWZfY291bnQsCi0JCQkgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgZmluZm8tPm91dHB1dF9iZmQpCi0JICAgICAgIT0gZmluZm8tPnN5bWJ1Zl9jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltdGFiLT5zaF9zaXplICs9IGZpbmZvLT5zeW1idWZfY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gICAgICBmaW5mby0+c3ltYnVmX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbiBleHRlcm5hbCBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlIHRyYXZlcnNhbCByb3V0aW5lLiAgV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwKLSAgIHdlIGdvIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lIHdlIG91dHB1dAotICAgYW55dGhpbmcgdGhhdCBtaWdodCBoYXZlIGJlZW4gZm9yY2VkIHRvIGxvY2FsIHNjb3BlIGluIGEgdmVyc2lvbgotICAgc2NyaXB0LiAgVGhlIHNlY29uZCB0aW1lIHdlIG91dHB1dCB0aGUgc3ltYm9scyB0aGF0IGFyZSBzdGlsbAotICAgZ2xvYmFsIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvICplb2luZm8gPSAoc3RydWN0IGVsZl9vdXRleHRfaW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSBlb2luZm8tPmZpbmZvOwotICBib29sZWFuIHN0cmlwOwotICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgYXNlY3Rpb24gKmlucHV0X3NlYzsKLQotICAvKiBEZWNpZGUgd2hldGhlciB0byBvdXRwdXQgdGhpcyBzeW1ib2wgaW4gdGhpcyBwYXNzLiAgKi8KLSAgaWYgKGVvaW5mby0+bG9jYWxzeW1zKQotICAgIHsKLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgc3ltYm9sIGlzCi0gICAgIHJlZmVyZW5jZWQgYnkgYSBzaGFyZWQgbGlicmFyeSBidXQgaXMgbm90IGRlZmluZWQgYW55d2hlcmUsIHRoZW4KLSAgICAgd2FybiB0aGF0IGl0IGlzIHVuZGVmaW5lZC4gIElmIHdlIGRvIG5vdCBkbyB0aGlzLCB0aGUgcnVudGltZQotICAgICBsaW5rZXIgd2lsbCBjb21wbGFpbiB0aGF0IHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIHdoZW4gdGhlCi0gICAgIHByb2dyYW0gaXMgcnVuLiAgV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzeW1ib2xzIHRoYXQgYXJlCi0gICAgIHJlZmVyZW5jZWQgYnkgcmVndWxhciBmaWxlcywgYmVjYXVzZSB3ZSB3aWxsIGFscmVhZHkgaGF2ZSBpc3N1ZWQKLSAgICAgd2FybmluZ3MgZm9yIHRoZW0uICAqLwotICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIChmaW5mby0+aW5mby0+c2hhcmVkCi0JICAgICYmICFmaW5mby0+aW5mby0+bm9fdW5kZWZpbmVkKQotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCSAgICAgKGZpbmZvLT5pbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoLT5yb290LnUudW5kZWYuYWJmZCwKLQkgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgMCkpKQotCXsKLQkgIGVvaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IHN5bWJvbHMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gbWVudGlvbmVkIGJ5Ci0gICAgIGEgcmVndWxhciBmaWxlLCBvciB0aGF0IHdlIGhhdmUgYmVlbiB0b2xkIHRvIHN0cmlwLiAgSG93ZXZlciwgaWYKLSAgICAgaC0+aW5keCBpcyBzZXQgdG8gLTIsIHRoZSBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jIGFuZCB3ZSBtdXN0Ci0gICAgIG91dHB1dCBpdC4gICovCi0gIGlmIChoLT5pbmR4ID09IC0yKQotICAgIHN0cmlwID0gZmFsc2U7Ci0gIGVsc2UgaWYgKCgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKQotCSAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgICB8fCAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UKLSAgICBzdHJpcCA9IGZhbHNlOwotCi0gIC8qIElmIHdlJ3JlIHN0cmlwcGluZyBpdCwgYW5kIGl0J3Mgbm90IGEgZHluYW1pYyBzeW1ib2wsIHRoZXJlJ3MKLSAgICAgbm90aGluZyBlbHNlIHRvIGRvLiAgKi8KLSAgaWYgKHN0cmlwICYmIGgtPmR5bmluZHggPT0gLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltLnN0X3ZhbHVlID0gMDsKLSAgc3ltLnN0X3NpemUgPSBoLT5zaXplOwotICBzeW0uc3Rfb3RoZXIgPSBoLT5vdGhlcjsKLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSAhPSAwKQotICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgaC0+dHlwZSk7Ci0gIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX1dFQUssIGgtPnR5cGUpOwotICBlbHNlCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgaC0+dHlwZSk7Ci0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIGlucHV0X3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpbnB1dF9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlpbnB1dF9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JaWYgKGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkgIHsKLQkgICAgc3ltLnN0X3NobmR4ID0KLQkgICAgICBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkJIGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3ltLnN0X3NobmR4ID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IGNvdWxkIG5vdCBmaW5kIG91dHB1dCBzZWN0aW9uICVzIGZvciBpbnB1dCBzZWN0aW9uICVzIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGZpbmZvLT5vdXRwdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwKLQkJICAgaW5wdXRfc2VjLT5uYW1lKTsKLQkJZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIC8qIEVMRiBzeW1ib2xzIGluIHJlbG9jYXRlYWJsZSBmaWxlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZSwKLQkgICAgICAgYnV0IGluIG5vbnJlbG9jYXRlYWJsZSBmaWxlcyB0aGV5IGFyZSB2aXJ0dWFsCi0JICAgICAgIGFkZHJlc3Nlcy4gICovCi0JICAgIHN5bS5zdF92YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWUgKyBpbnB1dF9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgICAgc3ltLnN0X3ZhbHVlICs9IGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIEJGRF9BU1NFUlQgKGlucHV0X3NlYy0+b3duZXIgPT0gTlVMTAotCQkJfHwgKGlucHV0X3NlYy0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCk7Ci0JICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQkgICAgaW5wdXRfc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIGlucHV0X3NlYyA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fQ09NTU9OOwotICAgICAgc3ltLnN0X3ZhbHVlID0gMSA8PCBoLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICAgIC8qIFRoZXNlIHN5bWJvbHMgYXJlIGNyZWF0ZWQgYnkgc3ltYm9sIHZlcnNpb25pbmcuICBUaGV5IHBvaW50Ci0gICAgICAgICB0byB0aGUgZGVjb3JhdGVkIHZlcnNpb24gb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgaWYgdGhlCi0gICAgICAgICBzeW1ib2wgZm9vQEBHTlVfMS4yIGlzIHRoZSBkZWZhdWx0LCB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICAgICBmb28gaXMgdXNlZCB3aXRoIG5vIHZlcnNpb24sIHRoZW4gd2UgYWRkIGFuIGluZGlyZWN0IHN5bWJvbAotICAgICAgICAgZm9vIHdoaWNoIHBvaW50cyB0byBmb29AQEdOVV8xLjIuICBXZSBpZ25vcmUgdGhlc2Ugc3ltYm9scywKLSAgICAgICAgIHNpbmNlIHRoZSBpbmRpcmVjdGVkIHN5bWJvbCBpcyBhbHJlYWR5IGluIHRoZSBoYXNoIHRhYmxlLiAgSWYKLSAgICAgICAgIHRoZSBpbmRpcmVjdCBzeW1ib2wgaXMgbm9uLUVMRiwgZmFsbCB0aHJvdWdoIGFuZCBvdXRwdXQgaXQuICAqLwotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0VMRikgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIFdlIGNhbid0IHJlcHJlc2VudCB0aGVzZSBzeW1ib2xzIGluIEVMRiwgYWx0aG91Z2ggYSB3YXJuaW5nCi0gICAgICAgICBzeW1ib2wgbWF5IGhhdmUgY29tZSBmcm9tIGEgLmdudS53YXJuaW5nLlNZTUJPTCBzZWN0aW9uLiAgV2UKLSAgICAgICAgIGp1c3QgcHV0IHRoZSB0YXJnZXQgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgdGhlIHRhcmdldAotICAgICAgICAgc3ltYm9sIGRvZXMgbm90IHJlYWxseSBleGlzdCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKGgtPnJvb3QudS5pLmxpbmstPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gKGVsZl9saW5rX291dHB1dF9leHRzeW0KLQkgICAgICAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbmssIGRhdGEpKTsKLSAgICB9Ci0KLSAgLyogR2l2ZSB0aGUgcHJvY2Vzc29yIGJhY2tlbmQgYSBjaGFuY2UgdG8gdHdlYWsgdGhlIHN5bWJvbCB2YWx1ZSwKLSAgICAgYW5kIGFsc28gdG8gZmluaXNoIHVwIGFueXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgdGhpcwotICAgICBzeW1ib2wuICAqLwotICBpZiAoKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgIT0gMCkKLSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gICAgICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpOwotICAgICAgaWYgKCEgKCgqYmVkLT5lbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpCi0JICAgICAoZmluZm8tPm91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBoLCAmc3ltKSkpCi0JewotCSAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG1hcmtpbmcgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIGFuZCB0aGVyZSBhcmUgbm8KLSAgICAgbm9uLXdlYWsgcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCBmcm9tIGEgcmVndWxhciBvYmplY3QsIHRoZW4KLSAgICAgbWFyayB0aGUgc3ltYm9sIGFzIHdlYWsgdW5kZWZpbmVkOyBpZiB0aGVyZSBhcmUgbm9uLXdlYWsKLSAgICAgcmVmZXJlbmNlcywgbWFyayB0aGUgc3ltYm9sIGFzIHN0cm9uZy4gIFdlIGNhbid0IGRvIHRoaXMgZWFybGllciwKLSAgICAgYmVjYXVzZSBpdCBtaWdodCBub3QgYmUgbWFya2VkIGFzIHVuZGVmaW5lZCB1bnRpbCB0aGUKLSAgICAgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUgZ2V0cyB0aHJvdWdoIHdpdGggaXQuICAqLwotICBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRgotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0gICAgICAmJiAoRUxGX1NUX0JJTkQoc3ltLnN0X2luZm8pID09IFNUQl9HTE9CQUwKLQkgIHx8IEVMRl9TVF9CSU5EKHN5bS5zdF9pbmZvKSA9PSBTVEJfV0VBSykpCi0gICAgewotICAgICAgaW50IGJpbmR0eXBlOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspICE9IDApCi0JYmluZHR5cGUgPSBTVEJfR0xPQkFMOwotICAgICAgZWxzZQotCWJpbmR0eXBlID0gU1RCX1dFQUs7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChiaW5kdHlwZSwgRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIHNob3VsZCBiZSBwdXQgaW4gdGhlIC5keW5zeW0gc2VjdGlvbiwgdGhlbiBwdXQgaXQKLSAgICAgdGhlcmUgbm93LiAgV2UgaGF2ZSBhbHJlYWR5IGtub3cgdGhlIHN5bWJvbCBpbmRleC4gIFdlIGFsc28gZmlsbAotICAgICBpbiB0aGUgZW50cnkgaW4gdGhlIC5oYXNoIHNlY3Rpb24uICAqLwotICBpZiAoaC0+ZHluaW5keCAhPSAtMQotICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBidWNrZXRjb3VudDsKLSAgICAgIHNpemVfdCBidWNrZXQ7Ci0gICAgICBzaXplX3QgaGFzaF9lbnRyeV9zaXplOwotICAgICAgYmZkX2J5dGUgKmJ1Y2tldHBvczsKLSAgICAgIGJmZF92bWEgY2hhaW47Ci0KLSAgICAgIHN5bS5zdF9uYW1lID0gaC0+ZHluc3RyX2luZGV4OwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgJnN5bSwKLQkJCSAgIChQVFIpICgoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJCQkgICBmaW5mby0+ZHluc3ltX3NlYy0+Y29udGVudHMpCi0JCQkJICArIGgtPmR5bmluZHgpKTsKLQotICAgICAgYnVja2V0Y291bnQgPSBlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5idWNrZXRjb3VudDsKLSAgICAgIGJ1Y2tldCA9IGgtPmVsZl9oYXNoX3ZhbHVlICUgYnVja2V0Y291bnQ7Ci0gICAgICBoYXNoX2VudHJ5X3NpemUgCi0JPSBlbGZfc2VjdGlvbl9kYXRhIChmaW5mby0+aGFzaF9zZWMpLT50aGlzX2hkci5zaF9lbnRzaXplOwotICAgICAgYnVja2V0cG9zID0gKChiZmRfYnl0ZSAqKSBmaW5mby0+aGFzaF9zZWMtPmNvbnRlbnRzCi0JCSAgICsgKGJ1Y2tldCArIDIpICogaGFzaF9lbnRyeV9zaXplKTsKLSAgICAgIGNoYWluID0gYmZkX2dldCAoOCAqIGhhc2hfZW50cnlfc2l6ZSwgZmluZm8tPm91dHB1dF9iZmQsIGJ1Y2tldHBvcyk7Ci0gICAgICBiZmRfcHV0ICg4ICogaGFzaF9lbnRyeV9zaXplLCBmaW5mby0+b3V0cHV0X2JmZCwgaC0+ZHluaW5keCwgYnVja2V0cG9zKTsKLSAgICAgIGJmZF9wdXQgKDggKiBoYXNoX2VudHJ5X3NpemUsIGZpbmZvLT5vdXRwdXRfYmZkLCBjaGFpbiwKLQkgICAgICAgKChiZmRfYnl0ZSAqKSBmaW5mby0+aGFzaF9zZWMtPmNvbnRlbnRzCi0JCSsgKGJ1Y2tldGNvdW50ICsgMiArIGgtPmR5bmluZHgpICogaGFzaF9lbnRyeV9zaXplKSk7Ci0KLSAgICAgIGlmIChmaW5mby0+c3ltdmVyX3NlYyAhPSBOVUxMICYmIGZpbmZvLT5zeW12ZXJfc2VjLT5jb250ZW50cyAhPSBOVUxMKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9WZXJzeW0gaXZlcnN5bTsKLQotCSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChoLT52ZXJpbmZvLnZlcmRlZiA9PSBOVUxMKQotCQlpdmVyc3ltLnZzX3ZlcnMgPSAwOwotCSAgICAgIGVsc2UKLQkJaXZlcnN5bS52c192ZXJzID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2V4cF9yZWZubyArIDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKLQkJaXZlcnN5bS52c192ZXJzID0gMTsKLQkgICAgICBlbHNlCi0JCWl2ZXJzeW0udnNfdmVycyA9IGgtPnZlcmluZm8udmVydHJlZS0+dmVybnVtICsgMTsKLQkgICAgfQotCi0JICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19ISURERU4pICE9IDApCi0JICAgIGl2ZXJzeW0udnNfdmVycyB8PSBWRVJTWU1fSElEREVOOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCAmaXZlcnN5bSwKLQkJCQkgICAgKCgoRWxmX0V4dGVybmFsX1ZlcnN5bSAqKQotCQkJCSAgICAgIGZpbmZvLT5zeW12ZXJfc2VjLT5jb250ZW50cykKLQkJCQkgICAgICsgaC0+ZHluaW5keCkpOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgc3RyaXBwaW5nIGl0LCB0aGVuIGl0IHdhcyBqdXN0IGEgZHluYW1pYyBzeW1ib2wsIGFuZAotICAgICB0aGVyZSdzIG5vdGhpbmcgZWxzZSB0byBkby4gICovCi0gIGlmIChzdHJpcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT5pbmR4ID0gYmZkX2dldF9zeW1jb3VudCAoZmluZm8tPm91dHB1dF9iZmQpOwotCi0gIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCAmc3ltLCBpbnB1dF9zZWMpKQotICAgIHsKLSAgICAgIGVvaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgdGhlIHJlbG9jYXRpb25zIGluZGljYXRlZCBieSB0aGUgSU5URVJOQUxfUkVMT0NTICh3aGljaAotICAgb3JpZ2luYXRlZCBmcm9tIHRoZSBzZWN0aW9uIGdpdmVuIGJ5IElOUFVUX1JFTF9IRFIpIHRvIHRoZQotICAgT1VUUFVUX0JGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfbGlua19vdXRwdXRfcmVsb2NzIChvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBpbnB1dF9yZWxfaGRyLCAKLQkJCWludGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmlucHV0X3JlbF9oZHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhZW5kOwotICBFbGZfSW50ZXJuYWxfU2hkciAqb3V0cHV0X3JlbF9oZHI7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgdW5zaWduZWQgaW50ICpyZWxfY291bnRwID0gTlVMTDsKLQotICBvdXRwdXRfc2VjdGlvbiA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotICBvdXRwdXRfcmVsX2hkciA9IE5VTEw7Ci0KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9lbnRzaXplIAotICAgICAgPT0gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZSkKLSAgICB7Ci0gICAgICBvdXRwdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHI7Ci0gICAgICByZWxfY291bnRwID0gJmVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50OwotICAgIH0KLSAgZWxzZSBpZiAoZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyMgotCSAgICYmIChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHIyLT5zaF9lbnRzaXplCi0JICAgICAgID09IGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUpKQotICAgIHsKLSAgICAgIG91dHB1dF9yZWxfaGRyID0gZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyMjsKLSAgICAgIHJlbF9jb3VudHAgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQyOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChvdXRwdXRfcmVsX2hkciAhPSBOVUxMKTsKLSAgCi0gIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotICBpcmVsYWVuZCA9IGlyZWxhICsgaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSAvIGlucHV0X3JlbF9oZHItPnNoX2VudHNpemU7Ci0gIGlmIChpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbCAqZXJlbDsKLQotICAgICAgZXJlbCA9ICgoRWxmX0V4dGVybmFsX1JlbCAqKSBvdXRwdXRfcmVsX2hkci0+Y29udGVudHMgKyAqcmVsX2NvdW50cCk7Ci0gICAgICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKywgZXJlbCsrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWwgaXJlbDsKLQotCSAgaXJlbC5yX29mZnNldCA9IGlyZWxhLT5yX29mZnNldDsKLQkgIGlyZWwucl9pbmZvID0gaXJlbGEtPnJfaW5mbzsKLQkgIEJGRF9BU1NFUlQgKGlyZWxhLT5yX2FkZGVuZCA9PSAwKTsKLQkgIGVsZl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJmlyZWwsIGVyZWwpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsYSAqZXJlbGE7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUKLQkJICA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0gICAgICBlcmVsYSA9ICgoRWxmX0V4dGVybmFsX1JlbGEgKikgb3V0cHV0X3JlbF9oZHItPmNvbnRlbnRzICsgKnJlbF9jb3VudHApOwotICAgICAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyssIGVyZWxhKyspCi0JZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgaXJlbGEsIGVyZWxhKTsKLSAgICB9Ci0KLSAgLyogQnVtcCB0aGUgY291bnRlciwgc28gdGhhdCB3ZSBrbm93IHdoZXJlIHRvIGFkZCB0aGUgbmV4dCBzZXQgb2YKLSAgICAgcmVsb2NhdGlvbnMuICAqLwotICAqcmVsX2NvdW50cCArPSBpbnB1dF9yZWxfaGRyLT5zaF9zaXplIC8gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZTsKLX0KLQotLyogTGluayBhbiBpbnB1dCBmaWxlIGludG8gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24KLSAgIGhhbmRsZXMgYWxsIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgYXQgb25jZS4KLSAgIFRoaXMgaXMgc28gdGhhdCB3ZSBvbmx5IGhhdmUgdG8gcmVhZCB0aGUgbG9jYWwgc3ltYm9scyBvbmNlLCBhbmQKLSAgIGRvbid0IGhhdmUgdG8ga2VlcCB0aGVtIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJvb2xlYW4gKCpyZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JCQkJICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCQkJICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc2l6ZV90IGxvY3N5bWNvdW50OwotICBzaXplX3QgZXh0c3ltb2ZmOwotICBFbGZfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltZW5kOwotICBFbGZfSW50ZXJuYWxfU3ltICppc3ltOwotICBsb25nICpwaW5kZXg7Ci0gIGFzZWN0aW9uICoqcHBzZWN0aW9uOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKTsKLSAgcmVsb2NhdGVfc2VjdGlvbiA9IGJlZC0+ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbjsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIHdlIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgaGVyZToKLSAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgbG9jYWwgc3ltYm9scywgYW5kIHdlIGRvbid0IHdhbnQgdGhlIHNlY3Rpb24KLSAgICAgY29udGVudHMuICAqLwotICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZXh0c3ltb2ZmID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgIGV4dGVybmFsX3N5bXMgPSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgZWxzZSBpZiAobG9jc3ltY291bnQgPT0gMCkKLSAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBmaW5mby0+ZXh0ZXJuYWxfc3ltczsKLSAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0JCQlsb2NzeW1jb3VudCwgaW5wdXRfYmZkKQotCSAgICAgICE9IGxvY3N5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTd2FwIGluIHRoZSBsb2NhbCBzeW1ib2xzIGFuZCB3cml0ZSBvdXQgdGhlIG9uZXMgd2hpY2ggd2Uga25vdwotICAgICBhcmUgZ29pbmcgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBsb2NzeW1jb3VudDsKLSAgaXN5bSA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBwaW5kZXggPSBmaW5mby0+aW5kaWNlczsKLSAgcHBzZWN0aW9uID0gZmluZm8tPnNlY3Rpb25zOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaXN5bSsrLCBwaW5kZXgrKywgcHBzZWN0aW9uKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBvc3ltOwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bSk7Ci0gICAgICAqcGluZGV4ID0gLTE7Ci0KLSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLQl7Ci0JICBpZiAoRUxGX1NUX0JJTkQgKGlzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICAgewotCSAgICAgICpwcHNlY3Rpb24gPSBOVUxMOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaXN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCWlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoaXN5bS0+c3Rfc2huZHggPiAwICYmIGlzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQlpc2VjID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltLT5zdF9zaG5keCk7Ci0gICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCWlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoaXN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQlpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXaG8ga25vd3M/ICAqLwotCSAgaXNlYyA9IE5VTEw7Ci0JfQotCi0gICAgICAqcHBzZWN0aW9uID0gaXNlYzsKLQotICAgICAgLyogRG9uJ3Qgb3V0cHV0IHRoZSBmaXJzdCwgdW5kZWZpbmVkLCBzeW1ib2wuICAqLwotICAgICAgaWYgKGVzeW0gPT0gZXh0ZXJuYWxfc3ltcykKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgdGhpcwotCSBvbmUuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5ldmVyIG91dHB1dCBzZWN0aW9uIHN5bWJvbHMuICBJbnN0ZWFkLCB3ZSB1c2UgdGhlIHNlY3Rpb24KLQkgc3ltYm9sIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIGlmIChFTEZfU1RfVFlQRSAoaXN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkaXNjYXJkaW5nIGFsbCBsb2NhbCBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IHRvCi0JIG91dHB1dCB0aGlzIG9uZS4gIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dAotCSBmaWxlLCB0aGVuIHNvbWUgb2YgdGhlIGxvY2FsIHN5bWJvbHMgbWF5IGJlIHJlcXVpcmVkIGJ5Ci0JIHJlbG9jczsgd2Ugb3V0cHV0IHRoZW0gYmVsb3cgYXMgd2UgZGlzY292ZXIgdGhhdCB0aGV5IGFyZQotCSBuZWVkZWQuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfYWxsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgc2VjdGlvbiB3aGljaCB3ZSBhcmUKLSAgICAgICAgIGRpc2NhcmRpbmcsIHdlIGRvbid0IG5lZWQgdG8ga2VlcCBpdCwgYnV0IG5vdGUgdGhhdAotICAgICAgICAgbGlua2VyX21hcmsgaXMgb25seSByZWxpYWJsZSBmb3Igc2VjdGlvbnMgdGhhdCBoYXZlIGNvbnRlbnRzLgotICAgICAgICAgRm9yIHRoZSBiZW5lZml0IG9mIHRoZSBNSVBTIEVMRiBsaW5rZXIsIHdlIGNoZWNrIFNFQ19FWENMVURFCi0gICAgICAgICBhcyB3ZWxsIGFzIGxpbmtlcl9tYXJrLiAgKi8KLSAgICAgIGlmIChpc3ltLT5zdF9zaG5keCA+IDAKLQkgICYmIGlzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRQotCSAgJiYgaXNlYyAhPSBOVUxMCi0JICAmJiAoKCEgaXNlYy0+bGlua2VyX21hcmsgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgICAgICB8fCAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApKSkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuICAqLwotICAgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJICAgICAgaXN5bS0+c3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2VlIGlmIHdlIGFyZSBkaXNjYXJkaW5nIHN5bWJvbHMgd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICAgPT0gTlVMTCkpCi0JICB8fCAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sCi0JICAgICAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgYXJlIGdvaW5nIHRvIG91dHB1dCB0aGlzIHN5bWJvbC4gICovCi0KLSAgICAgIG9zeW0gPSAqaXN5bTsKLQotICAgICAgLyogQWRqdXN0IHRoZSBzZWN0aW9uIGluZGV4IGZvciB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgb3N5bS5zdF9zaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAob3V0cHV0X2JmZCwKLQkJCQkJCQkgaXNlYy0+b3V0cHV0X3NlY3Rpb24pOwotICAgICAgaWYgKG9zeW0uc3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICpwaW5kZXggPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQotICAgICAgLyogRUxGIHN5bWJvbHMgaW4gcmVsb2NhdGVhYmxlIGZpbGVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLCBidXQKLQkgaW4gZXhlY3V0YWJsZSBmaWxlcyB0aGV5IGFyZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdAotCSB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IGFsbCBFTEYgc2VjdGlvbnMgaGF2ZSBhbiBhc3NvY2lhdGVkCi0JIEJGRCBzZWN0aW9uIHdpdGggYSByZWFzb25hYmxlIHZhbHVlIGZvciBvdXRwdXRfb2Zmc2V0OyBiZWxvdwotCSB3ZSBhc3N1bWUgdGhhdCB0aGV5IGFsc28gaGF2ZSBhIHJlYXNvbmFibGUgdmFsdWUgZm9yCi0JIG91dHB1dF9zZWN0aW9uLiAgQW55IHNwZWNpYWwgc2VjdGlvbnMgbXVzdCBiZSBzZXQgdXAgdG8gbWVldAotCSB0aGVzZSByZXF1aXJlbWVudHMuICAqLwotICAgICAgb3N5bS5zdF92YWx1ZSArPSBpc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQlvc3ltLnN0X3ZhbHVlICs9IGlzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBuYW1lLCAmb3N5bSwgaXNlYykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgY29udGVudHMgb2YgZWFjaCBzZWN0aW9uLiAgKi8KLSAgZm9yIChvID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLSAgICAgIGlmICghIG8tPmxpbmtlcl9tYXJrKQotCXsKLQkgIC8qIFRoaXMgc2VjdGlvbiB3YXMgb21pdHRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgIHx8IChvLT5fcmF3X3NpemUgPT0gMCAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwKQotCXsKLQkgIC8qIFNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLQkgICAgIG9yIHNvbWVzdWNoLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbi4gIFRoZXkgaGF2ZSBiZWVuIGNhY2hlZCBieSBhCi0gICAgICAgICByZWxheGF0aW9uIHJvdXRpbmUuICBOb3RlIHRoYXQgbyBpcyBhIHNlY3Rpb24gaW4gYW4gaW5wdXQKLSAgICAgICAgIGZpbGUsIHNvIHRoZSBjb250ZW50cyBmaWVsZCB3aWxsIG5vdCBoYXZlIGJlZW4gc2V0IGJ5IGFueSBvZgotICAgICAgICAgdGhlIHJvdXRpbmVzIHdoaWNoIHdvcmsgb24gb3V0cHV0IGZpbGVzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQljb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb250ZW50cyA9IGZpbmZvLT5jb250ZW50czsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBvLCBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIG8tPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQotCSAgLyogR2V0IHRoZSBzd2FwcGVkIHJlbG9jcy4gICovCi0JICBpbnRlcm5hbF9yZWxvY3MgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkJICAgICAoaW5wdXRfYmZkLCBvLCBmaW5mby0+ZXh0ZXJuYWxfcmVsb2NzLAotCQkJICAgICAgZmluZm8tPmludGVybmFsX3JlbG9jcywgZmFsc2UpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgICAgICYmIG8tPnJlbG9jX2NvdW50ID4gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBieSBpbnZva2luZyBhIGJhY2sgZW5kIHJvdXRpbmUuCi0KLQkgICAgIFRoZSBiYWNrIGVuZCByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlCi0JICAgICBzZWN0aW9uIGNvbnRlbnRzIGFzIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcwotCSAgICAgYW5kIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUKLQkgICAgIHJlbG9jIGFkZGVuZCBhcyBuZWNlc3NhcnkuCi0KLQkgICAgIFRoZSBiYWNrIGVuZCByb3V0aW5lIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZwotCSAgICAgdGhlIHJlbG9jIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluCi0JICAgICBpbnRlcm5hbCBzeW1ib2xzLCBhbmQgY2FuIGFjY2VzcyB0aGUgaGFzaCB0YWJsZSBlbnRyaWVzCi0JICAgICBmb3IgdGhlIGV4dGVybmFsIHN5bWJvbHMgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0JICAgICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIGJhY2sgZW5kIHJvdXRpbmUKLQkgICAgIG11c3QgaGFuZGxlIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZQotCSAgICAgb3V0cHV0IHN5bWJvbCBpcyBnb2luZyB0byBiZSBhIHNlY3Rpb24gc3ltYm9sCi0JICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiwgd2hpY2ggd2lsbCByZXF1aXJlCi0JICAgICB0aGUgYWRkZW5kIHRvIGJlIGFkanVzdGVkLiAgKi8KLQotCSAgaWYgKCEgKCpyZWxvY2F0ZV9zZWN0aW9uKSAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJICAgICBpbnB1dF9iZmQsIG8sIGNvbnRlbnRzLAotCQkJCSAgICAgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJICAgICBmaW5mby0+c2VjdGlvbnMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWVuZDsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICppbnB1dF9yZWxfaGRyOwotCi0JICAgICAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLQotCSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGlyZWxhZW5kID0gCi0JCWlyZWxhICsgby0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOwotCSAgICAgIHJlbF9oYXNoID0gKGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+cmVsX2hhc2hlcwotCQkJICArIGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50Ci0JCQkgICsgZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQyKTsKLQkgICAgICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKywgcmVsX2hhc2grKykKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSAqaXN5bTsKLQkJICBhc2VjdGlvbiAqc2VjOwotCi0JCSAgaXJlbGEtPnJfb2Zmc2V0ICs9IG8tPm91dHB1dF9vZmZzZXQ7Ci0KLQkJICByX3N5bW5keCA9IEVMRl9SX1NZTSAoaXJlbGEtPnJfaW5mbyk7Ci0KLQkJICBpZiAocl9zeW1uZHggPT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKHJfc3ltbmR4ID49IGxvY3N5bWNvdW50Ci0JCSAgICAgIHx8IChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKQotCQkJICAmJiBmaW5mby0+c2VjdGlvbnNbcl9zeW1uZHhdID09IE5VTEwpKQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmg7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wuICBXZQotCQkJIGhhdmUgbm90IHlldCBvdXRwdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLCBzbwotCQkJIHdlIGRvIG5vdCBrbm93IHRoZSBzeW1ib2wgaW5kZXggb2YgYW55IGdsb2JhbAotCQkJIHN5bWJvbC4gIFdlIHNldCB0aGUgcmVsX2hhc2ggZW50cnkgZm9yIHRoaXMKLQkJCSByZWxvYyB0byBwb2ludCB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkKLQkJCSBmb3IgdGhpcyBzeW1ib2wuICBUaGUgc3ltYm9sIGluZGV4IGlzIHRoZW4KLQkJCSBzZXQgYXQgdGhlIGVuZCBvZiBlbGZfYmZkX2ZpbmFsX2xpbmsuICAqLwotCQkgICAgICBpbmR4ID0gcl9zeW1uZHggLSBleHRzeW1vZmY7Ci0JCSAgICAgIHJoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JCSAgICAgIHdoaWxlIChyaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJCSAgICAgfHwgcmgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCQlyaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSByaC0+cm9vdC51LmkubGluazsKLQotCQkgICAgICAvKiBTZXR0aW5nIHRoZSBpbmRleCB0byAtMiB0ZWxscwotCQkJIGVsZl9saW5rX291dHB1dF9leHRzeW0gdGhhdCB0aGlzIHN5bWJvbCBpcwotCQkJIHVzZWQgYnkgYSByZWxvYy4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKHJoLT5pbmR4IDwgMCk7Ci0JCSAgICAgIHJoLT5pbmR4ID0gLTI7Ci0KLQkJICAgICAgKnJlbF9oYXNoID0gcmg7Ci0KLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0KLQkJICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gKi8KLQotCQkgICpyZWxfaGFzaCA9IE5VTEw7Ci0JCSAgaXN5bSA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgcl9zeW1uZHg7Ci0JCSAgc2VjID0gZmluZm8tPnNlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICBpZiAoRUxGX1NUX1RZUEUgKGlzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQkgICAgewotCQkgICAgICAvKiBJIHN1cHBvc2UgdGhlIGJhY2tlbmQgb3VnaHQgdG8gZmlsbCBpbiB0aGUKLQkJCSBzZWN0aW9uIG9mIGFueSBTVFRfU0VDVElPTiBzeW1ib2wgYWdhaW5zdCBhCi0JCQkgcHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24uICBJZiB3ZSBoYXZlCi0JCQkgZGlzY2FyZGVkIGEgc2VjdGlvbiwgdGhlIG91dHB1dF9zZWN0aW9uIHdpbGwKLQkJCSBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi0JCSAgICAgIGlmIChzZWMgIT0gTlVMTAotCQkJICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0JCQkgICAgICB8fCAoc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYy0+b3V0cHV0X3NlY3Rpb24pKSkpCi0JCQlyX3N5bW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICByX3N5bW5keCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJCSAgQkZEX0FTU0VSVCAocl9zeW1uZHggIT0gMCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoZmluZm8tPmluZGljZXNbcl9zeW1uZHhdID09IC0xKQotCQkJewotCQkJICB1bnNpZ25lZCBsb25nIGxpbms7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFlvdSBjYW4ndCBkbyBsZCAtciAtcy4gICovCi0JCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQotCQkJICAvKiBUaGlzIHN5bWJvbCB3YXMgc2tpcHBlZCBlYXJsaWVyLCBidXQKLQkJCSAgICAgc2luY2UgaXQgaXMgbmVlZGVkIGJ5IGEgcmVsb2MsIHdlCi0JCQkgICAgIG11c3Qgb3V0cHV0IGl0IG5vdy4gICovCi0JCQkgIGxpbmsgPSBzeW10YWJfaGRyLT5zaF9saW5rOwotCQkJICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCQkgIGxpbmssCi0JCQkJCQkJCSAgaXN5bS0+c3RfbmFtZSk7Ci0JCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpc3ltLT5zdF9zaG5keCA9Ci0JCQkgICAgX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAgICBvc2VjKTsKLQkJCSAgaWYgKGlzeW0tPnN0X3NobmR4ID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIGlzeW0tPnN0X3ZhbHVlICs9IHNlYy0+b3V0cHV0X29mZnNldDsKLQkJCSAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkJCSAgICBpc3ltLT5zdF92YWx1ZSArPSBvc2VjLT52bWE7Ci0KLQkJCSAgZmluZm8tPmluZGljZXNbcl9zeW1uZHhdID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0KLQkJCSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsIGlzeW0sIHNlYykpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCSAgICAgIHJfc3ltbmR4ID0gZmluZm8tPmluZGljZXNbcl9zeW1uZHhdOwotCQkgICAgfQotCi0JCSAgaXJlbGEtPnJfaW5mbyA9IEVMRl9SX0lORk8gKHJfc3ltbmR4LAotCQkJCQkgICAgICBFTEZfUl9UWVBFIChpcmVsYS0+cl9pbmZvKSk7Ci0JCX0KLQotCSAgICAgIC8qIFN3YXAgb3V0IHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlucHV0X3JlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHI7Ci0JICAgICAgZWxmX2xpbmtfb3V0cHV0X3JlbG9jcyAob3V0cHV0X2JmZCwgbywgCi0JCQkJICAgICAgaW5wdXRfcmVsX2hkciwKLQkJCQkgICAgICBpbnRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGludGVybmFsX3JlbG9jcyAKLQkJKz0gaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSAvIGlucHV0X3JlbF9oZHItPnNoX2VudHNpemU7Ci0JICAgICAgaW5wdXRfcmVsX2hkciA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMjsKLQkgICAgICBpZiAoaW5wdXRfcmVsX2hkcikKLQkJZWxmX2xpbmtfb3V0cHV0X3JlbG9jcyAob3V0cHV0X2JmZCwgbywgCi0JCQkJCWlucHV0X3JlbF9oZHIsCi0JCQkJCWludGVybmFsX3JlbG9jcyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbW9kaWZpZWQgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnN0YWJfaW5mbyA9PSBOVUxMKQotCXsKLQkgIGlmICghIChvLT5mbGFncyAmIFNFQ19FWENMVURFKSAmJgotCSAgICAgICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICAoby0+X2Nvb2tlZF9zaXplICE9IDAKLQkJCQkJICAgPyBvLT5fY29va2VkX3NpemUKLQkJCQkJICAgOiBvLT5fcmF3X3NpemUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0JCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnN0YWJfaW5mbywKLQkJICBvLCAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnN0YWJfaW5mbywgY29udGVudHMpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgcmVsb2Mgd2hlbiBsaW5raW5nIGFuIEVMRiBmaWxlLiAgVGhpcyBpcyBhIHJlbG9jCi0gICByZXF1ZXN0ZWQgYnkgdGhlIGxpbmtlciwgYW5kIGRvZXMgY29tZSBmcm9tIGFueSBpbnB1dCBmaWxlLiAgVGhpcwotICAgaXMgdXNlZCB0byBidWlsZCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgd2hlbiBsaW5raW5nCi0gICB3aXRoIC1Vci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgbG9uZyBpbmR4OwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hfcHRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBhZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICByZWxfaGFzaF9wdHIgPSAoZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGFzaGVzCi0JCSAgKyBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudAotCQkgICsgZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQyKTsKLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBpbmR4ID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIEJGRF9BU1NFUlQgKGluZHggIT0gMCk7Ci0gICAgICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMgdGhvdWdoIGl0IHdlcmUKLSAgICAgICAgIGFjdHVhbGx5IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIHNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBpbmR4ID0gc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCSAgLyogSXQgc2VlbXMgdGhhdCB3ZSBvdWdodCB0byBhZGQgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUKLSAgICAgICAgICAgICBhZGRlbmQgaGVyZSwgYnV0IGluIHByYWN0aWNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQKLSAgICAgICAgICAgICBiZWNhdXNlIGl0IHdhcyBwYXNzZWQgdG8gY29uc3RydWN0b3JfY2FsbGJhY2suICAqLwotCSAgYWRkZW5kICs9IHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCX0KLSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICAvKiBTZXR0aW5nIHRoZSBpbmRleCB0byAtMiB0ZWxscyBlbGZfbGlua19vdXRwdXRfZXh0c3ltIHRoYXQKLQkgICAgIHRoaXMgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCi0JICBoLT5pbmR4ID0gLTI7Ci0JICAqcmVsX2hhc2hfcHRyID0gaDsKLQkgIGluZHggPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5keCA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGFuIGlucGxhY2UgcmVsb2MsIHdlIG11c3Qgd3JpdGUgdGhlIGFkZGVuZCBpbnRvIHRoZQotICAgICBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlICYmIGFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLCBhZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChpbmZvLAotCQkgIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgPyBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCSAgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgaG93dG8tPm5hbWUsIGFkZGVuZCwgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJICAoYmZkX3ZtYSkgMCkpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbiwgKFBUUikgYnVmLAotCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsIHNpemUpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGlmICghIG9rKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgYSByZWxvYyBpcyByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbiBpbiBhCi0gICAgIHJlbG9jYXRlYWJsZSBmaWxlLCBhbmQgaXMgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYW4gZXhlY3V0YWJsZQotICAgICBmaWxlLiAgKi8KLSAgb2Zmc2V0ID0gbGlua19vcmRlci0+b2Zmc2V0OwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgb2Zmc2V0ICs9IG91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHI7Ci0KLSAgaWYgKHJlbF9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOwotCi0gICAgICBpcmVsLnJfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgaXJlbC5yX2luZm8gPSBFTEZfUl9JTkZPIChpbmR4LCBob3d0by0+dHlwZSk7Ci0gICAgICBlcmVsID0gKChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbF9oZHItPmNvbnRlbnRzCi0JICAgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudCk7Ci0gICAgICBlbGZfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZpcmVsLCBlcmVsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQotICAgICAgaXJlbGEucl9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICBpcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPIChpbmR4LCBob3d0by0+dHlwZSk7Ci0gICAgICBpcmVsYS5yX2FkZGVuZCA9IGFkZGVuZDsKLSAgICAgIGVyZWxhID0gKChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxfaGRyLT5jb250ZW50cwotCSAgICAgICArIGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50KTsKLSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZpcmVsYSwgZXJlbGEpOwotICAgIH0KLQotICArK2VsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBBbGxvY2F0ZSBhIHBvaW50ZXIgdG8gbGl2ZSBpbiBhIGxpbmtlciBjcmVhdGVkIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1lbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIGxzZWN0LCBoLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci17Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9IE5VTEw7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfc2VjdGlvbl9wdHI7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTs7Ci0KLSAgQkZEX0FTU0VSVCAobHNlY3QgIT0gTlVMTCk7Ci0KLSAgLyogSXMgdGhpcyBhIGdsb2JhbCBzeW1ib2w/ICovCi0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgLyogSGFzIHRoaXMgc3ltYm9sIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGlmIHNvLCBvdXIgd29yayBpcyBkb25lICovCi0gICAgICBpZiAoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChoLT5saW5rZXJfc2VjdGlvbl9wb2ludGVyLAotCQkJCQkJcmVsLT5yX2FkZGVuZCwKLQkJCQkJCWxzZWN0LT53aGljaCkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSAmaC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlcjsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAobHNlY3QtPnJlbF9zZWN0aW9uKQotCWxzZWN0LT5yZWxfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpOwotICAgIH0KLQotICBlbHNlICAvKiBBbGxvY2F0aW9uIG9mIGEgcG9pbnRlciB0byBhIGxvY2FsIHN5bWJvbCAqLwotICAgIHsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqcHRyID0gZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChhYmZkKTsKLQotICAgICAgLyogQWxsb2NhdGUgYSB0YWJsZSB0byBob2xkIHRoZSBsb2NhbCBzeW1ib2xzIGlmIGZpcnN0IHRpbWUgKi8KLSAgICAgIGlmICghcHRyKQotCXsKLQkgIHVuc2lnbmVkIGludCBudW1fc3ltYm9scyA9IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JICBwdHIgPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKiopCi0JICAgIGJmZF9hbGxvYyAoYWJmZCwgbnVtX3N5bWJvbHMgKiBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopKTsKLQotCSAgaWYgKCFwdHIpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChhYmZkKSA9IHB0cjsKLQkgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgaSsrKQotCSAgICBwdHJbaV0gPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikwOwotCX0KLQotICAgICAgLyogSGFzIHRoaXMgc3ltYm9sIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGlmIHNvLCBvdXIgd29yayBpcyBkb25lICovCi0gICAgICBpZiAoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChwdHJbcl9zeW1uZHhdLAotCQkJCQkJcmVsLT5yX2FkZGVuZCwKLQkJCQkJCWxzZWN0LT53aGljaCkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSAmcHRyW3Jfc3ltbmR4XTsKLQotICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQl7Ci0JICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLQkgICAgIG91dHB1dCBhIFJfPHh4eD5fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLQkgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCSAgQkZEX0FTU0VSVCAobHNlY3QtPnJlbF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbHNlY3QtPnJlbF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSk7Ci0JfQotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBwb2ludGVyIGluIHRoZSBsaW5rZXIgc2VjdGlvbiwgYW5kIGFsbG9jYXRlIGEgbmV3IHBvaW50ZXIgcmVjb3JkCi0gICAgIGZyb20gaW50ZXJuYWwgbWVtb3J5LiAgKi8KLSAgQkZEX0FTU0VSVCAocHRyX2xpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKLSAgbGlua2VyX3NlY3Rpb25fcHRyID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190KSk7Ci0KLSAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+bmV4dCA9ICpwdHJfbGlua2VyX3NlY3Rpb25fcHRyOwotICBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+d2hpY2ggPSBsc2VjdC0+d2hpY2g7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3AgPSBmYWxzZTsKLSAgKnB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSBsaW5rZXJfc2VjdGlvbl9wdHI7Ci0KLSNpZiAwCi0gIGlmIChsc2VjdC0+aG9sZV9zaXplICYmIGxzZWN0LT5ob2xlX29mZnNldCA8IGxzZWN0LT5tYXhfaG9sZV9vZmZzZXQpCi0gICAgewotICAgICAgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQgPSBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplIC0gbHNlY3QtPmhvbGVfc2l6ZSArIChBUkNIX1NJWkUgLyA4KTsKLSAgICAgIGxzZWN0LT5ob2xlX29mZnNldCArPSBBUkNIX1NJWkUgLyA4OwotICAgICAgbHNlY3QtPnN5bV9vZmZzZXQgICs9IEFSQ0hfU0laRSAvIDg7Ci0gICAgICBpZiAobHNlY3QtPnN5bV9oYXNoKQkvKiBCdW1wIHVwIHN5bWJvbCB2YWx1ZSBpZiBuZWVkZWQgKi8KLQl7Ci0JICBsc2VjdC0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUgKz0gQVJDSF9TSVpFIC8gODsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQnVtcCB1cCAlcyBieSAlbGQsIGN1cnJlbnQgdmFsdWUgPSAlbGRcbiIsCi0JCSAgIGxzZWN0LT5zeW1faGFzaC0+cm9vdC5yb290LnN0cmluZywKLQkJICAgKGxvbmcpQVJDSF9TSVpFIC8gOCwKLQkJICAgKGxvbmcpbHNlY3QtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0ID0gbHNlY3QtPnNlY3Rpb24tPl9yYXdfc2l6ZTsKLQotICBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplICs9IEFSQ0hfU0laRSAvIDg7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJDcmVhdGUgcG9pbnRlciBpbiBsaW5rZXIgc2VjdGlvbiAlcywgb2Zmc2V0ID0gJWxkLCBzZWN0aW9uIHNpemUgPSAlbGRcbiIsCi0JICAgbHNlY3QtPm5hbWUsIChsb25nKWxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0LCAobG9uZylsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBiZmRfcHV0X3B0cihCRkQsVkFMLEFERFIpIGJmZF9wdXRfNjQgKEJGRCwgVkFMLCBBRERSKQotI2VuZGlmCi0jaWYgQVJDSF9TSVpFPT0zMgotI2RlZmluZSBiZmRfcHV0X3B0cihCRkQsVkFMLEFERFIpIGJmZF9wdXRfMzIgKEJGRCwgVkFMLCBBRERSKQotI2VuZGlmCi0KLS8qIEZpbGwgaW4gdGhlIGFkZHJlc3MgZm9yIGEgcG9pbnRlciBnZW5lcmF0ZWQgaW4gYWxpbmtlciBzZWN0aW9uLiAgKi8KLQotYmZkX3ZtYQotZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sIGxzZWN0LCBoLCByZWxvY2F0aW9uLCByZWwsIHJlbGF0aXZlX3JlbG9jKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBpbnQgcmVsYXRpdmVfcmVsb2M7Ci17Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfc2VjdGlvbl9wdHI7Ci0KLSAgQkZEX0FTU0VSVCAobHNlY3QgIT0gTlVMTCk7Ci0KLSAgaWYgKGggIT0gTlVMTCkJCS8qIGdsb2JhbCBzeW1ib2wgKi8KLSAgICB7Ci0gICAgICBsaW5rZXJfc2VjdGlvbl9wdHIgPSBfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGgtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXIsCi0JCQkJCQkJCSByZWwtPnJfYWRkZW5kLAotCQkJCQkJCQkgbHNlY3QtPndoaWNoKTsKLQotICAgICAgQkZEX0FTU0VSVCAobGlua2VyX3NlY3Rpb25fcHRyICE9IE5VTEwpOwotCi0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIGluZm8tPnN5bWJvbGljCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JewotCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0JICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSAgICAgbG9jYWxseS4gIFdlIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZQotCSAgICAgZ2xvYmFsIHNlY3Rpb24uCi0KLQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLjx4eHg+Ci0JICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCSAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wKQotCSAgICB7Ci0JICAgICAgbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF9wdHIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24gKyBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCwKLQkJCSAgbHNlY3QtPnNlY3Rpb24tPmNvbnRlbnRzICsgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQkJCQkvKiBsb2NhbCBzeW1ib2wgKi8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZCkgIT0gTlVMTCk7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZClbcl9zeW1uZHhdICE9IE5VTEwpOwotICAgICAgbGlua2VyX3NlY3Rpb25fcHRyID0gX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZClbcl9zeW1uZHhdLAotCQkJCQkJCQkgcmVsLT5yX2FkZGVuZCwKLQkJCQkJCQkJIGxzZWN0LT53aGljaCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGxpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKLQotICAgICAgLyogV3JpdGUgb3V0IHBvaW50ZXIgaWYgaXQgaGFzbid0IGJlZW4gcmV3cml0dGVuIG91dCBiZWZvcmUgKi8KLSAgICAgIGlmICghbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCkKLQl7Ci0JICBsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wID0gdHJ1ZTsKLQkgIGJmZF9wdXRfcHRyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQsCi0JCSAgICAgICBsc2VjdC0+c2VjdGlvbi0+Y29udGVudHMgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc3JlbCA9IGxzZWN0LT5yZWxfc2VjdGlvbjsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVsYXRpdmUgcmVsb2MgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JICAgICAgaWYgKCFzcmVsKQotCQlsc2VjdC0+cmVsX3NlY3Rpb24gPSBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkJCQkgICAgIGxzZWN0LT5yZWxfbmFtZSk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKGxzZWN0LT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICsgbHNlY3QtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCQkgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7Ci0JICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKDAsIHJlbGF0aXZlX3JlbG9jKTsKLQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgKCgoRWxmX0V4dGVybmFsX1JlbGEgKikKLQkJCQkgICAgIGxzZWN0LT5zZWN0aW9uLT5jb250ZW50cykKLQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChsc2VjdC0+c2VjdGlvbiktPnJlbF9jb3VudCkpOwotCSAgICAgICsrZWxmX3NlY3Rpb25fZGF0YSAobHNlY3QtPnNlY3Rpb24pLT5yZWxfY291bnQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJlbG9jYXRpb24gPSAobHNlY3QtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldAotCQktIGxzZWN0LT5ob2xlX29mZnNldAotCQktIGxzZWN0LT5zeW1fb2Zmc2V0KTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIkZpbmlzaCBwb2ludGVyIGluIGxpbmtlciBzZWN0aW9uICVzLCBvZmZzZXQgPSAlbGQgKDB4JWx4KVxuIiwKLQkgICBsc2VjdC0+bmFtZSwgKGxvbmcpcmVsb2NhdGlvbiwgKGxvbmcpcmVsb2NhdGlvbik7Ci0jZW5kaWYKLQotICAvKiBTdWJ0cmFjdCBvdXQgdGhlIGFkZGVuZCwgYmVjYXVzZSBpdCB3aWxsIGdldCBhZGRlZCBiYWNrIGluIGJ5IHRoZSBub3JtYWwKLSAgICAgcHJvY2Vzc2luZy4gICovCi0gIHJldHVybiByZWxvY2F0aW9uIC0gbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQ7Ci19Ci0MCi0vKiBHYXJiYWdlIGNvbGxlY3QgdW51c2VkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX21hcmsKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpzZWMsCi0JICAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLQkgICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKSkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2Nfc3dlZXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgYm9vbGVhbiAoKmdjX3N3ZWVwX2hvb2spCi0JICAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkJICAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zd2VlcF9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBpZHhwdHIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgb2ZmYXJnKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGR1bW15KSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBkdW1teSkpOwotCi0vKiBUaGUgbWFyayBwaGFzZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uICBGb3IgYSBnaXZlbiBzZWN0aW9uLCBtYXJrCi0gICBpdCwgYW5kIGFsbCB0aGUgc2VjdGlvbnMgd2hpY2ggZGVmaW5lIHN5bWJvbHMgdG8gd2hpY2ggaXQgcmVmZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19tYXJrIChpbmZvLCBzZWMsIGdjX21hcmtfaG9vaykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFzZWN0aW9uICogKCpnY19tYXJrX2hvb2spCi0gICAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotewotICBib29sZWFuIHJldCA9IHRydWU7Ci0KLSAgc2VjLT5nY19tYXJrID0gMTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVsb2NzLiAgKi8KLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbHN0YXJ0LCAqcmVsLCAqcmVsZW5kOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gICAgICBzaXplX3QgbmxvY3N5bXM7Ci0gICAgICBzaXplX3QgZXh0c3ltb2ZmOwotICAgICAgRWxmX0V4dGVybmFsX1N5bSAqbG9jc3ltcywgKmZyZWVzeW1zID0gTlVMTDsKLSAgICAgIGJmZCAqaW5wdXRfYmZkID0gc2VjLT5vd25lcjsKLSAgICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKTsKLQotICAgICAgLyogR0NGSVhNRTogaG93IHRvIGFycmFuZ2Ugc28gdGhhdCByZWxvY3MgYW5kIHN5bWJvbHMgYXJlIG5vdAotCSByZXJlYWQgY29udGludWFsbHk/ICAqLwotCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICAgICAgLyogUmVhZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0JewotCSAgbmxvY3N5bXMgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgICAgICBleHRzeW1vZmYgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlleHRzeW1vZmYgPSBubG9jc3ltcyA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMpCi0JbG9jc3ltcyA9IChFbGZfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZSBpZiAobmxvY3N5bXMgPT0gMCkKLQlsb2NzeW1zID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBsb2NzeW1zID0gZnJlZXN5bXMgPQotCSAgICBiZmRfbWFsbG9jIChubG9jc3ltcyAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpOwotCSAgaWYgKGZyZWVzeW1zID09IE5VTEwKLQkgICAgICB8fCBiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChsb2NzeW1zLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIG5sb2NzeW1zLCBpbnB1dF9iZmQpCi0JCSAgIT0gbmxvY3N5bXMgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQkgICAgewotCSAgICAgIHJldCA9IGZhbHNlOwotCSAgICAgIGdvdG8gb3V0MTsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICAqLwotICAgICAgcmVsc3RhcnQgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkgIChzZWMtPm93bmVyLCBzZWMsIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotICAgICAgaWYgKHJlbHN0YXJ0ID09IE5VTEwpCi0JewotCSAgcmV0ID0gZmFsc2U7Ci0JICBnb3RvIG91dDE7Ci0JfQotICAgICAgcmVsZW5kID0gcmVsc3RhcnQgKyBzZWMtPnJlbG9jX2NvdW50ICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbDsKLQotICAgICAgZm9yIChyZWwgPSByZWxzdGFydDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCSAgYXNlY3Rpb24gKnJzZWM7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gczsKLQotCSAgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQkgIGlmIChyX3N5bW5keCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGVsZl9iYWRfc3ltdGFiIChzZWMtPm93bmVyKSkKLQkgICAgewotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCAmbG9jc3ltc1tyX3N5bW5keF0sICZzKTsKLQkgICAgICBpZiAoRUxGX1NUX0JJTkQgKHMuc3RfaW5mbykgPT0gU1RCX0xPQ0FMKQotCSAgICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIE5VTEwsICZzKTsKLQkgICAgICBlbHNlCi0JCXsKLQkgICAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdOwotCSAgICAgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgaCwgTlVMTCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocl9zeW1uZHggPj0gbmxvY3N5bXMpCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0JICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIGgsIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgJmxvY3N5bXNbcl9zeW1uZHhdLCAmcyk7Ci0JICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIE5VTEwsICZzKTsKLQkgICAgfQotCi0JICBpZiAocnNlYyAmJiAhcnNlYy0+Z2NfbWFyaykKLQkgICAgaWYgKCFlbGZfZ2NfbWFyayAoaW5mbywgcnNlYywgZ2NfbWFya19ob29rKSkKLQkgICAgICB7Ci0JCXJldCA9IGZhbHNlOwotCQlnb3RvIG91dDI7Ci0JICAgICAgfQotCX0KLQotICAgIG91dDI6Ci0gICAgICBpZiAoIWluZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKHJlbHN0YXJ0KTsKLSAgICBvdXQxOgotICAgICAgaWYgKGZyZWVzeW1zKQotCWZyZWUgKGZyZWVzeW1zKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIHN3ZWVwIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIFJlbW92ZSBhbGwgZ2FyYmFnZSBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2Nfc3dlZXAgKGluZm8sIGdjX3N3ZWVwX2hvb2spCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLSAgICAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkJY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpOwotewotICBiZmQgKnN1YjsKLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICAvKiBLZWVwIHNwZWNpYWwgc2VjdGlvbnMuICBLZWVwIC5kZWJ1ZyBzZWN0aW9ucy4gICovCi0JICBpZiAoKG8tPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKQotCSAgICAgIHx8IChvLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpKQotCSAgICBvLT5nY19tYXJrID0gMTsKLQotCSAgaWYgKG8tPmdjX21hcmspCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTa2lwIHN3ZWVwaW5nIHNlY3Rpb25zIGFscmVhZHkgZXhjbHVkZWQuICAqLwotCSAgaWYgKG8tPmZsYWdzICYgU0VDX0VYQ0xVREUpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTaW5jZSB0aGlzIGlzIGVhcmx5IGluIHRoZSBsaW5rIHByb2Nlc3MsIGl0IGlzIHNpbXBsZQotCSAgICAgdG8gcmVtb3ZlIGEgc2VjdGlvbiBmcm9tIHRoZSBvdXRwdXQuICAqLwotCSAgby0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLQkgIC8qIEJ1dCB3ZSBhbHNvIGhhdmUgdG8gdXBkYXRlIHNvbWUgb2YgdGhlIHJlbG9jYXRpb24KLQkgICAgIGluZm8gd2UgY29sbGVjdGVkIGJlZm9yZS4gICovCi0JICBpZiAoZ2Nfc3dlZXBfaG9vawotCSAgICAgICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgJiYgby0+cmVsb2NfY291bnQgPiAwKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQkgICAgICBib29sZWFuIHI7Ci0KLQkgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkJCSAoby0+b3duZXIsIG8sIE5VTEwsIE5VTEwsIGluZm8tPmtlZXBfbWVtb3J5KSk7Ci0JICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICByID0gKCpnY19zd2VlcF9ob29rKShvLT5vd25lciwgaW5mbywgbywgaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgICAgIGlmICghaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0KLQkgICAgICBpZiAoIXIpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogUmVtb3ZlIHRoZSBzeW1ib2xzIHRoYXQgd2VyZSBpbiB0aGUgc3dlcHQgc2VjdGlvbnMgZnJvbSB0aGUgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUuICBHQ0ZJWE1FOiBBbnlvbmUga25vdyBob3cgdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZQotICAgICBzdGF0aWMgc3ltYm9sIHRhYmxlIGFzIHdlbGw/ICAqLwotICB7Ci0gICAgaW50IGkgPSAwOwotCi0gICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIGVsZl9nY19zd2VlcF9zeW1ib2wsCi0JCQkgICAgKFBUUikgJmkpOwotCi0gICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9IGk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3dlZXAgc3ltYm9scyBpbiBzd2VwdCBzZWN0aW9ucy4gIENhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2Nfc3dlZXBfc3ltYm9sIChoLCBpZHhwdHIpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWR4cHRyOwotewotICBpbnQgKmlkeCA9IChpbnQgKikgaWR4cHRyOwotCi0gIGlmIChoLT5keW5pbmR4ICE9IC0xCi0gICAgICAmJiAoKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgfHwgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5nY19tYXJrKSkKLSAgICBoLT5keW5pbmR4ID0gKCppZHgpKys7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFByb3BvZ2F0ZSBjb2xsZWN0ZWQgdnRhYmxlIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdGhyb3VnaAotICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQgKGgsIG9rcCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBva3A7Ci17Ci0gIC8qIFRob3NlIHRoYXQgYXJlIG5vdCB2dGFibGVzLiAqLwotICBpZiAoaC0+dnRhYmxlX3BhcmVudCA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRob3NlIHZ0YWJsZXMgdGhhdCBkbyBub3QgaGF2ZSBwYXJlbnRzLCB3ZSBjYW5ub3QgbWVyZ2UuICAqLwotICBpZiAoaC0+dnRhYmxlX3BhcmVudCA9PSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UndmUgYWxyZWFkeSBiZWVuIGRvbmUsIGV4aXQuICAqLwotICBpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZCAmJiBoLT52dGFibGVfZW50cmllc191c2VkWy0xXSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIHBhcmVudCdzIHRhYmxlIGlzIHVwIHRvIGRhdGUuICAqLwotICBlbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQgKGgtPnZ0YWJsZV9wYXJlbnQsIG9rcCk7Ci0KLSAgaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOb25lIG9mIHRoaXMgdGFibGUncyBlbnRyaWVzIHdlcmUgcmVmZXJlbmNlZC4gIFJlLXVzZSB0aGUKLQkgcGFyZW50J3MgdGFibGUuICAqLwotICAgICAgaC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0gICAgICBoLT52dGFibGVfZW50cmllc19zaXplID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbjsKLSAgICAgIGJvb2xlYW4gKmN1LCAqcHU7Ci0KLSAgICAgIC8qIE9yIHRoZSBwYXJlbnQncyBlbnRyaWVzIGludG8gb3Vycy4gICovCi0gICAgICBjdSA9IGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0gICAgICBjdVstMV0gPSB0cnVlOwotICAgICAgcHUgPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc191c2VkOwotICAgICAgaWYgKHB1ICE9IE5VTEwpCi0JewotCSAgbiA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3NpemUgLyBGSUxFX0FMSUdOOwotCSAgd2hpbGUgKC0tbiAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCpwdSkgKmN1ID0gdHJ1ZTsKLQkgICAgICBwdSsrLCBjdSsrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MgKGgsIG9rcCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBva3A7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgaHN0YXJ0LCBoZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsc3RhcnQsICpyZWxlbmQsICpyZWw7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgLyogVGFrZSBjYXJlIG9mIGJvdGggdGhvc2Ugc3ltYm9scyB0aGF0IGRvIG5vdCBkZXNjcmliZSB2dGFibGVzIGFzCi0gICAgIHdlbGwgYXMgdGhvc2UgdGhhdCBhcmUgbm90IGxvYWRlZC4gICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotCi0gIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgaHN0YXJ0ID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLSAgaGVuZCA9IGhzdGFydCArIGgtPnNpemU7Ci0KLSAgcmVsc3RhcnQgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCSAgICAgIChzZWMtPm93bmVyLCBzZWMsIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCB0cnVlKSk7Ci0gIGlmICghcmVsc3RhcnQpCi0gICAgcmV0dXJuICooYm9vbGVhbiAqKW9rcCA9IGZhbHNlOwotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoc2VjLT5vd25lcik7Ci0gIHJlbGVuZCA9IHJlbHN0YXJ0ICsgc2VjLT5yZWxvY19jb3VudCAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0KLSAgZm9yIChyZWwgPSByZWxzdGFydDsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICBpZiAocmVsLT5yX29mZnNldCA+PSBoc3RhcnQgJiYgcmVsLT5yX29mZnNldCA8IGhlbmQpCi0gICAgICB7Ci0JLyogSWYgdGhlIGVudHJ5IGlzIGluIHVzZSwgZG8gbm90aGluZy4gICovCi0JaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQKLQkgICAgJiYgKHJlbC0+cl9vZmZzZXQgLSBoc3RhcnQpIDwgaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSkKLQkgIHsKLQkgICAgYmZkX3ZtYSBlbnRyeSA9IChyZWwtPnJfb2Zmc2V0IC0gaHN0YXJ0KSAvIEZJTEVfQUxJR047Ci0JICAgIGlmIChoLT52dGFibGVfZW50cmllc191c2VkW2VudHJ5XSkKLQkgICAgICBjb250aW51ZTsKLQkgIH0KLQkvKiBPdGhlcndpc2UsIGtpbGwgaXQuICAqLwotCXJlbC0+cl9vZmZzZXQgPSByZWwtPnJfaW5mbyA9IHJlbC0+cl9hZGRlbmQgPSAwOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEbyBtYXJrIGFuZCBzd2VlcCBvZiB1bnVzZWQgc2VjdGlvbnMuICAqLwotCi1ib29sZWFuCi1lbGZfZ2Nfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gb2sgPSB0cnVlOwotICBiZmQgKnN1YjsKLSAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0gICAgICAgICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi0gIGlmICghZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jYW5fZ2Nfc2VjdGlvbnMKLSAgICAgIHx8IGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQXBwbHkgdHJhbnNpdGl2ZSBjbG9zdXJlIHRvIHRoZSB2dGFibGUgZW50cnkgdXNhZ2UgaW5mby4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkLAotCQkJICAoUFRSKSAmb2spOwotICBpZiAoIW9rKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBLaWxsIHRoZSB2dGFibGUgcmVsb2NhdGlvbnMgdGhhdCB3ZXJlIG5vdCB1c2VkLiAgKi8KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzLAotCQkJICAoUFRSKSAmb2spOwotICBpZiAoIW9rKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHcm92ZWwgdGhyb3VnaCByZWxvY3MgdG8gZmluZCBvdXQgd2hvIHN0YXlzIC4uLiAgKi8KLQotICBnY19tYXJrX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdjX21hcmtfaG9vazsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0gICAgICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGlmIChvLT5mbGFncyAmIFNFQ19LRUVQKQotICAJICAgIGlmICghZWxmX2djX21hcmsgKGluZm8sIG8sIGdjX21hcmtfaG9vaykpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogLi4uIGFuZCBtYXJrIFNFQ19FWENMVURFIGZvciB0aG9zZSB0aGF0IGdvLiAgKi8KLSAgaWYgKCFlbGZfZ2Nfc3dlZXAoaW5mbywgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5nY19zd2VlcF9ob29rKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBDYWxsZWQgZnJvbSBjaGVja19yZWxvY3MgdG8gcmVjb3JkIHRoZSBleGlzdGFuY2Ugb2YgYSBWVElOSEVSSVQgcmVsb2MuICAqLwotCi1ib29sZWFuCi1lbGZfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCBvZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc2VhcmNoLCAqY2hpbGQ7Ci0gIGJmZF9zaXplX3R5cGUgZXh0c3ltY291bnQ7Ci0KLSAgLyogVGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bXRhYiBoZWFkZXIgdGVsbHMgdXMgd2hlcmUgdGhlCi0gICAgIGV4dGVybmFsIHN5bWJvbHMgc3RhcnQuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBsb2NhbCBzeW1ib2xzIGF0Ci0gICAgIHRoaXMgcG9pbnQuICAqLwotICBleHRzeW1jb3VudCA9IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfc2l6ZS9zaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBleHRzeW1jb3VudCAtPSBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0KLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgZXh0c3ltY291bnQ7Ci0KLSAgLyogSHVudCBkb3duIHRoZSBjaGlsZCBzeW1ib2wsIHdoaWNoIGlzIGluIHRoaXMgc2VjdGlvbiBhdCB0aGUgc2FtZQotICAgICBvZmZzZXQgYXMgdGhlIHJlbG9jYXRpb24uICAqLwotICBmb3IgKHNlYXJjaCA9IHN5bV9oYXNoZXM7IHNlYXJjaCAhPSBzeW1faGFzaGVzX2VuZDsgKytzZWFyY2gpCi0gICAgewotICAgICAgaWYgKChjaGlsZCA9ICpzZWFyY2gpICE9IE5VTEwKLQkgICYmIChjaGlsZC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGNoaWxkLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgY2hpbGQtPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmIGNoaWxkLT5yb290LnUuZGVmLnZhbHVlID09IG9mZnNldCkKLQlnb3RvIHdpbjsKLSAgICB9Ci0KLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6ICVzKyVsdTogTm8gc3ltYm9sIGZvdW5kIGZvciBJTkhFUklUIiwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc2VjLT5uYW1lLAotCQkJICh1bnNpZ25lZCBsb25nKW9mZnNldCk7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotd2luOgotICBpZiAoIWgpCi0gICAgewotICAgICAgLyogVGhpcyAqc2hvdWxkKiBvbmx5IGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgSXQgY291bGQgcG90ZW50aWFsbHkKLQkgYmUgdGhhdCBzb21lb25lIGhhcyBkZWZpbmVkIGEgbm9uLWdsb2JhbCB2dGFibGUgdGhvdWdoLCB3aGljaAotCSB3b3VsZCBiZSBiYWQuICBJdCBpc24ndCB3b3J0aCBwYWdpbmcgaW4gdGhlIGxvY2FsIHN5bWJvbHMgdG8gYmUKLQkgc3VyZSB0aG91Z2g7IHRoYXQgY2FzZSBzaG91bGQgc2ltcGx5IGJlIGhhbmRsZWQgYnkgdGhlIGFzc2VtYmxlci4gICovCi0KLSAgICAgIGNoaWxkLT52dGFibGVfcGFyZW50ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIC0xOwotICAgIH0KLSAgZWxzZQotICAgIGNoaWxkLT52dGFibGVfcGFyZW50ID0gaDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsbGVkIGZyb20gY2hlY2tfcmVsb2NzIHRvIHJlY29yZCB0aGUgZXhpc3RhbmNlIG9mIGEgVlRFTlRSWSByZWxvYy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCBhZGRlbmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgaWYgKGFkZGVuZCA+PSBoLT52dGFibGVfZW50cmllc19zaXplKQotICAgIHsKLSAgICAgIHNpemVfdCBzaXplLCBieXRlczsKLSAgICAgIGJvb2xlYW4gKnB0ciA9IGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0KLSAgICAgIC8qIFdoaWxlIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCB3ZSBoYXZlIHRvIGJlIHByZXBhcmVkIHRvIGhhbmRsZQotCSBhIHplcm8gc2l6ZS4gICovCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXNpemUgPSBhZGRlbmQ7Ci0gICAgICBlbHNlCi0JewotCSAgc2l6ZSA9IGgtPnNpemU7Ci0JICBpZiAoc2l6ZSA8IGFkZGVuZCkKLQkgICAgewotCSAgICAgIC8qIE9vcHMhICBXZSd2ZSBnb3QgYSByZWZlcmVuY2UgcGFzdCB0aGUgZGVmaW5lZCBlbmQgb2YKLQkJIHRoZSB0YWJsZS4gIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgLS0gc2hhbGwgd2Ugd2Fybj8gICovCi0JICAgICAgc2l6ZSA9IGFkZGVuZDsKLQkgICAgfQotCX0KLQotICAgICAgLyogQWxsb2NhdGUgb25lIGV4dHJhIGVudHJ5IGZvciB1c2UgYXMgYSAiZG9uZSIgZmxhZyBmb3IgdGhlCi0JIGNvbnNvbGlkYXRpb24gcGFzcy4gICovCi0gICAgICBieXRlcyA9IChzaXplIC8gRklMRV9BTElHTiArIDEpICogc2l6ZW9mIChib29sZWFuKTsKLQotICAgICAgaWYgKHB0cikKLQl7Ci0JICBwdHIgPSBiZmRfcmVhbGxvYyAocHRyIC0gMSwgYnl0ZXMpOwotCSAgCi0JICBpZiAocHRyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBzaXplX3Qgb2xkYnl0ZXM7Ci0KLQkgICAgICBvbGRieXRlcyA9IChoLT52dGFibGVfZW50cmllc19zaXplL0ZJTEVfQUxJR04gKyAxKSAqIHNpemVvZiAoYm9vbGVhbik7Ci0JICAgICAgbWVtc2V0ICgoKGNoYXIgKilwdHIpICsgb2xkYnl0ZXMsIDAsIGJ5dGVzIC0gb2xkYnl0ZXMpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXB0ciA9IGJmZF96bWFsbG9jIChieXRlcyk7Ci0KLSAgICAgIGlmIChwdHIgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIC8qIEFuZCBhcnJhbmdlIGZvciB0aGF0IGRvbmUgZmxhZyB0byBiZSBhdCBpbmRleCAtMS4gICovCi0gICAgICBoLT52dGFibGVfZW50cmllc191c2VkID0gcHRyICsgMTsKLSAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSBzaXplOwotICAgIH0KLSAgCi0gIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbYWRkZW5kIC8gRklMRV9BTElHTl0gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbmQgYW4gYWNjb21wYW55aW5nIGJpdCB0byB3b3JrIG91dCBmaW5hbCBnb3QgZW50cnkgb2Zmc2V0cyBvbmNlCi0gICB3ZSdyZSBkb25lLiAgU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGZpbmFsX2xpbmsuICAqLwotCi1ib29sZWFuCi1lbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmk7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGJmZF92bWEgZ290b2ZmOwotCi0gIC8qIFRoZSBHT1Qgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSAuZ290IHNlY3Rpb24sIGJ1dCB0aGUgR09UIGhlYWRlciBpcwotICAgICBwdXQgaW50byB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgaWYgdGhlIGJhY2tlbmQgdXNlcyBpdC4gICovCi0gIGlmIChiZWQtPndhbnRfZ290X3BsdCkKLSAgICBnb3RvZmYgPSAwOwotICBlbHNlCi0gICAgZ290b2ZmID0gYmVkLT5nb3RfaGVhZGVyX3NpemU7Ci0KLSAgLyogRG8gdGhlIGxvY2FsIC5nb3QgZW50cmllcyBmaXJzdC4gICovCi0gIGZvciAoaSA9IGluZm8tPmlucHV0X2JmZHM7IGk7IGkgPSBpLT5saW5rX25leHQpCi0gICAgewotICAgICAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdCA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChpKTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaiwgbG9jc3ltY291bnQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLQotICAgICAgaWYgKCFsb2NhbF9nb3QpCi0JY29udGludWU7Ci0KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpKS0+c3ltdGFiX2hkcjsKLSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaSkpCi0JbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIGVsc2UKLQlsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBsb2NzeW1jb3VudDsgKytqKQotCXsKLQkgIGlmIChsb2NhbF9nb3Rbal0gPiAwKQotCSAgICB7Ci0JICAgICAgbG9jYWxfZ290W2pdID0gZ290b2ZmOwotCSAgICAgIGdvdG9mZiArPSBBUkNIX1NJWkUgLyA4OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGxvY2FsX2dvdFtqXSA9IChiZmRfdm1hKSAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZW4gdGhlIGdsb2JhbCAuZ290IGFuZCAucGx0IGVudHJpZXMuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cywKLQkJCSAgKFBUUikgJmdvdG9mZik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBuZWVkIGEgc3BlY2lhbCB0b3AtbGV2ZWwgbGluayByb3V0aW5lIHRvIGNvbnZlcnQgZ290IHJlZmVyZW5jZSBjb3VudHMKLSAgIHRvIHJlYWwgZ290IG9mZnNldHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzIChoLCBvZmZhcmcpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgb2ZmYXJnOwotewotICBiZmRfdm1hICpvZmYgPSAoYmZkX3ZtYSAqKSBvZmZhcmc7Ci0KLSAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0gICAgewotICAgICAgaC0+Z290Lm9mZnNldCA9IG9mZlswXTsKLSAgICAgIG9mZlswXSArPSBBUkNIX1NJWkUgLyA4OwotICAgIH0KLSAgZWxzZQotICAgIGgtPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbnkgZm9sayBuZWVkIG5vIG1vcmUgaW4gdGhlIHdheSBvZiBmaW5hbCBsaW5rIHRoYW4gdGhpcywgb25jZQotICAgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudGluZyBpcyBlbmFibGVkLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX2NvbW1vbl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoIWVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnZva2UgdGhlIHJlZ3VsYXIgRUxGIGJhY2tlbmQgbGlua2VyIHRvIGRvIGFsbCB0aGUgd29yay4gICovCi0gIHJldHVybiBlbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRob3VnaCBlbGZfbGlua19oYXNoX3RyYXZlcnNlIHRvIHN0b3JlCi0gICBhbGwgaGFzaCB2YWx1ZSBvZiB0aGUgZXhwb3J0ZWQgc3ltYm9scyBpbiBhbiBhcnJheS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfY29sbGVjdF9oYXNoX2NvZGVzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgKip2YWx1ZXAgPSAodW5zaWduZWQgbG9uZyAqKikgZGF0YTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgbG9uZyBoYTsKLSAgY2hhciAqYWxjID0gTlVMTDsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHAgPSBzdHJjaHIgKG5hbWUsIEVMRl9WRVJfQ0hSKTsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhbGMgPSBiZmRfbWFsbG9jIChwIC0gbmFtZSArIDEpOwotICAgICAgbWVtY3B5IChhbGMsIG5hbWUsIHAgLSBuYW1lKTsKLSAgICAgIGFsY1twIC0gbmFtZV0gPSAnXDAnOwotICAgICAgbmFtZSA9IGFsYzsKLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZS4gICovCi0gIGhhID0gYmZkX2VsZl9oYXNoIChuYW1lKTsKLQotICAvKiBTdG9yZSB0aGUgZm91bmQgaGFzaCB2YWx1ZSBpbiB0aGUgYXJyYXkgZ2l2ZW4gYXMgdGhlIGFyZ3VtZW50LiAgKi8KLSAgKigqdmFsdWVwKSsrID0gaGE7Ci0KLSAgLyogQW5kIHN0b3JlIGl0IGluIHRoZSBzdHJ1Y3Qgc28gdGhhdCB3ZSBjYW4gcHV0IGl0IGluIHRoZSBoYXNoIHRhYmxlCi0gICAgIGxhdGVyLiAgKi8KLSAgaC0+ZWxmX2hhc2hfdmFsdWUgPSBoYTsKLQotICBpZiAoYWxjICE9IE5VTEwpCi0gICAgZnJlZSAoYWxjKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGZ4eC10YXJnZXQuaCBiL2JmZC9lbGZ4eC10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2OWRkOC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmeHgtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyogVGFyZ2V0IGRlZmluaXRpb25zIGZvciBOTi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgQkZEIGtub3dzIGFib3V0IGEgdGFyZ2V0LgotICAgSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIHdoYXQgcm91dGluZXMgdG8gY2FsbAotICAgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLCBldGMuICBFdmVyeSBCRkQgcG9pbnRzIHRvIGEgdGFyZ2V0IHN0cnVjdHVyZQotICAgd2l0aCBpdHMgInh2ZWMiIG1lbWJlci4KLQotICAgVGhlcmUgYXJlIHR3byBzdWNoIHN0cnVjdHVyZXMgaGVyZTogIG9uZSBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcyBhbmQKLSAgIG9uZSBmb3IgbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4gICAqLwotCi0jZGVmaW5lCWJmZF9lbGZOTl9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jaWZuZGVmIGJmZF9lbGZOTl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX3JlbG9jCV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2lmbmRlZiBiZmRfZWxmTk5fZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZk5OX2ZpbmRfbmVhcmVzdF9saW5lCV9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX3JlYWRfbWluaXN5bWJvbHMJX2JmZF9lbGZfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBiZmRfZWxmTk5fbWluaXN5bWJvbF90b19zeW1ib2wJX2JmZF9lbGZfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9saW5lbm8JCV9iZmRfZWxmX2dldF9saW5lbm8KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltYm9sX2luZm8JX2JmZF9lbGZfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltdGFiCQlfYmZkX2VsZl9nZXRfc3ltdGFiCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNpZiAwIC8qIGRvbmUgaW4gZWxmLWJmZC5oICovCi0jZGVmaW5lIGJmZF9lbGZOTl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9tYWtlX2VtcHR5X3N5bWJvbAlfYmZkX2VsZl9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBiZmRfZWxmTk5fbmV3X3NlY3Rpb25faG9vawlfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIGJmZF9lbGZOTl9zZXRfYXJjaF9tYWNoCQlfYmZkX2VsZl9zZXRfYXJjaF9tYWNoCi0jaWZuZGVmIGJmZF9lbGZOTl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2RlZmluZSBiZmRfZWxmTk5fc2l6ZW9mX2hlYWRlcnMJX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX29iamVjdF9jb250ZW50cyBfYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCAoYmZkX3ZtYSkgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQgMgotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzIDEKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19zdGFydAliZmRfdm9pZAotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2RlYnVnX2luZm9fZW5kCWJmZF92b2lkCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCShQUk9UTyh2b2lkLCgqKSwoYmZkKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCU5VTEwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJTlVMTAotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9nY19zZWN0aW9ucyBfYmZkX2VsZk5OX2djX3NlY3Rpb25zCi0jZW5kaWYKLQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIHZvaWQgKiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2VuZGlmCi0KLSNpZmRlZiBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pICovCi0vKiBJZiBubyBiYWNrZW5kIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZSwgdXNlIHRoZSBnZW5lcmljIGxpbmtlci4gICovCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfYWRkX3N5bWJvbHMJX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9maW5hbF9saW5rCV9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZW5kaWYKLSNlbmRpZiAvKiAhIGRlZmluZWQgKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pICovCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9hcmNoaXZlX3AKLSNkZWZpbmUgYmZkX2VsZk5OX2FyY2hpdmVfcCBiZmRfZ2VuZXJpY19hcmNoaXZlX3AKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX21rb2JqZWN0Ci0jZGVmaW5lIGJmZF9lbGZOTl9ta29iamVjdCBiZmRfZWxmX21rb2JqZWN0Ci0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fbWtjb3JlZmlsZQotI2RlZmluZSBiZmRfZWxmTk5fbWtjb3JlZmlsZSBiZmRfZWxmX21rY29yZWZpbGUKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9ta2FyY2hpdmUKLSNkZWZpbmUgYmZkX2VsZk5OX21rYXJjaGl2ZSBfYmZkX2dlbmVyaWNfbWthcmNoaXZlCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcgotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAwCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAwCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsIDAKLSNlbmRpZgotCi0jaWZuZGVmIEVMRl9NQVhQQUdFU0laRQotICAjZXJyb3IgRUxGX01BWFBBR0VTSVpFIGlzIG5vdCBkZWZpbmVkCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAxCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9jb2xsZWN0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX2NvbGxlY3QgZmFsc2UKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vawotI2RlZmluZSBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vayBmYWxzZQotI2VuZGlmCi0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbAotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAotI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycwlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbAotI2RlZmluZSBlbGZfYmFja2VuZF9wcmludF9zeW1ib2xfYWxsCQlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcwotI2RlZmluZSBlbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zCQlOVUxMCi0jZW5kaWYKLQotLyogUHJldmlvdXNseSwgYmFja2VuZHMgY291bGQgb25seSB1c2UgU0hUX1JFTCBvciBTSFRfUkVMQSByZWxvY2F0aW9uCi0gICBzZWN0aW9ucywgYnV0IG5vdCBib3RoLiAgVGhleSBkZWZpbmVkIFVTRV9SRUwgdG8gaW5kaWNhdGUgU0hUX1JFTAotICAgc2VjdGlvbnMsIGFuZCBsZWZ0IGl0IHVuZGVmaW5lZCB0byBpbmRpY2F0ZWQgU0hUX1JFTEEgc2VjdGlvbnMuCi0gICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIHN0aWxsIHN1cHBvcnQgdGhpcyB1c2FnZS4gICovCi0jaWZuZGVmIFVTRV9SRUwKLSNkZWZpbmUgVVNFX1JFTCAwCi0jZWxzZQotI3VuZGVmIFVTRV9SRUwKLSNkZWZpbmUgVVNFX1JFTCAxCi0jZW5kaWYgCi0KLS8qIFVzZSB0aGVzZSBpbiBuZXcgY29kZS4gICovCi0jaWZuZGVmIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AgCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AgVVNFX1JFTAotI2VuZGlmIAotI2lmbmRlZiBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcAotI2RlZmluZSBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcCAhVVNFX1JFTAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2RlZmF1bHRfdXNlX3JlbGFfcCAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wICFVU0VfUkVMCi0jZW5kaWYKLQotI2lmbmRlZiBFTEZfTUFDSElORV9BTFQxCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgMAotI2VuZGlmCi0KLSNpZm5kZWYgRUxGX01BQ0hJTkVfQUxUMgotI2RlZmluZSBFTEZfTUFDSElORV9BTFQyIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NpemVfaW5mbwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2luZm8gX2JmZF9lbGZOTl9zaXplX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NpZ25fZXh0ZW5kX3ZtYQotI2RlZmluZSBlbGZfYmFja2VuZF9zaWduX2V4dGVuZF92bWEgMAotI2VuZGlmCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBfYmZkX2VsZk5OX3NpemVfaW5mbzsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhIGVsZk5OX2JlZCA9Ci17Ci0gIEVMRl9BUkNILAkJCS8qIGFyY2ggKi8KLSAgRUxGX01BQ0hJTkVfQ09ERSwJCS8qIGVsZl9tYWNoaW5lX2NvZGUgKi8KLSAgRUxGX01BWFBBR0VTSVpFLAkJLyogbWF4cGFnZXNpemUgKi8KLSAgZWxmX2luZm9fdG9faG93dG8sCi0gIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCwKLSAgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCwKLSAgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCi0gIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAotICBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkciwKLSAgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uLAotICBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2ssCi0gIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rLAotICBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzLAotICBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24sCi0gIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCwKLSAgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzLAotICBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAsCi0gIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vaywKLSAgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vaywKLSAgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMsCi0gIGVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwsCi0gIGVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMsCi0gIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAsCi0gIEVMRl9NQUNISU5FX0FMVDEsCi0gIEVMRl9NQUNISU5FX0FMVDIsCi0gICZlbGZfYmFja2VuZF9zaXplX2luZm8sCi0gIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0LAotICBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUsCi0gIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSwKLSAgZWxmX2JhY2tlbmRfY29sbGVjdCwKLSAgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2ssCi0gIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AsCi0gIGVsZl9iYWNrZW5kX21heV91c2VfcmVsYV9wLAotICBlbGZfYmFja2VuZF9kZWZhdWx0X3VzZV9yZWxhX3AsCi0gIGVsZl9iYWNrZW5kX3NpZ25fZXh0ZW5kX3ZtYSwKLSAgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0LAotICBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHksCi0gIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSwKLSAgZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQsCi0gIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQsCi0gIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfd2FudF9keW5ic3MKLX07Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSB3aGVuIGluaXRpYWxpc2luZyBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfQklHX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8Ci0gICBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0RFQlVHR0lORyB8IFNFQ19FWENMVURFIHwgU0VDX1NPUlRfRU5UUklFUyksCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNCwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIGJmZF9lbGZOTl9vYmplY3RfcCwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZWxmTk5fYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgYmZkX2VsZk5OX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl9ta29iamVjdCwKLSAgICBiZmRfZWxmTk5fbWthcmNoaXZlLAotICAgIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLSAgfSwKLQotICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChiZmRfZWxmTk4pLAotI2lmZGVmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucwotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYmZkX2VsZk5OX2FyY2hpdmUpLAotI2Vsc2UKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSNlbmRpZgotICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKGJmZF9lbGZOTiksCi0KLSAgLyogQWx0ZXJuYXRpdmUgZW5kaWFuIHRhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLSAgJiBUQVJHRVRfTElUVExFX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLQotICAvKiBiYWNrZW5kX2RhdGE6ICovCi0gIChQVFIpICZlbGZOTl9iZWQKLX07Ci0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNID0KLXsKLSAgLyogbmFtZTogaWRlbnRpZnkga2luZCBvZiB0YXJnZXQgKi8KLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAotCi0gIC8qIGZsYXZvdXI6IGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCBmaWxlICovCi0gIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCi0KLSAgLyogYnl0ZW9yZGVyOiBkYXRhIGlzIGxpdHRsZSBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCi0KLSAgLyogaGVhZGVyX2J5dGVvcmRlcjogaGVhZGVyIGlzIGFsc28gbGl0dGxlIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwKLQotICAvKiBvYmplY3RfZmxhZ3M6IG1hc2sgb2YgYWxsIGZpbGUgZmxhZ3MgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfAotICAgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAvKiBzZWN0aW9uX2ZsYWdzOiBtYXNrIG9mIGFsbCBzZWN0aW9uIGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfUkVBRE9OTFkgfAotICAgU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ERUJVR0dJTkcgfCBTRUNfRVhDTFVERSB8IFNFQ19TT1JUX0VOVFJJRVMpLAotCi0gICAvKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICAgICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0KLSAgLyogYXJfcGFkX2NoYXI6IHBhZCBjaGFyYWN0ZXIgZm9yIGZpbGVuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQvb3Igb3MgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUgKi8KLSAgJy8nLAotCi0gIC8qIGFyX21heF9uYW1lbGVuOiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUuICBUaGlzIHZhbHVlIGlzCi0gICAgIGEgV0FHICh3aWxkIGEqKiBndWVzcykgKi8KLSAgMTQsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZGF0YSBzZWN0aW9ucyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBmaWxlIGhlYWRlcnMgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAgLyogYmZkX2NoZWNrX2Zvcm1hdDogY2hlY2sgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgcmVhZCAqLwotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICBiZmRfZWxmTk5fb2JqZWN0X3AsCQkvKiBhc3NlbWJsZXIvbGlua2VyIG91dHB1dCAob2JqZWN0IGZpbGUpICovCi0gICAgYmZkX2VsZk5OX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLwotICAgIGJmZF9lbGZOTl9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICB9LAotCi0gIC8qIGJmZF9zZXRfZm9ybWF0OiBzZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fbWtvYmplY3QsCi0gICAgYmZkX2VsZk5OX21rYXJjaGl2ZSwKLSAgICBiZmRfZWxmTk5fbWtjb3JlZmlsZQotICB9LAotCi0gIC8qIGJmZF93cml0ZV9jb250ZW50czogd3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgYmZkX2VsZk5OX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBiZmRfZWxmTk5fd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZWxmTk5fd3JpdGVfY29yZWZpbGVfY29udGVudHMsCi0gIH0sCi0KLSAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoYmZkX2VsZk5OKSwKLSNpZmRlZiBiZmRfZWxmTk5fYXJjaGl2ZV9mdW5jdGlvbnMKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKGJmZF9lbGZOTl9hcmNoaXZlKSwKLSNlbHNlCi0gICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0jZW5kaWYKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChiZmRfZWxmTk4pLAotCi0gIC8qIEFsdGVybmF0aXZlIGVuZGlhbiB0YXJnZXQuICAqLwotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi0gICYgVEFSR0VUX0JJR19TWU0sCi0jZWxzZQotICBOVUxMLAotI2VuZGlmCi0gIAotICAvKiBiYWNrZW5kX2RhdGE6ICovCi0gIChQVFIpICZlbGZOTl9iZWQKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9lcG9jLXBlLWFybS5jIGIvYmZkL2Vwb2MtcGUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTI3N2EuLjAwMDAwMDAKLS0tIGEvYmZkL2Vwb2MtcGUtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBFUE9DIFBFIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAgICAwCi0jZGVmaW5lIFVTRVJfTEFCRUxfUFJFRklYICAgICIiCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAiZXBvYy1wZS1hcm0tbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBhcm1fZXBvY19wZV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICJlcG9jLXBlLWFybS1iaWciCi0KLSNkZWZpbmUgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9hcm1fZXBvY19wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9hcm1fZXBvY19wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX2Vwb2NfcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCi0jaW5jbHVkZSAicGUtYXJtLmMiCi0KZGlmZiAtLWdpdCBhL2JmZC9lcG9jLXBlaS1hcm0uYyBiL2JmZC9lcG9jLXBlaS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyNTQ4ZC4uMDAwMDAwMAotLS0gYS9iZmQvZXBvYy1wZWktYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBFUE9DIFBFIElNQUdFIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICAgIDAKLSNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggICAgIiIKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAiZXBvYy1wZWktYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgYXJtX2Vwb2NfcGVpX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgImVwb2MtcGVpLWFybS1iaWciCi0KLSNpbmNsdWRlICJwZWktYXJtLmMiCi0KZGlmZiAtLWdpdCBhL2JmZC9mb3JtYXQuYyBiL2JmZC9mb3JtYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMWY5Yy4uMDAwMDAwMAotLS0gYS9iZmQvZm9ybWF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyogR2VuZXJpYyBCRkQgc3VwcG9ydCBmb3IgZmlsZSBmb3JtYXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JRmlsZSBmb3JtYXRzCi0KLQlBIGZvcm1hdCBpcyBhIEJGRCBjb25jZXB0IG9mIGhpZ2ggbGV2ZWwgZmlsZSBjb250ZW50cyB0eXBlLiBUaGUKLQlmb3JtYXRzIHN1cHBvcnRlZCBieSBCRkQgYXJlOiAKLQotCW8gPDxiZmRfb2JqZWN0Pj4KLQotCVRoZSBCRkQgbWF5IGNvbnRhaW4gZGF0YSwgc3ltYm9scywgcmVsb2NhdGlvbnMgYW5kIGRlYnVnIGluZm8uCi0KLQlvIDw8YmZkX2FyY2hpdmU+PgotCi0JVGhlIEJGRCBjb250YWlucyBvdGhlciBCRkRzIGFuZCBhbiBvcHRpb25hbCBpbmRleC4KLQotCW8gPDxiZmRfY29yZT4+Ci0KLQlUaGUgQkZEIGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgYW4gZXhlY3V0YWJsZSBjb3JlIGR1bXAuCi0KLQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBJTVBPUlQgZnJvbSB0YXJnZXRzLmMuICAqLwotZXh0ZXJuIGNvbnN0IHNpemVfdCBfYmZkX3RhcmdldF92ZWN0b3JfZW50cmllczsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX2Zvcm1hdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NoZWNrX2Zvcm1hdChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KTsKLQotREVTQ1JJUFRJT04KLQlWZXJpZnkgaWYgdGhlIGZpbGUgYXR0YWNoZWQgdG8gdGhlIEJGRCBAdmFye2FiZmR9IGlzIGNvbXBhdGlibGUKLQl3aXRoIHRoZSBmb3JtYXQgQHZhcntmb3JtYXR9IChpLmUuLCBvbmUgb2YgPDxiZmRfb2JqZWN0Pj4sCi0JPDxiZmRfYXJjaGl2ZT4+IG9yIDw8YmZkX2NvcmU+PikuCi0KLQlJZiB0aGUgQkZEIGhhcyBiZWVuIHNldCB0byBhIHNwZWNpZmljIHRhcmdldCBiZWZvcmUgdGhlCi0JY2FsbCwgb25seSB0aGUgbmFtZWQgdGFyZ2V0IGFuZCBmb3JtYXQgY29tYmluYXRpb24gaXMKLQljaGVja2VkLiBJZiB0aGUgdGFyZ2V0IGhhcyBub3QgYmVlbiBzZXQsIG9yIGhhcyBiZWVuIHNldCB0bwotCTw8ZGVmYXVsdD4+LCB0aGVuIGFsbCB0aGUga25vd24gdGFyZ2V0IGJhY2tlbmRzIGlzCi0JaW50ZXJyb2dhdGVkIHRvIGRldGVybWluZSBhIG1hdGNoLiAgSWYgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0JbWF0Y2hlcywgaXQgaXMgdXNlZC4gIElmIG5vdCwgZXhhY3RseSBvbmUgdGFyZ2V0IG11c3QgcmVjb2duaXplCi0JdGhlIGZpbGUsIG9yIGFuIGVycm9yIHJlc3VsdHMuCi0KLQlUaGUgZnVuY3Rpb24gcmV0dXJucyA8PHRydWU+PiBvbiBzdWNjZXNzLCBvdGhlcndpc2UgPDxmYWxzZT4+Ci0Jd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczogIAotCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlpZiA8PGZvcm1hdD4+IGlzIG5vdCBvbmUgb2YgPDxiZmRfb2JqZWN0Pj4sIDw8YmZkX2FyY2hpdmU+PiBvcgotCTw8YmZkX2NvcmU+Pi4KLQotCW8gPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+PiAtCi0JaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgYSByZWFkIC0gZXZlbiBzb21lIGZpbGUgbWlzbWF0Y2hlcwotCWNhbiBjYXVzZSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGxzLgotCi0JbyA8PGZpbGVfbm90X3JlY29nbmlzZWQ+PiAtCi0Jbm9uZSBvZiB0aGUgYmFja2VuZHMgcmVjb2duaXNlZCB0aGUgZmlsZSBmb3JtYXQuCi0KLQlvIDw8YmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZD4+IC0KLQltb3JlIHRoYW4gb25lIGJhY2tlbmQgcmVjb2duaXNlZCB0aGUgZmlsZSBmb3JtYXQuCi0qLwotCi1ib29sZWFuCi1iZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBmb3JtYXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0gIHJldHVybiBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGZvcm1hdCwgTlVMTCk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQsIGNoYXIgKioqbWF0Y2hpbmcpOwotCi1ERVNDUklQVElPTgotCUxpa2UgPDxiZmRfY2hlY2tfZm9ybWF0Pj4sIGV4Y2VwdCB3aGVuIGl0IHJldHVybnMgZmFsc2Ugd2l0aAotCTw8YmZkX2Vycm5vPj4gc2V0IHRvIDw8YmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZD4+LiAgSW4gdGhhdAotCWNhc2UsIGlmIEB2YXJ7bWF0Y2hpbmd9IGlzIG5vdCBOVUxMLCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0JYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIGZvcm1hdHMgdGhhdCBtYXRjaGVkLAotCWFsbG9jYXRlZCB3aXRoIDw8bWFsbG9jPj4uCi0JVGhlbiB0aGUgdXNlciBtYXkgY2hvb3NlIGEgZm9ybWF0IGFuZCB0cnkgYWdhaW4uCi0KLQlXaGVuIGRvbmUgd2l0aCB0aGUgbGlzdCB0aGF0IEB2YXJ7bWF0Y2hpbmd9IHBvaW50cyB0bywgdGhlIGNhbGxlcgotCXNob3VsZCBmcmVlIGl0LiAgCi0qLwotCi1ib29sZWFuCi1iZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGZvcm1hdCwgbWF0Y2hpbmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci0gICAgIGNoYXIgKioqbWF0Y2hpbmc7Ci17Ci0gIGV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWM7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0LCAqc2F2ZV90YXJnLCAqcmlnaHRfdGFyZzsKLSAgY2hhciAqKm1hdGNoaW5nX3ZlY3RvciA9IE5VTEw7Ci0gIGludCBtYXRjaF9jb3VudDsKLQotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpIHx8Ci0gICAgICAoKGludCkoYWJmZC0+Zm9ybWF0KSA8IChpbnQpYmZkX3Vua25vd24pIHx8Ci0gICAgICAoKGludCkoYWJmZC0+Zm9ybWF0KSA+PSAoaW50KWJmZF90eXBlX2VuZCkpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX3Vua25vd24pCi0gICAgcmV0dXJuIChhYmZkLT5mb3JtYXQgPT0gZm9ybWF0KT8gdHJ1ZTogZmFsc2U7Ci0KLQotICAvKiBTaW5jZSB0aGUgdGFyZ2V0IHR5cGUgd2FzIGRlZmF1bHRlZCwgY2hlY2sgdGhlbSAKLSAgICAgYWxsIGluIHRoZSBob3BlIHRoYXQgb25lIHdpbGwgYmUgdW5pcXVlbHkgcmVjb2duaXplZC4gICovCi0KLSAgc2F2ZV90YXJnID0gYWJmZC0+eHZlYzsKLSAgbWF0Y2hfY291bnQgPSAwOwotICBpZiAobWF0Y2hpbmcpCi0gICAgewotICAgICAgbWF0Y2hpbmdfdmVjdG9yID0KLQkoY2hhciAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChjaGFyICopICoKLQkJCSAgICAgIChfYmZkX3RhcmdldF92ZWN0b3JfZW50cmllcyArIDEpKTsKLSAgICAgIGlmICghbWF0Y2hpbmdfdmVjdG9yKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1hdGNoaW5nX3ZlY3RvclswXSA9IE5VTEw7Ci0gICAgICAqbWF0Y2hpbmcgPSBtYXRjaGluZ192ZWN0b3I7Ci0gICAgfQotICByaWdodF90YXJnID0gMDsKLQotCi0gIC8qIHByZXN1bWUgdGhlIGFuc3dlciBpcyB5ZXMgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gZm9ybWF0OwotCi0gIC8qIElmIHRoZSB0YXJnZXQgdHlwZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIGp1c3QgY2hlY2sgdGhhdCB0YXJnZXQuICAqLwotCi0gIGlmICghYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkgewotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKTAsIFNFRUtfU0VUKSAhPSAwKQkvKiByZXdpbmQhICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmlnaHRfdGFyZyA9IEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9jaGVja19mb3JtYXQsIChhYmZkKSk7Ci0gICAgaWYgKHJpZ2h0X3RhcmcpIHsKLSAgICAgIGFiZmQtPnh2ZWMgPSByaWdodF90YXJnOwkJLyogU2V0IHRoZSB0YXJnZXQgYXMgcmV0dXJuZWQgKi8KLSAgICAgIGlmIChtYXRjaGluZykKLQlmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotICAgICAgcmV0dXJuIHRydWU7CQkJLyogRmlsZSBwb3NpdGlvbiBoYXMgbW92ZWQsIEJUVyAqLwotICAgIH0KLQotICAgIC8qIEZvciBhIGxvbmcgdGltZSB0aGUgY29kZSBoYXMgZHJvcHBlZCB0aHJvdWdoIHRvIGNoZWNrIGFsbAotICAgICAgIHRhcmdldHMgaWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgd2FzIHdyb25nLiAgSSBkb24ndCBrbm93IHdoeSwKLSAgICAgICBhbmQgSSdtIHJlbHVjdGFudCB0byBjaGFuZ2UgaXQuICBIb3dldmVyLCBpbiB0aGUgY2FzZSBvZiBhbgotICAgICAgIGFyY2hpdmUsIGl0IGNhbiBjYXVzZSBwcm9ibGVtcy4gIElmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGRvZXMKLSAgICAgICBub3QgcGVybWl0IGFyY2hpdmVzIChlLmcuLCB0aGUgYmluYXJ5IHRhcmdldCksIHRoZW4gd2Ugc2hvdWxkCi0gICAgICAgbm90IGFsbG93IHNvbWUgb3RoZXIgdGFyZ2V0IHRvIHJlY29nbml6ZSBpdCBhcyBhbiBhcmNoaXZlLCBidXQKLSAgICAgICBzaG91bGQgaW5zdGVhZCBhbGxvdyB0aGUgc3BlY2lmaWVkIHRhcmdldCB0byByZWNvZ25pemUgaXQgYXMgYW4KLSAgICAgICBvYmplY3QuICBXaGVuIEkgZmlyc3QgbWFkZSB0aGlzIGNoYW5nZSwgaXQgYnJva2UgdGhlIFBFIHRhcmdldCwKLSAgICAgICBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgcGVpLWkzODYgdGFyZ2V0IGRpZCBub3QgcmVjb2duaXplIHRoZQotICAgICAgIGFjdHVhbCBwZS1pMzg2IGFyY2hpdmUuICBTaW5jZSB0aGVyZSBtYXkgYmUgb3RoZXIgcHJvYmxlbXMgb2YKLSAgICAgICB0aGlzIHNvcnQsIEkgY2hhbmdlZCB0aGlzIHRlc3QgdG8gY2hlY2sgb25seSBmb3IgdGhlIGJpbmFyeQotICAgICAgIHRhcmdldC4gICovCi0KLSAgICBpZiAoZm9ybWF0ID09IGJmZF9hcmNoaXZlICYmIHNhdmVfdGFyZyA9PSAmYmluYXJ5X3ZlYykKLSAgICAgIHsKLQlhYmZkLT54dmVjID0gc2F2ZV90YXJnOwotCWFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotCWlmIChtYXRjaGluZykKLQkgIGZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgfQotCi0gIGZvciAodGFyZ2V0ID0gYmZkX3RhcmdldF92ZWN0b3I7ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspIHsKLSAgICBjb25zdCBiZmRfdGFyZ2V0ICp0ZW1wOwotCi0gICAgaWYgKCp0YXJnZXQgPT0gJmJpbmFyeV92ZWMpCi0gICAgICBjb250aW51ZTsKLQotICAgIGFiZmQtPnh2ZWMgPSAqdGFyZ2V0OwkvKiBDaGFuZ2UgQkZEJ3MgdGFyZ2V0IHRlbXBvcmFyaWx5ICovCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpMCwgU0VFS19TRVQpICE9IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLyogSWYgX2JmZF9jaGVja19mb3JtYXQgbmVnbGVjdHMgdG8gc2V0IGJmZF9lcnJvciwgYXNzdW1lIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQuCi0gICAgICAgV2UgZGlkbid0IHVzZWQgdG8gZXZlbiBwYXkgYW55IGF0dGVudGlvbiB0byBiZmRfZXJyb3IsIHNvIEkgc3VzcGVjdAotICAgICAgIHRoYXQgc29tZSBfYmZkX2NoZWNrX2Zvcm1hdCBtaWdodCBoYXZlIHRoaXMgcHJvYmxlbS4gICovCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgdGVtcCA9IEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9jaGVja19mb3JtYXQsIChhYmZkKSk7Ci0gICAgaWYgKHRlbXApIHsJCQkJLyogVGhpcyBmb3JtYXQgY2hlY2tzIG91dCBhcyBvayEgKi8KLSAgICAgIHJpZ2h0X3RhcmcgPSB0ZW1wOwotICAgICAgaWYgKG1hdGNoaW5nKQotCXsKLQkgIG1hdGNoaW5nX3ZlY3RvclttYXRjaF9jb3VudF0gPSB0ZW1wLT5uYW1lOwotCSAgbWF0Y2hpbmdfdmVjdG9yW21hdGNoX2NvdW50ICsgMV0gPSBOVUxMOwotCX0KLSAgICAgIG1hdGNoX2NvdW50Kys7Ci0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldCwgYWNjZXB0IGl0LCBldmVuIGlmIG90aGVyIHRhcmdldHMKLQkgbWlnaHQgbWF0Y2guICBQZW9wbGUgd2hvIHdhbnQgdGhvc2Ugb3RoZXIgdGFyZ2V0cyBoYXZlIHRvIHNldCAKLQkgdGhlIEdOVVRBUkdFVCB2YXJpYWJsZS4gICovCi0gICAgICBpZiAodGVtcCA9PSBiZmRfZGVmYXVsdF92ZWN0b3JbMF0pCi0JewotCSAgaWYgKG1hdGNoaW5nKQotCSAgICB7Ci0JICAgICAgbWF0Y2hpbmdfdmVjdG9yWzBdID0gdGVtcC0+bmFtZTsKLQkgICAgICBtYXRjaGluZ192ZWN0b3JbMV0gPSBOVUxMOwotCSAgICB9Ci0JICBtYXRjaF9jb3VudCA9IDE7Ci0JICBicmVhazsKLQl9Ci0jaWZkZWYgR05VOTYwCi0gICAgICAvKiBCaWctIGFuZCBsaXR0bGUtZW5kaWFuIGIub3V0IGFyY2hpdmVzIGxvb2sgdGhlIHNhbWUsIGJ1dCBpdCBkb2Vzbid0Ci0gICAgICAgKiBtYXR0ZXI6IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlaXIgaGVhZGVycywgYW5kIG1lbWJlciBmaWxlIGJ5dGUKLSAgICAgICAqIG9yZGVycyB3aWxsIChJIGhvcGUpIGJlIGhhbmRsZWQgYXBwcm9wcmlhdGVseSBieSBiZmQuICBEaXR0byBmb3IgYmlnCi0gICAgICAgKiBhbmQgbGl0dGxlIGNvZmYgYXJjaGl2ZXMuICBBbmQgdGhlIDQgY29mZi9iLm91dCBvYmplY3QgZm9ybWF0cyBhcmUKLSAgICAgICAqIHVuYW1iaWd1b3VzLiAgU28gYWNjZXB0IHRoZSBmaXJzdCBtYXRjaCB3ZSBmaW5kLgotICAgICAgICovCi0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0gZWxzZSBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KSB7Ci0gICAgICBhYmZkLT54dmVjID0gc2F2ZV90YXJnOwotICAgICAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gICAgICBpZiAobWF0Y2hpbmcgJiYgYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1hdGNoX2NvdW50ID09IDEpIHsKLSAgICBhYmZkLT54dmVjID0gcmlnaHRfdGFyZzsJCS8qIENoYW5nZSBCRkQncyB0YXJnZXQgcGVybWFuZW50bHkgKi8KLSAgICBpZiAobWF0Y2hpbmcpCi0gICAgICBmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotICAgIHJldHVybiB0cnVlOwkJCS8qIEZpbGUgcG9zaXRpb24gaGFzIG1vdmVkLCBCVFcgKi8KLSAgfQotCi0gIGFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7CQkvKiBSZXN0b3JlIG9yaWdpbmFsIHRhcmdldCB0eXBlICovCi0gIGFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwkJLyogUmVzdG9yZSBvcmlnaW5hbCBmb3JtYXQgKi8KLSAgaWYgKG1hdGNoX2NvdW50ID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQpOwotICAgICAgaWYgKG1hdGNoaW5nKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9mb3JtYXQKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfZm9ybWF0KGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpOwotCi1ERVNDUklQVElPTgotCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZmlsZSBmb3JtYXQgb2YgdGhlIEJGRCBAdmFye2FiZmR9IHRvIHRoZQotCWZvcm1hdCBAdmFye2Zvcm1hdH0uIElmIHRoZSB0YXJnZXQgc2V0IGluIHRoZSBCRkQgZG9lcyBub3QKLQlzdXBwb3J0IHRoZSBmb3JtYXQgcmVxdWVzdGVkLCB0aGUgZm9ybWF0IGlzIGludmFsaWQsIG9yIHRoZSBCRkQKLQlpcyBub3Qgb3BlbiBmb3Igd3JpdGluZywgdGhlbiBhbiBlcnJvciBvY2N1cnMuCi0KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfZm9ybWF0IChhYmZkLCBmb3JtYXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0KLSAgaWYgKGJmZF9yZWFkX3AgKGFiZmQpIHx8Ci0gICAgICAoKGludClhYmZkLT5mb3JtYXQgPCAoaW50KWJmZF91bmtub3duKSB8fAotICAgICAgKChpbnQpYWJmZC0+Zm9ybWF0ID49IChpbnQpYmZkX3R5cGVfZW5kKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfdW5rbm93bikKLSAgICByZXR1cm4gKGFiZmQtPmZvcm1hdCA9PSBmb3JtYXQpID8gdHJ1ZTpmYWxzZTsKLQotICAvKiBwcmVzdW1lIHRoZSBhbnN3ZXIgaXMgeWVzICovCi0gIGFiZmQtPmZvcm1hdCA9IGZvcm1hdDsKLQotICBpZiAoIUJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9zZXRfZm9ybWF0LCAoYWJmZCkpKSB7Ci0gICAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Zvcm1hdF9zdHJpbmcKLQotU1lOT1BTSVMKLQlDT05TVCBjaGFyICpiZmRfZm9ybWF0X3N0cmluZyhiZmRfZm9ybWF0IGZvcm1hdCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byBhIGNvbnN0IHN0cmluZwotCTw8aW52YWxpZD4+LCA8PG9iamVjdD4+LCA8PGFyY2hpdmU+PiwgPDxjb3JlPj4sIG9yIDw8dW5rbm93bj4+LAotCWRlcGVuZGluZyB1cG9uIHRoZSB2YWx1ZSBvZiBAdmFye2Zvcm1hdH0uCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9mb3JtYXRfc3RyaW5nIChmb3JtYXQpCi0gICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotewotICBpZiAoKChpbnQpZm9ybWF0IDwoaW50KSBiZmRfdW5rbm93bikgCi0gICAgICB8fCAoKGludClmb3JtYXQgPj0oaW50KSBiZmRfdHlwZV9lbmQpKSAKLSAgICByZXR1cm4gImludmFsaWQiOwotICAKLSAgc3dpdGNoIChmb3JtYXQpIHsKLSAgY2FzZSBiZmRfb2JqZWN0OgotICAgIHJldHVybiAib2JqZWN0IjsJCS8qIGxpbmtlci9hc3NlbWJlci9jb21waWxlciBvdXRwdXQgKi8KLSAgY2FzZSBiZmRfYXJjaGl2ZTogCi0gICAgcmV0dXJuICJhcmNoaXZlIjsJCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLSAgY2FzZSBiZmRfY29yZTogCi0gICAgcmV0dXJuICJjb3JlIjsJCS8qIGNvcmUgZHVtcCAqLwotICBkZWZhdWx0OiAKLSAgICByZXR1cm4gInVua25vd24iOwotICB9Ci19CmRpZmYgLS1naXQgYS9iZmQvZnJlZWJzZC5oIGIvYmZkL2ZyZWVic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiMTlhYy4uMDAwMDAwMAotLS0gYS9iZmQvZnJlZWJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkZWZpbml0aW9ucyB1c2VkIGJ5IGFsbCBGcmVlQlNEIHRhcmdldHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotKi8KLQotLyogRnJlZUJTRCBaTUFHSUMgZmlsZXMgbmV2ZXIgaGF2ZSB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAqLwotI2RlZmluZQlOX0hFQURFUl9JTl9URVhUKHgpCTAKLQotLyogWk1BR0lDIGZpbGVzIHN0YXJ0IGF0IG9mZnNldCAwLiAgRG9lcyBub3QgYXBwbHkgdG8gUU1BR0lDIGZpbGVzLiAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJCTAKLQotI2RlZmluZSBOX0dFVE1BR0lDX05FVChleGVjKSBcCi0JKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZGVmaW5lIE5fR0VUTUlEX05FVChleGVjKSBcCi0JKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4M2ZmKQotI2RlZmluZSBOX0dFVEZMQUdfTkVUKGV4KSBcCi0JKCgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCi0KLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSBcCi0JKChlbnVtIG1hY2hpbmVfdHlwZSkgXAotCSAoKE5fR0VUTUFHSUNfTkVUIChleGVjKSA9PSBaTUFHSUMpID8gTl9HRVRNSURfTkVUIChleGVjKSA6IFwKLQkgICgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4M2ZmKSkKLSNkZWZpbmUgTl9GTEFHUyhleGVjKSBcCi0JKChOX0dFVE1BR0lDX05FVCAoZXhlYykgPT0gWk1BR0lDKSA/IE5fR0VURkxBR19ORVQgKGV4ZWMpIDogXAotCSAoKGV4ZWMpLmFfaW5mbyA+PiAyNikgJiAweDNmKQotCi0jZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotCSB8ICgoKGludCkodHlwZSkgJiAweDNmZikgPDwgMTYpIFwKLQkgfCAoKChmbGFncykgJiAweDNmKSA8PCAyNikpCi0jZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0gICAgICAgICAoKGV4ZWMpLmFfaW5mbyAmIDB4ZmIwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweDNmZikgPDwgMTYpKQotI2RlZmluZSBOX1NFVF9GTEFHUyhleGVjLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gXAotCSAoKGV4ZWMpLmFfaW5mbyAmIDB4MDNmZmZmZmYpIHwgKChmbGFncyAmIDB4MDNmKSA8PCAyNikpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIE9uIEZyZWVCU0QsIHRoZSBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGluIGkzODYgKGxpdHRsZS1lbmRpYW4pCi0gICBmb3JtYXQuICBJIHRoaW5rLiAgKi8KLSNkZWZpbmUgU1dBUF9NQUdJQyhleHQpIGJmZF9nZXRsMzIgKGV4dCkKLQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi1zdGF0aWMgYm9vbGVhbiBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0gICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFKGFiZmQpOwotI2Vsc2UKLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0jZW5kaWYKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICBpZiAoc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYS5vdXQtbTY4azRrLW5ldGJzZCIpID09IDApCi0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjhLNEtfTkVUQlNEKTsKLSAgICBlbHNlCi0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjhLX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1NQQVJDX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMzg2X05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfbnMzMms6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzUzMl9ORVRCU0QpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgICBicmVhazsKLSAgfQotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2dlbi1hb3V0LmMgYi9iZmQvZ2VuLWFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlZDkxYS4uMDAwMDAwMAotLS0gYS9iZmQvZ2VuLWFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKiBHZW5lcmF0ZSBwYXJhbWV0ZXJzIGZvciBhbiBhLm91dCBzeXN0ZW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiL3Vzci9pbmNsdWRlL2Eub3V0LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsgY2hhcioqIGFyZ3Y7Ci17Ci0gIHN0cnVjdCBleGVjIG15X2V4ZWM7Ci0gIGludCBwYWdlX3NpemU7Ci0gIGNoYXIgKnRhcmdldCA9ICJ1bmtub3duIiwgKmFyY2ggPSAidW5rbm93biI7Ci0gIEZJTEUgKmZpbGUgPSBmb3BlbigiZ2VuLWFvdXQiLCAiciIpOwotCi0gIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gZ2VuLWFvdXQhXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoZnJlYWQoJm15X2V4ZWMsIHNpemVvZihzdHJ1Y3QgZXhlYyksIDEsIGZpbGUpICE9IDEpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlYWQgZ2VuLWFvdXQhXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHRhcmdldCA9IGFyZ3ZbMV07Ci0gIGlmICh0YXJnZXQgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZ2VuLWFvdXQgdGFyZ2V0X25hbWVcbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gIH0KLQotI2lmZGVmIE5fVFhUT0ZGCi0gIHBhZ2Vfc2l6ZSA9IE5fVFhUT0ZGKG15X2V4ZWMpOwotICBpZiAocGFnZV9zaXplID09IDApCi0gICAgcHJpbnRmKCIjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMVxuIik7Ci0gIGVsc2UKLSAgICBwcmludGYoIiNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwXG4iKTsKLSNlbmRpZgotCi0gIHByaW50ZigiI2RlZmluZSBCWVRFU19JTl9XT1JEICVkXG4iLCBzaXplb2YgKGludCkpOwotICBpZiAobXlfZXhlYy5hX2VudHJ5ID09IDApIHsKLSAgICAgIHByaW50ZigiI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVST1xuIik7Ci0gICAgICBwcmludGYoIiNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgKi9cbiIpOwotICB9Ci0gIGVsc2UgewotICAgICAgcHJpbnRmKCIvKiNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8qL1xuIik7Ci0gICAgICBwcmludGYoIi8qI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCovXG4iKTsKLSAgfQotCi0gIHByaW50ZigiI2RlZmluZSBURVhUX1NUQVJUX0FERFIgJWRcbiIsIG15X2V4ZWMuYV9lbnRyeSk7Ci0KLSNpZmRlZiBQQUdTSVoKLSAgaWYgKHBhZ2Vfc2l6ZSA9PSAwKQotICAgIHBhZ2Vfc2l6ZSA9IFBBR1NJWjsKLSNlbmRpZgotICBpZiAocGFnZV9zaXplICE9IDApCi0gICAgcHJpbnRmKCIjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgJWRcbiIsIHBhZ2Vfc2l6ZSk7Ci0gIGVsc2UKLSAgICBwcmludGYoIi8qICNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA/Pz8gKi9cbiIpOwotICBwcmludGYoIiNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkVcbiIpOwotCi0jaWZkZWYgdmF4Ci0gIGFyY2ggPSAidmF4IjsKLSNlbmRpZgotI2lmZGVmIG02OGsKLSAgYXJjaCA9ICJtNjhrIjsKLSNlbmRpZgotICBpZiAoYXJjaFswXSA9PSAnMScpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ3YXJuaW5nOiBwcmVwcm9jZXNzb3Igc3Vic3RpdHV0ZWQgYXJjaGl0ZWN0dXJlIG5hbWUgaW5zaWRlIHN0cmluZzsiKSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiAgICAgICAgIGZpeCBERUZBVUxUX0FSQ0ggaW4gdGhlIG91dHB1dCBmaWxlIHlvdXJzZWxmXG4iKSk7Ci0gICAgICBhcmNoID0gInVua25vd24iOwotICAgIH0KLSAgcHJpbnRmKCIjZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF8lc1xuIiwgYXJjaCk7Ci0KLSAgcHJpbnRmKCJcbiNkZWZpbmUgTVkoT1ApIENBVCglc18sT1ApXG4iLCB0YXJnZXQpOwotICBwcmludGYoIiNkZWZpbmUgVEFSR0VUTkFNRSBcImEub3V0LSVzXCJcblxuIiwgdGFyZ2V0KTsKLQotICBwcmludGYoIiNpbmNsdWRlIFwiYmZkLmhcIlxuIik7Ci0gIHByaW50ZigiI2luY2x1ZGUgXCJzeXNkZXAuaFwiXG4iKTsKLSAgcHJpbnRmKCIjaW5jbHVkZSBcImxpYmJmZC5oXCJcbiIpOwotICBwcmludGYoIiNpbmNsdWRlIFwibGliYW91dC5oXCJcbiIpOwotICBwcmludGYoIlxuI2luY2x1ZGUgXCJhb3V0LXRhcmdldC5oXCJcbiIpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2dlbmxpbmsuaCBiL2JmZC9nZW5saW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGE4ZGUuLjAwMDAwMDAKLS0tIGEvYmZkL2dlbmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBnZW5saW5rLmggLS0gaW50ZXJmYWNlIHRvIHRoZSBCRkQgZ2VuZXJpYyBsaW5rZXIKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEdFTkxJTktfSAotI2RlZmluZSBHRU5MSU5LX0gKLQotLyogVGhpcyBoZWFkZXIgZmlsZSBpcyBpbnRlcm5hbCB0byBCRkQuICBJdCBkZXNjcmliZXMgdGhlIGludGVybmFsCi0gICBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgQkZEIGdlbmVyaWMgbGlua2VyLCBpbiBjYXNlCi0gICBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgbGlua2VycyB3YW50IHRvIHVzZSBvciBjYWxsIHRoZW0uICBOb3RlCi0gICB0aGF0IHNvbWUgZnVuY3Rpb25zLCBzdWNoIGFzIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlLAotICAgYXJlIGRlY2xhcmVkIGluIGxpYmJmZC5oLCBiZWNhdXNlIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHdpZGVseQotICAgdXNlZC4gIFRoZSBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIHdpbGwgcHJvYmFibHkgb25seQotICAgYmUgdXNlZCBieSBhIGZldyBmaWxlcyBiZXNpZGVzIGxpbmtlci5jIGl0c2VsZi4gIEluIGZhY3QsIHRoaXMgZmlsZQotICAgaXMgbm90IHBhcnRpY3VsYXJseSBjb21wbGV0ZTsgSSBoYXZlIG9ubHkgcHV0IGluIHRoZSBpbnRlcmZhY2VzIEkKLSAgIGFjdHVhbGx5IG5lZWRlZC4gICovCi0KLS8qIFRoZSBnZW5lcmljIGxpbmtlciB1c2VzIGEgaGFzaCB0YWJsZSB3aGljaCBpcyBhIGRlcml2ZWQgY2xhc3Mgb2YKLSAgIHRoZSBzdGFuZGFyZCBsaW5rZXIgaGFzaCB0YWJsZSwganVzdCBhcyB0aGUgb3RoZXIgYmFja2VuZCBzcGVjaWZpYwotICAgbGlua2VycyBkby4gIERvIG5vdCBjb25mdXNlIHRoZSBnZW5lcmljIGxpbmtlciBoYXNoIHRhYmxlIHdpdGggdGhlCi0gICBzdGFuZGFyZCBCRkQgbGlua2VyIGhhc2ggdGFibGUgaXQgaXMgYnVpbHQgdXBvbi4gICovCi0KLS8qIEdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgYm9vbGVhbiB3cml0dGVuOwotICAvKiBTeW1ib2wgZnJvbSBpbnB1dCBCRkQuICAqLwotICBhc3ltYm9sICpzeW07Ci19OwotCi0vKiBHZW5lcmljIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBUaGUgZ2VuZXJpYyBsaW5rZXIgcmVhZHMgaW4gdGhlIGFzeW1ib2wgc3RydWN0dXJlcyBmb3IgYW4gaW5wdXQgQkZECi0gICBhbmQga2VlcHMgdGhlbSBpbiB0aGUgb3V0c3ltYm9sIGFuZCBzeW1jb3VudCBmaWVsZHMuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLQotLyogQWRkIHRoZSBzeW1ib2xzIG9mIGlucHV0X2JmZCB0byB0aGUgc3ltYm9scyBiZWluZyBidWlsdCBmb3IKLSAgIG91dHB1dF9iZmQuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBzaXplX3QgKnBzeW1hbGxvYykpOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wsIHdoaWNoIG1heSBiZSBjYWxsZWQgdmlhCi0gICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvCi17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIHNpemVfdCAqcHN5bWFsbG9jOwotfTsKLQotLyogV3JpdGUgb3V0IGEgc2luZ2xlIGdsb2JhbCBzeW1ib2wuICBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZAotICAgdmlhIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UuICBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3QKLSAgIGFjdHVhbGx5IGJlIGEgc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvICouICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIEdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGVudHJ5IGNyZWF0aW9uIHJvdXRpbmUuICAqLwotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotICAgICAgICAgICBjb25zdCBjaGFyICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvZ28zMnN0dWIuaCBiL2JmZC9nbzMyc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQzODhjLi4wMDAwMDAwCi0tLSBhL2JmZC9nbzMyc3R1Yi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTB4NGQsMHg1YSwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgyNywweDAwLDB4ZmYsMHhmZiwweDAwLDB4MDAsCi0weDYwLDB4MDcsMHgwMCwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgwZCwweDBhLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDY4LAotMHgyMCwweDY3LDB4NjUsMHg2ZSwweDY1LDB4NzIsMHg2MSwweDc0LDB4NjUsMHg2NCwweDIwLDB4NjYsMHg3MiwweDZmLDB4NmQsMHgyMCwKLTB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsMHg2ZCwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLDB4NzMsCi0weDZkLDB4MmMsMHgyMCwweDZmLDB4NmUsMHgyMCwweDU3LDB4NjUsMHg2NCwweDIwLDB4NGEsMHg3NSwweDZlLDB4MjAsMHgzMSwweDMxLAotMHgyMCwweDMxLDB4MzYsMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDMxLDB4MzksMHgzOSwweDM3LDB4MGQsMHgwYSwKLTB4NTQsMHg2OCwweDY1LDB4MjAsMHg1MywweDU0LDB4NTUsMHg0MiwweDJlLDB4NDUsMHg1OCwweDQ1LDB4MjAsMHg3MywweDc0LDB4NzUsCi0weDYyLDB4MjAsMHg2YywweDZmLDB4NjEsMHg2NCwweDY1LDB4NzIsMHgyMCwweDY5LDB4NzMsMHgyMCwweDQzLDB4NmYsMHg3MCwweDc5LAotMHg3MiwweDY5LDB4NjcsMHg2OCwweDc0LDB4MjAsMHgyOCwweDQzLDB4MjksMHgyMCwweDMxLDB4MzksMHgzOSwweDMzLDB4MmQsMHgzMSwKLTB4MzksMHgzOSwweDM1LDB4MjAsMHg0NCwweDRhLDB4MjAsMHg0NCwweDY1LDB4NmMsMHg2ZiwweDcyLDB4NjksMHg2NSwweDJlLDB4MjAsCi0weDBkLDB4MGEsMHg1MCwweDY1LDB4NzIsMHg2ZCwweDY5LDB4NzMsMHg3MywweDY5LDB4NmYsMHg2ZSwweDIwLDB4NjcsMHg3MiwweDYxLAotMHg2ZSwweDc0LDB4NjUsMHg2NCwweDIwLDB4NzQsMHg2ZiwweDIwLDB4NzUsMHg3MywweDY1LDB4MjAsMHg2NiwweDZmLDB4NzIsMHgyMCwKLTB4NjEsMHg2ZSwweDc5LDB4MjAsMHg3MCwweDc1LDB4NzIsMHg3MCwweDZmLDB4NzMsMHg2NSwweDIwLDB4NzAsMHg3MiwweDZmLDB4NzYsCi0weDY5LDB4NjQsMHg2NSwweDY0LDB4MjAsMHg3NCwweDY4LDB4NjksMHg3MywweDIwLDB4NjMsMHg2ZiwweDcwLDB4NzksMHg3MiwweDY5LAotMHg2NywweDY4LDB4NzQsMHgyMCwweDBkLDB4MGEsMHg3MiwweDY1LDB4NmQsMHg2MSwweDY5LDB4NmUsMHg3MywweDIwLDB4NzAsMHg3MiwKLTB4NjUsMHg3MywweDY1LDB4NmUsMHg3NCwweDIwLDB4NjEsMHg2ZSwweDY0LDB4MjAsMHg3NSwweDZlLDB4NmQsMHg2ZiwweDY0LDB4NjksCi0weDY2LDB4NjksMHg2NSwweDY0LDB4MmUsMHgyMCwweDBkLDB4MGEsMHg1NCwweDY4LDB4NjksMHg3MywweDIwLDB4NmYsMHg2ZSwweDZjLAotMHg3OSwweDIwLDB4NjEsMHg3MCwweDcwLDB4NmMsMHg2OSwweDY1LDB4NzMsMHgyMCwweDc0LDB4NmYsMHgyMCwweDc0LDB4NjgsMHg2NSwKLTB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJjLDB4MjAsMHg2MSwweDZlLDB4NjQsMHgyMCwweDZlLDB4NmYsMHg3NCwweDIwLDB4NmUsCi0weDY1LDB4NjMsMHg2MywweDY1LDB4NzMsMHg3MywweDYxLDB4NzIsMHg2OSwweDZjLDB4NzksMHgyMCwweDc0LDB4NjgsMHg2NSwweDIwLAotMHg3NywweDY4LDB4NmYsMHg2YywweDY1LDB4MjAsMHg3MCwweDcyLDB4NmYsMHg2NywweDcyLDB4NjEsMHg2ZCwweDJlLDB4MGEsMHgwZCwKLTB4MGEsMHgyNCwweDQ5LDB4NjQsMHgzYSwweDIwLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsMHg2ZCwweDIwLDB4NjIsCi0weDc1LDB4NjksMHg2YywweDc0LDB4MjAsMHgzMCwweDM2LDB4MmYsMHgzMSwweDMxLDB4MmYsMHgzOSwweDM3LDB4MjAsMHgzMSwweDM2LAotMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDYyLDB4NzksMHgyMCwweDY0LDB4NmEsMHg2MSwweDczLDB4NmQsMHgyMCwKLTB4MjQsMHgwYSwweDBkLDB4MGEsMHg0MCwweDI4LDB4MjMsMHgyOSwweDIwLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsCi0weDZkLDB4MjAsMHg2MiwweDc1LDB4NjksMHg2YywweDc0LDB4MjAsMHgzMCwweDM2LDB4MmYsMHgzMSwweDMxLDB4MmYsMHgzOSwweDM3LAotMHgyMCwweDMxLDB4MzYsMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDYyLDB4NzksMHgyMCwweDY0LDB4NmEsMHg2MSwKLTB4NzMsMHg2ZCwweDBhLDB4MGQsMHgwYSwweDFhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHg2NywweDZmLDB4MzMsMHgzMiwweDczLDB4NzQsMHg3NSwweDYyLDB4MmMsMHgyMCwweDc2LDB4MjAsMHgzMiwweDJlLDB4MzAsMHgzMCwKLTB4NTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDU3LDB4NTMsMHg0NCwweDUwLDB4NGQsMHg0OSwweDJlLDB4NDUsMHg1OCwweDQ1LDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MGUsMHgxZiwweDhjLDB4MWUsMHgyNCwweDAwLDB4OGMsMHgwNiwweDYwLDB4MDcsMHhmYywweGI0LAotMHgzMCwweGNkLDB4MjEsMHgzYywweDAzLDB4NzMsMHgwNiwweGJhLDB4ODYsMHgwNSwweGU5LDB4YjIsMHgwMywweGEyLDB4NjksMHgwOCwKLTB4YmIsMHg3MCwweDA4LDB4YTEsMHgyMCwweDAwLDB4MzksMHhjMywweDczLDB4MDIsMHg4OSwweGMzLDB4ODksMHgxZSwweDIwLDB4MDAsCi0weGZlLDB4YzcsMHhiOSwweDA0LDB4ZmYsMHhkMywweGViLDB4YjQsMHg0YSwweGNkLDB4MjEsMHg3MywweDBhLDB4ZDMsMHhlMywweGZlLAotMHhjZiwweDg5LDB4MWUsMHgyMCwweDAwLDB4ZWIsMHhkOSwweDI2LDB4OGUsMHgwNiwweDJjLDB4MDAsMHgzMSwweGZmLDB4MzAsMHhjMCwKLTB4YTksMHhmMiwweGFlLDB4MjYsMHg4MSwweDNkLDB4NTAsMHg0MSwweDc1LDB4MTUsMHhhZiwweDI2LDB4ODEsMHgzZCwweDU0LDB4NDgsCi0weDc1LDB4MGQsMHhhZiwweDI2LDB4ODAsMHgzZCwweDNkLDB4NzUsMHgwNiwweDQ3LDB4ODksMHgzZSwweDY3LDB4MDQsMHg0ZiwweGFlLAotMHg3NSwweGRmLDB4YWYsMHgwNiwweDU3LDB4MzEsMHhjOSwweDc0LDB4MTAsMHhiYSwweDVkLDB4MDUsMHhlOSwweDUwLDB4MDMsMHgwOSwKLTB4YzksMHg3NSwweGY2LDB4NDEsMHhlOCwweDkyLDB4MDMsMHg3MiwweGYwLDB4YjgsMHg4NywweDE2LDB4Y2QsMHgyZiwweDA5LDB4YzAsCi0weDc1LDB4ZWQsMHg4MCwweGUzLDB4MDEsMHg3NCwweGU4LDB4ODksMHgzZSwweDAwLDB4MDYsMHg4YywweDA2LDB4MDIsMHgwNiwweDg5LAotMHgzNiwweDA0LDB4MDYsMHg1ZiwweDA3LDB4ZTgsMHhkNSwweDAyLDB4ODksMHgzZSwweDJhLDB4MDAsMHg4OSwweDM2LDB4NjIsMHgwNywKLTB4ODAsMHgzZSwweDJjLDB4MDAsMHgwMCwweDc0LDB4MjQsMHhiOSwweDA4LDB4MDAsMHhiZiwweDJjLDB4MDAsMHg4YSwweDA1LDB4NDcsCi0weDA4LDB4YzAsMHg3NCwweDA1LDB4ODgsMHgwNywweDQzLDB4ZTIsMHhmNCwweDY2LDB4YzcsMHgwNywweDJlLDB4NDUsMHg1OCwweDQ1LAotMHg4MSwweGMzLDB4MDQsMHgwMCwweGM2LDB4MDcsMHgwMCwweDg5LDB4MWUsMHg2MiwweDA3LDB4YjgsMHgwMCwweDNkLDB4YmEsMHg2NCwKLTB4MDcsMHhjZCwweDIxLDB4MGYsMHg4MiwweGI0LDB4MDIsMHhhMywweDA2LDB4MDYsMHg4OSwweGMzLDB4YjksMHgwNiwweDAwLDB4YmEsCi0weGI1LDB4MDcsMHhiNCwweDNmLDB4Y2QsMHgyMSwweDMxLDB4ZDIsMHgzMSwweGM5LDB4YTEsMHhiNSwweDA3LDB4M2QsMHg0YywweDAxLAotMHg3NCwweDFiLDB4M2QsMHg0ZCwweDVhLDB4MGYsMHg4NSwweDk3LDB4MDIsMHg4YiwweDE2LDB4YjksMHgwNywweGMxLDB4ZTIsMHgwOSwKLTB4OGIsMHgxZSwweGI3LDB4MDcsMHgwOSwweGRiLDB4NzQsMHgwNSwweDgwLDB4ZWUsMHgwMiwweDAxLDB4ZGEsMHg4OSwweDE2LDB4YmIsCi0weDA3LDB4ODksMHgwZSwweGJkLDB4MDcsMHhiOCwweDAwLDB4NDIsMHg4YiwweDFlLDB4MDYsMHgwNiwweGNkLDB4MjEsMHhiOSwweGE4LAotMHgwMCwweGJhLDB4YmYsMHgwNywweGI0LDB4M2YsMHhjZCwweDIxLDB4M2QsMHhhOCwweDAwLDB4NzUsMHgwNiwweDgxLDB4M2UsMHhiZiwKLTB4MDcsMHg0YywweDAxLDB4MGYsMHg4NSwweDVlLDB4MDIsMHg2NiwweGExLDB4ZTMsMHgwNywweDY2LDB4YTMsMHgxMCwweDA2LDB4NjYsCi0weDhiLDB4MGUsMHhiYiwweDA3LDB4NjYsMHhhMSwweDAzLDB4MDgsMHg2NiwweDAxLDB4YzgsMHg2NiwweGEzLDB4MDgsMHgwNiwweDY2LAotMHhhMSwweDJiLDB4MDgsMHg2NiwweDAxLDB4YzgsMHg2NiwweGEzLDB4MGMsMHgwNiwweDY2LDB4OGIsMHgxZSwweDRiLDB4MDgsMHg2NiwKLTB4YTEsMHg0ZiwweDA4LDB4NjYsMHgwMSwweGMzLDB4NjYsMHhiOCwweDAxLDB4MDAsMHgwMSwweDAwLDB4NjYsMHgzOSwweGMzLDB4NzMsCi0weDAzLDB4NjYsMHg4OSwweGMzLDB4NjYsMHg4MSwweGMzLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgzMSwweGRiLDB4NjYsMHg4OSwweDFlLAotMHgxYywweDAwLDB4ZTgsMHhlOCwweDAyLDB4OGIsMHgxZSwweDA0LDB4MDYsMHgwOSwweGRiLDB4NzQsMHgwYSwweGI0LDB4NDgsMHhjZCwKLTB4MjEsMHgwZiwweDgyLDB4MTAsMHgwMiwweDhlLDB4YzAsMHhlOCwweGZiLDB4MDIsMHhiOCwweDAxLDB4MDAsMHhmZiwweDFlLDB4MDAsCi0weDA2LDB4MGYsMHg4MiwweDA4LDB4MDIsMHg4YywweDA2LDB4MjYsMHgwMCwweDhjLDB4MGUsMHgyOCwweDAwLDB4OGMsMHhkOCwweGEzLAotMHgyMiwweDAwLDB4OGUsMHhjMCwweDMxLDB4YzAsMHhiOSwweDAxLDB4MDAsMHhjZCwweDMxLDB4NzIsMHgwNywweGEzLDB4MTQsMHgwNiwKLTB4MzEsMHhjMCwweGNkLDB4MzEsMHgwZiwweDgyLDB4ZWEsMHgwMSwweGEzLDB4MTYsMHgwNiwweDY2LDB4OGIsMHgwZSwweDFjLDB4MDAsCi0weGI4LDB4MDEsMHgwNSwweDhiLDB4MWUsMHgxZSwweDAwLDB4Y2QsMHgzMSwweDBmLDB4ODIsMHhkYSwweDAxLDB4ODksMHgxZSwweDFhLAotMHgwNiwweDg5LDB4MGUsMHgxOCwweDA2LDB4ODksMHgzNiwweDFhLDB4MDAsMHg4OSwweDNlLDB4MTgsMHgwMCwweGI4LDB4MDcsMHgwMCwKLTB4OGIsMHgxZSwweDE0LDB4MDYsMHg4YiwweDBlLDB4MWEsMHgwNiwweDhiLDB4MTYsMHgxOCwweDA2LDB4Y2QsMHgzMSwweGI4LDB4MDksCi0weDAwLDB4OGMsMHhjOSwweDgxLDB4ZTEsMHgwMywweDAwLDB4YzEsMHhlMSwweDA1LDB4NTEsMHg4MSwweGM5LDB4OWIsMHhjMCwweGNkLAotMHgzMSwweGI4LDB4MDgsMHgwMCwweDhiLDB4MGUsMHgxZSwweDAwLDB4NDksMHhiYSwweGZmLDB4ZmYsMHhjZCwweDMxLDB4YjgsMHgwNywKLTB4MDAsMHg4YiwweDFlLDB4MTYsMHgwNiwweDhiLDB4MGUsMHgxYSwweDA2LDB4OGIsMHgxNiwweDE4LDB4MDYsMHhjZCwweDMxLDB4YjgsCi0weDA5LDB4MDAsMHg1OSwweDgxLDB4YzksMHg5MywweGMwLDB4Y2QsMHgzMSwweGI4LDB4MDgsMHgwMCwweDhiLDB4MGUsMHgxZSwweDAwLAotMHg0OSwweGJhLDB4ZmYsMHhmZiwweGNkLDB4MzEsMHhiOCwweDAwLDB4MDEsMHhiYiwweDAwLDB4MGYsMHhjZCwweDMxLDB4NzMsMHgxMCwKLTB4M2QsMHgwOCwweDAwLDB4MGYsMHg4NSwweDY1LDB4MDEsMHhiOCwweDAwLDB4MDEsMHhjZCwweDMxLDB4MGYsMHg4MiwweDVjLDB4MDEsCi0weGEzLDB4MWMsMHgwNiwweDg5LDB4MTYsMHgxZSwweDA2LDB4YzEsMHhlMywweDA0LDB4ODksMHgxZSwweDIwLDB4MDYsMHg2NiwweDhiLAotMHgzNiwweDA4LDB4MDYsMHg2NiwweDhiLDB4M2UsMHhmYiwweDA3LDB4NjYsMHg4YiwweDBlLDB4ZmYsMHgwNywweGU4LDB4NDksMHgwMCwKLTB4NjYsMHg4YiwweDM2LDB4MGMsMHgwNiwweDY2LDB4OGIsMHgzZSwweDIzLDB4MDgsMHg2NiwweDhiLDB4MGUsMHgyNywweDA4LDB4ZTgsCi0weDM3LDB4MDAsMHg4ZSwweDA2LDB4MTYsMHgwNiwweDY2LDB4OGIsMHgzZSwweDRiLDB4MDgsMHg2NiwweDhiLDB4MGUsMHg0ZiwweDA4LAotMHg2NiwweDMxLDB4YzAsMHg2NiwweGMxLDB4ZTksMHgwMiwweDY3LDB4ZjMsMHg2NiwweGFiLDB4YjQsMHgzZSwweDhiLDB4MWUsMHgwNiwKLTB4MDYsMHhjZCwweDIxLDB4YjgsMHgwMSwweDAxLDB4OGIsMHgxNiwweDFlLDB4MDYsMHhjZCwweDMxLDB4MWUsMHgwZiwweGExLDB4OGUsCi0weDFlLDB4MTYsMHgwNiwweDY2LDB4NjQsMHhmZiwweDJlLDB4MTAsMHgwNiwweDY2LDB4ODksMHhmMCwweDY2LDB4MjUsMHhmZiwweDAxLAotMHgwMCwweDAwLDB4NjYsMHgwMSwweGMxLDB4MjksMHhjNiwweDY2LDB4MjksMHhjNywweDY2LDB4ODksMHgwZSwweDI2LDB4MDYsMHg2NiwKLTB4ODksMHgzZSwweDIyLDB4MDYsMHhlOCwweGZlLDB4MDAsMHg4OSwweDM2LDB4M2UsMHgwNiwweDY2LDB4YzEsMHhlZSwweDEwLDB4ODksCi0weDM2LDB4NDIsMHgwNiwweDhiLDB4MWUsMHgwNiwweDA2LDB4ODksMHgxZSwweDNhLDB4MDYsMHhjNywweDA2LDB4NDYsMHgwNiwweDAwLAotMHg0MiwweGU4LDB4ZjIsMHgwMCwweGExLDB4MWMsMHgwNiwweGEzLDB4NGUsMHgwNiwweGM3LDB4MDYsMHgzZSwweDA2LDB4MDAsMHgwMCwKLTB4YzYsMHgwNiwweDQ3LDB4MDYsMHgzZiwweGExLDB4MjgsMHgwNiwweDA5LDB4YzAsMHg3NSwweDA5LDB4YTEsMHgyNiwweDA2LDB4M2IsCi0weDA2LDB4MjAsMHgwNiwweDc2LDB4MDMsMHhhMSwweDIwLDB4MDYsMHhhMywweDQyLDB4MDYsMHhlOCwweGM4LDB4MDAsMHg2NiwweDMxLAotMHhjOSwweDhiLDB4MGUsMHg0NiwweDA2LDB4NjYsMHg4YiwweDNlLDB4MjIsMHgwNiwweDY2LDB4MDEsMHgwZSwweDIyLDB4MDYsMHg2NiwKLTB4MjksMHgwZSwweDI2LDB4MDYsMHg2NiwweDMxLDB4ZjYsMHhjMSwweGU5LDB4MDIsMHgxZSwweDA2LDB4OGUsMHgwNiwweDE2LDB4MDYsCi0weDhlLDB4MWUsMHgxZSwweDA2LDB4NjcsMHhmMywweDY2LDB4YTUsMHgwNywweDFmLDB4NjYsMHgwMywweDBlLDB4MjYsMHgwNiwweDc1LAotMHhhZiwweGMzLDB4M2MsMHgzYSwweDc0LDB4MDYsMHgzYywweDJmLDB4NzQsMHgwMiwweDNjLDB4NWMsMHhjMywweGJlLDB4NjQsMHgwNywKLTB4ODksMHhmMywweDI2LDB4OGEsMHgwNSwweDQ3LDB4ODgsMHgwNCwweDM4LDB4ZTAsMHg3NCwweDBlLDB4MDgsMHhjMCwweDc0LDB4MGEsCi0weDQ2LDB4ZTgsMHhkZSwweGZmLDB4NzUsMHhlYywweDg5LDB4ZjMsMHg3NCwweGU4LDB4YzMsMHhiYSwweDI2LDB4MDUsMHhlYiwweDA4LAotMHhiYSwweDM0LDB4MDUsMHhlYiwweDAzLDB4YmEsMHgzZSwweDA1LDB4NTIsMHg4YiwweDFlLDB4NjIsMHgwNywweGM2LDB4MDcsMHgyNCwKLTB4YmIsMHg2NCwweDA3LDB4ZWIsMHgxZSwweGU4LDB4ZWQsMHgwMCwweGJhLDB4NzgsMHgwNSwweGViLDB4MTIsMHhiYSwweDkxLDB4MDUsCi0weGViLDB4MGQsMHhiYSwweGEzLDB4MDUsMHhlYiwweDA4LDB4YmEsMHhiNSwweDA1LDB4ZWIsMHgwMywweGJhLDB4NzgsMHgwNSwweDUyLAotMHhiYiwweDE5LDB4MDUsMHhlOCwweDE0LDB4MDAsMHg1YiwweGU4LDB4MTAsMHgwMCwweGJiLDB4NDIsMHgwNCwweGU4LDB4MGEsMHgwMCwKLTB4YjgsMHhmZiwweDRjLDB4Y2QsMHgyMSwweDQzLDB4YjQsMHgwMiwweGNkLDB4MjEsMHg4YSwweDE3LDB4ODAsMHhmYSwweDI0LDB4NzUsCi0weGY0LDB4YzMsMHgwZCwweDBhLDB4MjQsMHg1MCwweDUxLDB4NTcsMHgzMSwweGMwLDB4YmYsMHgyYSwweDA2LDB4YjksMHgxOSwweDAwLAotMHhmMywweGFiLDB4NWYsMHg1OSwweDU4LDB4YzMsMHhiOCwweDAwLDB4MDMsMHhiYiwweDIxLDB4MDAsMHgzMSwweGM5LDB4NjYsMHhiZiwKLTB4MmEsMHgwNiwweDAwLDB4MDAsMHhjZCwweDMxLDB4YzMsMHgwMCwweDAwLDB4MzAsMHhlNCwweGU4LDB4NWYsMHhmZiwweDg5LDB4ZGUsCi0weDhiLDB4M2UsMHg2NywweDA0LDB4ZWIsMHgxOCwweGI0LDB4M2IsMHhlOCwweDUyLDB4ZmYsMHg4MSwweGZlLDB4NjQsMHgwNywweDc0LAotMHgxMywweDhhLDB4ODQsMHhmZiwweGZmLDB4ZTgsMHgzYSwweGZmLDB4NzQsMHgwNCwweGM2LDB4MDQsMHg1YywweDQ2LDB4ZTgsMHgwMywKLTB4MDAsMHg3MiwweGUzLDB4YzMsMHhlOCwweDM2LDB4MDAsMHhiYiwweDQ0LDB4MDAsMHg4YSwweDA3LDB4ODgsMHgwNCwweDQzLDB4NDYsCi0weDA4LDB4YzAsMHg3NSwweGY2LDB4MDYsMHg1NywweDFlLDB4MDcsMHhlOCwweDlhLDB4ZmYsMHhiYiwweDJhLDB4MDYsMHg4YywweDlmLAotMHgwNCwweDAwLDB4ODksMHg5ZiwweDAyLDB4MDAsMHhiYSwweDY0LDB4MDcsMHhiOCwweDAwLDB4NGIsMHhjZCwweDIxLDB4NWYsMHgwNywKLTB4NzIsMHgwOSwweGI0LDB4NGQsMHhjZCwweDIxLDB4MmQsMHgwMCwweDAzLDB4ZjcsMHhkOCwweGViLDB4MjgsMHg4MCwweDNlLDB4NjksCi0weDA4LDB4MDUsMHg3MiwweDIwLDB4YjgsMHgwMCwweDU4LDB4Y2QsMHgyMSwweGEyLDB4NjcsMHgwOCwweGI4LDB4MDIsMHg1OCwweGNkLAotMHgyMSwweGEyLDB4NjgsMHgwOCwweGI4LDB4MDEsMHg1OCwweGJiLDB4ODAsMHgwMCwweGNkLDB4MjEsMHhiOCwweDAzLDB4NTgsMHhiYiwKLTB4MDEsMHgwMCwweGNkLDB4MjEsMHhjMywweDljLDB4ODAsMHgzZSwweDY5LDB4MDgsMHgwNSwweDcyLDB4MWEsMHg1MCwweDUzLDB4YjgsCi0weDAzLDB4NTgsMHg4YSwweDFlLDB4NjgsMHgwOCwweDMwLDB4ZmYsMHhjZCwweDIxLDB4YjgsMHgwMSwweDU4LDB4OGEsMHgxZSwweDY3LAotMHgwOCwweDMwLDB4ZmYsMHhjZCwweDIxLDB4NWIsMHg1OCwweDlkLDB4YzMsMHg0YywweDZmLDB4NjEsMHg2NCwweDIwLDB4NjUsMHg3MiwKLTB4NzIsMHg2ZiwweDcyLDB4M2EsMHgyMCwweDI0LDB4M2EsMHgyMCwweDYzLDB4NjEsMHg2ZSwweDZlLDB4NmYsMHg3NCwweDIwLDB4NmYsCi0weDcwLDB4NjUsMHg2ZSwweDI0LDB4M2EsMHgyMCwweDZlLDB4NmYsMHg3NCwweDIwLDB4NDUsMHg1OCwweDQ1LDB4MjQsMHgzYSwweDIwLAotMHg2ZSwweDZmLDB4NzQsMHgyMCwweDQzLDB4NGYsMHg0NiwweDQ2LDB4MjAsMHgyOCwweDQzLDB4NjgsMHg2NSwweDYzLDB4NmIsMHgyMCwKLTB4NjYsMHg2ZiwweDcyLDB4MjAsMHg3NiwweDY5LDB4NzIsMHg3NSwweDczLDB4NjUsMHg3MywweDI5LDB4MjQsMHg2ZSwweDZmLDB4MjAsCi0weDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHgyZCwweDIwLDB4NDcsMHg2NSwweDc0LDB4MjAsMHg2MywweDczLDB4NjQsMHg3MCwweDZkLAotMHg2OSwweDJhLDB4NjIsMHgyZSwweDdhLDB4NjksMHg3MCwweDI0LDB4NmUsMHg2ZiwweDIwLDB4NDQsMHg0ZiwweDUzLDB4MjAsMHg2ZCwKLTB4NjUsMHg2ZCwweDZmLDB4NzIsMHg3OSwweDI0LDB4NmUsMHg2NSwweDY1LDB4NjQsMHgyMCwweDQ0LDB4NGYsMHg1MywweDIwLDB4MzMsCi0weDI0LDB4NjMsMHg2MSwweDZlLDB4MjcsMHg3NCwweDIwLDB4NzMsMHg3NywweDY5LDB4NzQsMHg2MywweDY4LDB4MjAsMHg2ZCwweDZmLAotMHg2NCwweDY1LDB4MjQsMHg2ZSwweDZmLDB4MjAsMHg0NCwweDUwLDB4NGQsMHg0OSwweDIwLDB4NzMsMHg2NSwweDZjLDB4NjUsMHg2MywKLTB4NzQsMHg2ZiwweDcyLDB4NzMsMHgyNCwweDZlLDB4NmYsMHgyMCwweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHg2ZCwweDY1LDB4NmQsCi0weDZmLDB4NzIsMHg3OSwweDI0LDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAotMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKLTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCi0weDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9iZmQvaGFzaC5jIGIvYmZkL2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczZWFmNy4uMDAwMDAwMAotLS0gYS9iZmQvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLS8qIGhhc2guYyAtLSBoYXNoIHRhYmxlIHJvdXRpbmVzIGZvciBCRkQKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJvYmphbGxvYy5oIgotCi0vKgotU0VDVElPTgotCUhhc2ggVGFibGVzCi0KLUBjaW5kZXggSGFzaCB0YWJsZXMKLQlCRkQgcHJvdmlkZXMgYSBzaW1wbGUgc2V0IG9mIGhhc2ggdGFibGUgZnVuY3Rpb25zLiAgUm91dGluZXMKLQlhcmUgcHJvdmlkZWQgdG8gaW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUsIHRvIGZyZWUgYSBoYXNoIHRhYmxlLAotCXRvIGxvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlIGFuZCBvcHRpb25hbGx5IGNyZWF0ZSBhbgotCWVudHJ5IGZvciBpdCwgYW5kIHRvIHRyYXZlcnNlIGEgaGFzaCB0YWJsZS4gIFRoZXJlIGlzCi0JY3VycmVudGx5IG5vIHJvdXRpbmUgdG8gZGVsZXRlIGFuIHN0cmluZyBmcm9tIGEgaGFzaCB0YWJsZS4KLQotCVRoZSBiYXNpYyBoYXNoIHRhYmxlIGRvZXMgbm90IHBlcm1pdCBhbnkgZGF0YSB0byBiZSBzdG9yZWQKLQl3aXRoIGEgc3RyaW5nLiAgSG93ZXZlciwgYSBoYXNoIHRhYmxlIGlzIGRlc2lnbmVkIHRvIHByZXNlbnQgYQotCWJhc2UgY2xhc3MgZnJvbSB3aGljaCBvdGhlciB0eXBlcyBvZiBoYXNoIHRhYmxlcyBtYXkgYmUKLQlkZXJpdmVkLiAgVGhlc2UgZGVyaXZlZCB0eXBlcyBtYXkgc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotCXdpdGggdGhlIHN0cmluZy4gIEhhc2ggdGFibGVzIHdlcmUgaW1wbGVtZW50ZWQgaW4gdGhpcyB3YXksCi0JcmF0aGVyIHRoYW4gc2ltcGx5IHByb3ZpZGluZyBhIGRhdGEgcG9pbnRlciBpbiBhIGhhc2ggdGFibGUKLQllbnRyeSwgYmVjYXVzZSB0aGV5IHdlcmUgZGVzaWduZWQgZm9yIHVzZSBieSB0aGUgbGlua2VyIGJhY2sKLQllbmRzLiAgVGhlIGxpbmtlciBtYXkgY3JlYXRlIHRob3VzYW5kcyBvZiBoYXNoIHRhYmxlIGVudHJpZXMsCi0JYW5kIHRoZSBvdmVyaGVhZCBvZiBhbGxvY2F0aW5nIHByaXZhdGUgZGF0YSBhbmQgc3RvcmluZyBhbmQKLQlmb2xsb3dpbmcgcG9pbnRlcnMgYmVjb21lcyBub3RpY2VhYmxlLgotCi0JVGhlIGJhc2ljIGhhc2ggdGFibGUgY29kZSBpcyBpbiA8PGhhc2guYz4+LgotCi1AbWVudQotQCogQ3JlYXRpbmcgYW5kIEZyZWVpbmcgYSBIYXNoIFRhYmxlOjoKLUAqIExvb2tpbmcgVXAgb3IgRW50ZXJpbmcgYSBTdHJpbmc6OgotQCogVHJhdmVyc2luZyBhIEhhc2ggVGFibGU6OgotQCogRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlOjoKLUBlbmQgbWVudQotCi1JTk9ERQotQ3JlYXRpbmcgYW5kIEZyZWVpbmcgYSBIYXNoIFRhYmxlLCBMb29raW5nIFVwIG9yIEVudGVyaW5nIGEgU3RyaW5nLCBIYXNoIFRhYmxlcywgSGFzaCBUYWJsZXMKLVNVQlNFQ1RJT04KLQlDcmVhdGluZyBhbmQgZnJlZWluZyBhIGhhc2ggdGFibGUKLQotQGZpbmRleCBiZmRfaGFzaF90YWJsZV9pbml0Ci1AZmluZGV4IGJmZF9oYXNoX3RhYmxlX2luaXRfbgotCVRvIGNyZWF0ZSBhIGhhc2ggdGFibGUsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIDw8c3RydWN0Ci0JYmZkX2hhc2hfdGFibGU+PiAoZGVmaW5lZCBpbiA8PGJmZC5oPj4pIGFuZCBjYWxsCi0JPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gKGlmIHlvdSBrbm93IGFwcHJveGltYXRlbHkgaG93IG1hbnkKLQllbnRyaWVzIHlvdSB3aWxsIG5lZWQsIHRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX3RhYmxlX2luaXRfbj4+LAotCXdoaWNoIHRha2VzIGEgQHZhcntzaXplfSBhcmd1bWVudCwgbWF5IGJlIHVzZWQpLgotCTw8YmZkX2hhc2hfdGFibGVfaW5pdD4+IHJldHVybnMgPDxmYWxzZT4+IGlmIHNvbWUgc29ydCBvZgotCWVycm9yIG9jY3Vycy4KLQotQGZpbmRleCBiZmRfaGFzaF9uZXdmdW5jCi0JVGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfdGFibGVfaW5pdD4+IHRha2UgYXMgYW4gYXJndW1lbnQgYQotCWZ1bmN0aW9uIHRvIHVzZSB0byBjcmVhdGUgbmV3IGVudHJpZXMuICBGb3IgYSBiYXNpYyBoYXNoCi0JdGFibGUsIHVzZSB0aGUgZnVuY3Rpb24gPDxiZmRfaGFzaF9uZXdmdW5jPj4uICBAeHJlZntEZXJpdmluZwotCWEgTmV3IEhhc2ggVGFibGUgVHlwZX0sIGZvciB3aHkgeW91IHdvdWxkIHdhbnQgdG8gdXNlIGEKLQlkaWZmZXJlbnQgdmFsdWUgZm9yIHRoaXMgYXJndW1lbnQuCi0KLUBmaW5kZXggYmZkX2hhc2hfYWxsb2NhdGUKLQk8PGJmZF9oYXNoX3RhYmxlX2luaXQ+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+aGFzaCA9IGhhc2g7Ci0gIGhhc2hwLT5uZXh0ID0gdGFibGUtPnRhYmxlW2luZGV4XTsKLSAgdGFibGUtPnRhYmxlW2luZGV4XSA9IGhhc2hwOwotCi0gIHJldHVybiBoYXNocDsKLX0KLQotLyogUmVwbGFjZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1iZmRfaGFzaF9yZXBsYWNlICh0YWJsZSwgb2xkLCBudykKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpvbGQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbnc7Ci17Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqcHBoOwotCi0gIGluZGV4ID0gb2xkLT5oYXNoICUgdGFibGUtPnNpemU7Ci0gIGZvciAocHBoID0gJnRhYmxlLT50YWJsZVtpbmRleF07Ci0gICAgICAgKCpwcGgpICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKLSAgICAgICBwcGggPSAmKCpwcGgpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgqcHBoID09IG9sZCkKLQl7Ci0JICAqcHBoID0gbnc7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBhYm9ydCAoKTsKLX0KLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbmV3IGhhc2ggdGFibGUgZW50cnkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1iZmRfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChlbnRyeSA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgZW50cnkgPSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKQotCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSkpKTsKLSAgcmV0dXJuIGVudHJ5OwotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBpbiBhIGhhc2ggdGFibGUuICAqLwotCi1QVFIKLWJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIFBUUiByZXQ7Ci0KLSAgcmV0ID0gb2JqYWxsb2NfYWxsb2MgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgdGFibGUtPm1lbW9yeSwgc2l6ZSk7Ci0gIGlmIChyZXQgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWJmZF9oYXNoX3RyYXZlcnNlICh0YWJsZSwgZnVuYywgaW5mbykKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYm9vbGVhbiAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLSAgICAgUFRSIGluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+c2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqcDsKLQotICAgICAgZm9yIChwID0gdGFibGUtPnRhYmxlW2ldOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmICghICgqZnVuYykgKHAsIGluZm8pKQotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQwKLS8qIEEgZmV3IGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIChhLm91dCwgQ09GRiwgRUxGKSB1c2UgYSBzdHJpbmcKLSAgIHRhYmxlLiAgVGhlc2UgZnVuY3Rpb25zIHN1cHBvcnQgYWRkaW5nIHN0cmluZ3MgdG8gYSBzdHJpbmcgdGFibGUsCi0gICByZXR1cm5pbmcgdGhlIGJ5dGUgb2Zmc2V0LCBhbmQgd3JpdGluZyBvdXQgdGhlIHRhYmxlLgotCi0gICBQb3NzaWJsZSBpbXByb3ZlbWVudHM6Ci0gICArIGxvb2sgZm9yIHN0cmluZ3MgbWF0Y2hpbmcgdHJhaWxpbmcgc3Vic3RyaW5ncyBvZiBvdGhlciBzdHJpbmdzCi0gICArIGJldHRlciBkYXRhIHN0cnVjdHVyZXM/ICBiYWxhbmNlZCB0cmVlcz8KLSAgICsgbG9vayBhdCByZWR1Y2luZyBtZW1vcnkgdXNlIGVsc2V3aGVyZSAtLSBtYXliZSBpZiB3ZSBkaWRuJ3QgaGF2ZQotICAgICB0byBjb25zdHJ1Y3QgdGhlIGVudGlyZSBzeW1ib2wgdGFibGUgYXQgb25jZSwgd2UgY291bGQgZ2V0IGJ5Ci0gICAgIHdpdGggc21hbGxlciBhbW91bnRzIG9mIFZNPyAgKFdoYXQgZWZmZWN0IGRvZXMgdGhhdCBoYXZlIG9uIHRoZQotICAgICBzdHJpbmcgdGFibGUgcmVkdWN0aW9ucz8pICAqLwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgc3RydGFiIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEluZGV4IGluIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgaW5kZXg7Ci0gIC8qIE5leHQgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqbmV4dDsKLX07Ci0KLS8qIFRoZSBzdHJ0YWIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2gKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotICAvKiBTaXplIG9mIHN0cnRhYi0tYWxzbyBuZXh0IGF2YWlsYWJsZSBpbmRleC4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogRmlyc3Qgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqZmlyc3Q7Ci0gIC8qIExhc3Qgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqbGFzdDsKLSAgLyogV2hldGhlciB0byBwcmVjZWRlIHN0cmluZ3Mgd2l0aCBhIHR3byBieXRlIGxlbmd0aCwgYXMgaW4gdGhlCi0gICAgIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgYm9vbGVhbiB4Y29mZjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0cnRhYl9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYSBzdHJ0YWIuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0cnRhYl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmRleCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBzdHJ0YWIuICAqLwotCi0jZGVmaW5lIHN0cnRhYl9oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIENyZWF0ZSBhIG5ldyBzdHJ0YWIuICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfc3RyaW5ndGFiX2luaXQgKCkKLXsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFibGU7Ci0KLSAgdGFibGUgPSAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikKLQkgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfc3RydGFiX2hhc2gpKSk7Ci0gIGlmICh0YWJsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIHN0cnRhYl9oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHRhYmxlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB0YWJsZS0+c2l6ZSA9IDA7Ci0gIHRhYmxlLT5maXJzdCA9IE5VTEw7Ci0gIHRhYmxlLT5sYXN0ID0gTlVMTDsKLSAgdGFibGUtPnhjb2ZmID0gZmFsc2U7Ci0KLSAgcmV0dXJuIHRhYmxlOwotfQotCi0vKiBDcmVhdGUgYSBuZXcgc3RydGFiIGluIHdoaWNoIHRoZSBzdHJpbmdzIGFyZSBvdXRwdXQgaW4gdGhlIGZvcm1hdAotICAgdXNlZCBpbiB0aGUgWENPRkYgLmRlYnVnIHNlY3Rpb246IGEgdHdvIGJ5dGUgbGVuZ3RoIHByZWNlZGVzIGVhY2gKLSAgIHN0cmluZy4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKgotX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCAoKQotewotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpyZXQ7Ci0KLSAgcmV0ID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHJldC0+eGNvZmYgPSB0cnVlOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBGcmVlIGEgc3RydGFiLiAgKi8KLQotdm9pZAotX2JmZF9zdHJpbmd0YWJfZnJlZSAodGFibGUpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYmxlOwotewotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmdGFibGUtPnRhYmxlKTsKLSAgZnJlZSAodGFibGUpOwotfQotCi0vKiBHZXQgdGhlIGluZGV4IG9mIGEgc3RyaW5nIGluIGEgc3RydGFiLCBhZGRpbmcgaXQgaWYgaXQgaXMgbm90Ci0gICBhbHJlYWR5IHByZXNlbnQuICBJZiBIQVNIIGlzIGZhbHNlLCB3ZSBkb24ndCByZWFsbHkgdXNlIHRoZSBoYXNoCi0gICB0YWJsZSwgYW5kIHdlIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGUgc3RyaW5ncy4gICovCi0KLWJmZF9zaXplX3R5cGUKLV9iZmRfc3RyaW5ndGFiX2FkZCAodGFiLCBzdHIsIGhhc2gsIGNvcHkpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBib29sZWFuIGhhc2g7Ci0gICAgIGJvb2xlYW4gY29weTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICplbnRyeTsKLQotICBpZiAoaGFzaCkKLSAgICB7Ci0gICAgICBlbnRyeSA9IHN0cnRhYl9oYXNoX2xvb2t1cCAodGFiLCBzdHIsIHRydWUsIGNvcHkpOwotICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbnRyeSA9ICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopCi0JICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmdGFiLT50YWJsZSwKLQkJCQkgIHNpemVvZiAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5KSkpOwotICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICAgIGlmICghIGNvcHkpCi0JZW50cnktPnJvb3Quc3RyaW5nID0gc3RyOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKm47Ci0KLQkgIG4gPSAoY2hhciAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJnRhYi0+dGFibGUsIHN0cmxlbiAoc3RyKSArIDEpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLQkgIGVudHJ5LT5yb290LnN0cmluZyA9IG47Ci0JfQotICAgICAgZW50cnktPmluZGV4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgICAgZW50cnktPm5leHQgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZW50cnktPmluZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLSAgICB7Ci0gICAgICBlbnRyeS0+aW5kZXggPSB0YWItPnNpemU7Ci0gICAgICB0YWItPnNpemUgKz0gc3RybGVuIChzdHIpICsgMTsKLSAgICAgIGlmICh0YWItPnhjb2ZmKQotCXsKLQkgIGVudHJ5LT5pbmRleCArPSAyOwotCSAgdGFiLT5zaXplICs9IDI7Ci0JfQotICAgICAgaWYgKHRhYi0+Zmlyc3QgPT0gTlVMTCkKLQl0YWItPmZpcnN0ID0gZW50cnk7Ci0gICAgICBlbHNlCi0JdGFiLT5sYXN0LT5uZXh0ID0gZW50cnk7Ci0gICAgICB0YWItPmxhc3QgPSBlbnRyeTsKLSAgICB9Ci0KLSAgcmV0dXJuIGVudHJ5LT5pbmRleDsKLX0KLQotLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzdHJ0YWIuICAqLwotCi1iZmRfc2l6ZV90eXBlCi1fYmZkX3N0cmluZ3RhYl9zaXplICh0YWIpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLXsKLSAgcmV0dXJuIHRhYi0+c2l6ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RydGFiLiAgQUJGRCBtdXN0IGFscmVhZHkgYmUgYXQgdGhlIHJpZ2h0IGxvY2F0aW9uIGluCi0gICB0aGUgZmlsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIHRhYikKLSAgICAgcmVnaXN0ZXIgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci17Ci0gIHJlZ2lzdGVyIGJvb2xlYW4geGNvZmY7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0KLSAgeGNvZmYgPSB0YWItPnhjb2ZmOwotCi0gIGZvciAoZW50cnkgPSB0YWItPmZpcnN0OyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgIHJlZ2lzdGVyIHNpemVfdCBsZW47Ci0KLSAgICAgIHN0ciA9IGVudHJ5LT5yb290LnN0cmluZzsKLSAgICAgIGxlbiA9IHN0cmxlbiAoc3RyKSArIDE7Ci0KLSAgICAgIGlmICh4Y29mZikKLQl7Ci0JICBiZmRfYnl0ZSBidWZbMl07Ci0KLQkgIC8qIFRoZSBvdXRwdXQgbGVuZ3RoIGluY2x1ZGVzIHRoZSBudWxsIGJ5dGUuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgbGVuLCBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmLCAxLCAyLCBhYmZkKSAhPSAyKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzdHIsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvaG9zdC1hb3V0LmMgYi9iZmQvaG9zdC1hb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjQzZGMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3QtYW91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGxvY2FsIGhvc3QncyBhLm91dCBiaW5hcmllcwotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBQcm9iYWJseSBKb2huIEdpbG1vcmUncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUJQVJDSF9TSVpFCTMyCi0KLS8qIFdoZW4gcG9ydGluZyB0byBhIG5ldyBzeXN0ZW0sIHlvdSBtdXN0IHN1cHBseToKLQotCUhPU1RfUEFHRV9TSVpFCQkob3B0aW9uYWwpCi0JSE9TVF9TRUdNRU5UX1NJWkUJKG9wdGlvbmFsIC0tIGRlZmF1bHRzIHRvIHBhZ2Ugc2l6ZSkKLQlIT1NUX01BQ0hJTkVfQVJDSAkob3B0aW9uYWwpCi0JSE9TVF9NQUNISU5FX01BQ0hJTkUJKG9wdGlvbmFsKQotCUhPU1RfVEVYVF9TVEFSVF9BRERSCShvcHRpb25hbCkKLQlIT1NUX1NUQUNLX0VORF9BRERSCShub3QgdXNlZCwgZXhjZXB0IGJ5IHRyYWQtY29yZSA/Pz8pCi0JSE9TVF9CSUdfRU5ESUFOX1AJKHJlcXVpcmVkIC0tIGRlZmluZSBpZiBiaWctZW5kaWFuKQotCi0gICBpbiB0aGUgLi9ob3N0cy9oLXN5c3RlbW5hbWUuaCBmaWxlLiAgKi8KLQotI2lmZGVmIFRSQURfSEVBREVSCi0jaW5jbHVkZSBUUkFEX0hFQURFUgotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfUEFHRV9TSVpFCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJSE9TVF9QQUdFX1NJWkUKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1NFR01FTlRfU0laRQotI2RlZmluZQlTRUdNRU5UX1NJWkUJSE9TVF9TRUdNRU5UX1NJWkUKLSNlbHNlCi0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9URVhUX1NUQVJUX0FERFIKLSNkZWZpbmUJVEVYVF9TVEFSVF9BRERSCUhPU1RfVEVYVF9TVEFSVF9BRERSCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9TVEFDS19FTkRfQUREUgotI2RlZmluZQlTVEFDS19FTkRfQUREUglIT1NUX1NUQUNLX0VORF9BRERSCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9CSUdfRU5ESUFOX1AKLSNkZWZpbmUJVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2Vsc2UKLSN1bmRlZiAgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIEhPU1RfTUFDSElORV9BUkNICi0jaWZkZWYgSE9TVF9NQUNISU5FX01BQ0hJTkUKLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChhYmZkLCBleGVjcCkgXAotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKGFiZmQsIEhPU1RfTUFDSElORV9BUkNILCBIT1NUX01BQ0hJTkVfTUFDSElORSkKLSNlbHNlCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goYWJmZCwgZXhlY3ApIFwKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBIT1NUX01BQ0hJTkVfQVJDSCwgMCkKLSNlbmRpZgotI2VuZGlmIC8qIEhPU1RfTUFDSElORV9BUkNIICovCi0KLSNkZWZpbmUgTVkoT1ApIENBVChob3N0X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dCIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvYWxwaGFsaW51eC5oIGIvYmZkL2hvc3RzL2FscGhhbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliOGQ2OS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvYWxwaGFsaW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vKiBMaW51eCBkdW1wcyAic3RydWN0IHRhc2tfc3RydWN0IiBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlLWZpbGUuICBUaGlzCi0gICBzdHJ1Y3R1cmUgaXMgY3VycmVudGx5IDEwODAgYnl0ZXMgbG9uZywgYnV0IHdlIGFsbG93IHVwIHRvIDQwOTYKLSAgIGJ5dGVzIHRvIGFsbG93IGZvciBzb21lIGZ1dHVyZSBncm93dGguICAqLwotI2RlZmluZSBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECQk0MDk2Ci0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGFiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5zaWduYWwpCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvYWxwaGF2bXMuaCBiL2JmZC9ob3N0cy9hbHBoYXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWUzOTFhLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9hbHBoYXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogYWxwaGF2bXMuaCAtLSBCRkQgZGVmaW5pdGlvbnMgZm9yIGFuIG9wZW5WTVMgaG9zdAotICAgQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkKLSAgIG9mIHByb0dJUyBTb2Z0d2FyZWVudHdpY2tsdW5nLCBBYWNoZW4sIEdlcm1hbnkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2luY2x1ZGUgPHVuaXhpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotLyogTWFrZSB0aGUgYmFzaWMgdHlwZXMgNjQtYml0IHF1YW50aXRpZXMgb24gdGhlIGhvc3QuCi0gICBBbHNvIHByb3ZpZGUgdGhlIHN1cHBvcnQgbWFjcm9zIEJGRCBuZWVkcy4gICovCi0jIGlmZGVmIF9fR05VQ19fCi0jICBkZWZpbmUJQkZEX0hPU1RfNjRfQklUCWxvbmcgbG9uZwotIyBlbHNlCi0jICBkZWZpbmUJQkZEX0hPU1RfNjRfQklUCWxvbmcKLSMgZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUIHVpbnQ2NF90eXBlOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgaW50NjRfdHlwZTsKLQotIyBkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkgLyogQkZEX0hPU1RfNjRfQklUICovCi0jIGRlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotIyBkZWZpbmUgQllURVNfSU5fUFJJTlRGX0lOVCA0Ci0KLS8qIFRoZXNlIG11c3QgaGF2ZSB0eXBlIHVuc2lnbmVkIGxvbmcgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGFzCi0gICBhcmd1bWVudHMgaW4gcHJpbnRmIGZ1bmN0aW9ucy4gICovCi0jIGRlZmluZSB1aW50NjRfdHlwZUxPVyh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpICYgMHhmZmZmZmZmZikpKSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLSMgZGVmaW5lIHVpbnQ2NF90eXBlSElHSCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotI2VuZGlmIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotCi0jaW5jbHVkZSAiZm9wZW4tdm1zLmgiCi0KLSNkZWZpbmUgTk9fRkNOVEwgMQotCi0jaWZuZGVmIE9fQUNDTU9ERQotI2RlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZIHwgT19XUk9OTFkgfCBPX1JEV1IpCi0jZW5kaWYKLQotZXh0ZXJuIGludCBnZXRwYWdlc2l6ZSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oIGIvYmZkL2hvc3RzL2RlY3N0YXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwYzE0My4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogSG9wZWZ1bGx5IHRoaXMgc2hvdWxkIGluY2x1ZGUgZWl0aGVyIG1hY2hpbmUvcGFyYW0uaCAoVWx0cml4KSBvcgotICAgbWFjaGluZS9tYWNocGFyYW0uaCAoTWFjaCksIHdoaWNoZXZlciBpcyBpdHMgbmFtZSBvbiB0aGlzIHN5c3RlbS4gICovCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHIC0tIHdlIHVzZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQlVU1JURVhUCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCQlVU1JEQVRBCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCi0KLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVsdGE2OC5oIGIvYmZkL2hvc3RzL2RlbHRhNjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2YTZlNi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZGVsdGE2OC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGEgTW90b3JvbGEgRGVsdGEgMzMwMCBib3ggcnVubmluZyBTeXN0ZW0gViBSMy4wLgotICAgQ29udHJpYnV0ZWQgYnkgbWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGUuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIERlZmluaXRpb25zIHVzZWQgYnkgdHJhZC1jb3JlLmMuICAqLwotI2RlZmluZQlOQlBHCQkJTkJQQwotI2RlZmluZQlIT1NUX0RBVEFfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X2RhdG9yZwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X3R4dG9yZwotI2lmIDAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDQwMDAwMDAwCi0jZWxzZQotLyogVXNlcidzIHN0YWNrLCBjb3BpZWQgZnJvbSBzeXMvcGFyYW0uaCAgKi8KLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwotI2VuZGlmCi0jZGVmaW5lCVVQQUdFUwkJCVVTSVpFCi0jZGVmaW5lCVRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2Fib3J0CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZHB4Mi5oIGIvYmZkL2hvc3RzL2RweDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2Mzk1Zi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZHB4Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyB0aGF0IGFyZSBuZWVkZWQgZm9yIGNvcmUgZmlsZXMuICBDb3JlIHNlY3Rpb24gc2l6ZXMgZm9yCi0gICB0aGUgRFBYMiBhcmUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZGVmaW5lIE5CUEcgMQotI2RlZmluZSBVUEFHRVMgKFVTSVpFICogTkJQUCkKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgKHUudV9leGRhdGEudXhfZGF0b3JnKQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIChVU0VSU1RBQ0spCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaHAzMDBic2QuaCBiL2JmZC9ob3N0cy9ocDMwMGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI4NzE3Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9ocDMwMGJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEJTRDRfNAotI2RlZmluZSBOT19DT1JFX0NPTU1BTkQKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcJLyogRGF0YSBzZWcgc3RhcnQgYWRkciByb3VuZHMgdG8gTkJQRyAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9tNjhrCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCTB4ZmZmMDAwMDAKLSNkZWZpbmUJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2YnNkLmggYi9iZmQvaG9zdHMvaTM4NmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWVlM2Q4Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBJbnRlbCAzODYgcnVubmluZyBhbnkgQlNEIFVuaXggKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotLyogUmVjZW50IHZlcnNpb25zIG9mIEZyZWVCU0QgZG9uJ3QgZGVmaW5lIE5CUEcuICAqLwotI2lmbmRlZiBOQlBHCi0jaWZkZWYgUEFHRV9TSVpFCi0jZGVmaW5lIE5CUEcgUEFHRV9TSVpFCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLQotLyogSm9saXR6IHN1Z2dlc3RlZCBkZWZpbmluZyBIT1NUX1NUQUNLX0VORF9BRERSIHRvCi0gICAodS51X2twcm9jLmtwX2Vwcm9jLmVfdm0udm1fbWF4c2FkZHIgKyBNQVhTU0laKSwgd2hpY2ggc2hvdWxkIHdvcmsgb24KLSAgIGJvdGggQlNESSBhbmQgMzg2QlNELCBidXQgdGhhdCBpcyBiZWxpZXZlZCBub3QgdG8gd29yayBmb3IgQlNEIDQuNC4gICovCi0KLSNpZmRlZiBfX2JzZGlfXwotLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgcmlnaHQgdGhpbmcgZm9yIEJTREkuICAqLwotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQlVU1JTVEFDSwotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAoKGJmZF92bWEpdS51X2twcm9jLmtwX2Vwcm9jLmVfdm0udm1fZGFkZHIpCi0jZWxzZQotLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgcmlnaHQgdGhpbmcgZm9yIDM4NkJTRCByZWxlYXNlIDAuMS4gICovCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCShVU1JTVEFDSyAtIE1BWFNTSVopCi0jZW5kaWYKLQotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGNvcmVfYmZkKSBcCi0gICgoY29yZV9iZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X3NpZykKLSNkZWZpbmUgdV9jb21tIHVfa3Byb2Mua3BfcHJvYy5wX2NvbW0KZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2bGludXguaCBiL2JmZC9ob3N0cy9pMzg2bGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhNTFmMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NmxpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qIExpbnV4IHdyaXRlcyB0aGUgdGFzayBzdHJ1Y3R1cmUgYXQgdGhlIGVuZCBvZiB0aGUgY29yZSBmaWxlLiAgQ3VycmVudGx5IGl0Ci0gICBpcyAyOTEyIGJ5dGVzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIHNob3VsZCBiZSBhIHBpY2tpZXIgY2hlY2ssIGJ1dAotICAgd2Ugc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB0b28gcGlja3kgKHRoZSBzaXplIG9mIHRoZSB0YXNrIHN0cnVjdHVyZSBtaWdodAotICAgdmFyeSwgYW5kIGlmIGl0J3Mgbm90IHRoZSBsZW5ndGggd2UgZXhwZWN0IGl0IHRvIGJlLCBpdCBkb2Vzbid0IGFmZmVjdAotICAgb3VyIGFiaWxpdHkgdG8gcHJvY2VzcyB0aGUgY29yZSBmaWxlKS4gIFNvIGFsbG93IDAtNDA5NiBleHRyYSBieXRlcyBhdAotICAgdGhlIGVuZC4gICovCi0KLSNkZWZpbmUgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRCA0MDk2CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4Nm1hY2gzLmggYi9iZmQvaG9zdHMvaTM4Nm1hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzYxZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2kzODZtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi1GSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4NnNjby5oIGIvYmZkL2hvc3RzL2kzODZzY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NjA4Yy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NnNjby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogQ29yZSBmaWxlIHN0dWZmLiAgQXQgbGVhc3Qgc29tZSwgcGVyaGFwcyBhbGwsIG9mIHRoZSBmb2xsb3dpbmcKLSAgIGRlZmluZXMgd29yayBvbiBtYW55IG1vcmUgc3lzdGVtcyB0aGFuIGp1c3QgU0NPLiAgKi8KLQotI2RlZmluZSBOQlBHIE5CUEMKLSNkZWZpbmUgVVBBR0VTIFVTSVpFCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIHUudV9leGRhdGEudXhfZGF0b3JnCi0jZGVmaW5lIEhPU1RfU1RBQ0tfU1RBUlRfQUREUiB1LnVfc3ViCi0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGNvcmVfdXBhZ2UoYWJmZCktPnVfc3lzYWJvcnQgIT0gMCkgXAotICAgPyBjb3JlX3VwYWdlKGFiZmQpLT51X3N5c2Fib3J0IFwKLSAgIDogLTEpCi0KLS8qIEFjY29yZGluZyB0byB0aGUgbWFucGFnZSwgYSB2ZXJzaW9uIDIgU0NPIGNvcmVmaWxlIGNhbiBjb250YWluCi0gICB2YXJpb3VzIGFkZGl0aW9uYWwgc2VjdGlvbnMgKGl0IGlzIGNsZXZlcmx5IGFycmFuZ2VkIHNvIHRoZSB1IGFyZWEsCi0gICBkYXRhLCBhbmQgc3RhY2sgYXJlIGZpcnN0IHdoZXJlIHdlIGNhbiBmaW5kIHRoZW0pLiAgU28gd2l0aG91dAotICAgd3JpdGluZyBsb3RzIG9mIGNvZGUgdG8gcGFyc2UgYWxsIHRoZWlyIGhlYWRlcnMgYW5kIHN0dWZmLCB3ZSBjYW4ndAotICAga25vdyB3aGV0aGVyIGEgY29yZWZpbGUgaXMgYmlnZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLiAgKi8KLQotI2RlZmluZSBUUkFEX0NPUkVfQUxMT1dfQU5ZX0VYVFJBX1NJWkUgMQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2k4NjBtYWNoMy5oIGIvYmZkL2hvc3RzL2k4NjBtYWNoMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQyYWExLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pODYwbWFjaDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSB3YXMgaGFja2VkIGZyb20gaTM4Nm1hY2gzLmggICBbZG9sYW5Ac3NkLmludGVsLmNvbV0gKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi1GSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2k4NjAKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbTY4a2F1eC5oIGIvYmZkL2hvc3RzL202OGthdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzNzc1NS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTY4a2F1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGFuIEFwcGxlIE1hY2ludG9zaCBydW5uaW5nIEEvVVggMy54LiAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhZ2UuaD4KLQotLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0cmFkLWNvcmUuYy4gICovCi0jZGVmaW5lCU5CUEcJCQlOQlBQCi0KLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF9kYXRvcmcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF90eHRvcmcKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDEwMDAwMDAwMAotCi0jZGVmaW5lCVVQQUdFUwkJCVVTSVpFCi0KLSNkZWZpbmUJVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gIChhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tNjhrbGludXguaCBiL2JmZC9ob3N0cy9tNjhrbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2N2RmYS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTY4a2xpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qIExpbnV4IGR1bXBzICJzdHJ1Y3QgdGFza19zdHJ1Y3QiIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUtZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjdXJyZW50bHkgMjUxMiBieXRlcyBsb25nLCBidXQgd2UgYWxsb3cgdXAgdG8gNDA5NgotICAgYnl0ZXMgdG8gYWxsb3cgZm9yIHNvbWUgZnV0dXJlIGdyb3d0aC4gICovCi0jZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQJCTQwOTYKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gICgoYWJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnNpZ25hbCkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tODhrbWFjaDMuaCBiL2JmZC9ob3N0cy9tODhrbWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxNTUzOC4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTg4a21hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSN1bmRlZiBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDMKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX204OGsKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc2JzZC5oIGIvYmZkL2hvc3RzL21pcHNic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYWQyMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbWlwc2JzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSN1bmRlZiBBTElHTgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0vKiAjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcgLS0gd2UgdXNlIEhPU1RfREFUQV9TVEFSVF9BRERSICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX21pcHMKLS8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJVVNSU1RBQ0sKLSNkZWZpbmUgTk9fQ09SRV9DT01NQU5ECmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc21hY2gzLmggYi9iZmQvaG9zdHMvbWlwc21hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzQ2OGQuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL21pcHNtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvbWFjaHBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLS8qICNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRyAgKi8KLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbWlwcwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCVVTUkRBVEEKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL25ld3MtbWlwcy5oIGIvYmZkL2hvc3RzL25ld3MtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc5OWJlLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9uZXdzLW1pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIFNvbnkgTmV3cyBydW5uaW5nIE5ld3NPUyAzLjIuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0KLSNkZWZpbmUgSE9TVF9QQUdFX1NJWkUgTkJQRwotCi0jZGVmaW5lIEhPU1RfTUFDSElORV9BUkNIIGJmZF9hcmNoX21pcHMKLQotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiBVU1JURVhUCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIFVTUkRBVEEKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiBVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL25ld3MuaCBiL2JmZC9ob3N0cy9uZXdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzk0NmMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL25ld3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyogU29ueSBOZXdzIHJ1bm5pbmcgTmV3c09TIDMuMi4gICovCi0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBIT1NUX1BBR0VfU0laRSBOQlBHCi0jZGVmaW5lIEhPU1RfU0VHTUVOVF9TSVpFIE5CUEcKLSNkZWZpbmUgSE9TVF9NQUNISU5FX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3BjNTMybWFjaC5oIGIvYmZkL2hvc3RzL3BjNTMybWFjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk2ZjU5Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9wYzUzMm1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotLyogVGhpcyBpcyBhbiB1Z2x5IHdheSB0byBoYWNrIGFyb3VuZCB0aGUgaW5jb3JyZWN0Ci0gKiBkZWZpbml0aW9uIG9mIFVQQUdFUyBpbiBuczUzMi9tYWNocGFyYW0uaC4KLSAqCi0gKiBUaGUgZGVmaW5pdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgc2l6ZSByZXNlcnZlZAotICogZm9yICJzdHJ1Y3QgdXNlciIgaW4gY29yZSBmaWxlcyBpbiBQQUdFUywKLSAqIGJ1dCBpbnN0ZWFkIGl0IGdpdmVzIGl0IGluIDUxMi1ieXRlIGNvcmUtY2xpY2tzCi0gKiBmb3IgbnM1MzIsIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi0jZXJyb3IgVVBBR0VTIGlzIG5laXRoZXIgMiBub3IgMTYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvcmlzY29zLmggYi9iZmQvaG9zdHMvcmlzY29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmE4MjYuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3Jpc2Nvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyogUklTQy9vcyA0LjUyQywgYW5kIHByZXN1bWFibHkgb3RoZXIgdmVyc2lvbnMuICAqLwotCi0jaW5jbHVkZSA8YnNkNDMvbWFjaGluZS9tYWNocGFyYW0uaD4KLSNpbmNsdWRlIDxic2Q0My9tYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBOQlBHIEJTRDQzX05CUEcKLSNkZWZpbmUgVVBBR0VTIEJTRDQzX1VQQUdFUwotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiBCU0Q0M19VU1JURVhUCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIEJTRDQzX1VTUkRBVEEKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiBCU0Q0M19VU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3N5bW1ldHJ5LmggYi9iZmQvaG9zdHMvc3ltbWV0cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3MTdiMy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvc3ltbWV0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIFN5bW1ldHJ5IHJ1bm5pbmcgZWl0aGVyIGR5bml4IDMuMSAoYnNkKSBvciBwdHggKHN5c3YpLiAgKi8KLQotI2RlZmluZSBOQlBHIDQwOTYKLSNkZWZpbmUgVVBBR0VTIDEKLQotI2lmZGVmIF9TRVFVRU5UXwotLyogcHR4ICovCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAweDNmZmZlMDAwCi0jZGVmaW5lIFRSQURfQ09SRV9VU0VSX09GRlNFVCAoKFVQQUdFUyAqIE5CUEcpIC0gc2l6ZW9mIChzdHJ1Y3QgdXNlcikpCi0jZWxzZQotLyogZHluaXggKi8KLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgMHgxMDAwCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIChOQlBHICogdS51X3RzaXplKQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIDB4M2ZmZmYwMDAKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy90YWhvZS5oIGIvYmZkL2hvc3RzL3RhaG9lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNmNlZTIuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3RhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jZGVmaW5lCU5PX0NPUkVfQ09NTUFORAotCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdGFob2UKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQotI2RlZmluZQlIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheGJzZC5oIGIvYmZkL2hvc3RzL3ZheGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI5Y2NlLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy92YXhic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNkZWZpbmUJTk9fQ09SRV9DT01NQU5ECQkvKiBObyBjb21tYW5kIG5hbWUgaW4gY29yZSBmaWxlICovCi0KLSNpZiAwCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotLyogRG9lcyBub3QgZXhpc3Qgb24gQlNEIDQuMywgaXQgdXNlcyBtYWNoaW5lL21hY2hwYXJhbS5oLgotICAgV2hhdGV2ZXIgaXQgaXMsIGl0J3MgaW5jbHVkZWQgYnkgPHN5cy9wYXJhbS5oPiwgd2hpY2ggdHJhZC1jb3JlLmMsCi0gICB0aGUgb25seSBwbGFjZSB0aGF0IHVzZXMgdGhpcyAoSSB0aGluayksIGFscmVhZHkgaW5jbHVkZXMuICAqLwotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNlbmRpZgotI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KLQotLyogTm90ZSB0aGF0IEhPU1RfUEFHRV9TSVpFIC0tIHRoZSBwYWdlIHNpemUgYXMgZmFyIGFzIGV4ZWN1dGFibGUgZmlsZXMKLSAgIGFyZSBjb25jZXJuZWQgLS0gaXMgbm90IHRoZSBzYW1lIGFzIE5CUEcsIGJlY2F1c2Ugb2YgcGFnZSBjbHVzdGVyaW5nLiAgKi8KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEwMjQKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJMAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCSgweDgwMDAwMDAwIC0gKFVQQUdFUyAqIE5CUEcpKQotI3VuZGVmCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4dWx0LmggYi9iZmQvaG9zdHMvdmF4dWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzMxYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheHVsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJKE5CUEcqQ0xTSVpFKQotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKLSN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheHVsdDIuaCBiL2JmZC9ob3N0cy92YXh1bHQyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzMxYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheHVsdDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCShOQlBHKkNMU0laRSkKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCi0jdW5kZWYJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ocDMwMGJzZC5jIGIvYmZkL2hwMzAwYnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjdiMTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwMzAwYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQIDkwMDAvMzAwICg2ODAwMC1iYXNlZCkgbWFjaGluZXMgcnVubmluZyBCU0QgVW5peC4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwIC8qIEF2b2lkcyB3YXJuaW5nICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaHAzMDBic2RfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1ocDMwMGJzZCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHAzMDBocHV4LmMgYi9iZmQvaHAzMDBocHV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzJkNGYuLjAwMDAwMDAKLS0tIGEvYmZkL2hwMzAwaHB1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBocC11eCA5MDAwLzMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgR2xlbm4gRW5nZWwuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLQotICAgIGhwdXggbmF0aXZlICAtLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBocDMwMGhwdXggYmZkIHwgLS0tLS0tLS0tLT4gaHB1eCB3L2dudSBleHQKLSAgICBocHV4IHcvZ251IGV4dGVuc2lvbiAtLS0tPiB8ICAgICAgICAgICAgICAgfAotCi0KLSAgICBTdXBwb3J0IGZvciB0aGUgOTAwMC9bMzRdMDAgaGFzIHNldmVyYWwgbGltaXRhdGlvbnMuCi0gICAgICAxLiBTaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAgMi4gVGhlIG91dHB1dCBmb3JtYXQgZnJvbSB0aGlzIGJmZCBpcyBub3QgdXNhYmxlIGJ5IG5hdGl2ZSB0b29scy4KLQotICAgIFRoZSBwcmltYXJ5IG1vdGl2YXRpb24gZm9yIHdyaXRpbmcgdGhpcyBiZmQgd2FzIHRvIGFsbG93IHVzZSBvZgotICAgIGdkYiBhbmQgZ2NjIGZvciBob3N0IGJhc2VkIGRlYnVnZ2luZyBhbmQgbm90IHRvIG1pbWljIHRoZSBocC11eCB0b29scwotICAgIGluIGV2ZXJ5IGRldGFpbC4gIFRoaXMgbGVhZHMgdG8gYSBzaWduaWZpY2FudCBzaW1wbGlmaWNhdGlvbiBvZiB0aGUKLSAgICBjb2RlIGFuZCBhIGxlYXAgaW4gcGVyZm9ybWFuY2UuICBUaGUgZGVjaXNpb24gdG8gbm90IG91dHB1dCBocCBuYXRpdmUKLSAgICBjb21wYXRpYmxlIG9iamVjdHMgd2FzIGZ1cnRoZXIgc3RyZW5ndGhlbmVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHJpY2huZXNzCi0gICAgb2YgdGhlIGdjYyBjb21waWxlZCBvYmplY3RzIGNvdWxkIG5vdCBiZSByZXByZXNlbnRlZCB3aXRob3V0IGxvc3Mgb2YKLSAgICBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCB3aGlsZSB0aGUgaHAgZm9ybWF0IHN1cHBvcnRzIHRoZSBjb25jZXB0IG9mCi0gICAgc2Vjb25kYXJ5IHN5bWJvbHMsIGl0IGRvZXMgbm90IHN1cHBvcnQgaW5kaXJlY3Qgc3ltYm9scy4gIEFub3RoZXIKLSAgICByZWFzb24gaXMgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBpbXBsZW1lbnRhdGlvbnMKLSAgICBvZiBnY2Mgb24gaHB1eCB3aGljaCB1c2VkICdocHh0JyB0byB0cmFuc2xhdGUgLmEgYW5kIC5vIGZpbGVzIGludG8gYQotICAgIGZvcm1hdCB3aGljaCBjb3VsZCBiZSByZWFkaWx5IHVuZGVyc3Rvb2QgYnkgdGhlIGdudSBsaW5rZXIgYW5kIGdkYi4KLSAgICBUaGlzIGFsbG93cyByZWFkaW5nIGhwIHNlY29uZGFyeSBzeW1ib2xzIGFuZCBjb252ZXJ0aW5nIHRoZW0gaW50bwotICAgIGluZGlyZWN0IHN5bWJvbHMgYnV0IHRoZSByZXZlcnNlIGl0IG5vdCBhbHdheXMgcG9zc2libGUuCi0KLSAgICBBbm90aGVyIGV4YW1wbGUgb2YgZGlmZmVyZW5jZXMgaXMgdGhhdCB0aGUgaHAgZm9ybWF0IHN0b3JlcyBzeW1ib2wgb2Zmc2V0cwotICAgIGluIHRoZSBvYmplY3QgY29kZSB3aGlsZSB0aGUgZ251IHV0aWxpdGllcyB1c2UgYSBmaWVsZCBpbiB0aGUKLSAgICByZWxvY2F0aW9uIHJlY29yZCBmb3IgdGhpcy4gIFRvIHN1cHBvcnQgdGhlIGhwIG5hdGl2ZSBmb3JtYXQsIHRoZSBvYmplY3QKLSAgICBjb2RlIHdvdWxkIG5lZWQgdG8gYmUgcGF0Y2hlZCB3aXRoIHRoZSBvZmZzZXRzIHdoZW4gcHJvZHVjaW5nIC5vIGZpbGVzLgotCi0gICAgVGhlIGJhc2ljIHRlY2huaXF1ZSB0YWtlbiBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRvICNpbmNsdWRlIHRoZSBjb2RlCi0gICAgZnJvbSBhb3V0eC5oIGFuZCBhb3V0LXRhcmdldC5oIHdpdGggYXBwcm9wcmlhdGUgI2RlZmluZXMgdG8gb3ZlcnJpZGUKLSAgICBjb2RlIHdoZXJlIGEgdW5pcXVlIGltcGxlbWVudGF0aW9uIGlzIG5lZWRlZDoKLQotICAgIHsKLSAgICAgICAgI2RlZmluZSBhIGJ1bmNoIG9mIHN0dWZmCi0gICAgICAgICNpbmNsdWRlIDxhb3V0eC5oPgotCi0gICAgICAgIGltcGxlbWVudCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucwotCi0gICAgICAgICNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotICAgIH0KLQotICAgIFRoZSBocCBzeW1ib2wgdGFibGUgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gb3RoZXIgYS5vdXQgdGFyZ2V0cy4gIEluc3RlYWQKLSAgICBvZiBoYXZpbmcgYW4gYXJyYXkgb2Ygbmxpc3QgaXRlbXMgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3MsIGhwJ3MgZm9ybWF0Ci0gICAgaGFzIHRoZW0gbWl4ZWQgdG9nZXRoZXIgaW4gb25lIHN0cnVjdHVyZS4gIEluIGFkZGl0aW9uLCB0aGUgc3RyaW5ncyBhcmUKLSAgICBub3QgbnVsbCB0ZXJtaW5hdGVkLiAgSXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKLQotICAgIG5saXN0IGVsZW1lbnQgMQotICAgIHN0cmluZzEKLSAgICBubGlzdCBlbGVtZW50IDIKLSAgICBzdHJpbmcyCi0gICAgLi4uCi0KLSAgICBUaGUgd2hvbGUgc3ltYm9sIHRhYmxlIGlzIHJlYWQgYXMgb25lIGNodW5rIGFuZCB0aGVuIHdlIG1hcmNoIHRocnUgaXQKLSAgICBhbmQgY29udmVydCBpdCB0byBjYW5vbmljYWwgZm9ybS4gIEFzIHdlIG1hcmNoIHRocnUgdGhlIHRhYmxlLCB3ZSBjb3B5Ci0gICAgdGhlIG5saXN0IGRhdGEgaW50byB0aGUgaW50ZXJuYWwgZm9ybSBhbmQgd2UgY29tcGFjdCB0aGUgc3RyaW5ncyBhbmQgbnVsbAotICAgIHRlcm1pbmF0ZSB0aGVtLCB1c2luZyBzdG9yYWdlIGZyb20gdGhlIGFscmVhZHkgYWxsb2NhdGVkIHN5bWJvbCB0YWJsZToKLQotICAgIHN0cmluZzEKLSAgICBudWxsCi0gICAgc3RyaW5nMgotICAgIG51bGwKLSAqLwotCi0vKiBAQCBJcyB0aGlzIHJlYWxseSBzbyBkaWZmZXJlbnQgZnJvbSBub3JtYWwgYS5vdXQgdGhhdCBpdCBuZWVkcyB0byBpbmNsdWRlCi0gICBhb3V0eC5oPyAgV2Ugc2hvdWxkIGdvIHRocm91Z2ggdGhpcyBmaWxlIHNvbWV0aW1lIGFuZCBzZWUgd2hhdCBjYW4gYmUgbWFkZQotICAgbW9yZSBkZXBlbmRlbnQgb24gYW91dDMyLm8gYW5kIHdoYXQgbWlnaHQgbmVlZCB0byBiZSBicm9rZW4gb2ZmIGFuZCBhY2Nlc3NlZAotICAgdGhyb3VnaCB0aGUgYmFja2VuZF9kYXRhIGZpZWxkLiAgT3IsIG1heWJlIHdlIHJlYWxseSBkbyBuZWVkIHN1Y2ggYQotICAgY29tcGxldGVseSBzZXBhcmF0ZSBpbXBsZW1lbnRhdGlvbi4gIEkgZG9uJ3QgaGF2ZSB0aW1lIHRvIGludmVzdGlnYXRlIHRoaXMKLSAgIG11Y2ggZnVydGhlciByaWdodCBub3cuICBbcmFlYnVybjoxOTkzMDQyOC4yMTI0RVNUXSAqLwotLyogQEAgQWxzbywgbm90ZSB0aGF0IHRoZXJlIHdpbmQgdXAgYmVpbmcgdHdvIHZlcnNpb25zIG9mIHNvbWUgcm91dGluZXMsIHdpdGgKLSAgIGRpZmZlcmVudCBuYW1lcywgb25seSBvbmUgb2Ygd2hpY2ggYWN0dWFsbHkgZ2V0cyB1c2VkLiAgRm9yIGV4YW1wbGU6Ci0Jc2x1cnBfc3ltYm9sX3RhYmxlCi0Jc3dhcF9zdGRfcmVsb2NfaW4KLQlzbHVycF9yZWxvY190YWJsZQotCWdldF9zeW10YWIKLQlnZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0JY2Fub25pY2FsaXplX3JlbG9jCi0JbWtvYmplY3QKLSAgIFRoaXMgc2hvdWxkIGFsc28gYmUgZml4ZWQuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWhwMzAwaHB1eCIKLSNkZWZpbmUgTVkoT1ApIENBVChocDMwMGhwdXhfLE9QKQotCi0jZGVmaW5lIGV4dGVybmFsX2V4ZWMgaHAzMDBocHV4X2V4ZWNfYnl0ZXMKLSNkZWZpbmUgZXh0ZXJuYWxfbmxpc3QgaHAzMDBocHV4X25saXN0X2J5dGVzCi0KLSNpbmNsdWRlICJhb3V0L2hwMzAwaHB1eC5oIgotCi0vKiBkZWZpbmUgdGhlc2Ugc28gd2UgY2FuIGNvbXBpbGUgdW51c2VkIHJvdXRpbmVzIGluIGFvdXR4LmggKi8KLSNkZWZpbmUgZV9zdHJ4ICBlX3NobGliCi0jZGVmaW5lIGVfb3RoZXIgZV9sZW5ndGgKLSNkZWZpbmUgZV9kZXNjICBlX2FsbW9kCi0KLSNkZWZpbmUgQVJfUEFEX0NIQVIgJy8nCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKLQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3NsdXJwX2FybWFwIGJmZF9zbHVycF9ic2RfYXJtYXBfZjIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogcHJvdmlkZSBvdmVycmlkZXMgZm9yIHJvdXRpbmVzIGluIHRoaXMgZmlsZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGhlc2UgZG9uJ3QgdXNlIE1ZIGJlY2F1c2UgdGhhdCBjYXVzZXMgcHJvYmxlbXMgd2l0aGluIEpVTVBfVEFCTEUKLSAgIChDQVQgd2luZHMgdXAgYmVpbmcgZXhwYW5kZWQgcmVjdXJzaXZlbHksIHdoaWNoIEFOU0kgQyBjb21waWxlcnMKLSAgIHdpbGwgbm90IGRvKS4gICovCi0jZGVmaW5lIE1ZX2dldF9zeW10YWIgaHAzMDBocHV4X2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBocDMwMGhwdXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgaHAzMDBocHV4X2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaHAzMDBocHV4X3dyaXRlX29iamVjdF9jb250ZW50cwotCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgTVlfZmluYWxfbGlua19jYWxsYmFjayB1bnVzZWQKLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLQotLyogVW50aWwgYW5kIHVubGVzcyB3ZSBjb252ZXJ0IHRoZSBzbHVycF9yZWxvYyBhbmQgc2x1cnBfc3ltdGFiCi0gICByb3V0aW5lcyBpbiB0aGlzIGZpbGUsIHdlIGNhbiBub3QgdXNlIHRoZSBkZWZhdWx0IGFvdXQKLSAgIGZyZWVfY2FjaGVkX2luZm8gcm91dGluZSB3aGljaCBhc3N1bWVzIHRoYXQgdGhlIHJlbG9jcyBhbmQgc3ltdGFicwotICAgd2VyZSBhbGxvY2F0ZWQgdXNpbmcgbWFsbG9jLiAgKi8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gYmZkX3RydWUKLQotI2RlZmluZSBocDMwMGhwdXhfd3JpdGVfc3ltcyBhb3V0XzMyX3dyaXRlX3N5bXMKLQotI2RlZmluZSBNWV9jYWxsYmFjayBNWShjYWxsYmFjaykKLQotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAweDIKLQotI2RlZmluZSBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4gTkFNRShocDMwMGhwdXhfMzJfLHN3YXBfZXhlY19oZWFkZXJfaW4pCi0KLSNkZWZpbmUgSFBfU1lNVFlQRV9VTkRFRklORUQJMHgwMAotI2RlZmluZSBIUF9TWU1UWVBFX0FCU09MVVRFCTB4MDEKLSNkZWZpbmUgSFBfU1lNVFlQRV9URVhUCQkweDAyCi0jZGVmaW5lIEhQX1NZTVRZUEVfREFUQQkJMHgwMwotI2RlZmluZSBIUF9TWU1UWVBFX0JTUwkJMHgwNAotI2RlZmluZSBIUF9TWU1UWVBFX0NPTU1PTgkweDA1Ci0KLSNkZWZpbmUgSFBfU1lNVFlQRV9UWVBFCQkweDBGCi0jZGVmaW5lIEhQX1NZTVRZUEVfRklMRU5BTUUJMHgxRgotCi0jZGVmaW5lIEhQX1NZTVRZUEVfQUxJR04JMHgxMAotI2RlZmluZSBIUF9TWU1UWVBFX0VYVEVSTkFMCTB4MjAKLSNkZWZpbmUgSFBfU0VDT05EQVJZX1NZTUJPTCAgICAgMHg0MAotCi0vKiBSRUxPQ0FUSU9OIERFRklOSVRJT05TICovCi0jZGVmaW5lIEhQX1JTRUdNRU5UX1RFWFQJMHgwMAotI2RlZmluZSBIUF9SU0VHTUVOVF9EQVRBCTB4MDEKLSNkZWZpbmUgSFBfUlNFR01FTlRfQlNTCQkweDAyCi0jZGVmaW5lIEhQX1JTRUdNRU5UX0VYVEVSTkFMCTB4MDMKLSNkZWZpbmUgSFBfUlNFR01FTlRfUENSRUwgICAgICAgMHgwNAotI2RlZmluZSBIUF9SU0VHTUVOVF9SRExUICAgICAgICAweDA1Ci0jZGVmaW5lIEhQX1JTRUdNRU5UX1JQTFQgICAgICAgIDB4MDYKLSNkZWZpbmUgSFBfUlNFR01FTlRfTk9PUAkweDNGCi0KLSNkZWZpbmUgSFBfUkxFTkdUSF9CWVRFCQkweDAwCi0jZGVmaW5lIEhQX1JMRU5HVEhfV09SRAkJMHgwMQotI2RlZmluZSBIUF9STEVOR1RIX0xPTkcJCTB4MDIKLSNkZWZpbmUgSFBfUkxFTkdUSF9BTElHTgkweDAzCi0KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoaHAzMDBocHV4LF8zMl8seSkKLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLS8qIGFvdXR4LmggcmVxdWlyZXMgZGVmaW5pdGlvbnMgZm9yIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KLSNkZWZpbmUgQk1BR0lDIEhQVVhfRE9UX09fTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAzMTQKLQotI2luY2x1ZGUgImFvdXR4LmgiCi0KLS8qIFNpbmNlIHRoZSBocHV4IHN5bWJvbCB0YWJsZSBoYXMgbmxpc3QgZWxlbWVudHMgaW50ZXJzcGVyc2VkIHdpdGgKLSAgIHN0cmluZ3MgYW5kIHdlIG5lZWQgdG8gaW5zZXJ0IHNvbSBzdHJpbmdzIGZvciBzZWNvbmRhcnkgc3ltYm9scywgd2UKLSAgIGdpdmUgb3Vyc2VsdmVzIGEgbGl0dGxlIGV4dHJhIHBhZGRpbmcgdXAgZnJvbnQgdG8gYWNjb3VudCBmb3IKLSAgIHRoaXMuICBOb3RlIHRoYXQgZm9yIGVhY2ggbm9uLXNlY29uZGFyeSBzeW1ib2wgd2UgcHJvY2Vzcywgd2UgZ2FpbgotICAgOSBieXRlcyBvZiBzcGFjZSBmb3IgdGhlIGRpc2NhcmRlZCBubGlzdCBlbGVtZW50IChvbmUgYnl0ZSB1c2VkIGZvcgotICAgbnVsbCkuICBTWU1fRVhUUkFfQllURVMgaXMgdGhlIGV4dHJhIHNwYWNlLiAgKi8KLSNkZWZpbmUgU1lNX0VYVFJBX0JZVEVTICAgMTAyNAotCi0vKiBTZXQgcGFyYW1ldGVycyBhYm91dCB0aGlzIGEub3V0IGZpbGUgdGhhdCBhcmUgbWFjaGluZS1kZXBlbmRlbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc29tZV9hb3V0X29iamVjdF9wIGp1c3QgYmVmb3JlIGl0IHJldHVybnMuICAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotTVkgKGNhbGxiYWNrKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcGFydHMgb2YgYSBuZXdseSByZWFkIGFvdXQgaGVhZGVyICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gTl9UWFRTSVpFICgqZXhlY3ApOwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IE5fREFUQUREUiAoKmV4ZWNwKTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IE5fQlNTQUREUiAoKmV4ZWNwKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmxtYSA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmxtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotICBvYmpfYnNzc2VjIChhYmZkKS0+bG1hID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0jaWZkZWYgU0VUX0FSQ0hfTUFDSAotICBTRVRfQVJDSF9NQUNIIChhYmZkLCAqZXhlY3ApOwotI2Vsc2UKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKLSNlbmRpZgotCi0KLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0dOVV9UUkVMT0ZGICgqZXhlY3ApOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fR05VX0RSRUxPRkYgKCpleGVjcCk7Ci0KLSAgICAgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX0dOVV9TWU1PRkYgKCpleGVjcCk7Ci0gICAgICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgKyBleGVjcC0+YV9zeW1zKTsKLQotICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZXhlY3AtPmFfc3ltcyAvIDEyOwotICAgICAgb2JqX3N5bWJvbF9lbnRyeV9zaXplIChhYmZkKSA9IDEyOwotICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1leHRlcm4gYm9vbGVhbiBhb3V0XzMyX3dyaXRlX3N5bXMgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkgKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsJLyogZHVtbXkgdmFycyAqLwotICBmaWxlX3B0ciB0ZXh0X2VuZDsKLQotICBtZW1zZXQgKCZleGVjX2J5dGVzLCAwLCBzaXplb2YgKGV4ZWNfYnl0ZXMpKTsKLSNpZiBDSE9PU0VfUkVMT0NfU0laRQotICBDSE9PU0VfUkVMT0NfU0laRSAoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotCi0gIGlmIChhZGF0YSAoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQotICAgIE5BTUUgKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsKLSAgZXhlY3AtPmFfc3ltcyA9IDA7Ci0KLSAgZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIGV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgMHhjKTsKLSAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7Ci0KLSAgTkFNRSAoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7Ci0KLSAgLyogdXBkYXRlIGZpZWxkcyBub3QgY292ZXJlZCBieSBkZWZhdWx0IHN3YXBfZXhlY19oZWFkZXJfb3V0ICovCi0KLSAgLyogdGhpcyBpcyByZWFsbHkgdGhlIHN5bSB0YWJsZSBzaXplIGJ1dCB3ZSBzdG9yZSBpdCBpbiBkcmVsb2NzICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiAxMiwgZXhlY19ieXRlcy5lX2RyZWxvY3MpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMEwsIGZhbHNlKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLQkgICE9IEVYRUNfQllURVNfU0laRSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3ltYm9scywgYW5kIHRoZW4gdGhlIHJlbG9jcy4gIFdlIG11c3Qgd3JpdGUgb3V0Ci0gICAgICAgdGhlIHN5bWJvbHMgZmlyc3Qgc28gdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wgaW5kaWNlcy4gICovCi0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgLyogU2tpcCB0aGUgcmVsb2NzIHRvIHdoZXJlIHdlIHdhbnQgdG8gcHV0IHRoZSBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBOX0RSRUxPRkYgKCpleGVjcCkgKyBleGVjcC0+YV9kcnNpemUsCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghTVkgKHdyaXRlX3N5bXMpIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAobG9uZykgKE5fVFJFTE9GRiAoKmV4ZWNwKSksIGZhbHNlKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTkFNRSAoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAobG9uZykgKE5fRFJFTE9GRiAoKmV4ZWNwKSksIGZhbHNlKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTkFNRSAoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogY29udmVydCB0aGUgaHAgc3ltYm9sIHR5cGUgdG8gYmUgdGhlIHNhbWUgYXMgYW91dDY0LmggdXNhZ2Ugc28gd2UgKi8KLS8qIGNhbiBwaWdneWJhY2sgcm91dGluZXMgaW4gYW91dHguaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyB2b2lkCi1jb252ZXJ0X3N5bV90eXBlIChzeW1fcG9pbnRlciwgY2FjaGVfcHRyLCBhYmZkKQotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bV9wb2ludGVyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0cjsKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBuYW1lX3R5cGU7Ci0gIGludCBuZXdfdHlwZTsKLQotICBuYW1lX3R5cGUgPSAoY2FjaGVfcHRyLT50eXBlKTsKLSAgbmV3X3R5cGUgPSAwOwotCi0gIGlmICgobmFtZV90eXBlICYgSFBfU1lNVFlQRV9BTElHTikgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBpb3VfZXJyb3IgKCJhbGlnbmVkIHN5bWJvbCBlbmNvdW50ZXJlZDogJXMiLCBuYW1lKTsqLwotICAgICAgbmFtZV90eXBlID0gMDsKLSAgICB9Ci0KLSAgaWYgKG5hbWVfdHlwZSA9PSBIUF9TWU1UWVBFX0ZJTEVOQU1FKQotICAgIG5ld190eXBlID0gTl9GTjsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAobmFtZV90eXBlICYgSFBfU1lNVFlQRV9UWVBFKQotCXsKLQljYXNlIEhQX1NZTVRZUEVfVU5ERUZJTkVEOgotCSAgbmV3X3R5cGUgPSBOX1VOREY7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9BQlNPTFVURToKLQkgIG5ld190eXBlID0gTl9BQlM7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9URVhUOgotCSAgbmV3X3R5cGUgPSBOX1RFWFQ7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9EQVRBOgotCSAgbmV3X3R5cGUgPSBOX0RBVEE7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9CU1M6Ci0JICBuZXdfdHlwZSA9IE5fQlNTOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQ09NTU9OOgotCSAgbmV3X3R5cGUgPSBOX0NPTU07Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChuYW1lX3R5cGUgJiBIUF9TWU1UWVBFX0VYVEVSTkFMKQotCW5ld190eXBlIHw9IE5fRVhUOwotCi0gICAgICBpZiAobmFtZV90eXBlICYgSFBfU0VDT05EQVJZX1NZTUJPTCkKLQl7Ci0JICBzd2l0Y2ggKG5ld190eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0JICAgICAgLyogSWYgdGhlIHZhbHVlIGlzIG5vbnplcm8sIHRoZW4ganVzdCB0cmVhdCB0aGlzIGFzIGEKLSAgICAgICAgICAgICAgICAgY29tbW9uIHN5bWJvbC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIGNvcnJlY3QgaW4KLSAgICAgICAgICAgICAgICAgYWxsIGNhc2VzLCBidXQgaXQgaXMgbW9yZSBjb3JyZWN0IHRoYW4gdHJlYXRpbmcgaXQgYXMKLSAgICAgICAgICAgICAgICAgYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgICAgIGlmIChjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSA9PSAwKQotCQluZXdfdHlwZSA9IE5fV0VBS1U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0E7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JICAgICAgbmV3X3R5cGUgPSBOX1dFQUtUOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLRDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0JTUyB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLQjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGNhY2hlX3B0ci0+dHlwZSA9IG5ld190eXBlOwotCi19Ci0KLQotLyoKLURFU0NSSVBUSU9OCi0gICAgICAgIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3Ci0gICAgICAgIGJ5dGUgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIKLSAgICAgICAgc3RydWN0dXJlLgotKi8KLQotdm9pZAotTkFNRSAoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKSByYXdfYnl0ZXM7Ci0KLSAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcwotICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKLSAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cwotICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCi0gIG1lbXNldCAoZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfaW5mbyk7Ci0gIGV4ZWNwLT5hX3RleHQgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpOwotICBleGVjcC0+YV9lbnRyeSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBjaGVjayB0aGUgaGVhZGVyIHRvIHNlZSBpZiBpdCB3YXMgZ2VuZXJhdGVkIGJ5IGEgYmZkIG91dHB1dCAqLwotICAvKiB0aGlzIGlzIGRldGVjdGVkIHJhdGhlciBiaXphcmVseSBieSByZXF1aXJpbmcgYSBidW5jaCBvZiAgICAqLwotICAvKiBoZWFkZXIgZmllbGRzIHRvIGJlIHplcm8gYW5kIGFuIG9sZCB1bnVzZWQgZmllbGQgKG5vdyB1c2VkKSAqLwotICAvKiB0byBiZSBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBkbwotICAgIHsKLSAgICAgIGxvbmcgc3ltczsKLSAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9wYXNzaXplKSAhPSAwKQotCWJyZWFrOwotICAgICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfc3ltcykgIT0gMCkKLQlicmVhazsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX3N1cHNpemUpICE9IDApCi0JYnJlYWs7Ci0KLSAgICAgIHN5bXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2RyZWxvY3MpOwotICAgICAgaWYgKHN5bXMgPT0gMCkKLQlicmVhazsKLQotICAgICAgLyogT0ssIHdlJ3ZlIHBhc3NlZCB0aGUgdGVzdCBhcyBiZXN0IGFzIHdlIGNhbiBkZXRlcm1pbmUgKi8KLSAgICAgIGV4ZWNwLT5hX3N5bXMgPSBzeW1zOwotCi0gICAgICAvKiBhbGxvY2F0ZSBzdG9yYWdlIGZvciB3aGVyZSB3ZSB3aWxsIHN0b3JlIHRoaXMgcmVzdWx0ICovCi0gICAgICByYXdwdHIgPSAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICgqcmF3cHRyKSk7Ci0KLSAgICAgIGlmIChyYXdwdHIgPT0gTlVMTCkKLQlyZXR1cm47Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0gICAgICBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID0gZ251X2VuY2FwX2Zvcm1hdDsKLSAgICB9Ci0gIHdoaWxlICgwKTsKLX0KLQotCi0vKiBUaGUgaHAgc3ltYm9sIHRhYmxlIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIG90aGVyIGEub3V0IHRhcmdldHMuICBJbnN0ZWFkCi0gICBvZiBoYXZpbmcgYW4gYXJyYXkgb2Ygbmxpc3QgaXRlbXMgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3MsIGhwJ3MgZm9ybWF0Ci0gICBoYXMgdGhlbSBtaXhlZCB0b2dldGhlciBpbiBvbmUgc3RydWN0dXJlLiAgSW4gYWRkaXRpb24sIHRoZSBzdHJpbmdzIGFyZQotICAgbm90IG51bGwgdGVybWluYXRlZC4gIEl0IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLSAgIG5saXN0IGVsZW1lbnQgMQotICAgc3RyaW5nMQotICAgbmxpc3QgZWxlbWVudCAyCi0gICBzdHJpbmcyCi0gICAuLi4KLQotICAgVGhlIHdob2xlIHN5bWJvbCB0YWJsZSBpcyByZWFkIGFzIG9uZSBjaHVuayBhbmQgdGhlbiB3ZSBtYXJjaCB0aHJ1IGl0Ci0gICBhbmQgY29udmVydCBpdCB0byBjYW5vbmljYWwgZm9ybS4gIEFzIHdlIG1hcmNoIHRocnUgdGhlIHRhYmxlLCB3ZSBjb3B5Ci0gICB0aGUgbmxpc3QgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCB3ZSBjb21wYWN0IHRoZSBzdHJpbmdzIGFuZCBudWxsCi0gICB0ZXJtaW5hdGUgdGhlbSwgdXNpbmcgc3RvcmFnZSBmcm9tIHRoZSBhbHJlYWR5IGFsbG9jYXRlZCBzeW1ib2wgdGFibGU6Ci0KLSAgIHN0cmluZzEKLSAgIG51bGwKLSAgIHN0cmluZzIKLSAgIG51bGwKLSAgIC4uLgotKi8KLQotYm9vbGVhbgotTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1ib2xfYnl0ZXM7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltczsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fcG9pbnRlcjsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fZW5kOwotICBjaGFyICpzdHJpbmdzOwotICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZWQ7Ci0gIHVuc2lnbmVkIG51bV9zeW1zID0gMDsKLQotICAvKiBJZiB0aGVyZSdzIG5vIHdvcmsgdG8gYmUgZG9uZSwgZG9uJ3QgZG8gYW55ICovCi0gIGlmIChvYmpfYW91dF9zeW1ib2xzIChhYmZkKSAhPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICBzeW1ib2xfYnl0ZXMgPSBleGVjX2hkciAoYWJmZCktPmFfc3ltczsKLQotICBzdHJpbmdzID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCXN5bWJvbF9ieXRlcyArIFNZTV9FWFRSQV9CWVRFUyk7Ci0gIGlmICghc3RyaW5ncykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bXMgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIChzdHJpbmdzICsgU1lNX0VYVFJBX0JZVEVTKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKChQVFIpIHN5bXMsIHN5bWJvbF9ieXRlcywgMSwgYWJmZCkgIT0gc3ltYm9sX2J5dGVzKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBzeW1zKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICBzeW1fZW5kID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoKChjaGFyICopIHN5bXMpICsgc3ltYm9sX2J5dGVzKTsKLQotICAvKiBmaXJzdCwgbWFyY2ggdGhydSB0aGUgdGFibGUgYW5kIGZpZ3VyZSBvdXQgaG93IG1hbnkgc3ltYm9scyB0aGVyZSBhcmUgKi8KLSAgZm9yIChzeW1fcG9pbnRlciA9IHN5bXM7IHN5bV9wb2ludGVyIDwgc3ltX2VuZDsgc3ltX3BvaW50ZXIrKywgbnVtX3N5bXMrKykKLSAgICB7Ci0gICAgICAvKiBza2lwIG92ZXIgdGhlIGVtYmVkZGVkIHN5bWJvbC4gKi8KLSAgICAgIHN5bV9wb2ludGVyID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoKChjaGFyICopIHN5bV9wb2ludGVyKSArCi0JCQkJCSAgICAgICBzeW1fcG9pbnRlci0+ZV9sZW5ndGhbMF0pOwotICAgIH0KLQotICAvKiBub3cgdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wgY291bnQsIHVwZGF0ZSB0aGUgYmZkIGhlYWRlciAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IG51bV9zeW1zOwotCi0gIGNhY2hlZCA9ICgoYW91dF9zeW1ib2xfdHlwZSAqKQotCSAgICBiZmRfemFsbG9jIChhYmZkLAotCQkJYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKSk7Ci0gIGlmIChjYWNoZWQgPT0gTlVMTCAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBhcyB3ZSBtYXJjaCB0aHJ1IHRoZSBocCBzeW1ib2wgdGFibGUsIGNvbnZlcnQgaXQgaW50byBhIGxpc3Qgb2YKLSAgICAgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MgdG8gaG9sZCB0aGUgc3ltYm9sIG5hbWVzLiAgTWFrZSBzdXJlIGFueQotICAgICBhc3NpZ25tZW50IHRvIHRoZSBzdHJpbmdzIHBvaW50ZXIgaXMgZG9uZSBhZnRlciB3ZSdyZSB0aHJ1IHVzaW5nCi0gICAgIHRoZSBubGlzdCBzbyB3ZSBkb24ndCBvdmVyd3JpdGUgYW55dGhpbmcgaW1wb3J0YW50LiAqLwotCi0gIC8qIE9LLCBub3cgd2FsayB0aGUgbmV3IHN5bXRhYmxlLCBjYWNoZWluZyBzeW1ib2wgcHJvcGVydGllcyAqLwotICB7Ci0gICAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVfcHRyID0gY2FjaGVkOwotICAgIGFvdXRfc3ltYm9sX3R5cGUgY2FjaGVfc2F2ZTsKLSAgICAvKiBSdW4gdGhyb3VnaCB0YWJsZSBhbmQgY29weSB2YWx1ZXMgKi8KLSAgICBmb3IgKHN5bV9wb2ludGVyID0gc3ltcywgY2FjaGVfcHRyID0gY2FjaGVkOwotCSBzeW1fcG9pbnRlciA8IHN5bV9lbmQ7IHN5bV9wb2ludGVyKyssIGNhY2hlX3B0cisrKQotICAgICAgewotCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0JY2FjaGVfcHRyLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgPSBHRVRfU1dPUkQgKGFiZmQsIHN5bV9wb2ludGVyLT5lX3ZhbHVlKTsKLQljYWNoZV9wdHItPmRlc2MgPSBiZmRfZ2V0XzE2IChhYmZkLCBzeW1fcG9pbnRlci0+ZV9hbG1vZCk7Ci0JY2FjaGVfcHRyLT50eXBlID0gYmZkX2dldF84IChhYmZkLCBzeW1fcG9pbnRlci0+ZV90eXBlKTsKLQljYWNoZV9wdHItPnN5bWJvbC51ZGF0YS5wID0gTlVMTDsKLQlsZW5ndGggPSBiZmRfZ2V0XzggKGFiZmQsIHN5bV9wb2ludGVyLT5lX2xlbmd0aCk7Ci0JY2FjaGVfcHRyLT5vdGhlciA9IGxlbmd0aDsJLyogb3RoZXIgbm90IHVzZWQsIHNhdmUgbGVuZ3RoIGhlcmUgKi8KLQotCWNhY2hlX3NhdmUgPSAqY2FjaGVfcHRyOwotCWNvbnZlcnRfc3ltX3R5cGUgKHN5bV9wb2ludGVyLCBjYWNoZV9wdHIsIGFiZmQpOwotCWlmICghdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyAoYWJmZCwgY2FjaGVfcHRyKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBmb3IgaHB1eCwgdGhlICdsZW5naHQnIHZhbHVlIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mICovCi0JLyogdGhlIHN5bWJvbCBuYW1lIHdoaWNoIGZvbGxvd3MgdGhlIG5saXN0IGVudHJ5LiAgICAgICAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlpZiAobGVuZ3RoKQotCSAgewotCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JICAgIC8qIHRoZSBocCBzdHJpbmcgaXMgbm90IG51bGwgdGVybWluYXRlZCBzbyB3ZSBjcmVhdGUgYSBuZXcgb25lKi8KLQkgICAgLyogYnkgY29weWluZyB0aGUgc3RyaW5nIHRvIG92ZXJsYXAgdGhlIGp1c3QgdmFjYXRlZCBubGlzdCAgICAqLwotCSAgICAvKiBzdHJ1Y3R1cmUgYmVmb3JlIGl0IGluIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkgICAgY2FjaGVfcHRyLT5zeW1ib2wubmFtZSA9IHN0cmluZ3M7Ci0JICAgIG1lbWNweSAoc3RyaW5ncywgc3ltX3BvaW50ZXIgKyAxLCBsZW5ndGgpOwotCSAgICBzdHJpbmdzW2xlbmd0aF0gPSAnXDAnOwotCSAgICBzdHJpbmdzICs9IGxlbmd0aCArIDE7Ci0JICB9Ci0JZWxzZQotCSAgY2FjaGVfcHRyLT5zeW1ib2wubmFtZSA9IChjaGFyICopIE5VTEw7Ci0KLQkvKiBza2lwIG92ZXIgdGhlIGVtYmVkZGVkIHN5bWJvbC4gKi8KLQlzeW1fcG9pbnRlciA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1fcG9pbnRlcikgKwotCQkJCQkJIGxlbmd0aCk7Ci0gICAgICB9Ci0gIH0KLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IGNhY2hlZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLXZvaWQKLU1ZIChzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBocDMwMGhwdXhfcmVsb2MgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm4gPSAwOwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsID0gMDsKLSAgc3RydWN0IGFvdXRkYXRhICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOwotICByX2luZGV4ID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBieXRlcy0+cl9pbmRleCk7Ci0KLSAgc3dpdGNoIChieXRlcy0+cl90eXBlWzBdKQotICAgIHsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX1RFWFQ6Ci0gICAgICByX2luZGV4ID0gTl9URVhUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9EQVRBOgotICAgICAgcl9pbmRleCA9IE5fREFUQTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfQlNTOgotICAgICAgcl9pbmRleCA9IE5fQlNTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9FWFRFUk5BTDoKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfUENSRUw6Ci0gICAgICByX2V4dGVybiA9IDE7Ci0gICAgICByX3BjcmVsID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfUkRMVDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfUlBMVDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfTk9PUDoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBzd2l0Y2ggKGJ5dGVzLT5yX2xlbmd0aFswXSkKLSAgICB7Ci0gICAgY2FzZSBIUF9STEVOR1RIX0JZVEU6Ci0gICAgICByX2xlbmd0aCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JMRU5HVEhfV09SRDoKLSAgICAgIHJfbGVuZ3RoID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUkxFTkdUSF9MT05HOgotICAgICAgcl9sZW5ndGggPSAyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBob3d0b190YWJsZV9zdGQgKyByX2xlbmd0aCArIDQgKiByX3BjcmVsOwotICAvKiBGSVhNRS1zb29uOiAgUm9sbCBiYXNlcmVsLCBqbXB0YWJsZSwgcmVsYXRpdmUgYml0cyBpbnRvIGhvd3RvIHNldHRpbmcgKi8KLQotICAvKiBUaGlzIG1hY3JvIHVzZXMgdGhlIHJfaW5kZXggdmFsdWUgY29tcHV0ZWQgYWJvdmUgKi8KLSAgaWYgKHJfcGNyZWwgJiYgcl9leHRlcm4pCi0gICAgewotICAgICAgLyogVGhlIEdOVSBsaW5rZXIgYXNzdW1lcyBhbnkgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHNlY3Rpb24gKi8KLSAgICAgIC8qIGlzIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGltYWdlIHdoaWxlIHRoZSBIUCBsaW5rZXIgICovCi0gICAgICAvKiBhZGRzIHRoaXMgaW4gbGF0ZXIuICBBZGQgaXQgaW4gbm93Li4uICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgTU9WRV9BRERSRVNTICgtY2FjaGVfcHRyLT5hZGRyZXNzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBNT1ZFX0FERFJFU1MgKDApOwotICAgIH0KLX0KLQotYm9vbGVhbgotTVkgKHNsdXJwX3JlbG9jX3RhYmxlKSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBQVFIgcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLSAgc3RydWN0IGhwMzAwaHB1eF9yZWxvYyAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGFyZWxlbnQgKmNhY2hlX3B0cjsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgIHJlbG9jX3NpemUgPSBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplOwotICAgICAgZ290byBkb2l0OwotICAgIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgIHJlbG9jX3NpemUgPSBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplOwotICAgICAgZ290byBkb2l0OwotICAgIH0KLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci0KLWRvaXQ6Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgYXNlY3QtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICBjb3VudCA9IHJlbG9jX3NpemUgLyBlYWNoX3NpemU7Ci0KLQotICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopIGJmZF96YWxsb2MgKGFiZmQsIChzaXplX3QpIChjb3VudCAqIHNpemVvZgotCQkJCQkJCShhcmVsZW50KSkpOwotICBpZiAoIXJlbG9jX2NhY2hlICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJlbG9jcyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NzICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKHJlbG9jcywgMSwgcmVsb2Nfc2l6ZSwgYWJmZCkgIT0gcmVsb2Nfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NzKTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJwdHIgPSAoc3RydWN0IGhwMzAwaHB1eF9yZWxvYyAqKSByZWxvY3M7Ci0gIGNvdW50ZXIgPSAwOwotICBjYWNoZV9wdHIgPSByZWxvY19jYWNoZTsKLQotICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0gICAgewotICAgICAgTVkgKHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotICAgIH0KLQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpZGVudGljYWwgdG8gZnVuY3Rpb25zIGluIGFvdXR4LmggZXhjZXB0ICovCi0vKiB0aGV5IHJlZmVyIHRvIE1ZKGZ1bmMpIHJhdGhlciB0aGFuIE5BTUUoYW91dCxmdW5jKSBhbmQgdGhleSBhbHNvICAgICAqLwotLyogY2FsbCBhb3V0XzMyIHZlcnNpb25zIGlmIHRoZSBpbnB1dCBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgZ2NjICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWxvbmcgYW91dF8zMl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGFzeW1ib2wgKiogbG9jYXRpb24pKTsKLWxvbmcgYW91dF8zMl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotbG9uZyBhb3V0XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiBhYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkJCSBhcmVsZW50ICoqIHJlbHB0ciwKLQkJCQkJIGFzeW1ib2wgKiogc3ltYm9scykpOwotCi1sb25nCi1NWSAoZ2V0X3N5bXRhYikgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICBhb3V0X3N5bWJvbF90eXBlICpzeW1iYXNlOwotCi0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pOwotCi0gIGlmICghTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBmb3IgKHN5bWJhc2UgPSBvYmpfYW91dF9zeW1ib2xzIChhYmZkKTsgY291bnRlcisrIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7KQotICAgICoobG9jYXRpb24rKykgPSAoYXN5bWJvbCAqKSAoc3ltYmFzZSsrKTsKLSAgKmxvY2F0aW9uKysgPSAwOwotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLWxvbmcKLU1ZIChnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHJldHVybiBhb3V0XzMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoIU1ZIChzbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLQotCi0KLWxvbmcKLU1ZIChjYW5vbmljYWxpemVfcmVsb2MpIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHJldHVybiBhb3V0XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKTsKLQotICBpZiAoISh0YmxwdHIgfHwgTVkgKHNsdXJwX3JlbG9jX3RhYmxlKSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgewotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0JewotCSAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0JfQotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0KLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2hwcGFfc3R1YnMuaCBiL2JmZC9ocHBhX3N0dWJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODkzZTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwcGFfc3R1YnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIEhQUEEgbGlua2VyIHN0dWIgaW5zdHJ1Y3Rpb25zICAqLwotCi0vKiBUaGVzZSBhcmUgdGhlIGluc3RydWN0aW9ucyB3aGljaCB0aGUgbGlua2VyIG1heSBpbnNlcnQgaW50byB0aGUKLSAgIGNvZGUgc3RyZWFtIHdoZW4gYnVpbGRpbmcgZmluYWwgZXhlY3V0YWJsZXMgdG8gaGFuZGxlIG91dC1vZi1yYW5nZQotICAgY2FsbHMgYW5kIGFyZ3VtZW50IHJlbG9jYXRpb25zLiAgKi8KLQotI2RlZmluZSBMRE9fTTRfUjMxX1IzMQkJMHgzN2ZmM2ZmOQkvKiBsZG8gLTQoJXIzMSksJXIzMQkgICovCi0jZGVmaW5lIExESUxfUjEJCQkweDIwMjAwMDAwCS8qIGxkaWwgWFhYLCVyMQkJICAqLwotI2RlZmluZSBCRV9TUjRfUjEJCTB4ZTAyMDIwMDAJLyogYmUgWFhYKCVzcjQsJXIxKQkgICovCi0jZGVmaW5lIENPUFlfUjMxX1IyICAgICAgICAgIAkweDA4MWYwMjQyCS8qIGNvcHkgJXIzMSwlcjIJICAqLwotI2RlZmluZSBCTEVfU1I0X1IwCQkweGU0MDAyMDAwCS8qIGJsZSBYWFgoJXNyNCwlcjApCSAgKi8KLSNkZWZpbmUgQkxFX1NSNF9SMQkJMHhlNDIwMjAwMAkvKiBibGUgWFhYKCVzcjQsJXIxKQkgICovCi0jZGVmaW5lIEJWX05fMF9SMzEJCTB4ZWJlMGMwMDIJLyogYnYsbiAwKCVyMzEpCQkgICovCi0jZGVmaW5lIFNUV19SMzFfTThSMzAJCTB4NmJkZjNmZjEJLyogc3R3ICVyMzEsLTgoJXIzMCkJICAqLwotI2RlZmluZSBMRFdfTThSMzBfUjMxCQkweDRiZGYzZmYxCS8qIGxkdyAtOCglcjMwKSwlcjMxCSAgKi8KLSNkZWZpbmUgU1RXX0FSR19NMTZSMzAJCTB4NmJjMDNmZTEJLyogc3R3ICVhcmdYLC0xNiglcjMwKQkgICovCi0jZGVmaW5lIExEV19NMTZSMzBfQVJHCQkweDRiYzAzZmUxCS8qIGxkdyAtMTIoJXIzMCksJWFyZ1gJICAqLwotI2RlZmluZSBTVFdfQVJHX00xMlIzMAkJMHg2YmMwM2ZlOQkvKiBzdHcgJWFyZ1gsLTE2KCVyMzApCSAgKi8KLSNkZWZpbmUgTERXX00xMlIzMF9BUkcJCTB4NGJjMDNmZTkJLyogbGR3IC0xMiglcjMwKSwlYXJnWAkgICovCi0jZGVmaW5lIEZTVFdfRkFSR19NMTZSMzAJMHgyN2MxMTIwMAkvKiBmc3R3cyAlZmFyZ1gsLTE2KCVyMzApICovCi0jZGVmaW5lIEZMRFdfTTE2UjMwX0ZBUkcJMHgyN2MxMTAwMAkvKiBmbGR3cyAtMTYoJXIzMCksJWZhcmdYICovCi0jZGVmaW5lIEZTVERfRkFSR19NMTZSMzAJMHgyZmMxMTIwMAkvKiBmc3RkcyAlZmFyZ1gsLTE2KCVyMzApICovCi0jZGVmaW5lIEZMRERfTTE2UjMwX0ZBUkcJMHgyZmMxMTAwMAkvKiBmbGRkcyAtMTYoJXIzMCksJWZhcmdYICovCmRpZmYgLS1naXQgYS9iZmQvaHBwYWJzZC1jb3JlLmMgYi9iZmQvaHBwYWJzZC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2U2YjIuLjAwMDAwMDAKLS0tIGEvYmZkL2hwcGFic2QtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSFBQQSBCU0QgY29yZSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gCi0KLSAgIFRoZSBjb3JlIGZpbGUgc3RydWN0dXJlIGZvciB0aGUgVXRhaCA0LjNCU0QgYW5kIE9TRjEgcG9ydHMgb24gdGhlCi0gICBQQSBpcyBhIG1peCBiZXR3ZWVuIHRyYWRpdGlvbmFsIGNvcmVzIGFuZCBocHV4IGNvcmVzIC0tIGp1c3QKLSAgIGRpZmZlcmVudCBlbm91Z2ggdGhhdCBzdXBwb3J0aW5nIHRoaXMgZm9ybWF0IHdvdWxkIHRlbmQgdG8gYWRkCi0gICBncm9zcyBoYWNrcyB0byB0cmFkLWNvcmUuYyBvciBocHV4LWNvcmUuYy4gIFNvIGluc3RlYWQgd2Uga2VlcCBhbnkKLSAgIGdyb3NzIGhhY2tzIGlzb2xhdGVkIHRvIHRoaXMgZmlsZS4gICovCi0gICAKLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIEhQUEEtQlNEIHN0eWxlCi0gICBjb3JlIGZpbGVzLgotCi0gICBJIHdvdWxkIG5vdCBleHBlY3QgdGhpcyB0byBiZSBvZiB1c2UgdG8gYW55IG90aGVyIGhvc3QvdGFyZ2V0LCBidXQKLSAgIHlvdSBuZXZlciBrbm93LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKQotCi0jaW5jbHVkZSAibWFjaGluZS92bXBhcmFtLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgkJLyogQWZ0ZXIgYS5vdXQuaCAgKi8KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCi1zdGF0aWMgYXNlY3Rpb24gKm1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosCi0JCQkJCSAgICBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwKLQkJCQkJICAgIGZpbGVfcHRyLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBhc3ltYm9sICpocHBhYnNkX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpocHBhYnNkX2NvcmVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICpocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBocHBhYnNkX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhLiAgKi8KLQotc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QKLSAgewotICAgIGludCBzaWc7Ci0gICAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci0gICAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKLSAgICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKLSAgICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gIH07Ci0KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLmhwcGFic2RfY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX3NpZ25hbChiZmQpIChjb3JlX2hkcihiZmQpLT5zaWcpCi0jZGVmaW5lIGNvcmVfY29tbWFuZChiZmQpIChjb3JlX2hkcihiZmQpLT5jbWQpCi0jZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5kYXRhX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+cmVnX3NlY3Rpb24pCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgb2Zmc2V0LCBhbGlnbm1lbnRfcG93ZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+ZmlsZXBvcyA9IG9mZnNldDsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWhwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1ocHBhYnNkX2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHZhbDsKLSAgc3RydWN0IHVzZXIgdTsKLSAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmNvcmVkYXRhOwotICBpbnQgY2xpY2tzejsKLQotICAvKiBUcnkgdG8gcmVhZCBpbiB0aGUgdS1hcmVhLiAgV2Ugd2lsbCBuZWVkIGluZm9ybWF0aW9uIGZyb20gdGhpcwotICAgICB0byBrbm93IGhvdyB0byBncm9rIHRoZSByZXN0IG9mIHRoZSBjb3JlIHN0cnVjdHVyZXMuICAqLwotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikgJnUsIDEsIHNpemVvZiB1LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgdSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBwYWdlIHNpemUgb3V0IG9mIHRoZSB1IHN0cnVjdHVyZS4gIFRoaXMgd2lsbCBiZSBkaWZmZXJlbnQKLSAgICAgZm9yIFBBIDEuMCBtYWNoaW5lcyBhbmQgUEEgMS4xIG1hY2hpbmVzLiAgIFl1ayEgICovCi0gIGNsaWNrc3ogPSB1LnVfcGNiLnBjYl9wZ3N6OwotCi0gIC8qIGNsaWNrc3ogbXVzdCBiZSBhIHBvd2VyIG9mIHR3byA+PSAyay4gICovCi0gIGlmIChjbGlja3N6IDwgMHg4MDAKLSAgICAgIHx8IGNsaWNrc3ogIT0gKGNsaWNrc3ogJiAtY2xpY2tzeikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLQotICAvKiBTYW5pdHkgY2hlY2tzLiAgTWFrZSBzdXJlIHRoZSBzaXplIG9mIHRoZSBjb3JlIGZpbGUgbWF0Y2hlcyB0aGUKLSAgICAgdGhlIHNpemUgY29tcHV0ZWQgZnJvbSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGNvcmUgaXRzZWxmLiAgKi8KLSAgewotICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBpZiAoTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpID4gc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgaWYgKGNsaWNrc3ogKiAoVVBBR0VTICsgdS51X2RzaXplICsgdS51X3NzaXplKSA8IHN0YXRidWYuc3Rfc2l6ZSkKLSAgICAgIHsKLQkvKiBUaGUgZmlsZSBpcyB0b28gYmlnLiAgTWF5YmUgaXQncyBub3QgYSBjb3JlIGZpbGUKLQkgICBvciB3ZSBvdGhlcndpc2UgaGF2ZSBiYWQgdmFsdWVzIGZvciB1X2RzaXplIGFuZCB1X3NzaXplKS4gICovCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICBjb3JlZGF0YSA9IChzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKCFjb3JlZGF0YSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBNYWtlIHRoZSBjb3JlIGRhdGEgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIHRkYXRhIHBhcnQgb2YgdGhlIEJGRC4gICovCi0gIGFiZmQtPnRkYXRhLmhwcGFic2RfY29yZV9kYXRhID0gY29yZWRhdGE7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9ucy4gICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuc3RhY2siLAotCQkJCQkgICBTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgICBjbGlja3N6ICogdS51X3NzaXplLAotCQkJCQkgICBOQlBHICogKFVTSVpFICsgS1NUQUtTSVpFKSAKLQkJCQkJICAgICArIGNsaWNrc3ogKiB1LnVfZHNpemUsIDIpOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gVVNSU1RBQ0s7IAotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRAotCQkJCQkgICAgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgIGNsaWNrc3ogKiB1LnVfZHNpemUsCi0JCQkJCSAgTkJQRyAqIChVU0laRSArIEtTVEFLU0laRSksIDIpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBVREFUQVNFRzsKLQotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJCQkgU0VDX0hBU19DT05URU5UUywKLQkJCQkJIEtTVEFLU0laRSAqIE5CUEcsCi0JCQkJCSBOQlBHICogVVNJWkUsIDIpOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IDA7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgdS51X2NvbW0sIE1BWENPTUxFTiArIDEpOwotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSB1LnVfY29kZTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGludAotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICAvKiBUaGVyZSdzIG5vIHdheSB0byBrbm93IHRoaXMuLi4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFwKLSAgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBocHBhYnNkX2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIGhwcGFic2RfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGhwcGFic2RfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGhwcGFic2RfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGhwcGFic2RfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0ICgpCi17Ci0gIC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cC4gICovCi0gIGFib3J0ICgpOwkKLX0KLQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBocHBhYnNkX2NvcmVfdmVjID0KLSAgewotICAgICJocHBhYnNkLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoaHBwYWJzZF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaHBwYWJzZF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9ocHV4LWNvcmUuYyBiL2JmZC9ocHV4LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhYTJjMi4uMDAwMDAwMAotLS0gYS9iZmQvaHB1eC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUC9VWCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgotICAgQ29udmVydGVkIHRvIGJhY2stZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNVcHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFAvVVggc3R5bGUKLSAgIGNvcmUgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQMzAwSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0KLS8qIEZJWE1FOiBzeXMvY29yZS5oIGRvZXNuJ3QgZXhpc3QgZm9yIEhQVVggdmVyc2lvbiA3LiAgSFBVWCB2ZXJzaW9uCi0gICA1LCA2LCBhbmQgNyBjb3JlIGZpbGVzIHNlZW0gdG8gYmUgc3RhbmRhcmQgdHJhZC1jb3JlLmMgdHlwZSBjb3JlCi0gICBmaWxlczsgY2FuIHdlIGp1c3QgdXNlIHRyYWQtY29yZS5jIGluIGFkZGl0aW9uIHRvIHRoaXMgZmlsZT8gICovCi0KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0KLSNlbmRpZiAvKiBIT1NUX0hQUEFIUFVYICovCi0KLSNpZmRlZiBIT1NUX0hQUEFCU0QKLQotLyogTm90IGEgdmVyeSBzd2lmdCBwbGFjZSB0byBwdXQgaXQsIGJ1dCB0aGF0J3Mgd2hlcmUgdGhlIEJTRCBwb3J0Ci0gICBwdXRzIHRoZW0uICAqLwotI2luY2x1ZGUgIi9ocHV4L3Vzci9pbmNsdWRlL3N5cy9jb3JlLmgiCi0KLSNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEhBVkVfRElSRU5UX0gKLSMgaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLS8qIEtsdWRnZTogVGhlcmUncyBubyBleHBsaWNpdCBtZWNoYW5pc20gcHJvdmlkZWQgYnkgc3lzL2NvcmUuaCB0bwotICAgY29uZGl0aW9uYWxseSBrbm93IHdoZXRoZXIgYSBwcm9jX2luZm8gaGFzIHRocmVhZCBpZCBmaWVsZHMuCi0gICBIb3dldmVyLCBDT1JFX0FOT05fU0hNRU0gc2hvd3MgdXAgZmlyc3QgYXQgMTAuMzAsIHdoaWNoIGlzCi0gICBoYXBwaWx5IGFsc28gd2hlbiBtZWFuaW5nZnVsIHRocmVhZCBpZCdzIHNob3cgdXAgaW4gcHJvY19pbmZvLiAqLwotI2lmIGRlZmluZWQoQ09SRV9BTk9OX1NITUVNKQotI2RlZmluZSBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCAoMSkKLSNlbmRpZgotCi0vKiBUaGlzIHR5cGUgYXBwZWFycyBhdCBIUC1VWCAxMC4zMC4gIERlZmluaW5nIGl0IGlmIG5vdCBkZWZpbmVkCi0gICBieSBzeXMvY29yZS5oIGFsbG93cyB1cyB0byBidWlsZCBmb3Igb2xkZXIgSFAtVVgncywgYW5kIChzaW5jZQotICAgaXQgd29uJ3QgYmUgZW5jb3VudGVyZWQgaW4gY29yZS1kdW1wcyBmcm9tIG9sZGVyIEhQLVVYJ3MpIGlzCi0gICBoYXJtbGVzcy4gKi8KLSNpZiAhZGVmaW5lZChDT1JFX0FOT05fU0hNRU0pCi0jZGVmaW5lIENPUkVfQU5PTl9TSE1FTSAweDAwMDAwMjAwICAgICAgICAgLyogYW5vbnltb3VzIHNoYXJlZCBtZW1vcnkgKi8KLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi0vKiAubHdwaWQgYW5kIC51c2VyX3RpZCBhcmUgb25seSB2YWxpZCBpZiBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCwgZWxzZSB0aGV5Ci0gICBhcmUgc2V0IHRvIDAuICBBbHNvLCB1bnRpbCBIUC1VWCBpbXBsZW1lbnRzIE14TiB0aHJlYWRzLCAudXNlcl90aWQgYW5kCi0gICAubHdwaWQgYXJlIHN5bm9ueW1vdXMuICovCi1zdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgaW50IGx3cGlkOyAgICAgICAgICAgICAgIC8qIEtlcm5lbCB0aHJlYWQgSUQuICovCi0gIHVuc2lnbmVkIGxvbmcgdXNlcl90aWQ7ICAvKiBVc2VyIHRocmVhZCBJRC4gKi8KLSAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5ocHV4X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotI2RlZmluZSBjb3JlX2tlcm5lbF90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+bHdwaWQpCi0jZGVmaW5lIGNvcmVfdXNlcl90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+dXNlcl90aWQpCi0KLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgYWxpZ25tZW50X3Bvd2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWhwdXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgYmZkIHRhcmdldCBpZiB0aGUgZmlsZSBpcyBhIGNvcmVmaWxlLgotICAgSXQgcmV0dXJucyBudWxsIG9yIDAgaWYgaXQgZmluZHMgb3V0IHRoYWF0IGl0IGlzIG5vdCBhIGNvcmUgZmlsZS4KLSAgIFRoZSB3YXkgaXQgY2hlY2tzIHRoaXMgaXMgYnkgbG9va2luZyBmb3IgYWxsb3dlZCAndHlwZScgZmllbGQgdmFsdWVzLgotICAgVGhlc2UgYXJlIGRlY2xhcmVkIGluIHN5cy9jb3JlLmgKLSAgIFRoZXJlIGFyZSBzb21lIHZhbHVlcyB3aGljaCBhcmUgJ3Jlc2VydmVkIGZvciBmdXR1cmUgdXNlJy4gSW4gcGFydGljdWxhcgotICAgQ09SRV9OT05FIGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgMC4gVGhpcyBtYXkgYmUgYSBjYXRjaC1hbGwgZm9yIGNhc2VzCi0gICBpbiB3aGljaCB0aGUgY29yZSBmaWxlIGlzIGdlbmVyYXRlZCBieSBzb21lIG5vbi1ocHV4IGFwcGxpY2F0aW9uLgotICAgKEkgYW0ganVzdCBndWVzc2luZyBoZXJlISkKLSovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1ocHV4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50ICBnb29kX3NlY3Rpb25zID0gMDsKLSAgaW50ICB1bmtub3duX3NlY3Rpb25zID0gMDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBocHV4X2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB2YWw7Ci0gICAgICBzdHJ1Y3QgY29yZWhlYWQgY29yZV9oZWFkZXI7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7Ci0gICAgICBpZiAodmFsIDw9IDApCi0JYnJlYWs7Ci0gICAgICBzd2l0Y2ggKGNvcmVfaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgQ09SRV9LRVJORUw6Ci0JY2FzZSBDT1JFX0ZPUk1BVDoKLQkgIGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKTsJLyogSnVzdCBza2lwIHRoaXMgKi8KLSAgICAgICAgICBnb29kX3NlY3Rpb25zKys7Ci0JICBicmVhazsKLQljYXNlIENPUkVfRVhFQzoKLQkgIHsKLQkgICAgc3RydWN0IHByb2NfZXhlYyBwcm9jX2V4ZWM7Ci0JICAgIGlmIChiZmRfcmVhZCAoKHZvaWQgKikgJnByb2NfZXhlYywgMSwgY29yZV9oZWFkZXIubGVuLCBhYmZkKQotCQkhPSBjb3JlX2hlYWRlci5sZW4pCi0JICAgICAgYnJlYWs7Ci0JICAgIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIHByb2NfZXhlYy5jbWQsIE1BWENPTUxFTiArIDEpOwotICAgICAgICAgICAgZ29vZF9zZWN0aW9ucysrOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFX1BST0M6Ci0JICB7Ci0JICAgIHN0cnVjdCBwcm9jX2luZm8gcHJvY19pbmZvOwotCSAgICBjaGFyICBzZWNuYW1lWzEwMF07ICAvKiBPZiBhcmJpdHJhcnkgc2l6ZSwgYnV0IHBsZW50eSBsYXJnZS4gKi8KLQotICAgICAgICAgICAgLyogV2UgbmVlZCB0byByZWFkIHRoaXMgc2VjdGlvbiwgJ2NhdXNlIHdlIG5lZWQgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBjb3JlLWR1bXBlZCBhcHAgd2FzIHRocmVhZGVkIGJlZm9yZSB3ZSBjcmVhdGUKLSAgICAgICAgICAgICAgIGFueSAucmVnIHNlY3Rpb25zLiAqLwotCSAgICBpZiAoYmZkX3JlYWQgKCZwcm9jX2luZm8sIDEsIGNvcmVfaGVhZGVyLmxlbiwgYWJmZCkKLQkJIT0gY29yZV9oZWFkZXIubGVuKQotCSAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIC8qIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBjcmVhdGUgdGhvc2Ugc2VjdGlvbnMgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgZmlsZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkLCBpdCBzZWVtcy4gKi8KLSAgICAgICAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgLWNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpICE9IDApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0jaWYgZGVmaW5lZChQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCkKLSAgICAgICAgICAgIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPSBwcm9jX2luZm8ubHdwaWQ7Ci0gICAgICAgICAgICBjb3JlX3VzZXJfdGhyZWFkX2lkIChhYmZkKSA9IHByb2NfaW5mby51c2VyX3RpZDsKLSNlbHNlCi0gICAgICAgICAgICBjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSAgICAgICAgICAgIGNvcmVfdXNlcl90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSNlbmRpZgotICAgICAgICAgICAgLyogSWYgdGhlIHByb2dyYW0gd2FzIHVudGhyZWFkZWQsIHRoZW4gd2UnbGwganVzdCBjcmVhdGUgYQotICAgICAgICAgICAgICAgLnJlZyBzZWN0aW9uLgotCi0gICAgICAgICAgICAgICBJZiB0aGUgcHJvZ3JhbSB3YXMgdGhyZWFkZWQsIHRoZW4gd2UnbGwgY3JlYXRlIC5yZWcvWFhYWFgKLSAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIGVhY2ggdGhyZWFkLCB3aGVyZSBYWFhYWCBpcyBhIHByaW50YWJsZQotICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtlcm5lbCB0aHJlYWQgaWQuICBXZSdsbCBhbHNvCi0gICAgICAgICAgICAgICBjcmVhdGUgYSAucmVnIHNlY3Rpb24gZm9yIHRoZSB0aHJlYWQgdGhhdCB3YXMgcnVubmluZwotICAgICAgICAgICAgICAgYW5kIHNpZ25hbGxlZCBhdCB0aGUgdGltZSBvZiB0aGUgY29yZS1kdW1wIChpLmUuLCB0aGlzCi0gICAgICAgICAgICAgICBpcyBlZmZlY3RpdmVseSBhbiBhbGlhcywgbmVlZGVkIHRvIGtlZXAgR0RCIGhhcHB5LikKLQotICAgICAgICAgICAgICAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFhYWCcgYXMgb3Bwb3NlZCB0byAnLnJlZ1hYWFhYJwotICAgICAgICAgICAgICAgYmVjYXVzZSBHREIgZXhwZWN0cyB0aGF0IC5yZWcyIHdpbGwgYmUgdGhlIGZsb2F0aW5nLQotICAgICAgICAgICAgICAgcG9pbnQgcmVnaXN0ZXJzLiAqLwotICAgICAgICAgICAgaWYgKGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaGVhZGVyLmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAmcHJvY19pbmZvIC0gKGludCkgJiBwcm9jX2luZm8uaHdfcmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVyZSBhcmUgdGhyZWFkcy4gIElzIHRoaXMgdGhlIG9uZSB0aGF0IGNhdXNlZCB0aGUKLSAgICAgICAgICAgICAgICAgICBjb3JlLWR1bXA/ICBXZSdsbCBjbGFpbSBpdCB3YXMgdGhlIHJ1bm5pbmcgdGhyZWFkLiAqLwotICAgICAgICAgICAgICAgIGlmIChwcm9jX2luZm8uc2lnICE9IC0xKQotICAgICAgICAgICAgICAgICAgewotCQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJCQkgICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkJICAgIGNvcmVfaGVhZGVyLmxlbiwKLQkJCQkJICAgIChpbnQpICZwcm9jX2luZm8gLSAoaW50KSAmIHByb2NfaW5mby5od19yZWdzLAotCQkJCQkgICAgMikpCi0JCSAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFdlIGFsd2F5cyBtYWtlIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgZm9yIGV2ZXJ5IHRocmVhZC4gKi8KLSAgICAgICAgICAgICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkpOwotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2hlYWRlci5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgJnByb2NfaW5mbyAtIChpbnQpICYgcHJvY19pbmZvLmh3X3JlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgfQotCSAgICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBwcm9jX2luZm8uc2lnOwotICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKSAhPSAwKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX0RBVEE6Ci0JY2FzZSBDT1JFX1NUQUNLOgotCWNhc2UgQ09SRV9URVhUOgotCWNhc2UgQ09SRV9NTUY6Ci0JY2FzZSBDT1JFX1NITToKLQljYXNlIENPUkVfQU5PTl9TSE1FTToKLQkgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICBjb3JlX2hlYWRlci5sZW4sIGNvcmVfaGVhZGVyLmFkZHIsIDIpKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgYmZkX3NlZWsgKGFiZmQsIGNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpOwotICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX05PTkU6Ci0gICAgICAgICAgLyogTGV0J3Mgbm90IHB1bnQgaWYgd2UgZW5jb3VudGVyIGEgc2VjdGlvbiBvZiB1bmtub3duCi0gICAgICAgICAgICAgdHlwZS4gIFJhdGhlciwgbGV0J3MgbWFrZSBhIG5vdGUgb2YgaXQuICBJZiB3ZSBsYXRlcgotICAgICAgICAgICAgIHNlZSB0aGF0IHRoZXJlIHdlcmUgYWxzbyAiZ29vZCIgc2VjdGlvbnMsIHRoZW4gd2UnbGwKLSAgICAgICAgICAgICBkZWNsYXJlIHRoYXQgdGhpcyBhIGNvcmUgZmlsZSwgYnV0IHdlJ2xsIGFsc28gd2FybiB0aGF0Ci0gICAgICAgICAgICAgaXQgbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZ2RiLgotICAgICAgICAgICAgICovCi0JICB1bmtub3duX3NlY3Rpb25zKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgCi0gICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyp1bnJlY29nbml6ZWQgY29yZSBmaWxlIHR5cGUgKi8KLQl9Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIFdlcmUgdGhlcmUgc2VjdGlvbnMgb2YgdW5rbm93biB0eXBlPyAgSWYgc28sIHlldCB0aGVyZSB3ZXJlCi0gICAgIGF0IGxlYXN0IHNvbWUgY29tcGxldGUgc2VjdGlvbnMgb2Yga25vd24gdHlwZSwgdGhlbiwgaXNzdWUKLSAgICAgYSB3YXJuaW5nLiAgUG9zc2libHkgdGhlIGNvcmUgZmlsZSB3YXMgZ2VuZXJhdGVkIG9uIGEgdmVyc2lvbgotICAgICBvZiBIUC1VWCB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoYXQgZm9yIHdoaWNoIHRoaXMgZ2RiIHdhcwotICAgICBidWlsdC4KLSAgICAgKi8KLSAgaWYgKCh1bmtub3duX3NlY3Rpb25zID4gMCkgJiYgKGdvb2Rfc2VjdGlvbnMgPiAwKSkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICgiJXMgYXBwZWFycyB0byBiZSBhIGNvcmUgZmlsZSxcbmJ1dCBjb250YWlucyB1bmtub3duIHNlY3Rpb25zLiAgSXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIG9uIGFuIGluY29tcGF0aWJsZVxudmVyc2lvbiBvZiBIUC1VWC4gIEFzIGEgcmVzdWx0LCBzb21lIGluZm9ybWF0aW9uIG1heSBiZSB1bmF2YWlsYWJsZS5cbiIsCi0gICAgICAgYWJmZC0+ZmlsZW5hbWUpOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1ocHV4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWhwdXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1ocHV4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotI2RlZmluZSBocHV4X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwdXhfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHB1eF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHV4X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHV4X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiaHB1eC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGhwdXhfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2kzODZhb3V0LmMgYi9iZmQvaTM4NmFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiMmNmZi4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGUgb25seSAzODYgYW91dCBzeXN0ZW0gd2UgaGF2ZSBoZXJlIGlzIEdPMzIgZnJvbSBESi4gCi0gICBUaGVzZSBudW1iZXJzIG1ha2UgQkZEIHdvcmsgd2l0aCB0aGF0LiBJZiB5b3VyIGFvdXQgMzg2IHN5c3RlbQotICAgZG9lc24ndCB3b3JrIHdpdGggdGhlc2UsIHdlJ2xsIGhhdmUgdG8gc3BsaXQgdGhlbSBpbnRvIGRpZmZlcmVudAotICAgZmlsZXMuICBTZW5kIG1lIChzYWNAY3lnbnVzLmNvbSkgdGhlIHJ1bmVzIHRvIG1ha2UgaXQgd29yayBvbiB5b3VyCi0gICBzeXN0ZW0sIGFuZCBJJ2xsIHN0aWNrIGl0IGluIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNkZWZpbmUgTl9UWFRPRkYoeCkgMHgyMAotI2RlZmluZSBOX1RYVEFERFIoeCkgKE5fTUFHSUMoeCk9PVpNQUdJQyA/IDB4MTAyMCA6IDApCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotI2lmIDAKLSNkZWZpbmUgTl9EQVRBRERSKHgpIChOX01BR0lDKHgpPT1PTUFHSUM/IChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkgOiAoU0VHTUVOVF9TSVpFICsgKCgweDEwMjArKHgpLmFfdGV4dC0xKSAmIH4oU0VHTUVOVF9TSVpFLTEpKSkpCi0jZGVmaW5lIE5PU1VCRVhFQ0IKLQotI2VuZGlmCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgMHg0MDAwMDAKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZhb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4NiIKLSNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAxCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIFdSSVRFX0hFQURFUlMgKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaTM4NmFvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0KLXN0YXRpYyBib29sZWFuIE1ZKHNldF9zaXplcykoKTsKLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIE1ZKGJhY2tlbmRfZGF0YSkgPSB7Ci0gIDAsCQkJCS8qIHptYWdpYyBjb250aWd1b3VzICovCi0gIDEsCQkJCS8qIHRleHQgaW5jbCBoZWFkZXIgKi8KLSAgMCwJCQkJLyogZW50cnkgaXMgdGV4dCBhZGRyZXNzICovCi0gIDAsCQkJCS8qIGV4ZWNfaGRyX2ZsYWdzICovCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWShzZXRfc2l6ZXMpLAotICAxLAkJCQkvKiBleGVjIGhlYWRlciBub3QgY291bnRlZCAqLwotICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCi0gIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCi0gIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KLSAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KLSAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLwotICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KLX07Ci0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZic2QuYyBiL2JmZC9pMzg2YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjhmZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcyB1bmRlciBCU0QuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBkYXRhIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgZm9ybWF0IHVzZWQgdW5kZXIgYWxsIHRoZSB2YXJpb3VzCi0gICBCU0QgcG9ydHMgZm9yIDM4NiBtYWNoaW5lcy4gICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0KLS8qIFpNQUdJQyBmaWxlcyBuZXZlciBoYXZlIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuICAqLwotI2RlZmluZQlOX0hFQURFUl9JTl9URVhUKHgpCTAKLQotLyogWk1BR0lDIGZpbGVzIHN0YXJ0IGF0IGFkZHJlc3MgMC4gIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gUU1BR0lDLiAgKi8KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODYgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2YnNkXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1ic2QiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZkeW5peC5jIGIvYmZkL2kzODZkeW5peC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUwYTE0Li4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2ZHluaXguYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcyB1bmRlciBkeW5peC4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIEJGRCBpcyBjdXJyZW50bHkgb25seSB0ZXN0ZWQgd2l0aCBnZGIsIHdyaXRpbmcgb2JqZWN0IGZpbGVzCi0gICBtYXkgbm90IHdvcmsuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiA0MDk2Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jaW5jbHVkZSAiYW91dC9keW5peDMuaCIKLQotI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODYgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2ZHluaXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWR5bml4IgotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhpMzg2ZHluaXgsXzMyXyx5KQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLSNkZWZpbmUgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luIE5BTUUoaTM4NmR5bml4XzMyXyxzd2FwX2V4ZWNfaGVhZGVyX2luKQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIGFvdXR4LmggcmVxdWlyZXMgZGVmaW5pdGlvbnMgZm9yIE5NQUdJQywgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2RlZmluZSBOTUFHSUMgMAotI2RlZmluZSBCTUFHSUMgT01BR0lDCi0jZGVmaW5lIFFNQUdJQyBYTUFHSUMKLQotI2luY2x1ZGUgImFvdXR4LmgiCi0KLS8qIChBYil1c2Ugc29tZSBmaWVsZHMgaW4gdGhlIGludGVybmFsIGV4ZWMgaGVhZGVyIHRvIGJlIGFibGUgdG8gcmVhZAotICAgZXhlY3V0YWJsZXMgdGhhdCBjb250YWluIHNoYXJlZCBkYXRhLiAgKi8KLQotI2RlZmluZSBhX3NoZGF0YSBhX3Rsb2FkCi0jZGVmaW5lIGFfc2hkcnNpemUgYV9kbG9hZAotCi12b2lkCi1pMzg2ZHluaXhfMzJfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBUaGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgaGFzIHNvbWUgZmllbGRzIHRoYXQgYXJlIHVudXNlZCBpbiB0aGlzCi0gICAgIGNvbmZpZ3VyYXRpb24gKElFIGZvciBpOTYwKSwgc28gZW5zdXJlIHRoYXQgYWxsIHN1Y2ggdW5pbml0aWFsaXplZAotICAgICBmaWVsZHMgYXJlIHplcm8nZCBvdXQuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIHR3byBvZiB0aGVzZSBzdHJ1Y3RzCi0gICAgIGFyZSBtZW1jbXAnZCwgYW5kIHRodXMgdGhlIGNvbnRlbnRzIGRvIG1hdHRlci4gKi8KLSAgbWVtc2V0ICgoUFRSKSBleGVjcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpOwotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotICBleGVjcC0+YV9zaGRhdGEgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc2hkYXRhKTsKLSAgZXhlY3AtPmFfc2hkcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc2hkcnNpemUpOwotfQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2ZnJlZWJzZC5jIGIvYmZkL2kzODZmcmVlYnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjM3MWIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZmcmVlYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEZyZWVCU0QvMzg2IGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4Nl9ORVRCU0QgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2ZnJlZWJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWZyZWVic2QiCi0KLSNpbmNsdWRlICJmcmVlYnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmxpbnV4LmMgYi9iZmQvaTM4NmxpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjJhMTEuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZsaW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzY4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgbGludXggZmxhdm9yZWQgaTM4NiBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSAxMDI0Ci0jZGVmaW5lCVNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkweDAKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtbGludXgiCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYyk7Ci0KLS8qIFdlIGFsd2F5cyBnZW5lcmF0ZSBRTUFHSUMgZmlsZXMgaW4gcHJlZmVyZW5jZSB0byBaTUFHSUMgZmlsZXMuICBJdAotICAgd291bGQgYmUgcG9zc2libGUgdG8gbWFrZSB0aGlzIGEgbGlua2VyIG9wdGlvbiwgaWYgdGhhdCBldmVyCi0gICBiZWNvbWVzIGltcG9ydGFudC4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLXN0YXRpYyBib29sZWFuIGkzODZsaW51eF9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID0gcV9tYWdpY19mb3JtYXQ7Ci0gIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIGkzODZsaW51eF9iZmRfZmluYWxfbGluawotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0MCi0vKiBDb2RlIHRvIGxpbmsgYWdhaW5zdCBMaW51eCBhLm91dCBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi0jaWZuZGVmIEdPVF9SRUZfUFJFRklYCi0jZGVmaW5lCUdPVF9SRUZfUFJFRklYCSJfX0dPVF8iCi0jZW5kaWYKLQotI2RlZmluZSBJU19HT1RfU1lNKG5hbWUpIFwKLSAgKHN0cm5jbXAgKG5hbWUsIEdPVF9SRUZfUFJFRklYLCBzaXplb2YgR09UX1JFRl9QUkVGSVggLSAxKSA9PSAwKQotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jaWZuZGVmIFBMVF9SRUZfUFJFRklYCi0jZGVmaW5lCVBMVF9SRUZfUFJFRklYCSJfX1BMVF8iCi0jZW5kaWYKLQotI2RlZmluZSBJU19QTFRfU1lNKG5hbWUpIFwKLSAgKHN0cm5jbXAgKG5hbWUsIFBMVF9SRUZfUFJFRklYLCBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSA9PSAwKQotCi0vKiBUaGlzIHN0cmluZyBpcyB1c2VkIHRvIGdlbmVyYXRlIHNwZWNpYWxpemVkIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotI2lmbmRlZiBORUVEU19TSFJMSUIKLSNkZWZpbmUgTkVFRFNfU0hSTElCICJfX05FRURTX1NIUkxJQl8iCi0jZW5kaWYKLQotLyogVGhpcyBzcGVjaWFsIHN5bWJvbCBpcyBhIHNldCB2ZWN0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YKLSAgIHBvaW50ZXJzIHRvIGZpeHVwIHRhYmxlcy4gIEl0IHdpbGwgYmUgcHJlc2VudCBpbiBhbnkgZHluYW1pY2x5Ci0gICBsaW5rZWQgZmlsZS4gIFRoZSBsaW5rZXIgZ2VuZXJhdGVkIGZpeHVwIHRhYmxlIHNob3VsZCBhbHNvIGJlIGFkZGVkCi0gICB0byB0aGUgbGlzdCwgYW5kIGl0IHNob3VsZCBhbHdheXMgYXBwZWFyIGluIHRoZSBzZWNvbmQgc2xvdCAodGhlCi0gICBmaXJzdCBvbmUgaXMgYSBkdW1teSB3aXRoIGEgbWFnaWMgbnVtYmVyIHRoYXQgaXMgZGVmaW5lZCBpbgotICAgY3J0MC5vKS4gICovCi0KLSNpZm5kZWYgU0hBUkFCTEVfQ09ORkxJQ1RTCi0jZGVmaW5lIFNIQVJBQkxFX0NPTkZMSUNUUyAiX19TSEFSQUJMRV9DT05GTElDVFNfXyIKLSNlbmRpZgotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBUaGUgdGVybWlub2xvZ3kgaXMgYSBiaXQgc3RyYW5nZSwgYnV0Ci0gICBlYWNoIGZpeHVwIGNvbnRhaW5zIHR3byAzMiBiaXQgbnVtYmVycy4gIEEgcmVndWxhciBmaXh1cCBjb250YWlucwotICAgYW4gYWRkcmVzcyBhbmQgYSBwb2ludGVyLCBhbmQgYXQgcnVudGltZSB3ZSBzaG91bGQgc3RvcmUgdGhlCi0gICBhZGRyZXNzIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBwb2ludGVyLiAgQSBidWlsdGluIGZpeHVwCi0gICBjb250YWlucyB0d28gcG9pbnRlcnMsIGFuZCB3ZSBzaG91bGQgcmVhZCB0aGUgYWRkcmVzcyB1c2luZyBvbmUKLSAgIHBvaW50ZXIgYW5kIHN0b3JlIGl0IGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBvdGhlcgotICAgcG9pbnRlci4gIEJ1aWx0aW4gZml4dXBzIGNvbWUgaW50byBwbGF5IHdoZW4gd2UgaGF2ZSBkdXBsaWNhdGUKLSAgIF9fR09UX18gc3ltYm9scyBmb3IgdGhlIHNhbWUgdmFyaWFibGUuICBUaGUgYnVpbHRpbiBmaXh1cCB3aWxsIGNvcHkKLSAgIHRoZSBHT1QgcG9pbnRlciBmcm9tIG9uZSBvdmVyIGludG8gdGhlIG90aGVyLiAgKi8KLQotc3RydWN0IGZpeHVwCi17Ci0gIHN0cnVjdCBmaXh1cCAqbmV4dDsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBqdW1wIGluc3RydWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQsCi0gICAgIHplcm8gaWYgdGhpcyBpcyBqdXN0IGEgcG9pbnRlciAqLwotICBjaGFyIGp1bXA7Ci0KLSAgY2hhciBidWlsdGluOwotfTsKLQotLyogV2UgZG9uJ3QgbmVlZCBhIHNwZWNpYWwgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUsIGJ1dCB3ZSBkbyBuZWVkCi0gICB0byBrZWVwIHNvbWUgaW5mb3JtYXRpb24gYmV0d2VlbiBsaW5rZXIgcGFzc2VzLCBzbyB3ZSB1c2UgYSBzcGVjaWFsCi0gICBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLX07Ci0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogRmlyc3QgZHluYW1pYyBvYmplY3QgZm91bmQgaW4gbGluay4gICovCi0gIGJmZCAqZHlub2JqOwotCi0gIC8qIE51bWJlciBvZiBmaXh1cHMuICAqLwotICBzaXplX3QgZml4dXBfY291bnQ7Ci0KLSAgLyogTnVtYmVyIG9mIGJ1aWx0aW4gZml4dXBzLiAgKi8KLSAgc2l6ZV90IGxvY2FsX2J1aWx0aW5zOwotCi0gIC8qIExpc3Qgb2YgZml4dXBzLiAgKi8KLSAgc3RydWN0IGZpeHVwICpmaXh1cF9saXN0OwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbGludXhfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHN0cnVjdCBmaXh1cCAqbmV3X2ZpeHVwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfdGFsbHlfc3ltYm9scwotICBQQVJBTVMgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0JIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzOyB0aGVyZSBhcmVuJ3QgYW55LiAgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICBpZiAoISBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpICgmcmV0LT5yb290LCBhYmZkLAotCQkJCQkgbGludXhfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+ZHlub2JqID0gTlVMTDsKLSAgcmV0LT5maXh1cF9jb3VudCA9IDA7Ci0gIHJldC0+bG9jYWxfYnVpbHRpbnMgPSAwOwotICByZXQtPmZpeHVwX2xpc3QgPSBOVUxMOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGFvdXRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLQkJCSAgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBMaW51eCBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgbGludXhfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXcgZml4dXAuICAqLwotCi1zdGF0aWMgc3RydWN0IGZpeHVwICoKLW5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsIGJ1aWx0aW4pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBpbnQgYnVpbHRpbjsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotCi0gIGYgPSAoc3RydWN0IGZpeHVwICopIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgZml4dXApKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICByZXR1cm4gZjsKLSAgZi0+bmV4dCA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OwotICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdCA9IGY7Ci0gIGYtPmggPSBoOwotICBmLT52YWx1ZSA9IHZhbHVlOwotICBmLT5idWlsdGluID0gYnVpbHRpbjsKLSAgZi0+anVtcCA9IDA7Ci0gICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OwotICByZXR1cm4gZjsKLX0KLQotLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgcmVhbGl6ZSB0aGF0IHdlIGFyZSBnb2luZyB0byBsaW5rIHRvIGEgc2hhcmVkCi0gICBsaWJyYXJ5LiAgV2UgbmVlZCB0byBjcmVhdGUgYSBzcGVjaWFsIHNlY3Rpb24gdGhhdCBjb250YWlucyB0aGUKLSAgIGZpeHVwIHRhYmxlLCBhbmQgd2UgdWx0aW1hdGVseSBuZWVkIHRvIGFkZCBhIHBvaW50ZXIgdG8gdGhpcyBpbnRvCi0gICB0aGUgc2V0IHZlY3RvciBmb3IgU0hBUkFCTEVfQ09ORkxJQ1RTLiAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QKLSAgIGtub3cgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24sIGJ1dCB0aGF0J3MgT0sgLSB3ZSBqdXN0IG5lZWQgdG8KLSAgIGNyZWF0ZSBpdCBmb3Igbm93LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBzZXQgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZy4gICovCi0gIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLQotICAvKiBXZSBjaG9vc2UgdG8gdXNlIHRoZSBuYW1lICIubGludXgtZHluYW1pYyIgZm9yIHRoZSBmaXh1cCB0YWJsZS4KLSAgICAgV2h5IG5vdD8gKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcy0+X3Jhd19zaXplID0gMDsKLSAgcy0+Y29udGVudHMgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBhZGQgYSBzaW5nbGUgc3ltYm9sIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoaXMgaXMKLSAgIGEgd3JhcHBlciBhcm91bmQgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgd2hpY2ggaGFuZGxlcyB0aGUKLSAgIHR3ZWFraW5nIG5lZWRlZCBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLAotCQkgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGluc2VydDsKLQotICAvKiBMb29rIHVwIGFuZCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLgotICAgICBJZiB3ZSBkbywgYW5kIHRoZSBkZWZpbmluZyBlbnRyeSBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHdlCi0gICAgIG5lZWQgdG8gY3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zLgotCi0gICAgIEZJWE1FOiBXaGF0IGlmIGFiZmQtPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcj8gIFdlIG1heSB3YW50IHRvCi0gICAgIGJlIGFibGUgdG8gbGluayBMaW51eCBhLm91dCBhbmQgRUxGIG9iamVjdHMgdG9nZXRoZXIsIGJ1dCBzZXJpb3VzCi0gICAgIGNvbmZ1c2lvbiBpcyBwb3NzaWJsZS4gICovCi0KLSAgaW5zZXJ0ID0gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgU0hBUkFCTEVfQ09ORkxJQ1RTKSA9PSAwCi0gICAgICAmJiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBpZiAoISBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgICAgIGluc2VydCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCBmYWxzZSwKLQkJCQkgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLQkgIGlmIChoYXNocCAhPSBOVUxMKQotCSAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCSAgZiA9IG5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsICEgSVNfUExUX1NZTSAobmFtZSkpOwotCSAgaWYgKGYgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZi0+anVtcCA9IElTX1BMVF9TWU0gKG5hbWUpOwotCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAotCQkJCQkgIGhhc2hwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW5zZXJ0IGEgcG9pbnRlciB0byBvdXIgdGFibGUgaW4gdGhlIHNldCB2ZWN0b3IuICBUaGUgZHluYW1pYwotICAgICBsaW5rZXIgcmVxdWlyZXMgdGhpcyBpbmZvcm1hdGlvbiAqLwotICBpZiAoaW5zZXJ0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBIZXJlIHdlIGRvIG91ciBzcGVjaWFsIHRoaW5nIHRvIGFkZCB0aGUgcG9pbnRlciB0byB0aGUKLQkgZHluYW1pYyBzZWN0aW9uIGluIHRoZSBTSEFSQUJMRV9DT05GTElDVFMgc2V0IHZlY3Rvci4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkJICAgIi5saW51eC1keW5hbWljIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCBTSEFSQUJMRV9DT05GTElDVFMsCi0JICAgICAgQlNGX0dMT0JBTCB8IEJTRl9DT05TVFJVQ1RPUiwgcywgMCwgTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2Ugd2lsbCBjcmF3bCB0aGUgaGFzaCB0YWJsZSBhbmQgY29tZSBoZXJlIGZvciBldmVyeSBnbG9iYWwgc3ltYm9sLgotICAgV2Ugd2lsbCBleGFtaW5lIGVhY2ggZW50cnkgYW5kIHNlZSBpZiB0aGVyZSBhcmUgaW5kaWNhdGlvbnMgdGhhdCB3ZQotICAgbmVlZCB0byBhZGQgYSBmaXh1cC4gIFRoZXJlIGFyZSB0d28gcG9zc2libGUgY2FzZXMgLSBvbmUgaXMgd2hlcmUKLSAgIHlvdSBoYXZlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBvZiBQTFQgb3IgR09UIHN5bWJvbHMgLSB0aGVzZSB3aWxsCi0gICBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQgYW5kIGFkZGVkIGFzICJidWlsdGluIiBmaXh1cHMuICBJZiB3ZSBmaW5kCi0gICB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIG5vbiBQTFQvR09UIHN5bWJvbCBpcyBhbHNvIHByZXNlbnQsIHdlCi0gICBjb252ZXJ0IGl0IHRvIGEgcmVndWxhciBmaXh1cCBpbnN0ZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgbGludXhfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X3RhbGx5X3N5bWJvbHMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgZml4dXAgKmYsICpmMTsKLSAgaW50IGlzX3BsdDsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDEsICpoMjsKLSAgYm9vbGVhbiBleGlzdHM7Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiBzdHJuY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIE5FRURTX1NIUkxJQiwKLQkJICBzaXplb2YgTkVFRFNfU0hSTElCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciAqcDsKLSAgICAgIGNoYXIgKmFsbG9jID0gTlVMTDsKLQotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyArIHNpemVvZiBORUVEU19TSFJMSUIgLSAxOwotICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICdfJyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotCWFsbG9jID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICBpZiAocCA9PSBOVUxMIHx8IGFsbG9jID09IE5VTEwpCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iKSwKLQkJCSAgICAgICBuYW1lKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJjcHkgKGFsbG9jLCBuYW1lKTsKLQkgIHAgPSBzdHJyY2hyIChhbGxvYywgJ18nKTsKLQkgICpwKysgPSAnXDAnOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMuc28uJXMnXG4iKSwKLQkgICAgIGFsbG9jLCBwKTsKLQkgIGZyZWUgKGFsbG9jKTsKLQl9Ci0KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgYSBQTFQvR09ULCB3ZSBkbyBub3QgZXZlbiBuZWVkIHRvIGxvb2sgYXQgaXQgKi8KLSAgaXNfcGx0ID0gSVNfUExUX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQotICBpZiAoaXNfcGx0IHx8IElTX0dPVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZykpCi0gICAgewotICAgICAgLyogTG9vayB1cCB0aGlzIHN5bWJvbCB0d2ljZS4gIE9uY2UganVzdCBhcyBhIHJlZ3VsYXIgbG9va3VwLAotCSBhbmQgdGhlbiBhZ2FpbiBmb2xsb3dpbmcgYWxsIG9mIHRoZSBpbmRpcmVjdCBsaW5rcyB1bnRpbCB3ZQotCSByZWFjaCBhIHJlYWwgc3ltYm9sLiAgKi8KLSAgICAgIGgxID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAvKiBoMiBkb2VzIG5vdCBmb2xsb3cgaW5kaXJlY3Qgc3ltYm9scy4gKi8KLSAgICAgIGgyID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJCSAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLQkJCQkgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogVGhlIHJlYWwgc3ltYm9sIG11c3QgZXhpc3QgYnV0IGlmIGl0IGlzIGFsc28gYW4gQUJTIHN5bWJvbCwKLQkgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgZml4dXAuICBUaGlzIGlzIGJlY2F1c2UgdGhleSBib3RoCi0JIGNhbWUgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LiAgSWYgb24gdGhlIG90aGVyIGhhbmQsIHdlIGhhZCB0bwotCSB1c2UgYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGdldCB0byB0aGUgcmVhbCBzeW1ib2wsIHdlIGFkZCB0aGUKLQkgZml4dXAgYW55d2F5LCBzaW5jZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlc2Ugc3ltYm9scyBjb21lCi0JIGZyb20gZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICAgIGlmIChoMSAhPSBOVUxMCi0JICAmJiAoKChoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCXx8IGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoMS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCSAgICAgIHx8IGgyLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KSkKLQl7Ci0JICAvKiBTZWUgaWYgdGhlcmUgaXMgYSAiYnVpbHRpbiIgZml4dXAgYWxyZWFkeSBwcmVzZW50Ci0JICAgICBpbnZvbHZpbmcgdGhpcyBzeW1ib2wuICBJZiBzbywgY29udmVydCBpdCB0byBhIHJlZ3VsYXIKLQkgICAgIGZpeHVwLiAgSW4gdGhlIGVuZCwgdGhpcyByZWxheGVzIHNvbWUgb2YgdGhlIHJlcXVpcmVtZW50cwotCSAgICAgYWJvdXQgdGhlIG9yZGVyIG9mIHBlcmZvcm1pbmcgZml4dXBzLiAgKi8KLQkgIGV4aXN0cyA9IGZhbHNlOwotCSAgZm9yIChmMSA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OwotCSAgICAgICBmMSAhPSBOVUxMOwotCSAgICAgICBmMSA9IGYxLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKChmMS0+aCAhPSBoICYmIGYxLT5oICE9IGgxKQotCQkgIHx8ICghIGYxLT5idWlsdGluICYmICEgZjEtPmp1bXApKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoZjEtPmggPT0gaDEpCi0JCWV4aXN0cyA9IHRydWU7Ci0JICAgICAgaWYgKCEgZXhpc3RzCi0JCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JCXsKLQkJICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgZjEtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0JCSAgZi0+anVtcCA9IGlzX3BsdDsKLQkJfQotCSAgICAgIGYxLT5oID0gaDE7Ci0JICAgICAgZjEtPmp1bXAgPSBpc19wbHQ7Ci0JICAgICAgZjEtPmJ1aWx0aW4gPSAwOwotCSAgICAgIGV4aXN0cyA9IHRydWU7Ci0JICAgIH0KLQkgIGlmICghIGV4aXN0cwotCSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0JICAgICAgaWYgKGYgPT0gTlVMTCkKLQkJewotCQkgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFF1aWNrIGFuZCBkaXJ0eSB3YXkgb2Ygc3RyaXBwaW5nIHRoZXNlIHN5bWJvbHMgZnJvbSB0aGUKLQkgc3ltdGFiLiAqLwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCWgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIC5saW51eC1keW5hbWljIHNlY3Rpb24gaXMuCi0gICBJdCBpcyBjYWxsZWQgYnkgdGhlIExpbnV4IGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24KLSAgIHJvdXRpbmUuICBXZSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgYW5kIG5vdwotICAgd2UganVzdCBzY2FuIHRoZSBoYXNoIHRhYmxlcyB0byBmaW5kIG91dCBob3cgbWFueSBhZGRpdGlvbmFsIGZpeHVwcwotICAgYXJlIHJlcXVpcmVkLiAgKi8KLQotYm9vbGVhbgotYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRmlyc3QgZmluZCB0aGUgZml4dXBzLi4uICovCi0gIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgbGludXhfdGFsbHlfc3ltYm9scywKLQkJCSAgICAoUFRSKSBpbmZvKTsKLQotICAvKiBJZiB0aGVyZSBhcmUgYnVpbHRpbiBmaXh1cHMsIGxlYXZlIHJvb20gZm9yIGEgbWFya2VyLiAgVGhpcyBpcwotICAgICB1c2VkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciBzbyB0aGF0IGl0IGtub3dzIHRoYXQgYWxsIHRoYXQgZm9sbG93Ci0gICAgIGFyZSBidWlsdGluIGZpeHVwcyBpbnN0ZWFkIG9mIHJlZ3VsYXIgZml4dXBzLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JewotCSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGluczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBmaXh1cCB0YWJsZS4gIFdlIHdpbGwgZmlsbCBpdCBpbiBsYXRlci4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCSAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT5fcmF3X3NpemUgPSA4ICsgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICogODsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSBhcmUgcmVhZHkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGZpeHVwIHRhYmxlIHRvCi0gICB0aGUgb3V0cHV0IGZpbGUuICBTY2FuIHRoZSBmaXh1cCB0YWJsZXMgYW5kIHNvIGZvcnRoIGFuZCBnZW5lcmF0ZQotICAgdGhlIHN0dWZmIHdlIG5lZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfZmluaXNoX2R5bmFtaWNfbGluayAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnMsICpvcywgKmlzOwotICBiZmRfYnl0ZSAqZml4dXBfdGFibGU7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgdW5zaWduZWQgaW50IG5ld19hZGRyOwotICBpbnQgc2VjdGlvbl9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBmaXh1cHNfd3JpdHRlbjsKLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCSAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLSAgZml4dXBzX3dyaXR0ZW4gPSAwOwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICBwcmludGYgKCJGaXh1cCB0YWJsZSBmaWxlIG9mZnNldDogJXggIFZNQTogJXhcbiIsIAotCSAgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCSAgb3MtPnZtYSArIHMtPm91dHB1dF9vZmZzZXQpOwotI2VuZGlmCi0KLSAgZml4dXBfdGFibGUgPSBzLT5jb250ZW50czsKLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50LCBmaXh1cF90YWJsZSk7Ci0gIGZpeHVwX3RhYmxlICs9IDQ7Ci0KLSAgLyogRmlsbCBpbiBmaXh1cCB0YWJsZS4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0JICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkZpeHVwKCVkKSAlczogJXggJXhcbiIsZi0+anVtcCwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLQkgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLSAgICAgIGlmIChmLT5qdW1wKQotCXsKLQkgIC8qIFJlbGF0aXZlIGFkZHJlc3MgKi8KLQkgIG5ld19hZGRyID0gbmV3X2FkZHIgLSAoZi0+dmFsdWUgKyA1KTsgCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlICsgMSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQl9Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zICE9IDApCi0gICAgewotICAgICAgLyogU3BlY2lhbCBtYXJrZXIgc28gd2Uga25vdyB0byBzd2l0Y2ggdG8gdGhlIG90aGVyIHR5cGUgb2YgZml4dXAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCXsKLQkgIGlmICghIGYtPmJ1aWx0aW4pCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0JCSBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0JICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotCSAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCQkgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgICsrZml4dXBzX3dyaXR0ZW47Ci0JfQotICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAhPSBmaXh1cHNfd3JpdHRlbikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iKSk7Ci0gICAgICB3aGlsZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gZml4dXBzX3dyaXR0ZW4pCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgICB9Ci0KLSAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCSAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAotCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBpcyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkJ1aWx0aW4gZml4dXAgdGFibGUgYXQgJXhcbiIsIG5ld19hZGRyKTsKLSNlbmRpZgotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIG91dHB1dF9iZmQpCi0gICAgICAhPSBzLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgbGludXhfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0KLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bHlueC5jIGIvYmZkL2kzODZseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTlkZDAuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzIHVuZGVyIEx5bnhPUy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWx5bngiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBXUklURV9IRUFERVJTCi0jZGVmaW5lIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApCQkJCQkgICAgICBcCi0gICAgICB7CQkJCQkJCQkJICAgICAgXAotCWJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJICAgICAgXAotCWZpbGVfcHRyIHRleHRfZW5kOwkJCQkJCSAgICAgIFwKLQlpZiAoYWRhdGEoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQkJCSAgICAgIFwKLQkgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOyAgICAgXAotICAgIAkJCQkJCQkJCSAgICAgIFwKLQlleGVjcC0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwkgICAgICBcCi0JZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwkJCSAgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICAgICBcCi0JCQkgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJICAgICAgXAotCWV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgICAgIFwKLQlpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkgICAgICBcCi0JICAgICE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgICAgIFwKLQkvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgICAgXAotICAJCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAgICAgXAotCQkgICE9IDApCQkJCQkJCSAgICAgIFwKLQkgICAgICAgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCEgTkFNRShhb3V0LHdyaXRlX3N5bXMpKGFiZmQpKSByZXR1cm4gZmFsc2U7CQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICAgIGlmICghTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkgICBcCi0JCXJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gMDsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCFOQU1FKGx5bngsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpICAgIFwKLQkJcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkgICAgfQkJCQkJCQkJICAgICAgXAotICAgICAgfQotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotDAotCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0KLWV4dGVybiByZWxvY19ob3d0b190eXBlIGFvdXRfMzJfZXh0X2hvd3RvX3RhYmxlW107Ci1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhb3V0XzMyX3N0ZF9ob3d0b190YWJsZVtdOwotCi0vKiBTdGFuZGFyZCByZWxvYyBzdHVmZiAqLwotLyogT3V0cHV0IHN0YW5kYXJkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi12b2lkCi1OQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRCAoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemU7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLSAgcl9wY3JlbCA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsJLyogUmVsYXRpdmUgdG8gUEM/ICovCi0gIC8qIHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZT8/PyAgRklYTUUtc29vbiAqLwotICByX2Jhc2VyZWwgPSAwOwotICByX2ptcHRhYmxlID0gMDsKLSAgcl9yZWxhdGl2ZSA9IDA7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT5LRUVQSVQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCXwgKHJfcGNyZWwgPyBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCXwgKHJfYmFzZXJlbCA/IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHIDogMCkKLQl8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHIDogMCkKLQl8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHIDogMCkKLQl8IChyX2xlbmd0aCA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkocl9leHRlcm4gPyBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFIDogMCkKLQl8IChyX3BjcmVsID8gUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQl8IChyX2Jhc2VyZWwgPyBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSA6IDApCi0JfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSA6IDApCi0JfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSA6IDApCi0JfCAocl9sZW5ndGggPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotfQotCi0KLS8qIEV4dGVuZGVkIHN0dWZmICovCi0vKiBPdXRwdXQgZXh0ZW5kZWQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhIGZpbGUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICovCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfaW5kZXggPSAoKmctPnN5bV9wdHJfcHRyKS0+S0VFUElUOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCXwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKHJfZXh0ZXJuID8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLSAgICB9Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIHJfYWRkZW5kLCBuYXRwdHItPnJfYWRkZW5kKTsKLX0KLQotLyogQkZEIGRlYWxzIGludGVybmFsbHkgd2l0aCBhbGwgdGhpbmdzIGJhc2VkIGZyb20gdGhlIHNlY3Rpb24gdGhleSdyZQotICAgaW4uIHNvLCBzb21ldGhpbmcgaW4gMTAgYnl0ZXMgaW50byBhIHRleHQgc2VjdGlvbiAgd2l0aCBhIGJhc2Ugb2YKLSAgIDUwIHdvdWxkIGhhdmUgYSBzeW1ib2wgKC50ZXh0KzEwKSBhbmQga25vdyAudGV4dCB2bWEgd2FzIDUwLgotCi0gICBBb3V0IGtlZXBzIGFsbCBpdCdzIHN5bWJvbHMgYmFzZWQgZnJvbSB6ZXJvLCBzbyB0aGUgc3ltYm9sIHdvdWxkCi0gICBjb250YWluIDYwLiBUaGlzIG1hY3JvIHN1YnMgdGhlIGJhc2Ugb2YgZWFjaCBzZWN0aW9uIGZyb20gdGhlIHZhbHVlCi0gICB0byBnaXZlIHRoZSB0cnVlIG9mZnNldCBmcm9tIHRoZSBzZWN0aW9uICovCi0KLQotI2RlZmluZSBNT1ZFX0FERFJFU1MoYWQpICAgICAgIAkJCQkJCVwKLSAgaWYgKHJfZXh0ZXJuKSB7CQkJCQkJCVwKLSAgIC8qIHVuZGVmaW5lZCBzeW1ib2wgKi8JCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgcl9pbmRleDsJCQlcCi0gICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICB9IGVsc2UgewkJCQkJCQkJXAotICAgIC8qIGRlZmluZWQsIHNlY3Rpb24gcmVsYXRpdmUuIHJlcGxhY2Ugc3ltYm9sIHdpdGggcG9pbnRlciB0byAgICAJXAotICAgICAgIHN5bWJvbCB3aGljaCBwb2ludHMgdG8gc2VjdGlvbiAgKi8JCQkJXAotICAgIHN3aXRjaCAocl9pbmRleCkgewkJCQkJCQlcCi0gICAgY2FzZSBOX1RFWFQ6CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkICAtIHN1LT50ZXh0c2VjLT52bWE7CQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgY2FzZSBOX0RBVEE6CQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX2RhdGFzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmRhdGFzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fQlNTOgkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfYnNzc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAtIHN1LT5ic3NzZWMtPnZtYTsJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgZGVmYXVsdDoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQUJTOgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoJCQkJCQkJXAotICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgfSAgICAgCQkJCQkJCQlcCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gKEdFVF9TV09SRCAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcykpOwotCi0gIHJfaW5kZXggPSBieXRlcy0+cl9pbmRleFsxXTsKLSAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHKSk7Ci0gIHJfdHlwZSA9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHOwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBhb3V0XzMyX2V4dF9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgTU9WRV9BRERSRVNTIChHRVRfU1dPUkQgKGFiZmQsIGJ5dGVzLT5yX2FkZGVuZCkpOwotfQotCi12b2lkCi1OQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9iYXNlcmVsLCByX2ptcHRhYmxlLCByX3JlbGF0aXZlOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0KLSAgcl9pbmRleCA9IGJ5dGVzLT5yX2luZGV4WzFdOwotICByX2V4dGVybiA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgcl9wY3JlbCA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICByX2Jhc2VyZWwgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRykpOwotICByX2ptcHRhYmxlID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKSk7Ci0gIHJfcmVsYXRpdmUgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcpKTsKLSAgcl9sZW5ndGggPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQotICAgID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUc7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IGFvdXRfMzJfc3RkX2hvd3RvX3RhYmxlICsgcl9sZW5ndGggKyA0ICogcl9wY3JlbDsKLSAgLyogRklYTUUtc29vbjogIFJvbGwgYmFzZXJlbCwgam1wdGFibGUsIHJlbGF0aXZlIGJpdHMgaW50byBob3d0byBzZXR0aW5nICovCi0KLSAgTU9WRV9BRERSRVNTICgwKTsKLX0KLQotLyogUmVsb2MgaGFja2VyeSAqLwotCi1ib29sZWFuCi1OQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIFBUUiByZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotICBzaXplX3QgZWFjaF9zaXplOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotZG9pdDoKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIGNvdW50ID0gcmVsb2Nfc2l6ZSAvIGVhY2hfc2l6ZTsKLQotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX21hbGxvYyAoY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKCFyZWxvY19jYWNoZSAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtc2V0IChyZWxvY19jYWNoZSwgMCwgY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvY3MgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jcyAmJiByZWxvY19zaXplICE9IDApCi0gICAgewotICAgICAgZnJlZSAocmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKHJlbG9jcywgMSwgcmVsb2Nfc2l6ZSwgYWJmZCkgIT0gcmVsb2Nfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NzKTsKLSAgICAgIGZyZWUgKHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVhY2hfc2l6ZSA9PSBSRUxPQ19FWFRfU0laRSkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpycHRyID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2NzOwotICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgICAgYXJlbGVudCAqY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0KLSAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLQl7Ci0JICBOQU1FKGx5bngsc3dhcF9leHRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcnB0ciA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHJlbG9jczsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgICAgIGFyZWxlbnQgKmNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JewotCSAgTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJCQliZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0JfQotCi0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0vKiBXcml0ZSBvdXQgYSByZWxvY2F0aW9uIHNlY3Rpb24gaW50byBhbiBvYmplY3QgZmlsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUobHlueCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICB1bnNpZ25lZCBjaGFyICpuYXRpdmUsICpuYXRwdHI7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0KLSAgdW5zaWduZWQgaW50IGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHNpemVfdCBuYXRzaXplOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OwotICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKLSAgaWYgKCFuYXRpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKG5hdHB0ciA9IG5hdGl2ZTsKLQkgICBjb3VudCAhPSAwOwotCSAgIC0tY291bnQsIG5hdHB0ciArPSBlYWNoX3NpemUsICsrZ2VuZXJpYykKLQlOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgKmdlbmVyaWMsIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIG5hdHB0cik7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgbmF0aXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUgKi8KLWxvbmcKLU5BTUUobHlueCxjYW5vbmljYWxpemVfcmVsb2MpIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmICghKHRibHB0ciB8fCBOQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCi0JewotCSAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQl7Ci0JICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQl9Ci0gICAgfQotICAqcmVscHRyID0gMDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIE5BTUUobHlueCxjYW5vbmljYWxpemVfcmVsb2MpCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZtYWNoMy5jIGIvYmZkL2kzODZtYWNoMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmY3NTgyLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bWFjaDMuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyBmb3IgTWFjaCAzLCB3aGljaCB1c2VzIGEub3V0LCBub3QgTWFjaC1PLiAgKi8KLQotLyogVGhlcmUgaXMgbm8gbWFnaWMgbnVtYmVyIG9yIGFueXRoaW5nIHdoaWNoIGxldHMgdXMgZGlzdGluZ3Vpc2ggdGhpcyB0YXJnZXQKLSAgIGZyb20gaTM4NmFvdXQgb3IgaTM4NmJzZC4gIFNvIHRoaXMgdGFyZ2V0IGlzIG9ubHkgdXNlZnVsIGlmIGl0IGlzIHRoZQotICAgZGVmYXVsdCB0YXJnZXQuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJMQotI2RlZmluZQlTRUdNRU5UX1NJWkUJMHgxMDAwCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkweDEwMDAwCi0jZGVmaW5lIEFSQ0ggMzIKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0vKiBUaGlzIG1hY3JvIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBOX01BR0lDKHgpID09IFpNQUdJQy4gICovCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMQotCi0jZGVmaW5lIE5fVFhUU0laRSh4KQkoKHgpLmFfdGV4dCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2bWFjaDNfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tYWNoMyIKLQotc3RhdGljIGJvb2xlYW4gTVkoc2V0X3NpemVzKSgpOwotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJk1ZKGJhY2tlbmRfZGF0YSkKLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgMCwJCQkJLyogem1hZ2ljIGNvbnRpZ3VvdXMgKi8KLSAgMSwJCQkJLyogdGV4dCBpbmNsIGhlYWRlciAqLwotICAwLAkJCQkvKiBlbnRyeSBpcyB0ZXh0IGFkZHJlc3MgKi8KLSAgMCwJCQkJLyogZXhlY19oZHJfZmxhZ3MgKi8KLSAgMCwJCQkJLyogdGV4dCB2bWE/ICovCi0gIE1ZKHNldF9zaXplcyksCi0gIDEsCQkJCS8qIGV4ZWMgaGVhZGVyIG5vdCBjb3VudGVkICovCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm1zZG9zLmMgYi9iZmQvaTM4Nm1zZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWM4NjQuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZtc2Rvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTVMtRE9TIGV4ZWN1dGFibGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEJyeWFuIEZvcmQgb2YgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2lmIDAKLXN0cnVjdCBleGVfaGVhZGVyCi17Ci0JdW5zaWduZWQgc2hvcnQgbWFnaWM7Ci0JdW5zaWduZWQgc2hvcnQgYnl0ZXNfaW5fbGFzdF9wYWdlOwotCXVuc2lnbmVkIHNob3J0IG5wYWdlczsJLyogbnVtYmVyIG9mIDUxMi1ieXRlICJwYWdlcyIgaW5jbHVkaW5nIHRoaXMgaGVhZGVyICovCi0JdW5zaWduZWQgc2hvcnQgbnJlbG9jczsKLQl1bnNpZ25lZCBzaG9ydCBoZWFkZXJfcGFyYXM7CS8qIG51bWJlciBvZiAxNi1ieXRlIHBhcmFncmFwaHMgaW4gaGVhZGVyICovCi0JdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQ7Ci0JdW5zaWduZWQgc2hvcnQgbG9hZF9zd2l0Y2g7Ci0JdW5zaWduZWQgc2hvcnQgc3Nfb2ZzOwotCXVuc2lnbmVkIHNob3J0IHNwOwotCXVuc2lnbmVkIHNob3J0IGNoZWNrc3VtOwotCXVuc2lnbmVkIHNob3J0IGlwOwotCXVuc2lnbmVkIHNob3J0IGNzX29mczsKLQl1bnNpZ25lZCBzaG9ydCByZWxvY19vZnM7Ci0JdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQyOwotCXVuc2lnbmVkIHNob3J0IHNvbWV0aGluZzE7Ci0JdW5zaWduZWQgc2hvcnQgc29tZXRoaW5nMjsKLQl1bnNpZ25lZCBzaG9ydCBzb21ldGhpbmczOwotfTsKLSNlbmRpZgotCi0jZGVmaW5lIEVYRV9NQUdJQwkweDVhNGQKLSNkZWZpbmUgRVhFX0xPQURfSElHSAkweDAwMDAKLSNkZWZpbmUgRVhFX0xPQURfTE9XCTB4ZmZmZgotI2RlZmluZSBFWEVfUEFHRV9TSVpFCTUxMgotCi0KLXN0YXRpYyBpbnQKLW1zZG9zX3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBleGVjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbXNkb3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBjaGFyIGhkcltFWEVfUEFHRV9TSVpFXTsKLSAgZmlsZV9wdHIgb3V0ZmlsZV9zaXplID0gc2l6ZW9mKGhkcik7Ci0gIGJmZF92bWEgaGlnaF92bWEgPSAwOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIC8qIEZpbmQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHByb2dyYW0gb24gZGlzayBhbmQgaW4gbWVtb3J5LiAgKi8KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSA9PSAwKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpCi0gICAgICAgIHsKLQkgIGJmZF92bWEgc2VjX3ZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkgIAkJICAgICsgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOwotCSAgaWYgKHNlY192bWEgPiBoaWdoX3ZtYSkKLQkgICAgaGlnaF92bWEgPSBzZWNfdm1hOwotCX0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfTE9BRCkKLSAgICAgICAgewotCSAgZmlsZV9wdHIgc2VjX2VuZCA9IHNpemVvZihoZHIpCi0JICAJCSAgICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOwotCSAgaWYgKHNlY19lbmQgPiBvdXRmaWxlX3NpemUpCi0JICAgIG91dGZpbGVfc2l6ZSA9IHNlY19lbmQ7Ci0JfQotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIHByb2dyYW0gaXNuJ3QgdG9vIGJpZy4gICovCi0gIGlmIChoaWdoX3ZtYSA+IChiZmRfdm1hKTB4ZmZmZikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBjb25zdGFudHMgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIEVYRV9NQUdJQywgJmhkclswXSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBFWEVfUEFHRV9TSVpFIC8gMTYsICZoZHJbOF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgRVhFX0xPQURfTE9XLCAmaGRyWzEyXSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAweDNlLCAmaGRyWzI0XSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAweDAwMDEsICZoZHJbMjhdKTsgLyogWFhYPz8/ICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAweDMwZmIsICZoZHJbMzBdKTsgLyogWFhYPz8/ICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAweDcyNmEsICZoZHJbMzJdKTsgLyogWFhYPz8/ICovCi0KLSAgLyogYnl0ZXMgaW4gbGFzdCBwYWdlICgwID0gZnVsbCBwYWdlKSAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgb3V0ZmlsZV9zaXplICYgKEVYRV9QQUdFX1NJWkUgLSAxKSwgJmhkclsyXSk7Ci0KLSAgLyogbnVtYmVyIG9mIHBhZ2VzICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAob3V0ZmlsZV9zaXplICsgRVhFX1BBR0VfU0laRSAtIDEpIC8gRVhFX1BBR0VfU0laRSwKLSAgCSAgICAgICAmaGRyWzRdKTsKLQotICAvKiBTZXQgdGhlIGluaXRpYWwgc3RhY2sgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBic3MuCi0gICAgIFRoZSBwcm9ncmFtJ3MgY3J0MCBjb2RlIG11c3QgcmVsb2NhdGUgaXQgdG8gYSByZWFsIHN0YWNrLiAgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGhpZ2hfdm1hLCAmaGRyWzE2XSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKGhkciwgMSwgc2l6ZW9mKGhkciksIGFiZmQpICE9IHNpemVvZihoZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW1zZG9zX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlY3Rpb24tPmZpbGVwb3MgPSBFWEVfUEFHRV9TSVpFICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbikgJiBTRUNfTE9BRCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLSNkZWZpbmUgbXNkb3NfbWtvYmplY3QgYW91dF8zMl9ta29iamVjdAotI2RlZmluZSBtc2Rvc19tYWtlX2VtcHR5X3N5bWJvbCBhb3V0XzMyX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIG1zZG9zX2JmZF9yZWxvY190eXBlX2xvb2t1cCBhb3V0XzMyX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUJbXNkb3NfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIG1zZG9zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBtc2Rvc19uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIG1zZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBtc2Rvc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIG1zZG9zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbXNkb3NfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBtc2Rvc19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgbXNkb3NfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgbXNkb3NfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgbXNkb3NfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgbXNkb3NfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIG1zZG9zX3NldF9hcmNoX21hY2ggX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2gKLQotI2RlZmluZSBtc2Rvc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgbXNkb3NfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIG1zZG9zX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgbXNkb3NfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBtc2Rvc19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBtc2Rvc19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgbXNkb3NfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgbXNkb3NfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBtc2Rvc19yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgbXNkb3NfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBtc2Rvc19jYW5vbmljYWxpemVfcmVsb2MgX2JmZF9ub3JlbG9jc19jYW5vbmljYWxpemVfcmVsb2MKLSNkZWZpbmUgbXNkb3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfbm9yZWxvY3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG1zZG9zXzMyX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBpMzg2bXNkb3NfdmVjID0KLXsKLSAgIm1zZG9zIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEVYRUNfUCksCQkJLyogb2JqZWN0IGZsYWdzICovCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBtc2Rvc19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgbXNkb3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAobXNkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAobXNkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAobXNkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvYmZkL2kzODZuZXRic2QuYyBiL2JmZC9pMzg2bmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyN2I2ZjkuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lCURFRkFVTFRfTUlEIAlNXzM4Nl9ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2b3M5ay5jIGIvYmZkL2kzODZvczlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWRlZTUuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZvczlrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBvczkwMDAgaTM4NiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgIm9zOWsuaCIKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKm9zOWtfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIHRha2VuIGZyb20gYSByYXcgYnl0ZQotICAgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIgc3RydWN0dXJlLiAgKi8KLWJvb2xlYW4KLW9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBtaF9jb20gKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0gIHVuc2lnbmVkIGludCBkbG9hZCwgZG1lbXNpemUsIGRtZW1zdGFydDsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBieXRlcy0+bV9zeW5jKTsKLSAgZXhlY3AtPmFfc3ltcyA9IDA7Ci0gIGV4ZWNwLT5hX2VudHJ5ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+bV9leGVjKTsKLSAgZXhlY3AtPmFfdGFsaWduID0gMjsKLSAgZXhlY3AtPmFfZGFsaWduID0gMjsKLSAgZXhlY3AtPmFfYmFsaWduID0gMjsKLQotICBkbG9hZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1faWRhdGEpOwotICBleGVjcC0+YV9kYXRhID0gZGxvYWQgKyA4OwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBkbG9hZCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoJmRtZW1zdGFydCwgc2l6ZW9mIChkbWVtc3RhcnQpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChkbWVtc3RhcnQpKQotICAgICAgfHwgKGJmZF9yZWFkICgmZG1lbXNpemUsIHNpemVvZiAoZG1lbXNpemUpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChkbWVtc2l6ZSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjcC0+YV90bG9hZCA9IDA7Ci0gIGV4ZWNwLT5hX2Rsb2FkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZG1lbXN0YXJ0KTsKLSAgZXhlY3AtPmFfdGV4dCA9IGRsb2FkIC0gZXhlY3AtPmFfdGxvYWQ7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZkbWVtc2l6ZSk7Ci0gIGV4ZWNwLT5hX2JzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1fZGF0YSkgLSBleGVjcC0+YV9kYXRhOwotCi0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IDA7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlIGludG8gdGhlCi0gICBzdXBwbGllZCBidWZmZXIgcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4gICovCi0KLVBST1RPICh2b2lkLCBvczlrX3N3YXBfZXhlY19oZWFkZXJfb3V0LAotICAgICAgICAgKGJmZCAqIGFiZmQsCi0JICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqIGV4ZWNwLAotCSAgc3RydWN0IG1oX2NvbSAqIHJhd19ieXRlcykpOwotdm9pZAotb3M5a19zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIG1oX2NvbSAqcmF3X2J5dGVzOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvLCBieXRlcy0+ZV9pbmZvKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90ZXh0LCBieXRlcy0+ZV90ZXh0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9kYXRhLCBieXRlcy0+ZV9kYXRhKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9ic3MsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfc3ltcywgYnl0ZXMtPmVfc3ltcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZW50cnksIGJ5dGVzLT5lX2VudHJ5KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3Rsb2FkLCBieXRlcy0+ZV90bG9hZCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZGxvYWQsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgYnl0ZXMtPmVfdGFsaWduWzBdID0gZXhlY3AtPmFfdGFsaWduOwotICBieXRlcy0+ZV9kYWxpZ25bMF0gPSBleGVjcC0+YV9kYWxpZ247Ci0gIGJ5dGVzLT5lX2JhbGlnblswXSA9IGV4ZWNwLT5hX2JhbGlnbjsKLSAgYnl0ZXMtPmVfcmVsYXhhYmxlWzBdID0gZXhlY3AtPmFfcmVsYXhhYmxlOwotfQotCi0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vczlrX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgbWhfY29tIGV4ZWNfYnl0ZXM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIE1IQ09NX0JZVEVTX1NJWkUsIDEsIGFiZmQpCi0gICAgICAhPSBNSENPTV9CWVRFU19TSVpFKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhbmV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleGVjX2J5dGVzLm1fc3luYyk7Ci0gIGlmIChOX0JBRE1BRyAoYW5leGVjKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoISBvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsICZleGVjX2J5dGVzLCAmYW5leGVjKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgb3M5a19jYWxsYmFjayk7Ci19Ci0KLQotLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQotICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3M5a19jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGxvbmcgYnNzX3N0YXJ0OwotCi0gIC8qIEFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9pMzg2LCAwKTsKLQotICAvKiBUaGUgcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAwOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gMDsKLQotICAvKiBUaGUgYWxpZ25tZW50cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV90YWxpZ247Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfZGFsaWduOwotICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfYmFsaWduOwotCi0gIC8qIFRoZSBzdGFydGluZyBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV90bG9hZDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV9kbG9hZDsKLQotICAvKiBBbmQgcmVsb2FkIHRoZSBzaXplcywgc2luY2UgdGhlIGFvdXQgbW9kdWxlIHphcHMgdGhlbSAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX3RleHQ7Ci0KLSAgYnNzX3N0YXJ0ID0gZXhlY3AtPmFfZGxvYWQgKyBleGVjcC0+YV9kYXRhOwkvKiBCU1MgPSBlbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSBhbGlnbl9wb3dlciAoYnNzX3N0YXJ0LCBleGVjcC0+YV9iYWxpZ24pOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gZXhlY3AtPmFfZW50cnk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IGV4ZWNwLT5hX2Rsb2FkOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICoqKgotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUk9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gIE5fRFJPRkYoKmV4ZWNwKTsKLSAgKi8KLQotICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMTsJLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAxOy8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gTUhDT01fQllURVNfU0laRTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2lmIDAKLXN0cnVjdCBib3V0X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBhb3V0ZGF0YSBhOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLW9zOWtfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKLQotICByYXdwdHIgPSAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG9ial9ic3NzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vczlrX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLQotICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfaW5mbyA9IEJNQUdJQzsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzID0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoc3RydWN0IG5saXN0KTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RhbGlnbiA9IG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfZGFsaWduID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9iYWxpZ24gPSBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90bG9hZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBleGVjX2hkciAoYWJmZCktPmFfZGxvYWQgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICBib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjX2hkciAoYWJmZCksICZzd2FwcGVkX2hkcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIHN3YXBwZWRfaGRyLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0JICAhPSBFWEVDX0JZVEVTX1NJWkUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1NZTU9GRiAoKmV4ZWNfaGRyIChhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWFvdXRfMzJfd3JpdGVfc3ltcyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fVFJPRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fRFJPRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1vczlrX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7CQkJCS8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MKLQkrIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gICAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpIGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgPT0gY291bnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgaW50Ci1vczlrX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBvczlrX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgb3M5a19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIG9zOWtfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIG9zOWtfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgb3M5a19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBvczlrX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIG9zOWtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IGkzODZvczlrX3ZlYyA9Ci17Ci0gICJpMzg2b3M5ayIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X29zOWtfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGRyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBXUF9URVhUKSwJLyogb2JqZWN0IGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBvczlrX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgYmZkX2ZhbHNlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgYmZkX2ZhbHNlLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAob3M5ayksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvaWVlZS5jIGIvYmZkL2llZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5ZDcyNC4uMDAwMDAwMAotLS0gYS9iZmQvaWVlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk3OSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGllZWUtNjk1IG9iamVjdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBLRUVQTUlOVVNQQ0lOSU5TVCAwCi0KLS8qIElFRUUgNjk1IGZvcm1hdCBpcyBhIHN0cmVhbSBvZiByZWNvcmRzLCB3aGljaCB3ZSBwYXJzZSB1c2luZyBhIHNpbXBsZSBvbmUtCi0gICB0b2tlbiAod2hpY2ggaXMgb25lIGJ5dGUgaW4gdGhpcyBsZXhpY29uKSBsb29rYWhlYWQgcmVjdXJzaXZlIGRlY2VudAotICAgcGFyc2VyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImllZWUuaCIKLSNpbmNsdWRlICJsaWJpZWVlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2J5dGUgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV8yYnl0ZXMgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9pbnQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaWQgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hLCBhc3ltYm9sICosIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgaWVlZV93cml0ZV9pbnQ1IFBBUkFNUyAoKGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaW50NV9vdXQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRoX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZG9fYXNfcmVwZWF0IFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRob3V0X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2RhdGFfcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX21lX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfcHJvY2Vzc29yIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfZGVidWcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBpZWVlIGZpbGVzIGluIHRoZSBzdHJhbmdlIHdheSB0aGF0IHRoZQotICAgc3RhbmRhcmQgcmVxdWlyZXMuICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGJhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJhcmc7Ci17Ci0gIGJmZF9ieXRlIGJ5dGU7Ci0KLSAgYnl0ZSA9IGJhcmc7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZieXRlLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJ5dGVzOwotewotICBiZmRfYnl0ZSBidWZmZXJbMl07Ci0KLSAgYnVmZmVyWzBdID0gYnl0ZXMgPj4gODsKLSAgYnVmZmVyWzFdID0gYnl0ZXMgJiAweGZmOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIDIsIGFiZmQpICE9IDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50IChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAodmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgICAgIC8qIEhvdyBtYW55IHNpZ25pZmljYW50IGJ5dGVzID8gKi8KLSAgICAgIC8qIEZJWE1FIEZPUiBMT05HRVIgSU5UUyAqLwotICAgICAgaWYgKHZhbHVlICYgMHhmZjAwMDAwMCkKLQlsZW5ndGggPSA0OwotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwZmYwMDAwKQotCWxlbmd0aCA9IDM7Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDAwMGZmMDApCi0JbGVuZ3RoID0gMjsKLSAgICAgIGVsc2UKLQlsZW5ndGggPSAxOwotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgIChiZmRfYnl0ZSkgKChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtCi0JCQkJCSArIGxlbmd0aCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAobGVuZ3RoKQotCXsKLQljYXNlIDQ6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlID4+IDI0KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAzOgotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSA+PiAxNikpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMjoKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUgPj4gOCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMToKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2lkIChhYmZkLCBpZCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICppZDsKLXsKLSAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbiAoaWQpOwotCi0gIGlmIChsZW5ndGggPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDI1NSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDY1NTM1KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIChpbnQpIGxlbmd0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3RyaW5nIHRvbyBsb25nICglZCBjaGFycywgbWF4IDY1NTM1KSIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGVuZ3RoKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGlkLCAxLCBsZW5ndGgsIGFiZmQpICE9IGxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRnVuY3Rpb25zIGZvciByZWFkaW5nIGZyb20gaWVlZSBmaWxlcyBpbiB0aGUgc3RyYW5nZSB3YXkgdGhhdCB0aGUKLXN0YW5kYXJkIHJlcXVpcmVzOgotKi8KLQotI2RlZmluZSB0aGlzX2J5dGUoaWVlZSkgKigoaWVlZSktPmlucHV0X3ApCi0jZGVmaW5lIG5leHRfYnl0ZShpZWVlKSAoKGllZWUpLT5pbnB1dF9wKyspCi0jZGVmaW5lIHRoaXNfYnl0ZV9hbmRfbmV4dChpZWVlKSAoKigoaWVlZSktPmlucHV0X3ArKykpCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAotcmVhZF8yYnl0ZXMgKGllZWUpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLXsKLSAgdW5zaWduZWQgY2hhciBjMSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gIHVuc2lnbmVkIGNoYXIgYzIgPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICByZXR1cm4gKGMxIDw8IDgpIHwgYzI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZ2V0X3N0cmluZyAoaWVlZSwgc3RyaW5nLCBsZW5ndGgpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmluZ1tpXSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX2lkIChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGNoYXIgKnN0cmluZzsKLSAgbGVuZ3RoID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgaWYgKGxlbmd0aCA8PSAweDdmKQotICAgIHsKLSAgICAgIC8qIFNpbXBsZSBzdHJpbmcgb2YgbGVuZ3RoIDAgdG8gMTI3ICovCi0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZSkKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCBieXRlLCBhbGxvd2luZyAwLi4yNTUgKi8KLSAgICAgIGxlbmd0aCA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZikKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCB0d28gYnl0ZXMsIGFsbG93aW5nIDAuLjY1NTM1ICovCi0gICAgICBsZW5ndGggPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgICAgbGVuZ3RoID0gKGxlbmd0aCAqIDI1NikgKyB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgIH0KLSAgLyogQnV5IG1lbW9yeSBhbmQgcmVhZCBzdHJpbmcgKi8KLSAgc3RyaW5nID0gYmZkX2FsbG9jIChpZWVlLT5hYmZkLCBsZW5ndGggKyAxKTsKLSAgaWYgKCFzdHJpbmcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGJmZF9nZXRfc3RyaW5nIChpZWVlLCBzdHJpbmcsIGxlbmd0aCk7Ci0gIHN0cmluZ1tsZW5ndGhdID0gMDsKLSAgcmV0dXJuIHN0cmluZzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiBwY3JlbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICB1bnNpZ25lZCBpbnQgdGVybV9jb3VudCA9IDA7Ci0KLSAgaWYgKHZhbHVlICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50Kys7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBEZWYgb2YgYSBjb21tb24gc3ltYm9sICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfWF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdGVybV9jb3VudCsrOwotICAgIH0KLSAgZWxzZSBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogUmVmIHRvIGRlZmluZWQgc3ltYm9sIC0gKi8KLQotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9JX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgKEJTRl9MT0NBTCB8IEJTRl9TRUNUSU9OX1NZTSkpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgbG9jYWwgc3ltYm9sLiAgV2UgY2FuCi0JICAgICBlYXNpbHkgZG8gYSBsb2NhbCBhcyBhIHNlY3Rpb24rb2Zmc2V0LiAgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9SX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQkgIGlmIChzeW1ib2wtPnZhbHVlICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICB0ZXJtX2NvdW50Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5yZWNvZ25pemVkIHN5bWJvbCBgJXMnIGZsYWdzIDB4JXgiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCSAgICAgc3ltYm9sLT5mbGFncyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIC8qIHN1YnRyYWN0IHRoZSBwYyBmcm9tIGhlcmUgYnkgYXNraW5nIGZvciBQQyBvZiB0aGlzIHNlY3Rpb24qLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1BfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKGluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgYSAwIGFkZHJlc3MuICAqLwotICBpZiAodGVybV9jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHdoaWxlICh0ZXJtX2NvdW50ID4gMSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50LS07Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotd3JpdGVzIGFueSBpbnRlZ2VyIGludG8gdGhlIGJ1ZmZlciBzdXBwbGllZCBhbmQgYWx3YXlzIHRha2VzIDUgYnl0ZXMKLSovCi1zdGF0aWMgdm9pZAotaWVlZV93cml0ZV9pbnQ1IChidWZmZXIsIHZhbHVlKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBidWZmZXJbMF0gPSAoYmZkX2J5dGUpIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW07Ci0gIGJ1ZmZlclsxXSA9ICh2YWx1ZSA+PiAyNCkgJiAweGZmOwotICBidWZmZXJbMl0gPSAodmFsdWUgPj4gMTYpICYgMHhmZjsKLSAgYnVmZmVyWzNdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKLSAgYnVmZmVyWzRdID0gKHZhbHVlID4+IDApICYgMHhmZjsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50NV9vdXQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGJmZF9ieXRlIGJbNV07Ci0KLSAgaWVlZV93cml0ZV9pbnQ1IChiLCB2YWx1ZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGIsIDEsIDUsIGFiZmQpICE9IDUpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2ludCAoaWVlZSwgdmFsdWVfcHRyKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJmZF92bWEgKnZhbHVlX3B0cjsKLXsKLSAgaW50IHZhbHVlID0gdGhpc19ieXRlIChpZWVlKTsKLSAgaW50IHJlc3VsdDsKLSAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgICp2YWx1ZV9wdHIgPSB2YWx1ZTsKLSAgICAgIG5leHRfYnl0ZSAoaWVlZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlID49IDB4ODAgJiYgdmFsdWUgPD0gMHg4OCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSB2YWx1ZSAmIDB4ZjsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICBuZXh0X2J5dGUgKGllZWUpOwotICAgICAgd2hpbGUgKGNvdW50KQotCXsKLQkgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotCSAgY291bnQtLTsKLQl9Ci0gICAgICAqdmFsdWVfcHRyID0gcmVzdWx0OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX2kgKGllZWUsIG9rKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJvb2xlYW4gKm9rOwotewotICBiZmRfdm1hIHg7Ci0gICpvayA9IHBhcnNlX2ludCAoaWVlZSwgJngpOwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGJmZF92bWEKLW11c3RfcGFyc2VfaW50IChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIGJmZF92bWEgcmVzdWx0OwotICBCRkRfQVNTRVJUIChwYXJzZV9pbnQgKGllZWUsICZyZXN1bHQpID09IHRydWUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfdm1hIHZhbHVlOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci19IGllZWVfdmFsdWVfdHlwZTsKLQotCi0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIGFyZwotI2RlZmluZSBQQ1JFTF9PRkZTRVQgZmFsc2UKLQotI2Vsc2UKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIDAKLSNkZWZpbmUgUENSRUxfT0ZGU0VUIHRydWUKLQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFiczMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIDAsCi0JICJhYnMzMiIsCi0JIHRydWUsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWJzMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczE2IiwKLQkgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwKLQkgMHgwMDAwZmZmZiwKLQkgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhYnM4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczgiLAotCSB0cnVlLAotCSAweDAwMDAwMGZmLAotCSAweDAwMDAwMGZmLAotCSBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJlbDMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIDAsCi0JICJyZWwzMiIsCi0JIHRydWUsCi0JIFNSQ19NQVNLICgweGZmZmZmZmZmKSwKLQkgMHhmZmZmZmZmZiwKLQkgUENSRUxfT0ZGU0VUKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmVsMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDE2IiwKLQkgdHJ1ZSwKLQkgU1JDX01BU0sgKDB4MDAwMGZmZmYpLAotCSAweDAwMDBmZmZmLAotCSBQQ1JFTF9PRkZTRVQpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByZWw4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDgiLAotCSB0cnVlLAotCSBTUkNfTUFTSyAoMHgwMDAwMDBmZiksCi0JIDB4MDAwMDAwZmYsCi0JIFBDUkVMX09GRlNFVCk7Ci0KLXN0YXRpYyBpZWVlX3N5bWJvbF9pbmRleF90eXBlIE5PU1lNQk9MID0gezAsIDB9OwotCi1zdGF0aWMgdm9pZAotcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGV4dHJhLCBzZWN0aW9uKQotICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLSAgICAgYmZkX3ZtYSAqdmFsdWU7Ci0gICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiAqcGNyZWw7Ci0gICAgIHVuc2lnbmVkIGludCAqZXh0cmE7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbjsKLQotewotI2RlZmluZSBQT1Mgc3BbMV0KLSNkZWZpbmUgVE9TIHNwWzBdCi0jZGVmaW5lIE5PUyBzcFstMV0KLSNkZWZpbmUgSU5DIHNwKys7Ci0jZGVmaW5lIERFQyBzcC0tOwotCi0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGllZWVfdmFsdWVfdHlwZSBzdGFja1sxMF07Ci0KLSAgLyogVGhlIHN0YWNrIHBvaW50ZXIgYWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCB1bnVzZWQgbG9jYXRpb24gKi8KLSNkZWZpbmUgUFVTSCh4LHkseikgVE9TLnN5bWJvbD14O1RPUy5zZWN0aW9uPXk7VE9TLnZhbHVlPXo7SU5DOwotI2RlZmluZSBQT1AoeCx5LHopIERFQzt4PVRPUy5zeW1ib2w7eT1UT1Muc2VjdGlvbjt6PVRPUy52YWx1ZTsKLSAgaWVlZV92YWx1ZV90eXBlICpzcCA9IHN0YWNrOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1BfZW51bToKLQkgIC8qIFAgdmFyaWFibGUsIGN1cnJlbnQgcHJvZ3JhbSBjb3VudGVyIGZvciBzZWN0aW9uIG4gKi8KLQkgIHsKLQkgICAgaW50IHNlY3Rpb25fbjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgKnBjcmVsID0gdHJ1ZTsKLQkgICAgc2VjdGlvbl9uID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICBQVVNIIChOT1NZTUJPTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgaWVlZV92YXJpYWJsZV9MX2VudW06Ci0JICAvKiBMIHZhcmlhYmxlICBhZGRyZXNzIG9mIHNlY3Rpb24gTiAqLwotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIFBVU0ggKE5PU1lNQk9MLCBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0sIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQkgIC8qIFIgdmFyaWFibGUsIGxvZ2ljYWwgYWRkcmVzcyBvZiBzZWN0aW9uIG1vZHVsZSAqLwotCSAgLyogRklYTUUsIHRoaXMgc2hvdWxkIGJlIGRpZmZlcmVudCB0byBMICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsIGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXSwgMCk7Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfU19lbnVtOgotCSAgLyogUyB2YXJpYWJsZSwgc2l6ZSBpbiBNQVVTIG9mIHNlY3Rpb24gbW9kdWxlICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsCi0JCTAsCi0JCWllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXS0+X3Jhd19zaXplKTsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YXJpYWJsZV9JX2VudW06Ci0JICAvKiBQdXNoIHRoZSBhZGRyZXNzIG9mIHZhcmlhYmxlIG4gKi8KLQkgIHsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgc3kuaW5kZXggPSAoaW50KSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmxldHRlciA9ICdJJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfWF9lbnVtOgotCSAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiBleHRlcm5hbCB2YXJpYWJsZSBuICovCi0JICB7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmluZGV4ID0gKGludCkgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSk7Ci0JICAgIHN5LmxldHRlciA9ICdYJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX3VuZF9zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfZnVuY3Rpb25fbWludXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xLCAqc2VjdGlvbl9kdW1teTsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5LCBzZWN0aW9uMSwgdmFsdWUxKTsKLQkgICAgUE9QIChzeSwgc2VjdGlvbl9kdW1teSwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3ksIHNlY3Rpb24xID8gc2VjdGlvbjEgOiBzZWN0aW9uX2R1bW15LCB2YWx1ZTIgLSB2YWx1ZTEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjI7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5MSwgc2VjdGlvbjEsIHZhbHVlMSk7Ci0JICAgIFBPUCAoc3kyLCBzZWN0aW9uMiwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3kxLmxldHRlciA/IHN5MSA6IHN5MiwKLQkJICBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24xKSA/IHNlY3Rpb24yIDogc2VjdGlvbjEsCi0JCSAgdmFsdWUxICsgdmFsdWUyKTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgdmE7Ci0JICAgIEJGRF9BU1NFUlQgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPCAoaW50KSBpZWVlX3ZhcmlhYmxlX0FfZW51bQotCQkgICAgfHwgdGhpc19ieXRlICgmKGllZWUtPmgpKSA+IChpbnQpIGllZWVfdmFyaWFibGVfWl9lbnVtKTsKLQkgICAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhKSkKLQkgICAgICB7Ci0JCVBVU0ggKE5PU1lNQk9MLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB2YSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKgotCQkgIFRoYXRzIGFsbCB0aGF0IHdlIGNhbiB1bmRlcnN0YW5kLiBBcyBmYXIgYXMgSSBjYW4gc2VlCi0JCSAgdGhlcmUgaXMgYSBidWcgaW4gdGhlIE1pY3JvdGVjIElFRUUgb3V0cHV0IHdoaWNoIEknbQotCQkgIHVzaW5nIHRvIHNjYW4sIHdoZXJlYnkgdGhlIGNvbW1hIG9wZXJhdG9yIGlzIG9taXR0ZWQKLQkJICBzb21ldGltZXMgaW4gYW4gZXhwcmVzc2lvbiwgZ2l2aW5nIGV4cHJlc3Npb25zIHdpdGggdG9vCi0JCSAgbWFueSB0ZXJtcy4gV2UgY2FuIHRlbGwgaWYgdGhhdCdzIHRoZSBjYXNlIGJ5IGVuc3VyaW5nCi0JCSAgdGhhdCBzcCA9PSBzdGFjayBoZXJlLiBJZiBub3QsIHRoZW4gd2UndmUgcHVzaGVkCi0JCSAgc29tZXRoaW5nIHRvbyBmYXIsIHNvIHdlIGtlZXAgYWRkaW5nLiAgKi8KLQotCQl3aGlsZSAoc3AgIT0gc3RhY2sgKyAxKQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpzZWN0aW9uMTsKLQkJICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCQkgICAgUE9QIChzeTEsIHNlY3Rpb24xLCAqZXh0cmEpOwotCQkgIH0KLQkJewotCQkgIGFzZWN0aW9uICpkdW1teTsKLQotCQkgIFBPUCAoKnN5bWJvbCwgZHVtbXksICp2YWx1ZSk7Ci0JCSAgaWYgKHNlY3Rpb24pCi0JCSAgICAqc2VjdGlvbiA9IGR1bW15OwotCQl9Ci0KLQkJbG9vcCA9IGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0gICAgfQotfQotCi0KLSNkZWZpbmUgaWVlZV9zZWVrKGFiZmQsIG9mZnNldCkgXAotICBJRUVFX0RBVEEoYWJmZCktPmguaW5wdXRfcCA9IElFRUVfREFUQShhYmZkKS0+aC5maXJzdF9ieXRlICsgb2Zmc2V0Ci0KLSNkZWZpbmUgaWVlZV9wb3MoYWJmZCkgXAotICAoSUVFRV9EQVRBKGFiZmQpLT5oLmlucHV0X3AgLSBJRUVFX0RBVEEoYWJmZCktPmguZmlyc3RfYnl0ZSkKLQotc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2luZGV4Owotc3RhdGljIGNoYXIgbGFzdF90eXBlOwkJLyogaXMgdGhlIGluZGV4IGZvciBhbiBYIG9yIGEgRCAqLwotCi1zdGF0aWMgaWVlZV9zeW1ib2xfdHlwZSAqCi1nZXRfc3ltYm9sIChhYmZkLAotCSAgICBpZWVlLAotCSAgICBsYXN0X3N5bWJvbCwKLQkgICAgc3ltYm9sX2NvdW50LAotCSAgICBwcHRyLAotCSAgICBtYXhfaW5kZXgsCi0JICAgIHRoaXNfdHlwZQotKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gICAgIGllZWVfc3ltYm9sX3R5cGUgKmxhc3Rfc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgKnN5bWJvbF9jb3VudDsKLSAgICAgaWVlZV9zeW1ib2xfdHlwZSAqKipwcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKm1heF9pbmRleDsKLSAgICAgY2hhciB0aGlzX3R5cGUKLSAgICAgIDsKLXsKLSAgLyogTmVlZCBhIG5ldyBzeW1ib2wgKi8KLSAgdW5zaWduZWQgaW50IG5ld19pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLSAgaWYgKG5ld19pbmRleCAhPSBsYXN0X2luZGV4IHx8IHRoaXNfdHlwZSAhPSBsYXN0X3R5cGUpCi0gICAgewotICAgICAgaWVlZV9zeW1ib2xfdHlwZSAqbmV3X3N5bWJvbCA9IChpZWVlX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoaWVlZS0+aC5hYmZkLAotCQkJCQkJIHNpemVvZiAoaWVlZV9zeW1ib2xfdHlwZSkpOwotICAgICAgaWYgKCFuZXdfc3ltYm9sKQotCXJldHVybiBOVUxMOwotCi0gICAgICBuZXdfc3ltYm9sLT5pbmRleCA9IG5ld19pbmRleDsKLSAgICAgIGxhc3RfaW5kZXggPSBuZXdfaW5kZXg7Ci0gICAgICAoKnN5bWJvbF9jb3VudCkrKzsKLSAgICAgICoqcHB0ciA9IG5ld19zeW1ib2w7Ci0gICAgICAqcHB0ciA9ICZuZXdfc3ltYm9sLT5uZXh0OwotICAgICAgaWYgKG5ld19pbmRleCA+ICptYXhfaW5kZXgpCi0JewotCSAgKm1heF9pbmRleCA9IG5ld19pbmRleDsKLQl9Ci0gICAgICBsYXN0X3R5cGUgPSB0aGlzX3R5cGU7Ci0gICAgICBuZXdfc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICByZXR1cm4gbmV3X3N5bWJvbDsKLSAgICB9Ci0gIHJldHVybiBsYXN0X3N5bWJvbDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGZpbGVfcHRyIG9mZnNldCA9IGllZWUtPncuci5leHRlcm5hbF9wYXJ0OwotCi0gIGllZWVfc3ltYm9sX3R5cGUgKipwcmV2X3N5bWJvbHNfcHRyID0gJmllZWUtPmV4dGVybmFsX3N5bWJvbHM7Ci0gIGllZWVfc3ltYm9sX3R5cGUgKipwcmV2X3JlZmVyZW5jZV9wdHIgPSAmaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlOwotICBpZWVlX3N5bWJvbF90eXBlICpzeW1ib2wgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50ID0gMDsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLSAgbGFzdF9pbmRleCA9IDB4ZmZmZmZmOwotICBpZWVlLT5zeW1ib2xfdGFibGVfZnVsbCA9IHRydWU7Ci0KLSAgaWVlZV9zZWVrIChhYmZkLCBvZmZzZXQpOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JY2FzZSBpZWVlX25uX3JlY29yZDoKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgIHN5bWJvbCA9IGdldF9zeW1ib2wgKGFiZmQsIGllZWUsIHN5bWJvbCwgJnN5bWJvbF9jb3VudCwKLQkJCSAgICAgICAmcHJldl9zeW1ib2xzX3B0ciwKLQkJCSAgICAgICAmaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCwgJ0knKTsKLQkgIGlmIChzeW1ib2wgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzeW1ib2wtPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQkgIHN5bWJvbC0+c3ltYm9sLm5hbWUgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLQkgIHN5bWJvbC0+c3ltYm9sLnVkYXRhLnAgPSAoUFRSKSBOVUxMOwotCSAgc3ltYm9sLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0JICBicmVhazsKLQljYXNlIGllZWVfZXh0ZXJuYWxfc3ltYm9sX2VudW06Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICBzeW1ib2wgPSBnZXRfc3ltYm9sIChhYmZkLCBpZWVlLCBzeW1ib2wsICZzeW1ib2xfY291bnQsCi0JCQkgICAgICAgJnByZXZfc3ltYm9sc19wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXgsICdEJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgQkZEX0FTU0VSVCAoc3ltYm9sLT5pbmRleCA+PSBpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4KTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX05PX0ZMQUdTOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2F0dHJpYnV0ZV9yZWNvcmRfZW51bSA+PiA4OgotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfaW5kZXg7Ci0JICAgIHVuc2lnbmVkIGludCBzeW1ib2xfdHlwZV9pbmRleDsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9hdHRyaWJ1dGVfZGVmOwotCSAgICBiZmRfdm1hIHZhbHVlOwotCSAgICBzd2l0Y2ggKHJlYWRfMmJ5dGVzIChpZWVlKSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBpZWVlX2F0dHJpYnV0ZV9yZWNvcmRfZW51bToKLQkJc3ltYm9sX25hbWVfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCXN5bWJvbF90eXBlX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQlzeW1ib2xfYXR0cmlidXRlX2RlZiA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJc3dpdGNoIChzeW1ib2xfYXR0cmlidXRlX2RlZikKLQkJICB7Ci0JCSAgY2FzZSA4OgotCQkgIGNhc2UgMTk6Ci0JCSAgICBwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgICAoXygiJXM6IHVuaW1wbGVtZW50ZWQgQVRJIHJlY29yZCAgJXUgZm9yIHN5bWJvbCAldSIpLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN5bWJvbF9hdHRyaWJ1dGVfZGVmLAotCQkgICAgICAgc3ltYm9sX25hbWVfaW5kZXgpOwotCQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfaW5mb19yZWNvcmRfZW51bToKLQkJLyogU2tpcCBvdmVyIEFUWCByZWNvcmQuICovCi0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBpZWVlX2F0bl9yZWNvcmRfZW51bToKLQkJLyogV2UgbWF5IGdldCBjYWxsIG9wdGltaXphdGlvbiBpbmZvcm1hdGlvbiBoZXJlLAotCQkgICB3aGljaCB3ZSBqdXN0IGlnbm9yZS4gIFRoZSBmb3JtYXQgaXMKLQkJICAgeyRGMX0ke0NFfXtpbmRleH17JDAwfXskM0Z9eyQzRn17I19vZl9BU05zfSAqLwotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQlpZiAodmFsdWUgIT0gMHgzZikKLQkJICB7Ci0JCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgICAgKF8oIiVzOiB1bmV4cGVjdGVkIEFUTiB0eXBlICVkIGluIGV4dGVybmFsIHBhcnQiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKGludCkgdmFsdWUpOwotCQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQl3aGlsZSAodmFsdWUgPiAwKQotCQkgIHsKLQkJICAgIGJmZF92bWEgdmFsMTsKLQotCQkgICAgLS12YWx1ZTsKLQotCQkgICAgc3dpdGNoIChyZWFkXzJieXRlcyAoaWVlZSkpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSBpZWVlX2Fzbl9yZWNvcmRfZW51bToKLQkJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWwxKTsKLQkJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWwxKTsKLQkJCWJyZWFrOwotCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgKF8oIiVzOiB1bmV4cGVjdGVkIHR5cGUgYWZ0ZXIgQVROIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YWx1ZV9yZWNvcmRfZW51bSA+PiA4OgotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfaW5kZXg7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3ltYm9sX2lnbm9yZTsKLQkgICAgYm9vbGVhbiBwY3JlbF9pZ25vcmU7Ci0JICAgIHVuc2lnbmVkIGludCBleHRyYTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBzeW1ib2xfbmFtZV9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwKLQkJCSAgICAgICZzeW1ib2wtPnN5bWJvbC52YWx1ZSwKLQkJCSAgICAgICZzeW1ib2xfaWdub3JlLAotCQkJICAgICAgJnBjcmVsX2lnbm9yZSwKLQkJCSAgICAgICZleHRyYSwKLQkJCSAgICAgICZzeW1ib2wtPnN5bWJvbC5zZWN0aW9uKTsKLQotCSAgICAvKiBGdWxseSBsaW5rZWQgSUVFRS02OTUgZmlsZXMgdGVuZCB0byBnaXZlIGV2ZXJ5IHN5bWJvbAotICAgICAgICAgICAgICAgYW4gYWJzb2x1dGUgdmFsdWUuICBUcnkgdG8gY29udmVydCB0aGF0IGJhY2sgaW50byBhCi0gICAgICAgICAgICAgICBzZWN0aW9uIHJlbGF0aXZlIHZhbHVlLiAgRklYTUU6IFRoaXMgd29uJ3QgYWx3YXlzIHRvCi0gICAgICAgICAgICAgICB0aGUgcmlnaHQgdGhpbmcuICAqLwotCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uKQotCQkmJiAoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpID09IDApCi0JICAgICAgewotCQliZmRfdm1hIHZhbDsKLQkJYXNlY3Rpb24gKnM7Ci0KLQkJdmFsID0gc3ltYm9sLT5zeW1ib2wudmFsdWU7Ci0JCWZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCQkgIHsKLQkJICAgIGlmICh2YWwgPj0gcy0+dm1hICYmIHZhbCA8IHMtPnZtYSArIHMtPl9yYXdfc2l6ZSkKLQkJICAgICAgewotCQkJc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IHM7Ci0JCQlzeW1ib2wtPnN5bWJvbC52YWx1ZSAtPSBzLT52bWE7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgc3ltYm9sLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVDsKLQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3dlYWtfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgc2l6ZTsKLQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgLyogVGhyb3cgYXdheSB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlIGluZGV4ICovCi0JICAgICh2b2lkKSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIC8qIEZldGNoIHRoZSBkZWZhdWx0IHNpemUgaWYgbm90IHJlc29sdmVkICovCi0JICAgIHNpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIC8qIEZldGNoIHRoZSBkZWZhdXRsdCB2YWx1ZSBpZiBhdmFpbGFibGUgKi8KLQkgICAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKSA9PSBmYWxzZSkKLQkgICAgICB7Ci0JCXZhbHVlID0gMDsKLQkgICAgICB9Ci0JICAgIC8qIFRoaXMgdHVybnMgaW50byBhIGNvbW1vbiAqLwotCSAgICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgc3ltYm9sLT5zeW1ib2wudmFsdWUgPSBzaXplOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW06Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICBzeW1ib2wgPSBnZXRfc3ltYm9sIChhYmZkLCBpZWVlLCBzeW1ib2wsICZzeW1ib2xfY291bnQsCi0JCQkgICAgICAgJnByZXZfcmVmZXJlbmNlX3B0ciwKLQkJCSAgICAgICAmaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCwgJ1gnKTsKLQkgIGlmIChzeW1ib2wgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzeW1ib2wtPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQkgIHN5bWJvbC0+c3ltYm9sLm5hbWUgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLQkgIHN5bWJvbC0+c3ltYm9sLnVkYXRhLnAgPSAoUFRSKSBOVUxMOwotCSAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBzeW1ib2wtPnN5bWJvbC52YWx1ZSA9IChiZmRfdm1hKSAwOwotCSAgc3ltYm9sLT5zeW1ib2wuZmxhZ3MgPSAwOwotCi0JICBCRkRfQVNTRVJUIChzeW1ib2wtPmluZGV4ID49IGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXgpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgbG9vcCA9IGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXggIT0gMCkKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQgPQotCWllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXggLQotCWllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXggKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudCA9IDA7Ci0gICAgfQotCi0gIGlmIChpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4ICE9IDApCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50ID0KLQlpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4IC0KLQlpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4ICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfY291bnQgPSAwOwotICAgIH0KLQotICBhYmZkLT5zeW1jb3VudCA9Ci0gICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50ICsgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50OwotCi0gIGlmIChzeW1ib2xfY291bnQgIT0gYWJmZC0+c3ltY291bnQpCi0gICAgewotICAgICAgLyogVGhlcmUgYXJlIGdhcHMgaW4gdGhlIHRhYmxlIC0tICovCi0gICAgICBpZWVlLT5zeW1ib2xfdGFibGVfZnVsbCA9IGZhbHNlOwotICAgIH0KLQotICAqcHJldl9zeW1ib2xzX3B0ciA9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gICpwcmV2X3JlZmVyZW5jZV9wdHIgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKElFRUVfREFUQSAoYWJmZCktPnJlYWRfc3ltYm9scyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIElFRUVfREFUQSAoYWJmZCktPnJlYWRfc3ltYm9scyA9IHRydWU7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotaWVlZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghIGllZWVfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChhYmZkLT5zeW1jb3VudCAhPSAwKSA/Ci0gICAgKGFiZmQtPnN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChpZWVlX3N5bWJvbF90eXBlICopKSA6IDA7Ci19Ci0KLS8qCi1Nb3ZlIGZyb20gb3VyIGludGVybmFsIGxpc3RzIHRvIHRoZSBjYW5vbiB0YWJsZSwgYW5kIGluc2VydCBpbgotc3ltYm9sIGluZGV4IG9yZGVyCi0qLwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpZWVlX3ZlYzsKLQotbG9uZwotaWVlZV9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gIGllZWVfc3ltYm9sX3R5cGUgKnN5bXA7Ci0gIHN0YXRpYyBiZmQgZHVtbXlfYmZkOwotICBzdGF0aWMgYXN5bWJvbCBlbXB0eV9zeW1ib2wgPQotICAvKiB0aGVfYmZkLCBuYW1lLCB2YWx1ZSwgYXR0ciwgc2VjdGlvbiAqLwotICB7JmR1bW15X2JmZCwgIiBpZWVlIGVtcHR5IiwgKHN5bXZhbHVlKSAwLCBCU0ZfREVCVUdHSU5HLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB7IDAgfX07Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgICAgIGR1bW15X2JmZC54dmVjID0gJmllZWVfdmVjOwotICAgICAgaWYgKCEgaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID09IGZhbHNlKQotCXsKLQkgIC8qIEFycmdoIC0gdGhlcmUgYXJlIGdhcHMgaW4gdGhlIHRhYmxlLCBydW4gdGhyb3VnaCBhbmQgZmlsbCB0aGVtICovCi0JICAvKiB1cCB3aXRoIHBvaW50ZXJzIHRvIGEgbnVsbCBwbGFjZSAqLwotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c3ltY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGxvY2F0aW9uW2ldID0gJmVtcHR5X3N5bWJvbDsKLQkgICAgfQotCX0KLQotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0ID0gLWllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXg7Ci0gICAgICBmb3IgKHN5bXAgPSBJRUVFX0RBVEEgKGFiZmQpLT5leHRlcm5hbF9zeW1ib2xzOwotCSAgIHN5bXAgIT0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQkgICBzeW1wID0gc3ltcC0+bmV4dCkKLQl7Ci0JICAvKiBQbGFjZSBpbnRvIHRhYmxlIGF0IGNvcnJlY3QgaW5kZXggbG9jYXRpb25zICovCi0JICBsb2NhdGlvbltzeW1wLT5pbmRleCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldF0gPSAmc3ltcC0+c3ltYm9sOwotCX0KLQotICAgICAgLyogVGhlIGV4dGVybmFsIHJlZnMgYXJlIGluZGV4ZWQgaW4gYSBiaXQgKi8KLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldCA9Ci0JLWllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXggKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQ7Ci0KLSAgICAgIGZvciAoc3ltcCA9IElFRUVfREFUQSAoYWJmZCktPmV4dGVybmFsX3JlZmVyZW5jZTsKLQkgICBzeW1wICE9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7Ci0JICAgc3ltcCA9IHN5bXAtPm5leHQpCi0JewotCSAgbG9jYXRpb25bc3ltcC0+aW5kZXggKyBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXRdID0KLQkgICAgJnN5bXAtPnN5bWJvbDsKLQotCX0KLSAgICB9Ci0gIGlmIChhYmZkLT5zeW1jb3VudCkKLSAgICB7Ci0gICAgICBsb2NhdGlvblthYmZkLT5zeW1jb3VudF0gPSAoYXN5bWJvbCAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGFiZmQtPnN5bWNvdW50OwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZ2V0X3NlY3Rpb25fZW50cnkgKGFiZmQsIGllZWUsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA+PSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGMsIGk7Ci0gICAgICBhc2VjdGlvbiAqKm47Ci0KLSAgICAgIGMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemU7Ci0gICAgICBpZiAoYyA9PSAwKQotCWMgPSAyMDsKLSAgICAgIHdoaWxlIChjIDw9IGluZGV4KQotCWMgKj0gMjsKLQotICAgICAgbiA9ICgoYXNlY3Rpb24gKiopCi0JICAgYmZkX3JlYWxsb2MgKGllZWUtPnNlY3Rpb25fdGFibGUsIGMgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gICAgICBpZiAobiA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBmb3IgKGkgPSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemU7IGkgPCBjOyBpKyspCi0JbltpXSA9IE5VTEw7Ci0KLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGUgPSBuOwotICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplID0gYzsKLSAgICB9Ci0KLSAgaWYgKGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnRtcCA9IGJmZF9hbGxvYyAoYWJmZCwgMTEpOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgICAgIGlmICghdG1wKQotCXJldHVybiBOVUxMOwotICAgICAgc3ByaW50ZiAodG1wLCAiIGZzZWMlNGQiLCBpbmRleCk7Ci0gICAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgdG1wKTsKLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID0gc2VjdGlvbjsKLSAgICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX05PX0ZMQUdTOwotICAgICAgc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gaW5kZXg7Ci0gICAgICBpZWVlLT5zZWN0aW9uX3RhYmxlW2luZGV4XSA9IHNlY3Rpb247Ci0gICAgfQotICByZXR1cm4gaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF07Ci19Ci0KLXN0YXRpYyB2b2lkCi1pZWVlX3NsdXJwX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgZmlsZV9wdHIgb2Zmc2V0ID0gaWVlZS0+dy5yLnNlY3Rpb25fcGFydDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgY2hhciAqbmFtZTsKLQotICBpZiAob2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgc2VjdGlvbl90eXBlWzNdOwotICAgICAgaWVlZV9zZWVrIChhYmZkLCBvZmZzZXQpOwotICAgICAgd2hpbGUgKHRydWUpCi0JewotCSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCSAgICB7Ci0JICAgIGNhc2UgaWVlZV9zZWN0aW9uX3R5cGVfZW51bToKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBzZWN0aW9uX2luZGV4OwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQlzZWN0aW9uX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0JCXNlY3Rpb24gPSBnZXRfc2VjdGlvbl9lbnRyeSAoYWJmZCwgaWVlZSwgc2VjdGlvbl9pbmRleCk7Ci0KLQkJc2VjdGlvbl90eXBlWzBdID0gdGhpc19ieXRlX2FuZF9uZXh0ICgmKGllZWUtPmgpKTsKLQotCQkvKiBTZXQgbWluaW1hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuIEF0dHJpYnV0ZXMgYXJlCi0JCSAgIGV4dGVuZGVkIGxhdGVyLCBiYXNlZCBvbiBzZWN0aW9uIGNvbnRlbnRzLiAqLwotCi0JCXN3aXRjaCAoc2VjdGlvbl90eXBlWzBdKQotCQkgIHsKLQkJICBjYXNlIDB4QzE6Ci0JCSAgICAvKiBOb3JtYWwgYXR0cmlidXRlcyBmb3IgYWJzb2x1dGUgc2VjdGlvbnMJKi8KLQkJICAgIHNlY3Rpb25fdHlwZVsxXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkJICAgIHN3aXRjaCAoc2VjdGlvbl90eXBlWzFdKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMHhEMzoJLyogQVMgQWJzb2x1dGUgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0JCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc2VjdGlvbl90eXBlWzJdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJCXN3aXRjaCAoc2VjdGlvbl90eXBlWzJdKQotCQkJICB7Ci0JCQkgIGNhc2UgMHhEMDoKLQkJCSAgICAvKiBOb3JtYWwgY29kZSAqLwotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMHhDNDoKLQkJCSAgICAvKiBOb3JtYWwgZGF0YSAqLwotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMHhEMjoKLQkJCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJICAgIC8qIE5vcm1hbCByb20gZGF0YSAqLwotCQkJICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19ST00gfCBTRUNfREFUQTsKLQkJCSAgICBicmVhazsKLQkJCSAgZGVmYXVsdDoKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDB4QzM6CS8qIE5hbWVkIHJlbG9jYXRhYmxlIHNlY3Rpb25zICh0eXBlIEMpICovCi0JCSAgICBzZWN0aW9uX3R5cGVbMV0gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JCSAgICBzd2l0Y2ggKHNlY3Rpb25fdHlwZVsxXSkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDB4RDA6CS8qIE5vcm1hbCBjb2RlIChDUCkgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDB4QzQ6CS8qIE5vcm1hbCBkYXRhIChDRCkgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDB4RDI6CS8qIE5vcm1hbCByb20gZGF0YSAoQ1IpICovCi0JCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JPTSB8IFNFQ19EQVRBOwotCQkJYnJlYWs7Ci0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBSZWFkIHNlY3Rpb24gbmFtZSwgdXNlIGl0IGlmIG5vbiBlbXB0eS4gKi8KLQkJbmFtZSA9IHJlYWRfaWQgKCZpZWVlLT5oKTsKLQkJaWYgKG5hbWVbMF0pCi0JCSAgc2VjdGlvbi0+bmFtZSA9IG5hbWU7Ci0KLQkJLyogU2tpcCB0aGVzZSBmaWVsZHMsIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQgKi8KLQkJewotCQkgIGJmZF92bWEgcGFyZW50LCBicm90aGVyLCBjb250ZXh0OwotCQkgIHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnBhcmVudCk7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmYnJvdGhlcik7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmY29udGV4dCk7Ci0JCX0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0JCWJmZF92bWEgdmFsdWU7Ci0JCWFzZWN0aW9uICpzZWN0aW9uOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQlzZWN0aW9uX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCZpZWVlLT5oKTsKLQkJc2VjdGlvbiA9IGdldF9zZWN0aW9uX2VudHJ5IChhYmZkLCBpZWVlLCBzZWN0aW9uX2luZGV4KTsKLQkJaWYgKHNlY3Rpb25faW5kZXggPiBpZWVlLT5zZWN0aW9uX2NvdW50KQotCQkgIHsKLQkJICAgIGllZWUtPnNlY3Rpb25fY291bnQgPSBzZWN0aW9uX2luZGV4OwotCQkgIH0KLQkJc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0KLQkJICBiZmRfbG9nMiAobXVzdF9wYXJzZV9pbnQgKCZpZWVlLT5oKSk7Ci0JCSh2b2lkKSBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtOgotCSAgICAgIHsKLQkJaWVlZV9yZWNvcmRfZW51bV90eXBlIHQgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAocmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpKTsKLQotCQlzd2l0Y2ggKHQpCi0JCSAgewotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX3NpemVfZW51bToKLQkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07Ci0JCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfcGh5c2ljYWxfcmVnaW9uX3NpemVfZW51bToKLQkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07Ci0JCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfcmVnaW9uX2Jhc2VfYWRkcmVzc19lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9tYXVfc2l6ZV9lbnVtOgotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX21fdmFsdWVfZW51bToKLQkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtOgotCQkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgICh2b2lkKSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogTWFrZSBhIHNlY3Rpb24gZm9yIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIGFueS4gIFdlIGRvbid0IHRyeQotICAgdG8gaW50ZXJwcmV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb247IHdlIGp1c3QgcG9pbnQgdGhlIHNlY3Rpb24KLSAgIGF0IHRoZSBhcmVhIGluIHRoZSBmaWxlIHNvIHRoYXQgcHJvZ3JhbSB3aGljaCB1bmRlcnN0YW5kIGNhbiBkaWcgaXQKLSAgIG91dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2RlYnVnIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZmlsZV9wdHIgZGVidWdfZW5kOwotCi0gIGlmIChpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGVidWciKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjLT5mbGFncyB8PSBTRUNfREVCVUdHSU5HIHwgU0VDX0hBU19DT05URU5UUzsKLSAgc2VjLT5maWxlcG9zID0gaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQ7Ci0KLSAgZGVidWdfZW5kID0gaWVlZS0+dy5yLmRhdGFfcGFydDsKLSAgaWYgKGRlYnVnX2VuZCA9PSAwKQotICAgIGRlYnVnX2VuZCA9IGllZWUtPncuci50cmFpbGVyX3BhcnQ7Ci0gIGlmIChkZWJ1Z19lbmQgPT0gMCkKLSAgICBkZWJ1Z19lbmQgPSBpZWVlLT53LnIubWVfcmVjb3JkOwotICBzZWMtPl9yYXdfc2l6ZSA9IGRlYnVnX2VuZCAtIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBhcmNoaXZlIHN0dWZmCi0qLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWllZWVfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmxpYnJhcnk7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls1MTJdOwotICBmaWxlX3B0ciBidWZmZXJfb2Zmc2V0ID0gMDsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKnNhdmUgPSBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGE7Ci0gIGllZWVfYXJfZGF0YV90eXBlICppZWVlOwotICB1bnNpZ25lZCBpbnQgYWxjX2VsdHM7Ci0gIGllZWVfYXJfb2JzdGFja190eXBlICplbHRzID0gTlVMTDsKLQotICBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEgPQotICAgIChpZWVlX2FyX2RhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaWVlZV9hcl9kYXRhX3R5cGUpKTsKLSAgaWYgKCFhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGllZWUgPSBJRUVFX0FSX0RBVEEgKGFiZmQpOwotCi0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCk7Ci0KLSAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOwotICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0KLSAgaWVlZS0+aC5hYmZkID0gYWJmZDsKLQotICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSAhPSBNb2R1bGVfQmVnaW5uaW5nKQotICAgIHsKLSAgICAgIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9IHNhdmU7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLSAgbGlicmFyeSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotICBpZiAoc3RyY21wIChsaWJyYXJ5LCAiTElCUkFSWSIpICE9IDApCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGllZWUpOwotICAgICAgYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhID0gc2F2ZTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgLyogVGhyb3cgYXdheSB0aGUgZmlsZW5hbWUgKi8KLSAgcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0KLSAgaWVlZS0+ZWxlbWVudF9jb3VudCA9IDA7Ci0gIGllZWUtPmVsZW1lbnRfaW5kZXggPSAwOwotCi0gIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CS8qIERyb3AgdGhlIGFkIHBhcnQgKi8KLSAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwkvKiBBbmQgdGhlIHR3byBkdW1teSBudW1iZXJzICovCi0gIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQotICBhbGNfZWx0cyA9IDEwOwotICBlbHRzID0gKGllZWVfYXJfb2JzdGFja190eXBlICopIGJmZF9tYWxsb2MgKGFsY19lbHRzICogc2l6ZW9mICplbHRzKTsKLSAgaWYgKGVsdHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBSZWFkIHRoZSBpbmRleCBvZiB0aGUgQkIgdGFibGUgKi8KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IHJlYzsKLSAgICAgIGllZWVfYXJfb2JzdGFja190eXBlICp0OwotCi0gICAgICByZWMgPSByZWFkXzJieXRlcyAoJihpZWVlLT5oKSk7Ci0gICAgICBpZiAocmVjICE9IChpbnQpIGllZWVfYXNzaWduX3ZhbHVlX3RvX3ZhcmlhYmxlX2VudW0pCi0JYnJlYWs7Ci0KLSAgICAgIGlmIChpZWVlLT5lbGVtZW50X2NvdW50ID49IGFsY19lbHRzKQotCXsKLQkgIGllZWVfYXJfb2JzdGFja190eXBlICpuOwotCi0JICBhbGNfZWx0cyAqPSAyOwotCSAgbiA9ICgoaWVlZV9hcl9vYnN0YWNrX3R5cGUgKikKLQkgICAgICAgYmZkX3JlYWxsb2MgKGVsdHMsIGFsY19lbHRzICogc2l6ZW9mICplbHRzKSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGVsdHMgPSBuOwotCX0KLQotICAgICAgdCA9ICZlbHRzW2llZWUtPmVsZW1lbnRfY291bnRdOwotICAgICAgaWVlZS0+ZWxlbWVudF9jb3VudCsrOwotCi0gICAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gICAgICB0LT5maWxlX29mZnNldCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLSAgICAgIHQtPmFiZmQgPSAoYmZkICopIE5VTEw7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGdvIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCi0KLSAgICAgIGlmICgoc2l6ZV90KSBpZWVlX3BvcyAoYWJmZCkgPiBzaXplb2YgKGJ1ZmZlcikgLyAyKQotCXsKLQkgIC8qIFBhc3QgaGFsZiB3YXksIHJlc2VlayBhbmQgcmVwcmltZSAqLwotCSAgYnVmZmVyX29mZnNldCArPSBpZWVlX3BvcyAoYWJmZCk7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGJ1ZmZlcl9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcwotCSAgICAgdG8gcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotCSAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKLQkgIGllZWUtPmguZmlyc3RfYnl0ZSA9IGJ1ZmZlcjsKLQkgIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLQl9Ci0gICAgfQotCi0gIGllZWUtPmVsZW1lbnRzID0gKChpZWVlX2FyX29ic3RhY2tfdHlwZSAqKQotCQkgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJICAgICAgIGllZWUtPmVsZW1lbnRfY291bnQgKiBzaXplb2YgKmllZWUtPmVsZW1lbnRzKSk7Ci0gIGlmIChpZWVlLT5lbGVtZW50cyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1jcHkgKGllZWUtPmVsZW1lbnRzLCBlbHRzLAotCSAgaWVlZS0+ZWxlbWVudF9jb3VudCAqIHNpemVvZiAqaWVlZS0+ZWxlbWVudHMpOwotICBmcmVlIChlbHRzKTsKLSAgZWx0cyA9IE5VTEw7Ci0KLSAgLyogTm93IHNjYW4gdGhlIGFyZWEgYWdhaW4sIGFuZCByZXBsYWNlIEJCIG9mZnNldHMgd2l0aCBmaWxlICovCi0gIC8qIG9mZnNldHMgKi8KLQotICBmb3IgKGkgPSAyOyBpIDwgaWVlZS0+ZWxlbWVudF9jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaWVlZS0+ZWxlbWVudHNbaV0uZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvCi0JIHJlYWQgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgICAgIGJmZF9yZWFkICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCk7Ci0gICAgICBpZWVlLT5oLmZpcnN0X2J5dGUgPSBidWZmZXI7Ci0gICAgICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0KLSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CS8qIERyb3AgRjggKi8KLSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CS8qIERyb3AgMTQgKi8KLSAgICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsJLyogRHJvcCBzaXplIG9mIGJsb2NrICovCi0gICAgICBpZiAobXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpICE9IDApCi0JewotCSAgLyogVGhpcyBvYmplY3QgaGFzIGJlZW4gZGVsZXRlZCAqLwotCSAgaWVlZS0+ZWxlbWVudHNbaV0uZmlsZV9vZmZzZXQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZWVlLT5lbGVtZW50c1tpXS5maWxlX29mZnNldCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQl9Ci0gICAgfQotCi0gIC8qICBhYmZkLT5oYXNfYXJtYXAgPSA7Ki8KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGVsdHMgIT0gTlVMTCkKLSAgICBmcmVlIChlbHRzKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA9IChpZWVlX2RhdGFfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGllZWVfZGF0YV90eXBlKSk7Ci0gIHJldHVybiBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLWNvbnN0IGJmZF90YXJnZXQgKgotaWVlZV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpwcm9jZXNzb3I7Ci0gIHVuc2lnbmVkIGludCBwYXJ0OwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLSAgdW5zaWduZWQgY2hhciBidWZmZXJbMzAwXTsKLSAgaWVlZV9kYXRhX3R5cGUgKnNhdmUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA9IDA7Ci0gIGllZWVfbWtvYmplY3QgKGFiZmQpOwotCi0gIGllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBmYWlsOwotICAvKiBSZWFkIHRoZSBmaXJzdCBmZXcgYnl0ZXMgaW4gdG8gc2VlIGlmIGl0IG1ha2VzIHNlbnNlICovCi0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCk7Ci0KLSAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotICBpZiAodGhpc19ieXRlX2FuZF9uZXh0ICgmKGllZWUtPmgpKSAhPSBNb2R1bGVfQmVnaW5uaW5nKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdDsKLQotICBpZWVlLT5yZWFkX3N5bWJvbHMgPSBmYWxzZTsKLSAgaWVlZS0+cmVhZF9kYXRhID0gZmFsc2U7Ci0gIGllZWUtPnNlY3Rpb25fY291bnQgPSAwOwotICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4ID0gMDsKLSAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleCA9IElFRUVfUFVCTElDX0JBU0U7Ci0gIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXggPSBJRUVFX1JFRkVSRU5DRV9CQVNFOwotICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4ID0gMDsKLSAgaWVlZS0+aC5hYmZkID0gYWJmZDsKLSAgaWVlZS0+c2VjdGlvbl90YWJsZSA9IE5VTEw7Ci0gIGllZWUtPnNlY3Rpb25fdGFibGVfc2l6ZSA9IDA7Ci0KLSAgcHJvY2Vzc29yID0gaWVlZS0+bWIucHJvY2Vzc29yID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0gIGlmIChzdHJjbXAgKHByb2Nlc3NvciwgIkxJQlJBUlkiKSA9PSAwKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdDsKLSAgaWVlZS0+bWIubW9kdWxlX25hbWUgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLSAgaWYgKGFiZmQtPmZpbGVuYW1lID09IChDT05TVCBjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYWJmZC0+ZmlsZW5hbWUgPSBpZWVlLT5tYi5tb2R1bGVfbmFtZTsKLSAgICB9Ci0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLgotICAgICAqLwotICB7Ci0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoOwotICAgIGNoYXIgZmFtaWx5WzEwXTsKLQotICAgIC8qIElFRUUgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZm9ybWF0IG9mIHRoZSBwcm9jZXNzb3IgaWRlbnRpZmljYXRvbgotICAgICAgIHN0cmluZywgc28gdGhlIGNvbXBpbGVyIGlzIGZyZWUgdG8gcHV0IGluIGl0IHdoYXRldmVyIGl0IHdhbnRzLgotICAgICAgIFdlIHRyeSBoZXJlIHRvIHJlY29nbml6ZSBkaWZmZXJlbnQgcHJvY2Vzc29ycyBiZWxvbmdpbmcgdG8gdGhlCi0gICAgICAgbTY4ayBmYW1pbHkuICBDb2RlIGZvciBvdGhlciBwcm9jZXNzb3JzIGNhbiBiZSBhZGRlZCBoZXJlLiAgKi8KLSAgICBpZiAoKHByb2Nlc3NvclswXSA9PSAnNicpICYmIChwcm9jZXNzb3JbMV0gPT0gJzgnKSkKLSAgICAgIHsKLQlpZiAocHJvY2Vzc29yWzJdID09ICczJykJICAgIC8qIDY4M3h4IGludGVncmF0ZWQgcHJvY2Vzc29ycyAqLwotCSAgewotCSAgICBzd2l0Y2ggKHByb2Nlc3NvclszXSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnMCc6CQkJICAgIC8qIDY4MzAyLCA2ODMwNiwgNjgzMDcgKi8KLQkgICAgICBjYXNlICcyJzoJCQkgICAgLyogNjgzMjIsIDY4MzI4ICovCi0JICAgICAgY2FzZSAnNSc6CQkJICAgIC8qIDY4MzU2ICovCi0JCXN0cmNweSAoZmFtaWx5LCAiNjgwMDAiKTsgICAvKiBNQzY4MDAwLWJhc2VkIGNvbnRyb2xsZXJzICovCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnMyc6CQkJICAgIC8qIDY4MzMwLCA2ODMzMSwgNjgzMzIsIDY4MzMzLAotCQkJCQkgICAgICAgNjgzMzQsIDY4MzM1LCA2ODMzNiwgNjgzMzggKi8KLQkgICAgICBjYXNlICc2JzoJCQkgICAgLyogNjgzNjAgKi8KLQkgICAgICBjYXNlICc3JzoJCQkgICAgLyogNjgzNzYgKi8KLQkJc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOyAgIC8qIENQVTMyIGFuZCBDUFUzMisgKi8KLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICc0JzoKLQkJaWYgKHByb2Nlc3Nvcls0XSA9PSAnOScpICAgIC8qIDY4MzQ5ICovCi0JCSAgc3RyY3B5IChmYW1pbHksICI2ODAzMCIpOyAvKiBDUFUwMzAgKi8KLQkJZWxzZQkJICAgICAgICAgICAgLyogNjgzNDAsIDY4MzQxICovCi0JCSAgc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOyAvKiBDUFUzMiBhbmQgQ1BVMzIrICovCi0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoJCQkgICAgLyogRG9lcyBub3QgZXhpc3QgeWV0ICovCi0JCXN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgICAvKiBHdWVzcyBpdCB3aWxsIGJlIENQVTMyICovCi0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKHRvdXBwZXIgKHByb2Nlc3NvclszXSkgPT0gJ0YnKSAgIC8qIDY4RjMzMyAqLwotCSAgc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOwkgICAgICAgICAgLyogQ1BVMzIgKi8KLQllbHNlIGlmICgodG91cHBlciAocHJvY2Vzc29yWzNdKSA9PSAnQycpICAvKiBFbWJlZGRlZCBjb250cm9sbGVycyAqLwotCQkgJiYgKCh0b3VwcGVyIChwcm9jZXNzb3JbMl0pID09ICdFJykKLQkJICAgICB8fCAodG91cHBlciAocHJvY2Vzc29yWzJdKSA9PSAnSCcpCi0JCSAgICAgfHwgKHRvdXBwZXIgKHByb2Nlc3NvclsyXSkgPT0gJ0wnKSkpCi0JICB7Ci0JICAgIHN0cmNweSAoZmFtaWx5LCAiNjgiKTsKLQkgICAgc3RybmNhdCAoZmFtaWx5LCBwcm9jZXNzb3IgKyA0LCA3KTsKLQkgICAgZmFtaWx5WzldID0gJ1wwJzsKLQkgIH0KLQllbHNlCQkJCSAvKiAiUmVndWxhciIgcHJvY2Vzc29ycyAqLwotCSAgewotCSAgICBzdHJuY3B5IChmYW1pbHksIHByb2Nlc3NvciwgOSk7Ci0JICAgIGZhbWlseVs5XSA9ICdcMCc7Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoKHN0cm5jbXAgKHByb2Nlc3NvciwgImNwdTMyIiwgNSkgPT0gMCkgLyogQ1BVMzIgYW5kIENQVTMyKyAqLwotCSAgICAgfHwgKHN0cm5jbXAgKHByb2Nlc3NvciwgIkNQVTMyIiwgNSkgPT0gMCkpCi0gICAgICBzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7Ci0gICAgZWxzZQotICAgICAgewotCXN0cm5jcHkgKGZhbWlseSwgcHJvY2Vzc29yLCA5KTsKLQlmYW1pbHlbOV0gPSAnXDAnOwotICAgICAgfQotCi0gICAgYXJjaCA9IGJmZF9zY2FuX2FyY2ggKGZhbWlseSk7Ci0gICAgaWYgKGFyY2ggPT0gMCkKLSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdDsKLSAgICBhYmZkLT5hcmNoX2luZm8gPSBhcmNoOwotICB9Ci0KLSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgIT0gKGludCkgaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfZW51bSkKLSAgICB7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0gIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZpZWVlLT5hZC5udW1iZXJfb2ZfYml0c19tYXUpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZpZWVlLT5hZC5udW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgYnl0ZSBvcmRlciBpbmZvLCB0YWtlIGl0ICovCi0gIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpID09IChpbnQpIGllZWVfdmFyaWFibGVfTF9lbnVtIHx8Ci0gICAgICB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpID09IChpbnQpIGllZWVfdmFyaWFibGVfTV9lbnVtKQotICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLSAgZm9yIChwYXJ0ID0gMDsgcGFydCA8IE5fV19WQVJJQUJMRVM7IHBhcnQrKykKLSAgICB7Ci0gICAgICBib29sZWFuIG9rOwotICAgICAgaWYgKHJlYWRfMmJ5dGVzICgmKGllZWUtPmgpKSAhPSAoaW50KSBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCXsKLQkgIGdvdG8gZmFpbDsKLQl9Ci0gICAgICBpZiAodGhpc19ieXRlX2FuZF9uZXh0ICgmKGllZWUtPmgpKSAhPSBwYXJ0KQotCXsKLQkgIGdvdG8gZmFpbDsKLQl9Ci0KLSAgICAgIGllZWUtPncub2Zmc2V0W3BhcnRdID0gcGFyc2VfaSAoJihpZWVlLT5oKSwgJm9rKTsKLSAgICAgIGlmIChvayA9PSBmYWxzZSkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotCi0gICAgfQotCi0gIGlmIChpZWVlLT53LnIuZXh0ZXJuYWxfcGFydCAhPSAwKQotICAgIGFiZmQtPmZsYWdzID0gSEFTX1NZTVM7Ci0KLSAgLyogQnkgbm93IHdlIGtub3cgdGhhdCB0aGlzIGlzIGEgcmVhbCBJRUVFIGZpbGUsIHdlJ3JlIGdvaW5nIHRvIHJlYWQKLSAgICAgdGhlIHdob2xlIHRoaW5nIGludG8gbWVtb3J5IHNvIHRoYXQgd2UgY2FuIHJ1biB1cCBhbmQgZG93biBpdAotICAgICBxdWlja2x5LiAgV2UgY2FuIHdvcmsgb3V0IGhvdyBiaWcgdGhlIGZpbGUgaXMgZnJvbSB0aGUgdHJhaWxlcgotICAgICByZWNvcmQgKi8KLQotICBJRUVFX0RBVEEgKGFiZmQpLT5oLmZpcnN0X2J5dGUgPQotICAgICh1bnNpZ25lZCBjaGFyICopIGJmZF9hbGxvYyAoaWVlZS0+aC5hYmZkLCBpZWVlLT53LnIubWVfcmVjb3JkICsgMSk7Ci0gIGlmICghSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlKQotICAgIGdvdG8gZmFpbDsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZmFpbDsKLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIChJRUVFX0RBVEEgKGFiZmQpLT5oLmZpcnN0X2J5dGUpLCAxLAotCSAgICBpZWVlLT53LnIubWVfcmVjb3JkICsgMSwgYWJmZCk7Ci0KLSAgaWVlZV9zbHVycF9zZWN0aW9ucyAoYWJmZCk7Ci0KLSAgaWYgKCEgaWVlZV9zbHVycF9kZWJ1ZyAoYWJmZCkpCi0gICAgZ290byBmYWlsOwotCi0gIC8qIFBhcnNlIHNlY3Rpb24gZGF0YSB0byBhY3RpdmF0ZSBmaWxlIGFuZCBzZWN0aW9uIGZsYWdzIGltcGxpZWQgYnkKLSAgICAgc2VjdGlvbiBjb250ZW50cy4gKi8KLQotICBpZiAoISBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkpCi0gICAgZ290byBmYWlsOwotICAgIAotICByZXR1cm4gYWJmZC0+eHZlYzsKLWdvdF93cm9uZ19mb3JtYXQ6Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotZmFpbDoKLSAgKHZvaWQpIGJmZF9yZWxlYXNlIChhYmZkLCBpZWVlKTsKLSAgYWJmZC0+dGRhdGEuaWVlZV9kYXRhID0gc2F2ZTsKLSAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci19Ci0KLXZvaWQKLWllZWVfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLSAgaWYgKHN5bWJvbC0+bmFtZVswXSA9PSAnICcpCi0gICAgcmV0LT5uYW1lID0gIiogZW1wdHkgdGFibGUgZW50cnkgIjsKLSAgaWYgKCFzeW1ib2wtPnNlY3Rpb24pCi0gICAgcmV0LT50eXBlID0gKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpID8gJ2EnIDogJ0EnOwotfQotCi12b2lkCi1pZWVlX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+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+IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZHJvcF9pbnQgKGJ1ZikKLSAgICAgc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0ICpidWY7Ci17Ci0gIGludCB0eXBlID0gVEhJUyAoKTsKLSAgaW50IGNoOwotICBpZiAodHlwZSA8PSAweDg0KQotICAgIHsKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMHg4NDoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgzOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODI6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MToKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgwOgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgT1VUICgweDg0KTsKLSAgYnVmLT5wdHJwID0gb3V0cHV0X3B0cjsKLSAgYnVmLT5idWZmZXIgPSBvdXRwdXRfYnVmZmVyOwotICBPVVQgKDApOwotICBPVVQgKDApOwotICBPVVQgKDApOwotICBPVVQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotY29weV9pbnQgKCkKLXsKLSAgaW50IHR5cGUgPSBUSElTICgpOwotICBpbnQgY2g7Ci0gIGlmICh0eXBlIDw9IDB4ODQpCi0gICAgewotICAgICAgT1VUICh0eXBlKTsKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMHg4NDoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODM6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgT1VUIChjaCk7Ci0JY2FzZSAweDgyOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MToKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODA6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0jZGVmaW5lIElEIGNvcHlfaWQoKQotI2RlZmluZSBJTlQgY29weV9pbnQoKQotI2RlZmluZSBFWFAgY29weV9leHByZXNzaW9uKCkKLXN0YXRpYyB2b2lkIGNvcHlfdGlsbF9lbmQgKCk7Ci0jZGVmaW5lIElOVG4ocSkgY29weV9pbnQoKQotI2RlZmluZSBFWFBuKHEpIGNvcHlfZXhwcmVzc2lvbigpCi0KLXN0YXRpYyB2b2lkCi1mMV9yZWNvcmQgKCkKLXsKLSAgaW50IGNoOwotICAvKiBBVE4gcmVjb3JkICovCi0gIE5FWFQgKCk7Ci0gIGNoID0gVEhJUyAoKTsKLSAgc3dpdGNoIChjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKGNoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjOToKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGM5KTsKLSAgICAgIElOVDsKLSAgICAgIElOVDsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHgxNjoKLQkgIE5FWFQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4MDE6Ci0JICBORVhUICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAwOgotCSAgTkVYVCAoKTsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMzoKLQkgIE5FWFQgKCk7Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4MTM6Ci0JICBFWFBuIChpbnN0cnVjdGlvbiBhZGRyZXNzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ZDg6Ci0gICAgICAvKiBFWHRlcm5hbCByZWYgKi8KLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGQ4KTsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjZToKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGNlKTsKLSAgICAgIElOVDsKLSAgICAgIElOVDsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIElOVDsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHgwMToKLQkgIElOVDsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMjoKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNDoKLQkgIEVYUG4gKGV4dGVybmFsIGZ1bmN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNToKLQkgIGJyZWFrOwotCWNhc2UgMHgwNzoKLQkgIElOVG4gKGxpbmUgbnVtYmVyKTsKLQkgIElOVDsKLQljYXNlIDB4MDg6Ci0JICBicmVhazsKLQljYXNlIDB4MGE6Ci0JICBJTlRuIChsb2NrZWQgcmVnaXN0ZXIpOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDNmOgotCSAgY29weV90aWxsX2VuZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgzZToKLQkgIGNvcHlfdGlsbF9lbmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4NDA6Ci0JICBjb3B5X3RpbGxfZW5kICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDQxOgotCSAgSUQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1mMF9yZWNvcmQgKCkKLXsKLSAgLyogQXR0cmlidXRlIHJlY29yZCAqLwotICBORVhUICgpOwotICBPVVQgKDB4ZjApOwotICBJTlRuIChTeW1ib2wgbmFtZSk7Ci0gIElEOwotfQotCi1zdGF0aWMgdm9pZAotY29weV90aWxsX2VuZCAoKQotewotICBpbnQgY2ggPSBUSElTICgpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoY2ggPD0gMHg4MCkKLQl7Ci0JICBPVVQgKGNoKTsKLQkgIE5FWFQgKCk7Ci0JICBjaCA9IFRISVMgKCk7Ci0JfQotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweDg0OgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgzOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgyOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgxOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQotCSAgY2ggPSBUSElTICgpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1mMl9yZWNvcmQgKCkKLXsKLSAgTkVYVCAoKTsKLSAgT1VUICgweGYyKTsKLSAgSU5UOwotICBORVhUICgpOwotICBPVVQgKDB4Y2UpOwotICBJTlQ7Ci0gIGNvcHlfdGlsbF9lbmQgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYmxvY2sgKCk7Ci1zdGF0aWMgdm9pZAotZjhfcmVjb3JkICgpCi17Ci0gIGludCBjaDsKLSAgTkVYVCAoKTsKLSAgY2ggPSBUSElTICgpOwotICBzd2l0Y2ggKGNoKQotICAgIHsKLSAgICBjYXNlIDB4MDE6Ci0gICAgY2FzZSAweDAyOgotICAgIGNhc2UgMHgwMzoKLSAgICAgIC8qIFVuaXF1ZSB0eXBlZGVmcyBmb3IgbW9kdWxlICovCi0gICAgICAvKiBHTG9iYWwgdHlwZWRlZnMgICovCi0gICAgICAvKiBIaWdoIGxldmVsIG1vZHVsZSBzY29wZSBiZWdpbm5pbmcgKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoY2gpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCi0JYmxvY2sgKCk7Ci0KLQlORVhUICgpOwotCWZpbGxfaW50ICgmb2IpOwotCU9VVCAoMHhmOSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDQ6Ci0gICAgICAvKiBHbG9iYWwgZnVuY3Rpb24gKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNCk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoc3RhY2sgc2l6ZSk7Ci0JSU5UbiAocmV0IHZhbCk7Ci0JRVhQbiAob2Zmc2V0KTsKLQotCWJsb2NrICgpOwotCi0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCUVYUG4gKHNpemUgb2YgYmxvY2spOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MDU6Ci0gICAgICAvKiBGaWxlIG5hbWUgZm9yIHNvdXJjZSBsaW5lIG51bWJlcnMgKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNSk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoeWVhcik7Ci0JSU5UbiAobW9udGgpOwotCUlOVG4gKGRheSk7Ci0JSU5UbiAoaG91cik7Ci0JSU5UbiAobW9udXRlKTsKLQlJTlRuIChzZWNvbmQpOwotCWJsb2NrICgpOwotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDA2OgotICAgICAgLyogTG9jYWwgZnVuY3Rpb24gKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNik7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoc3RhY2sgc2l6ZSk7Ci0JSU5UbiAodHlwZSByZXR1cm4pOwotCUVYUG4gKG9mZnNldCk7Ci0JYmxvY2sgKCk7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCUVYUG4gKHNpemUpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MGE6Ci0gICAgICAvKiBBc3NlbWJsZXIgbW9kdWxlIHNjb3BlIGJlZ2lubmluZyAtKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0KLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDBhKTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJRDsKLQlJTlQ7Ci0JSUQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0KLQlibG9jayAoKTsKLQotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwYjoKLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwYik7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UOwotCUlOVG4gKHNlY3Rpb24gaW5kZXgpOwotCUVYUG4gKG9mZnNldCk7Ci0JSU5UbiAoc3R1ZmYpOwotCi0JYmxvY2sgKCk7Ci0KLQlPVVQgKDB4ZjkpOwotCU5FWFQgKCk7Ci0JRVhQbiAoU2l6ZSBpbiBNYXVzKTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWUyX3JlY29yZCAoKQotewotICBPVVQgKDB4ZTIpOwotICBORVhUICgpOwotICBPVVQgKDB4Y2UpOwotICBORVhUICgpOwotICBJTlQ7Ci0gIEVYUDsKLX0KLQotc3RhdGljIHZvaWQKLWJsb2NrICgpCi17Ci0gIGludCBjaDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweGUxOgotCWNhc2UgMHhlNToKLQkgIHJldHVybjsKLQljYXNlIDB4Zjk6Ci0JICByZXR1cm47Ci0JY2FzZSAweGYwOgotCSAgZjBfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYxOgotCSAgZjFfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYyOgotCSAgZjJfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGY4OgotCSAgZjhfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgZTJfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0KLQl9Ci0gICAgfQotfQotCi0KLQotLyogcmVsb2NhdGVfZGVidWcsCi0gICBtb3ZlcyBhbGwgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGZyb20gdGhlIHNvdXJjZSBiZmQgdG8gdGhlIG91dHB1dAotICAgYmZkLCBhbmQgcmVsb2NhdGVzIGFueSBleHByZXNzaW9ucyBpdCBmaW5kcwotKi8KLQotc3RhdGljIHZvaWQKLXJlbG9jYXRlX2RlYnVnIChvdXRwdXQsIGlucHV0KQotICAgICBiZmQgKm91dHB1dCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmlucHV0OwotewotI2RlZmluZSBJQlMgNDAwCi0jZGVmaW5lIE9CUyA0MDAKLSAgdW5zaWduZWQgY2hhciBpbnB1dF9idWZmZXJbSUJTXTsKLQotICBpbnB1dF9wdHJfc3RhcnQgPSBpbnB1dF9wdHIgPSBpbnB1dF9idWZmZXI7Ci0gIGlucHV0X3B0cl9lbmQgPSBpbnB1dF9idWZmZXIgKyBJQlM7Ci0gIGlucHV0X2JmZCA9IGlucHV0OwotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgaW5wdXRfcHRyX3N0YXJ0LCAxLCBJQlMsIGlucHV0KTsKLSAgYmxvY2sgKCk7Ci19Ci0KLS8qCi0gIER1cmluZyBsaW5raW5nLCB3ZSB3ZSB0b2xkIGFib3V0IHRoZSBiZmRzIHdoaWNoIG1hZGUgdXAgb3VyCi0gIGNvbnRlbnRzLCB3ZSBoYXZlIGEgbGlzdCBvZiB0aGVtLiBUaGV5IHdpbGwgc3RpbGwgYmUgb3Blbiwgc28gZ28gdG8KLSAgdGhlIGRlYnVnIGluZm8gaW4gZWFjaCwgYW5kIGNvcHkgaXQgb3V0LCByZWxvY2F0aW5nIGl0IGFzIHdlIGdvLgotKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZGVidWdfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGJmZF9jaGFpbl90eXBlICpjaGFpbiA9IGllZWUtPmNoYWluX3Jvb3Q7Ci0gIHVuc2lnbmVkIGNoYXIgb3V0cHV0X2J1ZmZlcltPQlNdOwotICBib29sZWFuIHNvbWVfZGVidWcgPSBmYWxzZTsKLSAgZmlsZV9wdHIgaGVyZSA9IGJmZF90ZWxsIChhYmZkKTsKLQotICBvdXRwdXRfcHRyX3N0YXJ0ID0gb3V0cHV0X3B0ciA9IG91dHB1dF9idWZmZXI7Ci0gIG91dHB1dF9wdHJfZW5kID0gb3V0cHV0X2J1ZmZlciArIE9CUzsKLSAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZmZXI7Ci0gIG91dHB1dF9iZmQgPSBhYmZkOwotCi0gIGlmIChjaGFpbiA9PSAoYmZkX2NoYWluX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKChzLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0JICBicmVhazsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JewotCSAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSAwOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IGhlcmU7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBhYmZkKSAhPSBzLT5fcmF3X3NpemUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlIChjaGFpbiAhPSAoYmZkX2NoYWluX3R5cGUgKikgTlVMTCkKLQl7Ci0JICBiZmQgKmVudHJ5ID0gY2hhaW4tPnRoaXM7Ci0JICBpZWVlX2RhdGFfdHlwZSAqZW50cnlfaWVlZSA9IElFRUVfREFUQSAoZW50cnkpOwotCSAgaWYgKGVudHJ5X2llZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0KQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChlbnRyeSwgZW50cnlfaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQsCi0JCQkgICAgU0VFS19TRVQpCi0JCSAgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRlX2RlYnVnIChhYmZkLCBlbnRyeSk7Ci0JICAgIH0KLQotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0gICAgICBpZiAoc29tZV9kZWJ1ZykKLQl7Ci0JICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IGhlcmU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gMDsKLQl9Ci0KLSAgICAgIGZsdXNoICgpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgdGhlIGRhdGEgaW4gYW4gaWVlZSB3YXkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9kYXRhX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgaWVlZS0+dy5yLmRhdGFfcGFydCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIFNraXAgc2VjdGlvbnMgdGhhdCBoYXZlIG5vIGxvYWRhYmxlIGNvbnRlbnRzICguYnNzLAotICAgICAgICAgZGVidWdnaW5nLCBldGMuKSAgKi8KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogU29ydCB0aGUgcmVsb2MgcmVjb3JkcyBzbyB3ZSBjYW4gaW5zZXJ0IHRoZW0gaW4gdGhlIGNvcnJlY3QKLQkgcGxhY2VzICovCi0gICAgICBpZiAocy0+cmVsb2NfY291bnQgIT0gMCkKLQl7Ci0JICBpZiAoISBkb193aXRoX3JlbG9jcyAoYWJmZCwgcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgZG9fd2l0aG91dF9yZWxvY3MgKGFiZmQsIHMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotaW5pdF9mb3Jfb3V0cHV0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0JY29udGludWU7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0JewotCSAgaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGEgPSAoYmZkX2J5dGUgKikgKGJmZF9hbGxvYyAoYWJmZCwgcy0+X3Jhd19zaXplKSk7Ci0JICBpZiAoIWllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiogZXhlYyBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLS8qIHNldCBzZWN0aW9uIGNvbnRlbnRzIGlzIGNvbXBsaWNhdGVkIHdpdGggSUVFRSBzaW5jZSB0aGUgZm9ybWF0IGlzCi0qIG5vdCBhIGJ5dGUgaW1hZ2UsIGJ1dCBhIHJlY29yZCBzdHJlYW0uCi0qLwotYm9vbGVhbgotaWVlZV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgewotICAgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKLQkJCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSkpOwotCSAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAvKiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IGV2ZXJ5dGhpbmcKLSAgICAgICAgIGlzIHdpdGhpbiByYW5nZS4gICovCi0gICAgICBtZW1jcHkgKHNlY3Rpb24tPmNvbnRlbnRzICsgb2Zmc2V0LCBsb2NhdGlvbiwgY291bnQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChpZWVlX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoIWluaXRfZm9yX291dHB1dCAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbWVtY3B5ICgoUFRSKSAoaWVlZV9wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgKyBvZmZzZXQpLAotCSAgKFBUUikgbG9jYXRpb24sCi0JICAodW5zaWduZWQgaW50KSBjb3VudCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSB0aGUgZXh0ZXJuYWwgc3ltYm9scyBvZiBhIGZpbGUuICBJRUVFIGNvbnNpZGVycyB0d28gc29ydHMgb2YKLSAgIGV4dGVybmFsIHN5bWJvbHMsIHB1YmxpYywgYW5kIHJlZmVyZW5jZWQuICBJdCB1c2VzIHRvIGludGVybmFsCi0gICBmb3JtcyB0byBpbmRleCB0aGVtIGFzIHdlbGwuICBXaGVuIHdlIHdyaXRlIHRoZW0gb3V0IHdlIHR1cm4gdGhlaXIKLSAgIHN5bWJvbCB2YWx1ZXMgaW50byBpbmRleGVzIGZyb20gdGhlIHJpZ2h0IGJhc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKipxOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0KLSAgdW5zaWduZWQgaW50IHJlZmVyZW5jZV9pbmRleCA9IElFRUVfUkVGRVJFTkNFX0JBU0U7Ci0gIHVuc2lnbmVkIGludCBwdWJsaWNfaW5kZXggPSBJRUVFX1BVQkxJQ19CQVNFICsgMjsKLSAgZmlsZV9wdHIgaGVyZSA9IGJmZF90ZWxsIChhYmZkKTsKLSAgYm9vbGVhbiBoYWRvbmUgPSBmYWxzZTsKLSAgaWYgKGFiZmQtPm91dHN5bWJvbHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgewotCi0gICAgICBmb3IgKHEgPSBhYmZkLT5vdXRzeW1ib2xzOyAqcSAhPSAoYXN5bWJvbCAqKSBOVUxMOyBxKyspCi0JewotCSAgYXN5bWJvbCAqcCA9ICpxOwotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIG11c3QgYmUgYSBzeW1ib2wgcmVmZXJlbmNlIC4uICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJlZmVyZW5jZV9pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIHAtPm5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcC0+dmFsdWUgPSByZWZlcmVuY2VfaW5kZXg7Ci0JICAgICAgcmVmZXJlbmNlX2luZGV4Kys7Ci0JICAgICAgaGFkb25lID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSB3ZWFrIHJlZmVyZW5jZSAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCByZWZlcmVuY2VfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBwLT5uYW1lKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCQlpZWVlX3dlYWtfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcmVmZXJlbmNlX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHAtPnZhbHVlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHAtPnZhbHVlID0gcmVmZXJlbmNlX2luZGV4OwotCSAgICAgIHJlZmVyZW5jZV9pbmRleCsrOwotCSAgICAgIGhhZG9uZSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPmZsYWdzICYgQlNGX0dMT0JBTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhIHN5bWJvbCBkZWZpbml0aW9uICovCi0KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZXJuYWxfc3ltYm9sX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcHVibGljX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcC0+bmFtZSkKLQkJICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX2F0dHJpYnV0ZV9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwdWJsaWNfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDE1KSAvKiBpbnN0cnVjdGlvbiBhZGRyZXNzICovCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDE5KSAvKiBzdGF0aWMgc3ltYm9sICovCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDEpKSAvKiBvbmUgb2YgdGhlbSAqLwotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIHZhbHVlICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfdmFsdWVfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcHVibGljX2luZGV4KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JCXsKLQkJICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIGZ1bGx5IGxpbmtlZCwgdGhlbiBvdXRwdXQgYWxsIHN5bWJvbHMKLQkJCSByZWxvY2F0ZWQgKi8KLQkJICAgICAgaWYgKCEgKGllZWVfd3JpdGVfaW50Ci0JCQkgICAgIChhYmZkLAotCQkJICAgICAgKHAtPnZhbHVlCi0JCQkgICAgICAgKyBwLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICAgKyBwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKGllZWVfd3JpdGVfZXhwcmVzc2lvbgotCQkJICAgICAoYWJmZCwKLQkJCSAgICAgIHAtPnZhbHVlICsgcC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJCSAgICAgIHAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5zeW1ib2wsCi0JCQkgICAgICBmYWxzZSwgMCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgaWVlZV93cml0ZV9leHByZXNzaW9uIChhYmZkLAotCQkJCQkgICAgICAgcC0+dmFsdWUsCi0JCQkJCSAgICAgICBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wsCi0JCQkJCSAgICAgICBmYWxzZSwgMCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBwLT52YWx1ZSA9IHB1YmxpY19pbmRleDsKLQkgICAgICBwdWJsaWNfaW5kZXgrKzsKLQkgICAgICBoYWRvbmUgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gLSB3aGVuIHRoZXJlIGFyZSBnYXBzIGluIHRoZSBzeW1ib2xzIHJlYWQgKi8KLQkgICAgICAvKiBmcm9tIGFuIGlucHV0IGllZWUgZmlsZSAqLwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKGhhZG9uZSkKLSAgICBpZWVlLT53LnIuZXh0ZXJuYWxfcGFydCA9IGhlcmU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIENPTlNUIHVuc2lnbmVkIGNoYXIgZXh0ZW5bXSA9Ci17Ci0gIDB4ZjAsIDB4MjAsIDB4MDAsCi0gIDB4ZjEsIDB4Y2UsIDB4MjAsIDB4MDAsIDM3LCAzLCAzLAkvKiBTZXQgdmVyc2lvbiAzIHJldiAzICAgCSovCi0gIDB4ZjEsIDB4Y2UsIDB4MjAsIDB4MDAsIDM5LCAyLC8qIGtlZXAgc3ltYm9sIGluICBvcmlnaW5hbCBjYXNlICovCi0gIDB4ZjEsIDB4Y2UsIDB4MjAsIDB4MDAsIDM4CS8qIHNldCBvYmplY3QgdHlwZSByZWxvY2F0ZWFibGUgdG8geCAqLwotfTsKLQotc3RhdGljIENPTlNUIHVuc2lnbmVkIGNoYXIgZW52aVtdID0KLXsKLSAgMHhmMCwgMHgyMSwgMHgwMCwKLQotLyogICAgMHhmMSwgMHhjZSwgMHgyMSwgMDAsIDUwLCAweDgyLCAweDA3LCAweGM3LCAweDA5LCAweDExLCAweDExLAotICAgIDB4MTksIDB4MmMsCi0qLwotICAweGYxLCAweGNlLCAweDIxLCAwMCwgNTIsIDB4MDAsCS8qIGV4ZWMgb2sgKi8KLQotICAweGYxLCAweGNlLCAweDIxLCAwLCA1MywgMHgwMywvKiBob3N0IHVuaXggKi8KLS8qICAgIDB4ZjEsIDB4Y2UsIDB4MjEsIDAsIDU0LCAyLDEsMQl0b29sICYgdmVyc2lvbiAjICovCi19OwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9tZV9wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgaWVlZS0+dy5yLnRyYWlsZXJfcGFydCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKGFiZmQtPnN0YXJ0X2FkZHJlc3MpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfdmFsdWVfc3RhcnRpbmdfYWRkcmVzc19lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgYWJmZC0+c3RhcnRfYWRkcmVzcykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9jbG9zZV9iX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGllZWUtPncuci5tZV9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9tb2R1bGVfZW5kX2VudW0pKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgSUVFRSBwcm9jZXNzb3IgSUQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9wcm9jZXNzb3IgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoOwotCi0gIGFyY2ggPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCk7Ci0gIHN3aXRjaCAoYXJjaC0+YXJjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsIGJmZF9wcmludGFibGVfbmFtZSAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjI5MDAwIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2g4MzAwOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIkg4LzMwMCIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9oODUwMDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICJIOC81MDAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKLSAgICAgIHN3aXRjaCAoYXJjaC0+bWFjaCkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKLQljYXNlIGJmZF9tYWNoX2k5NjBfa2Ffc2E6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBLQSIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX21hY2hfaTk2MF9rYl9zYjoKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2MEtCIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbWFjaF9pOTYwX2NhOgotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwQ0EiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9tYWNoX2k5NjBfbWM6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX3hhOgotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwTUMiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqaWQ7Ci0KLQlzd2l0Y2ggKGFyY2gtPm1hY2gpCi0JICB7Ci0JICBkZWZhdWx0OgkJaWQgPSAiNjgwMjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDAwOiBpZCA9ICI2ODAwMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMDg6IGlkID0gIjY4MDA4IjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAxMDogaWQgPSAiNjgwMTAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDIwOiBpZCA9ICI2ODAyMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMzA6IGlkID0gIjY4MDMwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODA0MDogaWQgPSAiNjgwNDAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDYwOiBpZCA9ICI2ODA2MCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9jcHUzMjogIGlkID0gImNwdTMyIjsgYnJlYWs7Ci0JICB9Ci0KLQlpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCBpZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZpbGVfcHRyIG9sZDsKLQotICAvKiBGYXN0IGZvcndhcmQgb3ZlciB0aGUgaGVhZGVyIGFyZWEgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbW9kdWxlX2JlZ2lubmluZ19lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX3Byb2Nlc3NvciAoYWJmZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgYWJmZC0+ZmlsZW5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGYXN0IGZvcndhcmQgb3ZlciB0aGUgdmFyaWFibGUgYml0cyAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX2VudW0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBCaXRzIHBlciBNQVUgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpIChiZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKSkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogTUFVJ3MgcGVyIGFkZHJlc3MgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJIChiZmRfYnl0ZSkgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpCi0JCQkJICAgICAvIGJmZF9hcmNoX2JpdHNfcGVyX2J5dGUgKGFiZmQpKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG9sZCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpICg4ICogTl9XX1ZBUklBQkxFUyksIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZWVlLT53LnIuZXh0ZW5zaW9uX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKGJmZF93cml0ZSAoKGNoYXIgKikgZXh0ZW4sIDEsIHNpemVvZiAoZXh0ZW4pLCBhYmZkKSAhPSBzaXplb2YgKGV4dGVuKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDB4MSkpIC8qIEFic29sdXRlICovCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMHgyKSkgLyogUmVsb2NhdGVhYmxlICovCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZWVlLT53LnIuZW52aXJvbm1lbnRhbF9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfd3JpdGUgKChjaGFyICopIGVudmksIDEsIHNpemVvZiAoZW52aSksIGFiZmQpICE9IHNpemVvZiAoZW52aSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBIUCBlbXVsYXRvciBkYXRhYmFzZSByZXF1aXJlcyBhIHRpbWVzdGFtcCBpbiB0aGUgZmlsZS4gICovCi0gIHsKLSAgICB0aW1lX3Qgbm93OwotICAgIGNvbnN0IHN0cnVjdCB0bSAqdDsKLQotICAgIHRpbWUgKCZub3cpOwotICAgIHQgPSAoc3RydWN0IHRtICopIGxvY2FsdGltZSAoJm5vdyk7Ci0gICAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCXx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAweDIxKQotCXx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAwKQotCXx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCA1MCkKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV95ZWFyICsgMTkwMCkKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9tb24gKyAxKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX21kYXkpCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1faG91cikKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9taW4pCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fc2VjKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG91dHB1dF9iZmQgPSBhYmZkOwotCi0gIGZsdXNoICgpOwotCi0gIGlmICghIGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIEZpcnN0IHdyaXRlIHRoZSBzeW1ib2xzLiAgVGhpcyBjaGFuZ2VzIHRoZWlyIHZhbHVlcyBpbnRvIHRhYmxlCi0gICAgaW5kZWNlcyBzbyB3ZSBjYW50IHVzZSBpdCBhZnRlciB0aGlzIHBvaW50LiAgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogIGllZWVfd3JpdGVfYnl0ZShhYmZkLCBpZWVlX3JlY29yZF9zZXBlcmF0b3JfZW51bSk7Ki8KLQotICAvKiAgaWVlZV93cml0ZV9ieXRlKGFiZmQsIGllZWVfcmVjb3JkX3NlcGVyYXRvcl9lbnVtKTsqLwotCi0KLSAgLyogV3JpdGUgYW55IGRlYnVncyB3ZSBoYXZlIGJlZW4gdG9sZCBhYm91dC4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZGVidWdfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENhbiBvbmx5IHdyaXRlIHRoZSBkYXRhIG9uY2UgdGhlIHN5bWJvbHMgaGF2ZSBiZWVuIHdyaXR0ZW4sIHNpbmNlCi0gICAgIHRoZSBkYXRhIGNvbnRhaW5zIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gd2hpY2ggcG9pbnRzIHRvIHRoZQotICAgICBzeW1ib2xzLiAgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9kYXRhX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBdCB0aGUgZW5kIHdlIHB1dCB0aGUgZW5kISAgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9tZV9wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2VuZXJhdGUgdGhlIGhlYWRlciAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9sZCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOX1dfVkFSSUFCTEVTOyBpKyspCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfYXNzaWduX3ZhbHVlX3RvX3ZhcmlhYmxlX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBpKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludDVfb3V0IChhYmZkLCBpZWVlLT53Lm9mZnNldFtpXSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIE5hdGl2ZS1sZXZlbCBpbnRlcmZhY2UgdG8gc3ltYm9scy4gKi8KLQotLyogV2UgcmVhZCB0aGUgc3ltYm9scyBpbnRvIGEgYnVmZmVyLCB3aGljaCBpcyBkaXNjYXJkZWQgd2hlbiB0aGlzCi0gICBmdW5jdGlvbiBleGl0cy4gIFdlIHJlYWQgdGhlIHN0cmluZ3MgaW50byBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8KLSAgIGhvbGQgdGhlbSBhbGwgcGx1cyBhbGwgdGhlIGNhY2hlZCBzeW1ib2wgZW50cmllcy4gKi8KLQotYXN5bWJvbCAqCi1pZWVlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfc3ltYm9sX3R5cGUgKm5ldyA9Ci0gICAgKGllZWVfc3ltYm9sX3R5cGUgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoaWVlZV9zeW1ib2xfdHlwZSkpOwotICBpZiAoIW5ldykKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLXN0YXRpYyBiZmQgKgotaWVlZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIHByZXYpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgYmZkICpwcmV2OwotewotICBpZWVlX2FyX2RhdGFfdHlwZSAqYXIgPSBJRUVFX0FSX0RBVEEgKGFyY2gpOwotICAvKiB0YWtlIHRoZSBuZXh0IG9uZSBmcm9tIHRoZSBhcmNoIHN0YXRlLCBvciByZXNldCAqLwotICBpZiAocHJldiA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogUmVzZXQgdGhlIGluZGV4IC0gdGhlIGZpcnN0IHR3byBlbnRyaWVzIGFyZSBib2d1cyovCi0gICAgICBhci0+ZWxlbWVudF9pbmRleCA9IDI7Ci0gICAgfQotICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqcCA9IGFyLT5lbGVtZW50cyArIGFyLT5lbGVtZW50X2luZGV4OwotICAgICAgYXItPmVsZW1lbnRfaW5kZXgrKzsKLSAgICAgIGlmIChhci0+ZWxlbWVudF9pbmRleCA8PSBhci0+ZWxlbWVudF9jb3VudCkKLQl7Ci0JICBpZiAocC0+ZmlsZV9vZmZzZXQgIT0gKGZpbGVfcHRyKSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHAtPmFiZmQgPT0gKGJmZCAqKSBOVUxMKQotCQl7Ci0JCSAgcC0+YWJmZCA9IF9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCAoYXJjaCk7Ci0JCSAgcC0+YWJmZC0+b3JpZ2luID0gcC0+ZmlsZV9vZmZzZXQ7Ci0JCX0KLQkgICAgICByZXR1cm4gcC0+YWJmZDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0JICByZXR1cm4gKGJmZCAqKSBOVUxMOwotCX0KLQotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsCi0JCQlzZWN0aW9uLAotCQkJc3ltYm9scywKLQkJCW9mZnNldCwKLQkJCWZpbGVuYW1lX3B0ciwKLQkJCWZ1bmN0aW9ubmFtZV9wdHIsCi0JCQlsaW5lX3B0cikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLWllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKmJ1ZjsKLXsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKmFyID0gKGllZWVfYXJfZGF0YV90eXBlICopIE5VTEw7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlOwotCi0gIGlmIChhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0gICAgYXIgPSBhYmZkLT5teV9hcmNoaXZlLT50ZGF0YS5pZWVlX2FyX2RhdGE7Ci0gIGlmIChhciA9PSAoaWVlZV9hcl9kYXRhX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoSUVFRV9EQVRBIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChpZWVlX29iamVjdF9wIChhYmZkKSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0KLSAgYnVmLT5zdF9zaXplID0gaWVlZS0+dy5yLm1lX3JlY29yZCArIDE7Ci0gIGJ1Zi0+c3RfbW9kZSA9IDA2NDQ7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pZWVlX3NpemVvZl9oZWFkZXJzIChhYmZkLCB4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiB4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoZSBkZWJ1ZyBpbmZvIHJvdXRpbmVzIGFyZSBuZXZlciB1c2VkLiAgKi8KLSNpZiAwCi0KLXN0YXRpYyB2b2lkCi1pZWVlX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0KLX0KLQotc3RhdGljIHZvaWQKLWllZWVfYmZkX2RlYnVnX2luZm9fZW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0KLX0KLQotCi0vKiBBZGQgdGhpcyBzZWN0aW9uIHRvIHRoZSBsaXN0IG9mIHNlY3Rpb25zIHdlIGhhdmUgZGVidWcgaW5mbyBmb3IsIHRvCi0gICBiZSByZWFkeSB0byBvdXRwdXQgaXQgYXQgY2xvc2UgdGltZQotICAgKi8KLXN0YXRpYyB2b2lkCi1pZWVlX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChzZWN0aW9uLT5vd25lcik7Ci0gIGllZWVfZGF0YV90eXBlICpvdXRwdXRfaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIC8qIGNhbiBvbmx5IGFjY3VtdWxhdGUgZGF0YSBmcm9tIG90aGVyIGllZWUgYmZkcyAqLwotICBpZiAoc2VjdGlvbi0+b3duZXItPnh2ZWMgIT0gYWJmZC0+eHZlYykKLSAgICByZXR1cm47Ci0gIC8qIE9ubHkgYm90aGVyIG9uY2UgcGVyIGJmZCAqLwotICBpZiAoaWVlZS0+ZG9uZV9kZWJ1ZyA9PSB0cnVlKQotICAgIHJldHVybjsKLSAgaWVlZS0+ZG9uZV9kZWJ1ZyA9IHRydWU7Ci0KLSAgLyogRG9uJ3QgYm90aGVyIGlmIHRoZXJlIGlzIG5vIGRlYnVnIGluZm8gKi8KLSAgaWYgKGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID09IDApCi0gICAgcmV0dXJuOwotCi0KLSAgLyogQWRkIHRvIGNoYWluICovCi0gIHsKLSAgICBiZmRfY2hhaW5fdHlwZSAqbiA9IChiZmRfY2hhaW5fdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYmZkX2NoYWluX3R5cGUpKTsKLSAgICBpZiAoIW4pCi0gICAgICBhYm9ydCAoKTsJCS8qIEZJWE1FICovCi0gICAgbi0+dGhpcyA9IHNlY3Rpb24tPm93bmVyOwotICAgIG4tPm5leHQgPSAoYmZkX2NoYWluX3R5cGUgKikgTlVMTDsKLQotICAgIGlmIChvdXRwdXRfaWVlZS0+Y2hhaW5faGVhZCkKLSAgICAgIHsKLQlvdXRwdXRfaWVlZS0+Y2hhaW5faGVhZC0+bmV4dCA9IG47Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCW91dHB1dF9pZWVlLT5jaGFpbl9yb290ID0gbjsKLQotICAgICAgfQotICAgIG91dHB1dF9pZWVlLT5jaGFpbl9oZWFkID0gbjsKLSAgfQotfQotCi0jZW5kaWYKLQotI2RlZmluZQlpZWVlX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBpZWVlX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotCi0jZGVmaW5lIGllZWVfc2x1cnBfYXJtYXAgYmZkX3RydWUKLSNkZWZpbmUgaWVlZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF90cnVlCi0jZGVmaW5lIGllZWVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIGllZWVfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBpZWVlX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgaWVlZV9yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKLSNkZWZpbmUgaWVlZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0jZGVmaW5lIGllZWVfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotCi0jZGVmaW5lIGllZWVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBpZWVlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBpZWVlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaWVlZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGllZWVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgaWVlZV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBpZWVlX3NldF9hcmNoX21hY2ggX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2gKLQotI2RlZmluZSBpZWVlX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgaWVlZV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGllZWVfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBpZWVlX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBpZWVlX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGllZWVfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgaWVlZV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBpZWVlX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLypTVVBQUkVTUyA0NjAgKi8KLWNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWMgPQotewotICAiaWVlZSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2llZWVfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwKLSAgIGllZWVfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBpZWVlX2FyY2hpdmVfcCwKLSAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIGllZWVfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2loZXguYyBiL2JmZC9paGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzQwZDguLjAwMDAwMDAKLS0tIGEvYmZkL2loZXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCBIZXggb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0IDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IEludGVsIEhleCBmaWxlcyBsb29rIGxpa2U6Ci0KLTEuIElOVEVMIEZPUk1BVFMKLQotQS4gSW50ZWwgMQotCi0gICAxNi1iaXQgYWRkcmVzcy1maWVsZCBmb3JtYXQsIGZvciBmaWxlcyA2NGsgYnl0ZXMgaW4gbGVuZ3RoIG9yIGxlc3MuCi0KLSAgIERBVEEgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24oOikKLSAgIDIuLjMJCVRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiBoZXggbm90YXRpb24KLSAgIDQuLjUJCUhpZ2ggYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgNi4uNwkJTG93IGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMCIKLSAgIDEwLi54CURhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgotCXggPSAobnVtYmVyIG9mIGJ5dGVzIC0gMSkgKiAyICsgMTEKLSAgIHgrMS4ueCsyCUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgeCszLi54KzQJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgRU5EIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAwIgotICAgNC4uNwkJVHJhbnNmZXItYWRkcmVzcyAodXN1YWxseSAiMDAwMCIpCi0JCXRoZSBqdW1wLXRvIGFkZHJlc3MsIGV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDEiCi0gICAxMC4uMTEJQ2hlY2tzdW0sIGluIGhleCBub3RhdGlvbgotICAgMTIuLjEzCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLUIuIElOVEVMIDIKLQotICAgTUNTLTg2IGZvcm1hdCwgdXNpbmcgYSAyMC1iaXQgYWRkcmVzcyBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNjRLIGJ5dGVzLgotCi0gICBEQVRBIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQgb2YgdGhpcyByZWNvcmQsIGhleCBub3RhdGlvbgotICAgNC4uNQkJSGlnaCBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA2Li43CQlMb3cgYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAwIgotICAgMTAuLngJVGhlIGRhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgotCXggPSAobnVtYmVyIG9mIGRhdGEgYnl0ZXMgLSAxKSAqIDIgKyAxMQotICAgeCsxLi54KzIJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICB4KzMuLngrNAlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBFWFRFTkRFRCBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDIiCi0gICAxMC4uMTEJSGlnaCBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcwotICAgMTIuLjEzCUxvdyBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcwotICAgMTQuLjE1CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMTYuLjE3CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLSAgIFRoZSBjaGVja3N1bXMgYXJlIHRoZSB0d28ncyBjb21wbGVtZW50IG9mIHRoZSA4LWJpdCBzdW0KLSAgIHdpdGhvdXQgY2Fycnkgb2YgdGhlIGJ5dGUgY291bnQsIG9mZnNldCBhZGRyZXNzLCBhbmQgdGhlCi0gICByZWNvcmQgdHlwZS4KLQotICAgU1RBUlQgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMyIKLSAgIDEwLi4xMwk4MDg2IENTIHZhbHVlCi0gICAxNC4uMTcJODA4NiBJUCB2YWx1ZQotICAgMTguLjE5CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMjAuLjIxCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLUFub3RoZXIgZG9jdW1lbnQgcmVwb3J0cyB0aGVzZSBhZGRpdGlvbmFsIHR5cGVzOgotCi0gICBFWFRFTkRFRCBMSU5FQVIgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNCIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIGFkZHJlc3Mgb2Ygc3Vic2VxdWVudCByZWNvcmRzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgU1RBUlQgTElORUFSIEFERFJFU1MgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDUiCi0gICAxMC4uMTMJVXBwZXIgMTYgYml0cyBvZiBzdGFydCBhZGRyZXNzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotVGhlIE1SSSBjb21waWxlciB1c2VzIHRoaXMsIHdoaWNoIGlzIGEgcmVwZWF0IG9mIHR5cGUgNToKLQotICBFWFRFTkRFRCBTVEFSVCBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNSIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE0Li4xNwlMb3dlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE4Li4xOQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDIwLi4yMQlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIHZvaWQgaWhleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGloZXhfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IGloZXhfZ2V0X2J5dGUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgaWhleF9iYWRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2NhbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmloZXhfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX3JlY29yZAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGFzeW1ib2wgKmloZXhfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGloZXhfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBwdXQgb24gb25lIGxpbmUgZHVyaW5nIG91dHB1dC4gICovCi0KLSNkZWZpbmUgQ0hVTksgKDIxKQotCi0vKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KLQotI2RlZmluZSBOSUJCTEUoeCkgKGhleF92YWx1ZSAoeCkpCi0jZGVmaW5lIEhFWDIoYnVmZmVyKSAoKE5JQkJMRSAoKGJ1ZmZlcilbMF0pIDw8IDQpICsgTklCQkxFICgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIEhFWDQoYnVmZmVyKSAoKEhFWDIgKGJ1ZmZlcikgPDwgOCkgKyBIRVgyICgoYnVmZmVyKSArIDIpKQotI2RlZmluZSBJU0hFWCh4KSAoaGV4X3AgKHgpKQotCi0vKiBXaGVuIHdlIHdyaXRlIG91dCBhbiBpaGV4IHZhbHVlLCB0aGUgdmFsdWVzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgSW5zdGVhZCwgd2UgaG9sZCB0aGVtIGluIG1lbW9yeSBpbiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfbGlzdAotewotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKm5leHQ7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci19OwotCi0vKiBUaGUgaWhleCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqaGVhZDsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICp0YWlsOwotfTsKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gICovCi0KLXN0YXRpYyB2b2lkCi1paGV4X2luaXQgKCkKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGVkOwotCi0gIGlmICghIGluaXRlZCkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSB0cnVlOwotICAgICAgaGV4X2luaXQgKCk7Ci0gICAgfQotfQotCi0vKiBDcmVhdGUgYW4gaWhleCBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGRhdGEuaWhleF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKnRkYXRhOwotCi0gICAgICB0ZGF0YSA9ICgoc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKikKLQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0KSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuaWhleF9kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgYnl0ZSBmcm9tIGEgQkZELiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgIFJldHVybiBFT0Ygb24gZXJyb3Igb3IgZW5kIG9mIGZpbGUuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaWhleF9nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Ci17Ci0gIGJmZF9ieXRlIGM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JKmVycm9ycHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotCi0gIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOwotfQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgaW50IGM7Ci0gICAgIGJvb2xlYW4gZXJyb3I7Ci17Ci0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBpZiAoISBlcnJvcikKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKCEgaXNwcmludCAoYykpCi0Jc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYzsKLQkgIGJ1ZlsxXSA9ICdcMCc7Ci0JfQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiVkOiB1bmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIEludGVsIEhleCBmaWxlXG4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubywgYnVmKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLX0KLQotLyogUmVhZCBhbiBJbnRlbCBoZXggZmlsZSBhbmQgdHVybiBpdCBpbnRvIHNlY3Rpb25zLiAgV2UgY3JlYXRlIGEgbmV3Ci0gICBzZWN0aW9uIGZvciBlYWNoIGNvbnRpZ3VvdXMgc2V0IG9mIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfc2NhbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfdm1hIHNlZ2Jhc2U7Ci0gIGJmZF92bWEgZXh0YmFzZTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgaW50IGxpbmVubzsKLSAgYm9vbGVhbiBlcnJvcjsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplOwotICBpbnQgYzsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IDA7Ci0KLSAgc2VnYmFzZSA9IDA7Ci0gIGV4dGJhc2UgPSAwOwotICBzZWMgPSBOVUxMOwotICBsaW5lbm8gPSAxOwotICBlcnJvciA9IGZhbHNlOwotICBidWZzaXplID0gMDsKLSAgd2hpbGUgKChjID0gaWhleF9nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGlmIChjID09ICdccicpCi0JY29udGludWU7Ci0gICAgICBlbHNlIGlmIChjID09ICdcbicpCi0JewotCSAgKytsaW5lbm87Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChjICE9ICc6JykKLQl7Ci0JICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxlX3B0ciBwb3M7Ci0JICBjaGFyIGhkcls4XTsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgdW5zaWduZWQgaW50IGxlbjsKLQkgIGJmZF92bWEgYWRkcjsKLQkgIHVuc2lnbmVkIGludCB0eXBlOwotCSAgdW5zaWduZWQgaW50IGNoYXJzOwotCSAgdW5zaWduZWQgaW50IGNoa3N1bTsKLQotCSAgLyogVGhpcyBpcyBhIGRhdGEgcmVjb3JkLiAgKi8KLQotCSAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKLQotCSAgLyogUmVhZCB0aGUgaGVhZGVyIGJ5dGVzLiAgKi8KLQotCSAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCEgSVNIRVggKGhkcltpXSkpCi0JCXsKLQkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgbGVuID0gSEVYMiAoaGRyKTsKLQkgIGFkZHIgPSBIRVg0IChoZHIgKyAyKTsKLQkgIHR5cGUgPSBIRVgyIChoZHIgKyA2KTsKLQotCSAgLyogUmVhZCB0aGUgZGF0YSBieXRlcy4gICovCi0KLQkgIGNoYXJzID0gbGVuICogMiArIDI7Ci0JICBpZiAoY2hhcnMgPj0gYnVmc2l6ZSkKLQkgICAgewotCSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAoYnVmLCBjaGFycyk7Ci0JICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBidWZzaXplID0gY2hhcnM7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGNoYXJzLCBhYmZkKSAhPSBjaGFycykKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjaGFyczsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCEgSVNIRVggKGJ1ZltpXSkpCi0JCXsKLQkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgdGhlIGNoZWNrc3VtLiAgKi8KLQkgIGNoa3N1bSA9IGxlbiArIGFkZHIgKyAoYWRkciA+PiA4KSArIHR5cGU7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JICAgIGNoa3N1bSArPSBIRVgyIChidWYgKyAyICogaSk7Ci0JICBpZiAoKCgtIGNoa3N1bSkgJiAweGZmKSAhPSAodW5zaWduZWQgaW50KSBIRVgyIChidWYgKyAyICogaSkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiVkOiBiYWQgY2hlY2tzdW0gaW4gSW50ZWwgSGV4IGZpbGUgKGV4cGVjdGVkICV1LCBmb3VuZCAldSkiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sCi0JCSAoLSBjaGtzdW0pICYgMHhmZiwgKHVuc2lnbmVkIGludCkgSEVYMiAoYnVmICsgMiAqIGkpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIC8qIFRoaXMgaXMgYSBkYXRhIHJlY29yZC4gICovCi0JICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JCSAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHIpCi0JCXsKLQkJICAvKiBUaGlzIGRhdGEgZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJ1aWxkaW5nLiAgKi8KLQkJICBzZWMtPl9yYXdfc2l6ZSArPSBsZW47Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsZW4gPiAwKQotCQl7Ci0JCSAgY2hhciBzZWNidWZbMjBdOwotCQkgIGNoYXIgKnNlY25hbWU7Ci0KLQkJICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7Ci0JCSAgc2VjbmFtZSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzZWNidWYpICsgMSk7Ci0JCSAgaWYgKHNlY25hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKLQkJICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBzZWNuYW1lKTsKLQkJICBpZiAoc2VjID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzZWMtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotCQkgIHNlYy0+dm1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOwotCQkgIHNlYy0+bG1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOwotCQkgIHNlYy0+X3Jhd19zaXplID0gbGVuOwotCQkgIHNlYy0+ZmlsZXBvcyA9IHBvczsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMToKLQkgICAgICAvKiBBbiBlbmQgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+c3RhcnRfYWRkcmVzcyA9PSAwKQotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcjsKLQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0KLQkgICAgY2FzZSAyOgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAobGVuICE9IDIpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBzZWdiYXNlID0gSEVYNCAoYnVmKSA8PCA0OwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMzoKLQkgICAgICAvKiBBbiBleHRlbmRlZCBzdGFydCBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSA0KQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBzdGFydCBhZGRyZXNzIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBhYmZkLT5zdGFydF9hZGRyZXNzICs9IChIRVg0IChidWYpIDw8IDQpICsgSEVYNCAoYnVmICsgNCk7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSA0OgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSAyKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGV4dGJhc2UgPSBIRVg0IChidWYpIDw8IDE2OwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgNToKLQkgICAgICAvKiBBbiBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyByZWNvcmQuICAqLwotCSAgICAgIGlmIChsZW4gIT0gMiAmJiBsZW4gIT0gNCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGlmIChsZW4gPT0gMikKLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyArPSBIRVg0IChidWYpIDw8IDE2OwotCSAgICAgIGVsc2UKLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyA9IChIRVg0IChidWYpIDw8IDE2KSArIEhFWDQgKGJ1ZiArIDQpOwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczolZDogdW5yZWNvZ25pemVkIGloZXggdHlwZSAldSBpbiBJbnRlbCBIZXggZmlsZVxuIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCB0eXBlKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVycm9yKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUcnkgdG8gcmVjb2duaXplIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaWhleF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBiWzldOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgaWhleF9pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9yZWFkIChiLCAxLCA5LCBhYmZkKSAhPSA5KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYlswXSAhPSAnOicpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IDk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBJU0hFWCAoYltpXSkpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHR5cGUgPSBIRVgyIChiICsgNyk7Ci0gIGlmICh0eXBlID4gNSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgaXQgbG9va3MgbGlrZSBpdCByZWFsbHkgaXMgYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi0gIGlmICghIGloZXhfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhIGloZXhfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgY29udGVudHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgaW50IGM7Ci0gIGJmZF9ieXRlICpwOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemU7Ci0gIGJvb2xlYW4gZXJyb3I7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBwID0gY29udGVudHM7Ci0gIGJ1ZnNpemUgPSAwOwotICBlcnJvciA9IGZhbHNlOwotICB3aGlsZSAoKGMgPSBpaGV4X2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciBoZHJbOF07Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgYmZkX3ZtYSBhZGRyOwotICAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGloZXhfc2NhbiBoYXMgc3VjY2VlZGVkLCBzbyB3ZSBvdWdodCB0bwotICAgICAgICAga25vdyB0aGUgZXhhY3QgZm9ybWF0LiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGMgPT0gJzonKTsKLQotICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGxlbiA9IEhFWDIgKGhkcik7Ci0gICAgICBhZGRyID0gSEVYNCAoaGRyICsgMik7Ci0gICAgICB0eXBlID0gSEVYMiAoaGRyICsgNik7Ci0KLSAgICAgIC8qIFdlIHNob3VsZCBvbmx5IHNlZSB0eXBlIDAgcmVjb3JkcyBoZXJlLiAgKi8KLSAgICAgIGlmICh0eXBlICE9IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogaW50ZXJuYWwgZXJyb3IgaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpZiAobGVuICogMiA+IGJ1ZnNpemUpCi0JewotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChidWYsIGxlbiAqIDIpOwotCSAgaWYgKGJ1ZiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGJ1ZnNpemUgPSBsZW4gKiAyOwotCX0KLQotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGxlbiAqIDIsIGFiZmQpICE9IGxlbiAqIDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkqcCsrID0gSEVYMiAoYnVmICsgMiAqIGkpOwotICAgICAgaWYgKChiZmRfc2l6ZV90eXBlKSAocCAtIGNvbnRlbnRzKSA+PSBzZWN0aW9uLT5fcmF3X3NpemUpCi0JewotCSAgLyogV2UndmUgcmVhZCBldmVyeXRoaW5nIGluIHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmIChidWYgIT0gTlVMTCkKLQkgICAgZnJlZSAoYnVmKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogU2tpcCB0aGUgY2hlY2tzdW0uICAqLwotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIDIsIGFiZmQpICE9IDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmICgoYmZkX3NpemVfdHlwZSkgKHAgLSBjb250ZW50cykgPCBzZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBiYWQgc2VjdGlvbiBsZW5ndGggaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPSBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBpaGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgc2VjdGlvbi0+dXNlZF9ieV9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbWVtY3B5IChsb2NhdGlvbiwgKGJmZF9ieXRlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkICsgb2Zmc2V0LAotCSAgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbjsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICp0ZGF0YTsKLQotICBpZiAoY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0gICAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuID0gKChzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGloZXhfZGF0YV9saXN0KSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtY3B5IChkYXRhLCBsb2NhdGlvbiwgKHNpemVfdCkgY291bnQpOwotCi0gIG4tPmRhdGEgPSBkYXRhOwotICBuLT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKLSAgbi0+c2l6ZSA9IGNvdW50OwotCi0gIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKLSAgICAgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLwotICB0ZGF0YSA9IGFiZmQtPnRkYXRhLmloZXhfZGF0YTsKLSAgaWYgKHRkYXRhLT50YWlsICE9IE5VTEwKLSAgICAgICYmIG4tPndoZXJlID49IHRkYXRhLT50YWlsLT53aGVyZSkKLSAgICB7Ci0gICAgICB0ZGF0YS0+dGFpbC0+bmV4dCA9IG47Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIHRkYXRhLT50YWlsID0gbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKipwcDsKLQotICAgICAgZm9yIChwcCA9ICZ0ZGF0YS0+aGVhZDsKLQkgICAqcHAgIT0gTlVMTCAmJiAoKnBwKS0+d2hlcmUgPCBuLT53aGVyZTsKLQkgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQk7Ci0gICAgICBuLT5uZXh0ID0gKnBwOwotICAgICAgKnBwID0gbjsKLSAgICAgIGlmIChuLT5uZXh0ID09IE5VTEwpCi0JdGRhdGEtPnRhaWwgPSBuOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSByZWNvcmQgb3V0IHRvIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBjb3VudCwgYWRkciwgdHlwZSwgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotICBjaGFyIGJ1Zls5ICsgQ0hVTksgKiAyICsgNF07Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBjaGtzdW07Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jZGVmaW5lIFRPSEVYKGJ1ZiwgdikgXAotICAoKGJ1ZilbMF0gPSBkaWdzWygodikgPj4gNCkgJiAweGZdLCAoYnVmKVsxXSA9IGRpZ3NbKHYpICYgMHhmXSkKLQotICBidWZbMF0gPSAnOic7Ci0gIFRPSEVYIChidWYgKyAxLCBjb3VudCk7Ci0gIFRPSEVYIChidWYgKyAzLCAoYWRkciA+PiA4KSAmIDB4ZmYpOwotICBUT0hFWCAoYnVmICsgNSwgYWRkciAmIDB4ZmYpOwotICBUT0hFWCAoYnVmICsgNywgdHlwZSk7Ci0KLSAgY2hrc3VtID0gY291bnQgKyBhZGRyICsgKGFkZHIgPj4gOCkgKyB0eXBlOwotCi0gIGZvciAoaSA9IDAsIHAgPSBidWYgKyA5OyBpIDwgY291bnQ7IGkrKywgcCArPSAyLCBkYXRhKyspCi0gICAgewotICAgICAgVE9IRVggKHAsICpkYXRhKTsKLSAgICAgIGNoa3N1bSArPSAqZGF0YTsKLSAgICB9Ci0KLSAgVE9IRVggKHAsICgtIGNoa3N1bSkgJiAweGZmKTsKLSAgcFsyXSA9ICdccic7Ci0gIHBbM10gPSAnXG4nOwotCi0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOSArIGNvdW50ICogMiArIDQsIGFiZmQpICE9IDkgKyBjb3VudCAqIDIgKyA0KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF92bWEgc2VnYmFzZTsKLSAgYmZkX3ZtYSBleHRiYXNlOwotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKmw7Ci0KLSAgc2VnYmFzZSA9IDA7Ci0gIGV4dGJhc2UgPSAwOwotICBmb3IgKGwgPSBhYmZkLT50ZGF0YS5paGV4X2RhdGEtPmhlYWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYmZkX3ZtYSB3aGVyZTsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLQotICAgICAgd2hlcmUgPSBsLT53aGVyZTsKLSAgICAgIHAgPSBsLT5kYXRhOwotICAgICAgY291bnQgPSBsLT5zaXplOwotICAgICAgd2hpbGUgKGNvdW50ID4gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIG5vdzsKLQotCSAgbm93ID0gY291bnQ7Ci0JICBpZiAobm93ID4gQ0hVTkspCi0JICAgIG5vdyA9IENIVU5LOwotCi0JICBpZiAod2hlcmUgPiBzZWdiYXNlICsgZXh0YmFzZSArIDB4ZmZmZikKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIGFkZHJbMl07Ci0KLQkgICAgICAvKiBXZSBuZWVkIGEgbmV3IGJhc2UgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKHdoZXJlIDw9IDB4ZmZmZmYpCi0JCXsKLQkJICAvKiBUaGUgYWRkcmVzc2VzIHNob3VsZCBiZSBzb3J0ZWQuICAqLwotCQkgIEJGRF9BU1NFUlQgKGV4dGJhc2UgPT0gMCk7Ci0KLQkJICBzZWdiYXNlID0gd2hlcmUgJiAweGYwMDAwOwotCQkgIGFkZHJbMF0gPSAoYmZkX2J5dGUpKHNlZ2Jhc2UgPj4gMTIpICYgMHhmZjsKLQkJICBhZGRyWzFdID0gKGJmZF9ieXRlKShzZWdiYXNlID4+IDQpICYgMHhmZjsKLQkJICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGUgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgYW5kIHRoZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGFyZSBjb21iaW5lZCwgYXQgbGVhc3QgYnkKLSAgICAgICAgICAgICAgICAgICAgIHNvbWUgcmVhZGVycy4gIFdlIG5lZWQgYW4gZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgIHJlY29yZCBoZXJlLCBzbyBpZiB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IGFuCi0gICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCwgemVybyBpdCBvdXQgdG8gYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2lvbi4gICovCi0JCSAgaWYgKHNlZ2Jhc2UgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgYWRkclswXSA9IDA7Ci0JCSAgICAgIGFkZHJbMV0gPSAwOwotCQkgICAgICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHNlZ2Jhc2UgPSAwOwotCQkgICAgfQotCi0JCSAgZXh0YmFzZSA9IHdoZXJlICYgMHhmZmZmMDAwMDsKLQkJICBpZiAod2hlcmUgPiBleHRiYXNlICsgMHhmZmZmKQotCQkgICAgewotCQkgICAgICBjaGFyIGJ1ZlsyMF07Ci0KLQkJICAgICAgc3ByaW50Zl92bWEgKGJ1Ziwgd2hlcmUpOwotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogYWRkcmVzcyAweCVzIG91dCBvZiByYW5nZSBmb3IgSW50ZXggSGV4IGZpbGUiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYnVmKTsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBhZGRyWzBdID0gKGJmZF9ieXRlKShleHRiYXNlID4+IDI0KSAmIDB4ZmY7Ci0JCSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZXh0YmFzZSA+PiAxNikgJiAweGZmOwotCQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCA0LCBhZGRyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBub3csIHdoZXJlIC0gKGV4dGJhc2UgKyBzZWdiYXNlKSwKLQkJCQkgICAwLCBwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICB3aGVyZSArPSBub3c7Ci0JICBwICs9IG5vdzsKLQkgIGNvdW50IC09IG5vdzsKLQl9Ci0gICAgfQotCi0gIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzICE9IDApCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydDsKLSAgICAgIGJmZF9ieXRlIHN0YXJ0YnVmWzRdOwotCi0gICAgICBzdGFydCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3M7Ci0KLSAgICAgIGlmIChzdGFydCA8PSAweGZmZmZmKQotCXsKLQkgIHN0YXJ0YnVmWzBdID0gKGJmZF9ieXRlKSgoc3RhcnQgJiAweGYwMDAwKSA+PiAxMikgJiAweGZmOwotCSAgc3RhcnRidWZbMV0gPSAwOwotCSAgc3RhcnRidWZbMl0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDgpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzNdID0gKGJmZF9ieXRlKXN0YXJ0ICYgMHhmZjsKLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCA0LCAwLCAzLCBzdGFydGJ1ZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RhcnRidWZbMF0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDI0KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlsxXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gMTYpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzJdID0gKGJmZF9ieXRlKShzdGFydCA+PiA4KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlszXSA9IChiZmRfYnl0ZSlzdGFydCAmIDB4ZmY7Ci0JICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgNCwgMCwgNSwgc3RhcnRidWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgMSwgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gIFRoaXMgaXMgcmVxdWlyZWQgb25seSBiZWNhdXNlCi0gICBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSB3YW50cyB0byBjcmVhdGUgYSBzeW1ib2wgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotaWhleF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXc7Ci0KLSAgbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcgIT0gTlVMTCkKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhlIG91dHB1dCBmaWxlLiAgVGhlIGFyY2hpdGVjdHVyZSBpcwotICAgaXJyZWxldmFudCwgc28gd2UgaWdub3JlIGVycm9ycyBhYm91dCB1bmtub3duIGFyY2hpdGVjdHVyZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpKQotICAgIHsKLSAgICAgIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycywgZm9yIHRoZSBsaW5rZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWloZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNvbWUgcmFuZG9tIGRlZmluaXRpb25zIGZvciB0aGUgdGFyZ2V0IHZlY3Rvci4gICovCi0KLSNkZWZpbmUJaWhleF9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgaWhleF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgaWhleF9uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIGloZXhfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIGloZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBiZmRfMGwKLSNkZWZpbmUgaWhleF9nZXRfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIGloZXhfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBpaGV4X2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaWhleF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBpaGV4X2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBpaGV4X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGloZXhfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBpaGV4X3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBpaGV4X21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgaWhleF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBpaGV4X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgaWhleF9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGloZXhfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGloZXhfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgaWhleF9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBpaGV4X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGloZXhfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoZSBJbnRlbCBIZXggdGFyZ2V0IHZlY3Rvci4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgaWhleF92ZWMgPQotewotICAiaWhleCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAwLAkJCQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBpaGV4X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIGloZXhfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoaWhleCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2luaXQuYyBiL2JmZC9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTFkNTAuLjAwMDAwMDAKLS0tIGEvYmZkL2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIGJmZCBpbml0aWFsaXphdGlvbiBzdHVmZgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKgotU0VDVElPTgotCUluaXRpYWxpemF0aW9uCi0KLQlUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBpbml0aWFsaXppbmcgYSBCRkQuCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfaW5pdAotCi1TWU5PUFNJUwotCXZvaWQgYmZkX2luaXQodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgQkZEIGZ1bmN0aW9uIHRvCi0JaW5pdGlhbGl6ZSBtYWdpY2FsIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KLSovCi0KLS8qIEFjdHVhbGx5LCB0aGVyZSBpcyBjdXJyZW50bHkgbm90aGluZyBmb3IgdGhpcyBmdW5jdGlvbiB0byBkby4KLSAgIEhvd2V2ZXIsIHNvbWVkYXkgaXQgbWF5IGJlIG5lZWRlZCwgc28ga2VlcCBpdCBhcm91bmQuICAqLwotCi12b2lkCi1iZmRfaW5pdCAoKQotewotfQpkaWZmIC0tZ2l0IGEvYmZkL2lyaXgtY29yZS5jIGIvYmZkL2lyaXgtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDZlNmE3Li4wMDAwMDAwCi0tLSBhL2JmZC9pcml4LWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIElyaXggY29yZSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgotICAgQ29udmVydGVkIHRvIGJhY2stZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSXJpeCBzdHlsZSBjb3JlCi0gICBmaWxlcyAobmFtZWx5LCBJcml4IDQgYW5kIElyaXggNSwgc28gZmFyKS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmZGVmIElSSVhfQ09SRQotCi0jaW5jbHVkZSA8Y29yZS5vdXQuaD4KLQotc3RydWN0IHNnaV9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgY2hhciBjbWRbQ09SRV9OQU1FU0laRV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5zZ2lfY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX3NpZ25hbChiZmQpIChjb3JlX2hkcihiZmQpLT5zaWcpCi0jZGVmaW5lIGNvcmVfY29tbWFuZChiZmQpIChjb3JlX2hkcihiZmQpLT5jbWQpCi0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsIGJmZF92bWEsIGZpbGVfcHRyKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqaXJpeF9jb3JlX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaXJpeF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSA0OwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaXJpeF9jb3JlX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBpOwotICBjaGFyICpzZWNuYW1lOwotICBzdHJ1Y3QgY29yZW91dCBjb3Jlb3V0OwotICBzdHJ1Y3QgaWRlc2MgKmlkZywgKmlkZiwgKmlkczsKLQotICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmY29yZW91dCwgMSwgc2l6ZW9mIGNvcmVvdXQsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiBjb3Jlb3V0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmbmRlZiBDT1JFX01BR0lDTjMyCi0jZGVmaW5lIENPUkVfTUFHSUNOMzIgQ09SRV9NQUdJQwotI2VuZGlmCi0gIGlmICgoY29yZW91dC5jX21hZ2ljICE9IENPUkVfTUFHSUMgJiYgY29yZW91dC5jX21hZ2ljICE9IENPUkVfTUFHSUNOMzIpCi0gICAgICB8fCBjb3Jlb3V0LmNfdmVyc2lvbiAhPSBDT1JFX1ZFUlNJT04xKQotICAgIHJldHVybiAwOwotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNnaV9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBjb3Jlb3V0LmNfbmFtZSwgQ09SRV9OQU1FU0laRSk7Ci0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IGNvcmVvdXQuY19zaWdjYXVzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGNvcmVvdXQuY192bWFwb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgY29yZW91dC5jX252bWFwOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHZtYXAgdm1hcDsKLQotICAgICAgdmFsID0gYmZkX3JlYWQgKChQVFIpJnZtYXAsIDEsIHNpemVvZiB2bWFwLCBhYmZkKTsKLSAgICAgIGlmICh2YWwgIT0gc2l6ZW9mIHZtYXApCi0JYnJlYWs7Ci0KLSAgICAgIHN3aXRjaCAodm1hcC52X3R5cGUpCi0JewotCWNhc2UgVkRBVEE6Ci0JICBzZWNuYW1lID0gIi5kYXRhIjsKLQkgIGJyZWFrOwotCWNhc2UgVlNUQUNLOgotCSAgc2VjbmFtZSA9ICIuc3RhY2siOwotCSAgYnJlYWs7Ci0jaWZkZWYgVk1BUEZJTEUKLQljYXNlIFZNQVBGSUxFOgotCSAgc2VjbmFtZSA9ICIubWFwZmlsZSI7Ci0JICBicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEEgZmlsZSBvZmZzZXQgb2YgemVybyBtZWFucyB0aGF0IHRoZSBzZWN0aW9uIGlzIG5vdCBjb250YWluZWQKLQkgaW4gdGhlIGNvcmVmaWxlLiAgKi8KLSAgICAgIGlmICh2bWFwLnZfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0JCQkgICAgICBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgIHZtYXAudl9sZW4sCi0JCQkgICAgICB2bWFwLnZfdmFkZHIsCi0JCQkgICAgICB2bWFwLnZfb2Zmc2V0KSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHJlZ3MgYXJlIGNvbnRpZ3VvdXMgd2l0aGluIHRoZSBjb3JlIGZpbGUuICovCi0KLSAgaWRnID0gJmNvcmVvdXQuY19pZGVzY1tJX0dQUkVHU107Ci0gIGlkZiA9ICZjb3Jlb3V0LmNfaWRlc2NbSV9GUFJFR1NdOwotICBpZHMgPSAmY29yZW91dC5jX2lkZXNjW0lfU1BFQ1JFR1NdOwotCi0gIGlmIChpZGctPmlfb2Zmc2V0ICsgaWRnLT5pX2xlbiAhPSBpZGYtPmlfb2Zmc2V0Ci0gICAgICB8fCBpZGYtPmlfb2Zmc2V0ICsgaWRmLT5pX2xlbiAhPSBpZHMtPmlfb2Zmc2V0KQotICAgIHJldHVybiAwOwkJCS8qIENhbid0IGRlYWwgd2l0aCBub24tY29udGlnIHJlZ3MgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlkZy0+aV9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCSAgICAgU0VDX0hBU19DT05URU5UUywKLQkJICAgICBpZGctPmlfbGVuICsgaWRmLT5pX2xlbiArIGlkcy0+aV9sZW4sCi0JCSAgICAgMCwKLQkJICAgICBpZGctPmlfb2Zmc2V0KTsKLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWlyaXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCQkvKiBYWFggLSBGSVhNRSAqLwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1pcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotI2RlZmluZSBpcml4X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaXJpeF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaXJpeF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBpcml4X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaXJpeF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaXJpeF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBpcml4X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgaXJpeF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiaXJpeC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGlyaXhfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGlyaXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGlyaXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwotCi0jZW5kaWYgLyogSVJJWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvbGliYW91dC5oIGIvYmZkL2xpYmFvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwMWQzZC4uMDAwMDAwMAotLS0gYS9iZmQvbGliYW91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIGEub3V0IChhbmQgc2ltaWxhcikgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExJQkFPVVRfSAotI2RlZmluZSBMSUJBT1VUX0gKLQotLyogV2UgdHJ5IHRvIGVuY2Fwc3VsYXRlIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgdmFyaW91cyBhLm91dCBmaWxlCi0gICB2YXJpYW50cyBpbiBhIGZldyByb3V0aW5lcywgYW5kIG90aGVyd2lzZSBzaGFyZSBsYXJnZSBtYXNzZXMgb2YgY29kZS4KLSAgIFRoaXMgbWVhbnMgd2Ugb25seSBoYXZlIHRvIGZpeCBidWdzIGluIG9uZSBwbGFjZSwgbW9zdCBvZiB0aGUgdGltZS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIFBhcmFtZXRlcml6ZSB0aGUgYS5vdXQgY29kZSBiYXNlZCBvbiB3aGV0aGVyIGl0IGlzIGJlaW5nIGJ1aWx0Ci0gICBmb3IgYSAzMi1iaXQgYXJjaGl0ZWN0dXJlIG9yIGEgNjQtYml0IGFyY2hpdGVjdHVyZS4gICovCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBHRVRfV09SRCBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgR0VUX1NXT1JEIGJmZF9oX2dldF9zaWduZWRfNjQKLSNkZWZpbmUgUFVUX1dPUkQgYmZkX2hfcHV0XzY0Ci0jaWZuZGVmIE5BTUUKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoeCxfNjRfLHkpCi0jZW5kaWYKLSNkZWZpbmUgSk5BTUUoeCkgQ0FUKHgsXzY0KQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDgKLSNlbHNlIC8qIEFSQ0hfU0laRSA9PSAzMiAqLwotI2RlZmluZSBHRVRfV09SRCBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgR0VUX1NXT1JEIGJmZF9oX2dldF9zaWduZWRfMzIKLSNkZWZpbmUgUFVUX1dPUkQgYmZkX2hfcHV0XzMyCi0jaWZuZGVmIE5BTUUKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoeCxfMzJfLHkpCi0jZW5kaWYKLSNkZWZpbmUgSk5BTUUoeCkgQ0FUKHgsXzMyKQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNlbmRpZiAvKiBBUkNIX1NJWkU9PTMyICovCi0KLS8qIERlY2xhcmUgYXQgZmlsZSBsZXZlbCwgc2luY2UgdXNlZCBpbiBwYXJhbWV0ZXIgbGlzdHMsIHdoaWNoIGhhdmUKLSAgIHdlaXJkIHNjb3BlLiAgKi8KLXN0cnVjdCBleHRlcm5hbF9leGVjOwotc3RydWN0IGV4dGVybmFsX25saXN0Owotc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbDsKLXN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWw7Ci0MCi0vKiBhLm91dCBiYWNrZW5kIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogV2hldGhlciB0aGlzIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuIG91dC4gICovCi0gIGJvb2xlYW4gd3JpdHRlbjsKLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgKi8KLSAgaW50IGluZHg7Ci19OwotCi0vKiBhLm91dCBiYWNrZW5kIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIGEub3V0IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYW91dF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIGEub3V0IGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBhb3V0X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0MCi0vKiBCYWNrLWVuZCBpbmZvcm1hdGlvbiBmb3IgdmFyaW91cyBhLm91dCB0YXJnZXRzLiAgKi8KLXN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YQotewotICAvKiBBcmUgWk1BR0lDIGZpbGVzIG1hcHBlZCBjb250aWd1b3VzbHk/ICBJZiBzbywgdGhlIHRleHQgc2VjdGlvbiBtYXkKLSAgICAgbmVlZCBtb3JlIHBhZGRpbmcsIGlmIHRoZSBzZWdtZW50IHNpemUgKGdyYW51bGFyaXR5IGZvciBtZW1vcnkgYWNjZXNzCi0gICAgIGNvbnRyb2wpIGlzIGxhcmdlciB0aGFuIHRoZSBwYWdlIHNpemUuICAqLwotICB1bnNpZ25lZCBjaGFyIHptYWdpY19tYXBwZWRfY29udGlndW91czsKLSAgLyogSWYgdGhpcyBmbGFnIGlzIHNldCwgWk1BR0lDL05NQUdJQyBmaWxlIGhlYWRlcnMgZ2V0IG1hcHBlZCBpbiB3aXRoIHRoZQotICAgICB0ZXh0IHNlY3Rpb24sIHdoaWNoIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlsZSBoZWFkZXIuCi0gICAgIElmIG5vdCwgdGhlIHRleHQgc2VjdGlvbiBzdGFydHMgb24gdGhlIG5leHQgcGFnZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdGV4dF9pbmNsdWRlc19oZWFkZXI7Ci0KLSAgLyogSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlbiBpZiB0aGUgZW50cnkgYWRkcmVzcyBpcyBub3QgaW4gdGhlCi0gICAgIGZpcnN0IFNFR01FTlRfU0laRSBieXRlcyBvZiB0aGUgdGV4dCBzZWN0aW9uLCBpdCBpcyB0YWtlbiB0byBiZQotICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWZ1bAotICAgICBmb3Iga2VybmVscy4gICovCi0gIHVuc2lnbmVkIGNoYXIgZW50cnlfaXNfdGV4dF9hZGRyZXNzOwotCi0gIC8qIFRoZSB2YWx1ZSB0byBwYXNzIHRvIE5fU0VUX0ZMQUdTLiAgKi8KLSAgdW5zaWduZWQgY2hhciBleGVjX2hkcl9mbGFnczsKLQotICAvKiBJZiB0aGUgdGV4dCBzZWN0aW9uIFZNQSBpc24ndCBzcGVjaWZpZWQsIGFuZCB3ZSBuZWVkIGFuIGFic29sdXRlCi0gICAgIGFkZHJlc3MsIHVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0LiAgSWYgd2UncmUgcHJvZHVjaW5nIGEgcmVsb2NhdGFibGUKLSAgICAgZmlsZSwgemVybyBpcyBhbHdheXMgdXNlZC4gICovCi0gIC8qID8/IFBlcmhhcHMgYSBjYWxsYmFjayB3b3VsZCBiZSBhIGJldHRlciBjaG9pY2U/ICBXaWxsIHRoaXMgZG8gYW55dGhpbmcKLSAgICAgcmVhc29uYWJsZSBmb3IgYSBmb3JtYXQgdGhhdCBoYW5kbGVzIG11bHRpcGxlIENQVXMgd2l0aCBkaWZmZXJlbnQKLSAgICAgbG9hZCBhZGRyZXNzZXMgZm9yIGVhY2g/ICAqLwotICBiZmRfdm1hIGRlZmF1bHRfdGV4dF92bWE7Ci0KLSAgLyogQ2FsbGJhY2sgZm9yIHNldHRpbmcgdGhlIHBhZ2UgYW5kIHNlZ21lbnQgc2l6ZXMsIGlmIHRoZXkgY2FuJ3QgYmUKLSAgICAgdHJpdmlhbGx5IGRldGVybWluZWQgZnJvbSB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgYm9vbGVhbiAoKnNldF9zaXplcykgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiB6bWFnaWMgZmlsZXMgb25seS4gRm9yIGdvMzIsIHRoZSBsZW5ndGggb2YgdGhlIGV4ZWMgaGVhZGVyIGNvbnRyaWJ1dGVzCi0gICAgIHRvIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24gaW4gdGhlIGZpbGUgZm9yIGFsaWdubWVudCBwdXJwb3NlcyBidXQKLSAgICAgZG9lcyAqbm90KiBnZXQgY291bnRlZCBpbiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IHNlY3Rpb24uICovCi0gIHVuc2lnbmVkIGNoYXIgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQ7Ci0KLSAgLyogQ2FsbGJhY2sgZnJvbSB0aGUgYWRkIHN5bWJvbHMgcGhhc2Ugb2YgdGhlIGxpbmtlciBjb2RlIHRvIGhhbmRsZQotICAgICBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9keW5hbWljX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKiwKLQkJCQkJICBiZmRfc2l6ZV90eXBlICosIGNoYXIgKiopKTsKLQotICAvKiBDYWxsYmFjayBmcm9tIHRoZSBhZGQgc3ltYm9scyBwaGFzZSBvZiB0aGUgbGlua2VyIGNvZGUgdG8gaGFuZGxlCi0gICAgIGFkZGluZyBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0gIGJvb2xlYW4gKCphZGRfb25lX3N5bWJvbCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJICAgICBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAotCQkJCSAgICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLAotCQkJCSAgICAgYm9vbGVhbiwKLQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLSAgLyogQ2FsbGVkIHRvIGhhbmRsZSBsaW5raW5nIGEgZHluYW1pYyBvYmplY3QuICAqLwotICBib29sZWFuICgqbGlua19keW5hbWljX29iamVjdCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICopKTsKLQotICAvKiBDYWxsZWQgZm9yIGVhY2ggZ2xvYmFsIHN5bWJvbCBiZWluZyB3cml0dGVuIG91dCBieSB0aGUgbGlua2VyLgotICAgICBUaGlzIHNob3VsZCB3cml0ZSBvdXQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKndyaXRlX2R5bmFtaWNfc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICAvKiBJZiB0aGlzIGNhbGxiYWNrIGlzIG5vdCBOVUxMLCB0aGUgbGlua2VyIGNhbGxzIGl0IGZvciBlYWNoIHJlbG9jLgotICAgICBSRUxPQyBpcyBhIHBvaW50ZXIgdG8gdGhlIHVuc3dhcHBlZCByZWxvYy4gIElmICpTS0lQIGlzIHNldCB0bwotICAgICB0cnVlLCB0aGUgcmVsb2Mgd2lsbCBiZSBza2lwcGVkLiAgKlJFTE9DQVRJT04gbWF5IGJlIGNoYW5nZWQgdG8KLSAgICAgY2hhbmdlIHRoZSBlZmZlY3RzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKmNoZWNrX2R5bmFtaWNfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkgIGJmZCAqaW5wdXRfYmZkLAotCQkJCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkJCQkJICBQVFIgcmVsb2MsIGJmZF9ieXRlICpjb250ZW50cywKLQkJCQkJICBib29sZWFuICpza2lwLAotCQkJCQkgIGJmZF92bWEgKnJlbG9jYXRpb24pKTsKLQotICAvKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBhIGxpbmsgdG8gZmluaXNoIHVwIGFueSBkeW5hbWljIGxpbmtpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqZmluaXNoX2R5bmFtaWNfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLX07Ci0jZGVmaW5lIGFvdXRfYmFja2VuZF9pbmZvKGFiZmQpIFwKLQkoKENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSAqKSgoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkpCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBpbiBtZW1vcnkgb2YgYSAic3RydWN0IGV4ZWMiIHdoaWxlIHdlIHByb2Nlc3MgaXQuCi0gICBBbGwgJ2xlbmd0aHMnIGFyZSBnaXZlbiBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAgIEFsbCAnYWxpZ25tZW50cycgYXJlIGZvciByZWxpbmthYmxlIGZpbGVzIG9ubHk7ICBhbiBhbGlnbm1lbnQgb2YKLQknbicgaW5kaWNhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgbXVzdCBiZWdpbiBhdCBhbgotCWFkZHJlc3MgdGhhdCBpcyBhIG11bHRpcGxlIG9mICgyKipuKS4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9leGVjCi17Ci0gICAgbG9uZyBhX2luZm87CQkvKiBNYWdpYyBudW1iZXIgYW5kIGZsYWdzLCBwYWNrZWQgKi8KLSAgICBiZmRfdm1hIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAgKi8KLSAgICBiZmRfdm1hIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAgKi8KLSAgICBiZmRfdm1hIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGluIG1lbSAqLwotICAgIGJmZF92bWEgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUgKi8KLSAgICBiZmRfdm1hIGFfZW50cnk7CQkvKiBzdGFydCBhZGRyZXNzICovCi0gICAgYmZkX3ZtYSBhX3Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiB0ZXh0J3MgcmVsb2NhdGlvbiBpbmZvLCBpbiBieXRlcyAqLwotICAgIGJmZF92bWEgYV9kcnNpemU7CQkvKiBsZW5ndGggb2YgZGF0YSdzIHJlbG9jYXRpb24gaW5mbywgaW4gYnl0ZXMgKi8KLSAgICAvKiBBZGRlZCBmb3IgaTk2MCAqLwotICAgIGJmZF92bWEgYV90bG9hZDsJCS8qIFRleHQgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLSAgICBiZmRfdm1hIGFfZGxvYWQ7CQkvKiBEYXRhIHJ1bnRpbWUgbG9hZCBhZGRyZXNzICovCi0gICAgdW5zaWduZWQgY2hhciBhX3RhbGlnbjsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudCAqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9kYWxpZ247CS8qIEFsaWdubWVudCBvZiBkYXRhIHNlZ21lbnQgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfYmFsaWduOwkvKiBBbGlnbm1lbnQgb2YgYnNzIHNlZ21lbnQgKi8KLSAgICBjaGFyIGFfcmVsYXhhYmxlOyAgICAgICAgICAgLyogRW5vdWdoIGluZm8gZm9yIGxpbmtlciByZWxheCAqLwotfTsKLQotLyogTWFnaWMgbnVtYmVyIGlzIHdyaXR0ZW4gCi08IE1TQiAgICAgICAgICA+Ci0zMTMwMjkyODI3MjYyNTI0MjMyMjIxMjAxOTE4MTcxNjE1MTQxMzEyMTExMDA5MDgwNzA2MDUwNDAzMDIwMTAwCi08IEZMQUdTICAgICAgICA+PCBNQUNISU5FIFRZUEUgPjwgIE1BR0lDIE5VTUJFUiAgICAgICAgICAgICAgICA+Ci0qLwotLyogTWFnaWMgbnVtYmVyIGZvciBOZXRCU0QgaXMKLTxNU0IgICAgICAgICAgID4KLTMxMzAyOTI4MjcyNjI1MjQyMzIyMjEyMDE5MTgxNzE2MTUxNDEzMTIxMTEwMDkwODA3MDYwNTA0MDMwMjAxMDAKLTwgRkxBR1MgICAgPjwgTUFDSElORSBUWVBFICAgICA+PCAgTUFHSUMgTlVNQkVSICAgICAgICAgICAgICAgID4KLSovCi0KLWVudW0gbWFjaGluZV90eXBlIHsKLSAgTV9VTktOT1dOID0gMCwKLSAgTV82ODAxMCA9IDEsCi0gIE1fNjgwMjAgPSAyLAotICBNX1NQQVJDID0gMywKLSAgLyogc2tpcCBhIGJ1bmNoIHNvIHdlIGRvbid0IHJ1biBpbnRvIGFueSBvZiBzdW5zIG51bWJlcnMgKi8KLSAgLyogbWFrZSB0aGVzZSB1cCBmb3IgdGhlIG5zMzJrKi8KLSAgTV9OUzMyMDMyID0gKDY0KSwJCS8qIG5zMzIwMzIgcnVubmluZyA/ICovCi0gIE1fTlMzMjUzMiA9ICg2NCArIDUpLAkJLyogbnMzMjUzMiBydW5uaW5nIG1hY2ggKi8KLQotICBNXzM4NiA9IDEwMCwKLSAgTV8yOUsgPSAxMDEsICAgICAgICAgIC8qIEFNRCAyOTAwMCAqLwotICBNXzM4Nl9EWU5JWCA9IDEwMiwJLyogU2VxdWVudCBydW5uaW5nIGR5bml4ICovCi0gIE1fQVJNID0gMTAzLAkJLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KLSAgTV9TUEFSQ0xFVCA9IDEzMSwJLyogU1BBUkNsZXQgPSBNX1NQQVJDICsgMTI4ICovCi0gIE1fMzg2X05FVEJTRCA9IDEzNCwJLyogTmV0QlNEL2kzODYgYmluYXJ5ICovCi0gIE1fNjhLX05FVEJTRCA9IDEzNSwJLyogTmV0QlNEL202OGsgYmluYXJ5ICovCi0gIE1fNjhLNEtfTkVUQlNEID0gMTM2LAkvKiBOZXRCU0QvbTY4azRrIGJpbmFyeSAqLwotICBNXzUzMl9ORVRCU0QgPSAxMzcsCS8qIE5ldEJTRC9uczMyayBiaW5hcnkgKi8KLSAgTV9TUEFSQ19ORVRCU0QgPSAxMzgsCS8qIE5ldEJTRC9zcGFyYyBiaW5hcnkgKi8KLSAgTV9QTUFYX05FVEJTRCA9IDEzOSwJLyogTmV0QlNEL3BtYXggKE1JUFMgbGl0dGxlLWVuZGlhbikgYmluYXJ5ICovCi0gIE1fVkFYX05FVEJTRCA9IDE0MCwJLyogTmV0QlNEL3ZheCBiaW5hcnkgKi8KLSAgTV9BTFBIQV9ORVRCU0QgPSAxNDEsCS8qIE5ldEJTRC9hbHBoYSBiaW5hcnkgKi8KLSAgTV9BUk02X05FVEJTRCA9IDE0MywJLyogTmV0QlNEL2FybTMyIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzEgPSAxNDcsCS8qIDB4OTMsIHJlc2VydmVkICovCi0gIE1fTUlQUzEgPSAxNTEsICAgICAgICAvKiBNSVBTIFIyMDAwL1IzMDAwIGJpbmFyeSAqLwotICBNX01JUFMyID0gMTUyLCAgICAgICAgLyogTUlQUyBSNDAwMC9SNjAwMCBiaW5hcnkgKi8KLSAgTV9TUEFSQ0xFVF8yID0gMTYzLAkvKiAweGEzLCByZXNlcnZlZCAqLwotICBNX1NQQVJDTEVUXzMgPSAxNzksCS8qIDB4YjMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfNCA9IDE5NSwJLyogMHhjMywgcmVzZXJ2ZWQgKi8KLSAgTV9IUDIwMCA9IDIwMCwJLyogSFAgMjAwICg2ODAxMCkgQlNEIGJpbmFyeSAqLwotICBNX0hQMzAwID0gKDMwMCAlIDI1NiksIC8qIEhQIDMwMCAoNjgwMjArNjg4ODEpIEJTRCBiaW5hcnkgKi8KLSAgTV9IUFVYID0gKDB4MjBjICUgMjU2KSwgLyogSFAgMjAwLzMwMCBIUFVYIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzUgPSAyMTEsCS8qIDB4ZDMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfNiA9IDIyNywJLyogMHhlMywgcmVzZXJ2ZWQgKi8KLSAgLyogIE1fU1BBUkNMRVRfNyA9IDI0MwkvICogMHhmMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xJVEVfTEUgPSAyNDMKLX07Ci0KLSNkZWZpbmUgTl9EWU5BTUlDKGV4ZWMpICgoZXhlYykuYV9pbmZvICYgMHg4MDAwMDAwMCkKLQotI2lmbmRlZiBOX01BR0lDCi0jIGRlZmluZSBOX01BR0lDKGV4ZWMpICgoZXhlYykuYV9pbmZvICYgMHhmZmZmKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9NQUNIVFlQRQotIyBkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweGZmKSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fRkxBR1MKLSMgZGVmaW5lIE5fRkxBR1MoZXhlYykgKCgoZXhlYykuYV9pbmZvID4+IDI0KSAmIDB4ZmYpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9JTkZPCi0jIGRlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAotKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotIHwgKCgoaW50KSh0eXBlKSAmIDB4ZmYpIDw8IDE2KSBcCi0gfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9EWU5BTUlDCi0jIGRlZmluZSBOX1NFVF9EWU5BTUlDKGV4ZWMsIGR5bmFtaWMpIFwKLSgoZXhlYykuYV9pbmZvID0gKGR5bmFtaWMpID8gKChleGVjKS5hX2luZm8gfCAweDgwMDAwMDAwKSA6IFwKLSgoZXhlYykuYV9pbmZvICYgMHg3ZmZmZmZmZikpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9NQUdJQwotIyBkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpIFwKLSgoZXhlYykuYV9pbmZvID0gKCgoZXhlYykuYV9pbmZvICYgMHhmZmZmMDAwMCkgfCAoKG1hZ2ljKSAmIDB4ZmZmZikpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9TRVRfTUFDSFRZUEUKLSMgZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCi0oKGV4ZWMpLmFfaW5mbyA9IFwKLSAoKGV4ZWMpLmFfaW5mbyYweGZmMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHhmZikgPDwgMTYpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9TRVRfRkxBR1MKLSMgZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0oKGV4ZWMpLmFfaW5mbyA9IFwKLSAoKGV4ZWMpLmFfaW5mbyYweDAwZmZmZmZmKSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCBhb3V0X3N5bWJvbCB7Ci0gIGFzeW1ib2wgc3ltYm9sOwotICBzaG9ydCBkZXNjOwotICBjaGFyIG90aGVyOwotICB1bnNpZ25lZCBjaGFyIHR5cGU7Ci19IGFvdXRfc3ltYm9sX3R5cGU7Ci0KLS8qIFRoZSBgdGRhdGEnIHN0cnVjdCBmb3IgYWxsIGEub3V0LWxpa2Ugb2JqZWN0IGZpbGUgZm9ybWF0cy4KLSAgIFZhcmlvdXMgdGhpbmdzIGRlcGVuZCBvbiB0aGlzIHN0cnVjdCBiZWluZyBhcm91bmQgYW55IHRpbWUgYW4gYS5vdXQKLSAgIGZpbGUgaXMgYmVpbmcgaGFuZGxlZC4gIEFuIGV4YW1wbGUgaXMgZGJ4cmVhZC5jIGluIEdEQi4gICovCi0KLXN0cnVjdCBhb3V0ZGF0YSB7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpoZHI7CQkvKiBleGVjIGZpbGUgaGVhZGVyICovCi0gIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJvbHM7CQkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLwotICAKLSAgLyogRm9yIGVhc2UsIHdlIGRvIHRoaXMgKi8KLSAgYXNlY3Rpb24gKnRleHRzZWM7Ci0gIGFzZWN0aW9uICpkYXRhc2VjOwotICBhc2VjdGlvbiAqYnNzc2VjOwotCi0gIC8qIFdlIHJlbWVtYmVyIHRoZXNlIG9mZnNldHMgc28gdGhhdCBhZnRlciBjaGVja19maWxlX2Zvcm1hdCwgd2UgaGF2ZQotICAgICBubyBkZXBlbmRlbmNpZXMgb24gdGhlIHBhcnRpY3VsYXIgZm9ybWF0IG9mIHRoZSBleGVjX2hkci4gICovCi0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotICBmaWxlX3B0ciBzdHJfZmlsZXBvczsKLQotICAvKiBTaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSBpbiBleHRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIHJlbG9jX2VudHJ5X3NpemU7Ci0KLSAgLyogU2l6ZSBvZiBhIHN5bWJvbCB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIHN5bWJvbF9lbnRyeV9zaXplOwotCi0gIC8qIFBhZ2Ugc2l6ZSAtIG5lZWRlZCBmb3IgYWxpZ25tZW50IG9mIGRlbWFuZCBwYWdlZCBmaWxlcy4gKi8KLSAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7Ci0KLSAgLyogU2VnbWVudCBzaXplIC0gbmVlZGVkIGZvciBhbGlnbm1lbnQgb2YgZGVtYW5kIHBhZ2VkIGZpbGVzLiAqLwotICB1bnNpZ25lZCBsb25nIHNlZ21lbnRfc2l6ZTsKLQotICAvKiBabWFnaWMgZGlzayBibG9jayBzaXplIC0gbmVlZCB0byBhbGlnbiB0aGUgc3RhcnQgb2YgdGhlIHRleHQKLSAgICAgc2VjdGlvbiBpbiBaTUFHSUMgYmluYXJpZXMuICBOb3JtYWxseSB0aGUgc2FtZSBhcyBwYWdlX3NpemUuICAqLwotICB1bnNpZ25lZCBsb25nIHptYWdpY19kaXNrX2Jsb2NrX3NpemU7Ci0KLSAgdW5zaWduZWQgZXhlY19ieXRlc19zaXplOwotICB1bnNpZ25lZCB2bWFfYWRqdXN0ZWQgOiAxOwotCi0gIC8qIHVzZWQgd2hlbiBhIGJmZCBzdXBwb3J0cyBzZXZlcmFsIGhpZ2hseSBzaW1pbGFyIGZvcm1hdHMgKi8KLSAgZW51bQotICAgIHsKLSAgICAgIGRlZmF1bHRfZm9ybWF0ID0gMCwKLSAgICAgIC8qIFVzZWQgb24gSFAgOTAwMC8zMDAgcnVubmluZyBIUC9VWC4gIFNlZSBocDMwMGhwdXguYy4gICovCi0gICAgICBnbnVfZW5jYXBfZm9ybWF0LAotICAgICAgLyogVXNlZCBvbiBMaW51eCwgMzg2QlNELCBldGMuICBTZWUgaW5jbHVkZS9hb3V0L2FvdXQ2NC5oLiAgKi8KLSAgICAgIHFfbWFnaWNfZm9ybWF0Ci0gICAgfSBzdWJmb3JtYXQ7Ci0KLSAgZW51bQotICAgIHsKLSAgICAgIHVuZGVjaWRlZF9tYWdpYyA9IDAsCi0gICAgICB6X21hZ2ljLAotICAgICAgb19tYWdpYywKLSAgICAgIG5fbWFnaWMKLSAgICB9IG1hZ2ljOwotCi0gIC8qIEEgYnVmZmVyIGZvciBmaW5kX25lYXJlc3RfbGluZS4gICovCi0gIGNoYXIgKmxpbmVfYnVmOwotCi0gIC8qIFRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmV4dGVybmFsX3N5bXM7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX2NvdW50OwotICBiZmRfd2luZG93IHN5bV93aW5kb3c7Ci0gIGNoYXIgKmV4dGVybmFsX3N0cmluZ3M7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3RyaW5nX3NpemU7Ci0gIGJmZF93aW5kb3cgc3RyaW5nX3dpbmRvdzsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIHBvaW50ZXIgZm9yIHNoYXJlZCBsaWJyYXJ5IGluZm9ybWF0aW9uLiAgKi8KLSAgUFRSIGR5bmFtaWNfaW5mbzsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgZ2xvYmFsIG9mZnNldAotICAgICB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcgb24gU3VuT1MuICBUaGlzIGlzIGluZGV4ZWQgYnkgdGhlIHN5bWJvbAotICAgICBpbmRleC4gICovCi0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotfTsKLQotc3RydWN0ICBhb3V0X2RhdGFfc3RydWN0IHsKLSAgICBzdHJ1Y3QgYW91dGRhdGEgYTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotI2RlZmluZQlhZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmFvdXRfZGF0YS0+YSkKLSNkZWZpbmUJZXhlY19oZHIoYmZkKQkJKGFkYXRhKGJmZCkuaGRyKQotI2RlZmluZQlvYmpfYW91dF9zeW1ib2xzKGJmZCkJKGFkYXRhKGJmZCkuc3ltYm9scykKLSNkZWZpbmUJb2JqX3RleHRzZWMoYmZkKQkoYWRhdGEoYmZkKS50ZXh0c2VjKQotI2RlZmluZQlvYmpfZGF0YXNlYyhiZmQpCShhZGF0YShiZmQpLmRhdGFzZWMpCi0jZGVmaW5lCW9ial9ic3NzZWMoYmZkKQkJKGFkYXRhKGJmZCkuYnNzc2VjKQotI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoYWRhdGEoYmZkKS5zeW1fZmlsZXBvcykKLSNkZWZpbmUJb2JqX3N0cl9maWxlcG9zKGJmZCkJKGFkYXRhKGJmZCkuc3RyX2ZpbGVwb3MpCi0jZGVmaW5lCW9ial9yZWxvY19lbnRyeV9zaXplKGJmZCkgKGFkYXRhKGJmZCkucmVsb2NfZW50cnlfc2l6ZSkKLSNkZWZpbmUJb2JqX3N5bWJvbF9lbnRyeV9zaXplKGJmZCkgKGFkYXRhKGJmZCkuc3ltYm9sX2VudHJ5X3NpemUpCi0jZGVmaW5lIG9ial9hb3V0X3N1YmZvcm1hdChiZmQpCShhZGF0YShiZmQpLnN1YmZvcm1hdCkKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyhiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N5bXMpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudChiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N5bV9jb3VudCkKLSNkZWZpbmUgb2JqX2FvdXRfc3ltX3dpbmRvdyhiZmQpIChhZGF0YShiZmQpLnN5bV93aW5kb3cpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MoYmZkKSAoYWRhdGEoYmZkKS5leHRlcm5hbF9zdHJpbmdzKQotI2RlZmluZSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZShiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N0cmluZ19zaXplKQotI2RlZmluZSBvYmpfYW91dF9zdHJpbmdfd2luZG93KGJmZCkgKGFkYXRhKGJmZCkuc3RyaW5nX3dpbmRvdykKLSNkZWZpbmUgb2JqX2FvdXRfc3ltX2hhc2hlcyhiZmQpIChhZGF0YShiZmQpLnN5bV9oYXNoZXMpCi0jZGVmaW5lIG9ial9hb3V0X2R5bmFtaWNfaW5mbyhiZmQpIChhZGF0YShiZmQpLmR5bmFtaWNfaW5mbykKLQotLyogV2UgdGFrZSB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbCAqLwotI2RlZmluZSBhb3V0X3N5bWJvbChhc3ltYm9sKSAoKGFvdXRfc3ltYm9sX3R5cGUgKikoJihhc3ltYm9sKS0+dGhlX2JmZCkpCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggYS5vdXQgc2VjdGlvbi4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkKLSAgIHVzZWQgYnkgdGhlIGEub3V0IGJhY2tlbmQgbGlua2VyLiAgKi8KLQotc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdAotewotICAvKiBUaGUgdW5zd2FwcGVkIHJlbG9jYXRpb24gZW50cmllcyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgUFRSIHJlbG9jczsKLX07Ci0KLSNkZWZpbmUgYW91dF9zZWN0aW9uX2RhdGEocykgXAotICAoKHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikgKHMpLT51c2VkX2J5X2JmZCkKLQotI2RlZmluZSBzZXRfYW91dF9zZWN0aW9uX2RhdGEocyx2KSBcCi0gICgocyktPnVzZWRfYnlfYmZkID0gKFBUUikmKHYpLT5yZWxvY3MpCi0KLS8qIFByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGFvdXR4LmggICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgUEFSQU1TICgoYmZkICopKTsKLQotY29uc3QgYmZkX3RhcmdldCAqCi1OQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwKLQkJCQkgICAgICAgY29uc3QgYmZkX3RhcmdldCAqKCpjYWxsYmFjaykoYmZkICopKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxta29iamVjdCkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWVudW0gbWFjaGluZV90eXBlCi1OQU1FKGFvdXQsbWFjaGluZV90eXBlKSBQQVJBTVMgKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkJCQkgdW5zaWduZWQgbG9uZyBtYWNoaW5lLAotCQkJCSBib29sZWFuICp1bmtub3duKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSBQQVJBTVMgKChiZmQgKmFiZmQsIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQkgCQkgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqbmV3c2VjdCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBzZWN0aW9uLAotCQkJIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LCBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0KLWFzeW1ib2wgKgotTkFNRShhb3V0LG1ha2VfZW1wdHlfc3ltYm9sKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqLCBhb3V0X3N5bWJvbF90eXBlICosCi0JCQkJCSAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqLAotCQkJCQkgICBiZmRfc2l6ZV90eXBlLCBjaGFyICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUsCi0JCQkJCSAgIGJvb2xlYW4gZHluYW1pYykpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHdyaXRlX3N5bXMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi12b2lkCi1OQU1FKGFvdXQscmVjbGFpbV9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1sb25nCi1OQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKipsb2NhdGlvbikpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICosCi0JCQkJICAgICAgYXJlbGVudCAqLCBhc3ltYm9sICoqLCBiZmRfc2l6ZV90eXBlKSk7Ci12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosCi0JCQkJICAgICAgYXJlbGVudCAqLCBhc3ltYm9sICoqLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgYXNlY3QsCi0JCQkJICAgICAgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotbG9uZwotTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkJICAgICAgIGFyZWxlbnQgKipyZWxwdHIsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBhc2VjdCkpOwotCi12b2lkCi1OQU1FKGFvdXQscmVjbGFpbV9yZWxvYykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgc2VjX3B0ciBpZ25vcmUpKTsKLQotYWxlbnQgKgotTkFNRShhb3V0LGdldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqaWdub3JlX2FiZmQsIGFzeW1ib2wgKmlnbm9yZV9zeW1ib2wpKTsKLQotdm9pZAotTkFNRShhb3V0LHByaW50X3N5bWJvbCkgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgUFRSIGZpbGUsCi0JCQkgICAgYXN5bWJvbCAqc3ltYm9sLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93KSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKGJmZCAqaWdub3JlX2FiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICpzeW1ib2wsIHN5bWJvbF9pbmZvICpyZXQpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotICAgICAgYXN5bWJvbCAqKnN5bWJvbHMsIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAotICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKLQotbG9uZwotTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKTsKLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsCi0JCQkJCSBhc3ltYm9sICopKTsKLQotaW50Ci1OQU1FKGFvdXQsc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBleGVjKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICBiZmRfc2l6ZV90eXBlICp0ZXh0X3NpemUsIGZpbGVfcHRyICp0ZXh0X2VuZCkpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMsIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCkpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpKTsKLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLU5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KQotICAgICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgIGNvbnN0IGNoYXIgKikpKTsKLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkgICAgICAgdm9pZCAoKikgKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLAotCQkJCQkgZmlsZV9wdHIgKikpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBBLm91dCB1c2VzIHRoZSBnZW5lcmljIHZlcnNpb25zIG9mIHRoZXNlIHJvdXRpbmVzLi4uICovCi0KLSNkZWZpbmUJYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwlfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZQlhb3V0XzY0X2dldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotI2lmbmRlZiBOT19XUklURV9IRUFERVJfS0xVREdFCi0jZGVmaW5lIE5PX1dSSVRFX0hFQURFUl9LTFVER0UgMAotI2VuZGlmCi0KLSNpZm5kZWYgYW91dF8zMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBhb3V0XzMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIFdSSVRFX0hFQURFUlMKLSNkZWZpbmUgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCkJCQkJCSAgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgICBcCi0JYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7IC8qIGR1bW15IHZhcnMgKi8JCQkgICAgICBcCi0JZmlsZV9wdHIgdGV4dF9lbmQ7CQkJCQkJICAgICAgXAotCWlmIChhZGF0YShhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCQkJICAgICAgXAotCSAgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7ICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CSAgICAgIFwKLQlleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CQkJICAgICAgXAotICAgIAkJCQkJCQkJCSAgICAgIFwKLQlleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICAgICBcCi0JCQkgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJICAgICAgXAotCU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7CSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApIHJldHVybiBmYWxzZTsJICAgICAgXAotCWlmIChiZmRfd3JpdGUgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCSAgICAgIFwKLQkgICAgIT0gRVhFQ19CWVRFU19TSVpFKQkJCQkJCSAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgICAgXAotCS8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwkgICAgICBcCi0gIAkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSAhPSAoYXN5bWJvbCAqKikgTlVMTAkJICAgICAgXAotCSAgICAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKSAJCQkJICAgICAgXAotCSAgewkJCQkJCQkJICAgICAgXAotCSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICAgICAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQkgICAgaWYgKCEgTkFNRShhb3V0LHdyaXRlX3N5bXMpKGFiZmQpKSByZXR1cm4gZmFsc2U7CQkgICAgICBcCi0JICB9CQkJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotCWlmICghTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkgICAgICAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpICAgICAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotICAgICAgfQkJCQkJCQkJCSAgICAgIAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKExJQkFPVVRfSCkgKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJiZmQtaW4uaCBiL2JmZC9saWJiZmQtaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhMTc2ZC4uMDAwMDAwMAotLS0gYS9iZmQvbGliYmZkLWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLyogbGliYmZkLmggLS0gRGVjbGFyYXRpb25zIHVzZWQgYnkgYmZkIGxpYnJhcnkgKmltcGxlbWVudGF0aW9uKi4KLSAgIChUaGlzIGluY2x1ZGUgZmlsZSBpcyBub3QgZm9yIHVzZXJzIG9mIHRoZSBsaWJyYXJ5LikKLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogbGliYmZkLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoaXMgZmlsZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbGlnbiBhbiBhZGRyZXNzIHVwd2FyZCB0byBhIGJvdW5kYXJ5LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gICBFLmcuIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSB3aXRoIGFyZ3VtZW50IG9mIDguICBUYWtlIGNhcmUgbmV2ZXIKLSAgIHRvIHdyYXAgYXJvdW5kIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBib3VuZGFyeS0xIG9mIHRoZSBlbmQgb2YgdGhlCi0gICBhZGRyZXNzIHNwYWNlLiAgKi8KLSNkZWZpbmUgQkZEX0FMSUdOKHRoaXMsIGJvdW5kYXJ5KQkJCQkJXAotICAoKCgoYmZkX3ZtYSkgKHRoaXMpICsgKGJvdW5kYXJ5KSAtIDEpID49IChiZmRfdm1hKSAodGhpcykpCQlcCi0gICA/ICgoKGJmZF92bWEpICh0aGlzKSArICgoYm91bmRhcnkpIC0gMSkpICYgKH4oKGJvdW5kYXJ5KS0xKSkpCVwKLSAgIDogfiAoYmZkX3ZtYSkgMCkKLQotLyogSWYgeW91IHdhbnQgdG8gcmVhZCBhbmQgd3JpdGUgbGFyZ2UgYmxvY2tzLCB5b3UgbWlnaHQgd2FudCB0byBkbyBpdAotICAgaW4gcXVhbnRhIG9mIHRoaXMgYW1vdW50ICovCi0jZGVmaW5lIERFRkFVTFRfQlVGRkVSU0laRSA4MTkyCi0KLS8qIFNldCBhIHRkYXRhIGZpZWxkLiAgQ2FuJ3QgdXNlIHRoZSBvdGhlciBtYWNyb3MgZm9yIHRoaXMsIHNpbmNlIHRoZXkKLSAgIGRvIGNhc3RzLCBhbmQgY2FzdGluZyB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50IGlzbid0IHBvcnRhYmxlLiAgKi8KLSNkZWZpbmUgc2V0X3RkYXRhKGJmZCwgdikgKChiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAodikpCi0KLS8qIElmIEJGRF9JTl9NRU1PUlkgaXMgc2V0IGZvciBhIEJGRCwgdGhlbiB0aGUgaW9zdHJlYW0gZmllbGRzIHBvaW50cwotICAgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYmZkX2luX21lbW9yeQotewotICAvKiBTaXplIG9mIGJ1ZmZlci4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogQnVmZmVyIGhvbGRpbmcgY29udGVudHMgb2YgQkZELiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLX07Ci0KLS8qIHRkYXRhIGZvciBhbiBhcmNoaXZlLiAgRm9yIGFuIGlucHV0IGFyY2hpdmUsIGNhY2hlCi0gICBuZWVkcyB0byBiZSBmcmVlKCknZC4gIEZvciBhbiBvdXRwdXQgYXJjaGl2ZSwgc3ltZGVmcyBkby4gICovCi0KLXN0cnVjdCBhcnRkYXRhIHsKLSAgZmlsZV9wdHIgZmlyc3RfZmlsZV9maWxlcG9zOwotICAvKiBTcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFybWFwICovCi0gIHN0cnVjdCBhcl9jYWNoZSAqY2FjaGU7Ci0gIGJmZCAqYXJjaGl2ZV9oZWFkOyAgICAgICAgICAgIC8qIE9ubHkgaW50ZXJlc3RpbmcgaW4gb3V0cHV0IHJvdXRpbmVzICovCi0gIGNhcnN5bSAqc3ltZGVmczsJCS8qIHRoZSBzeW1kZWYgZW50cmllcyAqLwotICBzeW1pbmRleCBzeW1kZWZfY291bnQ7ICAgICAgICAgICAgIC8qIGhvdyBtYW55IHRoZXJlIGFyZSAqLwotICBjaGFyICpleHRlbmRlZF9uYW1lczsJCS8qIGNsZXZlciBpbnRlbCBleHRlbnNpb24gKi8KLSAgLyogd2hlbiBtb3JlIGNvbXBpbGVycyBhcmUgc3RhbmRhcmQgQywgdGhpcyBjYW4gYmUgYSB0aW1lX3QgKi8KLSAgbG9uZyAgYXJtYXBfdGltZXN0YW1wOwkvKiBUaW1lc3RhbXAgdmFsdWUgd3JpdHRlbiBpbnRvIGFybWFwLgotCQkJCSAgIFRoaXMgaXMgdXNlZCBmb3IgQlNEIGFyY2hpdmVzIHRvIGNoZWNrCi0JCQkJICAgdGhhdCB0aGUgdGltZXN0YW1wIGlzIHJlY2VudCBlbm91Z2gKLQkJCQkgICBmb3IgdGhlIEJTRCBsaW5rZXIgdG8gbm90IGNvbXBsYWluLAotCQkJCSAgIGp1c3QgYmVmb3JlIHdlIGZpbmlzaCB3cml0aW5nIGFuCi0JCQkJICAgYXJjaGl2ZS4gICovCi0gIGZpbGVfcHRyIGFybWFwX2RhdGVwb3M7CS8qIFBvc2l0aW9uIHdpdGhpbiBhcmNoaXZlIHRvIHNlZWsgdG8KLQkJCQkgICByZXdyaXRlIHRoZSBkYXRlIGZpZWxkLiAgKi8KLSAgUFRSIHRkYXRhOwkJCS8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotfTsKLQotI2RlZmluZSBiZmRfYXJkYXRhKGJmZCkgKChiZmQpLT50ZGF0YS5hb3V0X2FyX2RhdGEpCi0KLS8qIEdvZXMgaW4gYmZkJ3MgYXJlbHRfZGF0YSBzbG90ICovCi1zdHJ1Y3QgYXJlbHRkYXRhIHsKLSAgY2hhciAqIGFyY2hfaGVhZGVyOwkJCSAgICAgLyogaXQncyBhY3R1YWxseSBhIHN0cmluZyAqLwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7ICAgICAvKiBvY3RldHMgb2YgZmlsZXNpemUgbm90IGluY2x1ZGluZyBhcl9oZHIgKi8KLSAgY2hhciAqZmlsZW5hbWU7CQkJICAgICAvKiBudWxsLXRlcm1pbmF0ZWQgKi8KLX07Ci0KLSNkZWZpbmUgYXJlbHRfc2l6ZShiZmQpICgoKHN0cnVjdCBhcmVsdGRhdGEgKikoKGJmZCktPmFyZWx0X2RhdGEpKS0+cGFyc2VkX3NpemUpCi0KLWV4dGVybiBQVFIgYmZkX21hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3JlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3ptYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLWV4dGVybiBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIF9iZmRfZXJyb3JfaGFuZGxlcjsKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgYW5kIGZyZWUgdGhpbmdzIG9uIHRoZSBCRkQncyBvYmphbGxvYy4gICovCi0KLWV4dGVybiBQVFIgYmZkX2FsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3phbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBiZmRfcmVsZWFzZSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLWJmZCAqCV9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCBQQVJBTVMgKChiZmQgKm9iZmQpKTsKLWJmZCAqCV9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIFBBUkFNUyAoKGJmZCAqYXJjaF9iZmQsIGZpbGVfcHRyIGluZGV4KSk7Ci1ib29sZWFuIF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkICopKTsKLWJvb2xlYW4JX2JmZF9nZW5lcmljX21rYXJjaGl2ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKmJmZF9nZW5lcmljX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JYmZkX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBiZmRfc2x1cnBfYnNkX2FybWFwX2YyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBiZmRfc2x1cnBfYnNkX2FybWFwIGJmZF9zbHVycF9hcm1hcAotI2RlZmluZSBiZmRfc2x1cnBfY29mZl9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLWJvb2xlYW4JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1ib29sZWFuCV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50IGVsZW5ndGgpKTsKLWJmZCAqX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICphcmNoaXZlLCBmaWxlX3B0ciBmaWxlcG9zKSk7Ci1leHRlcm4gYmZkICpfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLWJmZCAqIF9iZmRfbmV3X2JmZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJvb2xlYW4JYmZkX2ZhbHNlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1ib29sZWFuCWJmZF90cnVlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1QVFIJYmZkX251bGx2b2lkcHRyIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1pbnQJYmZkXzAgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXVuc2lnbmVkIGludAliZmRfMHUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJYmZkXzBsIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCV9iZmRfbjEgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXZvaWQJYmZkX3ZvaWQgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLQotYmZkICpfYmZkX25ld19iZmRfY29udGFpbmVkX2luIFBBUkFNUyAoKGJmZCAqKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpfYmZkX2R1bW15X3RhcmdldCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZAliZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfZ251X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLQotYm9vbGVhbglic2Rfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1ib29sZWFuCWNvZmZfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotYmZkICoJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwKLQkJCQkJCSAgICAgYmZkICpsYXN0X2ZpbGUpKTsKLQotaW50CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLQotI2RlZmluZSBfYmZkX3JlYWRfYXJfaGRyKGFiZmQpIFwKLSAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVhZF9hcl9oZHJfZm4sIChhYmZkKSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9HRU5FUklDLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3dpbmRvdyAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09QWS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSkgYmZkX3RydWUpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09SRSB3aGVuIHRoZXJlIGlzIG5vIGNvcmUgZmlsZQotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSkuICAqLwotCi1leHRlcm4gY2hhciAqX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHdoZW4gdGhlcmUgaXMgbm8gYXJjaGl2ZQotICAgZmlsZSBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfYXJtYXAgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjaGFyICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX2ZhbHNlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQlNEIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9hcm1hcCBiZmRfc2x1cnBfYnNkX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfdHJ1bmNhdGVfYXJuYW1lIGJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IENPRkYgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2NvZmZfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3dyaXRlX2FybWFwIGNvZmZfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgd2hlcmUgdGhlcmUgaXMgbm8gc3ltYm9sCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21ha2VfZW1wdHlfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8gXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubyBcCi0gICgoYWxlbnQgKigqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwgXAotCSAgICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIHdoZW4gdGhlcmUgaXMgbm8gcmVsb2MKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFIGZvciB0YXJnZXRzIHdoaWNoIG1heSBub3QKLSAgIGJlIHdyaXR0ZW4uICBVc2UgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfbm93cml0ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfYXJjaF9tYWNoIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpKSBcCi0gICBiZmRfZmFsc2UpCi0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0xJTksgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBzdXBwb3J0IGxpbmtpbmcuICBVc2UgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLiAgKi8KLQotI2RlZmluZSBfYmZkX25vbGlua19zaXplb2ZfaGVhZGVycyAoKGludCAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKSkgYmZkXzApCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICAoKGJmZF9ieXRlICooKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgXAotCSAgICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19hZGRfc3ltYm9scyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZmluYWxfbGluayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19zcGxpdF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF9mYWxzZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgaGF2ZSBkeW5hbWljIHN5bWJvbHMgb3IgcmVsb2NzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLSAgIChfYmZkX25vZHluYW1pYykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZSB0byBkZXRlcm1pbmUgb2YgdGhlIGdpdmVuIHN5bWJvbCBpcyBhIGxvY2FsCi0gICBsYWJlbC4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogR2VuZXJpYyBtaW5pc3ltYm9sIHJvdXRpbmVzLiAgKi8KLWV4dGVybiBsb25nIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBhc3ltYm9sICpfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbiAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFkZXJzdCBsaW5lIHVzaW5nIERXQVJGIDEgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyBEV0FSRiAyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEEgcm91dGluZSB0byBjcmVhdGUgZW50cmllcyBmb3IgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi0vKiBJbml0aWFsaXplIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgY3JlYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQgYnkgdGFyZ2V0cyBmb3IKLSAgIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZSwKLSAgIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFyY2hpdmUgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgYm9vbGVhbiAoKmNoZWNrZm4pIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpOwotCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBwcm90b3R5cGUgZXJyb3JzLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgX2JmZF9saW5rX2hhc2hfZW50cnk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZSB0byBhZGQgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICpuYW1lLCBmbGFnd29yZCwKLQkgICBhc2VjdGlvbiAqLCBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY29weSwKLQkgICBib29sZWFuIGNvbnN0cnVjdG9yLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHZW5lcmljIGxpbmsgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotLyogR2VuZXJpYyByZWxvY19saW5rX29yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsb2MgZW50cmllcyBpbiBhIGxpbmsgb3JkZXIgbGlzdC4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRmluYWwgbGluayByZWxvY2F0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBiZmRfdm1hIGFkZHJlc3MsIGJmZF92bWEgdmFsdWUsIGJmZF92bWEgYWRkZW5kKSk7Ci0KLS8qIFJlbG9jYXRlIGEgcGFydGljdWxhciBsb2NhdGlvbiBieSBhIGhvd3RvIGFuZCBhIHZhbHVlLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIExpbmsgc3RhYnMgaW4gc2VjdGlvbnMgaW4gdGhlIGZpcnN0IHBhc3MuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIGFzZWN0aW9uICosIFBUUiAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX2J5dGUgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHN0cmluZyB0YWJsZSB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgUFRSICopKTsKLQotLyogRmluZCBhbiBvZmZzZXQgd2l0aGluIGEgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4KLSAgIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF92bWEpKTsKLQotLyogQ3JlYXRlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ3JlYXRlIGFuIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uIHN0eWxlIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZyZWUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9zdHJpbmd0YWJfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX3NpemUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9hZGQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gaGFzaCwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RyaW5ndGFiX2VtaXQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBDaGVjayB0aGF0IGVuZGlhbm5lc3Mgb2YgaW5wdXQgYW5kIG91dHB1dCBmaWxlIG1hdGNoLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotDAotLyogTWFjcm9zIHRvIHRlbGwgaWYgYmZkcyBhcmUgcmVhZCBvciB3cml0ZSBlbmFibGVkLgotCi0gICBOb3RlIHRoYXQgYmZkcyBvcGVuIGZvciByZWFkIG1heSBiZSBzY3JpYmJsZWQgaW50byBpZiB0aGUgZmQgcGFzc2VkCi0gICB0byBiZmRfZmRvcGVuciBpcyBhY3R1YWxseSBvcGVuIGJvdGggZm9yIHJlYWQgYW5kIHdyaXRlCi0gICBzaW11bHRhbmVvdXNseS4gIEhvd2V2ZXIgYW4gb3V0cHV0IGJmZCB3aWxsIG5ldmVyIGJlIG9wZW4gZm9yCi0gICByZWFkLiAgVGhlcmVmb3JlIHNvbWV0aW1lcyB5b3Ugd2FudCB0byBjaGVjayBiZmRfcmVhZF9wIG9yCi0gICAhYmZkX3JlYWRfcCwgYW5kIG9ubHkgc29tZXRpbWVzIGJmZF93cml0ZV9wLgotKi8KLQotI2RlZmluZQliZmRfcmVhZF9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSByZWFkX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLSNkZWZpbmUJYmZkX3dyaXRlX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLQotdm9pZAliZmRfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIqLGludCkpOwotCi0jZGVmaW5lIEJGRF9BU1NFUlQoeCkgXAoteyBpZiAoISh4KSkgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotI2RlZmluZSBCRkRfRkFJTCgpIFwKLXsgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotZXh0ZXJuIHZvaWQgX2JmZF9hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSkKLSAgICAgQVRUUklCVVRFX05PUkVUVVJOOwotCi0vKiBpZiBnY2MsIHdlIGNhbiBnaXZlIGEgZnVuY3Rpb24gbmFtZSwgdG9vICovCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCBfX0dOVUNfTUlOT1JfXyA8PSA1Ci0jZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gICgoY2hhciAqKSBOVUxMKQotI2VuZGlmCi0KLSN1bmRlZiBhYm9ydAotI2RlZmluZSBhYm9ydCgpIF9iZmRfYWJvcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXykKLQotRklMRSAqCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKiBMaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXQgdmVjdG9ycywgYW5kIHRoZSBkZWZhdWx0IHZlY3RvciAoaWYKLSAgIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBpcyBOVUxMLCB0aGVyZSBpcyBubyBkZWZhdWx0KS4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW107Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW107Ci0KLS8qIEZ1bmN0aW9ucyBzaGFyZWQgYnkgdGhlIEVDT0ZGIGFuZCBNSVBTIEVMRiBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZTsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwKLQkgICBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci0KLWV4dGVybiBiZmRfdm1hIF9iZmRfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotCi0vKiBGdW5jdGlvbiBzaGFyZWQgYnkgdGhlIENPRkYgYW5kIEVMRiBTSCBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJvb2xlYW4gKCopIChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSwKLQkgICBQVFIsIGJmZF92bWEgKiosIGJmZF92bWEgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZvbGxvd3MgKi8KLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC5jIGIvYmZkL2xpYmJmZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNlODhjLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMDcgKzAsMCBAQAotLyogQXNzb3J0ZWQgQkZEIHN1cHBvcnQgcm91dGluZXMsIG9ubHkgdXNlZCBpbnRlcm5hbGx5LgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jZGVmaW5lIGdldHBhZ2VzaXplKCkgMjA0OAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcmVhbF9yZWFkIFBBUkFNUyAoKFBUUiwgc2l6ZV90LCBzaXplX3QsIEZJTEUgKikpOwotCi0vKgotU0VDVElPTgotCUludGVybmFsIGZ1bmN0aW9ucwotCi1ERVNDUklQVElPTgotCVRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIHdpdGhpbiBCRkQuCi0JVGhleSBhcmUgbm90IGludGVuZGVkIGZvciBleHBvcnQsIGJ1dCBhcmUgZG9jdW1lbnRlZCBoZXJlIGZvcgotCWNvbXBsZXRlbmVzcy4KLSovCi0KLS8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciB1bnN1cHBvcnRlZAotICAgb3BlcmF0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX2ZhbHNlIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHN1cHBvcnRlZCBvcGVyYXRpb25zCi0gICB3aGljaCBkbyBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF90cnVlIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKLSAgIG9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB2YWx1ZS4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1iZmRfbnVsbHZvaWRwdHIgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qQVJHU1VTRUQqLwotaW50IAotYmZkXzAgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdW5zaWduZWQgaW50IAotYmZkXzB1IChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gICByZXR1cm4gMDsKLX0KLQotLypBUkdVU0VEKi8KLWxvbmcKLWJmZF8wbCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHVuc3VwcG9ydGVkCi0gICBvcGVyYXRpb25zIHdoaWNoIHJldHVybiAtMSBvbiBlcnJvci4gICovCi0KLS8qQVJHU1VTRUQqLwotbG9uZwotX2JmZF9uMSAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQgCi1iZmRfdm9pZCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotfQotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoaWdub3JlX2NvcmVfYmZkLCBpZ25vcmVfZXhlY19iZmQpCi0gICAgIGJmZCAqaWdub3JlX2NvcmVfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaWdub3JlX2V4ZWNfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUm91dGluZSB0byBoYW5kbGUgY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBlbnRyeSBwb2ludCBmb3IgdGFyZ2V0cwotICAgd2l0aG91dCBjb3JlIGZpbGUgc3VwcG9ydC4gICovCi0KLS8qQVJHU1VTRUQqLwotY2hhciAqCi1fYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gKGNoYXIgKilOVUxMOwotfQotCi0vKiBSb3V0aW5lIHRvIGhhbmRsZSBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgZW50cnkgcG9pbnQgZm9yIHRhcmdldHMKLSAgIHdpdGhvdXQgY29yZSBmaWxlIHN1cHBvcnQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWludAotX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLV9iZmRfZHVtbXlfdGFyZ2V0IChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBtZW1vcnkgdXNpbmcgbWFsbG9jLiAgKi8KLQotUFRSCi1iZmRfbWFsbG9jIChzaXplKQotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHB0cjsKLQotICBwdHIgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotICBpZiAocHRyID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBSZWFsbG9jYXRlIG1lbW9yeSB1c2luZyByZWFsbG9jLiAgKi8KLQotUFRSCi1iZmRfcmVhbGxvYyAocHRyLCBzaXplKQotICAgICBQVFIgcHRyOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJldDsKLQotICBpZiAocHRyID09IE5VTEwpCi0gICAgcmV0ID0gbWFsbG9jIChzaXplKTsKLSAgZWxzZQotICAgIHJldCA9IHJlYWxsb2MgKHB0ciwgc2l6ZSk7Ci0KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSB1c2luZyBtYWxsb2MgYW5kIGNsZWFyIGl0LiAgKi8KLQotUFRSCi1iZmRfem1hbGxvYyAoc2l6ZSkKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBwdHI7Ci0KLSAgcHRyID0gKFBUUikgbWFsbG9jIChzaXplKTsKLQotICBpZiAoc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChwdHIgPT0gTlVMTCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIGVsc2UKLQltZW1zZXQgKHB0ciwgMCwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBTb21lIElPIGNvZGUgKi8KLQotCi0vKiBOb3RlIHRoYXQgYXJjaGl2ZSBlbnRyaWVzIGRvbid0IGhhdmUgc3RyZWFtczsgdGhleSBzaGFyZSB0aGVpciBwYXJlbnQncy4KLSAgIFRoaXMgYWxsb3dzIHNvbWVvbmUgdG8gcGxheSB3aXRoIHRoZSBpb3N0cmVhbSBiZWhpbmQgQkZEJ3MgYmFjay4KLQotICAgQWxzbywgbm90ZSB0aGF0IHRoZSBvcmlnaW4gcG9pbnRlciBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUncwotICAgY29udGVudHMgKDAgZm9yIG5vbi1hcmNoaXZlIGVsZW1lbnRzKS4gIEZvciBhcmNoaXZlIGVudHJpZXMgdGhpcyBpcyB0aGUKLSAgIGZpcnN0IG9jdGV0IGluIHRoZSBmaWxlLCBOT1QgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIuICovCi0KLXN0YXRpYyBpbnQKLXJlYWxfcmVhZCAod2hlcmUsIGEsYiwgZmlsZSkKLSAgICAgUFRSIHdoZXJlOwotICAgICBzaXplX3QgYTsKLSAgICAgc2l6ZV90IGI7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIC8qIEZJWE1FIC0gdGhpcyBsb29rcyBsaWtlIGFuIG9wdGltaXphdGlvbiwgYnV0IGl0J3MgcmVhbGx5IHRvIGNvdmVyCi0gICAgIHVwIGZvciBhIGZlYXR1cmUgb2Ygc29tZSBPU3MgKG5vdCBzb2xhcmlzIC0gc2lnaCkgdGhhdAotICAgICBsZC9wZS1kbGwuYyB0YWtlcyBhZHZhbnRhZ2Ugb2YgKGFwcGFyZW50bHkpIHdoZW4gaXQgY3JlYXRlcyBCRkRzCi0gICAgIGludGVybmFsbHkgYW5kIHRyaWVzIHRvIGxpbmsgYWdhaW5zdCB0aGVtLiAgQkZEIHNlZW1zIHRvIGJlIHNtYXJ0Ci0gICAgIGVub3VnaCB0byByZWFsaXplIHRoZXJlIGFyZSBubyBzeW1ib2wgcmVjb3JkcyBpbiB0aGUgImZpbGUiIHRoYXQKLSAgICAgZG9lc24ndCBleGlzdCBidXQgYXR0ZW1wdHMgdG8gcmVhZCB0aGVtIGFueXdheS4gIE9uIFNvbGFyaXMsCi0gICAgIGF0dGVtcHRpbmcgdG8gcmVhZCB6ZXJvIGJ5dGVzIGZyb20gYSBOVUxMIGZpbGUgcmVzdWx0cyBpbiBhIGNvcmUKLSAgICAgZHVtcCwgYnV0IG9uIG90aGVyIHBsYXRmb3JtcyBpdCBqdXN0IHJldHVybnMgemVybyBieXRlcyByZWFkLgotICAgICBUaGlzIG1ha2VzIGl0IHRvIHNvbWV0aGluZyByZWFzb25hYmxlLiAtIERKICovCi0gIGlmIChhID09IDAgfHwgYiA9PSAwKQotICAgIHJldHVybiAwOwotCi0jaWYgZGVmaW5lZCAoX19WQVgpICYmIGRlZmluZWQgKFZNUykKLSAgLyogQXBwYXJlbnRseSBmcmVhZCBvbiBWYXggVk1TIGRvZXMgbm90IGtlZXAgdGhlIHJlY29yZCBsZW5ndGgKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZXR1cm4gcmVhZCAoZmlsZW5vIChmaWxlKSwgd2hlcmUsIGEgKiBiKTsKLSNlbHNlCi0gIHJldHVybiBmcmVhZCAod2hlcmUsIGEsIGIsIGZpbGUpOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybiB2YWx1ZSBpcyBhbW91bnQgcmVhZCAoRklYTUU6IGhvdyBhcmUgZXJyb3JzIGFuZCBlbmQgb2YgZmlsZSBkZWFsdAotICAgd2l0aD8gIFdlIG5ldmVyIGNhbGwgYmZkX3NldF9lcnJvciwgd2hpY2ggaXMgcHJvYmFibHkgYSBtaXN0YWtlKS4gICovCi0KLWJmZF9zaXplX3R5cGUKLWJmZF9yZWFkIChwdHIsIHNpemUsIG5pdGVtcywgYWJmZCkKLSAgICAgUFRSIHB0cjsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBiZmRfc2l6ZV90eXBlIG5pdGVtczsKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnJlYWQ7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbTsKLSAgICAgIGJmZF9zaXplX3R5cGUgZ2V0OwotCi0gICAgICBiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW07Ci0gICAgICBnZXQgPSBzaXplICogbml0ZW1zOwotICAgICAgaWYgKGFiZmQtPndoZXJlICsgZ2V0ID4gYmltLT5zaXplKQotCXsKLQkgIGdldCA9IGJpbS0+c2l6ZSAtIGFiZmQtPndoZXJlOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQl9Ci0gICAgICBtZW1jcHkgKHB0ciwgYmltLT5idWZmZXIgKyBhYmZkLT53aGVyZSwgZ2V0KTsKLSAgICAgIGFiZmQtPndoZXJlICs9IGdldDsKLSAgICAgIHJldHVybiBnZXQ7Ci0gICAgfQotCi0gIG5yZWFkID0gcmVhbF9yZWFkIChwdHIsIDEsIChzaXplX3QpKHNpemUqbml0ZW1zKSwgYmZkX2NhY2hlX2xvb2t1cChhYmZkKSk7Ci0gIGlmIChucmVhZCA+IDApCi0gICAgYWJmZC0+d2hlcmUgKz0gbnJlYWQ7Ci0KLSAgLyogU2V0IGJmZF9lcnJvciBpZiB3ZSBkaWQgbm90IHJlYWQgYXMgbXVjaCBkYXRhIGFzIHdlIGV4cGVjdGVkLgotCi0gICAgIElmIHRoZSByZWFkIGZhaWxlZCBkdWUgdG8gYW4gZXJyb3Igc2V0IHRoZSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsCi0gICAgIGVsc2Ugc2V0IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZC4KLQotICAgICBBIEJGRCBiYWNrZW5kIG1heSB3aXNoIHRvIG92ZXJyaWRlIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCB0bwotICAgICBwcm92aWRlIHNvbWV0aGluZyBtb3JlIHVzZWZ1bCAoZWcuIG5vX3N5bWJvbHMgb3Igd3JvbmdfZm9ybWF0KS4gICovCi0gIGlmIChucmVhZCAhPSAoaW50KSAoc2l6ZSAqIG5pdGVtcykpCi0gICAgewotICAgICAgaWYgKGZlcnJvciAoYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCkpKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlbHNlCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5yZWFkOwotfQotCi0vKiBUaGUgd2luZG93IHN1cHBvcnQgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGJlIGJyb2tlbiBvdXQgaW50bwotICAgYW5vdGhlciBmaWxlLi4uLiAgKi8KLS8qIFRoZSBpZGVhIGJlaGluZCB0aGUgbmV4dCBhbmQgcmVmY291bnQgZmllbGRzIGlzIHRoYXQgb25lIG1hcHBlZAotICAgcmVnaW9uIGNhbiBzdWZmaWNlIGZvciBtdWx0aXBsZSByZWFkLW9ubHkgd2luZG93cyBvciBtdWx0aXBsZQotICAgbm9uLW92ZXJsYXBwaW5nIHJlYWQtd3JpdGUgd2luZG93cy4gIEl0J3Mgbm90IGltcGxlbWVudGVkIHlldAotICAgdGhvdWdoLiAgKi8KLXN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCB7Ci0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqbmV4dDsKLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgaW50IHJlZmNvdW50IDogMzE7CQkvKiBzaG91bGQgYmUgZW5vdWdoLi4uICovCi0gIHVuc2lnbmVkIG1hcHBlZCA6IDE7CQkvKiAxID0gbW1hcCwgMCA9IG1hbGxvYyAqLwotfTsKLQotdm9pZAotYmZkX2luaXRfd2luZG93ICh3aW5kb3dwKQotICAgICBiZmRfd2luZG93ICp3aW5kb3dwOwotewotICB3aW5kb3dwLT5kYXRhID0gMDsKLSAgd2luZG93cC0+aSA9IDA7Ci0gIHdpbmRvd3AtPnNpemUgPSAwOwotfQotDAotLyogQ3VycmVudGx5LCBpZiBVU0VfTU1BUCBpcyB1bmRlZmluZWQsIG5vbmUgaWYgdGhlIHdpbmRvdyBzdHVmZiBpcwotICAgdXNlZC4gIE9rYXksIHNvIGl0J3MgbWlzLW5hbWVkLiAgQXQgbGVhc3QgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KLSAgICItLXdpdGhvdXQtbW1hcCIgaXMgbW9yZSBvYnZpb3VzIHRoYW4gIi0td2l0aG91dC13aW5kb3dzIiBvciBzb21lCi0gICBzdWNoLiAgKi8KLSNpZmRlZiBVU0VfTU1BUAotCi0jdW5kZWYgSEFWRV9NUFJPVEVDVCAvKiBjb2RlJ3Mgbm90IHRlc3RlZCB5ZXQgKi8KLQotI2lmIEhBVkVfTU1BUCB8fCBIQVZFX01QUk9URUNUIHx8IEhBVkVfTUFEVklTRQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBNQVBfRklMRQotI2RlZmluZSBNQVBfRklMRSAwCi0jZW5kaWYKLQotc3RhdGljIGludCBkZWJ1Z193aW5kb3dzOwotCi12b2lkCi1iZmRfZnJlZV93aW5kb3cgKHdpbmRvd3ApCi0gICAgIGJmZF93aW5kb3cgKndpbmRvd3A7Ci17Ci0gIGJmZF93aW5kb3dfaW50ZXJuYWwgKmkgPSB3aW5kb3dwLT5pOwotICB3aW5kb3dwLT5pID0gMDsKLSAgd2luZG93cC0+ZGF0YSA9IDA7Ci0gIGlmIChpID09IDApCi0gICAgcmV0dXJuOwotICBpLT5yZWZjb3VudC0tOwotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJmcmVlaW5nIHdpbmRvdyBAJXA8JXAsJWx4LCVwPlxuIiwKLQkgICAgIHdpbmRvd3AsIHdpbmRvd3AtPmRhdGEsIHdpbmRvd3AtPnNpemUsIHdpbmRvd3AtPmkpOwotICBpZiAoaS0+cmVmY291bnQgIT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGktPm1hcHBlZCkKLSAgICB7Ci0jaWZkZWYgSEFWRV9NTUFQCi0gICAgICBtdW5tYXAgKGktPmRhdGEsIGktPnNpemUpOwotICAgICAgZ290byBub19mcmVlOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgfQotI2lmZGVmIEhBVkVfTVBST1RFQ1QKLSAgbXByb3RlY3QgKGktPmRhdGEsIGktPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotI2VuZGlmCi0gIGZyZWUgKGktPmRhdGEpOwotI2lmZGVmIEhBVkVfTU1BUAotIG5vX2ZyZWU6Ci0jZW5kaWYKLSAgaS0+ZGF0YSA9IDA7Ci0gIC8qIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHJlZmVyZW5jZXMgdG8gaSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgZnJlZSAoaSk7Ci19Ci0KLXN0YXRpYyBpbnQgb2tfdG9fbWFwID0gMTsKLQotYm9vbGVhbgotYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgb2Zmc2V0LCBzaXplLCB3aW5kb3dwLCB3cml0YWJsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3dpbmRvdyAqd2luZG93cDsKLSAgICAgYm9vbGVhbiB3cml0YWJsZTsKLXsKLSAgc3RhdGljIHNpemVfdCBwYWdlc2l6ZTsKLSAgYmZkX3dpbmRvd19pbnRlcm5hbCAqaSA9IHdpbmRvd3AtPmk7Ci0gIHNpemVfdCBzaXplX3RvX2FsbG9jID0gc2l6ZTsKLQotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJiZmRfZ2V0X2ZpbGVfd2luZG93ICglcCwgJTZsZCwgJTZsZCwgJXA8JXAsJWx4LCVwPiwgJWQpIiwKLQkgICAgIGFiZmQsIChsb25nKSBvZmZzZXQsIChsb25nKSBzaXplLAotCSAgICAgd2luZG93cCwgd2luZG93cC0+ZGF0YSwgKHVuc2lnbmVkIGxvbmcpIHdpbmRvd3AtPnNpemUsCi0JICAgICB3aW5kb3dwLT5pLCB3cml0YWJsZSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgdGhlIHBhZ2Ugc2l6ZSwgc28gd2UgY2FuIGJlIGZyaWVuZGx5IHRvIG1tYXAuICAqLwotICBpZiAocGFnZXNpemUgPT0gMCkKLSAgICBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplICgpOwotICBpZiAocGFnZXNpemUgPT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHsKLSAgICAgIHdpbmRvd3AtPmkgPSBpID0gKGJmZF93aW5kb3dfaW50ZXJuYWwgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkX3dpbmRvd19pbnRlcm5hbCkpOwotICAgICAgaWYgKGkgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpLT5kYXRhID0gMDsKLSAgICB9Ci0jaWZkZWYgSEFWRV9NTUFQCi0gIGlmIChva190b19tYXAKLSAgICAgICYmIChpLT5kYXRhID09IDAgfHwgaS0+bWFwcGVkID09IDEpCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSA9PSAwKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIGZpbGVfb2Zmc2V0LCBvZmZzZXQyOwotICAgICAgc2l6ZV90IHJlYWxfc2l6ZTsKLSAgICAgIGludCBmZDsKLSAgICAgIEZJTEUgKmY7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHJlYWwgZmlsZSBhbmQgdGhlIHJlYWwgb2Zmc2V0IGludG8gaXQuICAqLwotICAgICAgd2hpbGUgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLQl7Ci0JICBvZmZzZXQgKz0gYWJmZC0+b3JpZ2luOwotCSAgYWJmZCA9IGFiZmQtPm15X2FyY2hpdmU7Ci0JfQotICAgICAgZiA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgICAgZmQgPSBmaWxlbm8gKGYpOwotCi0gICAgICAvKiBDb21wdXRlIG9mZnNldHMgYW5kIHNpemUgZm9yIG1tYXAgYW5kIGZvciB0aGUgdXNlcidzIGRhdGEuICAqLwotICAgICAgb2Zmc2V0MiA9IG9mZnNldCAlIHBhZ2VzaXplOwotICAgICAgaWYgKG9mZnNldDIgPCAwKQotCWFib3J0ICgpOwotICAgICAgZmlsZV9vZmZzZXQgPSBvZmZzZXQgLSBvZmZzZXQyOwotICAgICAgcmVhbF9zaXplID0gb2Zmc2V0ICsgc2l6ZSAtIGZpbGVfb2Zmc2V0OwotICAgICAgcmVhbF9zaXplID0gcmVhbF9zaXplICsgcGFnZXNpemUgLSAxOwotICAgICAgcmVhbF9zaXplIC09IHJlYWxfc2l6ZSAlIHBhZ2VzaXplOwotCi0gICAgICAvKiBJZiB3ZSdyZSByZS11c2luZyBhIG1lbW9yeSByZWdpb24sIG1ha2Ugc3VyZSBpdCdzIGJpZyBlbm91Z2guICAqLwotICAgICAgaWYgKGktPmRhdGEgJiYgaS0+c2l6ZSA8IHNpemUpCi0JewotCSAgbXVubWFwIChpLT5kYXRhLCBpLT5zaXplKTsKLQkgIGktPmRhdGEgPSAwOwotCX0KLSAgICAgIGktPmRhdGEgPSBtbWFwIChpLT5kYXRhLCByZWFsX3NpemUsCi0JCSAgICAgIHdyaXRhYmxlID8gUFJPVF9XUklURSB8IFBST1RfUkVBRCA6IFBST1RfUkVBRCwKLQkJICAgICAgKHdyaXRhYmxlCi0JCSAgICAgICA/IE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUKLQkJICAgICAgIDogTUFQX0ZJTEUgfCBNQVBfU0hBUkVEKSwKLQkJICAgICAgZmQsIGZpbGVfb2Zmc2V0KTsKLSAgICAgIGlmIChpLT5kYXRhID09IChQVFIpIC0xKQotCXsKLQkgIC8qIEFuIGVycm9yIGhhcHBlbmVkLiAgUmVwb3J0IGl0LCBvciB0cnkgdXNpbmcgbWFsbG9jLCBvcgotCSAgICAgc29tZXRoaW5nLiAgKi8KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICBpLT5kYXRhID0gMDsKLQkgIHdpbmRvd3AtPmRhdGEgPSAwOwotCSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIlx0XHRtbWFwIGZhaWxlZCFcbiIpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChkZWJ1Z193aW5kb3dzKQotCWZwcmludGYgKHN0ZGVyciwgIlxuXHRtYXBwZWQgJWxkIGF0ICVwLCBvZmZzZXQgaXMgJWxkXG4iLAotCQkgKGxvbmcpIHJlYWxfc2l6ZSwgaS0+ZGF0YSwgKGxvbmcpIG9mZnNldDIpOwotICAgICAgaS0+c2l6ZSA9IHJlYWxfc2l6ZTsKLSAgICAgIHdpbmRvd3AtPmRhdGEgPSAoUFRSKSAoKGJmZF9ieXRlICopIGktPmRhdGEgKyBvZmZzZXQyKTsKLSAgICAgIHdpbmRvd3AtPnNpemUgPSBzaXplOwotICAgICAgaS0+bWFwcGVkID0gMTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZSBpZiAoZGVidWdfd2luZG93cykKLSAgICB7Ci0gICAgICBpZiAob2tfdG9fbWFwKQotCWZwcmludGYgKHN0ZGVyciwgXygibm90IG1hcHBpbmc6IGRhdGE9JWx4IG1hcHBlZD0lZFxuIiksCi0JCSAodW5zaWduZWQgbG9uZykgaS0+ZGF0YSwgKGludCkgaS0+bWFwcGVkKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsIF8oIm5vdCBtYXBwaW5nOiBlbnYgdmFyIG5vdCBzZXRcbiIpKTsKLSAgICB9Ci0jZWxzZQotICBva190b19tYXAgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIGlmICghd3JpdGFibGUpCi0gICAgewotICAgICAgc2l6ZV90b19hbGxvYyArPSBwYWdlc2l6ZSAtIDE7Ci0gICAgICBzaXplX3RvX2FsbG9jIC09IHNpemVfdG9fYWxsb2MgJSBwYWdlc2l6ZTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXG5cdCVzKCU2bGQpIiwKLQkgICAgIGktPmRhdGEgPyAicmVhbGxvYyIgOiAiIG1hbGxvYyIsIChsb25nKSBzaXplX3RvX2FsbG9jKTsKLSAgaS0+ZGF0YSA9IChQVFIpIGJmZF9yZWFsbG9jIChpLT5kYXRhLCBzaXplX3RvX2FsbG9jKTsKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHQtPiAlcFxuIiwgaS0+ZGF0YSk7Ci0gIGktPnJlZmNvdW50ID0gMTsKLSAgaWYgKGktPmRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZV90b19hbGxvYyA9PSAwKQotCXJldHVybiB0cnVlOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpLT5zaXplID0gYmZkX3JlYWQgKGktPmRhdGEsIHNpemUsIDEsIGFiZmQpOwotICBpZiAoaS0+c2l6ZSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLSAgaS0+bWFwcGVkID0gMDsKLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIGlmICghd3JpdGFibGUpCi0gICAgewotICAgICAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JZnByaW50ZiAoc3RkZXJyLCAiXHRtcHJvdGVjdCAoJXAsICVsZCwgUFJPVF9SRUFEKVxuIiwgaS0+ZGF0YSwKLQkJIChsb25nKSBpLT5zaXplKTsKLSAgICAgIG1wcm90ZWN0IChpLT5kYXRhLCBpLT5zaXplLCBQUk9UX1JFQUQpOwotICAgIH0KLSNlbmRpZgotICB3aW5kb3dwLT5kYXRhID0gaS0+ZGF0YTsKLSAgd2luZG93cC0+c2l6ZSA9IGktPnNpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogVVNFX01NQVAgKi8KLQwKLWJmZF9zaXplX3R5cGUKLWJmZF93cml0ZSAocHRyLCBzaXplLCBuaXRlbXMsIGFiZmQpCi0gICAgIENPTlNUIFBUUiBwdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3NpemVfdHlwZSBuaXRlbXM7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBud3JvdGU7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSAoYWJmZC0+aW9zdHJlYW0pOwotICAgICAgc2l6ZSAqPSBuaXRlbXM7Ci0gICAgICBpZiAoYWJmZC0+d2hlcmUgKyBzaXplID4gYmltLT5zaXplKQotCXsKLQkgIGxvbmcgbmV3c2l6ZSwgb2xkc2l6ZSA9IChiaW0tPnNpemUgKyAxMjcpICYgfjEyNzsKLQkgIGJpbS0+c2l6ZSA9IGFiZmQtPndoZXJlICsgc2l6ZTsKLQkgIC8qIFJvdW5kIHVwIHRvIGN1dCBkb3duIG9uIG1lbW9yeSBmcmFnbWVudGF0aW9uICovCi0JICBuZXdzaXplID0gKGJpbS0+c2l6ZSArIDEyNykgJiB+MTI3OwotCSAgaWYgKG5ld3NpemUgPiBvbGRzaXplKQotCSAgICB7Ci0JICAgICAgYmltLT5idWZmZXIgPSBiZmRfcmVhbGxvYyAoYmltLT5idWZmZXIsIG5ld3NpemUpOwotCSAgICAgIGlmIChiaW0tPmJ1ZmZlciA9PSAwKQotCQl7Ci0JCSAgYmltLT5zaXplID0gMDsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgbWVtY3B5IChiaW0tPmJ1ZmZlciArIGFiZmQtPndoZXJlLCBwdHIsIHNpemUpOwotICAgICAgYWJmZC0+d2hlcmUgKz0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICBud3JvdGUgPSBmd3JpdGUgKHB0ciwgMSwgKHNpemVfdCkgKHNpemUgKiBuaXRlbXMpLAotCQkgICBiZmRfY2FjaGVfbG9va3VwIChhYmZkKSk7Ci0gIGlmIChud3JvdGUgPiAwKQotICAgIGFiZmQtPndoZXJlICs9IG53cm90ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBud3JvdGUgIT0gc2l6ZSAqIG5pdGVtcykKLSAgICB7Ci0jaWZkZWYgRU5PU1BDCi0gICAgICBpZiAobndyb3RlID49IDApCi0JZXJybm8gPSBFTk9TUEM7Ci0jZW5kaWYKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgfQotICByZXR1cm4gbndyb3RlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludAotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQoYmZkICphYmZkLCAgaW50IGkpOwotCi1ERVNDUklQVElPTgotCVdyaXRlIGEgNCBieXRlIGludGVnZXIgQHZhcntpfSB0byB0aGUgb3V0cHV0IEJGRCBAdmFye2FiZmR9LCBpbiBiaWcKLQllbmRpYW4gb3JkZXIgcmVnYXJkbGVzcyBvZiB3aGF0IGVsc2UgaXMgZ29pbmcgb24uICBUaGlzIGlzIHVzZWZ1bCBpbgotCWFyY2hpdmVzLgotCi0qLwotdm9pZAotYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFiZmQsIGkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGk7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgYmZkX3B1dGIzMihpLCBidWZmZXIpOwotICBpZiAoYmZkX3dyaXRlKChQVFIpYnVmZmVyLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIGFib3J0ICgpOwotfQotCi1sb25nCi1iZmRfdGVsbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmaWxlX3B0ciBwdHI7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIGFiZmQtPndoZXJlOwotCi0gIHB0ciA9IGZ0ZWxsIChiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKLQotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKLSAgICBwdHIgLT0gYWJmZC0+b3JpZ2luOwotICBhYmZkLT53aGVyZSA9IHB0cjsKLSAgcmV0dXJuIHB0cjsKLX0KLQotaW50Ci1iZmRfZmx1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmZmx1c2ggKGJmZF9jYWNoZV9sb29rdXAoYWJmZCkpOwotfQotCi0vKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlCi0gICBiZmRfZ2V0X2Vycm9yIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLwotaW50Ci1iZmRfc3RhdCAoYWJmZCwgc3RhdGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZjsKLXsKLSAgRklMRSAqZjsKLSAgaW50IHJlc3VsdDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJlc3VsdCA9IGZzdGF0IChmaWxlbm8gKGYpLCBzdGF0YnVmKTsKLSAgaWYgKHJlc3VsdCA8IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub256ZXJvIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlIGJmZF9nZXRfZXJyb3IKLSAgIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLwotCi1pbnQKLWJmZF9zZWVrIChhYmZkLCBwb3NpdGlvbiwgZGlyZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIHBvc2l0aW9uOwotICAgICBpbnQgZGlyZWN0aW9uOwotewotICBpbnQgcmVzdWx0OwotICBGSUxFICpmOwotICBmaWxlX3B0ciBmaWxlX3Bvc2l0aW9uOwotICAvKiBGb3IgdGhlIHRpbWUgYmVpbmcsIGEgQkZEIG1heSBub3Qgc2VlayB0byBpdCdzIGVuZC4gIFRoZSBwcm9ibGVtCi0gICAgIGlzIHRoYXQgd2UgZG9uJ3QgZWFzaWx5IGhhdmUgYSB3YXkgdG8gcmVjb2duaXplIHRoZSBlbmQgb2YgYW4KLSAgICAgZWxlbWVudCBpbiBhbiBhcmNoaXZlLiAqLwotCi0gIEJGRF9BU1NFUlQgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCB8fCBkaXJlY3Rpb24gPT0gU0VFS19DVVIpOwotCi0gIGlmIChkaXJlY3Rpb24gPT0gU0VFS19DVVIgJiYgcG9zaXRpb24gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZGlyZWN0aW9uID09IFNFRUtfU0VUKQotCWFiZmQtPndoZXJlID0gcG9zaXRpb247Ci0gICAgICBlbHNlCi0JYWJmZC0+d2hlcmUgKz0gcG9zaXRpb247Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfYXJjaGl2ZSAmJiBhYmZkLT5teV9hcmNoaXZlID09IDApCi0gICAgewotI2lmIDAKLSAgICAgIC8qIEV4cGxhbmF0aW9uIGZvciB0aGlzIGNvZGU6IEknbSBvbmx5IGFib3V0IDk1KyUgc3VyZSB0aGF0IHRoZSBhYm92ZQotCSBjb25kaXRpb25zIGFyZSBzdWZmaWNpZW50IGFuZCB0aGF0IGFsbCBpL28gY2FsbHMgYXJlIHByb3Blcmx5Ci0JIGFkanVzdGluZyB0aGUgYHdoZXJlJyBmaWVsZC4gIFNvIHRoaXMgaXMgc29ydCBvZiBhbiBgYXNzZXJ0JwotCSB0aGF0IHRoZSBgd2hlcmUnIGZpZWxkIGlzIGNvcnJlY3QuICBJZiB3ZSBjYW4gZ28gYSB3aGlsZSB3aXRob3V0Ci0JIHRyaXBwaW5nIHRoZSBhYm9ydCwgd2UgY2FuIHByb2JhYmx5IHNhZmVseSBkaXNhYmxlIHRoaXMgY29kZSwKLQkgc28gdGhhdCB0aGUgcmVhbCBvcHRpbWl6YXRpb25zIGhhcHBlbi4gICovCi0gICAgICBmaWxlX3B0ciB3aGVyZV9hbV9pX25vdzsKLSAgICAgIHdoZXJlX2FtX2lfbm93ID0gZnRlbGwgKGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpKTsKLSAgICAgIGlmIChhYmZkLT5teV9hcmNoaXZlKQotCXdoZXJlX2FtX2lfbm93IC09IGFiZmQtPm9yaWdpbjsKLSAgICAgIGlmICh3aGVyZV9hbV9pX25vdyAhPSBhYmZkLT53aGVyZSkKLQlhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBwb3NpdGlvbiA9PSBhYmZkLT53aGVyZSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHNvbWV0aGluZyBzbWFydGVyIHRvIG9wdGltaXplIGFjY2VzcyB0byBhcmNoaXZlcy4KLQkgQ3VycmVudGx5LCBhbnl0aGluZyBpbnNpZGUgYW4gYXJjaGl2ZSBpcyByZWFkIHZpYSB0aGUgZmlsZQotCSBoYW5kbGUgZm9yIHRoZSBhcmNoaXZlLiAgV2hpY2ggbWVhbnMgdGhhdCBhIGJmZF9zZWVrIG9uIG9uZQotCSBjb21wb25lbnQgYWZmZWN0cyB0aGUgYGN1cnJlbnQgcG9zaXRpb24nIGluIHRoZSBhcmNoaXZlLCBhcwotCSB3ZWxsIGFzIGluIGFueSBvdGhlciBjb21wb25lbnQuCi0KLQkgSXQgbWlnaHQgYmUgc3VmZmljaWVudCB0byBwdXQgYSBzcGlrZSB0aHJvdWdoIHRoZSBjYWNoZQotCSBhYnN0cmFjdGlvbiwgYW5kIGxvb2sgdG8gdGhlIGFyY2hpdmUgZm9yIHRoZSBmaWxlIHBvc2l0aW9uLAotCSBidXQgSSB0aGluayB3ZSBzaG91bGQgdHJ5IGZvciBzb21ldGhpbmcgY2xlYW5lci4KLQotCSBJbiB0aGUgbWVhbnRpbWUsIG5vIG9wdGltaXphdGlvbiBmb3IgYXJjaGl2ZXMuICAqLwotICAgIH0KLQotICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGZpbGVfcG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0gICAgZmlsZV9wb3NpdGlvbiArPSBhYmZkLT5vcmlnaW47Ci0KLSAgcmVzdWx0ID0gZnNlZWsgKGYsIGZpbGVfcG9zaXRpb24sIGRpcmVjdGlvbik7Ci0KLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIHsKLSAgICAgIGludCBob2xkX2Vycm5vID0gZXJybm87Ci0KLSAgICAgIC8qIEZvcmNlIHJlZGV0ZXJtaW5hdGlvbiBvZiBgd2hlcmUnIGZpZWxkLiAgKi8KLSAgICAgIGJmZF90ZWxsIChhYmZkKTsKLQotICAgICAgLyogQW4gRUlOVkFMIGVycm9yIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIGZpbGUgb2Zmc2V0IHdhcwotICAgICAgICAgYWJzdXJkLiAgKi8KLSAgICAgIGlmIChob2xkX2Vycm5vID09IEVJTlZBTCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICBlcnJubyA9IGhvbGRfZXJybm87Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkanVzdCBgd2hlcmUnIGZpZWxkLiAgKi8KLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCi0JYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKLSAgICAgIGVsc2UKLQlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0MCi0vKiogVGhlIGRvLWl0LXlvdXJzZWxmIChieXRlKSBzZXgtY2hhbmdlIGtpdCAqLwotCi0vKiBUaGUgbWlkZGxlIGxldHRlciBlLmcuIGdldDxiPnNob3J0IGluZGljYXRlcyBCaWcgb3IgTGl0dGxlIGVuZGlhbgotICAgdGFyZ2V0IG1hY2hpbmUuICBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0Ci0gICBtYWNoaW5lIGlzOyB0aGVzZSByb3V0aW5lcyB3b3JrIGZvciBlaXRoZXIuICAqLwotCi0vKiBGSVhNRTogU2hvdWxkIHRoZXNlIHRha2UgYSBjb3VudCBhcmd1bWVudD8KLSAgIEFuc3dlciAoZ251QGN5Z251cy5jb20pOiAgTm8sIGJ1dCBwZXJoYXBzIHRoZXkgc2hvdWxkIGJlIGlubGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgaW4gc3dhcC5oICNpZmRlZiBfX0dOVUNfXy4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwcm9mIHRoZW0gbGF0ZXIgYW5kIGZpbmQgb3V0LiAgKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3B1dF9zaXplCi1GVU5DVElPTgotCWJmZF9nZXRfc2l6ZQotCi1ERVNDUklQVElPTgotCVRoZXNlIG1hY3JvcyBhcyB1c2VkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHJhdyBkYXRhIGluCi0Jc2VjdGlvbnM7IGVhY2ggYWNjZXNzIChleGNlcHQgZm9yIGJ5dGVzKSBpcyB2ZWN0b3JlZCB0aHJvdWdoCi0JdGhlIHRhcmdldCBmb3JtYXQgb2YgdGhlIEJGRCBhbmQgbWFuZ2xlZCBhY2NvcmRpbmdseS4gVGhlCi0JbWFuZ2xpbmcgcGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBlbmRpYW4gdHJhbnNsYXRpb25zIGFuZAotCXJlbW92ZXMgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gIE5vdGUgdGhhdCB0eXBlcyBhY2NlcHRlZCBhbmQKLQlyZXR1cm5lZCBieSB0aGVzZSBtYWNyb3MgYXJlIGlkZW50aWNhbCBzbyB0aGV5IGNhbiBiZSBzd2FwcGVkCi0JYXJvdW5kIGluIG1hY3Jvcy0tLWZvciBleGFtcGxlLCBAZmlsZXtsaWJhb3V0Lmh9IGRlZmluZXMgPDxHRVRfV09SRD4+Ci0JdG8gZWl0aGVyIDw8YmZkX2dldF8zMj4+IG9yIDw8YmZkX2dldF82ND4+LgotCi0JSW4gdGhlIHB1dCByb3V0aW5lcywgQHZhcnt2YWx9IG11c3QgYmUgYSA8PGJmZF92bWE+Pi4gIElmIHdlIGFyZSBvbiBhCi0Jc3lzdGVtIHdpdGhvdXQgcHJvdG90eXBlcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nCi0Jc3VyZSB0aGF0IGlzIHRydWUsIHdpdGggYSBjYXN0IGlmIG5lY2Vzc2FyeS4gIFdlIGRvbid0IGNhc3QKLQl0aGVtIGluIHRoZSBtYWNybyBkZWZpbml0aW9ucyBiZWNhdXNlIHRoYXQgd291bGQgcHJldmVudCA8PGxpbnQ+PgotCW9yIDw8Z2NjIC1XYWxsPj4gZnJvbSBkZXRlY3Rpbmcgc2lucyBzdWNoIGFzIHBhc3NpbmcgYSBwb2ludGVyLgotCVRvIGRldGVjdCBjYWxsaW5nIHRoZXNlIHdpdGggbGVzcyB0aGFuIGEgPDxiZmRfdm1hPj4sIHVzZQotCTw8Z2NjIC1XY29udmVyc2lvbj4+IG9uIGEgaG9zdCB3aXRoIDY0IGJpdCA8PGJmZF92bWE+PidzLgotCi0uCi0ueyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKn0KLS4KLS4jZGVmaW5lIGJmZF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICAoKHZvaWQpICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfOCBcCi0uCQliZmRfcHV0XzgKLS4jZGVmaW5lIGJmZF9nZXRfOChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLS4JCSgoKih1bnNpZ25lZCBjaGFyICopKHB0cikgXiAweDgwKSAtIDB4ODApCi0uCi0uI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MTYsICgodmFsKSwocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8xNiBcCi0uCQkgYmZkX3B1dF8xNgotLiNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgxNiwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAJIEJGRF9TRU5EIChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDMyLCAoKHZhbCksKHB0cikpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMzIgXAotLgkJIGJmZF9wdXRfMzIKLS4jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MzIsIChwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzMyLCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHg2NCwgKCh2YWwpLCAocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0uCQkgYmZkX3B1dF82NAotLiNkZWZpbmUgYmZkX2dldF82NChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHg2NCwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2dldChiaXRzLCBhYmZkLCBwdHIpCQkJCVwKLS4gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX2dldF84IChhYmZkLCBwdHIpCQlcCi0uCQkgOiAoYml0cykgPT0gMTYgPyBiZmRfZ2V0XzE2IChhYmZkLCBwdHIpCVwKLS4JCSA6IChiaXRzKSA9PSAzMiA/IGJmZF9nZXRfMzIgKGFiZmQsIHB0cikJXAotLgkJIDogKGJpdHMpID09IDY0ID8gYmZkX2dldF82NCAoYWJmZCwgcHRyKQlcCi0uCQkgOiAoYWJvcnQgKCksIChiZmRfdm1hKSAtIDEpKQotLgotLiNkZWZpbmUgYmZkX3B1dChiaXRzLCBhYmZkLCB2YWwsIHB0cikJCQkJXAotLiAgICAgICAgICAgICAgICAoKGJpdHMpID09IDggPyBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQlcCi0uCQkgOiAoYml0cykgPT0gMTYgPyBiZmRfcHV0XzE2IChhYmZkLCB2YWwsIHB0cikJXAotLgkJIDogKGJpdHMpID09IDMyID8gYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBwdHIpCVwKLS4JCSA6IChiaXRzKSA9PSA2NCA/IGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgcHRyKQlcCi0uCQkgOiAoYWJvcnQgKCksICh2b2lkKSAwKSkKLS4KLSovIAotCi0vKgotRlVOQ1RJT04KLQliZmRfaF9wdXRfc2l6ZQotCWJmZF9oX2dldF9zaXplCi0KLURFU0NSSVBUSU9OCi0JVGhlc2UgbWFjcm9zIGhhdmUgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlaXIgPDxiZmRfZ2V0X3g+PgotCWJyZXRoZXJlbiwgZXhjZXB0IHRoYXQgdGhleSBhcmUgdXNlZCBmb3IgcmVtb3ZpbmcgaW5mb3JtYXRpb24KLQlmb3IgdGhlIGhlYWRlciByZWNvcmRzIG9mIG9iamVjdCBmaWxlcy4gQmVsaWV2ZSBpdCBvciBub3QsCi0Jc29tZSBvYmplY3QgZmlsZXMga2VlcCB0aGVpciBoZWFkZXIgcmVjb3JkcyBpbiBiaWcgZW5kaWFuCi0Jb3JkZXIgYW5kIHRoZWlyIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4KLS4KLS57KiBCeXRlIHN3YXBwaW5nIG1hY3JvcyBmb3IgZmlsZSBoZWFkZXIgZGF0YS4gICp9Ci0uCi0uI2RlZmluZSBiZmRfaF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotLgkJYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfOChhYmZkLCB2YWwsIHB0cikgXAotLgkJYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLS4jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotLgkJYmZkX2dldF84IChhYmZkLCBwdHIpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzgoYWJmZCwgcHRyKSBcCi0uCQliZmRfZ2V0X3NpZ25lZF84IChhYmZkLCBwdHIpCi0uCi0uI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDE2LCh2YWwscHRyKSkKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfMTYgXAotLgkJIGJmZF9oX3B1dF8xNgotLiNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MTYsKHB0cikpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzE2LCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MzIsKHZhbCxwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0uCQkgYmZkX2hfcHV0XzMyCi0uI2RlZmluZSBiZmRfaF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgzMiwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2hfcHV0XzY0KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF82NCBcCi0uCQkgYmZkX2hfcHV0XzY0Ci0uI2RlZmluZSBiZmRfaF9nZXRfNjQoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfNjQoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotLgotKi8gCi0KLS8qIFNpZ24gZXh0ZW5zaW9uIHRvIGJmZF9zaWduZWRfdm1hLiAgKi8KLSNkZWZpbmUgQ09FUkNFMTYoeCkgKCgoYmZkX3NpZ25lZF92bWEpICh4KSBeIDB4ODAwMCkgLSAweDgwMDApCi0jZGVmaW5lIENPRVJDRTMyKHgpIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSkgKGxvbmcpICgoKHVuc2lnbmVkIGxvbmcpICh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkpCi0jZGVmaW5lIEVJR0hUX0dBWklMTElPTiAoKChCRkRfSE9TVF82NF9CSVQpMHg4MDAwMDAwMCkgPDwgMzIpCi0jZGVmaW5lIENPRVJDRTY0KHgpIFwKLSAgKCgoYmZkX3NpZ25lZF92bWEpICh4KSBeIEVJR0hUX0dBWklMTElPTikgLSBFSUdIVF9HQVpJTExJT04pCi0KLWJmZF92bWEKLWJmZF9nZXRiMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIChhZGRyWzFdIDw8IDgpIHwgYWRkclswXTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF8xNiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHJldHVybiBDT0VSQ0UxNigoYWRkclswXSA8PCA4KSB8IGFkZHJbMV0pOwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGxfc2lnbmVkXzE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIENPRVJDRTE2KChhZGRyWzFdIDw8IDgpIHwgYWRkclswXSk7Ci19Ci0KLXZvaWQKLWJmZF9wdXRiMTYgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gOCk7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUgKWRhdGE7Ci19Ci0KLXZvaWQKLWJmZF9wdXRsMTYgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsgICAgICAgICAgICAgCi0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICBhZGRyWzBdID0gKGJmZF9ieXRlIClkYXRhOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+IDgpOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0YjMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXSA8PCAyNDsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdOwotICByZXR1cm4gKGJmZF92bWEpIHY7Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRsMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdOwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM10gPDwgMjQ7Ci0gIHJldHVybiAoYmZkX3ZtYSkgdjsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF8zMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF0gPDwgMjQ7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXTsKLSAgcmV0dXJuIENPRVJDRTMyICh2KTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF8zMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXSA8PCAyNDsKLSAgcmV0dXJuIENPRVJDRTMyICh2KTsKLX0KLQotYmZkX3ZtYQotYmZkX2dldGI2NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLQotICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbM10pICk7Ci0KLSAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzddKSk7Ci0KLSAgcmV0dXJuIGhpZ2ggPDwgMzIgfCBsb3c7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotICBoaWdoPSAoKCgoKCgoYWRkcls3XSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzRdKSk7Ci0KLSAgbG93ID0gKCgoKCgoKChiZmRfdm1hKWFkZHJbM10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclswXSkgKTsKLQotICByZXR1cm4gaGlnaCA8PCAzMiB8IGxvdzsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0gIHJldHVybiAwOwotI2VuZGlmCi0KLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF82NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLQotICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbM10pICk7Ci0KLSAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzddKSk7Ci0KLSAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF82NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgaGlnaD0gKCgoKCgoKGFkZHJbN10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkcls0XSkpOwotCi0gIGxvdyA9ICgoKCgoKCgoYmZkX3ZtYSlhZGRyWzNdIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbMF0pICk7Ci0KLSAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotdm9pZAotYmZkX3B1dGIzMiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgICAgICAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci0gICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMTYpOwotICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICA4KTsKLSAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSlkYXRhOwotfQotCi12b2lkCi1iZmRfcHV0bDMyIChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICAgICAgICBhZGRyWzBdID0gKGJmZF9ieXRlKWRhdGE7Ci0gICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gIDgpOwotICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+IDE2KTsKLSAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci19Ci0KLXZvaWQKLWJmZF9wdXRiNjQgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDcqOCkpOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+ICg2KjgpKTsKLSAgYWRkclsyXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNSo4KSk7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDQqOCkpOwotICBhZGRyWzRdID0gKGJmZF9ieXRlKShkYXRhID4+ICgzKjgpKTsKLSAgYWRkcls1XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMio4KSk7Ci0gIGFkZHJbNl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDEqOCkpOwotICBhZGRyWzddID0gKGJmZF9ieXRlKShkYXRhID4+ICgwKjgpKTsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotYmZkX3B1dGw2NCAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYWRkcls3XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNyo4KSk7Ci0gIGFkZHJbNl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDYqOCkpOwotICBhZGRyWzVdID0gKGJmZF9ieXRlKShkYXRhID4+ICg1KjgpKTsKLSAgYWRkcls0XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNCo4KSk7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDMqOCkpOwotICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICgyKjgpKTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMSo4KSk7Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDAqOCkpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSNlbmRpZgotfQotDAotLyogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoYmZkX3NpemVfdHlwZSkgKG9mZnNldCArIGNvdW50KSA+IHNlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKSAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IChhYmZkLCBzZWN0aW9uLCB3LCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF93aW5kb3cgKncgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBVU0VfTU1BUAotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGFiZmQtPnh2ZWMtPl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgIT0gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hhdCBjaGFuZ2VzIHRoZSBiZmQncyBnZXRfc2VjdGlvbl9jb250ZW50cwotCSBtZXRob2QgbWF5IGhhdmUgdG8gbWFrZS4gIFNvIHB1bnQgdHJ5aW5nIHRvIG1hcCB0aGUgZmlsZQotCSB3aW5kb3csIGFuZCBsZXQgZ2V0X3NlY3Rpb25fY29udGVudHMgZG8gaXRzIHRoaW5nLiAgKi8KLSAgICAgIC8qIEBAIEZJWE1FIDogSWYgdGhlIGludGVybmFsIHdpbmRvdyBoYXMgYSByZWZjb3VudCBvZiAxIGFuZCB3YXMKLQkgYWxsb2NhdGVkIHdpdGggbWFsbG9jIGluc3RlYWQgb2YgbW1hcCwganVzdCByZXVzZSBpdC4gICovCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKHcpOwotICAgICAgdy0+aSA9IChiZmRfd2luZG93X2ludGVybmFsICopIGJmZF96bWFsbG9jIChzaXplb2YgKGJmZF93aW5kb3dfaW50ZXJuYWwpKTsKLSAgICAgIGlmICh3LT5pID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdy0+aS0+ZGF0YSA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIGNvdW50KTsKLSAgICAgIGlmICh3LT5pLT5kYXRhID09IE5VTEwpCi0JewotCSAgZnJlZSAody0+aSk7Ci0JICB3LT5pID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB3LT5pLT5tYXBwZWQgPSAwOwotICAgICAgdy0+aS0+cmVmY291bnQgPSAxOwotICAgICAgdy0+c2l6ZSA9IHctPmktPnNpemUgPSBjb3VudDsKLSAgICAgIHctPmRhdGEgPSB3LT5pLT5kYXRhOwotICAgICAgcmV0dXJuIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgdy0+ZGF0YSwgb2Zmc2V0LCBjb3VudCk7Ci0gICAgfQotICBpZiAoKGJmZF9zaXplX3R5cGUpIChvZmZzZXQrY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplCi0gICAgICB8fCAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgY291bnQsIHcsIHRydWUpCi0JICA9PSBmYWxzZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gIGFib3J0ICgpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgZ2VuZXJpYyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIGltcGxlbWVudGF0aW9ucyB3aGVyZSBjcmVhdGluZwotICAgTkVXIHNlY3Rpb25zIGlzIGRpc2FsbG93ZWQuICBJdCBpcyB1c2VmdWwgaW4gcGF0Y2hpbmcgZXhpc3Rpbmcgc2VjdGlvbnMKLSAgIGluIHJlYWQtd3JpdGUgZmlsZXMsIHRob3VnaC4gIFNlZSBvdGhlciBzZXRfc2VjdGlvbl9jb250ZW50cyBmdW5jdGlvbnMKLSAgIHRvIHNlZSB3aHkgaXQgZG9lc24ndCB3b3JrIGZvciBuZXcgc2VjdGlvbnMuICAqLwotYm9vbGVhbgotX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKSAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfbG9nMgotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfbG9nMihiZmRfdm1hIHgpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbG9nIGJhc2UgMiBvZiB0aGUgdmFsdWUgc3VwcGxpZWQsIHJvdW5kZWQgdXAuICBFLmcuLCBhbgotCUB2YXJ7eH0gb2YgMTAyNSByZXR1cm5zIDExLgotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfbG9nMiAoeCkKLSAgICAgYmZkX3ZtYSB4OwotewotICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQotICB3aGlsZSAoKHggPSAoeCA+PiAxKSkgIT0gMCkKLSAgICArK3Jlc3VsdDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbGVhbgotYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjaGFyIGxvY2Fsc19wcmVmaXggPSAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXycpID8gJ0wnIDogJy4nOwotCi0gIHJldHVybiAobmFtZVswXSA9PSBsb2NhbHNfcHJlZml4KTsKLX0KLQotLyogIENhbiBiZSB1c2VkIGZyb20gLyBmb3IgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgdG8gY2hlY2sgdGhhdAotICAgIGVuZGlhbm5lc3MgbWF0Y2hlcyBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZmlsZS4gIFJldHVybnMKLSAgICB0cnVlIGZvciBhIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZW1pdHMgYW4gZXJyb3IuICAqLwotYm9vbGVhbgotX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuIiwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0JIGJmZF9iaWdfZW5kaWFuIChvYmZkKSA/ICJiaWciIDogImxpdHRsZSIpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvbGliYmZkLmggYi9iZmQvbGliYmZkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmY3ZWYuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmJmZC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTE5ICswLDAgQEAKLS8qIGxpYmJmZC5oIC0tIERlY2xhcmF0aW9ucyB1c2VkIGJ5IGJmZCBsaWJyYXJ5ICppbXBsZW1lbnRhdGlvbiouCi0gICAoVGhpcyBpbmNsdWRlIGZpbGUgaXMgbm90IGZvciB1c2VycyBvZiB0aGUgbGlicmFyeS4pCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmJmZC5oIGlzIGEgR0VORVJBVEVEIGZpbGUuICBEb24ndCBjaGFuZ2UgaXQ7IGluc3RlYWQsCi0qKiBjaGFuZ2UgbGliYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGlzIGZpbGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWxpZ24gYW4gYWRkcmVzcyB1cHdhcmQgdG8gYSBib3VuZGFyeSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgRS5nLiBhbGlnbiB0byBhbiA4LWJ5dGUgYm91bmRhcnkgd2l0aCBhcmd1bWVudCBvZiA4LiAgVGFrZSBjYXJlIG5ldmVyCi0gICB0byB3cmFwIGFyb3VuZCBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gYm91bmRhcnktMSBvZiB0aGUgZW5kIG9mIHRoZQotICAgYWRkcmVzcyBzcGFjZS4gICovCi0jZGVmaW5lIEJGRF9BTElHTih0aGlzLCBib3VuZGFyeSkJCQkJCVwKLSAgKCgoKGJmZF92bWEpICh0aGlzKSArIChib3VuZGFyeSkgLSAxKSA+PSAoYmZkX3ZtYSkgKHRoaXMpKQkJXAotICAgPyAoKChiZmRfdm1hKSAodGhpcykgKyAoKGJvdW5kYXJ5KSAtIDEpKSAmICh+KChib3VuZGFyeSktMSkpKQlcCi0gICA6IH4gKGJmZF92bWEpIDApCi0KLS8qIElmIHlvdSB3YW50IHRvIHJlYWQgYW5kIHdyaXRlIGxhcmdlIGJsb2NrcywgeW91IG1pZ2h0IHdhbnQgdG8gZG8gaXQKLSAgIGluIHF1YW50YSBvZiB0aGlzIGFtb3VudCAqLwotI2RlZmluZSBERUZBVUxUX0JVRkZFUlNJWkUgODE5MgotCi0vKiBTZXQgYSB0ZGF0YSBmaWVsZC4gIENhbid0IHVzZSB0aGUgb3RoZXIgbWFjcm9zIGZvciB0aGlzLCBzaW5jZSB0aGV5Ci0gICBkbyBjYXN0cywgYW5kIGNhc3RpbmcgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCBpc24ndCBwb3J0YWJsZS4gICovCi0jZGVmaW5lIHNldF90ZGF0YShiZmQsIHYpICgoYmZkKS0+dGRhdGEuYW55ID0gKFBUUikgKHYpKQotCi0vKiBJZiBCRkRfSU5fTUVNT1JZIGlzIHNldCBmb3IgYSBCRkQsIHRoZW4gdGhlIGlvc3RyZWFtIGZpZWxkcyBwb2ludHMKLSAgIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGJmZF9pbl9tZW1vcnkKLXsKLSAgLyogU2l6ZSBvZiBidWZmZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIEJ1ZmZlciBob2xkaW5nIGNvbnRlbnRzIG9mIEJGRC4gICovCi0gIGJmZF9ieXRlICpidWZmZXI7Ci19OwotCi0vKiB0ZGF0YSBmb3IgYW4gYXJjaGl2ZS4gIEZvciBhbiBpbnB1dCBhcmNoaXZlLCBjYWNoZQotICAgbmVlZHMgdG8gYmUgZnJlZSgpJ2QuICBGb3IgYW4gb3V0cHV0IGFyY2hpdmUsIHN5bWRlZnMgZG8uICAqLwotCi1zdHJ1Y3QgYXJ0ZGF0YSB7Ci0gIGZpbGVfcHRyIGZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgLyogU3BlZWQgdXAgc2VhcmNoaW5nIHRoZSBhcm1hcCAqLwotICBzdHJ1Y3QgYXJfY2FjaGUgKmNhY2hlOwotICBiZmQgKmFyY2hpdmVfaGVhZDsgICAgICAgICAgICAvKiBPbmx5IGludGVyZXN0aW5nIGluIG91dHB1dCByb3V0aW5lcyAqLwotICBjYXJzeW0gKnN5bWRlZnM7CQkvKiB0aGUgc3ltZGVmIGVudHJpZXMgKi8KLSAgc3ltaW5kZXggc3ltZGVmX2NvdW50OyAgICAgICAgICAgICAvKiBob3cgbWFueSB0aGVyZSBhcmUgKi8KLSAgY2hhciAqZXh0ZW5kZWRfbmFtZXM7CQkvKiBjbGV2ZXIgaW50ZWwgZXh0ZW5zaW9uICovCi0gIC8qIHdoZW4gbW9yZSBjb21waWxlcnMgYXJlIHN0YW5kYXJkIEMsIHRoaXMgY2FuIGJlIGEgdGltZV90ICovCi0gIGxvbmcgIGFybWFwX3RpbWVzdGFtcDsJLyogVGltZXN0YW1wIHZhbHVlIHdyaXR0ZW4gaW50byBhcm1hcC4KLQkJCQkgICBUaGlzIGlzIHVzZWQgZm9yIEJTRCBhcmNoaXZlcyB0byBjaGVjawotCQkJCSAgIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyByZWNlbnQgZW5vdWdoCi0JCQkJICAgZm9yIHRoZSBCU0QgbGlua2VyIHRvIG5vdCBjb21wbGFpbiwKLQkJCQkgICBqdXN0IGJlZm9yZSB3ZSBmaW5pc2ggd3JpdGluZyBhbgotCQkJCSAgIGFyY2hpdmUuICAqLwotICBmaWxlX3B0ciBhcm1hcF9kYXRlcG9zOwkvKiBQb3NpdGlvbiB3aXRoaW4gYXJjaGl2ZSB0byBzZWVrIHRvCi0JCQkJICAgcmV3cml0ZSB0aGUgZGF0ZSBmaWVsZC4gICovCi0gIFBUUiB0ZGF0YTsJCQkvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLX07Ci0KLSNkZWZpbmUgYmZkX2FyZGF0YShiZmQpICgoYmZkKS0+dGRhdGEuYW91dF9hcl9kYXRhKQotCi0vKiBHb2VzIGluIGJmZCdzIGFyZWx0X2RhdGEgc2xvdCAqLwotc3RydWN0IGFyZWx0ZGF0YSB7Ci0gIGNoYXIgKiBhcmNoX2hlYWRlcjsJCQkgICAgIC8qIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcgKi8KLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOyAgICAgLyogb2N0ZXRzIG9mIGZpbGVzaXplIG5vdCBpbmNsdWRpbmcgYXJfaGRyICovCi0gIGNoYXIgKmZpbGVuYW1lOwkJCSAgICAgLyogbnVsbC10ZXJtaW5hdGVkICovCi19OwotCi0jZGVmaW5lIGFyZWx0X3NpemUoYmZkKSAoKChzdHJ1Y3QgYXJlbHRkYXRhICopKChiZmQpLT5hcmVsdF9kYXRhKSktPnBhcnNlZF9zaXplKQotCi1leHRlcm4gUFRSIGJmZF9tYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF9yZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1leHRlcm4gYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBfYmZkX2Vycm9yX2hhbmRsZXI7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIGFuZCBmcmVlIHRoaW5ncyBvbiB0aGUgQkZEJ3Mgb2JqYWxsb2MuICAqLwotCi1leHRlcm4gUFRSIGJmZF9hbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96YWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgYmZkX3JlbGVhc2UgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1iZmQgKglfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgUEFSQU1TICgoYmZkICpvYmZkKSk7Ci1iZmQgKglfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSBQQVJBTVMgKChiZmQgKmFyY2hfYmZkLCBmaWxlX3B0ciBpbmRleCkpOwotYm9vbGVhbiBfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZCAqKSk7Ci1ib29sZWFuCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpiZmRfZ2VuZXJpY19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCWJmZF9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgYmZkX3NsdXJwX2JzZF9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYmZkX3NsdXJwX2NvZmZfYXJtYXAgYmZkX3NsdXJwX2FybWFwCi1ib29sZWFuCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKikpOwotYm9vbGVhbglfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBlbGVuZ3RoKSk7Ci1iZmQgKl9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwgZmlsZV9wdHIgZmlsZXBvcykpOwotZXh0ZXJuIGJmZCAqX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci1iZmQgKiBfYmZkX25ld19iZmQgUEFSQU1TICgodm9pZCkpOwotCi1ib29sZWFuCWJmZF9mYWxzZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotYm9vbGVhbgliZmRfdHJ1ZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotUFRSCWJmZF9udWxsdm9pZHB0ciBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotaW50CWJmZF8wIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci11bnNpZ25lZCBpbnQJYmZkXzB1IFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCWJmZF8wbCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotbG9uZwlfYmZkX24xIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci12b2lkCWJmZF92b2lkIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci0KLWJmZCAqX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiBQQVJBTVMgKChiZmQgKikpOwotY29uc3QgYmZkX3RhcmdldCAqX2JmZF9kdW1teV90YXJnZXQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQJYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfYnNkX3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLXZvaWQJYmZkX2dudV90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci0KLWJvb2xlYW4JYnNkX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotYm9vbGVhbgljb2ZmX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLWJmZCAqCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2hpdmUsCi0JCQkJCQkgICAgIGJmZCAqbGFzdF9maWxlKSk7Ci0KLWludAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLSNkZWZpbmUgX2JmZF9yZWFkX2FyX2hkcihhYmZkKSBcCi0gIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlYWRfYXJfaGRyX2ZuLCAoYWJmZCkpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfR0VORVJJQy4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF93aW5kb3cgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUFkuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkICosIGFzeW1ib2wgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSKSkpIGJmZF90cnVlKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUkUgd2hlbiB0aGVyZSBpcyBubyBjb3JlIGZpbGUKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLiAgKi8KLQotZXh0ZXJuIGNoYXIgKl9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB3aGVuIHRoZXJlIGlzIG5vIGFyY2hpdmUKLSAgIGZpbGUgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2FybWFwIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4IFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF9mYWxzZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IEJTRCBzdHlsZQotICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCkuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3RydW5jYXRlX2FybmFtZSBiZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBDT0ZGIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZikuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2FybWFwIGJmZF9zbHVycF9jb2ZmX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl93cml0ZV9hcm1hcCBjb2ZmX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIHdoZXJlIHRoZXJlIGlzIG5vIHN5bWJvbAotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19tYWtlX2VtcHR5X3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8gXAotICAoKGFsZW50ICooKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosIFwKLQkgICAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIFBUUiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyB3aGVuIHRoZXJlIGlzIG5vIHJlbG9jCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURSBmb3IgdGFyZ2V0cyB3aGljaCBtYXkgbm90Ci0gICBiZSB3cml0dGVuLiAgVXNlIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX25vd3JpdGUpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X2FyY2hfbWFjaCBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfc2VjdGlvbl9jb250ZW50cyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKSkgXAotICAgYmZkX2ZhbHNlKQotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9MSU5LIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgc3VwcG9ydCBsaW5raW5nLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMgKChpbnQgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSkpIGJmZF8wKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChiZmRfYnl0ZSAqKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosIFwKLQkgICAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfcmVsYXhfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfYWRkX3N5bWJvbHMgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2ZpbmFsX2xpbmsgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfZmFsc2UpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKLSAgIGhhdmUgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDCi0gICAoX2JmZF9ub2R5bmFtaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gZGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBzeW1ib2wgaXMgYSBsb2NhbAotICAgbGFiZWwuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdlbmVyaWMgbWluaXN5bWJvbCByb3V0aW5lcy4gICovCi1leHRlcm4gbG9uZyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGFzZWN0aW9uICosIGJmZF92bWEsIGJvb2xlYW4gKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgUFRSICopKTsKLQotLyogRmluZCB0aGUgbmVhZGVyc3QgbGluZSB1c2luZyBEV0FSRiAxIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgRFdBUkYgMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBIHJvdXRpbmUgdG8gY3JlYXRlIGVudHJpZXMgZm9yIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksCi0JICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZSwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIEdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGNyZWF0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBHZW5lcmljIGFkZCBzeW1ib2wgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFkZCBzeW1ib2wgcm91dGluZS4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGJ5IHRhcmdldHMgZm9yCi0gICB3aGljaCB0aGUgbGlua2VyIG11c3QgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGJ5IG5hbWUsCi0gICBhcyB0aGUgY29sbGVjdDIgcHJvZ3JhbSBkb2VzLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogR2VuZXJpYyBhcmNoaXZlIGFkZCBzeW1ib2wgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIGJvb2xlYW4gKCpjaGVja2ZuKSAoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKTsKLQotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gYXZvaWQgcHJvdG90eXBlIGVycm9ycy4gICovCi10eXBlZGVmIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IF9iZmRfbGlua19oYXNoX2VudHJ5OwotCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gYWRkIGEgc2luZ2xlIHN5bWJvbC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqbmFtZSwgZmxhZ3dvcmQsCi0JICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuIGNvcHksCi0JICAgYm9vbGVhbiBjb25zdHJ1Y3Rvciwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotLyogR2VuZXJpYyBsaW5rIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSk7Ci0KLS8qIEdlbmVyaWMgcmVsb2NfbGlua19vcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRGVmYXVsdCBsaW5rIG9yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2RlZmF1bHRfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlbG9jIGVudHJpZXMgaW4gYSBsaW5rIG9yZGVyIGxpc3QuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIEZpbmFsIGxpbmsgcmVsb2NhdGlvbiByb3V0aW5lLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYmZkX3ZtYSBhZGRyZXNzLCBiZmRfdm1hIHZhbHVlLCBiZmRfdm1hIGFkZGVuZCkpOwotCi0vKiBSZWxvY2F0ZSBhIHBhcnRpY3VsYXIgbG9jYXRpb24gYnkgYSBob3d0byBhbmQgYSB2YWx1ZS4gICovCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi0vKiBMaW5rIHN0YWJzIGluIHNlY3Rpb25zIGluIHRoZSBmaXJzdCBwYXNzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBhc2VjdGlvbiAqLCBQVFIgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFiIHNlY3Rpb24gd2hlbiBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF9ieXRlICopKTsKLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYnN0ciBzdHJpbmcgdGFibGUgd2hlbiBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIFBUUiAqKSk7Ci0KLS8qIEZpbmQgYW4gb2Zmc2V0IHdpdGhpbiBhIC5zdGFiIHNlY3Rpb24gd2hlbiBsaW5raW5nIHN0YWJzIGluCi0gICBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBiZmRfdm1hIF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfdm1hKSk7Ci0KLS8qIENyZWF0ZSBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIENyZWF0ZSBhbiBYQ09GRiAuZGVidWcgc2VjdGlvbiBzdHlsZSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGcmVlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIF9iZmRfc3RyaW5ndGFiX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9zaXplIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBBZGQgYSBzdHJpbmcgdG8gYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfYWRkCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGhhc2gsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFdyaXRlIG91dCBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0cmluZ3RhYl9lbWl0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogQ2hlY2sgdGhhdCBlbmRpYW5uZXNzIG9mIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBtYXRjaC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQwKLS8qIE1hY3JvcyB0byB0ZWxsIGlmIGJmZHMgYXJlIHJlYWQgb3Igd3JpdGUgZW5hYmxlZC4KLQotICAgTm90ZSB0aGF0IGJmZHMgb3BlbiBmb3IgcmVhZCBtYXkgYmUgc2NyaWJibGVkIGludG8gaWYgdGhlIGZkIHBhc3NlZAotICAgdG8gYmZkX2Zkb3BlbnIgaXMgYWN0dWFsbHkgb3BlbiBib3RoIGZvciByZWFkIGFuZCB3cml0ZQotICAgc2ltdWx0YW5lb3VzbHkuICBIb3dldmVyIGFuIG91dHB1dCBiZmQgd2lsbCBuZXZlciBiZSBvcGVuIGZvcgotICAgcmVhZC4gIFRoZXJlZm9yZSBzb21ldGltZXMgeW91IHdhbnQgdG8gY2hlY2sgYmZkX3JlYWRfcCBvcgotICAgIWJmZF9yZWFkX3AsIGFuZCBvbmx5IHNvbWV0aW1lcyBiZmRfd3JpdGVfcC4KLSovCi0KLSNkZWZpbmUJYmZkX3JlYWRfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gcmVhZF9kaXJlY3Rpb24gfHwgKGFiZmQpLT5kaXJlY3Rpb24gPT0gYm90aF9kaXJlY3Rpb24pCi0jZGVmaW5lCWJmZF93cml0ZV9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24gfHwgKGFiZmQpLT5kaXJlY3Rpb24gPT0gYm90aF9kaXJlY3Rpb24pCi0KLXZvaWQJYmZkX2Fzc2VydCBQQVJBTVMgKChjb25zdCBjaGFyKixpbnQpKTsKLQotI2RlZmluZSBCRkRfQVNTRVJUKHgpIFwKLXsgaWYgKCEoeCkpIGJmZF9hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9Ci0KLSNkZWZpbmUgQkZEX0ZBSUwoKSBcCi17IGJmZF9hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9Ci0KLWV4dGVybiB2b2lkIF9iZmRfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpCi0gICAgIEFUVFJJQlVURV9OT1JFVFVSTjsKLQotLyogaWYgZ2NjLCB3ZSBjYW4gZ2l2ZSBhIGZ1bmN0aW9uIG5hbWUsIHRvbyAqLwotI2lmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX01JTk9SX18gPD0gNQotI2RlZmluZSBfX1BSRVRUWV9GVU5DVElPTl9fICAoKGNoYXIgKikgTlVMTCkKLSNlbmRpZgotCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKSBfYmZkX2Fib3J0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pCi0KLUZJTEUgKgliZmRfY2FjaGVfbG9va3VwX3dvcmtlciBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKLQotLyogTGlzdCBvZiBzdXBwb3J0ZWQgdGFyZ2V0IHZlY3RvcnMsIGFuZCB0aGUgZGVmYXVsdCB2ZWN0b3IgKGlmCi0gICBiZmRfZGVmYXVsdF92ZWN0b3JbMF0gaXMgTlVMTCwgdGhlcmUgaXMgbm8gZGVmYXVsdCkuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCBiZmRfdGFyZ2V0X3ZlY3RvcltdOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9kZWZhdWx0X3ZlY3RvcltdOwotCi0vKiBGdW5jdGlvbnMgc2hhcmVkIGJ5IHRoZSBFQ09GRiBhbmQgTUlQUyBFTEYgYmFja2VuZHMsIHdoaWNoIGhhdmUgbm8KLSAgIG90aGVyIGNvbW1vbiBoZWFkZXIgZmlsZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9maW5kX2xpbmU7Ci0jZW5kaWYKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9sb2NhdGVfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LCBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICosCi0JICAgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotCi1leHRlcm4gYmZkX3ZtYSBfYmZkX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLQotLyogRnVuY3Rpb24gc2hhcmVkIGJ5IHRoZSBDT0ZGIGFuZCBFTEYgU0ggYmFja2VuZHMsIHdoaWNoIGhhdmUgbm8KLSAgIG90aGVyIGNvbW1vbiBoZWFkZXIgZmlsZXMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBib29sZWFuICgqKSAoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSksCi0JICAgUFRSLCBiZmRfdm1hICoqLCBiZmRfdm1hICosIGJmZF92bWEsIGJmZF92bWEsIGJvb2xlYW4gKikpOwotCi0vKiBBbmQgbW9yZSBmb2xsb3dzICovCi0KLXZvaWQgCi1iZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCBQQVJBTVMgKChiZmQgKmFiZmQsICBpbnQgaSkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfbG9nMiBQQVJBTVMgKChiZmRfdm1hIHgpKTsKLQotI2RlZmluZSBCRkRfQ0FDSEVfTUFYX09QRU4gMTAKLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0jZGVmaW5lIGJmZF9jYWNoZV9sb29rdXAoeCkgXAotICAgICgoeCk9PWJmZF9sYXN0X2NhY2hlPyBcCi0gICAgICAoRklMRSopKGJmZF9sYXN0X2NhY2hlLT5pb3N0cmVhbSk6IFwKLSAgICAgICBiZmRfY2FjaGVfbG9va3VwX3dvcmtlcih4KSkKLWJvb2xlYW4gCi1iZmRfY2FjaGVfaW5pdCAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2FjaGVfY2xvc2UgIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1GSUxFKiAKLWJmZF9vcGVuX2ZpbGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLUZJTEUgKgotYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNpZmRlZiBfQkZEX01BS0VfVEFCTEVfYmZkX3JlbG9jX2NvZGVfcmVhbAotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lc1tdID0geyAiQEB1bmluaXRpYWxpemVkQEAiLAotCi0gICJCRkRfUkVMT0NfNjQiLAotICAiQkZEX1JFTE9DXzMyIiwKLSAgIkJGRF9SRUxPQ18yNiIsCi0gICJCRkRfUkVMT0NfMjQiLAotICAiQkZEX1JFTE9DXzE2IiwKLSAgIkJGRF9SRUxPQ18xNCIsCi0gICJCRkRfUkVMT0NfOCIsCi0gICJCRkRfUkVMT0NfNjRfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18yNF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DXzEyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ184X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9HT1RfUENSRUwiLAotICAiQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfOF9HT1RfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMTZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19MTzE2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYiLAotICAiQkZEX1JFTE9DXzhfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ18zMl9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTZfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ184X1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ18xNl9QTFRPRkYiLAotICAiQkZEX1JFTE9DX0xPMTZfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfOF9QTFRPRkYiLAotICAiQkZEX1JFTE9DXzY4S19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfNjhLX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ182OEtfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DXzMyX0JBU0VSRUwiLAotICAiQkZEX1JFTE9DXzE2X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfOF9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19SVkEiLAotICAiQkZEX1JFTE9DXzhfRkZubiIsCi0gICJCRkRfUkVMT0NfMzJfUENSRUxfUzIiLAotICAiQkZEX1JFTE9DXzE2X1BDUkVMX1MyIiwKLSAgIkJGRF9SRUxPQ18yM19QQ1JFTF9TMiIsCi0gICJCRkRfUkVMT0NfSEkyMiIsCi0gICJCRkRfUkVMT0NfTE8xMCIsCi0gICJCRkRfUkVMT0NfR1BSRUwxNiIsCi0gICJCRkRfUkVMT0NfR1BSRUwzMiIsCi0gICJCRkRfUkVMT0NfSTk2MF9DQUxMSiIsCi0gICJCRkRfUkVMT0NfTk9ORSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkMyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkMxMyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR09UMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dPVDEzIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HT1QyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUEMxMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUEMyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV1BMVDMwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19DT1BZIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QiLAotICAiQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19VQTMyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19CQVNFMTMiLAotICAiQkZEX1JFTE9DX1NQQVJDX0JBU0UyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDXzExIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19PTE8xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSEgyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSE0xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTE0yMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUExUNjQiLAotICAiQkZEX1JFTE9DX1NQQVJDX0hJWDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19MT1gxMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSDQ0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19NNDQiLAotICAiQkZEX1JFTE9DX1NQQVJDX0w0NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1JFVjMyIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTYiLAotICAiQkZEX1JFTE9DX0FMUEhBX0dQRElTUCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FMUEhBX0xJVFVTRSIsCi0gICJCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYiLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AiLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9ISU5UIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiIsCi0gICJCRkRfUkVMT0NfTUlQU19KTVAiLAotICAiQkZEX1JFTE9DX01JUFMxNl9KTVAiLAotICAiQkZEX1JFTE9DX01JUFMxNl9HUFJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TIiwKLSAgIkJGRF9SRUxPQ19MTzE2IiwKLSAgIkJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MiLAotICAiQkZEX1JFTE9DX1BDUkVMX0xPMTYiLAotICAiQkZEX1JFTE9DX01JUFNfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1QxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19DQUxMMTYiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0hJMTYiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0xPMTYiLAotICAiQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19TVUIiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX1BBR0UiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX09GU1QiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0RJU1AiLAotCi0gICJCRkRfUkVMT0NfMzg2X0dPVDMyIiwKLSAgIkJGRF9SRUxPQ18zODZfUExUMzIiLAotICAiQkZEX1JFTE9DXzM4Nl9DT1BZIiwKLSAgIkJGRF9SRUxPQ18zODZfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QiLAotICAiQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfMzg2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMzg2X0dPVFBDIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fOCIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzE2IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMzIiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF84IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzE2IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzMyIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX1BKX0NPREVfSEkxNiIsCi0gICJCRkRfUkVMT0NfUEpfQ09ERV9MTzE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX0RJUjE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyIiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX1JFTDE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX1JFTDMyIiwKLSAgIkJGRF9SRUxPQ19QUENfQjI2IiwKLSAgIkJGRF9SRUxPQ19QUENfQkEyNiIsCi0gICJCRkRfUkVMT0NfUFBDX1RPQzE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CQTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOIiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0NPUFkiLAotICAiQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfUFBDX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ19QUENfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8iLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBIiwKLSAgIkJGRF9SRUxPQ19DVE9SIiwKLSAgIkJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIIiwKLSAgIkJGRF9SRUxPQ19BUk1fSU1NRURJQVRFIiwKLSAgIkJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEUiLAotICAiQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fU1dJIiwKLSAgIkJGRF9SRUxPQ19BUk1fTVVMVEkiLAotICAiQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fQURSX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX0xEUl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BUk1fSU5fUE9PTCIsCi0gICJCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04IiwKLSAgIkJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfQUREIiwKLSAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQiLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX0FSTV9HT1QxMiIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVDMyIiwKLSAgIkJGRF9SRUxPQ19BUk1fSlVNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ19BUk1fQ09QWSIsCi0gICJCRkRfUkVMT0NfQVJNX0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ19BUk1fUExUMzIiLAotICAiQkZEX1JFTE9DX0FSTV9SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVFBDIiwKLSAgIkJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiIsCi0gICJCRkRfUkVMT0NfU0hfSU1NNCIsCi0gICJCRkRfUkVMT0NfU0hfSU1NNEJZMiIsCi0gICJCRkRfUkVMT0NfU0hfSU1NNEJZNCIsCi0gICJCRkRfUkVMT0NfU0hfSU1NOCIsCi0gICJCRkRfUkVMT0NfU0hfSU1NOEJZMiIsCi0gICJCRkRfUkVMT0NfU0hfSU1NOEJZNCIsCi0gICJCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQiLAotICAiQkZEX1JFTE9DX1NIX1NXSVRDSDE2IiwKLSAgIkJGRF9SRUxPQ19TSF9TV0lUQ0gzMiIsCi0gICJCRkRfUkVMT0NfU0hfVVNFUyIsCi0gICJCRkRfUkVMT0NfU0hfQ09VTlQiLAotICAiQkZEX1JFTE9DX1NIX0FMSUdOIiwKLSAgIkJGRF9SRUxPQ19TSF9DT0RFIiwKLSAgIkJGRF9SRUxPQ19TSF9EQVRBIiwKLSAgIkJGRF9SRUxPQ19TSF9MQUJFTCIsCi0gICJCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOSIsCi0gICJCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIiLAotICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzIiwKLSAgIkJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19BUkNfQjI2IiwKLSAgIkJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IiLAotICAiQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCIsCi0gICJCRkRfUkVMT0NfRDEwVl8xOCIsCi0gICJCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl82IiwKLSAgIkJGRF9SRUxPQ19EMzBWXzlfUENSRUwiLAotICAiQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzE1IiwKLSAgIkJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IiLAotICAiQkZEX1JFTE9DX0QzMFZfMjEiLAotICAiQkZEX1JFTE9DX0QzMFZfMjFfUENSRUwiLAotICAiQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDMwVl8zMiIsCi0gICJCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTTMyUl8yNCIsCi0gICJCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTyIsCi0gICJCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTyIsCi0gICJCRkRfUkVMT0NfTTMyUl9MTzE2IiwKLSAgIkJGRF9SRUxPQ19NMzJSX1NEQTE2IiwKLSAgIkJGRF9SRUxPQ19WODUwXzlfUENSRUwiLAotICAiQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUwiLAotICAiQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCIsCi0KLSAgIkJGRF9SRUxPQ19NTjEwMzAwXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NTjEwMzAwXzE2X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19USUMzMF9MRFAiLAotICAiQkZEX1JFTE9DX0ZSMzBfNDgiLAotICAiQkZEX1JFTE9DX0ZSMzBfMjAiLAotICAiQkZEX1JFTE9DX0ZSMzBfNl9JTl80IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzhfSU5fOCIsCi0gICJCRkRfUkVMT0NfRlIzMF85X0lOXzgiLAotICAiQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOCIsCi0gICJCRkRfUkVMT0NfRlIzMF85X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0IiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMiIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMiIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzIiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMiIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUlZBIiwKLSAgIkJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCIsCi0gICJCRkRfUkVMT0NfVlRBQkxFX0VOVFJZIiwKLSAiQEBvdmVyZmxvdzogQkZEX1JFTE9DX1VOVVNFREBAIiwKLX07Ci0jZW5kaWYKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlKSk7Ci0KLWJvb2xlYW4gCi1iZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0gICAgYm9vbGVhbiAqKSk7Ci0KLWJvb2xlYW4gCi1iZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJmZF9ieXRlICoKLQotYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzICBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0gICAgYmZkX2J5dGUgKmRhdGEsCi0gICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0gICAgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLWJvb2xlYW4gCi1iZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLSAgICB1bnNpZ25lZCBsb25nIG1hY2gpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9kZWZhdWx0X2NvbXBhdGlibGUKLSBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmEsCi0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiKSk7Ci0KLWJvb2xlYW4gCi1iZmRfZGVmYXVsdF9zY2FuIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvLCBjb25zdCBjaGFyICpzdHJpbmcpKTsKLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICoKLWJmZF9lbGZfZmluZF9zZWN0aW9uICBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpKTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmNvZmYtaW4uaCBiL2JmZC9saWJjb2ZmLWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMWEwMjYuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmNvZmYtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKiBCRkQgQ09GRiBvYmplY3QgZmlsZSBwcml2YXRlIHN0cnVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmNvZmYuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmNvZmYtaW4uaCBvciBjb2ZmY29kZS5oLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIE9iamVjdCBmaWxlIHRkYXRhOyBhY2Nlc3MgbWFjcm9zICovCi0KLSNkZWZpbmUgY29mZl9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuY29mZl9vYmpfZGF0YSkKLSNkZWZpbmUgZXhlY19oZHIoYmZkKQkJKGNvZmZfZGF0YShiZmQpLT5oZHIpCi0jZGVmaW5lIG9ial9wZShiZmQpICAgICAgICAgICAgIChjb2ZmX2RhdGEoYmZkKS0+cGUpCi0jZGVmaW5lIG9ial9zeW1ib2xzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1ib2xzKQotI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bV9maWxlcG9zKQotCi0jZGVmaW5lIG9ial9yZWxvY2Jhc2UoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJlbG9jYmFzZSkKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50cykKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRfY291bnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRfY291bnQpCi0jZGVmaW5lIG9ial9jb252ZXJ0KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5jb252ZXJzaW9uX3RhYmxlKQotI2RlZmluZSBvYmpfY29udl90YWJsZV9zaXplKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5jb252X3RhYmxlX3NpemUpCi0KLSNkZWZpbmUgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmV4dGVybmFsX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3ltcyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3ltcykKLSNkZWZpbmUgb2JqX2NvZmZfc3RyaW5ncyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPnN0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3RyaW5ncykKLSNkZWZpbmUgb2JqX2NvZmZfc3ltX2hhc2hlcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPnN5bV9oYXNoZXMpCi0KLSNkZWZpbmUgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5sb2NhbF90b2Nfc3ltX21hcCkKLQotLyogYFRkYXRhJyBpbmZvcm1hdGlvbiBrZXB0IGZvciBDT0ZGIGZpbGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl90ZGF0YQotewotICBzdHJ1Y3QgICBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7CS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIHVuc2lnbmVkIGludCAqY29udmVyc2lvbl90YWJsZTsKLSAgaW50IGNvbnZfdGFibGVfc2l6ZTsKLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3X3N5bWVudHM7Ci0gIHVuc2lnbmVkIGxvbmcgcmF3X3N5bWVudF9jb3VudDsKLQotICAvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBvbmNlIHdyaXRpbmcgaGFzIGJlZ3VuICovCi0gIGxvbmcgaW50IHJlbG9jYmFzZTsKLQotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbCB0YWJsZQotICAgICB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycgdW5mb3J0dW5hdGVseSB2YXJ5Ci0gICAgIGZyb20gY29mZiBpbXBsZW1lbnRhdGlvbiB0byBpbXBsZW1lbnRhdGlvbi4uLiAgKi8KLSAgdW5zaWduZWQgbG9jYWxfbl9idG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBsb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX3RzaGlmdDsKLSAgdW5zaWduZWQgbG9jYWxfc3ltZXN6OwotICB1bnNpZ25lZCBsb2NhbF9hdXhlc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2xpbmVzejsKLQotICAvKiBUaGUgdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbHMuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLiAgKi8KLSAgUFRSIGV4dGVybmFsX3N5bXM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGV4dGVybmFsX3N5bXMgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zeW1zOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLiAgKi8KLSAgY2hhciAqc3RyaW5nczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgc3RyaW5ncyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N0cmluZ3M7Ci0KLSAgLyogaXMgdGhpcyBhIFBFIGZvcm1hdCBjb2ZmIGZpbGUgKi8KLSAgaW50IHBlOwotICAvKiBVc2VkIGJ5IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiB1c2VkIGJ5IHRoZSBwZSBsaW5rZXIgZm9yIFBvd2VyUEMgKi8KLSAgaW50ICpsb2NhbF90b2Nfc3ltX21hcDsKLQotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotCi0gIC8qIFVzZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogVGhlIHRpbWVzdGFtcCBmcm9tIHRoZSBDT0ZGIGZpbGUgaGVhZGVyLiAgKi8KLSAgbG9uZyB0aW1lc3RhbXA7Ci0KLSAgLyogQ29weSBvZiBzb21lIG9mIHRoZSBmX2ZsYWdzIGJpdHMgaW4gdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsCi0gICAgIHVzZWQgYnkgQVJNIGNvZGUuICAqLwotICBmbGFnd29yZCBmbGFnczsKLQotfSBjb2ZmX2RhdGFfdHlwZTsKLQotLyogVGRhdGEgZm9yIHBlIGltYWdlIGZpbGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgcGVfdGRhdGEKLXsKLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGVfb3B0aGRyOwotICBpbnQgZGxsOwotICBpbnQgaGFzX3JlbG9jX3NlY3Rpb247Ci0gIGJvb2xlYW4gKCppbl9yZWxvY19wKSBQQVJBTVMoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKLSAgZmxhZ3dvcmQgcmVhbF9mbGFnczsKLX0gcGVfZGF0YV90eXBlOwotCi0jZGVmaW5lIHBlX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5wZV9vYmpfZGF0YSkKLQotLyogVGRhdGEgZm9yIFhDT0ZGIGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX3RkYXRhCi17Ci0gIC8qIEJhc2ljIENPRkYgaW5mb3JtYXRpb24uICAqLwotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotCi0gIC8qIFRydWUgaWYgYSBsYXJnZSBhLm91dCBoZWFkZXIgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCi0gIGJvb2xlYW4gZnVsbF9hb3V0aGRyOwotCi0gIC8qIFRPQyB2YWx1ZS4gICovCi0gIGJmZF92bWEgdG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBUT0MuICAqLwotICBpbnQgc250b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIGVudHJ5IHBvaW50LiAgKi8KLSAgaW50IHNuZW50cnk7Ci0KLSAgLyogLnRleHQgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IHRleHRfYWxpZ25fcG93ZXI7Ci0KLSAgLyogLmRhdGEgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IGRhdGFfYWxpZ25fcG93ZXI7Ci0KLSAgLyogbW9kdHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IG1vZHR5cGU7Ci0KLSAgLyogY3B1dHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IGNwdXR5cGU7Ci0KLSAgLyogbWF4ZGF0YSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4ZGF0YTsKLQotICAvKiBtYXhzdGFjayBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4c3RhY2s7Ci0KLSAgLyogVXNlZCBieSB0aGUgWENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kaWNlczsKLSAgdW5zaWduZWQgaW50IGltcG9ydF9maWxlX2lkOwotfTsKLQotI2RlZmluZSB4Y29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLnhjb2ZmX29ial9kYXRhKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAqIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBjb2Zmc3ltYm9sKGFzeW1ib2wpICgoY29mZl9zeW1ib2xfdHlwZSAqKSgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBUaGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgYSBzZWN0aW9uIG1heSBiZSBzZXQgdG8gYSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHJlbG9jcywgc3dhcHBlZCBpbnRvIENPRkYgaW50ZXJuYWwgZm9ybS4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgcmVsb2NzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfcmVsb2NzOwotICAvKiBUaGUgc2VjdGlvbiBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGNvbnRlbnRzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfY29udGVudHM7Ci0gIC8qIEluZm9ybWF0aW9uIGNhY2hlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBjaGFyICpmdW5jdGlvbjsKLSAgaW50IGxpbmVfYmFzZTsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEF2YWlsYWJsZSBmb3IgaW5kaXZpZHVhbCBiYWNrZW5kcy4gICovCi0gIFBUUiB0ZGF0YTsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gWENPRkYgZmlsZXMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFVzZWQgZm9yIFhDT0ZGIGNzZWN0cyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXI7IHBvaW50cyB0byB0aGUgcmVhbAotICAgICBYQ09GRiBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoaXMgY3NlY3QuICAqLwotICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotICAvKiBUaGUgbGluZW5vX2NvdW50IGZpZWxkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24sIGJlY2F1c2Ugd2UgYXJlCi0gICAgIGdvaW5nIHRvIGNsb2JiZXIgaXQgdGhlcmUuICAqLwotICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotICAvKiBUaGUgZmlyc3QgYW5kIG9uZSBwYXN0IHRoZSBsYXN0IHN5bWJvbCBpbmRpY2VzIGZvciBzeW1ib2xzIHVzZWQKLSAgICAgYnkgdGhpcyBjc2VjdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc3ltbmR4OwotICB1bnNpZ25lZCBsb25nIGxhc3Rfc3ltbmR4OwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gdGhlIHhjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBQRSBmaWxlcy4gICovCi0KLXN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgdmlydHVhbCBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSB2aXJ0X3NpemU7Ci0gIC8qIFRoZSBQRSBzZWN0aW9uIGZsYWdzLiAgKi8KLSAgbG9uZyBwZV9mbGFnczsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgcGVpX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgcGVpX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKLQotLyogQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgU2V0IHRvIC0xIGluaXRpYWxseS4gIFNldCB0byAtMiBpZgotICAgICB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogU3ltYm9sIHR5cGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB0eXBlOwotCi0gIC8qIFN5bWJvbCBjbGFzcy4gICovCi0gIHVuc2lnbmVkIGNoYXIgY2xhc3M7Ci0KLSAgLyogTnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzLiAgKi8KLSAgY2hhciBudW1hdXg7Ci0KLSAgLyogQkZEIHRvIHRha2UgYXV4aWxpYXJ5IGVudHJpZXMgZnJvbS4gICovCi0gIGJmZCAqYXV4YmZkOwotCi0gIC8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgYXV4aWxpYXJ5IGVudHJpZXMsIGlmIGFueS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4OwotCi0gIC8qIEZsYWcgd29yZDsgbGVnYWwgdmFsdWVzIGZvbGxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvZmZfbGlua19oYXNoX2ZsYWdzOwotICAvKiBTeW1ib2wgaXMgYSBQRSBzZWN0aW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MICgwMSkKLX07Ci0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogRnVuY3Rpb25zIGluIGNvZmZnZW4uYy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBzZWMgKmNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGludCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdCAqY29mZl9zeW1ib2xfZnJvbSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX21hbmdsZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBhbGVudCAqY29mZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX3NlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKmNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIGNvZmZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwKLQkJCQkgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOwotZXh0ZXJuIHZvaWQgY29mZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgIGFzeW1ib2wgKiosCi0JCQkJCSAgICAgICBiZmRfdm1hIG9mZnNldCwKLQkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKLWV4dGVybiBpbnQgY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiByZWxvYykpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLWV4dGVybiBiZmRfYnl0ZSAqYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYmZkX3ZtYSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosCi0JCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgYXNlY3Rpb24gKikpOwotZXh0ZXJuIHZvaWQgYmZkX3BlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF92bWEgdmFsKSk7Ci0KLS8qIEZ1bmN0aW9ucyBhbmQgdHlwZXMgaW4gY29mZmxpbmsuYy4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBtZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0LCBhbmQgdW5pb24KLSAgIGRlZmluaXRpb25zIGluIHRoZSBsaW5rZXIuICAqLwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHNpbmdsZSBlbGVtZW50IChhbiBlbnVtIHZhbHVlLCBhCi0gICBzdHJ1Y3R1cmUgb3IgdW5pb24gZmllbGQpIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudAotewotICAvKiBOZXh0IGVsZW1lbnQuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICpuZXh0OwotCi0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICAvKiBTeW1ib2wgaW5kZXggZm9yIGNvbXBsZXggdHlwZS4gICovCi0gIGxvbmcgdGFnbmR4OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiBkZWJ1ZyBtZXJnZSBlbnRyaWVzIGZvciBhIGdpdmVuIG5hbWUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlCi17Ci0gIC8qIE5leHQgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICpuZXh0OwotCi0gIC8qIENsYXNzIG9mIHR5cGUuICAqLwotICBpbnQgY2xhc3M7Ci0KLSAgLyogU3ltYm9sIGluZGV4IHdoZXJlIHRoaXMgdHlwZSBpcyBkZWZpbmVkLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIExpc3Qgb2YgZWxlbWVudHMuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICplbGVtZW50czsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIHN0b3JlIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBBIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICp0eXBlczsKLX07Ci0KLS8qIFRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9pbml0ICgmKHRhYmxlKS0+cm9vdCwgX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYykpCi0KLS8qIEZyZWUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9mcmVlICgmKHRhYmxlKS0+cm9vdCkpCi0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2hlbiBkb2luZwotICAgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoZSByZWxvY3MgdG8gYmUgb3V0cHV0LiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIEZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdob3NlIGluZGV4IHdhcyBub3Qga25vd24KLSAgICAgd2hlbiB0aGUgcmVsb2Mgd2FzIGhhbmRsZWQsIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFVzZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSBpbiB0cmF2ZXJzYWwgcm91dGluZS4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotICAvKiBJZiBkb2luZyAidGFzayBsaW5raW5nIiBzZXQgb25seSBkdXJpbmcgdGhlIHRpbWUgd2hlbiB3ZSB3YW50IHRoZQotICAgICBnbG9iYWwgc3ltYm9sIHdyaXRlciB0byBjb252ZXJ0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGRlZmluZWQgZ2xvYmFsCi0gICAgIHN5bWJvbHMgZnJvbSBnbG9iYWwgdG8gc3RhdGljLiAqLwotICBib29sZWFuIGdsb2JhbF90b19zdGF0aWM7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGtlcHQgZm9yCi0gICAgIGVhY2ggb3V0cHV0IHNlY3Rpb24sIGluZGV4ZWQgYnkgdGhlIHRhcmdldF9pbmRleCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgZmlyc3QgYXV4IGVudHJ5IG9mIGxhc3QgLmJmIHN5bWJvbCB3aXRoIGFuIGVtcHR5Ci0gICAgIGVuZG5keCBmaWVsZCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfYmZfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3RfYmZfaW5kZXggYXV4IGVudHJ5LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGxhc3RfYmY7Ci0gIC8qIEhhc2ggdGFibGUgdXNlZCB0byBtZXJnZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUgZGVidWdfbWVyZ2U7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc2VjdGlvbnMgb2Ygc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGFzZWN0aW9uICoqc2VjX3B0cnM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgaW5kaWNlcyBvZiBzeW1ib2xzIG9mIGFueQotICAgICBpbnB1dCBmaWxlLiAgKi8KLSAgbG9uZyAqc3ltX2luZGljZXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBmb3IgYW55IGlucHV0IGZpbGUuICAqLwotICBiZmRfYnl0ZSAqb3V0c3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxpbmUgbnVtYmVycyBmb3IgYW55IGlucHV0Ci0gICAgIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci19OwotCi0vKiBNb3N0IENPRkYgdmFyaWFudHMgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBhbGlnbm1lbnQgb2YgYQotICAgc2VjdGlvbi4gIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gc2V0IGEgc3BlY2lmaWMgYWxpZ25tZW50IGJhc2VkIG9uCi0gICB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X2VudHJ5Ci17Ci0gIC8qIFRoZSBzZWN0aW9uIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoaXMgaXMgZWl0aGVyICh1bnNpZ25lZCBpbnQpIC0xLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlY3Rpb24KLSAgICAgbmFtZSBtdXN0IG1hdGNoIGV4YWN0bHksIG9yIGl0IGlzIHRoZSBudW1iZXIgb2YgbGV0dGVycyB3aGljaAotICAgICBtdXN0IG1hdGNoIGF0IHRoZSBzdGFydCBvZiB0aGUgbmFtZS4gICovCi0gIHVuc2lnbmVkIGludCBjb21wYXJpc29uX2xlbmd0aDsKLQotICAvKiBUaGVzZSBtYWNyb3MgbWF5IGJlIHVzZWQgdG8gZmlsbCBpbiB0aGUgZmlyc3QgdHdvIGZpZWxkcyBpbiBhCi0gICAgIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbi4gICovCi0jZGVmaW5lIENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIKG5hbWUpIChuYW1lKSwgKCh1bnNpZ25lZCBpbnQpIC0xKQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIKG5hbWUpIChuYW1lKSwgKHNpemVvZiAobmFtZSkgLSAxKQotCi0gIC8qIE9ubHkgdXNlIHRoaXMgZW50cnkgaWYgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoaXMKLSAgICAgdGFyZ2V0IGlzIGF0IGxlYXN0IHRoYXQgbXVjaCAoYXMgYSBwb3dlciBvZiB0d28pLiAgSWYgdGhpcyBmaWVsZAotICAgICBpcyBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgaXQgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9hbGlnbm1lbnRfbWluOwotCi0gIC8qIE9ubHkgdXNlIHRoaXMgZW50cnkgaWYgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoaXMKLSAgICAgdGFyZ2V0IGlzIG5vIGdyZWF0ZXIgdGhhbiB0aGlzIChhcyBhIHBvd2VyIG9mIHR3bykuICBJZiB0aGlzCi0gICAgIGZpZWxkIGlzIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBpdCBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWZhdWx0X2FsaWdubWVudF9tYXg7Ci0KLSNkZWZpbmUgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkgKCh1bnNpZ25lZCBpbnQpIC0xKQotCi0gIC8qIFRoZSBkZXNpcmVkIGFsaWdubWVudCBmb3IgdGhpcyBzZWN0aW9uIChhcyBhIHBvd2VyIG9mIHR3bykuICAqLwotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKl9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscwotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotCi0jZGVmaW5lIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0vKiBGdW5jdGlvbnMgaW4geGNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotLyogRnVuY3Rpb25zIGluIGNvZmYtcHBjLmMuICBGSVhNRTogVGhlc2UgYXJlIGNhbGxlZCBiZSBwZS5lbSBpbiB0aGUKLSAgIGxpbmtlciwgYW5kIHNvIHNob3VsZCBzdGFydCB3aXRoIGJmZCBhbmQgYmUgZGVjbGFyZWQgaW4gYmZkLmguICAqLwotCi1leHRlcm4gYm9vbGVhbiBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgdGFrZW4gZnJvbSB0aGUgc291cmNlIC4uICovCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJjb2ZmLmggYi9iZmQvbGliY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU0Y2U5Li4wMDAwMDAwCi0tLSBhL2JmZC9saWJjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NTMgKzAsMCBAQAotLyogQkZEIENPRkYgb2JqZWN0IGZpbGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJjb2ZmLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJjb2ZmLWluLmggb3IgY29mZmNvZGUuaC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiBPYmplY3QgZmlsZSB0ZGF0YTsgYWNjZXNzIG1hY3JvcyAqLwotCi0jZGVmaW5lIGNvZmZfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmNvZmZfb2JqX2RhdGEpCi0jZGVmaW5lIGV4ZWNfaGRyKGJmZCkJCShjb2ZmX2RhdGEoYmZkKS0+aGRyKQotI2RlZmluZSBvYmpfcGUoYmZkKSAgICAgICAgICAgICAoY29mZl9kYXRhKGJmZCktPnBlKQotI2RlZmluZSBvYmpfc3ltYm9scyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltYm9scykKLSNkZWZpbmUJb2JqX3N5bV9maWxlcG9zKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1fZmlsZXBvcykKLQotI2RlZmluZSBvYmpfcmVsb2NiYXNlKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yZWxvY2Jhc2UpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50cyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudHMpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50X2NvdW50KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50X2NvdW50KQotI2RlZmluZSBvYmpfY29udmVydChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+Y29udmVyc2lvbl90YWJsZSkKLSNkZWZpbmUgb2JqX2NvbnZfdGFibGVfc2l6ZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+Y29udl90YWJsZV9zaXplKQotCi0jZGVmaW5lIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5leHRlcm5hbF9zeW1zKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N5bXMoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX3N0cmluZ3MoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5zdHJpbmdzKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N0cmluZ3MoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX3N5bV9oYXNoZXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5zeW1faGFzaGVzKQotCi0jZGVmaW5lIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+bG9jYWxfdG9jX3N5bV9tYXApCi0KLS8qIGBUZGF0YScgaW5mb3JtYXRpb24ga2VwdCBmb3IgQ09GRiBmaWxlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfdGRhdGEKLXsKLSAgc3RydWN0ICAgY29mZl9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLwotICB1bnNpZ25lZCBpbnQgKmNvbnZlcnNpb25fdGFibGU7Ci0gIGludCBjb252X3RhYmxlX3NpemU7Ci0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotCi0gIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd19zeW1lbnRzOwotICB1bnNpZ25lZCBsb25nIHJhd19zeW1lbnRfY291bnQ7Ci0KLSAgLyogVGhlc2UgYXJlIG9ubHkgdmFsaWQgb25jZSB3cml0aW5nIGhhcyBiZWd1biAqLwotICBsb25nIGludCByZWxvY2Jhc2U7Ci0KLSAgLyogVGhlc2UgbWVtYmVycyBjb21tdW5pY2F0ZSBpbXBvcnRhbnQgY29uc3RhbnRzIGFib3V0IHRoZSBzeW1ib2wgdGFibGUKLSAgICAgdG8gR0RCJ3Mgc3ltYm9sLXJlYWRpbmcgY29kZS4gIFRoZXNlIGBjb25zdGFudHMnIHVuZm9ydHVuYXRlbHkgdmFyeQotICAgICBmcm9tIGNvZmYgaW1wbGVtZW50YXRpb24gdG8gaW1wbGVtZW50YXRpb24uLi4gICovCi0gIHVuc2lnbmVkIGxvY2FsX25fYnRtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX2J0c2hmdDsKLSAgdW5zaWduZWQgbG9jYWxfbl90bWFzazsKLSAgdW5zaWduZWQgbG9jYWxfbl90c2hpZnQ7Ci0gIHVuc2lnbmVkIGxvY2FsX3N5bWVzejsKLSAgdW5zaWduZWQgbG9jYWxfYXV4ZXN6OwotICB1bnNpZ25lZCBsb2NhbF9saW5lc3o7Ci0KLSAgLyogVGhlIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2xzLiAgTWF5IGJlIE5VTEwuICBSZWFkIGJ5Ci0gICAgIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scy4gICovCi0gIFBUUiBleHRlcm5hbF9zeW1zOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBleHRlcm5hbF9zeW1zIG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfc3ltczsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlLiAgTWF5IGJlIE5VTEwuICBSZWFkIGJ5Ci0gICAgIF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZS4gICovCi0gIGNoYXIgKnN0cmluZ3M7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIHN0cmluZ3MgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zdHJpbmdzOwotCi0gIC8qIGlzIHRoaXMgYSBQRSBmb3JtYXQgY29mZiBmaWxlICovCi0gIGludCBwZTsKLSAgLyogVXNlZCBieSB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0KLSAgLyogdXNlZCBieSB0aGUgcGUgbGlua2VyIGZvciBQb3dlclBDICovCi0gIGludCAqbG9jYWxfdG9jX3N5bV9tYXA7Ci0KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLQotICAvKiBVc2VkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBQVFIgbGluZV9pbmZvOwotCi0gIC8qIFRoZSB0aW1lc3RhbXAgZnJvbSB0aGUgQ09GRiBmaWxlIGhlYWRlci4gICovCi0gIGxvbmcgdGltZXN0YW1wOwotCi0gIC8qIENvcHkgb2Ygc29tZSBvZiB0aGUgZl9mbGFncyBiaXRzIGluIHRoZSBDT0ZGIGZpbGVoZHIgc3RydWN0dXJlLAotICAgICB1c2VkIGJ5IEFSTSBjb2RlLiAgKi8KLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLX0gY29mZl9kYXRhX3R5cGU7Ci0KLS8qIFRkYXRhIGZvciBwZSBpbWFnZSBmaWxlcy4gKi8KLXR5cGVkZWYgc3RydWN0IHBlX3RkYXRhCi17Ci0gIGNvZmZfZGF0YV90eXBlIGNvZmY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlX29wdGhkcjsKLSAgaW50IGRsbDsKLSAgaW50IGhhc19yZWxvY19zZWN0aW9uOwotICBib29sZWFuICgqaW5fcmVsb2NfcCkgUEFSQU1TKChiZmQgKiwgcmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0gIGZsYWd3b3JkIHJlYWxfZmxhZ3M7Ci19IHBlX2RhdGFfdHlwZTsKLQotI2RlZmluZSBwZV9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEucGVfb2JqX2RhdGEpCi0KLS8qIFRkYXRhIGZvciBYQ09GRiBmaWxlcy4gICovCi0KLXN0cnVjdCB4Y29mZl90ZGF0YQotewotICAvKiBCYXNpYyBDT0ZGIGluZm9ybWF0aW9uLiAgKi8KLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLQotICAvKiBUcnVlIGlmIGEgbGFyZ2UgYS5vdXQgaGVhZGVyIHNob3VsZCBiZSBnZW5lcmF0ZWQuICAqLwotICBib29sZWFuIGZ1bGxfYW91dGhkcjsKLQotICAvKiBUT0MgdmFsdWUuICAqLwotICBiZmRfdm1hIHRvYzsKLQotICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgVE9DLiAgKi8KLSAgaW50IHNudG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBlbnRyeSBwb2ludC4gICovCi0gIGludCBzbmVudHJ5OwotCi0gIC8qIC50ZXh0IGFsaWdubWVudCBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGludCB0ZXh0X2FsaWduX3Bvd2VyOwotCi0gIC8qIC5kYXRhIGFsaWdubWVudCBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGludCBkYXRhX2FsaWduX3Bvd2VyOwotCi0gIC8qIG1vZHR5cGUgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBzaG9ydCBtb2R0eXBlOwotCi0gIC8qIGNwdXR5cGUgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBzaG9ydCBjcHV0eXBlOwotCi0gIC8qIG1heGRhdGEgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG1heGRhdGE7Ci0KLSAgLyogbWF4c3RhY2sgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG1heHN0YWNrOwotCi0gIC8qIFVzZWQgYnkgdGhlIFhDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgYXNlY3Rpb24gKipjc2VjdHM7Ci0gIHVuc2lnbmVkIGxvbmcgKmRlYnVnX2luZGljZXM7Ci0gIHVuc2lnbmVkIGludCBpbXBvcnRfZmlsZV9pZDsKLX07Ci0KLSNkZWZpbmUgeGNvZmZfZGF0YShhYmZkKSAoKGFiZmQpLT50ZGF0YS54Y29mZl9vYmpfZGF0YSkKLQotLyogV2UgdGFrZSB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gKiBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sLiAgKi8KLSNkZWZpbmUgY29mZnN5bWJvbChhc3ltYm9sKSAoKGNvZmZfc3ltYm9sX3R5cGUgKikoJigoYXN5bWJvbCktPnRoZV9iZmQpKSkKLQotLyogVGhlIHVzZWRfYnlfYmZkIGZpZWxkIG9mIGEgc2VjdGlvbiBtYXkgYmUgc2V0IHRvIGEgcG9pbnRlciB0byB0aGlzCi0gICBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFRoZSByZWxvY3MsIHN3YXBwZWQgaW50byBDT0ZGIGludGVybmFsIGZvcm0uICBUaGlzIG1heSBiZSBOVUxMLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIHJlbG9jcyBlbnRyeSBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3JlbG9jczsKLSAgLyogVGhlIHNlY3Rpb24gY29udGVudHMuICBUaGlzIG1heSBiZSBOVUxMLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBjb250ZW50cyBlbnRyeSBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX2NvbnRlbnRzOwotICAvKiBJbmZvcm1hdGlvbiBjYWNoZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIGJmZF92bWEgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgY29uc3QgY2hhciAqZnVuY3Rpb247Ci0gIGludCBsaW5lX2Jhc2U7Ci0gIC8qIEEgcG9pbnRlciB1c2VkIGZvciAuc3RhYiBsaW5raW5nIG9wdGltaXphdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotICAvKiBBdmFpbGFibGUgZm9yIGluZGl2aWR1YWwgYmFja2VuZHMuICAqLwotICBQVFIgdGRhdGE7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIChzZWMpLT51c2VkX2J5X2JmZCkKLQotLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFhDT0ZGIGZpbGVzLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotCi1zdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBVc2VkIGZvciBYQ09GRiBjc2VjdHMgY3JlYXRlZCBieSB0aGUgbGlua2VyOyBwb2ludHMgdG8gdGhlIHJlYWwKLSAgICAgWENPRkYgc2VjdGlvbiB3aGljaCBjb250YWlucyB0aGlzIGNzZWN0LiAgKi8KLSAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLSAgLyogVGhlIGxpbmVub19jb3VudCBmaWVsZCBmb3IgdGhlIGVuY2xvc2luZyBzZWN0aW9uLCBiZWNhdXNlIHdlIGFyZQotICAgICBnb2luZyB0byBjbG9iYmVyIGl0IHRoZXJlLiAgKi8KLSAgdW5zaWduZWQgaW50IGxpbmVub19jb3VudDsKLSAgLyogVGhlIGZpcnN0IGFuZCBvbmUgcGFzdCB0aGUgbGFzdCBzeW1ib2wgaW5kaWNlcyBmb3Igc3ltYm9scyB1c2VkCi0gICAgIGJ5IHRoaXMgY3NlY3QuICAqLwotICB1bnNpZ25lZCBsb25nIGZpcnN0X3N5bW5keDsKLSAgdW5zaWduZWQgbG9uZyBsYXN0X3N5bW5keDsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIHRoZSB4Y29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHhjb2ZmX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gUEUgZmlsZXMuICAqLwotCi1zdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgdmlydF9zaXplOwotICAvKiBUaGUgUEUgc2VjdGlvbiBmbGFncy4gICovCi0gIGxvbmcgcGVfZmxhZ3M7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIHBlaV9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHBlaV9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIFN5bWJvbCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdHlwZTsKLQotICAvKiBTeW1ib2wgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGNsYXNzOwotCi0gIC8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcy4gICovCi0gIGNoYXIgbnVtYXV4OwotCi0gIC8qIEJGRCB0byB0YWtlIGF1eGlsaWFyeSBlbnRyaWVzIGZyb20uICAqLwotICBiZmQgKmF1eGJmZDsKLQotICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGF1eGlsaWFyeSBlbnRyaWVzLCBpZiBhbnkuICAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKLQotICAvKiBGbGFnIHdvcmQ7IGxlZ2FsIHZhbHVlcyBmb2xsb3cuICAqLwotICB1bnNpZ25lZCBzaG9ydCBjb2ZmX2xpbmtfaGFzaF9mbGFnczsKLSAgLyogU3ltYm9sIGlzIGEgUEUgc2VjdGlvbiBzeW1ib2wuICAqLwotI2RlZmluZSBDT0ZGX0xJTktfSEFTSF9QRV9TRUNUSU9OX1NZTUJPTCAoMDEpCi19OwotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3Qgc2VjICpjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggUEFSQU1TICgoYmZkICosIGludCkpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBpbnQgY29mZl9jb3VudF9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNvZmZfc3ltYm9sX2Zyb20gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9yZW51bWJlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9tYW5nbGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYWxlbnQgKmNvZmZfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9zZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosCi0JCQkJICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLWV4dGVybiB2b2lkIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCSAgc3ltYm9sX2luZm8gKnJldCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBhc3ltYm9sICoqLAotCQkJCQkgICAgICAgYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyKSk7Ci1leHRlcm4gaW50IGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gcmVsb2MpKTsKLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1leHRlcm4gYmZkX2J5dGUgKmJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGJmZF92bWEgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgUEFSQU1TICgoYXJlbGVudCAqLAotCQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgIGFzZWN0aW9uICopKTsKLWV4dGVybiB2b2lkIGJmZF9wZXJmb3JtX3NsaXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgc2xpcCwKLQkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfdm1hIHZhbCkpOwotCi0vKiBGdW5jdGlvbnMgYW5kIHR5cGVzIGluIGNvZmZsaW5rLmMuICAqLwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gbWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCwgYW5kIHVuaW9uCi0gICBkZWZpbml0aW9ucyBpbiB0aGUgbGlua2VyLiAgKi8KLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgZWxlbWVudCAoYW4gZW51bSB2YWx1ZSwgYQotICAgc3RydWN0dXJlIG9yIHVuaW9uIGZpZWxkKSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQKLXsKLSAgLyogTmV4dCBlbGVtZW50LiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbmV4dDsKLQotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUeXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGZvciBjb21wbGV4IHR5cGUuICAqLwotICBsb25nIHRhZ25keDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgZGVidWcgbWVyZ2UgZW50cmllcyBmb3IgYSBnaXZlbiBuYW1lLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZQotewotICAvKiBOZXh0IHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbmV4dDsKLQotICAvKiBDbGFzcyBvZiB0eXBlLiAgKi8KLSAgaW50IGNsYXNzOwotCi0gIC8qIFN5bWJvbCBpbmRleCB3aGVyZSB0aGlzIHR5cGUgaXMgZGVmaW5lZC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBMaXN0IG9mIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqZWxlbWVudHM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBzdG9yZSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogQSBsaXN0IG9mIHR5cGVzIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqdHlwZXM7Ci19OwotCi0vKiBUaGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJih0YWJsZSktPnJvb3QsIF9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpKQotCi0vKiBGcmVlIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0YWJsZSktPnJvb3QpKQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdoZW4gZG9pbmcKLSAgIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaGVzOwotfTsKLQotLyogSW5mb3JtYXRpb24gdGhhdCB3ZSBwYXNzIGFyb3VuZCB3aGlsZSBkb2luZyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBVc2VkIHRvIGluZGljYXRlIGZhaWx1cmUgaW4gdHJhdmVyc2FsIHJvdXRpbmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLSAgLyogSWYgZG9pbmcgInRhc2sgbGlua2luZyIgc2V0IG9ubHkgZHVyaW5nIHRoZSB0aW1lIHdoZW4gd2Ugd2FudCB0aGUKLSAgICAgZ2xvYmFsIHN5bWJvbCB3cml0ZXIgdG8gY29udmVydCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBkZWZpbmVkIGdsb2JhbAotICAgICBzeW1ib2xzIGZyb20gZ2xvYmFsIHRvIHN0YXRpYy4gKi8KLSAgYm9vbGVhbiBnbG9iYWxfdG9fc3RhdGljOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvcgotICAgICBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZSB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqc2VjdGlvbl9pbmZvOwotICAvKiBTeW1ib2wgaW5kZXggb2YgbGFzdCBDX0ZJTEUgc3ltYm9sICgtMSBpZiBub25lKS4gICovCi0gIGxvbmcgbGFzdF9maWxlX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0IENfRklMRSBzeW1ib2wuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGxhc3RfZmlsZTsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGZpcnN0IGF1eCBlbnRyeSBvZiBsYXN0IC5iZiBzeW1ib2wgd2l0aCBhbiBlbXB0eQotICAgICBlbmRuZHggZmllbGQgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2JmX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0X2JmX2luZGV4IGF1eCBlbnRyeS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCBsYXN0X2JmOwotICAvKiBIYXNoIHRhYmxlIHVzZWQgdG8gbWVyZ2UgZGVidWcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlIGRlYnVnX21lcmdlOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHNlY3Rpb25zIG9mIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBhc2VjdGlvbiAqKnNlY19wdHJzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotfTsKLQotLyogTW9zdCBDT0ZGIHZhcmlhbnRzIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgYWxpZ25tZW50IG9mIGEKLSAgIHNlY3Rpb24uICBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIHNldCBhIHNwZWNpZmljIGFsaWdubWVudCBiYXNlZCBvbgotICAgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeQotewotICAvKiBUaGUgc2VjdGlvbiBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGlzIGlzIGVpdGhlciAodW5zaWduZWQgaW50KSAtMSwgaW5kaWNhdGluZyB0aGF0IHRoZSBzZWN0aW9uCi0gICAgIG5hbWUgbXVzdCBtYXRjaCBleGFjdGx5LCBvciBpdCBpcyB0aGUgbnVtYmVyIG9mIGxldHRlcnMgd2hpY2gKLSAgICAgbXVzdCBtYXRjaCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5hbWUuICAqLwotICB1bnNpZ25lZCBpbnQgY29tcGFyaXNvbl9sZW5ndGg7Ci0KLSAgLyogVGhlc2UgbWFjcm9zIG1heSBiZSB1c2VkIHRvIGZpbGwgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMgaW4gYQotICAgICBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uICAqLwotI2RlZmluZSBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSChuYW1lKSAobmFtZSksICgodW5zaWduZWQgaW50KSAtMSkKLSNkZWZpbmUgQ09GRl9TRUNUSU9OX05BTUVfUEFSVElBTF9NQVRDSChuYW1lKSAobmFtZSksIChzaXplb2YgKG5hbWUpIC0gMSkKLQotICAvKiBPbmx5IHVzZSB0aGlzIGVudHJ5IGlmIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGlzCi0gICAgIHRhcmdldCBpcyBhdCBsZWFzdCB0aGF0IG11Y2ggKGFzIGEgcG93ZXIgb2YgdHdvKS4gIElmIHRoaXMgZmllbGQKLSAgICAgaXMgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIGl0IHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfYWxpZ25tZW50X21pbjsKLQotICAvKiBPbmx5IHVzZSB0aGlzIGVudHJ5IGlmIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGlzCi0gICAgIHRhcmdldCBpcyBubyBncmVhdGVyIHRoYW4gdGhpcyAoYXMgYSBwb3dlciBvZiB0d28pLiAgSWYgdGhpcwotICAgICBmaWVsZCBpcyBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgaXQgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9hbGlnbm1lbnRfbWF4OwotCi0jZGVmaW5lIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZICgodW5zaWduZWQgaW50KSAtMSkKLQotICAvKiBUaGUgZGVzaXJlZCBhbGlnbm1lbnQgZm9yIHRoaXMgc2VjdGlvbiAoYXMgYSBwb3dlciBvZiB0d28pLiAgKi8KLSAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IGludGVybmFsX3JlbG9jICpfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJvb2xlYW4sIGJmZF9ieXRlICosIGJvb2xlYW4sCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLQotI2RlZmluZSBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotLyogRnVuY3Rpb25zIGluIHhjb2ZmbGluay5jLiAgKi8KLQotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmLXBwYy5jLiAgRklYTUU6IFRoZXNlIGFyZSBjYWxsZWQgYmUgcGUuZW0gaW4gdGhlCi0gICBsaW5rZXIsIGFuZCBzbyBzaG91bGQgc3RhcnQgd2l0aCBiZmQgYW5kIGJlIGRlY2xhcmVkIGluIGJmZC5oLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEFuZCBtb3JlIHRha2VuIGZyb20gdGhlIHNvdXJjZSAuLiAqLwotCi10eXBlZGVmIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QKLXsKLQotICAgICAgICAvKiBSZW1lbWJlcnMgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIGZpbGUgZm9yCi0gICAgICAgICAgdGhpcyBzeW1ib2wuIEdlbmVyYXRlZCBieSBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMuICovCi11bnNpZ25lZCBpbnQgb2Zmc2V0OwotCi0gICAgICAgIC8qIFNob3VsZCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4gIFVzZWQgZm9yCi0gICAgICAgICAgWENPRkYgQ19CU1RBVCBzeW1ib2xzLiAgU2V0IGJ5IGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKi8KLXVuc2lnbmVkIGludCBmaXhfdmFsdWUgOiAxOwotCi0gICAgICAgIC8qIFNob3VsZCB0aGUgdGFnIGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqLwotdW5zaWduZWQgaW50IGZpeF90YWcgOiAxOwotCi0gICAgICAgIC8qIFNob3VsZCB0aGUgZW5kaWR4IGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqLwotdW5zaWduZWQgaW50IGZpeF9lbmQgOiAxOwotCi0gICAgICAgIC8qIFNob3VsZCB0aGUgeF9jc2VjdC54X3NjbmxlbiBmaWVsZCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfc2NubGVuIDogMTsKLQotICAgICAgICAvKiBGaXggdXAgYW4gWENPRkYgQ19CSU5DTC9DX0VJTkNMIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUKLSAgICAgICAgICBpbmRleCBpbnRvIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzLiAgU2V0IGJ5Ci0gICAgICAgICAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqLwotdW5zaWduZWQgaW50IGZpeF9saW5lIDogMTsKLQotICAgICAgICAvKiBUaGUgY29udGFpbmVyIGZvciB0aGUgc3ltYm9sIHN0cnVjdHVyZSBhcyByZWFkIGFuZCB0cmFuc2xhdGVkCi0gICAgICAgICAgIGZyb20gdGhlIGZpbGUuICovCi0KLXVuaW9uIHsKLSAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSB9IHU7Ci19IGNvbWJpbmVkX2VudHJ5X3R5cGU7Ci0KLQotIC8qIEVhY2ggY2Fub25pY2FsIGFzeW1ib2wgcmVhbGx5IGxvb2tzIGxpa2UgdGhpczogKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl9zeW1ib2xfc3RydWN0Ci17Ci0gICAgLyogVGhlIGFjdHVhbCBzeW1ib2wgd2hpY2ggdGhlIHJlc3Qgb2YgQkZEIHdvcmtzIHdpdGggKi8KLWFzeW1ib2wgc3ltYm9sOwotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICovCi1jb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0KLSAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIGxpbmVudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICovCi1zdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsaW5lbm87Ci0KLSAgICAvKiBIYXZlIHRoZSBsaW5lIG51bWJlcnMgYmVlbiByZWxvY2F0ZWQgeWV0ID8gKi8KLWJvb2xlYW4gZG9uZV9saW5lbm87Ci19IGNvZmZfc3ltYm9sX3R5cGU7Ci0gLyogQ09GRiBzeW1ib2wgY2xhc3NpZmljYXRpb25zLiAgKi8KLQotZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbgotewotICAgLyogR2xvYmFsIHN5bWJvbC4gICovCi0gIENPRkZfU1lNQk9MX0dMT0JBTCwKLSAgIC8qIENvbW1vbiBzeW1ib2wuICAqLwotICBDT0ZGX1NZTUJPTF9DT01NT04sCi0gICAvKiBVbmRlZmluZWQgc3ltYm9sLiAgKi8KLSAgQ09GRl9TWU1CT0xfVU5ERUZJTkVELAotICAgLyogTG9jYWwgc3ltYm9sLiAgKi8KLSAgQ09GRl9TWU1CT0xfTE9DQUwsCi0gICAvKiBQRSBzZWN0aW9uIHN5bWJvbC4gICovCi0gIENPRkZfU1lNQk9MX1BFX1NFQ1RJT04KLX07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfaW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCi0gICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgaW50ICAgICAgICAgICAgIGNsYXNzLAotICAgICAgIGludCAgICAgICAgICAgICBpbmRhdXgsCi0gICAgICAgaW50ICAgICAgICAgICAgIG51bWF1eCwKLSAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLQotICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc3ltX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCAsCi0gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLSAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLQotICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgICAgICAgICBleHQsCi0gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgaW50ICAgICB0eXBlLAotICAgICAgIGludCAgICAgY2xhc3MsCi0gICAgICAgaW50ICAgICBpbmRhdXgsCi0gICAgICAgaW50ICAgICBudW1hdXgsCi0gICAgICAgUFRSICAgICBleHQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIFBBUkFNUyAoKAotICAgICAgYmZkICAgICAgKmFiZmQsCi0gICAgICBQVFIgICAgICBpbiwKLSAgICAgIFBUUiAgICAgIGV4dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIFBUUiAgICAgZXh0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBzcmMsCi0gICAgICAgUFRSICAgICBkc3QpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBvdXQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBvdXQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50IF9iZmRfZmlsaHN6OwotIHVuc2lnbmVkIGludCBfYmZkX2FvdXRzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9zY25oc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfc3ltZXN6OwotIHVuc2lnbmVkIGludCBfYmZkX2F1eGVzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9yZWxzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9saW5lc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfZmlsbm1sZW47Ci0gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19maWxlbmFtZXM7Ci0gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzOwotIHVuc2lnbmVkIGludCBfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcjsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBleHQsCi0gICAgICAgUFRSICAgICBpbikpOwotIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBleHQsCi0gICAgICAgUFRSICAgICBpbikpOwotIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7Ci0gUFRSICgqX2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfYW91dGhkcikpOwotIGZsYWd3b3JkICgqX2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyLAotICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLSB2b2lkICgqX2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgYXNlY3Rpb24gKnNlYywKLSAgICAgICBQVFIgICAgIGludGVybmFsX3NjbmhkcikpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAotICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4KSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9wcmludF9hdXgpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBGSUxFICpmaWxlLAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCwKLSAgICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4KSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0gICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotICAgICAgIGFyZWxlbnQgKnJlbG9jLAotICAgICAgIGJmZF9ieXRlICpkYXRhLAotICAgICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciwKLSAgICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIpKTsKLSBpbnQgKCpfYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSkgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICAgIGFyZWxlbnQgKnIsCi0gICAgICAgdW5zaWduZWQgaW50IHNocmluaywKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7Ci0gZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiAoKl9iZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucykgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmlucHV0X2JmZCwKLSAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3MsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltcywKLSAgICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zKSk7Ci0gcmVsb2NfaG93dG9fdHlwZSAqKCpfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLAotICAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0sCi0gICAgICAgYmZkX3ZtYSAqYWRkZW5kcCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoCi0gICAgICAgYmZkICpvYmZkLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotICAgICAgIGJmZCAqaWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2MsCi0gICAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKCgKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICBmbGFnd29yZCBmbGFncywgCi0gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICAgYmZkX3ZtYSB2YWx1ZSwKLSAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsCi0gICAgICAgYm9vbGVhbiBjb3B5LAotICAgICAgIGJvb2xlYW4gY29sbGVjdCwgCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocCkpOwotCi0gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqIGFiZmQsCi0gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqIGFiZmQsCi0gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0KLX0gYmZkX2NvZmZfYmFja2VuZF9kYXRhOwotCi0jZGVmaW5lIGNvZmZfYmFja2VuZF9pbmZvKGFiZmQpICgoYmZkX2NvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X2luKGEsZSx0LGMsaW5kLG51bSxpKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfaW4pIChhLGUsdCxjLGluZCxudW0saSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1faW4oYSxlLGkpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX3N5bV9pbikgKGEsZSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19pbihhLGUsaSkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvICggYSktPl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgKGEsZSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX291dChhYmZkLCBpLCBvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQoYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X291dChhLGksdCxjLGluZCxudW0sbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgKGEsaSx0LGMsaW5kLG51bSxvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2ZpbGhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbGhzeikKLSNkZWZpbmUgYmZkX2NvZmZfYW91dHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYW91dHN6KQotI2RlZmluZSBiZmRfY29mZl9zY25oc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zY25oc3opCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bWVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N5bWVzeikKLSNkZWZpbmUgYmZkX2NvZmZfYXV4ZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYXV4ZXN6KQotI2RlZmluZSBiZmRfY29mZl9yZWxzeihhYmZkKSAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9yZWxzeikKLSNkZWZpbmUgYmZkX2NvZmZfbGluZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfbGluZXN6KQotI2RlZmluZSBiZmRfY29mZl9maWxubWxlbihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbG5tbGVuKQotI2RlZmluZSBiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyhhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMpCi0jZGVmaW5lIGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyhhYmZkKSBcCi0gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpCi0jZGVmaW5lIGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIoYWJmZCkgXAotICAgICAgICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcikKLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4oYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2soYWJmZCwgZmlsZWhkcikgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayhhYmZkLCBmaWxlaGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLSNkZWZpbmUgYmZkX2NvZmZfbWtvYmplY3RfaG9vayhhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ta29iamVjdF9ob29rKSAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayhhYmZkLCBzY25oZHIsIG5hbWUsIHNlY3Rpb24pXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKVwKLSAgICAgICAgIChhYmZkLCBzY25oZHIsIG5hbWUsIHNlY3Rpb24pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayhhYmZkLCBzZWMsIHNjbmhkcilcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgKGFiZmQsIHNlYywgc2NuaGRyKSkKLQotI2RlZmluZSBiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUoYWJmZClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyhhYmZkLCBzeW0pXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIChhYmZkLCBzeW0pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3ByaW50X2F1eChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wcmludF9hdXgpXAotICAgICAgICAgKGFiZmQsIGZpbGUsIGJhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cilcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcylcCi0gICAgICAgICAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZShhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpXAotICAgICAgICAgKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKGFiZmQsIHN5bSlcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKVwKLSAgICAgICAgIChhYmZkLCBzeW0pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyhhYmZkKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpXAotICAgICAgICAgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsob2JmZCwgaW5mbylcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKG9iZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaylcCi0gICAgICAgICAob2JmZCwgaW5mbykpCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24ob2JmZCxpbmZvLGliZmQsbyxjb24scmVsLGlzeW1zLHNlY3MpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChpYmZkKS0+X2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pXAotICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIG8sIGNvbiwgcmVsLCBpc3ltcywgc2VjcykpCi0jZGVmaW5lIGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKVwKLSAgICAgICAgIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKSkKLSNkZWZpbmUgYmZkX2NvZmZfYWRqdXN0X3N5bW5keChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KVwKLSAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKSkKLSNkZWZpbmUgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbChpbmZvLGFiZmQsbmFtZSxmbGFncyxzZWN0aW9uLHZhbHVlLHN0cmluZyxjcCxjb2xsLGhhc2hwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKVwKLSAgICAgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY3AsIGNvbGwsIGhhc2hwKSkKLQotI2RlZmluZSBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oYSxwKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSAoYSxwKSkKLSNkZWZpbmUgYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KGEscCkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgKGEscCkpCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJlY29mZi5oIGIvYmZkL2xpYmVjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjE4MDUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmVjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyogQkZEIEVDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2lmbmRlZiBFQ09GRl9ICi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIGJhY2tlbmQgaW5mb3JtYXRpb24ga2VwdCBmb3IgRUNPRkYgZmlsZXMuICBUaGlzCi0gICBzdHJ1Y3R1cmUgaXMgY29uc3RhbnQgZm9yIGEgcGFydGljdWxhciBiYWNrZW5kLiAgVGhlIGZpcnN0IGVsZW1lbnQKLSAgIGlzIHRoZSBDT0ZGIGJhY2tlbmQgZGF0YSBzdHJ1Y3R1cmUsIHNvIHRoYXQgRUNPRkYgdGFyZ2V0cyBjYW4gdXNlCi0gICB0aGUgZ2VuZXJpYyBDT0ZGIGNvZGUuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2JhY2tlbmQoYWJmZCkgXAotICAoKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKikgKGFiZmQpLT54dmVjLT5iYWNrZW5kX2RhdGEpCi0KLXN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEKLXsKLSAgLyogQ09GRiBiYWNrZW5kIGluZm9ybWF0aW9uLiAgVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBmaWVsZC4gICovCi0gIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBjb2ZmOwotICAvKiBTdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLwotICBjb25zdCBjaGFyICphcm1hcF9zdGFydDsKLSAgLyogVGhlIHBhZ2UgYm91bmRhcnkgdXNlZCB0byBhbGlnbiBzZWN0aW9ucyBpbiBhIGRlbWFuZC1wYWdlZAotICAgICBleGVjdXRhYmxlIGZpbGUuICBFLmcuLCAweDEwMDAuICAqLwotICBiZmRfdm1hIHJvdW5kOwotICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBNSVBTLiAgKi8KLSAgYm9vbGVhbiByZGF0YV9pbl90ZXh0OwotICAvKiBCaXRzaXplIG9mIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgY29uc3RydWN0b3JfYml0c2l6ZTsKLSAgLyogUmVsb2MgdG8gdXNlIGZvciBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqY29uc3RydWN0b3JfcmVsb2M7Ci0gIC8qIEhvdyB0byBzd2FwIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwIGRlYnVnX3N3YXA7Ci0gIC8qIEV4dGVybmFsIHJlbG9jIHNpemUuICAqLwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIC8qIFJlbG9jIHN3YXBwaW5nIGZ1bmN0aW9ucy4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotICB2b2lkICgqc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgUFRSKSk7Ci0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICB2b2lkICgqYWRqdXN0X3JlbG9jX2luKSBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJICAgYXJlbGVudCAqKSk7Ci0gIHZvaWQgKCphZGp1c3RfcmVsb2Nfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgYXJlbGVudCAqLAotCQkJCSAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLwotICBib29sZWFuICgqcmVsb2NhdGVfc2VjdGlvbikgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgICBiZmQgKmlucHV0X2JmZCwgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgIGJmZF9ieXRlICpjb250ZW50cywKLQkJCQkgICAgICAgUFRSIGV4dGVybmFsX3JlbG9jcykpOwotICAvKiBEbyBmaW5hbCBhZGp1c3RtZW50cyB0byBmaWxlaGRyIGFuZCBhb3V0aGRyLiAgKi8KLSAgYm9vbGVhbiAoKmFkanVzdF9oZWFkZXJzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKiwKLQkJCQkgICAgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopKTsKLSAgLyogUmVhZCBhbiBlbGVtZW50IGZyb20gYW4gYXJjaGl2ZSBhdCBhIGdpdmVuIGZpbGUgcG9zaXRpb24uICBUaGlzCi0gICAgIGlzIG5lZWRlZCBiZWNhdXNlIE9TRi8xIDMuMiB1c2VzIGEgd2VpcmQgYXJjaGl2ZSBmb3JtYXQuICAqLwotICBiZmQgKigqZ2V0X2VsdF9hdF9maWxlcG9zKSBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIpKTsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBrZXB0IGZvciBFQ09GRiBmaWxlcy4gICovCi0KLSNkZWZpbmUgZWNvZmZfZGF0YShhYmZkKSAoKGFiZmQpLT50ZGF0YS5lY29mZl9vYmpfZGF0YSkKLQotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfdGRhdGEKLXsKLSAgLyogVGhlIHJlbG9jIGZpbGUgcG9zaXRpb24sIHNldCBieQotICAgICBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICAqLwotICBmaWxlX3B0ciByZWxvY19maWxlcG9zOwotCi0gIC8qIFRoZSBzeW1ib2wgdGFibGUgZmlsZSBwb3NpdGlvbiwgc2V0IGJ5IF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vay4gICovCi0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotCi0gIC8qIFRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSB0ZXh0IHNlZ21lbnQuICBPbmx5IHZhbGlkIGZvciBhbgotICAgICBleGlzdGluZyBmaWxlLCBub3QgZm9yIG9uZSB3ZSBhcmUgY3JlYXRpbmcuICAqLwotICB1bnNpZ25lZCBsb25nIHRleHRfc3RhcnQ7Ci0gIHVuc2lnbmVkIGxvbmcgdGV4dF9lbmQ7Ci0KLSAgLyogVGhlIGNhY2hlZCBncCB2YWx1ZS4gIFRoaXMgaXMgdXNlZCB3aGVuIHJlbG9jYXRpbmcuICAqLwotICBiZmRfdm1hIGdwOwotCi0gIC8qIFRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBvcHRpbWl6ZSB1c2luZyBncC4gIFRoaXMgaXMKLSAgICAgdHlwaWNhbGx5IHNldCBieSB0aGUgLUcgb3B0aW9uIHRvIHRoZSBjb21waWxlciwgYXNzZW1ibGVyIG9yCi0gICAgIGxpbmtlci4gICovCi0gIHVuc2lnbmVkIGludCBncF9zaXplOwotCi0gIC8qIFRoZSByZWdpc3RlciBtYXNrcy4gIFdoZW4gbGlua2luZywgYWxsIHRoZSBtYXNrcyBmb3VuZCBpbiB0aGUKLSAgICAgaW5wdXQgZmlsZXMgYXJlIGNvbWJpbmVkIGludG8gdGhlIG1hc2tzIG9mIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgVGhlc2UgYXJlIG5vdCBhbGwgdXNlZCBmb3IgYWxsIHRhcmdldHMsIGJ1dCB0aGF0J3MgT0ssIGJlY2F1c2UKLSAgICAgdGhlIHJlbGV2YW50IG9uZXMgYXJlIHRoZSBvbmx5IG9uZXMgc3dhcHBlZCBpbiBhbmQgb3V0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBncHJtYXNrOwotICB1bnNpZ25lZCBsb25nIGZwcm1hc2s7Ci0gIHVuc2lnbmVkIGxvbmcgY3BybWFza1s0XTsKLQotICAvKiBUaGUgRUNPRkYgc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWdfaW5mbzsKLQotICAvKiBUaGUgdW5zd2FwcGVkIEVDT0ZGIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgUFRSIHJhd19zeW1lbnRzOwotCi0gIC8qIFRoZSBjYW5vbmljYWwgQkZEIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgZWNvZmZfc3ltYm9sX3N0cnVjdCAqY2Fub25pY2FsX3N5bWJvbHM7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gZXh0ZXJuYWwgc3ltYm9sIG51bWJlcnMgdG8gZW50cmllcyBpbiB0aGUgbGlua2VyCi0gICAgIGhhc2ggdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgKi8KLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gcmVsb2Mgc3ltYm9sIGluZGljZXMgdG8gc2VjdGlvbnMsIHVzZWQgd2hlbgotICAgICBsaW5raW5nLiAgKi8KLSAgYXNlY3Rpb24gKipzeW1uZHhfdG9fc2VjdGlvbjsKLQotICAvKiBUcnVlIGlmIHRoaXMgQkZEIHdhcyB3cml0dGVuIGJ5IHRoZSBiYWNrZW5kIGxpbmtlci4gICovCi0gIGJvb2xlYW4gbGlua2VyOwotCi0gIC8qIFRydWUgaWYgYSB3YXJuaW5nIHRoYXQgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWVzIGFyZQotICAgICBuZWVkZWQgaW4gdGhlIG91dHB1dCBiaW5hcnkgd2FzIGlzc3VlZCBhbHJlYWR5LiAgKi8KLSAgYm9vbGVhbiBpc3N1ZWRfbXVsdGlwbGVfZ3Bfd2FybmluZzsKLQotICAvKiBVc2VkIGJ5IGZpbmRfbmVhcmVzdF9saW5lIGVudHJ5IHBvaW50LiAgVGhlIHN0cnVjdHVyZSBjb3VsZCBiZQotICAgICBpbmNsdWRlZCBkaXJlY3RseSBpbiB0aGlzIG9uZSwgYnV0IHRoZXJlJ3Mgbm8gcG9pbnQgdG8gd2FzdGluZwotICAgICB0aGUgbWVtb3J5IGp1c3QgZm9yIHRoZSBpbmZyZXF1ZW50bHkgY2FsbGVkIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqZmluZF9saW5lX2luZm87Ci0KLSAgLyogV2hldGhlciB0aGUgLnJkYXRhIHNlY3Rpb24gaXMgaW4gdGhlIHRleHQgc2VnbWVudCBmb3IgdGhpcwotICAgICBwYXJ0aWN1bGFyIEVDT0ZGIGZpbGUuICBUaGlzIGlzIG5vdCB2YWxpZCB1bnRpbAotICAgICBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgaXMgY2FsbGVkLiAgKi8KLSAgYm9vbGVhbiByZGF0YV9pbl90ZXh0OwotCi19IGVjb2ZmX2RhdGFfdHlwZTsKLQotLyogRWFjaCBjYW5vbmljYWwgYXN5bWJvbCByZWFsbHkgbG9va3MgbGlrZSB0aGlzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfc3ltYm9sX3N0cnVjdAotewotICAvKiBUaGUgYWN0dWFsIHN5bWJvbCB3aGljaCB0aGUgcmVzdCBvZiBCRkQgd29ya3Mgd2l0aCAqLwotICBhc3ltYm9sIHN5bWJvbDsKLQotICAvKiBUaGUgZmRyIGZvciB0aGlzIHN5bWJvbC4gICovCi0gIEZEUiAqZmRyOwotCi0gIC8qIHRydWUgaWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCByYXRoZXIgdGhhbiBhbiBleHRlcm5hbCBvbmUuICAqLwotICBib29sZWFuIGxvY2FsOwotCi0gIC8qIEEgcG9pbnRlciB0byB0aGUgdW5zd2FwcGVkIGhpZGRlbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wuCi0gICAgIFRoaXMgaXMgZWl0aGVyIGEgc3RydWN0IHN5bV9leHQgb3IgYSBzdHJ1Y3QgZXh0X2V4dCwgZGVwZW5kaW5nIG9uCi0gICAgIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgZmllbGQgYWJvdmUuICAqLwotICBQVFIgbmF0aXZlOwotfSBlY29mZl9zeW1ib2xfdHlwZTsKLQotLyogV2UgdGFrZSB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sLiAgKi8KLSNkZWZpbmUgZWNvZmZzeW1ib2woYXN5bWJvbCkgKChlY29mZl9zeW1ib2xfdHlwZSAqKSAoJigoYXN5bWJvbCktPnRoZV9iZmQpKSkKLQotLyogV2UgbmVlZCB0byBzYXZlIHRoZSBpbmRleCBvZiBhbiBleHRlcm5hbCBzeW1ib2wgd2hlbiB3ZSB3cml0ZSBpdAotICAgb3V0IHNvIHRoYXQgY2FuIHNldCB0aGUgc3ltYm9sIGluZGV4IGNvcnJlY3RseSB3aGVuIHdlIHdyaXRlIG91dAotICAgdGhlIHJlbG9jcy4gICovCi0jZGVmaW5lIGVjb2ZmX2dldF9zeW1faW5kZXgoc3ltYm9sKSAoKHN5bWJvbCktPnVkYXRhLmkpCi0jZGVmaW5lIGVjb2ZmX3NldF9zeW1faW5kZXgoc3ltYm9sLCBpZHgpICgoc3ltYm9sKS0+dWRhdGEuaSA9IChpZHgpKQotCi0vKiBXaGVuIGdlbmVyYXRpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZSwgdGhlIGxpbmtlciByZWxheGVzIHRoZSBjb2RlCi0gICB0byB0dXJuIFBDIHJlbGF0aXZlIGJyYW5jaGVzIGludG8gbG9uZ2VyIGNvZGUgc2VxdWVuY2VzIHdoZW4gdGhlIFBDCi0gICByZWxhdGl2ZSBicmFuY2ggaXMgb3V0IG9mIHJhbmdlLiAgVGhpcyBpbnZvbHZlcyByZWFkaW5nIHRoZSByZWxvY3MKLSAgIGluIGJmZF9yZWxheF9zZWN0aW9uIGFzIHdlbGwgYXMgaW4gYmZkX2ZpbmFsX2xpbmssIGFuZCByZXF1aXJlcyB0aGUKLSAgIGNvZGUgdG8ga2VlcCB0cmFjayBvZiB3aGljaCByZWxvY3MgaGF2ZSBiZWVuIGV4cGFuZGVkLiAgQSBwb2ludGVyCi0gICB0byB0aGlzIHN0cnVjdHVyZSBpcyBwdXQgaW4gdGhlIHVzZWRfYnlfYmZkIHBvaW50ZXIgb2YgYSBzZWN0aW9uIHRvCi0gICBrZWVwIHRyYWNrIG9mIHRoaXMgaW5mb3JtYXRpb24uICBUaGUgdXNlcl9ieV9iZmQgcG9pbnRlciB3aWxsIGJlCi0gICBOVUxMIGlmIHRoZSBpbmZvcm1hdGlvbiB3YXMgbm90IG5lZWRlZC4gICovCi0KLXN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFRoZSB1bnN3YXBwZWQgcmVsb2NzIGZvciB0aGlzIHNlY3Rpb24uICBUaGVzZSBhcmUgc3RvcmVkIGluCi0gICAgIG1lbW9yeSBzbyB0aGUgaW5wdXQgZmlsZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHJlYWQgdHdpY2UuICAqLwotICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotCi0gIC8qIFRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbi4gIFRoZXNlIGJ5dGVzIG1heSBvciBtYXkgbm90IGJlIHNhdmVkCi0gICAgIGluIG1lbW9yeSwgYnV0IGlmIGl0IGlzIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZW0uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLSAgLyogT2Zmc2V0IGFkanVzdG1lbnRzIGZvciBQQyByZWxhdGl2ZSBicmFuY2hlcy4gIEEgbnVtYmVyIG90aGVyIHRoYW4KLSAgICAgMSBpcyBhbiBhZGRlbmQgZm9yIGEgUEMgcmVsYXRpdmUgYnJhbmNoLCBvciBhIHN3aXRjaCB0YWJsZSBlbnRyeQotICAgICB3aGljaCBpcyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gLnRleHQgbG9jYXRpb25zOyB0aGlzIGFkZGVuZAotICAgICBhcmlzZXMgYmVjYXVzZSB0aGUgYnJhbmNoIG9yIGRpZmZlcmVuY2UgY3Jvc3NlcyBvbmUgb3IgbW9yZQotICAgICBicmFuY2hlcyB3aGljaCB3ZXJlIGV4cGFuZGVkIGludG8gYSBsYXJnZXIgY29kZSBzZXF1ZW5jZS4gIEEgMQotICAgICBtZWFucyB0aGF0IHRoaXMgYnJhbmNoIHdhcyBpdHNlbGYgZXhwYW5kZWQgaW50byBhIGxhcmdlciBjb2RlCi0gICAgIHNlcXVlbmNlLiAgMSBpcyBub3QgYSBwb3NzaWJsZSBvZmZzZXQsIHNpbmNlIGFsbCBvZmZzZXRzIG11c3QgYmUKLSAgICAgbXVsdGlwbGVzIG9mIHRoZSBpbnN0cnVjdGlvbiBzaXplLCB3aGljaCBpcyA0OyBhbHNvLCB0aGUgb25seQotICAgICByZWxvY3Mgd2l0aCBub24temVybyBvZmZzZXRzIHdpbGwgYmUgUEMgcmVsYXRpdmUgYnJhbmNoZXMgb3IKLSAgICAgc3dpdGNoIHRhYmxlIGVudHJpZXMgd2l0aGluIHRoZSBzYW1lIG9iamVjdCBmaWxlLiAgSWYgdGhpcyBmaWVsZAotICAgICBpcyBOVUxMLCBubyBicmFuY2hlcyB3ZXJlIGV4cGFuZGVkIGFuZCBubyBvZmZzZXRzIGFyZSByZXF1aXJlZC4KLSAgICAgT3RoZXJ3aXNlIHRoZXJlIGFyZSBhcyBtYW55IGVudHJpZXMgYXMgdGhlcmUgYXJlIHJlbG9jcyBpbiB0aGUKLSAgICAgc2VjdGlvbiwgYW5kIHRoZSBlbnRyeSBmb3IgYW55IHJlbG9jIHRoYXQgaXMgbm90IFBDIHJlbGF0aXZlIGlzCi0gICAgIHplcm8uICAqLwotICBsb25nICpvZmZzZXRzOwotCi0gIC8qIFdoZW4gcHJvZHVjaW5nIGFuIGV4ZWN1dGFibGUgKGkuZS4sIGZpbmFsLCBub24tcmVsb2NhdGFibGUgbGluaykKLSAgICAgb24gdGhlIEFscGhhLCB3ZSBtYXkgbmVlZCB0byB1c2UgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWVzCi0gICAgIHRvIHNwYW4gdGhlIGVudGlyZSAubGl0YSBzZWN0aW9uLiAgSW4gZXNzZW5jZSwgd2UgYWxsb3cgZWFjaAotICAgICBpbnB1dCAubGl0YSBzZWN0aW9uIHRvIGhhdmUgaXRzIG93biBncCB2YWx1ZS4gIFRvIHN1cHBvcnQgdGhpcywKLSAgICAgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBncCB2YWx1ZXMgdGhhdCB3ZSBwaWNrZWQgZm9yIGVhY2gKLSAgICAgaW5wdXQgLmxpdGEgc2VjdGlvbiAuICovCi0gIGJmZF92bWEgZ3A7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIGVjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgZWNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICopIChzZWMpLT51c2VkX2J5X2JmZCkKLQotLyogRUNPRkYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgKi8KLSAgbG9uZyBpbmR4OwotICAvKiBCRkQgdGhhdCBleHQgZmllbGQgdmFsdWUgY2FtZSBmcm9tLiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBFQ09GRiBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFWFRSIGVzeW07Ci0gIC8qIE5vbnplcm8gaWYgdGhpcyBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbiBvdXQuICAqLwotICBjaGFyIHdyaXR0ZW47Ci0gIC8qIE5vbnplcm8gaWYgdGhpcyBzeW1ib2wgd2FzIHJlZmVycmVkIHRvIGFzIHNtYWxsIHVuZGVmaW5lZC4gICovCi0gIGNoYXIgc21hbGw7Ci19OwotCi0vKiBFQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIE1ha2UgYW4gRUNPRkYgb2JqZWN0LiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLQotLyogUmVhZCBpbiB0aGUgRUNPRkYgc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOwotCi0vKiBHZW5lcmljIEVDT0ZGIEJGRCBiYWNrZW5kIHZlY3RvcnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpfYmZkX2Vjb2ZmX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotI2RlZmluZQlfYmZkX2Vjb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFwKLSAgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFwKLSAgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgX2JmZF9lY29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgX2JmZF9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfZWNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLWV4dGVybiBsb25nIF9iZmRfZWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBsb25nIF9iZmRfZWNvZmZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKiphbG9jYXRpb24pKTsKLWV4dGVybiBhc3ltYm9sICpfYmZkX2Vjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9wcmludF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIFBUUiBmaWxlcCwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfZ2V0X3N5bWJvbF9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSBvZmZzZXQsCi0JICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0ciwgY29uc3QgY2hhciAqKmZubmFtZV9wdHIsCi0JICAgdW5zaWduZWQgaW50ICpyZXRsaW5lX3B0cikpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgX2JmZF9lY29mZl9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIF9iZmRfZWNvZmZfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLWV4dGVybiBsb25nIF9iZmRfZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqc3ltYm9scykpOwotLyogZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGRlZmluZWQgYnkgYmFja2VuZC4gKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi1leHRlcm4gaW50IF9iZmRfZWNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIHJlbG9jKSk7Ci0vKiBlY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIGRlZmluZWQgYnkgYmFja2VuZC4gICovCi0vKiBlY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBkZWZpbmVkIGJ5IGJhY2tlbmQuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2Vjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEhvb2sgZnVuY3Rpb25zIGZvciB0aGUgZ2VuZXJpYyBDT0ZGIHNlY3Rpb24gcmVhZGluZyBjb2RlLiAgKi8KLQotZXh0ZXJuIFBUUiBfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiBmaWxlaGRyLCBQVFIgYW91dGhkcikpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpKSBiZmRfdm9pZCkKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGVoZHIpKTsKLWV4dGVybiBmbGFnd29yZCBfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGhkciwgY29uc3QgY2hhciAqbmFtZSwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0vKiBFQ09GRiBhdXhpbGlhcnkgaW5mb3JtYXRpb24gc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdGhlIHNhbWUKLSAgIGZvciBhbGwgRUNPRkYgdGFyZ2V0cywgc28gdGhleSBhcmUgZGVmaW5lZCBpbiBlY29mZmxpbmsuYy4gICovCi0KLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4KLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqLCBUSVIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQKLSAgUEFSQU1TICgoaW50LCBjb25zdCBUSVIgKiwgc3RydWN0IHRpcl9leHQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4KLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKiwgUk5EWFIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgUk5EWFIgKiwgc3RydWN0IHJuZHhfZXh0ICopKTsKZGlmZiAtLWdpdCBhL2JmZC9saWJocHBhLmggYi9iZmQvbGliaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzJlYWJlLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MjkgKzAsMCBAQAotLyogSFAgUEEtUklTQyBTT00gb2JqZWN0IGZpbGUgZm9ybWF0OiAgZGVmaW5pdGlvbnMgaW50ZXJuYWwgdG8gQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9IUFBBX0gKLSNkZWZpbmUgX0hQUEFfSAotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBQQV9QQUdFU0laRSAweDEwMDAKLQotI2lmbmRlZiBJTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBJTkxJTkUgaW5saW5lCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZiAvKiBHTlUgQz8gKi8KLSNlbmRpZiAvKiBJTkxJTkUgKi8KLQotI2lmIF9fR05VQ19fID49IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNwotLyogRGVjbGFyZSB0aGUgZnVuY3Rpb25zIHdpdGggdGhlIHVudXNlZCBhdHRyaWJ1dGUgdG8gYXZvaWQgd2FybmluZ3MuICAqLwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgYXNzZW1ibGVfMyAodW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB2b2lkIGRpc19hc3NlbWJsZV8zICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgYXNzZW1ibGVfMTIgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB2b2lkIGRpc19hc3NlbWJsZV8xMiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKiwKLQkJCQkgICAgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgYXNzZW1ibGVfMTcgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCQkJCQkgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB2b2lkIGRpc19hc3NlbWJsZV8xNyAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKiwKLQkJCQkgICAgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB2b2lkIGRpc19hc3NlbWJsZV8yMiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKiwKLQkJCQkgICAgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBhc3NlbWJsZV8yMSAodW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZSAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMjEgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgc2lnbl9leHRlbmQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgb25lcyAoaW50KSBfX2F0dHJpYnV0ZSAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBzaWduX3VuZXh0ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgbG93X3NpZ25fZXh0ZW5kICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBsb3dfc2lnbl91bmV4dCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGhwcGFfZmllbGRfYWRqdXN0ICh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIGludCBiZmRfaHBwYV9pbnNuMmZtdCAodW5zaWduZWQgbG9uZykKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgIHVuc2lnbmVkIGxvbmcgaHBwYV9yZWJ1aWxkX2luc24gKGJmZCAqLCB1bnNpZ25lZCBsb25nLAotCQkJCQkJdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLSNlbmRpZiAvKiBnY2MgMi43IG9yIGhpZ2hlciAqLwotCi0KLS8qIFRoZSBQQSBpbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotZW51bSBwYV9hcmNoIHtwYTEwID0gMTAsIHBhMTEgPSAxMSwgcGEyMCA9IDIwfTsKLQotLyogSFAgUEEtUklTQyByZWxvY2F0aW9uIHR5cGVzICovCi0KLWVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlCi0gIHsKLSAgICBSX0hQUEFfRlNFTCA9IDB4MCwKLSAgICBSX0hQUEFfTFNTRUwgPSAweDEsCi0gICAgUl9IUFBBX1JTU0VMID0gMHgyLAotICAgIFJfSFBQQV9MU0VMID0gMHgzLAotICAgIFJfSFBQQV9SU0VMID0gMHg0LAotICAgIFJfSFBQQV9MRFNFTCA9IDB4NSwKLSAgICBSX0hQUEFfUkRTRUwgPSAweDYsCi0gICAgUl9IUFBBX0xSU0VMID0gMHg3LAotICAgIFJfSFBQQV9SUlNFTCA9IDB4OCwKLSAgICBSX0hQUEFfTlNFTCAgPSAweDksCi0gICAgUl9IUFBBX05MU0VMICA9IDB4YSwKLSAgICBSX0hQUEFfTkxSU0VMICA9IDB4YiwKLSAgICBSX0hQUEFfUFNFTCA9IDB4YywKLSAgICBSX0hQUEFfTFBTRUwgPSAweGQsCi0gICAgUl9IUFBBX1JQU0VMID0gMHhlLAotICAgIFJfSFBQQV9UU0VMID0gMHhmLAotICAgIFJfSFBQQV9MVFNFTCA9IDB4MTAsCi0gICAgUl9IUFBBX1JUU0VMID0gMHgxMSwKLSAgICBSX0hQUEFfTFRQU0VMID0gMHgxMiwKLSAgICBSX0hQUEFfUlRQU0VMID0gMHgxMwotICB9OwotCi0vKiAvdXNyL2luY2x1ZGUvcmVsb2MuaCBkZWZpbmVzIHRoZXNlIHRvIGNvbnN0YW50cy4gIFdlIHdhbnQgdG8gdXNlCi0gICB0aGVtIGluIGVudW1zLCBzbyAjdW5kZWYgdGhlbSBiZWZvcmUgd2Ugc3RhcnQgdXNpbmcgdGhlbS4gIFdlIG1pZ2h0Ci0gICBiZSBhYmxlIHRvIGZpeCB0aGlzIGFub3RoZXIgd2F5IGJ5IHNpbXBseSBtYW5hZ2luZyBub3QgdG8gaW5jbHVkZQotICAgL3Vzci9pbmNsdWRlL3JlbG9jLmgsIGJ1dCBjdXJyZW50bHkgR0RCIHBpY2tzIHVwIHRoZXNlIGRlZmluZXMKLSAgIHNvbWV3aGVyZS4gICovCi0jdW5kZWYgZV9mc2VsCi0jdW5kZWYgZV9sc3NlbAotI3VuZGVmIGVfcnNzZWwKLSN1bmRlZiBlX2xzZWwKLSN1bmRlZiBlX3JzZWwKLSN1bmRlZiBlX2xkc2VsCi0jdW5kZWYgZV9yZHNlbAotI3VuZGVmIGVfbHJzZWwKLSN1bmRlZiBlX3Jyc2VsCi0jdW5kZWYgZV9uc2VsCi0jdW5kZWYgZV9ubHNlbAotI3VuZGVmIGVfbmxyc2VsCi0jdW5kZWYgZV9wc2VsCi0jdW5kZWYgZV9scHNlbAotI3VuZGVmIGVfcnBzZWwKLSN1bmRlZiBlX3RzZWwKLSN1bmRlZiBlX2x0c2VsCi0jdW5kZWYgZV9ydHNlbAotI3VuZGVmIGVfb25lCi0jdW5kZWYgZV90d28KLSN1bmRlZiBlX3BjcmVsCi0jdW5kZWYgZV9jb24KLSN1bmRlZiBlX3BsYWJlbAotI3VuZGVmIGVfYWJzCi0KLS8qIGZvciBjb21wYXRpYmlsaXR5ICovCi1lbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQKLSAgewotICAgIGVfZnNlbCA9IFJfSFBQQV9GU0VMLAotICAgIGVfbHNzZWwgPSBSX0hQUEFfTFNTRUwsCi0gICAgZV9yc3NlbCA9IFJfSFBQQV9SU1NFTCwKLSAgICBlX2xzZWwgPSBSX0hQUEFfTFNFTCwKLSAgICBlX3JzZWwgPSBSX0hQUEFfUlNFTCwKLSAgICBlX2xkc2VsID0gUl9IUFBBX0xEU0VMLAotICAgIGVfcmRzZWwgPSBSX0hQUEFfUkRTRUwsCi0gICAgZV9scnNlbCA9IFJfSFBQQV9MUlNFTCwKLSAgICBlX3Jyc2VsID0gUl9IUFBBX1JSU0VMLAotICAgIGVfbnNlbCA9IFJfSFBQQV9OU0VMLAotICAgIGVfbmxzZWwgPSBSX0hQUEFfTkxTRUwsCi0gICAgZV9ubHJzZWwgPSBSX0hQUEFfTkxSU0VMLAotICAgIGVfcHNlbCA9IFJfSFBQQV9QU0VMLAotICAgIGVfbHBzZWwgPSBSX0hQUEFfTFBTRUwsCi0gICAgZV9ycHNlbCA9IFJfSFBQQV9SUFNFTCwKLSAgICBlX3RzZWwgPSBSX0hQUEFfVFNFTCwKLSAgICBlX2x0c2VsID0gUl9IUFBBX0xUU0VMLAotICAgIGVfcnRzZWwgPSBSX0hQUEFfUlRTRUwsCi0gICAgZV9sdHBzZWwgPSBSX0hQUEFfTFRQU0VMLAotICAgIGVfcnRwc2VsID0gUl9IUFBBX1JUUFNFTAotICB9OwotCi1lbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlCi0gIHsKLSAgICBSX0hQUEFfRV9PTkUgPSAwLAotICAgIFJfSFBQQV9FX1RXTyA9IDEsCi0gICAgUl9IUFBBX0VfUENSRUwgPSAyLAotICAgIFJfSFBQQV9FX0NPTiA9IDMsCi0gICAgUl9IUFBBX0VfUExBQkVMID0gNywKLSAgICBSX0hQUEFfRV9BQlMgPSAxOAotICB9OwotCi0vKiBmb3IgY29tcGF0aWJpbGl0eSAqLwotZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZV9hbHQKLSAgewotICAgIGVfb25lID0gUl9IUFBBX0VfT05FLAotICAgIGVfdHdvID0gUl9IUFBBX0VfVFdPLAotICAgIGVfcGNyZWwgPSBSX0hQUEFfRV9QQ1JFTCwKLSAgICBlX2NvbiA9IFJfSFBQQV9FX0NPTiwKLSAgICBlX3BsYWJlbCA9IFJfSFBQQV9FX1BMQUJFTCwKLSAgICBlX2FicyA9IFJfSFBQQV9FX0FCUwotICB9OwotCi0KLS8qIFJlbG9jYXRpb25zIGZvciBmdW5jdGlvbiBjYWxscyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlcgotICAgcmVsb2NhdGlvbiBiaXRzLiAgVGhlc2UgYml0cyBkZXNjcmliZSBleGFjdGx5IHdoZXJlIHRoZSBjYWxsZXIgaGFzCi0gICBwbGFjZWQgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIGFuZCB3aGVyZSBpdCBleHBlY3RzIHRvIGZpbmQgYSByZXR1cm4KLSAgIHZhbHVlLgotCi0gICBCb3RoIEVMRiBhbmQgU09NIGVuY29kZSB0aGlzIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgYWRkZW5kIGZpZWxkCi0gICBvZiB0aGUgY2FsbCByZWxvY2F0aW9uLiAgKE5vdGUgdGhpcyBjb3VsZCBicmVhayB2ZXJ5IGJhZGx5IGlmIG9uZQotICAgd2FzIHRvIG1ha2UgYSBjYWxsIGxpa2UgYmwgZm9vICsgMHgxMjM0NTY3OCkuCi0KLSAgIFRoZSBoaWdoIG9yZGVyIDEwIGJpdHMgY29udGFpbiBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwKLSAgIHRoZSBsb3cgb3JkZXIgMjIgYml0cyBjb250YWluIHRoZSBjb25zdGFudCBvZmZzZXQuICAqLwotICAgCi0jZGVmaW5lIEhQUEFfUl9BUkdfUkVMT0MoYSkJKCgoYSkgPj4gMjIpICYgMHgzRkYpCi0jZGVmaW5lIEhQUEFfUl9DT05TVEFOVChhKQkoKCgoaW50KShhKSkgPDwgMTApID4+IDEwKQotI2RlZmluZSBIUFBBX1JfQURERU5EKHIsYykJKCgocikgPDwgMjIpICsgKChjKSAmIDB4M0ZGRkZGKSkKLSNkZWZpbmUgSFBQQV9XSURFCSAgICAgICAoMCkgLyogUFNXIFctYml0LCBuZWVkIHRvIGNoZWNrISBGSVhNRSAqLwotCi0vKiBUaGVzZSBtYWNyb3MgZ2V0IGJpdCBmaWVsZHMgdXNpbmcgSFAncyBudW1iZXJpbmcgKE1TQiA9IDApLAotICogYnV0IG5vdGUgdGhhdCAiTUFTSyIgYXNzdW1lcyB0aGF0IHRoZSBMU0IgYml0cyBhcmUgd2hhdCdzCi0gKiB3YW50ZWQuCi0gKi8KLSNpZm5kZWYgR0VUX0ZJRUxECi0jZGVmaW5lIEdFVF9GSUVMRChYLCBGUk9NLCBUTykgXAotICAoKFgpID4+ICgzMSAtIChUTykpICYgKCgxIDw8ICgoVE8pIC0gKEZST00pICsgMSkpIC0gMSkpCi0jZW5kaWYgIAotI2RlZmluZSBHRVRfQklUKFgsIFdISUNIKSBcCi0gIEdFVF9GSUVMRCAoWCwgV0hJQ0gsIFdISUNIKQotCi0jZGVmaW5lIE1BU0soU0laRSkgXAotICAofigoLTEpIDw8IFNJWkUpKQotICAKLSNkZWZpbmUgQ0FURU5BVEUoWCwgWFNJWkUsIFksIFlTSVpFKSBcCi0gICgoKFggJiBNQVNLIChYU0laRSkpIDw8IFlTSVpFKSB8IChZICYgTUFTSyAoWVNJWkUpKSkKLQotI2RlZmluZSBFTEVWRU4oWCkgXAotICBDQVRFTkFURSAoR0VUX0JJVCAoWCwgMTApLCAxLCBHRVRfRklFTEQgKFgsIDAsIDkpLCAxMCkKLSAgCi0vKiBTb21lIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIFBBIGluc3RydWN0aW9ucy4gICovCi0KLS8qIE5PVEU6IHRoZXNlIHVzZSB0aGUgSFAgY29udmVudGlvbiB0aGF0IGZ7MX0gaXMgdGhlIF9sZWZ0XyBtb3N0Ci0gKiAgICAgICBiaXQgKE1TQikgb2YgZjsgdGhleSBzb21ldGltZXMgaGF2ZSB0byBpbXBvc2UgYW4gYXNzdW1wdGlvbgotICogICAgICAgYWJvdXQgdGhlIHNpemUgb2YgYSBmaWVsZDsgYW5kIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBtb3N0Ci0gKiAgICAgICBhcmVuJ3QgdXNlZC4KLSAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLXNpZ25fZXh0ZW5kICh4LCBsZW4pCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci17Ci0gIHJldHVybiAoaW50KSh4ID4+IChsZW4gLSAxKSA/ICgtMSA8PCBsZW4pIHwgeCA6IHgpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotYXNzZW1ibGVfMyAoeCkKLSAgICAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIHJldHVybiBDQVRFTkFURSAoR0VUX0JJVCAoeCwgMiksIDEsIEdFVF9GSUVMRCAoeCwgMCwgMSksIDIpOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8zICh4LCByKQotICAgICB1bnNpZ25lZCBpbnQgeDsKLSAgICAgdW5zaWduZWQgaW50ICpyOwotewotICAqciA9ICgoKHggJiA0KSA+PiAyKSB8ICgoeCAmIDMpIDw8IDEpKSAmIDc7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV82ICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgcmV0dXJuICgoKHggJiAweDEpIDw8IDUpICsgKDMyIC0gKHkgJiAweDFmKSkpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotYXNzZW1ibGVfMTIgKHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCB4LCB5OwotewotICByZXR1cm4gQ0FURU5BVEUgKENBVEVOQVRFICh5LCAxLCBHRVRfQklUICh4LCAxMCksIDEpLCAyLAotIAkJICAgR0VUX0ZJRUxEICh4LCAwLCA5KSwgOSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzEyIChhczEyLCB4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgYXMxMjsKLSAgICAgdW5zaWduZWQgaW50ICp4LCAqeTsKLXsKLSAgKnkgPSAoYXMxMiAmIDB4ODAwKSA+PiAxMTsKLSAgKnggPSAoKGFzMTIgJiAweDNmZikgPDwgMSkgfCAoKGFzMTIgJiAweDQwMCkgPj4gMTApOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzE2ICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgLyogRGVwZW5kcyBvbiBQU1cgVy1iaXQgISovCi0gIHVuc2lnbmVkIGludCB0ZW1wOwotCi0gIGlmIChIUFBBX1dJREUpCi0gICAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTMpLCAxLAotCQkJICAgICAgIChHRVRfQklUICh5LCAxMykgXiBHRVRfQklUICh4LCAwKSksIDEpLCAyLAotCQkgICAgIENBVEVOQVRFICgoR0VUX0JJVCAoeSwgMTMpIF4gR0VUX0JJVCAoeCwgMSkpLCAxLAotCQkJICAgICAgIEdFVF9GSUVMRCAoeSwgMCwgMTIpLCAxMyksIDE0KTsKLSAgZWxzZQotICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKEdFVF9CSVQgKHksIDEzKSwgMSwgR0VUX0JJVCAoeSwgMTMpLCAxKSwgMiwKLQkJICAgICBDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTMpLCAxLCBHRVRfRklFTEQgKHksIDAsIDEyKSwgMTMpLCAxNCk7Ci0KLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICh0ZW1wLCAxNik7Ci19Ci0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1hc3NlbWJsZV8xNmEgKHgsIHksIHopCi0gICAgIHVuc2lnbmVkIGludCB4LCB5LCB6OwotewotICAvKiBEZXBlbmRzIG9uIFBTVyBXLWJpdCAhKi8KLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0KLSAgaWYgKEhQUEFfV0lERSkKLSAgICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFICh6LCAxLCAoeiBeIEdFVF9CSVQgKHgsIDApKSwgMSksIDIsCi0JCSAgICAgQ0FURU5BVEUgKCh6IF4gR0VUX0JJVCAoeCwgMSkpLCAxLCB5LCAxMSksIDEyKTsKLSAgZWxzZSAKLSAgICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsIHosIDEpLCAyLCBDQVRFTkFURSAoeiwgMSwgeSwgMTEpLCAxMik7Ci0KLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICgodGVtcCA8PCAyKSwgMTYpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzE3ICh4LCB5LCB6KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeSwgejsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0gIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsIHgsIDUpLCA2LAotCQkgICBDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTApLCAxLCBHRVRfRklFTEQgKHksIDAsIDkpLCAxMCksIDExKTsKLSAgCi0gIHJldHVybiB0ZW1wOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8xNyAoYXMxNywgeCwgeSwgeikKLSAgICAgdW5zaWduZWQgaW50IGFzMTc7Ci0gICAgIHVuc2lnbmVkIGludCAqeCwgKnksICp6OwotewotCi0gICp6ID0gKGFzMTcgJiAweDEwMDAwKSA+PiAxNjsKLSAgKnggPSAoYXMxNyAmIDB4MGY4MDApID4+IDExOwotICAqeSA9ICgoKGFzMTcgJiAweDAwNDAwKSA+PiAxMCkgfCAoKGFzMTcgJiAweDNmZikgPDwgMSkpICYgMHg3ZmY7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzIyIChhczIyLCBhLCBiLCBjLCBkKQotICAgICB1bnNpZ25lZCBpbnQgYXMyMjsKLSAgICAgdW5zaWduZWQgaW50ICphLCAqYiwgKmMsICpkOwotewotCi0gICpkID0gKGFzMjIgJiAweDIwMDAwMCkgPj4gMjE7Ci0gICphID0gKGFzMjIgJiAweDFmMDAwMCkgPj4gMTY7Ci0gICpiID0gKGFzMjIgJiAweDBmODAwKSA+PiAxMTsKLSAgKmMgPSAoKChhczIyICYgMHgwMDQwMCkgPj4gMTApIHwgKChhczIyICYgMHgzZmYpIDw8IDEpKSAmIDB4N2ZmOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzIxICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0gIHRlbXAgPSAoKHggJiAxKSA8PCAyMCkgfAotICAgICgoeCAmIDB4ZmZlKSA8PCA4KSB8Ci0gICAgKCh4ICYgMHhjMDAwKSA+PiA3KSB8Ci0gICAgKCh4ICYgMHgxZjAwMDApID4+IDE0KSB8Ci0gICAgKCh4ICYgMHgwMDMwMDApID4+IDEyKTsKLSAgcmV0dXJuIHRlbXAgJiAweDFmZmZmZjsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1hc3NlbWJsZV8yMiAoYSxiLGMsZCkKLSAgICAgdW5zaWduZWQgaW50IGEsYixjLGQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLSAgCi0gIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKGQsIDEsIGEsIDUpLCA2LAotCQkgICBDQVRFTkFURSAoYiwgNSwgRUxFVkVOIChjKSwgMTEpLCAxNik7Ci0KLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICh0ZW1wLCAyMik7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzIxIChhczIxLCB4KQotICAgICB1bnNpZ25lZCBpbnQgYXMyMSwgKng7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQotCi0gIHRlbXAgPSAoYXMyMSAmIDB4MTAwMDAwKSA+PiAyMDsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MGZmZTAwKSA+PiA4OwotICB0ZW1wIHw9IChhczIxICYgMHgwMDAxODApIDw8IDc7Ci0gIHRlbXAgfD0gKGFzMjEgJiAweDAwMDA3YykgPDwgMTQ7Ci0gIHRlbXAgfD0gKGFzMjEgJiAweDAwMDAwMykgPDwgMTI7Ci0gICp4ID0gdGVtcDsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLW9uZXMgKG4pCi0gICAgIGludCBuOwotewotICB1bnNpZ25lZCBpbnQgbGVuX29uZXM7Ci0gIGludCBpOwotCi0gIGkgPSAwOwotICBsZW5fb25lcyA9IDA7Ci0gIHdoaWxlIChpIDwgbikKLSAgICB7Ci0gICAgICBsZW5fb25lcyA9IChsZW5fb25lcyA8PCAxKSB8IDE7Ci0gICAgICBpKys7Ci0gICAgfQotCi0gIHJldHVybiBsZW5fb25lczsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1zaWduX3VuZXh0ICh4LCBsZW4sIHJlc3VsdCkKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLSAgICAgdW5zaWduZWQgaW50ICpyZXN1bHQ7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW5fb25lczsKLQotICBsZW5fb25lcyA9IG9uZXMgKGxlbik7Ci0KLSAgKnJlc3VsdCA9IHggJiBsZW5fb25lczsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1sb3dfc2lnbl9leHRlbmQgKHgsIGxlbikKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLXsKLSAgcmV0dXJuIChpbnQpKCh4ICYgMHgxID8gKC0xIDw8IChsZW4gLSAxKSkgOiAwKSB8IHggPj4gMSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotbG93X3NpZ25fdW5leHQgKHgsIGxlbiwgcmVzdWx0KQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotICAgICB1bnNpZ25lZCBpbnQgKnJlc3VsdDsKLXsKLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0gIHVuc2lnbmVkIGludCBzaWduOwotICB1bnNpZ25lZCBpbnQgcmVzdDsKLSAgdW5zaWduZWQgaW50IG9uZV9iaXRfYXRfbGVuOwotICB1bnNpZ25lZCBpbnQgbGVuX29uZXM7Ci0KLSAgbGVuX29uZXMgPSBvbmVzIChsZW4pOwotICBvbmVfYml0X2F0X2xlbiA9IDEgPDwgKGxlbiAtIDEpOwotCi0gIHNpZ25fdW5leHQgKHgsIGxlbiwgJnRlbXApOwotICBzaWduID0gdGVtcCAmIG9uZV9iaXRfYXRfbGVuOwotICBzaWduID4+PSAobGVuIC0gMSk7Ci0KLSAgcmVzdCA9IHRlbXAgJiAobGVuX29uZXMgXiBvbmVfYml0X2F0X2xlbik7Ci0gIHJlc3QgPDw9IDE7Ci0KLSAgKnJlc3VsdCA9IHJlc3QgfCBzaWduOwotfQotCi0vKiBIYW5kbGUgZmllbGQgc2VsZWN0b3JzIGZvciBQQSBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpCi0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY29uc3RhbnRfdmFsdWU7Ci0gICAgIHVuc2lnbmVkIHNob3J0IHJfZmllbGQ7Ci17Ci0gIHN3aXRjaCAocl9maWVsZCkKLSAgICB7Ci0gICAgY2FzZSBlX2ZzZWw6CQkvKiBGICA6IG5vIGNoYW5nZQkJICAgICAgKi8KLSAgICBjYXNlIGVfbnNlbDoJCS8qIE4gIDogbm8gY2hhbmdlCQkgICAgICAgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbHNzZWw6CQkvKiBMUyA6IGlmIChiaXQgMjEpIHRoZW4gYWRkIDB4ODAwCi0JCQkJICAgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIGlmICh2YWx1ZSAmIDB4MDAwMDA0MDApCi0JdmFsdWUgKz0gMHg4MDA7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcnNzZWw6CQkvKiBSUyA6IFNpZ24gZXh0ZW5kIGZyb20gYml0IDIxCSovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIGlmICh2YWx1ZSAmIDB4MDAwMDA0MDApCi0JdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGVsc2UKLQl2YWx1ZSAmPSAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xzZWw6CQkvKiBMICA6IEFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cyAqLwotICAgIGNhc2UgZV9ubHNlbDoJCS8qIE5MICA6IEFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cyAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcnNlbDoJCS8qIFIgIDogU2V0IGJpdHMgMC0yMCB0byB6ZXJvCSAgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgdmFsdWUgPSB2YWx1ZSAmIDB4N2ZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbGRzZWw6CQkvKiBMRCA6IEFkZCAweDgwMCwgYXJpdGhtZXRpYyBzaGlmdAotCQkJCSAgIHJpZ2h0IDExIGJpdHMJCSAgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgdmFsdWUgKz0gMHg4MDA7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcmRzZWw6CQkvKiBSRCA6IFNldCBiaXRzIDAtMjAgdG8gb25lCSAgICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIHZhbHVlIHw9IDB4ZmZmZmY4MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9scnNlbDoJCS8qIExSIDogTCB3aXRoICJyb3VuZGVkIiBjb25zdGFudCAgICAgICovCi0gICAgY2FzZSBlX25scnNlbDoJCS8qIE5MUiA6IE5MIHdpdGggInJvdW5kZWQiIGNvbnN0YW50ICAgICAgKi8KLSAgICAgIHZhbHVlID0gdmFsdWUgKyAoKGNvbnN0YW50X3ZhbHVlICsgMHgxMDAwKSAmIDB4ZmZmZmUwMDApOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX3Jyc2VsOgkJLyogUlIgOiBSIHdpdGggInJvdW5kZWQiIGNvbnN0YW50ICAgICAgKi8KLSAgICAgIHZhbHVlID0gdmFsdWUgKyAoKGNvbnN0YW50X3ZhbHVlICsgMHgxMDAwKSAmIDB4ZmZmZmUwMDApOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweDdmZikgKyBjb25zdGFudF92YWx1ZSAtICgoY29uc3RhbnRfdmFsdWUgKyAweDEwMDApICYgMHhmZmZmZTAwMCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLQotfQotCi0vKiBQQS1SSVNDIE9QQ09ERVMgKi8KLSNkZWZpbmUgZ2V0X29wY29kZShpbnNuKQkoKGluc24pICYgMHhmYzAwMDAwMCkgPj4gMjYKLQotLyogRklYTUU6IHRoaXMgbGlzdCBpcyBpbmNvbXBsZXRlLiAgSXQgc2hvdWxkIGFsc28gYmUgYW4gZW51bWVyYXRlZAotICAgdHlwZSByYXRoZXIgdGhhbiAjZGVmaW5lcy4gICovCi0KLSNkZWZpbmUgTERPCTB4MGQKLSNkZWZpbmUgTERCCTB4MTAKLSNkZWZpbmUgTERICTB4MTEKLSNkZWZpbmUgTERXCTB4MTIKLSNkZWZpbmUgTERXTQkweDEzCi0jZGVmaW5lIFNUQgkweDE4Ci0jZGVmaW5lIFNUSAkweDE5Ci0jZGVmaW5lIFNUVwkweDFhCi0jZGVmaW5lIFNUV00JMHgxYgotI2RlZmluZSBDT01JQ0xSCTB4MjQKLSNkZWZpbmUgU1VCSQkweDI1Ci0jZGVmaW5lIFNVQklPCTB4MjUKLSNkZWZpbmUgQURESVQJMHgyYwotI2RlZmluZSBBRERJVE8JMHgyYwotI2RlZmluZSBBRERJCTB4MmQKLSNkZWZpbmUgQURESU8JMHgyZAotI2RlZmluZSBMRElMCTB4MDgKLSNkZWZpbmUgQURESUwJMHgwYQotCi0jZGVmaW5lIE1PVkIJMHgzMgotI2RlZmluZSBNT1ZJQgkweDMzCi0jZGVmaW5lIENPTUJUCTB4MjAKLSNkZWZpbmUgQ09NQkYJMHgyMgotI2RlZmluZSBDT01JQlQJMHgyMQotI2RlZmluZSBDT01JQkYJMHgyMwotI2RlZmluZSBBRERCVAkweDI4Ci0jZGVmaW5lIEFEREJGCTB4MmEKLSNkZWZpbmUgQURESUJUCTB4MjkKLSNkZWZpbmUgQURESUJGCTB4MmIKLSNkZWZpbmUgQlZCCTB4MzAKLSNkZWZpbmUgQkIJMHgzMQotCi0jZGVmaW5lIEJMCTB4M2EKLSNkZWZpbmUgQkxFCTB4MzkKLSNkZWZpbmUgQkUJMHgzOAotCi0jZGVmaW5lIENNUEJEVAkweDI3Ci0jZGVmaW5lIENNUEJERgkweDJmCi0jZGVmaW5lIENNUElCRAkweDNiCi0jZGVmaW5lIExERAkweDE0Ci0jZGVmaW5lIFNURAkweDFjCi0jZGVmaW5lIExEV0wJMHgxNwotI2RlZmluZSBTVFdMCTB4MWYKLSNkZWZpbmUgRkRMVyAgICAweDE2Ci0jZGVmaW5lIEZTVFcgICAgMHgxZQotICAKLS8qIEdpdmVuIGEgbWFjaGluZSBpbnN0cnVjdGlvbiwgcmV0dXJuIGl0cyBmb3JtYXQuCi0KLSAgIEZJWE1FOiAgb3Bjb2RlcyB3aGljaCBkbyBub3QgbWFwIHRvIGEga25vd24gZm9ybWF0Ci0gICBzaG91bGQgcmV0dXJuIGFuIGVycm9yIG9mIHNvbWUgc29ydC4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1iZmRfaHBwYV9pbnNuMmZtdCAoaW5zbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotewotICBpbnQgZm10ID0gLTE7Ci0gIHVuc2lnbmVkIGNoYXIgb3AgPSBnZXRfb3Bjb2RlIChpbnNuKTsKLSAgCi0gIHN3aXRjaCAob3ApCi0gICAgewotICAgIGNhc2UgQURESToKLSAgICBjYXNlIEFERElUOgotICAgIGNhc2UgU1VCSToKLSAgICAgIGZtdCA9IDExOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1ZCOgotICAgIGNhc2UgTU9WSUI6Ci0gICAgY2FzZSBDT01CVDoKLSAgICBjYXNlIENPTUJGOgotICAgIGNhc2UgQ09NSUJUOgotICAgIGNhc2UgQ09NSUJGOgotICAgIGNhc2UgQUREQlQ6Ci0gICAgY2FzZSBBRERCRjoKLSAgICBjYXNlIEFERElCVDoKLSAgICBjYXNlIEFERElCRjoKLSAgICBjYXNlIEJWQjoKLSAgICBjYXNlIEJCOgotICAgIGNhc2UgQ01QQkRUOgotICAgIGNhc2UgQ01QQkRGOgotICAgIGNhc2UgQ01QSUJEOgotICAgICAgZm10ID0gMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExETzoKLSAgICBjYXNlIExEQjoKLSAgICBjYXNlIExESDoKLSAgICBjYXNlIExEVzoKLSAgICBjYXNlIExEV006Ci0gICAgY2FzZSBTVEI6Ci0gICAgY2FzZSBTVEg6Ci0gICAgY2FzZSBTVFc6Ci0gICAgY2FzZSBTVFdNOgotICAgICAgZm10ID0gMTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExEV0w6Ci0gICAgY2FzZSBTVFdMOgotICAgIGNhc2UgRkRMVzoKLSAgICBjYXNlIEZTVFc6Ci0gICAgICAvKiBUaGlzIGlzIGEgaGFjay4gIFVuZm9ydHVuYXRlbHksIGZvcm1hdCAxMSBpcyBhbHJlYWR5IHRha2VuCi0JIGFuZCB3ZSdyZSB1c2luZyBpbnRlZ2VycyByYXRoZXIgdGhhbiBhbiBlbnVtLCBzbyBpdCdzIGhhcmQKLQkgdG8gZGVzY3JpYmUgdGhlIDEwYSBmb3JtYXQuICAqLwotICAgICAgZm10ID0gLTExOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMREQ6Ci0gICAgY2FzZSBTVEQ6Ci0gICAgICBmbXQgPSAxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkw6Ci0gICAgY2FzZSBCRToKLSAgICBjYXNlIEJMRToKLSAgICAgIGlmICgoaW5zbiAmIDB4MDAwMDgwMDApID09IDB4MDAwMDgwMDApCi0JcmV0dXJuIDIyOwotICAgICAgZm10ID0gMTc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExESUw6Ci0gICAgY2FzZSBBRERJTDoKLSAgICAgIGZtdCA9IDIxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZtdCA9IDMyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gZm10OwotfQotCi0KLS8qIEluc2VydCBWQUxVRSBpbnRvIElOU04gdXNpbmcgUl9GT1JNQVQgdG8gZGV0ZXJtaW5lIGV4YWN0bHkgd2hhdAotICAgYml0cyB0byBjaGFuZ2UuICAqLwotICAgCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWhwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCB2YWx1ZSwgcl9mb3JtYXQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY29uc3RfcGFydDsKLSAgdW5zaWduZWQgbG9uZyByZWJ1aWx0X3BhcnQ7Ci0KLSAgc3dpdGNoIChyX2Zvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSAxMToKLSAgICAgIHsKLQl1bnNpZ25lZCB3MSwgdzsKLQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmZTAwMjsKLQlkaXNfYXNzZW1ibGVfMTIgKHZhbHVlLCAmdzEsICZ3KTsKLQlyZWJ1aWx0X3BhcnQgPSAodzEgPDwgMikgfCB3OwotCXJldHVybiBjb25zdF9wYXJ0IHwgcmVidWlsdF9wYXJ0OwotICAgICAgfQotCi0gICAgY2FzZSAxMjoKLSAgICAgIHsKLQl1bnNpZ25lZCB3MSwgdzsKLQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmZTAwMjsKLQlkaXNfYXNzZW1ibGVfMTIgKHZhbHVlLCAmdzEsICZ3KTsKLQlyZWJ1aWx0X3BhcnQgPSAodzEgPDwgMikgfCB3OwotCXJldHVybiBjb25zdF9wYXJ0IHwgcmVidWlsdF9wYXJ0OwotICAgICAgfQotCi0gICAgY2FzZSAxNDoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZXh0OwotCQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmYzAwMDsKLQlsb3dfc2lnbl91bmV4dCAodmFsdWUsIDE0LCAmZXh0KTsKLQlyZXR1cm4gY29uc3RfcGFydCB8IGV4dDsKLSAgICAgIH0KLQotICAgIGNhc2UgMTc6Ci0gICAgICB7Ci0JdW5zaWduZWQgdzEsIHcyLCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZTBlMDAyOwotCWRpc19hc3NlbWJsZV8xNyAodmFsdWUsICZ3MSwgJncyLCAmdyk7Ci0JcmVidWlsdF9wYXJ0ID0gKHcyIDw8IDIpIHwgKHcxIDw8IDE2KSB8IHc7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCByZWJ1aWx0X3BhcnQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDIxOgotICAgICAgewotCXVuc2lnbmVkIGludCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZTAwMDAwOwotCWRpc19hc3NlbWJsZV8yMSAodmFsdWUsICZ3KTsKLQlyZXR1cm4gY29uc3RfcGFydCB8IHc7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDMyOgotICAgICAgY29uc3RfcGFydCA9IDA7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICByZXR1cm4gaW5zbjsKLX0KLQotI2VuZGlmIC8qIF9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJpZWVlLmggYi9iZmQvbGliaWVlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU4MDZlLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJpZWVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogSUVFRS02OTUgb2JqZWN0IGZpbGUgZm9ybWF0czogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIE1vc3RseSBTdGV2ZSBDaGFtYmVybGFpbidzIGZhdWx0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IGluZGV4OjI0OwotICBjaGFyIGxldHRlcjsKLX0gaWVlZV9zeW1ib2xfaW5kZXhfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgY3QgewotICBiZmQgKnRoaXM7Ci0gIHN0cnVjdCBjdCAqbmV4dDsKLX0gYmZkX2NoYWluX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfc3ltYm9sIAotewotICBhc3ltYm9sIHN5bWJvbDsKLSAgc3RydWN0IGllZWVfc3ltYm9sICpuZXh0OwotCi0gIHVuc2lnbmVkIGludCBpbmRleDsKLX0gaWVlZV9zeW1ib2xfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3JlbG9jIHsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHN0cnVjdCBpZWVlX3JlbG9jICpuZXh0OwotICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbDsKLQotfSBpZWVlX3JlbG9jX3R5cGU7Ci0KLSNkZWZpbmUgaWVlZV9zeW1ib2woeCkgKChpZWVlX3N5bWJvbF90eXBlICopKHgpKQotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3Blcl9zZWN0aW9uCi17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJmZF92bWEgcGM7Ci0gIC8qIEZvciBvdXRwdXQgKi8KLSAgZmlsZV9wdHIgY3VycmVudF9wb3M7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X2J5dGU7Ci0gIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0gIGllZWVfcmVsb2NfdHlwZSAqKnJlbG9jX3RhaWxfcHRyOwotfSBpZWVlX3Blcl9zZWN0aW9uX3R5cGU7Ci0KLSNkZWZpbmUgaWVlZV9wZXJfc2VjdGlvbih4KSAoKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSgoeCktPnVzZWRfYnlfYmZkKSkKLSAgCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkICBjaGFyICppbnB1dF9wOwotICB1bnNpZ25lZCBjaGFyICpmaXJzdF9ieXRlOwotICBiZmQgKmFiZmQ7Ci19IGNvbW1vbl9oZWFkZXJfdHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfZGF0YV9zdHJ1Y3QKLXsKLSAgY29tbW9uX2hlYWRlcl90eXBlIGg7Ci0gIGJvb2xlYW4gcmVhZF9zeW1ib2xzOwotICBib29sZWFuIHJlYWRfZGF0YTsJCi0gIGZpbGVfcHRyIG91dHB1dF9jdXJzb3I7Ci0gIC8qIE1hcCBvZiBzZWN0aW9uIGluZGV4ZXMgdG8gc2VjdGlvbiBwdHJzICovCi0gIGFzZWN0aW9uICoqc2VjdGlvbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fdGFibGVfc2l6ZTsKLSAgaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfdHlwZSBhZDsKLSAgaWVlZV9tb2R1bGVfYmVnaW5fdHlwZSBtYjsKLSAgaWVlZV93X3ZhcmlhYmxlX3R5cGUgdzsKLSAgCi0gIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OwotICAKLSAgdW5zaWduZWQgaW50IG1hcF9pZHg7Ci0gIC8qIExpc3Qgb2YgR0xPQkFMIEVYUE9SVCBzeW1ib2xzICovCi0gIGllZWVfc3ltYm9sX3R5cGUgKmV4dGVybmFsX3N5bWJvbHM7Ci0gIC8qIExpc3Qgb2YgVU5ERUZJTkVEIHN5bWJvbHMgKi8KLSAgaWVlZV9zeW1ib2xfdHlwZSAqZXh0ZXJuYWxfcmVmZXJlbmNlOwotICAKLSAgLyogV2hlbiB0aGUgc3ltYm9scyBoYXZlIGJlZW4gY2Fub25pY2FsaXplZCwgdGhleSBhcmUgaW4gYQotICAgICogc3BlY2lhbCBvcmRlciwgd2UgcmVtZW1iZXIgdmFyaW91cyBiYXNlcyBoZXJlLi4gKi8KLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9zeW1ib2xfbWluX2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfc3ltYm9sX2NvdW50OwotICBpbnQgZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0OwotICAKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50OwotICBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0OwotICAKLQotICBib29sZWFuIHN5bWJvbF90YWJsZV9mdWxsOwotCi0gIAotYm9vbGVhbiBkb25lX2RlYnVnOwotCi0KLWJmZF9jaGFpbl90eXBlICpjaGFpbl9oZWFkOwotYmZkX2NoYWluX3R5cGUgKmNoYWluX3Jvb3Q7Ci0KLX0gaWVlZV9kYXRhX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7Ci0gIGJmZCAqYWJmZDsKLX0gaWVlZV9hcl9vYnN0YWNrX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfYXJfZGF0YV9zdHJ1Y3QgCi17Ci0gIGNvbW1vbl9oZWFkZXJfdHlwZSBoOwotICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqZWxlbWVudHM7Ci0gIAotICB1bnNpZ25lZCAgaW50IGVsZW1lbnRfaW5kZXggOwotICB1bnNpZ25lZCBpbnQgZWxlbWVudF9jb3VudDsKLQotfSBpZWVlX2FyX2RhdGFfdHlwZTsKLQotI2RlZmluZSBJRUVFX0RBVEEoYWJmZCkgKChhYmZkKS0+dGRhdGEuaWVlZV9kYXRhKQotI2RlZmluZSBJRUVFX0FSX0RBVEEoYWJmZCkgKChhYmZkKS0+dGRhdGEuaWVlZV9hcl9kYXRhKQotCi0jZGVmaW5lIHB0cihhYmZkKSAoaWVlZV9kYXRhKGFiZmQpLT5pbnB1dF9wKQpkaWZmIC0tZ2l0IGEvYmZkL2xpYm5sbS5oIGIvYmZkL2xpYm5sbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmQyZTRlLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJubG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlcykgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQk5MTV9IXwotI2RlZmluZSBfTElCTkxNX0hfIDEKLQotI2lmZGVmIEFSQ0hfU0laRQotIyAgZGVmaW5lIE5MTV9BUkNIX1NJWkUgQVJDSF9TSVpFCi0jZW5kaWYKLSNpbmNsdWRlICJubG0vY29tbW9uLmgiCi0jaW5jbHVkZSAibmxtL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibmxtL2V4dGVybmFsLmgiCi0KLS8qIEEgcmVsb2MgZm9yIGFuIGltcG9ydGVkIE5MTSBzeW1ib2wuICBOb3JtYWwgcmVsb2NzIGFyZSBhc3NvY2lhdGVkCi0gICB3aXRoIHNlY3Rpb25zLCBhbmQgaW5jbHVkZSBhIHN5bWJvbC4gIFRoZXNlIHJlbG9jcyBhcmUgYXNzb2NpYXRlZAotICAgd2l0aCAodW5kZWZpbmVkKSBzeW1ib2xzLCBhbmQgaW5jbHVkZSBhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgbmxtX3JlbGVudAotewotICAvKiBTZWN0aW9uIG9mIHJlbG9jLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIFJlbG9jIGluZm8gKHN5bV9wdHJfcHRyIGZpZWxkIHNldCBvbmx5IHdoZW4gY2Fub25pY2FsaXplZCkuICAqLwotICBhcmVsZW50IHJlbG9jOwotfTsKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYW4gTkxNIHN5bWJvbC4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEJGRCBzeW1ib2wuICAqLwotICBhc3ltYm9sIHN5bWJvbDsKLSAgLyogTnVtYmVyIG9mIHJlbG9jIGVudHJpZXMgZm9yIGltcG9ydGVkIHN5bWJvbC4gICovCi0gIGJmZF9zaXplX3R5cGUgcmNudDsKLSAgLyogQXJyYXkgb2YgcmVsb2MgaW5mb3JtYXRpb24gZm9yIGltcG9ydGVkIHN5bWJvbC4gICovCi0gIHN0cnVjdCBubG1fcmVsZW50ICpyZWxvY3M7Ci19IG5sbU5BTUUoc3ltYm9sX3R5cGUpOwotCi1leHRlcm4gYm9vbGVhbiBubG1fbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIG5sbV9zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCi0JCQkJCSAgdW5zaWduZWQgbG9uZykpOwotCi1leHRlcm4gdm9pZCBubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSAgICAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfc3ltdGFiKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGFzeW1ib2wgKm5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBubG1OQU1FKHByaW50X3N5bWJvbCkKLSAgICAgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqbmxtTkFNRShvYmplY3RfcCkKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIG5sbU5BTUUoc2V0X2FyY2hfbWFjaCkKLSAgICAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLSAgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIG5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBTb21lIHByaXZhdGUgZGF0YSBpcyBzdGFzaGVkIGF3YXkgZm9yIGZ1dHVyZSB1c2UgdXNpbmcgdGhlIHRkYXRhIHBvaW50ZXIKLSAgIGluIHRoZSBiZmQgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG5sbV9vYmpfdGRhdGEKLXsKLSAgLyogQWN0dWFsIGRhdGEsIGJ1dCByZWYgbGlrZSBwdHIgKi8KLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcglubG1fZml4ZWRfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCW5sbV92YXJpYWJsZV9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcglubG1fdmVyc2lvbl9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCW5sbV9jb3B5cmlnaHRfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCW5sbV9leHRlbmRlZF9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCW5sbV9jdXN0b21faGRyWzFdOwotICBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgbmxtX2N5Z251c19leHRfaGRyWzFdOwotICAvKiBCRkQgTkxNIHN5bWJvbHMuICAqLwotICBubG1OQU1FKHN5bWJvbF90eXBlKQkJKm5sbV9zeW1ib2xzOwotICAvKiBMb3dlc3QgdGV4dCBhbmQgZGF0YSBWTUEgdmFsdWVzLiAgKi8KLSAgYmZkX3ZtYQkJCW5sbV90ZXh0X2xvdzsKLSAgYmZkX3ZtYQkJCW5sbV9kYXRhX2xvdzsKLSAgLyogQ2FjaGVzIGZvciBkYXRhIHJlYWQgZnJvbSBvYmplY3QgZmlsZS4gICovCi0gIGFyZWxlbnQgKgkJCW5sbV9yZWxvY19maXh1cHM7Ci0gIGFzZWN0aW9uICoqCQkJbmxtX3JlbG9jX2ZpeHVwX3NlY3M7Ci0gIC8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIHBvaW50ZXIsCi0gICAgIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgeWV0IGFub3RoZXIgZW50cnkgcG9pbnQgdG8gaW5pdGlhbGl6ZSB0aGUKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QJLyogQWxwaGEgYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0JewotCSAgYmZkX3ZtYSBncDsJCQkvKiBHUCB2YWx1ZS4gICovCi0JICBiZmRfdm1hIGxpdGFfYWRkcmVzczsJCS8qIC5saXRhIHNlY3Rpb24gYWRkcmVzcy4gICovCi0JICBiZmRfc2l6ZV90eXBlIGxpdGFfc2l6ZTsJLyogLmxpdGEgc2VjdGlvbiBzaXplLiAgKi8KLQl9Ci0gICAgICBhbHBoYV9iYWNrZW5kX2RhdGE7Ci0gICAgfQotICBiYWNrZW5kX2RhdGE7Ci19OwotCi0jZGVmaW5lIG5sbV90ZGF0YShiZmQpCQkJKChiZmQpIC0+IHRkYXRhLm5sbV9vYmpfZGF0YSkKLSNkZWZpbmUgbmxtX2ZpeGVkX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2ZpeGVkX2hkcikKLSNkZWZpbmUgbmxtX3ZhcmlhYmxlX2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdmFyaWFibGVfaGRyKQotI2RlZmluZSBubG1fdmVyc2lvbl9oZWFkZXIoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV92ZXJzaW9uX2hkcikKLSNkZWZpbmUgbmxtX2NvcHlyaWdodF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2NvcHlyaWdodF9oZHIpCi0jZGVmaW5lIG5sbV9leHRlbmRlZF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2V4dGVuZGVkX2hkcikKLSNkZWZpbmUgbmxtX2N1c3RvbV9oZWFkZXIoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9jdXN0b21faGRyKQotI2RlZmluZSBubG1fY3lnbnVzX2V4dF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2N5Z251c19leHRfaGRyKQotI2RlZmluZSBubG1fZ2V0X3N5bWJvbHMoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9zeW1ib2xzKQotI2RlZmluZSBubG1fc2V0X3N5bWJvbHMoYmZkLCBwKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9zeW1ib2xzID0gKHApKQotI2RlZmluZSBubG1fc2V0X3RleHRfbG93KGJmZCwgaSkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV90ZXh0X2xvdyA9IChpKSkKLSNkZWZpbmUgbmxtX2dldF90ZXh0X2xvdyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3RleHRfbG93KQotI2RlZmluZSBubG1fc2V0X2RhdGFfbG93KGJmZCwgaSkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9kYXRhX2xvdyA9IChpKSkKLSNkZWZpbmUgbmxtX2dldF9kYXRhX2xvdyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2RhdGFfbG93KQotI2RlZmluZSBubG1fcmVsb2NhdGlvbl9maXh1cHMoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3JlbG9jX2ZpeHVwcykKLSNkZWZpbmUgbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcyhiZmQpCShubG1fdGRhdGEoYmZkKS0+bmxtX3JlbG9jX2ZpeHVwX3NlY3MpCi0KLSNkZWZpbmUgbmxtX2FscGhhX2JhY2tlbmRfZGF0YShiZmQpIFwKLSAgKCZubG1fdGRhdGEgKGJmZCktPmJhY2tlbmRfZGF0YS5hbHBoYV9iYWNrZW5kX2RhdGEpCi0KLS8qIFRoaXMgaXMgdXNlZCB3aGVuIHdyaXRpbmcgb3V0IHRoZSBleHRlcm5hbCByZWxvY3MuICovCi0KLXN0cnVjdCByZWxvY19hbmRfc2VjCi17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYXNlY3Rpb24gKnNlYzsKLX07Ci0KLS8qIFdlIHN0b3JlIHNvbWUgZnVuY3Rpb24gcG9pbnRlciBpbiB0aGUgYmFja2VuZCBzdHJ1Y3R1cmUuICBUaGlzIGxldHMKLSAgIGRpZmZlcmVudCBOTE0gdGFyZ2V0cyBzaGFyZSBtb3N0IG9mIHRoZSBzYW1lIGNvZGUsIHdoaWxlIHByb3ZpZGluZwotICAgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUgd2hlcmUgbmVjZXNzYXJ5LiAgKi8KLQotc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEKLXsKLSAgLyogU2lnbmF0dXJlIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBjaGFyIHNpZ25hdHVyZVtOTE1fU0lHTkFUVVJFX1NJWkVdOwotICAvKiBTaXplIG9mIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIGZpeGVkX2hlYWRlcl9zaXplOwotICAvKiBTaXplIG9mIG9wdGlvbmFsIHByZWZpeCBmb3IgdGhpcyBiYWNrZW5kLiAgU29tZSBiYWNrZW5kIG1heQotICAgICByZXF1aXJlIHRoaXMgdG8gYmUgYSBmdW5jdGlvbiwgYnV0IHNvIGZhciBhIGNvbnN0YW50IGlzIE9LLiAgVGhpcwotICAgICBpcyBmb3IgYSBwcmVmaXggd2hpY2ggcHJlY2VkZXMgdGhlIHN0YW5kYXJkIE5MTSBmaXhlZCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG9wdGlvbmFsX3ByZWZpeF9zaXplOwotICAvKiBBcmNoaXRlY3R1cmUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogTWFjaGluZS4gICovCi0gIGxvbmcgbWFjaDsKLSAgLyogU29tZSBOTE0gZm9ybWF0cyBkbyBub3QgdXNlIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiwgc28KLSAgICAgYWxsIHVuaW5pdGlhbGl6ZWQgZGF0YSBtdXN0IGJlIHB1dCBpbnRvIHRoZSByZWd1bGFyIGRhdGEgc2VjdGlvbgotICAgICBpbnN0ZWFkLiAgKi8KLSAgYm9vbGVhbiBub191bmluaXRpYWxpemVkX2RhdGE7Ci0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgaGF2ZSBhIHByZWZpeCBvbiB0aGUgZmlsZS4gIElmIHRoaXMgZnVuY3Rpb24gaXMKLSAgICAgbm90IE5VTEwsIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IG5sbV9vYmplY3RfcC4gIEl0IHNob3VsZCByZXR1cm4KLSAgICAgdHJ1ZSBpZiB0aGlzIGZpbGUgY291bGQgbWF0Y2ggdGhpcyBmb3JtYXQsIGFuZCBpdCBzaG91bGQgbGVhdmUKLSAgICAgdGhlIEJGRCBzdWNoIHRoYXQgYSBiZmRfcmVhZCB3aWxsIHBpY2sgdXAgdGhlIGZpeGVkIGhlYWRlci4gICovCi0gIGJvb2xlYW4gKCpubG1fYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLSAgLyogV3JpdGUgb3V0IHRoZSBwcmVmaXguICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBOVUxMLiAgVGhpcyBtdXN0Ci0gICAgIHdyaXRlIG91dCB0aGUgc2FtZSBudW1iZXIgb2YgYnl0ZXMgYXMgaXMgaW4gdGhlIGZpZWxkCi0gICAgIG9wdGlvbmFsX3ByZWZpeF9zaXplLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9wcmVmaXgpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIC8qIFJlYWQgYSByZWxvY2F0aW9uIGZpeHVwIGZyb20gYWJmZC4gIFRoZSByZWxvYyBpbmZvcm1hdGlvbiBpcwotICAgICBtYWNoaW5lIHNwZWNpZmljLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgc3ltYm9sIGlmIHRoaXMgaXMKLSAgICAgYW4gaW1wb3J0LCBvciBOVUxMIGlmIHRoaXMgaXMgYSByZWxvYyBmaXh1cC4gIFRoaXMgZnVuY3Rpb24KLSAgICAgc2hvdWxkIHNldCB0aGUgdGhpcmQgYXJndW1lbnQgdG8gdGhlIHNlY3Rpb24gd2hpY2ggdGhlIHJlbG9jCi0gICAgIGJlbG9uZ3MgaW4sIGFuZCB0aGUgZm91cnRoIGFyZ3VtZW50IHRvIHRoZSByZWxvYyBpdHNlbGY7IGl0IGRvZXMKLSAgICAgbm90IG5lZWQgdG8gZmlsbCBpbiB0aGUgc3ltX3B0cl9wdHIgZmllbGQgZm9yIGEgcmVsb2MgYWdhaW5zdCBhbgotICAgICBpbXBvcnQgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9yZWFkX3JlbG9jKSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwKLQkJCQkgICAgIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLSAgLyogVG8gbWFrZSBvYmpjb3B5IHRvIGFuIGkzODYgTkxNIHdvcmssIHRoZSBpMzg2IGJhY2tlbmQgbmVlZHMgYQotICAgICBjaGFuY2UgdG8gd29yayBvdmVyIHRoZSByZWxvY3MuICBUaGlzIGlzIGEgYml0IGlja3kuICAqLwotICBib29sZWFuICgqbmxtX21hbmdsZV9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgZGF0YSwKLQkJCQkJYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCWJmZF9zaXplX3R5cGUgY291bnQpKTsKLSAgLyogUmVhZCBhbiBpbXBvcnQgcmVjb3JkIGZyb20gYWJmZC4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhpcwotICAgICB3ZXJlIGluIGEgbWFjaGluZS1kZXBlbmRlbnQgZm9ybWF0LCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIGJlLiAqLwotICBib29sZWFuICgqbmxtX3JlYWRfaW1wb3J0KSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotICAvKiBXcml0ZSBhbiBpbXBvcnQgcmVjb3JkIHRvIGFiZmQuICovCi0gIGJvb2xlYW4gKCpubG1fd3JpdGVfaW1wb3J0KSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci0gIC8qIFNldCB0aGUgc2VjdGlvbiBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgVGhpcyBtYXkgYmUgTlVMTCwgaW4gd2hpY2gKLSAgICAgY2FzZSBhIGRlZmF1bHQgbWV0aG9kIHdpbGwgYmUgdXNlZC4gICovCi0gIGJvb2xlYW4gKCpubG1fc2V0X3B1YmxpY19zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotICAvKiBHZXQgdGhlIG9mZnNldCB0byB3cml0ZSBvdXQgZm9yIGEgcHVibGljIHN5bWJvbC4gIFRoaXMgbWF5IGJlCi0gICAgIE5VTEwsIGluIHdoaWNoIGNhc2UgYSBkZWZhdWx0IG1ldGhvZCB3aWxsIGJlIHVzZWQuICAqLwotICBiZmRfdm1hICgqbmxtX2dldF9wdWJsaWNfb2Zmc2V0KSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0gIC8qIFN3YXAgdGhlIGZpeGVkIGhlYWRlciBpbiBhbmQgb3V0ICovCi0gIHZvaWQgKCpubG1fc3dhcF9maGRyX2luKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkgICAgUFRSLAotCQkJCSAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICopKTsKLSAgdm9pZCAoKm5sbV9zd2FwX2ZoZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwKLQkJCQkgICAgIHN0cnVjdCBubG1faW50ZXJuYWxfZml4ZWRfaGVhZGVyICosCi0JCQkJICAgICBQVFIpKTsKLSAgLyogV3JpdGUgb3V0IGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0gIGJvb2xlYW4gKCpubG1fd3JpdGVfZXh0ZXJuYWwpIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLAotCQkJCQkgYXN5bWJvbCAqLAotCQkJCQkgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotICBib29sZWFuICgqbmxtX3dyaXRlX2V4cG9ydCkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkX3ZtYSkpOwotfTsKLQotI2RlZmluZSBubG1fYmFja2VuZChiZmQpIFwKLSAgKChzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSAqKSgoYmZkKSAtPiB4dmVjIC0+IGJhY2tlbmRfZGF0YSkpCi0jZGVmaW5lIG5sbV9zaWduYXR1cmUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IHNpZ25hdHVyZSkKLSNkZWZpbmUgbmxtX2ZpeGVkX2hlYWRlcl9zaXplKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBmaXhlZF9oZWFkZXJfc2l6ZSkKLSNkZWZpbmUgbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBvcHRpb25hbF9wcmVmaXhfc2l6ZSkKLSNkZWZpbmUgbmxtX2FyY2hpdGVjdHVyZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gYXJjaCkKLSNkZWZpbmUgbmxtX21hY2hpbmUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG1hY2gpCi0jZGVmaW5lIG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5vX3VuaW5pdGlhbGl6ZWRfZGF0YSkKLSNkZWZpbmUgbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX2JhY2tlbmRfb2JqZWN0X3ApCi0jZGVmaW5lIG5sbV93cml0ZV9wcmVmaXhfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX3ByZWZpeCkKLSNkZWZpbmUgbmxtX3JlYWRfcmVsb2NfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3JlYWRfcmVsb2MpCi0jZGVmaW5lIG5sbV9tYW5nbGVfcmVsb2NzX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9tYW5nbGVfcmVsb2NzKQotI2RlZmluZSBubG1fcmVhZF9pbXBvcnRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3JlYWRfaW1wb3J0KQotI2RlZmluZSBubG1fd3JpdGVfaW1wb3J0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9pbXBvcnQpCi0jZGVmaW5lIG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3NldF9wdWJsaWNfc2VjdGlvbikKLSNkZWZpbmUgbmxtX2dldF9wdWJsaWNfb2Zmc2V0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9nZXRfcHVibGljX29mZnNldCkKLSNkZWZpbmUgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9zd2FwX2ZoZHJfaW4pCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3N3YXBfZmhkcl9vdXQpCi0jZGVmaW5lIG5sbV93cml0ZV9leHRlcm5hbF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfZXh0ZXJuYWwpCi0jZGVmaW5lIG5sbV93cml0ZV9leHBvcnRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX2V4cG9ydCkKLQotLyogVGhlIE5MTSBjb2RlLCBkYXRhLCBhbmQgdW5pbml0aWFsaXplZCBzZWN0aW9ucyBoYXZlIG5vIG5hbWVzIGRlZmluZWQKLSAgIGluIHRoZSBOTE0sIGJ1dCBiZmQgd2FudHMgdG8gZ2l2ZSB0aGVtIG5hbWVzLCBzbyB1c2UgdGhlIHRyYWRpdGlvbmFsCi0gICBVTklYIG5hbWVzLiAgKi8KLQotI2RlZmluZSBOTE1fQ09ERV9OQU1FCQkJIi50ZXh0IgotI2RlZmluZSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FCSIuZGF0YSIKLSNkZWZpbmUgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FCSIuYnNzIgotCi0jZW5kaWYgLyogX0xJQk5MTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYm9hc3lzLmggYi9iZmQvbGlib2FzeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZWE1OS4uMDAwMDAwMAotLS0gYS9iZmQvbGlib2FzeXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIEJGRCBpbnRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIE9hc3lzIGZpbGUgZm9ybWF0IGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBTY3Jhd2xlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfc3ltYm9sCi17Ci0gIGFzeW1ib2wgc3ltYm9sOwotfSBvYXN5c19zeW1ib2xfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3JlbG9jIHsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHN0cnVjdCBfb2FzeXNfcmVsb2MgKm5leHQ7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2w7Ci19IG9hc3lzX3JlbG9jX3R5cGU7Ci0KLQotI2RlZmluZSBvYXN5c19zeW1ib2woeCkgKChvYXN5c19zeW1ib2xfdHlwZSAqKSh4KSkKLSNkZWZpbmUgb2FzeXNfcGVyX3NlY3Rpb24oeCkgKChvYXN5c19wZXJfc2VjdGlvbl90eXBlICopKHgtPnVzZWRfYnlfYmZkKSkKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3Blcl9zZWN0aW9uCi17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJvb2xlYW4gaGFkX3ZtYTsKLSAgb2FzeXNfcmVsb2NfdHlwZSAqKnJlbG9jX3RhaWxfcHRyOwotICBiZmRfdm1hIHBjOwotCi0KLSAgZmlsZV9wdHIgY3VycmVudF9wb3M7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X2J5dGU7Ci0gIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci19IG9hc3lzX3Blcl9zZWN0aW9uX3R5cGU7Ci0KLSNkZWZpbmUgTlNFQ1RJT05TIDEwCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19hcl9vYnN0YWNrIHsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7Ci0gIGJmZCAqYWJmZDsKLX0gb2FzeXNfYXJfb2JzdGFja190eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19tb2R1bGVfaW5mbyB7Ci0gIGZpbGVfcHRyIHBvczsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqbmFtZTsKLX0gb2FzeXNfbW9kdWxlX2luZm9fdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgewotICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2R1bGU7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfaW5kZXg7Ci19IG9hc3lzX2FyX2RhdGFfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX2RhdGEgewotICBjaGFyICpzdHJpbmdzOwotICBhc3ltYm9sICpzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3N0cmluZ19sZW5ndGg7Ci0gIGFzZWN0aW9uICpzZWN0aW9uc1tPQVNZU19NQVhfU0VDX0NPVU5UXTsKLSAgZmlsZV9wdHIgZmlyc3RfZGF0YV9yZWNvcmQ7Ci19IG9hc3lzX2RhdGFfdHlwZTsKLQotI2RlZmluZSBPQVNZU19EQVRBKGFiZmQpCSgoYWJmZCktPnRkYXRhLm9hc3lzX29ial9kYXRhKQotI2RlZmluZSBPQVNZU19BUl9EQVRBKGFiZmQpCSgoYWJmZCktPnRkYXRhLm9hc3lzX2FyX2RhdGEpCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJwZWkuaCBiL2JmZC9saWJwZWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmN2ZjMS4uMDAwMDAwMAotLS0gYS9iZmQvbGlicGVpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgUEUvUEVJOyBjb21tb24gaGVhZGVyIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20KLQotUEUvUEVJIHJlYXJyYW5nZW1lbnQgKGFuZCBjb2RlIGFkZGVkKTogRG9ubiBUZXJyeQotCQkJCSAgICAgICBTb2Z0d2F5IFN5c3RlbXMsIEluYy4KLSovCi0KLS8qIEhleSBsb29rLCBzb21lIGRvY3VtZW50YXRpb24gW2FuZCBpbiBhIHBsYWNlIHlvdSBleHBlY3QgdG8gZmluZCBpdF0hCi0KLSAgIFRoZSBtYWluIHJlZmVyZW5jZSBmb3IgdGhlIHBlaSBmb3JtYXQgaXMgIk1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIDQuMSIuICBHZXQgaXQgaWYgeW91IG5lZWQgdG8KLSAgIGRvIHNvbWUgc2VyaW91cyBoYWNraW5nIG9uIHRoaXMgY29kZS4KLQotICAgQW5vdGhlciByZWZlcmVuY2U6Ci0gICAiUGVlcmluZyBJbnNpZGUgdGhlIFBFOiBBIFRvdXIgb2YgdGhlIFdpbjMyIFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIEZpbGUgRm9ybWF0IiwgTVNKIDE5OTQsIFZvbHVtZSA5LgotCi0gICBUaGUgKnNvbGUqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcGUgZm9ybWF0IGFuZCB0aGUgcGVpIGZvcm1hdCBpcyB0aGF0IHRoZQotICAgbGF0dGVyIGhhcyBhbiBNU0RPUyAyLjAgLmV4ZSBoZWFkZXIgb24gdGhlIGZyb250IHRoYXQgcHJpbnRzIHRoZSBtZXNzYWdlCi0gICAiVGhpcyBhcHAgbXVzdCBiZSBydW4gdW5kZXIgV2luZG93cy4iIChvciBzb21lIHN1Y2gpLgotICAgKEZJWE1FOiBXaGV0aGVyIHRoYXQgc3RhdGVtZW50IGlzICpyZWFsbHkqIHRydWUgb3Igbm90IGlzIHVua25vd24uCi0gICBBcmUgdGhlcmUgbW9yZSBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwZSBhbmQgcGVpIGZvcm1hdHM/Ci0gICBGb3Igbm93IGFzc3VtZSB0aGVyZSBhcmVuJ3QuICBJZiB5b3UgZmluZCBvbmUsIHRoZW4gZm9yIEdvZCBzYWtlcwotICAgZG9jdW1lbnQgaXQgaGVyZSEpCi0KLSAgIFRoZSBNaWNyb3NvZnQgZG9jcyB1c2UgdGhlIHdvcmQgImltYWdlIiBpbnN0ZWFkIG9mICJleGVjdXRhYmxlIiBiZWNhdXNlCi0gICB0aGUgZm9ybWVyIGNhbiBhbHNvIHJlZmVyIHRvIGEgRExMIChzaGFyZWQgbGlicmFyeSkuICBDb25mdXNpb24gY2FuIGFyaXNlCi0gICBiZWNhdXNlIHRoZSBgaScgaW4gYHBlaScgYWxzbyByZWZlcnMgdG8gImltYWdlIi4gIFRoZSBgcGUnIGZvcm1hdCBjYW4KLSAgIGFsc28gY3JlYXRlIGltYWdlcyAoaS5lLiBleGVjdXRhYmxlcyksIGl0J3MganVzdCB0aGF0IHRvIHJ1biBvbiBhIHdpbjMyCi0gICBzeXN0ZW0geW91IG5lZWQgdG8gdXNlIHRoZSBwZWkgZm9ybWF0LgotCi0gICBGSVhNRTogUGxlYXNlIGFkZCBtb3JlIGRvY3MgaGVyZSBzbyB0aGUgbmV4dCBwb29yIGZvb2wgdGhhdCBoYXMgdG8gaGFjawotICAgb24gdGhpcyBjb2RlIGhhcyBhIGNoYW5jZSBvZiBnZXR0aW5nIHNvbWV0aGluZyBhY2NvbXBsaXNoZWQgd2l0aG91dAotICAgd2FzdGluZyB0b28gbXVjaCB0aW1lLgotKi8KLQotI2lmbmRlZiBHRVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgR0VUX0ZDTl9MTk5PUFRSKGFiZmQsIGV4dCkgXAotICAgICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2VuZGlmCi0KLSNpZm5kZWYgR0VUX0ZDTl9FTkRORFgKLSNkZWZpbmUgR0VUX0ZDTl9FTkRORFgoYWJmZCwgZXh0KSAgXAotCWJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotCi0jaWZuZGVmIFBVVF9GQ05fTE5OT1BUUgotI2RlZmluZSBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgaW4sIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotI2lmbmRlZiBQVVRfRkNOX0VORE5EWAotI2RlZmluZSBQVVRfRkNOX0VORE5EWChhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MTlNaX0xOTk8KLSNkZWZpbmUgR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9TSVpFCi0jZGVmaW5lIEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfTE5OTwotI2RlZmluZSBQVVRfTE5TWl9MTk5PKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNlbmRpZgotI2lmbmRlZiBQVVRfTE5TWl9TSVpFCi0jZGVmaW5lIFBVVF9MTlNaX1NJWkUoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fU0NOTEVOCi0jZGVmaW5lIEdFVF9TQ05fU0NOTEVOKGFiZmQsICBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX05SRUxPQwotI2RlZmluZSBHRVRfU0NOX05SRUxPQyhhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX05MSU5OTwotI2RlZmluZSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpICBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25saW5ubykKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX1NDTkxFTgotI2RlZmluZSBQVVRfU0NOX1NDTkxFTihhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9OUkVMT0MKLSNkZWZpbmUgUFVUX1NDTl9OUkVMT0MoYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9OTElOTk8KLSNkZWZpbmUgUFVUX1NDTl9OTElOTk8oYWJmZCxpbiwgZXh0KSAgYmZkX2hfcHV0XzE2KGFiZmQsaW4sIChiZmRfYnl0ZSAgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNlbmRpZgotI2lmbmRlZiBHRVRfTElORU5PX0xOTk8KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNlbmRpZgotI2lmbmRlZiBQVVRfTElORU5PX0xOTk8KLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNlbmRpZgotCi0vKiBUaGUgZl9zeW1wdHIgZmllbGQgaW4gdGhlIGZpbGVoZHIgaXMgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgR0VUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9GSUxFSERSX1NZTVBUUgotI2RlZmluZSBQVVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotLyogU29tZSBmaWVsZHMgaW4gdGhlIGFvdXRoZHIgYXJlIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0FPVVRIRFJfVFNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVFNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfVFNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVFNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfRFNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRFNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfRFNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRFNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfQlNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfQlNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfQlNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfQlNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfRU5UUlkKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRU5UUlkgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfRU5UUlkKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRU5UUlkgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBzY25oZHIgYXJlIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX1NDTkhEUl9QQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1BBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9QQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1ZBRERSCi0jZGVmaW5lIEdFVF9TQ05IRFJfVkFERFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9WQUREUgotI2RlZmluZSBQVVRfU0NOSERSX1ZBRERSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfU0laRQotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TSVpFCi0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NDTlBUUgotI2RlZmluZSBHRVRfU0NOSERSX1NDTlBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1NDTlBUUgotI2RlZmluZSBQVVRfU0NOSERSX1NDTlBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1JFTFBUUgotI2RlZmluZSBHRVRfU0NOSERSX1JFTFBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1JFTFBUUgotI2RlZmluZSBQVVRfU0NOSERSX1JFTFBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfTE5OT1BUUgotI2RlZmluZSBQVVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBhcmNoaXRlY3R1cmUgZGVwZW5kZW50LCBhbmQgYXJlIGluIHBlaWNvZGUuaDoKLSAgIGNvZmZfc3dhcF9yZWxvY19pbgotICAgaW50IGNvZmZfc3dhcF9yZWxvY19vdXQKLSAgIGNvZmZfc3dhcF9maWxlaGRyX2luCi0gICBjb2ZmX3N3YXBfc2NuaGRyX2luCi0gICBwZV9ta29iamVjdAotICAgcGVfbWtvYmplY3RfaG9vayAgKi8KLQotLyogVGhlIGZ1bmN0aW9ucyBkZXNjcmliZWQgYmVsb3cgYXJlIGNvbW1vbiBhY3Jvc3MgYWxsIFBFL1BFSQotICAgaW1wbGVtZW50YXRpb25zIGFyY2hpdGVjdHVyZSB0eXBlcywgYW5kIGFjdHVhbGx5IGFwcGVhciBpbgotICAgcGVpZ2VuLmMuICAqLwotCi12b2lkIF9iZmRfcGVpX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9zeW1faW4gX2JmZF9wZWlfc3dhcF9zeW1faW4KLQotdW5zaWduZWQgaW50IF9iZmRfcGVpX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfc3ltX291dCBfYmZkX3BlaV9zd2FwX3N5bV9vdXQKLQotdm9pZCBfYmZkX3BlaV9zd2FwX2F1eF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfYXV4X2luIF9iZmRfcGVpX3N3YXBfYXV4X2luCi0KLXVuc2lnbmVkIGludCBfYmZkX3BlaV9zd2FwX2F1eF9vdXQgXAotICBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfYXV4X291dCBfYmZkX3BlaV9zd2FwX2F1eF9vdXQKLQotdm9pZCBfYmZkX3BlaV9zd2FwX2xpbmVub19pbiBQQVJBTVMgKChiZmQqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfbGluZW5vX2luIF9iZmRfcGVpX3N3YXBfbGluZW5vX2luCi0KLXVuc2lnbmVkIGludCBfYmZkX3BlaV9zd2FwX2xpbmVub19vdXQgUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX2xpbmVub19vdXQgX2JmZF9wZWlfc3dhcF9saW5lbm9fb3V0Ci0KLXZvaWQgX2JmZF9wZWlfc3dhcF9hb3V0aGRyX2luIFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX2luIF9iZmRfcGVpX3N3YXBfYW91dGhkcl9pbgotCi11bnNpZ25lZCBpbnQgX2JmZF9wZWlfc3dhcF9hb3V0aGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfb3V0IF9iZmRfcGVpX3N3YXBfYW91dGhkcl9vdXQKLQotdW5zaWduZWQgaW50IF9iZmRfcGVpX3N3YXBfc2NuaGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9vdXQgX2JmZF9wZWlfc3dhcF9zY25oZHJfb3V0Ci0KLWJvb2xlYW4gX2JmZF9wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbiBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLWJvb2xlYW4gX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbiBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotdm9pZCBfYmZkX3BlX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci0KLWJvb2xlYW4gX2JmZF9wZWlfZmluYWxfbGlua19wb3N0c2NyaXB0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotI2RlZmluZSBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCBfYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgbmVlZGVkIG9ubHkgZm9yIE9ORSBvZiBwZSBvciBwZWksIGJ1dCBkb24ndAotICAgb3RoZXJ3aXNlIHZhcnk7IHBlaWNvZGUuaCBmaXhlcyB1cCBpZmRlZnMgYnV0IHdlIHByb3ZpZGUgdGhlCi0gICBwcm90b3R5cGUuICAqLwotCi11bnNpZ25lZCBpbnQgX2JmZF9wZV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQgUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLXVuc2lnbmVkIGludCBfYmZkX3BlaV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQgUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLWJvb2xlYW4gX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKZGlmZiAtLWdpdCBhL2JmZC9saW5rZXIuYyBiL2JmZC9saW5rZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmOTZmZS4uMDAwMDAwMAotLS0gYS9iZmQvbGlua2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODA1ICswLDAgQEAKLS8qIGxpbmtlci5jIC0tIEJGRCBsaW5rZXIgcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0KLS8qCi1TRUNUSU9OCi0JTGlua2VyIEZ1bmN0aW9ucwotCi1AY2luZGV4IExpbmtlcgotCVRoZSBsaW5rZXIgdXNlcyB0aHJlZSBzcGVjaWFsIGVudHJ5IHBvaW50cyBpbiB0aGUgQkZEIHRhcmdldAotCXZlY3Rvci4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gd3JpdGUgc3BlY2lhbCByb3V0aW5lcyBmb3IKLQl0aGVzZSBlbnRyeSBwb2ludHMgd2hlbiBjcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQsIHNpbmNlCi0JZ2VuZXJpYyB2ZXJzaW9ucyBhcmUgcHJvdmlkZWQuICBIb3dldmVyLCB3cml0aW5nIHRoZW0gY2FuCi0Jc3BlZWQgdXAgbGlua2luZyBhbmQgbWFrZSBpdCB1c2Ugc2lnbmlmaWNhbnRseSBsZXNzIHJ1bnRpbWUKLQltZW1vcnkuCi0KLQlUaGUgZmlyc3Qgcm91dGluZSBjcmVhdGVzIGEgaGFzaCB0YWJsZSB1c2VkIGJ5IHRoZSBvdGhlcgotCXJvdXRpbmVzLiAgVGhlIHNlY29uZCByb3V0aW5lIGFkZHMgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLQlmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgVGhlIHRoaXJkIHJvdXRpbmUgdGFrZXMgYWxsIHRoZQotCW9iamVjdCBmaWxlcyBhbmQgbGlua3MgdGhlbSB0b2dldGhlciB0byBjcmVhdGUgdGhlIG91dHB1dAotCWZpbGUuICBUaGVzZSByb3V0aW5lcyBhcmUgZGVzaWduZWQgc28gdGhhdCB0aGUgbGlua2VyIHByb3BlcgotCWRvZXMgbm90IG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgc3ltYm9scyBpbiB0aGUgb2JqZWN0Ci0JZmlsZXMgdGhhdCBpdCBpcyBsaW5raW5nLiAgVGhlIGxpbmtlciBtZXJlbHkgYXJyYW5nZXMgdGhlCi0Jc2VjdGlvbnMgYXMgZGlyZWN0ZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQgYW5kIGxldHMgQkZEIGhhbmRsZQotCXRoZSBkZXRhaWxzIG9mIHN5bWJvbHMgYW5kIHJlbG9jcy4KLQotCVRoZSBzZWNvbmQgcm91dGluZSBhbmQgdGhpcmQgcm91dGluZXMgYXJlIHBhc3NlZCBhIHBvaW50ZXIgdG8KLQlhIDw8c3RydWN0IGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4KLQk8PGJmZGxpbmsuaD4+KSB3aGljaCBob2xkcyBpbmZvcm1hdGlvbiByZWxldmFudCB0byB0aGUgbGluaywKLQlpbmNsdWRpbmcgdGhlIGxpbmtlciBoYXNoIHRhYmxlICh3aGljaCB3YXMgY3JlYXRlZCBieSB0aGUKLQlmaXJzdCByb3V0aW5lKSBhbmQgYSBzZXQgb2YgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIHRoZSBsaW5rZXIKLQlwcm9wZXIuCi0KLQlUaGUgZ2VuZXJpYyBsaW5rZXIgcm91dGluZXMgYXJlIGluIDw8bGlua2VyLmM+PiwgYW5kIHVzZSB0aGUKLQloZWFkZXIgZmlsZSA8PGdlbmxpbmsuaD4+LiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgb25seSBiYWNrCi0JZW5kcyB3aGljaCBoYXZlIGltcGxlbWVudGVkIHZlcnNpb25zIG9mIHRoZXNlIHJvdXRpbmVzIGFyZQotCWEub3V0IChpbiA8PGFvdXR4Lmg+PikgYW5kIEVDT0ZGIChpbiA8PGVjb2ZmLmM+PikuICBUaGUgYS5vdXQKLQlyb3V0aW5lcyBhcmUgdXNlZCBhcyBleGFtcGxlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbi4KLQotQG1lbnUJCi1AKiBDcmVhdGluZyBhIExpbmtlciBIYXNoIFRhYmxlOjoKLUAqIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlOjoKLUAqIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbms6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1DcmVhdGluZyBhIExpbmtlciBIYXNoIFRhYmxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucywgTGlua2VyIEZ1bmN0aW9ucwotU1VCU0VDVElPTgotCUNyZWF0aW5nIGEgbGlua2VyIGhhc2ggdGFibGUKLQotQGNpbmRleCBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgaW4gdGFyZ2V0IHZlY3RvcgotQGNpbmRleCB0YXJnZXQgdmVjdG9yIChfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpCi0JVGhlIGxpbmtlciByb3V0aW5lcyBtdXN0IGNyZWF0ZSBhIGhhc2ggdGFibGUsIHdoaWNoIG11c3QgYmUKLQlkZXJpdmVkIGZyb20gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+IGRlc2NyaWJlZCBpbgotCTw8YmZkbGluay5jPj4uICBAeHJlZntIYXNoIFRhYmxlc30sIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8KLQljcmVhdGUgYSBkZXJpdmVkIGhhc2ggdGFibGUuICBUaGlzIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB1c2luZwotCXRoZSB0YXJnZXQgdmVjdG9yIG9mIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuCi0KLQlUaGUgPDxfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGU+PiBlbnRyeSBwb2ludCBtdXN0IGFsbG9jYXRlCi0JYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlc2lyZWQgaGFzaCB0YWJsZS4gIElmIHRoZQotCWJhY2sgZW5kIGRvZXMgbm90IHJlcXVpcmUgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUKLQlzdG9yZWQgd2l0aCB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgdGhlIGVudHJ5IHBvaW50IG1heQotCXNpbXBseSBjcmVhdGUgYSA8PHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlPj4uICBNb3N0IGxpa2VseSwKLQlob3dldmVyLCBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBuZWVkZWQuCi0KLQlGb3IgZXhhbXBsZSwgd2l0aCBlYWNoIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIHRoZSBhLm91dAotCWxpbmtlciBrZWVwcyB0aGUgaW5kZXggdGhlIHN5bWJvbCBoYXMgaW4gdGhlIGZpbmFsIG91dHB1dCBmaWxlCi0JKHRoaXMgaW5kZXggbnVtYmVyIGlzIHVzZWQgc28gdGhhdCB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlCi0JbGluayB0aGUgc3ltYm9sIGluZGV4IHVzZWQgaW4gdGhlIG91dHB1dCBmaWxlIGNhbiBiZSBxdWlja2x5Ci0JZmlsbGVkIGluIHdoZW4gY29weWluZyBvdmVyIGEgcmVsb2MpLiAgVGhlIGEub3V0IGxpbmtlciBjb2RlCi0JZGVmaW5lcyB0aGUgcmVxdWlyZWQgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBhIGhhc2ggdGFibGUKLQlkZXJpdmVkIGZyb20gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LiAgVGhlIGEub3V0IGxpbmtlcgotCWhhc2ggdGFibGUgaXMgY3JlYXRlZCBieSB0aGUgZnVuY3Rpb24KLQk8PE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKT4+OyBpdCBzaW1wbHkgYWxsb2NhdGVzCi0Jc3BhY2UgZm9yIHRoZSBoYXNoIHRhYmxlLCBpbml0aWFsaXplcyBpdCwgYW5kIHJldHVybnMgYQotCXBvaW50ZXIgdG8gaXQuCi0KLQlXaGVuIHdyaXRpbmcgdGhlIGxpbmtlciByb3V0aW5lcyBmb3IgYSBuZXcgYmFjayBlbmQsIHlvdSB3aWxsCi0JZ2VuZXJhbGx5IG5vdCBrbm93IGV4YWN0bHkgd2hpY2ggZmllbGRzIHdpbGwgYmUgcmVxdWlyZWQgdW50aWwKLQl5b3UgaGF2ZSBmaW5pc2hlZC4gIFlvdSBzaG91bGQgc2ltcGx5IGNyZWF0ZSBhIG5ldyBoYXNoIHRhYmxlCi0Jd2hpY2ggZGVmaW5lcyBubyBhZGRpdGlvbmFsIGZpZWxkcywgYW5kIHRoZW4gc2ltcGx5IGFkZCBmaWVsZHMKLQlhcyB0aGV5IGJlY29tZSBuZWNlc3NhcnkuCi0KLUlOT0RFCi1BZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucwotU1VCU0VDVElPTgotCUFkZGluZyBzeW1ib2xzIHRvIHRoZSBoYXNoIHRhYmxlCi0KLUBjaW5kZXggX2JmZF9saW5rX2FkZF9zeW1ib2xzIGluIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9saW5rX2FkZF9zeW1ib2xzKQotCVRoZSBsaW5rZXIgcHJvcGVyIHdpbGwgY2FsbCB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PgotCWVudHJ5IHBvaW50IGZvciBlYWNoIG9iamVjdCBmaWxlIG9yIGFyY2hpdmUgd2hpY2ggaXMgdG8gYmUKLQlsaW5rZWQgKHR5cGljYWxseSB0aGVzZSBhcmUgdGhlIGZpbGVzIG5hbWVkIG9uIHRoZSBjb21tYW5kCi0JbGluZSwgYnV0IHNvbWUgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0KS4gIFRoZQotCWVudHJ5IHBvaW50IGlzIHJlc3BvbnNpYmxlIGZvciBleGFtaW5pbmcgdGhlIGZpbGUuICBGb3IgYW4KLQlvYmplY3QgZmlsZSwgQkZEIG11c3QgYWRkIGFueSByZWxldmFudCBzeW1ib2wgaW5mb3JtYXRpb24gdG8KLQl0aGUgaGFzaCB0YWJsZS4gIEZvciBhbiBhcmNoaXZlLCBCRkQgbXVzdCBkZXRlcm1pbmUgd2hpY2gKLQllbGVtZW50cyBvZiB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgdXNlZCBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlCi0JbGluay4KLQotCVRoZSBhLm91dCB2ZXJzaW9uIG9mIHRoaXMgZW50cnkgcG9pbnQgaXMKLQk8PE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKT4+LgotCi1AbWVudQotQCogRGlmZmVyaW5nIGZpbGUgZm9ybWF0czo6Ci1AKiBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlOjoKLUAqIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZTo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLURpZmZlcmluZyBmaWxlIGZvcm1hdHMsIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZQotU1VCU1VCU0VDVElPTgotCURpZmZlcmluZyBmaWxlIGZvcm1hdHMKLQotCU5vcm1hbGx5IGFsbCB0aGUgZmlsZXMgaW52b2x2ZWQgaW4gYSBsaW5rIHdpbGwgYmUgb2YgdGhlIHNhbWUKLQlmb3JtYXQsIGJ1dCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGxpbmsgdG9nZXRoZXIgZGlmZmVyZW50Ci0JZm9ybWF0IG9iamVjdCBmaWxlcywgYW5kIHRoZSBiYWNrIGVuZCBtdXN0IHN1cHBvcnQgdGhhdC4gIFRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZW50cnkgcG9pbnQgaXMgY2FsbGVkIHZpYSB0aGUgdGFyZ2V0Ci0JdmVjdG9yIG9mIHRoZSBmaWxlIHRvIGJlIGFkZGVkLiAgVGhpcyBoYXMgYW4gaW1wb3J0YW50Ci0JY29uc2VxdWVuY2U6IHRoZSBmdW5jdGlvbiBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSBoYXNoIHRhYmxlCi0JaXMgdGhlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29ycmVzcG9uZGluZwotCTw8X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlPj4gdmVjdG9yLiAgQWxsIHRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24gY2FuIGFzc3VtZSBhYm91dCB0aGUgaGFzaAotCXRhYmxlIGlzIHRoYXQgaXQgaXMgZGVyaXZlZCBmcm9tIDw8c3RydWN0Ci0JYmZkX2xpbmtfaGFzaF90YWJsZT4+LgotCi0JU29tZXRpbWVzIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uIG11c3Qgc3RvcmUKLQlzb21lIGluZm9ybWF0aW9uIGluIHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIGJlIHVzZWQgYnkgdGhlCi0JPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbi4gIEluIHN1Y2ggYSBjYXNlIHRoZSA8PGNyZWF0b3I+PgotCWZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIG11c3QgYmUgY2hlY2tlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUKLQloYXNoIHRhYmxlIHdhcyBjcmVhdGVkIGJ5IGFuIG9iamVjdCBmaWxlIG9mIHRoZSBzYW1lIGZvcm1hdC4KLQotCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgbXVzdCBiZSBwcmVwYXJlZCB0byBoYW5kbGUgYQotCWhhc2ggZW50cnkgd2l0aG91dCBhbnkgZXh0cmEgaW5mb3JtYXRpb24gYWRkZWQgYnkgdGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbi4gIEEgaGFzaCBlbnRyeSB3aXRob3V0Ci0JZXh0cmEgaW5mb3JtYXRpb24gd2lsbCBhbHNvIG9jY3VyIHdoZW4gdGhlIGxpbmtlciBzY3JpcHQKLQlkaXJlY3RzIHRoZSBsaW5rZXIgdG8gY3JlYXRlIGEgc3ltYm9sLiAgTm90ZSB0aGF0LCByZWdhcmRsZXNzCi0Jb2YgaG93IGEgaGFzaCB0YWJsZSBlbnRyeSBpcyBhZGRlZCwgYWxsIHRoZSBmaWVsZHMgd2lsbCBiZQotCWluaXRpYWxpemVkIHRvIHNvbWUgc29ydCBvZiBudWxsIHZhbHVlIGJ5IHRoZSBoYXNoIHRhYmxlIGVudHJ5Ci0JaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCi0KLQlTZWUgPDxlY29mZl9saW5rX2FkZF9leHRlcm5hbHM+PiBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdG8KLQljaGVjayB0aGUgPDxjcmVhdG9yPj4gZmllbGQgYmVmb3JlIHNhdmluZyBpbmZvcm1hdGlvbiAoaW4gdGhpcwotCWNhc2UsIHRoZSBFQ09GRiBleHRlcm5hbCBzeW1ib2wgZGVidWdnaW5nIGluZm9ybWF0aW9uKSBpbiBhCi0JaGFzaCB0YWJsZSBlbnRyeS4KLQotSU5PREUKLUFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUsIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSwgRGlmZmVyaW5nIGZpbGUgZm9ybWF0cywgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKLVNVQlNVQlNFQ1RJT04KLQlBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlCi0KLQlXaGVuIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgaXMgcGFzc2VkIGFuIG9iamVjdAotCWZpbGUsIGl0IG11c3QgYWRkIGFsbCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scyBpbiB0aGF0Ci0Jb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICBUaGUgYWN0dWFsIHdvcmsgb2YgYWRkaW5nIHRoZQotCXN5bWJvbCB0byB0aGUgaGFzaCB0YWJsZSBpcyBub3JtYWxseSBoYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbgotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+Pi4gIFRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgcmVhZGluZwotCWFsbCB0aGUgc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZSBhbmQgcGFzc2luZyB0aGUgY29ycmVjdAotCWluZm9ybWF0aW9uIHRvIDw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+Pi4KLQotCVRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgc2hvdWxkIG5vdCB1c2UKLQk8PGJmZF9jYW5vbmljYWxpemVfc3ltdGFiPj4gdG8gcmVhZCB0aGUgc3ltYm9scy4gIFRoZSBwb2ludCBvZgotCXByb3ZpZGluZyB0aGlzIHJvdXRpbmUgaXMgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNvbnZlcnRpbmcKLQl0aGUgc3ltYm9scyBpbnRvIGdlbmVyaWMgPDxhc3ltYm9sPj4gc3RydWN0dXJlcy4KLQotQGZpbmRleCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+PiBoYW5kbGVzIHRoZSBkZXRhaWxzIG9mCi0JY29tYmluaW5nIGNvbW1vbiBzeW1ib2xzLCB3YXJuaW5nIGFib3V0IG11bHRpcGxlIGRlZmluaXRpb25zLAotCWFuZCBzbyBmb3J0aC4gIEl0IHRha2VzIGFyZ3VtZW50cyB3aGljaCBkZXNjcmliZSB0aGUgc3ltYm9sIHRvCi0JYWRkLCBub3RhYmx5IHN5bWJvbCBmbGFncywgYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0LiAgVGhlCi0Jc3ltYm9sIGZsYWdzIGluY2x1ZGUgc3VjaCB0aGluZ3MgYXMgPDxCU0ZfV0VBSz4+IG9yCi0JPDxCU0ZfSU5ESVJFQ1Q+Pi4gIFRoZSBzZWN0aW9uIGlzIGEgc2VjdGlvbiBpbiB0aGUgb2JqZWN0Ci0JZmlsZSwgb3Igc29tZXRoaW5nIGxpa2UgPDxiZmRfdW5kX3NlY3Rpb25fcHRyPj4gZm9yIGFuIHVuZGVmaW5lZAotCXN5bWJvbCBvciA8PGJmZF9jb21fc2VjdGlvbl9wdHI+PiBmb3IgYSBjb21tb24gc3ltYm9sLgotCi0JSWYgdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBpcyBhbHNvIGdvaW5nIHRvIG5lZWQgdG8KLQlyZWFkIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24sIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+Ci0Jcm91dGluZSBzaG91bGQgc2F2ZSBpdCBzb21ld2hlcmUgYXR0YWNoZWQgdG8gdGhlIG9iamVjdCBmaWxlCi0JQkZELiAgSG93ZXZlciwgdGhlIGluZm9ybWF0aW9uIHNob3VsZCBvbmx5IGJlIHNhdmVkIGlmIHRoZQotCTw8a2VlcF9tZW1vcnk+PiBmaWVsZCBvZiB0aGUgPDxpbmZvPj4gYXJndW1lbnQgaXMgdHJ1ZSwgc28KLQl0aGF0IHRoZSA8PC1uby1rZWVwLW1lbW9yeT4+IGxpbmtlciBzd2l0Y2ggaXMgZWZmZWN0aXZlLgotCi0JVGhlIGEub3V0IGZ1bmN0aW9uIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIGlzCi0JPDxhb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzPj4sIGFuZCBtb3N0IG9mIHRoZSBpbnRlcmVzdGluZwotCXdvcmsgaXMgaW4gPDxhb3V0X2xpbmtfYWRkX3N5bWJvbHM+Pi4gIFRoZSBsYXR0ZXIgc2F2ZXMKLQlwb2ludGVycyB0byB0aGUgaGFzaCB0YWJsZXMgZW50cmllcyBjcmVhdGVkIGJ5Ci0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+IGluZGV4ZWQgYnkgc3ltYm9sIG51bWJlciwKLQlzbyB0aGF0IHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgZG9lcyBub3QgaGF2ZSB0byBjYWxsCi0JdGhlIGhhc2ggdGFibGUgbG9va3VwIHJvdXRpbmUgdG8gbG9jYXRlIHRoZSBlbnRyeS4KLQotSU5PREUKLUFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSwgLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZQotU1VCU1VCU0VDVElPTgotCUFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZQotCi0JV2hlbiB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIGlzIHBhc3NlZCBhbgotCWFyY2hpdmUsIGl0IG11c3QgbG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlCi0JYXJjaGl2ZSBhbmQgZGVjaWRlIHdoaWNoIGVsZW1lbnRzIG9mIHRoZSBhcmNoaXZlIHNob3VsZCBiZQotCWluY2x1ZGVkIGluIHRoZSBsaW5rLiAgRm9yIGVhY2ggc3VjaCBlbGVtZW50IGl0IG11c3QgY2FsbCB0aGUKLQk8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBsaW5rZXIgY2FsbGJhY2ssIGFuZCBpdCBtdXN0IGFkZCB0aGUKLQlzeW1ib2xzIGZyb20gdGhlIG9iamVjdCBmaWxlIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotQGZpbmRleCBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JSW4gbW9zdCBjYXNlcyB0aGUgd29yayBvZiBsb29raW5nIHRocm91Z2ggdGhlIHN5bWJvbHMgaW4gdGhlCi0JYXJjaGl2ZSBzaG91bGQgYmUgZG9uZSBieSB0aGUKLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiBmdW5jdGlvbi4gIFRoaXMKLQlmdW5jdGlvbiBidWlsZHMgYSBoYXNoIHRhYmxlIGZyb20gdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGFuZAotCWxvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMgdG8gc2VlIHdoaWNoCi0JZWxlbWVudHMgc2hvdWxkIGJlIGluY2x1ZGVkLgotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+IGlzIHBhc3NlZCBhIGZ1bmN0aW9uCi0JdG8gY2FsbCB0byBtYWtlIHRoZSBmaW5hbCBkZWNpc2lvbiBhYm91dCBhZGRpbmcgYW4gYXJjaGl2ZQotCWVsZW1lbnQgdG8gdGhlIGxpbmsgYW5kIHRvIGRvIHRoZSBhY3R1YWwgd29yayBvZiBhZGRpbmcgdGhlCi0Jc3ltYm9scyB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0KLQlUaGUgZnVuY3Rpb24gcGFzc2VkIHRvCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4gbXVzdCByZWFkIHRoZQotCXN5bWJvbHMgb2YgdGhlIGFyY2hpdmUgZWxlbWVudCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIGFyY2hpdmUKLQllbGVtZW50IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIElmIHRoZSBlbGVtZW50IGlzIHRvCi0JYmUgaW5jbHVkZWQsIHRoZSA8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBsaW5rZXIgY2FsbGJhY2sKLQlyb3V0aW5lIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGVsZW1lbnQgYXMgYW4gYXJndW1lbnQsIGFuZAotCXRoZSBlbGVtZW50cyBzeW1ib2xzIG11c3QgYmUgYWRkZWQgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlCi0JanVzdCBhcyB0aG91Z2ggdGhlIGVsZW1lbnQgaGFkIGl0c2VsZiBiZWVuIHBhc3NlZCB0byB0aGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uLgotCi0JV2hlbiB0aGUgYS5vdXQgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbiByZWNlaXZlcyBhbgotCWFyY2hpdmUsIGl0IGNhbGxzIDw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+Ci0JcGFzc2luZyA8PGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQ+PiBhcyB0aGUgZnVuY3Rpb24KLQlhcmd1bWVudC4gPDxhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Pj4gY2FsbHMKLQk8PGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzPj4uICBJZiB0aGUgbGF0dGVyIGRlY2lkZXMgdG8gYWRkCi0JdGhlIGVsZW1lbnQgKGFuIGVsZW1lbnQgaXMgb25seSBhZGRlZCBpZiBpdCBwcm92aWRlcyBhIHJlYWwsCi0Jbm9uLWNvbW1vbiwgZGVmaW5pdGlvbiBmb3IgYSBwcmV2aW91c2x5IHVuZGVmaW5lZCBvciBjb21tb24KLQlzeW1ib2wpIGl0IGNhbGxzIHRoZSA8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBjYWxsYmFjayBhbmQgdGhlbgotCTw8YW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudD4+IGNhbGxzCi0JPDxhb3V0X2xpbmtfYWRkX3N5bWJvbHM+PiB0byBhY3R1YWxseSBhZGQgdGhlIHN5bWJvbHMgdG8gdGhlCi0JbGlua2VyIGhhc2ggdGFibGUuCi0KLQlUaGUgRUNPRkYgYmFjayBlbmQgaXMgdW51c3VhbCBpbiB0aGF0IGl0IGRvZXMgbm90IG5vcm1hbGx5Ci0JY2FsbCA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiwgYmVjYXVzZSBFQ09GRgotCWFyY2hpdmVzIGFscmVhZHkgY29udGFpbiBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIFRoZSBFQ09GRgotCWJhY2sgZW5kIHNlYXJjaGVzIHRoZSBhcmNoaXZlIGl0c2VsZiB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YKLQljcmVhdGluZyBhIG5ldyBoYXNoIHRhYmxlLgotCi1JTk9ERQotUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucwotU1VCU0VDVElPTgotCVBlcmZvcm1pbmcgdGhlIGZpbmFsIGxpbmsKLQotQGNpbmRleCBfYmZkX2xpbmtfZmluYWxfbGluayBpbiB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IHRhcmdldCB2ZWN0b3IgKF9iZmRfZmluYWxfbGluaykKLQlXaGVuIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgdGhlIGxpbmtlciBjYWxscwotCXRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGVudHJ5IHBvaW50IG9mIHRoZSBvdXRwdXQgQkZELiAgVGhpcwotCXJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHByb2R1Y2luZyB0aGUgZmluYWwgb3V0cHV0IGZpbGUsCi0Jd2hpY2ggaGFzIHNldmVyYWwgYXNwZWN0cy4gIEl0IG11c3QgcmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIGlucHV0IHNlY3Rpb25zIGFuZCBjb3B5IHRoZSBkYXRhIGludG8gdGhlIG91dHB1dCBzZWN0aW9ucy4KLQlJdCBtdXN0IGJ1aWxkIGFuIG91dHB1dCBzeW1ib2wgdGFibGUgaW5jbHVkaW5nIGFueSBsb2NhbAotCXN5bWJvbHMgZnJvbSB0aGUgaW5wdXQgZmlsZXMgYW5kIHRoZSBnbG9iYWwgc3ltYm9scyBmcm9tIHRoZQotCWhhc2ggdGFibGUuICBXaGVuIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBpdCBtdXN0Ci0JbW9kaWZ5IHRoZSBpbnB1dCByZWxvY3MgYW5kIHdyaXRlIHRoZW0gaW50byB0aGUgb3V0cHV0IGZpbGUuCi0JVGhlcmUgbWF5IGFsc28gYmUgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbnQgd29yayB0byBiZSBkb25lLgotCi0JVGhlIGxpbmtlciB3aWxsIGFsc28gY2FsbCB0aGUgPDx3cml0ZV9vYmplY3RfY29udGVudHM+PiBlbnRyeQotCXBvaW50IHdoZW4gdGhlIEJGRCBpcyBjbG9zZWQuICBUaGUgdHdvIGVudHJ5IHBvaW50cyBtdXN0IHdvcmsKLQl0b2dldGhlciBpbiBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG91dHB1dCBmaWxlLgotCi0JVGhlIGRldGFpbHMgb2YgaG93IHRoaXMgd29ya3MgYXJlIGluZXZpdGFibHkgZGVwZW5kZW50IHVwb24KLQl0aGUgc3BlY2lmaWMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIGEub3V0Ci0JPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIGlzIDw8TkFNRShhb3V0LGZpbmFsX2xpbmspPj4uCi0KLUBtZW51Ci1AKiBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyOjoKLUAqIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHM6OgotQCogV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlOjoKLUBlbmQgbWVudQotCi1JTk9ERQotSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlciwgUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cywgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluawotU1VCU1VCU0VDVElPTgotCUluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIKLQotCUJlZm9yZSB0aGUgbGlua2VyIGNhbGxzIHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGVudHJ5IHBvaW50LAotCWl0IHNldHMgdXAgc29tZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBmdW5jdGlvbiB0byB1c2UuCi0KLQlUaGUgPDxpbnB1dF9iZmRzPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQotCXdpbGwgcG9pbnQgdG8gYSBsaXN0IG9mIGFsbCB0aGUgaW5wdXQgZmlsZXMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4gIFRoZXNlIGZpbGVzIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGUgPDxsaW5rX25leHQ+PiBmaWVsZAotCW9mIHRoZSA8PGJmZD4+IHN0cnVjdHVyZS4KLQotCUVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBoYXZlIGEgbGlzdCBvZgotCTw8bGlua19vcmRlcj4+IHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gdGhlIDw8bGlua19vcmRlcl9oZWFkPj4KLQlmaWVsZCAodGhlIDw8bGlua19vcmRlcj4+IHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluCi0JPDxiZmRsaW5rLmg+PikuICBUaGVzZSBzdHJ1Y3R1cmVzIGRlc2NyaWJlIGhvdyB0byBjcmVhdGUgdGhlCi0JY29udGVudHMgb2YgdGhlIG91dHB1dCBzZWN0aW9uIGluIHRlcm1zIG9mIHRoZSBjb250ZW50cyBvZgotCXZhcmlvdXMgaW5wdXQgc2VjdGlvbnMsIGZpbGwgY29uc3RhbnRzLCBhbmQsIGV2ZW50dWFsbHksIG90aGVyCi0JdHlwZXMgb2YgaW5mb3JtYXRpb24uICBUaGV5IGFsc28gZGVzY3JpYmUgcmVsb2NzIHRoYXQgbXVzdCBiZQotCWNyZWF0ZWQgYnkgdGhlIEJGRCBiYWNrZW5kLCBidXQgZG8gbm90IGNvcnJlc3BvbmQgdG8gYW55IGlucHV0Ci0JZmlsZTsgdGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgLVVyLCB3aGljaCBidWlsZHMgY29uc3RydWN0b3JzCi0Jd2hpbGUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZS4KLQotSU5PREUKLVJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZSwgSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlciwgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluawotU1VCU1VCU0VDVElPTgotCVJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMKLQotCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIHNob3VsZCBsb29rIHRocm91Z2ggdGhlCi0JPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoIHNlY3Rpb24gb2YgdGhlCi0Jb3V0cHV0IGZpbGUuICBFYWNoIDw8bGlua19vcmRlcj4+IHN0cnVjdHVyZSBzaG91bGQgZWl0aGVyIGJlCi0JaGFuZGxlZCBzcGVjaWFsbHksIG9yIGl0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uCi0JPDxfYmZkX2RlZmF1bHRfbGlua19vcmRlcj4+IHdoaWNoIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nCi0JKDw8X2JmZF9kZWZhdWx0X2xpbmtfb3JkZXI+PiBpcyBkZWZpbmVkIGluIDw8bGlua2VyLmM+PikuCi0KLQlGb3IgZWZmaWNpZW5jeSwgYSA8PGxpbmtfb3JkZXI+PiBvZiB0eXBlCi0JPDxiZmRfaW5kaXJlY3RfbGlua19vcmRlcj4+IHdob3NlIGFzc29jaWF0ZWQgc2VjdGlvbiBiZWxvbmdzCi0JdG8gYSBCRkQgb2YgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvdXRwdXQgQkZEIG11c3QgYmUgaGFuZGxlZAotCXNwZWNpYWxseS4gIFRoaXMgdHlwZSBvZiA8PGxpbmtfb3JkZXI+PiBkZXNjcmliZXMgcGFydCBvZiBhbgotCW91dHB1dCBzZWN0aW9uIGluIHRlcm1zIG9mIGEgc2VjdGlvbiBiZWxvbmdpbmcgdG8gb25lIG9mIHRoZQotCWlucHV0IGZpbGVzLiAgVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24gc2hvdWxkIHJlYWQgdGhlCi0JY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYW5kIGFueSBhc3NvY2lhdGVkIHJlbG9jcywgYXBwbHkgdGhlCi0JcmVsb2NzIHRvIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBhbmQgd3JpdGUgb3V0IHRoZSBtb2RpZmllZAotCXNlY3Rpb24gY29udGVudHMuICBJZiBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZQotCXJlbG9jcyB0aGVtc2VsdmVzIG11c3QgYWxzbyBiZSBtb2RpZmllZCBhbmQgd3JpdHRlbiBvdXQuCi0KLUBmaW5kZXggX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotQGZpbmRleCBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQlUaGUgZnVuY3Rpb25zIDw8X2JmZF9yZWxvY2F0ZV9jb250ZW50cz4+IGFuZAotCTw8X2JmZF9maW5hbF9saW5rX3JlbG9jYXRlPj4gcHJvdmlkZSBzb21lIGdlbmVyYWwgc3VwcG9ydCBmb3IKLQlwZXJmb3JtaW5nIHRoZSBhY3R1YWwgcmVsb2NhdGlvbnMsIG5vdGFibHkgb3ZlcmZsb3cgY2hlY2tpbmcuCi0JVGhlaXIgYXJndW1lbnRzIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbCB0aGUKLQlyZWxvY2F0aW9uIGlzIGFnYWluc3QgYW5kIGEgPDxyZWxvY19ob3d0b190eXBlPj4gYXJndW1lbnQKLQl3aGljaCBkZXNjcmliZXMgdGhlIHJlbG9jYXRpb24gdG8gcGVyZm9ybS4gIFRoZXNlIGZ1bmN0aW9ucwotCWFyZSBkZWZpbmVkIGluIDw8cmVsb2MuYz4+LgotCi0JVGhlIGEub3V0IGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgcmVhZGluZywgcmVsb2NhdGluZywgYW5kCi0Jd3JpdGluZyBzZWN0aW9uIGNvbnRlbnRzIGlzIDw8YW91dF9saW5rX2lucHV0X3NlY3Rpb24+Pi4gIFRoZQotCWFjdHVhbCByZWxvY2F0aW9uIGlzIGRvbmUgaW4gPDxhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQ+PgotCWFuZCA8PGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dD4+LgotCi1JTk9ERQotV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlLCAsIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKLVNVQlNVQlNFQ1RJT04KLQlXcml0aW5nIHRoZSBzeW1ib2wgdGFibGUKLQotCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIG11c3QgZ2F0aGVyIGFsbCB0aGUgc3ltYm9scwotCWluIHRoZSBpbnB1dCBmaWxlcyBhbmQgd3JpdGUgdGhlbSBvdXQuICBJdCBtdXN0IGFsc28gd3JpdGUgb3V0Ci0JYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIFRoaXMgbXVzdCBiZQotCWNvbnRyb2xsZWQgYnkgdGhlIDw8c3RyaXA+PiBhbmQgPDxkaXNjYXJkPj4gZmllbGRzIG9mIHRoZQotCTw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZS4KLQotCVRoZSBsb2NhbCBzeW1ib2xzIG9mIHRoZSBpbnB1dCBmaWxlcyB3aWxsIG5vdCBoYXZlIGJlZW4KLQllbnRlcmVkIGludG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlIDw8X2JmZF9maW5hbF9saW5rPj4KLQlyb3V0aW5lIG11c3QgY29uc2lkZXIgZWFjaCBpbnB1dCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2xzCi0JaW4gdGhlIG91dHB1dCBmaWxlLiAgSXQgbWF5IGJlIGNvbnZlbmllbnQgdG8gZG8gdGhpcyB3aGVuCi0JbG9va2luZyB0aHJvdWdoIHRoZSA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmVzLCBvciBpdCBtYXkgYmUKLQlkb25lIGJ5IHN0ZXBwaW5nIHRocm91Z2ggdGhlIDw8aW5wdXRfYmZkcz4+IGxpc3QuCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIG11c3QgYWxzbyB0cmF2ZXJzZSB0aGUgZ2xvYmFsCi0JaGFzaCB0YWJsZSB0byBnYXRoZXIgYWxsIHRoZSBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gIEl0Ci0JaXMgcG9zc2libGUgdGhhdCBtb3N0IG9mIHRoZSBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scyBtYXkgYmUKLQl3cml0dGVuIG91dCB3aGVuIGNvbnNpZGVyaW5nIHRoZSBzeW1ib2xzIG9mIGVhY2ggaW5wdXQgZmlsZSwKLQlidXQgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5IHRvIHRyYXZlcnNlIHRoZSBoYXNoIHRhYmxlIHNpbmNlIHRoZQotCWxpbmtlciBzY3JpcHQgbWF5IGhhdmUgZGVmaW5lZCBzb21lIHN5bWJvbHMgdGhhdCBhcmUgbm90IGluCi0JYW55IG9mIHRoZSBpbnB1dCBmaWxlcy4KLQotCVRoZSA8PHN0cmlwPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQotCWNvbnRyb2xzIHdoaWNoIHN5bWJvbHMgYXJlIHdyaXR0ZW4gb3V0LiAgVGhlIHBvc3NpYmxlIHZhbHVlcwotCWFyZSBsaXN0ZWQgaW4gPDxiZmRsaW5rLmg+Pi4gIElmIHRoZSB2YWx1ZSBpcyA8PHN0cmlwX3NvbWU+PiwKLQl0aGVuIHRoZSA8PGtlZXBfaGFzaD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PgotCXN0cnVjdHVyZSBpcyBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scyB0byBrZWVwOyBlYWNoIHN5bWJvbAotCXNob3VsZCBiZSBsb29rZWQgdXAgaW4gdGhpcyBoYXNoIHRhYmxlLCBhbmQgb25seSBzeW1ib2xzIHdoaWNoCi0JYXJlIHByZXNlbnQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotCUlmIHRoZSA8PHN0cmlwPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQotCXBlcm1pdHMgbG9jYWwgc3ltYm9scyB0byBiZSB3cml0dGVuIG91dCwgdGhlIDw8ZGlzY2FyZD4+IGZpZWxkCi0JaXMgdXNlZCB0byBmdXJ0aGVyIGNvbnRyb2xzIHdoaWNoIGxvY2FsIHN5bWJvbHMgYXJlIGluY2x1ZGVkCi0JaW4gdGhlIG91dHB1dCBmaWxlLiAgSWYgdGhlIHZhbHVlIGlzIDw8ZGlzY2FyZF9sPj4sIHRoZW4gYWxsCi0JbG9jYWwgc3ltYm9scyB3aGljaCBiZWdpbiB3aXRoIGEgY2VydGFpbiBwcmVmaXggYXJlIGRpc2NhcmRlZDsKLQl0aGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIDw8YmZkX2lzX2xvY2FsX2xhYmVsX25hbWU+PiBlbnRyeSBwb2ludC4KLQotCVRoZSBhLm91dCBiYWNrZW5kIGhhbmRsZXMgc3ltYm9scyBieSBjYWxsaW5nCi0JPDxhb3V0X2xpbmtfd3JpdGVfc3ltYm9scz4+IG9uIGVhY2ggaW5wdXQgQkZEIGFuZCB0aGVuCi0JdHJhdmVyc2luZyB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgd2l0aCB0aGUgZnVuY3Rpb24KLQk8PGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2w+Pi4gIEl0IGJ1aWxkcyBhIHN0cmluZyB0YWJsZQotCXdoaWxlIHdyaXRpbmcgb3V0IHRoZSBzeW1ib2xzLCB3aGljaCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQKLQlmaWxlIGF0IHRoZSBlbmQgb2YgPDxOQU1FKGFvdXQsZmluYWxfbGluayk+Pi4KLSovCi0KLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuIGNvbGxlY3QpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkLCBib29sZWFuIGNvbGxlY3QpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF9zaXplX3R5cGUgY291bnQsIGFzeW1ib2wgKiosCi0JICAgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYmZkICpoYXNoX2VudHJ5X2JmZCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCBzZXRfc3ltYm9sX2Zyb21faGFzaAotICBQQVJBTVMgKChhc3ltYm9sICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHNpemVfdCAqcHN5bWFsbG9jLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIGRlZmF1bHRfZmlsbF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJvb2xlYW4pKTsKLQotLyogVGhlIGxpbmsgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBiZmRsaW5rLmguICBJdCBwcm92aWRlcwotICAgYSBiYXNlIGhhc2ggdGFibGUgd2hpY2ggdGhlIGJhY2tlbmQgc3BlY2lmaWMgaGFzaCB0YWJsZXMgYXJlIGJ1aWx0Ci0gICB1cG9uLiAgKi8KLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50eXBlID0gYmZkX2xpbmtfaGFzaF9uZXc7Ci0gICAgICByZXQtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBsaW5rIGhhc2ggdGFibGUuICBUaGUgQkZEIGFyZ3VtZW50IGlzIHRoZSBvbmUKLSAgIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+Y3JlYXRvciA9IGFiZmQtPnh2ZWM7Ci0gIHRhYmxlLT51bmRlZnMgPSBOVUxMOwotICB0YWJsZS0+dW5kZWZzX3RhaWwgPSBOVUxMOwotICByZXR1cm4gYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT50YWJsZSwgbmV3ZnVuYyk7Ci19Ci0KLS8qIExvb2sgdXAgYSBzeW1ib2wgaW4gYSBsaW5rIGhhc2ggdGFibGUuICBJZiBmb2xsb3cgaXMgdHJ1ZSwgd2UKLSAgIGZvbGxvdyBiZmRfbGlua19oYXNoX2luZGlyZWN0IGFuZCBiZmRfbGlua19oYXNoX3dhcm5pbmcgbGlua3MgdG8KLSAgIHRoZSByZWFsIHN5bWJvbC4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoKLWJmZF9saW5rX2hhc2hfbG9va3VwICh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gZm9sbG93OwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbG9va3VwICgmdGFibGUtPnRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkpOwotCi0gIGlmIChmb2xsb3cgJiYgcmV0ICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHdoaWxlIChyZXQtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSAgICAgfHwgcmV0LT50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQlyZXQgPSByZXQtPnUuaS5saW5rOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBMb29rIHVwIGEgc3ltYm9sIGluIHRoZSBtYWluIGxpbmtlciBoYXNoIHRhYmxlIGlmIHRoZSBzeW1ib2wgbWlnaHQKLSAgIGJlIHdyYXBwZWQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHJlZmVyZW5jZXMgdG8gYW4KLSAgIHVuZGVmaW5lZCBzeW1ib2wsIG5vdCBmb3IgZGVmaW5pdGlvbnMgb2YgYSBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqCi1iZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gZm9sbG93OwotewotICBpZiAoaW5mby0+d3JhcF9oYXNoICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbDsKLQotICAgICAgbCA9IHN0cmluZzsKLSAgICAgIGlmICgqbCA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpKQotCSsrbDsKLQotI3VuZGVmIFdSQVAKLSNkZWZpbmUgV1JBUCAiX193cmFwXyIKLQotICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+d3JhcF9oYXNoLCBsLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCi0JewotCSAgY2hhciAqbjsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBiZWluZyB3cmFwcGVkLiAgV2Ugd2FudCB0byByZXBsYWNlIGFsbAotICAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gU1lNIHdpdGggcmVmZXJlbmNlcyB0byBfX3dyYXBfU1lNLiAgKi8KLQotCSAgbiA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobCkgKyBzaXplb2YgV1JBUCArIDEpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIC8qIE5vdGUgdGhhdCBzeW1ib2xfbGVhZGluZ19jaGFyIG1heSBiZSAnXDAnLiAgKi8KLQkgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOwotCSAgblsxXSA9ICdcMCc7Ci0JICBzdHJjYXQgKG4sIFdSQVApOwotCSAgc3RyY2F0IChuLCBsKTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbiwgY3JlYXRlLCB0cnVlLCBmb2xsb3cpOwotCSAgZnJlZSAobik7Ci0JICByZXR1cm4gaDsKLQl9Ci0KLSN1bmRlZiBXUkFQCi0KLSN1bmRlZiBSRUFMCi0jZGVmaW5lIFJFQUwgIl9fcmVhbF8iCi0KLSAgICAgIGlmICgqbCA9PSAnXycKLQkgICYmIHN0cm5jbXAgKGwsIFJFQUwsIHNpemVvZiBSRUFMIC0gMSkgPT0gMAotCSAgJiYgYmZkX2hhc2hfbG9va3VwIChpbmZvLT53cmFwX2hhc2gsIGwgKyBzaXplb2YgUkVBTCAtIDEsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCi0JewotCSAgY2hhciAqbjsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIF9fcmVhbF9TWU0sIHdoZXJlIFNZTSBpcyBiZWluZwotICAgICAgICAgICAgIHdyYXBwZWQuICBXZSB3YW50IHRvIHJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gX19yZWFsX1NZTQotICAgICAgICAgICAgIHdpdGggcmVmZXJlbmNlcyB0byBTWU0uICAqLwotCi0JICBuID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChsICsgc2l6ZW9mIFJFQUwgLSAxKSArIDIpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIC8qIE5vdGUgdGhhdCBzeW1ib2xfbGVhZGluZ19jaGFyIG1heSBiZSAnXDAnLiAgKi8KLQkgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOwotCSAgblsxXSA9ICdcMCc7Ci0JICBzdHJjYXQgKG4sIGwgKyBzaXplb2YgUkVBTCAtIDEpOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuLCBjcmVhdGUsIHRydWUsIGZvbGxvdyk7Ci0JICBmcmVlIChuKTsKLQkgIHJldHVybiBoOwotCX0KLQotI3VuZGVmIFJFQUwKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KTsKLX0KLQotLyogVHJhdmVyc2UgYSBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5vdCBhCi0gICBtYWNybyBpcyB0byBkbyBiZXR0ZXIgdHlwZSBjaGVja2luZy4gIFRoaXMgY29kZSBwcmVzdW1lcyB0aGF0IGFuCi0gICBhcmd1bWVudCBwYXNzZWQgYXMgYSBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiBtYXkgYmUgY2F1Z2h0IGFzIGEKLSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogd2l0aCBubyBleHBsaWNpdCBjYXN0IHJlcXVpcmVkIG9uIHRoZQotICAgY2FsbC4gICovCi0KLXZvaWQgCi1iZmRfbGlua19oYXNoX3RyYXZlcnNlICh0YWJsZSwgZnVuYywgaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0gICAgIFBUUiBpbmZvOwotewotICBiZmRfaGFzaF90cmF2ZXJzZSAoJnRhYmxlLT50YWJsZSwKLQkJICAgICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkKLQkJICAgICAgZnVuYyksCi0JCSAgICAgaW5mbyk7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUgdW5kZWZzIGxpc3QuICAqLwotCi1JTkxJTkUgdm9pZAotYmZkX2xpbmtfYWRkX3VuZGVmICh0YWJsZSwgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgQkZEX0FTU0VSVCAoaC0+bmV4dCA9PSBOVUxMKTsKLSAgaWYgKHRhYmxlLT51bmRlZnNfdGFpbCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB0YWJsZS0+dW5kZWZzX3RhaWwtPm5leHQgPSBoOwotICBpZiAodGFibGUtPnVuZGVmcyA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB0YWJsZS0+dW5kZWZzID0gaDsKLSAgdGFibGUtPnVuZGVmc190YWlsID0gaDsKLX0KLQwKLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPndyaXR0ZW4gPSBmYWxzZTsKLSAgICAgIHJldC0+c3ltID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICBpZiAoISBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBHcmFiIHRoZSBzeW1ib2xzIGZvciBhbiBvYmplY3QgZmlsZSB3aGVuIGRvaW5nIGEgZ2VuZXJpYyBsaW5rLiAgV2UKLSAgIHN0b3JlIHRoZSBzeW1ib2xzIGluIHRoZSBvdXRzeW1ib2xzIGZpZWxkLiAgV2UgbmVlZCB0byBrZWVwIHRoZW0KLSAgIGFyb3VuZCBmb3IgdGhlIGVudGlyZSBsaW5rIHRvIGVuc3VyZSB0aGF0IHdlIG9ubHkgcmVhZCB0aGVtIG9uY2UuCi0gICBJZiB3ZSByZWFkIHRoZW0gbXVsdGlwbGUgdGltZXMsIHdlIG1pZ2h0IHdpbmQgdXAgd2l0aCByZWxvY3MgYW5kCi0gICB0aGUgaGFzaCB0YWJsZSBwb2ludGluZyB0byBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzeW1ib2wKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHsKLSAgICAgIGxvbmcgc3ltc2l6ZTsKLSAgICAgIGxvbmcgc3ltY291bnQ7Ci0KLSAgICAgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gICAgICBpZiAoc3ltc2l6ZSA8IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGFiZmQsIHN5bXNpemUpOwotICAgICAgaWYgKGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPT0gTlVMTCAmJiBzeW1zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSk7Ci0gICAgICBpZiAoc3ltY291bnQgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltY291bnQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogR2VuZXJpYyBmdW5jdGlvbiB0byBhZGQgc3ltYm9scyB0byBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZQotICAgZ2xvYmFsIGhhc2ggdGFibGUuICBUaGlzIHZlcnNpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSBjb2xsZWN0Ci0gICBjb25zdHJ1Y3RvcnMgYnkgbmFtZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCBmYWxzZSk7Ci19Ci0KLS8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gYWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsCi0gICBoYXNoIHRhYmxlLiAgVGhpcyB2ZXJzaW9uIGF1dG9tYXRpY2FsbHkgY29sbGVjdHMgY29uc3RydWN0b3JzIGJ5Ci0gICBuYW1lLCBhcyB0aGUgY29sbGVjdDIgcHJvZ3JhbSBkb2VzLiAgSXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFueQotICAgdGFyZ2V0IHdoaWNoIGRvZXMgbm90IHByb3ZpZGUgc29tZSBvdGhlciBtZWNoYW5pc20gZm9yIHNldHRpbmcgdXAKLSAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM7IHRoZXNlIGFyZSBhcHByb3hpbWF0ZWx5IHRob3NlIHRhcmdldHMKLSAgIGZvciB3aGljaCBnY2MgdXNlcyBjb2xsZWN0MiBhbmQgZG8gbm90IHN1cHBvcnQgc3RhYnMuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0IChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCB0cnVlKTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXQgPSBnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvLCBjb2xsZWN0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXQgPSAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCSAgICAgKGFiZmQsIGluZm8sCi0JICAgICAgKGNvbGxlY3QKLQkgICAgICAgPyBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QKLQkgICAgICAgOiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QpKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0IChhYmZkLCBpbmZvLAotCQkJCSAgICAgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGFiZmQpLAotCQkJCSAgICAgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCksCi0JCQkJICAgICAgIGNvbGxlY3QpOwotfQotDAotLyogV2UgYnVpbGQgYSBoYXNoIHRhYmxlIG9mIGFsbCBzeW1ib2xzIGRlZmluZWQgaW4gYW4gYXJjaGl2ZS4gICovCi0KLS8qIEFuIGFyY2hpdmUgc3ltYm9sIG1heSBiZSBkZWZpbmVkIGJ5IG11bHRpcGxlIGFyY2hpdmUgZWxlbWVudHMuCi0gICBUaGlzIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gaG9sZCB0aGUgZWxlbWVudHMuICAqLwotCi1zdHJ1Y3QgYXJjaGl2ZV9saXN0Ci17Ci0gIHN0cnVjdCBhcmNoaXZlX2xpc3QgKm5leHQ7Ci0gIGludCBpbmR4OwotfTsKLQotLyogQW4gZW50cnkgaW4gYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogV2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KLSAgc3RydWN0IGFyY2hpdmVfbGlzdCAqZGVmczsKLX07Ci0KLS8qIEFuIGFyY2hpdmUgaGFzaCB0YWJsZSBpdHNlbGYuICAqLwotCi1zdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmFyY2hpdmVfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhcmNoaXZlX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBDcmVhdGUgYSBuZXcgZW50cnkgZm9yIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotYXJjaGl2ZV9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+ZGVmcyA9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXJjaGl2ZV9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgcmV0dXJuIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIG5ld2Z1bmMpOwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYXJjaGl2ZV9oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBpbiBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZSh0LCBzaXplKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJih0KS0+dGFibGUsIChzaXplKSkKLQotLyogRnJlZSBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFyY2hpdmVfaGFzaF90YWJsZV9mcmVlKHQpIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCYodCktPnRhYmxlKQotCi0vKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGFkZCBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSBmaWxlIHRvIHRoZSBnbG9iYWwKLSAgIGhhc2ggZmlsZS4gIFRoaXMgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUKLSAgIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBpbiAodGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IHRoZQotICAgYmZkX2NoZWNrX2Zvcm1hdCBlbnRyeSBwb2ludCkuICBJdCBsb29rcyB0aHJvdWdoIHRoZSB1bmRlZmluZWQgYW5kCi0gICBjb21tb24gc3ltYm9scyBhbmQgc2VhcmNoZXMgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGZvciB0aGVtLiAgSWYKLSAgIGl0IGZpbmRzIGFuIGVudHJ5LCBpdCBpbmNsdWRlcyB0aGUgYXNzb2NpYXRlZCBvYmplY3QgZmlsZSBpbiB0aGUKLSAgIGxpbmsuCi0KLSAgIFRoZSBvbGQgbGlua2VyIGxvb2tlZCB0aHJvdWdoIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBmb3IKLSAgIHVuZGVmaW5lZCBzeW1ib2xzLiAgV2UgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQsIGxvb2tpbmcgdGhyb3VnaAotICAgdW5kZWZpbmVkIHN5bWJvbHMgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGUgYXJjaGl2ZS4gIFRoZQotICAgYWR2YW50YWdlIG9mIHRoZSBuZXdlciBzY2hlbWUgaXMgdGhhdCB3ZSBvbmx5IGhhdmUgdG8gbG9vayB0aHJvdWdoCi0gICB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scyBvbmNlLCB3aGVyZWFzIHRoZSBvbGQgbWV0aG9kIGhhZCB0bwotICAgcmUtc2VhcmNoIHRoZSBzeW1ib2wgdGFibGUgZWFjaCB0aW1lIGEgbmV3IG9iamVjdCBmaWxlIHdhcyBhZGRlZC4KLQotICAgVGhlIENIRUNLRk4gYXJndW1lbnQgaXMgdXNlZCB0byBzZWUgaWYgYW4gb2JqZWN0IGZpbGUgc2hvdWxkIGJlCi0gICBpbmNsdWRlZC4gIENIRUNLRk4gc2hvdWxkIHNldCAqUE5FRURFRCB0byB0cnVlIGlmIHRoZSBvYmplY3QgZmlsZQotICAgc2hvdWxkIGJlIGluY2x1ZGVkLCBhbmQgbXVzdCBhbHNvIGNhbGwgdGhlIGJmZF9saW5rX2luZm8KLSAgIGFkZF9hcmNoaXZlX2VsZW1lbnQgY2FsbGJhY2sgZnVuY3Rpb24gYW5kIGhhbmRsZSBhZGRpbmcgdGhlIHN5bWJvbHMKLSAgIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIENIRUNLRk4gc2hvdWxkIG9ubHkgcmV0dXJuIGZhbHNlIGlmIHNvbWUKLSAgIHNvcnQgb2YgZXJyb3Igb2NjdXJzLgotCi0gICBGb3Igc29tZSBmb3JtYXRzLCBzdWNoIGFzIGEub3V0LCBpdCBpcyBwb3NzaWJsZSB0byBsb29rIHRocm91Z2ggYW4KLSAgIG9iamVjdCBmaWxlIGJ1dCBub3QgYWN0dWFsbHkgaW5jbHVkZSBpdCBpbiB0aGUgbGluay4gIFRoZQotICAgYXJjaGl2ZV9wYXNzIGZpZWxkIGluIGEgQkZEIGlzIHVzZWQgdG8gYXZvaWQgY2hlY2tpbmcgdGhlIHN5bWJvbHMKLSAgIG9mIGFuIG9iamVjdCBmaWxlcyB0b28gbWFueSB0aW1lcy4gIFdoZW4gYW4gb2JqZWN0IGlzIGluY2x1ZGVkIGluCi0gICB0aGUgbGluaywgYXJjaGl2ZV9wYXNzIGlzIHNldCB0byAtMS4gIElmIGFuIG9iamVjdCBpcyBzY2FubmVkIGJ1dAotICAgbm90IGluY2x1ZGVkLCBhcmNoaXZlX3Bhc3MgaXMgc2V0IHRvIHRoZSBwYXNzIG51bWJlci4gIFRoZSBwYXNzCi0gICBudW1iZXIgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgbmV3IG9iamVjdCBmaWxlIGlzIGluY2x1ZGVkLiAgVGhlCi0gICBwYXNzIG51bWJlciBpcyB1c2VkIGJlY2F1c2Ugd2hlbiBhIG5ldyBvYmplY3QgZmlsZSBpcyBpbmNsdWRlZCBpdAotICAgbWF5IGNyZWF0ZSBuZXcgdW5kZWZpbmVkIHN5bWJvbHMgd2hpY2ggY2F1c2UgYSBwcmV2aW91c2x5IGV4YW1pbmVkCi0gICBvYmplY3QgZmlsZSB0byBiZSBpbmNsdWRlZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8sIGNoZWNrZm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKCpjaGVja2ZuKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgYm9vbGVhbiAqcG5lZWRlZCkpOwotewotICBjYXJzeW0gKmFyc3ltczsKLSAgY2Fyc3ltICphcnN5bV9lbmQ7Ci0gIHJlZ2lzdGVyIGNhcnN5bSAqYXJzeW07Ci0gIGludCBwYXNzOwotICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlIGFyc3ltX2hhc2g7Ci0gIGludCBpbmR4OwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKnB1bmRlZjsKLQotICBpZiAoISBiZmRfaGFzX21hcCAoYWJmZCkpCi0gICAgewotICAgICAgLyogQW4gZW1wdHkgYXJjaGl2ZSBpcyBhIHNwZWNpYWwgY2FzZS4gICovCi0gICAgICBpZiAoYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKSA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYXJzeW1zID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0gIGFyc3ltX2VuZCA9IGFyc3ltcyArIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZfY291bnQ7Ci0KLSAgLyogSW4gb3JkZXIgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciBhbiBzeW1ib2wgaXMgZGVmaW5lZCBpbgotICAgICB0aGlzIGFyY2hpdmUsIHdlIGJ1aWxkIGEgaGFzaCB0YWJsZSBvZiB0aGUgc3ltYm9scy4gICovCi0gIGlmICghIGFyY2hpdmVfaGFzaF90YWJsZV9pbml0ICgmYXJzeW1faGFzaCwgYXJjaGl2ZV9oYXNoX25ld2Z1bmMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChhcnN5bSA9IGFyc3ltcywgaW5keCA9IDA7IGFyc3ltIDwgYXJzeW1fZW5kOyBhcnN5bSsrLCBpbmR4KyspCi0gICAgewotICAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqYXJoOwotICAgICAgc3RydWN0IGFyY2hpdmVfbGlzdCAqbCwgKipwcDsKLQotICAgICAgYXJoID0gYXJjaGl2ZV9oYXNoX2xvb2t1cCAoJmFyc3ltX2hhc2gsIGFyc3ltLT5uYW1lLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoYXJoID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsID0gKChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopCi0JICAgYXJjaGl2ZV9oYXNoX2FsbG9jYXRlICgmYXJzeW1faGFzaCwgc2l6ZW9mIChzdHJ1Y3QgYXJjaGl2ZV9saXN0KSkpOwotICAgICAgaWYgKGwgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGwtPmluZHggPSBpbmR4OwotICAgICAgZm9yIChwcCA9ICZhcmgtPmRlZnM7Ci0JICAgKnBwICE9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7Ci0JICAgcHAgPSAmKCpwcCktPm5leHQpCi0JOwotICAgICAgKnBwID0gbDsKLSAgICAgIGwtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICAvKiBUaGUgYXJjaGl2ZV9wYXNzIGZpZWxkIGluIHRoZSBhcmNoaXZlIGl0c2VsZiBpcyB1c2VkIHRvCi0gICAgIGluaXRpYWxpemUgUEFTUywgc2luZSB3ZSBtYXkgc2VhcmNoIHRoZSBzYW1lIGFyY2hpdmUgbXVsdGlwbGUKLSAgICAgdGltZXMuICAqLwotICBwYXNzID0gYWJmZC0+YXJjaGl2ZV9wYXNzICsgMTsKLQotICAvKiBOZXcgdW5kZWZpbmVkIHN5bWJvbHMgYXJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHNvIHdlCi0gICAgIG9ubHkgbmVlZCB0byBsb29rIHRocm91Z2ggaXQgb25jZS4gICovCi0gIHB1bmRlZiA9ICZpbmZvLT5oYXNoLT51bmRlZnM7Ci0gIHdoaWxlICgqcHVuZGVmICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqYXJoOwotICAgICAgc3RydWN0IGFyY2hpdmVfbGlzdCAqbDsKLQotICAgICAgaCA9ICpwdW5kZWY7Ci0KLSAgICAgIC8qIFdoZW4gYSBzeW1ib2wgaXMgZGVmaW5lZCwgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbQotCSB0aGUgbGlzdC4gICovCi0gICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl7Ci0JICAvKiBSZW1vdmUgdGhpcyBlbnRyeSBmcm9tIHRoZSBsaXN0LCBmb3IgZ2VuZXJhbCBjbGVhbmxpbmVzcwotCSAgICAgYW5kIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGxvb2sgdGhyb3VnaCB0aGUgbGlzdCBhZ2FpbgotCSAgICAgaWYgd2Ugc2VhcmNoIGFueSBtb3JlIGxpYnJhcmllcy4gIFdlIGNhbid0IHJlbW92ZSB0aGUKLQkgICAgIGVudHJ5IGlmIGl0IGlzIHRoZSB0YWlsLCBiZWNhdXNlIHRoYXQgd291bGQgbG9zZSBhbnkKLQkgICAgIGVudHJpZXMgd2UgYWRkIHRvIHRoZSBsaXN0IGxhdGVyIG9uIChpdCB3b3VsZCBhbHNvIGNhdXNlCi0JICAgICB1cyB0byBsb3NlIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHN5bWJvbCBoYXMgYmVlbgotCSAgICAgcmVmZXJlbmNlZCkuICAqLwotCSAgaWYgKCpwdW5kZWYgIT0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwpCi0JICAgICpwdW5kZWYgPSAoKnB1bmRlZiktPm5leHQ7Ci0JICBlbHNlCi0JICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBhcmNoaXZlIHN5bWJvbCBtYXAuICAqLwotICAgICAgYXJoID0gYXJjaGl2ZV9oYXNoX2xvb2t1cCAoJmFyc3ltX2hhc2gsIGgtPnJvb3Quc3RyaW5nLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGFyaCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotCXsKLQkgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgYXQgYWxsIHRoZSBvYmplY3RzIHdoaWNoIGRlZmluZSB0aGlzIHN5bWJvbC4gICovCi0gICAgICBmb3IgKGwgPSBhcmgtPmRlZnM7IGwgIT0gKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0JewotCSAgYmZkICplbGVtZW50OwotCSAgYm9vbGVhbiBuZWVkZWQ7Ci0KLQkgIC8qIElmIHRoZSBzeW1ib2wgaGFzIGdvdHRlbiBkZWZpbmVkIGFsb25nIHRoZSB3YXksIHF1aXQuICAqLwotCSAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICBicmVhazsKLQotCSAgZWxlbWVudCA9IGJmZF9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBsLT5pbmR4KTsKLQkgIGlmIChlbGVtZW50ID09IChiZmQgKikgTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIElmIHdlJ3ZlIGFscmVhZHkgaW5jbHVkZWQgdGhpcyBlbGVtZW50LCBvciBpZiB3ZSd2ZQotCSAgICAgYWxyZWFkeSBjaGVja2VkIGl0IG9uIHRoaXMgcGFzcywgY29udGludWUuICAqLwotCSAgaWYgKGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9PSAtMQotCSAgICAgIHx8IGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9PSBwYXNzKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgd2UgY2FuJ3QgZmlndXJlIHRoaXMgZWxlbWVudCBvdXQsIGp1c3QgaWdub3JlIGl0LiAgKi8KLQkgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGVsZW1lbnQsIGJmZF9vYmplY3QpKQotCSAgICB7Ci0JICAgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogQ0hFQ0tGTiB3aWxsIHNlZSBpZiB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIGluY2x1ZGVkLCBhbmQKLQkgICAgIGdvIGFoZWFkIGFuZCBpbmNsdWRlIGl0IGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgIGlmICghICgqY2hlY2tmbikgKGVsZW1lbnQsIGluZm8sICZuZWVkZWQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKCEgbmVlZGVkKQotCSAgICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSBwYXNzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gLTE7Ci0KLQkgICAgICAvKiBJbmNyZW1lbnQgdGhlIHBhc3MgY291bnQgdG8gc2hvdyB0aGF0IHdlIG1heSBuZWVkIHRvCi0JCSByZWNoZWNrIG9iamVjdCBmaWxlcyB3aGljaCB3ZXJlIGFscmVhZHkgY2hlY2tlZC4gICovCi0JICAgICAgKytwYXNzOwotCSAgICB9Ci0JfQotCi0gICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotICAgIH0KLQotICBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSAoJmFyc3ltX2hhc2gpOwotCi0gIC8qIFNhdmUgUEFTUyBpbiBjYXNlIHdlIGFyZSBjYWxsZWQgYWdhaW4uICAqLwotICBhYmZkLT5hcmNoaXZlX3Bhc3MgPSBwYXNzOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSAoJmFyc3ltX2hhc2gpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBTZWUgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgYW4gYXJjaGl2ZSBlbGVtZW50LiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQKLSAgIHdoZW4gd2UgZG8gbm90IHdhbnQgdG8gYXV0b21hdGljYWxseSBjb2xsZWN0IGNvbnN0cnVjdG9ycyBiYXNlZCBvbgotICAgdGhlIHN5bWJvbCBuYW1lLCBwcmVzdW1hYmx5IGJlY2F1c2Ugd2UgaGF2ZSBzb21lIG90aGVyIG1lY2hhbmlzbQotICAgZm9yIGZpbmRpbmcgdGhlbS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCBmYWxzZSk7Ci19Ci0KLS8qIFNlZSBpZiB3ZSBzaG91bGQgaW5jbHVkZSBhbiBhcmNoaXZlIGVsZW1lbnQuICBUaGlzIHZlcnNpb24gaXMgdXNlZAotICAgd2hlbiB3ZSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYmFzZWQgb24gdGhlCi0gICBzeW1ib2wgbmFtZSwgYXMgY29sbGVjdDIgZG9lcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCB0cnVlKTsKLX0KLQotLyogU2VlIGlmIHdlIHNob3VsZCBpbmNsdWRlIGFuIGFyY2hpdmUgZWxlbWVudC4gIE9wdGlvbmFsbHkgY29sbGVjdAotICAgY29uc3RydWN0b3JzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQsIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgYXN5bWJvbCAqKnBwLCAqKnBwZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBwID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpOwotICBwcGVuZCA9IHBwICsgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgZm9yICg7IHBwIDwgcHBlbmQ7IHBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqcDsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBwID0gKnBwOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGdsb2JhbGx5IHZpc2libGUgc3ltYm9scy4gICovCi0gICAgICBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHAtPnNlY3Rpb24pCi0JICAmJiAocC0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9JTkRJUkVDVCB8IEJTRl9XRUFLKSkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpZiB3ZSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGlzCi0JIHN5bWJvbCwgYW5kIGl0IGlzIHVuZGVmaW5lZCBvciBjb21tb24uICBBbiB1bmRlZmluZWQgd2VhawotCSBzeW1ib2wgKHR5cGUgYmZkX2xpbmtfaGFzaF91bmRlZndlYWspIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlCi0JIGEgcmVmZXJlbmNlIHdoZW4gcHVsbGluZyBmaWxlcyBvdXQgb2YgYW4gYXJjaGl2ZS4gIFNlZSB0aGUKLQkgU1ZSNCBBQkksIHAuIDQtMjcuICAqLwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBiZmRfYXN5bWJvbF9uYW1lIChwKSwgZmFsc2UsCi0JCQkJZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFAgaXMgYSBzeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLQotICAgICAgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0KLQkgIC8qIFRoaXMgb2JqZWN0IGZpbGUgZGVmaW5lcyB0aGlzIHN5bWJvbCwgc28gcHVsbCBpdCBpbi4gICovCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsCi0JCQkJCQkJIGJmZF9hc3ltYm9sX25hbWUgKHApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3ltY291bnQgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGFiZmQpOwotCSAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLQkgIGlmICghIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QgKGFiZmQsIGluZm8sIHN5bWNvdW50LAotCQkJCQkgICAgICBzeW1ib2xzLCBjb2xsZWN0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKnBuZWVkZWQgPSB0cnVlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBQIGlzIGEgY29tbW9uIHN5bWJvbC4gICovCi0KLSAgICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIGJmZCAqc3ltYmZkOwotCSAgYmZkX3ZtYSBzaXplOwotCSAgdW5zaWduZWQgaW50IHBvd2VyOwotCi0JICBzeW1iZmQgPSBoLT51LnVuZGVmLmFiZmQ7Ci0JICBpZiAoc3ltYmZkID09IChiZmQgKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIGFzIHVuZGVmaW5lZCBmcm9tIG91dHNpZGUKLQkJIEJGRC4gIFdlIGFzc3VtZSB0aGF0IHdlIHNob3VsZCBsaW5rIGluIHRoZSBvYmplY3QKLQkJIGZpbGUuICBUaGlzIGlzIGZvciB0aGUgLXUgb3B0aW9uIGluIHRoZSBsaW5rZXIuICAqLwotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KQotCQkgIChpbmZvLCBhYmZkLCBiZmRfYXN5bWJvbF9uYW1lIChwKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogVHVybiB0aGUgc3ltYm9sIGludG8gYSBjb21tb24gc3ltYm9sIGJ1dCBkbyBub3QgbGluayBpbgotCSAgICAgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpcyBob3cgYS5vdXQgd29ya3MuICBPYmplY3QKLQkgICAgIGZvcm1hdHMgdGhhdCByZXF1aXJlIGRpZmZlcmVudCBzZW1hbnRpY3MgbXVzdCBpbXBsZW1lbnQKLQkgICAgIHRoaXMgZnVuY3Rpb24gZGlmZmVyZW50bHkuICBUaGlzIHN5bWJvbCBpcyBhbHJlYWR5IG9uIHRoZQotCSAgICAgdW5kZWZzIGxpc3QuICBXZSBhZGQgdGhlIHNlY3Rpb24gdG8gYSBjb21tb24gc2VjdGlvbgotCSAgICAgYXR0YWNoZWQgdG8gc3ltYmZkIHRvIGVuc3VyZSB0aGF0IGl0IGlzIGluIGEgQkZEIHdoaWNoCi0JICAgICB3aWxsIGJlIGxpbmtlZCBpbi4gICovCi0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9jb21tb247Ci0JICBoLT51LmMucCA9Ci0JICAgICgoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5ICopCi0JICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCXNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5KSkpOwotCSAgaWYgKGgtPnUuYy5wID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc2l6ZSA9IGJmZF9hc3ltYm9sX3ZhbHVlIChwKTsKLQkgIGgtPnUuYy5zaXplID0gc2l6ZTsKLQotCSAgcG93ZXIgPSBiZmRfbG9nMiAoc2l6ZSk7Ci0JICBpZiAocG93ZXIgPiA0KQotCSAgICBwb3dlciA9IDQ7Ci0JICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7Ci0KLQkgIGlmIChwLT5zZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIpCi0JICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzeW1iZmQsICJDT01NT04iKTsKLQkgIGVsc2UKLQkgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwKLQkJCQkJCQkgIHAtPnNlY3Rpb24tPm5hbWUpOwotCSAgaC0+dS5jLnAtPnNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wgaWYgbmVjZXNzYXJ5LiAgVGhpcwotCSAgICAgaXMgaG93IGEub3V0IHdvcmtzLiAgT2JqZWN0IGZvcm1hdHMgdGhhdCByZXF1aXJlCi0JICAgICBkaWZmZXJlbnQgc2VtYW50aWNzIG11c3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24KLQkgICAgIGRpZmZlcmVudGx5LiAgKi8KLQkgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAocCkgPiBoLT51LmMuc2l6ZSkKLQkgICAgaC0+dS5jLnNpemUgPSBiZmRfYXN5bWJvbF92YWx1ZSAocCk7Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIGFyY2hpdmUgZWxlbWVudCBpcyBub3QgbmVlZGVkLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCB0aGUgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIEFCRkQKLSAgIGlzIHRoZSBvYmplY3QgZmlsZS4gIElORk8gaXMgdGhlIGxpbmtlciBpbmZvcm1hdGlvbi4gIFNZTUJPTF9DT1VOVAotICAgaXMgdGhlIG51bWJlciBvZiBzeW1ib2xzLiAgU1lNQk9MUyBpcyB0aGUgbGlzdCBvZiBzeW1ib2xzLiAgQ09MTEVDVAotICAgaXMgdHJ1ZSBpZiBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgY29sbGVjdGVkIGJ5IG5hbWUKLSAgIGFzIGlzIGRvbmUgYnkgY29sbGVjdDIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCAoYWJmZCwgaW5mbywgc3ltYm9sX2NvdW50LCBzeW1ib2xzLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWJvbF9jb3VudDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgYXN5bWJvbCAqKnBwLCAqKnBwZW5kOwotCi0gIHBwID0gc3ltYm9sczsKLSAgcHBlbmQgPSBzeW1ib2xzICsgc3ltYm9sX2NvdW50OwotICBmb3IgKDsgcHAgPCBwcGVuZDsgcHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwOwotCi0gICAgICBwID0gKnBwOwotCi0gICAgICBpZiAoKHAtPmZsYWdzICYgKEJTRl9JTkRJUkVDVAotCQkgICAgICAgfCBCU0ZfV0FSTklORwotCQkgICAgICAgfCBCU0ZfR0xPQkFMCi0JCSAgICAgICB8IEJTRl9DT05TVFJVQ1RPUgotCQkgICAgICAgfCBCU0ZfV0VBSykpICE9IDAKLQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKLQkgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQkgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHApOwotCSAgaWYgKCgocC0+ZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpICE9IDAKLQkgICAgICAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQkgICAgICAmJiBwcCArIDEgPCBwcGVuZCkKLQkgICAgewotCSAgICAgIHBwKys7Ci0JICAgICAgc3RyaW5nID0gYmZkX2FzeW1ib2xfbmFtZSAoKnBwKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKHAtPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDAKLQkJICAgJiYgcHAgKyAxIDwgcHBlbmQpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgbmFtZSBvZiBQIGlzIGFjdHVhbGx5IHRoZSB3YXJuaW5nIHN0cmluZywgYW5kIHRoZQotCQkgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuIGFib3V0LiAgKi8KLQkgICAgICBzdHJpbmcgPSBuYW1lOwotCSAgICAgIHBwKys7Ci0JICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpwcCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc3RyaW5nID0gTlVMTDsKLQotCSAgaCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCBuYW1lLCBwLT5mbGFncywgYmZkX2dldF9zZWN0aW9uIChwKSwKLQkJICBwLT52YWx1ZSwgc3RyaW5nLCBmYWxzZSwgY29sbGVjdCwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogSWYgdGhpcyBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCwgYW5kIHRoZSBsaW5rZXIgZGlkbid0IGRvCi0gICAgICAgICAgICAgYW55dGhpbmcgd2l0aCBpdCwgdGhlbiB3ZSB3YW50IHRvIGp1c3QgcGFzcyB0aGUgc3ltYm9sCi0gICAgICAgICAgICAgdGhyb3VnaCB0byB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIHdpbGwgaGFwcGVuIHdoZW4KLSAgICAgICAgICAgICBsaW5raW5nIHdpdGggLXIuICAqLwotCSAgaWYgKChwLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotCSAgICAgICYmIChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KSkKLQkgICAgewotCSAgICAgIHAtPnVkYXRhLnAgPSBOVUxMOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFNhdmUgdGhlIEJGRCBzeW1ib2wgc28gdGhhdCB3ZSBkb24ndCBsb3NlIGFueSBiYWNrZW5kCi0JICAgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSBhdHRhY2hlZCB0byBpdC4gIFdlIG9ubHkKLQkgICAgIHdhbnQgdGhpcyBvbmUgaWYgaXQgZ2l2ZXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZQotCSAgICAgZXhpc3Rpbmcgb25lOyB3ZSBkb24ndCB3YW50IHRvIHJlcGxhY2UgYSBkZWZpbmVkIHN5bWJvbAotCSAgICAgd2l0aCBhbiB1bmRlZmluZWQgb25lLiAgVGhpcyByb3V0aW5lIG1heSBiZSBjYWxsZWQgd2l0aCBhCi0JICAgICBoYXNoIHRhYmxlIG90aGVyIHRoYW4gdGhlIGdlbmVyaWMgaGFzaCB0YWJsZSwgc28gd2Ugb25seQotCSAgICAgZG8gdGhpcyBpZiB3ZSBhcmUgY2VydGFpbiB0aGF0IHRoZSBoYXNoIHRhYmxlIGlzIGEKLQkgICAgIGdlbmVyaWMgb25lLiAgKi8KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+c3ltID09IChhc3ltYm9sICopIE5VTEwKLQkJICB8fCAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JCSAgICAgICYmICghIGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKLQkJCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKGgtPnN5bSkpKSkpCi0JCXsKLQkJICBoLT5zeW0gPSBwOwotCQkgIC8qIEJTRl9PTERfQ09NTU9OIGlzIGEgaGFjayB0byBzdXBwb3J0IENPRkYgcmVsb2MKLQkJICAgICByZWFkaW5nLCBhbmQgaXQgc2hvdWxkIGdvIGF3YXkgd2hlbiB0aGUgQ09GRgotCQkgICAgIGxpbmtlciBpcyBzd2l0Y2hlZCB0byB0aGUgbmV3IHZlcnNpb24uICAqLwotCQkgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpKQotCQkgICAgcC0+ZmxhZ3MgfD0gQlNGX09MRF9DT01NT047Ci0JCX0KLQkgICAgfQotCi0JICAvKiBTdG9yZSBhIGJhY2sgcG9pbnRlciBmcm9tIHRoZSBzeW1ib2wgdG8gdGhlIGhhc2gKLQkgICAgIHRhYmxlIGVudHJ5IGZvciB0aGUgYmVuZWZpdCBvZiByZWxheGF0aW9uIGNvZGUgdW50aWwKLQkgICAgIGl0IGdldHMgcmV3cml0dGVuIHRvIG5vdCB1c2UgYXN5bWJvbCBzdHJ1Y3R1cmVzLgotCSAgICAgU2V0dGluZyB0aGlzIGlzIGFsc28gdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXNlCi0JICAgICBzeW1ib2xzIHdlcmUgc2V0IHVwIGJ5IHRoZSBnZW5lcmljIGxpbmtlci4gICovCi0JICBwLT51ZGF0YS5wID0gKFBUUikgaDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgdXNlIGEgc3RhdGUgdGFibGUgdG8gZGVhbCB3aXRoIGFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgVGhlIGZpcnN0IGluZGV4IGludG8gdGhlIHN0YXRlIHRhYmxlIGRlc2NyaWJlcyB0aGUgc3ltYm9sCi0gICBmcm9tIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBzZWNvbmQgaW5kZXggaW50byB0aGUgc3RhdGUgdGFibGUgaXMgdGhlCi0gICB0eXBlIG9mIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotCi0vKiBUaGUgc3ltYm9sIGZyb20gdGhlIG9iamVjdCBmaWxlIGlzIHR1cm5lZCBpbnRvIG9uZSBvZiB0aGVzZSByb3cKLSAgIHZhbHVlcy4gICovCi0KLWVudW0gbGlua19yb3cKLXsKLSAgVU5ERUZfUk9XLAkJLyogVW5kZWZpbmVkLiAgKi8KLSAgVU5ERUZXX1JPVywJCS8qIFdlYWsgdW5kZWZpbmVkLiAgKi8KLSAgREVGX1JPVywJCS8qIERlZmluZWQuICAqLwotICBERUZXX1JPVywJCS8qIFdlYWsgZGVmaW5lZC4gICovCi0gIENPTU1PTl9ST1csCQkvKiBDb21tb24uICAqLwotICBJTkRSX1JPVywJCS8qIEluZGlyZWN0LiAgKi8KLSAgV0FSTl9ST1csCQkvKiBXYXJuaW5nLiAgKi8KLSAgU0VUX1JPVwkJLyogTWVtYmVyIG9mIHNldC4gICovCi19OwotCi0vKiBhcHBhcmVudGx5IG5lZWRlZCBmb3IgSGl0YWNoaSAzMDUwUihISS1VWC9XRTIpPyAqLwotI3VuZGVmIEZBSUwKLQotLyogVGhlIGFjdGlvbnMgdG8gdGFrZSBpbiB0aGUgc3RhdGUgdGFibGUuICAqLwotCi1lbnVtIGxpbmtfYWN0aW9uCi17Ci0gIEZBSUwsCQkvKiBBYm9ydC4gKi8KLSAgVU5ELAkJLyogTWFyayBzeW1ib2wgdW5kZWZpbmVkLiAgKi8KLSAgV0VBSywJCS8qIE1hcmsgc3ltYm9sIHdlYWsgdW5kZWZpbmVkLiAgKi8KLSAgREVGLAkJLyogTWFyayBzeW1ib2wgZGVmaW5lZC4gICovCi0gIERFRlcsCQkvKiBNYXJrIHN5bWJvbCB3ZWFrIGRlZmluZWQuICAqLwotICBDT00sCQkvKiBNYXJrIHN5bWJvbCBjb21tb24uICAqLwotICBSRUYsCQkvKiBNYXJrIGRlZmluZWQgc3ltYm9sIHJlZmVyZW5jZWQuICAqLwotICBDUkVGLAkJLyogUG9zc2libHkgd2FybiBhYm91dCBjb21tb24gcmVmZXJlbmNlIHRvIGRlZmluZWQgc3ltYm9sLiAgKi8KLSAgQ0RFRiwJCS8qIERlZmluZSBleGlzdGluZyBjb21tb24gc3ltYm9sLiAgKi8KLSAgTk9BQ1QsCS8qIE5vIGFjdGlvbi4gICovCi0gIEJJRywJCS8qIE1hcmsgc3ltYm9sIGNvbW1vbiB1c2luZyBsYXJnZXN0IHNpemUuICAqLwotICBNREVGLAkJLyogTXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gICovCi0gIE1JTkQsCQkvKiBNdWx0aXBsZSBpbmRpcmVjdCBzeW1ib2xzLiAgKi8KLSAgSU5ELAkJLyogTWFrZSBpbmRpcmVjdCBzeW1ib2wuICAqLwotICBDSU5ELAkJLyogTWFrZSBpbmRpcmVjdCBzeW1ib2wgZnJvbSBleGlzdGluZyBjb21tb24gc3ltYm9sLiAgKi8KLSAgU0VULAkJLyogQWRkIHZhbHVlIHRvIHNldC4gICovCi0gIE1XQVJOLAkvKiBNYWtlIHdhcm5pbmcgc3ltYm9sLiAgKi8KLSAgV0FSTiwJCS8qIElzc3VlIHdhcm5pbmcuICAqLwotICBDV0FSTiwJLyogV2FybiBpZiByZWZlcmVuY2VkLCBlbHNlIE1XQVJOLiAgKi8KLSAgQ1lDTEUsCS8qIFJlcGVhdCB3aXRoIHN5bWJvbCBwb2ludGVkIHRvLiAgKi8KLSAgUkVGQywJCS8qIE1hcmsgaW5kaXJlY3Qgc3ltYm9sIHJlZmVyZW5jZWQgYW5kIHRoZW4gQ1lDTEUuICAqLwotICBXQVJOQwkJLyogSXNzdWUgd2FybmluZyBhbmQgdGhlbiBDWUNMRS4gICovCi19OwotCi0vKiBUaGUgc3RhdGUgdGFibGUgaXRzZWxmLiAgVGhlIGZpcnN0IGluZGV4IGlzIGEgbGlua19yb3cgYW5kIHRoZQotICAgc2Vjb25kIGluZGV4IGlzIGEgYmZkX2xpbmtfaGFzaF90eXBlLiAgKi8KLQotc3RhdGljIGNvbnN0IGVudW0gbGlua19hY3Rpb24gbGlua19hY3Rpb25bOF1bOF0gPQotewotICAvKiBjdXJyZW50XHByZXYgICAgbmV3ICAgIHVuZGVmICB1bmRlZncgZGVmICAgIGRlZncgICBjb20gICAgaW5kciAgIHdhcm4gICovCi0gIC8qIFVOREVGX1JPVyAJKi8gIHtVTkQsICAgTk9BQ1QsIFVORCwgICBSRUYsICAgUkVGLCAgIE5PQUNULCBSRUZDLCAgV0FSTkMgfSwKLSAgLyogVU5ERUZXX1JPVwkqLyAge1dFQUssICBOT0FDVCwgTk9BQ1QsIFJFRiwgICBSRUYsICAgTk9BQ1QsIFJFRkMsICBXQVJOQyB9LAotICAvKiBERUZfUk9XIAkqLyAge0RFRiwgICBERUYsICAgREVGLCAgIE1ERUYsICBERUYsICAgQ0RFRiwgIE1ERUYsICBDWUNMRSB9LAotICAvKiBERUZXX1JPVyAJKi8gIHtERUZXLCAgREVGVywgIERFRlcsICBOT0FDVCwgTk9BQ1QsIE5PQUNULCBOT0FDVCwgQ1lDTEUgfSwKLSAgLyogQ09NTU9OX1JPVwkqLyAge0NPTSwgICBDT00sICAgQ09NLCAgIENSRUYsICBDUkVGLCAgQklHLCAgIFJFRkMsICBXQVJOQyB9LAotICAvKiBJTkRSX1JPVwkqLyAge0lORCwgICBJTkQsICAgSU5ELCAgIE1ERUYsICBJTkQsICAgQ0lORCwgIE1JTkQsICBDWUNMRSB9LAotICAvKiBXQVJOX1JPVyAgICovICB7TVdBUk4sIFdBUk4sICBXQVJOLCAgQ1dBUk4sIENXQVJOLCBXQVJOLCAgQ1dBUk4sIE1XQVJOIH0sCi0gIC8qIFNFVF9ST1cJKi8gIHtTRVQsICAgU0VULCAgIFNFVCwgICBTRVQsICAgU0VULCAgIFNFVCwgICBDWUNMRSwgQ1lDTEUgfQotfTsKLQotLyogTW9zdCBvZiB0aGUgZW50cmllcyBpbiB0aGUgTElOS19BQ1RJT04gdGFibGUgYXJlIHN0cmFpZ2h0Zm9yd2FyZCwKLSAgIGJ1dCBhIGZldyBhcmUgc29tZXdoYXQgc3VidGxlLgotCi0gICBBIHJlZmVyZW5jZSB0byBhbiBpbmRpcmVjdCBzeW1ib2wgKFVOREVGX1JPVy9pbmRyIG9yCi0gICBVTkRFRldfUk9XL2luZHIpIGlzIGNvdW50ZWQgYXMgYSByZWZlcmVuY2UgYm90aCB0byB0aGUgaW5kaXJlY3QKLSAgIHN5bWJvbCBhbmQgdG8gdGhlIHN5bWJvbCB0aGUgaW5kaXJlY3Qgc3ltYm9sIHBvaW50cyB0by4KLQotICAgQSByZWZlcmVuY2UgdG8gYSB3YXJuaW5nIHN5bWJvbCAoVU5ERUZfUk9XL3dhcm4gb3IgVU5ERUZXX1JPVy93YXJuKQotICAgY2F1c2VzIHRoZSB3YXJuaW5nIHRvIGJlIGlzc3VlZC4KLQotICAgQSBjb21tb24gZGVmaW5pdGlvbiBvZiBhbiBpbmRpcmVjdCBzeW1ib2wgKENPTU1PTl9ST1cvaW5kcikgaXMKLSAgIHRyZWF0ZWQgYXMgYSBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgTGlrZXdpc2UgZm9yIGFuIGluZGlyZWN0Ci0gICBkZWZpbml0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCAoSU5EUl9ST1cvY29tKS4KLQotICAgQW4gaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBhIHdhcm5pbmcgKElORFJfUk9XL3dhcm4pIGRvZXMgbm90IGNhdXNlCi0gICB0aGUgd2FybmluZyB0byBiZSBpc3N1ZWQuCi0KLSAgIElmIGEgd2FybmluZyBpcyBjcmVhdGVkIGZvciBhbiBpbmRpcmVjdCBzeW1ib2wgKFdBUk5fUk9XL2luZHIpIG5vCi0gICB3YXJuaW5nIGlzIGNyZWF0ZWQgZm9yIHRoZSBzeW1ib2wgdGhlIGluZGlyZWN0IHN5bWJvbCBwb2ludHMgdG8uCi0KLSAgIEFkZGluZyBhbiBlbnRyeSB0byBhIHNldCBkb2VzIG5vdCBjb3VudCBhcyBhIHJlZmVyZW5jZSB0byBhIHNldCwKLSAgIGFuZCBubyB3YXJuaW5nIGlzIGlzc3VlZCAoU0VUX1JPVy93YXJuKS4gICovCi0KLS8qIFJldHVybiB0aGUgQkZEIGluIHdoaWNoIGEgaGFzaCBlbnRyeSBoYXMgYmVlbiBkZWZpbmVkLCBpZiBrbm93bi4gICovCi0KLXN0YXRpYyBiZmQgKgotaGFzaF9lbnRyeV9iZmQgKGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotewotICB3aGlsZSAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0gICAgaCA9IGgtPnUuaS5saW5rOwotICBzd2l0Y2ggKGgtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICByZXR1cm4gaC0+dS51bmRlZi5hYmZkOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgcmV0dXJuIGgtPnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICByZXR1cm4gaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4KLSAgIEFCRkQgaXMgdGhlIEJGRCB0aGUgc3ltYm9sIGNvbWVzIGZyb20uCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCi0gICBGTEFHUyBpcyB0aGUgQlNGXyogYml0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbC4KLSAgIFNFQ1RJT04gaXMgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhlIHN5bWJvbCBpcyBkZWZpbmVkOyB0aGlzIG1heSBiZQotICAgICBiZmRfdW5kX3NlY3Rpb25fcHRyIG9yIGJmZF9jb21fc2VjdGlvbl9wdHIuCi0gICBWQUxVRSBpcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24uCi0gICBTVFJJTkcgaXMgdXNlZCBmb3IgZWl0aGVyIGFuIGluZGlyZWN0IHN5bWJvbCwgaW4gd2hpY2ggY2FzZSBpdCBpcwotICAgICB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIGluZGlyZWN0IHRvLCBvciBhIHdhcm5pbmcgc3ltYm9sLCBpbgotICAgICB3aGljaCBjYXNlIGl0IGlzIHRoZSB3YXJuaW5nIHN0cmluZy4KLSAgIENPUFkgaXMgdHJ1ZSBpZiBOQU1FIG9yIFNUUklORyBtdXN0IGJlIGNvcGllZCBpbnRvIGxvY2FsbHkKLSAgICAgYWxsb2NhdGVkIG1lbW9yeSBpZiB0aGV5IG5lZWQgdG8gYmUgc2F2ZWQuCi0gICBDT0xMRUNUIGlzIHRydWUgaWYgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBnY2MgY29uc3RydWN0b3IKLSAgICAgb3IgZGVzdHJ1Y3RvciBuYW1lcyBhcyBjb2xsZWN0MiBkb2VzLgotICAgSEFTSFAsIGlmIG5vdCBOVUxMLCBpcyBhIHBsYWNlIHRvIHN0b3JlIHRoZSBjcmVhdGVkIGhhc2ggdGFibGUKLSAgICAgZW50cnk7IGlmICpIQVNIUCBpcyBub3QgTlVMTCwgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBsb29rZWQgdXAKLSAgICAgdGhlIGhhc2ggdGFibGUgZW50cnksIGFuZCBzdG9yZWQgaXQgaW4gKkhBU0hQLiAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkJCSAgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBlbnVtIGxpbmtfcm93IHJvdzsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gY3ljbGU7Ci0KLSAgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgIHx8IChmbGFncyAmIEJTRl9JTkRJUkVDVCkgIT0gMCkKLSAgICByb3cgPSBJTkRSX1JPVzsKLSAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCi0gICAgcm93ID0gV0FSTl9ST1c7Ci0gIGVsc2UgaWYgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCkKLSAgICByb3cgPSBTRVRfUk9XOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHsKLSAgICAgIGlmICgoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMCkKLQlyb3cgPSBVTkRFRldfUk9XOwotICAgICAgZWxzZQotCXJvdyA9IFVOREVGX1JPVzsKLSAgICB9Ci0gIGVsc2UgaWYgKChmbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHJvdyA9IERFRldfUk9XOwotICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHJvdyA9IENPTU1PTl9ST1c7Ci0gIGVsc2UKLSAgICByb3cgPSBERUZfUk9XOwotCi0gIGlmIChoYXNocCAhPSBOVUxMICYmICpoYXNocCAhPSBOVUxMKQotICAgIGggPSAqaGFzaHA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocm93ID09IFVOREVGX1JPVyB8fCByb3cgPT0gVU5ERUZXX1JPVykKLQloID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotICAgICAgZWxzZQotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBpZiAoaGFzaHAgIT0gTlVMTCkKLQkgICAgKmhhc2hwID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5ub3RpY2VfYWxsCi0gICAgICB8fCAoaW5mby0+bm90aWNlX2hhc2ggIT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMCi0JICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpKQotICAgIHsKLSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5ub3RpY2UpIChpbmZvLCBoLT5yb290LnN0cmluZywgYWJmZCwgc2VjdGlvbiwKLQkJCQkJdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGhhc2hwICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkKLSAgICAqaGFzaHAgPSBoOwotCi0gIGRvCi0gICAgewotICAgICAgZW51bSBsaW5rX2FjdGlvbiBhY3Rpb247Ci0KLSAgICAgIGN5Y2xlID0gZmFsc2U7Ci0gICAgICBhY3Rpb24gPSBsaW5rX2FjdGlvblsoaW50KSByb3ddWyhpbnQpIGgtPnR5cGVdOwotICAgICAgc3dpdGNoIChhY3Rpb24pCi0JewotCWNhc2UgRkFJTDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBOT0FDVDoKLQkgIC8qIERvIG5vdGhpbmcuICAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIFVORDoKLQkgIC8qIE1ha2UgYSBuZXcgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT51LnVuZGVmLmFiZmQgPSBhYmZkOwotCSAgYmZkX2xpbmtfYWRkX3VuZGVmIChpbmZvLT5oYXNoLCBoKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBXRUFLOgotCSAgLyogTWFrZSBhIG5ldyB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOwotCSAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDREVGOgotCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIHdoaWNoIHdhcwotCSAgICAgcHJldmlvdXNseSBjb21tb24uICAqLwotCSAgQkZEX0FTU0VSVCAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkJIChpbmZvLCBoLT5yb290LnN0cmluZywKLQkJICBoLT51LmMucC0+c2VjdGlvbi0+b3duZXIsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBoLT51LmMuc2l6ZSwKLQkJICBhYmZkLCBiZmRfbGlua19oYXNoX2RlZmluZWQsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBERUY6Ci0JY2FzZSBERUZXOgotCSAgewotCSAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBvbGR0eXBlOwotCi0JICAgIC8qIERlZmluZSBhIHN5bWJvbC4gICovCi0JICAgIG9sZHR5cGUgPSBoLT50eXBlOwotCSAgICBpZiAoYWN0aW9uID09IERFRlcpCi0JICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmd2VhazsKLQkgICAgZWxzZQotCSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotCSAgICBoLT51LmRlZi52YWx1ZSA9IHZhbHVlOwotCi0JICAgIC8qIElmIHdlIGhhdmUgYmVlbiBhc2tlZCB0bywgd2UgYWN0IGxpa2UgY29sbGVjdDIgYW5kCi0JICAgICAgIGlkZW50aWZ5IGFsbCBmdW5jdGlvbnMgdGhhdCBtaWdodCBiZSBnbG9iYWwKLQkgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQgcGFzcyB0aGVtIHVwIGluIGEKLQkgICAgICAgY2FsbGJhY2suICBXZSBvbmx5IGRvIHRoaXMgZm9yIGNlcnRhaW4gb2JqZWN0IGZpbGUKLQkgICAgICAgdHlwZXMsIHNpbmNlIG1hbnkgb2JqZWN0IGZpbGUgdHlwZXMgY2FuIGhhbmRsZSB0aGlzCi0JICAgICAgIGF1dG9tYXRpY2FsbHkuICAqLwotCSAgICBpZiAoY29sbGVjdCAmJiBuYW1lWzBdID09ICdfJykKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKnM7Ci0KLQkJLyogQSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUgc3RhcnRzIGxpa2UgdGhpczoKLQkJICAgXytHTE9CQUxfW18uJF1bSURdW18uJF0gd2hlcmUgdGhlIGZpcnN0IFtfLiRdIGFuZAotCQkgICB0aGUgc2Vjb25kIGFyZSB0aGUgc2FtZSBjaGFyYWN0ZXIgKHdlIGFjY2VwdCBhbnkKLQkJICAgY2hhcmFjdGVyIHRoZXJlLCBpbiBjYXNlIGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdAotCQkgICBjb21lcyBhbG9uZyB3aXRoIGV2ZW4gd29yc2UgbmFtaW5nIHJlc3RyaWN0aW9ucykuICAqLwotCi0jZGVmaW5lIENPTlNfUFJFRklYICJHTE9CQUxfIgotI2RlZmluZSBDT05TX1BSRUZJWF9MRU4gKHNpemVvZiBDT05TX1BSRUZJWCAtIDEpCi0KLQkJcyA9IG5hbWUgKyAxOwotCQl3aGlsZSAoKnMgPT0gJ18nKQotCQkgICsrczsKLQkJaWYgKHNbMF0gPT0gJ0cnCi0JCSAgICAmJiBzdHJuY21wIChzLCBDT05TX1BSRUZJWCwgQ09OU19QUkVGSVhfTEVOIC0gMSkgPT0gMCkKLQkJICB7Ci0JCSAgICBjaGFyIGM7Ci0KLQkJICAgIGMgPSBzW0NPTlNfUFJFRklYX0xFTiArIDFdOwotCQkgICAgaWYgKChjID09ICdJJyB8fCBjID09ICdEJykKLQkJCSYmIHNbQ09OU19QUkVGSVhfTEVOXSA9PSBzW0NPTlNfUFJFRklYX0xFTiArIDJdKQotCQkgICAgICB7Ci0JCQkvKiBJZiB0aGlzIGlzIGEgZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHByZXZpb3VzbHkgd2Vha2x5IGRlZmluZWQsIHdlIGFyZSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJvdWJsZS4gIFdlIGhhdmUgYWxyZWFkeSBhZGRlZCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciBlbnRyeSBmb3IgdGhlIHdlYWsgZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLCBhbmQgbm93IHdlIGFyZSB0cnlpbmcgdG8gYWRkIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBuZXcgc3ltYm9sLiAgRm9ydHVuYXRlbHksIHRoaXMgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIG5ldmVyIGFyaXNlIGluIHByYWN0aWNlLiAgKi8KLQkJCWlmIChvbGR0eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJCSAgYWJvcnQgKCk7Ci0KLQkJCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+Y29uc3RydWN0b3IpCi0JCQkgICAgICAgKGluZm8sCi0JCQkJYyA9PSAnSScgPyB0cnVlIDogZmFsc2UsCi0JCQkJaC0+cm9vdC5zdHJpbmcsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKSkpCi0JCQkgIHJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBDT006Ci0JICAvKiBXZSBoYXZlIGZvdW5kIGEgY29tbW9uIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICBiZmRfbGlua19hZGRfdW5kZWYgKGluZm8tPmhhc2gsIGgpOwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOwotCSAgaC0+dS5jLnAgPQotCSAgICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSAqKQotCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQlzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKLQkgIGlmIChoLT51LmMucCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0KLQkgIC8qIFNlbGVjdCBhIGRlZmF1bHQgYWxpZ25tZW50IGJhc2VkIG9uIHRoZSBzaXplLiAgVGhpcyBtYXkKLSAgICAgICAgICAgICBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsZXIuICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkgICAgcG93ZXIgPSBiZmRfbG9nMiAodmFsdWUpOwotCSAgICBpZiAocG93ZXIgPiA0KQotCSAgICAgIHBvd2VyID0gNDsKLQkgICAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCSAgfQotCi0JICAvKiBUaGUgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgb25seSB1c2VkIGlmIHRoZSBjb21tb24KLSAgICAgICAgICAgICBzeW1ib2wgaXMgYWN0dWFsbHkgYWxsb2NhdGVkLiAgSXQgYmFzaWNhbGx5IHByb3ZpZGVzIGEKLSAgICAgICAgICAgICBob29rIGZvciB0aGUgbGlua2VyIHNjcmlwdCB0byBkZWNpZGUgd2hpY2ggb3V0cHV0IHNlY3Rpb24KLSAgICAgICAgICAgICB0aGUgY29tbW9uIHN5bWJvbHMgc2hvdWxkIGJlIHB1dCBpbi4gIEluIG1vc3QgY2FzZXMsIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sIHdpbGwgYmUgYmZkX2NvbV9zZWN0aW9uX3B0ciwKLSAgICAgICAgICAgICB0aGUgY29kZSBoZXJlIHdpbGwgY2hvb3NlIGEgY29tbW9uIHN5bWJvbCBzZWN0aW9uIG5hbWVkCi0gICAgICAgICAgICAgIkNPTU1PTiIsIGFuZCB0aGUgbGlua2VyIHNjcmlwdCB3aWxsIGNvbnRhaW4gKihDT01NT04pIGluCi0gICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHBsYWNlLiAgQSBmZXcgdGFyZ2V0cyB1c2Ugc2VwYXJhdGUgY29tbW9uCi0gICAgICAgICAgICAgc2VjdGlvbnMgZm9yIHNtYWxsIHN5bWJvbHMsIGFuZCB0aGV5IHJlcXVpcmUgc3BlY2lhbAotICAgICAgICAgICAgIGhhbmRsaW5nLiAgKi8KLQkgIGlmIChzZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIpCi0JICAgIHsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIkNPTU1PTiIpOwotCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2VjdGlvbi0+b3duZXIgIT0gYWJmZCkKLQkgICAgewotCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLAotCQkJCQkJCSAgICBzZWN0aW9uLT5uYW1lKTsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBzZWN0aW9uOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJFRjoKLQkgIC8qIEEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgaWYgKGgtPm5leHQgPT0gTlVMTCAmJiBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCAhPSBoKQotCSAgICBoLT5uZXh0ID0gaDsKLQkgIGJyZWFrOwotCi0JY2FzZSBCSUc6Ci0JICAvKiBXZSBoYXZlIGZvdW5kIGEgY29tbW9uIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIHdoaWNoCi0JICAgICBhbHJlYWR5IGhhZCBhIGNvbW1vbiBkZWZpbml0aW9uLiAgVXNlIHRoZSBtYXhpbXVtIG9mIHRoZQotCSAgICAgdHdvIHNpemVzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgaC0+dS5jLnNpemUsCi0JCSAgYWJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHZhbHVlKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICh2YWx1ZSA+IGgtPnUuYy5zaXplKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHBvd2VyOwotCi0JICAgICAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKLQotCSAgICAgIC8qIFNlbGVjdCBhIGRlZmF1bHQgYWxpZ25tZW50IGJhc2VkIG9uIHRoZSBzaXplLiAgVGhpcyBtYXkKLQkJIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNhbGxlci4gICovCi0JICAgICAgcG93ZXIgPSBiZmRfbG9nMiAodmFsdWUpOwotCSAgICAgIGlmIChwb3dlciA+IDQpCi0JCXBvd2VyID0gNDsKLQkgICAgICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDUkVGOgotCSAgewotCSAgICBiZmQgKm9iZmQ7Ci0KLQkgICAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaAotCSAgICAgICB3YXMgYWxyZWFkeSBkZWZpbmVkLiAgRklYTUU6IEl0IHdvdWxkIG5pY2UgaWYgd2UgY291bGQKLQkgICAgICAgcmVwb3J0IHRoZSBCRkQgd2hpY2ggZGVmaW5lZCBhbiBpbmRpcmVjdCBzeW1ib2wsIGJ1dCB3ZQotCSAgICAgICBkb24ndCBoYXZlIGFueXdoZXJlIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbi4gICovCi0JICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICBvYmZkID0gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICAgIGVsc2UKLQkgICAgICBvYmZkID0gTlVMTDsKLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAgIChpbmZvLCBoLT5yb290LnN0cmluZywgb2JmZCwgaC0+dHlwZSwgKGJmZF92bWEpIDAsCi0JCSAgICBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgdmFsdWUpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgTUlORDoKLQkgIC8qIE11bHRpcGxlIGluZGlyZWN0IHN5bWJvbHMuICBUaGlzIGlzIE9LIGlmIHRoZXkgYm90aCBwb2ludAotCSAgICAgdG8gdGhlIHNhbWUgc3ltYm9sLiAgKi8KLQkgIGlmIChzdHJjbXAgKGgtPnUuaS5saW5rLT5yb290LnN0cmluZywgc3RyaW5nKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBNREVGOgotCSAgLyogSGFuZGxlIGEgbXVsdGlwbGUgZGVmaW5pdGlvbi4gICovCi0JICB7Ci0JICAgIGFzZWN0aW9uICptc2VjID0gTlVMTDsKLQkgICAgYmZkX3ZtYSBtdmFsID0gMDsKLQotCSAgICBzd2l0Y2ggKGgtPnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCQltc2VjID0gaC0+dS5kZWYuc2VjdGlvbjsKLQkJbXZhbCA9IGgtPnUuZGVmLnZhbHVlOwotCQlicmVhazsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0JCW1zZWMgPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotCQltdmFsID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJYWJvcnQgKCk7Ci0JICAgICAgfQotCi0JICAgIC8qIElnbm9yZSBhIHJlZGVmaW5pdGlvbiBvZiBhbiBhYnNvbHV0ZSBzeW1ib2wgdG8gdGhlIHNhbWUKLSAgICAgICAgICAgICAgIHZhbHVlOyBpdCdzIGhhcm1sZXNzLiAgKi8KLQkgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSYmIGJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykKLQkJJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKQotCQkmJiB2YWx1ZSA9PSBtdmFsKQotCSAgICAgIGJyZWFrOwotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfZGVmaW5pdGlvbikKLQkJICAgKGluZm8sIGgtPnJvb3Quc3RyaW5nLCBtc2VjLT5vd25lciwgbXNlYywgbXZhbCwgYWJmZCwKLQkJICAgIHNlY3Rpb24sIHZhbHVlKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIENJTkQ6Ci0JICAvKiBDcmVhdGUgYW4gaW5kaXJlY3Qgc3ltYm9sIGZyb20gYW4gZXhpc3RpbmcgY29tbW9uIHN5bWJvbC4gICovCi0JICBCRkRfQVNTRVJUIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLAotCQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lciwgYmZkX2xpbmtfaGFzaF9jb21tb24sIGgtPnUuYy5zaXplLAotCQkgIGFiZmQsIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBJTkQ6Ci0JICAvKiBDcmVhdGUgYW4gaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmluaDsKLQotCSAgICAvKiBTVFJJTkcgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB3ZSB3YW50IHRvIGluZGlyZWN0Ci0JICAgICAgIHRvLiAgKi8KLQkgICAgaW5oID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgc3RyaW5nLCB0cnVlLAotCQkJCQkJY29weSwgZmFsc2UpOwotCSAgICBpZiAoaW5oID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKGluaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgICB7Ci0JCWluaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCQlpbmgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JCWJmZF9saW5rX2FkZF91bmRlZiAoaW5mby0+aGFzaCwgaW5oKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSWYgdGhlIGluZGlyZWN0IHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLCB3ZSBuZWVkIHRvCi0JICAgICAgIHB1c2ggdGhlIHJlZmVyZW5jZSBkb3duIHRvIHRoZSBzeW1ib2wgd2UgYXJlCi0JICAgICAgIHJlZmVyZW5jaW5nLiAgKi8KLQkgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgICAgewotCQlyb3cgPSBVTkRFRl9ST1c7Ci0JCWN5Y2xlID0gdHJ1ZTsKLQkgICAgICB9Ci0KLQkgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q7Ci0JICAgIGgtPnUuaS5saW5rID0gaW5oOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFNFVDoKLQkgIC8qIEFkZCBhbiBlbnRyeSB0byBhIHNldC4gICovCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX3RvX3NldCkgKGluZm8sIGgsIEJGRF9SRUxPQ19DVE9SLAotCQkJCQkJYWJmZCwgc2VjdGlvbiwgdmFsdWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgV0FSTkM6Ci0JICAvKiBJc3N1ZSBhIHdhcm5pbmcgYW5kIGN5Y2xlLiAgKi8KLQkgIGlmIChoLT51Lmkud2FybmluZyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLCBoLT51Lmkud2FybmluZywKLQkJCQkJCSBoLT5yb290LnN0cmluZywgYWJmZCwKLQkJCQkJCSAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJCSAoYmZkX3ZtYSkgMCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAvKiBPbmx5IGlzc3VlIGEgd2FybmluZyBvbmNlLiAgKi8KLQkgICAgICBoLT51Lmkud2FybmluZyA9IE5VTEw7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBDWUNMRToKLQkgIC8qIFRyeSBhZ2FpbiB3aXRoIHRoZSByZWZlcmVuY2VkIHN5bWJvbC4gICovCi0JICBoID0gaC0+dS5pLmxpbms7Ci0JICBjeWNsZSA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgUkVGQzoKLQkgIC8qIEEgcmVmZXJlbmNlIHRvIGFuIGluZGlyZWN0IHN5bWJvbC4gICovCi0JICBpZiAoaC0+bmV4dCA9PSBOVUxMICYmIGluZm8tPmhhc2gtPnVuZGVmc190YWlsICE9IGgpCi0JICAgIGgtPm5leHQgPSBoOwotCSAgaCA9IGgtPnUuaS5saW5rOwotCSAgY3ljbGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIFdBUk46Ci0JICAvKiBJc3N1ZSBhIHdhcm5pbmcuICAqLwotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLCBzdHJpbmcsIGgtPnJvb3Quc3RyaW5nLAotCQkJCQkgICAgIGhhc2hfZW50cnlfYmZkIChoKSwKLQkJCQkJICAgICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQ1dBUk46Ci0JICAvKiBXYXJuIGlmIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQgYWxyZWFkeSwKLQkgICAgIG90aGVyd2lzZSBhZGQgYSB3YXJuaW5nLiAgQSBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZCBpZgotCSAgICAgdGhlIG5leHQgZmllbGQgaXMgbm90IE5VTEwsIG9yIGl0IGlzIHRoZSB0YWlsIG9mIHRoZQotCSAgICAgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgVGhlIFJFRiBjYXNlIGFib3ZlIGhlbHBzIHRvCi0JICAgICBlbnN1cmUgdGhpcy4gICovCi0JICBpZiAoaC0+bmV4dCAhPSBOVUxMIHx8IGluZm8tPmhhc2gtPnVuZGVmc190YWlsID09IGgpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykgKGluZm8sIHN0cmluZywgaC0+cm9vdC5zdHJpbmcsCi0JCQkJCQkgaGFzaF9lbnRyeV9iZmQgKGgpLAotCQkJCQkJIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkJIChiZmRfdm1hKSAwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgTVdBUk46Ci0JICAvKiBNYWtlIGEgd2FybmluZyBzeW1ib2wuICAqLwotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqc3ViOwotCi0JICAgIC8qIFNUUklORyBpcyB0aGUgd2FybmluZyB0byBnaXZlLiAgKi8KLQkgICAgc3ViID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkgICAoKCppbmZvLT5oYXNoLT50YWJsZS5uZXdmdW5jKQotCQkgICAgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCwgJmluZm8tPmhhc2gtPnRhYmxlLAotCQkgICAgIGgtPnJvb3Quc3RyaW5nKSkpOwotCSAgICBpZiAoc3ViID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAqc3ViID0gKmg7Ci0JICAgIHN1Yi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfd2FybmluZzsKLQkgICAgc3ViLT51LmkubGluayA9IGg7Ci0JICAgIGlmICghIGNvcHkpCi0JICAgICAgc3ViLT51Lmkud2FybmluZyA9IHN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY2hhciAqdzsKLQotCQl3ID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkgICAgICAgc3RybGVuIChzdHJpbmcpICsgMSk7Ci0JCWlmICh3ID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlzdHJjcHkgKHcsIHN0cmluZyk7Ci0JCXN1Yi0+dS5pLndhcm5pbmcgPSB3OwotCSAgICAgIH0KLQotCSAgICBiZmRfaGFzaF9yZXBsYWNlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkgICAgICAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIGgsCi0JCQkgICAgICAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHN1Yik7Ci0JICAgIGlmIChoYXNocCAhPSBOVUxMKQotCSAgICAgICpoYXNocCA9IHN1YjsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjeWNsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBHZW5lcmljIGZpbmFsIGxpbmsgcm91dGluZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKnN1YjsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG91dHN5bWFsbG9jOwotICBzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gd2dpbmZvOwotCi0gIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSAoYXN5bWJvbCAqKikgTlVMTDsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotICBvdXRzeW1hbGxvYyA9IDA7Ci0KLSAgLyogTWFyayBhbGwgc2VjdGlvbnMgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQlwLT51LmluZGlyZWN0LnNlY3Rpb24tPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotICAvKiBCdWlsZCB0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZS4gICovCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IChiZmQgKikgTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMgKGFiZmQsIHN1YiwgaW5mbywgJm91dHN5bWFsbG9jKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBY2N1bXVsYXRlIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIHdnaW5mby5pbmZvID0gaW5mbzsKLSAgd2dpbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICB3Z2luZm8ucHN5bWFsbG9jID0gJm91dHN5bWFsbG9jOwotICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlIChfYmZkX2dlbmVyaWNfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCwKLQkJCQkgICAoUFRSKSAmd2dpbmZvKTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHRyYWlsaW5nIE5VTEwgcG9pbnRlciBvbiBPVVRTWU1CT0xTLiAgV2UKLSAgICAgc2hvdWxkbid0IHJlYWxseSBuZWVkIG9uZSwgc2luY2Ugd2UgaGF2ZSBTWU1DT1VOVCwgYnV0IHNvbWUgb2xkCi0gICAgIGNvZGUgc3RpbGwgZXhwZWN0cyBvbmUuICAqLwotICBpZiAoISBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sIChhYmZkLCAmb3V0c3ltYWxsb2MsIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgb3V0cHV0IHJlbG9jcyBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIG8gIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgbyA9IG8tPm5leHQpCi0JewotCSAgby0+cmVsb2NfY291bnQgPSAwOwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JCSsrby0+cmVsb2NfY291bnQ7Ci0JICAgICAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCQkgIGJmZCAqaW5wdXRfYmZkOwotCQkgIGxvbmcgcmVsc2l6ZTsKLQkJICBhcmVsZW50ICoqcmVsb2NzOwotCQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCQkgIGxvbmcgcmVsb2NfY291bnQ7Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCQkgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCQkgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JCSAgaWYgKHJlbHNpemUgPCAwKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIHJlbG9jcyA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxzaXplKTsKLQkJICBpZiAoIXJlbG9jcyAmJiByZWxzaXplICE9IDApCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpOwotCQkgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCQkJcmVsb2NzLAotCQkJCQkJCXN5bWJvbHMpOwotCQkgIGlmIChyZWxvY19jb3VudCA8IDApCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgQkZEX0FTU0VSVCAoKHVuc2lnbmVkIGxvbmcpIHJlbG9jX2NvdW50Ci0JCQkgICAgICA9PSBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0JCSAgby0+cmVsb2NfY291bnQgKz0gcmVsb2NfY291bnQ7Ci0JCSAgZnJlZSAocmVsb2NzKTsKLQkJfQotCSAgICB9Ci0JICBpZiAoby0+cmVsb2NfY291bnQgPiAwKQotCSAgICB7Ci0JICAgICAgby0+b3JlbG9jYXRpb24gPSAoKGFyZWxlbnQgKiopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoby0+cmVsb2NfY291bnQKLQkJCQkJICAgICogc2l6ZW9mIChhcmVsZW50ICopKSkpOwotCSAgICAgIGlmICghby0+b3JlbG9jYXRpb24pCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBvLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICAgICAgLyogUmVzZXQgdGhlIGNvdW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXgKLQkJIHdoZW4gcHV0dGluZyBpbiB0aGUgb3V0cHV0IHJlbG9jcy4gICovCi0JICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBIYW5kbGUgYWxsIHRoZSBsaW5rIG9yZGVyIGluZm9ybWF0aW9uIGZvciB0aGUgc2VjdGlvbnMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBvICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICBwID0gcC0+bmV4dCkKLQl7Ci0JICBzd2l0Y2ggKHAtPnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyOgotCSAgICBjYXNlIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcjoKLQkgICAgICBpZiAoISBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcjoKLQkgICAgICBpZiAoISBkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHAsIHRydWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbiBvdXRwdXQgc3ltYm9sIHRvIHRoZSBvdXRwdXQgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKG91dHB1dF9iZmQsIHBzeW1hbGxvYywgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHNpemVfdCAqcHN5bWFsbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKSA+PSAqcHN5bWFsbG9jKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipuZXdzeW1zOwotCi0gICAgICBpZiAoKnBzeW1hbGxvYyA9PSAwKQotCSpwc3ltYWxsb2MgPSAxMjQ7Ci0gICAgICBlbHNlCi0JKnBzeW1hbGxvYyAqPSAyOwotICAgICAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSBiZmRfcmVhbGxvYyAoYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKSwKLQkJCQkJICAqcHN5bWFsbG9jICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIGlmIChuZXdzeW1zID09IChhc3ltYm9sICoqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCkgPSBuZXdzeW1zOwotICAgIH0KLQotICBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpIFtiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKV0gPSBzeW07Ci0gIGlmIChzeW0gIT0gTlVMTCkKLSAgICArKyBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIHRoZSBzeW1ib2xzIGZvciBhbiBpbnB1dCBCRkQuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLCBwc3ltYWxsb2MpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzaXplX3QgKnBzeW1hbGxvYzsKLXsKLSAgYXN5bWJvbCAqKnN5bV9wdHI7Ci0gIGFzeW1ib2wgKipzeW1fZW5kOwotCi0gIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSBhIGZpbGVuYW1lIHN5bWJvbCBpZiB3ZSBhcmUgc3VwcG9zZWQgdG8uICAqLwotICBpZiAoaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgZm9yIChzZWMgPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgIHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgICBzZWMgPSBzZWMtPm5leHQpCi0JewotCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBhc3ltYm9sICpuZXdzeW07Ci0KLQkgICAgICBuZXdzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGlucHV0X2JmZCk7Ci0JICAgICAgaWYgKCFuZXdzeW0pCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBuZXdzeW0tPm5hbWUgPSBpbnB1dF9iZmQtPmZpbGVuYW1lOwotCSAgICAgIG5ld3N5bS0+dmFsdWUgPSAwOwotCSAgICAgIG5ld3N5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUwgfCBCU0ZfRklMRTsKLQkgICAgICBuZXdzeW0tPnNlY3Rpb24gPSBzZWM7Ci0KLQkgICAgICBpZiAoISBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sIChvdXRwdXRfYmZkLCBwc3ltYWxsb2MsCi0JCQkJCSAgICAgICBuZXdzeW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSB2YWx1ZXMgb2YgdGhlIGdsb2JhbGx5IHZpc2libGUgc3ltYm9scywgYW5kIHdyaXRlIG91dAotICAgICBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgc3ltX3B0ciA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpOwotICBzeW1fZW5kID0gc3ltX3B0ciArIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoaW5wdXRfYmZkKTsKLSAgZm9yICg7IHN5bV9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYm9vbGVhbiBvdXRwdXQ7Ci0KLSAgICAgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEw7Ci0gICAgICBzeW0gPSAqc3ltX3B0cjsKLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfSU5ESVJFQ1QKLQkJCSB8IEJTRl9XQVJOSU5HCi0JCQkgfCBCU0ZfR0xPQkFMCi0JCQkgfCBCU0ZfQ09OU1RSVUNUT1IKLQkJCSB8IEJTRl9XRUFLKSkgIT0gMAotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICBpZiAoc3ltLT51ZGF0YS5wICE9IE5VTEwpCi0JICAgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIHN5bS0+dWRhdGEucDsKLQkgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBjYXNlIG5vcm1hbGx5IG1lYW5zIHRoYXQgdGhlIG1haW4gbGlua2VyIGNvZGUKLSAgICAgICAgICAgICAgICAgZGVsaWJlcmF0ZWx5IGlnbm9yZWQgdGhpcyBjb25zdHJ1Y3RvciBzeW1ib2wuICBXZQotICAgICAgICAgICAgICAgICBzaG91bGQganVzdCBwYXNzIGl0IHRocm91Z2guICBUaGlzIHdpbGwgc2NyZXcgdXAgaWYKLSAgICAgICAgICAgICAgICAgdGhlIGNvbnN0cnVjdG9yIHN5bWJvbCBpcyBmcm9tIGEgZGlmZmVyZW50LAotICAgICAgICAgICAgICAgICBub24tZ2VuZXJpYywgb2JqZWN0IGZpbGUgZm9ybWF0LCBidXQgdGhlIGNhc2Ugd2lsbAotICAgICAgICAgICAgICAgICBvbmx5IGFyaXNlIHdoZW4gbGlua2luZyB3aXRoIC1yLCB3aGljaCB3aWxsIHByb2JhYmx5Ci0gICAgICAgICAgICAgICAgIGZhaWwgYW55aG93LCBzaW5jZSB0aGVyZSB3aWxsIGJlIG5vIHdheSB0byByZXByZXNlbnQKLSAgICAgICAgICAgICAgICAgdGhlIHJlbG9jcyBpbiB0aGUgb3V0cHV0IGZvcm1hdCBiZWluZyB1c2VkLiAgKi8KLQkgICAgICBoID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICBoID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkJIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSAgICAgICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkgICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JICBlbHNlCi0JICAgIGggPSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX2xvb2t1cCAoX2JmZF9nZW5lcmljX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkgICAgICAgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKLQkJCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLQkgIGlmIChoICE9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZvcmNlIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIHRvIHBvaW50IHRvCi0JCSB0aGUgc2FtZSBhcmVhIGluIG1lbW9yeS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQKLQkJIHRoaXMgcm91dGluZSB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgaGFzaCB0YWJsZQotCQkgb3RoZXIgdGhhbiBhIGdlbmVyaWMgaGFzaCB0YWJsZSwgc28gd2UgZG91YmxlCi0JCSBjaGVjayB0aGF0LiAgKi8KLQkgICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBpbnB1dF9iZmQtPnh2ZWMpCi0JCXsKLQkJICBpZiAoaC0+c3ltICE9IChhc3ltYm9sICopIE5VTEwpCi0JCSAgICAqc3ltX3B0ciA9IHN5bSA9IGgtPnN5bTsKLQkJfQotCi0JICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLQkJICBhYm9ydCAoKTsKLQkJY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkJICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0JCSAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkJICAvKiBmYWxsIHRocm91Z2ggKi8KLQkJY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JCSAgc3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCQkgIHN5bS0+ZmxhZ3MgJj1+IEJTRl9DT05TVFJVQ1RPUjsKLQkJICBzeW0tPnZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICBzeW0tPnNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0JCSAgc3ltLT5mbGFncyAmPX4gQlNGX0NPTlNUUlVDVE9SOwotCQkgIHN5bS0+dmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCQkgIHN5bS0+c2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkJICBzeW0tPnZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLQkJICBzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JCSAgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpOwotCQkgICAgICBzeW0tPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCQkgICAgfQotCQkgIC8qIFdlIGRvIG5vdCBzZXQgdGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbCB0bwotCQkgICAgIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24uICBUaGF0IHZhbHVlIHdhcyBzYXZlZCBzbwotCQkgICAgIHRoYXQgd2Ugd291bGQga25vdyB3aGVyZSB0byBhbGxvY2F0ZSB0aGUgc3ltYm9sCi0JCSAgICAgaWYgaXQgd2FzIGRlZmluZWQuICBJbiB0aGlzIGNhc2UgdGhlIHR5cGUgaXMKLQkJICAgICBzdGlsbCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc28gd2UgZGlkIG5vdCBkZWZpbmUKLQkJICAgICBpdCwgc28gd2UgZG8gbm90IHdhbnQgdG8gdXNlIHRoYXQgc2VjdGlvbi4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogVGhpcyBzd2l0Y2ggaXMgc3RyYWlnaHQgZnJvbSB0aGUgb2xkIGNvZGUgaW4KLQkgd3JpdGVfZmlsZV9sb2NhbHMgaW4gbGRzeW0uYy4gICovCi0gICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICB8fCAoaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGluZm8tPmtlZXBfaGFzaCwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JCSAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKSkpCi0Jb3V0cHV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKSAhPSAwKQotCXsKLQkgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG1hcmtlZCBhcyBvY2N1cnJpbmcgbm93LCByYXRoZXIKLQkgICAgIHRoYW4gYXQgdGhlIGVuZCwgb3V0cHV0IGl0IG5vdy4gIFRoaXMgaXMgdXNlZCBmb3IKLQkgICAgIENPRkYgQ19FWFQgRkNOIHN5bWJvbHMuICBGSVhNRTogVGhlcmUgbXVzdCBiZSBhCi0JICAgICBiZXR0ZXIgd2F5LiAgKi8KLQkgIGlmIChiZmRfYXN5bWJvbF9iZmQgKHN5bSkgPT0gaW5wdXRfYmZkCi0JICAgICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMCkKLQkgICAgb3V0cHV0ID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgb3V0cHV0ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCW91dHB1dCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotCXsKLQkgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lKQotCSAgICBvdXRwdXQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBvdXRwdXQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCW91dHB1dCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApCi0JewotCSAgaWYgKChzeW0tPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCi0JICAgIG91dHB1dCA9IGZhbHNlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChpbmZvLT5kaXNjYXJkKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgZGlzY2FyZF9hbGw6Ci0JCSAgb3V0cHV0ID0gZmFsc2U7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9sOgotCQkgIGlmIChiZmRfaXNfbG9jYWxfbGFiZWwgKGlucHV0X2JmZCwgc3ltKSkKLQkJICAgIG91dHB1dCA9IGZhbHNlOwotCQkgIGVsc2UKLQkJICAgIG91dHB1dCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9ub25lOgotCQkgIG91dHB1dCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSkKLQl7Ci0JICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCSAgICBvdXRwdXQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBvdXRwdXQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGluIGEgc2VjdGlvbiB3aGljaCBpcyBub3QgYmVpbmcgaW5jbHVkZWQKLQkgaW4gdGhlIG91dHB1dCBmaWxlLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IHRoZSBzeW1ib2wuCi0KLQkgR3Jvc3MuICAuYnNzIGFuZCBzaW1pbGFyIHNlY3Rpb25zIHdvbid0IGhhdmUgdGhlIGxpbmtlcl9tYXJrCi0JIGZpZWxkIHNldC4gICovCi0gICAgICBpZiAoKHN5bS0+c2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JICAmJiBzeW0tPnNlY3Rpb24tPmxpbmtlcl9tYXJrID09IGZhbHNlKQotCW91dHB1dCA9IGZhbHNlOwotCi0gICAgICBpZiAob3V0cHV0KQotCXsKLQkgIGlmICghIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKG91dHB1dF9iZmQsIHBzeW1hbGxvYywgc3ltKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGggIT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBoLT53cml0dGVuID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNlY3Rpb24gYW5kIHZhbHVlIG9mIGEgZ2VuZXJpYyBCRkQgc3ltYm9sIGJhc2VkIG9uIGEgbGlua2VyCi0gICBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9zeW1ib2xfZnJvbV9oYXNoIChzeW0sIGgpCi0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIHN3aXRjaCAoaC0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29uc3RydWN0b3Igc3ltYm9sIGlzIHNlZW4gYnV0IHdlIGFyZQotICAgICAgICAgbm90IGJ1aWxkaW5nIGNvbnN0cnVjdG9ycy4gICovCi0gICAgICBpZiAoc3ltLT5zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgQkZEX0FTU0VSVCAoKHN5bS0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHN5bS0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBzeW0tPnZhbHVlID0gMDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIHN5bS0+dmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0tPnZhbHVlID0gMDsKLSAgICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGgtPnUuZGVmLnNlY3Rpb247Ci0gICAgICBzeW0tPnZhbHVlID0gaC0+dS5kZWYudmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0gICAgICBzeW0tPnNlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uOwotICAgICAgc3ltLT52YWx1ZSA9IGgtPnUuZGVmLnZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHN5bS0+dmFsdWUgPSBoLT51LmMuc2l6ZTsKLSAgICAgIGlmIChzeW0tPnNlY3Rpb24gPT0gTlVMTCkKLQlzeW0tPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JewotCSAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLQkgIHN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgLyogRG8gbm90IHNldCB0aGUgc2VjdGlvbjsgc2VlIF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPyAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IGEgZ2xvYmFsIHN5bWJvbCwgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiB3cml0dGVuIG91dC4KLSAgIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyAqd2dpbmZvID0KLSAgICAoc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvICopIGRhdGE7Ci0gIGFzeW1ib2wgKnN5bTsKLQotICBpZiAoaC0+d3JpdHRlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT53cml0dGVuID0gdHJ1ZTsKLQotICBpZiAod2dpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLSAgICAgIHx8ICh3Z2luZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICYmIGJmZF9oYXNoX2xvb2t1cCAod2dpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5zeW0gIT0gKGFzeW1ib2wgKikgTlVMTCkKLSAgICBzeW0gPSBoLT5zeW07Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKHdnaW5mby0+b3V0cHV0X2JmZCk7Ci0gICAgICBpZiAoIXN5bSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzeW0tPm5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgc3ltLT5mbGFncyA9IDA7Ci0gICAgfQotCi0gIHNldF9zeW1ib2xfZnJvbV9oYXNoIChzeW0sICZoLT5yb290KTsKLQotICBzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0KLSAgaWYgKCEgZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAod2dpbmZvLT5vdXRwdXRfYmZkLCB3Z2luZm8tPnBzeW1hbGxvYywKLQkJCQkgICBzeW0pKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGZhaWx1cmUuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSByZWxvY2F0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBhcmVsZW50ICpyOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHNlYy0+b3JlbG9jYXRpb24gPT0gKGFyZWxlbnQgKiopIE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgciA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhcmVsZW50KSk7Ci0gIGlmIChyID09IChhcmVsZW50ICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAgICAgCi0gIHItPmFkZHJlc3MgPSBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0gIHItPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKHItPmhvd3RvID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgc3ltYm9sIHRvIHVzZSBmb3IgdGhlIHJlbG9jYXRpb24uICAqLwotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHItPnN5bV9wdHJfcHRyID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLAotCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgISBoLT53cml0dGVuKQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJIChpbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByLT5zeW1fcHRyX3B0ciA9ICZoLT5zeW07Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYW4gaW5wbGFjZSByZWxvYywgd3JpdGUgdGhlIGFkZGVuZCB0byB0aGUgb2JqZWN0IGZpbGUuCi0gICAgIE90aGVyd2lzZSwgc3RvcmUgaXQgaW4gdGhlIHJlbG9jIGFkZGVuZC4gICovCi0gIGlmICghIHItPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UpCi0gICAgci0+YWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoci0+aG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChyLT5ob3d0bywgYWJmZCwKLQkJCQkgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKGFiZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICByLT5ob3d0by0+bmFtZSwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsCi0JCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByLT5hZGRlbmQgPSAwOwotICAgIH0KLQotICBzZWMtPm9yZWxvY2F0aW9uW3NlYy0+cmVsb2NfY291bnRdID0gcjsKLSAgKytzZWMtPnJlbG9jX2NvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogQWxsb2NhdGUgYSBuZXcgbGlua19vcmRlciBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX29yZGVyICoKLWJmZF9uZXdfbGlua19vcmRlciAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpuZXc7Ci0KLSAgbmV3ID0gKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19vcmRlcikpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmV3LT50eXBlID0gYmZkX3VuZGVmaW5lZF9saW5rX29yZGVyOwotICBuZXctPm9mZnNldCA9IDA7Ci0gIG5ldy0+c2l6ZSA9IDA7Ci0gIG5ldy0+bmV4dCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotICBpZiAoc2VjdGlvbi0+bGlua19vcmRlcl90YWlsICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTCkKLSAgICBzZWN0aW9uLT5saW5rX29yZGVyX3RhaWwtPm5leHQgPSBuZXc7Ci0gIGVsc2UKLSAgICBzZWN0aW9uLT5saW5rX29yZGVyX2hlYWQgPSBuZXc7Ci0gIHNlY3Rpb24tPmxpbmtfb3JkZXJfdGFpbCA9IG5ldzsKLQotICByZXR1cm4gbmV3OwotfQotCi0vKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgTm90ZSB0aGF0IHdlIGNhbiBub3QgaGFuZGxlCi0gICB0aGUgcmVsb2NfbGlua19vcmRlciB0eXBlcyBoZXJlLCBzaW5jZSB0aGV5IGRlcGVuZCB1cG9uIHRoZSBkZXRhaWxzCi0gICBvZiBob3cgdGhlIHBhcnRpY3VsYXIgYmFja2VuZHMgZ2VuZXJhdGVzIHJlbG9jcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgc3dpdGNoIChsaW5rX29yZGVyLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGJmZF91bmRlZmluZWRfbGlua19vcmRlcjoKLSAgICBjYXNlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI6Ci0gICAgY2FzZSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXI6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXI6Ci0gICAgICByZXR1cm4gZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIsCi0JCQkJCSAgZmFsc2UpOwotICAgIGNhc2UgYmZkX2ZpbGxfbGlua19vcmRlcjoKLSAgICAgIHJldHVybiBkZWZhdWx0X2ZpbGxfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKTsKLSAgICBjYXNlIGJmZF9kYXRhX2xpbmtfb3JkZXI6Ci0gICAgICByZXR1cm4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsCi0JCQkJICAgICAgIChQVFIpIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cywKLQkJCQkgICAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnNpemUpOwotICAgIH0KLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBhIGJmZF9maWxsX2xpbmtfb3JkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1kZWZhdWx0X2ZpbGxfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKnNwYWNlOwotICBzaXplX3QgaTsKLSAgaW50IGZpbGw7Ci0gIGJvb2xlYW4gcmVzdWx0OwotCi0gIEJGRF9BU1NFUlQgKChzZWMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCk7Ci0KLSAgc2l6ZSA9IChzaXplX3QpIGxpbmtfb3JkZXItPnNpemU7Ci0gIHNwYWNlID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc2l6ZSk7Ci0gIGlmIChzcGFjZSA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsbCA9IGxpbmtfb3JkZXItPnUuZmlsbC52YWx1ZTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gMikKLSAgICBzcGFjZVtpXSA9IGZpbGwgPj4gODsKLSAgZm9yIChpID0gMTsgaSA8IHNpemU7IGkgKz0gMikKLSAgICBzcGFjZVtpXSA9IGZpbGw7Ci0gIHJlc3VsdCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBzcGFjZSwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LAotCQkJCSAgICAgbGlua19vcmRlci0+c2l6ZSk7Ci0gIGZyZWUgKHNwYWNlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBhIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIsCi0JCQkgICAgIGdlbmVyaWNfbGlua2VyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYm9vbGVhbiBnZW5lcmljX2xpbmtlcjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmV3X2NvbnRlbnRzOwotCi0gIEJGRF9BU1NFUlQgKChvdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKTsKLQotICBpZiAobGlua19vcmRlci0+c2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPT0gbGlua19vcmRlci0+c2l6ZSk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwCi0gICAgICAmJiBvdXRwdXRfc2VjdGlvbi0+b3JlbG9jYXRpb24gPT0gKGFyZWxlbnQgKiopIE5VTEwpCi0gICAgewotICAgICAgLyogU3BhY2UgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIG91dHB1dCByZWxvY2F0aW9ucy4KLQkgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGNhbGxlZCBieSBhIHNwZWNpZmljIGJhY2tlbmQKLQkgYmVjYXVzZSBzb21lYm9keSBpcyBhdHRlbXB0aW5nIHRvIGxpbmsgdG9nZXRoZXIgZGlmZmVyZW50Ci0JIHR5cGVzIG9mIG9iamVjdCBmaWxlcy4gIEhhbmRsaW5nIHRoaXMgY2FzZSBjb3JyZWN0bHkgaXMKLQkgZGlmZmljdWx0LCBhbmQgc29tZXRpbWVzIGltcG9zc2libGUuICAqLwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIkF0dGVtcHQgdG8gZG8gcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCAlcyBpbnB1dCBhbmQgJXMgb3V0cHV0IiksCi0JIGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGdlbmVyaWNfbGlua2VyKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipzeW1wcDsKLSAgICAgIGFzeW1ib2wgKipzeW1wcGVuZDsKLQotICAgICAgLyogR2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scy4gIFRoZSBnZW5lcmljIGxpbmtlciB3aWxsIGFsd2F5cwotCSBoYXZlIHJldHJpZXZlZCB0aGVtIGJ5IHRoaXMgcG9pbnQsIGJ1dCB3ZSBhcmUgYmVpbmcgY2FsbGVkIGJ5Ci0JIGEgc3BlY2lmaWMgbGlua2VyLCBwcmVzdW1hYmx5IGJlY2F1c2Ugd2UgYXJlIGxpbmtpbmcKLQkgZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdCBmaWxlcyB0b2dldGhlci4gICovCi0gICAgICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2luY2Ugd2UgaGF2ZSBiZWVuIGNhbGxlZCBieSBhIHNwZWNpZmljIGxpbmtlciwgcmF0aGVyIHRoYW4KLQkgdGhlIGdlbmVyaWMgbGlua2VyLCB0aGUgdmFsdWVzIG9mIHRoZSBzeW1ib2xzIHdpbGwgbm90IGJlCi0JIHJpZ2h0LiAgVGhleSB3aWxsIGJlIHRoZSB2YWx1ZXMgYXMgc2VlbiBpbiB0aGUgaW5wdXQgZmlsZSwKLQkgbm90IHRoZSB2YWx1ZXMgb2YgdGhlIGZpbmFsIGxpbmsuICBXZSBuZWVkIHRvIGZpeCB0aGVtIHVwCi0JIGJlZm9yZSB3ZSBjYW4gcmVsb2NhdGUgdGhlIHNlY3Rpb24uICAqLwotICAgICAgc3ltcHAgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKTsKLSAgICAgIHN5bXBwZW5kID0gc3ltcHAgKyBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGlucHV0X2JmZCk7Ci0gICAgICBmb3IgKDsgc3ltcHAgPCBzeW1wcGVuZDsgc3ltcHArKykKLQl7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgc3ltID0gKnN5bXBwOwotCi0JICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0lORElSRUNUCi0JCQkgICAgIHwgQlNGX1dBUk5JTkcKLQkJCSAgICAgfCBCU0ZfR0xPQkFMCi0JCQkgICAgIHwgQlNGX0NPTlNUUlVDVE9SCi0JCQkgICAgIHwgQlNGX1dFQUspKSAhPSAwCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICB7Ci0JICAgICAgLyogc3ltLT51ZGF0YSBtYXkgaGF2ZSBiZWVuIHNldCBieQotCQkgZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdC4gICovCi0JICAgICAgaWYgKHN5bS0+dWRhdGEucCAhPSBOVUxMKQotCQloID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIHN5bS0+dWRhdGEucDsKLQkgICAgICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JCWggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkJICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICAgIGVsc2UKLQkJaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLAotCQkJCQkgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCSAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlzZXRfc3ltYm9sX2Zyb21faGFzaCAoc3ltLCBoKTsKLQkgICAgfQotCX0JICAKLSAgICB9Ci0KLSAgLyogR2V0IGFuZCByZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGNvbnRlbnRzID0gKChiZmRfYnl0ZSAqKQotCSAgICAgIGJmZF9tYWxsb2MgKGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBuZXdfY29udGVudHMgPSAoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCQkgIChvdXRwdXRfYmZkLCBpbmZvLCBsaW5rX29yZGVyLCBjb250ZW50cywgaW5mby0+cmVsb2NhdGVhYmxlLAotCQkgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSkpOwotICBpZiAoIW5ld19jb250ZW50cykKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBPdXRwdXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgbmV3X2NvbnRlbnRzLAotCQkJCSAgbGlua19vcmRlci0+b2Zmc2V0LCBsaW5rX29yZGVyLT5zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSBsaXR0bGUgcm91dGluZSB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBpbiBhIGxpbmtfb3JkZXIKLSAgIGxpc3QuICAqLwotCi11bnNpZ25lZCBpbnQKLV9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKGxpbmtfb3JkZXIpCi0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbDsKLQotICBjID0gMDsKLSAgZm9yIChsID0gbGlua19vcmRlcjsgbCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkgIHx8IGwtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSsrYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGM7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9saW5rX3NwbGl0X3NlY3Rpb24KLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfbGlua19zcGxpdF9zZWN0aW9uKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYyk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIG5vbnplcm8gaWYgQHZhcntzZWN9IHNob3VsZCBiZSBzcGxpdCBkdXJpbmcgYQotCXJlbG9jZWF0YWJsZSBvciBmaW5hbCBsaW5rLgotCi0uI2RlZmluZSBiZmRfbGlua19zcGxpdF9zZWN0aW9uKGFiZmQsIHNlYykgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24sIChhYmZkLCBzZWMpKQotLgotCi0qLwotCi0KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9iZmQvbHlueC1jb3JlLmMgYi9iZmQvbHlueC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTgxNzcuLjAwMDAwMDAKLS0tIGEvYmZkL2x5bngtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgTHlueCBjb3JlIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3R1IEdyb3NzbWFuIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmZGVmIExZTlhfQ09SRQotCi0jaW5jbHVkZSA8c3lzL2NvbmYuaD4KLSNpbmNsdWRlIDxzeXMva2VybmVsLmg+Ci0vKiBzeXMva2VybmVsLmggc2hvdWxkIGRlZmluZSB0aGlzLCBidXQgZG9lc24ndCBhbHdheXMsIHNpZ2guICovCi0jaWZuZGVmIF9fTFlOWE9TCi0jZGVmaW5lIF9fTFlOWE9TCi0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvbWVtLmg+Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL2l0aW1lci5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3lzL3Byb2MuaD4KLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLQotc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW1BOTUxFTiArIDFdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEubHlueF9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLQotLyogSGFuZGxlIEx5bnggY29yZSBkdW1wIGZpbGUuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0gIGNoYXIgKm5ld25hbWU7Ci0KLSAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lKSArIDEpOwotICBpZiAoIW5ld25hbWUpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RyY3B5IChuZXduYW1lLCBuYW1lKTsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5ld25hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotbHlueF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgc2VjbnVtOwotICBzdHJ1Y3QgcHNzZW50cnkgcHNzOwotICBzaXplX3QgdGNvbnRleHRfc2l6ZTsKLSAgY29yZV9zdF90ICp0aHJlYWRwOwotICBpbnQgcGFnZXNpemU7Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7CS8qIFNlcmlvdXMgY3Jvc3MtdGFyZ2V0IGlzc3VlIGhlcmUuLi4gIFRoaXMKLQkJCQkgICByZWFsbHkgbmVlZHMgdG8gY29tZSBmcm9tIGEgc3lzdGVtLXNwZWNpZmljCi0JCQkJICAgaGVhZGVyIGZpbGUuICAqLwotCi0gIC8qIEdldCB0aGUgcHNzIGVudHJ5IGZyb20gdGhlIGNvcmUgZmlsZSAqLwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnBzcywgMSwgc2l6ZW9mIHBzcywgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHBzcykKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBseW54X2NvcmVfc3RydWN0KSk7Ci0KLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgcHNzLnBuYW1lLCBQTk1MRU4gKyAxKTsKLQotICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgY29udGV4dHMgKi8KLQotICB0Y29udGV4dF9zaXplID0gcHNzLnRocmVhZGNudCAqIHNpemVvZiAoY29yZV9zdF90KTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHRocmVhZCBjb250ZXh0cyAqLwotCi0gIHRocmVhZHAgPSAoY29yZV9zdF90ICopYmZkX2FsbG9jIChhYmZkLCB0Y29udGV4dF9zaXplKTsKLSAgaWYgKCF0aHJlYWRwKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNhdmUgdGhyZWFkIGNvbnRleHRzICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBwYWdlc2l6ZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopdGhyZWFkcCwgcHNzLnRocmVhZGNudCwgc2l6ZW9mIChjb3JlX3N0X3QpLCBhYmZkKTsKLQotICBpZiAodmFsICE9IHRjb250ZXh0X3NpemUpCi0gICAgewotICAgICAgLyogUHJvYmFibHkgdG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSB0aHJlYWRwLT5jdXJyc2lnOwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0JCQkgICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAgICAgIHBzcy5zc2l6ZSwKLQkJCSAgICAgICBwc3Muc2xpbWl0LAotCQkJICAgICAgIHBhZ2VzaXplICsgdGNvbnRleHRfc2l6ZSk7Ci0gIGlmICghbmV3c2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBuZXdzZWN0ID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkgICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAgICAgIHBzcy5kYXRhX2xlbiArIHBzcy5ic3NfbGVuLAotCQkJICAgICAgIHBzcy5kYXRhX3N0YXJ0LAotCQkJICAgICAgIHBhZ2VzaXplICsgdGNvbnRleHRfc2l6ZSArIHBzcy5zc2l6ZQotI2lmIGRlZmluZWQgKFNQQVJDKSB8fCBkZWZpbmVkIChfX1NQQVJDX18pCi0JCQkgICAgICAgLyogU1BBUkMgTHlueCBzZWVtcyB0byBzdGFydCBkdW1waW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5kYXRhIHNlY3Rpb24gYXQgYSBwYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkuICBJdCdzIE9LIHRvIGNoZWNrIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGxpa2UgU1BBUkMgaGVyZSBiZWNhdXNlIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIGEgTHlueAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuICAqLwotCQkJICAgICAgICsgcHNzLmRhdGFfc3RhcnQgJSBwYWdlc2l6ZQotI2VuZGlmCi0JCQkgICAgICAgKTsKLSAgaWYgKCFuZXdzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0vKiBBbmQsIG5vdyBmb3IgdGhlIC5yZWcvWFhYIHBzZXVkbyBzZWN0aW9ucy4gIEVhY2ggdGhyZWFkIGhhcyBpdCdzIG93bgotICAgLnJlZy9YWFggc2VjdGlvbiwgd2hlcmUgWFhYIGlzIHRoZSB0aHJlYWQgaWQgKHdpdGhvdXQgbGVhZGluZyB6ZXJvcykuICBUaGUKLSAgIGN1cnJlbnRseSBydW5uaW5nIHRocmVhZCAoYXQgdGhlIHRpbWUgb2YgdGhlIGNvcmUgZHVtcCkgYWxzbyBoYXMgYW4gYWxpYXMKLSAgIGNhbGxlZCBgLnJlZycgKGp1c3QgdG8ga2VlcCBHREIgaGFwcHkpLiAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFgnIGFzCi0gICBvcHBvc2VkIHRvIGAucmVnWFhYJyBiZWNhdXNlIEdEQiBleHBlY3RzIHRoYXQgLnJlZzIgd2lsbCBiZSB0aGUgZmxvYXRpbmctCi0gICBwb2ludCByZWdpc3RlcnMuICAqLwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJICAgICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgc2l6ZW9mIChjb3JlX3N0X3QpLAotCQkJICAgICAgIDAsCi0JCQkgICAgICAgcGFnZXNpemUpOwotICBpZiAoIW5ld3NlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChzZWNudW0gPSAwOyBzZWNudW0gPCBwc3MudGhyZWFkY250OyBzZWNudW0rKykKLSAgICB7Ci0gICAgICBjaGFyIHNlY25hbWVbMTAwXTsKLQotICAgICAgc3ByaW50ZiAoc2VjbmFtZSwgIi5yZWcvJWQiLCBCVUlMRFBJRCAoMCwgdGhyZWFkcFtzZWNudW1dLnRpZCkpOwotICAgICAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLAotCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICAgc2l6ZW9mIChjb3JlX3N0X3QpLAotCQkJCSAgIDAsCi0JCQkJICAgcGFnZXNpemUgKyBzZWNudW0gKiBzaXplb2YgKGNvcmVfc3RfdCkpOwotICAgICAgaWYgKCFuZXdzZWN0KQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotY2hhciAqCi1seW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLWx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1seW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL202OGs0a25ldGJzZC5jIGIvYmZkL202OGs0a25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDM0MzhkLi4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrNGtuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL202OGsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTB4MTAwMAotCi0jZGVmaW5lIERFRkFVTFRfQVJDSAliZmRfYXJjaF9tNjhrCi0jZGVmaW5lIERFRkFVTFRfTUlEIAlNXzY4SzRLX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4azRrbmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGs0ay1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9tNjhrbGludXguYyBiL2JmZC9tNjhrbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1MTc1Ny4uMDAwMDAwMAotLS0gYS9iZmQvbTY4a2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBsaW51eCBmbGF2b3JlZCBtNjhrIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIDEwMjQKLSNkZWZpbmUJU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV82ODAyMCB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBNWShPUCkgQ0FUKG02OGtsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbGludXgiCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYyk7Ci0KLS8qIFdlIGFsd2F5cyBnZW5lcmF0ZSBRTUFHSUMgZmlsZXMgaW4gcHJlZmVyZW5jZSB0byBaTUFHSUMgZmlsZXMuICBJdAotICAgd291bGQgYmUgcG9zc2libGUgdG8gbWFrZSB0aGlzIGEgbGlua2VyIG9wdGlvbiwgaWYgdGhhdCBldmVyCi0gICBiZWNvbWVzIGltcG9ydGFudC4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLXN0YXRpYyBib29sZWFuIG02OGtsaW51eF9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID0gcV9tYWdpY19mb3JtYXQ7Ci0gIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIG02OGtsaW51eF9iZmRfZmluYWxfbGluawotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAyMCk7Ci0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIG02OGtsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMKLQwKLS8qIENvZGUgdG8gbGluayBhZ2FpbnN0IExpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLSNpZm5kZWYgR09UX1JFRl9QUkVGSVgKLSNkZWZpbmUJR09UX1JFRl9QUkVGSVgJIl9fR09UXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX0dPVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgR09UX1JFRl9QUkVGSVgsIHNpemVvZiBHT1RfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNpZm5kZWYgUExUX1JFRl9QUkVGSVgKLSNkZWZpbmUJUExUX1JFRl9QUkVGSVgJIl9fUExUXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX1BMVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgUExUX1JFRl9QUkVGSVgsIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFRoaXMgc3RyaW5nIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3BlY2lhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZuZGVmIE5FRURTX1NIUkxJQgotI2RlZmluZSBORUVEU19TSFJMSUIgIl9fTkVFRFNfU0hSTElCXyIKLSNlbmRpZgotCi0vKiBUaGlzIHNwZWNpYWwgc3ltYm9sIGlzIGEgc2V0IHZlY3RvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZgotICAgcG9pbnRlcnMgdG8gZml4dXAgdGFibGVzLiAgSXQgd2lsbCBiZSBwcmVzZW50IGluIGFueSBkeW5hbWljbHkKLSAgIGxpbmtlZCBmaWxlLiAgVGhlIGxpbmtlciBnZW5lcmF0ZWQgZml4dXAgdGFibGUgc2hvdWxkIGFsc28gYmUgYWRkZWQKLSAgIHRvIHRoZSBsaXN0LCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNlY29uZCBzbG90ICh0aGUKLSAgIGZpcnN0IG9uZSBpcyBhIGR1bW15IHdpdGggYSBtYWdpYyBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGluCi0gICBjcnQwLm8pLiAgKi8KLQotI2lmbmRlZiBTSEFSQUJMRV9DT05GTElDVFMKLSNkZWZpbmUgU0hBUkFCTEVfQ09ORkxJQ1RTICJfX1NIQVJBQkxFX0NPTkZMSUNUU19fIgotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFRoZSB0ZXJtaW5vbG9neSBpcyBhIGJpdCBzdHJhbmdlLCBidXQKLSAgIGVhY2ggZml4dXAgY29udGFpbnMgdHdvIDMyIGJpdCBudW1iZXJzLiAgQSByZWd1bGFyIGZpeHVwIGNvbnRhaW5zCi0gICBhbiBhZGRyZXNzIGFuZCBhIHBvaW50ZXIsIGFuZCBhdCBydW50aW1lIHdlIHNob3VsZCBzdG9yZSB0aGUKLSAgIGFkZHJlc3MgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXIuICBBIGJ1aWx0aW4gZml4dXAKLSAgIGNvbnRhaW5zIHR3byBwb2ludGVycywgYW5kIHdlIHNob3VsZCByZWFkIHRoZSBhZGRyZXNzIHVzaW5nIG9uZQotICAgcG9pbnRlciBhbmQgc3RvcmUgaXQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIG90aGVyCi0gICBwb2ludGVyLiAgQnVpbHRpbiBmaXh1cHMgY29tZSBpbnRvIHBsYXkgd2hlbiB3ZSBoYXZlIGR1cGxpY2F0ZQotICAgX19HT1RfXyBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZS4gIFRoZSBidWlsdGluIGZpeHVwIHdpbGwgY29weQotICAgdGhlIEdPVCBwb2ludGVyIGZyb20gb25lIG92ZXIgaW50byB0aGUgb3RoZXIuICAqLwotCi1zdHJ1Y3QgZml4dXAKLXsKLSAgc3RydWN0IGZpeHVwICpuZXh0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSBmaXhlZCwKLSAgICAgemVybyBpZiB0aGlzIGlzIGp1c3QgYSBwb2ludGVyICovCi0gIGNoYXIganVtcDsKLQotICBjaGFyIGJ1aWx0aW47Ci19OwotCi0vKiBXZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5lZWQKLSAgIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIGxpbmtlciBwYXNzZXMsIHNvIHdlIHVzZSBhIHNwZWNpYWwKLSAgIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBGaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiBsaW5rLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0KLSAgLyogTnVtYmVyIG9mIGZpeHVwcy4gICovCi0gIHNpemVfdCBmaXh1cF9jb3VudDsKLQotICAvKiBOdW1iZXIgb2YgYnVpbHRpbiBmaXh1cHMuICAqLwotICBzaXplX3QgbG9jYWxfYnVpbHRpbnM7Ci0KLSAgLyogTGlzdCBvZiBmaXh1cHMuICAqLwotICBzdHJ1Y3QgZml4dXAgKmZpeHVwX2xpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpsaW51eF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGZpeHVwICpuZXdfZml4dXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF90YWxseV9zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbGludXhfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHM7IHRoZXJlIGFyZW4ndCBhbnkuICAqLwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1saW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJCSBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmZpeHVwX2NvdW50ID0gMDsKLSAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7Ci0gIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotCQkJICAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYW91dF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIExpbnV4IGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBsaW51eF9oYXNoX3RhYmxlKHApICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciBhIG5ldyBmaXh1cC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKgotbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgYnVpbHRpbikKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBidWlsdGluOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLSAgZiA9IChzdHJ1Y3QgZml4dXAgKikgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBmaXh1cCkpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHJldHVybiBmOwotICBmLT5uZXh0ID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0gIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0ID0gZjsKLSAgZi0+aCA9IGg7Ci0gIGYtPnZhbHVlID0gdmFsdWU7Ci0gIGYtPmJ1aWx0aW4gPSBidWlsdGluOwotICBmLT5qdW1wID0gMDsKLSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0gIHJldHVybiBmOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSByZWFsaXplIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGxpbmsgdG8gYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotICAgZml4dXAgdGFibGUsIGFuZCB3ZSB1bHRpbWF0ZWx5IG5lZWQgdG8gYWRkIGEgcG9pbnRlciB0byB0aGlzIGludG8KLSAgIHRoZSBzZXQgdmVjdG9yIGZvciBTSEFSQUJMRV9DT05GTElDVFMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdAotICAga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgYnV0IHRoYXQncyBPSyAtIHdlIGp1c3QgbmVlZCB0bwotICAgY3JlYXRlIGl0IGZvciBub3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotCQkJCSAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIHN0cnVjdCBmaXh1cCAqZjsKLQotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0JICBpZiAoZiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotCSBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLQkgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotCQkgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotCQkJICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotCSAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotCSAgKnArKyA9ICdcMCc7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotCSAgICAgYWxsb2MsIHApOwotCSAgZnJlZSAoYWxsb2MpOwotCX0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdCBpdCAqLwotICBpc19wbHQgPSBJU19QTFRfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGlmIChpc19wbHQgfHwgSVNfR09UX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKSkKLSAgICB7Ci0gICAgICAvKiBMb29rIHVwIHRoaXMgc3ltYm9sIHR3aWNlLiAgT25jZSBqdXN0IGFzIGEgcmVndWxhciBsb29rdXAsCi0JIGFuZCB0aGVuIGFnYWluIGZvbGxvd2luZyBhbGwgb2YgdGhlIGluZGlyZWN0IGxpbmtzIHVudGlsIHdlCi0JIHJlYWNoIGEgcmVhbCBzeW1ib2wuICAqLwotICAgICAgaDEgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIC8qIGgyIGRvZXMgbm90IGZvbGxvdyBpbmRpcmVjdCBzeW1ib2xzLiAqLwotICAgICAgaDIgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotCSB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLQkgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0JIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotCSBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLQkgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLQkgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgxLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgICAgfHwgaDItPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpKQotCXsKLQkgIC8qIFNlZSBpZiB0aGVyZSBpcyBhICJidWlsdGluIiBmaXh1cCBhbHJlYWR5IHByZXNlbnQKLQkgICAgIGludm9sdmluZyB0aGlzIHN5bWJvbC4gIElmIHNvLCBjb252ZXJ0IGl0IHRvIGEgcmVndWxhcgotCSAgICAgZml4dXAuICBJbiB0aGUgZW5kLCB0aGlzIHJlbGF4ZXMgc29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzCi0JICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcGVyZm9ybWluZyBmaXh1cHMuICAqLwotCSAgZXhpc3RzID0gZmFsc2U7Ci0JICBmb3IgKGYxID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0JICAgICAgIGYxICE9IE5VTEw7Ci0JICAgICAgIGYxID0gZjEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKGYxLT5oICE9IGggJiYgZjEtPmggIT0gaDEpCi0JCSAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChmMS0+aCA9PSBoMSkKLQkJZXhpc3RzID0gdHJ1ZTsKLQkgICAgICBpZiAoISBleGlzdHMKLQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkJICBmLT5qdW1wID0gaXNfcGx0OwotCQl9Ci0JICAgICAgZjEtPmggPSBoMTsKLQkgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLQkgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0JICAgICAgZXhpc3RzID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKCEgZXhpc3RzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkgICAgICBpZiAoZiA9PSBOVUxMKQotCQl7Ci0JCSAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotCSBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCBmaW5kIHRoZSBmaXh1cHMuLi4gKi8KLSAgbGludXhfbGlua19oYXNoX3RyYXZlcnNlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBsaW51eF90YWxseV9zeW1ib2xzLAotCQkJICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQl7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGZpeHVwIHRhYmxlLiAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwgCi0JICBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JICBvcy0+dm1hICsgcy0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQotICBmaXh1cF90YWJsZSA9IHMtPmNvbnRlbnRzOwotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQsIGZpeHVwX3RhYmxlKTsKLSAgZml4dXBfdGFibGUgKz0gNDsKLQotICAvKiBGaWxsIGluIGZpeHVwIHRhYmxlLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiRml4dXAoJWQpICVzOiAleCAleFxuIixmLT5qdW1wLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCSAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGYtPmp1bXApCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSArIDIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGlucyAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNwZWNpYWwgbWFya2VyIHNvIHdlIGtub3cgdG8gc3dpdGNoIHRvIHRoZSBvdGhlciB0eXBlIG9mIGZpeHVwICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBpZiAoISBmLT5idWlsdGluKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotCQkgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotCSAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLQkgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLQkJICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgIT0gZml4dXBzX3dyaXR0ZW4pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJXYXJuaW5nOiBmaXh1cCBjb3VudCBtaXNtYXRjaFxuIikpOwotICAgICAgd2hpbGUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IGZpeHVwc193cml0dGVuKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gICAgfQotCi0gIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkgICAgICAiX19CVUlMVElOX0ZJWFVQU19fIiwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgaXMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJCdWlsdGluIGZpeHVwIHRhYmxlIGF0ICV4XG4iLCBuZXdfYWRkcik7Ci0jZW5kaWYKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBvdXRwdXRfYmZkKQotICAgICAgIT0gcy0+X3Jhd19zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbTY4a2x5bnguYyBiL2JmZC9tNjhrbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNkZmJjLi4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBtNjhrIGJpbmFyaWVzIHVuZGVyIEx5bnhPUy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a2x5bnhfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbHlueCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLWNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCgpOwotaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKCk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wKCk7Ci0KLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcCBseW54X2NvcmVfZmlsZV9wCi0KLSNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbTY4a25ldGJzZC5jIGIvYmZkL202OGtuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMTY2NS4uMDAwMDAwMAotLS0gYS9iZmQvbTY4a25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLS8qIE91ciBtNjhrIHBvcnRzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCi0gICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gYWxsIG02OGsgbWFjaGluZXMuICovCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a25ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tNjhrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL204OGttYWNoMy5jIGIvYmZkL204OGttYWNoMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTU2NDA4Li4wMDAwMDAwCi0tLSBhL2JmZC9tODhrbWFjaDMuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgbTg4ayBhLm91dCAoTWFjaCAzKSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJKDQwOTYqMikKLSNkZWZpbmUgU0VHTUVOVF9TSVpFCTB4MjAwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTAKLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMSAJCS8qIChOX01BR0lHKHgpID09IFpNQUdJQykgKi8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkJKCh4KS5hX3RleHQpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX204OGsKLSNkZWZpbmUgTVkoT1ApIENBVChtODhrbWFjaDNfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tODhrLW1hY2gzIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tYWtlZmlsZS52bXMgYi9iZmQvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDZiMWZmLi4wMDAwMDAwCi0tLSBhL2JmZC9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBiZmQgbGlicmFyeSB1bmRlciBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBybWkuZGUKLSMKLSMKLQotQ0M9Y2MKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLUhPU1RGSUxFPWFscGhhdm1zLmgKLVRBUkdFVE9CSlMgPSBjcHUtYWxwaGEub2JqCi1lbHNlCi1IT1NURklMRT12YXh2bXMuaAotVEFSR0VUT0JKUyA9IGNwdS12YXgub2JqCi1lbmRpZgotCi0KLU9CSlM9YXJjaGl2ZS5vYmosYXJjaHVyZXMub2JqLGJmZC5vYmosY2FjaGUub2JqLGNvZmZnZW4ub2JqLGNvcmVmaWxlLm9iaixcCi0gIGZvcm1hdC5vYmosaW5pdC5vYmosbGliYmZkLm9iaixvcG5jbHMub2JqLHJlbG9jLm9iaixzZWN0aW9uLm9iaixzeW1zLm9iaixcCi0gIHRhcmdldHMub2JqLGhhc2gub2JqLGxpbmtlci5vYmosZWxmLm9iaixzcmVjLm9iaixiaW5hcnkub2JqLHRla2hleC5vYmosXAotICBpaGV4Lm9iaixzdGFiLXN5bXMub2JqLHZtcy5vYmosdm1zLWhkci5vYmosdm1zLWdzZC5vYmosdm1zLXRpci5vYmosXAotICB2bXMtbWlzYy5vYmosJChUQVJHRVRPQkpTKQotCi1pZmVxICgkKENDKSxnY2MpCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc19hbHBoYV92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX2FscGhhX2FyY2giLFwKLSJIQVZFX3Ztc19hbHBoYV92ZWM9MSIpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX3ZheF92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX3ZheF9hcmNoIixcCi0iSEFWRV92bXNfdmF4X3ZlYz0xIiwiVk1TX0RFQlVHIikKLWVuZGlmCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKSQoREVGUykKLWVsc2UKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX2FscGhhX3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfYWxwaGFfYXJjaCIsXAotIkhBVkVfdm1zX2FscGhhX3ZlYz0xIiwidW5saW5rPXJlbW92ZSIsImNvbnN0PSIsIlZNU19ERUJVRyIsKQotZWxzZQotREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc192YXhfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF92YXhfYXJjaCIsXAotIkhBVkVfdm1zX3ZheF92ZWM9MSIsInVubGluaz1yZW1vdmUiLCJjb25zdD0iLCJWTVNfREVCVUciKQotZW5kaWYKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pJChERUZTKS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxsb25nZXh0ZXJuKQotZW5kaWYKLQotCi1saWJiZmQub2xiOiBzeXNkZXAuaCBiZmQuaCAkKE9CSlMpCi0JcHVyZ2UKLQlsaWIvY3JlYXRlIGxpYmJmZCAkKE9CSlMpCi0KLXN5c2RlcC5oOiBbLmhvc3RzXSQoSE9TVEZJTEUpIGNvbmZpZy5oCi0JJChDUCkgJDwgJEAKLQotYmZkLmg6IGJmZC1pbjIuaAotCSQkIEBjb25maWd1cmUKLQotdGFyZ21hdGNoLmg6IGJmZC5oCi1jb25maWcuaDogYmZkLmgKLQotdm1zLmM6IHZtcy5oCi12bXMtbWhkLmM6IHZtcy5oCi12bXMtZ3NkLmM6IHZtcy5oCi12bXMtdGlyLmM6IHZtcy5oCi12bXMtbWlzYy5jOiB2bXMuaAotdGFyZ2V0cy5jOiB0YXJnbWF0Y2guaAotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pIGxpYmJmZC5vbGI7Ci0JJChSTSkgc3lzZGVwLmg7Ci0JJChSTSkgYmZkLmg7Ci0JJChSTSkgdGFyZ21hdGNoLmg7Ci0JJChSTSkgY29uZmlnLmg7Ci0JJChSTSkgKi5vYmo7CmRpZmYgLS1naXQgYS9iZmQvbWlwc2JzZC5jIGIvYmZkL21pcHNic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ODBmYi4uMDAwMDAwMAotLS0gYS9iZmQvbWlwc2JzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBNSVBTIEJTRCAoYS5vdXQpIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUmFscGggQ2FtcGJlbGwuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLS8qICNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8gKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gKHgpLmFfZW50cnkgOgkvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi9cCi0JICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRQkvKiBubyBwYWRkaW5nICovXAotICAgICkKLSNkZWZpbmUgTl9EQVRBRERSKHgpIChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX21pcHMKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fVU5LTk9XTiBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNX01JUFMxIHx8IChtdHlwZSkgPT0gTV9NSVBTMikKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXDAnCi0KLSNkZWZpbmUgTVkoT1ApIENBVChtaXBzYnNkXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKEFCRkQsIEVYRUMpIFwKLSAgTVkoc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIE1ZKGNob29zZV9yZWxvY19zaXplKShBQkZEKTsKLXN0YXRpYyB2b2lkIE1ZKHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG1hY2h0eXBlKSk7Ci1zdGF0aWMgdm9pZCBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLS8qIFdlIGNhbid0IHVzZSBNWSh4KSBoZXJlIGJlY2F1c2UgaXQgbGVhZHMgdG8gYSByZWN1cnNpdmUgY2FsbCB0byBDQVQKLSAgIHdoZW4gZXhwYW5kZWQgaW5zaWRlIEpVTVBfVEFCTEUuICAqLwotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc2JzZF9yZWxvY19ob3d0b190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgbWlwc2JzZF9jYW5vbmljYWxpemVfcmVsb2MKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotI2RlZmluZSBNWV9CRkRfVEFSR0VUCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi1zdGF0aWMgdm9pZAotTVkoc2V0X2FyY2hfbWFjaCkgKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGxvbmcgbWFjaGluZTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gKi8KLSAgc3dpdGNoIChtYWNodHlwZSkgewotCi0gIGNhc2UgTV9NSVBTMToKLSAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICBtYWNoaW5lID0gMzAwMDsKLSAgICBicmVhazsKLQotICBjYXNlIE1fTUlQUzI6Ci0gICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgbWFjaGluZSA9IDQwMDA7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICBtYWNoaW5lID0gMDsKLSAgICBicmVhazsKLSAgfQotICBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsgIAotfQotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotTVkoY2hvb3NlX3JlbG9jX3NpemUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEJTRCBhLm91dCBmb3JtYXQuCi0gIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaChhYmZkKSkgewotICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgc3dpdGNoIChiZmRfZ2V0X21hY2goYWJmZCkpIHsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAxMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82ODAxMCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbTY4MDIwOgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4MDIwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fU1BBUkMpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzM4Nik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMjlLKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoKGFiZmQpKSB7Ci0gICAgY2FzZSA0MDAwOgotICAgIGNhc2UgNjAwMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9NSVBTMik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX01JUFMxKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gIH0KLQotICBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkoYWJmZCk7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKiBNSVBTIHJlbG9jYXRpb24gdHlwZXMuCi0gKi8KLSNkZWZpbmUgTUlQU19SRUxPQ18zMgkJMAotI2RlZmluZSBNSVBTX1JFTE9DX0pNUAkJMQotI2RlZmluZSBNSVBTX1JFTE9DX1dESVNQMTYJMgotI2RlZmluZSBNSVBTX1JFTE9DX0hJMTYJCTMKLSNkZWZpbmUgTUlQU19SRUxPQ19ISTE2X1MJNAotI2RlZmluZSBNSVBTX1JFTE9DX0xPMTYJCTUKLQotLyoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBwZXJmb3JtaW5nIGEgQkZEX1JFTE9DX01JUFNfSk1QIHJlbG9jYXRpb24uCi0gKiBUaGUganVtcCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGZvcm1lZCBmcm9tIHRoZSB1cHBlciA0IGJpdHMgb2YgdGhlCi0gKiAiY3VycmVudCIgcHJvZ3JhbSBjb3VudGVyIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBqdW1wIGluc3RydWN0aW9uJ3MKLSAqIDI2IGJpdCBmaWVsZCBhbmQgdHdvIHRyYWlsaW5nIHplcm9zLgotICogSWYgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgbm90IGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlICJjdXJyZW50IgotICogcHJvZ3JhbSBjb3VudGVyLCB0aGVuIHdlIG5lZWQgdG8gc2lnbmFsIGFuIGVycm9yLgotICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9qbXBfYWRkciAoYWJmZCxyZWxvY19lbnRyeSxzeW1ib2wsZGF0YSxpbnB1dF9zZWN0aW9uLG91dHB1dF9iZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotewotICBiZmRfdm1hIHJlbG9jYXRpb24sIHBjOwotIAotICAvKiBJZiB0aGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBqdXN0IGNvbnRpbnVlLiAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogCi0gICAqIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICogaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuCi0gICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcGMgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKyA0OwotCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4RjAwMDAwMDApICE9IChwYyAmIDB4RjAwMDAwMDApKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBwZXJmb3JtaW5nIGEgQkZEX1JFTE9DX0hJMTZfUyByZWxvY2F0aW9uLgotICogV2UgbmVlZCB0byBzZWUgaWYgYml0IDE1IGlzIHNldCBpbiB0aGUgcmVzdWx0LiBJZiBpdCBpcywgd2UgYWRkCi0gKiAweDEwMDAwIGFuZCBjb250aW51ZSBub3JtYWxseS4gVGhpcyB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSBzaWduIGV4dGVuc2lvbgotICogd2hlbiB0aGUgbG93IGJpdHMgYXJlIGFkZGVkIGF0IHJ1biB0aW1lLgotICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9oaTE2X3MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19maXhfaGkxNl9zIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotIAotICAvKiBJZiB0aGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBqdXN0IGNvbnRpbnVlLiAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogCi0gICAqIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICogaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuCi0gICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jYXRpb24gJiAweDgwMDApCi0gICAgcmVsb2NfZW50cnktPmFkZGVuZCArPSAweDEwMDAwOwotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfaG93dG9fdGFibGVfZXh0W10gPSB7Ci0gIHtNSVBTX1JFTE9DXzMyLCAgICAgIDAsIDIsIDMyLCBmYWxzZSwgMCwgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLAotCSIzMiIsICAgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0pNUCwgICAgIDIsIDIsIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQltaXBzX2ZpeF9qbXBfYWRkciwKLQkiTUlQU19KTVAiLCBmYWxzZSwgMCwgMHgwM2ZmZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19XRElTUDE2LCAyLCAyLCAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkiV0RJU1AxNiIsICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19ISTE2LCAgIDE2LCAyLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLAotCSJISTE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0hJMTZfUywgMTYsIDIsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgICAgIG1pcHNfZml4X2hpMTZfcywKLSAgICAgICAgIkhJMTZfUyIsICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfTE8xNiwgICAgMCwgMiwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSJMTzE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1NWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCkgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAoYWJmZCkgIT0gYmZkX2FyY2hfbWlwcykKLSAgICByZXR1cm4gMDsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DXzMyXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX0pNUF0pOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19XRElTUDE2XSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSEkxNl0pOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSEkxNl9TXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfTE8xNl0pOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgYW91dHguaCB2ZXJzaW9uIGJ1dCB3ZSBuZWVkIHRvIGRvIG91cgotICogb3duIG1hcHBpbmcgb2YgZXh0ZXJuYWwgcmVsb2MgdHlwZSB2YWx1ZXMgdG8gaG93dG8gZW50cmllcy4KLSAqLwotbG9uZwotTVkoY2Fub25pY2FsaXplX3JlbG9jKShhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgICBiZmQgKmFiZmQ7Ci0gICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCwgYzsKLSAgZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgTkFNRShhb3V0LGV4dF9ob3d0b190YWJsZSlbXTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZSwgcmV0dXJuIHRoZSB2YWx1ZXMuICovCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykgewotICAgICAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OwotICAgIH0KLSAgICAqcmVscHRyID0gMDsKLSAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIH0KLSAgaWYgKHRibHB0ciAmJiBzZWN0aW9uLT5yZWxvY19jb3VudCkgewotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KSAKLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotCi0gIGlmICghTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKShhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLSAgICByZXR1cm4gLTE7Ci0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgLyogZml4IHVwIGhvd3RvIGVudHJpZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspIAotICAgIHsKLSAgICAgIGMgPSB0YmxwdHItPmhvd3RvIC0gTkFNRShhb3V0LGV4dF9ob3d0b190YWJsZSk7Ci0gICAgICB0YmxwdHItPmhvd3RvID0gJm1pcHNfaG93dG9fdGFibGVfZXh0W2NdOwotCi0gICAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgMCwJCQkJLyogem1hZ2ljIGNvbnRpZ3VvdXMgKi8KLSAgMSwJCQkJLyogdGV4dCBpbmNsIGhlYWRlciAqLwotICAwLAkJCQkvKiBlbnRyeSBpcyB0ZXh0IGFkZHJlc3MgKi8KLSAgMCwJCQkJLyogZXhlY19oZHJfZmxhZ3MgKi8KLSAgVEFSR0VUX1BBR0VfU0laRSwJCQkvKiB0ZXh0IHZtYSAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIDAsCQkJCS8qIHRleHQgc2l6ZSBpbmNsdWRlcyBleGVjIGhlYWRlciAqLwotICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCi0gIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCi0gIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KLSAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KLSAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLwotICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KLX07Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19iaWdfdmVjOwotCi1jb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjID0KLXsKLSAgImEub3V0LW1pcHMtbGl0dGxlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgYW91dF9taXBzX2JpZ192ZWMsCi0gIAotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2JpZ192ZWMgPQotewotICAiYS5vdXQtbWlwcy1iaWciLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAoYmlnKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBhb3V0X21pcHNfbGl0dGxlX3ZlYywKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YQotfTsKZGlmZiAtLWdpdCBhL2JmZC9tcHctY29uZmlnLmluIGIvYmZkL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWRkZWUuLjAwMDAwMDAKLS0tIGEvYmZkL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIEJGRC4KLQotIyBUaGlzIGlzIGFsbW9zdCBhbHdheXMgY29ycmVjdC4KLQotU2V0IHNlbGFyY2hzICImYmZkX3t0YXJnZXRfY3B1fV9hcmNoIgotU2V0IGRlZnZlYyAiIgotU2V0IHNlbHZlY3MgIiIKLVNldCBoYXZldmVjcyAiIgotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtbTY4ay5jLm8gIntvfSJjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBtNjhrY29mZl92ZWMKLQlTZXQgc2VsdmVjcyAnJm02OGtjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfbTY4a2NvZmZfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1wbWFjLmMubyAie299Inhjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBwbWFjX3hjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmcG1hY194Y29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX3BtYWNfeGNvZmZfdmVjJwotCVNldCBzZWxhcmNocyAiJmJmZF9wb3dlcnBjX2FyY2giCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL2kzODYtXE9wdGlvbi14LWdvMzIvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLWkzODYuYy5vJwotCVNldCBkZWZ2ZWMgaTM4NmNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZpMzg2Y29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX2kzODZjb2ZmX3ZlYycKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtXE9wdGlvbi14LwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1taXBzLmMubyAie299ImVjb2ZmLmMubyAie299ImVjb2ZmbGluay5jLm8gIntvfSJlbGYzMi5jLm8gIntvfSJlbGYzMi1taXBzLmMubyAie299ImVsZmxpbmsuYy5vJwotCVNldCBkZWZ2ZWMgZWNvZmZfYmlnX3ZlYwotCVNldCBzZWx2ZWNzICcmZWNvZmZfYmlnX3ZlYywmZWNvZmZfbGl0dGxlX3ZlYywmYmZkX2VsZjMyX2JpZ21pcHNfdmVjJwotCVNldCBoYXZldmVjcyAnLWQgSEFWRV9lY29mZl9iaWdfdmVjIC1kIEhBVkVfZWNvZmZfbGl0dGxlX3ZlYyAtZCBIQVZFX2JmZF9lbGYzMl9iaWdtaXBzX3ZlYycKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtXE9wdGlvbi14LWhtcy8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtc2guYy5vICJ7b30iY29mZmxpbmsuYy5vJwotCVNldCBkZWZ2ZWMgc2hjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmc2hjb2ZmX3ZlYywmc2hsY29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX3NoY29mZl92ZWMgLWQgSEFWRV9zaGxjb2ZmX3ZlYycKLUVuZCBJZgotCi1TZXQgdGEgYGVjaG8ge3NlbGFyY2hzfSB8IHNlZCAtZSAncy8mYmZkXy97b31jcHUtL2cnIC1lICdzL19hcmNoLy5jLm8vZydgCi0KLVNldCB0ZGVmYXVsdHMgIi1kIERFRkFVTFRfVkVDVE9SPXtkZWZ2ZWN9IC1kIFNFTEVDVF9WRUNTPXtzZWx2ZWNzfSAtZCBTRUxFQ1RfQVJDSElURUNUVVJFUz17c2VsYXJjaHN9IHtoYXZldmVjc30iCi0KLUVjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJwkJCQkgPiAie299Im1rLnRtcAotRWNobyAnV09SRFNJWkUgPSAzMicJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdCRkRfTUFDSElORVMgPSAnIHt0YX0JCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ0JGRF9CQUNLRU5EUyA9ICcge0JGRF9CQUNLRU5EU30JCQk+PiAie299Im1rLnRtcAotRWNobyAnVERFRkFVTFRTID0gJyB7dGRlZmF1bHRzfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnSERFUEZJTEVTID0gJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ1RERVBGSUxFUyA9ICcJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQkJPj4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaAotCi0jIFdlIGNhbiBvbmx5IGhhbmRsZSAzMi1iaXQgdGFyZ2V0cyByaWdodCBub3cuCi0KLXNlZCAtZSAncy9AV09SRFNJWkVALzMyLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQHdvcmRzaXplQC8zMi8nIFxPcHRpb24tZAotICAgIC1lICJzL0BWRVJTSU9OQC9gQ2F0ZW5hdGUge3NyY2Rpcn1WRVJTSU9OYC8iIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAvMC8nIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF82NF9CSVRALy8nIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF9VXzY0X0JJVEAvLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0QklUX0xPTkdALzAvJyBcT3B0aW9uLWQKLSAgICAie3NyY2Rpcn0iYmZkLWluMi5oID4ie299ImJmZC5oLW5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJiZmQuaC1uZXcgIntvfSJiZmQuaAotCi1zZWQgLWUgJ3MvTk4vMzIvZycgIntzcmNkaXJ9ImVsZnh4LXRhcmdldC5oID4ie299ImVsZjMyLXRhcmdldC5oLW5ldwotTW92ZUlmQ2hhbmdlICJ7b30iZWxmMzItdGFyZ2V0LmgtbmV3ICJ7b30iZWxmMzItdGFyZ2V0LmgKLQotIyBQcmUtZXhwYW5kIHNvbWUgbWFjcm9zIGluIGNvZmZzd2FwLmgsIHNvIE1QVyBDIGRvZXNuJ3QgY2hva2UuCi0KLXNlZCAtZSAncy9eICBQVVRfQU9VVEhEUl9UU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9EU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9CU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9FTlRSWSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKC8gIGJmZF9oX3B1dF8zMiAoLycgXE9wdGlvbi1kCi0gICAgIntzcmNkaXJ9ImNvZmZzd2FwLmggPiJ7b30iY29mZnN3YXAuaC1uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29mZnN3YXAuaC1uZXcgIntvfSJjb2Zmc3dhcC5oCmRpZmYgLS1naXQgYS9iZmQvbXB3LW1ha2Uuc2VkIGIvYmZkL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0NjNjNy4uMDAwMDAwMAotLS0gYS9iZmQvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBVbml4IEJGRCBNYWtlZmlsZSBpbnRvIE1QVyBzeW50YXguCi0KLSMgV2hhY2sgb3V0IHVudXNlZCBob3N0IGFuZCB0YXJnZXQgZGVmaW5lIGJpdHMuCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLS9UREVGSU5FUy9zL0BUREVGSU5FU0AvLwotCi0jIEZpeCBwYXRobmFtZXMgdG8gaW5jbHVkZSBkaXJlY3Rvcmllcy4KLS9eSU5DRElSID0gL3MvXklOQ0RJUiA9IC4qJC9JTkNESVIgPSAie3RvcHNyY2Rpcn0iaW5jbHVkZS8KLS9eQ1NFQVJDSCA9IC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotCi0jIENvbW1lbnQgb3V0IHNldHRpbmcgb2YgdmFycywgY29uZmlndXJlIHNjcmlwdCB3aWxsIGFkZCB0aGVzZSBpdHNlbGYuCi0vXldPUkRTSVpFID0vcy9eLyMvCi0jIC9eQUxMX0JBQ0tFTkRTL3MvXi8jLwotL15CRkRfQkFDS0VORFMvcy9eLyMvCi0vXkJGRF9NQUNISU5FUy9zL14vIy8KLS9eVERFRkFVTFRTL3MvXi8jLwotCi0jIFJlbW92ZSBleHRyYSwgdXNlbGVzcywgImFsbCIuCi0vXmFsbCBcXE9wdGlvbi1mIF9vbGRlc3QvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBNYWtlZmlsZSByZWJ1aWxkIHJ1bGUuCi0vXk1ha2VmaWxlIC8sLy0tcmVjaGVjay9kCi0KLSMgRG9uJ3QgZG8gYW55IHJlY3Vyc2l2ZSBzdWJkaXIgc3R1ZmYuCi0vIHN1YmRpcl9kby9zL3tNQUtFfS9udWxsLWNvbW1hbmQvCi0KLS9CRkRfSC9zL157QkZEX0h9LyN7QkZEX0h9LwotCi0jIEFkZCBleHBsaWNpdCBzcmNkaXIgcGF0aHMgdG8gc3BlY2lhbCBmaWxlcy4KLS9jb25maWcuYmZkL3MvIGNvbmZpZy5iZmQvICJ7c30iY29uZmlnLmJmZC9nCi0vdGFyZ21hdGNoLnNlZC9zLyB0YXJnbWF0Y2guc2VkLyAie3N9InRhcmdtYXRjaC5zZWQvZwotCi0jIFBvaW50IGF0IGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgYWx3YXlzIGluIHRoZSBvYmpkaXIuCi0vYmZkL3MvIntzfSJiZmRcLmgvIntvfSJiZmQuaC9nCi0vY29uZmlnL3MvIntzfSJjb25maWdcLmgvIntvfSJjb25maWcuaC9nCi0vdGFyZ21hdGNoL3MvIntzfSJ0YXJnbWF0Y2hcLmgvIntvfSJ0YXJnbWF0Y2guaC9nCi0vdGFyZ21hdGNoL3MvXnRhcmdtYXRjaFwuaC8ie299InRhcmdtYXRjaC5oLwotL2VsZjMyLXRhcmdldC9zLyJ7c30iZWxmMzItdGFyZ2V0XC5oLyJ7b30iZWxmMzItdGFyZ2V0LmgvZwotL2VsZjMyLXRhcmdldC9zL15lbGYzMi10YXJnZXRcLmgvIntvfSJlbGYzMi10YXJnZXQuaC8KLS9lbGY2NC10YXJnZXQvcy8ie3N9ImVsZjY0LXRhcmdldFwuaC8ie299ImVsZjY0LXRhcmdldC5oL2cKLS9lbGY2NC10YXJnZXQvcy9eZWxmNjQtdGFyZ2V0XC5oLyJ7b30iZWxmNjQtdGFyZ2V0LmgvCi0KLS8ie3N9IntJTkNESVJ9L3MvIntzfSJ7SU5DRElSfS8ie0lOQ0RJUn0iL2cKLQotL2RlcC9zL1wuZGVwL19fZGVwL2cKLQotIyBSZW1vdmluZyBkdXBsaWNhdGVzIGlzIGNvb2wgYnV0IHByZXNlbnRseSB1bm5lY2Vzc2FyeSwKLSMgc28gd2hhY2sgdGhpcyBvdXQuCi0vXm9maWxlcyBcXE9wdGlvbi1mLywvXiQvZAotL29maWxlcy9zL3tPRklMRVN9IG9maWxlcy97T0ZJTEVTfS8KLS9lY2hvIG9maWxlcyA9IC9kCi0vY2F0IG9maWxlcy9zL2BjYXQgb2ZpbGVzYC97T0ZJTEVTfS8KLQotIyBObyBjb3JlZmlsZSBzdXBwb3J0LgotL0NPUkVGSUxFL3MvQENPUkVGSUxFQC8vCi0vQ09SRUZMQUcvcy9AQ09SRUZMQUdALy8KLQotIyBObyBQSUMgZm9vbGVyeSBpbiB0aGlzIGVudmlyb25tZW50LgotL0BBTExMSUJTQC9zL0BBTExMSUJTQC97VEFSR0VUTElCfS8KLS9AUElDTElTVEAvcy9AUElDTElTVEAvLwotL0BQSUNGTEFHQC9zL0BQSUNGTEFHQC8vCi0vXntPRklMRVN9IFxcT3B0aW9uLWYgc3RhbXAtcGljZGlyLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgcGljIHRyaWNrZXJ5IGZyb20gdGhlIGRlZmF1bHQgYnVpbGQgcnVsZS4KLS9eXC5jXC5vIFxcT3B0aW9uLWYgLywvRW5kIElmL2NcCi0uYy5vIFxcT3B0aW9uLWYgLmMKLQotIyBNUFcgTWFrZSBkb2Vzbid0IGtub3cgYWJvdXQgJDwuCi0vIntvfSJ0YXJnZXRzLmMubyBcXE9wdGlvbi1mICJ7c30idGFyZ2V0cy5jIE1ha2VmaWxlLywvXiQvY1wKLSJ7b30idGFyZ2V0cy5jLm8gXFxPcHRpb24tZiAie3N9InRhcmdldHMuYyBNYWtlZmlsZVwKLQl7Q0N9IEBEQVNIX0NfRkxBR0Age0FMTF9DRkxBR1N9IHtUREVGQVVMVFN9ICJ7c30idGFyZ2V0cy5jIC1vICJ7b30idGFyZ2V0cy5jLm8KLQotLyJ7b30iYXJjaHVyZXMuYy5vIFxcT3B0aW9uLWYgIntzfSJhcmNodXJlcy5jIE1ha2VmaWxlLywvXiQvY1wKLSJ7b30iYXJjaHVyZXMuYy5vIFxcT3B0aW9uLWYgIntzfSJhcmNodXJlcy5jIE1ha2VmaWxlXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7QUxMX0NGTEFHU30ge1RERUZBVUxUU30gIntzfSJhcmNodXJlcy5jIC1vICJ7b30iYXJjaHVyZXMuYy5vCi0KLSMgUmVtb3ZlIHRoZSAuaCByZWJ1aWxkaW5nIHJ1bGVzLCB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIGRvYyBzdWJkaXIsCi0jIG9yIGEgd2F5IHRvIGJ1aWxkIHRoZSBwcm90b3R5cGUtaGFja2luZyB0b29sIHRoYXQncyBpbiBpdC4KLS9eIntzcmNkaXJ9ImJmZC1pbjIuaCBcXE9wdGlvbi1mIC8sL14kL2QKLS9eIntzcmNkaXJ9ImxpYmJmZC5oIFxcT3B0aW9uLWYgLywvXiQvZAotL14ie3NyY2Rpcn0ibGliY29mZi5oIFxcT3B0aW9uLWYgLywvXiQvZApkaWZmIC0tZ2l0IGEvYmZkL25ldGJzZC1jb3JlLmMgYi9iZmQvbmV0YnNkLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4YzJhMS4uMDAwMDAwMAotLS0gYS9iZmQvbmV0YnNkLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIE5ldEJTRCBzdHlsZSBjb3JlIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBQYXVsIEtyYW5lbmJ1cmcsIEVVUgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0vKgotICogRklYTUU6IE9uIE5ldEJTRC9zcGFyYyBDT1JFX0ZQVV9PRkZTRVQgc2hvdWxkIGJlIChzaXplb2Yoc3RydWN0IHRyYXBmcmFtZSkpCi0gKi8KLQotc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCB7Ci0Jc3RydWN0IGNvcmUgY29yZTsKLX0gKnJhd3B0cjsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgluZXRic2RfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgY2hhciAqCQluZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgCQluZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4JCW5ldGJzZF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJCSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZAkJc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEhhbmRsZSBOZXRCU0Qtc3R5bGUgY29yZSBkdW1wIGZpbGUuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotbmV0YnNkX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0KLXsKLQlpbnQJCWksIHZhbCwgb2Zmc2V0OwotCWFzZWN0aW9uCSphc2VjdCwgKmFzZWN0MjsKLQlzdHJ1Y3QgY29yZQljb3JlOwotCXN0cnVjdCBjb3Jlc2VnCWNvcmVzZWc7Ci0KLQl2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmY29yZSwgMSwgc2l6ZW9mIGNvcmUsIGFiZmQpOwotCWlmICh2YWwgIT0gc2l6ZW9mIGNvcmUpIHsKLQkJLyogVG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0JCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChDT1JFX0dFVE1BR0lDKGNvcmUpICE9IENPUkVNQUdJQykgewotCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYXdwdHIgPSAoc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QpKTsKLQlpZiAocmF3cHRyID09IE5VTEwpIHsKLQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmF3cHRyLT5jb3JlID0gY29yZTsKLQlhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhID0gcmF3cHRyOwotCi0Jb2Zmc2V0ID0gY29yZS5jX2hkcnNpemU7Ci0JZm9yIChpID0gMDsgaSA8IGNvcmUuY19uc2VnOyBpKyspIHsKLQotCQlpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JCQlnb3RvIHB1bnQ7Ci0KLQkJdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJmNvcmVzZWcsIDEsIHNpemVvZiBjb3Jlc2VnLCBhYmZkKTsKLQkJaWYgKHZhbCAhPSBzaXplb2YgY29yZXNlZykgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCQkJZ290byBwdW50OwotCQl9Ci0JCWlmIChDT1JFX0dFVE1BR0lDKGNvcmVzZWcpICE9IENPUkVTRUdNQUdJQykgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJCWdvdG8gcHVudDsKLQkJfQotCi0JCW9mZnNldCArPSBjb3JlLmNfc2VnaGRyc2l6ZTsKLQotCQlhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YoYXNlY3Rpb24pKTsKLQkJaWYgKGFzZWN0ID09IE5VTEwpIHsKLQkJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQlnb3RvIHB1bnQ7Ci0JCX0KLQotCQlhc2VjdC0+X3Jhd19zaXplID0gY29yZXNlZy5jX3NpemU7Ci0JCWFzZWN0LT52bWEgPSBjb3Jlc2VnLmNfYWRkcjsKLQkJYXNlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7Ci0JCWFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCQlhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotCQlhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotCQlhYmZkLT5zZWN0aW9uX2NvdW50Kys7Ci0JCW9mZnNldCArPSBjb3Jlc2VnLmNfc2l6ZTsKLQotCQlzd2l0Y2ggKENPUkVfR0VURkxBRyhjb3Jlc2VnKSkgewotCQljYXNlIENPUkVfQ1BVOgotCQkJYXNlY3QtPm5hbWUgPSAiLnJlZyI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTOwotI2lmZGVmIENPUkVfRlBVX09GRlNFVAotCQkJLyogSGFja2lzaC4uLiAqLwotCQkJYXNlY3QtPl9yYXdfc2l6ZSA9IENPUkVfRlBVX09GRlNFVDsKLQkJCWFzZWN0MiA9IChhc2VjdGlvbiAqKWJmZF96YWxsb2MgKGFiZmQsCi0JCQkJCQkJIHNpemVvZiAoYXNlY3Rpb24pKTsKLQkJCWlmIChhc2VjdDIgPT0gTlVMTCkgewotCQkJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQkJZ290byBwdW50OwotCQkJfQotCQkJYXNlY3QyLT5fcmF3X3NpemUgPSBjb3Jlc2VnLmNfc2l6ZSAtIENPUkVfRlBVX09GRlNFVDsKLQkJCWFzZWN0Mi0+dm1hID0gMDsKLQkJCWFzZWN0Mi0+ZmlsZXBvcyA9IGFzZWN0LT5maWxlcG9zICsgQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCQkJYXNlY3QyLT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0JCQlhc2VjdDItPm5hbWUgPSAiLnJlZzIiOwotCQkJYXNlY3QyLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JCQlhYmZkLT5zZWN0aW9ucyA9IGFzZWN0MjsKLQkJCWFiZmQtPnNlY3Rpb25fY291bnQrKzsKLSNlbmRpZgotCi0JCQlicmVhazsKLQkJY2FzZSBDT1JFX0RBVEE6Ci0JCQlhc2VjdC0+bmFtZSA9ICIuZGF0YSI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUzsKLQkJCWJyZWFrOwotCQljYXNlIENPUkVfU1RBQ0s6Ci0JCQlhc2VjdC0+bmFtZSA9ICIuc3RhY2siOwotCQkJYXNlY3QtPmZsYWdzID0gU0VDX0FMTE9DK1NFQ19MT0FEK1NFQ19IQVNfQ09OVEVOVFM7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCXJldHVybiBhYmZkLT54dmVjOwotCi1wdW50Ogl7Ci0JCWFzZWN0aW9uCSphbmV4dDsKLQkJZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhbmV4dCkgewotCQkJYW5leHQgPSBhc2VjdC0+bmV4dDsKLQkJCWZyZWUoKHZvaWQgKilhc2VjdCk7Ci0JCX0KLQl9Ci0JZnJlZSAoKHZvaWQgKilyYXdwdHIpOwotCWFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEgPSBOVUxMOwotCWFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLQlhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIqCi1uZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLQliZmQgKmFiZmQ7Ci17Ci0gLypyZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsqLwotICByZXR1cm4gYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YS0+Y29yZS5jX25hbWU7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1uZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotCWJmZCAqYWJmZDsKLXsKLSAgLypyZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOyovCi0gIHJldHVybiBhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhLT5jb3JlLmNfc2lnbm87Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotbmV0YnNkX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IG5ldGJzZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAibmV0YnNkLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBuZXRic2RfY29yZV9maWxlX3AJCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAobmV0YnNkKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9uZXRic2QuaCBiL2JmZC9uZXRic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0ODJmMC4uMDAwMDAwMAotLS0gYS9iZmQvbmV0YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsIE5ldEJTRCB0YXJnZXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotVVNBLiAgKi8KLQotLyogQ2hlY2sgZm9yIG91ciBtYWNoaW5lIHR5cGUgKHBhcnQgb2YgbWFnaWMgbnVtYmVyKS4gKi8KLSNpZm5kZWYgTUFDSFRZUEVfT0sKLSNkZWZpbmUgTUFDSFRZUEVfT0sobSkgKChtKSA9PSBERUZBVUxUX01JRCB8fCAobSkgPT0gTV9VTktOT1dOKQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIG5vcm1hbCBsb2FkIGFkZHJlc3MgZm9yIGV4ZWN1dGFibGVzLiAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJCVRBUkdFVF9QQUdFX1NJWkUKLQotLyogTmV0QlNEIFpNQUdJQyBoYXMgaXRzIGhlYWRlciBpbiB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxCi0KLS8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkgdXNpbmcgdGhlIGZsYWdzLiAqLwotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgCShOX0RZTkFNSUMoeCkpCi0KLS8qIFdlIGhhdmUgNiBiaXRzIG9mIGZsYWdzIGFuZCAxMCBiaXRzIG9mIG1hY2hpbmUgSUQuICAqLwotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpIFwKLQkoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweDAzZmYpKQotI2RlZmluZSBOX0ZMQUdTKGV4ZWMpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKLQotI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKLQkgfCAoKChpbnQpKHR5cGUpICYgMHgzZmYpIDw8IDE2KSBcCi0JIHwgKCgoZmxhZ3MpICYgMHgzZikgPDwgMjQpKQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotCSgoZXhlYykuYV9pbmZvID0gXAotICAgICAgICAgKChleGVjKS5hX2luZm8gJiAweGZiMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHgzZmYpIDw8IDE2KSkKLSNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLQkgKChleGVjKS5hX2luZm8gJiAweDAzZmZmZmZmKSB8ICgoZmxhZ3MgJiAweDAzZikgPDwgMjYpKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0vKiBPbiBOZXRCU0QsIHRoZSBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGluIG50b2hsJ3MgIm5ldHdvcmsiIChiaWctZW5kaWFuKQotICAgZm9ybWF0LiAgKi8KLSNkZWZpbmUgU1dBUF9NQUdJQyhleHQpIGJmZF9nZXRiMzIgKGV4dCkKLQotLyogT24gTmV0QlNELCB0aGUgZW50cnkgcG9pbnQgbWF5IGJlIHRha2VuIHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAxCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogV2UgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCB0aGUgbWFnaWMgbnVtYmVyIGhhcyBiZWVuIHNldC4gIFRoaXMKLSAgICAgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gZG9uZSBieSBzZXRfc2VjdGlvbl9jb250ZW50cywgYnV0IG9ubHkgaWYKLSAgICAgdGhlcmUgYWN0dWFsbHkgYXJlIHNvbWUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0gICAgICBmaWxlX3B0ciB0ZXh0X2VuZDsKLQotICAgICAgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7Ci0gICAgfQotCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBERUZBVUxUX0FSQ0g6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBERUZBVUxUX01JRCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogVGhlIE5ldEJTRCBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGJpZy1lbmRpYW4gKi8KLSNpZm5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICAvKiBYWFggYXJlbid0IHRoZXJlIGFueSBtYWNybyB0byBjaGFuZ2UgYnl0ZW9yZGVyIG9mIGEgd29yZCBpbmRlcGVuZGVudCBvZgotICAgICB0aGUgaG9zdCdzIG9yIHRhcmdldCdzIGVuZGlhbmVzc2VzPyAgKi8KLSAgZXhlY3AtPmFfaW5mbwotICAgID0gKGV4ZWNwLT5hX2luZm8gJiAweGZmKSA8PCAyNCB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwKSA8PCA4Ci0gICAgICB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwMDApID4+IDggfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMDAwMDApID4+IDI0OwotI2VuZGlmCi0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmV3c29zMy5jIGIvYmZkL25ld3NvczMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjN2E3NS4uMDAwMDAwMAotLS0gYS9iZmQvbmV3c29zMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXdzT1MzIChTb255LCA2OGspIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTVkoT1ApIENBVChuZXdzb3MzXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbmV3c29zMyIKLSNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgd2hlbiBjb21waWxlZCB3aXRoIC1XYWxsLiAqLwotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtLXRhcmdldC5oIGIvYmZkL25sbS10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxZTI1NS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtLXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qIFRhcmdldCBkZWZpbml0aW9ucyBmb3IgMzIvNjQtYml0IE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIG5sbV9jb3JlX2ZpbGVfcCBfYmZkX2R1bW15X3RhcmdldAotCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIG5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2dldF9zeW10YWIgbmxtTkFNRShnZXRfc3ltdGFiKQotI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wgbmxtTkFNRShtYWtlX2VtcHR5X3N5bWJvbCkKLSNkZWZpbmUgbmxtX3ByaW50X3N5bWJvbCBubG1OQU1FKHByaW50X3N5bWJvbCkKLSNkZWZpbmUgbmxtX2dldF9zeW1ib2xfaW5mbyBubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgbmxtX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgbmxtX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBubG1fZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgbmxtX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgbmxtX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgbmxtX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9jYW5vbmljYWxpemVfcmVsb2MgbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIG5sbV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBubG1fc2V0X3NlY3Rpb25fY29udGVudHMgbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLQotI2RlZmluZSBubG1fc2l6ZW9mX2hlYWRlcnMgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgbmxtX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbmxtX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgbmxtX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBubG1fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgbmxtX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG5sbV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBubG1fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYSB0YXJnZXQuCi0gICBJdCBpbmNsdWRlcyB0aGluZ3MgbGlrZSBpdHMgYnl0ZSBvcmRlciwgbmFtZSwgd2hhdCByb3V0aW5lcyB0byBjYWxsCi0gICB0byBkbyB2YXJpb3VzIG9wZXJhdGlvbnMsIGV0Yy4gIEV2ZXJ5IEJGRCBwb2ludHMgdG8gYSB0YXJnZXQgc3RydWN0dXJlCi0gICB3aXRoIGl0cyAieHZlYyIgbWVtYmVyLgotCi0gICBUaGVyZSBhcmUgdHdvIHN1Y2ggc3RydWN0dXJlcyBoZXJlOiAgb25lIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzIGFuZAotICAgb25lIGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLiAgICovCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSB3aGVuIGluaXRpYWxpc2luZyBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfQklHX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUwotICAgfCBXUF9URVhUKSwKLSAgCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBKSwgCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICAgMCwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNSwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIG5sbU5BTUUob2JqZWN0X3ApLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLwotICAgIG5sbV9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cyksCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIEluaXRpYWxpemUgYSBqdW1wIHRhYmxlIHdpdGggdGhlIHN0YW5kYXJkIG1hY3JvLiAgQWxsIG5hbWVzIHN0YXJ0IHdpdGgKLSAgICAgIm5sbSIgKi8KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAvKiBBbHRlcm5hdGl2ZSBlbmRpYW4gdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotICAmIFRBUkdFVF9MSVRUTEVfU1lNLAotI2Vsc2UKLSAgTlVMTCwKLSNlbmRpZgotICAKLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSBUQVJHRVRfQkFDS0VORF9EQVRBCi19OwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9MSVRUTEVfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGxpdHRsZSBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTCi0gICB8IFdQX1RFWFQpLAotICAKLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19EQVRBKSwgCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICAgMCwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNSwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIG5sbU5BTUUob2JqZWN0X3ApLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLwotICAgIG5sbV9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cyksCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIEluaXRpYWxpemUgYSBqdW1wIHRhYmxlIHdpdGggdGhlIHN0YW5kYXJkIG1hY3JvLiAgQWxsIG5hbWVzIHN0YXJ0IHdpdGgKLSAgICAgIm5sbSIgKi8KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAvKiBBbHRlcm5hdGl2ZSBlbmRpYW4gdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQVJHRVRfQklHX1NZTQotICAmIFRBUkdFVF9CSUdfU1lNLAotI2Vsc2UKLSAgTlVMTCwKLSNlbmRpZgotICAKLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSBUQVJHRVRfQkFDS0VORF9EQVRBCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvbmxtLmMgYi9iZmQvbmxtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzZiYWEuLjAwMDAwMDAKLS0tIGEvYmZkL25sbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYm5sbS5oIgotCi0vKiBNYWtlIGFuIE5MTSBvYmplY3QuICBXZSBqdXN0IG5lZWQgdG8gYWxsb2NhdGUgdGhlIGJhY2tlbmQKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotbmxtX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBubG1fdGRhdGEgKGFiZmQpID0KLSAgICAoc3RydWN0IG5sbV9vYmpfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbmxtX29ial90ZGF0YSkpOwotICBpZiAobmxtX3RkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIGlmIChubG1fYXJjaGl0ZWN0dXJlIChhYmZkKSAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpLAotCQkJICAgICAgIG5sbV9tYWNoaW5lIChhYmZkKSk7Ci0KLSAgLyogc2luY2UgZXZlcnl0aGluZyBpcyBkb25lIGF0IGNsb3NlIHRpbWUsIGRvIHdlIG5lZWQgYW55IGluaXRpYWxpemF0aW9uPyAqLwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBmb3IgYW4gTkxNIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLW5sbV9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLSAgcmV0dXJuIGFyY2ggPT0gbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCk7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmxtMzItYWxwaGEuYyBiL2JmZC9ubG0zMi1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGM4ZTUxLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsODkyICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBBbHBoYSBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSAzMiBiaXQgQWxwaGEgTkxNIGZvcm1hdC4gIFlvdSBtaWdodCB0aGluawotICAgdGhhdCBhbiBBbHBoYSBjaGlwIHdvdWxkIHVzZSBhIDY0IGJpdCBmb3JtYXQsIGJ1dCwgZm9yIHNvbWUgcmVhc29uLAotICAgaXQgZG9lc24ndC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgIm5sbS9hbHBoYS1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9hbHBoYV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIKLQotI2luY2x1ZGUgImxpYm5sbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfYmFja2VuZF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX3ByZWZpeAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9tYW5nbGVfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfc2V0X3B1YmxpY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBubG1fYWxwaGFfZ2V0X3B1YmxpY19vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQwKLS8qIEFscGhhIE5MTSdzIGhhdmUgYSBwcmVmaXggaGVhZGVyIGJlZm9yZSB0aGUgc3RhbmRhcmQgTkxNLiAgVGhpcwotICAgZnVuY3Rpb24gcmVhZHMgaXQgaW4sIHZlcmlmaWVzIHRoZSB2ZXJzaW9uLCBhbmQgc2Vla3MgdGhlIGJmZCB0bwotICAgdGhlIGxvY2F0aW9uIGJlZm9yZSB0aGUgcmVndWxhciBOTE0gaGVhZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIHMubWFnaWMpICE9IE5MTTMyX0FMUEhBX01BR0lDKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGSVhNRTogU2hvdWxkIHdlIGNoZWNrIHRoZSBmb3JtYXQgbnVtYmVyPyAgKi8KLQotICAvKiBTa2lwIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlci4gICovCi0gIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHMuc2l6ZSk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2l6ZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfd3JpdGVfcHJlZml4IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgbWVtc2V0ICgmcywgMCwgc2l6ZW9mIHMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBOTE0zMl9BTFBIQV9NQUdJQywgcy5tYWdpYyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIDIsIHMuZm9ybWF0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc2l6ZW9mIHMsIHMuc2l6ZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFJlbG9jIHR5cGUgMCBpcyBpZ25vcmVkIGJ5IGl0c2VsZi4gIEhvd2V2ZXIsIGl0IGFwcGVhcnMgYWZ0ZXIgYQotICAgICBHUERJU1AgcmVsb2MgdG8gaWRlbnRpZnkgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBsb3cgb3JkZXIgMTYgYml0cwotICAgICBvZiB0aGUgZ3AgcmVnaXN0ZXIgYXJlIGxvYWRlZC4gICovCi0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBHUCByZWxhdGl2ZSBvZmZzZXQuICBUaGlzIGlzIGp1c3QgbGlrZSBSRUZMT05HIGV4Y2VwdAotICAgICB0aGF0IHdoZW4gdGhlIHZhbHVlIGlzIHVzZWQgdGhlIHZhbHVlIG9mIHRoZSBncCByZWdpc3RlciB3aWxsIGJlCi0gICAgIGFkZGVkIGluLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlZmVycyB0byBtZW1vcnkgb2ZmIHRoZSBHUAotICAgICByZWdpc3Rlci4gIFRoZSBvZmZzZXQgaXMgMTYgYml0cyBvZiB0aGUgMzIgYml0IGluc3RydWN0aW9uLiAgVGhpcwotICAgICByZWxvYyBhbHdheXMgc2VlbXMgdG8gYmUgYWdhaW5zdCB0aGUgLmxpdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVEVSQUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIG9ubHkgYXBwZWFycyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYSBMSVRFUkFMIHJlbG9jLgotICAgICBJdCBpZGVudGlmaWVzIGEgdXNlIG9mIHRoZSBsaXRlcmFsLiAgSXQgc2VlbXMgdGhhdCB0aGUgbGlua2VyIGNhbgotICAgICB1c2UgdGhpcyB0byBlbGltaW5hdGUgYSBwb3J0aW9uIG9mIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhlIHN5bWJvbAotICAgICBpbmRleCBpcyBzcGVjaWFsOiAxIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIGJhc2UKLSAgICAgcmVnaXN0ZXIgb2YgYSBtZW1vcnkgZm9ybWF0IGluc3RydWN0aW9uOyAyIG1lYW5zIHRoZSBsaXRlcmFsCi0gICAgIGFkZHJlc3MgaXMgaW4gdGhlIGJ5dGUgb2Zmc2V0IHJlZ2lzdGVyIG9mIGEgYnl0ZS1tYW5pcHVsYXRpb24KLSAgICAgaW5zdHJ1Y3Rpb247IDMgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgdGFyZ2V0Ci0gICAgIHJlZ2lzdGVyIG9mIGEganNyIGluc3RydWN0aW9uLiAgVGhpcyBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnkKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJVFVTRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIG5leHQgcmVsb2MKLSAgICAgd2lsbCBiZSBhbiBJR05PUkUgcmVsb2Mgd2hpY2ggaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSBzeW1ib2wgaW5kZXggb2YKLSAgICAgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBhcHBlYXJzIHRvIGFjdHVhbGx5IGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgYmV0d2VlbiB0aGUgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucy4gIFRoaXMgZ2l2ZXMgdHdvIGRpZmZlcmVudAotICAgICB3YXlzIHRvIGRldGVybWluZSB3aGVyZSB0aGUgbGRhIGluc3RydWN0aW9uIGlzOyBJIGRvbid0IGtub3cgd2h5Ci0gICAgIGJvdGggYXJlIHVzZWQuICBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbiBpcyB0aGUKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlIGN1cnJlbnQgbG9jYXRpb247IHRoZQotICAgICBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGN1cnJlbnQKLSAgICAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQRElTUCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjEgYml0IGJyYW5jaC4gIFRoZSBuYXRpdmUgYXNzZW1ibGVyIGdlbmVyYXRlcyB0aGVzZSBmb3IKLSAgICAgYnJhbmNoZXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFuZCBhbHNvIGZpbGxzIGluIHRoZSBQQwotICAgICByZWxhdGl2ZSBvZmZzZXQgaW4gdGhlIGluc3RydWN0aW9uLiAgSXQgc2VlbXMgdG8gbWUgdGhhdCB0aGlzCi0gICAgIHJlbG9jLCB1bmxpa2UgdGhlIG90aGVycywgaXMgbm90IHBhcnRpYWxfaW5wbGFjZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMNjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BTVUIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBZGp1c3QgdGhlIEdQIHZhbHVlIGZvciBhIG5ldyByYW5nZSBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFZBTFVFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX2FscGhhX253X2hvd3RvID0KLSAgSE9XVE8gKEFMUEhBX1JfTldfUkVMT0MsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5XX1JFTE9DIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogUmVhZCBhbiBBbHBoYSBOTE0gcmVsb2MuICBUaGlzIHJvdXRpbmUga2VlcHMgc29tZSBzdGF0aWMgZGF0YSB3aGljaAotICAgaXQgdXNlcyB3aGVuIGhhbmRsaW5nIGxvY2FsIHJlbG9jcy4gIFRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkKLSAgIGJlY2F1c2UgYWxsIHRoZSBsb2NhbCByZWxvY3MgYXJlIHJlYWQgYXQgb25jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIHN0YXRpYyBiZmRfdm1hIGdwX3ZhbHVlOwotICBzdGF0aWMgYmZkX3ZtYSBsaXRhX2FkZHJlc3M7Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYyBleHQ7Ci0gIGJmZF92bWEgcl92YWRkcjsKLSAgbG9uZyByX3N5bW5keDsKLSAgaW50IHJfdHlwZSwgcl9leHRlcm4sIHJfb2Zmc2V0LCByX3NpemU7Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjOwotCi0gIC8qIFJlYWQgdGhlIHJlbG9jIGZyb20gdGhlIGZpbGUuICAqLwotICBpZiAoYmZkX3JlYWQgKCZleHQsIHNpemVvZiBleHQsIDEsIGFiZmQpICE9IHNpemVvZiBleHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN3YXAgaW4gdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLSAgcl92YWRkciA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC5yX3ZhZGRyKTsKLSAgcl9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQucl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSk7Ci0KLSAgcl90eXBlID0gKChleHQucl9iaXRzWzBdICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpCi0JICAgID4+IFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFKTsKLSAgcl9leHRlcm4gPSAoZXh0LnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUpICE9IDA7Ci0gIHJfb2Zmc2V0ID0gKChleHQucl9iaXRzWzFdICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkKLQkgICAgICA+PiBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKTsKLSAgLyogSWdub3JlIHRoZSByZXNlcnZlZCBiaXRzLiAgKi8KLSAgcl9zaXplID0gKChleHQucl9iaXRzWzNdICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpCi0JICAgID4+IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKTsKLQotICAvKiBGaWxsIGluIHRoZSBCRkQgYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGlmIChyX2V4dGVybikKLSAgICB7Ci0gICAgICAvKiBFeHRlcm5hbCByZWxvY2F0aW9ucyBhcmUgb25seSB1c2VkIGZvciBpbXBvcnRzLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKHN5bSAhPSBOVUxMKTsKLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IHN5bV9wdHJfcHRyIGZvciB0aGlzIGNhc2UuICBJdCBpcyBzZXQgaW4KLQkgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYy4gICovCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gTlVMTDsKLSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbnRlcm5hbCByZWxvY2F0aW9ucyBhcmUgb25seSB1c2VkIGZvciBsb2NhbCByZWxvY2F0aW9uCi0JIGZpeHVwcy4gIElmIHRoZXkgYXJlIG5vdCBOV19SRUxPQyBvciBHUERJU1Agb3IgSUdOT1JFLCB0aGV5Ci0JIG11c3QgYmUgYWdhaW5zdCAudGV4dCBvciAuZGF0YS4gICovCi0gICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQyB8fCBzeW0gPT0gTlVMTCk7Ci0gICAgICBpZiAocl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MKLQkgIHx8IHJfdHlwZSA9PSBBTFBIQV9SX0dQRElTUAotCSAgfHwgcl90eXBlID09IEFMUEhBX1JfSUdOT1JFKQotCXsKLQkgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3N5bW5keCA9PSBBTFBIQV9SRUxPQ19TRUNUSU9OX1RFWFQpCi0JewotCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGNvZGVfc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQkgIEJGRF9BU1NFUlQgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGNvZGVfc2VjKSA9PSAwKTsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3N5bW5keCA9PSBBTFBIQV9SRUxPQ19TRUNUSU9OX0RBVEEpCi0JewotCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGRhdGFfc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJlbC0+YWRkZW5kID0gLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBkYXRhX3NlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKDApOwotCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogV2UgdXNlIHRoZSBhZGRyZXNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSByZWxvYyBpcyBpbiB0aGUgLnRleHQKLSAgICAgb3IgLmRhdGEgc2VjdGlvbi4gIFJfTldfUkVMT0MgcmVsb2NzIGRvbid0IHJlYWxseSBoYXZlIGEgc2VjdGlvbiwKLSAgICAgc28gd2UgcHV0IHRoZW0gaW4gLnRleHQuICAqLwotICBpZiAocl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MKLSAgICAgIHx8IHJfdmFkZHIgPCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYykpCi0gICAgewotICAgICAgKnNlY3AgPSBjb2RlX3NlYzsKLSAgICAgIHJlbC0+YWRkcmVzcyA9IHJfdmFkZHI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnNlY3AgPSBkYXRhX3NlYzsKLSAgICAgIHJlbC0+YWRkcmVzcyA9IHJfdmFkZHIgLSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgfQotCi0gIC8qIFdlIG11c3QgYWRqdXN0IHRoZSBhZGRlbmQgYmFzZWQgb24gdGhlIHR5cGUuICAqLwotICBCRkRfQVNTRVJUICgocl90eXBlID49IDAgJiYgcl90eXBlIDw9IEFMUEhBX1JfR1BWQUxVRSkKLQkgICAgICB8fCByX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQyk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgQUxQSEFfUl9CUkFERFI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUwxNjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDMyOgotICAgIGNhc2UgQUxQSEFfUl9TUkVMNjQ6Ci0gICAgICAvKiBUaGUgUEMgcmVsYXRpdmUgcmVsb2NzIGRvIG5vdCBzZWVtIHRvIHVzZSB0aGUgc2VjdGlvbiBWTUEgYXMKLQkgYSBuZWdhdGl2ZSBhZGRlbmQuICAqLwotICAgICAgcmVsLT5hZGRlbmQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfR1BSRUwzMjoKLSAgICAgIC8qIENvcHkgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGFkZGVuZCwgdG8KLQkgZW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBjb25mdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLSAgICAgIGlmICghIHJfZXh0ZXJuKQotCXJlbC0+YWRkZW5kICs9IGdwX3ZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfTElURVJBTDoKLSAgICAgIEJGRF9BU1NFUlQgKCEgcl9leHRlcm4pOwotICAgICAgcmVsLT5hZGRlbmQgKz0gbGl0YV9hZGRyZXNzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfTElUVVNFOgotICAgIGNhc2UgQUxQSEFfUl9HUERJU1A6Ci0gICAgICAvKiBUaGUgTElUVVNFIGFuZCBHUERJU1AgcmVsb2NzIGRvIG5vdCB1c2UgYSBzeW1ib2wsIG9yIGFuCi0JIGFkZGVuZCwgYnV0IHRoZXkgZG8gdXNlIGEgc3BlY2lhbCBjb2RlLiAgUHV0IHRoaXMgY29kZSBpbiB0aGUKLQkgYWRkZW5kIGZpZWxkLiAgKi8KLSAgICAgIHJlbC0+YWRkZW5kID0gcl9zeW1uZHg7Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLSAgICAgIC8qIFRoZSBTVE9SRSByZWxvYyBuZWVkcyB0aGUgc2l6ZSBhbmQgb2Zmc2V0IGZpZWxkcy4gIFdlIHN0b3JlCi0JIHRoZW0gaW4gdGhlIGFkZGVuZC4gICovCi0gICAgICBCRkRfQVNTRVJUIChyX29mZnNldCA8IDI1NiAmJiByX3NpemUgPCAyNTYpOwotICAgICAgcmVsLT5hZGRlbmQgPSAocl9vZmZzZXQgPDwgOCkgKyByX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9QVVNIOgotICAgIGNhc2UgQUxQSEFfUl9PUF9QU1VCOgotICAgIGNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotICAgICAgLyogVGhlIFBVU0gsIFBTVUIgYW5kIFBSU0hJRlQgcmVsb2NzIGRvIG5vdCBhY3R1YWxseSB1c2UgYW4KLQkgYWRkcmVzcy4gIEkgYmVsaWV2ZSB0aGF0IHRoZSBhZGRyZXNzIHN1cHBsaWVkIGlzIHJlYWxseSBhbgotCSBhZGRlbmQuICAqLwotICAgICAgcmVsLT5hZGRlbmQgPSByX3ZhZGRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfR1BWQUxVRToKLSAgICAgIC8qIFJlY29yZCB0aGUgbmV3IGdwIHZhbHVlLiAgKi8KLSAgICAgIGdwX3ZhbHVlICs9IHJfc3ltbmR4OwotICAgICAgcmVsLT5hZGRlbmQgPSBncF92YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0lHTk9SRToKLSAgICAgIC8qIElmIHRoZSB0eXBlIGlzIEFMUEhBX1JfSUdOT1JFLCBtYWtlIHN1cmUgdGhpcyBpcyBhIHJlZmVyZW5jZQotCSB0byB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzbyB0aGF0IHRoZSByZWxvYyBpcyBpZ25vcmVkLiAgRm9yCi0JIHNvbWUgcmVhc29uIHRoZSBhZGRyZXNzIG9mIHRoaXMgcmVsb2MgdHlwZSBpcyBub3QgYWRqdXN0ZWQgYnkKLQkgdGhlIHNlY3Rpb24gdm1hLiAgV2UgcmVjb3JkIHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZQotCSBoZXJlLCBmb3IgY29udmVuaWVuY2Ugd2hlbiBkb2luZyB0aGUgR1BESVNQIHJlbG9jYXRpb24uICAqLwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgcmVsLT5hZGRyZXNzID0gcl92YWRkcjsKLSAgICAgIHJlbC0+YWRkZW5kID0gZ3BfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9OV19SRUxPQzoKLSAgICAgIC8qIElmIHRoaXMgaXMgU0VUR1AsIHdlIHNldCB0aGUgYWRkZW5kIHRvIDAuICBPdGhlcndpc2Ugd2Ugc2V0Ci0JIHRoZSBhZGRlbmQgdG8gdGhlIHNpemUgb2YgdGhlIC5saXRhIHNlY3Rpb24gKHRoaXMgaXMKLQkgcl9zeW1uZHgpIHBsdXMgMS4gIFdlIGhhdmUgYWxyZWFkeSBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0JIHJlbG9jIHRvIHJfdmFkZHIuICAqLwotICAgICAgaWYgKHJfc2l6ZSA9PSBBTFBIQV9SX05XX1JFTE9DX1NFVEdQKQotCXsKLQkgIGdwX3ZhbHVlID0gcl92YWRkcjsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3NpemUgPT0gQUxQSEFfUl9OV19SRUxPQ19MSVRBKQotCXsKLQkgIGxpdGFfYWRkcmVzcyA9IHJfdmFkZHI7Ci0JICByZWwtPmFkZGVuZCA9IHJfc3ltbmR4ICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JQkZEX0FTU0VSVCAoMCk7Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DKQotICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfYWxwaGFfbndfaG93dG87Ci0gIGVsc2UKLSAgICByZWwtPmhvd3RvID0gJm5sbTMyX2FscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbmdsZSBBbHBoYSBOTE0gcmVsb2NzIGZvciBvdXRwdXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFuIEFMUEhBIE5MTSBpbXBvcnQgcmVjb3JkICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKLSAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOwotICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHRlbXApOwotICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7Ci0gIGlmICghbmxtX3JlbG9jcykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOwotICBzeW0gLT4gcmNudCA9IDA7Ci0gIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG5sbV9hbHBoYV9yZWFkX3JlbG9jIChhYmZkLCBzeW0sICZzZWN0aW9uLAotCQkJCSZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhbiBBbHBoYSBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBhc3ltYm9sICpzeW07Ci0gIGJmZF92bWEgcl92YWRkcjsKLSAgbG9uZyByX3N5bW5keDsKLSAgaW50IHJfdHlwZSwgcl9leHRlcm4sIHJfb2Zmc2V0LCByX3NpemU7Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYyBleHQ7Ci0KLSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgLyogR2V0IHZhbHVlcyBmb3IgdGhlIHJlbG9jYXRpb24gZmllbGRzLiAgKi8KLSAgcl90eXBlID0gcmVsLT5ob3d0by0+dHlwZTsKLSAgaWYgKHJfdHlwZSAhPSBBTFBIQV9SX05XX1JFTE9DKQotICAgIHsKLSAgICAgIHJfdmFkZHIgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpICsgcmVsLT5hZGRyZXNzOwotICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0Jcl92YWRkciArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLAotCQkJCSAgICAgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCi0JCQkJCQkJICAgICAgTkxNX0NPREVfTkFNRSkpOwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICByX2V4dGVybiA9IDE7Ci0JICByX3N5bW5keCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfZXh0ZXJuID0gMDsKLQkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkgJiBTRUNfQ09ERSkKLQkgICAgcl9zeW1uZHggPSBBTFBIQV9SRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JICBlbHNlCi0JICAgIHJfc3ltbmR4ID0gQUxQSEFfUkVMT0NfU0VDVElPTl9EQVRBOwotCX0KLSAgICAgIHJfb2Zmc2V0ID0gMDsKLSAgICAgIHJfc2l6ZSA9IDA7Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCWNhc2UgQUxQSEFfUl9HUERJU1A6Ci0JICByX3N5bW5keCA9IHJlbC0+YWRkZW5kOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0JICByX3NpemUgPSByZWwtPmFkZGVuZCAmIDB4ZmY7Ci0JICByX29mZnNldCA9IChyZWwtPmFkZGVuZCA+PiA4KSAmIDB4ZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgotCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotCSAgcl92YWRkciA9IHJlbC0+YWRkZW5kOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfSUdOT1JFOgotCSAgcl92YWRkciA9IHJlbC0+YWRkcmVzczsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQyAqLwotICAgICAgcl92YWRkciA9IHJlbC0+YWRkcmVzczsKLSAgICAgIGlmIChyZWwtPmFkZGVuZCA9PSAwKQotCXsKLQkgIHJfc3ltbmR4ID0gMDsKLQkgIHJfc2l6ZSA9IEFMUEhBX1JfTldfUkVMT0NfU0VUR1A7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfc3ltbmR4ID0gcmVsLT5hZGRlbmQgLSAxOwotCSAgcl9zaXplID0gQUxQSEFfUl9OV19SRUxPQ19MSVRBOwotCX0KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgLyogU3dhcCBvdXQgdGhlIHJlbG9jYXRpb24gZmllbGRzLiAgKi8KLSAgYmZkX2hfcHV0XzY0IChhYmZkLCByX3ZhZGRyLCAoYmZkX2J5dGUgKikgZXh0LnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHJfc3ltbmR4LCAoYmZkX2J5dGUgKikgZXh0LnJfc3ltbmR4KTsKLQotICBCRkRfQVNTRVJUIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOwotCi0gIGV4dC5yX2JpdHNbMF0gPSAoKHJfdHlwZSA8PCBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSkKLQkJICAgJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSk7Ci0gIGV4dC5yX2JpdHNbMV0gPSAoKHJfZXh0ZXJuID8gUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSA6IDApCi0JCSAgIHwgKChyX29mZnNldCA8PCBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKQotCQkgICAgICAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpKTsKLSAgZXh0LnJfYml0c1syXSA9IDA7Ci0gIGV4dC5yX2JpdHNbM10gPSAoKHJfc2l6ZSA8PCBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSkKLQkJICAgJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBbHBoYSBOZXRXYXJlIGRvZXMgbm90IHVzZSB0aGUgaGlnaCBiaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYQotICAgcHVibGljIHN5bWJvbCBpcyBpbiB0aGUgY29kZSBzZWdtZW50IG9yIHRoZSBkYXRhIHNlZ21lbnQuICBJbnN0ZWFkLAotICAgaXQganVzdCB1c2VzIHRoZSBhZGRyZXNzLiAgVGhlIHNldF9wdWJsaWNfc2VjdGlvbiBhbmQKLSAgIGdldF9wdWJsaWNfb2Zmc2V0IHJvdXRpbmVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvZGUgd2hpY2ggdXNlcyB0aGUKLSAgIGhpZ2ggYml0LiAgKi8KLQotLyogU2V0IHRoZSBzZWN0aW9uIGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3NldF9wdWJsaWNfc2VjdGlvbiAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjOwotCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKHN5bS0+c3ltYm9sLnZhbHVlIDwgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpKQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBjb2RlX3NlYzsKLSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gZGF0YV9zZWM7Ci0gICAgICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgICAvKiBUaGUgZGF0YSBzZWdtZW50IGhhZCBiZXR0ZXIgYmUgYWxpZ25lZC4gICovCi0gICAgICBCRkRfQVNTRVJUICgoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpICYgMHhmKSA9PSAwKTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIG9mZnNldCB0byB3cml0ZSBvdXQgZm9yIGEgcHVibGljIHN5bWJvbC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1ubG1fYWxwaGFfZ2V0X3B1YmxpY19vZmZzZXQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIHJldHVybiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLX0KLQwKLS8qIFdyaXRlIGFuIEFscGhhIE5MTSBleHRlcm5hbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotICBhcmVsZW50IHI7Ci0KLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50ICsgMiwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBmaXJzdCB0d28gcmVsb2NzIGZvciBlYWNoIGV4dGVybmFsIHN5bWJvbCBhcmUgdGhlIC5saXRhCi0gICAgIGFkZHJlc3MgYW5kIHRoZSBHUCB2YWx1ZS4gICovCi0gIHIuc3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgci5ob3d0byA9ICZubG0zMl9hbHBoYV9ud19ob3d0bzsKLQotICByLmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChhYmZkKS0+bGl0YV9hZGRyZXNzOwotICByLmFkZGVuZCA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKGFiZmQpLT5saXRhX3NpemUgKyAxOwotICBpZiAobmxtX2FscGhhX3dyaXRlX2ltcG9ydCAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsICZyKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgci5hZGRyZXNzID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdwOwotICByLmFkZGVuZCA9IDA7Ci0gIGlmIChubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgJnIpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmxtX2FscGhhX3dyaXRlX2ltcG9ydCAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgIHJlbG9jc1tpXS5yZWwpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9hbHBoYV9iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgQWxwaGEgTW9kdWxlICAgXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfYWxwaGFfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKLSAgc2l6ZW9mIChzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciksCi0gIGJmZF9hcmNoX2FscGhhLAotICAwLAotICB0cnVlLCAvKiBubyB1bmluaXRpYWxpemVkIGRhdGEgcGVybWl0dGVkIGJ5IEFscGhhIE5ldFdhcmUuICAqLwotICBubG1fYWxwaGFfYmFja2VuZF9vYmplY3RfcCwKLSAgbmxtX2FscGhhX3dyaXRlX3ByZWZpeCwKLSAgbmxtX2FscGhhX3JlYWRfcmVsb2MsCi0gIG5sbV9hbHBoYV9tYW5nbGVfcmVsb2NzLAotICBubG1fYWxwaGFfcmVhZF9pbXBvcnQsCi0gIG5sbV9hbHBoYV93cml0ZV9pbXBvcnQsCi0gIG5sbV9hbHBoYV9zZXRfcHVibGljX3NlY3Rpb24sCi0gIG5sbV9hbHBoYV9nZXRfcHVibGljX29mZnNldCwKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1fYWxwaGFfd3JpdGVfZXh0ZXJuYWwsCi0gIDAsCS8qIHdyaXRlX2V4cG9ydCAqLwotfTsKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJubG0zMi1hbHBoYSIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCW5sbU5BTUUoYWxwaGFfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfYWxwaGFfYmFja2VuZAotCi0jaW5jbHVkZSAibmxtLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLWkzODYuYyBiL2JmZC9ubG0zMi1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmM3NGQuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciAzMi1iaXQgaTM4NiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgIm5sbS9pMzg2LWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX2kzODZfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9pMzg2X21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9pMzg2X3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQotLyogQWRqdXN0IHRoZSByZWxvYyBsb2NhdGlvbiBieSBhbiBhYnNvbHV0ZSB2YWx1ZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9pMzg2X2Fic19ob3d0byA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiMzIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogQWRqdXN0IHRoZSByZWxvYyBsb2NhdGlvbiBieSBhIFBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudC4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9pMzg2X3BjcmVsX2hvd3RvID0KLSAgSE9XVE8gKDEsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBSZWFkIGEgTmV0V2FyZSBpMzg2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfYnl0ZSB0ZW1wWzRdOwotICBiZmRfdm1hIHZhbDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRlbXApOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byBlaXRoZXIgdGhlIGNvZGUgb3IgZGF0YSBzZWdtZW50LgotICAgICBUaGlzIGlzIHRoZSBsb2NhdGlvbiB3aGljaCBuZWVkcyB0byBiZSBhZGp1c3RlZC4KLQotICAgICBJZiB0aGlzIGlzIGEgcmVsb2NhdGlvbiBmaXh1cCByYXRoZXIgdGhhbiBhbiBpbXBvcnRlZCBzeW1ib2wgKHRoZQotICAgICBzeW0gYXJndW1lbnQgaXMgTlVMTCkgdGhlbiB0aGUgaGlnaCBiaXQgaXMgMCBpZiB0aGUgbG9jYXRpb24KLSAgICAgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCwgb3IgMSBpZgotICAgICB0aGUgbG9jYXRpb24gbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvZGUKLSAgICAgc2VnbWVudC4gIElmIHRoaXMgaXMgYW4gaW1wb3J0ZWQgc3ltYm9sLCB0aGVuIHRoZSBoaWdoIGJpdCBpcyAwCi0gICAgIGlmIHRoZSBsb2NhdGlvbiBpcyAwIGlmIHRoZSBsb2NhdGlvbiBzaG91bGQgYmUgYWRqdXN0ZWQgYnkgdGhlCi0gICAgIG9mZnNldCB0byB0aGUgc3ltYm9sLCBvciAxIGlmIHRoZSBsb2NhdGlvbiBzaG91bGQgYWRqdXN0ZWQgYnkgdGhlCi0gICAgIGFic29sdXRlIHZhbHVlIG9mIHRoZSBzeW1ib2wuCi0KLSAgICAgVGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyAwIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQKLSAgICAgaW50byB0aGUgZGF0YSBzZWdtZW50LCBvciAxIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUKLSAgICAgY29kZSBzZWdtZW50LgotCi0gICAgIEFsbCB0aGlzIHRyYW5zbGF0ZXMgZmFpcmx5IGVhc2lseSBpbnRvIGEgQkZEIHJlbG9jLiAgKi8KLQotICBpZiAoc3ltID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCh2YWwgJiBOTE1fSElCSVQpID09IDApCi0JbmFtZSA9IE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gICAgICBlbHNlCi0JewotCSAgbmFtZSA9IE5MTV9DT0RFX05BTUU7Ci0JICB2YWwgJj1+IE5MTV9ISUJJVDsKLQl9Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfYWJzX2hvd3RvOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHRoaXMgY2FzZSB3ZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIHN5bV9wdHJfcHRyIGZpZWxkLiAgKi8KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBOVUxMOwotICAgICAgaWYgKCh2YWwgJiBOTE1fSElCSVQpID09IDApCi0JcmVsLT5ob3d0byA9ICZubG1faTM4Nl9wY3JlbF9ob3d0bzsKLSAgICAgIGVsc2UKLQl7Ci0JICByZWwtPmhvd3RvID0gJm5sbV9pMzg2X2Fic19ob3d0bzsKLQkgIHZhbCAmPX4gTkxNX0hJQklUOwotCX0KLSAgICB9Ci0KLSAgaWYgKCh2YWwgJiAoTkxNX0hJQklUID4+IDEpKSA9PSAwKQotICAgICpzZWNwID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBlbHNlCi0gICAgewotICAgICAgKnNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gICAgICB2YWwgJj1+IChOTE1fSElCSVQgPj4gMSk7Ci0gICAgfQotCi0gIHJlbC0+YWRkcmVzcyA9IHZhbDsKLSAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhIE5ldFdhcmUgaTM4NiByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl93cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYXN5bWJvbCAqc3ltOwotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLQotICAvKiBOZXRXYXJlIG9ubHkgc3VwcG9ydHMgdHdvIGtpbmRzIG9mIHJlbG9jcy4gIFdlIHNob3VsZCBjaGVjawotICAgICBzcGVjaWFsX2Z1bmN0aW9uIGhlcmUsIGFzIHdlbGwsIGJ1dCBhdCB0aGUgbW9tZW50IGNvZmYtaTM4NgotICAgICByZWxvY3MgdXNlcyBhIHNwZWNpYWxfZnVuY3Rpb24gd2hpY2ggZG9lcyBub3QgYWZmZWN0IHdoYXQgd2UgZG8KLSAgICAgaGVyZS4gICovCi0gIGlmIChyZWwtPmFkZGVuZCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvID09IE5VTEwKLSAgICAgIHx8IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+c2l6ZSAhPSAyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRzaXplICE9IDMyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRwb3MgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+c3JjX21hc2sgIT0gMHhmZmZmZmZmZgotICAgICAgfHwgcmVsLT5ob3d0by0+ZHN0X21hc2sgIT0gMHhmZmZmZmZmZikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKLSAgICAgc2VnbWVudC4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZgotICAgICB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICByZWxvY2F0aW9uLiAgKi8KLSAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKLQotICAvKiBUaGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldAotICAgICBpbnRvIHRoZSBkYXRhIHNlZ21lbnQsIG9yIDEgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZQotICAgICBjb2RlIHNlZ21lbnQuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpCi0gICAgewotICAgICAgdmFsIC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICAgICAgdmFsIHw9IE5MTV9ISUJJVCA+PiAxOwotICAgIH0KLSAgZWxzZQotICAgIHZhbCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLQotICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0gICAgewotICAgICAgLyogTmV0V2FyZSBvbmx5IHN1cHBvcnRzIGFic29sdXRlIGludGVybmFsIHJlbG9jcy4gICovCi0gICAgICBpZiAocmVsLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBoaWdoIGJpdCBpcyAxIGlmIHRoZSByZWxvYyBpcyBhZ2FpbnN0IHRoZSBjb2RlIHNlY3Rpb24sIDAKLQkgaWYgYWdhaW5zdCB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkgJiBTRUNfQ09ERSkKLQl2YWwgfD0gTkxNX0hJQklUOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBoaWdoIGJpdCBpcyAxIGlmIHRoaXMgaXMgYW4gYWJzb2x1dGUgcmVsb2MsIDAgaWYgaXQgaXMgUEMKLQkgcmVsYXRpdmUuICAqLwotICAgICAgaWYgKCEgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JdmFsIHw9IE5MTV9ISUJJVDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQQyByZWxhdGl2ZSByZWxvY3Mgb24gTmV0V2FyZSBtdXN0IGJlIHBjcmVsX29mZnNldC4gICovCi0JICBpZiAoISByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gdHVybiBhIGkzODYgYS5vdXQgb3IgQ09GRiBmaWxlCi0gICBpbnRvIGEgTmV0V2FyZSBpMzg2IG1vZHVsZS4gIFRoYXQgbWVhbnMgdGhhdCB0aGUgcmVsb2NzIGZyb20gdGhlCi0gICBzb3VyY2UgZmlsZSBoYXZlIHRvIGJlIG1hcHBlZCBpbnRvIHJlbG9jcyB0aGF0IGFwcGx5IHRvIHRoZSB0YXJnZXQKLSAgIGZpbGUuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBubG1fc2V0X3NlY3Rpb25fY29udGVudHMgdG8gZ2l2ZQotICAgaXQgYSBjaGFuY2UgdG8gcmV3b3JrIHRoZSByZWxvY3MuCi0KLSAgIFRoaXMgaXMgYWN0dWFsbHkgYSBmYWlybHkgZ2VuZXJhbCBjb25jZXB0LiAgSG93ZXZlciwgdGhpcyBpcyBub3QgYQotICAgZ2VuZXJhbCBpbXBsZW1lbnRhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl9tYW5nbGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBhcmVsZW50ICoqcmVsX3B0cl9wdHIsICoqcmVsX2VuZDsKLQotICByZWxfcHRyX3B0ciA9IHNlYy0+b3JlbG9jYXRpb247Ci0gIHJlbF9lbmQgPSByZWxfcHRyX3B0ciArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWxfcHRyX3B0ciA8IHJlbF9lbmQ7IHJlbF9wdHJfcHRyKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJlbCA9ICpyZWxfcHRyX3B0cjsKLSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gICAgICAvKiBOb3RlIHRoYXQgbm8gc2VyaW91cyBoYXJtIHdpbGwgZW5zdWUgaWYgd2UgZmFpbCB0byBjaGFuZ2UgYQotCSByZWxvYy4gIFdlIHdpbGwgd2luZCB1cCBmYWlsaW5nIGluIG5sbV9pMzg2X3dyaXRlX2ltcG9ydC4gICovCi0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHJlbG9jIGlzIHdpdGhpbiB0aGUgZGF0YSB3ZSBoYXZlLiAgV2Ugb25seSA0Ci0JIGJ5dGUgcmVsb2NzIGhlcmUsIHNvIHdlIGluc2lzdCBvbiBoYXZpbmcgNCBieXRlcy4gICovCi0gICAgICBpZiAocmVsLT5hZGRyZXNzIDwgb2Zmc2V0Ci0JICB8fCByZWwtPmFkZHJlc3MgKyA0ID4gb2Zmc2V0ICsgY291bnQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE5ldFdhcmUgZG9lc24ndCBzdXBwb3J0IHJlbG9jIGFkZGVuZHMsIHNvIHdlIGdldCByaWQgb2YgdGhlbQotCSBoZXJlIGJ5IHNpbXBseSBhZGRpbmcgdGhlbSBpbnRvIHRoZSBvYmplY3QgZGF0YS4gIFdlIGhhbmRsZQotCSB0aGUgc3ltYm9sIHZhbHVlLCBpZiBhbnksIHRoZSBzYW1lIHdheS4gICovCi0gICAgICBhZGRlbmQgPSByZWwtPmFkZGVuZCArIHN5bS0+dmFsdWU7Ci0KLSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24uICBJZiB0aGUKLQkgc3ltYm9sIGlzIGluIHRoZSAuYnNzIHNlZ21lbnQsIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgc2l6ZSBvZgotCSB0aGUgZGF0YSBzZWdtZW50IGluIHRoZSBvZmZzZXQgYXMgd2VsbC4gIEZvcnR1bmF0ZWx5LCB3ZSBrbm93Ci0JIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzZWN0aW9uIGlzIGluIHRoZSBOTE0KLQkgaGVhZGVyLiAgKi8KLSAgICAgIGlmICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAmIFNFQ19MT0FEKSA9PSAwKQotCSAgJiYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICAgJiBTRUNfQUxMT0MpICE9IDApKQotCWFkZGVuZCArPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlU2l6ZTsKLQotICAgICAgaWYgKGFkZGVuZCAhPSAwCi0JICAmJiByZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWwtPmFkZHJlc3MgLSBvZmZzZXQpOwotCSAgdmFsICs9IGFkZGVuZDsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWwtPmFkZHJlc3MgLSBvZmZzZXQpOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogTmV0V2FyZSB1c2VzIGEgcmVsb2Mgd2l0aCBwY3JlbF9vZmZzZXQgc2V0LiAgV2UgYWRqdXN0Ci0JIHBjX3JlbGF0aXZlIHJlbG9jcyBhY2NvcmRpbmdseS4gIFdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlCi0JIGhvd3RvIGZpZWxkLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHRoZSBjdXJyZW50IG9uZSBpcwotCSBjb21wYXRpYmxlLiAgV2Ugc2hvdWxkIGNoZWNrIHNwZWNpYWxfZnVuY3Rpb24gaGVyZSwgYnV0IGF0Ci0JIHRoZSBtb21lbnQgY29mZi1pMzg2IHVzZXMgYSBzcGVjaWFsX2Z1bmN0aW9uIHdoaWNoIGRvZXMgbm90Ci0JIGFmZmVjdCB3aGF0IHdlIGFyZSBkb2luZyBoZXJlLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0JICAmJiAhIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldAotCSAgJiYgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zaXplID09IDIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHNpemUgPT0gMzIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHBvcyA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zcmNfbWFzayA9PSAweGZmZmZmZmZmCi0JICAmJiByZWwtPmhvd3RvLT5kc3RfbWFzayA9PSAweGZmZmZmZmZmKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICAvKiBXaGVuIHBjcmVsX29mZnNldCBpcyBub3Qgc2V0LCBpdCBtZWFucyB0aGF0IHRoZSBuZWdhdGl2ZQotCSAgICAgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBsb2NhdGlvbiBpcyBzdG9yZWQgaW4gdGhlCi0JICAgICBtZW1vcnkgbG9jYXRpb24uICBXZSBtdXN0IGFkZCBpdCBiYWNrIGluLiAgKi8KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsLT5hZGRyZXNzIC0gb2Zmc2V0KTsKLQkgIHZhbCArPSByZWwtPmFkZHJlc3M7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsLT5hZGRyZXNzIC0gb2Zmc2V0KTsKLQotCSAgcmVsLT5ob3d0byA9ICZubG1faTM4Nl9wY3JlbF9ob3d0bzsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgTmV0V2FyZSBpMzg2IGltcG9ydCByZWNvcmQgKi8KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl9yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLwotICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOwotICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOwotICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKLSAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKCFubG1fcmVsb2NzKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX2kzODZfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCAmc2VjdGlvbiwKLQkJCSAgICAgICAmbmxtX3JlbG9jcyAtPiByZWxvYykKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBubG1fcmVsb2NzKys7Ci0gICAgICBzeW0gLT4gcmNudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2kzODZfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBiZmRfYnl0ZSBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmxtX2kzODZfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSByZWxvY3NbaV0ucmVsKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfaTM4Nl9iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgTG9hZGFibGUgTW9kdWxlXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfaTM4Nl9FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotICAwLAkvKiBvcHRpb25hbF9wcmVmaXhfc2l6ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICAwLAotICBmYWxzZSwKLSAgMCwJLyogYmFja2VuZF9vYmplY3RfcCAqLwotICAwLAkvKiB3cml0ZV9wcmVmaXhfZnVuYyAqLwotICBubG1faTM4Nl9yZWFkX3JlbG9jLAotICBubG1faTM4Nl9tYW5nbGVfcmVsb2NzLAotICBubG1faTM4Nl9yZWFkX2ltcG9ydCwKLSAgbmxtX2kzODZfd3JpdGVfaW1wb3J0LAotICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KLSAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1faTM4Nl93cml0ZV9leHRlcm5hbCwKLSAgMCwJLyogd3JpdGVfZXhwb3J0ICovCi19OwotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJIm5sbTMyLWkzODYiCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQlubG1OQU1FKGkzODZfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfaTM4Nl9iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItcHBjLmMgYi9iZmQvbmxtMzItcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjQ4MzQuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciAzMi1iaXQgUG93ZXJQQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogVGhlIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIGNoYW5nZWQuICBEZWZpbmUgT0xERk9STUFUIHRvIGdldCB0aGUKLSAgIG9sZCBmb3JtYXQuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL3BwYy1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgotCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLSNpZmRlZiBPTERGT1JNQVQKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX2JhY2tlbmRfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeAotICBQQVJBTVMgKChiZmQgKikpOwotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLQotI2lmZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiwgaW50KSk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQotI2lmbmRlZiBPTERGT1JNQVQKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJmZF92bWEgbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotI2VuZGlmCi0MCi0jaWZkZWYgT0xERk9STUFUCi0KLS8qIFRoZSBwcmVmaXggaGVhZGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgb2xkIGZvcm1hdC4gICovCi0KLS8qIFBvd2VyUEMgTkxNJ3MgaGF2ZSBhIHByZWZpeCBoZWFkZXIgYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0uICBUaGlzCi0gICBmdW5jdGlvbiByZWFkcyBpdCBpbiwgdmVyaWZpZXMgdGhlIHZlcnNpb24sIGFuZCBzZWVrcyB0aGUgYmZkIHRvCi0gICB0aGUgbG9jYXRpb24gYmVmb3JlIHRoZSByZWd1bGFyIE5MTSBoZWFkZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobWVtY21wIChzLnNpZ25hdHVyZSwgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUsIHNpemVvZiBzLnNpZ25hdHVyZSkgIT0gMAotICAgICAgfHwgYmZkX2hfZ2V0XzMyIChhYmZkLCBzLmhlYWRlclZlcnNpb24pICE9IE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9wcmVmaXggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciBzOwotCi0gIG1lbXNldCAoJnMsIDAsIHNpemVvZiBzKTsKLSAgbWVtY3B5IChzLnNpZ25hdHVyZSwgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUsIHNpemVvZiBzLnNpZ25hdHVyZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04sIHMuaGVhZGVyVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIDAsIHMub3JpZ2lucyk7Ci0KLSAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHdlIGRvIGFib3V0IHRoZSBkYXRlPyAgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIE9MREZPUk1BVCAqLwotDAotI2lmbmRlZiBPTERGT1JNQVQKLQotLyogVGhlcmUgaXMgb25seSBvbmUgdHlwZSBvZiByZWxvYyBpbiBhIFBvd2VyUEMgTkxNLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX3Bvd2VycGNfaG93dG8gPQotICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIjMyIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFJlYWQgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLQotICAvKiBUaGUgdmFsdWUgaXMgYSB3b3JkIG9mZnNldCBpbnRvIGVpdGhlciB0aGUgY29kZSBvciBkYXRhIHNlZ21lbnQuCi0gICAgIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoaWNoIG5lZWRzIHRvIGJlIGFkanVzdGVkLgotCi0gICAgIFRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUgZGF0YQotICAgICBzZWdtZW50LCBvciAxIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUgdGV4dCBzZWdtZW50LgotCi0gICAgIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGZpeHVwIHJhdGhlciB0aGFuIGFuIGltcG9ydGVkIHN5bWJvbCAodGhlCi0gICAgIHN5bSBhcmd1bWVudCBpcyBOVUxMKSwgdGhlbiB0aGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAKLSAgICAgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCi0gICAgIGxvY2F0aW9uIGFkZHJlc3NlZCBieSB0aGUgdmFsdWUsIG9yIDEgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIHRleHQKLSAgICAgc2VnbWVudCBzaG91bGQgYmUgYWRkZWQuCi0KLSAgICAgSWYgdGhpcyBpcyBhbiBpbXBvcnRlZCBzeW1ib2wsIHRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMKLSAgICAgbm90IHVzZWQgYW5kIG11c3QgYmUgMC4gICovCi0KLSAgaWYgKCh2YWwgJiBOTE1fSElCSVQpID09IDApCi0gICAgbmFtZSA9IE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gTkxNX0NPREVfTkFNRTsKLSAgICAgIHZhbCAmPX4gTkxNX0hJQklUOwotICAgIH0KLSAgKnNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0KLSAgaWYgKHN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgodmFsICYgKE5MTV9ISUJJVCA+PiAxKSkgPT0gMCkKLQluYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gTkxNX0NPREVfTkFNRTsKLQkgIHZhbCAmPX4gKE5MTV9ISUJJVCA+PiAxKTsKLQl9Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLSAgcmVsLT5ob3d0byA9ICZubG1fcG93ZXJwY19ob3d0bzsKLQotICByZWwtPmFkZHJlc3MgPSB2YWwgPDwgMjsKLSAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZWxzZSAvKiBPTERGT1JNQVQgKi8KLQotLyogVGhpcyByZWxvYyBoYW5kbGluZyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIG9sZCBmb3JtYXQuICAqLwotCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvYyB0eXBlcy4gIFBvd2VyUEMgTkxNcyB1c2UgWENPRkYKLSAgIHJlbG9jIHR5cGVzLCBhbmQgSSBoYXZlIGp1c3QgY29waWVkIHRoZSBYQ09GRiByZWxvYyB0YWJsZSBoZXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX3Bvd2VycGNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDAsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1BPUyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24sIGJ1dCBzdG9yZSBuZWdhdGl2ZSB2YWx1ZS4gICovCi0gIEhPV1RPICgxLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAtMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfTkVHIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogMTYgYml0IFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UT0MiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGlzIGlzLiAgKi8KLSAgSE9XVE8gKDQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JUQiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBFeHRlcm5hbCBUT0MgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKDUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0dMIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTG9jYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UQ0wiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgNyB9LAotICAKLSAgLyogTm9uIG1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0JBIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyA5IH0sCi0KLSAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4YiB9LAotCi0gIC8qIEluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHhjLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvYWQgYWRkcmVzcy4gICovCi0gIEhPV1RPICgweGQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JMQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweGUgfSwKLSAgCi0gIC8qIE5vbi1yZWxvY2F0aW5nIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPICgweGYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFRiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLCAgICAgCSAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4MTAgfSwKLSAgeyAweDExIH0sCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgaW5kaXJlY3QgbG9hZC4gICovCi0gIEhPV1RPICgweDEyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UUkwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIFRPQyByZWxhdGl2ZSBsb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHgxMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMQSIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweDE0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SUlRCSSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkEiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgY2FsbCBhYnNvbHV0ZSBpbmRpcmVjdC4gICovCi0gIEhPV1RPICgweDE2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9DQUkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgY2FsbCByZWxhdGl2ZS4gICovCi0gIEhPV1RPICgweDE3LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxOSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJBQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCByZWxhdGl2ZS4gICovCi0gIEhPV1RPICgweDFhLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDFiLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLSNkZWZpbmUgSE9XVE9fQ09VTlQgKHNpemVvZiBubG1fcG93ZXJwY19ob3d0b190YWJsZQkJXAotCQkgICAgIC8gc2l6ZW9mIG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlWzBdKQotCi0vKiBSZWFkIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jIGV4dDsKLSAgYmZkX3ZtYSBsX3ZhZGRyOwotICB1bnNpZ25lZCBsb25nIGxfc3ltbmR4OwotICBpbnQgbF9ydHlwZTsKLSAgaW50IGxfcnNlY25tOwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYywgKmJzc19zZWM7Ci0KLSAgLyogUmVhZCB0aGUgcmVsb2MgZnJvbSB0aGUgZmlsZS4gICovCi0gIGlmIChiZmRfcmVhZCAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3dhcCBpbiB0aGUgZmllbGRzLiAgKi8KLSAgbF92YWRkciA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LmxfdmFkZHIpOwotICBsX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0Lmxfc3ltbmR4KTsKLSAgbF9ydHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LmxfcnR5cGUpOwotICBsX3JzZWNubSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LmxfcnNlY25tKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb25zIG5vdywgZm9yIGNvbnZlbmllbmNlLiAgKi8KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0KLSAgLyogV29yayBvdXQgdGhlIGFyZWxlbnQgZmllbGRzLiAgKi8KLSAgaWYgKHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gaW1wb3J0LiAgc3ltX3B0cl9wdHIgaXMgZmlsbGVkIGluIGJ5Ci0JIG5sbV9jYW5vbmljYWxpemVfcmVsb2MuICAqLwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaWYgKGxfc3ltbmR4ID09IDApCi0Jc2VjID0gY29kZV9zZWM7Ci0gICAgICBlbHNlIGlmIChsX3N5bW5keCA9PSAxKQotCXNlYyA9IGRhdGFfc2VjOwotICAgICAgZWxzZSBpZiAobF9zeW1uZHggPT0gMikKLQlzZWMgPSBic3Nfc2VjOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlYy0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0gIHJlbC0+YWRkZW5kID0gMDsKLQotICBCRkRfQVNTRVJUICgobF9ydHlwZSAmIDB4ZmYpIDwgSE9XVE9fQ09VTlQpOwotCi0gIHJlbC0+aG93dG8gPSBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIChsX3J0eXBlICYgMHhmZik7Ci0KLSAgQkZEX0FTU0VSVCAocmVsLT5ob3d0by0+bmFtZSAhPSBOVUxMCi0JICAgICAgJiYgKChsX3J0eXBlICYgMHg4MDAwKSAhPSAwCi0JCSAgPyAocmVsLT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJICAgICA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0JCSAgOiAocmVsLT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJICAgICA9PSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCkpCi0JICAgICAgJiYgKChsX3J0eXBlID4+IDgpICYgMHgxZikgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZSAtIDEpOwotCi0gIGlmIChsX3JzZWNubSA9PSAwKQotICAgICpzZWNwID0gY29kZV9zZWM7Ci0gIGVsc2UgaWYgKGxfcnNlY25tID09IDEpCi0gICAgewotICAgICAgKnNlY3AgPSBkYXRhX3NlYzsKLSAgICAgIGxfdmFkZHIgLT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWwtPmFkZHJlc3MgPSBsX3ZhZGRyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogT0xERk9STUFUICovCi0KLS8qIE1hbmdsZSBQb3dlclBDIE5MTSByZWxvY3MgZm9yIG91dHB1dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19tYW5nbGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBQb3dlclBDIE5MTSBpbXBvcnQgcmVjb3JkICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLwotICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHN5bSAtPiBzeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkIChuYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpICE9IHN5bWxlbmd0aCkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKLSAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOwotICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHJjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKG5sbV9yZWxvY3MgPT0gKHN0cnVjdCBubG1fcmVsZW50ICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gcmVsb2NzID0gbmxtX3JlbG9jczsKLSAgc3ltIC0+IHJjbnQgPSAwOwotICB3aGlsZSAoc3ltIC0+IHJjbnQgPCByY291bnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAKLSAgICAgIGlmIChubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sICZzZWN0aW9uLAotCQkJCSAgJm5sbV9yZWxvY3MgLT4gcmVsb2MpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmxtX3JlbG9jcysrOwotICAgICAgc3ltIC0+IHJjbnQrKzsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZuZGVmIE9MREZPUk1BVAotCi0vKiBXcml0ZSBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBhc3ltYm9sICpzeW07Ci0gIGJmZF92bWEgdmFsOwotICBiZmRfYnl0ZSB0ZW1wWzRdOwotCi0gIC8qIFBvd2VyUEMgTmV0V2FyZSBvbmx5IHN1cHBvcnRzIG9uZSBraW5kIG9mIHJlbG9jLiAgKi8KLSAgaWYgKHJlbC0+YWRkZW5kICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8gPT0gTlVMTAotICAgICAgfHwgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvLT5zaXplICE9IDIKLSAgICAgIHx8IHJlbC0+aG93dG8tPmJpdHNpemUgIT0gMzIKLSAgICAgIHx8IHJlbC0+aG93dG8tPmJpdHBvcyAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotICAgICAgfHwgKHJlbC0+aG93dG8tPnNyY19tYXNrICE9IDB4ZmZmZmZmZmYgJiYgcmVsLT5hZGRlbmQgIT0gMCkKLSAgICAgIHx8IHJlbC0+aG93dG8tPmRzdF9tYXNrICE9IDB4ZmZmZmZmZmYpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgLyogVGhlIHZhbHVlIHdlIHdyaXRlIG91dCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFwcHJvcHJpYXRlCi0gICAgIHNlZ21lbnQsIHJpZ2h0c2hpZnRlZCBieSB0d28uICBUaGlzIG9mZnNldCBpcyB0aGUgc2VjdGlvbiB2bWEsCi0gICAgIGFkanVzdGVkIGJ5IHRoZSB2bWEgb2YgdGhlIGxvd2VzdCBzZWN0aW9uIGluIHRoYXQgc2VnbWVudCwgcGx1cwotICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7Ci0gIGlmICgodmFsICYgMykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHZhbCA+Pj0gMjsKLQotICAvKiBUaGUgaGlnaCBiaXQgaXMgMCBpZiB0aGUgcmVsb2MgaXMgaW4gdGhlIGRhdGEgc2VjdGlvbiwgb3IgMSBpZgotICAgICB0aGUgcmVsb2MgaXMgaW4gdGhlIGNvZGUgc2VjdGlvbi4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfREFUQSkKLSAgICB2YWwgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0gICAgICB2YWwgfD0gTkxNX0hJQklUOwotICAgIH0KLSAgICAKLSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgcmVsb2NhdGlvbiBmaXh1cC4gIFRoZSBzZWNvbmQgbW9zdAotCSBzaWduaWZpY2FudCBiaXQgaXMgMCBpZiB0aGlzIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGUgZGF0YQotCSBzZWdtZW50LCBvciAxIGlmIGl0IGlzIGEgcmVsb2MgYWdhaW5zdCB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkgJiBTRUNfQ09ERSkKLQl2YWwgfD0gTkxNX0hJQklUID4+IDE7Ci0gICAgfQotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZWxzZSAvKiBPTERGT1JNQVQgKi8KLQotLyogVGhpcyBpcyB1c2VkIGZvciB0aGUgcmVsb2MgaGFuZGxpbmcgaW4gdGhlIG9sZCBmb3JtYXQuICAqLwotCi0vKiBXcml0ZSBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCwgaW5keCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci0gICAgIGludCBpbmR4OwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9yZWxvYyBleHQ7Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjLCAqYnNzX3NlYzsKLSAgYXN5bWJvbCAqc3ltOwotICBhc2VjdGlvbiAqc3ltc2VjOwotICB1bnNpZ25lZCBsb25nIGxfc3ltbmR4OwotICBpbnQgbF9ydHlwZTsKLSAgaW50IGxfcnNlY25tOwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbnMgbm93LCBmb3IgY29udmVuaWVuY2UuICAqLwotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQotICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLSAgc3ltc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW0pOwotICBpZiAoaW5keCAhPSAtMSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bXNlYykpOwotICAgICAgbF9zeW1uZHggPSBpbmR4ICsgMzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3ltc2VjID09IGNvZGVfc2VjKQotCWxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN5bXNlYyA9PSBkYXRhX3NlYykKLQlsX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzeW1zZWMgPT0gYnNzX3NlYykKLQlsX3N5bW5keCA9IDI7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBsX3N5bW5keCwgZXh0Lmxfc3ltbmR4KTsKLQotICBmb3IgKGhvd3RvID0gbmxtX3Bvd2VycGNfaG93dG9fdGFibGU7Ci0gICAgICAgaG93dG8gPCBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIEhPV1RPX0NPVU5UOwotICAgICAgIGhvd3RvKyspCi0gICAgewotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQKLQkgICYmIGhvd3RvLT5zaXplID09IHJlbC0+aG93dG8tPnNpemUKLQkgICYmIGhvd3RvLT5iaXRzaXplID09IHJlbC0+aG93dG8tPmJpdHNpemUKLQkgICYmIGhvd3RvLT5wY19yZWxhdGl2ZSA9PSByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSAgJiYgaG93dG8tPmJpdHBvcyA9PSByZWwtPmhvd3RvLT5iaXRwb3MKLQkgICYmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IHJlbC0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgICAgIHx8ICghIHJlbC0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCQkgICYmIHJlbC0+YWRkZW5kID09IDApKQotCSAgJiYgKGhvd3RvLT5zcmNfbWFzayA9PSByZWwtPmhvd3RvLT5zcmNfbWFzawotCSAgICAgIHx8IChyZWwtPmhvd3RvLT5zcmNfbWFzayA9PSAwCi0JCSAgJiYgcmVsLT5hZGRlbmQgPT0gMCkpCi0JICAmJiBob3d0by0+ZHN0X21hc2sgPT0gcmVsLT5ob3d0by0+ZHN0X21hc2sKLQkgICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCWJyZWFrOwotICAgIH0KLSAgaWYgKGhvd3RvID49IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlICsgSE9XVE9fQ09VTlQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGxfcnR5cGUgPSBob3d0by0+dHlwZTsKLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0gICAgbF9ydHlwZSB8PSAweDgwMDA7Ci0gIGxfcnR5cGUgfD0gKGhvd3RvLT5iaXRzaXplIC0gMSkgPDwgODsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAoYmZkX3ZtYSkgbF9ydHlwZSwgZXh0LmxfcnR5cGUpOwotCi0gIGFkZHJlc3MgPSByZWwtPmFkZHJlc3M7Ci0KLSAgaWYgKHNlYyA9PSBjb2RlX3NlYykKLSAgICBsX3JzZWNubSA9IDA7Ci0gIGVsc2UgaWYgKHNlYyA9PSBkYXRhX3NlYykKLSAgICB7Ci0gICAgICBsX3JzZWNubSA9IDE7Ci0gICAgICBhZGRyZXNzICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAoYmZkX3ZtYSkgbF9yc2Vjbm0sIGV4dC5sX3JzZWNubSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGFkZHJlc3MsIGV4dC5sX3ZhZGRyKTsKLQotICBpZiAoYmZkX3dyaXRlICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSBpbXBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIHJldHVybiBubG1fcG93ZXJwY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwsIC0xKTsKLX0KLQotI2VuZGlmIC8qIE9MREZPUk1BVCAqLwotCi0vKiBXcml0ZSBhIFBvd2VyUEMgTkxNIGV4dGVybmFsIHN5bWJvbC4gIFRoaXMgcm91dGluZSBrZWVwcyBhIHN0YXRpYwotICAgY291bnQgb2YgdGhlIHN5bWJvbCBpbmRleC4gIEZJWE1FOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgbmVjZXNzYXJ5LCBhbmQgdGhlIGluZGV4IG5ldmVyIGdldHMgcmVzZXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBiZmRfYnl0ZSBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0jaWZkZWYgT0xERk9STUFUCi0gIHN0YXRpYyBpbnQgaW5keDsKLSNlbmRpZgotCi0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLSAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKSAhPSBzaXplb2YoYmZkX2J5dGUpKQotICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBjb3VudCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZih0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotI2lmbmRlZiBPTERGT1JNQVQKLSAgICAgIGlmICghIG5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCAoYWJmZCwgcmVsb2NzW2ldLnNlYywgcmVsb2NzW2ldLnJlbCkpCi0JcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgICAgIGlmICghIG5sbV9wb3dlcnBjX3dyaXRlX3JlbG9jIChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSAgICAgcmVsb2NzW2ldLnJlbCwgaW5keCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgT0xERk9STUFUCi0gICsraW5keDsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotDAotI2lmbmRlZiBPTERGT1JNQVQKLQotLyogUG93ZXJQQyBOZXR3YXJlIHVzZXMgYSB3b3JkIG9mZnNldCwgbm90IGEgYnl0ZSBvZmZzZXQsIGZvciBwdWJsaWMKLSAgIHN5bWJvbHMuICAqLwotCi0vKiBTZXQgdGhlIHNlY3Rpb24gZm9yIGEgcHVibGljIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19zZXRfcHVibGljX3NlY3Rpb24gKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBpZiAoc3ltLT5zeW1ib2wudmFsdWUgJiBOTE1fSElCSVQpCi0gICAgewotICAgICAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfk5MTV9ISUJJVDsKLSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gICAgfQotCi0gIHN5bS0+c3ltYm9sLnZhbHVlIDw8PSAyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIG9mZnNldCB0byB3cml0ZSBvdXQgZm9yIGEgcHVibGljIHN5bWJvbC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1ubG1fcG93ZXJwY19nZXRfcHVibGljX29mZnNldCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgb2Zmc2V0ID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLSAgaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLSAgICB7Ci0gICAgICBvZmZzZXQgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0gICAgICBvZmZzZXQgfD0gTkxNX0hJQklUOwotICAgIH0KLSAgZWxzZSBpZiAoc2VjLT5mbGFncyAmIChTRUNfREFUQSB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgLyogU0VDX0FMTE9DIGlzIGZvciB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLSAgICAgIG9mZnNldCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBjYW4ndCBoYW5kbGUgYW4gZXhwb3J0ZWQgc3ltYm9sIHRoYXQgaXMgbm90IGluIHRoZSBjb2RlIG9yCi0JIGRhdGEgc2VnbWVudC4gICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQ7Ci19Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE9MREZPUk1BVCkgKi8KLQwKLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9wb3dlcnBjX2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBQb3dlclBDIE1vZHVsZSBcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlciksCi0jaWZuZGVmIE9MREZPUk1BVAotICAwLAkvKiBvcHRpb25hbF9wcmVmaXhfc2l6ZSAqLwotI2Vsc2UKLSAgc2l6ZW9mIChzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyKSwKLSNlbmRpZgotICBiZmRfYXJjaF9wb3dlcnBjLAotICAwLAotICBmYWxzZSwKLSNpZm5kZWYgT0xERk9STUFUCi0gIDAsCS8qIGJhY2tlbmRfb2JqZWN0X3AgKi8KLSAgMCwJLyogd3JpdGVfcHJlZml4ICovCi0jZWxzZQotICBubG1fcG93ZXJwY19iYWNrZW5kX29iamVjdF9wLAotICBubG1fcG93ZXJwY193cml0ZV9wcmVmaXgsCi0jZW5kaWYKLSAgbmxtX3Bvd2VycGNfcmVhZF9yZWxvYywKLSAgbmxtX3Bvd2VycGNfbWFuZ2xlX3JlbG9jcywKLSAgbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQsCi0gIG5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCwKLSNpZm5kZWYgT0xERk9STUFUCi0gIG5sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbiwKLSAgbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQsCi0jZWxzZQotICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KLSAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KLSNlbmRpZgotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsLAotICAwLAkvKiB3cml0ZV9leHBvcnQgKi8KLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJIm5sbTMyLXBvd2VycGMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJbmxtTkFNRShwb3dlcnBjX3ZlYykKLSNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX3Bvd2VycGNfYmFja2VuZAotCi0jaW5jbHVkZSAibmxtLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLXNwYXJjLmMgYi9iZmQvbmxtMzItc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0ZDgwYS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzItc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKiBTdXBwb3J0IGZvciAzMi1iaXQgU1BBUkMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkKLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNpbmNsdWRlICJubG0vc3BhcmMzMi1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9zcGFyY19FeHRlcm5hbF9GaXhlZF9IZWFkZXIKLQotI2luY2x1ZGUgImxpYm5sbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3dyaXRlX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY19tYW5nbGVfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY19yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3dyaXRlX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIFJfU1BBUkNfTk9ORSA9IDAsCi0gICAgUl9TUEFSQ184LAkJUl9TUEFSQ18xNiwJCVJfU1BBUkNfMzIsIAotICAgIFJfU1BBUkNfRElTUDgsCVJfU1BBUkNfRElTUDE2LAkJUl9TUEFSQ19ESVNQMzIsIAotICAgIFJfU1BBUkNfV0RJU1AzMCwJUl9TUEFSQ19XRElTUDIyLAotICAgIFJfU1BBUkNfSEkyMiwJUl9TUEFSQ18yMiwKLSAgICBSX1NQQVJDXzEzLAkJUl9TUEFSQ19MTzEwLAotICAgIFJfU1BBUkNfR09UMTAsCVJfU1BBUkNfR09UMTMsCQlSX1NQQVJDX0dPVDIyLAotICAgIFJfU1BBUkNfUEMxMCwJUl9TUEFSQ19QQzIyLAotICAgIFJfU1BBUkNfV1BMVDMwLAotICAgIFJfU1BBUkNfQ09QWSwKLSAgICBSX1NQQVJDX0dMT0JfREFULAlSX1NQQVJDX0pNUF9TTE9ULAotICAgIFJfU1BBUkNfUkVMQVRJVkUsCi0gICAgUl9TUEFSQ19VQTMyLAotICAgIFJfU1BBUkNfbWF4Ci0gIH07Ci0KLSNpZiAwCi1zdGF0aWMgQ09OU1QgY2hhciAqQ09OU1QgcmVsb2NfdHlwZV9uYW1lc1tdID0KLXsKLSAgIlJfU1BBUkNfTk9ORSIsCi0gICJSX1NQQVJDXzgiLAkJIlJfU1BBUkNfMTYiLAkJIlJfU1BBUkNfMzIiLAotICAiUl9TUEFSQ19ESVNQOCIsCSJSX1NQQVJDX0RJU1AxNiIsCSJSX1NQQVJDX0RJU1AzMiIsCi0gICJSX1NQQVJDX1dESVNQMzAiLAkiUl9TUEFSQ19XRElTUDIyIiwKLSAgIlJfU1BBUkNfSEkyMiIsCSJSX1NQQVJDXzIyIiwKLSAgIlJfU1BBUkNfMTMiLAkJIlJfU1BBUkNfTE8xMCIsCi0gICJSX1NQQVJDX0dPVDEwIiwJIlJfU1BBUkNfR09UMTMiLAkiUl9TUEFSQ19HT1QyMiIsCi0gICJSX1NQQVJDX1BDMTAiLAkiUl9TUEFSQ19QQzIyIiwKLSAgIlJfU1BBUkNfV1BMVDMwIiwKLSAgIlJfU1BBUkNfQ09QWSIsCi0gICJSX1NQQVJDX0dMT0JfREFUIiwJIlJfU1BBUkNfSk1QX1NMT1QiLAotICAiUl9TUEFSQ19SRUxBVElWRSIsCi0gICJSX1NQQVJDX1VBMzIiLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG0zMl9zcGFyY19ob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzgsICAgICAgIDAsMCwgOCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgIDAsMCwgOCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgMCwyLDMyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAyLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMjIsICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0NPUFksICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi19OwotCi0vKiBSZWFkIGEgTmV0V2FyZSBzcGFyYyByZWxvYy4gICovCi0KLXN0cnVjdCBubG0zMl9zcGFyY19yZWxvY19leHQgewotICB1bnNpZ25lZCBjaGFyIG9mZnNldFs0XTsKLSAgdW5zaWduZWQgY2hhciBhZGRlbmRbNF07Ci0gIHVuc2lnbmVkIGNoYXIgdHlwZVsxXTsKLSAgdW5zaWduZWQgY2hhciBwYWQxWzNdOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfdm1hIHZhbCwgYWRkZW5kOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCB0eXBlOwotICBzdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHRtcF9yZWxvYzsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmdG1wX3JlbG9jLCAxMiwgMSwgYWJmZCkgIT0gMTIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQotICAqc2VjcCA9IGNvZGVfc2VjOwotCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRtcF9yZWxvYy5vZmZzZXQpOwotICBhZGRlbmQgPSBiZmRfZ2V0XzMyIChhYmZkLCB0bXBfcmVsb2MuYWRkZW5kKTsKLSAgdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgdG1wX3JlbG9jLnR5cGUpOwotCi0gIHJlbC0+YWRkcmVzcyA9IHZhbDsKLSAgcmVsLT5hZGRlbmQgPSBhZGRlbmQ7Ci0gIHJlbC0+aG93dG8gPSBOVUxMOwotCi0gIGZvciAoaW5kZXggPSAwOwotICAgICAgIGluZGV4IDwgc2l6ZW9mKG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlKSAvIHNpemVvZihyZWxvY19ob3d0b190eXBlKTsKLSAgICAgICBpbmRleCsrKQotICAgIGlmIChubG0zMl9zcGFyY19ob3d0b190YWJsZVtpbmRleF0udHlwZSA9PSB0eXBlKSB7Ci0gICAgICByZWwtPmhvd3RvID0gJm5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW2luZGV4XTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgYWRkcmVzcyA9ICUwOGx4LCBhZGRlbmQgPSAlMDhseCwgdHlwZSA9ICVkLCBob3d0byA9ICUwOGx4XG4iLAotCSAgIF9fRlVOQ1RJT05fXywgcmVsLT5hZGRyZXNzLCByZWwtPmFkZGVuZCwgdHlwZSwgcmVsLT5ob3d0byk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci0KLX0KLQotLyogV3JpdGUgYSBOZXRXYXJlIHNwYXJjIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfdm1hIHZhbDsKLSAgc3RydWN0IG5sbTMyX3NwYXJjX3JlbG9jX2V4dCB0bXBfcmVsb2M7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgaW50IHR5cGUgPSAtMTsKLSAgcmVsb2NfaG93dG9fdHlwZSAqdG1wOwotCi0gIAotICBmb3IgKGluZGV4ID0gMDsKLSAgICAgICBpbmRleCA8IHNpemVvZiAobmxtMzJfc3BhcmNfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHJlbG9jX2hvd3RvX3R5cGUpOwotICAgICAgIGluZGV4KyspIHsKLSAgICB0bXAgPSAmbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbaW5kZXhdOwotCi0gICAgaWYgKHRtcC0+cmlnaHRzaGlmdCA9PSByZWwtPmhvd3RvLT5yaWdodHNoaWZ0Ci0JJiYgdG1wLT5zaXplID09IHJlbC0+aG93dG8tPnNpemUKLQkmJiB0bXAtPmJpdHNpemUgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZQotCSYmIHRtcC0+cGNfcmVsYXRpdmUgPT0gcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkmJiB0bXAtPmJpdHBvcyA9PSByZWwtPmhvd3RvLT5iaXRwb3MKLQkmJiB0bXAtPnNyY19tYXNrID09IHJlbC0+aG93dG8tPnNyY19tYXNrCi0JJiYgdG1wLT5kc3RfbWFzayA9PSByZWwtPmhvd3RvLT5kc3RfbWFzaykgewotICAgICAgdHlwZSA9IHRtcC0+dHlwZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAodHlwZSA9PSAtMSkKLSAgICBhYm9ydCgpOwotCi0gIC8qCi0gICAqIE5ldHdhcmUgd2FudHMgYSBsaXN0IG9mIHJlbG9jcyBmb3IgZWFjaCBhZGRyZXNzLgotICAgKiBGb3JtYXQgaXM6Ci0gICAqCWxvbmcJb2Zmc2V0Ci0gICAqCWxvbmcJYWRkZW5kCi0gICAqCWNoYXIJdHlwZQotICAgKiBUaGF0IHNob3VsZCBiZSBpdC4KLSAgICovCi0KLSAgLyogVGhlIHZhbHVlIHdlIHdyaXRlIG91dCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFwcHJvcHJpYXRlCi0gICAgIHNlZ21lbnQuICBUaGlzIG9mZnNldCBpcyB0aGUgc2VjdGlvbiB2bWEsIGFkanVzdGVkIGJ5IHRoZSB2bWEgb2YKLSAgICAgdGhlIGxvd2VzdCBzZWN0aW9uIGluIHRoYXQgc2VnbWVudCwgcGx1cyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbi4gICovCi0jaWYgMAotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCAoKnJlbC0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKSArIHJlbC0+YWRkcmVzczsKLSNlbHNlCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7Ci0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgdmFsID0gJTA4bHgsIGFkZGVuZCA9ICUwOGx4LCB0eXBlID0gJWRcbiIsCi0JICAgX19GVU5DVElPTl9fLCB2YWwsIHJlbC0+YWRkZW5kLCByZWwtPmhvd3RvLT50eXBlKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHRtcF9yZWxvYy5vZmZzZXQpOwotICBiZmRfcHV0XzMyIChhYmZkLCByZWwtPmFkZGVuZCwgdG1wX3JlbG9jLmFkZGVuZCk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgKHNob3J0KShyZWwtPmhvd3RvLT50eXBlKSwgdG1wX3JlbG9jLnR5cGUpOwotCi0gIGlmIChiZmRfd3JpdGUgKCZ0bXBfcmVsb2MsIDEyLCAxLCBhYmZkKSAhPSAxMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbmdsZSByZWxvY3MgZm9yIFNQQVJDIE5ldFdhcmUuICBXZSBjYW4ganVzdCB1c2UgdGhlIHN0YW5kYXJkCi0gICBTUEFSQyByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIE5ldFdhcmUgc3BhcmMgaW1wb3J0IHJlY29yZCAqLwotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY19yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLwotICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKm5hbWU7Ci0gIAotICAvKgotICAgKiBGaXJzdCwgcmVhZCBpbiB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb24KLSAgICogZW50cmllcyBmb3IgdGhpcyBzeW1ib2wKLSAgICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgNCwgMSwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICByY291bnQgPSBiZmRfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLSAgCi0gIC8qCi0gICAqIE5leHQsIHJlYWQgaW4gdGhlIGxlbmd0aCBvZiB0aGUgc3ltYm9sCi0gICAqLwotICAKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKgotICAgKiBUaGVuIHJlYWQgaW4gdGhlIHN5bWJvbAotICAgKi8KLSAgCi0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOwotICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOwotICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKLSAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIAotICAvKgotICAgKiBOZXh0LCBzdGFydCByZWFkaW5nIGluIHRoZSByZWxvY3MuCi0gICAqLwotICAKLSAgbmxtX3JlbG9jcyA9ICgoc3RydWN0IG5sbV9yZWxlbnQgKikKLQkJYmZkX2FsbG9jIChhYmZkLCByY291bnQgKiBzaXplb2YgKHN0cnVjdCBubG1fcmVsZW50KSkpOwotICBpZiAoIW5sbV9yZWxvY3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gcmVsb2NzID0gbmxtX3JlbG9jczsKLSAgc3ltIC0+IHJjbnQgPSAwOwotICB3aGlsZSAoc3ltIC0+IHJjbnQgPCByY291bnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAKLSAgICAgIGlmIChubG1fc3BhcmNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCAmc2VjdGlvbiwKLQkJCSAgICAgICZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgY2hhciB0ZW1wWzRdOwotICBhc2VjdGlvbiAqY29kZSwgKmRhdGEsICpic3MsICpzeW1zZWM7Ci0gIGJmZF92bWEgYmFzZTsKLQotICBjb2RlID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBic3MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgc3ltc2VjID0gKCpyZWwtPnN5bV9wdHJfcHRyKS0+c2VjdGlvbjsKLQotICBpZiAoc3ltc2VjID09IGNvZGUpIHsKLSAgICBiYXNlID0gMDsKLSAgfSBlbHNlIGlmIChzeW1zZWMgPT0gZGF0YSkgewotICAgIGJhc2UgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlKTsKLSAgfSBlbHNlIGlmIChzeW1zZWMgPT0gYnNzKSB7Ci0gICAgYmFzZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGUpICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgZGF0YSk7Ci0gIH0gZWxzZQotICAgIGJhc2UgPSAwOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICA8JXgsIDE+XG5cdCIsCi0JICAgX19GVU5DVElPTl9fLCBiYXNlICsgKCpyZWwtPnN5bV9wdHJfcHRyKS0+dmFsdWUpOwotI2VuZGlmCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGJhc2UgKyAoKnJlbC0+c3ltX3B0cl9wdHIpLT52YWx1ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpdGVtcCwgNCwgMSwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIDEsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKXRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobmxtX3NwYXJjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBiZmRfYnl0ZSBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLSAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKSAhPSBzaXplb2YoYmZkX2J5dGUpKQotICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmxtX3NwYXJjX3dyaXRlX3JlbG9jIChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSByZWxvY3NbaV0ucmVsKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX2V4cG9ydCAoYWJmZCwgc3ltLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGJmZF9ieXRlIGxlbjsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiA8JXgsICVkLCAlcz5cbiIsCi0JICAgX19GVU5DVElPTl9fLCB2YWx1ZSwgc3RybGVuIChzeW0tPm5hbWUpLCBzeW0tPm5hbWUpOwotI2VuZGlmCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCB0ZW1wKTsKLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotCi0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIDQsIDEsIGFiZmQpICE9IDQKLSAgICAgIHx8IGJmZF93cml0ZSAoJmxlbiwgMSwgMSwgYWJmZCkgIT0gMQotICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI3VuZGVmIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbgotI3VuZGVmIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQKLQotI2luY2x1ZGUgIm5sbXN3YXAuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX3NwYXJjX2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBTUEFSQyBNb2R1bGUgICBcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9zcGFyY19FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotICAwLAkvKiBvcHRpb25hbF9wcmVmaXhfc2l6ZSAqLwotICBiZmRfYXJjaF9zcGFyYywKLSAgMCwKLSAgZmFsc2UsCi0gIDAsCS8qIGJhY2tlbmRfb2JqZWN0X3AgKi8KLSAgMCwJLyogd3JpdGVfcHJlZml4X2Z1bmMgKi8KLSAgbmxtX3NwYXJjX3JlYWRfcmVsb2MsCi0gIG5sbV9zcGFyY19tYW5nbGVfcmVsb2NzLAotICBubG1fc3BhcmNfcmVhZF9pbXBvcnQsCi0gIG5sbV9zcGFyY193cml0ZV9pbXBvcnQsCi0gIDAsCS8qIHNldF9wdWJsaWNfc2VjdGlvbiAqLwotICAwLAkvKiBnZXRfcHVibGljX29mZnNldCAqLwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9zcGFyY193cml0ZV9leHRlcm5hbCwKLSAgbmxtX3NwYXJjX3dyaXRlX2V4cG9ydAotfTsKLQotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJubG0zMi1zcGFyYyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCW5sbU5BTUUoc3BhcmNfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfc3BhcmNfYmFja2VuZAotCi0jaW5jbHVkZSAibmxtLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLmMgYi9iZmQvbmxtMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMGU0Zi4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIDMyLWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotI2luY2x1ZGUgIm5sbWNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG02NC5jIGIvYmZkL25sbTY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2Q5NmEuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLSNpbmNsdWRlICJubG1jb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtY29kZS5oIGIvYmZkL25sbWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxYTJmOC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1NiArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgdXNpbmcgRUxGIHN1cHBvcnQgYXMgdGhlCi0gICB0ZW1wbGF0ZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLS8qIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGRvIG5vdCB1c2UgdGhlIG5hbWVzIHRoZXkgYXBwZWFyIHRvIHVzZS4KLSAgIFRoaXMgZmlsZSBpcyBhY3R1YWxseSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBzaXplCi0gICBvZiBOTE0gdGFyZ2V0IHdlIGFyZSB1c2luZy4gIEF0IGVhY2ggc2l6ZSB3ZSB1c2UgYSBkaWZmZXJlbnQgbmFtZSwKLSAgIGNvbnN0cnVjdGVkIGJ5IHRoZSBtYWNybyBubG1OQU1FLiAgRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiB3aGljaAotICAgaXMgbmFtZWQgbmxtX3N5bWJvbF90eXBlIGJlbG93IGlzIGFjdHVhbGx5IG5hbWVkIG5sbTMyX3N5bWJvbF90eXBlCi0gICBpbiB0aGUgZmluYWwgZXhlY3V0YWJsZS4gICovCi0KLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0ZpeGVkX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikKLQotI2RlZmluZSBubG1fc3ltYm9sX3R5cGUJCQlubG1OQU1FKHN5bWJvbF90eXBlKQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiCQkJbmxtTkFNRShnZXRfc3ltdGFiKQotI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wJCW5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0jZGVmaW5lIG5sbV9wcmludF9zeW1ib2wJCW5sbU5BTUUocHJpbnRfc3ltYm9sKQotI2RlZmluZSBubG1fZ2V0X3N5bWJvbF9pbmZvCQlubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZAlubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIG5sbV9vYmplY3RfcAkJCW5sbU5BTUUob2JqZWN0X3ApCi0jZGVmaW5lIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cwlubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2RlZmluZSBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzCW5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbihhYmZkLHNyYyxkc3QpIFwKLSAgKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jKGFiZmQpKShhYmZkLHNyYyxkc3QpCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQoYWJmZCxzcmMsZHN0KSBcCi0gIChubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMoYWJmZCkpKGFiZmQsc3JjLGRzdCkKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RhdGljIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGZpbmRfbm9uemVybwotICBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZQotICBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotCi0vKiBTaG91bGQgcGVyaGFwcyB1c2UgcHV0X29mZnNldCwgcHV0X3dvcmQsIGV0Yy4gIEZvciBub3csIHRoZSB0d28gdmVyc2lvbnMKLSAgIGNhbiBiZSBoYW5kbGVkIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyAzMiBiaXRzIG9yICJ0aGUgbG9uZyB0eXBlIi4gICovCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF82NAotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfNjQKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLQotY29uc3QgYmZkX3RhcmdldCAqCi1ubG1fb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IG5sbV90ZGF0YSAoYWJmZCk7Ci0gIGJvb2xlYW4gKCpiYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotICBQVFIgeF9meGRoZHIgPSBOVUxMOwotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7Ci0gIHN0cnVjdCBubG1fb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOwotICBjb25zdCBjaGFyICpzaWduYXR1cmU7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgaGF2ZSBhIHByZWZpeCBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTSBmaXhlZAotICAgICBoZWFkZXIuICAqLwotICBiYWNrZW5kX29iamVjdF9wID0gbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYyAoYWJmZCk7Ci0gIGlmIChiYWNrZW5kX29iamVjdF9wKQotICAgIHsKLSAgICAgIGlmICghKCpiYWNrZW5kX29iamVjdF9wKSAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgIH0KLQotICAvKiBSZWFkIGluIHRoZSBmaXhlZCBsZW5ndGggcG9ydGlvbiBvZiB0aGUgTkxNIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLwotCi0gIHhfZnhkaGRyID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSk7Ci0gIGlmICh4X2Z4ZGhkciA9PSBOVUxMKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgeF9meGRoZHIsIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpICE9Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBlbHNlCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBubG1fb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bwotICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KLQotICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBubG1fb2JqX3RkYXRhICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5sbV9vYmpfdGRhdGEpKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBubG1fdGRhdGEgKGFiZmQpID0gbmV3X3RkYXRhOwotCi0gIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gKGFiZmQsIHhfZnhkaGRyLCBpX2Z4ZGhkcnApOwotICBmcmVlICh4X2Z4ZGhkcik7Ci0gIHhfZnhkaGRyID0gTlVMTDsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbiBOTE0gZmlsZSBmb3IgdGhpcyBiYWNrZW5kIGJ5IG1hdGNoaW5nCi0gICAgIHRoZSBOTE0gc2lnbmF0dXJlLiAqLwotCi0gIHNpZ25hdHVyZSA9IG5sbV9zaWduYXR1cmUgKGFiZmQpOwotICBpZiAoc2lnbmF0dXJlICE9IE5VTEwKLSAgICAgICYmICpzaWduYXR1cmUgIT0gJ1wwJwotICAgICAgJiYgc3RybmNtcCAoKGNoYXIgKikgaV9meGRoZHJwLT5zaWduYXR1cmUsIHNpZ25hdHVyZSwKLQkJICBOTE1fU0lHTkFUVVJFX1NJWkUpICE9IDApCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIFRoZXJlJ3Mgbm8gc3VwcG9ydGVkIHdheSB0byBkaXNjb3ZlciB0aGUgZW5kaWFuZXNzIG9mIGFuIE5MTSwgc28gdGVzdCBmb3IKLSAgICAgYSBzYW5lIHZlcnNpb24gbnVtYmVyIGFmdGVyIGRvaW5nIGJ5dGUgc3dhcHBpbmcgYXBwcm9wcmlhdGUgZm9yIHRoaXMKLSAgICAgWFZFQy4gIChIYWNrIGFsZXJ0ISkgKi8KLQotICBpZiAoaV9meGRoZHJwLT52ZXJzaW9uID4gMHhGRkZGKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBUaGVyZSdzIG5vIHN1cHBvcnRlZCB3YXkgdG8gY2hlY2sgZm9yIDMyIGJpdCB2ZXJzdXMgNjQgYml0IGFkZHJlc3NlcywKLSAgICAgc28gaWdub3JlIHRoaXMgZGlzdGluY3Rpb24gZm9yIG5vdy4gIChGSVhNRSkgKi8KLQotICAvKiBTd2FwIGluIHRoZSByZXN0IG9mIHRoZSByZXF1aXJlZCBoZWFkZXIuICAqLwotICBpZiAoIW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9pbiAoYWJmZCkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSBzZWN0aW9ucyBzdXBwbGllZCBieSBhbGwgTkxNJ3MsIGFuZCB0aGVuIHJlYWQgaW4gdGhlCi0gICAgIGF1eGlsaWFyeSBoZWFkZXJzLiAgUmVhZGluZyB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMgbWF5IGNyZWF0ZQotICAgICBhZGRpdGlvbmFsIHNlY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUgY3lnbnVzX2V4dCBoZWFkZXIuCi0gICAgIEZyb20gdGhpcyBwb2ludCBvbiB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFuIE5MTSwgYW5kIGRvIG5vdAotICAgICB0cmVhdCBlcnJvcnMgYXMgaW5kaWNhdGluZyB0aGUgd3JvbmcgZm9ybWF0LiAgKi8KLQotICBpZiAoIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0NPREVfTkFNRSwKLQkJCWlfZnhkaGRycC0+Y29kZUltYWdlT2Zmc2V0LAotCQkJaV9meGRoZHJwLT5jb2RlSW1hZ2VTaXplLAotCQkJKFNFQ19DT0RFIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgfCBTRUNfUkVMT0MpKQotICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSwKLQkJCSAgIGlfZnhkaGRycC0+ZGF0YUltYWdlT2Zmc2V0LAotCQkJICAgaV9meGRoZHJwLT5kYXRhSW1hZ2VTaXplLAotCQkJICAgKFNFQ19EQVRBIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgICAgfCBTRUNfUkVMT0MpKQotICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FLAotCQkJICAgKGZpbGVfcHRyKSAwLAotCQkJICAgaV9meGRoZHJwLT51bmluaXRpYWxpemVkRGF0YVNpemUsCi0JCQkgICBTRUNfQUxMT0MpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmICghbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlB1YmxpY3MgIT0gMAotICAgICAgfHwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIGFyY2ggPSBubG1fYXJjaGl0ZWN0dXJlIChhYmZkKTsKLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCAodW5zaWduZWQgbG9uZykgMCk7Ci0KLSAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVTdGFydE9mZnNldDsKLQotICByZXR1cm4gKGFiZmQtPnh2ZWMpOwotCi1nb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLWdvdF9ub19tYXRjaDoKLSAgbmxtX3RkYXRhIChhYmZkKSA9IHByZXNlcnZlZF90ZGF0YTsKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEpOwotICBpZiAoeF9meGRoZHIgIT0gTlVMTCkKLSAgICBmcmVlICh4X2Z4ZGhkcik7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qIEFkZCBhIHNlY3Rpb24gdG8gdGhlIGJmZC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgbmFtZSwgb2Zmc2V0LCBzaXplLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICB9Ci0gIG5ld3NlY3QtPnZtYSA9IDA7CQkvKiBOTE0ncyBhcmUgcmVsb2NhdGFibGUuICovCi0gIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IHNpemU7Ci0gIG5ld3NlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7Ci0gIG5ld3NlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IGJmZF9sb2cyICgwKTsJLyogRklYTUUgKi8KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCBpbiB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlci4gIEFsbCB0aGUgZmllbGRzIG11c3QKLSAgIGV4aXN0IGluIHRoZSBOTE0sIGFuZCBtdXN0IGV4aXN0IGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWFkIGhlcmUuICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uVGV4dCwKLQkJbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHN0YWNrU2l6ZSBmaWVsZC4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zdGFja1NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRlbXApOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHJlc2VydmVkIGZpZWxkLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnJlc2VydmVkID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLQotICAvKiBSZWFkIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBSZWFkIHRoZSBzY3JlZW4gbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgsCi0JCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWUsCi0JCW5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogUmVhZCB0aGUgdGhyZWFkIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAotCQlubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEsCi0JCTEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBTd2FwIGFuZCB3cml0ZSBvdXQgdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIuICBBbGwgdGhlIGZpZWxkcyBtdXN0Ci0gICBleGlzdCBpbiB0aGUgTkxNLCBhbmQgbXVzdCBleGlzdCBpbiB0aGlzIG9yZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBXcml0ZSB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25UZXh0LAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBDb252ZXJ0IGFuZCB3cml0ZSB0aGUgc3RhY2tTaXplIGZpZWxkLiAqLwotCi0gIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnN0YWNrU2l6ZSwKLQkgICAgKGJmZF9ieXRlICopIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIENvbnZlcnQgYW5kIHdyaXRlIHRoZSByZXNlcnZlZCBmaWVsZC4gKi8KLQotICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZCwKLQkgICAgKGJmZF9ieXRlICopIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBXcml0ZSB0aGUgc2NyZWVuIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCwKLQkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZSwKLQkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSB0aHJlYWQgbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJlYWQgYW5kIHN3YXAgaW4gdGhlIGNvbnRlbnRzIG9mIGFsbCB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMuICBCZWNhdXNlIG9mCi0gICB0aGUgYnJhaW5kZWFkIGRlc2lnbiwgd2UgaGF2ZSB0byBkbyBzdHJjbXBzIG9uIHN0cmluZ3Mgb2YgaW5kZXRlcm1pbmF0ZQotICAgbGVuZ3RoIHRvIGZpZ3VyZSBvdXQgd2hhdCBlYWNoIGF1eGlsaWFyeSBoZWFkZXIgaXMuICBFdmVuIHdvcnNlLCB3ZSBoYXZlCi0gICBubyB3YXkgb2Yga25vd2luZyBob3cgbWFueSBhdXhpbGlhcnkgaGVhZGVycyB0aGVyZSBhcmUgb3Igd2hlcmUgdGhlIGVuZAotICAgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzIGFyZSwgZXhjZXB0IGJ5IGZpbmRpbmcgc29tZXRoaW5nIHRoYXQgZG9lc24ndAotICAgbG9vayBsaWtlIGEga25vd24gYXV4aWxpYXJ5IGhlYWRlci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlyc3QgbmV3IHR5cGUKLSAgIG9mIGF1eGlsaWFyeSBoZWFkZXIgYWRkZWQgd2lsbCBicmVhayBhbGwgZXhpc3RpbmcgdG9vbHMgdGhhdCBkb24ndAotICAgcmVjb2duaXplIGl0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciB0ZW1wc3RyWzE2XTsKLSAgbG9uZyBwb3NpdGlvbjsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHBvc2l0aW9uID0gYmZkX3RlbGwgKGFiZmQpOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wc3RyLCBzaXplb2YgKHRlbXBzdHIpLCAxLCBhYmZkKSAhPQotCSAgc2l6ZW9mICh0ZW1wc3RyKSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcG9zaXRpb24sIFNFRUtfU0VUKSA9PSAtMSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiVmVSc0lvTiMiLCA4KSA9PSAwKQotCXsKLQkgIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlciB0aGRyOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgbWVtY3B5IChubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tYWpvclZlcnNpb24pOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1pbm9yVmVyc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXZpc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnllYXIpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubW9udGgpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRheSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIk1lU3NBZ0VzIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICBtZW1jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlEID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmxhbmd1YWdlSUQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc09mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZENvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucHJvZHVjdElEKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQwKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQxKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQyKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQzKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ1KTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiQ29QeVJpR2hUPSIsIDEwKSA9PSAwKQotCXsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwKLQkJCXNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCksCi0JCQkxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCkpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIChubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCkKLQkJCQkgLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoKSwKLQkJCTEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgLyogVGhlIGNvcHlyaWdodCBtZXNzYWdlIGlzIGEgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4gKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlLAotCQkgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKLQkJCTEsIGFiZmQpICE9Ci0JICAgICAgKChiZmRfc2l6ZV90eXBlKQotCSAgICAgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIkN1U3RIZUFkIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlciB0aGRyOwotCSAgYmZkX3NpemVfdHlwZSBoZHJMZW5ndGg7Ci0JICBmaWxlX3B0ciBkYXRhT2Zmc2V0OwotCSAgYmZkX3NpemVfdHlwZSBkYXRhTGVuZ3RoOwotCSAgY2hhciBkYXRhU3RhbXBbOF07Ci0JICBQVFIgaGRyOwotCi0JICAvKiBSZWFkIHRoZSBzdGFtcCAoIkN1U3RIZUFkIikuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLnN0YW1wLCAxLCBzaXplb2YgKHRoZHIuc3RhbXApLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkci5zdGFtcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGlzIGN1c3RvbSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLmxlbmd0aCwgMSwgc2l6ZW9mICh0aGRyLmxlbmd0aCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mICh0aGRyLmxlbmd0aCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGhkckxlbmd0aCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5sZW5ndGgpOwotCSAgLyogUmVhZCBmdXJ0aGVyIGZpZWxkcyBpZiB3ZSBoYXZlIHRoZW0uICAqLwotCSAgaWYgKGhkckxlbmd0aCA8IE5MTV9UQVJHRVRfTE9OR19TSVpFKQotCSAgICBkYXRhT2Zmc2V0ID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhT2Zmc2V0LCAxLAotCQkJICAgIHNpemVvZiAodGhkci5kYXRhT2Zmc2V0KSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHRoZHIuZGF0YU9mZnNldCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkYXRhT2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFPZmZzZXQpOwotCSAgICB9Ci0JICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFKQotCSAgICBkYXRhTGVuZ3RoID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhTGVuZ3RoLCAxLAotCQkJICAgIHNpemVvZiAodGhkci5kYXRhTGVuZ3RoKSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHRoZHIuZGF0YUxlbmd0aCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkYXRhTGVuZ3RoID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFMZW5ndGgpOwotCSAgICB9Ci0JICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKLQkgICAgbWVtc2V0IChkYXRhU3RhbXAsIDAsIHNpemVvZiAoZGF0YVN0YW1wKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGRhdGFTdGFtcCwgMSwgc2l6ZW9mIChkYXRhU3RhbXApLCBhYmZkKQotCQkgICE9IHNpemVvZiAoZGF0YVN0YW1wKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwgaWYgYW55LiAgKi8KLQkgIGlmIChoZHJMZW5ndGggPD0gMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKLQkgICAgewotCSAgICAgIGhkciA9IE5VTEw7Ci0JICAgICAgaGRyTGVuZ3RoID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaGRyTGVuZ3RoIC09IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDg7Ci0JICAgICAgaGRyID0gYmZkX2FsbG9jIChhYmZkLCBoZHJMZW5ndGgpOwotCSAgICAgIGlmIChoZHIgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCBoZHJMZW5ndGgsIGFiZmQpICE9IGhkckxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgZm91bmQgYSBDeWdudXMgaGVhZGVyLCBwcm9jZXNzIGl0LiAgT3RoZXJ3aXNlLAotCSAgICAganVzdCBzYXZlIHRoZSBhc3NvY2lhdGVkIGRhdGEgd2l0aG91dCB0cnlpbmcgdG8gaW50ZXJwcmV0Ci0JICAgICBpdC4gICovCi0JICBpZiAoc3RybmNtcCAoZGF0YVN0YW1wLCAiQ3lHblVzRXgiLCA4KSA9PSAwKQotCSAgICB7Ci0JICAgICAgZmlsZV9wdHIgcG9zOwotCSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQkgICAgICBiZmRfYnl0ZSAqcCwgKnBlbmQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChoZHJMZW5ndGggPT0gMCAmJiBoZHIgPT0gTlVMTCk7Ci0KLQkgICAgICBwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhT2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YUxlbmd0aCk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3JlYWQgKGNvbnRlbnRzLCAxLCBkYXRhTGVuZ3RoLCBhYmZkKSAhPSBkYXRhTGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBwb3MsIFNFRUtfU0VUKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBtZW1jcHkgKG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCksICJDeUduVXNFeCIsIDgpOwotCSAgICAgIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPm9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0JICAgICAgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoID0gZGF0YUxlbmd0aDsKLQotCSAgICAgIC8qIFRoaXMgZGF0YSB0aGlzIGhlYWRlciBwb2ludHMgdG8gcHJvdmlkZXMgYSBsaXN0IG9mCi0JCSB0aGUgc2VjdGlvbnMgd2hpY2ggd2VyZSBpbiB0aGUgb3JpZ2luYWwgb2JqZWN0IGZpbGUKLQkJIHdoaWNoIHdhcyBjb252ZXJ0ZWQgdG8gYmVjb21lIGFuIE5MTS4gIFdlIGxvY2F0ZQotCQkgdGhvc2Ugc2VjdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBCRkQuICBOb3RlIHRoYXQKLQkJIHRoaXMgaXMgbGlrZWx5IHRvIGNyZWF0ZSBhIHNlY29uZCAudGV4dCwgLmRhdGEgYW5kCi0JCSAuYnNzIHNlY3Rpb247IHJldHJpZXZpbmcgdGhlIHNlY3Rpb25zIGJ5IG5hbWUgd2lsbAotCQkgZ2V0IHRoZSBhY3R1YWwgTkxNIHNlY3Rpb25zLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgdG8KLQkJIGhhcHBlbi4gIFRoZSBzZWN0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCB3aGljaAotCQkgbWF5IGJlIHN1YnNldHMgb2YgdGhlIE5MTSBzZWN0aW9uLCBjYW4gb25seSBiZSBmb3VuZAotCQkgdXNpbmcgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQkgICAgICBwID0gY29udGVudHM7Ci0JICAgICAgcGVuZCA9IHAgKyBkYXRhTGVuZ3RoOwotCSAgICAgIHdoaWxlIChwIDwgcGVuZCkKLQkJewotCQkgIGNoYXIgKm5hbWU7Ci0JCSAgc2l6ZV90IGw7Ci0JCSAgZmlsZV9wdHIgZmlsZXBvczsKLQkJICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JCSAgYXNlY3Rpb24gKm5ld3NlYzsKLQotCQkgIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcwotCQkgICAgIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIG5hbWUKLQkJICAgICB6ZXJvZXMgdG8gYWRqdXN0IHRvIDQgYnl0ZSBib3VuZGFyeQotCQkgICAgIDQgYnl0ZSBzZWN0aW9uIGRhdGEgZmlsZSBwb2ludGVyCi0JCSAgICAgNCBieXRlIHNlY3Rpb24gc2l6ZQotCQkgICAgICovCi0KLQkJICBuYW1lID0gKGNoYXIgKikgcDsKLQkJICBsID0gc3RybGVuIChuYW1lKSArIDE7Ci0JCSAgbCA9IChsICsgMykgJn4gMzsKLQkJICBwICs9IGw7Ci0JCSAgZmlsZXBvcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcCk7Ci0JCSAgcCArPSA0OwotCQkgIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCQkgIHAgKz0gNDsKLQotCQkgIG5ld3NlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLQkJICBpZiAobmV3c2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIG5ld3NlYy0+X3Jhd19zaXplID0gc2l6ZTsKLQkJICBpZiAoZmlsZXBvcyAhPSAwKQotCQkgICAgewotCQkgICAgICBuZXdzZWMtPmZpbGVwb3MgPSBmaWxlcG9zOwotCQkgICAgICBuZXdzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPnN0YW1wLCB0aGRyLnN0YW1wLAotCQkgICAgICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCA9IGhkckxlbmd0aDsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQgPSBkYXRhT2Zmc2V0OwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGg7Ci0JICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwgZGF0YVN0YW1wLAotCQkgICAgICBzaXplb2YgKGRhdGFTdGFtcCkpOwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyID0gaGRyOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGEgbm9uLXplcm8gYnl0ZSBpbiBhIG1lbW9yeSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1maW5kX25vbnplcm8gKGJ1Ziwgc2l6ZSkKLSAgICAgUFRSIGJ1ZjsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIGNoYXIgKnAgPSAoY2hhciAqKSBidWY7Ci0KLSAgd2hpbGUgKHNpemUtLSAhPSAwKQotICAgIGlmICgqcCsrICE9IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTd2FwIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzLiAgV2UgY3JlYXRlIHRob3NlCi0gICBhdXhpbGlhcnkgaGVhZGVycyB3aGljaCBoYXZlIGJlZW4gc2V0IG5vbi16ZXJvLiAgV2UgZG8gbm90IHJlcXVpcmUKLSAgIHRoZSBjYWxsZXIgdG8gc2V0IHVwIHRoZSBzdGFtcCBmaWVsZHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIFdyaXRlIG91dCB0aGUgdmVyc2lvbiBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIlZlUnNJb04jIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIubWFqb3JWZXJzaW9uKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgdGhkci5taW5vclZlcnNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIucmV2aXNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyLAotCQkoYmZkX2J5dGUgKikgdGhkci55ZWFyKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1vbnRoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5LAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlbmRlZCBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKSkKLSAgICB7Ci0gICAgICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlELAotCQkoYmZkX2J5dGUgKikgdGhkci5sYW5ndWFnZUlEKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnByb2R1Y3RJRCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMSk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMyk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIC8qIFdyaXRlIG91dCB0aGUgY29weXJpZ2h0IGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ29QeVJpR2hUPSIsIDEwKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRoZHIuc3RhbXAsIHNpemVvZiAodGhkci5zdGFtcCksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHRoZHIuc3RhbXApKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHRoZHIuY29weXJpZ2h0TWVzc2FnZUxlbmd0aFswXSA9Ci0JbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGhkci5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFRoZSBjb3B5cmlnaHQgbWVzc2FnZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2UsCi0JCSAgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKLQkJICAgICAxLCBhYmZkKSAhPQotCSAgKChiZmRfc2l6ZV90eXBlKQotCSAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBjdXN0b20gaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLSAgICAgIGJvb2xlYW4gZHM7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKLQotICAgICAgZHMgPSBmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wLAotCQkJIHNpemVvZiAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXApKTsKLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkN1U3RIZUFkIiwgOCk7Ci0gICAgICBoZHJMZW5ndGggPSAoMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgKGRzID8gOCA6IDApCi0JCSAgICsgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIGhkckxlbmd0aCwgdGhkci5sZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQsCi0JCXRoZHIuZGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCwKLQkJdGhkci5kYXRhTGVuZ3RoKTsKLSAgICAgIGlmICghIGRzKQotCXsKLQkgIEJGRF9BU1NFUlQgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoID09IDApOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIDEsCi0JCQkgc2l6ZW9mICh0aGRyKSAtIHNpemVvZiAodGhkci5kYXRhU3RhbXApLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkcikgLSBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKHRoZHIuZGF0YVN0YW1wLCBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGJmZF93cml0ZSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHIsIDEsCi0JCQkgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgsIGFiZmQpCi0JICAgICAgIT0gbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgQ3lnbnVzIGRlYnVnZ2luZyBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ3VTdEhlQWQiLCA4KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCwKLQkJKGJmZF9ieXRlICopIHRoZHIubGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+b2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhTGVuZ3RoKTsKLSAgICAgIG1lbWNweSAodGhkci5kYXRhU3RhbXAsICJDeUduVXNFeCIsIDgpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgcmVhZCB0aGUgTkxNJ3MgcHVibGljIHN5bWJvbHMgYW5kIHVzZSBpdCB0byBnZW5lcmF0ZSBhIGJmZCBzeW1ib2wKLSAgIHRhYmxlIChoZXksIGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZykgb24gYSBvbmUtZm9yLW9uZSBiYXNpcy4gIFRodXMKLSAgIHVzZSB0aGUgbnVtYmVyIG9mIHB1YmxpYyBzeW1ib2xzIGFzIHRoZSBudW1iZXIgb2YgYmZkIHN5bWJvbHMgd2Ugd2lsbAotICAgaGF2ZSBvbmNlIHdlIGFjdHVhbGx5IGdldCBhcm91bmQgdG8gcmVhZGluZyB0aGVtIGluLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLCBiYXNlZCBvbgotICAgdGhlIGNvdW50IHBsdXMgMSwgc2luY2Ugd2Ugd2lsbCBOVUxMIHRlcm1pbmF0ZSB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZAotICAgb24gdGhpcyBzaXplLiAqLwotCi1sb25nCi1ubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CS8qIE5sbSBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplID0gMDsKLQotICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKLSAgc3ltY291bnQgPSAoaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3MKLQkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMKLQkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCArIDEpICogKHNpemVvZiAoYXN5bWJvbCkpOwotICByZXR1cm4gKHN5bXRhYl9zaXplKTsKLX0KLQotLyogTm90ZSB0aGF0IGJmZF9nZXRfc3ltY291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIGlmIHNsdXJwaW5nIHRoZQotICAgc3ltYm9sIHRhYmxlIGZhaWxzLiAqLwotCi1sb25nCi1ubG1fZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIG5sbV9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLSAgYmZkX3NpemVfdHlwZSBjb3VudGVyID0gMDsKLQotICBpZiAobmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIC0xOwotICBzeW1iYXNlID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgd2hpbGUgKGNvdW50ZXIgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICAqYWxvY2F0aW9uKysgPSAmc3ltYmFzZS0+c3ltYm9sOwotICAgICAgc3ltYmFzZSsrOwotICAgICAgY291bnRlcisrOwotICAgIH0KLSAgKmFsb2NhdGlvbiA9IChhc3ltYm9sICopIE5VTEw7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogTWFrZSBhbiBOTE0gc3ltYm9sLiAgVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuICAqLwotCi1hc3ltYm9sICoKLW5sbV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBubG1fc3ltYm9sX3R5cGUgKm5ldzsKLQotICBuZXcgPSAobmxtX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAobmxtX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIEdldCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi12b2lkCi1ubG1fZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLyogUHJpbnQgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQotdm9pZAotbmxtX3ByaW50X3N5bWJvbCAoYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBpZiAoc3ltYm9sLT5uYW1lKQotCWZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJS01cyIsIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0gICAgICBpZiAoc3ltYm9sLT5uYW1lKQotCWZwcmludGYgKGZpbGUsICIgJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBTbHVycCBpbiBubG0gc3ltYm9sIHRhYmxlLgotCi0gICBJbiB0aGUgZXh0ZXJuYWwgKGluLWZpbGUpIGZvcm0sIE5MTSBleHBvcnQgcmVjb3JkcyBhcmUgdmFyaWFibGUgbGVuZ3RoLAotICAgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLQkxIGJ5dGUJCWxlbmd0aCBvZiB0aGUgc3ltYm9sIG5hbWUgKE4pCi0JTiBieXRlcwkJdGhlIHN5bWJvbCBuYW1lCi0JNCBieXRlcwkJdGhlIHN5bWJvbCBvZmZzZXQgZnJvbSBzdGFydCBvZiBpdCdzIHNlY3Rpb24KLQotICAgV2UgYWxzbyByZWFkIGluIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyBhbmQgaW1wb3J0IHJlY29yZHMuICBJbXBvcnQKLSAgIHJlY29yZHMgYXJlIHRyZWF0ZWQgYXMgdW5kZWZpbmVkIHN5bWJvbHMuICBBcyB3ZSByZWFkIHRoZSBpbXBvcnQKLSAgIHJlY29yZHMgd2UgYWxzbyByZWFkIGluIHRoZSBhc3NvY2lhdGVkIHJlbG9jIGluZm9ybWF0aW9uLCB3aGljaCBpcwotICAgYXR0YWNoZWQgdG8gdGhlIHN5bWJvbC4KLQotICAgVGhlIGJmZCBzeW1ib2xzIGFyZSBjb3BpZWQgdG8gU1lNUFRSUy4KLQotICAgV2hlbiB3ZSByZXR1cm4sIHRoZSBiZmQgc3ltY291bnQgaXMgZWl0aGVyIHplcm8gb3IgY29udGFpbnMgdGhlIGNvcnJlY3QKLSAgIG51bWJlciBvZiBzeW1ib2xzLgotKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqaV9meGRoZHJwOwkvKiBObG0gZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgYmZkX3NpemVfdHlwZSB0b3RzeW1jb3VudDsJLyogTnVtYmVyIG9mIE5MTSBzeW1ib2xzICovCi0gIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7CS8qIENvdW50ZXIgb2YgTkxNIHN5bWJvbHMgKi8KLSAgbmxtX3N5bWJvbF90eXBlICpzeW07CQkvKiBQb2ludGVyIHRvIGN1cnJlbnQgYmZkIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJLyogU3ltYm9sIGxlbmd0aCByZWFkIGludG8gaGVyZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bXR5cGU7CS8qIFR5cGUgb2YgZGVidWdnaW5nIHN5bWJvbCAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogU3ltYm9sIG9mZnNldHMgcmVhZCBpbnRvIGhlcmUgKi8KLSAgYm9vbGVhbiAoKnJlYWRfaW1wb3J0X2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBubG1fc3ltYm9sX3R5cGUgKikpOwotICBib29sZWFuICgqc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBubG1fc3ltYm9sX3R5cGUgKikpOwotCi0gIGlmIChubG1fZ2V0X3N5bWJvbHMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuICh0cnVlKTsKLQotICAvKiBSZWFkIGVhY2ggcmF3IE5MTSBzeW1ib2wsIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBjcmVhdGUgYSBjYW5vbmljYWwgYmZkCi0gICAgIHN5bWJvbCB0YWJsZSBlbnRyeS4KLQotICAgICBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgdGhlIGluaXRpYWwgYmZkIGNhbm9uaWNhbCBzeW1ib2wgYnVmZmVyIGJhc2VkIG9uIGEKLSAgICAgb25lLXRvLW9uZSBtYXBwaW5nIG9mIHRoZSBOTE0gc3ltYm9scyB0byBjYW5vbmljYWwgc3ltYm9scy4gIFdlIGFjdHVhbGx5Ci0gICAgIHVzZSBhbGwgdGhlIE5MTSBzeW1ib2xzLCBzbyB0aGVyZSB3aWxsIGJlIG5vIHNwYWNlIGxlZnQgb3ZlciBhdCB0aGUgZW5kLgotICAgICBXaGVuIHdlIGhhdmUgYWxsIHRoZSBzeW1ib2xzLCB3ZSBidWlsZCB0aGUgY2FsbGVyJ3MgcG9pbnRlciB2ZWN0b3IuICovCi0KLSAgYWJmZC0+c3ltY291bnQgPSAwOwotICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKLSAgdG90c3ltY291bnQgPSAoaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3MKLQkJICsgaV9meGRoZHJwLT5udW1iZXJPZkRlYnVnUmVjb3JkcwotCQkgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzKTsKLSAgaWYgKHRvdHN5bWNvdW50ID09IDApCi0gICAgewotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX2Z4ZGhkcnAtPnB1YmxpY3NPZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICBzeW0gPSAoKG5sbV9zeW1ib2xfdHlwZSAqKQotCSBiZmRfemFsbG9jIChhYmZkLCB0b3RzeW1jb3VudCAqIHNpemVvZiAobmxtX3N5bWJvbF90eXBlKSkpOwotICBpZiAoIXN5bSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5sbV9zZXRfc3ltYm9scyAoYWJmZCwgc3ltKTsKLQotICAvKiBXZSB1c2UgdGhlIGJmZCdzIHN5bWNvdW50IGRpcmVjdGx5IGFzIHRoZSBjb250cm9sIGNvdW50LCBzbyB0aGF0IGVhcmx5Ci0gICAgIHRlcm1pbmF0aW9uIG9mIHRoZSBsb29wIGxlYXZlcyB0aGUgc3ltY291bnQgY29ycmVjdCBmb3IgdGhlIHN5bWJvbHMgdGhhdAotICAgICB3ZXJlIHJlYWQuICovCi0KLSAgc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMgPSBubG1fc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMgKGFiZmQpOwotICBzeW1jb3VudCA9IGlfZnhkaGRycC0+bnVtYmVyT2ZQdWJsaWNzOwotICB3aGlsZSAoYWJmZC0+c3ltY291bnQgPCBzeW1jb3VudCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgICAgIHN5bS0+c3ltYm9sLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICAgICAgaWYgKCFzeW0tPnN5bWJvbC5uYW1lKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgc3ltLT5zeW1ib2wubmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKQotCSAgIT0gc3ltbGVuZ3RoKQotCXJldHVybiAoZmFsc2UpOwotICAgICAgLyogQ2FzdCBhd2F5IGNvbnN0LiAgKi8KLSAgICAgICgoY2hhciAqKSAoc3ltLT5zeW1ib2wubmFtZSkpW3N5bWxlbmd0aF0gPSAnXDAnOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotCXJldHVybiAoZmFsc2UpOwotICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVDsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlID0gZ2V0X3dvcmQgKGFiZmQsIHRlbXApOwotICAgICAgaWYgKHNldF9wdWJsaWNfc2VjdGlvbl9mdW5jKQotCXsKLQkgIC8qIE1vc3QgYmFja2VuZHMgY2FuIHVzZSB0aGUgY29kZSBiZWxvdywgYnV0IHVuZm9ydHVuYXRlbHkKLQkgICAgIHNvbWUgdXNlIGEgZGlmZmVyZW50IHNjaGVtZS4gICovCi0JICBpZiAoKCpzZXRfcHVibGljX3NlY3Rpb25fZnVuYykgKGFiZmQsIHN5bSkgPT0gZmFsc2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN5bS0+c3ltYm9sLnZhbHVlICYgTkxNX0hJQklUKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfk5MTV9ISUJJVDsKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQkgICAgfQotCX0KLSAgICAgIHN5bS0+cmNudCA9IDA7Ci0gICAgICBhYmZkLT5zeW1jb3VudCsrOwotICAgICAgc3ltKys7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGRlYnVnZ2luZyByZWNvcmRzLiAgKi8KLQotICBpZiAoaV9meGRoZHJwLT5udW1iZXJPZkRlYnVnUmVjb3JkcyA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX2Z4ZGhkcnAtPmRlYnVnSW5mb09mZnNldCwgU0VFS19TRVQpID09IC0xKQotCXJldHVybiAoZmFsc2UpOwotCi0gICAgICBzeW1jb3VudCArPSBpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzOwotICAgICAgd2hpbGUgKGFiZmQtPnN5bWNvdW50IDwgc3ltY291bnQpCi0JewotCSAgaWYgKChiZmRfcmVhZCAoKFBUUikgJiBzeW10eXBlLCBzaXplb2YgKHN5bXR5cGUpLCAxLCBhYmZkKQotCSAgICAgICAhPSBzaXplb2YgKHN5bXR5cGUpKQotCSAgIHx8IGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApCi0JICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSAmIHN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotCQkgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCSAgc3ltLT5zeW1ib2wubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0JICBpZiAoIXN5bS0+c3ltYm9sLm5hbWUpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgc3ltLT5zeW1ib2wubmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKQotCSAgICAgICE9IHN5bWxlbmd0aCkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICAvKiBDYXN0IGF3YXkgY29uc3QuICAqLwotCSAgKChjaGFyICopIChzeW0tPnN5bWJvbC5uYW1lKSlbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0JICBzeW0tPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlID0gZ2V0X3dvcmQgKGFiZmQsIHRlbXApOwotCSAgaWYgKHN5bXR5cGUgPT0gMCkKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN5bXR5cGUgPT0gMSkKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgfQotCSAgc3ltLT5yY250ID0gMDsKLQkgIGFiZmQtPnN5bWNvdW50Kys7Ci0JICBzeW0rKzsKLQl9Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIGltcG9ydCByZWNvcmRzLiAgV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB3ZSBrbm93IGhvdwotICAgICB0byByZWFkIHJlbG9jcyBmb3IgdGhpcyB0YXJnZXQuICAqLwotCi0gIHJlYWRfaW1wb3J0X2Z1bmMgPSBubG1fcmVhZF9pbXBvcnRfZnVuYyAoYWJmZCk7Ci0gIGlmIChyZWFkX2ltcG9ydF9mdW5jICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX2Z4ZGhkcnAtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCwgU0VFS19TRVQpCi0JICA9PSAtMSkKLQlyZXR1cm4gKGZhbHNlKTsKLQotICAgICAgc3ltY291bnQgKz0gaV9meGRoZHJwLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlczsKLSAgICAgIHdoaWxlIChhYmZkLT5zeW1jb3VudCA8IHN5bWNvdW50KQotCXsKLQkgIGlmICgoKnJlYWRfaW1wb3J0X2Z1bmMpIChhYmZkLCBzeW0pID09IGZhbHNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzeW0rKzsKLQkgIGFiZmQtPnN5bWNvdW50Kys7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKHRydWUpOwotfQotDAotLyogR2V0IHRoZSByZWxvY3MgZm9yIGFuIE5MTSBmaWxlLiAgVGhlcmUgYXJlIHR3byB0eXBlcyBvZiByZWxvY3MuCi0gICBJbXBvcnRzIGFyZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gb3RoZXIgTkxNIGZpbGVzLiAgV2UKLSAgIHRyZWF0IHRoZXNlIGFzIHJlbG9jcyBhZ2FpbnN0IGdsb2JhbCBzeW1ib2xzLiAgUmVsb2NhdGlvbiBmaXh1cHMKLSAgIGFyZSBpbnRlcm5hbCByZWxvY3MuCi0KLSAgIFRoZSBhY3R1YWwgZm9ybWF0IHVzZWQgdG8gc3RvcmUgdGhlIHJlbG9jcyBpcyBtYWNoaW5lIHNwZWNpZmljLiAgKi8KLQotLyogUmVhZCBpbiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgc3RvcmVkIGluCi0gICBubG1fcmVsb2NhdGlvbl9maXh1cHMsIGFuIGFycmF5IG9mIGFyZWxlbnQgc3RydWN0dXJlcywgYW5kCi0gICBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzLCBhbiBhcnJheSBvZiBzZWN0aW9uIHBvaW50ZXJzLiAgVGhlCi0gICBzZWN0aW9uIHBvaW50ZXJzIGFyZSBuZWVkZWQgYmVjYXVzZSB0aGUgcmVsb2NzIGFyZSBub3Qgc29ydGVkIGJ5Ci0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zbHVycF9yZWxvY19maXh1cHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYm9vbGVhbiAoKnJlYWRfZnVuYykgUEFSQU1TICgoYmZkICosIG5sbV9zeW1ib2xfdHlwZSAqLCBhc2VjdGlvbiAqKiwKLQkJCQlhcmVsZW50ICopKTsKLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgYXJlbGVudCAqcmVsczsKLSAgYXNlY3Rpb24gKipzZWNzOwotCi0gIGlmIChubG1fcmVsb2NhdGlvbl9maXh1cHMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJlYWRfZnVuYyA9IG5sbV9yZWFkX3JlbG9jX2Z1bmMgKGFiZmQpOwotICBpZiAocmVhZF9mdW5jID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY291bnQgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotICByZWxzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotICBzZWNzID0gKGFzZWN0aW9uICoqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGlmICgocmVscyA9PSBOVUxMIHx8IHNlY3MgPT0gTlVMTCkgJiYgY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCkgPSByZWxzOwotICBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzIChhYmZkKSA9IHNlY3M7Ci0KLSAgLyogV2UgaGF2ZSB0byByZWFkIHBpZWNlIGJ5IHBpZWNlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IGxhcmdlCi0gICAgIHRoZSBtYWNoaW5lIHNwZWNpZmljIHJlbG9jIGluZm9ybWF0aW9uIGlzLiAgKi8KLSAgd2hpbGUgKGNvdW50LS0gIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKCpyZWFkX2Z1bmMpIChhYmZkLCAobmxtX3N5bWJvbF90eXBlICopIE5VTEwsIHNlY3MsIHJlbHMpID09IGZhbHNlKQotCXsKLQkgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCkgPSBOVUxMOwotCSAgbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcyAoYWJmZCkgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrc2VjczsKLSAgICAgICsrcmVsczsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgbnVtYmVyIG9mIHJlbG9jcy4gIFRoaXMgcmVhbGx5IGp1c3QgcmV0dXJucyBhbiB1cHBlciBib3VuZCwKLSAgIHNpbmNlIGl0IGRvZXMgbm90IGF0dGVtcHQgdG8gZGlzdGluZ3Vpc2ggdGhlbSBiYXNlZCBvbiB0aGUgc2VjdGlvbi4KLSAgIFRoYXQgd2lsbCBiZSBoYW5kbGVkIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkgcmVhZC4gICovCi0KLWxvbmcKLW5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBubG1fc3ltYm9sX3R5cGUgKnN5bXM7Ci0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gIHVuc2lnbmVkIGludCByZXQ7Ci0KLSAgLyogSWYgd2UgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCByZWxvY3MsIGp1c3QgcmV0dXJuIDAuICAqLwotICBpZiAobmxtX3JlYWRfcmVsb2NfZnVuYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVpdGhlciB0aGUgY29kZSBvciB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiAoU0VDX0NPREUgfCBTRUNfREFUQSkpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3ltcyA9IG5sbV9nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKG5sbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotCXJldHVybiAtMTsKLSAgICAgIHN5bXMgPSBubG1fZ2V0X3N5bWJvbHMgKGFiZmQpOwotICAgIH0KLQotICByZXQgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotCi0gIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHdoaWxlIChjb3VudC0tICE9IDApCi0gICAgewotICAgICAgcmV0ICs9IHN5bXMtPnJjbnQ7Ci0gICAgICArK3N5bXM7Ci0gICAgfQotCi0gIHJldHVybiAocmV0ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIEdldCB0aGUgcmVsb2NzIHRoZW1zZWx2ZXMuICAqLwotCi1sb25nCi1ubG1fY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqcmVsczsKLSAgYXNlY3Rpb24gKipzZWNzOwotICBiZmRfc2l6ZV90eXBlIGNvdW50LCBpOwotICB1bnNpZ25lZCBpbnQgcmV0OwotCi0gIC8qIEdldCB0aGUgcmVsb2NhdGlvbiBmaXh1cHMuICAqLwotICByZWxzID0gbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKTsKLSAgaWYgKHJlbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyAoYWJmZCkgPT0gZmFsc2UpCi0JcmV0dXJuIC0xOwotICAgICAgcmVscyA9IG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCk7Ci0gICAgfQotICBzZWNzID0gbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcyAoYWJmZCk7Ci0KLSAgcmV0ID0gMDsKLSAgY291bnQgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcmVscysrLCBzZWNzKyspCi0gICAgewotICAgICAgaWYgKCpzZWNzID09IHNlYykKLQl7Ci0JICAqcmVscHRyKysgPSByZWxzOwotCSAgKytyZXQ7Ci0JfQotICAgIH0KLQotICAvKiBHZXQgdGhlIGltcG9ydCBzeW1ib2xzLiAgKi8KLSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bWJvbHMrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHN5bSA9ICpzeW1ib2xzOwotICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKHN5bSkgPT0gYmZkX3RhcmdldF9ubG1fZmxhdm91cikKLQl7Ci0JICBubG1fc3ltYm9sX3R5cGUgKm5sbV9zeW07Ci0JICBiZmRfc2l6ZV90eXBlIGo7Ci0KLQkgIG5sbV9zeW0gPSAobmxtX3N5bWJvbF90eXBlICopIHN5bTsKLQkgIGZvciAoaiA9IDA7IGogPCBubG1fc3ltLT5yY250OyBqKyspCi0JICAgIHsKLQkgICAgICBpZiAobmxtX3N5bS0+cmVsb2NzW2pdLnNlY3Rpb24gPT0gc2VjKQotCQl7Ci0JCSAgKnJlbHB0ciA9ICZubG1fc3ltLT5yZWxvY3Nbal0ucmVsb2M7Ci0JCSAgKCpyZWxwdHIpLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHM7Ci0JCSAgKytyZWxwdHI7Ci0JCSAgKytyZXQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgKnJlbHB0ciA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIENvbXB1dGUgdGhlIHNlY3Rpb24gZmlsZSBwb3NpdGlvbnMgZm9yIGFuIE5MTSBmaWxlLiAgQWxsIHZhcmlhYmxlCi0gICBsZW5ndGggZGF0YSBpbiB0aGUgZmlsZSBoZWFkZXJzIG11c3QgYmUgc2V0IGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzCi0gICBjYWxsZWQuICBJZiB0aGUgdmFyaWFibGUgbGVuZ3RoIGRhdGEgaXMgY2hhbmdlZCBsYXRlciwgdGhlCi0gICByZXN1bHRpbmcgb2JqZWN0IGZpbGUgd2lsbCBiZSBpbmNvcnJlY3QuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcwotICAgbm8gd2F5IHRvIGNoZWNrIHRoaXMuCi0KLSAgIFRoaXMgcm91dGluZSBhbHNvIHNldHMgdGhlIFNpemUgYW5kIE9mZnNldCBmaWVsZHMgaW4gdGhlIGZpeGVkCi0gICBoZWFkZXIuCi0KLSAgIEl0IGFsc28gbG9va3Mgb3ZlciB0aGUgc3ltYm9scyBhbmQgbW92ZXMgYW55IGNvbW1vbiBzeW1ib2xzIGludG8KLSAgIHRoZSAuYnNzIHNlY3Rpb247IE5MTSBoYXMgbm8gd2F5IHRvIHJlcHJlc2VudCBhIGNvbW1vbiBzeW1ib2wuCi0gICBUaGlzIGFwcHJvYWNoIG1lYW5zIHRoYXQgZWl0aGVyIHRoZSBzeW1ib2xzIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4KLSAgIHNldCBhdCB0aGlzIHBvaW50LCBvciB0aGVyZSBtdXN0IGJlIG5vIGNvbW1vbiBzeW1ib2xzLiAgV2UgbmVlZCB0bwotICAgbW92ZSB0aGUgc3ltYm9scyBhdCB0aGlzIHBvaW50IHNvIHRoYXQgbWFuZ2xlX3JlbG9jcyBjYW4gc2VlIHRoZQotICAgZmluYWwgdmFsdWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgc29mYXI7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgdGV4dCwgZGF0YSwgYnNzOwotICBiZmRfdm1hIHRleHRfbG93LCBkYXRhX2xvdzsKLSAgdW5zaWduZWQgaW50IHRleHRfYWxpZ24sIGRhdGFfYWxpZ24sIG90aGVyX2FsaWduOwotICBmaWxlX3B0ciB0ZXh0X3B0ciwgZGF0YV9wdHIsIG90aGVyX3B0cjsKLSAgYXNlY3Rpb24gKmJzc19zZWM7Ci0gIGFzeW1ib2wgKipzeW1fcHRyX3B0cjsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSB0cnVlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2VjdGlvbiB0byBob2xkIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0gIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKGJzc19zZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FLAotCQkJICAgIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpIDAsCi0JCQkgICAgU0VDX0FMTE9DKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gICAgfQotCi0gIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCi0gIC8qIFRoZSBmaXhlZCBoZWFkZXIuICAqLwotICBzb2ZhciA9IG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZSAoYWJmZCkgKyBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpOwotCi0gIC8qIFRoZSB2YXJpYWJsZSBoZWFkZXIuICAqLwotICBzb2ZhciArPSAoc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpCi0JICAgICsgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMQotCSAgICArIE5MTV9UQVJHRVRfTE9OR19TSVpFCS8qIHN0YWNrU2l6ZSAqLwotCSAgICArIE5MTV9UQVJHRVRfTE9OR19TSVpFCS8qIHJlc2VydmVkICovCi0JICAgICsgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSkKLQkgICAgKyBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKQotCSAgICArIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMQotCSAgICArIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpCi0JICAgICsgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKTsKLQotICAvKiBUaGUgYXV4aWxpYXJ5IGhlYWRlcnMuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSBzaXplb2YgKE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlcik7Ci0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKSkpCi0gICAgc29mYXIgKz0gc2l6ZW9mIChObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKTsKLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikpKQotICAgIHNvZmFyICs9IChzaXplb2YgKE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKQotCSAgICAgICsgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSk7Ci0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSAoc2l6ZW9mIChObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcikKLQkgICAgICArIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoKTsKLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSkpCi0gICAgc29mYXIgKz0gc2l6ZW9mIChObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcik7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucyBpbiB0d28gcGFzc2VzLiAgRmlyc3QgZ2V0IHRoZQotICAgICBzaXplcyBvZiB0aGUgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucywgYW5kIHRoZW4gc2V0IHRoZSBmaWxlCi0gICAgIHBvc2l0aW9ucy4gIFRoaXMgY29kZSBhbGlnbnMgdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHVzaW5nIHRoZQotICAgICBzYW1lIGFsaWdubWVudCByZXN0cmljdGlvbnMgdGhhdCBhcHBseSB0byB0aGUgc2VjdGlvbnMgaW4gbWVtb3J5OwotICAgICB0aGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5LiAgKi8KLSAgdGV4dCA9IDA7Ci0gIHRleHRfbG93ID0gKGJmZF92bWEpIC0gMTsKLSAgdGV4dF9hbGlnbiA9IDA7Ci0gIGRhdGEgPSAwOwotICBkYXRhX2xvdyA9IChiZmRfdm1hKSAtIDE7Ci0gIGRhdGFfYWxpZ24gPSAwOwotICBic3MgPSAwOwotICBvdGhlcl9hbGlnbiA9IDA7Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGY7Ci0KLSAgICAgIHNlYy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzZWMtPl9yYXdfc2l6ZSwgMSA8PCBzZWMtPmFsaWdubWVudF9wb3dlcik7Ci0KLSAgICAgIGYgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAoZiAmIFNFQ19DT0RFKQotCXsKLQkgIHRleHQgKz0gc2VjLT5fcmF3X3NpemU7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSA8IHRleHRfbG93KQotCSAgICB0ZXh0X2xvdyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JICBpZiAoc2VjLT5hbGlnbm1lbnRfcG93ZXIgPiB0ZXh0X2FsaWduKQotCSAgICB0ZXh0X2FsaWduID0gc2VjLT5hbGlnbm1lbnRfcG93ZXI7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19EQVRBKQotCXsKLQkgIGRhdGEgKz0gc2VjLT5fcmF3X3NpemU7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSA8IGRhdGFfbG93KQotCSAgICBkYXRhX2xvdyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JICBpZiAoc2VjLT5hbGlnbm1lbnRfcG93ZXIgPiBkYXRhX2FsaWduKQotCSAgICBkYXRhX2FsaWduID0gc2VjLT5hbGlnbm1lbnRfcG93ZXI7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JewotCSAgaWYgKHNlYy0+YWxpZ25tZW50X3Bvd2VyID4gb3RoZXJfYWxpZ24pCi0JICAgIG90aGVyX2FsaWduID0gc2VjLT5hbGlnbm1lbnRfcG93ZXI7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19BTExPQykKLQlic3MgKz0gc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotCi0gIG5sbV9zZXRfdGV4dF9sb3cgKGFiZmQsIHRleHRfbG93KTsKLSAgbmxtX3NldF9kYXRhX2xvdyAoYWJmZCwgZGF0YV9sb3cpOwotCi0gIGlmIChubG1fbm9fdW5pbml0aWFsaXplZF9kYXRhIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIE5ldFdhcmUgZm9ybWF0IGRvZXMgbm90IHVzZSB1bmluaXRpYWxpemVkIGRhdGEuICBXZSBtdXN0Ci0JIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBkYXRhIHNlY3Rpb24uICBXZSB3aWxsIG5ldmVyIHdpbmQgdXAKLQkgd3JpdGluZyB0aG9zZSBmaWxlIGxvY2F0aW9ucywgc28gdGhleSB3aWxsIHJlbWFpbiB6ZXJvLiAgKi8KLSAgICAgIGRhdGEgKz0gYnNzOwotICAgICAgYnNzID0gMDsKLSAgICB9Ci0KLSAgdGV4dF9wdHIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IHRleHRfYWxpZ24pOwotICBkYXRhX3B0ciA9IEJGRF9BTElHTiAodGV4dF9wdHIgKyB0ZXh0LCAxIDw8IGRhdGFfYWxpZ24pOwotICBvdGhlcl9wdHIgPSBCRkRfQUxJR04gKGRhdGFfcHRyICsgZGF0YSwgMSA8PCBvdGhlcl9hbGlnbik7Ci0KLSAgLyogRmlsbCBpbiBzb21lIGZpZWxkcyBpbiB0aGUgaGVhZGVyIGZvciB3aGljaCB3ZSBub3cgaGF2ZSB0aGUKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlT2Zmc2V0ID0gdGV4dF9wdHI7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VTaXplID0gdGV4dDsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZU9mZnNldCA9IGRhdGFfcHRyOwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlU2l6ZSA9IGRhdGE7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT51bmluaXRpYWxpemVkRGF0YVNpemUgPSBic3M7Ci0KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZjsKLQotICAgICAgZiA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLQotICAgICAgaWYgKGYgJiBTRUNfQ09ERSkKLQl7Ci0JICBzZWMtPmZpbGVwb3MgPSB0ZXh0X3B0cjsKLQkgIHRleHRfcHRyICs9IHNlYy0+X3Jhd19zaXplOwotCX0KLSAgICAgIGVsc2UgaWYgKGYgJiBTRUNfREFUQSkKLQl7Ci0JICBzZWMtPmZpbGVwb3MgPSBkYXRhX3B0cjsKLQkgIGRhdGFfcHRyICs9IHNlYy0+X3Jhd19zaXplOwotCX0KLSAgICAgIGVsc2UgaWYgKGYgJiBTRUNfSEFTX0NPTlRFTlRTKQotCXsKLQkgIHNlYy0+ZmlsZXBvcyA9IG90aGVyX3B0cjsKLQkgIG90aGVyX3B0ciArPSBzZWMtPl9yYXdfc2l6ZTsKLQl9Ci0gICAgfQotCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQgPSBvdGhlcl9wdHI7Ci0KLSAgLyogTW92ZSBhbGwgY29tbW9uIHN5bWJvbHMgaW50byB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLQotICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGlmIChzeW1fcHRyX3B0ciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipzeW1fZW5kOwotICAgICAgYmZkX3ZtYSBhZGQ7Ci0KLSAgICAgIHN5bV9lbmQgPSBzeW1fcHRyX3B0ciArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgICAgYWRkID0gMDsKLSAgICAgIGZvciAoOyBzeW1fcHRyX3B0ciA8IHN5bV9lbmQ7IHN5bV9wdHJfcHRyKyspCi0JewotCSAgYXN5bWJvbCAqc3ltOwotCSAgYmZkX3ZtYSBzaXplOwotCi0JICBzeW0gPSAqc3ltX3B0cl9wdHI7Ci0KLQkgIGlmICghYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogUHV0IHRoZSBjb21tb24gc3ltYm9sIGluIHRoZSAuYnNzIHNlY3Rpb24sIGFuZCBpbmNyZWFzZQotCSAgICAgdGhlIHNpemUgb2YgdGhlIC5ic3Mgc2VjdGlvbiBieSB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uCi0JICAgICBzeW1ib2wgKHdoaWNoIGlzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCkuICAqLwotCSAgc3ltLT5zZWN0aW9uID0gYnNzX3NlYzsKLQkgIHNpemUgPSBzeW0tPnZhbHVlOwotCSAgc3ltLT52YWx1ZSA9IGJzc19zZWMtPl9yYXdfc2l6ZSArIGFkZDsKLQkgIGFkZCArPSBzaXplOwotCSAgYWRkID0gQkZEX0FMSUdOIChhZGQsIDEgPDwgYnNzX3NlYy0+YWxpZ25tZW50X3Bvd2VyKTsKLQl9Ci0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgaWYgKG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgLyogV2UgY291bGQgaGFuZGxlIHRoaXMgY2FzZSwgYnV0IHNvIGZhciBpdCBoYXNuJ3QgYmVlbgotCQkgbmVjZXNzYXJ5LiAgKi8KLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSArPSBhZGQ7Ci0JICBic3Nfc2VjLT5fcmF3X3NpemUgKz0gYWRkOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVG8gZG8gdGhpcyB3ZSBuZWVkIHRvIGtub3cgd2hlcmUKLSAgIHRoZSBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIG91dHB1dCBmaWxlLiAgVGhhdCBtZWFucwotICAgdGhhdCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBzZWN0aW9ucyBtdXN0IGJlIHNldCwgYW5kIGFsbCB0aGUKLSAgIHZhcmlhYmxlIHNpemUgaGVhZGVyIGluZm9ybWF0aW9uIG11c3QgYmUga25vd24uICAqLwotCi1ib29sZWFuCi1ubG1fc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UKLSAgICAgICYmIG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBpMzg2IE5ldFdhcmUgaGFzIGEgdmVyeSByZXN0cmljdGVkIHNldCBvZiByZWxvY3MuICBJbiBvcmRlciBmb3IKLSAgICAgb2JqY29weSB0byB3b3JrLCB0aGUgTkxNIGkzODYgYmFja2VuZCBuZWVkcyBhIGNoYW5jZSB0byByZXdvcmsKLSAgICAgdGhlIHNlY3Rpb24gY29udGVudHMgc28gdGhhdCBpdHMgc2V0IG9mIHJlbG9jcyB3aWxsIHdvcmsuICBJZiBhbGwKLSAgICAgdGhlIHJlbG9jcyBhcmUgYWxyZWFkeSBhY2NlcHRhYmxlLCB0aGlzIHdpbGwgbm90IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0gICAgewotICAgICAgYm9vbGVhbiAoKm1hbmdsZV9yZWxvY3NfZnVuYykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwKLQkJCQkJICAgICBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgICAgIG1hbmdsZV9yZWxvY3NfZnVuYyA9IG5sbV9tYW5nbGVfcmVsb2NzX2Z1bmMgKGFiZmQpOwotICAgICAgaWYgKG1hbmdsZV9yZWxvY3NfZnVuYyAhPSBOVUxMKQotCXsKLQkgIGlmICghKCptYW5nbGVfcmVsb2NzX2Z1bmMpIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkgICAgICAoYmZkX3ZtYSkgb2Zmc2V0LCBjb3VudCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBuZWVkIHRvIHNvcnQgYSBsaXN0IG9mIHJlbG9jcyBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbnMgd2hlbiB3ZQotICAgd3JpdGUgb3V0IHRoZSBleHRlcm5hbCByZWxvY3MuICAqLwotCi1zdGF0aWMgaW50Ci1ubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSAocDEsIHAyKQotICAgICBjb25zdCB2b2lkICpwMTsKLSAgICAgY29uc3Qgdm9pZCAqcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZWxvY19hbmRfc2VjICpyMSA9IChjb25zdCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSBwMTsKLSAgY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnIyID0gKGNvbnN0IHN0cnVjdCByZWxvY19hbmRfc2VjICopIHAyOwotICBpbnQgY21wOwotCi0gIGNtcCA9IHN0cmNtcCAoKCpyMS0+cmVsLT5zeW1fcHRyX3B0ciktPm5hbWUsCi0JCSgqcjItPnJlbC0+c3ltX3B0cl9wdHIpLT5uYW1lKTsKLSAgaWYgKGNtcCAhPSAwKQotICAgIHJldHVybiBjbXA7Ci0KLSAgLyogV2Ugc29ydCBieSBhZGRyZXNzIHdpdGhpbiBzeW1ib2wgdG8gbWFrZSB0aGUgc29ydCBtb3JlIHN0YWJsZSBhbmQKLSAgICAgaW5jcmVhc2UgdGhlIGNoYW5jZXMgdGhhdCBkaWZmZXJlbnQgaG9zdHMgd2lsbCBnZW5lcmF0ZSBiaXQgZm9yCi0gICAgIGJpdCBlcXVpdmFsZW50IHJlc3VsdHMuICAqLwotICByZXR1cm4gKGludCkgKHIxLT5yZWwtPmFkZHJlc3MgLSByMi0+cmVsLT5hZGRyZXNzKTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIE5MTSBmaWxlLiAgV2Ugd3JpdGUgb3V0IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIG9yZGVyOgotICAgICBmaXhlZCBoZWFkZXIKLSAgICAgdmFyaWFibGUgaGVhZGVyCi0gICAgIGF1eGlsaWFyeSBoZWFkZXJzCi0gICAgIGNvZGUgc2VjdGlvbnMKLSAgICAgZGF0YSBzZWN0aW9ucwotICAgICBvdGhlciBzZWN0aW9ucyAoY3VzdG9tIGRhdGEsIG1lc3NhZ2VzLCBoZWxwLCBzaGFyZWQgTkxNLCBSUEMsCi0gICAgIAkJICAgICBtb2R1bGUgZGVwZW5kZW5jaWVzKQotICAgICByZWxvY2F0aW9uIGZpeHVwcwotICAgICBleHRlcm5hbCByZWZlcmVuY2VzIChpbXBvcnRzKQotICAgICBwdWJsaWMgc3ltYm9scyAoZXhwb3J0cykKLSAgICAgZGVidWdnaW5nIHJlY29yZHMKLSAgIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgb3JkZXIgdXNlZCBieSB0aGUgTmV0V2FyZSB0b29sczsgdGhlCi0gICBkaWZmZXJlbmNlIGlzIHRoYXQgTmV0V2FyZSBwdXRzIHRoZSBzZWN0aW9ucyBvdGhlciB0aGFuIGNvZGUsIGRhdGEKLSAgIGFuZCBjdXN0b20gZGF0YSBhdCB0aGUgZW5kIG9mIHRoZSBOTE0uICBJdCBpcyBjb252ZW5pZW50IGZvciB1cyB0bwotICAga25vdyB3aGVyZSB0aGUgc2VjdGlvbnMgYXJlIGdvaW5nIHRvIGJlIGJlZm9yZSB3b3JyeWluZyBhYm91dCB0aGUKLSAgIHNpemUgb2YgdGhlIG90aGVyIGluZm9ybWF0aW9uLgotCi0gICBCeSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYWxsIHRoZSBzZWN0aW9uIGRhdGEgc2hvdWxkCi0gICBoYXZlIGJlZW4gb3V0cHV0IHVzaW5nIHNldF9zZWN0aW9uX2NvbnRlbnRzLiAgTm90ZSB0aGF0IGN1c3RvbQotICAgZGF0YSwgdGhlIG1lc3NhZ2UgZmlsZSwgdGhlIGhlbHAgZmlsZSwgdGhlIHNoYXJlZCBOTE0gZmlsZSwgdGhlIFJQQwotICAgZGF0YSwgYW5kIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBhbGwgY29uc2lkZXJlZCB0byBiZQotICAgc2VjdGlvbnM7IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gdGhlIG9mZnNldCBhbmQKLSAgIGxlbmd0aCBmaWVsZHMgaW4gdGhlIE5MTSBoZWFkZXJzLiAgVGhlIHJlbG9jYXRpb24gZml4dXBzIGFuZAotICAgaW1wb3J0cyBhcmUgYm90aCBvYnRhaW5lZCBmcm9tIHRoZSBsaXN0IG9mIHJlbG9jcyBhdHRhY2hlZCB0byBlYWNoCi0gICBzZWN0aW9uLiAgVGhlIGV4cG9ydHMgYW5kIGRlYnVnZ2luZyByZWNvcmRzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZQotICAgbGlzdCBvZiBvdXRzeW1ib2xzLiAgKi8KLQotYm9vbGVhbgotbmxtX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqc2VjOwotICBib29sZWFuICgqd3JpdGVfaW1wb3J0X2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19jb3VudCwgaW50ZXJuYWxfcmVsb2NfY291bnQsIGksIGM7Ci0gIHN0cnVjdCByZWxvY19hbmRfc2VjICpleHRlcm5hbF9yZWxvY3M7Ci0gIGFzeW1ib2wgKipzeW1fcHRyX3B0cjsKLSAgZmlsZV9wdHIgbGFzdDsKLSAgYm9vbGVhbiAoKndyaXRlX3ByZWZpeF9mdW5jKSBQQVJBTVMgKChiZmQgKikpOwotICB1bnNpZ25lZCBjaGFyICpmaXhlZF9oZWFkZXIgPSBOVUxMOwotCi0gIGZpeGVkX2hlYWRlciA9ICgodW5zaWduZWQgY2hhciAqKQotCQkgIGJmZF9tYWxsb2MgKChzaXplX3QpIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCkpKTsKLSAgaWYgKGZpeGVkX2hlYWRlciA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlCi0gICAgICAmJiBubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSA9PSBmYWxzZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXJzLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCSAgICAgbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplIChhYmZkKSArIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCksCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAobmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX291dCAoYWJmZCkgPT0gZmFsc2UKLSAgICAgIHx8IG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCAoYWJmZCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBBIHdlYWsgY2hlY2sgb24gd2hldGhlciB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucyB3ZXJlCi0gICAgIHJlYXNvbmFibGUuICAqLwotICBpZiAoYmZkX3RlbGwgKGFiZmQpID4gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZU9mZnNldCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIEFkdmFuY2UgdG8gdGhlIHJlbG9jcy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIGZvcm1hdCBvZiB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGlzIGRlcGVuZGVudCB1cG9uIHRoZQotICAgICBwYXJ0aWN1bGFyIHRhcmdldC4gIFdlIHVzZSBhbiBleHRlcm5hbCByb3V0aW5lIHRvIHdyaXRlIHRoZSByZWxvYwotICAgICBvdXQuICAqLwotICB3cml0ZV9pbXBvcnRfZnVuYyA9IG5sbV93cml0ZV9pbXBvcnRfZnVuYyAoYWJmZCk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnRlcm5hbCByZWxvY2F0aW9uIGZpeHVwcy4gIFdoaWxlIHdlJ3JlIGxvb3BpbmcKLSAgICAgb3ZlciB0aGUgcmVsb2NzLCB3ZSBhbHNvIGNvdW50IHRoZSBleHRlcm5hbCByZWxvY3MsIHdoaWNoIGlzCi0gICAgIG5lZWRlZCB3aGVuIHRoZXkgYXJlIHdyaXR0ZW4gb3V0IGJlbG93LiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NfY291bnQgPSAwOwotICBleHRlcm5hbF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipyZWxfcHRyX3B0ciwgKipyZWxfZW5kOwotCi0gICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBjYW4gb25seSByZXByZXNlbnQgcmVsb2NzIHdpdGhpbiBhIGNvZGUgb3IgZGF0YQotCSBzZWN0aW9uLiAgV2UgaWdub3JlIHRoZW0gZm9yIGEgZGVidWdnaW5nIHNlY3Rpb24uICAqLwotICAgICAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiAoU0VDX0NPREUgfCBTRUNfREFUQSkpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8ga25vdyBob3cgdG8gd3JpdGUgb3V0IGltcG9ydHMgKi8KLSAgICAgIGlmICh3cml0ZV9pbXBvcnRfZnVuYyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIHJlbF9wdHJfcHRyID0gc2VjLT5vcmVsb2NhdGlvbjsKLSAgICAgIHJlbF9lbmQgPSByZWxfcHRyX3B0ciArIHNlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKDsgcmVsX3B0cl9wdHIgPCByZWxfZW5kOyByZWxfcHRyX3B0cisrKQotCXsKLQkgIGFyZWxlbnQgKnJlbDsKLQkgIGFzeW1ib2wgKnN5bTsKLQotCSAgcmVsID0gKnJlbF9wdHJfcHRyOwotCSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgewotCSAgICAgICsraW50ZXJuYWxfcmVsb2NfY291bnQ7Ci0JICAgICAgaWYgKCgqd3JpdGVfaW1wb3J0X2Z1bmMpIChhYmZkLCBzZWMsIHJlbCkgPT0gZmFsc2UpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgICsrZXh0ZXJuYWxfcmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyA9IGludGVybmFsX3JlbG9jX2NvdW50OwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW1wb3J0cyAocmVsb2NzIGFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scykuICBUaGVzZQotICAgICBhcmUgb3V0cHV0IGFzIGEgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgYWxsIHRoZSByZWxvY3MgZm9yIHRoYXQKLSAgICAgc3ltYm9sLCBzbyB3ZSBtdXN0IGZpcnN0IGdhdGhlciB0b2dldGhlciBhbGwgdGhlIHJlbG9jcyBhZ2FpbnN0Ci0gICAgIGV4dGVybmFsIHN5bWJvbHMgYW5kIHNvcnQgdGhlbS4gICovCi0gIGV4dGVybmFsX3JlbG9jcyA9Ci0gICAgKHN0cnVjdCByZWxvY19hbmRfc2VjICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJKGV4dGVybmFsX3JlbG9jX2NvdW50Ci0JCQkJCSAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2FuZF9zZWMpKSk7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gKHN0cnVjdCByZWxvY19hbmRfc2VjICopIE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGkgPSAwOwotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsX3B0cl9wdHIsICoqcmVsX2VuZDsKLQotICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsX3B0cl9wdHIgPSBzZWMtPm9yZWxvY2F0aW9uOwotICAgICAgcmVsX2VuZCA9IHJlbF9wdHJfcHRyICsgc2VjLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoOyByZWxfcHRyX3B0ciA8IHJlbF9lbmQ7IHJlbF9wdHJfcHRyKyspCi0JewotCSAgYXJlbGVudCAqcmVsOwotCSAgYXN5bWJvbCAqc3ltOwotCi0JICByZWwgPSAqcmVsX3B0cl9wdHI7Ci0JICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICBjb250aW51ZTsKLQotCSAgZXh0ZXJuYWxfcmVsb2NzW2ldLnJlbCA9IHJlbDsKLQkgIGV4dGVybmFsX3JlbG9jc1tpXS5zZWMgPSBzZWM7Ci0JICArK2k7Ci0JfQotICAgIH0KLQotICBCRkRfQVNTRVJUIChpID09IGV4dGVybmFsX3JlbG9jX2NvdW50KTsKLQotICAvKiBTb3J0IHRoZSBleHRlcm5hbCByZWxvY3MgYnkgbmFtZS4gICovCi0gIHFzb3J0ICgoUFRSKSBleHRlcm5hbF9yZWxvY3MsIChzaXplX3QpIGV4dGVybmFsX3JlbG9jX2NvdW50LAotCSBzaXplb2YgKHN0cnVjdCByZWxvY19hbmRfc2VjKSwgbmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgYyA9IDA7Ci0gIGkgPSAwOwotICB3aGlsZSAoaSA8IGV4dGVybmFsX3JlbG9jX2NvdW50KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaiwgY250OwotCi0gICAgICArK2M7Ci0KLSAgICAgIHJlbCA9IGV4dGVybmFsX3JlbG9jc1tpXS5yZWw7Ci0gICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAgICAgY250ID0gMDsKLSAgICAgIGZvciAoaiA9IGk7Ci0JICAgKGogPCBleHRlcm5hbF9yZWxvY19jb3VudAotCSAgICAmJiAqZXh0ZXJuYWxfcmVsb2NzW2pdLnJlbC0+c3ltX3B0cl9wdHIgPT0gc3ltKTsKLQkgICBqKyspCi0JKytjbnQ7Ci0KLSAgICAgIGlmICgoKm5sbV93cml0ZV9leHRlcm5hbF9mdW5jIChhYmZkKSkgKGFiZmQsIGNudCwgc3ltLAotCQkJCQkgICAgICZleHRlcm5hbF9yZWxvY3NbaV0pCi0JICA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaSArPSBjbnQ7Ci0gICAgfQotCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyA9IGM7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBwdWJsaWMgc3ltYm9scyAoZXhwb3J0cykuICAqLwotICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGlmIChzeW1fcHRyX3B0ciAhPSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hICgqZ2V0X3B1YmxpY19vZmZzZXRfZnVuYykgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotICAgICAgYm9vbGVhbiAoKndyaXRlX2V4cG9ydF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmRfdm1hKSk7Ci0KLSAgICAgIGFzeW1ib2wgKipzeW1fZW5kOwotCi0gICAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cHVibGljc09mZnNldCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgICAgIGdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMgPSBubG1fZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyAoYWJmZCk7Ci0gICAgICB3cml0ZV9leHBvcnRfZnVuYyA9IG5sbV93cml0ZV9leHBvcnRfZnVuYyAoYWJmZCk7Ci0gICAgICBjID0gMDsKLSAgICAgIHN5bV9lbmQgPSBzeW1fcHRyX3B0ciArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgICAgZm9yICg7IHN5bV9wdHJfcHRyIDwgc3ltX2VuZDsgc3ltX3B0cl9wdHIrKykKLQl7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBiZmRfYnl0ZSBsZW47Ci0JICBiZmRfdm1hIG9mZnNldDsKLQkgIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0JICBzeW0gPSAqc3ltX3B0cl9wdHI7Ci0KLQkgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCkpID09IDAKLQkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICArK2M7Ci0KLQkgIGlmIChnZXRfcHVibGljX29mZnNldF9mdW5jKQotCSAgICB7Ci0JICAgICAgLyogTW9zdCBiYWNrZW5kcyBjYW4gdXNlIHRoZSBjb2RlIGJlbG93LCBidXQKLQkJIHVuZm9ydHVuYXRlbHkgc29tZSB1c2UgYSBkaWZmZXJlbnQgc2NoZW1lLiAgKi8KLQkgICAgICBvZmZzZXQgPSAoKmdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMpIChhYmZkLCBzeW0pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvZmZzZXQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0JICAgICAgaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJewotCQkgIG9mZnNldCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLQkJICBvZmZzZXQgfD0gTkxNX0hJQklUOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc2VjLT5mbGFncyAmIChTRUNfREFUQSB8IFNFQ19BTExPQykpCi0JCXsKLQkJICAvKiBTRUNfQUxMT0MgaXMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCQkgIG9mZnNldCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIGNhbid0IGhhbmRsZSBhbiBleHBvcnRlZCBzeW1ib2wgdGhhdCBpcyBub3QgaW4KLQkJICAgICB0aGUgY29kZSBvciBkYXRhIHNlZ21lbnQuICAqLwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICBpZiAod3JpdGVfZXhwb3J0X2Z1bmMpCi0JICAgIHsKLQkgICAgICBpZiAoKCp3cml0ZV9leHBvcnRfZnVuYykgKGFiZmQsIHN5bSwgb2Zmc2V0KSA9PSBmYWxzZSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLQkgICAgICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpCi0JCSAgICE9IHNpemVvZiAoYmZkX2J5dGUpKQotCQkgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBwdXRfd29yZCAoYWJmZCwgb2Zmc2V0LCB0ZW1wKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlB1YmxpY3MgPSBjOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyByZWNvcmRzLiAgVGhlIE5MTSBjb252ZXJzaW9uIHByb2dyYW0KLQkgd2FudHMgdG8gYmUgYWJsZSB0byBpbmhpYml0IHRoaXMsIHNvIGFzIGEgc3BlY2lhbCBoYWNrIGlmCi0JIGRlYnVnSW5mb09mZnNldCBpcyBzZXQgdG8gLTEgd2UgZG9uJ3Qgd3JpdGUgYW55IGRlYnVnZ2luZwotCSBpbmZvcm1hdGlvbi4gIFRoaXMgY2FuIG5vdCBiZSBoYW5kbGVkIGJ5IGZpZGRsaW5nIHdpdGggdGhlCi0JIHN5bWJvbCB0YWJsZSwgYmVjYXVzZSBleHBvcnRlZCBzeW1ib2xzIGFwcGVhciBpbiBib3RoIHRoZQotCSBleHBvcnRlZCBzeW1ib2wgbGlzdCBhbmQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9PSAoZmlsZV9wdHIpIC0gMSkKLQl7Ci0JICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID0gMDsKLQkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkRlYnVnUmVjb3JkcyA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICBjID0gMDsKLQkgIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLQkgIHN5bV9lbmQgPSBzeW1fcHRyX3B0ciArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCSAgZm9yICg7IHN5bV9wdHJfcHRyIDwgc3ltX2VuZDsgc3ltX3B0cl9wdHIrKykKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQkgICAgICBiZmRfYnl0ZSB0eXBlLCBsZW47Ci0JICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICAgICAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLQkgICAgICBzeW0gPSAqc3ltX3B0cl9wdHI7Ci0KLQkgICAgICAvKiBUaGUgTkxNIG5vdGlvbiBvZiBhIGRlYnVnZ2luZyBzeW1ib2wgaXMgYWN0dWFsbHkgd2hhdAotCQkgQkZEIGNhbGxzIGEgbG9jYWwgb3IgZ2xvYmFsIHN5bWJvbC4gIFdoYXQgQkZEIGNhbGxzIGEKLQkJIGRlYnVnZ2luZyBzeW1ib2wgTkxNIGRvZXMgbm90IHVuZGVyc3RhbmQgYXQgYWxsLiAgKi8KLQkgICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0xPQ0FMIHwgQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQpKSA9PSAwCi0JCSAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwCi0JCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCQljb250aW51ZTsKLQotCSAgICAgICsrYzsKLQotCSAgICAgIG9mZnNldCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIHNlYyA9IHN5bS0+c2VjdGlvbjsKLQkgICAgICBpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCQl7Ci0JCSAgb2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotCQkgIHR5cGUgPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc2VjLT5mbGFncyAmIChTRUNfREFUQSB8IFNFQ19BTExPQykpCi0JCXsKLQkJICAvKiBTRUNfQUxMT0MgaXMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCQkgIG9mZnNldCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLQkJICB0eXBlID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJdHlwZSA9IDI7Ci0KLQkgICAgICAvKiBUaGUgdHlwZSBpcyAwIGZvciBkYXRhLCAxIGZvciBjb2RlLCAyIGZvciBhYnNvbHV0ZS4gICovCi0JICAgICAgaWYgKGJmZF93cml0ZSAoJnR5cGUsIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKQotCQkgICE9IHNpemVvZiAoYmZkX2J5dGUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIHB1dF93b3JkIChhYmZkLCBvZmZzZXQsIHRlbXApOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotCSAgICAgIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkKLQkJICAgIT0gc2l6ZW9mIChiZmRfYnl0ZSkpCi0JCSAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzID0gYzsKLQl9Ci0gICAgfQotCi0gIC8qIE5MTUxJTksgZmlsbHMgaW4gb2Zmc2V0IHZhbHVlcyBldmVuIGlmIHRoZXJlIGlzIG5vIGRhdGEsIHNvIHdlIGRvCi0gICAgIHRoZSBzYW1lLiAgKi8KLSAgbGFzdCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jdXN0b21EYXRhT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmN1c3RvbURhdGFPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cHVibGljc09mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5wdWJsaWNzT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID0gbGFzdDsKLQotICAvKiBBdCB0aGlzIHBvaW50IGV2ZXJ5dGhpbmcgaGFzIGJlZW4gd3JpdHRlbiBvdXQgZXhjZXB0IHRoZSBmaXhlZAotICAgICBoZWFkZXIuICAqLwotICBtZW1jcHkgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5zaWduYXR1cmUsIG5sbV9zaWduYXR1cmUgKGFiZmQpLAotCSAgTkxNX1NJR05BVFVSRV9TSVpFKTsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnZlcnNpb24gPSBOTE1fSEVBREVSX1ZFUlNJT047Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlU3RhcnRPZmZzZXQgPQotICAgIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpCi0gICAgIC0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCkpOwotCi0gIC8qIFdlIGhhdmUgbm8gY29udmVuaWVudCB3YXkgZm9yIHRoZSBjYWxsZXIgdG8gcGFzcyBpbiB0aGUgZXhpdAotICAgICBwcm9jZWR1cmUgb3IgdGhlIGNoZWNrIHVubG9hZCBwcm9jZWR1cmUsIHNvIHRoZSBjYWxsZXIgbXVzdCBzZXQKLSAgICAgdGhlIHZhbHVlcyBpbiB0aGUgaGVhZGVyIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMuICAqLwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXhpdFByb2NlZHVyZU9mZnNldCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCAhPSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCAtPQotICAgICAgbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICB3cml0ZV9wcmVmaXhfZnVuYyA9IG5sbV93cml0ZV9wcmVmaXhfZnVuYyAoYWJmZCk7Ci0gIGlmICh3cml0ZV9wcmVmaXhfZnVuYykKLSAgICB7Ci0gICAgICBpZiAoKCp3cml0ZV9wcmVmaXhfZnVuYykgKGFiZmQpID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBCRkRfQVNTRVJUICgoYmZkX3NpemVfdHlwZSkgYmZkX3RlbGwgKGFiZmQpCi0JICAgICAgPT0gbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplIChhYmZkKSk7Ci0KLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCAoYWJmZCwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCksIGZpeGVkX2hlYWRlcik7Ci0gIGlmIChiZmRfd3JpdGUgKGZpeGVkX2hlYWRlciwgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSwgMSwgYWJmZCkKLSAgICAgICE9IG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGZpeGVkX2hlYWRlciAhPSBOVUxMKQotICAgIGZyZWUgKGZpeGVkX2hlYWRlcik7Ci0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChmaXhlZF9oZWFkZXIgIT0gTlVMTCkKLSAgICBmcmVlIChmaXhlZF9oZWFkZXIpOwotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmxtc3dhcC5oIGIvYmZkL25sbXN3YXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5Y2U3Mi4uMDAwMDAwMAotLS0gYS9iZmQvbmxtc3dhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN3YXBwaW5nIHJvdXRpbmVzIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIHVzaW5nIEVMRiBzdXBwb3J0IGFzIHRoZQotICAgdGVtcGxhdGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWx0aG91Z2ggdGhpcyBpcyBhIGhlYWRlciBmaWxlLCBpdCBkZWZpbmVzIGZ1bmN0aW9ucy4gIEl0IGlzCi0gICBpbmNsdWRlZCBieSBOTE0gYmFja2VuZHMgdG8gZGVmaW5lIHN3YXBwaW5nIGZ1bmN0aW9ucyB0aGF0IHZhcnkKLSAgIGZyb20gb25lIE5MTSB0byBhbm90aGVyLiAgVGhlIGJhY2tlbmQgY29kZSBtdXN0IGFycmFuZ2UgZm9yCi0gICBObG1fRXh0ZXJuYWxfeHh4eCB0byBiZSBkZWZpbmVkIGFwcHJvcHJpYXRlbHksIGFuZCBjYW4gdGhlbiBpbmNsdWRlCi0gICB0aGlzIGZpbGUgdG8gZ2V0IHRoZSBzd2FwcGluZyByb3V0aW5lcy4KLQotICAgQXQgdGhlIG1vbWVudCB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBvbmUgc3RydWN0dXJlLCB0aGUgZml4ZWQgTkxNCi0gICBmaWxlIGhlYWRlci4gICovCi0KLXN0YXRpYyB2b2lkIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLAotCQkJCQkgICAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICopKTsKLXN0YXRpYyB2b2lkIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICosCi0JCQkJCSAgICAgICBQVFIpKTsKLQotLyogVHJhbnNsYXRlIGFuIE5MTSBmaXhlZCBsZW5ndGggZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gTkxNCi0gICBmaWxlIGhlYWRlciBpbiBpbnRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1ubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gKGFiZmQsIHJlYWxzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcmVhbHNyYzsKLSAgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqZHN0OwotewotICBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyICpzcmMgPSAoTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlciAqKSByZWFsc3JjOwotICBtZW1jcHkgKGRzdC0+c2lnbmF0dXJlLCBzcmMtPnNpZ25hdHVyZSwgTkxNX1NJR05BVFVSRV9TSVpFKTsKLSAgbWVtY3B5IChkc3QtPm1vZHVsZU5hbWUsIHNyYy0+bW9kdWxlTmFtZSwgTkxNX01PRFVMRV9OQU1FX1NJWkUpOwotICBkc3QtPnZlcnNpb24gPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+dmVyc2lvbik7Ci0gIGRzdC0+Y29kZUltYWdlT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmNvZGVJbWFnZU9mZnNldCk7Ci0gIGRzdC0+Y29kZUltYWdlU2l6ZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jb2RlSW1hZ2VTaXplKTsKLSAgZHN0LT5kYXRhSW1hZ2VPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZGF0YUltYWdlT2Zmc2V0KTsKLSAgZHN0LT5kYXRhSW1hZ2VTaXplID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmRhdGFJbWFnZVNpemUpOwotICBkc3QtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT51bmluaXRpYWxpemVkRGF0YVNpemUpOwotICBkc3QtPmN1c3RvbURhdGFPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y3VzdG9tRGF0YU9mZnNldCk7Ci0gIGRzdC0+Y3VzdG9tRGF0YVNpemUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y3VzdG9tRGF0YVNpemUpOwotICBkc3QtPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMpOwotICBkc3QtPnJlbG9jYXRpb25GaXh1cE9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotICBkc3QtPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMpOwotICBkc3QtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQpOwotICBkc3QtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzKTsKLSAgZHN0LT5wdWJsaWNzT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnB1YmxpY3NPZmZzZXQpOwotICBkc3QtPm51bWJlck9mUHVibGljcyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZlB1YmxpY3MpOwotICBkc3QtPmRlYnVnSW5mb09mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5kZWJ1Z0luZm9PZmZzZXQpOwotICBkc3QtPm51bWJlck9mRGVidWdSZWNvcmRzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mRGVidWdSZWNvcmRzKTsKLSAgZHN0LT5jb2RlU3RhcnRPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y29kZVN0YXJ0T2Zmc2V0KTsKLSAgZHN0LT5leGl0UHJvY2VkdXJlT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmV4aXRQcm9jZWR1cmVPZmZzZXQpOwotICBkc3QtPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0KTsKLSAgZHN0LT5tb2R1bGVUeXBlID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm1vZHVsZVR5cGUpOwotICBkc3QtPmZsYWdzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmZsYWdzKTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIE5MTSBmaXhlZCBsZW5ndGggZmlsZSBoZWFkZXIgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8KLSAgIGFuIE5MTSBmaWxlIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1ubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0IChhYmZkLCBzcmMsIHJlYWxkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqc3JjOwotICAgICBQVFIgcmVhbGRzdDsKLXsKLSAgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlciAqZHN0ID0gKE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIgKikgcmVhbGRzdDsKLSAgbWVtc2V0IChkc3QsIDAsIHNpemVvZiAqZHN0KTsKLSAgbWVtY3B5IChkc3QtPnNpZ25hdHVyZSwgc3JjLT5zaWduYXR1cmUsIE5MTV9TSUdOQVRVUkVfU0laRSk7Ci0gIG1lbWNweSAoZHN0LT5tb2R1bGVOYW1lLCBzcmMtPm1vZHVsZU5hbWUsIE5MTV9NT0RVTEVfTkFNRV9TSVpFKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT52ZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgZHN0LT52ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jb2RlSW1hZ2VPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmNvZGVJbWFnZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y29kZUltYWdlU2l6ZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y29kZUltYWdlU2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZGF0YUltYWdlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5kYXRhSW1hZ2VPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmRhdGFJbWFnZVNpemUsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmRhdGFJbWFnZVNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+dW5pbml0aWFsaXplZERhdGFTaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jdXN0b21EYXRhT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5jdXN0b21EYXRhT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jdXN0b21EYXRhU2l6ZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y3VzdG9tRGF0YVNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5yZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcywKLQkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5wdWJsaWNzT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5wdWJsaWNzT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZlB1YmxpY3MsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mUHVibGljcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZGVidWdJbmZvT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5kZWJ1Z0luZm9PZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mRGVidWdSZWNvcmRzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZkRlYnVnUmVjb3Jkcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y29kZVN0YXJ0T2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5jb2RlU3RhcnRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmV4aXRQcm9jZWR1cmVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmV4aXRQcm9jZWR1cmVPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bW9kdWxlVHlwZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+bW9kdWxlVHlwZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZmxhZ3MsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9uczMyay5oIGIvYmZkL25zMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2M2JhMDkuLjAwMDAwMDAKLS0tIGEvYmZkL25zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBIZWFkZXIgZmlsZSBmb3IgbnMzMmsgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICosCi0JICAgbG9uZyAoKikgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpLAotCSAgIGludCAoKikgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpKSk7Ci0KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJmZF92bWEsCi0JICAgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi1leHRlcm4gbG9uZyBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGxvbmcgX2JmZF9uczMya19nZXRfaW1tZWRpYXRlIFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLWV4dGVybiBpbnQgX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLWV4dGVybiBpbnQgX2JmZF9uczMya19wdXRfaW1tZWRpYXRlIFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NfaW1tCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwpkaWZmIC0tZ2l0IGEvYmZkL25zMzJrbmV0YnNkLmMgYi9iZmQvbnMzMmtuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyMzU2ZC4uMDAwMDAwMAotLS0gYS9iZmQvbnMzMmtuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL25zMzJrIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCTQwOTYKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfbnMzMmsKLSNkZWZpbmUJREVGQVVMVF9NSUQgCU1fNTMyX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQocGM1MzJuZXRic2RfLE9QKQotCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKG5zMzJrYW91dCxfMzJfLHkpCi0KLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW5zMzJrLW5ldGJzZCIKLQotI2RlZmluZSBuczMya2FvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDEKLQotLyogV2UgY2FuYHQgdXNlIHRoZSBNWU5TIG1hY3JvIGhlcmUgZm9yIGNwcCByZWFzb25zIHRvbyBzdWJ0bGUKLSAqIGZvciBtZSAtLSBJV0QKLSAqLwotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbnMzMmthb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAiYmZkLmgiCQkvKiBUbyBlbnN1cmUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIGlzIE9LICovCi0KLUNPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKgotTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvb2FzeXMuYyBiL2JmZC9vYXN5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjkwNTNiLi4wMDAwMDAwCi0tLSBhL2JmZC9vYXN5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIG9hc3lzIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBVTkRFUlNDT1JFX0hBQ0sgMQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAib2FzeXMuaCIKLSNpbmNsdWRlICJsaWJvYXN5cy5oIgotCi0vKiBYWFggLSBGSVhNRS4gIG9mZnNldG9mIGJlbG9uZ3MgaW4gdGhlIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyBpbgotICAgLi4vaW5jbHVkZS9zeXMuICovCi0vKiBEZWZpbmUgb2Zmc2V0b2YgZm9yIHRob3NlIHN5c3RlbXMgd2hpY2ggbGFjayBpdCAqLwotCi0jaWZuZGVmIG9mZnNldG9mCi0jZGVmaW5lIG9mZnNldG9mKHR5cGUsIGlkZW50aWZpZXIpIChzaXplX3QpICYoKCh0eXBlICopIDApLT5pZGVudGlmaWVyKQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG9hc3lzX3JlYWRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9yZWNvcmQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIG9hc3lzX3JlY29yZF9lbnVtX3R5cGUsCi0JCQkJCSAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICosCi0JCQkJCSAgIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9lbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX2RhdGEgUEFSQU1TICgoYmZkICopKTsKLQotLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KLVBST1RPIChzdGF0aWMgYm9vbGVhbiwgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhLCAoYmZkICogQ09OU1QgYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsIHJlY29yZCkKLSAgICAgYmZkICphYmZkOwotICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqcmVjb3JkOwotewotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJlY29yZCwgMSwgc2l6ZW9mIChyZWNvcmQtPmhlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKChzaXplX3QpIHJlY29yZC0+aGVhZGVyLmxlbmd0aCA8PSAoc2l6ZV90KSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAoKChjaGFyICopIHJlY29yZCkgKyBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSksCi0JCTEsIHJlY29yZC0+aGVhZGVyLmxlbmd0aCAtIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpLAotCQlhYmZkKQotICAgICAgIT0gcmVjb3JkLT5oZWFkZXIubGVuZ3RoIC0gc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLXN0YXRpYyBzaXplX3QKLW9hc3lzX3N0cmluZ19sZW5ndGggKHJlY29yZCkKLSAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKnJlY29yZDsKLXsKLSAgcmV0dXJuIHJlY29yZC0+aGVhZGVyLmxlbmd0aAotICAgIC0gKChjaGFyICopIHJlY29yZC0+c3ltYm9sLm5hbWUgLSAoY2hhciAqKSByZWNvcmQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0KLVNsdXJwIHRoZSBzeW1ib2wgdGFibGUgYnkgcmVhZGluZyBpbiBhbGwgdGhlIHJlY29yZHMgYXQgdGhlIHN0YXJ0IGZpbGUKLXRpbGwgd2UgZ2V0IHRvIHRoZSBmaXJzdCBzZWN0aW9uIHJlY29yZC4KLQotV2UnbGwgc29ydCB0aGUgc3ltYm9sc3MgaW50byAgdHdvIGxpc3RzLCBkZWZpbmVkIGFuZCB1bmRlZmluZWQuIFRoZQotdW5kZWZpbmVkIHN5bWJvbHMgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgdGFibGUgYWNjb3JkaW5nIHRvIHRoZWlyCi1yZWZuby4KLQotV2UgZG8gdGhpcyBieSBwbGFjaW5nIGFsbCB1bmRlZmluZWQgc3ltYm9scyBhdCB0aGUgZnJvbnQgb2YgdGhlIHRhYmxlCi1tb3ZpbmcgaW4sIGFuZCB0aGUgZGVmaW5lZCBzeW1ib2xzIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIG1vdmluZyBiYWNrLgotCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKkNPTlNUIGFiZmQ7Ci17Ci0gIG9hc3lzX3JlY29yZF91bmlvbl90eXBlIHJlY29yZDsKLSAgb2FzeXNfZGF0YV90eXBlICpkYXRhID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGFzeW1ib2wgKmRlc3RfZGVmaW5lZDsKLSAgYXN5bWJvbCAqZGVzdDsKLSAgY2hhciAqc3RyaW5nX3B0cjsKLQotCi0gIGlmIChkYXRhLT5zeW1ib2xzICE9IChhc3ltYm9sICopIE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAvKiBCdXkgZW5vdWdoIG1lbW9yeSBmb3IgYWxsIHRoZSBzeW1ib2xzIGFuZCBhbGwgdGhlIG5hbWVzICovCi0gIGRhdGEtPnN5bWJvbHMgPQotICAgIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSAqIGFiZmQtPnN5bWNvdW50KTsKLSNpZmRlZiBVTkRFUlNDT1JFX0hBQ0sKLSAgLyogYnV5IDEgbW9yZSBjaGFyIGZvciBlYWNoIHN5bWJvbCB0byBrZWVwIHRoZSB1bmRlcnNjb3JlIGluKi8KLSAgZGF0YS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgZGF0YS0+c3ltYm9sX3N0cmluZ19sZW5ndGggKwotCQkJICAgICBhYmZkLT5zeW1jb3VudCk7Ci0jZWxzZQotICBkYXRhLT5zdHJpbmdzID0gYmZkX2FsbG9jIChhYmZkLCBkYXRhLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCk7Ci0jZW5kaWYKLSAgaWYgKCFkYXRhLT5zeW1ib2xzIHx8ICFkYXRhLT5zdHJpbmdzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkZXN0X2RlZmluZWQgPSBkYXRhLT5zeW1ib2xzICsgYWJmZC0+c3ltY291bnQgLSAxOwotCi0gIHN0cmluZ19wdHIgPSBkYXRhLT5zdHJpbmdzOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0KLSAgICAgIGlmICghIG9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCAmcmVjb3JkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKHJlY29yZC5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW06Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtOgotCSAgewotCSAgICBpbnQgZmxhZyA9IHJlY29yZC5oZWFkZXIudHlwZSA9PSAoaW50KSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bSA/Ci0JICAgIChCU0ZfTE9DQUwpIDogKEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUKTsKLQotCi0JICAgIHNpemVfdCBsZW5ndGggPSBvYXN5c19zdHJpbmdfbGVuZ3RoICgmcmVjb3JkKTsKLQkgICAgc3dpdGNoIChyZWNvcmQuc3ltYm9sLnJlbGIgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQUJTOgotCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07Ci0JCWRlc3QtPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQlkZXN0LT5mbGFncyA9IDA7Ci0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfUkVMOgotCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07Ci0JCWRlc3QtPnNlY3Rpb24gPQotCQkgIE9BU1lTX0RBVEEgKGFiZmQpLT5zZWN0aW9uc1tyZWNvcmQuc3ltYm9sLnJlbGIgJgotCQkJCQkgICAgICBSRUxPQ0FUSU9OX1NFQ1RfQklUU107Ci0JCWlmIChyZWNvcmQuaGVhZGVyLnR5cGUgPT0gKGludCkgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0pCi0JCSAgewotCQkgICAgZGVzdC0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JCSAgICBpZiAoZGVzdC0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgKH4wKSkKLQkJICAgICAgewotCQkJLyogSXQgc2VlbXMgdGhhdCBzb21ldGltZXMgaW50ZXJuYWwgc3ltYm9scyBhcmUgdGllZCB1cCwgYnV0Ci0JCSAgICAgICBzdGlsbCBnZXQgb3V0cHV0LCBldmVuIHRob3VnaCB0aGVyZSBpcyBubwotCQkgICAgICAgc2VjdGlvbiAqLwotCQkJZGVzdC0+c2VjdGlvbiA9IDA7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0KLQkJICAgIGRlc3QtPmZsYWdzID0gZmxhZzsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKLQkJZGVzdCA9IGRhdGEtPnN5bWJvbHMgKyBiZmRfaF9nZXRfMTYgKGFiZmQsIHJlY29yZC5zeW1ib2wucmVmbm8pOwotCQlkZXN0LT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07Ci0JCWRlc3QtPm5hbWUgPSBzdHJpbmdfcHRyOwotCQlkZXN0LT50aGVfYmZkID0gYWJmZDsKLQotCQlkZXN0LT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07Ci0JCUJGRF9BU1NFUlQgKDApOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGRlc3QtPm5hbWUgPSBzdHJpbmdfcHRyOwotCSAgICBkZXN0LT50aGVfYmZkID0gYWJmZDsKLQkgICAgZGVzdC0+dWRhdGEucCA9IChQVFIpIE5VTEw7Ci0JICAgIGRlc3QtPnZhbHVlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc3ltYm9sLnZhbHVlKTsKLQotI2lmZGVmIFVOREVSU0NPUkVfSEFDSwotCSAgICBpZiAocmVjb3JkLnN5bWJvbC5uYW1lWzBdICE9ICdfJykKLQkgICAgICB7Ci0JCXN0cmluZ19wdHJbMF0gPSAnXyc7Ci0JCXN0cmluZ19wdHIrKzsKLQkgICAgICB9Ci0jZW5kaWYKLQkgICAgbWVtY3B5IChzdHJpbmdfcHRyLCByZWNvcmQuc3ltYm9sLm5hbWUsIGxlbmd0aCk7Ci0KLQotCSAgICBzdHJpbmdfcHRyW2xlbmd0aF0gPSAwOwotCSAgICBzdHJpbmdfcHRyICs9IGxlbmd0aCArIDE7Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgbG9vcCA9IGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgbG9uZwotb2FzeXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICpDT05TVCBhYmZkOwotewotICBpZiAoISBvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGFiZmQtPnN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChvYXN5c19zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLS8qCi0qLwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7Ci0KLWxvbmcKLW9hc3lzX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgYXN5bWJvbCAqc3ltYmFzZTsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGlmIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHN5bWJhc2UgPSBPQVNZU19EQVRBIChhYmZkKS0+c3ltYm9sczsKLSAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IGFiZmQtPnN5bWNvdW50OyBjb3VudGVyKyspCi0gICAgewotICAgICAgKihsb2NhdGlvbisrKSA9IHN5bWJhc2UrKzsKLSAgICB9Ci0gICpsb2NhdGlvbiA9IDA7Ci0gIHJldHVybiBhYmZkLT5zeW1jb3VudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBhcmNoaXZlIHN0dWZmCi0qLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vYXN5c19hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgb2FzeXNfYXJjaGl2ZV9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyX3R5cGUgaGVhZGVyX2V4dDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZpbGVfcHRyIGZpbGVwb3M7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIGZhbHNlKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKChQVFIpICYgaGVhZGVyX2V4dCwgMSwgc2l6ZW9mIChoZWFkZXJfZXh0KSwgYWJmZCkKLQkgICE9IHNpemVvZiAoaGVhZGVyX2V4dCkpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBoZWFkZXIudmVyc2lvbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC52ZXJzaW9uKTsKLSAgaGVhZGVyLm1vZF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5tb2RfY291bnQpOwotICBoZWFkZXIubW9kX3RibF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQubW9kX3RibF9vZmZzZXQpOwotICBoZWFkZXIuc3ltX3RibF9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV90Ymxfc2l6ZSk7Ci0gIGhlYWRlci5zeW1fY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQuc3ltX2NvdW50KTsKLSAgaGVhZGVyLnN5bV90Ymxfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV90Ymxfb2Zmc2V0KTsKLSAgaGVhZGVyLnhyZWZfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQueHJlZl9jb3VudCk7Ci0gIGhlYWRlci54cmVmX2xzdF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQueHJlZl9sc3Rfb2Zmc2V0KTsKLQotICAvKgotICAgIFRoZXJlIGlzbid0IGEgbWFnaWMgbnVtYmVyIGluIGFuIE9hc3lzIGFyY2hpdmUsIHNvIHRoZSBiZXN0IHdlCi0gICAgY2FuIGRvIHRvIHZlcmlmeSByZWFzbmFibGVuZXNzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgaW4KLSAgICB0aGUgaGVhZGVyIGFyZSB0b28gd2VpcmQKLSAgICAqLwotCi0gIGlmIChoZWFkZXIudmVyc2lvbiA+IDEwMDAwIHx8Ci0gICAgICBoZWFkZXIubW9kX2NvdW50ID4gMTAwMDAgfHwKLSAgICAgIGhlYWRlci5zeW1fY291bnQgPiAxMDAwMDAgfHwKLSAgICAgIGhlYWRlci54cmVmX2NvdW50ID4gMTAwMDAwKQotICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotCi0gIC8qCi0gICAgVGhhdCBhbGwgd29ya2VkLCBsZXQncyBidXkgdGhlIHNwYWNlIGZvciB0aGUgaGVhZGVyIGFuZCByZWFkIGluCi0gICAgdGhlIGhlYWRlcnMuCi0gICAgKi8KLSAgewotICAgIG9hc3lzX2FyX2RhdGFfdHlwZSAqYXIgPQotICAgIChvYXN5c19hcl9kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX2FyX2RhdGFfdHlwZSkpOwotCi0gICAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqbW9kdWxlID0KLSAgICAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19tb2R1bGVfaW5mb190eXBlKSAqIGhlYWRlci5tb2RfY291bnQpOwotICAgIG9hc3lzX21vZHVsZV90YWJsZV90eXBlIHJlY29yZDsKLQotICAgIGlmICghYXIgfHwgIW1vZHVsZSkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgYWJmZC0+dGRhdGEub2FzeXNfYXJfZGF0YSA9IGFyOwotICAgIGFyLT5tb2R1bGUgPSBtb2R1bGU7Ci0gICAgYXItPm1vZHVsZV9jb3VudCA9IGhlYWRlci5tb2RfY291bnQ7Ci0KLSAgICBmaWxlcG9zID0gaGVhZGVyLm1vZF90Ymxfb2Zmc2V0OwotICAgIGZvciAoaSA9IDA7IGkgPCBoZWFkZXIubW9kX2NvdW50OyBpKyspCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBOVUxMOwotCi0JLyogVGhlcmUgYXJlIHR3byB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIGFyY2hpdmUgaGVhZGVyICovCi0KLQlpZiAoMCkKLQkgIHsKLQkgICAgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYV90eXBlIHJlY29yZF9leHQ7Ci0JICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiByZWNvcmRfZXh0LCAxLCBzaXplb2YgKHJlY29yZF9leHQpLCBhYmZkKQotCQkhPSBzaXplb2YgKHJlY29yZF9leHQpKQotCSAgICAgIHJldHVybiBOVUxMOwotCi0JICAgIHJlY29yZC5tb2Rfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2Rfc2l6ZSk7Ci0JICAgIHJlY29yZC5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5maWxlX29mZnNldCk7Ci0KLQkgICAgcmVjb3JkLmRlcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBfY291bnQpOwotCSAgICByZWNvcmQuZGVwZWVfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwZWVfY291bnQpOwotCSAgICByZWNvcmQuc2VjdF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5zZWN0X2NvdW50KTsKLQotCSAgICBtb2R1bGVbaV0ubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgMzMpOwotCSAgICBpZiAoIW1vZHVsZVtpXS5uYW1lKQotCSAgICAgIHJldHVybiBOVUxMOwotCi0JICAgIG1lbWNweSAobW9kdWxlW2ldLm5hbWUsIHJlY29yZF9leHQubW9kX25hbWUsIDMzKTsKLQkgICAgZmlsZXBvcyArPQotCSAgICAgIHNpemVvZiAocmVjb3JkX2V4dCkgKwotCSAgICAgIHJlY29yZC5kZXBfY291bnQgKiA0ICsKLQkgICAgICByZWNvcmQuZGVwZWVfY291bnQgKiA0ICsKLQkgICAgICByZWNvcmQuc2VjdF9jb3VudCAqIDggKyAxODc7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBvYXN5c19leHRtb2R1bGVfdGFibGVfdHlwZV9iX3R5cGUgcmVjb3JkX2V4dDsKLQkgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHJlY29yZF9leHQsIDEsIHNpemVvZiAocmVjb3JkX2V4dCksIGFiZmQpCi0JCSE9IHNpemVvZiAocmVjb3JkX2V4dCkpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0KLQkgICAgcmVjb3JkLm1vZF9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0Lm1vZF9zaXplKTsKLQkgICAgcmVjb3JkLmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmZpbGVfb2Zmc2V0KTsKLQotCSAgICByZWNvcmQuZGVwX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcF9jb3VudCk7Ci0JICAgIHJlY29yZC5kZXBlZV9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBlZV9jb3VudCk7Ci0JICAgIHJlY29yZC5zZWN0X2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LnNlY3RfY291bnQpOwotCSAgICByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2RfbmFtZV9sZW5ndGgpOwotCi0JICAgIG1vZHVsZVtpXS5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSArIDEpOwotCSAgICBpZiAoIW1vZHVsZVtpXS5uYW1lKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICBpZiAoYmZkX3JlYWQgKChQVFIpIG1vZHVsZVtpXS5uYW1lLCAxLCByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSwKLQkJCSAgYWJmZCkKLQkJIT0gcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIG1vZHVsZVtpXS5uYW1lW3JlY29yZC5tb2R1bGVfbmFtZV9zaXplXSA9IDA7Ci0JICAgIGZpbGVwb3MgKz0KLQkgICAgICBzaXplb2YgKHJlY29yZF9leHQpICsKLQkgICAgICByZWNvcmQuZGVwX2NvdW50ICogNCArCi0JICAgICAgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgKyAxOwotCi0JICB9Ci0KLQotCW1vZHVsZVtpXS5zaXplID0gcmVjb3JkLm1vZF9zaXplOwotCW1vZHVsZVtpXS5wb3MgPSByZWNvcmQuZmlsZV9vZmZzZXQ7Ci0JbW9kdWxlW2ldLmFiZmQgPSAwOwotICAgICAgfQotCi0gIH0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi0gIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID0gKG9hc3lzX2RhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfZGF0YV90eXBlKSk7Ci0gIHJldHVybiBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2RlZmluZSBNQVhfU0VDUyAxNgotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb2FzeXNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgb2FzeXNfZGF0YV90eXBlICpvYXN5czsKLSAgb2FzeXNfZGF0YV90eXBlICpzYXZlID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGJvb2xlYW4gaGFkX3VzZWZ1bGwgPSBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA9IDA7Ci0gIG9hc3lzX21rb2JqZWN0IChhYmZkKTsKLSAgb2FzeXMgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgbWVtc2V0ICgoUFRSKSBvYXN5cy0+c2VjdGlvbnMsIDB4ZmYsIHNpemVvZiAob2FzeXMtPnNlY3Rpb25zKSk7Ci0KLSAgLyogUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGZhaWw7Ci0gIG9hc3lzLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCA9IDA7Ci0gIC8qIEluc3BlY3QgdGhlIHJlY29yZHMsIGJ1dCBvbmx5IGtlZXAgdGhlIHNlY3Rpb24gaW5mbyAtCi0gICAgIHJlbWVtYmVyIHRoZSBzaXplIG9mIHRoZSBzeW1ib2xzCi0gICAgICovCi0gIG9hc3lzLT5maXJzdF9kYXRhX3JlY29yZCA9IDA7Ci0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlIHJlY29yZDsKLSAgICAgIGlmICghIG9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCAmcmVjb3JkKSkKLQlnb3RvIGZhaWw7Ci0gICAgICBpZiAoKHNpemVfdCkgcmVjb3JkLmhlYWRlci5sZW5ndGggPCAoc2l6ZV90KSBzaXplb2YgKHJlY29yZC5oZWFkZXIpKQotCWdvdG8gZmFpbDsKLQotCi0gICAgICBzd2l0Y2ggKChvYXN5c19yZWNvcmRfZW51bV90eXBlKSAocmVjb3JkLmhlYWRlci50eXBlKSkKLQl7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW06Ci0JICBoYWRfdXNlZnVsbCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtOgotCSAgLyogQ291bnQgc3ltYm9scyBhbmQgcmVtZW1iZXIgdGhlaXIgc2l6ZSBmb3IgYSBmdXR1cmUgbWFsbG9jICAgKi8KLQkgIGFiZmQtPnN5bWNvdW50Kys7Ci0JICBvYXN5cy0+c3ltYm9sX3N0cmluZ19sZW5ndGggKz0gMSArIG9hc3lzX3N0cmluZ19sZW5ndGggKCZyZWNvcmQpOwotCSAgaGFkX3VzZWZ1bGwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtOgotCSAgewotCSAgICBhc2VjdGlvbiAqczsKLQkgICAgY2hhciAqYnVmZmVyOwotCSAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9udW1iZXI7Ci0JICAgIGlmIChyZWNvcmQuc2VjdGlvbi5oZWFkZXIubGVuZ3RoICE9IHNpemVvZiAocmVjb3JkLnNlY3Rpb24pKQotCSAgICAgIHsKLQkJZ290byBmYWlsOwotCSAgICAgIH0KLQkgICAgYnVmZmVyID0gYmZkX2FsbG9jIChhYmZkLCAzKTsKLQkgICAgaWYgKCFidWZmZXIpCi0JICAgICAgZ290byBmYWlsOwotCSAgICBzZWN0aW9uX251bWJlciA9IHJlY29yZC5zZWN0aW9uLnJlbGIgJiBSRUxPQ0FUSU9OX1NFQ1RfQklUUzsKLQkgICAgc3ByaW50ZiAoYnVmZmVyLCAiJXUiLCBzZWN0aW9uX251bWJlcik7Ci0JICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBidWZmZXIpOwotCSAgICBvYXN5cy0+c2VjdGlvbnNbc2VjdGlvbl9udW1iZXJdID0gczsKLQkgICAgc3dpdGNoIChyZWNvcmQuc2VjdGlvbi5yZWxiICYgUkVMT0NBVElPTl9UWVBFX0JJVFMpCi0JICAgICAgewotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9DT006Ci0JCUJGRF9GQUlMICgpOwotCSAgICAgIH0KLQotCSAgICBzLT5fcmF3X3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5zZWN0aW9uLnZhbHVlKTsKLQkgICAgcy0+dm1hID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc2VjdGlvbi52bWEpOwotCSAgICBzLT5mbGFncyA9IDA7Ci0JICAgIGhhZF91c2VmdWxsID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bToKLQkgIG9hc3lzLT5maXJzdF9kYXRhX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKSAtIHJlY29yZC5oZWFkZXIubGVuZ3RoOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbW9kdWxlX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbmFtZWRfc2VjdGlvbl9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2VuZF9lbnVtOgotCSAgaWYgKGhhZF91c2VmdWxsID09IGZhbHNlKQotCSAgICBnb3RvIGZhaWw7Ci0JICBsb29wID0gZmFsc2U7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZ290byBmYWlsOwotCX0KLSAgICB9Ci0gIG9hc3lzLT5zeW1ib2xzID0gKGFzeW1ib2wgKikgTlVMTDsKLSAgLyoKLSAgICBPYXN5cyBzdXBwb3J0IHNldmVyYWwgYXJjaGl0ZWN0dXJlcywgYnV0IEkgY2FuJ3Qgc2VlIGEgc2ltcGxlIHdheQotICAgIHRvIGRpc2NvdmVyIHdoaWNoIG9uZSBpcyBpbiBhIHBhcnRpY3VsYXIgZmlsZSAtIHdlJ2xsIGd1ZXNzCi0gICAgKi8KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7Ci0gIGlmIChhYmZkLT5zeW1jb3VudCAhPSAwKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotICAgIH0KLQotICAvKgotICAgIFdlIGRvbid0IGtub3cgaWYgYSBzZWN0aW9uIGhhcyBkYXRhIHVudGlsIHdlJ3ZlIHJlYWQgaXQuLgotICAgICovCi0KLSAgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKTsKLQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi1mYWlsOgotICAodm9pZCkgYmZkX3JlbGVhc2UgKGFiZmQsIG9hc3lzKTsKLSAgYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPSBzYXZlOwotICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLX0KLQotCi1zdGF0aWMgdm9pZAotb2FzeXNfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLSAgaWYgKCFzeW1ib2wtPnNlY3Rpb24pCi0gICAgcmV0LT50eXBlID0gKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpID8gJ2EnIDogJ0EnOwotfQotCi1zdGF0aWMgdm9pZAotb2FzeXNfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMID8KLQkoQ09OU1QgY2hhciAqKSAiKmFicyIgOiBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkJIHNlY3Rpb25fbmFtZSwKLQkJIHN5bWJvbC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0vKgotIFRoZSBob3d0byB0YWJsZSBpcyBidWlsZCB1c2luZyB0aGUgdG9wIHR3byBiaXRzIG9mIGEgcmVsb2MgYnl0ZSB0bwotIGluZGV4IGludG8gaXQuIFRoZSBiaXRzIGFyZSBQQ1JFTCxXT1JEL0xPTkcKLSovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KLXsKLQotICBIT1dUTyAoMCwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInBjcmVsMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPICgwLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicGNyZWwzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKQotfTsKLQotLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgcmVjb3JkOwotICBvYXN5c19kYXRhX3R5cGUgKmRhdGEgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLQotICBvYXN5c19wZXJfc2VjdGlvbl90eXBlICpwZXI7Ci0KLSAgYXNlY3Rpb24gKnM7Ci0KLSAgLyogU2VlIGlmIHRoZSBkYXRhIGhhcyBiZWVuIHNsdXJwZWQgYWxyZWFkeSAuLiAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgcGVyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHMpOwotICAgICAgaWYgKHBlci0+aW5pdGlhbGl6ZWQgPT0gdHJ1ZSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGRhdGEtPmZpcnN0X2RhdGFfcmVjb3JkID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhLT5maXJzdF9kYXRhX3JlY29yZCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3dpdGNoIChyZWNvcmQuaGVhZGVyLnR5cGUpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZGF0YV9lbnVtOgotCSAgewotCi0JICAgIGJmZF9ieXRlICpzcmMgPSByZWNvcmQuZGF0YS5kYXRhOwotCSAgICBiZmRfYnl0ZSAqZW5kX3NyYyA9ICgoYmZkX2J5dGUgKikgJiByZWNvcmQpICsgcmVjb3JkLmhlYWRlci5sZW5ndGg7Ci0JICAgIGJmZF9ieXRlICpkc3RfcHRyOwotCSAgICBiZmRfYnl0ZSAqZHN0X2Jhc2VfcHRyOwotCSAgICB1bnNpZ25lZCBpbnQgcmVsYml0OwotCSAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uID0KLQkgICAgZGF0YS0+c2VjdGlvbnNbcmVjb3JkLmRhdGEucmVsYiAmIFJFTE9DQVRJT05fU0VDVF9CSVRTXTsKLQkgICAgYmZkX3ZtYSBkc3Rfb2Zmc2V0OwotCi0JICAgIHBlciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKTsKLQotCSAgICBpZiAocGVyLT5pbml0aWFsaXplZCA9PSBmYWxzZSkKLQkgICAgICB7Ci0JCXBlci0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCQlpZiAoIXBlci0+ZGF0YSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXBlci0+cmVsb2NfdGFpbF9wdHIgPSAob2FzeXNfcmVsb2NfdHlwZSAqKikgJiAoc2VjdGlvbi0+cmVsb2NhdGlvbik7Ci0JCXBlci0+aGFkX3ZtYSA9IGZhbHNlOwotCQlwZXItPmluaXRpYWxpemVkID0gdHJ1ZTsKLQkJc2VjdGlvbi0+cmVsb2NfY291bnQgPSAwOwotCQlzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgICB9Ci0KLQkgICAgZHN0X29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLmRhdGEuYWRkcik7Ci0JICAgIGlmIChwZXItPmhhZF92bWEgPT0gZmFsc2UpCi0JICAgICAgewotCQkvKiBUYWtlIHRoZSBmaXJzdCB2bWEgd2Ugc2VlIGFzIHRoZSBiYXNlICovCi0JCXNlY3Rpb24tPnZtYSA9IGRzdF9vZmZzZXQ7Ci0JCXBlci0+aGFkX3ZtYSA9IHRydWU7Ci0JICAgICAgfQotCi0JICAgIGRzdF9vZmZzZXQgLT0gc2VjdGlvbi0+dm1hOwotCi0JICAgIGRzdF9iYXNlX3B0ciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YTsKLQkgICAgZHN0X3B0ciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArCi0JICAgICAgZHN0X29mZnNldDsKLQotCSAgICBpZiAoc3JjIDwgZW5kX3NyYykKLQkgICAgICB7Ci0JCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLQkgICAgICB9Ci0JICAgIHdoaWxlIChzcmMgPCBlbmRfc3JjKQotCSAgICAgIHsKLQkJdW5zaWduZWQgY2hhciBtb2RfYnl0ZSA9ICpzcmMrKzsKLQkJc2l6ZV90IGdhcCA9IGVuZF9zcmMgLSBzcmM7Ci0KLQkJY291bnQgPSA4OwotCQlpZiAobW9kX2J5dGUgPT0gMCAmJiBnYXAgPj0gOCkKLQkJICB7Ci0JCSAgICBkc3RfcHRyWzBdID0gc3JjWzBdOwotCQkgICAgZHN0X3B0clsxXSA9IHNyY1sxXTsKLQkJICAgIGRzdF9wdHJbMl0gPSBzcmNbMl07Ci0JCSAgICBkc3RfcHRyWzNdID0gc3JjWzNdOwotCQkgICAgZHN0X3B0cls0XSA9IHNyY1s0XTsKLQkJICAgIGRzdF9wdHJbNV0gPSBzcmNbNV07Ci0JCSAgICBkc3RfcHRyWzZdID0gc3JjWzZdOwotCQkgICAgZHN0X3B0cls3XSA9IHNyY1s3XTsKLQkJICAgIGRzdF9wdHIgKz0gODsKLQkJICAgIHNyYyArPSA4OwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGZvciAocmVsYml0ID0gMTsgY291bnQtLSAhPSAwICYmIHNyYyA8IGVuZF9zcmM7IHJlbGJpdCA8PD0gMSkKLQkJICAgICAgewotCQkJaWYgKHJlbGJpdCAmIG1vZF9ieXRlKQotCQkJICB7Ci0JCQkgICAgdW5zaWduZWQgY2hhciByZWxvYyA9ICpzcmM7Ci0JCQkgICAgLyogVGhpcyBpdGVtIG5lZWRzIHRvIGJlIHJlbG9jYXRlZCAqLwotCQkJICAgIHN3aXRjaCAocmVsb2MgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQotCQkJCWJyZWFrOwotCi0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6Ci0JCQkJewotCQkJCSAgLyogUmVsb2NhdGUgdGhlIGl0ZW0gcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24gKi8KLQkJCQkgIG9hc3lzX3JlbG9jX3R5cGUgKnIgPQotCQkJCSAgKG9hc3lzX3JlbG9jX3R5cGUgKikKLQkJCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgICBzaXplb2YgKG9hc3lzX3JlbG9jX3R5cGUpKTsKLQkJCQkgIGlmICghcikKLQkJCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJCSAgKihwZXItPnJlbG9jX3RhaWxfcHRyKSA9IHI7Ci0JCQkJICBwZXItPnJlbG9jX3RhaWxfcHRyID0gJnItPm5leHQ7Ci0JCQkJICByLT5uZXh0ID0gKG9hc3lzX3JlbG9jX3R5cGUgKikgTlVMTDsKLQkJCQkgIC8qIFJlZmVyZW5jZSB0byB1bmRlZmluZWQgc3ltYm9sICovCi0JCQkJICBzcmMrKzsKLQkJCQkgIC8qIFRoZXJlIGlzIG5vIHN5bWJvbCAqLwotCQkJCSAgci0+c3ltYm9sID0gMDsKLQkJCQkgIC8qIFdvcmsgb3V0IHRoZSBob3d0byAqLwotCQkJCSAgYWJvcnQgKCk7Ci0jaWYgMAotCQkJCSAgci0+cmVsZW50LnNlY3Rpb24gPQotCQkJCSAgICBkYXRhLT5zZWN0aW9uc1tyZWxvYyAmCi0JCQkJCQkgICBSRUxPQ0FUSU9OX1NFQ1RfQklUU107Ci0KLQkJCQkgIHItPnJlbGVudC5hZGRlbmQgPSAtCi0JCQkJICAgIHItPnJlbGVudC5zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQkJCQkgIHItPnJlbGVudC5hZGRyZXNzID0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgIHItPnJlbGVudC5ob3d0byA9ICZob3d0b190YWJsZVtyZWxvYyA+PiA2XTsKLQkJCQkgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCQkJCSAgc2VjdGlvbi0+cmVsb2NfY291bnQrKzsKLQotCQkJCSAgLyogRmFrZSB1cCB0aGUgZGF0YSB0byBsb29rIGxpa2UgaXQncyBnb3QgdGhlIC12ZSBwYyBpbiBpdCwgdGhpcyBtYWtlcwotCQkJCSAgICAgICBpdCBtdWNoIGVhc2llciB0byBjb252ZXJ0IGludG8gb3RoZXIgZm9ybWF0cy4gVGhpcyBpcyBkb25lIGJ5Ci0JCQkJICAgICAgIGhpdHRpbmcgdGhlIGFkZGVuZC4KLQkJCQkgICAgICAgKi8KLQkJCQkgIGlmIChyLT5yZWxlbnQuaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0JCQkJICAgIHsKLQkJCQkgICAgICByLT5yZWxlbnQuYWRkZW5kIC09IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7Ci0JCQkJICAgIH0KLQotCi0JCQkJfQotCQkJCWJyZWFrOwotCi0KLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKLQkJCQl7Ci0JCQkJICBvYXN5c19yZWxvY190eXBlICpyID0KLQkJCQkgIChvYXN5c19yZWxvY190eXBlICopCi0JCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgc2l6ZW9mIChvYXN5c19yZWxvY190eXBlKSk7Ci0JCQkJICBpZiAoIXIpCi0JCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCQkgICoocGVyLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkJCSAgcGVyLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkJCSAgci0+bmV4dCA9IChvYXN5c19yZWxvY190eXBlICopIE5VTEw7Ci0JCQkJICAvKiBSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIHN5bWJvbCAqLwotCQkJCSAgc3JjKys7Ci0JCQkJICAvKiBHZXQgc3ltYm9sIG51bWJlciAqLwotCQkJCSAgci0+c3ltYm9sID0gKHNyY1swXSA8PCA4KSB8IHNyY1sxXTsKLQkJCQkgIC8qIFdvcmsgb3V0IHRoZSBob3d0byAqLwotCQkJCSAgYWJvcnQgKCk7Ci0KLSNpZiAwCi0JCQkJICByLT5yZWxlbnQuc2VjdGlvbiA9IChhc2VjdGlvbgotCQkJCQkJICAgICAgICopIE5VTEw7Ci0jZW5kaWYKLQkJCQkgIHItPnJlbGVudC5hZGRlbmQgPSAwOwotCQkJCSAgci0+cmVsZW50LmFkZHJlc3MgPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmhvd3RvX3RhYmxlW3JlbG9jID4+IDZdOwotCQkJCSAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0JCQkJICBzZWN0aW9uLT5yZWxvY19jb3VudCsrOwotCi0JCQkJICBzcmMgKz0gMjsKLQkJCQkgIC8qIEZha2UgdXAgdGhlIGRhdGEgdG8gbG9vayBsaWtlIGl0J3MgZ290IHRoZSAtdmUgcGMgaW4gaXQsIHRoaXMgbWFrZXMKLQkJCQkgICAgICAgaXQgbXVjaCBlYXNpZXIgdG8gY29udmVydCBpbnRvIG90aGVyIGZvcm1hdHMuIFRoaXMgaXMgZG9uZSBieQotCQkJCSAgICAgICBoaXR0aW5nIHRoZSBhZGRlbmQuCi0JCQkJICAgICAgICovCi0JCQkJICBpZiAoci0+cmVsZW50Lmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotCQkJCSAgICB7Ci0JCQkJICAgICAgci0+cmVsZW50LmFkZGVuZCAtPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgICB9Ci0KLQotCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQkJCUJGRF9GQUlMICgpOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQkqZHN0X3B0cisrID0gKnNyYysrOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9IChQVFIpCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUpKTsKLSAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPnNlY3Rpb24gPSBuZXdzZWN0OwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPm9mZnNldCA9IDA7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+aW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMTsKLSAgLyogVHVybiB0aGUgc2VjdGlvbiBzdHJpbmcgaW50byBhbiBpbmRleCAqLwotCi0gIHNzY2FuZiAobmV3c2VjdC0+bmFtZSwgIiV1IiwgJm5ld3NlY3QtPnRhcmdldF9pbmRleCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGxvbmcKLW9hc3lzX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKCEgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgb2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChvYXN5c19wZXJfc2VjdGlvbl90eXBlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpOwotICBpZiAocC0+aW5pdGlhbGl6ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgKHZvaWQpIG1lbXNldCAobG9jYXRpb24sIDAsIChpbnQpIGNvdW50KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAodm9pZCkgbWVtY3B5IChsb2NhdGlvbiwgKFBUUikgKHAtPmRhdGEgKyBvZmZzZXQpLCAoaW50KSBjb3VudCk7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1sb25nCi1vYXN5c19jYW5vbmljYWxpemVfcmVsb2MgKGlnbm9yZV9hYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBpbnQgcmVsb2NfY291bnQgPSAwOwotICBvYXN5c19yZWxvY190eXBlICpzcmMgPSAob2FzeXNfcmVsb2NfdHlwZSAqKSAoc2VjdGlvbi0+cmVsb2NhdGlvbik7Ci0gIHdoaWxlIChzcmMgIT0gKG9hc3lzX3JlbG9jX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLQotI2lmIDAKLSAgICAgIGlmIChzcmMtPnJlbGVudC5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0gc3ltYm9scyArIHNyYy0+c3ltYm9sOwotCX0KLSNlbmRpZgotCi0gICAgICAqcmVscHRyKysgPSAmc3JjLT5yZWxlbnQ7Ci0gICAgICBzcmMgPSBzcmMtPm5leHQ7Ci0gICAgICByZWxvY19jb3VudCsrOwotICAgIH0KLSAgKnJlbHB0ciA9IChhcmVsZW50ICopIE5VTEw7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudCA9IHJlbG9jX2NvdW50OwotfQotCi0KLQotCi0vKiBXcml0aW5nICovCi0KLQotLyogQ2FsY3VsYXRlIHRoZSBjaGVja3N1bSBhbmQgd3JpdGUgb25lIHJlY29yZCAqLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwgdHlwZSwgcmVjb3JkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG9hc3lzX3JlY29yZF9lbnVtX3R5cGUgdHlwZTsKLSAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKnJlY29yZDsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIGludCBjaGVja3N1bTsKLSAgc2l6ZV90IGk7Ci0gIHVuc2lnbmVkIGNoYXIgKnB0cjsKLQotICByZWNvcmQtPmhlYWRlci5sZW5ndGggPSBzaXplOwotICByZWNvcmQtPmhlYWRlci50eXBlID0gKGludCkgdHlwZTsKLSAgcmVjb3JkLT5oZWFkZXIuY2hlY2tfc3VtID0gMDsKLSAgcmVjb3JkLT5oZWFkZXIuZmlsbCA9IDA7Ci0gIHB0ciA9ICh1bnNpZ25lZCBjaGFyICopICZyZWNvcmQtPnBhZFswXTsKLSAgY2hlY2tzdW0gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGNoZWNrc3VtICs9ICpwdHIrKzsKLSAgICB9Ci0gIHJlY29yZC0+aGVhZGVyLmNoZWNrX3N1bSA9IDB4ZmYgJiAoLWNoZWNrc3VtKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcmVjb3JkLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogV3JpdGUgb3V0IGFsbCB0aGUgc3ltYm9scyAqLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX3N5bXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBhc3ltYm9sICoqZ2VuZXJpYyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpbmRleCA9IDA7Ci0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOyBjb3VudCsrKQotICAgIHsKLQotICAgICAgb2FzeXNfc3ltYm9sX3JlY29yZF90eXBlIHN5bWJvbDsKLSAgICAgIGFzeW1ib2wgKkNPTlNUIGcgPSBnZW5lcmljW2NvdW50XTsKLQotICAgICAgQ09OU1QgY2hhciAqc3JjID0gZy0+bmFtZTsKLSAgICAgIGNoYXIgKmRzdCA9IHN5bWJvbC5uYW1lOwotICAgICAgdW5zaWduZWQgaW50IGwgPSAwOwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChnLT5zZWN0aW9uKSkKLQl7Ci0JICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9DT007Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluZGV4LCBzeW1ib2wucmVmbm8pOwotCSAgaW5kZXgrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGctPnNlY3Rpb24pKQotCXsKLQkgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX0FCUzsKLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMCwgc3ltYm9sLnJlZm5vKTsKLQotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoZy0+c2VjdGlvbikpCi0JewotCSAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfVU5EOwotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbmRleCwgc3ltYm9sLnJlZm5vKTsKLQkgIC8qIE92ZXJsb2FkIHRoZSB2YWx1ZSBmaWVsZCB3aXRoIHRoZSBvdXRwdXQgaW5kZXggbnVtYmVyICovCi0JICBpbmRleCsrOwotCX0KLSAgICAgIGVsc2UgaWYgKGctPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLQl7Ci0JICAvKiB0aHJvdyBpdCBhd2F5ICovCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGctPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBTb21ldGltZSwgdGhlIG9hc3lzIHRvb2xzIGdpdmUgb3V0IGEgc3ltYm9sIHdpdGggaWxsZWdhbAotCSAgIGJpdHMgaW4gaXQsIHdlJ2xsIG91dHB1dCBpdCBpbiB0aGUgc2FtZSBicm9rZW4gd2F5ICovCi0KLQkgICAgICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9SRUwgfCAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9SRUwgfCBnLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgICB9Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIDAsIHN5bWJvbC5yZWZubyk7Ci0JfQotI2lmZGVmIFVOREVSU0NPUkVfSEFDSwotICAgICAgaWYgKHNyY1tsXSA9PSAnXycpCi0JZHN0W2wrK10gPSAnLic7Ci0jZW5kaWYKLSAgICAgIHdoaWxlIChzcmNbbF0pCi0JewotCSAgZHN0W2xdID0gc3JjW2xdOwotCSAgbCsrOwotCX0KLQotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBnLT52YWx1ZSwgc3ltYm9sLnZhbHVlKTsKLQotCi0gICAgICBpZiAoZy0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JewotCSAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJCSAgICBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bSwKLQkJCQkgICAgKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgc3ltYm9sLAotCQkJCSAgICBvZmZzZXRvZiAob2FzeXNfc3ltYm9sX3JlY29yZF90eXBlLAotCQkJCQkgICAgICBuYW1lWzBdKSArIGwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCQkgICAgb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtLAotCQkJCSAgICAob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiBzeW1ib2wsCi0JCQkJICAgIG9mZnNldG9mIChvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUsCi0JCQkJCSAgICAgIG5hbWVbMF0pICsgbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBnLT52YWx1ZSA9IGluZGV4IC0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotIC8qIFdyaXRlIGEgc2VjdGlvbiBoZWFkZXIgZm9yIGVhY2ggc2VjdGlvbiAqLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBzdGF0aWMgb2FzeXNfc2VjdGlvbl9yZWNvcmRfdHlwZSBvdXQ7Ci0KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHMtPm5hbWVbMF0pKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYCVzJyBpbiBvYXN5cyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHMtPm5hbWUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgb3V0LnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfUkVMIHwgcy0+dGFyZ2V0X2luZGV4OwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzLT5fY29va2VkX3NpemUsIG91dC52YWx1ZSk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHMtPnZtYSwgb3V0LnZtYSk7Ci0KLSAgICAgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCQlvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtLAotCQkJCShvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIG91dCwKLQkJCQlzaXplb2YgKG91dCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIENyZWF0ZSBhbmQgd3JpdGUgdGhlIGhlYWRlciAqLwotICBvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGUgcjsKLSAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbiAoYWJmZC0+ZmlsZW5hbWUpOwotICBpZiAobGVuZ3RoID4gKHNpemVfdCkgc2l6ZW9mIChyLm1vZHVsZV9uYW1lKSkKLSAgICB7Ci0gICAgICBsZW5ndGggPSBzaXplb2YgKHIubW9kdWxlX25hbWUpOwotICAgIH0KLQotICAodm9pZCkgbWVtY3B5IChyLm1vZHVsZV9uYW1lLAotCQkgYWJmZC0+ZmlsZW5hbWUsCi0JCSBsZW5ndGgpOwotICAodm9pZCkgbWVtc2V0IChyLm1vZHVsZV9uYW1lICsgbGVuZ3RoLAotCQkgJyAnLAotCQkgc2l6ZW9mIChyLm1vZHVsZV9uYW1lKSAtIGxlbmd0aCk7Ci0KLSAgci52ZXJzaW9uX251bWJlciA9IE9BU1lTX1ZFUlNJT05fTlVNQkVSOwotICByLnJldl9udW1iZXIgPSBPQVNZU19SRVZfTlVNQkVSOwotICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkgICAgb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtLAotCQkJICAgIChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIHIsCi0JCQkgICAgb2Zmc2V0b2YgKG9hc3lzX2hlYWRlcl9yZWNvcmRfdHlwZSwKLQkJCQkgICAgICBkZXNjcmlwdGlvblswXSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX2VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBvYXN5c19lbmRfcmVjb3JkX3R5cGUgZW5kOwotICB1bnNpZ25lZCBjaGFyIG51bGwgPSAwOwotICBlbmQucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9BQlM7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYWJmZC0+c3RhcnRfYWRkcmVzcywgZW5kLmVudHJ5KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAwLCBlbmQuZmlsbCk7Ci0gIGVuZC56ZXJvID0gMDsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJICAgIG9hc3lzX3JlY29yZF9pc19lbmRfZW51bSwKLQkJCSAgICAob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiBlbmQsCi0JCQkgICAgc2l6ZW9mIChlbmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICYgbnVsbCwgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1jb21wIChhcCwgYnApCi0gICAgIENPTlNUIFBUUiBhcDsKLSAgICAgQ09OU1QgUFRSIGJwOwotewotICBhcmVsZW50ICphID0gKigoYXJlbGVudCAqKikgYXApOwotICBhcmVsZW50ICpiID0gKigoYXJlbGVudCAqKikgYnApOwotICByZXR1cm4gYS0+YWRkcmVzcyAtIGItPmFkZHJlc3M7Ci19Ci0KLS8qCi0gV3JpdGluZyBkYXRhLi4KLQotKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9kYXRhIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCi0JewotCSAgYmZkX2J5dGUgKnJhd19kYXRhID0gb2FzeXNfcGVyX3NlY3Rpb24gKHMpLT5kYXRhOwotCSAgb2FzeXNfZGF0YV9yZWNvcmRfdHlwZSBwcm9jZXNzZWRfZGF0YTsKLQkgIGJmZF9zaXplX3R5cGUgY3VycmVudF9ieXRlX2luZGV4ID0gMDsKLQkgIHVuc2lnbmVkIGludCByZWxvY3NfdG9fZ28gPSBzLT5yZWxvY19jb3VudDsKLQkgIGFyZWxlbnQgKipwID0gcy0+b3JlbG9jYXRpb247Ci0JICBpZiAocy0+cmVsb2NfY291bnQgIT0gMCkKLQkgICAgewotLyogU29ydCB0aGUgcmVsb2MgcmVjb3JkcyBzbyBpdCdzIGVhc3kgdG8gaW5zZXJ0IHRoZSByZWxvY3MgaW50byB0aGUKLQkgICBkYXRhICovCi0KLQkgICAgICBxc29ydCAocy0+b3JlbG9jYXRpb24sCi0JCSAgICAgcy0+cmVsb2NfY291bnQsCi0JCSAgICAgc2l6ZW9mIChhcmVsZW50ICoqKSwKLQkJICAgICBjb21wKTsKLQkgICAgfQotCSAgY3VycmVudF9ieXRlX2luZGV4ID0gMDsKLQkgIHByb2Nlc3NlZF9kYXRhLnJlbGIgPSBzLT50YXJnZXRfaW5kZXggfCBSRUxPQ0FUSU9OX1RZUEVfUkVMOwotCi0JICB3aGlsZSAoY3VycmVudF9ieXRlX2luZGV4IDwgcy0+X2Nvb2tlZF9zaXplKQotCSAgICB7Ci0JICAgICAgLyogU2NhbiBmb3J3YXJkcyBieSBlaWdodCBieXRlcyBvciBob3dldmVyIG11Y2ggaXMgbGVmdCBhbmQgc2VlIGlmCi0JICAgICAgIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbnMgZ29pbmcgb24gKi8KLQkgICAgICBiZmRfYnl0ZSAqbW9kID0gJnByb2Nlc3NlZF9kYXRhLmRhdGFbMF07Ci0JICAgICAgYmZkX2J5dGUgKmRzdCA9ICZwcm9jZXNzZWRfZGF0YS5kYXRhWzFdOwotCi0JICAgICAgdW5zaWduZWQgaW50IGkgPSAwOwotCSAgICAgICptb2QgPSAwOwotCi0KLQkgICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHMtPnZtYSArIGN1cnJlbnRfYnl0ZV9pbmRleCwKLQkJCSAgICBwcm9jZXNzZWRfZGF0YS5hZGRyKTsKLQotCSAgICAgIC8qIERvbid0IHN0YXJ0IGEgcmVsb2NhdGlvbiB1bmxlc3MgeW91J3JlIHN1cmUgeW91IGNhbiBmaW5pc2ggaXQKLSAJICAgICAgIHdpdGhpbiB0aGUgc2FtZSBkYXRhIHJlY29yZC4gIFRoZSB3b3JzdCBjYXNlIHJlbG9jYXRpb24gaXMgYQotIAkgICAgICAgNC1ieXRlIHJlbG9jYXRhYmxlIHZhbHVlIHdoaWNoIGlzIHNwbGl0IGFjcm9zcyB0d28gbW9kaWZpY2F0aW9uCi0gCSAgICAgICBieXRlcyAoMSByZWxvY2F0aW9uIGJ5dGUgKyAyIHN5bWJvbCByZWZlcmVuY2UgYnl0ZXMgKyAyIGRhdGEgKwotIAkgICAgICAgMSBtb2RpZmljYXRpb24gYnl0ZSArIDIgZGF0YSA9IDggYnl0ZXMgdG90YWwpLiAgVGhhdCdzIHdoZXJlCi0gCSAgICAgICB0aGUgbWFnaWMgbnVtYmVyIDggY29tZXMgZnJvbS4KLSAJICAgICovCi0JICAgICAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9yYXdfc2l6ZSAmJiBkc3QgPD0KLQkJICAgICAmcHJvY2Vzc2VkX2RhdGEuZGF0YVtzaXplb2YgKHByb2Nlc3NlZF9kYXRhLmRhdGEpIC0gOF0pCi0JCXsKLQotCi0JCSAgaWYgKHJlbG9jc190b19nbyAhPSAwKQotCQkgICAgewotCQkgICAgICBhcmVsZW50ICpyID0gKnA7Ci0JCSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmNvbnN0IGhvdyA9IHItPmhvd3RvOwotCQkgICAgICAvKiBUaGVyZSBpcyBhIHJlbG9jYXRpb24sIGlzIGl0IGZvciB0aGlzIGJ5dGUgPyAqLwotCQkgICAgICBpZiAoci0+YWRkcmVzcyA9PSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JCQl7Ci0JCQkgIHVuc2lnbmVkIGNoYXIgcmVsX2J5dGU7Ci0KLQkJCSAgcCsrOwotCQkJICByZWxvY3NfdG9fZ28tLTsKLQotCQkJICAqbW9kIHw9ICgxIDw8IGkpOwotCQkJICBpZiAoaG93LT5wY19yZWxhdGl2ZSkKLQkJCSAgICB7Ci0JCQkgICAgICByZWxfYnl0ZSA9IFJFTE9DQVRJT05fUENSRUxfQklUOwotCi0JCQkgICAgICAvKiBBbHNvIHBhdGNoIHRoZSByYXcgZGF0YSBzbyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQotCQkJIHRoZSAtdmUgc3R1ZmYgYW55IG1vcmUgKi8KLQkJCSAgICAgIGlmIChob3ctPnNpemUgIT0gMikKLQkJCQl7Ci0JCQkJICBiZmRfcHV0XzE2IChhYmZkLAotCQkJCQkgICAgICBiZmRfZ2V0XzE2IChhYmZkLCByYXdfZGF0YSkgKwotCQkJCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXgsIHJhd19kYXRhKTsKLQkJCQl9Ci0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBiZmRfcHV0XzMyIChhYmZkLAotCQkJCQkgICAgICBiZmRfZ2V0XzMyIChhYmZkLCByYXdfZGF0YSkgKwotCQkJCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXgsIHJhd19kYXRhKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgcmVsX2J5dGUgPSAwOwotCQkJICAgIH0KLQkJCSAgaWYgKGhvdy0+c2l6ZSA9PSAyKQotCQkJICAgIHsKLQkJCSAgICAgIHJlbF9ieXRlIHw9IFJFTE9DQVRJT05fMzJCSVRfQklUOwotCQkJICAgIH0KLQotCQkJICAvKiBJcyB0aGlzIGEgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLCBvciBhIHN5bWJvbAotCQkgICAgICAgcmVsYXRpdmUgcmVsb2NhdGlvbiA/ICovCi0JCQkgIGFib3J0ICgpOwotCi0jaWYgMAotCQkJICBpZiAoci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBUaGUgcmVsZW50IGhhcyBhIHNlY3Rpb24gYXR0YWNoZWQsIHNvIGl0IG11c3QgYmUgc2VjdGlvbgotCQkJICAgICByZWxhdGl2ZSAqLwotCQkJICAgICAgcmVsX2J5dGUgfD0gUkVMT0NBVElPTl9UWVBFX1JFTDsKLQkJCSAgICAgIHJlbF9ieXRlIHw9IHItPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JCQkgICAgICAqZHN0KysgPSByZWxfYnl0ZTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLSNlbmRpZgotCQkJICAgIHsKLQkJCSAgICAgIGFzeW1ib2wgKnAgPSAqKHItPnN5bV9wdHJfcHRyKTsKLQotCQkJICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaGFzIGEgc2VjdGlvbiBhdHRhY2hlZCwgdGhlbiBpdAotCQkJICAgICBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLiAgQ2hhbmdlIGZyb20gYSBzeW1ib2wKLQkJCSAgICAgcmVmIHRvIGEgc2VjdGlvbiByZWYgKi8KLQkJCSAgICAgIGlmIChwLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCQkJCXsKLQkJCQkgIHJlbF9ieXRlIHw9IFJFTE9DQVRJT05fVFlQRV9SRUw7Ci0JCQkJICByZWxfYnl0ZSB8PQotCQkJCSAgICBwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkJCSAgKmRzdCsrID0gcmVsX2J5dGU7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIHJlbF9ieXRlIHw9IFJFTE9DQVRJT05fVFlQRV9VTkQ7Ci0JCQkJICAqZHN0KysgPSByZWxfYnl0ZTsKLQkJCQkgIC8qIE5leHQgdHdvIGJ5dGVzIGFyZSBhIHN5bWJvbCBpbmRleCAtIHdlIGNhbiBnZXQKLQkJCSAgICAgICB0aGlzIGZyb20gdGhlIHN5bWJvbCB2YWx1ZSB3aGljaCBoYXMgYmVlbiB6YXBwZWQKLQkJCSAgICAgICBpbnRvIHRoZSBzeW1ib2wgaW5kZXggaW4gdGhlIHRhYmxlIHdoZW4gdGhlCi0JCQkgICAgICAgc3ltYm9sIHRhYmxlIHdhcyB3cml0dGVuCi0JCQkgICAgICAgKi8KLQkJCQkgICpkc3QrKyA9IHAtPnZhbHVlID4+IDg7Ci0JCQkJICAqZHN0KysgPSBwLT52YWx1ZTsKLQkJCQl9Ci0JCQkgICAgfQotI2RlZmluZSBBRFZBTkNFIHsgaWYgKCsraSA+PSA4KSB7IGkgPSAwOyBtb2QgPSBkc3QrKzsgKm1vZCA9IDA7IH0gY3VycmVudF9ieXRlX2luZGV4Kys7IH0KLQkJCSAgLyogcmVsb2NhdGlvbnMgbmV2ZXIgb2NjdXIgZnJvbSBhbiB1bmxvYWRhYmxlIHNlY3Rpb24sCi0JCSAgICAgICBzbyB3ZSBjYW4gYXNzdW1lIHRoYXQgcmF3X2RhdGEgaXMgbm90IE5VTEwKLQkJICAgICAqLwotCQkJICAqZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJCSAgQURWQU5DRQotCQkJICAgICogZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJCSAgQURWQU5DRQotCQkJICAgIGlmIChob3ctPnNpemUgPT0gMikKLQkJCSAgICB7Ci0JCQkgICAgICAqZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJCSAgICAgIEFEVkFOQ0UKLQkJCQkqIGRzdCsrID0gKnJhd19kYXRhKys7Ci0JCQkgICAgICBBRFZBTkNFCi0JCQkgICAgfQotCQkJICBjb250aW51ZTsKLQkJCX0KLQkJICAgIH0KLQkJICAvKiBJZiB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIHVubG9hZGFibGUgc2VjdGlvbiB0aGVuIGNvcHkKLQkJICAgemVyb3MgKi8KLQkJICBpZiAocmF3X2RhdGEgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgKmRzdCsrID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgICpkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkgICAgfQotCQkgIEFEVkFOQ0UKLQkJfQotCi0JICAgICAgLyogRG9uJ3Qgd3JpdGUgYSB1c2VsZXNzIG51bGwgbW9kaWZpY2F0aW9uIGJ5dGUgKi8KLQkgICAgICBpZiAoZHN0ID09IG1vZCArIDEpCi0JCXsKLQkJICAtLWRzdDsKLQkJfQotCi0JICAgICAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJCQlvYXN5c19yZWNvcmRfaXNfZGF0YV9lbnVtLAotCQkJCQkoKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopCi0JCQkJCSAmIHByb2Nlc3NlZF9kYXRhKSwKLQkJCQkJZHN0IC0gKGJmZF9ieXRlICopICYgcHJvY2Vzc2VkX2RhdGEpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghIG9hc3lzX3dyaXRlX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBvYXN5c193cml0ZV9zeW1zIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIG9hc3lzX3dyaXRlX3NlY3Rpb25zIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIG9hc3lzX3dyaXRlX2RhdGEgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfZW5kIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotCi0vKiogZXhlYyBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLS8qIHNldCBzZWN0aW9uIGNvbnRlbnRzIGlzIGNvbXBsaWNhdGVkIHdpdGggT0FTWVMgc2luY2UgdGhlIGZvcm1hdCBpcwotKiBub3QgYSBieXRlIGltYWdlLCBidXQgYSByZWNvcmQgc3RyZWFtLgotKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgaWYgKG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQl7Ci0JICBvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgPQotCSAgICAoYmZkX2J5dGUgKikgKGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbi0+X2Nvb2tlZF9zaXplKSk7Ci0JICBpZiAoIW9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICh2b2lkKSBtZW1jcHkgKChQVFIpIChvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgKyBvZmZzZXQpLAotCQkgICAgIGxvY2F0aW9uLAotCQkgICAgIChzaXplX3QpIGNvdW50KTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotLyogTmF0aXZlLWxldmVsIGludGVyZmFjZSB0byBzeW1ib2xzLiAqLwotCi0vKiBXZSByZWFkIHRoZSBzeW1ib2xzIGludG8gYSBidWZmZXIsIHdoaWNoIGlzIGRpc2NhcmRlZCB3aGVuIHRoaXMKLWZ1bmN0aW9uIGV4aXRzLiAgV2UgcmVhZCB0aGUgc3RyaW5ncyBpbnRvIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0bwotaG9sZCB0aGVtIGFsbCBwbHVzIGFsbCB0aGUgY2FjaGVkIHN5bWJvbCBlbnRyaWVzLiAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1vYXN5c19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi0gIG9hc3lzX3N5bWJvbF90eXBlICpuZXcgPQotICAob2FzeXNfc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19zeW1ib2xfdHlwZSkpOwotICBpZiAoIW5ldykKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0MCi0KLQotCi0vKiBVc2VyIHNob3VsZCBoYXZlIGNoZWNrZWQgdGhlIGZpbGUgZmxhZ3M7IHBlcmhhcHMgd2Ugc2hvdWxkIHJldHVybgotQkZEX05PX01PUkVfU1lNQk9MUyBpZiB0aGVyZSBhcmUgbm9uZT8gKi8KLQotc3RhdGljIGJmZCAqCi1vYXN5c19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIHByZXYpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgYmZkICpwcmV2OwotewotICBvYXN5c19hcl9kYXRhX3R5cGUgKmFyID0gT0FTWVNfQVJfREFUQSAoYXJjaCk7Ci0gIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKnA7Ci0gIC8qIHRha2UgdGhlIG5leHQgb25lIGZyb20gdGhlIGFyY2ggc3RhdGUsIG9yIHJlc2V0ICovCi0gIGlmIChwcmV2ID09IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZXNldCB0aGUgaW5kZXggLSB0aGUgZmlyc3QgdHdvIGVudHJpZXMgYXJlIGJvZ3VzKi8KLSAgICAgIGFyLT5tb2R1bGVfaW5kZXggPSAwOwotICAgIH0KLQotICBwID0gYXItPm1vZHVsZSArIGFyLT5tb2R1bGVfaW5kZXg7Ci0gIGFyLT5tb2R1bGVfaW5kZXgrKzsKLQotICBpZiAoYXItPm1vZHVsZV9pbmRleCA8PSBhci0+bW9kdWxlX2NvdW50KQotICAgIHsKLSAgICAgIGlmIChwLT5hYmZkID09IChiZmQgKikgTlVMTCkKLQl7Ci0JICBwLT5hYmZkID0gX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIChhcmNoKTsKLQkgIHAtPmFiZmQtPm9yaWdpbiA9IHAtPnBvczsKLQkgIHAtPmFiZmQtPmZpbGVuYW1lID0gcC0+bmFtZTsKLQotCSAgLyogRml4dXAgYSBwb2ludGVyIHRvIHRoaXMgZWxlbWVudCBmb3IgdGhlIG1lbWJlciAqLwotCSAgcC0+YWJmZC0+YXJlbHRfZGF0YSA9IChQVFIpIHA7Ci0JfQotICAgICAgcmV0dXJuIHAtPmFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotICAgICAgcmV0dXJuIChiZmQgKikgTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCSBzZWN0aW9uLAotCQkJIHN5bWJvbHMsCi0JCQkgb2Zmc2V0LAotCQkJIGZpbGVuYW1lX3B0ciwKLQkJCSBmdW5jdGlvbm5hbWVfcHRyLAotCQkJIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmZpbGVuYW1lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmYWxzZTsKLQotfQotCi1zdGF0aWMgaW50Ci1vYXN5c19nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2QgPSAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKSBhYmZkLT5hcmVsdF9kYXRhOwotICBpZiAobW9kID09IChvYXN5c19tb2R1bGVfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYtPnN0X3NpemUgPSBtb2QtPnNpemU7Ci0gICAgICBidWYtPnN0X21vZGUgPSAwNjY2OwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1vYXN5c19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotI2RlZmluZQlvYXN5c19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgb2FzeXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgb2FzeXNfc2x1cnBfYXJtYXAgYmZkX3RydWUKLSNkZWZpbmUgb2FzeXNfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfdHJ1ZQotI2RlZmluZSBvYXN5c19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgb2FzeXNfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBvYXN5c193cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIG9hc3lzX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBvYXN5c19nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIG9hc3lzX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotI2RlZmluZSBvYXN5c19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG9hc3lzX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBvYXN5c19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIG9hc3lzX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgb2FzeXNfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgb2FzeXNfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgb2FzeXNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgb2FzeXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIG9hc3lzX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgb2FzeXNfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBvYXN5c19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgb2FzeXNfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qU1VQUFJFU1MgNDYwICovCi1jb25zdCBiZmRfdGFyZ2V0IG9hc3lzX3ZlYyA9Ci17Ci0gICJvYXN5cyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwKLSAgIG9hc3lzX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgb2FzeXNfYXJjaGl2ZV9wLAotICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgb2FzeXNfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgb2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvb3BuY2xzLmMgYi9iZmQvb3BuY2xzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMTAxMzUuLjAwMDAwMDAKLS0tIGEvYmZkL29wbmNscy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLS8qIG9wbmNscy5jIC0tIG9wZW4gYW5kIGNsb3NlIGEgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib2JqYWxsb2MuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotI2lmbmRlZiBTX0lYR1JQCi0jZGVmaW5lIFNfSVhHUlAgMDAxMAkvKiBFeGVjdXRlIGJ5IGdyb3VwLiAgKi8KLSNlbmRpZgotI2lmbmRlZiBTX0lYT1RICi0jZGVmaW5lIFNfSVhPVEggMDAwMQkvKiBFeGVjdXRlIGJ5IG90aGVycy4gICovCi0jZW5kaWYKLQotLyogZmRvcGVuIGlzIGEgbG9zZXIgLS0gd2Ugc2hvdWxkIHVzZSBzdGRpbyBleGNsdXNpdmVseS4gIFVuZm9ydHVuYXRlbHkKLSAgIGlmIHdlIGRvIHRoYXQgd2UgY2FuJ3QgdXNlIGZjbnRsLiAgKi8KLQotLyogRklYTUU6IFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuICAqLwotbG9uZyBfYmZkX2NodW5rc2l6ZSA9IC0xOwotCi0vKiBSZXR1cm4gYSBuZXcgQkZELiAgQWxsIEJGRCdzIGFyZSBhbGxvY2F0ZWQgdGhyb3VnaCB0aGlzIHJvdXRpbmUuICAqLwotCi1iZmQgKgotX2JmZF9uZXdfYmZkICgpCi17Ci0gIGJmZCAqbmJmZDsKLQotICBuYmZkID0gKGJmZCAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChiZmQpKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBuYmZkLT5tZW1vcnkgPSAoUFRSKSBvYmphbGxvY19jcmVhdGUgKCk7Ci0gIGlmIChuYmZkLT5tZW1vcnkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0KLSAgbmJmZC0+ZGlyZWN0aW9uID0gbm9fZGlyZWN0aW9uOwotICBuYmZkLT5pb3N0cmVhbSA9IE5VTEw7Ci0gIG5iZmQtPndoZXJlID0gMDsKLSAgbmJmZC0+c2VjdGlvbnMgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgbmJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gIG5iZmQtPm15X2FyY2hpdmUgPSAoYmZkICopIE5VTEw7Ci0gIG5iZmQtPm9yaWdpbiA9IDA7CQkJCQotICBuYmZkLT5vcGVuZWRfb25jZSA9IGZhbHNlOwotICBuYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gIG5iZmQtPnNlY3Rpb25fY291bnQgPSAwOwotICBuYmZkLT51c3JkYXRhID0gKFBUUikgTlVMTDsKLSAgbmJmZC0+Y2FjaGVhYmxlID0gZmFsc2U7Ci0gIG5iZmQtPmZsYWdzID0gQkZEX05PX0ZMQUdTOwotICBuYmZkLT5tdGltZV9zZXQgPSBmYWxzZTsKLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyogQWxsb2NhdGUgYSBuZXcgQkZEIGFzIGEgbWVtYmVyIG9mIGFyY2hpdmUgT0JGRC4gICovCi0KLWJmZCAqCi1fYmZkX25ld19iZmRfY29udGFpbmVkX2luIChvYmZkKQotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGJmZCAqbmJmZDsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBuYmZkLT54dmVjID0gb2JmZC0+eHZlYzsKLSAgbmJmZC0+bXlfYXJjaGl2ZSA9IG9iZmQ7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOwotICBuYmZkLT50YXJnZXRfZGVmYXVsdGVkID0gb2JmZC0+dGFyZ2V0X2RlZmF1bHRlZDsKLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi1TRUNUSU9OCi0JT3BlbmluZyBhbmQgY2xvc2luZyBCRkRzCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9vcGVucgotCi1TWU5PUFNJUwotICAgICAgICBiZmQgKmJmZF9vcGVucihDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0KTsKLQotREVTQ1JJUFRJT04KLQlPcGVuIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9ICh1c2luZyA8PGZvcGVuPj4pIHdpdGggdGhlIHRhcmdldAotCUB2YXJ7dGFyZ2V0fS4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgQkZELgotCi0JQ2FsbHMgPDxiZmRfZmluZF90YXJnZXQ+Piwgc28gQHZhcnt0YXJnZXR9IGlzIGludGVycHJldGVkIGFzIGJ5Ci0JdGhhdCBmdW5jdGlvbi4KLQotCUlmIDw8TlVMTD4+IGlzIHJldHVybmVkIHRoZW4gYW4gZXJyb3IgaGFzIG9jY3VyZWQuICAgUG9zc2libGUgZXJyb3JzCi0JYXJlIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+LCA8PGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldD4+IG9yIDw8c3lzdGVtX2NhbGw+PiBlcnJvci4KLSovCi0KLWJmZCAqCi1iZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOwotCi0gIGlmIChiZmRfb3Blbl9maWxlIChuYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZpbGUgZGlkbid0IGV4aXN0LCBvciBzb21lIHN1Y2ggKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyogRG9uJ3QgdHJ5IHRvIGBvcHRpbWl6ZScgdGhpcyBmdW5jdGlvbjoKLQotICAgbyAtIFdlIGxvY2sgdXNpbmcgc3RhY2sgc3BhY2Ugc28gdGhhdCBpbnRlcnJ1cHRpbmcgdGhlIGxvY2tpbmcKLSAgICAgICB3b24ndCBjYXVzZSBhIHN0b3JhZ2UgbGVhay4KLSAgIG8gLSBXZSBvcGVuIHRoZSBmaWxlIHN0cmVhbSBsYXN0LCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGhhdmUgdG8KLSAgICAgICBjbG9zZSBpdCBpZiBhbnl0aGluZyBnb2VzIHdyb25nLiAgQ2xvc2luZyB0aGUgc3RyZWFtIG1lYW5zIGNsb3NpbmcKLSAgICAgICB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvbywgZXZlbiB0aG91Z2ggd2UgZGlkbid0IG9wZW4gaXQuCi0gKi8KLS8qCi1GVU5DVElPTgotICAgICAgICAgYmZkX2Zkb3BlbnIKLQotU1lOT1BTSVMKLSAgICAgICAgIGJmZCAqYmZkX2Zkb3BlbnIoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCwgaW50IGZkKTsKLQotREVTQ1JJUFRJT04KLSAgICAgICAgIDw8YmZkX2Zkb3BlbnI+PiBpcyB0byA8PGJmZF9mb3BlbnI+PiBtdWNoIGxpa2UgPDxmZG9wZW4+PiBpcyB0byA8PGZvcGVuPj4uCi0JIEl0IG9wZW5zIGEgQkZEIG9uIGEgZmlsZSBhbHJlYWR5IGRlc2NyaWJlZCBieSB0aGUgQHZhcntmZH0KLQkgc3VwcGxpZWQuCi0KLQkgV2hlbiB0aGUgZmlsZSBpcyBsYXRlciA8PGJmZF9jbG9zZT4+ZCwgdGhlIGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIGNsb3NlZC4KLQotCSBJZiB0aGUgY2FsbGVyIGRlc2lyZXMgdGhhdCB0aGlzIGZpbGUgZGVzY3JpcHRvciBiZSBjYWNoZWQgYnkgQkZECi0JIChvcGVuZWQgYXMgbmVlZGVkLCBjbG9zZWQgYXMgbmVlZGVkIHRvIGZyZWUgZGVzY3JpcHRvcnMgZm9yCi0JIG90aGVyIG9wZW5zKSwgd2l0aCB0aGUgc3VwcGxpZWQgQHZhcntmZH0gdXNlZCBhcyBhbiBpbml0aWFsCi0JIGZpbGUgZGVzY3JpcHRvciAoYnV0IHN1YmplY3QgdG8gY2xvc3VyZSBhdCBhbnkgdGltZSksIGNhbGwKLQkgYmZkX3NldF9jYWNoZWFibGUoYmZkLCAxKSBvbiB0aGUgcmV0dXJuZWQgQkZELiAgVGhlIGRlZmF1bHQgaXMgdG8KLQkgYXNzdW1lIG5vIGNhY2hlaW5nOyB0aGUgZmlsZSBkZXNjcmlwdG9yIHdpbGwgcmVtYWluIG9wZW4gdW50aWwKLQkgPDxiZmRfY2xvc2U+PiwgYW5kIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IEJGRCBvcGVyYXRpb25zIG9uIG90aGVyCi0JIGZpbGVzLgotCi0gICAgICAgICBQb3NzaWJsZSBlcnJvcnMgYXJlIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+LCA8PGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldD4+IGFuZCA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LgotKi8KLQotYmZkICoKLWJmZF9mZG9wZW5yIChmaWxlbmFtZSwgdGFyZ2V0LCBmZCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLSAgICAgaW50IGZkOwotewotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0gIGludCBmZGZsYWdzOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0jaWYgISBkZWZpbmVkKEhBVkVfRkNOVEwpIHx8ICEgZGVmaW5lZChGX0dFVEZMKQotICBmZGZsYWdzID0gT19SRFdSOwkJCS8qIEFzc3VtZSBmdWxsIGFjY2VzcyAqLwotI2Vsc2UKLSAgZmRmbGFncyA9IGZjbnRsIChmZCwgRl9HRVRGTCwgTlVMTCk7Ci0jZW5kaWYKLSAgaWYgKGZkZmxhZ3MgPT0gLTEpIHJldHVybiBOVUxMOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSNpZm5kZWYgSEFWRV9GRE9QRU4KLSAgbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1JCKTsKLSNlbHNlCi0gIC8qIChPX0FDQ01PREUpIHBhcmVucyBhcmUgdG8gYXZvaWQgVWx0cml4IGhlYWRlciBmaWxlIGJ1ZyAqLwotICBzd2l0Y2ggKGZkZmxhZ3MgJiAoT19BQ0NNT0RFKSkKLSAgICB7Ci0gICAgY2FzZSBPX1JET05MWTogbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmZG9wZW4gKGZkLCBGT1BFTl9SQik7ICAgYnJlYWs7Ci0gICAgY2FzZSBPX1dST05MWTogbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmZG9wZW4gKGZkLCBGT1BFTl9SVUIpOyAgYnJlYWs7Ci0gICAgY2FzZSBPX1JEV1I6ICAgbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmZG9wZW4gKGZkLCBGT1BFTl9SVUIpOyAgYnJlYWs7Ci0gICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKG5iZmQtPmlvc3RyZWFtID09IE5VTEwpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIHB1dCBldmVyeXRoaW5nIHdoZXJlIGl0IGJlbG9uZ3MgKi8KLQotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotCi0gIC8qIEFzIGEgc3BlY2lhbCBjYXNlIHdlIGFsbG93IGEgRkQgb3BlbiBmb3IgcmVhZC93cml0ZSB0bwotICAgICBiZSB3cml0dGVuIHRocm91Z2gsIGFsdGhvdWdoIGRvaW5nIHNvIHJlcXVpcmVzIHRoYXQgd2UgZW5kCi0gICAgIHRoZSBwcmV2aW91cyBjbGF1c2Ugd2l0aCBhIHByZXBvc2l0aW9uLiAgKi8KLSAgLyogKE9fQUNDTU9ERSkgcGFyZW5zIGFyZSB0byBhdm9pZCBVbHRyaXggaGVhZGVyIGZpbGUgYnVnICovCi0gIHN3aXRjaCAoZmRmbGFncyAmIE9fQUNDTU9ERSkKLSAgICB7Ci0gICAgY2FzZSBPX1JET05MWTogbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247IGJyZWFrOwotICAgIGNhc2UgT19XUk9OTFk6IG5iZmQtPmRpcmVjdGlvbiA9IHdyaXRlX2RpcmVjdGlvbjsgYnJlYWs7Ci0gICAgY2FzZSBPX1JEV1I6IG5iZmQtPmRpcmVjdGlvbiA9IGJvdGhfZGlyZWN0aW9uOyBicmVhazsKLSAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2NhY2hlX2luaXQgKG5iZmQpKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBuYmZkLT5vcGVuZWRfb25jZSA9IHRydWU7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9vcGVuc3RyZWFtcgotCi1TWU5PUFNJUwotCWJmZCAqYmZkX29wZW5zdHJlYW1yKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBQVFIpOwotCi1ERVNDUklQVElPTgotCi0JT3BlbiBhIEJGRCBmb3IgcmVhZCBhY2Nlc3Mgb24gYW4gZXhpc3Rpbmcgc3RkaW8gc3RyZWFtLiAgV2hlbgotCXRoZSBCRkQgaXMgcGFzc2VkIHRvIDw8YmZkX2Nsb3NlPj4sIHRoZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQuCi0qLwotCi1iZmQgKgotYmZkX29wZW5zdHJlYW1yIChmaWxlbmFtZSwgdGFyZ2V0LCBzdHJlYW1hcmcpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci0gICAgIFBUUiBzdHJlYW1hcmc7Ci17Ci0gIEZJTEUgKnN0cmVhbSA9IChGSUxFICopIHN0cmVhbWFyZzsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBzdHJlYW07Ci0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOwotCQkJCQotICBpZiAoISBiZmRfY2FjaGVfaW5pdCAobmJmZCkpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0MCi0vKiogYmZkX29wZW53IC0tIG9wZW4gZm9yIHdyaXRpbmcuCi0gIFJldHVybnMgYSBwb2ludGVyIHRvIGEgZnJlc2hseS1hbGxvY2F0ZWQgQkZEIG9uIHN1Y2Nlc3MsIG9yIE5VTEwuCi0KLSAgU2VlIGNvbW1lbnQgYnkgYmZkX2Zkb3BlbnIgYmVmb3JlIHlvdSB0cnkgdG8gbW9kaWZ5IHRoaXMgZnVuY3Rpb24uICovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9vcGVudwotCi1TWU5PUFNJUwotCWJmZCAqYmZkX29wZW53KENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIEJGRCwgYXNzb2NpYXRlZCB3aXRoIGZpbGUgQHZhcntmaWxlbmFtZX0sIHVzaW5nIHRoZQotCWZpbGUgZm9ybWF0IEB2YXJ7dGFyZ2V0fSwgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0KLQlQb3NzaWJsZSBlcnJvcnMgYXJlIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4sIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+LAotCTw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4uCi0qLwotCi1iZmQgKgotYmZkX29wZW53IChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQotICAvKiBuYmZkIGhhcyB0byBwb2ludCB0byBoZWFkIG9mIG1hbGxvYydlZCBibG9jayBzbyB0aGF0IGJmZF9jbG9zZSBtYXkKLSAgICAgcmVjbGFpbSBpdCBjb3JyZWN0bHkuICovCi0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IHdyaXRlX2RpcmVjdGlvbjsKLQotICBpZiAoYmZkX29wZW5fZmlsZSAobmJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwkvKiBGaWxlIG5vdCB3cml0ZWFibGUsIGV0YyAqLwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKgotCi1GVU5DVElPTgotCWJmZF9jbG9zZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2Nsb3NlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlDbG9zZSBhIEJGRC4gSWYgdGhlIEJGRCB3YXMgb3BlbiBmb3Igd3JpdGluZywKLQl0aGVuIHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgY29tcGxldGVkIGFuZCB0aGUgZmlsZSB3cml0dGVuIG91dAotCWFuZCBjbG9zZWQuIElmIHRoZSBjcmVhdGVkIGZpbGUgaXMgZXhlY3V0YWJsZSwgdGhlbgotCTw8Y2htb2Q+PiBpcyBjYWxsZWQgdG8gbWFyayBpdCBhcyBzdWNoLgotCi0JQWxsIG1lbW9yeSBhdHRhY2hlZCB0byB0aGUgQkZEIGlzIHJlbGVhc2VkLgotCi0JVGhlIGZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIEJGRCBpcyBjbG9zZWQgKGV2ZW4KLQlpZiBpdCB3YXMgcGFzc2VkIGluIHRvIEJGRCBieSA8PGJmZF9mZG9wZW5yPj4pLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LgotKi8KLQotCi1ib29sZWFuCi1iZmRfY2xvc2UgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgaWYgKCFiZmRfcmVhZF9wIChhYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoISBCRkRfU0VORF9GTVQgKGFiZmQsIF9iZmRfd3JpdGVfY29udGVudHMsIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBCRkRfU0VORCAoYWJmZCwgX2Nsb3NlX2FuZF9jbGVhbnVwLCAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXQgPSBiZmRfY2FjaGVfY2xvc2UgKGFiZmQpOwotCi0gIC8qIElmIHRoZSBmaWxlIHdhcyBvcGVuIGZvciB3cml0aW5nIGFuZCBpcyBub3cgZXhlY3V0YWJsZSwKLSAgICAgbWFrZSBpdCBzbyAqLwotICBpZiAocmV0Ci0gICAgICAmJiBhYmZkLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uCi0gICAgICAmJiBhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgICAgIGlmIChzdGF0IChhYmZkLT5maWxlbmFtZSwgJmJ1ZikgPT0gMCkKLQl7Ci0gCSAgaW50IG1hc2sgPSB1bWFzayAoMCk7Ci0JICB1bWFzayAobWFzayk7Ci0JICBjaG1vZCAoYWJmZC0+ZmlsZW5hbWUsCi0JCSAoMDc3NwotCQkgICYgKGJ1Zi5zdF9tb2RlIHwgKChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpICZ+IG1hc2spKSkpOwotCX0KLSAgICB9Ci0KLSAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBhYmZkLT5tZW1vcnkpOwotICBmcmVlIChhYmZkKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY2xvc2VfYWxsX2RvbmUKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jbG9zZV9hbGxfZG9uZShiZmQgKik7Ci0KLURFU0NSSVBUSU9OCi0JQ2xvc2UgYSBCRkQuICBEaWZmZXJzIGZyb20gPDxiZmRfY2xvc2U+PgotCXNpbmNlIGl0IGRvZXMgbm90IGNvbXBsZXRlIGFueSBwZW5kaW5nIG9wZXJhdGlvbnMuICBUaGlzCi0Jcm91dGluZSB3b3VsZCBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBoYWQganVzdCB1c2VkIEJGRCBmb3IKLQlzd2FwcGluZyBhbmQgZGlkbid0IHdhbnQgdG8gdXNlIGFueSBvZiB0aGUgd3JpdGluZyBjb2RlLgotCi0JSWYgdGhlIGNyZWF0ZWQgZmlsZSBpcyBleGVjdXRhYmxlLCB0aGVuIDw8Y2htb2Q+PiBpcyBjYWxsZWQKLQl0byBtYXJrIGl0IGFzIHN1Y2guCi0KLQlBbGwgbWVtb3J5IGF0dGFjaGVkIHRvIHRoZSBCRkQgaXMgcmVsZWFzZWQuCi0KLVJFVFVSTlMKLQk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uCi0KLSovCi0KLWJvb2xlYW4KLWJmZF9jbG9zZV9hbGxfZG9uZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuIHJldDsKLQotICByZXQgPSBiZmRfY2FjaGVfY2xvc2UgKGFiZmQpOwotCi0gIC8qIElmIHRoZSBmaWxlIHdhcyBvcGVuIGZvciB3cml0aW5nIGFuZCBpcyBub3cgZXhlY3V0YWJsZSwKLSAgICAgbWFrZSBpdCBzbyAqLwotICBpZiAocmV0Ci0gICAgICAmJiBhYmZkLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uCi0gICAgICAmJiBhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgICAgIGlmIChzdGF0IChhYmZkLT5maWxlbmFtZSwgJmJ1ZikgPT0gMCkKLQl7Ci0JICBpbnQgbWFzayA9IHVtYXNrICgwKTsKLQkgIHVtYXNrIChtYXNrKTsKLQkgIGNobW9kIChhYmZkLT5maWxlbmFtZSwKLQkJICgweDc3NwotCQkgICYgKGJ1Zi5zdF9tb2RlIHwgKChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpICZ+IG1hc2spKSkpOwotCX0KLSAgICB9Ci0KLSAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBhYmZkLT5tZW1vcnkpOwotICBmcmVlIChhYmZkKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY3JlYXRlCi0KLVNZTk9QU0lTCi0JYmZkICpiZmRfY3JlYXRlKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBiZmQgKnRlbXBsKTsKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBuZXcgQkZEIGluIHRoZSBtYW5uZXIgb2YKLQk8PGJmZF9vcGVudz4+LCBidXQgd2l0aG91dCBvcGVuaW5nIGEgZmlsZS4gVGhlIG5ldyBCRkQKLQl0YWtlcyB0aGUgdGFyZ2V0IGZyb20gdGhlIHRhcmdldCB1c2VkIGJ5IEB2YXJ7dGVtcGxhdGV9LiBUaGUKLQlmb3JtYXQgaXMgYWx3YXlzIHNldCB0byA8PGJmZF9vYmplY3Q+Pi4KLQotKi8KLQotYmZkICoKLWJmZF9jcmVhdGUgKGZpbGVuYW1lLCB0ZW1wbCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJmZCAqdGVtcGw7Ci17Ci0gIGJmZCAqbmJmZDsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBpZiAodGVtcGwpCi0gICAgbmJmZC0+eHZlYyA9IHRlbXBsLT54dmVjOwotICBuYmZkLT5kaXJlY3Rpb24gPSBub19kaXJlY3Rpb247Ci0gIGJmZF9zZXRfZm9ybWF0IChuYmZkLCBiZmRfb2JqZWN0KTsKLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3dyaXRhYmxlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWFrZV93cml0YWJsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVRha2VzIGEgQkZEIGFzIGNyZWF0ZWQgYnkgPDxiZmRfY3JlYXRlPj4gYW5kIGNvbnZlcnRzIGl0Ci0JaW50byBvbmUgbGlrZSBhcyByZXR1cm5lZCBieSA8PGJmZF9vcGVudz4+LiAgSXQgZG9lcyB0aGlzCi0JYnkgY29udmVydGluZyB0aGUgQkZEIHRvIEJGRF9JTl9NRU1PUlkuICBJdCdzIGFzc3VtZWQgdGhhdAotCXlvdSB3aWxsIGNhbGwgPDxiZmRfbWFrZV9yZWFkYWJsZT4+IG9uIHRoaXMgYmZkIGxhdGVyLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LgotKi8KLQotYm9vbGVhbgotYmZkX21ha2Vfd3JpdGFibGUoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gIGlmIChhYmZkLT5kaXJlY3Rpb24gIT0gbm9fZGlyZWN0aW9uKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaW5fbWVtb3J5KSk7Ci0gIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgYmltOwotICAvKiBiZmRfd3JpdGUgd2lsbCBncm93IHRoZXNlIGFzIG5lZWRlZCAqLwotICBiaW0tPnNpemUgPSAwOwotICBiaW0tPmJ1ZmZlciA9IDA7Ci0KLSAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lOX01FTU9SWTsKLSAgYWJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOwotICBhYmZkLT53aGVyZSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3JlYWRhYmxlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWFrZV9yZWFkYWJsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVRha2VzIGEgQkZEIGFzIGNyZWF0ZWQgYnkgPDxiZmRfY3JlYXRlPj4gYW5kCi0JPDxiZmRfbWFrZV93cml0YWJsZT4+IGFuZCBjb252ZXJ0cyBpdCBpbnRvIG9uZSBsaWtlIGFzCi0JcmV0dXJuZWQgYnkgPDxiZmRfb3BlbnI+Pi4gIEl0IGRvZXMgdGhpcyBieSB3cml0aW5nIHRoZQotCWNvbnRlbnRzIG91dCB0byB0aGUgbWVtb3J5IGJ1ZmZlciwgdGhlbiByZXZlcnNpbmcgdGhlCi0JZGlyZWN0aW9uLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LiAgKi8KLQotYm9vbGVhbgotYmZkX21ha2VfcmVhZGFibGUoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+ZGlyZWN0aW9uICE9IHdyaXRlX2RpcmVjdGlvbiB8fCAhKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3dyaXRlX2NvbnRlbnRzLCAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBCRkRfU0VORCAoYWJmZCwgX2Nsb3NlX2FuZF9jbGVhbnVwLCAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotCi0gIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLQotICBhYmZkLT53aGVyZSA9IDA7Ci0gIGFiZmQtPnNlY3Rpb25zID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotICBhYmZkLT5teV9hcmNoaXZlID0gKGJmZCAqKSBOVUxMOwotICBhYmZkLT5vcmlnaW4gPSAwOwkJCQkKLSAgYWJmZC0+b3BlbmVkX29uY2UgPSBmYWxzZTsKLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgYWJmZC0+dXNyZGF0YSA9IChQVFIpIE5VTEw7Ci0gIGFiZmQtPmNhY2hlYWJsZSA9IGZhbHNlOwotICBhYmZkLT5mbGFncyA9IEJGRF9JTl9NRU1PUlk7Ci0gIGFiZmQtPm10aW1lX3NldCA9IGZhbHNlOwotCi0gIGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSB0cnVlOwotICBhYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLSAgYWJmZC0+c2VjdGlvbnMgPSAwOwotICBhYmZkLT5zeW1jb3VudCA9IDA7Ci0gIGFiZmQtPm91dHN5bWJvbHMgPSAwOwotICBhYmZkLT50ZGF0YS5hbnkgPSAwOwotCi0gIGJmZF9jaGVja19mb3JtYXQoYWJmZCwgYmZkX29iamVjdCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9hbGxvYwotCi1TWU5PUFNJUwotCVBUUiBiZmRfYWxsb2MgKGJmZCAqYWJmZCwgc2l6ZV90IHdhbnRlZCk7Ci0KLURFU0NSSVBUSU9OCi0JQWxsb2NhdGUgYSBibG9jayBvZiBAdmFye3dhbnRlZH0gYnl0ZXMgb2YgbWVtb3J5IGF0dGFjaGVkIHRvCi0JPDxhYmZkPj4gYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0qLwotCi0KLVBUUgotYmZkX2FsbG9jIChhYmZkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcmV0OwotCi0gIHJldCA9IG9iamFsbG9jX2FsbG9jIChhYmZkLT5tZW1vcnksICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcmV0OwotfQotCi1QVFIKLWJmZF96YWxsb2MgKGFiZmQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiByZXM7Ci0KLSAgcmVzID0gYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKHJlcykKLSAgICBtZW1zZXQgKHJlcywgMCwgc2l6ZSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIEZyZWUgYSBibG9jayBhbGxvY2F0ZWQgZm9yIGEgQkZELiAgKi8KLQotdm9pZAotYmZkX3JlbGVhc2UgKGFiZmQsIGJsb2NrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBibG9jazsKLXsKLSAgb2JqYWxsb2NfZnJlZV9ibG9jayAoKHN0cnVjdCBvYmphbGxvYyAqKSBhYmZkLT5tZW1vcnksIGJsb2NrKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9vc2YtY29yZS5jIGIvYmZkL29zZi1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGZjMTIuLjAwMDAwMDAKLS0tIGEvYmZkL29zZi1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBPU0YvMSBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIE9TRi8xIHN0eWxlCi0gICBjb3JlIGZpbGVzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsCi0JCQkgICBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGFzeW1ib2wgKgotb3NmX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50Ci1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuCi1vc2ZfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi0KLXN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW01BWENPTUxFTiArIDFdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEub3NmX2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDg7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1vc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgaTsKLSAgY2hhciAqc2VjbmFtZTsKLSAgc3RydWN0IGNvcmVfZmlsZWhkciBjb3JlX2hlYWRlcjsKLQotICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVfaGVhZGVyKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChzdHJuY21wIChjb3JlX2hlYWRlci5tYWdpYywgIkNvcmUiLCA0KSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIGNvcmVfaGVhZGVyLm5hbWUsIE1BWENPTUxFTiArIDEpOwotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBjb3JlX2hlYWRlci5zaWdubzsKLQotICBmb3IgKGkgPSAwOyBpIDwgY29yZV9oZWFkZXIubnNjbnM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29yZV9zY25oZHIgY29yZV9zY25oZHI7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVfc2NuaGRyLCAxLCBzaXplb2YgY29yZV9zY25oZHIsIGFiZmQpOwotICAgICAgaWYgKHZhbCAhPSBzaXplb2YgY29yZV9zY25oZHIpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFNraXAgZW1wdHkgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKGNvcmVfc2NuaGRyLnNpemUgPT0gMCB8fCBjb3JlX3Njbmhkci5zY25wdHIgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChjb3JlX3Njbmhkci5zY250eXBlKQotCXsKLQljYXNlIFNDTlJHTjoKLQkgIHNlY25hbWUgPSAiLmRhdGEiOwotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQljYXNlIFNDTlNUQUNLOgotCSAgc2VjbmFtZSA9ICIuc3RhY2siOwotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQljYXNlIFNDTlJFR1M6Ci0JICBzZWNuYW1lID0gIi5yZWciOwotCSAgZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5oYW5kbGVkIE9TRi8xIGNvcmUgZmlsZSBzZWN0aW9uIHR5cGUgJWRcbiIpLAotCQkJCSBjb3JlX3Njbmhkci5zY250eXBlKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwgZmxhZ3MsCi0JCQkgICAgICAoYmZkX3NpemVfdHlwZSkgY29yZV9zY25oZHIuc2l6ZSwKLQkJCSAgICAgIChiZmRfdm1hKSBjb3JlX3Njbmhkci52YWRkciwKLQkJCSAgICAgIChmaWxlX3B0cikgY29yZV9zY25oZHIuc2NucHRyKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1vc2ZfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBvc2ZfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgb3NmX2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG9zZl9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIG9zZl9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgb3NmX2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG9zZl9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IG9zZl9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAib3NmLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgb3NmX2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChvc2ZfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG9zZl9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvcGM1MzItbWFjaC5jIGIvYmZkL3BjNTMyLW1hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmNGFjNC4uMDAwMDAwMAotLS0gYS9iZmQvcGM1MzItbWFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTWFjaDMvNTMyIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBEYWxsCi0gKiAgICAgICAgICAgIDE5LUFwci05NAotICoKLSAqIEZvcm1lcmx5IHBhcnQgb2YgYW91dC1wYzUzMi1tYWNoLmMuIFNwbGl0IG91dCB0byBhbGxvdyBtb3JlCi0gKiBmbGV4aWJpbGl0eSB3aXRoIG11bHRpcGxlIGZvcm1hdHMuCi0gKgotICovCi0vKiBUaGlzIGFyY2hpdGVjdHVyZSBoYXMgTl9UWFRPRkYgYW5kIE5fVFhUQUREUiBkZWZpbmVkIGFzIGlmCi0gKiBOX0hFQURFUl9JTl9URVhULCBidXQgdGhlIGFfdGV4dCBlbnRyeSAodGV4dCBzaXplKSBkb2VzIG5vdCBpbmNsdWRlIHRoZQotICogc3BhY2UgZm9yIHRoZSBoZWFkZXIuIFNvIHdlIGhhdmUgTl9IRUFERVJfSU5fVEVYVCBkZWZpbmVkIHRvCi0gKiAxIGFuZCBzcGVjaWFsbHkgZGVmaW5lIG91ciBvd24gTl9UWFRTSVpFCi0gKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDB4MTAwMDAgICAgICAgLyogZnJvbSBvbGQgbGQgKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDEwMDAgICAgICAgLyogZnJvbSBvbGQgbGQsICAwMzIgJiA1MzIgYXJlIHJlYWxseSA1MTIvNGsgKi8KLQotLyogVXNlIGFfZW50cnkgb2YgMCB0byBkaXN0aW5ndWlzaCBvYmplY3QgZmlsZXMgZnJvbSBPTUFHSUMgZXhlY3V0YWJsZXMgKi8KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgKE5fTUFHSUMoeCkgPT0gT01BR0lDID8gXAotICAgKCh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSPyAwOiBURVhUX1NUQVJUX0FERFIpOiBcCi0gICAoTl9NQUdJQyh4KSA9PSBOTUFHSUM/IFRFWFRfU1RBUlRfQUREUjogXAotICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSkpCi0KLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbnMzMmsKLSAgCi0jZGVmaW5lIE1ZKE9QKSBDQVQocGM1MzJtYWNoYW91dF8sT1ApCi0KLS8qIE11c3QgYmUgdGhlIHNhbWUgYXMgYW91dC1uczMyay5jICovCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKG5zMzJrYW91dCxfMzJfLHkpCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcGM1MzItbWFjaCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBXZSBjYW5gdCB1c2UgdGhlIE1ZTlMgbWFjcm8gaGVyZSBmb3IgY3BwIHJlYXNvbnMgdG9vIHN1YnRsZSBmb3IgbWUgLS0gSVdEICovCi0KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG5zMzJrYW91dF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogbGliYW91dCBkb2Vzbid0IHVzZSBOQU1FIGZvciB0aGVzZSAuLi4gKi8KLQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkIDEKLSAgICAgCi0jZGVmaW5lIE1ZTlNYKE9QKSBDQVQobnMzMmthb3V0XyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgKgotTVlOU1goYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWJvb2xlYW4KLU1ZTlNYKHdyaXRlX29iamVjdF9jb250ZW50cykKLSAgUEFSQU1TKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi1iZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotICAKLSAgQkZEX0FTU0VSVCAoYmZkX2dldF9hcmNoIChhYmZkKSA9PSBiZmRfYXJjaF9uczMyayk7Ci0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSAzMjAzMjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fTlMzMjAzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyNTMyOgotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX05TMzI1MzIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLSAgCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvcGUtYXJtLmMgYi9iZmQvcGUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTA0ODEuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybXBlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybXBlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaWZuZGVmIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIAotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0jZW5kaWYKLQkKLSNpbmNsdWRlICJjb2ZmLWFybS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLWkzODYuYyBiL2JmZC9wZS1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWI3ODQuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotCi0jZGVmaW5lIFRBUkdFVF9TWU0gaTM4NnBlX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAicGUtaTM4NiIKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLmlkYXRhIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIucGRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfQotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtbWNvcmUuYyBiL2JmZC9wZS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTE5ZjgxLi4wMDAwMDAwCi0tLSBhL2JmZC9wZS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNQ29yZSBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0JJR19TWU0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgbWNvcmVfcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGUtbWNvcmUtYmlnIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBtY29yZV9wZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJwZS1tY29yZS1saXR0bGUiCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jZGVmaW5lIE1DT1JFX1BFCi0KLSNpbmNsdWRlICJjb2ZmLW1jb3JlLmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtcHBjLmMgYi9iZmQvcGUtcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNGE1NDcuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLQotI2RlZmluZSBFX0ZJTEVOTUxFTiAgICAgMTgKLQotI2RlZmluZSBQUENfUEUKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAicGUtcG93ZXJwY2xlIgotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgYmZkX3Bvd2VycGNfcGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGUtcG93ZXJwYyIKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0vKiBGSVhNRTogdmVyaWZ5IFBDUkVMT0ZGU0VUIGlzIGFsd2F5cyBmYWxzZSAqLwotCi0vKiBGSVhNRTogVGhpcyB0YXJnZXQgbm8gbG9uZ2VyIHdvcmtzLiAgU2VhcmNoIGZvciBQT1dFUlBDX0xFX1BFIGluCi0gICBjb2ZmLXBwYy5jIGFuZCBwZWlnZW4uYy4gICovCi0KLSNpbmNsdWRlICJjb2ZmLXBwYy5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1hcm0uYyBiL2JmZC9wZWktYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YWUwMWUuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgYXJtIFBFIElNQUdFIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0xJVFRMRV9TWU0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gIGFybXBlaV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAicGVpLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICBhcm1wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlaS1hcm0tYmlnIgotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAiY29mZi1hcm0uYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktaTM4Ni5jIGIvYmZkL3BlaS1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMGY3N2EuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBQRSBJTUFHRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIFRBUkdFVF9TWU0gaTM4NnBlaV92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUgInBlaS1pMzg2IgotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLmlkYXRhIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIucGRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfQotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLW1jb3JlLmMgYi9iZmQvcGVpLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzNiOTUuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNQ29yZSBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0JJR19TWU0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgbWNvcmVfcGVpX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlaS1tY29yZS1iaWciCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJwZWktbWNvcmUtbGl0dGxlIgotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jZGVmaW5lIE1DT1JFX1BFCi0KLSNpbmNsdWRlICJjb2ZmLW1jb3JlLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLXBwYy5jIGIvYmZkL3BlaS1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlMWE1ZC4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIFBFIElNQUdFIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0vKiBzZXR0aW5nIHVwIGZvciBhIFBFIGVudmlyb25tZW50IHN0b2xlbiBkaXJlY3RseSBmcm9tIHRoZSBpMzg2IHN0cnVjdHVyZSAqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLQotI2RlZmluZSBQUENfUEUKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlaS1wb3dlcnBjbGUiCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICBiZmRfcG93ZXJwY19wZWlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLXBvd2VycGMiCi0KLSNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLS8qIEZJWE1FOiBWZXJpZnkgUENSRUxPRkZTRVQgaXMgYWx3YXlzIGZhbHNlICovCi0KLS8qIEZJWE1FOiBUaGlzIHRhcmdldCBubyBsb25nZXIgd29ya3MuICBTZWFyY2ggZm9yIFBPV0VSUENfTEVfUEUgaW4KLSAgIGNvZmYtcHBjLmMgYW5kIHBlaWdlbi5jLiAgKi8KLQotI2luY2x1ZGUgImNvZmYtcHBjLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpY29kZS5oIGIvYmZkL3BlaWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2YmRlNC4uMDAwMDAwMAotLS0gYS9iZmQvcGVpY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIFBFL1BFSSwgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1Nb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKLQkJCXNhY0BjeWdudXMuY29tCi0KLVBFL1BFSSByZWFycmFuZ2VtZW50IChhbmQgY29kZSBhZGRlZCk6IERvbm4gVGVycnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnR3YXkgU3lzdGVtcywgSW5jLgotKi8KLQotLyogSGV5IGxvb2ssIHNvbWUgZG9jdW1lbnRhdGlvbiBbYW5kIGluIGEgcGxhY2UgeW91IGV4cGVjdCB0byBmaW5kIGl0XSEKLQotICAgVGhlIG1haW4gcmVmZXJlbmNlIGZvciB0aGUgcGVpIGZvcm1hdCBpcyAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gNC4xIi4gIEdldCBpdCBpZiB5b3UgbmVlZCB0bwotICAgZG8gc29tZSBzZXJpb3VzIGhhY2tpbmcgb24gdGhpcyBjb2RlLgotCi0gICBBbm90aGVyIHJlZmVyZW5jZToKLSAgICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkuCi0KLSAgIFRoZSAqc29sZSogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwZSBmb3JtYXQgYW5kIHRoZSBwZWkgZm9ybWF0IGlzIHRoYXQgdGhlCi0gICBsYXR0ZXIgaGFzIGFuIE1TRE9TIDIuMCAuZXhlIGhlYWRlciBvbiB0aGUgZnJvbnQgdGhhdCBwcmludHMgdGhlIG1lc3NhZ2UKLSAgICJUaGlzIGFwcCBtdXN0IGJlIHJ1biB1bmRlciBXaW5kb3dzLiIgKG9yIHNvbWUgc3VjaCkuCi0gICAoRklYTUU6IFdoZXRoZXIgdGhhdCBzdGF0ZW1lbnQgaXMgKnJlYWxseSogdHJ1ZSBvciBub3QgaXMgdW5rbm93bi4KLSAgIEFyZSB0aGVyZSBtb3JlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBlIGFuZCBwZWkgZm9ybWF0cz8KLSAgIEZvciBub3cgYXNzdW1lIHRoZXJlIGFyZW4ndC4gIElmIHlvdSBmaW5kIG9uZSwgdGhlbiBmb3IgR29kIHNha2VzCi0gICBkb2N1bWVudCBpdCBoZXJlISkKLQotICAgVGhlIE1pY3Jvc29mdCBkb2NzIHVzZSB0aGUgd29yZCAiaW1hZ2UiIGluc3RlYWQgb2YgImV4ZWN1dGFibGUiIGJlY2F1c2UKLSAgIHRoZSBmb3JtZXIgY2FuIGFsc28gcmVmZXIgdG8gYSBETEwgKHNoYXJlZCBsaWJyYXJ5KS4gIENvbmZ1c2lvbiBjYW4gYXJpc2UKLSAgIGJlY2F1c2UgdGhlIGBpJyBpbiBgcGVpJyBhbHNvIHJlZmVycyB0byAiaW1hZ2UiLiAgVGhlIGBwZScgZm9ybWF0IGNhbgotICAgYWxzbyBjcmVhdGUgaW1hZ2VzIChpLmUuIGV4ZWN1dGFibGVzKSwgaXQncyBqdXN0IHRoYXQgdG8gcnVuIG9uIGEgd2luMzIKLSAgIHN5c3RlbSB5b3UgbmVlZCB0byB1c2UgdGhlIHBlaSBmb3JtYXQuCi0KLSAgIEZJWE1FOiBQbGVhc2UgYWRkIG1vcmUgZG9jcyBoZXJlIHNvIHRoZSBuZXh0IHBvb3IgZm9vbCB0aGF0IGhhcyB0byBoYWNrCi0gICBvbiB0aGlzIGNvZGUgaGFzIGEgY2hhbmNlIG9mIGdldHRpbmcgc29tZXRoaW5nIGFjY29tcGxpc2hlZCB3aXRob3V0Ci0gICB3YXN0aW5nIHRvbyBtdWNoIHRpbWUuCi0qLwotCi0jaW5jbHVkZSAibGlicGVpLmgiCi0KLXN0YXRpYyBib29sZWFuICgqcGVfc2F2ZWRfY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSkKLSAgICBQQVJBTVMgKChiZmQgKiwgUFRSKSkgPQotI2lmbmRlZiBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gICAgIE5VTEw7Ci0jZWxzZQotICAgICBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgUEFSQU1TICgoYmZkICosIGJmZCAqKSkgPQotI2lmbmRlZiBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgICAgTlVMTDsKLSNlbHNlCi0gICAgIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YTsKLSN1bmRlZiBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIGNvZmZfbWtvYmplY3QgICAgICBwZV9ta29iamVjdAotI2RlZmluZSBjb2ZmX21rb2JqZWN0X2hvb2sgcGVfbWtvYmplY3RfaG9vawotCi1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zY25oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIFBUUiBwZV9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7Ci0KLSAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7Ci0gIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKLQotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOwotCi0jaWZkZWYgU1dBUF9JTl9SRUxPQ19PRkZTRVQKLSAgcmVsb2NfZHN0LT5yX29mZnNldCA9IFNXQVBfSU5fUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQkJCSAgICAgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9vZmZzZXQpOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCXNyYzsKLSAgICAgUFRSCWRzdDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopCi0JICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotICBTV0FQX09VVF9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCXJlbG9jX3NyYy0+cl9vZmZzZXQsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX29mZnNldCk7Ci0jZW5kaWYKLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19FWFRSQQotICBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHJlbG9jX3NyYywgcmVsb2NfZHN0KTsKLSNlbmRpZgotICByZXR1cm4gUkVMU1o7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIHNyYzsKLSAgICAgUFRSCSAgICAgZHN0OwotewotICBGSUxIRFIgKmZpbGVoZHJfc3JjID0gKEZJTEhEUiAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBkc3Q7Ci0gIGZpbGVoZHJfZHN0LT5mX21hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9tYWdpYyk7Ci0gIGZpbGVoZHJfZHN0LT5mX25zY25zID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc2Nucyk7Ci0gIGZpbGVoZHJfZHN0LT5mX3RpbWRhdCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGltZGF0KTsKLQotICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnN5bXMpOwotICBmaWxlaGRyX2RzdC0+Zl9mbGFncyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfZmxhZ3MpOwotICBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9zeW1wdHIpOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIC8qIFRoZXJlIGFyZSByZWFsbHkgdHdvIG1hZ2ljIG51bWJlcnMgaW52b2x2ZWQ7IHRoZSBtYWdpYyBudW1iZXIKLSAgICAgdGhhdCBzYXlzIHRoaXMgaXMgYSBOVCBleGVjdXRhYmxlIChQRUkpIGFuZCB0aGUgbWFnaWMgbnVtYmVyIHRoYXQKLSAgICAgZGV0ZXJtaW5lcyB0aGUgYXJjaGl0ZWN0dXJlLiAgVGhlIGZvcm1lciBpcyBET1NNQUdJQywgc3RvcmVkIGluCi0gICAgIHRoZSBlX21hZ2ljIGZpZWxkLiAgVGhlIGxhdHRlciBpcyBzdG9yZWQgaW4gdGhlIGZfbWFnaWMgZmllbGQuCi0gICAgIElmIHRoZSBOVCBtYWdpYyBudW1iZXIgaXNuJ3QgdmFsaWQsIHRoZSBhcmNoaXRlY3R1cmUgbWFnaWMgbnVtYmVyCi0gICAgIGNvdWxkIGJlIG1pbWlja2VkIGJ5IHNvbWUgb3RoZXIgZmllbGQgKHNwZWNpZmljYWxseSwgdGhlIG51bWJlcgotICAgICBvZiByZWxvY3MgaW4gc2VjdGlvbiAzKS4gIFNpbmNlIHRoaXMgcm91dGluZSBjYW4gb25seSBiZSBjYWxsZWQKLSAgICAgY29ycmVjdGx5IGZvciBhIFBFSSBmaWxlLCBjaGVjayB0aGUgZV9tYWdpYyBudW1iZXIgaGVyZSwgYW5kLCBpZgotICAgICBpdCBkb2Vzbid0IG1hdGNoLCBjbG9iYmVyIHRoZSBmX21hZ2ljIG51bWJlciBzbyB0aGF0IHdlIGRvbid0IGdldAotICAgICBhIGZhbHNlIG1hdGNoLiAgKi8KLSAgaWYgKGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfc3JjLT5lX21hZ2ljKSAhPSBET1NNQUdJQykKLSAgICBmaWxlaGRyX2RzdC0+Zl9tYWdpYyA9IC0xOwotI2VuZGlmCi0KLSAgLyogT3RoZXIgcGVvcGxlJ3MgdG9vbHMgc29tZXRpbWVzIGdlbmVyYXRlIGhlYWRlcnMgd2l0aCBhbiBuc3ltcyBidXQKLSAgICAgYSB6ZXJvIHN5bXB0ci4gICovCi0gIGlmIChmaWxlaGRyX2RzdC0+Zl9uc3ltcyAhPSAwICYmIGZpbGVoZHJfZHN0LT5mX3N5bXB0ciA9PSAwKQotICAgIHsKLSAgICAgIGZpbGVoZHJfZHN0LT5mX25zeW1zID0gMDsKLSAgICAgIGZpbGVoZHJfZHN0LT5mX2ZsYWdzIHw9IEZfTFNZTVM7Ci0gICAgfQotCi0gIGZpbGVoZHJfZHN0LT5mX29wdGhkciA9IGJmZF9oX2dldF8xNihhYmZkLCAKLQkJCQkgICAgICAgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX29wdGhkcik7Ci19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IF9iZmRfcGVpX29ubHlfc3dhcF9maWxlaGRyX291dAotI2Vsc2UKLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IF9iZmRfcGVfb25seV9zd2FwX2ZpbGVoZHJfb3V0Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIGV4dDsKLSAgICAgUFRSCSAgICAgaW47Ci17Ci0gIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKikgZXh0OwotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSAgbWVtY3B5KHNjbmhkcl9pbnQtPnNfbmFtZSwgc2NuaGRyX2V4dC0+c19uYW1lLCBzaXplb2Yoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0gIHNjbmhkcl9pbnQtPnNfdmFkZHIgPQotICAgIEdFVF9TQ05IRFJfVkFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19wYWRkciA9Ci0gICAgR0VUX1NDTkhEUl9QQUREUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcGFkZHIpOwotICBzY25oZHJfaW50LT5zX3NpemUgPQotICAgIEdFVF9TQ05IRFJfU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2l6ZSk7Ci0gIHNjbmhkcl9pbnQtPnNfc2NucHRyID0KLSAgICBHRVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgc2NuaGRyX2ludC0+c19yZWxwdHIgPQotICAgIEdFVF9TQ05IRFJfUkVMUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOwotICBzY25oZHJfaW50LT5zX2xubm9wdHIgPQotICAgIEdFVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7Ci0gIHNjbmhkcl9pbnQtPnNfZmxhZ3MgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfZmxhZ3MpOwotCi0gIC8qIE1TIGhhbmRsZXMgb3ZlcmZsb3cgb2YgbGluZSBudW1iZXJzIGJ5IGNhcnJ5aW5nIGludG8gdGhlIHJlbG9jCi0gICAgIGZpZWxkIChpdCBhcHBlYXJzKS4gIFNpbmNlIGl0J3Mgc3VwcG9zZWQgdG8gYmUgemVybyBmb3IgUEUKLSAgICAgKklNQUdFKiBmb3JtYXQsIHRoYXQncyBzYWZlLiAgVGhpcyBpcyBzdGlsbCBhIGJpdCBpZmZ5LiAgKi8KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgc2NuaGRyX2ludC0+c19ubG5ubyA9Ci0gICAgKGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pCi0gICAgICsgKGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKSA8PCAxNikpOwotICBzY25oZHJfaW50LT5zX25yZWxvYyA9IDA7Ci0jZWxzZQotICBzY25oZHJfaW50LT5zX25yZWxvYyA9IGJmZF9oX2dldF8xNiAoYWJmZCwKLQkJCQkgICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgc2NuaGRyX2ludC0+c19ubG5ubyA9IGJmZF9oX2dldF8xNiAoYWJmZCwKLQkJCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0jZW5kaWYKLQotICBpZiAoc2NuaGRyX2ludC0+c192YWRkciAhPSAwKSAKLSAgICB7Ci0gICAgICBzY25oZHJfaW50LT5zX3ZhZGRyICs9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgICAgc2NuaGRyX2ludC0+c192YWRkciAmPSAweGZmZmZmZmZmOwotICAgIH0KLQotICAvKiBJZiB0aGlzIHNlY3Rpb24gaG9sZHMgdW5pbml0aWFsaXplZCBkYXRhLCB1c2UgdGhlIHZpcnR1YWwgc2l6ZQotICAgICAoc3RvcmVkIGluIHNfcGFkZHIpIGluc3RlYWQgb2YgdGhlIHBoeXNpY2FsIHNpemUuICAqLwotICBpZiAoKHNjbmhkcl9pbnQtPnNfZmxhZ3MgJiBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSkgIT0gMCkKLSAgICB7Ci0gICAgICBzY25oZHJfaW50LT5zX3NpemUgPSBzY25oZHJfaW50LT5zX3BhZGRyOwotICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gc2V0IHNjbmhkcl9pbnQtPnNfcGFkZHIgdG8gMC4gIEhvd2V2ZXIsCi0gICAgICAgICBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBzdG9yZXMgc19wYWRkciBpbiB2aXJ0X3NpemUsIHdoaWNoCi0gICAgICAgICBvbmx5IHdvcmtzIGlmIGl0IGNvcnJlY3RseSBob2xkcyB0aGUgdmlydHVhbCBzaXplIG9mIHRoZQotICAgICAgICAgc2VjdGlvbi4gICovCi0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotcGVfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIHBlX2RhdGFfdHlwZSAqcGU7Ci0gIGFiZmQtPnRkYXRhLnBlX29ial9kYXRhID0gCi0gICAgKHN0cnVjdCBwZV90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHBlX2RhdGFfdHlwZSkpOwotCi0gIGlmIChhYmZkLT50ZGF0YS5wZV9vYmpfZGF0YSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwZSA9IHBlX2RhdGEgKGFiZmQpOwotCi0gIHBlLT5jb2ZmLnBlID0gMTsKLQotICAvKiBpbl9yZWxvY19wIGlzIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQuICAqLwotICBwZS0+aW5fcmVsb2NfcCA9IGluX3JlbG9jX3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIENPRkYgYmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi1zdGF0aWMgUFRSCi1wZV9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKiBhYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLSAgcGVfZGF0YV90eXBlICpwZTsKLQotICBpZiAocGVfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIHBlID0gcGVfZGF0YSAoYWJmZCk7Ci0gIHBlLT5jb2ZmLnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJwotICAgICB1bmZvcnR1bmF0ZWx5IHZhcnkgYW1vbmcgY29mZiBpbXBsZW1lbnRhdGlvbnMuLi4gICovCi0gIHBlLT5jb2ZmLmxvY2FsX25fYnRtYXNrID0gTl9CVE1BU0s7Ci0gIHBlLT5jb2ZmLmxvY2FsX25fYnRzaGZ0ID0gTl9CVFNIRlQ7Ci0gIHBlLT5jb2ZmLmxvY2FsX25fdG1hc2sgPSBOX1RNQVNLOwotICBwZS0+Y29mZi5sb2NhbF9uX3RzaGlmdCA9IE5fVFNISUZUOwotICBwZS0+Y29mZi5sb2NhbF9zeW1lc3ogPSBTWU1FU1o7Ci0gIHBlLT5jb2ZmLmxvY2FsX2F1eGVzeiA9IEFVWEVTWjsKLSAgcGUtPmNvZmYubG9jYWxfbGluZXN6ID0gTElORVNaOwotCi0gIHBlLT5jb2ZmLnRpbWVzdGFtcCA9IGludGVybmFsX2YtPmZfdGltZGF0OwotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9Ci0gICAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkgPQotICAgICAgaW50ZXJuYWxfZi0+Zl9uc3ltczsKLQotICBwZS0+cmVhbF9mbGFncyA9IGludGVybmFsX2YtPmZfZmxhZ3M7Ci0KLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9ETEwpICE9IDApCi0gICAgcGUtPmRsbCA9IDE7Ci0KLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCkgPT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfREVCVUc7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgaWYgKGFvdXRoZHIpIAotICAgIHBlLT5wZV9vcHRoZHIgPSAoKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopYW91dGhkciktPnBlOwotI2VuZGlmCi0KLSNpZmRlZiBBUk0gCi0gIGlmICghIF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGludGVybmFsX2YtPmZfZmxhZ3MpKQotICAgIGNvZmZfZGF0YSAoYWJmZCkgLT5mbGFncyA9IDA7Ci0jZW5kaWYKLSAgCi0gIHJldHVybiAoUFRSKSBwZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotCi0gIGlmICghX2JmZF9wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbiAoYWJmZCwgdmZpbGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAocGVfc2F2ZWRfY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZwdXRjICgnXG4nLCBmaWxlKTsKLQotICAgICAgcmV0dXJuIHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHZmaWxlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IGJmZAotICAgdG8gdGhlIG91dHB1dCBiZmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkLCAqb2JmZDsKLXsKLSAgaWYgKCFfYmZkX3BlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGFfY29tbW9uIChpYmZkLCBvYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHBlX3NhdmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkKLSAgICByZXR1cm4gcGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFwKLSAgX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi0jZGVmaW5lIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfcGVfZ2V0X3N5bWJvbF9pbmZvCmRpZmYgLS1naXQgYS9iZmQvcGVpZ2VuLmMgYi9iZmQvcGVpZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGJhMGUuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaWdlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkxMiArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBQRS9QRUk7IHRoZSBjb21tb24gZXhlY3V0YWJsZSBwYXJ0cy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1Nb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKLQkJCXNhY0BjeWdudXMuY29tCi0KLVBFL1BFSSByZWFycmFuZ2VtZW50IChhbmQgY29kZSBhZGRlZCk6IERvbm4gVGVycnkKLQkJCQkgICAgICAgU29mdHdheSBTeXN0ZW1zLCBJbmMuCi0qLwotCi0vKiBIZXkgbG9vaywgc29tZSBkb2N1bWVudGF0aW9uIFthbmQgaW4gYSBwbGFjZSB5b3UgZXhwZWN0IHRvIGZpbmQgaXRdIQotCi0gICBUaGUgbWFpbiByZWZlcmVuY2UgZm9yIHRoZSBwZWkgZm9ybWF0IGlzICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiA0LjEiLiAgR2V0IGl0IGlmIHlvdSBuZWVkIHRvCi0gICBkbyBzb21lIHNlcmlvdXMgaGFja2luZyBvbiB0aGlzIGNvZGUuCi0KLSAgIEFub3RoZXIgcmVmZXJlbmNlOgotICAgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOS4KLQotICAgVGhlICpzb2xlKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBlIGZvcm1hdCBhbmQgdGhlIHBlaSBmb3JtYXQgaXMgdGhhdCB0aGUKLSAgIGxhdHRlciBoYXMgYW4gTVNET1MgMi4wIC5leGUgaGVhZGVyIG9uIHRoZSBmcm9udCB0aGF0IHByaW50cyB0aGUgbWVzc2FnZQotICAgIlRoaXMgYXBwIG11c3QgYmUgcnVuIHVuZGVyIFdpbmRvd3MuIiAob3Igc29tZSBzdWNoKS4KLSAgIChGSVhNRTogV2hldGhlciB0aGF0IHN0YXRlbWVudCBpcyAqcmVhbGx5KiB0cnVlIG9yIG5vdCBpcyB1bmtub3duLgotICAgQXJlIHRoZXJlIG1vcmUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gcGUgYW5kIHBlaSBmb3JtYXRzPwotICAgRm9yIG5vdyBhc3N1bWUgdGhlcmUgYXJlbid0LiAgSWYgeW91IGZpbmQgb25lLCB0aGVuIGZvciBHb2Qgc2FrZXMKLSAgIGRvY3VtZW50IGl0IGhlcmUhKQotCi0gICBUaGUgTWljcm9zb2Z0IGRvY3MgdXNlIHRoZSB3b3JkICJpbWFnZSIgaW5zdGVhZCBvZiAiZXhlY3V0YWJsZSIgYmVjYXVzZQotICAgdGhlIGZvcm1lciBjYW4gYWxzbyByZWZlciB0byBhIERMTCAoc2hhcmVkIGxpYnJhcnkpLiAgQ29uZnVzaW9uIGNhbiBhcmlzZQotICAgYmVjYXVzZSB0aGUgYGknIGluIGBwZWknIGFsc28gcmVmZXJzIHRvICJpbWFnZSIuICBUaGUgYHBlJyBmb3JtYXQgY2FuCi0gICBhbHNvIGNyZWF0ZSBpbWFnZXMgKGkuZS4gZXhlY3V0YWJsZXMpLCBpdCdzIGp1c3QgdGhhdCB0byBydW4gb24gYSB3aW4zMgotICAgc3lzdGVtIHlvdSBuZWVkIHRvIHVzZSB0aGUgcGVpIGZvcm1hdC4KLQotICAgRklYTUU6IFBsZWFzZSBhZGQgbW9yZSBkb2NzIGhlcmUgc28gdGhlIG5leHQgcG9vciBmb29sIHRoYXQgaGFzIHRvIGhhY2sKLSAgIG9uIHRoaXMgY29kZSBoYXMgYSBjaGFuY2Ugb2YgZ2V0dGluZyBzb21ldGhpbmcgYWNjb21wbGlzaGVkIHdpdGhvdXQKLSAgIHdhc3RpbmcgdG9vIG11Y2ggdGltZS4KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLS8qIE5PVEU6IGl0J3Mgc3RyYW5nZSB0byBiZSBpbmNsdWRpbmcgYW4gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGhlYWRlcgotICAgaW4gd2hhdCdzIHN1cHBvc2VkIHRvIGJlIGdlbmVyYWwgKHRvIFBFL1BFSSkgY29kZS4gIEhvd2V2ZXIsIHRoYXQncwotICAgd2hlcmUgdGhlIGRlZmluaXRpb25zIGFyZSwgYW5kIHRoZXkgZG9uJ3QgdmFyeSBwZXIgYXJjaGl0ZWN0dXJlCi0gICB3aXRoaW4gUEUvUEVJLCBzbyB3ZSBnZXQgdGhlbSBmcm9tIHRoZXJlLiAgRklYTUU6IFRoZSBsYWNrIG9mCi0gICB2YXJpYW5jZSBpcyBhbiBhc3N1bXB0aW9uIHdoaWNoIG1heSBwcm92ZSB0byBiZSBpbmNvcnJlY3QgaWYgbmV3Ci0gICBQRS9QRUkgdGFyZ2V0cyBhcmUgY3JlYXRlZC4gICovCi0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0KLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYnBlaS5oIgotCi0vKiBGSVhNRTogVGhpcyBmaWxlIGhhcyB2YXJpb3VzIHRlc3RzIG9mIFBPV0VSUENfTEVfUEUuICBUaG9zZSB0ZXN0cwotICAgd29ya2VkIHdoZW4gdGhlIGNvZGUgd2FzIGluIHBlaWNvZGUuaCwgYnV0IG5vIGxvbmdlciB3b3JrIG5vdyB0aGF0Ci0gICB0aGUgY29kZSBpcyBpbiBwZWlnZW4uYy4gIFBvd2VyUEMgTlQgaXMgc2FpZCB0byBiZSBkZWFkLiAgSWYKLSAgIGFueWJvZHkgd2FudHMgdG8gcmV2aXZlIHRoZSBjb2RlLCB5b3Ugd2lsbCBoYXZlIHRvIGZpZ3VyZSBvdXQgaG93Ci0gICB0byBoYW5kbGUgdGhvc2UgaXNzdWVzLiAgKi8KLQotc3RhdGljIHZvaWQgYWRkX2RhdGFfZW50cnkKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICosIGludCwgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9wZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9yZWxvYyBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1fYmZkX3BlaV9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBTWU1FTlQgKmV4dCA9IChTWU1FTlQgKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYoIGV4dC0+ZS5lX25hbWVbMF0gPT0gMCkgewotICAgIGluLT5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgaW4tPl9uLl9uX24uX25fb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX29mZnNldCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbWVtY3B5KGluLT5fbi5fbl9uYW1lLCBleHQtPmUuZV9uYW1lLCBTWU1OTUxFTik7Ci0gIH0KLQotICBpbi0+bl92YWx1ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsKLSAgaW4tPm5fc2NudW0gPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpewotICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgaW4tPm5fc2NsYXNzID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX3NjbGFzcyk7Ci0gIGluLT5uX251bWF1eCA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9udW1hdXgpOwotCi0jaWZuZGVmIFNUUklDVF9QRV9GT1JNQVQKLSAgLyogVGhpcyBpcyBmb3IgR251LWNyZWF0ZWQgRExMcyAqLwotCi0gIC8qIFRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSAuaWRhdGEkIHNlY3Rpb25zIGhhdmUgY2xhc3MgMHg2OAotICAgICAoQ19TRUNUSU9OKSwgd2hpY2ggTVMgZG9jdW1lbnRhdGlvbiBpbmRpY2F0ZXMgaXMgYSBzZWN0aW9uCi0gICAgIHN5bWJvbC4gIFVuZm9ydHVuYXRlbHksIHRoZSB2YWx1ZSBmaWVsZCBpbiB0aGUgc3ltYm9sIGlzIHNpbXBseSBhCi0gICAgIGNvcHkgb2YgdGhlIC5pZGF0YSBzZWN0aW9uJ3MgZmxhZ3MgcmF0aGVyIHRoYW4gc29tZXRoaW5nIHVzZWZ1bC4KLSAgICAgV2hlbiB0aGVzZSBzeW1ib2xzIGFyZSBlbmNvdW50ZXJlZCwgY2hhbmdlIHRoZSB2YWx1ZSB0byAwIHNvIHRoYXQKLSAgICAgdGhleSB3aWxsIGJlIGhhbmRsZWQgc29tZXdoYXQgY29ycmVjdGx5IGluIHRoZSBiZmQgY29kZS4gICovCi0gIGlmIChpbi0+bl9zY2xhc3MgPT0gQ19TRUNUSU9OKQotICAgIHsKLSAgICAgIGluLT5uX3ZhbHVlID0gMHgwOwotCi0jaWYgMAotICAgICAgLyogRklYTUU6IFRoaXMgaXMgY2xlYXJseSB3cm9uZy4gIFRoZSBwcm9ibGVtIHNlZW1zIHRvIGJlIHRoYXQKLSAgICAgICAgIHVuZGVmaW5lZCBDX1NFQ1RJT04gc3ltYm9scyBhcHBlYXIgaW4gdGhlIGZpcnN0IG9iamVjdCBvZiBhCi0gICAgICAgICBNUyBnZW5lcmF0ZWQgLmxpYiBmaWxlLCBhbmQgdGhlIHN5bWJvbHMgYXJlIG5vdCBkZWZpbmVkCi0gICAgICAgICBhbnl3aGVyZS4gICovCi0gICAgICBpbi0+bl9zY251bSA9IDE7Ci0KLSAgICAgIC8qIEkgaGF2ZSB0cmllZCBzZXR0aW5nIHRoZSBjbGFzcyB0byAzIGFuZCB1c2luZyB0aGUgZm9sbG93aW5nCi0JIHRvIHNldCB0aGUgc2VjdGlvbiBudW1iZXIuICBUaGlzIHdpbGwgcHV0IHRoZSBhZGRyZXNzIG9mIHRoZQotCSBwb2ludGVyIHRvIHRoZSBzdHJpbmcga2VybmVsMzIuZGxsIGF0IGFkZHJlc3NlcyAwIGFuZCAweDEwCi0JIG9mZiBzdGFydCBvZiBpZGF0YSBzZWN0aW9uIHdoaWNoIGlzIG5vdCBjb3JyZWN0ICovCi0gICAgICAvKiAgICBpZiAoc3RyY21wIChpbi0+X24uX25fbmFtZSwgIi5pZGF0YSQ0IikgPT0gMCkgKi8KLSAgICAgIC8qICAgICAgaW4tPm5fc2NudW0gPSAzOyAqLwotICAgICAgLyogICAgZWxzZSAqLwotICAgICAgLyogICAgICBpbi0+bl9zY251bSA9IDI7ICovCi0jZWxzZQotICAgICAgLyogQ3JlYXRlIHN5bnRoZXRpYyBlbXB0eSBzZWN0aW9ucyBhcyBuZWVkZWQuICBESiAqLwotICAgICAgaWYgKGluLT5uX3NjbnVtID09IDApCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQkgIGZvciAoc2VjPWFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYz1zZWMtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChzZWMtPm5hbWUsIGluLT5uX25hbWUpID09IDApCi0JCXsKLQkJICBpbi0+bl9zY251bSA9IHNlYy0+dGFyZ2V0X2luZGV4OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoaW4tPm5fc2NudW0gPT0gMCkKLQl7Ci0JICBpbnQgdW51c2VkX3NlY3Rpb25fbnVtYmVyID0gMDsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBjaGFyICpuYW1lOwotCSAgZm9yIChzZWM9YWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjPXNlYy0+bmV4dCkKLQkgICAgaWYgKHVudXNlZF9zZWN0aW9uX251bWJlciA8PSBzZWMtPnRhcmdldF9pbmRleCkKLQkgICAgICB1bnVzZWRfc2VjdGlvbl9udW1iZXIgPSBzZWMtPnRhcmdldF9pbmRleCsxOwotCi0JICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGluLT5uX25hbWUpICsgMTApOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuOwotCSAgc3RyY3B5IChuYW1lLCBpbi0+bl9uYW1lKTsKLQkgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLQotCSAgc2VjLT52bWEgPSAwOwotCSAgc2VjLT5sbWEgPSAwOwotCSAgc2VjLT5fY29va2VkX3NpemUgPSAwOwotCSAgc2VjLT5fcmF3X3NpemUgPSAwOwotCSAgc2VjLT5maWxlcG9zID0gMDsKLQkgIHNlYy0+cmVsX2ZpbGVwb3MgPSAwOwotCSAgc2VjLT5yZWxvY19jb3VudCA9IDA7Ci0JICBzZWMtPmxpbmVfZmlsZXBvcyA9IDA7Ci0JICBzZWMtPmxpbmVub19jb3VudCA9IDA7Ci0JICBzZWMtPnVzZXJkYXRhID0gTlVMTDsKLQkgIHNlYy0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgc2VjLT5mbGFncyA9IDA7Ci0JICBzZWMtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JICBzZWMtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19EQVRBIHwgU0VDX0xPQUQ7Ci0KLQkgIHNlYy0+dGFyZ2V0X2luZGV4ID0gdW51c2VkX3NlY3Rpb25fbnVtYmVyOwotCi0JICBpbi0+bl9zY251bSA9IHVudXNlZF9zZWN0aW9uX251bWJlcjsKLQl9Ci0gICAgICBpbi0+bl9zY2xhc3MgPSBDX1NUQVQ7Ci0jZW5kaWYKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIGNvZmZfc3dhcF9zeW1faW5faG9vawotICAvKiBUaGlzIHdvbid0IHdvcmsgaW4gcGVpZ2VuLmMsIGJ1dCBzaW5jZSBpdCdzIGZvciBQUEMgUEUsIGl0J3Mgbm90Ci0gICAgIHdvcnRoIGZpeGluZy4gKi8KLSAgY29mZl9zd2FwX3N5bV9pbl9ob29rKGFiZmQsIGV4dDEsIGluMSk7Ci0jZW5kaWYKLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlaV9zd2FwX3N5bV9vdXQgKGFiZmQsIGlucCwgZXh0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJZXh0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWlucDsKLSAgU1lNRU5UICpleHQgPShTWU1FTlQgKilleHRwOwotICBpZihpbi0+X24uX25fbmFtZVswXSA9PSAwKSB7Ci0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX3plcm9lcyk7Ci0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT5fbi5fbl9uLl9uX29mZnNldCwgKGJmZF9ieXRlICopICBleHQtPmUuZS5lX29mZnNldCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbWVtY3B5KGV4dC0+ZS5lX25hbWUsIGluLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0gIH0KLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3ZhbHVlICwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAgaW4tPm5fc2NudW0gLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKLSAgaWYgKHNpemVvZihleHQtPmVfdHlwZSkgPT0gMikKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4tPm5fdHlwZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gICAgfQotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fc2NsYXNzICwgZXh0LT5lX3NjbGFzcyk7Ci0gIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9udW1hdXggLCBleHQtPmVfbnVtYXV4KTsKLQotICByZXR1cm4gU1lNRVNaOwotfQotCi12b2lkCi1fYmZkX3BlaV9zd2FwX2F1eF9pbiAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSCSAgICAgZXh0MTsKLSAgICAgaW50ICAgICAgICAgICAgIHR5cGU7Ci0gICAgIGludCAgICAgICAgICAgICBjbGFzczsKLSAgICAgaW50CSAgICAgaW5keCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQJICAgICBudW1hdXggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIAkgICAgIGluMTsKLXsKLSAgQVVYRU5UICAgICpleHQgPSAoQVVYRU5UICopZXh0MTsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbjE7Ci0KLSAgc3dpdGNoIChjbGFzcykgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoZXh0LT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0gICAgICBpbi0+eF9maWxlLnhfbi54X3plcm9lcyA9IDA7Ci0gICAgICBpbi0+eF9maWxlLnhfbi54X29mZnNldCA9Ci0JYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotICAgIH0KLSAgICByZXR1cm47Ci0KLQotICBjYXNlIENfU1RBVDoKLSAgY2FzZSBDX0xFQUZTVEFUOgotICBjYXNlIENfSElEREVOOgotICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotICAgICAgaW4tPnhfc2NuLnhfc2NubGVuID0gR0VUX1NDTl9TQ05MRU4oYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3Njbi54X25yZWxvYyA9IEdFVF9TQ05fTlJFTE9DKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zY24ueF9ubGlubm8gPSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc2NuLnhfY2hlY2tzdW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsCi0JCQkJCSAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY2hlY2tzdW0pOwotICAgICAgaW4tPnhfc2NuLnhfYXNzb2NpYXRlZCA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2Fzc29jaWF0ZWQpOwotICAgICAgaW4tPnhfc2NuLnhfY29tZGF0ID0gYmZkX2hfZ2V0XzggKGFiZmQsCi0JCQkJCShiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY29tZGF0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBpbi0+eF9zeW0ueF90YWduZHgubCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0gIGluLT54X3N5bS54X3R2bmR4ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSBHRVRfRkNOX0xOTk9QVFIgKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA9IEdFVF9GQ05fRU5ETkRYIChhYmZkLCBleHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04odHlwZSkpIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfZnNpemUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfZnNpemUpOwotICB9Ci0gIGVsc2UgewotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubyA9IEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KTsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUgPSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCk7Ci0gIH0KLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlaV9zd2FwX2F1eF9vdXQgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCkKLSAgICAgYmZkICAqYWJmZDsKLSAgICAgUFRSICAgaW5wOwotICAgICBpbnQgICB0eXBlOwotICAgICBpbnQgICBjbGFzczsKLSAgICAgaW50ICAgaW5keCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgICBudW1hdXggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSICAgZXh0cDsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbnA7Ci0gIEFVWEVOVCAqZXh0ID0gKEFVWEVOVCAqKWV4dHA7Ci0KLSAgbWVtc2V0KChQVFIpZXh0LCAwLCBBVVhFU1opOwotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gIGNhc2UgQ19GSUxFOgotICAgIGlmIChpbi0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgewotICAgICAgYmZkX2hfcHV0XzMyKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF96ZXJvZXMpOwotICAgICAgYmZkX2hfcHV0XzMyKGFiZmQsCi0JICAgICAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQsCi0JICAgICAgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgbWVtY3B5IChleHQtPnhfZmlsZS54X2ZuYW1lLCBpbi0+eF9maWxlLnhfZm5hbWUsIEZJTE5NTEVOKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFVWEVTWjsKLQotCi0gIGNhc2UgQ19TVEFUOgotICBjYXNlIENfTEVBRlNUQVQ6Ci0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBQVVRfU0NOX1NDTkxFTihhYmZkLCBpbi0+eF9zY24ueF9zY25sZW4sIGV4dCk7Ci0gICAgICBQVVRfU0NOX05SRUxPQyhhYmZkLCBpbi0+eF9zY24ueF9ucmVsb2MsIGV4dCk7Ci0gICAgICBQVVRfU0NOX05MSU5OTyhhYmZkLCBpbi0+eF9zY24ueF9ubGlubm8sIGV4dCk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT54X3Njbi54X2NoZWNrc3VtLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jaGVja3N1bSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3Njbi54X2Fzc29jaWF0ZWQsCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2Fzc29jaWF0ZWQpOwotICAgICAgYmZkX2hfcHV0XzggKGFiZmQsIGluLT54X3Njbi54X2NvbWRhdCwKLQkJICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jb21kYXQpOwotICAgICAgcmV0dXJuIEFVWEVTWjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPnhfc3ltLnhfdGFnbmR4LmwsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X3R2bmR4ICwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBleHQpOwotICAgICAgUFVUX0ZDTl9FTkRORFgoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sLCBleHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOICh0eXBlKSkKLSAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSwKLQkgICAgIChiZmRfYnl0ZSAqKSAgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQVVRfTE5TWl9MTk5PIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8sIGV4dCk7Ci0gICAgICBQVVRfTE5TWl9TSVpFIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsIGV4dCk7Ci0gICAgfQotCi0gIHJldHVybiBBVVhFU1o7Ci19Ci0KLXZvaWQKLV9iZmRfcGVpX3N3YXBfbGluZW5vX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIExJTkVOTyAqZXh0ID0gKExJTkVOTyAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWluMTsKLQotICBpbi0+bF9hZGRyLmxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0gIGluLT5sX2xubm8gPSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KTsKLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlaV9zd2FwX2xpbmVub19vdXQgKGFiZmQsIGlucCwgb3V0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJb3V0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWlucDsKLSAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqZXh0ID0gKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKilvdXRwOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopCi0JICBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0KLSAgUFVUX0xJTkVOT19MTk5PIChhYmZkLCBpbi0+bF9sbm5vLCBleHQpOwotICByZXR1cm4gTElORVNaOwotfQotCi12b2lkCi1fYmZkX3BlaV9zd2FwX2FvdXRoZHJfaW4gKGFiZmQsIGFvdXRoZHJfZXh0MSwgYW91dGhkcl9pbnQxKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBhb3V0aGRyX2V4dDE7Ci0gICAgIFBUUiBhb3V0aGRyX2ludDE7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICphOwotICBQRUFPVVRIRFIgKnNyYyA9IChQRUFPVVRIRFIgKikoYW91dGhkcl9leHQxKTsKLSAgQU9VVEhEUiAgICAgICAgKmFvdXRoZHJfZXh0ID0gKEFPVVRIRFIgKikgYW91dGhkcl9leHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilhb3V0aGRyX2ludDE7Ci0KLSAgYW91dGhkcl9pbnQtPm1hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+bWFnaWMpOwotICBhb3V0aGRyX2ludC0+dnN0YW1wID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dnN0YW1wKTsKLSAgYW91dGhkcl9pbnQtPnRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50c2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5kc2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZHNpemUpOwotICBhb3V0aGRyX2ludC0+YnNpemUgPQotICAgIEdFVF9BT1VUSERSX0JTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmJzaXplKTsKLSAgYW91dGhkcl9pbnQtPmVudHJ5ID0KLSAgICBHRVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5lbnRyeSk7Ci0gIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRleHRfc3RhcnQpOwotICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kYXRhX3N0YXJ0KTsKLQotICBhID0gJmFvdXRoZHJfaW50LT5wZTsKLSAgYS0+SW1hZ2VCYXNlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkltYWdlQmFzZSk7Ci0gIGEtPlNlY3Rpb25BbGlnbm1lbnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGEtPkZpbGVBbGlnbm1lbnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+RmlsZUFsaWdubWVudCk7Ci0gIGEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9Ci0gICAgYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7Ci0gIGEtPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9Ci0gICAgYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7Ci0gIGEtPk1ham9ySW1hZ2VWZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk1ham9ySW1hZ2VWZXJzaW9uKTsKLSAgYS0+TWlub3JJbWFnZVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TWlub3JJbWFnZVZlcnNpb24pOwotICBhLT5NYWpvclN1YnN5c3RlbVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYS0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGEtPlJlc2VydmVkMSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5SZXNlcnZlZDEpOwotICBhLT5TaXplT2ZJbWFnZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TaXplT2ZJbWFnZSk7Ci0gIGEtPlNpemVPZkhlYWRlcnMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2l6ZU9mSGVhZGVycyk7Ci0gIGEtPkNoZWNrU3VtID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkNoZWNrU3VtKTsKLSAgYS0+U3Vic3lzdGVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlN1YnN5c3RlbSk7Ci0gIGEtPkRsbENoYXJhY3RlcmlzdGljcyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5EbGxDaGFyYWN0ZXJpc3RpY3MpOwotICBhLT5TaXplT2ZTdGFja1Jlc2VydmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mU3RhY2tDb21taXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2l6ZU9mU3RhY2tDb21taXQpOwotICBhLT5TaXplT2ZIZWFwUmVzZXJ2ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TaXplT2ZIZWFwUmVzZXJ2ZSk7Ci0gIGEtPlNpemVPZkhlYXBDb21taXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2l6ZU9mSGVhcENvbW1pdCk7Ci0gIGEtPkxvYWRlckZsYWdzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkxvYWRlckZsYWdzKTsKLSAgYS0+TnVtYmVyT2ZSdmFBbmRTaXplcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5OdW1iZXJPZlJ2YUFuZFNpemVzKTsKLQotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICB7Ci0JYS0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzID0KLQkgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5EYXRhRGlyZWN0b3J5W2lkeF1bMF0pOwotCWEtPkRhdGFEaXJlY3RvcnlbaWR4XS5TaXplID0KLQkgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5EYXRhRGlyZWN0b3J5W2lkeF1bMV0pOwotICAgICAgfQotICB9Ci0KLSAgaWYgKGFvdXRoZHJfaW50LT5lbnRyeSkKLSAgICB7Ci0gICAgICBhb3V0aGRyX2ludC0+ZW50cnkgKz0gYS0+SW1hZ2VCYXNlOwotICAgICAgYW91dGhkcl9pbnQtPmVudHJ5ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbnQtPnRzaXplKSAKLSAgICB7Ci0gICAgICBhb3V0aGRyX2ludC0+dGV4dF9zdGFydCArPSBhLT5JbWFnZUJhc2U7Ci0gICAgICBhb3V0aGRyX2ludC0+dGV4dF9zdGFydCAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW50LT5kc2l6ZSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPmRhdGFfc3RhcnQgKz0gYS0+SW1hZ2VCYXNlOwotICAgICAgYW91dGhkcl9pbnQtPmRhdGFfc3RhcnQgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIC8qIFRoZXNlIHRocmVlIGZpZWxkcyBhcmUgbm9ybWFsbHkgc2V0IHVwIGJ5IHBwY19yZWxvY2F0ZV9zZWN0aW9uLgotICAgICBJbiB0aGUgY2FzZSBvZiByZWFkaW5nIGEgZmlsZSBpbiwgd2UgY2FuIHBpY2sgdGhlbSB1cCBmcm9tIHRoZQotICAgICBEYXRhRGlyZWN0b3J5LiAgKi8KLSAgZmlyc3RfdGh1bmtfYWRkcmVzcyA9IGEtPkRhdGFEaXJlY3RvcnlbMTJdLlZpcnR1YWxBZGRyZXNzIDsKLSAgdGh1bmtfc2l6ZSA9IGEtPkRhdGFEaXJlY3RvcnlbMTJdLlNpemU7Ci0gIGltcG9ydF90YWJsZV9zaXplID0gYS0+RGF0YURpcmVjdG9yeVsxXS5TaXplOwotI2VuZGlmCi0KLX0KLQotLyogQSBzdXBwb3J0IGZ1bmN0aW9uIGZvciBiZWxvdy4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfZGF0YV9lbnRyeSAoYWJmZCwgYW91dCwgaWR4LCBuYW1lLCBiYXNlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICphb3V0OwotICAgICBpbnQgaWR4OwotICAgICBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGJhc2U7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0KLSAgLyogYWRkIGltcG9ydCBkaXJlY3RvcnkgaW5mb3JtYXRpb24gaWYgaXQgZXhpc3RzICovCi0gIGlmICgoc2VjICE9IE5VTEwpCi0gICAgICAmJiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTCkKLSAgICAgICYmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpKQotICAgIHsKLSAgICAgIGFvdXQtPkRhdGFEaXJlY3RvcnlbaWR4XS5WaXJ0dWFsQWRkcmVzcyA9IChzZWMtPnZtYSAtIGJhc2UpICYgMHhmZmZmZmZmZjsKLSAgICAgIGFvdXQtPkRhdGFEaXJlY3RvcnlbaWR4XS5TaXplID0gcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+dmlydF9zaXplOwotICAgICAgc2VjLT5mbGFncyB8PSBTRUNfREFUQTsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICphb3V0aGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopaW47Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICpleHRyYSA9ICZwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyOwotICBQRUFPVVRIRFIgKmFvdXRoZHJfb3V0ID0gKFBFQU9VVEhEUiAqKW91dDsKLQotICBiZmRfdm1hIHNhID0gZXh0cmEtPlNlY3Rpb25BbGlnbm1lbnQ7Ci0gIGJmZF92bWEgZmEgPSBleHRyYS0+RmlsZUFsaWdubWVudDsKLSAgYmZkX3ZtYSBpYiA9IGV4dHJhLT5JbWFnZUJhc2UgOwotCi0gIGlmIChhb3V0aGRyX2luLT50c2l6ZSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbi0+dGV4dF9zdGFydCAtPSBpYjsKLSAgICAgIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gIGlmIChhb3V0aGRyX2luLT5kc2l6ZSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCAtPSBpYjsKLSAgICAgIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gIGlmIChhb3V0aGRyX2luLT5lbnRyeSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbi0+ZW50cnkgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT5lbnRyeSAmPSAweGZmZmZmZmZmOwotICAgIH0KLQotI2RlZmluZSBGQSh4KSAgKCgoeCkgKyBmYSAtMSApICYgKC0gZmEpKQotI2RlZmluZSBTQSh4KSAgKCgoeCkgKyBzYSAtMSApICYgKC0gc2EpKQotCi0gIC8qIFdlIGxpa2UgdG8gaGF2ZSB0aGUgc2l6ZXMgYWxpZ25lZCAqLwotCi0gIGFvdXRoZHJfaW4tPmJzaXplID0gRkEgKGFvdXRoZHJfaW4tPmJzaXplKTsKLQotCi0gIGV4dHJhLT5OdW1iZXJPZlJ2YUFuZFNpemVzID0gSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVM7Ci0KLSAgLyogZmlyc3QgbnVsbCBvdXQgYWxsIGRhdGEgZGlyZWN0b3J5IGVudHJpZXMgLi4gKi8KLSAgbWVtc2V0IChleHRyYS0+RGF0YURpcmVjdG9yeSwgc2l6ZW9mIChleHRyYS0+RGF0YURpcmVjdG9yeSksIDApOwotCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMCwgIi5lZGF0YSIsIDApOwotCi0gIC8qIERvbid0IGNhbGwgYWRkX2RhdGFfZW50cnkgZm9yIC5pZGF0YSQyIG9yIC5pZGF0YSQ1LiAgSXQncyBkb25lIGluCi0gICAgIGJmZF9jb2ZmX2ZpbmFsX2xpbmsgd2hlcmUgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBpcwotICAgICBhdmFpbGFibGUuICAqLwotCi0gIC8qIEhvd2V2ZXIsIHVudGlsIG90aGVyIC5pZGF0YSBmaXhlcyBhcmUgbWFkZSAocGVuZGluZyBwYXRjaCksIHRoZQotICAgICBlbnRyeSBmb3IgLmlkYXRhIGlzIG5lZWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkuICBGSVhNRS4gICovCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMSwgIi5pZGF0YSIgLDApOwotCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMiwgIi5yc3JjIiAsMCk7Ci0KLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAzLCAiLnBkYXRhIiwgMCk7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgdmlydHVhbCBzaXplICh3aGljaCBpcyB3aGF0J3Mgc2V0IGJ5Ci0gICAgIGFkZF9kYXRhX2VudHJ5KSBmb3IgLnJlbG9jIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgc2l6ZSByZWNvcmRlZAotICAgICBpbiB0aGlzIHNsb3QgYnkgTVNWQzsgaXQgZG9lc24ndCBzZWVtIHRvIGNhdXNlIHByb2JsZW1zIChzbyBmYXIpLAotICAgICBidXQgc2luY2UgaXQncyB0aGUgYmVzdCB3ZSd2ZSBnb3QsIHVzZSBpdC4gIEl0IGRvZXMgZG8gdGhlIHJpZ2h0Ci0gICAgIHRoaW5nIGZvciAucGRhdGEuICAqLwotICBpZiAocGVfZGF0YSAoYWJmZCktPmhhc19yZWxvY19zZWN0aW9uKQotICAgIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgNSwgIi5yZWxvYyIsIDApOwotCi0gIHsKLSAgICBhc2VjdGlvbiAqc2VjOwotICAgIGJmZF92bWEgZHNpemU9IDA7Ci0gICAgYmZkX3ZtYSBpc2l6ZSA9IFNBKGFiZmQtPnNlY3Rpb25zLT5maWxlcG9zKTsKLSAgICBiZmRfdm1hIHRzaXplPSAwOwotCi0gICAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgICB7Ci0JaW50IHJvdW5kZWQgPSBGQShzZWMtPl9yYXdfc2l6ZSk7Ci0KLQlpZiAoc2VjLT5mbGFncyAmIFNFQ19EQVRBKQotCSAgZHNpemUgKz0gcm91bmRlZDsKLQlpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCSAgdHNpemUgKz0gcm91bmRlZDsKLQkvKiBUaGUgaW1hZ2Ugc2l6ZSBpcyB0aGUgdG90YWwgVklSVFVBTCBzaXplICh3aGljaCBpcyB3aGF0IGlzCi0JICAgaW4gdGhlIHZpcnRfc2l6ZSBmaWVsZCkuICBGaWxlcyBoYXZlIGJlZW4gc2VlbiAoZnJvbSBNU1ZDCi0JICAgNS4wIGxpbmsuZXhlKSB3aGVyZSB0aGUgZmlsZSBzaXplIG9mIHRoZSAuZGF0YSBzZWdtZW50IGlzCi0JICAgcXVpdGUgc21hbGwgY29tcGFyZWQgdG8gdGhlIHZpcnR1YWwgc2l6ZS4gIFdpdGhvdXQgdGhpcwotCSAgIGZpeCwgc3RyaXAgbXVuZ2VzIHRoZSBmaWxlLiAgKi8KLQlpc2l6ZSArPSBTQSAoRkEgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnZpcnRfc2l6ZSkpOwotICAgICAgfQotCi0gICAgYW91dGhkcl9pbi0+ZHNpemUgPSBkc2l6ZTsKLSAgICBhb3V0aGRyX2luLT50c2l6ZSA9IHRzaXplOwotICAgIGV4dHJhLT5TaXplT2ZJbWFnZSA9IGlzaXplOwotICB9Ci0KLSAgZXh0cmEtPlNpemVPZkhlYWRlcnMgPSBhYmZkLT5zZWN0aW9ucy0+ZmlsZXBvczsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRoZHJfaW4tPm1hZ2ljLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLm1hZ2ljKTsKLQotI2RlZmluZSBMSU5LRVJfVkVSU0lPTiAyNTYgLyogVGhhdCBpcywgMi41NiAqLwotCi0gIC8qIFRoaXMgcGllY2Ugb2YgbWFnaWMgc2V0cyB0aGUgImxpbmtlciB2ZXJzaW9uIiBmaWVsZCB0bwotICAgICBMSU5LRVJfVkVSU0lPTi4gICovCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwKLQkJTElOS0VSX1ZFUlNJT04gLyAxMDAgKyAoTElOS0VSX1ZFUlNJT04gJSAxMDApICogMjU2LAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnZzdGFtcCk7Ci0KLSAgUFVUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPnRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnRzaXplKTsKLSAgUFVUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmRzaXplKTsKLSAgUFVUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmJzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmJzaXplKTsKLSAgUFVUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIGFvdXRoZHJfaW4tPmVudHJ5LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmVudHJ5KTsKLSAgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+dGV4dF9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC50ZXh0X3N0YXJ0KTsKLQotICBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0LAotCQkJICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmRhdGFfc3RhcnQpOwotCi0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+SW1hZ2VCYXNlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkltYWdlQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNlY3Rpb25BbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkZpbGVBbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RmlsZUFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWFqb3JJbWFnZVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vckltYWdlVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NaW5vckltYWdlVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yU3Vic3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vclN1YnN5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+UmVzZXJ2ZWQxLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlJlc2VydmVkMSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkltYWdlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkltYWdlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhZGVycywKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFkZXJzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+Q2hlY2tTdW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Q2hlY2tTdW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5TdWJzeXN0ZW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U3Vic3lzdGVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+RGxsQ2hhcmFjdGVyaXN0aWNzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZlN0YWNrUmVzZXJ2ZSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZTdGFja1Jlc2VydmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZTdGFja0NvbW1pdCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZTdGFja0NvbW1pdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYXBSZXNlcnZlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhcENvbW1pdCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+TG9hZGVyRmxhZ3MsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TG9hZGVyRmxhZ3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5OdW1iZXJPZlJ2YUFuZFNpemVzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICB7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzLAotCQkgICAgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRhdGFEaXJlY3RvcnlbaWR4XVswXSk7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiBBT1VUU1o7Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfb25seV9zd2FwX2ZpbGVoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgaW50IGlkeDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKilpbjsKLSAgc3RydWN0IGV4dGVybmFsX1BFSV9maWxlaGRyICpmaWxlaGRyX291dCA9IChzdHJ1Y3QgZXh0ZXJuYWxfUEVJX2ZpbGVoZHIgKilvdXQ7Ci0KLSAgaWYgKHBlX2RhdGEgKGFiZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbikKLSAgICBmaWxlaGRyX2luLT5mX2ZsYWdzICY9IH5GX1JFTEZMRzsKLQotICBpZiAocGVfZGF0YSAoYWJmZCktPmRsbCkKLSAgICBmaWxlaGRyX2luLT5mX2ZsYWdzIHw9IEZfRExMOwotCi0gIGZpbGVoZHJfaW4tPnBlLmVfbWFnaWMgICAgPSBET1NNQUdJQzsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jYmxwICAgICA9IDB4OTA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3AgICAgICAgPSAweDM7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3JsYyAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3BhcmhkciAgPSAweDQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfbWluYWxsb2MgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfbWF4YWxsb2MgPSAweGZmZmY7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfc3MgICAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfc3AgICAgICAgPSAweGI4OwotICBmaWxlaGRyX2luLT5wZS5lX2NzdW0gICAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX2lwICAgICAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX2NzICAgICAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX2xmYXJsYyAgID0gMHg0MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9vdm5vICAgICA9IDB4MDsKLQotICBmb3IgKGlkeD0wOyBpZHggPCA0OyBpZHgrKykKLSAgICBmaWxlaGRyX2luLT5wZS5lX3Jlc1tpZHhdID0gMHgwOwotCi0gIGZpbGVoZHJfaW4tPnBlLmVfb2VtaWQgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9vZW1pbmZvID0gMHgwOwotCi0gIGZvciAoaWR4PTA7IGlkeCA8IDEwOyBpZHgrKykKLSAgICBmaWxlaGRyX2luLT5wZS5lX3JlczJbaWR4XSA9IDB4MDsKLQotICBmaWxlaGRyX2luLT5wZS5lX2xmYW5ldyA9IDB4ODA7Ci0KLSAgLyogdGhpcyBuZXh0IGNvbGxlY3Rpb24gb2YgZGF0YSBhcmUgbW9zdGx5IGp1c3QgY2hhcmFjdGVycy4gIEl0IGFwcGVhcnMKLSAgICAgdG8gYmUgY29uc3RhbnQgd2l0aGluIHRoZSBoZWFkZXJzIHB1dCBvbiBOVCBleGVzICovCi0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzBdICA9IDB4MGViYTFmMGU7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzFdICA9IDB4Y2QwOWI0MDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzJdICA9IDB4NGMwMWI4MjE7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzNdICA9IDB4Njg1NDIxY2Q7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzRdICA9IDB4NzAyMDczNjk7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzVdICA9IDB4NzI2NzZmNzI7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzZdICA9IDB4NjMyMDZkNjE7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzddICA9IDB4NmY2ZTZlNjE7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzhdICA9IDB4NjU2MjIwNzQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzldICA9IDB4NmU3NTcyMjA7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEwXSA9IDB4MjA2ZTY5MjA7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzExXSA9IDB4MjA1MzRmNDQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEyXSA9IDB4NjU2NDZmNmQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEzXSA9IDB4MGEwZDBkMmU7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzE0XSA9IDB4MjQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzE1XSA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUubnRfc2lnbmF0dXJlID0gTlRfU0lHTkFUVVJFOwotCi0KLQotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX21hZ2ljKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbnNjbnMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc2Nucyk7Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIHRpbWUgKDApLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0KLSAgLyogcHV0IGluIGV4dHJhIGRvcyBoZWFkZXIgc3R1ZmYuICBUaGlzIGRhdGEgcmVtYWlucyBlc3NlbnRpYWxseQotICAgICBjb25zdGFudCwgaXQganVzdCBoYXMgdG8gYmUgdGFja2VkIG9uIHRvIHRoZSBiZWdpbm5pbmcgb2YgYWxsIGV4ZXMKLSAgICAgZm9yIE5UICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jYmxwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY2JscCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3ApOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcmxjLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3JsYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwYXJoZHIsCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jcGFyaGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbWluYWxsb2MsCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9taW5hbGxvYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21heGFsbG9jLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWF4YWxsb2MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9zcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3NzKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfc3AsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9zcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzdW0sIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jc3VtKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfaXAsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9pcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9sZmFybGMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9sZmFybGMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vdm5vLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb3Zubyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDQ7IGlkeCsrKQotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfcmVzW2lkeF0sCi0JCSAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9yZXNbaWR4XSk7Ci0gIH0KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfb2VtaWQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9vZW1pZCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX29lbWluZm8sCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9vZW1pbmZvKTsKLSAgewotICAgIGludCBpZHg7Ci0gICAgZm9yIChpZHg9MDsgaWR4IDwgMTA7IGlkeCsrKQotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfcmVzMltpZHhdLAotCQkgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfcmVzMltpZHhdKTsKLSAgfQotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9sZmFuZXcsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9sZmFuZXcpOwotCi0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDE2OyBpZHgrKykKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVtpZHhdLAotCQkgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmRvc19tZXNzYWdlW2lkeF0pOwotICB9Ci0KLSAgLyogYWxzbyBwdXQgaW4gdGhlIE5UIHNpZ25hdHVyZSAqLwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+cGUubnRfc2lnbmF0dXJlLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPm50X3NpZ25hdHVyZSk7Ci0KLQotCi0KLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlX29ubHlfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfdGltZGF0LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0KLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlaV9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKilpbjsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKW91dDsKLSAgdW5zaWduZWQgaW50IHJldCA9IFNDTkhTWjsKLSAgYmZkX3ZtYSBwczsKLSAgYmZkX3ZtYSBzczsKLQotICBtZW1jcHkoc2NuaGRyX2V4dC0+c19uYW1lLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKLQotICBQVVRfU0NOSERSX1ZBRERSIChhYmZkLAotCQkgICAgKChzY25oZHJfaW50LT5zX3ZhZGRyIAotCQkgICAgICAtIHBlX2RhdGEoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpCi0JCSAgICAgJiAweGZmZmZmZmZmKSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLQotICAvKiBOVCB3YW50cyB0aGUgc2l6ZSBkYXRhIHRvIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQKLSAgICAgTlRfRklMRV9BTElHTk1FTlQsIGJ1dCB6ZXJvIGlmIGl0IGhhcyBubyBjb250ZW50IChhcyBpbiAuYnNzLAotICAgICBzb21ldGltZXMpLiAgKi8KLQotICBpZiAoKHNjbmhkcl9pbnQtPnNfZmxhZ3MgJiBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSkgIT0gMCkKLSAgICB7Ci0gICAgICBwcyA9IHNjbmhkcl9pbnQtPnNfc2l6ZTsKLSAgICAgIHNzID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcyA9IHNjbmhkcl9pbnQtPnNfcGFkZHI7Ci0gICAgICBzcyA9IHNjbmhkcl9pbnQtPnNfc2l6ZTsKLSAgICB9Ci0KLSAgUFVUX1NDTkhEUl9TSVpFIChhYmZkLCBzcywKLQkJICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2l6ZSk7Ci0KLQotICAvKiBzX3BhZGRyIGluIFBFIGlzIHJlYWxseSB0aGUgdmlydHVhbCBzaXplLiAgKi8KLSAgUFVUX1NDTkhEUl9QQUREUiAoYWJmZCwgcHMsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLQotICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLQotICAvKiBFeHRyYSBmbGFncyBtdXN0IGJlIHNldCB3aGVuIGRlYWxpbmcgd2l0aCBOVC4gIEFsbCBzZWN0aW9ucyBzaG91bGQgYWxzbwotICAgICBoYXZlIHRoZSBJTUFHRV9TQ05fTUVNX1JFQUQgKDB4NDAwMDAwMDApIGZsYWcgc2V0LiAgSW4gYWRkaXRpb24sIHRoZQotICAgICAudGV4dCBzZWN0aW9uIG11c3QgaGF2ZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgKDB4MjAwMDAwMDApIGFuZCB0aGUgZGF0YQotICAgICBzZWN0aW9ucyAoLmlkYXRhLCAuZGF0YSwgLmJzcywgLkNSVCkgbXVzdCBoYXZlIElNQUdFX1NDTl9NRU1fV1JJVEUgc2V0Ci0gICAgICh0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4gZGVhbGluZyB3aXRoIHRoZSAuaWRhdGEgc2VjdGlvbiBzaW5jZQotICAgICB0aGUgYWRkcmVzc2VzIGZvciByb3V0aW5lcyBmcm9tIC5kbGxzIG11c3QgYmUgb3ZlcndyaXR0ZW4pLiAgSWYgLnJlbG9jCi0gICAgIHNlY3Rpb24gZGF0YSBpcyBldmVyIGdlbmVyYXRlZCwgd2UgbXVzdCBhZGQgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRQotICAgICAoMHgwMjAwMDAwMCkuICBBbHNvLCB0aGUgcmVzb3VyY2UgZGF0YSBzaG91bGQgYWxzbyBiZSByZWFkIGFuZAotICAgICB3cml0YWJsZS4gICovCi0KLSAgLyogRklYTUU6IGFsaWdubWVudCBpcyBhbHNvIGVuY29kZWQgaW4gdGhpcyBmaWVsZCwgYXQgbGVhc3Qgb24gcHBjIChrcmspICovCi0gIC8qIEZJWE1FOiBldmVuIHdvcnNlLCBJIGRvbid0IHNlZSBob3cgdG8gZ2V0IHRoZSBvcmlnaW5hbCBhbGlnbm1lbnQgZmllbGQqLwotICAvKiAgICAgICAgYmFjay4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICB7Ci0gICAgaW50IGZsYWdzID0gc2NuaGRyX2ludC0+c19mbGFnczsKLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmxhZ3MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgfQotCi0gIGlmIChjb2ZmX2RhdGEgKGFiZmQpLT5saW5rX2luZm8KLSAgICAgICYmICEgY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvLT5zaGFyZWQKLSAgICAgICYmIHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEJ5IGluZmVyZW5jZSBmcm9tIGxvb2tpbmcgYXQgTVMgb3V0cHV0LCB0aGUgMzIgYml0IGZpZWxkCi0JIHdoaWNoIGlzIHRoZSBjb21iaW50aW9uIG9mIHRoZSBudW1iZXJfb2ZfcmVsb2NzIGFuZAotCSBudW1iZXJfb2ZfbGluZW5vcyBpcyB1c2VkIGZvciB0aGUgbGluZSBudW1iZXIgY291bnQgaW4KLQkgZXhlY3V0YWJsZXMuICBBIDE2LWJpdCBmaWVsZCB3b24ndCBkbyBmb3IgY2MxLiAgVGhlIE1TCi0JIGRvY3VtZW50IHNheXMgdGhhdCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBpcyB6ZXJvIGZvcgotCSBleGVjdXRhYmxlcywgYnV0IHRoZSAxNy10aCBiaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdG8gYmUgdGhlcmUuCi0JIE92ZXJmbG93IGlzIG5vdCBhbiBpc3N1ZTogYSA0Ry1saW5lIHByb2dyYW0gd2lsbCBvdmVyZmxvdyBhCi0JIGJ1bmNoIG9mIG90aGVyIGZpZWxkcyBsb25nIGJlZm9yZSB0aGlzISAgKi8KLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubyAmIDB4ZmZmZiwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubyA+PiAxNiwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNjbmhkcl9pbnQtPnNfbmxubm8gPD0gMHhmZmZmKQotCWJmZF9oX3B1dF8xNiAoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubywKLQkJICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgc2NuaGRyX2ludC0+c19ubG5ubyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLQkgIHJldCA9IDA7Ci0JfQotICAgICAgaWYgKHNjbmhkcl9pbnQtPnNfbnJlbG9jIDw9IDB4ZmZmZikKLQliZmRfaF9wdXRfMTYgKGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHJlbG9jIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgc2NuaGRyX2ludC0+c19ucmVsb2MpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMHhmZmZmLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotCSAgcmV0ID0gMDsKLQl9Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY2hhciAqIGRpcl9uYW1lc1tJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU10gPQotewotICBOXyAoIkV4cG9ydCBEaXJlY3RvcnkgWy5lZGF0YSAob3Igd2hlcmUgZXZlciB3ZSBmb3VuZCBpdCldIiksCi0gIE5fICgiSW1wb3J0IERpcmVjdG9yeSBbcGFydHMgb2YgLmlkYXRhXSIpLAotICBOXyAoIlJlc291cmNlIERpcmVjdG9yeSBbLnJzcmNdIiksCi0gIE5fICgiRXhjZXB0aW9uIERpcmVjdG9yeSBbLnBkYXRhXSIpLAotICBOXyAoIlNlY3VyaXR5IERpcmVjdG9yeSIpLAotICBOXyAoIkJhc2UgUmVsb2NhdGlvbiBEaXJlY3RvcnkgWy5yZWxvY10iKSwKLSAgTl8gKCJEZWJ1ZyBEaXJlY3RvcnkiKSwKLSAgTl8gKCJEZXNjcmlwdGlvbiBEaXJlY3RvcnkiKSwKLSAgTl8gKCJTcGVjaWFsIERpcmVjdG9yeSIpLAotICBOXyAoIlRocmVhZCBTdG9yYWdlIERpcmVjdG9yeSBbLnRsc10iKSwKLSAgTl8gKCJMb2FkIENvbmZpZ3VyYXRpb24gRGlyZWN0b3J5IiksCi0gIE5fICgiQm91bmQgSW1wb3J0IERpcmVjdG9yeSIpLAotICBOXyAoIkltcG9ydCBBZGRyZXNzIFRhYmxlIERpcmVjdG9yeSIpLAotICBOXyAoIlJlc2VydmVkIiksCi0gIE5fICgiUmVzZXJ2ZWQiKSwKLSAgTl8gKCJSZXNlcnZlZCIpCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0vKiBUaGUgY29kZSBmb3IgdGhlIFBQQyByZWFsbHkgZmFsbHMgaW4gdGhlICJhcmNoaXRlY3R1cmUgZGVwZW5kZW50IgotICAgY2F0ZWdvcnkuICBIb3dldmVyLCBpdCdzIG5vdCBjbGVhciB0aGF0IGFueW9uZSB3aWxsIGV2ZXIgY2FyZSwgc28KLSAgIHdlJ3JlIGlnbm9yaW5nIHRoZSBpc3N1ZSBmb3Igbm93OyBpZi93aGVuIFBQQyBtYXR0ZXJzLCBzb21lIG9mIHRoaXMKLSAgIG1heSBuZWVkIHRvIGdvIGludG8gcGVpY29kZS5oLCBvciBhcmd1bWVudHMgcGFzc2VkIHRvIGVuYWJsZSB0aGUKLSAgIFBQQy0gc3BlY2lmaWMgY29kZS4gICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfaWRhdGEgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaWRhdGEiKTsKLSAgdW5zaWduZWQgbG9uZyBhZGo7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIGFzZWN0aW9uICpyZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbGRhdGEiKTsKLSNlbmRpZgotCi0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemU7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YW9mZjsKLSAgYmZkX3NpemVfdHlwZSBzZWNzaXplOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGludCBvbmFsaW5lID0gMjA7Ci0KLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGUtPnBlX29wdGhkcjsKLQotICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBkYXRhb2ZmID0gMDsKLQotICAgICAgaWYgKGRhdGFzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsIF8oIlxuVGhlIGltcG9ydCB0YWJsZSBpcyB0aGUgLmlkYXRhIHNlY3Rpb25cbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBpZGF0YSBidXJpZWQgaW4gc29tZSBvdGhlciBzZWN0aW9uOiBlLmcuIEtFUk5FTDMyLkRMTC4gICovCi0gICAgICBiZmRfdm1hIGFkZHIsIHNpemU7Ci0KLSAgICAgIGFkZHIgPSBleHRyYS0+RGF0YURpcmVjdG9yeVsxXS5WaXJ0dWFsQWRkcmVzczsKLSAgICAgIHNpemUgPSBleHRyYS0+RGF0YURpcmVjdG9yeVsxXS5TaXplOwotCi0gICAgICBpZiAoYWRkciA9PSAwIHx8IHNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgIGlmIChhZGRyID49IHNlY3Rpb24tPnZtYQotCSAgICAgICAmJiBhZGRyIDwgc2VjdGlvbi0+dm1hICsgYmZkX3NlY3Rpb25fc2l6ZShhYmZkLHNlY3Rpb24pKQotCSAgICAgICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JewotCSAgIGZwcmludGYgKGZpbGUsCi0JCSAgICBfKCJcblRoZXJlIGlzIGFuIGltcG9ydCB0YWJsZSwgYnV0IHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgaXQgY291bGQgbm90IGJlIGZvdW5kXG4iKSk7Ci0JICAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmaWxlLCBfKCJcblRoZXJlIGlzIGFuIGltcG9ydCB0YWJsZSBpbiAlcyBhdCAweCVseFxuIiksCi0JICAgICAgIHNlY3Rpb24tPm5hbWUsICh1bnNpZ25lZCBsb25nKWFkZHIpOwotCi0gICAgICBkYXRhb2ZmID0gYWRkciAtIHNlY3Rpb24tPnZtYTsKLSAgICAgIGRhdGFzaXplID0gc2l6ZTsKLSAgICB9Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIGlmIChyZWxfc2VjdGlvbiAhPSAwICYmIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSB0b2MgYWRkcmVzcyBjYW4gYmUgZm91bmQgYnkgdGFraW5nIHRoZSBzdGFydGluZyBhZGRyZXNzLAotCSB3aGljaCBvbiB0aGUgUFBDIGxvY2F0ZXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiBUaGUKLQkgZGVzY3JpcHRvciBjb25zaXN0cyBvZiB0aGUgZnVuY3Rpb24gY29kZSBzdGFydGluZyBhZGRyZXNzCi0JIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzIG9mIHRoZSB0b2MuIFRoZSBzdGFydGluZyBhZGRyZXNzIHdlCi0JIGdldCBmcm9tIHRoZSBiZmQsIGFuZCB0aGUgZGVzY3JpcHRvciBpcyBzdXBwb3NlZCB0byBiZSBpbiB0aGUKLQkgLnJlbGRhdGEgc2VjdGlvbi4gICovCi0KLSAgICAgIGJmZF92bWEgbG9hZGFibGVfdG9jX2FkZHJlc3M7Ci0gICAgICBiZmRfdm1hIHRvY19hZGRyZXNzOwotICAgICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotICAgICAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICAgICAgaW50IG9mZnNldDsKLSAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwKLQkJCQkJCQkJIHJlbF9zZWN0aW9uKSk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMICYmIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbik7Ci0gIAotICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJCXJlbF9zZWN0aW9uLAotCQkJCShQVFIpIGRhdGEsIDAsCi0JCQkJYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pKTsKLQotICAgICAgb2Zmc2V0ID0gYWJmZC0+c3RhcnRfYWRkcmVzcyAtIHJlbF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIHN0YXJ0X2FkZHJlc3MgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErb2Zmc2V0KTsKLSAgICAgIGxvYWRhYmxlX3RvY19hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK29mZnNldCs0KTsKLSAgICAgIHRvY19hZGRyZXNzID0gbG9hZGFibGVfdG9jX2FkZHJlc3MgLSAzMjc2ODsKLQotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgIF8oIlxuRnVuY3Rpb24gZGVzY3JpcHRvciBsb2NhdGVkIGF0IHRoZSBzdGFydCBhZGRyZXNzOiAlMDRseFxuIiksCi0JICAgICAgKHVuc2lnbmVkIGxvbmcgaW50KSAoYWJmZC0+c3RhcnRfYWRkcmVzcykpOwotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgXygiXHRjb2RlLWJhc2UgJTA4bHggdG9jIChsb2FkYWJsZS9hY3R1YWwpICUwOGx4LyUwOGx4XG4iKSwKLQkgICAgICAgc3RhcnRfYWRkcmVzcywgbG9hZGFibGVfdG9jX2FkZHJlc3MsIHRvY19hZGRyZXNzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgXygiXG5ObyByZWxkYXRhIHNlY3Rpb24hIEZ1bmN0aW9uIGRlc2NyaXB0b3Igbm90IGRlY29kZWQuXG4iKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5UaGUgSW1wb3J0IFRhYmxlcyAoaW50ZXJwcmV0ZWQgLmlkYXRhIHNlY3Rpb24gY29udGVudHMpXG4iKSk7Ci0gIGZwcmludGYoZmlsZSwKLQkgIF8oIiB2bWE6ICAgICAgICAgICAgSGludCAgICBUaW1lICAgICAgRm9yd2FyZCAgRExMICAgICAgIEZpcnN0XG4iKSk7Ci0gIGZwcmludGYoZmlsZSwKLQkgIF8oIiAgICAgICAgICAgICAgICAgVGFibGUgICBTdGFtcCAgICAgQ2hhaW4gICAgTmFtZSAgICAgIFRodW5rXG4iKSk7Ci0KLSAgc2Vjc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlY3NpemUpOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIHNlY3NpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCAwLCBzZWNzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWRqID0gLSBzZWN0aW9uLT52bWE7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGRhdGFzaXplOyBpICs9IG9uYWxpbmUpCi0gICAgewotICAgICAgYmZkX3ZtYSBoaW50X2FkZHI7Ci0gICAgICBiZmRfdm1hIHRpbWVfc3RhbXA7Ci0gICAgICBiZmRfdm1hIGZvcndhcmRfY2hhaW47Ci0gICAgICBiZmRfdm1hIGRsbF9uYW1lOwotICAgICAgYmZkX3ZtYSBmaXJzdF90aHVuazsKLSAgICAgIGludCBpZHggPSAwOwotICAgICAgYmZkX3NpemVfdHlwZSBqOwotICAgICAgY2hhciAqZGxsOwotCi0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICAiICUwOGx4XHQiLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpIChpICsgc2VjdGlvbi0+dm1hICsgZGF0YW9mZikpOwotICAgICAgCi0gICAgICBpZiAoaSArIDIwID4gZGF0YXNpemUpCi0JewotCSAgLyogY2hlY2sgc3R1ZmYgKi8KLQkgIDsKLQl9Ci0KLSAgICAgIGhpbnRfYWRkciA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpICsgZGF0YW9mZik7Ci0gICAgICB0aW1lX3N0YW1wID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGkgKyA0ICsgZGF0YW9mZik7Ci0gICAgICBmb3J3YXJkX2NoYWluID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGkgKyA4ICsgZGF0YW9mZik7Ci0gICAgICBkbGxfbmFtZSA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpICsgMTIgKyBkYXRhb2ZmKTsKLSAgICAgIGZpcnN0X3RodW5rID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGkgKyAxNiArIGRhdGFvZmYpOwotCi0gICAgICBmcHJpbnRmIChmaWxlLCAiJTA4bHggJTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsCi0JICAgICAgIGhpbnRfYWRkciwKLQkgICAgICAgdGltZV9zdGFtcCwKLQkgICAgICAgZm9yd2FyZF9jaGFpbiwKLQkgICAgICAgZGxsX25hbWUsCi0JICAgICAgIGZpcnN0X3RodW5rKTsKLQotICAgICAgaWYgKGhpbnRfYWRkciA9PSAwICYmIGZpcnN0X3RodW5rID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIGRsbCA9IChjaGFyICopIGRhdGEgKyBkbGxfbmFtZSAtIHNlY3Rpb24tPnZtYSArIGRhdGFvZmY7Ci0gICAgICBmcHJpbnRmKGZpbGUsIF8oIlxuXHRETEwgTmFtZTogJXNcbiIpLCBkbGwpOwotCi0gICAgICBpZiAoaGludF9hZGRyICE9IDApCi0JewotCSAgZnByaW50ZiAoZmlsZSwgXygiXHR2bWE6ICBIaW50L09yZCBNZW1iZXItTmFtZVxuIikpOwotCi0JICBpZHggPSBoaW50X2FkZHIgKyBhZGo7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBkYXRhc2l6ZTsgaiArPSA0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBtZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4ICsgaik7Ci0KLQkgICAgICBpZiAobWVtYmVyID09IDApCi0JCWJyZWFrOwotCSAgICAgIGlmIChtZW1iZXIgJiAweDgwMDAwMDAwKQotCQlmcHJpbnRmIChmaWxlLCAiXHQlMDRseFx0ICU0bHUiLCBtZW1iZXIsCi0JCQkgbWVtYmVyICYgMHg3ZmZmZmZmZik7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW50IG9yZGluYWw7Ci0JCSAgY2hhciAqbWVtYmVyX25hbWU7Ci0KLQkJICBvcmRpbmFsID0gYmZkX2dldF8xNiAoYWJmZCwgZGF0YSArIG1lbWJlciArIGFkaik7Ci0JCSAgbWVtYmVyX25hbWUgPSAoY2hhciAqKSBkYXRhICsgbWVtYmVyICsgYWRqICsgMjsKLQkJICBmcHJpbnRmIChmaWxlLCAiXHQlMDRseFx0ICU0ZCAgJXMiLAotCQkJICAgbWVtYmVyLCBvcmRpbmFsLCBtZW1iZXJfbmFtZSk7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoZSB0aW1lIHN0YW1wIGlzIG5vdCB6ZXJvLCB0aGUgaW1wb3J0IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgdGFibGUgaG9sZHMgYWN0dWFsIGFkZHJlc3Nlcy4gICovCi0JICAgICAgaWYgKHRpbWVfc3RhbXAgIT0gMAotCQkgICYmIGZpcnN0X3RodW5rICE9IDAKLQkJICAmJiBmaXJzdF90aHVuayAhPSBoaW50X2FkZHIpCi0JCWZwcmludGYgKGZpbGUsICJcdCUwNGx4IiwKLQkJCSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgZmlyc3RfdGh1bmsgKyBhZGogKyBqKSk7Ci0KLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGhpbnRfYWRkciAhPSBmaXJzdF90aHVuayAmJiB0aW1lX3N0YW1wID09IDApCi0JewotCSAgaW50IGRpZmZlciA9IDA7Ci0JICBpbnQgaWR4MjsKLQotCSAgaWR4MiA9IGZpcnN0X3RodW5rICsgYWRqOwotCi0JICBmb3IgKGogPSAwOyBqIDwgZGF0YXNpemU7IGogKz0gNCkKLQkgICAgewotCSAgICAgIGludCBvcmRpbmFsOwotCSAgICAgIGNoYXIgKm1lbWJlcl9uYW1lOwotCSAgICAgIGJmZF92bWEgaGludF9tZW1iZXIgPSAwOwotCSAgICAgIGJmZF92bWEgaWF0X21lbWJlcjsKLQotCSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCkKLQkJaGludF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4ICsgaik7Ci0JICAgICAgaWF0X21lbWJlciA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpZHgyICsgaik7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyID09IDAgJiYgaWF0X21lbWJlciA9PSAwKQotCQlicmVhazsKLQotCSAgICAgIGlmIChoaW50X2FkZHIgPT0gMCB8fCBoaW50X21lbWJlciAhPSBpYXRfbWVtYmVyKQotCQl7Ci0JCSAgaWYgKGRpZmZlciA9PSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmaWxlLAotCQkJICAgICAgIF8oIlx0VGhlIEltcG9ydCBBZGRyZXNzIFRhYmxlIChkaWZmZXJlbmNlIGZvdW5kKVxuIikpOwotCQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIlx0dm1hOiAgSGludC9PcmQgTWVtYmVyLU5hbWVcbiIpKTsKLQkJICAgICAgZGlmZmVyID0gMTsKLQkJICAgIH0KLQkJICBpZiAoaWF0X21lbWJlciA9PSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmKGZpbGUsCi0JCQkgICAgICBfKCJcdD4+PiBSYW4gb3V0IG9mIElBVCBtZW1iZXJzIVxuIikpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgb3JkaW5hbCA9IGJmZF9nZXRfMTYoYWJmZCwKLQkJCQkJICAgZGF0YSArIGlhdF9tZW1iZXIgKyBhZGopOwotCQkgICAgICBtZW1iZXJfbmFtZSA9IChjaGFyICopIGRhdGEgKyBpYXRfbWVtYmVyICsgYWRqICsgMjsKLQkJICAgICAgZnByaW50ZihmaWxlLCAiXHQlMDRseFx0ICU0ZCAgJXNcbiIsCi0JCQkgICAgICBpYXRfbWVtYmVyLCBvcmRpbmFsLCBtZW1iZXJfbmFtZSk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCAmJiBoaW50X21lbWJlciA9PSAwKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKGRpZmZlciA9PSAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZihmaWxlLAotCQkgICAgICBfKCJcdFRoZSBJbXBvcnQgQWRkcmVzcyBUYWJsZSBpcyBpZGVudGljYWxcbiIpKTsKLQkgICAgfQotCX0KLQotICAgICAgZnByaW50ZihmaWxlLCAiXG4iKTsKLQotICAgIH0KLQotICBmcmVlIChkYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X2VkYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmVkYXRhIik7Ci0KLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhb2ZmOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgaW50IGFkajsKLSAgc3RydWN0IEVEVF90eXBlCi0gICAgewotICAgICAgbG9uZyBleHBvcnRfZmxhZ3M7ICAgICAgICAgICAgIC8qIHJlc2VydmVkIC0gc2hvdWxkIGJlIHplcm8gKi8KLSAgICAgIGxvbmcgdGltZV9zdGFtcDsKLSAgICAgIHNob3J0IG1ham9yX3ZlcjsKLSAgICAgIHNob3J0IG1pbm9yX3ZlcjsKLSAgICAgIGJmZF92bWEgbmFtZTsgICAgICAgICAgICAgICAgICAvKiBydmEgLSByZWxhdGl2ZSB0byBpbWFnZSBiYXNlICovCi0gICAgICBsb25nIGJhc2U7ICAgICAgICAgICAgICAgICAgICAgLyogb3JkaW5hbCBiYXNlICovCi0gICAgICB1bnNpZ25lZCBsb25nIG51bV9mdW5jdGlvbnM7ICAgLyogTnVtYmVyIGluIHRoZSBleHBvcnQgYWRkcmVzcyB0YWJsZSAqLwotICAgICAgdW5zaWduZWQgbG9uZyBudW1fbmFtZXM7ICAgICAgIC8qIE51bWJlciBpbiB0aGUgbmFtZSBwb2ludGVyIHRhYmxlICovCi0gICAgICBiZmRfdm1hIGVhdF9hZGRyOyAgICAvKiBydmEgdG8gdGhlIGV4cG9ydCBhZGRyZXNzIHRhYmxlICovCi0gICAgICBiZmRfdm1hIG5wdF9hZGRyOyAgICAgICAgLyogcnZhIHRvIHRoZSBFeHBvcnQgTmFtZSBQb2ludGVyIFRhYmxlICovCi0gICAgICBiZmRfdm1hIG90X2FkZHI7IC8qIHJ2YSB0byB0aGUgT3JkaW5hbCBUYWJsZSAqLwotICAgIH0gZWR0OwotCi0gIHBlX2RhdGFfdHlwZSAqcGUgPSBwZV9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmV4dHJhID0gJnBlLT5wZV9vcHRoZHI7Ci0KLSAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgZGF0YW9mZiA9IDA7Ci0gICAgICBmcHJpbnRmIChmaWxlLCBfKCJcblRoZSBleHBvcnQgdGFibGUgaXMgdGhlIC5lZGF0YSBzZWN0aW9uXG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogZWRhdGEgaXMgYnVyaWVkIGluIHNvbWUgb3RoZXIgc2VjdGlvbjogZS5nLiBOVERMTC5ETEwuICAqLwotICAgICAgYmZkX3ZtYSBhZGRyLCBzaXplOwotCi0gICAgICBhZGRyID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMF0uVmlydHVhbEFkZHJlc3M7Ci0gICAgICBzaXplID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMF0uU2l6ZTsKLQotICAgICAgaWYgKGFkZHIgPT0gMCB8fCBzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgICBpZiAoYWRkciA+PSBzZWN0aW9uLT52bWEKLQkgICAgICAgJiYgYWRkciA8IHNlY3Rpb24tPnZtYSArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKQotCSAgICAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICAgZnByaW50ZiAoZmlsZSwKLQkJICAgIF8oIlxuVGhlcmUgaXMgYW4gZXhwb3J0IHRhYmxlLCBidXQgdGhlIHNlY3Rpb24gY29udGFpbmluZyBpdCBjb3VsZCBub3QgYmUgZm91bmRcbiIpKTsKLQkgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsIF8oIlxuVGhlcmUgaXMgYW4gZXhwb3J0IHRhYmxlIGluICVzIGF0IDB4JWx4XG4iKSwKLQkgICAgICAgc2VjdGlvbi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIGFkZHIpOwotCi0gICAgICBkYXRhc2l6ZSA9IHNpemU7Ci0gICAgICBkYXRhb2ZmID0gYWRkciAtIHNlY3Rpb24tPnZtYTsKLSAgICB9Ci0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChkYXRhc2l6ZSk7Ci0gIGlmIChkYXRhID09IE5VTEwgJiYgZGF0YXNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgZGF0YXNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHbyBnZXQgRXhwb3J0IERpcmVjdG9yeSBUYWJsZSAqLwotICBlZHQuZXhwb3J0X2ZsYWdzICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMCk7Ci0gIGVkdC50aW1lX3N0YW1wICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSs0KTsKLSAgZWR0Lm1ham9yX3ZlciAgICAgID0gYmZkX2dldF8xNihhYmZkLCBkYXRhKzgpOwotICBlZHQubWlub3JfdmVyICAgICAgPSBiZmRfZ2V0XzE2KGFiZmQsIGRhdGErMTApOwotICBlZHQubmFtZSAgICAgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMTIpOwotICBlZHQuYmFzZSAgICAgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMTYpOwotICBlZHQubnVtX2Z1bmN0aW9ucyAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMjApOwotICBlZHQubnVtX25hbWVzICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMjQpOwotICBlZHQuZWF0X2FkZHIgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMjgpOwotICBlZHQubnB0X2FkZHIgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMzIpOwotICBlZHQub3RfYWRkciAgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMzYpOwotCi0gIGFkaiA9IC0gKHNlY3Rpb24tPnZtYSArIGRhdGFvZmYpOwotCi0gIC8qIER1bXAgdGhlIEVEVCBmaXJzdCBmaXJzdCAqLwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcblRoZSBFeHBvcnQgVGFibGVzIChpbnRlcnByZXRlZCAuZWRhdGEgc2VjdGlvbiBjb250ZW50cylcblxuIikpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIkV4cG9ydCBGbGFncyBcdFx0XHQlbHhcbiIpLCAodW5zaWduZWQgbG9uZykgZWR0LmV4cG9ydF9mbGFncyk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiVGltZS9EYXRlIHN0YW1wIFx0XHQlbHhcbiIpLCAodW5zaWduZWQgbG9uZykgZWR0LnRpbWVfc3RhbXApOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIk1ham9yL01pbm9yIFx0XHRcdCVkLyVkXG4iKSwgZWR0Lm1ham9yX3ZlciwgZWR0Lm1pbm9yX3Zlcik7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJOYW1lIFx0XHRcdFx0IikpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgZWR0Lm5hbWUpOwotICBmcHJpbnRmIChmaWxlLAotCSAgICIgJXNcbiIsIGRhdGEgKyBlZHQubmFtZSArIGFkaik7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiT3JkaW5hbCBCYXNlIFx0XHRcdCVsZFxuIiksIGVkdC5iYXNlKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJOdW1iZXIgaW46XG4iKSk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXHRFeHBvcnQgQWRkcmVzcyBUYWJsZSBcdFx0JWx4XG4iKSwKLQkgIGVkdC5udW1fZnVuY3Rpb25zKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcdFtOYW1lIFBvaW50ZXIvT3JkaW5hbF0gVGFibGVcdCVsdVxuIiksIGVkdC5udW1fbmFtZXMpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlRhYmxlIEFkZHJlc3Nlc1xuIikpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiXHRFeHBvcnQgQWRkcmVzcyBUYWJsZSBcdFx0IikpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgZWR0LmVhdF9hZGRyKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgIF8oIlx0TmFtZSBQb2ludGVyIFRhYmxlIFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQubnB0X2FkZHIpOwotICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIlx0T3JkaW5hbCBUYWJsZSBcdFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQub3RfYWRkcik7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0gIAotICAvKiBUaGUgbmV4dCB0YWJsZSB0byBmaW5kIGlzIHRoZSBFeHBvcnQgQWRkcmVzcyBUYWJsZS4gSXQncyBiYXNpY2FsbHkKLSAgICAgYSBsaXN0IG9mIHBvaW50ZXJzIHRoYXQgZWl0aGVyIGxvY2F0ZSBhIGZ1bmN0aW9uIGluIHRoaXMgZGxsLCBvcgotICAgICBmb3J3YXJkIHRoZSBjYWxsIHRvIGFub3RoZXIgZGxsLiBTb21ldGhpbmcgbGlrZToKLSAgICAgIHR5cGVkZWYgdW5pb24KLSAgICAgIHsKLSAgICAgICAgbG9uZyBleHBvcnRfcnZhOwotICAgICAgICBsb25nIGZvcndhcmRlcl9ydmE7Ci0gICAgICB9IGV4cG9ydF9hZGRyZXNzX3RhYmxlX2VudHJ5OwotICAqLwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuRXhwb3J0IEFkZHJlc3MgVGFibGUgLS0gT3JkaW5hbCBCYXNlICVsZFxuIiksCi0JICBlZHQuYmFzZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGVkdC5udW1fZnVuY3Rpb25zOyArK2kpCi0gICAgewotICAgICAgYmZkX3ZtYSBlYXRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwKLQkJCQkgICAgICAgZGF0YSArIGVkdC5lYXRfYWRkciArIChpICogNCkgKyBhZGopOwotICAgICAgYmZkX3ZtYSBlYXRfYWN0dWFsID0gZWF0X21lbWJlcjsKLSAgICAgIGJmZF92bWEgZWRhdGFfc3RhcnQgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgIGJmZF92bWEgZWRhdGFfZW5kID0gZWRhdGFfc3RhcnQgKyBkYXRhc2l6ZTsKLQotICAgICAgaWYgKGVhdF9tZW1iZXIgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGVkYXRhX3N0YXJ0IDwgZWF0X2FjdHVhbCAmJiBlYXRfYWN0dWFsIDwgZWRhdGFfZW5kKQotCXsKLQkgIC8qIHRoaXMgcnZhIGlzIHRvIGEgbmFtZSAoZm9yd2FyZGluZyBmdW5jdGlvbikgaW4gb3VyIHNlY3Rpb24gKi8KLQkgIC8qIFNob3VsZCBsb2NhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yICovCi0JICBmcHJpbnRmIChmaWxlLAotCQkgICAiXHRbJTRsZF0gK2Jhc2VbJTRsZF0gJTA0bHggJXMgLS0gJXNcbiIsCi0JCSAgIChsb25nKSBpLCAobG9uZykgKGkgKyBlZHQuYmFzZSksIGVhdF9tZW1iZXIsCi0JCSAgIF8oIkZvcndhcmRlciBSVkEiKSwgZGF0YSArIGVhdF9tZW1iZXIgKyBhZGopOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBTaG91bGQgbG9jYXRlIGEgZnVuY3Rpb24gZGVzY3JpcHRvciBpbiB0aGUgcmVsZGF0YSBzZWN0aW9uICovCi0JICBmcHJpbnRmIChmaWxlLAotCQkgICAiXHRbJTRsZF0gK2Jhc2VbJTRsZF0gJTA0bHggJXNcbiIsCi0JCSAgIChsb25nKSBpLCAobG9uZykgKGkgKyBlZHQuYmFzZSksIGVhdF9tZW1iZXIsCi0JCSAgIF8oIkV4cG9ydCBSVkEiKSk7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgRXhwb3J0IE5hbWUgUG9pbnRlciBUYWJsZSBpcyBwYWlyZWQgd2l0aCB0aGUgRXhwb3J0IE9yZGluYWwgVGFibGUgKi8KLSAgLyogRHVtcCB0aGVtIGluIHBhcmFsbGVsIGZvciBjbGFyaXR5ICovCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuW09yZGluYWwvTmFtZSBQb2ludGVyXSBUYWJsZVxuIikpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBlZHQubnVtX25hbWVzOyArK2kpCi0gICAgewotICAgICAgYmZkX3ZtYSBuYW1lX3B0ciA9IGJmZF9nZXRfMzIoYWJmZCwKLQkJCQkgICAgZGF0YSArCi0JCQkJICAgIGVkdC5ucHRfYWRkcgotCQkJCSAgICArIChpKjQpICsgYWRqKTsKLSAgICAgIAotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIGRhdGEgKyBuYW1lX3B0ciArIGFkajsKLQotICAgICAgYmZkX3ZtYSBvcmQgPSBiZmRfZ2V0XzE2KGFiZmQsCi0JCQkJICAgIGRhdGEgKwotCQkJCSAgICBlZHQub3RfYWRkcgotCQkJCSAgICArIChpKjIpICsgYWRqKTsKLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICAiXHRbJTRsZF0gJXNcbiIsIChsb25nKSBvcmQsIG5hbWUpOwotCi0gICAgfQotCi0gIGZyZWUgKGRhdGEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfcGRhdGEgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnBkYXRhIik7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemUgPSAwOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGJmZF9zaXplX3R5cGUgc3RhcnQsIHN0b3A7Ci0gIGludCBvbmFsaW5lID0gMjA7Ci0KLSAgaWYgKHNlY3Rpb24gPT0gTlVMTAotICAgICAgfHwgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pID09IE5VTEwKLSAgICAgIHx8IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pID09IE5VTEwpCi0gICAgIHJldHVybiB0cnVlOwotCi0gIHN0b3AgPSBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dmlydF9zaXplOwotICBpZiAoKHN0b3AgJSBvbmFsaW5lKSAhPSAwKQotICAgIGZwcmludGYgKGZpbGUsIF8oIldhcm5pbmcsIC5wZGF0YSBzZWN0aW9uIHNpemUgKCVsZCkgaXMgbm90IGEgbXVsdGlwbGUgb2YgJWRcbiIpLAotCSAgICAgKGxvbmcpc3RvcCwgb25hbGluZSk7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJcblRoZSBGdW5jdGlvbiBUYWJsZSAoaW50ZXJwcmV0ZWQgLnBkYXRhIHNlY3Rpb24gY29udGVudHMpXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiIHZtYTpcdFx0QmVnaW4gICAgRW5kICAgICAgRUggICAgICAgRUggICAgICAgUHJvbG9nRW5kICBFeGNlcHRpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCIgICAgIFx0XHRBZGRyZXNzICBBZGRyZXNzICBIYW5kbGVyICBEYXRhICAgICBBZGRyZXNzICAgIE1hc2tcbiIpKTsKLQotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCAmJiBkYXRhc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkgICAgc2VjdGlvbiwKLQkJCSAgICAoUFRSKSBkYXRhLCAwLAotCQkJICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLQotICBzdGFydCA9IDA7Ci0KLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCi0gICAgewotICAgICAgYmZkX3ZtYSBiZWdpbl9hZGRyOwotICAgICAgYmZkX3ZtYSBlbmRfYWRkcjsKLSAgICAgIGJmZF92bWEgZWhfaGFuZGxlcjsKLSAgICAgIGJmZF92bWEgZWhfZGF0YTsKLSAgICAgIGJmZF92bWEgcHJvbG9nX2VuZF9hZGRyOwotICAgICAgaW50IGVtX2RhdGE7Ci0KLSAgICAgIGlmIChpICsgMjAgPiBzdG9wKQotCWJyZWFrOwotCi0gICAgICBiZWdpbl9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOwotICAgICAgZW5kX2FkZHIgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSs0KTsKLSAgICAgIGVoX2hhbmRsZXIgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSs4KTsKLSAgICAgIGVoX2RhdGEgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSsxMik7Ci0gICAgICBwcm9sb2dfZW5kX2FkZHIgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSsxNik7Ci0gICAgICAKLSAgICAgIGlmIChiZWdpbl9hZGRyID09IDAgJiYgZW5kX2FkZHIgPT0gMCAmJiBlaF9oYW5kbGVyID09IDAKLQkgICYmIGVoX2RhdGEgPT0gMCAmJiBwcm9sb2dfZW5kX2FkZHIgPT0gMCkKLQl7Ci0JICAvKiBXZSBhcmUgcHJvYmFibHkgaW50byB0aGUgcGFkZGluZyBvZiB0aGUgc2VjdGlvbiBub3cuICAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICAiICUwOGx4XHQiLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpIChpICsgc2VjdGlvbi0+dm1hKSk7Ci0KLSAgICAgIGVtX2RhdGEgPSAoKGVoX2hhbmRsZXIgJiAweDEpIDw8IDIpIHwgKHByb2xvZ19lbmRfYWRkciAmIDB4Myk7Ci0gICAgICBlaF9oYW5kbGVyICY9IDB4ZmZmZmZmZmM7Ci0gICAgICBwcm9sb2dfZW5kX2FkZHIgJj0gMHhmZmZmZmZmYzsKLQotICAgICAgZnByaW50ZiAoZmlsZSwgIiUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4ICAgJXgiLAotCSAgICAgICBiZWdpbl9hZGRyLAotCSAgICAgICBlbmRfYWRkciwKLQkgICAgICAgZWhfaGFuZGxlciwKLQkgICAgICAgZWhfZGF0YSwKLQkgICAgICAgcHJvbG9nX2VuZF9hZGRyLAotCSAgICAgICBlbV9kYXRhKTsKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgICAgIGlmIChlaF9oYW5kbGVyID09IDAgJiYgZWhfZGF0YSAhPSAwKQotCXsKLQkgIC8qIFNwZWNpYWwgYml0cyBoZXJlLCBhbHRob3VnaCB0aGUgbWVhbmluZyBtYXkgKi8KLQkgIC8qIGJlIGEgbGl0dGxlIG15c3RlcmlvdXMuIFRoZSBvbmx5IG9uZSBJIGtub3cgKi8KLQkgIC8qIGZvciBzdXJlIGlzIDB4MDMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIENvZGUgU2lnbmlmaWNhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDEgUmVnaXN0ZXIgU2F2ZSBNaWxsaWNvZGUgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDIgUmVnaXN0ZXIgUmVzdG9yZSBNaWxsaWNvZGUgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDMgR2x1ZSBDb2RlIFNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIHN3aXRjaCAoZWhfZGF0YSkKLQkgICAgewotCSAgICBjYXNlIDB4MDE6Ci0JICAgICAgZnByaW50ZihmaWxlLCBfKCIgUmVnaXN0ZXIgc2F2ZSBtaWxsaWNvZGUiKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHgwMjoKLQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIiBSZWdpc3RlciByZXN0b3JlIG1pbGxpY29kZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDAzOgotCSAgICAgIGZwcmludGYoZmlsZSwgXygiIEdsdWUgY29kZSBzZXF1ZW5jZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSNlbmRpZgotICAgICAgZnByaW50ZihmaWxlLCAiXG4iKTsKLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0hJR0hBREogNAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0YmxbXSA9Ci17Ci0iQUJTT0xVVEUiLAotIkhJR0giLAotIkxPVyIsCi0iSElHSExPVyIsCi0iSElHSEFESiIsCi0iTUlQU19KTVBBRERSIiwKLSJVTktOT1dOIiwgICAvKiBNVVNUIGJlIGxhc3QgKi8KLX07Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9yZWxvYyAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWxvYyIpOwotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBiZmRfc2l6ZV90eXBlIHN0YXJ0LCBzdG9wOwotCi0gIGlmIChzZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJcblxuUEUgRmlsZSBCYXNlIFJlbG9jYXRpb25zIChpbnRlcnByZXRlZCAucmVsb2Mgc2VjdGlvbiBjb250ZW50cylcbiIpKTsKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCAmJiBkYXRhc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkgICAgc2VjdGlvbiwKLQkJCSAgICAoUFRSKSBkYXRhLCAwLAotCQkJICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLQotICBzdGFydCA9IDA7Ci0KLSAgc3RvcCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotCi0gIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDspCi0gICAgewotICAgICAgaW50IGo7Ci0gICAgICBiZmRfdm1hIHZpcnR1YWxfYWRkcmVzczsKLSAgICAgIGxvbmcgbnVtYmVyLCBzaXplOwotCi0gICAgICAvKiBUaGUgLnJlbG9jIHNlY3Rpb24gaXMgYSBzZXF1ZW5jZSBvZiBibG9ja3MsIHdpdGggYSBoZWFkZXIgY29uc2lzdGluZwotCSBvZiB0d28gMzIgYml0IHF1YW50aXRpZXMsIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIG9mIDE2IGJpdCBlbnRyaWVzICovCi0KLSAgICAgIHZpcnR1YWxfYWRkcmVzcyA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKTsKLSAgICAgIHNpemUgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSs0KTsKLSAgICAgIG51bWJlciA9IChzaXplIC0gOCkgLyAyOwotCi0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgXygiXG5WaXJ0dWFsIEFkZHJlc3M6ICUwOGx4IENodW5rIHNpemUgJWxkICgweCVseCkgTnVtYmVyIG9mIGZpeHVwcyAlbGRcbiIpLAotCSAgICAgICB2aXJ0dWFsX2FkZHJlc3MsIHNpemUsIHNpemUsIG51bWJlcik7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXI7ICsraikKLQl7Ci0JICB1bnNpZ25lZCBzaG9ydCBlID0gYmZkX2dldF8xNiAoYWJmZCwgZGF0YSArIGkgKyA4ICsgaiAqIDIpOwotCSAgdW5zaWduZWQgaW50IHQgPSAoZSAmIDB4RjAwMCkgPj4gMTI7Ci0JICBpbnQgb2ZmID0gZSAmIDB4MEZGRjsKLQotCSAgaWYgKHQgPj0gc2l6ZW9mICh0YmwpIC8gc2l6ZW9mICh0YmxbMF0pKQotCSAgICB0ID0gKHNpemVvZiAodGJsKSAvIHNpemVvZiAodGJsWzBdKSkgLSAxOwotCi0JICBmcHJpbnRmIChmaWxlLAotCQkgICBfKCJcdHJlbG9jICU0ZCBvZmZzZXQgJTR4IFslNGx4XSAlcyIpLAotCQkgICBqLCBvZmYsIChsb25nKSAob2ZmICsgdmlydHVhbF9hZGRyZXNzKSwgdGJsW3RdKTsKLQotCSAgLyogSElHSEFESiB0YWtlcyBhbiBhcmd1bWVudCwgYnV0IHRoZXJlJ3Mgbm8gZG9jdW1lbnRhdGlvbgotCSAgICAgb24gd2hhdCBpdCBkb2VzLCBvciB3aGF0IGl0IG1lYW5zLiAgSW5mZXJyZWQgZnJvbQotCSAgICAgRFVNUEJJTi4gICovCi0JICBpZiAodCA9PSBJTUFHRV9SRUxfQkFTRURfSElHSEFESikKLQkgICAgewotCSAgICAgICBmcHJpbnRmIChmaWxlLCAiICglNHgpXG4iLAotCQkJKCh1bnNpZ25lZCBpbnQpCi0JCQkgYmZkX2dldF8xNiAoYWJmZCwgZGF0YSArIGkgKyA4ICsgaiAqIDIgKyAyKSkpOwotCSAgICAgICBqKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQl9Ci0gICAgICBpICs9IHNpemU7Ci0gICAgfQotCi0gIGZyZWUgKGRhdGEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0KLWJvb2xlYW4KLV9iZmRfcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24gKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBpbnQgajsKLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqaSA9ICZwZS0+cGVfb3B0aGRyOwotCi0gIC8qIFRoZSBNUyBkdW1wYmluIHByb2dyYW0gcmVwb3J0ZWRseSBhbmRzIHdpdGggMHhmZjBmIGJlZm9yZQotICAgICBwcmludGluZyB0aGUgY2hhcmFjdGVyaXN0aWNzIGZpZWxkLiAgTm90IHN1cmUgd2h5LiAgTm8gcmVhc29uIHRvCi0gICAgIGVtdWxhdGUgaXQgaGVyZS4gICovCi0gIGZwcmludGYgKGZpbGUsIF8oIlxuQ2hhcmFjdGVyaXN0aWNzIDB4JXhcbiIpLCBwZS0+cmVhbF9mbGFncyk7Ci0jdW5kZWYgUEYKLSNkZWZpbmUgUEYoeCwgeSkgICAgaWYgKHBlLT5yZWFsX2ZsYWdzICYgeCkgeyBmcHJpbnRmIChmaWxlLCAiXHQlc1xuIiwgeSk7IH0KLSAgUEYgKEZfUkVMRkxHLCAicmVsb2NhdGlvbnMgc3RyaXBwZWQiKTsKLSAgUEYgKEZfRVhFQywgImV4ZWN1dGFibGUiKTsKLSAgUEYgKEZfTE5OTywgImxpbmUgbnVtYmVycyBzdHJpcHBlZCIpOwotICBQRiAoRl9MU1lNUywgInN5bWJvbHMgc3RyaXBwZWQiKTsKLSAgUEYgKDB4ODAsICJsaXR0bGUgZW5kaWFuIik7Ci0gIFBGIChGX0FSMzJXUiwgIjMyIGJpdCB3b3JkcyIpOwotICBQRiAoMHgyMDAsICJkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcmVtb3ZlZCIpOwotICBQRiAoMHgxMDAwLCAic3lzdGVtIGZpbGUiKTsKLSAgUEYgKEZfRExMLCAiRExMIik7Ci0gIFBGICgweDgwMDAsICJiaWcgZW5kaWFuIik7Ci0jdW5kZWYgUEYKLQotICAvKiBjdGltZSBpbXBsaWVzICdcbicuICAqLwotICBmcHJpbnRmIChmaWxlLCAiXG5UaW1lL0RhdGVcdFx0JXMiLCBjdGltZSAoJnBlLT5jb2ZmLnRpbWVzdGFtcCkpOwotICBmcHJpbnRmIChmaWxlLCJcbkltYWdlQmFzZVx0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPkltYWdlQmFzZSk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2VjdGlvbkFsaWdubWVudFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TZWN0aW9uQWxpZ25tZW50KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5GaWxlQWxpZ25tZW50XHRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+RmlsZUFsaWdubWVudCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuTWFqb3JPU3lzdGVtVmVyc2lvblx0JWRcbiIsIGktPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1pbm9yT1N5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNYWpvckltYWdlVmVyc2lvblx0JWRcbiIsIGktPk1ham9ySW1hZ2VWZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWlub3JJbWFnZVZlcnNpb25cdCVkXG4iLCBpLT5NaW5vckltYWdlVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1ham9yU3Vic3lzdGVtVmVyc2lvblx0JWRcbiIsIGktPk1ham9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1pbm9yU3Vic3lzdGVtVmVyc2lvblx0JWRcbiIsIGktPk1pbm9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIlJlc2VydmVkMVx0XHQlMDhseFxuIiwgaS0+UmVzZXJ2ZWQxKTsKLSAgZnByaW50ZiAoZmlsZSwiU2l6ZU9mSW1hZ2VcdFx0JTA4bHhcbiIsIGktPlNpemVPZkltYWdlKTsKLSAgZnByaW50ZiAoZmlsZSwiU2l6ZU9mSGVhZGVyc1x0XHQlMDhseFxuIiwgaS0+U2l6ZU9mSGVhZGVycyk7Ci0gIGZwcmludGYgKGZpbGUsIkNoZWNrU3VtXHRcdCUwOGx4XG4iLCBpLT5DaGVja1N1bSk7Ci0gIGZwcmludGYgKGZpbGUsIlN1YnN5c3RlbVx0XHQlMDh4XG4iLCBpLT5TdWJzeXN0ZW0pOwotICBmcHJpbnRmIChmaWxlLCJEbGxDaGFyYWN0ZXJpc3RpY3NcdCUwOHhcbiIsIGktPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZlN0YWNrUmVzZXJ2ZVx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZTdGFja1Jlc2VydmUpOwotICBmcHJpbnRmIChmaWxlLCJcblNpemVPZlN0YWNrQ29tbWl0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TaXplT2ZIZWFwUmVzZXJ2ZVx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZIZWFwUmVzZXJ2ZSk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2l6ZU9mSGVhcENvbW1pdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5Mb2FkZXJGbGFnc1x0XHQlMDhseFxuIiwgaS0+TG9hZGVyRmxhZ3MpOwotICBmcHJpbnRmIChmaWxlLCJOdW1iZXJPZlJ2YUFuZFNpemVzXHQlMDhseFxuIiwgaS0+TnVtYmVyT2ZSdmFBbmRTaXplcyk7Ci0KLSAgZnByaW50ZiAoZmlsZSwiXG5UaGUgRGF0YSBEaXJlY3RvcnlcbiIpOwotICBmb3IgKGogPSAwOyBqIDwgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVM7IGorKykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiRW50cnkgJTF4ICIsIGopOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIGktPkRhdGFEaXJlY3Rvcnlbal0uVmlydHVhbEFkZHJlc3MpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlMDhseCAiLCBpLT5EYXRhRGlyZWN0b3J5W2pdLlNpemUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzXG4iLCBkaXJfbmFtZXNbal0pOwotICAgIH0KLQotICBwZV9wcmludF9pZGF0YSAoYWJmZCwgdmZpbGUpOwotICBwZV9wcmludF9lZGF0YSAoYWJmZCwgdmZpbGUpOwotICBwZV9wcmludF9wZGF0YSAoYWJmZCwgdmZpbGUpOwotICBwZV9wcmludF9yZWxvYyAoYWJmZCwgdmZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKLSAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbiAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkLCAqb2JmZDsKLXsKLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcGVfZGF0YSAob2JmZCktPnBlX29wdGhkciA9IHBlX2RhdGEgKGliZmQpLT5wZV9vcHRoZHI7Ci0gIHBlX2RhdGEgKG9iZmQpLT5kbGwgPSBwZV9kYXRhIChpYmZkKS0+ZGxsOwotCi0gIC8qIGZvciBzdHJpcDogaWYgd2UgcmVtb3ZlZCAucmVsb2MsIHdlJ2xsIG1ha2UgYSByZWFsIG1lc3Mgb2YgdGhpbmdzCi0gICAgIGlmIHdlIGRvbid0IHJlbW92ZSB0aGlzIGVudHJ5IGFzIHdlbGwuICAqLwotICBpZiAoISBwZV9kYXRhIChvYmZkKS0+aGFzX3JlbG9jX3NlY3Rpb24pCi0gICAgewotICAgICAgcGVfZGF0YShvYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbNV0uVmlydHVhbEFkZHJlc3MgPSAwOwotICAgICAgcGVfZGF0YShvYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbNV0uU2l6ZSA9IDA7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gKi8KLWJvb2xlYW4KLV9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYykgIT0gTlVMTAotICAgICAgJiYgcGVpX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgb3NlYy0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChvc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT50ZGF0YSA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKG9iZmQsIHNpemVvZiAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT50ZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcGVpX3NlY3Rpb25fZGF0YSAob2JmZCwgb3NlYyktPnZpcnRfc2l6ZSA9Ci0JcGVpX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYyktPnZpcnRfc2l6ZTsKLSAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT5wZV9mbGFncyA9Ci0gICAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpLT5wZV9mbGFnczsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQKLV9iZmRfcGVfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCk7Ci0KLSAgaWYgKHBlX2RhdGEgKGFiZmQpICE9IE5VTEwKLSAgICAgICYmICgoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpID09IDAKLQkgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lOR19SRUxPQykgIT0gMCkKLSAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldC0+dmFsdWUgKz0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmlkYXRhIHNlY3Rpb24gYW5kIG90aGVyIHRoaW5ncyB0aGF0IG5lZWQgc3ltYm9sIHRhYmxlCi0gICBhY2Nlc3MuICAqLwotCi1ib29sZWFuCi1fYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKnBmaW5mbzsKLXsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoMTsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSBwZmluZm8tPmluZm87Ci0KLSAgLyogVGhlcmUgYXJlIGEgZmV3IGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgZmlsbGVkIGluIG5vdyB3aGlsZSB3ZQotICAgICBoYXZlIHN5bWJvbCB0YWJsZSBhY2Nlc3MuCi0KLSAgICAgVGhlIC5pZGF0YSBzdWJzZWN0aW9ucyBhcmVuJ3QgZGlyZWN0bHkgYXZhaWxhYmxlIGFzIHNlY3Rpb25zLCBidXQKLSAgICAgdGhleSBhcmUgaW4gdGhlIHN5bWJvbCB0YWJsZSwgc28gZ2V0IHRoZW0gZnJvbSB0aGVyZS4gICovCi0KLSAgLyogVGhlIGltcG9ydCBkaXJlY3RvcnkuICBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIC5pZGF0YSQyLCB3aXRoIHNpemUKLSAgICAgb2YgLmlkYXRhJDIgKyAuaWRhdGEkMy4gICovCi0gIGgxID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgIi5pZGF0YSQyIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGgxICE9IE5VTEwpCi0gICAgewotICAgICAgcGVfZGF0YShhYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbMV0uVmlydHVhbEFkZHJlc3MgPQotCShoMS0+cm9vdC51LmRlZi52YWx1ZQotCSArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGgxID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgIi5pZGF0YSQ0IiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxXS5TaXplID0KLQkoKGgxLT5yb290LnUuZGVmLnZhbHVlCi0JICArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCkKLQkgLSBwZV9kYXRhKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxXS5WaXJ0dWFsQWRkcmVzcyk7Ci0KLSAgICAgIC8qIFRoZSBpbXBvcnQgYWRkcmVzcyB0YWJsZS4gIFRoaXMgaXMgdGhlIHNpemUvYWRkcmVzcyBvZgotICAgICAgICAgLmlkYXRhJDUuICAqLwotICAgICAgaDEgPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAiLmlkYXRhJDUiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzEyXS5WaXJ0dWFsQWRkcmVzcyA9Ci0JKGgxLT5yb290LnUuZGVmLnZhbHVlCi0JICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaDEgPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAiLmlkYXRhJDYiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzEyXS5TaXplID0KLQkoKGgxLT5yb290LnUuZGVmLnZhbHVlCi0JICArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCkKLQkgLSBwZV9kYXRhKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxMl0uVmlydHVhbEFkZHJlc3MpOwotICAgIH0KLQotICAvKiBJZiB3ZSBjb3VsZG4ndCBmaW5kIGlkYXRhJDIsIHdlIGVpdGhlciBoYXZlIGFuIGV4Y2Vzc2l2ZWx5Ci0gICAgIHRyaXZpYWwgcHJvZ3JhbSBvciBhcmUgaW4gREVFUCB0cm91YmxlOyB3ZSBoYXZlIHRvIGFzc3VtZSB0cml2aWFsCi0gICAgIHByb2dyYW0uLi4uICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9wby9NYWtlLWluIGIvYmZkL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL3BvL1BPVEZJTEVTLmluIGIvYmZkL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDhmOTg3Li4wMDAwMDAwCi0tLSBhL2JmZC9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi1haXgzODYtY29yZS5jCi1hb3V0LWFkb2JlLmMKLWFvdXQtYXJtLmMKLWFvdXQtbnMzMmsuYwotYW91dC1zcGFyY2xlLmMKLWFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAuYwotYW91dDAuYwotYW91dDMyLmMKLWFvdXQ2NC5jCi1hb3V0ZjEuaAotYW91dHguaAotYXJjaGl2ZS5jCi1hcmNodXJlcy5jCi1iZmQuYwotYmluYXJ5LmMKLWJvdXQuYwotY2FjaGUuYwotY2YtaTM4Nmx5bnguYwotY2YtbTY4a2x5bnguYwotY2Ytc3BhcmNseW54LmMKLWNpc2NvLWNvcmUuYwotY29mZi1hMjlrLmMKLWNvZmYtYWxwaGEuYwotY29mZi1hcG9sbG8uYwotY29mZi1hcm0uYwotY29mZi1hdXguYwotY29mZi1nbzMyLmMKLWNvZmYtaDgzMDAuYwotY29mZi1oODUwMC5jCi1jb2ZmLWkzODYuYwotY29mZi1pODYwLmMKLWNvZmYtaTk2MC5jCi1jb2ZmLW02OGsuYwotY29mZi1tODhrLmMKLWNvZmYtbWlwcy5jCi1jb2ZmLXBtYWMuYwotY29mZi1yczYwMDAuYwotY29mZi1zaC5jCi1jb2ZmLXNwYXJjLmMKLWNvZmYtc3RnbzMyLmMKLWNvZmYtc3ZtNjhrLmMKLWNvZmYtdGljMzAuYwotY29mZi10aWM4MC5jCi1jb2ZmLXU2OGsuYwotY29mZi13NjUuYwotY29mZi13ZTMyay5jCi1jb2ZmLXo4ay5jCi1jb2ZmY29kZS5oCi1jb2ZmZ2VuLmMKLWNvZmZsaW5rLmMKLWNvZmZzd2FwLmgKLWNvcmVmaWxlLmMKLWNwdS1hMjlrLmMKLWNwdS1hbHBoYS5jCi1jcHUtYXJjLmMKLWNwdS1hcm0uYwotY3B1LWQxMHYuYwotY3B1LWQzMHYuYwotY3B1LWZyMzAuYwotY3B1LWg4MzAwLmMKLWNwdS1oODUwMC5jCi1jcHUtaHBwYS5jCi1jcHUtaTM4Ni5jCi1jcHUtaTg2MC5jCi1jcHUtaTk2MC5jCi1jcHUtbTEwMjAwLmMKLWNwdS1tMTAzMDAuYwotY3B1LW0zMnIuYwotY3B1LW02OGsuYwotY3B1LW04OGsuYwotY3B1LW1jb3JlLmMKLWNwdS1taXBzLmMKLWNwdS1uczMyay5jCi1jcHUtcG93ZXJwYy5jCi1jcHUtcnM2MDAwLmMKLWNwdS1zaC5jCi1jcHUtc3BhcmMuYwotY3B1LXRpYzMwLmMKLWNwdS10aWM4MC5jCi1jcHUtdjg1MC5jCi1jcHUtdmF4LmMKLWNwdS13NjUuYwotY3B1LXdlMzJrLmMKLWNwdS16OGsuYwotZGVtbzY0LmMKLWR3YXJmMi5jCi1lY29mZi5jCi1lY29mZmxpbmsuYwotZWNvZmZzd2FwLmgKLWVsZi1iZmQuaAotZWxmLW0xMDIwMC5jCi1lbGYtbTEwMzAwLmMKLWVsZi5jCi1lbGYzMi1hcmMuYwotZWxmMzItZDEwdi5jCi1lbGYzMi1kMzB2LmMKLWVsZjMyLWZyMzAuYwotZWxmMzItZ2VuLmMKLWVsZjMyLWhwcGEuYwotZWxmMzItaHBwYS5oCi1lbGYzMi1pMzg2LmMKLWVsZjMyLWk4NjAuYwotZWxmMzItaTk2MC5jCi1lbGYzMi1tMzJyLmMKLWVsZjMyLW02OGsuYwotZWxmMzItbTg4ay5jCi1lbGYzMi1tY29yZS5jCi1lbGYzMi1taXBzLmMKLWVsZjMyLXBwYy5jCi1lbGYzMi1zaC5jCi1lbGYzMi1zcGFyYy5jCi1lbGYzMi12ODUwLmMKLWVsZjMyLmMKLWVsZjY0LWFscGhhLmMKLWVsZjY0LWdlbi5jCi1lbGY2NC1taXBzLmMKLWVsZjY0LXNwYXJjLmMKLWVsZjY0LmMKLWVsZmFybS1uYWJpLmMKLWVsZmFybS1vYWJpLmMKLWVsZmNvZGUuaAotZWxmbGluay5jCi1mb3JtYXQuYwotZ2VubGluay5oCi1nbzMyc3R1Yi5oCi1oYXNoLmMKLWhwMzAwYnNkLmMKLWhwMzAwaHB1eC5jCi1ocHBhX3N0dWJzLmgKLWhwdXgtY29yZS5jCi1pMzg2YW91dC5jCi1pMzg2YnNkLmMKLWkzODZkeW5peC5jCi1pMzg2ZnJlZWJzZC5jCi1pMzg2bGludXguYwotaTM4Nmx5bnguYwotaTM4Nm1hY2gzLmMKLWkzODZtc2Rvcy5jCi1pMzg2bmV0YnNkLmMKLWkzODZvczlrLmMKLWllZWUuYwotaWhleC5jCi1pbml0LmMKLWlyaXgtY29yZS5jCi1saWJhb3V0LmgKLWxpYmJmZC5jCi1saWJiZmQuaAotbGliY29mZi5oCi1saWJlY29mZi5oCi1saWJocHBhLmgKLWxpYmllZWUuaAotbGlibmxtLmgKLWxpYm9hc3lzLmgKLWxpbmtlci5jCi1seW54LWNvcmUuYwotbTY4azRrbmV0YnNkLmMKLW02OGtsaW51eC5jCi1tNjhrbHlueC5jCi1tNjhrbmV0YnNkLmMKLW04OGttYWNoMy5jCi1taXBzYnNkLmMKLW5ldGJzZC5oCi1uZXdzb3MzLmMKLW5sbS10YXJnZXQuaAotbmxtLmMKLW5sbTMyLWFscGhhLmMKLW5sbTMyLWkzODYuYwotbmxtMzItcHBjLmMKLW5sbTMyLXNwYXJjLmMKLW5sbTMyLmMKLW5sbTY0LmMKLW5sbWNvZGUuaAotbnMzMmsuaAotbnMzMmtuZXRic2QuYwotb2FzeXMuYwotb3BuY2xzLmMKLW9zZi1jb3JlLmMKLXBjNTMyLW1hY2guYwotcGUtYXJtLmMKLXBlLWkzODYuYwotcGUtbWNvcmUuYwotcGUtcHBjLmMKLXBlaS1hcm0uYwotcGVpLWkzODYuYwotcGVpLW1jb3JlLmMKLXBlaS1wcGMuYwotcHBjYm9vdC5jCi1yZWxvYy5jCi1yZWxvYzE2LmMKLXJpc2NpeC5jCi1zY281LWNvcmUuYwotc2VjdGlvbi5jCi1zb20uYwotc29tLmgKLXNwYXJjbGludXguYwotc3BhcmNseW54LmMKLXNwYXJjbmV0YnNkLmMKLXNyZWMuYwotc3RhYi1zeW1zLmMKLXN0YWJzLmMKLXN1bm9zLmMKLXN5bXMuYwotdGFyZ2V0cy5jCi10ZWtoZXguYwotdHJhZC1jb3JlLmMKLXZheG5ldGJzZC5jCi12ZXJzYWRvcy5jCi12bXMtZ3NkLmMKLXZtcy1oZHIuYwotdm1zLW1pc2MuYwotdm1zLXRpci5jCi12bXMuYwotdm1zLmgKLXhjb2ZmbGluay5jCmRpZmYgLS1naXQgYS9iZmQvcG8vYmZkLnBvdCBiL2JmZC9wby9iZmQucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNkYTE5Li4wMDAwMDAwCi0tLSBhL2JmZC9wby9iZmQucG90CisrKyAvZGV2L251bGwKQEAgLTEsMTQ4OSArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wNi0wMyAwMjo1NS0wNzAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogYW91dC1hZG9iZS5jOjE4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5rbm93biBzZWN0aW9uIHR5cGUgaW4gYS5vdXQuYWRvYmUgZmlsZTogJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjEyMzcgYW91dHguaDoxNjUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTYyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gZm9yIHN5bWJvbCBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjE2MjMKLW1zZ2lkICIqdW5rbm93bioiCi1tc2dzdHIgIiIKLQotIzogYW91dHguaDozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWxvY2F0ZWFibGUgbGluayBmcm9tICVzIHRvICVzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXJjaGl2ZS5jOjE3MjQKLW1zZ2lkICJXYXJuaW5nOiB3cml0aW5nIGFyY2hpdmUgd2FzIHNsb3c6IHJld3JpdGluZyB0aW1lc3RhbXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcmNoaXZlLmM6MTk5MAotbXNnaWQgIlJlYWRpbmcgYXJjaGl2ZSBmaWxlIG1vZCB0aW1lc3RhbXAiCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IGJmZCBjYW4ndCBjYWxsIHBlcnJvci4KLSM6IGFyY2hpdmUuYzoyMDE0Ci1tc2dpZCAiV3JpdGluZyB1cGRhdGVkIGFybWFwIHRpbWVzdGFtcCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzQKLW1zZ2lkICJObyBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzUKLW1zZ2lkICJTeXN0ZW0gY2FsbCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzYKLW1zZ2lkICJJbnZhbGlkIGJmZCB0YXJnZXQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc3Ci1tc2dpZCAiRmlsZSBpbiB3cm9uZyBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc4Ci1tc2dpZCAiSW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc5Ci1tc2dpZCAiTWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODAKLW1zZ2lkICJObyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MQotbXNnaWQgIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjgyCi1tc2dpZCAiTm8gbW9yZSBhcmNoaXZlZCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODMKLW1zZ2lkICJNYWxmb3JtZWQgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODQKLW1zZ2lkICJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODUKLW1zZ2lkICJGaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjg2Ci1tc2dpZCAiU2VjdGlvbiBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjg3Ci1tc2dpZCAiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODgKLW1zZ2lkICJTeW1ib2wgbmVlZHMgZGVidWcgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODkKLW1zZ2lkICJCYWQgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkwCi1tc2dpZCAiRmlsZSB0cnVuY2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkxCi1tc2dpZCAiRmlsZSB0b28gYmlnIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI5MgotbXNnaWQgIiM8SW52YWxpZCBlcnJvciBjb2RlPiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzo2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkIGFzc2VydGlvbiBmYWlsICVzOiVkIgotbXNnc3RyICIiCi0KLSM6IGJpbmFyeS5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBXcml0aW5nIHNlY3Rpb24gYCVzJyB0byBodWdlIChpZSBuZWdhdGl2ZSkgZmlsZSBvZmZzZXQgMHglbHguIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjEyMQotbXNnaWQgIk1pc3NpbmcgSUhDT05TVCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzoxODEKLW1zZ2lkICJNaXNzaW5nIElISUhBTEYiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hMjlrLmM6MjEzCi1tc2dpZCAiVW5yZWNvZ25pemVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjQwNgotbXNnaWQgIm1pc3NpbmcgSUhDT05TVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzo0OTcKLW1zZ2lkICJtaXNzaW5nIElISUhBTEYgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjg4MCBjb2ZmLWFscGhhLmM6OTE3Ci1tc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjE0ODYgZWxmNjQtYWxwaGEuYzo0MDUxCi1tc2dpZCAidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYWxwaGEuYzoxOTkyIGNvZmYtbWlwcy5jOjE0MzUgZWxmMzItbWlwcy5jOjQ5MjQKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzo4ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBmaW5kIFRIVU1CIGdsdWUgJyVzJyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjkxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjExODggY29mZi1hcm0uYzoxMjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjExOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxMjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTI4OQotbXNnaWQgIiAgY29uc2lkZXIgcmVsaW5raW5nIHdpdGggLS1zdXBwb3J0LW9sZC1jb2RlIGVuYWJsZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxNTc1IGNvZmYtdGljODAuYzo2ODIgY29mZmxpbmsuYzoyNzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBFUlJPUjogY29tcGlsZWQgZm9yIEFQQ1MtJWQgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBBUENTLSVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjA1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGZsb2F0IHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGludGVnZXIgIgotInJlZ2lzdGVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGZsb2F0ICIKLSJyZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogRVJST1I6IGNvbXBpbGVkIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzICIKLSJhYnNvbHV0ZSBwb3NpdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgYWJzb2x1dGUgcG9zaXRpb24gY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgcG9zaXRpb24gIgotImluZGVwZW5kZW50IgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIHN1cHBvcnRzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzIG5vdC4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcy4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAleDoiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQwCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGZsb2F0IHJlZ2lzdGVyc10iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQyCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDUKLW1zZ2lkICIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDcKLW1zZ2lkICIgW2Fic29sdXRlIHBvc2l0aW9uXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTEKLW1zZ2lkICIgW2ludGVyd29ya2luZyBmbGFnIG5vdCBpbml0aWFsaXNlZF0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTUzCi1tc2dpZCAiIFtpbnRlcndvcmtpbmcgc3VwcG9ydGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTUKLW1zZ2lkICIgW2ludGVyd29ya2luZyBub3Qgc3VwcG9ydGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIldhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29ya2luZyBmbGFnIG9mICVzLCBzaW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuICIKLSJzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiCi1tc2dzdHIgIiIKLQotIzogY29mZi1pOTYwLmM6MTM1IGNvZmYtaTk2MC5jOjQ4NAotbXNnaWQgInVuY2VydGFpbiBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIG5vbi1DT0ZGIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLW1pcHMuYzo4NzUgZWxmMzItbWlwcy5jOjExMzYKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gX2dwIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjI0MzMKLW1zZ2lkICJ1bnN1cHBvcnRlZCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSMuIE5vIG90aGVyIHNlY3Rpb25zIHNob3VsZCBhcHBlYXIgaW4gLW1lbWJlZGRlZC1waWMKLSMuIGNvZGUuCi0jOiBjb2ZmLW1pcHMuYzoyNDcwCi1tc2dpZCAicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjI0NzgKLW1zZ2lkICJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLXRpYzgwLmM6NDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCByZWxvYyB0eXBlIDB4JXgiCi1tc2dzdHIgIiIKLQotIzogY29mZi13NjUuYzozODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgcmVsb2MgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjM0NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiBsaW5lIG51bWJlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozNDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBkdXBsaWNhdGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozNzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbnJlY29nbml6ZWQgc3RvcmFnZSBjbGFzcyAlZCBmb3IgJXMgc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozOTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6NDAwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZ2VuLmM6MTYwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIHN0cmluZyB0YWJsZSBzaXplICVsdSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjIwOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jcyBpbiBzZWN0aW9uIGAlcycsIGJ1dCBpdCBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogY29mZnN3YXAuaDo4ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6ICVzOiBsaW5lIG51bWJlciBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogY29mZnN3YXAuaDo5MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6NDIwCi1tc2dpZCAiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEFiYnJldiBvZmZzZXQgKCV1KSBiaWdnZXIgdGhhbiBhYmJyZXYgc2l6ZSAoJXUpLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo2MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEludmFsaWQgb3IgdW5oYW5kbGVkIEZPUk0gdmFsdWU6ICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo2ODcKLW1zZ2lkICJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uIChiYWQgZmlsZSBudW1iZXIpLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo3MzgKLW1zZ2lkICJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfbGluZSBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo5MDMKLW1zZ2lkICJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzoxMDk3IGR3YXJmMi5jOjEyNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IENvdWxkIG5vdCBmaW5kIGFiYnJldiBudW1iZXIgJWQuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjEyMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkR3YXJmIEVycm9yOiBmb3VuZCBkd2FyZiB2ZXJzaW9uICclaHUnLCB0aGlzIHJlYWRlciBvbmx5IGhhbmRsZXMgdmVyc2lvbiAyICIKLSJpbmZvcm1hdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRHdhcmYgRXJyb3I6IGZvdW5kIGFkZHJlc3Mgc2l6ZSAnJXUnLCB0aGlzIHJlYWRlciBjYW4gbm90IGhhbmRsZSBzaXplcyAiCi0iZ3JlYXRlciB0aGFuICcldScuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjEyMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEJhZCBhYmJyZXYgbnVtYmVyOiAlZC4iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxMzA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gYmFzaWMgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE1ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTU4NyBlY29mZi5jOjE1OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIExvY2FsIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgc3RydWN0OyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIHVuaW9uOyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIGVudW07IEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgVHlwZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ1NSBlbGYtbTEwMzAwLmM6NjY3IGVsZjMyLWQxMHYuYzo0OTAgZWxmMzItZnIzMC5jOjY1MAotIzogZWxmMzItbTMyci5jOjExNTcgZWxmMzItdjg1MC5jOjE2NzQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NTkgZWxmLW0xMDMwMC5jOjY3MSBlbGYzMi1kMTB2LmM6NDk0IGVsZjMyLWZyMzAuYzo2NTQKLSM6IGVsZjMyLW0zMnIuYzoxMTYxIGVsZjMyLXY4NTAuYzoxNjc4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ2MyBlbGYtbTEwMzAwLmM6Njc1IGVsZjMyLWQxMHYuYzo0OTggZWxmMzItbTMyci5jOjExNjUKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NjcgZWxmLW0xMDMwMC5jOjY3OSBlbGYzMi1kMTB2LmM6NTAyIGVsZjMyLWZyMzAuYzo2NjIKLSM6IGVsZjMyLW0zMnIuYzoxMTY5IGVsZjMyLXY4NTAuYzoxNjk4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIHN0cmluZyBvZmZzZXQgJXUgPj0gJWx1IGZvciBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NTQzCi1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjU5MQotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIFNlY3Rpb246XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NjkzCi1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NzE2Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gUmVmZXJlbmNlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo3MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICByZXF1aXJlZCBmcm9tICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjE4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImNyZWF0aW5nIHNlY3Rpb24gc3ltYm9sLCBuYW1lID0gJXMsIHZhbHVlID0gMHglLjhseCwgaW5kZXggPSAlZCwgc2VjdGlvbiA9ICIKLSIweCUuOGx4XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjQ5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMgKGFsbG9jYXRlZCAldSwgbmVlZCAldSkiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjU5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMsIHRyeSBsaW5raW5nIHdpdGggLU4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjcxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcjogRmlyc3Qgc2VjdGlvbiBpbiBzZWdtZW50ICglcykgc3RhcnRzIGF0IDB4JXgiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjcyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgd2hlcmVhcyBzZWdtZW50IHN0YXJ0cyBhdCAweCV4IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjI5OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGFsbG9jYXRlZCBzZWN0aW9uIGAlcycgbm90IGluIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzM2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjMzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIDB4JS44bHgsIG5hbWUgPSAlcywgc3ltIG51bSA9ICVkLCBmbGFncyA9ICIKLSIweCUuOGx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozNTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NDc5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWZyMzAuYzo2NTggZWxmMzItdjg1MC5jOjE2ODIKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItaHBwYS5jOjEyMTUKLW1zZ2lkICJVbnN1cHBvcnRlZCBjYWxsIHRvIGhwcGFfZWxmX3JlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWkzODYuYzoxMjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjgwOAotbXNnaWQgIlNEQSByZWxvY2F0aW9uIHdoZW4gX1NEQV9CQVNFXyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6ODkyIGVsZjMyLXBwYy5jOjMwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxMTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYW4gJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgc2VjdGlvbiAoJXMpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJbnN0cnVjdGlvbiBzZXQgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHgiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjE5MjgKLW1zZ2lkICI6IG0zMnIgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSMuIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLgotIzogZWxmMzItbTY4ay5jOjQzMiBlbGYzMi1taXBzLmM6MjMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJwcml2YXRlIGZsYWdzID0gJWx4OiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tNjhrLmM6NDM1Ci1tc2dpZCAiIFtjcHUzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWNvcmUuYzozMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4uXG4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWNvcmUuYzozNzQgZWxmMzItbWNvcmUuYzo1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjQ2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MTI5NgotbXNnaWQgIjMyYml0cyBncCByZWxhdGl2ZSByZWxvY2F0aW9uIG9jY3VycyBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoxNDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpbmtpbmcgbWlwczE2IG9iamVjdHMgaW50byAlcyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjE0MSBlbGYzMi1wcGMuYzoxNDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIxNDMgZWxmMzItcHBjLmM6MTQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBiaWcgZW5kaWFuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsaW5raW5nIFBJQyBmaWxlcyB3aXRoIG5vbi1QSUMgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgYWJpY2FsbHMgZmlsZXMgd2l0aCBub24tYWJpY2FsbHMgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IElTQSBtaXNtYXRjaCAoLW1pcHMlZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICgtbWlwcyVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSVNBIG1pc21hdGNoICglZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICglZCkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEFCSSBtaXNtYXRjaDogbGlua2luZyAlcyBtb2R1bGUgd2l0aCBwcmV2aW91cyAlcyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMjcyIGVsZjMyLXBwYy5jOjE0NzkgZWxmNjQtc3BhcmMuYzoyMTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzAzCi1tc2dpZCAiIFthYmk9TzMyXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMwNQotbXNnaWQgIiBbYWJpPU82NF0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMDcKLW1zZ2lkICIgW2FiaT1FQUJJMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzA5Ci1tc2dpZCAiIFthYmk9RUFCSTY0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMxMQotbXNnaWQgIiBbYWJpIHVua25vd25dIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzEzCi1tc2dpZCAiIFtubyBhYmkgc2V0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMxNgotbXNnaWQgIiBbbWlwczFdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzE4Ci1tc2dpZCAiIFttaXBzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjAKLW1zZ2lkICIgW21pcHMzXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMyMgotbXNnaWQgIiBbbWlwczRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzI0Ci1tc2dpZCAiIFt1bmtub3duIElTQV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjcKLW1zZ2lkICIgWzMyYml0bW9kZV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjkKLW1zZ2lkICIgW25vdCAzMmJpdG1vZGVdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzozODk3Ci1tc2dpZCAic3RhdGljIHByb2NlZHVyZSAobm8gbmFtZSkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjQ0NzAgZWxmNjQtYWxwaGEuYzo0NDI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo0Nzc3Ci1tc2dpZCAibW9yZSBnb3QgZW50cmllcyBhcmUgbmVlZGVkIGZvciBoaXBhZ2UgcmVsb2NhdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjUwODEKLW1zZ2lkICJfZ3BfZGlzcCB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjU0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzKzB4JWx4OiBqdW1wIHRvIG1pcHMxNiByb3V0aW5lIHdoaWNoIGlzIG5vdCBqYWwiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjYyNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENBTEwxNiByZWxvYyBhdCAweCVseCBub3QgYWdhaW5zdCBnbG9iYWwgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjE0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgbm9ybWFsbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MTQ1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNvbXBpbGVkIG5vcm1hbGx5IGFuZCBsaW5rZWQgd2l0aCBtb2R1bGVzIGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoxNTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHNwZWNpYWwgbGlua2VyIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MjMxMSBlbGYzMi1wcGMuYzoyMzQ1IGVsZjMyLXBwYy5jOjIzODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjMyMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIGZvciBzeW1ib2wgJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzU4MyBlbGYzMi1wcGMuYzozNjA1IGVsZjMyLXBwYy5jOjM2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjM3MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFJlbG9jYXRpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHN5bWJvbCAlcy4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo2NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjY4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IFJfU0hfVVNFUyBwb2ludHMgdG8gdW5yZWNvZ25pemVkIGluc24gMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjcwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo3MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjc1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo4NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCBDT1VOVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjEyNzEgZWxmMzItc2guYzoxNjA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTUwMiBlbGY2NC1zcGFyYy5jOjE1NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHByb2JhYmx5IGNvbXBpbGVkIHdpdGhvdXQgLWZQSUM/IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTkyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTkzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzYSBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OHBsdXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxOTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSA2NCBiaXQgc3lzdGVtIGFuZCB0YXJnZXQgaXMgMzIgYml0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTk1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBsaXR0bGUgZW5kaWFuIGZpbGVzIHdpdGggYmlnIGVuZGlhbiBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlZhcmlhYmxlIGAlcycgY2Fubm90IG9jY3VweSBpbiBtdWx0aXBsZSBzbWFsbCBkYXRhIHJlZ2lvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW4gb25seSBiZSBpbiBvbmUgb2YgdGhlIHNtYWxsLCB6ZXJvLCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgemVybyBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCB6ZXJvIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTA3MQotbXNnaWQgIkZBSUxFRCB0byBmaW5kIHByZXZpb3VzIEhJMTYgcmVsb2NcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTY4NgotbXNnaWQgImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZ3AiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE2OTAKLW1zZ2lkICJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2VwIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxNjk0Ci1tc2dpZCAiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19jdGJwIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxODk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHg6ICIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTkwNAotbXNnaWQgInY4NTAgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTA1Ci1tc2dpZCAidjg1MGUgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTA2Ci1tc2dpZCAidjg1MGVhIGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1hbHBoYS5jOjk0OQotbXNnaWQgIkdQRElTUCByZWxvY2F0aW9uIGRpZCBub3QgZmluZCBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LWFscGhhLmM6Mjk5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogLmdvdCBzdWJzZWdtZW50IGV4Y2VlZHMgNjRLIChzaXplICVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2hlY2tfcmVsb2NzOiB1bmhhbmRsZWQgcmVsb2MgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjIxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgVWx0cmFTUEFSQyBzcGVjaWZpYyB3aXRoIEhBTCBzcGVjaWZpYyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGVsZmNvZGUuaDoxMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB2ZXJzaW9uIGNvdW50ICglbGQpIGRvZXMgbm90IG1hdGNoIHN5bWJvbCBjb3VudCAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGZsaW5rLmM6MzE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBTZWN0aW9uICVzIGlzIGFscmVhZHkgdG8gbGFyZ2UgdG8gcHV0IGhvbGUgb2YgJWxkIGJ5dGVzIGluIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjQ0OSBtNjhrbGludXguYzo0NTMgc3BhcmNsaW51eC5jOjQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NDU3IG02OGtsaW51eC5jOjQ2MSBzcGFyY2xpbnV4LmM6NDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBpMzg2bGludXguYzo2NDUgaTM4NmxpbnV4LmM6Njk1IG02OGtsaW51eC5jOjY1MiBtNjhrbGludXguYzo3MDAKLSM6IHNwYXJjbGludXguYzo2NDggc3BhcmNsaW51eC5jOjY5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjcxOSBtNjhrbGludXguYzo3MjQgc3BhcmNsaW51eC5jOjcyMgotbXNnaWQgIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE2NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3RyaW5nIHRvbyBsb25nICglZCBjaGFycywgbWF4IDY1NTM1KSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlY29nbml6ZWQgc3ltYm9sIGAlcycgZmxhZ3MgMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmltcGxlbWVudGVkIEFUSSByZWNvcmQgICV1IGZvciBzeW1ib2wgJXUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjgxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBBVE4gdHlwZSAlZCBpbiBleHRlcm5hbCBwYXJ0IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo4NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgdHlwZSBhZnRlciBBVE4iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogdW5leHBlY3RlZCBjaGFyYWN0ZXIgYCVzJyBpbiBJbnRlbCBIZXggZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzozNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBjaGVja3N1bSBpbiBJbnRlbCBIZXggZmlsZSAoZXhwZWN0ZWQgJXUsIGZvdW5kICV1KSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBzdGFydCBhZGRyZXNzIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IHVucmVjb2duaXplZCBpaGV4IHR5cGUgJXUgaW4gSW50ZWwgSGV4IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnRlcm5hbCBlcnJvciBpbiBpaGV4X3JlYWRfc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgc2VjdGlvbiBsZW5ndGggaW4gaWhleF9yZWFkX3NlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjg1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYWRkcmVzcyAweCVzIG91dCBvZiByYW5nZSBmb3IgSW50ZXggSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliYmZkLmM6NDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vdCBtYXBwaW5nOiBkYXRhPSVseCBtYXBwZWQ9JWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJiZmQuYzo0ODQKLW1zZ2lkICJub3QgbWFwcGluZzogZW52IHZhciBub3Qgc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogbGlua2VyLmM6MjY3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIGRvIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggJXMgaW5wdXQgYW5kICVzIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBvYXN5cy5jOjEwMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYCVzJyBpbiBvYXN5cyIKLW1zZ3N0ciAiIgotCi0jOiBvc2YtY29yZS5jOjE0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmhhbmRsZWQgT1NGLzEgY29yZSBmaWxlIHNlY3Rpb24gdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MTgKLW1zZ2lkICIiCi0iXG4iCi0icHBjYm9vdCBoZWFkZXI6XG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJFbnRyeSBvZmZzZXQgICAgICAgID0gMHglLjhseCAoJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoICAgICAgICAgICAgICA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZsYWcgZmllbGQgICAgICAgICAgPSAweCUuMnhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvbiBuYW1lICAgICAgPSBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJQYXJ0aXRpb25bJWRdIHN0YXJ0ICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvblslZF0gZW5kICAgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUGFydGl0aW9uWyVkXSBzZWN0b3IgPSAweCUuOGx4ICglbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQ2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJQYXJ0aXRpb25bJWRdIGxlbmd0aCA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb20uYzo1Mjc2Ci1tc2dpZCAic29tX3NpemVvZl9oZWFkZXJzIHVuaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JlYy5jOjI5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogVW5leHBlY3RlZCBjaGFyYWN0ZXIgYCVzJyBpbiBTLXJlY29yZCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3ltcy5jOjkyMgotbXNnaWQgIlVuc3VwcG9ydGVkIC5zdGFiIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogdm1zLWdzZC5jOjY5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGdzZC9lZ3NkIHN1YnR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLWhkci5jOjQwNwotbXNnaWQgIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6NTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN0YWNrIG92ZXJmbG93ICglZCkgaW4gX2JmZF92bXNfcHVzaCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjU1OAotbXNnaWQgIlN0YWNrIHVuZGVyZmxvdyBpbiBfYmZkX3Ztc19wb3AiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzo5MjkKLW1zZ2lkICJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB6ZXJvIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6OTM0Ci1tc2dpZCAiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggdG9vIG1hbnkgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzoxMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyByZXBsYWNlZCBieSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6MTEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gZW50ZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY5Ci1tc2dpZCAiTm8gTWVtICEiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMwOQotbXNnaWQgIkJhZCBzZWN0aW9uIGluZGV4IGluIEVUSVJfU19DX1NUQV9QUSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuc3VwcG9ydGVkIFNUQSBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMyOSB2bXMtdGlyLmM6MTI4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBTVEEgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRVRJUl9TX0NfU1RPX0dCTDogbm8gc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVUSVJfU19DX1NUT19DQTogbm8gc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDcwCi1tc2dpZCAiRVRJUl9TX0NfU1RPX1JCL0FCOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1MjgKLW1zZ2lkICJFVElSX1NfQ19TVE9fTFBfUFNCOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1MzQKLW1zZ2lkICJFVElSX1NfQ19TVE9fSElOVF9HQkw6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTQwCi1tc2dpZCAiRVRJUl9TX0NfU1RPX0hJTlRfUFM6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTQ0IHZtcy10aXIuYzoxNDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIFNUTyBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY1NwotbXNnaWQgIkVUSVJfU19DX09QUl9JTlNWOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2NzUKLW1zZ2lkICJFVElSX1NfQ19PUFJfVVNIOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2ODEKLW1zZ2lkICJFVElSX1NfQ19PUFJfUk9UOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo3MDAKLW1zZ2lkICJFVElSX1NfQ19PUFJfUkVERUY6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjcwNgotbXNnaWQgIkVUSVJfU19DX09QUl9ERkxJVDogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NzEwIHZtcy10aXIuYzoxNjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIE9QUiBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjc3OSB2bXMtdGlyLmM6MTcyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBDVEwgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo4MDgKLW1zZ2lkICJFVElSX1NfQ19TVENfTFA6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgyNgotbXNnaWQgIkVUSVJfU19DX1NUQ19HQkw6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgzNAotbXNnaWQgIkVUSVJfU19DX1NUQ19HQ0E6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjg0MwotbXNnaWQgIkVUSVJfU19DX1NUQ19QUzogbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKiBzdGFjayBieXRlIGZyb20gaW1hZ2UKLSMuICogYXJnOiAtCi0jLiAqCi0jLgotIzogdm1zLXRpci5jOjExODkKLW1zZ2lkICJTdGFjay1mcm9tLWltYWdlIG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTIwOQotbXNnaWQgIlN0YWNrLWVudHJ5LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqIGNvbXBhcmUgcHJvY2VkdXJlIGFyZ3VtZW50Ci0jLiAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLSMuICoJYnkJYXJndW1lbnQgaW5kZXgKLSMuICoJZGEJYXJndW1lbnQgZGVzY3JpcHRvcgotIy4gKgotIy4gKiBjb21wYXJlIGFyZ3VtZW50IGRlc2NyaXB0b3Igd2l0aCBzeW1ib2wgYXJndW1lbnQgKEFSRyRWX1BBU1NNRUNIKQotIy4gKiBhbmQgc3RhY2sgVFJVRSAoYXJncyBtYXRjaCkgb3IgRkFMU0UgKGFyZ3MgZG9udCBtYXRjaCkgdmFsdWUKLSMuCi0jOiB2bXMtdGlyLmM6MTIyNQotbXNnaWQgIlBBU1NNRUNIIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI0NQotbXNnaWQgIlN0YWNrLWxvY2FsLXN5bWJvbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjEyNjAKLW1zZ2lkICJTdGFjay1saXRlcmFsIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI4MgotbXNnaWQgIlN0YWNrLWxvY2FsLXN5bWJvbC1lbnRyeS1wb2ludC1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmltcGxlbWVudGVkIFNUTyBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE1OTgKLW1zZ2lkICJUSVJfU19DX09QUl9BU0ggaW5jb21wbGV0ZSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTYxMgotbXNnaWQgIlRJUl9TX0NfT1BSX1VTSCBpbmNvbXBsZXRlIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNjI2Ci1tc2dpZCAiVElSX1NfQ19PUFJfUk9UIGluY29tcGxldGUiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogcmVkZWZpbmUgc3ltYm9sIHRvIGN1cnJlbnQgbG9jYXRpb24KLSMuCi0jOiB2bXMtdGlyLmM6MTY0NwotbXNnaWQgIlRJUl9TX0NfT1BSX1JFREVGIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogZGVmaW5lIGEgbGl0ZXJhbAotIy4KLSM6IHZtcy10aXIuYzoxNjU0Ci1tc2dpZCAiVElSX1NfQ19PUFJfREZMSVQgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcwOQotbXNnaWQgIlRJUl9TX0NfQ1RMX0RGTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcxNwotbXNnaWQgIlRJUl9TX0NfQ1RMX1NUTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcyNQotbXNnaWQgIlRJUl9TX0NfQ1RMX1NUS0RMIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTc4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJPYmogY29kZSAlZCBub3QgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjIxMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU0VDX1JFTE9DIHdpdGggbm8gcmVsb2NzIGluIHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjI0MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5oYW5kbGVkIHJlbG9jYXRpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTY2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYCVzJyBoYXMgbGluZSBudW1iZXJzIGJ1dCBubyBlbmNsb3Npbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjbGFzcyAlZCBzeW1ib2wgYCVzJyBoYXMgbm8gYXV4IGVudHJpZXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTczNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBjc2VjdCB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE3NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBYVFlfRVIgc3ltYm9sIGAlcyc6IGNsYXNzICVkIHNjbnVtICVkIHNjbmxlbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBYTUNfVEMwIHN5bWJvbCBgJXMnIGlzIGNsYXNzICVkIHNjbmxlbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxOTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIHNtY2xhcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxOTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjc2VjdCBgJXMnIG5vdCBpbiBlbmNsb3Npbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBtaXNwbGFjZWQgWFRZX0xEIGAlcyciCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MjM0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2MgJXM6JWQgbm90IGluIGNzZWN0IgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjI0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFhDT0ZGIHNoYXJlZCBvYmplY3Qgd2hlbiBub3QgcHJvZHVjaW5nIFhDT0ZGIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyNTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkeW5hbWljIG9iamVjdCB3aXRoIG5vIC5sb2FkZXIgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzozMTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBzdWNoIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzozNzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndhcm5pbmc6IGF0dGVtcHQgdG8gZXhwb3J0IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo0NzA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRPQyBvdmVyZmxvdzogMHglbHggPiAweDEwMDAwOyB0cnkgLW1taW5pbWFsLXRvYyB3aGVuIGNvbXBpbGluZyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTI5IHhjb2ZmbGluay5jOjU4ODUgeGNvZmZsaW5rLmM6NTkyMiB4Y29mZmxpbmsuYzo2MjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTUxIHhjb2ZmbGluay5jOjYyNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGAlcycgaW4gbG9hZGVyIHJlbG9jIGJ1dCBub3QgbG9hZGVyIHN5bSIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsb2FkZXIgcmVsb2MgaW4gcmVhZC1vbmx5IHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NjQ0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo2NDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBUT0MgcmVsb2MgYXQgMHgleCB0byBzeW1ib2wgYCVzJyB3aXRoIG5vIFRPQyBlbnRyeSIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvYmZkL3BwY2Jvb3QuYyBiL2JmZC9wcGNib290LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZGI4MjYuLjAwMDAwMDAKLS0tIGEvYmZkL3BwY2Jvb3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFBQQ2J1ZyBib290IHJlY29yZHMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQsIDxtZWlzc25lckBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBCRkQgYmFja2VuZCB3aGljaCBtYXkgYmUgdXNlZCB0byB3cml0ZSBQb3dlclBDQnVnIGJvb3Qgb2JqZWN0cy4KLSAgIEl0IG1heSBvbmx5IGJlIHVzZWQgZm9yIG91dHB1dCwgbm90IGlucHV0LiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHRoaXMgbWF5Ci0gICBiZSB1c2VkIGFzIGFuIG91dHB1dCBmb3JtYXQgZm9yIG9iamNvcHkgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgcmF3IGJpbmFyeQotICAgZGF0YS4KLQotICAgVGhpcyBpcyB2ZXJ5IHNpbXBsZS4gIFRoZSBvbmx5IGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSByZWFsIGRhdGEKLSAgIHdpbGwgc3RhcnQgYXQgc29tZSBhZGRyZXNzIFgsIGFuZCBpbiBzb21lIGNhc2VzIHdlIHdpbGwgbm90IHdhbnQgdG8KLSAgIGluY2x1ZGUgWCB6ZXJvZXMganVzdCB0byBnZXQgdG8gdGhhdCBwb2ludC4gIFNpbmNlIHRoZSBzdGFydAotICAgYWRkcmVzcyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQsIHdlIHVzZSBpdAotICAgaW5zdGVhZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBzdGFydCBvZgotICAgdGhlIGZpbGUuICBvYmpjb3B5IGNvb3BlcmF0ZXMgYnkgc3BlY2lhbGx5IHNldHRpbmcgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIHRvIHplcm8gYnkgZGVmYXVsdC4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFBQQ2J1ZyBsb2NhdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfbG9jYXRpb24gewotICBiZmRfYnl0ZQlpbmQ7Ci0gIGJmZF9ieXRlCWhlYWQ7Ci0gIGJmZF9ieXRlCXNlY3RvcjsKLSAgYmZkX2J5dGUJY3lsaW5kZXI7Ci19IHBwY2Jvb3RfbG9jYXRpb25fdDsKLQotLyogUFBDYnVnIHBhcnRpdGlvbiB0YWJsZSBsYXlvdXQgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfcGFydGl0aW9uIHsKLSAgcHBjYm9vdF9sb2NhdGlvbl90CXBhcnRpdGlvbl9iZWdpbjsJLyogcGFydGl0aW9uIGJlZ2luICovCi0gIHBwY2Jvb3RfbG9jYXRpb25fdAlwYXJ0aXRpb25fZW5kOwkJLyogcGFydGl0aW9uIGVuZCAqLwotICBiZmRfYnl0ZQkJc2VjdG9yX2JlZ2luWzRdOwkvKiAzMi1iaXQgc3RhcnQgUkJBICh6ZXJvLWJhc2VkKSwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJc2VjdG9yX2xlbmd0aFs0XTsJLyogMzItYml0IFJCQSBjb3VudCAob25lLWJhc2VkKSwgbGl0dGxlIGVuZGlhbiAqLwotfSBwcGNib290X3BhcnRpdGlvbl90OwotCi0vKiBQUENidWcgYm9vdCBsYXlvdXQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9oZHIgewotICBiZmRfYnl0ZQkJcGNfY29tcGF0aWJpbGl0eVs0NDZdOwkvKiB4ODYgaW5zdHJ1Y3Rpb24gZmllbGQgKi8KLSAgcHBjYm9vdF9wYXJ0aXRpb25fdAlwYXJ0aXRpb25bNF07CQkvKiBwYXJ0aXRpb24gaW5mb3JtYXRpb24gKi8KLSAgYmZkX2J5dGUJCXNpZ25hdHVyZVsyXTsJCS8qIDB4NTUgYW5kIDB4YWEgKi8KLSAgYmZkX2J5dGUJCWVudHJ5X29mZnNldFs0XTsJLyogZW50cnkgcG9pbnQgb2Zmc2V0LCBsaXR0bGUgZW5kaWFuICovCi0gIGJmZF9ieXRlCQlsZW5ndGhbNF07CQkvKiBsb2FkIGltYWdlIGxlbmd0aCwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJZmxhZ3M7CQkJLyogZmxhZyBmaWVsZCAqLwotICBiZmRfYnl0ZQkJb3NfaWQ7CQkJLyogT1NfSUQgKi8KLSAgY2hhcgkJCXBhcnRpdGlvbl9uYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUgKi8KLSAgYmZkX2J5dGUJCXJlc2VydmVkMVs0NzBdOwkJLyogcmVzZXJ2ZWQgKi8KLX0gcHBjYm9vdF9oZHJfdDsKLQotLyogU2lnbmF0dXJlIGJ5dGVzIGZvciBsYXN0IDIgYnl0ZXMgb2YgdGhlIDUxMiBieXRlIHJlY29yZCAqLwotI2RlZmluZSBTSUdOQVRVUkUwIDB4NTUKLSNkZWZpbmUgU0lHTkFUVVJFMSAweGFhCi0KLS8qIFBvd2VyUEMgYm9vdCB0eXBlICovCi0jZGVmaW5lIFBQQ19JTkQgMHg0MQotCi0vKiBJbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHBwY2Jvb3QgaGVhZGVyICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X2RhdGEgewotICBwcGNib290X2hkcl90CWhlYWRlcjsJCQkJLyogcmF3IGhlYWRlciAqLwotICBhc2VjdGlvbiAqc2VjOwkJCQkvKiBzaW5nbGUgc2VjdGlvbiAqLwotfSBwcGNib290X2RhdGFfdDsKLQotLyogQW55IGJmZCB3ZSBjcmVhdGUgYnkgcmVhZGluZyBhIHBwY2Jvb3QgZmlsZSBoYXMgdGhyZWUgc3ltYm9sczoKLSAgIGEgc3RhcnQgc3ltYm9sLCBhbiBlbmQgc3ltYm9sLCBhbmQgYW4gYWJzb2x1dGUgbGVuZ3RoIHN5bWJvbC4gICovCi0jZGVmaW5lIFBQQ0JPT1RfU1lNUyAzCi0KLXN0YXRpYyBib29sZWFuIHBwY2Jvb3RfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpwcGNib290X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGxvbmcgcHBjYm9vdF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqbWFuZ2xlX25hbWUgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotc3RhdGljIGxvbmcgcHBjYm9vdF9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqcHBjYm9vdF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgcHBjYm9vdF9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGludCBwcGNib290X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotI2RlZmluZSBwcGNib290X3NldF90ZGF0YShhYmZkLCBwdHIpICgoYWJmZCktPnRkYXRhLmFueSA9IChQVFIpIChwdHIpKQotI2RlZmluZSBwcGNib290X2dldF90ZGF0YShhYmZkKSAoKHBwY2Jvb3RfZGF0YV90ICopICgoYWJmZCktPnRkYXRhLmFueSkpCi0MCi0vKiBDcmVhdGUgYSBwcGNib290IG9iamVjdC4gIEludm9rZWQgdmlhIGJmZF9zZXRfZm9ybWF0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFwcGNib290X2dldF90ZGF0YSAoYWJmZCkpCi0gICAgcHBjYm9vdF9zZXRfdGRhdGEgKGFiZmQsIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAocHBjYm9vdF9kYXRhX3QpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIHRvIFBvd2VyUEMgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNib290X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQotICBlbHNlIGlmIChhcmNoICE9IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotDAotLyogQW55IGZpbGUgbWF5IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBwcGNib290IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKLSAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcwotICAgYmVpbmcgcHBjYm9vdC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXBwY2Jvb3Rfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgcHBjYm9vdF9oZHJfdCBoZHI7Ci0gIHNpemVfdCBpOwotICBwcGNib290X2RhdGFfdCAqdGRhdGE7Ci0KLSAgQkZEX0FTU0VSVCAoc2l6ZW9mIChwcGNib290X2hkcl90KSA9PSAxMDI0KTsKLQotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoKHNpemVfdCkgc3RhdGJ1Zi5zdF9zaXplIDwgc2l6ZW9mIChwcGNib290X2hkcl90KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIHNpemVvZiAoaGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mIChoZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyBzb21lIGJhc2ljIGNoZWNrcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGhkci5wY19jb21wYXRpYmlsaXR5KTsgaSsrKQotICAgIGlmIChoZHIucGNfY29tcGF0aWJpbGl0eVtpXSkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICBpZiAoaGRyLnNpZ25hdHVyZVswXSAhPSBTSUdOQVRVUkUwIHx8IGhkci5zaWduYXR1cmVbMV0gIT0gU0lHTkFUVVJFMSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoaGRyLnBhcnRpdGlvblswXS5wYXJ0aXRpb25fZW5kLmluZCAhPSBQUENfSU5EKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFiZmQtPnN5bWNvdW50ID0gUFBDQk9PVF9TWU1TOwotCi0gIC8qIE9uZSBkYXRhIHNlY3Rpb24uICAqLwotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRhdGEiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzZWMtPmZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUzsKLSAgc2VjLT52bWEgPSAwOwotICBzZWMtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZSAtIHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci0gIHNlYy0+ZmlsZXBvcyA9IHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci0KLSAgcHBjYm9vdF9ta29iamVjdCAoYWJmZCk7Ci0gIHRkYXRhID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpOwotICB0ZGF0YS0+c2VjID0gc2VjOwotICBtZW1jcHkgKChQVFIpICZ0ZGF0YS0+aGVhZGVyLCAoUFRSKSAmaGRyLCBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpKTsKLQotICBwcGNib290X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Bvd2VycGMsIDApOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2RlZmluZSBwcGNib290X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBwcGNib290X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBwcGNib290X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotDAotLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0ICsgc2l6ZW9mKHBwY2Jvb3RfaGRyX3QpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotcHBjYm9vdF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIChQUENCT09UX1NZTVMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotDAotLyogQ3JlYXRlIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGJmZCdzIGZpbGVuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbWFuZ2xlX25hbWUgKGFiZmQsIHN1ZmZpeCkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdWZmaXg7Ci17Ci0gIGludCBzaXplOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnA7Ci0KLSAgc2l6ZSA9IChzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCSAgKyBzdHJsZW4gKHN1ZmZpeCkKLQkgICsgc2l6ZW9mICJfcHBjYm9vdF9fIik7Ci0KLSAgYnVmID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAiIjsKLQotICBzcHJpbnRmIChidWYsICJfcHBjYm9vdF8lc18lcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdWZmaXgpOwotCi0gIC8qIENoYW5nZSBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHRvIHVuZGVyc2NvcmVzLiAgKi8KLSAgZm9yIChwID0gYnVmOyAqcDsgcCsrKQotICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkpCi0gICAgICAqcCA9ICdfJzsKLQotICByZXR1cm4gYnVmOwotfQotCi0MCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1wcGNib290X2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBhc2VjdGlvbiAqc2VjID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpLT5zZWM7Ci0gIGFzeW1ib2wgKnN5bXM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIFBQQ0JPT1RfU1lNUyAqIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAoc3ltcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTdGFydCBzeW1ib2wuICAqLwotICBzeW1zWzBdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzBdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInN0YXJ0Iik7Ci0gIHN5bXNbMF0udmFsdWUgPSAwOwotICBzeW1zWzBdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1swXS5zZWN0aW9uID0gc2VjOwotICBzeW1zWzBdLnVkYXRhLnAgPSBOVUxMOwotCi0gIC8qIEVuZCBzeW1ib2wuICAqLwotICBzeW1zWzFdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzFdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgImVuZCIpOwotICBzeW1zWzFdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMV0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzFdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMV0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogU2l6ZSBzeW1ib2wuICAqLwotICBzeW1zWzJdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzJdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInNpemUiKTsKLSAgc3ltc1syXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICBzeW1zWzJdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1syXS5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgc3ltc1syXS51ZGF0YS5wID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgUFBDQk9PVF9TWU1TOyBpKyspCi0gICAgKmFsb2NhdGlvbisrID0gc3ltcysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gUFBDQk9PVF9TWU1TOwotfQotCi0MCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXBwY2Jvb3RfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci19Ci0KLQwKLSNkZWZpbmUgcHBjYm9vdF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0KLS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNib290X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLSNkZWZpbmUgcHBjYm9vdF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHBwY2Jvb3RfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHBwY2Jvb3RfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBwcGNib290X21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfMGwpCi0jZGVmaW5lIHBwY2Jvb3RfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0MCi0vKiBXcml0ZSBzZWN0aW9uIGNvbnRlbnRzIG9mIGEgcHBjYm9vdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3Rfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxvdzsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBUaGUgbG93ZXN0IHNlY3Rpb24gVk1BIHNldHMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQKLSAgICAgICAgIG9mIHRoZSBmaWxlLiAgV2UgdXNlIHRoZSBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQotICAgICAgICAgc2VjdGlvbnMuICAqLwotICAgICAgbG93ID0gYWJmZC0+c2VjdGlvbnMtPnZtYTsKLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zLT5uZXh0OyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmIChzLT52bWEgPCBsb3cpCi0JICBsb3cgPSBzLT52bWE7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXMtPmZpbGVwb3MgPSBzLT52bWEgLSBsb3c7Ci0KLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLQwKLXN0YXRpYyBpbnQKLXBwY2Jvb3Rfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci19Ci0KLQwKLS8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZhcmc7Ci17Ci0gIEZJTEUgKmYgPSAoRklMRSAqKWZhcmc7Ci0gIHBwY2Jvb3RfZGF0YV90ICp0ZGF0YSA9IHBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKTsKLSAgbG9uZyBlbnRyeV9vZmZzZXQgPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIuZW50cnlfb2Zmc2V0KTsKLSAgbG9uZyBsZW5ndGggPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIubGVuZ3RoKTsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZiAoZiwgXygiXG5wcGNib290IGhlYWRlcjpcbiIpKTsKLSAgZnByaW50ZiAoZiwgXygiRW50cnkgb2Zmc2V0ICAgICAgICA9IDB4JS44bHggKCVsZClcbiIpLCBlbnRyeV9vZmZzZXQsIGVudHJ5X29mZnNldCk7Ci0gIGZwcmludGYgKGYsIF8oIkxlbmd0aCAgICAgICAgICAgICAgPSAweCUuOGx4ICglbGQpXG4iKSwgbGVuZ3RoLCBsZW5ndGgpOwotCi0gIGlmICh0ZGF0YS0+aGVhZGVyLmZsYWdzKQotICAgIGZwcmludGYgKGYsIF8oIkZsYWcgZmllbGQgICAgICAgICAgPSAweCUuMnhcbiIpLCB0ZGF0YS0+aGVhZGVyLmZsYWdzKTsKLQotICBpZiAodGRhdGEtPmhlYWRlci5vc19pZCkKLSAgICBmcHJpbnRmIChmLCAiT1NfSUQgICAgICAgICAgICAgICA9IDB4JS4yeFxuIiwgdGRhdGEtPmhlYWRlci5vc19pZCk7Ci0KLSAgaWYgKHRkYXRhLT5oZWFkZXIucGFydGl0aW9uX25hbWUpCi0gICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uIG5hbWUgICAgICA9IFwiJXNcIlxuIiksIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uX25hbWUpOwotCi0gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgbG9uZyBzZWN0b3JfYmVnaW4gID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5zZWN0b3JfYmVnaW4pOwotICAgICAgbG9uZyBzZWN0b3JfbGVuZ3RoID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5zZWN0b3JfbGVuZ3RoKTsKLQotICAgICAgLyogU2tpcCBhbGwgMCBlbnRyaWVzICovCi0gICAgICBpZiAoIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5pbmQKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaGVhZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5zZWN0b3IKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uY3lsaW5kZXIKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmluZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaGVhZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuc2VjdG9yCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5jeWxpbmRlcgotCSAgJiYgIXNlY3Rvcl9iZWdpbiAmJiAhc2VjdG9yX2xlbmd0aCkKLQljb250aW51ZTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5QYXJ0aXRpb25bJWRdIHN0YXJ0ICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIpLCBpLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaW5kLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaGVhZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLnNlY3RvciwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmN5bGluZGVyKTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uWyVkXSBlbmQgICAgPSB7IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCB9XG4iKSwgaSwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5pbmQsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaGVhZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5zZWN0b3IsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuY3lsaW5kZXIpOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIHNlY3RvciA9IDB4JS44bHggKCVsZClcbiIpLCBpLCBzZWN0b3JfYmVnaW4sIHNlY3Rvcl9iZWdpbik7Ci0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIGxlbmd0aCA9IDB4JS44bHggKCVsZClcbiIpLCBpLCBzZWN0b3JfbGVuZ3RoLCBzZWN0b3JfbGVuZ3RoKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZiwgIlxuIik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBwcGNib290X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgcHBjYm9vdF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBwcGNib290X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBwcGNib290X2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdCBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLWNvbnN0IGJmZF90YXJnZXQgcHBjYm9vdF92ZWMgPQotewotICAicHBjYm9vdCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwJLyogZmxhdm91ciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGJ5dGVvcmRlciBpcyBiaWcgZW5kaWFuIGZvciBjb2RlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyX2J5dGVvcmRlciAqLwotICBFWEVDX1AsCQkJLyogb2JqZWN0X2ZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMpLCAvKiBzZWN0aW9uX2ZsYWdzICovCi0gIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCi0gIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHBwY2Jvb3Rfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgcHBjYm9vdF9ta29iamVjdCwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfdHJ1ZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9iZmQvcHRyYWNlLWNvcmUuYyBiL2JmZC9wdHJhY2UtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTY5ZGNlLi4wMDAwMDAwCi0tLSBhL2JmZC9wdHJhY2UtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBjb3JlIGZpbGVzIHdoaWNoIHVzZSB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRyYWQtY29yZS5jIHdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlCi0gICBvZiBDeWdudXMgU3VwcG9ydC4KLSAgIE1vZGlmaWVkIHRvIHdvcmsgd2l0aCB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlIGJ5IEtldmluIEEuIEJ1ZXR0bmVyLgotICAgKExvbmd0ZXJtIGl0IG1heSBiZSBiZXR0ZXIgdG8gbWVyZ2UgdGhpcyBmaWxlIHdpdGggdHJhZC1jb3JlLmMpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIFBUUkFDRV9DT1JFCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0KLQotc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QKLSAgewotICAgIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247Ci0gICAgYXNlY3Rpb24gKnN0YWNrX3NlY3Rpb247Ci0gICAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICAgIHN0cnVjdCBwdHJhY2VfdXNlciB1OwotICB9OwotCi0jZGVmaW5lIGNvcmVfdXBhZ2UoYmZkKSAoJigoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUpKQotI2RlZmluZSBjb3JlX2RhdGFzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5kYXRhX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnJlZ19zZWN0aW9uKQotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICpwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNoYXIgKgkJcHRyYWNlX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWludAkJcHRyYWNlX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbgkJcHRyYWNlX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0JCQkgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOwotc3RhdGljIHZvaWQJc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEFSR1NVU0VEICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXB0cmFjZV91bml4X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0KLXsKLSAgaW50IHZhbDsKLSAgc3RydWN0IHB0cmFjZV91c2VyIHU7Ci0gIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICpyYXdwdHI7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnUsIDEsIHNpemVvZiB1LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgdSB8fCB1LnB0X21hZ2ljICE9IF9CQ1NfUFRSQUNFX01BR0lDIAotICAgICAgfHwgdS5wdF9yZXYgIT0gX0JDU19QVFJBQ0VfUkVWKQotICAgIHsKLSAgICAgIC8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgLyogQWxsb2NhdGUgYm90aCB0aGUgdXBhZ2UgYW5kIHRoZSBzdHJ1Y3QgY29yZV9kYXRhIGF0IG9uY2UsIHNvCi0gICAgIGEgc2luZ2xlIGZyZWUoKSB3aWxsIGZyZWUgdGhlbSBib3RoLiAgKi8KLSAgcmF3cHRyID0gKHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QpKTsKLQotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YSA9IHJhd3B0cjsKLQotICByYXdwdHItPnUgPSB1OyAvKkNvcHkgdGhlIHVhcmVhIGludG8gdGhlIHRkYXRhIHBhcnQgb2YgdGhlIGJmZCAqLwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gZnJlZQotICAgICB0aGVtIHNlcGFyYXRlbHkuICAqLwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfc3RhY2tzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9kYXRhc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5hbWUgPSAiLnN0YWNrIjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmFtZSA9ICIuZGF0YSI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKLQotICAvKiBGSVhNRTogIE5lZWQgdG8gd29ycnkgYWJvdXQgc2hhcmVkIG1lbW9yeSwgbGlicmFyeSBkYXRhLCBhbmQgbGlicmFyeQotICAgICB0ZXh0LiAgSSBkb24ndCB0aGluayB0aGF0IGFueSBvZiB0aGVzZSB0aGluZ3MgYXJlIHN1cHBvcnRlZCBvbiB0aGUKLSAgICAgc3lzdGVtIG9uIHdoaWNoIEkgYW0gZGV2ZWxvcGluZyB0aGlzIGZvciB0aG91Z2guICovCi0KLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSAgdS5wdF9kc2l6ZTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHUucHRfc3NpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gc2l6ZW9mKHUpOwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IHUucHRfb19kYXRhX3N0YXJ0OwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gVVNSU1RBQ0sgLSB1LnB0X3NzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IDAgLSBzaXplb2YodSk7CS8qIHNlZSB0cmFkLWNvcmUuYyAqLwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSAoaW50KSB1LnB0X2RhdGFwdHI7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5maWxlcG9zID0gKGludCkgKHUucHRfZGF0YXB0ciArIHUucHRfZHNpemUpOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAwOyAvKiBSZWdpc3RlciBzZWdtZW50IGlzIHB0cmFjZV91c2VyICovCi0KLSAgLyogQWxpZ24gdG8gd29yZCBhdCBsZWFzdCAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9zdGFja3NlYyAoYWJmZCk7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9kYXRhc2VjIChhYmZkKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWNoYXIgKgotcHRyYWNlX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpjb20gPSBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5wdF9jb21tOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUucHRfc2lnZnJhbWUuc2lnX251bTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWJvb2xlYW4KLXB0cmFjZV91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICAvKiBGSVhNRTogVXNlIHB0X3RpbWRhdCBmaWVsZCBvZiB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlIHRvIG1hdGNoIAotICAgICB0aGUgZGF0ZSBvZiB0aGUgZXhlY3V0YWJsZSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IHB0cmFjZV9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgcHRyYWNlX3VuaXhfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChwdHJhY2VfdW5peCksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLSNlbmRpZiAvKiBQVFJBQ0VfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL3JlbG9jLmMgYi9iZmQvcmVsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkYjE1Zi4uMDAwMDAwMAotLS0gYS9iZmQvcmVsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MDUgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIGhhbmRsaW5nIHJlbG9jYXRpb24gZW50cmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlSZWxvY2F0aW9ucwotCi0JQkZEIG1haW50YWlucyByZWxvY2F0aW9ucyBpbiBtdWNoIHRoZSBzYW1lIHdheSBpdCBtYWludGFpbnMKLQlzeW1ib2xzOiB0aGV5IGFyZSBsZWZ0IGFsb25lIHVudGlsIHJlcXVpcmVkLCB0aGVuIHJlYWQgaW4KLQllbi1tYXNzIGFuZCB0cmFuc2xhdGVkIGludG8gYW4gaW50ZXJuYWwgZm9ybS4gIEEgY29tbW9uCi0Jcm91dGluZSA8PGJmZF9wZXJmb3JtX3JlbG9jYXRpb24+PiBhY3RzIHVwb24gdGhlCi0JY2Fub25pY2FsIGZvcm0gdG8gZG8gdGhlIGZpeHVwLgotCi0JUmVsb2NhdGlvbnMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgc2VjdGlvbiBiYXNpcywKLQl3aGlsZSBzeW1ib2xzIGFyZSBtYWludGFpbmVkIG9uIGEgcGVyIEJGRCBiYXNpcy4KLQotCUFsbCB0aGF0IGEgYmFjayBlbmQgaGFzIHRvIGRvIHRvIGZpdCB0aGUgQkZEIGludGVyZmFjZSBpcyB0byBjcmVhdGUKLQlhIDw8c3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5Pj4gZm9yIGVhY2ggcmVsb2NhdGlvbgotCWluIGEgcGFydGljdWxhciBzZWN0aW9uLCBhbmQgZmlsbCBpbiB0aGUgcmlnaHQgYml0cyBvZiB0aGUgc3RydWN0dXJlcy4KLQotQG1lbnUKLUAqIHR5cGVkZWYgYXJlbGVudDo6Ci1AKiBob3d0byBtYW5hZ2VyOjoKLUBlbmQgbWVudQotCi0qLwotCi0vKiBETyBjb21waWxlIGluIHRoZSByZWxvY19jb2RlIG5hbWUgdGFibGUgZnJvbSBsaWJiZmQuaC4gICovCi0jZGVmaW5lIF9CRkRfTUFLRV9UQUJMRV9iZmRfcmVsb2NfY29kZV9yZWFsCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0vKgotRE9DREQKLUlOT0RFCi0JdHlwZWRlZiBhcmVsZW50LCBob3d0byBtYW5hZ2VyLCBSZWxvY2F0aW9ucywgUmVsb2NhdGlvbnMKLQotU1VCU0VDVElPTgotCXR5cGVkZWYgYXJlbGVudAotCi0JVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIGEgcmVsb2NhdGlvbiBlbnRyeToKLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfcmVsb2Nfc3RhdHVzCi0uewotLiAgICAgICB7KiBObyBlcnJvcnMgZGV0ZWN0ZWQgKn0KLS4gIGJmZF9yZWxvY19vaywKLS4KLS4gICAgICAgeyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IHRoZXJlIHdhcyBhbiBvdmVyZmxvdy4gKn0KLS4gIGJmZF9yZWxvY19vdmVyZmxvdywKLS4KLS4gICAgICAgeyogVGhlIGFkZHJlc3MgdG8gcmVsb2NhdGUgd2FzIG5vdCB3aXRoaW4gdGhlIHNlY3Rpb24gc3VwcGxpZWQuICp9Ci0uICBiZmRfcmVsb2Nfb3V0b2ZyYW5nZSwKLS4KLS4gICAgICAgeyogVXNlZCBieSBzcGVjaWFsIGZ1bmN0aW9ucyAqfQotLiAgYmZkX3JlbG9jX2NvbnRpbnVlLAotLgotLiAgICAgICB7KiBVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHNpemUgcmVxdWVzdGVkLiAqfQotLiAgYmZkX3JlbG9jX25vdHN1cHBvcnRlZCwKLS4KLS4gICAgICAgeyogVW51c2VkICp9Ci0uICBiZmRfcmVsb2Nfb3RoZXIsCi0uCi0uICAgICAgIHsqIFRoZSBzeW1ib2wgdG8gcmVsb2NhdGUgYWdhaW5zdCB3YXMgdW5kZWZpbmVkLiAqfQotLiAgYmZkX3JlbG9jX3VuZGVmaW5lZCwKLS4KLS4gICAgICAgeyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IG1heSBub3QgYmUgb2sgLSBwcmVzZW50bHkKLS4gICAgICAgICAgZ2VuZXJhdGVkIG9ubHkgd2hlbiBsaW5raW5nIGk5NjAgY29mZiBmaWxlcyB3aXRoIGk5NjAgYi5vdXQKLS4gICAgICAgICAgc3ltYm9scy4gIElmIHRoaXMgdHlwZSBpcyByZXR1cm5lZCwgdGhlIGVycm9yX21lc3NhZ2UgYXJndW1lbnQKLS4gICAgICAgICAgdG8gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB3aWxsIGJlIHNldC4gICp9Ci0uICBiZmRfcmVsb2NfZGFuZ2Vyb3VzCi0uIH0KLS4gYmZkX3JlbG9jX3N0YXR1c190eXBlOwotLgotLgotLnR5cGVkZWYgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5Ci0uewotLiAgICAgICB7KiBBIHBvaW50ZXIgaW50byB0aGUgY2Fub25pY2FsIHRhYmxlIG9mIHBvaW50ZXJzICAqfQotLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bV9wdHJfcHRyOwotLgotLiAgICAgICB7KiBvZmZzZXQgaW4gc2VjdGlvbiAqfQotLiAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotLgotLiAgICAgICB7KiBhZGRlbmQgZm9yIHJlbG9jYXRpb24gdmFsdWUgKn0KLS4gIGJmZF92bWEgYWRkZW5kOwotLgotLiAgICAgICB7KiBQb2ludGVyIHRvIGhvdyB0byBwZXJmb3JtIHRoZSByZXF1aXJlZCByZWxvY2F0aW9uICp9Ci0uICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLS4KLS59IGFyZWxlbnQ7Ci0KLSovCi0KLS8qCi1ERVNDUklQVElPTgotCi0gICAgICAgIEhlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIG9mIHRoZSBmaWVsZHMgd2l0aGluIGFuIDw8YXJlbGVudD4+OgotCi0gICAgICAgIG8gPDxzeW1fcHRyX3B0cj4+Ci0KLSAgICAgICAgVGhlIHN5bWJvbCB0YWJsZSBwb2ludGVyIHBvaW50cyB0byBhIHBvaW50ZXIgdG8gdGhlIHN5bWJvbAotICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbG9jYXRpb24gcmVxdWVzdC4gIEl0IGlzCi0gICAgICAgIHRoZSBwb2ludGVyIGludG8gdGhlIHRhYmxlIHJldHVybmVkIGJ5IHRoZSBiYWNrIGVuZCdzCi0gICAgICAgIDw8Z2V0X3N5bXRhYj4+IGFjdGlvbi4gQHhyZWZ7U3ltYm9sc30uIFRoZSBzeW1ib2wgaXMgcmVmZXJlbmNlZAotICAgICAgICB0aHJvdWdoIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgc28gdGhhdCB0b29scyBsaWtlIHRoZSBsaW5rZXIKLSAgICAgICAgY2FuIGZpeCB1cCBhbGwgdGhlIHN5bWJvbHMgb2YgdGhlIHNhbWUgbmFtZSBieSBtb2RpZnlpbmcgb25seQotICAgICAgICBvbmUgcG9pbnRlci4gVGhlIHJlbG9jYXRpb24gcm91dGluZSBsb29rcyBpbiB0aGUgc3ltYm9sIGFuZAotICAgICAgICB1c2VzIHRoZSBiYXNlIG9mIHRoZSBzZWN0aW9uIHRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gYW5kIHRoZQotICAgICAgICB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFzIHRoZSBpbml0aWFsIHJlbG9jYXRpb24gb2Zmc2V0LiBJZiB0aGUKLSAgICAgICAgc3ltYm9sIHBvaW50ZXIgaXMgemVybywgdGhlbiB0aGUgc2VjdGlvbiBwcm92aWRlZCBpcyBsb29rZWQgdXAuCi0KLSAgICAgICAgbyA8PGFkZHJlc3M+PgotCi0gICAgICAgIFRoZSA8PGFkZHJlc3M+PiBmaWVsZCBnaXZlcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJhc2Ugb2YKLSAgICAgICAgdGhlIHNlY3Rpb24gZGF0YSB3aGljaCBvd25zIHRoZSByZWxvY2F0aW9uIHJlY29yZCB0byB0aGUgZmlyc3QKLSAgICAgICAgYnl0ZSBvZiByZWxvY2F0YWJsZSBpbmZvcm1hdGlvbi4gVGhlIGFjdHVhbCBkYXRhIHJlbG9jYXRlZAotICAgICAgICB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMgcG9pbnQ7IGZvciBleGFtcGxlLCBhIHJlbG9jYXRpb24KLSAgICAgICAgdHlwZSB3aGljaCBtb2RpZmllcyB0aGUgYm90dG9tIHR3byBieXRlcyBvZiBhIGZvdXIgYnl0ZSB3b3JkCi0gICAgICAgIHdvdWxkIG5vdCB0b3VjaCB0aGUgZmlyc3QgYnl0ZSBwb2ludGVkIHRvIGluIGEgYmlnIGVuZGlhbgotICAgICAgICB3b3JsZC4KLQotCW8gPDxhZGRlbmQ+PgotCi0JVGhlIDw8YWRkZW5kPj4gaXMgYSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYmFjayBlbmQgdG8gYmUgYWRkZWQgKCEpCi0JdG8gdGhlIHJlbG9jYXRpb24gb2Zmc2V0LiBJdHMgaW50ZXJwcmV0YXRpb24gaXMgZGVwZW5kZW50IHVwb24KLQl0aGUgaG93dG8uIEZvciBleGFtcGxlLCBvbiB0aGUgNjhrIHRoZSBjb2RlOgotCi0KLXwgICAgICAgIGNoYXIgZm9vW107Ci18ICAgICAgICBtYWluKCkKLXwgICAgICAgICAgICAgICAgewotfCAgICAgICAgICAgICAgICByZXR1cm4gZm9vWzB4MTIzNDU2NzhdOwotfCAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgQ291bGQgYmUgY29tcGlsZWQgaW50bzoKLQotfCAgICAgICAgbGlua3cgZnAsIy00Ci18ICAgICAgICBtb3ZlYiBAQCMxMjM0NTY3OCxkMAotfCAgICAgICAgZXh0YmwgZDAKLXwgICAgICAgIHVubGsgZnAKLXwgICAgICAgIHJ0cwotCi0KLSAgICAgICAgVGhpcyBjb3VsZCBjcmVhdGUgYSByZWxvYyBwb2ludGluZyB0byA8PGZvbz4+LCBidXQgbGVhdmUgdGhlCi0gICAgICAgIG9mZnNldCBpbiB0aGUgZGF0YSwgc29tZXRoaW5nIGxpa2U6Ci0KLQotfFJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWy50ZXh0XToKLXxvZmZzZXQgICB0eXBlICAgICAgdmFsdWUKLXwwMDAwMDAwNiAzMiAgICAgICAgX2ZvbwotfAotfDAwMDAwMDAwIDRlNTYgZmZmYyAgICAgICAgICA7IGxpbmt3IGZwLCMtNAotfDAwMDAwMDA0IDEwMzkgMTIzNCA1Njc4ICAgICA7IG1vdmViIEBAIzEyMzQ1Njc4LGQwCi18MDAwMDAwMGEgNDljMCAgICAgICAgICAgICAgIDsgZXh0YmwgZDAKLXwwMDAwMDAwYyA0ZTVlICAgICAgICAgICAgICAgOyB1bmxrIGZwCi18MDAwMDAwMGUgNGU3NSAgICAgICAgICAgICAgIDsgcnRzCi0KLQotICAgICAgICBVc2luZyBjb2ZmIGFuZCBhbiA4OGssIHNvbWUgaW5zdHJ1Y3Rpb25zIGRvbid0IGhhdmUgZW5vdWdoCi0gICAgICAgIHNwYWNlIGluIHRoZW0gdG8gcmVwcmVzZW50IHRoZSBmdWxsIGFkZHJlc3MgcmFuZ2UsIGFuZAotICAgICAgICBwb2ludGVycyBoYXZlIHRvIGJlIGxvYWRlZCBpbiB0d28gcGFydHMuIFNvIHlvdSdkIGdldCBzb21ldGhpbmcgbGlrZToKLQotCi18ICAgICAgICBvci51ICAgICByMTMscjAsaGkxNihfZm9vKzB4MTIzNDU2NzgpCi18ICAgICAgICBsZC5iICAgICByMixyMTMsbG8xNihfZm9vKzB4MTIzNDU2NzgpCi18ICAgICAgICBqbXAgICAgICByMQotCi0KLSAgICAgICAgVGhpcyBzaG91bGQgY3JlYXRlIHR3byByZWxvY3MsIGJvdGggcG9pbnRpbmcgdG8gPDxfZm9vPj4sIGFuZCB3aXRoCi0gICAgICAgIDB4MTIzNDAwMDAgaW4gdGhlaXIgYWRkZW5kIGZpZWxkLiBUaGUgZGF0YSB3b3VsZCBjb25zaXN0IG9mOgotCi0KLXxSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFsudGV4dF06Ci18b2Zmc2V0ICAgdHlwZSAgICAgIHZhbHVlCi18MDAwMDAwMDIgSFZSVDE2ICAgIF9mb28rMHgxMjM0MDAwMAotfDAwMDAwMDA2IExWUlQxNiAgICBfZm9vKzB4MTIzNDAwMDAKLXwKLXwwMDAwMDAwMCA1ZGEwNTY3OCAgICAgICAgICAgOyBvci51IHIxMyxyMCwweDU2NzgKLXwwMDAwMDAwNCAxYzRkNTY3OCAgICAgICAgICAgOyBsZC5iIHIyLHIxMywweDU2NzgKLXwwMDAwMDAwOCBmNDAwYzAwMSAgICAgICAgICAgOyBqbXAgcjEKLQotCi0gICAgICAgIFRoZSByZWxvY2F0aW9uIHJvdXRpbmUgZGlncyBvdXQgdGhlIHZhbHVlIGZyb20gdGhlIGRhdGEsIGFkZHMKLSAgICAgICAgaXQgdG8gdGhlIGFkZGVuZCB0byBnZXQgdGhlIG9yaWdpbmFsIG9mZnNldCwgYW5kIHRoZW4gYWRkcyB0aGUKLSAgICAgICAgdmFsdWUgb2YgPDxfZm9vPj4uIE5vdGUgdGhhdCBhbGwgMzIgYml0cyBoYXZlIHRvIGJlIGtlcHQgYXJvdW5kCi0gICAgICAgIHNvbWV3aGVyZSwgdG8gY29wZSB3aXRoIGNhcnJ5IGZyb20gYml0IDE1IHRvIGJpdCAxNi4KLQotICAgICAgICBPbmUgZnVydGhlciBleGFtcGxlIGlzIHRoZSBzcGFyYyBhbmQgdGhlIGEub3V0IGZvcm1hdC4gVGhlCi0gICAgICAgIHNwYXJjIGhhcyBhIHNpbWlsYXIgcHJvYmxlbSB0byB0aGUgODhrLCBpbiB0aGF0IHNvbWUKLSAgICAgICAgaW5zdHJ1Y3Rpb25zIGRvbid0IGhhdmUgcm9vbSBmb3IgYW4gZW50aXJlIG9mZnNldCwgYnV0IG9uIHRoZQotICAgICAgICBzcGFyYyB0aGUgcGFydHMgYXJlIGNyZWF0ZWQgaW4gb2RkIHNpemVkIGx1bXBzLiBUaGUgZGVzaWduZXJzIG9mCi0gICAgICAgIHRoZSBhLm91dCBmb3JtYXQgY2hvc2UgdG8gbm90IHVzZSB0aGUgZGF0YSB3aXRoaW4gdGhlIHNlY3Rpb24KLSAgICAgICAgZm9yIHN0b3JpbmcgcGFydCBvZiB0aGUgb2Zmc2V0OyBhbGwgdGhlIG9mZnNldCBpcyBrZXB0IHdpdGhpbgotICAgICAgICB0aGUgcmVsb2MuIEFueXRoaW5nIGluIHRoZSBkYXRhIHNob3VsZCBiZSBpZ25vcmVkLgotCi18ICAgICAgICBzYXZlICVzcCwtMTEyLCVzcAotfCAgICAgICAgc2V0aGkgJWhpKF9mb28rMHgxMjM0NTY3OCksJWcyCi18ICAgICAgICBsZHNiIFslZzIrJWxvKF9mb28rMHgxMjM0NTY3OCldLCVpMAotfCAgICAgICAgcmV0Ci18ICAgICAgICByZXN0b3JlCi0KLSAgICAgICAgQm90aCByZWxvY3MgY29udGFpbiBhIHBvaW50ZXIgdG8gPDxmb28+PiwgYW5kIHRoZSBvZmZzZXRzCi0gICAgICAgIGNvbnRhaW4ganVuay4KLQotCi18UkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbLnRleHRdOgotfG9mZnNldCAgIHR5cGUgICAgICB2YWx1ZQotfDAwMDAwMDA0IEhJMjIgICAgICBfZm9vKzB4MTIzNDU2NzgKLXwwMDAwMDAwOCBMTzEwICAgICAgX2ZvbysweDEyMzQ1Njc4Ci18Ci18MDAwMDAwMDAgOWRlM2JmOTAgICAgIDsgc2F2ZSAlc3AsLTExMiwlc3AKLXwwMDAwMDAwNCAwNTAwMDAwMCAgICAgOyBzZXRoaSAlaGkoX2ZvbyswKSwlZzIKLXwwMDAwMDAwOCBmMDQ4YTAwMCAgICAgOyBsZHNiIFslZzIrJWxvKF9mb28rMCldLCVpMAotfDAwMDAwMDBjIDgxYzdlMDA4ICAgICA7IHJldAotfDAwMDAwMDEwIDgxZTgwMDAwICAgICA7IHJlc3RvcmUKLQotCi0gICAgICAgIG8gPDxob3d0bz4+Ci0KLSAgICAgICAgVGhlIDw8aG93dG8+PiBmaWVsZCBjYW4gYmUgaW1hZ2luZWQgYXMgYQotICAgICAgICByZWxvY2F0aW9uIGluc3RydWN0aW9uLiBJdCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgd2hpY2gKLSAgICAgICAgY29udGFpbnMgaW5mb3JtYXRpb24gb24gd2hhdCB0byBkbyB3aXRoIGFsbCBvZiB0aGUgb3RoZXIKLSAgICAgICAgaW5mb3JtYXRpb24gaW4gdGhlIHJlbG9jIHJlY29yZCBhbmQgZGF0YSBzZWN0aW9uLiBBIGJhY2sgZW5kCi0gICAgICAgIHdvdWxkIG5vcm1hbGx5IGhhdmUgYSByZWxvY2F0aW9uIGluc3RydWN0aW9uIHNldCBhbmQgdHVybgotICAgICAgICByZWxvY2F0aW9ucyBpbnRvIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSBvbiBpbnB1dCAtCi0gICAgICAgIGJ1dCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgZWFjaCBob3d0byBmaWVsZCBvbiBkZW1hbmQuCi0KLSovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JPDxlbnVtIGNvbXBsYWluX292ZXJmbG93Pj4KLQotCUluZGljYXRlcyB3aGF0IHNvcnQgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcgc2hvdWxkIGJlIGRvbmUgd2hlbgotCXBlcmZvcm1pbmcgYSByZWxvY2F0aW9uLgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0uZW51bSBjb21wbGFpbl9vdmVyZmxvdwotLnsKLS4JeyogRG8gbm90IGNvbXBsYWluIG9uIG92ZXJmbG93LiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLS4KLS4JeyogQ29tcGxhaW4gaWYgdGhlIGJpdGZpZWxkIG92ZXJmbG93cywgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkCi0uCSAgIGFzIHNpZ25lZCBvciB1bnNpZ25lZC4gKn0KLS4gIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBzaWduZWQKLS4JICAgbnVtYmVyLiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBhbgotLgkgICB1bnNpZ25lZCBudW1iZXIuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZAotLn07Ci0KLSovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0gICAgICAgIDw8cmVsb2NfaG93dG9fdHlwZT4+Ci0KLSAgICAgICAgVGhlIDw8cmVsb2NfaG93dG9fdHlwZT4+IGlzIGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUKLSAgICAgICAgaW5mb3JtYXRpb24gdGhhdCBsaWJiZmQgbmVlZHMgdG8ga25vdyB0byB0aWUgdXAgYSBiYWNrIGVuZCdzIGRhdGEuCi0KLUNPREVfRlJBR01FTlQKLS5zdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5OwkJeyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqfQotLgotLnN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLS57Ci0uICAgICAgIHsqICBUaGUgdHlwZSBmaWVsZCBoYXMgbWFpbmx5IGEgZG9jdW1lbnRhcnkgdXNlIC0gdGhlIGJhY2sgZW5kIGNhbgotLiAgICAgICAgICAgZG8gd2hhdCBpdCB3YW50cyB3aXRoIGl0LCB0aG91Z2ggbm9ybWFsbHkgdGhlIGJhY2sgZW5kJ3MKLS4gICAgICAgICAgIGV4dGVybmFsIGlkZWEgb2Ygd2hhdCBhIHJlbG9jIG51bWJlciBpcyBzdG9yZWQKLS4gICAgICAgICAgIGluIHRoaXMgZmllbGQuIEZvciBleGFtcGxlLCBhIFBDIHJlbGF0aXZlIHdvcmQgcmVsb2NhdGlvbgotLiAgICAgICAgICAgaW4gYSBjb2ZmIGVudmlyb25tZW50IGhhcyB0aGUgdHlwZSAwMjMgLSBiZWNhdXNlIHRoYXQncwotLiAgICAgICAgICAgd2hhdCB0aGUgb3V0c2lkZSB3b3JsZCBjYWxscyBhIFJfUENSV09SRCByZWxvYy4gKn0KLS4gIHVuc2lnbmVkIGludCB0eXBlOwotLgotLiAgICAgICB7KiAgVGhlIHZhbHVlIHRoZSBmaW5hbCByZWxvY2F0aW9uIGlzIHNoaWZ0ZWQgcmlnaHQgYnkuIFRoaXMgZHJvcHMKLS4gICAgICAgICAgIHVud2FudGVkIGRhdGEgZnJvbSB0aGUgcmVsb2NhdGlvbi4gICp9Ci0uICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdDsKLS4KLS4JeyogIFRoZSBzaXplIG9mIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZC4gIFRoaXMgaXMgKm5vdCogYQotLgkgICAgcG93ZXItb2YtdHdvIG1lYXN1cmUuICBUbyBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZAotLgkgICAgb24gYnkgYSB0eXBlIG9mIHJlbG9jYXRpb24sIHVzZSBiZmRfZ2V0X3JlbG9jX3NpemUuICAqfQotLiAgaW50IHNpemU7Ci0uCi0uICAgICAgIHsqICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyB1c2VkCi0uCSAgICB3aGVuIGRvaW5nIG92ZXJmbG93IGNoZWNraW5nLiAgKn0KLS4gIHVuc2lnbmVkIGludCBiaXRzaXplOwotLgotLiAgICAgICB7KiAgTm90ZXMgdGhhdCB0aGUgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlCi0uICAgICAgICAgICBkYXRhIHNlY3Rpb24gb2YgdGhlIGFkZGVuZC4gVGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gd2lsbAotLiAgICAgICAgICAgc3VidHJhY3QgZnJvbSB0aGUgcmVsb2NhdGlvbiB2YWx1ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24KLS4gICAgICAgICAgIGJlaW5nIHJlbG9jYXRlZC4gKn0KLS4gIGJvb2xlYW4gcGNfcmVsYXRpdmU7Ci0uCi0uCXsqICBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSByZWxvYyB2YWx1ZSBpbiB0aGUgZGVzdGluYXRpb24uCi0uCSAgICBUaGUgcmVsb2NhdGVkIHZhbHVlIGlzIGxlZnQgc2hpZnRlZCBieSB0aGlzIGFtb3VudC4gKn0KLS4gIHVuc2lnbmVkIGludCBiaXRwb3M7Ci0uCi0uCXsqIFdoYXQgdHlwZSBvZiBvdmVyZmxvdyBlcnJvciBzaG91bGQgYmUgY2hlY2tlZCBmb3Igd2hlbgotLgkgICByZWxvY2F0aW5nLiAqfQotLiAgZW51bSBjb21wbGFpbl9vdmVyZmxvdyBjb21wbGFpbl9vbl9vdmVyZmxvdzsKLS4KLS4gICAgICAgeyogSWYgdGhpcyBmaWVsZCBpcyBub24gbnVsbCwgdGhlbiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gaXMKLS4gICAgICAgICAgY2FsbGVkIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHJlYWxseQotLiAgICAgICAgICBzdHJhbmdlIHJlbG9jYXRpb24gbWV0aG9kcyB0byBiZSBhY2NvbW9kYXRlZCAoZS5nLiwgaTk2MCBjYWxsagotLiAgICAgICAgICBpbnN0cnVjdGlvbnMpLiAqfQotLiAgYmZkX3JlbG9jX3N0YXR1c190eXBlICgqc3BlY2lhbF9mdW5jdGlvbikKLS4JCQkJICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4JCQkJCSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2wsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLS4KLS4gICAgICAgeyogVGhlIHRleHR1YWwgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlLiAqfQotLiAgY2hhciAqbmFtZTsKLS4KLS4gICAgICAgeyogV2hlbiBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rLCBzb21lIGZvcm1hdHMgbXVzdCBtb2RpZnkgdGhlCi0uICAgICAgICAgIHJlbG9jYXRpb25zIHJhdGhlciB0aGFuIHRoZSBkYXRhIC0gdGhpcyBmbGFnIHNpZ25hbHMgdGhpcy4qfQotLiAgYm9vbGVhbiBwYXJ0aWFsX2lucGxhY2U7Ci0uCi0uICAgICAgIHsqIFRoZSBzcmNfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSByZWFkIGluIGRhdGEKLS4gICAgICAgICAgYXJlIHRvIGJlIHVzZWQgaW4gdGhlIHJlbG9jYXRpb24gc3VtLiAgRS5nLiwgaWYgdGhpcyB3YXMgYW4gOCBiaXQKLS4gICAgICAgICAgYml0IG9mIGRhdGEgd2hpY2ggd2UgcmVhZCBhbmQgcmVsb2NhdGVkLCB0aGlzIHdvdWxkIGJlCi0uICAgICAgICAgIDB4MDAwMDAwZmYuIFdoZW4gd2UgaGF2ZSByZWxvY3Mgd2hpY2ggaGF2ZSBhbiBhZGRlbmQsIHN1Y2ggYXMKLS4gICAgICAgICAgc3VuNCBleHRlbmRlZCByZWxvY3MsIHRoZSB2YWx1ZSBpbiB0aGUgb2Zmc2V0IHBhcnQgb2YgYQotLiAgICAgICAgICByZWxvY2F0aW5nIGZpZWxkIGlzIGdhcmJhZ2Ugc28gd2UgbmV2ZXIgdXNlIGl0LiBJbiB0aGlzIGNhc2UKLS4gICAgICAgICAgdGhlIG1hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gKn0KLS4gIGJmZF92bWEgc3JjX21hc2s7Ci0uCi0uICAgICAgIHsqIFRoZSBkc3RfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgcmVwbGFjZWQKLS4gICAgICAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24uIEluIG1vc3QgY2FzZXMgc3JjX21hc2sgPT0gZHN0X21hc2ssCi0uICAgICAgICAgIGV4Y2VwdCBpbiB0aGUgYWJvdmUgc3BlY2lhbCBjYXNlLCB3aGVyZSBkc3RfbWFzayB3b3VsZCBiZQotLiAgICAgICAgICAweDAwMDAwMGZmLCBhbmQgc3JjX21hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gICAqfQotLiAgYmZkX3ZtYSBkc3RfbWFzazsKLS4KLS4gICAgICAgeyogV2hlbiBzb21lIGZvcm1hdHMgY3JlYXRlIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucywgdGhleSBsZWF2ZQotLiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBjIG9mIHRoZSBwbGFjZSBiZWluZyByZWxvY2F0ZWQgaW4gdGhlIG9mZnNldAotLiAgICAgICAgICBzbG90IG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gdGhhdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gY2FuCi0uICAgICAgICAgIGJlIG1hZGUganVzdCBieSBhZGRpbmcgaW4gYW4gb3JkaW5hcnkgb2Zmc2V0IChlLmcuLCBzdW4zIGEub3V0KS4KLS4gICAgICAgICAgU29tZSBmb3JtYXRzIGxlYXZlIHRoZSBkaXNwbGFjZW1lbnQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbgotLiAgICAgICAgICBlbXB0eSAoZS5nLiwgbTg4ayBiY3MpOyB0aGlzIGZsYWcgc2lnbmFscyB0aGUgZmFjdC4qfQotLiAgYm9vbGVhbiBwY3JlbF9vZmZzZXQ7Ci0uCi0ufTsKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JVGhlIEhPV1RPIE1hY3JvCi0KLURFU0NSSVBUSU9OCi0JVGhlIEhPV1RPIGRlZmluZSBpcyBob3JyaWJsZSBhbmQgd2lsbCBnbyBhd2F5LgotCi0KLS4jZGVmaW5lIEhPV1RPKEMsIFIsUyxCLCBQLCBCSSwgTywgU0YsIE5BTUUsIElOUExBQ0UsIE1BU0tTUkMsIE1BU0tEU1QsIFBDKSBcCi0uICB7KHVuc2lnbmVkKUMsUixTLEIsIFAsIEJJLCBPLFNGLE5BTUUsSU5QTEFDRSxNQVNLU1JDLE1BU0tEU1QsUEN9Ci0KLURFU0NSSVBUSU9OCi0JQW5kIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG90YWxseSBtYWdpYyB3YXkuIEJ1dCBmb3IgdGhlCi0JbW9tZW50LCB3ZSBhcmUgY29tcGF0aWJsZSwgc28gZG8gaXQgdGhpcyB3YXkuCi0KLQotLiNkZWZpbmUgTkVXSE9XVE8oIEZVTkNUSU9OLCBOQU1FLFNJWkUsUkVMLElOKSBIT1dUTygwLDAsU0laRSwwLFJFTCwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsRlVOQ1RJT04sIE5BTUUsZmFsc2UsMCwwLElOKQotLgotCi1ERVNDUklQVElPTgotCVRoaXMgaXMgdXNlZCB0byBmaWxsIGluIGFuIGVtcHR5IGhvd3RvIGVudHJ5IGluIGFuIGFycmF5LgotCi0uI2RlZmluZSBFTVBUWV9IT1dUTyhDKSBcCi0uICBIT1dUTygoQyksMCwwLDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LE5VTEwsTlVMTCxmYWxzZSwwLDAsZmFsc2UpCi0uCi0KLURFU0NSSVBUSU9OCi0JSGVscGVyIHJvdXRpbmUgdG8gdHVybiBhIHN5bWJvbCBpbnRvIGEgcmVsb2NhdGlvbiB2YWx1ZS4KLQotLiNkZWZpbmUgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2wpICAgICAgXAotLiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgaWYgKHN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpIHsgICAgICAgICAgICAgXAotLiAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSB7IFwKLS4gICAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gICAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsgICAgICAgICAgICAgIFwKLS4gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS59Ci0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2Nfc2l6ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvX3R5cGUgKik7Ci0KLURFU0NSSVBUSU9OCi0JRm9yIGEgcmVsb2NfaG93dG9fdHlwZSB0aGF0IG9wZXJhdGVzIG9uIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLAotCXRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkIG9uLgotICovCi0KLXVuc2lnbmVkIGludAotYmZkX2dldF9yZWxvY19zaXplIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGNhc2UgMDogcmV0dXJuIDE7Ci0gICAgY2FzZSAxOiByZXR1cm4gMjsKLSAgICBjYXNlIDI6IHJldHVybiA0OwotICAgIGNhc2UgMzogcmV0dXJuIDA7Ci0gICAgY2FzZSA0OiByZXR1cm4gODsKLSAgICBjYXNlIDg6IHJldHVybiAxNjsKLSAgICBjYXNlIC0yOiByZXR1cm4gNDsKLSAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qCi1UWVBFREVGCi0JYXJlbGVudF9jaGFpbgotCi1ERVNDUklQVElPTgotCi0JSG93IHJlbG9jcyBhcmUgdGllZCB0b2dldGhlciBpbiBhbiA8PGFzZWN0aW9uPj46Ci0KLS50eXBlZGVmIHN0cnVjdCByZWxlbnRfY2hhaW4gewotLiAgYXJlbGVudCByZWxlbnQ7Ci0uICBzdHJ1Y3QgICByZWxlbnRfY2hhaW4gKm5leHQ7Ci0ufSBhcmVsZW50X2NoYWluOwotCi0qLwotCi0vKiBOX09ORVMgcHJvZHVjZXMgTiBvbmUgYml0cywgd2l0aG91dCBvdmVyZmxvd2luZyBtYWNoaW5lIGFyaXRobWV0aWMuICAqLwotI2RlZmluZSBOX09ORVMobikgKCgoKChiZmRfdm1hKSAxIDw8ICgobikgLSAxKSkgLSAxKSA8PCAxKSB8IDEpCi0KLS8qCi1GVU5DVElPTgotCWJmZF9jaGVja19vdmVyZmxvdwotCi1TWU5PUFNJUwotCWJmZF9yZWxvY19zdGF0dXNfdHlwZQotCQliZmRfY2hlY2tfb3ZlcmZsb3cKLQkJCShlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdywKLQkJCSB1bnNpZ25lZCBpbnQgYml0c2l6ZSwKLQkJCSB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCwKLQkJCSB1bnNpZ25lZCBpbnQgYWRkcnNpemUsCi0JCQkgYmZkX3ZtYSByZWxvY2F0aW9uKTsKLQotREVTQ1JJUFRJT04KLQlQZXJmb3JtIG92ZXJmbG93IGNoZWNraW5nIG9uIEB2YXJ7cmVsb2NhdGlvbn0gd2hpY2ggaGFzCi0JQHZhcntiaXRzaXplfSBzaWduaWZpY2FudCBiaXRzIGFuZCB3aWxsIGJlIHNoaWZ0ZWQgcmlnaHQgYnkKLQlAdmFye3JpZ2h0c2hpZnR9IGJpdHMsIG9uIGEgbWFjaGluZSB3aXRoIGFkZHJlc3NlcyBjb250YWluaW5nCi0JQHZhcnthZGRyc2l6ZX0gc2lnbmlmaWNhbnQgYml0cy4gIFRoZSByZXN1bHQgaXMgZWl0aGVyIG9mCi0JQGNvZGV7YmZkX3JlbG9jX29rfSBvciBAY29kZXtiZmRfcmVsb2Nfb3ZlcmZsb3d9LgotCi0qLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9jaGVja19vdmVyZmxvdyAoaG93LCBiaXRzaXplLCByaWdodHNoaWZ0LCBhZGRyc2l6ZSwgcmVsb2NhdGlvbikKLSAgICAgZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3c7Ci0gICAgIHVuc2lnbmVkIGludCBiaXRzaXplOwotICAgICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdDsKLSAgICAgdW5zaWduZWQgaW50IGFkZHJzaXplOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci17Ci0gIGJmZF92bWEgZmllbGRtYXNrLCBhZGRybWFzaywgc2lnbm1hc2ssIHNzLCBhOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLQotICBhID0gcmVsb2NhdGlvbjsKLQotICAvKiBOb3RlOiBCSVRTSVpFIHNob3VsZCBhbHdheXMgYmUgPD0gQUREUlNJWkUsIGJ1dCBpbiBjYXNlIGl0J3Mgbm90LAotICAgICB3ZSdsbCBiZSBwZXJtaXNzaXZlOiBleHRyYSBiaXRzIGluIHRoZSBmaWVsZCBtYXNrIHdpbGwKLSAgICAgYXV0b21hdGljYWxseSBleHRlbmQgdGhlIGFkZHJlc3MgbWFzayBmb3IgcHVycG9zZXMgb2YgdGhlCi0gICAgIG92ZXJmbG93IGNoZWNrLiAgKi8KLSAgZmllbGRtYXNrID0gTl9PTkVTIChiaXRzaXplKTsKLSAgYWRkcm1hc2sgPSBOX09ORVMgKGFkZHJzaXplKSB8IGZpZWxkbWFzazsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd19kb250OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLSAgICAgIC8qIElmIGFueSBzaWduIGJpdHMgYXJlIHNldCwgYWxsIHNpZ24gYml0cyBtdXN0IGJlIHNldC4gIFRoYXQKLSAgICAgICAgIGlzLCBBIG11c3QgYmUgYSB2YWxpZCBuZWdhdGl2ZSBhZGRyZXNzIGFmdGVyIHNoaWZ0aW5nLiAgKi8KLSAgICAgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotICAgICAgc2lnbm1hc2sgPSB+IChmaWVsZG1hc2sgPj4gMSk7Ci0gICAgICBzcyA9IGEgJiBzaWdubWFzazsKLSAgICAgIGlmIChzcyAhPSAwICYmIHNzICE9ICgoYWRkcm1hc2sgPj4gcmlnaHRzaGlmdCkgJiBzaWdubWFzaykpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLSAgICAgIC8qIFdlIGhhdmUgYW4gb3ZlcmZsb3cgaWYgdGhlIGFkZHJlc3MgZG9lcyBub3QgZml0IGluIHRoZSBmaWVsZC4gICovCi0gICAgICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKLSAgICAgIGlmICgoYSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0gICAgICAvKiBCaXRmaWVsZHMgYXJlIHNvbWV0aW1lcyBzaWduZWQsIHNvbWV0aW1lcyB1bnNpZ25lZC4gIFdlCi0gICAgICAgICBvdmVyZmxvdyBpZiB0aGUgdmFsdWUgaGFzIHNvbWUsIGJ1dCBub3QgYWxsLCBiaXRzIHNldCBvdXRzaWRlCi0gICAgICAgICB0aGUgZmllbGQsIG9yIGlmIGl0IGhhcyBhbnkgYml0cyBzZXQgb3V0c2lkZSB0aGUgZmllbGQgYnV0Ci0gICAgICAgICB0aGUgc2lnbiBiaXQgaXMgbm90IHNldC4gICovCi0gICAgICBhID4+PSByaWdodHNoaWZ0OwotICAgICAgaWYgKChhICYgfiBmaWVsZG1hc2spICE9IDApCi0JewotCSAgc2lnbm1hc2sgPSAoZmllbGRtYXNrID4+IDEpICsgMTsKLQkgIHNzID0gKHNpZ25tYXNrIDw8IHJpZ2h0c2hpZnQpIC0gMTsKLQkgIGlmICgoc3MgfCByZWxvY2F0aW9uKSAhPSB+IChiZmRfdm1hKSAwKQotCSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgotCi1TWU5PUFNJUwotCWJmZF9yZWxvY19zdGF0dXNfdHlwZQotICAgICAgICAgICAgICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJIGNoYXIgKiplcnJvcl9tZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQlJZiBAdmFye291dHB1dF9iZmR9IGlzIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24sIHRoZQotCWdlbmVyYXRlZCBpbWFnZSB3aWxsIGJlIHJlbG9jYXRhYmxlOyB0aGUgcmVsb2NhdGlvbnMgYXJlCi0JY29waWVkIHRvIHRoZSBvdXRwdXQgZmlsZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkIHRvCi0JcmVmbGVjdCB0aGUgbmV3IHN0YXRlIG9mIHRoZSB3b3JsZC4gVGhlcmUgYXJlIHR3byB3YXlzIG9mCi0JcmVmbGVjdGluZyB0aGUgcmVzdWx0cyBvZiBwYXJ0aWFsIGxpbmthZ2UgaW4gYW4gb3V0cHV0IGZpbGU6Ci0JYnkgbW9kaWZ5aW5nIHRoZSBvdXRwdXQgZGF0YSBpbiBwbGFjZSwgYW5kIGJ5IG1vZGlmeWluZyB0aGUKLQlyZWxvY2F0aW9uIHJlY29yZC4gIFNvbWUgbmF0aXZlIGZvcm1hdHMgKGUuZy4sIGJhc2ljIGEub3V0IGFuZAotCWJhc2ljIGNvZmYpIGhhdmUgbm8gd2F5IG9mIHNwZWNpZnlpbmcgYW4gYWRkZW5kIGluIHRoZQotCXJlbG9jYXRpb24gdHlwZSwgc28gdGhlIGFkZGVuZCBoYXMgdG8gZ28gaW4gdGhlIG91dHB1dCBkYXRhLgotCVRoaXMgaXMgbm8gYmlnIGRlYWwgc2luY2UgaW4gdGhlc2UgZm9ybWF0cyB0aGUgb3V0cHV0IGRhdGEKLQlzbG90IHdpbGwgYWx3YXlzIGJlIGJpZyBlbm91Z2ggZm9yIHRoZSBhZGRlbmQuIENvbXBsZXggcmVsb2MKLQl0eXBlcyB3aXRoIGFkZGVuZHMgd2VyZSBpbnZlbnRlZCB0byBzb2x2ZSBqdXN0IHRoaXMgcHJvYmxlbS4KLQlUaGUgQHZhcntlcnJvcl9tZXNzYWdlfSBhcmd1bWVudCBpcyBzZXQgdG8gYW4gZXJyb3IgbWVzc2FnZSBpZgotCXRoaXMgcmV0dXJuIEBjb2Rle2JmZF9yZWxvY19kYW5nZXJvdXN9LgotCi0qLwotCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLQotICBzeW1ib2wgPSAqKHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0cik7Ci0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCByZXR1cm4gYW4gZXJyb3IgaWYKLSAgICAgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZC4gIEFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbCBpcwotICAgICBjb25zaWRlcmVkIHRvIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvIChTVlI0IEFCSSwgcC4gNC0yNykuICAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGVyZSBpcyBhIGZ1bmN0aW9uIHN1cHBsaWVkIHRvIGhhbmRsZSB0aGlzIHJlbG9jYXRpb24gdHlwZSwKLSAgICAgY2FsbCBpdC4gIEl0J2xsIHJldHVybiBgYmZkX3JlbG9jX2NvbnRpbnVlJyBpZiBmdXJ0aGVyIHByb2Nlc3NpbmcKLSAgICAgY2FuIGJlIGRvbmUuICAqLwotICBpZiAoaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24pCi0gICAgewotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvbnQ7Ci0gICAgICBjb250ID0gaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJCQkgICAgICBlcnJvcl9tZXNzYWdlKTsKLSAgICAgIGlmIChjb250ICE9IGJmZF9yZWxvY19jb250aW51ZSkKLQlyZXR1cm4gY29udDsKLSAgICB9Ci0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLQotICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAmJiBob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIG91dHB1dF9iYXNlID0gMDsKLSAgZWxzZQotICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04KLQkgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgdGhlCi0JIGxvY2F0aW9uLiAgUkVMT0NBVElPTiBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuCi0KLQkgV2Ugc3RhcnQgYnkgc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZwotCSB0aGUgbG9jYXRpb24uCi0KLQkgSWYgcGNyZWxfb2Zmc2V0IGlzIHNldCwgd2UgbXVzdCBmdXJ0aGVyIHN1YnRyYWN0IHRoZSBwb3NpdGlvbgotCSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgU29tZSB0YXJnZXRzIGFycmFuZ2UgZm9yCi0JIHRoZSBhZGRlbmQgdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb24KLQkgd2l0aGluIHRoZSBzZWN0aW9uOyBmb3IgZXhhbXBsZSwgaTM4Ni1hb3V0IGRvZXMgdGhpcy4gIEZvcgotCSBpMzg2LWFvdXQsIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIFNvbWUgb3RoZXIgdGFyZ2V0cyBkbyBub3QKLQkgaW5jbHVkZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uOyBmb3IgZXhhbXBsZSwgbTg4a2JjcywKLQkgb3IgRUxGLiAgRm9yIHRob3NlIHRhcmdldHMsIHBjcmVsX29mZnNldCBpcyB0cnVlLgotCi0JIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlbiB3ZSBtdXN0IGVuc3VyZQotCSB0aGF0IHRoaXMgcmVsb2Mgd2lsbCBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiB0aGUgZmluYWwKLQkgcmVsb2NhdGlvbiBpcyBkb25lLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIHdhbnQgdG8gd2luZAotCSB1cCB3aXRoIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLAotCSB3aGljaCBtZWFucyB3ZSBtdXN0IGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGJ5IHRoZSBjaGFuZ2UKLQkgaW4gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIElmIHBjcmVsX29mZnNldCBpcyB0cnVlCi0JIHdlIGRvIG5vdCB3YW50IHRvIGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGF0IGFsbC4KLQotCSBGSVhNRTogVGhpcyBzZWVtcyBsb2dpY2FsIHRvIG1lLCBidXQgZm9yIHRoZSBjYXNlIG9mCi0JIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0IGl0IGlzIG5vdCB3aGF0IHRoZSBjb2RlCi0JIGFjdHVhbGx5IGRvZXMuICBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IHNlZW1zCi0JIGZhciB0b28gbGlrZWx5IHRoYXQgc29tZXRoaW5nIHdpbGwgYnJlYWsuICAqLwotCi0gICAgICByZWxvY2F0aW9uIC09Ci0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUpCi0JcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JICAgICB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLiBNb2RpZnkgdGhlIHJlbG9jCi0JICAgICBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0JICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICByZXR1cm4gZmxhZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYnV0IGlucGxhY2UsIHNvIG1vZGlmeSB0aGUKLQkgICAgIHJlbG9jIHJlY29yZCBhIGJpdC4KLQotCSAgICAgSWYgd2UndmUgcmVsb2NhdGVkIHdpdGggYSBzeW1ib2wgd2l0aCBhIHNlY3Rpb24sIGNoYW5nZQotCSAgICAgaW50byBhIHJlZiB0byB0aGUgc2VjdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHN5bWJvbC4gICovCi0KLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLQkgIC8qIFdURj8/ICovCi0JICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgIT0gMAotCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgInhjb2ZmLXBvd2VybWFjIikgIT0gMAotCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtbGl0dGxlIikgIT0gMAotCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtYmlnIikgIT0gMCkKLQkgICAgewotI2lmIDEKLQkgICAgICAvKiBGb3IgbTY4ay1jb2ZmLCB0aGUgYWRkZW5kIHdhcyBiZWluZyBzdWJ0cmFjdGVkIHR3aWNlIGR1cmluZwotCQkgcmVsb2NhdGlvbiB3aXRoIC1yLiAgUmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3cgdGhpcyBjb21tZW50Ci0JCSBmaXhlcyB0aGF0IHByb2JsZW07IHNlZSBQUiAyOTUzLgotCi1Ib3dldmVyLCBJYW4gd3JvdGUgdGhlIGZvbGxvd2luZywgcmVnYXJkaW5nIHJlbW92aW5nIHRoZSBsaW5lIGJlbG93LAotd2hpY2ggZXhwbGFpbnMgd2h5IGl0IGlzIHN0aWxsIGVuYWJsZWQ6ICAtLWRqbQotCi1JZiB5b3UgcHV0IGEgcGF0Y2ggbGlrZSB0aGF0IGludG8gQkZEIHlvdSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgQ09GRgotbGlua2Vycy4gIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCBwYXRjaCB3aWxsIGJyZWFrIGNvZmYtaTM4NiAoZS5nLiwKLVNDTyk7IHNlZSBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMgd2hlcmUgSSB3b3JrZWQgYXJvdW5kIHRoZQotcHJvYmxlbSBpbiBhIGRpZmZlcmVudCB3YXkuICBUaGVyZSBtYXkgdmVyeSB3ZWxsIGJlIGEgcmVhc29uIHRoYXQgdGhlCi1jb2RlIHdvcmtzIGFzIGl0IGRvZXMuCi0KLUhtbW0uICBUaGUgZmlyc3Qgb2J2aW91cyBwb2ludCBpcyB0aGF0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gc2hvdWxkCi1ub3QgaGF2ZSBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgZmxhdm91ci4gIEl0J3Mgc2VlbSBsaWtlCi1lbnRpcmVseSB0aGUgd3JvbmcgcGxhY2UgZm9yIHN1Y2ggYSB0aGluZy4gIFRoZSBzZWNvbmQgb2J2aW91cyBwb2ludAotaXMgdGhhdCB0aGUgY3VycmVudCBjb2RlIGlnbm9yZXMgdGhlIHJlbG9jIGFkZGVuZCB3aGVuIHByb2R1Y2luZwotcmVsb2NhdGVhYmxlIG91dHB1dCBmb3IgQ09GRi4gIFRoYXQncyBwZWN1bGlhci4gIEluIGZhY3QsIEkgcmVhbGx5Ci1oYXZlIG5vIGlkZWEgd2hhdCB0aGUgcG9pbnQgb2YgdGhlIGxpbmUgeW91IHdhbnQgdG8gcmVtb3ZlIGlzLgotCi1BIHR5cGljYWwgQ09GRiByZWxvYyBzdWJ0cmFjdHMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBhZGRzIGluCi10aGUgbmV3IHZhbHVlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUgKGlmIGl0J3MgYSBwYwotcmVsYXRpdmUgcmVsb2MgaXQgYWRkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZQotbG9jYXRpb24pLiAgV2hlbiByZWxvY2F0aW5nIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCBwcm9wZXJ0eS4KLQotQkZEIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBhZGRlbmQgdG8gdGhlIG5lZ2F0aXZlIG9mIHRoZSBvbGQKLXZhbHVlIG9mIHRoZSBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5IGl0IGhhbmRsZXMgY29tbW9uIHN5bWJvbHMgaW4gYQotbm9uLXN0YW5kYXJkIHdheSAoaXQgZG9lc24ndCBzdWJ0cmFjdCB0aGUgb2xkIHZhbHVlKSBidXQgdGhhdCdzIGEKLWRpZmZlcmVudCBzdG9yeSAod2UgY2FuJ3QgY2hhbmdlIGl0IHdpdGhvdXQgbG9zaW5nIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5IHdpdGggb2xkIG9iamVjdCBmaWxlcykgKGNvZmYtaTM4NiBkb2VzIHN1YnRyYWN0IHRoZSBvbGQKLXZhbHVlLCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgY29mZi1pMzg2IHRhcmdldHMsIGxpa2UgU0NPKS4KLQotU28gZXZlcnl0aGluZyB3b3JrcyBmaW5lIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgV2hlbgotd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBsb2dpY2FsbHkgd2Ugc2hvdWxkIGRvIGV4YWN0bHkKLXdoYXQgd2UgZG8gd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGVyZWZvcmUsIHlvdXIKLXBhdGNoIGlzIGNvcnJlY3QuICBJbiBmYWN0LCBpdCBzaG91bGQgcHJvYmFibHkgYWx3YXlzIGp1c3Qgc2V0Ci1yZWxvY19lbnRyeS0+YWRkZW5kIHRvIDAgZm9yIGFsbCBjYXNlcywgc2luY2UgaXQgaXMsIGluIGZhY3QsIGdvaW5nIHRvCi1hZGQgdGhlIHZhbHVlIGludG8gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyB3b24ndCBodXJ0IHRoZSBDT0ZGIGNvZGUsCi13aGljaCBkb2Vzbid0IHVzZSB0aGUgYWRkZW5kOyBJJ20gbm90IHN1cmUgd2hhdCBpdCB3aWxsIGRvIHRvIG90aGVyCi1mb3JtYXRzICh0aGUgdGhpbmcgdG8gY2hlY2sgZm9yIHdvdWxkIGJlIHdoZXRoZXIgYW55IGZvcm1hdHMgYm90aCB1c2UKLXRoZSBhZGRlbmQgYW5kIHNldCBwYXJ0aWFsX2lucGxhY2UpLgotCi1XaGVuIEkgd2FudGVkIHRvIG1ha2UgY29mZi1pMzg2IHByb2R1Y2UgcmVsb2NhdGVhYmxlIG91dHB1dCwgSSByYW4KLWludG8gdGhlIHByb2JsZW0gdGhhdCB5b3UgYXJlIHJ1bm5pbmcgaW50bzogSSB3YW50ZWQgdG8gcmVtb3ZlIHRoYXQKLWxpbmUuICBSYXRoZXIgdGhhbiByaXNrIGl0LCBJIG1hZGUgdGhlIGNvZmYtaTM4NiByZWxvY3MgdXNlIGEgc3BlY2lhbAotZnVuY3Rpb247IGl0J3MgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jLiAgVGhlIGZ1bmN0aW9uCi1zcGVjaWZpY2FsbHkgYWRkcyB0aGUgYWRkZW5kIGZpZWxkIGludG8gdGhlIG9iamVjdCBmaWxlLCBrbm93aW5nIHRoYXQKLWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgbm90IGdvaW5nIHRvLiAgSWYgeW91IHJlbW92ZSB0aGF0IGxpbmUsIHRoZW4KLWNvZmYtaTM4Ni5jIHdpbGwgd2luZCB1cCBhZGRpbmcgdGhlIGFkZGVuZCBmaWVsZCBpbiB0d2ljZS4gIEl0J3MKLXRyaXZpYWwgdG8gZml4OyBpdCBqdXN0IG5lZWRzIHRvIGJlIGRvbmUuCi0KLVRoZSBwcm9ibGVtIHdpdGggcmVtb3ZpbmcgdGhlIGxpbmUgaXMganVzdCB0aGF0IGl0IG1heSBicmVhayBzb21lCi13b3JraW5nIGNvZGUuICBXaXRoIEJGRCBpdCdzIGhhcmQgdG8gYmUgc3VyZSBvZiBhbnl0aGluZy4gIFRoZSByaWdodAotd2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzIHNpbXBseSB0byBidWlsZCBhbmQgdGVzdCBhdCBsZWFzdCBhbGwgdGhlCi1zdXBwb3J0ZWQgQ09GRiB0YXJnZXRzLiAgSXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBpZiB0aW1lIGFuZCBkaXNrCi1zcGFjZSBjb25zdW1pbmcuICBGb3IgZWFjaCB0YXJnZXQ6Ci0gICAgMSkgYnVpbGQgdGhlIGxpbmtlcgotICAgIDIpIGdlbmVyYXRlIHNvbWUgZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgdXNpbmcgLXIgKEkgd291bGQKLSAgICAgICBwcm9iYWJseSB1c2UgcGFyYW5vaWEubyBhbmQgbGluayBhZ2FpbnN0IG5ld2xpYi9saWJjLmEsIHdoaWNoCi0gICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHRhcmdldHMgd291bGQgYmUgYXZhaWxhYmxlIGluCi0gICAgICAgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvSC1ob3N0L3RhcmdldC9saWIvbGliYy5hKS4KLSAgICAzKSBtYWtlIHRoZSBjaGFuZ2UgdG8gcmVsb2MuYwotICAgIDQpIHJlYnVpbGQgdGhlIGxpbmtlcgotICAgIDUpIHJlcGVhdCBzdGVwIDIKLSAgICA2KSBpZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlcyBhcmUgdGhlIHNhbWUsIHlvdSBoYXZlIGF0IGxlYXN0Ci0gICAgICAgbWFkZSBpdCBubyB3b3JzZQotICAgIDcpIGlmIHRoZXkgYXJlIGRpZmZlcmVudCB5b3UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoaWNoIHZlcnNpb24gaXMKLSAgICAgICByaWdodAotKi8KLQkgICAgICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBUaGlzIG92ZXJmbG93IGNoZWNraW5nIGlzIGluY29tcGxldGUsIGJlY2F1c2UgdGhlIHZhbHVlCi0gICAgIG1pZ2h0IGhhdmUgb3ZlcmZsb3dlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuICBGb3IgYSBjb3JyZWN0IGNoZWNrIHdlCi0gICAgIG5lZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgaW4gYSBzaXplIGxhcmdlciB0aGFuIGJpdHNpemUsIGJ1dCB3ZQotICAgICBjYW4ndCByZWFzb25hYmx5IGRvIHRoYXQgZm9yIGEgcmVsb2MgdGhlIHNhbWUgc2l6ZSBhcyBhIGhvc3QKLSAgICAgbWFjaGluZSB3b3JkLgotICAgICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gZG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gdGhlIHJlc3VsdCBhZnRlcgotICAgICBhZGRpbmcgaW4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQKLSAgICAgICYmIGZsYWcgPT0gYmZkX3JlbG9jX29rKQotICAgIGZsYWcgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCSAgICAgICBob3d0by0+Yml0c2l6ZSwKLQkJCSAgICAgICBob3d0by0+cmlnaHRzaGlmdCwKLQkJCSAgICAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKSwKLQkJCSAgICAgICByZWxvY2F0aW9uKTsKLQotICAvKgotICAgIEVpdGhlciB3ZSBhcmUgcmVsb2NhdGluZyBhbGwgdGhlIHdheSwgb3Igd2UgZG9uJ3Qgd2FudCB0byBhcHBseQotICAgIHRoZSByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSAocHJvYmFibHkgYmVjYXVzZSB0aGVyZSBpc24ndAotICAgIGFueSByb29tIGluIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGRlc2NyaWJlIGFkZGVuZHMgdG8gcmVsb2NzKQotICAgICovCi0KLSAgLyogVGhlIGNhc3QgdG8gYmZkX3ZtYSBhdm9pZHMgYSBidWcgaW4gdGhlIEFscGhhIE9TRi8xIEMgY29tcGlsZXIKLSAgICAgKE9TRiB2ZXJzaW9uIDEuMywgY29tcGlsZXIgdmVyc2lvbiAzLjExKS4gIEl0IG1pc2NvbXBpbGVzIHRoZQotICAgICBmb2xsb3dpbmcgcHJvZ3JhbToKLQotICAgICBzdHJ1Y3Qgc3RyCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBpbnQgaTA7Ci0gICAgIH0gcyA9IHsgMCB9OwotCi0gICAgIGludAotICAgICBtYWluICgpCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIHg7Ci0KLSAgICAgICB4ID0gMHgxMDAwMDAwMDA7Ci0gICAgICAgeCA8PD0gKHVuc2lnbmVkIGxvbmcpIHMuaTA7Ci0gICAgICAgaWYgKHggPT0gMCkKLQkgcHJpbnRmICgiZmFpbGVkXG4iKTsKLSAgICAgICBlbHNlCi0JIHByaW50ZiAoInN1Y2NlZWRlZCAoJWx4KVxuIiwgeCk7Ci0gICAgIH0KLSAgICAgKi8KLQotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKLQotICAvKiBXYWl0IGZvciB0aGUgZGF5IHdoZW4gYWxsIGhhdmUgdGhlIG1hc2sgaW4gdGhlbSAqLwotCi0gIC8qIFdoYXQgd2UgZG86Ci0gICAgIGkgaW5zdHJ1Y3Rpb24gdG8gYmUgbGVmdCBhbG9uZQotICAgICBvIG9mZnNldCB3aXRoaW4gaW5zdHJ1Y3Rpb24KLSAgICAgciByZWxvY2F0aW9uIG9mZnNldCB0byBhcHBseQotICAgICBTIHNyYyBtYXNrCi0gICAgIEQgZHN0IG1hc2sKLSAgICAgTiB+ZHN0IG1hc2sKLSAgICAgQSBwYXJ0IDEKLSAgICAgQiBwYXJ0IDIKLSAgICAgUiByZXN1bHQKLQotICAgICBEbyB0aGlzOgotICAgICBpIGkgaSBpIGkgbyBvIG8gbyBvICAgICAgICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgICAgICAgICBTIFMgUyBTIFMgICAgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByICB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgQSBBIEEgQSBBCi0gICAgIEFuZCB0aGlzOgotICAgICAuLi4gICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgTiBOIE4gTiBOICAgICAgICAgICAgZ2V0IGluc3RydWN0aW9uCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIC4uLiAgIEIgQiBCIEIgQgotCi0gICAgIEFuZCB0aGVuOgotICAgICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICAgIEEgQSBBIEEgQQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBSIFIgUiBSIFIgUiBSIFIgUiBSICAgICAgICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGNoYXIgKikgZGF0YSArIGFkZHIpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfOCAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICB7Ci0Jc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAtMToKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzE2IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBEbyBub3RoaW5nICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSNpZmRlZiBCRkQ2NAotICAgICAgewotCWJmZF92bWEgeCA9IGJmZF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF82NCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgfQotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfaW5zdGFsbF9yZWxvY2F0aW9uCi0KLVNZTk9QU0lTCi0JYmZkX3JlbG9jX3N0YXR1c190eXBlCi0gICAgICAgICAgICAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwgYmZkX3ZtYSBkYXRhX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJIGNoYXIgKiplcnJvcl9tZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQlUaGlzIGxvb2tzIHJlbWFya2FibHkgbGlrZSA8PGJmZF9wZXJmb3JtX3JlbG9jYXRpb24+PiwgZXhjZXB0IGl0Ci0JZG9lcyBub3QgZXhwZWN0IHRoYXQgdGhlIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIGZpbGxlZCBpbi4KLQlJLmUuLCBpdCdzIHN1aXRhYmxlIGZvciB1c2Ugd2hlbiBjcmVhdGluZywgcmF0aGVyIHRoYW4gYXBwbHlpbmcKLQlhIHJlbG9jYXRpb24uCi0KLQlGb3Igbm93LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIHJlc2VydmVkIGZvciB0aGUKLQlhc3NlbWJsZXIuCi0KLSovCi0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgZGF0YV9zdGFydCwgZGF0YV9zdGFydF9vZmZzZXQsCi0JCQlpbnB1dF9zZWN0aW9uLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBQVFIgZGF0YV9zdGFydDsKLSAgICAgYmZkX3ZtYSBkYXRhX3N0YXJ0X29mZnNldDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBhc3ltYm9sICpzeW1ib2w7Ci0gIGJmZF9ieXRlICpkYXRhOwotCi0gIHN5bWJvbCA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBmdW5jdGlvbiBzdXBwbGllZCB0byBoYW5kbGUgdGhpcyByZWxvY2F0aW9uIHR5cGUsCi0gICAgIGNhbGwgaXQuICBJdCdsbCByZXR1cm4gYGJmZF9yZWxvY19jb250aW51ZScgaWYgZnVydGhlciBwcm9jZXNzaW5nCi0gICAgIGNhbiBiZSBkb25lLiAgKi8KLSAgaWYgKGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uKQotICAgIHsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb250OwotICAKLSAgICAgIC8qIFhYWCAtIFRoZSBzcGVjaWFsX2Z1bmN0aW9uIGNhbGxzIGhhdmVuJ3QgYmVlbiBmaXhlZCB1cCB0byBkZWFsCi0JIHdpdGggY3JlYXRpbmcgbmV3IHJlbG9jYXRpb25zIGFuZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGNvbnQgPSBob3d0by0+c3BlY2lhbF9mdW5jdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwKLQkJCQkgICAgICAvKiBYWFggLSBOb24tcG9ydGFibGUhICovCi0JCQkJICAgICAgKChiZmRfYnl0ZSAqKSBkYXRhX3N0YXJ0Ci0JCQkJICAgICAgIC0gZGF0YV9zdGFydF9vZmZzZXQpLAotCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIGFiZmQsIGVycm9yX21lc3NhZ2UpOwotICAgICAgaWYgKGNvbnQgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQotCXJldHVybiBjb250OwotICAgIH0KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICBXZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OCi0JIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYW5kIHRoZQotCSBsb2NhdGlvbi4gIFJFTE9DQVRJT04gaXMgYWxyZWFkeSB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLgotCi0JIFdlIHN0YXJ0IGJ5IHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcKLQkgdGhlIGxvY2F0aW9uLgotCi0JIElmIHBjcmVsX29mZnNldCBpcyBzZXQsIHdlIG11c3QgZnVydGhlciBzdWJ0cmFjdCB0aGUgcG9zaXRpb24KLQkgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFNvbWUgdGFyZ2V0cyBhcnJhbmdlIGZvcgotCSB0aGUgYWRkZW5kIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uCi0JIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIGV4YW1wbGUsIGkzODYtYW91dCBkb2VzIHRoaXMuICBGb3IKLQkgaTM4Ni1hb3V0LCBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBTb21lIG90aGVyIHRhcmdldHMgZG8gbm90Ci0JIGluY2x1ZGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbjsgZm9yIGV4YW1wbGUsIG04OGtiY3MsCi0JIG9yIEVMRi4gIEZvciB0aG9zZSB0YXJnZXRzLCBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4KLQotCSBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZW4gd2UgbXVzdCBlbnN1cmUKLQkgdGhhdCB0aGlzIHJlbG9jIHdpbGwgYmUgY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gdGhlIGZpbmFsCi0JIHJlbG9jYXRpb24gaXMgZG9uZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSB3YW50IHRvIHdpbmQKLQkgdXAgd2l0aCB0aGUgbmVnYXRpdmUgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwKLQkgd2hpY2ggbWVhbnMgd2UgbXVzdCBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBieSB0aGUgY2hhbmdlCi0JIGluIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBJZiBwY3JlbF9vZmZzZXQgaXMgdHJ1ZQotCSB3ZSBkbyBub3Qgd2FudCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBhdCBhbGwuCi0KLQkgRklYTUU6IFRoaXMgc2VlbXMgbG9naWNhbCB0byBtZSwgYnV0IGZvciB0aGUgY2FzZSBvZgotCSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBpdCBpcyBub3Qgd2hhdCB0aGUgY29kZQotCSBhY3R1YWxseSBkb2VzLiAgSSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBzZWVtcwotCSBmYXIgdG9vIGxpa2VseSB0aGF0IHNvbWV0aGluZyB3aWxsIGJyZWFrLiAgKi8KLQotICAgICAgcmVsb2NhdGlvbiAtPQotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCA9PSB0cnVlICYmIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUgcmVsb2NhdGlvbgotCSB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLiBNb2RpZnkgdGhlIHJlbG9jCi0JIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBmbGFnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGJ1dCBpbnBsYWNlLCBzbyBtb2RpZnkgdGhlCi0JIHJlbG9jIHJlY29yZCBhIGJpdC4KLQotCSBJZiB3ZSd2ZSByZWxvY2F0ZWQgd2l0aCBhIHN5bWJvbCB3aXRoIGEgc2VjdGlvbiwgY2hhbmdlCi0JIGludG8gYSByZWYgdG8gdGhlIHNlY3Rpb24gYmVsb25naW5nIHRvIHRoZSBzeW1ib2wuICAqLwotCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICAvKiBXVEY/PyAqLwotICAgICAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgIT0gMAotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAieGNvZmYtcG93ZXJtYWMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWxpdHRsZSIpICE9IDAKLQkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtYmlnIikgIT0gMCkKLQl7Ci0jaWYgMQotLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLSAgIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotICAgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQl9Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBUaGlzIG92ZXJmbG93IGNoZWNraW5nIGlzIGluY29tcGxldGUsIGJlY2F1c2UgdGhlIHZhbHVlCi0gICAgIG1pZ2h0IGhhdmUgb3ZlcmZsb3dlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuICBGb3IgYSBjb3JyZWN0IGNoZWNrIHdlCi0gICAgIG5lZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgaW4gYSBzaXplIGxhcmdlciB0aGFuIGJpdHNpemUsIGJ1dCB3ZQotICAgICBjYW4ndCByZWFzb25hYmx5IGRvIHRoYXQgZm9yIGEgcmVsb2MgdGhlIHNhbWUgc2l6ZSBhcyBhIGhvc3QKLSAgICAgbWFjaGluZSB3b3JkLgotICAgICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gZG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gdGhlIHJlc3VsdCBhZnRlcgotICAgICBhZGRpbmcgaW4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgZmxhZyA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAotCQkJICAgICAgIGhvd3RvLT5iaXRzaXplLAotCQkJICAgICAgIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJICAgICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpLAotCQkJICAgICAgIHJlbG9jYXRpb24pOwotCi0gIC8qCi0gICAgRWl0aGVyIHdlIGFyZSByZWxvY2F0aW5nIGFsbCB0aGUgd2F5LCBvciB3ZSBkb24ndCB3YW50IHRvIGFwcGx5Ci0gICAgdGhlIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGlzbid0Ci0gICAgYW55IHJvb20gaW4gdGhlIG91dHB1dCBmb3JtYXQgdG8gZGVzY3JpYmUgYWRkZW5kcyB0byByZWxvY3MpCi0gICAgKi8KLQotICAvKiBUaGUgY2FzdCB0byBiZmRfdm1hIGF2b2lkcyBhIGJ1ZyBpbiB0aGUgQWxwaGEgT1NGLzEgQyBjb21waWxlcgotICAgICAoT1NGIHZlcnNpb24gMS4zLCBjb21waWxlciB2ZXJzaW9uIDMuMTEpLiAgSXQgbWlzY29tcGlsZXMgdGhlCi0gICAgIGZvbGxvd2luZyBwcm9ncmFtOgotCi0gICAgIHN0cnVjdCBzdHIKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGludCBpMDsKLSAgICAgfSBzID0geyAwIH07Ci0KLSAgICAgaW50Ci0gICAgIG1haW4gKCkKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKLQotICAgICAgIHggPSAweDEwMDAwMDAwMDsKLSAgICAgICB4IDw8PSAodW5zaWduZWQgbG9uZykgcy5pMDsKLSAgICAgICBpZiAoeCA9PSAwKQotCSBwcmludGYgKCJmYWlsZWRcbiIpOwotICAgICAgIGVsc2UKLQkgcHJpbnRmICgic3VjY2VlZGVkICglbHgpXG4iLCB4KTsKLSAgICAgfQotICAgICAqLwotCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIFdhaXQgZm9yIHRoZSBkYXkgd2hlbiBhbGwgaGF2ZSB0aGUgbWFzayBpbiB0aGVtICovCi0KLSAgLyogV2hhdCB3ZSBkbzoKLSAgICAgaSBpbnN0cnVjdGlvbiB0byBiZSBsZWZ0IGFsb25lCi0gICAgIG8gb2Zmc2V0IHdpdGhpbiBpbnN0cnVjdGlvbgotICAgICByIHJlbG9jYXRpb24gb2Zmc2V0IHRvIGFwcGx5Ci0gICAgIFMgc3JjIG1hc2sKLSAgICAgRCBkc3QgbWFzawotICAgICBOIH5kc3QgbWFzawotICAgICBBIHBhcnQgMQotICAgICBCIHBhcnQgMgotICAgICBSIHJlc3VsdAotCi0gICAgIERvIHRoaXM6Ci0gICAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gICAgICAgIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUyAgICB0byBnZXQgdGhlIHNpemUgb2Zmc2V0IHdlIHdhbnQKLSAgICAgKyAgIHIgciByIHIgciByIHIgciByIHIgIHRvIGdldCB0aGUgZmluYWwgdmFsdWUgdG8gcGxhY2UKLSAgICAgYW5kICAgICAgICAgICBEIEQgRCBEIEQgIHRvIGNob3AgdG8gcmlnaHQgc2l6ZQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgIC4uLiAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICBOIE4gTiBOIE4gICAgICAgICAgICBnZXQgaW5zdHJ1Y3Rpb24KLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgLi4uICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgIEIgQiBCIEIgQgotICAgICBvciAgICAgICAgICAgICAgQSBBIEEgQSBBCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIFIgUiBSIFIgUiBSIFIgUiBSIFIgICAgICAgIHB1dCBpbnRvIGJmZF9wdXQ8c2l6ZT4KLSAgICAgKi8KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICggKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGRhdGFfc3RhcnQgKyAoYWRkciAtIGRhdGFfc3RhcnRfb2Zmc2V0KTsKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0JY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCAoY2hhciAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzggKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICB7Ci0Jc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzE2IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAtMjoKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogRG8gbm90aGluZyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICB7Ci0JYmZkX3ZtYSB4ID0gYmZkX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfNjQgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotICAgIH0KLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyogVGhpcyByZWxvY2F0aW9uIHJvdXRpbmUgaXMgdXNlZCBieSBzb21lIG9mIHRoZSBiYWNrZW5kIGxpbmtlcnMuCi0gICBUaGV5IGRvIG5vdCBjb25zdHJ1Y3QgYXN5bWJvbCBvciBhcmVsZW50IHN0cnVjdHVyZXMsIHNvIHRoZXJlIGlzIG5vCi0gICByZWFzb24gZm9yIHRoZW0gdG8gdXNlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBBbHNvLAotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBzbyBoYWNrZWQgdXAgaXQgaXMgZWFzaWVyIHRvIHdyaXRlIGEgbmV3Ci0gICBmdW5jdGlvbiB0aGFuIHRvIHRyeSB0byBkZWFsIHdpdGggaXQuCi0KLSAgIFRoaXMgcm91dGluZSBkb2VzIGEgZmluYWwgcmVsb2NhdGlvbi4gIFdoZXRoZXIgaXQgaXMgdXNlZnVsIGZvciBhCi0gICByZWxvY2F0ZWFibGUgbGluayBkZXBlbmRzIHVwb24gaG93IHRoZSBvYmplY3QgZm9ybWF0IGRlZmluZXMKLSAgIHJlbG9jYXRpb25zLgotCi0gICBGSVhNRTogVGhpcyByb3V0aW5lIGlnbm9yZXMgYW55IHNwZWNpYWxfZnVuY3Rpb24gaW4gdGhlIEhPV1RPLAotICAgc2luY2UgdGhlIGV4aXN0aW5nIHNwZWNpYWxfZnVuY3Rpb24gdmFsdWVzIGhhdmUgYmVlbiB3cml0dGVuIGZvcgotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQotICAgSE9XVE8gaXMgdGhlIHJlbG9jIGhvd3RvIGluZm9ybWF0aW9uLgotICAgSU5QVVRfQkZEIGlzIHRoZSBCRkQgd2hpY2ggdGhlIHJlbG9jIGFwcGxpZXMgdG8uCi0gICBJTlBVVF9TRUNUSU9OIGlzIHRoZSBzZWN0aW9uIHdoaWNoIHRoZSByZWxvYyBhcHBsaWVzIHRvLgotICAgQ09OVEVOVFMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLgotICAgQUREUkVTUyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2Mgd2l0aGluIElOUFVUX1NFQ1RJT04uCi0gICBWQUxVRSBpcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0aGUgcmVsb2MgcmVmZXJzIHRvLgotICAgQURERU5EIGlzIHRoZSBhZGRlbmQgb2YgdGhlIHJlbG9jLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGRyZXNzLAotCQkJICB2YWx1ZSwgYWRkZW5kKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MuICAqLwotICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhc2ljIHJlbG9jYXRpb24KLSAgICAgYWdhaW5zdCBhIHN5bWJvbC4gIFdlIHdhbnQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0bwotICAgICByZWxvY2F0ZSB0by4gIFRoaXMgaXMganVzdCBWQUxVRSwgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHBsdXMKLSAgICAgQURERU5ELCBhbnkgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2MuICAqLwotICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7Ci0KLSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgUEMgcmVsYXRpdmUsIHdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04gdG8KLSAgICAgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN5bWJvbCAoY3VycmVudGx5IGluIFJFTE9DQVRJT04pIGFuZCB0aGUKLSAgICAgbG9jYXRpb24gd2UgYXJlIHJlbG9jYXRpbmcuICBTb21lIHRhcmdldHMgKGUuZy4sIGkzODYtYW91dCkKLSAgICAgYXJyYW5nZSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUKLSAgICAgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBzdWNoIHRhcmdldHMKLSAgICAgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgT3RoZXIgdGFyZ2V0cyAoZS5nLiwgbTg4a2JjcyBvciBFTEYpCi0gICAgIHNpbXBseSBsZWF2ZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXMgemVybzsgZm9yIHN1Y2gKLSAgICAgdGFyZ2V0cyBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSBkbyBub3QKLSAgICAgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZQotICAgICBzZWN0aW9uICh3aGljaCBpcyBqdXN0IEFERFJFU1MpLiAgKi8KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgZ2l2ZW4gbG9jYXRpb24gdXNpbmcgYSBnaXZlbiB2YWx1ZSBhbmQgaG93dG8uICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgYmZkX2J5dGUgKmxvY2F0aW9uOwotewotICBpbnQgc2l6ZTsKLSAgYmZkX3ZtYSB4ID0gMDsKLSAgYm9vbGVhbiBvdmVyZmxvdzsKLSAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQgPSBob3d0by0+cmlnaHRzaGlmdDsKLSAgdW5zaWduZWQgaW50IGJpdHBvcyA9IGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogSWYgdGhlIHNpemUgaXMgbmVnYXRpdmUsIG5lZ2F0ZSBSRUxPQ0FUSU9OLiAgVGhpcyBpc24ndCB2ZXJ5Ci0gICAgIGdlbmVyYWwuICAqLwotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICAvKiBHZXQgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZWxvY2F0ZS4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICAgIHggPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmZGVmIEJGRDY0Ci0gICAgICB4ID0gYmZkX2dldF82NCAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICBGSVhNRTogV2UgbWF5IGRyb3AgYml0cyBkdXJpbmcgdGhlIGFkZGl0aW9uCi0gICAgIHdoaWNoIHdlIGRvbid0IGNoZWNrIGZvci4gIFdlIG11c3QgZWl0aGVyIGNoZWNrIGF0IGV2ZXJ5IHNpbmdsZQotICAgICBvcGVyYXRpb24sIHdoaWNoIHdvdWxkIGJlIHRlZGlvdXMsIG9yIHdlIG11c3QgZG8gdGhlIGNvbXB1dGF0aW9ucwotICAgICBpbiBhIHR5cGUgbGFyZ2VyIHRoYW4gYmZkX3ZtYSwgd2hpY2ggd291bGQgYmUgaW5lZmZpY2llbnQuICAqLwotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRybWFzaywgZmllbGRtYXNrLCBzaWdubWFzaywgc3M7Ci0gICAgICBiZmRfdm1hIGEsIGIsIHN1bTsKLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZXMgdG8gYmUgYWRkZWQgdG9nZXRoZXIuICBGb3Igc2lnbmVkIGFuZCB1bnNpZ25lZAotICAgICAgICAgcmVsb2NhdGlvbnMsIHdlIGFzc3VtZSB0aGF0IGFsbCB2YWx1ZXMgc2hvdWxkIGJlIHRydW5jYXRlZCB0bwotICAgICAgICAgdGhlIHNpemUgb2YgYW4gYWRkcmVzcy4gIEZvciBiaXRmaWVsZHMsIGFsbCB0aGUgYml0cyBtYXR0ZXIuCi0gICAgICAgICBTZWUgYWxzbyBiZmRfY2hlY2tfb3ZlcmZsb3cuICAqLwotICAgICAgZmllbGRtYXNrID0gTl9PTkVTIChob3d0by0+Yml0c2l6ZSk7Ci0gICAgICBhZGRybWFzayA9IE5fT05FUyAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSkgfCBmaWVsZG1hc2s7Ci0gICAgICBhID0gcmVsb2NhdGlvbjsKLSAgICAgIGIgPSB4ICYgaG93dG8tPnNyY19tYXNrOwotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKLQotCSAgLyogSWYgYW55IHNpZ24gYml0cyBhcmUgc2V0LCBhbGwgc2lnbiBiaXRzIG11c3QgYmUgc2V0LgotCSAgICAgVGhhdCBpcywgQSBtdXN0IGJlIGEgdmFsaWQgbmVnYXRpdmUgYWRkcmVzcyBhZnRlcgotCSAgICAgc2hpZnRpbmcuICAqLwotCSAgc2lnbm1hc2sgPSB+IChmaWVsZG1hc2sgPj4gMSk7Ci0JICBzcyA9IGEgJiBzaWdubWFzazsKLQkgIGlmIChzcyAhPSAwICYmIHNzICE9ICgoYWRkcm1hc2sgPj4gcmlnaHRzaGlmdCkgJiBzaWdubWFzaykpCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQotCSAgLyogV2Ugb25seSBuZWVkIHRoaXMgbmV4dCBiaXQgb2YgY29kZSBpZiB0aGUgc2lnbiBiaXQgb2YgQgotICAgICAgICAgICAgIGlzIGJlbG93IHRoZSBzaWduIGJpdCBvZiBBLiAgVGhpcyB3b3VsZCBvbmx5IGhhcHBlbiBpZgotICAgICAgICAgICAgIFNSQ19NQVNLIGhhZCBmZXdlciBiaXRzIHRoYW4gQklUU0laRS4gIE5vdGUgdGhhdCBpZgotICAgICAgICAgICAgIFNSQ19NQVNLIGhhcyBtb3JlIGJpdHMgdGhhbiBCSVRTSVpFLCB3ZSBjYW4gZ2V0IGludG8KLSAgICAgICAgICAgICB0cm91YmxlOyB3ZSB3b3VsZCBuZWVkIHRvIHZlcmlmeSB0aGF0IEIgaXMgaW4gcmFuZ2UsIGFzCi0gICAgICAgICAgICAgd2UgZG8gZm9yIEEgYWJvdmUuICAqLwotCSAgc2lnbm1hc2sgPSAoKH4gaG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzazsKLQkgIGlmICgoYiAmIHNpZ25tYXNrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogU2V0IGFsbCB0aGUgYml0cyBhYm92ZSB0aGUgc2lnbiBiaXQuICAqLwotCSAgICAgIGIgLT0gc2lnbm1hc2sgPDw9IDE7Ci0JICAgIH0KLQotCSAgYiA9IChiICYgYWRkcm1hc2spID4+IGJpdHBvczsKLQotCSAgLyogTm93IHdlIGNhbiBkbyB0aGUgYWRkaXRpb24uICAqLwotCSAgc3VtID0gYSArIGI7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgcmVzdWx0IGhhcyB0aGUgY29ycmVjdCBzaWduLiAgQml0cyBhYm92ZSB0aGUKLSAgICAgICAgICAgICBzaWduIGJpdCBhcmUganVuayBub3c7IGlnbm9yZSB0aGVtLiAgSWYgdGhlIHN1bSBpcwotICAgICAgICAgICAgIHBvc2l0aXZlLCBtYWtlIHN1cmUgd2UgZGlkIG5vdCBoYXZlIGFsbCBuZWdhdGl2ZSBpbnB1dHM7Ci0gICAgICAgICAgICAgaWYgdGhlIHN1bSBpcyBuZWdhdGl2ZSwgbWFrZSBzdXJlIHdlIGRpZCBub3QgaGF2ZSBhbGwKLSAgICAgICAgICAgICBwb3NpdGl2ZSBpbnB1dHMuICBUaGUgdGVzdCBiZWxvdyBsb29rcyBvbmx5IGF0IHRoZSBzaWduCi0gICAgICAgICAgICAgYml0cywgYW5kIGl0IHJlYWxseSBqdXN0Ci0JICAgICAgICAgU0lHTiAoQSkgPT0gU0lHTiAoQikgJiYgU0lHTiAoQSkgIT0gU0lHTiAoU1VNKQotCSAgICAgKi8KLQkgIHNpZ25tYXNrID0gKGZpZWxkbWFzayA+PiAxKSArIDE7Ci0JICBpZiAoKCh+IChhIF4gYikpICYgKGEgXiBzdW0pKSAmIHNpZ25tYXNrKQotCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLQkgIC8qIENoZWNraW5nIGZvciBhbiB1bnNpZ25lZCBvdmVyZmxvdyBpcyByZWxhdGl2ZWx5IGVhc3k6Ci0gICAgICAgICAgICAgdHJpbSB0aGUgYWRkcmVzc2VzIGFuZCBhZGQsIGFuZCB0cmltIHRoZSByZXN1bHQgYXMgd2VsbC4KLSAgICAgICAgICAgICBPdmVyZmxvdyBpcyBub3JtYWxseSBpbmRpY2F0ZWQgd2hlbiB0aGUgcmVzdWx0IGRvZXMgbm90Ci0gICAgICAgICAgICAgZml0IGluIHRoZSBmaWVsZC4gIEhvd2V2ZXIsIHdlIGFsc28gbmVlZCB0byBjb25zaWRlciB0aGUKLSAgICAgICAgICAgICBjYXNlIHdoZW4sIGUuZy4sIGZpZWxkbWFzayBpcyAweDdmZmZmZmZmIG9yIHNtYWxsZXIsIGFuCi0gICAgICAgICAgICAgaW5wdXQgaXMgMHg4MDAwMDAwMCwgYW5kIGJmZF92bWEgaXMgb25seSAzMiBiaXRzOyB0aGVuIHdlCi0gICAgICAgICAgICAgd2lsbCBnZXQgc3VtID09IDAsIGJ1dCB0aGVyZSBpcyBhbiBvdmVyZmxvdywgc2luY2UgdGhlCi0gICAgICAgICAgICAgaW5wdXRzIGRpZCBub3QgZml0IGluIHRoZSBmaWVsZC4gIEluc3RlYWQgb2YgZG9pbmcgYQotICAgICAgICAgICAgIHNlcGFyYXRlIHRlc3QsIHdlIGNhbiBjaGVjayBmb3IgdGhpcyBieSBvci1pbmcgaW4gdGhlCi0gICAgICAgICAgICAgb3BlcmFuZHMgd2hlbiB0ZXN0aW5nIGZvciB0aGUgc3VtIG92ZXJmbG93aW5nIGl0cyBmaW5hbAotICAgICAgICAgICAgIGZpZWxkLiAgKi8KLQkgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotCSAgYiA9IChiICYgYWRkcm1hc2spID4+IGJpdHBvczsKLQkgIHN1bSA9IChhICsgYikgJiBhZGRybWFzazsKLQkgIGlmICgoYSB8IGIgfCBzdW0pICYgfiBmaWVsZG1hc2spCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgLyogTXVjaCBsaWtlIHVuc2lnbmVkLCBleGNlcHQgbm8gdHJpbW1pbmcgd2l0aCBhZGRybWFzay4gIEluCi0gICAgICAgICAgICAgYWRkaXRpb24sIHRoZSBzdW0gb3ZlcmZsb3dzIGlmIHRoZXJlIGlzIGEgY2Fycnkgb3V0IG9mCi0gICAgICAgICAgICAgdGhlIGJmZF92bWEsIGkuZS4sIHRoZSBzdW0gaXMgbGVzcyB0aGFuIGVpdGhlciBpbnB1dAotICAgICAgICAgICAgIG9wZXJhbmQuICAqLwotCSAgYSA+Pj0gcmlnaHRzaGlmdDsKLQkgIGIgPj49IGJpdHBvczsKLQotCSAgLyogQml0ZmllbGRzIGFyZSBzb21ldGltZXMgdXNlZCBmb3Igc2lnbmVkIG51bWJlcnM7IGZvcgotICAgICAgICAgICAgIGV4YW1wbGUsIGEgMTMtYml0IGZpZWxkIHNvbWV0aW1lcyByZXByZXNlbnRzIHZhbHVlcyBpbgotICAgICAgICAgICAgIDAuLjgxOTEgYW5kIHNvbWV0aW1lcyByZXByZXNlbnRzIHZhbHVlcyBpbiAtNDA5Ni4uNDA5NS4KLSAgICAgICAgICAgICBJZiB0aGUgZmllbGQgaXMgc2lnbmVkIGFuZCBhIGlzIC00MDk1ICgweDEwMDEpIGFuZCBiIGlzCi0gICAgICAgICAgICAgLTEgKDB4MWZmZiksIHRoZSBzdW0gaXMgLTQwOTYgKDB4MTAwMCksIGJ1dCAoMHgxMDAxICsKLSAgICAgICAgICAgICAweDFmZmYgaXMgMHgzMDAwKS4gIEl0J3Mgbm90IGNsZWFyIGhvdyB0byBoYW5kbGUgdGhpcwotICAgICAgICAgICAgIGV2ZXJ5d2hlcmUsIHNpbmNlIHRoZXJlIGlzIG5vdCB3YXkgdG8ga25vdyBob3cgbWFueSBiaXRzCi0gICAgICAgICAgICAgYXJlIHNpZ25pZmljYW50IGluIHRoZSByZWxvY2F0aW9uLCBidXQgdGhlIG9yaWdpbmFsIGNvZGUKLSAgICAgICAgICAgICBhc3N1bWVkIHRoYXQgaXQgd2FzIGZ1bGx5IHNpZ24gZXh0ZW5kZWQsIGFuZCB3ZSB3aWxsIGtlZXAKLSAgICAgICAgICAgICB0aGF0IGFzc3VtcHRpb24uICAqLwotCSAgc2lnbm1hc2sgPSAoZmllbGRtYXNrID4+IDEpICsgMTsKLQotCSAgaWYgKChhICYgfiBmaWVsZG1hc2spICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBTb21lIGJpdHMgb3V0IG9mIHRoZSBmaWVsZCBhcmUgc2V0LiAgVGhpcyBtaWdodCBub3QKLSAgICAgICAgICAgICAgICAgYmUgYSBwcm9ibGVtOiBpZiB0aGlzIGlzIGEgc2lnbmVkIGJpdGZpZWxkLCBpdCBpcyBPSwotICAgICAgICAgICAgICAgICBpZmYgYWxsIHRoZSBoaWdoIGJpdHMgYXJlIHNldCwgaW5jbHVkaW5nIHRoZSBzaWduCi0gICAgICAgICAgICAgICAgIGJpdC4gIFdlJ2xsIHRyeSBzZXR0aW5nIGFsbCBidXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgICAgICAgICAgICAgICAgYml0IGluIHRoZSBvcmlnaW5hbCByZWxvY2F0aW9uIHZhbHVlOiBpZiB0aGlzIGlzIGFsbAotICAgICAgICAgICAgICAgICBvbmVzLCB3ZSBhcmUgT0ssIGFzc3VtaW5nIGEgc2lnbmVkIGJpdGZpZWxkLiAgKi8KLQkgICAgICBzcyA9IChzaWdubWFzayA8PCByaWdodHNoaWZ0KSAtIDE7Ci0JICAgICAgaWYgKChzcyB8IHJlbG9jYXRpb24pICE9IH4gKGJmZF92bWEpIDApCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBhICY9IGZpZWxkbWFzazsKLQkgICAgfQotCi0JICAvKiBXZSBqdXN0IGFzc3VtZSAoYiAmIH4gZmllbGRtYXNrKSA9PSAwLiAgKi8KLQotCSAgLyogV2UgZXhwbGljaXRseSBwZXJtaXQgd3JhcCBhcm91bmQgaWYgdGhpcyByZWxvY2F0aW9uCi0JICAgICBjb3ZlcnMgdGhlIGhpZ2ggYml0IG9mIGFuIGFkZHJlc3MuICBUaGUgTGludXgga2VybmVsCi0JICAgICByZWxpZXMgb24gaXQsIGFuZCBpdCBpcyB0aGUgb25seSB3YXkgdG8gd3JpdGUgYXNzZW1ibGVyCi0JICAgICBjb2RlIHdoaWNoIGNhbiBydW4gd2hlbiBsb2FkZWQgYXQgYSBsb2NhdGlvbiAweDgwMDAwMDAwCi0JICAgICBhd2F5IGZyb20gdGhlIGxvY2F0aW9uIGF0IHdoaWNoIGl0IGlzIGxpbmtlZC4gICovCi0JICBpZiAoaG93dG8tPmJpdHNpemUgKyByaWdodHNoaWZ0Ci0JICAgICAgPT0gYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSkKLQkgICAgYnJlYWs7Ci0KLQkgIHN1bSA9IGEgKyBiOwotCSAgaWYgKHN1bSA8IGEgfHwgKHN1bSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgd2FzIGEgY2Fycnkgb3V0LCBvciB0aGUgZmllbGQgb3ZlcmZsb3cuICBUZXN0Ci0gICAgICAgICAgICAgICAgIGZvciBzaWduZWQgb3BlcmFuZHMgYWdhaW4uICBIZXJlIGlzIHRoZSBvdmVyZmxvdyB0ZXN0Ci0gICAgICAgICAgICAgICAgIGlzIGFzIGZvciBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuICAqLwotCSAgICAgIGlmICgoKH4gKGEgXiBiKSkgJiAoYSBeIHN1bSkpICYgc2lnbm1hc2spCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIFB1dCBSRUxPQ0FUSU9OIGluIHRoZSByaWdodCBiaXRzLiAgKi8KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIHJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBiaXRwb3M7Ci0KLSAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIHJpZ2h0IGJpdHMgb2YgWC4gICovCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKQotICAgICAgIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpOwotCi0gIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmZGVmIEJGRDY0Ci0gICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotLyoKLURPQ0RECi1JTk9ERQotCWhvd3RvIG1hbmFnZXIsICAsIHR5cGVkZWYgYXJlbGVudCwgUmVsb2NhdGlvbnMKLQotU0VDVElPTgotCVRoZSBob3d0byBtYW5hZ2VyCi0KLQlXaGVuIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNyZWF0ZSBhIHJlbG9jYXRpb24sIGJ1dCBkb2Vzbid0Ci0Ja25vdyB3aGF0IHRoZSB0YXJnZXQgbWFjaGluZSBtaWdodCBjYWxsIGl0LCBpdCBjYW4gZmluZCBvdXQgYnkKLQl1c2luZyB0aGlzIGJpdCBvZiBjb2RlLgotCi0qLwotCi0vKgotVFlQRURFRgotCWJmZF9yZWxvY19jb2RlX3R5cGUKLQotREVTQ1JJUFRJT04KLQlUaGUgaW5zaWRlcyBvZiBhIHJlbG9jIGNvZGUuICBUaGUgaWRlYSBpcyB0aGF0LCBldmVudHVhbGx5LCB0aGVyZQotCXdpbGwgYmUgb25lIGVudW1lcmF0b3IgZm9yIGV2ZXJ5IHR5cGUgb2YgcmVsb2NhdGlvbiB3ZSBldmVyIGRvLgotCVBhc3Mgb25lIG9mIHRoZXNlIHZhbHVlcyB0byA8PGJmZF9yZWxvY190eXBlX2xvb2t1cD4+LCBhbmQgaXQnbGwKLQlyZXR1cm4gYSBob3d0byBwb2ludGVyLgotCi0JVGhpcyBkb2VzIG1lYW4gdGhhdCB0aGUgYXBwbGljYXRpb24gbXVzdCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QKLQllbnVtZXJhdG9yIHZhbHVlOyB5b3UgY2FuJ3QgZ2V0IGEgaG93dG8gcG9pbnRlciBmcm9tIGEgcmFuZG9tIHNldAotCW9mIGF0dHJpYnV0ZXMuCi0KLVNFTlVNCi0gICBiZmRfcmVsb2NfY29kZV9yZWFsCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY0Ci1FTlVNWAotICBCRkRfUkVMT0NfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yNgotRU5VTVgKLSAgQkZEX1JFTE9DXzI0Ci1FTlVNWAotICBCRkRfUkVMT0NfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNAotRU5VTVgKLSAgQkZEX1JFTE9DXzgKLUVOVU1ET0MKLSAgQmFzaWMgYWJzb2x1dGUgcmVsb2NhdGlvbnMgb2YgTiBiaXRzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182NF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMjRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzEyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9QQ1JFTAotRU5VTURPQwotICBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X1BMVE9GRgotRU5VTURPQwotICBGb3IgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182OEtfR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfUkVMQVRJVkUKLUVOVU1ET0MKLSAgUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ18zMl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfUlZBCi1FTlVNRE9DCi0gIExpbmthZ2UtdGFibGUgcmVsYXRpdmUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzhfRkZubgotRU5VTURPQwotICBBYnNvbHV0ZSA4LWJpdCByZWxvY2F0aW9uLCBidXQgdXNlZCB0byBmb3JtIGFuIGFkZHJlc3MgbGlrZSAweEZGbm4uCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMgotRU5VTURPQwotICBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4KLQotRU5VTQotICBCRkRfUkVMT0NfSEkyMgotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTAKLUVOVU1ET0MKLSAgSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4KLQotRU5VTQotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTVgKLSAgQkZEX1JFTE9DX0dQUkVMMzIKLUVOVU1ET0MKLSAgRm9yIHN5c3RlbXMgdGhhdCBhbGxvY2F0ZSBhIEdsb2JhbCBQb2ludGVyIHJlZ2lzdGVyLCB0aGVzZSBhcmUKLWRpc3BsYWNlbWVudHMgb2ZmIHRoYXQgcmVnaXN0ZXIuICBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZQotaGFuZGxlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhlIHZhbHVlIHRoZSByZWdpc3RlciB3aWxsIGhhdmUgaXMKLWRlY2lkZWQgcmVsYXRpdmVseSBsYXRlLgotCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEoKLUVOVU1ET0MKLSAgUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4KLQotRU5VTQotICBCRkRfUkVMT0NfTk9ORQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkMxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTMKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1VBMzIKLUVOVU1ET0MKLSAgU1BBUkMgRUxGIHJlbG9jYXRpb25zLiAgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBvdmVybGFwIHdpdGggb3RoZXIKLSAgcmVsb2NhdGlvbiB0eXBlcyBhbHJlYWR5IGRlZmluZWQuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMgotRU5VTURPQwotICBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLgotCi1FTlVNRVEKLSAgQkZEX1JFTE9DX1NQQVJDXzY0Ci0gIEJGRF9SRUxPQ182NAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfMTEKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfNwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ181Ci1FTlVNRVFYCi0gIEJGRF9SRUxPQ19TUEFSQ19ESVNQNjQKLSAgQkZEX1JFTE9DXzY0X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIKLUVOVU1ET0MKLSAgU1BBUkM2NCByZWxvY2F0aW9ucwotCi1FTlVNCi0gIEJGRF9SRUxPQ19TUEFSQ19SRVYzMgotRU5VTURPQwotICBTUEFSQyBsaXR0bGUgZW5kaWFuIHJlbG9jYXRpb24KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYKLUVOVU1ET0MKLSAgQWxwaGEgRUNPRkYgYW5kIEVMRiByZWxvY2F0aW9ucy4gIFNvbWUgb2YgdGhlc2UgdHJlYXQgdGhlIHN5bWJvbCBvcgotICAgICAiYWRkZW5kIiBpbiBzb21lIHNwZWNpYWwgd2F5LgotICBGb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLSAgICAgd3JpdGluZzsgd2hlbiByZWFkaW5nLCBpdCB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gIFRoZQotICAgICBhZGRlbmQgaXMgdGhlIGRpc3BsYWNlbWVudCBpbiBieXRlcyBvZiB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZnJvbQotICAgICB0aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4KLUVOVU0KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2Ci1FTlVNRE9DCi0gIEZvciBHUERJU1BfTE8xNiAoImlnbm9yZSIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGhhbmRsZWQgYXMKLSAgICAgd2l0aCBHUERJU1BfSEkxNiByZWxvY3MuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nIHRoZQotICAgICByZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi0gICAgIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZS4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQCi1FTlVNRE9DCi0gIFRoZSBFTEYgR1BESVNQIHJlbG9jYXRpb24gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgR1BESVNQX0hJMTYKLSAgICAgcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLSAgICAgcmVsb2NhdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFCi1FTlVNRE9DCi0gIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLSAgICAgdGhlIGFzc2VtYmxlciB0dXJucyBpdCBpbnRvIGEgTERRIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIHN5bWJvbCwgYW5kIHRoZW4gZmlsbHMgaW4gYSByZWdpc3RlciBpbiB0aGUgcmVhbCBpbnN0cnVjdGlvbi4KLQotICAgICBUaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotICAgICBzZWN0aW9uIHN5bWJvbC4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcsIGJ1dCBpcyBmaWxsZWQKLSAgICAgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZSwgYXMgd2l0aCB0aGUKLSAgICAgR1BESVNQX0xPMTYgcmVsb2MuCi0KLSAgICAgVGhlIEVMRl9MSVRFUkFMIHJlbG9jIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDE2X0dPVE9GRiBhbmQgR1BESVNQX0xPMTYuCi0gICAgIEl0IHNob3VsZCByZWZlciB0byB0aGUgc3ltYm9sIHRvIGJlIHJlZmVyZW5jZWQsIGFzIHdpdGggMTZfR09UT0ZGLAotICAgICBidXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotICAgICBzZWN0aW9uLCBidXQgcmVsYXRpdmUgdG8gdGhlIEdQIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZpbGUgZHVyaW5nIHRoZQotICAgICBmaW5hbCBsaW5rIHN0YWdlLgotCi0gICAgIFRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi0gICAgIGluZm9ybWF0aW9uIHRvIHRoZSBsaW5rZXIgdGhhdCBpdCBtaWdodCBiZSBhYmxlIHRvIHVzZSB0byBvcHRpbWl6ZQotICAgICBhd2F5IHNvbWUgbGl0ZXJhbCBzZWN0aW9uIHJlZmVyZW5jZXMuICBUaGUgc3ltYm9sIGlzIGlnbm9yZWQgKHJlYWQKLSAgICAgYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLSAgICAgb2YgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHJlZ2lzdGVyOgotICAgICAgICAgICAgICAxIC0gIm1lbW9yeSIgZm10IGluc24KLSAgICAgICAgICAgICAgMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0gICAgICAgICAgICAgIDMgLSBqc3IgKHRhcmdldCBvZiBicmFuY2gpCi0KLSAgICAgVGhlIEdOVSBsaW5rZXIgY3VycmVudGx5IGRvZXNuJ3QgZG8gYW55IG9mIHRoaXMgb3B0aW1pemluZy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRQotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUgotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BESVNQCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0gKLUVOVU1YCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XCi1FTlVNRE9DCi0gIFRoZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl8qIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgdG8KLSAgICAgcHJvY2VzcyB0aGUgZXhwbGljaXQgITxyZWxvYz4hc2VxdWVuY2UgcmVsb2NhdGlvbnMsIGFuZCBhcmUgbWFwcGVkCi0gICAgIGludG8gdGhlIG5vcm1hbCByZWxvY2F0aW9ucyBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FMUEhBX0hJTlQKLUVOVU1ET0MKLSAgVGhlIEhJTlQgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgYSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBmaWxsZWQgaW50byB0aGUKLSAgICAgImhpbnQiIGZpZWxkIG9mIGEgam1wL2pzci9yZXQgaW5zdHJ1Y3Rpb24sIGZvciBwb3NzaWJsZSBicmFuY2gtCi0gICAgIHByZWRpY3Rpb24gbG9naWMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIG9uIHNvbWUgcHJvY2Vzc29ycy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRQotRU5VTURPQwotICBUaGUgTElOS0FHRSByZWxvY2F0aW9uIG91dHB1dHMgYSBsaW5rYWdlIHBhaXIgaW4gdGhlIG9iamVjdCBmaWxlLAotICAgICB3aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIKLUVOVU1ET0MKLSAgVGhlIENPREVBRERSIHJlbG9jYXRpb24gb3V0cHV0cyBhIFNUT19DQSBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTX0pNUAotRU5VTURPQwotICBCaXRzIDI3Li4yIG9mIHRoZSByZWxvY2F0aW9uIGFkZHJlc3Mgc2hpZnRlZCByaWdodCAyIGJpdHM7Ci0gICAgIHNpbXBsZSByZWxvYyBvdGhlcndpc2UuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFMxNl9KTVAKLUVOVU1ET0MKLSAgVGhlIE1JUFMxNiBqdW1wIGluc3RydWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwKLUVOVU1ET0MKLSAgTUlQUzE2IEdQIHJlbGF0aXZlIHJlbG9jLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19ISTE2Ci1FTlVNRE9DCi0gIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWU7IHNpbXBsZSByZWxvYy4KLUVOVU0KLSAgQkZEX1JFTE9DX0hJMTZfUwotRU5VTURPQwotICBIaWdoIDE2IGJpdHMgb2YgMzItYml0IHZhbHVlIGJ1dCB0aGUgbG93IDE2IGJpdHMgd2lsbCBiZSBzaWduCi0gICAgIGV4dGVuZGVkIGFuZCBhZGRlZCB0byBmb3JtIHRoZSBmaW5hbCByZXN1bHQuICBJZiB0aGUgbG93IDE2Ci0gICAgIGJpdHMgZm9ybSBhIG5lZ2F0aXZlIG51bWJlciwgd2UgbmVlZCB0byBhZGQgb25lIHRvIHRoZSBoaWdoIHZhbHVlCi0gICAgIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBib3Jyb3cgd2hlbiB0aGUgbG93IGJpdHMgYXJlIGFkZGVkLgotRU5VTQotICBCRkRfUkVMT0NfTE8xNgotRU5VTURPQwotICBMb3cgMTYgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUwotRU5VTURPQwotICBMaWtlIEJGRF9SRUxPQ19ISTE2X1MsIGJ1dCBQQyByZWxhdGl2ZS4KLUVOVU0KLSAgQkZEX1JFTE9DX1BDUkVMX0xPMTYKLUVOVU1ET0MKLSAgTGlrZSBCRkRfUkVMT0NfTE8xNiwgYnV0IFBDIHJlbGF0aXZlLgotCi1FTlVNRVEKLSAgQkZEX1JFTE9DX01JUFNfR1BSRUwKLSAgQkZEX1JFTE9DX0dQUkVMMTYKLUVOVU1ET0MKLSAgUmVsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgZ2xvYmFsIHBvaW50ZXIuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFNfTElURVJBTAotRU5VTURPQwotICBSZWxvY2F0aW9uIGFnYWluc3QgYSBNSVBTIGxpdGVyYWwgc2VjdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQU19HT1QxNgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfQ0FMTDE2Ci1FTlVNRVFYCi0gIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIKLSAgQkZEX1JFTE9DX0dQUkVMMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX1NVQgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNUCi1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19HT1RfRElTUAotQ09NTUVOVAotRU5VTURPQwotICBNSVBTIEVMRiByZWxvY2F0aW9ucy4KLQotQ09NTUVOVAotCi1FTlVNCi0gIEJGRF9SRUxPQ18zODZfR09UMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfUExUMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfUkVMQVRJVkUKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0dPVFBDCi1FTlVNRE9DCi0gIGkzODYvZWxmIHJlbG9jYXRpb25zCi0KLUVOVU0KLSAgQkZEX1JFTE9DX05TMzJLX0lNTV84Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzgKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMgotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMCi1FTlVNRE9DCi0gIG5zMzJrIHJlbG9jYXRpb25zCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1BKX0NPREVfSEkxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BKX0NPREVfTE8xNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyCi1FTlVNWAotICBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BKX0NPREVfUkVMMzIKLUVOVU1ET0MKLSAgUGljb2phdmEgcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLgotICAKLUVOVU0KLSAgQkZEX1JFTE9DX1BQQ19CMjYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkEyNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19UT0MxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0JBMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19KTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX01SS1JFRgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQQotRU5VTURPQwotICBQb3dlcihyczYwMDApIGFuZCBQb3dlclBDIHJlbG9jYXRpb25zLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19DVE9SCi1FTlVNRE9DCi0gIFRoZSB0eXBlIG9mIHJlbG9jIHVzZWQgdG8gYnVpbGQgYSBjb250cnVjdG9yIHRhYmxlIC0gYXQgdGhlIG1vbWVudAotICBwcm9iYWJseSBhIDMyIGJpdCB3aWRlIGFic29sdXRlIHJlbG9jYXRpb24sIGJ1dCB0aGUgdGFyZ2V0IGNhbiBjaG9vc2UuCi0gIEl0IGdlbmVyYWxseSBkb2VzIG1hcCB0byBvbmUgb2YgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gKLUVOVU1ET0MKLSAgQVJNIDI2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi0gIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfQVJNX0lNTUVESUFURQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9TV0kKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTVVMVEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9BRFJfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0xEUl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9JTl9QT09MCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04Ci1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0hXTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1QxMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1QzMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9QTFQzMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fR09UUEMKLUVOVU1ET0MKLSAgVGhlc2UgcmVsb2NzIGFyZSBvbmx5IHVzZWQgd2l0aGluIHRoZSBBUk0gYXNzZW1ibGVyLiAgVGhleSBhcmUgbm90Ci0gIChhdCBwcmVzZW50KSB3cml0dGVuIHRvIGFueSBvYmplY3QgZmlsZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU00QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NNEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTgKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU04QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NOEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1NXSVRDSDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfU1dJVENIMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9VU0VTCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfQ09VTlQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9BTElHTgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0NPREUKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9EQVRBCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfTEFCRUwKLUVOVU1ET0MKLSAgSGl0YWNoaSBTSCByZWxvY3MuICBOb3QgYWxsIG9mIHRoZXNlIGFwcGVhciBpbiBvYmplY3QgZmlsZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDkKLUVOVU1YCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMgotRU5VTVgKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzCi1FTlVNRE9DCi0gIFRodW1iIDIzLSwgMTItIGFuZCA5LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2hlcy4gIFRoZSBsb3dlc3QgYml0IG11c3QKLSAgYmUgemVybyBhbmQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwKLUVOVU1ET0MKLSAgQXJnb25hdXQgUklTQyBDb3JlIChBUkMpIHJlbG9jcy4KLSAgQVJDIDIyIGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi0gIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjAgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjYKLSAgdGhyb3VnaCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FSQ19CMjYKLUVOVU1ET0MKLSAgQVJDIDI2IGJpdCBhYnNvbHV0ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlIG5vdAotICBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjQgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjMKLSAgdGhyb3VnaCAwLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MCi1FTlVNRE9DCi0gIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi0gIFRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi0gIGFzc3VtZWQgdG8gYmUgMC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHJlbG9jCi0gIGV4Y2VwdCBpdCBpcyBpbiB0aGUgbGVmdCBjb250YWluZXIsIGkuZS4sCi0gIHNoaWZ0ZWQgbGVmdCAxNSBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xOAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzYKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMzBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDYtYml0IGFic29sdXRlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi0gIGFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLSAgb2YgdGhlIGNvbnRhaW5lci4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNQotRU5VTURPQwotICBUaGlzIGlzIGEgMTItYml0IGFic29sdXRlIHJlbG9jIHdpdGggdGhlIAotICByaWdodCAzIGJpdHNhc3N1bWVkIHRvIGJlIDAuICAKLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLSAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotICBvZiB0aGUgY29udGFpbmVyLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzIxCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IGFic29sdXRlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUgotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotICBhcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi0gIG9mIHRoZSBjb250YWluZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzMyCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMi1iaXQgYWJzb2x1dGUgcmVsb2MuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2MuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMjQKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBNMzJSIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTAtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAyNi1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotICB1c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgdW5zaWduZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKLSAgdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHNpZ25lZC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfTE8xNgotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGxvd2VyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfU0RBMTYKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBzbWFsbCBkYXRhIGFyZWEgb2Zmc2V0IGZvciB1c2UgaW4KLSAgYWRkMywgbG9hZCwgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4KLQotRU5VTQotICBCRkRfUkVMT0NfVjg1MF85X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA5LWJpdCByZWxvYwotRU5VTQotICBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMjItYml0IHJlbG9jCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotICBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi0gIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gOCBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDYgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLSAgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiA4Yml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA3IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKLSAgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotQ09NTUVOVAotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNSBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDQgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotICBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDQgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotICBiaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi0gIGJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLgotQ09NTUVOVAotCi1FTlVNCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzMyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi0gIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTZiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQotICBpbnN0cnVjdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfVElDMzBfTERQCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA4Yml0IERQIHJlbG9jIGZvciB0aGUgdG1zMzIwYzMwLCB3aGVyZSB0aGUgbW9zdAotICBzaWduaWZpY2FudCA4IGJpdHMgb2YgYSAyNCBiaXQgd29yZCBhcmUgcGxhY2VkIGludG8gdGhlIGxlYXN0Ci0gIHNpZ25pZmljYW50IDggYml0cyBvZiB0aGUgb3Bjb2RlLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzQ4Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSA0OCBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDMyIGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzIwCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDIwIGJpdHMgc3BsaXQgdXAgaW50bwotICB0d28gc2VjdGlvbnMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzZfSU5fNAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDYgYml0IHdvcmQgb2Zmc2V0IGluCi0gIDQgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfOF9JTl84Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGFuIDggYml0IGJ5dGUgb2Zmc2V0Ci0gIGludG8gOCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF85X0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBzaG9ydCBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzEwX0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMCBiaXQgd29yZCBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBwYyByZWxhdGl2ZQotICBzaG9ydCBvZmZzZXQgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTIgYml0IHBjIHJlbGF0aXZlCi0gIHNob3J0IG9mZnNldCBpbnRvIDExIGJpdHMuCi0gIAotRU5VTQotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUlZBCi1FTlVNRE9DCi0gIE1vdG9yb2xhIE1jb3JlIHJlbG9jYXRpb25zLgotICAKLUVOVU0KLSAgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi1FTlVNWAotICBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi1FTlVNRE9DCi0gIFRoZXNlIHR3byByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgbGlua2VyIHRvIGRldGVybWluZSB3aGljaCBvZiAKLSAgdGhlIGVudHJpZXMgaW4gYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBhcmUgYWN0dWFsbHkgdXNlZC4gIFdoZW4KLSAgdGhlIC0tZ2Mtc2VjdGlvbnMgb3B0aW9uIGlzIGdpdmVuLCB0aGUgbGlua2VyIHdpbGwgemVybyBvdXQgdGhlIGVudHJpZXMKLSAgdGhhdCBhcmUgbm90IHVzZWQsIHNvIHRoYXQgdGhlIGNvZGUgZm9yIHRob3NlIGZ1bmN0aW9ucyBuZWVkIG5vdCBiZQotICBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgotCi0gIFZUQUJMRV9JTkhFUklUIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdG8gdGhlCi0gIGxpbmtlciB0aGUgaW5oZXJpdGVuY2UgdHJlZSBvZiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgVGhlCi0gIHJlbG9jYXRpb24ncyBzeW1ib2wgc2hvdWxkIGJlIHRoZSBwYXJlbnQgY2xhc3MnIHZ0YWJsZSwgYW5kIHRoZQotICByZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhdGVkIGF0IHRoZSBjaGlsZCB2dGFibGUuCi0KLSAgVlRBQkxFX0VOVFJZIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSB1c2Ugb2YgYQotICB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGVudHJ5LiAgVGhlIHJlbG9jJ3Mgc3ltYm9sIHNob3VsZCByZWZlciB0byB0aGUKLSAgdGFibGUgb2YgdGhlIGNsYXNzIG1lbnRpb25lZCBpbiB0aGUgY29kZS4gIE9mZiBvZiB0aGF0IGJhc2UsIGFuIG9mZnNldAotICBkZXNjcmliZXMgdGhlIGVudHJ5IHRoYXQgaXMgYmVpbmcgdXNlZC4gIEZvciBSZWxhIGhvc3RzLCB0aGlzIG9mZnNldCAKLSAgaXMgc3RvcmVkIGluIHRoZSByZWxvYydzIGFkZGVuZC4gIEZvciBSZWwgaG9zdHMsIHdlIGFyZSBmb3JjZWQgdG8gcHV0Ci0gIHRoaXMgb2Zmc2V0IGluIHRoZSByZWxvYydzIHNlY3Rpb24gb2Zmc2V0LgotCi1FTkRTRU5VTQotICBCRkRfUkVMT0NfVU5VU0VECi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlOwotKi8KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotU1lOT1BTSVMKLQlyZWxvY19ob3d0b190eXBlICoKLQliZmRfcmVsb2NfdHlwZV9sb29rdXAgKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHBvaW50ZXIgdG8gYSBob3d0byBzdHJ1Y3R1cmUgd2hpY2gsIHdoZW4KLQlpbnZva2VkLCB3aWxsIHBlcmZvcm0gdGhlIHJlbG9jYXRpb24gQHZhcntjb2RlfSBvbiBkYXRhIGZyb20gdGhlCi0JYXJjaGl0ZWN0dXJlIG5vdGVkLgotCi0qLwotCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIHJlbG9jX3R5cGVfbG9va3VwLCAoYWJmZCwgY29kZSkpOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBiZmRfaG93dG9fMzIgPQotSE9XVE8gKDAsIDAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiVlJUMzIiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgdHJ1ZSk7Ci0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQotU1lOT1BTSVMKLQlyZWxvY19ob3d0b190eXBlICpiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCShiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgY29kZSk7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgYSBkZWZhdWx0IHJlbG9jYXRpb24gbG9va3VwIHJvdXRpbmUgZm9yIGFueSBhcmNoaXRlY3R1cmUuCi0KLQotKi8KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgLyogVGhlIHR5cGUgb2YgcmVsb2MgdXNlZCBpbiBhIGN0b3IsIHdoaWNoIHdpbGwgYmUgYXMgd2lkZSBhcyB0aGUKLQkgYWRkcmVzcyAtIHNvIGVpdGhlciBhIDY0LCAzMiwgb3IgMTYgYml0dGVyLiAgKi8KLSAgICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotCXsKLQljYXNlIDY0OgotCSAgQkZEX0ZBSUwgKCk7Ci0JY2FzZSAzMjoKLQkgIHJldHVybiAmYmZkX2hvd3RvXzMyOwotCWNhc2UgMTY6Ci0JICBCRkRfRkFJTCAoKTsKLQlkZWZhdWx0OgotCSAgQkZEX0ZBSUwgKCk7Ci0JfQotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfRkFJTCAoKTsKLSAgICB9Ci0gIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZQotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKmJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSk7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgYSBwcmludGFibGUgbmFtZSBmb3IgdGhlIHN1cHBsaWVkIHJlbG9jYXRpb24gY29kZS4KLQlVc2VmdWwgbWFpbmx5IGZvciBwcmludGluZyBlcnJvciBtZXNzYWdlcy4KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoY29kZSA+IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBiZmRfcmVsb2NfY29kZV9yZWFsX25hbWVzWyhpbnQpY29kZV07Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLQkgKGJmZCAqYWJmZCwKLQkgIGFzZWN0aW9uICpzZWN0aW9uLAotCSAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgIGJvb2xlYW4gKik7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBmb3IgcmVsYXhpbmcgZm9yIGJhY2sgZW5kcyB3aGljaAotCWRvbid0IGRvIHJlbGF4aW5nIC0tIGkuZS4sIGRvZXMgbm90aGluZy4KLSovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gICphZ2FpbiA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0JIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKik7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBmb3IgcmVsYXhpbmcgZm9yIGJhY2sgZW5kcyB3aGljaAotCWRvbid0IGRvIHNlY3Rpb24gZ2MgLS0gaS5lLiwgZG9lcyBub3RoaW5nLgotKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZ2VuZXJpY19nY19zZWN0aW9ucyAoYWJmZCwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYmZkX2J5dGUgKgotCSAgIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYmZkICphYmZkLAotCSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKLQkgICAgIGJmZF9ieXRlICpkYXRhLAotCSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0JICAgICBhc3ltYm9sICoqc3ltYm9scyk7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBvZiByZWxvY2F0aW9uIGVmZm9ydCBmb3IgYmFjayBlbmRzCi0Jd2hpY2ggY2FuJ3QgYmUgYm90aGVyZWQgdG8gZG8gaXQgZWZmaWNpZW50bHkuCi0KLSovCi0KLWJmZF9ieXRlICoKLWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkgICAgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkgKFBUUikgZGF0YSwKLQkJCQkgMCwKLQkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSdyZSBub3QgcmVsYXhpbmcgdGhlIHNlY3Rpb24sIHNvIGp1c3QgY29weSB0aGUgc2l6ZSBpbmZvICovCi0gIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcGFyZW50OwotICAgICAgZm9yIChwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQgIT0gKGFyZWxlbnQgKikgTlVMTDsKLQkgICBwYXJlbnQrKykKLQl7Ci0JICBjaGFyICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgTlVMTDsKLQkgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByID0KLQkgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLAotCQkJCSAgICAqcGFyZW50LAotCQkJCSAgICAoUFRSKSBkYXRhLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICByZWxvY2F0ZWFibGUgPyBhYmZkIDogKGJmZCAqKSBOVUxMLAotCQkJCSAgICAmZXJyb3JfbWVzc2FnZSk7Ci0KLQkgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqb3MgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgICAgIC8qIEEgcGFydGlhbCBsaW5rLCBzbyBrZWVwIHRoZSByZWxvY3MgKi8KLQkgICAgICBvcy0+b3JlbG9jYXRpb25bb3MtPnJlbG9jX2NvdW50XSA9ICpwYXJlbnQ7Ci0JICAgICAgb3MtPnJlbG9jX2NvdW50Kys7Ci0JICAgIH0KLQotCSAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyKQotCQl7Ci0JCWNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAotCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCQkgIEJGRF9BU1NFUlQgKGVycm9yX21lc3NhZ2UgIT0gKGNoYXIgKikgTlVMTCk7Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkJKGxpbmtfaW5mbywgZXJyb3JfbWVzc2FnZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAotCQkJICgqcGFyZW50KS0+aG93dG8tPm5hbWUsICgqcGFyZW50KS0+YWRkZW5kLAotCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLWVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3JlbG9jMTYuYyBiL2JmZC9yZWxvYzE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzk1MmUuLjAwMDAwMDAKLS0tIGEvYmZkL3JlbG9jMTYuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKiA4IGFuZCAxNiBiaXQgQ09GRiByZWxvY2F0aW9uIGZ1bmN0aW9ucywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIAotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbSAKLSovCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIGJ5IGNvZmYtaDgzMDAgYW5kIGNvZmYtejhrIHRvIGRvCi0gICByZWxvY2F0aW9uLgotCi0gICBGSVhNRTogVGhpcyBjb2RlIHNob3VsZCBiZSByZXdyaXR0ZW4gdG8gc3VwcG9ydCB0aGUgbmV3IENPRkYKLSAgIGxpbmtlci4gIEJhc2ljYWxseSwgdGhleSBuZWVkIHRvIGRlYWwgd2l0aCBDT0ZGIHJlbG9jcyByYXRoZXIgdGhhbgotICAgQkZEIGdlbmVyaWMgcmVsb2NzLiAgVGhleSBzaG91bGQgc3RvcmUgdGhlIHJlbG9jcyBpbiBzb21lIGxvY2F0aW9uCi0gICB3aGVyZSBjb2ZmX2xpbmtfaW5wdXRfYmZkIGNhbiBmaW5kIHRoZW0gKGFuZCBjb2ZmX2xpbmtfaW5wdXRfYmZkCi0gICBzaG91bGQgYmUgY2hhbmdlZCB0byB1c2UgdGhpcyBsb2NhdGlvbiByYXRoZXIgdGhhbiByZXJlYWRpbmcgdGhlCi0gICBmaWxlKSAodW5sZXNzIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCBpbiB3aGljaCBjYXNlIHRoZXkgc2hvdWxkCi0gICBmcmVlIHVwIHRoZSByZWxvY3MgYWZ0ZXIgZGVhbGluZyB3aXRoIHRoZW0pLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotYmZkX3ZtYQotYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOwotICAvKiBBIHN5bWJvbCBob2xkcyBhIHBvaW50ZXIgdG8gYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0IGZyb20gdGhlCi0gICAgIGJhc2Ugb2YgdGhlIHNlY3Rpb24uICBUbyByZWxvY2F0ZSwgd2UgZmluZCB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsCi0gICAgIGxpdmUgaW4gdGhlIG91dHB1dCBhbmQgYWRkIHRoYXQgaW4gKi8KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgQkZELiAgTG9vayBpdCB1cCBpbiB0aGUKLQkgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgd2hlbgotCSB3ZSBjb252ZXJ0IHRoaXMgc3R1ZmYgdG8gdXNlIGEgc3BlY2lmaWMgZmluYWxfbGluayBmdW5jdGlvbgotCSBhbmQgY2hhbmdlIHRoZSBpbnRlcmZhY2UgdG8gYmZkX3JlbGF4X3NlY3Rpb24gdG8gbm90IHJlcXVpcmUKLQkgdGhlIGdlbmVyaWMgc3ltYm9scy4gICovCi0gICAgICBoID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoaW5wdXRfc2VjdGlvbi0+b3duZXIsIGxpbmtfaW5mbywKLQkJCQkJYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwKLQkJCQkJZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JdmFsdWUgPSAoaC0+dS5kZWYudmFsdWUKLQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl2YWx1ZSA9IGgtPnUuYy5zaXplOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwKLQkJICBpbnB1dF9zZWN0aW9uLT5vd25lciwgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JICB2YWx1ZSA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKwotCXN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0JICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgfQotICAKLSAgLyogQWRkIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlbG9jYXRpb24gKi8KLSAgdmFsdWUgKz0gcmVsb2MtPmFkZGVuZDsKLSAgCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotdm9pZAotYmZkX3BlcmZvcm1fc2xpcChhYmZkLCBzbGlwLCBpbnB1dF9zZWN0aW9uLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2xpcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIEZpbmQgYWxsIHN5bWJvbHMgcGFzdCB0aGlzIHBvaW50LCBhbmQgbWFrZSB0aGVtIGtub3cKLSAgICAgd2hhdCdzIGhhcHBlbmVkICovCi0gIHdoaWxlICgqcykgCi0gICAgewotICAgICAgYXN5bWJvbCAqcCA9ICpzOwotICAgICAgaWYgKHAtPnNlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbikgCi0JewotCSAgLyogVGhpcyB3YXMgcG9pbnRpbmcgaW50byB0aGlzIHNlY3Rpb24sIHNvIG1hbmdsZSBpdCAqLwotCSAgaWYgKHAtPnZhbHVlID4gdmFsdWUpCi0JICAgIHsKLQkgICAgICBwLT52YWx1ZSAtPSBzbGlwOwotCSAgICAgIGlmIChwLT51ZGF0YS5wICE9IE5VTEwpCi0JCXsKLQkJICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBwLT51ZGF0YS5wOwotCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotCQkgIGgtPnJvb3QudS5kZWYudmFsdWUgLT0gc2xpcDsKLQkJICBCRkRfQVNTRVJUIChoLT5yb290LnUuZGVmLnZhbHVlID09IHAtPnZhbHVlKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgcysrOwotICAgIH0gICAgCi19Ci0KLWJvb2xlYW4gCi1iZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24gKGFiZmQsIGksIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmk7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGktPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGk7Ci0gIGludCAqc2hyaW5rczsKLSAgaW50IHNocmluayA9IDA7Ci0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIC8qIFdlIG9ubHkgZG8gZ2xvYmFsIHJlbGF4YXRpb24gb25jZS4gIEl0IGlzIG5vdCBzYWZlIHRvIGRvIGl0IG11bHRpcGxlCi0gICAgIHRpbWVzIChzZWUgZGlzY3Vzc2lvbiBvZiB0aGUgInNocmlua3MiIGFycmF5IGJlbG93KS4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jX3ZlY3RvciAmJiByZWxvY19zaXplID4gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2V0IHRoZSByZWxvY3MgYW5kIHRoaW5rIGFib3V0IHRoZW0gKi8KLSAgcmVsb2NfY291bnQgPQotICAgIGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NfdmVjdG9yLAotCQkJICAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgcmVsb2MxNi5jIGFuZCByZWxhdGVkIHJlbGF4aW5nIGNvZGUgaXMgdmVyeSBzaW1wbGUsIHRoZSBwcmljZQotICAgICBmb3IgdGhhdCBzaW1wbGljaXR5IGlzIHdlIGNhbiBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIGZvcgotICAgICBlYWNoIHNlY3Rpb24uCi0KLSAgICAgU28sIHRvIGdldCB0aGUgYmVzdCByZXN1bHRzIHdpdGhpbiB0aGF0IGxpbWl0YXRpb24sIHdlIGRvIG11bHRpcGxlCi0gICAgIHJlbGF4aW5nIHBhc3NlcyBvdmVyIGVhY2ggc2VjdGlvbiBoZXJlLiAgVGhhdCBpbnZvbHZlcyBrZWVwaW5nIHRyYWNrCi0gICAgIG9mIHRoZSAic2hyaW5rIiBhdCBlYWNoIHJlbG9jIGluIHRoZSBzZWN0aW9uLiAgVGhpcyBhbGxvd3MgdXMgdG8KLSAgICAgYWNjdXJhdGVseSBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIG9mIHR3byByZWxvY3Mgd2l0aGluCi0gICAgIHRoaXMgc2VjdGlvbi4KLQotICAgICBJbiB0aGVvcnksIGlmIHdlIGtlcHQgdGhlICJzaHJpbmtzIiBhcnJheSBmb3IgZWFjaCBzZWN0aW9uIGZvciB0aGUKLSAgICAgZW50aXJlIGxpbmssIHdlIGNvdWxkIHVzZSB0aGUgZ2VuZXJpYyByZWxheGluZyBjb2RlIGluIHRoZSBsaW5rZXIKLSAgICAgYW5kIGdldCBiZXR0ZXIgcmVzdWx0cywgcGFydGljdWxhcmx5IGZvciBqc3ItPmJzciBhbmQgMjQtPjE2IGJpdAotICAgICBtZW1vcnkgcmVmZXJlbmNlIHJlbGF4YXRpb25zLiAgKi8KLSAgICAgCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgaW50IGFub3RoZXJfcGFzcyA9IDA7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzaHJpbmtzIGFycmF5IGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgc2hyaW5rcyA9IChpbnQgKikgYmZkX21hbGxvYyAocmVsb2NfY291bnQgKiBzaXplb2YgKGludCkpOwotICAgICAgbWVtc2V0IChzaHJpbmtzLCAwLCByZWxvY19jb3VudCAqIHNpemVvZiAoaW50KSk7Ci0KLSAgICAgIC8qIExvb3AgdW50aWwgbm90aGluZyBjaGFuZ2VzIGluIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBkbyB7Ci0JYXJlbGVudCAqKnBhcmVudDsKLQl1bnNpZ25lZCBpbnQgaTsKLQlsb25nIGo7Ci0KLQlhbm90aGVyX3Bhc3MgPSAwOwotCi0JZm9yIChpID0gMCwgcGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50OyBwYXJlbnQrKywgaSsrKSAKLQkgIHsKLQkgICAgLyogTGV0IHRoZSB0YXJnZXQvbWFjaGluZSBkZXBlbmRlbnQgY29kZSBleGFtaW5lIGVhY2ggcmVsb2MKLQkgICAgICAgaW4gdGhpcyBzZWN0aW9uIGFuZCBhdHRlbXB0IHRvIHNocmluayBpdC4gICovCi0JICAgIHNocmluayA9IGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUgKGFiZmQsIGlucHV0X3NlY3Rpb24sICpwYXJlbnQsCi0JCQkJCQlzaHJpbmtzW2ldLCBsaW5rX2luZm8pOwotCi0JICAgIC8qIElmIGl0IHNocnVuaywgbm90ZSBpdCBpbiB0aGUgc2hyaW5rcyBhcnJheSBhbmQgc2V0IHVwIGZvcgotCSAgICAgICBhbm90aGVyIHBhc3MuICAqLwotCSAgICBpZiAoc2hyaW5rICE9IHNocmlua3NbaV0pCi0JICAgICAgewotCSAgICAgICAgYW5vdGhlcl9wYXNzID0gMTsKLQkJZm9yIChqID0gaSArIDE7IGogPCByZWxvY19jb3VudDsgaisrKQotCQkgIHNocmlua3Nbal0gKz0gc2hyaW5rIC0gc2hyaW5rc1tpXTsKLQkgICAgICB9Ci0JICB9Ci0gIAotICAgICAgfSB3aGlsZSAoYW5vdGhlcl9wYXNzKTsKLQotICAgICAgZnJlZSgoY2hhciAqKXNocmlua3MpOwotICAgIH0KLQotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgLT0gc2hyaW5rOyAgCi0gIGZyZWUoKGNoYXIgKilyZWxvY192ZWN0b3IpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYmZkX2J5dGUgKgotYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMoaW5fYWJmZCwKLQkJCQkJCWxpbmtfaW5mbywKLQkJCQkJCWxpbmtfb3JkZXIsCi0JCQkJCQlkYXRhLAotCQkJCQkJcmVsb2NhdGVhYmxlLAotCQkJCQkJc3ltYm9scykKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3I7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIElmIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBkb24ndCBib3RoZXIgdG8gcmVsYXguICAqLwotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGluX2FiZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLAotCQkJCQkJICAgICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICAvKiByZWFkIGluIHRoZSBzZWN0aW9uICovCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJIGRhdGEsCi0JCQkJIDAsCi0JCQkJIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAKLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MoKHNpemVfdCkgcmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NfdmVjdG9yICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLCAKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLAotCQkJCQlzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIAotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQgPSByZWxvY192ZWN0b3I7Ci0gICAgICBhcmVsZW50ICpyZWxvYyA7Ci0gICAgICB1bnNpZ25lZCBpbnQgZHN0X2FkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IHNyY19hZGRyZXNzID0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBydW47Ci0gICAgICB1bnNpZ25lZCBpbnQgaWR4OwotICAgIAotICAgICAgLyogRmluZCBob3cgbG9uZyBhIHJ1biB3ZSBjYW4gZG8gKi8KLSAgICAgIHdoaWxlIChkc3RfYWRkcmVzcyA8IGxpbmtfb3JkZXItPnNpemUpIAotCXsKLQkgIHJlbG9jID0gKnBhcmVudDsKLQkgIGlmIChyZWxvYykgCi0JICAgIHsKLQkgICAgICAvKiBOb3RlIHRoYXQgdGhlIHJlbGF4aW5nIGRpZG4ndCB0aWUgdXAgdGhlIGFkZHJlc3NlcyBpbiB0aGUKLQkJIHJlbG9jYXRpb24sIHNvIHdlIHVzZSB0aGUgb3JpZ2luYWwgYWRkcmVzcyB0byB3b3JrIG91dCB0aGUKLQkJIHJ1biBvZiBub24tcmVsb2NhdGVkIGRhdGEgKi8KLQkgICAgICBydW4gPSByZWxvYy0+YWRkcmVzcyAtIHNyY19hZGRyZXNzOwotCSAgICAgIHBhcmVudCsrOwotCSAgICB9Ci0JICBlbHNlIAotCSAgICB7Ci0JICAgICAgcnVuID0gbGlua19vcmRlci0+c2l6ZSAtIGRzdF9hZGRyZXNzOwotCSAgICB9Ci0JICAvKiBDb3B5IHRoZSBieXRlcyAqLwotCSAgZm9yIChpZHggPSAwOyBpZHggPCBydW47IGlkeCsrKQotCSAgICB7Ci0JICAgICAgZGF0YVtkc3RfYWRkcmVzcysrXSA9IGRhdGFbc3JjX2FkZHJlc3MrK107Ci0JICAgIH0KLSAgICAKLQkgIC8qIE5vdyBkbyB0aGUgcmVsb2NhdGlvbiAqLwotICAgIAotCSAgaWYgKHJlbG9jKSAKLQkgICAgewotCSAgICAgIGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgKGlucHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgICAgcmVsb2MsIGRhdGEsICZzcmNfYWRkcmVzcywKLQkJCQkJICAgICZkc3RfYWRkcmVzcyk7Ci0JICAgIH0gICAgCi0JfQotICAgIH0KLSAgZnJlZSgoY2hhciAqKXJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotfQotCmRpZmYgLS1naXQgYS9iZmQvcmlzY2l4LmMgYi9iZmQvcmlzY2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWIxOGMuLjAwMDAwMDAKLS0tIGEvYmZkL3Jpc2NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUklTQyBpWCAoQWNvcm4sIGFybSkgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFJJU0MgaVggb3ZlcmxvYWRzIHRoZSBNQUdJQyBmaWVsZCB0byBpbmRpY2F0ZSBtb3JlIHRoYW4ganVzdCB0aGUgdXN1YWwKLSAgIFtaTk9dTUFHSUMgdmFsdWVzLiAgQWxzbyBpbmNsdWRlZCBhcmUgc3F1ZWV6aW5nIGluZm9ybWF0aW9uIGFuZAotICAgc2hhcmVkIGxpYnJhcnkgdXNhZ2UuICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGNvbWUgZnJvbSB0aGUgbWFuIHBhZ2UuICAqLwotI2RlZmluZSBTSExJQkxFTiA2MAotCi0jZGVmaW5lIE1GX0lNUFVSRSAgICAgICAwMDIwMAotI2RlZmluZSBNRl9TUVVFRVpFRCAgICAgMDEwMDAKLSNkZWZpbmUgTUZfVVNFU19TTCAgICAgIDAyMDAwCi0jZGVmaW5lIE1GX0lTX1NMICAgICAgICAwNDAwMAotCi0vKiBDb21tb24gY29tYmluYXRpb25zLiAgKi8KLSNkZWZpbmUgSU1BR0lDICAgICAgICAgIChNRl9JTVBVUkV8Wk1BR0lDKSAgICAgIC8qIERlbWFuZCBsb2FkIChpbXB1cmUgdGV4dCkgKi8KLSNkZWZpbmUgU1BPTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfE9NQUdJQykgICAgIC8qIE9NQUdJQyB3aXRoIGxhcmdlIGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIG1heSBjb250YWluIGEgcmVmIHRvIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFyZWQgbGliIHJlcXVpcmVkIGJ5IHRoZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iamVjdC4gKi8KLSNkZWZpbmUgU0xPTUFHSUMgICAgICAgIChNRl9JU19TTHxPTUFHSUMpIC8qIEEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0ZXh0IHBvcnRpb24gb2YgdGhlIG9iamVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGFpbnMgIm92ZXJmbG93IHRleHQiIGZyb20gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzaGFyZWQgbGlicmFyeSB0byBiZSBsaW5rZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHdpdGggYW4gb2JqZWN0ICovCi0jZGVmaW5lIFFNQUdJQyAgICAgICAgICAoTUZfU1FVRUVaRUR8Wk1BR0lDKSAgICAvKiBTcWVlemVkIGRlbWFuZCBwYWdlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IFRoaXMgaW50ZXJwcmV0YXRpb24gb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNQUdJQyBzZWVtcyB0byBiZSBhdCB2YXJpYW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2l0aCB0aGF0IHVzZWQgb24gb3RoZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyY2hpdGVjdHVyZXMuICovCi0jZGVmaW5lIFNQWk1BR0lDICAgICAgICAoTUZfVVNFU19TTHxaTUFHSUMpICAgICAvKiBwcm9ncmFtIHdoaWNoIHVzZXMgc2wgKi8KLSNkZWZpbmUgU1BRTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfFFNQUdJQykgICAgIC8qIHNxZWV6ZWQgZGl0dG8gKi8KLSNkZWZpbmUgU0xaTUFHSUMgICAgICAgIChNRl9JU19TTHxaTUFHSUMpICAgICAgIC8qIHNoYXJlZCBsaWIgcGFydCBvZiBwcm9nICovCi0jZGVmaW5lIFNMUFpNQUdJQyAgICAgICAoTUZfVVNFU19TTHxTTFpNQUdJQykgICAvKiBzbCB3aGljaCB1c2VzIGFub3RoZXIgKi8KLQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2luZm8gJiBNRl9VU0VTX1NMKQotCi0vKiBPbmx5IGEgcHVyZSBPTUFHSUMgZmlsZSBoYXMgdGhlIG1pbmltYWwgaGVhZGVyICovCi0jZGVmaW5lIE5fVFhUT0ZGKHgpICAgICAgICAgICAgICAgICAgICAgXAotICgoeCkuYV9pbmZvID09IE9NQUdJQyA/IDMyICAgICAgICAgICAgIFwKLSAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMpID8gVEFSR0VUX1BBR0VfU0laRSAgXAotICA6IDk5OSkKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIC8qIFByb2dyYW1zIHdpdGggc2hhcmVkIGxpYnMgYXJlIGxvYWRlZCBhdCB0aGUgZmlyc3QgcGFnZSBhZnRlciBhbGwgdGhlICAgXAotICAgICAgdGV4dCBzZWdtZW50cyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgcHJvZ3JhbXMuICBXaXRob3V0IGxvb2tpbmcgdGhpcyAgICBcCi0gICAgICB1cCB3ZSBjYW4ndCBrbm93IGV4YWN0bHkgd2hhdCB0aGUgYWRkcmVzcyB3aWxsIGJlLiAgQSByZWFzb25hYmxlIGd1ZXNzIFwKLSAgICAgIGlzIHRoYXQgYV9lbnRyeSB3aWxsIGJlIGluIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBleGVjdXRhYmxlLiAgKi8gICAgICAgXAotICAgOiBOX1NIQVJFRF9MSUIoeCkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgOiBURVhUX1NUQVJUX0FERFIpCi0KLSNkZWZpbmUgTl9TWU1PRkYoeCkgXAotICAoTl9UWFRPRkYgKHgpICsgKHgpLmFfdGV4dCArICh4KS5hX2RhdGEgKyAoeCkuYV90cnNpemUgKyAoeCkuYV9kcnNpemUpCi0KLSNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGICh4KSArICh4KS5hX3N5bXMpCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDMyNzY4Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMzI3NjgKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2FybQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQocmlzY2l4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcmlzY2l4IgotI2RlZmluZSBOX0JBRE1BRyh4KSAoKCgoeCkuYV9pbmZvICYgfjAwNzIwMCkgIT0gWk1BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKCh4KS5hX2luZm8gJiB+MDA2MDAwKSAhPSBPTUFHSUMpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICgoeCkuYV9pbmZvICE9IE5NQUdJQykpCi0jZGVmaW5lIE5fTUFHSUMoeCkgKCh4KS5hX2luZm8gJiB+MDcyMDApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgXAotICB7CQkJCQkJCQkJICAgXAotICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJCSAgIFwKLSAgICBmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkJICAgXAotICAgIGlmIChhZGF0YShhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCQkJCSAgIFwKLSAgICAgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwkgICBcCi0gICAgCQkJCQkJCQkJICAgXAotICAgIGV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CSAgIFwKLSAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CQkJICAgXAotICAgIAkJCQkJCQkJCSAgIFwKLSAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgIFwKLQkJICAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkJICAgXAotICAgIGV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgXAotCQkgICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCQkgICBcCi0gICAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJCSAgIFwKLSAgICAJCQkJCQkJCQkgICBcCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgIFwKLSAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkJICAgXAotCSE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICBcCi0gICAgICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLSAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgXAotCQkJCQkJCQkJICAgXAotICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkJICAgXAotCSYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCQkJCSAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fU1lNT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmICghIE5BTUUoYW91dCx3cml0ZV9zeW1zKShhYmZkKSkgcmV0dXJuIGZhbHNlOwkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoISByaXNjaXhfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCSAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkJICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0gICAgICB9CQkJCQkJCQkJICAgXAotICB9Ci0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNiBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCSAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tdID0gewotICAvKiB0eXBlICAgICAgICAgICAgICBycyBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgIHNldG1hc2sgICAgcGNkb25lICovCi0gIEhPV1RPKCAwLCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwgICAgICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyggMSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLCAgICAgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCAyLCAgICAgICAgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDMsICAgICAgICAgICAgICAyLCAgMywgICAyNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgcmlzY2l4X2ZpeF9wY3JlbF8yNiAsICJBUk0yNiIsICAgICAgdHJ1ZSwgMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCA0LCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsICAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyggNSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8oIDYsICAgICAgICAgICAgICAwLCAgMiwgICAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AzMiIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPKCA3LCAgICAgICAgICAgICAgMiwgIDMsICAgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICByaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUsICJBUk0yNkQiLHRydWUsMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPKCA5LCAgICAgICAgICAgICAgMCwgLTEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUcxNiIsICAgICAgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDEwLCAgICAgICAgICAgICAgMCwgLTIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUczMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKQotfTsKLQotI2RlZmluZSBSSVNDSVhfVEFCTEVfU0laRSBcCi0gIChzaXplb2YgKHJpc2NpeF9zdGRfcmVsb2NfaG93dG8pIC8gc2l6ZW9mIChyZWxvY19ob3d0b190eXBlKSkKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFRoaXMgaXMgZGVhZCBzaW1wbGUgYXQgcHJlc2VudC4gICovCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJpc2NpeF9maXhfcGNyZWxfMjYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19jb250aW51ZSA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb25zIGFyZSBkaWZmZXJlbnQsIGFuZCB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24sCi0gICAgIGp1c3QgaWdub3JlIGl0IGZvciBub3cuICAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lICE9IGlucHV0X3NlY3Rpb24tPm5hbWUKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZWxvY2F0aW9uID0gKHRhcmdldCAmIDB4MDBmZmZmZmYpIDw8IDI7Ci0gIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIDB4MDIwMDAwMDApIC0gMHgwMjAwMDAwMDsgLyogU2lnbiBleHRlbmQgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcjsKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1s3XTsKLSAgCi0gIHJldHVybiBmbGFnOwotfQotCi1yZWxvY19ob3d0b190eXBlICoKLURFRlVOKHJpc2NpeF9yZWxvY190eXBlX2xvb2t1cCwoYWJmZCxjb2RlKSwKLSAgICAgIGJmZCAqYWJmZCBBTkQKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKQotewotI2RlZmluZSBBU1REKGksaikgICAgICAgY2FzZSBpOiByZXR1cm4gJnJpc2NpeF9zdGRfcmVsb2NfaG93dG9bal0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotICAgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgICAgfQotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTYsIDEpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAzKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOwotICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHNob3VsZF9ub3RfYmVfdXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCByaXNjaXhfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIHJpc2NpeF9jYW5vbmljYWxpemVfcmVsb2MKLSNkZWZpbmUgTVlfb2JqZWN0X3AgcmlzY2l4X29iamVjdF9wCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpyaXNjaXhfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLQotdm9pZAotcmlzY2l4X3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25lZyA9IDA7CS8qIE5lZ2F0aXZlIHJlbG9jcyB1c2UgdGhlIEJBU0VSRUwgYml0LiAgKi8KLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZSA7ICAgLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLwotICBpZiAocl9sZW5ndGggPCAwKQotICAgIHsKLSAgICAgIHJfbGVuZ3RoID0gLXJfbGVuZ3RoOwotICAgICAgcl9uZWcgPSAxOwotICAgIH0KLQotICByX3BjcmVsICA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsgLyogUmVsYXRpdmUgdG8gUEM/ICovCi0KLSAgLyogRm9yIFJJU0MgaVgsIGluIHBjLXJlbGF0aXZlIHJlbG9jcyB0aGUgcl9wY3JlbCBiaXQgbWVhbnMgdGhhdCB0aGUKLSAgICAgcmVsb2NhdGlvbiBoYXMgYmVlbiBkb25lIGFscmVhZHkgKE9ubHkgZm9yIHRoZSAyNi1iaXQgb25lIEkgdGhpbmspPz8/ISEhCi0gICAgICovCi0gIAotICBpZiAocl9sZW5ndGggPT0gMykKLSAgICByX3BjcmVsID0gcl9wY3JlbCA/IDAgOiAxOwotICAKLQotI2lmIDAKLSAgLyogRm9yIGEgc3RhbmRhcmQgcmVsb2MsIHRoZSBhZGRlbmQgaXMgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotI2VuZGlmCi0KLSAgLyogbmFtZSB3YXMgY2xvYmJlcmVkIGJ5IGFvdXRfd3JpdGVfc3ltcyB0byBiZSBzeW1ib2wgaW5kZXggKi8KLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgdGhlbiBzZXQgdGhlCi0gICAgIHJfaW5kZXggdG8gdGhlIHN5bWJvbHMgaW5kZXgsIGFuZCB0aGUgcl9leHRlcm4gYml0LgotCi0gICAgIEFic29sdXRlIHN5bWJvbHMgY2FuIGNvbWUgaW4gaW4gdHdvIHdheXMsIGVpdGhlciBhcyBhbiBvZmZzZXQKLSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24sIG9yIGFzIGEgc3ltYm9sIHdoaWNoIGhhcyBhbiBhYnMgdmFsdWUuCi0gICAgIGNoZWNrIGZvciB0aGF0IGhlcmUKLSAgICAgKi8KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24KLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbi5zeW1ib2wgPT0gc3ltKQotCXsKLQkgIC8qIFdob29wcywgbG9va2VkIGxpa2UgYW4gYWJzIHN5bWJvbCwgYnV0IGlzIHJlYWxseSBhbiBvZmZzZXQKLQkgICAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0JICByX2luZGV4ID0gMDsKLQkgIHJfZXh0ZXJuID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRmlsbCBpbiBzeW1ib2wgKi8KLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfaW5kZXggPSAoKmctPnN5bV9wdHJfcHRyKS0+dWRhdGEuaTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRzogMCkKLQkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzogMCkKLQkgfCAocl9uZWcgICAgPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHOiAwKQotCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLQkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTogMCkKLQkgfCAocl9uZWcgICAgPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFOiAwKQotCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotICAgIH0KLX0KLQotYm9vbGVhbgotcmlzY2l4X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgdW5zaWduZWQgY2hhciAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgZWFjaF9zaXplOwotICAKLSAgdW5zaWduZWQgaW50IGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHNpemVfdCBuYXRzaXplOwotCi0gIGlmIChjb3VudCA9PSAwKSByZXR1cm4gdHJ1ZTsKLQotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG5hdHNpemUgPSBlYWNoX3NpemUgKiBjb3VudDsKLSAgbmF0aXZlID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX3phbGxvYyAoYWJmZCwgbmF0c2l6ZSk7Ci0gIGlmICghbmF0aXZlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBnZW5lcmljID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0KLSAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0gICAgICAgY291bnQgIT0gMDsKLSAgICAgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0gICAgcmlzY2l4X3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgKmdlbmVyaWMsCi0JCQkgICAgICAgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLQotICBpZiAoIGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlKGFiZmQsIG5hdGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotICogVGhpcyBpcyBqdXN0IGxpa2UgdGhlIHN0YW5kYXJkIGFvdXR4LmggdmVyc2lvbiBidXQgd2UgbmVlZCB0byBkbyBvdXIKLSAqIG93biBtYXBwaW5nIG9mIGV4dGVybmFsIHJlbG9jIHR5cGUgdmFsdWVzIHRvIGhvd3RvIGVudHJpZXMuCi0gKi8KLWxvbmcKLU1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICAgYmZkICphYmZkOwotICAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQsIGM7Ci0gIGV4dGVybiByZWxvY19ob3d0b190eXBlIE5BTUUoYW91dCxzdGRfaG93dG9fdGFibGUpW107Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUsIHJldHVybiB0aGUgdmFsdWVzLiAqLwotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotCi0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspIHsKLSAgICAgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLSAgICB9Ci0gICAgKnJlbHB0ciA9IDA7Ci0gICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB9Ci0gIGlmICh0YmxwdHIgJiYgc2VjdGlvbi0+cmVsb2NfY291bnQpIHsKLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotCi0gIGlmICghTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKShhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLSAgICByZXR1cm4gLTE7Ci0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgLyogZml4IHVwIGhvd3RvIGVudHJpZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0gICAgewotICAgICAgYyA9IHRibHB0ci0+aG93dG8gLSBOQU1FKGFvdXQsc3RkX2hvd3RvX3RhYmxlKTsKLSAgICAgIEJGRF9BU1NFUlQgKGMgPCBSSVNDSVhfVEFCTEVfU0laRSk7Ci0gICAgICB0YmxwdHItPmhvd3RvID0gJnJpc2NpeF9zdGRfcmVsb2NfaG93dG9bY107Ci0KLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotLyogVGhpcyBpcyB0aGUgc2FtZSBhcyBOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSwgYnV0IGhhcyBkaWZmZXJlbnQgCi0gICBleHBhbnNpb25zIG9mIHRoZSBtYWNybyBkZWZpbml0aW9ucy4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotcmlzY2l4X3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgZXhlY3AsIGNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci17Ci0gIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICpyYXdwdHIsICpvbGRyYXdwdHI7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnJlc3VsdDsKLQotICByYXdwdHIgPSAoKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICAqKSAKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCApKSk7Ci0KLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIG9sZHJhd3B0ciA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YTsKLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotCi0gIC8qIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbGQgdGRhdGEgc3RydWN0LgotICAgICBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRoZSBzdWJmb3JtYXQsIHNpbmNlIGZvciBocHV4IGl0IHdhcyBzZXQgaW4KLSAgICAgaHAzMDBocHV4LmM6c3dhcF9leGVjX2hlYWRlcl9pbiBhbmQgd2lsbCBiZSB1c2VkIGluCi0gICAgIGhwMzAwaHB1eC5jOmNhbGxiYWNrLiAgKi8KLSAgaWYgKG9sZHJhd3B0ciAhPSBOVUxMKQotICAgICphYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSAqb2xkcmF3cHRyOwotCi0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIgPSAmcmF3cHRyLT5lOwotICAqKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIpID0gKmV4ZWNwOyAgICAgLyogQ29weSBpbiB0aGUgaW50ZXJuYWxfZXhlYwotCQkJCQkJICAgc3RydWN0ICovCi0gIGV4ZWNwID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcjsKLQotICAvKiBTZXQgdGhlIGZpbGUgZmxhZ3MgKi8KLSAgYWJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7Ci0gIGlmIChleGVjcC0+YV9kcnNpemUgfHwgZXhlY3AtPmFfdHJzaXplKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgLyogU2V0dGluZyBvZiBFWEVDX1AgaGFzIGJlZW4gZGVmZXJyZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzIGZ1bmN0aW9uICovCi0gIGlmIChleGVjcC0+YV9zeW1zKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0gIGlmIChOX0RZTkFNSUMoKmV4ZWNwKSkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0JCQkJCQkJCSAgCi0gIGlmICgoZXhlY3AtPmFfaW5mbyAmIE1GX1NRVUVFWkVEKSAhPSAwKSAvKiBTcXVlZXplZCBmaWxlcyBhcmVuJ3Qgc3VwcG9ydGVkIAotCQkJCQkgICAgICh5ZXQpISAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoZXhlY3AtPmFfaW5mbyAmIE1GX0lTX1NMKSAhPSAwKQkvKiBOb3IgYXJlIHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBaTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRCB8IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBOTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG5fbWFnaWM7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE9NQUdJQykKLSAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2hvdWxkIGhhdmUgYmVlbiBjaGVja2VkIHdpdGggTl9CQURNQUcgYmVmb3JlIHRoaXMgcm91dGluZQotICAgICAgICAgd2FzIGNhbGxlZC4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGV4ZWNwLT5hX2VudHJ5OwotCi0gIG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpID0gKGFvdXRfc3ltYm9sX3R5cGUgKilOVUxMOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGV4ZWNwLT5hX3N5bXMgLyBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0KLSAgLyogVGhlIGRlZmF1bHQgcmVsb2NhdGlvbiBlbnRyeSBzaXplIGlzIHRoYXQgb2YgdHJhZGl0aW9uYWwgVjcgVW5peC4gICovCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIC8qIFRoZSBkZWZhdWx0IHN5bWJvbCBlbnRyeSBzaXplIGlzIHRoYXQgb2YgdHJhZGl0aW9uYWwgVW5peC4gKi8KLSAgb2JqX3N5bWJvbF9lbnRyeV9zaXplIChhYmZkKSA9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0KLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpID0gTlVMTDsKLQotICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfZGF0YTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2JzczsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZsYWdzID0KLSAgICAoZXhlY3AtPmFfdHJzaXplICE9IDAKLSAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCi0gICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPQotICAgIChleGVjcC0+YV9kcnNpemUgIT0gMAotICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKLSAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DOwotCi0gIHJlc3VsdCA9ICgqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkoYWJmZCk7Ci0KLSNpZiBkZWZpbmVkKE1BQ0gpIHx8IGRlZmluZWQoU1RBVF9GT1JfRVhFQykKLSAgLyogVGhlIG9yaWdpbmFsIGhldXJpc3RpYyBkb2Vzbid0IHdvcmsgaW4gc29tZSBpbXBvcnRhbnQgY2FzZXMuIFRoZQotICAgKiBhLm91dCBmaWxlIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGV4dCBzdGFydCBhZGRyZXNzLiBGb3IKLSAgICogZmlsZXMgKGxpa2Uga2VybmVscykgbGlua2VkIHRvIG5vbi1zdGFuZGFyZCBhZGRyZXNzZXMgKGxkIC1UdGV4dAotICAgKiBubm4pIHRoZSBlbnRyeSBwb2ludCBtYXkgbm90IGJlIGJldHdlZW4gdGhlIGRlZmF1bHQgdGV4dCBzdGFydAotICAgKiAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgYW5kIChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSArIHRleHQgc2l6ZQotICAgKiBUaGlzIGlzIG5vdCBqdXN0IGEgbWFjaCBpc3N1ZS4gTWFueSBrZXJuZWxzIGFyZSBsb2FkZWQgYXQgbm9uCi0gICAqIHN0YW5kYXJkIGFkZHJlc3Nlcy4KLSAgICovCi0gIHsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKLSAgICBpZiAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTAotCSYmIChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpID09IDAKLSAgICAgICAgJiYgKGZzdGF0KGZpbGVubygoRklMRSAqKSAoYWJmZC0+aW9zdHJlYW0pKSwgJnN0YXRfYnVmKSA9PSAwKQotICAgICAgICAmJiAoKHN0YXRfYnVmLnN0X21vZGUgJiAwMTExKSAhPSAwKSkKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgfQotI2Vsc2UgLyogISBNQUNIICovCi0gIC8qIE5vdyB0aGF0IHRoZSBzZWdtZW50IGFkZHJlc3NlcyBoYXZlIGJlZW4gd29ya2VkIG91dCwgdGFrZSBhIGJldHRlcgotICAgICBndWVzcyBhdCB3aGV0aGVyIHRoZSBmaWxlIGlzIGV4ZWN1dGFibGUuICBJZiB0aGUgZW50cnkgcG9pbnQKLSAgICAgaXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFzc3VtZSBpdCBpcy4gIChUaGlzIG1ha2VzIGZpbGVzCi0gICAgIGV4ZWN1dGFibGUgZXZlbiBpZiB0aGVpciBlbnRyeSBwb2ludCBhZGRyZXNzIGlzIDAsIGFzIGxvbmcgYXMKLSAgICAgdGhlaXIgdGV4dCBzdGFydHMgYXQgemVyby4pCi0KLSAgICAgQXQgc29tZSBwb2ludCB3ZSBzaG91bGQgcHJvYmFibHkgYnJlYWsgZG93biBhbmQgc3RhdCB0aGUgZmlsZSBhbmQKLSAgICAgZGVjbGFyZSBpdCBleGVjdXRhYmxlIGlmIChvbmUgb2YpIGl0cyAneCcgYml0cyBhcmUgb24uLi4gICovCi0gIGlmICgoZXhlY3AtPmFfZW50cnkgPj0gb2JqX3RleHRzZWMoYWJmZCktPnZtYSkgJiYKLSAgICAgIChleGVjcC0+YV9lbnRyeSA8IG9ial90ZXh0c2VjKGFiZmQpLT52bWEgKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKSkKLSAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0jZW5kaWYgLyogTUFDSCAqLwotICBpZiAocmVzdWx0KQotICAgIHsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcmVlIChyYXdwdHIpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gb2xkcmF3cHRyOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShvYmplY3RfcCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsgICAgICAvKiBSYXcgZXhlYyBoZWFkZXIgZnJvbSBmaWxlICovCi0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7ICAgICAgICAgICAgLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotICAgICAgIT0gRVhFQ19CWVRFU19TSVpFKSB7Ci0gICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBleGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOwotCi0gIGlmIChOX0JBRE1BRyAoZXhlYykpIHJldHVybiAwOwotI2lmZGVmIE1BQ0hUWVBFX09LCi0gIGlmICghKE1BQ0hUWVBFX09LIChOX01BQ0hUWVBFIChleGVjKSkpKSByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKShhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0gIHRhcmdldCA9IHJpc2NpeF9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZleGVjLCBNWShjYWxsYmFjaykpOwotCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvcnM2MDAwLWNvcmUuYyBiL2JmZC9yczYwMDAtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjA1NTVmLi4wMDAwMDAwCi0tLSBhL2JmZC9yczYwMDAtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8qIElCTSBSUy82MDAwICJYQ09GRiIgYmFjay1lbmQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSwgCi0gICAgIGFuZCBKb2huIEdpbG1vcmUuCi0gICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLSAgIENvbnRyaWJ1dGVkIGJ5IElCTSBDb3Jwb3JhdGlvbiBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBwb3J0IGN1cnJlbnRseSBvbmx5IGhhbmRsZXMgcmVhZGluZyBvYmplY3QgZmlsZXMsIGV4Y2VwdCB3aGVuCi0gICBjb21waWxlZCBvbiBhbiBSUy82MDAwIGhvc3QuICAtLSBubyBhcmNoaXZlIHN1cHBvcnQsIG5vIGNvcmUgZmlsZXMuCi0gICBJbiBhbGwgY2FzZXMsIGl0IGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZy4KLQotICAgRklYTUVtZ28gY29tbWVudHMgYXJlIGxlZnQgZnJvbSBNZXRpbiBPemlzaWsncyBvcmlnaW5hbCBwb3J0LgotCi0gICBUaGlzIGlzIGluIGEgc2VwYXJhdGUgZmlsZSBmcm9tIGNvZmYtcnM2MDAwLmMsIGJlY2F1c2UgaXQgaW5jbHVkZXMKLSAgIHN5c3RlbSBpbmNsdWRlIGZpbGVzIHRoYXQgY29uZmxpY3Qgd2l0aCBjb2ZmL3JzNjAwMC5oLgotICAqLwotCi0vKiBJbnRlcm5hbGNvZmYuaCBhbmQgY29mZmNvZGUuaCBtb2RpZnkgdGhlbXNlbHZlcyBiYXNlZCBvbiB0aGlzIGZsYWcuICAqLwotI2RlZmluZSBSUzYwMDBDT0ZGX0MgMQotCi0vKiBUaGUgQUlYIDQuMSBrZXJuZWwgaXMgb2J2aW91c2x5IGNvbXBpbGVkIHdpdGggLURfTE9OR19MT05HLCBzbwotICAgd2UgaGF2ZSB0byBkZWZpbmUgX0xPTkdfTE9ORyBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgZ2NjIHRvIGdldCB0aGUKLSAgIHByb3BlciBhbGlnbm1lbnRzIGluIHRoZSB1c2VyIHN0cnVjdHVyZS4gICovCi0jaWYgZGVmaW5lZChfQUlYNDEpICYmICFkZWZpbmVkKF9MT05HX0xPTkcpCi0jZGVmaW5lIF9MT05HX0xPTkcKLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZmRlZiBBSVhfQ09SRQotCi0vKiBBT1VUSERSIGlzIGRlZmluZWQgYnkgdGhlIGFib3ZlLiAgV2UgbmVlZCBhbm90aGVyIGRlZm4gb2YgaXQsIGZyb20gdGhlCi0gICBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gIFB1bnQgdGhlIG9sZCBvbmUgYW5kIGdldCB1cyBhIG5ldyBuYW1lIGZvciB0aGUKLSAgIHR5cGVkZWYgaW4gdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgKi8KLSNpZmRlZiBBT1VUSERSCi0jdW5kZWYgQU9VVEhEUgotI2VuZGlmCi0jZGVmaW5lCUFPVVRIRFIJc2Vjb25kX0FPVVRIRFIKLQotI3VuZGVmCVNDTkhEUgotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJU3VwcG9ydCBmb3IgY29yZSBmaWxlIHN0dWZmLi4gCQkJCQkgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSNpbmNsdWRlIDxzeXMvbGRyLmg+Ci0jaW5jbHVkZSA8c3lzL2NvcmUuaD4KLQotCi0vKiBOdW1iZXIgb2Ygc3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVycyBzdXBwb3J0ZWQgYnkgZ2RiLiAgVGhpcyB2YWx1ZQotICAgc2hvdWxkIG1hdGNoIGB0bS5oJyBpbiBnZGIgZGlyZWN0b3J5LiAgQ2xlYW4gdGhpcyBtZXNzIHVwIGFuZCB1c2UKLSAgIHRoZSBtYWNyb3MgaW4gc3lzL3JlZy5oLiAgRklYTUVtZ28uICovCi0KLSNkZWZpbmUJTlVNX09GX1NQRUNfUkVHUyAgNwotCi0jZGVmaW5lCWNvcmVfaGRyKGJmZCkJCSgoKFJzNmtDb3JEYXRhKikoYmZkLT50ZGF0YS5hbnkpKS0+aGRyKQotCi0vKiBBSVggNC4xIENoYW5nZWQgdGhlIG5hbWVzIGFuZCBsb2NhdGlvbnMgb2YgYSBmZXcgaXRlbXMgaW4gdGhlIGNvcmUgZmlsZSwKLSAgIHRoaXMgc2VlbXMgdG8gYmUgdGhlIHF1aWNrZXN0IGVhc2lldCB3YXkgdG8gZGVhbCB3aXRoIGl0LiAKLQotICAgTm90ZSBob3dldmVyIHRoYXQgZW5jb2RpbmcgbWFnaWMgYWRkcmVzc2VzIChTVEFDS19FTkRfQUREUikgaXMgZ29pbmcKLSAgIHRvIGJlIF92ZXJ5XyBmcmFnaWxlLiAgQnV0IEkgZG9uJ3Qgc2VlIGFueSBlYXN5IHdheSB0byBnZXQgdGhhdCBpbmZvCi0gICByaWdodCBub3cuICAqLwotI2lmZGVmIENPUkVfVkVSU0lPTl8xCi0jZGVmaW5lIENPUkVfREFUQV9TSVpFX0ZJRUxEIGNfdS5VX2RzaXplCi0jZGVmaW5lIENPUkVfQ09NTV9GSUVMRCBjX3UuVV9jb21tCi0jZGVmaW5lIFNBVkVfRklFTEQgY19tc3QKLSNkZWZpbmUJU1RBQ0tfRU5EX0FERFIgMHgyZmYyMzAwMAotI2Vsc2UKLSNkZWZpbmUgQ09SRV9EQVRBX1NJWkVfRklFTEQgY191LnVfZHNpemUKLSNkZWZpbmUgQ09SRV9DT01NX0ZJRUxEIGNfdS51X2NvbW0KLSNkZWZpbmUgU0FWRV9GSUVMRCBjX3UudV9zYXZlCi0jZGVmaW5lCVNUQUNLX0VORF9BRERSIDB4MmZmODAwMDAKLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QgY29yZV9kdW1wIGhkcjsJCS8qIGNvcmUgZmlsZSBoZWFkZXIgKi8KLX0gUnM2a0NvckRhdGE7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgZmxhZ3dvcmQsCi0JCQkJCSAgICBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hLCBmaWxlX3B0cikpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDg7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi0vKiBEZWNpZGUgaWYgYSBnaXZlbiBiZmQgcmVwcmVzZW50cyBhIGBjb3JlJyBmaWxlIG9yIG5vdC4gVGhlcmUgcmVhbGx5IGlzIG5vCi0gICBtYWdpYyBudW1iZXIgb3IgYW55dGhpbmcgbGlrZSwgaW4gcnM2MDAwY29mZi4gKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1yczYwMDBjb2ZmX2NvcmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgY29yZV9kdW1wIGNvcmVkYXRhOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICBiZmRfc2l6ZV90eXBlIG5yZWFkOwotICBjaGFyICp0bXBwdHI7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkICgmY29yZWRhdGEsIDEsIHNpemVvZiAoc3RydWN0IGNvcmVfZHVtcCksIGFiZmQpOwotICBpZiAobnJlYWQgIT0gc2l6ZW9mIChzdHJ1Y3QgY29yZV9kdW1wKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGNvcmUgZmlsZSB1bGltaXQgaXMgdG9vIHNtYWxsLCB0aGUgc3lzdGVtIHdpbGwgZmlyc3QKLSAgICAgb21pdCB0aGUgZGF0YSBzZWdtZW50LCB0aGVuIG9taXQgdGhlIHN0YWNrLCB0aGVuIGRlY2xpbmUgdG8KLSAgICAgZHVtcCBjb3JlIGFsdG9nZXRoZXIgKGFzIGZhciBhcyBJIGtub3cgVUJMT0NLX1ZBTElEIGFuZCBMRV9WQUxJRAotICAgICBhcmUgYWx3YXlzIHNldCkgKHRoaXMgaXMgYmFzZWQgb24gZXhwZXJpbWVudGF0aW9uIG9uIEFJWCAzLjIpLgotICAgICBOb3csIHRoZSB0aGluZyBpcyB0aGF0IEdEQiB1c2VycyB3aWxsIGJlIHN1cnByaXNlZAotICAgICBpZiBzZWdtZW50cyBqdXN0IHNpbGVudGx5IGRvbid0IGFwcGVhciAod2VsbCwgbWF5YmUgdGhleSB3b3VsZAotICAgICB0aGluayB0byBjaGVjayAiaW5mbyBmaWxlcyIsIEkgZG9uJ3Qga25vdykuCi0KLSAgICAgRm9yIHRoZSBkYXRhIHNlZ21lbnQsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBrZWVwIGdvaW5nIGlmIGl0J3MKLSAgICAgbm90IHRoZXJlLCBzaW5jZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBub3QgdG8gZHVtcCBpdCAocmVnYXJkbGVzcwotICAgICBvZiB0aGUgdWxpbWl0LCBpdCdzIGJhc2VkIG9uIFNBX0ZVTExEVU1QKS4gIEJ1dCBmb3IgdGhlIHN0YWNrIHNlZ21lbnQsCi0gICAgIGlmIGl0J3Mgbm90IHRoZXJlLCB3ZSByZWZ1c2UgdG8gaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoaXMgY29yZQotICAgICBmaWxlLiAgVGhlIHVzZWZ1bG5lc3Mgb2YgYSBjb3JlIGR1bXAgd2l0aG91dCBhIHN0YWNrIHNlZ21lbnQgaXMgcHJldHR5Ci0gICAgIGxpbWl0ZWQgYW55d2F5LiAgKi8KLSAgICAgCi0gIGlmICghKGNvcmVkYXRhLmNfZmxhZyAmIFVCTE9DS19WQUxJRCkKLSAgICAgIHx8ICEoY29yZWRhdGEuY19mbGFnICYgTEVfVkFMSUQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghKGNvcmVkYXRhLmNfZmxhZyAmIFVTVEFDS19WQUxJRCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBEb24ndCBjaGVjayB0aGUgY29yZSBmaWxlIHNpemUgZm9yIGEgZnVsbCBjb3JlLCBBSVggNC4xIGluY2x1ZGVzCi0gICAgIGFkZGl0aW9uYWwgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbnMgaW4gYSBmdWxsIGNvcmUuICAqLwotICBpZiAoIShjb3JlZGF0YS5jX2ZsYWcgJiAoRlVMTF9DT1JFIHwgQ09SRV9UUlVOQykpCi0gICAgICAmJiAoKGJmZF92bWEpY29yZWRhdGEuY19zdGFjayArIGNvcmVkYXRhLmNfc2l6ZSkgIT0gc3RhdGJ1Zi5zdF9zaXplKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBzaXplIGlzIHdyb25nLCBpdCBtZWFucyB3ZSdyZSBtaXNpbnRlcnByZXRpbmcgc29tZXRoaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayBvbiB0aGUgY190YWIgZmllbGQuICAqLwotICBpZiAoKHVfbG9uZykgY29yZWRhdGEuY190YWIgPCBzaXplb2YgY29yZWRhdGEgfHwKLSAgICAgICh1X2xvbmcpIGNvcmVkYXRhLmNfdGFiID49IHN0YXRidWYuc3Rfc2l6ZSB8fAotICAgICAgKGxvbmcpIGNvcmVkYXRhLmNfdGFiID49IChsb25nKWNvcmVkYXRhLmNfc3RhY2spCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSXNzdWUgd2FybmluZyBpZiB0aGUgY29yZSBmaWxlIHdhcyB0cnVuY2F0ZWQgZHVyaW5nIHdyaXRpbmcuICAqLwotICBpZiAoY29yZWRhdGEuY19mbGFnICYgQ09SRV9UUlVOQykKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB3YXJuaW5nIGNvcmUgZmlsZSB0cnVuY2F0ZWQiKSwKLQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAvKiBBbGxvY2F0ZSBjb3JlIGZpbGUgaGVhZGVyLiAgKi8KLSAgdG1wcHRyID0gKGNoYXIqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKFJzNmtDb3JEYXRhKSk7Ci0gIGlmICghdG1wcHRyKQotICAgIHJldHVybiBOVUxMOwotICAgICAgCi0gIHNldF90ZGF0YSAoYWJmZCwgdG1wcHRyKTsKLQotICAvKiBDb3B5IGNvcmUgZmlsZSBoZWFkZXIuICAqLwotICBjb3JlX2hkciAoYWJmZCkgPSBjb3JlZGF0YTsKLQotICAvKiAuc3RhY2sgc2VjdGlvbi4gKi8KLSAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0gIAkJCSAgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgY29yZWRhdGEuY19zaXplLAotCQkJICAoYmZkX3ZtYSkgKFNUQUNLX0VORF9BRERSIC0gY29yZWRhdGEuY19zaXplKSwKLQkJCSAgKGZpbGVfcHRyKSBjb3JlZGF0YS5jX3N0YWNrKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiAucmVnIHNlY3Rpb24gZm9yIEdQUnMgYW5kIHNwZWNpYWwgcmVnaXN0ZXJzLiAqLwotICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0gIAkJCSAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgKGJmZF9zaXplX3R5cGUpICgoMzIgKyBOVU1fT0ZfU1BFQ19SRUdTKSAqIDQpLAotCQkJICAoYmZkX3ZtYSkgMCwKLQkJCSAgKGZpbGVfcHRyKSAoKGNoYXIgKikgJmNvcmVkYXRhLlNBVkVfRklFTEQKLQkJCQkgICAgICAtIChjaGFyICopICZjb3JlZGF0YSkpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIC5yZWcyIHNlY3Rpb24gZm9yIEZQUnMgKGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycykuICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnMiIsCi0gIAkJCSAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgKGJmZF9zaXplX3R5cGUpIDggKiAzMiwJLyogMzIgRlBScy4gKi8KLQkJCSAgKGJmZF92bWEpIDAsCi0JCQkgIChmaWxlX3B0cikgKChjaGFyICopICZjb3JlZGF0YS5TQVZFX0ZJRUxELmZwclswXQotCQkJCSAgICAgIC0gKGNoYXIgKikgJmNvcmVkYXRhKSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogLmxkaW5mbyBzZWN0aW9uLgotICAgICBUbyBhY3R1YWxseSBmaW5kIG91dCBob3cgbG9uZyB0aGlzIHNlY3Rpb24gaXMgaW4gdGhpcyBwYXJ0aWN1bGFyCi0gICAgIGNvcmUgZHVtcCB3b3VsZCByZXF1aXJlIGdvaW5nIGRvd24gdGhlIHdob2xlIGxpc3Qgb2Ygc3RydWN0IGxkX2luZm8ncy4KLSAgICAgU2VlIGlmIHdlIGNhbiBqdXN0IGZha2UgaXQuICAqLwotICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmxkaW5mbyIsCi0gIAkJCSAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgKGJmZF9zaXplX3R5cGUpIDB4N2ZmZmZmZmYsCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfdGFiKSkKLSAgICByZXR1cm4gTlVMTDsKLQotI2lmbmRlZiBDT1JFX1ZFUlNJT05fMQotICAvKiAuZGF0YSBzZWN0aW9uIGlmIHByZXNlbnQuCi0gICAgIEFJWCAzIGR1bXBzIHRoZSBjb21wbGV0ZSBkYXRhIHNlY3Rpb24gYW5kIHNldHMgRlVMTF9DT1JFIGlmIHRoZQotICAgICB1bGltaXQgaXMgbGFyZ2UgZW5vdWdoLCBvdGhlcndpc2UgdGhlIGRhdGEgc2VjdGlvbiBpcyBvbWl0dGVkLgotICAgICBBSVggNCBzZXRzIEZVTExfQ09SRSBldmVuIGlmIHRoZSBjb3JlIGZpbGUgaXMgdHJ1bmNhdGVkLCB3ZSBoYXZlCi0gICAgIHRvIGV4YW1pbmUgY29yZWRhdGEuY19kYXRhc2l6ZSBiZWxvdyB0byBmaW5kIG91dCB0aGUgYWN0dWFsIHNpemUgb2YKLSAgICAgdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotICBpZiAoY29yZWRhdGEuY19mbGFnICYgRlVMTF9DT1JFKQotICAgIHsKLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkgICAgICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAoYmZkX3NpemVfdHlwZSkgY29yZWRhdGEuQ09SRV9EQVRBX1NJWkVfRklFTEQsCi0JCQkgICAgICAoYmZkX3ZtYSkKLQkJCQlDREFUQV9BRERSIChjb3JlZGF0YS5DT1JFX0RBVEFfU0laRV9GSUVMRCksCi0JCQkgICAgICAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfc3RhY2sgKyBjb3JlZGF0YS5jX3NpemUpKQotCXJldHVybiBOVUxMOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09SRV9WRVJTSU9OXzEKLSAgLyogQUlYIDQgYWRkcyBkYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMgdG8gdGhlIGNvcmUgZmlsZSwKLSAgICAgd2hpY2ggY2FuIGJlIGZvdW5kIGJ5IGV4YW1pbmluZyBsZGluZm8sIGFuZCBhbm9ueW1vdXNseSBtbWFwcGVkCi0gICAgIHJlZ2lvbnMuICAqLwotICB7Ci0gICAgc3RydWN0IGxkX2luZm8gbGRpbmZvOwotICAgIGJmZF9zaXplX3R5cGUgbGRpbmZvX3NpemU7Ci0gICAgZmlsZV9wdHIgbGRpbmZvX29mZnNldCA9IChmaWxlX3B0cikgY29yZWRhdGEuY190YWI7Ci0KLSAgICAvKiAuZGF0YSBzZWN0aW9uIGZyb20gZXhlY3V0YWJsZS4gICovCi0gICAgaWYgKGNvcmVkYXRhLmNfZGF0YXNpemUpCi0gICAgICB7Ci0JaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCQlTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJKGJmZF9zaXplX3R5cGUpIGNvcmVkYXRhLmNfZGF0YXNpemUsCi0JCQkJKGJmZF92bWEpCi0JCQkJICBDREFUQV9BRERSIChjb3JlZGF0YS5DT1JFX0RBVEFfU0laRV9GSUVMRCksCi0JCQkJKGZpbGVfcHRyKSBjb3JlZGF0YS5jX2RhdGEpKQotCSAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgICAvKiAuZGF0YSBzZWN0aW9ucyBmcm9tIGxvYWRlZCBvYmplY3RzLiAgKi8KLSAgICBsZGluZm9fc2l6ZSA9IChjaGFyICopICZsZGluZm8ubGRpbmZvX2ZpbGVuYW1lWzBdCi0JCSAgLSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19uZXh0OwotICAgIHdoaWxlICgxKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgbGRpbmZvX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoYmZkX3JlYWQgKCZsZGluZm8sIGxkaW5mb19zaXplLCAxLCBhYmZkKSAhPSBsZGluZm9fc2l6ZSkKLQkgIHJldHVybiBOVUxMOwotCWlmIChsZGluZm8ubGRpbmZvX2NvcmUpCi0JICB7Ci0JICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCQkgICAgKGJmZF9zaXplX3R5cGUpIGxkaW5mby5sZGluZm9fZGF0YXNpemUsCi0JCQkJICAgIChiZmRfdm1hKSBsZGluZm8ubGRpbmZvX2RhdGFvcmcsCi0JCQkJICAgIChmaWxlX3B0cikgbGRpbmZvLmxkaW5mb19jb3JlKSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgIH0KLQlpZiAobGRpbmZvLmxkaW5mb19uZXh0ID09IDApCi0JICBicmVhazsKLQlsZGluZm9fb2Zmc2V0ICs9IGxkaW5mby5sZGluZm9fbmV4dDsKLSAgICAgIH0KLQotICAgIC8qIC52bWRhdGEgc2VjdGlvbnMgZnJvbSBhbm9ueW1vdXNseSBtbWFwcGVkIHJlZ2lvbnMuICAqLwotICAgIGlmIChjb3JlZGF0YS5jX3ZtcmVnaW9ucykKLSAgICAgIHsKLQlpbnQgaTsKLQotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBjb3JlZGF0YS5jX3ZtbSwgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3JlZGF0YS5jX3ZtcmVnaW9uczsgaSsrKQotCSAgewotCSAgICBzdHJ1Y3Qgdm1faW5mbyB2bWluZm87Ci0KLQkgICAgaWYgKGJmZF9yZWFkICgmdm1pbmZvLCBzaXplb2YgKHZtaW5mbyksIDEsIGFiZmQpICE9IHNpemVvZiAodm1pbmZvKSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgaWYgKHZtaW5mby52bWluZm9fb2Zmc2V0KQotCSAgICAgIHsKLQkJaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi52bWRhdGEiLAotCQkJCQlTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCShiZmRfc2l6ZV90eXBlKSB2bWluZm8udm1pbmZvX3NpemUsCi0JCQkJCShiZmRfdm1hKSB2bWluZm8udm1pbmZvX2FkZHIsCi0JCQkJCShmaWxlX3B0cikgdm1pbmZvLnZtaW5mb19vZmZzZXQpKQotCQkgIHJldHVybiBOVUxMOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7CQkJCS8qIHRoaXMgaXMgZ2FyYmFnZSBmb3Igbm93LiAqLwotfQotCi0KLQotLyogcmV0dXJuIGB0cnVlJyBpZiBnaXZlbiBjb3JlIGlzIGZyb20gdGhlIGdpdmVuIGV4ZWN1dGFibGUuLiAqLwotYm9vbGVhbgotcnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZDsKLSAgICAgYmZkICpleGVjX2JmZDsKLXsKLSAgc3RydWN0IGNvcmVfZHVtcCBjb3JlZGF0YTsKLSAgc3RydWN0IGxkX2luZm8gbGRpbmZvOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGNoYXIgKnBhdGgsICpzOwotICBzaXplX3QgYWxsb2M7Ci0gIGNvbnN0IGNoYXIgKnN0cjEsICpzdHIyOwotICBib29sZWFuIHJldDsKLQotICBpZiAoYmZkX3NlZWsgKGNvcmVfYmZkLCAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKCZjb3JlZGF0YSwgc2l6ZW9mIGNvcmVkYXRhLCAxLCBjb3JlX2JmZCkgIT0gc2l6ZW9mIGNvcmVkYXRhKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGNvcmVfYmZkLCAobG9uZykgY29yZWRhdGEuY190YWIsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzaXplID0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fZmlsZW5hbWVbMF0gLSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19uZXh0OwotICBpZiAoYmZkX3JlYWQgKCZsZGluZm8sIHNpemUsIDEsIGNvcmVfYmZkKSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhbGxvYyA9IDEwMDsKLSAgcGF0aCA9IGJmZF9tYWxsb2MgKGFsbG9jKTsKLSAgaWYgKHBhdGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHMgPSBwYXRoOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAocywgMSwgMSwgY29yZV9iZmQpICE9IDEpCi0JewotCSAgZnJlZSAocGF0aCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICArK3M7Ci0gICAgICBpZiAocyA9PSBwYXRoICsgYWxsb2MpCi0JewotCSAgY2hhciAqbjsKLQotCSAgYWxsb2MgKj0gMjsKLQkgIG4gPSBiZmRfcmVhbGxvYyAocGF0aCwgYWxsb2MpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHBhdGgpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgcyA9IG4gKyAocGF0aCAtIHMpOwotCSAgcGF0aCA9IG47Ci0JfQotICAgIH0KLSAgCi0gIHN0cjEgPSBzdHJyY2hyIChwYXRoLCAnLycpOwotICBzdHIyID0gc3RycmNociAoZXhlY19iZmQtPmZpbGVuYW1lLCAnLycpOwotCi0gIC8qIHN0ZXAgb3ZlciBjaGFyYWN0ZXIgJy8nICovCi0gIHN0cjEgPSBzdHIxICE9IE5VTEwgPyBzdHIxICsgMSA6IHBhdGg7Ci0gIHN0cjIgPSBzdHIyICE9IE5VTEwgPyBzdHIyICsgMSA6IGV4ZWNfYmZkLT5maWxlbmFtZTsKLQotICBpZiAoc3RyY21wIChzdHIxLCBzdHIyKSA9PSAwKQotICAgIHJldCA9IHRydWU7Ci0gIGVsc2UKLSAgICByZXQgPSBmYWxzZTsKLQotICBmcmVlIChwYXRoKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1jaGFyICoKLXJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpjb20gPSBjb3JlX2hkciAoYWJmZCkuQ09SRV9DT01NX0ZJRUxEOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS5jX3NpZ25vOwotfQotCi0KLWJvb2xlYW4KLXJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gICAgaWYgKGNvdW50ID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAvKiBSZWFkaW5nIGEgY29yZSBmaWxlJ3Mgc2VjdGlvbnMgd2lsbCBiZSBzbGlnaHRseSBkaWZmZXJlbnQuIEZvciB0aGUKLSAgICAgICByZXN0IG9mIHRoZW0gd2UgY2FuIHVzZSBiZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAoKSBJIHN1cHBvc2UuICovCi0gICAgLyogTWFrZSBzdXJlIHRoaXMgcm91dGluZSB3b3JrcyBmb3IgYW55IGJmZCBhbmQgYW55IHNlY3Rpb24uIEZJWE1FbWdvLiAqLwotCi0gICAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfY29yZSAmJiBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIucmVnIikgPT0gMCkgewotCi0gICAgICBzdHJ1Y3QgbXN0c2F2ZSBtc3RhdHVzOwotICAgICAgaW50ICAgIHJlZ29mZnNldCA9IChjaGFyKikmbXN0YXR1cy5ncHJbMF0gLSAoY2hhciopJm1zdGF0dXM7Ci0KLSAgICAgIC8qIEFzc2VydCB0aGF0IHRoZSBvbmx5IHdheSB0aGlzIGNvZGUgd2lsbCBiZSBleGVjdXRlZCBpcyByZWFkaW5nIHRoZQotICAgICAgICAgd2hvbGUgc2VjdGlvbi4gKi8KLSAgICAgIGlmIChvZmZzZXQgfHwgY291bnQgIT0gKHNpemVvZihtc3RhdHVzLmdwcikgKyAoNCAqIE5VTV9PRl9TUEVDX1JFR1MpKSkKLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAoXygiRVJST1IhIGluIHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMoKVxuIikpOwotCi0gICAgICAvKiBmb3IgYC5yZWcnIHNlY3Rpb24sIGBmaWxlcG9zJyBpcyBhIHBvaW50ZXIgdG8gdGhlIGBtc3RzYXZlJyBzdHJ1Y3R1cmUKLSAgICAgICAgIGluIHRoZSBjb3JlIGZpbGUuICovCi0KLSAgICAgIC8qIHJlYWQgR1BSJ3MgaW50byB0aGUgbG9jYXRpb24uICovCi0gICAgICBpZiAoIGJmZF9zZWVrKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyByZWdvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMQotCXx8IGJmZF9yZWFkKGxvY2F0aW9uLCBzaXplb2YgKG1zdGF0dXMuZ3ByKSwgMSwgYWJmZCkgIT0gc2l6ZW9mIChtc3RhdHVzLmdwcikpCi0JcmV0dXJuIChmYWxzZSk7IC8qIG9uIGVycm9yICovCi0KLSAgICAgIC8qIGluY3JlbWVudCBsb2NhdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHNwZWNpYWwgcmVnaXN0ZXJzIGluIHRoZSBzZWN0aW9uLAotICAgICAgICAgcmVzZXQgcmVnaXN0ZXIgb2Zmc2V0IHZhbHVlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlyc3Qgc3BlY2lhbCByZWdpc3RlcgotCSBpbiBtc3RzYXZlIHN0cnVjdHVyZSwgYW5kIHJlYWQgc3BlY2lhbCByZWdpc3RlcnMuICovCi0KLSAgICAgIGxvY2F0aW9uID0gKFBUUikgKChjaGFyKilsb2NhdGlvbiArIHNpemVvZiAobXN0YXR1cy5ncHIpKTsKLSAgICAgIHJlZ29mZnNldCA9IChjaGFyKikmbXN0YXR1cy5pYXIgLSAoY2hhciopJm1zdGF0dXM7Ci0KLSAgICAgIGlmICggYmZkX3NlZWsoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIHJlZ29mZnNldCwgU0VFS19TRVQpID09IC0xCi0JfHwgYmZkX3JlYWQobG9jYXRpb24sIDQgKiBOVU1fT0ZfU1BFQ19SRUdTLCAxLCBhYmZkKSAhPSAKLQkJCQkJCQk0ICogTlVNX09GX1NQRUNfUkVHUykKLQlyZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLSAgICAgIAotICAgICAgLyogaW5jcmVtZW50IGxvY2F0aW9uIGFkZHJlc3MsIGFuZCByZWFkIHRoZSBzcGVjaWFsIHJlZ2lzdGVycy4uICovCi0gICAgICAvKiBGSVhNRW1nbyAqLwotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiBlbHNlLCB1c2UgZGVmYXVsdCBiZmQgc2VjdGlvbiBjb250ZW50IHRyYW5zZmVyLiAqLwotICAgIGVsc2UKLSAgICAgIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgCi0gICAgICAJCQkoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpOwotfQotCi0jZW5kaWYgLyogQUlYX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9zY281LWNvcmUuYyBiL2JmZC9zY281LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjOTdkMi4uMDAwMDAwMAotLS0gYS9iZmQvc2NvNS1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyogQkZEIGJhY2sgZW5kIGZvciBTQ081IGNvcmUgZmlsZXMgKFUtYXJlYSBhbmQgcmF3IHNlY3Rpb25zKQotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEpvdWtlIE51bWFuIDxqbnVtYW5AaGlzY29tLm5sPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgPHN5cy91c2VyLmg+ICAgICAgICAgICAvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9wYWNjZXNzLmg+Ci0jaW5jbHVkZSA8c3lzL3JlZ2lvbi5oPgotCi1zdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdAotewotICBzdHJ1Y3QgdXNlciB1OwotfTsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKLXN0YXRpYyBhc3ltYm9sICpzY281X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgdXNlciAqcmVhZF91YXJlYSBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpzY281X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY2hhciAqc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotaW50IHNjbzVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBzY281X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLAotCQkJCQkJICAgICBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXNjbzVfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotIAotc3RhdGljIHN0cnVjdCB1c2VyICoKLXJlYWRfdWFyZWEoYWJmZCwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgZmlsZXBvczsKLQotewotICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqcmF3cHRyOwotCi0gIHJhd3B0ciA9ICgoc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKikKLQkgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QpKSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YSA9IHJhd3B0cjsKLQotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmcmF3cHRyLT51LCAxLCBzaXplb2YgcmF3cHRyLT51LCBhYmZkKQotCSAgIT0gc2l6ZW9mIHJhd3B0ci0+dSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHBlcmhhcHM/Pz8gKi8KLSAgaWYgKHJhd3B0ci0+dS51X2RzaXplID4gMHgxMDAwMDAwKSAgICAvKiBSZW1lbWJlciwgaXQncyBpbiBwYWdlcy4uLiAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBpZiAocmF3cHRyLT51LnVfc3NpemUgPiAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmF3cHRyLT51OwotfQotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1zY281X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb2Zmc2V0X3NpeiwgdmFsLCBuc2VjcywgY2hlYWRvZmZzOwotICBpbnQgY29yZXNpemU7Ci0gIHN0cnVjdCB1c2VyICp1OwotICBzdHJ1Y3QgY29yZW9mZnNldHMgY29mZnNldHM7Ci0gIHN0cnVjdCBjb3Jlc2VjdGhlYWQgY2hlYWQ7Ci0gIGNoYXIgKnNlY25hbWU7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIC8qIFJlYWQgY29yZW9mZnNldHMgcmVnaW9uIGF0IGVuZCBvZiBjb3JlIChzZWUgY29yZShGUCkpICovCi0KLSAgewotICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCi0gICAgICB7Ci0gICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgIGNvcmVzaXplID0gc3RhdGJ1Zi5zdF9zaXplOwotICB9Ci0gIC8qIExhc3QgbG9uZyBpbiBjb3JlIGlzIHNpemVvZiBzdHJ1Y3QgY29yZW9mZnNldHMsIHJlYWQgaXQgKi8KLSAgaWYgKChiZmRfc2VlayAoYWJmZCwgY29yZXNpemUtc2l6ZW9mIGNvZmZzZXRfc2l6LCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY29mZnNldF9zaXosIDEsIHNpemVvZiBjb2Zmc2V0X3NpeiwgYWJmZCkKLQkgICE9IHNpemVvZiBjb2Zmc2V0X3NpeikgKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBVc2UgaXQgdG8gc2VlayBzdGFydCBvZiBjb3Jlb2Zmc2V0cyByZWdpb24sIHJlYWQgaXQgYW5kIGRldGVybWluZQotICAgICB2YWxpZGl0eSAqLwotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjb3Jlc2l6ZS1jb2Zmc2V0X3NpeiwgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNvZmZzZXRzLCAxLCBzaXplb2YgY29mZnNldHMsIGFiZmQpCi0JICAhPSBzaXplb2YgY29mZnNldHMpCi0gICAgICB8fCAoKGNvZmZzZXRzLnVfaW5mbyAhPSAxKSAmJiAoY29mZnNldHMudV9pbmZvICE9IENfVkVSU0lPTikpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gIGlmIChjb2Zmc2V0cy51X2luZm8gPT0gMSkgCi0gICAgeyAKLSAgICAgIC8qIE9sZCB2ZXJzaW9uLCBubyBzZWN0aW9uIGhlYWRzLCByZWFkIGluZm8gZnJvbSB1c2VyIHN0cnVjdCAqLwotCi0gICAgICB1ID0gcmVhZF91YXJlYShhYmZkLCBjb2Zmc2V0cy51X3VzZXIpOwotICAgICAgaWYgKCEgdSkKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLCBTRUNfSEFTX0NPTlRFTlRTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfc2l6ZV90eXBlKSBjb2Zmc2V0cy51X3VzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIChiZmRfdm1hKSB1LT51X2FyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV91c2VyKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLCAKLQkJCSAgICAgIFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmZkX3NpemVfdHlwZSkgdS0+dV9leGRhdGEudXhfZHNpemUKLQkJCSAgICAgICArIHUtPnVfZXhkYXRhLnV4X2JzaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfdm1hKSB1LT51X2V4ZGF0YS51eF9kYXRvcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZV9wdHIpIGNvZmZzZXRzLnVfZGF0YSkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIAotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsIAotCQkJICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfc2l6ZV90eXBlKSB1LT51X3NzaXplICogTkJQQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfdm1hKSB1LT51X3N1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV9zdGFjaykpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICByZXR1cm4gYWJmZC0+eHZlYzsJCS8qIERvbmUgZm9yIHZlcnNpb24gMSAqLwotICAgIH0gICAgICAKLQotICAvKiBJbW1lZGlhdGVseSBiZWZvcmUgY29yZW9mZnNldHMgcmVnaW9uIGlzIGEgbG9uZyB3aXRoIG9mZnNldCBpbiBjb3JlCi0gICAgIHRvIGZpcnN0IGNvcmVzZWN0aGVhZCAoQ09SRVNfT0ZGU0VUUyksIHRoZSBsb25nIGJlZm9yZSB0aGlzIGlzIHRoZQotICAgICBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkcyBpbiB0aGUgbGlzdC4gUmVhZCBib3RoIGxvbmdzIGFuZCByZWFkIHRoZQotICAgICBjb3Jlc2VjdGhlYWQgYW5kIGNoZWNrIGl0cyB2YWxpZGl0eSAqLwotICAgIAotICBpZiAoKGJmZF9zZWVrIChhYmZkLCAKLQkJIGNvcmVzaXplIC0gY29mZnNldF9zaXogLSAyICogc2l6ZW9mIGNvZmZzZXRfc2l6LCAKLQkJIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZuc2VjcywgMSwgc2l6ZW9mIG5zZWNzLCBhYmZkKSAhPSBzaXplb2YgbnNlY3MpCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkb2ZmcywgMSwgc2l6ZW9mIGNoZWFkb2ZmcywgYWJmZCkKLQkgICE9IHNpemVvZiBjaGVhZG9mZnMpCi0gICAgICB8fCAoYmZkX3NlZWsgKGFiZmQsIGNoZWFkb2ZmcywgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkLCAxLCBzaXplb2YgY2hlYWQsIGFiZmQpICE9IHNpemVvZiBjaGVhZCkKLSAgICAgIHx8IChjaGVhZC5jc19zdHlwZSAhPSBDT1JFU19PRkZTRVRTKQotICAgICAgfHwgKGNoZWFkLmNzX3guY3N4X21hZ2ljICE9IENPUkVNQUdJQ19OVU1CRVIpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIE5vdyBsb29wIG92ZXIgYWxsIHJlZ2lvbnMgYW5kIG1hcCB0aGVtICovCi0gIG5zZWNzLS07CQkJCS8qIFdlJ3ZlIHNlZW4gQ09SRVNfT0ZGU0VUUyBhbHJlYWR5ICovCi0gIGZvciAoOyBuc2VjczsgbnNlY3MtLSkgCi0gICAgewotICAgICAgaWYgKChiZmRfc2VlayAoYWJmZCwgY2hlYWQuY3NfaHNlZWssIFNFRUtfU0VUKSAhPSAwKQotCSAgfHwgYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkLCAxLCBzaXplb2YgY2hlYWQsIGFiZmQpICE9IHNpemVvZiBjaGVhZCkKLSAgICAgICAgewotICAgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICBzd2l0Y2ggKGNoZWFkLmNzX3N0eXBlKSAKLQl7Ci0JY2FzZSBDT1JFU19NQUdJQzoJCQkvKiBDb3JlIGhlYWRlciwgY2hlY2sgbWFnaWMgKi8KLQkgIGlmIChjaGVhZC5jc194LmNzeF9tYWdpYyAhPSBDT1JFTUFHSUNfTlVNQkVSKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIHNlY25hbWUgPSBOVUxMOwotCSAgbnNlY3MrKzsJCQkJLyogTUFHSUMgbm90IGluIHNlY3Rpb24gY250ISovCi0JICBicmVhazsKLQljYXNlIENPUkVTX1VBUkVBOgkJCS8qIFUtYXJlYSwgcmVhZCBpbiB0ZGF0YSAqLwotCSAgdSA9IHJlYWRfdWFyZWEoYWJmZCwgY2hlYWQuY3Nfc3NlZWspOwotCSAgaWYgKCEgdSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgICAvKiBUaGlzIGlzIHRyaWNreS4gIEFzIHRoZSAicmVnaXN0ZXIgc2VjdGlvbiIsIHdlIGdpdmUgdGhlbQotCSAgICAgdGhlIGVudGlyZSB1cGFnZSBhbmQgc3RhY2suICB1LnVfYXIwIHBvaW50cyB0byB3aGVyZQotCSAgICAgInJlZ2lzdGVyIDAiIGlzIHN0b3JlZC4gIFRoZXJlIGFyZSB0d28gdHJpY2tzIHdpdGggdGhpcywKLQkgICAgIHRob3VnaC4gIE9uZSBpcyB0aGF0IHRoZSByZXN0IG9mIHRoZSByZWdpc3RlcnMgbWlnaHQgYmUKLQkgICAgIGF0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIChvciBib3RoKSBkaXNwbGFjZW1lbnRzIGZyb20KLQkgICAgICp1X2FyMC4gIFRoZSBvdGhlciBpcyB0aGF0IHVfYXIwIGlzIHNvbWV0aW1lcyBhbiBhYnNvbHV0ZQotCSAgICAgYWRkcmVzcyBpbiBrZXJuZWwgbWVtb3J5LCBhbmQgb24gb3RoZXIgc3lzdGVtcyBpdCBpcyBhbgotCSAgICAgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYHN0cnVjdCB1c2VyJy4KLQkKLQkgICAgIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVnaXN0ZXJzCi0JICAgICBhY3R1YWxseSBhcmUsIHNvIHdlIGhhdmUgdG8gcGFzcyB0aGUgd2hvbGUgYXJlYSB0byBHREIuCi0JICAgICBXZSBlbmNvZGUgdGhlIHZhbHVlIG9mIHVfYXIwIGJ5IHNldHRpbmcgdGhlIC5yZWdzIHNlY3Rpb24KLQkgICAgIHVwIHNvIHRoYXQgaXRzIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgMCBpcyBhdCB0aGUgcGxhY2UKLQkgICAgIHBvaW50ZWQgdG8gYnkgdV9hcjAgKGJ5IHNldHRpbmcgdGhlIHZtYSBvZiB0aGUgc3RhcnQgb2YKLQkgICAgIHRoZSBzZWN0aW9uIHRvIC11X2FyMCkuICBHREIgdXNlcyB0aGlzIGluZm8gdG8gbG9jYXRlIHRoZQotCSAgICAgcmVncywgdXNpbmcgbWlub3IgdHJpY2tlcnkgdG8gZ2V0IGFyb3VuZCB0aGUKLQkgICAgIG9mZnNldC1vci1hYnNvbHV0ZS1hZGRyIHByb2JsZW0uICovCi0KLQkgIGNoZWFkLmNzX3ZhZGRyID0gMCAtIChiZmRfdm1hKSB1LT51X2FyMDsKLQotCi0gICAgICAgICAgc2VjbmFtZSA9ICIucmVnIjsKLSAgICAgICAgICBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgICAgICBicmVhazsKLQljYXNlIENPUkVTX1BSRUdJT046CQkJLyogQSBwcm9ncmFtIHJlZ2lvbiwgbWFwIGl0ICovCi0JICBzd2l0Y2ggKGNoZWFkLmNzX3guY3N4X3ByZWcuY3N4cF9ydHlwKQotCSAgICB7Ci0JICAgIGNhc2UgUFRfREFUQToKLQkgICAgICBzZWNuYW1lID0gIi5kYXRhIjsgIAkvKiBEYXRhIHJlZ2lvbi4gICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9TVEFDSzoKLQkgICAgICBzZWNuYW1lID0gIi5zdGFjayI7IAkvKiBTdGFjayByZWdpb24uICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9TSE1FTToKLQkgICAgICBzZWNuYW1lID0gIi5zaG1lbSI7IAkvKiBTaGFyZWQgbWVtb3J5ICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9MSUJEQVQ6Ci0JICAgICAgc2VjbmFtZSA9ICIubGliZGF0IjsJLyogU2hhcmVkIGxpYnJhcnkgZGF0YSAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfVjg2OgotCSAgICAgIHNlY25hbWUgPSAiLnZpcnQ4NiI7CS8qIFZpcnR1YWwgODA4NiBtb2RlICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NIRklMOgotCSAgICAgIHNlY25hbWUgPSAiLm1tZmlsZSI7CS8qIE1lbW9yeSBtYXBwZWQgZmlsZSAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1hEQVRBMDoKLQkgICAgICBzZWNuYW1lID0gIi5YZGF0MCI7IAkvKiBYRU5JWCBkYXRhIHJlZ2lvbiwgdmlydHVhbCAwICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc2VjbmFtZSA9ICIiOwotCSAgICB9Ci0JICBmbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgQ09SRVNfUFJPQzoJCQkvKiBzdHJ1Y3QgcHJvYyAqLwotCWNhc2UgQ09SRVNfSVRJTUVSOgkJCS8qIGludGVydmFsIHRpbWVycyAqLwotCWNhc2UgQ09SRVNfU0NPVVRTTkFNRToJCQkvKiBzdHJ1Y3Qgc2NvdXRzbmFtZSAqLwotCSAgc2VjbmFtZSA9IE5VTEw7CS8qIElnbm9yZSB0aGVzZSAqLwotCSAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiVW5oYW5kbGVkIFNDTyBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlYWQuY3Nfc3R5cGUpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChzZWNuYW1lCi0JICAmJiAhbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsIGZsYWdzLAotCQkJCSAoYmZkX3NpemVfdHlwZSkgY2hlYWQuY3NfdnNpemUsCi0JCQkJIChiZmRfdm1hKSBjaGVhZC5jc192YWRkciwKLQkJCQkgKGZpbGVfcHRyKSBjaGVhZC5jc19zc2VlaykpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi19Ci0KLWNoYXIgKgotc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhLT51LnVfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBBUkdTVVNFRCAqLwotaW50Ci1zY281X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci17Ci0gIHJldHVybiAoKGlnbm9yZV9hYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YS0+dS51X3N5c2Fib3J0ICE9IDApIAotCSAgPyBpZ25vcmVfYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEtPnUudV9zeXNhYm9ydCAKLQkgIDogLTEpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotc2NvNV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7ICAgICAgICAgIC8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQotI2RlZmluZSBzY281X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgc2NvNV9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgc2NvNV9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgc2NvNV9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHNjbzVfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNjbzVfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgc2NvNV9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lIE5PX0dFVCAgKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZSBOT19QVVQgICgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUgTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgc2NvNV9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAic2NvNS1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogYXJjaGl2ZSAqLwotICAgICBzY281X2NvcmVfZmlsZV9wICAgICAgCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0KLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoc2NvNSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNjbzVfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwICAgICAgICAgICAgICAgICAgICAgLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3NlY3Rpb24uYyBiL2JmZC9zZWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyY2E0NDMuLjAwMDAwMDAKLS0tIGEvYmZkL3NlY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDExNDEgKzAsMCBAQAotLyogT2JqZWN0IGZpbGUgInNlY3Rpb24iIHN1cHBvcnQgZm9yIHRoZSBCRkQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlTZWN0aW9ucwotCi0JVGhlIHJhdyBkYXRhIGNvbnRhaW5lZCB3aXRoaW4gYSBCRkQgaXMgbWFpbnRhaW5lZCB0aHJvdWdoIHRoZQotCXNlY3Rpb24gYWJzdHJhY3Rpb24uICBBIHNpbmdsZSBCRkQgbWF5IGhhdmUgYW55IG51bWJlciBvZgotCXNlY3Rpb25zLiAgSXQga2VlcHMgaG9sZCBvZiB0aGVtIGJ5IHBvaW50aW5nIHRvIHRoZSBmaXJzdDsKLQllYWNoIG9uZSBwb2ludHMgdG8gdGhlIG5leHQgaW4gdGhlIGxpc3QuCi0KLQlTZWN0aW9ucyBhcmUgc3VwcG9ydGVkIGluIEJGRCBpbiA8PHNlY3Rpb24uYz4+LgotCi1AbWVudQotQCogU2VjdGlvbiBJbnB1dDo6Ci1AKiBTZWN0aW9uIE91dHB1dDo6Ci1AKiB0eXBlZGVmIGFzZWN0aW9uOjoKLUAqIHNlY3Rpb24gcHJvdG90eXBlczo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLVNlY3Rpb24gSW5wdXQsIFNlY3Rpb24gT3V0cHV0LCBTZWN0aW9ucywgU2VjdGlvbnMKLVNVQlNFQ1RJT04KLQlTZWN0aW9uIGlucHV0Ci0KLQlXaGVuIGEgQkZEIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhlIHNlY3Rpb24gc3RydWN0dXJlcyBhcmUKLQljcmVhdGVkIGFuZCBhdHRhY2hlZCB0byB0aGUgQkZELgotCi0JRWFjaCBzZWN0aW9uIGhhcyBhIG5hbWUgd2hpY2ggZGVzY3JpYmVzIHRoZSBzZWN0aW9uIGluIHRoZQotCW91dHNpZGUgd29ybGQtLS1mb3IgZXhhbXBsZSwgPDxhLm91dD4+IHdvdWxkIGNvbnRhaW4gYXQgbGVhc3QKLQl0aHJlZSBzZWN0aW9ucywgY2FsbGVkIDw8LnRleHQ+PiwgPDwuZGF0YT4+IGFuZCA8PC5ic3M+Pi4KLQotCU5hbWVzIG5lZWQgbm90IGJlIHVuaXF1ZTsgZm9yIGV4YW1wbGUgYSBDT0ZGIGZpbGUgbWF5IGhhdmUgc2V2ZXJhbAotCXNlY3Rpb25zIG5hbWVkIDw8LmRhdGE+Pi4KLQotCVNvbWV0aW1lcyBhIEJGRCB3aWxsIGNvbnRhaW4gbW9yZSB0aGFuIHRoZSBgYG5hdHVyYWwnJyBudW1iZXIgb2YKLQlzZWN0aW9ucy4gQSBiYWNrIGVuZCBtYXkgYXR0YWNoIG90aGVyIHNlY3Rpb25zIGNvbnRhaW5pbmcKLQljb25zdHJ1Y3RvciBkYXRhLCBvciBhbiBhcHBsaWNhdGlvbiBtYXkgYWRkIGEgc2VjdGlvbiAodXNpbmcKLQk8PGJmZF9tYWtlX3NlY3Rpb24+PikgdG8gdGhlIHNlY3Rpb25zIGF0dGFjaGVkIHRvIGFuIGFscmVhZHkgb3BlbgotCUJGRC4gRm9yIGV4YW1wbGUsIHRoZSBsaW5rZXIgY3JlYXRlcyBhbiBleHRyYSBzZWN0aW9uCi0JPDxDT01NT04+PiBmb3IgZWFjaCBpbnB1dCBmaWxlJ3MgQkZEIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQKLQljb21tb24gc3RvcmFnZS4KLQotCVRoZSByYXcgZGF0YSBpcyBub3QgbmVjZXNzYXJpbHkgcmVhZCBpbiB3aGVuCi0JdGhlIHNlY3Rpb24gZGVzY3JpcHRvciBpcyBjcmVhdGVkLiBTb21lIHRhcmdldHMgbWF5IGxlYXZlIHRoZQotCWRhdGEgaW4gcGxhY2UgdW50aWwgYSA8PGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cz4+IGNhbGwgaXMKLQltYWRlLiBPdGhlciBiYWNrIGVuZHMgbWF5IHJlYWQgaW4gYWxsIHRoZSBkYXRhIGF0IG9uY2UuICBGb3IKLQlleGFtcGxlLCBhbiBTLXJlY29yZCBmaWxlIGhhcyB0byBiZSByZWFkIG9uY2UgdG8gZGV0ZXJtaW5lIHRoZQotCXNpemUgb2YgdGhlIGRhdGEuIEFuIElFRUUtNjk1IGZpbGUgZG9lc24ndCBjb250YWluIHJhdyBkYXRhIGluCi0Jc2VjdGlvbnMsIGJ1dCBkYXRhIGFuZCByZWxvY2F0aW9uIGV4cHJlc3Npb25zIGludGVybWl4ZWQsIHNvCi0JdGhlIGRhdGEgYXJlYSBoYXMgdG8gYmUgcGFyc2VkIHRvIGdldCBvdXQgdGhlIGRhdGEgYW5kCi0JcmVsb2NhdGlvbnMuCi0KLUlOT0RFCi1TZWN0aW9uIE91dHB1dCwgdHlwZWRlZiBhc2VjdGlvbiwgU2VjdGlvbiBJbnB1dCwgU2VjdGlvbnMKLQotU1VCU0VDVElPTgotCVNlY3Rpb24gb3V0cHV0Ci0KLQlUbyB3cml0ZSBhIG5ldyBvYmplY3Qgc3R5bGUgQkZELCB0aGUgdmFyaW91cyBzZWN0aW9ucyB0byBiZQotCXdyaXR0ZW4gaGF2ZSB0byBiZSBjcmVhdGVkLiBUaGV5IGFyZSBhdHRhY2hlZCB0byB0aGUgQkZEIGluCi0JdGhlIHNhbWUgd2F5IGFzIGlucHV0IHNlY3Rpb25zOyBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlCi0Jc2VjdGlvbnMgdXNpbmcgPDxiZmRfc2V0X3NlY3Rpb25fY29udGVudHM+Pi4KLQotCUFueSBwcm9ncmFtIHRoYXQgY3JlYXRlcyBvciBjb21iaW5lcyBzZWN0aW9ucyAoZS5nLiwgdGhlIGFzc2VtYmxlcgotCWFuZCBsaW5rZXIpIG11c3QgdXNlIHRoZSA8PGFzZWN0aW9uPj4gZmllbGRzIDw8b3V0cHV0X3NlY3Rpb24+PiBhbmQKLQk8PG91dHB1dF9vZmZzZXQ+PiB0byBpbmRpY2F0ZSB0aGUgZmlsZSBzZWN0aW9ucyB0byB3aGljaCBlYWNoCi0Jc2VjdGlvbiBtdXN0IGJlIHdyaXR0ZW4uICAoSWYgdGhlIHNlY3Rpb24gaXMgYmVpbmcgY3JlYXRlZCBmcm9tCi0Jc2NyYXRjaCwgPDxvdXRwdXRfc2VjdGlvbj4+IHNob3VsZCBwcm9iYWJseSBwb2ludCB0byB0aGUgc2VjdGlvbgotCWl0c2VsZiBhbmQgPDxvdXRwdXRfb2Zmc2V0Pj4gc2hvdWxkIHByb2JhYmx5IGJlIHplcm8uKQotCi0JVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBjb21lcyBmcm9tIGlucHV0IHNlY3Rpb25zIGF0dGFjaGVkCi0JKHZpYSA8PG91dHB1dF9zZWN0aW9uPj4gcG9pbnRlcnMpIHRvCi0JdGhlIG91dHB1dCBzZWN0aW9ucy4gIFRoZSBvdXRwdXQgc2VjdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlCi0JY29uc2lkZXJlZCBhIGZpbHRlciBmb3IgdGhlIGlucHV0IHNlY3Rpb246IHRoZSBvdXRwdXQgc2VjdGlvbgotCWRldGVybWluZXMgdGhlIHZtYSBvZiB0aGUgb3V0cHV0IGRhdGEgYW5kIHRoZSBuYW1lLCBidXQgdGhlCi0JaW5wdXQgc2VjdGlvbiBkZXRlcm1pbmVzIHRoZSBvZmZzZXQgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YKLQl0aGUgZGF0YSB0byBiZSB3cml0dGVuLgotCi0JRS5nLiwgdG8gY3JlYXRlIGEgc2VjdGlvbiAiTyIsIHN0YXJ0aW5nIGF0IDB4MTAwLCAweDEyMyBsb25nLAotCWNvbnRhaW5pbmcgdHdvIHN1YnNlY3Rpb25zLCAiQSIgYXQgb2Zmc2V0IDB4MCAoaS5lLiwgYXQgdm1hCi0JMHgxMDApIGFuZCAiQiIgYXQgb2Zmc2V0IDB4MjAgKGkuZS4sIGF0IHZtYSAweDEyMCkgdGhlIDw8YXNlY3Rpb24+PgotCXN0cnVjdHVyZXMgd291bGQgbG9vayBsaWtlOgotCi18ICAgc2VjdGlvbiBuYW1lICAgICAgICAgICJBIgotfCAgICAgb3V0cHV0X29mZnNldCAgIDB4MDAKLXwgICAgIHNpemUgICAgICAgICAgICAweDIwCi18ICAgICBvdXRwdXRfc2VjdGlvbiAtLS0tLS0tLS0tLT4gIHNlY3Rpb24gbmFtZSAgICAiTyIKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgdm1hICAgICAgICAgICAgIDB4MTAwCi18ICAgc2VjdGlvbiBuYW1lICAgICAgICAgICJCIiB8ICAgIHNpemUgICAgICAgICAgICAweDEyMwotfCAgICAgb3V0cHV0X29mZnNldCAgIDB4MjAgICAgfAotfCAgICAgc2l6ZSAgICAgICAgICAgIDB4MTAzICAgfAotfCAgICAgb3V0cHV0X3NlY3Rpb24gIC0tLS0tLS0tfAotCi0KLVNVQlNFQ1RJT04KLQlMaW5rIG9yZGVycwotCi0JVGhlIGRhdGEgd2l0aGluIGEgc2VjdGlvbiBpcyBzdG9yZWQgaW4gYSBAZGZue2xpbmtfb3JkZXJ9LgotCVRoZXNlIGFyZSBtdWNoIGxpa2UgdGhlIGZpeHVwcyBpbiA8PGdhcz4+LiAgVGhlIGxpbmtfb3JkZXIKLQlhYnN0cmFjdGlvbiBhbGxvd3MgYSBzZWN0aW9uIHRvIGdyb3cgYW5kIHNocmluayB3aXRoaW4gaXRzZWxmLgotCi0JQSBsaW5rX29yZGVyIGtub3dzIGhvdyBiaWcgaXQgaXMsIGFuZCB3aGljaCBpcyB0aGUgbmV4dAotCWxpbmtfb3JkZXIgYW5kIHdoZXJlIHRoZSByYXcgZGF0YSBmb3IgaXQgaXM7IGl0IGFsc28gcG9pbnRzIHRvCi0JYSBsaXN0IG9mIHJlbG9jYXRpb25zIHdoaWNoIGFwcGx5IHRvIGl0LgotCi0JVGhlIGxpbmtfb3JkZXIgaXMgdXNlZCBieSB0aGUgbGlua2VyIHRvIHBlcmZvcm0gcmVsYXhpbmcgb24KLQlmaW5hbCBjb2RlLiAgVGhlIGNvbXBpbGVyIGNyZWF0ZXMgY29kZSB3aGljaCBpcyBhcyBiaWcgYXMKLQluZWNlc3NhcnkgdG8gbWFrZSBpdCB3b3JrIHdpdGhvdXQgcmVsYXhpbmcsIGFuZCB0aGUgdXNlciBjYW4KLQlzZWxlY3Qgd2hldGhlciB0byByZWxheC4gIFNvbWV0aW1lcyByZWxheGluZyB0YWtlcyBhIGxvdCBvZgotCXRpbWUuICBUaGUgbGlua2VyIHJ1bnMgYXJvdW5kIHRoZSByZWxvY2F0aW9ucyB0byBzZWUgaWYgYW55Ci0JYXJlIGF0dGFjaGVkIHRvIGRhdGEgd2hpY2ggY2FuIGJlIHNocnVuaywgaWYgc28gaXQgZG9lcyBpdCBvbgotCWEgbGlua19vcmRlciBieSBsaW5rX29yZGVyIGJhc2lzLgotCi0qLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qCi1ET0NERAotSU5PREUKLXR5cGVkZWYgYXNlY3Rpb24sIHNlY3Rpb24gcHJvdG90eXBlcywgU2VjdGlvbiBPdXRwdXQsIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JdHlwZWRlZiBhc2VjdGlvbgotCi0JSGVyZSBpcyB0aGUgc2VjdGlvbiBzdHJ1Y3R1cmU6Ci0KLUNPREVfRlJBR01FTlQKLS4KLS4geyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYSBjb21kYXQgc2VjdGlvbiwgYXMgaW4gUEUuICBBIGNvbWRhdAotLiAgICBzZWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc3ltYm9sLiAgV2hlbiB0aGUgbGlua2VyCi0uICAgIHNlZXMgYSBjb21kYXQgc2VjdGlvbiwgaXQga2VlcHMgb25seSBvbmUgb2YgdGhlIHNlY3Rpb25zIHdpdGggYQotLiAgICBnaXZlbiBuYW1lIGFuZCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBzeW1ib2wuICp9Ci0uCi0uc3RydWN0IGJmZF9jb21kYXRfaW5mbwotLnsKLS4gIHsqIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgY29tZGF0IHNlY3Rpb24uICAqfQotLiAgY29uc3QgY2hhciAqbmFtZTsKLS4KLS4gIHsqIFRoZSBsb2NhbCBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYQotLiAgICAgY29tZGF0IHNlY3Rpb24uICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0uICAgICBzcGVjaWZpYyBjb2RlOyBpdCBpcyBub3QgYW4gaW5kZXggaW50byB0aGUgbGlzdCByZXR1cm5lZCBieQotLiAgICAgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuICAqfQotLiAgbG9uZyBzeW1ib2w7Ci0uCi0uICB7KiBJZiB0aGlzIHNlY3Rpb24gaXMgYmVpbmcgZGlzY2FyZGVkLCB0aGUgbGlua2VyIHVzZXMgdGhpcyBmaWVsZAotLiAgICAgdG8gcG9pbnQgdG8gdGhlIGlucHV0IHNlY3Rpb24gd2hpY2ggaXMgYmVpbmcga2VwdC4gICp9Ci0uICBzdHJ1Y3Qgc2VjICpzZWM7Ci0ufTsKLS4KLS50eXBlZGVmIHN0cnVjdCBzZWMKLS57Ci0uICAgICAgICB7KiBUaGUgbmFtZSBvZiB0aGUgc2VjdGlvbjsgdGhlIG5hbWUgaXNuJ3QgYSBjb3B5LCB0aGUgcG9pbnRlciBpcwotLiAgICAgICAgdGhlIHNhbWUgYXMgdGhhdCBwYXNzZWQgdG8gYmZkX21ha2Vfc2VjdGlvbi4gKn0KLS4KLS4gICAgQ09OU1QgY2hhciAqbmFtZTsKLS4KLS4gICAgICAgIHsqIFdoaWNoIHNlY3Rpb24gaXMgaXQ7IDAuLm50aC4gICAgICAqfQotLgotLiAgIGludCBpbmRleDsKLS4KLS4gICAgICAgIHsqIFRoZSBuZXh0IHNlY3Rpb24gaW4gdGhlIGxpc3QgYmVsb25naW5nIHRvIHRoZSBCRkQsIG9yIE5VTEwuICp9Ci0uCi0uICAgIHN0cnVjdCBzZWMgKm5leHQ7Ci0uCi0uICAgICAgICB7KiBUaGUgZmllbGQgZmxhZ3MgY29udGFpbnMgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbi4gU29tZQotLiAgICAgICAgICAgZmxhZ3MgYXJlIHJlYWQgaW4gZnJvbSB0aGUgb2JqZWN0IGZpbGUsIGFuZCBzb21lIGFyZQotLiAgICAgICAgICAgc3ludGhlc2l6ZWQgZnJvbSBvdGhlciBpbmZvcm1hdGlvbi4gICp9Ci0uCi0uICAgIGZsYWd3b3JkIGZsYWdzOwotLgotLiNkZWZpbmUgU0VDX05PX0ZMQUdTICAgMHgwMDAKLS4KLS4gICAgICAgIHsqIFRlbGxzIHRoZSBPUyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzZWN0aW9uIHdoZW4gbG9hZGluZy4KLS4gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgc2VjdGlvbiBjb250YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uCi0uICAgICAgICAgICBvbmx5LiAqfQotLiNkZWZpbmUgU0VDX0FMTE9DICAgICAgMHgwMDEKLS4KLS4gICAgICAgIHsqIFRlbGxzIHRoZSBPUyB0byBsb2FkIHRoZSBzZWN0aW9uIGZyb20gdGhlIGZpbGUgd2hlbiBsb2FkaW5nLgotLiAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSAuYnNzIHNlY3Rpb24uICp9Ci0uI2RlZmluZSBTRUNfTE9BRCAgICAgICAweDAwMgotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBzdGlsbCB0byBiZSByZWxvY2F0ZWQsIHNvIHRoZXJlIGlzCi0uICAgICAgICAgICBzb21lIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG9vLiAqfQotLiNkZWZpbmUgU0VDX1JFTE9DICAgICAgMHgwMDQKLS4KLS4jaWYgMCAgIHsqIE9ic29sZXRlID8gKn0KLS4jZGVmaW5lIFNFQ19CQUxJR04gICAgIDB4MDA4Ci0uI2VuZGlmCi0uCi0uICAgICAgICB7KiBBIHNpZ25hbCB0byB0aGUgT1MgdGhhdCB0aGUgc2VjdGlvbiBjb250YWlucyByZWFkIG9ubHkKLS4gICAgICAgICAgZGF0YS4gKn0KLS4jZGVmaW5lIFNFQ19SRUFET05MWSAgIDB4MDEwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBjb2RlIG9ubHkuICp9Ci0uI2RlZmluZSBTRUNfQ09ERSAgICAgICAweDAyMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5LiAqfQotLiNkZWZpbmUgU0VDX0RBVEEgICAgICAgMHgwNDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIHdpbGwgcmVzaWRlIGluIFJPTS4gKn0KLS4jZGVmaW5lIFNFQ19ST00gICAgICAgIDB4MDgwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBjb25zdHJ1Y3RvciBpbmZvcm1hdGlvbi4gVGhpcyBzZWN0aW9uCi0uICAgICAgICAgICB0eXBlIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBjcmVhdGUgbGlzdHMgb2YgY29uc3RydWN0b3JzIGFuZAotLiAgICAgICAgICAgZGVzdHJ1Y3RvcnMgdXNlZCBieSA8PGcrKz4+LiBXaGVuIGEgYmFjayBlbmQgc2VlcyBhIHN5bWJvbAotLiAgICAgICAgICAgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gYSBjb25zdHJ1Y3RvciBsaXN0LCBpdCBjcmVhdGVzIGEgbmV3Ci0uICAgICAgICAgICBzZWN0aW9uIGZvciB0aGUgdHlwZSBvZiBuYW1lIChlLmcuLCA8PF9fQ1RPUl9MSVNUX18+PiksIGF0dGFjaGVzCi0uICAgICAgICAgICB0aGUgc3ltYm9sIHRvIGl0LCBhbmQgYnVpbGRzIGEgcmVsb2NhdGlvbi4gVG8gYnVpbGQgdGhlIGxpc3RzCi0uICAgICAgICAgICBvZiBjb25zdHJ1Y3RvcnMsIGFsbCB0aGUgbGlua2VyIGhhcyB0byBkbyBpcyBjYXRlbmF0ZSBhbGwgdGhlCi0uICAgICAgICAgICBzZWN0aW9ucyBjYWxsZWQgPDxfX0NUT1JfTElTVF9fPj4gYW5kIHJlbG9jYXRlIHRoZSBkYXRhCi0uICAgICAgICAgICBjb250YWluZWQgd2l0aGluIC0gZXhhY3RseSB0aGUgb3BlcmF0aW9ucyBpdCB3b3VsZCBwZWZvcm0gb24KLS4gICAgICAgICAgIHN0YW5kYXJkIGRhdGEuICp9Ci0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1IgMHgxMDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGlzIGEgY29uc3RydWN0b3IsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZQotLiAgICAgICAgICBlbmQgb2YgdGhlIHRleHQsIGRhdGEsIG9yIGJzcyBzZWN0aW9uKD8pLiAqfQotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX1RFWFQgMHgxMTAwCi0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfREFUQSAweDIxMDAKLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9CU1MgIDB4MzEwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gaGFzIGNvbnRlbnRzIC0gYSBkYXRhIHNlY3Rpb24gY291bGQgYmUKLS4gICAgICAgICAgIDw8U0VDX0FMTE9DPj4gfCA8PFNFQ19IQVNfQ09OVEVOVFM+PjsgYSBkZWJ1ZyBzZWN0aW9uIGNvdWxkIGJlCi0uICAgICAgICAgICA8PFNFQ19IQVNfQ09OVEVOVFM+PiAqfQotLiNkZWZpbmUgU0VDX0hBU19DT05URU5UUyAweDIwMAotLgotLiAgICAgICAgeyogQW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGxpbmtlciB0byBub3Qgb3V0cHV0IHRoZSBzZWN0aW9uCi0uICAgICAgICAgICBldmVuIGlmIGl0IGhhcyBpbmZvcm1hdGlvbiB3aGljaCB3b3VsZCBub3JtYWxseSBiZSB3cml0dGVuLiAqfQotLiNkZWZpbmUgU0VDX05FVkVSX0xPQUQgMHg0MDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgVGhpcyBmbGFnIGlzCi0uICAgICAgICAgICBvbmx5IGZvciB0aGUgbGlua2VyLiAgSWYgdGhpcyB0eXBlIG9mIHNlY3Rpb24gYXBwZWFycyBpbgotLiAgICAgICAgICAgdGhlIGlucHV0IGZpbGUsIHRoZSBsaW5rZXIgbXVzdCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgZmlsZQotLiAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgdm1hIG9yIHNpemUuICBGSVhNRTogQWx0aG91Z2ggdGhpcwotLiAgICAgICAgICAgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gYmUgZ2VuZXJhbCwgaXQgcmVhbGx5IGlzIENPRkYKLS4gICAgICAgICAgIHNwZWNpZmljIChhbmQgdGhlIGZsYWcgd2FzIHJlbmFtZWQgdG8gaW5kaWNhdGUgdGhpcykuICBJdAotLiAgICAgICAgICAgbWlnaHQgYmUgY2xlYW5lciB0byBoYXZlIHNvbWUgbW9yZSBnZW5lcmFsIG1lY2hhbmlzbSB0bwotLiAgICAgICAgICAgYWxsb3cgdGhlIGJhY2sgZW5kIHRvIGNvbnRyb2wgd2hhdCB0aGUgbGlua2VyIGRvZXMgd2l0aAotLiAgICAgICAgICAgc2VjdGlvbnMuICp9Ci0uI2RlZmluZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSAweDgwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29tbW9uIHN5bWJvbHMgKHN5bWJvbHMgbWF5IGJlIGRlZmluZWQKLS4gICAgICAgICAgIG11bHRpcGxlIHRpbWVzLCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgdGhlIGFtb3VudCBvZgotLiAgICAgICAgICAgc3BhY2UgaXQgcmVxdWlyZXMsIGFuZCB0aGUgbGFyZ2VzdCBzeW1ib2wgdmFsdWUgaXMgdGhlIG9uZQotLiAgICAgICAgICAgdXNlZCkuICBNb3N0IHRhcmdldHMgaGF2ZSBleGFjdGx5IG9uZSBvZiB0aGVzZSAod2hpY2ggd2UKLS4JICAgIHRyYW5zbGF0ZSB0byBiZmRfY29tX3NlY3Rpb25fcHRyKSwgYnV0IEVDT0ZGIGhhcyB0d28uICp9Ci0uI2RlZmluZSBTRUNfSVNfQ09NTU9OIDB4ODAwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgb25seSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBGb3IKLS4gICAgICAgICAgIGV4YW1wbGUsIHRoaXMgaXMgc2V0IGZvciBFTEYgLmRlYnVnIGFuZCAuc3RhYiBzZWN0aW9ucy4KLS4gICAgICAgICAgIHN0cmlwIHRlc3RzIHRoaXMgZmxhZyB0byBzZWUgaWYgYSBzZWN0aW9uIGNhbiBiZQotLiAgICAgICAgICAgZGlzY2FyZGVkLiAqfQotLiNkZWZpbmUgU0VDX0RFQlVHR0lORyAweDEwMDAwCi0uCi0uICAgICAgICB7KiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSBoZWxkIGluIG1lbW9yeSBwb2ludGVkIHRvCi0uICAgICAgICAgICBieSB0aGUgY29udGVudHMgZmllbGQuICBUaGlzIGlzIGNoZWNrZWQgYnkKLS4gICAgICAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cywgYW5kIHRoZSBkYXRhIGlzIHJldHJpZXZlZCBmcm9tCi0uICAgICAgICAgICBtZW1vcnkgaWYgYXBwcm9wcmlhdGUuICAqfQotLiNkZWZpbmUgU0VDX0lOX01FTU9SWSAweDIwMDAwCi0uCi0uICAgICAgICB7KiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBleGNsdWRlZCBieSB0aGUKLS4JICAgIGxpbmtlciBmb3IgZXhlY3V0YWJsZSBhbmQgc2hhcmVkIG9iamVjdHMgdW5sZXNzIHRob3NlCi0uCSAgICBvYmplY3RzIGFyZSB0byBiZSBmdXJ0aGVyIHJlbG9jYXRlZC4gICp9Ci0uI2RlZmluZSBTRUNfRVhDTFVERSAweDQwMDAwCi0uCi0uCXsqIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIHNvcnRlZCBieSB0aGUKLS4JICAgYmFzZWQgb24gdGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGluIHRoZSBhc3NvY2lhdGVkIHN5bWJvbAotLgkgICB0YWJsZS4gICp9Ci0uI2RlZmluZSBTRUNfU09SVF9FTlRSSUVTIDB4ODAwMDAKLS4KLS4JeyogV2hlbiBsaW5raW5nLCBkdXBsaWNhdGUgc2VjdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBzaG91bGQgYmUKLS4JICAgZGlzY2FyZGVkLCByYXRoZXIgdGhhbiBiZWluZyBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIHNlY3Rpb24gYXMKLS4JICAgaXMgdXN1YWxseSBkb25lLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBjb21tb24gc3ltYm9scyBhcmUKLS4JICAgaGFuZGxlZC4gIFNlZSBTRUNfTElOS19EVVBMSUNBVEVTIGJlbG93LiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX09OQ0UgMHgxMDAwMDAKLS4KLS4JeyogSWYgU0VDX0xJTktfT05DRSBpcyBzZXQsIHRoaXMgYml0ZmllbGQgZGVzY3JpYmVzIGhvdyB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCBoYW5kbGUgZHVwbGljYXRlIHNlY3Rpb25zLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVMgMHg2MDAwMDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IGR1cGxpY2F0ZQotLgkgICBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgc2hvdWxkIHNpbXBseSBiZSBkaXNjYXJkZWQuICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQgMHgwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCB3YXJuIGlmIHRoZXJlIGFyZSBhbnkgZHVwbGljYXRlIHNlY3Rpb25zLCBhbHRob3VnaAotLgkgICBpdCBzaG91bGQgc3RpbGwgb25seSBsaW5rIG9uZSBjb3B5LiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkgMHgyMDAwMDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBhcmUgYSBkaWZmZXJlbnQgc2l6ZS4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSAweDQwMDAwMAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgd2FybiBpZiBhbnkgZHVwbGljYXRlIHNlY3Rpb25zIGNvbnRhaW4gZGlmZmVyZW50Ci0uCSAgIGNvbnRlbnRzLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUyAweDYwMDAwMAotLgotLgl7KiBUaGlzIHNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlciBhcyBwYXJ0IG9mIGR5bmFtaWMKLS4JICAgcmVsb2NhdGlvbiBvciBvdGhlciBhcmNhbmUgcHJvY2Vzc2luZy4gIEl0IGlzIHNraXBwZWQgd2hlbgotLgkgICBnb2luZyB0aHJvdWdoIHRoZSBmaXJzdC1wYXNzIG91dHB1dCwgdHJ1c3RpbmcgdGhhdCBzb21lb25lCi0uCSAgIGVsc2UgdXAgdGhlIGxpbmUgd2lsbCB0YWtlIGNhcmUgb2YgaXQgbGF0ZXIuICAqfQotLiNkZWZpbmUgU0VDX0xJTktFUl9DUkVBVEVEIDB4ODAwMDAwCi0uCi0uCXsqIFRoaXMgc2VjdGlvbiBzaG91bGQgbm90IGJlIHN1YmplY3QgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKn0KLS4jZGVmaW5lIFNFQ19LRUVQIDB4MTAwMDAwMAotLgotLgl7KiBUaGlzIHNlY3Rpb24gY29udGFpbnMgInNob3J0IiBkYXRhLCBhbmQgc2hvdWxkIGJlIHBsYWNlZAotLgkgICAibmVhciIgdGhlIEdQLiAgKn0KLS4jZGVmaW5lIFNFQ19TTUFMTF9EQVRBIDB4MjAwMDAwMAotLgotLiAJeyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgd2hpY2ggbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyCi0uCSAgIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzLiAgKn0KLS4jZGVmaW5lIFNFQ19TSEFSRUQgMHg0MDAwMDAwCi0uCi0uCXsqICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICp9Ci0uCi0uCXsqIFNvbWUgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKn0KLS4KLS4JeyogU2VlIHRoZSB2bWEgZmllbGQuICAqfQotLgl1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKLS4KLS4JeyogV2hldGhlciByZWxvY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKn0KLS4JdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotLgotLgl7KiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICp9Ci0uCXVuc2lnbmVkIGludCBsaW5rZXJfbWFyayA6IDE7Ci0uCi0uCXsqIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uCXVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKLS4KLS4JeyogRW5kIG9mIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICp9Ci0uCi0uICAgICAgIHsqICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLS4gICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKLS4JICAgIHVzZXJfc2V0X3ZtYSBmbGFnIGlzIG1haW50YWluZWQgYnkgYmZkOyBpZiBpdCdzIG5vdCBzZXQsIHRoZQotLgkgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLS4JICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCi0uCSAgICB0YXJnZXQgYW5kIHZhcmlvdXMgZmxhZ3MpLiAgKn0KLS4KLS4gICBiZmRfdm1hIHZtYTsKLS4KLS4gICAgICAgeyogIFRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3b3VsZCBiZSBpbiBhCi0uICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLS4JICAgIGluZm9ybWF0aW9uLiAqfQotLgotLiAgIGJmZF92bWEgbG1hOwotLgotLiAgICAgICAgeyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gYnl0ZXMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgotLiAgICAgICAgICAgY29udGFpbnMgYSB2YWx1ZSBldmVuIGlmIHRoZSBzZWN0aW9uIGhhcyBubyBjb250ZW50cyAoZS5nLiwgdGhlCi0uICAgICAgICAgICBzaXplIG9mIDw8LmJzcz4+KS4gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiBhZnRlciByZWxvY2F0aW9uICp9Ci0uCi0uICAgYmZkX3NpemVfdHlwZSBfY29va2VkX3NpemU7Ci0uCi0uICAgICAgICB7KiBUaGUgb3JpZ2luYWwgc2l6ZSBvbiBkaXNrIG9mIHRoZSBzZWN0aW9uLCBpbiBieXRlcy4gIE5vcm1hbGx5IHRoaXMKLS4JICAgIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplLCBidXQgaWYgc29tZSByZWxheGluZyBoYXMKLS4JICAgIGJlZW4gZG9uZSwgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgYmlnZ2VyLiAgKn0KLS4KLS4gICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLS4KLS4gICAgICAgIHsqIElmIHRoaXMgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBvdXRwdXQsIHRoZW4gdGhpcyB2YWx1ZSBpcyB0aGUKLS4gICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaW5wdXQKLS4gICAgICAgICAgIHNlY3Rpb24uIEUuZy4sIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZSAxMDB0aCBieXRlIGluCi0uICAgICAgICAgICB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoaXMgdmFsdWUgd291bGQgYmUgMTAwLiAqfQotLgotLiAgIGJmZF92bWEgb3V0cHV0X29mZnNldDsKLS4KLS4gICAgICAgIHsqIFRoZSBvdXRwdXQgc2VjdGlvbiB0aHJvdWdoIHdoaWNoIHRvIG1hcCBvbiBvdXRwdXQuICp9Ci0uCi0uICAgc3RydWN0IHNlYyAqb3V0cHV0X3NlY3Rpb247Ci0uCi0uICAgICAgICB7KiBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHRoZSBzZWN0aW9uLCBhcyBhbiBleHBvbmVudCBvZiAyIC0KLS4gICAgICAgICAgIGUuZy4sIDMgYWxpZ25zIHRvIDJeMyAob3IgOCkuICp9Ci0uCi0uICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLS4KLS4gICAgICAgIHsqIElmIGFuIGlucHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiByZWxvY2F0aW9uCi0uICAgICAgICAgICByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICp9Ci0uCi0uICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICpyZWxvY2F0aW9uOwotLgotLiAgICAgICAgeyogSWYgYW4gb3V0cHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0bwotLiAgICAgICAgICAgcmVsb2NhdGlvbiByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICp9Ci0uCi0uICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICoqb3JlbG9jYXRpb247Ci0uCi0uICAgICAgICB7KiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gcmVjb3JkcyBpbiBvbmUgb2YgdGhlIGFib3ZlICAqfQotLgotLiAgIHVuc2lnbmVkIHJlbG9jX2NvdW50OwotLgotLiAgICAgICAgeyogSW5mb3JtYXRpb24gYmVsb3cgaXMgYmFjayBlbmQgc3BlY2lmaWMgLSBhbmQgbm90IGFsd2F5cyB1c2VkCi0uICAgICAgICAgICBvciB1cGRhdGVkLiAgKn0KLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2Ygc2VjdGlvbiBkYXRhICAgICp9Ci0uCi0uICAgZmlsZV9wdHIgZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvICp9Ci0uCi0uICAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0uCi0uICAgICAgICB7KiBGaWxlIHBvc2l0aW9uIG9mIGxpbmUgZGF0YSAgICAgICAqfQotLgotLiAgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFBvaW50ZXIgdG8gZGF0YSBmb3IgYXBwbGljYXRpb25zICp9Ci0uCi0uICAgUFRSIHVzZXJkYXRhOwotLgotLiAgICAgICAgeyogSWYgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoaXMgcG9pbnRzIHRvIHRoZSBhY3R1YWwKLS4gICAgICAgICAgIGNvbnRlbnRzLiAgKn0KLS4gICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLS4KLS4gICAgICAgIHsqIEF0dGFjaGVkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uICp9Ci0uCi0uICAgYWxlbnQgKmxpbmVubzsKLS4KLS4gICAgICAgIHsqIE51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzICAgKn0KLS4KLS4gICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotLgotLgkgeyogT3B0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBDT01EQVQgZW50cnk7IE5VTEwgaWYgbm90IENPTURBVCAqfQotLgotLiAgIHN0cnVjdCBiZmRfY29tZGF0X2luZm8gKmNvbWRhdDsKLS4KLS4gICAgICAgIHsqIFdoZW4gYSBzZWN0aW9uIGlzIGJlaW5nIG91dHB1dCwgdGhpcyB2YWx1ZSBjaGFuZ2VzIGFzIG1vcmUKLS4gICAgICAgICAgIGxpbmVudW1iZXJzIGFyZSB3cml0dGVuIG91dCAqfQotLgotLiAgIGZpbGVfcHRyIG1vdmluZ19saW5lX2ZpbGVwb3M7Ci0uCi0uICAgICAgICB7KiBXaGF0IHRoZSBzZWN0aW9uIG51bWJlciBpcyBpbiB0aGUgdGFyZ2V0IHdvcmxkICAqfQotLgotLiAgIGludCB0YXJnZXRfaW5kZXg7Ci0uCi0uICAgUFRSIHVzZWRfYnlfYmZkOwotLgotLiAgICAgICAgeyogSWYgdGhpcyBpcyBhIGNvbnN0cnVjdG9yIHNlY3Rpb24gdGhlbiBoZXJlIGlzIGEgbGlzdCBvZiB0aGUKLS4gICAgICAgICAgIHJlbG9jYXRpb25zIGNyZWF0ZWQgdG8gcmVsb2NhdGUgaXRlbXMgd2l0aGluIGl0LiAqfQotLgotLiAgIHN0cnVjdCByZWxlbnRfY2hhaW4gKmNvbnN0cnVjdG9yX2NoYWluOwotLgotLiAgICAgICAgeyogVGhlIEJGRCB3aGljaCBvd25zIHRoZSBzZWN0aW9uLiAqfQotLgotLiAgIGJmZCAqb3duZXI7Ci0uCi0uCSB7KiBBIHN5bWJvbCB3aGljaCBwb2ludHMgYXQgdGhpcyBzZWN0aW9uIG9ubHkgKn0KLS4gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0uICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bWJvbF9wdHJfcHRyOwotLgotLiAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcl9oZWFkOwotLiAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcl90YWlsOwotLn0gYXNlY3Rpb24gOwotLgotLiAgICB7KiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2xvYmFsLCBhbmQgYXJlIG1hbmFnZWQgYnkgQkZELiAgVGhlIGFwcGxpY2F0aW9uCi0uICAgICAgIGFuZCB0YXJnZXQgYmFjayBlbmQgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZXMgaW4KLS4JdGhlc2Ugc2VjdGlvbnMuICBOZXcgY29kZSBzaG91bGQgdXNlIHRoZSBzZWN0aW9uX3B0ciBtYWNyb3MgcmF0aGVyCi0uICAgICAgIHRoYW4gcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBjb25zdCBzZWN0aW9ucy4gIFRoZSBjb25zdCBzZWN0aW9ucwotLiAgICAgICBtYXkgZXZlbnR1YWxseSB2YW5pc2guICAqfQotLiNkZWZpbmUgQkZEX0FCU19TRUNUSU9OX05BTUUgIipBQlMqIgotLiNkZWZpbmUgQkZEX1VORF9TRUNUSU9OX05BTUUgIipVTkQqIgotLiNkZWZpbmUgQkZEX0NPTV9TRUNUSU9OX05BTUUgIipDT00qIgotLiNkZWZpbmUgQkZEX0lORF9TRUNUSU9OX05BTUUgIipJTkQqIgotLgotLiAgICB7KiB0aGUgYWJzb2x1dGUgc2VjdGlvbiAqfQotLmV4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfYWJzX3NlY3Rpb247Ci0uI2RlZmluZSBiZmRfYWJzX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9hYnNfc2VjdGlvbikKLS4jZGVmaW5lIGJmZF9pc19hYnNfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotLiAgICB7KiBQb2ludGVyIHRvIHRoZSB1bmRlZmluZWQgc2VjdGlvbiAqfQotLmV4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfdW5kX3NlY3Rpb247Ci0uI2RlZmluZSBiZmRfdW5kX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbikKLS4jZGVmaW5lIGJmZF9pc191bmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotLiAgICB7KiBQb2ludGVyIHRvIHRoZSBjb21tb24gc2VjdGlvbiAqfQotLmV4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfY29tX3NlY3Rpb247Ci0uI2RlZmluZSBiZmRfY29tX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9jb21fc2VjdGlvbikKLS4gICAgeyogUG9pbnRlciB0byB0aGUgaW5kaXJlY3Qgc2VjdGlvbiAqfQotLmV4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfaW5kX3NlY3Rpb247Ci0uI2RlZmluZSBiZmRfaW5kX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9pbmRfc2VjdGlvbikKLS4jZGVmaW5lIGJmZF9pc19pbmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfaW5kX3NlY3Rpb25fcHRyKQotLgotLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX2Fic19zeW1ib2w7Ci0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfY29tX3N5bWJvbDsKLS5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF91bmRfc3ltYm9sOwotLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX2luZF9zeW1ib2w7Ci0uI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2Moc2VjdGlvbikgXAotLiAgICAgKHNlY3Rpb24tPnJlbG9jX2RvbmUgPyAoYWJvcnQoKSwxKTogKHNlY3Rpb24pLT5fcmF3X3NpemUpCi0uI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9hZnRlcl9yZWxvYyhzZWN0aW9uKSBcCi0uICAgICAoKHNlY3Rpb24tPnJlbG9jX2RvbmUpID8gKHNlY3Rpb24pLT5fY29va2VkX3NpemU6IChhYm9ydCgpLDEpKQotKi8KLQotLyogV2UgdXNlIGEgbWFjcm8gdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGljIGFzeW1ib2wgc3RydWN0dXJlcyBiZWNhdXNlCi0gICB0cmFkaXRpb25hbCBDIGRvZXMgbm90IHBlcm1pdCB1cyB0byBpbml0aWFsaXplIGEgdW5pb24gbWVtYmVyIHdoaWxlCi0gICBnY2Mgd2FybnMgaWYgd2UgZG9uJ3QgaW5pdGlhbGl6ZSBpdC4gICovCi0gLyogdGhlX2JmZCwgbmFtZSwgdmFsdWUsIGF0dHIsIHNlY3Rpb24gWywgdWRhdGFdICovCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgR0xPQkFMX1NZTV9JTklUKE5BTUUsIFNFQ1RJT04pIFwKLSAgeyAwLCBOQU1FLCAwLCBCU0ZfU0VDVElPTl9TWU0sIChhc2VjdGlvbiAqKSBTRUNUSU9OLCB7IDAgfX0KLSNlbHNlCi0jZGVmaW5lIEdMT0JBTF9TWU1fSU5JVChOQU1FLCBTRUNUSU9OKSBcCi0gIHsgMCwgTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgU0VDVElPTiB9Ci0jZW5kaWYKLQotLyogVGhlc2Ugc3ltYm9scyBhcmUgZ2xvYmFsLCBub3Qgc3BlY2lmaWMgdG8gYW55IEJGRC4gIFRoZXJlZm9yZSwgYW55dGhpbmcKLSAgIHRoYXQgdHJpZXMgdG8gY2hhbmdlIHRoZW0gaXMgYnJva2VuLCBhbmQgc2hvdWxkIGJlIHJlcGFpcmVkLiAgKi8KLQotc3RhdGljIGNvbnN0IGFzeW1ib2wgZ2xvYmFsX3N5bXNbXSA9Ci17Ci0gIEdMT0JBTF9TWU1fSU5JVCAoQkZEX0NPTV9TRUNUSU9OX05BTUUsICZiZmRfY29tX3NlY3Rpb24pLAotICBHTE9CQUxfU1lNX0lOSVQgKEJGRF9VTkRfU0VDVElPTl9OQU1FLCAmYmZkX3VuZF9zZWN0aW9uKSwKLSAgR0xPQkFMX1NZTV9JTklUIChCRkRfQUJTX1NFQ1RJT05fTkFNRSwgJmJmZF9hYnNfc2VjdGlvbiksCi0gIEdMT0JBTF9TWU1fSU5JVCAoQkZEX0lORF9TRUNUSU9OX05BTUUsICZiZmRfaW5kX3NlY3Rpb24pCi19OwotCi0jZGVmaW5lIFNURF9TRUNUSU9OKFNFQywgRkxBR1MsIFNZTSwgTkFNRSwgSURYKQlcCi0gIGNvbnN0IGFzeW1ib2wgKiBjb25zdCBTWU0gPSAoYXN5bWJvbCAqKSAmZ2xvYmFsX3N5bXNbSURYXTsgXAotICBjb25zdCBhc2VjdGlvbiBTRUMgPSBcCi0gICAgLyogbmFtZSwgaW5kZXgsIG5leHQsIGZsYWdzLCBzZXRfdm1hLCByZWxvY19kb25lLCBsaW5rZXJfbWFyaywgZ2NfbWFyayAqLyBcCi0gICAgeyBOQU1FLCAgMCwgICAgIDAsICAgIEZMQUdTLCAwLCAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAgMCwJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIC8qIHZtYSwgbG1hLCBfY29va2VkX3NpemUsIF9yYXdfc2l6ZSwgb3V0cHV0X29mZnNldCwgb3V0cHV0X3NlY3Rpb24sICovICAgXAotICAgICAgIDAsICAgMCwgICAwLCAgICAgICAgICAgIDAsICAgICAgICAgMCwgICAgICAgICAgICAgKHN0cnVjdCBzZWMgKikgJlNFQywgXAotCQkJCQkJCQkJICAgICAgXAotICAgIC8qIGFsaWcuLi4sIHJlbG9jLi4uLCBvcmVsLi4uLCByZWxvY19jb3VudCwgZmlsZXBvcywgcmVsXy4uLiwgbGluZV8uLi4gKi8gXAotICAgICAgIDAsICAgICAgIDAsICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgMCwgICAgICAgMCwgCSAgIDAsCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLSAgICAvKiB1c2VyZGF0YSwgY29udGVudHMsIGxpbmVubywgbGluZW5vX2NvdW50ICovIAkJCSAgICAgIFwKLSAgICAgICAwLCAgICAgICAgMCwgICAgICAgIDAsICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgLyogY29tZGF0X2luZm8sIG1vdmluZ19saW5lX2ZpbGVwb3MsIHRhcmdldF9pbmRleCwgdXNlZF9ieV9iZmQsICAqLyAgICAgICBcCi0gICAgICAgTlVMTCwgICAgICAgIDAsICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgMCwgCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgLyogY29ucy4uLiwgb3duZXIsIHN5bWJvbCAqLyAJCQkJCSAgICAgIFwKLSAgICAgICAwLCAgICAgICAwLCAgICAgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKikgJmdsb2JhbF9zeW1zW0lEWF0sICAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLSAgICAvKiBzeW1ib2xfcHRyX3B0ciwgICAgICAgICAgICAgICAgICAgICAgbGlua19vcmRlcl9oZWFkLCAuLi5fdGFpbCAqLyAgICAgIFwKLSAgICAgICAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikgJlNZTSwgMCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLVNURF9TRUNUSU9OIChiZmRfY29tX3NlY3Rpb24sIFNFQ19JU19DT01NT04sIGJmZF9jb21fc3ltYm9sLAotCSAgICAgQkZEX0NPTV9TRUNUSU9OX05BTUUsIDApOwotU1REX1NFQ1RJT04gKGJmZF91bmRfc2VjdGlvbiwgMCwgYmZkX3VuZF9zeW1ib2wsIEJGRF9VTkRfU0VDVElPTl9OQU1FLCAxKTsKLVNURF9TRUNUSU9OIChiZmRfYWJzX3NlY3Rpb24sIDAsIGJmZF9hYnNfc3ltYm9sLCBCRkRfQUJTX1NFQ1RJT05fTkFNRSwgMik7Ci1TVERfU0VDVElPTiAoYmZkX2luZF9zZWN0aW9uLCAwLCBiZmRfaW5kX3N5bWJvbCwgQkZEX0lORF9TRUNUSU9OX05BTUUsIDMpOwotI3VuZGVmIFNURF9TRUNUSU9OCi0KLS8qCi1ET0NERAotSU5PREUKLXNlY3Rpb24gcHJvdG90eXBlcywgICwgdHlwZWRlZiBhc2VjdGlvbiwgU2VjdGlvbnMKLVNVQlNFQ1RJT04KLQlTZWN0aW9uIHByb3RvdHlwZXMKLQotVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhlIHNlY3Rpb24gaGFuZGxpbmcgcGFydCBvZiBCRkQuCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCi1TWU5PUFNJUwotCWFzZWN0aW9uICpiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCVJ1biB0aHJvdWdoIEB2YXJ7YWJmZH0gYW5kIHJldHVybiB0aGUgb25lIG9mIHRoZQotCTw8YXNlY3Rpb24+PnMgd2hvc2UgbmFtZSBtYXRjaGVzIEB2YXJ7bmFtZX0sIG90aGVyd2lzZSA8PE5VTEw+Pi4KLQlAeHJlZntTZWN0aW9uc30sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0JVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIHNwZWNpYWwgY2FzZXM7IHRoZSBub3JtYWwgd2F5IHRvIHByb2Nlc3MKLQlhbGwgc2VjdGlvbnMgb2YgYSBnaXZlbiBuYW1lIGlzIHRvIHVzZSA8PGJmZF9tYXBfb3Zlcl9zZWN0aW9ucz4+IGFuZAotCTw8c3RyY21wPj4gb24gdGhlIG5hbWUgKG9yIGJldHRlciB5ZXQsIGJhc2UgaXQgb24gdGhlIHNlY3Rpb24gZmxhZ3MKLQlvciBzb21ldGhpbmcgZWxzZSkgZm9yIGVhY2ggc2VjdGlvbi4KLSovCi0KLWFzZWN0aW9uICoKLWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWN0OwotCi0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0ICE9IE5VTEw7IHNlY3QgPSBzZWN0LT5uZXh0KQotICAgIGlmICghc3RyY21wIChzZWN0LT5uYW1lLCBuYW1lKSkKLSAgICAgIHJldHVybiBzZWN0OwotICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV9zZWN0aW9uX29sZF93YXkKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5KGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSk7Ci0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgbmV3IGVtcHR5IHNlY3Rpb24gY2FsbGVkIEB2YXJ7bmFtZX0KLQlhbmQgYXR0YWNoIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGNoYWluIG9mIHNlY3Rpb25zIGZvciB0aGUKLQlCRkQgQHZhcnthYmZkfS4gQW4gYXR0ZW1wdCB0byBjcmVhdGUgYSBzZWN0aW9uIHdpdGggYSBuYW1lIHdoaWNoCi0JaXMgYWxyZWFkeSBpbiB1c2UgcmV0dXJucyBpdHMgcG9pbnRlciB3aXRob3V0IGNoYW5naW5nIHRoZQotCXNlY3Rpb24gY2hhaW4uCi0KLQlJdCBoYXMgdGhlIGZ1bm55IG5hbWUgc2luY2UgdGhpcyBpcyB0aGUgd2F5IGl0IHVzZWQgdG8gYmUKLQliZWZvcmUgaXQgd2FzIHJld3JpdHRlbi4uLi4KLQotCVBvc3NpYmxlIGVycm9ycyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlJZiBvdXRwdXQgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgdGhpcyBCRkQuCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JSWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCi0KLSovCi0KLQotYXNlY3Rpb24gKgotYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gICAgfQotICByZXR1cm4gc2VjOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV9zZWN0aW9uX2FueXdheQotCi1TWU5PUFNJUwotCWFzZWN0aW9uICpiZmRfbWFrZV9zZWN0aW9uX2FueXdheShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotICAgQ3JlYXRlIGEgbmV3IGVtcHR5IHNlY3Rpb24gY2FsbGVkIEB2YXJ7bmFtZX0gYW5kIGF0dGFjaCBpdCB0byB0aGUgZW5kIG9mCi0gICB0aGUgY2hhaW4gb2Ygc2VjdGlvbnMgZm9yIEB2YXJ7YWJmZH0uICBDcmVhdGUgYSBuZXcgc2VjdGlvbiBldmVuIGlmIHRoZXJlCi0gICBpcyBhbHJlYWR5IGEgc2VjdGlvbiB3aXRoIHRoYXQgbmFtZS4KLQotICAgUmV0dXJuIDw8TlVMTD4+IGFuZCBzZXQgPDxiZmRfZXJyb3I+PiBvbiBlcnJvcjsgcG9zc2libGUgZXJyb3JzIGFyZToKLSAgIG8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtIElmIG91dHB1dCBoYXMgYWxyZWFkeSBzdGFydGVkIGZvciBAdmFye2FiZmR9LgotICAgbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtIElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgotKi8KLQotc2VjX3B0cgotYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0gIGFzZWN0aW9uICoqcHJldiA9ICZhYmZkLT5zZWN0aW9uczsKLSAgYXNlY3Rpb24gKnNlY3QgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHdoaWxlIChzZWN0KQotICAgIHsKLSAgICAgIHByZXYgPSAmc2VjdC0+bmV4dDsKLSAgICAgIHNlY3QgPSBzZWN0LT5uZXh0OwotICAgIH0KLQotICBuZXdzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBuZXdzZWN0LT5uYW1lID0gbmFtZTsKLSAgbmV3c2VjdC0+aW5kZXggPSBhYmZkLT5zZWN0aW9uX2NvdW50Kys7Ci0gIG5ld3NlY3QtPmZsYWdzID0gU0VDX05PX0ZMQUdTOwotCi0gIG5ld3NlY3QtPnVzZXJkYXRhID0gTlVMTDsKLSAgbmV3c2VjdC0+Y29udGVudHMgPSBOVUxMOwotICBuZXdzZWN0LT5uZXh0ID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG5ld3NlY3QtPnJlbG9jYXRpb24gPSAoYXJlbGVudCAqKSBOVUxMOwotICBuZXdzZWN0LT5yZWxvY19jb3VudCA9IDA7Ci0gIG5ld3NlY3QtPmxpbmVfZmlsZXBvcyA9IDA7Ci0gIG5ld3NlY3QtPm93bmVyID0gYWJmZDsKLSAgbmV3c2VjdC0+Y29tZGF0ID0gTlVMTDsKLQotICAvKiBDcmVhdGUgYSBzeW1ib2wgd2hvcyBvbmx5IGpvYiBpcyB0byBwb2ludCB0byB0aGlzIHNlY3Rpb24uIFRoaXMgaXMKLSAgICAgdXNlZnVsIGZvciB0aGluZ3MgbGlrZSByZWxvY3Mgd2hpY2ggYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIGEKLSAgICAgc2VjdGlvbi4gICovCi0gIG5ld3NlY3QtPnN5bWJvbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChuZXdzZWN0LT5zeW1ib2wgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3c2VjdC0+c3ltYm9sLT5uYW1lID0gbmFtZTsKLSAgbmV3c2VjdC0+c3ltYm9sLT52YWx1ZSA9IDA7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+c2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+ZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0KLSAgbmV3c2VjdC0+c3ltYm9sX3B0cl9wdHIgPSAmbmV3c2VjdC0+c3ltYm9sOwotCi0gIGlmIChCRkRfU0VORCAoYWJmZCwgX25ld19zZWN0aW9uX2hvb2ssIChhYmZkLCBuZXdzZWN0KSkgIT0gdHJ1ZSkKLSAgICB7Ci0gICAgICBmcmVlIChuZXdzZWN0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAqcHJldiA9IG5ld3NlY3Q7Ci0gIHJldHVybiBuZXdzZWN0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV9zZWN0aW9uCi0KLVNZTk9QU0lTCi0JYXNlY3Rpb24gKmJmZF9tYWtlX3NlY3Rpb24oYmZkICosIENPTlNUIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotICAgTGlrZSA8PGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5Pj4sIGJ1dCByZXR1cm4gPDxOVUxMPj4gKHdpdGhvdXQgY2FsbGluZwotICAgYmZkX3NldF9lcnJvciAoKSkgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VjdGlvbiBjaGFpbiBpZiB0aGVyZSBpcyBhbHJlYWR5IGEKLSAgIHNlY3Rpb24gbmFtZWQgQHZhcntuYW1lfS4gIElmIHRoZXJlIGlzIGFuIGVycm9yLCByZXR1cm4gPDxOVUxMPj4gYW5kIHNldAotICAgPDxiZmRfZXJyb3I+Pi4KLSovCi0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKnNlY3QgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfQUJTX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9DT01fU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfY29tX3NlY3Rpb25fcHRyOwotICAgIH0KLSAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX1VORF9TRUNUSU9OX05BTUUpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9JTkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfaW5kX3NlY3Rpb25fcHRyOwotICAgIH0KLQotICB3aGlsZSAoc2VjdCkKLSAgICB7Ci0gICAgICBpZiAoIXN0cmNtcCAoc2VjdC0+bmFtZSwgbmFtZSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBzZWN0ID0gc2VjdC0+bmV4dDsKLSAgICB9Ci0KLSAgLyogVGhlIG5hbWUgaXMgbm90IGFscmVhZHkgdXNlZDsgZ28gYWhlYWQgYW5kIG1ha2UgYSBuZXcgc2VjdGlvbi4gICovCi0gIHJldHVybiBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zZWN0aW9uX2ZsYWdzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBmbGFnd29yZCBmbGFncyk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzZWN0aW9uIEB2YXJ7c2VjfSBpbiB0aGUgQkZECi0JQHZhcnthYmZkfSB0byB0aGUgdmFsdWUgQHZhcntmbGFnc30uIFJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLAotCTw8ZmFsc2U+PiBvbiBlcnJvci4gUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCVRoZSBzZWN0aW9uIGNhbm5vdCBoYXZlIG9uZSBvciBtb3JlIG9mIHRoZSBhdHRyaWJ1dGVzCi0JcmVxdWVzdGVkLiBGb3IgZXhhbXBsZSwgYSAuYnNzIHNlY3Rpb24gaW4gPDxhLm91dD4+IG1heSBub3QKLQloYXZlIHRoZSA8PFNFQ19IQVNfQ09OVEVOVFM+PiBmaWVsZCBzZXQuCi0KLSovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uLCBmbGFncykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0jaWYgMAotICAvKiBJZiB5b3UgdHJ5IHRvIGNvcHkgYSB0ZXh0IHNlY3Rpb24gZnJvbSBhbiBpbnB1dCBmaWxlICh3aGVyZSBpdAotICAgICBoYXMgdGhlIFNFQ19DT0RFIGZsYWcgc2V0KSB0byBhbiBvdXRwdXQgZmlsZSwgdGhpcyBsb3NlcyBiaWcgaWYKLSAgICAgdGhlIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKGFiZmQpIGRvZXNuJ3QgaGF2ZSB0aGUgU0VDX0NPREUKLSAgICAgc2V0IC0gd2hpY2ggaXQgZG9lc24ndCwgYXQgbGVhc3Qgbm90IGZvciBhLm91dC4gIEZJWE1FICovCi0KLSAgaWYgKChmbGFncyAmIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKGFiZmQpKSAhPSBmbGFncykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gIHNlY3Rpb24tPmZsYWdzID0gZmxhZ3M7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tYXBfb3Zlcl9zZWN0aW9ucwotCi1TWU5PUFNJUwotCXZvaWQgYmZkX21hcF9vdmVyX3NlY3Rpb25zKGJmZCAqYWJmZCwKLQkJCQkgICB2b2lkICgqZnVuYykoYmZkICphYmZkLAotCQkJCQkJYXNlY3Rpb24gKnNlY3QsCi0JCQkJCQlQVFIgb2JqKSwKLQkJCQkgICBQVFIgb2JqKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBAdmFye2Z1bmN9IGZvciBlYWNoIHNlY3Rpb24KLQlhdHRhY2hlZCB0byB0aGUgQkZEIEB2YXJ7YWJmZH0sIHBhc3NpbmcgQHZhcntvYmp9IGFzIGFuCi0JYXJndW1lbnQuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhcyBpZiBieQotCi18CWZ1bmMoYWJmZCwgdGhlX3NlY3Rpb24sIG9iaik7Ci0KLQlUaGlzIGlzIHRoZSBwcmVmZXJlZCBtZXRob2QgZm9yIGl0ZXJhdGluZyBvdmVyIHNlY3Rpb25zOyBhbgotCWFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHVzZSBhIGxvb3A6Ci0KLXwJICAgc2VjdGlvbiAqcDsKLXwJICAgZm9yIChwID0gYWJmZC0+c2VjdGlvbnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi18CSAgICAgIGZ1bmMoYWJmZCwgcCwgLi4uKQotCi0KLSovCi0KLS8qVkFSQVJHUzIqLwotdm9pZAotYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBvcGVyYXRpb24sIHVzZXJfc3RvcmFnZSkKLSAgICAgYmZkICphYmZkOwotICAgICB2b2lkICgqb3BlcmF0aW9uKSBQQVJBTVMgKChiZmQgKiBhYmZkLCBhc2VjdGlvbiAqIHNlY3QsIFBUUiBvYmopKTsKLSAgICAgUFRSIHVzZXJfc3RvcmFnZTsKLXsKLSAgYXNlY3Rpb24gKnNlY3Q7Ci0gIHVuc2lnbmVkIGludCBpID0gMDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdCAhPSBOVUxMOyBpKyssIHNlY3QgPSBzZWN0LT5uZXh0KQotICAgICgqb3BlcmF0aW9uKSAoYWJmZCwgc2VjdCwgdXNlcl9zdG9yYWdlKTsKLQotICBpZiAoaSAhPSBhYmZkLT5zZWN0aW9uX2NvdW50KQkvKiBEZWJ1Z2dpbmcgKi8KLSAgICBhYm9ydCAoKTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3NlY3Rpb25fc2l6ZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zZWN0aW9uX3NpemUoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBiZmRfc2l6ZV90eXBlIHZhbCk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IEB2YXJ7c2VjfSB0byB0aGUgc2l6ZSBAdmFye3ZhbH0uIElmIHRoZSBvcGVyYXRpb24gaXMKLQlvaywgdGhlbiA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZSA8PGZhbHNlPj4uCi0KLQlQb3NzaWJsZSBlcnJvciByZXR1cm5zOgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JV3JpdGluZyBoYXMgc3RhcnRlZCB0byB0aGUgQkZELCBzbyBzZXR0aW5nIHRoZSBzaXplIGlzIGludmFsaWQuCi0KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBwdHIsIHZhbCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHB0cjsKLSAgICAgYmZkX3NpemVfdHlwZSB2YWw7Ci17Ci0gIC8qIE9uY2UgeW91J3ZlIHN0YXJ0ZWQgd3JpdGluZyB0byBhbnkgc2VjdGlvbiB5b3UgY2Fubm90IGNyZWF0ZSBvciBjaGFuZ2UKLSAgICAgdGhlIHNpemUgb2YgYW55IG90aGVycy4gKi8KLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwdHItPl9jb29rZWRfc2l6ZSA9IHZhbDsKLSAgcHRyLT5fcmF3X3NpemUgPSB2YWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gICAgICAgICAoYmZkICphYmZkLAotICAgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICAgICBQVFIgZGF0YSwKLSAgICAgICAgIGZpbGVfcHRyIG9mZnNldCwKLSAgICAgICAgIGJmZF9zaXplX3R5cGUgY291bnQpOwotCi0KLURFU0NSSVBUSU9OCi0JU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gQHZhcntzZWN0aW9ufSBpbiBCRkQKLQlAdmFye2FiZmR9IHRvIHRoZSBkYXRhIHN0YXJ0aW5nIGluIG1lbW9yeSBhdCBAdmFye2RhdGF9LiBUaGUKLQlkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzZWN0aW9uIHN0YXJ0aW5nIGF0IG9mZnNldAotCUB2YXJ7b2Zmc2V0fSBmb3IgQHZhcntjb3VudH0gYnl0ZXMuCi0KLQotCi0JTm9ybWFsbHkgPDx0cnVlPj4gaXMgcmV0dXJuZWQsIGVsc2UgPDxmYWxzZT4+LiBQb3NzaWJsZSBlcnJvcgotCXJldHVybnMgYXJlOgotCW8gPDxiZmRfZXJyb3Jfbm9fY29udGVudHM+PiAtCi0JVGhlIG91dHB1dCBzZWN0aW9uIGRvZXMgbm90IGhhdmUgdGhlIDw8U0VDX0hBU19DT05URU5UUz4+Ci0JYXR0cmlidXRlLCBzbyBub3RoaW5nIGNhbiBiZSB3cml0dGVuIHRvIGl0LgotCW8gYW5kIHNvbWUgbW9yZSB0b28KLQotCVRoaXMgcm91dGluZSBpcyBmcm9udCBlbmQgdG8gdGhlIGJhY2sgZW5kIGZ1bmN0aW9uCi0JPDxfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzPj4uCi0KLQotKi8KLQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3coYWJmZCxzZWMpIFwKLShzZWMtPnJlbG9jX2RvbmUgXAotID8gYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2MgKHNlYykgXAotIDogYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpKQotCi1ib29sZWFuCi1iZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3o7Ci0KLSAgaWYgKCEoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uKSAmIFNFQ19IQVNfQ09OVEVOVFMpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0gICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICB9Ci0KLSAgaWYgKG9mZnNldCA8IDApCi0gICAgewotICAgIGJhZF92YWw6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHN6ID0gYmZkX2dldF9zZWN0aW9uX3NpemVfbm93IChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBvZmZzZXQgPiBzegotICAgICAgfHwgY291bnQgPiBzegotICAgICAgfHwgb2Zmc2V0ICsgY291bnQgPiBzeikKLSAgICBnb3RvIGJhZF92YWw7Ci0KLSAgc3dpdGNoIChhYmZkLT5kaXJlY3Rpb24pCi0gICAgewotICAgIGNhc2UgcmVhZF9kaXJlY3Rpb246Ci0gICAgY2FzZSBub19kaXJlY3Rpb246Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSB3cml0ZV9kaXJlY3Rpb246Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYm90aF9kaXJlY3Rpb246Ci0gICAgICAvKiBGaWxlIGlzIG9wZW5lZCBmb3IgdXBkYXRlLiBgb3V0cHV0X2hhc19iZWd1bicgc29tZSB0aW1lIGFnbyB3aGVuCi0JICAgdGhlIGZpbGUgd2FzIGNyZWF0ZWQuICBEbyBub3QgcmVjb21wdXRlIHNlY3Rpb25zIHNpemVzIG9yIGFsaWdubWVudHMKLQkgICBpbiBfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnQuICAqLwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzLAotCQkoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpKSkKLSAgICB7Ci0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gICAgICAgIChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sCi0gICAgICAgICBmaWxlX3B0ciBvZmZzZXQsIGJmZF9zaXplX3R5cGUgY291bnQpOwotCi1ERVNDUklQVElPTgotCVJlYWQgZGF0YSBmcm9tIEB2YXJ7c2VjdGlvbn0gaW4gQkZEIEB2YXJ7YWJmZH0KLQlpbnRvIG1lbW9yeSBzdGFydGluZyBhdCBAdmFye2xvY2F0aW9ufS4gVGhlIGRhdGEgaXMgcmVhZCBhdCBhbgotCW9mZnNldCBvZiBAdmFye29mZnNldH0gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IHNlY3Rpb24sCi0JYW5kIGlzIHJlYWQgZm9yIEB2YXJ7Y291bnR9IGJ5dGVzLgotCi0JSWYgdGhlIGNvbnRlbnRzIG9mIGEgY29uc3RydWN0b3Igd2l0aCB0aGUgPDxTRUNfQ09OU1RSVUNUT1I+PgotCWZsYWcgc2V0IGFyZSByZXF1ZXN0ZWQgb3IgaWYgdGhlIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUKLQk8PFNFQ19IQVNfQ09OVEVOVFM+PiBmbGFnIHNldCwgdGhlbiB0aGUgQHZhcntsb2NhdGlvbn0gaXMgZmlsbGVkCi0Jd2l0aCB6ZXJvZXMuIElmIG5vIGVycm9ycyBvY2N1ciwgPDx0cnVlPj4gaXMgcmV0dXJuZWQsIGVsc2UKLQk8PGZhbHNlPj4uCi0KLQotCi0qLwotYm9vbGVhbgotYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBiZmRfc2l6ZV90eXBlIHN6OwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICBtZW1zZXQgKGxvY2F0aW9uLCAwLCAodW5zaWduZWQpIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAob2Zmc2V0IDwgMCkKLSAgICB7Ci0gICAgYmFkX3ZhbDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLyogRXZlbiBpZiByZWxvY19kb25lIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gcmVhZHMgdW5yZWxvY2F0ZWQKLSAgICAgY29udGVudHMsIHNvIHdlIHdhbnQgdGhlIHJhdyBzaXplLiAgKi8KLSAgc3ogPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGlmICgoYmZkX3NpemVfdHlwZSkgb2Zmc2V0ID4gc3ogfHwgY291bnQgPiBzeiB8fCBvZmZzZXQgKyBjb3VudCA+IHN6KQotICAgIGdvdG8gYmFkX3ZhbDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICAvKiBEb24ndCBib3RoZXIuICAqLwotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotICAgIHsKLSAgICAgIG1lbXNldCAobG9jYXRpb24sIDAsICh1bnNpZ25lZCkgY291bnQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIG1lbWNweSAobG9jYXRpb24sIHNlY3Rpb24tPmNvbnRlbnRzICsgb2Zmc2V0LCAoc2l6ZV90KSBjb3VudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzLAotCQkgICAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGJmZCAqaWJmZCwgYXNlY3Rpb24gKmlzZWMsIGJmZCAqb2JmZCwgYXNlY3Rpb24gKm9zZWMpOwotCi1ERVNDUklQVElPTgotCUNvcHkgcHJpdmF0ZSBzZWN0aW9uIGluZm9ybWF0aW9uIGZyb20gQHZhcntpc2VjfSBpbiB0aGUgQkZECi0JQHZhcntpYmZkfSB0byB0aGUgc2VjdGlvbiBAdmFye29zZWN9IGluIHRoZSBCRkQgQHZhcntvYmZkfS4KLQlSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IKLQlyZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29zZWN9LgotCi0uI2RlZmluZSBiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YShpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pIFwKLS4gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsIFwKLS4JCShpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pKQotKi8KLQotLyoKLUZVTkNUSU9OCi0JX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0Ci0KLVNZTk9QU0lTCi0Jdm9pZCBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLQkoYXNlY3Rpb24gKnNlY3Rpb24pOwotCi1ERVNDUklQVElPTgotCVJlbW92ZSBAdmFye3NlY3Rpb259IGZyb20gdGhlIG91dHB1dC4gIElmIHRoZSBvdXRwdXQgc2VjdGlvbiBiZWNvbWVzCi0JZW1wdHksIHJlbW92ZSBpdCBmcm9tIHRoZSBvdXRwdXQgYmZkLgotKi8KLXZvaWQKLV9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocykKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGFzZWN0aW9uICoqc3BwLCAqb3M7Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcCwgKnBwOwotCi0gIC8qIEV4Y2lzZSB0aGUgaW5wdXQgc2VjdGlvbiBmcm9tIHRoZSBsaW5rIG9yZGVyLiAgKi8KLSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLSAgZm9yIChwID0gb3MtPmxpbmtfb3JkZXJfaGVhZCwgcHAgPSBOVUxMOyBwICE9IE5VTEw7IHBwID0gcCwgcCA9IHAtPm5leHQpCi0gICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkmJiBwLT51LmluZGlyZWN0LnNlY3Rpb24gPT0gcykKLSAgICAgIHsKLQlpZiAocHApCi0JICBwcC0+bmV4dCA9IHAtPm5leHQ7Ci0JZWxzZQotCSAgb3MtPmxpbmtfb3JkZXJfaGVhZCA9IHAtPm5leHQ7Ci0JaWYgKCFwLT5uZXh0KQotCSAgb3MtPmxpbmtfb3JkZXJfdGFpbCA9IHBwOwotCWJyZWFrOwotICAgICAgfQotCi0gIC8qIElmIHRoZSBvdXRwdXQgc2VjdGlvbiBpcyBlbXB0eSwgcmVtb3ZlIGl0IHRvby4gIENhcmVmdWwgYWJvdXQgc2VjdGlvbnMKLSAgICAgdGhhdCBoYXZlIGJlZW4gZGlzY2FyZGVkIGluIHRoZSBsaW5rIHNjcmlwdCAtLSB0aGV5IGFyZSBtYXBwZWQgdG8gCi0gICAgIGJmZF9hYnNfc2VjdGlvbiwgd2hpY2ggaGFzIG5vIG93bmVyLiAgKi8KLSAgaWYgKCFvcy0+bGlua19vcmRlcl9oZWFkICYmIG9zLT5vd25lcikKLSAgICB7Ci0gICAgICBmb3IgKHNwcCA9ICZvcy0+b3duZXItPnNlY3Rpb25zOyAqc3BwOyBzcHAgPSAmKCpzcHApLT5uZXh0KQotCWlmICgqc3BwID09IG9zKQotCSAgewotCSAgICAqc3BwID0gb3MtPm5leHQ7Ci0JICAgIG9zLT5vd25lci0+c2VjdGlvbl9jb3VudC0tOwotCSAgICBicmVhazsKLQkgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iZmQvc29tLmMgYi9iZmQvc29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmI2YzMuLjAwMDAwMDAKLS0tIGEvYmZkL3NvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMwOCArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIEhQIFBBLVJJU0MgU09NIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikgfHwgZGVmaW5lZChIT1NUX0hQUEFNUEVJWCkKLQotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgInNvbS5oIgotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qIE1hZ2ljIG5vdCBkZWZpbmVkIGluIHN0YW5kYXJkIEhQLVVYIGhlYWRlciBmaWxlcyB1bnRpbCA4LjAgKi8KLQotI2lmbmRlZiBDUFVfUEFfUklTQzFfMAotI2RlZmluZSBDUFVfUEFfUklTQzFfMCAweDIwQgotI2VuZGlmIC8qIENQVV9QQV9SSVNDMV8wICovCi0KLSNpZm5kZWYgQ1BVX1BBX1JJU0MxXzEKLSNkZWZpbmUgQ1BVX1BBX1JJU0MxXzEgMHgyMTAKLSNlbmRpZiAvKiBDUFVfUEFfUklTQzFfMSAqLwotCi0jaWZuZGVmIENQVV9QQV9SSVNDMl8wCi0jZGVmaW5lIENQVV9QQV9SSVNDMl8wIDB4MjE0Ci0jZW5kaWYgLyogQ1BVX1BBX1JJU0MyXzAgKi8KLQotI2lmbmRlZiBfUEFfUklTQzFfMF9JRAotI2RlZmluZSBfUEFfUklTQzFfMF9JRCBDUFVfUEFfUklTQzFfMAotI2VuZGlmIC8qIF9QQV9SSVNDMV8wX0lEICovCi0KLSNpZm5kZWYgX1BBX1JJU0MxXzFfSUQKLSNkZWZpbmUgX1BBX1JJU0MxXzFfSUQgQ1BVX1BBX1JJU0MxXzEKLSNlbmRpZiAvKiBfUEFfUklTQzFfMV9JRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDMl8wX0lECi0jZGVmaW5lIF9QQV9SSVNDMl8wX0lEIENQVV9QQV9SSVNDMl8wCi0jZW5kaWYgLyogX1BBX1JJU0MyXzBfSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQ19NQVhJRAotI2RlZmluZSBfUEFfUklTQ19NQVhJRAkweDJGRgotI2VuZGlmIC8qIF9QQV9SSVNDX01BWElEICovCi0KLSNpZm5kZWYgX1BBX1JJU0NfSUQKLSNkZWZpbmUgX1BBX1JJU0NfSUQoX19tX251bSkJCVwKLSAgICAoKChfX21fbnVtKSA9PSBfUEFfUklTQzFfMF9JRCkgfHwJXAotICAgICAoKF9fbV9udW0pID49IF9QQV9SSVNDMV8xX0lEICYmIChfX21fbnVtKSA8PSBfUEFfUklTQ19NQVhJRCkpCi0jZW5kaWYgLyogX1BBX1JJU0NfSUQgKi8KLQotCi0vKiBISVVYIGluIGl0J3MgaW5maW5pdGUgc3R1cGlkaXR5IGNoYW5nZWQgdGhlIG5hbWVzIGZvciBzZXZlcmFsICJ3ZWxsCi0gICBrbm93biIgY29uc3RhbnRzLiAgV29yayBhcm91bmQgc3VjaCBicmFpbmRhbWFnZS4gIFRyeSB0aGUgSFBVWCB2ZXJzaW9uCi0gICBmaXJzdCwgdGhlbiB0aGUgSElVWCB2ZXJzaW9uLCBhbmQgZmluYWxseSBwcm92aWRlIGEgZGVmYXVsdC4gICovCi0jaWZkZWYgSFBVWF9BVVhfSUQKLSNkZWZpbmUgRVhFQ19BVVhfSUQgSFBVWF9BVVhfSUQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKEVYRUNfQVVYX0lEKSAmJiBkZWZpbmVkIChISVVYX0FVWF9JRCkKLSNkZWZpbmUgRVhFQ19BVVhfSUQgSElVWF9BVVhfSUQKLSNlbmRpZgotCi0jaWZuZGVmIEVYRUNfQVVYX0lECi0jZGVmaW5lIEVYRUNfQVVYX0lEIDAKLSNlbmRpZgotCi0vKiBTaXplIChpbiBjaGFycykgb2YgdGhlIHRlbXBvcmFyeSBidWZmZXJzIHVzZWQgZHVyaW5nIGZpeHVwIGFuZCBzdHJpbmcKLSAgIHRhYmxlIHdyaXRlcy4gICAqLwotICAgCi0jZGVmaW5lIFNPTV9UTVBfQlVGU0laRSA4MTkyCi0KLS8qIFNpemUgb2YgdGhlIGhhc2ggdGFibGUgaW4gYXJjaGl2ZXMuICAqLwotI2RlZmluZSBTT01fTFNUX0hBU0hfU0laRSAzMQotCi0vKiBNYXggbnVtYmVyIG9mIFNPTXMgdG8gYmUgZm91bmQgaW4gYW4gYXJjaGl2ZS4gICovCi0jZGVmaW5lIFNPTV9MU1RfTU9EVUxFX0xJTUlUIDEwMjQKLQotLyogR2VuZXJpYyBhbGlnbm1lbnQgbWFjcm8uICAqLwotI2RlZmluZSBTT01fQUxJR04odmFsLCBhbGlnbm1lbnQpIFwKLSAgKCgodmFsKSArIChhbGlnbm1lbnQpIC0gMSkgJiB+KChhbGlnbm1lbnQpIC0gMSkpCi0KLS8qIFNPTSBhbGxvd3MgYW55IG9uZSBvZiB0aGUgZm91ciBwcmV2aW91cyByZWxvY2F0aW9ucyB0byBiZSByZXVzZWQKLSAgIHdpdGggYSAiUl9QUkVWX0ZJWFVQIiByZWxvY2F0aW9uIGVudHJ5LiAgU2luY2UgUl9QUkVWX0ZJWFVQCi0gICByZWxvY2F0aW9ucyBhcmUgYWx3YXlzIGEgc2luZ2xlIGJ5dGUsIHVzaW5nIGEgUl9QUkVWX0ZJWFVQIGluc3RlYWQKLSAgIG9mIHNvbWUgbXVsdGktYnl0ZSByZWxvY2F0aW9uIG1ha2VzIG9iamVjdCBmaWxlcyBzbWFsbGVyLiAKLQotICAgTm90ZSBvbmUgc2lkZSBlZmZlY3Qgb2YgdXNpbmcgYSBSX1BSRVZfRklYVVAgaXMgdGhlIHJlbG9jYXRpb24gdGhhdAotICAgaXMgYmVpbmcgcmVwZWF0ZWQgbW92ZXMgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gICovCi1zdHJ1Y3QgcmVsb2NfcXVldWUKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgKnJlbG9jOwotICAgIHVuc2lnbmVkIGludCBzaXplOwotICB9IHJlbG9jX3F1ZXVlWzRdOwotCi0vKiBUaGlzIGZ1bGx5IGRlc2NyaWJlcyB0aGUgc3ltYm9sIHR5cGVzIHdoaWNoIG1heSBiZSBhdHRhY2hlZCB0bwotICAgYW4gRVhQT1JUIG9yIElNUE9SVCBkaXJlY3RpdmUuICBPbmx5IFNPTSB1c2VzIHRoaXMgZm9ybWF0aW9uCi0gICAoRUxGIGhhcyBubyBuZWVkIGZvciBpdCkuICAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFNZTUJPTF9UWVBFX1VOS05PV04sCi0gIFNZTUJPTF9UWVBFX0FCU09MVVRFLAotICBTWU1CT0xfVFlQRV9DT0RFLAotICBTWU1CT0xfVFlQRV9EQVRBLAotICBTWU1CT0xfVFlQRV9FTlRSWSwKLSAgU1lNQk9MX1RZUEVfTUlMTElDT0RFLAotICBTWU1CT0xfVFlQRV9QTEFCRUwsCi0gIFNZTUJPTF9UWVBFX1BSSV9QUk9HLAotICBTWU1CT0xfVFlQRV9TRUNfUFJPRywKLX0gcGFfc3ltYm9sX3R5cGU7Ci0KLXN0cnVjdCBzZWN0aW9uX3RvX3R5cGUKLXsKLSAgY2hhciAqc2VjdGlvbjsKLSAgY2hhciB0eXBlOwotfTsKLQotLyogQXNzb3J0ZWQgc3ltYm9sIGluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZGVyaXZlZCBmcm9tIHRoZSBCRkQgc3ltYm9sCi0gICBhbmQvb3IgdGhlIEJGRCBiYWNrZW5kIHByaXZhdGUgc3ltYm9sIGRhdGEuICAqLwotc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvCi17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfdHlwZTsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9zY29wZTsKLSAgdW5zaWduZWQgaW50IGFyZ19yZWxvYzsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmZvOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3ZhbHVlOwotICB1bnNpZ25lZCBpbnQgcHJpdl9sZXZlbDsKLX07Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyBib29sZWFuIHNvbV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKiBzb21fb2JqZWN0X3NldHVwIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgIHN0cnVjdCBoZWFkZXIgKiwKLQkJCQkJCSAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICosCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gc2V0dXBfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBoZWFkZXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKiBzb21fb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc29tX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHNvbV9jYW5vbmljYWxpemVfcmVsb2MgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0JCQkJCSAgICBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNvbV9zZXRfcmVsb2NfaW5mbyBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCQkJCWFyZWxlbnQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCWFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9yZWxvY190YWJsZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGxvbmcgc29tX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBhc3ltYm9sICogc29tX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzb21fcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJICAgICAgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkJCSAgYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJCSAgYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotI2RlZmluZSBzb21fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIHNvbV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fZ2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLQkJCQkJCSBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc29tX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJICB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fZmluZF9uZWFyZXN0X2xpbmUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgICAgIGFzeW1ib2wgKiosIGJmZF92bWEsCi0JCQkJCSAgICAgIENPTlNUIGNoYXIgKiosCi0JCQkJCSAgICAgIENPTlNUIGNoYXIgKiosCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgdm9pZCBzb21fZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBhc2VjdGlvbiAqIGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgCi0JCQkJCXN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKikpOwotc3RhdGljIGludCBsb2cyIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBocHBhX3NvbV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCQkJICAgICBhc3ltYm9sICosIFBUUiwKLQkJCQkJCSAgICAgYXNlY3Rpb24gKiwgYmZkICosCi0JCQkJCQkgICAgIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIFBBUkFNUyAoKHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdm9pZCBzb21fcmVsb2NfcXVldWVfaW5zZXJ0IFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB2b2lkIHNvbV9yZWxvY19xdWV1ZV9maXggUEFSQU1TICgoc3RydWN0IHJlbG9jX3F1ZXVlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludCBzb21fcmVsb2NfcXVldWVfZmluZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCQkJIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHRyeV9wcmV2X2ZpeHVwIFBBUkFNUyAoKGJmZCAqLCBpbnQgKiwgdW5zaWduZWQgY2hhciAqLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBzb21fcmVsb2Nfc2tpcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJICAgICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19hZGRlbmQgUEFSQU1TICgoYmZkICosIGludCwgdW5zaWduZWQgY2hhciAqLAotCQkJCQkgICAgICAgICB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJCSBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBzb21fcmVsb2NfY2FsbCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgY2hhciAqLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50ICosCi0JCQkJCSAgICAgICBhcmVsZW50ICosIGludCwKLQkJCQkJICAgICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY291bnRfc3BhY2VzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY291bnRfc3Vic3BhY2VzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc3ltcyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIGludCBjb21wYXJlX3N1YnNwYWNlcyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc29tX2NvbXB1dGVfY2hlY2tzdW0gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9wcmVwX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc29tX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fZmluaXNoX3dyaXRpbmcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzb21fcHJlcF9mb3JfZml4dXBzIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfZml4dXBzIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQl1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLAotCQkJCQkJIGFzeW1ib2wgKiosIHVuc2lnbmVkIGludCwKLQkJCQkJCSB1bnNpZ25lZCAqLAotCQkJCQkJIENPTVBVTklUICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZWdpbl93cml0aW5nIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQlQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgY2hhciBzb21fc2VjdGlvbl90eXBlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBzb21fZGVjb2RlX3N5bWNsYXNzIFBBUkFNUyAoKGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgbHN0X2hlYWRlciAqLAotCQkJCQkJIHN5bWluZGV4ICopKTsKLQotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBsc3RfaGVhZGVyICosCi0JCQkJCQkgICBjYXJzeW0gKipzeW1zKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosCi0JCQkJCXVuc2lnbmVkIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCSAgICAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCAqLAotCQkJCQkJICB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzb21fYmZkX2FyX3N5bWJvbF9oYXNoIFBBUkFNUyAoKGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGludCwKLQkJCQkJCSAgICAgIHN0cnVjdCBsc3RfaGVhZGVyLAotCQkJCQkJICAgICAgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21faXNfc3BhY2UgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2lzX3N1YnNwYWNlIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9pc19jb250YWluZXIgUEFSQU1TICgoYXNlY3Rpb24gKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotCQotLyogTWFwIFNPTSBzZWN0aW9uIG5hbWVzIHRvIFBPU0lYL0JTRCBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlcy4KLQotICAgVGhpcyB0YWJsZSBpbmNsdWRlcyBhbGwgdGhlIHN0YW5kYXJkIHN1YnNwYWNlcyBhcyBkZWZpbmVkIGluIHRoZSAKLSAgIGN1cnJlbnQgIlBSTyBBQkkgZm9yIFBBLVJJU0MgU3lzdGVtcyIsICRVTldJTkQkIHdoaWNoIGZvciAKLSAgIHNvbWUgcmVhc29uIHdhcyBsZWZ0IG91dCwgYW5kIHNlY3Rpb25zIHNwZWNpZmljIHRvIGVtYmVkZGVkIHN0YWJzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgc3R0W10gPSB7Ci0gIHsiJFRFWFQkIiwgJ3QnfSwKLSAgeyIkU0hMSUJfSU5GTyQiLCAndCd9LAotICB7IiRNSUxMSUNPREUkIiwgJ3QnfSwKLSAgeyIkTElUJCIsICd0J30sCi0gIHsiJENPREUkIiwgJ3QnfSwKLSAgeyIkVU5XSU5EX1NUQVJUJCIsICd0J30sCi0gIHsiJFVOV0lORCQiLCAndCd9LAotICB7IiRQUklWQVRFJCIsICdkJ30sCi0gIHsiJFBMVCQiLCAnZCd9LAotICB7IiRTSExJQl9EQVRBJCIsICdkJ30sCi0gIHsiJERBVEEkIiwgJ2QnfSwKLSAgeyIkU0hPUlREQVRBJCIsICdnJ30sCi0gIHsiJERMVCQiLCAnZCd9LAotICB7IiRHTE9CQUwkIiwgJ2cnfSwKLSAgeyIkU0hPUlRCU1MkIiwgJ3MnfSwKLSAgeyIkQlNTJCIsICdiJ30sCi0gIHsiJEdEQl9TVFJJTkdTJCIsICdOJ30sCi0gIHsiJEdEQl9TWU1CT0xTJCIsICdOJ30sCi0gIHswLCAwfQotfTsKLQotLyogQWJvdXQgdGhlIHJlbG9jYXRpb24gZm9ybWF0dGluZyB0YWJsZS4uLgotCi0gICBUaGVyZSBhcmUgMjU2IGVudHJpZXMgaW4gdGhlIHRhYmxlLCBvbmUgZm9yIGVhY2ggcG9zc2libGUKLSAgIHJlbG9jYXRpb24gb3Bjb2RlIGF2YWlsYWJsZSBpbiBTT00uICBXZSBpbmRleCB0aGUgdGFibGUgYnkKLSAgIHRoZSByZWxvY2F0aW9uIG9wY29kZS4gIFRoZSBuYW1lcyBhbmQgb3BlcmF0aW9ucyBhcmUgdGhvc2UKLSAgIGRlZmluZWQgYnkgYS5vdXRfODAwICg0KS4KLQotICAgUmlnaHQgbm93IHRoaXMgdGFibGUgaXMgb25seSB1c2VkIHRvIGNvdW50IGFuZCBwZXJmb3JtIG1pbmltYWwKLSAgIHByb2Nlc3Npbmcgb24gcmVsb2NhdGlvbiBzdHJlYW1zIHNvIHRoYXQgdGhleSBjYW4gYmUgaW50ZXJuYWxpemVkCi0gICBpbnRvIEJGRCBhbmQgc3ltYm9saWNhbGx5IHByaW50ZWQgYnkgdXRpbGl0aWVzLiAgVG8gbWFrZSBhY3R1YWwgdXNlIAotICAgb2YgdGhlbSB3b3VsZCBiZSBtdWNoIG1vcmUgZGlmZmljdWx0LCBCRkQncyBjb25jZXB0IG9mIHJlbG9jYXRpb25zCi0gICBpcyBmYXIgdG9vIHNpbXBsZSB0byBoYW5kbGUgU09NIHJlbG9jYXRpb25zLiAgVGhlIGJhc2ljIGFzc3VtcHRpb24KLSAgIHRoYXQgYSByZWxvY2F0aW9uIGNhbiBiZSBjb21wbGV0ZWx5IHByb2Nlc3NlZCBpbmRlcGVuZGVudCBvZiBvdGhlcgotICAgcmVsb2NhdGlvbnMgYmVmb3JlIGFuIG9iamVjdCBmaWxlIGlzIHdyaXR0ZW4gaXMgaW52YWxpZCBmb3IgU09NLgotCi0gICBUaGUgU09NIHJlbG9jYXRpb25zIGFyZSBtZWFudCB0byBiZSBwcm9jZXNzZWQgYXMgYSBzdHJlYW0sIHRoZXkKLSAgIHNwZWNpZnkgY29weWluZyBvZiBkYXRhIGZyb20gdGhlIGlucHV0IHNlY3Rpb24gdG8gdGhlIG91dHB1dCBzZWN0aW9uCi0gICB3aGlsZSBwb3NzaWJseSBtb2RpZnlpbmcgdGhlIGRhdGEgaW4gc29tZSBtYW5uZXIuICBUaGV5IGFsc28gY2FuIAotICAgc3BlY2lmeSB0aGF0IGEgdmFyaWFibGUgbnVtYmVyIG9mIHplcm9zIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBiZQotICAgaW5zZXJ0ZWQgb24gaW4gdGhlIG91dHB1dCBzZWdtZW50IGF0IHRoZSBjdXJyZW50IG9mZnNldC4gIFNvbWUKLSAgIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhhdCBzb21lIHByZXZpb3VzIHJlbG9jYXRpb24gYmUgcmUtYXBwbGllZCBhdAotICAgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGlucHV0L291dHB1dCBzZWN0aW9ucy4gIEFuZCBmaW5hbGx5IGEgbnVtYmVyCi0gICBvZiByZWxvY2F0aW9ucyBoYXZlIGVmZmVjdHMgb24gb3RoZXIgc2VjdGlvbnMgKFJfRU5UUlksIFJfRVhJVCwKLSAgIFJfVU5XSU5EX0FVWCBhbmQgYSB2YXJpZXR5IG9mIG90aGVycykuICBUaGVyZSBpc24ndCBldmVuIGVub3VnaCByb29tCi0gICBpbiB0aGUgQkZEIHJlbG9jYXRpb24gZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvCi0gICBwZXJmb3JtIGFsbCB0aGUgcmVsb2NhdGlvbnMuCi0KLSAgIEVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIGhhcyB0aHJlZSBmaWVsZHMuIAotCi0gICBUaGUgZmlyc3QgZW50cnkgaXMgYW4gaW5kZXggaW50byB0aGlzICJjbGFzcyIgb2YgcmVsb2NhdGlvbnMuICBUaGlzCi0gICBpbmRleCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgdmFyaWFibGUgd2l0aGluIHRoZSByZWxvY2F0aW9uIGl0c2VsZi4KLQotICAgVGhlIHNlY29uZCBmaWVsZCBpcyBhIGZvcm1hdCBzdHJpbmcgd2hpY2ggYWN0dWFsbHkgY29udHJvbHMgcHJvY2Vzc2luZwotICAgb2YgdGhlIHJlbG9jYXRpb24uICBJdCB1c2VzIGEgc2ltcGxlIHBvc3RmaXggbWFjaGluZSB0byBkbyBjYWxjdWxhdGlvbnMKLSAgIGJhc2VkIG9uIHZhcmlhYmxlcy9jb25zdGFudHMgZm91bmQgaW4gdGhlIHN0cmluZyBhbmQgdGhlIHJlbG9jYXRpb24KLSAgIHN0cmVhbS4gIAotCi0gICBUaGUgdGhpcmQgZmllbGQgc3BlY2lmeXMgd2hldGhlciBvciBub3QgdGhpcyByZWxvY2F0aW9uIG1heSB1c2UgCi0gICBhIGNvbnN0YW50IChWKSBmcm9tIHRoZSBwcmV2aW91cyBSX0RBVEFfT1ZFUlJJREUgcmF0aGVyIHRoYW4gYSBjb25zdGFudAotICAgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4KLQotICAgVmFyaWFibGVzOiAgCi0gIAotICAgTCA9IGlucHV0IHNwYWNlIGJ5dGUgY291bnQKLSAgIEQgPSBpbmRleCBpbnRvIGNsYXNzIG9mIHJlbG9jYXRpb25zCi0gICBNID0gb3V0cHV0IHNwYWNlIGJ5dGUgY291bnQKLSAgIE4gPSBzdGF0ZW1lbnQgbnVtYmVyICh1bnVzZWQ/KQotICAgTyA9IHN0YWNrIG9wZXJhdGlvbgotICAgUiA9IHBhcmFtZXRlciByZWxvY2F0aW9uIGJpdHMKLSAgIFMgPSBzeW1ib2wgaW5kZXgKLSAgIFQgPSBmaXJzdCAzMiBiaXRzIG9mIHN0YWNrIHVud2luZCBpbmZvcm1hdGlvbgotICAgVSA9IHNlY29uZCAzMiBiaXRzIG9mIHN0YWNrIHVud2luZCBpbmZvcm1hdGlvbgotICAgViA9IGEgbGl0ZXJhbCBjb25zdGFudCAodXN1YWxseSB1c2VkIGluIHRoZSBuZXh0IHJlbG9jYXRpb24pCi0gICBQID0gYSBwcmV2aW91cyByZWxvY2F0aW9uCi0gIAotICAgTG93ZXIgY2FzZSBsZXR0ZXJzIChzdGFydGluZyB3aXRoICdiJykgcmVmZXIgdG8gZm9sbG93aW5nIAotICAgYnl0ZXMgaW4gdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgJ2InIGlzIHRoZSBuZXh0IDEgYnl0ZSwKLSAgIGMgaXMgdGhlIG5leHQgMiBieXRlcywgZCBpcyB0aGUgbmV4dCAzIGJ5dGVzLCBldGMuLi4gIAotICAgVGhpcyBpcyB0aGUgdmFyaWFibGUgcGFydCBvZiB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIHRoYXQKLSAgIG1ha2VzIG91ciBsaWZlIGEgbGl2aW5nIGhlbGwuCi0KLSAgIG51bWVyaWNhbCBjb25zdGFudHMgYXJlIGFsc28gdXNlZCBpbiB0aGUgZm9ybWF0IHN0cmluZy4gIE5vdGUKLSAgIHRoZSBjb25zdGFudHMgYXJlIHJlcHJlc2VudGVkIGluIGRlY2ltYWwuIAotCi0gICAnKycsICIqIiBhbmQgIj0iIHJlcHJlc2VudHMgdGhlIG9idmlvdXMgcG9zdGZpeCBvcGVyYXRvcnMuCi0gICAnPCcgcmVwcmVzZW50cyBhIGxlZnQgc2hpZnQuIAotCi0gICBTdGFjayBPcGVyYXRpb25zOgotCi0gICBQYXJhbWV0ZXIgUmVsb2NhdGlvbiBCaXRzOgotCi0gICBVbndpbmQgRW50cmllczogIAotICAgCi0gICBQcmV2aW91cyBSZWxvY2F0aW9uczogIFRoZSBpbmRleCBmaWVsZCByZXByZXNlbnRzIHdoaWNoIGluIHRoZSBxdWV1ZQotICAgb2YgNCBwcmV2aW91cyBmaXh1cHMgc2hvdWxkIGJlIHJlLWFwcGxpZWQuCi0KLSAgIExpdGVyYWwgQ29uc3RhbnRzOiAgVGhlc2UgYXJlIGdlbmVyYWxseSB1c2VkIHRvIHJlcHJlc2VudCBhZGRlbmQKLSAgIHBhcnRzIG9mIHJlbG9jYXRpb25zIHdoZW4gdGhlc2UgY29uc3RhbnRzIGFyZSBub3Qgc3RvcmVkIGluIHRoZQotICAgZmllbGRzIG9mIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gIEZvciBleGFtcGxlIHRoZSBpbnN0cnVjdGlvbgotICAgYWRkaWwgZm9vLSRnbG9iYWwkLTB4MTIzNCB3b3VsZCB1c2UgYW4gb3ZlcnJpZGUgZm9yICIweDEyMzQiIHJhdGhlcgotICAgdGhhbiBzdG9yaW5nIGl0IGludG8gdGhlIGFkZGlsIGl0c2VsZi4gICovCi0KLXN0cnVjdCBmaXh1cF9mb3JtYXQKLXsKLSAgaW50IEQ7Ci0gIGNoYXIgKmZvcm1hdDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZml4dXBfZm9ybWF0IHNvbV9maXh1cF9mb3JtYXRzWzI1Nl0gPQotewotICAvKiBSX05PX1JFTE9DQVRJT04gKi8KLSAgMCwgICAiTEQxKzQqPSIsICAgICAgIC8qIDB4MDAgKi8KLSAgMSwgICAiTEQxKzQqPSIsCS8qIDB4MDEgKi8KLSAgMiwgICAiTEQxKzQqPSIsCS8qIDB4MDIgKi8KLSAgMywgICAiTEQxKzQqPSIsCS8qIDB4MDMgKi8KLSAgNCwgICAiTEQxKzQqPSIsCS8qIDB4MDQgKi8KLSAgNSwgICAiTEQxKzQqPSIsCS8qIDB4MDUgKi8KLSAgNiwgICAiTEQxKzQqPSIsCS8qIDB4MDYgKi8KLSAgNywgICAiTEQxKzQqPSIsCS8qIDB4MDcgKi8KLSAgOCwgICAiTEQxKzQqPSIsCS8qIDB4MDggKi8KLSAgOSwgICAiTEQxKzQqPSIsCS8qIDB4MDkgKi8KLSAgMTAsICAiTEQxKzQqPSIsCS8qIDB4MGEgKi8KLSAgMTEsICAiTEQxKzQqPSIsCS8qIDB4MGIgKi8KLSAgMTIsICAiTEQxKzQqPSIsCS8qIDB4MGMgKi8KLSAgMTMsICAiTEQxKzQqPSIsCS8qIDB4MGQgKi8KLSAgMTQsICAiTEQxKzQqPSIsCS8qIDB4MGUgKi8KLSAgMTUsICAiTEQxKzQqPSIsCS8qIDB4MGYgKi8KLSAgMTYsICAiTEQxKzQqPSIsCS8qIDB4MTAgKi8KLSAgMTcsICAiTEQxKzQqPSIsCS8qIDB4MTEgKi8KLSAgMTgsICAiTEQxKzQqPSIsCS8qIDB4MTIgKi8KLSAgMTksICAiTEQxKzQqPSIsCS8qIDB4MTMgKi8KLSAgMjAsICAiTEQxKzQqPSIsCS8qIDB4MTQgKi8KLSAgMjEsICAiTEQxKzQqPSIsCS8qIDB4MTUgKi8KLSAgMjIsICAiTEQxKzQqPSIsCS8qIDB4MTYgKi8KLSAgMjMsICAiTEQxKzQqPSIsCS8qIDB4MTcgKi8KLSAgMCwgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDE4ICovCi0gIDEsICAgIkxEODxiKzErNCo9IiwJLyogMHgxOSAqLwotICAyLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MWEgKi8KLSAgMywgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDFiICovCi0gIDAsICAgIkxEMTY8YysxKzQqPSIsCS8qIDB4MWMgKi8KLSAgMSwgICAiTEQxNjxjKzErNCo9IiwJLyogMHgxZCAqLwotICAyLCAgICJMRDE2PGMrMSs0Kj0iLAkvKiAweDFlICovCi0gIDAsICAgIkxkMSs9IiwgICAgICAgICAvKiAweDFmICovCi0gIC8qIFJfWkVST0VTICovCi0gIDAsICAgICJMYjErNCo9IiwJLyogMHgyMCAqLwotICAxLCAgICAiTGQxKz0iLAkvKiAweDIxICovCi0gIC8qIFJfVU5JTklUICovCi0gIDAsICAgICJMYjErNCo9IiwJLyogMHgyMiAqLwotICAxLCAgICAiTGQxKz0iLAkvKiAweDIzICovCi0gIC8qIFJfUkVMT0NBVElPTiAqLwotICAwLCAgICAiTDQ9IiwgICAgICAgICAgLyogMHgyNCAqLwotICAvKiBSX0RBVEFfT05FX1NZTUJPTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHgyNSAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHgyNiAqLwotICAvKiBSX0RBVEFfUExFQkVMICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweDI3ICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweDI4ICovCi0gIC8qIFJfU1BBQ0VfUkVGICovCi0gIDAsICAgICJMND0iLCAgICAgICAgICAvKiAweDI5ICovCi0gIC8qIFJfUkVQRUFURURfSU5JVCAqLwotICAwLCAgICAiTDQ9TWIxKzQqPSIsCS8qIDB4MmEgKi8KLSAgMSwgICAgIkxiNCo9TWIxK0wqPSIsCS8qIDB4MmIgKi8KLSAgMiwgICAgIkxiNCo9TWQxKzQqPSIsCS8qIDB4MmMgKi8KLSAgMywgICAgIkxkMSs9TWUxKz0iLAkvKiAweDJkICovCi0gIDAsICAgCSIiLAkgICAgICAgIC8qIDB4MmUgKi8KLSAgMCwgICAJIiIsCSAgICAgICAgLyogMHgyZiAqLwotICAvKiBSX1BDUkVMX0NBTEwgKi8KLSAgMCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzAgKi8KLSAgMSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzEgKi8KLSAgMiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzIgKi8KLSAgMywgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzMgKi8KLSAgNCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzQgKi8KLSAgNSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzUgKi8KLSAgNiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzYgKi8KLSAgNywgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzcgKi8KLSAgOCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzggKi8KLSAgOSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzkgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4M2EgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4M2IgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4M2MgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4M2QgKi8KLSAgLyogUl9TSE9SVF9QQ1JFTF9NT0RFICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4M2UgKi8KLSAgLyogUl9MT05HX1BDUkVMX01PREUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHgzZiAqLwotICAvKiBSX0FCU19DQUxMICovCi0gIDAsICAgICJMND1SRD1TYj0iLAkvKiAweDQwICovCi0gIDEsICAgICJMND1SRD1TYj0iLAkvKiAweDQxICovCi0gIDIsICAgICJMND1SRD1TYj0iLAkvKiAweDQyICovCi0gIDMsICAgICJMND1SRD1TYj0iLAkvKiAweDQzICovCi0gIDQsICAgICJMND1SRD1TYj0iLAkvKiAweDQ0ICovCi0gIDUsICAgICJMND1SRD1TYj0iLAkvKiAweDQ1ICovCi0gIDYsICAgICJMND1SRD1TYj0iLAkvKiAweDQ2ICovCi0gIDcsICAgICJMND1SRD1TYj0iLAkvKiAweDQ3ICovCi0gIDgsICAgICJMND1SRD1TYj0iLAkvKiAweDQ4ICovCi0gIDksICAgICJMND1SRD1TYj0iLAkvKiAweDQ5ICovCi0gIDAsICAgICJMND1SRDg8Yis9U2I9IiwvKiAweDRhICovCi0gIDEsICAgICJMND1SRDg8Yis9U2I9IiwvKiAweDRiICovCi0gIDAsICAgICJMND1SRDg8Yis9U2Q9IiwvKiAweDRjICovCi0gIDEsICAgICJMND1SRDg8Yis9U2Q9IiwvKiAweDRkICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgICIiLAkgICAgICAgIC8qIDB4NGUgKi8KLSAgMCwgICAgICIiLAkgICAgICAgIC8qIDB4NGYgKi8KLSAgLyogUl9EUF9SRUxBVElWRSAqLwotICAwLCAgICAiTDQ9U0Q9IiwJLyogMHg1MCAqLwotICAxLCAgICAiTDQ9U0Q9IiwJLyogMHg1MSAqLwotICAyLCAgICAiTDQ9U0Q9IiwJLyogMHg1MiAqLwotICAzLCAgICAiTDQ9U0Q9IiwJLyogMHg1MyAqLwotICA0LCAgICAiTDQ9U0Q9IiwJLyogMHg1NCAqLwotICA1LCAgICAiTDQ9U0Q9IiwJLyogMHg1NSAqLwotICA2LCAgICAiTDQ9U0Q9IiwJLyogMHg1NiAqLwotICA3LCAgICAiTDQ9U0Q9IiwJLyogMHg1NyAqLwotICA4LCAgICAiTDQ9U0Q9IiwJLyogMHg1OCAqLwotICA5LCAgICAiTDQ9U0Q9IiwJLyogMHg1OSAqLwotICAxMCwgICAiTDQ9U0Q9IiwJLyogMHg1YSAqLwotICAxMSwgICAiTDQ9U0Q9IiwJLyogMHg1YiAqLwotICAxMiwgICAiTDQ9U0Q9IiwJLyogMHg1YyAqLwotICAxMywgICAiTDQ9U0Q9IiwJLyogMHg1ZCAqLwotICAxNCwgICAiTDQ9U0Q9IiwJLyogMHg1ZSAqLwotICAxNSwgICAiTDQ9U0Q9IiwJLyogMHg1ZiAqLwotICAxNiwgICAiTDQ9U0Q9IiwJLyogMHg2MCAqLwotICAxNywgICAiTDQ9U0Q9IiwJLyogMHg2MSAqLwotICAxOCwgICAiTDQ9U0Q9IiwJLyogMHg2MiAqLwotICAxOSwgICAiTDQ9U0Q9IiwJLyogMHg2MyAqLwotICAyMCwgICAiTDQ9U0Q9IiwJLyogMHg2NCAqLwotICAyMSwgICAiTDQ9U0Q9IiwJLyogMHg2NSAqLwotICAyMiwgICAiTDQ9U0Q9IiwJLyogMHg2NiAqLwotICAyMywgICAiTDQ9U0Q9IiwJLyogMHg2NyAqLwotICAyNCwgICAiTDQ9U0Q9IiwJLyogMHg2OCAqLwotICAyNSwgICAiTDQ9U0Q9IiwJLyogMHg2OSAqLwotICAyNiwgICAiTDQ9U0Q9IiwJLyogMHg2YSAqLwotICAyNywgICAiTDQ9U0Q9IiwJLyogMHg2YiAqLwotICAyOCwgICAiTDQ9U0Q9IiwJLyogMHg2YyAqLwotICAyOSwgICAiTDQ9U0Q9IiwJLyogMHg2ZCAqLwotICAzMCwgICAiTDQ9U0Q9IiwJLyogMHg2ZSAqLwotICAzMSwgICAiTDQ9U0Q9IiwJLyogMHg2ZiAqLwotICAzMiwgICAiTDQ9U2I9IiwJLyogMHg3MCAqLwotICAzMywgICAiTDQ9U2Q9IiwJLyogMHg3MSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3MyAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDc0ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3NiAqLwotICAwLCAgICAiIiwgICAgICAJLyogMHg3NyAqLwotICAvKiBSX0RMVF9SRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4NzggKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4NzkgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLCAgICAiIiwgICAgICAgIAkvKiAweDdhICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2IgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3YyAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdkICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2UgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3ZiAqLwotICAvKiBSX0NPREVfT05FX1NZTUJPTCAqLwotICAwLCAgICAiTDQ9U0Q9IiwJLyogMHg4MCAqLwotICAxLCAgICAiTDQ9U0Q9IiwJLyogMHg4MSAqLwotICAyLCAgICAiTDQ9U0Q9IiwJLyogMHg4MiAqLwotICAzLCAgICAiTDQ9U0Q9IiwJLyogMHg4MyAqLwotICA0LCAgICAiTDQ9U0Q9IiwJLyogMHg4NCAqLwotICA1LCAgICAiTDQ9U0Q9IiwJLyogMHg4NSAqLwotICA2LCAgICAiTDQ9U0Q9IiwJLyogMHg4NiAqLwotICA3LCAgICAiTDQ9U0Q9IiwJLyogMHg4NyAqLwotICA4LCAgICAiTDQ9U0Q9IiwJLyogMHg4OCAqLwotICA5LCAgICAiTDQ9U0Q9IiwJLyogMHg4OSAqLwotICAxMCwgICAiTDQ9U0Q9IiwJLyogMHg4cSAqLwotICAxMSwgICAiTDQ9U0Q9IiwJLyogMHg4YiAqLwotICAxMiwgICAiTDQ9U0Q9IiwJLyogMHg4YyAqLwotICAxMywgICAiTDQ9U0Q9IiwJLyogMHg4ZCAqLwotICAxNCwgICAiTDQ9U0Q9IiwJLyogMHg4ZSAqLwotICAxNSwgICAiTDQ9U0Q9IiwJLyogMHg4ZiAqLwotICAxNiwgICAiTDQ9U0Q9IiwJLyogMHg5MCAqLwotICAxNywgICAiTDQ9U0Q9IiwJLyogMHg5MSAqLwotICAxOCwgICAiTDQ9U0Q9IiwJLyogMHg5MiAqLwotICAxOSwgICAiTDQ9U0Q9IiwJLyogMHg5MyAqLwotICAyMCwgICAiTDQ9U0Q9IiwJLyogMHg5NCAqLwotICAyMSwgICAiTDQ9U0Q9IiwJLyogMHg5NSAqLwotICAyMiwgICAiTDQ9U0Q9IiwJLyogMHg5NiAqLwotICAyMywgICAiTDQ9U0Q9IiwJLyogMHg5NyAqLwotICAyNCwgICAiTDQ9U0Q9IiwJLyogMHg5OCAqLwotICAyNSwgICAiTDQ9U0Q9IiwJLyogMHg5OSAqLwotICAyNiwgICAiTDQ9U0Q9IiwJLyogMHg5YSAqLwotICAyNywgICAiTDQ9U0Q9IiwJLyogMHg5YiAqLwotICAyOCwgICAiTDQ9U0Q9IiwJLyogMHg5YyAqLwotICAyOSwgICAiTDQ9U0Q9IiwJLyogMHg5ZCAqLwotICAzMCwgICAiTDQ9U0Q9IiwJLyogMHg5ZSAqLwotICAzMSwgICAiTDQ9U0Q9IiwJLyogMHg5ZiAqLwotICAzMiwgICAiTDQ9U2I9IiwJLyogMHhhMCAqLwotICAzMywgICAiTDQ9U2Q9IiwJLyogMHhhMSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhMyAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE0ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhNiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE3ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTggKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhOSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFhICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhYyAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFkICovCi0gIC8qIFJfTUlMTElfUkVMICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweGFlICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweGFmICovCi0gIC8qIFJfQ09ERV9QTEFCRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4YjAgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4YjEgKi8KLSAgLyogUl9CUkVBS1BPSU5UICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YjIgKi8KLSAgLyogUl9FTlRSWSAqLwotICAwLCAgICAiVGU9VWU9IiwgICAgICAgLyogMHhiMyAqLwotICAxLCAgICAiVWY9IiwJICAgICAgICAvKiAweGI0ICovCi0gIC8qIFJfQUxUX0VOVFJZICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YjUgKi8KLSAgLyogUl9FWElUICovCi0gIDAsICAgICIiLAkJLyogMHhiNiAqLwotICAvKiBSX0JFR0lOX1RSWSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGI3ICovCi0gIC8qIFJfRU5EX1RSWSAqLwotICAwLCAgICAiUjA9IiwJICAgICAgICAvKiAweGI4ICovCi0gIDEsICAgICJSYjQqPSIsCS8qIDB4YjkgKi8KLSAgMiwgICAgIlJkNCo9IiwJLyogMHhiYSAqLwotICAvKiBSX0JFR0lOX0JSVEFCICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YmIgKi8KLSAgLyogUl9FTkRfQlJUQUIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiYyAqLwotICAvKiBSX1NUQVRFTUVOVCAqLwotICAwLCAgICAiTmI9IiwJICAgICAgICAvKiAweGJkICovCi0gIDEsICAgICJOYz0iLAkgICAgICAgIC8qIDB4YmUgKi8KLSAgMiwgICAgIk5kPSIsCSAgICAgICAgLyogMHhiZiAqLwotICAvKiBSX0RBVEFfRVhQUiAqLwotICAwLCAgICAiTDQ9IiwJICAgICAgICAvKiAweGMwICovCi0gIC8qIFJfQ09ERV9FWFBSICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YzEgKi8KLSAgLyogUl9GU0VMICovCi0gIDAsICAgICIiLAkJLyogMHhjMiAqLwotICAvKiBSX0xTRUwgKi8KLSAgMCwgICAgIiIsCQkvKiAweGMzICovCi0gIC8qIFJfUlNFTCAqLwotICAwLCAgICAiIiwJCS8qIDB4YzQgKi8KLSAgLyogUl9OX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM1ICovCi0gIC8qIFJfU19NT0RFICovCi0gIDAsICAgICIiLAkJLyogMHhjNiAqLwotICAvKiBSX0RfTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzcgKi8KLSAgLyogUl9SX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM4ICovCi0gIC8qIFJfREFUQV9PVkVSUklERSAqLwotICAwLCAgICAiVjA9IiwJICAgICAgICAvKiAweGM5ICovCi0gIDEsICAgICJWYj0iLAkgICAgICAgIC8qIDB4Y2EgKi8KLSAgMiwgICAgIlZjPSIsCSAgICAgICAgLyogMHhjYiAqLwotICAzLCAgICAiVmQ9IiwJICAgICAgICAvKiAweGNjICovCi0gIDQsICAgICJWZT0iLAkgICAgICAgIC8qIDB4Y2QgKi8KLSAgLyogUl9UUkFOU0xBVEVEICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4Y2UgKi8KLSAgLyogUl9BVVhfVU5XSU5EICovCi0gIDAsICAgICJTZD1WZj1FZj0iLCAgICAvKiAweGNmICovCi0gIC8qIFJfQ09NUDEgKi8KLSAgMCwgICAgIk9iPSIsCSAgICAgICAgLyogMHhkMCAqLwotICAvKiBSX0NPTVAyICovCi0gIDAsICAgICJPYj1TZD0iLAkvKiAweGQxICovCi0gIC8qIFJfQ09NUDMgKi8KLSAgMCwgICAgIk9iPVZlPSIsCS8qIDB4ZDIgKi8KLSAgLyogUl9QUkVWX0ZJWFVQICovCi0gIDAsICAgICJQIiwgICAJICAgICAgICAvKiAweGQzICovCi0gIDEsICAgICJQIiwJICAgICAgICAvKiAweGQ0ICovCi0gIDIsICAgICJQIiwJICAgICAgICAvKiAweGQ1ICovCi0gIDMsICAgICJQIiwJICAgICAgICAvKiAweGQ2ICovCi0gIC8qIFJfU0VDX1NUTVQgKi8KLSAgMCwJIiIsCQkvKiAweGQ3ICovCi0gIC8qIFJfTjBTRUwgKi8KLSAgMCwJIiIsCQkvKiAweGQ4ICovCi0gIC8qIFJfTjFTRUwgKi8KLSAgMCwJIiIsCQkvKiAweGQ5ICovCi0gIC8qIFJfTElORVRBQiAqLwotICAwLAkiRWI9U2Q9VmU9IiwJLyogMHhkYSAqLwotICAvKiBSX0xJTkVUQUJfRVNDICovCi0gIDAsCSJFYj1NYj0iLAkvKiAweGRiICovCi0gIC8qIFJfTFRQX09WRVJSSURFICovCi0gIDAsCSIiLAkJLyogMHhkYyAqLwotICAvKiBSX0NPTU1FTlQgKi8KLSAgMCwgICAgIk9iPVZlPSIsCS8qIDB4ZGQgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLAkiIiwJCS8qIDB4ZGUgKi8KLSAgMCwJIiIsCQkvKiAweGRmICovCi0gIDAsCSIiLAkJLyogMHhlMCAqLwotICAwLAkiIiwJCS8qIDB4ZTEgKi8KLSAgMCwJIiIsCQkvKiAweGUyICovCi0gIDAsCSIiLAkJLyogMHhlMyAqLwotICAwLAkiIiwJCS8qIDB4ZTQgKi8KLSAgMCwJIiIsCQkvKiAweGU1ICovCi0gIDAsCSIiLAkJLyogMHhlNiAqLwotICAwLAkiIiwJCS8qIDB4ZTcgKi8KLSAgMCwJIiIsCQkvKiAweGU4ICovCi0gIDAsCSIiLAkJLyogMHhlOSAqLwotICAwLAkiIiwJCS8qIDB4ZWEgKi8KLSAgMCwJIiIsCQkvKiAweGViICovCi0gIDAsCSIiLAkJLyogMHhlYyAqLwotICAwLAkiIiwJCS8qIDB4ZWQgKi8KLSAgMCwJIiIsCQkvKiAweGVlICovCi0gIDAsCSIiLAkJLyogMHhlZiAqLwotICAwLAkiIiwJCS8qIDB4ZjAgKi8KLSAgMCwJIiIsCQkvKiAweGYxICovCi0gIDAsCSIiLAkJLyogMHhmMiAqLwotICAwLAkiIiwJCS8qIDB4ZjMgKi8KLSAgMCwJIiIsCQkvKiAweGY0ICovCi0gIDAsCSIiLAkJLyogMHhmNSAqLwotICAwLAkiIiwJCS8qIDB4ZjYgKi8KLSAgMCwJIiIsCQkvKiAweGY3ICovCi0gIDAsCSIiLAkJLyogMHhmOCAqLwotICAwLAkiIiwJCS8qIDB4ZjkgKi8KLSAgMCwJIiIsCQkvKiAweGZhICovCi0gIDAsCSIiLAkJLyogMHhmYiAqLwotICAwLAkiIiwJCS8qIDB4ZmMgKi8KLSAgMCwJIiIsCQkvKiAweGZkICovCi0gIDAsCSIiLAkJLyogMHhmZSAqLwotICAwLAkiIiwJCS8qIDB4ZmYgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgY29tcDFfb3Bjb2Rlc1tdID0KLXsKLSAgMHgwMCwKLSAgMHg0MCwKLSAgMHg0MSwKLSAgMHg0MiwKLSAgMHg0MywKLSAgMHg0NCwKLSAgMHg0NSwKLSAgMHg0NiwKLSAgMHg0NywKLSAgMHg0OCwKLSAgMHg0OSwKLSAgMHg0YSwKLSAgMHg0YiwKLSAgMHg2MCwKLSAgMHg4MCwKLSAgMHhhMCwKLSAgMHhjMCwKLSAgLTEKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgY29tcDJfb3Bjb2Rlc1tdID0KLXsKLSAgMHgwMCwKLSAgMHg4MCwKLSAgMHg4MiwKLSAgMHhjMCwKLSAgLTEKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgY29tcDNfb3Bjb2Rlc1tdID0KLXsKLSAgMHgwMCwKLSAgMHgwMiwKLSAgLTEKLX07Ci0KLS8qIFRoZXNlIGFwcGFyZW50bHkgYXJlIG5vdCBpbiBvbGRlciB2ZXJzaW9ucyBvZiBocHV4IHJlbG9jLmggKGhwdXg3KS4gICovCi0jaWZuZGVmIFJfRExUX1JFTAotI2RlZmluZSBSX0RMVF9SRUwgMHg3OAotI2VuZGlmCi0KLSNpZm5kZWYgUl9BVVhfVU5XSU5ECi0jZGVmaW5lIFJfQVVYX1VOV0lORCAweGNmCi0jZW5kaWYKLQotI2lmbmRlZiBSX1NFQ19TVE1UCi0jZGVmaW5lIFJfU0VDX1NUTVQgMHhkNwotI2VuZGlmCi0KLS8qIEFuZCB0aGVzZSBmaXJzdCBhcHBlYXJlZCBpbiBocHV4MTAuICAqLwotI2lmbmRlZiBSX1NIT1JUX1BDUkVMX01PREUKLSNkZWZpbmUgTk9fUENSRUxfTU9ERVMKLSNkZWZpbmUgUl9TSE9SVF9QQ1JFTF9NT0RFIDB4M2UKLSNlbmRpZgotCi0jaWZuZGVmIFJfTE9OR19QQ1JFTF9NT0RFCi0jZGVmaW5lIFJfTE9OR19QQ1JFTF9NT0RFIDB4M2YKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjBTRUwKLSNkZWZpbmUgUl9OMFNFTCAweGQ4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX04xU0VMCi0jZGVmaW5lIFJfTjFTRUwgMHhkOQotI2VuZGlmCi0KLSNpZm5kZWYgUl9MSU5FVEFCCi0jZGVmaW5lIFJfTElORVRBQiAweGRhCi0jZW5kaWYKLQotI2lmbmRlZiBSX0xJTkVUQUJfRVNDCi0jZGVmaW5lIFJfTElORVRBQl9FU0MgMHhkYgotI2VuZGlmCi0KLSNpZm5kZWYgUl9MVFBfT1ZFUlJJREUKLSNkZWZpbmUgUl9MVFBfT1ZFUlJJREUgMHhkYwotI2VuZGlmCi0KLSNpZm5kZWYgUl9DT01NRU5UCi0jZGVmaW5lIFJfQ09NTUVOVCAweGRkCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc29tX2hwcGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAotICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAotICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAotICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAotICB7Ul9SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRUxPQ0FUSU9OIn0sCi0gIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCi0gIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCi0gIHtSX0RBVEFfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX1BMQUJFTCJ9LAotICB7Ul9EQVRBX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9QTEFCRUwifSwKLSAge1JfU1BBQ0VfUkVGLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TUEFDRV9SRUYifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfU0hPUlRfUENSRUxfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0hPUlRfUENSRUxfTU9ERSJ9LAotICB7Ul9MT05HX1BDUkVMX01PREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xPTkdfUENSRUxfTU9ERSJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX0RMVF9SRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RMVF9SRUwifSwKLSAge1JfRExUX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRExUX1JFTCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCi0gIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCi0gIHtSX0NPREVfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX1BMQUJFTCJ9LAotICB7Ul9DT0RFX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9QTEFCRUwifSwKLSAge1JfQlJFQUtQT0lOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQlJFQUtQT0lOVCJ9LAotICB7Ul9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5UUlkifSwKLSAge1JfRU5UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VOVFJZIn0sCi0gIHtSX0FMVF9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUxUX0VOVFJZIn0sCi0gIHtSX0VYSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VYSVQifSwKLSAge1JfQkVHSU5fVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9CRUdJTl9UUlkifSwKLSAge1JfRU5EX1RSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX1RSWSJ9LAotICB7Ul9FTkRfVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfVFJZIn0sCi0gIHtSX0VORF9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VORF9UUlkifSwKLSAge1JfQkVHSU5fQlJUQUIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0JFR0lOX0JSVEFCIn0sCi0gIHtSX0VORF9CUlRBQiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX0JSVEFCIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX0RBVEFfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9FWFBSIn0sCi0gIHtSX0NPREVfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9FWFBSIn0sCi0gIHtSX0ZTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0ZTRUwifSwKLSAge1JfTFNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTFNFTCJ9LAotICB7Ul9SU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SU0VMIn0sCi0gIHtSX05fTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTl9NT0RFIn0sCi0gIHtSX1NfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU19NT0RFIn0sCi0gIHtSX0RfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRF9NT0RFIn0sCi0gIHtSX1JfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUl9NT0RFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9UUkFOU0xBVEVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9UUkFOU0xBVEVEIn0sCi0gIHtSX0FVWF9VTldJTkQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FVWF9VTldJTkQifSwKLSAge1JfQ09NUDEsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTVAxIn0sCi0gIHtSX0NPTVAyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01QMiJ9LAotICB7Ul9DT01QMywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09NUDMifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1BSRVZfRklYVVAsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BSRVZfRklYVVAifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9TRUNfU1RNVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0VDX1NUTVQifSwKLSAge1JfTjBTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX04wU0VMIn0sCi0gIHtSX04xU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OMVNFTCJ9LAotICB7Ul9MSU5FVEFCLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCIn0sCi0gIHtSX0xJTkVUQUJfRVNDLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCX0VTQyJ9LAotICB7Ul9MVFBfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xUUF9PVkVSUklERSJ9LAotICB7Ul9DT01NRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01NRU5UIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9fTsKLSAgCi0vKiBJbml0aWFsaXplIHRoZSBTT00gcmVsb2NhdGlvbiBxdWV1ZS4gIEJ5IGRlZmluaXRpb24gdGhlIHF1ZXVlIGhvbGRzCi0gICB0aGUgbGFzdCBmb3VyIG11bHRpYnl0ZSBmaXh1cHMuICAqLwotICAKLXN0YXRpYyB2b2lkCi1zb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSAocXVldWUpCi0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIHF1ZXVlWzBdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMF0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzFdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMV0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzJdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMl0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzNdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbM10uc2l6ZSA9IDA7Ci19Ci0KLS8qIEluc2VydCBhIG5ldyByZWxvY2F0aW9uIGludG8gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3JlbG9jX3F1ZXVlX2luc2VydCAocCwgc2l6ZSwgcXVldWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOwotICBxdWV1ZVszXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgcXVldWVbMl0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gIHF1ZXVlWzFdLnJlbG9jID0gcXVldWVbMF0ucmVsb2M7Ci0gIHF1ZXVlWzFdLnNpemUgPSBxdWV1ZVswXS5zaXplOwotICBxdWV1ZVswXS5yZWxvYyA9IHA7Ci0gIHF1ZXVlWzBdLnNpemUgPSBzaXplOwotfQotCi0vKiBXaGVuIGFuIGVudHJ5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlIGlzIHJldXNlZCwgdGhlIGVudHJ5IG1vdmVzCi0gICB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9yZWxvY19xdWV1ZV9maXggKHF1ZXVlLCBpbmRleCkKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICBpZiAoaW5kZXggPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGluZGV4ID09IDEpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqdG1wMSA9IHF1ZXVlWzBdLnJlbG9jOwotICAgICAgdW5zaWduZWQgaW50IHRtcDIgPSBxdWV1ZVswXS5zaXplOwotICAgICAgcXVldWVbMF0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzBdLnNpemUgPSBxdWV1ZVsxXS5zaXplOwotICAgICAgcXVldWVbMV0ucmVsb2MgPSB0bXAxOwotICAgICAgcXVldWVbMV0uc2l6ZSA9IHRtcDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmRleCA9PSAyKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDEgPSBxdWV1ZVswXS5yZWxvYzsKLSAgICAgIHVuc2lnbmVkIGludCB0bXAyID0gcXVldWVbMF0uc2l6ZTsKLSAgICAgIHF1ZXVlWzBdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gICAgICBxdWV1ZVswXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgICAgIHF1ZXVlWzJdLnJlbG9jID0gcXVldWVbMV0ucmVsb2M7Ci0gICAgICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgICAgIHF1ZXVlWzFdLnJlbG9jID0gdG1wMTsKLSAgICAgIHF1ZXVlWzFdLnNpemUgPSB0bXAyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5kZXggPT0gMykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICp0bXAxID0gcXVldWVbMF0ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG1wMiA9IHF1ZXVlWzBdLnNpemU7Ci0gICAgICBxdWV1ZVswXS5yZWxvYyA9IHF1ZXVlWzNdLnJlbG9jOwotICAgICAgcXVldWVbMF0uc2l6ZSA9IHF1ZXVlWzNdLnNpemU7Ci0gICAgICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOwotICAgICAgcXVldWVbM10uc2l6ZSA9IHF1ZXVlWzJdLnNpemU7Ci0gICAgICBxdWV1ZVsyXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICAgICAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gICAgICBxdWV1ZVsxXS5yZWxvYyA9IHRtcDE7Ci0gICAgICBxdWV1ZVsxXS5zaXplID0gdG1wMjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGFib3J0KCk7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBwYXJ0aWN1bGFyIHJlbG9jYXRpb24gaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCi1zdGF0aWMgaW50Ci1zb21fcmVsb2NfcXVldWVfZmluZCAocCwgc2l6ZSwgcXVldWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpZiAocXVldWVbMF0ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbMF0ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzBdLnNpemUpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChxdWV1ZVsxXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVsxXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbMV0uc2l6ZSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHF1ZXVlWzJdLnJlbG9jICYmICFtZW1jbXAgKHAsIHF1ZXVlWzJdLnJlbG9jLCBzaXplKQotICAgICAgJiYgc2l6ZSA9PSBxdWV1ZVsyXS5zaXplKQotICAgIHJldHVybiAyOwotICBpZiAocXVldWVbM10ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbM10ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzNdLnNpemUpCi0gICAgcmV0dXJuIDM7Ci0gIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCBzaXplLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgKnN1YnNwYWNlX3JlbG9jX3NpemVwOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaW50IHF1ZXVlX2luZGV4ID0gc29tX3JlbG9jX3F1ZXVlX2ZpbmQgKHAsIHNpemUsIHF1ZXVlKTsKLQotICBpZiAocXVldWVfaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgLyogRm91bmQgdGhpcyBpbiBhIHByZXZpb3VzIGZpeHVwLiAgVW5kbyB0aGUgZml4dXAgd2UKLQkganVzdCBidWlsdCBhbmQgdXNlIFJfUFJFVl9GSVhVUCBpbnN0ZWFkLiAgV2Ugc2F2ZWQgCi0JIGEgdG90YWwgb2Ygc2l6ZSAtIDEgYnl0ZXMgaW4gdGhlIGZpeHVwIHN0cmVhbS4gICovCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfUFJFVl9GSVhVUCArIHF1ZXVlX2luZGV4LCBwKTsKLSAgICAgIHAgKz0gMTsKLSAgICAgICpzdWJzcGFjZV9yZWxvY19zaXplcCArPSAxOwotICAgICAgc29tX3JlbG9jX3F1ZXVlX2ZpeCAocXVldWUsIHF1ZXVlX2luZGV4KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzb21fcmVsb2NfcXVldWVfaW5zZXJ0IChwLCBzaXplLCBxdWV1ZSk7Ci0gICAgICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gc2l6ZTsKLSAgICAgIHAgKz0gc2l6ZTsKLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0vKiBFbWl0IHRoZSBwcm9wZXIgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgdGhlIG5leHQgU0tJUAotICAgYnl0ZXMgd2l0aG91dCBhbnkgcmVsb2NhdGlvbi4gIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3BhY2UKLSAgIHJlbG9jYXRpb24gc3RyZWFtIHZpYSBTVUJTUEFDRV9SRUxPQ19TSVpFX1A7IGFsc28gcmV0dXJuIHRoZSAKLSAgIGN1cnJlbnQgcG9pbnRlciBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNraXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIC8qIFVzZSBhIDQgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkgd2l0aCBhIG1heGltYWwgdmFsdWUKLSAgICAgdGhlbiBSX1BSRVZfRklYVVBzIHRvIGdldCB0aGUgZGlmZmVyZW5jZSBkb3duIHRvIGEKLSAgICAgcmVhc29uYWJsZSBzaXplLiAgKi8KLSAgaWYgKHNraXAgPj0gMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIHNraXAgLT0gMHgxMDAwMDAwOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAzMSwgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIHAgKyAxKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgcCArIDIpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOwotICAgICAgd2hpbGUgKHNraXAgPj0gMHgxMDAwMDAwKQotCXsKLQkgIHNraXAgLT0gMHgxMDAwMDAwOwotCSAgYmZkX3B1dF84IChhYmZkLCBSX1BSRVZfRklYVVAsIHApOwotCSAgcCsrOwotCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0JICAvKiBObyBuZWVkIHRvIGFkanVzdCBxdWV1ZSBoZXJlIHNpbmNlIHdlIGFyZSByZXBlYXRpbmcgdGhlCi0JICAgICBtb3N0IHJlY2VudCBmaXh1cC4gICovCi0JfQotICAgIH0KLSAgCi0gIC8qIFRoZSBkaWZmZXJlbmNlIG11c3QgYmUgbGVzcyB0aGFuIDB4MTAwMDAwMC4gIFVzZSBvbmUgCi0gICAgIG1vcmUgUl9OT19SRUxPQ0FUSU9OIGVudHJ5IHRvIGdldCB0byB0aGUgcmlnaHQgZGlmZmVyZW5jZS4gICovCi0gIGlmICgoc2tpcCAmIDMpID09IDAgJiYgc2tpcCA8PSAweGMwMDAwICYmIHNraXAgPiAwKQotICAgIHsKLSAgICAgIC8qIERpZmZlcmVuY2UgY2FuIGJlIGhhbmRsZWQgaW4gYSBzaW1wbGUgc2luZ2xlLWJ5dGUKLQkgUl9OT19SRUxPQ0FUSU9OIGVudHJ5LiAgKi8KLSAgICAgIGlmIChza2lwIDw9IDB4NjApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAoc2tpcCA+PiAyKSAtIDEsIHApOwotCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0JICBwKys7Ci0JfQotICAgICAgLyogSGFuZGxlIGl0IHdpdGggYSB0d28gYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgZWxzZSBpZiAoc2tpcCA8PSAweDEwMDApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAyNCArICgoKHNraXAgPj4gMikgLSAxKSA+PiA4KSwgcCk7Ci0JICBiZmRfcHV0XzggKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMiwgcXVldWUpOwotCX0KLSAgICAgIC8qIEhhbmRsZSBpdCB3aXRoIGEgdGhyZWUgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMjggKyAoKChza2lwID4+IDIpIC0gMSkgPj4gMTYpLCBwKTsKLQkgIGJmZF9wdXRfMTYgKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOwotCX0KLSAgICB9Ci0gIC8qIFVnaC4gIFB1bnQgYW5kIHVzZSBhIDQgYnl0ZSBlbnRyeS4gICovCi0gIGVsc2UgaWYgKHNraXAgPiAwKQotICAgIHsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMzEsIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCAoc2tpcCAtIDEpID4+IDE2LCBwICsgMSk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBza2lwIC0gMSwgcCArIDIpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEVtaXQgdGhlIHByb3BlciBSX0RBVEFfT1ZFUlJJREUgZml4dXBzIHRvIGhhbmRsZSBhIG5vbnplcm8gYWRkZW5kCi0gICBmcm9tIGEgQkZEIHJlbG9jYXRpb24uICBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHN1YnNwYWNlIHJlbG9jYXRpb24KLSAgIHN0cmVhbSB2aWEgU1VCU1BBQ0VfUkVMT0NfU0laRV9QOyBhbHNvIHJldHVybiB0aGUgY3VycmVudCBwb2ludGVyCi0gICBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19hZGRlbmQgKGFiZmQsIGFkZGVuZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHF1ZXVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBhZGRlbmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIGlmICgodW5zaWduZWQpKGFkZGVuZCkgKyAweDgwIDwgMHgxMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAxLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7IAotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMCA8IDB4MTAwMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAyLCBwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGFkZGVuZCwgcCArIDEpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMDAwIDwgMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9EQVRBX09WRVJSSURFICsgMywgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIGFkZGVuZCA+PiAxNiwgcCArIDEpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYWRkZW5kLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyA0LCBwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGFkZGVuZCwgcCArIDEpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEhhbmRsZSBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1zb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIGJmZF9yZWxvYywgc3ltX251bSwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBpbnQgc3ltX251bTsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaW50IGFyZ19iaXRzID0gSFBQQV9SX0FSR19SRUxPQyAoYmZkX3JlbG9jLT5hZGRlbmQpOwotICBpbnQgcnRuX2JpdHMgPSBhcmdfYml0cyAmIDB4MzsKLSAgaW50IHR5cGUsIGRvbmUgPSAwOwotICAKLSAgLyogWW91J2xsIG5ldmVyIGJlbGlldmUgYWxsIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSByZWxvY2F0aW9ucwotICAgICBmb3IgZnVuY3Rpb24gY2FsbHMuICBIYXZpbmcgdG8gY29tcHV0ZSBhbmQgcGFjayB0aGUgYXJndW1lbnQKLSAgICAgcmVsb2NhdGlvbiBiaXRzIGlzIHRoZSByZWFsIG5pZ2h0bWFyZS4KLSAgICAgCi0gICAgIElmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGhvdyB0aGlzIHdvcmtzLCBqdXN0IGZvcmdldCBpdC4gIFlvdSByZWFsbHkKLSAgICAgZG8gbm90IHdhbnQgdG8ga25vdyBhYm91dCB0aGlzIGJyYWluZGFtYWdlLiAgKi8KLQotICAvKiBGaXJzdCBzZWUgaWYgdGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgInNpbXBsZSIgcmVsb2NhdGlvbi4gIFNpbXBsZQotICAgICByZWxvY2F0aW9ucyBoYXZlIGEgc3ltYm9sIG51bWJlciA8IDB4MTAwIGFuZCBoYXZlIHNpbXBsZSBlbmNvZGluZ3MKLSAgICAgb2YgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotCi0gIGlmIChzeW1fbnVtIDwgMHgxMDApCi0gICAgewotICAgICAgc3dpdGNoIChhcmdfYml0cykKLQl7Ci0JY2FzZSAwOgotCWNhc2UgMToKLQkgIHR5cGUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDg6Ci0JY2FzZSAxIDw8IDggfCAxOgotCSAgdHlwZSA9IDE7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgOCB8IDEgPDwgNjoKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDE6Ci0JICB0eXBlID0gMjsKLQkgIGJyZWFrOwotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0OgotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0IHwgMToKLQkgIHR5cGUgPSAzOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDI6Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDIgfCAxOgotCSAgdHlwZSA9IDQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogTm90IG9uZSBvZiB0aGUgZWFzeSBlbmNvZGluZ3MuICBUaGlzIHdpbGwgaGF2ZSB0byBiZQotCSAgICAgaGFuZGxlZCBieSB0aGUgbW9yZSBjb21wbGV4IGNvZGUgYmVsb3cuICAqLwotCSAgdHlwZSA9IC0xOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHR5cGUgIT0gLTEpCi0JewotCSAgLyogQWNjb3VudCBmb3IgdGhlIHJldHVybiB2YWx1ZSB0b28uICAqLwotCSAgaWYgKHJ0bl9iaXRzKQotCSAgICB0eXBlICs9IDU7Ci0KLQkgIC8qIEVtaXQgYSAyIGJ5dGUgcmVsb2NhdGlvbi4gIFRoZW4gc2VlIGlmIGl0IGNhbiBiZSBoYW5kbGVkCi0JICAgICB3aXRoIGEgcmVsb2NhdGlvbiB3aGljaCBpcyBhbHJlYWR5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIHR5cGUsIHApOwotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7Ci0JICBkb25lID0gMTsKLQl9Ci0gICAgfQotICAKLSAgLyogSWYgdGhpcyBjb3VsZCBub3QgYmUgaGFuZGxlZCB3aXRoIGEgc2ltcGxlIHJlbG9jYXRpb24sIHRoZW4gZG8gYSBoYXJkCi0gICAgIG9uZS4gIEhhcmQgcmVsb2NhdGlvbnMgb2NjdXIgaWYgdGhlIHN5bWJvbCBudW1iZXIgd2FzIHRvbyBoaWdoIG9yIGlmCi0gICAgIHRoZSBlbmNvZGluZyBvZiBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaXMgdG9vIGNvbXBsZXguICAqLwotICBpZiAoISBkb25lKQotICAgIHsKLSAgICAgIC8qIERvbid0IGFzayBhYm91dCB0aGVzZSBtYWdpYyBzZXF1ZW5jZXMuICBJIHRvb2sgdGhlbSBzdHJhaWdodAotCSBmcm9tIGdhcy0xLjM2IHdoaWNoIHRvb2sgdGhlbSBmcm9tIHRoZSBhLm91dCBtYW4gcGFnZS4gICovCi0gICAgICB0eXBlID0gcnRuX2JpdHM7Ci0gICAgICBpZiAoKGFyZ19iaXRzID4+IDYgJiAweGYpID09IDB4ZSkKLQl0eXBlICs9IDkgKiA0MDsKLSAgICAgIGVsc2UKLQl0eXBlICs9ICgzICogKGFyZ19iaXRzID4+IDggJiAzKSArIChhcmdfYml0cyA+PiA2ICYgMykpICogNDA7Ci0gICAgICBpZiAoKGFyZ19iaXRzID4+IDIgJiAweGYpID09IDB4ZSkKLQl0eXBlICs9IDkgKiA0OwotICAgICAgZWxzZQotCXR5cGUgKz0gKDMgKiAoYXJnX2JpdHMgPj4gNCAmIDMpICsgKGFyZ19iaXRzID4+IDIgJiAzKSkgKiA0OwotICAgICAgCi0gICAgICAvKiBPdXRwdXQgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgcmVsb2NhdGlvbi4gIFRoZXNlIGRlc2NyaWJlCi0JIHRoZSBsZW5ndGggb2YgdGhlIHJlbG9jYXRpb24gYW5kIGVuY29kaW5nIHN0eWxlLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEwCi0JCSArIDIgKiAoc3ltX251bSA+PSAweDEwMCkgKyAodHlwZSA+PSAweDEwMCksCi0JCSBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdHlwZSwgcCArIDEpOwotICAgICAgCi0gICAgICAvKiBOb3cgb3V0cHV0IHRoZSBzeW1ib2wgaW5kZXggYW5kIHNlZSBpZiB0aGlzIGJpemFycmUgcmVsb2NhdGlvbgotCSBqdXN0IGhhcHBlbmVkIHRvIGJlIGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KLSAgICAgIGlmIChzeW1fbnVtIDwgMHgxMDApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMik7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDIpOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOwotCX0KLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0KLS8qIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIFgsIGJhc2UgMiwgY29uc2lkZXJpbmcgWCB1bnNpZ25lZC4gCi0gICBBYm9ydCAtMSBpZiBYIGlzIG5vdCBhIHBvd2VyIG9yIHR3byBvciBpcyB6ZXJvLiAgKi8KLQotc3RhdGljIGludAotbG9nMiAoeCkKLSAgICAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIGludCBsb2cgPSAwOwotCi0gIC8qIFRlc3QgZm9yIDAgb3IgYSBwb3dlciBvZiAyLiAgKi8KLSAgaWYgKHggPT0gMCB8fCB4ICE9ICh4ICYgLXgpKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoKHggPj49IDEpICE9IDApCi0gICAgbG9nKys7Ci0gIHJldHVybiBsb2c7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhwcGFfc29tX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBHaXZlbiBhIGdlbmVyaWMgSFBQQSByZWxvY2F0aW9uIHR5cGUsIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXQsCi0gICBhbmQgYSBmaWVsZCBzZWxlY3RvciwgcmV0dXJuIG9uZSBvciBtb3JlIGFwcHJvcHJpYXRlIFNPTSByZWxvY2F0aW9ucy4gICovCi0KLWludCAqKgotaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUgKGFiZmQsIGJhc2VfdHlwZSwgZm9ybWF0LCBmaWVsZCwgc3ltX2RpZmYsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYmFzZV90eXBlOwotICAgICBpbnQgZm9ybWF0OwotICAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgZmllbGQ7Ci0gICAgIGludCBzeW1fZGlmZjsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpbnQgKmZpbmFsX3R5cGUsICoqZmluYWxfdHlwZXM7Ci0KLSAgZmluYWxfdHlwZXMgPSAoaW50ICoqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50ICopICogNik7Ci0gIGZpbmFsX3R5cGUgPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLSAgaWYgKCFmaW5hbF90eXBlcyB8fCAhZmluYWxfdHlwZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgZmllbGQgc2VsZWN0b3IgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCByZWxvY2F0aW9ucyB0byBiZSAKLSAgICAgZ2VuZXJhdGVkLiAgSXQncyBpbXBvc3NpYmxlIHRvIGtub3cgYXQgdGhpcyBtb21lbnQgaWYgYWRkaXRpb25hbAotICAgICByZWxvY2F0aW9ucyB3aWxsIGJlIG5lZWRlZCwgc28gd2UgbWFrZSB0aGVtLiAgVGhlIGNvZGUgdG8gYWN0dWFsbHkKLSAgICAgd3JpdGUgdGhlIHJlbG9jYXRpb24vZml4dXAgc3RyZWFtIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZwotICAgICBhbnkgcmVkdW5kYW50IHJlbG9jYXRpb25zLiAgKi8KLSAgc3dpdGNoIChmaWVsZCkKLSAgICB7Ci0gICAgICBjYXNlIGVfZnNlbDoKLSAgICAgIGNhc2UgZV9wc2VsOgotICAgICAgY2FzZSBlX2xwc2VsOgotICAgICAgY2FzZSBlX3Jwc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1sxXSA9IE5VTEw7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfdHNlbDoKLSAgICAgIGNhc2UgZV9sdHNlbDoKLSAgICAgIGNhc2UgZV9ydHNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoZmllbGQgPT0gZV90c2VsKQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCWVsc2UgaWYgKGZpZWxkID09IGVfbHRzZWwpCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JZWxzZQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sc3NlbDoKLSAgICAgIGNhc2UgZV9yc3NlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX1NfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbHNlbDoKLSAgICAgIGNhc2UgZV9yc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfTl9NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sZHNlbDoKLSAgICAgIGNhc2UgZV9yZHNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX0RfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbHJzZWw6Ci0gICAgICBjYXNlIGVfcnJzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9SX01PREU7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX25zZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OMVNFTDsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbmxzZWw6Ci0gICAgICBjYXNlIGVfbmxyc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfTjBTRUw7Ci0JZmluYWxfdHlwZXNbMV0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzFdKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGZpZWxkID09IGVfbmxzZWwpCi0JICAqZmluYWxfdHlwZXNbMV0gPSBSX05fTU9ERTsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMV0gPSBSX1JfTU9ERTsKLQlmaW5hbF90eXBlc1syXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbM10gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotICAgIH0KLSAgCi0gIHN3aXRjaCAoYmFzZV90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSFBQQToKLSAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChzeW1fZGlmZikKLQl7Ci0JICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKLQkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKLQkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7Ci0JICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7Ci0JICBpZiAoZm9ybWF0ID09IDMyKQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7Ci0JICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBQTEFCRUxzIGdldCB0aGVpciBvd24gcmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgICAgIGVsc2UgaWYgKGZpZWxkID09IGVfcHNlbAotCSAgfHwgZmllbGQgPT0gZV9scHNlbAotCSAgfHwgZmllbGQgPT0gZV9ycHNlbCkKLQl7Ci0JICAvKiBBIFBMQUJFTCByZWxvY2F0aW9uIHRoYXQgaGFzIGEgc2l6ZSBvZiAzMiBiaXRzIG11c3QKLQkgICAgIGJlIGEgUl9EQVRBX1BMQUJFTC4gIEFsbCBvdGhlcnMgYXJlIFJfQ09ERV9QTEFCRUxzLiAgKi8KLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGUgPSBSX0NPREVfUExBQkVMOwotCX0KLSAgICAgIC8qIFBJQyBzdHVmZi4gICovCi0gICAgICBlbHNlIGlmIChmaWVsZCA9PSBlX3RzZWwKLQkgIHx8IGZpZWxkID09IGVfbHRzZWwKLQkgIHx8IGZpZWxkID09IGVfcnRzZWwpCi0JKmZpbmFsX3R5cGUgPSBSX0RMVF9SRUw7Ci0gICAgICAvKiBBIHJlbG9jYXRpb24gaW4gdGhlIGRhdGEgc3BhY2UgaXMgYWx3YXlzIGEgZnVsbCAzMmJpdHMuICAqLwotICAgICAgZWxzZSBpZiAoZm9ybWF0ID09IDMyKQotCXsKLQkgICpmaW5hbF90eXBlID0gUl9EQVRBX09ORV9TWU1CT0w7Ci0KLQkgIC8qIElmIHRoZXJlJ3Mgbm8gU09NIHN5bWJvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJGRAotCSAgICAgc3ltYm9sLCB0aGVuIHNldCB0aGUgc3ltYm9sIHR5cGUgdG8gU1RfREFUQS4KLQotCSAgICAgT25seSBkbyB0aGlzIGlmIHRoZSB0eXBlIGlzIGdvaW5nIHRvIGRlZmF1bHQgbGF0ZXIgd2hlbgotCSAgICAgd2Ugd3JpdGUgdGhlIG9iamVjdCBmaWxlLgotCi0JICAgICBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgbGlua2VyIG5ldmVyIGVuY291bnRlcnMgYW4KLQkgICAgIFJfREFUQV9PTkVfU1lNQk9MIHJlbG9jIGludm9sdmluZyBhbiBTVF9DT0RFIHN5bWJvbC4KLQotCSAgICAgVGhpcyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiBoYW5kbGluZwotCSAgICAgdGFibGVzLgotCi0JICAgICBOb3RlIHRoYXQgb25lIGRheSB3ZSBtYXkgbmVlZCB0byBhbHNvIGVtaXQgQkVHSU5fQlJUQUIgYW5kCi0JICAgICBFTkRfQlJUQUIgdG8gcHJldmVudCB0aGUgbGlua2VyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc25zCi0JICAgICBpbiBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9ucy4gICovCi0JICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOCi0JICAgICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMAotCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfR09UT0ZGOgotICAgICAgLyogTW9yZSBQTEFCRUwgc3BlY2lhbCBjYXNlcy4gICovCi0gICAgICBpZiAoZmllbGQgPT0gZV9wc2VsCi0JICB8fCBmaWVsZCA9PSBlX2xwc2VsCi0JICB8fCBmaWVsZCA9PSBlX3Jwc2VsKQotCSpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0hQUEFfQ09NUExFWDoKLSAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChzeW1fZGlmZikKLQl7Ci0JICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKLQkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKLQkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7Ci0JICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7Ci0JICBpZiAoZm9ybWF0ID09IDMyKQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7Ci0JICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0KLSAgICBjYXNlIFJfSFBQQV9OT05FOgotICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgotICAgICAgLyogUmlnaHQgbm93IHdlIGNhbiBkZWZhdWx0IGFsbCB0aGVzZS4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IUFBBX1BDUkVMX0NBTEw6Ci0gICAgICB7Ci0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0JLyogSWYgd2UgaGF2ZSBzaG9ydCBhbmQgbG9uZyBwY3JlbCBtb2RlcywgdGhlbiBnZW5lcmF0ZSB0aGUgcHJvcGVyCi0JICAgbW9kZSBzZWxlY3RvciwgdGhlbiB0aGUgcGNyZWwgcmVsb2NhdGlvbi4gIFJlZHVuZGFudCBzZWxlY3RvcnMKLQkgICB3aWxsIGJlIGVsaW1pbnRlZCBhcyB0aGUgcmVsb2NzIGFyZSBzaXplZCBhbmQgZW1pdHRlZC4gICovCi0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGZvcm1hdCA9PSAxNykKLQkgICpmaW5hbF90eXBlc1swXSA9IFJfU0hPUlRfUENSRUxfTU9ERTsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0xPTkdfUENSRUxfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotI2VuZGlmCi0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICByZXR1cm4gZmluYWxfdHlwZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVjdCBlbnRyeSBpbiB0aGUgUEEgU09NIHJlbG9jYXRpb24KLSAgIGhvd3RvIHRhYmxlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoKGludCkgY29kZSA8IChpbnQpIFJfTk9fUkVMT0NBVElPTiArIDI1NSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgoaW50KSBzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXS50eXBlID09IChpbnQpIGNvZGUpOwotICAgICAgcmV0dXJuICZzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXTsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIDA7Ci19Ci0KLS8qIFBlcmZvcm0gc29tZSBpbml0aWFsaXphdGlvbiBmb3IgYW4gb2JqZWN0LiAgU2F2ZSByZXN1bHRzIG9mIHRoaXMKLSAgIGluaXRpYWxpemF0aW9uIGluIHRoZSBCRkQuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zb21fb2JqZWN0X3NldHVwIChhYmZkLCBmaWxlX2hkcnAsIGF1eF9oZHJwLCBjdXJyZW50X29mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcnA7Ci0gICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmF1eF9oZHJwOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IGZvdW5kOwotCi0gIC8qIHNvbV9ta29iamVjdCB3aWxsIHNldCBiZmRfZXJyb3IgaWYgc29tX21rb2JqZWN0IGZhaWxzLiAgKi8KLSAgaWYgKHNvbV9ta29iamVjdCAoYWJmZCkgIT0gdHJ1ZSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZXQgQkZEIGZsYWdzIGJhc2VkIG9uIHdoYXQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBTT00uICAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGZpbGVfaGRycC0+c3ltYm9sX3RvdGFsKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0KLSAgc3dpdGNoIChmaWxlX2hkcnAtPmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgREVNQU5EX01BR0lDOgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gKERfUEFHRUQgfCBXUF9URVhUIHwgRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoV1BfVEVYVCB8IEVYRUNfUCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVYRUNfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gICAgICBicmVhazsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICBjYXNlIFNITF9NQUdJQzoKLSNlbmRpZgotI2lmZGVmIERMX01BR0lDCi0gICAgY2FzZSBETF9NQUdJQzoKLSNlbmRpZgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBob2xkIHRoZSBzYXZlZCBleGVjIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIG9ial9zb21fZXhlY19kYXRhIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEgKSk7Ci0gIGlmIChvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgYnJhaW5kYW1hZ2VkIE9TRjEgbGlua2VyIHN3aXRjaGVkIGV4ZWNfZmxhZ3MgYW5kIGV4ZWNfZW50cnkhCi0KLSAgICAgV2UgdXNlZCB0byBpZGVudGlmeSBPU0YxIGJpbmFyaWVzIGJhc2VkIG9uIE5FV19WRVJTSU9OX0lELCBidXQKLSAgICAgYXBwYXJlbnRseSB0aGUgbGF0ZXN0IEhQVVggbGlua2VyIGlzIHVzaW5nIE5FV19WRVJTSU9OX0lEIG5vdy4KLQotICAgICBJdCdzIGFib3V0IHRpbWUsIE9TRiBoYXMgdXNlZCB0aGUgbmV3IGlkIHNpbmNlIGF0IGxlYXN0IDE5OTI7Ci0gICAgIEhQVVggZGlkbid0IHN0YXJ0IHRpbGwgbmVhcmx5IDE5OTUhLgotICAgIAotICAgICBUaGUgbmV3IGFwcHJvYWNoIGV4YW1pbmVzIHRoZSBlbnRyeSBmaWVsZC4gIElmIGl0J3MgemVybyBvciBub3QgNAotICAgICBieXRlIGFsaWduZWQgdGhlbiBpdCdzIG5vdCBhIHByb3BlciBjb2RlIGFkZHJlc3MgYW5kIHdlIGd1ZXNzIGl0J3MKLSAgICAgcmVhbGx5IHRoZSBleGVjdXRhYmxlIGZsYWdzLiAgKi8KLSAgZm91bmQgPSAwOwotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID49IHNlY3Rpb24tPnZtYQotCSAgJiYgYXV4X2hkcnAtPmV4ZWNfZW50cnkgPCBzZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5fY29va2VkX3NpemUpCi0JZm91bmQgPSAxOwotICAgIH0KLSAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID09IDAKLSAgICAgIHx8IChhdXhfaGRycC0+ZXhlY19lbnRyeSAmIDB4MykgIT0gMAotICAgICAgfHwgISBmb3VuZCkKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZmxhZ3M7Ci0gICAgICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3MgPSBhdXhfaGRycC0+ZXhlY19lbnRyeTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZW50cnkgKyBjdXJyZW50X29mZnNldDsKLSAgICAgIG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFncyA9IGF1eF9oZHJwLT5leGVjX2ZsYWdzOwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9ocHBhLCBwYTEwKTsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF90b3RhbDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBzYXZlZCBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSB0byBOVUxMLiAgCi0gICAgIFNhdmUgaW1wb3J0YW50IG9mZnNldHMgYW5kIHNpemVzIGZyb20gdGhlIFNPTSBoZWFkZXIgaW50bwotICAgICB0aGUgQkZELiAgKi8KLSAgb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpID0gKGNoYXIgICopIE5VTEw7Ci0gIG9ial9zb21fc3ltdGFiIChhYmZkKSA9IChzb21fc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSA9IGZpbGVfaGRycC0+c3ltYm9sX3N0cmluZ3Nfc2l6ZTsKLSAgb2JqX3NvbV9zeW1fZmlsZXBvcyAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF9sb2NhdGlvbiArIGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX3N0cl9maWxlcG9zIChhYmZkKSA9IChmaWxlX2hkcnAtPnN5bWJvbF9zdHJpbmdzX2xvY2F0aW9uCi0JCQkJKyBjdXJyZW50X29mZnNldCk7Ci0gIG9ial9zb21fcmVsb2NfZmlsZXBvcyAoYWJmZCkgPSAoZmlsZV9oZHJwLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uCi0JCQkJICArIGN1cnJlbnRfb2Zmc2V0KTsKLSAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5zeXN0ZW1faWQgPSBmaWxlX2hkcnAtPnN5c3RlbV9pZDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogQ29udmVydCBhbGwgb2YgdGhlIHNwYWNlIGFuZCBzdWJzcGFjZSBpbmZvIGludG8gQkZEIHNlY3Rpb25zLiAgRWFjaCBzcGFjZQotICAgY29udGFpbnMgYSBudW1iZXIgb2Ygc3Vic3BhY2VzLCB3aGljaCBpbiB0dXJuIGRlc2NyaWJlIHRoZSBtYXBwaW5nIGJldHdlZW4KLSAgIHJlZ2lvbnMgb2YgdGhlIGV4ZWMgZmlsZSwgYW5kIHRoZSBhZGRyZXNzIHNwYWNlIHRoYXQgdGhlIHByb2dyYW0gcnVucyBpbi4KLSAgIEJGRCBzZWN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvIHNwYWNlcyB3aWxsIG92ZXJsYXAgdGhlIHNlY3Rpb25zIGZvciB0aGUKLSAgIGFzc29jaWF0ZWQgc3Vic3BhY2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNldHVwX3NlY3Rpb25zIChhYmZkLCBmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci17Ci0gIGNoYXIgKnNwYWNlX3N0cmluZ3M7Ci0gIHVuc2lnbmVkIGludCBzcGFjZV9pbmRleCwgaTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3N1YnNwYWNlcyA9IDA7Ci0gIGFzZWN0aW9uICoqc3Vic3BhY2Vfc2VjdGlvbnMsICpzZWN0aW9uOwotCi0gIC8qIEZpcnN0LCByZWFkIGluIHNwYWNlIG5hbWVzICovCi0KLSAgc3BhY2Vfc3RyaW5ncyA9IGJmZF9tYWxsb2MgKGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUpOwotICBpZiAoIXNwYWNlX3N0cmluZ3MgJiYgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19sb2NhdGlvbiwgCi0gIAkJU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9yZWFkIChzcGFjZV9zdHJpbmdzLCAxLCBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplLCBhYmZkKQotICAgICAgIT0gZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBMb29wIG92ZXIgYWxsIG9mIHRoZSBzcGFjZSBkaWN0aW9uYXJpZXMsIGJ1aWxkaW5nIHVwIHNlY3Rpb25zICovCi0gIGZvciAoc3BhY2VfaW5kZXggPSAwOyBzcGFjZV9pbmRleCA8IGZpbGVfaGRyLT5zcGFjZV90b3RhbDsgc3BhY2VfaW5kZXgrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3BhY2U7Ci0gICAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3Vic3BhY2UsIHNhdmVfc3Vic3BhY2U7Ci0gICAgICBpbnQgc3Vic3BhY2VfaW5kZXg7Ci0gICAgICBhc2VjdGlvbiAqc3BhY2VfYXNlY3Q7Ci0gICAgICBjaGFyICpuZXduYW1lOwotCi0gICAgICAvKiBSZWFkIHRoZSBzcGFjZSBkaWN0aW9uYXJ5IGVsZW1lbnQgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zcGFjZV9sb2NhdGlvbgotCQkgICAgICsgc3BhY2VfaW5kZXggKiBzaXplb2Ygc3BhY2UpLAotCQkgICAgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfcmVhZCAoJnNwYWNlLCAxLCBzaXplb2Ygc3BhY2UsIGFiZmQpICE9IHNpemVvZiBzcGFjZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogU2V0dXAgdGhlIHNwYWNlIG5hbWUgc3RyaW5nICovCi0gICAgICBzcGFjZS5uYW1lLm5fbmFtZSA9IHNwYWNlLm5hbWUubl9zdHJ4ICsgc3BhY2Vfc3RyaW5nczsKLQotICAgICAgLyogTWFrZSBhIHNlY3Rpb24gb3V0IG9mIGl0ICovCi0gICAgICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotICAgICAgaWYgKCFuZXduYW1lKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBzcGFjZS5uYW1lLm5fbmFtZSk7Ci0JCQkgICAKLSAgICAgIHNwYWNlX2FzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICAgICAgaWYgKCFzcGFjZV9hc2VjdCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgIGlmIChzcGFjZS5pc19sb2FkYWJsZSA9PSAwKQotCXNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gICAgICAvKiBTZXQgdXAgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgc3BhY2UuICAqLwotICAgICAgaWYgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc3BhY2VfYXNlY3QsIHNwYWNlLmlzX2RlZmluZWQsCi0JCQkJCSAgc3BhY2UuaXNfcHJpdmF0ZSwgc3BhY2Uuc29ydF9rZXksCi0JCQkJCSAgc3BhY2Uuc3BhY2VfbnVtYmVyKSA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSWYgdGhlIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMsIHRoZW4gd2UncmUgZG9uZS4gICovCi0gICAgICBpZiAoc3BhY2Uuc3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogTm93LCByZWFkIGluIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnN1YnNwYWNlX2xvY2F0aW9uCi0JCSAgICAgKyBzcGFjZS5zdWJzcGFjZV9pbmRleCAqIHNpemVvZiBzdWJzcGFjZSksCi0JCSAgICBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkgIT0gc2l6ZW9mIHN1YnNwYWNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgLyogU2VlayBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic3BhY2VzIGZvciBsb29wIGJlbG93ICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAoY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3Vic3BhY2VfbG9jYXRpb24KLQkJICAgICArIHNwYWNlLnN1YnNwYWNlX2luZGV4ICogc2l6ZW9mIHN1YnNwYWNlKSwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFNldHVwIHRoZSBzdGFydCBhZGRyZXNzIGFuZCBmaWxlIGxvYyBmcm9tIHRoZSBmaXJzdCBzdWJzcGFjZSByZWNvcmQgKi8KLSAgICAgIHNwYWNlX2FzZWN0LT52bWEgPSBzdWJzcGFjZS5zdWJzcGFjZV9zdGFydDsKLSAgICAgIHNwYWNlX2FzZWN0LT5maWxlcG9zID0gc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSArIGN1cnJlbnRfb2Zmc2V0OwotICAgICAgc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0gICAgICBpZiAoc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSW5pdGlhbGl6ZSBzYXZlX3N1YnNwYWNlIHNvIHdlIGNhbiByZWxpYWJseSBkZXRlcm1pbmUgaWYgdGhpcwotCSBsb29wIHBsYWNlZCBhbnkgdXNlZnVsIHZhbHVlcyBpbnRvIGl0LiAgKi8KLSAgICAgIG1lbXNldCAoJnNhdmVfc3Vic3BhY2UsIDAsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0KLSAgICAgIC8qIExvb3Agb3ZlciB0aGUgcmVzdCBvZiB0aGUgc3Vic3BhY2VzLCBidWlsZGluZyB1cCBtb3JlIHNlY3Rpb25zICovCi0gICAgICBmb3IgKHN1YnNwYWNlX2luZGV4ID0gMDsgc3Vic3BhY2VfaW5kZXggPCBzcGFjZS5zdWJzcGFjZV9xdWFudGl0eTsKLQkgICBzdWJzcGFjZV9pbmRleCsrKQotCXsKLQkgIGFzZWN0aW9uICpzdWJzcGFjZV9hc2VjdDsKLQotCSAgLyogUmVhZCBpbiB0aGUgbmV4dCBzdWJzcGFjZSAqLwotCSAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2Ygc3Vic3BhY2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBTZXR1cCB0aGUgc3Vic3BhY2UgbmFtZSBzdHJpbmcgKi8KLQkgIHN1YnNwYWNlLm5hbWUubl9uYW1lID0gc3Vic3BhY2UubmFtZS5uX3N0cnggKyBzcGFjZV9zdHJpbmdzOwotCi0JICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN1YnNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotCSAgaWYgKCFuZXduYW1lKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHN0cmNweSAobmV3bmFtZSwgc3Vic3BhY2UubmFtZS5uX25hbWUpOwotCi0JICAvKiBNYWtlIGEgc2VjdGlvbiBvdXQgb2YgdGhpcyBzdWJzcGFjZSAqLwotCSAgc3Vic3BhY2VfYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmV3bmFtZSk7Ci0JICBpZiAoIXN1YnNwYWNlX2FzZWN0KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogU3RvcmUgcHJpdmF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzdWJzcGFjZV9hc2VjdCwgc3BhY2VfYXNlY3QsCi0JCQkJCQkgc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cywKLQkJCQkJCSBzdWJzcGFjZS5zb3J0X2tleSwKLQkJCQkJCSBzdWJzcGFjZS5xdWFkcmFudCkgPT0gZmFsc2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBLZWVwIGFuIGVhc3kgbWFwcGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBhbmQgc2VjdGlvbnMuIAotCSAgICAgTm90ZSB3ZSBkbyBub3QgbmVjZXNzYXJpbHkgcmVhZCB0aGUgc3Vic3BhY2VzIGluIHRoZQotCSAgICAgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLQkgICAgIFNvIHRvIG1ha2UgdGhlIHRhcmdldCBpbmRleCBjb21lIG91dCBjb3JyZWN0bHksIHdlCi0JICAgICBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN1YnNwYWNlIGhlYWRlciBpbiB0YXJnZXQKLQkgICAgIGluZGV4LCB0aGVuIHNvcnQgdXNpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdWJzcGFjZQotCSAgICAgaGVhZGVyIGFzIHRoZSBrZXkuICBUaGVuIHdlIGNhbiBhc3NpZ24gY29ycmVjdAotCSAgICAgc3Vic3BhY2UgaW5kaWNlcy4gICovCi0JICB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIHN1YnNwYWNlX2FzZWN0LT50YXJnZXRfaW5kZXggPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN1YnNwYWNlKTsKLQotCSAgLyogU2V0IFNFQ19SRUFET05MWSBhbmQgU0VDX0NPREUvU0VDX0RBVEEgYXMgc3BlY2lmaWVkCi0JICAgICBieSB0aGUgYWNjZXNzX2NvbnRyb2xfYml0cyBpbiB0aGUgc3Vic3BhY2UgaGVhZGVyLiAgKi8KLQkgIHN3aXRjaCAoc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cyA+PiA0KQotCSAgICB7Ci0JICAgIC8qIFJlYWRvbmx5IGRhdGEuICAqLyAgCi0JICAgIGNhc2UgMHgwOgotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19SRUFET05MWTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBOb3JtYWwgZGF0YS4gICovICAKLQkgICAgY2FzZSAweDE6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19EQVRBOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIFJlYWRvbmx5IGNvZGUgYW5kIHRoZSBnYXRld2F5cy4KLQkgICAgICAgR2F0ZXdheXMgaGF2ZSBvdGhlciBhdHRyaWJ1dGVzIHdoaWNoIGRvIG5vdCBtYXAKLQkgICAgICAgaW50byBhbnl0aGluZyBCRkQga25vd3MgYWJvdXQuICAqLwotCSAgICBjYXNlIDB4MjoKLQkgICAgY2FzZSAweDQ6Ci0JICAgIGNhc2UgMHg1OgotCSAgICBjYXNlIDB4NjoKLQkgICAgY2FzZSAweDc6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIGR5bmFtaWMgKHdyaXRhYmxlKSBjb2RlLiAgKi8KLQkgICAgY2FzZSAweDM6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAKLQkgIGlmIChzdWJzcGFjZS5kdXBfY29tbW9uIHx8IHN1YnNwYWNlLmlzX2NvbW1vbikgCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgZWxzZSBpZiAoc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoID4gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLQkgIGlmIChzdWJzcGFjZS5pc19sb2FkYWJsZSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCSAgZWxzZQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLQotCSAgaWYgKHN1YnNwYWNlLmNvZGVfb25seSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCi0JICAvKiBCb3RoIGZpbGVfbG9jX2luaXRfdmFsdWUgYW5kIGluaXRpYWxpemF0aW9uX2xlbmd0aCB3aWxsCi0JICAgICBiZSB6ZXJvIGZvciBhIEJTUyBsaWtlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlID09IDAKLQkgICAgICAmJiBzdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGggPT0gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzICY9IH4oU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotCi0JICAvKiBUaGlzIHN1YnNwYWNlIGhhcyByZWxvY2F0aW9ucy4KLQkgICAgIFRoZSBmaXh1cF9yZXF1ZXN0X3F1YW50aXR5IGlzIGEgYnl0ZSBjb3VudCBmb3IgdGhlIG51bWJlciBvZgotCSAgICAgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW07IGl0IGlzIG5vdCB0aGUgYWN0dWFsIG51bWJlcgotCSAgICAgb2YgcmVsb2NhdGlvbnMgaW4gdGhlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maXh1cF9yZXF1ZXN0X3F1YW50aXR5ICE9IDApCi0JICAgIHsKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5yZWxfZmlsZXBvcyA9IHN1YnNwYWNlLmZpeHVwX3JlcXVlc3RfaW5kZXg7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2VfYXNlY3QpLT5yZWxvY19zaXplCi0JCT0gc3Vic3BhY2UuZml4dXBfcmVxdWVzdF9xdWFudGl0eTsKLQkgICAgICAvKiBXZSBjYW4gbm90IGRldGVybWluZSB0aGlzIHlldC4gIFdoZW4gd2UgcmVhZCBpbiB0aGUgCi0JCSByZWxvY2F0aW9uIHRhYmxlIHRoZSBjb3JyZWN0IHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluLiAgKi8KLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+cmVsb2NfY291bnQgPSAtMTsKLQkgICAgfQotCi0JICAvKiBVcGRhdGUgc2F2ZV9zdWJzcGFjZSBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBpZiAoc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSA+IHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSkKLQkgICAgc2F2ZV9zdWJzcGFjZSA9IHN1YnNwYWNlOwotCi0JICBzdWJzcGFjZV9hc2VjdC0+dm1hID0gc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQ7Ci0JICBzdWJzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoOwotCSAgc3Vic3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aDsKLQkgIHN1YnNwYWNlX2FzZWN0LT5maWxlcG9zID0gKHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJCQkgICAgICsgY3VycmVudF9vZmZzZXQpOwotCSAgc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0JICBpZiAoc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIGEgLm8gd2hpY2ggZGVmaW5lcyBzeW1ib2xzIGluIG90aGVyd2lzZQotICAgICAgICAgZW1wdHkgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGlmICghc2F2ZV9zdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlKQotCXsKLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAwOwotCSAgc3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNldHVwIHRoZSBzaXplcyBmb3IgdGhlIHNwYWNlIHNlY3Rpb24gYmFzZWQgdXBvbiB0aGUgaW5mbyBpbiB0aGUKLQkgICAgIGxhc3Qgc3Vic3BhY2Ugb2YgdGhlIHNwYWNlLiAgKi8KLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAoc2F2ZV9zdWJzcGFjZS5zdWJzcGFjZV9zdGFydAotCQkJCSAgICAgICAtIHNwYWNlX2FzZWN0LT52bWEKLQkJCQkgICAgICAgKyBzYXZlX3N1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aCk7Ci0JICBzcGFjZV9hc2VjdC0+X3Jhd19zaXplID0gKHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZQotCQkJCSAgICAtIHNwYWNlX2FzZWN0LT5maWxlcG9zCi0JCQkJICAgICsgc2F2ZV9zdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGgpOwotCX0KLSAgICB9Ci0gIC8qIE5vdyB0aGF0IHdlJ3ZlIHJlYWQgaW4gYWxsIHRoZSBzdWJzcGFjZSByZWNvcmRzLCB3ZSBuZWVkIHRvIGFzc2lnbgotICAgICBhIHRhcmdldCBpbmRleCB0byBlYWNoIHN1YnNwYWNlLiAgKi8KLSAgc3Vic3BhY2Vfc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHRvdGFsX3N1YnNwYWNlcwotCQkJCQkJKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldID0gc2VjdGlvbjsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIHFzb3J0IChzdWJzcGFjZV9zZWN0aW9ucywgdG90YWxfc3Vic3BhY2VzLAotCSBzaXplb2YgKGFzZWN0aW9uICopLCBjb21wYXJlX3N1YnNwYWNlcyk7Ci0gIAotICAvKiBzdWJzcGFjZV9zZWN0aW9ucyBpcyBub3cgc29ydGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc3Vic3BhY2VzCi0gICAgIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICBBc3NpZ24gYW4gaW5kZXggdG8gZWFjaCBvbmUgbm93LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3N1YnNwYWNlczsgaSsrKQotICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldLT50YXJnZXRfaW5kZXggPSBpOwotCi0gIGlmIChzcGFjZV9zdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2Vfc3RyaW5ncyk7Ci0KLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc3Vic3BhY2Vfc2VjdGlvbnMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3BhY2Vfc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlX3N0cmluZ3MpOwotCi0gIGlmIChzdWJzcGFjZV9zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHN1YnNwYWNlX3NlY3Rpb25zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGEgU09NIG9iamVjdCBhbmQgbWFrZSBpdCBpbnRvIGEgQkZELiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc29tX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBoZWFkZXIgZmlsZV9oZHI7Ci0gIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgYXV4X2hkcjsKLSAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldCA9IDA7Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBzb21fZW50cnkgc29tX2VudHJ5OwotI2RlZmluZSBFTlRSWV9TSVpFIHNpemVvZihzdHJ1Y3Qgc29tX2VudHJ5KQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBmaWxlX2hkciwgMSwgRklMRV9IRFJfU0laRSwgYWJmZCkgIT0gRklMRV9IRFJfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCFfUEFfUklTQ19JRCAoZmlsZV9oZHIuc3lzdGVtX2lkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzd2l0Y2ggKGZpbGVfaGRyLmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgY2FzZSBFWEVDX01BR0lDOgotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgY2FzZSBERU1BTkRfTUFHSUM6Ci0jaWZkZWYgRExfTUFHSUMKLSAgICBjYXNlIERMX01BR0lDOgotI2VuZGlmCi0jaWZkZWYgU0hMX01BR0lDCi0gICAgY2FzZSBTSExfTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBTSEFSRURfTUFHSUNfQ05YCi0gICAgY2FzZSBTSEFSRURfTUFHSUNfQ05YOgotI2VuZGlmCi0gICAgICBicmVhazsKLQotI2lmZGVmIEVYRUNMSUJNQUdJQwotICAgIGNhc2UgRVhFQ0xJQk1BR0lDOgotICAgICAgLyogUmVhZCB0aGUgbHN0IGhlYWRlciBhbmQgZGV0ZXJtaW5lIHdoZXJlIHRoZSBTT00gZGlyZWN0b3J5IGJlZ2lucyAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9oZWFkZXIsIDEsIFNMU1RIRFIsIGFiZmQpICE9IFNMU1RIRFIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIFBvc2l0aW9uIHRvIGFuZCByZWFkIHRoZSBmaXJzdCBkaXJlY3RvcnkgZW50cnkgKi8KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfaGVhZGVyLmRpcl9sb2MsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBzb21fZW50cnksIDEsIEVOVFJZX1NJWkUsIGFiZmQpICE9IEVOVFJZX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIE5vdyBwb3NpdGlvbiB0byB0aGUgZmlyc3QgU09NICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc29tX2VudHJ5LmxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBjdXJyZW50X29mZnNldCA9IHNvbV9lbnRyeS5sb2NhdGlvbjsKLQotICAgICAgLyogQW5kIGZpbmFsbHksIHJlLXJlYWQgdGhlIHNvbSBoZWFkZXIgKi8KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGZpbGVfaGRyLCAxLCBGSUxFX0hEUl9TSVpFLCBhYmZkKSAhPSBGSUxFX0hEUl9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChmaWxlX2hkci52ZXJzaW9uX2lkICE9IFZFUlNJT05fSUQKLSAgICAgICYmIGZpbGVfaGRyLnZlcnNpb25faWQgIT0gTkVXX1ZFUlNJT05fSUQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGF1eF9oZWFkZXJfc2l6ZSBmaWVsZCBpbiB0aGUgZmlsZSBoZWFkZXIgaXMgemVybywgdGhlbiB0aGlzCi0gICAgIG9iamVjdCBpcyBhbiBpbmNvbXBsZXRlIGV4ZWN1dGFibGUgKGEgLm8gZmlsZSkuICBEbyBub3QgdHJ5IHRvIHJlYWQKLSAgICAgYSBub24tZXhpc3RhbnQgYXV4aWxpYXJ5IGhlYWRlci4gICovCi0gIG1lbXNldCAoJmF1eF9oZHIsIDAsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcikpOwotICBpZiAoZmlsZV9oZHIuYXV4X2hlYWRlcl9zaXplICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGF1eF9oZHIsIDEsIEFVWF9IRFJfU0laRSwgYWJmZCkgIT0gQVVYX0hEUl9TSVpFKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIGlmICghc2V0dXBfc2VjdGlvbnMgKGFiZmQsICZmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpKQotICAgIHsKLSAgICAgIC8qIHNldHVwX3NlY3Rpb25zIGRvZXMgbm90IGJ1YmJsZSB1cCBhIGJmZCBlcnJvciBjb2RlLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbGlkIFNPTSBvYmplY3QuICBEbyBzb21lIGluaXRpYWxpemF0aW9uLiAgKi8KLSAgcmV0dXJuIHNvbV9vYmplY3Rfc2V0dXAgKGFiZmQsICZmaWxlX2hkciwgJmF1eF9oZHIsIGN1cnJlbnRfb2Zmc2V0KTsKLX0KLQotLyogQ3JlYXRlIGEgU09NIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0gIGFiZmQtPnRkYXRhLnNvbV9kYXRhID0gKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnNvbV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5pdGlhbGl6ZSBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBmaWxlIGhlYWRlci4gIFRoaXMgcm91dGluZSBtYWtlcwotICAgbm90IGF0dGVtcHQgYXQgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGZvciBhIGZ1bGwgZXhlY3V0YWJsZTsgaXQKLSAgIGlzIG9ubHkgbWVhbnQgdG8gaGFuZGxlIHJlbG9jYXRhYmxlIG9iamVjdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3ByZXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogTWFrZSBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gIGZpbGVfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSk7Ci0gIGlmIChmaWxlX2hkciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCkgPSBmaWxlX2hkcjsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotCi0gICAgICAvKiBNYWtlIGFuZCBhdHRhY2ggYW4gZXhlYyBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gICAgICBvYmpfc29tX2V4ZWNfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICopCi0JYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKSk7Ci0gICAgICBpZiAob2JqX3NvbV9leGVjX2hkciAoYWJmZCkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBERU1BTkRfTUFHSUM7Ci0gICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBTSEFSRV9NQUdJQzsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykKLQlmaWxlX2hkci0+YV9tYWdpYyA9IFNITF9NQUdJQzsKLSNlbmRpZgotICAgICAgZWxzZQotCWZpbGVfaGRyLT5hX21hZ2ljID0gRVhFQ19NQUdJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICBmaWxlX2hkci0+YV9tYWdpYyA9IFJFTE9DX01BR0lDOwotCi0gIC8qIE9ubHkgbmV3IGZvcm1hdCBTT00gaXMgc3VwcG9ydGVkLiAgKi8KLSAgZmlsZV9oZHItPnZlcnNpb25faWQgPSBORVdfVkVSU0lPTl9JRDsKLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsLCBhbmQgZW1iZWRkaW5nIHRpbWVzdGFtcHMgaXMgbm90IGFsd2F5cwotICAgICBhIHdpc2UgdGhpbmcgdG8gZG8sIGl0IG1ha2VzIGNvbXBhcmluZyBvYmplY3RzIGR1cmluZyBhIG11bHRpLXN0YWdlCi0gICAgIGJvb3RzdHJhcCBkaWZmaWN1bHQuICAqLwotICBmaWxlX2hkci0+ZmlsZV90aW1lLnNlY3MgPSAwOwotICBmaWxlX2hkci0+ZmlsZV90aW1lLm5hbm9zZWNzID0gMDsgCi0KLSAgZmlsZV9oZHItPmVudHJ5X3NwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X3N1YnNwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X29mZnNldCA9IDA7Ci0gIGZpbGVfaGRyLT5wcmVzdW1lZF9kcCA9IDA7Ci0KLSAgLyogTm93IGl0ZXJhdGUgb3ZlciB0aGUgc2VjdGlvbnMgdHJhbnNsYXRpbmcgaW5mb3JtYXRpb24gZnJvbQotICAgICBCRkQgc2VjdGlvbnMgdG8gU09NIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIElnbm9yZSBhbnl0aGluZyB3aGljaCBoYXMgbm90IGJlZW4gbWFya2VkIGFzIGEgc3BhY2Ugb3IKLQkgc3Vic3BhY2UuICAqLwotICAgICAgaWYgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICBpZiAoc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQl7Ci0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNwYWNlIGRpY3Rpb25hcnkuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QKLQkgICAgPSAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICopCi0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKTsKLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBTZXQgc3BhY2UgYXR0cmlidXRlcy4gIE5vdGUgbW9zdCBhdHRyaWJ1dGVzIG9mIFNPTSBzcGFjZXMKLQkgICAgIGFyZSBzZXQgYmFzZWQgb24gdGhlIHN1YnNwYWNlcyBpdCBjb250YWlucy4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+bG9hZGVyX2ZpeF9pbmRleCA9IC0xOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmluaXRfcG9pbnRlcl9pbmRleCA9IC0xOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zb3J0X2tleSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19kZWZpbmVkID0gCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX2RlZmluZWQ7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfcHJpdmF0ZSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19wcml2YXRlOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnNwYWNlX251bWJlciA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNwYWNlX251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5LiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0Ci0JICAgID0gKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqKQotCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTZXQgc3Vic3BhY2UgYXR0cmlidXRlcy4gIEJhc2ljIHN0dWZmIGlzIGRvbmUgaGVyZSwgYWRkaXRpb25hbAotCSAgICAgYXR0cmlidXRlcyBhcmUgZmlsbGVkIGluIGxhdGVyIGFzIG1vcmUgaW5mb3JtYXRpb24gYmVjb21lcwotCSAgICAgYXZhaWxhYmxlLiAgKi8KLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19JU19DT01NT04pCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZHVwX2NvbW1vbiA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmlzX2NvbW1vbiA9IDE7Ci0JICAgIH0KLQotCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAxOwotCi0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmNvZGVfb25seSA9IDE7Ci0KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zdWJzcGFjZV9zdGFydCA9IAotCSAgICBzZWN0aW9uLT52bWE7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3Vic3BhY2VfbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aW5pdGlhbGl6YXRpb25fbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+YWxpZ25tZW50ID0gCi0JICAgIDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zb3J0X2tleSA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5OwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmFjY2Vzc19jb250cm9sX2JpdHMgPQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5hY2Nlc3NfY29udHJvbF9iaXRzOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnF1YWRyYW50ID0KLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+cXVhZHJhbnQ7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZWN0aW9uIGlzIGEgU09NIHNwYWNlLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2lzX3NwYWNlIChzZWN0aW9uKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgLyogSWYgbm8gY29weSBkYXRhIGlzIGF2YWlsYWJsZSwgdGhlbiBpdCdzIG5laXRoZXIgYSBzcGFjZSBub3IgYQotICAgICBzdWJzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZSBjb250YWluaW5nIHNwYWNlIGlzbid0IHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBzZWN0aW9uLAotICAgICB0aGVuIHRoaXMgaXNuJ3QgYSBzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgIT0gc2VjdGlvbgotICAgICAgJiYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb24KLQkgICE9IHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPSy4gIE11c3QgYmUgYSBzcGFjZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VjdGlvbiBpcyBhIFNPTSBzdWJzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIC8qIElmIG5vIGNvcHkgZGF0YSBpcyBhdmFpbGFibGUsIHRoZW4gaXQncyBuZWl0aGVyIGEgc3BhY2Ugbm9yIGEKLSAgICAgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGUgY29udGFpbmluZyBzcGFjZSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gc2VjdGlvbiwKLSAgICAgdGhlbiB0aGlzIGlzbid0IGEgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID09IHNlY3Rpb24KLSAgICAgIHx8IChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICA9PSBzZWN0aW9uKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT0suICBNdXN0IGJlIGEgc3Vic3BhY2UuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNwYWNlIGNvbnRhaW5pbnMgdGhlIGdpdmVuIHN1YnNwYWNlLiAgSXQKLSAgIGlzIHNhZmUgdG8gYXNzdW1lIHNwYWNlIHJlYWxseSBpcyBhIHNwYWNlLCBhbmQgc3Vic3BhY2UgcmVhbGx5Ci0gICBpcyBhIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19jb250YWluZXIgKHNwYWNlLCBzdWJzcGFjZSkKLSAgICAgYXNlY3Rpb24gKnNwYWNlLCAqc3Vic3BhY2U7Ci17Ci0gIHJldHVybiAoc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2UpLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9PSBzcGFjZQotCSAgfHwgKHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICAgICAgPT0gc3BhY2UpKTsKLX0KLQotLyogQ291bnQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHNwYWNlcyBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNvbV9jb3VudF9zcGFjZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvdW50ID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgICBjb3VudCArPSBzb21faXNfc3BhY2UgKHNlY3Rpb24pOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFjZXMgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY291bnRfc3Vic3BhY2VzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb3VudCA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIGNvdW50ICs9IHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbik7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXR1cm4gLTEsIDAsIDEgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2Ygc3ltMSBhbmQgc3ltMi4KLQotICAgV2UgZGVzaXJlIHN5bWJvbHMgdG8gYmUgb3JkZXJlZCBzdGFydGluZyB3aXRoIHRoZSBzeW1ib2wgd2l0aCB0aGUKLSAgIGhpZ2hlc3QgcmVsb2NhdGlvbiBjb3VudCBkb3duIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgbG93ZXN0IHJlbG9jYXRpb24KLSAgIGNvdW50LiAgRG9pbmcgc28gY29tcGFjdHMgdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zeW1zIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci0KLXsKLSAgYXN5bWJvbCAqKnN5bTEgPSAoYXN5bWJvbCAqKikgYXJnMTsKLSAgYXN5bWJvbCAqKnN5bTIgPSAoYXN5bWJvbCAqKikgYXJnMjsKLSAgdW5zaWduZWQgaW50IGNvdW50MSwgY291bnQyOwotICAKLSAgLyogR2V0IHJlbG9jYXRpb24gY291bnQgZm9yIGVhY2ggc3ltYm9sLiAgTm90ZSB0aGF0IHRoZSBjb3VudAotICAgICBpcyBzdG9yZWQgaW4gdGhlIHVkYXRhIHBvaW50ZXIgZm9yIHNlY3Rpb24gc3ltYm9scyEgICovCi0gIGlmICgoKnN5bTEpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDEgPSAoKnN5bTEpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQxID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMSktPnJlbG9jX2NvdW50OwotCi0gIGlmICgoKnN5bTIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDIgPSAoKnN5bTIpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQyID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMiktPnJlbG9jX2NvdW50OwotCi0gIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuICAqLwotICBpZiAoY291bnQxIDwgY291bnQyKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChjb3VudDEgPiBjb3VudDIpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIC0xLCAwLCAxIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHN1YnNwYWNlMQotICAgYW5kIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zdWJzcGFjZXMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLQotewotICBhc2VjdGlvbiAqKnN1YnNwYWNlMSA9IChhc2VjdGlvbiAqKikgYXJnMTsKLSAgYXNlY3Rpb24gKipzdWJzcGFjZTIgPSAoYXNlY3Rpb24gKiopIGFyZzI7Ci0gIHVuc2lnbmVkIGludCBjb3VudDEsIGNvdW50MjsKLSAgCi0gIGlmICgoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCA8ICgqc3Vic3BhY2UyKS0+dGFyZ2V0X2luZGV4KQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpzdWJzcGFjZTIpLT50YXJnZXRfaW5kZXggPCAoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQZXJmb3JtIHZhcmlvdXMgd29yayBpbiBwcmVwYXJhdGlvbiBmb3IgZW1pdHRpbmcgdGhlIGZpeHVwIHN0cmVhbS4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcHJlcF9mb3JfZml4dXBzIChhYmZkLCBzeW1zLCBudW1fc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1fc3ltczsKLXsKLSAgaW50IGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBhc3ltYm9sICoqc29ydGVkX3N5bXM7Ci0KLSAgLyogTW9zdCBTT00gcmVsb2NhdGlvbnMgaW52b2x2aW5nIGEgc3ltYm9sIGhhdmUgYSBsZW5ndGggd2hpY2ggaXMKLSAgICAgZGVwZW5kZW50IG9uIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sLiAgU28gc3ltYm9scyB3aGljaCBhcmUKLSAgICAgdXNlZCBvZnRlbiBpbiByZWxvY2F0aW9ucyBzaG91bGQgaGF2ZSBhIHNtYWxsIGluZGV4LiAgKi8KLQotICAvKiBGaXJzdCBpbml0aWFsaXplIHRoZSBjb3VudGVycyBmb3IgZWFjaCBzeW1ib2wuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgYSBzZWN0aW9uIHN5bWJvbDsgdGhlc2UgaGF2ZSBubyBwb2ludGVycyBiYWNrIHRvIHRoZQotCSBTT00gc3ltYm9sIGluZm8uICBTbyB3ZSBqdXN0IHVzZSB0aGUgdWRhdGEgZmllbGQgdG8gaG9sZCB0aGUKLQkgcmVsb2NhdGlvbiBjb3VudC4gICovCi0gICAgICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKSA9PSBOVUxMCi0JICB8fCBzeW1zW2ldLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQl7Ci0JICBzeW1zW2ldLT5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0JICBzeW1zW2ldLT51ZGF0YS5pID0gMDsKLQl9Ci0gICAgICBlbHNlCi0Jc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKS0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB0aGUgY291bnRlcnMgYXJlIGluaXRpYWxpemVkLCBtYWtlIGEgd2VpZ2h0ZWQgY291bnQKLSAgICAgb2YgaG93IG9mdGVuIGEgZ2l2ZW4gc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIERvZXMgdGhpcyBzZWN0aW9uIGhhdmUgYW55IHJlbG9jYXRpb25zPyAgKi8KLSAgICAgIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXYWxrIHRocm91Z2ggZWFjaCByZWxvY2F0aW9uIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZm9yIChpID0gMTsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgYXJlbGVudCAqcmVsb2MgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbltpXTsKLQkgIGludCBzY2FsZTsKLQotCSAgLyogQSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlICpBQlMqIHNlY3Rpb24gcmVhbGx5Ci0JICAgICBkb2VzIG5vdCBoYXZlIGEgc3ltYm9sLiAgTGlrZXdpc2UgaWYgdGhlIHN5bWJvbCBpc24ndCBhc3NvY2lhdGVkCi0JICAgICB3aXRoIGFueSBzZWN0aW9uLiAgKi8KLQkgIGlmIChyZWxvYy0+c3ltX3B0cl9wdHIgPT0gTlVMTAotCSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNjYWxpbmcgdG8gZW5jb3VyYWdlIHN5bWJvbHMgaW52b2x2ZWQgaW4gUl9EUF9SRUxBVElWRSAKLQkgICAgIGFuZCBSX0NPREVfT05FX1NZTUJPTCByZWxvY2F0aW9ucyB0byBjb21lIGZpcnN0LiAgVGhlc2UKLQkgICAgIHR3byByZWxvY2F0aW9ucyBoYXZlIHNpbmdsZSBieXRlIHZlcnNpb25zIGlmIHRoZSBzeW1ib2wKLQkgICAgIGluZGV4IGlzIHZlcnkgc21hbGwuICAqLwotCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0RQX1JFTEFUSVZFCi0JICAgICAgfHwgcmVsb2MtPmhvd3RvLT50eXBlID09IFJfQ09ERV9PTkVfU1lNQk9MKQotCSAgICBzY2FsZSA9IDI7Ci0JICBlbHNlCi0JICAgIHNjYWxlID0gMTsKLQotCSAgLyogSGFuZGxlIHNlY3Rpb24gc3ltYm9scyBieSBzdG9yaW5nIHRoZSBjb3VudCBpbiB0aGUgdWRhdGEKLQkgICAgIGZpZWxkLiAgSXQgd2lsbCBub3QgYmUgdXNlZCBhbmQgdGhlIGNvdW50IGlzIHZlcnkgaW1wb3J0YW50Ci0JICAgICBmb3IgdGhlc2Ugc3ltYm9scy4gICovCi0JICBpZiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgICAgewotCSAgICAgICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSA9Ci0JCSgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSArIHNjYWxlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEEgbm9ybWFsIHN5bWJvbC4gIEluY3JlbWVudCB0aGUgY291bnQuICAqLwotCSAgc29tX3N5bWJvbF9kYXRhICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+cmVsb2NfY291bnQgKz0gc2NhbGU7Ci0JfQotICAgIH0KLQotICAvKiBTb3J0IGEgY29weSBvZiB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIgdGhhbiB0aGUgY2Fub25pY2FsCi0gICAgIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotICBzb3J0ZWRfc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBudW1fc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG1lbWNweSAoc29ydGVkX3N5bXMsIHN5bXMsIG51bV9zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgcXNvcnQgKHNvcnRlZF9zeW1zLCBudW1fc3ltcywgc2l6ZW9mIChhc3ltYm9sICopLCBjb21wYXJlX3N5bXMpOwotICBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKSA9IHNvcnRlZF9zeW1zOwotCi0gIC8qIENvbXB1dGUgdGhlIHN5bWJvbCBpbmRleGVzLCB0aGV5IHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSByZWxvY2F0aW9uCi0gICAgIGNvZGUuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBBIHNlY3Rpb24gc3ltYm9sLiAgQWdhaW4sIHRoZXJlIGlzIG5vIHBvaW50ZXIgdG8gYmFja2VuZCBzeW1ib2wKLQkgaW5mb3JtYXRpb24sIHNvIHdlIHJldXNlIHRoZSB1ZGF0YSBmaWVsZCBhZ2Fpbi4gICovCi0gICAgICBpZiAoc29ydGVkX3N5bXNbaV0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCXNvcnRlZF9zeW1zW2ldLT51ZGF0YS5pID0gaTsKLSAgICAgIGVsc2UKLSAgICAgICAgc29tX3N5bWJvbF9kYXRhIChzb3J0ZWRfc3ltc1tpXSktPmluZGV4ID0gaTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfZml4dXBzIChhYmZkLCBjdXJyZW50X29mZnNldCwgdG90YWxfcmVsb2Nfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9yZWxvY19zaXplcDsKLXsKLSAgdW5zaWduZWQgaW50IGksIGo7Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgdG90YWxfcmVsb2Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBzdWJzcGFjZV9yZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IG51bV9zcGFjZXMgPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfdG90YWw7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogQWxsIHRoZSBmaXh1cHMgZm9yIGEgcGFydGljdWxhciBzdWJzcGFjZSBhcmUgZW1pdHRlZCBpbiBhIHNpbmdsZQotICAgICBzdHJlYW0uICBBbGwgdGhlIHN1YnNwYWNlcyBmb3IgYSBwYXJ0aWN1bGFyIHNwYWNlIGFyZSBlbWl0dGVkCi0gICAgIGFzIGEgc2luZ2xlIHN0cmVhbS4KLQotICAgICBTbywgdG8gZ2V0IGFsbCB0aGUgbG9jYXRpb25zIGNvcnJlY3Qgb25lIG11c3QgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUKLSAgICAgc3BhY2VzLCBmb3IgZWFjaCBzcGFjZSBpdGVyYXRlIHRocm91Z2ggaXRzIHN1YnNwYWNlcyBhbmQgb3V0cHV0IGEKLSAgICAgZml4dXBzIHN0cmVhbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpbnQgcmVsb2Nfb2Zmc2V0LCBjdXJyZW50X3JvdW5kaW5nX21vZGU7Ci0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0gCSAgaW50IGN1cnJlbnRfY2FsbF9tb2RlOwotI2VuZGlmCi0KLQkgIC8qIEZpbmQgYSBzdWJzcGFjZSBvZiB0aGlzIHNwYWNlLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgc3Vic3BhY2UgZG9lcyBub3QgaGF2ZSByZWFsIGRhdGEsIHRoZW4gd2UgYXJlCi0JICAgICBmaW5pc2VkIHdpdGggaXQuICAqLwotCSAgaWYgKChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9pbmRleAotCQk9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFRoaXMgc3Vic3BhY2UgaGFzIHNvbWUgcmVsb2NhdGlvbnMuICBQdXQgdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0JICAgICBpbmRleCBpbnRvIHRoZSBzdWJzcGFjZSByZWNvcmQuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfaW5kZXgKLQkgICAgPSB0b3RhbF9yZWxvY19zaXplOwotCi0JICAvKiBUbyBtYWtlIGxpZmUgZWFzaWVyIHN0YXJ0IG92ZXIgd2l0aCBhIGNsZWFuIHNsYXRlIGZvciAKLQkgICAgIGVhY2ggc3Vic3BhY2UuICBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0KLQkgICAgIGZvciB0aGlzIHN1YnNwYWNlIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIG91dCBpdHMgZml4dXAKLQkgICAgIHN0cmVhbS4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0ICsgdG90YWxfcmVsb2Nfc2l6ZSwgU0VFS19TRVQpIDwgMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBCdWZmZXIgc3BhY2UgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuICBKdXN0IHBlcmZvcm0gc29tZQotCSAgICAgaW5pdGlhbGl6YXRpb24gaGVyZS4gICovCi0JICBwID0gdG1wX3NwYWNlOwotCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSA9IDA7Ci0JICByZWxvY19vZmZzZXQgPSAwOwotCSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLQkgIGN1cnJlbnRfcm91bmRpbmdfbW9kZSA9IFJfTl9NT0RFOwotI2lmbmRlZiBOT19QQ1JFTF9NT0RFUwotCSAgY3VycmVudF9jYWxsX21vZGUgPSBSX1NIT1JUX1BDUkVMX01PREU7Ci0jZW5kaWYKLQotCSAgLyogVHJhbnNsYXRlIGVhY2ggQkZEIHJlbG9jYXRpb24gaW50byBvbmUgb3IgbW9yZSBTT00gCi0JICAgICByZWxvY2F0aW9ucy4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgc3Vic2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKmJmZF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW2pdOwotCSAgICAgIHVuc2lnbmVkIGludCBza2lwOwotCSAgICAgIGludCBzeW1fbnVtOwotCi0JICAgICAgLyogR2V0IHRoZSBzeW1ib2wgbnVtYmVyLiAgUmVtZW1iZXIgaXQncyBzdG9yZWQgaW4gYSAKLQkJIHNwZWNpYWwgcGxhY2UgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0JICAgICAgaWYgKCgqYmZkX3JlbG9jLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCQlzeW1fbnVtID0gKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaTsKLQkgICAgICBlbHNlCi0JCXN5bV9udW0gPSBzb21fc3ltYm9sX2RhdGEgKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+aW5kZXg7Ci0JICAgICAgCi0JICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBjb3VwbGUgcmVsb2NhdGlvbnMsCi0JCSB0aGVuIGR1bXAgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gIEFsc28gcmVpbml0aWFsaXplCi0JCSB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gCi0KLQkJIE5vIHNpbmdsZSBCRkQgcmVsb2NhdGlvbiBjb3VsZCBldmVyIHRyYW5zbGF0ZSBpbnRvIG1vcmUKLQkJIHRoYW4gMTAwIGJ5dGVzIG9mIFNPTSByZWxvY2F0aW9ucyAoMjBieXRlcyBpcyBwcm9iYWJseSB0aGUKLQkJIHVwcGVyIGxpbWl0LCBidXQgbGVhdmUgbG90cyBvZiBzcGFjZSBmb3IgZ3Jvd3RoKS4gICovCi0JICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyAxMDAgPiBTT01fVE1QX0JVRlNJWkUpCi0JCXsKLQkJICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0bXBfc3BhY2UsIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBwID0gdG1wX3NwYWNlOwotCQkgIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7Ci0JCX0KLQotCSAgICAgIC8qIEVtaXQgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgYW55IGJ5dGVzIHdoaWNoIHdlcmUKLQkJIHNraXBwZWQuICAqLwotCSAgICAgIHNraXAgPSBiZmRfcmVsb2MtPmFkZHJlc3MgLSByZWxvY19vZmZzZXQ7Ci0JICAgICAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLAotCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCSAgICAgIC8qIFVwZGF0ZSByZWxvY19vZmZzZXQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KLQotCQkgTWFueSByZWxvY2F0aW9ucyBkbyBub3QgY29uc3VtZSBpbnB1dCBieXRlcy4gIFRoZXkKLQkJIGFyZSBtYXJrZXJzLCBvciBzZXQgc3RhdGUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gc29tZQotCQkgbGF0ZXIgcmVsb2NhdGlvbi4gICovCi0JICAgICAgc3dpdGNoIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgUl9FTlRSWToKLQkJY2FzZSBSX0FMVF9FTlRSWToKLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9OX01PREU6Ci0JCWNhc2UgUl9TX01PREU6Ci0JCWNhc2UgUl9EX01PREU6Ci0JCWNhc2UgUl9SX01PREU6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9DT01QMToKLQkJY2FzZSBSX0NPTVAyOgotCQljYXNlIFJfQkVHSU5fQlJUQUI6Ci0JCWNhc2UgUl9FTkRfQlJUQUI6Ci0JCWNhc2UgUl9CRUdJTl9UUlk6Ci0JCWNhc2UgUl9FTkRfVFJZOgotCQljYXNlIFJfTjBTRUw6Ci0JCWNhc2UgUl9OMVNFTDoKLSNpZm5kZWYgTk9fUENSRUxfTU9ERVMKLQkJY2FzZSBSX1NIT1JUX1BDUkVMX01PREU6Ci0JCWNhc2UgUl9MT05HX1BDUkVMX01PREU6Ci0jZW5kaWYKLQkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3M7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3MgKyA0OwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBOb3cgdGhlIGFjdHVhbCByZWxvY2F0aW9uIHdlIGNhcmUgYWJvdXQuICAqLwotCSAgICAgIHN3aXRjaCAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIFJfUENSRUxfQ0FMTDoKLQkJY2FzZSBSX0FCU19DQUxMOgotCQkgIHAgPSBzb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgYmZkX3JlbG9jLCBzeW1fbnVtLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPREVfT05FX1NZTUJPTDoKLQkJY2FzZSBSX0RQX1JFTEFUSVZFOgotCQkgIC8qIEFjY291bnQgZm9yIGFueSBhZGRlbmQuICAqLwotCQkgIGlmIChiZmRfcmVsb2MtPmFkZGVuZCkKLQkJICAgIHAgPSBzb21fcmVsb2NfYWRkZW5kIChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCwgcCwgCi0JCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCQkgIGlmIChzeW1fbnVtIDwgMHgyMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgc3ltX251bSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN5bV9udW0gPCAweDEwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMzIsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKLQkJCQkJICAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDMzLCBwKTsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMSk7Ci0JCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHN5bV9udW0sIHAgKyAyKTsgCi0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9EQVRBX09ORV9TWU1CT0w6Ci0JCWNhc2UgUl9EQVRBX1BMQUJFTDoKLQkJY2FzZSBSX0NPREVfUExBQkVMOgotCQljYXNlIFJfRExUX1JFTDoKLQkJICAvKiBBY2NvdW50IGZvciBhbnkgYWRkZW5kIHVzaW5nIFJfREFUQV9PVkVSUklERS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgIT0gUl9EQVRBX09ORV9TWU1CT0wKLQkJICAgICAgJiYgYmZkX3JlbG9jLT5hZGRlbmQpCi0JCSAgICBwID0gc29tX3JlbG9jX2FkZGVuZCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQsIHAsIAotCQkJCQkgICZzdWJzcGFjZV9yZWxvY19zaXplLCByZWxvY19xdWV1ZSk7Ci0KLQkJICBpZiAoc3ltX251bSA8IDB4MTAwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKLQkJCQkJICAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDIpOyAKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0VOVFJZOgotCQkgIHsKLQkJICAgIGludCB0bXA7Ci0JCSAgICBhcmVsZW50ICp0bXBfcmVsb2MgPSBOVUxMOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBSX0VOVFJZLCBwKTsKLQotCQkgICAgLyogUl9FTlRSWSByZWxvY2F0aW9ucyBoYXZlIDY0IGJpdHMgb2YgYXNzb2NpYXRlZAotCQkgICAgICAgZGF0YS4gIFVuZm9ydHVuYXRlbHkgdGhlIGFkZGVuZCBmaWVsZCBvZiBhIGJmZAotCQkgICAgICAgcmVsb2NhdGlvbiBpcyBvbmx5IDMyIGJpdHMuICBTbywgd2Ugc3BsaXQgdXAKLQkJICAgICAgIHRoZSA2NGJpdCB1bndpbmQgaW5mb3JtYXRpb24gYW5kIHN0b3JlIHBhcnQgaW4KLQkJICAgICAgIHRoZSBSX0VOVFJZIHJlbG9jYXRpb24sIGFuZCB0aGUgcmVzdCBpbiB0aGUgUl9FWElUCi0JCSAgICAgICByZWxvY2F0aW9uLiAgKi8KLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kLCBwICsgMSk7Ci0JCQotCQkgICAgLyogRmluZCB0aGUgbmV4dCBSX0VYSVQgcmVsb2NhdGlvbi4gICovCi0JCSAgICBmb3IgKHRtcCA9IGo7IHRtcCA8IHN1YnNlY3Rpb24tPnJlbG9jX2NvdW50OyB0bXArKykKLQkJICAgICAgewotCQkgICAgICAgIHRtcF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW3RtcF07Ci0JCQlpZiAodG1wX3JlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0VYSVQpCi0JCQkgIGJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGlmICh0bXAgPT0gc3Vic2VjdGlvbi0+cmVsb2NfY291bnQpCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICBiZmRfcHV0XzMyIChhYmZkLCB0bXBfcmVsb2MtPmFkZGVuZCwgcCArIDUpOwotCQkgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJcCwgOSwgcmVsb2NfcXVldWUpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQkgIAotCQljYXNlIFJfTl9NT0RFOgotCQljYXNlIFJfU19NT0RFOgotCQljYXNlIFJfRF9NT0RFOgotCQljYXNlIFJfUl9NT0RFOgotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiByZXF1ZXN0cyB0aGUgY3VycmVudCByb3VuZGluZwotCQkgICAgIG1vZGUsIHRoZW4gaXQgaXMgcmVkdW5kYW50LiAgKi8KLQkJICBpZiAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSAhPSBjdXJyZW50X3JvdW5kaW5nX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgICBjdXJyZW50X3JvdW5kaW5nX21vZGUgPSBiZmRfcmVsb2MtPmhvd3RvLT50eXBlOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0JCWNhc2UgUl9MT05HX1BDUkVMX01PREU6Ci0JCWNhc2UgUl9TSE9SVF9QQ1JFTF9NT0RFOgotCQkgIGlmIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlICE9IGN1cnJlbnRfY2FsbF9tb2RlKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgICAgICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgICAgIHAgKz0gMTsKLQkJICAgICAgY3VycmVudF9jYWxsX21vZGUgPSBiZmRfcmVsb2MtPmhvd3RvLT50eXBlOwotCQkgICAgfQotCQkgIGJyZWFrOwotI2VuZGlmCi0KLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9BTFRfRU5UUlk6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQkJY2FzZSBSX0VORF9CUlRBQjoKLQkJY2FzZSBSX0JFR0lOX1RSWToKLQkJY2FzZSBSX04wU0VMOgotCQljYXNlIFJfTjFTRUw6Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9FTkRfVFJZOgotCQkgIC8qIFRoZSBlbmQgb2YgYSBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9uLiAgVGhlIHJlbG9jJ3MKLQkJICAgICBhZGRlbmQgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0JCSAgICAgY29kZS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+YWRkZW5kID09IDApCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIGVsc2UgaWYgKGJmZF9yZWxvYy0+YWRkZW5kIDwgMTAyNCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMSk7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgMiwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMiwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgKGJmZF9yZWxvYy0+YWRkZW5kIC8gNCkgPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMik7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgICAgICAKLQkJY2FzZSBSX0NPTVAxOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDQ0LCBwICsgMSk7Ci0JCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBwLCAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPTVAyOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDgwLCBwICsgMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMik7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgcCwgNSwgcmVsb2NfcXVldWUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9DT0RFX0VYUFI6Ci0JCWNhc2UgUl9EQVRBX0VYUFI6Ci0JCSAgLyogVGhlIG9ubHkgdGltZSB3ZSBnZW5lcmF0ZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCAKLQkJICAgICBSX0NPREVfRVhQUiByZWxvY3MgaXMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgICAgIHN5bWJvbHMuICBIZW5jZSB3ZSBjYW4gY2hlYXQgaGVyZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCS8qIFB1dCBhICJSX1JFU0VSVkVEIiByZWxvY2F0aW9uIGluIHRoZSBzdHJlYW0gaWYKLQkJICAgd2UgaGl0IHNvbWV0aGluZyB3ZSBkbyBub3QgdW5kZXJzdGFuZC4gIFRoZSBsaW5rZXIKLQkJICAgd2lsbCBjb21wbGFpbiBsb3VkbHkgaWYgdGhpcyBldmVyIGhhcHBlbnMuICAqLwotCQlkZWZhdWx0OgotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgcCk7Ci0JCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgIHAgKz0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIExhc3QgQkZEIHJlbG9jYXRpb24gZm9yIGEgc3Vic3BhY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCSAgICAgTWFwIHRoZSByZXN0IG9mIHRoZSBzdWJzcGFjZSB3aXRoIFJfTk9fUkVMT0NBVElPTiBmaXh1cHMuICAqLwotCSAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKSAKLQkJCSAgICAgICAgICAgICAgLSByZWxvY19vZmZzZXQsCi0JCQkgICAgICBwLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JICAvKiBTY3JpYmJsZSBvdXQgdGhlIHJlbG9jYXRpb25zLiAgKi8KLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRtcF9zcGFjZSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkgICAgICAhPSBwIC0gdG1wX3NwYWNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBwID0gdG1wX3NwYWNlOwotCi0JICB0b3RhbF9yZWxvY19zaXplICs9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9xdWFudGl0eQotCSAgICA9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JfQotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotICAqdG90YWxfcmVsb2Nfc2l6ZXAgPSB0b3RhbF9yZWxvY19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBzdHJpbmdfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICpzdHJpbmdfc2l6ZXA7Ci17Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXYWxrIHRocm91Z2ggYWxsIHRoZSBzcGFjZXMgYW5kIHN1YnNwYWNlcyAob3JkZXIgaXMgbm90IGltcG9ydGFudCkKLSAgICAgYnVpbGRpbmcgdXAgYW5kIHdyaXRpbmcgc3RyaW5nIHRhYmxlIGVudHJpZXMgZm9yIHRoZWlyIG5hbWVzLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgLyogT25seSB3b3JrIHdpdGggc3BhY2Uvc3Vic3BhY2VzOyBhdm9pZCBhbnkgb3RoZXIgc2VjdGlvbnMKLQkgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIG1hZGUgKC50ZXh0IGZvciBleGFtcGxlKS4gICovCi0gICAgICBpZiAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikgJiYgIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lLiAgKi8KLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoc2VjdGlvbi0+bmFtZSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIG5leHQgZW50cnksIHRoZW4gZHVtcCB0aGUKLQkgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgRWFjaCBlbnRyeSB3aWxsIHRha2UgNCBieXRlcyB0bwotCSBob2xkIHRoZSBzdHJpbmcgbGVuZ3RoICsgdGhlIHN0cmluZyBpdHNlbGYgKyBudWxsIHRlcm1pbmF0b3IuICAqLwotICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JICAgICAgIT0gcCAtIHRtcF9zcGFjZSkgCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIEFsaWdubWVudCBpc3N1ZXMgYXJlIGFscmVhZHkgaGFuZGxlZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgcCArPSA0OwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgaW5kZXggaW4gdGhlIHNwYWNlL3N1YnNwYWNlIHJlY29yZHMuICAqLwotICAgICAgaWYgKHNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPm5hbWUubl9zdHJ4ID0gc3RyaW5nc19zaXplOwotICAgICAgZWxzZQotCXNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5uYW1lLm5fc3RyeCA9IHN0cmluZ3Nfc2l6ZTsKLQotICAgICAgLyogTmV4dCBjb21lcyB0aGUgc3RyaW5nIGl0c2VsZiArIGEgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KLSAgICAgIHN0cmNweSAocCwgc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgIHArKzsKLQkgIHN0cmluZ3Nfc2l6ZSsrOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uZSB3aXRoIHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmdzLiAgV3JpdGUgb3V0IGFueSBpbmZvcm1hdGlvbgotICAgICBjb250YWluZWQgaW4gYSBwYXJ0aWFsIGJsb2NrLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkgIT0gcCAtIHRtcF9zcGFjZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpzdHJpbmdfc2l6ZXAgPSBzdHJpbmdzX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgc3ltcywgbnVtX3N5bXMsIHN0cmluZ19zaXplcCwKLQkJCSAgY29tcGlsYXRpb25fdW5pdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgaW50IG51bV9zeW1zOwotICAgICB1bnNpZ25lZCBpbnQgKnN0cmluZ19zaXplcDsKLSAgICAgQ09NUFVOSVQgKmNvbXBpbGF0aW9uX3VuaXQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSAgLyogQ2h1bmsgb2YgbWVtb3J5IHRoYXQgd2UgY2FuIHVzZSBhcyBidWZmZXIgc3BhY2UsIHRoZW4gdGhyb3cKLSAgICAgYXdheS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdG1wX3NwYWNlW1NPTV9UTVBfQlVGU0laRV07Ci0gIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzX3NpemUgPSAwOwotICB1bnNpZ25lZCBjaGFyICpjb21wWzRdOwotCi0gIC8qIFRoaXMgZ2V0cyBhIGJpdCBncnVlc29tZSBiZWNhdXNlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAgVGhlCi0gICAgIHN0cmluZ3Mgd2l0aGluIHRoZSBjb21waWxhdGlvbiB1bml0IGFyZSBwYXJ0IG9mIHRoZSBzeW1ib2wKLSAgICAgc3RyaW5ncywgYnV0IGRvbid0IGhhdmUgc3ltYm9sX2RpY3Rpb25hcnkgZW50cmllcy4gIFNvLCBtYW51YWxseQotICAgICB3cml0ZSB0aGVtIGFuZCB1cGRhdGUgdGhlIGNvbXBsaWF0aW9uIHVuaXQgaGVhZGVyLiAgT24gaW5wdXQsIHRoZQotICAgICBjb21waWxhdGlvbiB1bml0IGhlYWRlciBjb250YWlucyBsb2NhbCBjb3BpZXMgb2YgdGhlIHN0cmluZ3MuCi0gICAgIE1vdmUgdGhlbSBhc2lkZS4gICovCi0gIGlmIChjb21waWxhdGlvbl91bml0KQotICAgIHsKLSAgICAgIGNvbXBbMF0gPSBjb21waWxhdGlvbl91bml0LT5uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMV0gPSBjb21waWxhdGlvbl91bml0LT5sYW5ndWFnZV9uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMl0gPSBjb21waWxhdGlvbl91bml0LT5wcm9kdWN0X2lkLm5fbmFtZTsKLSAgICAgIGNvbXBbM10gPSBjb21waWxhdGlvbl91bml0LT52ZXJzaW9uX2lkLm5fbmFtZTsKLSAgICB9Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29tcGlsYXRpb25fdW5pdCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkgIGludCBsZW5ndGggPSBzdHJsZW4gKGNvbXBbaV0pOwotCi0JICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAKLQkgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBub3cuICAqLwotCSAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkJICAhPSBwIC0gdG1wX3NwYWNlKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogUmVzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc3BhY2UuICAqLwotCSAgICAgIHAgPSB0bXBfc3BhY2U7Ci0JICAgIH0KLQotCSAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mCi0JICAgICB0aGUgc3RyaW5nLiAgVGhpcyBtdXN0IGFsd2F5cyBiZSA0IGJ5dGUgYWxpZ25lZC4gIFRoaXMgaXMKLQkgICAgIGFsc28gYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXgKLQkgICAgIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKLQkgIHN0cmluZ3Nfc2l6ZSArPSA0OwotCSAgcCArPSA0OwotCi0JICAvKiBOZXh0IGNvbWVzIHRoZSBzdHJpbmcgaXRzZWxmICsgYSBudWxsIHRlcm1pbmF0b3IuICAqLwotCSAgc3RyY3B5IChwLCBjb21wW2ldKTsKLQotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgMDoJCi0JICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+bmFtZS5uX3N0cnggPSBzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5sYW5ndWFnZV9uYW1lLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5wcm9kdWN0X2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT52ZXJzaW9uX2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgcCArPSBsZW5ndGggKyAxOwotCSAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7Ci0KLQkgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KLQkgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgICAgICBzdHJpbmdzX3NpemUrKzsKLQkgICAgICBwKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQotICAgIHsKLSAgICAgIGludCBsZW5ndGggPSBzdHJsZW4gKHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAgdGhlCi0JIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gICovCi0gICAgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQotCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIFRoaXMgbXVzdCBhbHdheXMgYmUgNCBieXRlIGFsaWduZWQuICBUaGlzIGlzIGFsc28KLQkgYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXggZmllbGQgaW4gdGhlCi0JIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIE5leHQgY29tZXMgdGhlIHN0cmluZyBpdHNlbGYgKyBhIG51bGwgdGVybWluYXRvci4gICovCi0gICAgICBzdHJjcHkgKHAsIHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICBzb21fc3ltYm9sX2RhdGEoc3ltc1tpXSktPnN0cmluZ3RhYl9vZmZzZXQgPSBzdHJpbmdzX3NpemU7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0gICAgICAgIHsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICBzdHJpbmdzX3NpemUrKzsKLQkgIHArKzsKLSAgICAgICAgfQotICAgIH0KLQotICAvKiBTY3JpYmJsZSBvdXQgYW55IHBhcnRpYWwgYmxvY2suICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKSAhPSBwIC0gdG1wX3NwYWNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc3RyaW5nX3NpemVwID0gc3RyaW5nc19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29tcHV0ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBiZSBwbGFjZWQgaW4gdGhlIFNPTSBoZWFkZXJzLCAKLSAgIHNwYWNlL3N1YnNwYWNlIGRpY3Rpb25hcmllcywgcmVsb2NhdGlvbiBzdHJlYW1zLCBldGMuICBCZWdpbgotICAgd3JpdGluZyBwYXJ0cyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNvbV9iZWdpbl93cml0aW5nIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQgPSAwOwotICBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIG51bV9zcGFjZXMsIG51bV9zdWJzcGFjZXMsIGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgdG90YWxfc3Vic3BhY2VzID0gMDsKLSAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXIgPSBOVUxMOwotCi0gIC8qIFRoZSBmaWxlIGhlYWRlciB3aWxsIGFsd2F5cyBiZSBmaXJzdCBpbiBhbiBvYmplY3QgZmlsZSwgCi0gICAgIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgaW4gcmFuZG9tIGxvY2F0aW9ucy4gIFRvIGtlZXAgdGhpbmdzCi0gICAgICJzaW1wbGUiIEJGRCB3aWxsIGxheSBvdXQgdGhlIG9iamVjdCBmaWxlIGluIHRoZSBtYW5uZXIgc3VnZ2VzdGVkCi0gICAgIGJ5IHRoZSBQUk8gQUJJIGZvciBQQS1SSVNDIFN5c3RlbXMuICAqLwotCi0gIC8qIEJlZm9yZSBhbnkgb3V0cHV0IGNhbiByZWFsbHkgYmVnaW4gb2Zmc2V0cyBmb3IgYWxsIHRoZSBtYWpvcgotICAgICBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZSBjb21wdXRlZC4gIFNvLCBzdGFydGluZwotICAgICB3aXRoIHRoZSBpbml0aWFsIGZpbGUgaGVhZGVyIGNvbXB1dGUgKGFuZCBzb21ldGltZXMgd3JpdGUpCi0gICAgIGVhY2ggcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGZpbGUgaGVhZGVyLCBpdCdzIGNvbnRlbnRzIGFyZSBub3QgY29tcGxldGUKLSAgICAgeWV0LCBzbyBpdCBjYW4gbm90IGJlIHdyaXR0ZW4gYXQgdGhpcyB0aW1lLiAgKi8KLSAgY3VycmVudF9vZmZzZXQgKz0gc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKTsgIAotCi0gIC8qIEFueSBhdXhpbGlhcnkgaGVhZGVycyB3aWxsIGZvbGxvdyB0aGUgZmlsZSBoZWFkZXIuICBSaWdodCBub3cKLSAgICAgd2Ugc3VwcG9ydCBvbmx5IHRoZSBjb3B5cmlnaHQgYW5kIHZlcnNpb24gaGVhZGVycy4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgPSAwOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotICAgICAgLyogUGFydHMgb2YgdGhlIGV4ZWMgaGVhZGVyIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyLCBzbwotCSBkZWxheSB3cml0aW5nIHRoZSBoZWFkZXIgaXRzZWxmLiAgRmlsbCBpbiB0aGUgZGVmYXVsdHMsCi0JIGFuZCB3cml0ZSBpdCBsYXRlci4gICovCi0gICAgICBjdXJyZW50X29mZnNldCArPSBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZQotCSs9IHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcik7Ci0gICAgICBleGVjX2hlYWRlciA9IG9ial9zb21fZXhlY19oZHIgKGFiZmQpOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIudHlwZSA9IEVYRUNfQVVYX0lEOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIubGVuZ3RoID0gNDA7Ci0gICAgfQotICBpZiAob2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gICovCi0gICAgICBsZW4gPSBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnVzZXJfc3RyaW5nLAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCksIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGNvcHlyaWdodCBzdHJpbmcuICAqLwotICAgICAgbGVuID0gb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+Y29weXJpZ2h0LAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTmV4dCBjb21lcyB0aGUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnM7IHdlIGhhdmUgbm8gaW5pdGlhbGl6YXRpb24KLSAgICAgcG9pbnRlcnMsIHNvIGN1cnJlbnQgb2Zmc2V0IGRvZXMgbm90IGNoYW5nZS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X3RvdGFsID0gMDsKLQotICAvKiBOZXh0IGFyZSB0aGUgc3BhY2UgcmVjb3Jkcy4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3BhY2UgcmVjb3Jkcy4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHNwYWNlcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgc3RyaW5nIHRhYmxlLAotICAgICBhbmQgdGhlIGluZGV4IGZvciBlYWNoIHNwYWNlIGludG8gdGhlIHN0cmluZyB0YWJsZSBpcyBjb21wdXRlZAotICAgICBiZWxvdy4gIFRoZXJlZm9yZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIHRoZSBzcGFjZSBoZWFkZXJzCi0gICAgIGF0IHRoaXMgdGltZS4gICovCi0gIG51bV9zcGFjZXMgPSBzb21fY291bnRfc3BhY2VzIChhYmZkKTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV90b3RhbCA9IG51bV9zcGFjZXM7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IG51bV9zcGFjZXMgKiBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0KLSAgLyogTmV4dCBhcmUgdGhlIHN1YnNwYWNlIHJlY29yZHMuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCi0KLSAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3Vic3BhY2UgcmVjb3Jkcy4KLQotICAgICBBIHZhcmlldHkgaWYgZmllbGRzIGluIHRoZSBzdWJzcGFjZSByZWNvcmQgYXJlIHN0aWxsIHVua25vd24gYXQKLSAgICAgdGhpcyB0aW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSwgZml4dXAgc3RyZWFtIGxvY2F0aW9uL3NpemUsIGV0YykuICAqLwotICBudW1fc3Vic3BhY2VzID0gc29tX2NvdW50X3N1YnNwYWNlcyAoYWJmZCk7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zdWJzcGFjZV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3Vic3BhY2VfdG90YWwgPSBudW1fc3Vic3BhY2VzOwotICBjdXJyZW50X29mZnNldCArPSBudW1fc3Vic3BhY2VzICogc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgaXMgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWVzLiAgV2Ugd2lsbAotICAgICBidWlsZCBhbmQgd3JpdGUgdGhlIHN0cmluZyB0YWJsZSBvbiB0aGUgZmx5LiAgQXQgdGhlIHNhbWUgdGltZQotICAgICB3ZSB3aWxsIGZpbGwgaW4gdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWUgaW5kZXggZmllbGRzLiAgKi8KLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsKLQotICAvKiBNYXJrIHRoZSBvZmZzZXQgb2YgdGhlIHNwYWNlL3N1YnNwYWNlIHN0cmluZyB0YWJsZSBpbiB0aGUgCi0gICAgIGZpbGUgaGVhZGVyLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHNwYWNlIHN0cmluZ3MuICAqLwotICBpZiAoc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmc3RyaW5nc19zaXplKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVjb3JkIHRvdGFsIHN0cmluZyB0YWJsZSBzaXplIGluIHRoZSBoZWFkZXIgYW5kIHVwZGF0ZSB0aGUKLSAgICAgY3VycmVudCBvZmZzZXQuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2Vfc3RyaW5nc19zaXplID0gc3RyaW5nc19zaXplOwotICBjdXJyZW50X29mZnNldCArPSBzdHJpbmdzX3NpemU7Ci0KLSAgLyogTmV4dCBpcyB0aGUgY29tcGlsYXRpb24gdW5pdC4gKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl90b3RhbCA9IDA7Ci0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKSAKLSAgICB7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfdG90YWwgPSAxOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gQ09NUFVOSVRTWjsgCi0gICAgfQotCi0gIC8qIE5vdyBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIGxvYWRhYmxlIHN1YnNwYWNlcywgdGFraW5nCi0gICAgIGNhcmUgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgc3RheXMgcHJvcGVybHkgYWxpZ25lZC4gICovCi0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotICAgICAgaW50IGZpcnN0X3N1YnNwYWNlOwotICAgICAgdW5zaWduZWQgaW50IHN1YnNwYWNlX29mZnNldCA9IDA7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMTsKLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBpbiB0aGUgc3BhY2UsIGFuZCB3ZSBhcmUKLQkgICAgIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHRoZW4gdGFrZSBjYXJlIHRvIG1ha2Ugc3VyZSBhbGwKLQkgICAgIHRoZSBhbGlnbm1lbnRzIGFyZSBjb3JyZWN0IGFuZCB1cGRhdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLQkgIGlmIChmaXJzdF9zdWJzcGFjZQotCSAgICAgICYmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkpCi0JICAgIHsKLQkgICAgICAvKiBEZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMgaGF2ZSBlYWNoIHNwYWNlIGFsaWduZWQgdG8gYQotCQkgcGFnZSBib3VuZGFyeS4gIFNoYXJhYmxlIGV4ZWN1dGFibGVzICh3cml0ZS1wcm90ZWN0ZWQKLQkJIHRleHQpIGhhdmUganVzdCB0aGUgcHJpdmF0ZSAoYWthIGRhdGEgJiBic3MpIHNwYWNlIGFsaWduZWQKLQkJIHRvIGEgcGFnZSBib3VuZGFyeS4gIFVnaC4gIE5vdCB0cnVlIGZvciBIUFVYLgotCi0JCSBUaGUgSFBVWCBrZXJuZWwgcmVxdWlyZXMgdGhlIHRleHQgdG8gYWx3YXlzIGJlIHBhZ2UgYWxpZ25lZAotCQkgd2l0aGluIHRoZSBmaWxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGV4ZWN1dGFibGUncyB0eXBlLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRF9QQUdFRCB8IERZTkFNSUMpCi0JCSAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JCSAgfHwgKChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JCSAgICAgICYmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKSkpCi0JCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0JICAgICAgLyogVXBkYXRlIHRoZSBleGVjIGhlYWRlci4gICovCi0JICAgICAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUgJiYgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPT0gMCkKLQkJewotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX3RtZW0gPSBzZWN0aW9uLT52bWE7Ci0JCSAgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPSBjdXJyZW50X29mZnNldDsKLQkJfQotCSAgICAgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBICYmIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID09IDApCi0JCXsKLQkJICBleGVjX2hlYWRlci0+ZXhlY19kbWVtID0gc2VjdGlvbi0+dm1hOwotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID0gY3VycmVudF9vZmZzZXQ7Ci0JCX0KLQotCSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgZXhhY3RseSB3aGVyZSB3ZSBhcmUgd2l0aGluIGEgcGFydGljdWxhcgotCQkgc3BhY2UuICBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGUgYnJhaW5kYW1hZ2VkIEhQVVgKLQkJIGxvYWRlciB3aWxsIGNyZWF0ZSBob2xlcyBiZXR3ZWVuIHN1YnNwYWNlcyAqYW5kKiAKLQkJIHN1YnNwYWNlIGFsaWdubWVudHMgYXJlICpOT1QqIHByZXNlcnZlZC4gIFdoYXQgYSBjcm9jay4gICovCi0JICAgICAgc3Vic3BhY2Vfb2Zmc2V0ID0gc3Vic2VjdGlvbi0+dm1hOwotCi0JICAgICAgLyogT25seSBkbyB0aGlzIGZvciB0aGUgZmlyc3Qgc3Vic3BhY2Ugd2l0aGluIGVhY2ggc3BhY2UuICAqLwotCSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgYnJhaW5kYW1hZ2VkIEhQVVggbG9hZGVyIG1heSBoYXZlIGNyZWF0ZWQgYSBob2xlCi0JCSBiZXR3ZWVuIHR3byBzdWJzcGFjZXMuICBJdCBpcyAqbm90KiBzdWZmaWNpZW50IHRvIHVzZQotCQkgdGhlIGFsaWdubWVudCBzcGVjaWZpY2F0aW9ucyB3aXRoaW4gdGhlIHN1YnNwYWNlcyB0bwotCQkgYWNjb3VudCBmb3IgdGhlc2UgaG9sZXMgLS0gSSd2ZSBydW4gaW50byBhdCBsZWFzdCBvbmUKLQkJIGNhc2Ugd2hlcmUgdGhlIGxvYWRlciBsZWZ0IG9uZSBjb2RlIHN1YnNwYWNlIHVuYWxpZ25lZAotCQkgaW4gYSBmaW5hbCBleGVjdXRhYmxlLgotCi0JCSBUbyBjb21iYXQgdGhpcyB3ZSBrZWVwIGEgY3VycmVudCBvZmZzZXQgd2l0aGluIGVhY2ggc3BhY2UsCi0JCSBhbmQgdXNlIHRoZSBzdWJzcGFjZSB2bWEgZmllbGRzIHRvIGRldGVjdCBhbmQgcHJlc2VydmUKLQkJIGhvbGVzLiAgV2hhdCBhIGNyb2NrIQotCi0JCSBwcy4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdW5sb2FkYWJsZSBzcGFjZS9zdWJzcGFjZXMuICAqLwotCSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKLQkgICAgICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7Ci0JICAgIH0KLQotCi0JICBzdWJzZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIC8qIFRoaXMgaXMgcmVhbCBkYXRhIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBmaWxlLiAgKi8KLQkgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBjb2RlICYgZGF0YS4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgJiYgc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgICAgICAmJiBzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKQotCQlleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBzdWJzZWN0aW9uLT5maWxlcG9zID0gY3VycmVudF9vZmZzZXQ7Ci0JICAgICAgY3VycmVudF9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7IAotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsKLQkgICAgfQotCSAgLyogTG9va3MgbGlrZSB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBic3Mgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCQlleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0KLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IDA7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPgotCQlpbml0aWFsaXphdGlvbl9sZW5ndGggPSAwOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogRmluYWxseSBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCi0gICAgIElmIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHN0YXJ0IHRoZSB1bmxvYWRhYmxlIHN0dWZmIG9uIGl0cwotICAgICBvd24gcGFnZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQkgIAotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCi0JICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3Vic2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdG90YWxfc3Vic3BhY2VzKys7Ci0JICAvKiBUaGlzIGlzIHJlYWwgZGF0YSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgZmlsZS4gICovCi0JICBpZiAoKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IGN1cnJlbnRfb2Zmc2V0OwotCSAgICAgIHN1YnNlY3Rpb24tPmZpbGVwb3MgPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBjdXJyZW50X29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsgCi0JICAgIH0KLQkgIC8qIExvb2tzIGxpa2UgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCi0JCT0gMDsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Ci0JCWluaXRpYWxpemF0aW9uX2xlbmd0aCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogSWYgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgdGhlbiBtYWtlIHN1cmUgdG8gc2VlayB0byBhbmQgd3JpdGUKLSAgICAgb25lIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBtYWtlIHN1cmUgYW55IG5lY2Vzc2FyeQotICAgICB6ZXJvcyBhcmUgZmlsbGVkIGluLiAgVWdoLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0IC0gMSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICIiLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9zaXplCi0gICAgPSBjdXJyZW50X29mZnNldCAtIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uOwotCi0gIC8qIExvYWRlciBmaXh1cHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYW55IHdheSBzaGFwZSBvciBmb3JtLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmxvYWRlcl9maXh1cF9sb2NhdGlvbiA9IDA7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5sb2FkZXJfZml4dXBfdG90YWwgPSAwOwotCi0gIC8qIERvbmUuICBTdG9yZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgU09NIHNvIGZhci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmFsbHksIHNjcmliYmxlIG91dCB0aGUgdmFyaW91cyBoZWFkZXJzIHRvIHRoZSBkaXNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9maW5pc2hfd3JpdGluZyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnVtX3NwYWNlcyA9IHNvbV9jb3VudF9zcGFjZXMgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGludCBpLCBudW1fc3ltcywgc3RyaW5nc19zaXplOwotICBpbnQgc3Vic3BhY2VfaW5kZXggPSAwOwotICBmaWxlX3B0ciBsb2NhdGlvbjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9yZWxvY19zaXplOwotCi0gIC8qIE5leHQgaXMgdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCi0gICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHN5bWJvbHMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIHN0cmluZyB0YWJsZSwKLSAgICAgYW5kIHRoZSBpbmRleCBmb3IgZWFjaCBzeW1ib2wgbmFtZSBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaXMgY29tcHV0ZWQKLSAgICAgYmVsb3cuICBUaGVyZWZvcmUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIGF0IHRoaXMgdGltZS4gCi0KLSAgICAgVGhlc2UgdXNlZCB0byBiZSBvdXRwdXQgYmVmb3JlIHRoZSBzdWJzcGFjZSBjb250ZW50cywgYnV0IHRoZXkKLSAgICAgd2VyZSBtb3ZlZCBoZXJlIHRvIHdvcmsgYXJvdW5kIGEgc3R1cGlkIGJ1ZyBpbiB0aGUgaHB1eCBsaW5rZXIKLSAgICAgKGZpeGVkIGluIGhwdXgxMCkuICAqLwotICBjdXJyZW50X29mZnNldCA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOyAKLQotICBudW1fc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfdG90YWwgPSBudW1fc3ltczsKLSAgY3VycmVudF9vZmZzZXQgKz0gbnVtX3N5bXMgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgYXJlIHRoZSBzeW1ib2wgc3RyaW5ncy4KLSAgICAgQWxpZ24gdGhlbSB0byBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmdzLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHN5bXMsCi0JCQkJbnVtX3N5bXMsICZzdHJpbmdzX3NpemUsCi0JCQkJb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWNvcmQgdG90YWwgc3RyaW5nIHRhYmxlIHNpemUgaW4gaGVhZGVyIGFuZCB1cGRhdGUgdGhlCi0gICAgIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9zdHJpbmdzX3NpemUgPSBzdHJpbmdzX3NpemU7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IHN0cmluZ3Nfc2l6ZTsKLQotICAvKiBEbyBwcmVwIHdvcmsgYmVmb3JlIGhhbmRsaW5nIGZpeHVwcy4gICovCi0gIHNvbV9wcmVwX2Zvcl9maXh1cHMgKGFiZmQsCi0JCSAgICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpLAotCQkgICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCi0gIC8qIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgdGhlIGZpeHVwIHN0cmVhbSB3aGljaCBzdGFydHMgb24gYQotICAgICB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsgCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgLyogV3JpdGUgdGhlIGZpeHVwcyBhbmQgdXBkYXRlIGZpZWxkcyBpbiBzdWJzcGFjZSBoZWFkZXJzIHdoaWNoCi0gICAgIHJlbGF0ZSB0byB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9maXh1cHMgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmdG90YWxfcmVsb2Nfc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlY29yZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZml4dXAgc3RyZWFtIGluIHRoZSBmaWxlIGhlYWRlci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X3RvdGFsID0gdG90YWxfcmVsb2Nfc2l6ZTsKLQotICAvKiBEb25lLiAgU3RvcmUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIFNPTS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQgKyB0b3RhbF9yZWxvY19zaXplOwotIAotICAvKiBOb3cgdGhhdCB0aGUgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGlzIGNvbXBsZXRlLCBidWlsZCBhbmQKLSAgICAgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN1YnNwYWNlcyBhcmUgd3JpdHRlbiBmaXJzdCBzbyB0aGF0IHdlIGNhbiBzZXQgdXAgaW5mb3JtYXRpb24KLSAgICAgYWJvdXQgdGhlbSBpbiB0aGVpciBjb250YWluaW5nIHNwYWNlcyBhcyB0aGUgc3Vic3BhY2UgaXMgd3JpdHRlbi4gICovCi0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4gICovCi0gIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN1YnNwYWNlX2xvY2F0aW9uOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBsb2FkYWJsZSBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZQotCSAgICAgb3Igc3Vic3BhY2UuICBPciBkb2VzIG5vdCBoYXZlIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUKLQkgICAgIGhhcyBubyByZWFsIGJpdHMgb24gdGhlIGRpc2spLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQotCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlLCB0aGVuIHNhdmUKLQkgICAgIHRoZSBpbmRleCBvZiB0aGUgc3Vic3BhY2UgaW4gaXRzIGNvbnRhaW5pbmcgc3BhY2UuICBBbHNvCi0JICAgICBzZXQgImlzX2xvYWRhYmxlIiBpbiB0aGUgY29udGFpbmluZyBzcGFjZS4gICovCi0KLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19sb2FkYWJsZSA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX2luZGV4Ci0JCT0gc3Vic3BhY2VfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhY2VzIHNlZW4gYW5kIHRoZSBudW1iZXIgb2YKLQkgICAgIHN1YnNwYWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQkgIHN1YnNwYWNlX2luZGV4Kys7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQotCSAgLyogTWFyayB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3BhY2Ugd2l0aGluIHRoZSBzdWJzcGFjZSdzCi0JICAgICBkaWN0aW9uYXJ5IHJlY29yZC4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3BhY2VfaW5kZXggPSBpOwotCSAgCi0JICAvKiBEdW1wIHRoZSBjdXJyZW50IHN1YnNwYWNlIGhlYWRlci4gICovCi0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdCwKLQkJCSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCksIDEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogTm93IHJlcGVhdCB0aGUgcHJvY2VzcyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuICAqLwotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZSBvcgotCSAgICAgc3Vic3BhY2UsIG9yIHdoaWNoIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUgaGFuZGxlZAotCSAgICAgaW4gdGhlIGxvYWRhYmxlIHNwYWNlcy9zdWJzcGFjZXMgY29kZSBhYm92ZSkuICAqLwotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSwgdGhlbiBzYXZlCi0JICAgICB0aGUgaW5kZXggb2YgdGhlIHN1YnNwYWNlIGluIGl0cyBjb250YWluaW5nIHNwYWNlLiAgQ2xlYXIKLQkgICAgICJpc19sb2FkYWJsZSIuICAqLwotCi0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5ID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAwOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9pbmRleAotCQk9IHN1YnNwYWNlX2luZGV4OwotCSAgICB9Ci0KLQkgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWNlcyBzZWVuIGFuZCB0aGUgbnVtYmVyIG9mCi0JICAgICBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudCBzcGFjZS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQkgIHN1YnNwYWNlX2luZGV4Kys7IAotCi0JICAvKiBNYXJrIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzcGFjZSB3aXRoaW4gdGhlIHN1YnNwYWNlJ3MKLQkgICAgIGRpY3Rpb25hcnkgcmVjb3JkLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zcGFjZV9pbmRleCA9IGk7Ci0JICAKLQkgIC8qIER1bXAgdGhpcyBzdWJzcGFjZSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QsCi0JCQkgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCi0gICAgfQotCi0gIC8qIEFsbCB0aGUgc3Vic3BhY2UgZGljdGlvbmRhcnkgcmVjb3JkcyBhcmUgd3JpdHRlbiwgYW5kIGFsbCB0aGUKLSAgICAgZmllbGRzIGFyZSBzZXQgdXAgaW4gdGhlIHNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4KLQotICAgICBTZWVrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBhbmQgc3RhcnQgd3JpdGluZyB0aGUgc3BhY2UKLSAgICAgZGljdGlvbmFyeSByZWNvcmRzLiAgKi8KLSAgbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfbG9jYXRpb247Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgbG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIER1bXAgaXRzIGhlYWRlciAgKi8KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LAotCQkgICAgIHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVjb3JkIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLAotCQkgICAgIENPTVBVTklUU1osIDEsIGFiZmQpICE9IENPTVBVTklUU1opCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2V0dGluZyBvZiB0aGUgc3lzdGVtX2lkIGhhcyB0byBoYXBwZW4gdmVyeSBsYXRlIG5vdyB0aGF0IGNvcHlpbmcgb2YKLSAgICAgQkZEIHByaXZhdGUgZGF0YSBoYXBwZW5zICphZnRlciogc2VjdGlvbiBjb250ZW50cyBhcmUgc2V0LiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+c3lzdGVtX2lkOwotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IHBhMjApCi0gICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MyXzA7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gcGExMSkKLSAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMTsKLSAgZWxzZQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtIGZvciB0aGUgZmlsZSBoZWFkZXIganVzdCBiZWZvcmUgd3JpdGluZwotICAgICB0aGUgaGVhZGVyIHRvIGRpc2suICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y2hlY2tzdW0gPSBzb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCk7Ci0KLSAgLyogT25seSB0aGluZyBsZWZ0IHRvIGRvIGlzIHdyaXRlIG91dCB0aGUgZmlsZSBoZWFkZXIuICBJdCBpcyBhbHdheXMKLSAgICAgYXQgbG9jYXRpb24gemVyby4gIFNlZWsgdGhlcmUgYW5kIHdyaXRlIGl0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKSwKLQkJIHNpemVvZiAoc3RydWN0IGhlYWRlciksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIHsKLSAgICAgIGxvbmcgdG1wLCBzb21fbGVuZ3RoOwotICAgICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXI7Ci0KLSAgICAgIGV4ZWNfaGVhZGVyID0gb2JqX3NvbV9leGVjX2hkciAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19mbGFncyA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFnczsKLQotICAgICAgLyogT2ggam95cy4gIFJhbSBzb21lIG9mIHRoZSBCU1MgZGF0YSBpbnRvIHRoZSBEQVRBIHNlY3Rpb24KLQkgdG8gYmUgY29tcGF0YWJsZSB3aXRoIGhvdyB0aGUgaHAgbGlua2VyIG1ha2VzIG9iamVjdHMKLQkgKHNhdmVzIG1lbW9yeSBzcGFjZSkuICAqLwotICAgICAgdG1wID0gZXhlY19oZWFkZXItPmV4ZWNfZHNpemU7Ci0gICAgICB0bXAgPSBTT01fQUxJR04gKHRtcCwgUEFfUEFHRVNJWkUpOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgLT0gKHRtcCAtIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplKTsKLSAgICAgIGlmIChleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSA8IDApCi0JZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgPSAwOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPSB0bXA7Ci0KLSAgICAgIC8qIE5vdyBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gIFRoZSBpZGVhIGlzIHRvIGNhdGNoIGJvZ29ucyBub3cgYW5kCi0JIGluZm9ybSB0aGUgdXNlciwgaW5zdGVhZCBvZiBzaWxlbnRseSBnZW5lcmF0aW5nIGEgYm9ndXMgZmlsZS4gICovCi0gICAgICBzb21fbGVuZ3RoID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNvbV9sZW5ndGg7Ci0gICAgICBpZiAoZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgKyBleGVjX2hlYWRlci0+ZXhlY190c2l6ZSA+IHNvbV9sZW5ndGgKLQkgIHx8IGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlICsgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPiBzb21fbGVuZ3RoKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9sb2NhdGlvbiwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBleGVjX2hlYWRlciwgQVVYX0hEUl9TSVpFLCAxLCBhYmZkKQotCSAgIT0gQVVYX0hEUl9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGNoZWNrc3VtIGZvciBhIFNPTSBmaWxlIGhlYWRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIGNoZWNrc3VtLCBjb3VudCwgaTsKLSAgdW5zaWduZWQgbG9uZyAqYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcgKikgb2JqX3NvbV9maWxlX2hkciAoYWJmZCk7Ci0KLSAgY2hlY2tzdW0gPSAwOwotICBjb3VudCA9IHNpemVvZiAoc3RydWN0IGhlYWRlcikgLyBzaXplb2YgKHVuc2lnbmVkIGxvbmcpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICBjaGVja3N1bSBePSAqKGJ1ZmZlciArIGkpOwotCi0gIHJldHVybiBjaGVja3N1bTsKLX0KLQotc3RhdGljIHZvaWQKLXNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGFiZmQsIHN5bSwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyAqaW5mbzsKLXsKLSAgLyogSW5pdGlhbGl6ZS4gICovCi0gIG1lbXNldCAoaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pKTsKLQotICAvKiBUaGUgSFAgU09NIGxpbmtlciByZXF1aXJlcyBkZXRhaWxlZCB0eXBlIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgIGFsbCBzeW1ib2xzIChpbmNsdWRpbmcgdW5kZWZpbmVkIHN5bWJvbHMhKS4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSB0eXBlIHNwZWNpZmllZCBpbiBhbiBpbXBvcnQvZXhwb3J0IHN0YXRlbWVudCBkb2VzIG5vdAotICAgICBhbHdheXMgbWF0Y2ggd2hhdCB0aGUgbGlua2VyIHdhbnRzLiAgU2V2ZXJlIGJyYWluZGFtYWdlLiAgKi8KLQkgCi0gIC8qIFNlY3Rpb24gc3ltYm9scyB3aWxsIG5vdCBoYXZlIGEgU09NIHN5bWJvbCB0eXBlIGFzc2lnbmVkIHRvCi0gICAgIHRoZW0geWV0LiAgQXNzaWduIGFsbCBzZWN0aW9uIHN5bWJvbHMgdHlwZSBTVF9EQVRBLiAgKi8KLSAgaWYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICBlbHNlCi0gICAgewotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbXVzdCBoYXZlIHNjb3BlIFNTX1VOU0FUIGFuZCB0eXBlCi0JIFNUX1NUT1JBR0Ugb3IgdGhlIGxpbmtlciB3aWxsIGNob2tlLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JewotCSAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfVU5TQVQ7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1NUT1JBR0U7Ci0JfQotCi0gICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3ltYm9sIHdpdGhvdXQgYW4gYXNzb2NpYXRlZAotCSB0eXBlLiAgVGhpcyBoYXBwZW5zIGlmIHRoZSB1c2VyIGltcG9ydGVkIHRoZSBzeW1ib2wKLQkgd2l0aG91dCBhIHR5cGUgYW5kIHRoZSBzeW1ib2wgd2FzIG5ldmVyIGRlZmluZWQKLQkgbG9jYWxseS4gIElmIEJTRl9GVU5DVElPTiBpcyBzZXQgZm9yIHRoaXMgc3ltYm9sLCB0aGVuCi0JIGFzc2lnbiBpdCB0eXBlIFNUX0NPREUgKHRoZSBIUCBsaW5rZXIgcmVxdWlyZXMgdW5kZWZpbmVkCi0JIGV4dGVybmFsIGZ1bmN0aW9ucyB0byBoYXZlIHR5cGUgU1RfQ09ERSByYXRoZXIgdGhhbiBTVF9FTlRSWSkuICAqLwotICAgICAgZWxzZSBpZiAoKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTgotCQl8fCBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUpCi0JICAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgICAgICAmJiBzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfQ09ERTsKLQotICAgICAgLyogSGFuZGxlIGZ1bmN0aW9uIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4KLQkgVGhleSBzaG91bGQgaGF2ZSB0eXBlIFNUX0VOVFJZLiAgQWxzbyByZXRyaWV2ZSB0aGUgYXJndW1lbnQKLQkgcmVsb2NhdGlvbiBiaXRzIGZyb20gdGhlIFNPTSBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfRU5UUlkKLQkgICAgICAgfHwgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERQotCQkgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikpCi0JICAgICAgIHx8IChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkJICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKSkKLQl7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0VOVFJZOwotCSAgaW5mby0+YXJnX3JlbG9jID0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jOwotCSAgaW5mby0+cHJpdl9sZXZlbD0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbDsKLQl9Ci0KLSAgICAgIC8qIEZvciB1bmtub3duIHN5bWJvbHMgc2V0IHRoZSBzeW1ib2wncyB0eXBlIGJhc2VkIG9uIHRoZSBzeW1ib2wncwotCSBzZWN0aW9uIChTVF9EQVRBIGZvciBEQVRBIHNlY3Rpb25zLCBTVF9DT0RFIGZvciBDT0RFIHNlY3Rpb25zKS4gICovCi0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04pCi0JewotCSAgaWYgKHN5bS0+c2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9DT0RFOwotCSAgZWxzZQotCSAgICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0JfQotICAKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTikKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0KLSAgICAgIC8qIEZyb20gbm93IG9uIGl0J3MgYSB2ZXJ5IHNpbXBsZSBtYXBwaW5nLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9BQlNPTFVURTsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERSkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0NPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0RBVEEpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9NSUxMSUNPREUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9NSUxMSUNPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1BMQUJFTCkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1BMQUJFTDsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfUFJJX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9QUklfUFJPRzsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfU0VDX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9TRUNfUFJPRzsKLSAgICB9Ci0JCi0gIC8qIE5vdyBoYW5kbGUgdGhlIHN5bWJvbCdzIHNjb3BlLiAgRXhwb3J0ZWQgZGF0YSB3aGljaCBpcyBub3QKLSAgICAgaW4gdGhlIGNvbW1vbiBzZWN0aW9uIGhhcyBzY29wZSBTU19VTklWRVJTQUwuICBOb3RlIHNjb3BlCi0gICAgIG9mIGNvbW1vbiBzeW1ib2xzIHdhcyBoYW5kbGVkIGVhcmxpZXIhICAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotICAgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX1VOU0FUOwotICBlbHNlIGlmIChzeW0tPmZsYWdzICYgQlNGX0VYUE9SVCAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19VTklWRVJTQUw7Ci0gIC8qIEFueXRoaW5nIGVsc2Ugd2hpY2ggaXMgbm90IGluIHRoZSBjb21tb24gc2VjdGlvbiBoYXMgc2NvcGUKLSAgICAgU1NfTE9DQUwuICAqLwotICBlbHNlIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19MT0NBTDsKLQotICAvKiBOb3cgc2V0IHRoZSBzeW1ib2xfaW5mbyBmaWVsZC4gIEl0IGhhcyBubyByZWFsIG1lYW5pbmcKLSAgICAgZm9yIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9scywgYnV0IHRoZSBIUCBsaW5rZXIgd2lsbAotICAgICBjaG9rZSBpZiBpdCdzIG5vdCBzZXQgdG8gc29tZSAicmVhc29uYWJsZSIgdmFsdWUuICBXZQotICAgICB1c2UgemVybyBhcyBhIHJlYXNvbmFibGUgdmFsdWUuICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IDA7Ci0gIC8qIEZvciBhbGwgb3RoZXIgc3ltYm9scywgdGhlIHN5bWJvbF9pbmZvIGZpZWxkIGNvbnRhaW5zIHRoZSAKLSAgICAgc3Vic3BhY2UgaW5kZXggb2YgdGhlIHNwYWNlIHRoaXMgc3ltYm9sIGlzIGNvbnRhaW5lZCBpbi4gICovCi0gIGVsc2UKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IHN5bS0+c2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCi0gIC8qIFNldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICAqLwotICBpbmZvLT5zeW1ib2xfdmFsdWUgPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWE7Ci19Ci0KLS8qIEJ1aWxkIGFuZCB3cml0ZSwgaW4gb25lIGJpZyBjaHVuaywgdGhlIGVudGlyZSBzeW1ib2wgdGFibGUgZm9yCi0gICB0aGlzIEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgbnVtX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgZmlsZV9wdHIgc3ltdGFiX2xvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9sb2NhdGlvbjsKLSAgYXN5bWJvbCAqKmJmZF9zeW1zID0gb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCk7Ci0gIHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKnNvbV9zeW10YWIgPSBOVUxMOwotICBpbnQgaSwgc3ltdGFiX3NpemU7Ci0KLSAgLyogQ29tcHV0ZSB0b3RhbCBzeW1ib2wgdGFibGUgc2l6ZSBhbmQgYWxsb2NhdGUgYSBjaHVuayBvZiBtZW1vcnkKLSAgICAgdG8gaG9sZCB0aGUgc3ltYm9sIHRhYmxlIGFzIHdlIGJ1aWxkIGl0LiAgKi8KLSAgc3ltdGFiX3NpemUgPSBudW1fc3ltcyAqIHNpemVvZiAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0gIHNvbV9zeW10YWIgPSAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqKSBiZmRfbWFsbG9jIChzeW10YWJfc2l6ZSk7Ci0gIGlmIChzb21fc3ltdGFiID09IE5VTEwgJiYgc3ltdGFiX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0IChzb21fc3ltdGFiLCAwLCBzeW10YWJfc2l6ZSk7Ci0KLSAgLyogV2FsayBvdmVyIGVhY2ggc3ltYm9sLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1zOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87Ci0KLSAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCBzdHJpbmdzIHRhYmxlLiAgCi0JIEJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlLCB0aGUgaW5kZXggaGFzIGFscmVhZHkgYmVlbiAKLQkgY29tcHV0ZWQgYW5kIHN0b3JlZCBpbnRvIHRoZSBuYW1lIGZpZWxkIGluIHRoZSBCRkQgc3ltYm9sLiAgKi8KLSAgICAgIHNvbV9zeW10YWJbaV0ubmFtZS5uX3N0cnggPSBzb21fc3ltYm9sX2RhdGEoYmZkX3N5bXNbaV0pLT5zdHJpbmd0YWJfb2Zmc2V0OwotCi0gICAgICAvKiBEZXJpdmUgU09NIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBzeW1ib2wuICAqLwotICAgICAgc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyAoYWJmZCwgYmZkX3N5bXNbaV0sICZpbmZvKTsKLQotICAgICAgLyogTm93IHVzZSBpdC4gICovCi0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF90eXBlID0gaW5mby5zeW1ib2xfdHlwZTsKLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3Njb3BlID0gaW5mby5zeW1ib2xfc2NvcGU7Ci0gICAgICBzb21fc3ltdGFiW2ldLmFyZ19yZWxvYyA9IGluZm8uYXJnX3JlbG9jOwotICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfaW5mbyA9IGluZm8uc3ltYm9sX2luZm87Ci0gICAgICBzb21fc3ltdGFiW2ldLnhsZWFzdCA9IDM7Ci0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF92YWx1ZSA9IGluZm8uc3ltYm9sX3ZhbHVlIHwgaW5mby5wcml2X2xldmVsOwotICAgIH0KLQotICAvKiBFdmVyeXRoaW5nIGlzIHJlYWR5LCBzZWVrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBhbmQKLSAgICAgc2NyaWJibGUgb3V0IHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9sb2NhdGlvbiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zeW10YWIsIHN5bXRhYl9zaXplLCAxLCBhYmZkKSAhPSBzeW10YWJfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoc29tX3N5bXRhYiAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9zeW10YWIpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzb21fc3ltdGFiICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX3N5bXRhYik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGluIFNPTSBmb3JtYXQuICAqLyAgCi0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFNldCB1cCBmaXhlZCBwYXJ0cyBvZiB0aGUgZmlsZSwgc3BhY2UsIGFuZCBzdWJzcGFjZSBoZWFkZXJzLgotCSBOb3RpZnkgdGhlIHdvcmxkIHRoYXQgb3V0cHV0IGhhcyBiZWd1bi4gICovCi0gICAgICBzb21fcHJlcF9oZWFkZXJzIChhYmZkKTsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgLyogU3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGluY2x1ZGUgYWxsIHRoZSBzdHJpbmcKLQkgdGFibGVzLCBmaXh1cCBzdHJlYW1zLCBhbmQgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHNvbV9iZWdpbl93cml0aW5nIChhYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzb21fZmluaXNoX3dyaXRpbmcgKGFiZmQpKTsKLX0KLQotDAotLyogUmVhZCBhbmQgc2F2ZSB0aGUgc3RyaW5nIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9zbHVycF9zdHJpbmdfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqc3RyaW5ndGFiOwotCi0gIC8qIFVzZSB0aGUgc2F2ZWQgdmVyc2lvbiBpZiBpdHMgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEkgZG9uJ3QgdGhpbmsgdGhpcyBjYW4gY3VycmVudGx5IGhhcHBlbiwgYW5kIEknbSBub3Qgc3VyZSBpdCBzaG91bGQKLSAgICAgcmVhbGx5IGJlIGFuIGVycm9yLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBnZXR0aW5nIHVucHJlZGljdGFibGUgcmVzdWx0cwotICAgICBmcm9tIHRoZSBob3N0J3MgbWFsbG9jIHdoZW4gcGFzc2VkIGEgc2l6ZSBvZiB6ZXJvLiAgKi8KLSAgaWYgKG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBhbmQgcmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RyaW5ndGFiID0gYmZkX21hbGxvYyAob2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpOwotICBpZiAoc3RyaW5ndGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHN0cmluZ3RhYiwgMCwgb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3NvbV9zdHJfZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaWYgKGJmZF9yZWFkIChzdHJpbmd0YWIsIG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpLCAxLCBhYmZkKQotICAgICAgIT0gb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNhdmUgb3VyIHJlc3VsdHMgYW5kIHJldHVybiBzdWNjZXNzLiAqLwotICBvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCkgPSBzdHJpbmd0YWI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIChpbiBieXRlcykgcmVxdWlyZWQgdG8gaG9sZCB0aGUgc3ltYm9sCi0gICB0YWJsZSBmb3IgdGhpcyBvYmplY3QuICAqLwotCi1zdGF0aWMgbG9uZwotc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci19Ci0KLS8qIENvbnZlcnQgZnJvbSBhIFNPTSBzdWJzcGFjZSBpbmRleCB0byBhIEJGRCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKnN5bWJvbDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogVGhlIG1lYW5pbmcgb2YgdGhlIHN5bWJvbF9pbmZvIGZpZWxkIGNoYW5nZXMgZm9yIGZ1bmN0aW9ucwotICAgICB3aXRoaW4gZXhlY3V0YWJsZXMuICBTbyBvbmx5IHVzZSB0aGUgcXVpY2sgc3ltYm9sX2luZm8gbWFwcGluZyBmb3IKLSAgICAgaW5jb21wbGV0ZSBvYmplY3RzIGFuZCBub24tZnVuY3Rpb24gc3ltYm9scyBpbiBleGVjdXRhYmxlcy4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAKLSAgICAgIHx8IChzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX0VOVFJZCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX1BSSV9QUk9HCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX1NFQ19QUk9HCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX01JTExJQ09ERSkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gc3ltYm9sLT5zeW1ib2xfaW5mbzsKLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCWlmIChzZWN0aW9uLT50YXJnZXRfaW5kZXggPT0gaW5kZXggJiYgc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQkgIHJldHVybiBzZWN0aW9uOwotCi0gICAgICAvKiBDb3VsZCBiZSBhIHN5bWJvbCBmcm9tIGFuIGV4dGVybmFsIGxpYnJhcnkgKHN1Y2ggYXMgYW4gT01PUwotCSBzaGFyZWQgbGlicmFyeSkuICBEb24ndCBhYm9ydC4gICovCi0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IHN5bWJvbC0+c3ltYm9sX3ZhbHVlOwotCi0gICAgICAvKiBGb3IgZXhlY3V0YWJsZXMgd2Ugd2lsbCBoYXZlIHRvIHVzZSB0aGUgc3ltYm9sJ3MgYWRkcmVzcyBhbmQKLQkgZmluZCBvdXQgd2hhdCBzZWN0aW9uIHdvdWxkIGNvbnRhaW4gdGhhdCBhZGRyZXNzLiAgIFl1ay4gICovCi0gICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgaWYgKHZhbHVlID49IHNlY3Rpb24tPnZtYQotCSAgICAgICYmIHZhbHVlIDw9IHNlY3Rpb24tPnZtYSArIHNlY3Rpb24tPl9jb29rZWRfc2l6ZQotCSAgICAgICYmIHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JICAgIHJldHVybiBzZWN0aW9uOwotCX0KLQotICAgICAgLyogQ291bGQgYmUgYSBzeW1ib2wgZnJvbSBhbiBleHRlcm5hbCBsaWJyYXJ5IChzdWNoIGFzIGFuIE9NT1MKLQkgc2hhcmVkIGxpYnJhcnkpLiAgRG9uJ3QgYWJvcnQuICAqLwotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0KLSAgICB9Ci19Ci0KLS8qIFJlYWQgYW5kIHNhdmUgdGhlIHN5bWJvbCB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBpbnQgc3ltc2l6ZSA9IHNpemVvZiAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0gIGNoYXIgKnN0cmluZ3RhYjsKLSAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqYnVmID0gTlVMTCwgKmJ1ZnAsICplbmRidWZwOwotICBzb21fc3ltYm9sX3R5cGUgKnN5bSwgKnN5bWJhc2U7Ci0KLSAgLyogUmV0dXJuIHNhdmVkIHZhbHVlIGlmIGl0IGV4aXN0cy4gICovCi0gIGlmIChvYmpfc29tX3N5bXRhYiAoYWJmZCkgIT0gTlVMTCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIC8qIFNwZWNpYWwgY2FzZS4gIFRoaXMgaXMgKm5vdCogYW4gZXJyb3IuICAqLwotICBpZiAoc3ltYm9sX2NvdW50ID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICBpZiAoIXNvbV9zbHVycF9zdHJpbmdfdGFibGUgKGFiZmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHN0cmluZ3RhYiA9IG9ial9zb21fc3RyaW5ndGFiIChhYmZkKTsKLQotICBzeW1iYXNlID0gKChzb21fc3ltYm9sX3R5cGUgKikKLQkgICAgIGJmZF9tYWxsb2MgKHN5bWJvbF9jb3VudCAqIHNpemVvZiAoc29tX3N5bWJvbF90eXBlKSkpOwotICBpZiAoc3ltYmFzZSA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKHN5bWJhc2UsIDAsIHN5bWJvbF9jb3VudCAqIHNpemVvZiAoc29tX3N5bWJvbF90eXBlKSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgU09NIHJlcHJlc2VudGF0aW9uLiAgKi8KLSAgYnVmID0gYmZkX21hbGxvYyAoc3ltYm9sX2NvdW50ICogc3ltc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCAmJiBzeW1ib2xfY291bnQgKiBzeW1zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3NvbV9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChiZmRfcmVhZCAoYnVmLCBzeW1ib2xfY291bnQgKiBzeW1zaXplLCAxLCBhYmZkKSAKLSAgICAgICE9IHN5bWJvbF9jb3VudCAqIHN5bXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgc3ltYm9scyBhbmQgaW50ZXJuYWxpemUgdGhlbS4gICovCi0gIGVuZGJ1ZnAgPSBidWYgKyBzeW1ib2xfY291bnQ7Ci0gIGZvciAoYnVmcCA9IGJ1Ziwgc3ltID0gc3ltYmFzZTsgYnVmcCA8IGVuZGJ1ZnA7ICsrYnVmcCkKLSAgICB7Ci0KLSAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgd2UgY2FyZSBhYm91dCB0aGVzZS4gICovCi0gICAgICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfU1lNX0VYVAotCSAgfHwgYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfQVJHX0VYVCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2V0IHNvbWUgcHJpdmF0ZSBkYXRhIHdlIGNhcmUgYWJvdXQuICAqLwotICAgICAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX05VTEwpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9BQlNPTFVURSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfQUJTT0xVVEU7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9EQVRBKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfQ09ERSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfQ09ERTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1BSSV9QUk9HKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9QUklfUFJPRzsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1NFQ19QUk9HKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9TRUNfUFJPRzsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0VOVFJZKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9FTlRSWTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX01JTExJQ09ERSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfTUlMTElDT0RFOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfUExBQkVMKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9QTEFCRUw7Ci0gICAgICBlbHNlCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047Ci0gICAgICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MgPSBidWZwLT5hcmdfcmVsb2M7Ci0KLSAgICAgIC8qIFNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cy4gICovCi0gICAgICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgICAgIHN5bS0+c3ltYm9sLm5hbWUgPSBidWZwLT5uYW1lLm5fc3RyeCArIHN0cmluZ3RhYjsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlID0gYnVmcC0+c3ltYm9sX3ZhbHVlOwotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IDA7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyA9IDA7Ci0KLSAgICAgIHN3aXRjaCAoYnVmcC0+c3ltYm9sX3R5cGUpCi0JewotCWNhc2UgU1RfRU5UUlk6Ci0JY2FzZSBTVF9NSUxMSUNPREU6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9wcml2X2xldmVsID0KLQkgICAgc3ltLT5zeW1ib2wudmFsdWUgJiAweDM7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+MHgzOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNUX1NUVUI6Ci0JY2FzZSBTVF9DT0RFOgotCWNhc2UgU1RfUFJJX1BST0c6Ci0JY2FzZSBTVF9TRUNfUFJPRzoKLQkgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWwgPQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAmIDB4MzsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH4weDM7Ci0JICAvKiBJZiB0aGUgc3ltYm9sJ3Mgc2NvcGUgaXMgU1NfVU5TQVQsIHRoZW4gdGhlc2UgYXJlCi0JICAgICB1bmRlZmluZWQgZnVuY3Rpb24gc3ltYm9scy4gICovCi0JICBpZiAoYnVmcC0+c3ltYm9sX3Njb3BlID09IFNTX1VOU0FUKQotCSAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICAgICAKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEhhbmRsZSBzY29waW5nIGFuZCBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoYnVmcC0+c3ltYm9sX3Njb3BlKQotCXsKLQkvKiBzeW1ib2xfaW5mbyBmaWVsZCBpcyB1bmRlZmluZWQgZm9yIFNTX0VYVEVSTkFMIGFuZCBTU19VTlNBVCBzeW1ib2xzLAotCSAgIHNvIHRoZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN5bWJvbCBjYW4ndCBiZSBrbm93bi4gICovCi0JY2FzZSBTU19FWFRFUk5BTDoKLQkgIGlmIChidWZwLT5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSAoQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNTX1VOU0FUOgotCSAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCi0JY2FzZSBTU19VTklWRVJTQUw6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSAoQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUwpOwotCSAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgYnVmcCk7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQotI2lmIDAKLQkvKiBTU19HTE9CQUwgYW5kIFNTX0xPQ0FMIGFyZSB0d28gbmFtZXMgZm9yIHRoZSBzYW1lIHRoaW5nLgotCSAgIFNvdW5kIGR1bWI/ICBJdCBpcy4gICovCi0JY2FzZSBTU19HTE9CQUw6Ci0jZW5kaWYKLQljYXNlIFNTX0xPQ0FMOgotCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0xPQ0FMOwotCSAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgYnVmcCk7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIE1hcmsgc2VjdGlvbiBzeW1ib2xzIGFuZCBzeW1ib2xzIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLgotCSBOb3RlICRTVEFSVCQgaXMgYSBtYWdpYyBjb2RlIHN5bWJvbCwgTk9UIGEgc2VjdGlvbiBzeW1ib2wuICAqLwotICAgICAgaWYgKHN5bS0+c3ltYm9sLm5hbWVbMF0gPT0gJyQnCi0JICAmJiBzeW0tPnN5bWJvbC5uYW1lW3N0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgLSAxXSA9PSAnJCcKLQkgICYmICFzdHJjbXAgKHN5bS0+c3ltYm9sLm5hbWUsIHN5bS0+c3ltYm9sLnNlY3Rpb24tPm5hbWUpKQotCXN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLSAgICAgIGVsc2UgaWYgKCFzdHJuY21wIChzeW0tPnN5bWJvbC5uYW1lLCAiTCQwXDAwMiIsIDQpKQotCXsKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHN5bS0+c3ltYm9sLm5hbWUgPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT5uYW1lOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJuY21wIChzeW0tPnN5bWJvbC5uYW1lLCAiTCQwXDAwMSIsIDQpKQotCXN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgICAgIC8qIE5vdGUgaW5jcmVtZW50IGF0IGJvdHRvbSBvZiBsb29wLCBzaW5jZSB3ZSBza2lwIHNvbWUgc3ltYm9scwotICAgICAgICAgd2UgY2FuIG5vdCBpbmNsdWRlIGl0IGFzIHBhcnQgb2YgdGhlIGZvciBzdGF0ZW1lbnQuICAqLwotICAgICAgc3ltKys7Ci0gICAgfQotCi0gIC8qIFdlIG1vZGlmeSB0aGUgc3ltYm9sIGNvdW50IHRvIHJlY29yZCB0aGUgbnVtYmVyIG9mIEJGRCBzeW1ib2xzIHdlCi0gICAgIGNyZWF0ZWQuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bSAtIHN5bWJhc2U7Ci0KLSAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICAqLwotICBvYmpfc29tX3N5bXRhYiAoYWJmZCkgPSBzeW1iYXNlOwotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuICh0cnVlKTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2Fub25pY2FsaXplIGEgU09NIHN5bWJvbCB0YWJsZS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMKLSAgIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotc29tX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgaW50IGk7Ci0gIHNvbV9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLQotICBpZiAoIXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBpID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHN5bWJhc2UgPSBvYmpfc29tX3N5bXRhYiAoYWJmZCk7Ci0KLSAgZm9yICg7IGkgPiAwOyBpLS0sIGxvY2F0aW9uKyssIHN5bWJhc2UrKykKLSAgICAqbG9jYXRpb24gPSAmc3ltYmFzZS0+c3ltYm9sOwotCi0gIC8qIEZpbmFsIG51bGwgcG9pbnRlci4gICovCi0gICpsb2NhdGlvbiA9IDA7Ci0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotfQotCi0vKiBNYWtlIGEgU09NIHN5bWJvbC4gIFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotc29tX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNvbV9zeW1ib2xfdHlwZSAqbmV3ID0KLSAgKHNvbV9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIFByaW50IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAic29tICIpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHN5bWJvbC0+dmFsdWUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlbHgiLCAobG9uZykgc3ltYm9sLT5mbGFncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZTsKLQlzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPyBzeW1ib2wtPnNlY3Rpb24tPm5hbWUgOiAiKCpub25lKikiOwotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0JZnByaW50ZiAoZmlsZSwgIiAlc1x0JXMiLCBzZWN0aW9uX25hbWUsIHN5bWJvbC0+bmFtZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnJCcpOwotfQotCi0vKiBDb3VudCBvciBwcm9jZXNzIHZhcmlhYmxlLWxlbmd0aCBTT00gZml4dXAgcmVjb3Jkcy4KLQotICAgVG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiB3ZSB1c2UgdGhpcyBjb2RlIGJvdGggdG8gY29tcHV0ZSB0aGUgbnVtYmVyCi0gICBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgYSBzdHJlYW0sIGFuZCB0byBpbnRlcm5hbGl6ZSB0aGUgc3RyZWFtLgotCi0gICBXaGVuIGNvbXB1dGluZyB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHJlcXVlc3RlZCBieSBhIHN0cmVhbSB0aGUKLSAgIHZhcmlhYmxlcyBycHRyLCBzZWN0aW9uLCBhbmQgc3ltYm9scyBoYXZlIG5vIG1lYW5pbmcuCi0KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHJlcXVlc3RlZCBieSB0aGUgZml4dXAgc3RyZWFtLiAgV2hlbgotICAgbm90IGp1c3QgY291bnRpbmcgCi0KLSAgIFRoaXMgbmVlZHMgYXQgbGVhc3QgdHdvIG9yIHRocmVlIG1vcmUgcGFzc2VzIHRvIGdldCBpdCBjbGVhbmVkIHVwLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotc29tX3NldF9yZWxvY19pbmZvIChmaXh1cCwgZW5kLCBpbnRlcm5hbF9yZWxvY3MsIHNlY3Rpb24sIHN5bWJvbHMsIGp1c3RfY291bnQpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmZpeHVwOwotICAgICB1bnNpZ25lZCBpbnQgZW5kOwotICAgICBhcmVsZW50ICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBqdXN0X2NvdW50OwotewotICB1bnNpZ25lZCBpbnQgb3AsIHZhcm5hbWUsIGRlYWxsb2NhdGVfY29udGVudHMgPSAwOwotICB1bnNpZ25lZCBjaGFyICplbmRfZml4dXBzID0gJmZpeHVwW2VuZF07Ci0gIGNvbnN0IHN0cnVjdCBmaXh1cF9mb3JtYXQgKmZwOwotICBjaGFyICpjcDsKLSAgdW5zaWduZWQgY2hhciAqc2F2ZV9maXh1cDsKLSAgaW50IHZhcmlhYmxlc1syNl0sIHN0YWNrWzIwXSwgYywgdiwgY291bnQsIHByZXZfZml4dXAsICpzcCwgc2F2ZWRfdW53aW5kX2JpdHM7Ci0gIGNvbnN0IGludCAqc3Vib3A7Ci0gIGFyZWxlbnQgKnJwdHI9IGludGVybmFsX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0KLSNkZWZpbmUJdmFyKGMpCQl2YXJpYWJsZXNbKGMpIC0gJ0EnXQotI2RlZmluZQlwdXNoKHYpCQkoKnNwKysgPSAodikpCi0jZGVmaW5lCXBvcCgpCQkoKi0tc3ApCi0jZGVmaW5lCWVtcHR5c3RhY2soKQkoc3AgPT0gc3RhY2spCi0KLSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLSAgbWVtc2V0ICh2YXJpYWJsZXMsIDAsIHNpemVvZiAodmFyaWFibGVzKSk7Ci0gIG1lbXNldCAoc3RhY2ssIDAsIHNpemVvZiAoc3RhY2spKTsKLSAgY291bnQgPSAwOwotICBwcmV2X2ZpeHVwID0gMDsKLSAgc2F2ZWRfdW53aW5kX2JpdHMgPSAwOwotICBzcCA9IHN0YWNrOwotCi0gIHdoaWxlIChmaXh1cCA8IGVuZF9maXh1cHMpCi0gICAgewotCi0gICAgICAvKiBTYXZlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgZml4dXAuICBXZSdsbCB1c2UKLQkgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBwdXQgdGhpcyBmaXh1cAotCSBvbiB0aGUgcXVldWUuICAqLwotICAgICAgc2F2ZV9maXh1cCA9IGZpeHVwOwotCi0gICAgICAvKiBHZXQgdGhlIGZpeHVwIGNvZGUgYW5kIGl0cyBhc3NvY2lhdGVkIGZvcm1hdC4gICovCi0gICAgICBvcCA9ICpmaXh1cCsrOwotICAgICAgZnAgPSAmc29tX2ZpeHVwX2Zvcm1hdHNbb3BdOwotCi0gICAgICAvKiBIYW5kbGUgYSByZXF1ZXN0IGZvciBhIHByZXZpb3VzIGZpeHVwLiAgKi8KLSAgICAgIGlmICgqZnAtPmZvcm1hdCA9PSAnUCcpCi0JewotCSAgLyogR2V0IHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJldiBmaXh1cCwgbW92ZQotCSAgICAgdGhlIHJlcGVhdGVkIGZpeHVwIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4gICovCi0JICBmaXh1cCA9IHJlbG9jX3F1ZXVlW2ZwLT5EXS5yZWxvYzsKLQkgIHNvbV9yZWxvY19xdWV1ZV9maXggKHJlbG9jX3F1ZXVlLCBmcC0+RCk7Ci0JICBwcmV2X2ZpeHVwID0gMTsKLQotCSAgLyogR2V0IHRoZSBmaXh1cCBjb2RlIGFuZCBpdHMgYXNzb2NpYXRlZCBmb3JtYXQuICAqLwotCSAgb3AgPSAqZml4dXArKzsKLQkgIGZwID0gJnNvbV9maXh1cF9mb3JtYXRzW29wXTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgZml4dXAgd2lsbCBiZSBwYXNzZWQgdG8gQkZELCBzZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgICAgIGlmICghIGp1c3RfY291bnQKLQkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfTk9fUkVMT0NBVElPTgotCSAgJiYgc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgIT0gUl9EQVRBX09WRVJSSURFKQotCXsKLQkgIHJwdHItPmFkZHJlc3MgPSBvZmZzZXQ7Ci0JICBycHRyLT5ob3d0byA9ICZzb21faHBwYV9ob3d0b190YWJsZVtvcF07Ci0JICBycHRyLT5hZGRlbmQgPSAwOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIC8qIFNldCBkZWZhdWx0IGlucHV0IGxlbmd0aCB0byAwLiAgR2V0IHRoZSBvcGNvZGUgY2xhc3MgaW5kZXgKLQkgaW50byBELiAgKi8KLSAgICAgIHZhciAoJ0wnKSA9IDA7Ci0gICAgICB2YXIgKCdEJykgPSBmcC0+RDsKLSAgICAgIHZhciAoJ1UnKSA9IHNhdmVkX3Vud2luZF9iaXRzOwotCi0gICAgICAvKiBHZXQgdGhlIG9wY29kZSBmb3JtYXQuICAqLwotICAgICAgY3AgPSBmcC0+Zm9ybWF0OwotCi0gICAgICAvKiBQcm9jZXNzIHRoZSBmb3JtYXQgc3RyaW5nLiAgUGFyc2luZyBoYXBwZW5zIGluIHR3byBwaGFzZXMsCi0JIHBhcnNlIFJIUywgdGhlbiBhc3NpZ24gdG8gTEhTLiAgUmVwZWF0IHVudGlsIG5vIG1vcmUgCi0JIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICAqLwotICAgICAgd2hpbGUgKCpjcCkKLQl7Ci0JICAvKiBUaGUgdmFyaWFibGUgdGhpcyBwYXNzIGlzIGdvaW5nIHRvIGNvbXB1dGUgYSB2YWx1ZSBmb3IuICAqLwotCSAgdmFybmFtZSA9ICpjcCsrOwotCi0JICAvKiBTdGFydCBwcm9jZXNzaW5nIFJIUy4gIENvbnRpbnVlIHVudGlsIGEgTlVMTCBvciAnPScgaXMgZm91bmQuICAqLwotCSAgZG8KLQkgICAgewotCSAgICAgIGMgPSAqY3ArKzsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSB2YXJpYWJsZSwgcHVzaCBpdCBvbiB0aGUgc3RhY2suICAqLwotCSAgICAgIGlmIChpc3VwcGVyIChjKSkKLQkJcHVzaCAodmFyIChjKSk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgbG93ZXIgY2FzZSBsZXR0ZXIsIHRoZW4gaXQgcmVwcmVzZW50cwotCQkgYWRkaXRpb25hbCBkYXRhIGZyb20gdGhlIGZpeHVwIHN0cmVhbSB0byBiZSBwdXNoZWQgb250bwotCQkgdGhlIHN0YWNrLiAgKi8KLQkgICAgICBlbHNlIGlmIChpc2xvd2VyIChjKSkKLQkJewotCQkgIGludCBiaXRzID0gKGMgLSAnYScpICogODsKLQkJICBmb3IgKHYgPSAwOyBjID4gJ2EnOyAtLWMpCi0JCSAgICB2ID0gKHYgPDwgOCkgfCAqZml4dXArKzsKLQkJICBpZiAodmFybmFtZSA9PSAnVicpCi0JCSAgICB2ID0gc2lnbl9leHRlbmQgKHYsIGJpdHMpOwotCQkgIHB1c2ggKHYpOwotCQl9Ci0KLQkgICAgICAvKiBBIGRlY2ltYWwgY29uc3RhbnQuICBQdXNoIGl0IG9uIHRoZSBzdGFjay4gICovCi0JICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoYykpCi0JCXsKLQkJICB2ID0gYyAtICcwJzsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKmNwKSkKLQkJICAgIHYgPSAodiAqIDEwKSArICgqY3ArKyAtICcwJyk7Ci0JCSAgcHVzaCAodik7Ci0JCX0KLQkgICAgICBlbHNlCi0KLQkJLyogQW4gb3BlcmF0b3IuICBQb3AgdHdvIHR3byB2YWx1ZXMgZnJvbSB0aGUgc3RhY2sgYW5kCi0JCSAgIHVzZSB0aGVtIGFzIG9wZXJhbmRzIHRvIHRoZSBnaXZlbiBvcGVyYXRpb24uICBQdXNoCi0JCSAgIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBiYWNrIG9uIHRoZSBzdGFjay4gICovCi0JCXN3aXRjaCAoYykKLQkJICB7Ci0JCSAgY2FzZSAnKyc6Ci0JCSAgICB2ID0gcG9wICgpOwotCQkgICAgdiArPSBwb3AgKCk7Ci0JCSAgICBwdXNoICh2KTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJyonOgotCQkgICAgdiA9IHBvcCAoKTsKLQkJICAgIHYgKj0gcG9wICgpOwotCQkgICAgcHVzaCAodik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICc8JzoKLQkJICAgIHYgPSBwb3AgKCk7Ci0JCSAgICB2ID0gcG9wICgpIDw8IHY7Ci0JCSAgICBwdXNoICh2KTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgIH0KLQkgIHdoaWxlICgqY3AgJiYgKmNwICE9ICc9Jyk7Ci0KLQkgIC8qIE1vdmUgb3ZlciB0aGUgZXF1YWwgb3BlcmF0b3IuICAqLwotCSAgY3ArKzsKLQotCSAgLyogUG9wIHRoZSBSSFMgb2ZmIHRoZSBzdGFjay4gICovCi0JICBjID0gcG9wICgpOwotCi0JICAvKiBQZXJmb3JtIHRoZSBhc3NpZ25tZW50LiAgKi8KLQkgIHZhciAodmFybmFtZSkgPSBjOwotCi0JICAvKiBIYW5kbGUgc2lkZSBlZmZlY3RzLiBhbmQgc3BlY2lhbCAnTycgc3RhY2sgY2FzZXMuICAqLwotCSAgc3dpdGNoICh2YXJuYW1lKQotCSAgICB7Ci0JICAgIC8qIENvbnN1bWUgc29tZSBieXRlcyBmcm9tIHRoZSBpbnB1dCBzcGFjZS4gICovCi0JICAgIGNhc2UgJ0wnOgotCSAgICAgIG9mZnNldCArPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICAvKiBBIHN5bWJvbCB0byB1c2UgaW4gdGhlIHJlbG9jYXRpb24uICBNYWtlIGEgbm90ZQotCSAgICAgICBvZiB0aGlzIGlmIHdlIGFyZSBub3QganVzdCBjb3VudGluZy4gICovCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIGlmICghIGp1c3RfY291bnQpCi0JCXJwdHItPnN5bV9wdHJfcHRyID0gJnN5bWJvbHNbY107Ci0JICAgICAgYnJlYWs7Ci0JICAgIC8qIEFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBmb3IgYSBmdW5jdGlvbiBjYWxsLiAgKi8KLQkgICAgY2FzZSAnUic6Ci0JICAgICAgaWYgKCEganVzdF9jb3VudCkKLQkJewotCQkgIHVuc2lnbmVkIGludCB0bXAgPSB2YXIgKCdSJyk7Ci0JCSAgcnB0ci0+YWRkZW5kID0gMDsKLQotCQkgIGlmICgoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9QQ1JFTF9DQUxMCi0JCSAgICAgICAmJiBSX1BDUkVMX0NBTEwgKyAxMCA+IG9wKQotCQkgICAgICB8fCAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9BQlNfQ0FMTAotCQkJICAmJiBSX0FCU19DQUxMICsgMTAgPiBvcCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFNpbXBsZSBlbmNvZGluZy4gICovCi0JCSAgICAgIGlmICh0bXAgPiA0KQotCQkJewotCQkJICB0bXAgLT0gNTsKLQkJCSAgcnB0ci0+YWRkZW5kIHw9IDE7Ci0JCQl9Ci0JCSAgICAgIGlmICh0bXAgPT0gNCkKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDI7Ci0JCSAgICAgIGVsc2UgaWYgKHRtcCA9PSAzKQotCQkJcnB0ci0+YWRkZW5kIHw9IDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNDsKLQkJICAgICAgZWxzZSBpZiAodG1wID09IDIpCi0JCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4IHwgMSA8PCA2OwotCQkgICAgICBlbHNlIGlmICh0bXAgPT0gMSkKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDg7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgdG1wMSwgdG1wMjsKLQotCQkgICAgICAvKiBGaXJzdCBwYXJ0IGlzIGVhc3kgLS0gbG93IG9yZGVyIHR3byBiaXRzIGFyZQotCQkJIGRpcmVjdGx5IGNvcGllZCwgdGhlbiBzaGlmdGVkIGF3YXkuICAqLwotCQkgICAgICBycHRyLT5hZGRlbmQgPSB0bXAgJiAweDM7Ci0JCSAgICAgIHRtcCA+Pj0gMjsKLQotCQkgICAgICAvKiBEaXZpbmcgdGhlIHJlc3VsdCBieSAxMCBnaXZlcyB1cyB0aGUgc2Vjb25kCi0JCQkgcGFydC4gIElmIGl0IGlzIDksIHRoZW4gdGhlIGZpcnN0IHR3byB3b3JkcwotCQkJIGFyZSBhIGRvdWJsZSBwcmVjaXNpb24gcGFyYW1hdGVyLCBlbHNlIGl0IGlzCi0JCQkgMyAqIHRoZSBmaXJzdCBhcmcgYml0cyArIHRoZSAybmQgYXJnIGJpdHMuICAqLwotCQkgICAgICB0bXAxID0gdG1wIC8gMTA7Ci0JCSAgICAgIHRtcCAtPSB0bXAxICogMTA7Ci0JCSAgICAgIGlmICh0bXAxID09IDkpCi0JCQlycHRyLT5hZGRlbmQgKz0gKDB4ZSA8PCA2KTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBHZXQgdGhlIHR3byBwaWVjZXMuICAqLwotCQkJICB0bXAyID0gdG1wMSAvIDM7Ci0JCQkgIHRtcDEgLT0gdG1wMiAqIDM7Ci0JCQkgIC8qIFB1dCB0aGVtIGluIHRoZSBhZGRlbmQuICAqLwotCQkJICBycHRyLT5hZGRlbmQgKz0gKHRtcDIgPDwgOCkgKyAodG1wMSA8PCA2KTsKLQkJCX0KLQotCQkgICAgICAvKiBXaGF0J3MgbGVmdCBpcyB0aGUgdGhpcmQgcGFydC4gIEl0J3MgdW5wYWNrZWQKLQkJCSBqdXN0IGxpa2UgdGhlIHNlY29uZC4gICovCi0JCSAgICAgIGlmICh0bXAgPT0gOSkKLQkJCXJwdHItPmFkZGVuZCArPSAoMHhlIDw8IDIpOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHRtcDIgPSB0bXAgLyAzOwotCQkJICB0bXAgLT0gdG1wMiAqIDM7Ci0JCQkgIHJwdHItPmFkZGVuZCArPSAodG1wMiA8PCA0KSArICh0bXAgPDwgMik7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgcnB0ci0+YWRkZW5kID0gSFBQQV9SX0FEREVORCAocnB0ci0+YWRkZW5kLCAwKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICAvKiBIYW5kbGUgdGhlIGxpbmtlciBleHByZXNzaW9uIHN0YWNrLiAgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgICAgc3dpdGNoIChvcCkKLQkJewotCQljYXNlIFJfQ09NUDE6Ci0JCSAgc3Vib3AgPSBjb21wMV9vcGNvZGVzOwotCQkgIGJyZWFrOwotCQljYXNlIFJfQ09NUDI6Ci0JCSAgc3Vib3AgPSBjb21wMl9vcGNvZGVzOwotCQkgIGJyZWFrOwotCQljYXNlIFJfQ09NUDM6Ci0JCSAgc3Vib3AgPSBjb21wM19vcGNvZGVzOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgd2hpbGUgKCpzdWJvcCA8PSAodW5zaWduZWQgY2hhcikgYykKLQkJKytzdWJvcDsKLQkgICAgICAtLXN1Ym9wOwotCSAgICAgIGJyZWFrOwotCSAgICAvKiBUaGUgbG93ZXIgMzJ1bndpbmQgYml0cyBtdXN0IGJlIHBlcnNpc3RlbnQuICAqLwotCSAgICBjYXNlICdVJzoKLQkgICAgICBzYXZlZF91bndpbmRfYml0cyA9IHZhciAoJ1UnKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSB1c2VkIGEgcHJldmlvdXMgZml4dXAsIGNsZWFuIHVwIGFmdGVyIGl0LiAgKi8KLSAgICAgIGlmIChwcmV2X2ZpeHVwKQotCXsKLQkgIGZpeHVwID0gc2F2ZV9maXh1cCArIDE7Ci0JICBwcmV2X2ZpeHVwID0gMDsKLQl9Ci0gICAgICAvKiBRdWV1ZSBpdC4gICovCi0gICAgICBlbHNlIGlmIChmaXh1cCA+IHNhdmVfZml4dXAgKyAxKQotCXNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgKHNhdmVfZml4dXAsIGZpeHVwIC0gc2F2ZV9maXh1cCwgcmVsb2NfcXVldWUpOwotCi0gICAgICAvKiBXZSBkbyBub3QgcGFzcyBSX0RBVEFfT1ZFUlJJREUgb3IgUl9OT19SRUxPQ0FUSU9OIAotCSBmaXh1cHMgdG8gQkZELiAgKi8KLSAgICAgIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX0RBVEFfT1ZFUlJJREUKLQkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfTk9fUkVMT0NBVElPTikKLQl7Ci0JICAvKiBEb25lIHdpdGggYSBzaW5nbGUgcmVsb2N0aW9uLiBMb29wIGJhY2sgdG8gdGhlIHRvcC4gICovCi0JICBpZiAoISBqdXN0X2NvdW50KQotCSAgICB7Ci0JICAgICAgaWYgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfRU5UUlkpCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1QnKTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0VYSVQpCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1UnKTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX1BDUkVMX0NBTEwKLQkJICAgICAgIHx8IHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfQUJTX0NBTEwpCi0JCTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0RBVEFfT05FX1NZTUJPTCkKLQkJewotCQkgIHVuc2lnbmVkIGFkZGVuZCA9IHZhciAoJ1YnKTsKLQotCQkgIC8qIFRyeSB3aGF0IHdhcyBzcGVjaWZpZWQgaW4gUl9EQVRBX09WRVJSSURFIGZpcnN0Ci0JCSAgICAgKGlmIGFueXRoaW5nKS4gIFRoZW4gdGhlIGhhcmQgd2F5IHVzaW5nIHRoZQotCQkgICAgIHNlY3Rpb24gY29udGVudHMuICAqLwotCQkgIHJwdHItPmFkZGVuZCA9IHZhciAoJ1YnKTsKLQotCQkgIGlmIChycHRyLT5hZGRlbmQgPT0gMCAmJiAhc2VjdGlvbi0+Y29udGVudHMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEdvdCB0byByZWFkIHRoZSBkYW1uIGNvbnRlbnRzIGZpcnN0LiAgV2UgZG9uJ3QKLQkJICAgICAgICAgYm90aGVyIHNhdmluZyB0aGUgY29udGVudHMgKHlldCkuICBBZGQgaXQgb25lCi0JCQkgZGF5IGlmIHRoZSBuZWVkIGFyaXNlcy4gICovCi0JCSAgICAgIHNlY3Rpb24tPmNvbnRlbnRzID0gYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJICAgICAgZGVhbGxvY2F0ZV9jb250ZW50cyA9IDE7Ci0JCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoc2VjdGlvbi0+b3duZXIsCi0JCQkJCQlzZWN0aW9uLAotCQkJCQkJc2VjdGlvbi0+Y29udGVudHMsCi0JCQkJCQkwLAotCQkJCQkJc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChycHRyLT5hZGRlbmQgPT0gMCkKLQkJICAgIHJwdHItPmFkZGVuZCA9IGJmZF9nZXRfMzIgKHNlY3Rpb24tPm93bmVyLAotCQkJCQkgICAgICAgKHNlY3Rpb24tPmNvbnRlbnRzCi0JCQkJCQkrIG9mZnNldCAtIHZhciAoJ0wnKSkpOwotCQkJCi0JCX0KLQkgICAgICBlbHNlCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1YnKTsKLQkgICAgICBycHRyKys7Ci0JICAgIH0KLQkgIGNvdW50Kys7Ci0JICAvKiBOb3cgdGhhdCB3ZSd2ZSBoYW5kbGVkIGEgImZ1bGwiIHJlbG9jYXRpb24sIHJlc2V0Ci0JICAgICBzb21lIHN0YXRlLiAgKi8KLQkgIG1lbXNldCAodmFyaWFibGVzLCAwLCBzaXplb2YgKHZhcmlhYmxlcykpOwotCSAgbWVtc2V0IChzdGFjaywgMCwgc2l6ZW9mIChzdGFjaykpOwotCX0KLSAgICB9Ci0gIGlmIChkZWFsbG9jYXRlX2NvbnRlbnRzKQotICAgIGZyZWUgKHNlY3Rpb24tPmNvbnRlbnRzKTsKLQotICByZXR1cm4gY291bnQ7Ci0KLSN1bmRlZiB2YXIKLSN1bmRlZiBwdXNoCi0jdW5kZWYgcG9wCi0jdW5kZWYgZW1wdHlzdGFjawotfQotCi0vKiBSZWFkIGluIHRoZSByZWxvY3MgKGFrYSBmaXh1cHMgaW4gU09NIHRlcm1zKSBmb3IgYSBzZWN0aW9uLiAKLQotICAgc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCBjYWxscyB0aGlzIHJvdXRpbmUgd2l0aCBKVVNUX0NPVU5UIAotICAgc2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgaXQgb25seSBuZWVkcyBhIGNvdW50IG9mIHRoZSBudW1iZXIKLSAgIG9mIGFjdHVhbCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIGp1c3RfY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGp1c3RfY291bnQ7Ci17Ci0gIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IGZpeHVwX3N0cmVhbV9zaXplOwotICBhcmVsZW50ICppbnRlcm5hbF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBudW1fcmVsb2NzOwotCi0gIGZpeHVwX3N0cmVhbV9zaXplID0gc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3NpemU7Ci0gIC8qIElmIHRoZXJlIHdlcmUgbm8gcmVsb2NhdGlvbnMsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4gICovCi0gIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHJlbG9jX2NvdW50IGlzIC0xLCB0aGVuIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBoYXMgbm90IGJlZW4gCi0gICAgIHBhcnNlZC4gIFdlIG11c3QgZG8gc28gbm93IHRvIGtub3cgaG93IG1hbnkgcmVsb2NhdGlvbnMgZXhpc3QuICAqLwotICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gLTEpCi0gICAgewotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoZml4dXBfc3RyZWFtX3NpemUpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIGZvcm1zLiAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgb2JqX3NvbV9yZWxvY19maWxlcG9zIChhYmZkKSArIHNlY3Rpb24tPnJlbF9maWxlcG9zLAotCQkgICAgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBmaXh1cF9zdHJlYW1fc2l6ZSwgYWJmZCkKLQkgICE9IGZpeHVwX3N0cmVhbV9zaXplKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogTGV0IGNhbGxlcnMga25vdyBob3cgbWFueSByZWxvY2F0aW9ucyBmb3VuZC4KLQkgYWxzbyBzYXZlIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBhcyB3ZSB3aWxsCi0JIG5lZWQgaXQgYWdhaW4uICAqLwotICAgICAgc2VjdGlvbi0+cmVsb2NfY291bnQgPSBzb21fc2V0X3JlbG9jX2luZm8gKGV4dGVybmFsX3JlbG9jcywKLQkJCQkJCSBmaXh1cF9zdHJlYW1fc2l6ZSwKLQkJCQkJCSBOVUxMLCBOVUxMLCBOVUxMLCB0cnVlKTsKLQotICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3N0cmVhbSA9IGV4dGVybmFsX3JlbG9jczsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGNhbGxlciBvbmx5IHdhbnRlZCBhIGNvdW50LCB0aGVuIHJldHVybiBub3cuICAqLwotICBpZiAoanVzdF9jb3VudCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBudW1fcmVsb2NzID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGV4dGVybmFsX3JlbG9jcyA9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zdHJlYW07Ci0gIC8qIFJldHVybiBzYXZlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVsb2NhdGlvbnMgaWYgaXQgaXMgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnRlcm5hbF9yZWxvY3MgPSAoYXJlbGVudCAqKSAKLSAgICBiZmRfemFsbG9jIChhYmZkLCAobnVtX3JlbG9jcyAqIHNpemVvZiAoYXJlbGVudCkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSAoYXJlbGVudCAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQcm9jZXNzIGFuZCBpbnRlcm5hbGl6ZSB0aGUgcmVsb2NhdGlvbnMuICAqLwotICBzb21fc2V0X3JlbG9jX2luZm8gKGV4dGVybmFsX3JlbG9jcywgZml4dXBfc3RyZWFtX3NpemUsCi0JCSAgICAgIGludGVybmFsX3JlbG9jcywgc2VjdGlvbiwgc3ltYm9scywgZmFsc2UpOwotCi0gIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgZXh0ZXJuYWwgcmVsb2NhdGlvbnMuICBGcmVlIHRoZW0uICAqLwotICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2Nfc3RyZWFtID0gTlVMTDsKLQotICAvKiBTYXZlIG91ciByZXN1bHRzIGFuZCByZXR1cm4gc3VjY2Vzcy4gICovCi0gIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSByZWxvY2F0aW9uCi0gICBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNlY3Rpb24uICAqLyAKLQotc3RhdGljIGxvbmcKLXNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIC8qIElmIHNlY3Rpb24gaGFzIHJlbG9jYXRpb25zLCB0aGVuIHJlYWQgaW4gdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0gICAgIGFuZCBwYXJzZSBpdCB0byBkZXRlcm1pbmUgaG93IG1hbnkgcmVsb2NhdGlvbnMgZXhpc3QuICAqLwotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKQotICAgIHsKLSAgICAgIGlmICghIHNvbV9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIE5VTEwsIHRydWUpKQotCXJldHVybiAtMTsKLSAgICAgIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci0gICAgfQotICAvKiBUaGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMuICAqLwotICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydCByZWxvY2F0aW9ucyBmcm9tIFNPTSAoZXh0ZXJuYWwpIGZvcm0gaW50byBCRkQgaW50ZXJuYWwKLSAgIGZvcm0uICBSZXR1cm4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBsb25nCi1zb21fY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyOwotICBpbnQgY291bnQ7Ci0KLSAgaWYgKHNvbV9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgZmFsc2UpID09IGZhbHNlKQotICAgIHJldHVybiAtMTsKLQotICBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gIHdoaWxlIChjb3VudC0tKQotICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0gICpyZWxwdHIgPSAoYXJlbGVudCAqKSBOVUxMOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNvbV92ZWM7Ci0KLS8qIEEgaG9vayB0byBzZXQgdXAgb2JqZWN0IGZpbGUgZGVwZW5kZW50IHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIG5ld3NlY3QtPnVzZWRfYnlfYmZkID0KLSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotICBpZiAoIW5ld3NlY3QtPnVzZWRfYnlfYmZkKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMzsKLQotICAvKiBXZSBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgc2VjdGlvbnMgaW50ZXJuYWxseSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBhbnkgcHJpdmF0ZSBpbmZvIHdlIHVuZGVyc3RhbmQgZnJvbSB0aGUgaW5wdXQgc3ltYm9sCi0gICB0byB0aGUgb3V0cHV0IHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkKLSAgICAgYmZkICppYmZkOwotICAgICBhc3ltYm9sICppc3ltYm9sOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKm9zeW1ib2w7Ci17Ci0gIHN0cnVjdCBzb21fc3ltYm9sICppbnB1dF9zeW1ib2wgPSAoc3RydWN0IHNvbV9zeW1ib2wgKikgaXN5bWJvbDsKLSAgc3RydWN0IHNvbV9zeW1ib2wgKm91dHB1dF9zeW1ib2wgPSAoc3RydWN0IHNvbV9zeW1ib2wgKikgb3N5bWJvbDsKLQotICAvKiBPbmUgZGF5IHdlIG1heSB0cnkgdG8gZ3JvayBvdGhlciBwcml2YXRlIGRhdGEuICAqLwotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBvbmx5IHByaXZhdGUgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBjb3B5IGlzIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0gICAgIGJpdHMuICAqLwotICBvdXRwdXRfc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jID0KLSAgICBpbnB1dF9zeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2M7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IHNlY3Rpb24KLSAgIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWN0aW9uOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjdGlvbjsKLXsKLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCAoIXNvbV9pc19zcGFjZSAoaXNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKGlzZWN0aW9uKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEKLSAgICA9IChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKLSAgICAgIGJmZF96YWxsb2MgKG9iZmQsIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtZW1jcHkgKHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLAotCSAgc29tX3NlY3Rpb25fZGF0YSAoaXNlY3Rpb24pLT5jb3B5X2RhdGEsCi0JICBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotCi0gIC8qIFJlcGFyZW50IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyKQotICAgIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgPQotICAgICAgc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IGJmZAotICAgdG8gdGhlIG91dHB1dCBiZmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSB0byBob2xkIHRoZSBkYXRhIHdlIG5lZWQuICAqLwotICBvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCkgPSAoc3RydWN0IHNvbV9leGVjX2RhdGEgKikKLSAgICBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19kYXRhKSk7Ci0gIGlmIChvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IGNvcHkgdGhlIGRhdGEuICAqLwotICBtZW1jcHkgKG9ial9zb21fZXhlY19kYXRhIChvYmZkKSwgb2JqX3NvbV9leGVjX2RhdGEgKGliZmQpLAotCSAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgYmFja2VuZCBpbmZvIGZvciBzZWN0aW9ucyB3aGljaCBjYW4gbm90IGJlIGRlc2NyaWJlZAotICAgaW4gdGhlIEJGRCBkYXRhIHN0cnVjdHVyZXMuICAqLwotCi1ib29sZWFuCi1iZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNlY3Rpb24sIGRlZmluZWQsIHByaXZhdGUsIHNvcnRfa2V5LCBzcG51bSkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGludCBkZWZpbmVkOwotICAgICBpbnQgcHJpdmF0ZTsKLSAgICAgdW5zaWduZWQgaW50IHNvcnRfa2V5OwotICAgICBpbnQgc3BudW07Ci17Ci0gIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBtYWdpYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YQotCT0gKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgYmZkX3phbGxvYyAoc2VjdGlvbi0+b3duZXIsCi0JCSAgICAgIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gICAgICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5ID0gc29ydF9rZXk7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX2RlZmluZWQgPSBkZWZpbmVkOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19wcml2YXRlID0gcHJpdmF0ZTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0gc2VjdGlvbjsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c3BhY2VfbnVtYmVyID0gc3BudW07Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgYmFja2VuZCBpbmZvIGZvciBzdWJzZWN0aW9ucyB3aGljaCBjYW4gbm90IGJlIGRlc2NyaWJlZCAKLSAgIGluIHRoZSBCRkQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLQotYm9vbGVhbgotYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWN0aW9uLCBjb250YWluZXIsIGFjY2VzcywKLQkJCQkgICBzb3J0X2tleSwgcXVhZHJhbnQpCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc2VjdGlvbiAqY29udGFpbmVyOwotICAgICBpbnQgYWNjZXNzOwotICAgICB1bnNpZ25lZCBpbnQgc29ydF9rZXk7Ci0gICAgIGludCBxdWFkcmFudDsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG1hZ2ljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhCi0JPSAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0ICopCi0JICBiZmRfemFsbG9jIChzZWN0aW9uLT5vd25lciwKLQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLSAgICAgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c29ydF9rZXkgPSBzb3J0X2tleTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+YWNjZXNzX2NvbnRyb2xfYml0cyA9IGFjY2VzczsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+cXVhZHJhbnQgPSBxdWFkcmFudDsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0gY29udGFpbmVyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBmdWxsIFNPTSBzeW1ib2wgdHlwZS4gIFNPTSBuZWVkcyBmYXIgbW9yZSBzeW1ib2wgaW5mb3JtYXRpb24KLSAgIHRoYW4gYW55IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdCBJJ20gYXdhcmUgb2YuICBJdCBpcyBtYW5kYXRvcnkKLSAgIHRvIGJlIGFibGUgdG8ga25vdyBpZiBhIHN5bWJvbCBpcyBhbiBlbnRyeSBwb2ludCwgbWlsbGljb2RlLCBkYXRhLAotICAgY29kZSwgYWJzb2x1dGUsIHN0b3JhZ2UgcmVxdWVzdCwgb3IgcHJvY2VkdXJlIGxhYmVsLiAgSWYgeW91IGdldAotICAgdGhlIHN5bWJvbCB0eXBlIHdyb25nIHlvdXIgcHJvZ3JhbSB3aWxsIG5vdCBsaW5rLiAgKi8KLQotdm9pZAotYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUgKHN5bWJvbCwgdHlwZSkKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLXsKLSAgc29tX3N5bWJvbF9kYXRhIChzeW1ib2wpLT5zb21fdHlwZSA9IHR5cGU7Ci19Ci0KLS8qIEF0dGFjaCBhbiBhdXhpbGlhcnkgaGVhZGVyIHRvIHRoZSBCRkQgYmFja2VuZCBzbyB0aGF0IGl0IG1heSBiZQotICAgd3JpdHRlbiBpbnRvIHRoZSBvYmplY3QgZmlsZS4gICovCi1ib29sZWFuCi1iZmRfc29tX2F0dGFjaF9hdXhfaGRyIChhYmZkLCB0eXBlLCBzdHJpbmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHR5cGUgPT0gVkVSU0lPTl9BVVhfSUQpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgICAgIGludCBwYWQgPSAwOwotCi0gICAgICBpZiAobGVuICUgNCkKLQlwYWQgPSAoNCAtIChsZW4gJSA0KSk7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKSA9IChzdHJ1Y3QgdXNlcl9zdHJpbmdfYXV4X2hkciAqKQotCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGF1eF9pZCkKLQkJCSAgICAgICsgc2l6ZW9mICh1bnNpZ25lZCBpbnQpICsgbGVuICsgcGFkKTsKLSAgICAgIGlmICghb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC50eXBlID0gVkVSU0lPTl9BVVhfSUQ7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCA9IGxlbiArIHBhZDsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoICs9IHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5zdHJpbmdfbGVuZ3RoID0gbGVuOwotICAgICAgc3RybmNweSAob2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnVzZXJfc3RyaW5nLCBzdHJpbmcsIGxlbik7Ci0gICAgfQotICBlbHNlIGlmICh0eXBlID09IENPUFlSSUdIVF9BVVhfSUQpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgICAgIGludCBwYWQgPSAwOwotCi0gICAgICBpZiAobGVuICUgNCkKLQlwYWQgPSAoNCAtIChsZW4gJSA0KSk7Ci0gICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpID0gKHN0cnVjdCBjb3B5cmlnaHRfYXV4X2hkciAqKQotCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGF1eF9pZCkKLQkJCSAgICArIHNpemVvZiAodW5zaWduZWQgaW50KSArIGxlbiArIHBhZCk7Ci0gICAgICBpZiAoIW9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLnR5cGUgPSBDT1BZUklHSFRfQVVYX0lEOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCA9IGxlbiArIHBhZDsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggKz0gc2l6ZW9mIChpbnQpOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+c3RyaW5nX2xlbmd0aCA9IGxlbjsKLSAgICAgIHN0cmNweSAob2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+Y29weXJpZ2h0LCBzdHJpbmcpOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEF0dGFjaCBhbiBjb21waWxhdGlvbiB1bml0IGhlYWRlciB0byB0aGUgQkZEIGJhY2tlbmQgc28gdGhhdCBpdCBtYXkgYmUKLSAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1ib29sZWFuCi1iZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0IChhYmZkLCBuYW1lLCBsYW5ndWFnZV9uYW1lLCBwcm9kdWN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9pZCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZV9uYW1lOwotICAgICBjb25zdCBjaGFyICpwcm9kdWN0X2lkOwotICAgICBjb25zdCBjaGFyICp2ZXJzaW9uX2lkOwotewotICBDT01QVU5JVCAqbiA9IChDT01QVU5JVCAqKSBiZmRfemFsbG9jIChhYmZkLCBDT01QVU5JVFNaKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNkZWZpbmUgU1RSRFVQKGYpIFwKLSAgaWYgKGYgIT0gTlVMTCkgXAotICAgIHsgXAotICAgICAgbi0+Zi5uX25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoZikgKyAxKTsgXAotICAgICAgaWYgKG4tPmYubl9uYW1lID09IE5VTEwpIFwKLQlyZXR1cm4gZmFsc2U7IFwKLSAgICAgIHN0cmNweSAobi0+Zi5uX25hbWUsIGYpOyBcCi0gICAgfQotCi0gIFNUUkRVUCAobmFtZSk7Ci0gIFNUUkRVUCAobGFuZ3VhZ2VfbmFtZSk7Ci0gIFNUUkRVUCAocHJvZHVjdF9pZCk7Ci0gIFNUUkRVUCAodmVyc2lvbl9pZCk7Ci0KLSN1bmRlZiBTVFJEVVAKLQotICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGNvdW50ID09IDAgfHwgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGJmZF9zaXplX3R5cGUpKG9mZnNldCtjb3VudCkgPiBzZWN0aW9uLT5fcmF3X3NpemUKLSAgICAgIHx8IGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgIHx8IGJmZF9yZWFkIChsb2NhdGlvbiwgKGJmZF9zaXplX3R5cGUpMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLwotICByZXR1cm4gKHRydWUpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBTZXQgdXAgZml4ZWQgcGFydHMgb2YgdGhlIGZpbGUsIHNwYWNlLCBhbmQgc3Vic3BhY2UgaGVhZGVycy4KLQkgTm90aWZ5IHRoZSB3b3JsZCB0aGF0IG91dHB1dCBoYXMgYmVndW4uICAqLwotICAgICAgc29tX3ByZXBfaGVhZGVycyAoYWJmZCk7Ci0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIC8qIFN0YXJ0IHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpbmNsdWRlIGFsbCB0aGUgc3RyaW5nCi0JIHRhYmxlcywgZml4dXAgc3RyZWFtcywgYW5kIG90aGVyIHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gICAgICBzb21fYmVnaW5fd3JpdGluZyAoYWJmZCk7Ci0gICAgfQotCi0gIC8qIE9ubHkgd3JpdGUgc3Vic3BhY2VzIHdoaWNoIGhhdmUgInJlYWwiIGNvbnRlbnRzIChlZy4gdGhlIGNvbnRlbnRzCi0gICAgIGFyZSBub3QgZ2VuZXJhdGVkIGF0IHJ1biB0aW1lIGJ5IHRoZSBPUykuICAqLwotICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikKLSAgICAgIHx8ICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWVrIHRvIHRoZSBwcm9wZXIgb2Zmc2V0IHdpdGhpbiB0aGUgb2JqZWN0IGZpbGUgYW5kIHdyaXRlIHRoZQotICAgICBkYXRhLiAgKi8KLSAgb2Zmc2V0ICs9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlOyAKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgLyogQWxsb3cgYW55IGFyY2hpdGVjdHVyZSB0byBiZSBzdXBwb3J0ZWQgYnkgdGhlIFNPTSBiYWNrZW5kICovCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNvbV9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJzb21fc2l6ZW9mX2hlYWRlcnMgdW5pbXBsZW1lbnRlZCIpKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotICBhYm9ydCAoKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8KLSAgIFNPTSBzZWN0aW9uIFMsIG9yICc/JyBmb3IgYW4gdW5rbm93biBTT00gc2VjdGlvbi4gICovCi0KLXN0YXRpYyBjaGFyCi1zb21fc2VjdGlvbl90eXBlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlICp0OwotCi0gIGZvciAodCA9ICZzdHRbMF07IHQtPnNlY3Rpb247IHQrKykKLSAgICBpZiAoIXN0cmNtcCAocywgdC0+c2VjdGlvbikpCi0gICAgICByZXR1cm4gdC0+dHlwZTsKLSAgcmV0dXJuICc/JzsKLX0KLQotc3RhdGljIGludAotc29tX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGNoYXIgYzsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnQyc7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdVJzsKLSAgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0knOwotICBpZiAoIShzeW1ib2wtPmZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX0xPQ0FMKSkpCi0gICAgcmV0dXJuICc/JzsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICB8fCAoc29tX3N5bWJvbF9kYXRhIChzeW1ib2wpICE9IE5VTEwKLQkgICYmIHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpKQotICAgIGMgPSAnYSc7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKLSAgICBjID0gc29tX3NlY3Rpb25fdHlwZSAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLSAgZWxzZQotICAgIHJldHVybiAnPyc7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0dMT0JBTCkKLSAgICBjID0gdG91cHBlciAoYyk7Ci0gIHJldHVybiBjOwotfQotCi0vKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgU09NIHN5bWJvbCBTWU1CT0wgaW4gUkVULiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICByZXQtPnR5cGUgPSBzb21fZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpOwotICBpZiAocmV0LT50eXBlICE9ICdVJykKLSAgICByZXQtPnZhbHVlID0gc3ltYm9sLT52YWx1ZStzeW1ib2wtPnNlY3Rpb24tPnZtYTsKLSAgZWxzZQotICAgIHJldC0+dmFsdWUgPSAwOwotICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Ci19Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBOZWNlc3NhcnkKLSAgIHNvIHRoYXQgd2UgY2FuIGFsbG9jYXRlIHNwYWNlIGZvciBhbGwgdGhlIGNhcnN5bXMgYXQgb25jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgKGFiZmQsIGxzdF9oZWFkZXIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBsc3RfaGVhZGVyICpsc3RfaGVhZGVyOwotICAgICBzeW1pbmRleCAqY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBmaWxlX3B0ciBsc3RfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCi0gIGhhc2hfdGFibGUgPSAKLSAgICAodW5zaWduZWQgaW50ICopIGJmZF9tYWxsb2MgKGxzdF9oZWFkZXItPmhhc2hfc2l6ZQotCQkJCSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0X2hlYWRlci0+aGFzaF9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogRG9uJ3QgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIGNvdW50ZXIhICAqLwotICAqY291bnQgPSAwOwotCi0gIC8qIFJlYWQgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUgaGFzIHRhYmxlIGlzIGFuIGFycmF5IG9mIDMyYml0IGZpbGUgb2Zmc2V0cwotICAgICB3aGljaCBwb2ludCB0byB0aGUgaGFzaCBjaGFpbnMuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhhc2hfdGFibGUsIGxzdF9oZWFkZXItPmhhc2hfc2l6ZSwgNCwgYWJmZCkKLSAgICAgICE9IGxzdF9oZWFkZXItPmhhc2hfc2l6ZSAqIDQpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2FsayBlYWNoIGNoYWluIGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3VuZCBvbiB0aGF0IHBhcnRpY3VsYXIKLSAgICAgY2hhaW4uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbHN0X2hlYWRlci0+aGFzaF9zaXplOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkIGxzdF9zeW1ib2w7Ci0KLSAgICAgIC8qIEFuIGVtcHR5IGNoYWluIGhhcyB6ZXJvIGFzIGl0J3MgZmlsZSBvZmZzZXQuICAqLwotICAgICAgaWYgKGhhc2hfdGFibGVbaV0gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlayB0byB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoaXMgaGFzaCBjaGFpbi4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgaGFzaF90YWJsZVtpXSwgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogUmVhZCBpbiB0aGlzIHN5bWJvbCBhbmQgdXBkYXRlIHRoZSBjb3VudGVyLiAgKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgKCpjb3VudCkrKzsKLQotICAgICAgLyogTm93IGl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgc3ltYm9scyBvbiB0aGlzIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChsc3Rfc3ltYm9sLm5leHRfZW50cnkpCi0JewotCi0JICAvKiBTZWVrIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X3N5bWJvbC5uZXh0X2VudHJ5LCBTRUVLX1NFVCkKLQkgICAgICA8IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBSZWFkIHRoZSBzeW1ib2wgaW4gYW5kIHVwZGF0ZSB0aGUgY291bnRlci4gICovCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKGxzdF9zeW1ib2wpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgKCpjb3VudCkrKzsKLQl9Ci0gICAgfQotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBGaWxsIGluIHRoZSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzIChTWU1TKSBmcm9tIHRoZSBhcmNoaXZlIGRlc2NyaWJlZAotICAgYnkgQUJGRCBhbmQgTFNUX0hFQURFUi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyAoYWJmZCwgbHN0X2hlYWRlciwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgbHN0X2hlYWRlciAqbHN0X2hlYWRlcjsKLSAgICAgY2Fyc3ltICoqc3ltczsKLXsKLSAgdW5zaWduZWQgaW50IGksIGxlbjsKLSAgY2Fyc3ltICpzZXQgPSBzeW1zWzBdOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBzdHJ1Y3Qgc29tX2VudHJ5ICpzb21fZGljdCA9IE5VTEw7Ci0gIGZpbGVfcHRyIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgaGFzaF90YWJsZSA9IAotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+aGFzaF9zaXplCi0JCQkJICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKLSAgaWYgKGhhc2hfdGFibGUgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5oYXNoX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzb21fZGljdCA9Ci0gICAgKHN0cnVjdCBzb21fZW50cnkgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+bW9kdWxlX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpOwotICBpZiAoc29tX2RpY3QgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBSZWFkIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGhhcyB0YWJsZSBpcyBhbiBhcnJheSBvZiAzMmJpdCBmaWxlIG9mZnNldHMKLSAgICAgd2hpY2ggcG9pbnQgdG8gdGhlIGhhc2ggY2hhaW5zLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBoYXNoX3RhYmxlLCBsc3RfaGVhZGVyLT5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5oYXNoX3NpemUgKiA0KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFNlZWsgdG8gYW5kIHJlYWQgaW4gdGhlIFNPTSBkaWN0aW9uYXJ5LiAgV2Ugd2lsbCBuZWVkIHRoaXMgdG8gZmlsbAotICAgICBpbiB0aGUgY2Fyc3ltJ3MgZmlsZXBvcyBmaWVsZC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3RfaGVhZGVyLT5kaXJfbG9jLCBTRUVLX1NFVCkgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgc29tX2RpY3QsIGxzdF9oZWFkZXItPm1vZHVsZV9jb3VudCwgCi0JCXNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSksIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdhbGsgZWFjaCBjaGFpbiBmaWxsaW5nIGluIHRoZSBjYXJzeW1zIGFzIHdlIGdvIGFsb25nLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGxzdF9oZWFkZXItPmhhc2hfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCBsc3Rfc3ltYm9sOwotCi0gICAgICAvKiBBbiBlbXB0eSBjaGFpbiBoYXMgemVybyBhcyBpdCdzIGZpbGUgb2Zmc2V0LiAgKi8KLSAgICAgIGlmIChoYXNoX3RhYmxlW2ldID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZWsgdG8gYW5kIHJlYWQgdGhlIGZpcnN0IHN5bWJvbCBvbiB0aGUgY2hhaW4uICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGhhc2hfdGFibGVbaV0sIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGZpcnN0IGdldCB0aGUgbGVuZ3RoIHdoaWNoIGlzIHN0b3JlZAotCSBhcyBhIDMyYml0IGludGVnZXIganVzdCBiZWZvcmUgdGhlIHN5bWJvbC4KLQotCSBPbmUgbWlnaHQgYXNrIHdoeSB3ZSBkb24ndCBqdXN0IHJlYWQgaW4gdGhlIGVudGlyZSBzdHJpbmcgdGFibGUKLQkgYW5kIGluZGV4IGludG8gaXQuICBXZWxsLCBhY2NvcmRpbmcgdG8gdGhlIFNPTSBBQkkgdGhlIHN0cmluZwotCSBpbmRleCBjYW4gcG9pbnQgKmFueXdoZXJlKiBpbiB0aGUgYXJjaGl2ZSB0byBzYXZlIHNwYWNlLCBzbyBqdXN0Ci0JIHVzaW5nIHRoZSBzdHJpbmcgdGFibGUgd291bGQgbm90IGJlIHNhZmUuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPnN0cmluZ19sb2MKLQkJCSAgICArIGxzdF9zeW1ib2wubmFtZS5uX3N0cnggLSA0LCBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDQsIGFiZmQpICE9IDQpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZSBhbmQgbnVsbCB0ZXJtaW5hdGUgaXQgdG9vLiAgKi8KLSAgICAgIHNldC0+bmFtZSA9IGJmZF96YWxsb2MgKGFiZmQsIGxlbiArIDEpOwotICAgICAgaWYgKCFzZXQtPm5hbWUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKHNldC0+bmFtZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNldC0+bmFtZVtsZW5dID0gMDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlsZSBvZmZzZXQuICBOb3RlIHRoYXQgdGhlICJsb2NhdGlvbiIgZmllbGQgcG9pbnRzCi0JIHRvIHRoZSBTT00gaXRzZWxmLCBub3QgdGhlIGFyX2hkciBpbiBmcm9udCBvZiBpdC4gICovCi0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gc29tX2RpY3RbbHN0X3N5bWJvbC5zb21faW5kZXhdLmxvY2F0aW9uCi0JCQkgIC0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLQotICAgICAgLyogR28gdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KLSAgICAgIHNldCsrOwotCi0gICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChsc3Rfc3ltYm9sLm5leHRfZW50cnkpCi0JewotCSAgLyogU2VlayB0byB0aGUgbmV4dCBzeW1ib2wgYW5kIHJlYWQgaXQgaW4uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9zeW1ib2wubmV4dF9lbnRyeSwgU0VFS19TRVQpIDwwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9zeW1ib2wsIDEsIHNpemVvZiAobHN0X3N5bWJvbCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFNlZWsgdG8gdGhlIG5hbWUgbGVuZ3RoICYgc3RyaW5nIGFuZCByZWFkIHRoZW0gaW4uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPnN0cmluZ19sb2MgCi0JCQkJKyBsc3Rfc3ltYm9sLm5hbWUubl9zdHJ4IC0gNCwgU0VFS19TRVQpIDwgMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChiZmRfcmVhZCAoJmxlbiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZSBhbmQgbnVsbCB0ZXJtaW5hdGUgaXQgdG9vLiAgKi8KLQkgIHNldC0+bmFtZSA9IGJmZF96YWxsb2MgKGFiZmQsIGxlbiArIDEpOwotCSAgaWYgKCFzZXQtPm5hbWUpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKHNldC0+bmFtZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgc2V0LT5uYW1lW2xlbl0gPSAwOwotCi0JICAvKiBGaWxsIGluIHRoZSBmaWxlIG9mZnNldC4gIE5vdGUgdGhhdCB0aGUgImxvY2F0aW9uIiBmaWVsZCBwb2ludHMKLQkgICAgIHRvIHRoZSBTT00gaXRzZWxmLCBub3QgdGhlIGFyX2hkciBpbiBmcm9udCBvZiBpdC4gICovCi0JICBzZXQtPmZpbGVfb2Zmc2V0ID0gc29tX2RpY3RbbHN0X3N5bWJvbC5zb21faW5kZXhdLmxvY2F0aW9uCi0JCQkgICAgICAgLSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCi0JICAvKiBHbyBvbiB0byB0aGUgbmV4dCBzeW1ib2wuICAqLwotCSAgc2V0Kys7Ci0JfQotICAgIH0KLSAgLyogSWYgd2UgaGF2ZW4ndCBkaWVkIGJ5IG5vdywgdGhlbiB3ZSBzdWNjZXNzZnVsbHkgcmVhZCB0aGUgZW50aXJlIAotICAgICBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIHRoZSBMU1QgZnJvbSB0aGUgYXJjaGl2ZS4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBhcl9oZHIgYXJfaGVhZGVyOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgLyogU3BlY2lhbCBjYXNlcy4gICovCi0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRm9yIGFyY2hpdmVzIHdpdGhvdXQgLm8gZmlsZXMgdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZWFkIGluIGFuZCBzYW5pdHkgY2hlY2sgdGhlIGFyY2hpdmUgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmYXJfaGVhZGVyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN0cm5jbXAgKGFyX2hlYWRlci5hcl9mbWFnLCBBUkZNQUcsIDIpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEhvdyBiaWcgaXMgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGVudHJ5PyAgKi8KLSAgZXJybm8gPSAwOwotICBwYXJzZWRfc2l6ZSA9IHN0cnRvbCAoYXJfaGVhZGVyLmFyX3NpemUsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2F2ZSBvZmYgdGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWFsIHVzZXIgZGF0YS4gICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpICsgcGFyc2VkX3NpemU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgbGlicmFyeSBzeW1ib2wgdGFibGUuICBXZSdsbCBtYWtlIGhlYXZ5IHVzZSBvZiB0aGlzCi0gICAgIGluIGp1c3QgYSBtaW51dGUuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X2hlYWRlciwgMSwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgaWYgKGxzdF9oZWFkZXIuYV9tYWdpYyAhPSBMSUJNQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyAoYWJmZCwgJmxzdF9oZWFkZXIsICZhcmRhdGEtPnN5bWRlZl9jb3VudCkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyAtIHBhcnNlZF9zaXplIAotCQkJKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW5pdGlhbGl6YWUgdGhlIGNhY2hlIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpYnJhcnkgc3ltYm9scy4gICovCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKLQkJCQkJICAgKiBzaXplb2YgKGNhcnN5bSkpKTsKLSAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyBmaWxsIGluIHRoZSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzLiAgKi8KLSAgaWYgKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzIChhYmZkLCAmbHN0X2hlYWRlciwgJmFyZGF0YS0+c3ltZGVmcykKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTZWVrIGJhY2sgdG8gdGhlICJmaXJzdCIgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIE5vdGUgdGhlICJmaXJzdCIKLSAgICAgZmlsZSBtYXkgYmUgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3RpZnkgdGhlIGdlbmVyaWMgYXJjaGl2ZSBjb2RlIHRoYXQgd2UgaGF2ZSBhIHN5bWJvbCBtYXAuICAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQmVnaW4gcHJlcGFyaW5nIHRvIHdyaXRlIGEgU09NIGxpYnJhcnkgc3ltYm9sIHRhYmxlLgotCi0gICBBcyBwYXJ0IG9mIHRoZSBwcmVwIHdvcmsgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzeW1ib2xzCi0gICBhbmQgdGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSAoYWJmZCwgbnVtX3N5bXMsIHN0cmluZ3NpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50ICpudW1fc3ltcywgKnN0cmluZ3NpemU7Ci17Ci0gIGJmZCAqY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0KLSAgLyogU29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gICpudW1fc3ltcyA9IDA7Ci0gICpzdHJpbmdzaXplID0gMDsKLQotICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBCRkQgd2l0aGluIHRoaXMgYXJjaGl2ZS4gICovCi0gIHdoaWxlIChjdXJyX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBpOwotICAgICAgc29tX3N5bWJvbF90eXBlICpzeW07Ci0KLSAgICAgIC8qIERvbid0IGJvdGhlciBmb3Igbm9uLVNPTSBvYmplY3RzLiAgKi8KLSAgICAgIGlmIChjdXJyX2JmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QKLQkgIHx8IGN1cnJfYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0JewotCSAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gcmVhZCwgdGhlbiBzbmFnIGEgcG9pbnRlcgotCSB0byBpdC4gIEl0J3MgYSBsaXR0bGUgc2xpbWV5IHRvIGdyYWIgdGhlIHN5bWJvbHMgdmlhIG9ial9zb21fc3ltdGFiLAotCSBidXQgZG9pbmcgc28gYXZvaWRzIGFsbG9jYXRpbmcgbG90cyBvZiBleHRyYSBtZW1vcnkuICAqLwotICAgICAgaWYgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGN1cnJfYmZkKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN5bSA9IG9ial9zb21fc3ltdGFiIChjdXJyX2JmZCk7Ci0gICAgICBjdXJyX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoY3Vycl9iZmQpOwotCi0gICAgICAvKiBFeGFtaW5lIGVhY2ggc3ltYm9sIHRvIGRldGVybWluZSBpZiBpdCBiZWxvbmdzIGluIHRoZQotCSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY3Vycl9jb3VudDsgaSsrLCBzeW0rKykKLQl7Ci0JICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gaW5mbzsKLQotCSAgLyogRGVyaXZlIFNPTSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgc3ltYm9sLiAgKi8KLQkgIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGN1cnJfYmZkLCAmc3ltLT5zeW1ib2wsICZpbmZvKTsKLQotCSAgLyogU2hvdWxkIHdlIGluY2x1ZGUgdGhpcyBzeW1ib2w/ICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfTlVMTAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfU1lNX0VYVAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfQVJHX0VYVCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE9ubHkgZ2xvYmFsIHN5bWJvbHMgYW5kIHVuc2F0aXNmaWVkIGNvbW1vbnMuICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3Njb3BlICE9IFNTX1VOSVZFUlNBTAotCSAgICAgICYmIGluZm8uc3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIERvIG5vIGluY2x1ZGUgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBCdW1wIHRoZSB2YXJpb3VzIGNvdW50ZXJzLCBiZWluZyBjYXJlZnVsIHRvIGhvbm9yCi0JICAgICBhbGlnbm1lbnQgY29uc2lkZXJhdGlvbnMgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICAoKm51bV9zeW1zKSsrOwotCSAgKnN0cmluZ3NpemUgPSAqc3RyaW5nc2l6ZSArIHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgKyA1OwotCSAgd2hpbGUgKCpzdHJpbmdzaXplICUgNCkKLQkgICAgKCpzdHJpbmdzaXplKSsrOwotCX0KLQotICAgICAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYXNoIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHByZXNlbnRlZCBpbiB0aGUKLSAgIFNPTSBBQkkuICAqLwotc3RhdGljIHVuc2lnbmVkIGludAotc29tX2JmZF9hcl9zeW1ib2xfaGFzaCAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4gKHN5bWJvbC0+bmFtZSk7Ci0KLSAgLyogTmFtZXMgd2l0aCBsZW5ndGggMSBhcmUgc3BlY2lhbC4gICovCi0gIGlmIChsZW4gPT0gMSkKLSAgICByZXR1cm4gMHgxMDAwMTAwIHwgKHN5bWJvbC0+bmFtZVswXSA8PCAxNikgfCBzeW1ib2wtPm5hbWVbMF07Ci0KLSAgcmV0dXJuICgobGVuICYgMHg3ZikgPDwgMjQpIHwgKHN5bWJvbC0+bmFtZVsxXSA8PCAxNikKLQkgIHwgKHN5bWJvbC0+bmFtZVtsZW4tMl0gPDwgOCkgfCBzeW1ib2wtPm5hbWVbbGVuLTFdOwotfQotCi0vKiBEbyB0aGUgYnVsayBvZiB0aGUgd29yayByZXF1aXJlZCB0byB3cml0ZSB0aGUgU09NIGxpYnJhcnkKLSAgIHN5bWJvbCB0YWJsZS4gICovCi0gICAKLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiAoYWJmZCwgbnN5bXMsIHN0cmluZ19zaXplLCBsc3QsIGVsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG5zeW1zLCBzdHJpbmdfc2l6ZTsKLSAgICAgc3RydWN0IGxzdF9oZWFkZXIgbHN0OwotICAgICB1bnNpZ25lZCBlbGVuZ3RoOwotewotICBmaWxlX3B0ciBsc3RfZmlsZXBvczsKLSAgY2hhciAqc3RyaW5ncyA9IE5VTEwsICpwOwotICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKmxzdF9zeW1zID0gTlVMTCwgKmN1cnJfbHN0X3N5bTsKLSAgYmZkICpjdXJyX2JmZDsKLSAgdW5zaWduZWQgaW50ICpoYXNoX3RhYmxlID0gTlVMTDsKLSAgc3RydWN0IHNvbV9lbnRyeSAqc29tX2RpY3QgPSBOVUxMOwotICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKipsYXN0X2hhc2hfZW50cnkgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgY3Vycl9zb21fb2Zmc2V0LCBzb21faW5kZXggPSAwOwotCi0gIGhhc2hfdGFibGUgPQotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0Lmhhc2hfc2l6ZSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0Lmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBzb21fZGljdCA9Ci0gICAgKHN0cnVjdCBzb21fZW50cnkgKikgYmZkX21hbGxvYyAobHN0Lm1vZHVsZV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKTsKLSAgaWYgKHNvbV9kaWN0ID09IE5VTEwgJiYgbHN0Lm1vZHVsZV9jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGxhc3RfaGFzaF9lbnRyeSA9Ci0gICAgKChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKiopCi0gICAgIGJmZF9tYWxsb2MgKGxzdC5oYXNoX3NpemUgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqKSkpOwotICBpZiAobGFzdF9oYXNoX2VudHJ5ID09IE5VTEwgJiYgbHN0Lmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvdHMgb2YgZmllbGRzIGFyZSBmaWxlIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQKLSAgICAgb2YgdGhlIGxzdCByZWNvcmQuICBTbyBzYXZlIGl0cyBsb2NhdGlvbi4gICovCi0gIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgLyogU29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gIG1lbXNldCAoaGFzaF90YWJsZSwgMCwgNCAqIGxzdC5oYXNoX3NpemUpOwotICBtZW1zZXQgKHNvbV9kaWN0LCAwLCBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSk7Ci0gIG1lbXNldCAobGFzdF9oYXNoX2VudHJ5LCAwLCAJCi0JICBsc3QuaGFzaF9zaXplICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKikpOwotCi0gIC8qIFN5bWJvbHMgaGF2ZSBzb21faW5kZXggZmllbGRzLCBzbyB3ZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIGluZGV4IG9mIGVhY2ggU09NIGluIHRoZSBhcmNoaXZlLgotCi0gICAgIFRoZSBTT00gZGljdGlvbmFyeSBoYXMgKGFtb25nIG90aGVyIHRoaW5ncykgdGhlIGFic29sdXRlIGZpbGUKLSAgICAgcG9zaXRpb24gZm9yIHRoZSBTT00gd2hpY2ggYSBwYXJ0aWN1bGFyIGRpY3Rpb25hcnkgZW50cnkKLSAgICAgZGVzY3JpYmVzLiAgV2UgaGF2ZSB0byBjb21wdXRlIHRoYXQgaW5mb3JtYXRpb24gYXMgd2UgaXRlcmF0ZQotICAgICB0aHJvdWdoIHRoZSBTT01zL3N5bWJvbHMuICAqLwotICBzb21faW5kZXggPSAwOwotCi0gIC8qIFdlIGFkZCBpbiB0aGUgc2l6ZSBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgdHdpY2UgYXMgdGhlIGxvY2F0aW9uCi0gICAgIGluIHRoZSBTT00gZGljdGlvbmFyeSBpcyB0aGUgYWN0dWFsIG9mZnNldCBvZiB0aGUgU09NLCBub3QgdGhlCi0gICAgIGFyY2hpdmUgaGVhZGVyIGJlZm9yZSB0aGUgU09NLiAgKi8KLSAgY3Vycl9zb21fb2Zmc2V0ID0gOCArIDIgKiBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgbHN0LmZpbGVfZW5kOwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGFyY2hpdmUgaGVhZGVyIGFuZCB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgIGV4dGVuZGVkIHN0cmluZyB0YWJsZS4gIE5vdGUgdGhhdCBlbGVuZ3RoIGluY2x1ZGVzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUhICAqLwotICBpZiAoZWxlbmd0aCkKLSAgICBjdXJyX3NvbV9vZmZzZXQgKz0gZWxlbmd0aDsKLQotICAvKiBNYWtlIHN1cmUgd2UncmUgcHJvcGVybHkgYWxpZ25lZC4gICovCi0gIGN1cnJfc29tX29mZnNldCA9IChjdXJyX3NvbV9vZmZzZXQgKyAweDEpICYgfjB4MTsKLQotICAvKiBGSVhNRSBzaG91bGQgYmUgZG9uZSB3aXRoIGJ1ZmZlcnMganVzdCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZS4uLiAqLwotICBsc3Rfc3ltcyA9IGJmZF9tYWxsb2MgKG5zeW1zICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpKTsKLSAgaWYgKGxzdF9zeW1zID09IE5VTEwgJiYgbnN5bXMgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgc3RyaW5ncyA9IGJmZF9tYWxsb2MgKHN0cmluZ19zaXplKTsKLSAgaWYgKHN0cmluZ3MgPT0gTlVMTCAmJiBzdHJpbmdfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHAgPSBzdHJpbmdzOwotICBjdXJyX2xzdF9zeW0gPSBsc3Rfc3ltczsKLQotICBjdXJyX2JmZCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgd2hpbGUgKGN1cnJfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGN1cnJfY291bnQsIGk7Ci0gICAgICBzb21fc3ltYm9sX3R5cGUgKnN5bTsKLQotICAgICAgLyogRG9uJ3QgYm90aGVyIGZvciBub24tU09NIG9iamVjdHMuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdAotCSAgfHwgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQl7Ci0JICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbiByZWFkLCB0aGVuIHNuYWcgYSBwb2ludGVyCi0JIHRvIGl0LiAgSXQncyBhIGxpdHRsZSBzbGltZXkgdG8gZ3JhYiB0aGUgc3ltYm9scyB2aWEgb2JqX3NvbV9zeW10YWIsCi0JIGJ1dCBkb2luZyBzbyBhdm9pZHMgYWxsb2NhdGluZyBsb3RzIG9mIGV4dHJhIG1lbW9yeS4gICovCi0gICAgICBpZiAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoY3Vycl9iZmQpID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzeW0gPSBvYmpfc29tX3N5bXRhYiAoY3Vycl9iZmQpOwotICAgICAgY3Vycl9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGN1cnJfYmZkKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJfY291bnQ7IGkrKywgc3ltKyspCi0JewotCSAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87Ci0KLQkgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCi0JICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChjdXJyX2JmZCwgJnN5bS0+c3ltYm9sLCAmaW5mbyk7Ci0KLQkgIC8qIFNob3VsZCB3ZSBpbmNsdWRlIHRoaXMgc3ltYm9sPyAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF90eXBlID09IFNUX05VTEwKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX1NZTV9FWFQKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX0FSR19FWFQpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBPbmx5IGdsb2JhbCBzeW1ib2xzIGFuZCB1bnNhdGlzZmllZCBjb21tb25zLiAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF9zY29wZSAhPSBTU19VTklWRVJTQUwKLQkgICAgICAmJiBpbmZvLnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBEbyBubyBpbmNsdWRlIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c3ltYm9sLnNlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3ltYm9sIGZyb20gdGhpcyBTT00sIHRoZW4gdXBkYXRlCi0JICAgICB0aGUgU09NIGRpY3Rpb25hcnkgdG9vLiAgKi8KLQkgIGlmIChzb21fZGljdFtzb21faW5kZXhdLmxvY2F0aW9uID09IDApCi0JICAgIHsKLQkgICAgICBzb21fZGljdFtzb21faW5kZXhdLmxvY2F0aW9uID0gY3Vycl9zb21fb2Zmc2V0OwotCSAgICAgIHNvbV9kaWN0W3NvbV9pbmRleF0ubGVuZ3RoID0gYXJlbHRfc2l6ZSAoY3Vycl9iZmQpOwotCSAgICB9Ci0KLQkgIC8qIEZpbGwgaW4gdGhlIGxzdCBzeW1ib2wgcmVjb3JkLiAgKi8KLQkgIGN1cnJfbHN0X3N5bS0+aGlkZGVuID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+c2Vjb25kYXJ5X2RlZiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF90eXBlID0gaW5mby5zeW1ib2xfdHlwZTsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3Njb3BlID0gaW5mby5zeW1ib2xfc2NvcGU7Ci0JICBjdXJyX2xzdF9zeW0tPmNoZWNrX2xldmVsID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+bXVzdF9xdWFsaWZ5ID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+aW5pdGlhbGx5X2Zyb3plbiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPm1lbW9yeV9yZXNpZGVudCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPmlzX2NvbW1vbiA9IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbik7Ci0JICBjdXJyX2xzdF9zeW0tPmR1cF9jb21tb24gPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT54bGVhc3QgPSAzOwotCSAgY3Vycl9sc3Rfc3ltLT5hcmdfcmVsb2MgPSBpbmZvLmFyZ19yZWxvYzsKLQkgIGN1cnJfbHN0X3N5bS0+bmFtZS5uX3N0cnggPSBwIC0gc3RyaW5ncyArIDQ7Ci0JICBjdXJyX2xzdF9zeW0tPnF1YWxpZmllcl9uYW1lLm5fc3RyeCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9pbmZvID0gaW5mby5zeW1ib2xfaW5mbzsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3ZhbHVlID0gaW5mby5zeW1ib2xfdmFsdWUgfCBpbmZvLnByaXZfbGV2ZWw7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9kZXNjcmlwdG9yID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+cmVzZXJ2ZWQgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5zb21faW5kZXggPSBzb21faW5kZXg7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgPSBzb21fYmZkX2FyX3N5bWJvbF9oYXNoICgmc3ltLT5zeW1ib2wpOwotCSAgY3Vycl9sc3Rfc3ltLT5uZXh0X2VudHJ5ID0gMDsKLQotCSAgLyogSW5zZXJ0IGludG8gdGhlIGhhc2ggdGFibGUuICAqLwotCSAgaWYgKGhhc2hfdGFibGVbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0pCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKnRtcDsKLQotCSAgICAgIC8qIFRoZXJlIGlzIGFscmVhZHkgc29tZXRoaW5nIGF0IHRoZSBoZWFkIG9mIHRoaXMgaGFzaCBjaGFpbiwKLQkJIHNvIHRhY2sgdGhpcyBzeW1ib2wgb250byB0aGUgZW5kIG9mIHRoZSBjaGFpbi4gICovCi0JICAgICAgdG1wID0gbGFzdF9oYXNoX2VudHJ5W2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdOwotCSAgICAgIHRtcC0+bmV4dF9lbnRyeQotCQk9IChjdXJyX2xzdF9zeW0gLSBsc3Rfc3ltcykgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkKLQkJICArIGxzdC5oYXNoX3NpemUgKiA0IAotCQkgICsgbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkKLQkJICArIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGaXJzdCBlbnRyeSBpbiB0aGlzIGhhc2ggY2hhaW4uICAqLwotCSAgICAgIGhhc2hfdGFibGVbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0KLQkJPSAoY3Vycl9sc3Rfc3ltIC0gbHN0X3N5bXMpICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpCi0JCSAgKyBsc3QuaGFzaF9zaXplICogNCAKLQkJICArIGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQkgICAgfQotCi0JICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN5bWJvbCB3ZSBhZGRlZCB0byB0aGlzIGNoYWluIHNvIHdlIGNhbgotCSAgICAgZWFzaWx5IHVwZGF0ZSBpdHMgbmV4dF9lbnRyeSBwb2ludGVyLiAgKi8KLQkgIGxhc3RfaGFzaF9lbnRyeVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXQotCSAgICA9IGN1cnJfbHN0X3N5bTsKLQotCi0JICAvKiBVcGRhdGUgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICBiZmRfcHV0XzMyIChhYmZkLCBzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpLCBwKTsKLQkgIHAgKz0gNDsKLQkgIHN0cmNweSAocCwgc3ltLT5zeW1ib2wubmFtZSk7Ci0JICBwICs9IHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgKyAxOwotCSAgd2hpbGUgKChpbnQpcCAlIDQpCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDAsIHApOwotCSAgICAgIHArKzsKLQkgICAgfQotCi0JICAvKiBIZWFkIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBjdXJyX2xzdF9zeW0rKzsKLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2Ygd2hlcmUgZWFjaCBTT00gd2lsbCBmaW5hbGx5IHJlc2lkZTsgdGhlbiBsb29rCi0JIGF0IHRoZSBuZXh0IEJGRC4gICovCi0gICAgICBjdXJyX3NvbV9vZmZzZXQgKz0gYXJlbHRfc2l6ZSAoY3Vycl9iZmQpICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLSAKLSAgICAgIC8qIEEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGFyY2hpdmUgbWF5IGhhdmUgYW4gb2RkIGxlbmd0aDsgdGhlCi0JIGxpbmtlciByZXF1aXJlcyBvYmplY3RzIGJlZ2luIG9uIGFuIGV2ZW4gYm91bmRhcnkuICBTbyByb3VuZAotCSB1cCB0aGUgY3VycmVudCBvZmZzZXQgYXMgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGN1cnJfc29tX29mZnNldCA9IChjdXJyX3NvbV9vZmZzZXQgKyAweDEpICYgfjB4MTsKLSAgICAgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0gICAgICBzb21faW5kZXgrKzsKLSAgICB9Ci0KLSAgLyogTm93IHNjcmliYmxlIG91dCB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2hfdGFibGUsIGxzdC5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3QuaGFzaF9zaXplICogNCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGVuIHRoZSBTT00gZGljdGlvbmFyeS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9kaWN0LCBsc3QubW9kdWxlX2NvdW50LAotCQkgc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSwgYWJmZCkKLSAgICAgICE9IGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBsaWJyYXJ5IHN5bWJvbHMuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBsc3Rfc3ltcywgbnN5bXMsIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSwgYWJmZCkKLSAgICAgICE9IG5zeW1zICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEFuZCBmaW5hbGx5IHRoZSBzdHJpbmdzLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc3RyaW5ncywgc3RyaW5nX3NpemUsIDEsIGFiZmQpICE9IHN0cmluZ19zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSAhPSBOVUxMKQotICAgIGZyZWUgKGxhc3RfaGFzaF9lbnRyeSk7Ci0gIGlmIChsc3Rfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGxzdF9zeW1zKTsKLSAgaWYgKHN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzdHJpbmdzKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSAhPSBOVUxMKQotICAgIGZyZWUgKGxhc3RfaGFzaF9lbnRyeSk7Ci0gIGlmIChsc3Rfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGxzdF9zeW1zKTsKLSAgaWYgKHN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzdHJpbmdzKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgTFNUIGZvciB0aGUgYXJjaGl2ZS4KLQotICAgWW91J2xsIG5ldmVyIGJlbGlldmUgdGhpcyBpcyByZWFsbHkgaG93IGFybWFwcyBhcmUgaGFuZGxlZCBpbiBTT00uLi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBiZmQgKmN1cnJfYmZkOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaSwgbHN0X3NpemUsIG5zeW1zLCBzdHJpbmdzaXplOwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IGxzdF9oZWFkZXIgbHN0OwotICBpbnQgKnA7Ci0gCi0gIC8qIFdlJ2xsIHVzZSB0aGlzIGZvciB0aGUgYXJjaGl2ZSdzIGRhdGUgYW5kIG1vZGUgbGF0ZXIuICAqLwotICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBGdWRnZSBmYWN0b3IuICAqLwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIDYwOwotCi0gIC8qIEFjY291bnQgZm9yIHRoZSBsc3QgaGVhZGVyIGZpcnN0LiAgKi8KLSAgbHN0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQotICAvKiBTdGFydCBidWlsZGluZyB0aGUgTFNUIGhlYWRlci4gICovCi0gIC8qIEZJWE1FOiAgRG8gd2UgbmVlZCB0byBleGFtaW5lIGVhY2ggZWxlbWVudCB0byBkZXRlcm1pbmUgdGhlCi0gICAgIGxhcmdlc3QgaWQgbnVtYmVyPyAgKi8KLSAgbHN0LnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotICBsc3QuYV9tYWdpYyA9IExJQk1BR0lDOwotICBsc3QudmVyc2lvbl9pZCA9IFZFUlNJT05fSUQ7Ci0gIGxzdC5maWxlX3RpbWUuc2VjcyA9IDA7Ci0gIGxzdC5maWxlX3RpbWUubmFub3NlY3MgPSAwOwotCi0gIGxzdC5oYXNoX2xvYyA9IGxzdF9zaXplOwotICBsc3QuaGFzaF9zaXplID0gU09NX0xTVF9IQVNIX1NJWkU7Ci0KLSAgLyogSGFzaCB0YWJsZSBpcyBhIFNPTV9MU1RfSEFTSF9TSVpFIDMyYml0IG9mZnNldHMuICAqLwotICBsc3Rfc2l6ZSArPSA0ICogU09NX0xTVF9IQVNIX1NJWkU7Ci0KLSAgLyogV2UgbmVlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIFNPTXMgaW4gdGhpcyBhcmNoaXZlLiAgKi8KLSAgY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIGxzdC5tb2R1bGVfY291bnQgPSAwOwotICB3aGlsZSAoY3Vycl9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBPbmx5IHRydWUgU09NIG9iamVjdHMgY291bnQuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdAotCSAgJiYgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQlsc3QubW9kdWxlX2NvdW50Kys7Ci0gICAgICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotICAgIH0KLSAgbHN0Lm1vZHVsZV9saW1pdCA9IGxzdC5tb2R1bGVfY291bnQ7Ci0gIGxzdC5kaXJfbG9jID0gbHN0X3NpemU7Ci0gIGxzdF9zaXplICs9IHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkgKiBsc3QubW9kdWxlX2NvdW50OwotCi0gIC8qIFdlIGRvbid0IHN1cHBvcnQgaW1wb3J0L2V4cG9ydCB0YWJsZXMsIGF1eGlsaWFyeSBoZWFkZXJzLAotICAgICBvciBmcmVlIGxpc3RzIHlldC4gIE1ha2UgdGhlIGxpbmtlciB3b3JrIGEgbGl0dGxlIGhhcmRlcgotICAgICB0byBtYWtlIG91ciBsaWZlIGVhc2llci4gICovCi0KLSAgbHN0LmV4cG9ydF9sb2MgPSAwOwotICBsc3QuZXhwb3J0X2NvdW50ID0gMDsKLSAgbHN0LmltcG9ydF9sb2MgPSAwOwotICBsc3QuYXV4X2xvYyA9IDA7Ci0gIGxzdC5hdXhfc2l6ZSA9IDA7Ci0KLSAgLyogQ291bnQgaG93IG1hbnkgc3ltYm9scyB3ZSB3aWxsIGhhdmUgb24gdGhlIGhhc2ggY2hhaW5zIGFuZCB0aGUKLSAgICAgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSAoYWJmZCwgJm5zeW1zLCAmc3RyaW5nc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxzdF9zaXplICs9IHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSAqIG5zeW1zOwotCi0gIC8qIEZvciB0aGUgc3RyaW5nIHRhYmxlLiAgT25lIGRheSB3ZSBtaWdodCBhY3R1YWxseSB1c2UgdGhpcyBpbmZvCi0gICAgIHRvIGF2b2lkIHNtYWxsIHNlZWtzL3JlYWRzIHdoZW4gcmVhZGluZyBhcmNoaXZlcy4gICovCi0gIGxzdC5zdHJpbmdfbG9jID0gbHN0X3NpemU7Ci0gIGxzdC5zdHJpbmdfc2l6ZSA9IHN0cmluZ3NpemU7Ci0gIGxzdF9zaXplICs9IHN0cmluZ3NpemU7Ci0KLSAgLyogU09NIEFCSSBzYXlzIHRoaXMgbXVzdCBiZSB6ZXJvLiAgKi8KLSAgbHN0LmZyZWVfbGlzdCA9IDA7Ci0gIGxzdC5maWxlX2VuZCA9IGxzdF9zaXplOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtLiAgTXVzdCBoYXBwZW4gYWZ0ZXIgdGhlIGVudGlyZSBsc3QgaGVhZGVyCi0gICAgIGhhcyBmaWxsZWQgaW4uICAqLwotICBwID0gKGludCAqKSZsc3Q7Ci0gIGxzdC5jaGVja3N1bSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKS9zaXplb2YgKGludCkgLSAxOyBpKyspCi0gICAgbHN0LmNoZWNrc3VtIF49ICpwKys7Ci0KLSAgc3ByaW50ZiAoaGRyLmFyX25hbWUsICIvICAgICAgICAgICAgICAgIik7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYWJmZCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgZ2V0dWlkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSBnZXRnaWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfbW9kZSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0YnVmLnN0X21vZGUpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbHN0X3NpemUpOwotICBoZHIuYXJfZm1hZ1swXSA9ICdgJzsKLSAgaGRyLmFyX2ZtYWdbMV0gPSAnXDAxMic7Ci0KLSAgLyogVHVybiBhbnkgbnVsbHMgaW50byBzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIGFyIGhlYWRlci4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgc2NyaWJibGUgb3V0IHRoZSBsc3QgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmxzdCwgMSwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQnVpbGQgYW5kIHdyaXRlIHRoZSBhcm1hcC4gICovCi0gIGlmIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiAoYWJmZCwgbnN5bXMsIHN0cmluZ3NpemUsIGxzdCwgZWxlbmd0aCkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIERvbmUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnJlZSBhbGwgaW5mb3JtYXRpb24gd2UgaGF2ZSBjYWNoZWQgZm9yIHRoaXMgQkZELiAgV2UgY2FuIGFsd2F5cwotICAgcmVhZCBpdCBhZ2FpbiBsYXRlciBpZiB3ZSBuZWVkIGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbzsKLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNkZWZpbmUgRlJFRSh4KSBpZiAoeCAhPSBOVUxMKSB7IGZyZWUgKHgpOyB4ID0gTlVMTDsgfQotICAvKiBGcmVlIHRoZSBuYXRpdmUgc3RyaW5nIGFuZCBzeW1ib2wgdGFibGVzLiAgKi8KLSAgRlJFRSAob2JqX3NvbV9zeW10YWIgKGFiZmQpKTsKLSAgRlJFRSAob2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIEZyZWUgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IC0xOwotICAgICAgRlJFRSAoc29tX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jX3N0cmVhbSk7Ci0gICAgICAvKiBGcmVlIHRoZSBnZW5lcmljIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIEZSRUUgKG8tPnJlbG9jYXRpb24pOwotICAgIH0KLSN1bmRlZiBGUkVFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBvZiBtaXNjZWxsYW5lb3VzIHN1cHBvcnQgZnVuY3Rpb25zLiAqLwotCi0vKiBMaW5rZXIgc3VwcG9ydCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIChzb21faXNfc3Vic3BhY2UgKHNlYykgJiYgc2VjLT5fcmF3X3NpemUgPiAyNDAwMDApOwotfQotCi0jZGVmaW5lCXNvbV9jbG9zZV9hbmRfY2xlYW51cAkJc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgc29tX3JlYWRfYXJfaGRyCQkJX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIHNvbV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIHNvbV9nZXRfZWx0X2F0X2luZGV4CQlfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBzb21fZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgc29tX3RydW5jYXRlX2FybmFtZQkJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgc29tX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIHNvbV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIHNvbV91cGRhdGVfYXJtYXBfdGltZXN0YW1wCWJmZF90cnVlCi0jZGVmaW5lIHNvbV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgc29tX2dldF9saW5lbm8gICAgICAgICAgICAgICAgICBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHNvbV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wJX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNvbV9yZWFkX21pbmlzeW1ib2xzCQlfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzb21fbWluaXN5bWJvbF90b19zeW1ib2wJX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgc29tX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBzb21fYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBzb21fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgc29tX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHNvbV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIHNvbV9iZmRfZ2Nfc2VjdGlvbnMJCWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLQotY29uc3QgYmZkX3RhcmdldCBzb21fdmVjID0KLXsKLSAgInNvbSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCB8IERZTkFNSUMpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLQotLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIDAsCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTQsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBzb21fb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNvbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNvbV93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSN1bmRlZiBzb20KLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKLQotI2VuZGlmIC8qIEhPU1RfSFBQQUhQVVggfHwgSE9TVF9IUFBBQlNEIHx8IEhPU1RfSFBQQU9TRiAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NvbS5oIGIvYmZkL3NvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM3ODA0Li4wMDAwMDAwCi0tLSBhL2JmZC9zb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKiBIUCBQQS1SSVNDIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQ6ICBkZWZpbml0aW9ucyBpbnRlcm5hbCB0byBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1NPTV9ICi0jZGVmaW5lIF9TT01fSAotCi0jaW5jbHVkZSAibGliaHBwYS5oIgotCi0jaW5jbHVkZSA8YS5vdXQuaD4KLSNpbmNsdWRlIDxsc3QuaD4KLSNpbmNsdWRlIDxhci5oPgotCi0vKiBUaGUgU09NIEJGRCBiYWNrZW5kIGRvZXNuJ3QgY3VycmVudGx5IHVzZSBhbnl0aGluZyBmcm9tIHRoZXNlCi0gICB0d28gaW5jbHVkZSBmaWxlcywgYnV0IGl0J3MgbGlrZWx5IHRvIG5lZWQgdGhlbSBpbiB0aGUgZnV0dXJlLiAgKi8KLSNpZmRlZiBSX0RMVF9SRUwKLSNpbmNsdWRlIDxzaGwuaD4KLSNpbmNsdWRlIDxkbC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKQotLyogQlNEIHVzZXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzY2hlbWUgZm9yIG9iamVjdCBmaWxlIGlkZW50aWZpY2F0aW9uLgotICAgc28gZm9yIG5vdywgZGVmaW5lIF9QQV9SSVNDX0lEIHRvIGFjY2VwdCBhbnkgcmFuZG9tIHZhbHVlIGZvciBhIG1vZGVsCi0gICBudW1iZXIuICAqLwotI3VuZGVmIF9QQV9SSVNDX0lECi0jZGVmaW5lIF9QQV9SSVNDX0lEKF9fbV9udW0pIDEKLSNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KLQotI2RlZmluZSBGSUxFX0hEUl9TSVpFIHNpemVvZihzdHJ1Y3QgaGVhZGVyKQotI2RlZmluZSBBVVhfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpCi0KLXR5cGVkZWYgc3RydWN0IHNvbV9zeW1ib2wKLSAgewotICAgIGFzeW1ib2wgc3ltYm9sOwotICAgIHVuc2lnbmVkIGludCBzb21fdHlwZTsKLQotICAgIC8qIFN0cnVjdHVyZWQgbGlrZSB0aGUgRUxGIHRjX2RhdGEgdW5pb24uICBBbGxvd3MgbW9yZSBjb2RlIHNoYXJpbmcKLSAgICAgICBpbiBHQVMgdGhpcyB3YXkuICAqLwotICAgIHVuaW9uCi0gICAgICB7Ci0Jc3RydWN0Ci0JewotCSAgdW5zaWduZWQgaW50IGhwcGFfYXJnX3JlbG9jOwotCSAgdW5zaWduZWQgaW50IGhwcGFfcHJpdl9sZXZlbDsKLQl9IGFwOwotCVBUUiBhbnk7Ci0gICAgICB9Ci0gICAgdGNfZGF0YTsKLQotICAgIC8qIEluZGV4IG9mIHRoaXMgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuICBPbmx5IHVzZWQgd2hlbgotICAgICAgIGJ1aWxkaW5nIHJlbG9jYXRpb24gc3RyZWFtcyBmb3IgaW5jb21wbGV0ZSBvYmplY3RzLiAgKi8KLSAgICBpbnQgaW5kZXg7Ci0KLSAgICAvKiBIb3cgbWFueSB0aW1lcyB0aGlzIHN5bWJvbCBpcyB1c2VkIGluIGEgcmVsb2NhdGlvbi4gIEJ5IHNvcnRpbmcKLSAgICAgICB0aGUgc3ltYm9scyBmcm9tIG1vc3QgdXNlZCB0byBsZWFzdCB1c2VkIHdlIGNhbiBzaWduaWZpY2FudGx5Ci0gICAgICAgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBmb3IgaW5jb21wbGV0ZSBvYmplY3RzLiAgKi8KLSAgICBpbnQgcmVsb2NfY291bnQ7Ci0KLSAgICAvKiBEdXJpbmcgb2JqZWN0IGZpbGUgd3JpdGluZywgdGhlIG9mZnNldCBvZiB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbAotICAgICAgIGluIHRoZSBTT00gc3RyaW5nIHRhYmxlLiAqLwotICAgIGludCBzdHJpbmd0YWJfb2Zmc2V0OwotICB9Ci1zb21fc3ltYm9sX3R5cGU7Ci0KLS8qIEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIHRoZSBtYWdpYyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gYSBCRkQncwotICAgcHJpdmF0ZSBkYXRhIHdoaWNoIG5lZWRzIHRvIGJlIGNvcGllZCBkdXJpbmcgYW4gb2JqY29weS9zdHJpcCBydW4uICAqLwotc3RydWN0IHNvbV9leGVjX2RhdGEKLSAgewotICAgIC8qIFNvcnQtb2YgYSBtYWdpYyBudW1iZXIuICBCU0QgdXNlcyBpdCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCi0gICAgICAgbmF0aXZlIGV4ZWN1dGFibGVzIGFuZCBocHV4IGV4ZWN1dGFibGVzLiAgKi8KLSAgICBzaG9ydCBzeXN0ZW1faWQ7Ci0KLSAgICAvKiBNYWdpYyBleGVjIGZsYWdzLiAgVGhlc2UgY29udHJvbCB0aGluZ3MgbGlrZSB3aGV0aGVyIG9yIG5vdAotICAgICAgIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jaW5nIGlzIGFsbG93ZWQgYW5kIHRoZSBsaWtlLiAgKi8KLSAgICBsb25nIGV4ZWNfZmxhZ3M7Ci0KLSAgICAvKiBBZGQgbW9yZSBzdHVmZiBoZXJlIGFzIG5lZWRlZC4gIEdvb2QgZXhhbXBsZXMgb2YgaW5mb3JtYXRpb24KLSAgICAgICB3ZSBtaWdodCB3YW50IHRvIHBhc3Mgd291bGQgYmUgcHJlc3VtZWRfZHAsIGVudHJ5XyogYW5kIG1heWJlCi0gICAgICAgb3RoZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVyLiAgKi8KLSAgfTsKLQotc3RydWN0IHNvbWRhdGEKLSAgewotICAgIC8qIEFsbCB0aGUgbWFnaWMgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhlY3V0YWJsZSB3aGljaCBsaXZlcwotICAgICAgIGluIHRoZSBwcml2YXRlIEJGRCBzdHJ1Y3R1cmUgYW5kIG5lZWRzIHRvIGJlIGNvcGllZCBmcm9tCi0gICAgICAgdGhlIGlucHV0IGJmZCB0byB0aGUgb3V0cHV0IGJmZCBkdXJpbmcgYSBvYmpjb3B5L3N0cmlwLiAgKi8KLSAgICBzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqZXhlY19kYXRhOwotCi0gICAgLyogVGhlc2UgdGhyZWUgZmllbGRzIGFyZSBvbmx5IHVzZWQgd2hlbiB3cml0aW5nIGZpbGVzIGFuZCBhcmUKLSAgICAgICBnZW5lcmF0ZWQgZnJvbSBzY3JhdGNoLiAgVGhleSBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkKLSAgICAgICBvciBzdHJpcCB0byB3b3JrLiAgKi8KLSAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgICBzdHJ1Y3QgY29weXJpZ2h0X2F1eF9oZHIgKmNvcHlyaWdodF9hdXhfaGRyOwotICAgIHN0cnVjdCB1c2VyX3N0cmluZ19hdXhfaGRyICp2ZXJzaW9uX2F1eF9oZHI7Ci0gICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZHI7Ci0gICAgQ09NUFVOSVQgKmNvbXBfdW5pdDsKLQotICAgIC8qIFBvaW50ZXJzIHRvIGEgc2F2ZWQgY29weSBvZiB0aGUgc3ltYm9sIGFuZCBzdHJpbmcgdGFibGVzLiAgVGhlc2UKLSAgICAgICBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkgb3Igc3RyaXAgdG8gd29yay4gICovCi0gICAgc29tX3N5bWJvbF90eXBlICpzeW10YWI7Ci0gICAgY2hhciAqc3RyaW5ndGFiOwotICAgIGFzeW1ib2wgKipzb3J0ZWRfc3ltczsKLQotICAgIC8qIFdlIHJlbWVtYmVyIHRoZXNlIG9mZnNldHMgc28gdGhhdCBhZnRlciBjaGVja19maWxlX2Zvcm1hdCwgd2UgaGF2ZQotICAgICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLgotICAgICAgIFRoZXNlIG9mZnNldHMgbmVlZCBub3QgYmUgY29waWVkIGZvciBvYmpjb3B5IG9yIHN0cmlwIHRvIHdvcmsuICAqLwotCi0gICAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0gICAgZmlsZV9wdHIgc3RyX2ZpbGVwb3M7Ci0gICAgZmlsZV9wdHIgcmVsb2NfZmlsZXBvczsKLSAgICB1bnNpZ25lZCBzdHJpbmd0YWJfc2l6ZTsKLSAgfTsKLQotc3RydWN0IHNvbV9kYXRhX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IHNvbWRhdGEgYTsKLSAgfTsKLQotLyogU3Vic3RydWN0dXJlIG9mIHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0IHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbgotICAgd2hpY2ggY2FuJ3QgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGdlbmVyaWMgQkZEIHNlY3Rpb24gc3RydWN0dXJlLAotICAgYnV0IHdoaWNoIG11c3QgYmUgY29waWVkIGR1cmluZyBvYmpjb3B5IG9yIHN0cmlwLiAgKi8KLXN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdAotICB7Ci0gICAgLyogVmFyaW91cyBmaWVsZHMgaW4gc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMgdGhhdCB3ZSBuZWVkCi0gICAgICAgdG8gcGFzcyBhcm91bmQuICAqLwotICAgIHVuc2lnbmVkIGludCBzb3J0X2tleSA6IDg7Ci0gICAgdW5zaWduZWQgaW50IGFjY2Vzc19jb250cm9sX2JpdHMgOiA3OwotICAgIHVuc2lnbmVkIGludCBpc19kZWZpbmVkIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgaXNfcHJpdmF0ZSA6IDE7Ci0gICAgdW5zaWduZWQgaW50IHF1YWRyYW50IDogMjsKLQotICAgIC8qIEZvciBzdWJzcGFjZXMsIHRoaXMgcG9pbnRzIHRvIHRoZSBzZWN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlCi0gICAgICAgc3BhY2UgaW4gd2hpY2ggdGhlIHN1YnNwYWNlIGlzIGNvbnRhaW5lZC4gIEZvciBzcGFjZXMgaXQgcG9pbnRzCi0gICAgICAgYmFjayB0byB0aGUgc2VjdGlvbiBmb3IgdGhpcyBzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKmNvbnRhaW5lcjsKLQotICAgIC8qIFRoZSB1c2VyLXNwZWNpZmllZCBzcGFjZSBudW1iZXIuICBJdCBpcyB3cm9uZyB0byB1c2UgdGhpcyBhcwotICAgICAgIGFuIGluZGV4IHNpbmNlIGR1cGxpY2F0ZXMgYW5kIGhvbGVzIGFyZSBhbGxvd2VkLiAgKi8KLSAgICBpbnQgc3BhY2VfbnVtYmVyOwotCi0gICAgLyogQWRkIG1vcmUgc3R1ZmYgaGVyZSBhcyBuZWVkZWQuICBHb29kIGV4YW1wbGVzIG9mIGluZm9ybWF0aW9uCi0gICAgICAgd2UgbWlnaHQgd2FudCB0byBwYXNzIHdvdWxkIGJlIGluaXRpYWxpemF0aW9uIHBvaW50ZXJzLCAKLSAgICAgICBhbmQgdGhlIG1hbnkgc3Vic3BhY2UgZmxhZ3Mgd2UgZG8gbm90IHJlcHJlc2VudCB5ZXQuICAqLwotICB9OwotCi0vKiBVc2VkIHRvIGtlZXAgZXh0cmEgU09NIHNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIHNlY3Rpb24uCi0KLSAgIHJlbG9jX3NpemUgaG9sZHMgdGhlIHNpemUgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtLCBub3RlIHRoaXMKLSAgIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyBhcyBTT00gcmVsb2NhdGlvbnMKLSAgIGFyZSB2YXJpYWJsZSBsZW5ndGguIAotCi0gICByZWxvY19zdHJlYW0gaXMgdGhlIGFjdHVhbCBzdHJlYW0gb2YgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLQotc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKmNvcHlfZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQgcmVsb2Nfc2l6ZTsKLSAgICBjaGFyICpyZWxvY19zdHJlYW07Ci0gICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICpzcGFjZV9kaWN0OwotICAgIHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqc3Vic3BhY2VfZGljdDsKLSAgfTsKLQotI2RlZmluZSBzb21kYXRhKGJmZCkJCQkoKGJmZCktPnRkYXRhLnNvbV9kYXRhLT5hKQotI2RlZmluZSBvYmpfc29tX2V4ZWNfZGF0YShiZmQpCQkoc29tZGF0YShiZmQpLmV4ZWNfZGF0YSkKLSNkZWZpbmUgb2JqX3NvbV9maWxlX2hkcihiZmQpCQkoc29tZGF0YShiZmQpLmZpbGVfaGRyKQotI2RlZmluZSBvYmpfc29tX2V4ZWNfaGRyKGJmZCkJCShzb21kYXRhKGJmZCkuZXhlY19oZHIpCi0jZGVmaW5lIG9ial9zb21fY29weXJpZ2h0X2hkcihiZmQpCShzb21kYXRhKGJmZCkuY29weXJpZ2h0X2F1eF9oZHIpCi0jZGVmaW5lIG9ial9zb21fdmVyc2lvbl9oZHIoYmZkKQkoc29tZGF0YShiZmQpLnZlcnNpb25fYXV4X2hkcikKLSNkZWZpbmUgb2JqX3NvbV9jb21waWxhdGlvbl91bml0KGJmZCkJKHNvbWRhdGEoYmZkKS5jb21wX3VuaXQpCi0jZGVmaW5lIG9ial9zb21fc3ltdGFiKGJmZCkJCShzb21kYXRhKGJmZCkuc3ltdGFiKQotI2RlZmluZSBvYmpfc29tX3N0cmluZ3RhYihiZmQpCQkoc29tZGF0YShiZmQpLnN0cmluZ3RhYikKLSNkZWZpbmUgb2JqX3NvbV9zeW1fZmlsZXBvcyhiZmQpCShzb21kYXRhKGJmZCkuc3ltX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc3RyX2ZpbGVwb3MoYmZkKQkoc29tZGF0YShiZmQpLnN0cl9maWxlcG9zKQotI2RlZmluZSBvYmpfc29tX3N0cmluZ3RhYl9zaXplKGJmZCkJKHNvbWRhdGEoYmZkKS5zdHJpbmd0YWJfc2l6ZSkKLSNkZWZpbmUgb2JqX3NvbV9yZWxvY19maWxlcG9zKGJmZCkJKHNvbWRhdGEoYmZkKS5yZWxvY19maWxlcG9zKQotI2RlZmluZSBvYmpfc29tX3NvcnRlZF9zeW1zKGJmZCkJKHNvbWRhdGEoYmZkKS5zb3J0ZWRfc3ltcykKLSNkZWZpbmUgc29tX3NlY3Rpb25fZGF0YShzZWMpIFwKLSAgKChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKilzZWMtPnVzZWRfYnlfYmZkKQotI2RlZmluZSBzb21fc3ltYm9sX2RhdGEoc3ltYm9sKQkJKChzb21fc3ltYm9sX3R5cGUgKikgc3ltYm9sKQotCi0KLS8qIERlZmluZXMgZ3JvdXBzIG9mIGJhc2ljIHJlbG9jYXRpb25zLiAgRklYTUU6ICBUaGVzZSBzaG91bGQKLSAgIGJlIHRoZSBvbmx5IGJhc2ljIHJlbG9jYXRpb25zIGNyZWF0ZWQgYnkgR0FTLiAgVGhlIHJlc3QKLSAgIHNob3VsZCBiZSBpbnRlcm5hbCB0byB0aGUgQkZEIGJhY2tlbmQuCi0KLSAgIFRoZSBpZGVhIGlzIGJvdGggU09NIGFuZCBFTEYgZGVmaW5lIHRoZXNlIGJhc2ljIHJlbG9jYXRpb24KLSAgIHR5cGVzIHNvIHRoZXkgbWFwIGludG8gYSBTT00gb3IgRUxGIHNwZWNpZmljIHJlbG9hdGlvbiBhcwotICAgYXBwcm9wcmlhdGUuICBUaGlzIGFsbG93cyBHQVMgdG8gc2hhcmUgbXVjaCBtb3JlIGNvZGUgCi0gICBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0IGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIFJfSFBQQV9OT05FCQkJUl9OT19SRUxPQ0FUSU9OCi0jZGVmaW5lCVJfSFBQQQkJCQlSX0NPREVfT05FX1NZTUJPTAotI2RlZmluZQlSX0hQUEFfUENSRUxfQ0FMTAkJUl9QQ1JFTF9DQUxMCi0jZGVmaW5lIFJfSFBQQV9BQlNfQ0FMTAkJCVJfQUJTX0NBTEwKLSNkZWZpbmUJUl9IUFBBX0dPVE9GRgkJCVJfRFBfUkVMQVRJVkUKLSNkZWZpbmUgUl9IUFBBX0VOVFJZCQkJUl9FTlRSWQotI2RlZmluZSBSX0hQUEFfRVhJVAkJCVJfRVhJVAotI2RlZmluZSBSX0hQUEFfQ09NUExFWAkJCVJfQ09NUDEKLSNkZWZpbmUgUl9IUFBBX0JFR0lOX0JSVEFCCQlSX0JFR0lOX0JSVEFCCi0jZGVmaW5lIFJfSFBQQV9FTkRfQlJUQUIJCVJfRU5EX0JSVEFCCi0jZGVmaW5lIFJfSFBQQV9CRUdJTl9UUlkJCVJfQkVHSU5fVFJZCi0jZGVmaW5lIFJfSFBQQV9FTkRfVFJZCQkJUl9FTkRfVFJZCi0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucywgbW9zdGx5IGZvciB1c2UgYnkgR0FTLiAgKi8KLWJvb2xlYW4gYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIFBBUkFNUyAoKGFzZWN0aW9uICosIGludCwgaW50LAotCQkJCQkJdW5zaWduZWQgaW50LCBpbnQpKTsKLWJvb2xlYW4gYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIFBBUkFNUyAoKGFzZWN0aW9uICosIGFzZWN0aW9uICosCi0JCQkJCQkgICBpbnQsIHVuc2lnbmVkIGludCwgaW50KSk7Ci12b2lkIGJmZF9zb21fc2V0X3N5bWJvbF90eXBlIFBBUkFNUyAoKGFzeW1ib2wgKiwgdW5zaWduZWQgaW50KSk7Ci1ib29sZWFuIGJmZF9zb21fYXR0YWNoX2F1eF9oZHIgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqKSk7Ci1pbnQgKiogaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIGludCwgaW50LCBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQsCi0JICAgaW50LCBhc3ltYm9sICopKTsKLWJvb2xlYW4gYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLSNlbmRpZiAvKiBfU09NX0ggKi8KZGlmZiAtLWdpdCBhL2JmZC9zcGFyY2xpbnV4LmMgYi9iZmQvc3BhcmNsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2EyOWIzLi4wMDAwMDAwCi0tLSBhL2JmZC9zcGFyY2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBsaW51eCBmbGF2b3JlZCBzcGFyYyBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLVVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAgICAgICAgNDA5NgotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIDEwMjQKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSICAgICAgICAweDAKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fU1BBUkMgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9zcGFyYwotI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbGludXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1saW51eCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKLQotLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0Ci0gICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKLSAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyY2xpbnV4X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjbGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgc3BhcmNsaW51eF9iZmRfZmluYWxfbGluawotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyY2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgc3BhcmNsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMKLS8qIENvZGUgdG8gbGluayBhZ2FpbnN0IExpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLSNpZm5kZWYgR09UX1JFRl9QUkVGSVgKLSNkZWZpbmUgICAgICAgIEdPVF9SRUZfUFJFRklYICAiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAqLwotCi0jaWZuZGVmIFBMVF9SRUZfUFJFRklYCi0jZGVmaW5lICAgICAgICBQTFRfUkVGX1BSRUZJWCAgIl9fUExUXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX1BMVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgUExUX1JFRl9QUkVGSVgsIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFRoaXMgc3RyaW5nIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3BlY2lhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZuZGVmIE5FRURTX1NIUkxJQgotI2RlZmluZSBORUVEU19TSFJMSUIgIl9fTkVFRFNfU0hSTElCXyIKLSNlbmRpZgotCi0vKiBUaGlzIHNwZWNpYWwgc3ltYm9sIGlzIGEgc2V0IHZlY3RvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZgotICAgcG9pbnRlcnMgdG8gZml4dXAgdGFibGVzLiAgSXQgd2lsbCBiZSBwcmVzZW50IGluIGFueSBkeW5hbWljbHkKLSAgIGxpbmtlZCBmaWxlLiAgVGhlIGxpbmtlciBnZW5lcmF0ZWQgZml4dXAgdGFibGUgc2hvdWxkIGFsc28gYmUgYWRkZWQKLSAgIHRvIHRoZSBsaXN0LCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNlY29uZCBzbG90ICh0aGUKLSAgIGZpcnN0IG9uZSBpcyBhIGR1bW15IHdpdGggYSBtYWdpYyBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGluCi0gICBjcnQwLm8pLiAgKi8KLQotI2lmbmRlZiBTSEFSQUJMRV9DT05GTElDVFMKLSNkZWZpbmUgU0hBUkFCTEVfQ09ORkxJQ1RTICJfX1NIQVJBQkxFX0NPTkZMSUNUU19fIgotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFRoZSB0ZXJtaW5vbG9neSBpcyBhIGJpdCBzdHJhbmdlLCBidXQKLSAgIGVhY2ggZml4dXAgY29udGFpbnMgdHdvIDMyIGJpdCBudW1iZXJzLiAgQSByZWd1bGFyIGZpeHVwIGNvbnRhaW5zCi0gICBhbiBhZGRyZXNzIGFuZCBhIHBvaW50ZXIsIGFuZCBhdCBydW50aW1lIHdlIHNob3VsZCBzdG9yZSB0aGUKLSAgIGFkZHJlc3MgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXIuICBBIGJ1aWx0aW4gZml4dXAKLSAgIGNvbnRhaW5zIHR3byBwb2ludGVycywgYW5kIHdlIHNob3VsZCByZWFkIHRoZSBhZGRyZXNzIHVzaW5nIG9uZQotICAgcG9pbnRlciBhbmQgc3RvcmUgaXQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIG90aGVyCi0gICBwb2ludGVyLiAgQnVpbHRpbiBmaXh1cHMgY29tZSBpbnRvIHBsYXkgd2hlbiB3ZSBoYXZlIGR1cGxpY2F0ZQotICAgX19HT1RfXyBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZS4gIFRoZSBidWlsdGluIGZpeHVwIHdpbGwgY29weQotICAgdGhlIEdPVCBwb2ludGVyIGZyb20gb25lIG92ZXIgaW50byB0aGUgb3RoZXIuICAqLwotCi1zdHJ1Y3QgZml4dXAKLXsKLSAgc3RydWN0IGZpeHVwICpuZXh0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSBmaXhlZCwKLSAgICAgemVybyBpZiB0aGlzIGlzIGp1c3QgYSBwb2ludGVyICovCi0gIGNoYXIganVtcDsKLQotICBjaGFyIGJ1aWx0aW47Ci19OwotCi0vKiBXZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5lZWQKLSAgIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIGxpbmtlciBwYXNzZXMsIHNvIHdlIHVzZSBhIHNwZWNpYWwKLSAgIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBGaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiBsaW5rLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0KLSAgLyogTnVtYmVyIG9mIGZpeHVwcy4gICovCi0gIHNpemVfdCBmaXh1cF9jb3VudDsKLQotICAvKiBOdW1iZXIgb2YgYnVpbHRpbiBmaXh1cHMuICAqLwotICBzaXplX3QgbG9jYWxfYnVpbHRpbnM7Ci0KLSAgLyogTGlzdCBvZiBmaXh1cHMuICAqLwotICBzdHJ1Y3QgZml4dXAgKmZpeHVwX2xpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpsaW51eF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGZpeHVwICpuZXdfZml4dXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLAotICAgICAgICAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0gICAgICAgICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF90YWxseV9zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbGludXhfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0gICAgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICAgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHM7IHRoZXJlIGFyZW4ndCBhbnkuICAqLwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1saW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXhfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+ZHlub2JqID0gTlVMTDsKLSAgcmV0LT5maXh1cF9jb3VudCA9IDA7Ci0gIHJldC0+bG9jYWxfYnVpbHRpbnMgPSAwOwotICByZXQtPmZpeHVwX2xpc3QgPSBOVUxMOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGFvdXRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pICAgICAgICAgICAgICAgICAgICBcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICgmKHRhYmxlKS0+cm9vdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwgXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBmaXh1cCkpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHJldHVybiBmOwotICBmLT5uZXh0ID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0gIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0ID0gZjsKLSAgZi0+aCA9IGg7Ci0gIGYtPnZhbHVlID0gdmFsdWU7Ci0gIGYtPmJ1aWx0aW4gPSBidWlsdGluOwotICBmLT5qdW1wID0gMDsKLSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0gIHJldHVybiBmOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSByZWFsaXplIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGxpbmsgdG8gYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotICAgZml4dXAgdGFibGUsIGFuZCB3ZSB1bHRpbWF0ZWx5IG5lZWQgdG8gYWRkIGEgcG9pbnRlciB0byB0aGlzIGludG8KLSAgIHRoZSBzZXQgdmVjdG9yIGZvciBTSEFSQUJMRV9DT05GTElDVFMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdAotICAga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgYnV0IHRoYXQncyBPSyAtIHdlIGp1c3QgbmVlZCB0bwotICAgY3JlYXRlIGl0IGZvciBub3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGluc2VydDsKLQotICAvKiBMb29rIHVwIGFuZCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLgotICAgICBJZiB3ZSBkbywgYW5kIHRoZSBkZWZpbmluZyBlbnRyeSBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHdlCi0gICAgIG5lZWQgdG8gY3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zLgotCi0gICAgIEZJWE1FOiBXaGF0IGlmIGFiZmQtPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcj8gIFdlIG1heSB3YW50IHRvCi0gICAgIGJlIGFibGUgdG8gbGluayBMaW51eCBhLm91dCBhbmQgRUxGIG9iamVjdHMgdG9nZXRoZXIsIGJ1dCBzZXJpb3VzCi0gICAgIGNvbmZ1c2lvbiBpcyBwb3NzaWJsZS4gICovCi0KLSAgaW5zZXJ0ID0gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgU0hBUkFCTEVfQ09ORkxJQ1RTKSA9PSAwCi0gICAgICAmJiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBpZiAoISBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgICAgIGluc2VydCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0gICAgICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICAgICB7Ci0gICAgICAgICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLSAgICAgICAgIGlmIChoYXNocCAhPSBOVUxMKQotICAgICAgICAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotICAgICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsICEgSVNfUExUX1NZTSAobmFtZSkpOwotICAgICAgICAgaWYgKGYgPT0gTlVMTCkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgZi0+anVtcCA9IElTX1BMVF9TWU0gKG5hbWUpOwotCi0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICB9Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotICAgICAgICBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICAgICAgICAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLSAgICAgICAgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotICAgICAgICAgICAgICAgICBzaXplb2YgTkVFRFNfU0hSTElCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciAqcDsKLSAgICAgIGNoYXIgKmFsbG9jID0gTlVMTDsKLQotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyArIHNpemVvZiBORUVEU19TSFJMSUIgLSAxOwotICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICdfJyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotICAgICAgIGFsbG9jID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICBpZiAocCA9PSBOVUxMIHx8IGFsbG9jID09IE5VTEwpCi0gICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotICAgICAgICAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotICAgICAgICAgKnArKyA9ICdcMCc7Ci0gICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotICAgICAgICAgICAgYWxsb2MsIHApOwotICAgICAgICAgZnJlZSAoYWxsb2MpOwotICAgICAgIH0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdAotICAgICBpdC4gICovCi0gIGlzX3BsdCA9IElTX1BMVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgaWYgKGlzX3BsdCB8fCBJU19HT1RfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpKQotICAgIHsKLSAgICAgIC8qIExvb2sgdXAgdGhpcyBzeW1ib2wgdHdpY2UuICBPbmNlIGp1c3QgYXMgYSByZWd1bGFyIGxvb2t1cCwKLSAgICAgICAgYW5kIHRoZW4gYWdhaW4gZm9sbG93aW5nIGFsbCBvZiB0aGUgaW5kaXJlY3QgbGlua3MgdW50aWwgd2UKLSAgICAgICAgcmVhY2ggYSByZWFsIHN5bWJvbC4gICovCi0gICAgICBoMSA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgLyogaDIgZG9lcyBub3QgZm9sbG93IGluZGlyZWN0IHN5bWJvbHMuICovCi0gICAgICBoMiA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogVGhlIHJlYWwgc3ltYm9sIG11c3QgZXhpc3QgYnV0IGlmIGl0IGlzIGFsc28gYW4gQUJTIHN5bWJvbCwKLSAgICAgICAgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgZml4dXAuICBUaGlzIGlzIGJlY2F1c2UgdGhleSBib3RoCi0gICAgICAgIGNhbWUgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LiAgSWYgb24gdGhlIG90aGVyIGhhbmQsIHdlIGhhZCB0bwotICAgICAgICB1c2UgYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGdldCB0byB0aGUgcmVhbCBzeW1ib2wsIHdlIGFkZCB0aGUKLSAgICAgICAgZml4dXAgYW55d2F5LCBzaW5jZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlc2Ugc3ltYm9scyBjb21lCi0gICAgICAgIGZyb20gZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICAgIGlmIChoMSAhPSBOVUxMCi0gICAgICAgICAmJiAoKChoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgICB8fCBoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgICAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaDEtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLSAgICAgICAgICAgICB8fCBoMi0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkpCi0gICAgICAgewotICAgICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGEgImJ1aWx0aW4iIGZpeHVwIGFscmVhZHkgcHJlc2VudAotICAgICAgICAgICAgaW52b2x2aW5nIHRoaXMgc3ltYm9sLiAgSWYgc28sIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyCi0gICAgICAgICAgICBmaXh1cC4gIEluIHRoZSBlbmQsIHRoaXMgcmVsYXhlcyBzb21lIG9mIHRoZSByZXF1aXJlbWVudHMKLSAgICAgICAgICAgIGFib3V0IHRoZSBvcmRlciBvZiBwZXJmb3JtaW5nIGZpeHVwcy4gICovCi0gICAgICAgICBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgIGZvciAoZjEgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgICAgICAgICAgICAgZjEgIT0gTlVMTDsKLSAgICAgICAgICAgICAgZjEgPSBmMS0+bmV4dCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGlmICgoZjEtPmggIT0gaCAmJiBmMS0+aCAhPSBoMSkKLSAgICAgICAgICAgICAgICAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICBpZiAoZjEtPmggPT0gaDEpCi0gICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgaWYgKCEgZXhpc3RzCi0gICAgICAgICAgICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgZjEtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0gICAgICAgICAgICAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZjEtPmggPSBoMTsKLSAgICAgICAgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLSAgICAgICAgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0gICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgICAgaWYgKCEgZXhpc3RzCi0gICAgICAgICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLSAgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0gICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgIC8qIFF1aWNrIGFuZCBkaXJ0eSB3YXkgb2Ygc3RyaXBwaW5nIHRoZXNlIHN5bWJvbHMgZnJvbSB0aGUKLSAgICAgICAgc3ltdGFiLiAqLwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgIGgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIC5saW51eC1keW5hbWljIHNlY3Rpb24gaXMuCi0gICBJdCBpcyBjYWxsZWQgYnkgdGhlIExpbnV4IGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24KLSAgIHJvdXRpbmUuICBXZSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgYW5kIG5vdwotICAgd2UganVzdCBzY2FuIHRoZSBoYXNoIHRhYmxlcyB0byBmaW5kIG91dCBob3cgbWFueSBhZGRpdGlvbmFsIGZpeHVwcwotICAgYXJlIHJlcXVpcmVkLiAgKi8KLQotYm9vbGVhbgotYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0IGZpbmQgdGhlIGZpeHVwcy4uLiAqLwotICBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXhfdGFsbHlfc3ltYm9scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLSAgICAgICB7Ci0gICAgICAgICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgICAgICAgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZml4dXAgdGFibGUuICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT5fcmF3X3NpemUgPSA4ICsgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICogODsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSBhcmUgcmVhZHkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGZpeHVwIHRhYmxlIHRvCi0gICB0aGUgb3V0cHV0IGZpbGUuICBTY2FuIHRoZSBmaXh1cCB0YWJsZXMgYW5kIHNvIGZvcnRoIGFuZCBnZW5lcmF0ZQotICAgdGhlIHN0dWZmIHdlIG5lZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfZmluaXNoX2R5bmFtaWNfbGluayAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnMsICpvcywgKmlzOwotICBiZmRfYnl0ZSAqZml4dXBfdGFibGU7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgdW5zaWduZWQgaW50IG5ld19hZGRyOwotICBpbnQgc2VjdGlvbl9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBmaXh1cHNfd3JpdHRlbjsKLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwKLSAgICAgICAgIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLSAgICAgICAgIG9zLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGZpeHVwX3RhYmxlID0gcy0+Y29udGVudHM7Ci0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCwgZml4dXBfdGFibGUpOwotICBmaXh1cF90YWJsZSArPSA0OwotCi0gIC8qIEZpbGwgaW4gZml4dXAgdGFibGUuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLSAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgIHsKLSAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotICAgICAgICAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgIH0KLQotICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJGaXh1cCglZCkgJXM6ICV4ICV4XG4iLGYtPmp1bXAsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICBpZiAoZi0+anVtcCkKLSAgICAgICB7Ci0gICAgICAgICAvKiBSZWxhdGl2ZSBhZGRyZXNzICovCi0gICAgICAgICBuZXdfYWRkciA9IG5ld19hZGRyIC0gKGYtPnZhbHVlICsgNSk7Ci0JIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUgKyAxLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgIH0KLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIG1hcmtlciBzbyB3ZSBrbm93IHRvIHN3aXRjaCB0byB0aGUgb3RoZXIgdHlwZSBvZiBmaXh1cCAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgICAgewotICAgICAgICAgaWYgKCEgZi0+YnVpbHRpbikKLSAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0gICAgICAgICAgICAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgICAgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLSAgICAgICAgICAgICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgICB9Ci0gIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICE9IGZpeHVwc193cml0dGVuKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIpKTsKLSAgICAgIHdoaWxlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiBmaXh1cHNfd3JpdHRlbikKLSAgICAgICB7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICAgfQotICAgIH0KLQotICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGlzID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiQnVpbHRpbiBmaXh1cCB0YWJsZSBhdCAleFxuIiwgbmV3X2FkZHIpOwotI2VuZGlmCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbHlueC5jIGIvYmZkL3NwYXJjbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZjYWU1Li4wMDAwMDAwCi0tLSBhL2JmZC9zcGFyY2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgU3BhcmMgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0KLSNlbmRpZgotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1seW54IgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJhb3V0L3N1bjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLS8qIFRoaXMgaXMgbmVlZGVkIHRvIHJlamVjdCBhIE5ld3NPUyBmaWxlLCBlLmcuIGluCi0gICBnZGIvdGVzdHN1aXRlL2dkYi50MTAvY3Jvc3Nsb2FkLmV4cC4gPGtpbmdkb25AY3lnbnVzLmNvbT4KLSAgIEkgbmVlZGVkIHRvIGFkZCBNX1VOS05PV04gdG8gcmVjb2duaXplIGEgNjgwMDAgb2JqZWN0LCBzbyB0aGlzIHdpbGwKLSAgIHByb2JhYmx5IG5vIGxvbmdlciByZWplY3QgYSBOZXdzT1Mgb2JqZWN0LiAgPGlhbkBjeWdudXMuY29tPi4gKi8KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fVU5LTk9XTiBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNXzY4MDEwIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fNjgwMjAgXAotCQkJICAgIHx8IChtdHlwZSkgPT0gTV9TUEFSQykKLQotLyoKLVRoZSBmaWxlIEBjb2Rle2FvdXRmMS5ofSBjb250YWlucyB0aGUgY29kZSBmb3IgQkZEJ3MKLWEub3V0IGJhY2sgZW5kLiBDb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBiYWNrIGVuZCBpcyBnaXZlbiBieSB0aGVzZQotdHdvIHByZXByb2Nlc3NvciBuYW1lczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gQVJDSF9TSVpFCi1UaGlzIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgMzIgb3IgNjQsIGRlcGVuZGluZyB1cG9uIHRoZSBzaXplIG9mIGFuCi1pbnQgaW4gdGhlIHRhcmdldCBmb3JtYXQuIEl0IGNoYW5nZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3RzIHdoaWNoCi1wZXJmb3JtIHRoZSBtZW1vcnkvZGlzayBtYXBwaW5nIG9mIHN0cnVjdHVyZXMuCi0KLVRoZSA2NCBiaXQgYmFja2VuZCBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBob3N0IGNvbXBpbGVyIHN1cHBvcnRzIDY0Ci1pbnRzIChlZyBsb25nIGxvbmcgd2l0aCBnY2MpLCBieSBkZWZpbmluZyB0aGUgbmFtZSBAY29kZXtCRkRfSE9TVF82NF9CSVR9IGluIEBjb2Rle2JmZC5ofS4KLVdpdGggdGhpcyBuYW1lIGRlZmluZWQsIEBlbXBoe2FsbH0gYmZkIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoIDY0Yml0Ci1hcml0aG1ldGljLCBub3QganVzdCB0aG9zZSB0byBhIDY0Yml0IHRhcmdldC4KLQotQGl0ZW0gVEFSR0VUTkFNRQotVGhlIG5hbWUgcHV0IGludG8gdGhlIHRhcmdldCB2ZWN0b3IuCi1AaXRlbQotQGVuZCB0YWJsZQotCi0qLwotCi0vKlNVUFBSRVNTNTU4Ki8KLS8qU1VQUFJFU1M1MjkqLwotCi12b2lkCi1OQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkgKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgbG9uZyBtYWNoaW5lOwotICBzd2l0Y2ggKG1hY2h0eXBlKQotICAgIHsKLQotICAgIGNhc2UgTV9VTktOT1dOOgotICAgICAgLyogU29tZSBTdW4zcyBtYWtlIG1hZ2ljIG51bWJlcnMgd2l0aG91dCBjcHUgdHlwZXMgaW4gdGhlbSwgc28KLQkgd2UnbGwgZGVmYXVsdCB0byB0aGUgNjgwMDAuICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAxMDoKLSAgICBjYXNlIE1fSFAyMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAyMDoKLSAgICBjYXNlIE1fSFAzMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMzg2OgotICAgIGNhc2UgTV8zODZfRFlOSVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMjlLOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2EyOWs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0hQVVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAotICBOQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIGNob29zZV9yZWxvY19zaXplKEFCRkQpOwotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZSBpbiBMeW54T1MgZm9ybWF0LgotICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDEwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMjlLKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIH0KLQotICBjaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCk7Ci0KLSAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7Ci0KLSAgV1JJVEVfSEVBREVSUyAoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3NldF9zaXplcyBzcGFyY2x5bnhfc2V0X3NpemVzCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNseW54X3NldF9zaXplcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgc3BhcmNseW54X2FvdXRfYmFja2VuZCA9Ci17Ci0gIDAsIDEsIDAsIDEsIDAsIHNwYXJjbHlueF9zZXRfc2l6ZXMsIDAsCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQwKLQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCU5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEJCQkmc3BhcmNseW54X2FvdXRfYmFja2VuZAotCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcGFyY25ldGJzZC5jIGIvYmZkL3NwYXJjbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzdiYjguLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9zcGFyYyBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLS8qIFNQQVJDIGNoaXBzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCi0gICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gZWl0aGVyIG9uZS4gKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDIwMDAKLQotI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfc3BhcmMKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fU1BBUkNfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY25ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcmVjLmMgYi9iZmQvc3JlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWZkYzY0Li4wMDAwMDAwCi0tLSBhL2JmZC9zcmVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzgxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igcy1yZWNvcmQgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TVUJTRUNUSU9OCi0JUy1SZWNvcmQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQkKLQlPcmRpbmFyeSBTLVJlY29yZHMgY2Fubm90IGhvbGQgYW55dGhpbmcgYnV0IGFkZHJlc3NlcyBhbmQKLQlkYXRhLCBzbyB0aGF0J3MgYWxsIHRoYXQgd2UgaW1wbGVtZW50LgotCi0JVGhlIG9ubHkgaW50ZXJlc3RpbmcgdGhpbmcgaXMgdGhhdCBTLVJlY29yZHMgbWF5IGNvbWUgb3V0IG9mCi0Jb3JkZXIgYW5kIHRoZXJlIGlzIG5vIGhlYWRlciwgc28gYW4gaW5pdGlhbCBzY2FuIGlzIHJlcXVpcmVkCi0JdG8gZGlzY292ZXIgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWRkcmVzc2VzIHVzZWQgdG8gY3JlYXRlCi0JdGhlIHZtYSBhbmQgc2l6ZSBvZiB0aGUgb25seSBzZWN0aW9uIHdlIGNyZWF0ZS4gIFdlCi0JYXJiaXRyYXJpbHkgY2FsbCB0aGlzIHNlY3Rpb24gIi50ZXh0Ii4KLQotCVdoZW4gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIGlzIGNhbGxlZCB0aGUgZmlsZSBpcyByZWFkCi0JYWdhaW4sIGFuZCB0aGlzIHRpbWUgdGhlIGRhdGEgaXMgcGxhY2VkIGludG8gYSBiZmRfYWxsb2MnZAotCWFyZWEuCi0KLQlBbnkgbnVtYmVyIG9mIHNlY3Rpb25zIG1heSBiZSBjcmVhdGVkIGZvciBvdXRwdXQsIHdlIHNhdmUgdGhlbQotCXVwIGFuZCBvdXRwdXQgdGhlbSB3aGVuIGl0J3MgdGltZSB0byBjbG9zZSB0aGUgYmZkLgotCi0JQW4gcyByZWNvcmQgbG9va3MgbGlrZToKLQkKLUVYQU1QTEUKLQlTPHR5cGU+PGxlbmd0aD48YWRkcmVzcz48ZGF0YT48Y2hlY2tzdW0+Ci0JCi1ERVNDUklQVElPTgotCVdoZXJlCi0JbyBsZW5ndGgKLQlpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvbGxvd2luZyB1cHRvIHRoZSBjaGVja3N1bS4gTm90ZSB0aGF0Ci0JdGhpcyBpcyBub3QgdGhlIG51bWJlciBvZiBjaGFycyBmb2xsb3dpbmcsIHNpbmNlIGl0IHRha2VzIHR3bwotCWNoYXJzIHRvIHJlcHJlc2VudCBhIGJ5dGUuCi0JbyB0eXBlCi0JaXMgb25lIG9mOgotCTApIGhlYWRlciByZWNvcmQKLQkxKSB0d28gYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JMikgdGhyZWUgYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JMykgZm91ciBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKLQk3KSBmb3VyIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQk4KSB0aHJlZSBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCi0JOSkgdHdvIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQkKLQlvIGFkZHJlc3MKLQlpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBmb2xsb3dpbmcsIG9yIGluIHRoZSBjYXNlIG9mCi0JYSB0ZXJtaW5hdGlvbiByZWNvcmQsIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBpbWFnZQotCW8gZGF0YQotCWlzIHRoZSBkYXRhLgotCW8gY2hlY2tzdW0KLQlpcyB0aGUgc3VtIG9mIGFsbCB0aGUgcmF3IGJ5dGUgZGF0YSBpbiB0aGUgcmVjb3JkLCBmcm9tIHRoZSBsZW5ndGgKLQl1cHdhcmRzLCBtb2R1bG8gMjU2IGFuZCBzdWJ0cmFjdGVkIGZyb20gMjU1LgotCi0KLVNVQlNFQ1RJT04KLQlTeW1ib2wgUy1SZWNvcmQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQlTb21lIElDRSBlcXVpcG1lbnQgdW5kZXJzdGFuZHMgYW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCi0JUy1SZWNvcmQgZm9ybWF0OyBzeW1ib2xzIGFuZCB0aGVpciBhZGRyZXNzZXMgY2FuIGJlIHNlbnQKLQliZWZvcmUgdGhlIGRhdGEuCi0KLQlUaGUgZm9ybWF0IG9mIHRoaXMgaXM6Ci0JKCQkIDxtb2R1bGVuYW1lPgotCQkoPHNwYWNlPiA8c3ltYm9sPiA8YWRkcmVzcz4pKikKLQkkJAotCi0Jc28gYSBzaG9ydCBzeW1ib2wgdGFibGUgY291bGQgbG9vayBsaWtlOgotCi1FWEFNUExFCi0JJCQgZmxhc2gueAotCSQkIGZsYXNoLmMKLQkgIF9wb3J0NiAkMAotCSAgX2RlbGF5ICQ0Ci0JICBfc3RhcnQgJDE0Ci0JICBfZXRleHQgJDgwMzYKLQkgIF9lZGF0YSAkODAzNgotIAkgIF9lbmQgJDgwMzYKLQkkJAotCi1ERVNDUklQVElPTgotCVdlIGFsbG93IHN5bWJvbHMgdG8gYmUgYW55d2hlcmUgaW4gdGhlIGRhdGEgc3RyZWFtIC0gdGhlIG1vZHVsZSBuYW1lcwotCWFyZSBhbHdheXMgaWdub3JlZC4KLQkJCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIHZvaWQgc3JlY19nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIHZvaWQgc3JlY19wcmludF9zeW1ib2wKLSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIHZvaWQgc3JlY19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc3JlY19nZXRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBzcmVjX2JhZF9ieXRlIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zY2FuIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3JlY19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnN5bWJvbHNyZWNfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGJmZF92bWEsCi0JCQkJCSAgY29uc3QgYmZkX2J5dGUgKiwKLQkJCQkJICBjb25zdCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX25ld19zeW1ib2wgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzcmVjX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYXN5bWJvbCAqc3JlY19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzcmVjX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLQotLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gaGV4IGFuZCBiaW5hcnkuICovCi0KLXN0YXRpYyBDT05TVCBjaGFyIGRpZ3NbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotI2RlZmluZSBOSUJCTEUoeCkgaGV4X3ZhbHVlKHgpCi0jZGVmaW5lIEhFWChidWZmZXIpICgoTklCQkxFKChidWZmZXIpWzBdKTw8NCkgKyBOSUJCTEUoKGJ1ZmZlcilbMV0pKQotI2RlZmluZSBUT0hFWChkLCB4LCBjaCkgXAotCWRbMV0gPSBkaWdzWyh4KSAmIDB4Zl07IFwKLQlkWzBdID0gZGlnc1soKHgpPj40KSYweGZdOyBcCi0JY2ggKz0gKCh4KSAmIDB4ZmYpOwotI2RlZmluZQlJU0hFWCh4KSAgaGV4X3AoeCkKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gKi8KLQotc3RhdGljIHZvaWQKLXNyZWNfaW5pdCAoKQotewotICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQgPSBmYWxzZTsKLQotICBpZiAoaW5pdGVkID09IGZhbHNlKQotICAgIHsKLSAgICAgIGluaXRlZCA9IHRydWU7Ci0gICAgICBoZXhfaW5pdCAoKTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvbiBhIGxpbmUgaXMgRkYgKi8KLSNkZWZpbmUgTUFYQ0hVTksgMHhmZgotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBmaXQgb250byBhIGxpbmUgb24gb3V0cHV0ICovCi0jZGVmaW5lIENIVU5LIDIxCi0KLS8qIFdoZW4gd3JpdGluZyBhbiBTLXJlY29yZCBmaWxlLCB0aGUgUy1yZWNvcmRzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIHRoZW0gaW4gbWVtb3J5LiAgKi8KLQotc3RydWN0IHNyZWNfZGF0YV9saXN0X3N0cnVjdAotewotICBzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0ICpuZXh0OwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSB3aGVyZTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0IHNyZWNfZGF0YV9saXN0X3R5cGU7Ci0KLS8qIFdoZW4gc2Nhbm5pbmcgdGhlIFMtcmVjb3JkIGZpbGUsIGEgbGlua2VkIGxpc3Qgb2Ygc3JlY19zeW1ib2wKLSAgIHN0cnVjdHVyZXMgaXMgYnVpbHQgdG8gcmVwcmVzZW50IHRoZSBzeW1ib2wgdGFibGUgKGlmIHRoZXJlIGlzCi0gICBvbmUpLiAgKi8KLQotc3RydWN0IHNyZWNfc3ltYm9sCi17Ci0gIHN0cnVjdCBzcmVjX3N5bWJvbCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBUaGUgUy1yZWNvcmQgdGRhdGEgaW5mb3JtYXRpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzcmVjX2RhdGFfbGlzdF90eXBlICpoZWFkOwotICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKnRhaWw7Ci0gICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgc3RydWN0IHNyZWNfc3ltYm9sICpzeW1ib2xzOwotICAgIHN0cnVjdCBzcmVjX3N5bWJvbCAqc3ltdGFpbDsKLSAgICBhc3ltYm9sICpjc3ltYm9sczsKLSAgfQotdGRhdGFfdHlwZTsKLQotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCB0ZGF0YV90eXBlICosCi0JCQkJCSAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV90ZXJtaW5hdG9yIFBBUkFNUyAoKGJmZCAqLCB0ZGF0YV90eXBlICopKTsKLQotLyogU2V0IHVwIHRoZSBTLXJlY29yZCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYWJmZC0+dGRhdGEuc3JlY19kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+dHlwZSA9IDE7Ci0gICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+c3ltYm9scyA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+c3ltdGFpbCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+Y3N5bWJvbHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIGJ5dGUgZnJvbSBhbiBTIHJlY29yZCBmaWxlLiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvcgotICAgb2NjdXJyZWQuICBSZXR1cm4gRU9GIG9uIGVycm9yIG9yIGVuZCBvZiBmaWxlLiAgKi8KLQotc3RhdGljIGludAotc3JlY19nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Ci17Ci0gIGJmZF9ieXRlIGM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JKmVycm9ycHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotCi0gIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOwotfQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIFMgcmVjb3JkIGZpbGUuICBGSVhNRTogVGhpcyBwcm9iYWJseSBzaG91bGQKLSAgIG5vdCBjYWxsIGZwcmludGYsIGJ1dCB3ZSByZWFsbHkgZG8gbmVlZCBzb21lIG1lY2hhbmlzbSBmb3IgcHJpbnRpbmcKLSAgIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgaW50IGM7Ci0gICAgIGJvb2xlYW4gZXJyb3I7Ci17Ci0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBpZiAoISBlcnJvcikKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKCEgaXNwcmludCAoYykpCi0Jc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYzsKLQkgIGJ1ZlsxXSA9ICdcMCc7Ci0JfQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiVkOiBVbmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIFMtcmVjb3JkIGZpbGVcbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCBidWYpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgfQotfQotCi0vKiBBZGQgYSBuZXcgc3ltYm9sIGZvdW5kIGluIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19uZXdfc3ltYm9sIChhYmZkLCBuYW1lLCB2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzcmVjX3N5bWJvbCAqbjsKLQotICBuID0gKHN0cnVjdCBzcmVjX3N5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNyZWNfc3ltYm9sKSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT52YWwgPSB2YWw7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scyA9PSBOVUxMKQotICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scyA9IG47Ci0gIGVsc2UKLSAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bXRhaWwtPm5leHQgPSBuOwotICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bXRhaWwgPSBuOwotICBuLT5uZXh0ID0gTlVMTDsKLQotICArK2FiZmQtPnN5bWNvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIHRoZSBTIHJlY29yZCBmaWxlIGFuZCB0dXJuIGl0IGludG8gc2VjdGlvbnMuICBXZSBjcmVhdGUgYSBuZXcKLSAgIHNlY3Rpb24gZm9yIGVhY2ggY29udGlndW91cyBzZXQgb2YgYnl0ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19zY2FuIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjOwotICB1bnNpZ25lZCBpbnQgbGluZW5vID0gMTsKLSAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemUgPSAwOwotICBhc2VjdGlvbiAqc2VjID0gTlVMTDsKLSAgY2hhciAqc3ltYnVmID0gTlVMTDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIC8qIFdlIG9ubHkgYnVpbGQgc2VjdGlvbnMgZnJvbSBjb250aWd1b3VzIFMtcmVjb3Jkcywgc28gaWYgdGhpcwotICAgICAgICAgaXMgbm90IGFuIFMtcmVjb3JkLCB0aGVuIHN0b3AgYnVpbGRpbmcgYSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChjICE9ICdTJyAmJiBjICE9ICdccicgJiYgYyAhPSAnXG4nKQotCXNlYyA9IE5VTEw7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JZGVmYXVsdDoKLQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQljYXNlICdcbic6Ci0JICArK2xpbmVubzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXHInOgotCSAgYnJlYWs7Ci0KLQljYXNlICckJzoKLQkgIC8qIFN0YXJ0aW5nIGEgbW9kdWxlIG5hbWUsIHdoaWNoIHdlIGlnbm9yZS4gICovCi0JICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSAnXG4nCi0JCSAmJiBjICE9IEVPRikKLQkgICAgOwotCSAgaWYgKGMgPT0gRU9GKQotCSAgICB7Ci0JICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgKytsaW5lbm87Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSAnICc6Ci0JICBkbwotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFsYzsKLQkgICAgICBjaGFyICpwLCAqc3ltbmFtZTsKLQkgICAgICBiZmRfdm1hIHN5bXZhbDsKLQotCSAgICAgIC8qIFN0YXJ0aW5nIGEgc3ltYm9sIGRlZmluaXRpb24uICAqLwotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQotCQk7Ci0KLQkgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgYWxjID0gMTA7Ci0JICAgICAgc3ltYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoYWxjICsgMSk7Ci0JICAgICAgaWYgKHN5bWJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIHAgPSBzeW1idWY7Ci0KLQkgICAgICAqcCsrID0gYzsKLQkgICAgICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YKLQkJICAgICAmJiAhIGlzc3BhY2UgKGMpKQotCQl7Ci0JCSAgaWYgKCh1bnNpZ25lZCBpbnQpIChwIC0gc3ltYnVmKSA+PSBhbGMpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKm47Ci0KLQkJICAgICAgYWxjICo9IDI7Ci0JCSAgICAgIG4gPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAoc3ltYnVmLCBhbGMgKyAxKTsKLQkJICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBwID0gbiArIChwIC0gc3ltYnVmKTsKLQkJICAgICAgc3ltYnVmID0gbjsKLQkJICAgIH0KLQotCQkgICpwKysgPSBjOwotCQl9Ci0KLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgKnArKyA9ICdcMCc7Ci0JICAgICAgc3ltbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgcCAtIHN5bWJ1Zik7Ci0JICAgICAgaWYgKHN5bW5hbWUgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgc3RyY3B5IChzeW1uYW1lLCBzeW1idWYpOwotCSAgICAgIGZyZWUgKHN5bWJ1Zik7Ci0JICAgICAgc3ltYnVmID0gTlVMTDsKLQotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQotCQk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQl7Ci0JCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIFNraXAgYSBkb2xsYXIgc2lnbiBiZWZvcmUgdGhlIGhleCB2YWx1ZS4gICovCi0JICAgICAgaWYgKGMgPT0gJyQnKQotCQl7Ci0JCSAgYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcik7Ci0JCSAgaWYgKGMgPT0gRU9GKQotCQkgICAgewotCQkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHN5bXZhbCA9IDA7Ci0JICAgICAgd2hpbGUgKElTSEVYIChjKSkKLQkJewotCQkgIHN5bXZhbCA8PD0gNDsKLQkJICBzeW12YWwgKz0gTklCQkxFIChjKTsKLQkJICBjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKTsKLQkJfQotCi0JICAgICAgaWYgKCEgc3JlY19uZXdfc3ltYm9sIChhYmZkLCBzeW1uYW1lLCBzeW12YWwpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7Ci0KLQkgIGlmIChjID09ICdcbicpCi0JICAgICsrbGluZW5vOwotCSAgZWxzZSBpZiAoYyAhPSAnXHInKQotCSAgICB7Ci0JICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0gICAgCi0JY2FzZSAnUyc6Ci0JICB7Ci0JICAgIGZpbGVfcHRyIHBvczsKLQkgICAgY2hhciBoZHJbM107Ci0JICAgIHVuc2lnbmVkIGludCBieXRlczsKLQkgICAgYmZkX3ZtYSBhZGRyZXNzOwotCSAgICBiZmRfYnl0ZSAqZGF0YTsKLQotCSAgICAvKiBTdGFydGluZyBhbiBTLXJlY29yZC4gICovCi0KLQkgICAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKLQotCSAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgMywgYWJmZCkgIT0gMykKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICBpZiAoISBJU0hFWCAoaGRyWzFdKSB8fCAhIElTSEVYIChoZHJbMl0pKQotCSAgICAgIHsKLQkJaWYgKCEgSVNIRVggKGhkclsxXSkpCi0JCSAgYyA9IGhkclsxXTsKLQkJZWxzZQotCQkgIGMgPSBoZHJbMl07Ci0JCXNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgYnl0ZXMgPSBIRVggKGhkciArIDEpOwotCSAgICBpZiAoYnl0ZXMgKiAyID4gYnVmc2l6ZSkKLQkgICAgICB7Ci0JCWlmIChidWYgIT0gTlVMTCkKLQkJICBmcmVlIChidWYpOwotCQlidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoYnl0ZXMgKiAyKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQlidWZzaXplID0gYnl0ZXMgKiAyOwotCSAgICAgIH0KLQotCSAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgYnl0ZXMgKiAyLCBhYmZkKSAhPSBieXRlcyAqIDIpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgLyogSWdub3JlIHRoZSBjaGVja3N1bSBieXRlLiAgKi8KLQkgICAgLS1ieXRlczsKLQotCSAgICBhZGRyZXNzID0gMDsKLQkgICAgZGF0YSA9IGJ1ZjsKLQkgICAgc3dpdGNoIChoZHJbMF0pCi0JICAgICAgewotCSAgICAgIGNhc2UgJzAnOgotCSAgICAgIGNhc2UgJzUnOgotCQkvKiBQcm9sb2d1ZS0taWdub3JlIHRoZSBmaWxlIG5hbWUsIGJ1dCBzdG9wIGJ1aWxkaW5nIGEKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGF0IHRoaXMgcG9pbnQuICAqLwotCQlzZWMgPSBOVUxMOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgotCQlhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQktLWJ5dGVzOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzInOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS0tYnl0ZXM7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnMSc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQlieXRlcyAtPSAyOwotCi0JCWlmIChzZWMgIT0gTlVMTAotCQkgICAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBhZGRyZXNzKQotCQkgIHsKLQkJICAgIC8qIFRoaXMgZGF0YSBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBidWlsZGluZy4gICovCi0JCSAgICBzZWMtPl9yYXdfc2l6ZSArPSBieXRlczsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBjaGFyIHNlY2J1ZlsyMF07Ci0JCSAgICBjaGFyICpzZWNuYW1lOwotCi0JCSAgICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7Ci0JCSAgICBzZWNuYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNlY2J1ZikgKyAxKTsKLQkJICAgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKLQkJICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY25hbWUpOwotCQkgICAgaWYgKHNlYyA9PSBOVUxMKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIHNlYy0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JCSAgICBzZWMtPnZtYSA9IGFkZHJlc3M7Ci0JCSAgICBzZWMtPmxtYSA9IGFkZHJlc3M7Ci0JCSAgICBzZWMtPl9yYXdfc2l6ZSA9IGJ5dGVzOwotCQkgICAgc2VjLT5maWxlcG9zID0gcG9zOwotCQkgIH0KLQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzcnOgotCQlhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzgnOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnOSc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCi0JCS8qIFRoaXMgaXMgYSB0ZXJtaW5hdGlvbiByZWNvcmQuICAqLwotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcmVzczsKLQotCQlpZiAoYnVmICE9IE5VTEwpCi0JCSAgZnJlZSAoYnVmKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlcnJvcikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN5bWJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKHN5bWJ1Zik7Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc3JlY19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBiWzRdOwotCi0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICdTJyB8fCAhSVNIRVggKGJbMV0pIHx8ICFJU0hFWCAoYlsyXSkgfHwgIUlTSEVYIChiWzNdKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBzcmVjX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgISBzcmVjX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhbiBTLXJlY29yZCBmaWxlIHdpdGggc3ltYm9scy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXN5bWJvbHNyZWNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBiWzJdOwotCi0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCAyLCBhYmZkKSAhPSAyKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICckJyB8fCBiWzFdICE9ICckJykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBzcmVjX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgISBzcmVjX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBpbnQgYzsKLSAgYmZkX3NpemVfdHlwZSBzb2ZhciA9IDA7Ci0gIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplID0gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRikKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBoZHJbM107Ci0gICAgICB1bnNpZ25lZCBpbnQgYnl0ZXM7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICBiZmRfYnl0ZSAqZGF0YTsKLQotICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNyZWNfc2NhbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCwgc28gd2UKLSAgICAgICAgIG91Z2h0IHRvIGtub3cgdGhlIGV4YWN0IGZvcm1hdC4gICovCi0gICAgICBCRkRfQVNTRVJUIChjID09ICdTJyk7Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCAzLCBhYmZkKSAhPSAzKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBCRkRfQVNTRVJUIChJU0hFWCAoaGRyWzFdKSAmJiBJU0hFWCAoaGRyWzJdKSk7Ci0KLSAgICAgIGJ5dGVzID0gSEVYIChoZHIgKyAxKTsKLQotICAgICAgaWYgKGJ5dGVzICogMiA+IGJ1ZnNpemUpCi0JewotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGJ5dGVzICogMik7Ci0JICBpZiAoYnVmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgYnVmc2l6ZSA9IGJ5dGVzICogMjsKLQl9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoYnVmLCAxLCBieXRlcyAqIDIsIGFiZmQpICE9IGJ5dGVzICogMikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRkcmVzcyA9IDA7Ci0gICAgICBkYXRhID0gYnVmOwotICAgICAgc3dpdGNoIChoZHJbMF0pCi0JewotCWRlZmF1bHQ6Ci0JICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgcmV0dXJuIHRydWU7Ci0KLQljYXNlICczJzoKLQkgIGFkZHJlc3MgPSBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgLS1ieXRlczsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnMic6Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgLS1ieXRlczsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnMSc6Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkgIGRhdGEgKz0gMjsKLQkgIGJ5dGVzIC09IDI7Ci0KLQkgIGlmIChhZGRyZXNzICE9IHNlY3Rpb24tPnZtYSArIHNvZmFyKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgY29tZSB0byB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgY29uc2lkZXIgY2hlY2tzdW0uICAqLwotCSAgLS1ieXRlczsKLQotCSAgd2hpbGUgKGJ5dGVzLS0gIT0gMCkKLQkgICAgewotCSAgICAgIGNvbnRlbnRzW3NvZmFyXSA9IEhFWCAoZGF0YSk7Ci0JICAgICAgZGF0YSArPSAyOwotCSAgICAgICsrc29mYXI7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyb3IpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24gaW4gYW4gUy1yZWNvcmQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChzZWN0aW9uLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0gYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwKLQkgICYmIHNlY3Rpb24tPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgc3JlY19yZWFkX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnVzZWRfYnlfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG1lbWNweSAobG9jYXRpb24sIChiZmRfYnl0ZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZCArIG9mZnNldCwKLQkgIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUuICBXZSBhY2NlcHQgYW4gdW5rbm93biBhcmNoaXRlY3R1cmUgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKTsKLX0KLQotLyogd2UgaGF2ZSB0byBzYXZlIHVwIGFsbCB0aGUgU3JlY29yZHMgZm9yIGEgc3BsdXJnZSBiZWZvcmUgb3V0cHV0ICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvOwotewotICB0ZGF0YV90eXBlICp0ZGF0YSA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YTsKLSAgcmVnaXN0ZXIgc3JlY19kYXRhX2xpc3RfdHlwZSAqZW50cnk7Ci0KLSAgZW50cnkgPSAoKHNyZWNfZGF0YV9saXN0X3R5cGUgKikKLQkgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3JlY19kYXRhX2xpc3RfdHlwZSkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChieXRlc190b19kbwotICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgYnl0ZXNfdG9fZG8pOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1jcHkgKChQVFIpIGRhdGEsIGxvY2F0aW9uLCAoc2l6ZV90KSBieXRlc190b19kbyk7Ci0KLSAgICAgIGlmICgoc2VjdGlvbi0+bG1hICsgb2Zmc2V0ICsgYnl0ZXNfdG9fZG8gLSAxKSA8PSAweGZmZmYpCi0JewotCi0JfQotICAgICAgZWxzZSBpZiAoKHNlY3Rpb24tPmxtYSArIG9mZnNldCArIGJ5dGVzX3RvX2RvIC0gMSkgPD0gMHhmZmZmZmYKLQkgICAgICAgJiYgdGRhdGEtPnR5cGUgPD0gMikKLQl7Ci0JICB0ZGF0YS0+dHlwZSA9IDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRkYXRhLT50eXBlID0gMzsKLQl9Ci0KLSAgICAgIGVudHJ5LT5kYXRhID0gZGF0YTsKLSAgICAgIGVudHJ5LT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKLSAgICAgIGVudHJ5LT5zaXplID0gYnl0ZXNfdG9fZG87Ci0KLSAgICAgIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKLSAgICAgICAgIGFkZGluZyBhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8KLSAgICAgIGlmICh0ZGF0YS0+dGFpbCAhPSBOVUxMCi0JICAmJiBlbnRyeS0+d2hlcmUgPj0gdGRhdGEtPnRhaWwtPndoZXJlKQotCXsKLQkgIHRkYXRhLT50YWlsLT5uZXh0ID0gZW50cnk7Ci0JICBlbnRyeS0+bmV4dCA9IE5VTEw7Ci0JICB0ZGF0YS0+dGFpbCA9IGVudHJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdpc3RlciBzcmVjX2RhdGFfbGlzdF90eXBlICoqbG9vazsKLQotCSAgZm9yIChsb29rID0gJnRkYXRhLT5oZWFkOwotCSAgICAgICAqbG9vayAhPSBOVUxMICYmICgqbG9vayktPndoZXJlIDwgZW50cnktPndoZXJlOwotCSAgICAgICBsb29rID0gJigqbG9vayktPm5leHQpCi0JICAgIDsKLQkgIGVudHJ5LT5uZXh0ID0gKmxvb2s7Ci0JICAqbG9vayA9IGVudHJ5OwotCSAgaWYgKGVudHJ5LT5uZXh0ID09IE5VTEwpCi0JICAgIHRkYXRhLT50YWlsID0gZW50cnk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgcmVjb3JkIG9mIHR5cGUsIG9mIHRoZSBzdXBwbGllZCBudW1iZXIgb2YgYnl0ZXMuIFRoZQotICAgc3VwcGxpZWQgYnl0ZXMgYW5kIGxlbmd0aCBkb24ndCBoYXZlIGEgY2hlY2tzdW0uIFRoYXQncyB3b3JrZWQgb3V0Ci0gICBoZXJlCi0qLwotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLCB0eXBlLCBhZGRyZXNzLCBkYXRhLCBlbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgY29uc3QgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGNvbnN0IGJmZF9ieXRlICplbmQ7Ci17Ci0gIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgdW5zaWduZWQgaW50IGNoZWNrX3N1bSA9IDA7Ci0gIENPTlNUIGJmZF9ieXRlICpzcmMgPSBkYXRhOwotICBjaGFyICpkc3QgPSBidWZmZXI7Ci0gIGNoYXIgKmxlbmd0aDsKLSAgYmZkX3NpemVfdHlwZSB3cmxlbjsKLQotICAqZHN0KysgPSAnUyc7Ci0gICpkc3QrKyA9ICcwJyArIHR5cGU7Ci0KLSAgbGVuZ3RoID0gZHN0OwotICBkc3QgKz0gMjsJCQkvKiBsZWF2ZSByb29tIGZvciBkc3QqLwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNzoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDI0KSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIGNhc2UgODoKLSAgICBjYXNlIDI6Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyA+PiAxNiksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICBjYXNlIDk6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMDoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDgpLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICBmb3IgKHNyYyA9IGRhdGE7IHNyYyA8IGVuZDsgc3JjKyspCi0gICAgewotICAgICAgVE9IRVggKGRzdCwgKnNyYywgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBsZW5ndGggKi8KLSAgVE9IRVggKGxlbmd0aCwgKGRzdCAtIGxlbmd0aCkgLyAyLCBjaGVja19zdW0pOwotICBjaGVja19zdW0gJj0gMHhmZjsKLSAgY2hlY2tfc3VtID0gMjU1IC0gY2hlY2tfc3VtOwotICBUT0hFWCAoZHN0LCBjaGVja19zdW0sIGNoZWNrX3N1bSk7Ci0gIGRzdCArPSAyOwotCi0gICpkc3QrKyA9ICdccic7Ci0gICpkc3QrKyA9ICdcbic7Ci0gIHdybGVuID0gZHN0IC0gYnVmZmVyOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIHdybGVuLCBhYmZkKSAhPSB3cmxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcltNQVhDSFVOS107Ci0gIGJmZF9ieXRlICpkc3QgPSBidWZmZXI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEknbGwgcHV0IGFuIGFyYml0YXJ5IDQwIGNoYXIgbGltaXQgb24gaGVhZGVyIHNpemUgKi8KLSAgZm9yIChpID0gMDsgaSA8IDQwICYmIGFiZmQtPmZpbGVuYW1lW2ldOyBpKyspCi0gICAgewotICAgICAgKmRzdCsrID0gYWJmZC0+ZmlsZW5hbWVbaV07Ci0gICAgfQotICByZXR1cm4gc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIDAsIDAsIGJ1ZmZlciwgZHN0KTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfc2VjdGlvbiAoYWJmZCwgdGRhdGEsIGxpc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdGRhdGFfdHlwZSAqdGRhdGE7Ci0gICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKmxpc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCBieXRlc193cml0dGVuID0gMDsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uID0gbGlzdC0+ZGF0YTsKLQotICB3aGlsZSAoYnl0ZXNfd3JpdHRlbiA8IGxpc3QtPnNpemUpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyZXNzOwotCi0gICAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfdGhpc19jaHVuayA9IGxpc3QtPnNpemUgLSBieXRlc193cml0dGVuOwotCi0gICAgICBpZiAoYnl0ZXNfdGhpc19jaHVuayA+IENIVU5LKQotCXsKLQkgIGJ5dGVzX3RoaXNfY2h1bmsgPSBDSFVOSzsKLQl9Ci0KLSAgICAgIGFkZHJlc3MgPSBsaXN0LT53aGVyZSArIGJ5dGVzX3dyaXR0ZW47Ci0KLSAgICAgIGlmICghIHNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJICAgICAgIHRkYXRhLT50eXBlLAotCQkJICAgICAgIGFkZHJlc3MsCi0JCQkgICAgICAgbG9jYXRpb24sCi0JCQkgICAgICAgbG9jYXRpb24gKyBieXRlc190aGlzX2NodW5rKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJ5dGVzX3dyaXR0ZW4gKz0gYnl0ZXNfdGhpc19jaHVuazsKLSAgICAgIGxvY2F0aW9uICs9IGJ5dGVzX3RoaXNfY2h1bms7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV90ZXJtaW5hdG9yIChhYmZkLCB0ZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICB0ZGF0YV90eXBlICp0ZGF0YTsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotCi0gIHJldHVybiBzcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwgMTAgLSB0ZGF0YS0+dHlwZSwKLQkJCSAgICBhYmZkLT5zdGFydF9hZGRyZXNzLCBidWZmZXIsIGJ1ZmZlcik7Ci19Ci0KLQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgLyogRHVtcCBvdXQgdGhlIHN5bWJvbHMgb2YgYSBiZmQgKi8KLSAgaW50IGk7Ci0gIGludCBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gIGlmIChjb3VudCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgYXN5bWJvbCAqKnRhYmxlID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiQkICVzXHJcbiIsIGFiZmQtPmZpbGVuYW1lKTsKLQotICAgICAgbGVuID0gc3RybGVuIChidWZmZXIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCXsKLQkgIGFzeW1ib2wgKnMgPSB0YWJsZVtpXTsKLQkgIGlmICghIGJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgcykKLQkgICAgICAmJiAocy0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSnVzdCBkdW1wIG91dCBub24gZGVidWcgc3ltYm9scyAqLwotCSAgICAgIGJmZF9zaXplX3R5cGUgbDsKLQkgICAgICBjaGFyIGJ1ZjJbNDBdLCAqcDsKLQotCSAgICAgIHNwcmludGZfdm1hIChidWYyLAotCQkJICAgcy0+dmFsdWUgKyBzLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bG1hCi0JCQkgICArIHMtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIHAgPSBidWYyOwotCSAgICAgIHdoaWxlIChwWzBdID09ICcwJyAmJiBwWzFdICE9IDApCi0JCXArKzsKLQkgICAgICBzcHJpbnRmIChidWZmZXIsICIgICVzICQlc1xyXG4iLCBzLT5uYW1lLCBwKTsKLQkgICAgICBsID0gc3RybGVuIChidWZmZXIpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgbCwgMSwgYWJmZCkgIT0gbCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJCQgXHJcbiIpOwotICAgICAgbGVuID0gc3RybGVuIChidWZmZXIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHN5bWJvbHM7Ci17Ci0gIHRkYXRhX3R5cGUgKnRkYXRhID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhOwotICBzcmVjX2RhdGFfbGlzdF90eXBlICpsaXN0OwotCi0gIGlmIChzeW1ib2xzKQotICAgIHsKLSAgICAgIGlmICghIHNyZWNfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBzcmVjX3dyaXRlX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3YW5kZXIgdGhvdWdoIGFsbCB0aGUgc2VjdGlvbnMgcHJvdmlkZWQgYW5kIG91dHB1dCB0aGVtICovCi0gIGxpc3QgPSB0ZGF0YS0+aGVhZDsKLQotICB3aGlsZSAobGlzdCAhPSAoc3JlY19kYXRhX2xpc3RfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHNyZWNfd3JpdGVfc2VjdGlvbiAoYWJmZCwgdGRhdGEsIGxpc3QpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIHNyZWNfd3JpdGVfdGVybWluYXRvciAoYWJmZCwgdGRhdGEpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkLCAwKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCwgMSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotc3JlY19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotc3JlY19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1zcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1zcmVjX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgYXN5bWJvbCAqY3N5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGNzeW1ib2xzID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5jc3ltYm9sczsKLSAgaWYgKGNzeW1ib2xzID09IE5VTEwpCi0gICAgewotICAgICAgYXN5bWJvbCAqYzsKLSAgICAgIHN0cnVjdCBzcmVjX3N5bWJvbCAqczsKLQotICAgICAgY3N5bWJvbHMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gICAgICBpZiAoY3N5bWJvbHMgPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+Y3N5bWJvbHMgPSBjc3ltYm9sczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzLCBjID0gY3N5bWJvbHM7Ci0JICAgcyAhPSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0LCArK2MpCi0JewotCSAgYy0+dGhlX2JmZCA9IGFiZmQ7Ci0JICBjLT5uYW1lID0gcy0+bmFtZTsKLQkgIGMtPnZhbHVlID0gcy0+dmFsOwotCSAgYy0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgYy0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBjLT51ZGF0YS5wID0gTlVMTDsKLQl9Ci0gICAgfQotCQotICBmb3IgKGkgPSAwOyBpIDwgc3ltY291bnQ7IGkrKykKLSAgICAqYWxvY2F0aW9uKysgPSBjc3ltYm9scysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNyZWNfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc3JlY19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkgICAgICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAotCSAgICAgICBzeW1ib2wtPm5hbWUpOwotCi0gICAgfQotfQotCi0jZGVmaW5lCXNyZWNfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHNyZWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIHNyZWNfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotCi0jZGVmaW5lIHNyZWNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBzcmVjX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBzcmVjX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHNyZWNfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBzcmVjX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgc3JlY19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBzcmVjX2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBzcmVjX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBzcmVjX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIHNyZWNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBzcmVjX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgc3JlY19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgc3JlY19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBzcmVjX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHNyZWNfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgc3JlY19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBzcmVjX3ZlYyA9Ci17Ci0gICJzcmVjIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBzcmVjX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNyZWNfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwotCi0KLQotY29uc3QgYmZkX3RhcmdldCBzeW1ib2xzcmVjX3ZlYyA9Ci17Ci0gICJzeW1ib2xzcmVjIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBzeW1ib2xzcmVjX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc3JlY19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvc3RhYi1zeW1zLmMgYi9iZmQvc3RhYi1zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZmU2YzguLjAwMDAwMDAKLS0tIGEvYmZkL3N0YWItc3ltcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVGFibGUgb2Ygc3RhYiBuYW1lcyBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIJCS8qIFZhbHVlIGRvZXNuJ3QgbWF0dGVyLiAqLwotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBJZ25vcmUgZHVwbGljYXRlIHN0YWIgY29kZXM7IGp1c3QgcmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBmaXJzdAotICAgb25lLiAgKi8KLSNkZWZpbmUgX19kZWZpbmVfc3RhYihOQU1FLCBDT0RFLCBTVFJJTkcpIF9fZGVmaW5lX25hbWUoQ09ERSwgU1RSSU5HKQotI2RlZmluZSBfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZShOQU1FLCBDT0RFLCBTVFJJTkcpCi0KLS8qIFRoZXNlIGFyZSBub3QgcmVhbGx5IHN0YWIgc3ltYm9scywgYnV0IGl0IGlzCi0gICBjb252ZW5pZW50IHRvIGhhdmUgdGhlbSBoZXJlIGZvciB0aGUgc2FrZSBvZiBubS4KLSAgIEZvciBjb21wbGV0ZW5lc3MsIHdlIGNvdWxkIGFsc28gYWRkIE5fVEVYVCBldGMsIGJ1dCB0aG9zZQotICAgYXJlIG5ldmVyIG5lZWRlZCwgc2luY2Ugbm0gdHJlYXRzIHRob3NlIHNwZWNpYWxseS4gKi8KLSNkZWZpbmUgRVhUUkFfU1lNQk9MUyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUQSwgIlNFVEEiKS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUVCwgIlNFVFQiKS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRELCAiU0VURCIpLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVEIsICJTRVRCIikvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRWLCAiU0VUViIpLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gKi8gXAotICBfX2RlZmluZV9uYW1lIChOX0lORFIsICJJTkRSIikgXAotICBfX2RlZmluZV9uYW1lIChOX1dBUk5JTkcsICJXQVJOSU5HIikKLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3N0YWJfbmFtZSAoY29kZSkKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0jZGVmaW5lIF9fZGVmaW5lX25hbWUodmFsLCBzdHIpIGNhc2UgdmFsOiByZXR1cm4gc3RyOwotI2luY2x1ZGUgImFvdXQvc3RhYi5kZWYiCi0gICAgICBFWFRSQV9TWU1CT0xTCi0gICAgfQotCi0gIHJldHVybiAoY29uc3QgY2hhciAqKSAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N0YWJzLmMgYi9iZmQvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhYzE2Ny4uMDAwMDAwMAotLS0gYS9iZmQvc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDY1MyArMCwwIEBACi0vKiBTdGFicyBpbiBzZWN0aW9ucyBsaW5raW5nIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMsIGFzIHVzZWQKLSAgIG9uIENPRkYgYW5kIEVMRi4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBTdGFicyBlbnRyaWVzIHVzZSBhIDEyIGJ5dGUgZm9ybWF0OgotICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgIDEgYnl0ZSBzdGFiIHR5cGUKLSAgICAgMSBieXRlIHN0YWIgb3RoZXIgZmllbGQKLSAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQotICAgRklYTUU6IFRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSBmb3IgYSA2NCBiaXQgb2JqZWN0IGZvcm1hdC4KLQotICAgVGhlIHN0YWJzIHN5bWJvbHMgYXJlIGRpdmlkZWQgaW50byBjb21waWxhdGlvbiB1bml0cy4gIEZvciB0aGUKLSAgIGZpcnN0IGVudHJ5IGluIGVhY2ggdW5pdCwgdGhlIHR5cGUgb2YgMCwgdGhlIHZhbHVlIGlzIHRoZSBsZW5ndGggb2YKLSAgIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoaXMgdW5pdCwgYW5kIHRoZSBkZXNjIGZpZWxkIGlzIHRoZSBudW1iZXIgb2YKLSAgIHN0YWJzIHN5bWJvbHMgZm9yIHRoaXMgdW5pdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotLyogQSBoYXNoIHRhYmxlIHVzZWQgZm9yIGhlYWRlciBmaWxlcyB3aXRoIE5fQklOQ0wgZW50cmllcy4gICovCi0KLXN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBBIGxpbmtlZCBsaXN0IG9mIHRvdGFscyB0aGF0IHdlIGhhdmUgZm91bmQgZm9yIGEgcGFydGljdWxhciBoZWFkZXIKLSAgIGZpbGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscwotewotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqbmV4dDsKLSAgYmZkX3ZtYSB0b3RhbDsKLX07Ci0KLS8qIEFuIGVudHJ5IGluIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogTGlzdCBvZiB0b3RhbHMgd2UgaGF2ZSBmb3VuZCBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKnRvdGFsczsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN0YWJfbGlua19pbmNsdWRlc19sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIGxpc3Qgb2YgTl9CSU5DTCBzeW1ib2xzLCBzb21lIG9mCi0gICB3aGljaCBtaWdodCBiZSBjb252ZXJ0ZWQgaW50byBOX0VYQ0wgc3ltYm9scy4gICovCi0KLXN0cnVjdCBzdGFiX2V4Y2xfbGlzdAotewotICAvKiBUaGUgbmV4dCBzeW1ib2wgdG8gY29udmVydC4gICovCi0gIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqbmV4dDsKLSAgLyogVGhlIG9mZnNldCB0byB0aGlzIHN5bWJvbCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGJmZF9zaXplX3R5cGUgb2Zmc2V0OwotICAvKiBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoaXMgc3ltYm9sIChOX0JJTkNMIG9yIE5fRVhDTCkuICAqLwotICBpbnQgdHlwZTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHN0b3JlZCB3aXRoIGVhY2ggLnN0YWIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbwotewotICAvKiBUaGlzIGlzIGEgbGlua2VkIGxpc3Qgb2YgTl9CSU5DTCBzeW1ib2xzIHdoaWNoIHNob3VsZCBiZQotICAgICBjb252ZXJ0ZWQgaW50byBOX0VYQ0wgc3ltYm9scy4gICovCi0gIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqZXhjbHM7Ci0KLSAgLyogVGhpcyBpcyB1c2VkIHRvIG1hcCBpbnB1dCBzdGFiIG9mZnNldHMgd2l0aGluIHRoZWlyIHNlY3Rpb25zCi0gICAgIHRvIG91dHB1dCBzdGFiIG9mZnNldHMsIHRvIHRha2UgaW50byBhY2NvdW50IHN0YWJzIHRoYXQgaGF2ZQotICAgICBiZWVuIGRlbGV0ZWQuICBJZiBpdCBpcyBOVUxMLCB0aGUgb3V0cHV0IG9mZnNldHMgYXJlIHRoZSBzYW1lCi0gICAgIGFzIHRoZSBpbnB1dCBvZmZzZXRzLCBiZWNhdXNlIG5vIHN0YWJzIGhhdmUgYmVlbiBkZWxldGVkIGZyb20KLSAgICAgdGhpcyBzZWN0aW9uLiAgT3RoZXJ3aXNlIHRoZSBpJ3RoIGVudHJ5IGlzIHRoZSBudW1iZXIgb2YKLSAgICAgYnl0ZXMgb2Ygc3RhYnMgdGhhdCBoYXZlIGJlZW4gZGVsZXRlZCBwcmlvciB0byB0aGUgaSd0aAotICAgICBzdGFiLiAqLwotICBiZmRfc2l6ZV90eXBlICpjdW11bGF0aXZlX3NraXBzOwotCi0gIC8qIFRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIGluZGljZXMuICBGb3IgZWFjaCBzdGFiIHN5bWJvbCwgd2UKLSAgICAgc3RvcmUgdGhlIHN0cmluZyBpbmRleCBoZXJlLiAgSWYgYSBzdGFiIHN5bWJvbCBzaG91bGQgbm90IGJlCi0gICAgIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBvdXRwdXQsIHRoZSBzdHJpbmcgaW5kZXggaXMgLTEuICAqLwotICBiZmRfc2l6ZV90eXBlIHN0cmlkeHNbMV07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygc3RhYnMgaW4gc2VjdGlvbnMKLSAgIGluZm9ybWF0aW9uIHdoaWxlIGxpbmtpbmcuICAqLwotCi1zdHJ1Y3Qgc3RhYl9pbmZvCi17Ci0gIC8qIEEgaGFzaCB0YWJsZSB1c2VkIHRvIGhvbGQgc3RhYnMgc3RyaW5ncy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cmluZ3M7Ci0gIC8qIFRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190YWJsZSBpbmNsdWRlczsKLSAgLyogVGhlIGZpcnN0IC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3RhYnN0cjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0MCi0vKiBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdGFiX2xpbmtfaW5jbHVkZXNfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50b3RhbHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnB1dCBmaWxlIGZyb20gdGhlIGFkZF9zeW1ib2xzCi0gICBwYXNzIG9mIHRoZSBsaW5rZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwgcHNpbmZvLCBzdGFic2VjLCBzdGFic3Ryc2VjLCBwc2VjaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgKnBzaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gICAgIGFzZWN0aW9uICpzdGFic3Ryc2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotewotICBib29sZWFuIGZpcnN0OwotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotICBiZmRfYnl0ZSAqc3RhYmJ1ZiA9IE5VTEw7Ci0gIGJmZF9ieXRlICpzdGFic3RyYnVmID0gTlVMTDsKLSAgYmZkX2J5dGUgKnN5bSwgKnN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSBzdHJvZmYsIG5leHRfc3Ryb2ZmLCBza2lwOwotICBiZmRfc2l6ZV90eXBlICpwc3RyaWR4OwotCi0gIGlmIChzdGFic2VjLT5fcmF3X3NpemUgPT0gMAotICAgICAgfHwgc3RhYnN0cnNlYy0+X3Jhd19zaXplID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoc3RhYnNlYy0+X3Jhd19zaXplICUgU1RBQlNJWkUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgZm9ybWF0IG9mIHRoZXNlIHN0YWIgc3ltYm9scy4KLSAgICAgICAgIERvbid0IHRyeSB0byBvcHRpbWl6ZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKHN0YWJzdHJzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFdlIHNob3VsZG4ndCBzZWUgcmVsb2NhdGlvbnMgaW4gdGhlIHN0cmluZ3MsIGFuZCB3ZSBhcmVuJ3QKLSAgICAgICAgIHByZXBhcmVkIHRvIGhhbmRsZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uKSkKLSAgICAgIHx8IChzdGFic3Ryc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHN0YWJzdHJzZWMtPm91dHB1dF9zZWN0aW9uKSkpCi0gICAgewotICAgICAgLyogQXQgbGVhc3Qgb25lIG9mIHRoZSBzZWN0aW9ucyBpcyBiZWluZyBkaXNjYXJkZWQgZnJvbSB0aGUKLSAgICAgICAgIGxpbmssIHNvIHdlIHNob3VsZCBqdXN0IGlnbm9yZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBmaXJzdCA9IGZhbHNlOwotCi0gIGlmICgqcHNpbmZvID09IE5VTEwpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhYnMgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mLiAgKi8KLSAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICpwc2luZm8gPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN0YWJfaW5mbykpOwotICAgICAgaWYgKCpwc2luZm8gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLSAgICAgIHNpbmZvLT5zdHJpbmdzID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICAgIGlmIChzaW5mby0+c3RyaW5ncyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaXJzdCBieXRlIGlzIHplcm8uICAqLwotICAgICAgKHZvaWQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2luZm8tPnN0cmluZ3MsICIiLCB0cnVlLCB0cnVlKTsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAoJnNpbmZvLT5pbmNsdWRlcy5yb290LAotCQkJCSAgIHN0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jLAotCQkJCSAgIDI1MSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBzaW5mby0+c3RhYnN0ciA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnN0YWJzdHIiKTsKLSAgICAgIHNpbmZvLT5zdGFic3RyLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RFQlVHR0lORzsKLSAgICB9Ci0KLSAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGluZm9ybWF0aW9uIHdlIGFyZSBnb2luZyB0byBzdG9yZSBmb3IgdGhpcyAuc3RhYgotICAgICBzZWN0aW9uLiAgKi8KLQotICBjb3VudCA9IHN0YWJzZWMtPl9yYXdfc2l6ZSAvIFNUQUJTSVpFOwotCi0gICpwc2VjaW5mbyA9IGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8pCi0JCQkgICsgKGNvdW50IC0gMSkgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKSk7Ci0gIGlmICgqcHNlY2luZm8gPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzZWNpbmZvID0gKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqKSAqcHNlY2luZm87Ci0gIHNlY2luZm8tPmV4Y2xzID0gTlVMTDsKLSAgc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyA9IE5VTEw7Ci0gIG1lbXNldCAoc2VjaW5mby0+c3RyaWR4cywgMCwgY291bnQgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLQotICAvKiBSZWFkIHRoZSBzdGFicyBpbmZvcm1hdGlvbiBmcm9tIGFiZmQuICAqLwotCi0gIHN0YWJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3RhYnNlYy0+X3Jhd19zaXplKTsKLSAgc3RhYnN0cmJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzdGFic3Ryc2VjLT5fcmF3X3NpemUpOwotICBpZiAoc3RhYmJ1ZiA9PSBOVUxMIHx8IHN0YWJzdHJidWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzZWMsIHN0YWJidWYsIDAsCi0JCQkJICBzdGFic2VjLT5fcmF3X3NpemUpCi0gICAgICB8fCAhIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3RhYnN0cnNlYywgc3RhYnN0cmJ1ZiwgMCwKLQkJCQkgICAgIHN0YWJzdHJzZWMtPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzdGFicyBzeW1ib2xzLCB3b3JrIG91dCB0aGUgbmV3IHN0cmluZyBpbmRpY2VzLAotICAgICBhbmQgaWRlbnRpZnkgTl9CSU5DTCBzeW1ib2xzIHdoaWNoIGNhbiBiZSBlbGltaW5hdGVkLiAgKi8KLQotICBzdHJvZmYgPSAwOwotICBuZXh0X3N0cm9mZiA9IDA7Ci0gIHNraXAgPSAwOwotCi0gIHN5bWVuZCA9IHN0YWJidWYgKyBzdGFic2VjLT5fcmF3X3NpemU7Ci0gIGZvciAoc3ltID0gc3RhYmJ1ZiwgcHN0cmlkeCA9IHNlY2luZm8tPnN0cmlkeHM7Ci0gICAgICAgc3ltIDwgc3ltZW5kOwotICAgICAgIHN5bSArPSBTVEFCU0laRSwgKytwc3RyaWR4KQotICAgIHsKLSAgICAgIGludCB0eXBlOwotICAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotCi0gICAgICBpZiAoKnBzdHJpZHggIT0gMCkKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYnkgYW4gTl9CSU5DTCBwYXNzLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgdHlwZSA9IHN5bVtUWVBFT0ZGXTsKLQotICAgICAgaWYgKHR5cGUgPT0gMCkKLQl7Ci0JICAvKiBTcGVjaWFsIHR5cGUgMCBzdGFicyBpbmRpY2F0ZSB0aGUgb2Zmc2V0IHRvIHRoZSBuZXh0Ci0gICAgICAgICAgICAgc3RyaW5nIHRhYmxlLiAgV2Ugb25seSBjb3B5IHRoZSB2ZXJ5IGZpcnN0IG9uZS4gICovCi0JICBzdHJvZmYgPSBuZXh0X3N0cm9mZjsKLQkgIG5leHRfc3Ryb2ZmICs9IGJmZF9nZXRfMzIgKGFiZmQsIHN5bSArIDgpOwotCSAgaWYgKCEgZmlyc3QpCi0JICAgIHsKLQkgICAgICAqcHN0cmlkeCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQkgICAgICArK3NraXA7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGZpcnN0ID0gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdG9yZSB0aGUgc3RyaW5nIGluIHRoZSBoYXNoIHRhYmxlLCBhbmQgcmVjb3JkIHRoZSBpbmRleC4gICovCi0gICAgICBzdHJpbmcgPSAoKGNoYXIgKikgc3RhYnN0cmJ1ZgotCQkrIHN0cm9mZgotCQkrIGJmZF9nZXRfMzIgKGFiZmQsIHN5bSArIFNUUkRYT0ZGKSk7Ci0gICAgICAqcHN0cmlkeCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoc2luZm8tPnN0cmluZ3MsIHN0cmluZywgdHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIEFuIE5fQklOQ0wgc3ltYm9sIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhlIHN0YWJzIGVudHJpZXMKLQkgZm9yIGEgaGVhZGVyIGZpbGUuICBXZSBuZWVkIHRvIHNjYW4gYWhlYWQgdG8gdGhlIG5leHQgTl9FSU5DTAotCSBzeW1ib2wsIGlnbm9yaW5nIG5lc3RpbmcsIGFkZGluZyB1cCBhbGwgdGhlIGNoYXJhY3RlcnMgaW4gdGhlCi0JIHN5bWJvbCBuYW1lcywgbm90IGluY2x1ZGluZyB0aGUgZmlsZSBudW1iZXJzIGluIHR5cGVzICh0aGUKLQkgZmlyc3QgbnVtYmVyIGFmdGVyIGFuIG9wZW4gcGFyZW50aGVzaXMpLiAgKi8KLSAgICAgIGlmICh0eXBlID09IE5fQklOQ0wpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0JICBpbnQgbmVzdDsKLQkgIGJmZF9ieXRlICppbmNsX3N5bTsKLQkgIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKmluY2xfZW50cnk7Ci0JICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqdDsKLQkgIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqbmU7Ci0KLQkgIHZhbCA9IDA7Ci0JICBuZXN0ID0gMDsKLQkgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyBTVEFCU0laRTsKLQkgICAgICAgaW5jbF9zeW0gPCBzeW1lbmQ7Ci0JICAgICAgIGluY2xfc3ltICs9IFNUQUJTSVpFKQotCSAgICB7Ci0JICAgICAgaW50IGluY2xfdHlwZTsKLQotCSAgICAgIGluY2xfdHlwZSA9IGluY2xfc3ltW1RZUEVPRkZdOwotCSAgICAgIGlmIChpbmNsX3R5cGUgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgZWxzZSBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCi0JCXsKLQkJICBpZiAobmVzdCA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCSAgLS1uZXN0OwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaW5jbF90eXBlID09IE5fQklOQ0wpCi0JCSsrbmVzdDsKLQkgICAgICBlbHNlIGlmIChuZXN0ID09IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpzdHI7Ci0KLQkJICBzdHIgPSAoKGNoYXIgKikgc3RhYnN0cmJ1ZgotCQkJICsgc3Ryb2ZmCi0JCQkgKyBiZmRfZ2V0XzMyIChhYmZkLCBpbmNsX3N5bSArIFNUUkRYT0ZGKSk7Ci0JCSAgZm9yICg7ICpzdHIgIT0gJ1wwJzsgc3RyKyspCi0JCSAgICB7Ci0JCSAgICAgIHZhbCArPSAqc3RyOwotCQkgICAgICBpZiAoKnN0ciA9PSAnKCcpCi0JCQl7Ci0JCQkgIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLQkJCSAgKytzdHI7Ci0JCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnN0cikpCi0JCQkgICAgKytzdHI7Ci0JCQkgIC0tc3RyOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGEgaGVhZGVyIGZpbGUgd2l0aCB0aGUgc2FtZQotCSAgICAgdmFsdWUsIHRoZW4gcmVwbGFjZWQgdGhpcyBvbmUgd2l0aCBhbiBOX0VYQ0wgc3ltYm9sLiAgKi8KLQkgIGluY2xfZW50cnkgPSBzdGFiX2xpbmtfaW5jbHVkZXNfbG9va3VwICgmc2luZm8tPmluY2x1ZGVzLCBzdHJpbmcsCi0JCQkJCQkgIHRydWUsIHRydWUpOwotCSAgaWYgKGluY2xfZW50cnkgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGZvciAodCA9IGluY2xfZW50cnktPnRvdGFsczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgaWYgKHQtPnRvdGFsID09IHZhbCkKLQkgICAgICBicmVhazsKLQotCSAgLyogUmVjb3JkIHRoaXMgc3ltYm9sLCBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIHZhbHVlCi0gICAgICAgICAgICAgY29ycmVjdGx5LiAgKi8KLQkgIG5lID0gKHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAqbmUpOwotCSAgaWYgKG5lID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbmUtPm9mZnNldCA9IHN5bSAtIHN0YWJidWY7Ci0JICBuZS0+dmFsID0gdmFsOwotCSAgbmUtPnR5cGUgPSBOX0JJTkNMOwotCSAgbmUtPm5leHQgPSBzZWNpbmZvLT5leGNsczsKLQkgIHNlY2luZm8tPmV4Y2xzID0gbmU7Ci0KLQkgIGlmICh0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgc2VlbiB0aGlzIGhlYWRlciBmaWxlCi0JCSB3aXRoIHRoaXMgc2V0IG9mIHN0YWJzIHN0cmluZ3MuICAqLwotCSAgICAgIHQgPSAoKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICopCi0JCSAgIGJmZF9oYXNoX2FsbG9jYXRlICgmc2luZm8tPmluY2x1ZGVzLnJvb3QsIHNpemVvZiAqdCkpOwotCSAgICAgIGlmICh0ID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIHQtPnRvdGFsID0gdmFsOwotCSAgICAgIHQtPm5leHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7Ci0JICAgICAgaW5jbF9lbnRyeS0+dG90YWxzID0gdDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSAqaW5jbF9wc3RyaWR4OwotCi0JICAgICAgLyogV2UgaGF2ZSBzZWVuIHRoaXMgaGVhZGVyIGZpbGUgYmVmb3JlLiAgVGVsbCB0aGUgZmluYWwKLQkJIHBhc3MgdG8gY2hhbmdlIHRoZSB0eXBlIHRvIE5fRVhDTC4gICovCi0JICAgICAgbmUtPnR5cGUgPSBOX0VYQ0w7Ci0KLQkgICAgICAvKiBNYXJrIHRoZSBza2lwcGVkIHN5bWJvbHMuICAqLwotCi0JICAgICAgbmVzdCA9IDA7Ci0JICAgICAgZm9yIChpbmNsX3N5bSA9IHN5bSArIFNUQUJTSVpFLCBpbmNsX3BzdHJpZHggPSBwc3RyaWR4ICsgMTsKLQkJICAgaW5jbF9zeW0gPCBzeW1lbmQ7Ci0JCSAgIGluY2xfc3ltICs9IFNUQUJTSVpFLCArK2luY2xfcHN0cmlkeCkKLQkJewotCQkgIGludCBpbmNsX3R5cGU7Ci0KLQkJICBpbmNsX3R5cGUgPSBpbmNsX3N5bVtUWVBFT0ZGXTsKLQotCQkgIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKG5lc3QgPT0gMCkKLQkJCXsKLQkJCSAgKmluY2xfcHN0cmlkeCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQkJCSAgKytza2lwOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgLS1uZXN0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkgICAgKytuZXN0OwotCQkgIGVsc2UgaWYgKG5lc3QgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgKmluY2xfcHN0cmlkeCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQkJICAgICAgKytza2lwOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZyZWUgKHN0YWJidWYpOwotICBzdGFiYnVmID0gTlVMTDsKLSAgZnJlZSAoc3RhYnN0cmJ1Zik7Ci0gIHN0YWJzdHJidWYgPSBOVUxMOwotCi0gIC8qIFdlIG5lZWQgdG8gc2V0IHRoZSBzZWN0aW9uIHNpemVzIHN1Y2ggdGhhdCB0aGUgbGlua2VyIHdpbGwKLSAgICAgY29tcHV0ZSB0aGUgb3V0cHV0IHNlY3Rpb24gc2l6ZXMgY29ycmVjdGx5LiAgV2Ugc2V0IHRoZSAuc3RhYgotICAgICBzaXplIHRvIG5vdCBpbmNsdWRlIHRoZSBlbnRyaWVzIHdlIGRvbid0IHdhbnQuICBXZSBzZXQKLSAgICAgU0VDX0VYQ0xVREUgZm9yIHRoZSAuc3RhYnN0ciBzZWN0aW9uLCBzbyB0aGF0IGl0IHdpbGwgYmUgZHJvcHBlZAotICAgICBmcm9tIHRoZSBsaW5rLiAgV2UgcmVjb3JkIHRoZSBzaXplIG9mIHRoZSBzdHJ0YWIgaW4gdGhlIGZpcnN0Ci0gICAgIC5zdGFic3RyIHNlY3Rpb24gd2Ugc2F3LCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IHNldCBTRUNfRVhDTFVERQotICAgICBmb3IgdGhhdCBzZWN0aW9uLiAgKi8KLSAgc3RhYnNlYy0+X2Nvb2tlZF9zaXplID0gKGNvdW50IC0gc2tpcCkgKiBTVEFCU0laRTsKLSAgaWYgKHN0YWJzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHN0YWJzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICBzdGFic3Ryc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgc2luZm8tPnN0YWJzdHItPl9jb29rZWRfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKHNpbmZvLT5zdHJpbmdzKTsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGBjdW11bGF0aXZlX3NraXBzJyBhcnJheSBub3cgdGhhdCBzdGFicyBoYXZlIGJlZW4KLSAgICAgZGVsZXRlZCBmb3IgdGhpcyBzZWN0aW9uLiAqLwotCi0gIGlmIChza2lwICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBpLCBvZmZzZXQ7Ci0gICAgICBiZmRfc2l6ZV90eXBlICpwc2tpcHM7Ci0KLSAgICAgIHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgPQotCShiZmRfc2l6ZV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLSAgICAgIGlmIChzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHBza2lwcyA9IHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHM7Ci0gICAgICBwc3RyaWR4ID0gc2VjaW5mby0+c3RyaWR4czsKLSAgICAgIG9mZnNldCA9IDA7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwc2tpcHMrKywgcHN0cmlkeCsrKQotCXsKLQkgICpwc2tpcHMgPSBvZmZzZXQ7Ci0JICBpZiAoKnBzdHJpZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICBvZmZzZXQgKz0gU1RBQlNJWkU7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChvZmZzZXQgIT0gMCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3RhYmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKHN0YWJidWYpOwotICBpZiAoc3RhYnN0cmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKHN0YWJzdHJidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgc3RhYiBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgcmVsb2NhdGVkCi0gICBjb250ZW50cy4gICovCi0KLWJvb2xlYW4KLV9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyAob3V0cHV0X2JmZCwgcHNpbmZvLCBzdGFic2VjLCBwc2VjaW5mbywgY29udGVudHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgUFRSICpwc2luZm87Ci0gICAgIGFzZWN0aW9uICpzdGFic2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIHN0cnVjdCBzdGFiX2luZm8gKnNpbmZvOwotICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnNlY2luZm87Ci0gIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqZTsKLSAgYmZkX2J5dGUgKnN5bSwgKnRvc3ltLCAqc3ltZW5kOwotICBiZmRfc2l6ZV90eXBlICpwc3RyaWR4OwotCi0gIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLSAgc2VjaW5mbyA9IChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKikgKnBzZWNpbmZvOwotCi0gIGlmIChzZWNpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgICBjb250ZW50cywgc3RhYnNlYy0+b3V0cHV0X29mZnNldCwKLQkJCQkgICAgIHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0KLSAgLyogSGFuZGxlIGVhY2ggTl9CSU5DTCBlbnRyeS4gICovCi0gIGZvciAoZSA9IHNlY2luZm8tPmV4Y2xzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpleGNsX3N5bTsKLQotICAgICAgQkZEX0FTU0VSVCAoZS0+b2Zmc2V0IDwgc3RhYnNlYy0+X3Jhd19zaXplKTsKLSAgICAgIGV4Y2xfc3ltID0gY29udGVudHMgKyBlLT5vZmZzZXQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBlLT52YWwsIGV4Y2xfc3ltICsgVkFMT0ZGKTsKLSAgICAgIGV4Y2xfc3ltW1RZUEVPRkZdID0gZS0+dHlwZTsKLSAgICB9Ci0KLSAgLyogQ29weSBvdmVyIGFsbCB0aGUgc3RhYnMgc3ltYm9scywgb21pdHRpbmcgdGhlIG9uZXMgd2UgZG9uJ3Qgd2FudCwKLSAgICAgYW5kIGNvcnJlY3RpbmcgdGhlIHN0cmluZyBpbmRpY2VzIGZvciB0aG9zZSB3ZSBkbyB3YW50LiAgKi8KLSAgdG9zeW0gPSBjb250ZW50czsKLSAgc3ltZW5kID0gY29udGVudHMgKyBzdGFic2VjLT5fcmF3X3NpemU7Ci0gIGZvciAoc3ltID0gY29udGVudHMsIHBzdHJpZHggPSBzZWNpbmZvLT5zdHJpZHhzOwotICAgICAgIHN5bSA8IHN5bWVuZDsKLSAgICAgICBzeW0gKz0gU1RBQlNJWkUsICsrcHN0cmlkeCkKLSAgICB7Ci0gICAgICBpZiAoKnBzdHJpZHggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXsKLQkgIGlmICh0b3N5bSAhPSBzeW0pCi0JICAgIG1lbWNweSAodG9zeW0sIHN5bSwgU1RBQlNJWkUpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKnBzdHJpZHgsIHRvc3ltICsgU1RSRFhPRkYpOwotCi0JICBpZiAoc3ltW1RZUEVPRkZdID09IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBoZWFkZXIgc3ltYm9sIGZvciB0aGUgc3RhYnMgc2VjdGlvbi4gIFdlCi0gICAgICAgICAgICAgICAgIGRvbid0IHJlYWxseSBuZWVkIG9uZSwgc2luY2Ugd2UgaGF2ZSBtZXJnZWQgYWxsIHRoZQotICAgICAgICAgICAgICAgICBpbnB1dCBzdGFicyBzZWN0aW9ucyBpbnRvIG9uZSwgYnV0IHdlIGdlbmVyYXRlIG9uZQotICAgICAgICAgICAgICAgICBmb3IgdGhlIGJlbmVmaXQgb2YgcmVhZGVycyB3aGljaCBleHBlY3QgdG8gc2VlIG9uZS4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoc3ltID09IGNvbnRlbnRzKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBfYmZkX3N0cmluZ3RhYl9zaXplIChzaW5mby0+c3RyaW5ncyksCi0JCQkgIHRvc3ltICsgVkFMT0ZGKTsKLQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLAotCQkJICBzdGFic2VjLT5vdXRwdXRfc2VjdGlvbi0+X3Jhd19zaXplIC8gU1RBQlNJWkUgLSAxLAotCQkJICB0b3N5bSArIERFU0NPRkYpOwotCSAgICB9Ci0KLQkgIHRvc3ltICs9IFNUQUJTSVpFOwotCX0KLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoKGJmZF9zaXplX3R5cGUpICh0b3N5bSAtIGNvbnRlbnRzKSA9PSBzdGFic2VjLT5fY29va2VkX3NpemUpOwotCi0gIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgIGNvbnRlbnRzLCBzdGFic2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgIHN0YWJzZWMtPl9jb29rZWRfc2l6ZSk7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWJzdHIgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChvdXRwdXRfYmZkLCBwc2luZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgUFRSICpwc2luZm87Ci17Ci0gIHN0cnVjdCBzdGFiX2luZm8gKnNpbmZvOwotCi0gIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLQotICBpZiAoc2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzaW5mby0+c3RhYnN0ci0+b3V0cHV0X3NlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFRoZSBzZWN0aW9uIHdhcyBkaXNjYXJkZWQgZnJvbSB0aGUgbGluay4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoKHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc2luZm8tPnN0cmluZ3MpKQotCSAgICAgIDw9IHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCShzaW5mby0+c3RhYnN0ci0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MKLQkJICsgc2luZm8tPnN0YWJzdHItPm91dHB1dF9vZmZzZXQpLAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgX2JmZF9zdHJpbmd0YWJfZW1pdCAob3V0cHV0X2JmZCwgc2luZm8tPnN0cmluZ3MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBubyBsb25nZXIgbmVlZCB0aGUgc3RhYnMgaW5mb3JtYXRpb24uICAqLwotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzaW5mby0+c3RyaW5ncyk7Ci0gIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZzaW5mby0+aW5jbHVkZXMucm9vdCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhbiBhZGRyZXNzIGluIHRoZSAuc3RhYiBzZWN0aW9uLiAgR2l2ZW4gT0ZGU0VUIHdpdGhpbgotICAgU1RBQlNFQywgdGhpcyByZXR1cm5zIHRoZSBuZXcgb2Zmc2V0IGluIHRoZSBhZGp1c3RlZCBzdGFiIHNlY3Rpb24sCi0gICBvciAtMSBpZiB0aGUgYWRkcmVzcyByZWZlcnMgdG8gYSBzdGFiIHdoaWNoIGhhcyBiZWVuIHJlbW92ZWQuICAqLwotCi1iZmRfdm1hCi1fYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQgKG91dHB1dF9iZmQsIHBzaW5mbywgc3RhYnNlYywgcHNlY2luZm8sIG9mZnNldCkKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiAqcHNpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzdGFic2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotICAgICBiZmRfdm1hIG9mZnNldDsKLXsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotCi0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLQotICBpZiAoc2VjaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiBvZmZzZXQ7Ci0KLSAgaWYgKG9mZnNldCA+PSBzdGFic2VjLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIG9mZnNldCAtIChzdGFic2VjLT5fY29va2VkX3NpemUgLSBzdGFic2VjLT5fcmF3X3NpemUpOwotCi0gIGlmIChzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzKQotICAgIHsKLSAgICAgIGJmZF92bWEgaTsKLQotICAgICAgaSA9IG9mZnNldCAvIFNUQUJTSVpFOwotCi0gICAgICBpZiAoc2VjaW5mby0+c3RyaWR4cyBbaV0gPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiAoYmZkX3ZtYSkgLTE7Ci0KLSAgICAgIHJldHVybiBvZmZzZXQgLSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzIFtpXTsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zdGFtcC1oLmluIGIvYmZkL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvYmZkL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2JmZC9zdW5vcy5jIGIvYmZkL3N1bm9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTY4NTcuLjAwMDAwMDAKLS0tIGEvYmZkL3N1bm9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQ4ICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBTdW5PUyBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zdW5vcy1iaWciCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3Vub3NfYmlnXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIFN0YXRpYyByb3V0aW5lcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3Vub3NfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKiwKLQkgICBiZmRfc2l6ZV90eXBlICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fc3RkX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fZXh0X3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2xpbmtfZHluYW1pY19vYmplY3QKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCi0JICAgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIHN1bm9zX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3Qgc3Vub3NfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCBzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBzdW5vc19maW5pc2hfZHluYW1pY19saW5rCi0KLS8qID8/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+ZmxhZ3MgfD0gU1VOT1NfQ09OU1RSVUNUT1I7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBuZWVkZWQgYnkgQkZELiAgKi8KLQotLypBUkdTVVNFRCovCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKgotYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci19Ci0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IG1hZGUgdG8gYSBzeW1ib2wgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBleGFtaW5lZCBhbGwgdGhlIGlucHV0IG9iamVjdHMuICBJZgotICAgICB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0LCBpdCBtZXJlbHkgbWVhbnMgdGhhdCBubyBvYmplY3QgcmVmZXJzCi0gICAgIHRvIGl0LCBhbmQgd2UgY2FuIGp1c3QgaWdub3JlIGl0IGF0IHRoaXMgcG9pbnQuICAqLwotICBoID0gc3Vub3NfbGlua19oYXNoX2xvb2t1cCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJbiBhIHNoYXJlZCBsaWJyYXJ5LCB0aGUgX19EWU5BTUlDIHN5bWJvbCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlCi0gICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkIHx8IHN0cmNtcCAobmFtZSwgIl9fRFlOQU1JQyIpICE9IDApCi0gICAgewotICAgICAgaC0+ZmxhZ3MgfD0gU1VOT1NfREVGX1JFR1VMQVI7Ci0KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB1cCB0aGUgc2l6ZXMgYW5kIGNvbnRlbnRzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zIGNyZWF0ZWQgaW4KLSAgIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgU3VuT1MgbGlua2VyCi0gICBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplcyBvZiB0aGUKLSAgIHNlY3Rpb25zIGJlZm9yZSB0aGUgbGlua2VyIHNldHMgdGhlIGFkZHJlc3NlcyBvZiB0aGUgdmFyaW91cwotICAgc2VjdGlvbnMuICBUaGlzIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgcmVhZGluZyBhbGwgdGhlIHJlbG9jcyBzbwotICAgdGhhdCB3ZSBjYW4gd29yayBvdXQgd2hpY2ggb25lcyBuZWVkIHRvIGJlY29tZSBkeW5hbWljIHJlbG9jcy4gIElmCi0gICBpbmZvLT5rZWVwX21lbW9yeSBpcyB0cnVlLCB3ZSBrZWVwIHRoZSByZWxvY3MgaW4gbWVtb3J5OyBvdGhlcndpc2UsCi0gICB3ZSBkaXNjYXJkIHRoZW0sIGFuZCB3aWxsIHJlYWQgdGhlbSBhZ2FpbiBsYXRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8sIHNkeW5wdHIsIHNuZWVkcHRyLAotCQkJCSBzcnVsZXNwdHIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICoqc2R5bnB0cjsKLSAgICAgYXNlY3Rpb24gKipzbmVlZHB0cjsKLSAgICAgYXNlY3Rpb24gKipzcnVsZXNwdHI7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBzaXplX3QgZHluc3ltY291bnQ7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGFzZWN0aW9uICpzOwotICBzaXplX3QgYnVja2V0Y291bnQ7Ci0gIHNpemVfdCBoYXNoYWxsb2M7Ci0gIHNpemVfdCBpOwotICBiZmQgKnN1YjsKLQotICAqc2R5bnB0ciA9IE5VTEw7Ci0gICpzbmVlZHB0ciA9IE5VTEw7Ci0gICpzcnVsZXNwdHIgPSBOVUxMOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEJ3MgYW5kIHJlYWQgdGhlaXIgcmVsb2NzLiAgSXQgd291bGQKLSAgICAgYmUgYmV0dGVyIGlmIHdlIGRpZG4ndCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCB0aGVyZSBpcyBubyBvdGhlciB3YXkKLSAgICAgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZHluYW1pYyByZWxvY3Mgd2UgbmVlZCwgYW5kLCBtb3JlCi0gICAgIGltcG9ydGFudGx5LCB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8ga25vdyB3aGljaCBzeW1ib2xzIHNob3VsZAotICAgICBnZXQgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgaWYgKChzdWItPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgJiYgc3ViLT54dmVjID09IG91dHB1dF9iZmQtPnh2ZWMpCi0JewotCSAgaWYgKCEgc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIHN1Yiwgb2JqX3RleHRzZWMgKHN1YiksCi0JCQkJICAgZXhlY19oZHIgKHN1YiktPmFfdHJzaXplKQotCSAgICAgIHx8ICEgc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIHN1Yiwgb2JqX2RhdGFzZWMgKHN1YiksCi0JCQkJICAgICAgZXhlY19oZHIgKHN1YiktPmFfZHJzaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZHluc3ltY291bnQgPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0KLSAgLyogSWYgdGhlcmUgd2VyZSBubyBkeW5hbWljIG9iamVjdHMgaW4gdGhlIGxpbmssIGFuZCB3ZSBkb24ndCBuZWVkCi0gICAgIHRvIGJ1aWxkIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgaWYgKCEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkCi0gICAgICAmJiAhIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gd2FzIG1lbnRpb25lZCwgZGVmaW5lIGl0LiAgKi8KLSAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGggIT0gTlVMTCAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCkKLSAgICB7Ci0gICAgICBoLT5mbGFncyB8PSBTVU5PU19ERUZfUkVHVUxBUjsKLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLSAgICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCi0gICAgICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIHNldAotICAgICAgICAgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byBiZSAweDEwMDAgYnl0ZXMgaW50byB0aGUgc2VjdGlvbiwKLSAgICAgICAgIHNvIHRoYXQgMTMgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gMHgxMDAwKQotCWgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLSAgICAgIGVsc2UKLQloLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSAwOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X2Jhc2UgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGFyZSBhbnkgc2hhcmVkIG9iamVjdHMgaW4gdGhlIGxpbmssIHRoZW4gd2UgbmVlZCB0byBzZXQKLSAgICAgdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQpCi0gICAgewotICAgICAgKnNkeW5wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICAgICAgLyogVGhlIC5keW5hbWljIHNlY3Rpb24gaXMgYWx3YXlzIHRoZSBzYW1lIHNpemUuICAqLwotICAgICAgcyA9ICpzZHlucHRyOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IChzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMpCi0JCSAgICAgICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUKLQkJICAgICAgKyBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWNfbGluaykpOwotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBhcyB3ZSByZWFkIHRoZSBpbnB1dCBmaWxlcy4gIFdlCi0JIHdpbGwgYnVpbGQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlICguZHluc3ltKSBhbmQgdGhlIGhhc2gKLQkgdGFibGUgKC5oYXNoKSB3aGVuIHdlIGJ1aWxkIHRoZSBmaW5hbCBzeW1ib2wgdGFibGUsIGJlY2F1c2UKLQkgdW50aWwgdGhlbiB3ZSBkbyBub3Qga25vdyB0aGUgY29ycmVjdCB2YWx1ZSB0byBnaXZlIHRoZQotCSBzeW1ib2xzLiAgV2UgYnVpbGQgdGhlIGR5bmFtaWMgc3ltYm9sIHN0cmluZyB0YWJsZSAoLmR5bnN0cikKLQkgaW4gYSB0cmF2ZXJzYWwgb2YgdGhlIHN5bWJvbCB0YWJsZSB1c2luZwotCSBzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaXMganVzdCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZGl2aWRlZAotCSBieSBmb3VyLiAgVG8gY29tcHV0ZSB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSwgd2UKLQkgbXVzdCBhY3R1YWxseSBjb21wdXRlIHRoZSBoYXNoIHRhYmxlLiAgTm9ybWFsbHkgd2UgbmVlZAotCSBleGFjdGx5IGFzIG1hbnkgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBhcyB0aGVyZSBhcmUKLQkgZHluYW1pYyBzeW1ib2xzLCBidXQgaWYgc29tZSBvZiB0aGUgYnVja2V0cyBhcmUgbm90IHVzZWQgd2UKLQkgd2lsbCBuZWVkIGFkZGl0aW9uYWwgZW50cmllcy4gIEluIHRoZSB3b3JzdCBjYXNlLCBldmVyeQotCSBzeW1ib2wgd2lsbCBoYXNoIHRvIHRoZSBzYW1lIGJ1Y2tldCwgYW5kIHdlIHdpbGwgbmVlZAotCSBCVUNLRVRDT1VOVCAtIDEgZXh0cmEgZW50cmllcy4gICovCi0gICAgICBpZiAoZHluc3ltY291bnQgPj0gNCkKLQlidWNrZXRjb3VudCA9IGR5bnN5bWNvdW50IC8gNDsKLSAgICAgIGVsc2UgaWYgKGR5bnN5bWNvdW50ID4gMCkKLQlidWNrZXRjb3VudCA9IGR5bnN5bWNvdW50OwotICAgICAgZWxzZQotCWJ1Y2tldGNvdW50ID0gMTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBoYXNoYWxsb2MgPSAoZHluc3ltY291bnQgKyBidWNrZXRjb3VudCAtIDEpICogSEFTSF9FTlRSWV9TSVpFOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIGhhc2hhbGxvYyk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBkeW5zeW1jb3VudCA+IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgaGFzaGFsbG9jKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBidWNrZXRjb3VudDsgaSsrKQotCVBVVF9XT1JEIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgLTEsIHMtPmNvbnRlbnRzICsgaSAqIEhBU0hfRU5UUllfU0laRSk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBidWNrZXRjb3VudCAqIEhBU0hfRU5UUllfU0laRTsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIC8qIFNjYW4gYWxsIHRoZSBzeW1ib2xzLCBwbGFjZSB0aGVtIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwKLQkgYW5kIGJ1aWxkIHRoZSBkeW5hbWljIGhhc2ggdGFibGUuICBXZSByZXVzZSBkeW5zeW1jb3VudCBhcyBhCi0JIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB3ZSBoYXZlIGFkZGVkIHNvIGZhci4gICovCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgPSAwOwotICAgICAgc3Vub3NfbGlua19oYXNoX3RyYXZlcnNlIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQlzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sLAotCQkJCShQVFIpIGluZm8pOwotICAgICAgQkZEX0FTU0VSVCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID09IGR5bnN5bWNvdW50KTsKLQotICAgICAgLyogVGhlIFN1bk9TIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8gYWxpZ24gdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0JIHN5bWJvbCBzdHJpbmdzIHRvIGEgbXVsdGlwbGUgb2YgOC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0JIGltcG9ydGFudCwgYnV0IGl0IGNhbid0IGh1cnQgbXVjaC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAoKHMtPl9yYXdfc2l6ZSAmIDcpICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0JICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLQkgIGFkZCA9IDggLSAocy0+X3Jhd19zaXplICYgNyk7Ci0JICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAocy0+Y29udGVudHMsCi0JCQkJCSAgICAgICAoc2l6ZV90KSAocy0+X3Jhd19zaXplICsgYWRkKSk7Ci0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbWVtc2V0IChjb250ZW50cyArIHMtPl9yYXdfc2l6ZSwgMCwgKHNpemVfdCkgYWRkKTsKLQkgIHMtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBzLT5fcmF3X3NpemUgKz0gYWRkOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSB3b3JrZWQgb3V0IHRoZSBzaXplcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgdGFibGUgYW5kIHRoZSBkeW5hbWljIHJlbG9jcywgYWxsb2NhdGUgc3RvcmFnZSBmb3IgdGhlbS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZS4gICovCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoZHlub2JqKSkKLQl7Ci0JY2FzZSBiZmRfYXJjaF9zcGFyYzoKLQkgIG1lbWNweSAocy0+Y29udGVudHMsIHNwYXJjX3BsdF9maXJzdF9lbnRyeSwgU1BBUkNfUExUX0VOVFJZX1NJWkUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9hcmNoX202OGs6Ci0JICBtZW1jcHkgKHMtPmNvbnRlbnRzLCBtNjhrX3BsdF9maXJzdF9lbnRyeSwgTTY4S19QTFRfRU5UUllfU0laRSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgdGhlCi0gICAgIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICBzLT5yZWxvY19jb3VudCA9IDA7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc25lZWRwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKTsKLSAgKnNydWxlc3B0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2NhbiB0aGUgcmVsb2NzIGZvciBhbiBpbnB1dCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBQVFIgcmVsb2NzOwotICBQVFIgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0gIGlmIChyZWxfc2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIHJlbG9jcyA9IGZyZWVfcmVsb2NzID0gYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX3NpemUpOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqbjsKLQotICAgICAgbiA9ICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0KSkpOwotICAgICAgaWYgKG4gPT0gTlVMTCkKLQlyZWxvY3MgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHNldF9hb3V0X3NlY3Rpb25fZGF0YSAoc2VjLCBuKTsKLQkgIHJlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9zaXplKTsKLQkgIGFvdXRfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSByZWxvY3M7Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlYy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxfc2l6ZSwgYWJmZCkgIT0gcmVsX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19zY2FuX3N0ZF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywKLQkJCQkgICAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJICAgcmVsX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3NjYW5fZXh0X3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLAotCQkJCSAgIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkgICByZWxfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbiB1c2luZyBzdGFuZGFyZCByZWxvY3MuICBXZQotICAgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGR5bmFtaWMKLSAgIHN5bWJvbC4gIElmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGFuIGVudHJ5IGlzIG1hZGUgaW4KLSAgIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgZG8gdGhlIHdyb25nCi0gICB0aGluZyBpZiB0aGUgc3ltYm9sIGlzIGFjdHVhbGx5IGRhdGE7IEkgZG9uJ3QgdGhpbmsgdGhlIFN1biAzCi0gICBuYXRpdmUgbGlua2VyIGhhbmRsZXMgdGhpcyBjYXNlIGNvcnJlY3RseSBlaXRoZXIuICBJZiB0aGUgc3ltYm9sIGlzCi0gICBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIHdlIG11c3QgcHJlc2VydmUgdGhlIHJlbG9jIGFzIGEgZHluYW1pYwotICAgcmVsb2MuICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gaGFuZGxlIHRoZSBQSUMgcmVsb2NzIGhlcmUgYnkKLSAgIGJ1aWxkaW5nIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX3N0ZF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywgcmVsb2NzLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc3BsdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzcmVsID0gTlVMTDsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGNvbnN0IHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbCwgKnJlbGVuZDsKLQotICAvKiBXZSBvbmx5IGtub3cgaG93IHRvIGhhbmRsZSBtNjhrIHBsdCBlbnRyaWVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoYWJmZCkgIT0gYmZkX2FyY2hfbTY4aykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkeW5vYmogPSBOVUxMOwotCi0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgcmVsX3NpemUgLyBSRUxPQ19TVERfU0laRTsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfaW5kZXg7Ci0gICAgICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBXZSBvbmx5IHdhbnQgcmVsb2NzIGFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLQl7Ci0JICBpZiAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykgPT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgc3ltYm9sIGluZGV4LiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLSAgICAgIGVsc2UKLQlyX2luZGV4ID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0KLSAgICAgIC8qIEdldCB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgLyogVGhpcyBzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbiwgYnV0IGl0IHdpbGwgaW4gYW55IGNhc2UKLQkgICAgIGJlIGNhdWdodCBpbiB0aGUgcmVsb2NhdGlvbiBwaGFzZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY29tbW9uIHN5bWJvbHMgaGF2ZSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCBzbwotCSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZW0uICBXZSBuZWVkIHRvIGNvbnNpZGVyIHRoYXQKLQkgd2UgbWF5IGhhdmUgYWxyZWFkeSBzZWVuIHRoaXMgc3ltYm9sIGFuZCBtYXJrZWQgaXQgdW5kZWZpbmVkOwotCSBpZiB0aGUgc3ltYm9sIGlzIHJlYWxseSB1bmRlZmluZWQsIHRoZW4gU1VOT1NfREVGX0RZTkFNSUMKLQkgd2lsbCBiZSB6ZXJvLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2dvdDsKLQotCSAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIGZhbHNlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQkgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotCSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICBzZ290LT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOwotCSAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQgPSB0cnVlOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgU1VOT1NfUkVGX1JFR1VMQVIpICE9IDApOwotICAgICAgQkZEX0FTU0VSVCAoaC0+cGx0X29mZnNldCAhPSAwCi0JCSAgfHwgKChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgICAgPyAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICYgRFlOQU1JQykgIT0gMAotCQkgICAgICA6IChoLT5yb290LnJvb3QudS51bmRlZi5hYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApKTsKLQotICAgICAgLyogVGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgb25seSBieSBhIGR5bmFtaWMKLQkgb2JqZWN0LiAgKi8KLQotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIC8qIFByZXN1bWFibHkgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCBhcyBiZWluZyB1bmRlZmluZWQgYnkKLQkgICAgIGFuIGVhcmxpZXIgcmVsb2MuICAqLwotCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX1NURF9TSVpFOwotCX0KLSAgICAgIGVsc2UgaWYgKChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl7Ci0JICBiZmQgKnN1YjsKLQotCSAgLyogVGhpcyByZWxvYyBpcyBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBJdCBtdXN0IGJlCi0JICAgICBjb3BpZWQgaW50byB0aGUgZHluYW1pYyByZWxvY3MuICBXZSBtYXJrIHRoZSBzeW1ib2wgYXMKLQkgICAgIGJlaW5nIHVuZGVmaW5lZC4gICovCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfU1REX1NJWkU7Ci0JICBzdWIgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IHN1YjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBXZSBtdXN0IGdpdmUgaXQgYW4KLQkgICAgIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgaWYgd2UgaGF2ZSBub3QKLQkgICAgIGFscmVhZHkgZG9uZSBzby4gIFdlIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3ltYm9sCi0JICAgICB0byB0aGUgLnBsdCBzZWN0aW9uOyB0aGlzIHdpbGwgY2F1c2UgcmVsb2NzIGFnYWluc3QgaXQgdG8KLQkgICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLQkgIGlmIChoLT5wbHRfb2Zmc2V0ID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID09IDApCi0JCXNwbHQtPl9yYXdfc2l6ZSA9IE02OEtfUExUX0VOVFJZX1NJWkU7Ci0JICAgICAgaC0+cGx0X29mZnNldCA9IHNwbHQtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkJewotCQkgIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID0gc3BsdDsKLQkJICBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSBzcGx0LT5fcmF3X3NpemU7Ci0JCX0KLQotCSAgICAgIHNwbHQtPl9yYXdfc2l6ZSArPSBNNjhLX1BMVF9FTlRSWV9TSVpFOwotCi0JICAgICAgLyogV2UgbWF5IGFsc28gbmVlZCBhIGR5bmFtaWMgcmVsb2MgZW50cnkuICAqLwotCSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkJc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX1NURF9TSVpFOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2NhbiB0aGUgcmVsb2NzIGZvciBhbiBpbnB1dCBzZWN0aW9uIHVzaW5nIGV4dGVuZGVkIHJlbG9jcy4gIFdlCi0gICBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBmb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZHluYW1pYwotICAgc3ltYm9sLiAgSWYgdGhlIHJlbG9jIGlzIGEgV0RJU1AzMCwgYW5kIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0Ci0gICBzZWN0aW9uLCBhbiBlbnRyeSBpcyBtYWRlIGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4KLSAgIE90aGVyd2lzZSwgd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgcmVsb2MgYXMgYSBkeW5hbWljIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fZXh0X3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLCByZWxvY3MsIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWwsICpyZWxlbmQ7Ci0gIGFzZWN0aW9uICpzcGx0ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbCA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgU1BBUkMgcGx0IGVudHJpZXMuICAqLwotICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9zcGFyYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkeW5vYmogPSBOVUxMOwotCi0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgcmVsX3NpemUgLyBSRUxPQ19FWFRfU0laRTsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0KLSAgICAgIC8qIFN3YXAgaW4gdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXsKLQkgIHJfaW5kZXggPSAoKHJlbC0+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+X3Jhd19zaXplICs9IEhBU0hfRU5UUllfU0laRTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMaW5rIGEgZHluYW1pYyBvYmplY3QuICBXZSBhY3R1YWxseSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIGF0Ci0gICB0aGlzIHBvaW50LiAgVGhpcyBlbnRyeSBwb2ludCBleGlzdHMgdG8gcHJldmVudCB0aGUgcmVndWxhciBsaW5rZXIKLSAgIGNvZGUgZnJvbSBkb2luZyBhbnl0aGluZyB3aXRoIHRoZSBvYmplY3QuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdW5vc19saW5rX2R5bmFtaWNfb2JqZWN0IChpbmZvLCBhYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIGR5bmFtaWMgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGZpbmFsIHRyYXZlcnNhbAotICAgb3ZlciB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotICBpbnQgdHlwZTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKm91dHN5bTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGZpbGwgaW4gdGhlCi0gICAgIHRhYmxlIGVudHJ5LiAgKi8KLSAgaWYgKGgtPnBsdF9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmQgKmR5bm9iajsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGJmZF92bWEgcl9hZGRyZXNzOwotCi0gICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBwID0gc3BsdC0+Y29udGVudHMgKyBoLT5wbHRfb2Zmc2V0OwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQotICAgICAgcl9hZGRyZXNzID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaC0+cGx0X29mZnNldCk7Ci0KLSAgICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChvdXRwdXRfYmZkKSkKLQl7Ci0JY2FzZSBiZmRfYXJjaF9zcGFyYzoKLQkgIGlmIChpbmZvLT5zaGFyZWQgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19QTFRfRU5UUllfV09SRDAsIHApOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIChTUEFSQ19QTFRfRU5UUllfV09SRDEKLQkJCSAgICsgKCgoLSAoaC0+cGx0X29mZnNldCArIDQpID4+IDIpCi0JCQkgICAgICAgJiAweDNmZmZmZmZmKSkpLAotCQkJICBwICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1BBUkNfUExUX0VOVFJZX1dPUkQyICsgcy0+cmVsb2NfY291bnQsCi0JCQkgIHAgKyA4KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICB2YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBoLT5yb290LnJvb3QudS5kZWYudmFsdWUpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIFNQQVJDX1BMVF9QSUNfV09SRDAgKyAoKHZhbCA+PiAxMCkgJiAweDNmZmZmZiksCi0JCQkgIHApOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIFNQQVJDX1BMVF9QSUNfV09SRDEgKyAodmFsICYgMHgzZmYpLAotCQkJICBwICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1BBUkNfUExUX1BJQ19XT1JEMiwgcCArIDgpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX2FyY2hfbTY4azoKLQkgIGlmICghIGluZm8tPnNoYXJlZCAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkKLQkgICAgYWJvcnQgKCk7Ci0JICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCBNNjhLX1BMVF9FTlRSWV9XT1JEMCwgcCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoLSAoaC0+cGx0X29mZnNldCArIDIpKSwgcCArIDIpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgcy0+cmVsb2NfY291bnQsIHAgKyA2KTsKLQkgIHJfYWRkcmVzcyArPSAyOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gYWRkIGEganVtcCB0YWJsZSByZWxvYywgdW5sZXNzIHRoaXMgaXMgdGhlCi0gICAgICAgICByZXN1bHQgb2YgYSBKTVBfVEJMIHJlbG9jIGZyb20gUElDIGNvbXBpbGVkIGNvZGUuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZCB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ID49IDApOwotCSAgQkZEX0FTU0VSVCAocy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKQotCQkgICAgICA8IHMtPl9yYXdfc2l6ZSk7Ci0JICBwID0gcy0+Y29udGVudHMgKyBzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChvdXRwdXRfYmZkKTsKLQkgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAob3V0cHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCi0JICAgICAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHA7Ci0JICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHJfYWRkcmVzcywgc3JlbC0+cl9hZGRyZXNzKTsKLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCk7Ci0JCSAgc3JlbC0+cl90eXBlWzBdID0gKFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcKLQkJCQkgICAgIHwgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSloLT5keW5pbmR4OwotCQkgIHNyZWwtPnJfdHlwZVswXSA9IChSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCi0JCQkJICAgICB8IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLQotCSAgICAgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBwOwotCSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCByX2FkZHJlc3MsIGVyZWwtPnJfYWRkcmVzcyk7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaC0+ZHluaW5keDsKLQkJICBlcmVsLT5yX3R5cGVbMF0gPQotCQkgICAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcKLQkJICAgICB8IChSRUxPQ19KTVBfU0xPVCA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRykpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWgtPmR5bmluZHg7Ci0JCSAgZXJlbC0+cl90eXBlWzBdID0KLQkJICAgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCi0JCSAgICAgfCAoUkVMT0NfSk1QX1NMT1QgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpKTsKLQkJfQotCSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgZXJlbC0+cl9hZGRlbmQpOwotCSAgICB9Ci0KLQkgICsrcy0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLCB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nCi0gICAgIGVsc2UuICBXZSBvbmx5IGNoZWNrIHRoaXMgYWZ0ZXIgaGFuZGxpbmcgdGhlIFBMVCBlbnRyeSwgYmVjYXVzZQotICAgICB3ZSBjYW4gaGF2ZSBhIFBMVCBlbnRyeSBmb3IgYSBub25keW5hbWljIHN5bWJvbCB3aGVuIGxpbmtpbmcgUElDCi0gICAgIGNvbXBpbGVkIGNvZGUgZnJvbSBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKGgtPmR5bmluZHggPCAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN3aXRjaCAoaC0+cm9vdC5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIGFib3J0ICgpOwotICAgICAgLyogQXZvaWQgdmFyaWFibGUgbm90IGluaXRpYWxpemVkIHdhcm5pbmdzLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgICB0eXBlID0gTl9VTkRGIHwgTl9FWFQ7Ci0gICAgICB2YWwgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICB7Ci0JYXNlY3Rpb24gKnNlYzsKLQlhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQlzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQlvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JQkZEX0FTU0VSVCAoYmZkX2lzX2Fic19zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLQkJICAgIHx8IG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQlpZiAoaC0+cGx0X29mZnNldCAhPSAwCi0JICAgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgewotCSAgICB0eXBlID0gTl9VTkRGIHwgTl9FWFQ7Ci0JICAgIHZhbCA9IDA7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgID8gTl9URVhUCi0JCSAgICAgIDogTl9XRUFLVCk7Ci0JICAgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fREFUQQotCQkgICAgICA6IE5fV0VBS0QpOwotCSAgICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fQlNTCi0JCSAgICAgIDogTl9XRUFLQik7Ci0JICAgIGVsc2UKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fQUJTCi0JCSAgICAgIDogTl9XRUFLQSk7Ci0JICAgIHR5cGUgfD0gTl9FWFQ7Ci0JICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICB0eXBlID0gTl9VTkRGIHwgTl9FWFQ7Ci0gICAgICB2YWwgPSBoLT5yb290LnJvb3QudS5jLnNpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgdHlwZSA9IE5fV0VBS1U7Ci0gICAgICB2YWwgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IElnbm9yZSB0aGVzZSBmb3Igbm93LiAgVGhlIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2gKLQkgdGhleSBzaG91bGQgYmUgd3JpdHRlbiBvdXQgYXJlIG5vdCBjbGVhciB0byBtZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAiLmR5bnN5bSIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvdXRzeW0gPSAoKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKQotCSAgICAocy0+Y29udGVudHMgKyBoLT5keW5pbmR4ICogRVhURVJOQUxfTkxJU1RfU0laRSkpOwotCi0gIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCB0eXBlLCBvdXRzeW0tPmVfdHlwZSk7Ci0gIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0tPmVfb3RoZXIpOwotCi0gIC8qIEZJWE1FOiBUaGUgbmF0aXZlIGxpbmtlciBkb2Vzbid0IHVzZSAwIGZvciBkZXNjLiAgSXQgc2VlbXMgdG8gdXNlCi0gICAgIG9uZSBsZXNzIHRoYW4gdGhlIGRlc2MgdmFsdWUgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBhbHRob3VnaCB0aGF0Ci0gICAgIHNlZW1zIHVubGlrZWx5LiAgKi8KLSAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0tPmVfZGVzYyk7Ci0KLSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIGgtPmR5bnN0cl9pbmRleCwgb3V0c3ltLT5lX3N0cngpOwotICBQVVRfV09SRCAob3V0cHV0X2JmZCwgdmFsLCBvdXRzeW0tPmVfdmFsdWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gIElmIHRoaXMKLSAgIGlzIGEgcmVsb2Mgd2hpY2ggYXJlIGFyZSBnb2luZyB0byBjb3B5IGFzIGEgZHluYW1pYyByZWxvYywgdGhlbgotICAgY29weSBpdCBvdmVyLCBhbmQgdGVsbCB0aGUgY2FsbGVyIHRvIG5vdCBib3RoZXIgcHJvY2Vzc2luZyB0aGlzCi0gICByZWxvYy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaGFyZywgcmVsb2MsCi0JCQkgICBjb250ZW50cywgc2tpcCwgcmVsb2NhdGlvbnApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLSAgICAgUFRSIHJlbG9jOwotICAgICBiZmRfYnl0ZSAqY29udGVudHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiAqc2tpcDsKLSAgICAgYmZkX3ZtYSAqcmVsb2NhdGlvbnA7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotICBiZmQgKmR5bm9iajsKLSAgYm9vbGVhbiBiYXNlcmVsOwotICBib29sZWFuIGptcHRibDsKLSAgYm9vbGVhbiBwY3JlbDsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9ieXRlICpwOwotICBsb25nIGluZHg7Ci0KLSAgKnNraXAgPSBmYWxzZTsKLQotICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+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+b3V0cHV0X3NlY3Rpb24sICZlc2RsLAotCQkJCSAgICAgIChzZHluLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICAgICsgc2l6ZW9mIGVzZAotCQkJCSAgICAgICArIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFKSwKLQkJCQkgICAgICBzaXplb2YgZXNkbCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zeW1zLmMgYi9iZmQvc3ltcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZmMDY3Li4wMDAwMDAwCi0tLSBhL2JmZC9zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcwICswLDAgQEAKLS8qIEdlbmVyaWMgc3ltYm9sLXRhYmxlIHN1cHBvcnQgZm9yIHRoZSBCRkQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlTeW1ib2xzCi0KLQlCRkQgdHJpZXMgdG8gbWFpbnRhaW4gYXMgbXVjaCBzeW1ib2wgaW5mb3JtYXRpb24gYXMgaXQgY2FuIHdoZW4KLQlpdCBtb3ZlcyBpbmZvcm1hdGlvbiBmcm9tIGZpbGUgdG8gZmlsZS4gQkZEIHBhc3NlcyBpbmZvcm1hdGlvbgotCXRvIGFwcGxpY2F0aW9ucyB0aG91Z2ggdGhlIDw8YXN5bWJvbD4+IHN0cnVjdHVyZS4gV2hlbiB0aGUKLQlhcHBsaWNhdGlvbiByZXF1ZXN0cyB0aGUgc3ltYm9sIHRhYmxlLCBCRkQgcmVhZHMgdGhlIHRhYmxlIGluCi0JdGhlIG5hdGl2ZSBmb3JtIGFuZCB0cmFuc2xhdGVzIHBhcnRzIG9mIGl0IGludG8gdGhlIGludGVybmFsCi0JZm9ybWF0LiBUbyBtYWludGFpbiBtb3JlIHRoYW4gdGhlIGluZm9ybWF0aW9uIHBhc3NlZCB0bwotCWFwcGxpY2F0aW9ucywgc29tZSB0YXJnZXRzIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBgYGJlaGluZCB0aGUKLQlzY2VuZXMnJyBpbiBhIHN0cnVjdHVyZSBvbmx5IHRoZSBwYXJ0aWN1bGFyIGJhY2sgZW5kIGtub3dzCi0JYWJvdXQuIEZvciBleGFtcGxlLCB0aGUgY29mZiBiYWNrIGVuZCBrZWVwcyB0aGUgb3JpZ2luYWwKLQlzeW1ib2wgdGFibGUgc3RydWN0dXJlIGFzIHdlbGwgYXMgdGhlIGNhbm9uaWNhbCBzdHJ1Y3R1cmUgd2hlbgotCWEgQkZEIGlzIHJlYWQgaW4uIE9uIG91dHB1dCwgdGhlIGNvZmYgYmFjayBlbmQgY2FuIHJlY29uc3RydWN0Ci0JdGhlIG91dHB1dCBzeW1ib2wgdGFibGUgc28gdGhhdCBubyBpbmZvcm1hdGlvbiBpcyBsb3N0LCBldmVuCi0JaW5mb3JtYXRpb24gdW5pcXVlIHRvIGNvZmYgd2hpY2ggQkZEIGRvZXNuJ3Qga25vdyBvcgotCXVuZGVyc3RhbmQuIElmIGEgY29mZiBzeW1ib2wgdGFibGUgd2VyZSByZWFkLCBidXQgd2VyZSB3cml0dGVuCi0JdGhyb3VnaCBhbiBhLm91dCBiYWNrIGVuZCwgYWxsIHRoZSBjb2ZmIHNwZWNpZmljIGluZm9ybWF0aW9uCi0Jd291bGQgYmUgbG9zdC4gVGhlIHN5bWJvbCB0YWJsZSBvZiBhIEJGRAotCWlzIG5vdCBuZWNlc3NhcmlseSByZWFkIGluIHVudGlsIGEgY2Fub25pY2FsaXplIHJlcXVlc3QgaXMKLQltYWRlLiBUaGVuIHRoZSBCRkQgYmFjayBlbmQgZmlsbHMgaW4gYSB0YWJsZSBwcm92aWRlZCBieSB0aGUKLQlhcHBsaWNhdGlvbiB3aXRoIHBvaW50ZXJzIHRvIHRoZSBjYW5vbmljYWwgaW5mb3JtYXRpb24uICBUbwotCW91dHB1dCBzeW1ib2xzLCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZXMgQkZEIHdpdGggYSB0YWJsZSBvZgotCXBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvIDw8YXN5bWJvbD4+cy4gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zCi0JbGlrZSB0aGUgbGlua2VyIHRvIG91dHB1dCBhIHN5bWJvbCBhcyBpdCB3YXMgcmVhZCwgc2luY2UgdGhlIGBgYmVoaW5kCi0JdGhlIHNjZW5lcycnIGluZm9ybWF0aW9uIHdpbGwgYmUgc3RpbGwgYXZhaWxhYmxlLgotQG1lbnUKLUAqIFJlYWRpbmcgU3ltYm9sczo6Ci1AKiBXcml0aW5nIFN5bWJvbHM6OgotQCogTWluaSBTeW1ib2xzOjoKLUAqIHR5cGVkZWYgYXN5bWJvbDo6Ci1AKiBzeW1ib2wgaGFuZGxpbmcgZnVuY3Rpb25zOjoKLUBlbmQgbWVudQotCi1JTk9ERQotUmVhZGluZyBTeW1ib2xzLCBXcml0aW5nIFN5bWJvbHMsIFN5bWJvbHMsIFN5bWJvbHMKLVNVQlNFQ1RJT04KLQlSZWFkaW5nIHN5bWJvbHMKLQotCVRoZXJlIGFyZSB0d28gc3RhZ2VzIHRvIHJlYWRpbmcgYSBzeW1ib2wgdGFibGUgZnJvbSBhIEJGRDoKLQlhbGxvY2F0aW5nIHN0b3JhZ2UsIGFuZCB0aGUgYWN0dWFsIHJlYWRpbmcgcHJvY2Vzcy4gVGhpcyBpcyBhbgotCWV4Y2VycHQgZnJvbSBhbiBhcHBsaWNhdGlvbiB3aGljaCByZWFkcyB0aGUgc3ltYm9sIHRhYmxlOgotCi18CSAgbG9uZyBzdG9yYWdlX25lZWRlZDsKLXwJICBhc3ltYm9sICoqc3ltYm9sX3RhYmxlOwotfAkgIGxvbmcgbnVtYmVyX29mX3N5bWJvbHM7Ci18CSAgbG9uZyBpOwotfAotfAkgIHN0b3JhZ2VfbmVlZGVkID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotfAotfCAgICAgICAgIGlmIChzdG9yYWdlX25lZWRlZCA8IDApCi18ICAgICAgICAgICBGQUlMCi18Ci18CSAgaWYgKHN0b3JhZ2VfbmVlZGVkID09IDApIHsKLXwJICAgICByZXR1cm4gOwotfAkgIH0KLXwJICBzeW1ib2xfdGFibGUgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZV9uZWVkZWQpOwotfAkgICAgLi4uCi18CSAgbnVtYmVyX29mX3N5bWJvbHMgPQotfAkgICAgIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1ib2xfdGFibGUpOwotfAotfCAgICAgICAgIGlmIChudW1iZXJfb2Zfc3ltYm9scyA8IDApCi18ICAgICAgICAgICBGQUlMCi18Ci18CSAgZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9zeW1ib2xzOyBpKyspIHsKLXwJICAgICBwcm9jZXNzX3N5bWJvbCAoc3ltYm9sX3RhYmxlW2ldKTsKLXwJICB9Ci0KLQlBbGwgc3RvcmFnZSBmb3IgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpcyBpbiBhbiBvYmphbGxvYwotCWNvbm5lY3RlZCB0byB0aGUgQkZEOyBpdCBpcyBmcmVlZCB3aGVuIHRoZSBCRkQgaXMgY2xvc2VkLgotCi0KLUlOT0RFCi1Xcml0aW5nIFN5bWJvbHMsIE1pbmkgU3ltYm9scywgUmVhZGluZyBTeW1ib2xzLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JV3JpdGluZyBzeW1ib2xzCi0KLQlXcml0aW5nIG9mIGEgc3ltYm9sIHRhYmxlIGlzIGF1dG9tYXRpYyB3aGVuIGEgQkZEIG9wZW4gZm9yCi0Jd3JpdGluZyBpcyBjbG9zZWQuIFRoZSBhcHBsaWNhdGlvbiBhdHRhY2hlcyBhIHZlY3RvciBvZgotCXBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvIHN5bWJvbHMgdG8gdGhlIEJGRCBiZWluZyB3cml0dGVuLCBhbmQKLQlmaWxscyBpbiB0aGUgc3ltYm9sIGNvdW50LiBUaGUgY2xvc2UgYW5kIGNsZWFudXAgY29kZSByZWFkcwotCXRocm91Z2ggdGhlIHRhYmxlIHByb3ZpZGVkIGFuZCBwZXJmb3JtcyBhbGwgdGhlIG5lY2Vzc2FyeQotCW9wZXJhdGlvbnMuIFRoZSBCRkQgb3V0cHV0IGNvZGUgbXVzdCBhbHdheXMgYmUgcHJvdmlkZWQgd2l0aCBhbgotCWBgb3duZWQnJyBzeW1ib2w6IG9uZSB3aGljaCBoYXMgY29tZSBmcm9tIGFub3RoZXIgQkZELCBvciBvbmUKLQl3aGljaCBoYXMgYmVlbiBjcmVhdGVkIHVzaW5nIDw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4uICBIZXJlIGlzIGFuCi0JZXhhbXBsZSBzaG93aW5nIHRoZSBjcmVhdGlvbiBvZiBhIHN5bWJvbCB0YWJsZSB3aXRoIG9ubHkgb25lIGVsZW1lbnQ6Ci0KLXwJI2luY2x1ZGUgImJmZC5oIgotfAltYWluKCkKLXwJewotfAkgIGJmZCAqYWJmZDsKLXwJICBhc3ltYm9sICpwdHJzWzJdOwotfAkgIGFzeW1ib2wgKm5ldzsKLXwKLXwJICBhYmZkID0gYmZkX29wZW53KCJmb28iLCJhLm91dC1zdW5vcy1iaWciKTsKLXwJICBiZmRfc2V0X2Zvcm1hdChhYmZkLCBiZmRfb2JqZWN0KTsKLXwJICBuZXcgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci18CSAgbmV3LT5uYW1lID0gImR1bW15X3N5bWJvbCI7Ci18CSAgbmV3LT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5KGFiZmQsICIudGV4dCIpOwotfAkgIG5ldy0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotfAkgIG5ldy0+dmFsdWUgPSAweDEyMzQ1OwotfAotfAkgIHB0cnNbMF0gPSBuZXc7Ci18CSAgcHRyc1sxXSA9IChhc3ltYm9sICopMDsKLXwKLXwJICBiZmRfc2V0X3N5bXRhYihhYmZkLCBwdHJzLCAxKTsKLXwJICBiZmRfY2xvc2UoYWJmZCk7Ci18CX0KLXwKLXwJLi9tYWtlc3ltCi18CW5tIGZvbwotfAkwMDAxMjM0NSBBIGR1bW15X3N5bWJvbAotCi0JTWFueSBmb3JtYXRzIGNhbm5vdCByZXByZXNlbnQgYXJiaXRhcnkgc3ltYm9sIGluZm9ybWF0aW9uOyBmb3IKLSAJaW5zdGFuY2UsIHRoZSA8PGEub3V0Pj4gb2JqZWN0IGZvcm1hdCBkb2VzIG5vdCBhbGxvdyBhbgotCWFyYml0YXJ5IG51bWJlciBvZiBzZWN0aW9ucy4gQSBzeW1ib2wgcG9pbnRpbmcgdG8gYSBzZWN0aW9uCi0Jd2hpY2ggaXMgbm90IG9uZSAgb2YgPDwudGV4dD4+LCA8PC5kYXRhPj4gb3IgPDwuYnNzPj4gY2Fubm90Ci0JYmUgZGVzY3JpYmVkLgotCi1JTk9ERQotTWluaSBTeW1ib2xzLCB0eXBlZGVmIGFzeW1ib2wsIFdyaXRpbmcgU3ltYm9scywgU3ltYm9scwotU1VCU0VDVElPTgotCU1pbmkgU3ltYm9scwotCi0JTWluaSBzeW1ib2xzIHByb3ZpZGUgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgc3ltYm9sIHRhYmxlLgotCVRoZXkgdXNlIGxlc3MgbWVtb3J5IHNwYWNlLCBidXQgcmVxdWlyZSBtb3JlIHRpbWUgdG8gYWNjZXNzLgotCVRoZXkgY2FuIGJlIHVzZWZ1bCBmb3IgdG9vbHMgbGlrZSBubSBvciBvYmpkdW1wLCB3aGljaCBtYXkKLQloYXZlIHRvIGhhbmRsZSBzeW1ib2wgdGFibGVzIG9mIGV4dHJlbWVseSBsYXJnZSBleGVjdXRhYmxlcy4KLQotCVRoZSA8PGJmZF9yZWFkX21pbmlzeW1ib2xzPj4gZnVuY3Rpb24gd2lsbCByZWFkIHRoZSBzeW1ib2xzCi0JaW50byBtZW1vcnkgaW4gYW4gaW50ZXJuYWwgZm9ybS4gIEl0IHdpbGwgcmV0dXJuIGEgPDx2b2lkICo+PgotCXBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnksIGEgc3ltYm9sIGNvdW50LCBhbmQgdGhlIHNpemUgb2YKLQllYWNoIHN5bWJvbC4gIFRoZSBwb2ludGVyIGlzIGFsbG9jYXRlZCB1c2luZyA8PG1hbGxvYz4+LCBhbmQKLQlzaG91bGQgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCi0KLQlUaGUgZnVuY3Rpb24gPDxiZmRfbWluaXN5bWJvbF90b19zeW1ib2w+PiB3aWxsIHRha2UgYSBwb2ludGVyCi0JdG8gYSBtaW5pc3ltYm9sLCBhbmQgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHJldHVybmVkIGJ5Ci0JPDxiZmRfbWFrZV9lbXB0eV9zeW1ib2w+PiwgYW5kIHJldHVybiBhIDw8YXN5bWJvbD4+IHN0cnVjdHVyZS4KLQlUaGUgcmV0dXJuIHZhbHVlIG1heSBvciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBmcm9tCi0JPDxiZmRfbWFrZV9lbXB0eV9zeW1ib2w+PiB3aGljaCB3YXMgcGFzc2VkIGluLgotCi0qLwotCi0KLQotLyoKLURPQ0RECi1JTk9ERQotdHlwZWRlZiBhc3ltYm9sLCBzeW1ib2wgaGFuZGxpbmcgZnVuY3Rpb25zLCBNaW5pIFN5bWJvbHMsIFN5bWJvbHMKLQotKi8KLS8qCi1TVUJTRUNUSU9OCi0JdHlwZWRlZiBhc3ltYm9sCi0KLQlBbiA8PGFzeW1ib2w+PiBoYXMgdGhlIGZvcm06Ci0KLSovCi0KLS8qCi1DT0RFX0ZSQUdNRU5UCi0KLS4KLS50eXBlZGVmIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkKLS57Ci0uCXsqIEEgcG9pbnRlciB0byB0aGUgQkZEIHdoaWNoIG93bnMgdGhlIHN5bWJvbC4gVGhpcyBpbmZvcm1hdGlvbgotLgkgICBpcyBuZWNlc3Nhcnkgc28gdGhhdCBhIGJhY2sgZW5kIGNhbiB3b3JrIG91dCB3aGF0IGFkZGl0aW9uYWwKLS4gICAJICAgaW5mb3JtYXRpb24gKGludmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24gd3JpdGVyKSBpcyBjYXJyaWVkCi0uCSAgIHdpdGggdGhlIHN5bWJvbC4KLS4KLS4JICAgVGhpcyBmaWVsZCBpcyAqYWxtb3N0KiByZWR1bmRhbnQsIHNpbmNlIHlvdSBjYW4gdXNlIHNlY3Rpb24tPm93bmVyCi0uCSAgIGluc3RlYWQsIGV4Y2VwdCB0aGF0IHNvbWUgc3ltYm9scyBwb2ludCB0byB0aGUgZ2xvYmFsIHNlY3Rpb25zCi0uCSAgIGJmZF97YWJzLGNvbSx1bmR9X3NlY3Rpb24uICBUaGlzIGNvdWxkIGJlIGZpeGVkIGJ5IG1ha2luZwotLgkgICB0aGVzZSBnbG9iYWxzIGJlIHBlci1iZmQgKG9yIHBlci10YXJnZXQtZmxhdm9yKS4gIEZJWE1FLiAqfQotLgotLiAgc3RydWN0IF9iZmQgKnRoZV9iZmQ7IHsqIFVzZSBiZmRfYXN5bWJvbF9iZmQoc3ltKSB0byBhY2Nlc3MgdGhpcyBmaWVsZC4gKn0KLS4KLS4JeyogVGhlIHRleHQgb2YgdGhlIHN5bWJvbC4gVGhlIG5hbWUgaXMgbGVmdCBhbG9uZSwgYW5kIG5vdCBjb3BpZWQ7IHRoZQotLgkgICBhcHBsaWNhdGlvbiBtYXkgbm90IGFsdGVyIGl0LiAqfQotLiAgQ09OU1QgY2hhciAqbmFtZTsKLS4KLS4JeyogVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBUaGlzIHJlYWxseSBzaG91bGQgYmUgYSB1bmlvbiBvZiBhCi0uICAgICAgICAgIG51bWVyaWMgdmFsdWUgd2l0aCBhIHBvaW50ZXIsIHNpbmNlIHNvbWUgZmxhZ3MgaW5kaWNhdGUgdGhhdAotLiAgICAgICAgICBhIHBvaW50ZXIgdG8gYW5vdGhlciBzeW1ib2wgaXMgc3RvcmVkIGhlcmUuICAqfQotLiAgc3ltdmFsdWUgdmFsdWU7Ci0uCi0uCXsqIEF0dHJpYnV0ZXMgb2YgYSBzeW1ib2w6ICp9Ci0uCi0uI2RlZmluZSBCU0ZfTk9fRkxBR1MgICAgMHgwMAotLgotLgl7KiBUaGUgc3ltYm9sIGhhcyBsb2NhbCBzY29wZTsgPDxzdGF0aWM+PiBpbiA8PEM+Pi4gVGhlIHZhbHVlCi0uIAkgICBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICp9Ci0uI2RlZmluZSBCU0ZfTE9DQUwJMHgwMQotLgotLgl7KiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGU7IGluaXRpYWxpemVkIGRhdGEgaW4gPDxDPj4uIFRoZQotLgkgICB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICp9Ci0uI2RlZmluZSBCU0ZfR0xPQkFMCTB4MDIKLS4KLS4JeyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlIGFuZCBpcyBleHBvcnRlZC4gVGhlIHZhbHVlIGlzCi0uCSAgIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKn0KLS4jZGVmaW5lIEJTRl9FWFBPUlQJQlNGX0dMT0JBTCB7KiBubyByZWFsIGRpZmZlcmVuY2UgKn0KLS4KLS4JeyogQSBub3JtYWwgQyBzeW1ib2wgd291bGQgYmUgb25lIG9mOgotLgkgICA8PEJTRl9MT0NBTD4+LCA8PEJTRl9GT1JUX0NPTU0+PiwgIDw8QlNGX1VOREVGSU5FRD4+IG9yCi0uCSAgIDw8QlNGX0dMT0JBTD4+ICp9Ci0uCi0uCXsqIFRoZSBzeW1ib2wgaXMgYSBkZWJ1Z2dpbmcgcmVjb3JkLiBUaGUgdmFsdWUgaGFzIGFuIGFyYml0YXJ5Ci0uCSAgIG1lYW5pbmcsIHVubGVzcyBCU0ZfREVCVUdHSU5HX1JFTE9DIGlzIGFsc28gc2V0LiAgKn0KLS4jZGVmaW5lIEJTRl9ERUJVR0dJTkcJMHgwOAotLgotLgl7KiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gIFVzZWQgaW4gRUxGLAotLgkgICBwZXJoYXBzIG90aGVycyBzb21lZGF5LiAgKn0KLS4jZGVmaW5lIEJTRl9GVU5DVElPTiAgICAweDEwCi0uCi0uCXsqIFVzZWQgYnkgdGhlIGxpbmtlci4gKn0KLS4jZGVmaW5lIEJTRl9LRUVQICAgICAgICAweDIwCi0uI2RlZmluZSBCU0ZfS0VFUF9HICAgICAgMHg0MAotLgotLgl7KiBBIHdlYWsgZ2xvYmFsIHN5bWJvbCwgb3ZlcnJpZGFibGUgd2l0aG91dCB3YXJuaW5ncyBieQotLgkgICBhIHJlZ3VsYXIgZ2xvYmFsIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgKn0KLS4jZGVmaW5lIEJTRl9XRUFLICAgICAgICAweDgwCi0uCi0uICAgICAgIHsqIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIHRvIHBvaW50IHRvIGEgc2VjdGlvbiwgZS5nLiBFTEYncwotLgkgICBTVFRfU0VDVElPTiBzeW1ib2xzLiAgKn0KLS4jZGVmaW5lIEJTRl9TRUNUSU9OX1NZTSAweDEwMAotLgotLgl7KiBUaGUgc3ltYm9sIHVzZWQgdG8gYmUgYSBjb21tb24gc3ltYm9sLCBidXQgbm93IGl0IGlzCi0uCSAgIGFsbG9jYXRlZC4gKn0KLS4jZGVmaW5lIEJTRl9PTERfQ09NTU9OICAweDIwMAotLgotLgl7KiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgY29tbW9uIGRhdGEuICp9Ci0uI2RlZmluZSBCRkRfRk9SVF9DT01NX0RFRkFVTFRfVkFMVUUgMAotLgotLgl7KiBJbiBzb21lIGZpbGVzIHRoZSB0eXBlIG9mIGEgc3ltYm9sIHNvbWV0aW1lcyBhbHRlcnMgaXRzCi0uCSAgIGxvY2F0aW9uIGluIGFuIG91dHB1dCBmaWxlIC0gaWUgaW4gY29mZiBhIDw8SVNGQ04+PiBzeW1ib2wKLS4JICAgd2hpY2ggaXMgYWxzbyA8PENfRVhUPj4gc3ltYm9sIGFwcGVhcnMgd2hlcmUgaXQgd2FzCi0uCSAgIGRlY2xhcmVkIGFuZCBub3QgYXQgdGhlIGVuZCBvZiBhIHNlY3Rpb24uICBUaGlzIGJpdCBpcyBzZXQKLS4gIAkgICBieSB0aGUgdGFyZ2V0IEJGRCBwYXJ0IHRvIGNvbnZleSB0aGlzIGluZm9ybWF0aW9uLiAqfQotLgotLiNkZWZpbmUgQlNGX05PVF9BVF9FTkQgICAgMHg0MDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyB0aGUgbGFiZWwgb2YgY29uc3RydWN0b3Igc2VjdGlvbi4gKn0KLS4jZGVmaW5lIEJTRl9DT05TVFJVQ1RPUiAgIDB4ODAwCi0uCi0uCXsqIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgYSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuYW1lIGlzIGEKLS4JICAgd2FybmluZy4gIFRoZSBuYW1lIG9mIHRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4gYWJvdXQ7Ci0uCSAgIGlmIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0Ci0uCSAgIHN5bWJvbCwgYSB3YXJuaW5nIGlzIGlzc3VlZCBieSB0aGUgbGlua2VyLiAqfQotLiNkZWZpbmUgQlNGX1dBUk5JTkcgICAgICAgMHgxMDAwCi0uCi0uCXsqIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgaW5kaXJlY3QuICBUaGlzIHN5bWJvbCBpcyBhbiBpbmRpcmVjdAotLgkgICBwb2ludGVyIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0IHN5bWJvbC4gKn0KLS4jZGVmaW5lIEJTRl9JTkRJUkVDVCAgICAgIDB4MjAwMAotLgotLgl7KiBCU0ZfRklMRSBtYXJrcyBzeW1ib2xzIHRoYXQgY29udGFpbiBhIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZAotLgkgICBmb3IgRUxGIFNUVF9GSUxFIHN5bWJvbHMuICAqfQotLiNkZWZpbmUgQlNGX0ZJTEUgICAgICAgICAgMHg0MDAwCi0uCi0uCXsqIFN5bWJvbCBpcyBmcm9tIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICp9Ci0uI2RlZmluZSBCU0ZfRFlOQU1JQwkgICAweDgwMDAKLS4KLS4gICAgICAgeyogVGhlIHN5bWJvbCBkZW5vdGVzIGEgZGF0YSBvYmplY3QuICBVc2VkIGluIEVMRiwgYW5kIHBlcmhhcHMKLS4gICAgICAgICAgb3RoZXJzIHNvbWVkYXkuICAqfQotLiNkZWZpbmUgQlNGX09CSkVDVAkgICAweDEwMDAwCi0uCi0uICAgICAgIHsqIFRoaXMgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0Ci0uICAgICAgICAgIGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICBCU0ZfREVCVUdHSU5HIHNob3VsZCBiZSBzZXQKLS4gICAgICAgICAgYXMgd2VsbC4gICp9Ci0uI2RlZmluZSBCU0ZfREVCVUdHSU5HX1JFTE9DIDB4MjAwMDAKLS4KLS4gIGZsYWd3b3JkIGZsYWdzOwotLgotLgl7KiBBIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhpcyBzeW1ib2wgaXMKLS4JICAgcmVsYXRpdmUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIG5vbiBOVUxMLCB0aGVyZSBhcmUgc3BlY2lhbAotLiAgICAgICAgICBzZWN0aW9ucyBmb3IgdW5kZWZpbmVkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzLiAgKn0KLS4gIHN0cnVjdCBzZWMgKnNlY3Rpb247Ci0uCi0uCXsqIEJhY2sgZW5kIHNwZWNpYWwgZGF0YS4gICp9Ci0uICB1bmlvbgotLiAgICB7Ci0uICAgICAgUFRSIHA7Ci0uICAgICAgYmZkX3ZtYSBpOwotLiAgICB9IHVkYXRhOwotLgotLn0gYXN5bWJvbDsKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi1zdGF0aWMgY2hhciBjb2ZmX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyoKLURPQ0RECi1JTk9ERQotc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgICwgdHlwZWRlZiBhc3ltYm9sLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JU3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucwotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIHZlY3RvciBvZiBwb2ludGVycwotCXRvIDw8YXN5bWJvbHM+PiBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBCRkQgQHZhcnthYmZkfSwKLQlpbmNsdWRpbmcgYSB0ZXJtaW5hbCBOVUxMIHBvaW50ZXIuIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzIGluCi0JdGhlIEJGRCwgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLgotCi0uI2RlZmluZSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9pc19sb2NhbF9sYWJlbAotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGJmZF9pc19sb2NhbF9sYWJlbChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN5bWJvbCBAdmFye3N5bX0gaW4gdGhlIEJGRCBAdmFye2FiZmR9IGlzCi0JYSBjb21waWxlciBnZW5lcmF0ZWQgbG9jYWwgbGFiZWwsIGVsc2UgcmV0dXJuIGZhbHNlLgotKi8KLQotYm9vbGVhbgotYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzeW0tPm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgc3ltLT5uYW1lKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0cnVlIGlmIGEgc3ltYm9sIHdpdGggdGhlIG5hbWUgQHZhcntuYW1lfSBpbiB0aGUgQkZECi0JQHZhcnthYmZkfSBpcyBhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4KLQlmYWxzZS4gIFRoaXMganVzdCBjaGVja3Mgd2hldGhlciB0aGUgbmFtZSBoYXMgdGhlIGZvcm0gb2YgYQotCWxvY2FsIGxhYmVsLgotCi0uI2RlZmluZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShhYmZkLCBuYW1lKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCAoYWJmZCwgbmFtZSkpCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYgotCi1ERVNDUklQVElPTgotCVJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIEB2YXJ7YWJmZH0sIGFuZCBmaWxscyBpbgotCXRoZSB2ZWN0b3IgQHZhcntsb2NhdGlvbn0gd2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBhbmQKLQlhIHRyYWlsaW5nIE5VTEwuCi0JUmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHN5bWJvbCBwb2ludGVycywgbm90Ci0JaW5jbHVkaW5nIHRoZSBOVUxMLgotCi0KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiLFwKLS4gICAgICAgICAgICAgICAgICAoYWJmZCwgbG9jYXRpb24pKQotCi0qLwotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc3ltdGFiCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3N5bXRhYiAoYmZkICphYmZkLCBhc3ltYm9sICoqbG9jYXRpb24sIHVuc2lnbmVkIGludCBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JQXJyYW5nZSB0aGF0IHdoZW4gdGhlIG91dHB1dCBCRkQgQHZhcnthYmZkfSBpcyBjbG9zZWQsCi0JdGhlIHRhYmxlIEB2YXJ7bG9jYXRpb259IG9mIEB2YXJ7Y291bnR9IHBvaW50ZXJzIHRvIHN5bWJvbHMKLQl3aWxsIGJlIHdyaXR0ZW4uCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24sIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLSAgICAgdW5zaWduZWQgaW50IHN5bWNvdW50OwotewotICBpZiAoKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB8fCAoYmZkX3JlYWRfcCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSBsb2NhdGlvbjsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCk7Ci0KLURFU0NSSVBUSU9OCi0JUHJpbnQgdGhlIHZhbHVlIGFuZCBmbGFncyBvZiB0aGUgQHZhcntzeW1ib2x9IHN1cHBsaWVkIHRvIHRoZQotCXN0cmVhbSBAdmFye2ZpbGV9LgotKi8KLXZvaWQKLWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKGFyZywgc3ltYm9sKQotICAgICBQVFIgYXJnOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhcmc7Ci0gIGZsYWd3b3JkIHR5cGUgPSBzeW1ib2wtPmZsYWdzOwotICBpZiAoc3ltYm9sLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICB9Ci0KLSAgLyogVGhpcyBwcmVzdW1lcyB0aGF0IGEgc3ltYm9sIGNhbiBub3QgYmUgYm90aCBCU0ZfREVCVUdHSU5HIGFuZAotICAgICBCU0ZfRFlOQU1JQywgbm9yIG1vcmUgdGhhbiBvbmUgb2YgQlNGX0ZVTkNUSU9OLCBCU0ZfRklMRSwgYW5kCi0gICAgIEJTRl9PQkpFQ1QuICAqLwotICBmcHJpbnRmIChmaWxlLCAiICVjJWMlYyVjJWMlYyVjIiwKLQkgICAoKHR5cGUgJiBCU0ZfTE9DQUwpCi0JICAgID8gKHR5cGUgJiBCU0ZfR0xPQkFMKSA/ICchJyA6ICdsJwotCSAgICA6ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnZycgOiAnICcpLAotCSAgICh0eXBlICYgQlNGX1dFQUspID8gJ3cnIDogJyAnLAotCSAgICh0eXBlICYgQlNGX0NPTlNUUlVDVE9SKSA/ICdDJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9XQVJOSU5HKSA/ICdXJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9JTkRJUkVDVCkgPyAnSScgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfREVCVUdHSU5HKSA/ICdkJyA6ICh0eXBlICYgQlNGX0RZTkFNSUMpID8gJ0QnIDogJyAnLAotCSAgICgodHlwZSAmIEJTRl9GVU5DVElPTikKLQkgICAgPyAnRicKLQkgICAgOiAoKHR5cGUgJiBCU0ZfRklMRSkKLQkgICAgICAgPyAnZicKLQkgICAgICAgOiAoKHR5cGUgJiBCU0ZfT0JKRUNUKSA/ICdPJyA6ICcgJykpKSk7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2VfZW1wdHlfc3ltYm9sCi0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgbmV3IDw8YXN5bWJvbD4+IHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBAdmFye2FiZmR9Ci0JYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0KLQlUaGlzIHJvdXRpbmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZWFjaCBiYWNrIGVuZCBoYXMgcHJpdmF0ZQotCWluZm9ybWF0aW9uIHN1cnJvdW5kaW5nIHRoZSA8PGFzeW1ib2w+Pi4gQnVpbGRpbmcgeW91ciBvd24KLQk8PGFzeW1ib2w+PiBhbmQgcG9pbnRpbmcgdG8gaXQgd2lsbCBub3QgY3JlYXRlIHRoZSBwcml2YXRlCi0JaW5mb3JtYXRpb24sIGFuZCB3aWxsIGNhdXNlIHByb2JsZW1zIGxhdGVyIG9uLgotCi0uI2RlZmluZSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX2RlYnVnX3N5bWJvbAotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgQHZhcnthYmZkfSwKLQl0byBiZSB1c2VkIGFzIGEgZGVidWdnaW5nIHN5bWJvbC4gIEZ1cnRoZXIgZGV0YWlscyBvZiBpdHMgdXNlIGhhdmUKLQl5ZXQgdG8gYmUgd29ya2VkIG91dC4KLQotLiNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoYWJmZCwgcHRyLCBzaXplKSkKLSovCi0KLXN0cnVjdCBzZWN0aW9uX3RvX3R5cGUKLXsKLSAgQ09OU1QgY2hhciAqc2VjdGlvbjsKLSAgY2hhciB0eXBlOwotfTsKLQotLyogTWFwIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotICAgVGhpcyB0YWJsZSBpcyBwcm9iYWJseSBpbmNvbXBsZXRlLiAgSXQgaXMgc29ydGVkIGZvciBjb252ZW5pZW5jZSBvZgotICAgYWRkaW5nIGVudHJpZXMuICBTaW5jZSBpdCBpcyBzbyBzaG9ydCwgYSBsaW5lYXIgc2VhcmNoIGlzIHVzZWQuICAqLwotc3RhdGljIENPTlNUIHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgc3R0W10gPQotewotICB7IipERUJVRyoiLCAnTid9LAotICB7Ii5ic3MiLCAnYid9LAotICB7Inplcm92YXJzIiwgJ2InfSwJCS8qIE1SSSAuYnNzICovCi0gIHsiLmRhdGEiLCAnZCd9LAotICB7InZhcnMiLCAnZCd9LAkJLyogTVJJIC5kYXRhICovCi0gIHsiLnJkYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KLSAgeyIucm9kYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KLSAgeyIuc2JzcyIsICdzJ30sCQkvKiBTbWFsbCBCU1MgKHVuaW5pdGlhbGl6ZWQgZGF0YSkuICAqLwotICB7Ii5zY29tbW9uIiwgJ2MnfSwJCS8qIFNtYWxsIGNvbW1vbi4gICovCi0gIHsiLnNkYXRhIiwgJ2cnfSwJCS8qIFNtYWxsIGluaXRpYWxpemVkIGRhdGEuICAqLwotICB7Ii50ZXh0IiwgJ3QnfSwKLSAgeyJjb2RlIiwgJ3QnfSwJCS8qIE1SSSAudGV4dCAqLwotICB7Ii5kcmVjdHZlIiwgJ2knfSwgICAgICAgICAgICAvKiBNU1ZDJ3MgLmRyZWN0aXZlIHNlY3Rpb24gKi8KLSAgeyIuaWRhdGEiLCAnaSd9LCAgICAgICAgICAgICAgLyogTVNWQydzIC5pZGF0YSAoaW1wb3J0KSBzZWN0aW9uICovCi0gIHsiLmVkYXRhIiwgJ2UnfSwgICAgICAgICAgICAgIC8qIE1TVkMncyAuZWRhdGEgKGV4cG9ydCkgc2VjdGlvbiAqLwotICB7Ii5wZGF0YSIsICdwJ30sICAgICAgICAgICAgICAvKiBNU1ZDJ3MgLnBkYXRhIChzdGFjayB1bndpbmQpIHNlY3Rpb24gKi8KLSAgeyIuZGVidWciLCAnTid9LCAgICAgICAgICAgICAgLyogTVNWQydzIC5kZWJ1ZyAobm9uLXN0YW5kYXJkIGRlYnVnIHN5bXMpICovCi0gIHswLCAwfQotfTsKLQotLyogUmV0dXJuIHRoZSBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8KLSAgIHNlY3Rpb24gUywgb3IgJz8nIGZvciBhbiB1bmtub3duIENPRkYgc2VjdGlvbi4gIAotCi0gICBDaGVjayBmb3IgYW55IGxlYWRpbmcgc3RyaW5nIHdoaWNoIG1hdGNoZXMsIHNvIC50ZXh0NSByZXR1cm5zCi0gICAndCcgYXMgd2VsbCBhcyAudGV4dCAqLwotCi1zdGF0aWMgY2hhcgotY29mZl9zZWN0aW9uX3R5cGUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIENPTlNUIHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgKnQ7Ci0KLSAgZm9yICh0ID0gJnN0dFswXTsgdC0+c2VjdGlvbjsgdCsrKSAKLSAgICBpZiAoIXN0cm5jbXAgKHMsIHQtPnNlY3Rpb24sIHN0cmxlbiAodC0+c2VjdGlvbikpKQotICAgICAgcmV0dXJuIHQtPnR5cGU7Ci0KLSAgcmV0dXJuICc/JzsKLX0KLQotI2lmbmRlZiBpc2xvd2VyCi0jZGVmaW5lIGlzbG93ZXIoYykgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykKLSNlbmRpZgotI2lmbmRlZiB0b3VwcGVyCi0jZGVmaW5lIHRvdXBwZXIoYykgKGlzbG93ZXIoYykgPyAoKGMpICYgfjB4MjApIDogKGMpKQotI2VuZGlmCi0KLS8qCi1GVU5DVElPTgotCWJmZF9kZWNvZGVfc3ltY2xhc3MKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3ltYm9sCi0JY2xhc3Mgb2YgQHZhcntzeW1ib2x9LCBvciAnPycgZm9yIGFuIHVua25vd24gY2xhc3MuCi0KLVNZTk9QU0lTCi0JaW50IGJmZF9kZWNvZGVfc3ltY2xhc3MoYXN5bWJvbCAqc3ltYm9sKTsKLSovCi1pbnQKLWJmZF9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCkKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBjaGFyIGM7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0MnOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0JcmV0dXJuICd3JzsKLSAgICAgIGVsc2UKLQlyZXR1cm4gJ1UnOwotICAgIH0KLSAgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0knOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKQotICAgIHJldHVybiAnVyc7Ci0gIGlmICghKHN5bWJvbC0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9MT0NBTCkpKQotICAgIHJldHVybiAnPyc7Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICBjID0gJ2EnOwotICBlbHNlIGlmIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgYyA9IGNvZmZfc2VjdGlvbl90eXBlIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUpOwotICBlbHNlCi0gICAgcmV0dXJuICc/JzsKLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotICAgIGMgPSB0b3VwcGVyIChjKTsKLSAgcmV0dXJuIGM7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBoYW5kbGUgdGhlc2UgY2FzZXMganVzdCB5ZXQsIGJ1dCB3ZSB3aWxsIHNvb246Ci0gICAgIE5fU0VUVjogJ3YnOwotICAgICBOX1NFVEE6ICdsJzsKLSAgICAgTl9TRVRUOiAneCc7Ci0gICAgIE5fU0VURDogJ3onOwotICAgICBOX1NFVEI6ICdzJzsKLSAgICAgTl9JTkRSOiAnaSc7Ci0gICAgICovCi19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zeW1ib2xfaW5mbwotCi1ERVNDUklQVElPTgotCUZpbGwgaW4gdGhlIGJhc2ljIGluZm8gYWJvdXQgc3ltYm9sIHRoYXQgbm0gbmVlZHMuCi0JQWRkaXRpb25hbCBpbmZvIG1heSBiZSBhZGRlZCBieSB0aGUgYmFjay1lbmRzIGFmdGVyCi0JY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3N5bWJvbF9pbmZvKGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCk7Ci0qLwotCi12b2lkCi1iZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIHJldC0+dHlwZSA9IGJmZF9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCk7Ci0gIGlmIChyZXQtPnR5cGUgIT0gJ1UnICYmIHJldC0+dHlwZSAhPSAndycpCi0gICAgcmV0LT52YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYTsKLSAgZWxzZQotICAgIHJldC0+dmFsdWUgPSAwOwotICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pOwotCi1ERVNDUklQVElPTgotCUNvcHkgcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzeW19IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzeW1ib2wgQHZhcntvc3ltfSBpbiB0aGUgQkZEIEB2YXJ7b2JmZH0uCi0JUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvc2VjfS4KLQotLiNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCi0uICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsIFwKLS4JCShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSkKLQotKi8KLQotLyogVGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBtaW5pIHN5bWJvbHMuCi0gICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYmFja2VuZCBkb2VzIG5vdCBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKLSAgIHZlcnNpb24uICBJdCBqdXN0IHVzZXMgQkZEIGFzeW1ib2wgc3RydWN0dXJlcyBhcyBtaW5pIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiAqbWluaXN5bXNwOwotICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOwotewotICBsb25nIHN0b3JhZ2U7Ci0gIGFzeW1ib2wgKipzeW1zID0gTlVMTDsKLSAgbG9uZyBzeW1jb3VudDsKLQotICBpZiAoZHluYW1pYykKLSAgICBzdG9yYWdlID0gYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzdG9yYWdlKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoZHluYW1pYykKLSAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5bXMpOwotICBlbHNlCi0gICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgKm1pbmlzeW1zcCA9IChQVFIpIHN5bXM7Ci0gICpzaXplcCA9IHNpemVvZiAoYXN5bWJvbCAqKTsKLSAgcmV0dXJuIHN5bWNvdW50OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKHN5bXMpOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIFRoZSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGEgbWluaXN5bWJvbCB0bwotICAgYW4gYXN5bWJvbC4gIFdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBzeW0gYXJndW1lbnQgd2UgYXJlIHBhc3NlZDsKLSAgIHdlIGp1c3QgcmV0dXJuIHRoZSBhc3ltYm9sIHRoZSBtaW5pc3ltYm9sIHBvaW50cyB0by4gICovCi0KLS8qQVJHU1VTRUQqLwotYXN5bWJvbCAqCi1fYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBQVFIgbWluaXN5bTsKLSAgICAgYXN5bWJvbCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAqKGFzeW1ib2wgKiopIG1pbmlzeW07Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gLnN0YWIgYW5kIC5zdGFic3RyCi0gICBzZWN0aW9ucyB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZSBhbmQgbGluZSBjbG9zZXN0IHRvIGEgZGVzaXJlZAotICAgbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgYnkgQ09GRiBhbmQgRUxGIHRhcmdldHMuICBJdCBzZXRzICpwZm91bmQKLSAgIHRvIHRydWUgaWYgaXQgZmluZHMgc29tZSBpbmZvcm1hdGlvbi4gIFRoZSAqcGluZm8gZmllbGQgaXMgdXNlZCB0bwotICAgcGFzcyBjYWNoZWQgaW5mb3JtYXRpb24gaW4gYW5kIG91dCBvZiB0aGlzIHJvdXRpbmU7IHRoaXMgZmlyc3QgdGltZQotICAgdGhlIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBhIEJGRCwgKnBpbmZvIHNob3VsZCBiZSBOVUxMLiAgVGhlIHZhbHVlCi0gICBwbGFjZWQgaW4gKnBpbmZvIHNob3VsZCBiZSBzYXZlZCB3aXRoIHRoZSBCRkQsIGFuZCBwYXNzZWQgYmFjayBlYWNoCi0gICB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KLQotLyogV2UgdXNlIGEgY2FjaGUgYnkgZGVmYXVsdC4gICovCi0KLSNkZWZpbmUgRU5BQkxFX0NBQ0hJTkcKLQotLyogV2Uga2VlcCBhbiBhcnJheSBvZiBpbmRleGVudHJ5IHN0cnVjdHVyZXMgdG8gcmVjb3JkIHdoZXJlIGluIHRoZQotICAgc3RhYnMgc2VjdGlvbiB3ZSBzaG91bGQgbG9vayB0byBmaW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBhCi0gICBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLwotCi1zdHJ1Y3QgaW5kZXhlbnRyeQotewotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgKnN0YWI7Ci0gIGJmZF9ieXRlICpzdHI7Ci0gIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICBjaGFyICpmaWxlX25hbWU7Ci0gIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci19OwotCi0vKiBDb21wYXJlIHR3byBpbmRleGVudHJ5IHN0cnVjdHVyZXMuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBpbmRleGVudHJ5IChhLCBiKQotICAgICBjb25zdCBQVFIgKmE7Ci0gICAgIGNvbnN0IFBUUiAqYjsKLXsKLSAgY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKmNvbnRlc3RhbnRBID0gKGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICopIGE7Ci0gIGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICpjb250ZXN0YW50QiA9IChjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqKSBiOwotCi0gIGlmIChjb250ZXN0YW50QS0+dmFsIDwgY29udGVzdGFudEItPnZhbCkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGNvbnRlc3RhbnRBLT52YWwgPiBjb250ZXN0YW50Qi0+dmFsKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBpcyBzdG9yZWQgaW4gKnBpbmZvLiAgKi8KLQotc3RydWN0IHN0YWJfZmluZF9pbmZvCi17Ci0gIC8qIFRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gIC8qIFRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKnN0YWJzOwotICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqc3RyczsKLQotICAvKiBBIHRhYmxlIHRoYXQgaW5kZXhlcyBzdGFicyBieSBtZW1vcnkgYWRkcmVzcy4gICovCi0gIHN0cnVjdCBpbmRleGVudHJ5ICppbmRleHRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kZXh0YWJsZS4gICovCi0gIGludCBpbmRleHRhYmxlc2l6ZTsKLQotI2lmZGVmIEVOQUJMRV9DQUNISU5HCi0gIC8qIENhY2hlZCB2YWx1ZXMgdG8gcmVzdGFydCBxdWlja2x5LiAgKi8KLSAgc3RydWN0IGluZGV4ZW50cnkgKmNhY2hlZF9pbmRleGVudHJ5OwotICBiZmRfdm1hIGNhY2hlZF9vZmZzZXQ7Ci0gIGJmZF9ieXRlICpjYWNoZWRfc3RhYjsKLSAgY2hhciAqY2FjaGVkX2ZpbGVfbmFtZTsKLSNlbmRpZgotCi0gIC8qIFNhdmVkIHB0ciB0byBtYWxsb2MnZWQgZmlsZW5hbWUuICAqLwotICBjaGFyICpmaWxlbmFtZTsKLX07Ci0KLWJvb2xlYW4KLV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsIHBmb3VuZCwKLQkJCQkgICAgIHBmaWxlbmFtZSwgcGZubmFtZSwgcGxpbmUsIHBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gKnBmb3VuZDsKLSAgICAgY29uc3QgY2hhciAqKnBmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBmbm5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCAqcGxpbmU7Ci0gICAgIFBUUiAqcGluZm87Ci17Ci0gIHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBzdGFic2l6ZSwgc3Ryc2l6ZTsKLSAgYmZkX2J5dGUgKnN0YWIsICpzdHI7Ci0gIGJmZF9ieXRlICpsYXN0X3N0YWIgPSBOVUxMOwotICBiZmRfc2l6ZV90eXBlIHN0cm9mZjsKLSAgc3RydWN0IGluZGV4ZW50cnkgKmluZGV4ZW50cnk7Ci0gIGNoYXIgKmRpcmVjdG9yeV9uYW1lLCAqZmlsZV9uYW1lOwotICBpbnQgc2F3X2Z1bjsKLQotICAqcGZvdW5kID0gZmFsc2U7Ci0gICpwZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgKnBmbm5hbWUgPSBOVUxMOwotICAqcGxpbmUgPSAwOwotCi0gIC8qIFN0YWJzIGVudHJpZXMgdXNlIGEgMTIgYnl0ZSBmb3JtYXQ6Ci0gICAgICAgNCBieXRlIHN0cmluZyB0YWJsZSBpbmRleAotICAgICAgIDEgYnl0ZSBzdGFiIHR5cGUKLSAgICAgICAxIGJ5dGUgc3RhYiBvdGhlciBmaWVsZAotICAgICAgIDIgYnl0ZSBzdGFiIGRlc2MgZmllbGQKLSAgICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQotICAgICBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIGZvciBhIDY0IGJpdCBvYmplY3QgZm9ybWF0LgotCi0gICAgIFRoZSBzdGFicyBzeW1ib2xzIGFyZSBkaXZpZGVkIGludG8gY29tcGlsYXRpb24gdW5pdHMuICBGb3IgdGhlCi0gICAgIGZpcnN0IGVudHJ5IGluIGVhY2ggdW5pdCwgdGhlIHR5cGUgb2YgMCwgdGhlIHZhbHVlIGlzIHRoZSBsZW5ndGgKLSAgICAgb2YgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhpcyB1bml0LCBhbmQgdGhlIGRlc2MgZmllbGQgaXMgdGhlCi0gICAgIG51bWJlciBvZiBzdGFicyBzeW1ib2xzIGZvciB0aGlzIHVuaXQuICAqLwotCi0jZGVmaW5lIFNUUkRYT0ZGICgwKQotI2RlZmluZSBUWVBFT0ZGICg0KQotI2RlZmluZSBPVEhFUk9GRiAoNSkKLSNkZWZpbmUgREVTQ09GRiAoNikKLSNkZWZpbmUgVkFMT0ZGICg4KQotI2RlZmluZSBTVEFCU0laRSAoMTIpCi0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKikgKnBpbmZvOwotICBpZiAoaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5zdGFic2VjID09IE5VTEwgfHwgaW5mby0+c3Ryc2VjID09IE5VTEwpCi0JewotCSAgLyogTm8gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgc3RhYnNpemUgPSBpbmZvLT5zdGFic2VjLT5fcmF3X3NpemU7Ci0gICAgICBzdHJzaXplID0gaW5mby0+c3Ryc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyByZWxvY19zaXplLCByZWxvY19jb3VudDsKLSAgICAgIGFyZWxlbnQgKipyZWxvY192ZWN0b3I7Ci0gICAgICBpbnQgaTsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpmaWxlX25hbWU7Ci0gICAgICBjaGFyICpkaXJlY3RvcnlfbmFtZTsKLSAgICAgIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci0KLSAgICAgIGluZm8gPSAoc3RydWN0IHN0YWJfZmluZF9pbmZvICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqaW5mbyk7Ci0gICAgICBpZiAoaW5mbyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IFdoZW4gdXNpbmcgdGhlIGxpbmtlciAtLXNwbGl0LWJ5LWZpbGUgb3IKLQkgLS1zcGxpdC1ieS1yZWxvYyBvcHRpb25zLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIC5zdGFiIGFuZAotCSAuc3RhYnN0ciBzZWN0aW9ucyB0byBiZSBzcGxpdC4gIFdlIHNob3VsZCBoYW5kbGUgdGhhdC4gICovCi0KLSAgICAgIGluZm8tPnN0YWJzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFiIik7Ci0gICAgICBpbmZvLT5zdHJzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFic3RyIik7Ci0KLSAgICAgIGlmIChpbmZvLT5zdGFic2VjID09IE5VTEwgfHwgaW5mby0+c3Ryc2VjID09IE5VTEwpCi0JewotCSAgLyogTm8gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgU2V0ICpwaW5mbyBzbyB0aGF0IHdlCi0gICAgICAgICAgICAgY2FuIHJldHVybiBxdWlja2x5IGluIHRoZSBpbmZvICE9IE5VTEwgY2FzZSBhYm92ZS4gICovCi0JICAqcGluZm8gPSAoUFRSKSBpbmZvOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzdGFic2l6ZSA9IGluZm8tPnN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cnNpemUgPSBpbmZvLT5zdHJzZWMtPl9yYXdfc2l6ZTsKLQotICAgICAgaW5mby0+c3RhYnMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzdGFic2l6ZSk7Ci0gICAgICBpbmZvLT5zdHJzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgc3Ryc2l6ZSk7Ci0gICAgICBpZiAoaW5mby0+c3RhYnMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGluZm8tPnN0YWJzZWMsIGluZm8tPnN0YWJzLCAwLAotCQkJCSAgICAgIHN0YWJzaXplKQotCSAgfHwgISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGluZm8tPnN0cnNlYywgaW5mby0+c3RycywgMCwKLQkJCQkJIHN0cnNpemUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgd2UgaGF2ZSB0byByZWxvY2F0ZQotCSB0aGUgZW50cmllcyBpbiAuc3RhYi4gIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzaW1wbGUgMzIgYml0Ci0JIHJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgb2JqZWN0IGZpbGUsIHNvCi0JIHRoaXMgc2hvdWxkIGJlIG5vIGJpZyBkZWFsLiAgKi8KLSAgICAgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBpbmZvLT5zdGFic2VjKTsKLSAgICAgIGlmIChyZWxvY19zaXplIDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gICAgICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgaW5mby0+c3RhYnNlYywgcmVsb2NfdmVjdG9yLAotCQkJCQkgICAgc3ltYm9scyk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPCAwKQotCXsKLQkgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLQkgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAocmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFyZWxlbnQgKipwcjsKLQotCSAgZm9yIChwciA9IHJlbG9jX3ZlY3RvcjsgKnByICE9IE5VTEw7IHByKyspCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICpyOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQotCSAgICAgIHIgPSAqcHI7Ci0JICAgICAgaWYgKHItPmhvd3RvLT5yaWdodHNoaWZ0ICE9IDAKLQkJICB8fCByLT5ob3d0by0+c2l6ZSAhPSAyCi0JCSAgfHwgci0+aG93dG8tPmJpdHNpemUgIT0gMzIKLQkJICB8fCByLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkJICB8fCByLT5ob3d0by0+Yml0cG9zICE9IDAKLQkJICB8fCByLT5ob3d0by0+ZHN0X21hc2sgIT0gMHhmZmZmZmZmZikKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIlVuc3VwcG9ydGVkIC5zdGFiIHJlbG9jYXRpb24iKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkJICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0JCSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgaW5mby0+c3RhYnMgKyByLT5hZGRyZXNzKTsKLQkgICAgICB2YWwgJj0gci0+aG93dG8tPnNyY19tYXNrOwotCSAgICAgIHN5bSA9ICpyLT5zeW1fcHRyX3B0cjsKLQkgICAgICB2YWwgKz0gc3ltLT52YWx1ZSArIHN5bS0+c2VjdGlvbi0+dm1hICsgci0+YWRkZW5kOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgaW5mby0+c3RhYnMgKyByLT5hZGRyZXNzKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotCWZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0KLSAgICAgIC8qIEZpcnN0IHRpbWUgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLCBidWlsZCBhIHRhYmxlIG1hdGNoaW5nCi0JIGZ1bmN0aW9uIFZNIGFkZHJlc3NlcyB0byBzdGFicywgdGhlbiBzb3J0IGJhc2VkIG9uIHN0YXJ0aW5nCi0JIFZNIGFkZHJlc3MuICBEbyB0aGlzIGluIHR3byBwYXNzZXM6IG9uY2UgdG8gY291bnQgaG93IG1hbnkKLQkgdGFibGUgZW50cmllcyB3ZSdsbCBuZWVkLCBhbmQgYSBzZWNvbmQgdG8gYWN0dWFsbHkgYnVpbGQgdGhlCi0JIHRhYmxlLiAgKi8KLQotICAgICAgaW5mby0+aW5kZXh0YWJsZXNpemUgPSAwOwotICAgICAgc2F3X2Z1biA9IDE7Ci0gICAgICBmb3IgKHN0YWIgPSBpbmZvLT5zdGFiczsgc3RhYiA8IGluZm8tPnN0YWJzICsgc3RhYnNpemU7IHN0YWIgKz0gU1RBQlNJWkUpCi0JewotCSAgaWYgKHN0YWJbVFlQRU9GRl0gPT0gTl9TTykKLQkgICAgewotCSAgICAgIC8qIE5fU08gd2l0aCBudWxsIG5hbWUgaW5kaWNhdGVzIEVPRiAqLwotCSAgICAgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogaWYgd2UgZGlkIG5vdCBzZWUgYSBmdW5jdGlvbiBkZWYsIGxlYXZlIHNwYWNlIGZvciBvbmUuICovCi0JICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkJKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLQotCSAgICAgIHNhd19mdW4gPSAwOwotCi0JICAgICAgLyogdHdvIE5fU08ncyBpbiBhIHJvdyBpcyBhIGZpbGVuYW1lIGFuZCBkaXJlY3RvcnkuIFNraXAgKi8KLQkgICAgICBpZiAoc3RhYiArIFNUQUJTSVpFIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZQotCQkgICYmICooc3RhYiArIFNUQUJTSVpFICsgVFlQRU9GRikgPT0gTl9TTykKLQkJewotCQkgIHN0YWIgKz0gU1RBQlNJWkU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhYltUWVBFT0ZGXSA9PSBOX0ZVTikKLQkgICAgewotCSAgICAgIHNhd19mdW4gPSAxOwotCSAgICAgICsraW5mby0+aW5kZXh0YWJsZXNpemU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzYXdfZnVuID09IDApCi0JKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLSAgICAgIAotICAgICAgaWYgKGluZm8tPmluZGV4dGFibGVzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgICArK2luZm8tPmluZGV4dGFibGVzaXplOwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlID0gKChzdHJ1Y3QgaW5kZXhlbnRyeSAqKQotCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICAoc2l6ZW9mIChzdHJ1Y3QgaW5kZXhlbnRyeSkKLQkJCQkgICAgICAqIGluZm8tPmluZGV4dGFibGVzaXplKSkpOwotICAgICAgaWYgKGluZm8tPmluZGV4dGFibGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gICAgICBzYXdfZnVuID0gMTsKLQotICAgICAgZm9yIChpID0gMCwgc3Ryb2ZmID0gMCwgc3RhYiA9IGluZm8tPnN0YWJzLCBzdHIgPSBpbmZvLT5zdHJzOwotCSAgIGkgPCBpbmZvLT5pbmRleHRhYmxlc2l6ZSAmJiBzdGFiIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsKLQkgICBzdGFiICs9IFNUQUJTSVpFKQotCXsKLQkgIHN3aXRjaCAoc3RhYltUWVBFT0ZGXSkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgZW50cnkgaW4gYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQkgICAgICBpZiAoKGJmZF9zaXplX3R5cGUpICgoaW5mby0+c3RycyArIHN0cnNpemUpIC0gc3RyKSA8IHN0cm9mZikKLQkJYnJlYWs7Ci0JICAgICAgc3RyICs9IHN0cm9mZjsKLQkgICAgICBzdHJvZmYgPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgVkFMT0ZGKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fU086Ci0JICAgICAgLyogVGhlIG1haW4gZmlsZSBuYW1lLiAgKi8KLQotCSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBjcmVhdGVzIGEgbmV3IGluZGV4dGFibGUgZW50cnkgd2l0aAotCSAgICAgICAgIGEgTlVMTCBmdW5jdGlvbiBuYW1lIGlmIHRoZXJlIHdlcmUgbm8gTl9GVU5zIGluIGEgZmlsZS4KLQkgICAgICAgICBOb3RlIHRoYXQgYSBOX1NPIHdpdGhvdXQgYSBmaWxlIG5hbWUgaXMgYW4gRU9GIGFuZAotCSAgICAgICAgIHRoZXJlIGNvdWxkIGJlIDIgTl9TTyBmb2xsb3dpbmcgaXQgd2l0aCB0aGUgbmV3IGZpbGVuYW1lIAotCSAgICAgICAgIGFuZCBkaXJlY3RvcnkuICovCi0JICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkJewotCQkgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gYmZkX2dldF8zMiAoYWJmZCwgbGFzdF9zdGFiICsgVkFMT0ZGKTsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBsYXN0X3N0YWI7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0JCSAgKytpOwotCQl9Ci0JICAgICAgc2F3X2Z1biA9IDA7Ci0JICAgICAgCi0JICAgICAgZmlsZV9uYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQkgICAgICBpZiAoKmZpbGVfbmFtZSA9PSAnXDAnKQotCQl7Ci0JCSAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotCQkgIGZpbGVfbmFtZSA9IE5VTEw7Ci0JCSAgc2F3X2Z1biA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBsYXN0X3N0YWIgPSBzdGFiOwotCQkgIGlmIChzdGFiICsgU1RBQlNJWkUgPj0gaW5mby0+c3RhYnMgKyBzdGFic2l6ZQotCQkgICAgICB8fCAqKHN0YWIgKyBTVEFCU0laRSArIFRZUEVPRkYpICE9IE5fU08pCi0JCSAgICB7Ci0JCSAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFR3byBjb25zZWN1dGl2ZSBOX1NPcyBhcmUgYSBkaXJlY3RvcnkgYW5kIGEKLQkJCSBmaWxlIG5hbWUuICAqLwotCQkgICAgICBzdGFiICs9IFNUQUJTSVpFOwotCQkgICAgICBkaXJlY3RvcnlfbmFtZSA9IGZpbGVfbmFtZTsKLQkJICAgICAgZmlsZV9uYW1lID0gKChjaGFyICopIHN0cgotCQkJCSAgICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fU09MOgotCSAgICAgIC8qIFRoZSBuYW1lIG9mIGFuIGluY2x1ZGUgZmlsZS4gICovCi0JICAgICAgZmlsZV9uYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fRlVOOgotCSAgICAgIC8qIEEgZnVuY3Rpb24gbmFtZS4gICovCi0JICAgICAgc2F3X2Z1biA9IDE7Ci0JICAgICAgbmFtZSA9IChjaGFyICopIHN0ciArIGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBTVFJEWE9GRik7Ci0KLQkgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJbmFtZSA9IE5VTEw7Ci0KLQkgICAgICBmdW5jdGlvbl9uYW1lID0gbmFtZTsKLQotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgVkFMT0ZGKTsKLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBzdGFiOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZGlyZWN0b3J5X25hbWUgPSBkaXJlY3RvcnlfbmFtZTsKLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBmdW5jdGlvbl9uYW1lOwotCSAgICAgICsraTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQl7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLnZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIGxhc3Rfc3RhYiArIFZBTE9GRik7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBsYXN0X3N0YWI7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0ciA9IHN0cjsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uZGlyZWN0b3J5X25hbWUgPSBkaXJlY3RvcnlfbmFtZTsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5mdW5jdGlvbl9uYW1lID0gTlVMTDsKLQkgICsraTsKLQl9Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gKGJmZF92bWEpIC0xOwotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdGFiID0gaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOwotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBOVUxMOwotICAgICAgKytpOwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlc2l6ZSA9IGk7Ci0gICAgICBxc29ydCAoaW5mby0+aW5kZXh0YWJsZSwgaSwgc2l6ZW9mIChzdHJ1Y3QgaW5kZXhlbnRyeSksIGNtcGluZGV4ZW50cnkpOwotCi0gICAgICAqcGluZm8gPSAoUFRSKSBpbmZvOwotICAgIH0KLQotICAvKiBXZSBhcmUgcGFzc2VkIGEgc2VjdGlvbiByZWxhdGl2ZSBvZmZzZXQuICBUaGUgb2Zmc2V0cyBpbiB0aGUKLSAgICAgc3RhYnMgaW5mb3JtYXRpb24gYXJlIGFic29sdXRlLiAgKi8KLSAgb2Zmc2V0ICs9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCi0jaWZkZWYgRU5BQkxFX0NBQ0hJTkcKLSAgaWYgKGluZm8tPmNhY2hlZF9pbmRleGVudHJ5ICE9IE5VTEwKLSAgICAgICYmIG9mZnNldCA+PSBpbmZvLT5jYWNoZWRfb2Zmc2V0Ci0gICAgICAmJiBvZmZzZXQgPCAoaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgKyAxKS0+dmFsKQotICAgIHsKLSAgICAgIHN0YWIgPSBpbmZvLT5jYWNoZWRfc3RhYjsKLSAgICAgIGluZGV4ZW50cnkgPSBpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeTsKLSAgICAgIGZpbGVfbmFtZSA9IGluZm8tPmNhY2hlZF9maWxlX25hbWU7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICAvKiBDYWNoZSBub24tZXhpc3RhbnQgb3IgaW52YWxpZC4gIERvIGJpbmFyeSBzZWFyY2ggb24KLSAgICAgICAgIGluZGV4dGFibGUuICAqLwotCi0gICAgICBsb25nIGxvdywgaGlnaDsKLSAgICAgIGxvbmcgbWlkID0gLTE7Ci0KLSAgICAgIGluZGV4ZW50cnkgPSBOVUxMOwotCi0gICAgICBsb3cgPSAwOwotICAgICAgaGlnaCA9IGluZm8tPmluZGV4dGFibGVzaXplIC0gMTsKLSAgICAgIHdoaWxlIChsb3cgIT0gaGlnaCkKLQl7Ci0JICBtaWQgPSAoaGlnaCArIGxvdykgLyAyOwotCSAgaWYgKG9mZnNldCA+PSBpbmZvLT5pbmRleHRhYmxlW21pZF0udmFsCi0JICAgICAgJiYgb2Zmc2V0IDwgaW5mby0+aW5kZXh0YWJsZVttaWQgKyAxXS52YWwpCi0JICAgIHsKLQkgICAgICBpbmRleGVudHJ5ID0gJmluZm8tPmluZGV4dGFibGVbbWlkXTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoaW5mby0+aW5kZXh0YWJsZVttaWRdLnZhbCA+IG9mZnNldCkKLQkgICAgaGlnaCA9IG1pZDsKLQkgIGVsc2UKLQkgICAgbG93ID0gbWlkICsgMTsKLQl9Ci0KLSAgICAgIGlmIChpbmRleGVudHJ5ID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHN0YWIgPSBpbmRleGVudHJ5LT5zdGFiICsgU1RBQlNJWkU7Ci0gICAgICBmaWxlX25hbWUgPSBpbmRleGVudHJ5LT5maWxlX25hbWU7Ci0gICAgfQotCi0gIGRpcmVjdG9yeV9uYW1lID0gaW5kZXhlbnRyeS0+ZGlyZWN0b3J5X25hbWU7Ci0gIHN0ciA9IGluZGV4ZW50cnktPnN0cjsKLQotICBmb3IgKDsgc3RhYiA8IChpbmRleGVudHJ5KzEpLT5zdGFiOyBzdGFiICs9IFNUQUJTSVpFKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZG9uZTsKLSAgICAgIGJmZF92bWEgdmFsOwotCi0gICAgICBkb25lID0gZmFsc2U7Ci0KLSAgICAgIHN3aXRjaCAoc3RhYltUWVBFT0ZGXSkKLQl7Ci0JY2FzZSBOX1NPTDoKLQkgIC8qIFRoZSBuYW1lIG9mIGFuIGluY2x1ZGUgZmlsZS4gICovCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgVkFMT0ZGKTsKLQkgIGlmICh2YWwgPD0gb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZmlsZV9uYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQkgICAgICAqcGxpbmUgPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgTl9TTElORToKLQljYXNlIE5fRFNMSU5FOgotCWNhc2UgTl9CU0xJTkU6Ci0JICAvKiBBIGxpbmUgbnVtYmVyLiAgVGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICAgICAgICBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLQkgIHZhbCA9IGluZGV4ZW50cnktPnZhbCArIGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgaWYgKHZhbCA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICAqcGxpbmUgPSBiZmRfZ2V0XzE2IChhYmZkLCBzdGFiICsgREVTQ09GRik7Ci0KLSNpZmRlZiBFTkFCTEVfQ0FDSElORwotCSAgICAgIGluZm8tPmNhY2hlZF9zdGFiID0gc3RhYjsKLQkgICAgICBpbmZvLT5jYWNoZWRfb2Zmc2V0ID0gdmFsOwotCSAgICAgIGluZm8tPmNhY2hlZF9maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JICAgICAgaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgPSBpbmRleGVudHJ5OwotI2VuZGlmCi0JICAgIH0KLQkgIGlmICh2YWwgPiBvZmZzZXQpCi0JICAgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIE5fRlVOOgotCWNhc2UgTl9TTzoKLQkgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoZG9uZSkKLQlicmVhazsKLSAgICB9Ci0KLSAgKnBmb3VuZCA9IHRydWU7Ci0KLSAgaWYgKGZpbGVfbmFtZVswXSA9PSAnLycgfHwgZGlyZWN0b3J5X25hbWUgPT0gTlVMTCkKLSAgICAqcGZpbGVuYW1lID0gZmlsZV9uYW1lOwotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IGRpcmxlbjsKLQotICAgICAgZGlybGVuID0gc3RybGVuIChkaXJlY3RvcnlfbmFtZSk7Ci0gICAgICBpZiAoaW5mby0+ZmlsZW5hbWUgPT0gTlVMTAotCSAgfHwgc3RybmNtcCAoaW5mby0+ZmlsZW5hbWUsIGRpcmVjdG9yeV9uYW1lLCBkaXJsZW4pICE9IDAKLQkgIHx8IHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUgKyBkaXJsZW4sIGZpbGVfbmFtZSkgIT0gMCkKLQl7Ci0JICBpZiAoaW5mby0+ZmlsZW5hbWUgIT0gTlVMTCkKLQkgICAgZnJlZSAoaW5mby0+ZmlsZW5hbWUpOwotCSAgaW5mby0+ZmlsZW5hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChkaXJsZW4gKwotCQkJCQkJc3RybGVuIChmaWxlX25hbWUpCi0JCQkJCQkrIDEpOwotCSAgaWYgKGluZm8tPmZpbGVuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cmNweSAoaW5mby0+ZmlsZW5hbWUsIGRpcmVjdG9yeV9uYW1lKTsKLQkgIHN0cmNweSAoaW5mby0+ZmlsZW5hbWUgKyBkaXJsZW4sIGZpbGVfbmFtZSk7Ci0JfQotCi0gICAgICAqcGZpbGVuYW1lID0gaW5mby0+ZmlsZW5hbWU7Ci0gICAgfQotCi0gIGlmIChpbmRleGVudHJ5LT5mdW5jdGlvbl9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqczsKLQotICAgICAgLyogVGhpcyB3aWxsIHR5cGljYWxseSBiZSBzb21ldGhpbmcgbGlrZSBtYWluOkYoMCwxKSwgc28gd2Ugd2FudAotICAgICAgICAgdG8gY2xvYmJlciB0aGUgY29sb24uICBJdCdzIE9LIHRvIGNoYW5nZSB0aGUgbmFtZSwgc2luY2UgdGhlCi0gICAgICAgICBzdHJpbmcgaXMgaW4gb3VyIG93biBsb2NhbCBzdG9yYWdlIGFueWhvdy4gICovCi0KLSAgICAgIHMgPSBzdHJjaHIgKGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWUsICc6Jyk7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCSpzID0gJ1wwJzsKLQotICAgICAgKnBmbm5hbWUgPSBpbmRleGVudHJ5LT5mdW5jdGlvbl9uYW1lOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zeXNkZXAuaCBiL2JmZC9zeXNkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ODk4My4uMDAwMDAwMAotLS0gYS9iZmQvc3lzZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyogc3lzZGVwLmggLS0gaGFuZGxlIGhvc3QgZGVwZW5kZW5jaWVzIGZvciB0aGUgQkZEIGxpYnJhcnkKLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEJGRF9TWVNERVBfSAotI2RlZmluZSBCRkRfU1lTREVQX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1REREVGX0gKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAhKGRlZmluZWQoZXJybm8pIHx8IGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0lOQ19FUlJOTykpCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLWV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci1leHRlcm4gY2hhciAqc3RycmNociAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFRJTUVfV0lUSF9TWVNfVElNRQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TWVNfRklMRV9ICi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgT19SRE9OTFkKLSNkZWZpbmUgT19SRE9OTFkgMAotI2VuZGlmCi0jaWZuZGVmIE9fV1JPTkxZCi0jZGVmaW5lIE9fV1JPTkxZIDEKLSNlbmRpZgotI2lmbmRlZiBPX1JEV1IKLSNkZWZpbmUgT19SRFdSIDIKLSNlbmRpZgotI2lmbmRlZiBPX0FDQ01PREUKLSNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0jaWZuZGVmIFNFRUtfQ1VSCi0jZGVmaW5lIFNFRUtfQ1VSIDEKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLWV4dGVybiBjaGFyICpzdHJzdHIgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi1leHRlcm4gUFRSIG1hbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DCi1leHRlcm4gUFRSIHJlYWxsb2MgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotZXh0ZXJuIHZvaWQgZnJlZSAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLWV4dGVybiBjaGFyICpnZXRlbnYgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZGVmaW5lIF8oU3RyaW5nKSBkZ2V0dGV4dCAoUEFDS0FHRSwgU3RyaW5nKQotI2lmZGVmIGdldHRleHRfbm9vcAotI2RlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotI2Vsc2UKLSNkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSNkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotI2RlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSNkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSNkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfU1lTREVQX0gpICovCmRpZmYgLS1naXQgYS9iZmQvdGFyZ2V0cy5jIGIvYmZkL3RhcmdldHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwY2M1OS4uMDAwMDAwMAotLS0gYS9iZmQvdGFyZ2V0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyOSArMCwwIEBACi0vKiBHZW5lcmljIHRhcmdldC1maWxlLXR5cGUgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJmbm1hdGNoLmgiCi0KLS8qCi1TRUNUSU9OIAotCVRhcmdldHMKLQotREVTQ1JJUFRJT04KLQlFYWNoIHBvcnQgb2YgQkZEIHRvIGEgZGlmZmVyZW50IG1hY2hpbmUgcmVxdXJpZXMgdGhlIGNyZWF0aW9uCi0Jb2YgYSB0YXJnZXQgYmFjayBlbmQuIEFsbCB0aGUgYmFjayBlbmQgcHJvdmlkZXMgdG8gdGhlIHJvb3QKLQlwYXJ0IG9mIEJGRCBpcyBhIHN0cnVjdHVyZSBjb250YWluaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwotCXdoaWNoIHBlcmZvcm0gY2VydGFpbiBsb3cgbGV2ZWwgb3BlcmF0aW9ucyBvbiBmaWxlcy4gQkZECi0JdHJhbnNsYXRlcyB0aGUgYXBwbGljYXRpb25zJ3MgcmVxdWVzdHMgdGhyb3VnaCBhIHBvaW50ZXIgaW50bwotCWNhbGxzIHRvIHRoZSBiYWNrIGVuZCByb3V0aW5lcy4gCi0KLQlXaGVuIGEgZmlsZSBpcyBvcGVuZWQgd2l0aCA8PGJmZF9vcGVucj4+LCBpdHMgZm9ybWF0IGFuZAotCXRhcmdldCBhcmUgdW5rbm93bi4gQkZEIHVzZXMgdmFyaW91cyBtZWNoYW5pc21zIHRvIGRldGVybWluZQotCWhvdyB0byBpbnRlcnByZXQgdGhlIGZpbGUuIFRoZSBvcGVyYXRpb25zIHBlcmZvcm1lZCBhcmU6Ci0KLQlvIENyZWF0ZSBhIEJGRCBieSBjYWxsaW5nIHRoZSBpbnRlcm5hbCByb3V0aW5lCi0JPDxfYmZkX25ld19iZmQ+PiwgdGhlbiBjYWxsIDw8YmZkX2ZpbmRfdGFyZ2V0Pj4gd2l0aCB0aGUKLQl0YXJnZXQgc3RyaW5nIHN1cHBsaWVkIHRvIDw8YmZkX29wZW5yPj4gYW5kIHRoZSBuZXcgQkZEIHBvaW50ZXIuIAotCi0JbyBJZiBhIG51bGwgdGFyZ2V0IHN0cmluZyB3YXMgcHJvdmlkZWQgdG8gPDxiZmRfZmluZF90YXJnZXQ+PiwKLQlsb29rIHVwIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8PEdOVVRBUkdFVD4+IGFuZCB1c2UKLQl0aGF0IGFzIHRoZSB0YXJnZXQgc3RyaW5nLiAKLQotCW8gSWYgdGhlIHRhcmdldCBzdHJpbmcgaXMgc3RpbGwgPDxOVUxMPj4sIG9yIHRoZSB0YXJnZXQgc3RyaW5nIGlzCi0JPDxkZWZhdWx0Pj4sIHRoZW4gdXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSB0YXJnZXQgdmVjdG9yCi0JYXMgdGhlIHRhcmdldCB0eXBlLCBhbmQgc2V0IDw8dGFyZ2V0X2RlZmF1bHRlZD4+IGluIHRoZSBCRkQgdG8KLQljYXVzZSA8PGJmZF9jaGVja19mb3JtYXQ+PiB0byBsb29wIHRocm91Z2ggYWxsIHRoZSB0YXJnZXRzLgotCUB4cmVme2JmZF90YXJnZXR9LiAgQHhyZWZ7Rm9ybWF0c30uCi0KLQlvIE90aGVyd2lzZSwgaW5zcGVjdCB0aGUgZWxlbWVudHMgaW4gdGhlIHRhcmdldCB2ZWN0b3IKLQlvbmUgYnkgb25lLCB1bnRpbCBhIG1hdGNoIG9uIHRhcmdldCBuYW1lIGlzIGZvdW5kLiBXaGVuIGZvdW5kLAotCXVzZSBpdC4gCi0KLQlvIE90aGVyd2lzZSByZXR1cm4gdGhlIGVycm9yIDw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4gdG8KLQk8PGJmZF9vcGVucj4+LgotCi0JbyA8PGJmZF9vcGVucj4+IGF0dGVtcHRzIHRvIG9wZW4gdGhlIGZpbGUgdXNpbmcKLQk8PGJmZF9vcGVuX2ZpbGU+PiwgYW5kIHJldHVybnMgdGhlIEJGRC4KLQotCU9uY2UgdGhlIEJGRCBoYXMgYmVlbiBvcGVuZWQgYW5kIHRoZSB0YXJnZXQgc2VsZWN0ZWQsIHRoZSBmaWxlCi0JZm9ybWF0IG1heSBiZSBkZXRlcm1pbmVkLiBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZwotCTw8YmZkX2NoZWNrX2Zvcm1hdD4+IG9uIHRoZSBCRkQgd2l0aCBhIHN1Z2dlc3RlZCBmb3JtYXQuIAotCUlmIDw8dGFyZ2V0X2RlZmF1bHRlZD4+IGhhcyBiZWVuIHNldCwgZWFjaCBwb3NzaWJsZSB0YXJnZXQKLQl0eXBlIGlzIHRyaWVkIHRvIHNlZSBpZiBpdCByZWNvZ25pemVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgotCTw8YmZkX2NoZWNrX2Zvcm1hdD4+IHJldHVybnMgPDx0cnVlPj4gd2hlbiB0aGUgY2FsbGVyIGd1ZXNzZXMgcmlnaHQuCi1AbWVudQotQCogYmZkX3RhcmdldDo6Ci1AZW5kIG1lbnUKLSovCi0KLQotLyoKLQotSU5PREUKLQliZmRfdGFyZ2V0LCAgLCBUYXJnZXRzLCBUYXJnZXRzCi1ET0NERAotU1VCU0VDVElPTgotCWJmZF90YXJnZXQKLQotREVTQ1JJUFRJT04KLQlUaGlzIHN0cnVjdHVyZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgQkZEIGtub3dzIGFib3V0IGEKLQl0YXJnZXQuIEl0IGluY2x1ZGVzIHRoaW5ncyBsaWtlIGl0cyBieXRlIG9yZGVyLCBuYW1lLCBhbmQgd2hpY2gKLQlyb3V0aW5lcyB0byBjYWxsIHRvIGRvIHZhcmlvdXMgb3BlcmF0aW9ucy4gICAKLQotCUV2ZXJ5IEJGRCBwb2ludHMgdG8gYSB0YXJnZXQgc3RydWN0dXJlIHdpdGggaXRzIDw8eHZlYz4+Ci0JbWVtYmVyLiAKLQotCVRoZSBtYWNyb3MgYmVsb3cgYXJlIHVzZWQgdG8gZGlzcGF0Y2ggdG8gZnVuY3Rpb25zIHRocm91Z2ggdGhlCi0JPDxiZmRfdGFyZ2V0Pj4gdmVjdG9yLiBUaGV5IGFyZSB1c2VkIGluIGEgbnVtYmVyIG9mIG1hY3JvcyBmdXJ0aGVyCi0JZG93biBpbiBAZmlsZXtiZmQuaH0sIGFuZCBhcmUgYWxzbyB1c2VkIHdoZW4gY2FsbGluZyB2YXJpb3VzCi0Jcm91dGluZXMgYnkgaGFuZCBpbnNpZGUgdGhlIEJGRCBpbXBsZW1lbnRhdGlvbi4gIFRoZSBAdmFye2FyZ2xpc3R9Ci0JYXJndW1lbnQgbXVzdCBiZSBwYXJlbnRoZXNpemVkOyBpdCBjb250YWlucyBhbGwgdGhlIGFyZ3VtZW50cwotCXRvIHRoZSBjYWxsZWQgZnVuY3Rpb24uIAotCi0JVGhleSBtYWtlIHRoZSBkb2N1bWVudGF0aW9uIChtb3JlKSB1bnBsZWFzYW50IHRvIHJlYWQsIHNvIGlmCi0Jc29tZW9uZSB3YW50cyB0byBmaXggdGhpcyBhbmQgbm90IGJyZWFrIHRoZSBhYm92ZSwgcGxlYXNlIGRvLgotCi0uI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICAgICAgICAgICAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KQotLgotLiNpZmRlZiBERUJVR19CRkRfU0VORAotLiN1bmRlZiBCRkRfU0VORAotLiNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0uICAoKChiZmQpICYmIChiZmQpLT54dmVjICYmIChiZmQpLT54dmVjLT5tZXNzYWdlKSA/IFwKLS4gICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkgOiBcCi0uICAgIChiZmRfYXNzZXJ0IChfX0ZJTEVfXyxfX0xJTkVfXyksIE5VTEwpKQotLiNlbmRpZgotCi0JRm9yIG9wZXJhdGlvbnMgd2hpY2ggaW5kZXggb24gdGhlIEJGRCBmb3JtYXQ6Ci0KLS4jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICAgICAgICAgICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkKLS4KLS4jaWZkZWYgREVCVUdfQkZEX1NFTkQKLS4jdW5kZWYgQkZEX1NFTkRfRk1UCi0uI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0uICAoKChiZmQpICYmIChiZmQpLT54dmVjICYmIChiZmQpLT54dmVjLT5tZXNzYWdlKSA/IFwKLS4gICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkgOiBcCi0uICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0uI2VuZGlmCi0KLQlUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggZGVmaW5lcyB0aGUgdHlwZSBvZiBCRkQgdGhpcyBpcy4gIFRoZQotCTw8eHZlYz4+IG1lbWJlciBvZiB0aGUgc3RydWN0IDw8YmZkPj4gaXRzZWxmIHBvaW50cyBoZXJlLiAgRWFjaAotCW1vZHVsZSB0aGF0IGltcGxlbWVudHMgYWNjZXNzIHRvIGEgZGlmZmVyZW50IHRhcmdldCB1bmRlciBCRkQsCi0JZGVmaW5lcyBvbmUgb2YgdGhlc2UuCi0KLQotCUZJWE1FLCB0aGVzZSBuYW1lcyBzaG91bGQgYmUgcmF0aW9uYWxpc2VkIHdpdGggdGhlIG5hbWVzIG9mCi0JdGhlIGVudHJ5IHBvaW50cyB3aGljaCBjYWxsIHRoZW0uIFRvbyBiYWQgd2UgY2FuJ3QgaGF2ZSBvbmUKLQltYWNybyB0byBkZWZpbmUgdGhlbSBib3RoISAKLQotLmVudW0gYmZkX2ZsYXZvdXIgewotLiAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9zb21fZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vdmF4X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotLn07Ci0uCi0uZW51bSBiZmRfZW5kaWFuIHsgQkZEX0VORElBTl9CSUcsIEJGRF9FTkRJQU5fTElUVExFLCBCRkRfRU5ESUFOX1VOS05PV04gfTsKLS4KLS57KiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAgKn0KLS50eXBlZGVmIHN0cnVjdCBiZmRfbGlua19pbmZvIF9iZmRfbGlua19pbmZvOwotLgotLnR5cGVkZWYgc3RydWN0IGJmZF90YXJnZXQKLS57Ci0KLUlkZW50aWZpZXMgdGhlIGtpbmQgb2YgdGFyZ2V0LCBlLmcuLCBTdW5PUzQsIFVsdHJpeCwgZXRjLgotCi0uICBjaGFyICpuYW1lOwotCi1UaGUgImZsYXZvdXIiIG9mIGEgYmFjayBlbmQgaXMgYSBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgdGhlIGNvbnRlbnRzCi1vZiBhIGZpbGUuCi0KLS4gIGVudW0gYmZkX2ZsYXZvdXIgZmxhdm91cjsKLQotVGhlIG9yZGVyIG9mIGJ5dGVzIHdpdGhpbiB0aGUgZGF0YSBhcmVhIG9mIGEgZmlsZS4KLQotLiAgZW51bSBiZmRfZW5kaWFuIGJ5dGVvcmRlcjsKLQotVGhlIG9yZGVyIG9mIGJ5dGVzIHdpdGhpbiB0aGUgaGVhZGVyIHBhcnRzIG9mIGEgZmlsZS4KLQotLiAgZW51bSBiZmRfZW5kaWFuIGhlYWRlcl9ieXRlb3JkZXI7Ci0KLUEgbWFzayBvZiBhbGwgdGhlIGZsYWdzIHdoaWNoIGFuIGV4ZWN1dGFibGUgbWF5IGhhdmUgc2V0IC0KLWZyb20gdGhlIHNldCA8PEJGRF9OT19GTEFHUz4+LCA8PEhBU19SRUxPQz4+LCAuLi48PERfUEFHRUQ+Pi4KLQotLiAgZmxhZ3dvcmQgb2JqZWN0X2ZsYWdzOyAgICAgICAKLQotQSBtYXNrIG9mIGFsbCB0aGUgZmxhZ3Mgd2hpY2ggYSBzZWN0aW9uIG1heSBoYXZlIHNldCAtIGZyb20KLXRoZSBzZXQgPDxTRUNfTk9fRkxBR1M+PiwgPDxTRUNfQUxMT0M+PiwgLi4uPDxTRVRfTkVWRVJfTE9BRD4+LgotCi0uICBmbGFnd29yZCBzZWN0aW9uX2ZsYWdzOwotCi1UaGUgY2hhcmFjdGVyIG5vcm1hbGx5IGZvdW5kIGF0IHRoZSBmcm9udCBvZiBhIHN5bWJvbCAKLShpZiBhbnkpLCBwZXJoYXBzIGBfJy4KLQotLiAgY2hhciBzeW1ib2xfbGVhZGluZ19jaGFyOwotCi1UaGUgcGFkIGNoYXJhY3RlciBmb3IgZmlsZSBuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIuCi0KLS4gIGNoYXIgYXJfcGFkX2NoYXI7ICAgICAgICAgICAgCi0KLVRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyLgotCi0uICB1bnNpZ25lZCBzaG9ydCBhcl9tYXhfbmFtZWxlbjsKLQotRW50cmllcyBmb3IgYnl0ZSBzd2FwcGluZyBmb3IgZGF0YS4gVGhlc2UgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlcgotZW50cnkgcG9pbnRzLCBzaW5jZSB0aGV5IGRvbid0IHRha2UgYSBCRkQgYXN0aGUgZmlyc3QgYXJndW1lbnQuCi1DZXJ0YWluIG90aGVyIGhhbmRsZXJzIGNvdWxkIGRvIHRoZSBzYW1lLgotCi0uICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX3B1dHg2NCkgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MzIpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLS4gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDE2KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLUJ5dGUgc3dhcHBpbmcgZm9yIHRoZSBoZWFkZXJzCi0KLS4gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotRm9ybWF0IGRlcGVuZGVudCByb3V0aW5lczogdGhlc2UgYXJlIHZlY3RvcnMgb2YgZW50cnkgcG9pbnRzCi13aXRoaW4gdGhlIHRhcmdldCB2ZWN0b3Igc3RydWN0dXJlLCBvbmUgZm9yIGVhY2ggZm9ybWF0IHRvIGNoZWNrLgotCi1DaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkLiAgUmV0dXJuIGEgPDxiZmRfdGFyZ2V0ICo+PiBvciB6ZXJvLiAKLQotLiAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKigqX2JmZF9jaGVja19mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotU2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4uICAKLQotLiAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfc2V0X2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi1Xcml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiwgYXQgPDxiZmRfY2xvc2U+Pi4gCi0KLS4gIGJvb2xlYW4gICAgICAgICAgICAgKCpfYmZkX3dyaXRlX2NvbnRlbnRzW2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLVRoZSBnZW5lcmFsIHRhcmdldCB2ZWN0b3IuICBUaGVzZSB2ZWN0b3JzIGFyZSBpbml0aWFsaXplZCB1c2luZyB0aGUKLUJGRF9KVU1QX1RBQkxFIG1hY3Jvcy4KLQotLgotLiAgeyogR2VuZXJpYyBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyhOQU1FKVwKLS5DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKLS5DQVQoTkFNRSxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pLFwKLS5DQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0uCi0uICB7KiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKLS4gIHsqIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICp9Ci0uICBib29sZWFuICgqX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIHsqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotLiAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdG8gY29weSBwcml2YXRlIGRhdGEuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKLS5DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSxcCi0uQ0FUKE5BTUUsX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyksXAotLkNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCi0uICB7KiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLS4gICAgIHRvIGFub3RoZXIuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uICB7KiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhIGNvbW1vbiBvdXRwdXQgZmlsZSB3aGVuIGxpbmtpbmcuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhbm90aGVyLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAotLiAgICAgdG8gYW5vdGhlci4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0uCQkJCQkJCSAgIGJmZCAqLCBhc3ltYm9sICopKTsKLS4gIHsqIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICp9Ci0uICBib29sZWFuCSAoKl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotLgotLiAgeyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLS4KLS4gIHsqIENvcmUgZmlsZSBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKLS5DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCksXAotLkNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpLFwKLS5DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotLiAgY2hhciAqICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGludCAgICAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uCi0uICB7KiBBcmNoaXZlIGVudHJ5IHBvaW50cy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKE5BTUUpXAotLkNBVChOQU1FLF9zbHVycF9hcm1hcCksXAotLkNBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAotLkNBVChOQU1FLF93cml0ZV9hcm1hcCksXAotLkNBVChOQU1FLF9yZWFkX2FyX2hkciksXAotLkNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKLS5DQVQoTkFNRSxfZ2V0X2VsdF9hdF9pbmRleCksXAotLkNBVChOQU1FLF9nZW5lcmljX3N0YXRfYXJjaF9lbHQpLFwKLS5DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9hcm1hcCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSBQQVJBTVMgKChiZmQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQotLiAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0uICB2b2lkICAgICAoKl9iZmRfdHJ1bmNhdGVfYXJuYW1lKSBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKLS4gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9ybCAqbWFwLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZHgpKTsKLS4gIFBUUiAoKl9iZmRfcmVhZF9hcl9oZHJfZm4pIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLS4jZGVmaW5lIGJmZF9nZXRfZWx0X2F0X2luZGV4KGIsaSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfZWx0X2F0X2luZGV4LCAoYixpKSkKLS4gIGJmZCAqICAgICgqX2JmZF9nZXRfZWx0X2F0X2luZGV4KSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLS4gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdXNlZCBmb3Igc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW10YWIpLFwKLS5DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKLS5DQVQoTkFNRSxfcHJpbnRfc3ltYm9sKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW1ib2xfaW5mbyksXAotLkNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAotLkNBVChOQU1FLF9nZXRfbGluZW5vKSxcCi0uQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCi0uQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAotLkNBVChOQU1FLF9yZWFkX21pbmlzeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX21pbmlzeW1ib2xfdG9fc3ltYm9sKQotLiAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3N5bXRhYikgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgotLiAgICAgICAgICAgICAgICAoKl9iZmRfbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB2b2lkICAgICAgICAgICgqX2JmZF9wcmludF9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLS4jZGVmaW5lIGJmZF9wcmludF9zeW1ib2woYixwLHMsZSkgQkZEX1NFTkQoYiwgX2JmZF9wcmludF9zeW1ib2wsIChiLHAscyxlKSkKLS4gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfaW5mbyAqKSk7Ci0uI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKLS4gIGJvb2xlYW4JICgqX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0uCi0uICBhbGVudCAqICAgICgqX2dldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopKTsKLS4gIGJvb2xlYW4gICAgKCpfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKLS4gICAgICAgICAgICAgICAgICAgIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZSwgQ09OU1QgY2hhciAqKmZ1bmMsCi0uICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLS4geyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLS4gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0uICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICp9Ci0uICBhc3ltYm9sICogICgqX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgdm9pZCAqcHRyLAotLiAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKLS4jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKLS4gIEJGRF9TRU5EIChiLCBfcmVhZF9taW5pc3ltYm9scywgKGIsIGQsIG0sIHMpKQotLiAgbG9uZyAgKCpfcmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKLS4jZGVmaW5lIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbChiLCBkLCBtLCBmKSBcCi0uICBCRkRfU0VORCAoYiwgX21pbmlzeW1ib2xfdG9fc3ltYm9sLCAoYiwgZCwgbSwgZikpCi0uICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICopKTsKLS4KLS4gIHsqIFJvdXRpbmVzIGZvciByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpLFwKLS5DQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKLS4gIGxvbmcgICgqX2dldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBhcmVsZW50ICoqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgeyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqfQotLiAgcmVsb2NfaG93dG9fdHlwZSAqCi0uICAgICAgICgqcmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1dSSVRFKE5BTUUpXAotLkNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCi0uQ0FUKE5BTUUsX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotLiAgYm9vbGVhbiAgICAoKl9iZmRfc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLS4gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9MSU5LKE5BTUUpXAotLkNBVChOQU1FLF9zaXplb2ZfaGVhZGVycyksXAotLkNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxheF9zZWN0aW9uKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX2JmZF9maW5hbF9saW5rKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pLFwKLS5DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQotLiAgaW50ICAgICAgICAoKl9iZmRfc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0uICBiZmRfYnl0ZSAqICgqX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0uICAgICAgICAgICAgICAgICAgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uCi0uICBib29sZWFuICAgICgqX2JmZF9yZWxheF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqYWdhaW4pKTsKLS4KLS4gIHsqIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLS4gICAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKn0KLS4gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLS4KLS4gIHsqIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2xpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0uICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLS4KLS4gIHsqIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICp9Ci0uICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLS4KLS4gIHsqIFJlbW92ZSBzZWN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIHRoZSBvdXRwdXQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZ2Nfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyhOQU1FKVwKLS5DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAotLkNBVChOQU1FLF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCksXAotLkNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLS4gIHsqIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICp9Ci0uICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKn0KLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0uICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uICB7KiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotLiAgICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLgotCi1BIHBvaW50ZXIgdG8gYW4gYWx0ZXJuYXRpdmUgYmZkX3RhcmdldCBpbiBjYXNlIHRoZSBjdXJyZW50IG9uZSBpcyBub3QKLXNhdGlzZmFjdG9yeS4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB0YXJnZXQgY3B1IHN1cHBvcnRzIGJvdGggYmlnCi1hbmQgbGl0dGxlIGVuZGlhbiBjb2RlLCBhbmQgdGFyZ2V0IGNob3NlbiBieSB0aGUgbGlua2VyIGhhcyB0aGUgd3JvbmcKLWVuZGlhbm5lc3MuICBUaGUgZnVuY3Rpb24gb3Blbl9vdXRwdXQoKSBpbiBsZC9sZGxhbmcuYyB1c2VzIHRoaXMgZmllbGQKLXRvIGZpbmQgYW4gYWx0ZXJuYXRpdmUgb3V0cHV0IGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlLgotCi0uIHsqIE9wcG9zaXRlIGVuZGlhbiB2ZXJzaW9uIG9mIHRoaXMgdGFyZ2V0LiAgKn0gIAotLiBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqIGFsdGVybmF0aXZlX3RhcmdldDsKLS4gCi0KLURhdGEgZm9yIHVzZSBieSBiYWNrLWVuZCByb3V0aW5lcywgd2hpY2ggaXNuJ3QgZ2VuZXJpYyBlbm91Z2ggdG8gYmVsb25nCi1pbiB0aGlzIHN0cnVjdHVyZS4KLQotLiBQVFIgYmFja2VuZF9kYXRhOwotLiAKLS59IGJmZF90YXJnZXQ7Ci0KLSovCi0KLS8qIEFsbCBrbm93biB4dmVjcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMpLgotICAgQWxwaGFiZXRpemVkIGZvciBlYXN5IHJlZmVyZW5jZS4KLSAgIFRoZXkgYXJlIGxpc3RlZCBhIHNlY29uZCB0aW1lIGJlbG93LCBzaW5jZQotICAgd2UgY2FuJ3QgaW50ZXJtaXggZXh0ZXJuJ3MgYW5kIGluaXRpYWxpemVycy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhMjlrY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dDBfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFwb2xsb2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtbmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZWlfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZWlfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19iaWdfaG9zdDsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19saXR0bGVfaG9zdDsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9hbHBoYV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnYXJjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdhcm1fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9iaWdtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9kMTB2X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9kMzB2X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9ocHBhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9pMzg2X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9pODYwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9pOTYwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbTMycl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbTY4a192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbTg4a192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbW4xMDIwMF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbW4xMDMwMF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfcGpfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3BqbF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfcG93ZXJwY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zaF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfc2hsX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zcGFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfdjg1MF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfZnIzMF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfc3BhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZGVtb182NF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZWNvZmZfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZmFscGhhX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBoODMwMGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaDg1MDBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhvc3RfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBocDMwMGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBocDMwMGhwdXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc29tX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZhb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmR5bml4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZmcmVlYnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZvczlrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9wb3dlcnBjX3BlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9wb3dlcnBjbGVfcGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNfcGVpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9wb3dlcnBjbGVfcGVpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZwZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2cGVpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGdvMzJjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGdvMzJzdHViYmVkY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nmx5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bHlueF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZtYWNoM192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bXNkb3NfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpODYwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWNvZmZfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGllZWVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2F1eF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtjb2ZmdW5fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2xpbnV4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtseW54X2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2x5bnhfY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtzeXN2Y29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrNGtuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTg4a2Jjc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtODhrbWFjaDNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZWlfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlaV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmV3c29zM192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBubG0zMl9pMzg2X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX3NwYXJjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX2FscGhhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX3Bvd2VycGNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcGM1MzJuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgb2FzeXNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcGM1MzJtYWNoYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwcGNib290X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHJpc2NpeF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwbWFjX3hjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHJzNjAwMGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNobGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3NtYWxsX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNobGNvZmZfc21hbGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNsZV9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNwYXJjbGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNseW54X2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNseW54X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHN1bm9zX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0ZWtoZXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdGljMzBfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWMzMF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzgwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2YXhuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdmVyc2Fkb3NfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdm1zX2FscGhhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHZtc192YXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgd2UzMmtjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHc2NV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB6OGtjb2ZmX3ZlYzsKLQotLyogc3JlYyBpcyBhbHdheXMgaW5jbHVkZWQuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3JlY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzeW1ib2xzcmVjX3ZlYzsKLQotLyogYmluYXJ5IGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiaW5hcnlfdmVjOwotCi0vKiBpaGV4IGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYzsKLQotLyogQWxsIG9mIHRoZSB4dmVjcyBmb3IgY29yZSBmaWxlcy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhaXgzODZfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBocHV4X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaHBwYWJzZF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGlyaXhfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXRic2RfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvc2ZfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzY281X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdHJhZF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHB0cmFjZV9jb3JlX3ZlYzsKLQotY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW10gPSB7Ci0KLSNpZmRlZiBTRUxFQ1RfVkVDUwotCi0JU0VMRUNUX1ZFQ1MsCi0KLSNlbHNlIC8qIG5vdCBTRUxFQ1RfVkVDUyAqLwotCi0jaWZkZWYgREVGQVVMVF9WRUNUT1IKLQkmREVGQVVMVF9WRUNUT1IsCi0jZW5kaWYKLQkvKiBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlCi0JICAgd2l0aCBvdGhlciB2ZWN0b3IgbGlzdHMgLS0gdGhlIGRlY2xzIGFib3ZlIGFuZAotCSAgIHRoZSBjYXNlIHN0YXRlbWVudCBpbiBjb25maWd1cmUuaW4uCi0JICAgVmVjdG9ycyB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMsIG9yIGFyZW4ndCBmaW5pc2hlZCwKLQkgICBzaG91bGQgaGF2ZSBhbiBlbnRyeSBoZXJlIHdpdGggI2lmIDAgYXJvdW5kIGl0LCB0byBzaG93IHRoYXQKLQkgICBpdCB3YXNuJ3Qgb21pdHRlZCBieSBtaXN0YWtlLiAgKi8KLQkmYTI5a2NvZmZfYmlnX3ZlYywKLQkmYV9vdXRfYWRvYmVfdmVjLAotI2lmIDAJCQkJLyogTm8gb25lIHNlZW1zIHRvIHVzZSB0aGlzLiAgKi8KLQkmYW91dF9taXBzX2JpZ192ZWMsCi0jZW5kaWYKLQkmYW91dF9taXBzX2xpdHRsZV92ZWMsCi0JJmJfb3V0X3ZlY19iaWdfaG9zdCwKLQkmYl9vdXRfdmVjX2xpdHRsZV9ob3N0LAotCi0JLyogVGhpcywgYW5kIG90aGVyIHZlY3RvcnMsIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgKi5tdCBjb25maWd1cmF0aW9uLgotCSAgIEJ1dCB0aGF0IGRvZXMgbm90IG1lYW4gdGhleSBhcmUgdW5uZWNlc3NhcnkuICBJZiBjb25maWd1cmVkIHdpdGgKLQkgICAtLWVuYWJsZS10YXJnZXRzPWFsbCwgb2JqZHVtcCBvciBnZGIgc2hvdWxkIGJlIGFibGUgdG8gZXhhbWluZQotCSAgIHRoZSBmaWxlIGV2ZW4gaWYgd2UgZG9uJ3QgcmVjb2duaXplIHRoZSBtYWNoaW5lIHR5cGUuICAqLwotCSZiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmJmZF9lbGY2NF9hbHBoYV92ZWMsCi0jZW5kaWYKLQkmYmZkX2VsZjMyX2JpZ2FyY192ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfYmlnYXJtX3ZlYywKLSAgICAgICAgJmJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMsCi0JJmJmZF9lbGYzMl9iaWdtaXBzX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZiZmRfZWxmNjRfYmlnbWlwc192ZWMsCi0jZW5kaWYKLQkmYmZkX2VsZjMyX2QxMHZfdmVjLAotCSZiZmRfZWxmMzJfZDMwdl92ZWMsCi0JJmJmZF9lbGYzMl9ocHBhX3ZlYywKLQkmYmZkX2VsZjMyX2kzODZfdmVjLAotCSZiZmRfZWxmMzJfaTg2MF92ZWMsCi0JJmJmZF9lbGYzMl9pOTYwX3ZlYywKLQkmYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYywKLQkmYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYywKLSAgICAgICAgJmJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMsCi0JJmJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMsCi0jZW5kaWYKLQkmYmZkX2VsZjMyX20zMnJfdmVjLAotCSZiZmRfZWxmMzJfbW4xMDIwMF92ZWMsCi0JJmJmZF9lbGYzMl9tbjEwMzAwX3ZlYywKLQkmYmZkX2VsZjMyX202OGtfdmVjLAotCSZiZmRfZWxmMzJfbTg4a192ZWMsCi0JJmJmZF9lbGYzMl9zcGFyY192ZWMsCi0JJmJmZF9lbGYzMl9wal92ZWMsCi0JJmJmZF9lbGYzMl9wamxfdmVjLAotCSZiZmRfZWxmMzJfcG93ZXJwY192ZWMsCi0JJmJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjLAotCSZiZmRfZWxmMzJfdjg1MF92ZWMsCi0JJmJmZF9lbGYzMl9mcjMwX3ZlYywKLQkmYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMsCi0JJmJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjLAotI2lmZGVmIEJGRDY0CQkJLyogTm8gb25lIHNlZW1zIHRvIHVzZSB0aGlzLiAgKi8KLQkmYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYywKLQkmYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYywKLSNlbmRpZgotI2lmIDAKLQkmYmZkX2VsZjY0X3NwYXJjX3ZlYywKLSNlbmRpZgotCS8qIFdlIGRvbid0IGluY2x1ZGUgY2lzY29fY29yZV8qX3ZlYy4gIEFsdGhvdWdoIGl0IGhhcyBhIG1hZ2ljIG51bWJlciwKLQkgICB0aGUgbWFnaWMgbnVtYmVyIGlzbid0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsIGFuZCB0aHVzCi0JICAgbWlnaHQgc3B1cmlvdXNseSBtYXRjaCBvdGhlciBraW5kcyBvZiBmaWxlcy4gICovCi0jaWZkZWYgQkZENjQKLQkmZGVtb182NF92ZWMsCS8qIE9ubHkgY29tcGlsZWQgaWYgaG9zdCBoYXMgbG9uZy1sb25nIHN1cHBvcnQgKi8KLSNlbmRpZgotCSZlY29mZl9iaWdfdmVjLAotCSZlY29mZl9saXR0bGVfdmVjLAotCSZlY29mZl9iaWdsaXR0bGVfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmVjb2ZmYWxwaGFfbGl0dGxlX3ZlYywKLSNlbmRpZgotCSZoODMwMGNvZmZfdmVjLAotCSZoODUwMGNvZmZfdmVjLAotI2lmIDAKLQkvKiBTaW5jZSBhLm91dCBmaWxlcyBsYWNrIGRlY2VudCBtYWdpYyBudW1iZXJzLCBubyB3YXkgdG8gcmVjb2duaXplCi0JICAgd2hpY2gga2luZCBvZiBhLm91dCBmaWxlIGl0IGlzLiAgKi8KLQkmaG9zdF9hb3V0X3ZlYywKLSNlbmRpZgotI2lmIDAJCQkJLyogQ2xhc2hlcyB3aXRoIHN1bm9zX2JpZ192ZWMgbWFnaWMgbm8uICAqLwotCSZocDMwMGJzZF92ZWMsCi0jZW5kaWYKLQkmaHAzMDBocHV4X3ZlYywKLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikKLSAgICAgICAgJnNvbV92ZWMsCi0jZW5kaWYKLQkmaTM4NmFvdXRfdmVjLAotCSZpMzg2YnNkX3ZlYywKLQkmaTM4NmNvZmZfdmVjLAotCSZpMzg2ZnJlZWJzZF92ZWMsCi0JJmk4NjBjb2ZmX3ZlYywKLQkmYmZkX3Bvd2VycGNfcGVfdmVjLAotCSZiZmRfcG93ZXJwY2xlX3BlX3ZlYywKLQkmYmZkX3Bvd2VycGNfcGVpX3ZlYywKLQkmYmZkX3Bvd2VycGNsZV9wZWlfdmVjLAotCSZnbzMyY29mZl92ZWMsCi0JJmdvMzJzdHViYmVkY29mZl92ZWMsCi0jaWYgMAotCS8qIFNpbmNlIGEub3V0IGZpbGVzIGxhY2sgZGVjZW50IG1hZ2ljIG51bWJlcnMsIG5vIHdheSB0byByZWNvZ25pemUKLQkgICB3aGljaCBraW5kIG9mIGEub3V0IGZpbGUgaXQgaXMuICAqLwotCSZpMzg2bGludXhfdmVjLAotI2VuZGlmCi0JJmkzODZseW54X2FvdXRfdmVjLAotCSZpMzg2bHlueF9jb2ZmX3ZlYywKLSNpZiAwCi0JLyogTm8gZGlzdGluZ3Vpc2hpbmcgZmVhdHVyZXMgZm9yIE1hY2ggMyBleGVjdXRhYmxlcy4gICovCi0JJmkzODZtYWNoM192ZWMsCi0jZW5kaWYKLQkmaTM4Nm1zZG9zX3ZlYywKLQkmaTM4Nm5ldGJzZF92ZWMsCi0JJmkzODZvczlrX3ZlYywKLQkmaTM4NnBlX3ZlYywKLQkmaTM4NnBlaV92ZWMsCi0JJmFybWNvZmZfbGl0dGxlX3ZlYywKLQkmYXJtY29mZl9iaWdfdmVjLAotCSZhcm1uZXRic2RfdmVjLAotCSZhcm1wZV9saXR0bGVfdmVjLAotCSZhcm1wZV9iaWdfdmVjLAotCSZhcm1wZWlfbGl0dGxlX3ZlYywKLQkmYXJtcGVpX2JpZ192ZWMsCi0JJmFybV9lcG9jX3BlX2xpdHRsZV92ZWMsCi0JJmFybV9lcG9jX3BlX2JpZ192ZWMsCi0JJmFybV9lcG9jX3BlaV9saXR0bGVfdmVjLAotCSZhcm1fZXBvY19wZWlfYmlnX3ZlYywKLQkmaWNvZmZfYmlnX3ZlYywKLQkmaWNvZmZfbGl0dGxlX3ZlYywKLQkmaWVlZV92ZWMsCi0JJm02OGtjb2ZmX3ZlYywKLQkmbTY4a2NvZmZ1bl92ZWMsCi0jaWYgMAotCS8qIFNpbmNlIGEub3V0IGZpbGVzIGxhY2sgZGVjZW50IG1hZ2ljIG51bWJlcnMsIG5vIHdheSB0byByZWNvZ25pemUKLQkgICB3aGljaCBraW5kIG9mIGEub3V0IGZpbGUgaXQgaXMuICAqLwotCSZtNjhrbGludXhfdmVjLAotI2VuZGlmCi0JJm02OGtseW54X2FvdXRfdmVjLAotCSZtNjhrbHlueF9jb2ZmX3ZlYywKLQkmbTY4a25ldGJzZF92ZWMsCi0JJm02OGtzeXN2Y29mZl92ZWMsCi0JJm04OGtiY3NfdmVjLAotCSZtODhrbWFjaDNfdmVjLAotCSZtY29yZV9wZV9iaWdfdmVjLAotCSZtY29yZV9wZV9saXR0bGVfdmVjLAotCSZtY29yZV9wZWlfYmlnX3ZlYywKLQkmbWNvcmVfcGVpX2xpdHRsZV92ZWMsCi0JJm5ld3NvczNfdmVjLAotCSZubG0zMl9pMzg2X3ZlYywKLQkmbmxtMzJfc3BhcmNfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJm5sbTMyX2FscGhhX3ZlYywKLSNlbmRpZgotCSZwYzUzMm5ldGJzZF92ZWMsCi0jaWYgMAotCS8qIFdlIGhhdmUgbm8gb2FzeXMgdG9vbHMgYW55bW9yZSwgc28gd2UgY2FuJ3QgdGVzdCBhbnkgb2YgdGhpcwotCSAgIGFueW1vcmUuIElmIHlvdSB3YW50IHRvIHRlc3QgdGhlIHN0dWZmIHlvdXJzZWxmLCBnbyBhaGVhZC4uLgotCSAgIHN0ZXZlQGN5Z251cy5jb20KLQkgICBXb3JzZSwgc2luY2UgdGhlcmUgaXMgbm8gbWFnaWMgbnVtYmVyIGZvciBhcmNoaXZlcywgdGhlcmUKLQkgICBjYW4gYmUgYW5ub3lpbmcgdGFyZ2V0IG1pcy1tYXRjaGVzLiAgKi8KLQkmb2FzeXNfdmVjLAotI2VuZGlmCi0JJnBjNTMybWFjaGFvdXRfdmVjLAotI2lmIDAKLQkvKiBXZSBoYXZlIG5vIHdheSBvZiBkaXN0aW5ndWlzaGluZyB0aGVzZSBmcm9tIG90aGVyIGEub3V0IHZhcmlhbnRzICovCi0JJmFvdXRfYXJtX2JpZ192ZWMsCi0JJmFvdXRfYXJtX2xpdHRsZV92ZWMsCi0JJnJpc2NpeF92ZWMsCi0jZW5kaWYKLSNpZiAwCi0JLyogVGhpcyBoYXMgdGhlIHNhbWUgbWFnaWMgbnVtYmVyIGFzIFJTLzYwMDAuICovCi0JJnBtYWNfeGNvZmZfdmVjLAotI2VuZGlmCi0JJnJzNjAwMGNvZmZfdmVjLAotCSZwcGNib290X3ZlYywKLQkmc2hjb2ZmX3ZlYywKLQkmc2hsY29mZl92ZWMsCi0JJnNoY29mZl9zbWFsbF92ZWMsCi0JJnNobGNvZmZfc21hbGxfdmVjLAotCSZzcGFyY2xlX2FvdXRfdmVjLAotCSZzcGFyY2xpbnV4X3ZlYywKLQkmc3BhcmNseW54X2FvdXRfdmVjLAotCSZzcGFyY2x5bnhfY29mZl92ZWMsCi0JJnNwYXJjbmV0YnNkX3ZlYywKLQkmc3Vub3NfYmlnX3ZlYywKLQkmYW91dDBfYmlnX3ZlYywKLQkmdGljMzBfYW91dF92ZWMsCi0JJnRpYzMwX2NvZmZfdmVjLAotCSZ0aWM4MGNvZmZfdmVjLAotCSZ2YXhuZXRic2RfdmVjLAotCSZ2ZXJzYWRvc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmdm1zX2FscGhhX3ZlYywKLSNlbmRpZgotCSZ2bXNfdmF4X3ZlYywKLQkmd2UzMmtjb2ZmX3ZlYywKLQkmejhrY29mZl92ZWMsCi0KLSNlbmRpZiAvKiBub3QgU0VMRUNUX1ZFQ1MgKi8KLQotLyogQWx3YXlzIHN1cHBvcnQgUy1yZWNvcmRzLCBmb3IgY29udmVuaWVuY2UuICAqLwotCSZzcmVjX3ZlYywKLQkmc3ltYm9sc3JlY192ZWMsCi0vKiBBbmQgdGVraGV4ICovCi0JJnRla2hleF92ZWMsCi0vKiBMaWtld2lzZSBmb3IgYmluYXJ5IG91dHB1dC4gICovCi0JJmJpbmFyeV92ZWMsCi0vKiBMaWtld2lzZSBmb3IgaWhleC4gICovCi0JJmloZXhfdmVjLAotCi0vKiBBZGQgYW55IHJlcXVpcmVkIHRyYWRpdGlvbmFsLWNvcmUtZmlsZS1oYW5kbGVyLiAgKi8KLQotI2lmZGVmIEFJWDM4Nl9DT1JFCi0JJmFpeDM4Nl9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIEhQVVhfQ09SRQotCSZocHV4X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgSFBQQUJTRF9DT1JFCi0JJmhwcGFic2RfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBJUklYX0NPUkUKLQkmaXJpeF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIE5FVEJTRF9DT1JFCi0JJm5ldGJzZF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIE9TRl9DT1JFCi0JJm9zZl9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIFNDTzVfQ09SRQotCSZzY281X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYJVFJBRF9DT1JFCi0JJnRyYWRfY29yZV92ZWMsCi0jZW5kaWYKLQotI2lmZGVmCVBUUkFDRV9DT1JFCi0JJnB0cmFjZV9jb3JlX3ZlYywKLSNlbmRpZgotCi0JTlVMTCAvKiBlbmQgb2YgbGlzdCBtYXJrZXIgKi8KLX07Ci0KLS8qIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBjb250YWlucyBlaXRoZXIgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlZmF1bHQgdmVjdG9yLAotICAgaWYgdGhlcmUgaXMgb25lLCBvciB6ZXJvIGlmIHRoZXJlIGlzbid0LiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW10gPSB7Ci0jaWZkZWYgREVGQVVMVF9WRUNUT1IKLQkmREVGQVVMVF9WRUNUT1IsCi0jZW5kaWYKLQlOVUxMCi19OwotCi0vKiBXaGVuIHRoZXJlIGlzIGFuIGFtYmlndW91cyBtYXRjaCwgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIHB1dHMgdGhlCi0gICBuYW1lcyBvZiB0aGUgbWF0Y2hpbmcgdGFyZ2V0cyBpbiBhbiBhcnJheS4gIFRoaXMgdmFyaWFibGUgaXMgdGhlIG1heGltdW0KLSAgIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgdGhlIGFycmF5IGNvdWxkIHBvc3NpYmx5IG5lZWQuICAqLwotY29uc3Qgc2l6ZV90IF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzID0gc2l6ZW9mKGJmZF90YXJnZXRfdmVjdG9yKS9zaXplb2YoKmJmZF90YXJnZXRfdmVjdG9yKTsKLQwKLS8qIFRoaXMgYXJyYXkgbWFwcyBjb25maWd1cmF0aW9uIHRyaXBsZXRzIG9udG8gQkZEIHZlY3RvcnMuICAqLwotCi1zdHJ1Y3QgdGFyZ21hdGNoCi17Ci0gIC8qIFRoZSBjb25maWd1cmF0aW9uIHRyaXBsZXQuICAqLwotICBjb25zdCBjaGFyICp0cmlwbGV0OwotICAvKiBUaGUgQkZEIHZlY3Rvci4gIElmIHRoaXMgaXMgTlVMTCwgdGhlbiB0aGUgdmVjdG9yIGlzIGZvdW5kIGJ5Ci0gICAgIHNlYXJjaGluZyBmb3J3YXJkIGZvciB0aGUgbmV4dCBzdHJ1Y3R1cmUgd2l0aCBhIG5vbiBOVUxMIHZlY3RvcgotICAgICBmaWVsZC4gICovCi0gIGNvbnN0IGJmZF90YXJnZXQgKnZlY3RvcjsKLX07Ci0KLS8qIHRhcmdtYXRjaC5oIGlzIGJ1aWx0IGJ5IE1ha2VmaWxlIG91dCBvZiBjb25maWcuYmZkLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFyZ21hdGNoIGJmZF90YXJnZXRfbWF0Y2hbXSA9IHsKLSNpbmNsdWRlICJ0YXJnbWF0Y2guaCIKLSAgeyBOVUxMLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpmaW5kX3RhcmdldCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogRmluZCBhIHRhcmdldCB2ZWN0b3IsIGdpdmVuIGEgbmFtZSBvciBjb25maWd1cmF0aW9uIHRyaXBsZXQuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1maW5kX3RhcmdldCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXQ7Ci0gIGNvbnN0IHN0cnVjdCB0YXJnbWF0Y2ggKm1hdGNoOwotCi0gIGZvciAodGFyZ2V0ID0gJmJmZF90YXJnZXRfdmVjdG9yWzBdOyAqdGFyZ2V0ICE9IE5VTEw7IHRhcmdldCsrKQotICAgIGlmIChzdHJjbXAgKG5hbWUsICgqdGFyZ2V0KS0+bmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiAqdGFyZ2V0OwotCi0gIC8qIElmIHdlIGNvdWxkbid0IG1hdGNoIG9uIHRoZSBleGFjdCBuYW1lLCB0cnkgbWF0Y2hpbmcgb24gdGhlCi0gICAgIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gIEZJWE1FOiBXZSBzaG91bGQgcnVuIHRoZSB0cmlwbGV0IHRocm91Z2gKLSAgICAgY29uZmlnLnN1YiBmaXJzdCwgYnV0IHRoYXQgaXMgaGFyZC4gICovCi0gIGZvciAobWF0Y2ggPSAmYmZkX3RhcmdldF9tYXRjaFswXTsgbWF0Y2gtPnRyaXBsZXQgIT0gTlVMTDsgbWF0Y2grKykKLSAgICB7Ci0gICAgICBpZiAoZm5tYXRjaCAobWF0Y2gtPnRyaXBsZXQsIG5hbWUsIDApID09IDApCi0JewotCSAgd2hpbGUgKG1hdGNoLT52ZWN0b3IgPT0gTlVMTCkKLQkgICAgKyttYXRjaDsKLQkgIHJldHVybiBtYXRjaC0+dmVjdG9yOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9kZWZhdWx0X3RhcmdldAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9kZWZhdWx0X3RhcmdldCAoY29uc3QgY2hhciAqbmFtZSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBkZWZhdWx0IHRhcmdldCB2ZWN0b3IgdG8gdXNlIHdoZW4gcmVjb2duaXppbmcgYSBCRkQuCi0JVGhpcyB0YWtlcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LCB3aGljaCBtYXkgYmUgYSBCRkQgdGFyZ2V0Ci0JbmFtZSBvciBhIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldDsKLQotICBpZiAoYmZkX2RlZmF1bHRfdmVjdG9yWzBdICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgYmZkX2RlZmF1bHRfdmVjdG9yWzBdLT5uYW1lKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHRhcmdldCA9IGZpbmRfdGFyZ2V0IChuYW1lKTsKLSAgaWYgKHRhcmdldCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfZGVmYXVsdF92ZWN0b3JbMF0gPSB0YXJnZXQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZmluZF90YXJnZXQKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfdGFyZ2V0ICpiZmRfZmluZF90YXJnZXQoQ09OU1QgY2hhciAqdGFyZ2V0X25hbWUsIGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdHJhbnNmZXIgdmVjdG9yIGZvciB0aGUgb2JqZWN0IHRhcmdldAotCW5hbWVkIEB2YXJ7dGFyZ2V0X25hbWV9LiAgSWYgQHZhcnt0YXJnZXRfbmFtZX0gaXMgPDxOVUxMPj4sIGNob29zZSB0aGUKLQlvbmUgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDw8R05VVEFSR0VUPj47IGlmIHRoYXQgaXMgbnVsbCBvciBub3QKLQlkZWZpbmVkLCB0aGVuIGNob29zZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhcmdldCBsaXN0LgotCVBhc3NpbmcgaW4gdGhlIHN0cmluZyAiZGVmYXVsdCIgb3Igc2V0dGluZyB0aGUgZW52aXJvbm1lbnQKLQl2YXJpYWJsZSB0byAiZGVmYXVsdCIgd2lsbCBjYXVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhcmdldAotCWxpc3QgdG8gYmUgcmV0dXJuZWQsIGFuZCAidGFyZ2V0X2RlZmF1bHRlZCIgd2lsbCBiZSBzZXQgaW4gdGhlCi0JQkZELiAgVGhpcyBjYXVzZXMgPDxiZmRfY2hlY2tfZm9ybWF0Pj4gdG8gbG9vcCBvdmVyIGFsbCB0aGUKLQl0YXJnZXRzIHRvIGZpbmQgdGhlIG9uZSB0aGF0IG1hdGNoZXMgdGhlIGZpbGUgYmVpbmcgcmVhZC4gICAKLSovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXRfbmFtZSwgYWJmZCkKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0X25hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgY2hhciAqdGFyZ25hbWU7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldDsKLQotICBpZiAodGFyZ2V0X25hbWUgIT0gTlVMTCkKLSAgICB0YXJnbmFtZSA9IHRhcmdldF9uYW1lOwotICBlbHNlCi0gICAgdGFyZ25hbWUgPSBnZXRlbnYgKCJHTlVUQVJHRVQiKTsKLQotICAvKiBUaGlzIGlzIHNhZmU7IHRoZSB2ZWN0b3IgY2Fubm90IGJlIG51bGwgKi8KLSAgaWYgKHRhcmduYW1lID09IE5VTEwgfHwgc3RyY21wICh0YXJnbmFtZSwgImRlZmF1bHQiKSA9PSAwKQotICAgIHsKLSAgICAgIGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSB0cnVlOwotICAgICAgaWYgKGJmZF9kZWZhdWx0X3ZlY3RvclswXSAhPSBOVUxMKQotCWFiZmQtPnh2ZWMgPSBiZmRfZGVmYXVsdF92ZWN0b3JbMF07Ci0gICAgICBlbHNlCi0JYWJmZC0+eHZlYyA9IGJmZF90YXJnZXRfdmVjdG9yWzBdOwotICAgICAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0gICAgfQotCi0gIGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQotICB0YXJnZXQgPSBmaW5kX3RhcmdldCAodGFyZ25hbWUpOwotICBpZiAodGFyZ2V0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYWJmZC0+eHZlYyA9IHRhcmdldDsKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3RhcmdldF9saXN0Ci0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqKmJmZF90YXJnZXRfbGlzdCh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBmcmVzaGx5IG1hbGxvY2VkIE5VTEwtdGVybWluYXRlZAotCXZlY3RvciBvZiB0aGUgbmFtZXMgb2YgYWxsIHRoZSB2YWxpZCBCRkQgdGFyZ2V0cy4gRG8gbm90Ci0JbW9kaWZ5IHRoZSBuYW1lcy4KLQotKi8KLQotY29uc3QgY2hhciAqKgotYmZkX3RhcmdldF9saXN0ICgpCi17Ci0gIGludCB2ZWNfbGVuZ3RoPSAwOwotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpICYmICEgZGVmaW5lZCAoX19TVERDX18pCi0gIC8qIFRoZSBuYXRpdmUgY29tcGlsZXIgb24gdGhlIEhQOTAwMC83MDAgaGFzIGEgYnVnIHdoaWNoIGNhdXNlcyBpdAotICAgICB0byBsb29wIGVuZGxlc3NseSB3aGVuIGNvbXBpbGluZyB0aGlzIGZpbGUuICBUaGlzIGF2b2lkcyBpdC4gICovCi0gIHZvbGF0aWxlCi0jZW5kaWYKLSAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldDsKLSAgQ09OU1QgIGNoYXIgKipuYW1lX2xpc3QsICoqbmFtZV9wdHI7Ci0KLSAgZm9yICh0YXJnZXQgPSAmYmZkX3RhcmdldF92ZWN0b3JbMF07ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspCi0gICAgdmVjX2xlbmd0aCsrOwotCi0gIG5hbWVfcHRyID0gbmFtZV9saXN0ID0gKENPTlNUIGNoYXIgKiopCi0gICAgYmZkX3ptYWxsb2MgKCh2ZWNfbGVuZ3RoICsgMSkgKiBzaXplb2YgKGNoYXIgKiopKTsKLQotICBpZiAobmFtZV9saXN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yICh0YXJnZXQgPSAmYmZkX3RhcmdldF92ZWN0b3JbMF07ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspCi0gICAgKihuYW1lX3B0cisrKSA9ICgqdGFyZ2V0KS0+bmFtZTsKLQotICByZXR1cm4gbmFtZV9saXN0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2VhY2hfZm9yX3RhcmdldAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF90YXJnZXQgKiBiZmRfc2VhcmNoX2Zvcl90YXJnZXQgKGludCAoKiBzZWFyY2hfZnVuYykoY29uc3QgYmZkX3RhcmdldCAqLCB2b2lkICopLCB2b2lkICopOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHRyYW5zZmVyIHZlY3RvciBpbiB0aGUgbGlzdCBvZgotCXRyYW5zZmVyIHZlY3RvcnMgbWFpbnRhaW5lZCBieSBCRkQgdGhhdCBwcm9kdWNlcyBhIG5vbi16ZXJvCi0JcmVzdWx0IHdoZW4gcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBAdmFye3NlYXJjaF9mdW5jfS4gIFRoZQotCXBhcmFtZXRlciBAdmFye2RhdGF9IGlzIHBhc3NlZCwgdW5leGFtaW5lZCwgdG8gdGhlIHNlYXJjaAotCWZ1bmN0aW9uLgotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1iZmRfc2VhcmNoX2Zvcl90YXJnZXQgKHNlYXJjaF9mdW5jLCBkYXRhKQotICAgICBpbnQgKCogc2VhcmNoX2Z1bmMpIFBBUkFNUyAoKGNvbnN0IGJmZF90YXJnZXQgKiB0YXJnZXQsIHZvaWQgKiBkYXRhKSk7Ci0gICAgIHZvaWQgKiBkYXRhOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKiB0YXJnZXQ7Ci0KLSAgZm9yICh0YXJnZXQgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKiB0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0ICsrKQotICAgIGlmIChzZWFyY2hfZnVuYyAoKiB0YXJnZXQsIGRhdGEpKQotICAgICAgcmV0dXJuICogdGFyZ2V0OwotCi0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3RhcmdtYXRjaC5zZWQgYi9iZmQvdGFyZ21hdGNoLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0MGU3Mi4uMDAwMDAwMAotLS0gYS9iZmQvdGFyZ21hdGNoLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTEsL1NUQVJUIE9GIHRhcmdtYXRjaC5oLwlkCi0vRU5EIE9GIHRhcmdtYXRjaC5oLywkCQlkCi1zL14jaWYvS0VFUCAjaWYvCi1zL14jZW5kaWYvS0VFUCAjZW5kaWYvCi1zL15bIAldKiMuKiQvLwotcy9eS0VFUCAjLyMvCi1zL1sgCV0qXFwkLy8KLXQgbGFiMQotCTpsYWIxCi1zL1t8IAldW3wgCV0qXChbXnwoKSAJXVtefCgpIAldKlwpWyAJXSp8L3sgIlwxIiwgTlVMTCB9LC9nCi1zL1t8IAldW3wgCV0qXChbXnwoKSAJXVtefCgpIAldKlwpWyAJXSopL3sgIlwxIiwvZwotdCBsYWIyCi1zL15bIAldKnRhcmdfZGVmdmVjPVwoW14gCV0qXCkvI2lmICFkZWZpbmVkIChTRUxFQ1RfVkVDUykgfHwgZGVmaW5lZCAoSEFWRV9cMSkvCi10IGxhYjMKLXMvLio9LiovLwotcy87Oy8vCi1iCi0JOmxhYjIKLUgKLWQKLQk6bGFiMwotRwotcy9cbi8lRU9MJS9nCi1zL1woZGVmaW5lZCAoSEFWRV9cKVwoW14pXSpcKVwoLipcKS9cMVwyXDNcCi1cJlwyIH0sXAotI2VuZGlmLwotcy8lRU9MJS9cCi0vZwotcAotcy8uKi8vZwotcy9cbi8vZwotaApkaWZmIC0tZ2l0IGEvYmZkL3Rla2hleC5jIGIvYmZkL3Rla2hleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZmZTc1Li4wMDAwMDAwCi0tLSBhL2JmZC90ZWtoZXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjggKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIEV4dGVuZGVkIFRla3Ryb25peCBIZXggRm9ybWF0ICBvYmplY3RzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU1VCU0VDVElPTgotCVRla3Ryb25peCBIZXggRm9ybWF0IGhhbmRsaW5nCi0KLURFU0NSSVBUSU9OCi0JCi0JVGVrIEhleCByZWNvcmRzIGNhbiBob2xkIHN5bWJvbHMgYW5kIGRhdGEsIGJ1dCBub3QKLQlyZWxvY2F0aW9ucy4gVGhlaXIgbWFpbiBhcHBsaWNhdGlvbiBpcyBjb21tdW5pY2F0aW9uIHdpdGgKLQlkZXZpY2VzIGxpa2UgUFJPTSBwcm9ncmFtbWVycyBhbmQgSUNFIGVxdWlwbWVudC4KLQkKLQlJdCBzZWVtcyB0aGF0IHRoZSBzZWN0aW9ucyBhcmUgZGVzY2liZWQgYXMgYmVpbmcgcmVhbGx5IGJpZywKLSAgICAgICAgdGhlIGV4YW1wbGUgSSBoYXZlIHNheXMgdGhhdCB0aGUgdGV4dCBzZWN0aW9uIGlzIDAuLmZmZmZmZmZmLgotCUJGRCB3b3VsZCBiYXJmIHdpdGggdGhpcywgbWFueSBhcHBzIHdvdWxkIHRyeSB0byBhbGxvYyA0R0IgdG8KLQlyZWFkIGluIHRoZSBmaWxlLgotCi0JVGV4IEhleCBtYXkgY29udGFpbiBtYW55IHNlY3Rpb25zLCBidXQgdGhlIGRhdGEgd2hpY2ggY29tZXMgaW4KLQloYXMgbm8gdGFnIHNheWluZyB3aGljaCBzZWN0aW9uIGl0IGJlbG9uZ3MgdG8sIHNvIHdlIGNyZWF0ZQotCW9uZSBzZWN0aW9uIGZvciBlYWNoIGJsb2NrIG9mIGRhdGEsIGNhbGxlZCAiYmxrbm5ubiIgd2hpY2ggd2UKLQlzdGljayBhbGwgdGhlIGRhdGEgaW50by4KLQotCVRla0hleCBtYXkgY29tZSBvdXQgb2YgCW9yZGVyIGFuZCB0aGVyZSBpcyBubyBoZWFkZXIsIHNvIGFuCi0JaW5pdGlhbCBzY2FuIGlzIHJlcXVpcmVkICB0byBkaXNjb3ZlciB0aGUgbWluaW11bSBhbmQgbWF4aW11bQotCWFkZHJlc3NlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdm1hIGFuZCBzaXplIG9mIHRoZSBzZWN0aW9ucyB3ZQotCWNyZWF0ZS4KLQlXZSByZWFkIGluIHRoZSBkYXRhIGludG8gcGFnZXMgb2YgQ0hVTktfTUFTSysxIHNpemUgYW5kIHJlYWQKLQl0aGVtIG91dCBmcm9tIHRoYXQgd2hlbmV2ZXIgd2UgbmVlZCB0by4KLQotCUFueSBudW1iZXIgb2Ygc2VjdGlvbnMgbWF5IGJlIGNyZWF0ZWQgZm9yIG91dHB1dCwgd2Ugc2F2ZSB0aGVtCi0JdXAgYW5kIG91dHB1dCB0aGVtIHdoZW4gaXQncyB0aW1lIHRvIGNsb3NlIHRoZSBiZmQuCi0KLQotCUEgVGVrSGV4IHJlY29yZCBsb29rcyBsaWtlOgotRVhBTVBMRQotCSU8YmxvY2sgbGVuZ3RoPjx0eXBlPjxjaGVja3N1bT48c3R1ZmY+PGNyPgotCQotREVTQ1JJUFRJT04KLQlXaGVyZQotCW8gbGVuZ3RoCi0JaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVjb3JkIG5vdCBpbmNsdWRpbmcgdGhlICUgc2lnbi4KLQlvIHR5cGUKLQlpcyBvbmUgb2Y6Ci0JMykgc3ltYm9sIHJlY29yZAotCTYpIGRhdGEgcmVjb3JkCi0JOCkgdGVybWluYXRpb24gcmVjb3JkCi0JCi0KLVRoZSBkYXRhIGNhbiBjb21lIG91dCBvZiBvcmRlciwgYW5kIG1heSBiZSBkaXNjb250aWdvdXMuIFRoaXMgaXMgYQotc2VyaWFsIHByb3RvY29sLCBzbyBiaWcgZmlsZXMgYXJlIHVubGlrZWx5LCBzbyB3ZSBrZWVwIGEgbGlzdCBvZiA4ayBjaHVua3MKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGJmZF92bWEgbG93OwotICAgIGJmZF92bWEgaGlnaDsKLSAgfSBhZGRyX3JhbmdlX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0Ci0gIHsKLQotICAgIGFzeW1ib2wgc3ltYm9sOwotICAgIHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqcHJldjsKLQotICB9IHRla2hleF9zeW1ib2xfdHlwZTsKLQotc3RhdGljIGNvbnN0IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotCi1zdGF0aWMgY2hhciBzdW1fYmxvY2tbMjU2XTsKLQotI2RlZmluZSBOT1RfSEVYIDIwCi0jZGVmaW5lIE5JQkJMRSh4KSBoZXhfdmFsdWUoeCkKLSNkZWZpbmUgSEVYKGJ1ZmZlcikgKChOSUJCTEUoKGJ1ZmZlcilbMF0pPDw0KSArIE5JQkJMRSgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIFRPSEVYKGQseCkgXAotKGQpWzFdID0gZGlnc1soeCkgJiAweGZdOyBcCi0oZClbMF0gPSBkaWdzWygoeCk+PjQpJjB4Zl07Ci0jZGVmaW5lCUlTSEVYKHgpICBoZXhfcCh4KQotCi1zdGF0aWMgdm9pZCB0ZWtoZXhfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkX3ZtYSBnZXR2YWx1ZSBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCB0ZWtoZXhfcHJpbnRfc3ltYm9sCi0gUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHRla2hleF9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGFzeW1ib2wgKnRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCB0ZWtoZXhfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIG91dCBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgd3JpdGVzeW0gUEFSQU1TICgoY2hhciAqKiwgQ09OU1QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZXZhbHVlIFBBUkFNUyAoKGNoYXIgKiosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9zZXRfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCosIHNlY19wdHIsIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9zZXRfYXJjaF9tYWNoCi0gUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyB2b2lkIG1vdmVfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBib29sZWFuKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqdGVraGV4X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyB0ZWtoZXhfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIHZvaWQgcGFzc19vdmVyIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqKShiZmQqLCBpbnQsIGNoYXIgKikpKTsKLXN0YXRpYyB2b2lkIGZpcnN0X3BoYXNlIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgaW5zZXJ0X2J5dGUgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSkpOwotc3RhdGljIHN0cnVjdCBkYXRhX3N0cnVjdCAqZmluZF9jaHVuayBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotc3RhdGljIHVuc2lnbmVkIGludCBnZXRzeW0gUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7Ci0KLS8qCi1IZXJlJ3MgYW4gZXhhbXBsZQotJTNBNkM2NDgwMDA0RTU2RkZGQzRFNzE3MDYzQjBBRUZGRkM2RDA2NTJBRUZGRkM2MEYyNEU1RTRFNzUKLSUxQjM3MDlUX1NFR01FTlQxMTA4RkZGRkZGRkYKLSUyQjNBQjlUX1NFR01FTlQ3RGdjY19jb21waWxlZCQxMDg3aGVsbG8kYzEwCi0lMzczODI5VF9TRUdNRU5UODBpbnQkdDEkcjEkJDIxNDc0MTA4MGNoYXIkdDIkcjIkMCQxMjcxMAotJTM3Mzc2OVRfU0VHTUVOVDgwbG9uZyRpbnQkdDMkcjEkJDEwODB1bnNpZ25lZCRpbnQkdDQkMTAKLSUzNzNDQTlUX1NFR01FTlQ4MGxvbmckdW5zaWduZWQkaW4xMDgwc2hvcnQkaW50JHQ2JHIxJDEwCi0lMzczMDQ5VF9TRUdNRU5UODBsb25nJGxvbmckaW50JHQ3MTA4MHNob3J0JHVuc2lnbmVkJGkxMAotJTM3M0EyOVRfU0VHTUVOVDgwbG9uZyRsb25nJHVuc2lnbjEwODBzaWduZWQkY2hhciR0MTAkMTAKLSUzNzNENjlUX1NFR01FTlQ4MHVuc2lnbmVkJGNoYXIkdDExMDgwZmxvYXQkdDEyJHIxJDQkMDEwCi0lMzczRDE5VF9TRUdNRU5UODBkb3VibGUkdDEzJHIxJDgkMTA4MGxvbmckZG91YmxlJHQxNCQxMAotJTI3MzREOVRfU0VHTUVOVDhCdm9pZCR0MTUkMTUxMDM1X21haW4xMAotJTJGM0NBOVRfU0VHTUVOVDgxJDEwODEkMTY4MSQxRTgxJDIxNDg3bWFpbiRGMTEwCi0lMjgzMkY5VF9TRUdNRU5UODNpJDE4RkZGRkZGRkM4MSQxNDgxJDIxNAotJTA3IDggMTAgMTAKLQotZXhwbGFuYXRpb246Ci0lM0E2QzY0ODAwMDRFNTZGRkZDNEU3MTcwNjNCMEFFRkZGQzZEMDY1MkFFRkZGQzYwRjI0RTVFNEU3NQotIF4gXl4gXiAgICAgXi1kYXRhCi0gfCB8fCArLS0tLS0tIDQgY2hhciBpbnRlZ2VyIDB4ODAwMAotIHwgfCstLS0tLS0tLSBjaGVja3N1bQotIHwgKy0tLS0tLS0tLSB0eXBlIDYgKGRhdGEgcmVjb3JkKQotICstLS0tLS0tLS0tLSBsZW5ndGggM2EgY2hhcnMKLSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAzYSAoNTggY2hhcnMpIC0tLS0tLS0tLS0tLS0tLS0tLS0+Ci0KLSUxQjM3MDlUX1NFR01FTlQxMTA4RkZGRkZGRkYKLSAgICAgIF4gICAgICAgICBeXiBeLSA4IGNoYXJhY3RlciBpbnRlZ2VyIDB4ZmZmZmZmZmYKLSAgICAgIHwgICAgICAgICB8Ky0gICAxIGNoYXJhY3RlciBpbnRlZ2VyIDAKLSAgICAgIHwgICAgICAgICArLS0gICB0eXBlIDEgc3ltYm9sIChzZWN0aW9uIGRlZmluaXRpb24pCi0gICAgICArLS0tLS0tLS0tLS0tICAgOSBjaGFyIHN5bWJvbCBUX1NFR01FTlQKLQotJTJCM0FCOVRfU0VHTUVOVDdEZ2NjX2NvbXBpbGVkJDEwODdoZWxsbyRjMTAKLSUzNzM4MjlUX1NFR01FTlQ4MGludCR0MSRyMSQkMjE0NzQxMDgwY2hhciR0MiRyMiQwJDEyNzEwCi0lMzczNzY5VF9TRUdNRU5UODBsb25nJGludCR0MyRyMSQkMTA4MHVuc2lnbmVkJGludCR0NCQxMAotJTM3M0NBOVRfU0VHTUVOVDgwbG9uZyR1bnNpZ25lZCRpbjEwODBzaG9ydCRpbnQkdDYkcjEkMTAKLSUzNzMwNDlUX1NFR01FTlQ4MGxvbmckbG9uZyRpbnQkdDcxMDgwc2hvcnQkdW5zaWduZWQkaTEwCi0lMzczQTI5VF9TRUdNRU5UODBsb25nJGxvbmckdW5zaWduMTA4MHNpZ25lZCRjaGFyJHQxMCQxMAotJTM3M0Q2OVRfU0VHTUVOVDgwdW5zaWduZWQkY2hhciR0MTEwODBmbG9hdCR0MTIkcjEkNCQwMTAKLSUzNzNEMTlUX1NFR01FTlQ4MGRvdWJsZSR0MTMkcjEkOCQxMDgwbG9uZyRkb3VibGUkdDE0JDEwCi0lMjczNEQ5VF9TRUdNRU5UOEJ2b2lkJHQxNSQxNTEwMzVfbWFpbjEwCi0lMkYzQ0E5VF9TRUdNRU5UODEkMTA4MSQxNjgxJDFFODEkMjE0ODdtYWluJEYxMTAKLSUyODMyRjlUX1NFR01FTlQ4M2kkMThGRkZGRkZGQzgxJDE0ODEkMjE0Ci0lMDc4MTAxMAotCi1UdXJucyBpbnRvCi1zYWNAdGhlcHViJCAuL29iamR1bXAgLWR4IC1tIG02OGsgZgotCi1mOiAgICAgZmlsZSBmb3JtYXQgdGVraGV4Ci0tLS0tLXgtLS0gOS81NTcyOCAtMTM0MjE5NDE2IFNlcCAyOSAxNToxMyAxOTk1IGYKLWFyY2hpdGVjdHVyZTogVU5LTk9XTiEsIGZsYWdzIDB4MDAwMDAwMTA6Ci1IQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwCi1TRUNUSU9OIDAgW0QwMDAwMDAwMF0JOiBzaXplIDAwMDIwMDAwIHZtYSAwMDAwMDAwMCBhbGlnbiAyKiowCi0gQUxMT0MsIExPQUQKLVNFQ1RJT04gMSBbRDAwMDA4MDAwXQk6IHNpemUgMDAwMDIwMDEgdm1hIDAwMDA4MDAwIGFsaWduIDIqKjAKLQotU0VDVElPTiAyIFtUX1NFR01FTlRdCTogc2l6ZSBmZmZmZmZmZiB2bWEgMDAwMDAwMDAgYWxpZ24gMioqMAotCi1TWU1CT0wgVEFCTEU6Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgZ2NjX2NvbXBpbGVkJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGhlbGxvJGMKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBpbnQkdDEkcjEkJDIxNDc0Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgY2hhciR0MiRyMiQwJDEyNwotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckaW50JHQzJHIxJCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCB1bnNpZ25lZCRpbnQkdDQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyR1bnNpZ25lZCRpbgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHNob3J0JGludCR0NiRyMSQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGxvbmckaW50JHQ3Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgc2hvcnQkdW5zaWduZWQkaQotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckbG9uZyR1bnNpZ24KLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBzaWduZWQkY2hhciR0MTAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgdW5zaWduZWQkY2hhciR0MQotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGZsb2F0JHQxMiRyMSQ0JDAKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBkb3VibGUkdDEzJHIxJDgkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRkb3VibGUkdDE0JAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHZvaWQkdDE1JDE1Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgX21haW4KLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDEwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbWFpbiRGMQotZmNmZmZmZmYgIGcgICAgICAgVF9TRUdNRU5UIGkkMQotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDEwICBnICAgICAgIFRfU0VHTUVOVCAkCi0KLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbRDAwMDAwMDAwXTogKG5vbmUpCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgW0QwMDAwODAwMF06IChub25lKQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFtUX1NFR01FTlRdOiAobm9uZSkKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBEMDAwMDAwMDA6Ci0uLi4KLTAwMDA4MDAwICgkKyk3ZmYwIGxpbmt3IGZwLCMtNAotMDAwMDgwMDQgKCQrKTdmZjQgbm9wCi0wMDAwODAwNiAoJCspN2ZmNiBtb3ZlbCAjOTksZDAKLTAwMDA4MDA4ICgkKyk3ZmY4IGNtcGwgZnBAKC00KSxkMAotMDAwMDgwMGMgKCQrKTdmZmMgYmx0cyAwMDAwODAxNCAoJCspODAwNAotMDAwMDgwMGUgKCQrKTdmZmUgYWRkcWwgIzEsZnBAKC00KQotMDAwMDgwMTIgKCQrKTgwMDIgYnJhcyAwMDAwODAwNiAoJCspN2ZmNgotMDAwMDgwMTQgKCQrKTgwMDQgdW5sayBmcAotMDAwMDgwMTYgKCQrKTgwMDYgcnRzCi0uLi4KLQotKi8KLQotc3RhdGljIHZvaWQKLXRla2hleF9pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQgPSBmYWxzZTsKLSAgaW50IHZhbDsKLQotICBpZiAoaW5pdGVkID09IGZhbHNlKQotICAgIHsKLSAgICAgIGluaXRlZCA9IHRydWU7Ci0gICAgICBoZXhfaW5pdCAoKTsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQl7Ci0JICBzdW1fYmxvY2tbaSArICcwJ10gPSB2YWwrKzsKLQl9Ci0gICAgICBmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspCi0JewotCSAgc3VtX2Jsb2NrW2ldID0gdmFsKys7Ci0JfQotICAgICAgc3VtX2Jsb2NrWyckJ10gPSB2YWwrKzsKLSAgICAgIHN1bV9ibG9ja1snJSddID0gdmFsKys7Ci0gICAgICBzdW1fYmxvY2tbJy4nXSA9IHZhbCsrOwotICAgICAgc3VtX2Jsb2NrWydfJ10gPSB2YWwrKzsKLSAgICAgIGZvciAoaSA9ICdhJzsgaSA8PSAneic7IGkrKykKLQl7Ci0JICBzdW1fYmxvY2tbaV0gPSB2YWwrKzsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb24gYSBsaW5lIGlzIEZGICovCi0jZGVmaW5lIE1BWENIVU5LIDB4ZmYKLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgZml0IG9udG8gYSBsaW5lIG9uIG91dHB1dCAqLwotI2RlZmluZSBDSFVOSyAyMQotCi0vKiBXZSBjYW5ub3Qgb3V0cHV0IG91ciB0ZWtoZXhvcmRzIGFzIHdlIHNlZSB0aGVtLCB3ZSBoYXZlIHRvIGdsdWUgdGhlbQotICAgdG9nZXRoZXIsIHRoaXMgaXMgZG9uZSBpbiB0aGlzIHN0cnVjdHVyZSA6ICovCi0KLXN0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3N0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIHN0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3N0cnVjdCAqbmV4dDsKLQotfTsKLXR5cGVkZWYgc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0IHRla2hleF9kYXRhX2xpc3RfdHlwZTsKLQotI2RlZmluZSBDSFVOS19NQVNLIDB4MWZmZgotCi1zdHJ1Y3QgZGF0YV9zdHJ1Y3QKLSAgewotICAgIGNoYXIgY2h1bmtfZGF0YVtDSFVOS19NQVNLICsgMV07Ci0gICAgY2hhciBjaHVua19pbml0W0NIVU5LX01BU0sgKyAxXTsKLSAgICBiZmRfdm1hIHZtYTsKLSAgICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKm5leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHRla2hleF9kYXRhX3N0cnVjdAotewotICB0ZWtoZXhfZGF0YV9saXN0X3R5cGUgKmhlYWQ7Ci0gIHVuc2lnbmVkIGludCB0eXBlOwotICBzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7Ci0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZGF0YTsKLX0gdGRhdGFfdHlwZTsKLQotI2RlZmluZSBlbmRhKHgpICh4LT52bWEgKyB4LT5zaXplKQotCi1zdGF0aWMgYmZkX3ZtYQotZ2V0dmFsdWUgKHNyY3ApCi0gICAgIGNoYXIgKipzcmNwOwotewotICBjaGFyICpzcmMgPSAqc3JjcDsKLSAgYmZkX3ZtYSB2YWx1ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBsZW4gPSBoZXhfdmFsdWUoKnNyYysrKTsKLQotICBpZiAobGVuID09IDApCi0gICAgbGVuID0gMTY7Ci0gIHdoaWxlIChsZW4tLSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHZhbHVlIDw8IDQgfCBoZXhfdmFsdWUoKnNyYysrKTsKLSAgICB9Ci0gICpzcmNwID0gc3JjOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWdldHN5bSAoZHN0cCwgc3JjcCkKLSAgICAgY2hhciAqZHN0cDsKLSAgICAgY2hhciAqKnNyY3A7Ci17Ci0gIGNoYXIgKnNyYyA9ICpzcmNwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGxlbiA9IGhleF92YWx1ZSgqc3JjKyspOwotCi0gIGlmIChsZW4gPT0gMCkKLSAgICBsZW4gPSAxNjsKLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgIGRzdHBbaV0gPSBzcmNbaV07Ci0gIGRzdHBbaV0gPSAwOwotICAqc3JjcCA9IHNyYyArIGk7Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKgotZmluZF9jaHVuayAoYWJmZCwgdm1hKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdm1hOwotewotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLQotICB2bWEgJj0gfkNIVU5LX01BU0s7Ci0gIHdoaWxlIChkICYmIChkLT52bWEpICE9IHZtYSkKLSAgICB7Ci0gICAgICBkID0gZC0+bmV4dDsKLSAgICB9Ci0gIGlmICghZCkKLSAgICB7Ci0gICAgICBjaGFyICpzbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgMTIpOwotCi0gICAgICAvKiBObyBjaHVuayBmb3IgdGhpcyBhZGRyZXNzLCBzbyBtYWtlIG9uZSB1cCAqLwotICAgICAgZCA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikKLQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGRhdGFfc3RydWN0KSk7Ci0KLSAgICAgIGlmICghc25hbWUgfHwgIWQpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbXNldCAoZC0+Y2h1bmtfaW5pdCwgMCwgQ0hVTktfTUFTSyArIDEpOwotICAgICAgbWVtc2V0IChkLT5jaHVua19kYXRhLCAwLCBDSFVOS19NQVNLICsgMSk7Ci0gICAgICBkLT5uZXh0ID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGE7Ci0gICAgICBkLT52bWEgPSB2bWE7Ci0gICAgICBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YSA9IGQ7Ci0gICAgfQotICByZXR1cm4gZDsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9ieXRlIChhYmZkLCB2YWx1ZSwgYWRkcikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgLyogRmluZCB0aGUgY2h1bmsgdGhhdCB0aGlzIGJ5dGUgbmVlZHMgYW5kIHB1dCBpdCBpbiAqLwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSBmaW5kX2NodW5rIChhYmZkLCBhZGRyKTsKLQotICBkLT5jaHVua19kYXRhW2FkZHIgJiBDSFVOS19NQVNLXSA9IHZhbHVlOwotICBkLT5jaHVua19pbml0W2FkZHIgJiBDSFVOS19NQVNLXSA9IDE7Ci19Ci0KLS8qIFRoZSBmaXJzdCBwYXNzIGlzIHRvIGZpbmQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgc2VjdGlvbnMsIGFuZCBzZWUKLSAgaG93IGJpZyB0aGUgZGF0YSBpcyAqLwotc3RhdGljIHZvaWQKLWZpcnN0X3BoYXNlIChhYmZkLCB0eXBlLCBzcmMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKnNyYzsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBpbnQgbGVuOwotICBjaGFyIHN5bVsxN107CQkJLyogQSBzeW1ib2wgY2FuIG9ubHkgYmUgMTZjaGFycyBsb25nICovCi0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICc2JzoKLSAgICAgIC8qIERhdGEgcmVjb3JkIC0gcmVhZCBpdCBhbmQgc3RvcmUgaXQgKi8KLSAgICAgIHsKLQliZmRfdm1hIGFkZHIgPSBnZXR2YWx1ZSAoJnNyYyk7Ci0KLQl3aGlsZSAoKnNyYykKLQkgIHsKLQkgICAgaW5zZXJ0X2J5dGUgKGFiZmQsIEhFWCAoc3JjKSwgYWRkcik7Ci0JICAgIHNyYyArPSAyOwotCSAgICBhZGRyKys7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybjsKLSAgICBjYXNlICczJzoKLSAgICAgIC8qIFN5bWJvbCByZWNvcmQsIHJlYWQgdGhlIHNlZ21lbnQgKi8KLSAgICAgIGxlbiA9IGdldHN5bSAoc3ltLCAmc3JjKTsKLSAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3ltKTsKLSAgICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIGNoYXIgKm4gPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOwotCi0JICBpZiAoIW4pCi0JICAgIGFib3J0KCk7CQkvKiBGSVhNRSAqLwotCSAgbWVtY3B5IChuLCBzeW0sIGxlbiArIDEpOwotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG4pOwotCX0KLSAgICAgIHdoaWxlICgqc3JjKQotCXsKLQkgIHN3aXRjaCAoKnNyYykKLQkgICAgewotCSAgICBjYXNlICcxJzoJCS8qIHNlY3Rpb24gcmFuZ2UgKi8KLQkgICAgICBzcmMrKzsKLQkgICAgICBzZWN0aW9uLT52bWEgPSBnZXR2YWx1ZSAoJnNyYyk7Ci0JICAgICAgc2VjdGlvbi0+X3Jhd19zaXplID0gZ2V0dmFsdWUgKCZzcmMpIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICcwJzoKLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJzMnOgotCSAgICBjYXNlICc0JzoKLQkgICAgY2FzZSAnNic6Ci0JICAgIGNhc2UgJzcnOgotCSAgICBjYXNlICc4JzoKLQkgICAgICAvKiBTeW1ib2xzLCBhZGQgdG8gc2VjdGlvbiAqLwotCSAgICAgIHsKLQkJdGVraGV4X3N5bWJvbF90eXBlICpuZXcgPQotCQkodGVraGV4X3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgICAgIHNpemVvZiAodGVraGV4X3N5bWJvbF90eXBlKSk7Ci0JCWNoYXIgdHlwZSA9ICgqc3JjKTsKLQotCQlpZiAoIW5ldykKLQkJICBhYm9ydCgpOwkvKiBGSVhNRSAqLwotCQluZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQkJc3JjKys7Ci0JCWFiZmQtPnN5bWNvdW50Kys7Ci0JCWFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCQluZXctPnByZXYgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+c3ltYm9sczsKLQkJYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPnN5bWJvbHMgPSBuZXc7Ci0JCWxlbiA9IGdldHN5bSAoc3ltLCAmc3JjKTsKLQkJbmV3LT5zeW1ib2wubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0JCWlmICghbmV3LT5zeW1ib2wubmFtZSkKLQkJICBhYm9ydCgpOwkvKiBGSVhNRSAqLwotCQltZW1jcHkgKChjaGFyICopIChuZXctPnN5bWJvbC5uYW1lKSwgc3ltLCBsZW4gKyAxKTsKLQkJbmV3LT5zeW1ib2wuc2VjdGlvbiA9IHNlY3Rpb247Ci0JCWlmICh0eXBlIDw9ICc0JykKLQkJICBuZXctPnN5bWJvbC5mbGFncyA9IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7Ci0JCWVsc2UKLQkJICBuZXctPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkJbmV3LT5zeW1ib2wudmFsdWUgPSBnZXR2YWx1ZSAoJnNyYykgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogUGFzcyBvdmVyIGFuIHRla2hleCwgY2FsbGluZyBvbmUgb2YgdGhlIGFib3ZlIGZ1bmN0aW9ucyBvbiBlYWNoCi0gICByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFzc19vdmVyIChhYmZkLCBmdW5jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKLXsKLSAgdW5zaWduZWQgaW50IGNoYXJzX29uX2xpbmU7Ci0gIGJvb2xlYW4gZW9mID0gZmFsc2U7Ci0KLSAgLyogVG8gdGhlIGZyb250IG9mIHRoZSBmaWxlICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgd2hpbGUgKGVvZiA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZmZlcltNQVhDSFVOS107Ci0gICAgICBjaGFyICpzcmMgPSBidWZmZXI7Ci0gICAgICBjaGFyIHR5cGU7Ci0KLSAgICAgIC8qIEZpbmQgZmlyc3QgJyUnICovCi0gICAgICBlb2YgPSAoYm9vbGVhbikgKGJmZF9yZWFkIChzcmMsIDEsIDEsIGFiZmQpICE9IDEpOwotICAgICAgd2hpbGUgKCpzcmMgIT0gJyUnICYmICFlb2YpCi0JewotCSAgZW9mID0gKGJvb2xlYW4pIChiZmRfcmVhZCAoc3JjLCAxLCAxLCBhYmZkKSAhPSAxKTsKLQl9Ci0gICAgICBpZiAoZW9mKQotCWJyZWFrOwotICAgICAgc3JjKys7Ci0KLSAgICAgIC8qIEZldGNoIHRoZSB0eXBlIGFuZCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2hlY2tzdW0gKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoc3JjLCAxLCA1LCBhYmZkKSAhPSA1KQotCWFib3J0ICgpOyAvKiBGSVhNRSAqLwotCi0gICAgICB0eXBlID0gc3JjWzJdOwotCi0gICAgICBpZiAoIUlTSEVYIChzcmNbMF0pIHx8ICFJU0hFWCAoc3JjWzFdKSkKLQlicmVhazsKLQotICAgICAgY2hhcnNfb25fbGluZSA9IEhFWCAoc3JjKSAtIDU7CS8qIEFscmVhZHkgcmVhZCBmaXZlIGNoYXIgKi8KLQotICAgICAgaWYgKGJmZF9yZWFkIChzcmMsIDEsIGNoYXJzX29uX2xpbmUsIGFiZmQpICE9IGNoYXJzX29uX2xpbmUpCi0JYWJvcnQgKCk7IC8qIEZJWE1FICovCi0gICAgICBzcmNbY2hhcnNfb25fbGluZV0gPSAwOwkvKiBwdXQgYSBudWxsIGF0IHRoZSBlbmQgKi8KLQotICAgICAgZnVuYyAoYWJmZCwgdHlwZSwgc3JjKTsKLSAgICB9Ci0KLX0KLQotc3RhdGljIGxvbmcKLXRla2hleF9nZXRfc3ltdGFiIChhYmZkLCB0YWJsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqdGFibGU7Ci17Ci0gIHRla2hleF9zeW1ib2xfdHlwZSAqcCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5zeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgYyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gIHRhYmxlW2NdID0gMDsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFibGVbLS1jXSA9ICYocC0+c3ltYm9sKTsKLSAgICAgIHAgPSBwLT5wcmV2OwotICAgIH0KLQotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLXN0YXRpYyBsb25nCi10ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGFiZmQtPnN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChzdHJ1Y3QgdGVraGV4X2FzeW1ib2xfc3RydWN0ICopKTsKLQotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHRkYXRhX3R5cGUgKnRkYXRhID0gKHRkYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHRkYXRhX3R5cGUpKTsKLQotICBpZiAoIXRkYXRhKQotICAgIHJldHVybiBmYWxzZTsKLSAgYWJmZC0+dGRhdGEudGVraGV4X2RhdGEgPSB0ZGF0YTsKLSAgdGRhdGEtPnR5cGUgPSAxOwotICB0ZGF0YS0+aGVhZCA9ICh0ZWtoZXhfZGF0YV9saXN0X3R5cGUgKikgTlVMTDsKLSAgdGRhdGEtPnN5bWJvbHMgPSAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICopIE5VTEw7Ci0gIHRkYXRhLT5kYXRhID0gKHN0cnVjdCBkYXRhX3N0cnVjdCAqKSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgbG9va3MgbGlrZSBpdCdzIGluIFRla0hleCBmb3JtYXQuIEp1c3QgbG9vawotICBmb3IgYSBwZXJjZW50IHNpZ24gYW5kIHNvbWUgaGV4IGRpZ2l0cyAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10ZWtoZXhfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBiWzRdOwotCi0gIHRla2hleF9pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJbMF0gIT0gJyUnIHx8ICFJU0hFWCAoYlsxXSkgfHwgIUlTSEVYIChiWzJdKSB8fCAhSVNIRVggKGJbM10pKQotICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotCi0gIHRla2hleF9ta29iamVjdCAoYWJmZCk7Ci0KLSAgcGFzc19vdmVyIChhYmZkLCBmaXJzdF9waGFzZSk7Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgdm9pZAotbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQsIGdldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9ucDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGJvb2xlYW4gZ2V0OwotewotICBiZmRfdm1hIGFkZHI7Ci0gIGNoYXIgKmxvY2F0aW9uID0gKGNoYXIgKikgbG9jYXRpb25wOwotICBiZmRfdm1hIHByZXZfbnVtYmVyID0gMTsJLyogTm90aGluZyBjYW4gaGF2ZSB0aGlzIGFzIGEgaGlnaCBiaXQqLwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0KLSAgZm9yIChhZGRyID0gc2VjdGlvbi0+dm1hOyBjb3VudCAhPSAwOyBjb3VudC0tLCBhZGRyKyspCi0gICAgewotCi0gICAgICBiZmRfdm1hIGNodW5rX251bWJlciA9IGFkZHIgJiB+Q0hVTktfTUFTSzsJLyogR2V0IGhpZ2ggYml0cyBvZiBhZGRyZXNzICovCi0gICAgICBiZmRfdm1hIGxvd19iaXRzID0gYWRkciAmIENIVU5LX01BU0s7Ci0KLSAgICAgIGlmIChjaHVua19udW1iZXIgIT0gcHJldl9udW1iZXIpCi0JewotCSAgLyogRGlmZmVyZW50IGNodW5rLCBzbyBtb3ZlIHBvaW50ZXIgKi8KLQkgIGQgPSBmaW5kX2NodW5rIChhYmZkLCBjaHVua19udW1iZXIpOwotCX0KLQotICAgICAgaWYgKGdldCkKLQl7Ci0JICBpZiAoZC0+Y2h1bmtfaW5pdFtsb3dfYml0c10pCi0JICAgIHsKLQkgICAgICAqbG9jYXRpb24gPSBkLT5jaHVua19kYXRhW2xvd19iaXRzXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKmxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkLT5jaHVua19kYXRhW2xvd19iaXRzXSA9ICpsb2NhdGlvbjsKLQkgIGQtPmNodW5rX2luaXRbbG93X2JpdHNdID0gKCpsb2NhdGlvbiAhPSAwKTsKLQl9Ci0KLSAgICAgIGxvY2F0aW9uKys7Ci0KLSAgICB9Ci0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChzZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQsIHRydWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0vKiB3ZSBoYXZlIHRvIHNhdmUgdXAgYWxsIHRoZSBUZWtoZXhvcmRzIGZvciBhIHNwbHVyZ2UgYmVmb3JlIG91dHB1dCwKLSAgICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgYnl0ZXNfdG9fZG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgYnl0ZXNfdG9fZG87Ci17Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogVGhlIGZpcnN0IHRpbWUgYXJvdW5kLCBhbGxvY2F0ZSBlbm91Z2ggc2VjdGlvbnMgdG8gaG9sZCBhbGwgdGhlIGNodW5rcyAqLwotICAgICAgYXNlY3Rpb24gKnMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgIGJmZF92bWEgdm1hOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCi0JICAgIHsKLQkgICAgICBmb3IgKHZtYSA9IHMtPnZtYSAmIH5DSFVOS19NQVNLOwotCQkgICB2bWEgPCBzLT52bWEgKyBzLT5fcmF3X3NpemU7Ci0JCSAgIHZtYSArPSBDSFVOS19NQVNLKQotCQlmaW5kX2NodW5rIChhYmZkLCB2bWEpOwotCSAgICB9Ci0JfQotCi0gICAgfQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotICAgIHsKLSAgICAgIG1vdmVfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGJ5dGVzX3RvX2RvLCBmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdyaXRldmFsdWUgKGRzdCwgdmFsdWUpCi0gICAgIGNoYXIgKipkc3Q7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGNoYXIgKnAgPSAqZHN0OwotICBpbnQgbGVuOwotICBpbnQgc2hpZnQ7Ci0KLSAgZm9yIChsZW4gPSA4LCBzaGlmdCA9IDI4OyBzaGlmdDsgc2hpZnQgLT0gNCwgbGVuLS0pCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSA+PiBzaGlmdCkgJiAweGYpCi0JewotCSAgKnArKyA9IGxlbiArICcwJzsKLQkgIHdoaWxlIChsZW4pCi0JICAgIHsKLQkgICAgICAqcCsrID0gZGlnc1sodmFsdWUgPj4gc2hpZnQpICYgMHhmXTsKLQkgICAgICBzaGlmdCAtPSA0OwotCSAgICAgIGxlbi0tOwotCSAgICB9Ci0JICAqZHN0ID0gcDsKLQkgIHJldHVybjsKLQotCX0KLSAgICB9Ci0gICpwKysgPSAnMSc7Ci0gICpwKysgPSAnMCc7Ci0gICpkc3QgPSBwOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVzeW0gKGRzdCwgc3ltKQotICAgICBjaGFyICoqZHN0OwotICAgICBDT05TVCBjaGFyICpzeW07Ci17Ci0gIGNoYXIgKnAgPSAqZHN0OwotICBpbnQgbGVuID0gKHN5bSA/IHN0cmxlbiAoc3ltKSA6IDApOwotCi0gIGlmIChsZW4gPj0gMTYpCi0gICAgewotICAgICAgKnArKyA9ICcwJzsKLSAgICAgIGxlbiA9IDE2OwotICAgIH0KLQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxlbiA9PSAwKQotCXsKLQkgICpwKysgPSAnMSc7Ci0JICBzeW0gPSAiJCI7Ci0JICBsZW4gPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcCsrID0gZGlnc1tsZW5dOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKGxlbi0tKQotICAgIHsKLSAgICAgICpwKysgPSAqc3ltKys7Ci0gICAgfQotICAqZHN0ID0gcDsKLX0KLQotc3RhdGljIHZvaWQKLW91dCAoYWJmZCwgdHlwZSwgc3RhcnQsIGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqc3RhcnQ7Ci0gICAgIGNoYXIgKmVuZDsKLXsKLSAgaW50IHN1bSA9IDA7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgZnJvbnRbNl07Ci0gIGJmZF9zaXplX3R5cGUgd3JsZW47Ci0KLSAgZnJvbnRbMF0gPSAnJSc7Ci0gIFRPSEVYIChmcm9udCArIDEsIGVuZCAtIHN0YXJ0ICsgNSk7Ci0gIGZyb250WzNdID0gdHlwZTsKLQotICBmb3IgKHMgPSBzdGFydDsgcyA8IGVuZDsgcysrKQotICAgIHsKLSAgICAgIHN1bSArPSBzdW1fYmxvY2tbKHVuc2lnbmVkIGNoYXIpICpzXTsKLSAgICB9Ci0KLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbMV1dOwkvKiAgbGVuZ3RoICovCi0gIHN1bSArPSBzdW1fYmxvY2tbKHVuc2lnbmVkIGNoYXIpIGZyb250WzJdXTsKLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbM11dOwkvKiB0eXBlICovCi0gIFRPSEVYIChmcm9udCArIDQsIHN1bSk7Ci0gIGlmIChiZmRfd3JpdGUgKGZyb250LCAxLCA2LCBhYmZkKSAhPSA2KQotICAgIGFib3J0ICgpOwotICBlbmRbMF0gPSAnXG4nOwotICB3cmxlbiA9IGVuZCAtIHN0YXJ0ICsgMTsKLSAgaWYgKGJmZF93cml0ZSAoc3RhcnQsIDEsIHdybGVuLCBhYmZkKSAhPSB3cmxlbikKLSAgICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGJ5dGVzX3dyaXR0ZW47Ci0gIGNoYXIgYnVmZmVyWzEwMF07Ci0gIGFzeW1ib2wgKipwOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkOwotCi0gIHRla2hleF9pbml0ICgpOwotCi0gIGJ5dGVzX3dyaXR0ZW4gPSAwOwotCi0gIC8qIEFuZCB0aGUgcmF3IGRhdGEgKi8KLSAgZm9yIChkID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGE7Ci0gICAgICAgZCAhPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0gICAgICAgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaW50IGxvdzsKLQotICAgICAgQ09OU1QgaW50IHNwYW4gPSAzMjsKLSAgICAgIGludCBhZGRyOwotCi0gICAgICAvKiBXcml0ZSBpdCBpbiBibG9ja3Mgb2YgMzIgYnl0ZXMgKi8KLQotICAgICAgZm9yIChhZGRyID0gMDsgYWRkciA8IENIVU5LX01BU0sgKyAxOyBhZGRyICs9IHNwYW4pCi0JewotCSAgaW50IG5lZWQgPSAwOwotCi0JICAvKiBDaGVjayB0byBzZWUgaWYgbmVjZXNzYXJ5ICovCi0JICBmb3IgKGxvdyA9IDA7ICFuZWVkICYmIGxvdyA8IHNwYW47IGxvdysrKQotCSAgICB7Ci0JICAgICAgaWYgKGQtPmNodW5rX2luaXRbYWRkciArIGxvd10pCi0JCW5lZWQgPSAxOwotCSAgICB9Ci0JICBpZiAobmVlZCkKLQkgICAgewotCSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotCSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIGFkZHIgKyBkLT52bWEpOwotCSAgICAgIGZvciAobG93ID0gMDsgbG93IDwgc3BhbjsgbG93KyspCi0JCXsKLQkJICBUT0hFWCAoZHN0LCBkLT5jaHVua19kYXRhW2FkZHIgKyBsb3ddKTsKLQkJICBkc3QgKz0gMjsKLQkJfQotCSAgICAgIG91dCAoYWJmZCwgJzYnLCBidWZmZXIsIGRzdCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiB3cml0ZSBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycyBmb3IgdGhlIHNlY3Rpb25zICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyICpkc3QgPSBidWZmZXI7Ci0KLSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5uYW1lKTsKLSAgICAgICpkc3QrKyA9ICcxJzsKLSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIHMtPnZtYSk7Ci0gICAgICB3cml0ZXZhbHVlICgmZHN0LCBzLT52bWEgKyBzLT5fcmF3X3NpemUpOwotICAgICAgb3V0IChhYmZkLCAnMycsIGJ1ZmZlciwgZHN0KTsKLSAgICB9Ci0KLSAgLyogQW5kIHRoZSBzeW1ib2xzICovCi0gIGlmIChhYmZkLT5vdXRzeW1ib2xzKQotICAgIHsKLSAgICAgIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHM7ICpwOyBwKyspCi0JewotCSAgaW50IHNlY3Rpb25fY29kZSA9IGJmZF9kZWNvZGVfc3ltY2xhc3MgKCpwKTsKLQotCSAgaWYgKHNlY3Rpb25fY29kZSAhPSAnPycpCi0JICAgIHsJCQkvKiBkbyBub3QgaW5jbHVkZSBkZWJ1ZyBzeW1ib2xzICovCi0JICAgICAgYXN5bWJvbCAqcyA9ICpwOwotCSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotCSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5zZWN0aW9uLT5uYW1lKTsKLQotCSAgICAgIHN3aXRjaCAoc2VjdGlvbl9jb2RlKQotCQl7Ci0JCWNhc2UgJ0EnOgotCQkgICpkc3QrKyA9ICcyJzsKLQkJICBicmVhazsKLQkJY2FzZSAnYSc6Ci0JCSAgKmRzdCsrID0gJzYnOwotCQkgIGJyZWFrOwotCQljYXNlICdEJzoKLQkJY2FzZSAnQic6Ci0JCWNhc2UgJ08nOgotCQkgICpkc3QrKyA9ICc0JzsKLQkJICBicmVhazsKLQkJY2FzZSAnZCc6Ci0JCWNhc2UgJ2InOgotCQljYXNlICdvJzoKLQkJICAqZHN0KysgPSAnOCc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1QnOgotCQkgICpkc3QrKyA9ICczJzsKLQkJICBicmVhazsKLQkJY2FzZSAndCc6Ci0JCSAgKmRzdCsrID0gJzcnOwotCQkgIGJyZWFrOwotCQljYXNlICdDJzoKLQkJY2FzZSAnVSc6Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB3cml0ZXN5bSAoJmRzdCwgcy0+bmFtZSk7Ci0JICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgcy0+dmFsdWUgKyBzLT5zZWN0aW9uLT52bWEpOwotCSAgICAgIG91dCAoYWJmZCwgJzMnLCBidWZmZXIsIGRzdCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFuZCB0aGUgdGVybWluYXRvciAqLwotICBpZiAoYmZkX3dyaXRlICgiJTA3ODEwMTBcbiIsIDEsIDksIGFiZmQpICE9IDkpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci10ZWtoZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLQotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotdGVraGV4X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHRla2hleF9zeW1ib2xfdHlwZSAqbmV3ID0KLSAgKHRla2hleF9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCkpOwotCi0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmV3LT5wcmV2ID0gKHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqKSBOVUxMOwotICByZXR1cm4gJihuZXctPnN5bWJvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10ZWtoZXhfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotc3RhdGljIHZvaWQKLXRla2hleF9wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0JYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCWZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JCSBzZWN0aW9uX25hbWUsCi0JCSBzeW1ib2wtPm5hbWUpOwotICAgICAgfQotICAgIH0KLX0KLQotI2RlZmluZQl0ZWtoZXhfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHRla2hleF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgdGVraGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSB0ZWtoZXhfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSB0ZWtoZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHRla2hleF9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSB0ZWtoZXhfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSB0ZWtoZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSB0ZWtoZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgdGVraGV4X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgdGVraGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgdGVraGV4X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgdGVraGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHRla2hleF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLSNkZWZpbmUgdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCB0ZWtoZXhfdmVjID0KLXsKLSAgInRla2hleCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChFWEVDX1AgfAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX1NZTVMgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1JFTE9DIHwgSEFTX0xPQ0FMUyB8Ci0gICBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgdGVraGV4X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHRla2hleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHRla2hleCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3RyYWQtY29yZS5jIGIvYmZkL3RyYWQtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZmNjliLi4wMDAwMDAwCi0tLSBhL2JmZC90cmFkLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIHRyYWRpdGlvbmFsIFVuaXggY29yZSBmaWxlcyAoVS1hcmVhIGFuZCByYXcgc2VjdGlvbnMpCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgkJLyogQWZ0ZXIgYS5vdXQuaCAgKi8KLQotI2lmZGVmIFRSQURfSEVBREVSCi0jaW5jbHVkZSBUUkFEX0hFQURFUgotI2VuZGlmCi0KLSAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKLSAgICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgICAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICAgICAgc3RydWN0IHVzZXIgdTsKLSAgICB9OwotCi0jZGVmaW5lIGNvcmVfdXBhZ2UoYmZkKSAoJigoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUpKQotI2RlZmluZSBjb3JlX2RhdGFzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5kYXRhX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnJlZ19zZWN0aW9uKQotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICp0cmFkX3VuaXhfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jaGFyICoJCXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotaW50CQl0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbgkJdHJhZF91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBIYW5kbGUgNC4yLXN0eWxlIChhbmQgcGVyaGFwcyBhbHNvIHN5c1Ytc3R5bGUpIGNvcmUgZHVtcCBmaWxlLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotdHJhZF91bml4X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0KLXsKLSAgaW50IHZhbDsKLSAgc3RydWN0IHVzZXIgdTsKLSAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKnJhd3B0cjsKLQotI2lmZGVmIFRSQURfQ09SRV9VU0VSX09GRlNFVAotICAvKiBJZiBkZWZpbmVkLCB0aGlzIG1hY3JvIGlzIHRoZSBmaWxlIHBvc2l0aW9uIG9mIHRoZSB1c2VyIHN0cnVjdC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgVFJBRF9DT1JFX1VTRVJfT0ZGU0VULCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIAotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmdSwgMSwgc2l6ZW9mIHUsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiB1KQotICAgIHsKLSAgICAgIC8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHBlcmhhcHM/Pz8gKi8KLSAgaWYgKHUudV9kc2l6ZSA+IDB4MTAwMDAwMCkJLyogUmVtZW1iZXIsIGl0J3MgaW4gcGFnZXMuLi4gKi8KLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHUudV9zc2l6ZSA+IDB4MTAwMDAwMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBDaGVjayB0aGF0IHRoZSBzaXplIGNsYWltZWQgaXMgbm8gZ3JlYXRlciB0aGFuIHRoZSBmaWxlIHNpemUuICAqLwotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgICByZXR1cm4gMDsKLSAgICBpZiAoZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCXJldHVybiAwOwotICAgICAgfQotICAgIGlmICgodW5zaWduZWQgbG9uZykgKE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0JCQkJIC0gdS51X3RzaXplCi0jZW5kaWYKLQkJCQkgKyB1LnVfc3NpemUpKQotCT4gKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3Rfc2l6ZSkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCXJldHVybiAwOwotICAgICAgfQotI2lmbmRlZiBUUkFEX0NPUkVfQUxMT1dfQU5ZX0VYVFJBX1NJWkUKLSAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIChOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSArIHUudV9zc2l6ZSkKLSNpZmRlZiBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECi0JLyogU29tZSBzeXN0ZW1zIHdyaXRlIHRoZSBmaWxlIHRvbyBiaWcuICAqLwotCQkJICsgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAotI2VuZGlmCi0JCQkgKQotCTwgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3Rfc2l6ZSkKLSAgICAgIHsKLQkvKiBUaGUgZmlsZSBpcyB0b28gYmlnLiAgTWF5YmUgaXQncyBub3QgYSBjb3JlIGZpbGUKLQkgICBvciB3ZSBvdGhlcndpc2UgaGF2ZSBiYWQgdmFsdWVzIGZvciB1X2RzaXplIGFuZCB1X3NzaXplKS4gICovCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jZW5kaWYKLSAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJvdGggdGhlIHVwYWdlIGFuZCB0aGUgc3RydWN0IGNvcmVfZGF0YSBhdCBvbmNlLCBzbwotICAgICBhIHNpbmdsZSBmcmVlKCkgd2lsbCBmcmVlIHRoZW0gYm90aC4gICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfem1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YSA9IHJhd3B0cjsKLQotICByYXdwdHItPnUgPSB1OyAvKkNvcHkgdGhlIHVhcmVhIGludG8gdGhlIHRkYXRhIHBhcnQgb2YgdGhlIGJmZCAqLwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gZnJlZQotICAgICB0aGVtIHNlcGFyYXRlbHkuICAqLwotCi0gIGNvcmVfc3RhY2tzZWMoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9zdGFja3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX2RhdGFzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmFtZSA9ICIuc3RhY2siOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uYW1lID0gIi5kYXRhIjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9ICBOQlBHICogdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0gICAgLSBOQlBHICogdS51X3RzaXplCi0jZW5kaWYKLSAgICAgIDsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5CUEcgKiB1LnVfc3NpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gTkJQRyAqIFVQQUdFUzsgLyogTGFyZ2VyIHRoYW4gc2l6ZW9mIHN0cnVjdCB1ICovCi0KLSAgLyogV2hhdCBhIGhhY2suLi4gd2UnZCBsaWtlIHRvIHN0ZWFsIGl0IGZyb20gdGhlIGV4ZWMgZmlsZSwKLSAgICAgc2luY2UgdGhlIHVwYWdlIGRvZXMgbm90IHNlZW0gdG8gcHJvdmlkZSBpdC4gIEZJWE1FLiAgKi8KLSNpZmRlZiBIT1NUX0RBVEFfU1RBUlRfQUREUgotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBIT1NUX0RBVEFfU1RBUlRfQUREUjsKLSNlbHNlCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEhPU1RfVEVYVF9TVEFSVF9BRERSICsgKE5CUEcgKiB1LnVfdHNpemUpOwotI2VuZGlmCi0KLSNpZmRlZiBIT1NUX1NUQUNLX1NUQVJUX0FERFIKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IEhPU1RfU1RBQ0tfU1RBUlRfQUREUjsKLSNlbHNlCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1NUQUNLX0VORF9BRERSIC0gKE5CUEcgKiB1LnVfc3NpemUpOwotI2VuZGlmCi0KLSAgLyogVGhpcyBpcyB0cmlja3kuICBBcyB0aGUgInJlZ2lzdGVyIHNlY3Rpb24iLCB3ZSBnaXZlIHRoZW0gdGhlIGVudGlyZQotICAgICB1cGFnZSBhbmQgc3RhY2suICB1LnVfYXIwIHBvaW50cyB0byB3aGVyZSAicmVnaXN0ZXIgMCIgaXMgc3RvcmVkLgotICAgICBUaGVyZSBhcmUgdHdvIHRyaWNrcyB3aXRoIHRoaXMsIHRob3VnaC4gIE9uZSBpcyB0aGF0IHRoZSByZXN0IG9mIHRoZQotICAgICByZWdpc3RlcnMgbWlnaHQgYmUgYXQgcG9zaXRpdmUgb3IgbmVnYXRpdmUgKG9yIGJvdGgpIGRpc3BsYWNlbWVudHMKLSAgICAgZnJvbSAqdV9hcjAuICBUaGUgb3RoZXIgaXMgdGhhdCB1X2FyMCBpcyBzb21ldGltZXMgYW4gYWJzb2x1dGUgYWRkcmVzcwotICAgICBpbiBrZXJuZWwgbWVtb3J5LCBhbmQgb24gb3RoZXIgc3lzdGVtcyBpdCBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBgc3RydWN0IHVzZXInLgotICAgICAKLSAgICAgQXMgYSBwcmFjdGljYWwgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSByZWdpc3RlcnMgYWN0dWFsbHkgYXJlLAotICAgICBzbyB3ZSBoYXZlIHRvIHBhc3MgdGhlIHdob2xlIGFyZWEgdG8gR0RCLiAgV2UgZW5jb2RlIHRoZSB2YWx1ZSBvZiB1X2FyMAotICAgICBieSBzZXR0aW5nIHRoZSAucmVncyBzZWN0aW9uIHVwIHNvIHRoYXQgaXRzIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MKLSAgICAgMCBpcyBhdCB0aGUgcGxhY2UgcG9pbnRlZCB0byBieSB1X2FyMCAoYnkgc2V0dGluZyB0aGUgdm1hIG9mIHRoZSBzdGFydAotICAgICBvZiB0aGUgc2VjdGlvbiB0byAtdV9hcjApLiAgR0RCIHVzZXMgdGhpcyBpbmZvIHRvIGxvY2F0ZSB0aGUgcmVncywKLSAgICAgdXNpbmcgbWlub3IgdHJpY2tlcnkgdG8gZ2V0IGFyb3VuZCB0aGUgb2Zmc2V0LW9yLWFic29sdXRlLWFkZHIgcHJvYmxlbS4gKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwIC0gKGJmZF92bWEpIHUudV9hcjA7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5CUEcgKiBVUEFHRVM7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5maWxlcG9zID0gKE5CUEcgKiBVUEFHRVMpICsgTkJQRyAqIHUudV9kc2l6ZQotI2lmZGVmIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQotICAgIC0gTkJQRyAqIHUudV90c2l6ZQotI2VuZGlmCi0gICAgICA7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IDA7IC8qIFJlZ2lzdGVyIHNlZ21lbnQgaXMgdGhlIHVwYWdlICovCi0KLSAgLyogQWxpZ24gdG8gd29yZCBhdCBsZWFzdCAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9zdGFja3NlYyAoYWJmZCk7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9kYXRhc2VjIChhYmZkKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWNoYXIgKgotdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZm5kZWYgTk9fQ09SRV9DT01NQU5ECi0gIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTAotICByZXR1cm4gVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChpZ25vcmVfYWJmZCk7Ci0jZWxzZQotICByZXR1cm4gLTE7CQkvKiBGSVhNRSwgd2hlcmUgaXMgaXQ/ICovCi0jZW5kaWYKLX0KLQotLyogQVJHU1VTRUQgKi8KLWJvb2xlYW4KLXRyYWRfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpleGVjX2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IHRyYWRfY29yZV92ZWMgPQotICB7Ci0gICAgInRyYWQtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIHRyYWRfdW5peF9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHRyYWRfdW5peCksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvdmF4bmV0YnNkLmMgYi9iZmQvdmF4bmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzdkMDkuLjAwMDAwMDAKLS0tIGEvYmZkL3ZheG5ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvVkFYIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF92YXgKLSNkZWZpbmUJREVGQVVMVF9NSUQgCU1fVkFYX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQodmF4bmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXZheC1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC92ZXJzYWRvcy5jIGIvYmZkL3ZlcnNhZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjRmODguLjAwMDAwMDAKLS0tIGEvYmZkL3ZlcnNhZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBWRVJTQWRvcy1FIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgPHNhY0BjeWdudXMuY29tPi4KLQotICAgVmVyc2Fkb3MgaXMgYSBNb3Rvcm9sYSB0cmFkZW1hcmsuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgIFNVQlNFQ1RJT04KLSAgIFZFUlNBZG9zLUUgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlIGZvcm1hdAotCi0gICBERVNDUklQVElPTgotCi0gICBUaGlzIG1vZHVsZSBzdXBwb3J0cyByZWFkaW5nIG9mIFZFUlNBZG9zIHJlbG9jYXRlYWJsZQotICAgb2JqZWN0IGZpbGVzLgotCi0gICBBIFZFUlNBZG9zIGZpbGUgbG9va3MgbGlrZSBjb250YWlucwotCi0gICBvIEluZGVudGlmaWNhdGlvbiBSZWNvcmQKLSAgIG8gRXh0ZXJuYWwgU3ltYm9sIERlZmluaXRpb24gUmVjb3JkCi0gICBvIE9iamVjdCBUZXh0IFJlY3JvZAotICAgbyBFbmQgUmVjb3JkCi0KLQotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotCi1zdGF0aWMgYm9vbGVhbiB2ZXJzYWRvc19ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdmVyc2Fkb3Nfc2NhbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnZlcnNhZG9zX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLQotI2RlZmluZSBWSEVBREVSICcxJwotI2RlZmluZSBWRVNUREVGICcyJwotI2RlZmluZSBWT1RSICczJwotI2RlZmluZSBWRU5EICc0JwotCi0KLSNkZWZpbmUgRVNfQkFTRSAxNwkJLyogZmlyc3Qgc3ltYm9sIGhhcyBlc2RpZCAxNyAqLwotCi0vKiBQZXIgZmlsZSB0YXJnZXQgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0KLS8qIG9uZSBmb3IgZWFjaCBzZWN0aW9uICovCi1zdHJ1Y3QgZXNkaWQKLSAgewotICAgIGFzZWN0aW9uICpzZWN0aW9uOwkJLyogcHRyIHRvIGJmZCB2ZXJzaW9uICovCi0gICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7CS8qIHVzZWQgdG8gYnVpbGQgaW1hZ2UgKi8KLSAgICBpbnQgcGM7Ci0gICAgaW50IHJlbG9jczsJCQkvKiByZWxvYyBjb3VudCwgdmFsaWQgZW5kIG9mIHBhc3MgMSAqLwotICAgIGludCBkb25lcmVsOwkJLyogaGF2ZSByZWxvY3MgYmVlbiB0cmFuc2xhdGVkICovCi0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBpbnQgZXNfZG9uZTsJCS8qIGNvdW50IG9mIHN5bWJvbCBpbmRleCwgc3RhcnRzIGF0IEVTX0JBU0UgKi8KLSAgICBhc3ltYm9sICpzeW1ib2xzOwkJLyogcG9pbnRlciB0byBsb2NhbCBzeW1ib2xzICovCi0gICAgY2hhciAqc3RyaW5nczsJCS8qIHN0cmluZ3Mgb2YgYWxsIHRoZSBhYm92ZSAqLwotICAgIGludCBzdHJpbmdsZW47CQkvKiBsZW4gb2Ygc3RyaW5nIHRhYmxlICh2YWxpZCBlbmQgb2YgcGFzczEpICovCi0gICAgaW50IG5zZWNzeW1zOwkJLyogbnVtYmVyIG9mIHNlY3Rpb25zICovCi0KLSAgICBpbnQgbmRlZnM7CQkJLyogbnVtYmVyIG9mIGV4cG9ydGVkIHN5bWJvbHMgKHRoZXkgZG9udCBnZXQgZXNkaWRzKSAqLwotICAgIGludCBucmVmczsJCQkvKiBudW1iZXIgb2YgaW1wb3J0ZWQgc3ltYm9scyAgKHZhbGlkIGVuZCBvZiBwYXNzMSkgKi8KLQotICAgIGludCByZWZfaWR4OwkJLyogY3VycmVudCBwcm9jZXNzZWQgdmFsdWUgb2YgdGhlIGFib3ZlICovCi0gICAgaW50IGRlZl9pZHg7Ci0KLSAgICBpbnQgcGFzc18yX2RvbmU7Ci0KLSAgICBzdHJ1Y3QgZXNkaWQgZVsxNl07CQkvKiBwZXIgc2VjdGlvbiBpbmZvICovCi0gICAgaW50IGFsZXJ0OwkJCS8qIHRvIHNlZSBpZiB3ZSdyZSB0cmFtcGxpbmcgKi8KLSAgICBhc3ltYm9sICpyZXN0WzI1NiAtIDE2XTsJLyogcGVyIHN5bWJvbCBpbmZvICovCi0KLSAgfQotdGRhdGFfdHlwZTsKLQotI2RlZmluZSBWREFUQShhYmZkKSAgICAgICAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YSkKLSNkZWZpbmUgRURBVEEoYWJmZCwgbikgICAgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEtPmVbbl0pCi0jZGVmaW5lIFJEQVRBKGFiZmQsIG4pICAgIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhLT5yZXN0W25dKQotCi1zdHJ1Y3QgZXh0X290cgotICB7Ci0gICAgdW5zaWduZWQgY2hhciBzaXplOwotICAgIGNoYXIgdHlwZTsKLSAgICB1bnNpZ25lZCBjaGFyIG1hcFs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGVzZGlkOwotICAgIHVuc2lnbmVkIGNoYXIgZGF0YVsyMDBdOwotICB9OwotCi1zdHJ1Y3QgZXh0X3ZoZWFkZXIKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgICBjaGFyIHR5cGU7CQkJLyogcmVjb3JkIHR5cGUgKi8KLSAgICBjaGFyIG5hbWVbMTBdOwkJLyogbW9kdWxlIG5hbWUgKi8KLSAgICBjaGFyIHJldjsJCQkvKiBtb2R1bGUgcmV2IG51bWJlciAqLwotICAgIGNoYXIgbGFuZzsKLSAgICBjaGFyIHZvbFs0XTsKLSAgICBjaGFyIHVzZXJbMl07Ci0gICAgY2hhciBjYXRbOF07Ci0gICAgY2hhciBmbmFtZVs4XTsKLSAgICBjaGFyIGV4dFsyXTsKLSAgICBjaGFyIHRpbWVbM107Ci0gICAgY2hhciBkYXRlWzNdOwotICAgIGNoYXIgcmVzdFsyMTFdOwotICB9OwotCi1zdHJ1Y3QgZXh0X2VzZAotICB7Ci0gICAgdW5zaWduZWQgY2hhciBzaXplOwotICAgIGNoYXIgdHlwZTsKLSAgICB1bnNpZ25lZCBjaGFyIGVzZF9lbnRyaWVzWzFdOwotICB9OwotI2RlZmluZSBFU0RfQUJTIAkwCi0jZGVmaW5lIEVTRF9DT01NT04gCTEKLSNkZWZpbmUgRVNEX1NURF9SRUxfU0VDIDIKLSNkZWZpbmUgRVNEX1NIUlRfUkVMX1NFQyAzCi0jZGVmaW5lIEVTRF9YREVGX0lOX1NFQyA0Ci0jZGVmaW5lIEVTRF9YUkVGX1NZTSAgICA3Ci0jZGVmaW5lIEVTRF9YUkVGX1NFQwk2Ci0jZGVmaW5lIEVTRF9YREVGX0lOX0FCUyA1Ci11bmlvbiBleHRfYW55Ci0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gICAgc3RydWN0IGV4dF92aGVhZGVyIGhlYWRlcjsKLSAgICBzdHJ1Y3QgZXh0X2VzZCBlc2Q7Ci0gICAgc3RydWN0IGV4dF9vdHIgb3RyOwotICB9OwotCi0vKiBJbml0aWFsaXplIGJ5IGZpbGxpbmcgaW4gdGhlIGhleCBjb252ZXJzaW9uIGFycmF5LiAqLwotCi0KLQotCi0KLS8qIFNldCB1cCB0aGUgdGRhdGEgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3NfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB0ZGF0YV90eXBlICp0ZGF0YSA9ICh0ZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICh0ZGF0YV90eXBlKSk7Ci0gICAgICBpZiAodGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+c3ltYm9scyA9IE5VTEw7Ci0gICAgICBWREFUQSAoYWJmZCktPmFsZXJ0ID0gMHgxMjM0NTY3ODsKLSAgICB9Ci0KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlcG9ydCBhIHByb2JsZW0gaW4gYW4gUyByZWNvcmQgZmlsZS4gIEZJWE1FOiBUaGlzIHByb2JhYmx5IHNob3VsZAotICAgbm90IGNhbGwgZnByaW50ZiwgYnV0IHdlIHJlYWxseSBkbyBuZWVkIHNvbWUgbWVjaGFuaXNtIGZvciBwcmludGluZwotICAgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0KLQotc3RhdGljIGFzeW1ib2wgKgotdmVyc2Fkb3NfbmV3X3N5bWJvbCAoYWJmZCwgc251bSwgbmFtZSwgdmFsLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHNudW07Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBhc3ltYm9sICpuID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzICsgc251bTsKLSAgbi0+bmFtZSA9IG5hbWU7Ci0gIG4tPnZhbHVlID0gdmFsOwotICBuLT5zZWN0aW9uID0gc2VjOwotICBuLT50aGVfYmZkID0gYWJmZDsKLSAgbi0+ZmxhZ3MgPSAwOwotICByZXR1cm4gbjsKLX0KLQotCi1zdGF0aWMgaW50Ci1nZXRfcmVjb3JkIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5pb24gZXh0X2FueSAqcHRyOwotewotICBiZmRfcmVhZCAoJnB0ci0+c2l6ZSwgMSwgMSwgYWJmZCk7Ci0gIGlmIChiZmRfcmVhZCAoKGNoYXIgKikgcHRyICsgMSwgMSwgcHRyLT5zaXplLCBhYmZkKSAhPSBwdHItPnNpemUpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLWdldF80IChwcCkKLSAgICAgdW5zaWduZWQgY2hhciAqKnBwOwotewotICB1bnNpZ25lZCBjaGFyICpwID0gKnBwOwotICAqcHAgKz0gNDsKLSAgcmV0dXJuIChwWzBdIDw8IDI0KSB8IChwWzFdIDw8IDE2KSB8IChwWzJdIDw8IDgpIHwgKHBbM10gPDwgMCk7Ci19Ci0KLXZvaWQKLWdldF8xMCAocHAsIG5hbWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKipwcDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqcCA9IChjaGFyICopICpwcDsKLSAgaW50IGxlbiA9IDEwOwotICAqcHAgKz0gbGVuOwotICB3aGlsZSAoKnAgIT0gJyAnCi0JICYmIGxlbikKLSAgICB7Ci0gICAgICAqbmFtZSsrID0gKnArKzsKLSAgICAgIGxlbi0tOwotICAgIH0KLSAgKm5hbWUgPSAwOwotfQotCi1zdGF0aWMgY2hhciAqCi1uZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBjaGFyICpuID0gVkRBVEEgKGFiZmQpLT5zdHJpbmdzOwotICBzdHJjcHkgKFZEQVRBIChhYmZkKS0+c3RyaW5ncywgbmFtZSk7Ci0gIFZEQVRBIChhYmZkKS0+c3RyaW5ncyArPSBzdHJsZW4gKFZEQVRBIChhYmZkKS0+c3RyaW5ncykgKyAxOwotICByZXR1cm4gbjsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19lc2QgKGFiZmQsIGVzZCwgcGFzcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0X2VzZCAqZXNkOwotICAgICBpbnQgcGFzczsKLXsKLSAgLyogUmVhZCB0aHJvdWdoIHRoZSBleHQgZGVmIGZvciB0aGUgZXN0IGVudHJpZXMgKi8KLSAgaW50IHRvZ28gPSBlc2QtPnNpemUgLSAyOwotICBiZmRfdm1hIHNpemU7Ci0gIGJmZF92bWEgc3RhcnQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGNoYXIgbmFtZVsxMV07Ci0gIHVuc2lnbmVkIGNoYXIgKnB0ciA9IGVzZC0+ZXNkX2VudHJpZXM7Ci0gIHVuc2lnbmVkIGNoYXIgKmVuZCA9IHB0ciArIHRvZ287Ci0gIHdoaWxlIChwdHIgPCBlbmQpCi0gICAgewotICAgICAgaW50IHNjbiA9ICpwdHIgJiAweGY7Ci0gICAgICBpbnQgdHlwID0gKCpwdHIgPj4gNCkgJiAweGY7Ci0KLSAgICAgIC8qIERlY2xhcmUgdGhpcyBzZWN0aW9uICovCi0gICAgICBzcHJpbnRmIChuYW1lLCAiJWQiLCBzY24pOwotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBzdHJkdXAgKG5hbWUpKTsKLSAgICAgIHNlYy0+dGFyZ2V0X2luZGV4ID0gc2NuOwotICAgICAgRURBVEEgKGFiZmQsIHNjbikuc2VjdGlvbiA9IHNlYzsKLSAgICAgIHB0cisrOwotICAgICAgc3dpdGNoICh0eXApCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIEVTRF9YUkVGX1NFQzoKLQljYXNlIEVTRF9YUkVGX1NZTToKLQkgIHsKLQkgICAgaW50IHNudW0gPSBWREFUQSAoYWJmZCktPnJlZl9pZHgrKzsKLQkgICAgZ2V0XzEwICgmcHRyLCBuYW1lKTsKLQkgICAgaWYgKHBhc3MgPT0gMSkKLQkgICAgICB7Ci0JCVZEQVRBIChhYmZkKS0+c3RyaW5nbGVuICs9IHN0cmxlbiAobmFtZSkgKyAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IGVzaWR4OwotCQlhc3ltYm9sICpzOwotCQljaGFyICpuID0gbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIG5hbWUpOwotCQlzID0gdmVyc2Fkb3NfbmV3X3N5bWJvbCAoYWJmZCwgc251bSwgbiwgMCwKLQkJCQkJICZiZmRfdW5kX3NlY3Rpb24sIHNjbik7Ci0JCWVzaWR4ID0gVkRBVEEgKGFiZmQpLT5lc19kb25lKys7Ci0JCVJEQVRBIChhYmZkLCBlc2lkeCAtIEVTX0JBU0UpID0gczsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCi0JY2FzZSBFU0RfQUJTOgotCSAgc2l6ZSA9IGdldF80ICgmcHRyKTsKLQkgIHN0YXJ0ID0gZ2V0XzQgKCZwdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBFU0RfU1REX1JFTF9TRUM6Ci0JY2FzZSBFU0RfU0hSVF9SRUxfU0VDOgotCSAgewotCSAgICBzZWMtPl9yYXdfc2l6ZSA9IGdldF80ICgmcHRyKTsKLQkgICAgc2VjLT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIEVTRF9YREVGX0lOX0FCUzoKLQkgIHNlYyA9IChhc2VjdGlvbiAqKSAmIGJmZF9hYnNfc2VjdGlvbjsKLQljYXNlIEVTRF9YREVGX0lOX1NFQzoKLQkgIHsKLQkgICAgaW50IHNudW0gPSBWREFUQSAoYWJmZCktPmRlZl9pZHgrKzsKLQkgICAgbG9uZyB2YWw7Ci0JICAgIGdldF8xMCAoJnB0ciwgbmFtZSk7Ci0JICAgIHZhbCA9IGdldF80ICgmcHRyKTsKLQkgICAgaWYgKHBhc3MgPT0gMSkKLQkgICAgICB7Ci0JCS8qIEp1c3QgcmVtZW1iZXIgdGhlIHN5bWJvbCAqLwotCQlWREFUQSAoYWJmZCktPnN0cmluZ2xlbiArPSBzdHJsZW4gKG5hbWUpICsgMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWFzeW1ib2wgKnM7Ci0JCWNoYXIgKm4gPSBuZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgbmFtZSk7Ci0JCXMgPSB2ZXJzYWRvc19uZXdfc3ltYm9sIChhYmZkLCBzbnVtICsgVkRBVEEgKGFiZmQpLT5ucmVmcywgbiwgdmFsLCBzZWMsIHNjbik7Ci0JCXMtPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotI2RlZmluZSBSX1JFTFdPUkQgMQotI2RlZmluZSBSX1JFTExPTkcgMgotI2RlZmluZSBSX1JFTFdPUkRfTkVHIDMKLSNkZWZpbmUgUl9SRUxMT05HX05FRyA0Ci0KLXJlbG9jX2hvd3RvX3R5cGUgdmVyc2Fkb3NfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1JFTFdPUkQsIDAsIDEsIDE2LCBmYWxzZSwKLQkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkgIit2MTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTExPTkcsIDAsIDIsIDMyLCBmYWxzZSwKLQkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkgIit2MzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgSE9XVE8gKFJfUkVMV09SRF9ORUcsIDAsIC0xLCAxNiwgZmFsc2UsCi0JIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JICItdjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9SRUxMT05HX05FRywgMCwgLTIsIDMyLCBmYWxzZSwKLQkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkgIi12MzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0KLXN0YXRpYyBpbnQKLWdldF9vZmZzZXQgKGxlbiwgcHRyKQotICAgICBpbnQgbGVuOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIGludCB2YWwgPSAwOwotICBpZiAobGVuKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgdmFsID0gKnB0cisrOwotICAgICAgaWYgKHZhbCAmIDB4ODApCi0JdmFsIHw9IH4weGZmOwotICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKQotCXZhbCA9ICh2YWwgPDwgOCkgfCAqcHRyKys7Ci0gICAgfQotCi0gIHJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX290ciAoYWJmZCwgb3RyLCBwYXNzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRfb3RyICpvdHI7Ci0gICAgIGludCBwYXNzOwotewotICB1bnNpZ25lZCBsb25nIHNoaWZ0OwotICB1bnNpZ25lZCBjaGFyICpzcmNwID0gb3RyLT5kYXRhOwotICB1bnNpZ25lZCBjaGFyICplbmRwID0gKHVuc2lnbmVkIGNoYXIgKikgb3RyICsgb3RyLT5zaXplOwotICB1bnNpZ25lZCBpbnQgYml0cyA9IChvdHItPm1hcFswXSA8PCAyNCkKLSAgfCAob3RyLT5tYXBbMV0gPDwgMTYpCi0gIHwgKG90ci0+bWFwWzJdIDw8IDgpCi0gIHwgKG90ci0+bWFwWzNdIDw8IDApOwotCi0gIHN0cnVjdCBlc2RpZCAqZXNkaWQgPSAmRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKTsKLSAgdW5zaWduZWQgY2hhciAqY29udGVudHMgPSBlc2RpZC0+Y29udGVudHM7Ci0gIGludCBuZWVkX2NvbnRlbnRzID0gMDsKLSAgdW5zaWduZWQgaW50IGRzdF9pZHggPSBlc2RpZC0+cGM7Ci0KLSAgZm9yIChzaGlmdCA9ICgxIDw8IDMxKTsgc2hpZnQgJiYgc3JjcCA8IGVuZHA7IHNoaWZ0ID4+PSAxKQotICAgIHsKLSAgICAgIGlmIChiaXRzICYgc2hpZnQpCi0JewotCSAgaW50IGZsYWcgPSAqc3JjcCsrOwotCSAgaW50IGVzZGlkcyA9IChmbGFnID4+IDUpICYgMHg3OwotCSAgaW50IHNpemVpbndvcmRzID0gKChmbGFnID4+IDMpICYgMSkgPyAyIDogMTsKLQkgIGludCBvZmZzZXRsZW4gPSBmbGFnICYgMHg3OwotCSAgaW50IGo7Ci0KLQotCSAgaWYgKGVzZGlkcyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQSB6ZXJvIGVzZGlkIG1lYW5zIHRoZSBuZXcgcGMgaXMgdGhlIG9mZnNldCBnaXZlbiAqLwotCSAgICAgIGRzdF9pZHggKz0gZ2V0X29mZnNldCAob2Zmc2V0bGVuLCBzcmNwKTsKLQkgICAgICBzcmNwICs9IG9mZnNldGxlbjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IHZhbCA9IGdldF9vZmZzZXQgKG9mZnNldGxlbiwgc3JjcCArIGVzZGlkcyk7Ci0JICAgICAgaWYgKHBhc3MgPT0gMSkKLQkJbmVlZF9jb250ZW50cyA9IDE7Ci0JICAgICAgZWxzZQotCQlmb3IgKGogPSAwOyBqIDwgc2l6ZWlud29yZHMgKiAyOyBqKyspCi0JCSAgewotCQkgICAgY29udGVudHNbZHN0X2lkeCArIChzaXplaW53b3JkcyAqIDIpIC0gaiAtIDFdID0gdmFsOwotCQkgICAgdmFsID4+PSA4OwotCQkgIH0KLQotCSAgICAgIGZvciAoaiA9IDA7IGogPCBlc2RpZHM7IGorKykKLQkJewotCQkgIGludCBlc2RpZCA9ICpzcmNwKys7Ci0KLQkJICBpZiAoZXNkaWQpCi0JCSAgICB7Ci0JCSAgICAgIGludCBybiA9IEVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSkucmVsb2NzKys7Ci0JCSAgICAgIGlmIChwYXNzID09IDEpCi0JCQl7Ci0JCQkgIC8qIHRoaXMgaXMgdGhlIGZpcnN0IHBhc3Mgb3ZlciB0aGUgZGF0YSwgCi0JCQkgICAgIGp1c3QgcmVtZW1iZXIgdGhhdCB3ZSBuZWVkIGEgcmVsb2MgKi8KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhcmVsZW50ICpuID0KLQkJCSAgRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKS5zZWN0aW9uLT5yZWxvY2F0aW9uICsgcm47Ci0JCQkgIG4tPmFkZHJlc3MgPSBkc3RfaWR4OwotCi0JCQkgIG4tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIGVzZGlkOwotCQkJICBuLT5hZGRlbmQgPSAwOwotCQkJICBuLT5ob3d0byA9IHZlcnNhZG9zX2hvd3RvX3RhYmxlICsgKChqICYgMSkgKiAyKSArIChzaXplaW53b3JkcyAtIDEpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgc3JjcCArPSBvZmZzZXRsZW47Ci0JICAgICAgZHN0X2lkeCArPSBzaXplaW53b3JkcyAqIDI7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmVlZF9jb250ZW50cyA9IDE7Ci0JICBpZiAoZHN0X2lkeCA8IGVzZGlkLT5zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgIGlmIChwYXNzID09IDIpCi0JICAgICAgewotCQkvKiBhYnNvbHV0ZSBjb2RlLCBjb21lcyBpbiAxNiBiaXQgbHVtcHMgKi8KLQkJY29udGVudHNbZHN0X2lkeF0gPSBzcmNwWzBdOwotCQljb250ZW50c1tkc3RfaWR4ICsgMV0gPSBzcmNwWzFdOwotCSAgICAgIH0KLQkgIGRzdF9pZHggKz0gMjsKLQkgIHNyY3AgKz0gMjsKLQl9Ci0gICAgfQotICBFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpLnBjID0gZHN0X2lkeDsKLQotICBpZiAoIWNvbnRlbnRzICYmIG5lZWRfY29udGVudHMpCi0gICAgZXNkaWQtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBlc2RpZC0+c2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCi19Ci0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19zY2FuIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBsb29wID0gMTsKLSAgaW50IGk7Ci0gIGludCBqOwotICBpbnQgbnNlY3MgPSAwOwotCi0gIFZEQVRBIChhYmZkKS0+bnJlZnMgPSAwOwotICBWREFUQSAoYWJmZCktPm5kZWZzID0gMDsKLSAgVkRBVEEgKGFiZmQpLT5yZWZfaWR4ID0gMDsKLSAgVkRBVEEgKGFiZmQpLT5kZWZfaWR4ID0gMDsKLQotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICB1bmlvbiBleHRfYW55IGFueTsKLSAgICAgIGlmICghZ2V0X3JlY29yZCAoYWJmZCwgJmFueSkpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBzd2l0Y2ggKGFueS5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBWSEVBREVSOgotCSAgYnJlYWs7Ci0JY2FzZSBWRU5EOgotCSAgbG9vcCA9IDA7Ci0JICBicmVhazsKLQljYXNlIFZFU1RERUY6Ci0JICBwcm9jZXNzX2VzZCAoYWJmZCwgJmFueS5lc2QsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSBWT1RSOgotCSAgcHJvY2Vzc19vdHIgKGFiZmQsICZhbnkub3RyLCAxKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmVsb2NzIGFuZCBzZWN0aW9ucyAqLwotCi0gIFZEQVRBIChhYmZkKS0+bnJlZnMgPSBWREFUQSAoYWJmZCktPnJlZl9pZHg7Ci0gIFZEQVRBIChhYmZkKS0+bmRlZnMgPSBWREFUQSAoYWJmZCktPmRlZl9pZHg7Ci0gIFZEQVRBIChhYmZkKS0+cmVmX2lkeCA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+ZGVmX2lkeCA9IDA7Ci0KLSAgYWJmZC0+c3ltY291bnQgPSBWREFUQSAoYWJmZCktPm5yZWZzICsgVkRBVEEgKGFiZmQpLT5uZGVmczsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZXNkaWQgKmVzZGlkID0gJkVEQVRBIChhYmZkLCBpKTsKLSAgICAgIGlmIChlc2RpZC0+c2VjdGlvbikKLQl7Ci0JICBlc2RpZC0+c2VjdGlvbi0+cmVsb2NhdGlvbgotCSAgICA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhcmVsZW50KSAqIGVzZGlkLT5yZWxvY3MpOwotCi0JICBlc2RpZC0+cGMgPSAwOwotCi0JICBpZiAoZXNkaWQtPmNvbnRlbnRzKQotCSAgICBlc2RpZC0+c2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEOwotCi0JICBlc2RpZC0+c2VjdGlvbi0+cmVsb2NfY291bnQgPSBlc2RpZC0+cmVsb2NzOwotCSAgaWYgKGVzZGlkLT5yZWxvY3MpCi0JICAgIGVzZGlkLT5zZWN0aW9uLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0KLQkgIGVzZGlkLT5yZWxvY3MgPSAwOwotCi0JICAvKiBBZGQgYW4gZW50cnkgaW50byB0aGUgc3ltYm9sIHRhYmxlIGZvciBpdCAqLwotCSAgbnNlY3MrKzsKLQkgIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuICs9IHN0cmxlbiAoZXNkaWQtPnNlY3Rpb24tPm5hbWUpICsgMTsKLQl9Ci0gICAgfQotCi0gIGFiZmQtPnN5bWNvdW50ICs9IG5zZWNzOwotCi0gIFZEQVRBIChhYmZkKS0+c3ltYm9scyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChhc3ltYm9sKSAqIChhYmZkLT5zeW1jb3VudCkpOwotCi0gIFZEQVRBIChhYmZkKS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4pOwotCi0gIGlmICgoVkRBVEEgKGFiZmQpLT5zeW1ib2xzID09IE5VTEwgJiYgYWJmZC0+c3ltY291bnQgPiAwKQotICAgICAgfHwgKFZEQVRBIChhYmZkKS0+c3RyaW5ncyA9PSBOVUxMICYmIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuID4gMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFjdHVhbGx5IGZpbGwgaW4gdGhlIHNlY3Rpb24gc3ltYm9scywKLSAgICAgd2Ugc3RpY2sgdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSAqLwotCi0gIGZvciAoaiA9IFZEQVRBIChhYmZkKS0+bnJlZnMgKyBWREFUQSAoYWJmZCktPm5kZWZzLCBpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGVzZGlkICplc2RpZCA9ICZFREFUQSAoYWJmZCwgaSk7Ci0gICAgICBhc2VjdGlvbiAqc2VjID0gZXNkaWQtPnNlY3Rpb247Ci0gICAgICBpZiAoc2VjKQotCXsKLQkgIGFzeW1ib2wgKnMgPSBWREFUQSAoYWJmZCktPnN5bWJvbHMgKyBqOwotCSAgcy0+bmFtZSA9IG5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBzZWMtPm5hbWUpOwotCSAgcy0+c2VjdGlvbiA9IHNlYzsKLQkgIHMtPmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgcy0+dmFsdWUgPSAwOwotCSAgcy0+dGhlX2JmZCA9IGFiZmQ7Ci0JICBqKys7Ci0JfQotICAgIH0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIC8qIFNldCB0aGlzIHRvIG5zZWNzIC0gc2luY2Ugd2UndmUgYWxyZWFkeSBwbGFudGVkIHRoZSBzZWN0aW9uCi0gICAgIHN5bWJvbHMgKi8KLSAgVkRBVEEgKGFiZmQpLT5uc2Vjc3ltcyA9IG5zZWNzOwotCi0gIFZEQVRBIChhYmZkKS0+cmVmX2lkeCA9IDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotCi0vKiBDaGVjayB3aGV0aGVyIGFuIGV4aXN0aW5nIGZpbGUgaXMgYSB2ZXJzYWRvcyAgZmlsZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXZlcnNhZG9zX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRfdmhlYWRlciBleHQ7Ci0gIHVuc2lnbmVkIGNoYXIgbGVuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDEsIGFiZmQpICE9IDEpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAoJmV4dC50eXBlLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgZ3Vlc3MgdGhhdCB0aGUgbGFuZ3VhZ2UgZmllbGQgd2lsbCBuZXZlciBiZSBsYXJnZXIgdGhhbiAxMC4KLSAgICAgSW4gc2FtcGxlIGZpbGVzLCBpdCBpcyBhbHdheXMgZWl0aGVyIDAgb3IgMS4gIENoZWNraW5nIGZvciB0aGlzCi0gICAgIHByZXZlbnRzIGNvbmZ1c2lvbiB3aXRoIEludGVsIEhleCBmaWxlcy4gICovCi0gIGlmIChleHQudHlwZSAhPSBWSEVBREVSCi0gICAgICB8fCBleHQubGFuZyA+IDEwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCBsb29rcyBsaWtlIGEgcmVjb3JkLCBidWlsZCB0aGUgdGRhdGEgYW5kIHJlYWQgaW4uICAqLwotCi0gIGlmICghdmVyc2Fkb3NfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhdmVyc2Fkb3Nfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX3Bhc3NfMiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bmlvbiBleHRfYW55IGFueTsKLQotICBpZiAoVkRBVEEgKGFiZmQpLT5wYXNzXzJfZG9uZSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIFZEQVRBIChhYmZkKS0+ZXNfZG9uZSA9IEVTX0JBU0U7Ci0KLQotICAvKiByZWFkIHJlY29yZHMgdGlsbCB3ZSBnZXQgdG8gd2hlcmUgd2Ugd2FudCB0byBiZSAqLwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGdldF9yZWNvcmQgKGFiZmQsICZhbnkpOwotICAgICAgc3dpdGNoIChhbnkuaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgVkVORDoKLQkgIFZEQVRBIChhYmZkKS0+cGFzc18yX2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JY2FzZSBWRVNUREVGOgotCSAgcHJvY2Vzc19lc2QgKGFiZmQsICZhbnkuZXNkLCAyKTsKLQkgIGJyZWFrOwotCWNhc2UgVk9UUjoKLQkgIHByb2Nlc3Nfb3RyIChhYmZkLCAmYW55Lm90ciwgMik7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3NfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKCF2ZXJzYWRvc19wYXNzXzIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtZW1jcHkgKGxvY2F0aW9uLAotCSAgRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuY29udGVudHMgKyBvZmZzZXQsCi0JICAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgdmVyc2Fkb3NfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3Nfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGJ5dGVzX3RvX2RvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBsb2NhdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBieXRlc190b19kbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGludAotdmVyc2Fkb3Nfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXZlcnNhZG9zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXZlcnNhZG9zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi12ZXJzYWRvc19nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBhc3ltYm9sICpzOwotCi0gIHZlcnNhZG9zX3Bhc3NfMiAoYWJmZCk7Ci0KLSAgZm9yIChpID0gMCwgcyA9IFZEQVRBIChhYmZkKS0+c3ltYm9sczsKLSAgICAgICBpIDwgc3ltY291bnQ7Ci0gICAgICAgcysrLCBpKyspCi0gICAgewotICAgICAgKmFsb2NhdGlvbisrID0gczsKLSAgICB9Ci0KLSAgKmFsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIHN5bWNvdW50OwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi12ZXJzYWRvc19nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi12ZXJzYWRvc19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkgICAgICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAotCSAgICAgICBzeW1ib2wtPm5hbWUpOwotCi0gICAgfQotfQotCi1sb25nCi12ZXJzYWRvc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotCi1sb25nCi12ZXJzYWRvc19jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGFyZWxlbnQgKnNyYzsKLQotICB2ZXJzYWRvc19wYXNzXzIgKGFiZmQpOwotICBzcmMgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICBpZiAoIUVEQVRBIChhYmZkLCBzZWN0aW9uLT50YXJnZXRfaW5kZXgpLmRvbmVyZWwpCi0gICAgewotICAgICAgRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuZG9uZXJlbCA9IDE7Ci0gICAgICAvKiB0cmFuc2xhdGUgZnJvbSBpbmRleGVzIHRvIHN5bXB0ciBwdHJzICovCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICBpbnQgZXNkaWQgPSAoaW50KSBzcmNbY291bnRdLnN5bV9wdHJfcHRyOwotCi0JICBpZiAoZXNkaWQgPT0gMCkKLQkgICAgewotCSAgICAgIHNyY1tjb3VudF0uc3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGVzZGlkIDwgRVNfQkFTRSkJLyogU2VjdGlvbiByZWxhdGl2ZSB0aGluZyAqLwotCSAgICB7Ci0JICAgICAgc3RydWN0IGVzZGlkICplID0gJkVEQVRBIChhYmZkLCBlc2RpZCAtIDEpOwotCSAgICAgIGlmICghc2VjdGlvbikKLQkJewotCQkgLyoqIHJlbG9jYXRpb24gcmVsYXRpdmUgdG8gc2VjdGlvbiB3aGljaCB3YXMKLQkJICAgbmV2ZXIgZGVjbGFyZWQgISAqLwotCQl9Ci0JICAgICAgc3JjW2NvdW50XS5zeW1fcHRyX3B0ciA9IGUtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcmNbY291bnRdLnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGVzZGlkIC0gRVNfQkFTRTsKLQkgICAgfQotCi0JfQotICAgIH0KLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICAqcmVscHRyKysgPSBzcmMrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLSNkZWZpbmUJdmVyc2Fkb3NfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSB2ZXJzYWRvc19uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSB2ZXJzYWRvc19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgdmVyc2Fkb3NfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSB2ZXJzYWRvc19yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHZlcnNhZG9zX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIHZlcnNhZG9zX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSB2ZXJzYWRvc19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgdmVyc2Fkb3NfdmVjID0KLXsKLSAgInZlcnNhZG9zIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdmVyc2Fkb3NfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICB2ZXJzYWRvc19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICB2ZXJzYWRvc19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHZlcnNhZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZlcnNhZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvdm1zLWdzZC5jIGIvYmZkL3Ztcy1nc2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzZmU2OS4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLWdzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTI3ICswLDAgQEAKLS8qIHZtcy1nc2QuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gSW5jLgotCi0gICBnbyBhbmQgcmVhZCB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsIChlc3AuIGFwcGVuZGl4IEIpCi0gICBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0J3MgZ29pbmcgb24gaGVyZSA6LSkKLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiB0eXBpY2FsIHNlY3Rpb25zIGZvciB2YXggb2JqZWN0IGZpbGVzICAqLwotCi0jZGVmaW5lIFZBWF9DT0RFX05BTUUJCSIkQ09ERSIKLSNkZWZpbmUgVkFYX0RBVEFfTkFNRQkJIiREQVRBIgotI2RlZmluZSBWQVhfQUREUkVTU19EQVRBX05BTUUJIiRBRERSRVNTX0RBVEEiCi0KLS8qIHR5cGljYWwgc2VjdGlvbnMgZm9yIGV2YXggb2JqZWN0IGZpbGVzICAqLwotCi0jZGVmaW5lIEVWQVhfQUJTX05BTUUJCSIkQUJTJCIKLSNkZWZpbmUgRVZBWF9DT0RFX05BTUUJCSIkQ09ERSQiCi0jZGVmaW5lIEVWQVhfTElOS19OQU1FCQkiJExJTkskIgotI2RlZmluZSBFVkFYX0RBVEFfTkFNRQkJIiREQVRBJCIKLSNkZWZpbmUgRVZBWF9CU1NfTkFNRQkJIiRCU1MkIgotI2RlZmluZSBFVkFYX1JFQURPTkxZQUREUl9OQU1FCSIkUkVBRE9OTFlfQUREUiQiCi0jZGVmaW5lIEVWQVhfUkVBRE9OTFlfTkFNRQkiJFJFQURPTkxZJCIKLSNkZWZpbmUgRVZBWF9MSVRFUkFMX05BTUUJIiRMSVRFUkFMJCIKLSNkZWZpbmUgRVZBWF9DT01NT05fTkFNRQkiJENPTU1PTiQiCi0jZGVmaW5lIEVWQVhfTE9DQUxfTkFNRQkJIiRMT0NBTCQiCi0KLXN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0IHsKLSAgY2hhciAqbmFtZTsJCQkvKiBuYW1lIG9mIHNlY3Rpb24gKi8KLSAgaW50IHZmbGFnc19hbHdheXM7Ci0gIGZsYWd3b3JkIGZsYWdzX2Fsd2F5czsJLyogZmxhZ3Mgd2Ugc2V0IGFsd2F5cyAqLwotICBpbnQgdmZsYWdzX2hhc3NpemU7Ci0gIGZsYWd3b3JkIGZsYWdzX2hhc3NpemU7CS8qIGZsYWdzIHdlIHNldCBpZiB0aGUgc2VjdGlvbiBoYXMgYSBzaXplID4gMCAqLwotfTsKLQotLyogVGhlc2UgZmxhZ3MgYXJlIGRlY2NydGwvdmF4Y3J0bCAob3BlblZNUyA2LjIgVkFYKSBjb21wYXRpYmxlICAqLwotCi1zdGF0aWMgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgdmF4X3NlY3Rpb25fZmxhZ3NbXSA9IHsKLSAgeyBWQVhfQ09ERV9OQU1FLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1NIUnxHUFNfU19NX0VYRXxHUFNfU19NX1JEKSwKLQkoU0VDX0NPREUpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1NIUnxHUFNfU19NX0VYRXxHUFNfU19NX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfQ09ERXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBWQVhfREFUQV9OQU1FLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0RBVEEpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBWQVhfQUREUkVTU19EQVRBX05BTUUsCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkQpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgTlVMTCwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9PVlJ8R1BTX1NfTV9SRUx8R1BTX1NfTV9HQkx8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCksCi0JKFNFQ19EQVRBKSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9PVlJ8R1BTX1NfTV9SRUx8R1BTX1NfTV9HQkx8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0KLX07Ci0KLQotLyogVGhlc2UgZmxhZ3MgYXJlIGRlY2NydGwvdmF4Y3J0bCAob3BlblZNUyA2LjIgQWxwaGEpIGNvbXBhdGlibGUgICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCBldmF4X3NlY3Rpb25fZmxhZ3NbXSA9IHsKLSAgeyBFVkFYX0FCU19OQU1FLAotCShFR1BTX1NfVl9TSFIpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1NIUiksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9DT0RFX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX0VYRSksCi0JKFNFQ19DT0RFKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfRVhFKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfQ09ERXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0xJVEVSQUxfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfTElOS19OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0RBVEFfTkFNRSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9CU1NfTkFNRSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19OT19GTEFHUyksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfUkVBRE9OTFlBRERSX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9SRUFET05MWV9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9MT0NBTF9OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBOVUxMLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfQotfTsKLQotLyogUmV0cmlldmUgYmZkIHNlY3Rpb24gZmxhZ3MgYnkgbmFtZSBhbmQgc2l6ZSAgKi8KLQotc3RhdGljIGZsYWd3b3JkCi12bXNfc2VjZmxhZ19ieV9uYW1lIChhYmZkLCBzZWN0aW9uX2ZsYWdzLCBuYW1lLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0ICpzZWN0aW9uX2ZsYWdzOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGkgPSAwOwotCi0gIHdoaWxlIChzZWN0aW9uX2ZsYWdzW2ldLm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKFBSSVYoaXNfdmF4KT8KLQkgICAgc3RyY2FzZWNtcCAobmFtZSwgc2VjdGlvbl9mbGFnc1tpXS5uYW1lKToKLQkgICAgc3RyY21wIChuYW1lLCBzZWN0aW9uX2ZsYWdzW2ldLm5hbWUpKSA9PSAwKQotCXsKLQkgIGlmIChzaXplID4gMCkKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0uZmxhZ3NfaGFzc2l6ZTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0uZmxhZ3NfYWx3YXlzOwotCX0KLSAgICAgIGkrKzsKLSAgICB9Ci0gIGlmIChzaXplID4gMCkKLSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19oYXNzaXplOwotICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19hbHdheXM7Ci19Ci0KLQotLyogUmV0cmlldmUgdm1zIHNlY3Rpb24gZmxhZ3MgYnkgbmFtZSBhbmQgc2l6ZSAgKi8KLQotc3RhdGljIGZsYWd3b3JkCi12bXNfZXNlY2ZsYWdfYnlfbmFtZSAoc2VjdGlvbl9mbGFncywgbmFtZSwgc2l6ZSkKLSAgICAgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgKnNlY3Rpb25fZmxhZ3M7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaSA9IDA7Ci0KLSAgd2hpbGUgKHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoc2l6ZSA+IDApCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19oYXNzaXplOwotCSAgZWxzZQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfYWx3YXlzOwotCX0KLSAgICAgIGkrKzsKLSAgICB9Ci0gIGlmIChzaXplID4gMCkKLSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfaGFzc2l6ZTsKLSAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2Fsd2F5czsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgVk1TX0RFQlVHCi0vKiBkZWJ1ZyAqLwotCi1zdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgeyBjaGFyICpuYW1lOyBmbGFnd29yZCB2YWx1ZTsgfTsKLQotLyogQ29udmVydCBmbGFnIHRvIHByaW50YWJsZSBzdHJpbmcgICovCi0KLXN0YXRpYyBjaGFyICoKLWZsYWcyc3RyKGZsYWdkZXNjLCBmbGFncykKLSAgICAgc3RydWN0IGZsYWdkZXNjc3RydWN0ICpmbGFnZGVzYzsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0KLSAgc3RhdGljIGNoYXIgcmVzWzY0XTsKLSAgaW50IG5leHQgPSAwOwotCi0gIHJlc1swXSA9IDA7Ci0gIHdoaWxlIChmbGFnZGVzYy0+bmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgoZmxhZ3MgJiBmbGFnZGVzYy0+dmFsdWUpICE9IDApCi0JewotCSAgaWYgKG5leHQpCi0JICAgIHN0cmNhdChyZXMsICIsIik7Ci0JICBlbHNlCi0JICAgIG5leHQgPSAxOwotCSAgc3RyY2F0IChyZXMsIGZsYWdkZXNjLT5uYW1lKTsKLQl9Ci0gICAgICBmbGFnZGVzYysrOwotICAgIH0KLSAgcmV0dXJuIHJlczsKLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIGlucHV0IHJvdXRpbmVzICovCi0KLS8qIFByb2Nlc3MgR1NEL0VHU0QgcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9nc2QgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHN0YXRpYyBzdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgZ3BzZmxhZ2Rlc2NbXSA9Ci0gIHsKLSAgICB7ICJQSUMiLCAweDAwMDEgfSwKLSAgICB7ICJMSUIiLCAweDAwMDIgfSwKLSAgICB7ICJPVlIiLCAweDAwMDQgfSwKLSAgICB7ICJSRUwiLCAweDAwMDggfSwKLSAgICB7ICJHQkwiLCAweDAwMTAgfSwKLSAgICB7ICJTSFIiLCAweDAwMjAgfSwKLSAgICB7ICJFWEUiLCAweDAwNDAgfSwKLSAgICB7ICJSRCIsICAweDAwODAgfSwKLSAgICB7ICJXUlQiLCAweDAxMDAgfSwKLSAgICB7ICJWRUMiLCAweDAyMDAgfSwKLSAgICB7ICJOT01PRCIsIDB4MDQwMCB9LAotICAgIHsgIkNPTSIsIDB4MDgwMCB9LAotICAgIHsgTlVMTCwgMCB9Ci0gIH07Ci0KLSAgc3RhdGljIHN0cnVjdCBmbGFnZGVzY3N0cnVjdCBnc3lmbGFnZGVzY1tdID0KLSAgewotICAgIHsgIldFQUsiLCAweDAwMDEgfSwKLSAgICB7ICJERUYiLCAgMHgwMDAyIH0sCi0gICAgeyAiVU5JIiwgIDB4MDAwNCB9LAotICAgIHsgIlJFTCIsICAweDAwMDggfSwKLSAgICB7ICJDT01NIiwgMHgwMDEwIH0sCi0gICAgeyAiVkVDRVAiLCAweDAwMjAgfSwKLSAgICB7ICJOT1JNIiwgMHgwMDQwIH0sCi0gICAgeyBOVUxMLCAwIH0KLSAgfTsKLSNlbmRpZgotCi0gIGludCBnc2RfdHlwZSwgZ3NkX3NpemU7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwotICBmbGFnd29yZCBuZXdfZmxhZ3MsIG9sZF9mbGFnczsKLSAgY2hhciAqbmFtZTsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLSAgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgYWxpZ25fYWRkcjsKLSAgc3RhdGljIHVuc2lnbmVkIGludCBwc2VjdF9pZHggPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgIkdTRC9FR1NEICglZC8leClcbiIsIG9ianR5cGUsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChvYmp0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgRU9CSl9TX0NfRUdTRDoKLSAJUFJJVih2bXNfcmVjKSArPSA4OwkvKiBza2lwIHR5cGUsIHNpemUsIGxfdGVtcCAqLwotCVBSSVYocmVjX3NpemUpIC09IDg7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9CSl9TX0NfR1NEOgotCVBSSVYodm1zX3JlYykgKz0gMTsKLQlQUklWKHJlY19zaXplKSAtPSAxOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIGNhbGN1bGF0ZSBiYXNlIGFkZHJlc3MgZm9yIGVhY2ggc2VjdGlvbiAgKi8KLSAgYmFzZV9hZGRyID0gMEw7Ci0KLSAgYWJmZC0+c3ltY291bnQgPSAwOwotCi0gIHdoaWxlIChQUklWKHJlY19zaXplKSA+IDApCi0gICAgewotICAgICAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7Ci0KLSAgICAgIGlmIChvYmp0eXBlID09IE9CSl9TX0NfR1NEKQotCXsKLQkgIGdzZF90eXBlID0gKnZtc19yZWM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCB2bXNfcmVjLCAmZ3NkX3R5cGUsICZnc2Rfc2l6ZSk7Ci0JICBnc2RfdHlwZSArPSBFVkFYX09GRlNFVDsKLQl9Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiZ3NkX3R5cGUgJWRcbiIsIGdzZF90eXBlKTsKLSNlbmRpZgotCi0gICAgICBzd2l0Y2ggKGdzZF90eXBlKQotCXsKLQkgIGNhc2UgR1NEX1NfQ19QU0M6Ci0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIHByb2dyYW0gc2VjdGlvbiBkZWZpbml0aW9uCi0JICAgICAgICovCi0KLQkgICAgICBhc2VjdGlvbiAqb2xkX3NlY3Rpb24gPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIkdTRF9TX0NfUFNDXG4iKTsKLSNlbmRpZgotCSAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpc24ndCBhIGJmZCBzZWN0aW9uLiAgKi8KLQotCSAgICAgIGlmIChQUklWKGlzX3ZheCkgJiYgKHBzZWN0X2lkeCA8IChhYmZkLT5zZWN0aW9uX2NvdW50LTEpKSkKLQkJewotCQkgIC8qIGNoZWNrIGZvciB0ZW1wb3Jhcnkgc2VjdGlvbiBmcm9tIFRJUiByZWNvcmQuICAqLwotCi0JCSAgaWYgKHBzZWN0X2lkeCA8IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JCSAgICBvbGRfc2VjdGlvbiA9IFBSSVYoc2VjdGlvbnMpW3BzZWN0X2lkeF07Ci0JCSAgZWxzZQotCQkgICAgb2xkX3NlY3Rpb24gPSAwOwotCQl9Ci0KLQkgICAgICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDgpOwotCSAgICAgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLQkgICAgICBpZiAoIXNlY3Rpb24pCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oImJmZF9tYWtlX3NlY3Rpb24gKCVzKSBmYWlsZWQiKSwKLQkJCQkJIG5hbWUpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAyKTsKLQkgICAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBiZmRfZ2V0bDMyKHZtc19yZWMgKyA0KTsJLyogYWxsb2NhdGlvbiAqLwotCSAgICAgIG5ld19mbGFncyA9IHZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIHZheF9zZWN0aW9uX2ZsYWdzLCBuYW1lLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBFR1BTX1NfVl9SRUwpCi0JCW5ld19mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdQU19TX01fT1ZSKQotCQluZXdfZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgbmV3X2ZsYWdzKSkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oImJmZF9zZXRfc2VjdGlvbl9mbGFncyAoJXMsICV4KSBmYWlsZWQiKSwKLQkJICAgICBuYW1lLCBuZXdfZmxhZ3MpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHZtc19yZWNbMV07Ci0JICAgICAgYWxpZ25fYWRkciA9ICgxIDw8IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcik7Ci0JICAgICAgaWYgKChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSAhPSAwKQotCQliYXNlX2FkZHIgKz0gKGFsaWduX2FkZHIgLSAoYmFzZV9hZGRyICUgYWxpZ25fYWRkcikpOwotCSAgICAgIHNlY3Rpb24tPnZtYSA9IChiZmRfdm1hKWJhc2VfYWRkcjsKLQkgICAgICBiYXNlX2FkZHIgKz0gc2VjdGlvbi0+X3Jhd19zaXplOwotCi0JICAgICAgLyogZ2xvYmFsIHNlY3Rpb24gaXMgY29tbW9uIHN5bWJvbCAgKi8KLQotCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBHUFNfU19NX0dCTCkKLQkJewotCQkgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkJICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJICAgICAgcmV0dXJuIC0xOwotCQkgICAgfQotCQkgIHN5bWJvbCA9IGVudHJ5LT5zeW1ib2w7Ci0KLQkJICBzeW1ib2wtPnZhbHVlID0gMDsKLQkJICBzeW1ib2wtPnNlY3Rpb24gPSBzZWN0aW9uOwotCQkgIHN5bWJvbC0+ZmxhZ3MgPSAoQlNGX0dMT0JBTHxCU0ZfU0VDVElPTl9TWU18QlNGX09MRF9DT01NT04pOwotCQl9Ci0KLQkgICAgICAvKiBjb3B5IHNhdmVkIGNvbnRlbnRzIGlmIG9sZF9zZWN0aW9uIHNldCAgKi8KLQotCSAgICAgIGlmIChvbGRfc2VjdGlvbiAhPSAwKQotCQl7Ci0JCSAgc2VjdGlvbi0+Y29udGVudHMgPSBvbGRfc2VjdGlvbi0+Y29udGVudHM7Ci0JCSAgaWYgKHNlY3Rpb24tPl9yYXdfc2l6ZSA8IG9sZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JCSAgICB7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIlNpemUgbWlzbWF0Y2ggc2VjdGlvbiAlcz0lbHgsICVzPSVseCIpLAotCQkJIG9sZF9zZWN0aW9uLT5uYW1lLAotCQkJICh1bnNpZ25lZCBsb25nKSBvbGRfc2VjdGlvbi0+X3Jhd19zaXplLAotCQkJIHNlY3Rpb24tPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzZWN0aW9uLT5fcmF3X3NpemUgPiBvbGRfc2VjdGlvbi0+X3Jhd19zaXplKQotCQkgICAgewotCQkgICAgICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCSAgICBiZmRfcmVhbGxvYyAob2xkX3NlY3Rpb24tPmNvbnRlbnRzLCBzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkJICAgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkJICByZXR1cm4gLTE7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKLQkJCQkJYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0JCSAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgICAgICByZXR1cm4gLTE7Ci0JCSAgICB9Ci0JCSAgbWVtc2V0IChzZWN0aW9uLT5jb250ZW50cywgMCwgKHNpemVfdClzZWN0aW9uLT5fcmF3X3NpemUpOwotCQl9Ci0JICAgICAgc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotI2lmIFZNU19ERUJVRwotCSAgICAgIHZtc19kZWJ1ZyAoNCwgImdzZCBwc2MgJWQgKCVzLCBmbGFncyAlMDR4PSVzKSAiLAotCQkJIHNlY3Rpb24tPmluZGV4LCBuYW1lLCBvbGRfZmxhZ3MsIGZsYWcyc3RyIChncHNmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0JICAgICAgdm1zX2RlYnVnICg0LCAiJWQgYnl0ZXMgYXQgMHglMDhseCAobWVtICVwKVxuIiwKLQkJCSBzZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+Y29udGVudHMpOwotI2VuZGlmCi0KLQkgICAgICBnc2Rfc2l6ZSA9IHZtc19yZWNbOF0gKyA5OwotCi0JICAgICAgcHNlY3RfaWR4Kys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JICBjYXNlIEdTRF9TX0NfRVBNOgotCSAgY2FzZSBHU0RfU19DX0VQTVc6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGVwbVxuIik7Ci0jZW5kaWYKLQkgIC8qRkFMTFRIUlUqLwotCSAgY2FzZSBHU0RfU19DX1NZTToKLQkgIGNhc2UgR1NEX1NfQ19TWU1XOgotCSAgICB7Ci0JICAgICAgaW50IG5hbWVfb2Zmc2V0LCB2YWx1ZV9vZmZzZXQ7Ci0KLQkgICAgICAvKgotCSAgICAgICAqIHN5bWJvbCBzcGVjaWZpY2F0aW9uIChkZWZpbml0aW9uIG9yIHJlZmVyZW5jZSkKLQkgICAgICAgKi8KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICJHU0RfU19DX1NZTShXKVxuIik7Ci0jZW5kaWYKLQkgICAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMik7Ci0JICAgICAgbmV3X2ZsYWdzID0gQlNGX05PX0ZMQUdTOwotCi0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdTWV9TX01fV0VBSykKLQkJbmV3X2ZsYWdzIHw9IEJTRl9XRUFLOwotCi0JICAgICAgc3dpdGNoIChnc2RfdHlwZSkKLQkJewotCQkgIGNhc2UgR1NEX1NfQ19FUE06Ci0JCSAgICBuYW1lX29mZnNldCA9IDExOwotCQkgICAgdmFsdWVfb2Zmc2V0ID0gNTsKLQkJICAgIG5ld19mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIEdTRF9TX0NfRVBNVzoKLQkJICAgIG5hbWVfb2Zmc2V0ID0gMTI7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA2OwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19TWU06Ci0JCSAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gOTsKLQkJICAgIGVsc2UKLQkJICAgICAgbmFtZV9vZmZzZXQgPSA0OwotCQkgICAgdmFsdWVfb2Zmc2V0ID0gNTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19TWU1XOgotCQkgICAgaWYgKG9sZF9mbGFncyAmIEdTWV9TX01fREVGKQkvKiBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCQkgICAgICBuYW1lX29mZnNldCA9IDEwOwotCQkgICAgZWxzZQotCQkgICAgICBuYW1lX29mZnNldCA9IDU7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA2OwotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIHNhdmUgc3ltYm9sIGluIHZtc19zeW1ib2xfdGFibGUgKi8KLQotCSAgICAgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLAotCQkJX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIG5hbWVfb2Zmc2V0KSk7Ci0JICAgICAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkJewotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIHN5bWJvbCA9IGVudHJ5LT5zeW1ib2w7Ci0KLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCXsKLQkJICBpbnQgcHNlY3Q7Ci0KLQkJICBzeW1ib2wtPnZhbHVlID0gYmZkX2dldGwzMiAodm1zX3JlYyt2YWx1ZV9vZmZzZXQpOwotCQkgIGlmICgoZ3NkX3R5cGUgPT0gR1NEX1NfQ19TWU1XKQotCQkgICAgICB8fCAoZ3NkX3R5cGUgPT0gR1NEX1NfQ19FUE1XKSkKLQkJICAgIHBzZWN0ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIHZhbHVlX29mZnNldCAtIDIpOwotCQkgIGVsc2UKLQkJICAgIHBzZWN0ID0gdm1zX3JlY1t2YWx1ZV9vZmZzZXQtMV07Ci0KLQkJICBzeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKilwc2VjdDsKLSNpZiBWTVNfREVCVUcKLQkJICB2bXNfZGVidWcoNCwgImdzZCBzeW0gZGVmICMlZCAoJXMsICVkIFslcF0sICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCQlzeW1ib2wtPm5hbWUsIChpbnQpc3ltYm9sLT5zZWN0aW9uLCBzeW1ib2wtPnNlY3Rpb24sIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JCX0KLQkgICAgICBlbHNlCS8qIHN5bWJvbCByZWZlcmVuY2UgKi8KLQkJewotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEJGRF9VTkRfU0VDVElPTl9OQU1FKTsKLSNpZiBWTVNfREVCVUcKLQkJICB2bXNfZGVidWcgKDQsICJnc2Qgc3ltIHJlZiAjJWQgKCVzLCAlcyBbJXBdLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkJc3ltYm9sLT5uYW1lLCBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsIHN5bWJvbC0+c2VjdGlvbiwgb2xkX2ZsYWdzLCBmbGFnMnN0ciAoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JCX0KLQotCSAgICAgIGdzZF9zaXplID0gdm1zX3JlY1tuYW1lX29mZnNldF0gKyBuYW1lX29mZnNldCArIDE7Ci0JICAgICAgc3ltYm9sLT5mbGFncyA9IG5ld19mbGFnczsKLQkgICAgfQotCi0JICBicmVhazsKLQotCSAgY2FzZSBHU0RfU19DX1BSTzoKLQkgIGNhc2UgR1NEX1NfQ19QUk9XOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBwcm9cbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19JREM6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGlkY1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0VOVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZW52XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfTFNZOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBsc3lcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MRVBNOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBsZXBtXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfTFBSTzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgbHByb1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1NQU0M6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHNwc2NcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19TWU1WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBzeW12XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfRVBNVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZXBtdlxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1BST1Y6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHByb3ZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfUFNDICsgRVZBWF9PRkZTRVQ6Ci0JICB7Ci0JICAgIC8qIHByb2dyYW0gc2VjdGlvbiBkZWZpbml0aW9uICAqLwotCi0JICAgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjKzEyKTsKLQkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotCSAgICBpZiAoIXNlY3Rpb24pCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNik7Ci0JICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsJLyogYWxsb2NhdGlvbiAqLwotCSAgICBuZXdfZmxhZ3MgPSB2bXNfc2VjZmxhZ19ieV9uYW1lIChhYmZkLCBldmF4X3NlY3Rpb25fZmxhZ3MsIG5hbWUsIChpbnQpIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICAgIGlmIChvbGRfZmxhZ3MgJiBFR1BTX1NfVl9SRUwpCi0JICAgICAgbmV3X2ZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24sIG5ld19mbGFncykpCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB2bXNfcmVjWzRdOwotCSAgICBhbGlnbl9hZGRyID0gKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgICAgaWYgKChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSAhPSAwKQotCSAgICAgIGJhc2VfYWRkciArPSAoYWxpZ25fYWRkciAtIChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSk7Ci0JICAgIHNlY3Rpb24tPnZtYSA9IChiZmRfdm1hKWJhc2VfYWRkcjsKLQkgICAgYmFzZV9hZGRyICs9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgICAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKLQkJCQkgYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0JICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICAgIHJldHVybiAtMTsKLQkgICAgbWVtc2V0IChzZWN0aW9uLT5jb250ZW50cywgMCwgKHNpemVfdCkgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotI2lmIFZNU19ERUJVRwotCSAgICB2bXNfZGVidWcoNCwgImVnc2QgcHNjICVkICglcywgZmxhZ3MgJTA0eD0lcykgIiwKLQkJICAgICAgIHNlY3Rpb24tPmluZGV4LCBuYW1lLCBvbGRfZmxhZ3MsIGZsYWcyc3RyKGdwc2ZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLQkgICAgdm1zX2RlYnVnKDQsICIlZCBieXRlcyBhdCAweCUwOGx4IChtZW0gJXApXG4iLAotCQkgICAgICAgc2VjdGlvbi0+X3Jhd19zaXplLCBzZWN0aW9uLT52bWEsIHNlY3Rpb24tPmNvbnRlbnRzKTsKLSNlbmRpZgotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEVHU0RfU19DX1NZTSArIEVWQVhfT0ZGU0VUOgotCSAgewotCSAgICAvKiBzeW1ib2wgc3BlY2lmaWNhdGlvbiAoZGVmaW5pdGlvbiBvciByZWZlcmVuY2UpICAqLwotCi0JICAgIHN5bWJvbCA9IF9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLQkgICAgaWYgKHN5bWJvbCA9PSAwKQotCSAgICAgIHJldHVybiAtMTsKLQotCSAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNik7Ci0JICAgIG5ld19mbGFncyA9IEJTRl9OT19GTEFHUzsKLQotCSAgICBpZiAob2xkX2ZsYWdzICYgRUdTWV9TX1ZfV0VBSykKLQkgICAgICBuZXdfZmxhZ3MgfD0gQlNGX1dFQUs7Ci0KLQkgICAgaWYgKHZtc19yZWNbNl0gJiBFR1NZX1NfVl9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JICAgICAgewotCQlzeW1ib2wtPm5hbWUgPQotCQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrMzIpOwotCQlpZiAob2xkX2ZsYWdzICYgRUdTWV9TX1ZfTk9STSkKLQkJICB7ICAgICAgICAgLyogcHJvYyBkZWYgKi8KLQkJICAgIG5ld19mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JCSAgfQotCQlzeW1ib2wtPnZhbHVlID0gYmZkX2dldGw2NCAodm1zX3JlYys4KTsKLQkJc3ltYm9sLT5zZWN0aW9uID0gKGFzZWN0aW9uICopKCh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0bDMyICh2bXNfcmVjKzI4KSk7Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZWdzZCBzeW0gZGVmICMlZCAoJXMsICVkLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkgICBzeW1ib2wtPm5hbWUsIChpbnQpc3ltYm9sLT5zZWN0aW9uLCBvbGRfZmxhZ3MsIGZsYWcyc3RyKGdzeWZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLSNlbmRpZgotCSAgICAgIH0KLQkgICAgZWxzZQkvKiBzeW1ib2wgcmVmZXJlbmNlICovCi0JICAgICAgewotCSAgICAgICAgc3ltYm9sLT5uYW1lID0KLQkJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjKzgpOwotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImVnc2Qgc3ltIHJlZiAjJWQgKCVzLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkgICBzeW1ib2wtPm5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JICAgICAgICBzeW1ib2wtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSk7Ci0JICAgICAgfQotCi0JICAgIHN5bWJvbC0+ZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0KLQkgICAgLyogc2F2ZSBzeW1ib2wgaW4gdm1zX3N5bWJvbF90YWJsZSAgKi8KLQotCSAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgc3ltYm9sLT5uYW1lLCB0cnVlLCBmYWxzZSk7Ci0JICAgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgICAgewotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJcmV0dXJuIC0xOwotCSAgICAgIH0KLQkgICAgaWYgKGVudHJ5LT5zeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKQotCSAgICAgIHsJCQkJCS8qIEZJWE1FID8sIERFQyBDIGdlbmVyYXRlcyB0aGlzICovCi0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiRUdTRF9TX0NfU1lNOiBkdXBsaWNhdGUgXCIlc1wiXG4iLCBzeW1ib2wtPm5hbWUpOwotI2VuZGlmCi0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQllbnRyeS0+c3ltYm9sID0gc3ltYm9sOwotCQlQUklWKGdzZF9zeW1fY291bnQpKys7Ci0JCWFiZmQtPnN5bWNvdW50Kys7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEVHU0RfU19DX0lEQyArIEVWQVhfT0ZGU0VUOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJ1bmtub3duIGdzZC9lZ3NkIHN1YnR5cGUgJWQiKSwgZ3NkX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gLTE7Ci0KLQl9IC8qIHN3aXRjaCAqLwotCi0gICAgICBQUklWKHJlY19zaXplKSAtPSBnc2Rfc2l6ZTsKLSAgICAgIFBSSVYodm1zX3JlYykgKz0gZ3NkX3NpemU7Ci0KLSAgICB9IC8qIHdoaWxlIChyZWNzaXplID4gMCkgKi8KLQotICBpZiAoYWJmZC0+c3ltY291bnQgPiAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIG91dHB1dCByb3V0aW5lcyAqLwotCi0vKiBXcml0ZSBzZWN0aW9uIGFuZCBzeW1ib2wgZGlyZWN0b3J5IG9mIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2dzZCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICB1bnNpZ25lZCBpbnQgc3ltbnVtOwotICBpbnQgbGFzdF9pbmRleCA9IC0xOwotICBjaGFyIGR1bW15X25hbWVbMTBdOwotICBjaGFyICpzbmFtZTsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzLCBvbGRfZmxhZ3M7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2dzZCAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICAvKiBvdXRwdXQgc2VjdGlvbnMgICovCi0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICIlZCBzZWN0aW9ucyBmb3VuZFxuIiwgYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0jZW5kaWYKLQotICAvKiBlZ3NkIGlzIHF1YWR3b3JkIGFsaWduZWQgICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgOCk7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7Ci0gIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwkJLyogcHJlcGFyZSBvdXRwdXQgZm9yIHN1YnJlY29yZHMgKi8KLQotICB3aGlsZSAoc2VjdGlvbiAhPSAwKQotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiU2VjdGlvbiAjJWQgJXMsICVkIGJ5dGVzXG4iLCBzZWN0aW9uLT5pbmRleCwgc2VjdGlvbi0+bmFtZSwgKGludClzZWN0aW9uLT5fcmF3X3NpemUpOwotI2VuZGlmCi0KLQkvKiAxMyBieXRlcyBlZ3NkLCBtYXggMzEgY2hhcnMgbmFtZSAtPiBzaG91bGQgYmUgNDQgYnl0ZXMgKi8KLSAgICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDY0KSA8IDApCi0JewotCSAgX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRUdTRCwgLTEpOwotCSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwkJLyogcHJlcGFyZSBvdXRwdXQgZm9yIHN1YnJlY29yZHMgKi8KLQl9Ci0KLQkvKiBDcmVhdGUgZHVtbXkgc2VjdGlvbnMgdG8ga2VlcCBjb25zZWN1dGl2ZSBpbmRpY2VzICovCi0KLSAgICAgIHdoaWxlIChzZWN0aW9uLT5pbmRleCAtIGxhc3RfaW5kZXggPiAxKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMywgImluZGV4ICVkLCBsYXN0ICVkXG4iLCBzZWN0aW9uLT5pbmRleCwgbGFzdF9pbmRleCk7Ci0jZW5kaWYKLQkgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRUdTRF9TX0NfUFNDLCAtMSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKLQkgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLQkgIHNwcmludGYgKGR1bW15X25hbWUsICIuRFVNTVklMDJkIiwgbGFzdF9pbmRleCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZHVtbXlfbmFtZSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCSAgbGFzdF9pbmRleCsrOwotCX0KLQotICAgICAgLyogRG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lY2Nlc2FyeSBmb3IgdGhlIGxpbmtlciBidXQgZm9yIG5vdyBpdCBrZWVwcwotCSB2bXNfc2x1cnBfZ3NkIGhhcHB5ICAqLwotCi0gICAgICBzbmFtZSA9IChjaGFyICopc2VjdGlvbi0+bmFtZTsKLSAgICAgIGlmICgqc25hbWUgPT0gJy4nKQotCXsKLQkgIHNuYW1lKys7Ci0JICBpZiAoKCpzbmFtZSA9PSAndCcpICYmIChzdHJjbXAgKHNuYW1lLCAidGV4dCIpID09IDApKQotCSAgICBzbmFtZSA9IFBSSVYoaXNfdmF4KT9WQVhfQ09ERV9OQU1FOkVWQVhfQ09ERV9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnZCcpICYmIChzdHJjbXAgKHNuYW1lLCAiZGF0YSIpID09IDApKQotCSAgICBzbmFtZSA9IFBSSVYoaXNfdmF4KT9WQVhfREFUQV9OQU1FOkVWQVhfREFUQV9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnYicpICYmIChzdHJjbXAgKHNuYW1lLCAiYnNzIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9CU1NfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2wnKSAmJiAoc3RyY21wIChzbmFtZSwgImxpbmsiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0xJTktfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ3InKSAmJiAoc3RyY21wIChzbmFtZSwgInJkYXRhIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9SRUFET05MWV9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnbCcpICYmIChzdHJjbXAgKHNuYW1lLCAibGl0ZXJhbCIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfTElURVJBTF9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnYycpICYmIChzdHJjbXAgKHNuYW1lLCAiY29tbSIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfQ09NTU9OX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdsJykgJiYgKHN0cmNtcCAoc25hbWUsICJsY29tbSIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfTE9DQUxfTkFNRTsKLQl9Ci0gICAgICBlbHNlCi0Jc25hbWUgPSBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHNuYW1lLCBFT0JKX1NfQ19TRUNTSVopOwotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVHU0RfU19DX1BTQywgLTEpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgJiAweGZmKTsKLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotCXsKLQkgIG5ld19mbGFncyA9IChFR1BTX1NfVl9PVlJ8RUdQU19TX1ZfUkVMfEVHUFNfU19WX0dCTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlR8RUdQU19TX1ZfTk9NT0R8RUdQU19TX1ZfQ09NKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmV3X2ZsYWdzID0gdm1zX2VzZWNmbGFnX2J5X25hbWUgKGV2YXhfc2VjdGlvbl9mbGFncywgc25hbWUsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBuZXdfZmxhZ3MpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgc25hbWUpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAgICAgbGFzdF9pbmRleCA9IHNlY3Rpb24tPmluZGV4OwotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotCi0gIC8qIG91dHB1dCBzeW1ib2xzICAqLwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgIiVkIHN5bWJvbHMgZm91bmRcbiIsIGFiZmQtPnN5bWNvdW50KTsKLSNlbmRpZgotCi0gIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCwgKGJmZF92bWEpLTEpOwotCi0gIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQotICAgIHsKLQotICAgICAgc3ltYm9sID0gYWJmZC0+b3V0c3ltYm9sc1tzeW1udW1dOwotICAgICAgaWYgKCooc3ltYm9sLT5uYW1lKSA9PSAnXycpCi0JewotCSAgaWYgKHN0cmNtcCAoc3ltYm9sLT5uYW1lLCAiX19tYWluIikgPT0gMCkKLQkgICAgYmZkX3NldF9zdGFydF9hZGRyZXNzIChhYmZkLCAoYmZkX3ZtYSlzeW1ib2wtPnZhbHVlKTsKLQl9Ci0gICAgICBvbGRfZmxhZ3MgPSBzeW1ib2wtPmZsYWdzOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX0ZJTEUpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoKG9sZF9mbGFncyAmIChCU0ZfR0xPQkFMfEJTRl9XRUFLKSkgPT0gMCkJLyogbm90IHhkZWYgKi8KLQkgICYmICghYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSkJLyogYW5kIG5vdCB4cmVmICovCi0JY29udGludWU7CQkJCQkvKiBkb250IG91dHB1dCAqLwotCi0gICAgICAvKiAxMyBieXRlcyBlZ3NkLCBtYXggNjQgY2hhcnMgbmFtZSAtPiBzaG91bGQgYmUgNzcgYnl0ZXMgICovCi0KLSAgICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDgwKSA8IDApCi0JewotCSAgX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRUdTRCwgLTEpOwotCSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwkJLyogcHJlcGFyZSBvdXRwdXQgZm9yIHN1YnJlY29yZHMgKi8KLQl9Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRUdTRF9TX0NfU1lNLCAtMSk7Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7CQkJLyogZGF0YSB0eXBlLCBhbGlnbm1lbnQgKi8KLQotICAgICAgbmV3X2ZsYWdzID0gMDsKLQotICAgICAgaWYgKG9sZF9mbGFncyAmIEJTRl9XRUFLKQotCW5ld19mbGFncyB8PSBFR1NZX1NfVl9XRUFLOwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkJCS8qIC5jb21tICAqLwotCW5ld19mbGFncyB8PSAoRUdTWV9TX1ZfV0VBS3xFR1NZX1NfVl9DT01NKTsKLQotICAgICAgaWYgKG9sZF9mbGFncyAmIEJTRl9GVU5DVElPTikKLQl7Ci0JICBuZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfTk9STTsKLQkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9SRUw7Ci0JfQotICAgICAgaWYgKG9sZF9mbGFncyAmIChCU0ZfR0xPQkFMfEJTRl9XRUFLKSkKLQl7Ci0JICBuZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfREVGOwotCSAgaWYgKCFiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9SRUw7Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBuZXdfZmxhZ3MpOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKQkJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQl7Ci0JICBpZiAob2xkX2ZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCSAgICB7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpOwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCSAgICAgKChhc3ltYm9sICopKHN5bWJvbC0+dWRhdGEucCkpLT52YWx1ZSk7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkJICAgICAoKChhc3ltYm9sICopKHN5bWJvbC0+dWRhdGEucCkpCi0JCQkJICAgICAgLT5zZWN0aW9uLT5pbmRleCkpOwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBzeW1ib2wtPnNlY3Rpb24tPmluZGV4KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpOwkvKiBMX1ZBTFVFICovCi0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIDApOwkJCS8qIExfQ09ERV9BRERSRVNTICovCi0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwkJCS8qIExfQ0FfUFNJTkRYICovCi0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgpOy8qIExfUFNJTkRYICovCi0JICAgIH0KLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW1ib2wtPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gICAgfQotCi0gIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIDgpOwotICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7IAotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy1oZHIuYyBiL2JmZC92bXMtaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzZiMzIuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy1oZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKiB2bXMtaGRyLmMgLS0gQkZEIGJhY2stZW5kIGZvciBWTVMvVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgRU1IIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIGFuZAotICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIEVFT00gcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKiBSZWFkICYgcHJvY2VzcyBlbWggcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9oZHIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKLSAgaW50IHN1YnR5cGU7Ci0KLSAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDIsICJIRFIvRU1IXG4iKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAob2JqdHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIE9CSl9TX0NfSERSOgotCXN1YnR5cGUgPSB2bXNfcmVjWzFdOwotCWJyZWFrOwotICAgICAgY2FzZSBFT0JKX1NfQ19FTUg6Ci0Jc3VidHlwZSA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA0KSArIEVWQVhfT0ZGU0VUOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlzdWJ0eXBlID0gLTE7Ci0gICAgfQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZygzLCAic3VidHlwZSAlZFxuIiwgc3VidHlwZSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKHN1YnR5cGUpCi0gICAgewotCi0gICAgICBjYXNlIE1IRF9TX0NfTUhEOgotCS8qCi0JICogbW9kdWxlIGhlYWRlcgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbMl07Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDMpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X25hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgNSk7Ci0JcHRyID0gdm1zX3JlYyArIDUgKyB2bXNfcmVjWzVdICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQlwdHIgKz0gKnB0ciArIDE7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19MTk06Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19TUkM6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19UVEw6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19DUFI6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19NVEM6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19HVFg6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19NSEQgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqIG1vZHVsZSBoZWFkZXIKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzZdOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gxID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDgpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X25hbWUgPQotCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDIwKTsKLQlwdHIgPSB2bXNfcmVjICsgMjAgKyB2bXNfcmVjWzIwXSArIDE7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9Ci0JICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCXB0ciArPSAqcHRyICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0KLQkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19MTk0gKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0KLQkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19TUkMgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0KLQkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19UVEwgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0KLQkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19DUFIgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX01UQyArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfR1RYICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gLTE7Ci0KLSAgICB9IC8qIHN3aXRjaCAqLwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogT3V0cHV0IHJvdXRpbmVzLiAgKi8KLQotCi0vKiBNYW51ZmFjdXJlIGEgVk1TIGxpa2UgdGltZSBvbiBhIHVuaXggYmFzZWQgc3lzdGVtLgotICAgc3RvbGVuIGZyb20gb2JqLXZtcy5jICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1nZXRfdm1zX3RpbWVfc3RyaW5nICgpCi17Ci0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRidWZbMThdOwotI2lmbmRlZiBWTVMKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSAgY2hhciAqcG50OwotICB0aW1lX3QgdGltZWI7Ci0gIHRpbWUgKCZ0aW1lYik7Ci0gIHBudCA9IGN0aW1lICgmdGltZWIpOwotICBwbnRbM10gPSAwOwotICBwbnRbN10gPSAwOwotICBwbnRbMTBdID0gMDsKLSAgcG50WzE2XSA9IDA7Ci0gIHBudFsyNF0gPSAwOwotICBzcHJpbnRmICh0YnVmLCAiJTJzLSUzcy0lcyAlcyIsIHBudCArIDgsIHBudCArIDQsIHBudCArIDIwLCBwbnQgKyAxMSk7Ci0jZWxzZQotI2luY2x1ZGUgPHN0YXJsZXQuaD4KLSAgc3RydWN0Ci0gIHsKLSAgICBpbnQgU2l6ZTsKLSAgICB1bnNpZ25lZCBjaGFyICpQdHI7Ci0gIH0gRGVzY3JpcHRvcjsKLSAgRGVzY3JpcHRvci5TaXplID0gMTc7Ci0gIERlc2NyaXB0b3IuUHRyID0gdGJ1ZjsKLSAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwotI2VuZGlmIC8qIG5vdCBWTVMgKi8KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXN0aW1lc3RyaW5nOiclcydcbiIsIHRidWYpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRidWY7Ci19Ci0KLQotLyogd3JpdGUgb2JqZWN0IGhlYWRlciBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICBhc3ltYm9sICpzeW1ib2w7Ci0gIHVuc2lnbmVkIGludCBzeW1udW07Ci0gIGludCBoYWRfY2FzZSA9IDA7Ci0gIGludCBoYWRfZmlsZSA9IDA7Ci0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfaGRyICglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgMik7Ci0KLSAgLyogTUhEICovCi0KLSAgaWYgKG9ianR5cGUgPT0gT0JKX1NfQ19IRFIpCi0gICAgewotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX01IRCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIEVPQkpfU19DX1NUUkxWTCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgTUFYX09VVFJFQ19TSVpFKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgLyogc3RyaXAgcGF0aCBhbmQgc3VmZml4IGluZm9ybWF0aW9uICovCi0KLSAgICAgIGNoYXIgKmZuYW1lLCAqZm91dCwgKmZwdHI7Ci0KLSAgICAgIGZwdHIgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICAgIGZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGZwdHIpICsgMSk7Ci0gICAgICBzdHJjcHkgKGZuYW1lLCBmcHRyKTsKLSAgICAgIGZvdXQgPSBzdHJyY2hyIChmbmFtZSwgJ10nKTsKLSAgICAgIGlmIChmb3V0ID09IDApCi0JZm91dCA9IHN0cmNociAoZm5hbWUsICc6Jyk7Ci0gICAgICBpZiAoZm91dCAhPSAwKQotCWZvdXQrKzsKLSAgICAgIGVsc2UKLQlmb3V0ID0gZm5hbWU7Ci0KLSAgICAgIC8qIHN0cmlwIC5vYmogc3VmZml4ICAqLwotCi0gICAgICBmcHRyID0gc3RycmNociAoZm5hbWUsICcuJyk7Ci0gICAgICBpZiAoKGZwdHIgIT0gMCkKLQkgICYmIChzdHJjYXNlY21wIChmcHRyLCAiLk9CSiIpID09IDApKQotCSpmcHRyID0gMDsKLQotICAgICAgZnB0ciA9IGZvdXQ7Ci0gICAgICB3aGlsZSAoKmZwdHIgIT0gMCkKLQl7Ci0JICBpZiAoaXNsb3dlciAoKmZwdHIpKQotCSAgICAqZnB0ciA9IHRvdXBwZXIgKCpmcHRyKTsKLQkgIGZwdHIrKzsKLQkgIGlmICgoKmZwdHIgPT0gJzsnKQotCSAgICAgfHwgKChmcHRyIC0gZm91dCkgPiAzMSkpCi0JICAgICpmcHRyID0gMDsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZm91dCk7Ci0gICAgfQotICBlbHNlCi0gICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsICJOT05BTUUiKTsKLQotICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgQkZEX1ZFUlNJT04pOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgZ2V0X3Ztc190aW1lX3N0cmluZyAoKSwgMTcpOwotICBfYmZkX3Ztc19vdXRwdXRfZmlsbCAoYWJmZCwgMCwgMTcpOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIExNTiAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0xOTSk7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJHQVMgcHJvR0lTIiwgMTApOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIFNSQyAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1NSQyk7Ci0KLSAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBhYmZkLT5zeW1jb3VudDsgc3ltbnVtKyspCi0gICAgewotICAgICAgc3ltYm9sID0gYWJmZC0+b3V0c3ltYm9sc1tzeW1udW1dOwotCi0gICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9GSUxFKQotCXsKLQkgIGlmIChzdHJuY21wICgoY2hhciAqKXN5bWJvbC0+bmFtZSwgIjxDQVNFOiIsIDYpID09IDApCi0JICAgIHsKLQkgICAgICBQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSA9IHN5bWJvbC0+bmFtZVs2XSAtICcwJzsKLQkgICAgICBQUklWKGZsYWdfc2hvd19hZnRlcl90cnVuYykgPSBzeW1ib2wtPm5hbWVbN10gLSAnMCc7Ci0KLQkgICAgICBpZiAoaGFkX2ZpbGUpCi0JCWJyZWFrOwotCSAgICAgIGhhZF9jYXNlID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKilzeW1ib2wtPm5hbWUsIHN0cmxlbiAoc3ltYm9sLT5uYW1lKSk7Ci0JICBpZiAoaGFkX2Nhc2UpCi0JICAgIGJyZWFrOwotCSAgaGFkX2ZpbGUgPSAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKHN5bW51bSA9PSBhYmZkLT5zeW1jb3VudCkKLSAgICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikibm9uYW1lIiwgNik7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBUVEwgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19UVEwpOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiVFRMIiwgMyk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogQ1BSICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfQ1BSKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsCi0JCQkgKHVuc2lnbmVkIGNoYXIgKikiR05VIEJGRCBwb3J0ZWQgYnkgS2xhdXMgS+RtcGYgMTk5NC0xOTk2IiwKLQkJCSAzOSk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBQcm9jZXNzIEVPTS9FRU9NIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfZW9tIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZygyLCAiRU9NL0VFT01cbiIpOwotI2VuZGlmCi0KLSAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7Ci0KLSAgaWYgKChvYmp0eXBlID09IE9CSl9TX0NfRU9NKSAKLSAgICAgfHwgKG9ianR5cGUgPT0gT0JKX1NfQ19FT01XKSkKLSAgICB7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2xfdG90YWxfbHBzID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDQpOwotICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2JfY29tY29kID0gKih2bXNfcmVjICsgOCk7Ci0gICAgICBpZiAoUFJJVihlb21fZGF0YSkuZW9tX2JfY29tY29kID4gMSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IGZhbHNlOwotICAgICAgaWYgKFBSSVYocmVjX3NpemUpID4gMTApCi0JewotCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSB0cnVlOwotCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX3RmcmZsZyA9ICoodm1zX3JlYyArIDkpOwotCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3BzaW5keCA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2xfdGZyYWRyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKLQotCSAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHI7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogV3JpdGUgZW9tIHJlY29yZCBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZW9tICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgb2JqdHlwZSwgLTEpOwotICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKFBSSVYodm1zX2xpbmthZ2VfaW5kZXgpID4+IDEpKTsKLSAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBjb21wbGV0aW9uIGNvZGUgKi8KLSAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBmaWxsIGJ5dGUgKi8KLQotICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSAhPSAoYmZkX3ZtYSktMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpbmsiKTsKLSAgICAgIGlmIChzZWN0aW9uID09IDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykoc2VjdGlvbi0+aW5kZXgpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJICAgICAodW5zaWduZWQgbG9uZykgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0gICAgfQotCi0gIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMtbWlzYy5jIGIvYmZkL3Ztcy1taXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMTE5MmMuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy1taXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ2ICswLDAgQEAKLS8qIHZtcy1taXNjLmMgLS0gTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgVk1TX0RFQlVHCi0vKiBkZWJ1ZyBmdW5jdGlvbnMgKi8KLQotLyogZGVidWcgZnVuY3Rpb24gZm9yIGFsbCB2bXMgZXh0ZW5zaW9ucwotICAgZXZhbHVhdGVzIGVudmlyb25tZW50IHZhcmlhYmxlIFZNU19ERUJVRyBmb3IgYQotICAgbnVtZXJpY2FsIHZhbHVlIG9uIHRoZSBmaXJzdCBjYWxsCi0gICBhbGwgZXJyb3IgbGV2ZWxzIGJlbG93IHRoaXMgdmFsdWUgYXJlIHByaW50ZWQKLSAgCi0gICBsZXZlbHM6Ci0gICAxCXRvcGxldmVsIGJmZCBjYWxscyAoZnVuY3Rpb25zIGZyb20gdGhlIGJmZCB2ZWN0b3IpCi0gICAyCWZ1bmN0aW9ucyBjYWxsZWQgYnkgYmZkIGNhbGxzCi0gICAuLi4KLSAgIDkJYWxtb3N0IGV2ZXJ5dGhpbmcKLQotICAgbGV2ZWwgaXMgYWxzbyBpZGVudGF0aW9uIGxldmVsLiBJbmRlbnRhdGlvbiBpcyBwZXJmb3JtZWQKLSAgIGlmIGxldmVsID4gMAotCSovCi0KLSNpZiBfX1NURENfXwotdm9pZAotX2JmZF92bXNfZGVidWcgKGludCBsZXZlbCwgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHN0YXRpYyBpbnQgbWluX2xldmVsID0gLTE7Ci0gIHN0YXRpYyBGSUxFICpvdXRwdXQgPSBOVUxMOwotICBjaGFyICplcHRyOwotICB2YV9saXN0IGFyZ3M7Ci0gIGludCBhYnNsdmwgPSAobGV2ZWwgPiAwKT9sZXZlbDotbGV2ZWw7Ci0KLSAgaWYgKG1pbl9sZXZlbCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoKGVwdHIgPSBnZXRlbnYoIlZNU19ERUJVRyIpKSAhPSBOVUxMKQotCXsKLQkgIG1pbl9sZXZlbCA9IGF0b2koZXB0cik7Ci0JICBvdXRwdXQgPSBzdGRlcnI7Ci0JfQotICAgICAgZWxzZQotCW1pbl9sZXZlbCA9IDA7Ci0gICAgfQotICBpZiAob3V0cHV0ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBpZiAoYWJzbHZsID4gbWluX2xldmVsKQotICAgIHJldHVybjsKLQotICB3aGlsZSgtLWxldmVsPjApCi0gICAgZnByaW50ZihvdXRwdXQsICIgIik7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gIHZmcHJpbnRmKG91dHB1dCwgZm9ybWF0LCBhcmdzKTsKLSAgZmZsdXNoKG91dHB1dCk7Ci0gIHZhX2VuZChhcmdzKTsKLQotICByZXR1cm47Ci19Ci0KLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotCi12b2lkCi1fYmZkX3Ztc19kZWJ1ZyAobGV2ZWwsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikKLSAgICAgaW50IGxldmVsOwotICAgICBjaGFyICpmb3JtYXQ7Ci0gICAgIGxvbmcgYTE7IGxvbmcgYTI7IGxvbmcgYTM7Ci0gICAgIGxvbmcgYTQ7IGxvbmcgYTU7IGxvbmcgYTY7Ci17Ci0gIHN0YXRpYyBpbnQgbWluX2xldmVsID0gLTE7Ci0gIHN0YXRpYyBGSUxFICpvdXRwdXQgPSBOVUxMOwotICBjaGFyICplcHRyOwotCi0gIGlmIChtaW5fbGV2ZWwgPT0gLTEpCi0gICAgewotICAgICAgaWYgKChlcHRyID0gZ2V0ZW52KCJWTVNfREVCVUciKSkgIT0gTlVMTCkKLQl7Ci0JICBtaW5fbGV2ZWwgPSBhdG9pKGVwdHIpOwotCSAgb3V0cHV0ID0gc3RkZXJyOwotCX0KLSAgICAgIGVsc2UKLQltaW5fbGV2ZWwgPSAwOwotICAgIH0KLSAgaWYgKG91dHB1dCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgaWYgKGxldmVsID4gbWluX2xldmVsKQotICAgIHJldHVybjsKLQotICB3aGlsZSgtLWxldmVsPjApCi0gICAgZnByaW50ZihvdXRwdXQsICIgIik7Ci0gIGZwcmludGYob3V0cHV0LCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwotICBmZmx1c2gob3V0cHV0KTsKLQotICByZXR1cm47Ci19Ci0jZW5kaWYgLyogX19TVERDX18gKi8KLQotCi0vKiBhIGRlYnVnIGZ1bmN0aW9uCi0gICBoZXggZHVtcCAnc2l6ZScgYnl0ZXMgc3RhcnRpbmcgYXQgJ3B0cicgICovCi0KLXZvaWQKLV9iZmRfaGV4ZHVtcCAobGV2ZWwsIHB0ciwgc2l6ZSwgb2Zmc2V0KQotICAgICBpbnQgbGV2ZWw7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBvZmZzZXQ7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmxwdHIgPSBwdHI7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGxvbmcgc3RhcnQgPSBvZmZzZXQ7Ci0KLSAgd2hpbGUgKHNpemUtLSA+IDApCi0gICAgewotICAgICAgaWYgKChjb3VudCUxNikgPT0gMCkKLQl2bXNfZGVidWcgKGxldmVsLCAiJTA4bHg6Iiwgc3RhcnQpOwotICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIgJTAyeCIsICpwdHIrKyk7Ci0gICAgICBjb3VudCsrOwotICAgICAgc3RhcnQrKzsKLSAgICAgIGlmIChzaXplID09IDApCi0JewotCSAgd2hpbGUgKChjb3VudCUxNikgIT0gMCkKLQkgICAgewotCSAgICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiICAgIik7Ci0JICAgICAgY291bnQrKzsKLQkgICAgfQotCX0KLSAgICAgIGlmICgoY291bnQlMTYpID09IDApCi0JewotCSAgdm1zX2RlYnVnICgtbGV2ZWwsICIgIik7Ci0JICB3aGlsZSAobHB0ciA8IHB0cikKLQkgICAgewotCSAgICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiJWMiLCAoKmxwdHIgPCAzMik/Jy4nOipscHRyKTsKLQkgICAgICBscHRyKys7Ci0JICAgIH0KLQkgIHZtc19kZWJ1ZyAoLWxldmVsLCAiXG4iKTsKLQl9Ci0gICAgfQotICBpZiAoKGNvdW50JTE2KSAhPSAwKQotICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiXG4iKTsKLQotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotDAotLyogaGFzaCBmdW5jdGlvbnMKLQotICAgVGhlc2UgYXJlIG5lZWRlZCB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICAqLwotCi0vKiBhbGxvY2F0ZSBuZXcgdm1zX2hhc2hfZW50cnkKLSAgIGtlZXAgdGhlIHN5bWJvbCBuYW1lIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGJmZCBzeW1ib2wgaW4gdGhlIHRhYmxlICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF92bXNfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICB2bXNfc3ltYm9sX2VudHJ5ICpyZXQ7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg1LCAiX2JmZF92bXNfaGFzaF9uZXdmdW5jKCVwLCAlcCwgJXMpXG4iLCBlbnRyeSwgdGFibGUsIHN0cmluZyk7Ci0jZW5kaWYKLQotICBpZiAoZW50cnkgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKU5VTEwpCi0gICAgewotICAgICAgcmV0ID0gKHZtc19zeW1ib2xfZW50cnkgKikKLQkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAodm1zX3N5bWJvbF9lbnRyeSkpOwotICAgICAgaWYgKHJldCA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilOVUxMOwotCX0KLSAgICAgIGVudHJ5ID0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0gICAgfQotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLQotICByZXQgPSAodm1zX3N5bWJvbF9lbnRyeSAqKSBiZmRfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZyk7Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX2hhc2hfbmV3ZnVuYyByZXQgJXBcbiIsIHJldCk7Ci0jZW5kaWYKLQotICByZXQtPnN5bWJvbCA9IChhc3ltYm9sICopTlVMTDsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKXJldDsKLX0KLQotDAotLyogb2JqZWN0IGZpbGUgaW5wdXQgZnVuY3Rpb25zICovCi0KLS8qIFJldHVybiB0eXBlIGFuZCBsZW5ndGggZnJvbSByZWNvcmQgaGVhZGVyIChidWYpIG9uIEFscGhhLiAgKi8KLQotdm9pZAotX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIGJ1ZiwgdHlwZSwgbGVuZ3RoKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgKnR5cGU7Ci0gICAgIGludCAqbGVuZ3RoOwotewotICBpZiAodHlwZSAhPSAwKQotICAgICp0eXBlID0gYmZkX2dldGwxNiAoYnVmKTsKLSAgYnVmICs9IDI7Ci0gIGlmIChsZW5ndGggIT0gMCkKLSAgICAqbGVuZ3RoID0gYmZkX2dldGwxNiAoYnVmKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEwLCAiX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgdHlwZSAleCwgbGVuZ3RoICV4XG4iLCAodHlwZT8qdHlwZTowKSwgKGxlbmd0aD8qbGVuZ3RoOjApKTsKLSNlbmRpZgotCi0KLSAgcmV0dXJuOwotfQotCi0KLS8qIEdldCBuZXh0IHJlY29yZCBmcm9tIG9iamVjdCBmaWxlIHRvIHZtc19idWYKLSAgIHNldCBQUklWKGJ1Zl9zaXplKSBhbmQgcmV0dXJuIGl0Ci0gIAotICAgdGhpcyBpcyBhIGxpdHRsZSB0cmlja3kgc2luY2UgaXQgc2hvdWxkIGJlIHBvcnRhYmxlLgotICAKLSAgIHRoZSBvcGVuVk1TIG9iamVjdCBmaWxlIGhhcyAndmFyaWFibGUgbGVuZ3RoJyB3aGljaCBtZWFucyB0aGF0Ci0gICByZWFkKCkgcmV0dXJucyBkYXRhIGluIGNodW5rcyBvZiAoaG9wZWZ1bGx5KSBjb3JyZWN0IGFuZCBleHBlY3RlZAotICAgc2l6ZS4gVGhlIGxpbmtlciAoYW5kIG90aGVyIHRvb2xzIG9uIHZtcykgZGVwZW5kIG9uIHRoYXQuIFVuaXggZG9lc24ndAotICAga25vdyBhYm91dCAnZm9ybWF0dGVkJyBmaWxlcywgc28gcmVhZGluZyBhbmQgd3JpdGluZyBzdWNoIGFuIG9iamVjdAotICAgZmlsZSBpbiBhIHVuaXggZW52aXJvbm1lbnQgaXMgbm90IHRyaXZpYWwuCi0gIAotICAgV2l0aCB0aGUgdG9vbCAnZmlsZScgKGF2YWlsYWJsZSBvbiBhbGwgdm1zIGZ0cCBzaXRlcyksIG9uZQotICAgY2FuIHZpZXcgYW5kIGNoYW5nZSB0aGUgYXR0cmlidXRlcyBvZiBhIGZpbGUuIENoYW5naW5nIGZyb20KLSAgICd2YXJpYWJsZSBsZW5ndGgnIHRvICdmaXhlZCBsZW5ndGgsIDUxMiBieXRlcycgcmV2ZWFscyB0aGUKLSAgIHJlY29yZCBsZW5ndGggYXQgdGhlIGZpcnN0IDIgYnl0ZXMgb2YgZXZlcnkgcmVjb3JkLiBUaGUgc2FtZQotICAgaGFwcGVucyBkdXJpbmcgdGhlIHRyYW5zZmVyIG9mIG9iamVjdCBmaWxlcyBmcm9tIHZtcyB0byB1bml4LAotICAgYXQgbGVhc3Qgd2l0aCB1Y3gsIGRlYydzIGltcGxlbWVudGF0aW9uIG9mIHRjcC9pcC4KLSAgCi0gICBUaGUgdm1zIGZvcm1hdCByZXBlYXRzIHRoZSBsZW5ndGggYXQgYnl0ZXMgMiAmIDMgb2YgZXZlcnkgcmVjb3JkLgotICAKLSAgIE9uIHRoZSBmaXJzdCBjYWxsIChmaWxlX2Zvcm1hdCA9PSBGRl9VTktOT1dOKSB3ZSBjaGVjayBpZgotICAgdGhlIGZpcnN0IGFuZCB0aGUgdGhpcmQgYnl0ZSBwYWlyICghKSBvZiB0aGUgcmVjb3JkIG1hdGNoLgotICAgSWYgdGhleSBkbyBpdCdzIGFuIG9iamVjdCBmaWxlIGluIGFuIHVuaXggZW52aXJvbm1lbnQgb3Igd2l0aAotICAgd3JvbmcgYXR0cmlidXRlcyAoRkZfRk9SRUlHTiksIGVsc2Ugd2Ugc2hvdWxkIGJlIGluIGEgdm1zCi0gICBlbnZpcm9ubWVudCB3aGVyZSByZWFkKCkgcmV0dXJucyB0aGUgcmVjb3JkIHNpemUgKEZGX05BVElWRSkuCi0gIAotICAgcmVhZGluZyBpcyBhbHdheXMgZG9uZSBpbiAyIHN0ZXBzLgotICAgZmlyc3QganVzdCB0aGUgcmVjb3JkIGhlYWRlciBpcyByZWFkIGFuZCB0aGUgbGVuZ3RoIGV4dHJhY3RlZAotICAgYnkgZ2V0X2hlYWRlcl92YWx1ZXMKLSAgIHRoZW4gdGhlIHJlYWQgYnVmZmVyIGlzIGFkanVzdGVkIGFuZCB0aGUgcmVtYWluaW5nIGJ5dGVzIGFyZQotICAgcmVhZCBpbi4KLSAgCi0gICBhbGwgZmlsZSBpL28gaXMgYWx3YXlzIGRvbmUgb24gZXZlbiBmaWxlIHBvc2l0aW9ucyAgKi8KLQotaW50Ci1fYmZkX3Ztc19nZXRfcmVjb3JkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB0ZXN0X2xlbiwgdGVzdF9zdGFydCwgcmVtYWluaW5nOwotICB1bnNpZ25lZCBjaGFyICp2bXNfYnVmOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX2dldF9yZWNvcmRcbiIpOwotI2VuZGlmCi0KLSAgLyogbWluaW11bSBpcyA2IGJ5dGVzIG9uIEFscGhhCi0gICAgICgyIGJ5dGVzIGxlbmd0aCwgMiBieXRlcyByZWNvcmQgaWQsIDIgYnl0ZXMgbGVuZ3RoIHJlcGVhdGVkKQotCi0gICAgIG9uIFZBWCB0aGVyZSdzIG5vIGxlbmd0aCBpbmZvcm1hdGlvbiBpbiB0aGUgcmVjb3JkCi0gICAgIHNvIHN0YXJ0IHdpdGggT0JKX1NfQ19NQVhSRUNTSVogICovCi0KLSAgaWYgKFBSSVYoYnVmX3NpemUpID09IDApCi0gICAgewotICAgICAgaWYgKFBSSVYoaXNfdmF4KSkKLQl7Ci0JICBQUklWKHZtc19idWYpID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jIChPQkpfU19DX01BWFJFQ1NJWik7Ci0JICBQUklWKGJ1Zl9zaXplKSA9IE9CSl9TX0NfTUFYUkVDU0laOwotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9WQVg7Ci0JfQotICAgICAgZWxzZQotCVBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKDYpOwotICAgIH0KLQotICB2bXNfYnVmID0gUFJJVih2bXNfYnVmKTsKLQotICBpZiAodm1zX2J1ZiA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzd2l0Y2ggKFBSSVYoZmlsZV9mb3JtYXQpKQotICAgIHsKLSAgICAgIGNhc2UgRkZfVU5LTk9XTjoKLSAgICAgIGNhc2UgRkZfRk9SRUlHTjoKLQl0ZXN0X2xlbiA9IDY7CQkJLyogcHJvYmUgNiBieXRlcyAqLwotCXRlc3Rfc3RhcnQgPSAyOwkJCS8qIHdoZXJlIHRoZSByZWNvcmQgc3RhcnRzICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBGRl9OQVRJVkU6Ci0JdGVzdF9sZW4gPSA0OwotCXRlc3Rfc3RhcnQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRkZfVkFYOgotCXRlc3RfbGVuID0gMDsKLQl0ZXN0X3N0YXJ0ID0gMDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogc2tpcCBvZGQgYWxpZ25tZW50IGJ5dGUgICovCi0KLSAgaWYgKGJmZF90ZWxsIChhYmZkKSAmIDEpCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkIChQUklWKHZtc19idWYpLCAxLCAxLCBhYmZkKSAhPSAxKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIC8qIHJlYWQgdGhlIHJlY29yZCBoZWFkZXIgb24gQWxwaGEuICAqLwotCi0gIGlmICgodGVzdF9sZW4gIT0gMCkKLSAgICAgICYmIChiZmRfcmVhZCAoUFJJVih2bXNfYnVmKSwgMSwgdGVzdF9sZW4sIGFiZmQpCi0JICAhPSAoYmZkX3NpemVfdHlwZSkgdGVzdF9sZW4pKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogY2hlY2sgZmlsZSBmb3JtYXQgb24gZmlyc3QgY2FsbCAgKi8KLQotICBpZiAoUFJJVihmaWxlX2Zvcm1hdCkgPT0gRkZfVU5LTk9XTikKLSAgICB7CQkJCQkJLyogcmVjb3JkIGxlbmd0aCByZXBlYXRzID8gKi8KLSAgICAgIGlmICggKHZtc19idWZbMF0gPT0gdm1zX2J1Zls0XSkKLSAgICAgICAgJiYgKHZtc19idWZbMV0gPT0gdm1zX2J1Zls1XSkpCi0JewotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9GT1JFSUdOOwkvKiBZOiBmb3JlaWduIGVudmlyb25tZW50ICovCi0JICB0ZXN0X3N0YXJ0ID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9OQVRJVkU7CS8qIE46IG5hdGl2ZSBlbnZpcm9ubWVudCAqLwotCSAgdGVzdF9zdGFydCA9IDA7Ci0JfQotICAgIH0KLQotICBpZiAoUFJJVihpc192YXgpKQotICAgIHsKLSAgICAgIFBSSVYocmVjX2xlbmd0aCkgPSBiZmRfcmVhZCAodm1zX2J1ZiwgMSwgUFJJVihidWZfc2l6ZSksIGFiZmQpOwotICAgICAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPD0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgUFJJVih2bXNfcmVjKSA9IHZtc19idWY7Ci0gICAgfQotICBlbHNlCQkvKiBBbHBoYSAgKi8KLSAgICB7Ci0gICAgICAvKiBleHRyYWN0IHZtcyByZWNvcmQgbGVuZ3RoICAqLwotCi0gICAgICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgdm1zX2J1Zit0ZXN0X3N0YXJ0LCBOVUxMLAotCQkJCSAgJlBSSVYocmVjX2xlbmd0aCkpOwotCi0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA8PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIHRoYXQncyB3aGF0IHRoZSBsaW5rZXIgbWFudWFsIHNheXMgICovCi0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpID4gRU9CSl9TX0NfTUFYUkVDU0laKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIGFkanVzdCB0aGUgYnVmZmVyICAqLwotCi0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA+IFBSSVYoYnVmX3NpemUpKQotCXsKLQkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSByZWFsbG9jICh2bXNfYnVmLCBQUklWKHJlY19sZW5ndGgpKTsKLQkgIHZtc19idWYgPSBQUklWKHZtc19idWYpOwotCSAgaWYgKHZtc19idWYgPT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgUFJJVihidWZfc2l6ZSkgPSBQUklWKHJlY19sZW5ndGgpOwotCX0KLQotICAgICAgLyogcmVhZCB0aGUgcmVtYWluaW5nIHJlY29yZCAgKi8KLQotICAgICAgcmVtYWluaW5nID0gUFJJVihyZWNfbGVuZ3RoKSAtIHRlc3RfbGVuICsgdGVzdF9zdGFydDsKLQotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgxMCwgImJmZF9yZWFkIHJlbWFpbmluZyAlZFxuIiwgcmVtYWluaW5nKTsKLSNlbmRpZgotICAgICAgaWYgKGJmZF9yZWFkICh2bXNfYnVmICsgdGVzdF9sZW4sIDEsIHJlbWFpbmluZywgYWJmZCkgIT0KLQkgIChiZmRfc2l6ZV90eXBlKSByZW1haW5pbmcpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIFBSSVYodm1zX3JlYykgPSB2bXNfYnVmICsgdGVzdF9zdGFydDsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxMSwgImJmZF9yZWFkIHJlY19sZW5ndGggJWRcbiIsIFBSSVYocmVjX2xlbmd0aCkpOwotI2VuZGlmCi0KLSAgcmV0dXJuIFBSSVYocmVjX2xlbmd0aCk7Ci19Ci0KLQotLyogZ2V0IG5leHQgdm1zIHJlY29yZCBmcm9tIGZpbGUKLSAgIHVwZGF0ZSB2bXNfcmVjIGFuZCByZWNfbGVuZ3RoIHRvIG5ldyAocmVtYWluaW5nKSB2YWx1ZXMgICovCi0KLWludAotX2JmZF92bXNfbmV4dF9yZWNvcmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfbmV4dF9yZWNvcmQgKGxlbiAlZCwgc2l6ZSAlZClcbiIsCi0JICAgICAgUFJJVihyZWNfbGVuZ3RoKSwgUFJJVihyZWNfc2l6ZSkpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPiAwKQotICAgIHsKLSAgICAgIFBSSVYodm1zX3JlYykgKz0gUFJJVihyZWNfc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKF9iZmRfdm1zX2dldF9yZWNvcmQgKGFiZmQpIDw9IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoUFJJVihpc192YXgpKQotICAgIHsKLSAgICAgIFBSSVYocmVjX3R5cGUpID0gKihQUklWKHZtc19yZWMpKTsKLSAgICAgIFBSSVYocmVjX3NpemUpID0gUFJJVihyZWNfbGVuZ3RoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgUFJJVih2bXNfcmVjKSwgJlBSSVYocmVjX3R5cGUpLAotCQkJCSAgJlBSSVYocmVjX3NpemUpKTsKLSAgICB9Ci0gIFBSSVYocmVjX2xlbmd0aCkgLT0gUFJJVihyZWNfc2l6ZSk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfbmV4dF9yZWNvcmQ6IHJlYyAlcCwgc2l6ZSAlZCwgbGVuZ3RoICVkLCB0eXBlICVkXG4iLAotCSAgICAgIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpLCBQUklWKHJlY19sZW5ndGgpLAotCSAgICAgIFBSSVYocmVjX3R5cGUpKTsKLSNlbmRpZgotCi0gIHJldHVybiBQUklWKHJlY190eXBlKTsKLX0KLQotCi0MCi0vKiBDb3B5IHNpemVkIHN0cmluZyAoc3RyaW5nIHdpdGggZml4ZWQgbGVuZ3RoKSB0byBuZXcgYWxsb2NhdGVkIGFyZWEKLSAgIHNpemUgaXMgc3RyaW5nIGxlbmd0aCAoc2l6ZSBvZiByZWNvcmQpICAqLwotCi1jaGFyICoKLV9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChzdHIsIHNpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnN0cjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNoYXIgKm5ld3N0ciA9IGJmZF9tYWxsb2MgKHNpemUgKyAxKTsKLQotICBpZiAobmV3c3RyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIHN0cm5jcHkgKG5ld3N0ciwgKGNoYXIgKilzdHIsIHNpemUpOwotICBuZXdzdHJbc2l6ZV0gPSAwOwotCi0gIHJldHVybiBuZXdzdHI7Ci19Ci0KLS8qIENvcHkgY291bnRlZCBzdHJpbmcgKHN0cmluZyB3aXRoIGxlbmd0aCBhdCBmaXJzdCBieXRlKSB0byBuZXcgYWxsb2NhdGVkIGFyZWEKLSAgIHB0ciBwb2ludHMgdG8gbGVuZ3RoIGJ5dGUgb24gZW50cnkgICovCi0KLWNoYXIgKgotX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIGludCBsZW4gPSAqcHRyKys7Ci0KLSAgcmV0dXJuIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIGxlbik7Ci19Ci0KLQwKLS8qIHN0YWNrIHJvdXRpbmVzIGZvciB2bXMgRVRJUiBjb21tYW5kcyAqLwotCi0vKiBQdXNoIHZhbHVlIGFuZCBzZWN0aW9uIGluZGV4ICAqLwotCi12b2lkCi1fYmZkX3Ztc19wdXNoIChhYmZkLCB2YWwsIHBzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbDsKLSAgICAgaW50IHBzZWN0OwotewotICBzdGF0aWMgaW50IGxhc3RfcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg0LCAiPHB1c2ggJTAxNmx4KCVkKSBhdCAlZD5cbiIsIHZhbCwgcHNlY3QsIFBSSVYoc3RhY2twdHIpKTsKLSNlbmRpZgotCi0gIGlmIChwc2VjdCA+PSAwKQotICAgIGxhc3RfcHNlY3QgPSBwc2VjdDsKLQotICBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkudmFsdWUgPSB2YWw7Ci0gIFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCA9IGxhc3RfcHNlY3Q7Ci0gIFBSSVYoc3RhY2twdHIpKys7Ci0gIGlmIChQUklWKHN0YWNrcHRyKSA+PSBTVEFDS1NJWkUpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrIG92ZXJmbG93ICglZCkgaW4gX2JmZF92bXNfcHVzaCIpLCBQUklWKHN0YWNrcHRyKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi0vKiBQb3AgdmFsdWUgYW5kIHNlY3Rpb24gaW5kZXggICovCi0KLXVxdWFkCi1fYmZkX3Ztc19wb3AgKGFiZmQsIHBzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCAqcHNlY3Q7Ci17Ci0gIHVxdWFkIHZhbHVlOwotCi0gIGlmIChQUklWKHN0YWNrcHRyKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjayB1bmRlcmZsb3cgaW4gX2JmZF92bXNfcG9wIikpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBQUklWKHN0YWNrcHRyKS0tOwotICB2YWx1ZSA9IFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS52YWx1ZTsKLSAgaWYgKChwc2VjdCAhPSBOVUxMKSAmJiAoUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0ID49IDApKQotICAgICpwc2VjdCA9IFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICI8cG9wICUwMTZseCglZCk+XG4iLCB2YWx1ZSwgUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0KTsKLSNlbmRpZgotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotDAotLyogb2JqZWN0IGZpbGUgb3V0cHV0IGZ1bmN0aW9ucyAqLwotCi0vKiBHQVMgdGVuZHMgdG8gd3JpdGUgc2VjdGlvbnMgaW4gbGl0dGxlIGNodW5rcyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgd2hpY2ggd2UgY2FuJ3QgdXNlIGRpcmVjdGx5LiBTbyB3ZSBzYXZlIHRoZSBsaXR0bGUgY2h1bmtzIGluIGxpbmtlZAotICAgbGlzdHMgKG9uZSBwZXIgc2VjdGlvbikgYW5kIHdyaXRlIHRoZW0gbGF0ZXIuICAqLwotCi0vKiBBZGQgYSBuZXcgdm1zX3NlY3Rpb24gc3RydWN0dXJlIHRvIHZtc19zZWN0aW9uX3RhYmxlCi0gICAtIGZvcndhcmQgY2hhaW5pbmcgLSAgKi8KLQotc3RhdGljIHZtc19zZWN0aW9uICoKLWFkZF9uZXdfY29udGVudHMgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotewotICB2bXNfc2VjdGlvbiAqc3B0ciwgKm5ld3B0cjsKLQotICBzcHRyID0gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbc2VjdGlvbi0+aW5kZXhdOwotICBpZiAoc3B0ciAhPSBOVUxMKQotICAgIHJldHVybiBzcHRyOwotCi0gIG5ld3B0ciA9ICh2bXNfc2VjdGlvbiAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHZtc19zZWN0aW9uKSk7Ci0gIGlmIChuZXdwdHIgPT0gKHZtc19zZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3B0ci0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIChpbnQpc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgaWYgKG5ld3B0ci0+Y29udGVudHMgPT0gKHVuc2lnbmVkIGNoYXIgKilOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuZXdwdHItPm9mZnNldCA9IDA7Ci0gIG5ld3B0ci0+c2l6ZSA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgbmV3cHRyLT5uZXh0ID0gMDsKLSAgUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbc2VjdGlvbi0+aW5kZXhdID0gbmV3cHRyOwotICByZXR1cm4gbmV3cHRyOwotfQotCi0KLS8qIFNhdmUgc2VjdGlvbiBkYXRhICYgb2Zmc2V0IHRvIGFuIHZtc19zZWN0aW9uIHN0cnVjdHVyZQotICAgdm1zX3NlY3Rpb25fdGFibGVbXSBob2xkcyB0aGUgdm1zX3NlY3Rpb24gY2hhaW4gICovCi0KLWJvb2xlYW4KLV9iZmRfc2F2ZV92bXNfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHZtc19zZWN0aW9uICpzcHRyOwotCi0gIGlmIChzZWN0aW9uLT5pbmRleCA+PSBWTVNfU0VDVElPTl9DT1VOVCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb3VudCA9PSAoYmZkX3NpemVfdHlwZSkwKQotICAgIHJldHVybiB0cnVlOwotICBzcHRyID0gYWRkX25ld19jb250ZW50cyAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChzcHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKHNwdHItPmNvbnRlbnRzICsgb2Zmc2V0LCBkYXRhLCAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogR2V0IHZtc19zZWN0aW9uIHBvaW50ZXIgdG8gc2F2ZWQgY29udGVudHMgZm9yIHNlY3Rpb24gIyBpbmRleCAgKi8KLQotdm1zX3NlY3Rpb24gKgotX2JmZF9nZXRfdm1zX3NlY3Rpb24gKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgaWYgKGluZGV4ID49ICBWTVNfU0VDVElPTl9DT1VOVCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2luZGV4XTsKLX0KLQotDAotLyogT2JqZWN0IG91dHB1dCByb3V0aW5lcyAgKi8KLQotLyogQmVnaW4gbmV3IHJlY29yZCBvciByZWNvcmQgaGVhZGVyCi0gICB3cml0ZSAyIGJ5dGVzIHJlY3R5cGUKLSAgIHdyaXRlIDIgYnl0ZXMgcmVjb3JkIGxlbmd0aCAoZmlsbGVkIGluIGF0IGZsdXNoKQotICAgd3JpdGUgMiBieXRlcyBoZWFkZXIgdHlwZSAob21taXR0ZWQgaWYgcmVjaGVhZCA9PSAtMSkgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgcmVjdHlwZSwgcmVjaGVhZCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcmVjdHlwZTsKLSAgICAgaW50IHJlY2hlYWQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9iZWdpbih0eXBlICVkLCBoZWFkICVkKVxuIiwgcmVjdHlwZSwKLQkgICAgICByZWNoZWFkKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCxyZWN0eXBlKTsKLQotICAvKiBzYXZlIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uIHRvIGZpbGwgaW4gbGVuZ2h0IGxhdGVyICAqLwotCi0gIGlmIChQUklWKHB1c2hfbGV2ZWwpID4gMCkKLSAgICBQUklWKGxlbmd0aF9wb3MpID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2JlZ2luOiBsZW5ndGhfcG9zID0gJWRcbiIsCi0JICAgICAgUFJJVihsZW5ndGhfcG9zKSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsMCk7CQkvKiBwbGFjZWhvbGRlciBmb3IgbGVuZ3RoICovCi0KLSAgaWYgKHJlY2hlYWQgIT0gLTEpCi0gICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLHJlY2hlYWQpOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBTZXQgcmVjb3JkL3N1YnJlY29yZCBhbGlnbm1lbnQgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIGFsaWdudG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGFsaWdudG87Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQoJWQpXG4iLCBhbGlnbnRvKTsKLSNlbmRpZgotCi0gIFBSSVYob3V0cHV0X2FsaWdubWVudCkgPSBhbGlnbnRvOwotICByZXR1cm47Ci19Ci0KLQotLyogUHJlcGFyZSBmb3Igc3VicmVjb3JkIGZpZWxkcyAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wdXNoKHB1c2hlZF9zaXplID0gJWQpXG4iLCBQUklWKG91dHB1dF9zaXplKSk7Ci0jZW5kaWYKLQotICBQUklWKHB1c2hfbGV2ZWwpKys7Ci0gIFBSSVYocHVzaGVkX3NpemUpID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBFbmQgb2Ygc3VicmVjb3JkIGZpZWxkcyAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXNfb3V0cHV0X3BvcChwdXNoZWRfc2l6ZSA9ICVkKVxuIiwgUFJJVihwdXNoZWRfc2l6ZSkpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLSAgUFJJVihsZW5ndGhfcG9zKSA9IDI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wb3A6IGxlbmd0aF9wb3MgPSAlZFxuIiwgUFJJVihsZW5ndGhfcG9zKSk7Ci0jZW5kaWYKLQotICBQUklWKHB1c2hlZF9zaXplKSA9IDA7Ci0gIFBSSVYocHVzaF9sZXZlbCktLTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIEZsdXNoIHVud3JpdHRlbiBvdXRwdXQsIGVuZHMgY3VycmVudCByZWNvcmQgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgcmVhbF9zaXplID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0gIGludCBhbGlnbmNvdW50OwotICBpbnQgbGVuZ3RoOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9mbHVzaChyZWFsX3NpemUgPSAlZCwgcHVzaGVkX3NpemUgJWQgYXQgbGVucG9zICVkKVxuIiwKLQkgICAgICByZWFsX3NpemUsIFBSSVYocHVzaGVkX3NpemUpLCBQUklWKGxlbmd0aF9wb3MpKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKHB1c2hfbGV2ZWwpID4gMCkKLSAgICBsZW5ndGggPSByZWFsX3NpemUgLSBQUklWKHB1c2hlZF9zaXplKTsKLSAgZWxzZQotICAgIGxlbmd0aCA9IHJlYWxfc2l6ZTsKLQotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuOwotICBhbGlnbmNvdW50ID0gKFBSSVYob3V0cHV0X2FsaWdubWVudCkKLQkJLSAobGVuZ3RoICUgUFJJVihvdXRwdXRfYWxpZ25tZW50KSkpICUgUFJJVihvdXRwdXRfYWxpZ25tZW50KTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJhbGlnbjogYWRkaW5nICVkIGJ5dGVzXG4iLCBhbGlnbmNvdW50KTsKLSNlbmRpZgotCi0gIHdoaWxlKGFsaWduY291bnQtLSA+IDApCi0gICAgewotICAgICAgUFJJVihvdXRwdXRfYnVmKVtyZWFsX3NpemUrK10gPSAwOwotI2lmIDAKLSAgICAgIC8qIHRoaXMgaXMgd2h5IEkgKmxvdmUqIHZtczogaW5jb25zaXN0ZW5jeSA6LX0KLQkgYWxpZ25tZW50IGlzIGFkZGVkIHRvIHRoZSBzdWJyZWNvcmQgbGVuZ3RoCi0JIGJ1dCBub3QgdG8gdGhlIHJlY29yZCBsZW5ndGggICovCi0gICAgICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCi0jZW5kaWYKLQlsZW5ndGgrKzsKLSAgICB9Ci0KLSAgLyogcHV0IGxlbmd0aCB0byBidWZmZXIgICovCi0gIFBSSVYob3V0cHV0X3NpemUpID0gUFJJVihsZW5ndGhfcG9zKTsKLSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAodW5zaWduZWQgaW50KWxlbmd0aCk7Ci0KLSAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPT0gMCkKLSAgICB7Ci0jaWZuZGVmIFZNUwotCS8qIHdyaXRlIGxlbmd0aCBmaXJzdCwgc2VlIEZGX0ZPUkVJR04gaW4gdGhlIGlucHV0IHJvdXRpbmVzICovCi0gICAgICBmd3JpdGUgKFBSSVYob3V0cHV0X2J1ZikrMiwgMiwgMSwgKEZJTEUgKilhYmZkLT5pb3N0cmVhbSk7Ci0jZW5kaWYKLSAgICAgIGZ3cml0ZSAoUFJJVihvdXRwdXRfYnVmKSwgcmVhbF9zaXplLCAxLCAoRklMRSAqKWFiZmQtPmlvc3RyZWFtKTsKLQotICAgICAgUFJJVihvdXRwdXRfc2l6ZSkgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFBSSVYob3V0cHV0X3NpemUpID0gcmVhbF9zaXplOwotICAgICAgUFJJVihwdXNoZWRfc2l6ZSkgPSBQUklWKG91dHB1dF9zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIEVuZCByZWNvcmQgb3V0cHV0ICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9lbmRcbiIpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogY2hlY2sgcmVtYWluaW5nIGJ1ZmZlciBzaXplCi0KLSAgIHJldHVybiB3aGF0J3MgbGVmdC4gICovCi0KLWludAotX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCBzaXplKQotICAgIGJmZCAqYWJmZDsKLSAgICBpbnQgc2l6ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2NoZWNrKCVkKVxuIiwgc2l6ZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gKE1BWF9PVVRSRUNfU0laRSAtIChQUklWKG91dHB1dF9zaXplKSArIHNpemUgKyBNSU5fT1VUUkVDX0xVRlQpKTsKLX0KLQotCi0vKiBPdXRwdXQgYnl0ZSAoOCBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYnl0ZSglMDJ4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF84IChhYmZkLCB2YWx1ZSAmIDB4ZmYsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDE7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgc2hvcnQgKDE2IGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKCUwNHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSAmIDB4ZmZmZiwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gMjsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBsb25nICgzMiBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2xvbmcgKCUwOGx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDQ7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgcXVhZCAoNjQgYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfcXVhZCglMDE2bHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzY0KGFiZmQsIHZhbHVlLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSA4OwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IGMtc3RyaW5nIGFzIGNvdW50ZWQgc3RyaW5nICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqdmFsdWU7Ci17Ci1pbnQgbGVuOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9jb3VudGVkKCVzKVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgbGVuID0gc3RybGVuICh2YWx1ZSk7Ci0gIGlmIChsZW4gPT0gMCkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIl9iZmRfdm1zX291dHB1dF9jb3VudGVkIGNhbGxlZCB3aXRoIHplcm8gYnl0ZXMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAobGVuID4gMjU1KQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggdG9vIG1hbnkgYnl0ZXMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgbGVuICYgMHhmZik7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKXZhbHVlLCBsZW4pOwotfQotCi0KLS8qIE91dHB1dCBjaGFyYWN0ZXIgYXJlYSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGRhdGEsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICBpbnQgbGVuZ3RoOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZHVtcCglZClcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuOwotCi0gIG1lbWNweSAoUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpLCBkYXRhLCBsZW5ndGgpOwotICBQUklWKG91dHB1dF9zaXplKSArPSBsZW5ndGg7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBjb3VudCBieXRlcyBvZiB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2ZpbGwgKGFiZmQsIHZhbHVlLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGludCBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2ZpbGwodmFsICUwMnggdGltZXMgJWQpXG4iLCB2YWx1ZSwgY291bnQpOwotI2VuZGlmCi0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuOwotICBtZW1zZXQgKFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSwgdmFsdWUsIGNvdW50KTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gY291bnQ7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiB0aGlzIGhhc2ggcm91dGluZSBib3Jyb3dlZCBmcm9tIEdOVS1FTUFDUywgYW5kIHN0cmVuZ3RoZW5lZCBzbGlnaHRseSAgRVJZKi8KLQotc3RhdGljIGludAotaGFzaF9zdHJpbmcgKHB0cikKLSAgICAgY29uc3QgY2hhciAqcHRyOwotewotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOwotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBwICsgc3RybGVuIChwdHIpOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGludCBoYXNoID0gMDsKLQotICB3aGlsZSAocCAhPSBlbmQpCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBoYXNoID0gKChoYXNoIDw8IDMpICsgKGhhc2ggPDwgMTUpICsgKGhhc2ggPj4gMjgpICsgYyk7Ci0gICAgfQotICByZXR1cm4gaGFzaDsKLX0KLQotLyogR2VuZXJhdGUgYSBsZW5ndGgtaGFzaGVkIFZNUyBzeW1ib2wgbmFtZSAobGltaXRlZCB0byBtYXhsZW4gY2hhcnMpLiAgKi8KLQotY2hhciAqCi1fYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIGluLCBtYXhsZW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqaW47Ci0gICAgIGludCBtYXhsZW47Ci17Ci0gIGxvbmcgaW50IHJlc3VsdDsKLSAgaW50IGluX2xlbjsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIGNvbnN0IGNoYXIgKm9sZF9uYW1lOwotICBpbnQgaTsKLSAgc3RhdGljIGNoYXIgb3V0YnVmW0VPQkpfU19DX1NZTVNJWisxXTsKLSAgY2hhciAqb3V0ID0gb3V0YnVmOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1Zyg0LCAiX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIFwiJXNcIlxuIiwgaW4pOwotI2VuZGlmCi0KLSAgaWYgKG1heGxlbiA+IEVPQkpfU19DX1NZTVNJWikKLSAgICBtYXhsZW4gPSBFT0JKX1NfQ19TWU1TSVo7Ci0KLSAgbmV3X25hbWUgPSBvdXQ7CQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyLiAgKi8KLQotICAvKiBXZSBtYXkgbmVlZCB0byB0cnVuY2F0ZSB0aGUgc3ltYm9sLCBzYXZlIHRoZSBoYXNoIGZvciBsYXRlci4gICovCi0KLSAgaW5fbGVuID0gc3RybGVuIChpbik7Ci0KLSAgcmVzdWx0ID0gKGluX2xlbiA+IG1heGxlbikgPyBoYXNoX3N0cmluZyAoaW4pIDogMDsKLQotICBvbGRfbmFtZSA9IGluOwotCi0gIC8qIERvIHRoZSBsZW5ndGggY2hlY2tpbmcuICAqLwotCi0gIGlmIChpbl9sZW4gPD0gbWF4bGVuKQotICAgIHsKLSAgICAgIGkgPSBpbl9sZW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpKQotCWkgPSBtYXhsZW4tOTsKLSAgICAgIGVsc2UKLQlpID0gbWF4bGVuOwotICAgIH0KLQotICBzdHJuY3B5IChvdXQsIGluLCBpKTsKLSAgaW4gKz0gaTsKLSAgb3V0ICs9IGk7Ci0KLSAgaWYgKChpbl9sZW4gPiBtYXhsZW4pCi0gICAgICAmJiBQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSkKLSAgICBzcHJpbnRmIChvdXQsICJfJTA4bHgiLCByZXN1bHQpOwotICBlbHNlCi0gICAgKm91dCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDQsICItLT4gWyVkXVwiJXNcIlxuIiwgc3RybGVuIChvdXRidWYpLCBvdXRidWYpOwotI2VuZGlmCi0KLSAgaWYgKGluX2xlbiA+IG1heGxlbgotCSYmIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JJiYgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpKQotICAgIHByaW50ZiAoXygiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iKSwgb2xkX25hbWUsIG5ld19uYW1lKTsKLQotICByZXR1cm4gb3V0YnVmOwotfQotCi0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLW5ld19zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXN5bWJvbCAqc3ltYm9sOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg3LCAgIm5ld19zeW1ib2wgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0KLSAgc3ltYm9sID0gX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3ltYm9sID09IDApCi0gICAgcmV0dXJuIHN5bWJvbDsKLSAgc3ltYm9sLT5uYW1lID0gbmFtZTsKLSAgc3ltYm9sLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQkZEX1VORF9TRUNUSU9OX05BTUUpOwotCi0gIHJldHVybiBzeW1ib2w7Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGVudGVyIGEgbmV3IHByaXZhdGUgc3ltYm9sLiAgKi8KLQotdm1zX3N5bWJvbF9lbnRyeSAqCi1fYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDYsICAiX2JmZF92bXNfZW50ZXJfc3ltYm9sICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotCi0gIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKikKLQkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGVudHJ5ID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDgsICAiY3JlYXRpbmcgaGFzaCBlbnRyeSBmb3IgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0gICAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoZW50cnkgIT0gMCkKLQl7Ci0JICBhc3ltYm9sICpzeW1ib2w7Ci0JICBzeW1ib2wgPSBuZXdfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzeW1ib2wgIT0gMCkKLQkgICAgewotCSAgICAgIGVudHJ5LT5zeW1ib2wgPSBzeW1ib2w7Ci0JICAgICAgUFJJVihnc2Rfc3ltX2NvdW50KSsrOwotCSAgICAgIGFiZmQtPnN5bWNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZW50cnkgPSAwOwotCX0KLSAgICAgIGVsc2UKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oImZhaWxlZCB0byBlbnRlciAlcyIpLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoOCwgICJmb3VuZCBoYXNoIGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDcsICItPiBlbnRyeSAlcCwgZW50cnktPnN5bWJvbCAlcFxuIiwgZW50cnksIGVudHJ5LT5zeW1ib2wpOwotI2VuZGlmCi0gIHJldHVybiBlbnRyeTsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMtdGlyLmMgYi9iZmQvdm1zLXRpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRiMWIzLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMtdGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDg3ICswLDAgQEAKLS8qIHZtcy10aXIuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVElSIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIEVUSVIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotCi0gICBnbyBhbmQgcmVhZCB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsIChlc3AuIGFwcGVuZGl4IEIpCi0gICBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0J3MgZ29pbmcgb24gaGVyZSA6LSkKLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHlwZSBhYmJyZXZpYXRpb25zIGFyZSB1c2VkOgotCi0JY3MJY291bnRlZCBzdHJpbmcgKGFzY2lpIHN0cmluZyB3aXRoIGxlbmd0aCBieXRlKQotCWJ5CWJ5dGUgKDEgYnl0ZSkKLQlzaAlzaG9ydCAoMiBieXRlLCAxNiBiaXQpCi0JbHcJbG9uZ3dvcmQgKDQgYnl0ZSwgMzIgYml0KQotCXF3CXF1YWR3b3JkICg4IGJ5dGUsIDY0IGJpdCkKLQlkYQlkYXRhIHN0cmVhbSAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotc3RhdGljIHZvaWQgaW1hZ2Vfc2V0X3B0ciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBwc2VjdCwgdXF1YWQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV9pbmNfcHRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgdXF1YWQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV9kdW1wIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfYiBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfdyBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfbCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgdmFsdWUpKTsKLXN0YXRpYyB2b2lkIGltYWdlX3dyaXRlX3EgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCB2YWx1ZSkpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotY2hlY2tfc2VjdGlvbiAoYWJmZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IG9mZnNldDsKLQotICBvZmZzZXQgPSBQUklWKGltYWdlX3B0cikgLSBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50czsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSAob2Zmc2V0ICsgc2l6ZSkgPiBQUklWKGltYWdlX3NlY3Rpb24pLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMgPSBiZmRfcmVhbGxvYyAoUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMsIG9mZnNldCArIHNpemUpOwotICAgICAgaWYgKFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzID09IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJObyBNZW0gISIpKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBQUklWKGltYWdlX3NlY3Rpb24pLT5fcmF3X3NpemUgPSBvZmZzZXQgKyBzaXplOwotICAgICAgUFJJVihpbWFnZV9wdHIpID0gUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMgKyBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiByb3V0aW5lcyB0byBmaWxsIHNlY3Rpb25zIGNvbnRlbnRzIGR1cmluZyB0aXIvZXRpciByZWFkICovCi0KLS8qIEluaXRpYWxpemUgaW1hZ2UgYnVmZmVyIHBvaW50ZXIgdG8gYmUgZmlsbGVkICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfc2V0X3B0ciAoYWJmZCwgcHNlY3QsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcHNlY3Q7Ci0gICAgIHVxdWFkIG9mZnNldDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJpbWFnZV9zZXRfcHRyICglZD0lcywgJWQpXG4iLAotCQlwc2VjdCwgUFJJVihzZWN0aW9ucylbcHNlY3RdLT5uYW1lLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgUFJJVihpbWFnZV9wdHIpID0gUFJJVihzZWN0aW9ucylbcHNlY3RdLT5jb250ZW50cyArIG9mZnNldDsKLSAgUFJJVihpbWFnZV9zZWN0aW9uKSA9IFBSSVYoc2VjdGlvbnMpW3BzZWN0XTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIEluY3JlbWVudCBpbWFnZSBidWZmZXIgcG9pbnRlciBieSBvZmZzZXQgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV9pbmNfcHRyIChhYmZkLCBvZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgb2Zmc2V0OwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImltYWdlX2luY19wdHIgKCVkKVxuIiwgb2Zmc2V0KTsKLSNlbmRpZgotCi0gIFBSSVYoaW1hZ2VfcHRyKSArPSBvZmZzZXQ7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIER1bXAgbXVsdGlwbGUgYnl0ZXMgdG8gc2VjdGlvbiBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX2R1bXAgKGFiZmQsIHB0ciwgc2l6ZSwgb2Zmc2V0KQotICAgIGJmZCAqYWJmZDsKLSAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgaW50IHNpemU7Ci0gICAgaW50IG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoOCwgImltYWdlX2R1bXAgZnJvbSAoJXAsICVkKSB0byAoJXApXG4iLCBwdHIsIHNpemUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIF9iZmRfaGV4ZHVtcCAoOSwgcHRyLCBzaXplLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCBzaXplKSkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUgKHNpemUtLSA+IDApCi0gICAgKlBSSVYoaW1hZ2VfcHRyKSsrID0gKnB0cisrOwotICByZXR1cm47Ci19Ci0KLQotLyogV3JpdGUgYnl0ZSB0byBzZWN0aW9uIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX2IoJTAyeClcbiIsIChpbnQpdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCAxKSkKLSAgICByZXR1cm47Ci0KLSAgKlBSSVYoaW1hZ2VfcHRyKSsrID0gKHZhbHVlICYgMHhmZik7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSAyLWJ5dGUgd29yZCB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX3cgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDYsICJpbWFnZV93cml0ZV93KCUwNHgpXG4iLCAoaW50KXZhbHVlKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKGlzX3ZheCkgJiYgY2hlY2tfc2VjdGlvbiAoYWJmZCwgMikpCi0gICAgcmV0dXJuOwotCi0gIGJmZF9wdXRsMTYgKHZhbHVlLCBQUklWKGltYWdlX3B0cikpOwotICBQUklWKGltYWdlX3B0cikgKz0gMjsKLQotICByZXR1cm47Ci19Ci0KLQotLyogV3JpdGUgNC1ieXRlIGxvbmcgdG8gaW1hZ2UgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV93cml0ZV9sIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX2wgKCUwOGx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCA0KSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGwzMiAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSA0OwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSA4LWJ5dGUgcXVhZCB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX3EgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX3EgKCUwMTZseClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKGlzX3ZheCkgJiYgY2hlY2tfc2VjdGlvbiAoYWJmZCwgOCkpCi0gICAgcmV0dXJuOwotCi0gIGJmZF9wdXRsNjQgKHZhbHVlLCBQUklWKGltYWdlX3B0cikpOwotICBQUklWKGltYWdlX3B0cikgKz0gODsKLQotICByZXR1cm47Ci19Ci0MCi0KLSNkZWZpbmUgSElHSEJJVChvcCkgKChvcCAmIDB4ODAwMDAwMDBMKSA9PSAweDgwMDAwMDAwTCkKLQotLyogZXRpcl9zdGEKLSAgCi0gICB2bXMgc3RhY2sgY29tbWFuZHMKLSAgCi0gICBoYW5kbGUgc3RhX3h4eCBjb21tYW5kcyBpbiBldGlyIHNlY3Rpb24KLSAgIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICAKLSAgIHNlZSB0YWJsZSBCLTggb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RhIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YSAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIHN0YWNrICovCi0KLSAgICAgIC8qIHN0YWNrIGdsb2JhbAotCSAgIGFyZzogY3MJc3ltYm9sIG5hbWUKLQotCSAgIHN0YWNrIDMyIGJpdCB2YWx1ZSBvZiBzeW1ib2wgKGhpZ2ggYml0cyBzZXQgdG8gMCkgICovCi0KLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX0dCTDoKLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCQkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgIkVUSVJfU19DX1NUQV9HQkw6IG5vIHN5bWJvbCBcIiVzXCJcbiIsIG5hbWUpOwotI2VuZGlmCi0JICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKTAsIC0xKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSksIC0xKTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0JLyogc3RhY2sgbG9uZ3dvcmQKLQkgICBhcmc6IGx3CXZhbHVlCi0KLQkgICBzdGFjayAzMiBiaXQgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDY0IGJpdCAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfTFc6Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKWJmZF9nZXRsMzIgKHB0ciksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0JLyogc3RhY2sgZ2xvYmFsCi0JICAgYXJnOiBxdwl2YWx1ZQotCi0JICAgc3RhY2sgNjQgYml0IHZhbHVlIG9mIHN5bWJvbAkgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfUVc6Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKWJmZF9nZXRsNjQocHRyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0Ci0JICAgYXJnOiBsdwlzZWN0aW9uIGluZGV4Ci0JICAJcXcJc2lnbmVkIHF1YWR3b3JkIG9mZnNldCAobG93IDMyIGJpdHMpCi0KLQkgICBzdGFjayBxdyBhcmd1bWVudCBhbmQgc2VjdGlvbiBpbmRleAotCSAgIChzZWUgRVRJUl9TX0NfU1RPX09GRiwgRVRJUl9TX0NfQ1RMX1NFVFJCKSAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfUFE6Ci0gIAl7Ci0JICB1cXVhZCBkdW1teTsKLQkgIHVuc2lnbmVkIGludCBwc2VjdDsKLQotCSAgcHNlY3QgPSBiZmRfZ2V0bDMyIChwdHIpOwotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkJhZCBzZWN0aW9uIGluZGV4IGluIEVUSVJfU19DX1NUQV9QUSIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGR1bW15ID0gYmZkX2dldGw2NCAocHRyKzQpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQkvKiBhbGwgbm90IHN1cHBvcnRlZCAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfTEk6Ci0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9NT0Q6Ci0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9DS0FSRzoKLQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5zdXBwb3J0ZWQgU1RBIGNtZCAlZCIpLCBjbWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RBIGNtZCAlZCIpLCBjbWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YSB0cnVlXG4iKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotICAgZXRpcl9zdG8KLSAgCi0gICB2bXMgc3RvcmUgY29tbWFuZHMKLSAgCi0gICBoYW5kbGUgc3RvX3h4eCBjb21tYW5kcyBpbiBldGlyIHNlY3Rpb24KLSAgIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICAKLSAgIHNlZSB0YWJsZSBCLTkgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RvIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHVxdWFkIGR1bW15OwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0byAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLQotICAgICAgLyogc3RvcmUgYnl0ZTogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0I6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSNpZiAwCi0gICAgICBpZiAoaXNfc2hhcmUpCQkvKiBGSVhNRSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUT19COiBieXRlIGZpeHVwcyBub3Qgc3VwcG9ydGVkIik7Ci0jZW5kaWYKLSAgICAgIGltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIHdvcmQ6IHBvcCBzdGFjaywgd3JpdGUgd29yZAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19XOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0jaWYgMAotICAgICAgaWYgKGlzX3NoYXJlKQkJLyogRklYTUUgKi8KLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJFVElSX1NfQ19TVE9fQjogd29yZCBmaXh1cHMgbm90IHN1cHBvcnRlZCIpOwotI2VuZGlmCi0gICAgICBpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGxvbmd3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIGxvbmd3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0xXOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotICAgICAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdG9yZSBxdWFkd29yZDogcG9wIHN0YWNrLCB3cml0ZSBxdWFkd29yZAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19RVzoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLSAgICAgIGltYWdlX3dyaXRlX3EgKGFiZmQsIGR1bW15KTsJCS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGltbWVkaWF0ZSByZXBlYXRlZDogcG9wIHN0YWNrIGZvciByZXBlYXQgY291bnQKLQkgYXJnOiBsdwlieXRlIGNvdW50Ci0JIGRhCWRhdGEgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19JTU1SOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCXNpemUgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoZHVtbXktLSA+IDBMKQotCSAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyKzQsIHNpemUsIDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGdsb2JhbDogd3JpdGUgc3ltYm9sIHZhbHVlCi0JIGFyZzogY3MJZ2xvYmFsIHN5bWJvbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fR0JMOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCWlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICB7Ci0JICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0dCTDogbm8gc3ltYm9sIFwiJXNcIiIpLAotCQkJCSAgIG5hbWUpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdG9yZSBjb2RlIGFkZHJlc3M6IHdyaXRlIGFkZHJlc3Mgb2YgZW50cnkgcG9pbnQKLQkgYXJnOiBjcwlnbG9iYWwgc3ltYm9sIG5hbWUgKHByb2NlZHVyZSkgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19DQToKLSAgICAgIHsKLQl2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQljaGFyICpuYW1lOwotCi0JbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKSBiZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fQ0E6IG5vIHN5bWJvbCBcIiVzXCIiKSwKLQkJCQkgICBuYW1lKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCWVsc2UKLQkgIGltYWdlX3dyaXRlX3EgKGFiZmQsICh1cXVhZCkoZW50cnktPnN5bWJvbC0+dmFsdWUpKTsJLyogRklYTUUsIHJlbG9jICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbm90IHN1cHBvcnRlZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1JCOgotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0FCOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fUkIvQUI6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIHN0b3JlIG9mZnNldCB0byBwc2VjdDogcG9wIHN0YWNrLCBhZGQgbG93IDMyIGJpdHMgdG8gYmFzZSBvZiBwc2VjdAotICAgICAgIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX09GRjoKLSAgICAgIHsKLQl1cXVhZCBxOwotCWludCBwc2VjdDsKLQotCXEgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JcSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCWltYWdlX3dyaXRlX3EgKGFiZmQsIHEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGltbWVkaWF0ZQotCSBhcmc6IGx3CWNvdW50IG9mIGJ5dGVzCi0JIGRhCWRhdGEgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19JTU06Ci0gICAgICB7Ci0JaW50IHNpemU7Ci0KLQlzaXplID0gYmZkX2dldGwzMiAocHRyKTsKLQlpbWFnZV9kdW1wIChhYmZkLCBwdHIrNCwgc2l6ZSwgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogdGhpcyBjb2RlIGlzICdyZXNlcnZlZCB0byBkaWdpdGFsJyBhY2NvcmRpbmcgdG8gdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCwKLQkgaG93ZXZlciBpdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIERFQyBDIGNvbXBpbGVyIGFuZCBkZWZpbmVkIGluIHRoZSBpbmNsdWRlIGZpbGUuCi0JIEZJWE1FLCBzaW5jZSB0aGUgZm9sbG93aW5nIGlzIGp1c3QgYSBndWVzcwotCSBzdG9yZSBnbG9iYWwgbG9uZ3dvcmQ6IHN0b3JlIDMyYml0IHZhbHVlIG9mIHN5bWJvbAotCSBhcmc6IGNzCXN5bWJvbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fR0JMX0xXOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCWlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICB7Ci0jaWYgVk1TX0RFQlVHCi0JICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiRVRJUl9TX0NfU1RPX0dCTF9MVzogbm8gc3ltYm9sIFwiJXNcIlxuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpMCk7CS8qIEZJWE1FLCByZWxvYyAqLwotCSAgfQotCWVsc2UKLQkgIGltYWdlX3dyaXRlX2wgKGFiZmQsICh1bnNpZ25lZCBsb25nKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fTFBfUFNCOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fTFBfUFNCOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fSElOVF9HQkw6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19ISU5UX0dCTDogbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fSElOVF9QUzoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0hJTlRfUFM6IG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBzdGFjayBvcGVyYXRvciBjb21tYW5kcwotICAgYWxsIDMyIGJpdCBzaWduZWQgYXJpdGhtZXRpYwotICAgYWxsIHdvcmQganVzdCBsaWtlIGEgc3RhY2sgY2FsY3VsYXRvcgotICAgYXJndW1lbnRzIGFyZSBwb3BwZWQgZnJvbSBzdGFjaywgcmVzdWx0cyBhcmUgcHVzaGVkIG9uIHN0YWNrCi0gIAotICAgc2VlIHRhYmxlIEItMTAgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfb3ByIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbG9uZyBvcDEsIG9wMjsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfb3ByICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogb3BlcmF0aW9uICovCi0KLSAgICAgIC8qIG5vLW9wICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfTk9QOgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGFkZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FERDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgKyBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3VidHJhY3QgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9TVUI6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AyIC0gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG11bHRpcGx5ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfTVVMOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSAqIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBkaXZpZGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ESVY6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIGlmIChvcDIgPT0gMCkKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpMEwsIC0xKTsKLSAgICAgIGVsc2UKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMiAvIG9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBsb2dpY2FsIGFuZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FORDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgJiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbG9naWNhbCBpbmNsdXNpdmUgb3IJICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9JT1I6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxIHwgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGxvZ2ljYWwgZXhjbHVzaXZlIG9yICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfRU9SOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSBeIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBuZWdhdGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ORUc6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKSgtb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNvbXBsZW1lbnQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9DT006Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgXiAtMUwpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogaW5zZXJ0IGZpZWxkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfSU5TVjoKLSAgICAgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9JTlNWOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBhcml0aG1ldGljIHNoaWZ0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQVNIOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBpZiAob3AyIDwgMCkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0Jb3AxID4+PSAtb3AyOwotICAgICAgZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQlvcDEgPDw9IG9wMjsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZClvcDEsIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiB1bnNpZ25lZCBzaGlmdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1VTSDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX1VTSDogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiByb3RhdGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ST1Q6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9ST1Q6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc2VsZWN0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfU0VMOgotICAgICAgaWYgKChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCkgJiAweDAxTCkKLQkodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgZWxzZQotCXsKLQkgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKW9wMSwgLTEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1JFREVGOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfUkVERUY6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZGVmaW5lIGEgbGl0ZXJhbCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0RGTElUOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfREZMSVQ6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIE9QUiBjbWQgJWQiKSwgY21kKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBjb250cm9sIGNvbW1hbmRzCi0gIAotICAgc2VlIHRhYmxlIEItMTEgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfY3RsIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHVxdWFkCSBkdW1teTsKLSAgaW50IHBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAiZXRpcl9jdGwgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNtZCkKLSAgICB7Ci0gICAgICAvKiBzZXQgcmVsb2NhdGlvbiBiYXNlOiBwb3Agc3RhY2ssIHNldCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX1NFVFJCOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBpbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlOiBpbmNyZW1lbnQgaW1hZ2UgbG9jYXRpb24gY291bnRlciBieSBvZmZzZXQKLQkgYXJnOiBsdwlvZmZzZXQgdmFsdWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9BVUdSQjoKLSAgICAgIGR1bW15ID0gYmZkX2dldGwzMiAocHRyKTsKLSAgICAgIGltYWdlX2luY19wdHIgKGFiZmQsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBkZWZpbmUgbG9jYXRpb246IHBvcCBpbmRleCwgc2F2ZSBsb2NhdGlvbiBjb3VudGVyIHVuZGVyIGluZGV4Ci0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX0RGTE9DOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzZXQgbG9jYXRpb246IHBvcCBpbmRleCwgcmVzdG9yZSBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfU1RMT0M6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RhY2sgZGVmaW5lZCBsb2NhdGlvbjogcG9wIGluZGV4LCBwdXNoIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9TVEtETDoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBzdG9yZSBjb25kaXRpb25hbCBjb21tYW5kcwotICAKLSAgIHNlZSB0YWJsZSBCLTEyIGFuZCBCLTEzIG9mIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgICovCi0KLXN0YXRpYyBib29sZWFuCi1ldGlyX3N0YyAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YyAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIDIwMCBTdG9yZS1jb25kaXRpb25hbCBMaW5rYWdlIFBhaXIKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xQOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVENfTFA6IG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogMjAxIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciB3aXRoIFByb2NlZHVyZSBTaWduYXR1cmUKLQkgYXJnOglsdwlsaW5rYWdlIGluZGV4Ci0JIGNzCXByb2NlZHVyZSBuYW1lCi0JIGJ5CXNpZ25hdHVyZSBsZW5ndGgKLQkgZGEJc2lnbmF0dXJlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTFBfUFNCOgotICAgICAgaW1hZ2VfaW5jX3B0ciAoYWJmZCwgMTYpOwkvKiBza2lwIGVudHJ5LHByb2N2YWwgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDIgU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgY3MJZ2xvYmFsIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19HQkw6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19HQkw6IG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogMjAzIFN0b3JlLWNvbmRpdGlvbmFsIENvZGUgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgY3MJcHJvY2VkdXJlIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19HQ0E6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19HQ0E6IG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogMjA0IFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgcHNlY3QgKyBvZmZzZXQKLQkgYXJnOglsdwlsaW5rYWdlIGluZGV4Ci0JIGx3CXBzZWN0IGluZGV4Ci0JIHF3CW9mZnNldCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX1BTOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVENfUFM6IG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogMjA1IFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBhZGRyZXNzIG9mIGdsb2JhbAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTk9QX0dCTDoKLQotICAgICAgLyogMjA2IFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBwZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OT1BfUFM6Ci0KLSAgICAgIC8qIDIwNyBTdG9yZS1jb25kaXRpb25hbCBCU1IgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0JTUl9HQkw6Ci0KLSAgICAgIC8qIDIwOCBTdG9yZS1jb25kaXRpb25hbCBCU1IgYXQgcGVjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQlNSX1BTOgotCi0gICAgICAvKiAyMDkgU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MREFfR0JMOgotCi0gICAgICAvKiAyMTAgU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IHBzZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MREFfUFM6Ci0KLSAgICAgIC8qIDIxMSBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQk9IX0dCTDoKLQotICAgICAgLyogMjEyIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBvciBIaW50IGF0IHBlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0JPSF9QUzoKLQotICAgICAgLyogMjEzIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCxCU1Igb3IgSElOVCBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTkJIX0dCTDoKLQotICAgICAgLyogMjE0IFN0b3JlLWNvbmRpdGlvbmFsIE5PUCxCU1Igb3IgSElOVCBhdCBwc2VjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTkJIX1BTOgotLyogRklYTUUgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUQ194eDogKCVkKSBub3Qgc3VwcG9ydGVkIiwgY21kKTsgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICgzLCAgIlJlc2VydmVkIFNUQyBjbWQgJWQiLCBjbWQpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1uZXdfc2VjdGlvbiAoYWJmZCwgaWR4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IGlkeDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGNoYXIgc25hbWVbMTZdOwotICBjaGFyICpuYW1lOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAgIm5ld19zZWN0aW9uICVkXG4iLCBpZHgpOwotI2VuZGlmCi0gIHNwcmludGYgKHNuYW1lLCBTRUNUSU9OX05BTUVfVEVNUExBVEUsIGlkeCk7Ci0KLSAgbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc25hbWUpICsgMSk7Ci0gIGlmIChuYW1lID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIHN0cmNweSAobmFtZSwgc25hbWUpOwotCi0gIHNlY3Rpb24gPSBiZmRfbWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChzZWN0aW9uID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDYsICAiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZCIsIG5hbWUpOwotI2VuZGlmCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc2VjdGlvbi0+X3Jhd19zaXplID0gMDsKLSAgc2VjdGlvbi0+dm1hID0gMDsKLSAgc2VjdGlvbi0+Y29udGVudHMgPSAwOwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSAwOwotICBzZWN0aW9uLT5uYW1lID0gbmFtZTsKLSAgc2VjdGlvbi0+aW5kZXggPSBpZHg7Ci0KLSAgcmV0dXJuIHNlY3Rpb247Ci19Ci0KLQotc3RhdGljIGludAotYWxsb2Nfc2VjdGlvbiAoYWJmZCwgaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBpZHg7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAgImFsbG9jX3NlY3Rpb24gJWRcbiIsIGlkeCk7Ci0jZW5kaWYKLQotICBQUklWKHNlY3Rpb25zKSA9ICgoYXNlY3Rpb24gKiopCi0JCSAgICBiZmRfcmVhbGxvYyAoUFJJVihzZWN0aW9ucyksIChpZHgrMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gIGlmIChQUklWKHNlY3Rpb25zKSA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoUFJJVihzZWN0aW9uX2NvdW50KSA8PSBpZHgpCi0gICAgewotICAgICAgUFJJVihzZWN0aW9ucylbUFJJVihzZWN0aW9uX2NvdW50KV0gPSBuZXdfc2VjdGlvbiAoYWJmZCwgUFJJVihzZWN0aW9uX2NvdW50KSk7Ci0gICAgICBpZiAoUFJJVihzZWN0aW9ucylbUFJJVihzZWN0aW9uX2NvdW50KV0gPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBQUklWKHNlY3Rpb25fY291bnQpKys7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiB0aXJfc3RhCi0gKgotICogdmF4IHN0YWNrIGNvbW1hbmRzCi0gKgotICogaGFuZGxlIHN0YV94eHggY29tbWFuZHMgaW4gdGlyIHNlY3Rpb24KLSAqIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICoKLSAqIHNlZSB0YWJsZSA3LTMgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9zdGEgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBpbnQgY21kID0gKnB0cisrOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX3N0YSAlZFxuIiwgY21kKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgLyogc3RhY2sgKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfR0JMOgotCS8qCi0JICogc3RhY2sgZ2xvYmFsCi0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgMzIgYml0IHZhbHVlIG9mIHN5bWJvbCAoaGlnaCBiaXRzIHNldCB0byAwKQotCSAqLwotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0KLSAgICAgICAgICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLQotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSwgLTEpOwotCSAgcHRyICs9ICpwdHIgKyAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1NCOgotCS8qCi0JICogc3RhY2sgc2lnbmVkIGJ5dGUKLQkgKiBhcmc6IGJ5CXZhbHVlCi0JICoKLQkgKiBzdGFjayBieXRlIHZhbHVlLCBzaWduIGV4dGVuZCB0byAzMiBiaXQKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAobG9uZykqcHRyKyssIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1NXOgotCS8qCi0JICogc3RhY2sgc2lnbmVkIHNob3J0IHdvcmQKLQkgKiBhcmc6IHNoCXZhbHVlCi0JICoKLQkgKiBzdGFjayAxNiBiaXQgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDMyIGJpdAotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKWJmZF9nZXRsMTYocHRyKSwgLTEpOwotCXB0ciArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTFc6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgbG9uZ3dvcmQKLQkgKiBhcmc6IGx3CXZhbHVlCi0JICoKLQkgKiBzdGFjayAzMiBiaXQgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAobG9uZyliZmRfZ2V0bDMyIChwdHIpLCAtMSk7Ci0JcHRyICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9QQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV1BCOgotCS8qCi0JICogc3RhY2sgcHNlY3QgYmFzZSBwbHVzIGJ5dGUgb2Zmc2V0ICh3b3JkIGluZGV4KQotCSAqIGFyZzogYnkJc2VjdGlvbiBpbmRleAotCSAqCShzaAlzZWN0aW9uIGluZGV4KQotCSAqCWJ5CXNpZ25lZCBieXRlIG9mZnNldAotCSAqCi0JICovCi0gIAl7Ci0JICB1bnNpZ25lZCBsb25nIGR1bW15OwotCSAgdW5zaWduZWQgaW50IHBzZWN0OwotCi0JICBpZiAoY21kID09IFRJUl9TX0NfU1RBX1BCKQotCSAgICBwc2VjdCA9ICpwdHIrKzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBzZWN0ID0gYmZkX2dldGwxNihwdHIpOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0KLQkgIGlmIChwc2VjdCA+PSBQUklWKHNlY3Rpb25fY291bnQpKQotCSAgICB7Ci0JICAgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgICB9Ci0KLQkgIGR1bW15ID0gKGxvbmcpKnB0cisrOwotCSAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIGR1bW15LCBwc2VjdCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1BXOgotICAgICAgY2FzZSBUSVJfU19DX1NUQV9XUFc6Ci0JLyoKLQkgKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgd29yZCBvZmZzZXQgKHdvcmQgaW5kZXgpCi0JICogYXJnOiBieQlzZWN0aW9uIGluZGV4Ci0JICoJKHNoCXNlY3Rpb24gaW5kZXgpCi0JICoJc2gJc2lnbmVkIHNob3J0IG9mZnNldAotCSAqCi0JICovCi0gIAl7Ci0JICB1bnNpZ25lZCBsb25nIGR1bW15OwotCSAgdW5zaWduZWQgaW50IHBzZWN0OwotCi0JICBpZiAoY21kID09IFRJUl9TX0NfU1RBX1BXKQotCSAgICBwc2VjdCA9ICpwdHIrKzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBzZWN0ID0gYmZkX2dldGwxNihwdHIpOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0KLQkgIGlmIChwc2VjdCA+PSBQUklWKHNlY3Rpb25fY291bnQpKQotCSAgICB7Ci0JICAgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgICB9Ci0KLQkgIGR1bW15ID0gYmZkX2dldGwxNihwdHIpOyBwdHIrPTI7Ci0JICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfUEw6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dQTDoKLQkvKgotCSAqIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyBsb25nIG9mZnNldCAod29yZCBpbmRleCkKLQkgKiBhcmc6IGJ5CXNlY3Rpb24gaW5kZXgKLQkgKgkoc2gJc2VjdGlvbiBpbmRleCkKLQkgKglsdwlzaWduZWQgbG9uZ3dvcmQgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICB1bnNpZ25lZCBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUEwpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOyBwdHIgKz0gNDsKLQkgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9VQjoKLQkvKgotCSAqIHN0YWNrIHVuc2lnbmVkIGJ5dGUKLQkgKiBhcmc6IGJ5CXZhbHVlCi0JICoKLQkgKiBzdGFjayBieXRlIHZhbHVlCi0JICovCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKnB0cisrLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9VVzoKLQkvKgotCSAqIHN0YWNrIHVuc2lnbmVkIHNob3J0IHdvcmQKLQkgKiBhcmc6IHNoCXZhbHVlCi0JICoKLQkgKiBzdGFjayAxNiBiaXQgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZyliZmRfZ2V0bDE2KHB0ciksIC0xKTsKLQlwdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0JGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0JLypGQUxMVEhSVSovCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0JLypGQUxMVEhSVSovCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2stZnJvbS1pbWFnZSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfRVBNOgotCS8qCi0JICogc3RhY2sgZW50cnkgcG9pbnQgbWFzawotCSAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLQkgKgotCSAqIHN0YWNrICh1bnNpZ25lZCkgZW50cnkgcG9pbnQgbWFzayBvZiBzeW1ib2wKLQkgKiBlcnIgaWYgc3ltYm9sIGlzIG5vIGVudHJ5IHBvaW50Ci0JICovCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQkgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHJldHVybiAwOwotCi0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1lbnRyeS1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfQ0tBUkc6Ci0JLyoKLQkgKiBjb21wYXJlIHByb2NlZHVyZSBhcmd1bWVudAotCSAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLQkgKglieQlhcmd1bWVudCBpbmRleAotCSAqCWRhCWFyZ3VtZW50IGRlc2NyaXB0b3IKLQkgKgotCSAqIGNvbXBhcmUgYXJndW1lbnQgZGVzY3JpcHRvciB3aXRoIHN5bWJvbCBhcmd1bWVudCAoQVJHJFZfUEFTU01FQ0gpCi0JICogYW5kIHN0YWNrIFRSVUUgKGFyZ3MgbWF0Y2gpIG9yIEZBTFNFIChhcmdzIGRvbnQgbWF0Y2gpIHZhbHVlCi0JICovCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUEFTU01FQ0ggbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIDFMLCAtMSk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTFNZOgotCS8qCi0JICogc3RhY2sgbG9jYWwgc3ltYm9sIHZhbHVlCi0JICogYXJnOglzaAllbnZpcm9ubWVudCBpbmRleAotCSAqCWNzCXN5bWJvbCBuYW1lCi0JICovCi0JewotCSAgaW50IGVudmlkeDsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgZW52aWR4ID0gYmZkX2dldGwxNihwdHIpOyBwdHIgKz0gMjsKLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1sb2NhbC1zeW1ib2wgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MSVQ6Ci0JLyoKLQkgKiBzdGFjayBsaXRlcmFsCi0gCSAqIGFyZzoJYnkJbGl0ZXJhbCBpbmRleAotCSAqCi0JICogc3RhY2sgbGl0ZXJhbAotCSAqLwotCXB0cisrOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1saXRlcmFsIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MRVBNOgotCS8qCi0JICogc3RhY2sgbG9jYWwgc3ltYm9sIGVudHJ5IHBvaW50IG1hc2sKLQkgKiBhcmc6CXNoCWVudmlyb25tZW50IGluZGV4Ci0JICoJY3MJc3ltYm9sIG5hbWUKLQkgKgotCSAqIHN0YWNrICh1bnNpZ25lZCkgZW50cnkgcG9pbnQgbWFzayBvZiBzeW1ib2wKLQkgKiBlcnIgaWYgc3ltYm9sIGlzIG5vIGVudHJ5IHBvaW50Ci0JICovCi0JewotCSAgaW50IGVudmlkeDsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgZW52aWR4ID0gYmZkX2dldGwxNihwdHIpOyBwdHIgKz0gMjsKLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxvY2FsLXN5bWJvbC1lbnRyeS1wb2ludC1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVEEgY21kICVkIiksIHB0clstMV0pOwotCXJldHVybiBOVUxMOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiB0aXJfc3RvCi0gKgotICogdmF4IHN0b3JlIGNvbW1hbmRzCi0gKgotICogaGFuZGxlIHN0b194eHggY29tbWFuZHMgaW4gdGlyIHNlY3Rpb24KLSAqIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICoKLSAqIHNlZSB0YWJsZSA3LTQgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9zdG8gKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICB1bnNpZ25lZCBsb25nIGR1bW15OwotICBpbnQgc2l6ZTsKLSAgaW50IHBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX3N0byAlZFxuIiwgKnB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKCpwdHIrKykKLSAgICB7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1NCOgotCS8qCi0JICogc3RvcmUgc2lnbmVkIGJ5dGU6IHBvcCBzdGFjaywgd3JpdGUgYnl0ZQotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fU1c6Ci0JLyoKLQkgKiBzdG9yZSBzaWduZWQgd29yZDogcG9wIHN0YWNrLCB3cml0ZSB3b3JkCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOwkvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xXOgotCS8qCi0JICogc3RvcmUgbG9uZ3dvcmQ6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fQkQ6Ci0JLyoKLQkgKiBzdG9yZSBieXRlIGRpc3BsYWNlZDogcG9wIHN0YWNrLCBzdWIgbGMrMSwgd3JpdGUgYnl0ZQotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWR1bW15IC09ICgoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hICsgMSk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1dEOgotCS8qCi0JICogc3RvcmUgd29yZCBkaXNwbGFjZWQ6IHBvcCBzdGFjaywgc3ViIGxjKzIsIHdyaXRlIHdvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlkdW1teSAtPSAoKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYSArIDIpOwotCWltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19MRDoKLQkvKgotCSAqIHN0b3JlIGxvbmcgZGlzcGxhY2VkOiBwb3Agc3RhY2ssIHN1YiBsYys0LCB3cml0ZSBsb25nCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JZHVtbXkgLT0gKChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWEgKyA0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xJOgotCS8qCi0JICogc3RvcmUgc2hvcnQgbGl0ZXJhbDogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSURSOgotCS8qCi0JICogc3RvcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQgZGF0YSByZWZlcmVuY2U6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKiBGSVhNRTogaW5jb21wbGV0ZSAhCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSUNSOgotCS8qCi0JICogc3RvcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSByZWZlcmVuY2U6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKiBGSVhNRTogaW5jb21wbGV0ZSAhCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgMHg5Zik7Ci0JaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SSVZCOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgaW1tZWRpYXRlIHZhcmlhYmxlIGJ5dGVzCi0JICogMS1ieXRlIGNvdW50IG4gZmllbGQgZm9sbG93ZWQgYnkgbiBieXRlcyBvZiBkYXRhCi0JICogcG9wIHN0YWNrLCB3cml0ZSBuIGJ5dGVzIDxzdGFjaz4gdGltZXMKLQkgKi8KLQlzaXplID0gKnB0cisrOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoZHVtbXktLSA+IDBMKQotCSAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBzaXplLCAwKTsKLQlwdHIgKz0gc2l6ZTsKLQlicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fQjoKLQkvKgotCSAqIHN0b3JlIGJ5dGUgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVzoKLQkvKgotCSAqIHN0b3JlIHdvcmQgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SQjoKLQkvKgotCSAqIHN0b3JlIHJlcGVhdGVkIGJ5dGUgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlzaXplID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JICBpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SVzoKLQkvKgotCSAqIHN0b3JlIHJlcGVhdGVkIHdvcmQgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlzaXplID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JICBpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUlNCOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19SU1c6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JMOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19WUFM6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1VTQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVVNXOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19SVUI6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JVVzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUElSUjoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaW1wbGVtZW50ZWQgU1RPIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKgotICogc3RhY2sgb3BlcmF0b3IgY29tbWFuZHMKLSAqIGFsbCAzMiBiaXQgc2lnbmVkIGFyaXRobWV0aWMKLSAqIGFsbCB3b3JkIGp1c3QgbGlrZSBhIHN0YWNrIGNhbGN1bGF0b3IKLSAqIGFyZ3VtZW50cyBhcmUgcG9wcGVkIGZyb20gc3RhY2ssIHJlc3VsdHMgYXJlIHB1c2hlZCBvbiBzdGFjawotICoKLSAqIHNlZSB0YWJsZSA3LTUgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9vcHIgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBsb25nIG9wMSwgb3AyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX29wciAlZFxuIiwgKnB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKCpwdHIrKykKLSAgICB7Ci0gIC8qIG9wZXJhdGlvbiAqLwotICAgICAgY2FzZSBUSVJfU19DX09QUl9OT1A6Ci0JLyoKLQkgKiBuby1vcAotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQUREOgotCS8qCi0JICogYWRkCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgKyBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9TVUI6Ci0JLyoKLQkgKiBzdWJ0cmFjdAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AyIC0gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfTVVMOgotCS8qCi0JICogbXVsdGlwbHkKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSAqIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0RJVjoKLQkvKgotCSAqIGRpdmlkZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAob3AyID09IDApCi0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykwTCwgLTEpOwotCWVsc2UKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDIgLyBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9BTkQ6Ci0JLyoKLQkgKiBsb2dpY2FsIGFuZAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxICYgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfSU9SOgotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JLyoKLQkgKiBsb2dpY2FsIGluY2x1c2l2ZSBvcgotCSAqLwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSB8IG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0VPUjoKLQkvKgotCSAqIGxvZ2ljYWwgZXhjbHVzaXZlIG9yCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgXiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9ORUc6Ci0JLyoKLQkgKiBuZWdhdGUKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKSgtb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQ09NOgotCS8qCi0JICogY29tcGxlbWVudAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSBeIC0xTCksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0lOU1Y6Ci0JLyoKLQkgKiBpbnNlcnQgZmllbGQKLQkgKi8KLQkodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAgKCJUSVJfU19DX09QUl9JTlNWIGluY29tcGxldGUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0FTSDoKLQkvKgotCSAqIGFyaXRobWV0aWMgc2hpZnQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQob3AxKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9BU0ggaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1VTSDoKLQkvKgotCSAqIHVuc2lnbmVkIHNoaWZ0Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWlmIChISUdIQklUKG9wMSkpCQkvKiBzaGlmdCByaWdodCAqLwotCSAgb3AyID4+PSBvcDE7Ci0JZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQkgIG9wMiA8PD0gb3AxOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMiwgLTEpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfVVNIIGluY29tcGxldGUiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9ST1Q6Ci0JLyoKLQkgKiByb3RhdGUKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQoMCkpCQkvKiBzaGlmdCByaWdodCAqLwotCSAgb3AyID4+PSBvcDE7Ci0JZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQkgIG9wMiA8PD0gb3AxOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMiwgLTEpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfUk9UIGluY29tcGxldGUiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9TRUw6Ci0JLyoKLQkgKiBzZWxlY3QKLQkgKi8KLQlpZiAoKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKSAmIDB4MDFMKQotCSAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQllbHNlCi0JICB7Ci0JICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMSwgLTEpOwotCSAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfUkVERUY6Ci0JLyoKLQkgKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbgotCSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfUkVERUYgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0RGTElUOgotCS8qCi0JICogZGVmaW5lIGEgbGl0ZXJhbAotCSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfREZMSVQgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgT1BSIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9jdGwgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotLyoKLSAqIGNvbnRyb2wgY29tbWFuZHMKLSAqCi0gKiBzZWUgdGFibGUgNy02IG9mIHRoZSBWQVgvVk1TIGxpbmtlciBtYW51YWwKLSAqLwotewotICB1bnNpZ25lZCBsb25nIGR1bW15OwotICB1bnNpZ25lZCBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfY3RsICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfU0VUUkI6Ci0JLyoKLQkgKiBzZXQgcmVsb2NhdGlvbiBiYXNlOiBwb3Agc3RhY2ssIHNldCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICB7Ci0JICAgIGFsbG9jX3NlY3Rpb24gKGFiZmQsIHBzZWN0KTsKLQkgIH0KLQlpbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfQ1RMX0FVR1JCOgotCS8qCi0JICogYXVnbWVudCByZWxvY2F0aW9uIGJhc2U6IGluY3JlbWVudCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyIGJ5IG9mZnNldAotCSAqIGFyZzogbHcJb2Zmc2V0IHZhbHVlCi0JICovCi0JZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWltYWdlX2luY19wdHIgKGFiZmQsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX0NUTF9ERkxPQzoKLQkvKgotCSAqIGRlZmluZSBsb2NhdGlvbjogcG9wIGluZGV4LCBzYXZlIGxvY2F0aW9uIGNvdW50ZXIgdW5kZXIgaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX0NUTF9ERkxPQyBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfU1RMT0M6Ci0JLyoKLQkgKiBzZXQgbG9jYXRpb246IHBvcCBpbmRleCwgcmVzdG9yZSBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX1NUTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVElSX1NfQ19DVExfU1RLREw6Ci0JLyoKLQkgKiBzdGFjayBkZWZpbmVkIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHB1c2ggbG9jYXRpb24gY291bnRlciBmcm9tIGluZGV4Ci0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX0NUTF9TVEtETCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIENUTCBjbWQgJWQiKSwgcHRyWy0xXSk7Ci0JYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKgotICogaGFuZGxlIGNvbW1hbmQgZnJvbSBUSVIgc2VjdGlvbgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9jbWQgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBzdHJ1Y3QgewotICAgIGludCBtaW5jb2Q7Ci0gICAgaW50IG1heGNvZDsKLSAgICB1bnNpZ25lZCBjaGFyICogKCpleHBsYWluKShiZmQgKiwgdW5zaWduZWQgY2hhciAqKTsKLSAgfSB0aXJfdGFibGVbXSA9IHsKLSAgICB7IDAsCQkgVElSX1NfQ19NQVhTVEFDT0QsIHRpcl9zdGEgfQotICAgLHsgVElSX1NfQ19NSU5TVE9DT0QsIFRJUl9TX0NfTUFYU1RPQ09ELCB0aXJfc3RvIH0KLSAgICx7IFRJUl9TX0NfTUlOT1BSQ09ELCBUSVJfU19DX01BWE9QUkNPRCwgdGlyX29wciB9Ci0gICAseyBUSVJfU19DX01JTkNUTENPRCwgVElSX1NfQ19NQVhDVExDT0QsIHRpcl9jdGwgfQotICAgLHsgLTEsIC0xLCBOVUxMIH0KLSAgfTsKLSAgaW50IGkgPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAidGlyX2NtZCAlZC8leFxuIiwgKnB0ciwgKnB0cik7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgaWYgKCpwdHIgJiAweDgwKQkJCQkvKiBzdG9yZSBpbW1lZGlhdGUgKi8KLSAgICB7Ci0gICAgICBpID0gMTI4IC0gKCpwdHIrKyAmIDB4N2YpOwotICAgICAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBpLCAwKTsKLSAgICAgIHB0ciArPSBpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICh0aXJfdGFibGVbaV0ubWluY29kID49IDApCi0JewotCSAgaWYgKCAodGlyX3RhYmxlW2ldLm1pbmNvZCA8PSAqcHRyKSAKLQkgICAgJiYgKCpwdHIgPD0gdGlyX3RhYmxlW2ldLm1heGNvZCkpCi0JICAgIHsKLQkgICAgICBwdHIgPSB0aXJfdGFibGVbaV0uZXhwbGFpbiAoYWJmZCwgcHRyKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaSsrOwotCX0KLSAgICAgIGlmICh0aXJfdGFibGVbaV0ubWluY29kIDwgMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iaiBjb2RlICVkIG5vdCBmb3VuZCIpLCAqcHRyKTsKLQkgIHB0ciA9IDA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qIGhhbmRsZSBjb21tYW5kIGZyb20gRVRJUiBzZWN0aW9uICAqLwotCi1zdGF0aWMgaW50Ci1ldGlyX2NtZCAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICBzdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgbWluY29kOwotICAgIGludCBtYXhjb2Q7Ci0gICAgYm9vbGVhbiAoKmV4cGxhaW4pIFBBUkFNUygoYmZkICosIGludCwgdW5zaWduZWQgY2hhciAqKSk7Ci0gIH0gZXRpcl90YWJsZVtdID0gewotICAgIHsgRVRJUl9TX0NfTUlOU1RBQ09ELCBFVElSX1NfQ19NQVhTVEFDT0QsIGV0aXJfc3RhIH0sCi0gICAgeyBFVElSX1NfQ19NSU5TVE9DT0QsIEVUSVJfU19DX01BWFNUT0NPRCwgZXRpcl9zdG8gfSwKLSAgICB7IEVUSVJfU19DX01JTk9QUkNPRCwgRVRJUl9TX0NfTUFYT1BSQ09ELCBldGlyX29wciB9LAotICAgIHsgRVRJUl9TX0NfTUlOQ1RMQ09ELCBFVElSX1NfQ19NQVhDVExDT0QsIGV0aXJfY3RsIH0sCi0gICAgeyBFVElSX1NfQ19NSU5TVENDT0QsIEVUSVJfU19DX01BWFNUQ0NPRCwgZXRpcl9zdGMgfSwKLSAgICB7IC0xLCAtMSwgTlVMTCB9Ci0gIH07Ci0KLSAgaW50IGkgPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiZXRpcl9jbWQgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICB3aGlsZSAoZXRpcl90YWJsZVtpXS5taW5jb2QgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAoIChldGlyX3RhYmxlW2ldLm1pbmNvZCA8PSBjbWQpIAotCSYmIChjbWQgPD0gZXRpcl90YWJsZVtpXS5tYXhjb2QpKQotCXsKLQkgIGlmICghZXRpcl90YWJsZVtpXS5leHBsYWluIChhYmZkLCBjbWQsIHB0cikpCi0JICAgIHJldHVybiAtMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGkrKzsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJldGlyX2NtZDogPSAwXG4iKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIFJlY29yZHMgKE9CSiRDX1RJUikKLSAgIGhhbmRsZSB0aXIgcmVjb3JkICAqLwotCi1zdGF0aWMgaW50Ci1hbmFseXplX3RpciAoYWJmZCwgcHRyLCBsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotewotICB1bnNpZ25lZCBjaGFyICptYXhwdHI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX3RpcjogJWQgYnl0ZXNcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBtYXhwdHIgPSBwdHIgKyBsZW5ndGg7Ci0KLSAgd2hpbGUgKHB0ciA8IG1heHB0cikKLSAgICB7Ci0gICAgICBwdHIgPSB0aXJfY21kIChhYmZkLCBwdHIpOwotICAgICAgaWYgKHB0ciA9PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiBSZWNvcmRzIChFT0JKJENfRVRJUikKLSAgIGhhbmRsZSBldGlyIHJlY29yZCAgKi8KLQotc3RhdGljIGludAotYW5hbHl6ZV9ldGlyIChhYmZkLCBwdHIsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci17Ci0gIGludCBjbWQ7Ci0gIHVuc2lnbmVkIGNoYXIgKm1heHB0cjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX2V0aXI6ICVkIGJ5dGVzXG4iLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgbWF4cHRyID0gcHRyICsgbGVuZ3RoOwotCi0gIHdoaWxlIChwdHIgPCBtYXhwdHIpCi0gICAgewotICAgICAgY21kID0gYmZkX2dldGwxNiAocHRyKTsKLSAgICAgIGxlbmd0aCA9IGJmZF9nZXRsMTYgKHB0ciArIDIpOwotICAgICAgcmVzdWx0ID0gZXRpcl9jbWQgKGFiZmQsIGNtZCwgcHRyKzQpOwotICAgICAgaWYgKHJlc3VsdCAhPSAwKQotCWJyZWFrOwotICAgICAgcHRyICs9IGxlbmd0aDsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX2V0aXI6ID0gJWRcbiIsIHJlc3VsdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHByb2Nlc3MgRVRJUiByZWNvcmQKLSAgCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF90aXIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIGludCByZXN1bHQ7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJUSVIvRVRJUlxuIik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBFT0JKX1NfQ19FVElSOgotCVBSSVYodm1zX3JlYykgKz0gNDsJLyogc2tpcCB0eXBlLCBzaXplICovCi0JUFJJVihyZWNfc2l6ZSkgLT0gNDsKLQlyZXN1bHQgPSBhbmFseXplX2V0aXIgKGFiZmQsIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT0JKX1NfQ19USVI6Ci0JUFJJVih2bXNfcmVjKSArPSAxOwkvKiBza2lwIHR5cGUgKi8KLQlQUklWKHJlY19zaXplKSAtPSAxOwotCXJlc3VsdCA9IGFuYWx5emVfdGlyIChhYmZkLCBQUklWKHZtc19yZWMpLCBQUklWKHJlY19zaXplKSk7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJlc3VsdCA9IC0xOwotCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHByb2Nlc3MgRURCRyByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0gIAotICAgbm90IGltcGxlbWVudGVkIHlldCAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9kYmcgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJEQkcvRURCR1xuIik7Ci0jZW5kaWYKLQotICBhYmZkLT5mbGFncyB8PSAoSEFTX0RFQlVHIHwgSEFTX0xJTkVOTyk7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIHByb2Nlc3MgRVRCVCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0gIAotICAgbm90IGltcGxlbWVudGVkIHlldCAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF90YnQgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIlRCVC9FVEJUXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIHByb2Nlc3MgTE5LIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2xuayAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAiTE5LXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotDAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCQkJCQkJCQkJKi8KLS8qCVdSSVRFIEVUSVIgU0VDVElPTgkJCQkJCSovCi0vKgkJCQkJCQkJCSovCi0vKgl0aGlzIGlzIHN0aWxsIHVuZGVyIGNvbnN0cnVjdGlvbiBhbmQgdGhlcmVmb3JlIG5vdCBkb2N1bWVudGVkCSovCi0vKgkJCQkJCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBzdGFydF9ldGlyX3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpbmRleCwgdXF1YWQgb2Zmc2V0LCBib29sZWFuIGp1c3RvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIHN0b19pbW0gUEFSQU1TICgoYmZkICphYmZkLCB2bXNfc2VjdGlvbiAqc3B0ciwgYmZkX3ZtYSB2YWRkciwgaW50IGluZGV4KSk7Ci1zdGF0aWMgdm9pZCBlbmRfZXRpcl9yZWNvcmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm1zX3NlY3Rpb24gKnNwdHI7Ci0gICAgIGJmZF92bWEgdmFkZHI7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgaW50IHNpemU7Ci0gIGludCBzc2l6ZTsKLSAgdW5zaWduZWQgY2hhciAqY3B0cjsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoOCwgInN0b19pbW0gJWQgYnl0ZXNcbiIsIHNwdHItPnNpemUpOwotICBfYmZkX2hleGR1bXAgKDksIHNwdHItPmNvbnRlbnRzLCAoaW50KXNwdHItPnNpemUsIChpbnQpdmFkZHIpOwotI2VuZGlmCi0KLSAgc3NpemUgPSBzcHRyLT5zaXplOwotICBjcHRyID0gc3B0ci0+Y29udGVudHM7Ci0KLSAgd2hpbGUgKHNzaXplID4gMCkKLSAgICB7Ci0KLSAgICAgIHNpemUgPSBzc2l6ZTsJCQkJLyogdHJ5IGFsbCB0aGUgcmVzdCAqLwotCi0gICAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCBzaXplKSA8IDApCi0JewkJCQkJLyogZG9lc24ndCBmaXQsIHNwbGl0ICEgKi8KLQkgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JICBzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwgaW5kZXgsIHZhZGRyLCBmYWxzZSk7Ci0JICBzaXplID0gX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAwKTsJLyogZ2V0IG1heCBzaXplICovCi0JICBpZiAoc2l6ZSA+IHNzaXplKQkJCS8qIG1vcmUgdGhhbiB3aGF0J3MgbGVmdCA/ICovCi0JICAgIHNpemUgPSBzc2l6ZTsKLQl9Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRVRJUl9TX0NfU1RPX0lNTSwgLTEpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShzaXplKSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgY3B0ciwgc2l6ZSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoMTAsICJkdW1wZWQgJWQgYnl0ZXNcbiIsIHNpemUpOwotICAgICAgX2JmZF9oZXhkdW1wICgxMCwgY3B0ciwgKGludClzaXplLCAoaW50KXZhZGRyKTsKLSNlbmRpZgotCi0gICAgICB2YWRkciArPSBzaXplOwotICAgICAgc3NpemUgLT0gc2l6ZTsKLSAgICAgIGNwdHIgKz0gc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBzdGFydCBFVElSIHJlY29yZCBmb3Igc2VjdGlvbiAjaW5kZXggYXQgdmlydHVhbCBhZGRyIG9mZnNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1zdGFydF9ldGlyX3JlY29yZCAoYWJmZCwgaW5kZXgsIG9mZnNldCwganVzdG9mZnNldCkKLSAgICBiZmQgKmFiZmQ7Ci0gICAgaW50IGluZGV4OwotICAgIHVxdWFkIG9mZnNldDsKLSAgICBib29sZWFuIGp1c3RvZmZzZXQ7Ci17Ci0gIGlmICghanVzdG9mZnNldCkKLSAgICB7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VUSVIsIC0xKTsJLyogb25lIEVUSVIgcGVyIHNlY3Rpb24gKi8KLSAgICAgIF9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKTsKLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19TVEFfUFEsIC0xKTsJLyogcHVzaCBzdGFydCBvZmZzZXQgKi8KLSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKWluZGV4KTsKLSAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsICh1cXVhZClvZmZzZXQpOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRVRJUl9TX0NfQ1RMX1NFVFJCLCAtMSk7CS8qIHN0YXJ0ID0gcG9wICgpICovCi0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIGVuZCBldGlyIHJlY29yZCAgKi8KLXN0YXRpYyB2b2lkCi1lbmRfZXRpcl9yZWNvcmQgKGFiZmQpCi0gICAgYmZkICphYmZkOwotewotICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7IAotfQotCi0vKiB3cml0ZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHZtc19zZWN0aW9uICpzcHRyOwotICBpbnQgbmV4dG9mZnNldDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90aXIgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgNCk7Ci0KLSAgbmV4dG9mZnNldCA9IDA7Ci0gIFBSSVYodm1zX2xpbmthZ2VfaW5kZXgpID0gMTsKLQotICAvKiBkdW1wIGFsbCBvdGhlciBzZWN0aW9ucyAgKi8KLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgd2hpbGUgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0KLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICg0LCAid3JpdGluZyAlZC4gc2VjdGlvbiAnJXMnICglZCBieXRlcylcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCAoaW50KShzZWN0aW9uLT5fcmF3X3NpemUpKTsNCi0jZW5kaWYKLQotICAgICAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoKGkgPSBzZWN0aW9uLT5yZWxvY19jb3VudCkgPD0gMCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU0VDX1JFTE9DIHdpdGggbm8gcmVsb2NzIGluIHNlY3Rpb24gJXMiKSwKLQkJCQkgICAgIHNlY3Rpb24tPm5hbWUpOwotCSAgICB9Ci0jaWYgVk1TX0RFQlVHCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICoqcnB0cjsKLQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIiVkIHJlbG9jYXRpb25zOlxuIiwgaSk7Ci0JICAgICAgcnB0ciA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCSAgICAgIHdoaWxlIChpLS0gPiAwKQotCQl7Ci0JCSAgX2JmZF92bXNfZGVidWcgKDQsICJzeW0gJXMgaW4gc2VjICVzLCB2YWx1ZSAlMDhseCwgYWRkciAlMDhseCwgb2ZmICUwOGx4LCBsZW4gJWQ6ICVzXG4iLAotCQkJICAgICAgKCooKnJwdHIpLT5zeW1fcHRyX3B0ciktPm5hbWUsCi0JCQkgICAgICAoKigqcnB0ciktPnN5bV9wdHJfcHRyKS0+c2VjdGlvbi0+bmFtZSwKLQkJCSAgICAgIChsb25nKSgqKCpycHRyKS0+c3ltX3B0cl9wdHIpLT52YWx1ZSwKLQkJCSAgICAgICgqcnB0ciktPmFkZHJlc3MsICgqcnB0ciktPmFkZGVuZCwKLQkJCSAgICAgIGJmZF9nZXRfcmVsb2Nfc2l6ZSgoKnJwdHIpLT5ob3d0byksCi0JCQkgICAgICAoKnJwdHIpLT5ob3d0by0+bmFtZSk7Ci0JCSAgcnB0cisrOwotCQl9Ci0JICAgIH0KLSNlbmRpZgotCX0KLQotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkpCi0JewotCSAgYmZkX3ZtYSB2YWRkcjsJCS8qIHZpcnR1YWwgYWRkciBpbiBzZWN0aW9uICovCi0KLQkgIHNwdHIgPSBfYmZkX2dldF92bXNfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbi0+aW5kZXgpOwotCSAgaWYgKHNwdHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIHZhZGRyID0gKGJmZF92bWEpKHNwdHItPm9mZnNldCk7Ci0KLQkgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBzZWN0aW9uLT5pbmRleCwgKHVxdWFkKSBzcHRyLT5vZmZzZXQsCi0JCQkgICAgIGZhbHNlKTsKLQotCSAgd2hpbGUgKHNwdHIgIT0gTlVMTCkJCQkJLyogb25lIFNUQV9QUSwgQ1RMX1NFVFJCIHBlciB2bXNfc2VjdGlvbiAqLwotCSAgICB7Ci0KLQkgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpCQkJLyogY2hlY2sgZm9yIHJlbG9jcyAqLwotCQl7Ci0JCSAgYXJlbGVudCAqKnJwdHIgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQkJICBpbnQgaSA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCQkgIGZvciAoOzspCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgYWRkciA9ICgqcnB0ciktPmFkZHJlc3M7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgbGVuID0gYmZkX2dldF9yZWxvY19zaXplICgoKnJwdHIpLT5ob3d0byk7Ci0JCSAgICAgIGlmIChzcHRyLT5vZmZzZXQgPCBhZGRyKQkJLyogc3B0ciBzdGFydHMgYmVmb3JlIHJlbG9jICovCi0JCQl7Ci0JCQkgIGJmZF9zaXplX3R5cGUgYmVmb3JlID0gYWRkciAtIHNwdHItPm9mZnNldDsKLQkJCSAgaWYgKHNwdHItPnNpemUgPD0gYmVmb3JlKQkJLyogY29tcGxldGUgYmVmb3JlICovCi0JCQkgICAgewotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIGVsc2UJCQkJLyogcGFydGx5IGJlZm9yZSAqLwotCQkJICAgIHsKLQkJCSAgICAgIGludCBhZnRlciA9IHNwdHItPnNpemUgLSBiZWZvcmU7Ci0JCQkgICAgICBzcHRyLT5zaXplID0gYmVmb3JlOwotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCQkgICAgICBzcHRyLT5jb250ZW50cyArPSBiZWZvcmU7Ci0JCQkgICAgICBzcHRyLT5vZmZzZXQgKz0gYmVmb3JlOwotCQkJICAgICAgc3B0ci0+c2l6ZSA9IGFmdGVyOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc3B0ci0+b2Zmc2V0ID09IGFkZHIpCS8qIHNwdHIgc3RhcnRzIGF0IHJlbG9jICovCi0JCQl7Ci0JCQkgIGFzeW1ib2wgKnN5bSA9ICooKnJwdHIpLT5zeW1fcHRyX3B0cjsKLQkJCSAgYXNlY3Rpb24gKnNlYyA9IHN5bS0+c2VjdGlvbjsKLQotCQkJICBzd2l0Y2ggKCgqcnB0ciktPmhvd3RvLT50eXBlKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfUkVGTE9ORzoKLQkJCSAgICAgIHsKLQkJCQlpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLAotCQkJCQkJCQlzdHJsZW4oKGNoYXIgKilzeW0tPm5hbWUpKQotCQkJCQk8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fR0JMX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgICAgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDE2KSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKHVxdWFkKXN5bS0+dmFsdWUpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMzIpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9QUSwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkJCQkgICAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAoKHVxdWFkKSgqcnB0ciktPmFkZGVuZAotCQkJCQkJCSAgICArICh1cXVhZClzeW0tPnZhbHVlKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCQkJICAgICAgewotCQkJCWlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCi0JCQkJCQkJCXN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCi0JCQkJCTwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19HQkwsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICAgICAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMTYpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9RVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAodXF1YWQpc3ltLT52YWx1ZSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX1FXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAzMikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX1BRLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCQkJCSAgICh1bnNpZ25lZCBsb25nKShzZWMtPmluZGV4KSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICgodXF1YWQpKCpycHRyKS0+YWRkZW5kCi0JCQkJCQkJICAgICsgKHVxdWFkKXN5bS0+dmFsdWUpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fT0ZGLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9ISU5UOgotCQkJICAgICAgewotCQkJCWludCBoaW50X3NpemU7Ci0KLQkJCQloaW50X3NpemUgPSBzcHRyLT5zaXplOwotCQkJCXNwdHItPnNpemUgPSBsZW47Ci0JCQkJc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCQlzcHRyLT5zaXplID0gaGludF9zaXplOwotI2lmIDAKLQkJCQl2bXNfb3V0cHV0X2JlZ2luKGFiZmQsIEVUSVJfU19DX1NUT19ISU5UX0dCTCwgLTEpOwotCQkJCXZtc19vdXRwdXRfbG9uZyhhYmZkLCAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOwotCQkJCXZtc19vdXRwdXRfcXVhZChhYmZkLCAodXF1YWQpYWRkcik7Ci0KLQkJCQl2bXNfb3V0cHV0X2NvdW50ZWQoYWJmZCwgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCXZtc19vdXRwdXRfZmx1c2goYWJmZCk7Ci0jZW5kaWYKLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgQUxQSEFfUl9MSU5LQUdFOgotCQkJICAgICAgewotCQkJCWlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDY0KSA8IDApCi0JCQkJICB7Ci0JCQkJICAgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJICAgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCSAgICAgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgfQotCQkJCV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQlFVElSX1NfQ19TVENfTFBfUFNCLAotCQkJCQkJCS0xKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylQUklWKHZtc19saW5rYWdlX2luZGV4KSk7Ci0JCQkJUFJJVih2bXNfbGlua2FnZV9pbmRleCkgKz0gMjsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX0NPREVBRERSOgotCQkJICAgICAgewotCQkJCWlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCi0JCQkJCQkJICAgIHN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCi0JCQkJICAgIDwgMCkKLQkJCQkgIHsKLQkJCQkgICAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkgICAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkgICAgICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkgICAgICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgIH0KLQkJCQlfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJRVRJUl9TX0NfU1RPX0NBLAotCQkJCQkJCS0xKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBkZWZhdWx0OgotCQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbmhhbmRsZWQgcmVsb2NhdGlvbiAlcyIpLAotCQkJCQkJICAgICAoKnJwdHIpLT5ob3d0by0+bmFtZSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0KLQkJCSAgdmFkZHIgKz0gbGVuOwotCi0JCQkgIGlmIChsZW4gPT0gc3B0ci0+c2l6ZSkKLQkJCSAgICB7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBzcHRyLT5jb250ZW50cyArPSBsZW47Ci0JCQkgICAgICBzcHRyLT5vZmZzZXQgKz0gbGVuOwotCQkJICAgICAgc3B0ci0+c2l6ZSAtPSBsZW47Ci0JCQkgICAgICBpLS07Ci0JCQkgICAgICBycHRyKys7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCQkJCQkvKiBzcHRyIHN0YXJ0cyBhZnRlciByZWxvYyAqLwotCQkJewotCQkJICBpLS07CQkJCS8qIGNoZWNrIG5leHQgcmVsb2MgKi8KLQkJCSAgcnB0cisrOwotCQkJfQotCi0JCSAgICAgIGlmIChpPT0wKQkJCQkvKiBhbGwgcmVsb2MgY2hlY2tlZCAqLwotCQkJewotCQkJICBpZiAoc3B0ci0+c2l6ZSA+IDApCi0JCQkgICAgewotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsJLyogZHVtcCByZXN0ICovCi0JCQkgICAgICB2YWRkciArPSBzcHRyLT5zaXplOwotCQkJICAgIH0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9IC8qIGZvciAoOzspICovCi0JCX0gLyogaWYgU0VDX1JFTE9DICovCi0JICAgICAgZWxzZQkJCQkJCS8qIG5vIHJlbG9jcywganVzdCBkdW1wICovCi0JCXsKLQkJICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCX0KLQotCSAgICAgIHNwdHIgPSBzcHRyLT5uZXh0OwotCi0JICAgIH0gLyogd2hpbGUgKHNwdHIgIT0gMCkgKi8KLQotCSAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQotCX0gLyogaGFzX2NvbnRlbnRzICovCi0KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50KGFiZmQsIDIpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiB3cml0ZSB0cmFjZWJhY2sgZGF0YSBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfdGJ0ICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIHdyaXRlIGRlYnVnIGluZm8gZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2RiZyAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2RiZyAoJXAsIG9ianR5cGUpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy5jIGIvYmZkL3Ztcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGVhNjNmLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NDYgKzAsMCBAQAotLyogdm1zLmMgLS0gQkZEIGJhY2stZW5kIGZvciBWQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi1zdGF0aWMgYm9vbGVhbiB2bXNfaW5pdGlhbGl6ZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBwcml2X3NlY3Rpb25fY291bnQ7Ci1zdGF0aWMgYm9vbGVhbiBmaWxsX3NlY3Rpb25fcHRyIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHZtc19maXh1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29weV9zeW1ib2xzIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmVsb2NfbmlsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp2bXNfb2JqZWN0X3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnZtc19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfbWtvYmplY3QgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2Nsb3NlX2FuZF9jbGVhbnVwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiB4MSwgZmlsZV9wdHIgeDIsCi0JICAgYmZkX3NpemVfdHlwZSB4MykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBiZmRfd2luZG93ICp3LCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICpzcmMsIGJmZCAqZGVzdCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqc3JjYmZkLCBhc2VjdGlvbiAqc3Jjc2VjLCBiZmQgKmRzdGJmZCwgYXNlY3Rpb24gKmRzdHNlYykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSAgUEFSQU1TICgoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKmFiZmQsIHZvaWQgKmZpbGUpKTsKLXN0YXRpYyBjaGFyICp2bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgdm1zX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmQgKmJiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqKnRhYmxvYywgYmZkX3NpemVfdHlwZSAqdGFibGVuLAotCSAgIGNvbnN0IGNoYXIgKipuYW1lKSk7Ci1zdGF0aWMgdm9pZCB2bXNfdHJ1bmNhdGVfYXJuYW1lCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqcGF0aG5hbWUsIGNoYXIgKmFyaGRyKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwgc3RydWN0IG9ybCAqbWFwLAotCSAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLXN0YXRpYyBQVFIgdm1zX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJmZCAqdm1zX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICphYmZkLCBzeW1pbmRleCBpbmRleCkpOwotc3RhdGljIGJmZCAqdm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2gsIGJmZCAqcHJldikpOwotc3RhdGljIGJvb2xlYW4gdm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgaW50IHZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3Qgc3RhdCAqc3RhdCkpOwotc3RhdGljIGxvbmcgdm1zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgdm9pZCB2bXNfcHJpbnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCwgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOwotc3RhdGljIHZvaWQgdm1zX2dldF9zeW1ib2xfaW5mbwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYWxlbnQgKnZtc19nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltYm9sKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgYXN5bWJvbCAqKnN5bWJvbHMsIGJmZF92bWEgb2Zmc2V0LAotCSAgIGNvbnN0IGNoYXIgKipmaWxlLCBjb25zdCBjaGFyICoqZnVuYywgdW5zaWduZWQgaW50ICpsaW5lKSk7Ci1zdGF0aWMgYXN5bWJvbCAqdm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBzaXplKSk7Ci1zdGF0aWMgbG9uZyB2bXNfcmVhZF9taW5pc3ltYm9scwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYywgUFRSICptaW5pc3ltc3AsIHVuc2lnbmVkIGludCAqc2l6ZXApKTsKLXN0YXRpYyBhc3ltYm9sICp2bXNfbWluaXN5bWJvbF90b19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGR5bmFtaWMsIGNvbnN0IFBUUiBtaW5pc3ltLCBhc3ltYm9sICpzeW0pKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCkpOwotc3RhdGljIGxvbmcgdm1zX2Nhbm9uaWNhbGl6ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzcmNzZWMsIGFyZWxlbnQgKipsb2NhdGlvbiwKLQkgICBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKnZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICphYmZkLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwgdW5zaWduZWQgbG9uZyBtYWNoKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotc3RhdGljIGludCB2bXNfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIHJlbG9jKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnZtc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsIGJmZF9ieXRlICpkYXRhLAotCSAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0JICAgYm9vbGVhbiAqYWdhaW4pKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfZ2Nfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnZtc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyB2bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKiphcmVsLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYmZkICpvYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpKTsKLQotI2RlZmluZSB2bXNfbWFrZV9lbXB0eV9zeW1ib2wgX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wKLQwKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotY29uc3QgYmZkX3RhcmdldCB2bXNfYWxwaGFfdmVjID0KLXsKLSAgInZtcy1hbHBoYSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEhBU19TWU1TCi0gICB8IFdQX1RFWFQgfCBEX1BBR0VEKSwJLyogb2JqZWN0IGZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZKSwJCS8qIHNlY3QgZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgdm1zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgdm1zX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCB2bXNfbWtvYmplY3QsCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIHZtc193cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKHZtcyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgdm1zX3ZheF92ZWMgPQotewotICAidm1zLXZheCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEhBU19TWU1TIAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIHwgV1BfVEVYVCB8IERfUEFHRUQKLSAgIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19MT0NBTFMpLAotCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZKSwJCS8qIHNlY3QgZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIHZtc19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIHZtc19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgdm1zX21rb2JqZWN0LAkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCB2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDICh2bXMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwotDAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiBJbml0aWFsaXplIHByaXZhdGUgZGF0YSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19pbml0aWFsaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBpOwotCi0gIGlmIChhYmZkLT50ZGF0YS5hbnkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKS0xKTsKLQotICBhYmZkLT50ZGF0YS5hbnkgPSAoKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCopCi0JCSAgICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgdm1zX3ByaXZhdGVfZGF0YV9zdHJ1Y3QpKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5hbnkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZmRlZiBfX0FMUEhBCi0gIFBSSVYoaXNfdmF4KSA9IDA7Ci0jZWxzZQotICBQUklWKGlzX3ZheCkgPSAxOwotI2VuZGlmCi0gIFBSSVYodm1zX2J1ZikgPSAwOwotICBQUklWKGJ1Zl9zaXplKSA9IDA7Ci0gIFBSSVYocmVjX2xlbmd0aCkgPSAwOwotICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX1VOS05PV047Ci0gIFBSSVYoZml4dXBfZG9uZSkgPSBmYWxzZTsKLSAgUFJJVihzZWN0aW9ucykgPSBOVUxMOwotCi0gIFBSSVYoc3RhY2spID0gKChzdHJ1Y3Qgc3RhY2tfc3RydWN0ICopCi0JCSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdGFja19zdHJ1Y3QpICogU1RBQ0tTSVpFKSk7Ci0gIGlmIChQUklWKHN0YWNrKSA9PSAwKQotICAgIHsKLSAgICAgdm1zX2luaXRfbm9fbWVtMToKLSAgICAgIGZyZWUgKGFiZmQtPnRkYXRhLmFueSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hbnkgPSAwOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgUFJJVihzdGFja3B0cikgPSAwOwotCi0gIFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLSAgaWYgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPT0gMCkKLSAgICB7Ci0gICAgIHZtc19pbml0X25vX21lbTI6Ci0gICAgICBmcmVlIChQUklWKHN0YWNrKSk7Ci0gICAgICBQUklWKHN0YWNrKSA9IDA7Ci0gICAgICBnb3RvIHZtc19pbml0X25vX21lbTE7Ci0gICAgfQotCi0gIGlmICghYmZkX2hhc2hfdGFibGVfaW5pdCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgX2JmZF92bXNfaGFzaF9uZXdmdW5jKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAoKHN0cnVjdCBsb2NhdGlvbl9zdHJ1Y3QgKikKLQkJCSAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbG9jYXRpb25fc3RydWN0KQotCQkJCSAgICAgICogTE9DQVRJT05fU0FWRV9TSVpFKSk7Ci0gIGlmIChQUklWKGxvY2F0aW9uX3N0YWNrKSA9PSAwKQotICAgIHsKLSAgICAgdm1zX2luaXRfbm9fbWVtMzoKLSAgICAgIGZyZWUgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkpOwotICAgICAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9IDA7Ci0gICAgICBnb3RvIHZtc19pbml0X25vX21lbTI7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBWTVNfU0VDVElPTl9DT1VOVDsgaSsrKQotICAgIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldID0gTlVMTDsKLQotICBQUklWKG91dHB1dF9idWYpID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jIChNQVhfT1VUUkVDX1NJWkUpOwotICBpZiAoUFJJVihvdXRwdXRfYnVmKSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYobG9jYXRpb25fc3RhY2spKTsKLSAgICAgIFBSSVYobG9jYXRpb25fc3RhY2spID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMzsKLSAgICB9Ci0gIFBSSVYocHVzaF9sZXZlbCkgPSAwOwotICBQUklWKHB1c2hlZF9zaXplKSA9IDA7Ci0gIFBSSVYobGVuZ3RoX3BvcykgPSAyOwotICBQUklWKG91dHB1dF9zaXplKSA9IDA7Ci0gIFBSSVYob3V0cHV0X2FsaWdubWVudCkgPSAxOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEZpbGwgc3ltYm9sLT5zZWN0aW9uIHdpdGggc2VjdGlvbiBwdHIKLSAgIHN5bWJvbC0+c2VjdGlvbiBpcyBmaWxsZWQgd2l0aCB0aGUgc2VjdGlvbiBpbmRleCBmb3IgZGVmaW5lZCBzeW1ib2xzCi0gICBkdXJpbmcgcmVhZGluZyB0aGUgR1NEL0VHU0Qgc2VjdGlvbi4gQnV0IHdlIG5lZWQgdGhlIHBvaW50ZXIgdG8gdGhlCi0gICBiZmQgc2VjdGlvbiBsYXRlci4KLQotICAgSXQgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIGZvciByZWZlcmVuY2VkICh1bmRlZmluZWQgc2VjdGlvbikgc3ltYm9scwotCi0gICBjYWxsZWQgZnJvbSBiZmRfaGFzaF90cmF2ZXJzZSBpbiB2bXNfZml4dXBfc2VjdGlvbnMgICovCi0KLXN0YXRpYyBib29sZWFuCi1maWxsX3NlY3Rpb25fcHRyIChlbnRyeSwgc2VjdGlvbnMpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIFBUUiBzZWN0aW9uczsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqc3ltOwotCi0gIHN5bSA9ICAoKHZtc19zeW1ib2xfZW50cnkgKillbnRyeSktPnN5bWJvbDsKLSAgc2VjID0gc3ltLT5zZWN0aW9uOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgImZpbGxfc2VjdGlvbl9wdHI6IHN5bSAlcCwgc2VjICVwXG4iLCBzeW0sIHNlYyk7Ci0jZW5kaWYKLQotICAvKiBmaWxsIGZvcndhcmQgcmVmZXJlbmNlcyAodGhlc2UgY29udGFpbiBzZWN0aW9uIG51bWJlciwgbm90IHNlY3Rpb24gcHRyKS4gICovCi0KLSAgaWYgKCh1bnNpZ25lZCBpbnQpIHNlYyA8IHByaXZfc2VjdGlvbl9jb3VudCkKLSAgICB7Ci0gICAgICBzZWMgPSAoKHZtc19zeW1ib2xfZW50cnkgKillbnRyeSktPnN5bWJvbC0+c2VjdGlvbiA9Ci0JKChhc2VjdGlvbiAqKilzZWN0aW9ucylbKGludClzZWNdOwotICAgIH0KLQotICBpZiAoc3RyY21wIChzeW0tPm5hbWUsIHNlYy0+bmFtZSkgPT0gMCkKLSAgICBzeW0tPmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBGaXh1cCBzZWN0aW9ucwotICAgc2V0IHVwIGFsbCBwb2ludGVycyBhbmQgYXJyYXlzLCBjb3VudGVycyBhbmQgc2l6ZXMgYXJlIGZpeGVkIG5vdwotCi0gICB3ZSBidWlsZCBhIHByaXZhdGUgc2VjdGlvbnMgdmVjdG9yIGZvciBlYXN5IGFjY2VzcyBzaW5jZSBzZWN0aW9ucwotICAgYXJlIGFsd2F5cyByZWZlcmVuY2VkIGJ5IGFuIGluZGV4IG51bWJlci4KLQotICAgYWxsb2MgUFJJVihzZWN0aW9ucykgYWNjb3JkaW5nIHRvIGFiZmQtPnNlY3Rpb25fY291bnQKLQljb3B5IGFiZmQtPnNlY3Rpb25zIHRvIFBSSVYoc2VjdGlvbnMpICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChQUklWKGZpeHVwX2RvbmUpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qCi0gICAqIHRyYXZlcnNlIHN5bWJvbCB0YWJsZSBhbmQgZmlsbCBpbiBhbGwgc2VjdGlvbiBwb2ludGVycwotICAgKi8KLQotICAvKiBjYW4ndCBwcm92aWRlIHNlY3Rpb24gY291bnQgYXMgYXJndW1lbnQgdG8gZmlsbF9zZWN0aW9uX3B0cigpLiAgKi8KLSAgcHJpdl9zZWN0aW9uX2NvdW50ID0gUFJJVihzZWN0aW9uX2NvdW50KTsKLSAgYmZkX2hhc2hfdHJhdmVyc2UgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIGZpbGxfc2VjdGlvbl9wdHIsCi0JCSAgICAoUFRSKShQUklWKHNlY3Rpb25zKSkpOwotCi0gIFBSSVYoZml4dXBfZG9uZSkgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIENoZWNrIHRoZSBmb3JtYXQgZm9yIGEgZmlsZSBiZWluZyByZWFkLgotICAgUmV0dXJuIGEgKGJmZF90YXJnZXQgKikgaWYgaXQncyBhbiBvYmplY3QgZmlsZSBvciB6ZXJvIGlmIG5vdC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqCi12bXNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGVyciA9IDA7Ci0gIGludCBwcmV2X3R5cGU7Ci0gIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjdG9yID0gMDsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfb2JqZWN0X3AoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmICghdm1zX2luaXRpYWxpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInZtc19pbml0aWFsaXplICgpIGZhaWxlZCAhIVxuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgU0VFS19TRVQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcHJldl90eXBlID0gLTE7Ci0KLSAgZG8KLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDcsICJyZWFkaW5nIGF0ICUwOGx4XG4iLCBiZmRfdGVsbChhYmZkKSk7Ci0jZW5kaWYKLSAgICAgIGlmIChfYmZkX3Ztc19uZXh0X3JlY29yZCAoYWJmZCkgPCAwKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMiwgIm5leHRfcmVjb3JkIGZhaWxlZFxuIik7ICAgICAgCi0jZW5kaWYKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoKHByZXZfdHlwZSA9PSBFT0JKX1NfQ19FR1NEKQotCSAgICYmIChQUklWKHJlY190eXBlKSAhPSBFT0JKX1NfQ19FR1NEKSkKLQl7Ci0JICBpZiAodm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKSA9PSBmYWxzZSkKLQkgICAgewotI2lmIFZNU19ERUJVRwotCSAgICAgIHZtc19kZWJ1ZyAoMiwgInZtc19maXh1cF9zZWN0aW9ucyBmYWlsZWRcbiIpOwotI2VuZGlmCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByZXZfdHlwZSA9IFBSSVYocmVjX3R5cGUpOwotCi0gICAgICBpZiAodGFyZ2V0X3ZlY3RvciA9PSAwKQotCXsKLQkgIGlmIChwcmV2X3R5cGUgPD0gT0JKX1NfQ19NQVhSRUNUWVApCi0JICAgIHRhcmdldF92ZWN0b3IgPSAmdm1zX3ZheF92ZWM7Ci0JICBlbHNlCi0JICAgIHRhcmdldF92ZWN0b3IgPSAmdm1zX2FscGhhX3ZlYzsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocHJldl90eXBlKQotCXsKLQkgIGNhc2UgT0JKX1NfQ19IRFI6Ci0JICBjYXNlIEVPQkpfU19DX0VNSDoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfaGRyIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19FT006Ci0JICBjYXNlIE9CSl9TX0NfRU9NVzoKLQkgIGNhc2UgRU9CSl9TX0NfRUVPTToKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZW9tIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19HU0Q6Ci0JICBjYXNlIEVPQkpfU19DX0VHU0Q6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2dzZCAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfVElSOgotCSAgY2FzZSBFT0JKX1NfQ19FVElSOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF90aXIgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0RCRzoKLQkgIGNhc2UgRU9CSl9TX0NfRURCRzoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZGJnIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19UQlQ6Ci0JICBjYXNlIEVPQkpfU19DX0VUQlQ6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX3RidCAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfTE5LOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9sbmsgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgZXJyID0gLTE7Ci0JfQotICAgICAgaWYgKGVyciAhPSAwKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMiwgInNsdXJwIHR5cGUgJWQgZmFpbGVkIHdpdGggJWRcbiIsIHByZXZfdHlwZSwgZXJyKTsKLSNlbmRpZgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICB3aGlsZSAoKHByZXZfdHlwZSAhPSBFT0JKX1NfQ19FRU9NKSAmJiAocHJldl90eXBlICE9IE9CSl9TX0NfRU9NKSAmJiAocHJldl90eXBlICE9IE9CSl9TX0NfRU9NVykpOwotCi0gIGlmICh0YXJnZXRfdmVjdG9yID09ICZ2bXNfdmF4X3ZlYykKLSAgICB7Ci0gICAgICBpZiAodm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKSA9PSBmYWxzZSkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDIsICJ2bXNfZml4dXBfc2VjdGlvbnMgZmFpbGVkXG4iKTsKLSNlbmRpZgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIHNldCBhcmNoX2luZm8gdG8gdmF4ICAqLwotIAotICAgICAgYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJ2YXgiKTsKLSAgICAgIFBSSVYgKGlzX3ZheCkgPSAxOwotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBpcyB2YXhcbiIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmICh0YXJnZXRfdmVjdG9yID09ICZ2bXNfYWxwaGFfdmVjKQotICAgIHsKLSAgICAgIC8qIHNldCBhcmNoX2luZm8gdG8gYWxwaGEgICovCi0gCi0gICAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoImFscGhhIik7Ci0gICAgICBQUklWIChpc192YXgpID0gMDsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoMiwgImFyY2ggaXMgYWxwaGFcbiIpOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChhcmNoID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBub3QgZm91bmRcbiIpOwotI2VuZGlmCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgYWJmZC0+YXJjaF9pbmZvID0gYXJjaDsKLQotICByZXR1cm4gdGFyZ2V0X3ZlY3RvcjsKLX0KLQotCi0vKiBDaGVjayB0aGUgZm9ybWF0IGZvciBhIGZpbGUgYmVpbmcgcmVhZC4KLSAgIFJldHVybiBhIChiZmRfdGFyZ2V0ICopIGlmIGl0J3MgYW4gYXJjaGl2ZSBmaWxlIG9yIHplcm8uICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKgotdm1zX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19hcmNoaXZlX3AoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfbWtvYmplY3QoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmICghdm1zX2luaXRpYWxpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInZtc19pbml0aWFsaXplICgpIGZhaWxlZCAhIVxuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgewotI2lmZGVmIF9fVkFYCi0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoID0gYmZkX3NjYW5fYXJjaCAoInZheCIpOwotI2Vsc2UKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoICgiYWxwaGEiKTsKLSNlbmRpZgotICAgIGlmIChhcmNoID09IDApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICBhYmZkLT5hcmNoX2luZm8gPSBhcmNoOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogV3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4sIGF0IGJmZF9jbG9zZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc193cml0ZV9vYmplY3RfY29udGVudHMoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmIChhYmZkLT5zZWN0aW9uX2NvdW50ID4gMCkJCQkvKiB3ZSBoYXZlIHNlY3Rpb25zICovCi0gICAgewotICAgICAgaWYgKFBSSVYoaXNfdmF4KSkKLQl7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBPQkpfU19DX0hEUikgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2dzZCAoYWJmZCwgT0JKX1NfQ19HU0QpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIE9CSl9TX0NfVElSKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBPQkpfU19DX1RCVCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2RiZyAoYWJmZCwgT0JKX1NfQ19EQkcpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChhYmZkLT5zZWN0aW9uX2NvdW50ID4gMjU1KQotCSAgICB7Ci0JICAgICAgaWYgKF9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgT0JKX1NfQ19FT01XKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIE9CSl9TX0NfRU9NKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgRU9CSl9TX0NfRU1IKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBFT0JKX1NfQ19FR1NEKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfdGlyIChhYmZkLCBFT0JKX1NfQ19FVElSKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBFT0JKX1NfQ19FVEJUKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBFT0JKX1NfQ19FREJHKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBFT0JKX1NfQ19FRU9NKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qLS0gNC4xLCBnZW5lcmljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQ2FsbGVkIHdoZW4gdGhlIEJGRCBpcyBiZWluZyBjbG9zZWQgdG8gZG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqc2VjOwotICB2bXNfc2VjdGlvbiAqZXMsICplczE7Ci0gIGludCBpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jbG9zZV9hbmRfY2xlYW51cCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIGlmIChhYmZkID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKFBSSVYodm1zX2J1ZikgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHZtc19idWYpKTsKLSAgICAgIFBSSVYodm1zX2J1ZikgPSBOVUxMOwotICAgIH0KLSAgUFJJVihidWZfc2l6ZSkgPSAwOwotCi0gIGlmIChQUklWKG91dHB1dF9idWYpICE9IDApCi0gICAgewotICAgICAgZnJlZSAoUFJJVihvdXRwdXRfYnVmKSk7Ci0gICAgICBQUklWKG91dHB1dF9idWYpID0gMDsKLSAgICB9Ci0KLSAgc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0gIHdoaWxlIChzZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2VjLT5jb250ZW50cykKLQlmcmVlIChzZWMtPmNvbnRlbnRzKTsKLSAgICAgIHNlYyA9IHNlYy0+bmV4dDsKLSAgICB9Ci0KLSAgaWYgKFBSSVYoc2VjdGlvbnMpICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoUFJJVihzZWN0aW9ucykpOwotICAgICAgUFJJVihzZWN0aW9ucykgPSBOVUxMOwotICAgIH0KLQotICBpZiAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSkKLSAgICB7Ci0gICAgICBiZmRfaGFzaF90YWJsZV9mcmVlIChQUklWKHZtc19zeW1ib2xfdGFibGUpKTsKLSAgICAgIFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPSAwOwotICAgIH0KLQotICBpZiAoUFJJVihzdGFjaykpCi0gICAgewotICAgICAgZnJlZSAoUFJJVihzdGFjaykpOwotICAgICAgUFJJVihzdGFjaykgPSAwOwotICAgIH0KLQotICBpZiAoUFJJVihsb2NhdGlvbl9zdGFjaykpCi0gICAgewotICAgICAgZnJlZSAoUFJJVihsb2NhdGlvbl9zdGFjaykpOwotICAgICAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgVk1TX1NFQ1RJT05fQ09VTlQ7IGkrKykKLSAgICB7Ci0gICAgICBlcyA9IFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldOwotICAgICAgd2hpbGUgKGVzICE9IE5VTEwpCi0JewotCSAgZXMxID0gZXMtPm5leHQ7Ci0JICBmcmVlIChlcyk7Ci0JICBlcyA9IGVzMTsKLQl9Ci0gICAgICBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtpXSA9IE5VTEw7Ci0gICB9Ci0KLSAgZnJlZSAoYWJmZC0+dGRhdGEuYW55KTsKLSAgYWJmZC0+dGRhdGEuYW55ID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBBc2sgdGhlIEJGRCB0byBmcmVlIGFsbCBjYWNoZWQgaW5mb3JtYXRpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfZnJlZV9jYWNoZWRfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZnJlZV9jYWNoZWRfaW5mbyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENhbGxlZCB3aGVuIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX25ld19zZWN0aW9uX2hvb2sgKCVwLCBbJWRdJXMpLCBjb3VudCAlZFxuIiwgYWJmZCwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIGFiZmQtPnNlY3Rpb25fY291bnQpOwotI2VuZGlmCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYWJmZCwgc2VjdGlvbiwgNCk7Ci0KLSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiBQUklWKHNlY3Rpb25fY291bnQpKQotICAgIHsKLSAgICAgIFBSSVYoc2VjdGlvbnMpID0gKChhc2VjdGlvbiAqKikKLQkJCSAgICBiZmRfcmVhbGxvYyAoUFJJVihzZWN0aW9ucyksIGFiZmQtPnNlY3Rpb25fY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gICAgICBpZiAoUFJJVihzZWN0aW9ucykgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBQUklWKHNlY3Rpb25fY291bnQpID0gYWJmZC0+c2VjdGlvbl9jb3VudDsKLSAgICB9Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInNlY3Rpb25fY291bnQ6ICVkXG4iLCBQUklWKHNlY3Rpb25fY291bnQpKTsKLSNlbmRpZgotICBQUklWKHNlY3Rpb25zKVtzZWN0aW9uLT5pbmRleF0gPSBzZWN0aW9uOwotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDcsICIlZDogJXNcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4KLSAgIGJ1ZiBwb2ludHMgdG8gYSBidWZmZXIgb2YgYnVmX3NpemUgYnl0ZXMgdG8gYmUgZmlsbGVkIHdpdGgKLSAgIHNlY3Rpb24gZGF0YSAoc3RhcnRpbmcgYXQgb2Zmc2V0IGludG8gc2VjdGlvbikgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGJ1Ziwgb2Zmc2V0LCBidWZfc2l6ZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBidWYgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgYnVmX3NpemUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzKCVwLCAlcywgJXAsIG9mZiAlbGQsIHNpemUgJWQpXG4iLAotCQkgYWJmZCwgc2VjdGlvbi0+bmFtZSwgYnVmLCBvZmZzZXQsIChpbnQpYnVmX3NpemUpOwotI2VuZGlmCi0KLSAgLyogc2hvdWxkbid0IGJlIGNhbGxlZCwgc2luY2UgYWxsIHNlY3Rpb25zIGFyZSBJTl9NRU1PUlkgICovCi0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uCi0gICBidWYgcG9pbnRzIHRvIGEgYnVmZmVyIG9mIGJ1Zl9zaXplIGJ5dGVzIHRvIGJlIGZpbGxlZCB3aXRoCi0gICBzZWN0aW9uIGRhdGEgKHN0YXJ0aW5nIGF0IG9mZnNldCBpbnRvIHNlY3Rpb24pICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyAoYWJmZCwgc2VjdGlvbiwgdywgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF93aW5kb3cgKncgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyglcCwgJXMsICVwLCBvZmYgJWxkLCBjb3VudCAlZClcbiIsCi0JCSBhYmZkLCBzZWN0aW9uLT5uYW1lLCB3LCBvZmZzZXQsIChpbnQpY291bnQpOwotI2VuZGlmCi0KLSAgLyogc2hvdWxkbid0IGJlIGNhbGxlZCwgc2luY2UgYWxsIHNlY3Rpb25zIGFyZSBJTl9NRU1PUlkgICovCi0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tIFBhcnQgNC4yLCBjb3B5IHByaXZhdGUgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoc3JjLCBkZXN0KQotICAgICBiZmQgKnNyYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmRlc3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoJXAsICVwKVxuIiwgc3JjLCBkZXN0KTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBNZXJnZSBwcml2YXRlIEJGRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgQHZhcntpYmZkfSB0byB0aGUKLSAgIHRoZSBvdXRwdXQgZmlsZSBCRkQgQHZhcntvYmZkfSB3aGVuIGxpbmtpbmcuICBSZXR1cm4gPDx0cnVlPj4KLSAgIG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0gICBvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLSAgICAgTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwidm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKCVwLCAlcClcbiIsIGliZmQsIG9iZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFNldCBwcml2YXRlIEJGRCBmbGFnIGluZm9ybWF0aW9uIGluIHRoZSBCRkQgQHZhcnthYmZkfS4KLSAgIFJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotICAgcmV0dXJucyBhcmU6Ci0KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotICAgICBOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwidm1zX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyglcCwgJWx4KVxuIiwgYWJmZCwgKGxvbmcpZmxhZ3MpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHNlY3Rpb24gZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKHNyY2JmZCwgc3Jjc2VjLCBkc3RiZmQsIGRzdHNlYykKLSAgICAgYmZkICpzcmNiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNyY3NlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmRzdGJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqZHN0c2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSglcCwgJXMsICVwLCAlcylcbiIsCi0JCSBzcmNiZmQsIHNyY3NlYy0+bmFtZSwgZHN0YmZkLCBkc3RzZWMtPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuIAotdm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgKGliZmQsIGlzeW0sIG9iZmQsIG9zeW0pCi0gICAgIGJmZCAqaWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICppc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpvc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKCVwLCAlcywgJXAsICVzKVxuIiwKLQkJIGliZmQsIGlzeW0tPm5hbWUsIG9iZmQsIG9zeW0tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKi0tIFBhcnQgNC4zLCBjb3JlIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiBhIHJlYWQtb25seSBzdHJpbmcgZXhwbGFpbmluZyB3aGljaCBwcm9ncmFtIHdhcyBydW5uaW5nCi0gICB3aGVuIGl0IGZhaWxlZCBhbmQgcHJvZHVjZWQgdGhlIGNvcmUgZmlsZSBhYmZkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotdm1zX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFJldHVybnMgdGhlIHNpZ25hbCBudW1iZXIgd2hpY2ggY2F1c2VkIHRoZSBjb3JlIGR1bXAgd2hpY2gKLSAgIGdlbmVyYXRlZCB0aGUgZmlsZSB0aGUgQkZEIGFiZmQgaXMgYXR0YWNoZWQgdG8uICAqLwotCi1zdGF0aWMgaW50Ci12bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBjb3JlIGZpbGUgYXR0YWNoZWQgdG8gY29yZV9iZmQgd2FzIGdlbmVyYXRlZAotICAgYnkgYSBydW4gb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhdHRhY2hlZCB0byBleGVjX2JmZCwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGFiZmQsIGJiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmJiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCglcCwgJXApXG4iLCBhYmZkLCBiYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qLS0gUGFydCA0LjQsIGFyY2hpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGFyY2hpdmUgbWFwLgotICAgUmV0dXJuIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2x1cnBfYXJtYXAoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0gICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0gICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqdGFibG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRhYmxlbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogVHJ1bmNhdGUgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSB0byBtYXRjaCBzeXN0ZW0tZGVwZW5kZW50IHJlc3RyaWN0aW9ucyAgKi8KLQotc3RhdGljIHZvaWQKLXZtc190cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmFyaGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc190cnVuY2F0ZV9hcm5hbWUoJXAsICVzLCAlcylcbiIsIGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7Ci0jZW5kaWYKLSAgcmV0dXJuOwotfQotCi0KLS8qID8/Pwl3cml0ZSBhcmNoaXZlIG1hcCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc193cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzdHJpZHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3dyaXRlX2FybWFwKCVwLCAlZCwgJXAsICVkICVkKVxuIiwKLQlhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhcmNoaXZlIGhlYWRlciA/Pz8gICovCi0KLXN0YXRpYyBQVFIKLXZtc19yZWFkX2FyX2hkciAoYWJmZCkKLSAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19yZWFkX2FyX2hkciglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAoUFRSKTA7Ci19Ci0KLQotLyogUHJvdmlkZWQgYSBCRkQsIEB2YXJ7YXJjaGl2ZX0sIGNvbnRhaW5pbmcgYW4gYXJjaGl2ZSBhbmQgTlVMTCwgb3BlbgotICAgYW4gaW5wdXQgQkZEIG9uIHRoZSBmaXJzdCBjb250YWluZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGF0LgotICAgU3Vic2VxdWVudCBjYWxscyBzaG91bGQgcGFzcyB0aGUgYXJjaGl2ZSBhbmQgdGhlIHByZXZpb3VzIHJldHVybiB2YWx1ZQotICAgdG8gcmV0dXJuIGEgY3JlYXRlZCBCRkQgdG8gdGhlIG5leHQgY29udGFpbmVkIGVsZW1lbnQuCi0gICBOVUxMIGlzIHJldHVybmVkIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUuICAqLwotCi1zdGF0aWMgYmZkICoKLXZtc19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIHByZXYpCi0gICAgIGJmZCAqYXJjaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKnByZXYgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSglcCwgJXApXG4iLCBhcmNoLCBwcmV2KTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogUmV0dXJuIHRoZSBCRkQgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ltYm9sIGluIEFCRkQgaW5kZXhlZCBieQotICAgSU5ERVguICBJTkRFWCBzaG91bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGJmZF9nZXRfbmV4dF9tYXBlbnQuICAqLwotCi1zdGF0aWMgYmZkICoKLXZtc19nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9lbHRfYXRfaW5kZXgoJXAsICVwKVxuIiwgYWJmZCwgaW5kZXgpOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleChhYmZkLCBpbmRleCk7Ci19Ci0KLQotLyogPz8/Ci0gICAtPiBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0ICAqLwotCi1zdGF0aWMgaW50Ci12bXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBzdGF0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpzdGF0OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KCVwLCAlcClcbiIsIGFiZmQsIHN0YXQpOwotI2VuZGlmCi0gIHJldHVybiBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KGFiZmQsIHN0YXQpOwotfQotCi0KLS8qIFRoaXMgaXMgYSBuZXcgZnVuY3Rpb24gaW4gYmZkIDIuNSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc191cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyotLSBQYXJ0IDQuNSwgc3ltYm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIGEgdmVjdG9yIG9mIHBvaW50ZXJzCi0gICB0byBhc3ltYm9scyBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBCRkQgYWJmZCwgaW5jbHVkaW5nIGEKLSAgIHRlcm1pbmFsIE5VTEwgcG9pbnRlci4gSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMgaW4gdGhlIEJGRCwKLSAgIHRoZW4gcmV0dXJuIDAuICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCglcCksICVkIHN5bWJvbHNcbiIsIGFiZmQsIFBSSVYoZ3NkX3N5bV9jb3VudCkpOwotI2VuZGlmCi0gIHJldHVybiAoUFJJVihnc2Rfc3ltX2NvdW50KSsxKSAqIHNpemVvZihhc3ltYm9sICopOwotfQotCi0KLS8qIENvcHkgc3ltYm9scyBmcm9tIGhhc2ggdGFibGUgdG8gc3ltYm9sIHZlY3RvcgotCi0gICBjYWxsZWQgZnJvbSBiZmRfaGFzaF90cmF2ZXJzZSBpbiB2bXNfZ2V0X3N5bXRhYgotICAgaW5pdCBjb3VudGVyIHRvIDAgaWYgZW50cnkgPT0gMCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvcHlfc3ltYm9scyAoZW50cnksIGFyZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgUFRSIGFyZzsKLXsKLSAgYmZkICphYmZkID0gKGJmZCAqKSBhcmc7Ci0KLSAgaWYgKGVudHJ5ID09IE5VTEwpCS8qIGluaXQgY291bnRlciAqLwotICAgIFBSSVYoc3ltbnVtKSA9IDA7Ci0gIGVsc2UJCQkvKiBmaWxsIHZlY3RvciwgaW5jIGNvdW50ZXIgKi8KLSAgICBQUklWKHN5bWNhY2hlKVtQUklWKHN5bW51bSkrK10gPSAoKHZtc19zeW1ib2xfZW50cnkgKillbnRyeSktPnN5bWJvbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBSZWFkIHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRCBhYmZkLCBhbmQgZmlsbHMgaW4gdGhlIHZlY3RvcgotICAgbG9jYXRpb24gd2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBhbmQgYSB0cmFpbGluZyBOVUxMLgotCi0gICByZXR1cm4gIyBvZiBzeW1ib2xzIHJlYWQgICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X3N5bXRhYiAoYWJmZCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zeW10YWIoJXAsIDxyZXQ+KVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotCS8qIGluaXQgY291bnRlciAqLwotICAodm9pZCljb3B5X3N5bWJvbHMoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKTAsIGFiZmQpOwotCi0JLyogdHJhdmVyc2UgdGFibGUgYW5kIGZpbGwgc3ltYm9scyB2ZWN0b3IgKi8KLQotICBQUklWKHN5bWNhY2hlKSA9IHN5bWJvbHM7Ci0gIGJmZF9oYXNoX3RyYXZlcnNlKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIGNvcHlfc3ltYm9scywgKFBUUilhYmZkKTsKLQotICBzeW1ib2xzW1BSSVYoZ3NkX3N5bV9jb3VudCldID0gTlVMTDsKLQotICByZXR1cm4gUFJJVihnc2Rfc3ltX2NvdW50KTsKLX0KLQotCi0vKiBDcmVhdGUgYSBuZXcgYXN5bWJvbCBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgYWJmZCBhbmQgcmV0dXJuIGEgcG9pbnRlcgotICAgdG8gaXQuCi0gICBUaGlzIHJvdXRpbmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZWFjaCBiYWNrIGVuZCBoYXMgcHJpdmF0ZSBpbmZvcm1hdGlvbgotICAgc3Vycm91bmRpbmcgdGhlIGFzeW1ib2wuIEJ1aWxkaW5nIHlvdXIgb3duIGFzeW1ib2wgYW5kIHBvaW50aW5nIHRvIGl0Ci0gICB3aWxsIG5vdCBjcmVhdGUgdGhlIHByaXZhdGUgaW5mb3JtYXRpb24sIGFuZCB3aWxsIGNhdXNlIHByb2JsZW1zIGxhdGVyIG9uLiAgKi8KLQotYXN5bWJvbCAqCi1fYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpzeW1ib2wgPSAoYXN5bWJvbCAqKWJmZF96YWxsb2MoYWJmZCwgc2l6ZW9mKGFzeW1ib2wpKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKHN5bWJvbCA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBzeW1ib2wtPnRoZV9iZmQgPSBhYmZkOwotCi0gIHJldHVybiBzeW1ib2w7Ci19Ci0KLQotLyogUHJpbnQgc3ltYm9sIHRvIGZpbGUgYWNjb3JkaW5nIHRvIGhvdy4gaG93IGlzIG9uZSBvZgotICAgYmZkX3ByaW50X3N5bWJvbF9uYW1lCWp1c3QgcHJpbnQgdGhlIG5hbWUKLSAgIGJmZF9wcmludF9zeW1ib2xfbW9yZQlwcmludCBtb3JlICg/Pz8pCi0gICBiZmRfcHJpbnRfc3ltYm9sX2FsbAlwcmludCBhbGwgd2Uga25vdywgd2hpY2ggaXMgbm90IG11Y2ggcmlnaHQgbm93IDotKSAgKi8KLQotc3RhdGljIHZvaWQKLXZtc19wcmludF9zeW1ib2wgKGFiZmQsIGZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3ByaW50X3N5bWJvbCglcCwgJXAsICVwLCAlZClcbiIsIGFiZmQsIGZpbGUsIHN5bWJvbCwgaG93KTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0JZnByaW50ZigoRklMRSAqKWZpbGUsIiAlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0JewotCSAgQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0JICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKChQVFIpZmlsZSxzeW1ib2wpOwotCi0JICBmcHJpbnRmKChGSUxFICopZmlsZSwiICUtOHMgJXMiLCBzZWN0aW9uX25hbWUsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBzeW1ib2wgaW4gcmV0LgotCi0gICBmaWxsIHR5cGUsIHZhbHVlIGFuZCBuYW1lCi0gICB0eXBlOgotCUEJYWJzb2x1dGUKLQlCCWJzcyBzZWdtZW50IHN5bWJvbAotCUMJY29tbW9uIHN5bWJvbAotCUQJZGF0YSBzZWdtZW50IHN5bWJvbAotCWYJZmlsZW5hbWUKLQl0CWEgc3RhdGljIGZ1bmN0aW9uIHN5bWJvbAotCVQJdGV4dCBzZWdtZW50IHN5bWJvbAotCVUJdW5kZWZpbmVkCi0JLQlkZWJ1ZyAgKi8KLQotc3RhdGljIHZvaWQKLXZtc19nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBhc2VjdGlvbiAqc2VjOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltYm9sX2luZm8oJXAsICVwLCAlcClcbiIsIGFiZmQsIHN5bWJvbCwgcmV0KTsKLSNlbmRpZgotCi0gIHNlYyA9IHN5bWJvbC0+c2VjdGlvbjsKLQotICBpZiAocmV0ID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0MnOwotICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0EnOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ1UnOwotICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0knOwotICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkKLSAgICByZXQtPnR5cGUgPSAnVCc7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKQotICAgIHJldC0+dHlwZSA9ICdEJzsKLSAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0FMTE9DKQotICAgIHJldC0+dHlwZSA9ICdCJzsKLSAgZWxzZQotICAgIHJldC0+dHlwZSA9ICctJzsKLQotICBpZiAocmV0LT50eXBlICE9ICdVJykKLSAgICByZXQtPnZhbHVlID0gc3ltYm9sLT52YWx1ZSArIHN5bWJvbC0+c2VjdGlvbi0+dm1hOwotICBlbHNlCi0gICAgcmV0LT52YWx1ZSA9IDA7Ci0gIHJldC0+bmFtZSA9IHN5bWJvbC0+bmFtZTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN5bWJvbCBzeW0gaW4gdGhlIEJGRCBhYmZkIGlzCi0gICBhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4gZmFsc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKCVwLCAlcylcbiIsIGFiZmQsIG5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBuYW1lWzBdID09ICckJzsKLX0KLQotCi0vKiBHZXQgc291cmNlIGxpbmUgbnVtYmVyIGZvciBzeW1ib2wgICovCi0KLXN0YXRpYyBhbGVudCAqCi12bXNfZ2V0X2xpbmVubyAoYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfbGluZW5vKCVwLCAlcClcbiIsIGFiZmQsIHN5bWJvbCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUHJvdmlkZWQgYSBCRkQsIGEgc2VjdGlvbiBhbmQgYW4gb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24sIGNhbGN1bGF0ZSBhbmQKLSAgIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlIHdhbnRlZAotICAgbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGUsIGZ1bmMsIGxpbmUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBDT05TVCBjaGFyICoqZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBDT05TVCBjaGFyICoqZnVuYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2ZpbmRfbmVhcmVzdF9saW5lKCVwLCAlcywgJXAsICVsZCwgPHJldD4sIDxyZXQ+LCA8cmV0PilcbiIsCi0JICAgICAgYWJmZCwgc2VjdGlvbi0+bmFtZSwgc3ltYm9scywgKGxvbmcgaW50KW9mZnNldCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIEJhY2stZG9vciB0byBhbGxvdyBmb3JtYXQtYXdhcmUgYXBwbGljYXRpb25zIHRvIGNyZWF0ZSBkZWJ1ZyBzeW1ib2xzCi0gICB3aGlsZSB1c2luZyBCRkQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gIEN1cnJlbnRseSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIKLSAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXZtc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgKGFiZmQsIHB0ciwgc2l6ZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHZvaWQgKnB0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBsb25nIHNpemUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCglcCwgJXAsICVsZClcbiIsIGFiZmQsIHB0ciwgc2l6ZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmVhZCBtaW5pc3ltYm9scy4gIEZvciBtaW5pc3ltYm9scywgd2UgdXNlIHRoZSB1bm1vZGlmaWVkIGEub3V0Ci0gICBzeW1ib2xzLiAgVGhlIG1pbmlzeW1ib2xfdG9fc3ltYm9sIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlc2UgaW50bwotICAgQkZEIGFzeW1ib2wgc3RydWN0dXJlcy4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiAqbWluaXN5bXNwOwotICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcmVhZF9taW5pc3ltYm9scyglcCwgJWQsICVwLCAlZClcbiIsIGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgKnNpemVwKTsKLSNlbmRpZgotICByZXR1cm4gX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApOwotfQotCi0vKiBDb252ZXJ0IGEgbWluaXN5bWJvbCB0byBhIEJGRCBhc3ltYm9sLiAgQSBtaW5pc3ltYm9sIGlzIGp1c3QgYW4KLSAgIHVubW9kaWZpZWQgYS5vdXQgc3ltYm9sLiAgVGhlIFNZTSBhcmd1bWVudCBpcyBhIHN0cnVjdHVyZSByZXR1cm5lZAotICAgYnkgYmZkX21ha2VfZW1wdHlfc3ltYm9sLCB3aGljaCB3ZSBmaWxsIGluIGhlcmUuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi12bXNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19taW5pc3ltYm9sX3RvX3N5bWJvbCglcCwgJWQsICVwLCAlcClcbiIsIGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKLX0KLQotLyotLSBQYXJ0IDQuNiwgcmVsb2NhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbgotICAgYXNzb2NpYXRlZCB3aXRoIHNlY3Rpb24gc2VjdCBhdHRhY2hlZCB0byBiZmQgYWJmZC4KLSAgIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKCVwLCAlcylcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiAtMUw7Ci19Ci0KLQotLyogQ2FsbCB0aGUgYmFjayBlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGVuIEJGRCBhYmZkIGFuZCB0cmFuc2xhdGUgdGhlCi0gICBleHRlcm5hbCBmb3JtIG9mIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHNlYyBpbnRvIHRoZQotICAgaW50ZXJuYWwgY2Fub25pY2FsIGZvcm0uICBQbGFjZSB0aGUgdGFibGUgaW50byBtZW1vcnkgYXQgbG9jLCB3aGljaCBoYXMKLSAgIGJlZW4gcHJlYWxsb2NhdGVkLCB1c3VhbGx5IGJ5IGEgY2FsbCB0byBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLgotICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlbG9jcywgb3IgLTEgb24gZXJyb3IuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICoqbG9jYXRpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9yZWxvYyglcCwgJXMsIDxyZXQ+LCA8cmV0PilcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogdGhpcyBpcyBqdXN0IGNvcGllZCBmcm9tIGVjb2ZmLWFscGhhLCBuZWVkcyB0byBiZSBmaXhlZCBwcm9iYWJseSAqLwotCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvYyB0eXBlcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJlbG9jX25pbCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2MgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInJlbG9jX25pbChhYmZkICVwLCBvdXRwdXRfYmZkICVwKVxuIiwgYWJmZCwgb3V0cHV0X2JmZCk7Ci0gIHZtc19kZWJ1ZyAoMiwgIkluIHNlY3Rpb24gJXMsIHN5bWJvbCAlc1xuIiwKLQlzZWMtPm5hbWUsIHN5bS0+bmFtZSk7Ci0gIHZtc19kZWJ1ZyAoMiwgInJlbG9jIHN5bSAlcywgYWRkciAlMDhseCwgYWRkZW5kICUwOGx4LCByZWxvYyBpcyBhICVzXG4iLAotCQlyZWxvYy0+c3ltX3B0cl9wdHJbMF0tPm5hbWUsCi0JCSh1bnNpZ25lZCBsb25nKXJlbG9jLT5hZGRyZXNzLAotCQkodW5zaWduZWQgbG9uZylyZWxvYy0+YWRkZW5kLCByZWxvYy0+aG93dG8tPm5hbWUpOwotICB2bXNfZGVidWcgKDIsICJkYXRhIGF0ICVwXG4iLCBkYXRhKTsKLS8qICBfYmZkX2hleGR1bXAgKDIsIGRhdGEsIGJmZF9nZXRfcmVsb2Nfc2l6ZShyZWxvYy0+aG93dG8pLDApOyAqLwotI2VuZGlmCi0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFscGhhX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoQUxQSEFfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZRVUFELAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyMSBiaXQgYnJhbmNoLiAgVGhlIG5hdGl2ZSBhc3NlbWJsZXIgZ2VuZXJhdGVzIHRoZXNlIGZvcgotICAgICBicmFuY2hlcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYW5kIGFsc28gZmlsbHMgaW4gdGhlIFBDCi0gICAgIHJlbGF0aXZlIG9mZnNldCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBIT1dUTyAoQUxQSEFfUl9CUkFERFIsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIxLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkJSQUREUiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIGhpbnQgZm9yIGEganVtcCB0byBhIHJlZ2lzdGVyLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfSElOVCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMNjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QVVNIIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdG9yZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2sgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICBTdG9yZSBpdCBpbgotICAgICBhIGJpdGZpZWxkIG9mIHNpemUgcl9zaXplIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiByX29mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1NUT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BTVUIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKLSAgICAgZ2l2ZW4gdmFsdWUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFJTSElGVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGFjay4gTGlua2FnZSBpcyBkb25lIGJ5IGxpbmtlci4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJTktBR0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDgsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI1NiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJTktBR0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRkxPTkcsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHByb2NlZHVyZSwgd3JpdHRlbiBhcyAzMiBiaXQgdmFsdWUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9DT0RFQUREUiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQ09ERUFERFIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCwgd2hlbiBpbnZva2VkLCB3aWxsIHBlcmZvcm0KLSAgIHRoZSByZWxvY2F0aW9uIGNvZGUgb24gZGF0YSBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgbm90ZWQuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCi12bXNfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGludCBhbHBoYV90eXBlOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAoJXAsICVkKVx0IiwgYWJmZCwgY29kZSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgY2FzZSBCRkRfUkVMT0NfMTY6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMzI6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZMT05HOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DXzY0OgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGUVVBRDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGUVVBRDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfQlJBRERSOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6CWFscGhhX3R5cGUgPSBBTFBIQV9SX0hJTlQ7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMzI7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfNjRfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMNjQ7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToJYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElOS0FHRTsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfQ09ERUFERFI7CWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJyZWxvYyAoJWQpIGlzICpVTktOT1dOKiIsIGNvZGUpOwotCXJldHVybiAoY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSBOVUxMOwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAicmVsb2MgaXMgJXNcbiIsIGFscGhhX2hvd3RvX3RhYmxlW2FscGhhX3R5cGVdLm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiAmYWxwaGFfaG93dG9fdGFibGVbYWxwaGFfdHlwZV07Ci19Ci0KLQotLyotLSBQYXJ0IDQuNywgd3JpdGluZyBhbiBvYmplY3QgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGluIEJGRCBhYmZkIHRvIGFyY2ggYW5kIG1hY2guCi0gICBGaW5kIHRoZSBjb3JyZWN0IHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBhcmNoX2luZm8KLSAgIHBvaW50ZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2ggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19zZXRfYXJjaF9tYWNoKCVwLCAlZCwgJWxkKVxuIiwgYWJmZCwgYXJjaCwgbWFjaCk7Ci0jZW5kaWYKLSAgYWJmZC0+YXJjaF9pbmZvID0gYmZkX3NjYW5fYXJjaCgiYWxwaGEiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBzZWN0aW9uIGluIEJGRCBhYmZkIHRvIHRoZSBkYXRhIHN0YXJ0aW5nCi0gICBpbiBtZW1vcnkgYXQgZGF0YS4gVGhlIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24gc3RhcnRpbmcgYXQKLSAgIG9mZnNldCBvZmZzZXQgZm9yIGNvdW50IGJ5dGVzLgotCi0gICBOb3JtYWxseSB0cnVlIGlzIHJldHVybmVkLCBlbHNlIGZhbHNlLiBQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKLSAgIG8gYmZkX2Vycm9yX25vX2NvbnRlbnRzIC0gVGhlIG91dHB1dCBzZWN0aW9uIGRvZXMgbm90IGhhdmUgdGhlCi0JU0VDX0hBU19DT05URU5UUyBhdHRyaWJ1dGUsIHNvIG5vdGhpbmcgY2FuIGJlIHdyaXR0ZW4gdG8gaXQuCi0gICBvIGFuZCBzb21lIG1vcmUgdG9vICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19zZXRfc2VjdGlvbl9jb250ZW50cyglcCwgc2VjICVzLCBsb2MgJXAsIG9mZiAlbGQsIGNvdW50ICVkKVxuIiwKLQkJCQkJYWJmZCwgc2VjdGlvbi0+bmFtZSwgbG9jYXRpb24sIChsb25nIGludClvZmZzZXQsIChpbnQpY291bnQpOwotICB2bXNfZGVidWcgKDIsICJzZWNyYXcgJWQsIHNlY2Nvb2tlZCAlZFxuIiwgKGludClzZWN0aW9uLT5fcmF3X3NpemUsIChpbnQpc2VjdGlvbi0+X2Nvb2tlZF9zaXplKTsKLSNlbmRpZgotICByZXR1cm4gX2JmZF9zYXZlX3Ztc19zZWN0aW9uKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KTsKLX0KLQotCi0vKi0tIFBhcnQgNC44LCBsaW5rZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLQotc3RhdGljIGludAotdm1zX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gcmVsb2MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NpemVvZl9oZWFkZXJzKCVwLCAlcylcbiIsIGFiZmQsIChyZWxvYyk/IlRydWUiOiJGYWxzZSIpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgb2YgcmVsb2NhdGlvbiBlZmZvcnQgZm9yIGJhY2sgZW5kcwotICAgd2hpY2ggY2FuJ3QgYmUgYm90aGVyZWQgdG8gZG8gaXQgZWZmaWNpZW50bHkuICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotdm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9ieXRlICpkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKCVwLCAlcCwgJXAsICVwLCAlcywgJXApXG4iLAotCQkJYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLCAocmVsb2NhdGVhYmxlKT8iVHJ1ZSI6IkZhbHNlIiwgc3ltYm9scyk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogPz8/ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuICphZ2FpbiBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX3JlbGF4X3NlY3Rpb24oJXAsICVzLCAlcCwgPHJldD4pXG4iLAotCQkJCQlhYmZkLCBzZWN0aW9uLT5uYW1lLCBsaW5rX2luZm8pOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9nY19zZWN0aW9ucyAoYWJmZCwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2djX3NlY3Rpb25zKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ3JlYXRlIGEgaGFzaCB0YWJsZSBmb3IgdGhlIGxpbmtlci4gIERpZmZlcmVudCBiYWNrZW5kcyBzdG9yZQotICAgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoaXMgdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotdm1zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbGlua19hZGRfc3ltYm9scyglcCwgJXApXG4iLCBhYmZkLCBsaW5rX2luZm8pOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0gICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9maW5hbF9saW5rIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZmluYWxfbGluayglcCwgJXApXG4iLCBhYmZkLCBsaW5rX2luZm8pOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTaG91bGQgdGhpcyBzZWN0aW9uIGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBwaWVjZXMgZHVyaW5nIGxpbmtpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiglcCwgJXMpXG4iLCBhYmZkLCBzZWN0aW9uLT5uYW1lKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qLS0gUGFydCA0LjksIGR5bmFtaWMgc3ltYm9scyBhbmQgcmVsb2NhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBmaWxlKQotICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgIHZvaWQgKmZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKCVwLCA8cmV0PilcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwTDsKLX0KLQotCi0vKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQotCi0KLS8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgYXJlbCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiphcmVsIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwTDsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMuaCBiL2JmZC92bXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0Mzk4Ni4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NzUgKzAsMCBAQAotI3VuZGVmIHZtcwotLyogdm1zLmggLS0gSGVhZGVyIGZpbGUgZm9yIFZNUyAoQWxwaGEgYW5kIFZheCkgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBWTVNfSAotI2RlZmluZSBWTVNfSAotCi0KLS8qIENvbnN0YW50cyBzdGFydGluZyB3aXRoICdFeHh4XycgYXJlIGZvciBvcGVuVk1TL0FscGhhIChFVkFYIG9iamVjdCBsYW5ndWFnZSkgICovCi0KLS8qIFZNUyBUZXh0LCBpbmZvcm1hdGlvbiBhbmQgcmVsb2NhdGlvbiByZWNvcmQgKFRJUi9FVElSKSBkZWZpbml0aW9ucy4gICovCi0KLSNkZWZpbmUgVElSX1NfQ19TVEFfR0JMCQkwCi0jZGVmaW5lIFRJUl9TX0NfU1RBX1NCCQkxCi0jZGVmaW5lIFRJUl9TX0NfU1RBX1NXCQkyCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0xXCQkzCi0jZGVmaW5lIFRJUl9TX0NfU1RBX1BCCQk0Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1BXCQk1Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1BMCQk2Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1VCICAJNwotI2RlZmluZSBUSVJfU19DX1NUQV9VVyAgCTgKLSNkZWZpbmUgVElSX1NfQ19TVEFfQkZJIAk5Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1dGSSAJMTAKLSNkZWZpbmUgVElSX1NfQ19TVEFfTEZJIAkxMQotI2RlZmluZSBUSVJfU19DX1NUQV9FUE0gCTEyCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0NLQVJHICAgICAgIDEzCi0jZGVmaW5lIFRJUl9TX0NfU1RBX1dQQiAJMTQKLSNkZWZpbmUgVElSX1NfQ19TVEFfV1BXIAkxNQotI2RlZmluZSBUSVJfU19DX1NUQV9XUEwgCTE2Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX0xTWSAJMTcKLSNkZWZpbmUgVElSX1NfQ19TVEFfTElUIAkxOAotI2RlZmluZSBUSVJfU19DX1NUQV9MRVBNICAgICAgICAxOQotI2RlZmluZSBUSVJfU19DX01BWFNUQUNPRCAgICAgICAxOQotI2RlZmluZSBUSVJfU19DX01JTlNUT0NPRCAgICAgICAyMAotI2RlZmluZSBUSVJfU19DX1NUT19TQiAgCTIwCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1NXICAJMjEKLSNkZWZpbmUgVElSX1NfQ19TVE9fTCAgIAkyMgotI2RlZmluZSBUSVJfU19DX1NUT19MVyAgCTIyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX0JEICAJMjMKLSNkZWZpbmUgVElSX1NfQ19TVE9fV0QgIAkyNAotI2RlZmluZSBUSVJfU19DX1NUT19MRCAgCTI1Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX0xJICAJMjYKLSNkZWZpbmUgVElSX1NfQ19TVE9fUElEUiAgICAgICAgMjcKLSNkZWZpbmUgVElSX1NfQ19TVE9fUElDUiAgICAgICAgMjgKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlNCIAkyOQotI2RlZmluZSBUSVJfU19DX1NUT19SU1cgCTMwCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1JMICAJMzEKLSNkZWZpbmUgVElSX1NfQ19TVE9fVlBTIAkzMgotI2RlZmluZSBUSVJfU19DX1NUT19VU0IgCTMzCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1VTVyAJMzQKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlVCIAkzNQotI2RlZmluZSBUSVJfU19DX1NUT19SVVcgCTM2Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX0IgICAJMzcKLSNkZWZpbmUgVElSX1NfQ19TVE9fVyAgIAkzOAotI2RlZmluZSBUSVJfU19DX1NUT19SQiAgCTM5Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JXICAJNDAKLSNkZWZpbmUgVElSX1NfQ19TVE9fUklWQiAgICAgICAgNDEKLSNkZWZpbmUgVElSX1NfQ19TVE9fUElSUiAgICAgICAgNDIKLSNkZWZpbmUgVElSX1NfQ19NQVhTVE9DT0QgICAgICAgNDIKLSNkZWZpbmUgVElSX1NfQ19NSU5PUFJDT0QgICAgICAgNTAKLSNkZWZpbmUgVElSX1NfQ19PUFJfTk9QIAk1MAotI2RlZmluZSBUSVJfU19DX09QUl9BREQgCTUxCi0jZGVmaW5lIFRJUl9TX0NfT1BSX1NVQiAJNTIKLSNkZWZpbmUgVElSX1NfQ19PUFJfTVVMIAk1MwotI2RlZmluZSBUSVJfU19DX09QUl9ESVYgCTU0Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0FORCAJNTUKLSNkZWZpbmUgVElSX1NfQ19PUFJfSU9SIAk1NgotI2RlZmluZSBUSVJfU19DX09QUl9FT1IgCTU3Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX05FRyAJNTgKLSNkZWZpbmUgVElSX1NfQ19PUFJfQ09NIAk1OQotI2RlZmluZSBUSVJfU19DX09QUl9JTlNWICAgICAgICA2MAotI2RlZmluZSBUSVJfU19DX09QUl9BU0ggCTYxCi0jZGVmaW5lIFRJUl9TX0NfT1BSX1VTSCAJNjIKLSNkZWZpbmUgVElSX1NfQ19PUFJfUk9UIAk2MwotI2RlZmluZSBUSVJfU19DX09QUl9TRUwgCTY0Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX1JFREVGICAgICAgIDY1Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0RGTElUICAgICAgIDY2Ci0jZGVmaW5lIFRJUl9TX0NfTUFYT1BSQ09EICAgICAgIDY2Ci0jZGVmaW5lIFRJUl9TX0NfTUlOQ1RMQ09EICAgICAgIDgwCi0jZGVmaW5lIFRJUl9TX0NfQ1RMX1NFVFJCICAgICAgIDgwCi0jZGVmaW5lIFRJUl9TX0NfQ1RMX0FVR1JCICAgICAgIDgxCi0jZGVmaW5lIFRJUl9TX0NfQ1RMX0RGTE9DICAgICAgIDgyCi0jZGVmaW5lIFRJUl9TX0NfQ1RMX1NUTE9DICAgICAgIDgzCi0jZGVmaW5lIFRJUl9TX0NfQ1RMX1NUS0RMICAgICAgIDg0Ci0jZGVmaW5lIFRJUl9TX0NfTUFYQ1RMQ09EICAgICAgIDg0Ci0KLSNkZWZpbmUgRVRJUl9TX0NfTUlOU1RBQ09EIDAJCS8qIE1pbmltdW0gc3RvcmUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX0dCTCAwCQkvKiBTdGFjayBnbG9iYWwgc3ltYm9sIHZhbHVlCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9MVyAxCQkvKiBTdGFjayBsb25nd29yZAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX1FXIDIJCS8qIFN0YWNrIHF1YWR3b3JkCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfUFEgMwkJLyogU3RhY2sgcHNlY3QgYmFzZSBwbHVzIHF1YWR3b3JkIG9mZnNldCAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX0xJIDQJCS8qIFN0YWNrIGxpdGVyYWwJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9NT0QgNQkJLyogU3RhY2sgbW9kdWxlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX0NLQVJHIDYJCS8qIENoZWNrIEFyZ3VtZW50cwkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RBQ09EIDYJCS8qIE1heGltdW0gc3RhY2sgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOU1RPQ09EIDUwCQkvKiBNaW5pbXVtIHN0b3JlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19CIDUwCQkvKiBTdG9yZSBieXRlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX1cgNTEJCS8qIFN0b3JlIHdvcmQJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fTFcgNTIJCS8qIFN0b3JlIGxvbmd3b3JkCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fUVcgNTMJCS8qIFN0b3JlIHF1YWR3b3JkCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fSU1NUiA1NAkJLyogU3RvcmUgaW1tZWRpYXRlIFJlcGVhdGVkCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19HQkwgNTUJCS8qIFN0b3JlIGdsb2JhbAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19DQSA1NgkJLyogU3RvcmUgY29kZSBhZGRyZXNzCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fUkIgNTcJCS8qIFN0b3JlIHJlbGF0aXZlIGJyYW5jaAkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fQUIgNTgJCS8qIFN0b3JlIGFic29sdXRlIGJyYW5jaAkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fT0ZGIDU5CQkvKiBTdG9yZSBvZmZzZXQgd2l0aGluIHBzZWN0CSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19JTU0gNjEJCS8qIFN0b3JlIGltbWVkaWF0ZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0dCTF9MVyA2MgkJLyogU3RvcmUgZ2xvYmFsIExvbmd3b3JkCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19MUF9QU0IgNjMJCS8qIFNUT19MUF9QU0Igbm90IHZhbGlkIGluIGxldmVsIDIgdXNlIFNUQ19MUF9QU0IJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fSElOVF9HQkwgNjQJLyogU3RvcmUgMTQgYml0IEhJTlQgYXQgZ2xvYmFsIGFkZHJlc3MgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0hJTlRfUFMgNjUJCS8qIFN0b3JlIDE0IGJpdCBISU5UIGF0IHBzZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX01BWFNUT0NPRCA2NQkJLyogTWF4aW11bSBzdG9yZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19NSU5PUFJDT0QgMTAwCQkvKiBNaW5pbXVtIG9wZXJhdGUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX05PUCAxMDAJCS8qIE5vLW9wCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0FERCAxMDEJCS8qIEFkZAkJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfU1VCIDEwMgkJLyogU3VidHJhY3QJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfTVVMIDEwMwkJLyogTXVsdGlwbHkJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfRElWIDEwNAkJLyogRGl2aWRlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0FORCAxMDUJCS8qIExvZ2ljYWwgQU5ECQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0lPUiAxMDYJCS8qIExvZ2ljYWwgaW5jbHVzaXZlIE9SCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfRU9SIDEwNwkJLyogTG9naWNhbCBleGNsdXNpdmUgT1IJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9ORUcgMTA4CQkvKiBOZWdhdGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQ09NIDEwOQkJLyogQ29tcGxlbWVudAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9JTlNWIDExMAkJLyogSW5zZXJ0IGJpdCBmaWVsZAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0FTSCAxMTEJCS8qIEFyaXRobWV0aWMgc2hpZnQJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9VU0ggMTEyCQkvKiBVbnNpZ25lZCBzaGlmdAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1JPVCAxMTMJCS8qIFJvdGF0ZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9TRUwgMTE0CQkvKiBTZWxlY3Qgb25lIG9mIHRocmVlIGxvbmd3b3JkcyBvbiB0b3Agb2Ygc3RhY2sgICovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9SRURFRiAxMTUJCS8qIFJlZGVmaW5lIHRoaXMgc3ltYm9sIGFmdGVyIHBhc3MgMiAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0RGTElUIDExNgkJLyogRGVmaW5lIGEgbGl0ZXJhbAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYT1BSQ09EIDExNgkJLyogTWF4aW11bSBvcGVyYXRlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX01JTkNUTENPRCAxNTAJCS8qIE1pbmltdW0gY29udHJvbCBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfU0VUUkIgMTUwCQkvKiBTZXQgcmVsb2NhdGlvbiBiYXNlCQkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfQVVHUkIgMTUxCQkvKiBBdWdtZW50IHJlbG9jYXRpb24gYmFzZQkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfREZMT0MgMTUyCQkvKiBEZWZpbmUgZGVidWcgbG9jYXRpb24JKi8KLSNkZWZpbmUgRVRJUl9TX0NfQ1RMX1NUTE9DIDE1MwkJLyogU2V0IGRlYnVnIGxvY2F0aW9uCQkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfU1RLREwgMTU0CQkvKiBTdGFjayBkZWJ1ZyBsb2NhdGlvbgkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYQ1RMQ09EIDE1NAkJLyogTWF4aW11bSBjb250cm9sIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX01JTlNUQ0NPRCAyMDAJCS8qIE1pbmltdW0gc3RvcmUtY29uZGl0aW9uYWwgY29kZSAgICAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTFAgMjAwCQkvKiBTdG9yZS1jb25kaXRpb25hbCBMaW5rYWdlIFBhaXIgICAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0xQX1BTQiAyMDEJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciB3aXRoIFByb2NlZHVyZSBTaWduYXR1cmUgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0dCTCAyMDIJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgZ2xvYmFsIGFkZHJlc3MgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0dDQSAyMDMJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIENvZGUgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfUFMgMjA0CQkvKiBTdG9yZS1jb25kaXRpb25hbCBBZGRyZXNzIGF0IHBzZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19OT1BfR0JMIDIwNQkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AgYXQgYWRkcmVzcyBvZiBnbG9iYWwgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX05PUF9QUyAyMDYJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBwZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19CU1JfR0JMIDIwNwkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1IgYXQgZ2xvYmFsIGFkZHJlc3MgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0JTUl9QUyAyMDgJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBwZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19MREFfR0JMIDIwOQkvKiBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgZ2xvYmFsIGFkZHJlc3MgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0xEQV9QUyAyMTAJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBwc2VjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQk9IX0dCTCAyMTEJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgZ2xvYmFsIGFkZHJlc3MgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0JPSF9QUyAyMTIJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBvciBIaW50IGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX05CSF9HQkwgMjEzCS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCxCU1Igb3IgSElOVCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTkJIX1BTIDIxNAkJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IHBzZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX01BWFNUQ0NPRCAyMTQJCS8qIE1heGltdW0gc3RvcmUtY29uZGl0aW9uYWwgY29kZSAgICAqLwotCi0vKiBWTVMgR2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZCAoR1NEL0VHU0QpLiAgKi8KLQotI2RlZmluZSBHU0RfU19LX0VOVFJJRVMgMQotI2RlZmluZSBHU0RfU19DX0VOVFJJRVMgMQotI2RlZmluZSBHU0RfU19DX1BTQyAgICAgMAotI2RlZmluZSBHU0RfU19DX1NZTSAgICAgMQotI2RlZmluZSBHU0RfU19DX0VQTSAgICAgMgotI2RlZmluZSBHU0RfU19DX1BSTyAgICAgMwotI2RlZmluZSBHU0RfU19DX1NZTVcgICAgNAotI2RlZmluZSBHU0RfU19DX0VQTVcgICAgNQotI2RlZmluZSBHU0RfU19DX1BST1cgICAgNgotI2RlZmluZSBHU0RfU19DX0lEQyAgICAgNwotI2RlZmluZSBHU0RfU19DX0VOViAgICAgOAotI2RlZmluZSBHU0RfU19DX0xTWSAgICAgOQotI2RlZmluZSBHU0RfU19DX0xFUE0gICAgMTAKLSNkZWZpbmUgR1NEX1NfQ19MUFJPICAgIDExCi0jZGVmaW5lIEdTRF9TX0NfU1BTQyAgICAxMgotI2RlZmluZSBHU0RfU19DX1NZTVYgICAgMTMKLSNkZWZpbmUgR1NEX1NfQ19FUE1WICAgIDE0Ci0jZGVmaW5lIEdTRF9TX0NfUFJPViAgICAxNQotI2RlZmluZSBHU0RfU19DX01BWFJFQ1RZUCAgICAgICAxNQotCi0jZGVmaW5lIEVHU0RfU19LX0VOVFJJRVMgMgkvKiBPZmZzZXQgdG8gZmlyc3QgZW50cnkgaW4gcmVjb3JkCSovCi0jZGVmaW5lIEVHU0RfU19DX0VOVFJJRVMgMgkvKiBPZmZzZXQgdG8gZmlyc3QgZW50cnkgaW4gcmVjb3JkCSovCi0jZGVmaW5lIEVHU0RfU19DX1BTQyAwCQkvKiBQc2VjdCBkZWZpbml0aW9uCQkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNIDEJCS8qIFN5bWJvbCBzcGVjaWZpY2F0aW9uCQkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfSURDIDIJCS8qIFJhbmRvbSBlbnRpdHkgY2hlY2sJCQkqLwotI2RlZmluZSBFR1NEX1NfQ19TUFNDIDUJCS8qIFNoYXJlYWJsZSBpbWFnZSBwc2VjdCBkZWZpbml0aW9uCSovCi0jZGVmaW5lIEVHU0RfU19DX1NZTVYgNgkJLyogVmVjdG9yZWQgKGR1YWwtdmFsdWVkKSB2ZXJzaW9ucyBvZiBTWU0sICovCi0jZGVmaW5lIEVHU0RfU19DX1NZTU0gNwkJLyogTWFza2VkIHZlcnNpb25zIG9mIFNZTSwJCSovCi0jZGVmaW5lIEVHU0RfU19DX1NZTUcgOAkJLyogRUdTVCAtIGdzdCB2ZXJzaW9uIG9mIFNZTQkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfTUFYUkVDVFlQIDgJLyogTWF4aW11bSBlbnRyeSB0eXBlIGRlZmluZWQJCSovCi0KLSNkZWZpbmUgR1BTX1NfTV9QSUMgICAgIDEKLSNkZWZpbmUgR1BTX1NfTV9MSUIgICAgIDIKLSNkZWZpbmUgR1BTX1NfTV9PVlIgICAgIDQKLSNkZWZpbmUgR1BTX1NfTV9SRUwgICAgIDgKLSNkZWZpbmUgR1BTX1NfTV9HQkwgICAgIDE2Ci0jZGVmaW5lIEdQU19TX01fU0hSICAgICAzMgotI2RlZmluZSBHUFNfU19NX0VYRSAgICAgNjQKLSNkZWZpbmUgR1BTX1NfTV9SRCAgICAgIDEyOAotI2RlZmluZSBHUFNfU19NX1dSVCAgICAgMjU2Ci0jZGVmaW5lIEdQU19TX01fVkVDICAgICA1MTIKLSNkZWZpbmUgR1BTX1NfS19OQU1FICAgIDkKLSNkZWZpbmUgR1BTX1NfQ19OQU1FICAgIDkKLQotI2RlZmluZSBFR1BTX1NfVl9QSUMJMHgwMDAxCi0jZGVmaW5lIEVHUFNfU19WX0xJQgkweDAwMDIKLSNkZWZpbmUgRUdQU19TX1ZfT1ZSCTB4MDAwNAotI2RlZmluZSBFR1BTX1NfVl9SRUwJMHgwMDA4Ci0jZGVmaW5lIEVHUFNfU19WX0dCTAkweDAwMTAKLSNkZWZpbmUgRUdQU19TX1ZfU0hSCTB4MDAyMAotI2RlZmluZSBFR1BTX1NfVl9FWEUJMHgwMDQwCi0jZGVmaW5lIEVHUFNfU19WX1JECTB4MDA4MAotI2RlZmluZSBFR1BTX1NfVl9XUlQJMHgwMTAwCi0jZGVmaW5lIEVHUFNfU19WX1ZFQwkweDAyMDAKLSNkZWZpbmUgRUdQU19TX1ZfTk9NT0QJMHgwNDAwCi0jZGVmaW5lIEVHUFNfU19WX0NPTQkweDA4MDAKLQotI2RlZmluZSBHU1lfU19NX1dFQUsgICAgMQotI2RlZmluZSBHU1lfU19NX0RFRiAgICAgMgotI2RlZmluZSBHU1lfU19NX1VOSSAgICAgNAotI2RlZmluZSBHU1lfU19NX1JFTCAgICAgOAotCi0jZGVmaW5lIEVHU1lfU19WX1dFQUsJMHgwMDAxCi0jZGVmaW5lIEVHU1lfU19WX0RFRgkweDAwMDIKLSNkZWZpbmUgRUdTWV9TX1ZfVU5JCTB4MDAwNAotI2RlZmluZSBFR1NZX1NfVl9SRUwJMHgwMDA4Ci0jZGVmaW5lIEVHU1lfU19WX0NPTU0JMHgwMDEwCi0jZGVmaW5lIEVHU1lfU19WX1ZFQ0VQCTB4MDAyMAotI2RlZmluZSBFR1NZX1NfVl9OT1JNCTB4MDA0MAotCi0jZGVmaW5lIExTWV9TX01fREVGICAgICAyCi0jZGVmaW5lIExTWV9TX01fUkVMICAgICA4Ci0KLSNkZWZpbmUgRU5WX1NfTV9ERUYgICAgIDEKLSNkZWZpbmUgRU5WX1NfTV9ORVNURUQgIDIKLQotLyoKLSAqCURlYnVnZ2VyIHN5bWJvbCBkZWZpbml0aW9uczogIFRoZXNlIGFyZSBkb25lIGJ5IGhhbmQsIGFzIG5vCi0gKgkJCQkJbWFjaGluZS1yZWFkYWJsZSB2ZXJzaW9uIHNlZW1zCi0gKgkJCQkJdG8gYmUgYXZhaWxhYmxlLgotICovCi0jZGVmaW5lIERTVF9TX0NfQwkJICA3CS8qIExhbmd1YWdlID09ICJDIgkqLwotI2RlZmluZSBEU1RfU19DX0NYWAkJIDE1CS8qIExhbmd1YWdlID09ICJDKysiCSovCi0jZGVmaW5lIERTVF9TX0NfVkVSU0lPTgkJMTUzCi0jZGVmaW5lCURTVF9TX0NfU09VUkNFCQkxNTUJLyogU291cmNlIGZpbGUJCSovCi0jZGVmaW5lIERTVF9TX0NfUFJPTE9HCQkxNjIKLSNkZWZpbmUJRFNUX1NfQ19CTEtCRUcJCTE3NgkvKiBCZWdpbm5pbmcgb2YgYmxvY2sJKi8KLSNkZWZpbmUJRFNUX1NfQ19CTEtFTkQJCTE3NwkvKiBFbmQgb2YgYmxvY2sJKi8KLSNkZWZpbmUgRFNUX1NfQ19FTlRSWQkJMTgxCi0jZGVmaW5lIERTVF9TX0NfUFNFQ1QJCTE4NAotI2RlZmluZQlEU1RfU19DX0xJTkVfTlVNCTE4NQkvKiBMaW5lIE51bWJlcgkJKi8KLSNkZWZpbmUgRFNUX1NfQ19MQkxPUkxJVAkxODYKLSNkZWZpbmUgRFNUX1NfQ19MQUJFTAkJMTg3Ci0jZGVmaW5lCURTVF9TX0NfTU9EQkVHCQkxODgJLyogQmVnaW5uaW5nIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX01PREVORAkJMTg5CS8qIEVuZCBvZiBtb2R1bGUJKi8KLSNkZWZpbmUJRFNUX1NfQ19SVE5CRUcJCTE5MAkvKiBCZWdpbm5pbmcgb2Ygcm91dGluZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkVORAkJMTkxCS8qIEVuZCBvZiByb3V0aW5lCSovCi0jZGVmaW5lCURTVF9TX0NfREVMVEFfUENfVwkxCS8qIEluY3IgUEMJKi8KLSNkZWZpbmUJRFNUX1NfQ19JTkNSX0xJTlVNCTIJLyogSW5jciBMaW5lICMJKi8KLSNkZWZpbmUJRFNUX1NfQ19JTkNSX0xJTlVNX1cJMwkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSCTQKLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fSU5DUl9XIDUKLSNkZWZpbmUgRFNUX1NfQ19SRVNFVF9MSU5VTV9JTkNSIDYKLSNkZWZpbmUgRFNUX1NfQ19CRUdfU1RNVF9NT0RFCTcKLSNkZWZpbmUgRFNUX1NfQ19FTkRfU1RNVF9NT0RFCTgKLSNkZWZpbmUJRFNUX1NfQ19TRVRfTElORV9OVU0JOQkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDCQkxMAotI2RlZmluZSBEU1RfU19DX1NFVF9QQ19XCTExCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX0wJMTIKLSNkZWZpbmUgRFNUX1NfQ19TRVRfU1RNVE5VTQkxMwotI2RlZmluZSBEU1RfU19DX1RFUk0JCTE0CS8qIEVuZCBvZiBsaW5lcwkqLwotI2RlZmluZSBEU1RfU19DX1RFUk1fVwkJMTUJLyogRW5kIG9mIGxpbmVzCSovCi0jZGVmaW5lCURTVF9TX0NfU0VUX0FCU19QQwkxNgkvKiBTZXQgUEMJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19MCTE3CS8qIEluY3IgUEMJKi8KLSNkZWZpbmUgRFNUX1NfQ19JTkNSX0xJTlVNX0wJMTgJLyogSW5jciBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fQgkxOQkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0wJMjAJLyogU2V0IExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX1RFUk1fTAkJMjEJLyogRW5kIG9mIGxpbmVzCSovCi0vKiB0aGVzZSBhcmUgdXNlZCB3aXRoIERTVF9TX0NfU09VUkNFICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFQ0xGSUxFCSAxCS8qIERlY2xhcmUgc291cmNlIGZpbGUgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfU0VURklMRQkgMgkvKiBTZXQgc291cmNlIGZpbGUgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfU0VUUkVDX0wJIDMJLyogU2V0IHJlY29yZCwgbG9uZ3dvcmQgdmFsdWUgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfU0VUUkVDX1cJIDQJLyogU2V0IHJlY29yZCwgd29yZCB2YWx1ZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUZMSU5FU19XCTEwCS8qICMgb2YgbGluZSwgd29yZCBjb3VudGVyICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX0IJMTEJLyogIyBvZiBsaW5lLCBieXRlIGNvdW50ZXIgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfRk9STUZFRUQJMTYJLyogXkwgY291bnRzIGFzIGEgcmVjb3JkICovCi0vKiB0aGUgZm9sbG93aW5nIGFyZSB0aGUgY29kZXMgZm9yIHRoZSB2YXJpb3VzIGRhdGEgdHlwZXMuICBBbnl0aGluZyBub3Qgb24KLSAqIHRoZSBsaXN0IGlzIGluY2x1ZGVkIHVuZGVyICdhZHZhbmNlZF90eXBlJwotICovCi0jZGVmaW5lIERCR19TX0NfVUNIQVIJCTB4MDIKLSNkZWZpbmUgREJHX1NfQ19VU0lOVAkJMHgwMwotI2RlZmluZSBEQkdfU19DX1VMSU5UCQkweDA0Ci0jZGVmaW5lIERCR19TX0NfVVFVQUQJCTB4MDUKLSNkZWZpbmUgREJHX1NfQ19TQ0hBUgkJMHgwNgotI2RlZmluZSBEQkdfU19DX1NTSU5UCQkweDA3Ci0jZGVmaW5lIERCR19TX0NfU0xJTlQJCTB4MDgKLSNkZWZpbmUgREJHX1NfQ19TUVVBRAkJMHgwOQotI2RlZmluZSBEQkdfU19DX1JFQUw0CQkweDBhCi0jZGVmaW5lIERCR19TX0NfUkVBTDgJCTB4MGIJCS8qIERfZmxvYXQgZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYNAkJMHgwYwkJLyogMnhGX2Zsb2F0IGNvbXBsZXggZmxvYXQgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg4CQkweDBkCQkvKiAyeERfZmxvYXQgY29tcGxleCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19SRUFMOF9HCQkweDFiCQkvKiBHX2Zsb2F0IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDhfRwkweDFkCQkvKiAyeEdfZmxvYXQgY29tcGxleCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19GVU5DVElPTl9BRERSCTB4MTcKLSNkZWZpbmUgREJHX1NfQ19BRFZBTkNFRF9UWVBFCTB4YTMKLS8qICBTb21lIG9mIHRoZXNlIGFyZSBqdXN0IGZvciBmdXR1cmUgcmVmZXJlbmNlLiAgW3ByXQotICovCi0jZGVmaW5lIERCR19TX0NfVUJJVEEJCTB4MDEJLyogdW5zaWduZWQsIGFsaWduZWQgYml0IGZpZWxkICovCi0jZGVmaW5lIERCR19TX0NfVUJJVFUJCTB4MjIJLyogdW5zaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19TQklUQQkJMHgyOQkvKiBzaWduZWQsIGFsaWduZWQgYml0IGZpZWxkICovCi0jZGVmaW5lIERCR19TX0NfU0JJVFUJCTB4MmEJLyogc2lnbmVkLCB1bmFsaWduZWQgYml0IGZpZWxkICovCi0jZGVmaW5lIERCR19TX0NfQ1NUUklORwkJMHgyZQkvKiBhc2NpeiAoJ1wwJyB0ZXJtaW5hdGVkKSBzdHJpbmcgKi8KLSNkZWZpbmUgREJHX1NfQ19XQ0hBUgkJMHgzOAkvKiB3Y2hhcl90ICovCi0vKiAgVGhlc2UgYXJlIGRlc2NyaXB0b3IgY2xhc3MgY29kZXMuCi0gKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfUwkJMHgwMQkvKiBzdGF0aWMgKGZpeGVkIGxlbmd0aCkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfRAkJMHgwMgkvKiBkeW5hbWljIHN0cmluZyAobm90IHZpYSBtYWxsb2MhKSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19BCQkweDA0CS8qIGFycmF5ICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX1VCUwkJMHgwZAkvKiB1bmFsaWduZWQgYml0IHN0cmluZyAqLwotLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZGVmaW5pdGlvbnMgb2Ygc3RydWN0Ci0gKiAgdW5pb24gYW5kIGVudW0gcmVjb3JkcwotICovCi0jZGVmaW5lIERCR19TX0NfRU5VTV9JVEVNCQkweGE0Ci0jZGVmaW5lIERCR19TX0NfRU5VTV9TVEFSVAkJMHhhNQotI2RlZmluZSBEQkdfU19DX0VOVU1fRU5ECQkweGE2Ci0jZGVmaW5lIERCR19TX0NfU1RSVUNUX0lURU0JCURTVF9LX1ZGTEFHU19CSVRPRkZTCS8qIDB4ZmYgKi8KLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfU1RBUlQJCTB4YWIKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfRU5ECQkweGFjCi0jZGVmaW5lIERTVF9LX1RZUFNQRUMJCQkweGFmCQkvKiB0eXBlIHNwZWNpZmljYXRpb24gKi8KLS8qIFRoZXNlIGNvZGVzIGFyZSB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBzeW1ib2wgZGVmaW5pdGlvbiByZWNvcmRzCi0gKi8KLSNkZWZpbmUgRFNUX0tfVkZMQUdTX05PVkFMCQkweDgwCS8qIHN0cnVjdCBkZWZpbml0aW9uIG9ubHkgKi8KLSNkZWZpbmUgRFNUX0tfVkZMQUdTX0RTQwkJMHhmYQkvKiBkZXNjcmlwdG9yIHVzZWQgKi8KLSNkZWZpbmUgRFNUX0tfVkZMQUdTX1RWUwkJMHhmYgkvKiB0cmFpbGluZyB2YWx1ZSBzcGVjaWZpZWQgKi8KLSNkZWZpbmUgRFNUX0tfVlNfRk9MTE9XUwkJMHhmZAkvKiB2YWx1ZSBzcGVjIGZvbGxvd3MgKi8KLSNkZWZpbmUgRFNUX0tfVkZMQUdTX0JJVE9GRlMJCTB4ZmYJLyogdmFsdWUgY29udGFpbnMgYml0IG9mZnNldCAqLwotI2RlZmluZSBEU1RfS19WQUxLSU5EX0xJVEVSQUwJMAotI2RlZmluZSBEU1RfS19WQUxLSU5EX0FERFIJMQotI2RlZmluZSBEU1RfS19WQUxLSU5EX0RFU0MJMgotI2RlZmluZSBEU1RfS19WQUxLSU5EX1JFRwkzCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfQVAJMHgwYwkvKiBSMTIgKi8KLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9GUAkweDBkCS8qIFIxMyAqLwotI2RlZmluZSBEU1RfS19SRUdfVkFYX1NQCTB4MGUJLyogUjE0ICovCi0jZGVmaW5lIERTVF9WX1ZBTEtJTkQJCTAJLyogb2Zmc2V0IG9mIHZhbGtpbmQgZmllbGQgKi8KLSNkZWZpbmUgRFNUX1ZfSU5ESVJFQ1QJCTIJLyogb2Zmc2V0IHRvIGluZGlyZWN0IGJpdCAqLwotI2RlZmluZSBEU1RfVl9ESVNQCQkzCS8qIG9mZnNldCB0byBkaXNwbGFjZW1lbnQgYml0ICovCi0jZGVmaW5lIERTVF9WX1JFR05VTQkJNAkvKiBvZmZzZXQgdG8gcmVnaXN0ZXIgbnVtYmVyICovCi0jZGVmaW5lIERTVF9NX0lORElSRUNUCQkoMTw8RFNUX1ZfSU5ESVJFQ1QpCi0jZGVmaW5lIERTVF9NX0RJU1AJCSgxPDxEU1RfVl9ESVNQKQotI2RlZmluZSBEQkdfQ19GVU5DVElPTl9QQVJBTQkvKiAweGM5ICovCVwKLQkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfQVA8PERTVF9WX1JFR05VTSkpCi0jZGVmaW5lIERCR19DX0xPQ0FMX1NZTQkJLyogMHhkOSAqLwlcCi0JKERTVF9LX1ZBTEtJTkRfQUREUnxEU1RfTV9ESVNQfChEU1RfS19SRUdfVkFYX0ZQPDxEU1RfVl9SRUdOVU0pKQotLyogS2luZHMgb2YgdmFsdWUgc3BlY2lmaWNhdGlvbnMKLSAqLwotI2RlZmluZSBEU1RfS19WU19BTExPQ19TUExJVAkzCS8qIHNwbGl0IGxpZmV0aW1lICovCi0vKiBLaW5kcyBvZiB0eXBlIHNwZWNpZmljYXRpb25zCi0gKi8KLSNkZWZpbmUgRFNUX0tfVFNfQVRPTQkJMHgwMQkvKiBhdG9taWMgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0jZGVmaW5lIERTVF9LX1RTX0RTQwkJMHgwMgkvKiBkZXNjcmlwdG9yIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19JTkQJCTB4MDMJLyogaW5kaXJlY3QgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0jZGVmaW5lIERTVF9LX1RTX1RQVFIJCTB4MDQJLyogdHlwZWQgcG9pbnRlciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfUFRSCQkweDA1CS8qIHBvaW50ZXIgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX0FSUkFZCQkweDA3CS8qIGFycmF5IHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19OT1ZfTEVORwkweDBlCS8qIG5vdmVsIGxlbmd0aCB0eXBlIHNwZWMgKi8KLS8qICBUaGVzZSBhcmUgdGhlIGNvZGVzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIHN1ZmZpeCByZWNvcmRzIHRvIGRldGVybWluZSB0aGUKLSAqICBhY3R1YWwgZGF0YSB0eXBlCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19CQVNJQwkJCURTVF9LX1RTX0FUT00KLSNkZWZpbmUgREJHX1NfQ19CQVNJQ19BUlJBWQkJRFNUX0tfVFNfRFNDCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUCQkJRFNUX0tfVFNfSU5ECi0jZGVmaW5lIERCR19TX0NfUE9JTlRFUgkJCURTVF9LX1RTX1RQVFIKLSNkZWZpbmUgREJHX1NfQ19WT0lECQkJRFNUX0tfVFNfUFRSCi0jZGVmaW5lIERCR19TX0NfQ09NUExFWF9BUlJBWQkJRFNUX0tfVFNfQVJSQVkKLQotLyogVk1TIE1vZHVsZSBoZWFkZXIgcmVjb3JkIChFTUgpIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBNSERfU19DX01IRCAwCi0jZGVmaW5lIE1IRF9TX0NfTE5NIDEKLSNkZWZpbmUgTUhEX1NfQ19TUkMgMgotI2RlZmluZSBNSERfU19DX1RUTCAzCi0jZGVmaW5lIE1IRF9TX0NfQ1BSIDQKLSNkZWZpbmUgTUhEX1NfQ19NVEMgNQotI2RlZmluZSBNSERfU19DX0dUWCA2Ci0jZGVmaW5lIE1IRF9TX0NfTUFYSERSVFlQIDYKLQotI2RlZmluZSBFTUhfU19DX01IRCAwCQkvKiBNYWluIGhlYWRlciByZWNvcmQJCSovCi0jZGVmaW5lIEVNSF9TX0NfTE5NIDEJCS8qIExhbmd1YWdlIG5hbWUgYW5kIHZlcnNpb24JKi8KLSNkZWZpbmUgRU1IX1NfQ19TUkMgMgkJLyogU291cmNlIGZpbGUgc3BlY2lmaWNhdGlvbgkqLwotI2RlZmluZSBFTUhfU19DX1RUTCAzCQkvKiBUaXRsZSB0ZXh0IG9mIG1vZHVsZQkJKi8KLSNkZWZpbmUgRU1IX1NfQ19DUFIgNAkJLyogQ29weXJpZ2h0IG5vdGljZQkJKi8KLSNkZWZpbmUgRU1IX1NfQ19NVEMgNQkJLyogTWFpbnRlbmFuY2Ugc3RhdHVzCQkqLwotI2RlZmluZSBFTUhfU19DX0dUWCA2CQkvKiBHZW5lcmFsIHRleHQJCQkqLwotI2RlZmluZSBFTUhfU19DX01BWEhEUlRZUCA2CS8qIE1heGltdW0gYWxsb3dhYmxlIHR5cGUJKi8KLQotLyogdm1zLmMuICAqLwotCi1leHRlcm4gYXN5bWJvbCAqX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLS8qIHZtcy1nc2QuYy4gICovCi0KLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfZ3NkIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfd3JpdGVfZ3NkIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLQotLyogdm1zLW1oZC5jLiAgKi8KLQotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9oZHIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9oZHIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9lb20gUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9lb20gUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiB2bXMtdGlyLmMuICAqLwotCi1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX3RpciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2RiZyBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX3RidCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2xuayBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci0KLWV4dGVybiBpbnQgX2JmZF92bXNfd3JpdGVfdGlyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfd3JpdGVfdGJ0IFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfd3JpdGVfZGJnIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLQotLyogVGhlIHJfdHlwZSBmaWVsZCBpbiBhIHJlbG9jIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCi0jZGVmaW5lIEFMUEhBX1JfSUdOT1JFCQkwCi0jZGVmaW5lIEFMUEhBX1JfUkVGUVVBRAkJMQotI2RlZmluZSBBTFBIQV9SX0JSQUREUgkJMgotI2RlZmluZSBBTFBIQV9SX0hJTlQJCTMKLSNkZWZpbmUgQUxQSEFfUl9TUkVMMTYJCTQKLSNkZWZpbmUgQUxQSEFfUl9TUkVMMzIJCTUKLSNkZWZpbmUgQUxQSEFfUl9TUkVMNjQJCTYKLSNkZWZpbmUgQUxQSEFfUl9PUF9QVVNICQk3Ci0jZGVmaW5lIEFMUEhBX1JfT1BfU1RPUkUJOAotI2RlZmluZSBBTFBIQV9SX09QX1BTVUIJCTkKLSNkZWZpbmUgQUxQSEFfUl9PUF9QUlNISUZUCTEwCi0jZGVmaW5lIEFMUEhBX1JfTElOS0FHRQkJMTEKLSNkZWZpbmUgQUxQSEFfUl9SRUZMT05HCQkxMgotI2RlZmluZSBBTFBIQV9SX0NPREVBRERSCTEzCi0KLS8qIE9iamVjdCBsYW5ndWFnZSBkZWZpbml0aW9ucy4gICovCi0KLSNkZWZpbmUgT0JKX1NfQ19IRFIgMAkJLypWQVggbW9kdWxlIGhlYWRlciByZWNvcmQJCSovCi0jZGVmaW5lIE9CSl9TX0NfR1NEIDEJCS8qVkFYIGdsb2JhbCBzeW1ib2wgZGVmaW5pdGlvbiByZWNvcmQJKi8KLSNkZWZpbmUgT0JKX1NfQ19USVIgMgkJLypWQVggdGV4dCBpbmZvcm1hdGlvbiByZWNvcmQJCSovCi0jZGVmaW5lIE9CSl9TX0NfRU9NIDMJCS8qVkFYIGVuZCBvZiBtb2R1bGUgcmVjb3JkCQkqLwotI2RlZmluZSBPQkpfU19DX0RCRyA0CQkvKlZBWCBEZWJ1Z2dlciBpbmZvcm1hdGlvbiByZWNvcmQJKi8KLSNkZWZpbmUgT0JKX1NfQ19UQlQgNQkJLypWQVggVHJhY2ViYWNrIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX0xOSyA2CQkvKlZBWCBsaW5rZXIgb3B0aW9ucyByZWNvcmQJCSovCi0jZGVmaW5lIE9CSl9TX0NfRU9NVyA3CQkvKlZBWCBlbmQgb2YgbW9kdWxlIHdvcmQtcHNlY3QgcmVjb3JkCSovCi0jZGVmaW5lIE9CSl9TX0NfTUFYUkVDVFlQIDcJLypWQVggTGFzdCBhc3NpZ25lZCByZWNvcmQgdHlwZQkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRU1IIDgJCS8qRVZBWCBtb2R1bGUgaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRUVPTSA5CQkvKkVWQVggZW5kIG9mIG1vZHVsZSByZWNvcmQJCSovCi0jZGVmaW5lIEVPQkpfU19DX0VHU0QgMTAJLypFVkFYIGdsb2JhbCBzeW1ib2wgZGVmaW5pdGlvbiByZWNvcmQgICovCi0jZGVmaW5lIEVPQkpfU19DX0VUSVIgMTEJLypFVkFYIHRleHQgaW5mb3JtYXRpb24gcmVjb3JkCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FREJHIDEyCS8qRVZBWCBEZWJ1Z2dlciBpbmZvcm1hdGlvbiByZWNvcmQJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRVRCVCAxMwkvKkVWQVggVHJhY2ViYWNrIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBFT0JKX1NfQ19NQVhSRUNUWVAgMTMJLypFVkFYIExhc3QgYXNzaWduZWQgcmVjb3JkIHR5cGUJKi8KLSNkZWZpbmUgT0JKX1NfS19TVUJUWVAgMQotI2RlZmluZSBPQkpfU19DX1NVQlRZUCAxCi0jZGVmaW5lIEVPQkpfU19LX1NVQlRZUCA0Ci0jZGVmaW5lIEVPQkpfU19DX1NVQlRZUCA0Ci0jZGVmaW5lIE9CSl9TX0NfTUFYUkVDU0laIDIwNDgJLypNYXhpbXVtIGxlZ2FsIHJlY29yZCBzaXplICAgICAgICAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfTUFYUkVDU0laIDgxOTIgLypNYXhpbXVtIGxlZ2FsIHJlY29yZCBzaXplICAgICAgICAgKi8KLSNkZWZpbmUgT0JKX1NfQ19TVFJMVkwgMAkvKlN0cnVjdHVyZSBsZXZlbCAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBFT0JKX1NfQ19TVFJMVkwgMgkvKlN0cnVjdHVyZSBsZXZlbCAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPQkpfU19DX1NZTVNJWiAzMQkvKk1heGltdW0gc3ltYm9sIGxlbmd0aAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfU1lNU0laIDY0CS8qTWF4aW11bSBzeW1ib2wgbGVuZ3RoCQkqLwotI2RlZmluZSBFT0JKX1NfQ19TRUNTSVogMzEJLypNYXhpbXVtIHNlY3Rpb24gbmFtZSBsZW5ndGgJCSovCi0jZGVmaW5lIE9CSl9TX0NfU1RPUkVQTElNIC0xCS8qTWF4aW11bSByZXBlYXQgY291bnQgb24gc3RvcmUgY29tbWFuZHMgICovCi0jZGVmaW5lIEVPQkpfU19DX1NUT1JFUExJTSAtMQkvKk1heGltdW0gcmVwZWF0IGNvdW50IG9uIHN0b3JlIGNvbW1hbmRzICAqLwotI2RlZmluZSBPQkpfU19DX1BTQ0FMSUxJTSA5CS8qTWF4aW11bSBwLXNlY3QgYWxpZ25tZW50ICAgICAgICAgICovCi0jZGVmaW5lIEVPQkpfU19DX1BTQ0FMSUxJTSAxNgkvKk1heGltdW0gcC1zZWN0IGFsaWdubWVudCAgICAgICAgICAqLwotCi0jZGVmaW5lIEVWQVhfT0ZGU0VUCTI1NgkvKnR5cGUgb2Zmc2V0IGZvciBFVkFYIGNvZGVzIGluIHN3aXRjaCAgKi8KLS8qIE1pc2NlbGxhbmVvdXMgZGVmaW5pdGlvbnMuICAqLwotCi0jaWYgX19HTlVDX18KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVxdWFkOwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1cXVhZDsKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9PVVRSRUNfU0laRSA0MDk2Ci0jZGVmaW5lIE1JTl9PVVRSRUNfTFVGVCA2NAotCi10eXBlZGVmIHN0cnVjdCBfdm1zX3NlY3Rpb24gewotICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgc3RydWN0IF92bXNfc2VjdGlvbiAqbmV4dDsKLX0gdm1zX3NlY3Rpb247Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfc2F2ZV92bXNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgZGF0YSwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiB2bXNfc2VjdGlvbiAqX2JmZF9nZXRfdm1zX3NlY3Rpb24gUEFSQU1TICgoYmZkICphYmZkLCBpbnQgaW5kZXgpKTsKLQotdHlwZWRlZiBzdHJ1Y3QgX3Ztc19yZWxvYyB7Ci0gIHN0cnVjdCBfdm1zX3JlbG9jICpuZXh0OwotICBhcmVsZW50ICpyZWxvYzsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci19IHZtc19yZWxvYzsKLQotLyogdm1zIG1vZHVsZSBoZWFkZXIgICovCi0KLXN0cnVjdCBoZHJfc3RydWMgewotICBpbnQgaGRyX2Jfc3RybHZsOwotICBsb25nIGhkcl9sX2FyY2gxOwotICBsb25nIGhkcl9sX2FyY2gyOwotICBsb25nIGhkcl9sX3JlY3NpejsKLSAgY2hhciAqaGRyX3RfbmFtZTsKLSAgY2hhciAqaGRyX3RfdmVyc2lvbjsKLSAgY2hhciAqaGRyX3RfZGF0ZTsKLSAgY2hhciAqaGRyX2NfbG5tOwotICBjaGFyICpoZHJfY19zcmM7Ci0gIGNoYXIgKmhkcl9jX3R0bDsKLX07Ci0KLQotLyogdm1zIGVuZCBvZiBtb2R1bGUgICovCi0KLXN0cnVjdCBlb21fc3RydWMgewotICBsb25nIGVvbV9sX3RvdGFsX2xwczsKLSAgdW5zaWduZWQgY2hhciBlb21fYl9jb21jb2Q7Ci0gIGJvb2xlYW4gZW9tX2hhc190cmFuc2ZlcjsKLSAgdW5zaWduZWQgY2hhciBlb21fYl90ZnJmbGc7Ci0gIGxvbmcgZW9tX2xfcHNpbmR4OwotICBsb25nIGVvbV9sX3RmcmFkcjsKLX07Ci0KLWVudW0gZmlsZV9mb3JtYXRfZW51bSB7IEZGX1VOS05PV04sIEZGX0ZPUkVJR04sIEZGX05BVElWRSwgRkZfVkFYIH07Ci0KLXR5cGVkZWYgc3RydWN0IHZtc19zeW1ib2xfc3RydWN0IHsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IGJmZF9oYXNoOwotICBhc3ltYm9sICpzeW1ib2w7Ci19IHZtc19zeW1ib2xfZW50cnk7Ci0KLS8qIHN0YWNrIHZhbHVlIGZvciBwdXNoL3BvcCBjb21tYW5kcyAgKi8KLQotc3RydWN0IHN0YWNrX3N0cnVjdCB7Ci0gIHVxdWFkIHZhbHVlOwotICBpbnQgcHNlY3Q7Ci19OwotI2RlZmluZSBTVEFDS1NJWkUgODE5MgotCi0vKiBsb2NhdGlvbiBzdGFjayBkZWZpbml0aW9ucyBmb3IgQ1RMX0RGTE9DLCBDVExfU1RMT0MsIGFuZCBDVExfU1RLREwgICovCi0KLXN0cnVjdCBsb2NhdGlvbl9zdHJ1Y3QgewotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICBpbnQgcHNlY3Q7Ci19OwotI2RlZmluZSBMT0NBVElPTl9TQVZFX1NJWkUgMzIKLQotI2RlZmluZSBWTVNfU0VDVElPTl9DT1VOVCAxMDI0Ci0KLXN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCB7Ci0gIGludCBpc192YXg7Ci0gIGJvb2xlYW4gZml4dXBfZG9uZTsJCQkvKiBGbGFnIHRvIGluZGljYXRlIGlmIGFsbAotCQkJCQkgICBzZWN0aW9uIHBvaW50ZXJzIGFuZCBQUklWKHNlY3Rpb25zKQotCQkJCQkgICBhcmUgc2V0IHVwIGNvcnJlY3RseSAgKi8KLSAgdW5zaWduZWQgY2hhciAqdm1zX2J1ZjsJCS8qIGJ1ZmZlciB0byByZWNvcmQgICovCi0gIGludCBidWZfc2l6ZTsJCQkJLyogbWF4IHNpemUgb2YgYnVmZmVyICAqLwotICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwkJLyogYWN0dWFsIHJlY29yZCBwdHIgICovCi0gIGludCByZWNfbGVuZ3RoOwkJCS8qIHJlbWFpbmluZyByZWNvcmQgbGVuZ3RoICAqLwotICBpbnQgcmVjX3NpemU7CQkJCS8qIGFjdHVhbCByZWNvcmQgc2l6ZSAgKi8KLSAgaW50IHJlY190eXBlOwkJCQkvKiBhY3R1YWwgcmVjb3JkIHR5cGUgICovCi0gIGVudW0gZmlsZV9mb3JtYXRfZW51bSBmaWxlX2Zvcm1hdDsKLQotICBzdHJ1Y3QgaGRyX3N0cnVjIGhkcl9kYXRhOwkJLyogZGF0YSBmcm9tIEhEUi9FTUggcmVjb3JkICAqLwotICBzdHJ1Y3QgZW9tX3N0cnVjIGVvbV9kYXRhOwkJLyogZGF0YSBmcm9tIEVPTS9FRU9NIHJlY29yZCAgKi8KLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fY291bnQ7CQkvKiAjIG9mIHNlY3Rpb25zIGluIGZvbGxvd2luZyBhcnJheSAgKi8KLSAgYXNlY3Rpb24gKipzZWN0aW9uczsJCQkvKiBhcnJheSBvZiBHU0QvRUdTRCBzZWN0aW9ucyAgKi8KLSAgaW50IGdzZF9zeW1fY291bnQ7CQkJLyogIyBvZiBHU0QvRUdTRCBzeW1ib2xzICAqLwotICBhc3ltYm9sICoqc3ltYm9sczsJCQkvKiB2ZWN0b3Igb2YgR1NEL0VHU0Qgc3ltYm9scyAgKi8KLSAgc3RydWN0IHByb2NfdmFsdWUgKnByb2NlZHVyZTsKLQotICBzdHJ1Y3Qgc3RhY2tfc3RydWN0ICpzdGFjazsKLSAgaW50IHN0YWNrcHRyOwotCi0gIHZtc19zZWN0aW9uICp2bXNfc2VjdGlvbl90YWJsZVtWTVNfU0VDVElPTl9DT1VOVF07Ci0KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp2bXNfc3ltYm9sX3RhYmxlOwotICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltY2FjaGU7Ci0gIGludCBzeW1udW07Ci0KLSAgc3RydWN0IGxvY2F0aW9uX3N0cnVjdCAqbG9jYXRpb25fc3RhY2s7Ci0KLSAgYXNlY3Rpb24gKmltYWdlX3NlY3Rpb247CQkvKiBzZWN0aW9uIGZvciBpbWFnZV9wdHIgICovCi0gIHVuc2lnbmVkIGNoYXIgKmltYWdlX3B0cjsJCS8qIGEgcG9pbnRlciB0byBzZWN0aW9uLT5jb250ZW50cyAqLwotCi0gIHVuc2lnbmVkIGNoYXIgcGRzY1s4XTsJCS8qIHByb2NlZHVyZSBkZXNjcmlwdG9yICovCi0KLSAgLyogT3V0cHV0IHJvdXRpbmUgc3RvcmFnZSAgKi8KLQotICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfYnVmOwkJLyogb3V0cHV0IGRhdGEgICovCi0gIGludCBwdXNoX2xldmVsOwotICBpbnQgcHVzaGVkX3NpemU7Ci0gIGludCBsZW5ndGhfcG9zOwotICBpbnQgb3V0cHV0X3NpemU7Ci0gIGludCBvdXRwdXRfYWxpZ25tZW50OwotCi0gIC8qIGxpbmthZ2UgaW5kZXggY291bnRlcgotICAgdXNlZCBieSBjb25kaXRpb25hbCBzdG9yZSBjb21tYW5kcyAoRVRJUl9TX0NfU1RDXykgICovCi0KLSAgaW50IHZtc19saW5rYWdlX2luZGV4OwotCi0gIC8qIHNlZSB0Yy1hbHBoYS5jIG9mIGdhcyBmb3IgYSBkZXNjcmlwdGlvbi4gICovCi0gIGludCBmbGFnX2hhc2hfbG9uZ19uYW1lczsJLyogLSssIGhhc2ggaW5zdGVhZCBvZiB0cnVuY2F0ZSAqLwotICBpbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCwgc2hvdyBoYXNoaW5nL3RydW5jYXRpb24gKi8KLX07Ci0KLSNkZWZpbmUgUFJJVihuYW1lKQkoKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCAqKWFiZmQtPnRkYXRhLmFueSktPm5hbWUKLQotI2RlZmluZSBTRUNUSU9OX05BTUVfVEVNUExBVEUgIl9fU0VDX18lZCIKLQotI2lmIFZNU19ERUJVRwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfZGVidWcgUEFSQU1TKChpbnQgbGV2ZWwsIGNoYXIgKmZvcm1hdCwgLi4uKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2hleGR1bXAKLSAgUEFSQU1TICgoaW50IGxldmVsLCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KSk7Ci0KLSNkZWZpbmUgdm1zX2RlYnVnIF9iZmRfdm1zX2RlYnVnCi0jZW5kaWYKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF92bXNfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50ICp0eXBlLCBpbnQgKmxlbmd0aCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19nZXRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19uZXh0X3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IHNpemUpKTsKLWV4dGVybiBjaGFyICpfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnB0cikpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfcHVzaCBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbCwgaW50IHBzZWN0KSk7Ci1leHRlcm4gdXF1YWQgX2JmZF92bXNfcG9wIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50ICpwc2VjdCkpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGRhdGEsIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfYmVnaW4KLSAgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgcmVjdHlwZSwgaW50IHJlY2hlYWQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgYWxpZ250bykpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X3B1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcG9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfb3V0cHV0X2NoZWNrIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHNpemUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgdmFsdWUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9sb25nIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X3F1YWQgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICp2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2R1bXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpkYXRhLAotCQkJCQkgICBpbnQgbGVuZ3RoKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZmlsbCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCB2YWx1ZSwgaW50IGxlbmd0aCkpOwotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKmluLCBpbnQgbWF4bGVuKSk7Ci0KLWV4dGVybiB2bXNfc3ltYm9sX2VudHJ5ICpfYmZkX3Ztc19lbnRlcl9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICpuYW1lKSk7Ci0KLSNlbmRpZiAvKiBWTVNfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3hjb2ZmbGluay5jIGIvYmZkL3hjb2ZmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWM3NWJkLi4wMDAwMDAwCi0tLSBhL2JmZC94Y29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NDAgKzAsMCBAQAotLyogUE9XRVIvUG93ZXJQQyBYQ09GRiBsaW5rZXIgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4sIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBYQ09GRiBsaW5rZXIgY29kZS4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogSW4gb3JkZXIgdG8gc3VwcG9ydCBsaW5raW5nIGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIGludG8gYW4KLSAgIFhDT0ZGIGZvcm1hdCwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIGEgcGFydGljdWxhcgotICAgYmZkX3RhcmdldCBpcyBhbiBYQ09GRiB2ZWN0b3IuICBGSVhNRTogV2UgbmVlZCB0byByZXRoaW5rIHRoaXMKLSAgIHdob2xlIGFwcHJvYWNoLiAgKi8KLSNkZWZpbmUgWENPRkZfWFZFQ1AoeHYpIFwKLSAgKHN0cmNtcCAoKHh2KS0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgPT0gMCBcCi0gICB8fCBzdHJjbXAgKCh4diktPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpID09IDApCi0KLS8qIEdldCB0aGUgWENPRkYgaGFzaCB0YWJsZSBlbnRyaWVzIGZvciBhIEJGRC4gICovCi0jZGVmaW5lIG9ial94Y29mZl9zeW1faGFzaGVzKGJmZCkgXAotICAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKiopIG9ial9jb2ZmX3N5bV9oYXNoZXMgKGJmZCkpCi0KLS8qIFhDT0ZGIHJlbG9jYXRpb24gdHlwZXMuICBUaGVzZSBwcm9iYWJseSBiZWxvbmcgaW4gYSBoZWFkZXIgZmlsZQotICAgc29tZXdoZXJlLiAgVGhlIHJlbG9jYXRpb25zIGFyZSBkZXNjcmliZWQgaW4gdGhlIGZ1bmN0aW9uCi0gICBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uIGluIHRoaXMgZmlsZS4gICovCi0KLSNkZWZpbmUgUl9QT1MgICAoMHgwMCkKLSNkZWZpbmUgUl9ORUcgICAoMHgwMSkKLSNkZWZpbmUgUl9SRUwgICAoMHgwMikKLSNkZWZpbmUgUl9UT0MgICAoMHgwMykKLSNkZWZpbmUgUl9SVEIgICAoMHgwNCkKLSNkZWZpbmUgUl9HTCAgICAoMHgwNSkKLSNkZWZpbmUgUl9UQ0wgICAoMHgwNikKLSNkZWZpbmUgUl9CQSAgICAoMHgwOCkKLSNkZWZpbmUgUl9CUiAgICAoMHgwYSkKLSNkZWZpbmUgUl9STCAgICAoMHgwYykKLSNkZWZpbmUgUl9STEEgICAoMHgwZCkKLSNkZWZpbmUgUl9SRUYgICAoMHgwZikKLSNkZWZpbmUgUl9UUkwgICAoMHgxMikKLSNkZWZpbmUgUl9UUkxBICAoMHgxMykKLSNkZWZpbmUgUl9SUlRCSSAoMHgxNCkKLSNkZWZpbmUgUl9SUlRCQSAoMHgxNSkKLSNkZWZpbmUgUl9DQUkgICAoMHgxNikKLSNkZWZpbmUgUl9DUkVMICAoMHgxNykKLSNkZWZpbmUgUl9SQkEgICAoMHgxOCkKLSNkZWZpbmUgUl9SQkFDICAoMHgxOSkKLSNkZWZpbmUgUl9SQlIgICAoMHgxYSkKLSNkZWZpbmUgUl9SQlJDICAoMHgxYikKLQotLyogVGhlIGZpcnN0IHdvcmQgb2YgZ2xvYmFsIGxpbmthZ2UgY29kZS4gIFRoaXMgbXVzdCBiZSBtb2RpZmllZCBieQotICAgZmlsbGluZyBpbiB0aGUgY29ycmVjdCBUT0Mgb2Zmc2V0LiAgKi8KLQotI2RlZmluZSBYQ09GRl9HTElOS19GSVJTVCAoMHg4MTgyMDAwMCkJLyogbHd6IHIxMiwwKHIyKSAqLwotCi0vKiBUaGUgcmVtYWluaW5nIHdvcmRzIG9mIGdsb2JhbCBsaW5rYWdlIGNvZGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB4Y29mZl9nbGlua19jb2RlW10gPQotewotICAweDkwNDEwMDE0LAkvKiBzdHcgcjIsMjAocjEpICovCi0gIDB4ODAwYzAwMDAsCS8qIGx3eiByMCwwKHIxMikgKi8KLSAgMHg4MDRjMDAwNCwJLyogbHd6IHIyLDQocjEyKSAqLwotICAweDdjMDkwM2E2LAkvKiBtdGN0ciByMCAqLwotICAweDRlODAwNDIwLAkvKiBiY3RyICovCi0gIDB4MCwJCS8qIHN0YXJ0IG9mIHRyYWNlYmFjayB0YWJsZSAqLwotICAweDAwMGM4MDAwLAkvKiB0cmFjZWJhY2sgdGFibGUgKi8KLSAgMHgwCQkvKiB0cmFjZWJhY2sgdGFibGUgKi8KLX07Ci0KLSNkZWZpbmUgWENPRkZfR0xJTktfU0laRSBcCi0gICgoKHNpemVvZiB4Y29mZl9nbGlua19jb2RlIC8gc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGVbMF0pICogNCkgKyA0KQotCi0vKiBXZSByZXVzZSB0aGUgU0VDX1JPTSBmbGFnIGFzIGEgbWFyayBmbGFnIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCi0gICBUaGlzIGZsYWcgd2lsbCBvbmx5IGJlIHVzZWQgb24gaW5wdXQgc2VjdGlvbnMuICAqLwotCi0jZGVmaW5lIFNFQ19NQVJLIChTRUNfUk9NKQotCi0vKiBUaGUgbGRoZHIgc3RydWN0dXJlLiAgVGhpcyBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlcgotICAgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZGhkcgotewotICAvKiBUaGUgdmVyc2lvbiBudW1iZXI6IGN1cnJlbnRseSBhbHdheXMgMS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF92ZXJzaW9uOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbCB0YWJsZSBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25zeW1zOwotICAvKiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gdGFibGUgZW50cmllcy4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9ucmVsb2M7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIGltcG9ydCBmaWxlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9pc3RsZW47Ci0gIC8qIFRoZSBudW1iZXIgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25pbXBpZDsKLSAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlciBzZWN0aW9uIHRvIHRoZSBmaXJzdAotICAgICBlbnRyeSBpbiB0aGUgaW1wb3J0IGZpbGUgdGFibGUuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfaW1wb2ZmOwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfc3RsZW47Ci0gIC8qIFRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIC5sb2FkZXIgc2VjdGlvbiB0byB0aGUgZmlyc3QKLSAgICAgZW50cnkgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zdG9mZjsKLX07Ci0KLXN0cnVjdCBleHRlcm5hbF9sZGhkcgotewotICBiZmRfYnl0ZSBsX3ZlcnNpb25bNF07Ci0gIGJmZF9ieXRlIGxfbnN5bXNbNF07Ci0gIGJmZF9ieXRlIGxfbnJlbG9jWzRdOwotICBiZmRfYnl0ZSBsX2lzdGxlbls0XTsKLSAgYmZkX2J5dGUgbF9uaW1waWRbNF07Ci0gIGJmZF9ieXRlIGxfaW1wb2ZmWzRdOwotICBiZmRfYnl0ZSBsX3N0bGVuWzRdOwotICBiZmRfYnl0ZSBsX3N0b2ZmWzRdOwotfTsKLQotI2RlZmluZSBMREhEUlNaICg4ICogNCkKLQotLyogVGhlIGxkc3ltIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgYSBzeW1ib2wgaW4gdGhlCi0gICAubG9hZGVyIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfbGRzeW0KLXsKLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIG5hbWUgaWYgPD0gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0gICAgICBjaGFyIF9sX25hbWVbU1lNTk1MRU5dOwotICAgICAgc3RydWN0Ci0JewotCSAgLyogWmVybyBpZiB0aGUgc3ltYm9sIG5hbWUgaXMgbW9yZSB0aGFuIFNZTU5NTEVOIGNoYXJhY3RlcnMuICAqLwotCSAgbG9uZyBfbF96ZXJvZXM7Ci0JICAvKiBUaGUgb2Zmc2V0IGluIHRoZSBzdHJpbmcgdGFibGUgaWYgdGhlIHN5bWJvbCBuYW1lIGlzIG1vcmUKLSAgICAgICAgICAgICB0aGFuIFNZTU5NTEVOIGNoYXJhY3RlcnMuICAqLwotCSAgbG9uZyBfbF9vZmZzZXQ7Ci0JfSBfbF9sOwotICAgIH0gX2w7Ci0gIC8qIFRoZSBzeW1ib2wgdmFsdWUuICAqLwotICBiZmRfdm1hIGxfdmFsdWU7Ci0gIC8qIFRoZSBzeW1ib2wgc2VjdGlvbiBudW1iZXIuICAqLwotICBzaG9ydCBsX3NjbnVtOwotICAvKiBUaGUgc3ltYm9sIHR5cGUgYW5kIGZsYWdzLiAgKi8KLSAgY2hhciBsX3NtdHlwZTsKLSAgLyogVGhlIHN5bWJvbCBzdG9yYWdlIGNsYXNzLiAgKi8KLSAgY2hhciBsX3NtY2xhczsKLSAgLyogVGhlIGltcG9ydCBmaWxlIElELiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX2lmaWxlOwotICAvKiBPZmZzZXQgdG8gdGhlIHBhcmFtZXRlciB0eXBlIGNoZWNrIHN0cmluZy4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9wYXJtOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkc3ltCi17Ci0gIHVuaW9uCi0gICAgewotICAgICAgYmZkX2J5dGUgX2xfbmFtZVtTWU1OTUxFTl07Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBiZmRfYnl0ZSBfbF96ZXJvZXNbNF07Ci0JICBiZmRfYnl0ZSBfbF9vZmZzZXRbNF07Ci0JfSBfbF9sOwotICAgIH0gX2w7Ci0gIGJmZF9ieXRlIGxfdmFsdWVbNF07Ci0gIGJmZF9ieXRlIGxfc2NudW1bMl07Ci0gIGJmZF9ieXRlIGxfc210eXBlWzFdOwotICBiZmRfYnl0ZSBsX3NtY2xhc1sxXTsKLSAgYmZkX2J5dGUgbF9pZmlsZVs0XTsKLSAgYmZkX2J5dGUgbF9wYXJtWzRdOwotfTsKLQotI2RlZmluZSBMRFNZTVNaICg4ICsgMyAqIDQgKyAyICsgMikKLQotLyogVGhlc2UgZmxhZ3MgYXJlIGZvciB0aGUgbF9zbXR5cGUgZmllbGQgKHRoZSBsb3dlciB0aHJlZSBiaXRzIGFyZSBhbgotICAgWFRZXyogdmFsdWUpLiAgKi8KLQotLyogSW1wb3J0ZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTF9JTVBPUlQgKDB4NDApCi0vKiBFbnRyeSBwb2ludC4gICovCi0jZGVmaW5lIExfRU5UUlkgKDB4MjApCi0vKiBFeHBvcnRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBMX0VYUE9SVCAoMHgxMCkKLQotLyogVGhlIGxkcmVsIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgYSByZWxvYyBpbiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZHJlbAotewotICAvKiBUaGUgcmVsb2MgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgbF92YWRkcjsKLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBpbmRleCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uIHN5bWJvbCB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zeW1uZHg7Ci0gIC8qIFRoZSByZWxvY2F0aW9uIHR5cGUgYW5kIHNpemUuICAqLwotICBzaG9ydCBsX3J0eXBlOwotICAvKiBUaGUgc2VjdGlvbiBudW1iZXIgdGhpcyByZWxvY2F0aW9uIGFwcGxpZXMgdG8uICAqLwotICBzaG9ydCBsX3JzZWNubTsKLX07Ci0KLXN0cnVjdCBleHRlcm5hbF9sZHJlbAotewotICBiZmRfYnl0ZSBsX3ZhZGRyWzRdOwotICBiZmRfYnl0ZSBsX3N5bW5keFs0XTsKLSAgYmZkX2J5dGUgbF9ydHlwZVsyXTsKLSAgYmZkX2J5dGUgbF9yc2Vjbm1bMl07Ci19OwotCi0jZGVmaW5lIExEUkVMU1ogKDIgKiA0ICsgMiAqIDIpCi0KLS8qIFRoZSBsaXN0IG9mIGltcG9ydCBmaWxlcy4gICovCi0KLXN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZQotewotICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgbGlzdC4gICovCi0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbmV4dDsKLSAgLyogVGhlIHBhdGguICAqLwotICBjb25zdCBjaGFyICpwYXRoOwotICAvKiBUaGUgZmlsZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZTsKLSAgLyogVGhlIG1lbWJlciBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbWVtYmVyOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIFhDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIElmIHdlIGhhdmUgY3JlYXRlZCBhIFRPQyBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIHRoaXMgaXMgdGhlIC50YwotICAgICBzZWN0aW9uIHdoaWNoIGhvbGRzIGl0LiAgKi8KLSAgYXNlY3Rpb24gKnRvY19zZWN0aW9uOwotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGEgVE9DIGVudHJ5ICh0aGUgWENPRkZfU0VUX1RPQyBmbGFnIGlzCi0JIHNldCksIHRoaXMgaXMgdGhlIG9mZnNldCBpbiB0b2Nfc2VjdGlvbi4gICovCi0gICAgICBiZmRfdm1hIHRvY19vZmZzZXQ7Ci0gICAgICAvKiBJZiB0aGUgVE9DIGVudHJ5IGNvbWVzIGZyb20gYW4gaW5wdXQgZmlsZSwgdGhpcyBpcyBzZXQgdG8gdGhlCi0gICAgICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIENfSElERVhUIFhNQ19UQyBvciBYTUNfVEQgc3ltYm9sLiAgKi8KLSAgICAgIGxvbmcgdG9jX2luZHg7Ci0gICAgfSB1OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgd2hpY2ggaXMgY2FsbGVkLCB0aGlzCi0gICAgIGZpZWxkIGhvbGRzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4gIElmIHRoaXMgc3ltYm9sCi0gICAgIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgdGhpcyBmaWVsZCBob2xkcyBhIHBvaW50ZXIgdG8gdGhlCi0gICAgIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqZGVzY3JpcHRvcjsKLQotICAvKiBUaGUgLmxvYWRlciBzeW1ib2wgdGFibGUgZW50cnksIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqbGRzeW07Ci0KLSAgLyogSWYgWENPRkZfQlVJTFRfTERTWU0gaXMgc2V0LCB0aGlzIGlzIHRoZSAubG9hZGVyIHN5bWJvbCB0YWJsZQotICAgICBpbmRleC4gIElmIFhDT0ZGX0JVSUxEX0xEU1lNIGlzIGNsZWFyLCBhbmQgWENPRkZfSU1QT1JUIGlzIHNldCwKLSAgICAgdGhpcyBpcyB0aGUgbF9pZmlsZSB2YWx1ZS4gICovCi0gIGxvbmcgbGRpbmR4OwotCi0gIC8qIFNvbWUgbGlua2VyIGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9SRUZfUkVHVUxBUiAoMDEpCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9ERUZfUkVHVUxBUiAoMDIpCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9ERUZfRFlOQU1JQyAoMDQpCi0gIC8qIFN5bWJvbCBpcyB1c2VkIGluIGEgcmVsb2MgYmVpbmcgY29waWVkIGludG8gdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0jZGVmaW5lIFhDT0ZGX0xEUkVMICgwMTApCi0gIC8qIFN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQuICAqLwotI2RlZmluZSBYQ09GRl9FTlRSWSAoMDIwKQotICAvKiBTeW1ib2wgaXMgY2FsbGVkOyB0aGlzIGlzLCBpdCBhcHBlYXJzIGluIGEgUl9CUiByZWxvYy4gICovCi0jZGVmaW5lIFhDT0ZGX0NBTExFRCAoMDQwKQotICAvKiBTeW1ib2wgbmVlZHMgdGhlIFRPQyBlbnRyeSBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYQ09GRl9TRVRfVE9DICgwMTAwKQotICAvKiBTeW1ib2wgaXMgZXhwbGljaXRseSBpbXBvcnRlZC4gICovCi0jZGVmaW5lIFhDT0ZGX0lNUE9SVCAoMDIwMCkKLSAgLyogU3ltYm9sIGlzIGV4cGxpY2l0bHkgZXhwb3J0ZWQuICAqLwotI2RlZmluZSBYQ09GRl9FWFBPUlQgKDA0MDApCi0gIC8qIFN5bWJvbCBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgeGNvZmZfYnVpbGRfbGRzeW1zLiAgKi8KLSNkZWZpbmUgWENPRkZfQlVJTFRfTERTWU0gKDAxMDAwKQotICAvKiBTeW1ib2wgaXMgbWVudGlvbmVkIGJ5IGEgc2VjdGlvbiB3aGljaCB3YXMgbm90IGdhcmJhZ2UgY29sbGVjdGVkLiAgKi8KLSNkZWZpbmUgWENPRkZfTUFSSyAoMDIwMDApCi0gIC8qIFN5bWJvbCBzaXplIGlzIHJlY29yZGVkIGluIHNpemVfbGlzdCBsaXN0IGZyb20gaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIFhDT0ZGX0hBU19TSVpFICgwNDAwMCkKLSAgLyogU3ltYm9sIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIFhDT0ZGX0RFU0NSSVBUT1IgKDAxMDAwMCkKLSAgLyogTXVsdGlwbGUgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIGZvciB0aGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgWENPRkZfTVVMVElQTFlfREVGSU5FRCAoMDIwMDAwKQotCi0gIC8qIFRoZSBzdG9yYWdlIG1hcHBpbmcgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIHNtY2xhczsKLX07Ci0KLS8qIFRoZSBYQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgLmRlYnVnIHN0cmluZyBoYXNoIHRhYmxlLiAgV2UgbmVlZCB0byBjb21wdXRlIHRoaXMgd2hpbGUKLSAgICAgcmVhZGluZyB0aGUgaW5wdXQgZmlsZXMsIHNvIHRoYXQgd2Uga25vdyBob3cgbGFyZ2UgdGhlIC5kZWJ1ZwotICAgICBzZWN0aW9uIHdpbGwgYmUgYmVmb3JlIHdlIGFzc2lnbiBzZWN0aW9uIHBvc2l0aW9ucy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLQotICAvKiBUaGUgLmRlYnVnIHNlY3Rpb24gd2Ugd2lsbCB1c2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQuICAqLwotICBhc2VjdGlvbiAqZGVidWdfc2VjdGlvbjsKLQotICAvKiBUaGUgLmxvYWRlciBzZWN0aW9uIHdlIHdpbGwgdXNlIGZvciB0aGUgZmluYWwgb3V0cHV0LiAgKi8KLSAgYXNlY3Rpb24gKmxvYWRlcl9zZWN0aW9uOwotCi0gIC8qIEEgY291bnQgb2Ygbm9uIFRPQyByZWxhdGl2ZSByZWxvY3Mgd2hpY2ggd2lsbCBuZWVkIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSAgc2l6ZV90IGxkcmVsX2NvdW50OwotCi0gIC8qIFRoZSAubG9hZGVyIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotCi0gIC8qIFRoZSAuZ2wgc2VjdGlvbiB3ZSB1c2UgdG8gaG9sZCBnbG9iYWwgbGlua2FnZSBjb2RlLiAgKi8KLSAgYXNlY3Rpb24gKmxpbmthZ2Vfc2VjdGlvbjsKLQotICAvKiBUaGUgLnRjIHNlY3Rpb24gd2UgdXNlIHRvIGhvbGQgdG9jIGVudHJpZXMgd2UgYnVpbGQgZm9yIGdsb2JhbAotICAgICBsaW5rYWdlIGNvZGUuICAqLwotICBhc2VjdGlvbiAqdG9jX3NlY3Rpb247Ci0KLSAgLyogVGhlIC5kcyBzZWN0aW9uIHdlIHVzZSB0byBob2xkIGZ1bmN0aW9uIGRlc2NyaXB0b3JzIHdoaWNoIHdlCi0gICAgIGNyZWF0ZSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4gICovCi0gIGFzZWN0aW9uICpkZXNjcmlwdG9yX3NlY3Rpb247Ci0KLSAgLyogVGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICppbXBvcnRzOwotCi0gIC8qIFJlcXVpcmVkIGFsaWdubWVudCBvZiBzZWN0aW9ucyB3aXRoaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotCi0gIC8qIFdoZXRoZXIgdGhlIC50ZXh0IHNlY3Rpb24gbXVzdCBiZSByZWFkLW9ubHkuICAqLwotICBib29sZWFuIHRleHRybzsKLQotICAvKiBXaGV0aGVyIGdhcmJhZ2UgY29sbGVjdGlvbiB3YXMgZG9uZS4gICovCi0gIGJvb2xlYW4gZ2M7Ci0KLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBzeW1ib2xzIGZvciB3aGljaCB3ZSBoYXZlIHNpemUgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QKLSAgICB7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKm5leHQ7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgIH0gKnNpemVfbGlzdDsKLQotICAvKiBNYWdpYyBzZWN0aW9uczogX3RleHQsIF9ldGV4dCwgX2RhdGEsIF9lZGF0YSwgX2VuZCwgZW5kLiAgKi8KLSAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIGR1cmluZyB0aGUKLSAgIGZpbmFsIGxpbmsgcGhhc2UuICAqLwotCi1zdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8KLXsKLSAgLyogVGhlIHJlbG9jcyB0byBiZSBvdXRwdXQuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogRm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgd2hvc2UgaW5kZXggd2FzIG5vdCBrbm93bgotICAgICB3aGVuIHRoZSByZWxvYyB3YXMgaGFuZGxlZCwgdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci0gIC8qIElmIHRoZXJlIGlzIGEgVE9DIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBhbmQgdGhlCi0gICAgIGluZGV4IG9mIHRoZSBUT0Mgc3ltYm9sIGlzIG5vdCBrbm93biB3aGVuIHRoZSByZWxvYyB3YXMgaGFuZGxlZCwKLSAgICAgYW4gZW50cnkgaXMgYWRkZWQgdG8gdGhpcyBsaW5rZWQgbGlzdC4gIFRoaXMgaXMgbm90IGFuIGFycmF5LAotICAgICBsaWtlIHJlbF9oYXNoZXMsIGJlY2F1c2UgdGhpcyBjYXNlIGlzIHF1aXRlIHVuY29tbW9uLiAgKi8KLSAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaAotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2ggKm5leHQ7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgfSAqdG9jX3JlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogQXJyYXkgb2YgaW5mb3JtYXRpb24ga2VwdCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbiwgaW5kZXhlZCBieSB0aGUKLSAgICAgdGFyZ2V0X2luZGV4IGZpZWxkLiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgVE9DIHN5bWJvbC4gICovCi0gIGxvbmcgdG9jX3N5bWluZHg7Ci0gIC8qIFN0YXJ0IG9mIC5sb2FkZXIgc3ltYm9scy4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqbGRzeW07Ci0gIC8qIE5leHQgLmxvYWRlciByZWxvYyB0byBzd2FwIG91dC4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqbGRyZWw7Ci0gIC8qIEZpbGUgcG9zaXRpb24gb2Ygc3RhcnQgb2YgbGluZSBudW1iZXJzLiAgKi8KLSAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBpbmRpY2VzIG9mIHN5bWJvbHMgb2YgYW55Ci0gICAgIGlucHV0IGZpbGUuICAqLwotICBsb25nICpzeW1faW5kaWNlczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBzeW1ib2xzIGZvciBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGJmZF9ieXRlICpvdXRzeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgbGluZSBudW1iZXJzIGZvciBhbnkgaW5wdXQKLSAgICAgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpsaW5lbm9zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzOwotfTsKLQotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZGhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkaGRyICosIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkaGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX2xkaGRyICosIHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkc3ltX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKiwgc3RydWN0IGludGVybmFsX2xkc3ltICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRzeW1fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKiwgc3RydWN0IGV4dGVybmFsX2xkc3ltICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRyZWxfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqLCBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHJlbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqeGNvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3RydWN0IGludGVybmFsX3JlbG9jICp4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSB4Y29mZl9maW5kX3JlbG9jCi0gIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX21hcmtfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbWFyayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2VlcCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9idWlsZF9sZHN5bXMKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotc3RhdGljIGludCB4Y29mZl9zb3J0X3JlbG9jcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotDAotLyogUm91dGluZXMgdG8gc3dhcCBpbmZvcm1hdGlvbiBpbiB0aGUgWENPRkYgLmxvYWRlciBzZWN0aW9uLiAgSWYgd2UKLSAgIGV2ZXIgbmVlZCB0byB3cml0ZSBhbiBYQ09GRiBsb2FkZXIsIHRoaXMgc3R1ZmYgd2lsbCBuZWVkIHRvIGJlCi0gICBtb3ZlZCB0byBhbm90aGVyIGZpbGUgc2hhcmVkIGJ5IHRoZSBsaW5rZXIgKHdoaWNoIFhDT0ZGIGNhbGxzIHRoZQotICAgYGBiaW5kZXInJykgYW5kIHRoZSBsb2FkZXIuICAqLwotCi0vKiBTd2FwIGluIHRoZSBsZGhkciBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkaGRyICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqZHN0OwotewotICBkc3QtPmxfdmVyc2lvbiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF92ZXJzaW9uKTsKLSAgZHN0LT5sX25zeW1zID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX25zeW1zKTsKLSAgZHN0LT5sX25yZWxvYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9ucmVsb2MpOwotICBkc3QtPmxfaXN0bGVuID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2lzdGxlbik7Ci0gIGRzdC0+bF9uaW1waWQgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfbmltcGlkKTsKLSAgZHN0LT5sX2ltcG9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9pbXBvZmYpOwotICBkc3QtPmxfc3RsZW4gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfc3RsZW4pOwotICBkc3QtPmxfc3RvZmYgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfc3RvZmYpOwotfQotCi0vKiBTd2FwIG91dCB0aGUgbGRoZHIgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3YXBfbGRoZHJfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKnNyYzsKLSAgICAgc3RydWN0IGV4dGVybmFsX2xkaGRyICpkc3Q7Ci17Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF92ZXJzaW9uLCBkc3QtPmxfdmVyc2lvbik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9uc3ltcywgZHN0LT5sX25zeW1zKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX25yZWxvYywgZHN0LT5sX25yZWxvYyk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9pc3RsZW4sIGRzdC0+bF9pc3RsZW4pOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfbmltcGlkLCBkc3QtPmxfbmltcGlkKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2ltcG9mZiwgZHN0LT5sX2ltcG9mZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9zdGxlbiwgZHN0LT5sX3N0bGVuKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3N0b2ZmLCBkc3QtPmxfc3RvZmYpOwotfQotCi0vKiBTd2FwIGluIHRoZSBsZHN5bSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkc3ltICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqZHN0OwotewotICBpZiAoYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5fbC5fbF9sLl9sX3plcm9lcykgIT0gMCkKLSAgICBtZW1jcHkgKGRzdC0+X2wuX2xfbmFtZSwgc3JjLT5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkc3QtPl9sLl9sX2wuX2xfemVyb2VzID0gMDsKLSAgICAgIGRzdC0+X2wuX2xfbC5fbF9vZmZzZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPl9sLl9sX2wuX2xfb2Zmc2V0KTsKLSAgICB9Ci0gIGRzdC0+bF92YWx1ZSA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF92YWx1ZSk7Ci0gIGRzdC0+bF9zY251bSA9IGJmZF9nZXRfMTYgKGFiZmQsIHNyYy0+bF9zY251bSk7Ci0gIGRzdC0+bF9zbXR5cGUgPSBiZmRfZ2V0XzggKGFiZmQsIHNyYy0+bF9zbXR5cGUpOwotICBkc3QtPmxfc21jbGFzID0gYmZkX2dldF84IChhYmZkLCBzcmMtPmxfc21jbGFzKTsKLSAgZHN0LT5sX2lmaWxlID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2lmaWxlKTsKLSAgZHN0LT5sX3Bhcm0gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfcGFybSk7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZHN5bSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHN5bV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmRzdDsKLXsKLSAgaWYgKHNyYy0+X2wuX2xfbC5fbF96ZXJvZXMgIT0gMCkKLSAgICBtZW1jcHkgKGRzdC0+X2wuX2xfbmFtZSwgc3JjLT5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCAwLCBkc3QtPl9sLl9sX2wuX2xfemVyb2VzKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+X2wuX2xfbC5fbF9vZmZzZXQsIGRzdC0+X2wuX2xfbC5fbF9vZmZzZXQpOwotICAgIH0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZhbHVlLCBkc3QtPmxfdmFsdWUpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfc2NudW0sIGRzdC0+bF9zY251bSk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgc3JjLT5sX3NtdHlwZSwgZHN0LT5sX3NtdHlwZSk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgc3JjLT5sX3NtY2xhcywgZHN0LT5sX3NtY2xhcyk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9pZmlsZSwgZHN0LT5sX2lmaWxlKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3Bhcm0sIGRzdC0+bF9wYXJtKTsKLX0KLQotLyogU3dhcCBpbiB0aGUgbGRyZWwgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3YXBfbGRyZWxfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqc3JjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgKmRzdDsKLXsKLSAgZHN0LT5sX3ZhZGRyID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZhZGRyKTsKLSAgZHN0LT5sX3N5bW5keCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zeW1uZHgpOwotICBkc3QtPmxfcnR5cGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBzcmMtPmxfcnR5cGUpOwotICBkc3QtPmxfcnNlY25tID0gYmZkX2dldF8xNiAoYWJmZCwgc3JjLT5sX3JzZWNubSk7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZHJlbCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHJlbF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwgKmRzdDsKLXsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZhZGRyLCBkc3QtPmxfdmFkZHIpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfc3ltbmR4LCBkc3QtPmxfc3ltbmR4KTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgc3JjLT5sX3J0eXBlLCBkc3QtPmxfcnR5cGUpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfcnNlY25tLCBkc3QtPmxfcnNlY25tKTsKLX0KLQwKLS8qIFJvdXRpbmVzIHRvIHJlYWQgWENPRkYgZHluYW1pYyBpbmZvcm1hdGlvbi4gIFRoaXMgZG9uJ3QgcmVhbGx5Ci0gICBiZWxvbmcgaGVyZSwgYnV0IHdlIGFscmVhZHkgaGF2ZSB0aGUgbGRzeW0gbWFuaXB1bGF0aW9uIHJvdXRpbmVzCi0gICBoZXJlLiAgKi8KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0gICAgewotICAgICAgc2VjLT51c2VkX2J5X2JmZCA9IGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0KLQkoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsCi0JCQkJICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKCEgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxzZWMpKQotICAgIHJldHVybiAtMTsKLSAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzOwotCi0gIHhjb2ZmX3N3YXBfbGRoZHJfaW4gKGFiZmQsIChzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgY29udGVudHMsICZsZGhkcik7Ci0KLSAgcmV0dXJuIChsZGhkci5sX25zeW1zICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIEdldCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotbG9uZwotX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipwc3ltczsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmVsc3ltLCAqZWxzeW1lbmQ7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKnN5bWJ1ZjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHN0cmluZ3MgPSAoY2hhciAqKSBjb250ZW50cyArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgc3ltYnVmID0gKChjb2ZmX3N5bWJvbF90eXBlICopCi0JICAgIGJmZF96YWxsb2MgKGFiZmQsIGxkaGRyLmxfbnN5bXMgKiBzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUpKSk7Ci0gIGlmIChzeW1idWYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChjb250ZW50cyArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyssIHN5bWJ1ZisrLCBwc3ltcysrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSBsZHN5bTsKLQotICAgICAgeGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgZWxzeW0sICZsZHN5bSk7Ci0KLSAgICAgIHN5bWJ1Zi0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQlzeW1idWYtPnN5bWJvbC5uYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgU1lNTk1MRU47IGkrKykKLQkgICAgaWYgKGxkc3ltLl9sLl9sX25hbWVbaV0gPT0gJ1wwJykKLQkgICAgICBicmVhazsKLQkgIGlmIChpIDwgU1lNTk1MRU4pCi0JICAgIHN5bWJ1Zi0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSBlbHN5bS0+X2wuX2xfbmFtZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmM7Ci0KLQkgICAgICBjID0gYmZkX2FsbG9jIChhYmZkLCBTWU1OTUxFTiArIDEpOwotCSAgICAgIGlmIChjID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkgICAgICBtZW1jcHkgKGMsIGxkc3ltLl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLQkgICAgICBjW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICAgICAgc3ltYnVmLT5zeW1ib2wubmFtZSA9IGM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsZHN5bS5sX3NtY2xhcyA9PSBYTUNfWE8pCi0Jc3ltYnVmLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlCi0Jc3ltYnVmLT5zeW1ib2wuc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCQkgICAgICBsZHN5bS5sX3NjbnVtKTsKLSAgICAgIHN5bWJ1Zi0+c3ltYm9sLnZhbHVlID0gbGRzeW0ubF92YWx1ZSAtIHN5bWJ1Zi0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQotICAgICAgc3ltYnVmLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0gICAgICBpZiAoKGxkc3ltLmxfc210eXBlICYgTF9FWFBPUlQpICE9IDApCi0Jc3ltYnVmLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQotICAgICAgLyogRklYTUU6IFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgb3RoZXIgaW5mb3JtYXRpb24gc3RvcmVkCi0gICAgICAgICB3aXRoIHRoZSBsb2FkZXIgc3ltYm9sLiAgKi8KLQotICAgICAgKnBzeW1zID0gKGFzeW1ib2wgKikgc3ltYnVmOwotICAgIH0KLQotICAqcHN5bXMgPSBOVUxMOwotCi0gIHJldHVybiBsZGhkci5sX25zeW1zOwotfQotCi0vKiBHZXQgdGhlIHNpemUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZXR1cm4gKGxkaGRyLmxfbnJlbG9jICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIFRoZSB0eXBpY2FsIGR5bmFtaWMgcmVsb2MuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9keW5hbWljX3JlbG9jID0KLSAgSE9XVE8gKDAsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1BPUyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdldCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBwcmVsb2NzLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipwcmVsb2NzOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBhcmVsZW50ICpyZWxidWY7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqZWxyZWwsICplbHJlbGVuZDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZWxidWYgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIGxkaGRyLmxfbnJlbG9jICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gIGlmIChyZWxidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZWxyZWwgPSAoKHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqKQotCSAgIChjb250ZW50cyArIExESERSU1ogKyBsZGhkci5sX25zeW1zICogTERTWU1TWikpOwotICBlbHJlbGVuZCA9IGVscmVsICsgbGRoZHIubF9ucmVsb2M7Ci0gIGZvciAoOyBlbHJlbCA8IGVscmVsZW5kOyBlbHJlbCsrLCByZWxidWYrKywgcHJlbG9jcysrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCBsZHJlbDsKLQotICAgICAgeGNvZmZfc3dhcF9sZHJlbF9pbiAoYWJmZCwgZWxyZWwsICZsZHJlbCk7Ci0KLSAgICAgIGlmIChsZHJlbC5sX3N5bW5keCA+PSAzKQotCXJlbGJ1Zi0+c3ltX3B0cl9wdHIgPSBzeW1zICsgKGxkcmVsLmxfc3ltbmR4IC0gMyk7Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIHN3aXRjaCAobGRyZWwubF9zeW1uZHgpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIG5hbWUgPSAiLnRleHQiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgbmFtZSA9ICIuZGF0YSI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBuYW1lID0gIi5ic3MiOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzZWMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICByZWxidWYtPnN5bV9wdHJfcHRyID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIHJlbGJ1Zi0+YWRkcmVzcyA9IGxkcmVsLmxfdmFkZHI7Ci0gICAgICByZWxidWYtPmFkZGVuZCA9IDA7Ci0KLSAgICAgIC8qIE1vc3QgZHluYW1pYyByZWxvY3MgaGF2ZSB0aGUgc2FtZSB0eXBlLiAgRklYTUU6IFRoaXMgaXMgb25seQotICAgICAgICAgY29ycmVjdCBpZiBsZHJlbC5sX3J0eXBlID09IDAuICBJbiBvdGhlciBjYXNlcywgd2Ugc2hvdWxkIHVzZQotICAgICAgICAgYSBkaWZmZXJlbnQgaG93dG8uICAqLwotICAgICAgcmVsYnVmLT5ob3d0byA9ICZ4Y29mZl9keW5hbWljX3JlbG9jOwotCi0gICAgICAvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBsX3JzZWNubSBmaWVsZC4gICovCi0KLSAgICAgICpwcmVsb2NzID0gcmVsYnVmOwotICAgIH0KLQotICAqcHJlbG9jcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIGxkaGRyLmxfbnJlbG9jOwotfQotDAotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gWENPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi14Y29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmluZHggPSAtMTsKLSAgICAgIHJldC0+dG9jX3NlY3Rpb24gPSBOVUxMOwotICAgICAgcmV0LT51LnRvY19pbmR4ID0gLTE7Ci0gICAgICByZXQtPmRlc2NyaXB0b3IgPSBOVUxMOwotICAgICAgcmV0LT5sZHN5bSA9IE5VTEw7Ci0gICAgICByZXQtPmxkaW5keCA9IC0xOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgICByZXQtPnNtY2xhcyA9IFhNQ19VQTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsIHhjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5kZWJ1Z19zdHJ0YWIgPSBfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0ICgpOwotICByZXQtPmRlYnVnX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmxvYWRlcl9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5sZHJlbF9jb3VudCA9IDA7Ci0gIG1lbXNldCAoJnJldC0+bGRoZHIsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2xkaGRyKSk7Ci0gIHJldC0+bGlua2FnZV9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT50b2Nfc2VjdGlvbiA9IE5VTEw7Ci0gIHJldC0+ZGVzY3JpcHRvcl9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5pbXBvcnRzID0gTlVMTDsKLSAgcmV0LT5maWxlX2FsaWduID0gMDsKLSAgcmV0LT50ZXh0cm8gPSBmYWxzZTsKLSAgcmV0LT5nYyA9IGZhbHNlOwotICBtZW1zZXQgKHJldC0+c3BlY2lhbF9zZWN0aW9ucywgMCwgc2l6ZW9mIHJldC0+c3BlY2lhbF9zZWN0aW9ucyk7Ci0KLSAgLyogVGhlIGxpbmtlciB3aWxsIGFsd2F5cyBnZW5lcmF0ZSBhIGZ1bGwgYS5vdXQgaGVhZGVyLiAgV2UgbmVlZCB0bwotICAgICByZWNvcmQgdGhhdCBmYWN0IG5vdywgYmVmb3JlIHRoZSBzaXplb2ZfaGVhZGVycyByb3V0aW5lIGNvdWxkIGJlCi0gICAgIGNhbGxlZC4gICovCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIgPSB0cnVlOwotCi0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHhjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSB4Y29mZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIFJlYWQgaW50ZXJuYWwgcmVsb2NzIGZvciBhbiBYQ09GRiBjc2VjdC4gIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZAotICAgX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIHdoaWNoIHRyaWVzIHRvIHRha2UgYWR2YW50YWdlIG9mIGFueQotICAgcmVsb2NzIHdoaWNoIG1heSBoYXZlIGJlZW4gY2FjaGVkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IGludGVybmFsX3JlbG9jICoKLXhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgcmVxdWlyZV9pbnRlcm5hbCwgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJvb2xlYW4gY2FjaGU7Ci0gICAgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9pbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID09IE5VTEwKLSAgICAgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0KLSAgICAgIGVuY2xvc2luZyA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+ZW5jbG9zaW5nOwotCi0gICAgICBpZiAoZW5jbG9zaW5nICE9IE5VTEwKLQkgICYmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKSA9PSBOVUxMCi0JICAgICAgfHwgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGVuY2xvc2luZyktPnJlbG9jcyA9PSBOVUxMKQotCSAgJiYgY2FjaGUKLQkgICYmIGVuY2xvc2luZy0+cmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGlmIChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIGVuY2xvc2luZywgdHJ1ZSwKLQkJCQkJICAgICAgZXh0ZXJuYWxfcmVsb2NzLCBmYWxzZSwKLQkJCQkJICAgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKQotCSAgICAgID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgaWYgKGVuY2xvc2luZyAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKSAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICE9IE5VTEwpCi0JewotCSAgc2l6ZV90IG9mZjsKLQotCSAgb2ZmID0gKChzZWMtPnJlbF9maWxlcG9zIC0gZW5jbG9zaW5nLT5yZWxfZmlsZXBvcykKLQkJIC8gYmZkX2NvZmZfcmVsc3ogKGFiZmQpKTsKLQkgIGlmICghIHJlcXVpcmVfaW50ZXJuYWwpCi0JICAgIHJldHVybiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICsgb2ZmOwotCSAgbWVtY3B5IChpbnRlcm5hbF9yZWxvY3MsCi0JCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGVuY2xvc2luZyktPnJlbG9jcyArIG9mZiwKLQkJICBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLQkgIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0JfQotICAgIH0KLQotICByZXR1cm4gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJCSByZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpOwotfQotDAotLyogR2l2ZW4gYW4gWENPRkYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiB4Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0KLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgLyogSWYgdGhlIGFyY2hpdmUgaGFzIGEgbWFwLCBkbyB0aGUgdXN1YWwgc2VhcmNoLiAgV2UgdGhlbiBuZWVkCi0gICAgICAgICB0byBjaGVjayB0aGUgYXJjaGl2ZSBmb3Igc3RyaXBwZWQgZHluYW1pYyBvYmplY3RzLCBiZWNhdXNlCi0gICAgICAgICB0aGV5IHdpbGwgbm90IGFwcGVhciBpbiB0aGUgYXJjaGl2ZSBtYXAgZXZlbiB0aG91Z2ggdGhleQotICAgICAgICAgc2hvdWxkLCBwZXJoYXBzLCBiZSBpbmNsdWRlZC4gIElmIHRoZSBhcmNoaXZlIGhhcyBubyBtYXAsIHdlCi0gICAgICAgICBqdXN0IGNvbnNpZGVyIGVhY2ggb2JqZWN0IGZpbGUgaW4gdHVybiwgc2luY2UgdGhhdCBhcHBhcmVudGx5Ci0gICAgICAgICBpcyB3aGF0IHRoZSBBSVggbmF0aXZlIGxpbmtlciBkb2VzLiAgKi8KLSAgICAgIGlmIChiZmRfaGFzX21hcCAoYWJmZCkpCi0JewotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkJIChhYmZkLCBpbmZvLCB4Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB7Ci0JYmZkICptZW1iZXI7Ci0KLQltZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpOwotCXdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQkgIHsKLQkgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKG1lbWJlciwgYmZkX29iamVjdCkKLQkJJiYgKCEgYmZkX2hhc19tYXAgKGFiZmQpCi0JCSAgICB8fCAoKG1lbWJlci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JCQkmJiAobWVtYmVyLT5mbGFncyAmIEhBU19TWU1TKSA9PSAwKSkpCi0JICAgICAgewotCQlib29sZWFuIG5lZWRlZDsKLQotCQlpZiAoISB4Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAobWVtYmVyLCBpbmZvLCAmbmVlZGVkKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmIChuZWVkZWQpCi0JCSAgbWVtYmVyLT5hcmNoaXZlX3Bhc3MgPSAtMTsKLQkgICAgICB9Ci0JICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIG1lbWJlcik7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBYQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiAhIGluZm8tPnN0YXRpY19saW5rCi0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCAmJiBzeW0ubl9zY251bSAhPSBOX1VOREVGKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGV4dGVybmFsbHkgdmlzaWJsZSwgYW5kIGlzIGRlZmluZWQgYnkgdGhpcwotICAgICAgICAgICAgIG9iamVjdCBmaWxlLiAgKi8KLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCSAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQotCSAgICAgdW5kZWZpbmVkLiAgSWYgYSBzeW1ib2wgaXMgY3VycmVudGx5IGtub3duIHRvIGJlIGNvbW1vbiwKLQkgICAgIFhDT0ZGIGxpbmtlcnMgZG8gbm90IGJyaW5nIGluIGFuIG9iamVjdCBmaWxlIHdoaWNoCi0JICAgICBkZWZpbmVzIGl0LiAgV2UgYWxzbyBkb24ndCBicmluZyBpbiBzeW1ib2xzIHRvIHNhdGlzZnkKLQkgICAgIHVuZGVmaW5lZCByZWZlcmVuY2VzIGluIHNoYXJlZCBvYmplY3RzLiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMKLQkJICB8fCAoKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5mbGFncwotCQkgICAgICAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgbG9hZGVyIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgZHluYW1pYyBvYmplY3QKLSAgIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFRoZSBuYXRpdmUgbGlua2VyIHVzZXMgdGhlIGxvYWRlcgotICAgc3ltYm9scywgbm90IHRoZSBub3JtYWwgc3ltYm9sIHRhYmxlLCBzbyB3ZSBkbyB0b28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqYnVmOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZWxzeW0sICplbHN5bWVuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgbm8gc3ltYm9scywgc28gZG9uJ3QgdHJ5IHRvIGluY2x1ZGUgaXQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJ1ZiA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBidWYsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJ1ZiArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChidWYgKyBMREhEUlNaKTsKLSAgZWxzeW1lbmQgPSBlbHN5bSArIGxkaGRyLmxfbnN5bXM7Ci0gIGZvciAoOyBlbHN5bSA8IGVsc3ltZW5kOyBlbHN5bSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSBsZHN5bTsKLSAgICAgIGNoYXIgbmFtYnVmW1NZTU5NTEVOICsgMV07Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHhjb2ZmX3N3YXBfbGRzeW1faW4gKGFiZmQsIGVsc3ltLCAmbGRzeW0pOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGV4cG9ydGVkIHN5bWJvbHMuICAqLwotICAgICAgaWYgKChsZHN5bS5sX3NtdHlwZSAmIExfRVhQT1JUKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQluYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAobmFtYnVmLCBsZHN5bS5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0JICBuYW1idWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkgIG5hbWUgPSBuYW1idWY7Ci0JfQotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkKLSAgICAgICAgIHVuZGVmaW5lZC4gIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHdlIGFyZSB1c2luZyBhbiBYQ09GRgotICAgICAgICAgaGFzaCB0YWJsZS4gICovCi0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAmJiAoKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5mbGFncwotCSAgICAgICYgWENPRkZfREVGX0RZTkFNSUMpID09IDApCi0JewotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKnBuZWVkZWQgPSB0cnVlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIHNoYXJlZCBvYmplY3QuICAqLwotCi0gIGlmIChidWYgIT0gTlVMTCAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+a2VlcF9jb250ZW50cykKLSAgICB7Ci0gICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzKTsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyB0aGUgaW5kZXggb2YgcmVsb2MgaW4gUkVMT0NTIHdpdGggdGhlIGxlYXN0IGFkZHJlc3MgZ3JlYXRlcgotICAgdGhhbiBvciBlcXVhbCB0byBBRERSRVNTLiAgVGhlIHJlbG9jcyBhcmUgc29ydGVkIGJ5IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZQoteGNvZmZfZmluZF9yZWxvYyAocmVsb2NzLCBjb3VudCwgYWRkcmVzcykKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgYmZkX3NpemVfdHlwZSBtaW4sIG1heCwgdGhpczsKLQotICBpZiAoY291bnQgPCAyKQotICAgIHsKLSAgICAgIGlmIChjb3VudCA9PSAxICYmIHJlbG9jc1swXS5yX3ZhZGRyIDwgYWRkcmVzcykKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgbWluID0gMDsKLSAgbWF4ID0gY291bnQ7Ci0KLSAgLyogRG8gYSBiaW5hcnkgc2VhcmNoIG92ZXIgKG1pbixtYXhdLiAgKi8KLSAgd2hpbGUgKG1pbiArIDEgPCBtYXgpCi0gICAgewotICAgICAgYmZkX3ZtYSByYWRkcjsKLQotICAgICAgdGhpcyA9IChtYXggKyBtaW4pIC8gMjsKLSAgICAgIHJhZGRyID0gcmVsb2NzW3RoaXNdLnJfdmFkZHI7Ci0gICAgICBpZiAocmFkZHIgPiBhZGRyZXNzKQotCW1heCA9IHRoaXM7Ci0gICAgICBlbHNlIGlmIChyYWRkciA8IGFkZHJlc3MpCi0JbWluID0gdGhpczsKLSAgICAgIGVsc2UKLQl7Ci0JICBtaW4gPSB0aGlzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAocmVsb2NzW21pbl0ucl92YWRkciA8IGFkZHJlc3MpCi0gICAgcmV0dXJuIG1pbiArIDE7Ci0KLSAgd2hpbGUgKG1pbiA+IDAKLQkgJiYgcmVsb2NzW21pbiAtIDFdLnJfdmFkZHIgPT0gYWRkcmVzcykKLSAgICAtLW1pbjsKLQotICByZXR1cm4gbWluOwotfQotCi0vKiBBZGQgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIFhDT0ZGIGlzIGEgd2VpcmQgZm9ybWF0LiAgQSBub3JtYWwgWENPRkYgLm8gZmlsZXMgd2lsbCBoYXZlIHRocmVlCi0gICBDT0ZGIHNlY3Rpb25zLS0udGV4dCwgLmRhdGEsIGFuZCAuYnNzLS1idXQgZWFjaCBDT0ZGIHNlY3Rpb24gd2lsbAotICAgY29udGFpbiBtYW55IGNzZWN0cy4gIFRoZXNlIGNzZWN0cyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzeW1ib2wKLSAgIHRhYmxlLiAgRnJvbSB0aGUgbGlua2VyJ3MgcG9pbnQgb2YgdmlldywgZWFjaCBjc2VjdCBtdXN0IGJlCi0gICBjb25zaWRlcmVkIGEgc2VjdGlvbiBpbiBpdHMgb3duIHJpZ2h0LiAgRm9yIGV4YW1wbGUsIGEgVE9DIGVudHJ5IGlzCi0gICBoYW5kbGVkIGFzIGEgc21hbGwgWE1DX1RDIGNzZWN0LiAgVGhlIGxpbmtlciBtdXN0IGJlIGFibGUgdG8gbWVyZ2UKLSAgIGRpZmZlcmVudCBUT0MgZW50cmllcyB0b2dldGhlciwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtdXN0IGJlIGFibGUgdG8KLSAgIGV4dHJhY3QgdGhlIFhNQ19UQyBjc2VjdHMgZnJvbSB0aGUgLmRhdGEgc2VjdGlvbiBvZiB0aGUgaW5wdXQgLm8KLSAgIGZpbGUuCi0KLSAgIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2Ygb3VyIGxpbmtlciwgdGhpcyBpcywgb2YgY291cnNlLCBhIGhpZGVvdXMKLSAgIG5pZ2h0bWFyZS4gIFdlIGNvcGUgYnkgYWN0dWFsbHkgY3JlYXRpbmcgc2VjdGlvbnMgZm9yIGVhY2ggY3NlY3QsCi0gICBhbmQgZGlzY2FyZGluZyB0aGUgb3JpZ2luYWwgc2VjdGlvbnMuICBXZSB0aGVuIGhhdmUgdG8gaGFuZGxlIHRoZQotICAgcmVsb2NhdGlvbiBlbnRyaWVzIGNhcmVmdWxseSwgc2luY2UgdGhlIG9ubHkgd2F5IHRvIHRlbGwgd2hpY2gKLSAgIGNzZWN0IHRoZXkgYmVsb25nIHRvIGlzIHRvIGV4YW1pbmUgdGhlIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IG5fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdDsKLSAgYm9vbGVhbiBkZWZhdWx0X2NvcHk7Ci0gIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKipjc2VjdF9jYWNoZTsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGFzZWN0aW9uICpvOwotICBhc2VjdGlvbiAqbGFzdF9yZWFsOwotICBib29sZWFuIGtlZXBfc3ltczsKLSAgYXNlY3Rpb24gKmNzZWN0OwotICB1bnNpZ25lZCBpbnQgY3NlY3RfaW5kZXg7Ci0gIGFzZWN0aW9uICpmaXJzdF9jc2VjdDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdAotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICAgYXNlY3Rpb24gKipjc2VjdHM7Ci0gICAgICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgICB9ICpyZWxvY19pbmZvID0gTlVMTDsKLQotICBrZWVwX3N5bXMgPSBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiAhIGluZm8tPnN0YXRpY19saW5rKQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gYnVpbGQgYSAubG9hZGVyIHNlY3Rpb24sIHNvIHdlIGRvIGl0IGhlcmUuICBUaGlzCi0JIHdvbid0IHdvcmsgaWYgd2UncmUgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlIHdpdGggbm8KLQkgWENPRkYgaW5wdXQgZmlsZXMuICBGSVhNRS4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmxzZWM7Ci0KLQkgIGxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5sb2FkZXIiKTsKLQkgIGlmIChsc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uID0gbHNlYzsKLQkgIGxzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgbGlua2FnZSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmxzZWM7Ci0KLQkgIGxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5nbCIpOwotCSAgaWYgKGxzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uID0gbHNlYzsKLQkgIGxzZWMtPmZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgfCBTRUNfSU5fTUVNT1JZKTsKLQkgIGxzZWMtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSBUT0Mgc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnRzZWM7Ci0KLQkgIHRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi50YyIpOwotCSAgaWYgKHRzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24gPSB0c2VjOwotCSAgdHNlYy0+ZmxhZ3MgfD0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJICB8IFNFQ19JTl9NRU1PUlkpOwotCSAgdHNlYy0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQl9Ci0gICAgICAvKiBMaWtld2lzZSBmb3IgdGhlIGRlc2NyaXB0b3Igc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuZHMiKTsKLQkgIGlmIChkc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbiA9IGRzZWM7Ci0JICBkc2VjLT5mbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgIHwgU0VDX0lOX01FTU9SWSk7Ci0JICBkc2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uID09IE5VTEwKLQkgICYmIGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQl7Ci0JICBhc2VjdGlvbiAqZHNlYzsKLQotCSAgZHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmRlYnVnIik7Ci0JICBpZiAoZHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uID0gZHNlYzsKLQkgIGRzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCX0KLSAgICB9Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmspCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbl90bWFzayA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdG1hc2s7Ci0gIG5fYnRzaGZ0ID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl9idHNoZnQ7Ci0KLSAgLyogRGVmaW5lIG1hY3JvcyBzbyB0aGF0IElTRkNOLCBldC4gYWwuLCBtYWNyb3Mgd29yayBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBOX1RNQVNLIG5fdG1hc2sKLSNkZWZpbmUgTl9CVFNIRlQgbl9idHNoZnQKLQotICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZGVmYXVsdF9jb3B5ID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBkZWZhdWx0X2NvcHkgPSB0cnVlOwotCi0gIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotCi0gIC8qIFdlIGtlZXAgYSBsaXN0IG9mIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZAotICAgICB0byBlYWNoIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoc3ltY291bnQKLQkJCSAgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXMgPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaDsKLSAgbWVtc2V0IChzeW1faGFzaCwgMCwKLQkgIChzaXplX3QpIHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICAvKiBCZWNhdXNlIG9mIHRoZSB3ZWlyZCBzdHVmZiB3ZSBhcmUgZG9pbmcgd2l0aCBYQ09GRiBjc2VjdHMsIHdlIGNhbgotICAgICBub3QgZWFzaWx5IGRldGVybWluZSB3aGljaCBzZWN0aW9uIGEgc3ltYm9sIGlzIGluLCBzbyB3ZSBzdG9yZQotICAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHRkYXRhIGZvciB0aGUgaW5wdXQgZmlsZS4gICovCi0gIGNzZWN0X2NhY2hlID0gKChhc2VjdGlvbiAqKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gIGlmIChjc2VjdF9jYWNoZSA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHMgPSBjc2VjdF9jYWNoZTsKLSAgbWVtc2V0IChjc2VjdF9jYWNoZSwgMCwgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQotICAvKiBXaGlsZSBzcGxpdHRpbmcgc2VjdGlvbnMgaW50byBjc2VjdHMsIHdlIG5lZWQgdG8gYXNzaWduIHRoZQotICAgICByZWxvY3MgY29ycmVjdGx5LiAgVGhlIHJlbG9jcyBhbmQgdGhlIGNzZWN0cyBtdXN0IGJvdGggYmUgaW4KLSAgICAgb3JkZXIgYnkgVk1BIHdpdGhpbiBhIGdpdmVuIHNlY3Rpb24sIHNvIHdlIGhhbmRsZSB0aGlzIGJ5Ci0gICAgIHNjYW5uaW5nIGFsb25nIHRoZSByZWxvY3MgYXMgd2UgcHJvY2VzcyB0aGUgY3NlY3RzLiAgV2UgaW5kZXgKLSAgICAgaW50byByZWxvY19pbmZvIHVzaW5nIHRoZSBzZWN0aW9uIHRhcmdldF9pbmRleC4gICovCi0gIHJlbG9jX2luZm8gPSAoKHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdCAqKQotCQliZmRfbWFsbG9jICgoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpCi0JCQkgICAgKiBzaXplb2YgKHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdCkpKTsKLSAgaWYgKHJlbG9jX2luZm8gPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0ICgoUFRSKSByZWxvY19pbmZvLCAwLAotCSAgKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKSAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0KSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzIGFuZCBsaW5lIG51bWJlcnMgZm9yIGVhY2ggc2VjdGlvbi4gICovCi0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIGxhc3RfcmVhbCA9IE5VTEw7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGxhc3RfcmVhbCA9IG87Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPQotCSAgICB4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgbywgdHJ1ZSwgKGJmZF9ieXRlICopIE5VTEwsCi0JCQkJCWZhbHNlLCAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyA9Ci0JICAgIChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbWVtc2V0IChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzLCAwLAotCQkgIG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0JfQotCi0gICAgICBpZiAoKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkgICYmIG8tPmxpbmVub19jb3VudCA+IDApCi0JewotCSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0KLQkgIGxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQkgIGlmIChsaW5lbm9zID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgPSBsaW5lbm9zOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5saW5lX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChsaW5lbm9zLCBsaW5lc3osIG8tPmxpbmVub19jb3VudCwgYWJmZCkKLQkJICAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIERvbid0IGxldCB0aGUgbGlua2VyIHJlbG9jYXRpb24gcm91dGluZXMgZGlzY2FyZCB0aGUgc3ltYm9scy4gICovCi0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gIGNzZWN0ID0gTlVMTDsKLSAgY3NlY3RfaW5kZXggPSAwOwotICBmaXJzdF9jc2VjdCA9IE5VTEw7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgQkZEX0FTU0VSVCAoc3ltZXN6ID09IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCkpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGludCBzbXR5cDsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqc2V0X3RvYzsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICAvKiBJbiB0aGlzIHBhc3Mgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHdpdGggY3NlY3QKLSAgICAgICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQgJiYgc3ltLm5fc2NsYXNzICE9IENfSElERVhUKQotCXsKLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19GSUxFICYmIGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgICBjc2VjdCA9IE5VTEw7Ci0JICAgIH0KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgICpjc2VjdF9jYWNoZSA9IGNzZWN0OwotCSAgZWxzZSBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCB8fCBzeW0ubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICAqY3NlY3RfY2FjaGUgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgIGVsc2UKLQkgICAgKmNzZWN0X2NhY2hlID0gTlVMTDsKLQkgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotCSAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQkgIGNzZWN0X2NhY2hlICs9IHN5bS5uX251bWF1eCArIDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gaXQsCi0gICAgICAgICBhbmQgd2UncmUgbm90IHN0cmlwcGluZyBpdCwgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGFuZAotICAgICAgICAgYWRkIHRoZW0gdG8gdGhlIGNvdW50IGZvciB0aGlzIGNzZWN0LiAgSW4gdGhlIGZpbmFsIGxpbmsgcGFzcwotICAgICAgICAgd2UgYXJlIGdvaW5nIHRvIGF0dGFjaCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBieSBzeW1ib2wsCi0gICAgICAgICByYXRoZXIgdGhhbiBieSBzZWN0aW9uLCBpbiBvcmRlciB0byBtb3JlIGVhc2lseSBoYW5kbGUKLSAgICAgICAgIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgICBpZiAoKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkgICYmIHN5bS5uX251bWF1eCA+IDEKLQkgICYmIGNzZWN0ICE9IE5VTEwKLQkgICYmIElTRkNOIChzeW0ubl90eXBlKSkKLQl7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4bGluOwotCi0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgKGVzeW0gKyBzeW1lc3opLAotCQkJCXN5bS5uX3R5cGUsIHN5bS5uX3NjbGFzcywKLQkJCQkwLCBzeW0ubl9udW1hdXgsIChQVFIpICZhdXhsaW4pOwotCSAgaWYgKGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgIT0gMCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBsaW5vZmY7Ci0KLQkgICAgICBlbmNsb3NpbmcgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+ZW5jbG9zaW5nOwotCSAgICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiBgJXMnIGhhcyBsaW5lIG51bWJlcnMgYnV0IG5vIGVuY2xvc2luZyBzZWN0aW9uIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgICAgbGlub2ZmID0gKGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIKLQkJCS0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MpOwotCSAgICAgIGlmIChsaW5vZmYgPCBlbmNsb3NpbmctPmxpbmVub19jb3VudCAqIGxpbmVzeikKLQkJewotCQkgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gbGluOwotCQkgIGJmZF9ieXRlICpsaW5wc3RhcnQ7Ci0KLQkJICBsaW5wc3RhcnQgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ubGluZW5vcwotCQkJICAgICAgICsgbGlub2ZmKTsKLQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgKFBUUikgbGlucHN0YXJ0LCAoUFRSKSAmbGluKTsKLQkJICBpZiAobGluLmxfbG5ubyA9PSAwCi0JCSAgICAgICYmICgoYmZkX3NpemVfdHlwZSkgbGluLmxfYWRkci5sX3N5bW5keAotCQkJICA9PSAoKGVzeW0KLQkJCSAgICAgICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAgICAgIC8gc3ltZXN6KSkpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9ieXRlICpsaW5wZW5kLCAqbGlucDsKLQotCQkgICAgICBsaW5wZW5kID0gKHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmxpbmVub3MKLQkJCQkgKyBlbmNsb3NpbmctPmxpbmVub19jb3VudCAqIGxpbmVzeik7Ci0JCSAgICAgIGZvciAobGlucCA9IGxpbnBzdGFydCArIGxpbmVzejsKLQkJCSAgIGxpbnAgPCBsaW5wZW5kOwotCQkJICAgbGlucCArPSBsaW5lc3opCi0JCQl7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCAoUFRSKSBsaW5wLAotCQkJCQkJICAgKFBUUikgJmxpbik7Ci0JCQkgIGlmIChsaW4ubF9sbm5vID09IDApCi0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGNzZWN0LT5saW5lbm9fY291bnQgKz0gKGxpbnAgLSBsaW5wc3RhcnQpIC8gbGluZXN6OwotCQkgICAgICAvKiBUaGUgc2V0dGluZyBvZiBsaW5lX2ZpbGVwb3Mgd2lsbCBvbmx5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlZnVsIGlmIGFsbCB0aGUgbGluZSBudW1iZXIgZW50cmllcyBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgIGNzZWN0IGFyZSBjb250aWd1b3VzOyB0aGlzIG9ubHkgbWF0dGVycyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciByZXBvcnRpbmcuICAqLwotCQkgICAgICBpZiAoY3NlY3QtPmxpbmVfZmlsZXBvcyA9PSAwKQotCQkJY3NlY3QtPmxpbmVfZmlsZXBvcyA9Ci0JCQkgIGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogUGljayB1cCB0aGUgY3NlY3QgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLiAgKi8KLQotICAgICAgaWYgKHN5bS5uX251bWF1eCA9PSAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNsYXNzICVkIHN5bWJvbCBgJXMnIGhhcyBubyBhdXggZW50cmllcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN5bS5uX3NjbGFzcywgbmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsCi0JCQkgICAgKFBUUikgKGVzeW0gKyBzeW1lc3ogKiBzeW0ubl9udW1hdXgpLAotCQkJICAgIHN5bS5uX3R5cGUsIHN5bS5uX3NjbGFzcywKLQkJCSAgICBzeW0ubl9udW1hdXggLSAxLCBzeW0ubl9udW1hdXgsCi0JCQkgICAgKFBUUikgJmF1eCk7Ci0KLSAgICAgIHNtdHlwID0gU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApOwotCi0gICAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBzZWN0aW9uID0gTlVMTDsKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIHNldF90b2MgPSBOVUxMOwotCi0gICAgICBzd2l0Y2ggKHNtdHlwKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBjc2VjdCB0eXBlICVkIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgc210eXApOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQotCWNhc2UgWFRZX0VSOgotCSAgLyogVGhpcyBpcyBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0hJREVYVAotCSAgICAgIHx8IHN5bS5uX3NjbnVtICE9IE5fVU5ERUYKLQkgICAgICB8fCBhdXgueF9jc2VjdC54X3Njbmxlbi5sICE9IDApCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBiYWQgWFRZX0VSIHN5bWJvbCBgJXMnOiBjbGFzcyAlZCBzY251bSAlZCBzY25sZW4gJWQiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzeW0ubl9zY2xhc3MsIHN5bS5uX3NjbnVtLAotCQkgYXV4LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogQW4gWE1DX1hPIGV4dGVybmFsIHJlZmVyZW5jZSBpcyBhY3R1YWxseSBhIHJlZmVyZW5jZSB0bwotICAgICAgICAgICAgIGFuIGFic29sdXRlIGxvY2F0aW9uLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyAhPSBYTUNfWE8pCi0JICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsdWUgPSBzeW0ubl92YWx1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFhUWV9TRDoKLQkgIC8qIFRoaXMgaXMgYSBjc2VjdCBkZWZpbml0aW9uLiAgKi8KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgfQotCi0JICBjc2VjdCA9IE5VTEw7Ci0JICBjc2VjdF9pbmRleCA9IC0xOwotCi0JICAvKiBXaGVuIHdlIHNlZSBhIFRPQyBhbmNob3IsIHdlIHJlY29yZCB0aGUgVE9DIHZhbHVlLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMwKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0hJREVYVAotCQkgIHx8IGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgIT0gMCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiBYTUNfVEMwIHN5bWJvbCBgJXMnIGlzIGNsYXNzICVkIHNjbmxlbiAlZCIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzeW0ubl9zY2xhc3MsCi0JCSAgICAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICB4Y29mZl9kYXRhIChhYmZkKS0+dG9jID0gc3ltLm5fdmFsdWU7Ci0JICAgIH0KLQotCSAgLyogV2UgbXVzdCBtZXJnZSBUT0MgZW50cmllcyBmb3IgdGhlIHNhbWUgc3ltYm9sLiAgV2UgY2FuCi0JICAgICBtZXJnZSB0d28gVE9DIGVudHJpZXMgaWYgdGhleSBhcmUgYm90aCBDX0hJREVYVCwgdGhleQotCSAgICAgYm90aCBoYXZlIHRoZSBzYW1lIG5hbWUsIHRoZXkgYXJlIGJvdGggNCBieXRlcyBsb25nLCBhbmQKLQkgICAgIHRoZXkgYm90aCBoYXZlIGEgcmVsb2NhdGlvbiB0YWJsZSBlbnRyeSBmb3IgYW4gZXh0ZXJuYWwKLQkgICAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCi0JICAgICB0aGF0IHdlIG11c3QgbG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucy4gIEljay4gICovCi0JICBpZiAoYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDCi0JICAgICAgJiYgc3ltLm5fc2NsYXNzID09IENfSElERVhUCi0JICAgICAgJiYgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9PSA0Ci0JICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHJlbGluZHg7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0KLQkgICAgICBlbmNsb3NpbmcgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBpZiAoZW5jbG9zaW5nID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgcmVsb2NzID0gcmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ucmVsb2NzOwotCSAgICAgIHJlbGluZHggPSB4Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGVuY2xvc2luZy0+cmVsb2NfY291bnQsCi0JCQkJCSAgc3ltLm5fdmFsdWUpOwotCSAgICAgIHJlbCA9IHJlbG9jcyArIHJlbGluZHg7Ci0JICAgICAgaWYgKHJlbGluZHggPCBlbmNsb3NpbmctPnJlbG9jX2NvdW50Ci0JCSAgJiYgcmVsLT5yX3ZhZGRyID09IChiZmRfdm1hKSBzeW0ubl92YWx1ZQotCQkgICYmIHJlbC0+cl9zaXplID09IDMxCi0JCSAgJiYgcmVsLT5yX3R5cGUgPT0gUl9QT1MpCi0JCXsKLQkJICBiZmRfYnl0ZSAqZXJlbHN5bTsKLQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHJlbHN5bTsKLQotCQkgIGVyZWxzeW0gPSAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkgICAgICsgcmVsLT5yX3N5bW5keCAqIHN5bWVzeik7Ci0JCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVyZWxzeW0sIChQVFIpICZyZWxzeW0pOwotCQkgIGlmIChyZWxzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKnJlbG5hbWU7Ci0JCSAgICAgIGNoYXIgcmVsYnVmW1NZTU5NTEVOICsgMV07Ci0JCSAgICAgIGJvb2xlYW4gY29weTsKLQkJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGUgVE9DIGVudHJ5IGlzCi0JCQkgZm9yIGFuIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2wuICAqLwotCQkgICAgICByZWxuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmcmVsc3ltLAotCQkJCQkJCQlyZWxidWYpOwotCQkgICAgICBpZiAocmVsbmFtZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogV2Ugb25seSBtZXJnZSBUT0MgZW50cmllcyBpZiB0aGUgVEMgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGFzIHRoZSBzeW1ib2wgbmFtZS4gIFRoaXMgaGFuZGxlcwotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBub3JtYWwgY2FzZSwgYnV0IG5vdCBjb21tb24gY2FzZXMgbGlrZQotICAgICAgICAgICAgICAgICAgICAgICAgIFNZTS5QNCB3aGljaCBnY2MgZ2VuZXJhdGVzIHRvIHN0b3JlIFNZTSArIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgVE9DLiAgRklYTUUuICAqLwotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCByZWxuYW1lKSA9PSAwKQotCQkJewotCQkJICBjb3B5ID0gKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkJCQkgIHx8IHJlbHN5bS5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0JCQkJICB8fCByZWxzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCk7Ci0JCQkgIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIHJlbG5hbWUsIHRydWUsIGNvcHksCi0JCQkJCQkgICAgICBmYWxzZSk7Ci0JCQkgIGlmIChoID09IE5VTEwpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgLyogQXQgdGhpcyBwb2ludCBoLT5yb290LnR5cGUgY291bGQgYmUKLQkJCSAgICAgYmZkX2xpbmtfaGFzaF9uZXcuICBUaGF0IHNob3VsZCBiZSBPSywKLQkJCSAgICAgc2luY2Ugd2Uga25vdyBmb3Igc3VyZSB0aGF0IHdlIHdpbGwgY29tZQotCQkJICAgICBhY3Jvc3MgdGhpcyBzeW1ib2wgYXMgd2Ugc3RlcCB0aHJvdWdoIHRoZQotCQkJICAgICBmaWxlLiAgKi8KLQotCQkJICAvKiBXZSBzdG9yZSBoIGluICpzeW1faGFzaCBmb3IgdGhlCi0JCQkgICAgIGNvbnZlbmllbmNlIG9mIHRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JCQkgICAgIGZ1bmN0aW9uLiAgKi8KLQkJCSAgKnN5bV9oYXNoID0gaDsKLQotCQkJICBpZiAoaC0+dG9jX3NlY3Rpb24gIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBhc2VjdGlvbiAqKnJlbF9jc2VjdHM7Ci0KLQkJCSAgICAgIC8qIFdlIGFscmVhZHkgaGF2ZSBhIFRPQyBlbnRyeSBmb3IgdGhpcwotCQkJCSBzeW1ib2wsIHNvIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGlzCi0JCQkJIG9uZS4gICovCi0JCQkgICAgICByZWxfY3NlY3RzID0KLQkJCQlyZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5jc2VjdHM7Ci0JCQkgICAgICByZWxfY3NlY3RzW3JlbGluZHhdID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQotCQkJICAvKiBXZSBhcmUgYWJvdXQgdG8gY3JlYXRlIGEgVE9DIGVudHJ5IGZvcgotCQkJICAgICB0aGlzIHN5bWJvbC4gICovCi0JCQkgIHNldF90b2MgPSBoOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgc2VjdGlvbi4gIFdlIGdldCB0aGUgbmFtZSBmcm9tCi0JICAgICB0aGUgY3NlY3Qgc3RvcmFnZSBtYXBwaW5nIGNsYXNzLCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0JICAgICBhY2N1bXVsYXRlIHNpbWlsYXIgY3NlY3RzIHRvZ2V0aGVyLiAgKi8KLQkgIHsKLQkgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNzZWN0X25hbWVfYnlfY2xhc3NbXSA9Ci0JICAgICAgewotCQkiLnByIiwgIi5ybyIsICIuZGIiLCAiLnRjIiwgIi51YSIsICIucnciLCAiLmdsIiwgIi54byIsCi0JCSIuc3YiLCAiLmJzIiwgIi5kcyIsICIudWMiLCAiLnRpIiwgIi50YiIsIE5VTEwsICIudGMwIiwKLQkJIi50ZCIKLQkgICAgICB9OwotCSAgICBjb25zdCBjaGFyICpjc2VjdF9uYW1lOwotCSAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotCi0JICAgIGlmICgoYXV4LnhfY3NlY3QueF9zbWNsYXMgPj0KLQkJIHNpemVvZiBjc2VjdF9uYW1lX2J5X2NsYXNzIC8gc2l6ZW9mIGNzZWN0X25hbWVfYnlfY2xhc3NbMF0pCi0JCXx8IGNzZWN0X25hbWVfYnlfY2xhc3NbYXV4LnhfY3NlY3QueF9zbWNsYXNdID09IE5VTEwpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IHN5bWJvbCBgJXMnIGhhcyB1bnJlY29nbml6ZWQgc21jbGFzICVkIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBhdXgueF9jc2VjdC54X3NtY2xhcyk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgY3NlY3RfbmFtZSA9IGNzZWN0X25hbWVfYnlfY2xhc3NbYXV4LnhfY3NlY3QueF9zbWNsYXNdOwotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBjc2VjdF9uYW1lKTsKLQkgICAgaWYgKGNzZWN0ID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGVuY2xvc2luZyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICBpZiAoZW5jbG9zaW5nID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAoZW5jbG9zaW5nKQotCQkmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDwgZW5jbG9zaW5nLT52bWEKLQkJICAgIHx8ICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgKyBhdXgueF9jc2VjdC54X3Njbmxlbi5sCi0JCQk+IGVuY2xvc2luZy0+dm1hICsgZW5jbG9zaW5nLT5fcmF3X3NpemUpKSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogY3NlY3QgYCVzJyBub3QgaW4gZW5jbG9zaW5nIHNlY3Rpb24iKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgfQotCSAgICBjc2VjdC0+dm1hID0gc3ltLm5fdmFsdWU7Ci0JICAgIGNzZWN0LT5maWxlcG9zID0gKGVuY2xvc2luZy0+ZmlsZXBvcwotCQkJICAgICAgKyBzeW0ubl92YWx1ZQotCQkJICAgICAgLSBlbmNsb3NpbmctPnZtYSk7Ci0JICAgIGNzZWN0LT5fcmF3X3NpemUgPSBhdXgueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gU01UWVBfQUxJR04gKGF1eC54X2NzZWN0Lnhfc210eXApOwotCi0JICAgIC8qIFJlY29yZCB0aGUgZW5jbG9zaW5nIHNlY3Rpb24gaW4gdGhlIHRkYXRhIGZvciB0aGlzIG5ldwotCSAgICAgICBzZWN0aW9uLiAgKi8KLQkgICAgY3NlY3QtPnVzZWRfYnlfYmZkID0KLQkgICAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgICAgaWYgKGNzZWN0LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9Ci0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmVuY2xvc2luZyA9IGVuY2xvc2luZzsKLQkgICAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmxpbmVub19jb3VudCA9Ci0JICAgICAgZW5jbG9zaW5nLT5saW5lbm9fY291bnQ7Ci0KLQkgICAgaWYgKGVuY2xvc2luZy0+b3duZXIgPT0gYWJmZCkKLQkgICAgICB7Ci0JCXN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotCQliZmRfc2l6ZV90eXBlIHJlbGluZHg7Ci0JCXN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotCQlhc2VjdGlvbiAqKnJlbF9jc2VjdDsKLQotCQlyZWxvY3MgPSByZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JCXJlbGluZHggPSB4Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGVuY2xvc2luZy0+cmVsb2NfY291bnQsCi0JCQkJCSAgICBjc2VjdC0+dm1hKTsKLQkJcmVsID0gcmVsb2NzICsgcmVsaW5keDsKLQkJcmVsX2NzZWN0ID0gKHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmNzZWN0cwotCQkJICAgICArIHJlbGluZHgpOwotCQljc2VjdC0+cmVsX2ZpbGVwb3MgPSAoZW5jbG9zaW5nLT5yZWxfZmlsZXBvcwotCQkJCSAgICAgICsgcmVsaW5keCAqIGJmZF9jb2ZmX3JlbHN6IChhYmZkKSk7Ci0JCXdoaWxlIChyZWxpbmR4IDwgZW5jbG9zaW5nLT5yZWxvY19jb3VudAotCQkgICAgICAgJiYgKnJlbF9jc2VjdCA9PSBOVUxMCi0JCSAgICAgICAmJiByZWwtPnJfdmFkZHIgPCBjc2VjdC0+dm1hICsgY3NlY3QtPl9yYXdfc2l6ZSkKLQkJICB7Ci0JCSAgICAqcmVsX2NzZWN0ID0gY3NlY3Q7Ci0JCSAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCQkgICAgKytjc2VjdC0+cmVsb2NfY291bnQ7Ci0JCSAgICArK3JlbGluZHg7Ci0JCSAgICArK3JlbDsKLQkJICAgICsrcmVsX2NzZWN0OwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIGZpZWxkcyBhbmQgc2VjdGlvbiBmbGFncwotCSAgICAgICB3aGljaCB3ZSBkbyBub3QgYm90aGVyIHRvIHNldC4gICovCi0KLQkgICAgY3NlY3RfaW5kZXggPSAoKGVzeW0KLQkJCSAgICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAgIC8gc3ltZXN6KTsKLQotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+Zmlyc3Rfc3ltbmR4ID0gY3NlY3RfaW5kZXg7Ci0KLQkgICAgaWYgKGZpcnN0X2NzZWN0ID09IE5VTEwpCi0JICAgICAgZmlyc3RfY3NlY3QgPSBjc2VjdDsKLQotCSAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBDX0VYVCwgd2UgdHJlYXQgaXQgYXMgc3RhcnRpbmcgYXQgdGhlCi0JICAgICAgIGJlZ2lubmluZyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBzZWN0aW9uLiAgKi8KLQkgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgICB7Ci0JCXNlY3Rpb24gPSBjc2VjdDsKLQkJdmFsdWUgPSAwOwotCSAgICAgIH0KLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgVE9DIHNlY3Rpb24gZm9yIGEgc3ltYm9sLCByZWNvcmQgaXQuICAqLwotCSAgICBpZiAoc2V0X3RvYyAhPSBOVUxMKQotCSAgICAgIHNldF90b2MtPnRvY19zZWN0aW9uID0gY3NlY3Q7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX0xEOgotCSAgLyogVGhpcyBpcyBhIGxhYmVsIGRlZmluaXRpb24uICBUaGUgeF9zY25sZW4gZmllbGQgaXMgdGhlCi0gICAgICAgICAgICAgc3ltYm9sIGluZGV4IG9mIHRoZSBjc2VjdC4gIEkgYmVsaWV2ZSB0aGF0IHRoaXMgbXVzdAotICAgICAgICAgICAgIGFsd2F5cyBmb2xsb3cgdGhlIGFwcHJvcHJpYXRlIFhUWV9TRCBzeW1ib2wsIHNvIEkgd2lsbAotICAgICAgICAgICAgIGluc2lzdCBvbiBpdC4gICovCi0JICB7Ci0JICAgIGJvb2xlYW4gYmFkOwotCi0JICAgIGJhZCA9IGZhbHNlOwotCSAgICBpZiAoYXV4LnhfY3NlY3QueF9zY25sZW4ubCA8IDAKLQkJfHwgKGF1eC54X2NzZWN0Lnhfc2NubGVuLmwKLQkJICAgID49IGVzeW0gLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpKQotCSAgICAgIGJhZCA9IHRydWU7Ci0JICAgIGlmICghIGJhZCkKLQkgICAgICB7Ci0JCXNlY3Rpb24gPSB4Y29mZl9kYXRhIChhYmZkKS0+Y3NlY3RzW2F1eC54X2NzZWN0Lnhfc2NubGVuLmxdOwotCQlpZiAoc2VjdGlvbiA9PSBOVUxMCi0JCSAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotCQkgIGJhZCA9IHRydWU7Ci0JICAgICAgfQotCSAgICBpZiAoYmFkKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBtaXNwbGFjZWQgWFRZX0xEIGAlcyciKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgfQotCi0JICAgIHZhbHVlID0gc3ltLm5fdmFsdWUgLSBjc2VjdC0+dm1hOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFhUWV9DTToKLQkgIC8qIFRoaXMgaXMgYW4gdW5pdGlhbGl6ZWQgY3NlY3QuICBXZSBjb3VsZCBiYXNlIHRoZSBuYW1lIG9uCi0gICAgICAgICAgICAgdGhlIHN0b3JhZ2UgbWFwcGluZyBjbGFzcywgYnV0IHdlIGRvbid0IGJvdGhlciBleGNlcHQgZm9yCi0gICAgICAgICAgICAgYW4gWE1DX1REIHN5bWJvbC4gIElmIHRoaXMgY3NlY3QgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLAotICAgICAgICAgICAgIGl0IGlzIGEgY29tbW9uIHN5bWJvbC4gIFdlIHB1dCBYTUNfVEQgc3ltYm9scyBpbiBzZWN0aW9ucwotICAgICAgICAgICAgIG5hbWVkIC50b2Nic3MsIGFuZCByZWx5IG9uIHRoZSBsaW5rZXIgc2NyaXB0IHRvIHB1dCB0aGF0Ci0gICAgICAgICAgICAgaW4gdGhlIFRPQyBhcmVhLiAgKi8KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgfQotCi0JICBpZiAoYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1REKQotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnRvY2JzcyIpOwotCSAgZWxzZQotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmJzcyIpOwotCSAgaWYgKGNzZWN0ID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgY3NlY3QtPnZtYSA9IHN5bS5uX3ZhbHVlOwotCSAgY3NlY3QtPl9yYXdfc2l6ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgY3NlY3QtPmFsaWdubWVudF9wb3dlciA9IFNNVFlQX0FMSUdOIChhdXgueF9jc2VjdC54X3NtdHlwKTsKLQkgIC8qIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciBmaWVsZHMgYW5kIHNlY3Rpb24gZmxhZ3MKLQkgICAgIHdoaWNoIHdlIGRvIG5vdCBib3RoZXIgdG8gc2V0LiAgKi8KLQotCSAgY3NlY3RfaW5kZXggPSAoKGVzeW0KLQkJCSAgLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpCi0JCQkgLyBzeW1lc3opOwotCi0JICBjc2VjdC0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjc2VjdC0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9Ci0JICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5maXJzdF9zeW1uZHggPSBjc2VjdF9pbmRleDsKLQotCSAgaWYgKGZpcnN0X2NzZWN0ID09IE5VTEwpCi0JICAgIGZpcnN0X2NzZWN0ID0gY3NlY3Q7Ci0KLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JICAgIHsKLQkgICAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBjc2VjdC0+X3Jhd19zaXplID0gMDsKLQkgICAgICBzZWN0aW9uID0gY3NlY3Q7Ci0JICAgICAgdmFsdWUgPSBhdXgueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIG1hZ2ljIHN5bWJvbCBuYW1lcy4gICovCi0gICAgICBpZiAoKHNtdHlwID09IFhUWV9TRCB8fCBzbXR5cCA9PSBYVFlfQ00pCi0JICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyAhPSBYTUNfVEMKLQkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19URCkKLQl7Ci0JICBpbnQgaTsKLQotCSAgaSA9IC0xOwotCSAgaWYgKG5hbWVbMF0gPT0gJ18nKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIl90ZXh0IikgPT0gMCkKLQkJaSA9IDA7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2V0ZXh0IikgPT0gMCkKLQkJaSA9IDE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2RhdGEiKSA9PSAwKQotCQlpID0gMjsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZWRhdGEiKSA9PSAwKQotCQlpID0gMzsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZW5kIikgPT0gMCkKLQkJaSA9IDQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ2UnICYmIHN0cmNtcCAobmFtZSwgImVuZCIpID09IDApCi0JICAgIGkgPSA1OwotCi0JICBpZiAoaSAhPSAtMSkKLQkgICAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNwZWNpYWxfc2VjdGlvbnNbaV0gPSBjc2VjdDsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhZGQgdGhlIHN5bWJvbCB0byB0aGUKLSAgICAgICAgIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQl7Ci0JICBib29sZWFuIGNvcHk7Ci0KLQkgIEJGRF9BU1NFUlQgKHNlY3Rpb24gIT0gTlVMTCk7Ci0KLQkgIC8qIFdlIG11c3QgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeSBpZiB3ZSBnb3QgaXQgZnJvbSB0aGUKLSAgICAgICAgICAgICBzeW1lbnQgaXRzZWxmLCByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGNvcHkgPSBkZWZhdWx0X2NvcHk7Ci0JICBpZiAoc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkgICAgICB8fCBzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgY29weSA9IHRydWU7Ci0KLQkgIC8qIFRoZSBBSVggbGlua2VyIGFwcGVhcnMgdG8gb25seSBkZXRlY3QgbXVsdGlwbGUgc3ltYm9sCi0JICAgICBkZWZpbml0aW9ucyB3aGVuIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2wuICBJZgotCSAgICAgYSBzeW1ib2wgaXMgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcywgYW5kIHRoZSBvbmx5Ci0JICAgICByZWZlcmVuY2VzIGFyZSBmcm9tIHRoZSBzYW1lIG9iamVjdCBmaWxlLCB0aGUgQUlYIGxpbmtlcgotCSAgICAgYXBwZWFycyB0byBwZXJtaXQgaXQuICBJdCBkb2VzIG5vdCBtZXJnZSB0aGUgZGlmZmVyZW50Ci0JICAgICBkZWZpbml0aW9ucywgYnV0IGhhbmRsZXMgdGhlbSBpbmRlcGVuZGVudGx5LiAgT24gdGhlCi0JICAgICBvdGhlciBoYW5kLCBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSwgdGhlIGxpbmtlciByZXBvcnRzCi0JICAgICBhbiBlcnJvci4KLQotCSAgICAgVGhpcyBtYXR0ZXJzIGJlY2F1c2UgdGhlIEFJWCA8bmV0L25ldF9nbG9iYWxzLmg+IGhlYWRlcgotCSAgICAgZmlsZSBhY3R1YWxseSBkZWZpbmVzIGFuIGluaXRpYWxpemVkIGFycmF5LCBzbyB3ZSBoYXZlIHRvCi0JICAgICBhY3R1YWxseSBwZXJtaXQgdGhhdCB0byB3b3JrLgotCi0JICAgICBKdXN0IHRvIG1ha2UgbWF0dGVycyBldmVuIG1vcmUgY29uZnVzaW5nLCB0aGUgQUlYIGxpbmtlcgotCSAgICAgYXBwZWFycyB0byBwZXJtaXQgbXVsdGlwbGUgc3ltYm9sIGRlZmluaXRpb25zIHdoZW5ldmVyCi0JICAgICB0aGUgc2Vjb25kIGRlZmluaXRpb24gaXMgaW4gYW4gYXJjaGl2ZSByYXRoZXIgdGhhbiBhbgotCSAgICAgb2JqZWN0IGZpbGUuICBUaGlzIG1heSBiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSBtYW5uZXIgaW4KLQkgICAgIHdoaWNoIGl0IGhhbmRsZXMgYXJjaGl2ZXM6IEkgdGhpbmsgaXQgbWF5IGxvYWQgdGhlIGVudGlyZQotCSAgICAgYXJjaGl2ZSBpbiBhcyBzZXBhcmF0ZSBjc2VjdHMsIGFuZCB0aGVuIGxldCBnYXJiYWdlCi0JICAgICBjb2xsZWN0aW9uIGRpc2NhcmQgc3ltYm9scy4KLQotCSAgICAgV2UgYWxzbyBoYXZlIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBzdGF0aWNhbGx5IGxpbmtpbmcgYQotCSAgICAgc2hhcmVkIG9iamVjdCwgd2hpY2ggd2lsbCBjYXVzZSBzeW1ib2wgcmVkZWZpbml0aW9ucywKLQkgICAgIGFsdGhvdWdoIHRoaXMgaXMgYW4gZWFzaWVyIGNhc2UgdG8gZGV0ZWN0LiAgKi8KLQotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0JCSpzeW1faGFzaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLQkgICAgICBlbHNlCi0JCSpzeW1faGFzaCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLAotCQkJCQkJCSAgIHRydWUsIGNvcHksIGZhbHNlKSk7Ci0JICAgICAgaWYgKCpzeW1faGFzaCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQotCQkgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSBzZWNvbmQgZGVmaW5pdGlvbiBvZiBhIGRlZmluZWQgc3ltYm9sLiAgKi8KLQkJICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoKCpzeW1faGFzaCktPnNtY2xhcyAhPSBYTUNfR0wKLQkJCSAgfHwgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX0dMCi0JCQkgIHx8ICgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAgICAgICYgRFlOQU1JQykgPT0gMCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBuZXcgc3ltYm9sIGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRoZSBleGlzdGluZyBzeW1ib2wgaXMgbm90IGdsb2JhbAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UgY29kZSBvciB0aGlzIHN5bWJvbCBpcyBnbG9iYWwgbGlua2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuICBJZiB0aGUgZXhpc3Rpbmcgc3ltYm9sIGlzIGdsb2JhbAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UgY29kZSBhbmQgdGhlIG5ldyBzeW1ib2wgaXMgbm90LCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2Ugd2FudCB0byB1c2UgdGhlIG5ldyBzeW1ib2wuICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAgICAmIERZTkFNSUMpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBleGlzdGluZyBzeW1ib2wgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgaXQuICAqLwotCQkgICAgICAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnUudW5kZWYuYWJmZCA9Ci0JCQkoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSByZWRlZmluaXRpb24gaW4gYW4gb2JqZWN0IGNvbnRhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuIGFyY2hpdmUuICBKdXN0IGlnbm9yZSBpdC4gIFNlZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50IGFib3ZlLiAgKi8KLQkJICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIHZhbHVlID0gMDsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgoKnN5bV9oYXNoKS0+cm9vdC5uZXh0ICE9IE5VTEwKLQkJCSAgIHx8IGluZm8tPmhhc2gtPnVuZGVmc190YWlsID09ICYoKnN5bV9oYXNoKS0+cm9vdCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZC4gIEluIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlLCB3ZSBqdXN0IGNvbnRpbnVlIGFuZCBwZXJtaXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIFNlZSB0aGUgY29tbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGFib3V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFJWCBsaW5rZXIuICAqLwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgqc3ltX2hhc2gpLT5zbWNsYXMgPT0gYXV4LnhfY3NlY3QueF9zbWNsYXMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBzeW1ib2xzIGFyZSBib3RoIGNzZWN0cyBvZiB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiAgVGhlcmUgaXMgYXQgbGVhc3QgYSBjaGFuY2UgdGhhdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXMgYSBzZW1pLWxlZ2l0aW1hdGUgcmVkZWZpbml0aW9uLiAgKi8KLQkJICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIHZhbHVlID0gMDsKLQkJICAgICAgKCpzeW1faGFzaCktPmZsYWdzIHw9IFhDT0ZGX01VTFRJUExZX0RFRklORUQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoKCpzeW1faGFzaCktPmZsYWdzICYgWENPRkZfTVVMVElQTFlfREVGSU5FRCkgIT0gMAotCQkgICAgICAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgICAgICYmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCQkgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbC4KLQkJICAgICBSZXBvcnQgdGhlIGVycm9yIG5vdy4gIFNlZSB0aGUgY29tbWVudCBhYm92ZQotCQkgICAgIGFib3V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFJWCBsaW5rZXIuICBXZSBjb3VsZAotCQkgICAgIGFsc28gZG8gdGhpcyB3aXRoIHdhcm5pbmcgc3ltYm9scywgYnV0IEknbSBub3QKLQkJICAgICBzdXJlIHRoZSBYQ09GRiBsaW5rZXIgaXMgd2hvbGx5IHByZXBhcmVkIHRvCi0JCSAgICAgaGFuZGxlIHRoZW0sIGFuZCB0aGF0IHdvdWxkIG9ubHkgYmUgYSB3YXJuaW5nLAotCQkgICAgIG5vdCBhbiBlcnJvci4gICovCi0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQotCQkJIChpbmZvLCAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgMCwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24sCi0JCQkgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAvKiBUcnkgbm90IHRvIGdpdmUgdGhpcyBlcnJvciB0b28gbWFueSB0aW1lcy4gICovCi0JCSAgKCpzeW1faGFzaCktPmZsYWdzICY9IH5YQ09GRl9NVUxUSVBMWV9ERUZJTkVEOwotCQl9Ci0JICAgIH0KLQotCSAgLyogX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgbWF5IGNhbGwgdGhlIGxpbmtlciB0bwotCSAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIHRoZSBsaW5rZXIgbWF5IHRyeSB0byByZWFkCi0JICAgICB0aGUgc3ltYm9sIHRhYmxlIHRvIGdpdmUgYSBnb29kIGVycm9yLiAgUmlnaHQgbm93LCB0aGUKLQkgICAgIGxpbmUgbnVtYmVycyBhcmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzaW5jZSB0aGV5IGFyZQotCSAgICAgY291bnRlZCBib3RoIGluIHRoZSByZWFsIHNlY3Rpb25zIGFuZCBpbiB0aGUgbmV3IGNzZWN0cy4KLQkgICAgIFdlIG5lZWQgdG8gbGVhdmUgdGhlIGNvdW50IGluIHRoZSByZWFsIHNlY3Rpb25zIHNvIHRoYXQKLQkgICAgIHRoZSBsaW5rZXIgY2FuIHJlcG9ydCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGVycm9yCi0JICAgICBjb3JyZWN0bHksIHNvIHRlbXBvcmFyaWx5IGNsb2JiZXIgdGhlIGxpbmsgdG8gdGhlIGNzZWN0cwotCSAgICAgc28gdGhhdCB0aGUgbGlua2VyIHdpbGwgbm90IHRyeSB0byByZWFkIHRoZSBsaW5lIG51bWJlcnMKLQkgICAgIGEgc2Vjb25kIHRpbWUgZnJvbSB0aGUgY3NlY3RzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGxhc3RfcmVhbC0+bmV4dCA9PSBmaXJzdF9jc2VjdCk7Ci0JICBsYXN0X3JlYWwtPm5leHQgPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkgIChjb25zdCBjaGFyICopIE5VTEwsIGNvcHksIHRydWUsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGxhc3RfcmVhbC0+bmV4dCA9IGZpcnN0X2NzZWN0OwotCi0JICBpZiAoc210eXAgPT0gWFRZX0NNKQotCSAgICB7Ci0JICAgICAgaWYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkJICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+c2VjdGlvbiAhPSBjc2VjdCkKLQkJewotCQkgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGNvbW1vbiBjc2VjdCB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotCQkgIGNzZWN0LT5fcmF3X3NpemUgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCQkgICAgID0gY3NlY3QtPmFsaWdubWVudF9wb3dlcjsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBpbnQgZmxhZzsKLQotCSAgICAgIGlmIChzbXR5cCA9PSBYVFlfRVIgfHwgc210eXAgPT0gWFRZX0NNKQotCQlmbGFnID0gWENPRkZfUkVGX1JFR1VMQVI7Ci0JICAgICAgZWxzZQotCQlmbGFnID0gWENPRkZfREVGX1JFR1VMQVI7Ci0JICAgICAgKCpzeW1faGFzaCktPmZsYWdzIHw9IGZsYWc7Ci0KLQkgICAgICBpZiAoKCpzeW1faGFzaCktPnNtY2xhcyA9PSBYTUNfVUEKLQkJICB8fCBmbGFnID09IFhDT0ZGX0RFRl9SRUdVTEFSKQotCQkoKnN5bV9oYXNoKS0+c21jbGFzID0gYXV4LnhfY3NlY3QueF9zbWNsYXM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgICpjc2VjdF9jYWNoZSA9IGNzZWN0OwotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICAgIHN5bV9oYXNoICs9IHN5bS5uX251bWF1eCArIDE7Ci0gICAgICBjc2VjdF9jYWNoZSArPSBzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChsYXN0X3JlYWwgPT0gTlVMTCB8fCBsYXN0X3JlYWwtPm5leHQgPT0gZmlyc3RfY3NlY3QpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgc2VlbiBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IGZpcnN0X2NzZWN0OyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBSZXNldCB0aGUgc2VjdGlvbiBzaXplIGFuZCB0aGUgbGluZSBudW1iZXIgY291bnQsIHNpbmNlIHRoZQotCSBkYXRhIGlzIG5vdyBhdHRhY2hlZCB0byB0aGUgY3NlY3RzLiAgRG9uJ3QgcmVzZXQgdGhlIHNpemUgb2YKLQkgdGhlIC5kZWJ1ZyBzZWN0aW9uLCBzaW5jZSB3ZSBuZWVkIHRvIHJlYWQgaXQgYmVsb3cgaW4KLQkgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucy4gICovCi0gICAgICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksICIuZGVidWciKSAhPSAwKQotCW8tPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgaTsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotCSAgYXNlY3Rpb24gKipyZWxfY3NlY3Q7Ci0KLQkgIHJlbCA9IHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICByZWxfY3NlY3QgPSByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzOwotCSAgZm9yIChpID0gMDsgaSA8IG8tPnJlbG9jX2NvdW50OyBpKyssIHJlbCsrLCByZWxfY3NlY3QrKykKLQkgICAgewotCSAgICAgIGlmICgqcmVsX2NzZWN0ID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogcmVsb2MgJXM6JWQgbm90IGluIGNzZWN0IiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUsIGkpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBXZSBpZGVudGlmeSBhbGwgc3ltYm9scyB3aGljaCBhcmUgY2FsbGVkLCBzbyB0aGF0IHdlCi0JCSBjYW4gY3JlYXRlIGdsdWUgY29kZSBmb3IgY2FsbHMgdG8gZnVuY3Rpb25zIGltcG9ydGVkCi0JCSBmcm9tIGR5bmFtaWMgb2JqZWN0cy4gICovCi0JICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYwotCQkgICYmICpyZWxfY3NlY3QgIT0gYmZkX3VuZF9zZWN0aW9uX3B0cgotCQkgICYmIChyZWwtPnJfdHlwZSA9PSBSX0JSCi0JCSAgICAgIHx8IHJlbC0+cl90eXBlID09IFJfUkJSKQotCQkgICYmIG9ial94Y29mZl9zeW1faGFzaGVzIChhYmZkKVtyZWwtPnJfc3ltbmR4XSAhPSBOVUxMKQotCQl7Ci0JCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoYWJmZClbcmVsLT5yX3N5bW5keF07Ci0JCSAgaC0+ZmxhZ3MgfD0gWENPRkZfQ0FMTEVEOwotCQkgIC8qIElmIHRoZSBzeW1ib2wgbmFtZSBzdGFydHMgd2l0aCBhIHBlcmlvZCwgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBjb2RlIG9mIGEgZnVuY3Rpb24uICBJZiB0aGUgc3ltYm9sIGlzCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgdW5kZWZpbmVkLCB0aGVuIGFkZCBhbiB1bmRlZmluZWQgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBUaGlzIHNob3VsZCBkbyBubwotICAgICAgICAgICAgICAgICAgICAgaGFybSwgYmVjYXVzZSBhbnkgcmVndWxhciBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGFsc28gZGVmaW5lIHRoZSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci4gIEl0IGhlbHBzLCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAgICAgIHdpbGwgaWRlbnRpZnkgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3Igd2l0aCBhCi0gICAgICAgICAgICAgICAgICAgICBkeW5hbWljIG9iamVjdCBpZiBhIGR5bmFtaWMgb2JqZWN0IGRlZmluZXMgaXQuICAqLwotCQkgIGlmIChoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotCQkgICAgICAmJiBoLT5kZXNjcmlwdG9yID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotCQkgICAgICBoZHMgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICBoLT5yb290LnJvb3Quc3RyaW5nICsgMSwKLQkJCQkJCSAgICB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCSAgICAgIGlmIChoZHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JCQl7Ci0JCQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkJCSAoaW5mbywgYWJmZCwgaGRzLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgKGZsYWd3b3JkKSAwLCBiZmRfdW5kX3NlY3Rpb25fcHRyLAotCQkJCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkJCSAgdHJ1ZSwKLQkJCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmhkcykpKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQkgICAgICBoZHMtPmZsYWdzIHw9IFhDT0ZGX0RFU0NSSVBUT1I7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKChoZHMtPmZsYWdzICYgWENPRkZfQ0FMTEVEKSA9PSAwCi0JCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSA9PSAwKTsKLQkJICAgICAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkJICAgICAgaC0+ZGVzY3JpcHRvciA9IGhkczsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyA9IE5VTEw7Ci0KLQkgIC8qIFJlc2V0IFNFQ19SRUxPQyBhbmQgdGhlIHJlbG9jX2NvdW50LCBzaW5jZSB0aGUgcmVsb2MKLQkgICAgIGluZm9ybWF0aW9uIGlzIG5vdyBhdHRhY2hlZCB0byB0aGUgY3NlY3RzLiAgKi8KLQkgIG8tPmZsYWdzICY9fiBTRUNfUkVMT0M7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0KLQkgIC8qIElmIHdlIGFyZSBub3Qga2VlcGluZyBtZW1vcnksIGZyZWUgdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5Ci0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPnJlbG9jcyAhPSBOVUxMCi0JICAgICAgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmtlZXBfcmVsb2NzKQotCSAgICB7Ci0JICAgICAgZnJlZSAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5yZWxvY3MpOwotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRnJlZSB1cCB0aGUgbGluZSBudW1iZXJzLiAgRklYTUU6IFdlIGNvdWxkIGNhY2hlIHRoZXNlCi0gICAgICAgICBzb21ld2hlcmUgZm9yIHRoZSBmaW5hbCBsaW5rLCB0byBhdm9pZCByZWFkaW5nIHRoZW0gYWdhaW4uICAqLwotICAgICAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zICE9IE5VTEwpCi0JewotCSAgZnJlZSAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocmVsb2NfaW5mbyk7Ci0KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzKTsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyk7Ci0JfQotICAgIGZyZWUgKHJlbG9jX2luZm8pOwotICAgIH0KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jdW5kZWYgTl9UTUFTSwotI3VuZGVmIE5fQlRTSEZUCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgc3ltYm9scyBmcm9tIGEgZHluYW1pYyBvYmplY3QgdG8gdGhlCi0gICBnbG9iYWwgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpidWY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICplbHN5bSwgKmVsc3ltZW5kOwotICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKm47Ci0gIGNvbnN0IGNoYXIgKmJuYW1lOwotICBjb25zdCBjaGFyICptbmFtZTsKLSAgY29uc3QgY2hhciAqczsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqKnBwOwotCi0gIC8qIFdlIGNhbiBvbmx5IGhhbmRsZSBhIGR5bmFtaWMgb2JqZWN0IGlmIHdlIGFyZSBnZW5lcmF0aW5nIGFuIFhDT0ZGCi0gICAgIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IFhDT0ZGIHNoYXJlZCBvYmplY3Qgd2hlbiBub3QgcHJvZHVjaW5nIFhDT0ZGIG91dHB1dCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3ltYm9scyB3ZSB1c2UgZnJvbSBhIGR5bmFtaWMgb2JqZWN0IGFyZSBub3QgdGhlIHN5bWJvbHMgaW4KLSAgICAgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUsIGJ1dCwgcmF0aGVyLCB0aGUgc3ltYm9scyBpbiB0aGUgZXhwb3J0Ci0gICAgIHRhYmxlLiAgSWYgdGhlcmUgaXMgYSBnbG9iYWwgc3ltYm9sIGluIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggaXMKLSAgICAgbm90IGluIHRoZSBleHBvcnQgdGFibGUsIHRoZSBsb2FkZXIgd2lsbCBub3QgYmUgYWJsZSB0byBmaW5kIGl0LAotICAgICBzbyB3ZSBkb24ndCB3YW50IHRvIGZpbmQgaXQgZWl0aGVyLiAgQWxzbywgb24gQUlYIDQuMS4zLCBzaHIubyBpbgotICAgICBsaWJjLmEgaGFzIHN5bWJvbHMgaW4gdGhlIGV4cG9ydCB0YWJsZSB3aGljaCBhcmUgbm90IGluIHRoZQotICAgICBzeW1ib2wgdGFibGUuICAqLwotCi0gIC8qIFJlYWQgaW4gdGhlIC5sb2FkZXIgc2VjdGlvbi4gIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IHVzZSB0aGUKLSAgICAgb19zbmxvYWRlciBmaWVsZCBpbiB0aGUgYS5vdXQgaGVhZGVyLCByYXRoZXIgdGhhbiBncmFiYmluZyB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lLiAgKi8KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogZHluYW1pYyBvYmplY3Qgd2l0aCBubyAubG9hZGVyIHNlY3Rpb24iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBidWYgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzOwotCi0gIC8qIFJlbW92ZSB0aGUgc2VjdGlvbnMgZnJvbSB0aGlzIG9iamVjdCwgc28gdGhhdCB0aGV5IGRvIG5vdCBnZXQKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBidWYsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJ1ZiArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChidWYgKyBMREhEUlNaKTsKLSAgZWxzeW1lbmQgPSBlbHN5bSArIGxkaGRyLmxfbnN5bXM7Ci0gIEJGRF9BU1NFUlQgKHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkc3ltKSA9PSBMRFNZTVNaKTsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotICAgICAgY2hhciBuYW1idWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICB4Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBlbHN5bSwgJmxkc3ltKTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBleHBvcnRlZCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICgobGRzeW0ubF9zbXR5cGUgJiBMX0VYUE9SVCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGxkc3ltLl9sLl9sX2wuX2xfemVyb2VzID09IDApCi0JbmFtZSA9IHN0cmluZ3MgKyBsZHN5bS5fbC5fbF9sLl9sX29mZnNldDsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKG5hbWJ1ZiwgbGRzeW0uX2wuX2xfbmFtZSwgU1lNTk1MRU4pOwotCSAgbmFtYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICBuYW1lID0gbmFtYnVmOwotCX0KLQotICAgICAgLyogTm9ybWFsbHkgd2UgY291bGQgbm90IGNhbGwgeGNvZmZfbGlua19oYXNoX2xvb2t1cCBpbiBhbiBhZGQKLQkgc3ltYm9scyByb3V0aW5lLCBzaW5jZSB3ZSBtaWdodCBub3QgYmUgdXNpbmcgYW4gWENPRkYgaGFzaAotCSB0YWJsZS4gIEhvd2V2ZXIsIHdlIHZlcmlmaWVkIGFib3ZlIHRoYXQgd2UgYXJlIHVzaW5nIGFuIFhDT0ZGCi0JIGhhc2ggdGFibGUuICAqLwotCi0gICAgICBoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsCi0JCQkJICB0cnVlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfRFlOQU1JQzsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIGFuZCB0aGUgQkZEIGl0IHdhcyBmb3VuZCBpbiBpcwotCSBub3QgYSBkeW5hbWljIG9iamVjdCwgY2hhbmdlIHRoZSBCRkQgdG8gdGhpcyBkeW5hbWljIG9iamVjdCwKLQkgc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBjb3JyZWN0IGltcG9ydCBmaWxlIElELiAgKi8KLSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgJiYgKGgtPnJvb3QudS51bmRlZi5hYmZkID09IE5VTEwKLQkgICAgICB8fCAoaC0+cm9vdC51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkpCi0JaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCXsKLQkgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCSAgLyogV2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoaXMgdG8gdGhlIHVuZGVmaW5lZCBzeW1ib2wgbGlzdC4gICovCi0JfQotCi0gICAgICBpZiAoaC0+c21jbGFzID09IFhNQ19VQQotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JaC0+c21jbGFzID0gbGRzeW0ubF9zbWNsYXM7Ci0KLSAgICAgIC8qIFVubGVzcyB0aGlzIGlzIGFuIFhNQ19YTyBzeW1ib2wsIHdlIGRvbid0IGJvdGhlciB0byBhY3R1YWxseQotICAgICAgICAgZGVmaW5lIGl0LCBzaW5jZSB3ZSBkb24ndCBoYXZlIGEgc2VjdGlvbiB0byBwdXQgaXQgaW4gYW55aG93LgotICAgICAgICAgSW5zdGVhZCwgdGhlIHJlbG9jYXRpb24gcm91dGluZXMgaGFuZGxlIHRoZSBERUZfRFlOQU1JQyBmbGFnCi0gICAgICAgICBjb3JyZWN0bHkuICAqLwotCi0gICAgICBpZiAoaC0+c21jbGFzID09IFhNQ19YTwotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGFic29sdXRlIHZhbHVlLiAgKi8KLQkgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gbGRzeW0ubF92YWx1ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGRlZmluZXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCB0aGVuIGl0Ci0JIGltcGxpY2l0bHkgZGVmaW5lcyB0aGUgZnVuY3Rpb24gY29kZSBhcyB3ZWxsLiAgKi8KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX0RTCi0JICB8fCAoaC0+c21jbGFzID09IFhNQ19YTyAmJiBuYW1lWzBdICE9ICcuJykpCi0JaC0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwKQotCXsKLQkgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotCSAgaGRzID0gaC0+ZGVzY3JpcHRvcjsKLQkgIGlmIChoZHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNoYXIgKmRzbm07Ci0KLQkgICAgICBkc25tID0gYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDIpOwotCSAgICAgIGlmIChkc25tID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkc25tWzBdID0gJy4nOwotCSAgICAgIHN0cmNweSAoZHNubSArIDEsIG5hbWUpOwotCSAgICAgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBkc25tLAotCQkJCQkgICAgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgICAgZnJlZSAoZHNubSk7Ci0JICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JCXsKLQkJICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCQkgIGhkcy0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCQkgIC8qIFdlIGRvIG5vdCB3YW50IHRvIGFkZCB0aGlzIHRvIHRoZSB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCBsaXN0LiAgKi8KLQkJfQotCi0JICAgICAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkgICAgICBoLT5kZXNjcmlwdG9yID0gaGRzOwotCSAgICB9Ci0KLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVGX0RZTkFNSUM7Ci0JICBpZiAoaGRzLT5zbWNsYXMgPT0gWE1DX1VBKQotCSAgICBoZHMtPnNtY2xhcyA9IFhNQ19QUjsKLQotCSAgLyogQW4gYWJzb2x1dGUgc3ltYm9sIGFwcGVhcnMgdG8gYWN0dWFsbHkgZGVmaW5lIGNvZGUsIG5vdCBhCi0JICAgICBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgVGhpcyBpcyBob3cgc29tZSBtYXRoIGZ1bmN0aW9ucyBhcmUKLQkgICAgIGltcGxlbWVudGVkIG9uIEFJWCA0LjEuICAqLwotCSAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfWE8KLQkgICAgICAmJiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICB8fCBoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0JICAgIHsKLQkgICAgICBoZHMtPnNtY2xhcyA9IFhNQ19YTzsKLQkgICAgICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgICAgICBoZHMtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgaGRzLT5yb290LnUuZGVmLnZhbHVlID0gbGRzeW0ubF92YWx1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMICYmICEgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMpOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFJlY29yZCB0aGlzIGZpbGUgaW4gdGhlIGltcG9ydCBmaWxlcy4gICovCi0KLSAgbiA9ICgoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICopCi0gICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSkpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG4tPm5leHQgPSBOVUxMOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIHBhdGggZW50cnkgaW4gdGhlIGltcG9ydCBmaWxlIGxpc3QgZm9yIGEKLSAgICAgc2hhcmVkIG9iamVjdCBhcHBlYXJzIHRvIGFsd2F5cyBiZSBlbXB0eS4gIFRoZSBmaWxlIG5hbWUgaXMgdGhlCi0gICAgIGJhc2UgbmFtZS4gICovCi0gIG4tPnBhdGggPSAiIjsKLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBibmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgbW5hbWUgPSAiIjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBibmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQtPm15X2FyY2hpdmUpOwotICAgICAgbW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICB9Ci0gIHMgPSBzdHJyY2hyIChibmFtZSwgJy8nKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICBibmFtZSA9IHMgKyAxOwotICBuLT5maWxlID0gYm5hbWU7Ci0gIG4tPm1lbWJlciA9IG1uYW1lOwotCi0gIC8qIFdlIHN0YXJ0IGMgYXQgMSBiZWNhdXNlIHRoZSBmaXJzdCBpbXBvcnQgZmlsZSBudW1iZXIgaXMgcmVzZXJ2ZWQKLSAgICAgZm9yIExJQlBBVEguICAqLwotICBmb3IgKHBwID0gJnhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5pbXBvcnRzLCBjID0gMTsKLSAgICAgICAqcHAgIT0gTlVMTDsKLSAgICAgICBwcCA9ICYoKnBwKS0+bmV4dCwgKytjKQotICAgIDsKLSAgKnBwID0gbjsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+aW1wb3J0X2ZpbGVfaWQgPSBjOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUm91dGluZXMgdGhhdCBhcmUgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuCi0gICBoYW5kbGVkLCBidXQgYmVmb3JlIHRoZSBzZWN0aW9ucyBhcmUgbGFpZCBvdXQgaW4gbWVtb3J5LiAgKi8KLQotLyogTWFyayBhIHN5bWJvbCBhcyBub3QgYmVpbmcgZ2FyYmFnZSwgaW5jbHVkaW5nIHRoZSBzZWN0aW9uIGluIHdoaWNoCi0gICBpdCBpcyBkZWZpbmVkLiAgKi8KLQotc3RhdGljIElOTElORSBib29sZWFuCi14Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX01BUks7Ci0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpoc2VjOwotCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChoc2VjKQotCSAgJiYgKGhzZWMtPmZsYWdzICYgU0VDX01BUkspID09IDApCi0JewotCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgaHNlYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT50b2Nfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiAoaC0+dG9jX3NlY3Rpb24tPmZsYWdzICYgU0VDX01BUkspID09IDApCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgaC0+dG9jX3NlY3Rpb24pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBtYXJrIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEZvciBhIGdpdmVuIHNlY3Rpb24sIG1hcmsKLSAgIGl0LCBhbmQgYWxsIHRoZSBzZWN0aW9ucyB3aGljaCBkZWZpbmUgc3ltYm9scyB0byB3aGljaCBpdCByZWZlcnMuCi0gICBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gbG9vayBhdCB0aGUgcmVsb2NzLCB3ZSBhbHNvIGNvdW50Ci0gICB0aGUgbnVtYmVyIG9mIHJlbG9jcyB3aGljaCBuZWVkIHRvIGJlIGNvcGllZCBpbnRvIHRoZSAubG9hZGVyCi0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX21hcmsgKGluZm8sIHNlYykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX01BUkspICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjLT5mbGFncyB8PSBTRUNfTUFSSzsKLQotICBpZiAoc2VjLT5vd25lci0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqaHAsICoqaHBlbmQ7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwgKnJlbGVuZDsKLQotICAgICAgLyogTWFyayBhbGwgdGhlIHN5bWJvbHMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLQotICAgICAgaHAgPSAob2JqX3hjb2ZmX3N5bV9oYXNoZXMgKHNlYy0+b3duZXIpCi0JICAgICsgeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5maXJzdF9zeW1uZHgpOwotICAgICAgaHBlbmQgPSAob2JqX3hjb2ZmX3N5bV9oYXNoZXMgKHNlYy0+b3duZXIpCi0JICAgICAgICsgeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5sYXN0X3N5bW5keCk7Ci0gICAgICBmb3IgKDsgaHAgPCBocGVuZDsgaHArKykKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKmhwOwotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9uIHJlbG9jcy4gICovCi0KLSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgcmVsID0geGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKHNlYy0+b3duZXIsIHNlYywgdHJ1ZSwKLQkJCQkJICAgIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKLQkJCQkJICAgIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCk7Ci0JICBpZiAocmVsID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbGVuZCA9IHJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0JICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpyc2VjOwotCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpZiAoKHVuc2lnbmVkIGludCkgcmVsLT5yX3N5bW5keAotCQkgID4gb2JqX3Jhd19zeW1lbnRfY291bnQgKHNlYy0+b3duZXIpKQotCQljb250aW51ZTsKLQotCSAgICAgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcilbcmVsLT5yX3N5bW5keF07Ci0JICAgICAgaWYgKGggIT0gTlVMTAotCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0JCXsKLQkJICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHJzZWMgPSB4Y29mZl9kYXRhIChzZWMtPm93bmVyKS0+Y3NlY3RzW3JlbC0+cl9zeW1uZHhdOwotCSAgICAgIGlmIChyc2VjICE9IE5VTEwKLQkJICAmJiAocnNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQkJewotCQkgIGlmICghIHhjb2ZmX21hcmsgKGluZm8sIHJzZWMpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICAvKiBTZWUgaWYgdGhpcyByZWxvYyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgLmxvYWRlcgotICAgICAgICAgICAgICAgICBzZWN0aW9uLiAgKi8KLQkgICAgICBzd2l0Y2ggKHJlbC0+cl90eXBlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCSAgaWYgKGggPT0gTlVMTAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JCSAgICAgIHx8ICgoaC0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpICE9IDAKLQkJCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkJICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotCQkJICAmJiBoLT5kZXNjcmlwdG9yICE9IE5VTEwKLQkJCSAgJiYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JCQkgICAgICB8fCAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwCi0JCQkJICAmJiAoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MKLQkJCQkgICAgICAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCQkgICAgYnJlYWs7Ci0JCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJY2FzZSBSX1BPUzoKLQkJY2FzZSBSX05FRzoKLQkJY2FzZSBSX1JMOgotCQljYXNlIFJfUkxBOgotCQkgICsreGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkcmVsX2NvdW50OwotCQkgIGlmIChoICE9IE5VTEwpCi0JCSAgICBoLT5mbGFncyB8PSBYQ09GRl9MRFJFTDsKLQkJICBicmVhazsKLQkJY2FzZSBSX1RPQzoKLQkJY2FzZSBSX0dMOgotCQljYXNlIFJfVENMOgotCQljYXNlIFJfVFJMOgotCQljYXNlIFJfVFJMQToKLQkJICAvKiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgVE9DCi0JCSAgICAgcmVsYXRpdmUgcmVsb2MuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPnJlbG9jcyAhPSBOVUxMCi0JICAgICAgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+a2VlcF9yZWxvY3MpCi0JICAgIHsKLQkgICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzKTsKLQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBzd2VlcCBwaGFzZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uICBSZW1vdmUgYWxsIGdhcmJhZ2UKLSAgIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3ZWVwIChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpzdWI7Ci0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0KLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogS2VlcCBhbGwgc2VjdGlvbnMgZnJvbSBub24tWENPRkYgaW5wdXQgZmlsZXMuICBLZWVwCi0gICAgICAgICAgICAgICAgIHNwZWNpYWwgc2VjdGlvbnMuICBLZWVwIC5kZWJ1ZyBzZWN0aW9ucyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgIG1vbWVudC4gICovCi0JICAgICAgaWYgKHN1Yi0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc2VjdGlvbgotCQkgIHx8IG8gPT0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb24KLQkJICB8fCBzdHJjbXAgKG8tPm5hbWUsICIuZGVidWciKSA9PSAwKQotCQlvLT5mbGFncyB8PSBTRUNfTUFSSzsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBvLT5fcmF3X3NpemUgPSAwOwotCQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkJICBvLT5saW5lbm9fY291bnQgPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBSZWNvcmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHNldC4gIFRoaXMgaXMgdXNlZCB0byBvdXRwdXQgdGhlCi0gICBjb3JyZWN0IGNzZWN0IGxlbmd0aC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcsIHNpemUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKm47Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoaXMgd2lsbCBoYXJkbHkgZXZlciBiZSBjYWxsZWQuICBJIGRvbid0IHdhbnQgdG8gYnVybiBmb3VyIGJ5dGVzCi0gICAgIHBlciBnbG9iYWwgc3ltYm9sLCBzbyBpbnN0ZWFkIHRoZSBzaXplIGlzIGtlcHQgb24gYSBsaW5rZWQgbGlzdAotICAgICBhdHRhY2hlZCB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSAgbiA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0ICopCi0gICAgICAgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCkpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG4tPm5leHQgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c2l6ZV9saXN0OwotICBuLT5oID0gaDsKLSAgbi0+c2l6ZSA9IHNpemU7Ci0gIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zaXplX2xpc3QgPSBuOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0hBU19TSVpFOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbXBvcnQgYSBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZywgdmFsLCBpbXBwYXRoLCBpbXBmaWxlLAotCQkJIGltcG1lbWJlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIGJmZF92bWEgdmFsOwotICAgICBjb25zdCBjaGFyICppbXBwYXRoOwotICAgICBjb25zdCBjaGFyICppbXBmaWxlOwotICAgICBjb25zdCBjaGFyICppbXBtZW1iZXI7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBIHN5bWJvbCBuYW1lIHdoaWNoIHN0YXJ0cyB3aXRoIGEgcGVyaW9kIGlzIHRoZSBjb2RlIGZvciBhCi0gICAgIGZ1bmN0aW9uLiAgSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIHRoZW4gYWRkIGFuIHVuZGVmaW5lZAotICAgICBzeW1ib2wgZm9yIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBhbmQgaW1wb3J0IHRoYXQgaW5zdGVhZC4gICovCi0gIGlmIChoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiB2YWwgPT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotICAgICAgaGRzID0gaC0+ZGVzY3JpcHRvcjsKLSAgICAgIGlmIChoZHMgPT0gTlVMTCkKLQl7Ci0JICBoZHMgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJaC0+cm9vdC5yb290LnN0cmluZyArIDEsCi0JCQkJCXRydWUsIGZhbHNlLCB0cnVlKTsKLQkgIGlmIChoZHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICB7Ci0JICAgICAgaGRzLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgICAgICBoZHMtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JICAgIH0KLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLQkgIEJGRF9BU1NFUlQgKChoZHMtPmZsYWdzICYgWENPRkZfQ0FMTEVEKSA9PSAwCi0JCSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDApOwotCSAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkgIGgtPmRlc2NyaXB0b3IgPSBoZHM7Ci0JfQotCi0gICAgICAvKiBOb3csIGlmIHRoZSBkZXNjcmlwdG9yIGlzIHVuZGVmaW5lZCwgaW1wb3J0IHRoZSBkZXNjcmlwdG9yCi0gICAgICAgICByYXRoZXIgdGhhbiB0aGUgc3ltYm9sIHdlIHdlcmUgdG9sZCB0byBpbXBvcnQuICBGSVhNRTogSXMKLSAgICAgICAgIHRoaXMgY29ycmVjdCBpbiBhbGwgY2FzZXM/ICAqLwotICAgICAgaWYgKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCWggPSBoZHM7Ci0gICAgfQotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0lNUE9SVDsKLQotICBpZiAodmFsICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JICAgICAgfHwgaC0+cm9vdC51LmRlZi52YWx1ZSAhPSB2YWwpKQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfZGVmaW5pdGlvbikKLQkJIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiwgaC0+cm9vdC51LmRlZi52YWx1ZSwKLQkJICBvdXRwdXRfYmZkLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB2YWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSB2YWw7Ci0gICAgfQotCi0gIC8qIFdlIG92ZXJsb2FkIHRoZSBsZGluZHggZmllbGQgdG8gaG9sZCB0aGUgbF9pZmlsZSB2YWx1ZSBmb3IgdGhpcwotICAgICBzeW1ib2wuICAqLwotICBCRkRfQVNTRVJUIChoLT5sZHN5bSA9PSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfQlVJTFRfTERTWU0pID09IDApOwotICBpZiAoaW1wcGF0aCA9PSBOVUxMKQotICAgIGgtPmxkaW5keCA9IC0xOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGM7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKipwcDsKLQotICAgICAgLyogV2Ugc3RhcnQgYyBhdCAxIGJlY2F1c2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBpbXBvcnQgbGlzdCBpcwotICAgICAgICAgcmVzZXJ2ZWQgZm9yIHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgKi8KLSAgICAgIGZvciAocHAgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHMsIGMgPSAxOwotCSAgICpwcCAhPSBOVUxMOwotCSAgIHBwID0gJigqcHApLT5uZXh0LCArK2MpCi0JewotCSAgaWYgKHN0cmNtcCAoKCpwcCktPnBhdGgsIGltcHBhdGgpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKCgqcHApLT5maWxlLCBpbXBmaWxlKSA9PSAwCi0JICAgICAgJiYgc3RyY21wICgoKnBwKS0+bWVtYmVyLCBpbXBtZW1iZXIpID09IDApCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCpwcCA9PSBOVUxMKQotCXsKLQkgIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbjsKLQotCSAgbiA9ICgoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICopCi0JICAgICAgIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUpKSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBuLT5uZXh0ID0gTlVMTDsKLQkgIG4tPnBhdGggPSBpbXBwYXRoOwotCSAgbi0+ZmlsZSA9IGltcGZpbGU7Ci0JICBuLT5tZW1iZXIgPSBpbXBtZW1iZXI7Ci0JICAqcHAgPSBuOwotCX0KLQotICAgICAgaC0+bGRpbmR4ID0gYzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEV4cG9ydCBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9leHBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnLCBzeXNjYWxsKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLSAgICAgYm9vbGVhbiBzeXNjYWxsIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT5mbGFncyB8PSBYQ09GRl9FWFBPUlQ7Ci0KLSAgLyogRklYTUU6IEknbSBub3QgYXQgYWxsIHN1cmUgd2hhdCBzeXNjYWxsIGlzIHN1cHBvc2VkIHRvIG1lYW4sIHNvCi0gICAgIEknbSBqdXN0IGdvaW5nIHRvIGlnbm9yZSBpdCB1bnRpbCBzb21lYm9keSBleHBsYWlucyBpdC4gICovCi0KLSAgLyogU2VlIGlmIHRoaXMgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgSXQgbWF5IGJlIG9uZSBldmVuIHRob3VnaAotICAgICBpdCBpcyBub3Qgc28gbWFya2VkLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDAKLSAgICAgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gIT0gJy4nKQotICAgIHsKLSAgICAgIGNoYXIgKmZubmFtZTsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhmbjsKLQotICAgICAgZm5uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSArIDIpOwotICAgICAgaWYgKGZubmFtZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZubmFtZVswXSA9ICcuJzsKLSAgICAgIHN0cmNweSAoZm5uYW1lICsgMSwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gICAgICBoZm4gPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAgZm5uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgZnJlZSAoZm5uYW1lKTsKLSAgICAgIGlmIChoZm4gIT0gTlVMTAotCSAgJiYgaGZuLT5zbWNsYXMgPT0gWE1DX1BSCi0JICAmJiAoaGZuLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaGZuLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBoLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOwotCSAgaC0+ZGVzY3JpcHRvciA9IGhmbjsKLQkgIGhmbi0+ZGVzY3JpcHRvciA9IGg7Ci0JfQotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2FyYmFnZSBjb2xsZWN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgbWFrZSBzdXJlIHdlIGRvbid0IGdhcmJhZ2UKLSAgICAgY29sbGVjdCB0aGUgYXNzb2NpYXRlZCBmdW5jdGlvbiBjb2RlLiAgV2Ugbm9ybWFsbHkgZG9uJ3QgaGF2ZSB0bwotICAgICB3b3JyeSBhYm91dCB0aGlzLCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXR0YWNoZWQgdG8gYQotICAgICBzZWN0aW9uIHdpdGggcmVsb2NzLCBidXQgaWYgd2UgYXJlIGNyZWF0aW5nIHRoZSBkZXNjcmlwdG9yCi0gICAgIG91cnNlbHZlcyB0aG9zZSByZWxvY3Mgd2lsbCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbWFyayBjb2RlLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgtPmRlc2NyaXB0b3IpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvdW50IGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGZvciByZWxvY3MKLSAgIGdlbmVyYXRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgdHlwaWNhbGx5IGZvciBnbG9iYWwgY29uc3RydWN0b3JzCi0gICBhbmQgZGVzdHJ1Y3RvcnMuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkgICAgIGZhbHNlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogbm8gc3VjaCBzeW1ib2wiKSwgbmFtZSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX1JFRl9SRUdVTEFSIHwgWENPRkZfTERSRUw7Ci0gICsreGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkcmVsX2NvdW50OwotICAKLSAgLyogTWFyayB0aGUgc3ltYm9sIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCB0byB3aGljaCB0aGUgbGlua2VyIHNjcmlwdAotICAgYXNzaWducyBhIHZhbHVlLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgdHJ1ZSwKLQkJCSAgICAgIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdoCi0gICB4Y29mZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8KLXsKLSAgLyogU2V0IGlmIGEgcHJvYmxlbSBvY2N1cnJlZC4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBMaW5rIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBXaGV0aGVyIGFsbCBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIGV4cG9ydGVkLiAgKi8KLSAgYm9vbGVhbiBleHBvcnRfZGVmaW5lZHM7Ci0gIC8qIE51bWJlciBvZiBsZHN5bSBzdHJ1Y3R1cmVzLiAgKi8KLSAgc2l6ZV90IGxkc3ltX2NvdW50OwotICAvKiBTaXplIG9mIHN0cmluZyB0YWJsZS4gICovCi0gIHNpemVfdCBzdHJpbmdfc2l6ZTsKLSAgLyogU3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX2J5dGUgKnN0cmluZ3M7Ci0gIC8qIEFsbG9jYXRlZCBzaXplIG9mIHN0cmluZyB0YWJsZS4gICovCi0gIHNpemVfdCBzdHJpbmdfYWxjOwotfTsKLQotLyogQnVpbGQgdGhlIC5sb2FkZXIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBYQ09GRiBsaW5rZXIKLSAgIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lLiAgV2UgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlCi0gICAubG9hZGVyIHNlY3Rpb24gYmVmb3JlIHRoZSBsaW5rZXIgbGF5cyBvdXQgdGhlIG91dHB1dCBmaWxlLgotICAgTElCUEFUSCBpcyB0aGUgbGlicmFyeSBwYXRoIHRvIHNlYXJjaCBmb3Igc2hhcmVkIG9iamVjdHM7IHRoaXMgaXMKLSAgIG5vcm1hbGx5IGJ1aWx0IGZyb20gdGhlIC1MIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGxpbmtlci4gIEVOVFJZCi0gICBpcyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgcG9pbnQgc3ltYm9sICh0aGUgLWUgbGlua2VyIG9wdGlvbikuCi0gICBGSUxFX0FMSUdOIGlzIHRoZSBhbGlnbm1lbnQgdG8gdXNlIGZvciBzZWN0aW9ucyB3aXRoaW4gdGhlIGZpbGUKLSAgICh0aGUgLUggbGlua2VyIG9wdGlvbikuICBNQVhTVEFDSyBpcyB0aGUgbWF4aW11bSBzdGFjayBzaXplICh0aGUKLSAgIC1ibWF4c3RhY2sgbGlua2VyIG9wdGlvbikuICBNQVhEQVRBIGlzIHRoZSBtYXhpbXVtIGRhdGEgc2l6ZSAodGhlCi0gICAtYm1heGRhdGEgbGlua2VyIG9wdGlvbikuICBHQyBpcyB3aGV0aGVyIHRvIGRvIGdhcmJhZ2UgY29sbGVjdGlvbgotICAgKHRoZSAtYmdjIGxpbmtlciBvcHRpb24pLiAgTU9EVFlQRSBpcyB0aGUgbW9kdWxlIHR5cGUgKHRoZQotICAgLWJtb2R0eXBlIGxpbmtlciBvcHRpb24pLiAgVEVYVFJPIGlzIHdoZXRoZXIgdGhlIHRleHQgc2VjdGlvbiBtdXN0Ci0gICBiZSByZWFkIG9ubHkgKHRoZSAtYnRleHRybyBsaW5rZXIgb3B0aW9uKS4gIEVYUE9SVF9ERUZJTkVEUyBpcwotICAgd2hldGhlciBhbGwgZGVmaW5lZCBzeW1ib2xzIHNob3VsZCBiZSBleHBvcnRlZCAodGhlIC11bml4IGxpbmtlcgotICAgb3B0aW9uKS4gIFNQRUNJQUxfU0VDVElPTlMgaXMgc2V0IGJ5IHRoaXMgcm91dGluZSB0byBjc2VjdHMgd2l0aAotICAgbWFnaWMgbmFtZXMgbGlrZSBfZW5kLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbywgbGlicGF0aCwgZW50cnksCi0JCQkJIGZpbGVfYWxpZ24sIG1heHN0YWNrLCBtYXhkYXRhLCBnYywKLQkJCQkgbW9kdHlwZSwgdGV4dHJvLCBleHBvcnRfZGVmaW5lZHMsCi0JCQkJIHNwZWNpYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKmxpYnBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotICAgICB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWF4c3RhY2s7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWF4ZGF0YTsKLSAgICAgYm9vbGVhbiBnYzsKLSAgICAgaW50IG1vZHR5cGU7Ci0gICAgIGJvb2xlYW4gdGV4dHJvOwotICAgICBib29sZWFuIGV4cG9ydF9kZWZpbmVkczsKLSAgICAgYXNlY3Rpb24gKipzcGVjaWFsX3NlY3Rpb25zOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZW50cnk7Ci0gIGFzZWN0aW9uICpsc2VjOwotICBzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8gbGRpbmZvOwotICBpbnQgaTsKLSAgc2l6ZV90IGltcHNpemUsIGltcGNvdW50OwotICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKmZsOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKmxkaGRyOwotICBiZmRfc2l6ZV90eXBlIHN0b2ZmOwotICByZWdpc3RlciBjaGFyICpvdXQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZCAqc3ViOwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkZWJ1Z19zdHJ0YWI7Ci0gIGJmZF9ieXRlICpkZWJ1Z19jb250ZW50cyA9IE5VTEw7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0Jc3BlY2lhbF9zZWN0aW9uc1tpXSA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbGRpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBsZGluZm8ub3V0cHV0X2JmZCA9IG91dHB1dF9iZmQ7Ci0gIGxkaW5mby5pbmZvID0gaW5mbzsKLSAgbGRpbmZvLmV4cG9ydF9kZWZpbmVkcyA9IGV4cG9ydF9kZWZpbmVkczsKLSAgbGRpbmZvLmxkc3ltX2NvdW50ID0gMDsKLSAgbGRpbmZvLnN0cmluZ19zaXplID0gMDsKLSAgbGRpbmZvLnN0cmluZ3MgPSBOVUxMOwotICBsZGluZm8uc3RyaW5nX2FsYyA9IDA7Ci0KLSAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1heHN0YWNrID0gbWF4c3RhY2s7Ci0gIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5tYXhkYXRhID0gbWF4ZGF0YTsKLSAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1vZHR5cGUgPSBtb2R0eXBlOwotCi0gIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5maWxlX2FsaWduID0gZmlsZV9hbGlnbjsKLSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRleHRybyA9IHRleHRybzsKLQotICBpZiAoZW50cnkgPT0gTlVMTCkKLSAgICBoZW50cnkgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgaGVudHJ5ID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIGVudHJ5LAotCQkJCSAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGhlbnRyeSAhPSBOVUxMKQotCWhlbnRyeS0+ZmxhZ3MgfD0gWENPRkZfRU5UUlk7Ci0gICAgfQotCi0gIC8qIEdhcmJhZ2UgY29sbGVjdCB1bnVzZWQgc2VjdGlvbnMuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAhIGdjCi0gICAgICB8fCBoZW50cnkgPT0gTlVMTAotICAgICAgfHwgKGhlbnRyeS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaGVudHJ5LT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBnYyA9IGZhbHNlOwotICAgICAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmdjID0gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIHN0aWxsIG5lZWQgdG8gY2FsbCB4Y29mZl9tYXJrLCBpbiBvcmRlciB0byBzZXQgbGRyZWxfY291bnQKLSAgICAgICAgIGNvcnJlY3RseS4gICovCi0gICAgICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLQl7Ci0JICBhc2VjdGlvbiAqbzsKLQotCSAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQkJewotCQkgIGlmICghIHhjb2ZmX21hcmsgKGluZm8sIG8pKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoZW50cnktPnJvb3QudS5kZWYuc2VjdGlvbikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICB4Y29mZl9zd2VlcCAoaW5mbyk7Ci0gICAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+Z2MgPSB0cnVlOwotICAgIH0KLQotICAvKiBSZXR1cm4gc3BlY2lhbCBzZWN0aW9ucyB0byB0aGUgY2FsbGVyLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3BlY2lhbF9zZWN0aW9uc1tpXTsKLSAgICAgIGlmIChzZWMgIT0gTlVMTAotCSAgJiYgZ2MKLQkgICYmIChzZWMtPmZsYWdzICYgU0VDX01BUkspID09IDApCi0Jc2VjID0gTlVMTDsKLSAgICAgIHNwZWNpYWxfc2VjdGlvbnNbaV0gPSBzZWM7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5pbnB1dF9iZmRzID09IE5VTEwpCi0gICAgewotICAgICAgLyogSSdtIG5vdCBzdXJlIHdoYXQgdG8gZG8gaW4gdGhpcyBiaXphcnJlIGNhc2UuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHhjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHhjb2ZmX2J1aWxkX2xkc3ltcywKLQkJCSAgICAoUFRSKSAmbGRpbmZvKTsKLSAgaWYgKGxkaW5mby5mYWlsZWQpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIGltcG9ydCBmaWxlIG5hbWVzLiAgRWFjaCBpbXBvcnQgZmlsZSBJRAotICAgICBjb25zaXN0cyBvZiB0aHJlZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nczogdGhlIHBhdGgsIHRoZSBmaWxlCi0gICAgIG5hbWUsIGFuZCB0aGUgYXJjaGl2ZSBtZW1iZXIgbmFtZS4gIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbGlzdAotICAgICBvZiBuYW1lcyBpcyB0aGUgcGF0aCB0byB1c2UgdG8gZmluZCBvYmplY3RzLCB3aGljaCB0aGUgbGlua2VyIGhhcwotICAgICBwYXNzZWQgaW4gYXMgdGhlIGxpYnBhdGggYXJndW1lbnQuICBGb3Igc29tZSByZWFzb24sIHRoZSBwYXRoCi0gICAgIGVudHJ5IGluIHRoZSBvdGhlciBpbXBvcnQgZmlsZSBuYW1lcyBhcHBlYXJzIHRvIGFsd2F5cyBiZSBlbXB0eS4gICovCi0gIGltcHNpemUgPSBzdHJsZW4gKGxpYnBhdGgpICsgMzsKLSAgaW1wY291bnQgPSAxOwotICBmb3IgKGZsID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCi0gICAgewotICAgICAgKytpbXBjb3VudDsKLSAgICAgIGltcHNpemUgKz0gKHN0cmxlbiAoZmwtPnBhdGgpCi0JCSAgKyBzdHJsZW4gKGZsLT5maWxlKQotCQkgICsgc3RybGVuIChmbC0+bWVtYmVyKQotCQkgICsgMyk7Ci0gICAgfQotCi0gIC8qIFNldCB1cCB0aGUgLmxvYWRlciBzZWN0aW9uIGhlYWRlci4gICovCi0gIGxkaGRyID0gJnhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZGhkcjsKLSAgbGRoZHItPmxfdmVyc2lvbiA9IDE7Ci0gIGxkaGRyLT5sX25zeW1zID0gbGRpbmZvLmxkc3ltX2NvdW50OwotICBsZGhkci0+bF9ucmVsb2MgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRyZWxfY291bnQ7Ci0gIGxkaGRyLT5sX2lzdGxlbiA9IGltcHNpemU7Ci0gIGxkaGRyLT5sX25pbXBpZCA9IGltcGNvdW50OwotICBsZGhkci0+bF9pbXBvZmYgPSAoTERIRFJTWgotCQkgICAgICsgbGRoZHItPmxfbnN5bXMgKiBMRFNZTVNaCi0JCSAgICAgKyBsZGhkci0+bF9ucmVsb2MgKiBMRFJFTFNaKTsKLSAgbGRoZHItPmxfc3RsZW4gPSBsZGluZm8uc3RyaW5nX3NpemU7Ci0gIHN0b2ZmID0gbGRoZHItPmxfaW1wb2ZmICsgaW1wc2l6ZTsKLSAgaWYgKGxkaW5mby5zdHJpbmdfc2l6ZSA9PSAwKQotICAgIGxkaGRyLT5sX3N0b2ZmID0gMDsKLSAgZWxzZQotICAgIGxkaGRyLT5sX3N0b2ZmID0gc3RvZmY7Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIGZpbmFsIHNpemUgb2YgdGhlIC5sb2FkZXIgc2VjdGlvbi4gIEFsbG9jYXRlCi0gICAgIHNwYWNlIGZvciBpdC4gICovCi0gIGxzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb247Ci0gIGxzZWMtPl9yYXdfc2l6ZSA9IHN0b2ZmICsgbGRoZHItPmxfc3RsZW47Ci0gIGxzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKG91dHB1dF9iZmQsIGxzZWMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChsc2VjLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFNldCB1cCB0aGUgaGVhZGVyLiAgKi8KLSAgeGNvZmZfc3dhcF9sZGhkcl9vdXQgKG91dHB1dF9iZmQsIGxkaGRyLAotCQkJKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBsc2VjLT5jb250ZW50cyk7Ci0KLSAgLyogU2V0IHVwIHRoZSBpbXBvcnQgZmlsZSBuYW1lcy4gICovCi0gIG91dCA9IChjaGFyICopIGxzZWMtPmNvbnRlbnRzICsgbGRoZHItPmxfaW1wb2ZmOwotICBzdHJjcHkgKG91dCwgbGlicGF0aCk7Ci0gIG91dCArPSBzdHJsZW4gKGxpYnBhdGgpICsgMTsKLSAgKm91dCsrID0gJ1wwJzsKLSAgKm91dCsrID0gJ1wwJzsKLSAgZm9yIChmbCA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5pbXBvcnRzOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5uZXh0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICAgIHMgPSBmbC0+cGF0aDsKLSAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKLQk7Ci0gICAgICBzID0gZmwtPmZpbGU7Ci0gICAgICB3aGlsZSAoKCpvdXQrKyA9ICpzKyspICE9ICdcMCcpCi0JOwotICAgICAgcyA9IGZsLT5tZW1iZXI7Ci0gICAgICB3aGlsZSAoKCpvdXQrKyA9ICpzKyspICE9ICdcMCcpCi0JOwotICAgIH0KLQotICBCRkRfQVNTRVJUICgoYmZkX3NpemVfdHlwZSkgKChiZmRfYnl0ZSAqKSBvdXQgLSBsc2VjLT5jb250ZW50cykgPT0gc3RvZmYpOwotCi0gIC8qIFNldCB1cCB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChsZGluZm8uc3RyaW5nX3NpemUgPiAwKQotICAgIHsKLSAgICAgIG1lbWNweSAob3V0LCBsZGluZm8uc3RyaW5ncywgbGRpbmZvLnN0cmluZ19zaXplKTsKLSAgICAgIGZyZWUgKGxkaW5mby5zdHJpbmdzKTsKLSAgICAgIGxkaW5mby5zdHJpbmdzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgY2FuJ3Qgc2V0IHVwIHRoZSBzeW1ib2wgdGFibGUgb3IgdGhlIHJlbG9jcyB5ZXQsIGJlY2F1c2Ugd2UKLSAgICAgZG9uJ3QgeWV0IGtub3cgdGhlIGZpbmFsIHBvc2l0aW9uIG9mIHRoZSB2YXJpb3VzIHNlY3Rpb25zLiAgVGhlCi0gICAgIC5sb2FkZXIgc3ltYm9scyBhcmUgd3JpdHRlbiBvdXQgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBub3JtYWwKLSAgICAgc3ltYm9scyBhcmUgd3JpdHRlbiBvdXQgaW4geGNvZmZfbGlua19pbnB1dF9iZmQgb3IKLSAgICAgeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbC4gIFRoZSAubG9hZGVyIHJlbG9jcyBhcmUgd3JpdHRlbiBvdXQKLSAgICAgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBub3JtYWwgcmVsb2NzIGFyZSBoYW5kbGVkIGluCi0gICAgIHhjb2ZmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG1hZ2ljIHNlY3Rpb25zLiAgKi8KLSAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKLSAgaWYgKHNlYy0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKG91dHB1dF9iZmQsIHNlYy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb247Ci0gIGlmIChzZWMtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjLT5jb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbjsKLSAgaWYgKHNlYy0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKG91dHB1dF9iZmQsIHNlYy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlJ3ZlIGRvbmUgZ2FyYmFnZSBjb2xsZWN0aW9uLCBmaWd1cmUgb3V0IHRoZSBjb250ZW50cwotICAgICBvZiB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotICBkZWJ1Z19zdHJ0YWIgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc3RydGFiOwotCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJkZWI7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotICAgICAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kZXg7Ci0gICAgICBhc2VjdGlvbiAqKmNzZWN0cHA7Ci0gICAgICBiZmRfYnl0ZSAqZXN5bSwgKmVzeW1lbmQ7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLQotICAgICAgaWYgKHN1Yi0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotCWNvbnRpbnVlOwotICAgICAgc3ViZGViID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN1YiwgIi5kZWJ1ZyIpOwotICAgICAgaWYgKHN1YmRlYiA9PSBOVUxMIHx8IHN1YmRlYi0+X3Jhd19zaXplID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyCi0JICB8fCBpbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfYWxsKQotCXsKLQkgIHN1YmRlYi0+X3Jhd19zaXplID0gMDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChzdWIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzeW1jb3VudCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChzdWIpOwotICAgICAgZGVidWdfaW5kZXggPSAoKHVuc2lnbmVkIGxvbmcgKikKLQkJICAgICBiZmRfemFsbG9jIChzdWIsIHN5bWNvdW50ICogc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkpOwotICAgICAgaWYgKGRlYnVnX2luZGV4ID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICB4Y29mZl9kYXRhIChzdWIpLT5kZWJ1Z19pbmRpY2VzID0gZGVidWdfaW5kZXg7Ci0KLSAgICAgIC8qIEdyYWIgdGhlIGNvbnRlbnRzIG9mIHRoZSAuZGVidWcgc2VjdGlvbi4gIFdlIHVzZSBtYWxsb2MgYW5kCi0JIGNvcHkgdGhlIG5hbWVzIGludG8gdGhlIGRlYnVnIHN0cmluZ3RhYiwgcmF0aGVyIHRoYW4KLQkgYmZkX2FsbG9jLCBiZWNhdXNlIEkgZXhwZWN0IHRoYXQsIHdoZW4gbGlua2luZyBtYW55IGZpbGVzCi0JIHRvZ2V0aGVyLCBtYW55IG9mIHRoZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHNhbWUuICBTdG9yaW5nIHRoZQotCSBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIHNob3VsZCBzYXZlIHNwYWNlIGluIHRoaXMgY2FzZS4gICovCi0gICAgICBkZWJ1Z19jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzdWJkZWItPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoZGVidWdfY29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoc3ViLCBzdWJkZWIsIChQVFIpIGRlYnVnX2NvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc3ViZGViLT5fcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjc2VjdHBwID0geGNvZmZfZGF0YSAoc3ViKS0+Y3NlY3RzOwotCi0gICAgICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKHN1Yik7Ci0gICAgICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKHN1Yik7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIHN5bWNvdW50ICogc3ltZXN6OwotICAgICAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoc3ViLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotCSAgKmRlYnVnX2luZGV4ID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCi0JICBpZiAoc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKLQkgICAgICAmJiAqY3NlY3RwcCAhPSBOVUxMCi0JICAgICAgJiYgKCEgZ2MKLQkJICB8fCAoKCpjc2VjdHBwKS0+ZmxhZ3MgJiBTRUNfTUFSSykgIT0gMAotCQkgIHx8ICpjc2VjdHBwID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0JICAgICAgJiYgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoc3ViLCAmc3ltKSkKLQkgICAgewotCSAgICAgIGNoYXIgKm5hbWU7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgbmFtZSA9IChjaGFyICopIGRlYnVnX2NvbnRlbnRzICsgc3ltLl9uLl9uX24uX25fb2Zmc2V0OwotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGRlYnVnX3N0cnRhYiwgbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICAqZGVidWdfaW5kZXggPSBpbmR4OwotCSAgICB9Ci0KLQkgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotCSAgY3NlY3RwcCArPSBzeW0ubl9udW1hdXggKyAxOwotCSAgZGVidWdfaW5kZXggKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQl9Ci0KLSAgICAgIGZyZWUgKGRlYnVnX2NvbnRlbnRzKTsKLSAgICAgIGRlYnVnX2NvbnRlbnRzID0gTlVMTDsKLQotICAgICAgLyogQ2xlYXIgdGhlIHNpemUgb2Ygc3ViZGViLCBzbyB0aGF0IGl0IGlzIG5vdCBpbmNsdWRlZCBkaXJlY3RseQotCSBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgc3ViZGViLT5fcmF3X3NpemUgPSAwOwotCi0gICAgICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLQl7Ci0JICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChzdWIpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0gICAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24tPl9yYXdfc2l6ZSA9Ci0gICAgICBfYmZkX3N0cmluZ3RhYl9zaXplIChkZWJ1Z19zdHJ0YWIpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAobGRpbmZvLnN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChsZGluZm8uc3RyaW5ncyk7Ci0gIGlmIChkZWJ1Z19jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnX2NvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc3ltYm9scywgaWYgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2J1aWxkX2xkc3ltcyAoaCwgcCkKLSAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbyAqbGRpbmZvID0gKHN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbyAqKSBwOwotICBzaXplX3QgbGVuOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCBhbmQgdGhlIHN5bWJvbCB3YXMgZGVmaW5lZCBhcyBhIGNvbW1vbgotICAgICBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLCBhbmQgdGhlcmUgd2FzIG5vIGRlZmluaXRpb24gaW4KLSAgICAgYW55IGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBsaW5rZXIgd2lsbCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IKLSAgICAgdGhlIHN5bWJvbCBpbiBhIGNvbW1vbiBzZWN0aW9uIGJ1dCB0aGUgWENPRkZfREVGX1JFR1VMQVIgZmxhZwotICAgICB3aWxsIG5vdCBoYXZlIGJlZW4gc2V0LiAgKi8KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9SRUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpID09IDAKLSAgICAgICYmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikKLQkgIHx8IChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpID09IDApKQotICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9SRUdVTEFSOwotCi0gIC8qIElmIGFsbCBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIGV4cG9ydGVkLCBtYXJrIHRoZW0gbm93LiAgV2UKLSAgICAgZG9uJ3Qgd2FudCB0byBleHBvcnQgdGhlIGFjdHVhbCBmdW5jdGlvbnMsIGp1c3QgdGhlIGZ1bmN0aW9uCi0gICAgIGRlc2NyaXB0b3JzLiAgKi8KLSAgaWYgKGxkaW5mby0+ZXhwb3J0X2RlZmluZWRzCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgaC0+cm9vdC5yb290LnN0cmluZ1swXSAhPSAnLicpCi0gICAgewotICAgICAgYm9vbGVhbiBleHBvcnQ7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGV4cG9ydCBhIHN5bWJvbCB3aGljaCBpcyBiZWluZyBkZWZpbmVkIGJ5IGFuIG9iamVjdAotCSBpbmNsdWRlZCBmcm9tIGFuIGFyY2hpdmUgd2hpY2ggY29udGFpbnMgYSBzaGFyZWQgb2JqZWN0LiAgVGhlCi0JIHJhdGlvbmFsZSBpcyB0aGF0IGlmIGFuIGFyY2hpdmUgY29udGFpbnMgYm90aCBhbiB1bnNoYXJlZCBhbmQKLQkgYSBzaGFyZWQgb2JqZWN0LCB0aGVuIHRoZXJlIG11c3QgYmUgc29tZSByZWFzb24gdGhhdCB0aGUKLQkgdW5zaGFyZWQgb2JqZWN0IGlzIHVuc2hhcmVkLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBzdGFydAotCSBwcm92aWRpbmcgYSBzaGFyZWQgdmVyc2lvbiBvZiBpdC4gIEluIHBhcnRpY3VsYXIsIHRoaXMgc29sdmVzCi0JIGEgYnVnIGludm9sdmluZyB0aGUgX3NhdmVmTk4gc2V0IG9mIGZ1bmN0aW9ucy4gIGdjYyB3aWxsIGNhbGwKLQkgdGhvc2UgZnVuY3Rpb25zIHdpdGhvdXQgcHJvdmlkaW5nIGEgc2xvdCB0byByZXN0b3JlIHRoZSBUT0MsCi0JIHNvIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBiZSBsaW5rZWQgaW4gZGlyZWN0bHkKLQkgYW5kIG5vdCBmcm9tIGEgc2hhcmVkIG9iamVjdCwgd2hpY2ggbWVhbnMgdGhhdCBhIHNoYXJlZAotCSBvYmplY3Qgd2hpY2ggYWxzbyBoYXBwZW5zIHRvIGxpbmsgdGhlbSBpbiBtdXN0IG5vdCBleHBvcnQKLQkgdGhlbS4gIFRoaXMgaXMgY29uZnVzaW5nLCBidXQgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0aGluayBvZgotCSBhIGRpZmZlcmVudCBhcHByb2FjaC4gIE5vdGUgdGhhdCB0aGUgc3ltYm9scyBjYW4sIG9mIGNvdXJzZSwKLQkgYmUgZXhwb3J0ZWQgZXhwbGljaXRseS4gICovCi0gICAgICBleHBvcnQgPSB0cnVlOwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+bXlfYXJjaGl2ZSAhPSBOVUxMKQotCXsKLQkgIGJmZCAqYXJiZmQsICptZW1iZXI7Ci0KLQkgIGFyYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+bXlfYXJjaGl2ZTsKLQkgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyYmZkLCAoYmZkICopIE5VTEwpOwotCSAgd2hpbGUgKG1lbWJlciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKChtZW1iZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQkJewotCQkgIGV4cG9ydCA9IGZhbHNlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJiZmQsIG1lbWJlcik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChleHBvcnQpCi0JaC0+ZmxhZ3MgfD0gWENPRkZfRVhQT1JUOwotICAgIH0KLQotICAvKiBXZSBkb24ndCB3YW50IHRvIGdhcmJhZ2UgY29sbGVjdCBzeW1ib2xzIHdoaWNoIGFyZSBub3QgZGVmaW5lZCBpbgotICAgICBYQ09GRiBmaWxlcy4gIFRoaXMgaXMgYSBjb252ZW5pZW50IHBsYWNlIHRvIG1hcmsgdGhlbS4gICovCi0gIGlmICh4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYwotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMAotICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciA9PSBOVUxMCi0JICB8fCAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+eHZlYwotCSAgICAgICE9IGxkaW5mby0+aW5mby0+aGFzaC0+Y3JlYXRvcikpKQotICAgIGgtPmZsYWdzIHw9IFhDT0ZGX01BUks7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgY2FsbGVkIGFuZCBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QsIG9yIGl0Ci0gICAgIGlzIGltcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gc2V0IHVwIGdsb2JhbCBsaW5rYWdlIGNvZGUgZm9yIGl0LgotICAgICAoVW5sZXNzIHdlIGRpZCBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHdlIGRpZG4ndCBuZWVkIHRoaXMKLSAgICAgc3ltYm9sLikgICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpICE9IDAKLSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLSAgICAgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0gICAgICAmJiBoLT5kZXNjcmlwdG9yICE9IE5VTEwKLSAgICAgICYmICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMAotCSAgfHwgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMAotCSAgICAgICYmIChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwKSkKLSAgICAgICYmICghIHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmdjCi0JICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSAhPSAwKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0gICAgICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5saW5rYWdlX3NlY3Rpb247Ci0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzZWM7Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gICAgICBoLT5zbWNsYXMgPSBYTUNfR0w7Ci0gICAgICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfUkVHVUxBUjsKLSAgICAgIHNlYy0+X3Jhd19zaXplICs9IFhDT0ZGX0dMSU5LX1NJWkU7Ci0KLSAgICAgIC8qIFRoZSBnbG9iYWwgbGlua2FnZSBjb2RlIHJlcXVpcmVzIGEgVE9DIGVudHJ5IGZvciB0aGUKLSAgICAgICAgIGRlc2NyaXB0b3IuICAqLwotICAgICAgaGRzID0gaC0+ZGVzY3JpcHRvcjsKLSAgICAgIEJGRF9BU1NFUlQgKChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkgICB8fCBoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJICAmJiAoaGRzLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwKTsKLSAgICAgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKLSAgICAgIGlmIChoZHMtPnRvY19zZWN0aW9uID09IE5VTEwpCi0JewotCSAgaGRzLT50b2Nfc2VjdGlvbiA9IHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPnRvY19zZWN0aW9uOwotCSAgaGRzLT51LnRvY19vZmZzZXQgPSBoZHMtPnRvY19zZWN0aW9uLT5fcmF3X3NpemU7Ci0JICBoZHMtPnRvY19zZWN0aW9uLT5fcmF3X3NpemUgKz0gNDsKLQkgICsreGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+bGRyZWxfY291bnQ7Ci0JICArK2hkcy0+dG9jX3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgaGRzLT5pbmR4ID0gLTI7Ci0JICBoZHMtPmZsYWdzIHw9IFhDT0ZGX1NFVF9UT0MgfCBYQ09GRl9MRFJFTDsKLQotCSAgLyogV2UgbmVlZCB0byBjYWxsIHhjb2ZmX2J1aWxkX2xkc3ltcyByZWN1cnNpdmVseSBoZXJlLAotICAgICAgICAgICAgIGJlY2F1c2Ugd2UgbWF5IGFscmVhZHkgaGF2ZSBwYXNzZWQgaGRzIG9uIHRoZSB0cmF2ZXJzYWwuICAqLwotCSAgeGNvZmZfYnVpbGRfbGRzeW1zIChoZHMsIHApOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZXhwb3J0ZWQsIGJ1dCBub3QgZGVmaW5lZCwgd2UgbmVlZCB0byB0cnkgdG8KLSAgICAgZGVmaW5lIGl0LiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VYUE9SVCkgIT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpID09IDAKLSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0gICAgewotICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDAKLQkgICYmIChoLT5kZXNjcmlwdG9yLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+ZGVzY3JpcHRvci0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogVGhpcyBpcyBhbiB1bmRlZmluZWQgZnVuY3Rpb24gZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICAgICBhIGRlZmluZWQgZW50cnkgcG9pbnQuICBXZSBjYW4gYnVpbGQgdXAgYSBmdW5jdGlvbgotICAgICAgICAgICAgIGRlc2NyaXB0b3Igb3Vyc2VsdmVzLiAgQmVsaWV2ZSBpdCBvciBub3QsIHRoZSBBSVggbGlua2VyCi0gICAgICAgICAgICAgYWN0dWFsbHkgZG9lcyB0aGlzLCBhbmQgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICBkbyBpdCBhcyB3ZWxsLiAgKi8KLQkgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbjsKLQkgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHNlYzsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgIGgtPnNtY2xhcyA9IFhNQ19EUzsKLQkgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9SRUdVTEFSOwotCSAgc2VjLT5fcmF3X3NpemUgKz0gMTI7Ci0KLQkgIC8qIEEgZnVuY3Rpb24gZGVzY3JpcHRvciB1c2VzIHR3byByZWxvY3M6IG9uZSBmb3IgdGhlCi0gICAgICAgICAgICAgYXNzb2NpYXRlZCBjb2RlLCBhbmQgb25lIGZvciB0aGUgVE9DIGFkZHJlc3MuICAqLwotCSAgeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+bGRyZWxfY291bnQgKz0gMjsKLQkgIHNlYy0+cmVsb2NfY291bnQgKz0gMjsKLQotCSAgLyogV2UgaGFuZGxlIHdyaXRpbmcgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgZGVzY3JpcHRvciBpbgotICAgICAgICAgICAgIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wuICAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIndhcm5pbmc6IGF0dGVtcHQgdG8gZXhwb3J0IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyIpLAotCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JICBoLT5sZHN5bSA9IE5VTEw7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgc3RpbGwgYSBjb21tb24gc3ltYm9sLCBhbmQgaXQgd2Fzbid0IGdhcmJhZ2UKLSAgICAgY29sbGVjdGVkLCB3ZSBuZWVkIHRvIGFjdHVhbGx5IGFsbG9jYXRlIHNwYWNlIGZvciBpdCBpbiB0aGUgLmJzcwotICAgICBzZWN0aW9uLiAgKi8KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotICAgICAgJiYgKCEgeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApCi0gICAgICAmJiBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChiZmRfaXNfY29tX3NlY3Rpb24gKGgtPnJvb3QudS5jLnAtPnNlY3Rpb24pKTsKLSAgICAgIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPl9yYXdfc2l6ZSA9IGgtPnJvb3QudS5jLnNpemU7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gYWRkIGEgc3ltYm9sIHRvIHRoZSAubG9hZGVyIHNlY3Rpb24gaWYgaXQgaXMgbWVudGlvbmVkCi0gICAgIGluIGEgcmVsb2Mgd2hpY2ggd2UgYXJlIGNvcHlpbmcgdG8gdGhlIC5sb2FkZXIgc2VjdGlvbiBhbmQgaXQgd2FzCi0gICAgIG5vdCBkZWZpbmVkIG9yIGNvbW1vbiwgb3IgaWYgaXQgaXMgdGhlIGVudHJ5IHBvaW50LCBvciBpZiBpdCBpcwotICAgICBiZWluZyBleHBvcnRlZC4gICovCi0KLSAgaWYgKCgoaC0+ZmxhZ3MgJiBYQ09GRl9MRFJFTCkgPT0gMAotICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfRU5UUlkpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0VYUE9SVCkgPT0gMCkKLSAgICB7Ci0gICAgICBoLT5sZHN5bSA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBhZGQgdGhpcyBzeW1ib2wgaWYgd2UgZGlkIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQKLSAgICAgd2UgZGlkIG5vdCBtYXJrIHRoaXMgc3ltYm9sLiAgKi8KLSAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmdjCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSA9PSAwKQotICAgIHsKLSAgICAgIGgtPmxkc3ltID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBtYXkgaGF2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIHN5bWJvbCBkdWUgdG8gdGhlIHJlY3Vyc2l2ZQotICAgICBjYWxsIGFib3ZlLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0JVSUxUX0xEU1lNKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG5lZWQgdG8gYWRkIHRoaXMgc3ltYm9sIHRvIHRoZSAubG9hZGVyIHN5bWJvbHMuICAqLwotCi0gIEJGRF9BU1NFUlQgKGgtPmxkc3ltID09IE5VTEwpOwotICBoLT5sZHN5bSA9ICgoc3RydWN0IGludGVybmFsX2xkc3ltICopCi0JICAgICAgYmZkX3phbGxvYyAobGRpbmZvLT5vdXRwdXRfYmZkLAotCQkJICBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9sZHN5bSkpKTsKLSAgaWYgKGgtPmxkc3ltID09IE5VTEwpCi0gICAgewotICAgICAgbGRpbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQotICAgIGgtPmxkc3ltLT5sX2lmaWxlID0gaC0+bGRpbmR4OwotCi0gIC8qIFRoZSBmaXJzdCAzIHN5bWJvbCB0YWJsZSBpbmRpY2VzIGFyZSByZXNlcnZlZCB0byBpbmRpY2F0ZSB0aGUKLSAgICAgc2VjdGlvbnMuICAqLwotICBoLT5sZGluZHggPSBsZGluZm8tPmxkc3ltX2NvdW50ICsgMzsKLQotICArK2xkaW5mby0+bGRzeW1fY291bnQ7Ci0KLSAgbGVuID0gc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKTsKLSAgaWYgKGxlbiA8PSBTWU1OTUxFTikKLSAgICBzdHJuY3B5IChoLT5sZHN5bS0+X2wuX2xfbmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgU1lNTk1MRU4pOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxkaW5mby0+c3RyaW5nX3NpemUgKyBsZW4gKyAzID4gbGRpbmZvLT5zdHJpbmdfYWxjKQotCXsKLQkgIHNpemVfdCBuZXdhbGM7Ci0JICBiZmRfYnl0ZSAqbmV3c3RyaW5nczsKLQotCSAgbmV3YWxjID0gbGRpbmZvLT5zdHJpbmdfYWxjICogMjsKLQkgIGlmIChuZXdhbGMgPT0gMCkKLQkgICAgbmV3YWxjID0gMzI7Ci0JICB3aGlsZSAobGRpbmZvLT5zdHJpbmdfc2l6ZSArIGxlbiArIDMgPiBuZXdhbGMpCi0JICAgIG5ld2FsYyAqPSAyOwotCi0JICBuZXdzdHJpbmdzID0gKChiZmRfYnl0ZSAqKQotCQkJYmZkX3JlYWxsb2MgKChQVFIpIGxkaW5mby0+c3RyaW5ncywgbmV3YWxjKSk7Ci0JICBpZiAobmV3c3RyaW5ncyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbGRpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgbGRpbmZvLT5zdHJpbmdfYWxjID0gbmV3YWxjOwotCSAgbGRpbmZvLT5zdHJpbmdzID0gbmV3c3RyaW5nczsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGxkaW5mby0+b3V0cHV0X2JmZCwgbGVuICsgMSwKLQkJICBsZGluZm8tPnN0cmluZ3MgKyBsZGluZm8tPnN0cmluZ19zaXplKTsKLSAgICAgIHN0cmNweSAobGRpbmZvLT5zdHJpbmdzICsgbGRpbmZvLT5zdHJpbmdfc2l6ZSArIDIsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgaC0+bGRzeW0tPl9sLl9sX2wuX2xfemVyb2VzID0gMDsKLSAgICAgIGgtPmxkc3ltLT5fbC5fbF9sLl9sX29mZnNldCA9IGxkaW5mby0+c3RyaW5nX3NpemUgKyAyOwotICAgICAgbGRpbmZvLT5zdHJpbmdfc2l6ZSArPSBsZW4gKyAzOwotICAgIH0KLQotICBoLT5mbGFncyB8PSBYQ09GRl9CVUlMVF9MRFNZTTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIERvIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1ib29sZWFuCi1fYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyBmaW5mbzsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBzaXplX3QgbWF4X3N5bV9jb3VudDsKLSAgc2l6ZV90IG1heF9saW5lbm9fY291bnQ7Ci0gIHNpemVfdCBtYXhfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfb3V0cHV0X3JlbG9jX2NvdW50OwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLSAgZmluZm8uaW5mbyA9IGluZm87Ci0gIGZpbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBmaW5mby5zdHJ0YWIgPSBOVUxMOwotICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICBmaW5mby5sYXN0X2ZpbGVfaW5kZXggPSAtMTsKLSAgZmluZm8udG9jX3N5bWluZHggPSAtMTsKLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0KLSAgZmluZm8ubGRzeW0gPSAoKHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqKQotCQkgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbi0+Y29udGVudHMKLQkJICArIExESERSU1opKTsKLSAgZmluZm8ubGRyZWwgPSAoKHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqKQotCQkgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbi0+Y29udGVudHMKLQkJICArIExESERSU1oKLQkJICArIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZGhkci5sX25zeW1zICogTERTWU1TWikpOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jb2ZmLmxpbmtfaW5mbyA9IGluZm87Ci0KLSAgZmluZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIENvdW50IHRoZSBsaW5lIG51bWJlciBhbmQgcmVsb2NhdGlvbiBlbnRyaWVzIHJlcXVpcmVkIGZvciB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBEZXRlcm1pbmUgYSBmZXcgbWF4aW11bSBzaXplcy4gICovCi0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X2xpbmVub19jb3VudCA9IDA7Ci0gIG1heF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JICAgICAgLyogTWFyayBhbGwgc2VjdGlvbnMgd2hpY2ggYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZQotCQkgbGluay4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBldmVyeSBzZWN0aW9uLiAgV2UgbmVlZAotCQkgdG8gZG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBpZGVudGlmeSBhbnkgc2VjdGlvbnMgd2hpY2gKLQkJIHRoZSBsaW5rZXIgaGFzIGRlY2lkZWQgdG8gbm90IGluY2x1ZGUuICAqLwotCSAgICAgIHNlYy0+bGlua2VyX21hcmsgPSB0cnVlOwotCi0JICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKLQkJICB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCQlvLT5saW5lbm9fY291bnQgKz0gc2VjLT5saW5lbm9fY291bnQ7Ci0KLQkgICAgICBvLT5yZWxvY19jb3VudCArPSBzZWMtPnJlbG9jX2NvdW50OwotCi0JICAgICAgaWYgKHNlYy0+X3Jhd19zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0JICAgICAgaWYgKHNlYy0+bGluZW5vX2NvdW50ID4gbWF4X2xpbmVub19jb3VudCkKLQkJbWF4X2xpbmVub19jb3VudCA9IHNlYy0+bGluZW5vX2NvdW50OwotCSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0JCSAgJiYgeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLQkJICAmJiAoeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5saW5lbm9fY291bnQKLQkJICAgICAgPiBtYXhfbGluZW5vX2NvdW50KSkKLQkJbWF4X2xpbmVub19jb3VudCA9Ci0JCSAgeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5saW5lbm9fY291bnQ7Ci0JICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiBtYXhfcmVsb2NfY291bnQpCi0JCW1heF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5maWxlX2FsaWduICE9IDApCi0JYWJvcnQgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3ZtYSBmaWxlX2FsaWduOwotCi0gICAgICBmaWxlX2FsaWduID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZpbGVfYWxpZ247Ci0gICAgICBpZiAoZmlsZV9hbGlnbiAhPSAwKQotCXsKLQkgIGJvb2xlYW4gc2F3X2NvbnRlbnRzOwotCSAgaW50IGluZHg7Ci0JICBhc2VjdGlvbiAqKm9wOwotCSAgZmlsZV9wdHIgc29mYXI7Ci0KLQkgIC8qIEluc2VydCAucGFkIHNlY3Rpb25zIGJlZm9yZSBldmVyeSBzZWN0aW9uIHdoaWNoIGhhcwotICAgICAgICAgICAgIGNvbnRlbnRzIGFuZCBpcyBsb2FkZWQsIGlmIGl0IGlzIHByZWNlZGVkIGJ5IHNvbWUgb3RoZXIKLSAgICAgICAgICAgICBzZWN0aW9uIHdoaWNoIGhhcyBjb250ZW50cyBhbmQgaXMgbG9hZGVkLiAgKi8KLQkgIHNhd19jb250ZW50cyA9IHRydWU7Ci0JICBmb3IgKG9wID0gJmFiZmQtPnNlY3Rpb25zOyAqb3AgIT0gTlVMTDsgb3AgPSAmKCpvcCktPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wICgoKm9wKS0+bmFtZSwgIi5wYWQiKSA9PSAwKQotCQlzYXdfY29udGVudHMgPSBmYWxzZTsKLQkgICAgICBlbHNlIGlmICgoKCpvcCktPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMAotCQkgICAgICAgJiYgKCgqb3ApLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotCQl7Ci0JCSAgaWYgKCEgc2F3X2NvbnRlbnRzKQotCQkgICAgc2F3X2NvbnRlbnRzID0gdHJ1ZTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpuLCAqaG9sZDsKLQotCQkgICAgICBob2xkID0gKm9wOwotCQkgICAgICAqb3AgPSBOVUxMOwotCQkgICAgICBuID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIucGFkIik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKCpvcCA9PSBuKTsKLQkJICAgICAgbi0+bmV4dCA9IGhvbGQ7Ci0JCSAgICAgIG4tPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQkJICAgICAgbi0+YWxpZ25tZW50X3Bvd2VyID0gMDsKLQkJICAgICAgc2F3X2NvbnRlbnRzID0gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKiBSZXNldCB0aGUgc2VjdGlvbiBpbmRpY2VzIGFmdGVyIGluc2VydGluZyB0aGUgbmV3Ci0gICAgICAgICAgICAgc2VjdGlvbnMuICAqLwotCSAgaW5keCA9IDA7Ci0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgICsraW5keDsKLQkgICAgICBvLT50YXJnZXRfaW5kZXggPSBpbmR4OwotCSAgICB9Ci0JICBCRkRfQVNTRVJUICgodW5zaWduZWQgaW50KSBpbmR4ID09IGFiZmQtPnNlY3Rpb25fY291bnQpOwotCi0JICAvKiBXb3JrIG91dCBhcHByb3ByaWF0ZSBzaXplcyBmb3IgdGhlIC5wYWQgc2VjdGlvbnMgdG8gZm9yY2UKLSAgICAgICAgICAgICBlYWNoIHNlY3Rpb24gdG8gbGFuZCBvbiBhIHBhZ2UgYm91bmRhcnkuICBUaGlzIGJpdCBvZgotICAgICAgICAgICAgIGNvZGUga25vd3Mgd2hhdCBjb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgaXMgZ29pbmcKLSAgICAgICAgICAgICB0byBkby4gICovCi0JICBzb2ZhciA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0JICBzb2ZhciArPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotCSAgc29mYXIgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgaWYgKG8tPnJlbG9jX2NvdW50ID49IDB4ZmZmZiB8fCBvLT5saW5lbm9fY291bnQgPj0gMHhmZmZmKQotCSAgICAgIHNvZmFyICs9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0KLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5wYWQiKSA9PSAwKQotCQl7Ci0JCSAgYmZkX3ZtYSBwYWdlb2ZmOwotCi0JCSAgQkZEX0FTU0VSVCAoby0+X3Jhd19zaXplID09IDApOwotCQkgIHBhZ2VvZmYgPSBzb2ZhciAmIChmaWxlX2FsaWduIC0gMSk7Ci0JCSAgaWYgKHBhZ2VvZmYgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgby0+X3Jhd19zaXplID0gZmlsZV9hbGlnbiAtIHBhZ2VvZmY7Ci0JCSAgICAgIHNvZmFyICs9IGZpbGVfYWxpZ24gLSBwYWdlb2ZmOwotCQkgICAgICBvLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JCSAgICBzb2ZhciArPSBCRkRfQUxJR04gKG8tPl9yYXdfc2l6ZSwKLQkJCQkJMSA8PCBvLT5hbGlnbm1lbnRfcG93ZXIpOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcG9pbnRlcnMgd2UgbmVlZCB0byBrZWVwIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgewotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgLyogV2UgdXNlIHNlY3Rpb25fY291bnQgKyAxLCByYXRoZXIgdGhhbiBzZWN0aW9uX2NvdW50LCBiZWNhdXNlCi0gICAgICAgdGhlIHRhcmdldF9pbmRleCBmaWVsZHMgYXJlIDEgYmFzZWQuICAqLwotICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9Ci0gICAgICAoKHN0cnVjdCB4Y29mZl9saW5rX3NlY3Rpb25faW5mbyAqKQotICAgICAgIGJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJICAgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX3NlY3Rpb25faW5mbykpKTsKLSAgICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvID09IE5VTEwpCi0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLSAgICAgIHsKLQlmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzID0gTlVMTDsKLQlmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyA9IE5VTEw7Ci0JZmluZm8uc2VjdGlvbl9pbmZvW2ldLnRvY19yZWxfaGFzaGVzID0gTlVMTDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIFNldCB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSByZWxvY3MuICAqLwotICByZWxfZmlsZXBvcyA9IG9ial9yZWxvY2Jhc2UgKGFiZmQpOwotICByZWxzeiA9IGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKLSAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCA9PSAwKQotCW8tPnJlbF9maWxlcG9zID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBIHN0cmlwcGVkIGZpbGUgaGFzIG5vIHJlbG9jcy4gIEhvd2V2ZXIsIHdlIHN0aWxsCi0gICAgICAgICAgICAgYWxsb2NhdGUgdGhlIGJ1ZmZlcnMsIHNvIHRoYXQgbGF0ZXIgY29kZSBkb2Vzbid0IGhhdmUgdG8KLSAgICAgICAgICAgICB3b3JyeSBhYm91dCB3aGV0aGVyIHdlIGFyZSBzdHJpcHBpbmcgb3Igbm90LiAgKi8KLQkgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JICAgIG8tPnJlbF9maWxlcG9zID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG8tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgICBvLT5yZWxfZmlsZXBvcyA9IHJlbF9maWxlcG9zOwotCSAgICAgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JICAgIH0KLQotCSAgLyogV2UgZG9uJ3Qga25vdyB0aGUgaW5kaWNlcyBvZiBnbG9iYWwgc3ltYm9scyB1bnRpbCB3ZSBoYXZlCi0gICAgICAgICAgICAgd3JpdHRlbiBvdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLiAgRm9yIGVhY2ggc2VjdGlvbiBpbgotICAgICAgICAgICAgIHRoZSBvdXRwdXQgZmlsZSwgd2Uga2VlcCBhbiBhcnJheSBvZiBwb2ludGVycyB0byBoYXNoCi0gICAgICAgICAgICAgdGFibGUgZW50cmllcy4gIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGEKLSAgICAgICAgICAgICByZWxvYy4gIFdoZW4gd2UgZmluZCBhIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCB3ZQotICAgICAgICAgICAgIHNldCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGlzIGFycmF5IHNvIHRoYXQgd2UgY2FuCi0gICAgICAgICAgICAgZml4IHVwIHRoZSBzeW1ib2wgaW5kZXggYWZ0ZXIgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlCi0gICAgICAgICAgICAgbG9jYWwgc3ltYm9scy4KLQotCSAgICAgQmVjYXVzZSBvZiB0aGlzIHByb2JsZW0sIHdlIGFsc28ga2VlcCB0aGUgcmVsb2NzIGluCi0JICAgICBtZW1vcnkgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluay4gIFRoaXMgd2FzdGVzIG1lbW9yeS4KLQkgICAgIFdlIGNvdWxkIGJhY2twYXRjaCB0aGUgZmlsZSBsYXRlciwgSSBzdXBwb3NlLCBhbHRob3VnaCBpdAotCSAgICAgd291bGQgYmUgc2xvdy4gICovCi0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPQotCSAgICAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPQotCSAgICAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID09IE5VTEwKLQkgICAgICB8fCBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50KQotCSAgICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gby0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICAvKiBXZSBub3cga25vdyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NzLCBzbyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaWxlCi0gICAgIHBvc2l0aW9ucyBvZiB0aGUgbGluZSBudW1iZXJzLiAgKi8KLSAgbGluZV9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0gIGZpbmZvLmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKG8tPmxpbmVub19jb3VudCA9PSAwKQotCW8tPmxpbmVfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+bGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOwotCSAgbGluZV9maWxlcG9zICs9IG8tPmxpbmVub19jb3VudCAqIGxpbmVzejsKLQl9Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSByZWxvYyBhbmQgbGluZW5vIGNvdW50cywgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8KLQkgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgIH0KLQotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gbGluZV9maWxlcG9zOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYW4gaW5wdXQgQkZELiAgVGFrZQotICAgICB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYXIgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGRzIG9mIGFsbCB0aGUKLSAgICAgaW5wdXQgQkZEJ3MuICBXZSB3YW50IGF0IGxlYXN0IDYgc3ltYm9scywgc2luY2UgdGhhdCBpcyB0aGUKLSAgICAgbnVtYmVyIHdoaWNoIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wgbWF5IG5lZWQuICAqLwotICBtYXhfc3ltX2NvdW50ID0gNjsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgICAgIHN6ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCW1heF9zeW1fY291bnQgPSBzejsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBidWZmZXJzIHVzZWQgd2hpbGUgbGlua2luZy4gICovCi0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgZmluZm8uc3ltX2luZGljZXMgPSAobG9uZyAqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChsb25nKSk7Ci0gIGZpbmZvLm91dHN5bXMgPSAoKGJmZF9ieXRlICopCi0JCSAgIGJmZF9tYWxsb2MgKChzaXplX3QpICgobWF4X3N5bV9jb3VudCArIDEpICogc3ltZXN6KSkpOwotICBmaW5mby5saW5lbm9zID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9saW5lbm9fY291bnQKLQkJCQkJICAgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpKTsKLSAgZmluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X3JlbG9jX2NvdW50ICogcmVsc3opOwotICBpZiAoKGZpbmZvLmludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5zeW1faW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgZmluZm8ub3V0c3ltcyA9PSBOVUxMCi0gICAgICB8fCAoZmluZm8ubGluZW5vcyA9PSBOVUxMICYmIG1heF9saW5lbm9fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLmNvbnRlbnRzID09IE5VTEwgJiYgbWF4X2NvbnRlbnRzX3NpemUgPiAwKQotICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9yZWxvY19jb3VudCA+IDApKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9IDA7Ci0gIHhjb2ZmX2RhdGEgKGFiZmQpLT50b2MgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIGV4Y2VwdCB0aGF0Ci0gICAgIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlcmVmb3JlIHdlIGRvbid0Ci0gICAgIGtub3cgd2hlcmUgdGhlIHN0cmluZyB0YWJsZSBzdGFydHMuICBXZSBqdXN0IGJ1aWxkIHRoZSBzdHJpbmcKLSAgICAgdGFibGUgaW4gbWVtb3J5IGFzIHdlIGdvIGFsb25nLiAgV2UgcHJvY2VzcyBhbGwgdGhlIHJlbG9jYXRpb25zCi0gICAgIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyLT54dmVjID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBzdWIgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1bikKLQkJewotCQkgIGlmICghIHhjb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIHN1YikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGlmICghIHhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBGcmVlIHVwIHRoZSBidWZmZXJzIHVzZWQgYnkgeGNvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgLTEuICBXcml0ZQotICAgICBpdCBvdXQgYWdhaW4uICAqLwotICBpZiAoZmluZm8ubGFzdF9maWxlX2luZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlID0gLTE7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZmaW5mby5sYXN0X2ZpbGUsCi0JCQkgICAgIChQVFIpIGZpbmZvLm91dHN5bXMpOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKLQkJICAgICArIGZpbmZvLmxhc3RfZmlsZV9pbmRleCAqIHN5bWVzeiksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlIChmaW5mby5vdXRzeW1zLCBzeW1lc3osIDEsIGFiZmQpICE9IHN5bWVzeikKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMgd2hpY2ggZG8gbm90IGNvbWUgZnJvbSBYQ09GRgotICAgICBpbnB1dCBmaWxlcy4gICovCi0gIHhjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCwKLQkJCSAgICAoUFRSKSAmZmluZm8pOwotCi0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gICAgICBmaW5mby5vdXRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlIGdsb2JhbCBzeW1ib2xzLCB3ZSBrbm93IHRoZQotICAgICBzeW1ib2wgaW5kaWNlcyB0byB1c2UgZm9yIHJlbG9jcyBhZ2FpbnN0IHRoZW0sIGFuZCB3ZSBjYW4gZmluYWxseQotICAgICB3cml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0gIGV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICogcmVsc3opOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X291dHB1dF9yZWxvY19jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGVuZDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLSAgICAgIHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2ggKnRvY19yZWxfaGFzaDsKLSAgICAgIGJmZF9ieXRlICplcmVsOwotCi0gICAgICAvKiBBIHN0cmlwcGVkIGZpbGUgaGFzIG5vIHJlbG9jcy4gICovCi0gICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCXsKLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0gICAgICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotICAgICAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyssIHJlbF9oYXNoKyssIGVyZWwgKz0gcmVsc3opCi0JewotCSAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCgqcmVsX2hhc2gpLT5pbmR4IDwgMCkKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCSAoaW5mbywgKCpyZWxfaGFzaCktPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgIChiZmQgKikgTlVMTCwgbywgaXJlbC0+cl92YWRkcikpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgKCpyZWxfaGFzaCktPmluZHggPSAwOwotCQl9Ci0JICAgICAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkgICAgfQotCX0KLQotICAgICAgZm9yICh0b2NfcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS50b2NfcmVsX2hhc2hlczsKLQkgICB0b2NfcmVsX2hhc2ggIT0gTlVMTDsKLQkgICB0b2NfcmVsX2hhc2ggPSB0b2NfcmVsX2hhc2gtPm5leHQpCi0JewotCSAgaWYgKHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keCA8IDApCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAgICAgKGluZm8sIHRvY19yZWxfaGFzaC0+aC0+cm9vdC5yb290LnN0cmluZywKLQkJICAgICAgKGJmZCAqKSBOVUxMLCBvLCB0b2NfcmVsX2hhc2gtPnJlbC0+cl92YWRkcikpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB0b2NfcmVsX2hhc2gtPmgtPnUudG9jX2luZHggPSAwOwotCSAgICB9Ci0JICB0b2NfcmVsX2hhc2gtPnJlbC0+cl9zeW1uZHggPSB0b2NfcmVsX2hhc2gtPmgtPnUudG9jX2luZHg7Ci0JfQotCi0gICAgICAvKiBYQ09GRiByZXF1aXJlcyB0aGF0IHRoZSByZWxvY3MgYmUgc29ydGVkIGJ5IGFkZHJlc3MuICBXZSB0ZW5kCi0gICAgICAgICB0byBwcm9kdWNlIHRoZW0gaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZWlyIGNvbnRhaW5pbmcgY3NlY3RzCi0gICAgICAgICBhcHBlYXIgaW4gdGhlIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IGJ5Ci0gICAgICAgICBhZGRyZXNzLiAgU28gd2Ugc29ydCB0aGVtIGhlcmUuICBUaGVyZSBtYXkgYmUgYSBiZXR0ZXIgd2F5IHRvCi0gICAgICAgICBkbyB0aGlzLiAgKi8KLSAgICAgIHFzb3J0ICgoUFRSKSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MsCi0JICAgICBvLT5yZWxvY19jb3VudCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpLAotCSAgICAgeGNvZmZfc29ydF9yZWxvY3MpOwotCi0gICAgICBpcmVsID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzOwotICAgICAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIGVyZWwgPSBleHRlcm5hbF9yZWxvY3M7Ci0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKLQliZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgKFBUUikgaXJlbCwgKFBUUikgZXJlbCk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgby0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKChQVFIpIGV4dGVybmFsX3JlbG9jcywgcmVsc3osIG8tPnJlbG9jX2NvdW50LAotCQkJYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBGcmVlIHVwIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBsb2FkZXIgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIEJGRF9BU1NFUlQgKChiZmRfYnl0ZSAqKSBmaW5mby5sZHJlbAotCSAgICAgID09ICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24tPmNvbnRlbnRzCi0JCSAgKyB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRoZHIubF9pbXBvZmYpKTsKLSAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbjsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgIG8tPmNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgby0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIG1hZ2ljIHNlY3Rpb25zLiAgKi8KLSAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb247Ci0gIGlmIChvLT5fcmF3X3NpemUgPiAwCi0gICAgICAmJiAhIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sIG8tPmNvbnRlbnRzLAotCQkJCSAgICAgby0+b3V0cHV0X29mZnNldCwgby0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbjsKLSAgaWYgKG8tPl9yYXdfc2l6ZSA+IDAKLSAgICAgICYmICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwgby0+Y29udGVudHMsCi0JCQkJICAgICBvLT5vdXRwdXRfb2Zmc2V0LCBvLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbjsKLSAgaWYgKG8tPl9yYXdfc2l6ZSA+IDAKLSAgICAgICYmICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwgby0+Y29udGVudHMsCi0JCQkJICAgICBvLT5vdXRwdXRfb2Zmc2V0LCBvLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3opLAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLAotCQlfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zdHJ0YWIpICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJKGJmZF9ieXRlICopIHN0cmJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKHN0cmJ1ZiwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkgIT0gU1RSSU5HX1NJWkVfU0laRSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZmluZm8uc3RydGFiKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIHN0cmluZyB0YWJsZS4gICovCi0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc2VjdGlvbjsKLSAgaWYgKG8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkZWJ1Z19zdHJ0YWI7Ci0KLSAgICAgIGRlYnVnX3N0cnRhYiA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zdHJ0YWI7Ci0gICAgICBCRkRfQVNTRVJUIChvLT5vdXRwdXRfc2VjdGlvbi0+X3Jhd19zaXplIC0gby0+b3V0cHV0X29mZnNldAotCQkgID49IF9iZmRfc3RyaW5ndGFiX3NpemUgKGRlYnVnX3N0cnRhYikpOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgby0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBvLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBkZWJ1Z19zdHJ0YWIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBTZXR0aW5nIGJmZF9nZXRfc3ltY291bnQgdG8gMCB3aWxsIGNhdXNlIHdyaXRlX29iamVjdF9jb250ZW50cyB0bwotICAgICBub3QgdHJ5IHRvIHdyaXRlIG91dCB0aGUgc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZpbmZvLnN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTGluayBhbiBpbnB1dCBmaWxlIGludG8gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24KLSAgIGhhbmRsZXMgYWxsIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZW50X2Jhc2U7Ci0gIHVuc2lnbmVkIGludCBuX3RtYXNrOwotICB1bnNpZ25lZCBpbnQgbl9idHNoZnQ7Ci0gIGJvb2xlYW4gY29weSwgaGFzaDsKLSAgYmZkX3NpemVfdHlwZSBpc3ltZXN6OwotICBiZmRfc2l6ZV90eXBlIG9zeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgbGluZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICBhc2VjdGlvbiAqKmNzZWN0cHA7Ci0gIHVuc2lnbmVkIGxvbmcgKmRlYnVnX2luZGV4OwotICBsb25nICppbmRleHA7Ci0gIHVuc2lnbmVkIGxvbmcgb3V0cHV0X2luZGV4OwotICBiZmRfYnl0ZSAqb3V0c3ltOwotICB1bnNpZ25lZCBpbnQgaW5jbHM7Ci0gIGFzZWN0aW9uICpvbGluZTsKLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0gIGFzZWN0aW9uICpvOwotCi0gIC8qIFdlIGNhbiBqdXN0IHNraXAgRFlOQU1JQyBmaWxlcywgdW5sZXNzIHRoaXMgaXMgYSBzdGF0aWMgbGluay4gICovCi0gIGlmICgoaW5wdXRfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgZmluZm8tPmluZm8tPnN0YXRpY19saW5rKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE1vdmUgYWxsIHRoZSBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICBzdHJpbmdzID0gTlVMTDsKLSAgc3ltZW50X2Jhc2UgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0gIGlzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGlucHV0X2JmZCk7Ci0gIG9zeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGlucHV0X2JmZCk7Ci0gIEJGRF9BU1NFUlQgKGxpbmVzeiA9PSBiZmRfY29mZl9saW5lc3ogKG91dHB1dF9iZmQpKTsKLQotICBuX3RtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX3RtYXNrOwotICBuX2J0c2hmdCA9IGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfbl9idHNoZnQ7Ci0KLSAgLyogRGVmaW5lIG1hY3JvcyBzbyB0aGF0IElTRkNOLCBldC4gYWwuLCBtYWNyb3Mgd29yayBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBOX1RNQVNLIG5fdG1hc2sKLSNkZWZpbmUgTl9CVFNIRlQgbl9idHNoZnQKLQotICBjb3B5ID0gZmFsc2U7Ci0gIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBjb3B5ID0gdHJ1ZTsKLSAgaGFzaCA9IHRydWU7Ci0gIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotICAgIGhhc2ggPSBmYWxzZTsKLQotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBpc3ltZXN6OwotICBzeW1faGFzaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBjc2VjdHBwID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzOwotICBkZWJ1Z19pbmRleCA9IHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZGljZXM7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIGluZGV4cCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLSAgb3V0cHV0X2luZGV4ID0gc3ltZW50X2Jhc2U7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotICBpbmNscyA9IDA7Ci0gIG9saW5lID0gTlVMTDsKLQotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0gICAgICBpbnQgc210eXAgPSAwOwotICAgICAgYm9vbGVhbiBza2lwOwotICAgICAgYm9vbGVhbiByZXF1aXJlOwotICAgICAgaW50IGFkZDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgKFBUUikgaXN5bXApOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgQ19FWFQgb3IgQ19ISURFWFQgc3ltYm9sLCB3ZSBuZWVkIHRoZSBjc2VjdAotICAgICAgICAgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0VYVCB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19ISURFWFQpCi0JewotCSAgQkZEX0FTU0VSVCAoaXN5bXAtPm5fbnVtYXV4ID4gMCk7Ci0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLAotCQkJCShQVFIpIChlc3ltICsgaXN5bWVzeiAqIGlzeW1wLT5uX251bWF1eCksCi0JCQkJaXN5bXAtPm5fdHlwZSwgaXN5bXAtPm5fc2NsYXNzLAotCQkJCWlzeW1wLT5uX251bWF1eCAtIDEsIGlzeW1wLT5uX251bWF1eCwKLQkJCQkoUFRSKSAmYXV4KTsKLQkgIHNtdHlwID0gU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApOwotCX0KLQotICAgICAgLyogTWFrZSBhIGNvcHkgb2YgKmlzeW1wIHNvIHRoYXQgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24KLQkgYWx3YXlzIHNlZXMgdGhlIG9yaWdpbmFsIHZhbHVlcy4gIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuCi0JIGFsd2F5cyByZWNvbXB1dGluZyB0aGUgc3ltYm9sIHZhbHVlIGV2ZW4gaWYgd2UgYXJlIHN0cmlwcGluZwotCSB0aGUgc3ltYm9sLiAgKi8KLSAgICAgIGlzeW0gPSAqaXN5bXA7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGluIHRoZSAubG9hZGVyIHNlY3Rpb24sIHN3YXAgb3V0IHRoZQotICAgICAgICAgLmxvYWRlciBzeW1ib2wgaW5mb3JtYXRpb24uICBJZiB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbAotICAgICAgICAgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBzeW1ib2wsIHRob3VnaCwgdGhlbiB3YWl0IHVudGlsIHdlIGdldAotICAgICAgICAgdG8gdGhlIGRlZmluaXRpb24uICAqLwotICAgICAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkgICYmICpzeW1faGFzaCAhPSBOVUxMCi0JICAmJiAoKnN5bV9oYXNoKS0+bGRzeW0gIT0gTlVMTAotCSAgJiYgKHNtdHlwICE9IFhUWV9FUgotCSAgICAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpKQotCXsKLQkgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKmxkc3ltOwotCi0JICBoID0gKnN5bV9oYXNoOwotCSAgbGRzeW0gPSBoLT5sZHN5bTsKLQkgIGlmIChpc3ltLm5fc2NudW0gPiAwKQotCSAgICB7Ci0JICAgICAgbGRzeW0tPmxfc2NudW0gPSAoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgICAgIGxkc3ltLT5sX3ZhbHVlID0gKGlzeW0ubl92YWx1ZQotCQkJCSsgKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgKCpjc2VjdHBwKS0+b3V0cHV0X29mZnNldAotCQkJCS0gKCpjc2VjdHBwKS0+dm1hKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbGRzeW0tPmxfc2NudW0gPSBpc3ltLm5fc2NudW07Ci0JICAgICAgbGRzeW0tPmxfdmFsdWUgPSBpc3ltLm5fdmFsdWU7Ci0JICAgIH0KLQotCSAgbGRzeW0tPmxfc210eXBlID0gc210eXA7Ci0JICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwCi0JICAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwKQotCSAgICAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLQkgICAgbGRzeW0tPmxfc210eXBlIHw9IExfSU1QT1JUOwotCSAgaWYgKCgoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgIT0gMAotCSAgICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKLQkgICAgICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpICE9IDApCi0JICAgIGxkc3ltLT5sX3NtdHlwZSB8PSBMX0VYUE9SVDsKLQkgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9FTlRSWSkgIT0gMCkKLQkgICAgbGRzeW0tPmxfc210eXBlIHw9IExfRU5UUlk7Ci0KLQkgIGxkc3ltLT5sX3NtY2xhcyA9IGF1eC54X2NzZWN0Lnhfc21jbGFzOwotCi0JICBpZiAobGRzeW0tPmxfaWZpbGUgPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICBlbHNlIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKChsZHN5bS0+bF9zbXR5cGUgJiBMX0lNUE9SVCkgPT0gMCkKLQkJbGRzeW0tPmxfaWZpbGUgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZCAqaW1wYmZkOwotCi0JCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgIGltcGJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCSAgICBpbXBiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKLQkJICBlbHNlCi0JCSAgICBpbXBiZmQgPSBOVUxMOwotCi0JCSAgaWYgKGltcGJmZCA9PSBOVUxMKQotCQkgICAgbGRzeW0tPmxfaWZpbGUgPSAwOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoaW1wYmZkLT54dmVjID09IGZpbmZvLT5vdXRwdXRfYmZkLT54dmVjKTsKLQkJICAgICAgbGRzeW0tPmxfaWZpbGUgPSB4Y29mZl9kYXRhIChpbXBiZmQpLT5pbXBvcnRfZmlsZV9pZDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGxkc3ltLT5sX3Bhcm0gPSAwOwotCi0JICBCRkRfQVNTRVJUIChoLT5sZGluZHggPj0gMCk7Ci0JICBCRkRfQVNTRVJUIChMRFNZTVNaID09IHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkc3ltKSk7Ci0JICB4Y29mZl9zd2FwX2xkc3ltX291dCAoZmluZm8tPm91dHB1dF9iZmQsIGxkc3ltLAotCQkJCWZpbmZvLT5sZHN5bSArIGgtPmxkaW5keCAtIDMpOwotCSAgaC0+bGRzeW0gPSBOVUxMOwotCi0JICAvKiBGaWxsIGluIHNuZW50cnkgbm93IHRoYXQgd2Uga25vdyB0aGUgdGFyZ2V0X2luZGV4LiAgKi8KLQkgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9FTlRSWSkgIT0gMAotCSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JICAgIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5zbmVudHJ5ID0KLQkgICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JfQotCi0gICAgICAqaW5kZXhwID0gLTE7Ci0KLSAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgIHJlcXVpcmUgPSBmYWxzZTsKLSAgICAgIGFkZCA9IDEgKyBpc3ltLm5fbnVtYXV4OwotCi0gICAgICAvKiBJZiB3ZSBhcmUgc2tpcHBpbmcgdGhpcyBjc2VjdCwgd2Ugd2FudCB0byBza2lwIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGlmICgqY3NlY3RwcCA9PSBOVUxMKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBJZiB3ZSBnYXJiYWdlIGNvbGxlY3RlZCB0aGlzIGNzZWN0LCB3ZSB3YW50IHRvIHNraXAgdGhpcwotICAgICAgICAgc3ltYm9sLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+Z2MKLQkgICYmICgoKmNzZWN0cHApLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwCi0JICAmJiAqY3NlY3RwcCAhPSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBBbiBYQ09GRiBsaW5rZXIgYWx3YXlzIHNraXBzIENfU1RBVCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGlzeW1wLT5uX3NjbGFzcyA9PSBDX1NUQVQpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIFdlIHNraXAgYWxsIGJ1dCB0aGUgZmlyc3QgVE9DIGFuY2hvci4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBpc3ltcC0+bl9zY2xhc3MgPT0gQ19ISURFWFQKLQkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzID09IFhNQ19UQzApCi0JewotCSAgaWYgKGZpbmZvLT50b2Nfc3ltaW5keCAhPSAtMSkKLQkgICAgc2tpcCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHRvY3ZhbCwgdG9jZW5kOwotCi0JICAgICAgdG9jdmFsID0gKCgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgKCpjc2VjdHBwKS0+b3V0cHV0X29mZnNldAotCQkJKyBpc3ltLm5fdmFsdWUKLQkJCS0gKCpjc2VjdHBwKS0+dm1hKTsKLQkgICAgICAvKiBXZSB3YW50IHRvIGZpbmQgb3V0IGlmIHRvY3ZhbCBpcyBhIGdvb2QgdmFsdWUgdG8gdXNlCi0gICAgICAgICAgICAgICAgIGFzIHRoZSBUT0MgYW5jaG9yLS10aGF0IGlzLCB3aGV0aGVyIHdlIGNhbiBhY2Nlc3MgYWxsCi0gICAgICAgICAgICAgICAgIG9mIHRoZSBUT0MgdXNpbmcgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdG9jdmFsLiAgVGhpcwotICAgICAgICAgICAgICAgICB0ZXN0IGFzc3VtZXMgdGhhdCB0aGUgVE9DIGNvbWVzIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgIG91dHB1dCBzZWN0aW9uLCBhcyBpdCBkb2VzIGluIHRoZSBkZWZhdWx0IGxpbmtlcgotICAgICAgICAgICAgICAgICBzY3JpcHQuICBGSVhNRTogVGhpcyBkb2Vzbid0IGhhbmRsZSAudG9jYnNzIHNlY3Rpb25zCi0gICAgICAgICAgICAgICAgIGNyZWF0ZWQgZnJvbSBYTUNfVEQgY29tbW9uIHN5bWJvbHMgY29ycmVjdGx5LiAgKi8KLQotCSAgICAgIHRvY2VuZCA9ICgoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0JICAgICAgaWYgKHRvY3ZhbCArIDB4MTAwMDAgPCB0b2NlbmQpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCJUT0Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHgxMDAwMDsgdHJ5IC1tbWluaW1hbC10b2Mgd2hlbiBjb21waWxpbmciKSwKLQkJICAgICAodW5zaWduZWQgbG9uZykgKHRvY2VuZCAtIHRvY3ZhbCkpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKHRvY3ZhbCArIDB4ODAwMCA8IHRvY2VuZCkKLQkJewotCQkgIGJmZF92bWEgdG9jYWRkOwotCi0JCSAgdG9jYWRkID0gdG9jZW5kIC0gKHRvY3ZhbCArIDB4ODAwMCk7Ci0JCSAgdG9jdmFsICs9IHRvY2FkZDsKLQkJICBpc3ltLm5fdmFsdWUgKz0gdG9jYWRkOwotCQl9Ci0KLQkgICAgICBmaW5mby0+dG9jX3N5bWluZHggPSBvdXRwdXRfaW5kZXg7Ci0JICAgICAgeGNvZmZfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpLT50b2MgPSB0b2N2YWw7Ci0JICAgICAgeGNvZmZfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpLT5zbnRvYyA9Ci0JCSgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgICAgcmVxdWlyZSA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcgYWxsIHN5bWJvbHMsIHdlIHdhbnQgdG8gc2tpcCB0aGlzIG9uZS4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBXZSBjYW4gc2tpcCByZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkgICYmIHNtdHlwID09IFhUWV9FUgotCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogV2UgY2FuIHNraXAgY29tbW9uIHN5bWJvbHMgaWYgdGhleSBnb3QgZGVmaW5lZCBzb21ld2hlcmUKLSAgICAgICAgIGVsc2UuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgJiYgc210eXAgPT0gWFRZX0NNCi0JICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5zZWN0aW9uICE9ICpjc2VjdHBwKQotCSAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiAhPSAqY3NlY3RwcCkpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIFNraXAgbG9jYWwgc3ltYm9scyBpZiB3ZSBhcmUgZGlzY2FyZGluZyB0aGVtLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfYWxsCi0JICAmJiBpc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0hJREVYVAotCSAgICAgIHx8IHNtdHlwICE9IFhUWV9TRCkpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIElmIHdlIHN0cmlwcGluZyBkZWJ1Z2dpbmcgc3ltYm9scywgYW5kIHRoaXMgaXMgYSBkZWJ1Z2dpbmcKLSAgICAgICAgIHN5bWJvbCwgdGhlbiBza2lwIGl0LiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcgotCSAgJiYgaXN5bS5uX3NjbnVtID09IE5fREVCVUcpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIElmIHNvbWUgc3ltYm9scyBhcmUgc3RyaXBwZWQgYmFzZWQgb24gdGhlIG5hbWUsIHdvcmsgb3V0IHRoZQotCSBuYW1lIGFuZCBkZWNpZGUgd2hldGhlciB0byBza2lwIHRoaXMgc3ltYm9sLiAgV2UgZG9uJ3QgaGFuZGxlCi0JIHRoaXMgY29ycmVjdGx5IGZvciBzeW1ib2xzIHdob3NlIG5hbWVzIGFyZSBpbiB0aGUgLmRlYnVnCi0JIHNlY3Rpb247IHRvIGdldCBpdCByaWdodCB3ZSB3b3VsZCBuZWVkIGEgbmV3IGJmZF9zdHJ0YWJfaGFzaAotCSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHN0cmluZyBnaXZlbiB0aGUgaW5kZXguICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sKQotCSAgJiYgKGRlYnVnX2luZGV4ID09IE5VTEwgfHwgKmRlYnVnX2luZGV4ID09ICh1bnNpZ25lZCBsb25nKSAtMSkpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgJmlzeW0sIGJ1Zik7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICgoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsCi0JCQkJICAgIGZhbHNlKSA9PSBOVUxMKSkKLQkgICAgICB8fCAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sCi0JCSAgJiYgKGlzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkJICAgICAgJiYgKGlzeW0ubl9zY2xhc3MgIT0gQ19ISURFWFQKLQkJCSAgfHwgc210eXAgIT0gWFRZX1NEKSkKLQkJICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkpCi0JICAgIHNraXAgPSB0cnVlOwotCX0KLQotICAgICAgLyogV2UgY2FuIG5vdCBza2lwIHRoZSBmaXJzdCBUT0MgYW5jaG9yLiAgKi8KLSAgICAgIGlmIChza2lwCi0JICAmJiByZXF1aXJlCi0JICAmJiBmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCXNraXAgPSBmYWxzZTsKLQotICAgICAgLyogV2Ugbm93IGtub3cgd2hldGhlciB3ZSBhcmUgdG8gc2tpcCB0aGlzIHN5bWJvbCBvciBub3QuICAqLwotICAgICAgaWYgKCEgc2tpcCkKLQl7Ci0JICAvKiBBZGp1c3QgdGhlIHN5bWJvbCBpbiBvcmRlciB0byBvdXRwdXQgaXQuICAqLwotCi0JICBpZiAoaXN5bS5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JICAgICAgJiYgaXN5bS5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGEgbG9uZyBuYW1lLiAgRW50ZXIgaXQgaW4gdGhlIHN0cmluZwotCQkgdGFibGUgd2UgYXJlIGJ1aWxkaW5nLiAgSWYgKmRlYnVnX2luZGV4ICE9IC0xLCB0aGUKLQkJIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBlbnRlcmVkIGluIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKGRlYnVnX2luZGV4ICE9IE5VTEwgJiYgKmRlYnVnX2luZGV4ICE9ICh1bnNpZ25lZCBsb25nKSAtMSkKLQkJaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9ICpkZWJ1Z19pbmRleDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgJmlzeW0sCi0JCQkJCQkJIChjaGFyICopIE5VTEwpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgbmFtZSwgaGFzaCwgY29weSk7Ci0JCSAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpc3ltLm5fc2NsYXNzICE9IENfQlNUQVQKLQkgICAgICAmJiBpc3ltLm5fc2NsYXNzICE9IENfRVNUQVQKLQkgICAgICAmJiBpc3ltLm5fc2NsYXNzICE9IENfREVDTAotCSAgICAgICYmIGlzeW0ubl9zY251bSA+IDApCi0JICAgIHsKLQkgICAgICBpc3ltLm5fc2NudW0gPSAoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgICAgIGlzeW0ubl92YWx1ZSArPSAoKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgKCpjc2VjdHBwKS0+b3V0cHV0X29mZnNldAotCQkJICAgICAgIC0gKCpjc2VjdHBwKS0+dm1hKTsKLQkgICAgfQotCi0JICAvKiBUaGUgdmFsdWUgb2YgYSBDX0ZJTEUgc3ltYm9sIGlzIHRoZSBzeW1ib2wgaW5kZXggb2YgdGhlCi0JICAgICBuZXh0IENfRklMRSBzeW1ib2wuICBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbAotCSAgICAgaXMgLTEuICBXZSB0cnkgdG8gZ2V0IHRoaXMgcmlnaHQsIGJlbG93LCBqdXN0IGJlZm9yZSB3ZQotCSAgICAgd3JpdGUgdGhlIHN5bWJvbHMgb3V0LCBidXQgaW4gdGhlIGdlbmVyYWwgY2FzZSB3ZSBtYXkKLQkgICAgIGhhdmUgdG8gd3JpdGUgdGhlIHN5bWJvbCBvdXQgdHdpY2UuICAqLwotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgaWYgKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLQkJICAmJiBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgIT0gKGxvbmcpIG91dHB1dF9pbmRleCkKLQkJewotCQkgIC8qIFdlIG11c3QgY29ycmVjdCB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIGVudHJ5LiAgKi8KLQkJICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7Ci0JCSAgaWYgKChiZmRfc2l6ZV90eXBlKSBmaW5mby0+bGFzdF9maWxlX2luZGV4ID49IHN5bWVudF9iYXNlKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgbGFzdCBDX0ZJTEUgc3ltYm9sIGlzIGluIHRoaXMgaW5wdXQgZmlsZS4gICovCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAoUFRSKSAmZmluZm8tPmxhc3RfZmlsZSwKLQkJCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLQkJCQkJCSAgICArICgoZmluZm8tPmxhc3RfZmlsZV9pbmRleAotCQkJCQkJCS0gc3ltZW50X2Jhc2UpCi0JCQkJCQkgICAgICAgKiBvc3ltZXN6KSkpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IHRoZSBsYXN0IENfRklMRQotCQkJIHN5bWJvbC4gIFdlIG5lZWQgdG8gd3JpdGUgaXQgb3V0IGFnYWluLiAgV2UKLQkJCSBib3Jyb3cgKm91dHN5bSB0ZW1wb3JhcmlseS4gICovCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAoUFRSKSAmZmluZm8tPmxhc3RfZmlsZSwKLQkJCQkJICAgICAoUFRSKSBvdXRzeW0pOwotCQkgICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCQkJICAgICArIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggKiBvc3ltZXN6KSwKLQkJCQkgICAgU0VFS19TRVQpICE9IDAKLQkJCSAgfHwgKGJmZF93cml0ZSAob3V0c3ltLCBvc3ltZXN6LCAxLCBvdXRwdXRfYmZkKQotCQkJICAgICAgIT0gb3N5bWVzeikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPSBvdXRwdXRfaW5kZXg7Ci0JICAgICAgZmluZm8tPmxhc3RfZmlsZSA9IGlzeW07Ci0JICAgIH0KLQotCSAgLyogVGhlIHZhbHVlIG9mIGEgQ19CSU5DTCBvciBDX0VJTkNMIHN5bWJvbCBpcyBhIGZpbGUgb2Zmc2V0Ci0gICAgICAgICAgICAgaW50byB0aGUgbGluZSBudW1iZXJzLiAgV2UgdXBkYXRlIHRoZSBzeW1ib2wgdmFsdWVzIHdoZW4KLSAgICAgICAgICAgICB3ZSBoYW5kbGUgdGhlIGxpbmUgbnVtYmVycy4gICovCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0JJTkNMCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0VJTkNMKQotCSAgICB7Ci0JICAgICAgaXN5bS5uX3ZhbHVlID0gZmluZm8tPmxpbmVfZmlsZXBvczsKLQkgICAgICArK2luY2xzOwotCSAgICB9Ci0KLQkgIC8qIE91dHB1dCB0aGUgc3ltYm9sLiAgKi8KLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLQotCSAgKmluZGV4cCA9IG91dHB1dF9pbmRleDsKLQotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JICAgIHsKLQkgICAgICBsb25nIGluZHg7Ci0JICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGluZHggPSAoKGVzeW0gLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJICAgICAgLyBpc3ltZXN6KTsKLQkgICAgICBoID0gb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgICAgICBoLT5pbmR4ID0gb3V0cHV0X2luZGV4OwotCSAgICB9Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBzeW1ib2wgaW4gdGhlIFRPQyB3aGljaCB3ZSBtYXkgaGF2ZSBtZXJnZWQKLSAgICAgICAgICAgICAoY2xhc3MgWE1DX1RDKSwgcmVtZW1iZXIgdGhlIHN5bWJvbCBpbmRleCBvZiB0aGUgVE9DCi0gICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfSElERVhUCi0JICAgICAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDCi0JICAgICAgJiYgKnN5bV9oYXNoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUICgoKCpzeW1faGFzaCktPmZsYWdzICYgWENPRkZfU0VUX1RPQykgPT0gMCk7Ci0JICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPnRvY19zZWN0aW9uICE9IE5VTEwpOwotCSAgICAgICgqc3ltX2hhc2gpLT51LnRvY19pbmR4ID0gb3V0cHV0X2luZGV4OwotCSAgICB9Ci0KLQkgIG91dHB1dF9pbmRleCArPSBhZGQ7Ci0JICBvdXRzeW0gKz0gYWRkICogb3N5bWVzejsKLQl9Ci0KLSAgICAgIGVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGlzeW1wICs9IGFkZDsKLSAgICAgIGNzZWN0cHAgKz0gYWRkOwotICAgICAgc3ltX2hhc2ggKz0gYWRkOwotICAgICAgaWYgKGRlYnVnX2luZGV4ICE9IE5VTEwpCi0JZGVidWdfaW5kZXggKz0gYWRkOwotICAgICAgKytpbmRleHA7Ci0gICAgICBmb3IgKC0tYWRkOyBhZGQgPiAwOyAtLWFkZCkKLQkqaW5kZXhwKysgPSAtMTsKLSAgICB9Ci0KLSAgLyogRml4IHVwIHRoZSBhdXggZW50cmllcyBhbmQgdGhlIENfQlNUQVQgc3ltYm9scy4gIFRoaXMgbXVzdCBiZQotICAgICBkb25lIGluIGEgc2VwYXJhdGUgcGFzcywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBjb3JyZWN0IHN5bWJvbAotICAgICBpbmRpY2VzIHVudGlsIHdlIGhhdmUgYWxyZWFkeSBkZWNpZGVkIHdoaWNoIHN5bWJvbHMgd2UgYXJlIGdvaW5nCi0gICAgIHRvIGtlZXAuICAqLwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBpc3ltZXN6OwotICBpc3ltcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5jc2VjdHM7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIGFkZCA9IDEgKyBpc3ltcC0+bl9udW1hdXg7Ci0KLSAgICAgIGlmICgqaW5kZXhwIDwgMCkKLQllc3ltICs9IGFkZCAqIGlzeW1lc3o7Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19CU1RBVCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLQkgICAgICB1bnNpZ25lZCBsb25nIGluZHg7Ci0KLQkgICAgICAvKiBUaGUgdmFsdWUgb2YgYSBDX0JTVEFUIHN5bWJvbCBpcyB0aGUgc3ltYm9sIHRhYmxlCi0gICAgICAgICAgICAgICAgIGluZGV4IG9mIHRoZSBjb250YWluaW5nIGNzZWN0LiAgKi8KLQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAob3V0cHV0X2JmZCwgKFBUUikgb3V0c3ltLCAoUFRSKSAmaXN5bSk7Ci0JICAgICAgaW5keCA9IGlzeW0ubl92YWx1ZTsKLQkgICAgICBpZiAoaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQl7Ci0JCSAgbG9uZyBzeW1pbmR4OwotCi0JCSAgc3ltaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICBpZiAoc3ltaW5keCA8IDApCi0JCSAgICBpc3ltLm5fdmFsdWUgPSAwOwotCQkgIGVsc2UKLQkJICAgIGlzeW0ubl92YWx1ZSA9IHN5bWluZHg7Ci0JCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwKLQkJCQkJIChQVFIpIG91dHN5bSk7Ci0JCX0KLQkgICAgfQotCi0JICBlc3ltICs9IGlzeW1lc3o7Ci0JICBvdXRzeW0gKz0gb3N5bWVzejsKLQotCSAgZm9yIChpID0gMDsgaSA8IGlzeW1wLT5uX251bWF1eCAmJiBlc3ltIDwgZXN5bV9lbmQ7IGkrKykKLQkgICAgewotCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCBpc3ltcC0+bl90eXBlLAotCQkJCSAgICBpc3ltcC0+bl9zY2xhc3MsIGksIGlzeW1wLT5uX251bWF1eCwKLQkJCQkgICAgKFBUUikgJmF1eCk7Ci0KLQkgICAgICBpZiAoaXN5bXAtPm5fc2NsYXNzID09IENfRklMRSkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGZpbGUgbmFtZSAob3Igc29tZSBjb21tZW50IHB1dCBpbiBieQotCQkgICAgIHRoZSBjb21waWxlcikuICBJZiBpdCBpcyBsb25nLCB3ZSBtdXN0IHB1dCBpdCBpbgotCQkgICAgIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCQkgIGlmIChhdXgueF9maWxlLnhfbi54X3plcm9lcyA9PSAwCi0JCSAgICAgICYmIGF1eC54X2ZpbGUueF9uLnhfb2Zmc2V0ICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAoYXV4LnhfZmlsZS54X24ueF9vZmZzZXQKLQkJCQkgID49IFNUUklOR19TSVpFX1NJWkUpOwotCQkgICAgICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCQkJewotCQkJICBzdHJpbmdzID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChpbnB1dF9iZmQpOwotCQkJICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZmlsZW5hbWUgPSBzdHJpbmdzICsgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQ7Ci0JCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGZpbGVuYW1lLAotCQkJCQkJIGhhc2gsIGNvcHkpOwotCQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGF1eC54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoaXN5bXAtPm5fc2NsYXNzID09IENfRVhUCi0JCQl8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19ISURFWFQpCi0JCSAgICAgICAmJiBpICsgMSA9PSBpc3ltcC0+bl9udW1hdXgpCi0JCXsKLQkJICAvKiBXZSBkb24ndCBzdXBwb3J0IHR5cGUgY2hlY2tpbmcuICBJIGRvbid0IGtub3cgaWYKLSAgICAgICAgICAgICAgICAgICAgIGFueWJvZHkgZG9lcy4gICovCi0JCSAgYXV4LnhfY3NlY3QueF9wYXJtaGFzaCA9IDA7Ci0JCSAgLyogSSBkb24ndCB0aGluayBhbnlib2R5IHVzZXMgdGhlc2UgZmllbGRzLCBidXQgd2UnZAotICAgICAgICAgICAgICAgICAgICAgYmV0dGVyIGNsb2JiZXIgdGhlbSBqdXN0IGluIGNhc2UuICAqLwotCQkgIGF1eC54X2NzZWN0Lnhfc3RhYiA9IDA7Ci0JCSAgYXV4LnhfY3NlY3QueF9zbnN0YWIgPSAwOwotCQkgIGlmIChTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCkgPT0gWFRZX0xEKQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBsb25nIGluZHg7Ci0KLQkJICAgICAgaW5keCA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JCSAgICAgIGlmIChpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQl7Ci0JCQkgIGxvbmcgc3ltaW5keDsKLQotCQkJICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkJICBpZiAoc3ltaW5keCA8IDApCi0JCQkgICAgYXV4Lnhfc3ltLnhfdGFnbmR4LmwgPSAwOwotCQkJICBlbHNlCi0JCQkgICAgYXV4Lnhfc3ltLnhfdGFnbmR4LmwgPSBzeW1pbmR4OwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoaXN5bXAtPm5fc2NsYXNzICE9IENfU1RBVCB8fCBpc3ltcC0+bl90eXBlICE9IFRfTlVMTCkKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCQkgIGlmIChJU0ZDTiAoaXN5bXAtPm5fdHlwZSkKLQkJICAgICAgfHwgSVNUQUcgKGlzeW1wLT5uX3NjbGFzcykKLQkJICAgICAgfHwgaXN5bXAtPm5fc2NsYXNzID09IENfQkxPQ0sKLQkJICAgICAgfHwgaXN5bXAtPm5fc2NsYXNzID09IENfRkNOKQotCQkgICAgewotCQkgICAgICBpbmR4ID0gYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7Ci0JCSAgICAgIGlmIChpbmR4ID4gMAotCQkJICAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQl7Ci0JCQkgIC8qIFdlIGxvb2sgZm9yd2FyZCB0aHJvdWdoIHRoZSBzeW1ib2wgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzeW1ib2wgd2UgYXJlIGdvaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluY2x1ZGUuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmVseSByaWdodC4gICovCi0JCQkgIHdoaWxlIChmaW5mby0+c3ltX2luZGljZXNbaW5keF0gPCAwCi0JCQkJICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCSAgICArK2luZHg7Ci0JCQkgIGlmIChpbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgIGluZHggPSBvdXRwdXRfaW5kZXg7Ci0JCQkgIGVsc2UKLQkJCSAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkJICBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA9IGluZHg7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBpbmR4ID0gYXV4Lnhfc3ltLnhfdGFnbmR4Lmw7Ci0JCSAgaWYgKGluZHggPiAwICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJICAgIHsKLQkJICAgICAgbG9uZyBzeW1pbmR4OwotCi0JCSAgICAgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCSAgICAgIGlmIChzeW1pbmR4IDwgMCkKLQkJCWF1eC54X3N5bS54X3RhZ25keC5sID0gMDsKLQkJICAgICAgZWxzZQotCQkJYXV4Lnhfc3ltLnhfdGFnbmR4LmwgPSBzeW1pbmR4OwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBDb3B5IG92ZXIgdGhlIGxpbmUgbnVtYmVycywgdW5sZXNzIHdlIGFyZSBzdHJpcHBpbmcKLQkJIHRoZW0uICBXZSBkbyB0aGlzIG9uIGEgc3ltYm9sIGJ5IHN5bWJvbCBiYXNpcyBpbgotCQkgb3JkZXIgdG8gbW9yZSBlYXNpbHkgaGFuZGxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0JICAgICAgaWYgKChpc3ltcC0+bl9zY2xhc3MgPT0gQ19FWFQKLQkJICAgfHwgaXN5bXAtPm5fc2NsYXNzID09IENfSElERVhUKQotCQkgICYmIGkgPT0gMAotCQkgICYmIGlzeW1wLT5uX251bWF1eCA+IDEKLQkJICAmJiBJU0ZDTiAoaXN5bXAtPm5fdHlwZSkKLQkJICAmJiBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyICE9IDApCi0JCXsKLQkJICBpZiAoZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX25vbmUKLQkJICAgICAgJiYgZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX3NvbWUpCi0JCSAgICBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gMDsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBlbmNfY291bnQ7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgbGlub2ZmOwotCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGxpbjsKLQotCQkgICAgICBvID0gKmNzZWN0cHA7Ci0JCSAgICAgIGVuY2xvc2luZyA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmVuY2xvc2luZzsKLQkJICAgICAgZW5jX2NvdW50ID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+bGluZW5vX2NvdW50OwotCQkgICAgICBpZiAob2xpbmUgIT0gZW5jbG9zaW5nKQotCQkJewotCQkJICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwKLQkJCQkJZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MsCi0JCQkJCVNFRUtfU0VUKSAhPSAwCi0JCQkgICAgICB8fCAoYmZkX3JlYWQgKGZpbmZvLT5saW5lbm9zLCBsaW5lc3osCi0JCQkJCSAgICBlbmNfY291bnQsIGlucHV0X2JmZCkKLQkJCQkgICE9IGxpbmVzeiAqIGVuY19jb3VudCkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICBvbGluZSA9IGVuY2xvc2luZzsKLQkJCX0KLQotCQkgICAgICBsaW5vZmYgPSAoYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cgotCQkJCS0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MpOwotCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgICAoUFRSKSAoZmluZm8tPmxpbmVub3MgKyBsaW5vZmYpLAotCQkJCQkgICAgICAgKFBUUikgJmxpbik7Ci0JCSAgICAgIGlmIChsaW4ubF9sbm5vICE9IDAKLQkJCSAgfHwgKChiZmRfc2l6ZV90eXBlKSBsaW4ubF9hZGRyLmxfc3ltbmR4Ci0JCQkgICAgICAhPSAoKGVzeW0KLQkJCQkgICAtIGlzeW1lc3oKLQkJCQkgICAtICgoYmZkX2J5dGUgKikKLQkJCQkgICAgICBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKSkKLQkJCQkgIC8gaXN5bWVzeikpKQotCQkJYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9IDA7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYmZkX2J5dGUgKmxpbnBlbmQsICpsaW5wOwotCQkJICBiZmRfdm1hIG9mZnNldDsKLQkJCSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLQotCQkJICBsaW4ubF9hZGRyLmxfc3ltbmR4ID0gKmluZGV4cDsKLQkJCSAgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmbGluLAotCQkJCQkJICAgIChQVFIpIChmaW5mby0+bGluZW5vcwotCQkJCQkJCSAgICsgbGlub2ZmKSk7Ci0KLQkJCSAgbGlucGVuZCA9IChmaW5mby0+bGluZW5vcwotCQkJCSAgICAgKyBlbmNfY291bnQgKiBsaW5lc3opOwotCQkJICBvZmZzZXQgPSAoby0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICArIG8tPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgLSBvLT52bWEpOwotCQkJICBmb3IgKGxpbnAgPSBmaW5mby0+bGluZW5vcyArIGxpbm9mZiArIGxpbmVzejsKLQkJCSAgICAgICBsaW5wIDwgbGlucGVuZDsKLQkJCSAgICAgICBsaW5wICs9IGxpbmVzeikKLQkJCSAgICB7Ci0JCQkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19pbiAoaW5wdXRfYmZkLCAoUFRSKSBsaW5wLAotCQkJCQkJICAgICAgIChQVFIpICZsaW4pOwotCQkJICAgICAgaWYgKGxpbi5sX2xubm8gPT0gMCkKLQkJCQlicmVhazsKLQkJCSAgICAgIGxpbi5sX2FkZHIubF9wYWRkciArPSBvZmZzZXQ7Ci0JCQkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsCi0JCQkJCQkJKFBUUikgJmxpbiwKLQkJCQkJCQkoUFRSKSBsaW5wKTsKLQkJCSAgICB9Ci0KLQkJCSAgY291bnQgPSAobGlucCAtIChmaW5mby0+bGluZW5vcyArIGxpbm9mZikpIC8gbGluZXN6OwotCi0JCQkgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPQotCQkJICAgIChvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudCAqIGxpbmVzeik7Ci0KLQkJCSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJCQlhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLAotCQkJCQlTRUVLX1NFVCkgIT0gMAotCQkJICAgICAgfHwgKGJmZF93cml0ZSAoZmluZm8tPmxpbmVub3MgKyBsaW5vZmYsCi0JCQkJCSAgICAgbGluZXN6LCBjb3VudCwgb3V0cHV0X2JmZCkKLQkJCQkgICE9IGxpbmVzeiAqIGNvdW50KSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudCArPSBjb3VudDsKLQotCQkJICBpZiAoaW5jbHMgPiAwKQotCQkJICAgIHsKLQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlpc3AsICppaXNwZW5kOwotCQkJICAgICAgbG9uZyAqaWluZHA7Ci0JCQkgICAgICBiZmRfYnl0ZSAqb29zOwotCQkJICAgICAgaW50IGlpYWRkOwotCi0JCQkgICAgICAvKiBVcGRhdGUgYW55IENfQklOQ0wgb3IgQ19FSU5DTCBzeW1ib2xzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHJlZmVyIHRvIGEgbGluZSBudW1iZXIgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSB3ZSBqdXN0IG91dHB1dC4gICovCi0JCQkgICAgICBpaXNwID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0JCQkgICAgICBpaXNwZW5kID0gKGlpc3AKLQkJCQkJICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpOwotCQkJICAgICAgaWluZHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0JCQkgICAgICBvb3MgPSBmaW5mby0+b3V0c3ltczsKLQkJCSAgICAgIHdoaWxlIChpaXNwIDwgaWlzcGVuZCkKLQkJCQl7Ci0JCQkJICBpZiAoKmlpbmRwID49IDAKLQkJCQkgICAgICAmJiAoaWlzcC0+bl9zY2xhc3MgPT0gQ19CSU5DTAotCQkJCQkgIHx8IGlpc3AtPm5fc2NsYXNzID09IENfRUlOQ0wpCi0JCQkJICAgICAgJiYgKChiZmRfc2l6ZV90eXBlKSBpaXNwLT5uX3ZhbHVlCi0JCQkJCSAgPj0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MgKyBsaW5vZmYpCi0JCQkJICAgICAgJiYgKChiZmRfc2l6ZV90eXBlKSBpaXNwLT5uX3ZhbHVlCi0JCQkJCSAgPCAoZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MKLQkJCQkJICAgICArIGVuY19jb3VudCAqIGxpbmVzeikpKQotCQkJCSAgICB7Ci0JCQkJICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpaXM7Ci0KLQkJCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgKFBUUikgb29zLAotCQkJCQkJCSAgICAoUFRSKSAmaWlzKTsKLQkJCQkgICAgICBpaXMubl92YWx1ZSA9Ci0JCQkJCShpaXNwLT5uX3ZhbHVlCi0JCQkJCSAtIGVuY2xvc2luZy0+bGluZV9maWxlcG9zCi0JCQkJCSAtIGxpbm9mZgotCQkJCQkgKyBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKTsKLQkJCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCQkJICAgICAoUFRSKSAmaWlzLAotCQkJCQkJCSAgICAgKFBUUikgb29zKTsKLQkJCQkgICAgICAtLWluY2xzOwotCQkJCSAgICB9Ci0KLQkJCQkgIGlpYWRkID0gMSArIGlpc3AtPm5fbnVtYXV4OwotCQkJCSAgaWYgKCppaW5kcCA+PSAwKQotCQkJCSAgICBvb3MgKz0gaWlhZGQgKiBvc3ltZXN6OwotCQkJCSAgaWlzcCArPSBpaWFkZDsKLQkJCQkgIGlpbmRwICs9IGlpYWRkOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmF1eCwgaXN5bXAtPm5fdHlwZSwKLQkJCQkgICAgIGlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLQkgICAgICBvdXRzeW0gKz0gb3N5bWVzejsKLQkgICAgICBlc3ltICs9IGlzeW1lc3o7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluZGV4cCArPSBhZGQ7Ci0gICAgICBpc3ltcCArPSBhZGQ7Ci0gICAgICBjc2VjdHBwICs9IGFkZDsKLSAgICB9Ci0KLSAgLyogSWYgd2Ugc3dhcHBlZCBvdXQgYSBDX0ZJTEUgc3ltYm9sLCBndWVzcyB0aGF0IHRoZSBuZXh0IENfRklMRQotICAgICBzeW1ib2wgd2lsbCBiZSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBuZXh0IGlucHV0IGZpbGUuICBJbiB0aGUKLSAgICAgbm9ybWFsIGNhc2UsIHRoaXMgd2lsbCBzYXZlIHVzIGZyb20gd3JpdGluZyBvdXQgdGhlIENfRklMRSBzeW1ib2wKLSAgICAgYWdhaW4uICAqLwotICBpZiAoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAhPSAtMQotICAgICAgJiYgKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0gICAgewotICAgICAgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlID0gb3V0cHV0X2luZGV4OwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmZmluZm8tPmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0gCQkJCSAgICArICgoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAtIHN5bWVudF9iYXNlKQotIAkJCQkgICAgICAgKiBvc3ltZXN6KSkpOwotICAgIH0KLQotICAvKiBXcml0ZSB0aGUgbW9kaWZpZWQgc3ltYm9scyB0byB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAob3V0c3ltID4gZmluZm8tPm91dHN5bXMpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgICAgb2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKSArIHN5bWVudF9iYXNlICogb3N5bWVzeiwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgb3V0c3ltIC0gZmluZm8tPm91dHN5bXMsIDEsCi0JCQlvdXRwdXRfYmZkKQotCSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKLQkJICAgKyAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpIC8gb3N5bWVzeikKLQkJICA9PSBvdXRwdXRfaW5kZXgpOwotCi0gICAgICBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgPSBvdXRwdXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIERvbid0IGxldCB0aGUgbGlua2VyIHJlbG9jYXRpb24gcm91dGluZXMgZGlzY2FyZCB0aGUgc3ltYm9scy4gICovCi0gIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoaW5wdXRfYmZkKTsKLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChpbnB1dF9iZmQpID0gdHJ1ZTsKLQotICAvKiBSZWxvY2F0ZSB0aGUgY29udGVudHMgb2YgZWFjaCBzZWN0aW9uLiAgKi8KLSAgZm9yIChvID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLSAgICAgIGlmICghIG8tPmxpbmtlcl9tYXJrKQotCXsKLQkgIC8qIFRoaXMgc2VjdGlvbiB3YXMgb21pdHRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgIHx8IG8tPl9yYXdfc2l6ZSA9PSAwCi0JICB8fCAoby0+ZmxhZ3MgJiBTRUNfSU5fTUVNT1JZKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBoYXZlIHNldCBmaWxlcG9zIGNvcnJlY3RseSBmb3IgdGhlIHNlY3Rpb25zIHdlIGNyZWF0ZWQgdG8KLSAgICAgICAgIHJlcHJlc2VudCBjc2VjdHMsIHNvIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyBzaG91bGQgd29yay4gICovCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgbykgIT0gTlVMTAotCSAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgbyktPmNvbnRlbnRzICE9IE5VTEwpCi0JY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKS0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIG8sIGZpbmZvLT5jb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIG8tPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGNvbnRlbnRzID0gZmluZm8tPmNvbnRlbnRzOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBpbnQgdGFyZ2V0X2luZGV4OwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBiZmRfdm1hIG9mZnNldDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGVuZDsKLQkgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGxvbmcgcl9zeW1uZHg7Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcy4gICovCi0JICB0YXJnZXRfaW5kZXggPSBvLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgaW50ZXJuYWxfcmVsb2NzID0gKHhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCQkgICAgIChpbnB1dF9iZmQsIG8sIGZhbHNlLCBmaW5mby0+ZXh0ZXJuYWxfcmVsb2NzLAotCQkJICAgICAgdHJ1ZSwKLQkJCSAgICAgIChmaW5mby0+c2VjdGlvbl9pbmZvW3RhcmdldF9pbmRleF0ucmVsb2NzCi0JCQkgICAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpKSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogQ2FsbCBwcm9jZXNzb3Igc3BlY2lmaWMgY29kZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbgotICAgICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLQkgIGlmICghIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCQkgICBpbnB1dF9iZmQsIG8sCi0JCQkJCSAgIGNvbnRlbnRzLAotCQkJCQkgICBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJCSAgIGZpbmZvLT5pbnRlcm5hbF9zeW1zLAotCQkJCQkgICB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5jc2VjdHMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG9mZnNldCA9IG8tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBvLT5vdXRwdXRfb2Zmc2V0IC0gby0+dm1hOwotCSAgaXJlbCA9IGludGVybmFsX3JlbG9jczsKLQkgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0JICByZWxfaGFzaCA9IChmaW5mby0+c2VjdGlvbl9pbmZvW3RhcmdldF9pbmRleF0ucmVsX2hhc2hlcwotCQkgICAgICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0JICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKykKLQkgICAgewotCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCBsZHJlbDsKLQkgICAgICBib29sZWFuIHF1aWV0OwotCi0JICAgICAgKnJlbF9oYXNoID0gTlVMTDsKLQotCSAgICAgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgc3ltYm9sIGluZGV4LiAgKi8KLQotCSAgICAgIGlyZWwtPnJfdmFkZHIgKz0gb2Zmc2V0OwotCi0JICAgICAgcl9zeW1uZHggPSBpcmVsLT5yX3N5bW5keDsKLQotCSAgICAgIGlmIChyX3N5bW5keCA9PSAtMSkKLQkJaCA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQloID0gb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9zeW1uZHhdOwotCi0JICAgICAgaWYgKHJfc3ltbmR4ICE9IC0xICYmIGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0JCXsKLQkJICBpZiAoaCAhPSBOVUxMCi0JCSAgICAgICYmIGgtPnNtY2xhcyAhPSBYTUNfVEQKLQkJICAgICAgJiYgKGlyZWwtPnJfdHlwZSA9PSBSX1RPQwotCQkJICB8fCBpcmVsLT5yX3R5cGUgPT0gUl9HTAotCQkJICB8fCBpcmVsLT5yX3R5cGUgPT0gUl9UQ0wKLQkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfVFJMCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX1RSTEEpKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgVE9DIHJlbGF0aXZlIHJlbG9jIHdpdGggYSBzeW1ib2wKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZC4gIFRoZSBzeW1ib2wgc2hvdWxkIGJlIHRoZSBvbmUgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHJlbG9jIGlzIGZvci4gIFdlIHdhbnQgdG8gbWFrZSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2MgYWdhaW5zdCB0aGUgVE9DIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdGhlIHN5bWJvbCBpdHNlbGYuICAqLwotCQkgICAgICBCRkRfQVNTRVJUIChoLT50b2Nfc2VjdGlvbiAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfU0VUX1RPQykgPT0gMCk7Ci0JCSAgICAgIGlmIChoLT51LnRvY19pbmR4ICE9IC0xKQotCQkJaXJlbC0+cl9zeW1uZHggPSBoLT51LnRvY19pbmR4OwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2ggKm47Ci0JCQkgIHN0cnVjdCB4Y29mZl9saW5rX3NlY3Rpb25faW5mbyAqc2k7Ci0KLQkJCSAgbiA9ICgoc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqKQotCQkJICAgICAgIGJmZF9hbGxvYyAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoKSkpOwotCQkJICBpZiAobiA9PSBOVUxMKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgc2kgPSBmaW5mby0+c2VjdGlvbl9pbmZvICsgdGFyZ2V0X2luZGV4OwotCQkJICBuLT5uZXh0ID0gc2ktPnRvY19yZWxfaGFzaGVzOwotCQkJICBuLT5oID0gaDsKLQkJCSAgbi0+cmVsID0gaXJlbDsKLQkJCSAgc2ktPnRvY19yZWxfaGFzaGVzID0gbjsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmIChoICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sLiAgKi8KLQkJICAgICAgaWYgKGgtPmluZHggPj0gMCkKLQkJCWlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBUaGlzIHN5bWJvbCBpcyBiZWluZyB3cml0dGVuIGF0IHRoZSBlbmQKLQkJCSAgICAgb2YgdGhlIGZpbGUsIGFuZCB3ZSBkbyBub3QgeWV0IGtub3cgdGhlCi0JCQkgICAgIHN5bWJvbCBpbmRleC4gIFdlIHNhdmUgdGhlIHBvaW50ZXIgdG8gdGhlCi0JCQkgICAgIGhhc2ggdGFibGUgZW50cnkgaW4gdGhlIHJlbF9oYXNoIGxpc3QuCi0JCQkgICAgIFdlIHNldCB0aGUgaW5keCBmaWVsZCB0byAtMiB0byBpbmRpY2F0ZQotCQkJICAgICB0aGF0IHRoaXMgc3ltYm9sIG11c3Qgbm90IGJlIHN0cmlwcGVkLiAgKi8KLQkJCSAgKnJlbF9oYXNoID0gaDsKLQkJCSAgaC0+aW5keCA9IC0yOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbcl9zeW1uZHhdOwotCi0JCSAgICAgIGlmIChpbmR4ID09IC0xKQotCQkJewotCQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppczsKLQotCQkJICAvKiBSZWxvY2F0aW9ucyBhZ2FpbnN0IGEgVEMwIFRPQyBhbmNob3IgYXJlCi0JCQkgICAgIGF1dG9tYXRpY2FsbHkgdHJhbnNmb3JtZWQgdG8gYmUgYWdhaW5zdAotCQkJICAgICB0aGUgVE9DIGFuY2hvciBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCQkJICBpcyA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgcl9zeW1uZHg7Ci0JCQkgIGlmIChpcy0+bl9zY2xhc3MgPT0gQ19ISURFWFQKLQkJCSAgICAgICYmIGlzLT5uX251bWF1eCA+IDApCi0JCQkgICAgewotCQkJICAgICAgUFRSIGF1eHB0cjsKLQkJCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkJCSAgICAgIGF1eHB0ciA9ICgoUFRSKQotCQkJCQkoKChiZmRfYnl0ZSAqKQotCQkJCQkgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCi0JCQkJCSArICgocl9zeW1uZHggKyBpcy0+bl9udW1hdXgpCi0JCQkJCSAgICAqIGlzeW1lc3opKSk7Ci0JCQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCBhdXhwdHIsCi0JCQkJCQkgICAgaXMtPm5fdHlwZSwgaXMtPm5fc2NsYXNzLAotCQkJCQkJICAgIGlzLT5uX251bWF1eCAtIDEsCi0JCQkJCQkgICAgaXMtPm5fbnVtYXV4LAotCQkJCQkJICAgIChQVFIpICZhdXgpOwotCQkJICAgICAgaWYgKFNNVFlQX1NNVFlQIChhdXgueF9jc2VjdC54X3NtdHlwKSA9PSBYVFlfU0QKLQkJCQkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzID09IFhNQ19UQzApCi0JCQkJaW5keCA9IGZpbmZvLT50b2Nfc3ltaW5keDsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGluZHggIT0gLTEpCi0JCQlpcmVsLT5yX3N5bW5keCA9IGluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXM7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkJCSAgLyogVGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIHdlIGFyZQotCQkJICAgICBzdHJpcHBpbmcuICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBoYW5kbGUKLQkJCSAgICAgdGhpcyBjYXNlLCBidXQgSSBkb24ndCB0aGluayBpdCdzIHdvcnRoIGl0LiAgKi8KLQkJCSAgaXMgPSBmaW5mby0+aW50ZXJuYWxfc3ltcyArIHJfc3ltbmR4OwotCi0JCQkgIG5hbWUgPSAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lCi0JCQkJICAoaW5wdXRfYmZkLCBpcywgYnVmKSk7Ci0JCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBvLAotCQkJCSAgaXJlbC0+cl92YWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgcXVpZXQgPSBmYWxzZTsKLQkgICAgICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQkJewotCQlkZWZhdWx0OgotCQkgIGlmIChoID09IE5VTEwKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkJICAgIGJyZWFrOwotCQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCWNhc2UgUl9QT1M6Ci0JCWNhc2UgUl9ORUc6Ci0JCWNhc2UgUl9STDoKLQkJY2FzZSBSX1JMQToKLQkJICAvKiBUaGlzIHJlbG9jIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSAubG9hZGVyCi0JCSAgICAgc2VjdGlvbi4gICovCi0JCSAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0JCSAgaWYgKHJfc3ltbmR4ID09IC0xKQotCQkgICAgbGRyZWwubF9zeW1uZHggPSAtMTsKLQkJICBlbHNlIGlmIChoID09IE5VTEwKLQkJCSAgIHx8IChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkJICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0c1tyX3N5bW5keF07Ci0JCSAgICAgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkJCXNlYyA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JCSAgICAgIGVsc2UKLQkJCXNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICAgICAgc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQotCQkgICAgICBpZiAoc3RyY21wIChzZWMtPm5hbWUsICIudGV4dCIpID09IDApCi0JCQlsZHJlbC5sX3N5bW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotCQkJbGRyZWwubF9zeW1uZHggPSAxOwotCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi5ic3MiKSA9PSAwKQotCQkJbGRyZWwubF9zeW1uZHggPSAyOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAgIChfKCIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgc2VjLT5uYW1lKTsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKLQkJCSAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpID09IDAKLQkJCSAgJiYgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSA9PSAwKQotCQkJewotCQkJICAvKiBXZSBhbHJlYWR5IGNhbGxlZCB0aGUgdW5kZWZpbmVkX3N5bWJvbAotCQkJICAgICBjYWxsYmFjayBmb3IgdGhpcyByZWxvY2F0aW9uLCBpbgotCQkJICAgICBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uLiAgRG9uJ3QKLQkJCSAgICAgaXNzdWUgYW55IG1vcmUgd2FybmluZ3MuICAqLwotCQkJICBxdWlldCA9IHRydWU7Ci0JCQl9Ci0JCSAgICAgIGlmIChoLT5sZGluZHggPCAwICYmICEgcXVpZXQpCi0JCQl7Ci0JCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAgIChfKCIlczogYCVzJyBpbiBsb2FkZXIgcmVsb2MgYnV0IG5vdCBsb2FkZXIgc3ltIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKLQkJICAgIH0KLQkJICBsZHJlbC5sX3J0eXBlID0gKGlyZWwtPnJfc2l6ZSA8PCA4KSB8IGlyZWwtPnJfdHlwZTsKLQkJICBsZHJlbC5sX3JzZWNubSA9IG8tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JCSAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+dGV4dHJvCi0JCSAgICAgICYmIHN0cmNtcCAoby0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIudGV4dCIpID09IDAKLQkJICAgICAgJiYgISBxdWlldCkKLQkJICAgIHsKLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiJXM6IGxvYWRlciByZWxvYyBpbiByZWFkLW9ubHkgc2VjdGlvbiAlcyIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkgYmZkX2dldF9zZWN0aW9uX25hbWUgKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkgICAgICAgby0+b3V0cHV0X3NlY3Rpb24pKTsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIHhjb2ZmX3N3YXBfbGRyZWxfb3V0IChvdXRwdXRfYmZkLCAmbGRyZWwsCi0JCQkJCWZpbmZvLT5sZHJlbCk7Ci0JCSAgQkZEX0FTU0VSVCAoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwpID09IExEUkVMU1opOwotCQkgICsrZmluZm8tPmxkcmVsOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9UT0M6Ci0JCWNhc2UgUl9HTDoKLQkJY2FzZSBSX1RDTDoKLQkJY2FzZSBSX1RSTDoKLQkJY2FzZSBSX1RSTEE6Ci0JCSAgLyogV2Ugc2hvdWxkIG5ldmVyIG5lZWQgYSAubG9hZGVyIHJlbG9jIGZvciBhIFRPQwotCQkgICAgIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCArPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbW9kaWZpZWQgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgICAgIChvLT5fY29va2VkX3NpemUgIT0gMAotCQkJCSAgICAgICA/IG8tPl9jb29rZWRfc2l6ZQotCQkJCSAgICAgICA6IG8tPl9yYXdfc2l6ZSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChpbnB1dF9iZmQpID0ga2VlcF9zeW1zOwotCi0gIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSN1bmRlZiBOX1RNQVNLCi0jdW5kZWYgTl9CVFNIRlQKLQotLyogV3JpdGUgb3V0IGEgbm9uLVhDT0ZGIGdsb2JhbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCAoaCwgcCkKLSAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gKHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKikgcDsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBiZmRfYnl0ZSAqb3V0c3ltOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQsIGp1c3Qgc2tpcCBpdC4gICovCi0gIGlmICh4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmdjCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHdlIG5lZWQgYSAubG9hZGVyIHNlY3Rpb24gZW50cnksIHdyaXRlIGl0IG91dC4gICovCi0gIGlmIChoLT5sZHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqbGRzeW07Ci0gICAgICBiZmQgKmltcGJmZDsKLQotICAgICAgbGRzeW0gPSBoLT5sZHN5bTsKLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCXsKLQkgIGxkc3ltLT5sX3ZhbHVlID0gMDsKLQkgIGxkc3ltLT5sX3NjbnVtID0gTl9VTkRFRjsKLQkgIGxkc3ltLT5sX3NtdHlwZSA9IFhUWV9FUjsKLQkgIGltcGJmZCA9IGgtPnJvb3QudS51bmRlZi5hYmZkOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBsZHN5bS0+bF92YWx1ZSA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0JICBsZHN5bS0+bF9zY251bSA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIGxkc3ltLT5sX3NtdHlwZSA9IFhUWV9TRDsKLQkgIGltcGJmZCA9IHNlYy0+b3duZXI7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwCi0JICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDApCi0JbGRzeW0tPmxfc210eXBlIHw9IExfSU1QT1JUOwotICAgICAgaWYgKCgoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgIT0gMAotCSAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwKQotCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSAhPSAwKQotCWxkc3ltLT5sX3NtdHlwZSB8PSBMX0VYUE9SVDsKLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9FTlRSWSkgIT0gMCkKLQlsZHN5bS0+bF9zbXR5cGUgfD0gTF9FTlRSWTsKLQotICAgICAgbGRzeW0tPmxfc21jbGFzID0gaC0+c21jbGFzOwotCi0gICAgICBpZiAobGRzeW0tPmxfaWZpbGUgPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCWxkc3ltLT5sX2lmaWxlID0gMDsKLSAgICAgIGVsc2UgaWYgKGxkc3ltLT5sX2lmaWxlID09IDApCi0JewotCSAgaWYgKChsZHN5bS0+bF9zbXR5cGUgJiBMX0lNUE9SVCkgPT0gMCkKLQkgICAgbGRzeW0tPmxfaWZpbGUgPSAwOwotCSAgZWxzZSBpZiAoaW1wYmZkID09IE5VTEwpCi0JICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKGltcGJmZC0+eHZlYyA9PSBvdXRwdXRfYmZkLT54dmVjKTsKLQkgICAgICBsZHN5bS0+bF9pZmlsZSA9IHhjb2ZmX2RhdGEgKGltcGJmZCktPmltcG9ydF9maWxlX2lkOwotCSAgICB9Ci0JfQotCi0gICAgICBsZHN5bS0+bF9wYXJtID0gMDsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+bGRpbmR4ID49IDApOwotICAgICAgQkZEX0FTU0VSVCAoTERTWU1TWiA9PSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9sZHN5bSkpOwotICAgICAgeGNvZmZfc3dhcF9sZHN5bV9vdXQgKG91dHB1dF9iZmQsIGxkc3ltLCBmaW5mby0+bGRzeW0gKyBoLT5sZGluZHggLSAzKTsKLSAgICAgIGgtPmxkc3ltID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgbmVlZHMgZ2xvYmFsIGxpbmthZ2UgY29kZSwgd3JpdGUgaXQgb3V0LiAgKi8KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24KLQkgID09IHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+bGlua2FnZV9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqcDsKLSAgICAgIGJmZF92bWEgdG9jb2ZmOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIHAgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPmNvbnRlbnRzICsgaC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICAgICAgLyogVGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBnbG9iYWwgbGlua2FnZSBjb2RlIGxvYWRzIGEKLSAgICAgICAgIHNwZWNpZmljIFRPQyBlbGVtZW50LiAgKi8KLSAgICAgIHRvY29mZiA9IChoLT5kZXNjcmlwdG9yLT50b2Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGgtPmRlc2NyaXB0b3ItPnRvY19zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCS0geGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnRvYyk7Ci0gICAgICBpZiAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfU0VUX1RPQykgIT0gMCkKLQl0b2NvZmYgKz0gaC0+ZGVzY3JpcHRvci0+dS50b2Nfb2Zmc2V0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgWENPRkZfR0xJTktfRklSU1QgfCAodG9jb2ZmICYgMHhmZmZmKSwgcCk7Ci0gICAgICBmb3IgKGkgPSAwLCBwICs9IDQ7Ci0JICAgaSA8IHNpemVvZiB4Y29mZl9nbGlua19jb2RlIC8gc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGVbMF07Ci0JICAgaSsrLCBwICs9IDQpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgeGNvZmZfZ2xpbmtfY29kZVtpXSwgcCk7Ci0gICAgfQotCi0gIC8qIElmIHdlIGNyZWF0ZWQgYSBUT0MgZW50cnkgZm9yIHRoaXMgc3ltYm9sLCB3cml0ZSBvdXQgdGhlIHJlcXVpcmVkCi0gICAgIHJlbG9jcy4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICp0b2NzZWM7Ci0gICAgICBhc2VjdGlvbiAqb3NlYzsKLSAgICAgIGludCBvaW5keDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCBsZHJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXJzeW07Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgaXJhdXg7Ci0KLSAgICAgIHRvY3NlYyA9IGgtPnRvY19zZWN0aW9uOwotICAgICAgb3NlYyA9IHRvY3NlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBvaW5keCA9IG9zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIGlyZWwgPSBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxvY3MgKyBvc2VjLT5yZWxvY19jb3VudDsKLSAgICAgIGlyZWwtPnJfdmFkZHIgPSAob3NlYy0+dm1hCi0JCSAgICAgICArIHRvY3NlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBoLT51LnRvY19vZmZzZXQpOwotICAgICAgaWYgKGgtPmluZHggPj0gMCkKLQlpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0gICAgICBlbHNlCi0JewotCSAgaC0+aW5keCA9IC0yOwotCSAgaXJlbC0+cl9zeW1uZHggPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0JfQotICAgICAgaXJlbC0+cl90eXBlID0gUl9QT1M7Ci0gICAgICBpcmVsLT5yX3NpemUgPSAzMTsKLSAgICAgIGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbF9oYXNoZXNbb3NlYy0+cmVsb2NfY291bnRdID0gTlVMTDsKLSAgICAgICsrb3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmxkaW5keCA+PSAwKTsKLSAgICAgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotICAgICAgbGRyZWwubF9zeW1uZHggPSBoLT5sZGluZHg7Ci0gICAgICBsZHJlbC5sX3J0eXBlID0gKDMxIDw8IDgpIHwgUl9QT1M7Ci0gICAgICBsZHJlbC5sX3JzZWNubSA9IG9pbmR4OwotICAgICAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKLSAgICAgICsrZmluZm8tPmxkcmVsOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGVtaXQgYSBzeW1ib2wgdG8gZGVmaW5lIGEgY3NlY3Qgd2hpY2ggaG9sZHMgdGhlCi0gICAgICAgICByZWxvYy4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQl7Ci0JICBpZiAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSA8PSBTWU1OTUxFTikKLQkgICAgc3RybmNweSAoaXJzeW0uX24uX25fbmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgU1lNTk1MRU4pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBoYXNoOwotCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgICAgIGhhc2ggPSB0cnVlOwotCSAgICAgIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotCQloYXNoID0gZmFsc2U7Ci0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJIGhhc2gsIGZhbHNlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpcnN5bS5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0JICAgICAgaXJzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLQkgICAgfQotCi0JICBpcnN5bS5uX3ZhbHVlID0gaXJlbC0+cl92YWRkcjsKLQkgIGlyc3ltLm5fc2NudW0gPSBvc2VjLT50YXJnZXRfaW5kZXg7Ci0JICBpcnN5bS5uX3NjbGFzcyA9IENfSElERVhUOwotCSAgaXJzeW0ubl90eXBlID0gVF9OVUxMOwotCSAgaXJzeW0ubl9udW1hdXggPSAxOwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpcnN5bSwgKFBUUikgb3V0c3ltKTsKLQkgIG91dHN5bSArPSBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0JICBtZW1zZXQgKCZpcmF1eCwgMCwgc2l6ZW9mIGlyYXV4KTsKLQkgIGlyYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9TRDsKLQkgIGlyYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9IDQ7Ci0JICBpcmF1eC54X2NzZWN0Lnhfc21jbGFzID0gWE1DX1RDOwotCi0JICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpcmF1eCwgVF9OVUxMLCBDX0hJREVYVCwKLQkJCQkgMCwgMSwgKFBUUikgb3V0c3ltKTsKLQkgIG91dHN5bSArPSBiZmRfY29mZl9hdXhlc3ogKG91dHB1dF9iZmQpOwotCi0JICBpZiAoaC0+aW5keCA+PSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlbid0IGdvaW5nIHRvIHdyaXRlIG91dCB0aGUgc3ltYm9scyBiZWxvdywgc28gd2UKLQkJIG5lZWQgdG8gd3JpdGUgdGhlbSBvdXQgbm93LiAgKi8KLQkgICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCSAgICAgKyAob2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpCi0JCQkJKiBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpKSksCi0JCQkgICAgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgb3V0c3ltIC0gZmluZm8tPm91dHN5bXMsIDEsCi0JCQkJIG91dHB1dF9iZmQpCi0JCSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSArPQotCQkob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpIC8gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotCSAgICAgIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBhIHNwZWNpYWxseSBkZWZpbmVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIHdyaXRlCi0gICAgIGl0IG91dC4gIFRoZSBmaXJzdCB3b3JkIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBjb2RlCi0gICAgIGl0c2VsZiwgdGhlIHNlY29uZCB3b3JkIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBUT0MsIGFuZCB0aGUgdGhpcmQKLSAgICAgd29yZCBpcyB6ZXJvLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDAKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24KLQkgID09IHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYXNlY3Rpb24gKm9zZWM7Ci0gICAgICBpbnQgb2luZHg7Ci0gICAgICBiZmRfYnl0ZSAqcDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhlbnRyeTsKLSAgICAgIGFzZWN0aW9uICplc2VjOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotICAgICAgYXNlY3Rpb24gKnRzZWM7Ci0KLSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgICAgb2luZHggPSBvc2VjLT50YXJnZXRfaW5kZXg7Ci0gICAgICBwID0gc2VjLT5jb250ZW50cyArIGgtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgICAgIGhlbnRyeSA9IGgtPmRlc2NyaXB0b3I7Ci0gICAgICBCRkRfQVNTRVJUIChoZW50cnkgIT0gTlVMTAotCQkgICYmIChoZW50cnktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaGVudHJ5LT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0gICAgICBlc2VjID0gaGVudHJ5LT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChlc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgZXNlYy0+b3V0cHV0X29mZnNldAotCQkgICArIGhlbnRyeS0+cm9vdC51LmRlZi52YWx1ZSksCi0JCSAgcCk7Ci0KLSAgICAgIGlyZWwgPSBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxvY3MgKyBvc2VjLT5yZWxvY19jb3VudDsKLSAgICAgIGlyZWwtPnJfdmFkZHIgPSAob3NlYy0+dm1hCi0JCSAgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlKTsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gZXNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfUE9TOwotICAgICAgaXJlbC0+cl9zaXplID0gMzE7Ci0gICAgICBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxfaGFzaGVzW29zZWMtPnJlbG9jX2NvdW50XSA9IE5VTEw7Ci0gICAgICArK29zZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLSAgICAgIGlmIChzdHJjbXAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIuZGF0YSIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChlc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5ic3MiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMjsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksCi0JICAgICBlc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsZHJlbC5sX3J0eXBlID0gKDMxIDw8IDgpIHwgUl9QT1M7Ci0gICAgICBsZHJlbC5sX3JzZWNubSA9IG9pbmR4OwotICAgICAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKLSAgICAgICsrZmluZm8tPmxkcmVsOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jLCBwICsgNCk7Ci0KLSAgICAgIHRzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKG91dHB1dF9iZmQsCi0JCQkJCSAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnNudG9jKTsKLQotICAgICAgKytpcmVsOwotICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKLQkJICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgNCk7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IHRzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpcmVsLT5yX3R5cGUgPSBSX1BPUzsKLSAgICAgIGlyZWwtPnJfc2l6ZSA9IDMxOwotICAgICAgZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsX2hhc2hlc1tvc2VjLT5yZWxvY19jb3VudF0gPSBOVUxMOwotICAgICAgKytvc2VjLT5yZWxvY19jb3VudDsKLQotICAgICAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0gICAgICBpZiAoc3RyY21wICh0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDA7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIuYnNzIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCSAgICAgdHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbGRyZWwubF9ydHlwZSA9ICgzMSA8PCA4KSB8IFJfUE9TOwotICAgICAgbGRyZWwubF9yc2Vjbm0gPSBvaW5keDsKLSAgICAgIHhjb2ZmX3N3YXBfbGRyZWxfb3V0IChvdXRwdXRfYmZkLCAmbGRyZWwsIGZpbmZvLT5sZHJlbCk7Ci0gICAgICArK2ZpbmZvLT5sZHJlbDsKLSAgICB9Ci0KLSAgaWYgKGgtPmluZHggPj0gMCB8fCBmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKG91dHN5bSA9PSBmaW5mby0+b3V0c3ltcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGgtPmluZHggIT0gLTIKLSAgICAgICYmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICB8fCAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGZhbHNlLCBmYWxzZSkKLQkJICA9PSBOVUxMKSkpKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKG91dHN5bSA9PSBmaW5mby0+b3V0c3ltcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGgtPmluZHggIT0gLTIKLSAgICAgICYmIChoLT5mbGFncyAmIChYQ09GRl9SRUZfUkVHVUxBUiB8IFhDT0ZGX0RFRl9SRUdVTEFSKSkgPT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChvdXRzeW0gPT0gZmluZm8tPm91dHN5bXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG1lbXNldCAoJmF1eCwgMCwgc2l6ZW9mIGF1eCk7Ci0KLSAgaC0+aW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICBpZiAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSA8PSBTWU1OTUxFTikKLSAgICBzdHJuY3B5IChpc3ltLl9uLl9uX25hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFzaDsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICAgICAgaGFzaCA9IHRydWU7Ci0gICAgICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLQloYXNoID0gZmFsc2U7Ci0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoYXNoLAotCQkJCSBmYWxzZSk7Ci0gICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaXN5bS5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgICBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0gICAgfQotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLSAgICB7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSAwOwotICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfRVI7Ci0gICAgfQotICBlbHNlIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICYmIGgtPnNtY2xhcyA9PSBYTUNfWE8pCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pKTsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9FUjsKLSAgICB9Ci0gIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbDsKLQotICAgICAgaXN5bS5uX3ZhbHVlID0gKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGgtPnJvb3QudS5kZWYudmFsdWUpOwotICAgICAgaXN5bS5uX3NjbnVtID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfSElERVhUOwotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9TRDsKLQotICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0hBU19TSVpFKSAhPSAwKQotCXsKLQkgIGZvciAobCA9IHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+c2l6ZV9saXN0OwotCSAgICAgICBsICE9IE5VTEw7Ci0JICAgICAgIGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKGwtPmggPT0gaCkKLQkJewotCQkgIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSBsLT5zaXplOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgewotICAgICAgaXN5bS5uX3ZhbHVlID0gKGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlzeW0ubl9zY251bSA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0NNOwotICAgICAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9IGgtPnJvb3QudS5jLnNpemU7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci0KLSAgaXN5bS5uX3R5cGUgPSBUX05VTEw7Ci0gIGlzeW0ubl9udW1hdXggPSAxOwotCi0gIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIG91dHN5bSk7Ci0gIG91dHN5bSArPSBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0gIGF1eC54X2NzZWN0Lnhfc21jbGFzID0gaC0+c21jbGFzOwotCi0gIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmF1eCwgVF9OVUxMLCBpc3ltLm5fc2NsYXNzLCAwLCAxLAotCQkJIChQVFIpIG91dHN5bSk7Ci0gIG91dHN5bSArPSBiZmRfY29mZl9hdXhlc3ogKG91dHB1dF9iZmQpOwotCi0gIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBoLT5zbWNsYXMgIT0gWE1DX1hPKQotICAgIHsKLSAgICAgIC8qIFdlIGp1c3Qgb3V0cHV0IGFuIFNEIHN5bWJvbC4gIE5vdyBvdXRwdXQgYW4gTEQgc3ltYm9sLiAgKi8KLQotICAgICAgaC0+aW5keCArPSAyOwotCi0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOwotICAgICAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfTEQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotCi0gICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZhdXgsIFRfTlVMTCwgQ19FWFQsIDAsIDEsCi0JCQkgICAgIChQVFIpIG91dHN5bSk7Ci0gICAgICBvdXRzeW0gKz0gYmZkX2NvZmZfYXV4ZXN6IChvdXRwdXRfYmZkKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkgKyAob2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpCi0JCSAgICAqIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCkpKSwKLQkJU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwgb3V0cHV0X2JmZCkKLQkgICE9IChiZmRfc2l6ZV90eXBlKSAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSArPQotICAgIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYSBsaW5rIG9yZGVyIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGdlbmVyYXRlIGEgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgZmluZm8sIG91dHB1dF9zZWN0aW9uLCBsaW5rX29yZGVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGFzZWN0aW9uICpoc2VjOwotICBiZmRfdm1hIGh2YWw7Ci0gIGJmZF92bWEgYWRkZW5kOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaF9wdHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCBsZHJlbDsKLQotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gc29tZWhvdyBsb2NhdGUgYSBzeW1ib2wgaW4gdGhlIHJpZ2h0IHNlY3Rpb24uICBUaGUKLSAgICAgICAgIHN5bWJvbCBtdXN0IGVpdGhlciBoYXZlIGEgdmFsdWUgb2YgemVybywgb3Igd2UgbXVzdCBhZGp1c3QKLSAgICAgICAgIHRoZSBhZGRlbmQgYnkgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBGSVhNRTogV3JpdGUgdGhpcwotICAgICAgICAgd2hlbiB3ZSBuZWVkIGl0LiAgVGhlIG9sZCBsaW5rZXIgY291bGRuJ3QgaGFuZGxlIHRoaXMgYW55aG93LiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0gICAgICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JICAgICAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JICAgICAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgewotICAgICAgaHNlYyA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICBodmFsID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBodmFsID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoc2VjID0gTlVMTDsKLSAgICAgIGh2YWwgPSAwOwotICAgIH0KLQotICBhZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLSAgaWYgKGhzZWMgIT0gTlVMTCkKLSAgICBhZGRlbmQgKz0gKGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICAgKyBoc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgaHZhbCk7Ci0KLSAgaWYgKGFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgb3V0cHV0X2JmZCwgYWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGZpbmZvLT5pbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJICBob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkgIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTdG9yZSB0aGUgcmVsb2MgaW5mb3JtYXRpb24gaW4gdGhlIHJpZ2h0IHBsYWNlLiAgSXQgd2lsbCBnZXQKLSAgICAgc3dhcHBlZCBhbmQgd3JpdHRlbiBvdXQgYXQgdGhlIGVuZCBvZiB0aGUgZmluYWxfbGluayByb3V0aW5lLiAgKi8KLQotICBpcmVsID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsb2NzCi0JICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0gIHJlbF9oYXNoX3B0ciA9IChmaW5mby0+c2VjdGlvbl9pbmZvW291dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMKLQkJICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0KLSAgbWVtc2V0IChpcmVsLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLQotICBpcmVsLT5yX3ZhZGRyID0gb3V0cHV0X3NlY3Rpb24tPnZtYSArIGxpbmtfb3JkZXItPm9mZnNldDsKLQotICBpZiAoaC0+aW5keCA+PSAwKQotICAgIGlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gLTIgdG8gZm9yY2UgdGhpcyBzeW1ib2wgdG8gZ2V0IHdyaXR0ZW4gb3V0LiAgKi8KLSAgICAgIGgtPmluZHggPSAtMjsKLSAgICAgICpyZWxfaGFzaF9wdHIgPSBoOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSAwOwotICAgIH0KLQotICBpcmVsLT5yX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgaXJlbC0+cl9zaXplID0gaG93dG8tPmJpdHNpemUgLSAxOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICBpcmVsLT5yX3NpemUgfD0gMHg4MDsKLQotICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICAvKiBOb3cgb3V0cHV0IHRoZSByZWxvYyB0byB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLQotICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLQotICBpZiAoaHNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0KLSAgICAgIHNlY25hbWUgPSBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZTsKLQotICAgICAgaWYgKHN0cmNtcCAoc2VjbmFtZSwgIi50ZXh0IikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDA7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHNlY25hbWUsICIuZGF0YSIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWNuYW1lLCAiLmJzcyIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwgc2VjbmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGgtPmxkaW5keCA8IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYCVzJyBpbiBsb2FkZXIgcmVsb2MgYnV0IG5vdCBsb2FkZXIgc3ltIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbGRyZWwubF9zeW1uZHggPSBoLT5sZGluZHg7Ci0gICAgfQotCi0gIGxkcmVsLmxfcnR5cGUgPSAoaXJlbC0+cl9zaXplIDw8IDgpIHwgaXJlbC0+cl90eXBlOwotICBsZHJlbC5sX3JzZWNubSA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gIHhjb2ZmX3N3YXBfbGRyZWxfb3V0IChvdXRwdXRfYmZkLCAmbGRyZWwsIGZpbmZvLT5sZHJlbCk7Ci0gICsrZmluZm8tPmxkcmVsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTb3J0IHJlbG9jcyBieSBWTUEuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci14Y29mZl9zb3J0X3JlbG9jcyAocDEsIHAyKQotICAgICBjb25zdCBQVFIgcDE7Ci0gICAgIGNvbnN0IFBUUiBwMjsKLXsKLSAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICpyMSA9IChjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgcDE7Ci0gIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcjIgPSAoY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICopIHAyOwotCi0gIGlmIChyMS0+cl92YWRkciA+IHIyLT5yX3ZhZGRyKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChyMS0+cl92YWRkciA8IHIyLT5yX3ZhZGRyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIHRoZSByZWxvY2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgUlMvNjAwMC9QT1dFUi9Qb3dlclBDLgotICAgVGhpcyBpcyBjdXJyZW50bHkgdGhlIG9ubHkgcHJvY2Vzc29yIHdoaWNoIHVzZXMgWENPRkY7IEkgaG9wZSB0aGF0Ci0gICB3aWxsIG5ldmVyIGNoYW5nZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCQkgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0IGhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICAvKiBSZWxvY2F0aW9uIHR5cGUgUl9SRUYgaXMgYSBzcGVjaWFsIHJlbG9jYXRpb24gdHlwZSB3aGljaCBpcwotICAgICAgICAgbWVyZWx5IHVzZWQgdG8gcHJldmVudCBnYXJiYWdlIGNvbGxlY3Rpb24gZnJvbSBvY2N1cnJpbmcgZm9yCi0gICAgICAgICB0aGUgY3NlY3QgaW5jbHVkaW5nIHRoZSBzeW1ib2wgd2hpY2ggaXQgcmVmZXJlbmNlcy4gICovCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPT0gUl9SRUYpCi0JY29udGludWU7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCSAgYWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQkgIGFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotCX0KLQotICAgICAgLyogV2UgYnVpbGQgdGhlIGhvd3RvIGluZm9ybWF0aW9uIG9uIHRoZSBmbHkuICAqLwotCi0gICAgICBob3d0by50eXBlID0gcmVsLT5yX3R5cGU7Ci0gICAgICBob3d0by5yaWdodHNoaWZ0ID0gMDsKLSAgICAgIGhvd3RvLnNpemUgPSAyOwotICAgICAgaG93dG8uYml0c2l6ZSA9IChyZWwtPnJfc2l6ZSAmIDB4MWYpICsgMTsKLSAgICAgIGhvd3RvLnBjX3JlbGF0aXZlID0gZmFsc2U7Ci0gICAgICBob3d0by5iaXRwb3MgPSAwOwotICAgICAgaWYgKChyZWwtPnJfc2l6ZSAmIDB4ODApICE9IDApCi0JaG93dG8uY29tcGxhaW5fb25fb3ZlcmZsb3cgPSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ7Ci0gICAgICBlbHNlCi0JaG93dG8uY29tcGxhaW5fb25fb3ZlcmZsb3cgPSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDsKLSAgICAgIGhvd3RvLnNwZWNpYWxfZnVuY3Rpb24gPSBOVUxMOwotICAgICAgaG93dG8ubmFtZSA9ICJpbnRlcm5hbCI7Ci0gICAgICBob3d0by5wYXJ0aWFsX2lucGxhY2UgPSB0cnVlOwotICAgICAgaWYgKGhvd3RvLmJpdHNpemUgPT0gMzIpCi0JaG93dG8uc3JjX21hc2sgPSBob3d0by5kc3RfbWFzayA9IDB4ZmZmZmZmZmY7Ci0gICAgICBlbHNlCi0JewotCSAgaG93dG8uc3JjX21hc2sgPSBob3d0by5kc3RfbWFzayA9ICgxIDw8IGhvd3RvLmJpdHNpemUpIC0gMTsKLQkgIGlmIChob3d0by5iaXRzaXplID09IDE2KQotCSAgICBob3d0by5zaXplID0gMTsKLQl9Ci0gICAgICBob3d0by5wY3JlbF9vZmZzZXQgPSBmYWxzZTsKLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotCSAgICAgIC8qIEhhY2sgdG8gbWFrZSBzdXJlIHdlIHVzZSB0aGUgcmlnaHQgVE9DIGFuY2hvciB2YWx1ZQotICAgICAgICAgICAgICAgICBpZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgdGhlIFRPQyBhbmNob3IuICAqLwotCSAgICAgIGlmIChzZWMtPm5hbWVbM10gPT0gJzAnCi0JCSAgJiYgc3RyY21wIChzZWMtPm5hbWUsICIudGMwIikgPT0gMCkKLQkJdmFsID0geGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnRvYzsKLQkgICAgICBlbHNlCi0JCXZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIHN5bS0+bl92YWx1ZQotCQkgICAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMAotCQkgICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBFdmVyeSBzeW1ib2wgaW4gYSBzaGFyZWQgb2JqZWN0IGlzIGRlZmluZWQgc29tZXdoZXJlLiAgKi8KLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogRG9uJ3QgdHJ5IHRvIHByb2Nlc3MgdGhlIHJlbG9jLiAgSXQgY2FuJ3QgaGVscCwgYW5kCi0gICAgICAgICAgICAgICAgIGl0IG1heSBnZW5lcmF0ZSBhbm90aGVyIGVycm9yLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSSB0b29rIHRoZSByZWxvY2F0aW9uIHR5cGUgZGVmaW5pdGlvbnMgZnJvbSB0d28gZG9jdW1lbnRzOgotCSB0aGUgUG93ZXJQQyBBSVggVmVyc2lvbiA0IEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UsIEZpcnN0Ci0JIEVkaXRpb24gKEFwcmlsIDE5OTIpLCBhbmQgdGhlIFBvd2VyT3BlbiBBQkksIEJpZy1FbmRpYW4KLQkgMzItQml0IEhhcmR3YXJlIEltcGxlbWVudGF0aW9uIChKdW5lIDMwLCAxOTk0KS4gIERpZmZlcmVuY2VzCi0JIGJldHdlZW4gdGhlIGRvY3VtZW50cyBhcmUgbm90ZWQgYmVsb3cuICAqLwotCi0gICAgICBzd2l0Y2ggKHJlbC0+cl90eXBlKQotCXsKLQljYXNlIFJfUlRCOgotCWNhc2UgUl9SUlRCSToKLQljYXNlIFJfUlJUQkE6Ci0JICAvKiBUaGVzZSByZWxvY3MgYXJlIGRlZmluZWQgYnkgdGhlIFBvd2VyUEMgQUJJIHRvIGJlCi0gICAgICAgICAgICAgcmVsYXRpdmUgYnJhbmNoZXMgd2hpY2ggdXNlIGhhbGYgb2YgdGhlIGRpZmZlcmVuY2UKLSAgICAgICAgICAgICBiZXR3ZWVuIHRoZSBzeW1ib2wgYW5kIHRoZSBwcm9ncmFtIGNvdW50ZXIuICBJIGNhbid0Ci0gICAgICAgICAgICAgcXVpdGUgZmlndXJlIG91dCB3aGVuIHRoaXMgaXMgdXNlZnVsLiAgVGhlc2UgcmVsb2NzIGFyZQotICAgICAgICAgICAgIG5vdCBkZWZpbmVkIGJ5IHRoZSBQb3dlck9wZW4gQUJJLiAgKi8KLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIDB4JTAyeCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgKHVuc2lnbmVkIGludCkgcmVsLT5yX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBSX1BPUzoKLQkgIC8qIFNpbXBsZSBwb3NpdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgUl9ORUc6Ci0JICAvKiBTaW1wbGUgbmVnYXRpdmUgcmVsb2NhdGlvbi4gICovCi0JICB2YWwgPSAtIHZhbDsKLQkgIGJyZWFrOwotCWNhc2UgUl9SRUw6Ci0JICAvKiBTaW1wbGUgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0JICBob3d0by5wY19yZWxhdGl2ZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIFJfVE9DOgotCSAgLyogVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICBUaGUgdmFsdWUgaW4gdGhlIGluc3RydWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIGlucHV0IGZpbGUgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBpbnB1dCBmaWxlIFRPQyB0bwotICAgICAgICAgICAgIHRoZSBkZXNpcmVkIGxvY2F0aW9uLiAgV2Ugd2FudCB0aGUgb2Zmc2V0IGZyb20gdGhlIGZpbmFsCi0gICAgICAgICAgICAgVE9DIHRvIHRoZSBkZXNpcmVkIGxvY2F0aW9uLiAgV2UgaGF2ZToKLQkgICAgICAgICBpc3ltID0gaVRPQyArIGluCi0JCSBpaW5zbiA9IGluICsgbwotCQkgb3N5bSA9IG9UT0MgKyBvbgotCQkgb2luc24gPSBvbiArIG8KLQkgICAgIHNvIHdlIG11c3QgY2hhbmdlIGluc24gYnkgb24gLSBpbi4KLQkgICAgICovCi0JY2FzZSBSX0dMOgotCSAgLyogR2xvYmFsIGxpbmthZ2UgcmVsb2NhdGlvbi4gIFRoZSB2YWx1ZSBvZiB0aGlzIHJlbG9jYXRpb24KLSAgICAgICAgICAgICBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnkgaW4gdGhlIFRPQyBzZWN0aW9uLiAgKi8KLQljYXNlIFJfVENMOgotCSAgLyogTG9jYWwgb2JqZWN0IFRPQyBhZGRyZXNzLiAgSSBjYW4ndCBmaWd1cmUgb3V0IHRoZQotICAgICAgICAgICAgIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBjYXNlIFJfR0wuICAqLwotCWNhc2UgUl9UUkw6Ci0JICAvKiBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIEEgVE9DIHJlbGF0aXZlIGxvYWQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgICAgICB3aGljaCBtYXkgYmUgY2hhbmdlZCB0byBhIGxvYWQgYWRkcmVzcyBpbnN0cnVjdGlvbi4KLSAgICAgICAgICAgICBGSVhNRTogV2UgZG9uJ3QgY3VycmVudGx5IGltcGxlbWVudCB0aGlzIG9wdGltaXphdGlvbi4gICovCi0JY2FzZSBSX1RSTEE6Ci0JICAvKiBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBUT0MgcmVsYXRpdmUgbG9hZAotICAgICAgICAgICAgIGFkZHJlc3MgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF5IGJlIGNoYW5nZWQgdG8gYSBsb2FkCi0gICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uICBGSVhNRTogSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4gICovCi0JICBpZiAoaCAhPSBOVUxMICYmIGgtPnNtY2xhcyAhPSBYTUNfVEQpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiBUT0MgcmVsb2MgYXQgMHgleCB0byBzeW1ib2wgYCVzJyB3aXRoIG5vIFRPQyBlbnRyeSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHJlbC0+cl92YWRkciwKLQkJICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIEJGRF9BU1NFUlQgKChoLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpID09IDApOwotCSAgICAgIHZhbCA9IChoLT50b2Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgaC0+dG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0KLQkgIHZhbCA9ICgodmFsIC0geGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnRvYykKLQkJIC0gKHN5bS0+bl92YWx1ZSAtIHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnRvYykpOwotCSAgYWRkZW5kID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgUl9CQToKLQkgIC8qIEFic29sdXRlIGJyYW5jaC4gIFdlIGRvbid0IHdhbnQgdG8gbWVzcyB3aXRoIHRoZSBsb3dlcgotICAgICAgICAgICAgIHR3byBiaXRzIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JY2FzZSBSX0NBSToKLQkgIC8qIFRoZSBQb3dlclBDIEFCSSBkZWZpbmVzIHRoaXMgYXMgYW4gYWJzb2x1dGUgY2FsbCB3aGljaAotICAgICAgICAgICAgIG1heSBiZSBtb2RpZmllZCB0byBiZWNvbWUgYSByZWxhdGl2ZSBjYWxsLiAgVGhlIFBvd2VyT3BlbgotICAgICAgICAgICAgIEFCSSBkb2VzIG5vdCBkZWZpbmUgdGhpcyByZWxvY2F0aW9uIHR5cGUuICAqLwotCWNhc2UgUl9SQkE6Ci0JICAvKiBBYnNvbHV0ZSBicmFuY2ggd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhCi0gICAgICAgICAgICAgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLQljYXNlIFJfUkJBQzoKLQkgIC8qIFRoZSBQb3dlclBDIEFCSSBkZWZpbmVzIHRoaXMgYXMgYW4gYWJzb2x1dGUgYnJhbmNoIHRvIGEKLSAgICAgICAgICAgICBmaXhlZCBhZGRyZXNzIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBhbiBhYnNvbHV0ZSBicmFuY2gKLSAgICAgICAgICAgICB0byBhIHN5bWJvbC4gIFRoZSBQb3dlck9wZW4gQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzCi0gICAgICAgICAgICAgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQljYXNlIFJfUkJSQzoKLQkgIC8qIFRoZSBQb3dlclBDIEFCSSBkZWZpbmVzIHRoaXMgYXMgYW4gYWJzb2x1dGUgYnJhbmNoIHRvIGEKLSAgICAgICAgICAgICBmaXhlZCBhZGRyZXNzIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBhIHJlbGF0aXZlIGJyYW5jaC4KLSAgICAgICAgICAgICBUaGUgUG93ZXJPcGVuIEFCSSBkb2VzIG5vdCBkZWZpbmUgdGhpcyByZWxvY2F0aW9uIHR5cGUuICAqLwotCSAgaG93dG8uc3JjX21hc2sgJj0gfjM7Ci0JICBob3d0by5kc3RfbWFzayA9IGhvd3RvLnNyY19tYXNrOwotCSAgYnJlYWs7Ci0JY2FzZSBSX0JSOgotCSAgLyogUmVsYXRpdmUgYnJhbmNoLiAgV2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlIGxvd2VyCi0gICAgICAgICAgICAgdHdvIGJpdHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQljYXNlIFJfQ1JFTDoKLQkgIC8qIFRoZSBQb3dlclBDIEFCSSBkZWZpbmVzIHRoaXMgYXMgYSByZWxhdGl2ZSBjYWxsIHdoaWNoIG1heQotICAgICAgICAgICAgIGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhbiBhYnNvbHV0ZSBjYWxsLiAgVGhlIFBvd2VyT3BlbgotICAgICAgICAgICAgIEFCSSBkb2VzIG5vdCBkZWZpbmUgdGhpcyByZWxvY2F0aW9uIHR5cGUuICAqLwotCWNhc2UgUl9SQlI6Ci0JICAvKiBBIHJlbGF0aXZlIGJyYW5jaCB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGFuCi0gICAgICAgICAgICAgYWJzb2x1dGUgYnJhbmNoLiAgRklYTUU6IFdlIGRvbid0IGltcGxlbWVudCB0aGlzLAotICAgICAgICAgICAgIGFsdGhvdWdoIHdlIHNob3VsZCBmb3Igc3ltYm9scyBvZiBzdG9yYWdlIG1hcHBpbmcgY2xhc3MKLSAgICAgICAgICAgICBYTUNfWE8uICAqLwotCSAgaG93dG8ucGNfcmVsYXRpdmUgPSB0cnVlOwotCSAgaG93dG8uc3JjX21hc2sgJj0gfjM7Ci0JICBob3d0by5kc3RfbWFzayA9IGhvd3RvLnNyY19tYXNrOwotCSAgYnJlYWs7Ci0JY2FzZSBSX1JMOgotCSAgLyogVGhlIFBvd2VyUEMgQUlYIEFCSSBkZXNjcmliZXMgdGhpcyBhcyBhIGxvYWQgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAgY2hhbmdlZCB0byBhIGxvYWQgYWRkcmVzcy4gIFRoZSBQb3dlck9wZW4gQUJJIHNheXMgdGhpcwotICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIGNhc2UgUl9QT1MuICAqLwotCSAgYnJlYWs7Ci0JY2FzZSBSX1JMQToKLQkgIC8qIFRoZSBQb3dlclBDIEFJWCBBQkkgZGVzY3JpYmVzIHRoaXMgYXMgYSBsb2FkIGFkZHJlc3MKLSAgICAgICAgICAgICB3aGljaCBtYXkgYmUgY2hhbmdlZCB0byBhIGxvYWQuICBUaGUgUG93ZXJPcGVuIEFCSSBzYXlzCi0gICAgICAgICAgICAgdGhpcyBpcyB0aGUgc2FtZSBhcyBSX1BPUy4gICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIHNlZSBhbiBSX0JSIG9yIFJfUkJSIHJlbG9jIHdoaWNoIGlzIGp1bXBpbmcgdG8gZ2xvYmFsCi0gICAgICAgICBsaW5rYWdlIGNvZGUsIGFuZCBpdCBpcyBmb2xsb3dlZCBieSBhbiBhcHByb3ByaWF0ZSBjcm9yIG5vcAotICAgICAgICAgaW5zdHJ1Y3Rpb24sIHdlIHJlcGxhY2UgdGhlIGNyb3Igd2l0aCBsd3ogcjIsMjAocjEpLiAgVGhpcwotICAgICAgICAgcmVzdG9yZXMgdGhlIFRPQyBhZnRlciB0aGUgZ2xpbmsgY29kZS4gIENvbnRyYXJpd2lzZSwgaWYgdGhlCi0gICAgICAgICBjYWxsIGlzIGZvbGxvd2VkIGJ5IGEgbHd6IHIyLDIwKHIxKSwgYnV0IHRoZSBjYWxsIGlzIG5vdAotICAgICAgICAgZ29pbmcgdG8gZ2xvYmFsIGxpbmthZ2UgY29kZSwgd2UgY2FuIHJlcGxhY2UgdGhlIGxvYWQgd2l0aCBhCi0gICAgICAgICBjcm9yLiAgKi8KLSAgICAgIGlmICgocmVsLT5yX3R5cGUgPT0gUl9CUiB8fCByZWwtPnJfdHlwZSA9PSBSX1JCUikKLQkgICYmIGggIT0gTlVMTAotCSAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSArIDgKLQkgICAgICA8PSBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpKQotCXsKLQkgIGJmZF9ieXRlICpwbmV4dDsKLQkgIHVuc2lnbmVkIGxvbmcgbmV4dDsKLQotCSAgcG5leHQgPSBjb250ZW50cyArIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpICsgNDsKLQkgIG5leHQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIHBuZXh0KTsKLQotCSAgLyogVGhlIF9wdHJnbCBmdW5jdGlvbiBpcyBtYWdpYy4gIEl0IGlzIHVzZWQgYnkgdGhlIEFJWAotICAgICAgICAgICAgIGNvbXBpbGVyIHRvIGNhbGwgYSBmdW5jdGlvbiB0aHJvdWdoIGEgcG9pbnRlci4gICovCi0JICBpZiAoaC0+c21jbGFzID09IFhNQ19HTAotCSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIi5fcHRyZ2wiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKG5leHQgPT0gMHg0ZGVmN2I4MgkJLyogY3JvciAxNSwxNSwxNSAqLwotCQkgIHx8IG5leHQgPT0gMHg0ZmZmZmI4MikJLyogY3JvciAzMSwzMSwzMSAqLwotCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4ODA0MTAwMTQsIHBuZXh0KTsgLyogbHd6IHIxLDIwKHIxKSAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobmV4dCA9PSAweDgwNDEwMDE0KQkJLyogbHd6IHIxLDIwKHIxKSAqLwotCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4NGZmZmZiODIsIHBuZXh0KTsgLyogY3JvciAzMSwzMSwzMSAqLwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBIFBDIHJlbGF0aXZlIHJlbG9jIGluY2x1ZGVzIHRoZSBzZWN0aW9uIGFkZHJlc3MuICAqLwotICAgICAgaWYgKGhvd3RvLnBjX3JlbGF0aXZlKQotCWFkZGVuZCArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlICgmaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsCi0JCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJdmFsLCBhZGRlbmQpOwotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkgICAgY2hhciBob3d0b19uYW1lWzEwXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgIHNwcmludGYgKGhvd3RvX25hbWUsICIweCUwMngiLCByZWwtPnJfdHlwZSk7Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvX25hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL0NoYW5nZUxvZyBiL2JpbnV0aWxzL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiMWY4Ni4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQ3ICswLDAgQEAKLTE5OTktMTEtMjUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfbm90ZSk6IENoYW5nZSBhcmcgZnJvbSBFbGZfRXh0ZXJuYWxfTm90ZQotCXRvIEVsZjMyX0ludGVybmFsX05vdGUsIHdoaWNoIGFsc28gdHVybnMgdGhlIGZ1bmN0aW9uIGJvZHkKLQlpbnRvIGxpdHRsZSBtb3JlIHRoYW4gYSBjYWxsIHRvIHByaW50Zi4KLQkocHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnQpOiAgU3Vic3RhbnRpYWxseSByZXdyaXR0ZW4KLQl0byBwcm9wZXJseSBoYW5kbGUgY2FzZSB3aGVyZSB0YXJnZXQgYW5kIGhvc3QgYXJlIGRpZmZlcmVudAotCWVuZGlhbm5lc3MsIGhhbmRsZSBub3RlIHNlY3Rpb25zIHdpdGggcGFkZGluZywgYW5kIGFkZCBzb21lCi0JY3J1ZnQgdG8gaGFuZGxlIG5vdGVzIHdpdGggdW50ZXJtaW5hdGVkIG5hbWUgZGF0YS4KLQotMTk5OS0xMS0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogUmVmb3JtYXQuCi0JKHN0cmlwX3VzYWdlKTogUmVmb3JtYXQuCi0KLTE5OTktMTEtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBPdmVyaGF1bCBvdXRwdXQ6ICBPbmUgbGluZSBwZXIgc3dpdGNoLgotCVRleHR1YWwgZGVzY3JpcHRpb24gb2YgZWFjaCBzd2l0Y2guICBEaXN0aW5ndWlzaCBiZXR3ZWVuCi0Jb3B0aW9uYWwgc3dpdGNoZXMgYW5kIHJlcXVpcmVkIHN3aXRjaGVzLgotCShsb25nX29wdGlvbnMpOiBBZGQgJ2cnLCAnRycgYW5kICd6JyBzaG9ydCBvcHRpb25zLgotCShtYWluKTogRGlzdGluZ3Vpc2ggYmV0d2VlbiBvcHRpb25hbCBzd2l0Y2hlcyBhbmQgcmVxdWlyZWQKLQlzd2l0Y2hlcy4KLQotCSogYmludXRpbHMudGV4aTogQWRkIC1nIC1HIGFuZCAteiBzaG9ydCBvcHRpb25zIGZvcgotCS0tZGVidWdnaW5nLCAtLXN0YWJzIGFuZCAtLWRpc2Fzc2VtYmxlLXplcm9lcy4KLQotMTk5OS0xMS0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChmbHVzaF9wYWdlKTogQ2xpcCBzaG9ydCB2YWx1ZXMgdG8gcHJldmVudCB3YXJuaW5ncwotCWZyb20gdGhlIGFzc2VtYmxlci4KLQlDaGFuZ2UgZGVmYXVsdCBtY29yZSBtYWNoaW5lIG5hbWUgdG8gJ21jb3JlLWxlJyBhbmQgcmVuYW1lCi0JYmlnLWVuZGlhbiB2ZXJzaW9uIHRvICdtY29yZS1iZScuIAotCi0xOTk5LTEwLTI3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2JmZCk6IEJyZWFrIGludG8gdHdvIGZ1bmN0aW9ucy4gIFRoZQotCWFjdHVhbCBkdW1waW5nIGNvZGUgbW92ZXMgdG8gZHVtcF9iZmQuICBJZiBiZmQgaXMgbm90Ci0JdW5hbWJpZ3VvdXNseSByZWNvZ25pemVkIGFzIGEgYmZkX29iamVjdCwgYXR0ZW1wdCB0byBkdW1wCi0JaXQgYXMgYSBiZmRfY29yZS4KLQkoZHVtcF9iZmQpOiBOZXcgZnVuY3Rpb24uCi0KLTE5OTktMTAtMjYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoYXNzZW1ibGVfZmlsZSk6IFJlbW92ZSBzcHVyaW91cyB0ZXN0IG9mIGV4cF9uYW1lLgotCi0xOTk5LTEwLTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHN0cnVjdCBtYWMpOiBBZGQgbmV3IGZpZWxkICdob3dfZGVmYXVsdF9hc19zd2l0Y2hlcycuCi0JKG10YWJsZSk6IEluaXRpYWxpc2UgbmV3IGZpZWxkLiAgU29tZSBtYWNoaW5lcyBoYXZlIGEgbm9uIGVtcHR5Ci0Jc3RyaW5nIGZvciB0aGlzIGZpZWxkLgotCShIT1dfQkZEX1RBUkdFVCk6IFVuZGVmaW5lIGFuZCByZXBsYWNlIHdpdGguLi4KLQkoSE9XX0JGRF9SRUFEX1RBUkdFVCk6IE5ldyBtYWNybzogYmZkIHRhcmdldCB0byB1c2Ugd2hlbiBvcGVuaW5nIGEKLQlmaWxlIGZvciByZWFkaW5nLiAgVGhpcyBpcyBzZXQgdG8gMCBzbyB0aGF0IGFueSByZWNvZ25pc2FibGUgYmZkCi0JZm9ybWF0IGNhbiBiZSByZWFkLgotCShIT1dfQkZEX1dSSVRFX1RBUkdFVCk6IE5ldyBtYWNybzogYmZkIHRhcmdldCB0byB1c2Ugd2hlbiBvcGVuaW5nCi0JYSBmaWxlIGZvciB3cml0aW5nLiAgVGhpcyBpcyBzZXQgdG8gdGhlIHRhcmdldCBtYWNoaW5lIHR5cGUuCi0JKEFTTV9TV0lUQ0hFUyk6IE5ldyBtYWNybzogZGVmYXVsdCBzd2l0Y2hlcyB0byB1c2Ugd2hlbiBhc3NlbWJsaW5nCi0JYSBmaWxlLgotCShhc3NlbWJsZV9maWxlKTogTmV3IGZ1bmN0aW9uOiBBc3NlbWJsZSBhIHNvdXJjZSBmaWxlIGludG8gYQotCWRlc3RpbmF0aW9uIG9iamVjdCBmaWxlLgotCShnZW5fZXhwX2ZpbGUpOiBVc2UgYXNzZW1ibGVfZmlsZSB0byBjcmVhdGUgdGhlIGV4cCBmaWxlLgotCShtYWtlX29uZV9saWJfZmlsZSk6IFVzZSBhc3NlbWJsZV9maWxlIHRvIGNyZWF0ZSB0aGUgbGliIGZpbGUuCi0JT3BlbiBvdXRwdXQgZmlsZSB1c2UgSE9XX0JGRF9XUklURV9UQVJHRVQgYW5kIGlucHV0IGZpbGVzIHVzaW5nCi0JSE9XX0JGRF9SRUFEX1RBUkdFVC4KLQkobWFrZV9oZWFkKTogVXNlIGFzc2VtYmxlX2ZpbGUgdG8gY3JlYXRlIHRoZSBoZWFkIGZpbGUuCi0JKG1ha2VfdGFpbCk6IFVzZSBhc3NlbWJsZV9maWxlIHRvIGNyZWF0ZSB0aGUgdGFpbCBmaWxlLgotCShnZW5fbGliX2ZpbGUpOiBPcGVuIG91dHB1dCBmaWxlIHVzZSBIT1dfQkZEX1dSSVRFX1RBUkdFVC4KLQotMTk5OS0xMC0xNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFyLmMgKG5vcm1hbGl6ZSk6IEZpeCBmdWxsX3BhdGhuYW1lIGNvZGUuCi0KLTE5OTktMTAtMDggIEJlbiBFbGxpc3RvbiAgPGJqZUBjeWdudXMuY29tPgotCi0gICAgICAgICogYmludXRpbHMudGV4aTogU29tZSByZXdvcmRpbmcgYW5kIGNsYXJpZmljYXRpb25zLgotCi0xOTk5LTA5LTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkeW5hbWljX3NlZ21lbnRfcGFyaXNjX3ZhbCk6IFByaW50IDAgZm9yIERMRF9GTEFHUyBpZgotCXRoZSB2YWx1ZSBpcyB6ZXJvLgotCShwcm9jZXNzX3N5bWJvbF90YWJsZSk6IERvbid0IHByaW50IGhpc3RvZ3JhbSBpZiBoYXNoIHRhYmxlIGlzIGVtcHR5LgotCi0xOTk5LTA5LTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfcGFyaXNjX2R5bmFtaWNfdHlwZSk6IEhhbmRsZSBEVF9IUF9HU1RfKiB2YWx1ZXMuCi0KLTE5OTktMDktMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGdldF9zeW1ib2xfdHlwZSk6IEFkZCBzdXBwb3J0IGZvciBIUFVYIGFuZCBQQVJJU0MKLQlzcGVjaWZpYyBzeW1ib2wgdHlwZXMuCi0KLQkqIHJlYWRlbGYuYzogQWRkIEhQVVggYW5kIFBBUklTQyBleHRlbnNpb25zIHRvIGR5bmFtaWMgYW5kIHByb2dyYW0KLQloZWFkZXIgdGFibGUgcHJpbnRpbmcuCi0KLQkqIHJlYWRlbGYuYyAoZ2V0X21hY2hpbmVfZmxhZ3MpOiBBZGQgaGFuZGxpbmcgb2YgUEFSSVNDLgotCi0xOTk5LTA5LTI5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGxsdG9vbC5jIChzY2FuX2RyZWN0dmVfc3ltYm9scyk6IEhhbmRsZSB0eXBlIHRhZ3MgaW4gZXhwb3J0ZWQKLQlzeW1ib2xzLgotCShzY2FuX2ZpbHRlcmVkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotMTk5OS0wOS0xOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlc3JjLmMgKHdyaXRlX3JjX3JjZGF0YSk6IEZpeCBsb2NhbCB2YXJpYWJsZSBzaGFkb3dpbmcKLQlwcm9ibGVtLiAgSWYgUkNEQVRBX0JVRkZFUiBkYXRhIGNhbiBiZSByZWFkIGFzIHN0cmluZ3MsIG1vZGlmeQotCWNvZGUgdG8gcHJpbnQgdGhlIHN0cmluZ3MgYXMgY29tbWVudHMuCi0JKiByZXNyZXMuYzogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSh3cml0ZV9yZXNfZGF0YSwgcmVhZF9yZXNfZGF0YSk6IERvbid0IHB1dCB0aGUgcHJvZ3JhbSBuYW1lIGluIHRoZQotCWVycm9yIG1lc3NhZ2U7IGZhdGFsIGFscmVhZHkgcHV0cyBpdCB0aGVyZS4KLQotMTk5OS0wOS0xNCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQ2Fub25pY2FsaXphdGlvbiBvZiB0YXJnZXQgbmFtZXMpOiBSZW1vdmUgYWRkaW5nCi0JJHtDT05GSUdfU0hFTEx9IGluIGZyb250IG9mICRhY19jb25maWdfc3ViLCBzaW5jZSBhdXRvY29uZmlnIDIuMTQKLQlnZW5lcmF0ZXMgJGFjX2NvbmZpZ19zdWIgd2l0aCBhICR7Q09ORklHX1NIRUxMfSBhbHJlYWR5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYXIuYyAobWFpbik6IENsZWFyIG91dHB1dF9maWxlIGlmIHdlIGRvbid0IGNoYW5nZSB0aGUgYXJjaGl2ZS4KLQkoZGVsZXRlX21lbWJlcnMsIHJlcGxhY2VfbWVtYmVycyk6IExpa2V3aXNlLgotCi0xOTk5LTA5LTEyICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMpOiBJZiB3aWRlX291dHB1dCwgcHJpbnQgRmxhZ3MgaGVhZGVyLgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBQcmludCBhbnkgY29tZGF0IGluZm9ybWF0aW9uLgotCi0JKiBvYmpjb3B5LmMgKHBhcnNlX2ZsYWdzKTogSGFuZGxlICJub2xvYWQiLCAiZGVidWciLCBhbmQgInNoYXJlIi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgbmV3IGZsYWdzLgotCi0JKiBhci5jIChjb3VudGVkX25hbWVfbW9kZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvdW50ZWRfbmFtZV9jb3VudGVyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWFwX292ZXJfbWVtYmVycyk6IEhhbmRsZSBjb3VudGVkIG1vZGUuCi0JKHVzYWdlKTogTWVudGlvbiBOIG1vZGlmaWVyLgotCShtYWluKTogSGFuZGxlIE4gbW9kaWZpZXIuCi0JKGRlbGV0ZV9tZW1iZXJzKTogSGFuZGxlIGNvdW50ZWQgbW9kZS4KLQkqIGJpbnV0aWxzLnRleGksIGFyLjE6IERvY3VtZW50IE4gbW9kaWZpZXIuCi0KLQkqIGFyLmMgKHByaW50X2NvbnRlbnRzKTogQ2hhbmdlIHByaW50aW5nIG9mIG1lbWJlciBuYW1lIGZvcgotCVBPU0lYLjIgY29uZm9ybWFuY2UuCi0KLQkqIGFyLmMgKG91dHB1dF9maWxlbmFtZSk6IE1ha2UgY29uc3QuCi0JKG9wZW5faW5hcmNoKTogSWYgY3JlYXRpbmcgYSBuZXcgZW1wdHkgYXJjaGl2ZSwgc2V0Ci0Jb3V0cHV0X2ZpbGVuYW1lLgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYXIuYyAoZnVsbF9wYXRobmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1hcF9vdmVyX21lbWJlcnMpOiBDYWxsIG5vcm1hbGl6ZSBvbiBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLgotCSh1c2FnZSk6IE1lbnRpb24gUCBtb2RpZmllci4KLQkobm9ybWFsaXplKTogSWYgZnVsbF9wYXRobmFtZSBpcyB0cnVlLCBkb24ndCBkbyBhbnl0aGluZy4KLQkobWFpbik6IEFjY2VwdCBQIG1vZGlmaWVyLgotCShkZWxldGVfbWVtYmVycyk6IENhbGwgbm9ybWFsaXplIG9uIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuCi0JKiBiaW51dGlscy50ZXhpLCBhci4xOiBEb2N1bWVudCBQIG1vZGlmaWVyLgotCi0xOTk5LTA5LTA5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBiaW51dGlscy50ZXhpOiBBZGQgaW5mbyBkaXIgZW50cmllcyBmb3IgYWxsIHByb2dyYW1zIGRlc2NyaWJlZAotCWhlcmUuICBGaXggYXJndW1lbnRzIG9mIEB2YXIgdG8gbm90IGNvbnRhaW4gcHVuY3R1YXRpb24uCi0KLTE5OTktMDktMDYgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBubS5jIChwcmludF9zeW1ib2xfaW5mb19ic2QpOiBDaGVjayBmb3IgJ3cnIGFzIHdlbGwgYXMgJ1UnLgotCShwcmludF9zeW1ib2xfaW5mb19zeXN2KTogTGlrZXdpc2UuCi0JKHByaW50X3N5bWJvbF9pbmZvX3Bvc2l4KTogTGlrZXdpc2UuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogcmVhZGVsZi5jOiBJbmNsdWRlICJlbGYvcGouaCIuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBIYW5kbGUgRU1fUEouCi0JKGdldF9tYWNoaW5lX25hbWUpOiBMaWtld2lzZS4KLQkoZ2V0X21hY2hpbmVfZmxhZ3MpOiBMaWtld2lzZS4KLQotMTk5OS0wOC0zMSAgU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogcmVhZGVsZi5jIChnZXRfbm90ZV90eXBlKTogTmV3IGZ1bmN0aW9uOiAgRGVjb2RlIHRoZSBlX3R5cGUKLQl2YWx1ZSBvZiBhIG5vdGUuCi0JKHByb2Nlc3Nfbm90ZSk6IE5ldyBmdW5jdGlvbjogRGlzcGxheSB0aGUgY29udGVudHMgb2YgYSBjb3JlIG5vdGUuCi0JKHByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50KTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2NvcmVmaWxlX25vdGVfc2VnbWVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKHByb2Nlc3NfY29yZWZpbGVfY29udGVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKHByb2Nlc3NfZmlsZSk6IEFkZCBjYWxsIHRvIHByb2Nlc3NfY29yZWZpbGVfY29udGVudHMuCi0JKHBhcnNlX2FyZ3MpOiBBZGQgcGFyc2luZyBvZiAtbi8tLW5vdGVzIGNvbW1hbmQgbGluZSBzd2l0Y2guCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2guCi0KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW1udCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCB0byByZWFkZWxmLgotCi0xOTk5LTA4LTMxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoQnVnIFJlcG9ydGluZyk6IENsYXJpZnkgdGhhdCBsYXJnZSBmaWxlcyBzaG91bGQKLQlub3QgYmUgc2VudCB0byBidWctZ251LXV0aWxzLgotCi0xOTk5LTA4LTI4ICBTdGVwaGFuZSBDYXJyZXogIDxzdGNhcnJlekB3b3JsZG5ldC5mcj4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3ApOiBOZXcgcGFyYW1ldGVyIHBvaW50ZXJfc2l6ZSwKLQlyZWFkIHRoZSBhZGRyZXNzIGFjY29yZGluZyB0byBwb2ludGVyX3NpemUuCi0JKGRlYnVnX2xpbmVfcG9pbnRlcl9zaXplKTogTmV3IGdsb2JhbCB0byBpbmRpY2F0ZSB0aGUKLQlzaXplIG9mIGFkZHJlc3MgaW4gLmRlYnVnX2xpbmUgc2VjdGlvbi4KLQkoZGVidWdfZGlzcGxheXMsIHByZXNjYW5fZGVidWdfaW5mbyk6IFByZXNjYW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24KLQl0byByZWNvcmQgdGhlIHNpemUgb2YgYWRkcmVzcyBpbiBgZGVidWdfbGluZV9wb2ludGVyX3NpemUnLgotCShwcm9jZXNzX3NlY3Rpb25fY29udGVudHMpOiBCZWZvcmUgZHVtcGluZyBhbnkgc2VjdGlvbiwgZXhlY3V0ZQotCXRoZSBwcmUtc2NhbiBvcGVyYXRpb24gZGVmaW5lZCBmb3Igc29tZSBkZWJ1ZyBzZWN0aW9ucy4KLQotMTk5OS0wOC0yNyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGRpc3BsYXlfZGVidWdfbGluZXMpOiBVc2UgaS0xIG5vdCBpIGluIHN0YW5kYXJkX29wY29kZXMKLQlhY2Nlc3MuCi0JKGRpc3BsYXlfZGVidWdfYXJhbmdlcyk6IE5ldyBsb2NhbCBleGNlc3MuICBVc2UgZm9yIGNhbGN1bGF0aW5nIHBhZGRpbmcKLQlhbmQgYWRkIHRoYXQgaW50byByYW5nZXMuICBCcmVhayBmcm9tIGxvb3Agb25seSBpZiBsZW5ndGggaXMgYWxzbyAwLgotCi0xOTk5LTA4LTI3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZGlzcGxheV9kZWJ1Z19saW5lcywgY2FzZSBEV19MTlNfY29uc3RfYWRkX3BjKTogTXVsdGlwbHkKLQlhZHYgYnkgaW5mby5saV9taW5faW5zbl9sZW5ndGguCi0KLTE5OTktMDgtMjYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogcmVhZGVsZi5jIChnZXRfc3BhcmM2NF9keW5hbWljX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9keW5hbWljX3R5cGUpOiBVc2UgaXQuCi0KLTE5OTktMDgtMjYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkaXNwbGF5X2RlYnVnX2xpbmVzLCBjYXNlIGRlZmF1bHQpOiBDaGFuZ2Ugc2Vjb25kIGxpbmUKLQlzZXR0aW5nCWFkdiB0byB1c2UgPSBub3QgKz0uCi0KLTE5OTktMDgtMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogQWRkZWQgbW9yZSBleGFtcGxlcyB0byB0aGUgY29tbWVudCBhdCB0aGUgc3RhcnQuCi0KLTE5OTktMDgtMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV9oZWFkKTogT25seSBlbWl0IGludGVyd29ya2luZyBkaXJlY3RpdmUgaWYKLQluZWNlc3NhcnkuCi0KLVRodSBKdWwgMTUgMjI6NDQ6MjEgMTk5OSAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYml0cmFuZ2UuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfYWJicmV2X3NlY3Rpb24pOiBIYW5kbGUgc3RhbmRhcmQtY29uZm9ybWluZwotCXNpbmdsZSB6ZXJvIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmpkdW1wLmMgKGV4aXRfc3RhdHVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobm9uZmF0YWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGV4aXRfc3RhdHVzIG9uIGVycm9yLgotCShyZWFkX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkoZGlzcGxheV9iZmQpOiBMaWtld2lzZS4gIENhbGwgbm9uZmF0YWwgcmF0aGVyIHRoYW4gYmZkX25vbmZhdGFsLgotCShkaXNwbGF5X2ZpbGUpOiBDYWxsIG5vbmZhdGFsIHJhdGhlciB0aGFuIGJmZF9ub25mYXRhbC4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCwgZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1haW4pOiBSZXR1cm4gZXhpdF9zdGF0dXMgcmF0aGVyIHRoYW4gMC4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IFVwZGF0ZSBmb3IgcmVuYW1pbmcgb2YKLQlTRUNfU0hPUlQgdG8gU0VDX1NNQUxMX0RBVEEuICBQcmludCBTRUNfU0hBUkVEIGZsYWcuCi0KLQlGcm9tIEVsaSBaYXJldHNraWkgPGVsaXpAZ251Lm9yZz46Ci0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBjeHhmaWx0IGFzIE1TLURPUyBuYW1lIGZvciBjKytmaWx0LgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBERU1BTkdMRVJfTkFNRS4KLQkqIE1ha2VmaWxlLmFtIChERU1BTkdMRVJfUFJPRyk6IFNldCB0byBjeHhmaWx0LgotCShtYW5fTUFOUyk6IFVzZSBERU1BTkdMRVJfTkFNRSByYXRoZXIgdGhhbiBERU1BTkdMRVJfUFJPRy4KLQkoYmluX1BST0dSQU1TKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLgotCShub2luc3RfUFJPR1JBTVMpOiBBZGQgJChERU1BTkdMRVJfUFJPRykuCi0JKGN4eGZpbHRfU09VUkNFUyk6IFJlbmFtZSBmcm9tIGNfX2ZpbHRfU09VUkNFUy4KLQkoY3h4ZmlsdF9MREFERCk6IFJlbmFtZSBmcm9tIGNfX2ZpbHRfTERBREQuCi0JKCQoREVNQU5HTEVSX05BTUUpLjEpOiBSZW5hbWUgZnJvbSAkKERFTUFOR0xFUl9QUk9HKS4xLiAgVXNlCi0JREVNQU5HTEVSX05BTUUgcmF0aGVyIHRoYW4gREVNQU5HTEVSX1BST0cgaW4gc3Vic3RpdHV0aW9uLgotCShNT1NUTFlDTEVBTkZJTEVTKTogVXNlIERFTUFOR0xFUl9OQU1FIHJhdGhlciB0aGFuCi0JREVNQU5HTEVSX1BST0cuCi0JKGluc3RhbGwtZXhlYy1sb2NhbCk6IFdoZW4gaW5zdGFsbGluZyBub2luc3RfUFJPR1JBTVMsIGNoYW5nZQotCWN4eGZpbHQgdG8gJChERU1BTkdMRVJfTkFNRSkuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbTogUmVuYW1lIC5kZXAqIGZpbGVzIHRvIERFUCouICBDaGFuZ2UgREVQIHZhcmlhYmxlIHRvCi0JTUtERVAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOC0wNSAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChZQUNDKTogSWYgYmlzb24gaXMgbm90IGluIHRoZSBzb3VyY2UgdHJlZSwgdXNlCi0JQFlBQ0NAIHJhdGhlciB0aGFuIGJpc29uIC15LgotCShMRVgpOiBJZiBmbGV4IGlzIG5vdCBpbiB0aGUgc291cmNlIHRyZWUsIHVzZSBATEVYQCByYXRoZXIgdGhhbgotCWZsZXguCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGRsbHRvb2wgZm9yIGlbMy02XTg2LSotaW50ZXJpeC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBNYXJrIEVsYnJlY2h0OgotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiByZWFkZWxmLmMgKGdldF9tYWNoaW5lX2ZsYWdzKTogUHJpbnQgRUZfU1BBUkNfU1VOX1VTMy4KLQotMTk5OS0wNy0xNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVtcCB2ZXJzaW9uIG51bWJlciB0byAyLjkuNS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNy0xNCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogUHJpbnQgU0VDX1NIT1JULgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFueSBmaWxlczogQ2hhbmdlcyB0byBhdm9pZCBnY2Mgd2FybmluZ3M6IEFkZCBBVFRSSUJVVEVfVU5VU0VECi0JYXMgYXBwcm9wcmlhdGUuICBBZGQgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zLiAgQWRkIGNhc3RzLgotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IENoYW5nZSBqIHRvIGJmZF92bWEuCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc3ltaW5mbyk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkoZGlzcGxheV9kZWJ1Z19pbmZvKTogQ2hhbmdlIGFiYnJldl9udW1iZXIgdG8gdW5zaWduZWQgbG9uZy4KLQkocHJvY2Vzc19taXBzX3NwZWNpZmljKTogQ2hhbmdlIGZjbnQgdG8gc2l6ZV90LgotCi0xOTk5LTA3LTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IE9ubHkgc3VwcG9ydCBkZWNvZGluZyA2NGJpdCBFTEYgZmlsZXMgaWYgdGhlIGNvbXBpbGVyCi0Jc3VwcG9ydHMgYSA2NCBiaXQgZGF0YSB0eXBlLgotCUFkZCAtSSBlcXVpdmFsZW50IGZvciAtLWhpc3RvZ3JhbS4KLQlBZGQgLUEgY29tbWFuZC1saW5lIG9wdGlvbiB0byBkaXNwbGF5IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLQotMTk5OS0wNy0wOCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiByZWFkZWxmLmMgKGd1ZXNzX2lzX3JlbGEpOiBTcGFyY3Y5IGFuZCB2OHBsdXMgdXNlIHJlbGEuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBVc2UgRUxGNjRfUl9UWVBFX0lEIGZvciBTcGFyYywgZm9yIFJfU1BBUkNfT0xPMTAKLQlwcmludCB0aGUgc2Vjb25kYXJ5IGFkZGVuZC4KLQkoZ2V0X21hY2hpbmVfZmxhZ3MpOiBQcmludCBTcGFyYyBtYWNoaW5lIGZsYWdzLgotCShnZXRfc3ltYm9sX3R5cGUpOiBQcmludCBTVFRfUkVHSVNURVIuCi0KLTE5OTktMDctMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3R5cGUpOiBGaXggaGFuZGxpbmcgb2YgdGVtcGxhdGUgbmFtZXMgd2l0aAotCXRlbXBsYXRlIHBhcmFtZXRlcnMgY29udGFpbmluZyBgOjonLgotCShzdGFiX2RlbWFuZ2xlX3R5cGUpOiBIYW5kbGUgYSBxdWFsaWZpZWQgbmFtZSBpbiBhIHBvaW50ZXIgdG8KLQltZW1iZXIuCi0KLTE5OTktMDYtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZGxsdG9vbF9TT1VSQ0VTKTogQWRkIGR5bi1zdHJpbmcuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTIzICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlndXJlLmluIChIQVZFX0VYRUNVVEFCTEVfU1VGRklYKTogRGVmaW5lLgotCSogZGxsdG9vbC5jIChsb29rX2Zvcl9wcm9nKTogVXNlIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVguCi0JKiBkbGx3cmFwLmMgKGxvb2tfZm9yX3Byb2cpOiBMaWtld2lzZS4KLQkqIHJlc3JjLmMgKGxvb2tfZm9yX2RlZmF1bHQpOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTIyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNdW1pdCBLaGFuIDxraGFuQHhyYXlsaXRoLndpc2MuRURVPjoKLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEVYRUNVVEFCTEVfU1VGRklYLgotCSogZGxsdG9vbC5jOiBJbmNsdWRlICJkeW4tc3RyaW5nLmgiLiAgSW5jbHVkZSA8c3RkYXJnLmg+IGJhc2VkIG9uCi0JQU5TSV9QUk9UT1RZUEVTLCBub3QgX19TVERDX18uCi0JKG91dGZpbGUpOiBSZW1vdmUuCi0JKGdlbl9leHBfZmlsZSk6IENoYW5nZSB1c2VzIG9mIG91dGZpbGUgdG8gdXNlIGFsbG9jYS4KLQkobWFrZV9vbmVfbGliX2ZpbGUsIG1ha2VfaGVhZCwgbWFrZV90YWlsKTogTGlrZXdpc2UuCi0JKGdlbl9saWJfZmlsZSk6IExpa2V3aXNlLgotCShsb29rX2Zvcl9wcm9nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVkdWNlX25hbWUpOiBSZXdyaXRlIHRvIHVzZSBsb29rX2Zvcl9wcm9nLgotCShtY29yZV9lbGZfZ2VuX291dF9maWxlKTogVXNlIGR5bl9zdHJpbmdfdCByYXRoZXIgdGhhbiBvdXRmaWxlLgotCSogZGxsd3JhcC5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPGVycm5vLmg+LCA8c3RyaW5nLmg+LAotCTxzdGRsaWIuaD4sIG9yIDx1bmlzdGQuaD4uICBJbmNsdWRlIDxzeXMvc3RhdC5oPiBhbmQgZWl0aGVyCi0JPHN0ZGFyZy5oPiBvciA8dmFyYXJncy5oPi4KLQkoZHJpdmVyX25hbWUpOiBJbml0aWFsaXplIHRvIE5VTEwsIG5vdCAiZ2NjIi4KLQkoZGxsdG9vbF9uYW1lKTogSW5pdGlhbGl6ZSB0byBOVUxMLCBub3QgImRsbHRvb2wiLgotCShkaXNwbGF5LCBpbmZvcm0sIGxvb2tfZm9yX3Byb2csIGRlZHVjZV9uYW1lKTogTmV3IHN0YXRpYwotCWZ1bmN0aW9ucy4KLQkodXNhZ2UpOiBNZW50aW9uIC1tbm8tY3lnd2luLgotCShPUFRJT05fTU5PX0NZR1dJTik6IERlZmluZS4KLQkobWFpbik6IEhhbmRsZSAtbW5vLWN5Z3dpbi4gIERlZHVjZSBkcml2ZXJfbmFtZSBhbmQgZGxsdG9vbF9uYW1lLgotCSogcmVzcmMuYyAobG9va19mb3JfZGVmYXVsdCk6IE1ha2Ugc3RhdGljLiAgUmVtb3ZlIHVudXNlZCBsb2NhbAotCXBhdGguICBDaGVjayB1c2luZyBFWEVDVVRBQkxFX1NVRkZJWC4KLQkocmVhZF9yY19maWxlKTogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIHRvIGhvbGQgRVhFQ1VUQUJMRV9TVUZGSVguCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKGRsbHdyYXBfTERBREQpOiBBZGQgJChJTlRMTElCUykuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLU1vbiBKdW4gMjEgMTY6NDk6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogVXNlIGVsZl9ocHBhX3JlbG9jX3R5cGUgaW5zdGVhZCBvZgotICAgICAgICBlbGYzMl9ocHBhX3JlbG9jX3R5cGUuCi0KLTE5OTktMDYtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWNvcmVfZWxmX2dlbl9vdXRfZmlsZSk6IExpbmsgb2JqZWN0IGZpbGVzIHdpdGggdGhlCi0JLmV4cCBmaWxlLCBub3QgdGhlIC5saWIgZmlsZS4KLQotRnJpIEp1biAxOCAyMDoxNzo1MSAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGVmbGV4Lmw6IEFjY2VwdCBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCBuYW1lcy4KLQotMTk5OS0wNi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfc3ltYm9sX3R5cGUpOiBEZXRlY3QgQVJNIHN5bWJvbHMgdHlwZWQgYXMgVGh1bWIKLQlmdW5jdGlvbnMuCi0KLTE5OTktMDYtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVyX29wdGlvbnMpOiBOZXcgdmFyaWFibGUuCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IC1NLy0tZGlzYXNzZW1ibGVyLW9wdGlvbnMgb3B0aW9uLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS1kaXNhc3NlbWJsZXItb3B0aW9ucy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IEluaXRpYWxpc2UgZGlzYXNzZW1ibGVyX29wdGlvbnMgZmllbGQgb2YKLQlkaXNhc3NlbWJsZXJfaW5mbyBzdHJ1Y3R1cmUuCi0JKG1haW4pOiBBZGQgcGFyc2luZyBvZiAtTSBvcHRpb24uCi0KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIHRvIG9iamR1bXAuCi0KLQkqIE5FV1M6IERlc2NyaWJlIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIHRvIG9iamR1bXAuCi0KLQotTW9uIEp1biAxNCAxMDoyNzo1NCAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IEZpeCB0eXBvcy4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBJZiB0aGUgZGlzYXNzZW1ibGVyIHJldHVybnMgYW4KLQllcnJvciwgcHJpbnQgb3V0IGFueXRoaW5nIGl0IG1heSBoYXZlIHByaW50ZWQgdG8gdGhlIGJ1ZmZlci4gIEZyb20KLQlILkouIEx1IDxoamxAZ251Lm9yZz4uCi0KLQkqIGRlZnBhcnNlLnkgKGV4cGxpc3QpOiBSZW1vdmUgc2VwYXJhdGUgZXhwbGluZSB0byBlbGltaW5hdGUKLQlzaGlmdC9yZWR1Y2UgY29uZmxpY3QuCi0KLQlGcm9tIEthaS1Vd2UgUm9tbWVsIDxyb21tZWxAYXJzLmRlPjoKLQkqIGRlZnBhcnNlLnk6IEFkZCB0b2tlbnMgTk9OU0hBUkVELCBTSU5HTEUsIE1VTFRJUExFLAotCUlOSVRJTlNUQU5DRSwgSU5JVEdMT0JBTCwgVEVSTUlOU1RBTkNFLCBhbmQgVEVSTUdMT0JBTC4KLQkoY29tbWFuZCk6IEFkZCBvcHRpb25fbGlzdCBhZnRlciBMSUJSQVJZLgotCShhdHRyKTogQWNjZXB0IGFuZCBpZ25vcmUgTk9OU0hBUkVELCBTSU5HTEUsIGFuZCBNVUxUSVBMRS4KLQkob3B0aW9uX2xpc3QsIG9wdGlvbik6IE5ldyBub250ZXJtaW5hbHMuCi0JKiBkZWZsZXgubDogUmVjb2duaXplIE5PTlNIQVJFRCwgU0lOR0xFLCBNVUxUSVBMRSwgSU5JVElOU1RBTkNFLAotCUlOSVRHTE9CQUwsIFRFUk1JTlNUQU5DRSwgYW5kIFRFUk1HTE9CQUwuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhci5jIChPX0JJTkFSWSk6IERlZmluZSBhcyAwIGlmIG5vdCBkZWZpbmVkLgotCShyYW5saWJfdG91Y2gpOiBPcGVuIGZpbGUgd2l0aCBPX0JJTkFSWS4KLQotCSogcmVuYW1lLmMgKE9fQklOQVJZKTogRGVmaW5lIGFzIDAgaWYgbm90IGRlZmluZWQuCi0JKHNpbXBsZV9jb3B5KTogT3BlbiBmaWxlcyB3aXRoIE9fQklOQVJZLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILiBQZXRlciBBbnZpbiA8aHBhQHRyYW5zbWV0YS5jb20+OgotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGNvcHkgZmllbGQuCi0JKHNlY3Rpb25zX2NvcGllZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAib25seS1zZWN0aW9uIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLWogYW5kIC0tb25seS1zZWN0aW9uLgotCShmaW5kX3NlY3Rpb25fbGlzdCk6IEluaXRpYWxpemUgY29weSBmaWVsZC4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IENoZWNrIGZvciBjb3B5aW5nIHNlY3Rpb25zLgotCShjb3B5X29iamVjdCk6IENoZWNrIHNlY3Rpb25zX2NvcGllZCB3aGVuIGNhbGxpbmcgZmlsdGVyX3N5bWJvbHMuCi0JKHNldHVwX3NlY3Rpb24pOiBDaGVjayBmb3IgY29weWluZyBzZWN0aW9ucy4KLQkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtai8tLW9ubHktc2VjdGlvbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLWovLS1vbmx5LXNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgZnJleHAgaXMgbm90IGF2YWlsYWJsZSwgY2hlY2sgaW4gLWxtLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiByZWFkZWxmLmMgKGdldF9lbGZfY2xhc3MpOiBVc2UgY29ycmVjdCBwcmludGYgZm9ybWF0IGZvciB0eXBlLgotCShnZXRfZGF0YV9lbmNvZGluZyk6IExpa2V3aXNlLgotCShnZXRfb3NhYmlfbmFtZSk6IExpa2V3aXNlLgotCShwcm9jZXNzX2ZpbGVfaGVhZGVyKTogRG9uJ3QgcGFzcyBhbiBleHRyYSBhcmd1bWVudCB0byBwcmludGYuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogQ2FzdCBkeW5hbWljX3NpemUgdG8gbG9uZyBiZWZvcmUKLQlwcmludGluZy4KLQkoZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24pOiBDYXN0IGJ5dGVfZ2V0IHRvIGxvbmcgYmVmb3JlCi0JcHJpbnRpbmcuCi0KLVdlZCBKdW4gIDkgMTE6NDA6MTYgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfc2VjdGlvbik6IENhc3QgdmFsdWVzIGZyb20gYnl0ZV9nZXQgdG8KLSAJW3Vuc2lnbmVkXSBsb25nIGZvciBwcmludGluZywgaW4gY2FzZSBpdCBpcyB3aWRlciB0aGFuIGxvbmcuCi0JKGRpc3BsYXlfYmxvY2spOiBMaWtld2lzZS4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogTGlrZXdpc2UuCi0JKGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uKTogTGlrZXdpc2UuICBEb24ndCBkZXBlbmQgb24KLSAJZXZhbHVhdGlvbiBvcmRlci4KLQotTW9uIEp1biAgNyAxMjoxNDo1NyAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHdpbmRyZXMuYyAodXNhZ2UpOiBGaXggdHlwby4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBVc2UgNjRiaXQgd2lkZSBmaWVsZHMgaW4gaW50ZXJuYWwgc3RyY3V0dXJlcyBldmVuIGlmCi0JdGFyZ2V0dGluZyBhIDMyYml0IGFyY2hpdGVjdHVyZS4KLQkoZHVtcF9yZWxvY2F0aW9ucyk6IFRha2UgYSBuZXcgcGFyYW1ldGVyIC0gdGhlIG51bWJlciBvZiBzeW1ib2xzCi0JaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgNjRiaXQgRUxGIGZpbGVzLgotCi0xOTk5LTA2LTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUpOiBVc2UgY29uc3RhbnRzIGZvciB0ZW1wb3JhcnkKLQlmaWxlIG5hbWVzLgotCi1XZWQgSnVuICAyIDEyOjM0OjM2IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogUmV2ZXJ0IDE5OTkwNDExIGNoYW5nZS4KLQotTW9uIE1heSAzMSAwOTo1NjoyMiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19yZWxvY3MpOiBEZXRlcm1pbmUgdHlwZSBvZiByZWxvYyBmcm9tCi0JRFRfUExUUkVMIGFuZCBmcm9tIHNlY3Rpb24gdHlwZS4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfZWxmX2NsYXNzKTogRGlzcGxheSB1bmtub3duIGNsYXNzIG51bWJlci4KLQkoZ2V0X2RhdGFfZW5jb2RpbmcpOiBEaXNwbGF5IHVua25vd24gZW5jb2RpbmcgbnVtYmVyLgotCShnZXRfb3NhYmlfbmFtZSk6IERpc3BsYXkgdW5rbm93biBBQkkgbnVtYmVyLgotCShwcm9jZXNzX2ZpbGVfaGVhZGVyKTogRGlzcGxheSB1bmtub3duIHZlcnNpb24gbnVtYmVyLgotCi0xOTk5LTA1LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiBGaXggdHlwby4KLQotMTk5OS0wNS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogQWRkIGV4dHJhIHBhcmFtZXRlcjogaXNfcmVsYSB0bwotCXNwZWNpZnkgdGhlIGtpbmQgb2YgcmVsb2NhdGlvbnMgdG8gYmUgZHVtcGVkLiAgQ2FsbCBndWVzc19pc19yZWxhCi0JaWYgdGhpcyBwYXJhbWV0ZXIgaGFzIGEgdmFsdWUgb2YgVU5LTk9XTi4KLQkoZ3Vlc3NfaXNfcmVsYSk6IE5ldyBmdW5jdGlvbjogIEd1ZXNzIHRoZSBraW5kIG9mIHJlbG9jIGJlaW5nIHVzZWQKLQliYWNlZCBvbiB0aGUgbWFjaGluZSBudW1iZXIuCi0JKHByb2Nlc3NfcmVsb2NzKTogRGV0ZXJtaW5lIHR5cGUgb2YgcmVsb2MgYmVmb3JlIGNhbGxpbmcKLQlkdW1wX3JlbG9jYXRpb25zLgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVhZGVsZi5jOiBJbmNsdWRlICJlbGYvaTk2MC5oIi4KLQkoZHVtcF9yZWxvY2F0aW9ucyk6IEhhbmRsZSBFTV85NjAuCi0KLVRodSBNYXkgMjcgMTE6NTg6MzMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IFByZXNlcnZlIGRhdGVzIG9mIGFyY2hpdmUgbWVtYmVycyBpZgotCXJlcXVlc3RlZC4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogQWx3YXlzIHByaW50IHRoZSBhZGRlbmQgb24gUkVMQQotCXN5c3RlbXMgZXZlbiBpZiB0aGVyZSBpcyBubyBzeW1ib2wuCi0JKHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzKTogUmVzZXQgZHluYW1pY19zaXplIGJlZm9yZSBsb29waW5nCi0JdGhyb3VnaCB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotCShwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMpOiBDYXN0IHNoX29mZnNldCB0byB1bnNpZ25lZCBsb25nIGZvcgotCXByaW50aW5nIGluIGNhc2UgYmZkX3ZtYSBpcyB3aWRlci4KLQkocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBVc2UgZ2V0X3N5bWJvbF9pbmRleF90eXBlIHdoZW4gcHJpbnRpbmcKLQlzdF9zaG5keC4KLQotMTk5OS0wNS0xNyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYzogYWRkIHZlcmJvc2Ugb3B0aW9uCi0JKG1haW4pOiBwcm9jZXNzIHZlcmJvc2Ugb3B0aW9uCi0JKiByZXNyYy5jIChsb29rX2Zvcl9kZWZhdWx0KTogbmV3LiAgTG9vayBmb3IgdGhlIGRlZmF1bHQKLQlwcmVwcm9jZXNzb3IgaW4gYSBnaXZlbiBsb2NhdGlvbi4KLQkocmVhZF9yY19maWxlKTogZm9yIGZvby9iYXItd2luZHJlcywgbG9vayBmb3IgZm9vL2Jhci1nY2MsCi0JZm9vL2djYyAoaW4gY2FzZSBvZiBmb28vd2luZHJlcyksIGFuZCB0aGVuIGdjYyAodGhlIG9sZCBkZWZhdWx0KS4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChkZWR1Y2VfbmFtZSk6IE5ldyBmdW5jdGlvbjogRGVkdWNlIG5hbWUgb2YgcHJvZ3JhbSB0bwotCXJ1bi4KLQkobWNvcmVfZWxmX291dF9maWxlKTogTmV3IHZhcmlhYmxlOiBOYW1lIG9mIG1jb3JlLWVsZiBvdXRwdXQgZmlsZS4KLQkobWNvcmVfZWxmX2xpbmtlcik6IE5ldyB2YXJpYWJsZTogTmFtZSBvZiBsaW5rZXIgdG8gdXNlLgotCShtY29yZV9lbGZfbGlua2VyX2ZsYWdzKTogTmV3IHZhcmlhYmxlOiBMaW5rZXIgZmxhZ3MgdG8gcGFzcy4KLQkoc2Nhbl9vYmpfZmlsZSk6IENhY2hlIGZpbGVuYW1lcyBpZiBuZWNlc3NhcnkuCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zLgotCShtYWluKTogU3VwcG9ydCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnM6IC1NIChnZW5lcmF0ZSBhbgotCW1jb3JlLWVsZiBvdXRwdXQgZmlsZSkgLUwgKG5hbWUgb2YgbGlua2VyIHRvIHVzZSkgLUYgKGZsYWdzIHRvCi0JcGFzcyB0byBsaW5rZXIpLgotCShtY29yZV9lbGZfY2FjaGVfZmlsZW5hbWUpOiBTdG9yZSBhIGZpbGVuYW1lIGluIGEgY2FjaGUuCi0JKG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUpOiBOZXcgZnVuY3Rpb246IEdlbmVyYXRlIGFuIG91dHB1dCBmaWxlCi0JcGVyIHRoZSBtY29yZS1lbGYgc3BlYy4KLQotMTk5OS0wNS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChCVUlMRF9NSVNDKTogQnVpbGQgZGxsdG9vbCBmb3IgbWNvcmUKLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGRsbHRvb2wuYzogVXBkYXRlIGV4YW1wbGUgaW4gY29tbWVudC4KLQkoRExMVE9PTF9NQ09SRSk6IERlZmluZS4KLQkoRExMVE9PTF9NQ09SRV9FTEYpOiBEZWZpbmUuCi0JKERSRUNUVkVfU0VDVElPTl9OQU1FKTogRGVmaW5lLgotCShtY29yZV9iZV9qdGFiLCBtY29yZV9sZV9qdGFiKTogQmluYXJ5IGZvciBwZXJmb3JtaW5nIGFuIG1jb3JlCi0JanVtcCB0byBhZGRyZXNzLgotCShtdGFibGUpOiBBZGQgZW50cmllcyBmb3IgbWNvcmUgdmFyaWFudHMuCi0JKHJ2YWFmdGVyLCBydmFiZWZvcmUsIGFzbV9wcmVmaXgpOiBBZGQgbWNvcmUgc3VwcHBvcnQuCi0JKHNjYW5fZHJlY3R2ZV9zeW1ib2xzKTogVXNlIERSRUNUVkVfU0VDVElPTl9OQU1FLgotCShtYWtlX2hlYWQsIG1ha2VfdGFpbCk6IENvcGUgaWYgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZC4KLQkodXNhZ2UpOiBJbXByb3ZlIGxheW91dC4KLQotMTk5OS0wNS0xMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IGFkZCBjb2RlIHRvIHN1cHByZXNzIGNlcnRhaW4gb3V0cHV0IGZyb20gY3BwLCByZXBsYWNlCi0JYWxsIHJldHVybnMgd2l0aCBNQVlCRV9SRVRVUk4KLQkoTUFZQkVfUkVUVVJOKTogbmV3LCBpbXBsZW1lbnQgdGhlIHN1cHByZXNzaW9uIGJ5IHJldHVybmluZwotCUlHTk9SRURfVE9LRU4gYXMgbmVlZGVkLgotCShjcHBfbGluZSk6IHJlbWVtYmVyIHdoaWNoIGZpbGUgd2UncmUgaW4sIG1hcmsgZGF0YSBmcm9tIGluY2x1ZGVkCi0JKi5oIGZpbGVzIGZvciBzdXBwcmVzc2lvbi4KLQkqIHJjcGFyc2UueSAoaW5wdXQpOiBhbGxvdyBJR05PUkVEX1RPS0VOIG91dHNpZGUgb2Yga25vd24gY29uc3RydWN0cwotCi0xOTk5LTA1LTEwICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogd2luZHJlcy5jIChxdW90KTogUXVvdGUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgaW4gYSBzdHJpbmcKLQkobWFpbik6IHF1b3RlIHBhcmFtZXRlcnMgdG8gY3BwIHRoYXQgbWlnaHQgaGF2ZSBtZXRhY2hhcmFjdGVycyBpbgotCXRoZW0uICBBbGxvdyAtRCBhcyBhbiBhbGlhcyBmb3IgLS1kZWZpbmUgdG8gYWxsb3cgZm9yIHNoYXJpbmcgbWFrZQotCW1hY3JvcyB3aXRoIGdjYy4KLQotCSogb2JqZHVtcC5jIChkdW1wX3JlbG9jX3NldCk6IGRvbid0IGNvcmUgaWYgaG93dG8tPm5hbWUgaXMgTlVMTAotCi0JKiBNYWtlZmlsZS5hbTogR2l2ZSByZXNjb2ZmLmMgYSBjcHUtc3BlY2lmaWMgLUQgc28gaXQgY2FuIHNldAotCXRoZSBjb3JyZWN0IEJGRC4KLQkqIE1ha2VmaWxlLmluOiBkaXR0bwotCSogcmVzY29mZi5jICh3cml0ZV9jb2ZmX2ZpbGUpOiBTZXQgdGhlIGNvcnJlY3QgQkZECi0KLTE5OTktMDUtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiByZW5hbWUuYyAoc21hcnRfcmVuYW1lKTogRml4IHRlc3Qgb2Ygd2hldGhlciBmaWxlIGV4aXN0cy4KLQotMTk5OS0wNS0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGRpc3BsYXlfZW5kaWFuIGJhc2VkIG9uIHRhcmdldAotCWVuZGlhbmlzbS4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoaW50ZXJ3b3JrKTogUmVtb3ZlLgotCShhcm1faW50ZXJ3b3JrX2p0YWIpOiBVc2UgYnggaW5zbi4KLQkodGh1bWJfanRhYik6IExpa2V3aXNlLgotCShNQVJNX0lOVEVSV09SSyk6IE5ldyBtYWNoaW5lIHR5cGUuCi0JKHJ2YWFmdGVyKTogSGFuZGxlIGl0LgotCShydmFiZWZvcmUpIExpa2V3aXNlLgotCShhc21fcHJlZml4KTogTGlrZXdpc2UuCi0JKGdlbl9leHBfdHlwZSk6IENoZWNrIG1hY2hpbmUgdHlwZSBpbnN0ZWFkIG9mCi0JaW50ZXJ3b3JrIGZsYWcuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogTGlrZXdpc2UuCi0JKG1ha2VfaGVhZCk6IExpa2V3aXNlLgotCShtYWtlX3RhaWwpOiBMaWtld2lzZS4KLQkodXNhZ2UpOiBVcGRhdGUgbWFjaGluZSB0eXBlcy4KLQkobWFpbik6IFJlbW92ZSAtaW50ZXJ3b3JrIHN1cHBvcnQuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogcmVhZGVsZi5jIChnZXRfbWFjaGluZV9mbGFncyk6ICBDaGVjayBmb3IgRUZfQ1BVMzIuCi0gICAgICAgIChnZXRfZGF0YV9lbmNvZGluZyk6IEZpeCB0eXBvLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0xOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiBpbgotCUJGRDY0IGNhc2UuCi0KLQkqIHJlYWRlbGYuYyAoZ2V0X3NlY3Rpb25fdHlwZV9uYW1lKTogVXNlIGNvcnJlY3QgdHlwZXMgaW4gcHJpbnRmCi0JZm9ybWF0cy4KLQkocHJvY2Vzc19yZWxvY3MpOiBMaWtld2lzZS4KLQkocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQkocHJvY2Vzc19taXBzX3NwZWNpZmljKTogTGlrZXdpc2UuCi0KLVR1ZSBBcHIgMTMgMjE6MjI6MDAgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBNYXJrIHRodW1iIGZ1bmN0aW9ucyBhcwotCUNfVEhVTUJFWFRGVU5DLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uaCAoZW52aXJvbik6IERlY2xhcmUgaXQsIGlmIG5lZWRlZC4KLQkoYWxsb2NhKSBbQ19BTExPQ0FdOiBEb24ndCB1c2UgZ2NjJ3MgYnVpbHRpbiBvciA8YWxsb2NhLmg+LgotCSogY29uZmlndXJlLmluIChlbnZpcm9uKTogRGV0ZWN0IGRlY2xhcmF0aW9uLgotCSogbm0uYyAobWFpbik6IERvbid0IGRlY2xhcmUgZW52aXJvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi0JKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IFBhZCBvdXQgdGhlIC5yZWxvYyBzZWN0aW9uIHRvIGEKLQkzMi1ieXRlIGJvdW5kYXJ5IHdpdGggZHVtbXkgcmVsb2NhdGlvbnMsIHRvIG1ha2UgdGhlIEJlT1MgbG9hZGVyCi0JaGFwcHkuICBQYXRjaCBmcm9tIEJvYiBNYW5zb24gPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+LgotCi0xOTk5LTA0LTA4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkgKGMrK2ZpbHQpOiBVcGRhdGVkIGZvciAtai8tLWphdmEsIGFuZCBocC9lZGcKLQlmb3JtYXRzLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEFkZCBhYmlsaXR5IHRvIGRlY29kZSBuZXcgY29uc3RhbnRzIGZvdW5kIGluIEFwcmlsIDI1Ci0JMTk5OCBEcmFmdCBvZiBTeXN0ZW0gViBBQkkgc3BlYy4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGJ1Y29tbS5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQkqIGFkZHIybGluZS5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlCi0Jc3lzdGVtIGRvZXMgbm90IGRlZmluZSBpdC4KLQkqIGFyLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGNvZmZkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGRsbHRvb2wuYyAobWFpbik6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHdpbmRyZXMuYyAobWFpbik6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jIChtYWluKTogQ2FsbCBsb2NhbGUgc2V0dGluZyBmdW5jdGlvbnMuCi0KLTE5OTktMDQtMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24pOiBGaXggRFdfT1BfY29uc3Q4e3N8dX0KLQlkZWNvZGVzLgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVuYW1lLmM6IE5ldyBmaWxlLCBjb3BpZWQgb3V0IG9mIG9iamNvcHkuYyB3aXRoIGEgZmV3IGNoYW5nZXMuCi0JKiBidWNvbW0uaCAoc2V0X3RpbWVzLCBzbWFydF9yZW5hbWUpOiBEZWNsYXJlLgotCSogYXIuYzogRG9uJ3QgaW5jbHVkZSA8dXRpbWUuaD4uCi0JKGV4dHJhY3RfZmlsZSk6IENhbGwgc2V0X3RpbWVzIHJhdGhlciB0aGFuIHV0aW1lLgotCSh3cml0ZV9hcmNoaXZlKTogQ2FsbCBzbWFydF9yZW5hbWUgcmF0aGVyIHRoYW4gdW5saW5rIGFuZCByZW5hbWUuCi0JKiBvYmpjb3B5LmM6IERvbid0IGluY2x1ZGUgPHV0aW1lLmg+LgotCShzaW1wbGVfY29weSwgc21hcnRfcmVuYW1lLCBzZXRfdGltZXMpOiBNb3ZlIHRvIHJlbmFtZS5jLgotCShzdHJpcF9tYWluKTogVXBkYXRlIHNtYXJ0X3JlbmFtZSBjYWxsIGZvciBuZXcgcGFyYW1ldGVyLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHJlbmFtZS5jLgotCShvYmpjb3B5X1NPVVJDRVMsIHN0cmlwX25ld19TT1VSQ0VTKTogQWRkIHJlbmFtZS5jLgotCShhcl9TT1VSQ0VTLCByYW5saWJfU09VUkNFUyk6IEFkZCByZW5hbWUuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEVYVFJBX1BST0dSQU1TKTogUmVtb3ZlIGJhY2tzbGFzaCB3aGljaCB0cm91YmxlcyBjdXJyZW50IHZlcnNpb24KLQlvZiBhdXRvbWFrZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBkbGx3cmFwLmMgKG1haW4pOiBFeHBlY3QgY29ycmVjdCB0eXBlIGluIGZvcm1hdCBzdHJpbmcuCi0JKiByZXNyZXMuYzogSW5jbHVkZSAiYmZkLmgiLCAiYnVjb21tLmgiLCAibGliaWJlcnR5LmgiLCBhbmQKLQk8dGltZS5oPi4gIERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+IGFuZCA8ZXJybm8uaD4uCi0JKHdyaXRlX3Jlc19maWxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgZSBhbmQgaS4KLQkocmVhZF9yZXNvdXJjZV9lbnRyeSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIHJ0eXBlIGFuZCBuLgotCShyZWFkX3VuaXN0cmluZyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgbi4KLQotMTk5OS0wNC0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFycGFyc2UueTogRGVjbGFyZSB5eWxleC4KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBJbml0aWFsaXplIGJ5dGVzLiAgQWRkIGNvbW1lbnQKLQlmb3IgaW5jb3JyZWN0IHVzZSBvZiBieXRlcy4KLQkqIHJlYWRlbGYuYzogQ2hhbmdlIG1hbnkgZm9ybWF0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotMTk5OS0wNC0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChyZXNldF9zdGF0ZV9tYWNoaW5lKTogTmV3IGZ1bmN0aW9uLiAgUmVzZXRzIHRoZQotCXJlZ2lzdGVycyBvZiB0aGUgc291cmNlIGxpbmUgbnVtYmVyIHN0YXRlIG1hY2hpbmUuCi0JKHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCk6IFVzZSBzdGF0ZSBtYWNoaW5lLgotCShkaXNwbGF5X2RlYnVnX2xpbmVzKTogVXNlIHN0YXRlIG1hY2hpbmUuICBIYW5kbGUgbXVsdGlwbGUgbGluZQotCW51bWJlciBibG9ja3Mgd2l0aGluIHRoZSBzYW1lIHNlY3Rpb24uCi0KLTE5OTktMDMtMjkgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3ApOiBlbmRfc2VxdWVuY2UgYWxzbyByZXNldHMKLQl0aGUgbGluZSBudW1iZXIuCi0JKGRpc3BsYXlfZGVidWdfbGluZXMpOiBhZHZhbmNlX2xpbmUgdGFrZXMgYSBzaWduZWQgb3BlcmFuZC4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogUHJpbnQgcmVmcyBhcyA8JXg+LCBhZGRyZXNzZXMgYXMgJSN4LAotCW90aGVycyBhcyAlZC4gIEhhbmRsZSBvdGhlciBsb2NhdGlvbiBleHByZXNzaW9uIGF0dHJpYnV0ZXMuCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IEhhbmRsZSBuZXN0aW5nLiAgQWx3YXlzIHByaW50IHRoZQlvZmZzZXQuCi0KLTE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogV2hlbiBjaGVja2luZyB3aGV0aGVyIHRvIGtlZXAgYQotCXN5bWJvbCwgY2hlY2sgdGhlIEJGRCBzZWN0aW9uIHN5bWJvbCBmb3IgYSBzeW1ib2wgd2l0aAotCUJTRl9TRUNUSU9OX1NZTSBzZXQuCi0KLTE5OTktMDMtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUHJpbnQgbmV3IFNvbGFyaXMgZHluYW1pYwotCXNlY3Rpb24gZW50cmllcy4gIENvcnJlY3QgcHJpbnRpbmcgb2YgRFRfUE9TRkxBR18xIGFuZCBEVF9GTEFHU18xLgotCi0xOTk5LTAzLTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlcXVlc3RfZHVtcCk6IE5ldyBmdW5jdGlvbi4KLQlSZW1vdmVkIGFyYml0YXJ5IGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgdGhhdCBjYW4gYmUKLQlkdW1wZWQuCi0KLVdlZCBNYXIgMTAgMTU6MTA6MTQgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UgJTA1ZCB0byBvdXRwdXQgdGhlIHN0dWIgbmFtZSBzbwotCW9yZGVyIGluIHRoZSBpbXBvcnQgbGlicmFyeSBpcyBwcmVzZXJ2ZWQuCi0KLTE5OTktMDItMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogRml4IGNvbXBpbGUgdGltZSB3YXJpbmdzLgotCi0xOTk5LTAyLTE3ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHJlc2Jpbi5jIChyZXNfdG9fYmluX3ZlcnNpb25pbmZvKTogSW5zdGVhZCBvZiBlbnRlcmluZyBhIHZhbHVlCi0JbGVuZ3RoIG9mIHplcm8gaW4gYSB2ZXJzaW9uIGluZm8gc3RyaW5nLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUKLQlsZW5ndGguCi0KLVR1ZSBGZWIgMTYgMTY6MDA6MzMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMy4gIENoYW5nZSBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuICBBZGQgY29tbWVudHMgZm9yIEFDX0RFRklORSBjYWxscy4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChyZWFkX2FuZF9kaXNwbGF5X2F0dHIpOiBBZGQgZGlzcGxheSBvZiBiYXNpYyB0eXBlCi0JZW5jb2RpbmdzLgotCShkaXNwbGF5X2RlYnVnX2FyYW5nZXMpOiBOZXcgZnVuY3Rpb246IERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIGEKLQkuZGVidWdfYXJhbmdlcyBzZWN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2luZm8pOiBEdW1wIHRhZ3MgZm91bmQgYWZ0ZXIgY29tcHVuaXQgZW50cnkuCi0KLQkqIGJpbnV0aWxzLnRleGk6IEZpeGVkIGJ1ZyBpbiByZWFkZWxmIGRvY3VtZW50YXRpb24uCi0KLU1vbiBGZWIgIDEgMTI6Mzg6MDEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiAgSGFuZGxlIEVNX0FSTSBhcyBSRUwuCi0KLTE5OTktMDEtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBEbyBub3QgcHJvZHVjZSBhIGhpc3RvZ3JhbSBvZgotCWJ1Y2tldCBjaGFpbnMgaWYgbm9uZSB3ZXJlIGZvdW5kLgotCi0xOTk5LTAxLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ZXJzaW9uLmM6IEFkZCAxOTk5IGNvcHlyaWdodC4KLQotCSogYmludXRpbHMudGV4aSAocmVhZGVsZik6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucwotCS0tZGVidWctZHVtcCBhbmQgLS1oaXN0b2dyYW0uCi0KLQkqIHJlYWRlbGYuYzogQWRkIGFiaWxpdHkgdG8gZGlzcGxheSBjb250ZW50cyBvZiBzb21lIG9yIGFsbCBvZiB0aGUKLQlEd2FyZjIgZGVidWcgc2VjdGlvbnMuICB7V29yayBvbmx5IHBhcnRpYWxseSBjb21wbGV0ZWR9LgotCShkaXNwbGF5X2RlYnVnX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfYWJicmV2KTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2FiYnJldl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShyZWFkX2xlYjEyOCk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfVEFHX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9BVF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfRk9STV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShmcmVlX2FiYnJldnMpOiBOZXcgZnVuY3Rpb24uCi0JKGFkZF9hYmJyZXYpOiBOZXcgZnVuY3Rpb24uCi0JKGFkZF9hYmJyZXZfYXR0cik6IE5ldyBmdW5jdGlvbi4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2Jsb2NrKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgSmFuIDE0IDIzOjM2OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZmR1bXAuYyAoeGNhbGxvYyk6IFJlbW92ZSwgaW4gbGliaWJlcnR5IG5vdy4KLQkqIHNyY29udi5jICh4Y2FsbG9jKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKHhjYWxsb2MpOiBMaWtld2lzZS4KLQotMTk5OS0wMS0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3NlY3Rpb25faGVhZGVycyk6IE9taXQgdHJhaWxpbmcgc3BhY2UgYXQgZW5kCi0Jb2Ygc2VjdGlvbiBoZWFkZXIgY29udGVudHMgbGluZS4KLQotV2VkIERlYyAxNiAxNzoyMDowNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlLgotCi1Nb24gRGVjIDE0IDEyOjU1OjM2IDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZGxsd3JhcC5jOiBJbmNsdWRlIGJmZC5oIGFuZCBidWNvbW0uaC4gIE1vdmUgZ2V0b3B0LmggaW5jbHVkZQotCWFmdGVyIGxpYmliZXJ0eS5oIGluY2x1ZGUuCi0KLVR1ZSBEZWMgIDggMTY6Mjk6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLjE6IEZpeCB0eXBvICgtZCB0byAtRCkuICBGcm9tIE5va3ViaSBIaXJvdGFrYQotCTxobm9rdWJpQHl5eS5vci5qcD4uCi0KLVN1biBEZWMgIDYgMTM6Mjg6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKFNGSUxFKTogQWRkIHNpemUgZmllbGQuCi0JKG9iamR1bXBfc3ByaW50Zik6IE1lcmdlIGJvdGggdmVyc2lvbnMgaW50byBvbmUuICBJbmNyZWFzZSBidWZmZXIKLQlzaXplIGFzIG5lZWRlZCB0byBhdm9pZCBvdmVyZmxvdy4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBDaGFuZ2UgYnVmIGZyb20gMTAwMCBieXRlcyB0byA1MC4gIENoYW5nZQotCWluaXRpYWxpemF0aW9uIGFuZCB1c2Ugb2Ygc2ZpbGUgdG8gbWF0Y2ggY2hhbmdlcyB0bwotCW9iamR1bXBfc3ByaW50Zi4KLQotCSogc3RyaXAuMTogRml4IHR5cG8gKC1WIHRvIC12KS4gIEZyb20gSXNzZWkgSGlyYXlhbWEKLQk8aXNzQG1haWwud2JzLm9yLmpwPi4KLQotMTk5OC0xMi0wMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBJbXByb3ZlIG91dHB1dCBmb3JtYXQgZm9yCi0JdmFyaW91cyBEVF8qIHZhbHVlcy4KLQotMTk5OC0xMi0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19taXBzX3NwZWNpZmljKTogUHJpbnQgLmNvbmZsaWN0IHNlY3Rpb24KLQljb250ZW50LgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IFByaW50IGxfZmxhZ3MgaW4gbGlibGlzdCBpbgotCXRleHR1YWwgZm9ybS4KLQotMTk5OC0xMS0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXIuYyAoZXh0cmFjdF9maWxlKTogQWRkIHNvbWUgcGFyYW5vaWEgY2hlY2tzIGZvciBuZWdhdGl2ZWx5Ci0Jc2l6ZWQgZmlsZXMuCi0KLVR1ZSBOb3YgMjQgMDk6Mzk6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoRElSX1NFUEFSQVRPUik6IERlZmluZSBhcyAnXFwnIGlmIFdJTjMyIGlzIGRlZmluZWQuCi0KLVR1ZSBOb3YgMTcgMTA6MjU6MjYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLU1vbiBOb3YgMTYgMTk6MTc6MjMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9iaW51dGlscy5wb3Q6IFJlZ2VuZXJhdGUuCi0KLU1vbiBOb3YgMTYgMTA6MTg6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlZ2VybmF0ZWQgZGVwZW5kZW5jaWVzLgotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1TYXQgTm92IDE0IDE0OjUwOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVidWcuYyAoZGVidWdfbmFtZV90eXBlKTogQ29ycmVjdCByZXR1cm4gdHlwZSBmcm9tIGZhbHNlIHRvCi0JREVCVUdfVFlQRV9OVUxMLgotCi1TYXQgTm92IDE0IDE0OjQ4OjIxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2tpcCBvdmVyIHJlbG9jcyBiZWxvdyBzdGFydAotCWFkZHJlc3MuCi0KLVR1ZSBOb3YgMTAgMTU6MzE6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBkZXBlbmRlbmN5IG9mIHJlYWRlbGYuYyBvbiBlbGYvZnIzMC5oCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotV2VkIE5vdiAgNCAxNjoyNTo1NSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgRlIzMC4KLQotTW9uIE5vdiAgMiAxNDo1OTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1GcmkgT2N0IDMwIDE1OjE0OjQ5IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmM6IGNoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBjeWd3aW4zMl8gdG8gY3lnd2luXywKLQljaGFuZ2UgQ3lnd2luIHRhcmdldCBkZWYgdG8gQ1lHV0lOLgotCi1XZWQgT2N0IDI4IDEwOjMxOjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFJlcGxhY2UgJ3Vuc2lnbmVkIGxvbmcnIHdpdGgKLQknYmZkX3ZtYScuCi0KLVR1ZSBPY3QgMjcgMTQ6Mzk6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IEFwcGxpZWQgdGhpcyBwYXRjaCBmcm9tIFBoaWxpcAotCUJsdW5kZWxsIDxwYkBuZXh1cy5jby51az46ICBNYWtlIGFkZHJlc3MgdmFyaWFibGVzIHVuc2lnbmVkIHRvCi0JYXZvaWQgcHJvYmxlbXMgd2hlbiBkaXNhc3NlbWJsaW5nIGNvZGUgYXQgaGlnaC1iaXQtc2V0IGFkZHJlc3Nlcy4KLQotTW9uIE9jdCAyNiAxNDowNzo1OSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHdyYXAuYyAoc3RyaGFzaCk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1haW4pOiBVc2UgaXQgdG8gc3VwcGx5IGltYWdlIGJhc2UgaWYgbm90IHN1cHBsaWVkIGJ5IHVzZXIuCi0gICAgICAgIChwcm9ncmFtX3ZlcnNpb24pOiBVcCB0byAwLjIuNC4KLQotTW9uIE9jdCAyNiAxNDowNzo1OSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHRvb2wuYyAoYWRkX3N0ZGNhbGxfYWxpYXMpOiBOZXcgZ2xvYmFsLgotICAgICAgICAobG9uZ19vcHRpb25zKTogQWRkIC0tYWRkLXN0ZGNhbGwtYWxpYXMgb3B0aW9uLgotICAgICAgICAobWFpbik6IEhhbmRsZSBpdC4KLSAgICAgICAgKHNjYW5fZHJlY3R2ZV9zeW1ib2xzKTogQWRkIGFsaWFzIGlmIC0tYWRkLXN0ZGNhbGwtYWxpYXMgaXMKLSAgICAgICAgc3BlY2lmaWVkLgotICAgICAgICAoc2Nhbl9maWx0ZXJlZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0gICAgICAgIChnZW5fZGVmX2ZpbGUpOiBPdXRwdXQgYWxpYXMgZm9yIHN0ZGNhbGwgc3ltcyBpZiBhcHByb3ByaWF0ZS4KLQotICAgICAgICAqIGJpbnV0aWxzLnRleGkgKGRsbHRvb2wpOiBEb2N1bWVudCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KLQotICAgICAgICAqIGRsbHdyYXAuYyAobG9uZ19vcHRpb25zKTogQWRkIC0tYWRkLXN0ZGNhbGwtYWxpYXMgb3B0aW9uLgotICAgICAgICAobWFpbik6IEhhbmRsZSBpdC4KLQotICAgICAgICAqIGRlZnBhcnNlLnkgKG9wdF9uYW1lKTogQWxsb3cgIi4iIGluIG5hbWUuCi0gICAgICAgICogZGxsdG9vbC5jIChkZWZfbmFtZSk6IFNldCBkbGxfbmFtZSBmcm9tIE5BTUUgZW50cnkgaW4gZGVmIGZpbGUuCi0gICAgICAgIChkZWZfbGlicmFyeSk6IFNldCBkbGxfbmFtZSBmcm9tIExJQlJBUlkgZW50cnkgaW4gZGVmIGZpbGUuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmMgKGxvbmdfb3B0aW9ucyk6IC0taW1wbGliIHN5bm9ueW0gZm9yIC0tb3V0cHV0LWxpYi4KLSAgICAgICAgKG1haW4pOiBQYXNzIC0tZXhwb3J0LWFsbCB0byBkbGx0b29sIG9ubHkgaWYgc3BlY2lmaWVkLgotICAgICAgICAocHJvZ3JhbV92ZXJzaW9uKTogVXAgdG8gMC4yLjMuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmMgKG15YmFzZW5hbWUpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtYWluKTogUnVuIGRsbHRvb2wgdG8gY3JlYXRlIGV4cG9ydCBkZWZpbml0aW9uIGZpbGUgYW5kIGltcG9ydAotICAgICAgICBsaWJyYXJ5IGZpbGUgaWYgbmVjZXNzYXJ5LgotICAgICAgICBDaGFuZ2UgZXhwX2ZpbGVfbmFtZSBzbyB0aGF0IGl0J3MgYmFzZWQgb24gdGhlIGRsbCBuYW1lLgotCi1TdW4gT2N0IDI1IDEwOjM3OjQ1IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsdG9vbC5jIChzY2FuX2FsbF9zeW1ib2xzKTogRml4IHBhdGNoIGVycm9yLgotCi1GcmkgT2N0IDE2IDIyOjU2OjIwIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogbm0uYyAoZGlzcGxheV9yZWxfZmlsZSk6IGZpeCAibm8gc3ltYm9scyIgbWVzc2FnZXMuCi0JKiBvYmpkdW1wLmMgKHNsdXJwX3N5bXRhYik6IGRpdHRvLgotCSogcG8vUE9URklMRVMuaW4sIHBvL2JpbnV0aWxzLnBvdDogcmVidWlsdAotCi1Nb24gT2N0IDEyIDE0OjI4OjAzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IFJlbmFtZSBmaWVsZCBmcm9tIFZhbHVlIHRvIEluZm8gdG8KLQltYXRjaCBuYW1lIG9mIGZpZWxkIGluIEVMRiBzdHJ1Y3R1cmVzLgotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogY2FsbCBBQ19FWEVFWFQgaW5zdGVhZCBvZiBBTV9FWEVFWFQgYW5kCi0JQU1fQ1lHV0lOMzIuCi0JKiBhY2xvY2FsLm00OiByZW1vdmUgbG9jYWwgQU1fRVhFRVhUL0FNX0NZR1dJTjMyIG1hY3Jvcy4KLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQlGcm9tIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PjoKLSAgICAgICAgKiBkbGx0b29sLmMgKHNjYW5fYWxsX3N5bWJvbHMpOiBEb24ndCByZS1leHBvcnQgc3ltYm9scyBleHBvcnRlZAotICAgICAgICBieSBvdGhlciBETExzLgotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChCVUlMRF9ETExXUkFQKTogQWRkLgotCShCVUlMRF9ETExXUkFQLCBETExXUkFQX1BST0cpOiBBZGQuCi0JKGJpbl9QUk9HUkFNUyk6IEFkZCBkbGx3cmFwLgotCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUgd2l0aCBhdXRvbWFrZQotCi0JRnJvbSBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT46Ci0gICAgICAgICogZGxsd3JhcC5jOiBOZXcgZmlsZSBmcm9tIGRsbGhlbHBlcnMgdjAuMi4xLgotCShwcmludF92ZXJzaW9uKTogTmV3IGZ1bmN0aW9uLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS12ZXJzaW9uLgotCShtYWluKTogSGFuZGxlLgotICAgICAgICAqIGR5bi1zdHJpbmcuaCwgZHluLXN0cmluZy5jOiBOZXcgZmlsZXMgZnJvbSBlZ2NzLTEuMS9nY2MuCi0gICAgICAgICogY29uZmlndXJlLmluIChCVUlMRF9ETExXUkFQKTogQWRkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVHVlIE9jdCAgNiAxODoyMDoxMCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAod2luZHJlc19TT1VSQ0VTKTogQWRkIHJlc3Jlcy5jLgotCSh3aW5kcmVzX09CSkVDVFMpOiBBZGQgcmVzcmVzLm8uCi0JKiBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZSB3aXRoIGF1dG9tYWtlCi0KLSAgICAgICAgRnJvbSBBbmRlcnMgTm9ybGFuZGVyIDxhbm9ybGFuZEBoZW0yLnBhc3NhZ2VuLnNlPi4KLSAgICAgICAgKiByZXNyZXMuYzogTmV3IGZpbGUuICBJbXBsZW1lbnRhdGlvbiBvZiByZWFkX3Jlc19maWxlIGFuZAotICAgICAgICB3cml0ZV9yZXNfZmlsZSBmdW5jdGlvbnMgZm9yIHdpbmRyZXMuCi0gICAgICAgICogcmNwYXJzZS55OiBIYW5kbGUgQ09OVFJPTCdzIHdpdGggbmFtZWQgY2xhc3Nlcy4KLSAgICAgICAgKiByZXNiaW4uYzogQnVnIGluIHJlc190b19iaW5fZGlhbG9nIGFuZCBiaW5fdG9fcmVzX2RpYWxvZwotICAgICAgICB3aGVuIGRpYWxvZyBpcyBleHRlbmRlZDogVGhlIHZlcnNpb24gYW5kIHNpZ25hdHVyZSBmaWVsZHMgc2hvdWxkCi0gICAgICAgIGJlIHJldmVyc2VkIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4gSWQgaXMgMzIgYml0cyBsb25nIGluCi0gICAgICAgIGV4dGVuZGVkIGRpYWxvZ3MuCi0gICAgICAgICogcmVzcmMuYyAod3JpdGVfcmNfZGlhbG9nKTogcHJvcGVybHkgcHJpbnQgY29udHJvbHMgd2l0aCBuYW1lZAotICAgICAgICBjbGFzc2VzLgotICAgICAgICAqIHdpbmRyZXMuYyAocmVhZF9yZXNfZmlsZSwgd3JpdGVfcmVzX2ZpbGUpOiBSZW1vdmUgc3R1YnMuCi0gICAgICAgICogcmVzcmVzLmMgKHdyaXRlX3Jlcyk6IFJlbmFtZSBSVF9BQ0NFTEVSQVRPUlMgdG8gUlRfQUNDRUxFUkFUT1IuCi0KLVN1biBPY3QgIDQgMjA6MzQ6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBOb2t1YmkgSGlyb3Rha2EgPGhub2t1YmlAeXl5Lm9yLmpwPjoKLQkqIG9iamNvcHkuMTogRml4IHR5cG8gaW4gLS1yZW1vdmUtbGVhZGluZy1jaGFyIGRvY3MuCi0JKiBvYmpkdW1wLjE6IEZpeCBmb3JtYXR0aW5nIGluIC0tc3RhYnMgZG9jcy4KLQotU2F0IFNlcCAxOSAyMzozMzo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjcGFyc2UueSAobWVtZmxhZ3NfbW92ZSk6IENvcnJlY3QgcmVjdXJzaW9uLgotCi0xOTk4LTA5LTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWJvbF90YWJsZSk6IFByaW50IGluIGhpc3RvZ3JhbSBob3cgbWFueQotCXN5bWJvbHMgYXJlIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgY2hhaW4gbGVuZ3RoLgotCi1TdW4gU2VwICA2IDE2OjE1OjQ3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzKTogRG8gbm90IHRyeSB0byBkdW1wIGVtcHR5Ci0Jc2VjdGlvbnMuCi0KLVNhdCBTZXAgIDUgMTk6MTc6MTAgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRsbHRvb2wuYyAoc2Nhbl9hbGxfc3ltYm9scyk6IERvbid0IHJlLWV4cG9ydCBzeW1ib2xzIGV4cG9ydGVkCi0JYnkgb3RoZXIgRExMcy4KLQotMTk5OC0wOS0wMiAxNDo1MCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBQcmludCBEVF8qIHZhbHVlIG9ubHkgaWYKLQlkb19keW5hbWljLgotCShkb19oaXN0b2dyYW0pOiBOZXcgdmFyaWFibGUuCi0JKG9wdGlvbnMpOiBOZXcgbG9uZyBvcHRpb24gaGlzdG9ncmFtLiAgU2V0IGRvX2hpc3RvZ3JhbSBpZiB0aGlzCi0Jb3B0aW9uIGlzIHVzZWQuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1oaXN0b2dyYW0uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgMCByZXR1cm4gdmFsdWUgZnJvbSBnZXRvcHRfbG9uZy4gIEVuYWJsZQotCWRvX2hpc3RvZ3JhbSBmb3IgLWEuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogUmVhZCBoYXNoIHRhYmxlIGFsc28gaWYgb25seSBkb19oaXN0b2dyYW0uCi0JQWRkIGNvZGUgdG8gcHJpbnQgaGFzaCB0YWJsZSBoaXN0b2dyYW0uCi0KLTE5OTgtMDgtMjUgMTY6NDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUmVhZCBzeW1pbmZvIHNlY3Rpb24gaWYKLQlhdmFpbGFibGUuCi0JKHByb2Nlc3Nfc3ltaW5mbyk6IE5ldyBmdW5jdGlvbi4gIFByaW50IHN5bWluZm8gaW5mb3JtYXRpb24uCi0JKHByb2Nlc3NfZmlsZSk6IENhbGwgcHJvY2Vzc19zeW1pbmZvIGFuZCBmcmVlIHN5bWluZm8gZGF0YSBhdCB0aGUgZW5kLgotCi1XZWQgQXVnIDE5IDE2OjE5OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jICh1c2FnZSk6IEFkZCBmaWxlIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWFpbik6IERvbid0IHRyZWF0ICc/JyBhcyBhIHNwZWNpYWwgY2FzZSBpbiBnZXRvcHQgcmV0dXJuLgotCi0JKiBiaW51dGlscy50ZXhpIChkbGx0b29sKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuICBBZGQgc29tZSB1c2VzIG9mCi0JQHZhci4KLQotV2VkIEF1ZyAxOSAxNjoxOTowNyAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGxsdG9vbC5jIChnZW5fZGVmX2ZpbGUpOiBQbHVnIG1lbW9yeSBsZWFrLiAgRG9uJ3QgcHJpbnQKLQlkZW1hbmdsZWQgbmFtZSBpZiBpdCBpcyBOVUxMLgotCi0JU3VwcG9ydCBmb3IgZXhwb3J0aW5nIGFsbCBzeW1ib2xzIHRvIGFuIG91dHB1dCBleHBvcnQgZGVmIGZpbGU6Ci0JKiBkbGx0b29sLmMgKHtleHBvcnRfYWxsX3N5bWJvbHMsIG5vX2RlZmF1bHRfZXhjbHVkZXMsCi0Jbm9fZGVmYXVsdF9leGNsdWRlcywgZXhjbHVkZXN9KTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IHN0cmluZ19saXN0KTogVHlwZSB0byBob2xkIGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLgotCShzY2FuX2RyZWN0dmVfc3ltYm9scyk6IFJlbmFtZWQgZnJvbSBzY2FuX29wZW5fb2JqX2ZpbGUuCi0JKHNjYW5fZmlsdGVyZWRfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFkZF9leGNsdWRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hdGNoX2V4Y2x1ZGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzZXRfZGVmYXVsdF9leGNsdWRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbHRlcl9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2Nhbl9hbGxfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNjYW5fb3Blbl9vYmpfZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCBuZXcgb3B0aW9ucy4KLQkobWFpbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQotMTk5OC0wNy0zMSAyMToyNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMpOiBQcmludCBwX29mZnNldCB2YWx1ZSB3aXRoCi0Jc2l4IGhleCBkaWdpdHMuCi0JKGR5bmFtaWNfc2VnbWVudF9taXBzX3ZhbCk6IEFkZCBzdXBwb3J0IGZvciBEVF9NSVBTX0ZMQUdTLAotCURUX01JUFNfSVZFUlNJT04sIGFuZCBEVF9NSVBTX1RJTUVfU1RBTVAuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IEFsc28gcHJpbnQgc2Vjb25kcyBvZiB0aW1lIHN0YW1wLgotCi1GcmkgSnVsIDMxIDEwOjA0OjIzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogIEVNX0FSTSB1c2VzIHJlbGEgcmVsb2NzLgotCi0xOTk4LTA3LTMwIDE2OjI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfZHluYW1pY190eXBlKTogRG9uJ3QgdXNlZCBnZXR0ZXh0IG9uIHRoZSBuYW1lcy4KLQlBZGQgbmV3IERUXyogdmFsdWVzIGZyb20gU29sYXJpcy4gIERvbid0IHByaW50IG51ZW1yaWMgdmFsdWUgaW4KLQljYXNlIG9mIGFuIHVua25vd24gZW50cnkuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogSGFuZGxlIG5ldyBEVF8qIGVudHJpZXMuICBQcmludCBudW1lcmljCi0JdmFsdWVzIGluIGRlY2ltYWwsIG5vdCBoZXguCi0KLUZyaSBKdWwgMjQgMTY6Mjg6NTcgMTk5OCAgSmVmZiBIb2xjb21iICA8amVmZmhAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfZHluYW1pY190eXBlKTogUmVtb3ZlIGVtcHR5IGRlZmF1bHQgZnJvbSBzd2l0Y2gKLQlzdGF0ZW1lbnQuCi0KLUZyaSBKdWwgMjQgMTY6Mjg6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDI0IDA5OjM4OjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogUmVtb3ZlZCBzcHVyaW91cyBpbmNsdXNpb24gb2YgZWxmL2ludGVybmFsLmggYW5kCi0JZWxmLWJmZC5oLgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBDb25zaXN0YW50bHkgdXNlIGVsZl8gcHJlZml4IGZvciAqX3JlbG9jX3R5cGUKLQlmdW5jdGlvbnMuCi0KLVdlZCBKdWwgMjIgMTY6Mjk6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogQWRkIGR1bXBzIG9mIEhQUEEgYW5kIEFSQwotCXJlbG9jYXRpb25zLgotCi0JKHByb2Nlc3NfcmVsb2NzKTogRG8gbm90IGFib3J0IGlmIG5vIHN0cmluZyB0YWJsZSBjYW4gYmUgZm91bmQuCi0KLTE5OTgtMDctMjIgMTQ6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFJlbW92ZSBkZWZpbml0aW9uIG9mIGZ1bmN0aW9ucyB0byByZXR1cm4gcmVsb2NhdGlvbgotCXN5bWJvbCBzdHJpbmdzLiAgVGhleSBub3cgZ2V0IGltcGxpY2l0bHkgZGVmaW5lZCB3aGVuIGluY2x1ZGUgdGhlCi0Jc3lzdGVtIHNwZWNpZmljIEVMRiBoZWFkZXIuCi0KLTE5OTgtMDctMjIgMTM6NTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEJlZm9yZSBpbmNsdWRlIHN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyIGRlZmluZQotCVNUQVJUX1JFTE9DX05VTUJFUlMsIFJFTE9DX05VTUJFUiwgYW5kIEVORF9SRUxPQ19OVU1CRVJTLiAgRm9yIG5vdwotCXVzZWQgZm9yIHBwYywgbWlwcywgYW5kIG1uMTAzMDAuCi0KLVdlZCBKdWwgMjIgMTA6MjY6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogRGlzcGxheSBudW1iZXIgb2YgdW5yZWNvZ25pc2VkCi0JcmVsb2NhdGlvbnMuCi0KLTE5OTgtMDctMjEgMTM6MTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFVzZSBzeW1ib2xpYyBuYW1lcyBvZiByZWxvY2F0aW9uIGVudHJpZXMgZm9yIHRoZSB2YXJpb3VzCi0JYXJjaGl0ZWN0dXJlcy4gIENvcnJlY3QgbW9yZSBsYXlvdXQgZGV0YWlscy4KLQlQcmludCBuYW1lcyBvZiBNSVBTIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICBQcmludCBBbHBoYSwgQVJNLCBhbmQKLQlNSVBTIHJlbG9jYXRpb24gdHlwZSBuYW1lcy4KLQotMTk5OC0wNy0yMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBBZGQgY29kZSBmb3Igc3RyaXAgYWxsIHN5bWJvbHMgY2FzZS4KLSAgICAgICAgKGNvcHlfb2JqZWN0cyk6IFN0cmlwIGFsbCBjYXNlIGlzIG5vdyBwcm9jZXNzZWQgYWxzbyB0aHJvdWdoCi0JZmlsdGVyX3N5bWJvbHMuICBObyBtYXJraW5nIHN5bWJvbHMgdXNlZCBpbiByZWxvY2F0aW9ucyB3aGVuIHN0cmlwCi0JYWxsIHN5bWJvbHMgY2FzZS4KLQkoY29weV9zZWN0aW9uKTogV2hlbiBzdHJpcCBhbGwgc3ltYm9scyBjYXNlLCByZW1vdmUgcmVsb2NhdGlvbnMKLQl3aGljaCBhcmUgbm90IGluIGtlZXAgc3RyaXAgc3BlY2lmaWMgbGlzdC4KLQkoc3RyaXBfbWFpbik6IFJlbW92ZSBndWFyZCBgc3RyaXBfc3BlY2lmaWNfbGlzdCA9PSBOVUxMJyBmb3IKLQlzZXR0aW5nIHVwIHN0cmlwIGFsbCBzeW1ib2xzIGJ5IGRlZmF1bHQuCi0KLU1vbiBKdWwgMjAgMTI6NTE6MTYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFkZHIybGluZS5jIChmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbik6IE9ubHkgY29uc2lkZXIgYSBzZWN0aW9uCi0JaWYgdGhlIHBjIHZhbHVlIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiBpdC4KLQkodHJhbnNsYXRlX2FkZHJlc3Nlcyk6IERvbid0IGNyYXNoIGlmIGZ1bmN0aW9ubmFtZSBvciBmaWxlbmFtZSBhcmUKLQludWxsLgotCi0xOTk4LTA3LTIwIDA3OjQ1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWJvbF90YWJsZSk6IEZpeCBsaXR0bGUgYWxpZ25tZW50IHByb2JsZW0KLQlpbiBwcmludGVkIHRhYmxlIGhlYWRlci4KLQotMTk5OC0wNy0yMCAwNzoxNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQ29ycmVjdCByZWFkaW5nIG9mIC5keW5hbWljIHNlY3Rpb24uCi0JKGR5bmFtaWNfc2VjdGlvbik6IE5vdyBhIGdsb2JhbCB2YXJpYWJsZS4KLQkocHJvY2Vzc19taXBzX2ZwZV9leGNlcHRpb24sIHByb2Nlc3NfbWlwc19zcGVjaWZpYywKLQlwcm9jZXNzX2FyY2hfc3BlY2lmaWMpOiBOZXcgZnVuY3Rpb25zLgotCShnZXRfZmlsZV9oZWFkZXIpOiBDYWxsIHByb2Nlc3NfYXJjaF9zcGVjaWZpYy4KLQotMTk5OC0wNy0xOSAxNToxNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogRml4IHNldmVyYWwgdmVyc2lvbmluZyByZWxhdGVkIGJ1Z3MuICBQcm9kdWNlIG5pY2VyCi0Jb3V0cHV0LgotCUFkZCBzdXBwb3J0IGZvciBwcm9jZXNzb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gTUlQUy4KLQotRnJpIEp1bCAxMCAxNTo1Nzo1OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFN3aXRjaCBwcm90b3R5cGVzIGZyb20gdW5zaWduZWQgc2hvcnQgdG8gdW5zaWduZWQKLQlpbnQuCi0KLUZyaSBKdWwgMTAgMTY6MTc6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBDaHJpc3RpYW4gSG9sbGFuZCA8Q0hvbGxhbmRAZGUubHVjZW50LmNvbT46Ci0JKiBpZWVlLmMgKHBhcnNlX2llZWUpOiBJbml0aWFsaXplIGluZm8uZ2xvYmFsX3ZhcnMgYW5kCi0JaW5mby5nbG9iYWxfdHlwZXMuCi0JKHBhcnNlX2llZWVfYXRuKTogSWdub3JlIHJlZ2lzdGVyIGxpZmV0aW1lIGluZm9ybWF0aW9uIHJlcG9ydGVkbHkKLQllbWl0dGVkIGJ5IE1SSSBjb21waWxlci4KLQotVGh1IEp1bCAgOSAxMzowODowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVsICA3IDIxOjQ4OjU0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcmVhZGVsZi5jIChieXRlX2dldCk6IFVzZSBQQVJBTVMgaW4gcHJvdG90eXBlLgotCShlcnJvcik6IE1ha2UgaXQgd29yayB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4KLQkod2Fybik6IExpa2V3aXNlLgotCShnZXRfdmVyX2ZsYWdzKTogRG9uJ3QgdXNlIGFuIEFOU0kgcHJvdG90eXBlIGluIHRoZSBkZWZpbml0aW9uLgotCi1UdWUgSnVsICA3IDEzOjI2OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBTZXQgc2l6ZSBjb3JyZWN0bHkgaWYgdGhlIHNpemUgb2YgdGhlCi0Jc2VjdGlvbiBpcyBub3QgYW4gZXZlbiBtdWx0aXBsZSBvZiB0aGUgaW50ZXJsZWF2ZS4gIEJhc2VkIG9uIHBhdGNoCi0JZnJvbSBCcmlvbiBTdG9uZSA8QnJpb24uU3RvbmVAYXR0d3MuY29tPi4KLQotVGh1IEp1bCAgMiAxNDowMTozNCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotCSogY29uZmlndXJlLmNvbTogQWRkIHZheC92bXMgc3VwcG9ydC4KLQkqIG1ha2VmaWxlLnZtcy1pbjogUmVuYW1lZCBmcm9tIG1ha2VmaWxlLnZtcy4gIEFkZCBzdWJzdGl0dXRpb25zCi0Jbm93IGRvbmUgYnkgY29uZmlndXJlLmNvbS4KLQotV2VkIEp1bCAgMSAyMDo0Mzo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEhhbmRsZSA0IGFuZCA4IGJ5dGUgc2lnbmVkCi0gCWludGVnZXJzIHdpdGggcmVhbCB1cHBlciBib3VuZHMuICBIYW5kbGUgYSBsb3dlciBib3VuZCBvbmUgbGFyZ2VyCi0gCXRoYW4gdGhlIHVwcGVyIGJvdW5kIGFzIGEgc2lnbmVkIGludGVnZXIuICBIYW5kbGUgOCBieXRlIHNpZ25lZAotCWludGVnZXJzLgotCShzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlKTogT3B0aW9uYWxseSByZXR1cm4gdGhlIGRlbWFuZ2xlZCBuYW1lIG9mCi0JdGhlIHRlbXBsYXRlLgotCShzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZCk6IFRyZWF0IGEgdGVtcGxhdGUgbmFtZSBhcyBhIHRhZ2dlZAotCXR5cGUuCi0JKHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlKTogTGlrZXdpc2UuCi0KLVdlZCBKdWwgIDEgMTY6Mjk6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jOiBNaW5vciBmb3JtYXR0aW5nIGltcHJvdmVtZW50cy4KLQkqIHJlYWRlbGYuYzogTWlub3Igb3V0cHV0IGZvcm1hdHRpbmcgaW1wcm92ZW1lbnQuCi0KLVdlZCBKdWwgIDEgMTQ6MjM6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByY2xleC5sOiBBZGQgY2FzdHMgYW5kIGNoYW5nZSB0eXBlcyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIHJjcGFyc2UueTogTGlrZXdpc2UuCi0JKiByZXNiaW4uYzogTGlrZXdpc2UuCi0JKiByZXNjb2ZmLmM6IExpa2V3aXNlLgotCSogcmVzcmMuYzogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEhGSUxFUyk6IFJlbW92ZSByZWFkZWxmLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBBbmRyZXcgS296aW4KLQk8QW5kcmV3LktvemluQHAxNC5mOTYwLm41MDIwLnoyLmZpZG9uZXQub3JnPjoKLQkqIHdpbmR1bmkuaDogTmV3IGZpbGUsIGZyb20gd2luZHJlcy5oLgotCSogd2luZHVuaS5jOiBOZXcgZmlsZSwgZnJvbSB3aW5kcmVzLmMuCi0JKiB3aW5kcmVzLmM6IE1vdmUgVW5pY29kZSBmdW5jdGlvbnMgaW50byB3aW5kdW5pLmMuCi0JKiB3aW5kcmVzLmg6IE1vdmUgVW5pY29kZSBkZWNsYXJhdGlvbnMgaW50byB3aW5kdW5pLmguICBJbmNsdWRlCi0Jd2luZHVuaS5oLgotIAkoUlRfQUNDRUxFUkFUT1IpOiBSZW5hbWUgZnJvbSBSVF9BQ0NFTEVSQVRPUlMgdG8gbWF0Y2ggV2luZG93cwotCW1hY3JvLiAgQ2hhbmdlIGFsbCB1c2VzLgotCShSVF9QTFVHUExBWSwgUlRfVlhEKTogQ29ycmVjdCB2YWx1ZXMuCi0JKiBNYWtlZmlsZS5hbSAoSEZJTEVTKTogQWRkIHdpbmRyZXMuaC4KLQkoQ0ZJTEVTKTogQWRkIHdpbmR1bmkuYy4KLQkod2luZHJlc19TT1VSQ0VTKTogQWRkIHdpbmR1bmkuYy4KLQotTW9uIEp1biAyOSAxNzowMToyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFVzZSBCRkQgSW50ZXJuYWwgYW5kIEV4dGVybmFsIEVsZiBzdHJ1Y3R1cmVzLgotCSogcmVhZGVsZi5oOiBSZW1vdmVkIC0gbm8gbG9uZ2VyIG5lZWRlZC4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVhZGVsZi5jJ3MgZGVwZW5kZW5jeSB1cG9uIHJlYWRlbGYuaC4KLQotMTk5OC0wNi0yNiAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IGtlZXBfc3BlY2lmaWNfbGlzdCA9PSBOVUxMIGFzIGFkZGl0aW9uYWwKLQljb25kaXRpb24gdG8gc2V0IHVwIHN0cmlwIGFsbCBzeW1ib2xzIGJ5IGRlZmF1bHQuCi0JKGNvcHlfYXJjaGl2ZSk6IGRvbid0IGNoYW5nZSBhcmNoaXZlIHdoZW4gZXJyb3IgaW4gb2JqZWN0IGZpbGVzIG9mCi0JdGhlIGFyY2hpdmUuCi0KLVdlZCBKdW4gMjQgMTc6NTM6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9udW1iZXIpOiBTaWduIGV4dGVuZCBuZWdhdGl2ZSB2YWx1ZXMgY29ycmVjdGx5IGlmCi0JYmZkX3ZtYSBpcyBsYXJnZXIgdGhhbiB1bnNpZ25lZCBsb25nLgotCi1UdWUgSnVuIDIzIDE0OjU1OjA1IDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IGxldCBFWEVFWFQgaW50ZXJmZXJlCi0Jd2l0aCB0aGUgcHJvZ3JhbSB0cmFuc2Zvcm0gbmFtZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVuIDIzIDExOjA4OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogUmV3cml0ZSB0byB1c2UgZm9wZW4vZnJlYWQgcmF0ZWhyIHRoYW4gbW1hcC4KLQotCUFkZCAtLXNlY3Rpb24taGVhZGVycyBjb21tYW5kIGxpbmUgc3dpdGNoLCB3aGljaCBpcyBhbiBhbGlhcyBmb3IKLQktLXNlY3Rpb25zLgotCi0JSW5jb3Jwb3JhdGUgaW1wcm92ZW1udHMgbWFkZSBieSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+IGluY2x1ZGluZyBvdXRwdXQKLQlmb3JtYXR0aW5nIGFuZCB2ZXJzaW9uIGluZm8gZGlzcGxheS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgLS1zZWN0aW9uLWhlYWRlcnMgc3dpdGNoIHRvIHJlYWRlbGYuCi0KLU1vbiBKdW4gMjIgMTg6Mjg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEluY2x1ZGUgYmZkLmggYW5kIGJ1Y29tbS5oIGJlZm9yZSBzeXN0ZW0gaGVhZGVyCi0JZmlsZXMuCi0JKHBhcnNlX2FyZ3MpOiBDaGFuZ2UgdHlwZSBvZiBjIGZyb20gY2hhciB0byBpbnQuCi0KLVN1biBKdW4gMTQgMTQ6MjY6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jICh1c2FnZSk6IFdyaXRlIHRvIHN0ZG91dCwgbm90IHN0ZGVyci4KLQotRnJpIEp1biAxMiAxMzozMzo1MSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBEZXBlbmQgb24gLnBvdCBmaWxlIGlmIG1haW50YWluZXIgbW9kZQotCWVuYWJsZWQuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotRnJpIEp1biAxMiAxNjowNjoxNSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfcHBjX3JlbF90eXBlKTogTmV3IFBvd2VyUEMgc3VwcG9ydC4KLQkoZHVtcF9yZWxvY2F0aW9ucyk6IFBvd2VyUEMgdXNlcyBSRUxBIHJlbG9jYXRpb25zLgotCShnZXRfbWFjaGluZV9uYW1lKTogU3BlbGwgUG93ZXJQQyBjb3JyZWN0bHkuCi0JKGdldF9maWxlX3R5cGUpOiBDaGFuZ2UgdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVyIHRvIHVuc2lnbmVkLgotCShnZXRfbWFjaGluZV9uYW1lKTogRGl0dG8uCi0JKGdldF9tYWNoaW5lX2RhdGEpOiBSZXR1cm4gd2hldGhlciBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4uCi0JKGdldF9tYWNoaW5lX2ZsYWdzKTogSW50ZXJwcmV0IFBvd2VyUEMsIE0zMlIsIGFuZCBNSVBTIGZsYWdzLgotCShwcm9jZXNzX2VsZl9oZWFkZXIpOiBQcmludCBlbmRpYW4tZXNzLiAgQ29udmVydCBhbGwgbnVtZXJpYwotCWZvcm1hdHMgdG8gbG9uZyBvciB1bnNpZ25lZCBsb25nLiAgUHJpbnQgb3V0IG1hY2hpbmUgc3BlY2lmaWMgZmxhZwotCWJpdHMuCi0JKHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzKTogSW5jcmVhc2UgbmFtZSBieSAzIGNvbHVtbnMgYW5kIGRlY3JlYXNlCi0JdHlwZSBieSB0aGUgc2FtZSBzbyB0aGF0IC5nY2NfZXhjZXB0X3RhYmxlIGZpdHMgaW4gdGhlIHNwYWNlLgotCi0JKiByZWFkZWxmLmg6IEluY2x1ZGUgZWxmL3BwYy5oLCBlbGYvbWlwcy5oLCBhbmQgZWxmL20zMnIuaCB0byBnZXQKLQltYWNoaW5lIHNwZWNpZmljIGZsYWcgYml0cy4KLQotVGh1IEp1biAxMSAxNzo1NDoyNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFJlbW92ZSBleHRyYW5lb3VzICNpbmNsdWRlcy4gIEZpeCB3YXJuaW5ncyBwcm9kdWNlZAotCWJ5IC1XYWxsIHdoZW4gY29tcGlsaW5nIHVuZGVyIExpbnV4LgotCi0JKiBNYWtlZmlsZS5hbSAocmVhZGVsZl9MREFERCk6IEFkZCAkKExJQklCRVJUWSkuCi0KLVRodSBKdW4gMTEgMTg6MzA6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgc2VsZl9jcm9zc3JlZiBmaWVsZC4KLQkocGFyc2Vfc3RhYl9zdHJpbmcpOiBJZiBhIHRhZyBpcyBhIGNyb3NzIHJlZmVyZW5jZSB0byBpdHNlbGYsCi0JZG9uJ3QgZGVmaW5lIGl0IGluIHRoZSB0YWdzIGxpc3QuCi0JKHBhcnNlX3N0YWJfdHlwZSk6IFNldCBpbmZvLT5zZWxmX2Nyb3NzcmVmLgotCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QpOiBEZWZpbmUuCi0JKGRlYnVnX2dldF9yZWFsX3R5cGUpOiBBZGQgbGlzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JQ2hlY2sgZm9yIGNpcmN1bGFyaXR5IHRvIGF2b2lkIGNyYXNoaW5nIHdoZW4gaXQgb2NjdXJzLgotCi1UaHUgSnVuIDExIDE0OjQ4OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogTmV3IGZpbGU6IERpc3BsYXkgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlLgotCSogcmVhZGVsZi5oOiBOZXcgZmlsZTogSGVhZGVyIGZpbGUgZm9yIHJlYWRlbGYuYwotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyB0byBidWlsZCByZWFkZWxmLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCByZWFkZWxmLgotCSogTkVXUzogTWVudGlvbiBpbmNsdXNpb24gb2YgcmVhZGVsZiBpbnRvIGJpbnV0aWxzLgotCSogcG8vUE9URklMRVMuaW47IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDUgMTg6NDM6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBBZGp1c3QgdGhlIHNlY3Rpb24gc2l6ZSBpZiBjb3B5X2J5dGUKLQlpcyA+PSAwLgotCShjb3B5X3NlY3Rpb24pOiBEbyBub3QgY2FsbCBiZmRfc2V0X3NlY3Rpb25fc2l6ZS4KLQotVGh1IEp1biAgNCAwOToxMjoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UpOiBBZGQgbWlzc2luZyBcblwgZnJvbSBoZWxwIGRlc2NyaXB0aW9uLgotCi1XZWQgSnVuICAzIDE5OjMxOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFlBQ0MpOiBDb3JyZWN0IGJpc29uIC1MIG9wdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1wLy0tcHJpdmF0ZS1oZWFkZXJzLgotCi1XZWQgSnVuICAzIDEyOjA5OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogQWRkIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uczogLS1jaGFuZ2Utc2VjdGlvbi1sbWEKLQlhbmQgLS1jaGFuZ2Utc2VjdGlvbi12bWEuICBSZW5hbWUgb2xkIGNvbW1hbmQgbGluZSBvcHRpb24KLQktLWFkanVzdC1zZWN0aW9uLXZtYSB0byAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MuICBSZW5hbWUKLQktLWFkanVzdC12bWEgdG8gLS1jaGFuZ2UtYWRkcmVzc2VzIGFuZCAtLWFkanVzdC1zdGFydCB0bwotCS0tY2hhbmdlLXN0YXJ0LiAgUHJvdmlkZSBhbGlhc2VzIHRvIHN1cHBvcnQgdGhlIG9sZCB2ZXJzaW9ucyBvZgotCXRoZXNlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi0JQ2hhbmdlIHRoZSBuYW1lcyBvZiBtYWNyb3MgYW5kIGVudW0gZWxlbWVudHMgdG8gdXBwZXIgY2FzZSB0bwotCW1hdGNoIHRoZSBHTlUgY29kaW5nIHN0YW5kYXJkLgotCi0JUmVwbGFjZSBjYWxscyB0byBmcHJpbnRmIChzdGRlcnIsLi4uKSB3aXRoIGNhbGxzIHRvIGZhdGFsICgpIG9yCi0Jbm9uX2ZhdGFsICgpIGFzIGFwcHJvcHJpYXRlLgotCi0JKiBvYmpjb3B5LjE6IERvY3VtZW50IGNvbW1hbmQgbGluZSBvcHRpb24gY2hhbmdlcy4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGNvbW1hbmQgbGluZSBvcHRpb24gY2hhbmdlcy4KLQotCSogYnVjb21tLmg6IE5ldyBleHBvcnRlZCBmdW50aW9uIGZyb20gYnVjb21tLmM6IG5vbl9mYXRhbCgpLgotCSogYnVjb21tLmMgKG5vbl9mYXRhbCk6IE5ldyBleHBvcnRlZCBmdW5jdGlvbi4gIEp1c3QgbGlrZSBmYXRhbCgpCi0JZXhjZXB0IHRoYXQgaXQgcmV0dXJucyByYXRoZXIgdGhhbiBjYWxsaW5nIHhleGl0KCkuCi0KLQkoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2FsbCBmYXRhbCgpIHJhdGhlciB0aGFuIGJmZF9mYXRhbCgpLgotCi0JKGNoZWNrX21hdGNoaW5nX2Zvcm1hdHMpOiBGaXggQyBmb3JtYXRpbmcuCi0KLQkocGFyc2Vfdm1hKTogQ2FsbCBmYXRhbCgpLgotCi1Nb24gSnVuICAxIDE4OjI2OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gWXVsaSBCYXJjb2hlbiA8eXVsaS5iYXJjb2hlbkB0ZWxyYWQuY28uaWw+OgotCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IEF2b2lkIGVuZGxlc3MgbG9vcHMgY29tcGFyaW5nCi0JZnVuY3Rpb24gYW5kIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuCi0KLUZyaSBNYXkgMjIgMTQ6MDI6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGR1bXBfaWF0KTogQ29tbWVudCBvdXQ7IG5vdCB1c2VkLgotCShkaXNwbGF5KTogUmVuYW1lIGZyb20gdGVsbC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotVGh1IE1heSAxNCAxNDowMDo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiBETExzLiAgQWRkIHN1cHBvcnQgZm9yCi0JaW50ZXJ3b3JraW5nIGJldHdlZW4gQVJNIGFuZCBUaHVtYiBwcm9ncmFtcyBhbmQgRExMcy4gIFRpZHkgdGhlCi0JY29kZS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgZGxsdG9vbC4KLQotCSogY29uZmlndXJlOiBCdWlsZCBkbGx0b29sIGZvciB0aHVtYi1wZSB0YXJnZXRzLgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBJbmNsdWRlIDE5OTggaW4gY29weXJpZ2h0IHN0cmluZ3MuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWIpOiBTdXBwb3J0IFdpbjMyIHN0eWxlIGRpcmVjdG9yeSBzZXBhcmF0b3JzLgotCi1TdW4gTWF5IDEwIDIyOjM0OjQ0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotRnJpIE1heSAgOCAxMDozMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhci5jICh1c2FnZSk6IEV4dGVuZCBpbmZvcm1hdGlvbiBwcm92aWRlZCBhYm91dCBjb21tYW5kIGxpbmUKLQlvcHRpb25zLgotCi1XZWQgTWF5ICA2IDE1OjI4OjUxIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLiAgUGFzcyBDQyB2YWx1ZSB3aGVuCi0JY2FsbGluZyBtYWtlLgotCi1UdWUgTWF5ICA1IDE1OjE5OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBCdWlsZCBkbGx0b29sIGZvciB0aHVtYi1wZSB0YXJnZXQuCi0KLVN1biBNYXkgIDMgMjI6MDQ6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfUFJPR1JBTVMpOiBDaGFuZ2UgJChTUkNPTlZfUFJPRykgdG8gc3lzY29uZgotCXN5c2R1bXAgY29mZmR1bXAgdG8gYXZvaWQgZXh0cmEgJChFWEVFWFQpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBcHIgMjkgMjI6MjI6NTUgMTk5OCAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0b3AgYXBwZW5kaW5nIEVYRUVYVCB0byB0aGUgZW5kIG9mCi0JU1JDT05WX1BST0cgKHdyb25nIGJlY2F1c2UgdGhhdCB2YXJpYWJsZSBtYXkgY29udGFpbiBtdWx0aXBsZQotCXByb2dyYW1zKQotCSogTWFrZWZpbGUuYW06IGluc3RlYWQsIGFkZCBFWEVFWFRzIHRvIGVhY2ggU1JDT05WX1BST0cKLQlwcm9ncmFtCi0JKiBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZQotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBBcHIgMjggMTk6MTQ6MzQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IENvbmRpdGlvbmFsbHkgY2FsbCBzZXRsb2NhbGUuCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN5c2R1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGNvZmZkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGFyLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGJ1Y29tbS5oOiBJbmNsdWRlIDxsb2NhbGUuaD4gaWYgSEFWRV9MT0NBTEVfSC4KLQkoTENfTUVTU0FHRVMpOiBOb3cgY2FuIGJlIGRlZmluZWQgZXZlbiB3aGVuIEVOQUJMRV9OTFMuCi0KLVR1ZSBBcHIgMjggMTA6MzM6MDcgMTk5OCAgQmlsbCBNb3llciAgPHR0a0BjeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIElNUE9SVFM6Ci0JKiBkZWZwYXJzZS55IChpbXBsaW5lKTogQWRkIElNUE9SVFMgc3ludGF4ZXMuCi0JKiBkbGx0b29sLmMgKGlmdW5jdHlwZSwgaWhlYWR0eXBlKTogTmV3IHR5cGVkZWZzLgotCShpbXBvcnRfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFwcGVuZF9pbXBvcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWZfaW1wb3J0KTogQWRkIGFuIGVudHJ5IHRvIGltcG9ydF9saXN0LgotCShnZW5lcmF0ZV9pZGF0YV9vZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdlbl9leHBfZmlsZSk6IENhbGwgZ2VuZXJhdGVfaWRhdGFfb2ZpbGUuCi0JKiBkbGx0b29sLmggKGRlZl9pbXBvcnQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLU1vbiBBcHIgMjcgMTY6Mzk6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjkuNAotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXByIDIyIDE2OjAwOjM1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAwMDozMzo1NiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBTZWFyY2ggaW50bCBkaXJzIGZvciBoZWFkZXJzOyBkZWZpbmUKLQlMT0NBTEVESVIuCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgdGV4dGRvbWFpbi4KLQkqIGFyLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGNvZmZkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGRsbHRvb2wuYyAobWFpbik6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHdpbmRyZXMuYyAobWFpbik6IExpa2V3aXNlLgotCi1UdWUgQXByIDIxIDIyOjEzOjA4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBidWNvbW0uaDogQWRkZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzLgotCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAotCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuICBDcmVhdGUgcG8vTWFrZWZpbGUuaW4gYW5kCi0JcG8vTWFrZWZpbGUuICBVc2UgQU1fUFJPR19MRVguCi0JKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IE5ldyBtYWNyby4KLQkoUE9URklMRVMpOiBMaWtld2lzZS4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCShMREFERCk6IEFkZGVkIElOVExMSUJTLgotCShvYmpkdW1wX0xEQUREKTogTGlrZXdpc2UuCi0JKGNfX2ZpbHRfTERBREQpOiBMaWtld2lzZS4KLQkoYXJfTERBREQpOiBMaWtld2lzZS4KLQkocmFubGliX0xEQUREKTogTGlrZXdpc2UuCi0JKGRsbHRvb2xfTERBREQpOiBMaWtld2lzZS4KLQkod2luZHJlc19MREFERCk6IExpa2V3aXNlLgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2JpbnV0aWxzLnBvdDogTmV3IGZpbGVzLgotCi1UdWUgQXByIDIxIDE2OjA3OjE4IDE5OTggIFN0YW5pc2xhdiBCcmFiZWMgIDx1dHhAazMzMi5mZWxkLmN2dXQuY3o+Ci0KLQkqIG9iamNvcHkuYyAocHJlc2VydmVfZGF0ZXMpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKHNtYXJ0X3JlbmFtZSk6IElmIHByZXNlcnZlX2RhdGVzLCBjYWxsIHNldF90aW1lcyB3aGVuIGNvcHlpbmcuCi0JKHN0cmlwX21haW4pOiBSZW1vdmUgcHJlc2VydmVfZGF0ZXMgbG9jYWwgdmFyaWFibGUuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCi1UdWUgQXByICA3IDE1OjQxOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IEFkZCBkZWZwYXJzZS5oLCBkZWZwYXJzZS5jLCByY2xleC5jLAotCXJjcGFyc2UuaCwgYW5kIHJjcGFyc2UuYwotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBcHIgIDYgMTY6MjQ6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoUFJPR1MpOiBNb3ZlICQoQUREUjJMSU5FX1BST0cpIHRvIGVuZCwgc28gdGhhdAotCU1ha2VmaWxlLmluIGRvZXNuJ3QgaGF2ZSBhbiBlbXB0eSBjb250aW51YXRpb24gbGluZS4KLQkoYmluX1BST0dSQU1TKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAgMyAxNDo0ODo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCi0JKE1PU1RMWUNMRUFORklMRVMpOiBBZGQgYmludXRpbHMubG9nLCBiaW51dGlscy5zdW0sIGFuZCBhYmNkZWZnaCouCi0JKG1vc3RseWNsZWFuLWxvY2FsKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgQXByICAxIDE1OjU0OjE2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gWmFjayBXZWluYmVyZyA8emFja0ByYWJpLnBoeXMuY29sdW1iaWEuZWR1PiBhbmQgSC5KLiBMdQotCTxoamxAZ251Lm9yZz46Ci0JKiBhci5jICh1c2FnZSk6IE1lbnRpb24gUyBtb2RpZmllci4KLQkobWFpbik6IEFkZCBTIG1vZGlmaWVyLgotCSogYXIuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgUyBtb2RpZmllci4KLQotV2VkIEFwciAgMSAxMzoxMToyMyAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYmludXRpbHMudGV4aTogVXNlIEBpdGVteCBmb3IgYSBzZWNvbmRhcnkgaXRlbSBpbiBhIHRhYmxlLgotCi1UdWUgTWFyIDMxIDE4OjQ0OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVwLWluLnNlZDogQWRkIHJ1bGUgdG8gcmVtb3ZlIEBPQkpESVJALgotCSogTWFrZWZpbGUuYW0gKGRlcC5zZWQpOiBTdWJzdGl0dXRlIGZvciBAT0JKRElSQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMwIDEyOjQ3OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi0JKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBSZW1vdmUgZGVmcGFyc2UuaCwgYXJwYXJzZS5oLAotCXJjcGFyc2UuaCwgYW5kIG5sbWhlYWRlci5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVNhdCBNYXIgMjggMTc6Mzk6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogbmxtY29udi5jIChtYWluKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShhbHBoYV9tYW5nbGVfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCSogc2l6ZS5jIChwcmludF9zeXN2X2Zvcm1hdCk6IExpa2V3aXNlLgotCSogc3JjY29udi5jICh3cl9vYik6IExpa2V3aXNlLgotCSogd3JzdGFicy5jIChzdGFiX21vZGlmeV90eXBlKTogTGlrZXdpc2UuCi0JKHN0YWJfdmFyaWFibGUpOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IEluaXRpYWxpemUgdmFyaWFibGVzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbm0uYyAoc29ydF9zeW1ib2xzX2J5X3NpemUpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkqIHdyc3RhYnMuYyAoc3RhYl9lbmRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDIpOiBDaGFuZ2UgaiB0byB1bnNpZ25lZCBpbnQuCi0JKGRvX2xpbmVzKTogQ2hhbmdlIGwgdG8gdW5zaWduZWQgaW50LgotCSogbmxtaGVhZGVyLnkgKHl5bGV4KTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCSogbm0uYyAocHJpbnRfc3ltYm9sKTogQ2hhbmdlIGogdG8gbG9uZy4KLQkqIHNpemUuYyAobHByaW50X251bWJlcik6IENvbW1lbnQgb3V0LgotCSogc3Jjb252LmMgKHdyX29iKTogQ2hhbmdlIGkgdG8gYmZkX3NpemVfdHlwZS4KLQkqIHN5c2R1bXAuYyAodW5pdF9pbmZvX2xpc3QpOiBDb21tZW50IG91dC4KLQkob2JqZWN0X2JvZHlfbGlzdCwgcHJvZ3JhbV9zdHJ1Y3R1cmUsIGRlYnVnX2xpc3QpOiBMaWtld2lzZS4KLQkqIHN5c2luZm8ueSAoeXllcnJvcik6IFJldHVybiB2YWx1ZS4KLQotVGh1IE1hciAyNiAxNzowNjo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkZWZwYXJzZS55IChleHBsaXN0KTogQWxsb3cgZXBzaWxvbi4KLQlTdWdnZXN0aW9uIGZyb20gSm9uYXRoYW4tSGFycmlzQHBzaW9uLmNvbS4KLQotVGh1IE1hciAyNiAxNjo1OTowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ3Jvay5jIChkb19zZWN0aW9uc19wMSk6IFVzZSB0aGUgc2VjdGlvbidzIGxtYSBpbnN0ZWFkIG9mIHZtYQotCWZvciB0aGUgYmVuZWZpdCBvZiBwcm9tIGxvYWRlcnMuCi0KLVdlZCBNYXIgMjUgMTM6MDU6MzkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkoRElTVENMRUFORklMRVMpOiBOZXcgdmFyaWFibGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIE1hciAyNCAxOTozMzowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IEFjY2VwdCB7IGFuZCB9IGFzIHN5bm9ueW1zIGZvciBCRUdJTiBhbmQgRU5ELgotCi1GcmkgTWFyIDIwIDE5OjE4OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVR1ZSBGZWIgMjQgMTM6MDc6NTAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRGVsZXRlICIrK3BsYWNlIiBhZnRlciBjYWxsIHRvCi0JZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MuICBTZXQgZGlzYXNtX2luZm8uc3ltYm9scyB0byBhcnJheSBvZgotCXN5bWJvbHMgYXQgdGhlIGN1cnJlbnQgYWRkcmVzcy4KLQotV2VkIEZlYiAxOCAyMzozOTo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogSW5zdGFsbCBwcm9wZXJseSB3aGVuIGxuCi0JZmFpbHMgb3IgdG9vbGRpciA9PSBwcmVmaXguCi0KLVR1ZSBGZWIgMTcgMTg6NDA6NTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb21wYXJlX3NlY3Rpb25fbG1hKTogUmVuYW1lIGZyb20gX3ZtYS4KLSAgICAgICAgKGNvcHlfb2JqZWN0KTogR2FwIGZpbGwgYmFzZWQgb24gTE1BIG5vdCBWTUEuCi0JKiBiaW51dGlscy50ZXhpOiBVcGRhdGUgYW5kIGNsYXJpZnkuCi0JKiBvYmpjb3B5LjE6IExpa2V3aXNlLgotCi1UdWUgRmViIDE3IDIwOjM0OjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChnZW5fZXhwX2ZpbGUpOiBHZW5lcmF0ZSBfaW1wX18lcyBhcyB3ZWxsIGFzIF9faW1wXyVzLAotCWZvciBNaWNyb3NvZnQgY29tcGF0aWJpbGl0eS4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBMaWtld2lzZS4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IERvbid0IGFkZCAxIHRvIGhpbnQuCi0KLUZyaSBGZWIgMTMgMTY6Mzc6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCi1UaHUgRmViIDEyIDE0OjEzOjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVmbGV4Lmw6IEFjY2VwdCAnPycgaW4gc3ltYm9sIG5hbWVzLCBmb3IgVkMrKyBtYW5nbGVkIG5hbWVzLgotCUZyb20gTWlrZXkgPGplZmZkYkBuZXR6b25lLmNvbT4uCi0KLQkqIGFkZHIybGluZS5jICh1c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0JKiBhci5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChzaG93X3VzYWdlKTogTGlrZXdpc2UuCi0JKiBubS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogTGlrZXdpc2UuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiB3aW5kcmVzLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCi0KLVNhdCBGZWIgIDcgMTU6MzY6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVGh1IEZlYiAgNSAxMjoyMToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotRnJpIEphbiAzMCAxOToxNjoyOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0NfRk9SX1RBUkdFVCxubG1jb212Lm8pOiBDaGFuZ2UgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotCXRvIHRyYW5zZm9ybS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1UaHUgSmFuIDI5IDE2OjI0OjA0IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBkbGx0b29sLmM6IERlZmluZSBleGl0IHN0YXR1cyBtYWNyb3MgZm9yIF9XSU4zMiBidXQgbm90Ci0JX19DWUdXSU4zMl9fLgotCShnZW5fbGliX2ZpbGUpOiBDaGVjayBmb3IgZXhpdCBzdGF0dXMgb2YgdW5saW5rLgotCSogcmVzcmMuYzogRGVmaW5lIHBvcGVuIGFuZCBwY2xvc2UgaWYgX1dJTjMyIGJ1dCBub3QKLQlfX0NZR1dJTjMyX18uCi0KLVdlZCBKYW4gMjggMTc6NDU6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSB2Zm9yayBjaGVjay4KLQkqIG5sbWNvbnYuYzogTmV2ZXIgaW5jbHVkZSB2Zm9yay5oLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDI4IDE3OjQzOjAyIDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogT25seSBwYXNzIG9uZSBhcmd1bWVudCB0byBta2RpciBpZgotCV9XSU4zMiBidXQgbm90IF9fQ1lHV0lOMzJfXy4KLQkoc21hcnRfcmVuYW1lKTogQWRkIGNvZGUgZm9yIF9XSU4zMiAobm90IF9fQ1lHV0lOMzJfXyksIHRvIGNvcGUKLQl3aXRoIGRpZmZlcmVudCByZW5hbWUgYmVoYXZpb3VyIGFuZCBsYWNrIG9mIGNob3duLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBtaW5ndzMyIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBidWlsZAotCWRsbHRvb2wuCi0JKiBkbGx0b29sLmM6IE5ldmVyIGluY2x1ZGUgdmZvcmsuaC4KLQkocnVuKTogVXNlIHBleGVjdXRlIHJhdGhlciB0aGFuIHZmb3JrLgotCShnZW5fbGliX2ZpbGUpOiBDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX3NldF9hcmNoaXZlX2hlYWQgYW5kCi0JYmZkX2Nsb3NlLiAgQ2xvc2UgYWxsIHRoZSBCRkRzIGluIHRoZSBhcmNoaXZlIGJlZm9yZSBkZWxldGluZyB0aGUKLQl0ZW1wb3JhcnkgZmlsZXMuCi0KLVRodSBKYW4gMjIgMTY6MjI6NTUgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBZGQgZmxhZyBJTlNOX0hBU19SRUxPQyB0byB0ZWxsCi0JZGlzYXNzZW1ibHkgZnVuY3Rpb24gdGhlcmUgaXMgYSByZWxvYyBvbiB0aGlzIGxpbmUuCi0KLVdlZCBKYW4gMTQgMTU6Mjk6NDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHNoLCBoODMwMCk6IERlbGV0ZSB2YXJpYWJsZXMuCi0JKGFkZHJzaXplLCB0b29sbmFtZSwgcm5hbWVzKTogTmV3IHZhcmlhYmxlcy4KLQkod3JpdGVJTlQpOiBVc2UgYWRkcnNpemUuCi0JKHdyX3VuKTogVXNlIHRvb2xuYW1lLgotCSh3cl9oZCk6IFNldCB1cCBhZGRyc2l6ZSBldCBhbCBwcm9wZXJseSBmb3IgaDgzMDBbaHNdLgotCSh3YWxrX3RyZWVfc3ltYm9sKTogWmVybyBkc3kuICBVc2Ugcm5hbWVzLgotCSh3cl91biwgd3JfaGQsIHdyX29iLCB3cl9kdSk6IFVzZSBwcm9wZXIgYmZkIGFjY2VzcyBtYWNyb3MuCi0JKiBzeXNkdW1wLmMgKHNoLCBoODMwMCk6IERlbGV0ZSB2YXJpYWJsZXMuCi0JKGFkZHJzaXplKTogTmV3IHZhcmlhYmxlLgotCShnZXRJTlQpOiBVc2UgaXQuCi0JKGdldG9uZSk6IEluaXRpYWxpemUgaXQuCi0JKGdldEJJVFMpOiBSYW5nZSBjaGVjayBvbiBNQVguCi0KLU1vbiBEZWMgMjkgMTY6NTg6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBNYXR0aGV3IEJlbGxhbnRvbmkgPG1hdHRoZXdAY2hyeXNhbGlzLmNvbT46Ci0JKiBhci5jIChnZXRfcG9zX2JmZCk6IEFkZCBkZWZhdWx0X3Bvc25hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHJlcGxhY2VfbWVtYmVycyk6IERlZmF1bHQgdG8gcmVwbGFjaW5nIGluIHRoZSBzYW1lIHBvc2l0aW9uLgotCi1Nb24gRGVjIDIyIDExOjI3OjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmNsZXgubDogRG9uJ3QgcGVybWl0IGEgY29tbWEgaW4gYSBTVFJJTkcuCi0JKiByY3BhcnNlLnkgKGFjY19lbnRyeSk6IFdhcm4gaWYgYW4gaW5hcHByb3ByaWF0ZSBtb2RpZmllciBpcyB1c2VkCi0Jd2l0aCBhIG5vbiBWSVJUS0VZLgotCShhY2NfZXZlbnQpOiBGb3IgYSBjb250cm9sIGNoYXJhY3Rlciwgc2V0IFZJUlRLRVksIGFuZCBmb3JjZSB0aGUKLQljaGFyYWN0ZXIgdG8gdXBwZXJjYXNlLgotCShhY2Nfb3B0aW9ucyk6IERvbid0IHJlcXVpcmUgYSBjb21tYSBzZXBhcmF0b3IuCi0KLVR1ZSBEZWMgIDkgMTM6MjU6NDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNpemUuYyAoc2l6ZV9udW1iZXIpOiBOZXcgZnVuY3Rpb24gdG8gcHJvdmlkZSBzaXplIG9mIGZpZWxkLgotCSh7bCxyfXByaW50X251bWJlcik6IEZvciBvY3RhbCBhbmQgaGV4IGZpZWxkcywgcHJpbnQgZmllbGQgdXNpbmcKLQknMCcgYW5kICcweCcgc3VmZml4ZXMuICBEbyBub3QgaW5jbHVkZSBmb2xsb3dpbmcgdGFiLgotCShzeXN2X2ludGVybmFsX3NpemVyKTogU2l6ZSBzZWN0aW9uIG5hbWUsIHNlY3Rpb24gc2l6ZSwgYW5kIHZtYQotCWFkZHJlc3MgZmllbGRzLgotCShzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBVc2UgY2FsY3VsYXRlZCBzaXplcyBmb3IgdGhlIGNvbHVtbnMuCi0JKHByaW50X3N5c3ZfZm9ybWF0KTogU2l6ZSBjb2x1bW5zIGJlZm9yZSBwcmludGluZy4KLQkocHJpbnRfYmVya2VsZXlfZm9ybWF0KTogUHJpbnQgdGFicyBiZXR3ZWVuIG51bWJlcnMgbm93IHRoYXQKLQl7bCxyfXByaW50X251bWJlciBkb2Vzbid0LiAgUHJpbnQgZmllbGRzIHJpZ2h0IGp1c3RpZmllZC4KLQotTW9uIERlYyAgOCAxMToyMjowNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IFJlbW92ZSBjYWxsIHRvCi0JZGlzYXNtX3N5bWFkZHIoKSBhcyB0aGlzIGZ1bmN0aW9uIG5vIGxvbmdlciBleGlzdHMuCi0KLVR1ZSBEZWMgIDIgMTA6MjM6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBDYWxsIGRpc2FzbV9zeW1hZGRyKCkKLQl0byBhbGxvdyBiYWNrZW5kIHRvIGtub3cgd2hpY2ggc3ltYm9sIGhhcyBqdXN0IGJlZW4gZGlzcGxheWVkLgotCi1UdWUgRGVjICAyIDEzOjA2OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd2luZHJlcy5oIChFU0NBUEVfKik6IERlZmluZSBzdGFuZGFyZCBlc2NhcGUgc2VxdWVuY2VzLgotCSogcmNsZXgubCAoaGFuZGxlX3F1b3Rlcyk6IEhhbmRsZSBzdGFuZGFyZCBlc2NhcGUgc2VxdWVuY2VzLiAgV2FybgotCWFib3V0IGFuIHVucmVjb2duaXplZCBlc2NhcGUgY2hhcmFjdGVyLgotCSogd2luZHJlcy5jICh1bmljb2RlX3ByaW50KTogUHJpbnQgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4KLQkqIHJjcGFyc2UueSAoYWNjX2V2ZW50KTogSW5pdGlhbGl6ZSAkJC5uZXh0LgotCSogcmVzYmluLmMgKGJpbl90b19yZXNfbWVudWl0ZW1zKTogRG9uJ3Qgc2V0IE1FTlVJVEVNX1BPUFVQIG9yCi0JTUVOVUlURU1fRU5ETUVOVSBpbiB0aGUgbWVudSBpdGVtIGZsYWdzLgotCShiaW5fdG9fcmVzX2FjY2VsZXJhdG9ycyk6IEFsbG9jYXRlIGEgc3RydWN0dXJlICh0aGUgb2xkIGNvZGUKLQluZXZlciB3b3JrZWQpLgotCShyZXNfdG9fYmluX2FjY2VsZXJhdG9yKTogQ29ycmVjdCB0aGUgdGVzdCBmb3Igc2V0dGluZyBBQ0NfTEFTVC4KLQkocmVzX3RvX2Jpbl9kaWFsb2cpOiBTYXZlIHRoZSBleHRlbmRlZCBzdHlsZSByYXRoZXIgdGhhbiBzYXZpbmcKLQl0aGUgc3R5bGUgdHdpY2UuICBSZW1vdmUgdXNlbGVzcyBzaGFkb3dpbmcgbGVuZ3RoIHZhcmlhYmxlLiAgU2V0Ci0JdGhlIGxlbmd0aCBvZiBjb250cm9sIGRhdGEgY29ycmVjdGx5LgotCSogcmVzcmMuYyAod3JpdGVfcmNfZGlhbG9nKTogRG9uJ3QgcHJpbnQgdGhlIGNsYXNzIG9yIG1lbnUgaWYgdGhlCi0Jc3RyaW5nIGxlbmd0aCBpcyB6ZXJvLgotCi1Nb24gTm92IDI0IDE4OjUyOjQzIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX2FyZ3R5cGVzKTogRG9uJ3QgdHJ5IHRvIHBhcnNlIHRoZSBuYW1lIG9mIGEKLQlkZXN0cnVjdG9yIGFzIG1hbmdsZWQgYXJndW1lbnQgdHlwZXMuCi0KLU1vbiBOb3YgMTAgMTc6NTE6NDEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGFkZHIybGluZS5jICh0cmFuc2xhdGVfYWRkcmVzc2VzKTogVXNlIGJmZF9zY2FuX3ZtYSByYXRoZXIKLQl0aGFuIHN0cnRvbCB0byBzY2FuIGFkZHJlc3Nlcy4KLQotU3VuIE5vdiAgOSAxMTowMTozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmFtIChiaW5fUFJPR1JBTVMpOiBEb24ndCB1c2UgbGluZSBjb250aW51YXRpb25zIGhlcmUuCi0KLVR1ZSBOb3YgIDQgMTE6NTY6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfc2VjdGlvbik6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIKLQlpbmZvcm1hdGlvbiBmb3IgYSBzZWN0aW9uLgotCi1Nb24gTm92ICAzIDEyOjM2OjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChwYXJzZV9mbGFncyk6IE1ha2UgZmxhZyBjaGVjayBjYXNlIGluc2Vuc2l0aXZlLgotCUNoZWNrIGZvciBgY29udGVudHMnIGZsYWcuICBHaXZlIGFuIGVycm9yIGZvciB1bnJlY29nbml6ZWQgZmxhZ3MuCi0JKGNvcHlfc2VjdGlvbik6IElmIHRoZSBjb250ZW50cyBmbGFnIHdhcyBzZXQgZm9yIGEgc2VjdGlvbiB0aGF0Ci0JaGFkIG5vIGNvbnRlbnRzLCB6ZXJvIG91dCB0aGUgbmV3IGNvbnRlbnRzLgotCSogYmludXRpbHMudGV4aSAob2JqY29weSk6IERvY3VtZW50IGNvbnRlbnRzIHNlY3Rpb24gZmxhZy4KLQotU3VuIE5vdiAgMiAxNDo0OTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogTW92ZSBuZXcgc3RydWN0IGFuZCB2YXJpYWJsZSBkZWZpbml0aW9ucyB0byB0b3Agb2YKLQlmaWxlLiAgUmVtb3ZlIG9ic29sZXRlIGFkZF9zdHJpcF9zeW1ib2wgYW5kIGlzX3N0cmlwX3N5bWJvbAotCWRlY2xhcmF0aW9ucy4gIEFkZCBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciBhZGRfc3BlY2lmaWNfc3ltYm9sCi0JYW5kIGlzX3NwZWNpZmllZF9zeW1ib2wuCi0KLU1vbiBPY3QgMjAgMTU6MzE6NDMgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb20gKEhBVkVfU0JSSyk6IFVuZGVmaW5lLgotCi1UdWUgT2N0IDE0IDE2OjE0OjM1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4gIFJldHVybnMKLQl0cnVlIGlmIGEgc3ltYm9sIGNhbiBiZSBmb3VuZCBhdCB0aGUgYWRkcmVzcyBwYXNzZWQgaW4uCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgdGhlIHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgZmllbGQgdG8gcG9pbnQKLQl0byBvYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzLgotCi1GcmkgT2N0IDEwIDE0OjEzOjA5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYywgb2JqY29weS4xLCBiaW51dGlscy50ZXhpOiAibG9jYWxpemUiIGlzIGEgYmV0dGVyIG5hbWUKLQl0aGFuICJwcml2YXRpemUiLiAgVXBkYXRlIGFsbCByZWZlcmVuY2VzLgotCi1UaHUgT2N0ICA5IDE1OjU3OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoc3RyaXApOiBSZW1vdmUgZHVwbGljYXRlIC0tdGFyZ2V0LiAgRnJvbSBNYXJ0eQotCUxlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgotCi0JKiBubS5jIChsaW5lbm9fY2FjaGVfYmZkKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShsaW5lbm9fY2FjaGVfcmVsX2JmZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZGlzcGxheV9hcmNoaXZlKTogQ2xlYXIgbGluZW5vX2NhY2hlX2JmZCBhbmQgbGluZW5vX2NhY2hlX3JlbF9iZmQKLQl3aGVuIGNsb3NpbmcgYSBCRkQuCi0JKGRpc3BsYXlfZmlsZSk6IExpa2V3aXNlLgotCShwcmludF9zeW1ib2wpOiBVc2UgbGluZW5vX2NhY2hlX2JmZCBhbmQgbGluZW5vX2NhY2hlX3JlbF9iZmQKLQlpbnN0ZWFkIG9mIGNhY2hlX2JmZCBhbmQgY2FjaGVfcmVsX2JmZC4gIE1ha2Ugc2VjY291bnQgc3RhdGljLCBhbmQKLQlvbmx5IHNldCBpdCB3aGVuIHNldHRpbmcgcmVsb2NzLgotCi1XZWQgT2N0ICA4IDIxOjE5OjExIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoa2VlcF9zcGVjaWZpY19saXN0LCBwcml2YXRpemVfc3BlY2lmaWNfbGlzdCwKLQl3ZWFrZW5fc3BlY2lmaWNfbGlzdCk6IE5ldyB2YXJpYWJsZXMuCi0JKGtlZXBfc3ltYm9scyk6IFJlbW92ZWQuCi0JKGFkZF9zcGVjaWZpY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24gZnJvbSB0aGUgY2FyY2FzIG9mCi0JYWRkX3N0cmlwX3N5bWJvbC4gIFRha2VzIGEgbGlzdCBhcyBhbiBhcmd1bWVudC4KLQkoaXNfc3BlY2lmaWVkX3N5bWJvbCk6IExpa2V3aXNlIGZyb20gaXNfc3RyaXBfc3ltYm9sLgotCShmaWx0ZXJfc3ltYm9scyk6IEhvbm9yIHRoZSBuZXcgcHJpdmF0aXplIGFuZCB3ZWFrZW4gbGlzdHMuCi0JT3B0aW1pemUgYmZkX2FzeW1ib2xfbmFtZSBoYW5kbGluZy4KLQkoY29weV9vYmplY3QsIGNvcHlfb3B0aW9ucywgY29weV91c2FnZSk6IEFkZCBwcml2YXRpemUtc3ltYm9sICYKLQl3ZWFrZW4tc3ltYm9sIG9wdGlvbnMuCi0KLQkqIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogVXBkYXRlIGRvY3MuCi0KLVN1biBPY3QgIDUgMDk6MDU6NDQgMTk5NyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTWFrZSAiLS1wcmVmaXgtYWRkcmVzc2VzIgotIAlkaXNhc3NlbWJseSBhZGp1c3QgdG8gbWl4ZWQtbGVuZ3RoIGluc3RydWN0aW9ucy4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogQWRkICIweCIgcHJlZml4IGZvciBoZXhhZGVjaW1hbAotIAlzeW1ib2wtb2Zmc2V0cyBpbiBkaXNhc3NlbWJseS4KLQotRnJpIE9jdCAgMyAxMjowNDoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc2V0X3RpbWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgcmVwbGFjaW5nCi0JbWFrZV9zYW1lX2RhdGVzLgotCShzdHJpcF9tYWluKTogSWYgcHJlc2VydmVfZGF0ZXMsIHN0YXQgdGhlIGlucHV0IGZpbGUgYmVmb3JlCi0JY29weWluZyBpdCwgYW5kIGNhbGwgc2V0X3RpbWVzIGFmdGVyd2FyZC4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0KLQkqIHdyc3RhYnMuYyAod3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8pOiBDYXN0IHAgdG8KLQljaGFyICogd2hlbiBjYWxsaW5nIHN0cmNweSBhbmQgc3RybGVuLgotCi1XZWQgU2VwIDI0IDExOjM0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aQkoYXIgY21kbGluZSk6IERvY3VtZW50IHRoYXQgcSBub3cgd29ya3MgbGlrZSByLgotCUZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCi0KLQkqIGJpbnV0aWxzLnRleGkgKHNpemUpOiBUaGUgb2JqZWN0IGZpbGUgYXJndW1lbnQgaXMgb3B0aW9uYWwuCi0JRnJvbSBNYXJ0eSBMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgQXVnIDI2IDE3OjQ4OjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYRUVYVF9GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUuICBVc2UgaXQgaW4gYWxsCi0JcmVmZXJlbmNlcyB0byB0aGUgc3lzaW5mbyBwcm9ncmFtLgotCSogY29uZmlndXJlLmluOiBSZWJ1aWxkIHdpdGggbmV3IGJmZC9hY2luY2x1ZGUubTQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgOCAxNTozMjo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYzogSW5jbHVkZSA8dGltZS5oPi4KLQkoZGVmaW5lX3Jlc291cmNlKTogU2V0IGEgdGltZXN0YW1wIGZvciB0aGUgcmVzb3VyY2UuCi0KLVdlZCBBdWcgIDYgMTM6Mzc6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBUQVJHRVQgaW4gaGVhZGVyIGZpbGUuCi0JKiBhY2NvbmZpZy5oIChUQVJHRVQpOiBBZGQgI3VuZGVmLgotCSogTWFrZWZpbGUuYW0gKHZlcnNpb24ubywgYnVjb21tLm8pOiBSZW1vdmUgc3BlY2lhbCB0YXJnZXRzLgotCSogYnVjb21tLmMgKHRhcmdldCk6IFJlbW92ZS4KLQkqIG5tLmMgKHByb2dyYW1fbmFtZSk6IERvbid0IGRlY2xhcmUuCi0JKHRhcmdldCk6IE1ha2Ugc3RhdGljLgotCSogc2l6ZS5jICh0YXJnZXQpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEF1ZyAgNSAwMDowMTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogRXhwb3J0IHIuCi0JKC5kZXAxKTogVXNlICQoSU5DTFVERVMpIHJhdGhlciB0aGFuICQoQUxMX0NGTEFHUykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogbmxtaGVhZGVyLnk6IFVzZSBWRVJTSU9OSyByYXRoZXIgdGhhbiBWRVJTSU9OLgotCi0JKiBNYWtlZmlsZS5hbSAoU1RSSVBfUFJPRyk6IENoYW5nZSBmcm9tIHN0cmlwLm5ldyB0byBzdHJpcC1uZXcuCi0JKE5NX1BST0cpOiBDaGFuZ2UgZnJvbSBubS5uZXcgdG8gbm0tbmV3LgotCShUT09MX1BST0dTLCBpbnN0YWxsLWV4ZWMtbG9jYWwpOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEF1ZyAgNCAxMTo0NzozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIEFDX0FSR19QUk9HUkFNOyBpdCdzIGludm9rZWQgYnkKLQlBTV9JTklUX0FVVE9NQUtFLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogQ3JlYXRlICQodG9vbGRpcikvYmluIGJlZm9yZQotCXRyeWluZyB0byBpbnN0YWxsIGFueXRoaW5nIGludG8gaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKFRPT0xfUFJPR1MpOiBVc2UgYW4gZXhwbGljaXQgJChFWEVFWFQpLgotCShpbnN0YWxsLWV4ZWMtbG9jYWwpOiBXaGVuIGhhbmRsaW5nICQobm9pbnN0X1BST0dSQU1TKSwgb25seSB1c2UKLQkkKEVYRUVYVCkgb24gdGhlIGluc3RhbGxlZCBmaWxlLiAgV2hlbiBoYW5kbGluZyAkKFRPT0xfUFJPR1MpLAotCWhhbmRsZSAkKEVYRUVYVCkgY29ycmVjdGx5LgotCSogY29uZmlndXJlLmluOiBBZGQgYW4gZXhwbGljaXQgJChFWEVFWFQpIHdoZW4gc3Vic3RpdHV0aW5nIGZvcgotCXRoZSBuYW1lIG9mIGEgcHJvZ3JhbSB0byBidWlsZC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UKLQlwYXRjaGVzLgotCi0JKiBkZWZsZXgubCwgZGVmcGFyc2UueTogVXNlIFZFUlNJT05LIHJhdGhlciB0aGFuIFZFUlNJT04uCi0JKiByY2xleC5sLCByY3BhcnNlLnk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKHdpbmRyZXNfU09VUkNFUyk6IEFkZCAkKEJVTElCUykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgMSAxMzowODozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogSW5jbHVkZSBiZmQvYWNpbmNsdWRlLm00LCBub3QgYmZkL2FjbWFjcm9zLm00LgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBKdWwgMzEgMTE6NTE6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUsIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlCi0Jc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFDX1BST0dfWUFDQywKLQlBQ19QUk9HX0xFWCwgQUNfREVDTF9ZWVRFU1QsIEFNX01BSU5UQUlORVJfTU9ERSwgQU1fQ1lHV0lOMzIsIGFuZAotCUFNX0VYRUVYVC4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGggQU1fUFJPR19JTlNUQUxMLiAgUmVtb3ZlCi0Jc3RhbXAtaCBoYW5kbGluZyBpbiBBQ19PVVRQVVQuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUZyb20gVG9uIHZhbiBPdmVyYmVlayA8dHZvdmVyYmVAd2suZXN0ZWMuZXNhLm5sPjoKLQkqIHJjcGFyc2UueSAoZGlhbG9nKTogRGVmYXVsdCBtZW51IGFuZCBjbGFzcyB0byBiZSBuYW1lZC4KLQkoc3R5bGVzKTogSWYgRk9OVCBpcyBzZWVuLCBzZXQgRFNfU0VURk9OVCBpbiBkaWFsb2cgc3R5bGUuCi0JKiByZXNiaW4uYyAocmVzX3RvX2Jpbl9kaWFsb2cpOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIGZvbnQKLQlpbmZvcm1hdGlvbiBsZW5ndGguCi0KLVdlZCBKdWwgMzAgMTE6MjE6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBUb24gdmFuIE92ZXJiZWVrIDx0dm92ZXJiZUB3ay5lc3RlYy5lc2Eubmw+OgotCSogcmVzYmluLmMgKHJlc190b19iaW5fbWVudSk6IENvcnJlY3QgY29tcHV0YXRpb24gb2YgbWVudQotCXZzLiBtZW51ZXggbGVuZ3RoLgotCSogcmVzcmMuYyAoZGVmaW5lX3N0cmluZ3RhYmxlKTogQWRkIDEgdG8gcmVzb3VyY2UgSUQuCi0KLVR1ZSBKdWwgMjkgMTE6MDY6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZXNiaW4uYyAoYmluX3RvX3Jlc19zdHJpbmcpOiBDb3JyZWN0IGFkanVzdG1lbnQgb2YgZGF0YSBhbmQKLQlsZW5ndGguICBGcm9tIFRvbiB2YW4gT3ZlcmJlZWsgPHR2b3ZlcmJlQHdrLmVzdGVjLmVzYS5ubD4uCi0KLVR1ZSBKdWwgMjIgMTg6MDE6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubG1jb252LmMgKGxpbmtfaW5wdXRzKTogQ2FsbCBsaWJpYmVydHkgcGV4ZWN1dGUgZnVuY3Rpb24uCi0JKHBleGVjdXRlKSBbbXVsdGlwbGUgdmVyc2lvbnNdOiBSZW1vdmUuCi0KLVR1ZSBKdWwgMjIgMTY6MTk6MzQgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBidWNvbW0uYyAobWFrZV90ZW1wbmFtZSk6IElmIHdlIG1pZ2h0IGJlIHVzaW5nIGEgRE9TIGZpbGVzeXN0ZW0sCi0JY2hlY2sgZm9yIGEgYmFja3NsYXNoIGFzIHdlbGwgYXMgYSBzbGFzaC4KLQotVGh1IEp1biAyNiAxMzo1MzoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYyAobWFpbik6IFF1aXQgaWYgd2UgZGlkbid0IGdldCBhbnkgcmVzb3VyY2VzLgotCSh1c2FnZSk6IEZpeCAtLXl5ZGVidWcgdXNhZ2UgbWVzc2FnZS4KLQkqIHJlc2NvZmYuYyAod3JpdGVfY29mZl9maWxlKTogRG9uJ3QgZnJlZSB0aGUgcmVsb2NhdGlvbiBhcnJheQotCXVudGlsIGFmdGVyIHdlJ3ZlIGNsb3NlZCB0aGUgQkZELgotCShyZWFkX2NvZmZfcnNyYyk6IFF1aXQgcmF0aGVyIHRoYW4gdHJ5IHRvIHJlYWQgc3RhbmRhcmQgaW5wdXQuCi0JKHdyaXRlX2NvZmZfZmlsZSk6IFF1aXQgcmF0aGVyIHRoYW4gdHJ5IHRvIHdyaXRlIHRvIHN0YW5kYXJkCi0Jb3V0cHV0LgotCSogcmNwYXJzZS55OiBBZGQgYSBjb3VwbGUgb2YgbWlzc2luZyBzZW1pY29sb25zIChhY2NlcHRlZCBieSBiaXNvbgotCWJ1dCBub3QgYnlhY2MpLgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgd2luZHJlcy4KLQotV2VkIEp1biAyNSAyMDo1NzowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlc2Jpbi5jOiBOZXcgZmlsZS4KLQkqIHJjbGV4LmwsIHJjcGFyc2UueSwgcmVzY29mZi5jLCByZXNyYy5jLCB3aW5kcmVzLmMsIHdpbmRyZXMuaDoKLQlOdW1lcm91cyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQ0ZJTEVTKTogQWRkIHJlc2Jpbi5jLgotCShXSU5EUkVTX09CSlMpOiBBZGQgcmVzYmluLm8uCi0KLVN1biBKdW4gMjIgMTc6Mjk6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRmlyc3Qgc3RhYiBhdCBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyOgotCSogd2luZHJlcy5oOiBOZXcgZmlsZS4KLQkqIHdpbmRyZXMuYzogTmV3IGZpbGUuCi0JKiByZXNyYy5jOiBOZXcgZmlsZS4KLQkqIHJjcGFyc2UueTogTmV3IGZpbGUuCi0JKiByY2xleC5sOiBOZXcgZmlsZS4KLQkqIHJlc2NvZmYuYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBCVUlMRF9XSU5EUkVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoV0lORFJFU19QUk9HKTogTmV3IHZhcmlhYmxlLgotCShQUk9HUyk6IEFkZCBAQlVJTERfV0lORFJFU0AuCi0JKEhGSUxFUyk6IEFkZCBkbGx0b29sLmggYW5kIHdpbmRyZXMuaC4KLQkoQ0ZJTEVTKTogQWRkIHdpbmRyZXMuYyBhbmQgcmVzcmMuYy4KLQkoR0VORVJBVEVEX0NGSUxFUyk6IEFkZCByY3BhcnNlLmMgYW5kIHJjbGV4LmMuCi0JKFdJTkRSRVNfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkkKFdJTkRSRVNfUFJPRyk6IE5ldyB0YXJnZXQuCi0JKHJjcGFyc2UuYywgcmNwYXJzZS5oLCByY2xleC5jKTogTmV3IHRhcmdldHMuCi0KLVRodSBKdW4gMTIgMTI6Mjc6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGV4cG9ydF90eXBlKTogQWRkIGRhdGEgZmllbGQuCi0JKGRlZl9leHBvcnRzKTogQWRkIGRhdGEgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShkdW1wX2RlZl9pbmZvKTogUHJpbnQgZGF0YSBmaWVsZC4KLQkoZ2VuX2RlZl9maWxlKTogTGlrZXdpc2UuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogSGFuZGxlIGRhdGEgZmllbGQgYnkgbm90IGVtaXR0aW5nIHNpbXBsZQotCWxhYmVsIGFuZCBub3QgZW1pdHRpbmcgYW55dGhpbmcgaW4gU0VDX1RFWFQuCi0JKGR0YWIpOiBQcmludCBkYXRhIGZpZWxkLgotCShwcm9jZXNzX2R1cGxpY2F0ZXMpOiBNZXJnZSBkYXRhIGZpZWxkLgotCSogZGxsdG9vbC5oIChkZWZfZXhwb3J0cyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGRlZnBhcnNlLnkgKGV4cGxpbmUpOiBBY2NlcHQgb3B0X0RBVEEuICBQYXNzIGl0IHRvIGRlZl9leHBvcnRzLgotCShvcHRfREFUQSk6IE5ldyBub24tdGVybWluYWwuCi0KLVdlZCBKdW4gMTEgMTc6MTU6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmg6IE5ldyBmaWxlLgotCSogZGVmbGV4Lmw6IEluY2x1ZGUgZGxsdG9vbC5oIGFuZCBsaWJpYmVydHkuaC4gIERvbid0IGRlY2xhcmUKLQlzdHJkdXAuICBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKiBkZWZwYXJzZS55OiBJbmNsdWRlIGJmZC5oLCBidWNvbW0uaCwgYW5kIGRsbHRvb2wuaC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSBkbGx0b29sLmggYW5kIHRpbWUuaC4gIE1ha2UgYSBsb3Qgb2YKLQl2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBzdGF0aWMuICBNYWtlIGEgbG90IG9mIGNoYXIgKiB2YXJpYWJsZXMKLQlhbmQgcGFyYW1ldGVycyBjb25zdC4gIEFkZCBkZWNsYXJhdGlvbnMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBEbwotCXNvbWUgcmVpbmRlbnRpbmcuICBIaWRlIG1vcmUgUG93ZXJQQyBzdHVmZiBpbnNpZGUgRExMVE9PTF9QUEMuCi0KLVdlZCBKdW4gMTEgMTI6MDU6NTIgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogYXIuYyAoYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUpOiBBZGQgY29uc3QuCi0KLU1vbiBNYXkgMTIgMjI6MDk6MzUgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFBhc3MgQ0NfRk9SX1RBUkdFVCBhbmQgQ0ZMQUdTX0ZPUl9UQVJHRVQKLQl0byBydW50ZXN0LgotCi1Nb24gTWF5IDEyIDEzOjE0OjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjbGVhciBPUENPREVTIHdoZW4gLS1lbmFibGUtY29tbW9uYmZkbGliIGlzCi0JdXNlZCBvbiBIUC9VWC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAyNSAxNDoyMjowOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBDaGFuZ2UgKi5pbmZvKgotCXRvIGJpbnV0aWxzLmluZm8qIHRvIHNhdmUgc3lzcm9mZi5pbmZvLgotCi1UdWUgQXByIDE1IDEzOjQyOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1hGT1JNLCBJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLQlkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcgJChJTlNUQUxMX1hGT1JNKSBhbmQKLQkkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsLWluZm8pOiBSdW4gbWtpbnN0YWxsZGlycy4KLQotTW9uIEFwciAxNCAxMTo1MjozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIE1ha2VmaWxlLmluOiBBbHdheXMgdXNlICQoU0hFTEwpIHdoZW4gcnVubmluZyBtb3ZlLWlmLWNoYW5nZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDQgMTM6Mjg6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19GVU5DX0FMTE9DQS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogYnVjb21tLmg6IEFkZCBhbGxvY2EgaGFuZGxpbmcsIGNvcGllZCBmcm9tIGdhcy9hcy5oLgotCSogZGxsdG9vbC5jOiBBZGQgI3ByYWdtYSBhbGxvY2EgZm9yIEFJWCB0byBzdGFydCBvZiBmaWxlLgotCSogbmxtY29udi5jOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuICBSZW1vdmUKLQlldmVyeXRoaW5nIHRoYXQgY2xlYW4gcmVtb3Zlcy4KLQotVGh1IEFwciAgMyAxMzoxODozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVR1ZSBBcHIgIDEgMTY6MjE6NDQgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IE5ldyBmaWxlLgotCSogY29uZmlnLmgtdm1zOiBSZW1vdmUgZmlsZS4KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBuZXcgY29uZmlndXJlIHNjaGVtZS4KLQotTW9uIE1hciAzMSAxNTozMDo0MyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBvYmpjb3B5LmMgKG1ha2Vfc2FtZV9kYXRlcyk6IFVzZSBzdGF0YnVmLCBub3QgYnVmLCBpZiBub3QKLQlIQVZFX0dPT0RfVVRJTUVfSC4KLQotRnJpIE1hciAyOCAxNzo1Nzo1MyAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBEb24ndCBsaW5rIGFnYWluc3QgQkZETElCIHR3aWNlLgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3IgY29tbW9uYmZkbGliLiAgSWYgaXQgaXMgc2V0LAotCXNldCBPUENPREVTIHRvIGVtcHR5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTWFyIDI3IDE2OjAzOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT46Ci0JKiBvYmpjb3B5LmM6IEluY2x1ZGUgPHV0aW1lLmg+IG9yIDxzeXMvdGltZS5oPi4KLQkoc3RyaXBfb3B0aW9ucyk6IEFkZCAicHJlc2VydmUtZGF0ZXMiLgotCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLXAgYW5kIC0tcHJlc2VydmUtZGF0ZXMuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKG1ha2Vfc2FtZV9kYXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cmlwX21haW4pOiBIYW5kbGUgLXAuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCSogYmludXRpbHMudGV4aSwgc3RyaXAuMSwgb2JqY29weS4xOiBEb2N1bWVudCBuZXcgb3B0aW9uLgotCi0JYWRkcjJsaW5lLmMgY29udHJpYnV0ZWQgYnkgVWxyaWNoIExhdXRoZXIKLQk8VWxyaWNoLkxhdXRoZXJAemZlLnNpZW1lbnMuZGU+OgotCSogYWRkcjJsaW5lLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUREUjJMSU5FX1BST0cpOiBOZXcgdmFyaWFibGUuCi0JKE1BTlBBR0VTKTogQWRkIGFkZHIybGluZS4KLQkoUFJPR1MpOiBBZGQgJChBRERSMkxJTkVfUFJPRykuCi0JKENGSUxFUyk6IEFkZCBhZGRyMmxpbmUuYy4KLQkoJChBRERSMkxJTkVfUFJPRykpOiBOZXcgdGFyZ2V0LgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgYWRkcjJsaW5lLgotCSogYWRkcjJsaW5lLjE6IE5ldyBmaWxlLgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUuCi0KLU1vbiBNYXIgMjQgMTA6NTI6NDUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGV4aXQgaWYgYSBmaWxlIGNhbm5vdCBiZQotCWRpc2Fzc2VtYmxlZCwgaW5zdGVhZCBqdXN0IHJldHVybi4KLQotVGh1IE1hciAyMCAyMToxNjo1MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpemUuYyAodXNhZ2UpOiBNYWtlIGRlZmluaXRpb24gbWF0Y2ggaXRzIHByb3RvdHlwZS4KLQkoZGlzcGxheV9iZmQsIGxwcmludF9udW1iZXIsIHJwcmludF9udW1iZXIpOiBMaWtld2lzZS4KLQkocHJpbnRfYmVya2VsZXlfZm9ybWF0LCBzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBMaWtld2lzZS4KLQkocHJpbnRfc3lzdl9mb3JtYXQpOiBMaWtld2lzZS4KLQkqIG5tLmMgKHNldF9wcmludF9yYWRpeCwgc2V0X291dHB1dF9mb3JtYXQpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMTggMTY6Mzk6NTUgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZCBmdW5jdGlvbiBwcm90b3R5cGVzLgotCSogYXIuYyAobXJpX2VtdWwsIGdldF9wb3NfYmZkKTogTWFrZSBzdGF0aWMuCi0JKiBhcmxleC5sOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuICBEb24ndCBkZWNsYXJlIHN0cmR1cC4gIFVzZQotCXhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCSogYXJwYXJzZS55ICh5eWVycm9yKTogTWFrZSBhcmd1bWVudCBjb25zdC4gIENvcnJlY3QgdHlwby4KLQkqIGFyc3VwLmMgKHN0cmR1cCk6IERvbid0IGRlY2xhcmUuCi0JKGFyX3NhdmUpOiBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKiBmaWxlbW9kZS5jOiBJbmNsdWRlICJidWNvbW0uaCIuCi0JKiBubS5jICh1c2FnZSk6IE1ha2Ugc3RhdGljLgotCShwcmludF9zeW1uYW1lKTogTWFrZSBmb3JtYXQgYW5kIG5hbWUgY29uc3QuCi0JKiBvYmpjb3B5LmMgKGNhdCk6IFJlbW92ZS4KLQkoY29weV9hcmNoaXZlKTogTWFrZSBvdXRwdXRfdGFyZ2V0IGNvbnN0LiAgVXNlIGNvbmNhdCwgbm90IGNhdC4KLQkoY29weV9maWxlLCBzaW1wbGVfY29weSwgc21hcnRfcmVuYW1lKTogTWFrZSBhcmd1bWVudHMgY29uc3QuCi0JKiBvYmpkdW1wLmMgKHJlYWRfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCShwcmludF9zZWN0aW9uX3N0YWJzKTogTGlrZXdpc2UuCi0JKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcyk6IERvbid0IGRlY2xhcmUgZ2V0ZW52LgotCSogc3RyaW5ncy5jIChzdHJpbmdzX29iamVjdF9maWxlKTogQ2hhbmdlIGZpbGUgdG8gY29uc3QuCi0JKHByaW50X3N0cmluZ3MpOiBDaGFuZ2UgZmlsZW5hbWUgdG8gY29uc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBNYXIgMTggMTE6Mzc6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBCRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpLgotCSogYWNjb25maWcuaDogQWRkIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogYnVjb21tLmggKGdldGVudik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIG5sbWNvbnYuYyAoZ2V0ZW52KTogRG9uJ3QgZGVjbGFyZS4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1TYXQgTWFyIDE1IDE1OjM1OjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBKYW1pZSBMb2tpZXIgPGphbWllQHJlYmVsbGlvbi5jby51az46Ci0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgImRlbWFuZ2xlLmgiLgotCShkb19kZW1hbmdsZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtQy8tLWRlbWFuZ2xlLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRlbWFuZ2xlIi4KLQkob2JqZHVtcF9wcmludF9zeW1uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogVXNlIG9iamR1bXBfcHJpbnRfc3ltbmFtZS4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkoZHVtcF9yZWxvY19zZXQpOiBMaWtld2lzZS4KLQkoZHVtcF9zeW1ib2xzKTogRGVtYW5nbGUgc3ltYm9sIG5hbWUuCi0JKG1haW4pOiBIYW5kbGUgLUMuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1DLy0tZGVtYW5nbGUuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBNZW50aW9uIC0tbm8tc2hvdy1yYXctaW5zbi4KLQkobG9uZ19vcHRpb25zKTogQWRkICJuby1zaG93LXJhdy1pbnNuIi4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBIYW5kbGUgLS1uby1zaG93LXJhdy1pbnNuLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtLW5vLXNob3ctcmF3LWluc24uCi0KLVdlZCBNYXIgMTIgMTE6NDI6MDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHJkZGJnLmMgKGZyZWVfc2F2ZWRfc3RhYnMpOiBTZXQgdGhlIHN0cmluZ3MgdG8gTlVMTCBhZnRlciBiZWluZwotCWZyZWVkLgotCi1GcmkgRmViIDI4IDE3OjE4OjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmMgKHNldF9kZWZhdWx0X2JmZF90YXJnZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBidWNvbW0uaCAoc2V0X2RlZmF1bHRfYmZkX3RhcmdldCk6IERlY2xhcmUuCi0JKiBhci5jIChtYWluKTogQ2FsbCBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0LgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChidWNvbW0ubyk6IE5ldyB0YXJnZXQsIHRvIGRlZmluZSBUQVJHRVQuCi0KLVR1ZSBGZWIgMjUgMjE6Mjg6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGFkanVzdF9zZWN0aW9uX3ZtYSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtLWFkanVzdC1zZWN0aW9uLXZtYS4KLQkoT1BUSU9OX0FESlVTVF9WTUEpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiYWRkanVzdC12bWEiLgotCShkaXNwbGF5X2JmZCk6IElmIGFkanVzdF9zZWN0aW9uX3ZtYSBpcyBub3QgMCwgYWRkIGl0IHRvIGFsbCB0aGUKLQlzZWN0aW9uIGFkZHJlc3Nlcy4KLQkobWFpbik6IEhhbmRsZSBPUFRJT05fQURKVVNUX1ZNQS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1hZGp1c3Qtdm1hLgotCi1GcmkgRmViIDE0IDE4OjQ2OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAocHJpbnRfc3ltYm9sKTogQ2FjaGUgdGhlIEJGRCBhcyB3ZWxsIGFzIHRoZSBzeW1ib2xzIGFuZAotIAlyZWxvY3MsIGFuZCBkb24ndCB0cnkgdG8gdXNlIHRoZSBzeW1ib2xzIG9yIHJlbG9jcyB3aXRoIGEKLSAJZGlmZmVyZW50IEJGRC4KLQotVGh1IEZlYiAxMyAyMTozNDo0MyAxOTk3ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogY29uZmlnLmgtdm1zOiBzYnJrKCkgaXMgcHJvdmlkZWQgb24gb3BlblZNUy9BbHBoYS4KLQkqIG1ha2VmaWxlLnZtczogYWxsb3cgY29tcGlsaW5nIHdpdGggY3VycmVudCBnY2Mgc25hcHNob3QuCi0KLVRodSBGZWIgMTMgMjA6MTQ6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcnN1cC5jLCBjb2ZmZ3Jvay5jLCBkbGx0b29sLmMsIG5sbWNvbnYuYzogVXNlIHhtYWxsb2MgcmF0aGVyCi0JdGhhbiBtYWxsb2MuCi0KLVdlZCBGZWIgMTIgMTY6MTI6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBDb3JyZWN0IFZNQSBhcmd1bWVudCB0bwotCWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzLiAgSW1wcm92ZSBoYW5kbGluZyBvZiBjb2RlIHdpdGggbm8gc3ltYm9sCi0JZm9sbG93ZWQgYnkgY29kZSB3aXRoIGEgc3ltYm9sLgotCi1XZWQgRmViIDEyIDEyOjE2OjQ3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogTWFrZSBvdXRwdXQgb2YgcmF3IGluc3RydWN0aW9ucwotCXdvcmsgYmV0dGVyIGZvciBub24tc3RhbmRhcmQgdmFsdWVzIG9mIGJ5dGVzX3Blcl9jaHVuayBhbmQKLQlieXRlc19wZXJfbGluZS4KLQotVGh1IEZlYiAgNiAxNDoxNDo1OSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IEFkZGVkIGNvZGUgdG8gYWxsb3cgc29tZSBjb250cm9sCi0gCW92ZXIgdGhlIHdheSByYXcgaW5zdHJ1Y3Rpb25zIGFyZSBkaXNwbGF5ZWQuCi0KLVRodSBGZWIgIDYgMTI6MzY6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3QgYmluY2xfZmlsZSk6IEFkZCBuZXh0X3N0YWNrIGZpZWxkLgotCShwdXNoX2JpbmNsKTogUHV0IHRoZSBuZXcgZmlsZSBvbiBib3RoIGJpbmNsX2xpc3QgYW5kCi0JYmluY2xfc3RhY2suICBDbGVhciB0aGUgZmlsZV90eXBlcyBmaWVsZC4KLQkocG9wX2JpbmNsKTogVXNlIHRoZSBuZXh0X3N0YWNrIGZpZWxkIHdoZW4gcG9wcGluZyB0aGUgc3RhY2suCi0JRG9uJ3QgcHV0IHRoZSBmaWxlIG9uIGJpbmNsX2xpc3QuCi0JKGZpbmRfZXhjbCk6IEluY2x1ZGUgdGhlIGZpbGUgbmFtZSB3aGVuIHdhcm5pbmcgYWJvdXQgYW4gdW5mb3VuZAotCU5fRVhDTC4KLQotCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IERvbid0IGNyYXNoIGlmIHdlIGFyZSBwYXNzZWQgTlVMTC4KLQotVGh1IEZlYiAgNiAxMTo1NDoyNCAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIG9iamNvcHkuMTogQWRkIG1pc3Npbmcgc3BhY2UgYWZ0ZXIgLkIuCi0KLUZyaSBKYW4gMzEgMTA6MzM6MDcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEluaXRpYWxpemUgYGF1eC5yZXF1aXJlX3NlYycuCi0KLVdlZCBKYW4gMjkgMTM6MjE6MjEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBBZGQgc2tpcF96ZXJvZXMgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogTGlrZXdpc2UuICBDYWxsIG9iamR1bXBfcHJpbnRfdmFsdWUKLQl0byBwcmludCBhZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBKdXN0IGNhbGwgb2JqZHVtcF9wcmludF9hZGRyLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IFByaW50IHJlYWwgYWRkcmVzcywgbm90IGZ1bmN0aW9uIG9mZnNldC4KLQlTa2lwIGEgY2VydGFpbiBudW1iZXIgb2YgbGVhZGluZyB6ZXJvZXMuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfemVyb2VzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tZGlzYXNzZW1ibGUtemVyb2VzLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRpc2Fzc2VtYmxlLXplcm9lcyIuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogQ2hlY2sgZGlzYXNzZW1ibGVfemVyb2VzLgotCi1UdWUgSmFuIDI4IDE2OjQ3OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IERvbid0IHNraXAgemVyb2VzIGlmIHRoZQotCWRpc2Fzc2VtYmxlciBoYXMgdG9sZCB1cyB0aGF0IHdlIGFyZSBpbiBhIGJyYW5jaCBkZWxheSBzbG90LgotCi1Nb24gSmFuIDIwIDE0OjI0OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2l6ZS5jIChiZXJrZWxleV9zdW0pOiBSZXdyaXRlLiAgU2tpcCBzZWN0aW9ucyB3aGljaCBhcmUgbm90Ci0JU0VDX0FMTE9DLiAgQ291bnQgU0VDX1JFQURPTkxZIHNlY3Rpb25zIGFzIHRleHQuCi0KLVR1ZSBKYW4gMTQgMTU6MTQ6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBSZW1vdmUgKi5pbmZvKiwgbm90Ci0JanVzdCAqLmluZm8uICBGcm9tIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+LgotCi1UdWUgRGVjIDMxIDE1OjQyOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotRnJpIERlYyAyNyAxMToxOToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogV29yayBhcm91bmQgYnVnIGluIEFDX0ZVTkNfVkZPUksgaW4gYXV0b2NvbmYgMi4xMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IERlYyAxOSAxMzoxMToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEFuZHJldyBKIEtsb3NzbmVyIDxhbmRyZXdAcG9nby53di50ZWsuY29tPjoKLQkqIG9iamNvcHkuYyAoT1BUSU9OX1dFQUtFTik6IERlZmluZS4KLQkoY29weV9vcHRpb25zKTogQWRkICJ3ZWFrZW4iLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXdlYWtlbi4KLQkod2Vha2VuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZmlsdGVyX3N5bWJvbHMpOiBIYW5kbGUgd2Vha2VuLgotCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgd2Vha2VuLgotCShjb3B5X21haW4pOiBIYW5kbGUgT1BUSU9OX1dFQUtFTi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS13ZWFrZW4uCi0KLVdlZCBEZWMgMTggMjI6NDk6MTMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVzZSBOZXdGb2xkZXJSZWN1cnNpdmUgZm9yIGluc3RhbGxhdGlvbi4KLQotU2F0IERlYyAgNyAxMDoxNzoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogQWRkICJlbHNlIHRydWUiIGNsYXVzZSB0byBjYXRlciB0bwotCWJyb2tlbiAibWFrZSIgb24gc29tZSBzeXN0ZW1zLgotCi1GcmkgRGVjICA2IDE3OjIxOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX2JiKTogQWx3YXlzIGluaXRpYWxpemUgbmFtY29weSB0byBhdm9pZCBnY2MKLQl3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUuCi0JKGllZWVfcmVhZF9jeHhfY2xhc3MpOiBMaWtld2lzZSwgZm9yIHBmLgotCShpZWVlX2VudW1fdHlwZSk6IExpa2V3aXNlLCBmb3IgaS4KLQotVHVlIE5vdiAyNiAxNzowMToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RhYl9hcnJheV90eXBlKTogQWRkIGNhc3RzIHdoZW4gcHJpbnRpbmcKLQliZmRfc2lnbmVkX3ZtYSB2YWx1ZXMuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLU1vbiBOb3YgMjUgMTY6NTM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBjcmFzaCBpZiB0aGVyZSBpcyBubwotCXN5bWJvbC4KLQotRnJpIE5vdiAyMiAxNzoyOToxNCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXIuYyAob3Blbl9pbmFyY2gpOiBEb24ndCBjYWxsIGJmZF9vcGVuciB3aXRoIGEgbnVsbCBuYW1lLgotCi1GcmkgTm92ICAxIDEyOjA4OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aTogQWRkIHNlY3Rpb24gb24gcmVwb3J0aW5nIGJ1Z3MuCi0KLVRodSBPY3QgMzEgMTg6MjA6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgYmluY2xfbGlzdCBmaWVsZC4KLQkocGFyc2Vfc3RhYik6IFBhc3MgdmFsdWUgdG8gcHVzaF9iaW5jbC4gIENhbGwgZmluZF9leGNsIGZvcgotCU5fRVhDTC4KLQkoc3RydWN0IGJpbmNsX2ZpbGUpOiBBZGQgaGFzaCwgZmlsZSBhbmQgZmlsZV90eXBlcyBmaWVsZHMuCi0JKHB1c2hfYmluY2wpOiBBZGQgaGFzaCBwYXJhbWV0ZXIuICBTYXZlIGl0IGluIHRoZSBuZXcgaGFzaCBmaWVsZC4KLQlTYXZlIHRoZSBmaWxlIG51bWJlciBpbiB0aGUgbmV3IGZpbGUgZmllbGQuCi0JKHBvcF9iaW5jbCk6IFB1dCB0aGUgYmluY2xfZmlsZSBvbiBiaW5jbF9saXN0LCByYXRoZXIgdGhhbiBmcmVlaW5nCi0JaXQuICBTYXZlIHRoZSBmaWxlIHR5cGVzIGluIHRoZSBuZXcgZmlsZV90eXBlcyBmaWVsZC4KLQkoZmluZF9leGNsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogaWVlZS5jIChpZWVlX2xpbmVubyk6IERvbid0IGNvbXBhcmUgbGluZSBudW1iZXIgYWRkcmVzc2VzIHRvCi0JaW5mby0+aGlnaGFkZHIgKHVuZG8gcGFydCBvZiBPY3RvYmVyIDI4IHBhdGNoKS4KLQotVHVlIE9jdCAyOSAxNjo0MDoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF92YWx1ZSk6IERvbid0IHByaW50IHRoZSBlbXB0eSBzdHJpbmcKLQlmb3IgemVyby4KLQotTW9uIE9jdCAyOCAxNjo1ODoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBmdW5jdGlvbl9lbmQgZmllbGQuCi0JKHN0YXJ0X3N0YWIpOiBJbml0aWFsaXplIGZ1bmN0aW9uX2VuZC4KLQkoZmluaXNoX3N0YWIpOiBQYXNzIGluZm8tPmZ1bmN0aW9uX2VuZCB0byBkZWJ1Z19lbmRfZnVuY3Rpb24uCi0JKHBhcnNlX3N0YWIpOiBJZiBpbmZvLT5mdW5jdGlvbl9lbmQgaXMgc2V0LCB1c2UgaXQgYXMgdGhlIGFkZHJlc3MKLQl3aGljaCBlbmRzIGEgZnVuY3Rpb24uCi0KLQkqIGllZWUuYyAoaWVlZV9hcnJheV90eXBlKTogUmVtZW1iZXIgdGhlIGNvcnJlY3Qgc2l6ZS4KLQotCSogaWVlZS5jIChpZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0KTogUGVybWl0IGNvYWxlc2NpbmcgcmFuZ2VzCi0JdGhhdCBhcmUgdXAgdG8gMHgxMDAwIGJ5dGVzIGFwYXJ0LCBub3QganVzdCA2NC4KLQkoaWVlZV9hZGRfYmIxMV9ibG9ja3MpOiBEb24ndCBib3RoZXIgdG8gZW1pdCBhIEJCMTEgdGhhdCBpcyBsZXNzCi0JdGhhbiAweDEwMCBieXRlcy4KLQkoaWVlZV9saW5lbm8pOiBPbmx5IGVtaXQgbGluZSBudW1iZXJzIHRoYXQgYXJlIGxlc3MgdGhhbgotCWluZm8tPmhpZ2hhZGRyLgotCi1GcmkgT2N0IDI1IDEyOjEyOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0pOiBBZGQgZGVmaW5lZCBmaWVsZC4KLQkoaWVlZV9lbnVtX3R5cGUpOiBJZiB0aGUgZW51bSB0YWcgaGFzIGJlZW4gc2VlbiBiZWZvcmUgYnV0IG5vdAotCWRlZmluZWQsIHJldXNlIHRoZSBzYW1lIHR5cGUgaW5kZXgsIGFuZCBkZWZpbmUgaXQuCi0JKGllZWVfdGFnX3R5cGUpOiBJZiB0aGlzIGVudW0gaGFzIG5vdCBiZWVuIGRlZmluZWQsIGFkZCBhbgotCXVuZGVmaW5lZCBlbnRyeSB0byB0aGUgbGlzdCBvZiBlbnVtcy4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IExldCB0aGUgZGlzYXNzZW1ibGVyIG92ZXJyaWRlIHRoZQotCW51bWJlciBvZiBieXRlcyBwcmludGVkIG9uIGEgbGluZS4KLQotVGh1IE9jdCAyNCAxNjo0MjoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAocHJlZml4X2FkZHJlc3Nlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAicHJlZml4LWFkZHJlc3NlcyIuCi0JKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgQlNGX0ZVTkNUSU9OIHN5bWJvbHMgYmVmb3JlIG90aGVyCi0Jc3ltYm9scy4KLQkoZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jb2JqZHVtcF9wcmludF9hZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jb2JqZHVtcF9wcmludF9hZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDYWxsIG5ldyBmdW5jdGlvbnMuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWRpc2Fzc2VtYmxlX2RhdGEuICBDaGFuZ2UgZGlzYXNzZW1ibHkgZm9ybWF0LCB1bmxlc3MKLQlwcmVmaXhfYWRkcmVzc2VzIGlzIHNldC4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENhbGwgZGlzYXNzZW1ibGVfYnl0ZXMuICBVbmxlc3MKLQlwcmVmaXhfYWRkcmVzc2VzIGlzIHNldCwgZGlzYXNzZW1ibGUgaW4gY2h1bmtzIGhlYWRlZCBieSBhCi0Jc3ltYm9sLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtLXByZWZpeC1hZGRyZXNzZXMuCi0KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IFByZXNlcnZlIHRoZQotCWJhY2tzbGFzaCB3aGVuIGNvbmNhdGVuYXRpbmcgbXVsdGlwbGUgc3RhYnMgc3RyaW5ncy4KLQotVGh1IE9jdCAxMCAxMTozNjozMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNjYW5fb3Blbl9vYmpfZmlsZSk6IEZpeCBsb29wIGV4aXQgdGVzdC4KLQlBZGQgbWlzc2luZyBwYXJhbWV0ZXIgdG8gZGVmX2V4cG9ydHMuCi0KLVR1ZSBPY3QgIDggMTI6MDY6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTEVYX09QVElPTlMpOiBTZXQgdG8gZW1wdHkgc3RyaW5nLiAgLUkgLUNlbSBpcyB0aGUKLQlkZWZhdWx0IGZvciBmbGV4LCBhbmQgaXMgbm90IHJlY29nbml6ZWQgYnkgbGV4LgotCi1UaHUgT2N0ICAzIDE3OjQxOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoVGFyZ2V0IFNlbGVjdGlvbik6IERvY3VtZW50IHRoYXQgeW91IGNhbiBub3cKLQlzcGVjaWZ5IHRhcmdldHMgdXNpbmcgY29uZmlndXJhdGlvbiB0cmlwbGV0cy4KLQotCSogYXIuYyAodXNhZ2UpOiBEZWNsYXJlLiAgTWFrZSBzdXJlIGFsbCBjYWxsZXJzIHBhc3MgYW4gYXJndW1lbnQuCi0KLVRodSBPY3QgIDMgMTU6Mzk6NDIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0KLVdlZCBPY3QgIDIgMTU6NDk6MTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogQnVtcCB2ZXJzaW9uIGRhdGUuCi0KLVR1ZSBPY3QgIDEgMTU6MDA6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBidWNvbW0uaCAocHJpbnRfdmVyc2lvbik6IERlY2xhcmUuCi0JKiBhci5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCShkb19zaG93X3ZlcnNpb24pOiBSZW1vdmUuCi0JKHVzYWdlKTogQWRkIGhlbHAgcGFyYW1ldGVyLiAgUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogU2V0IGlzX3JhbmxpYiBhdCBzdGFydC4gIENoZWNrIGZvciAtLWhlbHAgYW5kIC0tdmVyc2lvbi4KLQlDYWxsIHByaW50X3ZlcnNpb24sIG5vdCBkb19zaG93X3ZlcnNpb24uCi0JKiBubG1jb252LmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKHNob3dfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKiBubS5jIChwcm9ncmFtX3ZlcnNpb24sIHByaW50X3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkqIG9iamNvcHkuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkoY29weV91c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkoc3RyaXBfbWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCSogc2l6ZS5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkqIHN0cmluZ3MuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQotVGh1IFNlcCAxOSAxNDo1MzoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogUmV2ZXJ0IE1vbmRheSdzIHJlZmxvY2FscCBwYXRjaCwgYW5kIGFwcGx5IHRoaXMgcGF0Y2gKLQlpbnN0ZWFkOgotIAkod3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IFdyaXRlIGEgZHVtbXkgdHlwZSBhdCB0aGUgZW5kIG9mIHRoZQotCWdsb2JhbCB0eXBlIGJsb2NrLgotCi1Nb24gU2VwIDE2IDE1OjMwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV93cml0ZV90eXBlKTogQWRkIHJlZmxvY2FscCBmaWVsZC4KLQkoaWVlZV9wb2ludGVyX3R5cGUpOiBTZXQgcmVmbG9jYWxwIGFmdGVyIHB1c2hpbmcgdHlwZS4KLQkoaWVlZV9mdW5jdGlvbl90eXBlKTogSWYgcmVmbG9jYWxwIGlzIHNldCwgbWFrZSB0aGlzIHR5cGUgbG9jYWwuCi0JKGllZWVfcmFuZ2VfdHlwZSwgaWVlZV9hcnJheV90eXBlLCBpZWVlX3NldF90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfY29uc3RfdHlwZSwgaWVlZV92b2xhdGlsZV90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfc3RydWN0X2ZpZWxkLCBpZWVlX2NsYXNzX2Jhc2VjbGFzcyk6IExpa2V3aXNlLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2luZm8pOiBBZGQgZ2xvYmFsX3R5cGVzIGZpZWxkLgotCShwYXJzZV9pZWVlX2JiKTogV2hlbiBzdGFydGluZyBhIEJCMSwgaW5pdGlhbGl6ZSB0aGUgdHlwZXMgZmllbGQKLQl0byB0aGUgZ2xvYmFsX3R5cGVzIGZpZWxkLgotCShwYXJzZV9pZWVlX2JlKTogV2hlbiBlbmRpbmcgYSBCQjIsIGNvcHkgdGhlIHR5cGVzIGZpZWxkIHRvIHRoZQotCWdsb2JhbF90eXBlcyBmaWVsZC4KLQotRnJpIFNlcCAxMyAxNzozMjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY2hhbmdlX2xlYWRpbmdfY2hhcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSKTogRGVmaW5lLgotCShjb3B5X29wdGlvbnMpOiBBZGQgImNoYW5nZS1sZWFkaW5nLWNoYXIiLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWNoYW5nZS1sZWFkaW5nLWNoYXIuCi0JKGZpbHRlcl9zeW1ib2xzKTogQWRkIG9iZmQgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCUltcGxlbWVudCBjaGFuZ2VfbGVhZGluZ19jaGFyLgotCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgY2hhbmdlX2xlYWRpbmdfY2hhci4KLQkoY29weV9tYWluKTogSGFuZGxlIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLWNoYW5nZS1sZWFkaW5nLWNoYXIuCi0KLVR1ZSBTZXAgIDMgMTQ6MDU6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfZW51bV90eXBlKTogRG9uJ3QgY2hlY2sgaW5kZXggaW50byBhIE5VTEwgbmFtZXMKLQlhcnJheS4KLQkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogQWx3YXlzIGluaXRpYWxpemUgbmV4dC4KLQkqIHJkY29mZi5jIChwYXJzZV9jb2ZmX3R5cGUpOiBXYXJuIGFib3V0IGFuIGluY29tcHJlaGVuc2libGUKLQl0eXBlIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCSogcmRkYmcuYyAocmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8pOiBJbml0aWFsaXplIGYuCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX21lbWJlcnMpOiBTZXQgY29udGV4dCBpbiBhbGwgY2FzZXMuCi0KLVRodSBBdWcgMjkgMTY6NTY6NTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEF1ZyAyOSAxMToyOToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoTF90bXBuYW0pOiBOZXZlciBkZWZpbmUuCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBVc2UgY2hvb3NlX3RlbXBfYmFzZSBpbnN0ZWFkIG9mIHRtcG5hbS4KLQkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgMjcgMTg6MTU6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiKTogQW4gTl9GVU4gc3ltYm9sIHdpdGggYW4gZW1wdHkgc3RyaW5nCi0JaW5kaWNhdGVzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4KLQotVGh1IEF1ZyAyMiAxNzowODowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5KTogQWRkIG5leHQgZmllbGQuCi0JKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSk6IENoYW5nZSBzdHJpbmdzIHRvIGEgcG9pbnRlciB0bwotCXN0cmluZ19oYXNoX2VudHJ5LiAgQWRkIGxhc3Rfc3RyaW5ncyBmaWVsZC4gIFJlbW92ZSBzdHJpbmdzX2FsbG9jCi0JZmllbGQuCi0JKHN0cmluZ19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5leHQgZmllbGQuCi0JKHN0YWJfd3JpdGVfc3ltYm9sKTogQ29weSBzdHJpbmcgaW50byBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGludG8KLQlidWZmZXIuICBLZWVwIGEgbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMuCi0JKHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvKTogSW5pdGlhbGl6ZSBsYXN0X3N0cmluZy4KLQlDb3B5IHN0cmluZ3MgZnJvbSBsaXN0IG9mIGhhc2ggdGFibGUgZW50cmllcyBpbiBtZW1vcnkuCi0JKHN0YWJfbW9kaWZ5X3R5cGUpOiBJZiB0aGUgZW50cnkgb24gdGhlIHN0YWNrIGlzIGEgZGVmaW5pdGlvbiwKLQltYWtlIGEgbmV3IGRlZmluaXRpb24gcmF0aGVyIHRoYW4gZmFpbGluZyBhbiBhc3NlcnQuCi0JKHN0YWJfYXJyYXlfdHlwZSk6IFRoZSBzaXplIGlzIG9ubHkgemVybyBpZiBoaWdoIGlzIHN0cmljdGx5IGxlc3MKLQl0aGFuIGxvdy4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9pbmZvKTogQWRkIHNhd19maWxlbmFtZSBmaWVsZC4KLQkocGFyc2VfaWVlZSk6IEluaXRpYWxpemUgc2F3X2ZpbGVuYW1lLgotCShwYXJzZV9pZWVlX2JiKTogU2V0IHNhd19maWxlbmFtZSBmb3IgYSBCQjEgb3IgQkIyLiAgSW4gYSBCQjEsCi0JZGlzY2FyZCB0aGUgY3VycmVudCB2YXJpYWJsZXMgYW5kIHR5cGVzLiAgSW4gYSBCQjEwLCBpZiBubwotCWZpbGVuYW1lIGhhcyBiZWVuIHNlZW4sIGNhbGwgZGVidWdfc2V0X2ZpbGVuYW1lLgotCShwYXJzZV9pZWVlX3R5KTogSW4gY2FzZSAnZycsIHRoZSB0eXBlIGlzIG9wdGlvbmFsLgotCi0JKiBwcmRiZy5jIChwcl9maXhfdmlzaWJpbGl0eSk6IERvbid0IGFib3J0IG9uCi0JREVCVUdfVklTSUJJTElUWV9JR05PUkUuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX25hbWVfdHlwZSk6IENvcnJlY3QgZXJyb3IgbWVzc2FnZS4KLQotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuICBVc2UgaXQgd2hlbmV2ZXIgbGlua2luZyBhCi0JcHJvZ3JhbS4KLQotVGh1IEF1ZyAxNSAxOTozMDo0MSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIHN5bWJvbGljIGRvdWJsZXF1b3RlcyBhcm91bmQgdGhlIHZlcnNpb24KLQludW1iZXIuCi0KLVRodSBBdWcgIDggMTI6Mjc6NTIgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogQWRkIGJldHRlciBzdXBwb3J0IGZvciBERUMgQyBjb21waWxhdGlvbi4KLQlBZGQgbmV3IG1hY3JvcyBhcyBpbiBNYWtlZmlsZS5pbi4KLQotV2VkIEF1ZyAgNyAxNDoyNzozMyAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURfREVDTEFSQVRJT04gb24gc3Ryc3RyIGFuZCBzYnJrLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCi0JKE5FRURfREVDTEFSQVRJT05fU0JSSyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogYnVjb21tLmggKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKHNicmspOiBEZWNsYXJlIGlmIEhBVkVfU0JSSyBhbmQgTkVFRF9ERUNMQVJBVElPTl9TQlJLLgotCi0JKiBwcmRiZy5jIChwcl9lbmRfc3RydWN0X3R5cGUpOiBBdm9pZCB1c2luZyBhIHN0cmluZyBjb25zdGFudCBpbgotCWFzc2VydCwgZm9yIHRoZSBiZW5lZml0IG9mIGJyb2tlbiBhc3NlcnQgbWFjcm9zLgotCi1GcmkgSnVsIDI2IDE0OjA2OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGRpc2FzbV9pbmZvLmZsYXZvdXIgZnJvbQotCWFiZmQuCi0KLVR1ZSBKdWwgMjMgMTM6NTk6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNlY2RhdGEpOiBJbiBub24gRExMVE9PTF9QUEMgY2FzZSwgY2hhbmdlIGFsaWdubWVudAotCW9mIC50ZXh0IHNlY3Rpb24gdG8gMi4KLQotTW9uIEp1bCAyMiAwODo0NjoxNSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzKTogIEZpeCB0ZXN0IGZvciBzdGFicyBzZWN0aW9ucwotCWVuZGluZyB3aXRoIG51bWJlcnMuICBUaGlzIGZpeGVzIGEgcHJvYmxlbSB3aXRoIC5zdGFiIGJlaW5nCi0JY29uZnVzZWQgd2l0aCAuc3RhYi5pbmRleC4KLQotV2VkIEp1bCAxMCAxMzozMjoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlKTogUmV0dXJuIGEgdm9pZCAqIGZvciBhCi0JdGVtcGxhdGUsIHJhdGhlciB0aGFuIHNpbXBseSBhYm9ydGluZy4KLQotTW9uIEp1bCAgOCAxNToyODowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG9wZW5faW5hcmNoKTogQWRkIGZpbGUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYKLQl0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCBhcmNoaXZlLCBzZXQgdGhlIHRhcmdldCBiYXNlZCBvbiB0aGUKLQlmaWxlLgotCSogYXJzdXAuaCAob3Blbl9pbmFyY2gpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLVRodSBKdWwgIDQgMTI6MDA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byBjeWdudXMtMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotCSogcmRjb2ZmLmMgKHBhcnNlX2NvZmYpOiBHZXQgYWRkcmVzcyB0byBwYXNzIHRvIGRlYnVnX2VuZF9mdW5jdGlvbgotCWZyb20gZnVuY3Rpb24gc2l6ZSwgbm90IHZhbHVlIG9mIC5lZiBzeW1ib2wuICBGcm9tIE5pbmcKLQlNb3NiZXJnZXItVGFuZyA8bmluZ0BBWlN0YXJOZXQuY29tPi4KLQotU2F0IEp1biAyOSAyMToxODowOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IEFkZCAtbyBvcHRpb24sIGFuZCBoYW5kbGUgaXQuCi0JKHN0cmlwX3VzYWdlKTogTWVudGlvbiAtby4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmlwLjE6IE1lbnRpb24gLW8uCi0KLU1vbiBKdW4gMjQgMTc6MTk6MDIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0JSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYgc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogQXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQotTW9uIEp1biAyNCAxMTo1OToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZW5kaWFuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC1FQi8tRUwvLS1lbmRpYW4uCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZW5kaWFuIi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IElmIGVuZGlhbm5lc3Mgd2FzIHNwZWNpZmllZCwgcmVwbGFjZQotCWFiZmQtPnh2ZWMgd2l0aCBhIGNvcHkgb2YgaXRzZWxmIHdpdGggdGhlIGdpdmVuIGVuZGlhbm5lc3MuCi0JKG1haW4pOiBIYW5kbGUgLUVCLy1FTC8tLWVuZGlhbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogTWVudGlvbiAtRUIvLUVMLy0tZW5kaWFuLgotCi0JKiBvYmpkdW1wLmM6IE1ha2UgbW9zdCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBzdGF0aWMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAotCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi1TdW4gSnVuIDIzIDE0OjQ3OjM2IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNlY2RhdGEpOiBDaGFuZ2VkIC5yZGF0YSB0byAucmVsZGF0YSBzbyAucmVsb2Mgd2lsbCB3b3JrLgotCShtYWtlX29uZV9saWJfZmlsZSk6IFJlbW92ZWQgY3J1ZnQuICgjaWYgMSkKLQotV2VkIEp1biAxOSAxNDo0NjozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoc3RhYnMpOiBDaGFuZ2UgZnJvbSBzdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgKiB0bwotCWJmZF9ieXRlICouCi0JKHByaW50X3NlY3Rpb25fc3RhYnMpOiBGZXRjaCBzdGFicyBpbmZvcm1hdGlvbiBkaXJlY3RseSwgcmF0aGVyCi0JdGhhbiBhc3N1bWluZyB0aGF0IHN0cnVjdCBpbnRlcm5hbF9ubGlzdCBpcyB0aGUgcmlnaHQgc2l6ZS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgY2hhbmdlIHRvIGJpbmFyeSBmb3JtYXQ6IGZpbGUgcG9zaXRpb24KLQliYXNlZCBvbiBsb2FkIGFkZHJlc3MsIG5vdCBzZWN0aW9uIFZNQS4KLQotCSogYnVjb21tLmg6IERlZmluZSBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORCBpZiB0aGV5IGFyZQotCW5vdCBhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBKdW4gMTggMTg6MjU6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIGRlZmxleC5jLgotCi1UdWUgSnVuIDE4IDE1OjAzOjQ0IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWcuaC12bXMsIG1ha2VmaWxlLnZtczogTmV3IGZpbGVzLgotCi1Nb24gSnVuIDE3IDA5OjQ3OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IFVzZSBCRkRfUkVMT0NfUlZBIHJhdGhlciB0aGFuCi0JQkZEX1JFTE9DXzMyIGluIElEQVRBNy4KLQotV2VkIEp1biAxMiAxMTo1MjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHN0cnVjdCBnZXRfcmVsb2NzX2luZm8pOiBEZWZpbmUuCi0JKGxpbmVfbnVtYmVycyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAibGluZS1udW1iZXJzIi4KLQkodXNhZ2UpOiBNZW50aW9uIC1sIGFuZCAtLWxpbmUtbnVtYmVycy4KLQkobWFpbik6IEhhbmRsZSAtbC4KLQkocHJpbnRfc3ltYm9sKTogUHJpbnQgbGluZSBudW1iZXJzIGlmIHJlcXVlc3RlZC4KLQkoZ2V0X3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBiaW51dGlscy50ZXhpLCBubS4xOiBEb2N1bWVudCAtbC8tLWxpbmUtbnVtYmVycy4KLQotVHVlIEp1biAxMSAyMDoxMjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY19zZXQpOiBBZGQgc2VjIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgSWYgd2l0aF9saW5lX251bWJlcnMgaXMgc2V0LCBkaXNwbGF5IGxpbmUgbnVtYmVycyBvZgotCXJlbG9jYXRpb24gZW50cmllcy4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLWwgd2l0aCAtci4KLQotTW9uIEp1biAxMCAyMzo0Mjo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG9wZW5faW5hcmNoKTogUmVwb3J0IEJGRCBlcnJvciBtZXNzYWdlIGlmIGFuIGFyY2hpdmUgY2FuCi0Jbm90IGJlIHJlY29nbml6ZWQuICBMaXN0IG1hdGNoaW5nIGZvcm1hdHMgaWYgdGhlIGZpbGUgaXMKLQlhbWJpZ3VvdXNseSByZWNvZ25pemVkLgotCShyYW5saWJfdG91Y2gpOiBMaWtld2lzZS4KLQotVGh1IEp1biAgNiAxMzo1NjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogQWRkIG5vdGVzIG9uIGhvdyB0byBidWlsZCBpZiB5b3UgZG9uJ3QgaGF2ZSBhci4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBvbGQgaW5jb3JyZWN0IHNldHRpbmcgb2YgQ0MuCi0KLVR1ZSBKdW4gIDQgMTA6NTI6NDkgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgY2hlY2sgdG8gc2VlIGlmIHRvb2xkaXIgZXhpc3RzLgotCU1ha2UgJCh0b29sZGlyKSBhbmQgJCh0b29sZGlyKS9iaW4uCi0KLU1vbiBKdW4gIDMgMTc6NDA6MjMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBNYWtlIG1haW4gYW4gaW50IGZ1bmN0aW9uLCBub3Qgdm9pZC4KLQotRnJpIE1heSAzMSAxMzo1OToyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKGZpbHRlcl9zeW1ib2xzKTogQ2hlY2sgZm9yIEJTRl9XRUFLIGFzIHdlbGwgYXMKLQlCU0ZfR0xPQkFMLgotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgTWF5ICA4IDE2OjU3OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IE1ha2UgY2xlYXIgdGhhdCBpdCBpcyBvbmx5IGEgd2FybmluZwotCXdoZW4gdGhlIG91dHB1dCBmaWxlIGNhbiBub3QgcmVwcmVzZW50IHRoZSBhcmNoaXRlY3R1cmUuCi0KLUZyaSBNYXkgIDMgMTE6MzA6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCByZWZlciB0byBieXRlcyBwYXN0IHRoZSBlbmQKLQlvZiBkYXRhLgotCi1XZWQgQXByIDI0IDE0OjEwOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmRkYmcuYyAocmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8pOiBNb3ZlIGNhbGwgdG8KLQlmcmVlX3NhdmVkX3N0YWJzIG91dHNpZGUgdGhlIGxvb3Agb3ZlciB0aGUgc3ltYm9scy4KLQotVHVlIEFwciAyMyAxMjo1NjoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBzeW1ib2xzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGgKLSAJYC4nIGFmdGVyIG90aGVyIHN5bWJvbHMuICBJZiBubyBvdGhlciBkZWNpc2lvbiBjYW4gYmUgbWFkZSwgc29ydAotCXN5bWJvbHMgYnkgbmFtZS4KLQotVGh1IEFwciAxOCAxNjowMjoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlcC1pbi5zZWQ6IFN1YnN0aXR1dGUgJChCRkRESVIpIGZvciBAQkZERElSQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoZGVwLnNlZCk6IFN1YnN0aXR1dGUgJChCRkRESVIpIGZvciBAQkZERElSQC4KLQotVHVlIEFwciAxNiAxMzo1MDoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJkY29mZi5jOiBOZXcgZmlsZS4KLQkqIHJkZGJnLmMgKHJlYWRfZGVidWdnaW5nX2luZm8pOiBSZWFkIENPRkYgc3ltYm9scyBpZiBDT0ZGIGZsYXZvdXIKLQlhbmQgbm8gc3RhYnMgd2VyZSBmb3VuZC4KLQkqIGJ1ZGJnLmggKHBhcnNlX2NvZmYpOiBEZWNsYXJlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgcmRjb2ZmLmMuCi0JKERFQlVHX09CSlMpOiBBZGQgcmRjb2ZmLm8uCi0KLU1vbiBBcHIgMTUgMTU6NTU6MDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbmxtY29udi5jIChjaG9vc2VfdGVtcF9iYXNleyxfdHJ5fSk6IERlbGV0ZSwgaW4gbGliaWJlcnR5IG5vdy4KLQkobGlua19pbnB1dHMpOiBVcGRhdGUgY2FsbCB0byBjaG9vc2VfdGVtcF9iYXNlLgotCi1Nb24gQXByICA4IDE0OjQwOjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjkgMTY6MTE6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBQcmludCB0aGUgU0VDX0xJTktfT05DRSBmbGFnCi0JYW5kIHRoZSBTRUNfTElOS19EVVBMSUNBVEVTIGZpZWxkLgotCi1GcmkgTWFyIDI5IDExOjM1OjU1IDE5OTYgIEouVC4gQ29ua2xpbiAgKGp0Y0BsaXNhLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuMTogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgotCi1UaHUgTWFyIDI4IDE0OjE3OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JzdGFicy5jIChzdGFiX2VudW1fdHlwZSk6IFNldCBidWYgYmVmb3JlIHVzaW5nIGl0LgotCi1GcmkgTWFyIDIyIDE1OjQ5OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIGZpZWxkIGFiZmQuCi0JKHN0YXJ0X3N0YWIpOiBBZGQgYWJmZCBwYXJhbWV0ZXIuCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogU2tpcCB0aGUgc3ltYm9sIGxlYWRpbmcgY2hhciB3aGVuIHNlYXJjaGluZwotCWZvciB0aGUgdmFsdWUgb2YgYSBnbG9iYWwgc3ltYm9sLgotCSogYnVkYmcuaCAoc3RhcnRfc3RhYik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IFBhc3MgYWJmZCB0bwotCXN0YXJ0X3N0YWIuCi0JKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjEgMTI6NDA6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmMgKHN0YWJfZnVuY3Rpb25fdHlwZSk6IE91dHB1dCBhbiBlbXB0eSB0eXBlZGVmIGZvciBhbgotCXVudXNlZCBhcmd1bWVudCwgcmF0aGVyIHRoYW4gbWFraW5nIHVwIGEgbWVhbmluZ2xlc3MgbmFtZS4KLQkoc3RhYl92YXJpYWJsZSk6IFVzZSBOX1JTWU0gZm9yIGEgREVCVUdfUkVHSVNURVIgdmFyaWFibGUuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaW5mbyk6IEFkZCBnbG9iYWxfdmFycyBmaWVsZC4KLQkocGFyc2VfaWVlZV9iZSk6IFdoZW4gZW5kaW5nIHRoZSBnbG9iYWwgdHlwZWRlZiBibG9jaywgY29weSB0aGUKLQl2YXJpYWJsZXMgaW50byBpbmZvLT5nbG9iYWxfdmFycy4KLQkocGFyc2VfaWVlZV9hdG4pOiBEb24ndCByZXF1aXJlIGFuIE5OIHJlY29yZCBmb3IgYSBwbWlzYyBBVE4uCi0JKGllZWVfcmVhZF9yZWZlcmVuY2UpOiBTZWFyY2ggdGhlIGdsb2JhbCB2YXJpYWJsZXMgYWZ0ZXIgdGhlIGxvY2FsCi0JdmFyaWFibGVzLgotCi1XZWQgTWFyIDIwIDE4OjA4OjE5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBNYWtlIHN1cmUgc3ltX25hbWUgaXMgYWx3YXlzIHNldC4KLQkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IEFsd2F5cyBwdXQgYSBzcGFjZSBhZnRlciB0aGUgc2VjdGlvbiBuYW1lLgotCShkdW1wX2JmZF9oZWFkZXIpOiBUZXJtaW5hdGUgb3V0cHV0IHdpdGggbmV3bGluZS4KLQotV2VkIE1hciAyMCAxNjozNToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYzogTmV3IGZpbGUuCi0JKiBidWRiZy5oICh3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyk6IERlY2xhcmUuCi0JKiBvYmpjb3B5LmMgKHdyaXRlX2RlYnVnZ2luZ19pbmZvKTogRm9yIENPRkYgb3IgRUxGLCBvdXRwdXQgc3RhYnMKLQlpbiBzZWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHdyc3RhYnMuYy4KLQkoV1JJVEVfREVCVUdfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChPQkpDT1BZX1BST0cpKTogVXNlICQoV1JJVEVfREVCVUdfT0JKUyksIG5vdCAkKERFQlVHX09CSlMpLgotCSgkKFNUUklQX1BST0cpKTogTGlrZXdpc2UuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfbWVtYmVycyk6IE1ha2UgdHlwZSBzdHViIGRldGVjdGlvbiBtb3JlIGxpa2UKLQlnZGIuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaGFuZGxlKTogQWRkIGZpZWxkcyBjb21wbGV4X2Zsb2F0X2luZGV4IGFuZAotCWNvbXBsZXhfZG91YmxlX2luZGV4LgotCShpZWVlX2NvbXBsZXhfdHlwZSk6IENhY2hlIHR5cGUgaW5kZXggaW4gY29tcGxleF9mbG9hdF9pbmRleCBhbmQKLQljb21wbGV4X2RvdWJsZV9pbmRleCwgZGVwZW5kaW5nIHVwb24gc2l6ZS4gIFNldCBzaXplIG9uIHR5cGUgc3RhY2sKLQl0byBzaXplICogMi4KLQotCSogaWVlZS5jIChpZWVlX2VtcHR5X3R5cGUpOiBVc2UgYnVpbHRpbl91bmtub3duLCBub3QgMC4KLQkoaWVlZV92b2lkX3R5cGUpOiBVc2UgYnVpbHRpbl92b2lkLCBub3QgMS4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX3R5KTogSGFuZGxlICdWJyB0eXBlIGNvZGUuCi0JKHBhcnNlX2llZWVfYXRuKTogRG9uJ3QgcmVxdWlyZSB0d28gbnVtYmVycyBmb3IgdHlwZSAxMC4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX2JlKTogQWRkIG9uZSB0byBvZmZzZXQgYXQgZW5kIG9mIGZ1bmN0aW9uIG9yCi0JYmxvY2suCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfYmxvY2spOiBBZGQgZmllbGQgc2tpcC4KLQkocGFyc2VfaWVlZV9iYik6IERvbid0IGNhbGwgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIGZvciBfX1hSWUNQUAotCWZ1bmN0aW9uLCBhbmQgc2V0IHNraXAgZmllbGQuCi0JKHBhcnNlX2llZWVfYmUpOiBEb24ndCBjYWxsIGRlYnVnX2VuZF9mdW5jdGlvbiBpZiBza2lwIGlzIHNldC4KLQotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IEFkZCBmaWVsZHMgY3VycmVudF93cml0ZV9saW5lbm8KLQlhbmQgY3VycmVudF93cml0ZV9saW5lbm9faW5kZXguCi0JKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBjdXJyZW50X3dyaXRlX2xpbmVubyBhbmQKLQljdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCBmb3IgZWFjaCB1bml0LiAgQ2FsbAotCWRlYnVnX3dyaXRlX2xpbmVub3MgcmF0aGVyIHRoYW4gd3JpdGluZyBvdXQgdGhlIGxpbmUgbnVtYmVycwotCWRpcmVjdGx5LgotCShkZWJ1Z193cml0ZV9mdW5jdGlvbik6IENhbGwgZGVidWdfd3JpdGVfbGluZW5vcy4KLQkoZGVidWdfd3JpdGVfYmxvY2spOiBMaWtld2lzZS4KLQkoZGVidWdfd3JpdGVfbGluZW5vcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGRlYnVnLmMgKGRlYnVnX3dyaXRlX3R5cGUpOiBGb3IgREVCVUdfS0lORF9GVU5DVElPTiwgcHVzaCByZXR1cm4KLQl0eXBlIGJlZm9yZSBhcmd1bWVudHMuCi0KLU1vbiBNYXIgMTggMTg6MDU6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19GVU5DX1ZGT1JLLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBkbGx0b29sLmMsIG5sbWNvbnYuYzogSW5jbHVkZSA8dmZvcmsuaD4gaWYgSEFWRV9WRk9SS19IIGlzCi0JZGVmaW5lZC4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9yYW5nZV90eXBlKTogQSBjb21wbGV4IHR5cGUgaXMgZGVmaW5lZCBhcyBhCi0Jc3VicmFuZ2Ugb2YgaXRzZWxmIHdpdGggdGhlIGhpZ2ggYm91bmQgemVyby4KLQkqIGllZWUuYyAoaWVlZV9jb21wbGV4X3R5cGUpOiBEb24ndCBjcmFzaCBvbiBzaXplcyBvZiAxMiBvciAxNi4KLQotVHVlIE1hciAxMiAxMjowOTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV91bmRlZmluZWRfdGFnKTogU3dpdGNoIHRvIGdsb2JhbF90eXBlcyBldmVuCi0JaWYgaXQgaXMgbm90IGVtcHR5LgotCShpZWVlX3RhZ190eXBlKTogRm9yIGFuIGVudW0sIGxvb2sgdGhyb3VnaCBpbmZvLT5lbnVtcy4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z190eXBlX3NhbWVwKTogRG9uJ3QgbG9vcCBlbmRsZXNzbHkgaW4KLQlERUJVR19LSU5EX0VOVU0gY2FzZS4gIEZyb20gRXJpYyBCYXVyIDxlY2JAbmV4ZW4uY29tPi4KLQotTW9uIE1hciAxMSAxMjozNTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IENhbGwgc2F2ZV9zdGFiIGZvcgotCWVhY2ggc3RhYiBlbnRyeSwgY2FsbCBzdGFiX2NvbnRleHQgb24gYW4gZXJyb3IsIGFuZCBjYWxsCi0JZnJlZV9zYXZlZF9zdGFicyBiZWZvcmUgcnR1cm5pbmcuCi0JKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTGlrZXdpc2UuCi0JKFNBVkVfU1RBQlNfQ09VTlQpOiBEZWZpbmUuCi0JKHN0cnVjdCBzYXZlZF9zdGFiKTogRGVmaW5lLgotCShzYXZlZF9zdGFicywgc2F2ZWRfc3RhYnNfaW5kZXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc2F2ZV9zdGFiLCBzdGFiX2NvbnRleHQsIGZyZWVfc2F2ZWRfc3RhYnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9zLgotCi0JKiBvYmpkdW1wLmMgKHN0YWJfbmFtZSk6IFJlbW92ZS4KLQkoc3RydWN0IHN0YWJfcHJpbnQpOiBSZW1vdmUuCi0JKHN0YWJfcHJpbnQpOiBSZW1vdmUuCi0JKGR1bXBfc3RhYnMpOiBEb24ndCBpbml0aWFsaXplIHN0YWJfbmFtZS4KLQkocHJpbnRfc2VjdGlvbl9zdGFicyk6IENhbGwgYmZkX2dldF9zdGFiX25hbWUgcmF0aGVyIHRoYW4gdXNpbmcKLQl0aGUgc3RhYl9uYW1lIGFycmF5LgotCi1UdWUgRmViIDI3IDE5OjUyOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHJkYmcuYyAocHJfaW50X2NvbnN0YW50KTogSW5pdGlhbGl6ZSBpbmZvIGNvcnJlY3RseS4KLQkocHJfZmxvYXRfY29uc3RhbnQpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAyNiAxODoxMTozNyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIHRvIGhhbmRsZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCi1TYXQgRmViIDI0IDExOjIxOjQ5IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBTZWFyY2ggJChCRkRMSUIpIGJlZm9yZQotCSQoT1BDT0RFUykuCi0KLVRodSBGZWIgMTUgMTI6NDQ6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHRhbXBlciB3aXRoIExERkxBR1MuICBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlCi0JY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShjaGVjayk6IFVzZSAkKFJQQVRIX0VOVlZBUikgcmF0aGVyIHRoYW4gTERfTElCUkFSWV9QQVRILgotCi0JKiBvYmpjb3B5LmMgKHNtYXJ0X3JlbmFtZSk6IFJhdGhlciB0aGFuIGRvaW5nIGNobW9kIHRoZW4gY2hvd24sIGRvCi0JY2htb2Qgd2l0aG91dCBzZXR1aWQsIHRoZW4gY2hvd24sIHRoZW4gY2htb2Qgd2l0aCBzZXR1aWQuCi0KLVdlZCBGZWIgMTQgMTY6NDY6NDIgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogYXJzdXAuYyAobWFwX292ZXJfbGlzdCk6IFJlaW5kZW50LiAgRG9uJ3QgYXNzdW1lIHRoYXQgdGhlCi0JZnVuY3Rpb24gZG9lcyBub3QgZGVsZXRlIHRoZSBCRkQuCi0JKGFyX2FkZGxpYl9kb2VyKTogRG9uJ3Qgc2V0IHByZXYtPm5leHQgaWYgcHJldiBpcyBOVUxMLgotCi1XZWQgRmViIDE0IDE1OjEyOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3JlZ25vX3RvX2dlbnJlZyk6IENvbnZlcnQgcmVnaXN0ZXIgbnVtYmVycyBmb3IgbTY4awotCWFuZCBpOTYwLgotCShpZWVlX2dlbnJlZ190b19yZWdubyk6IExpa2V3aXNlLgotCi1Nb24gRmViIDEyIDE0OjE5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB3cml0ZSBjb2RlIHRvIHB1dCB0eXBlcyBpbiB0aGUKLQlnbG9iYWwgdHlwZSBibG9jayB3aGVuIHBvc3NpYmxlLCB0byBvdXRwdXQgcmFuZ2VzIGZvciBhbGwgbWVtb3J5Ci0Jb2NjdXBpZWQgYnkgdGhlIG1vZHVsZSwgYW5kIHRvIGltcHJvdmUgZWZmaWNpZW5jeS4KLQotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IFJlbW92ZSBjbGFzc19tYXJrIGZpZWxkLiAgQWRkCi0JaWRfbGlzdCBhbmQgY29tcGFyZV9saXN0IGZpZWxkcy4KLQkoc3RydWN0IGRlYnVnX2NsYXNzX2lkKTogRGVmaW5lLgotCShzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QpOiBEZWZpbmUuCi0JKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBpbmZvLT5pZF9saXN0Ci0JKGRlYnVnX3dyaXRlX25hbWUpOiBSZW1vdmUgcmVmZXJlbmNlIHRvIGluZm8tPmNsYXNzX21hcmsuCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBHZXQgaWQgZm9yIGFsbCBzdHJ1Y3RzIGFuZCBjbGFzc2VzLiAgU2ltcGxpZnkKLQl0ZXN0IGZvciB3aGV0aGVyIHN0cnVjdCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBHZXQgaWQgZm9yIGFsbCBjbGFzc2VzLiAgU2ltcGxpZnkgdGVzdAotCWZvciB3aGV0aGVyIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KLQkoZGVidWdfd3JpdGVfYmxvY2spOiBEb24ndCB3cml0ZSBvdXQgYmxvY2tzIG90aGVyIHRoYW4gdGhlIHRvcAotCWxldmVsIGJsb2NrIGlmIHRoZXkgaGF2ZSBubyBsb2NhbCB2YXJpYWJsZXMuCi0JKGRlYnVnX3NldF9jbGFzc19pZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlYnVnX3R5cGVfc2FtZXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWJ1Z19jbGFzc190eXBlX3NhbWVwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIHByZGJnLmMgKHByX3N0YXJ0X3N0cnVjdF90eXBlKTogQWx3YXlzIHByaW50IGlkLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX3RhZ190eXBlKTogTGlrZXdpc2UuCi0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBzeW1zIGFuZCBzeW1jb3VudCBmaWVsZHMuCi0JKHN0YXJ0X3N0YWIpOiBBZGQgc3ltcyBhbmQgc3ltY291bnQgcGFyYW1ldGVycy4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShwYXJzZV9zdGFiX3N0cmluZyk6IExvb2sgdXAgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgc3ltYm9sIHRhYmxlCi0JdG8gZ2V0IHRoZSByaWdodCB2YWx1ZS4KLQkqIGJ1ZGJnLmggKHN0YXJ0X3N0YWIpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBBZGQgc3ltcyBhbmQKLQlzeW1jb3VudCBwYXJhbWV0ZXJzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX2FycmF5X3R5cGUpOiBJZiB0aGUgaW5kZXggdHlwZSBpcyAwLCB1c2UKLQlpbnQuCi0KLVdlZCBGZWIgIDcgMTQ6MTc6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc3RhcnRfY29tcGlsYXRpb25fdW5pdCk6IENsZWFyIG1vZGlmaWVkIGFuZAotCW1vZGlmaWVkX2FsbG9jIGZpZWxkcyBvZiBpbmZvLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAtLWVuYWJsZS1zaGFyZWQuICBTdWJzdGl0dXRlIG5ldwotCXZhcmlhYmxlcyBCRkRMSUIgYW5kIE9QQ09ERVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQkZETElCKTogU2V0IHRvIEBCRkRMSUJALgotCShPUENPREVTKTogU2V0IHRvIEBPUENPREVTQC4KLQotTW9uIEZlYiAgNSAxNjoxODo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KLQlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluIChITERGTEFHUyk6IE5ldyBzdWJzdGl0dXRpb24uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERkxBR1MpOiBOZXcgdmFyaWFibGUuICBNYWtlIGFsbCBsaW5rcyB1c2UKLQkkKEhMREZMQUdTKSBiZWZvcmUgJChDRkxBR1MpIGFuZCAkKExERkxBR1MpLgotCShCRkRMSUJfREVQKTogTmV3IHZhcmlhYmxlLiAgUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgJChCRkQpIGFzCi0JYSBkZXBlbmRlbmN5IHdpdGggJChCRkRMSUJfREVQKS4gIFJlbW92ZSAkKEJGRCkgYXMgYSBkZXBlbmRlbmN5IGlmCi0JdGhlcmUgaXMgYWxzbyBhIGRlcGVuZGVuY3kgb24gJChBRERMX0RFUFMpLgotCShCRkRMSUIpOiBSZW5hbWUgZnJvbSBCRkQ7IGNoYW5nZSBhbGwgdXNlczsgc2V0IHRvIC1MLi4vYmZkIC1sYmZkLgotCShPUENPREVTX0RFUCk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuZHMgb2YgJChPUENPREVTKQotCWFzIGEgZGVwZW5kZW5jeSB3aXRoICQoT1BDT0RFU19ERVApLgotCShPUENPREVTKTogU2V0IHRvIC1MLi4vb3Bjb2RlcyAtbG9wY29kZXMuCi0JKEFERExfREVQUyk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mCi0JJChBRERMX0xJQlMpIGFzIGEgZGVwZW5kZW5jeSB3aXRoICQoQURETF9ERVBTKS4KLQkoY2hlY2spOiBTZXQgTERfTElCUkFSWV9QQVRIIGluIHRoZSBlbnZpcm9ubWVudC4KLQkoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEJGRCBjb25maWd1cmUuaG9zdCBhbmQgY29uZmlnLmJmZC4KLQotRnJpIEZlYiAgMiAxNzowMjo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jOiAjaW5jbHVkZSBzdGRhcmcuaCBvciB2YXJhcmdzLmguCi0JKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBDaGFuZ2UgRklMRSogYXJnIHRvIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKi4KLQlBbGwgY2FsbGVycyB1cGRhdGVkLiAgVXNlIGZwcmludGZfZnVuYy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ29uc2lzdGVudGx5IHVzZSBmcHJpbnRmX2Z1bmMuCi0JKG9iamR1bXBfc3ByaW50Zik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFByaW50IGluc24gaW50byBhIGJ1ZmZlciwgcHJpbnQgcmF3IGluc24gb3Vyc2VsdmVzLAotCXRoZW4gcHJpbnQgaW5zbiBtbmVtb25pYy4KLQotRnJpIEZlYiAgMiAxNjo0ODo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAgMSAwOTozODoxOCAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMy02XTg2LSotd2luMzIpOiBCZWNvbWVzIGlbMy02XTg2LSotY3lnd2luMzIuCi0JKHBvd2VycGMqLSotY3lnd2luMzIpOiBOZXcuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1XZWQgSmFuIDMxIDEzOjIyOjAzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLjEuCi0KLU1vbiBKYW4gMjkgMTc6MzY6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEggSiBMdSA8aGpsQHpvb20uY29tPjoKLQkqIG9iamNvcHkuYyAocmVtb3ZlX2xlYWRpbmdfY2hhcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSKTogRGVmaW5lLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXJlbW92ZS1sZWFkaW5nLWNoYXIuCi0JKGZpbHRlcl9zeW1ib2xzKTogSWYgcmVtb3ZlX2xlYWRpbmdfY2hhciwgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQlvZiBhIGdsb2JhbCBzeW1ib2wgbWF0Y2hlcyB0aGUgc3ltYm9sIGxlYWRpbmcgY2hhciBvZiB0aGUgQkZELAotCXJlbW92ZSB0aGUgZmlyc3QgY2hhcmFjdGVyLgotCShjb3B5X29iamVjdCk6IEZpbHRlciB0aGUgc3ltYm9scyBpZiByZW1vdmVfbGVhZGluZ19jaGFyIGlzIHNldC4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tcmVtb3ZlLWxlYWRpbmctY2hhci4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1yZW1vdmUtbGVhZGluZy1jaGFyLgotCi1TYXQgSmFuIDI3IDE1OjQwOjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogQWRkIHByb3RvdHlwZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIG9uCi0JU3VuT1MuCi0KLUZyaSBKYW4gMjYgMTE6NTM6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpIChubSk6IEltcHJvdmUgZG9jdW1lbnRhdGlvbiBvbiBzeW1ib2wgdHlwZXMuCi0JKG9iamR1bXApOiBSZWZlcmVuY2UgdGhlIHN0YWJzIG1hbnVhbCBmcm9tIHRoZSBkaXNjdXNzaW9uIG9mIHRoZQotCS0tc3RhYnMgb3B0aW9uLgotCi1UaHUgSmFuIDI1IDExOjIxOjQ2IDE5OTYgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIGEgInN0YW1wcyIgdGFyZ2V0LgotCi1UaHUgSmFuIDI1IDEzOjUxOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMsIGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBDaGFuZ2Ugb2JqZHVtcCAtaAotCW91dHB1dCB0byBiZSBzaW1wbGVyIGFuZCB0byBpbmNsdWRlIHNlY3Rpb24gZmlsZSBvZmZzZXRzLgotCi1XZWQgSmFuIDI0IDEyOjA2OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9tZW1iZXJzKTogRG9uJ3QgYWRqdXN0IHZvZmZzZXQuCi0KLQkqIGllZWUuYyAoaWVlZV9yZWFkX2N4eF9jbGFzcyk6IERvbid0IG11bHRpcGx5IHZvZmZzZXQgYnkgNC4KLQkoc3RydWN0IGllZWVfd3JpdGVfdHlwZSk6IEFkZCBuYW1lIGZpZWxkLgotCShzdHJ1Y3QgaWVlZV90eXBlX2NsYXNzKTogUmVtb3ZlIG5hbWUgZmllbGQuICBDaGFuZ2UgYWxsIHVzZXMgdG8KLQl1c2UgbmV3IG5hbWUgZmllbGQgaW4gdHlwZSBpbnN0ZWFkLgotCShzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSk6IEluaXRpYWxpemUgbmFtZSBmaWVsZCBvZiB0eXBlLgotCShpZWVlX3N0YXJ0X2NsYXNzX3R5cGUpOiBEb24ndCBpbml0aWFsaXplIGNsYXNzZGVmIGVudHJ5IG9mIHRhZy4KLQkoaWVlZV9jbGFzc19tZXRob2RfdmFyKTogRG9uJ3QgYWRqdXN0IHZvZmZzZXQuCi0JKGllZWVfZW5kX2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV90YWdfdHlwZSk6IEluaXRpYWxpemUgbmV3IG5hbWUgZmllbGQgb2YgdHlwZS4KLQkoaWVlZV90eXBkZWYpOiBTZXQgbmFtZSBhZnRlciBjb3B5aW5nIGluIHR5cGUgaW5mb3JtYXRpb24uCi0KLQkqIGRlYnVnLmMgKFZPRkZTRVRfU1RBVElDX01FVEhPRCk6IERlZmluZSBhcyAtMSwgbm90IDEuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSk6IERlZmluZS4KLQkoc3RydWN0IGllZWVfaGFuZGxlKTogQWRkIG1vZGlmaWVkIGFuZCBtb2RpZmllZF9hbGxvYyBmaWVsZHMuCi0JKGllZWVfZ2V0X21vZGlmaWVkX2luZm8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3BvaW50ZXJfdHlwZSk6IENhY2hlIHR5cGUgaW5kZXguCi0JKGllZWVfY29uc3RfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3ZvbGF0aWxlX3R5cGUpOiBMaWtld2lzZS4KLQotCSogaWVlZS5jIChpZWVlX2RlZmluZV9uYW1lZF90eXBlKTogV2hlbiBjcmVhdGluZyBhIHRhZyBmb3IgYW4KLQlhbm9ueW1vdXMgc3RydWN0LCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5LgotCShpZWVlX3RhZ190eXBlKTogTGlrZXdpc2UuCi0JKiBkZWJ1Zy5jIChkZWJ1Z193cml0ZV90eXBlKTogT25seSBjaGVjayBhbmQgc2V0IGlkIGZpZWxkIGZvciBhbgotCXVubmFtZWQgb2JqZWN0LgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0KLQkqIGllZWUuYzogVmFyaW91cyBjaGFuZ2VzIHRvIHdyaXRlIG91dCB0eXBlcyBmb3IgZnVuY3Rpb25zIGFuZAotCXJlZmVyZW5jZXMsIGFuZCB0byBub3Qgd3JpdGUgb3V0IHVubmVjZXNzYXJ5IGZ1bmN0aW9uIHR5cGVzLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX3Zhcik6IFJlbW92ZSB2YXJpYWJsZSBmaWVsZC4gIEFkZCBraW5kCi0JZmllbGQsIGFuZCBkZWZpbmUgc29tZSBlbnVtIGNvbnN0YW50cyBmb3IgaXQuCi0JKHBhcnNlX2llZWVfdHkpOiBTZXQga2luZCBmaWVsZCBvZiB2YXJpYWJsZSBmb3IgJ3gnIGFuZCAnWCcgdHlwZXMuCi0JKHBhcnNlX2llZWVfYXRuKTogTWFrZSBhbiBpbmRpcmVjdCBzbG90IGZvciBhbiBleHRlcm5hbCB2YXJpYWJsZSwKLQlhbHRob3VnaCB3ZSBvdGhlcndpc2UgZG9uJ3QgcmVjb3JkIGl0LiAgU2V0IGtpbmQgZmllbGQgcmF0aGVyIHRoYW4KLQl2YXJpYWJsZSBmaWVsZCBvZiBwdmFyLgotCShpZWVlX3JlYWRfY3h4X2NsYXNzKTogVHJ5IHRvIGdldCB0aGUgdHlwZSBvZiBhIHN0YXRpYyBtZW1iZXIuCi0JKGllZWVfcmVhZF9yZWZlcmVuY2UpOiBDaGVjayBraW5kIGZpZWxkIHJhdGhlciB0aGFuIHZhcmlhYmxlCi0JZmllbGQuCi0KLVR1ZSBKYW4gMjMgMTU6NTQ6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byBoYW5kbGUgcmVhZGluZyBDKysgcmVmZXJlbmNlIHR5cGUKLQlpbmZvcm1hdGlvbi4KLQotCSogZGVidWcuaCAoZW51bSBkZWJ1Z192YXJfa2luZCk6IEFkZCBERUJVR19WQVJfSUxMRUdBTC4KLQkoZW51bSBkZWJ1Z19wYXJtX2tpbmQpOiBBZGQgREVCVUdfUEFSTV9JTExFR0FMLgotCSogZGVidWcuYyAoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEhhbmRsZSBERUJVR19LSU5EX0ZVTkNUSU9OLgotCi0JKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byB3cml0ZSBvdXQgZGVmaW5pdGlvbnMgb2YgQysrIGNsYXNzZXMuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX2FwcGVuZF9maWxlbmFtZSk6IFJlbW92ZS4KLQkqIGRlYnVnLmggKGRlYnVnX2FwcGVuZF9maWxlbmFtZSk6IERvbid0IGRlY2xhcmUuCi0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IFJlbW92ZSBsYXN0X3R5cGUgZmllbGQuICBBZGQKLQlzb19zdHJpbmcgYW5kIHNvX3ZhbHVlIGZpZWxkcy4KLQkoZmluaXNoX3N0YWIpOiBDYWxsIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgYmVmb3JlIGNhbGxpbmcKLQlkZWJ1Z19lbmRfZnVuY3Rpb24uICBEb24ndCB3YXJuIGFib3V0IHBlbmRpbmcgdmFyaWFibGVzLgotCShwYXJzZV9zdGFiKTogQWNjdW11bGF0ZSBOX1NPIHN0cmluZ3MgdW50aWwgYSBub24gTl9TTyBzeW1ib2wgaXMKLQlzZWVuLCByYXRoZXIgdGhhbiBjYWxsaW5nIGRlYnVnX2FwcGVuZF9maWxlbmFtZS4gIENhbGwKLQlzdGFiX2VtaXRfcGVuZGluZ192YXJzIGJlZm9yZSBjYWxsaW5nIGRlYnVnX2VuZF9mdW5jdGlvbi4gIERvbid0Ci0Jc2V0IGluZm8tPmxhc3RfdHlwZS4KLQotVHVlIEphbiAyMyAwOTo1Mzo1NCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHVua25vd24gZW5kaWFubmVzcy4KLQlQYXNzIGZwcmludGYgdG8gSU5JVF9ESVNBU1NFTUJMRV9JTkZPLgotCi1Nb24gSmFuIDIyIDE2OjQ2OjQzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JQWRkIG5ldyBvcHRpb24gLS1zaG93LXJhdy1pbnNuLgotCSogb2JqZHVtcC5jIChzaG93X3Jhd19pbnNuKTogTmV3IGdsb2JhbC4KLQkodXNhZ2UpOiBVcGRhdGUuCi0JKGxvbmdfb3B0aW9ucyk6IFVwZGF0ZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBkaXNhc21faW5mby5mbGFncyBpZiAtLXNob3ctcmF3LWluc24uCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBuZXcgYXJjaCxtYWNoLGVuZGlhbiBmaWVsZHMgaW4KLQlkaXNhc21faW5mby4KLQotTW9uIEphbiAyMiAxOToyOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gcGFzcyBhIHNpbmdsZSBpbmZvIGFyZ3VtZW50IGFyb3VuZAotCWluIHRoZSByZWFkaW5nIHJvdXRpbmVzLCByYXRoZXIgdGhhbiBzZXZlcmFsIGFyZ3VtZW50cy4gIEFkZCBjb2RlCi0JdG8gcmVhZCBDKysgZGVidWdnaW5nIHJlY29yZHMuCi0KLQkqIGRlYnVnLmggKGRlYnVnX2dldF90eXBlX3NpemUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfbmFtZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF9iaXRwb3MpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5KTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lKTogRGVjbGFyZS4KLQkqIGRlYnVnLmMgKGRlYnVnX2dldF9yZWFsX3R5cGUpOiBIYW5kbGUgREVCVUdfS0lORF9UQUdHRUQuCi0JKGRlYnVnX2dldF90eXBlX3NpemUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfYml0cG9zKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF9waHlzbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IE1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByZWFsIGtpbmQsIG5vdCBJTkRJUkVDVCwKLQl0byB0YWdfdHlwZS4gIFBhc3MgdGhlIG5hbWUgcmVjdXJzaXZlbHkgZm9yIElORElSRUNULgotCi1GcmkgSmFuIDE5IDEyOjMxOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVidWcuaCAoc3RydWN0IGRlYnVnX3dyaXRlX2Zucyk6IFJlbW92ZSBlbGxpcHNpc190eXBlLiAgQWRkIGludAotCWFuZCBib29sZWFuIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25fdHlwZS4gIEFkZCBib29sZWFuIHBhcmFtZXRlciB0bwotCW1ldGhvZF90eXBlLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBEb24ndCBkZWNsYXJlLgotCShkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUpOiBBZGQgZGVidWdfdHlwZSAqIGFuZCBib29sZWFuCi0JcGFyYW1ldGVycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZGVidWdfbWFrZV9tZXRob2RfdHlwZSk6IEFkZCBib29sZWFuIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogQWRkIGJvb2xlYW4gKiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoZGVidWdfZ2V0X3RhcmdldF90eXBlKTogRGVjbGFyZS4KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlKTogQWRkIGZpZWxkcyBhcmdfdHlwZXMgYW5kCi0JdmFyYXJncy4KLQkoc3RydWN0IGRlYnVnX21ldGhvZF90eXBlKTogQWRkIGZpZWxkIHZhcmFyZ3MuCi0JKGRlYnVnX2VsbGlwc2lzX3R5cGUsIEVMTElQU0lTX1ApOiBSZW1vdmUuCi0JKGRlYnVnX21ha2VfZWxsaXBzaXNfdHlwZSk6IFJlbW92ZS4KLQkoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ190eXBlcyBhbmQgdmFyYXJncyBwYXJhbWV0ZXJzLgotCShkZWJ1Z19tYWtlX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogQWRkIHB2YXJhcmdzIHBhcmFtZXRlci4KLQkoZGVidWdfZ2V0X3RhcmdldF90eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z193cml0ZV90eXBlKTogSW4gY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OLCBwdXNoIGFyZ3VtZW50Ci0JdHlwZXMgYW5kIHBhc3MgY291bnQgdG8gZnVuY3Rpb25fdHlwZS4gIEluIERFQlVHX0tJTkRfTUVUSE9ELCB1c2UKLQlhIHNpZ25lZCBpbnQgZm9yIHRoZSBjb3VudCwgZG9uJ3QgY2FsbCBlbGxpcHNpc190eXBlLCBhbmQgcGFzcwotCXZhcmFyZ3MgdG8gbWV0aG9kX3R5cGUuCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvKTogQWRkIHZhcmFyZ3MgZmllbGQuCi0JKHN0YWJfZGVtYW5nbGVfYXJndHlwZXMpOiBBZGQgcHZhcmFyZ3MgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHN0YWJfZGVtYW5nbGVfYXJncyk6IExpa2V3aXNlLgotCShzdGFiX2RlbWFuZ2xlX3R5cGUpOiBJbiBjYXNlICdGJywgcGljayB1cCBhcmd1bWVudCB0eXBlcy4KLQkqIHByZGJnLmMgKHByX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCi0JKHByX2Z1bmN0aW9uX3R5cGUpOiBBZGQgYXJnY291bnQgYW5kIHZhcmFyZ3MgcGFyYW1ldGVycy4KLQkocHJfbWV0aG9kX3R5cGUpOiBBZGQgdmFyYXJncyBwYXJhbWV0ZXIuCi0JKiBpZWVlLmMgKGllZWVfZWxsaXBzaXNfdHlwZSk6IFJlbW92ZS4KLQkoaWVlZV9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ2NvdW50IGFuZCB2YXJhcmdzIHBhcmFtZXRlcnMuCi0JKGllZWVfbWV0aG9kX3R5cGUpOiBBZGQgdmFyYXJncyBwYXJhbWV0ZXIuICBSZW1vdmUgbW9zdCBvZgotCWZ1bmN0aW9uIGJvZHksIGFuZCBqdXN0IGNhbGwgaWVlZV9mdW5jdGlvbl90eXBlLgotCi0JKiBzdGFicy5jOiBJbmNsdWRlICJkZW1hbmdsZS5oIi4gIEFkZGVkIHNldmVyYWwgbmV3IHN0YXRpYwotCWZ1bmN0aW9ucyBub3QgbGlzdGVkIGJlbG93IHRvIGRlbWFuZ2xlIGFyZ3VtZW50IHR5cGVzOyB0aGV5IGFyZQotCWFsbCBjYWxsZWQgdmlhIHN0YWJfZGVtYW5nbGVfYXJndHlwZXMuCi0JKGZpbmlzaF9zdGFiKTogSWYgdGhlIGtpbmQgb2YgYW4gdW5kZWZpbmVkIHRhZyBpcwotCURFQlVHX0tJTkRfSUxMRUdBTCwgdXNlIERFQlVHX0tJTkRfU1RSVUNUIGluc3RlYWQuICBXYXJuIGlmIHRoZXJlCi0JYXJlIGFueSBwZW5kaW5nIHZhcmlhYmxlLgotCShwYXJzZV9zdGFiKTogRG9uJ3QgY2xvc2UgdGhlIGZ1bmN0aW9uIHdoZW4gdGhlIGJsb2NrIGRlcHRoIGdvZXMKLQl0byB6ZXJvLiAgUGFzcyB2YWx1ZSB0byBkZWJ1Z19lbmRfZnVuY3Rpb24uCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogSW4gY2FzZSAnVCcsIHBhc3MgdGhlIG5hbWUgdG8KLQlwYXJzZV9zdGFiX3R5cGUuCi0JKHBhcnNlX3N0YWJfdHlwZSk6IEluIGNhc2UgJ3gnLCB1c2Ugc3RhYl9maW5kX3RhZ2dlZF90eXBlLiAgSW4KLQljYXNlICcjJywgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIHZhcmlhYmxlIG51bWJlcnMgb2YgYXJndW1lbnRzLgotCShwYXJzZV9zdGFiX3N0cnVjdF90eXBlKTogQWRkIHRhZ25hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHBhcnNlX3N0YWJfbWVtYmVycyk6IEFkZCB0YWduYW1lIGFuZCB0eXBlbnVtcyBwYXJhbWV0ZXJzLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuICBJZiB0aGUgdHlwZSBvZiBhIG1ldGhvZCBpcyBhIHN0dWIsIGNhbGwKLQlwYXJzZV9zdGFiX2FyZ3R5cGVzIHRvIGRlbWFuZ2xlIHRoZSBhcmd1bWVudCB0eXBlcyBhbmQgZ2V0IHRoZQotCXBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgotCShwYXJzZV9zdGFiX2FyZ3R5cGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RhYl9yZWNvcmRfdmFyaWFibGUpOiBGb3IgYSBERUJVR19HTE9CQUwgb3IgREVCVUdfU1RBVElDCi0JdmFyaWFibGUsIGNhbGwgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIGltbWVkaWF0ZWx5LgotCShzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBkZWJ1Zy5oIChlbnVtIGRlYnVnX3R5cGVfa2luZCk6IEFkZCBERUJVR19LSU5EX0lMTEVHQUwuCi0JKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBBZGQgZmllbGQgZWxsaXBzaXNfdHlwZS4gIEFkZCBpZAotCXBhcmFtZXRlciB0byBzdGFydF9zdHJ1Y3RfdHlwZSwgc3RhcnRfY2xhc3NfdHlwZSwgYW5kIHRhZ190eXBlLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBEZWNsYXJlLgotCShkZWJ1Z19maW5kX25hbWVkX3R5cGUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfdHlwZV9raW5kKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X3JldHVybl90eXBlKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZHMpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfdHlwZSk6IERlY2xhcmUuCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfaGFuZGxlKTogQWRkIGZpZWxkcyBjbGFzc19pZCBhbmQgYmFzZV9pZC4KLQkoc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUpOiBBZGQgZmllbGQgaWQuCi0JKHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBhcmd0eXBlcyB0byBwaHlzbmFtZS4KLQlDaGFuZ2UgYWxsIHVzZXMuCi0JKGRlYnVnX2VsbGlwc2lzX3R5cGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShFTExJUFNJU19QKTogTmV3IG1hY3JvLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgYXJndHlwZXMgdG8gcGh5c25hbWUuCi0JKGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50KTogTGlrZXdpc2UuCi0JKGRlYnVnX25hbWVfdHlwZSk6IEFsd2F5cyBwdXQgdHlwZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0JKGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZmluZF90YWdnZWRfdHlwZSk6IFRyZWF0IERFQlVHX0tJTkRfSUxMRUdBTCBzcGVjaWFsbHksCi0JcmF0aGVyIHRoYW4gREVCVUdfS0lORF9WT0lELgotCShkZWJ1Z19nZXRfcmVhbF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X3R5cGVfa2luZCk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X3JldHVybl90eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRzKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfd3JpdGUpOiBJbml0aWFsaXplIGJhc2VfaWQuCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBQYXNzIG5ldyBpZCBhcmd1bWVudCB0byB0YWdfdHlwZS4gIEhhbmRsZQotCURFQlVHX0tJTkRfSUxMRUdBTC4gIFVzZSBpZCBmb3IJREVCVUdfS0lORF9TVFJVQ1QgYW5kCi0JREVCVUdfS0lORF9VTklPTi4gIEhhbmRsZSBlbGxpcHNpcyBmb3IgbWV0aG9kIGFyZ3VtZW50cy4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IERvbid0IGRlcmVmZXJlbmNlIGtjbGFzcyBpZiBpdCBpcyBOVUxMLgotCVVzZSBpZC4KLQkqIHByZGJnLmMgKHByX2Zucyk6IEFkZCBwcl9lbGxpcHNpc190eXBlLgotCShwcl9lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJfcG9pbnRlcl90eXBlKTogSWYgdGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXksIHBhcmVudGhlc2l6ZQotCWl0IGNvcnJlY3RseS4KLQkocHJfc3RhcnRfc3RydWN0X3R5cGUpOiBBZGQgaWQgcGFyYW1ldGVyLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX3RhZ190eXBlKTogTGlrZXdpc2UuCi0JKHByX2ZpeF92aXNpYmlsaXR5KTogQWRkIHRoZSB2aXNpYmlsaXR5IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLAotCW5vdCB0aGUgc2Vjb25kIGVsZW1lbnQgb24gdGhlIHN0YWNrLgotCShwcl9zdHJ1Y3RfZmllbGQpOiBQb3AgdGhlIHN0YWNrIGJlZm9yZSBjYWxsaW5nIHByX2ZpeF92aXNpYmlsaXR5LgotCShwcl9jbGFzc19zdGF0aWNfbWVtYmVyKTogTGlrZXdpc2UuCi0JKHByX2NsYXNzX3N0YXJ0X21ldGhvZCk6IERvbid0IHB1c2ggYSB0eXBlLCBqdXN0IHNldCB0aGUgbWV0aG9kCi0JbmFtZSBpbiB0aGUgdHlwZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkocHJfY2xhc3NfZW5kX21ldGhvZCk6IERvbid0IHBvcCB0aGUgc3RhY2suCi0JKHByX2NsYXNzX21ldGhvZF92YXJpYW50KTogUmVuYW1lIGFyZ3R5cGVzIHBhcmFtZXRlciB0byBwaHlzbmFtZS4KLQlBcHBlbmQgY29uc3QgYW5kIHZvbGF0aWxlIHJhdGhlciB0aGFuIHByZXBlbmRpbmcgdGhlbS4gIEFkZCBhCi0Jc3BhY2UgYWZ0ZXIgdGhlIHBoeXNuYW1lLgotCShwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoaWVlZV9mbnMpOiBBZGQgaWVlZV9lbGxpcHNpc190eXBlLgotCShpZWVlX2RlZmluZV9uYW1lZF90eXBlKTogVXNlIERFQlVHX0tJTkRfSUxMRUdBTCByYXRoZXIgdGhhbgotCURFQlVHX0tJTkRfVk9JRC4KLQkod3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgotCShpZWVlX3R5cGRlZik6IExpa2V3aXNlLgotCShpZWVlX2VsbGlwc2lzX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3N0YXJ0X3N0cnVjdF90eXBlKTogQWRkIGlkIHBhcmFtZXRlci4KLQkoaWVlZV9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfdGFnX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBuYW1lIHRvIHBoeXNuYW1lLgotCShpZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCk6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbiAoREVCVUdfT0JKUyk6IFJlbW92ZSBwcmRiZy5vLgotCSgkKE9CSkRVTVBfUFJPRykpOiBEZXBlbmQgdXBvbiwgYW5kIGxpbmsgYWdhaW5zdCwgcHJkYmcuby4KLQotVGh1IEphbiAxOCAxNzozNTowNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX3RhaWwpOiBDaGFuZ2VkIHRoZSBvcmRlciBvZiB0aGUgc2VjdGlvbnMgdG8gYXZvaWQKLQlhbiBhbGlnbm1lbnQgcHJvYmxlbS4KLQotV2VkIEphbiAxNyAxNDoyMzowMCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl9kdSk6IFNldCBkdS5zdGFja2ZybXQgdG8gMC4KLQkod3JfdW4sIHdyX3NjKTogRW1pdCBhbGwgc2VjdGlvbnMsIGV2ZW4gdGhvc2Ugd2l0aCAwIHNpemUuCi0KLVR1ZSBKYW4gMTYgMTY6MTU6NDkgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAod3JfaGQpOiBTcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IHdhcyBiZWluZwotCXN0b3JlZCBpbiBzZWdtZW50IGlkZW50aWZpZXIgZmllbGQuCi0KLVR1ZSBKYW4gMTYgMTI6MDc6MjUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChCVUlMRF9OTE1DT05WLCBCVUlMRF9TUkNPTlYsIFNZU0lORk9fUFJPRywKLQlCVUlMRF9ETExUT09MKTogUHV0IGRlZmluaXRpb25zIGZvciB0aGVzZSBpbnRvIG1ha2VmaWxlIHdoZW4KLQljb25maWd1cmluZywgaW5zdGVhZCBvZiBhbHdheXMgY2xlYXJpbmcgaW4gbXB3LW1ha2Uuc2VkLgotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBhbnkgaG9zdF9hbGlhcyBvciB0YXJnZXRfYWxpYXMgc2V0dGluZ3MsCi0JZml4IHBhdGhuYW1lIHRvIEJGRCBpbnRlcm5hbCBpbmNsdWRlIGZpbGVzLCByZW1vdmUgZGVwZW5kZW5jeQotCWNhbGN1bGF0aW9uIHJ1bGVzLgotCi1UaHUgSmFuIDExIDE3OjMxOjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogQWRkIG5ldyBzZWN0aW9uIGZsYWdzCi0JU0VDX3tFWENMVURFLFNPUlRfRU5UUklFU30uCi0KLVRodSBKYW4gMTEgMTE6NDU6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogTlVMTCB0ZXJtaW5hdGUgdGhlIG91dHB1dCBzeW1ib2xzLgotCShjb3B5X29iamVjdCk6IEFsbG9jYXRlIHNwYWNlIGZvciBhIHBvc3NpYmxlIGV4dHJhIE5VTEwgcG9pbnRlci4KLQotCSogZGVidWcuYyAoZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUpOiBNYWtlIHN1cmUgd2UgYXJlCi0JZ2l2ZW4gYSBraW5kIG9mIHR5cGUgd2UgY2FuIGhhbmRsZS4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IEhhbmRsZSB1bmRlZmluZWQgZW51bXMgYW5kIHN0cnVjdHMuCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBIYW5kbGUgdW5kZWZpbmVkIGNsYXNzZXMuCi0JKiBwcmRiZy5jIChwcl9lbnVtX3R5cGUpOiBIYW5kbGUgYW4gdW5kZWZpbmVkIGVudW0uCi0JKiBpZWVlLmMgKGllZWVfZW51bV90eXBlKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTAgMTU6MzM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCBkZXBlbmRlbmNpZXMuCi0JKEFMTE9DQSwgTUFMTE9DKTogUmVtb3ZlIHZhcmlhYmxlcy4KLQkoQURETF9MSUJTKTogUmVtb3ZlICQoTUFMTE9DKSBmcm9tIGRlZmluaXRpb24uCi0JKiBhbGxvY2EuYywgZ21hbGxvYy5jOiBSZW1vdmUuCi0KLU1vbiBKYW4gIDggMTg6MDI6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IEFkZCBnbG9iYWwgZnVuY3Rpb24gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyBhbmQgYQotCWJ1bmNoIG9mIHN0YXRpYyBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgdXNlZCB0byB3cml0ZSBvdXQgSUVFRQotCWRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGJ1ZGJnLmggKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBEZWNsYXJlLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX3R5cGUpOiBBZGQgcHNsb3QgZmllbGQuCi0JKGVudW0gYnVpbHRpbl90eXBlcyk6IERlZmluZS4KLQkoaWVlZV9idWlsdGluX3R5cGUpOiBGb3IgYSBwb2ludGVyLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuYW1lZAotCXR5cGUuICBVc2UgZW51bSB2YWx1ZXMgcmF0aGVyIHRoYW4gbnVtYmVycy4KLQkoaWVlZV9hbGxvY190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9yZWFkX3R5cGVfaW5kZXgpOiBVc2UgaWVlZV9hbGxvY190eXBlLgotCShwYXJzZV9pZWVlX2JiKTogTGlrZXdpc2UuCi0JKHBhcnNlX2llZWVfdHkpOiBMaWtld2lzZS4gIFVzZSBpZWVlX2J1aWx0aW5fdHlwZSBmb3IgYXJyYXkgcmFuZ2UsCi0JcmF0aGVyIHRoYW4gbWFraW5nIGEgbmV3IGludGVnZXIgdHlwZS4gIFN0b3JlIHRoZSBuZXcgdHlwZSBpbiB0aGUKLQlzbG90LCBpZiB0aGVyZSBpcyBvbmUuCi0JKHBhcnNlX2llZWVfYXRuKTogVHJlYXQgQVROMTAgYXMgZGVmaW5pbmcgYSByZWdpc3RlciB2YXJpYWJsZS4KLQkoaWVlZV9yZWdub190b19nZW5yZWcpOiBSZW5hbWUgZnJvbSBpZWVlX3JlZ25vX3RvX2dlbi4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShpZWVlX2dlbnJlZ190b19yZWdubyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfdHlwZSk6IEFkZCBuZXcgdHlwZW5hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuCi0JKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEFkZCBuZXcgdHlwZW5hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0KLQkqIGRlYnVnLmggKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBBZGQgdGFnIHBhcmFtZXRlciB0bwotCWVudW1fdHlwZSwgc3RhcnRfc3RydWN0X3R5cGUsIGFuZCBzdGFydF9jbGFzc190eXBlLgotCSogZGVidWcuYyAoZGVidWdfd3JpdGVfdHlwZSk6IFBhc3MgYW55IHRhZyBuYW1lIHRvCi0Jc3RhcnRfc3RydWN0X3R5cGUsIGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUsIGFuZCBlbnVtX3R5cGUuICBJZgotCURFQlVHX0tJTkRfVEFHR0VELCBwYXNzIHRoZSBuYW1lIGluIHRoZSByZWN1cnNpdmUgY2FsbC4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IEFjY2VwdCBhIG5ldyB0YWcgcGFyYW1ldGVyLCBhbmQgcGFzcyBpdAotCXRvIHN0YXJ0X2NsYXNzX3R5cGUuCi0JKiBwcmRiZy5jIChwb3BfdHlwZSk6IERvbid0IHJlbW92ZSAnKycgY2hhcmFjdGVyLgotCShwcl9lbnVtX3R5cGUpOiBBY2NlcHQgYW5kIHVzZSB0YWcgcGFyYW1ldGVyLgotCShwcl9zdGFydF9zdHJ1Y3RfdHlwZSk6IExpa2V3aXNlLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX2NsYXNzX2Jhc2VjbGFzcyk6IEFkanVzdCBhbGdvcml0aG0gdXNlZCB0byBmaW5kIHdoZXJlIHRvIHB1dAotCXRoZSBiYXNlY2xhc3MgbmFtZS4KLQkocHJfdGFnKTogRG9uJ3QgYm90aGVyIHRvIGluc2VydCB0aGUgdGFnIG5hbWUuCi0KLQkqIG9iamNvcHkuYzogSW5jbHVkZSBidWRiZy5oLgotCShjb252ZXJ0X2RlYnVnZ2luZyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9ERUJVR0dJTkcpOiBEZWZpbmUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAiZGVidWdnaW5nIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1kZWJ1Z2dpbmcuCi0JKGlzX3N0cmlwX3NlY3Rpb24pOiBTa2lwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBjb252ZXJ0X2RlYnVnZ2luZy4KLQkoc2V0dXBfc2VjdGlvbiwgY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGZpbHRlcl9zeW1ib2xzKTogU2tpcCBkZWJ1Z2dpbmcgc3ltYm9scyBpZiBjb252ZXJ0X2RlYnVnZ2luZy4KLQkoY29weV9vYmplY3QpOiBJZiBjb252ZXJ0X2RlYnVnZ2luZywgcmVhZCBhbmQgd3JpdGUgZGVidWdnaW5nCi0JaW5mb3JtYXRpb24uCi0JKHdyaXRlX2RlYnVnZ2luZ19pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tZGVidWdnaW5nLgotCSogTWFrZWZpbGUuaW4gKERFQlVHX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoT0JKQ09QWV9QUk9HKSk6IERlcGVuZCB1cG9uIGFuZCBsaW5rIGFnYWluc3QgJChERUJVR19PQkpTKS4KLQkoJChTVFJJUF9QUk9HKSk6IExpa2V3aXNlLgotCShPQkpEVU1QX09CSlMpOiBSZW1vdmUgdmFyaWFibGUuCi0JKCQoT0JKRFVNUF9QUk9HKSk6IFVzZSBvYmpkdW1wLm8gJChERUJVR19PQkpTKSByYXRoZXIgdGhhbgotCSQoT0JKRFVNUF9PQkpTKS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1kZWJ1Z2dpbmcuCi0KLVRodSBKYW4gIDQgMTY6MzE6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IE5ldyBmaWxlIHdpdGggY29kZSB0byByZWFkIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSogYnVkYmcuaCAocGFyc2VfaWVlZSk6IERlY2xhcmUuCi0JKiByZGRiZy5jIChyZWFkX2RlYnVnZ2luZ19pbmZvKTogSGFuZGxlIElFRUUgZmxhdm91ciBmaWxlcy4KLQkocmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIGllZWUuYy4KLQkoT0JKRFVNUF9PQkpTKTogQWRkIGllZWUuby4KLQotCSogYnVjb21tLmggKHhyZWFsbG9jKTogQ2hhbmdlIHR5cGUgb2YgZmlyc3QgcGFyYW1ldGVyIGZyb20gY2hhciAqCi0JdG8gUFRSLgotCi1UdWUgSmFuICAyIDE3OjQ0OjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCB0YXJnZXRzIHRvIGF1dG9tYXRpY2FsbHkgcmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JUmVtb3ZlIHRhcmdldHMgd2hpY2gganVzdCBsaXN0ZWQgZGVwZW5kZW5jaWVzIG9mIC5vIGZpbGVzLgotCShERVApOiBOZXcgdmFyaWFibGUuCi0JKEhGSUxFUywgR0VORVJBVEVEX0hGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENGSUxFUywgR0VORVJBVEVEX0NGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKHVuZGVyc2NvcmUuYyk6IERvbid0IGRvIGFueXRoaW5nLCBqdXN0IGRlcGVuZCB1cG9uIHN0YW1wLXVuZGVyLgotCShzdGFtcC11bmRlcik6IE5ldyB0YXJnZXQ7IGRvIHdoYXQgdW5kZXJzY29yZS5jIHVzZWQgdG8gZG8uCi0JKG5sbWNvbnYubyk6IERlcGVuZCB1cG9uIHN5bS5oIGFuZCBlY29mZi5oLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCwgZGVwLCBkZXAtaW4pOiBOZXcgdGFyZ2V0cy4KLQkoc3RhZ2UxLCBzdGFnZTIsIHN0YWdlMywgYWdhaW5zdCwgY29tcGFyaXNvbik6IFJlbW92ZS4KLQkoZGUtc3RhZ2UxLCBkZS1zdGFnZTIsIGRlLXN0YWdlMyk6IFJlbW92ZS4KLQkoY2xlYW4sIGRpc3RjbGVhbik6IFJlbW92ZSBzdGFtcC11bmRlciBhbmQgZGVwLnNlZC4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi0JSW1wbGVtZW50IGdlbmVyaWMgZGVidWdnaW5nIHN1cHBvcnQuICBJbXBsZW1lbnQgYSBzdGFicyByZWFkZXIgYW5kCi0JYSBnZW5lcmljIHByaW50ZXIuCi0JKiBidWRiZy5oLCBkZWJ1Zy5jLCBkZWJ1Zy5oLCBwcmRiZy5jLCByZGRiZy5jLCBzdGFicy5jOiBOZXcgZmlsZXMuCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgImRlYnVnLmgiIGFuZCAiYnVkYmcuaCIuCi0JKGR1bXBfZGVidWdnaW5nKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tZGVidWdnaW5nLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRlYnVnZ2luZyIuCi0JKGRpc3BsYXlfYmZkKTogSGFuZGxlIC0tZGVidWdnaW5nLgotCSogTWFrZWZpbGUuaW4gKE9CSkRVTVBfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChPQkpEVU1QX1BST0cpKTogVXNlICQoT0JKRFVNUF9PQkpTKS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1kZWJ1Z2dpbmcuCi0KLVNhdCBEZWMgMzAgMDk6NTk6NTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBubS5jICggbG9uZ19vcHRpb25zKTogQWRkICItLWRlZmluZWQtb25seSIgb3B0aW9uLgotCSh1c2FnZSk6IFVwZGF0ZSBmb3IgbmV3ICItLWRlZmluZWQtb25seSIgb3B0aW9uLgotCShmaWx0ZXJfc3ltYm9scyk6IEhhbmRsZSAiLS1kZWZpbmVkLW9ubHkiLgotCi1GcmkgRGVjIDI5IDE2OjA0OjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJwYXJzZS55OiBJbmNsdWRlICJidWNvbW0uaCIsIG5vdCA8c3lzZGVwLmg+LgotCSogbmxtaGVhZGVyLnk6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KLQotVHVlIERlYyAyNiAxODoyMzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHByaW50X3N5bWRlZl9lbnRyeSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9nZXRfZWx0X2F0X2luZGV4LgotCi1TYXQgRGVjIDIzIDExOjAzOjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY2d5bnN1LmNvbT4KLQotCSogY29uZmlndXJlLmluIChETExUT09MX0RFRlMpOiBCdWlsZCBkbGx0b29sIGZvciBQb3dlclBDIGlmIHRhcmdldAotCWlzIHBvd2VycGMqLSotd2luKiBpbiBhZGRpdGlvbiB0byBwb3dlcnBjKi0qLSpwZSouCi0KLUZyaSBEZWMgMTUgMTY6MzA6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGVuZGlhbl9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIGl0LgotCSogbmxtY29udi5jIChtYWluKTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KLQotRnJpIERlYyAxNSAwNzo1MTozNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBTdGFydCBmcm9tIDEgaWYgbm8gb3RoZXIgaW5zdHJ1Y3Rpb25zCi0gCWdpdmVuLgotCi1UdWUgRGVjIDEyIDEyOjA1OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLjEuICBGcm9tIFJvbmFsZAotCUYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotTW9uIERlYyAxMSAxNDozMzowNSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1hYy1iaW51dGlscy5yOiBGaXggY29weXJpZ2h0IGFuZCB2ZXJzaW9uIHN0cmluZ3MuCi0KLQkqIE1ha2VmaWxlLmluICh2ZXJzaW9uKTogUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KLQotRnJpIERlYyAgMSAxNDo0MTo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZCAoaW5zdGFsbCwgaW5zdGFsbC1vbmx5KTogRWRpdCBpbiBNYWMtc3BlY2lmaWMKLQlpbnN0YWxsIHByb2NlZHVyZS4KLQotVGh1IE5vdiAzMCAyMDoyNjowMiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChwcGNfanRhYik6IFRoZSBiaW5hcnkgZ2x1ZSBmb3IgUG93ZXJQQyBkbGwgbGlua2FnZSwKLQlpbmNsdWRpbmcgdGhlIHJldHVybiBpbnN0cnVjdGlvbi4KLQlzaW5mbzogYWRkZWQgYSBwcmVmZXJyZWQgYWxpZ25tZW50IGZpZWxkLgotCShzZWNkYXRhKTogc2VjdGlvbiBkYXRhIGZvciB0aGUgUG93ZXJQQyB2ZXJzaW9uLgotCShtYWtlX29uZV9saWJfZmlsZSk6IE1vcmUgc3ltYm9scywgTW9yZSBzZWN0aW9ucyAocGRhdGEsIHJkYXRhKQotCShtYWtlX3RhaWwpOiBVc2UgaWRhdGEkNiBpbnN0ZWFkIG9mIGlkYXRhJDcgZm9yIHBwYy4gQWxzbyBhZGRlZCBhCi0JTlVMTCBpZGF0YSQzIGRlc2NyaXB0b3IgKHRlbXBvcmFyeSkuCi0KLVR1ZSBOb3YgMjggMTc6MjM6NDQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogRG9uJ3QgcmVmZXJlbmNlIGRfZXhwb3J0X3ZlYyBpZgotCXRoZXJlIGFyZSBubyBleHBvcnRlZCBmdW5jdGlvbnMuCi0KLU1vbiBOb3YgMjcgMTM6MDU6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCi0KLVdlZCBOb3YgMjIgMTM6MTc6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBTdGFydCBhc3NpZ25pbmcgb3JkaW5hbHMgYXQgMS4KLQotCSogTWFrZWZpbGUuaW4gKEVYUEVDVCk6IFVzZSAkJHIsIG5vdCAkJHtyb290bWV9LgotCShjaGVjayk6IFNldCByLCBub3Qgcm9vdG1lLgotCi1UdWUgTm92IDIxIDE4OjA0OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX05FRURfREVDTEFSQVRJT04uCi0JKiBhY2NvbmZpZy5oOiBQdXQgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIGluIEBUT1BAIHNlY3Rpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotRnJpIE5vdiAxNyAxMDozNDozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogVXNlIEBob3N0QCBhbmQgQHRhcmdldEAsIG5vdAotCSQoaG9zdF9jYW5vbmljYWwpIGFuZCAkKHRhcmdldF9jYW5vbmljYWwpLgotCi1UaHUgTm92IDE2IDAzOjM5OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVmVyc2lvbiAyLjYgcmVsZWFzZWQuCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjYuCi0KLVdlZCBOb3YgMTUgMTI6MTQ6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IERlZmluZS4KLQkoY2hlY2spOiBQYXNzIENDIGFuZCBDRkxBR1MgdG8gcnVudGVzdC4KLQotCSogbm0uYyAoZGlzcGxheV9yZWxfZmlsZSk6IERvbid0IHJlcXVpcmUgYSBEWU5BTUlDIG9iamVjdCB3aGVuCi0JZHVtcGluZyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBnbG9iYWwgc3ltYm9scyBiZWZvcmUgbG9jYWwKLQlzeW1ib2xzIGJlZm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogRG9uJ3QgZnV0eiBhcm91bmQgbG9va2luZyBmb3IgYSBnbG9iYWwKLQlzeW1ib2wgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLQotVHVlIE5vdiAxNCAxNzoxOToxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogVXNlIEZPUEVOXyogbWFjcm9zIHJhdGhlciB0aGFuICJyIiBvciAidyIuCi0KLQkqIGRsbHRvb2wuYyAoZmlsbF9vcmRpbmFscyk6IENvcnJlY3QgbWVtc2V0IGNhbGwuCi0KLVN1biBOb3YgMTIgMTI6NTY6MDUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQgKERFTUFOR0xFUl9QUk9HKTogRWRpdCBvdXQgYXR0ZW1wdHMgdG8gZG8gYW55dGhpbmcKLSAJd2l0aCB0aGUgbWFuIHBhZ2UuCi0KLUZyaSBOb3YgMTAgMTE6NDE6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBDb3B5IHRoZSBzZWN0aW9uIGxtYSBpbmRlcGVuZGVudGx5IG9mCi0JdGhlIHZtYS4KLQotV2VkIE5vdiAgOCAxMTozMzowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyc3VwLmMgKGFyX29wZW4pOiBDYXN0IG1hbGxvYyByZXR1cm4gdmFsdWUuCi0KLVR1ZSBOb3YgIDcgMDk6MDE6MjYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlIChETExUT09MX0RFRlMpOiBBZGRlZCBwcGMgdGFyZ2V0LgotCSogZGxsdG9vbC5jIChNUFBDKTogQWRkZWQgYmFzaWMgUFBDIGRlZmluaXRpb25zLgotCi1UdWUgTm92ICA3IDE0OjAyOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCB0cmVhdCByczYwMDAtKi1seW54KiBzcGVjaWFsbHkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvcnNseW54OiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIEB0YXJnZXRfbWFrZWZpbGVfZnJhZ21lbnRALgotCi1Nb24gTm92ICA2IDE1OjAwOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmg6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQkqIGFyLmM6IERvbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPiBvciA8c3RkaW8uaD4uCi0JKiBidWNvbW0uYywgZGxsdG9vbC5jLCBubG1jb252LmMsIG9iamNvcHkuYywgb2JqZHVtcC5jOiBMaWtld2lzZS4KLQotRnJpIE5vdiAgMyAxMjozODowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCi0JUGVybWl0IHVzZXIgdG8gb3ZlcnJpZGUgREVNQU5HTEVSX1BST0cgZnJvbSBjb21tYW5kIGxpbmUuICBGcm9tCi0JTWFuZnJlZCBIb2xsc3RlaW4gPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPi4KLQkqIE1ha2VmaWxlLmluICgkKERFTUFOR0xFUl9QUk9HKSk6IERlcGVuZCB1cG9uCi0JJChERU1BTkdMRVJfUFJPRykuMS4KLQkoaW5zdGFsbCk6IERvbid0IGRlcGVuZCB1cG9uICQoREVNQU5HTEVSX1BST0cpLjEuICBPbmx5IGluc3RhbGwKLQkkKERFTUFOR0xFUl9QUk9HKS4xIGlmICQoREVNQU5HTEVSX1BST0cpIGlzIG5vdCBlbXB0eS4KLQotV2VkIE5vdiAgMSAxNTowNDo1NyAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKHN5c2xleC5vKTogYWRkIC1JJChzcmNkaXIpIGlmIGNvbXBpbGluZyBpbiBhCi0Jc2VwYXJhdGUgZGlyZWN0b3J5LgotCi1Nb24gT2N0IDMwIDE0OjI0OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X3ZhbHVlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIGl0LiAgSWYgd2UgbmVlZCB0aGUgcmlnaHQgc2VjdGlvbiBmb3IKLQl0aGUgc3ltYm9sLCBhbmQgd2UgY2FuJ3QgZmluZCBpdCwgcHJpbnQgYW4gb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24KLQlyYXRoZXIgdGhhbiB1c2luZyBhIHN5bWJvbCBmcm9tIHNvbWUgb3RoZXIgc2VjdGlvbi4KLQotVGh1IE9jdCAyNiAxMDoyMzoxNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG5vX2lkYXRhNCwgbm9faWRhdGE1KTogTmV3LgotCShhcm1fanRhYik6IFVzZSBjb3JyZWN0IGVuY29kaW5nIG9mIGp1bXAgaW5zdHJ1Y3Rpb24uCi0JKHVzYWdlLCBtYWluLCBtYWtlX2hlYWQsIG1ha2VfdGFpbCk6IEFjdCBvbiBub19pZGF0YTQsIG5vX2lkYXRhNS4KLQotV2VkIE9jdCAyNSAxMjoxMDowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBwYXRocyB0byBnZW5lcmF0ZWQgeS50YWIuW2NoXSBmaWxlcy4KLQotRnJpIE9jdCAyMCAxODo0MDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1UaHUgT2N0IDE5IDE3OjQ3OjQxIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZSBleHRyYW5lb3VzIHRhYiBvbiBvdGhlcndpc2UgZW1wdHkgbGluZSwKLQl3aGljaCBjb25mdXNlcyBtYW55IG5vbi1HTlUgdmVyc2lvbnMgb2YgIm1ha2UiLgotCi1XZWQgT2N0IDE4IDE2OjMxOjU4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoaTM4Nl9qdGFiLCBhcm1fanRhYik6IE5ldwotCShnZW5fbGliX2ZpbGUpOiBSZXdyaXR0ZW4gdG8gdXNlIGJmZC4KLQotRnJpIE9jdCAxMyAxNjoxMDowNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgZ2l2ZSBlcnJvciBtZXNzYWdlIGlmIGRsbHRvb2wKLQl3YXNuJ3QgYnVpbHQuCi0KLUZyaSBPY3QgMTMgMTE6MDQ6MzcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGVmbGV4Lmw6IEFsbG93IHF1b3Rpbmcgb2YgSURzLgotCSogZGVmcGFyc2UueSAoJXVuaW9uKTogc3RyaW5nIGRlbGV0ZWQuCi0JKGNvbW1hbmQpOiBERVNDUklQVElPTiB0YWtlcyBJRC4KLQkqIGRsbHRvb2wuYyAoZ2VuX2RlZl9maWxlKTogUXVvdGUgb3V0Z29pbmcgbmFtZSBpZgotCW5lY2Vzc2FyeS4gIFByZXNlcnZlIE5PTkFNRS4KLQkoZ2VuX2xpYl9maWxlKTogUnVuIHJhbmxpYi4KLQkod29ya291dF9wcmVmaXgpOiBEZWxldGVkLgotCShtYWluLCB1c2FnZSwgbG9uZ19vcHRpb25zKTogQWRkIC0tYXMsIC0tcmFubGliLCAtLWFyIG9wdGlvbnMuCi0KLVdlZCBPY3QgMTEgMTM6MzY6MTMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtdGFibGUpOiBIT1dfQUxJR05fTE9ORywgbmV3LgotCShkX29yZCk6IERlbGV0ZWQuCi0JKGRfbG93X29yZCwgZF9oaWdoX29yZCwgZF9uYW1lZF9mdW5jcyk6IE5ldy4KLQkoZ2VuX2V4cF9maWxlKTogQ3JlYXRlIG5vbmFtZSBlbnRyaWVzIGNvcnJlY3RseS4KLQkoZ2VuX2xpYl9maWxlKTogRHVtcCBleHBvcnRzIGFscGhhYmV0aWNhbGx5LgotCShwcm9jZXNzX2R1cGxpY2F0ZXMpOiAgQ291bnQgbm9uYW1lZCBmdW5jdGlvbnMuCi0JKGZpbGxfb3JkaW5hbHMpOiBLZWVwIHRyYWNrIG9mIGhpZ2hlc3Qgb3JkIHRvby4KLQkobWFuZ2xlX2RlZnMpOiBDcmVhdGUgYWxwaGFiZXRpY2FsbHkgb3JkZXJlZCBsaXN0IG9mIG5hbWVzLgotCi1UdWUgT2N0IDEwIDA5OjM5OjA5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUT09MX1BST0dTKTogSW5jbHVkZSBETExUT09MX1BST0cuCi0KLU1vbiBPY3QgIDkgMTM6MDY6MzEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChhZGRfdW5kZXJzY29yZSk6IE5ldy4KLQkoeGxhdGUpOiBVc2UgbmV3IG5hbWUuCi0JKG1haW4sIHVzYWdlKTogVXBkYXRlLgotCi1GcmkgT2N0ICA2IDE0OjA4OjUxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzeXNpbmZvLnk6IEVsaW1pbmF0ZSB1bnVzZWQgdGVybWluYWxzICJbIiBhbmQgIl0iIGFuZCB1bnVzZWQKLQlub250ZXJtaW5hbCAibmFtZSIuICBPbmUgcy9yIGNvbmZsaWN0IHJlbWFpbnMuCi0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBubS5jIChwcmludF9zeW1uYW1lKTogRG9uJ3QgdHJ5IHRvIGRlbWFuZ2xlIGFuIGVtcHR5Ci0JbmFtZS4KLQkqIG9iamR1bXAuYyAoc2x1cnBfc3ltdGFiKTogUmVzZXQgc3ltY291bnQgaWYgdGhlcmUgYXJlCi0Jbm8gc3ltYm9scy4KLQkoc2x1cnBfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZSwgZm9yIGR5bnN5bWNvdW50LgotCShkaXNhc3NlbWJsZV9kYXRhKTogRml4IG1lbW9yeSBsZWFrOiBmcmVlIHNvcnRlZF9zeW1zIHdoZW4gZG9uZS4KLQkoZGlzcGxheV9iZmQpOiBMaWtld2lzZSwgZm9yIHN5bXMgYW5kIGR5bnN5bXMuCi0JKGR1bXBfcmVsb2NzKTogRG9uJ3QgcHJpbnQgaGVhZGVyIGJlZm9yZSBwb3NzaWJseSBnZW5lcmF0aW5nIGFuCi0JZXJyb3IgbWVzc2FnZS4KLQkoZHVtcF9keW5hbWljX3JlbG9jcyk6IExpa2V3aXNlLgotCi0JKiBhci4xLCBubS4xLCBvYmpkdW1wLjEsIHNpemUuMSwgc3RyaW5ncy4xLCBzdHJpcC4xOiBGaXggdHlwb3MgYW5kCi0JZm9ybWF0dGluZyBidWdzLgotCi1GcmkgT2N0ICA2IDEyOjAwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXIuYyAoZG9fcXVpY2tfYXBwZW5kKTogQ29tbWVudCBvdXQuCi0JKHJlcGxhY2VfbWVtYmVycyk6IEFkZCBxdWljayBhcmd1bWVudC4KLQkobWFpbik6IERvbid0IGNhbGwgZG9fcXVpY2tfYXBwZW5kLgotCShvcGVuX2luYXJjaCk6IERvbid0IGNhbGwgcXVpY2tfYXBwZW5kIHRvIGNyZWF0ZSBhbiBlbXB0eSBhcmNoaXZlLgotCUluc3RlYWQgY2FsbCBiZmRfb3BlbncvYmZkX3NldF9mb3JtYXQvYmZkX2Nsb3NlLgotCi1UaHUgT2N0ICA1IDIwOjUzOjA4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uYzogQWx3YXlzIGluY2x1ZGUgdGltZS5oLgotCi1UaHUgT2N0ICA1IDE3OjI1OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3N5bWJvbHMpOiBTb3J0IGdudV9jb21waWxlZCBhbmQgZ2NjMl9jb21waWxlZAotCXN5bWJvbHMgYWZ0ZXIgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLiAgTGlrZXdpc2UgZm9yCi0Jc3ltYm9scyB3aGljaCBsb29rIGxpa2UgZmlsZSBuYW1lcy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQWx3YXlzIGNob3NlIHRoZSBmaXJzdCByZWFzb25hYmxlIHN5bWJvbAotCXdpdGggYSBnaXZlbiB2YWx1ZS4KLQotVHVlIE9jdCAgMyAyMjozODo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyc3VwLmMgKGFyX3NhdmUpOiBVc2UgcmVuYW1lLCBub3QgdW5saW5rL2xpbmsvdW5saW5rLgotCi1Nb24gT2N0ICAyIDEyOjEwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jIChtYWluKTogRXhpdCB3aXRoIHplcm8gc3RhdHVzIGlmIG5vIGZpbGVzIGFyZSBnaXZlbgotCWFuZCBzdGFuZGFyZCBpbnB1dCBpcyByZWFkLgotCi1UaHUgU2VwIDI4IDIwOjAzOjA3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQ2FsY3VsYXRlIHVuZGVyc2NvcmUgYW5kIHB1dCBpbnRvIG1ha2VmaWxlCi0JZnJhZ21lbnQsIGdlbmVyYXRlIGNvbmZpZy5oLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIGVkaXQgVW5peCBtYWtlZmlsZQotCWludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtYWMtYmludXRpbHMucjogTmV3IGZpbGUsIE1hYyByZXNvdXJjZXMuCi0KLVRodSBTZXAgMjggMTU6NDk6MDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiAoZ2VuX2V4cF9maWxlKTogQWx3YXlzIGVtaXQgYSAucmVsb2Mgc2VjdGlvbiBpZgotCXJlbG9jYXRhYmxlLgotCShpbXBfbmFtZV9sYWIpOiBOZXcuCi0JKGdlbl9kZWZfZmlsZSk6IE5ldy4KLQkoZ2VuX2xpYl9maWxlKTogVXNlIGltcF9uYW1lX2xhYi4KLQkobWFpbik6IEluaXRpYWxpemUgaW1wX25hbWVfbGFiLgotCi1Nb24gU2VwIDI1IDEyOjA1OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0hFQURFUl9TWVNfV0FJVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiIGFuZCAiYnVjb21tLmgiLiAgRG9uJ3QgaW5jbHVkZQotCTxzdGRpby5oPiwgPHN0ZGxpYi5oPiwgb3IgPHN0cmluZy5oPi4gIERvbid0IGluY2x1ZGUgPHdhaXQuaD4uCi0JSW5jbHVkZSA8c3lzL3R5cGVzLmg+LiAgVXNlIEhBVkVfU1lTX1dBSVRfSCB0byBjb250cm9sIHdoZXRoZXIgdG8KLQlpbmNsdWRlIDxzeXMvd2FpdC5oPiBvciBkZWZpbmUgdGhlIHdhaXQgbWFjcm9zIGJ5IGhhbmQuICBEb24ndAotCWRlY2xhcmUgeG1hbGxvYy4KLQkoZ2VuX2xpYl9maWxlKTogRG9uJ3QgYXNzdW1lIHRoYXQgc3ByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKLQljaGFyYWN0ZXJzOyB1c2Ugc3RybGVuIGluc3RlYWQuCi0KLUZyaSBTZXAgMjIgMTc6MTY6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCB1c2UgdGhlIG9sZCBCRkQgYmFzZWQKLQlkaXNhc3NlbWJsZXIgaW50ZXJmYWNlLiAgTWFrZSBpbmZvIGEgY29uc3QgcG9pbnRlci4KLQotV2VkIFNlcCAxMyAxODozMzo0NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoc3RhcnRfYWRkcmVzcyk6IE5ldyB2YXJpYWJsZS4KLQkoc3RvcF9hZGRyZXNzKTogTmV3IHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLS1zdGFydC1hZGRyZXNzIGFuZCAtLXN0b3AtYWRkcmVzcy4KLQkoT1BUSU9OX1NUQVJUX0FERFJFU1MsIE9QVElPTl9TVE9QX0FERFJFU1MpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAic3RhcnQtYWRkcmVzcyIgYW5kICJzdG9wLWFkZHJlc3MiLgotCShkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHN0YXJ0X2FkZHJlc3MgYW5kIHN0b3BfYWRkcmVzcy4KLQkoZHVtcF9kYXRhLCBkdW1wX3JlbG9jX3NldCk6IExpa2V3aXNlLgotCShtYWluKTogRG9uJ3Qgc2V0IHNlZW5mbGFnIGZvciAtbC4gIEhhbmRsZSBPUFRJT05fU1RBUlRfQUREUkVTUwotCWFuZCBPUFRJT05fU1RPUF9BRERSRVNTLgotCSogb2JqY29weS5jIChwYXJzZV92bWEpOiBNb3ZlIHRvIGJ1Y29tbS5jLgotCSogYnVjb21tLmMgKHBhcnNlX3ZtYSk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvYmpjb3B5LmMuCi0JKiBidWNvbW0uaCAocGFyc2Vfdm1hKTogRGVjbGFyZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgbmV3IG9iamR1bXAgb3B0aW9ucy4KLQotVHVlIFNlcCAxMiAxMjozNzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogRG9uJ3QgY2FsbCB3cml0ZV9hcmNoaXZlIGlmIG5vdGhpbmcKLQljaGFuZ2VkLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBBZGQgY2FzdHMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzLgotCi1UaHUgU2VwICA3IDEyOjEyOjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmluOiBSZW5hbWUgZnJvbSBjb25maWcuaC5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIHdpdGggY29uZmlnLmg6Y29uZmlnLmluLgotCUNoZWNrIGZvciBjb25maWcuaDpjb25maWcuaW4gd2hlbiBjcmVhdGluZyBzdGFtcC1oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBjb25maWcuaW4gcmF0aGVyIHRoYW4KLQljb25maWcuaC5pbi4gIFNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4gd2hlbgotCWNhbGxpbmcgY29uZmlnLnN0YXR1cy4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCwgc3RhbXAtaCwgYW5kCi0gICAgICAgIGNvbmZpZy5sb2cuCi0KLQkqIG5tLmMgKHZhbHVlX2Zvcm1hdCk6IEluaXRpYWxpemUgYmFzZWQgb24gQkZENjQgYW5kCi0JQkZEX0hPU1RfNjRCSVRfTE9ORy4KLQkocHJpbnRfcmFkaXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzZXRfcHJpbnRfcmFkaXgpOiBTZXQgcHJpbnRfcmFkaXguICBBZGp1c3QgY2hhbmdlcyB0bwotCXZhbHVlX2Zvcm1hdC4KLQkocHJpbnRfdmFsdWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCB0byBwcmludCA2NCBiaXQgb2N0YWwgYW5kCi0JZGVjaW1hbCB2YWx1ZXMgY29ycmVjdGx5LgotCShwcmludF9zeW1ib2xfaW5mb19ic2QpOiBDaGVjayBCRkQ2NCwgbm90IEJGRF9IT1NUXzY0X0JJVC4gIFVzZQotCXByaW50X3ZhbHVlLgotCShwcmludF9zeW1ib2xfaW5mb19zeXN2KTogVXNlIHByaW50X3ZhbHVlLgotCShwcmludF9zeW1ib2xfaW5mb19wb3NpeCk6IExpa2V3aXNlLgotCi1XZWQgU2VwICA2IDE1OjAyOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCoubyk6IFJlbW92ZSBpbmNvcnJlY3QgZGVwZW5kZW5jaWVzIG9uCi0JJChCRkRESVIpL2hvc3RzL3N0ZC1ob3N0LmguCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX0RBVEEpOiBBZGQgLW0gNjQ0LgotCShJTlNUQUxMX1hGT1JNMSk6IExpa2V3aXNlLgotCShDQ19GT1JfQlVJTEQpOiBTZXQgdG8gQENDX0ZPUl9CVUlMREAgcmF0aGVyIHRoYW4gJChDQykuCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfQ0NfRk9SX0JVSUxEIGFuZCBCRkRfQklOQVJZX0ZPUEVOLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwICA1IDIwOjIyOjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIHRvIHVzZSBhdXRvY29uZi4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2NvbmYuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLmluOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2hlYWRlci4KLQkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgZm9yIG5ldyBjb25maWd1cmUgc2NyaXB0LiAgQWxzbzoKLQkoUFJPR1MpOiBSZW1vdmUgJChTWVNJTkZPX1BST0cpLgotCShBTExfQ0ZMQUdTKTogUmVtb3ZlICQoVERFRklORVMpLgotCSh2ZXJzaW9uLm8pOiBVc2UgJChBTExfQ0ZMQUdTKS4KLQkoY3BsdXMtZGVtLm8sIGRsbHRvb2wubywgbmxtY29udi5vKTogTGlrZXdpc2UuCi0JKHN5c2R1bXAubyk6IERlcGVuZCB1cG9uIGJ1Y29tbS5oIGFuZCBjb25maWcuaC4KLQkoc3Jjb252Lm8sIGFyc3VwLm8sIHN0cmluZ3Mubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCShmaWxlbW9kZS5vKTogRG9uJ3QgZGVwZW5kIHVwb24gLi4vYmZkL3N5c2RlcC5oLgotCShidWNvbW0ubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLCBub3QgLi4vYmZkL3N5c2RlcC5oLgotCShzaXplLm8sIG9iamR1bXAubywgbm0ubywgYXIubywgb2JqY29weS5vKTogTGlrZXdpc2UuCi0JKG5sbWhlYWRlci5vLCBubG1jb252Lm8pOiBMaWtld2lzZS4KLQkoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIHN5c2RlcC5oLgotCSogYnVjb21tLmg6IEluY2x1ZGUgImFuc2lkZWNsLmgiLCA8c3RkaW8uaD4sIGFuZCAiY29uZmlnLmgiLgotICAJSW5jbHVkZSAiZm9wZW4tc2FtZS5oIiBvciAiZm9wZW4tYmluLmgiLCBiYXNlZCBvbgotIAlVU0VfQklOQVJZX0ZPUEVOLiAgSW5jbHVkZSA8ZXJybm8uaD4sIGFuZCBkZWNsYXJlIGVycm5vIGlmIGl0IGlzCi0gCW5vdCBhIG1hY3JvLiAgSW5jbHVkZSA8dW5pc3RkLmg+LCA8c3RyaW5nLmg+LCA8c3RyaW5ncy5oPiwKLSAJPHN0ZGxpYi5oPiwgYW5kIDxmY250bC5oPiBpZiB0aGV5IGFyZSBwcmVzZW50LiAgRGVjbGFyZSBzdHJjaHIsCi0gCXN0cnJjaHIsIGFuZCBzdHJzdHIgaWYgbm8gc3RyaW5nIGhlYWRlciBmaWxlIGV4aXN0cy4gIEluY2x1ZGUKLQk8c3lzL2ZpbGUuaD4gaWYgaXQgZXhpc3RzIGFuZCA8ZmNudGwuaD4gZG9lcyBub3QuICBEZWZpbmUKLQlPX1JET05MWSBhbmQgT19SRFdSIGlmIG5lY2Vzc2FyeS4KLQkqIGFyLmM6ICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBEbyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gYW5kCi0JPHN5cy9zdGF0Lmg+LiAgVXNlIEhBVkVfR09PRF9VVElNRV9IIHJhdGhlciB0aGFuIFBPU0lYX1VUSU1FLiAgVXNlCi0JSEFWRV9VVElNRVMgcmF0aGVyIHRoYW4gIVVTRV9VVElNRS4gIERvbid0IGluY2x1ZGUgPGVycm5vLmg+LCBhbmQKLQlkb24ndCBkZWNsYXJlIGVycm5vLgotCSogYXJzdXAuYzogRG9uJ3QgaW5jbHVkZSA8c3lzZGVwLmg+LgotCSogYnVjb21tLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIEluY2x1ZGUgPHN0ZGlvLmg+LAotCTxzeXMvdHlwZXMuaD4sIGFuZCA8c3lzL3N0YXQuaD4uICBJbmNsdWRlIDx0aW1lLmg+IGlmIGl0IGRlZmluZXMKLQl0aW1lX3QuICBEZWZpbmUgdGltZV90IGlmIG5lY2Vzc2FyeS4KLQkqIGNvZmZkdW1wLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KLQkqIGNvZmZncm9rLmMsIGZpbGVtb2RlLmMsIG5sbWNvbnYuYywgc2l6ZS5jOiBMaWtld2lzZS4KLQkqIHNyY29udi5jLCBzdHJpbmdzLmM6IExpa2V3aXNlLgotCSogbm0uYzogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgRG9uJ3QgdHJ5IHRvIGRlZmluZSBIQVZFX1NCUksuCi0JKiBvYmpjb3B5LmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIEluY2x1ZGUgPHN5cy90eXBlcy5oPiBhbmQKLQk8c3lzL3N0YXQuaD4uCi0JKHNpbXBsZV9jb3B5KTogVXNlIGNyZWF0IHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgT19DUkVBVCBpcwotCWRlZmluZWQuCi0JKiBvYmpkdW1wLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIFVzZQotCU5FRURfREVDTEFSQVRJT05fUFJJTlRGIHJhdGhlciB0aGFuICFGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQuCi0JKiBzeXNkdW1wLmM6IEluY2x1ZGUgImJmZC5oIiBhbmQgImJ1Y29tbS5oIi4gIERvbid0IGluY2x1ZGUKLQkic3lzZGVwLmgiIG9yIDxzdGRsaWIuaD4uCi0JKGR1bXBfc3ltYm9sX2luZm8pOiBSZW5hbWUgZnJvbSBzeW1ib2xfaW5mby4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotTW9uIFNlcCAgNCAxNDozMDowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogRG9uJ3Qgc2V0LiAgU3Vic3RpdHV0ZSBmb3IKLQlAQ0NALCBAQ0ZMQUdTQCwgQEhERUZJTkVTQCBhbmQgQExERkxBR1NAIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogU2V0IHRvIHJjIHJhdGhlciB0aGFuIHF2LgotCShDQyk6IERlZmluZSBhcyBAQ0NALgotCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCi0JKExERkxBR1MpOiBEZWZpbmUgYXMgQExERkxBR1NALgotCShBTExfQ0ZMQUdTKTogVXNlIEBIREVGSU5FU0AgcmF0aGVyIHRoYW4gJChIREVGSU5FUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYm90aGVyIHRvIGNhbGwgY29uZmlnLmJmZCBmb3IgZWFjaCB0YXJnZXQuCi0JSnVzdCBjYWxsIGl0IGZvciB0aGUgZGVmYXVsdCB0YXJnZXQsIGFuZCB1c2UgdGhlIHNoZWxsIHZhcmlhYmxlIHRvCi0JZGVjaWRlIHdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIHVzZWQuCi0KLVRodSBBdWcgMzEgMTk6MjE6NDggMTk5NSAgSmFzb24gTW9sZW5kYSAgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBtYXRjaCBpWzMtNl04Ni0qLXdpbjMyLCBub3QganVzdCBpMzg2LSotd2luMzIuCi0KLVRodSBBdWcgMzEgMTY6MzA6MjIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChhZGRfaW5kaXJlY3QpOiBOZXcuCi0JKGFzbV9wcmVmaXgpOiBOZXcKLQkoZ2VuX2V4cF9maWxlKTogVGltZXN0YW1wIHNob3VsZCBiZSAwLiBJbnNlcnQgcHJlZml4IHdoZW4KLQluZWVkZWQuIE5ldyBjb2RlIGZvciBpbmRpcmVjdGlvbi4KLQkoZ2VuX2xpYl9maWxlKTogVGltZXN0YW1wIHNob3VsZCBiZSAwLiBJbnNlcnQgcHJlZml4Ci0Jd2hlbiBuZWVkZWQuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1hZGQtaW5kaXJlY3QuCi0JKG1haW4pOiBDb3BlIHdpdGggbmV3IG9wdGlvbi4KLQotCSogb2JqZHVtcC5jIChkdW1wX3ByaXZhdGVfaGVhZGVycyk6IE5ldy4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9uLgotCShsb25nX29wdGlvbik6IEFkZCBwcml2YXRlLWhlYWRlcnMuCi0JKGR1bXBfYmZkX3ByaXZhdGVfaGVhZGVyKTogTmV3LgotCShtYWluKTogQ29wZSB3aXRoIG5ldyBvcHRpb24uCi0KLVRodSBBdWcgMzEgMDQ6MDk6MTYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChydW4pOiBBZGQgbWlzc2luZyAzcmQgYXJnIHRvIHdhaXRwaWQuCi0KLVdlZCBBdWcgMzAgMTE6MDI6MTEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRPT0xfUFJPR1MpOiBJbmNsdWRlIGRsbHRvb2wgaWYgbmVlZGVkLgotCi1UdWUgQXVnIDI5IDEzOjI1OjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAocnZhKTogRGVsZXRlZC4KLQkocnZhYWZ0ZXIsIHJ2YV9iZWZvcmUpOiBVc2UgbmV3IGFzc2VtYmxlciBwc2V1ZG8uCi0JKGZsdXNoX3BhZ2UsIGdlbl9leHBfZmlsZSwgZ2VuX2xpYl9maWxlKTogVXNlIG5ldyB3YXkgb2YgUlZBaW5nLgotCShnZW5fZXhwX2ZpbGUpOiBEb24ndCBnZW5lcmF0ZSAuZWRhdGEgaWYgbm8gbmVlZC4KLQkoZ2VuX2xpYl9maWxlKTogRG9uJ3QgbWFrZSB0aW1lc3RhbXAuCi0JUHV0IF9pbmFtZSBpbiBpZGF0YSQ3LgotCSh3b3Jrb3V0X3ByZWZpeCk6IEZpeCBtZW1vcnkgaW5pdGlhbGl6YXRpb24gYnVnLgotCSh1c2FnZSk6IFRpZHkgdXAsIGRlbGV0ZSBtYW55IHNpbmdsZSBjaGFyIG9wdGlvbnMuCi0JKG1haW4pOiBydmEgb3B0aW9uIGlzIGdvbmUuCi0KLU1vbiBBdWcgMjEgMTg6NDE6MjggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChvcHRpb25zKTogaW1hZ2UtYmFzZSBpcyBhIHN5bm9ueW0gZm9yIHJ2YS4KLQkoZ2VuX2xpYl9maWxlKTogUHV0IGRsbCBuYW1lIGludG8gaWJhc2UkNy4KLQotU3VuIEF1ZyAyMCAwOTo1OTowMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JTW9kaWZpZWQgdG8gZ2VuZXJhdGUgYXJjaGl2ZXMgYW5kIG9iamVjdHMgcmF0aGVyIHRoYW4gLnMgZmlsZXMuCi0JKiBkbGx0b29sLmMgKHJ1bikgTmV3IGZ1bmN0aW9uLgotIAkoZ2VuX2V4cF9maWxlLCBnZW5fbGliX2ZpbGUpOiBVc2UgcnVuLgotCSh3b3Jrb3V0X3ByZWZpeCk6IE5ldy4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQkobWFpbik6IFBhcnNlIG5ldyBvcHRpb25zLgotCi1XZWQgQXVnIDE2IDE2OjI2OjUyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogRml4IFJWQSBoYW5kbGluZy4KLQkocnZhX3MsIHJ2YV9uKTogRGVsZXRlLgotCi1GcmkgQXVnIDExIDE4OjI3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAobWFpbik6IElnbm9yZSAtZS4KLQotVGh1IEF1ZyAxMCAxNzozNTowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy50ZXhpKTogTmV3IHRhcmdldC4gIFdyaXRlIG91dCBhIHNldHRpbmcgZm9yCi0JdGV4aW5mbyB2YXJpYWJsZSBWRVJTSU9OLgotCShiaW51dGlscy5kdmksIGJpbnV0aWxzLmluZm8pOiBEZXBlbmQgb24gaXQuCi0JKiBiaW51dGlscy50ZXhpOiBJbmNsdWRlIGl0LCBhbmQgcmVmZXJlbmNlIEB2YWx1ZXtWRVJTSU9OfSBpbnN0ZWFkCi0Jb2YgZXhwbGljaXRseSBzcGVjaWZ5aW5nIDIuMighKS4KLQotVGh1IEF1ZyAxMCAxNjowNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZncm9rLmMgKGRvX3R5cGUpOiBIYW5kbGUgYXJyYXkgZGltZW5zaW9ucyB0aGUgc2FtZSB3YXkgZ2RiCi0JZG9lcy4KLQotVHVlIEF1ZyAgOCAxNzoxMDo0MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG10YWJsZSk6IE5ldyBmaWVsZHMuCi0JKEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSKTogTmV3LgotCShmbHVzaF9wYWdlKTogVXNlIG5ldyBtYWNyb3MuCi0KLVNhdCBBdWcgIDUgMDA6MTY6MzcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBIYW5kbGUgc2VjdGlvbnMKLQl3aXRoIG5vIHJlbG9jYXRpb25zLgotCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDEpOiBMaWtld2lzZS4KLQotTW9uIEp1bCAzMSAxMjo1MTowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcKLQlzdHJpbmdzIHByb2dyYW1zLCBwcmludCBzdHJpbmdzIHdoaWNoIGFyZSBub3QgdGVybWluYXRlZCB3aXRoIGEKLQludWxsIGJ5dGUgb3IgYSBuZXdsaW5lLgotCSogYmludXRpbHMudGV4aSwgc3RyaW5ncy4xOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhY2NvcmRpbmdseS4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhcgotCXByb2dyYW1zLCBwZXJtaXQgdXNlcnMgdG8gYWRkIHRoZSBzYW1lIGZpbGUgbXVsdGlwbGUgdGltZXMuCi0KLVR1ZSBKdWwgMjUgMTE6MjE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKERBVEFfRkxBR1MpOiBSZW1vdmUgU0VDX0RBVEEuCi0JKG1haW4pOiBJZiBubyBmaWxlIG5hbWVzIGFyZSBnaXZlbiwgc2NhbiBzdGFuZGFyZCBpbnB1dC4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmluZ3MuMTogc3RyaW5ncyBub3cgc2NhbnMgbm9uLWRhdGEgc2VjdGlvbnMgYnkKLQlkZWZhdWx0LgotCi1Nb24gSnVsIDI0IDEzOjUyOjI4IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHdyX2hkKTogU2V0IGFmbCBmaWVsZCB0byA0IGZvciBiZmRfYXJjaF9zaC4KLQkod3JpdGVJTlQpOiBXaGVuIHNpemUgPT0gLTIsIHVzZSAyIGJ5dGVzIGZvciB0aGUgaDgzMDAgYW5kIDQgYnl0ZXMKLQlmb3IgdGhlCXNoLgotCi0JKiBzeXNkdW1wLmMgKGZpbGx1cCk6IFJldHVybiBzaXplIC0gMSwgdGhlIGxhc3QgYnl0ZSBpcyBhIGNoZWNrc3VtCi0JYW5kIHNob3VsZG4ndCBiZSBjb3VudGVkLgotCSogc3lzcm9mZi5pbmZvIChoZCk6IENoYW5nZWQgc2VnbWVudCBpZGVudGlmaWVyIGZyb20gYSBieXRlIHRvIGEgMQotCWJpdCBmaWVsZC4gIFRoZSBzeXNyb2ZmIDIuMC0wMSBzcGVjaWZpY2F0aW9uIHNlZW1zIHRvIGJlIGluIGVycm9yCi0JaGVyZS4gIFJlZHVjZSB3aWR0aCBvZiBmb2xsb3dpbmcgInNwYXJlIiBmaWVsZCBmcm9tIDQgdG8gMyBiaXRzLgotCShybCk6IENoYW5nZWQgb3JkZXIgYW5kIHdpZHRoIG9mIGZpcnN0IDQgYml0ZmllbGRzIHRvIGNvcnJlc3BvbmQKLQl0byBzeXNyb2ZmIHNwZWNpZmljYXRpb24uCi0JKGRsbl9oZWFkLCBkbG5faW5zaWRlLCBkbG5fdGFpbCk6IFJlbW92ZWQuCi0KLVR1ZSBKdWwgMTggMjM6MDA6MDMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogIEVuY2xvc2UgZXhwcmVzc2lvbiBiZWluZyBjYXN0ZWQKLQlpbiBwYXJlbnMgc28gcmVzdWx0IGlzIGNhc3RlZCwgbm90IGp1c3QgZmlyc3Qgb3BlcmFuZC4gIENhbid0Ci0JZG8gcG9pbnRlciBhcml0aG1ldGljIG9uIHZvaWQqIHBvaW50ZXJzLgotCi1GcmkgSnVsIDE0IDEzOjQyOjQyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jIChkaCk6IENoYW5nZWQgZm9ybWF0IG9mIG91dHB1dCB0byBiZSAxNiBoZXggZGlnaXRzCi0JZm9sbG93ZWQgYnkgMTYgYXNjaWkgY2hhcmFjdGVycywgc2ltaWxhciB0byBFbWFjcycgaGV4bC1tb2RlLAotCXRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlYWQuCi0JKHhjYWxsb2MpOiBmaXggdHlwby4KLQotVGh1IEp1bCAxMyAxNToyNzo0NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl90cik6IFdyaXRlIG91dCBoYW5kY3JhZnRlZCB0ciBibG9jay4KLQkod2Fsa190cmVlX3N5bWJvbCk6IFVzZSBldmFsbGVuIGFuZCBldmFsdWUgaW5zdGVhZCBvZgotCXZhbGxlbiAmIHZhbHVlIGJlY2F1c2Ugb2YgY29ycmVzcG9uZGluZyBjaGFuZ2VzIGluCi0Jc3lzcm9mZi5pbmZvLgotCi0JKiBzeXNkdW1wLmMgKHN5c3JvZmZfc3dhcF90cl9pbiwgc3lzcm9mZl9wcmludF90cl9vdXQpOiBOZXcKLQlmdW5jdGlvbnMuCi0KLQkqIHN5c3JvZmYuaW5mbyAodHIpOiB0aGUgdHIgYmxvY2sgaXMgYSBzcGVjaWFsIGNhc2UgLS0tIGEgYmxvY2sKLQl3aXRob3V0IGNvbnRlbnRzIC0tLSB3aGljaCBjYW4ndCBiZSBoYW5kbGVkIGJ5IGdlbmVyYXRlZCBjb2RlLgotCShkZW4sIGRwcCk6IG9ubHkgZmlyc3QgYnl0ZSBpcyBwcmVzZW50IGZvciBERU5lbmQsIERQUGVuZC4KLQkoZHN5KTogZGVzY3JpYmUgYSBjb25kaXRpb25hbCBwb3J0aW9uIG9mIGJsb2NrLCByZW5hbWUgc29tZSBmaWVsZHMuCi0JKGRwcyk6IGRlc2NyaWJlIGEgY29uZGl0aW9uYWwgcG9ydGlvbiBvZiBibG9jay4KLQkoZGZsKTogcmVtb3ZlZC4KLQotCSogc3lzaW5mby55ICh5eWVycm9yKTogd3JpdGUgZXJyb3IgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KLQotVGh1IEp1bCAxMyAxMDo0Mzo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgYXJwYXJzZS5oIGFuZCBzeXNpbmZvLmguCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIHkub3V0cHV0LgotCShjbGVhbik6IFJlbW92ZSBzeXNyb2ZmLCBzeXNyb2ZmLmMsIHN5c3JvZmYuaCwgYW5kIHN5c2luZm8uCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogQ2FzdCBtZW1zZXQgYXJnIHRvIHNpemVfdC4KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBMaWtld2lzZS4KLQotCSogbm0uYyAoSEFWRV9TQlJLKTogRGVmaW5lIGV4ZWNwdCBvbiBhbWlnYWRvcyBhbmQgV0lORE9XU19OVC4KLQkoc3RydWN0IHNpemVfc3ltKTogRGVmaW5lLgotCShzaG93X3N0YXRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkIHVuZG9jdW1lbnRlZCBvcHRpb24gInN0YXRzIi4KLQkobWFpbik6IFByaW50IG1lbW9yeSBzdGF0cyBpZiByZXF1ZXN0ZWQuCi0JKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIHNvcnRfeCwgc29ydF95KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG51bWVyaWNfZm9yd2FyZCk6IFVzZSBtaW5pc3ltYm9scyByYXRoZXIgdGhhbiBhc3ltYm9scy4KLQkobm9uX251bWVyaWNfZm9yd2FyZCk6IExpa2V3aXNlLgotCShzaXplX2ZvcndhcmQxKTogUmVuYW1lIGZyb20gc2l6ZV9mb3J3YXJkLiAgVXNlIG1pbmlzeW1ib2xzLgotCShzaXplX2ZvcndhcmQyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc29ydF9zeW1ib2xzX2J5X3NpemUpOiBUYWtlIG5ldyBhcmd1bWVudHMgZHluYW1pYywgc2l6ZSwgYW5kCi0Jc3ltc2l6ZXAuICBVc2UgbWluaXN5bWJvbHMuICBEb24ndCBzdG9yZSB0aGUgc2l6ZSBiYWNrIGluIHRoZQotCXN5bWJvbDsgc3RvcmUgaW4gYSBuZXdseSBhbGxvY2F0ZSBzdHJ1Y3Qgc2l6ZV9zeW0gYXJyYXkuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBSZWFkIG1pbmlzeW1ib2xzIHJhdGhlciB0aGFuIGFzeW1ib2xzLiAgU2V0Ci0Jc29ydF8qIHZhcmlhYmxlcy4gIENhbGwgcHJpbnRfc2l6ZV9zeW1ib2xzIGlmIHNvcnRpbmcgYnkgc2l6ZS4KLQkoZmlsdGVyX3N5bWJvbHMpOiBUYWtlIG5ldyBhcmd1bWVudHMgZHluYW1pYyBhbmQgc2l6ZS4gIFVzZQotCW1pbmlzeW1ib2xzLgotCShwcmludF9zeW1ib2xzKTogTGlrZXdpc2UuICBDYWxsIHByaW50X3N5bWJvbCBmb3IgYWN0dWFsIHByaW50aW5nLgotCShwcmludF9zaXplX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1XZWQgSnVsIDEyIDEwOjQzOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiBPbmx5IHByaW50IGVhY2ggc3RhYnMgc2VjdGlvbgotCW9uY2UuCi0JKGNvbXBhcmVfcmVsb2NzKTogTWFrZSBpdCBjbGVhciB0byBnY2MgdGhhdCB0aGlzIGFsd2F5cyByZXR1cm5zIGEKLQl2YWx1ZS4KLQotV2VkIEp1bCAxMiAxMDo0MDoyMyAxOTk1ICBILkouIEx1ICA8aGpsQG55bmV4c3QuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNpbXBsZV9jb3B5KTogUHJlc2VydmUgZXJybm8gb24gZmFpbHVyZS4KLQkoc21hcnRfcmVuYW1lKTogUHJpbnQgZXJyb3IgbWVzYWdlIGlmIHNpbXBsZV9jb3B5IGZhaWxzLgotCi1UdWUgSnVsIDExIDEzOjEwOjUyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jOiByZS1pbmRlbnRlZCBmaWxlLgotCShtb2R1bGUpOiByZWFkIGJsb2NrcyBzZXF1ZW50aWFsbHkgaW5zdGVhZCBvZiB0cnlpbmcgdG8gcGFyc2UKLQl0aGVtLCBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgY2hhbmdpbmcgdGhlIHBhcnNlciByZWNvZ25pemUgdGhlCi0JZGlmZmVyZW5jZSBiZXR3ZWVuIGEgRFBTc3RhcnQgYW5kIERQU2VuZCBibG9jay4KLQkoZ2V0b25lKTogQWRkIGJyZWFrJ3MgYmV0d2VlbiBzd2l0Y2ggYmxvY2tzIGFzIGFwcHJvcHJpYXRlLgotCShvYmplY3RfYm9keV9saXN0KTogcGFyc2UgYmxvY2tzIGFjY29yZGluZyB0byBzeXNyb2ZmIHNwZWMuCi0KLU1vbiBKdWwgMTAgMTI6Mzc6MjUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHBvc2VpZG9uLmN5Z251cy5jb20+Ci0KLQkqIHN5c3JvZmYuaW5mbzogcmUtaW5kZW50ZWQgZmlsZSwgcHJpb3IgZm9ybWF0dGluZyB3YXMgY29uZnVzaW5nCi0JYmVjYXVzZSBpdCB3YXMgaW5kZW50YXRpb24gZGlkIG5vdCByZWZsZWN0IG5lc3Rpbmcgb2YgY29uZGl0aW9uYWwKLQlyZWNvcmRzLiAgQ2hhbmdlICJzcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IiByZWNvcmQgaW4gaGQgcmVjb3JkCi0JZnJvbSBiaXQgdG8gYnl0ZS4KLQotCSogc3lzaW5mby55IChjb25kX2l0X2ZpZWxkKTogVXNlIHhjYWxsb2MgaW5zdGVhZCBvZiBjYWxsb2MuCi0KLQkqIHNyY29udi5jICh3cl9jcyk6IFJlZm9ybWF0dGVkIGNzIGhlYWRlciBhcnJheSwgdGFnIGVhY2ggYnl0ZQotCXdpdGggYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGZpZWxkLgotCSh3cl91bml0X2luZm8pOiBVc2UgU0VFS19TRVQgbWFjcm8gaW5zdGVhZCBvZiBjb25zdGFudCAwLgotCShtYWluKTogVXNlIEZPUEVOX1dCIG1hY3JvIGluc3RlYWQgb2YgbGl0ZXJhbCAid2IiLgotCSogc3lzcm9mZi5pbmZvOiBSZW1vdmUgZmRsIChkZmwpIGZpZWxkIGZyb20gY3MgYmxvY2suICBDb21wYXJlCi0JcHRyLT50eXBlIHdpdGggRURfVFlQRV9DT05TVCBpbnN0ZWFkIG9mIGNvbnN0YW50IDIgaW4gZWQgYmxvY2suCi0KLVR1ZSBKdWwgIDQgMTQ6NDg6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChzaXplX2ZvcndhcmQpOiBDaGVjayB5ZiBhZ2FpbnN0IHluLCBub3QgeG4uCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogUmVjb3JkIGFsbCBvdXRwdXQgQkZEJ3MsIGFuZCBjbG9zZQotCXRoZW0gYmVmb3JlIHVubGlua2luZyB0aGVtIGFuZCByZW1vdmluZyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQl0byBhdm9pZCBORlMgcHJvYmxlbXMuCi0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IEluIHZlcmJvc2UgbWVzc2FnZXMsIHVzZSAncicgd2hlbgotICAgICAgICByZXBsYWNpbmcgYSBtZW1iZXIsIGFuZCAnYScgd2hlbiBhZGRpbmcgb25lLgotCi0JKiBhci5jIChhcl90cnVuY2F0ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG5vcm1hbGl6ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBjb25zdCBjaGFyICouICBBZGQgYWJmZAotCWFyZ3VtZW50LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYgYXJfdHJ1bmNhdGUsIGNob3AgdGhlIGZpbGVuYW1lCi0JdG8gYWJmZC0+YXJfbWF4X25hbWVsZW4uCi0JKG1haW4pOiBGb3IgdGhlICdmJyBtb2RpZmllciwgc2V0IGFyX3RydW5jYXRlIHRvIHRydWUuICBEb24ndAotCWNoYW5nZSBxdWlja19hcHBlbmQgdG8gcmVwbGFjZSBpZiBhcl90cnVuY2F0ZSBpcyB0cnVlLgotCShkb19xdWlja19hcHBlbmQpOiBJZiBhcl90cnVuY2F0ZSwgc2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQuCi0JKHdyaXRlX2FyY2hpdmUpOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIGFyLjE6IERvY3VtZW50ICdmJyBtb2RpZmllci4KLQotCSogb2JqY29weS5jIChlbnVtIHN0cmlwX2FjdGlvbik6IERlZmluZSBzdHJpcF91bm5lZWRlZC4KLQkoT1BUSU9OX1NUUklQX1VOTkVFREVEKTogRGVmaW5lLgotCShzdHJpcF9vcHRpb25zKTogQWRkICJzdHJpcC11bm5lZWRlZCIuCi0JKGNvcHlfb3B0aW9ucyk6IExpa2V3aXNlLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXN0cmlwLXVubmVlZGVkLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCShpc19zdHJpcF9zZWN0aW9uKTogU3RyaXAgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHN0cmlwX3VubmVlZGVkLgotCShmaWx0ZXJfc3ltYm9scyk6IElmIHN0cmlwX3VubmVlZGVkLCBvbmx5IGtlZXAgQlNGX0tFRVAgc3ltYm9scy4KLQkoY29weV9vYmplY3QpOiBJZiBzdHJpcF9hbGwsIGRpc2NhcmQgc3ltYm9scyB3aXRob3V0IGNoZWNraW5nCi0JZGlzY2FyZF9sb2NhbHMuCi0JKGNvcHlfb2JqZWN0KTogQ2FsbCBmaWx0ZXJfc3ltYm9scyBpZiBzdHJpcF91bm5lZWRlZC4KLQkoc2V0dXBfc2VjdGlvbik6IFN0cmlwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBzdHJpcF91bm5lZWRlZC4KLQkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4pOiBIYW5kbGUgT1BUSU9OX1NUUklQX1VOTkVFREVELgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgLS1zdHJpcC11bm5lZWRlZC4KLQotTW9uIEp1bCAgMyAxNDoxNjo0NyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi13aW4zMik6IE5ldyBjb25maWd1cmF0aW9uLgotCSogZGxsdG9vbC5jIChraWxsYXQsIHhsYXRlLCB1c2FnZSwgbG9uZ19vcHRpb25zLCBtYWluKToKLQlVbmRlcnN0YW5kIGFuZCBjb3BlIHdpdGggLWsgb3B0aW9uLgotCi1TYXQgSnVsICAxIDEyOjI1OjE1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBhci5jOiAoZXh0cmFjdF9maWxlKTogIENoYW5nZSAiI2lmIFBPU0lYX1VUSU1FIiB0bwotCSIjaWZkZWYgUE9TSVhfVVRJTUUiIHRvIG1hdGNoIG90aGVyIHRlc3RzIG9mIFBPU0lYX1VUSU1FCi0JYW5kIGF2b2lkIGxvc3NhZ2Ugd2hlbiBQT1NJWF9VVElNRSBpcyBub3QgZGVmaW5lZCBhdCBhbGwuCi0KLVdlZCBKdW4gMjggMTc6NTE6MjQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYXIuYzogKHByaW50X2NvbnRlbnRzLmMsIGV4dHJhY3RfZmlsZSwgZG9fcXVpY2tfYXBwZW5kKToKLQlNYWxsb2MgYnVmZmVycyByYXRoZXIgdGhhbiBhbGxvY2F0ZSBvbiBzdGFjayAoc28gaXQgd29ya3MKLQlvbiBOVCkuCi0JKiBkZWZsZXgubDogTmFtZXMgY2FuIGhhdmUgYW4gQCBpbiB0aGVtLgotCSogZGxsdG9vbC5jOiBMb2FkcyBvZiBzdHVmZi4gQ2FuIG5vdyBnZW5lcmF0ZSAuaW1wIGZpbGVzIHdoaWNoCi0Jd29yayB3aXRoIE5UIC5kbGxzLgotCi1UaHUgSnVuIDIyIDE5OjEwOjUwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2UuaW4gKGRlbWFuZ2xlLmMubyk6IFJlbW92ZS4KLQkoYXJwYXJzZS5oKTogRGVwZW5kIG9uIGFycGFyc2UuYyBpbnN0ZWFkIG9mIGFycGFyc2UueS4KLQotV2VkIEp1biAyMSAxNzozMjo0NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogRG9uJ3QgaW5jbHVkZSBpbmZvIGhlcmUuCi0JKGRpc3RzdHVmZik6IEluY2x1ZGUgaXQgaGVyZS4KLQkocmVhbGNsZWFuKTogUmVtb3ZlICouaW5mby4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3JlbG9jcyk6IElmIHJlbG9jYXRpb24gZW50cmllcyBoYXZlIHRoZSBzYW1lCi0JYWRkcmVzcywga2VlcCB0aGVtIGluIGZpbGUgb3JkZXIuCi0KLU1vbiBKdW4gMTkgMDk6MDY6NDkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiBDaGFuZ2UgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiAuKi5zLT4gLSoucwotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6ICBDaGVjayBmb3IgbmFtZXMKLQl3aGljaCBhcmUgc3VwZXJzZXRzIG9mIHNlbGVjdGVkIG5hbWVzLgotCi1XZWQgSnVuIDE0IDE5OjQzOjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobXRhYmxlLCBBUk0ganVtcCk6IE11c3QgcmVkaXJlY3QgdmlhIHBjIG9mZnNldGFibGUgcHRyLgotCi1XZWQgSnVuIDE0IDEzOjI3OjIyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRlZmxleC5sLCBkZWZwYXJzZS55LCBkbGx0b29sLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFN1cHBvcnQgZm9yIHRoZW0uCi0KLU1vbiBKdW4gMTIgMTE6Mjc6NTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jOiBJbmNsdWRlIHN5c2RlcC5oCi0JKG1haW4pOiBPcGVuIGlucHV0IHdpdGggRk9QRU5fUkIuCi0KLUZyaSBKdW4gIDkgMTc6MjY6MTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHdpZGVfb3V0cHV0KTogTmV3IGZsYWcgdmFyaWFibGUuCi0JKHVzYWdlKTogUHJpbnQgbmV3IC13LCAtLXdpZGUgb3B0aW9ucy4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0td2lkZSBzdXBwb3J0LgotCShkdW1wX3NlY3Rpb25faGVhZGVyKTogSWYgLS13aWRlLCBkb24ndCBwcmludCBhIG5ld2xpbmUgYmV0d2VlbgotCXRoZSBzZWN0aW9uJ3MgZmlyc3QgbGluZSBhbmQgdGhlIGZsYWdzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBVc2UgdW5zaWduZWQgY29tcGFyaXNvbnMgZm9yIHRoZSBiaW5hcnkKLQlzZWFyY2gsIG5vdCBzaWduZWQuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBJZiAtLXdpZGUsIGRvbid0IHB1dCBhIFxuIGJldHdlZW4gdGhlCi0JZGlzYXNzZW1ibHkgb3V0cHV0IGFuZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCShtYWluKTogU3VwcG9ydCAtdyBvcHRpb24gYmVpbmcgdGhlIHNhbWUgYXMgLS13aWRlLgotCi1UaHUgSnVuICAxIDE3OjA5OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTYXQgTWF5ICA2IDA4OjUyOjI0IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogb2JqY29weS5jIChzbWFydF9yZW5hbWUpOiBtYWtlIGl0IHNtYXJ0ZXIsIGNsZWFuIHVwCi0JICBpZiByZW5hbWUgKCkgZmFpbHMuCi0KLVR1ZSBNYXkgMzAgMTQ6MjQ6MTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IERlbGV0ZSBsaW5lcyB3aXRoIGxvdHMgb2YgIyMjIyBiZWNhdXNlIGZvdXIgb3IgbW9yZQotCWluZGljYXRlIGEgcG9pbnQgZm9yIG1ha2VmaWxlIGZyYWdtZW50IHN1YnN0aXR1dGlvbi4KLQotVHVlIE1heSAgOSAxNzoxNzowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmxtY29udiBvbiBQb3dlclBDIGVhYmkgYW55IG1vcmUsIGl0Ci0JaXMgbm90IG5lZWRlZC4KLQotVGh1IEFwciAyNyAyMDoyMToyNCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNUKTogRGVmaW5lLgotCShSVU5URVNUKTogVXNlIG9uZSBpbiBzb3VyY2UgdHJlZSBpZiBwcmVzZW50LgotCShjaGVjayk6IFNldCBgcm9vdG1lJyBmb3IgJChFWFBFQ1QpLgotCi1XZWQgQXByIDI2IDE4OjI2OjIxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jIChtYWluKTogQWRkIHN1cHBvcnQgZm9yIC1uIG9wdGlvbiB3aGljaCBkaXNhYmxlcwotCXByZXNjYW4gb2YgY29tbW9uIHN5bWJvbHMuCi0JKHdyX29iKTogSWYgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLCBmaWxsIHdpdGggemVyb3MuCi0KLVR1ZSBBcHIgMjUgMTk6MTQ6MzcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogRGlzcGxheSBsb2FkIGFkZHJlc3MgYWZ0ZXIKLQl2aXJ0dWFsIG1lbW9yeSAocnVuLXRpbWUpIGFkZHJlc3MuCi0KLVdlZCBBcHIgMTkgMDk6NDQ6MDYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjcGx1cy1kZW0ubyk6IFBhc3MgLURWRVJTSU9OPSciJChWRVJTSU9OKSInIHRvIHRoZQotICAgICAgICBjb21waWxlLgotCShERU1BTkdMRVJfUFJPRyk6IE5vIGxvbmdlciB1c2VzIHZlcnNpb24uby4KLQotTW9uIEFwciAxMCAxMzoyOTo0OSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KLQkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCi0JKiBtcHctY29uZmlnLmluIChUREVGSU5FUyk6IERlZmluZSBhcyBlbXB0eSBpbiBtYWtlZmlsZSBmcmFnLgotCi0JKiBtcHctY29uZmlnLmluOiBDcmVhdGUgbWsudG1wLCBkZWZpbmUgQVJDSERFRlMgaW4gaXQuCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgY29uZmlndXJlIGZyYWdtZW50IGZvciBiaW51dGlscy4KLQkqIG1wdy1tYWtlLmluIChpbnN0YWxsLW9ubHkpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogQWxzbyBkZXBlbmQgb24gaW5zdGFsbC1vbmx5LgotCi0JKiBtcHctbWFrZS5pbiAoY3BsdXNmaWx0KTogUmVuYW1lZCBmcm9tIGMrK2ZpbHQuCi0JKElOQ0xVREVTKTogQWRkIG1vcmUgcGF0aHMuCi0KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIG1ha2VmaWxlIGZyYWdtZW50IGZvciBiaW51dGlscy4KLQkoTm9ybWFsbHkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbi4pCi0KLU1vbiBNYXIgMjcgMTE6NTI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQ2FsbCBtYWtlX3RlbXBuYW1lIHRvIGdldCBvdXRwdXQgZmlsZQotCW5hbWUsIHJhdGhlciB0aGFuIHVzaW5nIGEgZml4ZWQgbmFtZSBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZS4KLQotCSogb2JqY29weS5jIChtYWtlX3RlbXBuYW1lKTogQ29weSBmcm9tIGhlcmUuLi4KLQkqIGJ1Y29tbS5jIChtYWtlX3RlbXBuYW1lKTogLi4udG8gaGVyZSwgYW5kIG1ha2UgZ2xvYmFsLgotCSogYnVjb21tLmggKG1ha2VfdGVtcG5hbWUpOiBEZWNsYXJlLgotCi1GcmkgTWFyIDI0IDExOjQ3OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jOiBJbmNsdWRlICJiZmQuaCIgYmVmb3JlIG90aGVyIGhlYWRlcnMuICBJbmNsdWRlCi0JInN5c2RlcC5oIi4KLQkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENhc3Qgc3RfdWlkIGFuZCBzdF9naWQgdG8gbG9uZywKLQlhbmQgcHJpbnQgdGhlbSB3aXRoICVsZC4KLQotRnJpIE1hciAxMCAxMzowOTo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfb3B0aW9ucyk6IEFkZCAtLWtlZXAtc3ltYm9sLgotCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1rZWVwLXN5bWJvbCBhbmQgLUsuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKGtlZXBfc3ltYm9scyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGlzX3N0cmlwX3N5bWJvbCk6IEFkanVzdCB0aGUgcmV0dXJuIHZhbHVlIGFjY29yZGluZyB0bwotCWtlZXBfc3ltYm9scy4KLQkoc3RyaXBfbWFpbik6IEhhbmRsZSAtSy4gIEZvciAtTiwgY2hlY2sgdGhhdCAtSyB3YXMgbm90IGdpdmVuLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgLUsuCi0KLU1vbiBNYXIgIDYgMTM6MzM6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IENoZWNrIHJlc3VsdCBvZiBta2Rpci4KLQkoY29weV9tYWluKTogQ2FzdCBhbiB4bWFsbG9jIHJlc3VsdC4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IEJyZWFrIGxvbmcgZm9ybWF0IHN0cmluZyBpbnRvIHNob3J0ZXIgb25lcy4KLQotTW9uIE1hciAgNiAxMzo0NjoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5jIChsaXN0X3N1cHBvcnRlZF90YXJnZXRzKTogTmV3IGZ1bmN0aW9uLgotCSogYnVjb21tLmggKGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMpOiBEZWNsYXJlLgotCSogYXIuYyAodXNhZ2UpOiBDYWxsIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMuCi0JKiBubS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChjb3B5X3VzYWdlLCBzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc2l6ZS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jICh1c2FnZSk6IExpa2V3aXNlLgotCi1UdWUgRmViIDI4IDE1OjEzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogQ2FzdCBzdF9zaXplIHRvIGxvbmcgYmVmb3JlCi0JcGFzc2luZyBpdCB0byBmcHJpbnRmLgotCi1GcmkgRmViIDE3IDEzOjM2OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGZpZWxkcyByZW1vdmUsIHNldF9mbGFncywKLQlhbmQgZmxhZ3MuICBDaGFuZ2UgYWRqdXN0IGZyb20gYm9vbGVhbiB0byBlbnVtLgotCShyZW1vdmVfc2VjdGlvbnMpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShzZWN0aW9uc19yZW1vdmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29weV9vcHRpb25zKTogQWRkIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKHBhcnNlX2ZsYWdzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZmluZF9zZWN0aW9uX2xpc3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpc19zdHJpcF9zeW1ib2wpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgZnJvbSBpbnQgdG8gYm9vbGVhbi4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbHRlcl9zeW1ib2xzKTogQ2FsbCBpc19zdHJpcF9zZWN0aW9uLgotCShjb3B5X29iamVjdCk6IFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBjaGVjayBmb3Igc3BlY2lmaWVkIGZsYWdzIG9yCi0JVk1BLiAgQ2FsbCBmaWx0ZXJfc3ltYm9scyBpZiBhbnkgc2VjdGlvbnMgYXJlIGJlaW5nIHJlbW92ZWQuCi0JKHNldHVwX3NlY3Rpb24pOiBVc2UgZmluZF9zZWN0aW9uX2xpc3QgZnVuY3Rpb24gcmF0aGVyIHRoYW4KLQlsb29raW5nIHRocm91Z2ggcmVtb3ZlX3NlY3Rpb25zIGFuZCBhZGp1c3Rfc2VjdGlvbnMuICBIYW5kbGUKLQktLXNldC1zZWN0aW9uLWZsYWdzLgotCShjb3B5X3NlY3Rpb24pOiBVc2UgZmluZF9zZWN0aW9uX2xpc3QgcmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoCi0JcmVtb3ZlX3NlY3Rpb25zLgotCShzdHJpcF9tYWluKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGluc3RlYWQgb2YgYWRkaW5nIGl0ZW1zIHRvCi0Jc2VjdGlvbnNfcmVtb3ZlZC4KLQkoY29weV9tYWluKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGluc3RlYWQgb2YgYWRkaW5nIGl0ZW1zIHRvCi0Jc2VjdGlvbnNfcmVtb3ZlZCBhbmQgYWRqdXN0X3NlY3Rpb25zLiAgSGFuZGxlIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0KLVR1ZSBGZWIgMTQgMTg6MDM6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHdpdGhfc291cmNlX2NvZGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLVMvLS1zb3VyY2UuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXNvdXJjZS4KLQkocHJldl9mdW5jdGlvbm5hbWUsIHByZXZfbGluZSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0KTogRGVmaW5lLgotCShwcmludF9maWxlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNraXBfdG9fbGluZSwgc2hvd19saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIHNob3dfbGluZSB0byBoYW5kbGUgLWwgYW5kIC1TLgotCShtYWluKTogSGFuZGxlIC1TLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtUy8tLXNvdXJjZS4KLQotVGh1IEZlYiAgOSAxNjoxMTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IFJlbmFtZSBwYXJhbWV0ZXIgdG8gYXZvaWQgc2hhZG93aW5nLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2FkZCk6IERlZmluZS4KLQkoYWRkX3NlY3Rpb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tYWRkLXNlY3Rpb24uCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tYWRkLXNlY3Rpb24uCi0JKGNvcHlfb2JqZWN0KTogQWRkIHNlY3Rpb25zIGZyb20gdGhlIGFkZF9zZWN0aW9ucyBsaXN0LgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1hZGQtc2VjdGlvbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1hZGQtc2VjdGlvbi4KLQotV2VkIEZlYiAgMSAxNTowNDo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBQYXNzIHNlY3Rpb24gb2Zmc2V0LCBub3QgYWJzb2x1dGUKLQlhZGRyZXNzLCB0byBiZmRfZmluZF9uZWFyZXN0X2xpbmUuCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogRG9uJ3QgdXNlIGNvbnN0IHdpdGgKLQlyZWxvY19ob3d0b190eXBlLgotCi1UaHUgSmFuIDI2IDE4OjUwOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3N5bWJvbHMpOiBVc2UgYmZkX2FzeW1ib2xfdmFsdWUgKFZBUikgcmF0aGVyCi0JdGhhbiBWQVItPnZhbHVlLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBMaWtld2lzZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGNoYW5nZSB0aGUgc3ltYm9sIHZhbHVlcy4gIEl0IGNhbgotCWNvbmZ1c2UgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQotVGh1IEphbiAyNiAxMjowMzo1NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYmFpLgotCi1XZWQgSmFuIDE4IDEwOjAyOjEyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBjb2ZmZHVtcC5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCShkdW1wX2NvZmZfdHlwZSk6IEhhbmRsZSBjb2ZmX3NlY2RlZl90eXBlLgotCSogY29mZmdyb2suYyA6IEluY2x1ZGUgc3lzZGVwLmguCi0JKiBzcmNvbnYuYzogSW5jbHVkZSBsaWJpYmVydHkuaAotCShhYnNvbHV0ZV9wLCBkdHlfc3RhcnQsIGR0eV9lbmQsIGR1bXBfdHJlZV9zdHJ1Y3R1cmUpOiBSZW1vdmUuCi0KLVdlZCBKYW4gMTggMTI6MjQ6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb2ZmZHVtcC5jIChkdW1wX2NvZmZfc2NvcGUpOiBDYXN0IHBvaW50ZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IKLQlwcmludGYuCi0JKiBjb2ZmZ3Jvay5jOiBJbmNsdWRlIGJ1Y29tbS5oLiAgRG9uJ3QgZGVjbGFyZSB4bWFsbG9jLgotCShwdXNoX3Njb3BlKTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBsaW5rLgotCSogc2l6ZS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSogc3Jjb252LmM6IEluY2x1ZGUgYnVjb21tLmguCi0JKGZpbmRfYmFzZSk6IERlY2xhcmUgYXQgdG9wIG9mIGZpbGUuCi0JKHdyX2hkKTogQWRkIGRlZmF1bHQgY2FzZSB0byBhcmNoaXRlY3R1cmUgc3dpdGNoLgotCSh3cl9kcHNfc3RhcnQpOiBEZWNsYXJlIHR5cGUgb2YgcGFyYW1ldGVyIG5lc3QuCi0JKHdyX2R1KTogQ29tbWVudCBvdXQgdmFyaWFibGVzIHVzZWQgb25seSBpbiBjb21tZW50ZWQgb3V0IGJsb2Nrcy4KLQkod3JfZHVzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCSh3cl9zYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIG15aW5mbywgbG93LCBhbmQgaGlnaC4KLQkqIHN0cmluZ3MuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkqIHN5c2R1bXAuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0KLVR1ZSBEZWMgMjAgMTk6MTM6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogSWdub3JlICdmJyBtb2RpZmllciB1c2VkIG9uIEhQL1VYIDkuCi0KLVRodSBEZWMgMTUgMTc6MzQ6MTIgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBhci5jLCBubS5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYzogSW5jbHVkZSBwcm9ncmVzcy5oLgotCSogYXIuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMgKG1haW4pOiBBZGQgU1RBUlRfUFJPR1JFU1MKLQlhbmQgRU5EX1BST0dSRVNTLgotCSogYXIuYyAobWFwX292ZXJfbWVtYmVycywgb3Blbl9pbmFyY2gpOiBDYWxsIFBST0dSRVNTLgotCSogbm0uYyAobWFpbiwgZGlzcGxheV9hcmNoaXZlLCBmaWx0ZXJfc3ltYm9scywgcHJpbnRfc3ltYm9scyk6Ci0JQ2FsbCBQUk9HUkVTUy4KLQotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogQnJlYWsgdXAgbG9uZyB1c2FnZSBzdHJpbmcuCi0KLVdlZCBEZWMgMTQgMTU6NTE6NTYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IERvbid0IGJvdGhlciBzZXR0aW5nIHN0YXR1cyBhZnRlcgotCW5vbmZhdGFsKCkgImNhbGwiLCBiZWNhdXNlIGl0IHdvbid0IHJldHVybi4KLQotRnJpIERlYyAgOSAwMDoyMjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogRG9uJ3Qgc3dpdGNoIGEgcmVsb2MgdG8gdXNlCi0JdGhlIHNlY3Rpb24gc3ltYm9sIGlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLgotCi1UaHUgRGVjICA4IDE0OjQ1OjUwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoYWRkX3N0cmlwX3N5bWJvbCk6IENhc3QgcmV0dXJuIHZhbHVlIG9mIHhtYWxsb2MuCi0KLVdlZCBOb3YgMzAgMTE6MDU6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogUGFzcyBjdXJyZW50LT5maWxlbmFtZSB0byBub3JtYWxpemUgd2hlbgotCWNoZWNraW5nIGZvciBkdXBsaWNhdGVzLCBiZWNhdXNlIHRoZSBmaWxlbmFtZSBvZiBhIG5ld2x5IGFkZGVkCi0JZmlsZSB3aWxsIG5vdCBoYXZlIGJlZW4gbm9ybWFsaXplZCB5ZXQuCi0KLVRodSBOb3YgMTcgMTU6MDA6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogRG9uJ3QgY2FsbCBkb19xdWlja19hcHBlbmQgaWYgYW55IG9mIHRoZSBhcmNoaXZlCi0JbmFtZXMgYXJlIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuCi0KLQkqIG9iamNvcHkuYyAobWFpbik6IEZpeCBpc19zdHJpcCB0ZXN0LiAgRnJvbQotCXBpcmtlckBlaXVuaXgudHV3aWVuLmFjLmF0IChNYXJ0aW4gUGlya2VyKS4KLQotVGh1IE5vdiAxNyAxNTozNzoxOSAxOTk0ICBNYXJrIFcuIEVpY2hpbiAgPGVpY2hpbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGFkZF9zdHJpcF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24sIGFkZHMgYSBuYW1lIHRvIGFuCi0JZXhwbGljaXQgbGlzdCBvZiBzeW1ib2xzIHRvIHN0cmlwLgotCShpc19zdHJpcF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24sIHJlcG9ydHMgd2hldGhlciB0aGUgbmFtZSBhcmd1bWVudAotCWlzIGluIHRoZSBleHBsaWNpdCBsaXN0LgotCShmaWx0ZXJfc3ltYm9scyk6IENoZWNrIGFnYWluc3QgaXNfc3RyaXBfc3ltYm9sIGFib3ZlIGFsbC4KLQkoc3RyaXBfbWFpbik6IFJlY29nbml6ZSAtTiBvcHRpb24uIElmIHVzZWQsIGRvbid0IGRlZmF1bHQgdG8KLQlzdHJpcF9hbGwuCi0JKGNvcHlfbWFpbik6IFJlY29nbml6ZSAtTiBvcHRpb24uCi0JKHN0cmlwX3VzYWdlKTogRG9jdW1lbnQgLU4gYW5kIC0tc3RyaXAtc3ltYm9sIG9wdGlvbnMuCi0JKGNvcHlfdXNhZ2UpOiBEaXR0by4KLQkqIG9iamNvcHkuMSwgc3RyaXAuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgLU4gYW5kCi0JLS1zdHJpcC1zeW1ib2wgb3B0aW9ucy4KLQotVHVlIE5vdiAgOCAxMzoxMjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCwgZGlzcGxheV9pbmZvX3RhYmxlKTogUGFzcyBhbgotCWFycmF5IHRvIHRtcGFyZywgcmF0aGVyIHRoYW4gTlVMTCwgc2luY2Ugc29tZSBzeXN0ZW1zIGNhbid0IGhhbmRsZQotCU5VTEwuCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogS2VlcCBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRoZQotICAgICAgICB0ZW1wb3JhcnkgZmlsZXMgd2UgY3JlYXRlZC4gIENsb3NlIGVhY2ggaW5wdXQgQkZEIGFmdGVyIHdlIG9wZW4KLSAgICAgICAgaXRzIHN1Y2Nlc3Nvci4KLQotTW9uIE5vdiAgNyAxNTo0ODozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdG8gMi41LjMuCi0KLVRodSBOb3YgIDMgMTk6MDQ6MzQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IEluc3RhbGwgaW5mbyBmaWxlcyBmcm9tIHdoYXRldmVyCi0JZGlyZWN0b3J5IHRoZXkgd2VyZSBmb3VuZCBpbi4KLQotCVBhdGNoIGZyb20gREogRGVsb3JpZToKLQkqIGNvbmZpZ3VyZS5iYXQ6IGRvIGMrK2ZpbHQgLT4gY3h4ZmlsdCByaWdodAotCi0JKiBzeXNpbmZvLnk6IEluY2x1ZGUgc3lzdGVtIGhlYWRlciBmaWxlcyBlYXJseSwgc28gYW55IHBvdGVudGlhbAotCWRlY2xhcmF0aW9uIG9mIGFib3J0KCkgb2NjdXJzIGJlZm9yZSBpdHMgdXNlLgotCi0JKiBzdHJpbmdzLmMgKHN0cmluZ3NfZmlsZSk6IFRyeSBvcGVuaW5nIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlCi0JZmlyc3QuCi0KLVdlZCBOb3YgIDIgMTU6NDQ6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogVHJlYXQgYXIgcXMgbGlrZSBhciBycy4KLQotVHVlIE9jdCAyNSAxNjoxOToyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZ2FwX2ZpbGwpOiBFeHBsaWNpdGx5IGluaXRpYWxpemUsIGZvciBjbGFyaXR5LgotCShwYWRfdG9fc2V0LCBwYWRfdG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tcGFkLXRvLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXBhZC10by4KLQkoY29weV9vYmplY3QpOiBTdXBwb3J0IC0tcGFkLXRvLgotCShjb21wYXJlX3NlY3Rpb25fdm1hKTogU29ydCBub24gbG9hZGFibGUgc2VjdGlvbnMgdG8gdGhlIGZyb250LgotCVNvcnQgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBWTUEgYnkgc2l6ZS4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tcGFkLXRvLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLXBhZC10by4KLQotVGh1IE9jdCAyMCAxMzo1MTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoZ2FwX2ZpbGxfc2V0LCBnYXBfZmlsbCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb3B5X29wdGlvbnMpOiBBY2NlcHQgLS1nYXAtZmlsbC4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1nYXAtZmlsbC4KLQkoY29weV9vYmplY3QpOiBTdXBwb3J0IC0tZ2FwLWZpbGwuCi0JKGdldF9zZWN0aW9ucywgY29tcGFyZV9zZWN0aW9uX3ZtYSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1nYXAtZmlsbC4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1nYXAtZmlsbC4KLQotV2VkIE9jdCAxOSAxNDowOToxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IEFkZCBhIGR1bW15IGVsc2UgY2xhdXNlIHRvIHRoZSBpZgotCXN0YXRlbWVudC4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IFJlbW92ZSBzcGVjaWFsIG1lbnRpb24gb2YgLS1zZXQtc3RhcnQKLQlhbmQgYGJpbmFyeScgb3V0cHV0IGZvcm1hdC4KLQotVHVlIE9jdCAxOCAxMToxMjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBJZiB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0IGlzIGBiaW5hcnknLAotCWFuZCB0aGUgc3RhcnQgYWRkcmVzcyB3YXMgbm90IHNldCB1c2luZyAtLXNldC1zdGFydCwgZGVmYXVsdCB0aGUKLQlzdGFydCBhZGRyZXNzIHRvIHplcm8uICBUaGlzIGhhY2sgaXMgYmVjYXVzZSB0aGUgYGJpbmFyeScgb3V0cHV0Ci0JZmlsZSBmb3JtYXQgdXNlcyB0aGUgc3RhcnQgYWRkcmVzcyB0byBzZXQgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZgotCXRoZSBmaXJzdCBieXRlIGluIHRoZSBmaWxlLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBBZGQgc29tZSBub3RlcyBvbiBnZW5lcmF0aW5nIFMtcmVjb3JkcwotCWFuZCBiaW5hcnkgZmlsZXMuCi0KLQkqIG5tLmMgKHByaW50X3N5bWRlZl9lbnRyeSk6IENhbGwgcHJpbnRfc3ltbmFtZSB0byBwcmludCB0aGUKLQlzeW1ib2wgbmFtZSwgc28gdGhhdCAtLWRlbWFuZ2xlIHdvcmtzLgotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBSZW1vdmUgdG1wZGlyLgotCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2xpc3QpOiBBZGQgZmllbGRzIHVzZWQsIGFkanVzdCwgdmFsLgotCShhZGp1c3Rfc3RhcnQsIHNldF9zdGFydF9zZXQsIHNldF9zdGFydCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShhZGp1c3Rfc2VjdGlvbl92bWEsIGFkanVzdF9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb3B5X29wdGlvbnMpOiBBZGQgLS1hZGp1c3Qtc3RhcnQsIC0tYWRqdXN0LXZtYSwKLQktLWFkanVzdC1zZWN0aW9uLXZtYSwgLS1hZGp1c3Qtd2FybmluZ3MsIC0tbm8tYWRqdXN0LXdhcm5pbmdzLAotCS0tc2V0LXN0YXJ0LgotCShwYXJzZV92bWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkoY29weV9vYmplY3QpOiBIYW5kbGUgLS1zZXQtc3RhcnQgYW5kIC0tYWRqdXN0LXN0YXJ0LgotCShzZXR1cF9zZWN0aW9uKTogQ29ycmVjdCB0eXBlIG9mIGxhc3QgYXJndW1lbnQgdG8gUFRSLiAgU2V0IHVzZWQKLQlmaWVsZCBpZiBzZWN0aW9uIGlzIHJlbW92ZWQuICBIYW5kbGUgLS1hZGp1c3Qtdm1hIGFuZAotCS0tYWRqdXN0LXNlY3Rpb24tdm1hLgotCShjb3B5X3NlY3Rpb24pOiBDb3JyZWN0IHR5cGUgb2YgbGFzdCBhcmd1bWVudCB0byBQVFIuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4pOiBDbGVhciB1c2VkIGZpZWxkIHdoZW4gaGFuZGxpbmcgLVIuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQkqIGJpbnV0aWxzLnRleGkgKG9iamNvcHkpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQkqIG9iamNvcHkuMTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLUZyaSBPY3QgMTQgMTQ6Mzg6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBSZW1vdmUgZGVmaW5pdGlvbi0tdGVzdHN1aXRlIGlzIG5vCi0JbG9uZ2VyIGNvbmZpZ3VyZWQuCi0JKiBNYWtlZmlsZS5pbiAodGVzdHN1aXRlKTogUmVtb3ZlIHRhcmdldC4KLQkoc2l0ZS5leHApOiBOZXcgdGFyZ2V0LgotCShjaGVjayk6IFJld3JpdGUuCi0JKGNsZWFuLCBkaXN0Y2xlYW4pOiBEb24ndCByZWN1ciBpbnRvIHRlc3RzdWl0ZSBkaXJlY3RvcnkuCi0KLVRodSBPY3QgMTMgMTk6MjQ6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNS4KLQkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgotCi1UdWUgT2N0IDExIDE1OjI2OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHN5c2R1bXAubyk6IERlcGVuZHMgdXBvbiBzeXNyb2ZmLmMuCi0KLU1vbiBPY3QgMTAgMTM6NTA6MzAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGxpbmtfaW5wdXRzKTogUGFzcyAtVXIgZmxhZyB0byBsZCBzbyB0aGF0IHRoZQotCSAgY3Rvci9kdG9yIHRhYmxlcyBuZWVkZWQgYnkgQysrIHByb2dyYW1zIGFyZSBidWlsdC4KLQotU3VuIE9jdCAgOSAxODowNDowMCAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzcmNvbnYubyk6IEFkZCBkZXBlbmRlbmNlIG9uIHN5c3JvZmYuYy4KLQotVHVlIE9jdCAgNCAxMjoxOTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgY29uZmlnLmJmZC4KLQotCSogTWFrZWZpbGUuaW4gKHN5c3JvZmYuaCk6IFNwbGl0IHRhcmdldCBhd2F5IGZyb20gc3lzcm9mZi5jLgotCShzcmNvbnYubywgc3lzZHVtcC5vKTogTmV3IHRhcmdldHMuCi0JKHNyY29udiwgc3lzZHVtcCk6IERvbid0IGRlcGVuZCB1cG9uIHN5c3JvZmYuYy4KLQotV2VkIFNlcCAyOCAxMzowNDozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcnBhcnNlLmMpOiBEb24ndCBpZ25vcmUgZXJyb3JzIGZyb20gbXYuCi0JKHN5c2luZm8uYyk6IExpa2V3aXNlLiAgQWxzbywgZGVwZW5kIHVwb24gYXJwYXJzZS5jLCB0byBwcmV2ZW50IGEKLQlwYXJhbGxlbCBtYWtlIGZyb20gdHJ5aW5nIHRvIGJ1aWxkIGJvdGggYXJwYXJzZS5jIGFuZCBzeXNpbmZvLmMKLQlzaW11bHRhbmVvdXNseS4KLQkobmxtaGVhZGVyLmMpOiBTaW1pbGFyIGNoYW5nZS4KLQkoYXJwYXJzZS5oKTogU2VwYXJhdGUgdGFyZ2V0IGZyb20gYXJwYXJzZS5jLCBzbyB0aGF0IGEgcGFyYWxsZWwKLQltYWtlIGRvZXMgbm90IHRyeSB0byBidWlsZCBib3RoIGF0IG9uY2UuICBEZXBlbmQgdXBvbiBhcnBhcnNlLmMuCi0JKHN5c2luZm8uaCk6IFNpbWlsYXIgY2hhbmdlLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBQYXNzIHRoZSByZWxvYyBidWZmZXIgdG8gZnJlZSwgbm90Ci0JdGhlIHBvaW50ZXIgdXNlZCB0byBsb29wIG92ZXIgdGhlIHJlbG9jcy4KLQotU2F0IFNlcCAyNCAxNjoxNjo1NyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IENhc3QgcmVzdWx0IG9mIHhtYWxsb2MuCi0KLVdlZCBTZXAgMjEgMTk6MzA6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHNvcnRlZF9zeW1zLCBzb3J0ZWRfc3ltY291bnQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIHNvcnRlZF9zeW1zIGFuZCBzb3J0ZWRfc3ltY291bnQKLQlpbnN0ZWFkIG9mIHN5bXMgYW5kIHN5bWNvdW50LgotCShkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgYm90aGVyIHRvIGdldCB0aGUgcmVsb2NzIGJlZm9yZSBsb29waW5nCi0Jb3ZlciB0aGUgc2VjdGlvbnMuICBCZWZvcmUgZmlsdGVyaW5nIGFuZCBzb3J0aW5nIHRoZSBzeW1ib2wgdGFibGUsCi0JY29weSBpdCBpbnRvIHNvcnRlZF9zeW1zLgotCi1GcmkgU2VwIDE2IDExOjI3OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyk6IEFkZCBmaWVsZCByZXF1aXJlX3NlYy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSWYgYXV4LT5yZXF1aXJlX3NlYywgcmVxdWlyZSB0aGF0IHRoZQotCXN5bWJvbCBiZSBpbiBhdXgtPnNlYyBldmVuIGlmIEhBU19SRUxPQyBpcyBub3Qgc2V0LiAgSWYgd2UgY2FuJ3QKLQlmaW5kIGEgc21hbGxlciBzeW1ib2wgaW4gdGhlIHJpZ2h0IHNlY3Rpb24sIGxvb2sgZm9yIGEgbGFyZ2VyIG9uZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBhdXgucmVxdWlyZV9zZWMgYXJvdW5kIHRoZQotCW9iamR1bXBfcHJpbnRfYWRkcmVzcyBjYWxsIGZvciB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KLQotVGh1IFNlcCAxNSAyMTo0MzoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmM6IENhbGwgeGV4aXQgcmF0aGVyIHRoYW4gZXhpdC4KLQkob3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfZmlsZSwgb3V0cHV0X2JmZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShyZW1vdmVfb3V0cHV0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgeGF0ZXhpdCAocmVtb3ZlX291dHB1dCkuICBDYWxsIHhleGl0IHJhdGhlciB0aGFuCi0JcmV0dXJuaW5nLgotCShleHRyYWN0X2ZpbGUpOiBTZXQgb3V0cHV0X2ZpbGVuYW1lIGFuZCBvdXRwdXRfZmlsZSB3aGlsZSBvdXRwdXQKLQlmaWxlIGlzIG9wZW4uCi0JKHdyaXRlX2FyY2hpdmUpOiBMaWtld2lzZSwgYnV0IHVzZSBvdXRwdXRfYmZkLCBub3Qgb3V0cHV0X2ZpbGUuCi0JKiBhcnN1cC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLiAgQ2FsbCB4ZXhpdCByYXRoZXIgdGhhbiBleGl0LgotCSogYnVjb21tLmM6IExpa2V3aXNlLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2FsbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1kaXNhc3NlbWJsZS1hbGwuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCBkaXNhc3NlbWJsZS1hbGwgYXMgYSBzeW5vbnltIGZvciAtRC4KLQkoY29tcGFyZV9zeW1ib2xzKTogTWFrZSBwb2ludGVycyBjb25zdC4KLQkoY29tcGFyZV9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkaXNhc3NlbWJsZV9kYXRhKTogUmVuYW1lIGRpc2Fzc2VtYmxlIHRvIGRpc2Fzc2VtYmxlX2ZuIHRvIGF2b2lkCi0Jc2hhZG93aW5nLiAgSWYgZHVtcF9yZWxvY19pbmZvLCBwcmludCByZWxvY3MgYWxvbmcgd2l0aAotCWRpc2Fzc2VtYmx5LiAgU2tpcCBzZWN0aW9ucyB3aGljaCBhcmUgbm90IFNFQ19DT0RFIHVubGVzcwotCWRpc2Fzc2VtYmxlX2FsbCBvciBvbmx5IGlzIHNldC4KLQkoZGlzcGxheV9iZmQpOiBEb24ndCBjYWxsIGR1bXBfcmVsb2NzIGlmIGRpc2Fzc2VtYmxlIGlzIHNldC4KLQkobWFpbik6IEFjY2VwdCBhbmQgaGFuZGxlIC1ELgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgLUQvLS1kaXNhc3NlbWJsZS1hbGwuCi0JKiBvYmpkdW1wLjE6IExpa2V3aXNlLgotCi1XZWQgU2VwIDE0IDEyOjE5OjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSW5pdGlhbGl6ZSBwcmV2bGluZSB0byAwLiAgTWFrZQotCXByZXZfZnVuY3Rpb24gbm9uIGNvbnN0LiAgQ29weSBmdW5jdGlvbm5hbWUgaW50byBhbiBtYWxsb2MgYnVmZmVyCi0Jd2hlbiBzZXR0aW5nIHByZXZfZnVuY3Rpb24sIGluc3RlYWQgb2YgYXNzdW1pbmcgdGhhdCB0aGUgc3RyaW5nCi0Jd2lsbCBsYXN0IGZvcmV2ZXIuCi0KLQkqIG5tLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHNvcnRfYnlfc2l6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXNpemUtc29ydC4KLQkodXNhZ2UpOiBNZW50aW9uIC0tc2l6ZS1zb3J0LgotCShudW1lcmljX2ZvcndhcmQpOiBNYWtlIHN0YXRpYy4gIENoYW5nZSBmcm9tIHZvaWQgKiB0byBQVFIuCi0JKG51bWVyaWNfcmV2ZXJzZSk6IExpa2V3aXNlLgotCShub25fbnVtZXJpY19mb3J3YXJkLCBub25fbnVtZXJpY19yZXZlcnNlKTogTGlrZXdpc2UuCi0JKHNvcnRlcnMpOiBDaGFuZ2UgZGVjbGFyYXRpb24gZnJvbSB2b2lkICogdG8gUFRSLgotCShzaXplX2ZvcndhcmQsIHNvcnRfc3ltYm9sX2J5X3NpemUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoZGlzcGxheV9yZWxfZmlsZSk6IEhhbmRsZSBzb3J0X2J5X3NpemUuCi0JKGZpbHRlcl9zeW1ib2xzKTogSWYgc29ydF9ieV9zaXplLCBkaXNjYXJkIGFic29sdXRlIGFuZCB1bmRlZmluZWQKLQlzeW1ib2xzLgotCSogYmludXRpbHMudGV4aSAobm0pOiBEb2N1bWVudCAtLXNpemUtc29ydC4KLQkqIG5tLjE6IERvY3VtZW50IC0tc2l6ZS1zb3J0LgotCi1UdWUgU2VwIDEzIDIxOjA2OjA2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfbWFpbik6IEluaXRpYWxpemUgaW5wdXRfZmlsZW5hbWUgYW5kCi0Jb3V0cHV0X2ZpbGVuYW1lIHRvIE5VTEwuCi0KLVR1ZSBTZXAgMTMgMTQ6MTc6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodmVyc2lvbi5vKTogRGVwZW5kIHVwb24gTWFrZWZpbGUsIHNvIHRoYXQgdmVyc2lvbi5vCi0JZ2V0cyByZWJ1aWx0IHdoZW4gbWFrZSB2YXJpYWJsZSBWRVJTSU9OIGlzIGNoYW5nZWQuCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IFByaW50IHRoZSBTRUNfTkVWRVJfTE9BRCBmbGFnLgotCi1XZWQgQXVnIDI0IDEyOjQwOjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQotVHVlIEF1ZyAyMyAxMTowMDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHJhbmxpYl90b3VjaCk6IERvbid0IHVwZGF0ZSB0aGUgYXJjaGl2ZSBtYXAgaWYgdGhlcmUgaXNuJ3QKLQlvbmUuCi0KLU1vbiBBdWcgMjIgMTY6MDI6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhci5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShpbmFyY2gpOiBSZW1vdmUgdmFyaWFibGUuCi0JKG1hcF9vdmVyX21lbWJlcnMpOiBNYWtlIHN0YXRpYy4gIEFkZCBhcmNoIGFyZ3VtZW50LCBhbmQgdXNlIGl0Ci0JaW5zdGVhZCBvZiBpbmFyY2guICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG1haW4pOiBUcmVhdCAtLXZlcnNpb24gYXMgLXYuICBBY2NlcHQgLXQgYXJndW1lbnQuICBBY2NlcHQgYW55Ci0JbnVtYmVyIG9mIGFyY2hpdmUgYXJndW1lbnRzLiAgQ2F0Y2ggYW5kIHVzZSBvcGVuX2luYXJjaCByZXR1cm4KLQl2YWx1ZSwgcmF0aGVyIHRoYW4gdXNpbmcgaW5hcmNoLgotCShvcGVuX2luYXJjaCk6IFJldHVybiBuZXdseSBvcGVuZWQgQkZELCByYXRoZXIgdGhhbiB1c2luZyBpbmFyY2guCi0JKGRvX3F1aWNrX2FwcGVuZCk6IE1ha2UgYXJjaGl2ZV9maWxlbmFtZSBjb25zdC4KLQkod3JpdGVfYXJjaGl2ZSk6IEFkZCBpYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGluYXJjaC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGRlbGV0ZV9tZW1iZXJzLCBtb3ZlX21lbWJlcnMsIHJlcGxhY2VfbWVtYmVycyk6IExpa2V3aXNlLgotCShyYW5saWJfb25seSk6IERvbid0IGV4aXQgb24gc3VjY2Vzcy4gIENhdGNoIGFuZCB1c2Ugb3Blbl9pbmFyY2gKLQlyZXR1cm4gdmFsdWUuCi0JKHJhbmxpYl90b3VjaCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFyc3VwLmggKG1hcF9vdmVyX21lbWJlcnMpOiBEb24ndCBkZWNsYXJlLgotCShhcl9lbmQsIGFyX2V4dHJhY3QpOiBEZWNsYXJlLgotCShvcGVuX2luYXJjaCk6IENoYW5nZSByZXR1cm4gdmFsdWUgaW4gZGVjbGFyYXRpb24gdG8gYmZkICouCi0JKiBhcnN1cC5jIChtYXBfb3Zlcl9saXN0KTogTWFrZSBzdGF0aWMuIEFsd2F5cyBwYXNzIHR3byBhcmd1bWVudHMKLQl0byBmdW5jdGlvbi4gIEFkZCBhcmNoIGFyZ3VtZW50LCBhbmQgdXNlIGl0IGluc3RlYWQgb2YgaW5hcmNoLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoYXJfZGlyZWN0b3J5X2RvZXIpOiBNYWtlIHN0YXRpYy4gIEFkZCBpZ25vcmVkIHNlY29uZCBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGFyX2RpcmVjdG9yeSk6IFVzZSBvcGVuX2luYXJjaCByZXR1cm4gdmFsdWUgcmF0aGVyIHRoYW4gaW5hcmNoLgotCShhcl9hZGRsaWJfZG9lcik6IE1ha2Ugc3RhdGljLgotCShhcl9hZGRsaWIpOiBVc2Ugb3Blbl9pbmFyY2ggcmV0dXJuIHZhbHVlIHJhdGhlciB0aGFuIGluYXJjaC4KLQkoYXJfZXh0cmFjdCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgYWJmZC4KLQotVGh1IEF1ZyAxMSAxNDo1NTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgcmVtb3ZpbmcgbmFtZWQgc2VjdGlvbnMgdG8gb2JqY29weSBhbmQgc3RyaXAuCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2xpc3QpOiBEZWZpbmUuCi0JKHJlbW92ZV9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHN0cmlwX29wdGlvbnMsIGNvcHlfb3B0aW9ucyk6IEFkZCByZW1vdmUtc2VjdGlvbi4KLQkoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBNZW50aW9uIC1SIGFuZCAtLXJlbW92ZS1zZWN0aW9uLgotCShzZXR1cF9zZWN0aW9uKTogSWYgc2VjdGlvbiBpcyBpbiByZW1vdmVfc2VjdGlvbnMgbGlzdCwgaWdub3JlIGl0LgotCShjb3B5X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc3RyaXBfbWFpbiwgY29weV9tYWluKTogSGFuZGxlIC1SLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xLCBzdHJpcC4xOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotV2VkIEF1ZyAxMCAxMDoxOTo1NSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogUmVuYW1lIHN5bXZhbHVlIHRvIHN5bV92YWx1ZSwKLQlzbyBhcyBub3QgdG8gY29uZmxpY3Qgd2l0aCB0aGUgc3ltdmFsdWUgdHlwZWRlZiBpbiBiZmQuaC4KLQotTW9uIEF1ZyAgMSAxMzoxOTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55OiBQZXIgY3VycmVudCBOZXRXYXJlIGRvY3MsIGFjY2VwdCBhIHJldmlzaW9uIG51bWJlcgotCW9mIDAgYW5kIHRyZWF0IGEgcmV2aXNpb24gbnVtYmVyIGdyZWF0ZXIgdGhhbiAyNiBhcyAwLgotCi1Nb24gSnVsIDI1IDEyOjU4OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGVuZCBvZgotCXN5bWJvbHMgd2hlbiBsb29raW5nIGZvciBuZXh0IHN5bWJvbCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLgotCi1GcmkgSnVsIDIyIDE2OjQ4OjM0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5tLmMgKG51bWVyaWNfZm9yd2FyZCk6IFRyZWF0IHVuZGVmaW5lZCBzeW1ib2xzIGFzICJsZXNzIHRoYW4iCi0JZGVmaW5lZCBzeW1ib2xzIHdpdGggemVybyB2YWx1ZXMuICBJZiBudW1lcmljIHZhbHVlcyBhcmUgZXF1YWwsIG9yCi0JYm90aCBzeW1ib2xzIGFyZSB1bmRlZmluZWQsIHNvcnQgYWxwaGFiZXRpY2FsbHkuICBEb24ndCBhc3N1bWUKLQl0aGF0IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBiZmRfdm1hIHZhbHVlcyB3aWxsIHRydW5jYXRlIHRvICJpbnQiCi0JYW5kIHN0aWxsIGhhdmUgdGhlIHNhbWUgc2lnbi4KLQkobnVtZXJpY19yZXZlcnNlKTogQ2FsbCBudW1lcmljX2ZvcndhcmQgYW5kIG5lZ2F0ZSB0aGUgcmVzdWx0LgotCShwcmludF9zeW1ib2xfaW5mb19ic2QpOiBGb3IgdW5kZWZpbmVkIHN5bWJvbHMsIHByaW50IGxlYWRpbmcKLQlzcGFjZXMgZXF1aXZhbGVudCB0byB0aGUgd2lkdGggb2YgYSBwcmludGVkIGJmZF92bWEsIHJhdGhlciB0aGFuCi0JYXNzdW1pbmcgdGhhdCA4IHdpbGwgbG9vayByaWdodC4KLQotRnJpIEp1bCAyMiAxMDozNjo1MCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5jIChkb2l0KTogIFplcm8gYWxsIGZpZWxkcyBvZiBuZXcgc3RydWN0dXJlLgotCSogc3Jjb252LmMgKHN5c3JvZmZfc3dhcF8qX291dCk6IFJlbW92ZSByZWR1bmRhbnQgdHJhaWxpbmcgYXJnLgotCSogc3lzaW5mby55OiBHZW5lcmF0ZSBzeXNyb2ZmX3N3YXBfKl9vdXQgd2l0aG91dCByZXF1aXJpbmcgZXh0cmEKLQlhcmcuCi0KLUZyaSBKdWwgMjIgMTA6MDk6NTMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueTogTWFrZSAic3RhY2siIGFuZCAic3RhY2tzaXplIiBzeW5vbnltcyBpbiB0aGUgbGV4ZXIKLQkgIHJhdGhlciB0aGFuIHRoZSBwYXJzZXIuCi0KLVRodSBKdWwgMjEgMTA6MjU6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYWxwaGFvc2YsIGNvbmZpZy9taC1hcG9sbG82OHYsIGNvbmZpZy9taC1kZWx0YTg4OgotCVJlbW92ZTsgb2Jzb2xldGUuCi0KLVNhdCBKdWwgMTYgMjI6MzQ6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHNsdXJwX2R5bmFtaWNfc3ltdGFiKTogVHJ5IHRvIGdldCB0aGUgZHluYW1pYyBzeW1ib2xzCi0JZXZlbiBpZiB0aGUgYmZkIGlzIG5vdCBtYXJrZWQgRFlOQU1JQy4gIEVMRiBleGVjdXRhYmxlcyBhcmUgbm90Ci0JbWFya2VkIERZTkFNSUMsIGJ1dCBkbyBoYXZlIGR5bmFtaWMgc3ltYm9scy4KLQotRnJpIEp1bCAxNSAwMTo0MTozNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5jIChkb193aGVyZSk6IE1ha2UgZGF0YSB3aXRoIG5vIHR5cGUgJ2ludCcuCi0JKGRvX2RlZmluZSk6ICBLZWVwIGluZm8gb24gc291cmNlIGZpbGUgb2YgYSBzeW1ib2wuCi0JKiBjb2ZmZ3Jvay5oIChjb2ZmX3N5bWJvbCk6IE5ldyBmaWVsZC4KLQkqIHNyY29udi5jIChQUk9HUkFNX1ZFUlNJT04pOiBOb3cgMS4zCi0JKHdyX3JsKTogVXNlIGV4dGVybmFsIHJlZiBudW1iZXIgZm9yIHN5bWJvbC4KLQkod3JfZHVzKTogT25seSBrZWVwIG9uZSBzb3VyY2UgZmlsZSBwZXIgZGVidWcgdW5pdC4KLQkod3JfZGxuKTogQWx3YXlzIGVtaXQgbGluZSBudW1iZXJzIGZvciBmaXJzdCBzb3VyY2UgZmlsZSwKLQkod3JfZ2xvYmFscyk6ICBFbWl0IGdsb2JhbHMgaW4gdGhlIGR1IG9mIHRoZWlyIG93bmluZyBzb3VyY2UgZmlsZS4KLQotTW9uIEp1bCAxMSAxNTo1OTowMyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55OiBOdWxsIHRlcm1pbmF0ZSB2YXJfaGRyLT50aHJlYWROYW1lLgotCi1GcmkgSnVsICA4IDE3OjMzOjIyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzeXNsZXgubywgc3lzaW5mby5vKTogUGVybWl0IEMgc291cmNlIGZpbGVzIHRvIGJlCi0JaW4gJChzcmNkaXIpLCBhcyB0aGV5IHdpbGwgYmUgZm9yIEZTRiByZWxlYXNlcy4KLQotV2VkIEp1bCAgNiAwMToxMzoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBQcmVzZXJ2ZSBleGlzdGluZyBzZWN0aW9uIGZsYWdzIHdoZW4KLQljb3B5aW5nIGluIGZsYWdzIGZyb20gYSBuZXcgc2VjdGlvbi4KLQotVHVlIEp1bCAgNSAxNTo1NjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoY29weV9maWxlKTogSWYgb3V0cHV0X3RhcmdldCBpcyBOVUxMLCBzZXQgaXQgdG8gdGhlIHRhcmdldCBvZiB0aGUKLQlpbnB1dCBmaWxlLgotCi1XZWQgSnVuIDI5IDE3OjE3OjE0IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IEZpeGVkIG1lbW9yeSBhbGxvY2F0aW9uIGJ1Zy4KLQotVGh1IEp1biAyMyAxMjo1Mjo0NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMuCi0KLVR1ZSBKdW4gMjEgMTI6NTM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3lzaW5mbyk6IERvZXMgbm90IGRlcGVuZCB1cG9uICQoQURETF9MSUJTKS4KLQotCSogbmxtY29udi5jIChwb3dlcnBjX2J1aWxkX3N0dWJzKTogRG9uJ3QgZ2VuZXJhdGUgdGhlIFBvd2VyUEMKLQlOZXRXYXJlIGN1c3RvbSBoZWFkZXI7IG5vIGxvbmdlciBuZWVkZWQuCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENvbnZlcnQgcmVsb2NzIGFnYWluc3QgdGhlIHVuaW5pdGlhbGl6ZWQKLQlkYXRhIHNlY3Rpb24gaW50byByZWxvY3MgYWdhaW5zdCB0aGUgZGF0YSBzZWN0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBubG1jb252X2RlZnMgdG8gLUROTE1DT05WX2NwdXR5cGUgZm9yIGFsbCB0aGUKLQluZXR3YXJlIHRhcmdldHMuICBXcml0ZSBpdCBpbnRvIE1ha2VmaWxlIGFzIE5MTUNPTlZfREVGUy4KLQkqIE1ha2VmaWxlLmluIChubG1jb252Lm8pOiBQYXNzICQoTkxNQ09OVl9ERUZTKSB0byAkKENDKS4KLQkqIG5sbWNvbnYuYzogT25seSBjb21waWxlIGNvZGUgZm9yIHNwZWNpZmljIENQVSB0eXBlcyBpZgotCU5MTUNPTlZfY3B1dHlwZSBpcyBkZWZpbmVkLgotCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgdXNlcyBvZiBiZmRfYWJzX3NlY3Rpb24sIGV0Yy4sIHRvIHVzZQotCWJmZF9hYnNfc2VjdGlvbl9wdHIgb3IgYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuCi0JKGkzODZfbWFuZ2xlX3JlbG9jcywgYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgotCShwb3dlcnBjX2J1aWxkX3N0dWJzKTogTGlrZXdpc2UuCi0JKiBubS5jIChmaWx0ZXJfc3ltYm9scywgcHJpbnRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChyZW1vdmVfdXNlbGVzc19zeW1ib2xzLCBkdW1wX3JlbG9jcyk6IExpa2V3aXNlLgotCSogc2l6ZS5jIChzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBMaWtld2lzZS4KLQotTW9uIEp1biAyMCAxNjo0MzowMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFOUEFHRVMpOiBSZW1vdmUgJChERU1BTkdMRVJfUFJPRykuCi0JKGluc3RhbGwpOiBJbnN0YWxsIGl0IGV4cGxpY2l0bHksIGZyb20gYnVpbGQgZGlyLCBub3Qgc3JjZGlyLgotCi1Nb24gSnVuIDIwIDE2OjI5OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBEb24ndCBpbmNsdWRlIGVsZi9pbnRlcm5hbC5oLgotCShiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IERvbid0IGRlY2xhcmUuCi0JKHJlYWRfc2VjdGlvbl9zdGFicyk6IE5vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEVMRi4gIEFsd2F5cyByZWFkCi0JdXNpbmcgQkZEIHNlY3Rpb25zLgotCi1UaHUgSnVuIDE2IDE3OjI1OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTZXQgVU5ERVJTQ09SRSBpbiBNYWtlZmlsZSBiYXNlZCBvbiByZXN1bHQgb2YKLQlpbnZva2luZyBjb25maWcuYmZkIHdpdGggYSBzZWNvbmQgYXJndW1lbnQgb2YgYGBfJycuCi0JKiBNYWtlZmlsZS5pbiAodW5kZXJzY29yZS5jKTogRGVwZW5kIHVwb24gTWFrZWZpbGUuICBEb24ndCB0cnkgdG8KLQlydW4gJChDQykgYW5kICQoTk0pLCBqdXN0IHVzZSAkKFVOREVSU0NPUkUpLiAgQ3JlYXRlIHZpYSB0ZW1wb3JhcnkKLQlmaWxlLgotCShkZW1hbmdsZS5vKTogUmVtb3ZlIHRhcmdldC4KLQkoJChOTV9QUk9HKSk6IERvbid0IGRlcGVuZCB1cG9uIGRlbWFuZ2xlLm8sIGFuZAlkb24ndCBsaW5rIGFnYWluc3QKLQlkZW1hbmdsZS5vLiAgSXQncyBpbiBsaWJpYmVydHkgYW55aG93LgotCShjcGx1cy1kZW0ubyk6IERvbid0IGRlcGVuZCB1cG9uIGRlbWFuZ2xlLm8uCi0JKiBiaW51dGlscy50ZXhpOiBNZW50aW9uIC1uIGFuZCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzIGFyZ3VtZW50cwotCXRvIGMrK2ZpbHQuCi0KLVdlZCBKdW4gMTUgMTI6MTA6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubS5jIChsb25nX29wdGlvbnMpOiBBZGQgLS1uby1kZW1hbmdsZSB0byB0dXJuIG9mZiAtLWRlbWFuZ2xlLAotCWFuZCAtLW5vLWNwbHVzIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCSh1c2FnZSk6IE1lbnRpb24gLS1uby1kZW1hbmdsZS4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC0tbm8tZGVtYW5nbGUuCi0KLUZyaSBKdW4gMTAgMTU6NDE6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubS5jOiBIT1NUXzY0X0JJVCB3YXMgcmVuYW1lZCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogTWFrZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB0aGUKLQlzYW1lIGRpcmVjdG9yeSBhcyB0aGUgb3V0cHV0IEJGRCwgc2luY2Ugd2UgbWF5IG5vdCBoYXZlIHdyaXRlCi0JcGVybWlzc2lvbiBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZQotCW5ldyBkaXJlY3RvcnkgdG8gMDcwMCwgbm90IDA3NzcuCi0KLU1vbiBKdW4gIDYgMjE6MzY6NDMgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGlmIHRoaXMgaXMgYW4gcnM2MDAwIChhbmQgd2UncmUgbm90IGJ1aWxkaW5nIGZvcgotCWFueSBvdGhlciBiZmQgdGFyZ2V0cykgdGhlbiBidWlsZCBvbmx5IG5tIChjb2xsZWN0IG5lZWRzIGl0IG9uCi0JcnM2MDAwLWx5bngpLgotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIFRPT0xfUFJPR1Mgd2hpY2ggdGhlIGxpc3Qgb2YgcHJvZ3JhbWVzIHRvCi0JaW5zdGFsbCBpbiAkdG9vbGRpciAtLSByZXBsYWNlcyBhIGhhcmQtY29kZWQgbGlzdC4KLQotRnJpIEp1biAgMyAxMDo1OToxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgb2suCi0KLVRodSBNYXkgMjYgMTg6MDU6NTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFscGhhb3NmIChDRkxBR1MpOiBEb24ndCBzcGVjaWZ5IGJvdGggLWcgYW5kIC1POwotCXRoZXkncmUgbm90IGNvbXBhdGlibGUgdW5kZXIgbmF0aXZlIGNjLiAgVXNlIC1PMSBpbnN0ZWFkLgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuNC4xLgotCi0JQ2hhbmdlcyBmcm9tIGJpbnV0aWxzLTIuNCBuZXQgcmVsZWFzZToKLQotCSogTWFrZWZpbGUuaW4gKE1BTlBBR0VTKTogVXNlICQoREVNQU5HTEVSX1BST0cpLgotCSgkKERFTUFOR0xFUl9QUk9HKS4xKTogQnVpbGQgZnJvbSBjeHhmaWx0Lm1hbiwgdXNpbmcgc2VkLgotCSogY3h4ZmlsdC5tYW46IFJlbmFtZWQgZnJvbSBjKytmaWx0LjEsIHJlcGxhY2VkICJjKytmaWx0IiB3aXRoCi0JbWFnaWMgdG9rZW4gdG8gYmUgcmVwbGFjZWQgYnkgc2VkLgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IG1ha2VmaWxlLmluCi0KLUZyaSBNYXkgMTMgMjM6MjU6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uYzogQ2hlY2sgQU5TSV9QUk9UT1RZUEVTIHJhdGhlciB0aGFuIF9fU1REQ19fLgotCi1UdWUgTWF5IDEwIDE4OjIyOjA2IDE5OTQgIEphc29uIE1vbGVuZGEgICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfc2VjdGlvbik6IFNldCBzZWN0aW9uIHNpemUgY29ycmVjdGx5IGlmIHVzaW5nCi0JaW50ZXJsZWF2ZS4KLQotU2F0IE1heSAgNyAxNjo0OTozNiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGUgZm9yIHN5c2luZm8uaAotCi1GcmkgTWF5ICA2IDEyOjE4OjMzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChTUkNPTlZfUFJPRyk6IERlZmluZS4KLQkoUFJPR1MpOiBVc2UgJChTUkNPTlZfUFJPRykgdG9vLgotCi1UaHUgTWF5ICA1IDE5OjQxOjQzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgc3lzaW5mby5jLCBzeXNsZXguYywgaW4gY2FzZQotCXNvbWVvbmUgY29uZmlndXJlcyB3aXRoIGB0YXJnZXRzPWFsbCcuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSB5LiouCi0JKHN5c2xleC5vKTogRGVwZW5kIG9uIHN5c2luZm8uaC4KLQkoc3lzaW5mby5jKTogUmVuYW1lIHkudGFiLmggdG8gc3lzaW5mby5oLgotCShpbnN0YWxsLWluZm8pOiBEb24ndCB0cnkgdG8gaW5zdGFsbCBpbnRvICQoaW5mb2RpcikvJChzcmNkaXIpLgotCSogc3lzbGV4Lmw6IEluY2x1ZGUgc3lzaW5mby5oLCBub3QgeS50YWIuaC4KLQotVGh1IE1heSAgNSAxMTo1MDo1NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogc3lzbGV4LmwgKHl5d3JhcCk6IERlZmluZSBhcyBmdW5jdGlvbiBpZiBub3QgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JKiBNYWtlZmlsZS5pbiAob2JqZHVtcC5vKTogRGVsZXRlZCBzcGVjaWFsIHJ1bGUuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciBidWlsZGluZyBBUkNIREVGUyB2YXJpYWJsZSBmb3IKLQlNYWtlZmlsZS4KLQkqIG9iamR1bXAuYyAoQVJDSF8qKTogRGVsZXRlZCBoYW5kbGluZy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENhbGwgYGRpc2Fzc2VtYmxlcicgZnJvbSBvcGNvZGVzIGxpYnJhcnkuCi0KLVRodSBNYXkgIDUgMTM6Mjg6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IENvcnJlY3QgaGFuZGxpbmcgb2YgJCh0b29sZGlyKSBhbmQKLQkkKGJpbmRpcikgYmVpbmcgb24gZGlmZmVyZW50IGRldmljZXMuCi0KLUZyaSBBcHIgMjkgMDk6NTA6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogc3lzZHVtcC5jIChoODMwMCwgc2gpOiBBZGQgZGVjbGFyYXRpb25zLgotCi1XZWQgQXByIDI3IDExOjI1OjE4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzeXNsZXgsIHN5c2luZm8pOiBVc2UgQ0NfRk9SX0JVSUxELgotCSogY29mZmR1bXAuYywgY29mZmdyb2MuYywgY29mZmdyb2cuaCwgc3Jjb252LmMsIHN5c2R1bXAuYywKLQlzeXNyb2ZmLmluZm86IE1ham9yIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMjYgMTg6MTg6MjQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHByaW50X3NlY3Rpb25fc3RhYnMpOiBJbmRpY2F0ZSB0aGUgc3RhYiBoZWFkZXIgc3ltYm9sCi0JbW9yZSBjbGVhcmx5LCBwcmludCBudW1iZXJzIG9mIHVucmVjb2duaXplZCBzdGFiIG5fdHlwZSB2YWx1ZXMuCi0KLVR1ZSBBcHIgMjYgMTY6MjI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGNvcHlfc2VjdGlvbnMpOiBDb3B5IGFyZWxlbnQgcG9pbnRlcnMsIG5vdCBhcmVsZW50cy4KLQotTW9uIEFwciAyNSAxNjoxNDozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgJChQUk9HUykgYW5kIHVuZGVyc2NvcmUuYy4KLQotRnJpIEFwciAyMiAxMToxNDoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiAucmVnaW5mbwotCXNlY3Rpb24uCi0JKGNvcHlfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IFVzZSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIHJhdGhlciB0aGFuIHRoZQotCXNwZWNpYWwgRUNPRkYgLnJlZ2luZm8gc2VjdGlvbi4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IENhbGwgYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhZnRlcgotCWNvcHlpbmcgZXZlcnl0aGluZyBlbHNlLCB0byBsZXQgaXQgZmlkZGxlIHdpdGggdGhlIGZpbGUgaW4gaXRzCi0JZmluYWwgc3RhdGUuCi0KLQkqIG9iamR1bXAuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCk6IElmIGEgZm9ybWF0IGZhaWxzLCBqdXN0IGdvIG9uIHRvIHRoZSBuZXh0Ci0Jb25lLiAgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZXRfZm9ybWF0LgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBMaWtld2lzZS4gIERvbid0IGluY3JlbWVudCBsb29wIHZhcmlhYmxlIGluCi0JZm9yIGxvb3AgdGVzdCwgc2luY2UgdGhhdCBza2lwcyB0aGUgZmlyc3QgZWxlbWVudC4KLQkoZGlzcGxheV90YXJnZXRfdGFibGVzKTogUmV3cml0ZSBsb29wIGZvciBjbGFyaXR5LiAgRW5zdXJlIHRoYXQgaXQKLQlhbHdheXMgcHJpbnRzIGF0IGxlYXN0IG9uZSBlbGVtZW50LgotCi0JKiBubG1jb252LmMgKG1haW4pOiBVc2UgQ3lHblVzRXggcmF0aGVyIHRoYW4gQ3lHblVzU2VDcyBmb3IKLQlzZWN0aW9ucyBoZWFkZXIuICBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbnMgdG8gY3lnbnVzX2V4dC4KLQotVGh1IEFwciAyMSAxMjoxMjoyNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoX0RVTU1ZX05BTUVfKTogRG9uJ3QgZGVmaW5lLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIHRtcG5hbSB0byBnZXQgYSBmaWxlIG5hbWUgcmF0aGVyIHRoYW4KLQl1c2luZyBfRFVNTVlfTkFNRV8uICBVbmxpbmsgaXQgd2hlbiBkb25lLgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBMaWtld2lzZS4KLQotCSogbmxtY29udi5jIChzZWNzZWMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtYWluKTogQ3JlYXRlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIGluIG91dHB1dCBCRkQuICBTdG9yZQotCWluZm9ybWF0aW9uIGFib3V0IGl0IGluIHNlY3Rpb25zIGhlYWRlci4KLQkoc2V0dXBfc2VjdGlvbnMpOiBBbGxvY2F0ZSBzcGFjZSBpbiBzZWN0aW9ucyBoZWFkZXIuCi0JKGNvcHlfc2VjdGlvbnMpOiBDb3B5IHplcm8gc2l6ZWQgc2VjdGlvbnMuICBQdXQgaW5mb3JtYXRpb24gYWJvdXQKLQllYWNoIHNlY3Rpb24gaW4gdGhlIHNlY3Rpb25zIGhlYWRlci4KLQotV2VkIEFwciAyMCAxNDozNDo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IFRha2UgbmV3IG91dGJmZCBhcmd1bWVudC4KLQlDaGFuZ2UgY2FsbGVyLiAgQ3JlYXRlIGN1c3RvbSBoZWFkZXIgZm9yIG5ldyBQb3dlclBDIE5ldFdhcmUKLQlmb3JtYXQuCi0KLQkqIE1ha2VmaWxlLmluIChubG1oZWFkZXIubywgbmxtY29udi5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIG5sbWNvbnYuYzogSW5jbHVkZSBiZmQuaCBhbmQgbGliaWJlcnR5Lmggd2l0aCAiIiwgbm90IDw+LgotCSogbmxtaGVhZGVyLnk6IEluY2x1ZGUgYmZkLmggd2l0aCAiIiwgbm90IDw+LgotCi1XZWQgQXByIDEzIDEwOjUyOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBEbyBhbiBpZmRlZiBvbiBfX0dPMzJfXywgbm90IHVuaXguCi0KLVdlZCBBcHIgIDYgMjE6NTQ6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkZWQgLUQgKC0tZHluYW1pYykgb3B0aW9uIHRvIG5tIGFuZCAtVCAoLS1keW5hbWljLXN5bXMpIGFuZCAtUgotCSgtLWR5bmFtaWMtcmVsb2MpIGFyZ3VtZW50cyB0byBvYmpkdW1wLgotCSogbm0uYyAoZHluYW1pYyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZGVkICJkeW5hbWljIi4KLQkodXNhZ2UpOiBNZW50aW9uIC1EIGFuZCAtLWR5bmFtaWMuCi0JKG1haW4pOiBBZGQgRCB0byBnZXRvcHQgc3RyaW5nLiAgSGFuZGxlIC1EIGJ5IHNldHRpbmcgZHluYW1pYy4KLQkoZGlzcGxheV9yZWxfZmlsZSk6IElmIGR5bmFtaWMgaXMgbm9uLXplcm8sIHJlYWQgZHluYW1pYyBzeW1ib2xzCi0JcmF0aGVyIHRoYW4gbm9ybWFsIHN5bWJvbHMuCi0JKiBubS4xOiBVcGRhdGVkIGZvciAtRCAoLS1keW5hbWljKSBvcHRpb24uCi0JKiBvYmpkdW1wLmMgKGR1bXBfZHluYW1pY19zeW10YWIpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGR5bnN5bXMsIGR5bnN5bWNvdW50KTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKHVzYWdlKTogTWVudGlvbiAtUiwgLVQsIC0tZHluYW1pYy1zeW1zIGFuZCAtLWR5bmFtaWMtcmVsb2MuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZGVkICJkeW5hbWljLXJlbG9jIiBhbmQgImR5bmFtaWMtc3ltcyIuCi0JKHNsdXJwX3N5bXRhYik6IElmIG5vIHN5bWJvbHMsIHJldHVybiByYXRoZXIgdGhhbiBleGl0LgotCShzbHVycF9keW5hbWljX3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9iZmQpOiBIYW5kbGUgZHVtcF9keW5hbWljX3N5bXRhYiBhbmQKLQlkdW1wX2R5bmFtaWNfcmVsb2NfaW5mby4KLQkoZHVtcF9zeW1ib2xzKTogVGFrZSBuZXcgZHluYW1pYyBhcmd1bWVudCwgaW5kaWNhdGluZyB3aGV0aGVyIHRvCi0JZGlzcGxheSBkeW5hbWljIHN5bWJvbHMuCi0JKGR1bXBfcmVsb2NzKTogTW92ZSBtb3N0IHByaW50aW5nIGludG8gZHVtcF9yZWxvY19zZXQuCi0JKGR1bXBfZHluYW1pY19yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGR1bXBfcmVsb2Nfc2V0KTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbSBkdW1wX3JlbG9jcy4KLQkobWFpbik6IEFkZCBSIGFuZCBUIHRvIGdldG9wdCBzdHJpbmcuICBIYW5kbGUgLVQgYnkgc2V0dGluZwotCWR1bXBfZHluYW1pY19zeW10YWIgYW5kIC1SIGJ5IHNldHRpbmcgZHVtcF9keW5hbWljX3JlbG9jX2luZm8uCi0JKiBvYmpkdW1wLjE6IFVwZGF0ZWQgZm9yIC1SICgtLWR5bmFtaWMtcmVsb2MpIGFuZCAtVAotCSgtLWR5bmFtaWMtc3ltcykgb3B0aW9ucy4KLQkqIGJpbnV0aWxzLnRleGk6IFVwZGF0ZWQgZm9yIG5ldyBubSBhbmQgb2JqZHVtcCBvcHRpb25zLgotCi1XZWQgTWFyIDMwIDE1OjUyOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVVwZGF0ZSBmb3IgcmVjZW50IEJGRCBjaGFuZ2VzIHRvIHN5bWJvbCBhbmQgcmVsb2MgcmVhZGluZy4gIFJlbmFtZQotCWFsbCB1c2VzIG9mIGdldF9zeW10YWJfdXBwZXJfYm91bmQgdG8gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQuCi0JQWxzbzoKLQkqIGNvZmZncm9rLmMgKHN5bWNvdW50KTogQ2hhbmdlIHRvIGxvbmcuCi0JKGRvX3NlY3Rpb25zX3AxKTogQ2hlY2sgZm9yIGVycm9yIHJldHVybiBmcm9tCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZC4gIENoYW5nZSByZWxjb3VudCB0byBsb25nLCBhbmQgY2hlY2sgZm9yCi0JZXJyb3IgZnJvbSBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShjb2ZmX2dyb2spOiBDaGFuZ2Ugc3RvcmFnZSB0byBsb25nLiAgQ2hlY2sgZm9yIGVycm9yIGZyb20KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2Ugc3ltY291bnQsIG5ld3N5bWFsbG9jLCBuZXdzeW1jb3VudCwgYW5kCi0JaSB0byBsb25nLiAgQ2hlY2sgZm9yIGVycm9yIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKGNvcHlfc2VjdGlvbnMpOiBDaGFuZ2UgcmVsb2Nfc2l6ZSBhbmQgcmVsb2NfY291bnQgdG8gbG9uZy4gIENoZWNrCi0JZm9yIGVycm9yIGZyb20gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShtYW5nbGVfcmVsb2NzLCBpMzg2X21hbmdsZV9yZWxvY3MsIGFscGhhX21hbmdsZV9yZWxvY3MpOiBDaGFuZ2UKLQlyZWxvY19jb3VudF9wdHIgYXJndW1lbnQgdG8gbG9uZyAqLiAgTWFrZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8KLQl2YXJpYWJsZXMgbG9hZGVkIGZyb20gKnJlbG9jX2NvdW50X3B0ci4KLQkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBDaGFuZ2Ugc3RvcmFnZSBhbmQgc3ltY291bnQgdG8gbG9uZy4KLQlDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogQ2hhbmdlIHN5bWNvdW50LCBzcmNfY291bnQgYW5kCi0JZHN0X2NvdW50IHRvIGxvbmcuCi0JKGNvcHlfb2JqZWN0KTogQ2hhbmdlIHN5bWNvdW50IHRvIGxvbmcuICBQYXNzIGFub3RoZXIgYXJndW1lbnQgdG8KLQlmcHJpbnRmLiAgQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCShjb3B5X3NlY3Rpb24pOiBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogQ2hhbmdlIHJlbGNvdW50IGFuZCBpIHRvIGxvbmcuCi0JQ2hlY2sgZm9yIGVycm9ycyBmb3JtIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkqIG9iamR1bXAuYyAoc3RvcmFnZSk6IFJlbW92ZSBnbG9iYWwgdmFyaWFibGUuCi0JKHN5bWNvdW50KTogQ2hhbmdlZCB0byBsb25nLgotCShzbHVycF9zeW10YWIpOiBOZXcgbG9jYWwgdmFyaWFibGUgc3RvcmFnZS4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6IENoYW5nZSByZXR1cm4gdmFsdWUgYW5kIGNvdW50IHRvIGxvbmcuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IENoYW5nZSBtaW4sIG1heCwgdGhpc3BsYWNlIGFuZCBpIHRvIGxvbmcuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDaGFuZ2UgaSB0byBsb25nLgotCShkdW1wX3N5bWJvbHMpOiBDaGFuZ2UgY291bnQgdG8gbG9uZy4KLQkoZHVtcF9yZWxvY3MpOiBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9yZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKGRpc3BsYXlfaW5mb190YWJsZSk6IEFkZCBjYXN0cyB3aGVuIHBhc3NpbmcgTE9OR0VTVF9BUkNIIGZvcgotCXByaW50ZiAlKiBhcmd1bWVudC4KLQotVHVlIE1hciAyOSAxNDo1OTowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5tLmMgKGRpc3BsYXlfYXJjaGl2ZSk6IENsb3NlIGVhY2ggYXJjaGl2ZSBlbGVtZW50IGFmdGVyIGl0IGhhcwotCWJlZW4gZGlzcGxheWVkLgotCSogb2JqZHVtcC5jIChkaXNwbGF5X2ZpbGUpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyOCAxMzowNDowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgdG8gcmVmZXIgdG8gYmZkL2NvbmZpZy5iZmQKLQlyYXRoZXIgdGhhbiBiZmQvY29uZmlndXJlLmluLgotCi1TdW4gTWFyIDI3IDE2OjIzOjM5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNb3JlIGZpeGVzIGZvciBvYmplY3QgZm9ybWF0cyB3aGljaCBhbGxvdyBtdWx0aXBsZSBzZWN0aW9ucwotCXdpdGggdGhlIHNhbWUgbmFtZToKLQkqIG9iamNvcHkuYyAoc2V0dXBfc2VjdGlvbik6IE1ha2UgYSBuZXcgb3V0cHV0IHNlY3Rpb24gZXZlbiBpZgotCW9uZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCShjb3B5X3NlY3Rpb24pOiBVc2UgaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uIHJhdGhlciB0aGFuIHRyeWluZwotCXRvIGxvb2sgdGhlIG91dHB1dCBzZWN0aW9uIHVwIGJ5IGl0cyAocG9zc2libHkgbm9uLXVuaXF1ZSkgbmFtZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IExvb2sgZm9yIGJpbnV0aWxzLmluZm8gaW4gdGhlCi0JY3VycmVudCBkaXJlY3RvcnksIHRoZW4gaW4gJChzcmNkaXIpLiAgRG9uJ3QgdXNlICQ8LgotCi1Nb24gTWFyIDIxIDEyOjU1OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUgd2l0aAotCXByb3RvdHlwZS4gIENoYW5nZSB2YXJkaWZmIGZyb20gaW50IHRvIGJmZF9zaWduZWRfdm1hLiAgQ29ycmVjdAotCWJpbmFyeSBzZWFyY2ggdGVybWluYXRpb24gY29uZGl0aW9uLiAgV2hlbiBsb29raW5nIGZvciBzYW1lCi0Jc2VjdGlvbiBzeW1ib2wgaW4gcmVsb2NhdGFibGUgZmlsZSwgaGFuZGxlIGZpbmFsIHN5bWJvbCBjb3JyZWN0bHkuCi0KLVN1biBNYXIgMjAgMTE6MjY6MzYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiBBdm9pZCBidWcgaW4gaHB1eCBzZWQuCi0KLQkqIG9iamNvcHkuYzogQ2hhbmdlcyB0byBrZWVwIGl0IGZyb20gc3RyaXBwaW5nIHN5bWJvbHMgdXNlZAotCWluIG91dHB1dCByZWxvY2F0aW9ucy4KLQkobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBNYXJrIHN5bWJvbHMKLQl1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyB3aXRoIEJTRl9LRUVQLgotCShmaWx0ZXJfc3ltYm9scyk6IERvIG5vdCBzdHJpcCBzeW1ib2xzIG1hcmtlZCB3aXRoIEJTRl9LRUVQLgotCShjb3B5X29iamVjdCk6IFJlb3JkZXIgYWN0aW9ucy4gIEZpcnN0IHNldHVwIHNlY3Rpb25zLCB0aGVuCi0JYnVpbGQgdGhlIG91dHB1dCBzeW1ib2wgdGFibGUsIHRoZW4gY29weSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQotRnJpIE1hciAxOCAxMDo1Mzo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG51bGwgYnl0ZS4gIEZyb20KLQlSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgotCi1UaHUgTWFyIDE3IDE2OjIwOjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEJ1aWx0IG5tLm5ldyBhbmQgc3RyaXAubmV3IHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKLQljb2xsZWN0IHdoZW4gLiBpcyBpbiBQQVRILgotCShTVFJJUF9QUk9HKTogQ2hhbmdlIGZyb20gc3RyaXAgdG8gc3RyaXAubmV3LgotCShOTV9QUk9HKTogQ2hhbmdlIGZyb20gbm0gdG8gbm0ubmV3LgotCShpbnN0YWxsKTogUmVtb3ZlIHRoZSAubmV3IHdoZW4gaW5zdGFsbGluZy4KLQotV2VkIE1hciAxNiAxNjoyNzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IFNldCBCU0ZfRFlOQU1JQyBmbGFnIGZvciBlYWNoCi0Jc3ltYm9sIGZvciB3aGljaCB3ZSBidWlsZCBhIHN0dWIuCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IE9ubHkgcmVzZXQgVE9DIHBvaW50ZXIgZm9yIGEgY2FsbCB0byBhCi0Jc3ltYm9sIHdpdGggQlNGX0RZTkFNSUMgZmxhZyBzZXQuCi0KLVR1ZSBNYXIgMTUgMjM6MDQ6MTMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsIHRvIGRldGVybWluZQotCWlmIGEgc3ltYm9sIHJlcHJlc2VudHMgYSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgbGFiZWwuCi0JKGNvcHlfb2JqZWN0KTogR2l2ZSB0aGUgQkZEIGJhY2tlbmRzIGEgY2hhbmNlIHRvIGNvcHkgYW55IHByaXZhdGUKLQliZmQgZGF0YSBmcm9tIHRoZSBpbnB1dCBCRkQgdG8gdGhlIG91dHB1dCBCRkQuCi0JKHNldHVwX3NlY3Rpb24pOiBHaXZlIHRoZSBCRkQgYmFja2VuZHMgYSBjaGFuY2UgdG8gY29weSBhbnkgcHJpdmF0ZQotCXNlY3Rpb24gZGF0YSBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4KLQotTW9uIE1hciAxNCAxMToxNTo1OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqY29weS5jIChtYW5nbGVfc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKHNldHVwX3NlY3Rpb24pOiBTZXQgb3NlY3Rpb24gaGVyZSBpbnN0ZWFkIG9mIGNhbGxpbmcKLQltYW5nbGUgc2VjdGlvbiB0byBkbyBpdC4KLQotTW9uIE1hciAxNCAxMjoxMTowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUpOiBDbG9zZSBpbmFyY2ggYmVmb3JlIHVubGlua2luZyBpdC4KLQotRnJpIE1hciAxMSAyMjoyMDo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvciBQb3dlclBDLCBjYWxsIHBvd2VycGNfYnVpbGRfc3R1YnMgYW5kCi0JcG93ZXJwY19yZXNvbHZlX3N0dWJzLiAgVXNlIF9fR09UMCwgbm90IF9fdG9jX3N0YXJ0LiAgSGFuZGxlIGl0IGlmCi0JdGhlIHN0YXJ0IGFuZCBlbmQgc3ltYm9scyBhcmUgbm90IGluIHRoZSB0ZXh0IHNlY3Rpb24uCi0JKHN0cnVjdCBwb3dlcnBjX3N0dWIpOiBOZXcgc3RydWN0IGRlZmluaXRpb24uCi0JKHBvd2VycGNfc3R1YnMsIHBvd2VycGNfc3R1Yl9pbnNucyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShwb3dlcnBjX2luaXRpYWxfZ290X3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwb3dlcnBjX2J1aWxkX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShwb3dlcnBjX3Jlc29sdmVfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENsZWFyIGV4dHJhbmVvdXMgZGF0YSBpbiAuZ290IHNlY3Rpb24uCi0JUmVhcnJhbmdlIHJlbG9jIGhhbmRsaW5nIHRvIGhhbmRsZSBFTEYgcmVsb2NzIHRoYXQgYXJlIG5vdAotCXBhcnRpYWxfaW5wbGFjZS4gIFJlc29sdmUgUEMgcmVsYXRpdmUgcmVsb2NzLgotCi1XZWQgTWFyICA5IDEzOjQ4OjExIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1vdmVfbWVtYmVycyk6IEZpeCBpdCBzbyB0aGF0IHRoZSBhYmkgcG9zaXRpb25hbCBtb2RpZmllcnMKLQlkb24ndCBkZWxldGUgYWxsIGFyY2hpdmUgbWVtYmVycyBmb2xsb3dpbmcgdGhlIGluc2VydCBwb2ludC4KLQotVHVlIE1hciAgOCAxMzoxNDo0MyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5bY2hdOiBOZXcgZmlsZXMsIHVuZGVyc3RhbmQgY29mZiBvYmplY3RzLgotCSogY29mZmR1bXAuYzogVXNlcyBjb2ZmZ3JvayB0byBkdW1wIG91dCB0aGUgZGVidWcgaW5mbyBvZiBhIGNvZmYKLQlmaWxlLgotCSogc3lzcm9mZi5pbmZvOiBEZXNjcmlwdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGUuCi0JKiBzeXNpbmZvLnksIHN5c2xleC5sOiBQYXJzZSBpbmZvIGZpbGUsIGdlbmVyYXRlIGEgcmVhZGVyLCB3cml0ZXIsCi0JaGVhZGVyIGZpbGVzIGFuZCBhIHByaW50ZXIuCi0JKiBzcmNvbnYuYzogVXNlcyBjb2ZmZ3Jvay5jIGFuZCBzeXNyb2ZmLmluZm8gdG8gY29udmVydCBhIGNvZmYKLQlmaWxlIHRvIGEgU1lTUk9GRiBmaWxlLgotCi1TYXQgRmViIDI2IDEzOjM1OjI2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAoZG9fcXVpY2tfYXBwZW5kKTogUGFkIHdpdGggYSBnZW51aW5lIGNoYXJhY3RlciAxMCwKLQlyYXRoZXIgdGhhbiB3aGF0ZXZlciAnXG4nIG1pZ2h0IGhhcHBlbiB0byBiZS4KLQotVHVlIEZlYiAyMiAxODoyNTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IElnbm9yZSBkZWJ1Z2dpbmcgc3ltYm9scyB3aGVuIGxvb2tpbmcgZm9yCi0Jc3BlY2lhbCBzeW1ib2xzIGJ5IG5hbWUuCi0KLVN1biBGZWIgMjAgMTg6NDc6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotCVN1cHBvcnQgZm9yIFBvd2VyUEMgTmV0V2FyZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvciBQb3dlclBDIE5ldFdhcmUsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHRoZQotCXNwZWNpYWwgc3ltYm9scyBfX3RvY19zdGFydC4KLQkoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBIYW5kbGUgYmZkX2FyY2hfcG93ZXJwYy4KLQkobWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBGZWIgMTcgMDk6Mjg6MjMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jLCBidWNvbW0uYywgbmxtY29udi5jLCBubS5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYywKLQlzaXplLmM6IFVzZSBiZmRfZ2V0X2Vycm9yIGFuZCBiZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCi0KLUZyaSBGZWIgMTEgMTU6NTQ6NTEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IEFkZCBtaXNzaW5nICdicmVhaycgaW4gc3dpdGNoLgotCi1Nb24gRmViICA3IDE5OjQ1OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIGJmZF9hcmNoX3Bvd2VycGMuCi0KLVN1biBGZWIgIDYgMjI6MDg6MjAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLmMgb2JqZHVtcC5jIG5sbWNvbnYuYyBvYmpjb3B5LmMgbm0uYyBhci5jIHNpemUuYyAobWFpbik6Ci0JQ2FsbCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUuCi0KLUZyaSBGZWIgIDQgMTA6NDY6MDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9ieXRlcyk6IE1ha2UgTUVNSFVOSyBhIGNoYXIgKiwgbm90IFBUUiwgc28gd2UKLQljYW4gZG8gYXJpdGhtZXRpYyBvbiBpdC4KLQotVGh1IEZlYiAgMyAxNDowNjo0MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzLCByZWFkX3NlY3Rpb25fc3RhYnMsCi0JcHJpbnRfc2VjdGlvbl9zdGFicyk6IEZ1bmN0aW9ucyBicm9rZW4gb3V0IG9mIGR1bXBfc3RhYnNfMS4KLQlGcmVlIHRoZSBzdGFicyBhbmQgc3RyaW5ncyB3aGVuIGRvbmUgd2l0aCB0aGVtLgotCi1XZWQgRmViICAyIDEzOjQyOjIzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogVXNlIGJmZF9nZXRfZmxhdm91ciBpbnN0ZWFkIG9mIHN0cnVjdCBtZW1iZXIuCi0JKiBhci5jIChwcmludF9jb250ZW50cywgZXh0cmFjdF9maWxlKSwgc2l6ZS5jCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCwgcHJpbnRfc3lzdl9mb3JtYXQpOiBVc2UgYmZkX2dldF9maWxlbmFtZSBhbmQKLQliZmRfbXlfYXJjaGl2ZSBpbnN0ZWFkIG9mIGRlcmVmZXJlbmNpbmcgdGhlIHN0cnVjdHMgZGlyZWN0bHkuCi0KLQkqIGFyLmM6IFVzZSBiZmRfZmF0YWwgYW5kIGJmZF9ub25mYXRhbCBpbnN0ZWFkIG9mIGJmZF9wZXJyb3IgYW5kIGV4aXQuCi0JSW5kZW50LiAgUmVtb3ZlIERFRlVOcy4KLQotCSogbmxtY29udi5jIChtYWluKSwgb2JqY29weS5jIChjb3B5X2ZpbGUpOiBQcmludCBtYXRjaGluZyBmb3JtYXRzCi0JaWYgYW1iaWd1b3VzIG1hdGNoLgotCSogbm0uYyAoZGlzcGxheV9maWxlLCBkaXNwbGF5X2FyY2hpdmUpLCBzaXplLmMgKGRpc3BsYXlfYmZkKToKLQlFbGltaW5hdGUgZ290b3MuCi0JUHJpbnQgbWF0Y2hpbmcgZm9ybWF0cyBpZiB0aGVyZSBpcyBhbiBhbWJpZ3VvdXMgbWF0Y2guICBVc2UKLQliZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBoYXJkY29kZWQgZXJyb3IgbWVzc2FnZSBpZiBub3RoaW5nIG1hdGNoZXMuCi0KLQkqIGFyc3VwLmMsIGFyLmMsIG9iamR1bXAuYzogVXNlIGJmZF9nZXRfZmlsZW5hbWUgaW5zdGVhZCBvZgotCWFiZmQtPmZpbGVuYW1lLgotCi0JKiBubS5jIChkaXNwbGF5X2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24sIGZyb20gY29kZSBpbiBkaXNwbGF5X2ZpbGUuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBSZW5hbWVkIGZyb20gZG9fb25lX3JlbF9maWxlLgotCi0JKiBzaXplLmM6IEluZGVudC4KLQkoZGlzcGxheV9hcmNoaXZlKTogTmV3IGZ1bmN0aW9uIGZyb20gY29kZSBpbiBkaXNwbGF5X2ZpbGUuCi0JKGRpc3BsYXlfZmlsZSk6IENoZWNrIGJmZF9jbG9zZSBlcnJvciByZXR1cm4uCi0KLQkqIHN0cmluZ3MuYyAoc3RyaW5nc19vYmplY3RfZmlsZSk6IENoZWNrIGJmZF9jaGVja19mb3JtYXQKLQllcnJvciByZXR1cm4uCi0KLQkqIHN0cmluZ3MuYywgb2JqZHVtcC5jLCBzaXplLmM6IFVzZSBiZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBiZmRfcGVycm9yLgotCi0JKiBidWNvbW0uYzogRGVsZXRlIHJlZmVyZW5jZXMgdG8gZXhpdF9oYW5kbGVyLiAgSXQgd2Fzbid0IHNldAotCWFueXdoZXJlLCBhbmQgbm93IHRoYXQgd2UncmUgdXNpbmcgdGhlIGxpYmliZXJ0eSB4bWFsbG9jLCBpdAotCXdvdWxkbid0IGFsd2F5cyBnZXQgY2FsbGVkIGJlZm9yZSBleGl0aW5nLgotCShsaXN0X21hdGNoaW5nX2Zvcm1hdHMpOiBGdW5jdGlvbiBtb3ZlZCBmcm9tIG9iamR1bXAuYy4KLQkqIGJ1Y29tbS5oOiBEZWNsYXJlIGl0LgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBNb3ZlIHNvbWUgdmFyaWFibGUgZGVjbHMgY2xvc2VyIHRvCi0JdGhlaXIgdXNlLiAgQWRkIHNvbWUgY29tbWVudHMuICBSZXBsYWNlIGEgbmVzdGVkIGJsb2NrIHdpdGggYQotCXJldHVybi4KLQotTW9uIEphbiAzMSAxODo1MDo0MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCwgZGlzcGxheV9pbmZvX3RhYmxlKTogQ2hlY2sgdGhhdAotCXRoZSBiZmQgb2YgdGhlIGR1bW15IG91dHB1dCBmaWxlIGlzIG5vdCBudWxsLgotCi1XZWQgSmFuIDI2IDEzOjEzOjE4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNvcHlfc2VjdGlvbik6IENhbGwgaXQuCi0JKGNvcHlfb3B0aW9ucywgY29weV91c2FnZSwgY29weV9tYWluKTogQWRkIC0tYnl0ZSBvcHRpb24gdG8KLQlhY3RpdmF0ZSBpdC4gIEFwcHJvcHJpYXRlIHRoZSAtYiBvcHRpb24gKHdoaWNoIHdhcyBhbiB1bmRvY3VtZW50ZWQKLQlzeW5vbnltIGZvciAtRikgZm9yIGl0LCBhbHNvLiAgQWRkIC0taW50ZXJsZWF2ZSwgLWkgb3B0aW9uIGZvcgotCWFkZGl0aW9uYWwgY29udHJvbC4KLQkoc2V0dXBfc2VjdGlvbiwgY29weV9zZWN0aW9uLCBtYW5nbGVfc2VjdGlvbik6IFJlbmFtZWQgd2l0aCBubyBgcycKLQlvbiB0aGUgZW5kLgotCSogb2JqY29weS4xLCBiaW51dGlscy50ZXhpOiBEb2N1bWVudCB0aGUgbmV3IG9wdGlvbnMuCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfdGFibGVzLCBkaXNwbGF5X3RhcmdldF9saXN0KToKLQlOZXcgZnVuY3Rpb25zIGJyb2tlbiBvdXQgb2YgZGlzcGxheV9pbmZvLgotCUVsaW1pbmF0ZSBzb21lIG1hZ2ljIGNvbnN0YW50cy4gIFVzZSBtb3JlIG1lYW5pbmdmdWwgdmFyaWFibGUgbmFtZXMuCi0JKGR1bXBfYmZkX2hlYWRlcik6IE5ldyBmdW5jdGlvbiBicm9rZW4gb3V0IG9mIGRpc3BsYXlfYmZkLgotCShkdW1wX3NlY3Rpb25faGVhZGVyKTogTmV3IGZ1bmN0aW9uIGJyb2tlbiBvdXQgb2YgZHVtcF9oZWFkZXJzLgotCShyZW1vdmVfdXNlbGVzc19zeW1ib2xzKTogRG9uJ3Qgc2hhZG93IGdsb2JhbCB2YXJpYWJsZSBuYW1lIHdpdGgKLQlwYXJhbWV0ZXIuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IEZpeCBiYWNrd2FyZCB0ZXN0LgotCi1UdWUgSmFuIDI1IDE5OjQwOjU0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogQ2hhbmdlIGRlY2wgb2YgYHdoZW4nIHRvIHRpbWVfdC4KLQkqIG9iamR1bXAuaDogUmVtb3ZlZC4KLQotTW9uIEphbiAyNCAxMzoyOTowMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9maWxlKTogUmVtb3ZlIGNhbGwgdG8gbGlzdF9tYXRjaGluZ19mb3JtYXRzLgotCUl0IHdvdWxkIG5ldmVyIGJlIGNhbGxlZC4KLQkobGlzdF9tYXRjaGluZ19mb3JtYXRzKTogVGFrZSBhbiBhcmcgZ2l2aW5nIHRoZSBsaXN0IG9mIG1hdGNoaW5nCi0JZm9ybWF0cy4KLQkoZGlzcGxheV9iZmQpOiBQYXNzIHRoZSBhcmcsIGFuZCBnZXQgaXQgZmlsbGVkIGluIGJ5IGNhbGxpbmcKLQliZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgaW5zdGVhZCBvZiBiZmRfY2hlY2tfZm9ybWF0LgotCShkaXNwbGF5X2luZm8sIGRpc3BsYXlfaW5mb190YWJsZSk6IHRhcmdldF92ZWN0b3Igd2FzIHJlbmFtZWQgdG8KLQliZmRfdGFyZ2V0X3ZlY3Rvci4KLQotCSogYmludXRpbHMudGV4aSAob2JqZHVtcCk6IE5vdGUgc29tZSBsaW1pdGF0aW9ucyBvZiAtaCBzZWN0aW9uCi0JYWRkcmVzcyBwcmludGluZy4KLQotU2F0IEphbiAyMiAxNjoyMDo0NiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUxMT0MpOiBTZXQgdG8gZW1wdGluZXNzIGJ5IGRlZmF1bHQuCi0JKEFMTF9DRkxBR1MpOiBBZGQgYW5kIHVzZS4KLQkoYXJwYXJzZS5oKTogTWFrZSBpdCBkZXBlbmQgb24gYXJwYXJzZS55LgotCSogYXIuYyAobGliYmZkLmgpOiBEb24ndCByZXF1aXJlIHRvIGJlIGluIC4uL2JmZC4KLQkqIG9iamR1bXAuYyAoY29tcCk6IFJlbmFtZSB0byBjb21wYXJlX3N5bWJvbHMuCi0KLUZyaSBKYW4gMjEgMjA6MjI6MzAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyk6IElmIHRoZSBmaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMsCi0JcHJpbnQgdGhlIG1hdGNoaW5nIG5hbWVzIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugb25lLgotCShkaXNwbGF5X2JmZCk6IENhbGwgaXQuCi0JKGRpc3BsYXlfZmlsZSk6IENhbGwgaXQuCi0KLUZyaSBKYW4gMjEgMTk6MTc6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTdXBwb3J0IGJmZF9hcmNoX3JzNjAwMC4KLQotTW9uIEphbiAxNyAxMzo1NzoyNSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc3RhYl9uYW1lKTogQWxsb2NhdGUgZHluYW1pY2FsbHkuCi0JKHN0YWJfcHJpbnQpOiBVc2UgcG9pbnRlcnMgdG8gc3RyaW5ncyBpbnN0ZWFkIG9mIGNoYXIgYXJyYXlzLgotCShkdW1wX3N0YWJzKTogQ2hhbmdlIGFsbG9jIGFuZCBpbml0IG9mIGFycmF5cyBhcHByb3ByaWF0ZWx5LgotCShkdW1wX3N0YWJzXzEpOiBBbHdheXMgZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQgc3RhYl9uYW1lIG9yCi0JdGhlIHN0YWIncyB0eXBlIG51bWJlciwgaWYgdW5uYW1lZC4KLQotRnJpIEphbiAxNCAxNDo0Mjo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbiwgY29weV9tYWluKTogRG9uJ3QgY2xvYmJlciB0aGUgaW5wdXQgZmlsZQotCWlmIGNvcHlfZmlsZSBmYWlscy4KLQotCSogbmxtY29udi5jIChtYWluKTogV2FybiBhYm91dCBhbiBhdHRlbXB0IHRvIHVzZSBhIHNoYXJlZCBsaWJyYXJ5Ci0Jd2l0aCB1bmluaXRpYWxpemVkIGRhdGEuCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBNYWtlIHN1cmUgdGhhdCB3ZSBhbGlnbiB0aGUKLQlvdXRwdXRfb2Zmc2V0IG9mIGVhY2ggaW5wdXQgc2VjdGlvbiBhcHByb3ByaWF0ZWx5LgotCi1UaHUgSmFuIDEzIDE3OjMyOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX3JlbG9jcyk6IERvbid0IGNyYXNoIGlmIHNlY3Rpb24gbmFtZSBpcyBOVUxMLgotCi1UdWUgSmFuIDExIDE5OjQ2OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZmlsZW1vZGUuYyAoZmlsZW1vZGVzdHJpbmcpOiBDb21tZW50ZWQgb3V0OyBub3QgdXNlZC4KLQkobW9kZV9zdHJpbmcpOiBVc2UgUE9TSVggZGVmaW5pdGlvbnMuCi0JKGZ0eXBlbGV0KTogTGlrZXdpc2UuCi0JKHJ3eCk6IFJlbW92ZWQ7IG5vIGxvbmdlciB1c2VkLgotCSogYnVjb21tLmM6IEluY2x1ZGUgYnVjb21tLmguCi0JKGJmZF9ub25mYXRhbCwgYmZkX2ZhdGFsKTogQXJndW1lbnQgaXMgY29uc3QuCi0JKGZhdGFsKTogTWFrZSBfX1NURENfXyB2ZXJzaW9uLgotCSogYnVjb21tLmggKG1vZGVfc3RyaW5nKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluIChidWNvbW0ubyk6IERlcGVuZCB1cG9uIGJ1Y29tbS5oCi0KLVN1biBKYW4gIDkgMTI6MDM6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBEZWxldGVkLgotCSogYnVjb21tLmggKHhtYWxsb2MsIHhyZWFsbG9jKTogRml4IHByb3RvdHlwZXMsIHRvIGNvcnJlc3BvbmQgdG8KLQlsaWJpYmVydHkgdmVyc2lvbiBvZiBmdW5jdGlvbnMuCi0KLVRodSBKYW4gIDYgMDY6MTg6MTUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpOiBBZGQgYSBjaGFwdGVyIHN1bW1hcml6aW5nIHRoZSB3YXlzIHRvIHNlbGVjdAotCWFzcGVjdHMgb2YgdGhlIHRhcmdldCBmb3IgZWFjaCBwcm9ncmFtLgotCi0JKiBvYmpkdW1wLmMgKGxvbmdfb3B0aW9ucywgdXNhZ2UpOiBBZGQgbG9uZyBlcXVpdmFsZW50cyBmb3IgYWxsCi0JcmVtYWluaW5nIHNob3J0IG9wdGlvbnMgdGhhdCBsYWNrZWQgdGhlbS4KLQkqIGJpbnV0aWxzLnRleGkgb2JqZHVtcC4xOiBEb2N1bWVudCB0aGVtLgotCi0JKiBzaXplLmMgKHVzYWdlKTogVHdlYWsgdXNhZ2UgbWVzc2FnZS4KLQkqIHNpemUuMTogQWRkIG1pc3NpbmcgYD0nIGluIGV4YW1wbGVzLgotCi0JKiBiaW51dGlscy50ZXhpIHN0cmlwLjEgb2JqY29weS4xIG5sbWNvbnYuMSBvYmpjb3B5LmMgbmxtY29udi5jOgotCVVzZSAiLS10YXJnZXQ9YmZkbmFtZSIgYXMgdGhlIG9wdGlvbiB0byBzZWxlY3QgdGhlIEJGRCB0YXJnZXQsCi0JbGlrZSBubSBhbmQgc2l6ZSBhbHJlYWR5IGRvLgotCVJlc2VydmUgIi0tZm9ybWF0PWZvcm1hdCIgZm9yIHRleHR1YWwgb3V0cHV0IHNlbGVjdGlvbiBvcHRpb25zLCBidXQKLQlmb3Igbm93IGtlZXAgb2xkIG9wdGlvbiBuYW1lcyBhcyBvYnNvbGV0ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQotCSogc3RyaW5ncy5jIChtYWluLCBzdHJpbmdzX29iamVjdF9maWxlLCB1c2FnZSk6IEFkZCAtLXRhcmdldCBvcHRpb24uCi0JKiBiaW51dGlscy50ZXhpIHN0cmluZ3MuMTogRG9jdW1lbnQgaXQuCi0KLVNhdCBKYW4gIDEgMTM6NTg6MjQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYWluKTogQWRkIFxuIGluIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBEZWMgMjMgMTI6MjM6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBhci5jIChtYWluKTogUHV0IHBhcmVucyBhcm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlLgotCSogb2JqY29weS5jIChzdHJpcF9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBSZXR1cm4gMC4KLQkoY29weV9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBSZXR1cm4gMC4KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9iZmQpOiBEZWNsYXJlIHJldHVybiB2YWx1ZSBhcyB2b2lkLgotCShzdGFiX3ByaW50KTogVXNlICIiIGluc3RlYWQgb2YgMCB0byBpbml0aWFsaXplIGFycmF5LgotCShkdW1wX3N0YWJzXzEpOiBQcmludCB2bWEgdXNpbmcgcHJpbnRmX3ZtYS4KLQkoZGlzcGxheV9pbmZvKTogUHV0IHBhcmVucyBhcm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlLgotCSogc3RyaW5ncy5jIChwcmludF9zdHJpbmdzKTogQ2FzdCBwcmludGYgYXJndW1lbnRzLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfbWFpbik6IFVzZSBjb3B5X29wdGlvbnMsIG5vdCBzdHJpcF9vcHRpb25zLgotCi0JKiBubG1oZWFkZXIueSAoY29tbWFuZCk6IFdhcm4gYWJvdXQgaWxsZWdhbCBkYXRlIHZhbHVlcy4KLQotV2VkIERlYyAxNSAxMToxODowMyAxOTkzICBEYXZpZCBKLiBNYWNLZW56aWUgIChkam1AZnJvc3R5LmVuZy51bWQuZWR1KQotCi0JKiBidWNvbW0uYyBidWNvbW0uaDogUnVuIHRocm91Z2ggaW5kZW50LiAgRGUtYW5zaWRlY2wtaWZ5LgotCShiZmRfbm9uZmF0YWwpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9mYXRhbCk6IENhbGwgaXQuCi0KLQkqIG9iamNvcHkuYyAoc21hcnRfcmVuYW1lKTogRG8gYSBjb3B5IGlmIHRoZSBkZXN0IGZpbGUgaGFzCi0JbXVsdGlwbGUgaGFyZCBsaW5rcy4gIFJlbW92ZSBzb3VyY2UgZmlsZSBvbiBzdWNjZXNzZnVsIGNvcHkuCi0JVHJ5IHRvIHByZXNlcnZlIG1vZGUgYW5kIG93bmVyIG9uIHN1Y2Nlc3NmdWwgcmVuYW1lLgotCi0JKiBvYmpjb3B5LmM6IFJ1biB0aHJvdWdoIGluZGVudC4gIENsZWFuIHVwIGEgYml0LgotCU1ha2UgZ2xvYmFsIHZhcmlhYmxlcyBzdGF0aWMuCi0JTWFrZSB7aW5wdXQsb3V0cHV0fV97dGFyZ2V0LGZpbGVuYW1lfSwgc2hvd192ZXJzaW9uIGxvY2FsCi0JdG8gdmFyaW91cyBmdW5jdGlvbnMuCi0JTmV3IGdsb2JhbCB2YXJpYWJsZSBgc3RhdHVzJyBmb3IgZXhpdCBzdGF0dXMuCi0JKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IE5ldyBmdW5jdGlvbnMgd2l0aCBjb2RlIGZyb20gbWFpbi4KLQkobm9uZmF0YWwpOiBOZXcgbWFjcm8uICBVc2UgaXQgZ2xvYmFsbHkgaW5zdGVhZCBvZiBiZmRfcGVycm9yIGFuZAotCWJmZF9mYXRhbC4KLQotCShjb3B5X29iamVjdCk6IENhbGwgbWFuZ2xlX3NlY3Rpb25zIHdpdGggYmZkX21hcF9vdmVyX3NlY3Rpb25zLgotCShtYW5nbGVfc2VjdGlvbnMpOiBBZGp1c3QgZm9yIG5ldyBjYWxsaW5nIGNvbnZlbnRpb24uCi0KLUZyaSBEZWMgMTAgMTE6Mjg6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueSAoY29tbWFuZCk6IEFjY2VwdCBNQVAgYW5kIEZVTExNQVAgd2l0aG91dCBhcmd1bWVudHMuCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSBmb3IgTUFQIGFuZCBGVUxMTUFQLgotCi1UaHUgRGVjICA5IDE3OjQ3OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogV2FybiBhYm91dCBpbXBvcnRlZCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBpbgotCXRoZSBJTVBPUlQgbGlzdCBldmVuIGlmIHRoZSBJTVBPUlQga2V5d29yZCBpcyBub3QgdXNlZC4KLQotCSogbmxtY29udi5jIChkZWJ1ZywgdW5saW5rX29uX2V4aXQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkZWJ1ZyIgYW5kICJsaW5rZXIiLgotCShtYWluKTogSGFuZGxlIC1kIGFuZCAtbCBhcmd1bWVudHMuICBNYWtlIGNvbW1hbmQgbGluZSBpbnB1dCBhbmQKLQlvdXRwdXQgZmlsZXMgb3B0aW9uYWwuICBQYXJzZSB0aGUgY29tbWFuZCBmaWxlIGJlZm9yZSBvcGVuaW5nIHRoZQotCUJGRCdzLCB3aGljaCByZXF1aXJlcyBzdG9yaW5nIG1vcmUgaW5mb3JtYXRpb24gaW4gbG9jYWwgdmFyaWFibGVzLgotCUlmIElOUFVUIG5hbWVzIG11bHRpcGxlIGZpbGVzLCBsaW5rIHRoZW0gdG9nZXRoZXIuICBVc2UgT1VUUFVUIGZvcgotCXRoZSBvdXRwdXQgZmlsZSBuYW1lIGlmIG5vdCBuYW1lZCBvbiBjb21tYW5kIGxpbmUuCi0JKHNob3dfdXNhZ2UpOiBDaGFuZ2VkIGZvciBuZXcgb3B0aW9ucy4KLQkobGlua19pbnB1dHMpOiBOZXcgZnVuY3Rpb24gdG8gYXV0b21hdGljYWxseSBpbnZva2UgbGlua2VyIHRvCi0JaGFuZGxlIG11bHRpcGxlIElOUFVUIGZpbGVzLgotCShjaG9vc2VfdGVtcF9iYXNlX3RyeSwgY2hvb3NlX3RlbXBfYmFzZSwgcGV4ZWN1dGUpOiBOZXcgZnVuY3Rpb25zLAotCW1vc3RseSBjb3BpZWQgZnJvbSBnY2MvZ2NjLmMuCi0JKiBubG1jb252LmggKGlucHV0X2ZpbGVzLCBvdXRwdXRfZmlsZSk6IERlY2xhcmUuCi0JKiBubG1oZWFkZXIueSAoaW5wdXRfZmlsZXMsIG91dHB1dF9maWxlKTogRGVmaW5lLgotCShjb21tYW5kKTogU3VwcG9ydCBJTlBVVCB3aXRoIGEgc3RyaW5nX2xpc3QgYXJndW1lbnQuICBTdXBwb3J0Ci0JT1VUUFVULgotCShzdHJpbmdfbGlzdCk6IFJlbmFtZWQgZnJvbSBtb2R1bGVfbGlzdC4KLQkqIE1ha2VmaWxlLmluIChubG1jb252Lm8pOiBEZWZpbmUgTERfTkFNRSBiYXNlZCBvbgotCXByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLVdlZCBEZWMgIDggMTA6MDk6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueSAobmxtaGVhZGVyX2lkZW50aWZ5KTogTmV3IGZ1bmN0aW9uLiAgVXNlIGl0IHRvIHByaW50Ci0JdGhlIHByb2dyYW0gbmFtZSBqdXN0IG9uY2UsIGluc3RlYWQgb2Ygd2l0aCBldmVyeSBlcnJvciBtZXNzYWdlLgotCi1Nb24gRGVjICA2IDE2OjExOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChsb25nX29wdGlvbnMpOiBDaGFuZ2VkIC0taGVhZGVyLWluZm8gdG8gLS1oZWFkZXItZmlsZQotCXRvIG1hdGNoIGRvY3VtZW50YXRpb24gYW5kIHVzYWdlIG1lc3NhZ2UuCi0KLVN1biBEZWMgIDUgMDE6MzE6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY3MpOiBBdm9pZCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBzeW1fcHRyX3B0cgotCWluIGEgcmVsb2NhdGlvbi4KLQotVGh1IERlYyAgMiAxNjowMDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IENoYW5nZSB2YXJpb3VzIHR5cGVzIGZyb20gYmZkX3NpemVfdHlwZSB0bwotCXNpemVfdCwgc2luY2UgdGhleSBoYXZlIHRvIGJlIGFyZ3VtZW50cyB0byBmcmVhZCBhbmQgZndyaXRlLgotCUNoYW5nZSBzZXQgZnJvbSBjaGFyICogdG8gdW5zaWduZWQgY2hhciAqLgotCShzZWxlY3Rfb3V0cHV0X2Zvcm1hdCk6IE1ha2UgbWFjaCBhcmd1bWVudCB1bnNpZ25lZC4gIEhhbmRsZQotCWJmZF9hcmNoX2FscGhhLgotCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGNvcHkgdGhlIC5yZWdpbmZvIHNlY3Rpb24gb2YgYW4gRUNPRkYKLQlmaWxlLiAgQ2FsbCBiZmRfc2V0X3JlbG9jIHRvIGluaXRpYWxpemUgdGhlIHJlbG9jYXRpb24gZmllbGRzLgotCShjb3B5X3NlY3Rpb25zKTogRG9uJ3QgY29weSB0aGUgLnJlZ2luZm8gc2VjdGlvbiBvZiBhbiBFQ09GRiBmaWxlLgotCUNvbWJpbmUgYWxsIHJlbG9jcyBmb3IgYSBzZWN0aW9uLgotCShtYW5nbGVfcmVsb2NzKTogQ2hhbmdlIHR5cGUgb2YgcmVsb2NzIHRvIHBlcm1pdCBzcGVjaWZpYwotCWZ1bmN0aW9ucyB0byBjaGFuZ2UgaXQuICBDYWxsIGFscGhhX21hbmdsZV9yZWxvY3MgZm9yIGFscGhhLAotCWRlZmF1bHRfbWFuZ2xlX3JlbG9jcyBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcy4KLQkoZGVmYXVsdF9tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLiAgQWRqdXN0IHRoZSBhZGRyZXNzIG9mIGFsbAotCXJlbG9jcyBieSB0aGUgb3V0cHV0X29mZnNldC4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogQ2hhbmdlIHR5cGUgb2YgcmVsb2NzIGFyZ3VtZW50LiAgQ2FzdCBsZW5ndGgKLQlhcmd1bWVudCB0byBtZW1tb3ZlIHRvIHNpemVfdC4KLQkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE5vdiAxNyAxNzozODo1OCAxOTkzICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChzZWxlY3Rfb3V0cHV0X2Zvcm1hdCk6IFVzZSBubG0zMi1zcGFyYyBmb3IKLQliZmRfYXJjaF9zcGFyYy4KLQotV2VkIE5vdiAxNyAxNDo0MTozNSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIG5sbWNvbnYuMTogICBhZGRlZCBtYW4gcGFnZQotCSogb2JqY29weS4xOiAgIGZpeGVkIGZvcm1hdCBlcnJvcnMKLQotV2VkIE5vdiAxNyAxMjowMzo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVc2UgQ0ZMQUdTIGFzIHdlbGwgYXMgTERGTEFHUyB3aGVuIGxpbmtpbmcuCi0KLVdlZCBOb3YgMTcgMDQ6NTA6NTUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLjE6IEZpeCB0eXBvLgotCi1Nb24gTm92IDE1IDEyOjAzOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEJ1aWxkICJpbmZvIi4KLQkoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuMy4xOyAyLjMgaGFzIGdvbmUgb3V0LgotCi1TdW4gTm92IDE0IDAwOjI3OjI0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc3RhYnMpOiBIYW5kbGUgc3RhYnMtaW4tc29tIGFzIGltcGxlbWVudGVkCi0JYnkgdGhlIG5ldyBCRkQgU09NIGFzc2VtYmxlci4KLQotU2F0IE5vdiAxMyAwNzoxNDowNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyLjEgYysrZmlsdC4xIG5tLjEgb2JqY29weS4xIG9iamR1bXAuMSByYW5saWIuMSBzaXplLjEKLQlzdHJpbmdzLjEgc3RyaXAuMTogUmVwbGFjZSBcKGVtIGluIE5BTUUgc2VjdGlvbiB3aXRoIFwtIHNvCi0JbWFrZXdoYXRpcyBjYW4gZ3JvayBpdC4KLQotVHVlIE5vdiAgOSAxNToyMjoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoaTM4Nl9tYW5nbGVfcmVsb2NzKTogQWRqdXN0IHJlbG9jIGFkZHJlc3MgYnkKLQlzZWN0aW9uIG91dHB1dF9vZmZzZXQuCi0KLUZyaSBOb3YgIDUgMTI6MTE6NTIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6ICBhZGRlZCBubG1jb252IGNoYXB0ZXIKLQotV2VkIE5vdiAgMyAxNjoxMDo1MCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVdlZCBOb3YgIDMgMTU6MDk6MjMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCBnZXQgcmlkIG9mIGR2aSBvciBpbmZvIGZpbGVzLgotCi1UdWUgTm92ICAyIDEzOjI5OjU5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChTX0lTTE5LKTogRGVmaW5lIGFzIDAgaWYgdGhlcmUncyBubyBTX0lGTE5LLgotCi1GcmkgT2N0IDI5IDE2OjAyOjM0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogTW92ZSBvYmpjb3B5IGRvY3MgaW50byBhbHBoYWJldGljYWwgb3JkZXIuCi0KLQkqIG9iamR1bXAuYzogVXNlIHhtYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuCi0KLUZyaSBPY3QgMjkgMTE6MTE6MTQgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGluZm8pOiBSZW5hbWUgdG8gZm9ybWF0c19pbmZvLgotCShkdW1wX3N0YWJzXzEpOiBCZXR0ZXIgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcuCi0KLVRodSBPY3QgMjggMTk6NDM6MTYgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYWluKTogQWx3YXlzIGNyZWF0ZSB0aGUgYXJjaGl2ZSB3aGVuIHF1aWNrIGFwcGVuZGluZywKLQlldmVuIGlmIG5vIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBnaXZlbi4KLQotV2VkIE9jdCAyNyAxMjowMzowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFNldCBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldCBhbmQKLQlzaGFyZWREZWJ1Z1JlY29yZENvdW50IGZpZWxkcyBpbiBleHRlbmRlZCBoZWFkZXIuCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvcmNlIG1vZHVsZU5hbWUgZmllbGQgdG8gdXBwZXIgY2FzZS4KLQotTW9uIE9jdCAyNSAxNjo0NTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAobWFpbik6IEdpdmUgYSB1c2FnZSBtZXNzYWdlIGlmIHRoZXJlIGFyZSB0b28gbWFueQotCWFyZ3VtZW50cy4KLQotTW9uIE9jdCAyNSAxMDozNzowOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFJld3JpdGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgVlBBVEgsCi0Jc28gRlNGIGRpc3RyaWJ1dGlvbnMgKHdpdGggaW5mbyBmaWxlcyBpbiAkKHNyY2RpcikpIGluc3RhbGwKLQlwcm9wZXJseS4KLQkoRElTVFNUVUZGKTogQnVpbGQgbmxtaGVhZGVyLmMgdG9vLgotCi1GcmkgT2N0IDIyIDExOjQzOjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBhci5jIChwcm9ncmFtX25hbWUpOiBEb24ndCBkZWZpbmUgaGVyZS4KLQkqIG9iamR1bXAuYzogSW5jbHVkZSAiYnVjb21tLmgiLgotCSh4bWFsbG9jKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgotCShwcm9ncmFtX25hbWUpOiBEb24ndCBkZWZpbmUgaGVyZS4KLQkocHJvZ3JhbV92ZXJzaW9uKTogRml4ZWQgdHlwZSBpbiBkZWNsYXJhdGlvbi4KLQkqIHNpemUuYzogSW5jbHVkZSAiYnVjb21tLmgiLgotCShwcm9ncmFtX25hbWUpOiBEb24ndCBkZWNsYXJlIGhlcmUuCi0KLUZyaSBPY3QgMjIgMTQ6MTA6NDEgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogaGlkZSBkZWNsYXJhdGlvbiBpbiBGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQKLQotRnJpIE9jdCAgMSAxMjo0MzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoaTM4Nl9tYW5nbGVfcmVsb2NzKTogUmVzb2x2ZSBhbmQgcmVtb3ZlIFBDIHJlbGF0aXZlCi0JcmVsb2NzIGFnYWluc3QgZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBzYW1lIHNlY3Rpb24uCi0KLVRodSBTZXAgMzAgMTY6NDY6MjYgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGJpbnV0aWxzLmR2aSk6IHVzZSBURVhJRElSIHRvIGZpbmQgdGV4aW5mby50ZXgKLQotU2F0IFNlcCAyNSAxODowOToyOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSk6IE5ldyBmdW5jdGlvbnMuCi0JKG1haW4pOiBVc2UgdGhlbS4KLQotRnJpIFNlcCAyNCAxNTozODoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVjdXJzZSBpbnRvIHRlc3RzdWl0ZS4KLQotVGh1IFNlcCAyMyAwMTowNTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc2V0dXBfc2VjdGlvbnMsIGNvcHlfc2VjdGlvbnMpOiBJZiBzdHJpcHBpbmcsIGRvbid0Ci0JY29weSBTRUNfREVCVUdHSU5HIHNlY3Rpb25zLgotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMpOiBQcmludCBTRUNfREVCVUdHSU5HIGZsYWcuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBNZW50aW9uIC0tc3RhYnMuCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBDb3B5IGFsbCBhcHBsaWNhYmxlIGZpbGUgZmxhZ3MuCi0JKGNvcHlfZmlsZSk6IERvbid0IGNvcHkgRVhFQ19QIHNwZWNpYWxseSBoZXJlLgotCi1Nb24gU2VwIDIwIDE5OjI4OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogQWRqdXN0IGRhdGEgc2VjdGlvbiBzaXplIHRvIGNvcnJlc3BvbmQgdG8gYnNzCi0JYWxpZ25tZW50IGFkanVzdG1lbnQuICBDbGVhciBCU0ZfU0VDVElPTl9TWU0gaWYgc3ltYm9sIGlzIG1vdmVkIHRvCi0JYSBkaWZmZXJlbnQgc2VjdGlvbi4gIFVzZSB0aW1lX3QgZm9yIHRpbWUgdmFyaWFibGUuCi0JKHNldHVwX3NlY3Rpb25zKTogT25seSBwdXQgc2VjdGlvbnMgd2l0aCBjb250ZW50cyBpbiBvdXRwdXQgTkxNLgotCShpMzg2X21hbmdsZV9yZWxvY3MpOiBObyBzeW1ib2xzIGFyZSBjb21tb24gYXQgdGhpcyBwb2ludC4gIEFkZAotCWNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1GcmkgU2VwIDEwIDExOjAwOjQwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBNYWRlIHRoZSAtLXN0YWJzIG9wdGlvbiB3b3JrIGZvciBzdGFicy1pbi1jb2ZmLgotCShFTEZfU1RBQl9ESVNQTEFZKTogUmVtb3ZlZC4KLQkoZHVtcF9lbGZfc3RhYnMpOiBSZW5hbWVkIHRvIGR1bXBfc3RhYnMsIGNoYW5nZWQgdG8gcnVuIGZvcgotCWFueSBvYmplY3QgZmlsZSBmb3JtYXQuCi0JKGR1bXBfZWxmX3N0YWJzXzEpOiBSZW5hbWVkIHRvIGR1bXBfc3RhYnNfMSwgYWRkZWQgY2FsbHMgdG8KLQlnZW5lcmljIEJGRCByb3V0aW5lcyBmb3Igbm9uLUVMRiBjYXNlLCBjaGFuZ2VkIGZvcm1hdCBvZiBtZXNzYWdlCi0JZm9yIG5vLXNlY3Rpb24tZm91bmQgY2FzZS4KLQkoZGlzcGxheV9iZmQpOiBBbHdheXMgY2FsbCBkdW1wX3N0YWJzIGlmIHJlcXVlc3RlZC4KLQkoZHVtcF9kYXRhKTogQ2FsbCBiZmRfc2VjdGlvbl9zaXplIHRvIGdldCBzZWN0aW9uIHNpemUuCi0KLUZyaSBTZXAgMTAgMDg6MTI6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IHB1dCBzdHJpbmdzIGluIHRvb2xkaXIvYmluLgotCi1Nb24gU2VwICA2IDE1OjM5OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jICh0b3RhbF9ic3Nfc2l6ZSk6IFJlbW92ZWQuCi0JKG1haW4pOiBTZXQgdGhlIGJzcyB2bWEgdG8gYWx3YXlzIGZvbGxvdyB0aGUgZGF0YSBzZWN0aW9uLiAgTW92ZQotCXN5bWJvbHMgaW50byBuZXcgc2VjdGlvbnMsIGFuZCBhZGp1c3QgdmFsdWVzIGJ5IG91dHB1dF9vZmZzZXQuCi0JKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgY29weSBhbGwgc2VjdGlvbnMsIGJ1dCBpbnN0ZWFkIHBvaW50IGFsbAotCXRleHQgc2VjdGlvbnMgdG8gLnRleHQsIGFsbCBkYXRhIHNlY3Rpb25zIHRvIC5kYXRhLCBhbmQgYWxsIGJzcwotCXNlY3Rpb25zIHRvIC5ic3MuCi0JKGNvcHlfc2VjdGlvbnMpOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVRodSBTZXAgIDIgMTI6MzQ6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JT25seSBidWlsZCBubG1jb252IGlmIGNvbmZpZ3VyZWQgZm9yIGEgTmV0V2FyZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IElmIHdlIGhhdmUgc29tZSAqLSotbmV0d2FyZSogdGFyZ2V0LCBvciBhcmUgdXNpbmcKLQlhbGwgdGFyZ2V0cywgc2V0IEJVSUxEX05MTUNPTlYgdG8gJChOTE1DT05WX1BST0cpIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKFBST0dTKTogVXNlICQoQlVJTERfTkxNQ09OVikgcmF0aGVyIHRoYW4KLQkkKE5MTUNPTlZfUFJPRykuCi0KLVR1ZSBBdWcgMzEgMTQ6MTM6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKEFSQ0hfYWxsKTogRGVmaW5lIEFSQ0hfaHBwYSB0b28uCi0JKGR1bXBfaGVhZGVycyk6IERvbid0IHRlc3QgZm9yIFNFQ19CQUxJR04gaWYgaXQncyBub3QgZGVmaW5lZCBieQotCWJmZC5oLgotCi1UdWUgQXVnIDMxIDEzOjI5OjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogRm9yY2UgY3JlYXRpb24gb2YgLmJzcyBzZWN0aW9uLiAgU2V0IHVwIHRoZQotCXNlY3Rpb25zIGJlZm9yZSBsb29raW5nIGF0IHRoZSBzeW1ib2xzLiAgTW92ZSBhbGwgY29tbW9uIHN5bWJvbHMKLQlpbnRvIC5ic3Mgc2VjdGlvbi4gIEF1dG9tYXRpY2FsbHkgZGVmaW5lIF9lZGF0YSBhbmQgX2VuZC4gIE9ubHkKLQlleHBvcnQgc3ltYm9scyBpbiB0aGUgZXhwb3J0IGxpc3QsIHdpdGggbXVsdGlwbGUgcHJlZml4ZXMgaWYKLQluZWNlc3NhcnkuICBXYXJuIGlmIG5vIHZlcnNpb24uICBBbHdheXMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlci4KLQlTZXQgZGF0ZSBhdXRvbWF0aWNhbGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KLQkoc2V0dXBfc2VjdGlvbnMpOiBDb3VudCBzaXplIG9mIGJzcyBzZWN0aW9ucy4KLQkobWFuZ2xlX3JlbG9jcywgaTM4Nl9tYW5nbGVfcmVsb2NzKTogQWNjZXB0IHNlY3Rpb24gYXJndW1lbnQsIGFuZAotCXRha2UgcmVsb2NfY291bnQgYXMgYSBjaGFuZ2VhYmxlIHBvaW50ZXI7IGNoYW5nZWQgY2FsbGVycy4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogUmVtb3ZlIFBDIHJlbGF0aXZlIHJlbG9jcyB3aXRoaW4gYSBzZWN0aW9uLAotCWFzIHRoZXkgcmVxdWlyZSBubyBhZGp1c3RtZW50LgotCSogbmxtaGVhZGVyLnk6IEZpeGVkIG1lbW9yeSBhbGxvY2F0aW9uIHRocm91Z2hvdXQ6IHRva2VuIFNUUklORyBpcwotCW5vdyBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGFuZCBmcmVlZCBpZiBub3QgbmVlZGVkLiAgTnVsbAotCXRlcm1pbmF0ZWQgY29weXJpZ2h0IG1lc3NhZ2UuICBBY2NlcHQgdmVyc2lvbiB3aXRoIG9ubHkgdHdvCi0Jc3RyaW5ncy4KLQkoc3ltYm9sX2xpc3Rfb3B0KTogTmV3IG5vbnRlcm1pbmFsLCBlaXRoZXIgc3ltYm9sX2xpc3Qgb3IgZW1wdHkuCi0JKHN5bWJvbF9saXN0KTogVXNlIGxlZnQgcmVjdXJzaW9uIHRvIGF2b2lkIG92ZXJmbG93aW5nIHBhcnNlcgotCXN0YWNrLgotCSh5eWxleCk6IFJlYXJyYW5nZWQgYmVnaW5uaW5nIG9mIGxpbmUgY2hlY2suICBBY2NlcHQgcXVvdGVkCi0Jc3RyaW5ncyB1c2luZyBzaW5nbGUgcXVvdGVzLiAgRW5kIGdlbmVyaWMgYXJndW1lbnQgYXQgY29tbWVudAotCWNoYXJhY3RlciBvciBwYXJlbnRoZXNlcy4KLQkoc3RyaW5nX2xpc3RfYXBwZW5kKTogRml4ZWQuCi0JKHN0cmluZ19saXN0X2FwcGVuZDEpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGJ1Y29tbS5oOiBUaGUgZmlyc3QgYXJndW1lbnQgdG8geHJlYWxsb2MgaXMgUFRSLCBub3QgY2hhciAqLgotCSogYnVjb21tLmMgKHhyZWFsbG9jKTogVXNlIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCi0JKiBNYWtlZmlsZS5pbiAob2JqZHVtcC5vKTogRGVwZW5kIHVwb24gY29uZmlnLnN0YXR1cyB0byBub3RpY2UKLQktLXdpdGgtdGFyZ2V0cyBjaGFuZ2VzLgotCShubG1jb252Lm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaC4KLQotVHVlIEF1ZyAxNyAwOTo0NjowMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcGFzcyBjcHUgdG8gY29uZmlnLmJmZC4KLQotVGh1IEF1ZyAxMiAxNjo0MzowNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgkKE5NX1BST0cpKTogRGVwZW5kIG9uIGRlbWFuZ2xlLm8uCi0JKGRlbWFuZ2xlLm8pOiBOZXcgdGFyZ2V0LgotCShjcGx1cy1kZW0ubyk6IERlcGVuZCBvbiBpdCwgdG8gZm9yY2UgY29tcGlsYXRpb24gb3JkZXIgd2hlbiBkb2luZwotCXBhcmFsbGVsIGNvbXBpbGVzLgotCi0JKiBubS5jIChwcmludF9zeW1ib2xfaW5mb197YnNkLHN5c3YscG9zaXh9KTogVGFrZSBhIGJmZCBhcmcuCi0JKHN0cnVjdCBvdXRwdXRfZm5zIHByaW50X3N5bWJvbF9pbmZvKTogRGl0dG8uCi0JKGxvbmdfb3B0aW9ucywgdXNhZ2UsIG1haW4pOiBBZGQgLUMgLS1kZW1hbmdsZSBvcHRpb24uCi0JKHByaW50X3N5bW5hbWUpOiBOZXcgZnVuY3Rpb24sIGRlbWFuZ2xpbmcgaWYgcmVxdWVzdGVkLgotCShwcmludF9zeW1ib2xzLCBwcmludF9zeW1ib2xfaW5mb197YnNkLHN5c3YscG9zaXh9KTogVXNlIGl0LgotCi1XZWQgQXVnIDExIDIyOjU3OjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFB1dCBDRkxBR1MgbGFzdCBpbiBjb21waWxhdGlvbiBydWxlcyBhbmQgb21pdCBmcm9tCi0JbGlua2luZyBydWxlcy4gIFVzZSBBUkNIREVGUyB0byBjb21waWxlIG9iamR1bXAuYy4KLQlVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLmluOiBDb25zdHJ1Y3QgQVJDSERFRlMgYmFzZWQgb24gdGhlIEJGRCB0YXJnZXQgbWFrZWZpbGUKLQlmcmFnbWVudHMuCi0JKiBvYmpkdW1wLmM6IENvbmRpdGlvbmFsaXplIGNhbGxzIHRvIHRoZSBwcmludF9pbnNuX0FSQ0ggZnVuY3Rpb25zCi0JYWNjb3JkaW5nIHRvIEFSQ0hERUZTLgotCi1UaHUgQXVnIDEyIDA4OjA2OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXIuYzogUmVtb3ZlZCBvYnNvbGV0ZSBhbmQgbm9uLWZ1bmN0aW9uYWwgR05VOTYwIGNvZGUuCi0KLVdlZCBBdWcgMTEgMTM6MDg6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzaXplLmMgKGJlcmtlbGV5X3N1bSk6IE5ldyBmdW5jdGlvbi4KLQkoYnNzc2l6ZSwgZGF0YXNpemUsIHRleHRzaXplKTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKGJzc19zZWN0aW9uX25hbWUsIGRhdGFfc2VjdGlvbl9uYW1lLCB0ZXh0X3NlY3Rpb25fbmFtZSk6IFJlbW92ZWQuCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCk6IE1hcCBiZXJrZWxleV9zdW0gb3ZlciBhbGwgdGhlIHNlY3Rpb25zLAotCXJhdGhlciB0aGFuIG9ubHkgcmVwb3J0aW5nIHNpemVzIG9mIHNwZWNpZmljYWxseSBuYW1lZCBzZWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBSZW1vdmVkIGRlcGVuZGVuY3kgb24gc2l6ZS5vLgotCi1UdWUgQXVnIDEwIDEwOjQ2OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jLCBubG1jb252LmgsIG5sbWhlYWRlci55OiBOZXcgZmlsZXMgZm9yIHByb2dyYW0gdG8KLQljb252ZXJ0IG9iamVjdCBmaWxlcyBpbnRvIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlcy4KLQkqIE1ha2VmaWxlLmluIChOTE1DT05WX1BST0cpOiBOZXcgbWFjcm8sIGRlZmluZSB0byBiZSBubG1jb252LgotCShQUk9HUyk6IEFkZCBOTE1DT05WX1BST0cuCi0JKG5sbWhlYWRlci5jLCBubG1oZWFkZXIubywgbmxtY29udi5vLCAkKE5MTUNPTlZfUFJPRykpOiBOZXcKLQl0YXJnZXRzLgotCi1UaHUgQXVnICA1IDE1OjQ4OjMyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBNQUtFT1ZFUlJJREVTIHRvIGFuIGVtcHR5IHN0cmluZwotCi1XZWQgQXVnICA0IDE3OjA4OjA4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChjb3B5X2ZpbGUpOiBNYWtlIGZhaWx1cmVzIHRvIHByb2Nlc3MgYSBmaWxlIG5vbmZhdGFsLgotCi1Nb24gQXVnICAyIDExOjI4OjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogQWRkIC1CIG9wdGlvbiwgbGlrZSAtLWZvcm1hdD1ic2QuCi0KLVR1ZSBKdWwgMjcgMTY6Mjk6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfZmlsZSk6IElmIHRoZSBmaWxlIGlzIG5laXRoZXIgYW4gb2JqZWN0IG5vciBhbgotCWFyY2hpdmUsIGdpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHN1Y2Nlc3MuCi0KLU1vbiBKdWwgMTkgMTY6MTM6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFByZWZlciBub24tbG9jYWwgc3ltYm9scyBvdmVyCi0JbG9jYWwgb25lcywgYW5kIGVzcGVjaWFsbHkgZGlzY3JpbWluYXRlIGFnYWluc3QgZGVidWdnaW5nIHN5bWJvbHMuCi0JQWxzbywgZm9yIHJlbG9jYXRlYWJsZSBmaWxlcywgdHJ5IHRvIGZpbmQgYSBzeW1ib2wgaW4gdGhlIGN1cnJlbnQKLQlzZWN0aW9uLCBpbnN0ZWFkIG9mIHBpY2tpbmcgb25lIGZyb20gc29tZSByYW5kb20gc2VjdGlvbiB3aXRoIGEKLQljb252ZW5pZW50IHZhbHVlIChyZWFkLCBzZWN0aW9uIG9mZnNldCkuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYXN0IGFyZ3VtZW50IHRvIG1hbGxvYyB0byBzaXplX3QgZmlyc3QuCi0JKGR1bXBfZGF0YSk6IExpa2V3aXNlLgotCShkdW1wX3JlbG9jcyk6IElmIGEgc2luZ2xlIHNlY3Rpb24gbmFtZSBpcyBzcGVjaWZpZWQsIHNob3cgcmVsb2NzCi0Jb25seSBmb3IgdGhhdCBzZWN0aW9uLiAgT3RoZXJ3aXNlLCBzaWxlbnRseSBvbWl0IHNlY3Rpb25zIHdpdGhvdXQKLQlyZWxvY3MuICBGb3JtYXQgdGFibGUgbmljZWx5IGV2ZW4gaWYgdmFsdWVzIGFyZSBwcmludGVkIHVzaW5nIDE2Ci0JZGlnaXRzIGluc3RlYWQgb2YgOC4KLQotRnJpIEp1bCAxNiAxNToxOTo1OSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IENoYW5nZXMgZm9yIGZpbmFsIHZlcnNpb24gb2YgUE9TSVguMi4KLQkocHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3tic2Qsc3lzdixwb3NpeH0pOiBOZXcgZnVuY3Rpb25zLgotCShmb3JtYXRzKTogQWRkIGFuIGVsZW1lbnQgZm9yIGEgcG9pbnRlciB0byB0aGVtLgotCShwcmludF9zeW1ib2xzKTogQ2FsbCBpdC4KLQkocHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4LCBwcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCk6IFByb2R1Y2UKLQlvdXRwdXQgYWNjb3JkaW5nIHRvIG5ldyBQT1NJWC4yIHNwZWMuCi0KLQkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IEhhbmRsZSBTVFJFQU0gYmVpbmcgTlVMTC4KLQkoc3RyaW5nc19hX3NlY3Rpb24pOiBQYXNzIGEgTlVMTC4KLQkobWFpbik6IERvbid0IG9wZW4gL2Rldi9udWxsLgotCi1UaHUgSnVsIDE1IDEyOjQ0OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHRoZSBtODhrLgotCShkaXNwbGF5X2JmZCk6IFVzZSBiZmRfZXJybXNnLCByYXRoZXIgdGhhbiBqdXN0IGNsYWltaW5nIHRoYXQgdGhlCi0JYmZkIGlzIG5vdCBhbiBvYmplY3QgZmlsZS4KLQotTW9uIEp1bCAxMiAxNzo1NTozNCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBtYWtlIHdvcmsgYWdhaW4gYnkgbmFtaW5nIGRpcmVjdG9yaWVzCi0JICBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGRlcGVuZGluZyBvbiB1bmRlZmluZWQgbWFjcm9zLgotCSAgKElOU1RBTExfWEZPUk0pOiBjb3JyZWN0IGJhZCBpbnN0YWxsIHRhcmdldC4KLQotRnJpIEp1bCAgMiAxNjo1ODozNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN0cmluZ3MuYzogRG9jIGZpeGVzLgotCi1TdW4gSnVuIDI3IDEzOjM1OjI0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IE5vdGUgZGVwZW5kZW5jaWVzIG9uIGJ1Y29tbS5oLgotCShjcGx1cy1kZW0ubyk6IExpbmsgYysrZmlsdCB3aXRoIHZlcnNpb24uby4KLQotCSogc3RyaW5ncy5jOiBJbmNsdWRlIGJ1Y29tbS5oIGFuZCBhZGQgcHJvdG90eXBlcyB0byBvdGhlciBkZWNscy4KLQlSZW1vdmUgLWggb3B0aW9uLgotCi0JKiBidWNvbW0uaDogRGVjbGFyZSB4cmVhbGxvYy4KLQotCSogbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMsIHNpemUuYywgc3RyaW5ncy5jIChtYWluLCB1c2FnZSk6IEFkZAotCS0taGVscCBvcHRpb24uICBQdXQgIkdOVSIgaW4gdGhlIHZlcnNpb24gbWVzc2FnZS4KLQkodXNhZ2UpOiBUYWtlIHN0cmVhbSBhbmQgZXhpdCBzdGF0dXMgYXMgYXJncy4KLQkobWFpbik6IFBhc3MgbmV3IGFyZ3MgdG8gdXNhZ2UuCi0KLUZyaSBKdW4gMjUgMjM6MTI6MTIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLmMsIHN0cmluZ3MuMTogTmV3IGZpbGVzLgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgc3RyaW5ncy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgcnVsZXMgZm9yIGl0LgotCi1GcmkgSnVuIDI1IDIwOjQ0OjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6IFVzZSBzaXplLWluZGVwZW5kZW50IGJmZCBlbGYgc2VjdGlvbiBuYW1lcy4KLQotU3VuIEp1biAyMCAyMzowOTowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBIYW5kbGUgd2lkZSBvZmZzZXRzIGJ5Ci0JY2FsbGluZyBzcHJpbnRmX3ZtYS4KLQotRnJpIEp1biAxOCAxNDoyOToxMiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzeW1zMik6ICBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZS4KLQkqIG9iamR1bXAuYyAocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6ICBOZXcgZnVuY3Rpb24uCi0JKiBvYmpkdW1wLmMgKGNvbXApOiAgU2ltcGxpZnkuCi0JKiBvYmpkdW1wLmMgKGRpcy1hc3NlbWJsZV9kYXRhKTogIE1ha2Ugc2ltcGxlciBhbmQgbW9yZQotCWVmZmljaWVudCBob3cgd2UgZmlsdGVyIG91dCB1c2VsZXNzIHN5bWJvbHM6ICBKdXN0IGZpbHRlcgotCUJFRk9SRSB0aGUgc29ydCAodXNpbmcgcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scykuCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6ICBTaW1wbGlmeS4KLQlDaGFuZ2Ugb3V0cHV0IHN5bnRheCB0byBtYXRjaCBnZGIuCi0KLVRodSBKdW4gMTcgMTY6NTM6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNhbm9uaWNhbGl6ZSBpbnN0YWxsLnNoOyBmb3IgdXNlIHdpdGhpbgotCXRoaXMgZGlyZWN0b3J5IChhbmQgc3ViZGlycykKLQotTW9uIEp1biAxNCAxMjoxMzoyMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLCBpbnN0YWxsLWluZm8pOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQsCi0JdXNlIElOU1RBTExfWEZPUk07IGRlZmluZSBJTlNUQUxMX1hGT1JNCi0KLVRodSBKdW4gMTAgMTc6Mjk6MjEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgRml4IGJhZCBzaXplIHBhc3NlZCB0byB4bWFsbG9jKCkuCi0KLU1vbiBKdW4gIDcgMTI6NDE6MTIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiAgQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6ICBGaXggc3ltYm9sIHRhYmxlIGhhbmRsaW5nLgotCi1GcmkgSnVuICA0IDE3OjIwOjAzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogIENhbm5vdCBmaWx0ZXIgdGhlIHN5bWJvbHMKLQlpbiBwbGFjZSwgYmVjYXVzZSB0aGF0IGNvbmZ1c2VzIHRoZSByZWxvY3MsIHNvIHRha2Ugc2VwYXJhdGUKLQlwYXJhbWV0ZXIgZm9yIG91dHB1dCBhcnJheS4KLQkqIG9iamNvcHkuYyAoc3ltcHApOiAgTWFrZSB0d28gdmFyaWFibGVzOiBpc3ltcHAgYW5kIG9zeW1wcC4KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgQWxsb2NhdGUgc2VwYXJhdGUgYXJyYXkgKG9zeW1wcCkKLQlmb3IgZmlsdGVyZWQgc3ltYm9scy4KLQotRnJpIEp1biAgNCAxMDo1MTo0NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGFuZ2UgcmVjdXJzaW9uIHRlc3QgdG8gcHJlc2VuY2Ugb2YgYSBjb25maWd1cmVkCi0JdGVzdHN1aXRlIGRpcmVjdG9yeQotCi1UaHUgSnVuICAzIDE0OjA1OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHVuZGVyc2NvcmUuYyk6IEhhY2sgdGhlIGJhY2txdW90ZWQgY29tbWFuZCBzbyBpdAotCWRvZXNuJ3QgY2F1c2UgU29sYXJpcyBtYWtlIHRvIGJvbWIuCi0KLVRodSBKdW4gIDMgMTA6NDA6MTkgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBhZGRlZCBjKytmaWx0IGFuZCBvYmpjb3B5IHRvIE1BTlBBR0VTIHZhcmlhYmxlCi0KLVRodSBKdW4gIDMgMDA6MzI6NTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVuYW1lIExPQURMSUJFUyB0byBFWFRSQUxJQlMKLQotV2VkIEp1biAgMiAxODozMDoyNCAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBjKytmaWx0LjEsIG9iamNvcHkuMTogIG5ldyBtYW4gcGFnZXMKLQotRnJpIE1heSAyOCAxNTowMToyNCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogIEFsc28gaW5zdGFsbCBhciBhbmQgcmFubGliIGluCi0JJCh0b29sZGlyKS9iaW47ICBuZWVkZWQgZm9yIGJ1aWxkaW5nIGxpYmdjYy5hLgotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiAgRml4IHRoZSBjaGVjawotCSJjb2luY2lkZW50YWwiIGxhYmVsIG1hdGNoZXMgYnkgZGlzLWFsbG93aW5nIHVuZGVmaW5lZAotCW9yIGNvbSBzeW1ib2xzLgotCi1UaHUgTWF5IDI3IDE2OjU4OjMxIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBiaXV0aWxzLnRleGk6ICByZXZpc2VkIGMrK2ZpbHQgY2hhcHRlcgotCi1XZWQgTWF5IDI2IDE3OjI0OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0MgYW5kIENGTEFHUy4KLQotVHVlIE1heSAyNSAwMDoyNjo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzbHVycF9zeW10YWIpOiBQcmludCB3YXJuaW5nIGZvciBiYWQgc3ltYm9sIHRhYmxlLgotCShiZmRfZWxmMzJfZmluZF9zZWN0aW9uLCBFbGYzMl9JbnRlcm5hbF9TaGRyKTogVXBkYXRlZAotCWRlY2xhcmF0aW9ucyBhbmQgdXNlcy4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IERvbid0IGJ1aWxkIGJpbnV0aWxzLm1tLgotCi1GcmkgTWF5IDIxIDEwOjUxOjE5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogQWRkIC1mLy0tZm9ybWF0LCAtUC8tLXBvcnRhYmlsaXR5LCAtdC8tLXJhZGl4IG9wdGlvbnMuCi0JTWFrZSBnbG9iYWwgdmFyaWFibGVzIHN0YXRpYy4KLQkobWFpbik6IE1ha2UgLXYgbGlrZSAtbiwgbm90IC1WLCBhbmQgbWFrZSAtQSBsaWtlIC1vLCBmb3IgUE9TSVguMi4KLQkoc2V0X3ByaW50X3JhZGl4LCBzZXRfb3V0cHV0X2Zvcm1hdCwKLQlwcmludF97b2JqZWN0X2ZpbGVuYW1lLGFyY2hpdmVfZmlsZW5hbWUsYXJjaGl2ZV9tZW1iZXIsc3ltYm9sX2luZm99Ci0Je2JzZCxzeXN2LHBvc2l4fSk6IE5ldyBmdW5jdGlvbnMuCi0JKGRpc3BsYXlfZmlsZSwgcHJpbnRfc3ltYm9scyk6IENhbGwgdGhlbS4KLQotCSogYXIuYzogSW1wcm92ZSBlcnJvciBtZXNzYWdlcy4KLQotCSogbm0uYyAobWFpbik6IEhhbmRsZSBsb25nIG9wdGlvbnMgdGhhdCBqdXN0IHNldCBhIGZsYWcuCi0KLQkqIG5tLmMgKG1haW4pLCBhci5jIChkb19zaG93X3ZlcnNpb24pLCBvYmpjb3B5LmMgKG1haW4pLCBzaXplLmMKLQkobWFpbik6IEV4aXQgYWZ0ZXIgcHJpbnRpbmcgdGhlIHZlcnNpb24gbnVtYmVyLCBwZXIgdGhlIEdOVSBjb2RpbmcKLQlzdGFuZGFyZHMuCi0KLU1vbiBNYXkgMTcgMTM6MjA6MjUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIFJFQURNRSwgTWFrZWZpbGUuaW46ICBNaW5vciB1cGRhdGVzIGZvciAyLjIuCi0KLUZyaSBNYXkgMTQgMTE6MTI6MjYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh1bmRlcnNjb3JlLmMpOiAgQXV0b21hdGljYWxseSBnZW5lcmF0ZQotCSh1c2luZyBubSkgYSBmaWxlIHdpdGggdGhlIHZhcmlhYmxlIHByZXBlbmRzX3VuZGVyc2NvcmUuCi0JKiBNYWtlZmlsZS5pbiAoYysrZmlsdCk6ICBMaW5rIHVuZGVyc2NvcmUubyB3aXRoIGNwbHVzLWRlbS5vCi0Jc28gdGhhdCBpbml0aWFsIHVuZGVyc2NvcmVzIGdldCByZW1vdmVkIGlmZiBhcHByb3ByaWF0ZS4KLQkqIGJpbnV0aWxzLnRleGk6ICBQcmVsaW1pbmFyeSBkb2N1bWVudGF0aW9uIGZvciBjKytmaWx0LgotCSogTWFrZWZpbGUuaW4sIGJpbnV0aWxzLnRleGk6ICBTZXQgdG8gdmVyc2lvbiAyLjIuCi0KLQkqIE5FV1M6ICBNZW50aW9uIGNvcHktPm9iamNvcHkgcmVuYW1pbmcgYW5kIG5ldyBjKytmaWx0IHByb2dyYW0uCi0KLVdlZCBNYXkgMTIgMTI6MDU6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY3BsdXMtZGVtLm8sICQoREVNQU5HTEVSX1BST0cpKTogQnVpbGQgdGhlCi0JZGVtYW5nbGVyIHZpYSBjcGx1cy1kZW0ubywgcmF0aGVyIHRoYW4gZGlyZWN0bHkgZnJvbSB0aGUgLmMgZmlsZS4KLQotCSogb2JqY29weS5jOiBSZW5hbWVkIGZyb20gY29weS5jLCB1cGRhdGVkIGNvbW1lbnRzIGFjY29yZGluZ2x5LgotCSogTWFrZWZpbGUuaW4sIGJpbnV0aWxzLnRleGk6IFJlbmFtZWQgY29weSB0byBvYmpjb3B5LgotCSogaXMtc3RyaXAuYywgbWF5YmUtc3RyaXAuYywgbm90LXN0cmlwLmM6IFVwZGF0ZWQgY29tbWVudHMgZm9yCi0JcmVuYW1lIG9mIGNvcHkgdG8gb2JqY29weS4KLQotTW9uIE1heSAxMCAxNzoyMDoxOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aSAoc3RyaXAsIC12IG9wdGlvbik6ICBGaXggdHlwby4KLQotRnJpIE1heSAgNyAxMzo1Nzo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogRGVmaW5lLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIFJVTlRFU1QuCi0KLVR1ZSBNYXkgIDQgMTA6MDY6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVNQU5HTEVSX1BST0cpOiBOYW1lIGl0IGMrK2ZpbHQuCi0JKFBST0cpOiBBbHNvIGJ1aWxkIGFuZCBpbnN0YWxsIENPUFlfUFJPRy4KLQotTW9uIE1heSAgMyAxOToxMTo0OCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgZGVmaW5pdGlvbiBvZiAkKHRvb2xkaXIpIHRvIG1hdGNoIEZTRi4KLQotV2VkIEFwciAyOCAyMzo0MTozMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHNpemUuYyAodXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCShtYWluKTogQ2xlYW4gdXAgb3B0aW9uIHBhcnNlci4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IEFkZCBtaXNzaW5nIG9wdGlvbnMuCi0JKGRpc3BsYXlfZmlsZSk6IFByaW50IHByb2dyYW0gbmFtZSBiZWZvcmUgY2FsbGluZwotCWJkZl9wZXJyb3IuCi0KLQkqIG5tLmMgKHVzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KLQkobWFpbik6IENsZWFuIHVwIG9wdGlvbiBwYXJzZXIuCi0JKGRpc3BsYXlfZmlsZSk6IFByaW50IHByb2dyYW0gbmFtZSBiZWZvcmUgY2FsbGluZwotCWJkZl9wZXJyb3IuCi0KLQkqIGNvcHkuYyAoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCi0JKiBhci5jICh1c2FnZSk6IE5ldyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgaXQuCi0JKG9wZW5faW5hcmNoLCBkb19xdWlja19hcHBlbmQpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQliZGZfcGVycm9yLgotCi1UaHUgQXByIDIyIDE1OjAxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbm0uYyAobWFpbik6IEFjY2VwdCBhbmQgaWdub3JlIC1BIGFuZCAtQiBmb3IgTUlQUyBjb21wYXRpYmlsaXR5LgotCi1Nb24gQXByIDE5IDE0OjA2OjU5IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIEZMQUdTX1RPX1BBU1Mgc28gdGVzdHMgZ2V0IHJ1biBvbiBmcmVzaGx5Ci0JYnVpbHQgYmluYXJpZXMgaWYgdGhleSBleGlzdC4gKG90aGVyd2lzZSB0aGUgcGF0aCkKLQotV2VkIEFwciAgNyAyMjoyMjo1MCAxOTkzICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGNoZWNrIHRhcmdldCB0byB1c2UgRGVqYUdudS4KLQotVGh1IEFwciAgMSAxMjozNzoxMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBhbTI5ay1waW5zbi5jLCBpOTYwLXBpbnNuLmMuCi0Jb2JqZHVtcC5jOiBhMjlrIGFuZCBpOTYwIGFyZSBgZGlzYXNzZW1ibGUnIG5vdCBgcHJpbnQnLgotCi0JKiBvYmpkdW1wLmM6IFJlbmFtZSBwcmludF9hZGRyZXNzIHRvIG9iamR1bXBfcHJpbnRfYWRkcmVzcwotCWFuZCBjaGFuZ2UgcGFyYW1ldGVycy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBvYmpkdW1wX3ByaW50X2FkZHJlc3MuCi0KLVdlZCBNYXIgMzEgMTA6MjU6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IHByaW50X2luc25fc3BhcmMgaXMgbm93IGEKLQlgZGlzYXNzZW1ibGUnIG5vdCBhIGBwcmludCcuCi0JTWFrZWZpbGUuaW46IFJlbW92ZSBzcGFyYy1waW5zbi5jIChub3cgaW4gbGlib3Bjb2Rlcy5hKS4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogVXNlIG5ldyByZWFkX21lbW9yeV9mdW5jIHN0dWZmLgotCi1UaHUgTWFyIDI1IDEwOjM4OjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogRGVjbGFyYXRpb24gb2YgdmFyaWFkaWMgZnVuY3Rpb24gaGFkIGJldHRlcgotCWJlIGEgcHJvdG90eXBlIGZvciBBTlNJIEMgc3lzdGVtcy4KLQotTW9uIE1hciAyMiAyMzoxOTo0NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW5hbWUgdGVzdC1pbnN0YWxsIHRvIGluc3RhbGwtY2hlY2sKLQotRnJpIE1hciAxOSAxNDo0MDowOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQWRkIEg4NTAwLgotCi1GcmkgTWFyIDE5IDEwOjU2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiBsb25nIG9wdGlvbnMuCi0KLVRodSBNYXIgMTggMTQ6MjI6MTcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBubS5jOiAgTW9kaWZ5IGJlaGF2aW9yIG9mIC1vIGZsYWcgZm9yIGFyY2hpdmVzIHRvIG1hdGNoCi0JQlNENC40IGFuZCBTdW5vcyA0OiAgUHJlZml4IGFyY2hpdmUgbmFtZSBiZWZvcmUgZWFjaCBsaW5lLgotCi0JKiBtNjhrLXBpbnNuLmM6ICBSZW1vdmVkLiAgU3Vic3VtZWQgYnkgLi4vb3Bjb2Rlcy9tNjhrLWRpcy5jLgotCSogaTM4Ni1waW5zbi5jOiAgUmVtb3ZlZC4gIFN1YnN1bWVkIGJ5IC4uL29wY29kZXMvaTM4Ni1kaXMuYy4KLQkqIE1ha2VmaWxlLmluOiAgQWRqdXN0IGFjY29yZGluZ2x5LgotCSogb2JqZHVtcC5jOiAgU3VwcG9ydCBuZXctc3R5bGUgZGlzYXNzZW1ibGVycyAob25lcyB0aGF0IHVzZQotCXRoZSBpbnRlcmZhY2Ugb2YgLi4vaW5jbHVkZS9kaXMtYXNtLmgpLgotCi1UaHUgRmViIDI1IDE1OjU3OjAwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBXaGVuIG1ha2luZyB0YXIgZmlsZSwgcmVtb3ZlIHRleGluZm8vKiwKLQlleGNlcHQgZm9yIHRleGluZm8vdGV4aW5mby50ZXguCi0JKiBhcmR1cC5jOiAgQWRkIGV4dGVybiBkZWNsYXJhdGlvbiBvZiBzdHJkdXAuCi0JKiBNYWtlZmlsZS5pbiAodGVzdHN1aXRlKTogIEFkZCAnZWxzZSB0cnVlJyBzaW5jZSBvdGhlcndpc2UKLQlVbHRyaXggL2Jpbi9zaCBjb21wbGFpbnMuCi0KLVdlZCBGZWIgMjQgMTk6NDQ6MTggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFNldCBWRVJTSU9OIHRvIDIuMS4KLQkqIFJFQURNRSwgTkVXUzogVXBkYXRlcy4KLQkqIG5tLmM6ICBBZGQgLXYgYXMgYSBzeW5vbnltIGZvciAtVi4KLQotVHVlIEZlYiAyMyAxOTowMDo1MCAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIHRlc3RzdWl0ZSB0byBjb25maWdkaXJzLgotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHRlc3RzdWl0ZS4KLQotTW9uIEZlYiAyMiAyMjo1MjoxMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6ICBQcmludCBmdW5jdGlvbiBuYW1lcyB3aGVuCi0JZ2l2ZW4gYnkgYmZkX2ZpbmRfbmVhcmVzdF9saW5lLiAgSWYgbm90IC0gc3RpbGwgcHJpbnQKLQlsaW5lIG51bWJlcnMuCi0KLU1vbiBGZWIgMjIgMDc6NTQ6MDMgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMvdGVzdHN1aXRlOiBtYWRlIG1vZGlmaWNhdGlvbnMgdG8gdGVzdGNhc2VzLCBldGMuLCB0byBhbGxvdwotICAgICAgICB0aGVtIHRvIHdvcmsgcHJvcGVybHkgIGdpdmVuIHRoZSByZW9yZ2FuaXphdGlvbiBvZiBkZWphLWdudSBhbmQgdGhlCi0JcmVsb2NhdGlvbiBvZiB0aGUgdGVzdGNhc2VzIGZyb20gZGVqYS1nbnUgdG8gYSAidG9vbCIgc3ViZGlyZWN0b3J5LgotCi1Nb24gRmViIDIyIDEwOjI3OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX2RhdGEpOiBGcmVlIHVwIHNlY3Rpb24gY29udGVudHMgZWFjaCB0aW1lCi0JdGhyb3VnaCB0aGUgbG9vcC4gIFJlcG9ydGVkIGJ5IG1pbnlhcmRAYm5yLmNhLgotCi1TdW4gRmViIDIxIDEwOjU1OjU1IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogSW5pdGlhbCBjcmVhdGlvbiBvZiBiaW51dGlscy90ZXN0c3VpdGUuCi0JTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgbm0gdG8KLQliaW51dGlscy90ZXN0c3VpdGUgZnJvbSBkZWphLWdudS4gIFRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgotCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4JVGhpcyBtaWdyYXRpb24gaXMgcGFydCBvZiBhIG1ham9yIG92ZXJoYXVsCi0Jb2YgZGVqYWdudS4gIFRoZSBtb2RpZmljYXRpb25zIHRvIHRoZXNlIHRlc3RjYXNlcywgZXRjLiwgd2hpY2gKLQl3aWxsIGFsbG93IHRoZW0gdG8gd29yayB3aXRoIHRoZSBuZXcgdmVyc2lvbiBvZiBkZWphZ251IHdpbGwgYmUKLQltYWRlIGluIGEgZnV0dXJlIHVwZGF0ZS4KLQotRnJpIEZlYiAxMiAxMDowNToyMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExJQklCRVJUWV9TUkNfRElSLCBMSUJJQkVSVFlfQklOX0RJUik6IE5ldyBtYWNyb3MuCi0JKiBNYWtlZmlsZS5pbiAoTElCSUJFUlRZKTogIFVzZSBMSUJJQkVSVFlfQklOX0RJUi4KLQkqIE1ha2VmaWxlLmluIChERU1BTkdMRVJfUFJPRyk6ICBOZXcgcHJvZ3JhbSB0byBidWlsZC4gIEFkZCBtYWNybwotCWFuZCBydWxlLgotCSogTWFrZWZpbGUuaW4gKFBST0dTKTogIEFkZCBERU1BTkdMRVJfUFJPRy4KLQotVHVlIEphbiAyNiAxMTo1NjozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvcHkuYywgbm0uYywgb2JqZHVtcC5jLCBzaXplLmM6IFVzZSBuZXcgYmZkX2lzX2NvbV9zZWN0aW9uCi0JbWFjcm8gcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIGVxdWFsaXR5IHRvIGJmZF9jb21fc2VjdGlvbi4KLQotRnJpIEphbiAgOCAxNTo1MDowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEZpeCBjb2RlIHRvIGZpbmQgZmlyc3QgdXNlbGVzcwotCXN5bWJvbC4KLQotVGh1IEphbiAgNyAxMzoxMzozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBtaXBzX3ByaW50X2luc24gZm9yIE1JUFMuCi0JRG9uJ3QgY29yZSBkdW1wIGlmIGJmZF9maW5kX25lYXJlc3RfbGluZSByZXR1cm5zIGZhbHNlLgotCi1XZWQgSmFuICA2IDE3OjE0OjAxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBrbm93IGhvdyB0byBkaXNhc3NlbWJsZSB6ODAwMHMKLQl0b28uCi0KLVdlZCBKYW4gIDYgMTU6MTY6MjcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyc3VwLmggKGludGVyYWN0aXZlKSwgYnVjb21tLmggKHByb2dyYW1fbmFtZSk6ICBQcmVmaXgKLQl3aXRoICdleHRlcm4nLCB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIHNvbWUgY29tcGlsZXJzLgotCi1XZWQgSmFuICA2IDE1OjE0OjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYXJwYXJzZS55OiBmaXggdW5uZWNlc3Nhcnkgc2hpZnQvcmVkdWNlCi0KLVR1ZSBEZWMgMjIgMTU6NDY6NTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1ha2UgY2hlY2sgZGVwZW5kIG9uIGFsbC4KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc3lzZGVwLmguCi0JKiBzaXplLmM6ICBVc2UgJXUgZm9ybWF0IHdoZXJlIGFwcHJvcHJpYXRlLgotCSogb2JqZHVtcC5jOiAgU3RhbmRhcmRpemU6ICBMX1NFVCAtPiBTRUVLX1NFVC4KLQkqIG9iamR1bXAuYzogIFVzZSBuZXcgbWFjcm8gYmZkX2FzeW1ib2xfYmZkLgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlIGRlZmF1bHQgJHtteXNfaG9zdH0uCi0KLVRodSBEZWMgMTcgMTk6Mzg6MTkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHZpIHRhcmdldCwgZGVmaW5lIGFuZCB1c2UgVEVYSTJEVkkKLQotVHVlIERlYyAxNSAxODowNTowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiAgRml4IHBlcm1pc3Npb25zIGJlZm9yZSByZWxlYXNlLgotCSogc2l6ZS5jOiAgVXNlIGJmZF9zaXplX3R5cGUgKGFuZCBsb25nKSB3aGVyZSBhcHByb3ByaWF0ZS4KLQkqIGFyLmM6ICBNYWtlIHdyaXRpbmcgYSBtYXAgdGhlIGRlZmF1bHQsIHRvIGJlIGNvbXBhdGlibGUKLQl3aXRoIFNZU1YgYW5kIFBvc2l4LjIuICBSZW1vdmUgc29tZSBib2d1cyBrbHVkZ2VzIHRoYXQKLQloYW5kbGVkIF9fLlNZTURFRiBkaXJlY3RseS4KLQkqIE5FV1M6ICBOZXcgZmlsZS4KLQotTW9uIE5vdiAgOSAxMzozNjo1MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmbGV4IG5vIGxvbmdlciBuZWVkcyB0aGUgLVMgZmxhZwotCi1TYXQgTm92ICA3IDE1OjA2OjEzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IHV0aW1lIG5lZWRzIGEgcG9pbnRlciB0byBhIHV0aW1idWYKLQotCSogTWFrZWZpbGUuaW46IGhhbmRsZSAtSSBpbmNsdWRlcyBiZXR0ZXIsIGFkZGluZyAkKEJBU0VESVIpL2JmZCB0bwotCXRoZSBsaXN0IChzaW5jZSBzb21lIG9mIHRoZSBiZmQvaG9zdHMvKi5oIGZpbGVzIGluY2x1ZGUgb3RoZXIKLQlmaWxlcyBmcm9tIHRoYXQgZGlyZWN0b3J5KQotCi1GcmkgTm92ICA2IDAwOjEyOjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBpOTYwLXBpbnNuLmMgKE1FTV9NQVgsIE1FTV9TSVopOiAgU2V0IHVwcGVyIGJvdW5kIHByb3Blcmx5LgotCi1UaHUgTm92ICA1IDAzOjM3OjE1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW4gdXAgc29tZSBvbGQgQkZEIGFuc2lmaWNhdGlvbiBtYWNyb3MuCi0KLQkqIGFyc3VwLmgsIGJ1Y29tbS5oLCBvYmpkdW1wLmg6ICBSZW1vdmUgRVhGVU4gZnJvbSBiaW51dGlscy4KLQlJdCBzdGlsbCByZW1haW5zIGFzIGEgbG9jYWwgbWFjcm8gaW4gZ21hbGxvYy5jLCB3aGljaCBpcyBkZXJpdmVkCi0JZnJvbSBzb21lIG90aGVyIGNvcHkgb2YgR05VIE1hbGxvYyBzb21ld2hlcmUgKEZJWE1FKS4KLQotCSogYXIuYywgb2JqZHVtcC5jLCBzaXplLmM6ICBSZXBsYWNlIEVYRlVOIHdpdGggUFJPVE8uICBNYWtlIHN0YXRpYwotCWZucyByZWFsbHkgc3RhdGljLgotCSogYXJzdXAuaDogIERlY2xhcmUgZXh0cmFjdF9maWxlcy4KLQotTW9uIE5vdiAgMiAxMjo0MjoxMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IGluc3RlYWQgb2YgY2hlY2tpbmcgVVNHOiBpZiBQT1NJWF9VVElNRSwKLQl1c2UgdXRpbWUgYW5kIHV0aW1idWYgc3RydWN0dXJlLCBvdGhlcndpc2UgaWYgVVNFX1VUSU1FIHVzZSB1dGltZQotCWFuZCBhcnJheSBvZiB0d28gbG9uZ3MsIG90aGVyd2lzZSB1c2UgdXRpbWVzLgotCi1UaHUgT2N0IDE1IDEzOjU3OjM1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXg6ICBEb2N1bWVudCB5ZXN0ZXJkYXkncyBjaGFuZ2VzIHRvIHN0cmlwIGFuZCBjb3B5LgotCi1XZWQgT2N0IDE0IDEzOjIyOjE0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb3B5LmM6ICBSZS1kbyBjb21tYW5kLWxpbmUgcGFyc2luZyB0byB1c2UgZ2V0b3B0X2xvbmcoKS4KLQlBZGQgbG9uZyBvcHRpb24gbmFtZXMuICBSZS10aGluayBvcHRpb24gbGV0dGVycyB0byBiZSBtb3JlCi0JY29uc2lzdGVudC4KLQkqIGNvcHkuYzogIE5ldyBmdW5jdGlvbiBmaWx0ZXJfc3ltYm9scygpIGZvciBzdHJpcHBpbmcgb25seQotCWRlYnVnLXN5bWJvbHMgYW5kL29yIGxvY2FsIHN5bWJvbHMuICBVc2UgdGhlc2UgdG8gc3VwcG9ydAotCXRoZSBwcmV2aW91c2x5LW1pc3Npbmcgb3B0aW9ucyBvZiB0aGUgb2xkIEZTRiBzdHJpcC4KLQotVHVlIE9jdCAxMyAwMToyNDoyMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0KTogIFVzZSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0IHJhdGhlcgotCXRoYW4gcmVwZWF0aW5nIGEgY29weSBvZiBpdCBoZXJlLgotCi1XZWQgT2N0ICA3IDEyOjUzOjUyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb3B5LmMgKG1haW4pOiBFdmVuIGlmIGlzX3N0cmlwLCBhY2NlcHQgLWQgYXJndW1lbnQgaW5kaWNhdGluZwotCWFsdGVybmF0ZSBvdXRwdXQgZm9ybWF0LiAgTmVlZGVkIGJ5IGdkYiBmb3IgTmluZHkuCi0KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3ICJgIiBvcGVyYW5kIHR5cGUuCi0KLVR1ZSBPY3QgIDYgMTY6MzM6NTYgMTk5MiAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogIGFkZGVkIGRvY3VtZW50YXRpb24gZm9yICJjb3B5IgotCi1UdWUgT2N0ICA2IDE0OjIyOjU2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBQZXJzU29ueSkKLQotCSogTWFrZWZpbGUuaW4gKCpjbGVhbiBydWxlcyk6IFNvbWUgY2xlYW5pbmcgdXAuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IE1ha2UgZGlzdHN0dWZmIGluIGdwcm9mIGZvciBhIGRpc3QuCi0KLQkqIGFyLmMgKGRvX3Nob3dfdmVyc2lvbik6ICBOZXcgZnVuY3Rpb24uCi0JKiBhci5jIChtYWluKTogIEZpeCBzbyAiYXIgLVYiIHdvcmtzLgotCi1UaHUgT2N0ICAxIDIyOjQ0OjQ1IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBub3cgdXNlcyB0aGUgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZgotCW5lc3RlZCBjYXNlcy4KLQotRnJpIFNlcCAyNSAyMjo0MTowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaTk2MC1waW5zbi5jOiAgQ2hhbmdlIGJ6ZXJvIHRvIG1lbXNldC4KLQkqIHNwYXJjLXBpbnNuLmM6ICBDaGFuZ2UgaW5kZXggdG8gc3RyY2hyLgotCi1Nb24gU2VwIDIxIDE0OjM5OjU2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1waW5zbiAocHJpbnRfaW5zbl9hcmcsIGZldGNoX2FyZyk6IGFkZGVkIHN1cHBvcnQgZm9yCi0Jb3BlcmFuZHMgdG8gbWVtb3J5IG1hbmFnZW1lbnQgaW5zdHJ1Y3Rpb25zLCBmcm9tIFdSUy4KLQotVHVlIFNlcCAxNSAxNToyNjozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaWYgJCh0b29sZGlyKSBleGlzdHMsIGluc3RhbGwgbm0gYW5kCi0Jc3RyaXAgaW4gJCh0b29sZGlyKS9iaW4uCi0KLVRodSBTZXAgIDMgMTE6NTc6NDAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIExldCdzIGNhbGwgaXQgdmVyc2lvbiAyLjAuCi0KLVdlZCBTZXAgIDIgMDA6MjU6MTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAwLjk4LgotCSogVE9ETywgUkVBRE1FOiAgTWlub3IgdXBkYXRlcy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBtb3N0bHljbGVhbiwgZGlzdGNsZWFuIHJ1bGVzLAotCWFuZCBjbGVhbmVkIHVwIGNsZWFuLCByZWFsY2xlYW4uCi0KLVN1biBBdWcgMzAgMjE6MTg6NTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFwIHByb2dyYW0gbmFtZXMgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0Jd2hlbiBpbnN0YWxsaW5nLgotCi1TdW4gQXVnIDMwIDE4OjA5OjAzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb25zIDEuOTcuOTAuCi0JKiBjcGx1cy1kZW0uYzogIFJlbW92ZWQuICBXYXMgbm93aGVyZSB1c2VkIC0gYW5kIGlmIHNvbWUKLQlwcm9ncmFtcyBhcmUgY2hhbmdlZCB0byB0byBkZW1hbmdsaW5nIHNob3VsZCBub3cgdXNlIHRoZQotCXZlcnNpb25zIGluIGxpYmliZXJ0eS4KLQotVGh1IEF1ZyAyNyAxMjo1ODowOSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCB3ZTMyawotCi1Nb24gQXVnIDI0IDE0OjUzOjQyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYXBfb3Zlcl9tZW1iZXJzKTogaWYgdGhlIGVsZW1lbnQgb2YgdGhlIGFyY2hpdmUgaGFzIGEKLQludWxsIG5hbWUsIGZpbGwgaXQgaW4uCi0KLQkqIG5tLmMgKGRvX29uZV9yZWxfZmlsZSk6IG9ubHkgd2FybiBpZiBhIGJmZCdzIGZsYWdzIHNheSB0aGVyZQotCXdpbGwgYmUgc3ltYm9scyBhbmQgdGhlcmUgYXJlbid0IGFueS4KLQotV2VkIEF1ZyAxOSAxMToyMDoyNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24uYzogaGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgJ3InLCBpbnRyb2R1Y2VkIGZvciBjYXMyLgotCi1UdWUgQXVnIDE4IDIwOjQ1OjQ4IDE5OTIgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogbm0uYyBvYmpkdW1wLmM6IEFkZGVkIHN1cHBvcnQgZm9yIGEgK3ZlcnNpb24gKC1WKQotCXRvIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlci4KLQotCSogYXIuYywgY29weS5jOiBBZGRlZCBzdXBwb3J0IGZvciBhIC1WIG9wdGlvbiB0byBwcmludAotCXRoZSB2ZXJzaW9uIG51bWJlci4KLQotVHVlIEF1ZyAxOCAxMzoyODo0NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1hcG9sbG82OHY6IHJlbW92ZWQgLWcgZnJvbSBDQyBkZWZpbml0aW9uLgotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLU1vbiBBdWcgMTcgMTg6MzM6NDEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtNjhrLXBpbnNuLmM6ICBNaW5vciBmaXggaW4gc3R5bGUgb2Ygb3V0cHV0IChkb24ndCB1c2UKLQlyYW5nZSB0byBpbmRpY2F0ZSBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVycykuCi0KLVR1ZSBBdWcgMTEgMjM6NDI6MjEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1haW4pOiAgRG9uJ3QgKmFsd2F5cyogc2V0IHRoZSB2ZXJib3NlIGZsYWchCi0KLVdlZCBBdWcgIDUgMTE6MjU6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb3B5LmM6ICBXaGVuIGlzX3N0cmlwIChiZWNhdXNlIGl0IGlzIGludm9rZWQgYXMgdGhlIHN0cmlwCi0JcHJvZ3JhbSksIGZvbGxvdyB0cmFkaXRpb25hbCBhcmd2IHByb2Nlc3Npbmc6Ci0JJ3N0cmlwIGZpbGUxIGZpbGUyJyBub3cgc3RyaXBzIGZpbGUxIGFuZCBmaWxlMiwgcmF0aGVyCi0JdGhhbiBzdHJpcHBpbmcgZmlsZTEgKGFzIGlucHV0KSwgbGVhdmluZyBvdXRwdXQgaW4gZmlsZTIuCi0KLU1vbiBKdWwgMjcgMTY6Mjg6MDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfaW5mbywgZGlzcGxheV9pbmZvX3RhYmxlKTogIENhbGwKLQliZmRfc2V0X2Zvcm1hdCgpIG9uIGR1bW15IGJmZCBiZWZvcmUgdXNpbmcgaXQgKHR3aWNlKS4KLQkqIGFyLmM6ICBNYWtlIHN1cmUgYXJjaGl2ZSBpcyBjcmVhdGVkIG9uIGNvbW1hbmQgJ3InCi0JZXZlbiB3aGVuIG5vIGVsZW1lbnRzIGFyZSBpbnNlcnRlZC4gIChDbGVhbiB1cCBhbmQKLQlzaW1wbGlmeSBzb21lIG5vbi13b3JraW5nIHJlbGF0ZWQgY29kZS4pCi0KLU1vbiBKdWwgMjAgMDI6NDg6MzggMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGhwcGEgc3VwcG9ydCBkb2Vzbid0IGFzc3VtZSBocCBPUyAoZnJvbSBzZWYpLgotCi1TYXQgSnVsIDE4IDE0OjM1OjIyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaHBwYSBob3N0cyAoYnNkICYgaHB1eCksIGVycm9yIG1lc3NhZ2VzCi0JdG8gc3RkZXJyLCBub3Qgc3Rkb3V0Ci0KLUZyaSBKdWwgMTcgMTg6Mzk6NDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhci4xLCBiaW51dGlscy50ZXhpLCBpOTYwLXBpbnNuLmMsIG5tLjEsIG9iamR1bXAuMSwgcmFubGliLjEsCi0JICBzaXplLjEsIHNwYXJjLXBpbnNuLmMsIHN0cmlwLjE6IHJlbW92ZWQgcmNzaWQncy4KLQotVGh1IEp1bCAxNiAxNjo1NToyNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmRvczogcmVtb3ZlZCByY3NpZC4KLQotVGh1IEp1bCAxNiAwODoyMzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2JmZCk6IHByaW50IHN0YXRlIG9mIEJGRF9JU19SRUxBWEFCTEUgdG9vCi0KLVR1ZSBKdW4gMzAgMjA6MjY6MTUgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKLQotVGh1IEp1biAyNSAwNDo1Mjo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbm0uYyAoc29ydGVycyk6ICBMaW50LiAgUmVtb3ZlIGV4Y2VzcyB3aGl0ZXNwYWNlLgotCi1XZWQgSnVuIDI0IDEzOjQ4OjA3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBubS5jICh2YWx1ZW9mIG1hY3JvKTogIEFkZCBtaXNzaW5nIHBhcmVudGhlc2VzLgotCShUaGVpciBsYWNrIHNjcmV3ZWQgdXAgbnVtZXJpY19mb3J3YXJkKCkuKQotCi1TdW4gSnVuIDE0IDEwOjMzOjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfZWxmX3N0YWJzKTogIEFsc28gZHVtcCAuc3RhYi5pbmRleCBhbmQKLQkuc3RhYi5leGNsIHNlY3Rpb25zLgotCShkdW1wX2VsZl9zdGFic18xKTogIFNwbGl0IG91dCBtYWluIGJvZHkgb2Ygb2xkIGR1bXBfZWxmX3N0YWJzLgotCSogb2JqZHVtcC4xLCBiaW51dGlscy50ZXhpOiAgRG9jdW1lbnQgbmV3IHNlY3Rpb25zIGR1bXBlZC4KLQotRnJpIEp1biAxMiAyMjoyMzozNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc2l6ZS5jLCBvYmpkdW1wLmMsIGJ1Y29tbS5jOiAgTGludC4KLQotVGh1IEp1biAxMSAwMToxOTowNiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX2VsZl9zdGFicyk6IE5ldyBmZWF0dXJlOiAtLXN0YWJzIHByaW50cyBvdXQgYQotCS5zdGFiIHNlY3Rpb24gZnJvbSBhbiBFTEYgZmlsZS4gIEluc3RhbGxlZCB1bmRlciAjaWZkZWYKLQlFTEZfU1RBQl9ESVNQTEFZIHNvIGl0IGNhbiBiZSBlYXNpbHkgZGlzYWJsZWQsIHNpbmNlIGl0IHJlcXVpcmVzCi0JYmZkLWludGVybmFscyBoZWFkZXIgZmlsZXMgYW5kIHN1Y2guCi0JKiBvYmpkdW1wLjEsIGJpbnV0aWxzLnRleGk6ICBVcGRhdGUgZm9yIC0tc3RhYnMuICBBbHNvIGZpeAotCW9iamR1bXAncyBkb2MgdG8gdXNlIC0tIHJhdGhlciB0aGFuICsgZm9yIGxvbmcgb3B0aW9ucy4KLQkoRklYTUU6ICBOb3QgeWV0IGZpeGVkIGV2ZXJ5d2hlcmUgaW4gYmludXRpbHMudGV4aW5mby4pCi0KLVdlZCBKdW4gMTAgMDc6NTM6MjQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyhkaXNwbGF5X2luZm8pLCBwYXRjaGVzIGZyb20KLQltb2hyaW5nQGluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUgdG8gcHJpbnQgdGhlIHRhYmxlIG11Y2ggbW9yZQotCW5pY2VseS4KLQotVGh1IE1heSAyOCAxMzozNjoxNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogIEFkZCBhbm90aGVyIGVudW0tPmludCBjYXN0LCBmb3IgdGhlIHNha2Ugb2YKLQlvbGQgY29tcGlsZXJzIChzdWNoIGFzIFBDQykuCi0KLVdlZCBNYXkgMjcgMTM6MDE6NDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcmxleC5sOiAgRG9uJ3QgaW5jbHVkZSA8c3lzZGVwLmg+ICh1bm5lZWRlZCBjb25mbGljdHMpLgotCUFkZCBkZWNsYXJhdGlvbiBvZiBzdHJkdXAoKS4KLQotRnJpIE1heSAyMiAxMzo0MDozNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBVc2Ugc3JjZGlyIGluc3RlYWQgb2YgVlBBVEggaW4gbGRncmFtL2xkbGV4Ci0JcnVsZXMsIHNpbmNlIHRoZXNlIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgYSBkaXN0cmlidXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoYXJsZXguYyk6ICBEb24ndCByZS1kaXJlY3Qgb3V0cHV0LCBzaW5jZSB0aGF0Ci0JbGVhdmVzIGEgYm9ndXMgb3V0cHV0IGZpbGVzIGlmIGl0IGZhaWxzLgotCi0JKiBhcmxleC5sOiAgTWFrZSB3b3JrIHdpdGggbGV4LCBmb3Igd2hhdCBpdCdzIHdvcnRoLgotCSogTWFrZWZpbGUuaW46ICBCZXR0ZXIgbGV4IHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6ICBHZW5lcmF0ZSBmbGV4IGFuZCBiaXNvbiBvdXRwdXRzCi0JZm9yIGRpc3RyaWJ1dGlvbi4KLQotVGh1IE1heSAxNCAxNzoxNzo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBnZXQgQklTT04gZGVmaW5pdGlvbiByaWdodC4KLQotRnJpIE1heSAgOCAwNzo0NzowOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogc2FuaXR5LnNoOiBkZWZhdWx0IFRNUERJUiB0byAiLiIuCi0KLVRodSBNYXkgIDcgMTI6MzQ6NTAgMTk5MiAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogYWRkIGRvYyBmb3IgYXIgY29tbWFuZCBsYW5ndWFnZS4KLQotV2VkIE1heSAgNiAxODowNTozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJwYXJzZS55OiBtYWtlIEVORCBjYWxsIGFyX2VuZAotCSogYXJzdXAuYyAoYXJfZW5kKTogYWRkZWQsIGRlbGV0ZXMgdGVtcCBmaWxlIGlmIGFyY2hpdmUgc2Vzc2lvbgotCWFib3J0ZWQuCi0KLQotV2VkIE1heSAgNiAxMTowODo1MyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgYmlzb24gJiBmbGV4IGZyb20gLi4vIGlmIHRoZXkgZXhpc3QuICBBbHNvLAotCSAgRkxFWC0+TEVYLgotCi0JKiBzYW5pdHkuc2g6IHJlbW92ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdoZW4gZmluaXNoZWQuCi0KLVR1ZSBNYXkgIDUgMTI6MDA6NTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjk3LgotCSogYXIuYzogIERlY2xhcmUgZXJybm8gZm9yIG1hY2hpbmVzIHRoYXQgbmVlZCBpdC4KLQotTW9uIE1heSAgNCAyMzoyOTo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8pOiAgSGFuZGxlIGVycm9yIGNhc2VzIHdpdGhvdXQgY29yZWR1bXAuCi0JQ2xvc2UgdGhlIGR1bW15IHRlbXBvcmFyeSBmaWxlIHdlIG9wZW4gaW4gdGhlIGxvb3AuCi0JKiBNYWtlZmlsZS5pbiAoYXJzdXAubyk6ICBBZGQga2x1ZGdlIHRvIGJ1aWxkIHdpdGggU3VuIE1ha2UuCi0KLUZyaSBNYXkgIDEgMTY6MjA6MjMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0ZXN0LWluc3RhbGwgdGFyZ2V0LgotCi0JKiBzYW5pdHkuc2g6IG5ldyBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbjogdXNlIHNhbml0eSB0ZXN0IG9uIG1ha2UgY2hlY2suCi0KLVR1ZSBBcHIgMjEgMTM6Mzg6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgdGhleSBjYW4gYmUgcGFzc2VkIG9uIHRoZQotCSAgY29tbWFuZCBsaW5lIHRvIG1ha2UuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1XZWQgQXByIDE1IDE0OjMzOjA3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcnN1cC5jLCBhcnN1cC5oLCBhcnBhcnNlLnksIGFybGV4Lmw6IHN1cHBvcnQgZm9yIGFyY2hpdmUKLQlzY3JpcHRpbmcgbGFuZ3VhZ2UuCi0KLUZyaSBNYXIgIDYgMjE6NTQ6NTMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVRodSBNYXIgIDUgMjE6MzU6NDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4KLQotVHVlIE1hciAgMyAxNTozNjozNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgJChDT1BZX1BST0cpIGZyb20gUFJPR1MuICBJdCBzaG91bGRuJ3QgYmUKLQkgIGluc3RhbGxlZC4gYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1TdW4gRmViIDE2IDEyOjUzOjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdmVyc2lvbiB0byAxLjk2LCBhbmQgcmVtb3ZlIC1iZXRhCi0Jc3VmZml4IGZyb20gZGlzdHJpYnV0aW9uIG5hbWUuCi0JKiBtNjhrLXBpbnNuLmM6ICBOZXcgbWFjcm8gQ09FUkNFX1NJR05FRF9DSEFSIHRvIGV4dHJhY3QKLQl0aGUgc2lnbmVkIHZhbHVlIG9mIGEgY2hhcmFjdGVyIChldmVuIGlmIGNoYXJzIGFyZSB1bnNpZ25lZCkuCi0JKiBzcGFyYy1waW5zbi5jOiAgQWRkIG5ldyBvcGVyYW5kIHR5cGVzLgotCi1UaHUgRmViICA2IDEyOjE0OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBkb24ndCBwcmludCBhIHNlY3Rpb24ncyBjb250ZW50cwotCWlmIGl0J3Mgbm90IGxvYWRhYmxlIChlZyBic3MpCi0KLVR1ZSBKYW4gMjggMTE6MTE6MDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiBmaXhlZCBzbyB0aGF0IC12ZSBicmFuY2gKLQlkaXNwbGFjZW1lbnRzIGRvbid0IGdldCBwcmludGVkIGFzIGxhcmdlICt2ZSBvbmVzLgotCi1GcmkgSmFuIDI0IDE0OjQ3OjUzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb3B5LmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jIDogY2hhbmdlZCB0byB1c2UgdGhlCi0JbmV3IHJlbG9jIHNjaGVtZS4KLQotCi1Nb24gRGVjIDMwIDE4OjM0OjQxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBidWNvbW0uYyAocHJpbnRfYXJlbHRfZGVzY3IpOiAgVHdlZWsgdGhlIG91dHB1dCBmb3JtYXQKLQlzbyB0aGF0ICdhciB0dicgb3V0cHV0IGZvbGxvd3MgUG9zaXggMTAwMy4yL0QxMS4KLQlPdXRwdXQgaXMgbm93IGFsc28gaWRlbnRpY2FsIHRvIFN1bidzIChleGNlcHQgX18uU1lNREVGKS4KLQotTW9uIERlYyAzMCAwNjowOTo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBNYWtlIGBtYWtlJyBvdXRwdXQgbW9yZSByZWFkYWJsZS4KLQotV2VkIERlYyAxOCAxNTowNDo0NSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMS45NC4KLQotV2VkIERlYyAxMSAxNjo0ODowOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBhci5jOiBhZGRlZCAiYiIgdG8gZm9wZW5zIGZvciBkb3MKLQkqIGNvbmZpZ2RqLmJhdCwgbWFrZWZpbGUuZG9zIG5ldyBmaWxlcyBmcm9tIERKCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLVNhdCBEZWMgIDcgMTc6MDk6MzcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGJ1Y29tbS5oOiBjcmVhdGVkIHRvIGhvbGQgcHJvdG90eXBlcyBvZiBidWNvbW0uYwotCSogb2JqZHVtcC5oOiBjcmVhdGVkIHRvIGhvbGQgcHJvdG90eWVzIG9mIG9iamR1bXAuYwotCSogYW0yOWstcGluc24uYzogaW5jbHVkZSBvYmpkdW1wLmgKLQkqIGFyLmM6IGluY2x1ZGUgYnVjb21tLmgsIGdldCBhci5oIGZyb20gdGhlIHJpZ2h0IHBsYWNlIGFuZAotCWluY2x1ZGUgbGliYmZkLmgKLQkqIGJ1Y29tbS5jOiBkZWZ1bml6ZSBiZmRfZmF0YWwKLQkqIGNvcHkuYzogaW5jbHVkZSBidWNvbW0uaCwgbGludC4KLQkqIGk5NjAtcGluc24uaDogaW5jbHVkZSBidWNvbW0uaAotCSogbTY4ay1waW5zbi5oOiBsaW50Ci0JKiBubS5jOiBpbmNsdWRlIGJ1Y29tbS5oLCBsaW50Ci0JKiBvYmpkdW1wLmM6IGxpbnQKLQkqIHNwYXJjLXBpbnNuLmM6IGluY2x1ZGUgb2JqZHVtcC5oCi0KLQotCi1GcmkgRGVjICA2IDIzOjAyOjE0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuICBpbnN0YWxsIHVzaW5nCi0JICBJTlNUQUxMX1BST0dSQU0gYW5kIElOU1RBTExfREFUQS4KLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgbm93IGRvZXMgYWxsIG9mIGl0J3Mgd29yayBmcm9tIG9iamRpciBzbwotCSAgbWFrZSBmaWxlIGV4aXN0ZW5jZSB0ZXN0cyBhZ2FpbnN0ICR7c3JjZGlyfS4KLQotVGh1IERlYyAgNSAyMjo0NjoyMiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLVdlZCBEZWMgIDQgMjI6NDI6MDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTMuCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBtYWtlLXN0cmlwLm86bWF5YmUtc3RyaXAuYyBkZXBlbmRlbmN5Ci0JZm9yIG1ha2UgdmVyc2lvbnMgdGhhdCBwcm92aWRlIGhhbGYtYmFrZWQgVlBBVEgtc3VwcG9ydCAoZS5nLiBTdW4ncykuCi0JKiBzaXplLmM6ICBJbXByb3ZlbWVudHMgc3VnZ2VzdGVkIGJ5Ci0JImRhdmlkIGQgW3pvb10genVobiIgPHpvb0BhcHMxLnNwYS51bW4uZWR1PjoKLQktIERvbid0IGVtaXQgKEJlcmtlbGV5KSBoZWFkZXJzIGlmIG5vIGZpbGVzIHdlcmUgZm91bmQuCi0JLSBSZXR1cm4gYSBub24temVybyByZXR1cm4gY29kZSBvbiBmYWlsdXJlLgotCi1TYXQgTm92IDMwIDIxOjM0OjE5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyBkdWUgdG8gaW5jbHVkZSBmaWxlIHJlbmFtaW5nOgotCSogYW0yOWstcGluc24uYzogYTI5ay1vcGNvZGUuaAktPiBvcGNvZGUvYTI5ay5oCi0JKiBzcGFyYy1waW5zbi5jOiBzcGFyYy1vcGNvZGUuaAktPiBvcGNvZGUvc3BhcmMuaAotCSogbTY4ay1waW5zbi5jOgkgbTY4ay1vcGNvZGUuaAktPiBvcGNvZGUvbTY4ay5oCi0JKiBubS5jOgkJIHN0YWIuZ251LmgJLT4gYW91dC9zdGFiX2dudS5oCi0KLVR1ZSBOb3YgMTkgMTk6MjA6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIE1lbnRpb24gTUlOSU1JWkUgZmxhZyBmb3IgYmZkJ3MgbWFrZS4KLQotTW9uIE5vdiAxOCAxMjowNTozNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgVmFyaW91cyBpbXByb3ZlbWVudHMuCi0KLVN1biBOb3YgMTcgMjM6NDA6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTIuCi0JKiB2ZXJzaW9uLmMsIE1ha2VmaWxlLmluOiAgR2V0IHZlcnNpb24gc3RyaW5nIGZyb20gTWFrZWZpbGUuCi0JKiBjb3B5LmMsIGlzLXN0cmlwLmMsIG5vdC1zdHJpcC5jLCBtYXliZS1zdHJpcC5jLCBNYWtlZmlsZS5pbjoKLQlNYWtlIHRoZSBzYW1lIGNoYW5nZSB0aGF0IHdlIGVhcmxpZXIgZGlkIGZvciBhci9yYW5saWI6Ci0JR2VuZXJhdGUgdHdvIGRpZmZlcmVudCBiaW5hcmllcyBmb3Igc3RyaXAgYW5kIGNvcHkgYW5kIHVzZQotCWEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggZGlmZmVyZW50IHZhbHVlcyB0byBkaXN0aW5ndWlzaAotCW9zdHJpcCBmcm9tIGNvcHkuICAoLTEgbWVhbnMgdG8gdXNlIGFyZ3ZbMF0gdG8gZGVjaWRlLAotCXNvIHlvdSBjYW4gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIGJ1dCBpdCBpcyBubyBsb25nZXIgdGhlIGRlZmF1bHQpLgotCSogY29weS5jIChjb3B5X2ZpbGUpOiAgU2V0IEVYRUNfUCBvZiBvdXRwdXQgYmZkIGlmIGlucHV0IGlzIHNvLgotCSogY29weS5jIChtYWluKTogIElmIGlzX3N0cmlwPT0tMSwgY29tcGFyZSBsYXN0IDUgY2hhcnMKLQlvZiBhcmd2WzBdLCBub3QgdGhlIHdob2xlIHBhdGguCi0JKiBjb3B5LmMgKG1haW4pOiBSZXR1cm4gMCwgbm90IDEuCi0JKiBjb3B5LmMgKHNldHVwX3NlY3Rpb25zKTogIEZpeCBkdWUgdG8gY2hhbmdlIGluIGJmZF9tYWtlX3NlY3Rpb24KLQlub3cgZmFpbGluZyBpZiBhc2tlZCBmb3IgYSBkdXBsaWNhdGUgc2VjdGlvbi4KLQkqIHN0cmlwLmMsIG9zdHJpcC5jOiAgUmVtb3ZlZCBvYnNvbGV0ZSBmaWxlcy4KLQkqIGFyLmMsIG5vdC1yYW5saWIuYywgbWF5YmUtcmFubGliLmM6Ci0JQ2hhbmdlIGVuY29kaW5nIG9mIGlzX3JhbmxpYiB2YXJpYWJsZSB0byBiZSBjb25zaXN0ZW50Ci0Jd2l0aCBpc19zdHJpcCBmb3Igc3RyaXAuY29weSAoaS5lIC0xIHRvIG1lYW5zIHVzZSBhcmd2WzBdKS4KLQotVGh1IE5vdiAxNCAyMDoxMTowMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jIChwcm9ncmFtX3ZlcnNpb24pOiBVcGRhdGUgdG8gdmVyc2lvbiAxLjkyLgotCi1UdWUgTm92IDEyIDE2OjE3OjUzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhci5jIChnZXRfcG9zX2JmZCk6ICBQcmV2aW91cyBmaXggd2FzIG1pc3NpbmcgYSAiYnJlYWsiLgotCi1UaHUgTm92ICA3IDA4OjU1OjU2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGFtMjlrLXBpbnNuLmM6IEZpeGVkIGJ1ZyBpbiBtdGFjYywgZG1hYyBhbmQgZm1hYyBpbnN0cnVjdGlvbgotCWVuY29kaW5ncy4gKFRoYWtzIHRvIERhdmlkIFdvb2QpCi0KLVN1biBOb3YgIDMgMTQ6NTA6MjMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgkKERJU1RfTkFNRSkudGFyLlopLCBUT0RPOiAgVmFyaW91cyBmaXhlcy4KLQkqIGFyLmMgKGdldF9wb3NfYmZkKTogRml4IHRvIGhhbmRsaW5nIG9mIGJlZm9yZS9hZnRlcgotCXBvc2l0aW9uaW5nIG9wdGlvbnMuCi0JKiBidWNvbW0uYyAoZmF0YWwpOiAgTUlTU0lOR19WRlBSSU5URiBpcyBubyBsb25nZXIgYW4gaXNzdWUsCi0Jc2luY2UgbGliaWJlcnR5IGNvbnRhaW5zIHZmcHJpbnRmIGV0YyBpZiBvdGhlcndpc2UgbWlzc2luZy4KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiAgU3VwcG9ydCBCQi9CVy9CTAotCXR5cGUgb3BlcmFuZHMsIGFzIHVzZWQgYnkgYnJhbmNoIGluc3RydWN0aW9ucy4KLQkqIG5tLmM6ICBEZWxlZ2F0ZSBwcmludGluZyBvZiBzeW1ib2xzIHRvIEJGRCwKLQlieSB1c2luZyBiZmRfcHJpbnRfc3ltYm9sIHRvIGRvIHRoZSBmb3JtYXR0aW5nLgotCi1Nb24gT2N0IDI4IDExOjIwOjQ3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYyAod3JpdGVfYXJjaGl2ZS5jKTogYWRkZWQgdW5saW5rIGJlZm9yZSByZW5hbWUgc2luY2Ugc29tZQotCXN5c3RlbXMgY2FuJ3QgcmVuYW1lIG9udG8gYW4gZXhpc3RhbnQgZmlsZS4KLQotTW9uIE9jdCAyMSAwOTo0NzoyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBubS5jOiBub3cgZG9lc24ndCBjcmFzaCBpZiBhIHN5bWJvbCB3aXRoIG5vIHNlY3Rpb24gYW5kIG5vCi0JU0VDX0FCUyBhcHBlYXJzLgotCi1UaHUgT2N0IDE3IDE1OjI1OjUwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgdmVyc2lvbi5jOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTEuCi0KLVdlZCBPY3QgMTYgMTE6NDU6MzYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhci5jLCBidWNvbW0uYywgY29weS5jLCBjcGx1cy1kZW0uYywgZmlsZW1vZGUuYywKLQlpOTYwLXBpbnNuLmMsIG02OGstcGluc24uYywgbm0uYywgb2JqZHVtcC5jLCBzaXplLmMsIHNwYXJjLXBpbnNuLmMsCi0JKiBzdHJpcC5jOiBBZGQgb3IgdXBkYXRlIENvcHlyaWdodCBub3RpY2UuCi0JKiBUT0RPOiAgQWRkIG5vdGUgb24gJ25tIC1hJy4KLQkqIHZlcnNpb24uYzogVXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTAuCi0JKiBNYWtlZmlsZS5pbjogRml4IG1ha2luZyBvZiBkb2N1bWVudGF0aW9uIGZvciBkaXN0LgotCi1UdWUgT2N0IDE1IDAwOjE3OjE3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IE5ldyBrbHVkZ3kgcnVsZXMgZm9yIG1ha2luZyBhIHRhcmZpbGUuCi0JKiBNYWtlZmlsZS5pbjogRml4IGJpbmRpciBwYXRoLgotCi1Nb24gT2N0IDE0IDE3OjM0OjI5IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgdGFyZ2V0cyBiaW51dGlscy5tbSwgYmludXRpbHMubWUKLQotRnJpIE9jdCAxMSAyMjo0NDoyMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCBTdW4gTWFrZSBWUEFUSCBidWdzIGJ5IGFkZGluZyBkZXBlbmRlbmNpZXMuCi0KLUZyaSBPY3QgMTEgMTI6NTE6MzMgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCB0YXJnZXQgImJpbnV0aWxzLm1zIgotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBtaW5vciByZXN0cnVjdHVyaW5nIGZvciB0ZXhpMnJvZmYgY29tZm9ydC4KLQotRnJpIE9jdCAxMSAwNDoxMjoyOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KLQotCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIC4uL2JmZC9ob3N0cy9oLXh4eC5oLgotCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgotCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCi0JZ2V0IGRlZmluZWQgZmlyc3QuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSAtSS4gdG8gZ2V0IHN5c2RlcC5oLgotCi1XZWQgT2N0ICA5IDIyOjQyOjU2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBubS5jIChwcmludF9zeW1ib2xzKTogIEhhbmRsZSBOVUxMIG5hbWUgZmllbGQgb2Ygc3ltYm9sLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZWQgc3B1cmlvdXMgY29tbWVudC4KLQotVHVlIE9jdCAgOCAxNjo1NTowMyAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBtaW5vciB0eXBvcywgcGhyYXNpbmcsIGZvcm1hdHRpbmcgZml4ZXMuCi0KLVR1ZSBPY3QgIDggMTU6MTM6MjAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IGhvc3QgZmlsZSBmcm9tIC4uL2JmZC9jb25maWcsIG5vdCBjb25maWcuCi0JKiBjb25maWcvKjogUmVtb3ZlIGNvbmZpZyBkaXJlY3RvcnkgYW5kIGl0cyBmaWxlcy4KLQotVHVlIE9jdCAgOCAxMzo1ODo1OSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgYmludXRpbHMuZHZpLCBiaW51dGlscy5pbmZvCi0KLQkqIGJpbnV0aWxzLnRleGluZm86IHJlbW92ZSBtb3N0IHJlbWFpbmluZyBGSVhNRSdzLCBkZWxldGUKLQlyZWZlcmVuY2VzIHRvIF9fLlNZTURFRiBieSBuYW1lCi0KLQotVHVlIE9jdCAgOCAxMDoyMzo0NCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAocHJpbnRfYWRkcmVzcykgUHJpbnQgYWRkcmVzc2VzIG5pY2VseS4KLQotTW9uIE9jdCAgNyAxMTozMTowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYywgTWFrZWZpbGUuaW4sIG5ldyBmaWxlcyB7aXMsbm90LG1heWJlfS1yYW5saWIuYzoKLQlNYWtlIHR3byBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIGFyIGFuZCByYW5saWIsIGluc3RlYWQgb2YKLQlkaXN0aW5ndWlzaGluZyB0aGVtIGF0IHJ1biB0aW1lIHVzaW5nIGFyZ3ZbMF0uCi0JKE9sZCBiZWhhdmlvciBpcyBzdGlsbCBhdmFpbGFibGUgaWYgeW91ICJtYWtlIGFyX3dpdGhfcmFubGliIiwKLQlidXQgaXQgaXMgbm90IHRoZSBkZWZhdWx0LikKLQkqIHJhbmxpYi5zaCAobmV3KTogIEFuIGFsdGVybmF0aXZlIG9uZS1saW5lCi0Jc2hlbGwgaW1wbGVtZW50YXRpb24gb2YgcmFubGliLgotCi1GcmkgT2N0ICA0IDIxOjQ5OjQ0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6ICBDb3BlIHdpdGggcmVuYW1lcyBvZiBhIGZldyBCRkQgdHlwZXMgJiBlbnVtcy4KLQotRnJpIE9jdCAgNCAxOTowODowOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBhZGQgbmV3IGZpbGUgKHJ1ZGltZW50YXJ5IGRvY24pCi0KLU1vbiBTZXAgMzAgMTI6MzA6MzkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9obWFrZS1uZXdzOiBBZGQgbmV3IGZpbGUgKGZvciBTb255IE5FV1NPUzMpLgotCSogYnVjb21tLmMgKGZhdGFsKTogIENvbmRpdGlvbmFsbHkgY29tcGlsZSBmYXRhbCgpIGRlcGVuZGluZyBvbgotCU1JU1NJTkdfVkZQUklOVEYsIGFuZCBkb24ndCBjb25mdXNlIHRoZSBpc3N1ZSB3aXRoIE5PX1ZBUkFSR1MuCi0JKiBvYmpkdW1wLmMgKGR1bXBfaGVhZGVycyk6ICBUcml2aWFsIG91dHB1dCBmb3JtYXQgY2hhbmdlLgotCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8pOiBMb29wIG92ZXIgaW50ZWdlcnMsIG5vdCBlbnVtcywKLQl0byBhcHBlYXNlIG9sZCBjb21waWxlcnMuCi0KLU1vbiBNYXkgMjAgMTY6MTQ6MDcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotICAgICAgICAqb2JqZHVtcC5jICpubS5jICpjb3B5LmMgOmhhbmdlZCBzb21lIHR5cGVzIHRvIHdvcmsgd2l0aCA2NCBiaXQgb2JqZWN0IGZpbGVzCi0KLVRodSBNYXkgMTYgMTY6MDY6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLSAgICAgZnJvbSBib3RoZXIKLQkqIG9iamR1bXAuYyAocHJpbnRfYWRkcmVzcyk6IE1ha2UgZGlzYXNlbWJsZWQgb3V0cHV0IG1vcmUKLQljb25zaXN0ZW50IHdpdGggZ2RiIGFuZCBhczogQWRkIDB4IHdoZW4gcHJpbnRpbmcgaGV4LgotCURvbid0IHByaW50IGV4dHJhIGxlYWRpbmcgemVyb3MuCi0JQXR0ZW1wdCB0byBub3QgcHJpbnQgImZpbGVuYW1lLm8iLgotCSogb2JqZHVtcC5jOiBBZGQgc29tZSBlbnVtLXRvLWludCBjYXN0cyB0byBhY2NvbW9kYXRlIG9sZCBjb21waWxlcnMuCi0KLQotRnJpIE1heSAgMyAyMjoyMTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvcHkuYzogIENoYW5nZSA9JiBjb25zdHJ1Y3RzIHRvID0gJiwgc2luY2UgdGhleSBjb25mdXNlIG9sZGVyCi0JQyBjb21waWxlcnMuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL01ha2VmaWxlLmFtIGIvYmludXRpbHMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YmQ2YjcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi0jIyBGSVhNRTogV29yayBhcm91bmQgYXBwYXJlbnQgYnVnIGluIGF1dG9tYWtlLgotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi0jIyBUaGVzZSBhcmVuJ3Qgc2V0IGJ5IGF1dG9tYWtlLCBiZWNhdXNlIHRoZXkgYXBwZWFyIGluCi0jIyBiZmQvYWNpbmNsdWRlLm00LCB3aGljaCBpcyBpbmNsdWRlZCBieSBiaW51dGlscy9hY2luY2x1ZGUubTQsIGFuZAotIyMgdGh1cyBpcyBub3Qgc2VlbiBieSBhdXRvbWFrZS4KLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwkKHNyY2RpcikvLi4vYmlzb24vOyBlbHNlIGVjaG8gQFlBQ0NAOyBmaWAKLVlGTEFHUyA9IC1kCi1MRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXTsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleDsgZWxzZSBlY2hvIEBMRVhAOyBmaWAKLQotIyB0aGVzZSB0d28gYXJlIGFsbW9zdCB0aGUgc2FtZSBwcm9ncmFtCi1BUl9QUk9HPWFyCi1SQU5MSUJfUFJPRz1yYW5saWIKLQotIyBvYmpjb3B5IGFuZCBzdHJpcCBzaG91bGQgYmUgdGhlIHNhbWUgcHJvZ3JhbQotT0JKQ09QWV9QUk9HPW9iamNvcHkKLVNUUklQX1BST0c9c3RyaXAtbmV3Ci0KLVNUUklOR1NfUFJPRz1zdHJpbmdzCi0KLVJFQURFTEZfUFJPRz1yZWFkZWxmCi0KLSMgVGhlc2Ugc2hvdWxkIGFsbCBiZSB0aGUgc2FtZSBwcm9ncmFtIHRvby4KLVNJWkVfUFJPRz1zaXplCi1OTV9QUk9HPW5tLW5ldwotT0JKRFVNUF9QUk9HPW9iamR1bXAKLQotIyBUaGlzIGlzIHRoZSBkZW1hbmdsZXIsIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotIyBOb3RlOiBUaGlzIG9uZSBpcyB1c2VkIGFzIHRoZSBpbnN0YWxsZWQgbmFtZSB0b28sIHVubGlrZSB0aGUgYWJvdmUuCi1ERU1BTkdMRVJfUFJPRz1jeHhmaWx0Ci0KLUFERFIyTElORV9QUk9HPWFkZHIybGluZQotCi1OTE1DT05WX1BST0c9bmxtY29udgotRExMVE9PTF9QUk9HPWRsbHRvb2wKLVdJTkRSRVNfUFJPRz13aW5kcmVzCi1ETExXUkFQX1BST0c9ZGxsd3JhcAotCi1TUkNPTlZfUFJPRz1zcmNvbnYkKEVYRUVYVCkgc3lzZHVtcCQoRVhFRVhUKSBjb2ZmZHVtcCQoRVhFRVhUKSAKLQotbWFuX01BTlMgPSBhci4xIG5tLjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMSBzdHJpbmdzLjEgc3RyaXAuMSBvYmpjb3B5LjEgXAotCWFkZHIybGluZS4xIG5sbWNvbnYuMSAkKERFTUFOR0xFUl9OQU1FKS4xCi0KLVBST0dTID0gJChTSVpFX1BST0cpICQoT0JKRFVNUF9QUk9HKSAkKE5NX1BST0cpICQoQVJfUFJPRykgJChTVFJJTkdTX1BST0cpICQoU1RSSVBfUFJPRykgJChSQU5MSUJfUFJPRykgJChERU1BTkdMRVJfUFJPRykgJChPQkpDT1BZX1BST0cpIEBCVUlMRF9OTE1DT05WQCBAQlVJTERfU1JDT05WQCBAQlVJTERfRExMVE9PTEAgQEJVSUxEX1dJTkRSRVNAICQoQUREUjJMSU5FX1BST0cpICQoUkVBREVMRl9QUk9HKSBAQlVJTERfRExMV1JBUEAgQEJVSUxEX01JU0NACi0KLWJpbl9QUk9HUkFNUyA9ICQoU0laRV9QUk9HKSAkKE9CSkRVTVBfUFJPRykgJChBUl9QUk9HKSAkKFNUUklOR1NfUFJPRykgJChSQU5MSUJfUFJPRykgJChPQkpDT1BZX1BST0cpIEBCVUlMRF9OTE1DT05WQCBAQlVJTERfU1JDT05WQCBAQlVJTERfRExMVE9PTEAgQEJVSUxEX1dJTkRSRVNAICQoQUREUjJMSU5FX1BST0cpICQoUkVBREVMRl9QUk9HKSBAQlVJTERfRExMV1JBUEAgQEJVSUxEX01JU0NACi0KLSMjIFdlIG5lZWQgYSBzcGVjaWFsIHJ1bGUgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGgKLSMjIC1uZXcsIGFuZCB0byByZW5hbWUgY3h4ZmlsdCB0byBjKytmaWx0Lgotbm9pbnN0X1BST0dSQU1TID0gJChOTV9QUk9HKSAkKFNUUklQX1BST0cpICQoREVNQU5HTEVSX1BST0cpCi0KLUVYVFJBX1BST0dSQU1TID0gJChOTE1DT05WX1BST0cpIHNyY29udiBzeXNkdW1wIGNvZmZkdW1wICQoRExMVE9PTF9QUk9HKSAkKFdJTkRSRVNfUFJPRykgJChETExXUkFQX1BST0cpCi0KLSMgU3R1ZmYgdGhhdCBnb2VzIGluIHRvb2xkaXIvIGlmIGFwcHJvcHJpYXRlCi1UT09MX1BST0dTID0gbm0tbmV3IHN0cmlwLW5ldyBhciByYW5saWIgZGxsdG9vbAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSCT0gJChCQVNFRElSKS9pbmNsdWRlCi0KLU1LREVQID0gbWtkZXAKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoQkZERElSKSAtSSQoSU5DRElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotSEZJTEVTID0gYXJzdXAuaCBidWNvbW0uaCBidWRiZy5oIGNvZmZncm9rLmggZGVidWcuaCBubG1jb252LmggZGxsdG9vbC5oIFwKLQl3aW5kcmVzLmggd2luZHVuaS5oIGR5bi1zdHJpbmcuaAotCi1HRU5FUkFURURfSEZJTEVTID0gYXJwYXJzZS5oIHN5c3JvZmYuaCBzeXNpbmZvLmggZGVmcGFyc2UuaAotCi1DRklMRVMgPSBhZGRyMmxpbmUuYyBhci5jIGFyc3VwLmMgYnVjb21tLmMgY29mZmR1bXAuYyBjb2ZmZ3Jvay5jIGRlYnVnLmMgXAotCWRsbHRvb2wuYyBmaWxlbW9kZS5jIGllZWUuYyBpcy1yYW5saWIuYyBpcy1zdHJpcC5jIG1heWJlLXJhbmxpYi5jIFwKLQltYXliZS1zdHJpcC5jIG5sbWNvbnYuYyBubS5jIG5vdC1yYW5saWIuYyBub3Qtc3RyaXAuYyBcCi0Jb2JqY29weS5jIG9iamR1bXAuYyBwcmRiZy5jIHJkY29mZi5jIHJkZGJnLmMgc2l6ZS5jIHNyY29udi5jIFwKLQlzdGFicy5jIHN0cmluZ3MuYyBzeXNkdW1wLmMgdmVyc2lvbi5jIHdyc3RhYnMuYyBcCi0Jd2luZHJlcy5jIHJlc3JjLmMgcmVzY29mZi5jIHJlc2Jpbi5jIHdpbmR1bmkuYyByZWFkZWxmLmMgXAotCXJlc3Jlcy5jIGR5bi1zdHJpbmcuYyBkbGx3cmFwLmMgcmVuYW1lLmMKLQotR0VORVJBVEVEX0NGSUxFUyA9IFwKLQl1bmRlcnNjb3JlLmMgYXJwYXJzZS5jIGFybGV4LmMgc3lzcm9mZi5jIHN5c2luZm8uYyBzeXNsZXguYyBcCi0JZGVmcGFyc2UuYyBkZWZsZXguYyBubG1oZWFkZXIuYyByY3BhcnNlLmMgcmNsZXguYwotCi1ERUJVR19TUkNTID0gcmRkYmcuYyBkZWJ1Zy5jIHN0YWJzLmMgaWVlZS5jIHJkY29mZi5jCi1XUklURV9ERUJVR19TUkNTID0gJChERUJVR19TUkNTKSB3cnN0YWJzLmMKLQotIyBDb2RlIHNoYXJlZCBieSBhbGwgdGhlIGJpbnV0aWxzLgotQlVMSUJTID0gYnVjb21tLmMgdmVyc2lvbi5jIGZpbGVtb2RlLmMKLQotQkZETElCID0gLi4vYmZkL2xpYmJmZC5sYQotCi1PUENPREVTID0gLi4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhCi0KLUxJQklCRVJUWSA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKERFQlVHX1NSQ1MpICQoSEZJTEVTKQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotRVhQRUNUID0gYGlmIFsgLWYgJCRyLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gJCRyLy4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotUlVOVEVTVCA9IGBpZiBbIC1mICR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotICAgICAgICAgICBlY2hvICR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgOyBcCi0gICAgICAgICAgIGVsc2UgZWNobyBydW50ZXN0IDsgIGZpYAotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY2Rpcj1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNkaXI7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJQ0NfRk9SX1RBUkdFVD0iJChDQ19GT1JfVEFSR0VUKSIgXAotCQlDRkxBR1NfRk9SX1RBUkdFVD0iJChDRkxBR1MpIiAkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLWluc3RhbGxjaGVjazoKLQkvYmluL3NoICQoc3JjZGlyKS9zYW5pdHkuc2ggJChiaW5kaXIpCi0KLWluZm9fVEVYSU5GT1MgPSBiaW51dGlscy50ZXhpCi0KLUxEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1zaXplX1NPVVJDRVMgPSBzaXplLmMgJChCVUxJQlMpCi0KLW9iamNvcHlfU09VUkNFUyA9IG9iamNvcHkuYyBub3Qtc3RyaXAuYyByZW5hbWUuYyAkKFdSSVRFX0RFQlVHX1NSQ1MpICQoQlVMSUJTKQotCi1zdHJpbmdzX1NPVVJDRVMgPSBzdHJpbmdzLmMgJChCVUxJQlMpCi0KLXJlYWRlbGZfU09VUkNFUyA9IHJlYWRlbGYuYyB2ZXJzaW9uLmMKLXJlYWRlbGZfTERBREQgICA9ICQoSU5UTExJQlMpICQoTElCSUJFUlRZKQotCi1zdHJpcF9uZXdfU09VUkNFUyA9IG9iamNvcHkuYyBpcy1zdHJpcC5jIHJlbmFtZS5jICQoV1JJVEVfREVCVUdfU1JDUykgJChCVUxJQlMpCi0KLW5tX25ld19TT1VSQ0VTID0gbm0uYyAkKEJVTElCUykKLQotb2JqZHVtcF9TT1VSQ0VTID0gb2JqZHVtcC5jIHByZGJnLmMgJChERUJVR19TUkNTKSAkKEJVTElCUykKLW9iamR1bXBfTERBREQgPSAkKE9QQ09ERVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotdW5kZXJzY29yZS5jOiBzdGFtcC11bmRlciA7IEB0cnVlCi0KLXN0YW1wLXVuZGVyOiBNYWtlZmlsZQotCWVjaG8gJy8qV0FSTklORzogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkISovJyA+dW5kZXJzY29yZS50Ci0JZWNobyAiaW50IHByZXBlbmRzX3VuZGVyc2NvcmUgPSBAVU5ERVJTQ09SRUA7IiA+PnVuZGVyc2NvcmUudAotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB1bmRlcnNjb3JlLnQgdW5kZXJzY29yZS5jCi0JdG91Y2ggc3RhbXAtdW5kZXIKLQotY3BsdXMtZGVtLm86ICQoQkFTRURJUikvbGliaWJlcnR5L2NwbHVzLWRlbS5jICQoSU5DRElSKS9nZXRvcHQuaAotCSQoQ09NUElMRSkgLWMgLURNQUlOIC1EVkVSU0lPTj0nIiQoVkVSU0lPTikiJyAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYwotCi1jeHhmaWx0X1NPVVJDRVMgPQotY3h4ZmlsdF9MREFERCA9IGNwbHVzLWRlbS5vIHVuZGVyc2NvcmUubyAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotYXJfU09VUkNFUyA9IGFycGFyc2UueSBhcmxleC5sIGFyLmMgbm90LXJhbmxpYi5jIGFyc3VwLmMgcmVuYW1lLmMgJChCVUxJQlMpCi1hcl9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotcmFubGliX1NPVVJDRVMgPSBhci5jIGlzLXJhbmxpYi5jIGFycGFyc2UueSBhcmxleC5sIGFyc3VwLmMgcmVuYW1lLmMgJChCVUxJQlMpCi1yYW5saWJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWFkZHIybGluZV9TT1VSQ0VTID0gYWRkcjJsaW5lLmMgJChCVUxJQlMpCi0KLSMgVGhlIGZvbGxvd2luZyBpcyBjb21tZW50ZWQgb3V0IGZvciB0aGUgY29udmVydGlvbiB0byBhdXRvbWFrZS4KLSMgVGhpcyBydWxlIGNyZWF0ZXMgYSBzaW5nbGUgYmluYXJ5IHRoYXQgc3dpdGNoZXMgYmV0d2VlbiBhciBhbmQgcmFubGliCi0jIGJ5IGxvb2tpbmcgYXQgYXJndlswXS4gIFVzZSB0aGlzIGtsdWRnZSB0byBzYXZlIHNvbWUgZGlzayBzcGFjZS4KLSMgSG93ZXZlciwgeW91IGhhdmUgdG8gaW5zdGFsbCB0aGluZ3MgYnkgaGFuZC4KLSMgKFRoYXQgaXMgYWZ0ZXIgJ21ha2UgaW5zdGFsbCcsIHJlcGxhY2UgdGhlIGluc3RhbGxlZCByYW5saWIgYnkgYSBsaW5rIHRvIGFyLikKLSMgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnN0YWxsIHJhbmxpYi5zaCBhcyByYW5saWIuCi0jIGFyX3dpdGhfcmFubGliOiAkKEFERExfREVQUykgYXIubyBtYXliZS1yYW5saWIubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChBUl9QUk9HKSBhci5vIG1heWJlLXJhbmxpYi5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoUkFOTElCX1BST0cpCi0jCS1sbiAkKEFSX1BST0cpICQoUkFOTElCX1BST0cpCi0jCi0jIG9iamNvcHkgYW5kIHN0cmlwIGluIG9uZSBiaW5hcnkgdGhhdCB1c2VzIGFyZ3ZbMF0gdG8gZGVjaWRlIGl0cyBhY3Rpb24uCi0jCi0jb2JqY29weV93aXRoX3N0cmlwOiAkKEFERExfREVQUykgb2JqY29weS5vIG1heWJlLXN0cmlwLm8KLSMJJChITERFTlYpICQoQ0MpICQoSExERkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICQoT0JKQ09QWV9QUk9HKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubyAkKEFERExfTElCUykgJChFWFRSQUxJQlMpCi0jCS1ybSAtZiAkKFNUUklQX1BST0cpCi0jCS1sbiAkKE9CSkNPUFlfUFJPRykgJChTVFJJUF9QUk9HKQotCi1zeXNyb2ZmLmM6IHN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIHN5c3JvZmYuaW5mbyAKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1jIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1pIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZyA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+PnN5c3JvZmYuYwotCi1zeXNyb2ZmLmg6IHN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIHN5c3JvZmYuaW5mbwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWQgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuaAotCi1zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKTogc3lzaW5mby5vIHN5c2xleC5vCi0JJChDQ19GT1JfQlVJTEQpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIHN5c2luZm8ubyBzeXNsZXgubyAKLQotc3lzbGV4Lm86IHN5c2xleC5jIHN5c2luZm8uaAotCWlmIFsgLXIgc3lzbGV4LmMgXTsgdGhlbiBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAgc3lzbGV4LmMgIDsgXAotCWVsc2UgXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAtSSQoc3JjZGlyKSAkKENGTEFHUykgJChzcmNkaXIpL3N5c2xleC5jIDtcCi0JZmkKLQotc3lzaW5mby5vOiBzeXNpbmZvLmMKLQlpZiBbIC1yIHN5c2luZm8uYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNpbmZvLmMgIDsgXAotCWVsc2UgXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgJChzcmNkaXIpL3N5c2luZm8uYyA7IFwKLQlmaQotCi1zcmNvbnZfU09VUkNFUyA9IHNyY29udi5jIGNvZmZncm9rLmMgJChCVUxJQlMpCi0KLWRsbHRvb2xfU09VUkNFUyA9IGRsbHRvb2wuYyBkZWZwYXJzZS55IGRlZmxleC5sIGR5bi1zdHJpbmcuYyAkKEJVTElCUykKLWRsbHRvb2xfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWRsbHRvb2wubzpkbGx0b29sLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvZGxsdG9vbC5jCi0KLXJlc2NvZmYubzpyZXNjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvcmVzY29mZi5jCi0KLWNvZmZkdW1wX1NPVVJDRVMgPSBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgJChCVUxJQlMpCi0KLXN5c2R1bXBfU09VUkNFUyA9IHN5c2R1bXAuYyAkKEJVTElCUykKLQotIyBjb2ZmL3N5bS5oIGFuZCBjb2ZmL2Vjb2ZmLmggd29uJ3QgYmUgZm91bmQgYnkgdGhlIGF1dG9tYXRpYyBkZXBlbmRlbmN5Ci0jIHNjcmlwdHMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgaW5jbHVkZWQgY29uZGl0aW9uYWxseS4KLW5sbWNvbnYubzogbmxtY29udi5jICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQlsZG5hbWU9YGVjaG8gbGQgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JJChDT01QSUxFKSAtYyAtRExEX05BTUU9IlwiJCR7bGRuYW1lfVwiIiBATkxNQ09OVl9ERUZTQCAkKHNyY2RpcikvbmxtY29udi5jCi0KLW5sbWNvbnZfU09VUkNFUyA9IG5sbWNvbnYuYyBubG1oZWFkZXIueSAkKEJVTElCUykKLQotd2luZHJlc19TT1VSQ0VTID0gd2luZHJlcy5jIHJlc3JjLmMgcmVzY29mZi5jIHJlc2Jpbi5jIHJjcGFyc2UueSByY2xleC5sIFwKLQl3aW5kdW5pLmMgcmVzcmVzLmMgJChCVUxJQlMpCi13aW5kcmVzX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1kbGx3cmFwX1NPVVJDRVMgPSBkbGx3cmFwLmMgZHluLXN0cmluZy5jIAotZGxsd3JhcF9MREFERCA9ICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi0KLURJU1RTVFVGRiA9IGFycGFyc2UuYyBhcnBhcnNlLmggYXJsZXguYyBubG1oZWFkZXIuYyBzeXNpbmZvLmMgc3lzaW5mby5oIFwKLQlzeXNsZXguYyBkZWZsZXguYyBkZWZwYXJzZS5oIGRlZnBhcnNlLmMgcmNsZXguYyByY3BhcnNlLmggcmNwYXJzZS5jCi0KLWRpc3RzdHVmZjogJChESVNUU1RVRkYpIGluZm8KLQotRElTVENMRUFORklMRVMgPSBzdGFtcC11bmRlciBzeXNpbmZvIHVuZGVyc2NvcmUuYyBzeXNyb2ZmLmMgc3lzcm9mZi5oIFwKLQlzaXRlLmV4cCBzaXRlLmJhawotCi0jIFRhcmdldHMgdG8gcmVidWlsZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBNYWtlZmlsZS4KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIERFUDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLURFUDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIERFUDEKLQlzZWQgLWYgZGVwLnNlZCA8REVQMSA+REVQCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi1ERVAxOiAkKENGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKQotCXJtIC1mIERFUDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQkkKE1LREVQKSAtZiBERVAyICQoSU5DTFVERVMpICQ/Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUDIgREVQMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlvYmpkaXI9YHB3ZGA7IFwKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAQkZERElSQCEkKEJGRERJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCVwKLQkJLWUgInMhQE9CSkRJUkAhJCR7b2JqZGlyfSEiCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMjIwotIyBET0NVTUVOVEFUSU9OIFRBUkdFVFMKLWNvbmZpZy50ZXhpOiBNYWtlZmlsZQotCXJtIC1mIGNvbmZpZy50ZXhpCi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gY29uZmlnLnRleGkKLQotYmludXRpbHMuZHZpOiAkKHNyY2RpcikvYmludXRpbHMudGV4aSBjb25maWcudGV4aQotCi1iaW51dGlscy5pbmZvOiAkKHNyY2RpcikvYmludXRpbHMudGV4aSBjb25maWcudGV4aQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGNvbmZpZy50ZXhpCi0KLSQoREVNQU5HTEVSX05BTUUpLjE6IGN4eGZpbHQubWFuIE1ha2VmaWxlCi0Jc2VkIC1lICdzL0BQUk9HUkFNQC8kKERFTUFOR0xFUl9OQU1FKS8nIDwgJChzcmNkaXIpL2N4eGZpbHQubWFuIFwKLQkJPiAkKERFTUFOR0xFUl9OQU1FKS4xCi0KLU1PU1RMWUNMRUFORklMRVMgPSBzeXNpbmZvICQoREVNQU5HTEVSX05BTUUpLjEgYmludXRpbHMubG9nIGJpbnV0aWxzLnN1bSBcCi0JYWJjZGVmZ2gqCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCBERVAgREVQMQotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6ICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLycgLWUgJ3MvY3h4ZmlsdC8kKERFTUFOR0xFUl9OQU1FKS8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLycgLWUgJ3MvY3h4ZmlsdC8kKERFTUFOR0xFUl9OQU1FKS8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KLQlmb3IgaSBpbiAkKFRPT0xfUFJPR1MpOyBkbyBcCi0JICBpZiBbIC1mICQkaSQoRVhFRVhUKSBdOyB0aGVuIFwKLQkgICAgaj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvLW5ldy8vJ2A7IFwKLQkgICAgaz1gZWNobyAkJGogfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JICAgIGlmIFsgIiQoYmluZGlyKS8kJGskKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgICAgIHJtIC1mICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICAgIGxuICQoYmluZGlyKS8kJGskKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCQl8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGkkKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIHRydWU7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hZGRyMmxpbmUubzogYWRkcjJsaW5lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWFyLm86IGFyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvYW91dC9hci5oICQoQkZERElSKS9saWJiZmQuaCBhcnN1cC5oCi1hcnN1cC5vOiBhcnN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGFyc3VwLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWJ1Y29tbS5vOiBidWNvbW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmR1bXAubzogY29mZmR1bXAuYyBjb2ZmZ3Jvay5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmdyb2subzogY29mZmdyb2suYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmZ3Jvay5oCi1kZWJ1Zy5vOiBkZWJ1Zy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaAotZGxsdG9vbC5vOiBkbGx0b29sLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZHluLXN0cmluZy5oIFwKLSAgZGxsdG9vbC5oCi1maWxlbW9kZS5vOiBmaWxlbW9kZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWllZWUubzogaWVlZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvaWVlZS5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLWlzLXJhbmxpYi5vOiBpcy1yYW5saWIuYwotaXMtc3RyaXAubzogaXMtc3RyaXAuYwotbWF5YmUtcmFubGliLm86IG1heWJlLXJhbmxpYi5jCi1tYXliZS1zdHJpcC5vOiBtYXliZS1zdHJpcC5jCi1ubG1jb252Lm86IG5sbWNvbnYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoQkZERElSKS9saWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1jb252LmgKLW5tLm86IG5tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1ub3QtcmFubGliLm86IG5vdC1yYW5saWIuYwotbm90LXN0cmlwLm86IG5vdC1zdHJpcC5jCi1vYmpjb3B5Lm86IG9iamNvcHkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWRiZy5oCi1vYmpkdW1wLm86IG9iamR1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1wcmRiZy5vOiBwcmRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1yZGNvZmYubzogcmRjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggXAotICBidWRiZy5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotcmRkYmcubzogcmRkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotc2l6ZS5vOiBzaXplLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9nZXRvcHQuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcmNvbnYubzogc3Jjb252LmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIHN5c3JvZmYuaCBjb2ZmZ3Jvay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3lzcm9mZi5jCi1zdGFicy5vOiBzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RyaW5ncy5vOiBzdHJpbmdzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN5c2R1bXAubzogc3lzZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggc3lzcm9mZi5oIFwKLSAgc3lzcm9mZi5jCi12ZXJzaW9uLm86IHZlcnNpb24uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi13cnN0YWJzLm86IHdyc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXdpbmRyZXMubzogd2luZHJlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9vYnN0YWNrLmggd2luZHJlcy5oIFwKLSAgd2luZHVuaS5oCi1yZXNyYy5vOiByZXNyYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmVzY29mZi5vOiByZXNjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLXJlc2Jpbi5vOiByZXNiaW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXdpbmR1bmkubzogd2luZHVuaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggd2luZHVuaS5oCi1yZWFkZWxmLm86IHJlYWRlbGYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvbWlwcy5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9tNjhrLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL2QzMHYuaCAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvaTk2MC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLXJlc3Jlcy5vOiByZXNyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLWR5bi1zdHJpbmcubzogZHluLXN0cmluZy5jIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgZHluLXN0cmluZy5oCi1kbGx3cmFwLm86IGRsbHdyYXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBkeW4tc3RyaW5nLmgKLXJlbmFtZS5vOiByZW5hbWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi11bmRlcnNjb3JlLm86IHVuZGVyc2NvcmUuYwotYXJwYXJzZS5vOiBhcnBhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBhcnN1cC5oCi1hcmxleC5vOiBhcmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCBhcnBhcnNlLmgKLXN5c3JvZmYubzogc3lzcm9mZi5jCi1zeXNpbmZvLm86IHN5c2luZm8uYwotc3lzbGV4Lm86IHN5c2xleC5jIHN5c2luZm8uaAotZGVmcGFyc2UubzogZGVmcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGRsbHRvb2wuaAotZGVmbGV4Lm86IGRlZmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGRlZnBhcnNlLmggZGxsdG9vbC5oCi1ubG1oZWFkZXIubzogbmxtaGVhZGVyLmMgLi4vYmZkL2JmZC5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gIG5sbWNvbnYuaAotcmNwYXJzZS5vOiByY3BhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1yY2xleC5vOiByY2xleC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaCByY3BhcnNlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9iaW51dGlscy9NYWtlZmlsZS5pbiBiL2JpbnV0aWxzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2RkMGMwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MiArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQlVJTERfRExMVE9PTCA9IEBCVUlMRF9ETExUT09MQAotQlVJTERfRExMV1JBUCA9IEBCVUlMRF9ETExXUkFQQAotQlVJTERfTUlTQyA9IEBCVUlMRF9NSVNDQAotQlVJTERfTkxNQ09OViA9IEBCVUlMRF9OTE1DT05WQAotQlVJTERfU1JDT05WID0gQEJVSUxEX1NSQ09OVkAKLUJVSUxEX1dJTkRSRVMgPSBAQlVJTERfV0lORFJFU0AKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ERU1BTkdMRVJfTkFNRSA9IEBERU1BTkdMRVJfTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLURMTFRPT0xfREVGUyA9IEBETExUT09MX0RFRlNACi1FWEVFWFQgPSBARVhFRVhUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTkxNQ09OVl9ERUZTID0gQE5MTUNPTlZfREVGU0AKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVU5ERVJTQ09SRSA9IEBVTkRFUlNDT1JFQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwkKHNyY2RpcikvLi4vYmlzb24vOyBlbHNlIGVjaG8gQFlBQ0NAOyBmaWAKLVlGTEFHUyA9IC1kCi1MRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXTsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleDsgZWxzZSBlY2hvIEBMRVhAOyBmaWAKLQotIyB0aGVzZSB0d28gYXJlIGFsbW9zdCB0aGUgc2FtZSBwcm9ncmFtCi1BUl9QUk9HID0gYXIKLVJBTkxJQl9QUk9HID0gcmFubGliCi0KLSMgb2JqY29weSBhbmQgc3RyaXAgc2hvdWxkIGJlIHRoZSBzYW1lIHByb2dyYW0KLU9CSkNPUFlfUFJPRyA9IG9iamNvcHkKLVNUUklQX1BST0cgPSBzdHJpcC1uZXcKLQotU1RSSU5HU19QUk9HID0gc3RyaW5ncwotCi1SRUFERUxGX1BST0cgPSByZWFkZWxmCi0KLSMgVGhlc2Ugc2hvdWxkIGFsbCBiZSB0aGUgc2FtZSBwcm9ncmFtIHRvby4KLVNJWkVfUFJPRyA9IHNpemUKLU5NX1BST0cgPSBubS1uZXcKLU9CSkRVTVBfUFJPRyA9IG9iamR1bXAKLQotIyBUaGlzIGlzIHRoZSBkZW1hbmdsZXIsIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotIyBOb3RlOiBUaGlzIG9uZSBpcyB1c2VkIGFzIHRoZSBpbnN0YWxsZWQgbmFtZSB0b28sIHVubGlrZSB0aGUgYWJvdmUuCi1ERU1BTkdMRVJfUFJPRyA9IGN4eGZpbHQKLQotQUREUjJMSU5FX1BST0cgPSBhZGRyMmxpbmUKLQotTkxNQ09OVl9QUk9HID0gbmxtY29udgotRExMVE9PTF9QUk9HID0gZGxsdG9vbAotV0lORFJFU19QUk9HID0gd2luZHJlcwotRExMV1JBUF9QUk9HID0gZGxsd3JhcAotCi1TUkNPTlZfUFJPRyA9IHNyY29udiQoRVhFRVhUKSBzeXNkdW1wJChFWEVFWFQpIGNvZmZkdW1wJChFWEVFWFQpIAotCi1tYW5fTUFOUyA9IGFyLjEgbm0uMSBvYmpkdW1wLjEgcmFubGliLjEgc2l6ZS4xIHN0cmluZ3MuMSBzdHJpcC4xIG9iamNvcHkuMSBcCi0JYWRkcjJsaW5lLjEgbmxtY29udi4xICQoREVNQU5HTEVSX05BTUUpLjEKLQotCi1QUk9HUyA9ICQoU0laRV9QUk9HKSAkKE9CSkRVTVBfUFJPRykgJChOTV9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFNUUklQX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi1iaW5fUFJPR1JBTVMgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoQVJfUFJPRykgJChTVFJJTkdTX1BST0cpICQoUkFOTElCX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi1ub2luc3RfUFJPR1JBTVMgPSAkKE5NX1BST0cpICQoU1RSSVBfUFJPRykgJChERU1BTkdMRVJfUFJPRykKLQotRVhUUkFfUFJPR1JBTVMgPSAkKE5MTUNPTlZfUFJPRykgc3Jjb252IHN5c2R1bXAgY29mZmR1bXAgJChETExUT09MX1BST0cpICQoV0lORFJFU19QUk9HKSAkKERMTFdSQVBfUFJPRykKLQotIyBTdHVmZiB0aGF0IGdvZXMgaW4gdG9vbGRpci8gaWYgYXBwcm9wcmlhdGUKLVRPT0xfUFJPR1MgPSBubS1uZXcgc3RyaXAtbmV3IGFyIHJhbmxpYiBkbGx0b29sCi0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIgPSAkKEJBU0VESVIpL2luY2x1ZGUKLQotTUtERVAgPSBta2RlcAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1IRklMRVMgPSBhcnN1cC5oIGJ1Y29tbS5oIGJ1ZGJnLmggY29mZmdyb2suaCBkZWJ1Zy5oIG5sbWNvbnYuaCBkbGx0b29sLmggXAotCXdpbmRyZXMuaCB3aW5kdW5pLmggZHluLXN0cmluZy5oCi0KLQotR0VORVJBVEVEX0hGSUxFUyA9IGFycGFyc2UuaCBzeXNyb2ZmLmggc3lzaW5mby5oIGRlZnBhcnNlLmgKLQotQ0ZJTEVTID0gYWRkcjJsaW5lLmMgYXIuYyBhcnN1cC5jIGJ1Y29tbS5jIGNvZmZkdW1wLmMgY29mZmdyb2suYyBkZWJ1Zy5jIFwKLQlkbGx0b29sLmMgZmlsZW1vZGUuYyBpZWVlLmMgaXMtcmFubGliLmMgaXMtc3RyaXAuYyBtYXliZS1yYW5saWIuYyBcCi0JbWF5YmUtc3RyaXAuYyBubG1jb252LmMgbm0uYyBub3QtcmFubGliLmMgbm90LXN0cmlwLmMgXAotCW9iamNvcHkuYyBvYmpkdW1wLmMgcHJkYmcuYyByZGNvZmYuYyByZGRiZy5jIHNpemUuYyBzcmNvbnYuYyBcCi0Jc3RhYnMuYyBzdHJpbmdzLmMgc3lzZHVtcC5jIHZlcnNpb24uYyB3cnN0YWJzLmMgXAotCXdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyB3aW5kdW5pLmMgcmVhZGVsZi5jIFwKLQlyZXNyZXMuYyBkeW4tc3RyaW5nLmMgZGxsd3JhcC5jIHJlbmFtZS5jCi0KLQotR0VORVJBVEVEX0NGSUxFUyA9IFwKLQl1bmRlcnNjb3JlLmMgYXJwYXJzZS5jIGFybGV4LmMgc3lzcm9mZi5jIHN5c2luZm8uYyBzeXNsZXguYyBcCi0JZGVmcGFyc2UuYyBkZWZsZXguYyBubG1oZWFkZXIuYyByY3BhcnNlLmMgcmNsZXguYwotCi0KLURFQlVHX1NSQ1MgPSByZGRiZy5jIGRlYnVnLmMgc3RhYnMuYyBpZWVlLmMgcmRjb2ZmLmMKLVdSSVRFX0RFQlVHX1NSQ1MgPSAkKERFQlVHX1NSQ1MpIHdyc3RhYnMuYwotCi0jIENvZGUgc2hhcmVkIGJ5IGFsbCB0aGUgYmludXRpbHMuCi1CVUxJQlMgPSBidWNvbW0uYyB2ZXJzaW9uLmMgZmlsZW1vZGUuYwotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi0KLU9QQ09ERVMgPSAuLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKLQotTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLVBPVEZJTEVTID0gJChDRklMRVMpICQoREVCVUdfU1JDUykgJChIRklMRVMpCi0KLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotUlVOVEVTVCA9IGBpZiBbIC1mICR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotICAgICAgICAgICBlY2hvICR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgOyBcCi0gICAgICAgICAgIGVsc2UgZWNobyBydW50ZXN0IDsgIGZpYAotCi0KLUNDX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDQyk7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLQotaW5mb19URVhJTkZPUyA9IGJpbnV0aWxzLnRleGkKLQotTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLXNpemVfU09VUkNFUyA9IHNpemUuYyAkKEJVTElCUykKLQotb2JqY29weV9TT1VSQ0VTID0gb2JqY29weS5jIG5vdC1zdHJpcC5jIHJlbmFtZS5jICQoV1JJVEVfREVCVUdfU1JDUykgJChCVUxJQlMpCi0KLXN0cmluZ3NfU09VUkNFUyA9IHN0cmluZ3MuYyAkKEJVTElCUykKLQotcmVhZGVsZl9TT1VSQ0VTID0gcmVhZGVsZi5jIHZlcnNpb24uYwotcmVhZGVsZl9MREFERCA9ICQoSU5UTExJQlMpICQoTElCSUJFUlRZKQotCi1zdHJpcF9uZXdfU09VUkNFUyA9IG9iamNvcHkuYyBpcy1zdHJpcC5jIHJlbmFtZS5jICQoV1JJVEVfREVCVUdfU1JDUykgJChCVUxJQlMpCi0KLW5tX25ld19TT1VSQ0VTID0gbm0uYyAkKEJVTElCUykKLQotb2JqZHVtcF9TT1VSQ0VTID0gb2JqZHVtcC5jIHByZGJnLmMgJChERUJVR19TUkNTKSAkKEJVTElCUykKLW9iamR1bXBfTERBREQgPSAkKE9QQ09ERVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotY3h4ZmlsdF9TT1VSQ0VTID0gCi1jeHhmaWx0X0xEQUREID0gY3BsdXMtZGVtLm8gdW5kZXJzY29yZS5vICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1hcl9TT1VSQ0VTID0gYXJwYXJzZS55IGFybGV4LmwgYXIuYyBub3QtcmFubGliLmMgYXJzdXAuYyByZW5hbWUuYyAkKEJVTElCUykKLWFyX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1yYW5saWJfU09VUkNFUyA9IGFyLmMgaXMtcmFubGliLmMgYXJwYXJzZS55IGFybGV4LmwgYXJzdXAuYyByZW5hbWUuYyAkKEJVTElCUykKLXJhbmxpYl9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotYWRkcjJsaW5lX1NPVVJDRVMgPSBhZGRyMmxpbmUuYyAkKEJVTElCUykKLQotc3Jjb252X1NPVVJDRVMgPSBzcmNvbnYuYyBjb2ZmZ3Jvay5jICQoQlVMSUJTKQotCi1kbGx0b29sX1NPVVJDRVMgPSBkbGx0b29sLmMgZGVmcGFyc2UueSBkZWZsZXgubCBkeW4tc3RyaW5nLmMgJChCVUxJQlMpCi1kbGx0b29sX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1jb2ZmZHVtcF9TT1VSQ0VTID0gY29mZmR1bXAuYyBjb2ZmZ3Jvay5jICQoQlVMSUJTKQotCi1zeXNkdW1wX1NPVVJDRVMgPSBzeXNkdW1wLmMgJChCVUxJQlMpCi0KLW5sbWNvbnZfU09VUkNFUyA9IG5sbWNvbnYuYyBubG1oZWFkZXIueSAkKEJVTElCUykKLQotd2luZHJlc19TT1VSQ0VTID0gd2luZHJlcy5jIHJlc3JjLmMgcmVzY29mZi5jIHJlc2Jpbi5jIHJjcGFyc2UueSByY2xleC5sIFwKLQl3aW5kdW5pLmMgcmVzcmVzLmMgJChCVUxJQlMpCi0KLXdpbmRyZXNfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWRsbHdyYXBfU09VUkNFUyA9IGRsbHdyYXAuYyBkeW4tc3RyaW5nLmMgCi1kbGx3cmFwX0xEQUREID0gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLURJU1RTVFVGRiA9IGFycGFyc2UuYyBhcnBhcnNlLmggYXJsZXguYyBubG1oZWFkZXIuYyBzeXNpbmZvLmMgc3lzaW5mby5oIFwKLQlzeXNsZXguYyBkZWZsZXguYyBkZWZwYXJzZS5oIGRlZnBhcnNlLmMgcmNsZXguYyByY3BhcnNlLmggcmNwYXJzZS5jCi0KLQotRElTVENMRUFORklMRVMgPSBzdGFtcC11bmRlciBzeXNpbmZvIHVuZGVyc2NvcmUuYyBzeXNyb2ZmLmMgc3lzcm9mZi5oIFwKLQlzaXRlLmV4cCBzaXRlLmJhawotCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gY29uZmlnLnRleGkKLQotTU9TVExZQ0xFQU5GSUxFUyA9IHN5c2luZm8gJChERU1BTkdMRVJfTkFNRSkuMSBiaW51dGlscy5sb2cgYmludXRpbHMuc3VtIFwKLQlhYmNkZWZnaCoKLQotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCBERVAgREVQMQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLWJpbl9QUk9HUkFNUyA9ICBzaXplJChFWEVFWFQpIG9iamR1bXAkKEVYRUVYVCkgYXIkKEVYRUVYVCkgXAotc3RyaW5ncyQoRVhFRVhUKSByYW5saWIkKEVYRUVYVCkgb2JqY29weSQoRVhFRVhUKSBAQlVJTERfTkxNQ09OVkAgXAotQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCBhZGRyMmxpbmUkKEVYRUVYVCkgXAotcmVhZGVsZiQoRVhFRVhUKSBAQlVJTERfRExMV1JBUEAgQEJVSUxEX01JU0NACi1ub2luc3RfUFJPR1JBTVMgPSAgbm0tbmV3JChFWEVFWFQpIHN0cmlwLW5ldyQoRVhFRVhUKSBjeHhmaWx0JChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKGJpbl9QUk9HUkFNUykgJChub2luc3RfUFJPR1JBTVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLW5sbWNvbnZfT0JKRUNUUyA9ICBubG1jb252Lm8gbmxtaGVhZGVyLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW5sbWNvbnZfTERBREQgPSAkKExEQUREKQotbmxtY29udl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLW5sbWNvbnZfTERGTEFHUyA9IAotc3Jjb252X09CSkVDVFMgPSAgc3Jjb252Lm8gY29mZmdyb2subyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3Jjb252X0xEQUREID0gJChMREFERCkKLXNyY29udl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXNyY29udl9MREZMQUdTID0gCi1zeXNkdW1wX09CSkVDVFMgPSAgc3lzZHVtcC5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zeXNkdW1wX0xEQUREID0gJChMREFERCkKLXN5c2R1bXBfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zeXNkdW1wX0xERkxBR1MgPSAKLWNvZmZkdW1wX09CSkVDVFMgPSAgY29mZmR1bXAubyBjb2ZmZ3Jvay5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1jb2ZmZHVtcF9MREFERCA9ICQoTERBREQpCi1jb2ZmZHVtcF9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWNvZmZkdW1wX0xERkxBR1MgPSAKLWRsbHRvb2xfT0JKRUNUUyA9ICBkbGx0b29sLm8gZGVmcGFyc2UubyBkZWZsZXgubyBkeW4tc3RyaW5nLm8gYnVjb21tLm8gXAotdmVyc2lvbi5vIGZpbGVtb2RlLm8KLWRsbHRvb2xfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1kbGx0b29sX0xERkxBR1MgPSAKLXdpbmRyZXNfT0JKRUNUUyA9ICB3aW5kcmVzLm8gcmVzcmMubyByZXNjb2ZmLm8gcmVzYmluLm8gcmNwYXJzZS5vIFwKLXJjbGV4Lm8gd2luZHVuaS5vIHJlc3Jlcy5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi13aW5kcmVzX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotd2luZHJlc19MREZMQUdTID0gCi1kbGx3cmFwX09CSkVDVFMgPSAgZGxsd3JhcC5vIGR5bi1zdHJpbmcubwotZGxsd3JhcF9ERVBFTkRFTkNJRVMgPSAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1kbGx3cmFwX0xERkxBR1MgPSAKLXNpemVfT0JKRUNUUyA9ICBzaXplLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXNpemVfTERBREQgPSAkKExEQUREKQotc2l6ZV9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXNpemVfTERGTEFHUyA9IAotb2JqZHVtcF9PQkpFQ1RTID0gIG9iamR1bXAubyBwcmRiZy5vIHJkZGJnLm8gZGVidWcubyBzdGFicy5vIGllZWUubyBcCi1yZGNvZmYubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotb2JqZHVtcF9ERVBFTkRFTkNJRVMgPSAgLi4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhIC4uL2JmZC9saWJiZmQubGEgXAotLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1vYmpkdW1wX0xERkxBR1MgPSAKLWFyX09CSkVDVFMgPSAgYXJwYXJzZS5vIGFybGV4Lm8gYXIubyBub3QtcmFubGliLm8gYXJzdXAubyByZW5hbWUubyBcCi1idWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotYXJfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1hcl9MREZMQUdTID0gCi1zdHJpbmdzX09CSkVDVFMgPSAgc3RyaW5ncy5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zdHJpbmdzX0xEQUREID0gJChMREFERCkKLXN0cmluZ3NfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zdHJpbmdzX0xERkxBR1MgPSAKLXJhbmxpYl9PQkpFQ1RTID0gIGFyLm8gaXMtcmFubGliLm8gYXJwYXJzZS5vIGFybGV4Lm8gYXJzdXAubyByZW5hbWUubyBcCi1idWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotcmFubGliX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotcmFubGliX0xERkxBR1MgPSAKLW9iamNvcHlfT0JKRUNUUyA9ICBvYmpjb3B5Lm8gbm90LXN0cmlwLm8gcmVuYW1lLm8gcmRkYmcubyBkZWJ1Zy5vIFwKLXN0YWJzLm8gaWVlZS5vIHJkY29mZi5vIHdyc3RhYnMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotb2JqY29weV9MREFERCA9ICQoTERBREQpCi1vYmpjb3B5X0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotb2JqY29weV9MREZMQUdTID0gCi1hZGRyMmxpbmVfT0JKRUNUUyA9ICBhZGRyMmxpbmUubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotYWRkcjJsaW5lX0xEQUREID0gJChMREFERCkKLWFkZHIybGluZV9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWFkZHIybGluZV9MREZMQUdTID0gCi1yZWFkZWxmX09CSkVDVFMgPSAgcmVhZGVsZi5vIHZlcnNpb24ubwotcmVhZGVsZl9ERVBFTkRFTkNJRVMgPSAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1yZWFkZWxmX0xERkxBR1MgPSAKLW5tX25ld19PQkpFQ1RTID0gIG5tLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW5tX25ld19MREFERCA9ICQoTERBREQpCi1ubV9uZXdfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1ubV9uZXdfTERGTEFHUyA9IAotc3RyaXBfbmV3X09CSkVDVFMgPSAgb2JqY29weS5vIGlzLXN0cmlwLm8gcmVuYW1lLm8gcmRkYmcubyBkZWJ1Zy5vIFwKLXN0YWJzLm8gaWVlZS5vIHJkY29mZi5vIHdyc3RhYnMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3RyaXBfbmV3X0xEQUREID0gJChMREFERCkKLXN0cmlwX25ld19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXN0cmlwX25ld19MREZMQUdTID0gCi1jeHhmaWx0X09CSkVDVFMgPSAKLWN4eGZpbHRfREVQRU5ERU5DSUVTID0gIGNwbHVzLWRlbS5vIHVuZGVyc2NvcmUubyBcCi0uLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWN4eGZpbHRfTERGTEFHUyA9IAotTEVYX09VVFBVVF9ST09UID0gQExFWF9PVVRQVVRfUk9PVEAKLUxFWExJQiA9IEBMRVhMSUJACi1ZTFdSQVAgPSAkKHRvcF9zcmNkaXIpLy4uL3lsd3JhcAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gYmludXRpbHMuaW5mbwotRFZJUyA9IGJpbnV0aWxzLmR2aQotVEVYSU5GT1MgPSBiaW51dGlscy50ZXhpCi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLU1BTlMgPSAkKG1hbl9NQU5TKQotCi1OUk9GRiA9IG5yb2ZmCi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbiBcCi1ORVdTIGFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGFybGV4LmMgYXJwYXJzZS5jIGNvbmZpZy5pbiBjb25maWd1cmUgXAotY29uZmlndXJlLmluIGRlZmxleC5jIGRlZnBhcnNlLmMgbmxtaGVhZGVyLmMgcmNsZXguYyByY3BhcnNlLmMKLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9ICQobmxtY29udl9TT1VSQ0VTKSAkKHNyY29udl9TT1VSQ0VTKSAkKHN5c2R1bXBfU09VUkNFUykgJChjb2ZmZHVtcF9TT1VSQ0VTKSAkKGRsbHRvb2xfU09VUkNFUykgJCh3aW5kcmVzX1NPVVJDRVMpICQoZGxsd3JhcF9TT1VSQ0VTKSAkKHNpemVfU09VUkNFUykgJChvYmpkdW1wX1NPVVJDRVMpICQoYXJfU09VUkNFUykgJChzdHJpbmdzX1NPVVJDRVMpICQocmFubGliX1NPVVJDRVMpICQob2JqY29weV9TT1VSQ0VTKSAkKGFkZHIybGluZV9TT1VSQ0VTKSAkKHJlYWRlbGZfU09VUkNFUykgJChubV9uZXdfU09VUkNFUykgJChzdHJpcF9uZXdfU09VUkNFUykgJChjeHhmaWx0X1NPVVJDRVMpCi1PQkpFQ1RTID0gJChubG1jb252X09CSkVDVFMpICQoc3Jjb252X09CSkVDVFMpICQoc3lzZHVtcF9PQkpFQ1RTKSAkKGNvZmZkdW1wX09CSkVDVFMpICQoZGxsdG9vbF9PQkpFQ1RTKSAkKHdpbmRyZXNfT0JKRUNUUykgJChkbGx3cmFwX09CSkVDVFMpICQoc2l6ZV9PQkpFQ1RTKSAkKG9iamR1bXBfT0JKRUNUUykgJChhcl9PQkpFQ1RTKSAkKHN0cmluZ3NfT0JKRUNUUykgJChyYW5saWJfT0JKRUNUUykgJChvYmpjb3B5X09CSkVDVFMpICQoYWRkcjJsaW5lX09CSkVDVFMpICQocmVhZGVsZl9PQkpFQ1RTKSAkKG5tX25ld19PQkpFQ1RTKSAkKHN0cmlwX25ld19PQkpFQ1RTKSAkKGN4eGZpbHRfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmR2aSAuaW5mbyAubCAubG8gLm8gLnBzIC5zIC50ZXhpIC50ZXhpbmZvIC50eGkgLnkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLWJpblBST0dSQU1TOgotCi1jbGVhbi1iaW5QUk9HUkFNUzoKLQktdGVzdCAteiAiJChiaW5fUFJPR1JBTVMpIiB8fCBybSAtZiAkKGJpbl9QUk9HUkFNUykKLQotZGlzdGNsZWFuLWJpblBST0dSQU1TOgotCi1tYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TOgotCi1pbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGJpbmRpcikKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1iaW5QUk9HUkFNUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X1BST0dSQU1TKSIgfHwgcm0gLWYgJChub2luc3RfUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotbmxtY29udiQoRVhFRVhUKTogJChubG1jb252X09CSkVDVFMpICQobmxtY29udl9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG5sbWNvbnYkKEVYRUVYVCkKLQkkKExJTkspICQobmxtY29udl9MREZMQUdTKSAkKG5sbWNvbnZfT0JKRUNUUykgJChubG1jb252X0xEQUREKSAkKExJQlMpCi0KLXNyY29udiQoRVhFRVhUKTogJChzcmNvbnZfT0JKRUNUUykgJChzcmNvbnZfREVQRU5ERU5DSUVTKQotCUBybSAtZiBzcmNvbnYkKEVYRUVYVCkKLQkkKExJTkspICQoc3Jjb252X0xERkxBR1MpICQoc3Jjb252X09CSkVDVFMpICQoc3Jjb252X0xEQUREKSAkKExJQlMpCi0KLXN5c2R1bXAkKEVYRUVYVCk6ICQoc3lzZHVtcF9PQkpFQ1RTKSAkKHN5c2R1bXBfREVQRU5ERU5DSUVTKQotCUBybSAtZiBzeXNkdW1wJChFWEVFWFQpCi0JJChMSU5LKSAkKHN5c2R1bXBfTERGTEFHUykgJChzeXNkdW1wX09CSkVDVFMpICQoc3lzZHVtcF9MREFERCkgJChMSUJTKQotCi1jb2ZmZHVtcCQoRVhFRVhUKTogJChjb2ZmZHVtcF9PQkpFQ1RTKSAkKGNvZmZkdW1wX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgY29mZmR1bXAkKEVYRUVYVCkKLQkkKExJTkspICQoY29mZmR1bXBfTERGTEFHUykgJChjb2ZmZHVtcF9PQkpFQ1RTKSAkKGNvZmZkdW1wX0xEQUREKSAkKExJQlMpCi0KLWRsbHRvb2wkKEVYRUVYVCk6ICQoZGxsdG9vbF9PQkpFQ1RTKSAkKGRsbHRvb2xfREVQRU5ERU5DSUVTKQotCUBybSAtZiBkbGx0b29sJChFWEVFWFQpCi0JJChMSU5LKSAkKGRsbHRvb2xfTERGTEFHUykgJChkbGx0b29sX09CSkVDVFMpICQoZGxsdG9vbF9MREFERCkgJChMSUJTKQotCi13aW5kcmVzJChFWEVFWFQpOiAkKHdpbmRyZXNfT0JKRUNUUykgJCh3aW5kcmVzX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgd2luZHJlcyQoRVhFRVhUKQotCSQoTElOSykgJCh3aW5kcmVzX0xERkxBR1MpICQod2luZHJlc19PQkpFQ1RTKSAkKHdpbmRyZXNfTERBREQpICQoTElCUykKLQotZGxsd3JhcCQoRVhFRVhUKTogJChkbGx3cmFwX09CSkVDVFMpICQoZGxsd3JhcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGRsbHdyYXAkKEVYRUVYVCkKLQkkKExJTkspICQoZGxsd3JhcF9MREZMQUdTKSAkKGRsbHdyYXBfT0JKRUNUUykgJChkbGx3cmFwX0xEQUREKSAkKExJQlMpCi0KLXNpemUkKEVYRUVYVCk6ICQoc2l6ZV9PQkpFQ1RTKSAkKHNpemVfREVQRU5ERU5DSUVTKQotCUBybSAtZiBzaXplJChFWEVFWFQpCi0JJChMSU5LKSAkKHNpemVfTERGTEFHUykgJChzaXplX09CSkVDVFMpICQoc2l6ZV9MREFERCkgJChMSUJTKQotCi1vYmpkdW1wJChFWEVFWFQpOiAkKG9iamR1bXBfT0JKRUNUUykgJChvYmpkdW1wX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgb2JqZHVtcCQoRVhFRVhUKQotCSQoTElOSykgJChvYmpkdW1wX0xERkxBR1MpICQob2JqZHVtcF9PQkpFQ1RTKSAkKG9iamR1bXBfTERBREQpICQoTElCUykKLQotYXIkKEVYRUVYVCk6ICQoYXJfT0JKRUNUUykgJChhcl9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGFyJChFWEVFWFQpCi0JJChMSU5LKSAkKGFyX0xERkxBR1MpICQoYXJfT0JKRUNUUykgJChhcl9MREFERCkgJChMSUJTKQotCi1zdHJpbmdzJChFWEVFWFQpOiAkKHN0cmluZ3NfT0JKRUNUUykgJChzdHJpbmdzX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3RyaW5ncyQoRVhFRVhUKQotCSQoTElOSykgJChzdHJpbmdzX0xERkxBR1MpICQoc3RyaW5nc19PQkpFQ1RTKSAkKHN0cmluZ3NfTERBREQpICQoTElCUykKLQotcmFubGliJChFWEVFWFQpOiAkKHJhbmxpYl9PQkpFQ1RTKSAkKHJhbmxpYl9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHJhbmxpYiQoRVhFRVhUKQotCSQoTElOSykgJChyYW5saWJfTERGTEFHUykgJChyYW5saWJfT0JKRUNUUykgJChyYW5saWJfTERBREQpICQoTElCUykKLQotb2JqY29weSQoRVhFRVhUKTogJChvYmpjb3B5X09CSkVDVFMpICQob2JqY29weV9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG9iamNvcHkkKEVYRUVYVCkKLQkkKExJTkspICQob2JqY29weV9MREZMQUdTKSAkKG9iamNvcHlfT0JKRUNUUykgJChvYmpjb3B5X0xEQUREKSAkKExJQlMpCi0KLWFkZHIybGluZSQoRVhFRVhUKTogJChhZGRyMmxpbmVfT0JKRUNUUykgJChhZGRyMmxpbmVfREVQRU5ERU5DSUVTKQotCUBybSAtZiBhZGRyMmxpbmUkKEVYRUVYVCkKLQkkKExJTkspICQoYWRkcjJsaW5lX0xERkxBR1MpICQoYWRkcjJsaW5lX09CSkVDVFMpICQoYWRkcjJsaW5lX0xEQUREKSAkKExJQlMpCi0KLXJlYWRlbGYkKEVYRUVYVCk6ICQocmVhZGVsZl9PQkpFQ1RTKSAkKHJlYWRlbGZfREVQRU5ERU5DSUVTKQotCUBybSAtZiByZWFkZWxmJChFWEVFWFQpCi0JJChMSU5LKSAkKHJlYWRlbGZfTERGTEFHUykgJChyZWFkZWxmX09CSkVDVFMpICQocmVhZGVsZl9MREFERCkgJChMSUJTKQotCi1ubS1uZXckKEVYRUVYVCk6ICQobm1fbmV3X09CSkVDVFMpICQobm1fbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgbm0tbmV3JChFWEVFWFQpCi0JJChMSU5LKSAkKG5tX25ld19MREZMQUdTKSAkKG5tX25ld19PQkpFQ1RTKSAkKG5tX25ld19MREFERCkgJChMSUJTKQotCi1zdHJpcC1uZXckKEVYRUVYVCk6ICQoc3RyaXBfbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3RyaXAtbmV3JChFWEVFWFQpCi0JJChMSU5LKSAkKHN0cmlwX25ld19MREZMQUdTKSAkKHN0cmlwX25ld19PQkpFQ1RTKSAkKHN0cmlwX25ld19MREFERCkgJChMSUJTKQotCi1jeHhmaWx0JChFWEVFWFQpOiAkKGN4eGZpbHRfT0JKRUNUUykgJChjeHhmaWx0X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgY3h4ZmlsdCQoRVhFRVhUKQotCSQoTElOSykgJChjeHhmaWx0X0xERkxBR1MpICQoY3h4ZmlsdF9PQkpFQ1RTKSAkKGN4eGZpbHRfTERBREQpICQoTElCUykKLS5sLmM6Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKExFWCkiICQ8ICQoTEVYX09VVFBVVF9ST09UKS5jICRAIC0tICQoQU1fTEZMQUdTKSAkKExGTEFHUykKLS55LmM6Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkPCB5LnRhYi5jICQqLmMgeS50YWIuaCAkKi5oIC0tICQoQU1fWUZMQUdTKSAkKFlGTEFHUykKLWFycGFyc2UuaDogYXJwYXJzZS5jCi1kZWZwYXJzZS5oOiBkZWZwYXJzZS5jCi1ubG1oZWFkZXIuaDogbmxtaGVhZGVyLmMKLXJjcGFyc2UuaDogcmNwYXJzZS5jCi0KLQotYmludXRpbHMuaW5mbzogYmludXRpbHMudGV4aQotYmludXRpbHMuZHZpOiBiaW51dGlscy50ZXhpCi0KLQotRFZJUFMgPSBkdmlwcwotCi0udGV4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50ZXhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50eGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotLmR2aS5wczoKLQkkKERWSVBTKSAkPCAtbyAkQAotCi1pbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKLQlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKLQkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKLQkgICAgZWxzZSA6IDsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JQCQoUE9TVF9JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCi0JICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKLQkgIGRvbmU7IFwKLQllbHNlIDogOyBmaQotCi11bmluc3RhbGwtaW5mbzoKLQkkKFBSRV9VTklOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWk9eWVzOyBcCi0JZWxzZSBpaT07IGZpOyBcCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAteiAiJGlpIiBcCi0JICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAotCWRvbmUKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAotCWRvbmUKLQotZGlzdC1pbmZvOiAkKElORk9fREVQUykKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1hbWluZm86Ci0JLXJtIC1mIGJpbnV0aWxzLmF1eCBiaW51dGlscy5jcCBiaW51dGlscy5jcHMgYmludXRpbHMuZHZpIGJpbnV0aWxzLmZuIFwKLQkgIGJpbnV0aWxzLmZucyBiaW51dGlscy5reSBiaW51dGlscy5reXMgYmludXRpbHMucHMgXAotCSAgYmludXRpbHMubG9nIGJpbnV0aWxzLnBnIGJpbnV0aWxzLnRvYyBiaW51dGlscy50cCBcCi0JICBiaW51dGlscy50cHMgYmludXRpbHMudnIgYmludXRpbHMudnJzIGJpbnV0aWxzLm9wIGJpbnV0aWxzLnRyIFwKLQkgIGJpbnV0aWxzLmN2IGJpbnV0aWxzLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotCi1pbnN0YWxsLW1hbjE6Ci0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChtYW4xZGlyKQotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCi0JICBlbHNlIGZpbGU9JCRpOyBmaTsgXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tYW4xOgotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotaW5zdGFsbC1tYW46ICQoTUFOUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLW1hbjEKLXVuaW5zdGFsbC1tYW46Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtbWFuMQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLQotUlVOVEVTVEZMQUdTID0KLQotREVKQVRPT0wgPSAkKFBBQ0tBR0UpCi0KLVJVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAotCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAotCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiYXJsZXhsZGVmbGV4bHJjbGV4bGFycGFyc2VoYXJwYXJzZWNkZWZwYXJzZWhkZWZwYXJzZWNubG1oZWFkZXJobmxtaGVhZGVyY3JjcGFyc2VocmNwYXJzZWMkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgYXJsZXhsIGRlZmxleGwgcmNsZXhsIGFycGFyc2VoIGFycGFyc2VjIGRlZnBhcnNlaCBkZWZwYXJzZWMgbmxtaGVhZGVyaCBubG1oZWFkZXJjIHJjcGFyc2VoIHJjcGFyc2VjICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCQltb3N0bHljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1sb2NhbAotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIGNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIFwKLQkJY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWJpblBST0dSQU1TIFwKLQkJZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCi0JCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tYmluUFJPR1JBTVMgXAotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5QUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKLW1vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAotdW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCi1pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY2Rpcj1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNkaXI7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJQ0NfRk9SX1RBUkdFVD0iJChDQ19GT1JfVEFSR0VUKSIgXAotCQlDRkxBR1NfRk9SX1RBUkdFVD0iJChDRkxBR1MpIiAkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLWluc3RhbGxjaGVjazoKLQkvYmluL3NoICQoc3JjZGlyKS9zYW5pdHkuc2ggJChiaW5kaXIpCi0KLXVuZGVyc2NvcmUuYzogc3RhbXAtdW5kZXIgOyBAdHJ1ZQotCi1zdGFtcC11bmRlcjogTWFrZWZpbGUKLQllY2hvICcvKldBUk5JTkc6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEqLycgPnVuZGVyc2NvcmUudAotCWVjaG8gImludCBwcmVwZW5kc191bmRlcnNjb3JlID0gQFVOREVSU0NPUkVAOyIgPj51bmRlcnNjb3JlLnQKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdW5kZXJzY29yZS50IHVuZGVyc2NvcmUuYwotCXRvdWNoIHN0YW1wLXVuZGVyCi0KLWNwbHVzLWRlbS5vOiAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyAkKElOQ0RJUikvZ2V0b3B0LmgKLQkkKENPTVBJTEUpIC1jIC1ETUFJTiAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMKLQotIyBUaGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBjb252ZXJ0aW9uIHRvIGF1dG9tYWtlLgotIyBUaGlzIHJ1bGUgY3JlYXRlcyBhIHNpbmdsZSBiaW5hcnkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWIKLSMgYnkgbG9va2luZyBhdCBhcmd2WzBdLiAgVXNlIHRoaXMga2x1ZGdlIHRvIHNhdmUgc29tZSBkaXNrIHNwYWNlLgotIyBIb3dldmVyLCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoaW5ncyBieSBoYW5kLgotIyAoVGhhdCBpcyBhZnRlciAnbWFrZSBpbnN0YWxsJywgcmVwbGFjZSB0aGUgaW5zdGFsbGVkIHJhbmxpYiBieSBhIGxpbmsgdG8gYXIuKQotIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGluc3RhbGwgcmFubGliLnNoIGFzIHJhbmxpYi4KLSMgYXJfd2l0aF9yYW5saWI6ICQoQURETF9ERVBTKSBhci5vIG1heWJlLXJhbmxpYi5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKEFSX1BST0cpIGFyLm8gbWF5YmUtcmFubGliLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChSQU5MSUJfUFJPRykKLSMJLWxuICQoQVJfUFJPRykgJChSQU5MSUJfUFJPRykKLSMKLSMgb2JqY29weSBhbmQgc3RyaXAgaW4gb25lIGJpbmFyeSB0aGF0IHVzZXMgYXJndlswXSB0byBkZWNpZGUgaXRzIGFjdGlvbi4KLSMKLSNvYmpjb3B5X3dpdGhfc3RyaXA6ICQoQURETF9ERVBTKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChPQkpDT1BZX1BST0cpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoU1RSSVBfUFJPRykKLSMJLWxuICQoT0JKQ09QWV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLXN5c3JvZmYuYzogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvIAotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWMgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWkgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1nIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0KLXN5c3JvZmYuaDogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZCA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5oCi0KLXN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpOiBzeXNpbmZvLm8gc3lzbGV4Lm8KLQkkKENDX0ZPUl9CVUlMRCkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgc3lzaW5mby5vIHN5c2xleC5vIAotCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi0JaWYgWyAtciBzeXNsZXguYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNsZXguYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzbGV4LmMgO1wKLQlmaQotCi1zeXNpbmZvLm86IHN5c2luZm8uYwotCWlmIFsgLXIgc3lzaW5mby5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2luZm8uYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzaW5mby5jIDsgXAotCWZpCi0KLWRsbHRvb2wubzpkbGx0b29sLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvZGxsdG9vbC5jCi0KLXJlc2NvZmYubzpyZXNjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvcmVzY29mZi5jCi0KLSMgY29mZi9zeW0uaCBhbmQgY29mZi9lY29mZi5oIHdvbid0IGJlIGZvdW5kIGJ5IHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeQotIyBzY3JpcHRzLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkuCi1ubG1jb252Lm86IG5sbWNvbnYuYyAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0JbGRuYW1lPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSQoQ09NUElMRSkgLWMgLURMRF9OQU1FPSJcIiQke2xkbmFtZX1cIiIgQE5MTUNPTlZfREVGU0AgJChzcmNkaXIpL25sbWNvbnYuYwotCi1kaXN0c3R1ZmY6ICQoRElTVFNUVUZGKSBpbmZvCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgREVQMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgREVQMQotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgREVQMQotCXNlZCAtZiBkZXAuc2VkIDxERVAxID5ERVAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLURFUDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgREVQMgotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCSQoTUtERVApIC1mIERFUDIgJChJTkNMVURFUykgJD8KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCW9iamRpcj1gcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScJXAotCQktZSAicyFAT0JKRElSQCEkJHtvYmpkaXJ9ISIKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyMjCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotY29uZmlnLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgY29uZmlnLnRleGkKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiBjb25maWcudGV4aQotCi1iaW51dGlscy5kdmk6ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLWJpbnV0aWxzLmluZm86ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLSQoREVNQU5HTEVSX05BTUUpLjE6IGN4eGZpbHQubWFuIE1ha2VmaWxlCi0Jc2VkIC1lICdzL0BQUk9HUkFNQC8kKERFTUFOR0xFUl9OQU1FKS8nIDwgJChzcmNkaXIpL2N4eGZpbHQubWFuIFwKLQkJPiAkKERFTUFOR0xFUl9OQU1FKS4xCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6ICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLycgLWUgJ3MvY3h4ZmlsdC8kKERFTUFOR0xFUl9OQU1FKS8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLycgLWUgJ3MvY3h4ZmlsdC8kKERFTUFOR0xFUl9OQU1FKS8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KLQlmb3IgaSBpbiAkKFRPT0xfUFJPR1MpOyBkbyBcCi0JICBpZiBbIC1mICQkaSQoRVhFRVhUKSBdOyB0aGVuIFwKLQkgICAgaj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvLW5ldy8vJ2A7IFwKLQkgICAgaz1gZWNobyAkJGogfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JICAgIGlmIFsgIiQoYmluZGlyKS8kJGskKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgICAgIHJtIC1mICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICAgIGxuICQoYmluZGlyKS8kJGskKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCQl8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGkkKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIHRydWU7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hZGRyMmxpbmUubzogYWRkcjJsaW5lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWFyLm86IGFyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvYW91dC9hci5oICQoQkZERElSKS9saWJiZmQuaCBhcnN1cC5oCi1hcnN1cC5vOiBhcnN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGFyc3VwLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWJ1Y29tbS5vOiBidWNvbW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmR1bXAubzogY29mZmR1bXAuYyBjb2ZmZ3Jvay5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmdyb2subzogY29mZmdyb2suYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmZ3Jvay5oCi1kZWJ1Zy5vOiBkZWJ1Zy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaAotZGxsdG9vbC5vOiBkbGx0b29sLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZHluLXN0cmluZy5oIFwKLSAgZGxsdG9vbC5oCi1maWxlbW9kZS5vOiBmaWxlbW9kZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWllZWUubzogaWVlZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvaWVlZS5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLWlzLXJhbmxpYi5vOiBpcy1yYW5saWIuYwotaXMtc3RyaXAubzogaXMtc3RyaXAuYwotbWF5YmUtcmFubGliLm86IG1heWJlLXJhbmxpYi5jCi1tYXliZS1zdHJpcC5vOiBtYXliZS1zdHJpcC5jCi1ubG1jb252Lm86IG5sbWNvbnYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoQkZERElSKS9saWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1jb252LmgKLW5tLm86IG5tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1ub3QtcmFubGliLm86IG5vdC1yYW5saWIuYwotbm90LXN0cmlwLm86IG5vdC1zdHJpcC5jCi1vYmpjb3B5Lm86IG9iamNvcHkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWRiZy5oCi1vYmpkdW1wLm86IG9iamR1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1wcmRiZy5vOiBwcmRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1yZGNvZmYubzogcmRjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggXAotICBidWRiZy5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotcmRkYmcubzogcmRkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotc2l6ZS5vOiBzaXplLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9nZXRvcHQuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcmNvbnYubzogc3Jjb252LmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIHN5c3JvZmYuaCBjb2ZmZ3Jvay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3lzcm9mZi5jCi1zdGFicy5vOiBzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RyaW5ncy5vOiBzdHJpbmdzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN5c2R1bXAubzogc3lzZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggc3lzcm9mZi5oIFwKLSAgc3lzcm9mZi5jCi12ZXJzaW9uLm86IHZlcnNpb24uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi13cnN0YWJzLm86IHdyc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXdpbmRyZXMubzogd2luZHJlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9vYnN0YWNrLmggd2luZHJlcy5oIFwKLSAgd2luZHVuaS5oCi1yZXNyYy5vOiByZXNyYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmVzY29mZi5vOiByZXNjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLXJlc2Jpbi5vOiByZXNiaW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXdpbmR1bmkubzogd2luZHVuaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggd2luZHVuaS5oCi1yZWFkZWxmLm86IHJlYWRlbGYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvbWlwcy5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9tNjhrLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL2QzMHYuaCAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvaTk2MC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLXJlc3Jlcy5vOiByZXNyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLWR5bi1zdHJpbmcubzogZHluLXN0cmluZy5jIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgZHluLXN0cmluZy5oCi1kbGx3cmFwLm86IGRsbHdyYXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBkeW4tc3RyaW5nLmgKLXJlbmFtZS5vOiByZW5hbWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi11bmRlcnNjb3JlLm86IHVuZGVyc2NvcmUuYwotYXJwYXJzZS5vOiBhcnBhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBhcnN1cC5oCi1hcmxleC5vOiBhcmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCBhcnBhcnNlLmgKLXN5c3JvZmYubzogc3lzcm9mZi5jCi1zeXNpbmZvLm86IHN5c2luZm8uYwotc3lzbGV4Lm86IHN5c2xleC5jIHN5c2luZm8uaAotZGVmcGFyc2UubzogZGVmcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGRsbHRvb2wuaAotZGVmbGV4Lm86IGRlZmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGRlZnBhcnNlLmggZGxsdG9vbC5oCi1ubG1oZWFkZXIubzogbmxtaGVhZGVyLmMgLi4vYmZkL2JmZC5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gIG5sbWNvbnYuaAotcmNwYXJzZS5vOiByY3BhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1yY2xleC5vOiByY2xleC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaCByY3BhcnNlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL05FV1MgYi9iaW51dGlscy9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI3YWQ1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL05FV1MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLSotIHRleHQgLSotCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi4xMDoKLQotKiBOZXcgY29tbWFuZCBsaW5lIHN3aXRjaCB0byBvYmpkdW1wIC1NIChvciAtLWRpc2Fzc2VtYmxlci1vcHRpb25zKSB3aGljaCB0YWtlcwotICBhIHBhcmFtZXRlciB3aGljaCBjYW4gdGhlbiBiZSBpbnRlcnByZXRlZCBvbiBhIHBlci10YXJnZXQgYmFzaXMgYnkgdGhlCi0gIGRpc2Fzc2VtYmxlci4gIFVzZWQgYnkgQVJNIHRhcmdldHMgdG8gc2VsZWN0IHJlZ2lzdGVyIG5hbWUgc2V0cywgSVNBLCBBUENTIG9yCi0gIHJhdyB2ZXJpb25zLgotICAKLSogb2JqZHVtcCBzdXBwb3J0IGZvciAtbWkzODY6aW50ZWwgd2hpY2ggY2F1c2VzIGRpc2Fzc2VtYmx5IHRvIGJlIGRpc3BsYXllZAotICB3aXRoIGludGVsIHN5bnRheC4KLQotKiBOZXcgcHJvZ3JhbTogcmVhZGVsZi4gIFRoaXMgZGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMsCi0gIHJlZ2FyZGxlc3Mgb2YgdGFyZ2V0IG1hY2hpbmUuCi0KLSogb2JqY29weSBub3cgdGFrZXMgLS1jaGFuZ2Utc2VjdGlvbi1sbWEsIC0tY2hhbmdlLXNlY3Rpb24tdm1hLCBhbmQKLSAgLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIG9wdGlvbnMuICBUaGUgb2xkIC0tYWRqdXN0LXNlY3Rpb24tdm1hIG9wdGlvbiBpcwotICBlcXVpdmFsZW50IHRvIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcy4gIFRoZSBvdGhlciAtLWFkanVzdC0qIG9wdGlvbnMgYXJlIG5vdwotICByZW5hbWVkIHRvIC0tY2hhbmdlLSosIGFsdGhvdWdoIC0tYWRqdXN0LSogY29udGludWVzIHRvIHdvcmsuCi0KLSogZGxsdG9vbCBub3cgc3VwcG9ydHMgdGhlIElNUE9SVFMgY29tbWFuZC4KLQotKiBkbGx0b29sIG5vdyB0YWtlcyAtLWV4cG9ydC1hbGwtc3ltYm9scywgLS1uby1leHBvcnQtYWxsLXN5bWJvbHMsCi0gIC0tZXhjbHVkZS1zeW1ib2xzLCBhbmQgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzIG9wdGlvbnMuCi0KLSogb2JqY29weSBub3cgdGFrZXMgYSAtai8tLW9ubHktc2VjdGlvbiBvcHRpb24gdG8gY29weSBvbmx5IHRoZSBzcGVjaWZpZWQKLSAgc2VjdGlvbnMuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi45OgotCi0qIEFkZGVkIHdpbmRyZXMgcHJvZ3JhbSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSByZXNvdXJjZXMgaW4gV0lOMzIKLSAgZmlsZXMgYXMgdXNlZCBvbiBXaW5kb3dzIDk1IGFuZCBXaW5kb3dzIE5ULgotCi0qIFRoZSBvYmpjb3B5IC0tZ2FwLWZpbGwgYW5kIC0tcGFkLXRvIG9wdGlvbnMgb3BlcmF0ZSBvbiB0aGUgTE1BIHJhdGhlciB0aGFuCi0gIHRoZSBWTUEgb2YgdGhlIHNlY3Rpb25zLgotCi0qIEFkZGVkIFMgbW9kaWZpZXIgdG8gYXIgdG8gbm90IGJ1aWxkIGEgc3ltYm9sIHRhYmxlLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuODoKLQotKiBUaGUgb2JqZHVtcCBkaXNhc3NlbWJseSBmb3JtYXQgaGFzIGJlZW4gY2hhbmdlZCwgYW5kIGhvcGVmdWxseSBpbXByb3ZlZC4gIFVzZQotICB0aGUgbmV3IC0tcHJlZml4LWFkZHJlc3NlcyBvcHRpb24gdG8gZ2V0IHRoZSBvbGQgZm9ybWF0LiAgVGhlcmUgYXJlIGFsc28gbmV3Ci0gIC0tZGlzYXNzZW1ibGUtemVyb2VzIGFuZCAtLW5vLXNob3ctcmF3LWluc24gb3B0aW9ucyB3aGljaCBhZmZlY3QgZGlzYXNzZW1ibGVyCi0gIG91dHB1dC4KLQotKiBGb3JtYXRzIG1heSBub3cgYmUgc3BlY2lmaWVkIGFzIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMuICBGb3IgZXhhbXBsZSwKLSAgb2JqZHVtcCAtYiBpMzg2LXBjLWxpbnV4LiAgVGhlIHRyaXBsZXRzIGFyZSBub3QgcGFzc2VkIHRocm91Z2ggY29uZmlnLnN1YiwKLSAgc28gdGhleSBtdXN0IGJlIGluIGNhbm9uaWNhbCBmb3JtLgotCi0qIEFkZGVkIG5ldyBhZGRyMmxpbmUgcHJvZ3JhbS4gIFRoaXMgdXNlcyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGNvbnZlcnQKLSAgYW4gYWRkcmVzcyBpbnRvIGEgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB3aXRoaW4gYSBwcm9ncmFtLgotCi0qIEFkZGVkIC0tY2hhbmdlLWxlYWRpbmctY2hhciBhcmd1bWVudCB0byBvYmpjb3B5LgotCi0qIEFkZGVkIC0td2Vha2VuIGFyZ3VtZW50IHRvIG9iamNvcHkuCi0KLSogb2JqZHVtcCAtLWR5bmFtaWMtcmVsb2Mgbm93IHdvcmtzIG9uIEVMRiBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIGxpYnJhcmllcy4KLQotKiBBZGRlZCAtLWFkanVzdC12bWEgb3B0aW9uIHRvIG9iamR1bXAuCi0KLSogQWRkZWQgLUMvLS1kZW1hbmdsZSBvcHRpb24gdG8gb2JqZHVtcC4KLQotKiBBZGRlZCAtcC8tLXByZXNlcnZlLWRhdGVzIG9wdGlvbiB0byBzdHJpcCBhbmQgb2JqY29weS4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjc6Ci0KLSogQWRkZWQgLS1lbmFibGUtc2hhcmVkIGFuZCAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3B0aW9ucyB0byBjb25maWd1cmUuCi0KLSogQWRkZWQgLS1kZWJ1Z2dpbmcgYXJndW1lbnQgdG8gb2JqZHVtcCBhbmQgb2JqY29weS4KLQotKiBBZGRlZCAtLWRlZmluZWQtb25seSBhcmd1bWVudCB0byBubS4KLQotKiBBZGRlZCAtLXJlbW92ZS1sZWFkaW5nLWNoYXIgYXJndW1lbnQgdG8gb2JqY29weS4KLQotKiBUaGUgb2JqZHVtcCAtLWxpbmUtbnVtYmVycyBvcHRpb24gaXMgbm93IG1lYW5pbmdmdWwgd2l0aCAtLXJlbG9jLgotCi0qIEFkZGVkIC0tbGluZS1udW1iZXJzIG9wdGlvbiB0byBubS4KLQotKiBBZGRlZCAtLWVuZGlhbi8tRUIvLUVMIG9wdGlvbiB0byBvYmpkdW1wLgotCi0qIEFkZGVkIHN1cHBvcnQgZm9yIEFscGhhIE9wZW5WTVMvQVhQLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNjoKLQotKiBBZGRlZCAtTi8tLXN0cmlwLXN5bWJvbCBhbmQgLUsvLS1rZWVwLXN5bWJvbCBhcmd1bWVudHMgdG8gc3RyaXAgYW5kIG9iamNvcHkuCi0KLSogQWRkZWQgc2V2ZXJhbCBhcmd1bWVudHMgdG8gb2JqY29weSB0byBwcm92aWRlIHNvbWUgY29udHJvbCBvdmVyIGhvdyB0aGUgbmV3Ci0gIGZpbGUgaXMgbGFpZCBvdXQgaW4gbWVtb3J5LiAgQWxzbyBhZGRlZCBiaW5hcnkgb3V0cHV0IGZvcm1hdCB0byBCRkQgdG8gcGVybWl0Ci0gIGdlbmVyYXRpbmcgcGxhaW4gYmluYXJ5IGZpbGVzLgotCi0qIEFkZGVkIC0tc3RhcnQtYWRkcmVzcyBhbmQgLS1zdG9wLWFkZHJlc3Mgb3B0aW9ucyB0byBvYmpkdW1wLgotCi0qIGFyIGFuZCByYW5saWIgbm93IHdvcmsgb24gQUlYLiAgVGhlIHRvb2xzIGFyZSBub3cgYnVpbHQgYnkgZGVmYXVsdCBvbiBBSVguCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi41OgotCi0qIENoYW5nZWQgb2JqZHVtcCAtZHIgdG8gZHVtcCB0aGUgcmVsb2NzIGludGVyc3BlcnNlZCB3aXRoIHRoZSBhc3NlbWJseQotICBsaXN0aW5nLCBmb3IgYSBtb3JlIHVzZWZ1bCBsaXN0aW5nIG9mIHJlbG9jYXRlYWJsZSBmaWxlcy4KLQotKiBDaGFuZ2VkIG9iamR1bXAgLWQvLS1kaXNhc3NlbWJsZSB0byBvbmx5IGRpc2Fzc2VtYmxlIFNFQ19DT0RFIHNlY3Rpb25zLgotICBBZGRlZCAtRC8tLWRpc2Fzc2VtYmxlLWFsbCBvcHRpb24gdG8gZGlzYXNzZW1ibGUgYWxsIHNlY3Rpb25zLgotCi0qIEFkZGVkIC0tc2l6ZS1zb3J0IG9wdGlvbiB0byBubS4KLQotKiBzdHJpcCBhbmQgb2JqY29weSBzaG91bGQgbm93IGJlIGFibGUgdG8gaGFuZGxlIGR5bmFtaWNhbGx5IGxpbmtlZCBFTEYKLSAgZXhlY3V0YWJsZXMuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi40OgotCi0qIFN1cHBvcnQgZm9yIEhQLVBBIChieSBKZWZmIExhdyksIGkzODYgTWFjaCAoYnkgRGF2aWQgTWFja2VuemllKSwgUlMvNjAwMCBhbmQKLSAgUG93ZXJQQyAoZXhjZXB0IGFyIGFuZCByYW5saWI7IGJ5IElhbiBUYXlsb3IpLgotCi0qIFN1cHBvcnQgZm9yIElyaXggNS4KLQotKiBQcm9ncmFtcyBgc3RyaXAnIGFuZCBgb2JqY29weScgd2lsbCBub3QgYXR0ZW1wdCB0byB3cml0ZSBkeW5hbWljYWxseSBsaW5rZWQKLSAgRUxGIG91dHB1dCBmaWxlcywgc2luY2UgQkZEIGN1cnJlbnRseSBjYW4ndCBjcmVhdGUgdGhlbSBwcm9wZXJseS4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjM6Ci0KLSogQSBuZXcgLS1zdGFicyBhcmd1bWVudCBoYXMgYmVlbiBhZGRlZCB0byBvYmpkdW1wIHRvIGR1bXAgc3RhYnMgc2VjdGlvbnMgaW4KLSAgRUxGIGFuZCBDT0ZGIGZpbGVzLgotCi0qIEEgbmV3IHByb2dyYW0sIG5sbWNvbnYsIGhhcyBiZWVuIGFkZGVkLiAgSXQgY2FuIGNvbnZlcnQgb2JqZWN0IGZpbGVzIGludG8KLSAgTm92ZWxsIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlcy4KLQotKiBUaGUgc3RyaW5ncyBwcm9ncmFtIGhhcyBiZWVuIGFkZGVkLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuMjoKLQotKiBUaGUgJ2NvcHknIHByb2dyYW0gaGFzIGJlZW4gcmVuYW1lZCB0byAnb2JqY29weScsIGZvciBjb25zaXN0ZW5jeSB3aXRoCi0gICdvYmpkdW1wJywgYW5kIGJlY2F1c2UgJ2NvcHknIG1pZ2h0IG1vcmUgcGxhdXNpYmx5IGJlIHVzZWQgYXMgYSBzeW5vbnltIGZvcgotICAnY3AnLgotCi0qIFRoZSBuZXcgc3RhbmQtYWxvbmUgcHJvZ3JhbSBjKytmaWx0IGlzIGEgZmlsdGVyIHRoYXQgY29udmVydHMgZW5jb2RlZAotICAobWFuZ2xlZCkgQysrIGFzc2VtYmx5LWxldmVsIGlkZW50aWZpZXJzIHRvIHVzZXItbGV2ZWwgbmFtZXMuICAoTm90ZTogVGhpcwotICBtYXkgZ2V0IG1vdmVkIHRvIHRoZSBnY2MgZGlzdHJpYnV0aW9uLikKLQotKiBubSAtbyBvbiBhbiBhcmNoaXZlIG5vdyBwcmVmaXhlcyBlYWNoIGxpbmUgd2l0aCB0aGUgYXJjaGl2ZSBuYW1lLCBtYXRjaGluZwotICB0aGUgb3V0cHV0IGZyb20gQlNEIG5tLgotCi0qIGFyIChhbmQgbGQpIGNhbiBub3cgcmVhZCAoYnV0IG5vdCB3cml0ZSkgQlNENC40LXN0eWxlIGFyY2hpdmVzLgotCi0qIE5ldyBzdXBwb3J0IGZvciBIODUwMCwgWjgwMDAsIGFuZCB0aGUgSGl0YWNoIFNILgotCi0qIERpcy1hc3NlbWJsZXIgaW50ZXJmYWNlIGNoYW5nZWQgdG8gYWxsb3cgc2hhcmluZyB3aXRoIGdkYi4KLQotKiBUaGVyZSBpcyBuZXcgRWxmIGNvZGUsIGJ1dCBpdCBpcyBub3QgeWV0IHJlYWR5IGZvciBnZW5lcmFsIHVzZS4KLQotKiBUaGVyZSBpcyB0aGUgYmVnaW5uaW5ncyBvZiBhIHRlc3Qgc3VpdGUuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi4xOgotCi0qIFRoZXJlIGlzIG5vdyBzdXBwb3J0IGZvciB3cml0aW5nIEVDT0ZGIGZpbGVzLCBzbyBsZCBhbmQgdGhlIG90aGVyIHV0aWxpdGllcwotICBzaG91bGQgd29yayBvbiBSaXNjL1VsdHJpeCBhbmQgSXJpeC4gIFBsZWFzZSBsZXQgdXMga25vdyBob3cgd2VsbCB0aGlzIHdvcmtzLgotCi0qIGFyIG5vdyBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBzeW1ib2wgdGFibGUgKGEgX18uU1lNREVGIG1lbWJlciwgaW4gdGhlIEJTRAotICB2ZXJzaW9uKSwgaWYgdGhlcmUgYXJlIGFueSBvYmplY3QgZmlsZXMgaW4gdGhlIGFyY2hpdmUuICBTbyBydW5uaW5nIHJhbmxpYiBpcwotICBub3cgcmVkdW5kYW50ICh1bmxlc3MgdGhlIG5vbi1zdGFuZGFyZCBxIGNvbW1hbmQgaXMgdXNlZCkuICBUaGlzIGlzIHJlcXVpcmVkCi0gIGZvciBQb3NpeC4yIGNvbmZvcm1hbmNlLgotCi0qIFRoZSBhcmNoaXZlLXJlYWRpbmcgY29kZSBub3cgcmVhZHMgYm90aCBCU0Qtc3R5bGUgYW5kIFNZU1Ytc3R5bGUgYXJjaGl2ZXMKLSAgaW5kZXBlbmRlbnRseSBvZiB0aGUgc2VsZWN0ZWQgdGFyZ2V0IGZvcm1hdC4gIFRoaXMgaXMgdG8gZW5jb3VyYWdlIHBlb3BsZSB0bwotICBzd2l0Y2ggdG8gU1lTVi1mb3JtYXQsIHdoaWNoIGhhcyBhIG51bWJlciBvZiBhZHZhbnRhZ2VzLgotCi0qIFRoZSBzdHJpcCBhbmQgY29weSBwcm9ncmFtcyBub3cgaGF2ZSBvcHRpb25zIHRvIHJlbW92ZSBkZWJ1Zy1zeW1ib2xzIG9ubHkKLSAgYW5kL29yIGxvY2FsIHN5bWJvbHMgb25seS4gIFRoZXkgbm93IGFsc28gc3VwcG9ydCBsb25nIG9wdGlvbnMuCi0KLQwKLUxvY2FsIHZhcmlhYmxlczoKLWZpbGwtY29sdW1uOiA3OQotRW5kOgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvUkVBRE1FIGIvYmludXRpbHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJkMjc3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi1UaGVzZSBhcmUgdGhlIEdOVSBiaW51dGlscy4gIFRoZXNlIGFyZSB1dGlsaXRpZXMgb2YgdXNlIHdoZW4gZGVhbGluZwotd2l0aCBvYmplY3QgZmlsZXMuCi0KLVRoZSBsaW5rZXIgKGxkKSBpcyBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSwgd2hpY2ggc2hvdWxkIGJlIC4uL2xkLgotTGlua2VyLXNwZWNpZmljIG5vdGVzIGFyZSBpbiAuLi9sZC9SRUFETUUuCi0KLUFzIG9mIHZlcnNpb24gMi41LCB0aGUgYXNzZW1ibGVyIChhcykgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGlzIHBhY2thZ2UsIGluCi0uLi9nYXMuICBBc3NlbWJsZXItc3BlY2lmaWMgbm90ZXMgY2FuIGJlIGZvdW5kIGluIC4uL2dhcy9SRUFETUUuCi0KLVJlY2VudCBjaGFuZ2VzIGFyZSBpbiAuL05FV1MsIC4uL2xkL05FV1MsIGFuZCAuLi9nYXMvTkVXUy4KLQotVW5wYWNraW5nIGFuZCBJbnN0YWxsYXRpb24gLS0gcXVpY2sgb3ZlcnZpZXcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVdoZW4geW91IHVucGFjayB0aGUgYmludXRpbHMtMi45LnRhci5neiBmaWxlLCB5b3UnbGwgZ2V0IGEgZGlyZWN0b3J5Ci1jYWxsZWQgc29tZXRoaW5nIGxpa2UgYGJpbnV0aWxzLTIuOScsIHdoaWNoIGNvbnRhaW5zIHZhcmlvdXMgZmlsZXMgYW5kCi1kaXJlY3Rvcmllcy4gIE1vc3Qgb2YgdGhlIGZpbGVzIGluIHRoZSB0b3AgZGlyZWN0b3J5IGFyZSBmb3IKLWluZm9ybWF0aW9uIGFuZCBmb3IgY29uZmlndXJhdGlvbi4gIFRoZSBhY3R1YWwgc291cmNlIGNvZGUgaXMgaW4KLXN1YmRpcmVjdG9yaWVzLgotCi1UbyBidWlsZCBiaW51dGlscywgeW91IGNhbiBqdXN0IGRvOgotCi0JY2QgYmludXRpbHMtMi45Ci0JLi9jb25maWd1cmUgW29wdGlvbnNdCi0JbWFrZQotCW1ha2UgaW5zdGFsbCAjIGNvcGllcyB0aGUgcHJvZ3JhbXMgZmlsZXMgaW50byAvdXNyL2xvY2FsL2JpbgotCQkgICAgICMgYnkgZGVmYXVsdC4KLQotVGhpcyB3aWxsIGNvbmZpZ3VyZSBhbmQgYnVpbGQgYWxsIHRoZSBsaWJyYXJpZXMgYXMgd2VsbCBhcyB0aGUKLWFzc2VtYmxlciwgdGhlIGJpbnV0aWxzLCBhbmQgdGhlIGxpbmtlci4KLQotSWYgeW91IGhhdmUgR05VIG1ha2UsIHdlIHJlY29tbWVuZCBidWlsZGluZyBpbiBhIGRpZmZlcmVudCBkaXJlY3Rvcnk6Ci0KLQlta2RpciBvYmpkaXIKLQljZCBvYmpkaXIKLQkuLi9iaW51dGlscy0yLjkvY29uZmlndXJlIFtvcHRpb25zXQotCW1ha2UKLQltYWtlIGluc3RhbGwKLQotVGhpcyByZWxpZXMgb24gdGhlIFZQQVRIIGZlYXR1cmUgb2YgR05VIG1ha2UuCi0KLUJ5IGRlZmF1bHQsIHRoZSBiaW51dGlscyB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCB0aGUgc3lzdGVtIG9uCi13aGljaCB0aGV5IGFyZSBidWlsdC4gIFdoZW4gZG9pbmcgY3Jvc3MgZGV2ZWxvcG1lbnQsIHVzZSB0aGUgLS10YXJnZXQKLWNvbmZpZ3VyZSBvcHRpb24gdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB0YXJnZXQuCi0KLVRoZSAtLWVuYWJsZS10YXJnZXRzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIG1vcmUgYmluYXJ5IGZpbGUgZm9ybWF0cwotYmVzaWRlcyB0aGUgZGVmYXVsdC4gIExpc3QgdGhlbSBhcyB0aGUgYXJndW1lbnQgdG8gLS1lbmFibGUtdGFyZ2V0cywKLXNlcGFyYXRlZCBieSBjb21tYXMuICBGb3IgZXhhbXBsZToKLQotCS4vY29uZmlndXJlIC0tZW5hYmxlLXRhcmdldHM9c3VuMyxyczYwMDAtYWl4LGRlY3N0YXRpb24KLQotVGhlIG5hbWUgJ2FsbCcgY29tcGlsZXMgaW4gc3VwcG9ydCBmb3IgYWxsIHZhbGlkIEJGRCB0YXJnZXRzICh0aGlzIHdhcwotdGhlIGRlZmF1bHQgaW4gcmVsZWFzZXMgYmVmb3JlIDIuMyk6Ci0KLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS10YXJnZXRzPWFsbAotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgLS1lbmFibGUtc2hhcmVkIG9wdGlvbiB3aGVuIHlvdSBydW4KLWNvbmZpZ3VyZS4gIFRoaXMgd2lsbCBidWlsZCB0aGUgQkZEIGFuZCBvcGNvZGVzIGxpYnJhcmllcyBhcyBzaGFyZWQKLWxpYnJhcmllcy4gIFlvdSBjYW4gdXNlIGFyZ3VtZW50cyB3aXRoIHRoZSAtLWVuYWJsZS1zaGFyZWQgb3B0aW9uIHRvCi1pbmRpY2F0ZSB0aGF0IG9ubHkgY2VydGFpbiBsaWJyYXJpZXMgc2hvdWxkIGJlIGJ1aWx0IHNoYXJlZDsgZm9yCi1leGFtcGxlLCAtLWVuYWJsZS1zaGFyZWQ9YmZkLiAgVGhlIG9ubHkgcG90ZW50aWFsIHNoYXJlZCBsaWJyYXJpZXMgaW4KLWEgYmludXRpbHMgcmVsZWFzZSBhcmUgYmZkIGFuZCBvcGNvZGVzLgotCi1UaGUgYmludXRpbHMgd2lsbCBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgc2hhcmVkIGxpYnJhcmllcy4gIFRoZSBidWlsZAotc3RlcCB3aWxsIGF0dGVtcHQgdG8gcGxhY2UgdGhlIGNvcnJlY3QgbGlicmFyeSBpbiB0aGUgcnVudGltZSBzZWFyY2gKLXBhdGggZm9yIHRoZSBiaW5hcmllcy4gIEhvd2V2ZXIsIGluIHNvbWUgY2FzZXMsIGFmdGVyIHlvdSBpbnN0YWxsIHRoZQotYmluYXJpZXMsIHlvdSBtYXkgaGF2ZSB0byBzZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUsIG5vcm1hbGx5Ci1MRF9MSUJSQVJZX1BBVEgsIHNvIHRoYXQgdGhlIHN5c3RlbSBjYW4gZmluZCB0aGUgaW5zdGFsbGVkIGxpYmJmZAotc2hhcmVkIGxpYnJhcnkuCi0KLVRvIGJ1aWxkIHVuZGVyIG9wZW5WTVMvQVhQLCBzZWUgdGhlIGZpbGUgbWFrZWZpbGUudm1zIGluIHRoZSB0b3AgbGV2ZWwKLWRpcmVjdG9yeS4KLQotSWYgeW91IGRvbid0IGhhdmUgYXIKLT09PT09PT09PT09PT09PT09PT09Ci0KLUlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhbiBhciBwcm9ncmFtLCB0aGUgbm9ybWFsCi1iaW51dGlscyBidWlsZCBwcm9jZXNzIHdpbGwgbm90IHdvcmsuICBJbiB0aGlzIGNhc2UsIHJ1biBjb25maWd1cmUgYXMKLXVzdWFsLiAgQmVmb3JlIHJ1bm5pbmcgbWFrZSwgcnVuIHRoaXMgc2NyaXB0OgotCi0jIS9iaW4vc2gKLU1BS0VfUFJPRz0iJHtNQUtFLW1ha2V9IgotTUFLRT0iJHtNQUtFX1BST0d9IEFSPXRydWUgTElOSz10cnVlIgotZXhwb3J0IE1BS0UKLSR7TUFLRX0gJCogYWxsLWxpYmliZXJ0eQotJHtNQUtFfSAkKiBhbGwtaW50bAotJHtNQUtFfSAkKiBhbGwtYmZkCi1jZCBiaW51dGlscwotTUFLRT0iJHtNQUtFX1BST0d9IgotZXhwb3J0IE1BS0UKLSR7TUFLRX0gJCogYXJfREVQRU5ERU5DSUVTPSBhcl9MREFERD0nLi4vYmZkLyoubyBgY2F0IC4uL2xpYmliZXJ0eS9yZXF1aXJlZC1saXN0IC4uL2xpYmliZXJ0eS9uZWVkZWQtbGlzdCB8IHNlZCAtZSAicyxcKFteIF1bXiBdKlwpLC4uL2xpYmliZXJ0eS9cMSxnImAgYGlmIHRlc3QgLWYgLi4vaW50bC9nZXR0ZXh0Lm87IHRoZW4gZWNobyAnLi4vaW50bC8qLm8nOyBmaWAnIGFyCi0KLVRoaXMgc2NyaXB0IHdpbGwgYnVpbGQgYW4gYXIgcHJvZ3JhbSBpbiBiaW51dGlscy9hci4gIE1vdmUgYmludXRpbHMvYXIKLWludG8gYSBkaXJlY3Rvcnkgb24geW91ciBQQVRILiAgQWZ0ZXIgZG9pbmcgdGhpcywgeW91IGNhbiBydW4gbWFrZSBhcwotdXN1YWwgdG8gYnVpbGQgdGhlIGNvbXBsZXRlIGJpbnV0aWxzIGRpc3RyaWJ1dGlvbi4gIFlvdSBkbyBub3QgbmVlZAotdGhlIHJhbmxpYiBwcm9ncmFtIGluIG9yZGVyIHRvIGJ1aWxkIHRoZSBkaXN0cmlidXRpb24uCi0KLVBvcnRpbmcKLT09PT09PT0KLQotQmludXRpbHMtMi45IHN1cHBvcnRzIG1hbnkgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMsIGJ1dCB0aGVyZQotYXJlIG1hbnkgbW9yZSBub3Qgc3VwcG9ydGVkLCBpbmNsdWRpbmcgc29tZSB0aGF0IHdlcmUgc3VwcG9ydGVkCi1ieSBlYXJsaWVyIHZlcnNpb25zLiAgV2UgYXJlIGhvcGluZyBmb3Igdm9sdW50ZWVycyB0bwotaW1wcm92ZSB0aGlzIHNpdHVhdGlvbi4KLQotVGhlIG1ham9yIGVmZm9ydCBpbiBwb3J0aW5nIGJpbnV0aWxzIHRvIGEgbmV3IGhvc3QgYW5kL29yIHRhcmdldAotYXJjaGl0ZWN0dXJlIGludm9sdmVzIHRoZSBCRkQgbGlicmFyeS4gIFRoZXJlIGlzIHNvbWUgZG9jdW1lbnRhdGlvbgotaW4gLi4vYmZkL2RvYy4gIFRoZSBmaWxlIC4uL2dkYi9kb2MvZ2RiaW50LnRleGluZm8gKGRpc3RyaWJ1dGVkCi13aXRoIGdkYi00LngpIG1heSBhbHNvIGJlIG9mIGhlbHAuCi0KLVJlcG9ydGluZyBidWdzCi09PT09PT09PT09PT09PQotCi1TZW5kIGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZy4gIEFsd2F5cyBtZW50aW9uCi10aGUgdmVyc2lvbiBudW1iZXIgeW91IGFyZSBydW5uaW5nOyB0aGlzIGlzIHByaW50ZWQgYnkgcnVubmluZyBhbnkgb2YKLXRoZSBiaW51dGlscyB3aXRoIHRoZSAtLXZlcnNpb24gb3B0aW9uLiAgV2UgYXBwcmVjaWF0ZSByZXBvcnRzIGFib3V0Ci1idWdzLCBidXQgd2UgZG8gbm90IHByb21pc2UgdG8gZml4IHRoZW0uCi0KLVZNUwotPT09Ci0KLVRoaXMgc2VjdGlvbiB3YXMgd3JpdHRlbiBieSBLbGF1cyBLImFtcGYgPGtrYWVtcGZAcm1pLmRlPi4gIEl0Ci1kZXNjcmliZXMgaG93IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBiaW51dGlscyBvbiBvcGVuVk1TIChBbHBoYSBhbmQKLVZheCkuICAoVGhlIEJGRCBsaWJyYXJ5IG9ubHkgc3VwcG9ydHMgcmVhZGluZyBWYXggb2JqZWN0IGZpbGVzLikKLQotQ29tcGlsaW5nIHRoZSByZWxlYXNlOgotCi1UbyBjb21waWxlIHRoZSBnbnUgYmluYXJ5IHV0aWxpdGllcyBhbmQgdGhlIGdudSBhc3NlbWJsZXIsIHlvdSdsbAotbmVlZCBERUMgQyBvciBHTlUgQyBmb3Igb3BlblZNUy9BbHBoYS4gWW91J2xsIG5lZWQgKmJvdGgqIGNvbXBpbGVycwotb24gb3BlblZNUy9WYXguCi0KLUNvbXBpbGluZyB3aXRoIGVpdGhlciBERUMgQyBvciBHTlUgQyB3b3JrcyBvbiBvcGVuVk1TL0FscGhhIG9ubHkuIFNvbWUKLW9mIHRoZSBvcGNvZGVzIGFuZCBiaW51dGlscyBmaWxlcyB0cmFwIGEgYnVnIGluIHRoZSBERUMgQyBvcHRpbWl6ZXIsCi1zbyB0aGVzZSBmaWxlcyBtdXN0IGJlIGNvbXBpbGVkIHdpdGggL25vb3B0LgotCi1Db21waWxpbmcgb24gb3BlblZNUy9WYXggaXMgYSBiaXQgY29tcGxpY2F0ZWQsIGFzIHRoZSBiZmQgbGlicmFyeSB0cmFwcwotYSBidWcgaW4gR05VIEMgYW5kIHRoZSBnbnUgYXNzZW1ibGVyIGEgYnVnIGluIChteSB2ZXJzaW9uIG9mKSBERUMgQy4KLQotSSBuZXZlciB0cmllZCBjb21waWxpbmcgd2l0aCBWQVggQy4KLQotCi1Zb3UgZnVydGhlciBuZWVkIEdOVSBNYWtlIFZlcnNpb24gMy43NiBvciBsYXRlci4gVGhpcyBpcyBhdmFpbGFibGUKLWF0IGZ0cC5wcm9naXMuZGUgb3IgYW55IEdOVSBhcmNoaXZlIHNpdGUuIFRoZSBtYWtlZmlsZXMgYXNzdW1lIHRoYXQKLWdtYWtlIHN0YXJ0cyBnbnUgbWFrZSBhcyBhIGZvcmVpZ24gY29tbWFuZC4KLQotSWYgeW91J3JlIGNvbXBpbGluZyB3aXRoIERFQyBDIG9yIFZBWCBDLCB5b3UgbXVzdCBydW4KLQotICAkIEBzZXR1cAotCi1iZWZvcmUgc3RhcnRpbmcgZ251LW1ha2UuIFRoaXMgaXNuJ3QgbmVlZGVkIHdpdGggR05VIEMuCi0KLU9uIHRoZSBBbHBoYSB5b3UgY2FuIGNob29zZSB0aGUgY29tcGlsZXIgYnkgZWRpdGluZyB0aGUgdG9wbGV2ZWwKLW1ha2VmaWxlLnZtcy4gRWl0aGVyIHNlbGVjdCBDQz1jYyAoZm9yIERFQyBDKSBvciBDQz1nY2MgKGZvciBHTlUgQykKLQotCi1JbnN0YWxsaW5nIHRoZSByZWxlYXNlCi0KLVByb3ZpZGVkIHRoYXQgeW91ciBkaXJlY3Rvcnkgc2V0dXAgY29uZm9ybXMgdG8gdGhlIEdOVSBvbiBvcGVuVk1TCi1zdGFuZGFyZCwgeW91IGFscmVhZHkgaGF2ZSBhIGNvbmNlYWxlZCBkZXZpY2VkIG5hbWVkICdHTlVfUk9PVCcuCi1JbiB0aGlzIGNhc2UsIGEgc2ltcGxlCi0KLSAkIGdtYWtlIGluc3RhbGwKLQotc3VmZmljZXMgdG8gY29weSBhbGwgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcyB0byB0aGUgcHJvcGVyIGRpcmVjdG9yaWVzLgotCi1EZWZpbmUgdGhlIHByb2dyYW1zIGFzIGZvcmVpZ24gY29tbWFuZHMgYnkgYWRkaW5nIHRoZXNlIGxpbmVzIHRvIHlvdXIKLWxvZ2luLmNvbToKLQotICAkIGdhcyA6PT0gJEdOVV9ST09UOltiaW5dYXMuZXhlCi0gICQgc2l6ZSA6PT0gJEdOVV9ST09UOltiaW5dc2l6ZS5leGUKLSAgJCBubSA6PT0gJEdOVV9ST09UOltiaW5dbm0uZXhlCi0gICQgb2JqZHVtcCA6PT0gJEdOVV9ST09UOltiaW5db2JqZHVtcC5leGUKLSAgJCBzdHJpbmdzIDo9PSAkR05VX1JPT1Q6W2Jpbl1zdHJpbmdzLmV4ZQotCi1JZiB5b3UgaGF2ZSBhIGRpZmZlcmVudCBkaXJlY3Rvcnkgc2V0dXAsIGNvcHkgdGhlIGJpbmFyeSB1dGlsaXRpZXMKLShbLmJpbnV0aWxzXXNpemUuZXhlLCBbLmJpbnV0aWxzXW5tLmV4ZSwgWy5iaW51dGlsc11vYmpkdW1wLmV4ZSwKLWFuZCBbLmJpbnV0aWxzXXN0cmluZ3MuZXhlKSBhbmQgdGhlIGdudSBhc3NlbWJsZXIgYW5kIHByZXByb2Nlc3NvcgotKFsuZ2FzXWFzLmV4ZSBhbmQgWy5nYXNdZ2FzcC5leGVdKSB0byBhIGRpcmVjdG9yeSBvZiB5b3VyIGNob2ljZQotYW5kIGRlZmluZSBhbGwgcHJvZ3JhbXMgYXMgZm9yZWlnbiBjb21tYW5kcy4KLQotCi1JZiB5b3UncmUgc2F0aWVzZmllZCB3aXRoIHRoZSBjb21waWxhdGlvbiwgeW91IG1heSB3YW50IHRvIHJlbW92ZQotdW5uZWVkZWQgb2JqZWN0cyBhbmQgbGlicmFyaWVzOgotCi0gICQgZ21ha2UgY2xlYW4KLQotCi1JZiB5b3UgaGF2ZSBhbnkgcHJvYmxlbXMgb3IgcXVlc3Rpb25zIGFib3V0IHRoZSBiaW51dGlscyBvbiBWTVMsIGZlZWwKLWZyZWUgdG8gbWFpbCBtZSBhdCBra2FlbXBmQHJtaS5kZS4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FjaW5jbHVkZS5tNCBiL2JpbnV0aWxzL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiMDliOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYWNsb2NhbC5tNCBiL2JpbnV0aWxzL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTE1NjUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMjAgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+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+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLQotZG5sIEFNX1BST0dfTEVYCi1kbmwgTG9vayBmb3IgZmxleCwgbGV4IG9yIG1pc3NpbmcsIHRoZW4gcnVuIEFDX1BST0dfTEVYIGFuZCBBQ19ERUNMX1lZVEVYVAotQUNfREVGVU4oQU1fUFJPR19MRVgsCi1bbWlzc2luZ19kaXI9aWZlbHNlKFskMV0sLGBjZCAkYWNfYXV4X2RpciAmJiBwd2RgLCQxKQotQUNfQ0hFQ0tfUFJPR1MoTEVYLCBmbGV4IGxleCwgIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiKQotQUNfUFJPR19MRVgKLUFDX0RFQ0xfWVlURVhUXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCmRpZmYgLS1naXQgYS9iaW51dGlscy9hZGRyMmxpbmUuMSBiL2JpbnV0aWxzL2FkZHIybGluZS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NlMTAzLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FkZHIybGluZS4xCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggYWRkcjJsaW5lIDEgIjI3IE1hcmNoIDE5OTciICJDeWdudXMgU29sdXRpb25zIiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLWFkZHIybGluZSBcLSBjb252ZXJ0IGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycwotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgYWRkcjJsaW5lCi0uUkIgIltcfCIgIlwtYlwgIlxjCi0uSSBiZmRuYW1lXGMKLS5SQiAiIHwgIiAiXC1cLXRhcmdldD0iXGMKLS5JIGJmZG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLUMgfCBcLVwtZGVtYW5nbGUgIlx8XSIKLS5SQiAiW1x8IiAiXC1lXCAiXGMKLS5JIGZpbGVuYW1lXGMKLS5SQiAiIHwgIiAiXC1cLWV4ZT0iXGMKLS5JIGZpbGVuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1mIHwgXC1cLWZ1bmN0aW9ucyAiXHxdIgotLlJCICJbXHwiIFwtcyB8IFwtXC1iYXNlbmFtZXMgIlx8XSIKLS5SQiAiW1x8IiBcLUggfCBcLVwtaGVscCAiXHxdIgotLlJCICJbXHwiIFwtViB8IFwtXC12ZXJzaW9uICJcfF0iCi0uUkIgIltcfCIgYWRkciBhZGRyIC4uLiAgIlx8XSIKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1cYwotLkIgYWRkcjJsaW5lCi10cmFuc2xhdGVzIHByb2dyYW0gYWRkcmVzc2VzIGludG8gZmlsZSBuYW1lcyBhbmQgbGluZSBudW1iZXJzLiAgR2l2ZW4KLWFuIGFkZHJlc3MgYW5kIGFuIGV4ZWN1dGFibGUsIGl0IHVzZXMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUKLWV4ZWN1dGFibGUgdG8gZmlndXJlIG91dCB3aGljaCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZQotYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYWRkcmVzcy4KLQotVGhlIGV4ZWN1dGFibGUgdG8gdXNlIGlzIHNwZWNpZmllZCB3aXRoIHRoZQotLkIgXC1lCi1vcHRpb24uICBUaGUgZGVmYXVsdCBpcwotLkIgYS5vdXRcYwotXCYuCi0KLS5CIGFkZHIybGluZQotaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb24uCi0KLUluIHRoZSBmaXJzdCwgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGFyZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwKLWFuZAotLkIgYWRkcjJsaW5lCi1kaXNwbGF5cyB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgZWFjaCBhZGRyZXNzLgotCi1JbiB0aGUgc2Vjb25kLAotLkIgYWRkcjJsaW5lCi1yZWFkcyBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbSBzdGFuZGFyZCBpbnB1dCwgYW5kIHByaW50cyB0aGUgZmlsZQotbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2ggYWRkcmVzcyBvbiBzdGFuZGFyZCBvdXRwdXQuICBJbiB0aGlzCi1tb2RlLAotLkIgYWRkcjJsaW5lCi1tYXkgYmUgdXNlZCBpbiBhIHBpcGUgdG8gY29udmVydCBkeW5hbWljYWxseSBjaG9zZW4gYWRkcmVzc2VzLgotCi1UaGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgaXMgRklMRU5BTUU6TElORU5PLiAgVGhlIGZpbGUgbmFtZSBhbmQgbGluZQotbnVtYmVyIGZvciBlYWNoIGFkZHJlc3MgaXMgcHJpbnRlZCBvbiBhIHNlcGFyYXRlIGxpbmUuICBJZiB0aGUKLS5CIFwtZgotb3B0aW9uIGlzIHVzZWQsIHRoZW4gZWFjaCBGSUxFTkFNRTpMSU5FTk8gbGluZSBpcyBwcmVjZWRlZCBieSBhCi1GVU5DVElPTk5BTUUgbGluZSB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gY29udGFpbmluZyB0aGUKLWFkZHJlc3MuCi0KLUlmIHRoZSBmaWxlIG5hbWUgb3IgZnVuY3Rpb24gbmFtZSBjYW4gbm90IGJlIGRldGVybWluZWQsCi0uQiBhZGRyMmxpbmUKLXdpbGwgcHJpbnQgdHdvIHF1ZXN0aW9uIG1hcmtzIGluIHRoZWlyIHBsYWNlLiAgSWYgdGhlIGxpbmUgbnVtYmVyIGNhbgotbm90IGJlIGRldGVybWluZWQsCi0uQiBhZGRyMmxpbmUKLXdpbGwgcHJpbnQgMC4KLQotLlNIIE9QVElPTlMKLS5UUAotLkJJICJcLWIgIiAiYmZkbmFtZSJcYwotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyB0byBiZQotXGMKLS5JIGJmZG5hbWVcYwotXCYuCi0KLS5UUAotLkIgXC1DCi0uVFAKLS5CIFwtXC1kZW1hbmdsZQotRGVjb2RlIChcZklkZW1hbmdsZVxmUCkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4KLQotLlRQCi0uQkkgIlwtZSAiICJmaWxlbmFtZSJcYwotLlRQCi0uQkkgIlwtXC1leGU9IiAiZmlsZW5hbWUiCi1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGZvciB3aGljaCBhZGRyZXNzZXMgc2hvdWxkIGJlCi10cmFuc2xhdGVkLiAgVGhlIGRlZmF1bHQgZmlsZSBpcwotLkIgYS5vdXRcYwotXCYuCi0KLS5UUAotLkIgXC1mCi0uVFAKLS5CIFwtXC1mdW5jdGlvbnMKLURpc3BsYXkgZnVuY3Rpb24gbmFtZXMgYXMgd2VsbCBhcyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLQotLlRQCi0uQiBcLXMKLS5UUAotLkIgXC1cLWJhc2VuYW1lcwotRGlzcGxheSBvbmx5IHRoZSBiYXNlIG9mIGVhY2ggZmlsZSBuYW1lLgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKS4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FkZHIybGluZS5jIGIvYmludXRpbHMvYWRkcjJsaW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzA3YzIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYWRkcjJsaW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyogYWRkcjJsaW5lLmMgLS0gY29udmVydCBhZGRyZXNzZXMgdG8gbGluZSBudW1iZXIgYW5kIGZ1bmN0aW9uIG5hbWUKLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIExhdXRoZXIgPFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIERlcml2ZWQgZnJvbSBvYmpkdW1wLmMgYW5kIG5tLmMgYnkgVWxyaWNoLkxhdXRoZXJAemZlLnNpZW1lbnMuZGUKLQotICAgVXNhZ2U6IAotICAgYWRkcjJsaW5lIFtvcHRpb25zXSBhZGRyIGFkZHIgLi4uCi0gICBvcgotICAgYWRkcjJsaW5lIFtvcHRpb25zXSAKLQotICAgYm90aCBmb3JtcyB3cml0ZSByZXN1bHRzIHRvIHN0ZG91dCwgdGhlIHNlY29uZCBmb3JtIHJlYWRzIGFkZHJlc3NlcwotICAgdG8gYmUgY29udmVydGVkIGZyb20gc3RkaW4uICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLWV4dGVybiBjaGFyICpwcm9ncmFtX3ZlcnNpb247Ci0KLXN0YXRpYyBib29sZWFuIHdpdGhfZnVuY3Rpb25zOwkvKiAtZiwgc2hvdyBmdW5jdGlvbiBuYW1lcy4gICovCi1zdGF0aWMgYm9vbGVhbiBkb19kZW1hbmdsZTsJLyogLUMsIGRlbWFuZ2xlIG5hbWVzLiAgKi8KLXN0YXRpYyBib29sZWFuIGJhc2VfbmFtZXM7CS8qIC1zLCBzdHJpcCBkaXJlY3RvcnkgbmFtZXMuICAqLwotCi1zdGF0aWMgaW50IG5hZGRyOwkJLyogTnVtYmVyIG9mIGFkZHJlc3NlcyB0byBwcm9jZXNzLiAgKi8KLXN0YXRpYyBjaGFyICoqYWRkcjsJCS8qIEhleCBhZGRyZXNzZXMgdG8gcHJvY2Vzcy4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoqc3ltczsJCS8qIFN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJiYXNlbmFtZXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3MnfSwKLSAgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQyd9LAotICB7ImV4ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7ImZ1bmN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ0gnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsICdWJ30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzbHVycF9zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGZpbmRfYWRkcmVzc19pbl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHRyYW5zbGF0ZV9hZGRyZXNzZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotDAotLyogUHJpbnQgYSB1c2FnZSBtZXNzYWdlIHRvIFNUUkVBTSBhbmQgZXhpdCB3aXRoIFNUQVRVUy4gICovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1DZnNIVl0gWy1iIGJmZG5hbWVdIFstLXRhcmdldD1iZmRuYW1lXVxuXAotICAgICAgIFstZSBleGVjdXRhYmxlXSBbLS1leGU9ZXhlY3V0YWJsZV0gWy0tZGVtYW5nbGVdXG5cCi0gICAgICAgWy0tYmFzZW5hbWVzXSBbLS1mdW5jdGlvbnNdIFthZGRyIGFkZHIgLi4uXVxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zbHVycF9zeW10YWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzdG9yYWdlOwotICBsb25nIHN5bWNvdW50OwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEhBU19TWU1TKSA9PSAwKQotICAgIHJldHVybjsKLQotICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzdG9yYWdlKTsKLQotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1zKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLX0KLQwKLS8qIFRoZXNlIGdsb2JhbCB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBiZXR3ZWVuCi0gICB0cmFuc2xhdGVfYWRkcmVzc2VzIGFuZCBmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfdm1hIHBjOwotc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotc3RhdGljIGNvbnN0IGNoYXIgKmZ1bmN0aW9ubmFtZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGluZTsKLXN0YXRpYyBib29sZWFuIGZvdW5kOwotCi0vKiBMb29rIGZvciBhbiBhZGRyZXNzIGluIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHZpYQotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWZpbmRfYWRkcmVzc19pbl9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHZtYTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIGlmIChmb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybjsKLQotICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKHBjIDwgdm1hKQotICAgIHJldHVybjsKLQotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0aW9uKTsKLSAgaWYgKHBjID49IHZtYSArIHNpemUpCi0gICAgcmV0dXJuOwotCi0gIGZvdW5kID0gYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1zLCBwYyAtIHZtYSwKLQkJCQkgJmZpbGVuYW1lLCAmZnVuY3Rpb25uYW1lLCAmbGluZSk7Ci19Ci0KLS8qIFJlYWQgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGZyb20gc3RkaW4sIHRyYW5zbGF0ZSBpbnRvCi0gICBmaWxlX25hbWU6bGluZV9udW1iZXIgYW5kIG9wdGlvbmFsbHkgZnVuY3Rpb24gbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi10cmFuc2xhdGVfYWRkcmVzc2VzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCByZWFkX3N0ZGluID0gKG5hZGRyID09IDApOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKHJlYWRfc3RkaW4pCi0JewotCSAgY2hhciBhZGRyX2hleFsxMDBdOwotCi0JICBpZiAoZmdldHMgKGFkZHJfaGV4LCBzaXplb2YgYWRkcl9oZXgsIHN0ZGluKSA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIHBjID0gYmZkX3NjYW5fdm1hIChhZGRyX2hleCwgTlVMTCwgMTYpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobmFkZHIgPD0gMCkKLQkgICAgYnJlYWs7Ci0JICAtLW5hZGRyOwotCSAgcGMgPSBiZmRfc2Nhbl92bWEgKCphZGRyKyssIE5VTEwsIDE2KTsKLQl9Ci0KLSAgICAgIGZvdW5kID0gZmFsc2U7Ci0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGZpbmRfYWRkcmVzc19pbl9zZWN0aW9uLCAoUFRSKSBOVUxMKTsKLQotICAgICAgaWYgKCEgZm91bmQpCi0JewotCSAgaWYgKHdpdGhfZnVuY3Rpb25zKQotCSAgICBwcmludGYgKCI/P1xuIik7Ci0JICBwcmludGYgKCI/PzowXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHdpdGhfZnVuY3Rpb25zKQotCSAgICB7Ci0JICAgICAgaWYgKGZ1bmN0aW9ubmFtZSA9PSBOVUxMIHx8ICpmdW5jdGlvbm5hbWUgPT0gJ1wwJykKLQkJcHJpbnRmICgiPz9cbiIpOwotCSAgICAgIGVsc2UgaWYgKCEgZG9fZGVtYW5nbGUpCi0JCXByaW50ZiAoIiVzXG4iLCBmdW5jdGlvbm5hbWUpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKnJlczsKLQotCQkgIHJlcyA9IGNwbHVzX2RlbWFuZ2xlIChmdW5jdGlvbm5hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLQkJICBpZiAocmVzID09IE5VTEwpCi0JCSAgICBwcmludGYgKCIlc1xuIiwgZnVuY3Rpb25uYW1lKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiVzXG4iLCByZXMpOwotCQkgICAgICBmcmVlIChyZXMpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGJhc2VfbmFtZXMgJiYgZmlsZW5hbWUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNoYXIgKmg7Ci0KLQkgICAgICBoID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJZmlsZW5hbWUgPSBoICsgMTsKLQkgICAgfQotCi0JICBwcmludGYgKCIlczoldVxuIiwgZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICI/PyIsIGxpbmUpOwotCX0KLQotICAgICAgLyogZmZsdXNoKCkgaXMgZXNzZW50aWFsIGZvciB1c2luZyB0aGlzIGNvbW1hbmQgYXMgYSBzZXJ2ZXIKLSAgICAgICAgIGNoaWxkIHByb2Nlc3MgdGhhdCByZWFkcyBhZGRyZXNzZXMgZnJvbSBhIHBpcGUgYW5kIHJlc3BvbmRzCi0gICAgICAgICB3aXRoIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLCBwcm9jZXNzaW5nIG9uZSBhZGRyZXNzIGF0IGEKLSAgICAgICAgIHRpbWUuICAqLwotICAgICAgZmZsdXNoIChzdGRvdXQpOwotICAgIH0KLX0KLQotLyogUHJvY2VzcyBhIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19maWxlIChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKmFiZmQ7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBhYmZkID0gYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGZpbGVuYW1lKTsKLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX2FyY2hpdmUpKQotICAgIGZhdGFsIChfKCIlczogY2FuIG5vdCBnZXQgYWRkcmVzc2VzIGZyb20gYXJjaGl2ZSIpLCBmaWxlbmFtZSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIHNsdXJwX3N5bXRhYiAoYWJmZCk7Ci0KLSAgdHJhbnNsYXRlX2FkZHJlc3NlcyAoYWJmZCk7Ci0KLSAgaWYgKHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChzeW1zKTsKLSAgICAgIHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBiZmRfY2xvc2UgKGFiZmQpOwotfQotDAotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICp0YXJnZXQ7Ci0gIGludCBjOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICBmaWxlbmFtZSA9IE5VTEw7Ci0gIHRhcmdldCA9IE5VTEw7Ci0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYjpDZTpzZkhWIiwgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIDA6Ci0JICBicmVhazsJCS8qIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBsb25nIG9wdGlvbiAqLwotCWNhc2UgJ2InOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICBkb19kZW1hbmdsZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGZpbGVuYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBiYXNlX25hbWVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgd2l0aF9mdW5jdGlvbnMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBwcmludF92ZXJzaW9uICgiYWRkcjJsaW5lIik7Ci0JICBicmVhazsKLQljYXNlICdIJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9ICJhLm91dCI7Ci0KLSAgYWRkciA9IGFyZ3YgKyBvcHRpbmQ7Ci0gIG5hZGRyID0gYXJnYyAtIG9wdGluZDsKLQotICBwcm9jZXNzX2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXIuMSBiL2JpbnV0aWxzL2FyLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzFhNDAuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXIuMQorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggYXIgMSAiMTk5OSIgIkN5Z251cyBTb2x1dGlvbnMiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotYXIgXC0gY3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLkJSIGFyICIgW1x8IiAiLSIgIlx8XSJcYwotLkkge2RtcHFydHh9W2FiY2ZpbE5vUHNTdXZWXSBcYwotW1x8XGMKLS5JIG1lbWJlcm5hbWVcYwotXCZcfF0gXGMKLVtcfFxjCi0uSSBjb3VudFxjCi1cJlx8XSBcYwotLkkgYXJjaGl2ZVxjCi1cJiBcYwotLkkgZmlsZXNcYwotXCYuXHwuXHwuCi0KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIFxjCi0uQiBhclxjCi1cJiBwcm9ncmFtIGNyZWF0ZXMsIG1vZGlmaWVzLCBhbmQgZXh0cmFjdHMgZnJvbQotYXJjaGl2ZXMuICBBbiBcYwotLkkgYXJjaGl2ZVxjCi1cJiBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIFxjCi0uSSBtZW1iZXJzXGMKLVwmIG9mIHRoZSBhcmNoaXZlKS4KLQotVGhlIG9yaWdpbmFsIGZpbGVzJyBjb250ZW50cywgbW9kZSAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBhbmQKLWdyb3VwIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIGFyY2hpdmUsIGFuZCBtYXkgYmUgcmVjb25zdGl0dXRlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1HTlUgXGMKLS5CIGFyXGMKLVwmIGNhbiBtYWludGFpbiBhcmNoaXZlcyB3aG9zZSBtZW1iZXJzIGhhdmUgbmFtZXMgb2YgYW55Ci1sZW5ndGg7IGhvd2V2ZXIsIGRlcGVuZGluZyBvbiBob3cgXGMKLS5CIGFyXGMKLVwmIGlzIGNvbmZpZ3VyZWQgb24geW91cgotc3lzdGVtLCBhIGxpbWl0IG9uIG1lbWJlci1uYW1lIGxlbmd0aCBtYXkgYmUgaW1wb3NlZCAoZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggYXJjaGl2ZSBmb3JtYXRzIG1haW50YWluZWQgd2l0aCBvdGhlciB0b29scykuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotXGMKLS5CIGFyXGMKLVwmIGlzIGNvbnNpZGVyZWQgYSBiaW5hcnkgdXRpbGl0eSBiZWNhdXNlIGFyY2hpdmVzIG9mIHRoaXMgc29ydAotYXJlIG1vc3Qgb2Z0ZW4gdXNlZCBhcyBcYwotLkkgbGlicmFyaWVzXGMKLVwmIGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotXGMKLS5CIGFyXGMKLVwmIHdpbGwgY3JlYXRlIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIGBcfFxjCi0uQiBzXGMKLVx8Jy4KLU9uY2UgY3JlYXRlZCwgdGhpcyBpbmRleCBpcyB1cGRhdGVkIGluIHRoZSBhcmNoaXZlIHdoZW5ldmVyIFxjCi0uQiBhclxjCi1cJgotbWFrZXMgYSBjaGFuZ2UgdG8gaXRzIGNvbnRlbnRzIChzYXZlIGZvciB0aGUgYFx8XGMKLS5CIHFcYwotXHwnIHVwZGF0ZSBvcGVyYXRpb24pLgotQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotCi1Zb3UgbWF5IHVzZSBgXHxcYwotLkIgbm0gXC1zXGMKLVx8JyBvciBgXHxcYwotLkIgbm0gXC1cLXByaW50XC1hcm1hcFxjCi1cfCcgdG8gbGlzdCB0aGlzIGluZGV4Ci10YWJsZS4gIElmIGFuIGFyY2hpdmUgbGFja3MgdGhlIHRhYmxlLCBhbm90aGVyIGZvcm0gb2YgXGMKLS5CIGFyXGMKLVwmIGNhbGxlZAotXGMKLS5CIHJhbmxpYlxjCi1cJiBjYW4gYmUgdXNlZCB0byBhZGQganVzdCB0aGUgdGFibGUuCi0KLVxjCi0uQiBhclxjCi1cJiBpbnNpc3RzIG9uIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgdG8gZXhlY3V0ZTogb25lCi1rZXlsZXR0ZXIgc3BlY2lmeWluZyB0aGUgXGMKLS5JIG9wZXJhdGlvblxjCi1cJiAob3B0aW9uYWxseSBhY2NvbXBhbmllZCBieSBvdGhlcgota2V5bGV0dGVycyBzcGVjaWZ5aW5nIFxjCi0uSSBtb2RpZmllcnNcYwotXCYpLCBhbmQgdGhlIGFyY2hpdmUgbmFtZSB0byBhY3Qgb24uCi0KLU1vc3Qgb3BlcmF0aW9ucyBjYW4gYWxzbyBhY2NlcHQgZnVydGhlciBcYwotLkkgZmlsZXNcYwotXCYgYXJndW1lbnRzLAotc3BlY2lmeWluZyBwYXJ0aWN1bGFyIGZpbGVzIHRvIG9wZXJhdGUgb24uCi0KLS5TSCBPUFRJT05TCi1HTlUgXGMKLS5CIGFyXGMKLVwmIGFsbG93cyB5b3UgdG8gbWl4IHRoZSBvcGVyYXRpb24gY29kZSBcYwotLkkgcFxjCi1cJiBhbmQgbW9kaWZpZXIKLWZsYWdzIFxjCi0uSSBtb2RcYwotXCYgaW4gYW55IG9yZGVyLCB3aXRoaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4KLQotSWYgeW91IHdpc2gsIHlvdSBtYXkgYmVnaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCB3aXRoIGEKLWRhc2guCi0KLVRoZSBcYwotLkkgcFxjCi1cJiBrZXlsZXR0ZXIgc3BlY2lmaWVzIHdoYXQgb3BlcmF0aW9uIHRvIGV4ZWN1dGU7IGl0IG1heSBiZQotYW55IG9mIHRoZSBmb2xsb3dpbmcsIGJ1dCB5b3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZW06Ci0KLS5UUAotLkIgZAotXGMKLS5JIERlbGV0ZVxjCi1cJiBtb2R1bGVzIGZyb20gdGhlIGFyY2hpdmUuICBTcGVjaWZ5IHRoZSBuYW1lcyBvZiBtb2R1bGVzIHRvCi1iZSBkZWxldGVkIGFzIFxjCi0uSSBmaWxlc1xjCi1cJjsgdGhlIGFyY2hpdmUgaXMgdW50b3VjaGVkIGlmIHlvdQotc3BlY2lmeSBubyBmaWxlcyB0byBkZWxldGUuCi0KLUlmIHlvdSBzcGVjaWZ5IHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIsIFxjCi0uQiBhclxjCi1cJiB3aWxsIGxpc3QgZWFjaCBtb2R1bGUKLWFzIGl0IGlzIGRlbGV0ZWQuCi0KLS5UUAotLkIgbQotVXNlIHRoaXMgb3BlcmF0aW9uIHRvIFxjCi0uSSBtb3ZlXGMKLVwmIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZS4KLQotVGhlIG9yZGVyaW5nIG9mIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZSBjYW4gbWFrZSBhIGRpZmZlcmVuY2UgaW4gaG93Ci1wcm9ncmFtcyBhcmUgbGlua2VkIHVzaW5nIHRoZSBsaWJyYXJ5LCBpZiBhIHN5bWJvbCBpcyBkZWZpbmVkIGluIG1vcmUKLXRoYW4gb25lIG1lbWJlci4gIAotCi1JZiBubyBtb2RpZmllcnMgYXJlIHVzZWQgd2l0aCBcYwotLkIgbVxjCi1cJiwgYW55IG1lbWJlcnMgeW91IG5hbWUgaW4gdGhlCi1cYwotLkkgZmlsZXNcYwotXCYgYXJndW1lbnRzIGFyZSBtb3ZlZCB0byB0aGUgXGMKLS5JIGVuZFxjCi1cJiBvZiB0aGUgYXJjaGl2ZTsKLXlvdSBjYW4gdXNlIHRoZSBgXHxcYwotLkIgYVxjCi1cfCcsIGBcfFxjCi0uQiBiXGMKLVx8Jywgb3IgYFx8XGMKLS5CIGlcYwotXHwnIG1vZGlmaWVycyB0byBtb3ZlIHRoZW0gdG8gYQotc3BlY2lmaWVkIHBsYWNlIGluc3RlYWQuCi0KLS5UUAotLkIgcAotXGMKLS5JIFByaW50XGMKLVwmIHRoZSBzcGVjaWZpZWQgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSwgdG8gdGhlIHN0YW5kYXJkCi1vdXRwdXQgZmlsZS4gIElmIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIgaXMgc3BlY2lmaWVkLCBzaG93IHRoZSBtZW1iZXIKLW5hbWUgYmVmb3JlIGNvcHlpbmcgaXRzIGNvbnRlbnRzIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotSWYgeW91IHNwZWNpZnkgbm8gXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIGFyZSBwcmludGVkLgotCi0uVFAKLS5CIHEKLVxjCi0uSSBRdWljayBhcHBlbmRcYwotXCY7IGFkZCBcYwotLkkgZmlsZXNcYwotXCYgdG8gdGhlIGVuZCBvZiBcYwotLkkgYXJjaGl2ZVxjCi1cJiwKLXdpdGhvdXQgY2hlY2tpbmcgZm9yIHJlcGxhY2VtZW50LiAgCi0KLVRoZSBtb2RpZmllcnMgYFx8XGMKLS5CIGFcYwotXHwnLCBgXHxcYwotLkIgYlxjCi1cfCcsIGFuZCBgXHxcYwotLkIgaVxjCi1cfCcgZG8gXGMKLS5JIG5vdFxjCi1cJiBhZmZlY3QgdGhpcwotb3BlcmF0aW9uOyBuZXcgbWVtYmVycyBhcmUgYWx3YXlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLgotCi1UaGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIG1ha2VzIFxjCi0uQiBhclxjCi1cJiBsaXN0IGVhY2ggZmlsZSBhcyBpdCBpcyBhcHBlbmRlZC4KLQotU2luY2UgdGhlIHBvaW50IG9mIHRoaXMgb3BlcmF0aW9uIGlzIHNwZWVkLCB0aGUgYXJjaGl2ZSdzIHN5bWJvbCB0YWJsZQotaW5kZXggaXMgbm90IHVwZGF0ZWQsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdGVkOyB5b3UgY2FuIHVzZSBgXHxcYwotLkIgYXIgc1xjCi1cfCcgb3IKLVxjCi0uQiByYW5saWJcYwotXCYgZXhwbGljaXRseSB0byB1cGRhdGUgdGhlIHN5bWJvbCB0YWJsZSBpbmRleC4KLQotSG93ZXZlciwgdG9vIG1hbnkgZGlmZmVyZW50IHN5c3RlbXMgYXNzdW1lIHF1aWNrIGFwcGVuZCByZWJ1aWxkcyB0aGUKLWluZGV4LCBzbyBHTlUKLS5CIGFyCi1pbXBsZW1lbnRzIGBcfFxjCi0uQiBxXGMKLVx8JyBhcyBhIHN5bm9ueW0gZm9yIGBcfFxjCi0uQiByXGMKLVx8Jy4KLQotLlRQCi0uQiByCi1JbnNlcnQgXGMKLS5JIGZpbGVzXGMKLVwmIGludG8gXGMKLS5JIGFyY2hpdmVcYwotXCYgKHdpdGggXGMKLS5JIHJlcGxhY2VtZW50XGMKLVwmKS4gVGhpcwotb3BlcmF0aW9uIGRpZmZlcnMgZnJvbSBgXHxcYwotLkIgcVxjCi1cfCcgaW4gdGhhdCBhbnkgcHJldmlvdXNseSBleGlzdGluZyBtZW1iZXJzCi1hcmUgZGVsZXRlZCBpZiB0aGVpciBuYW1lcyBtYXRjaCB0aG9zZSBiZWluZyBhZGRlZC4KLQotSWYgb25lIG9mIHRoZSBmaWxlcyBuYW1lZCBpbiBcYwotLkkgZmlsZXNcYwotXCYgZG9lc24ndCBleGlzdCwgXGMKLS5CIGFyXGMKLVwmCi1kaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlLCBhbmQgbGVhdmVzIHVuZGlzdHVyYmVkIGFueSBleGlzdGluZyBtZW1iZXJzCi1vZiB0aGUgYXJjaGl2ZSBtYXRjaGluZyB0aGF0IG5hbWUuCi0KLUJ5IGRlZmF1bHQsIG5ldyBtZW1iZXJzIGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBidXQgeW91IG1heQotdXNlIG9uZSBvZiB0aGUgbW9kaWZpZXJzIGBcfFxjCi0uQiBhXGMKLVx8JywgYFx8XGMKLS5CIGJcYwotXHwnLCBvciBgXHxcYwotLkIgaVxjCi1cfCcgdG8gcmVxdWVzdAotcGxhY2VtZW50IHJlbGF0aXZlIHRvIHNvbWUgZXhpc3RpbmcgbWVtYmVyLgotCi1UaGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIHVzZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBlbGljaXRzIGEgbGluZSBvZgotb3V0cHV0IGZvciBlYWNoIGZpbGUgaW5zZXJ0ZWQsIGFsb25nIHdpdGggb25lIG9mIHRoZSBsZXR0ZXJzIGBcfFxjCi0uQiBhXGMKLVx8JyBvcgotYFx8XGMKLS5CIHJcYwotXHwnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFwcGVuZGVkIChubyBvbGQgbWVtYmVyCi1kZWxldGVkKSBvciByZXBsYWNlZC4KLQotLlRQCi0uQiB0Ci1EaXNwbGF5IGEgXGMKLS5JIHRhYmxlXGMKLVwmIGxpc3RpbmcgdGhlIGNvbnRlbnRzIG9mIFxjCi0uSSBhcmNoaXZlXGMKLVwmLCBvciB0aG9zZQotb2YgdGhlIGZpbGVzIGxpc3RlZCBpbiBcYwotLkkgZmlsZXNcYwotXCYgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUKLWFyY2hpdmUuICBOb3JtYWxseSBvbmx5IHRoZSBtZW1iZXIgbmFtZSBpcyBzaG93bjsgaWYgeW91IGFsc28gd2FudCB0bwotc2VlIHRoZSBtb2RlcyAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBncm91cCwgYW5kIHNpemUsIHlvdSBjYW4KLXJlcXVlc3QgdGhhdCBieSBhbHNvIHNwZWNpZnlpbmcgdGhlIGBcfFxjCi0uQiB2XGMKLVx8JyBtb2RpZmllci4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBcYwotLkkgZmlsZXNcYwotXCYsIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotYXJlIGxpc3RlZC4KLQotSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAoc2F5LCBgXHxcYwotLkIgZmllXGMKLVx8JykgaW4KLWFuIGFyY2hpdmUgKHNheSBgXHxcYwotLkIgYi5hXGMKLVx8JyksIGBcfFxjCi0uQiBhciB0IGIuYSBmaWVcYwotXHwnIHdpbGwgbGlzdCBvbmx5IHRoZQotZmlyc3QgaW5zdGFuY2U7IHRvIHNlZSB0aGVtIGFsbCwgeW91IG11c3QgYXNrIGZvciBhIGNvbXBsZXRlCi1saXN0aW5nXChlbVwmaW4gb3VyIGV4YW1wbGUsIGBcfFxjCi0uQiBhciB0IGIuYVxjCi1cfCcuCi0KLS5UUAotLkIgeAotXGMKLS5JIEV4dHJhY3RcYwotXCYgbWVtYmVycyAobmFtZWQgXGMKLS5JIGZpbGVzXGMKLVwmKSBmcm9tIHRoZSBhcmNoaXZlLiAgWW91IGNhbgotdXNlIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIgd2l0aCB0aGlzIG9wZXJhdGlvbiwgdG8gcmVxdWVzdCB0aGF0Ci1cYwotLkIgYXJcYwotXCYgbGlzdCBlYWNoIG5hbWUgYXMgaXQgZXh0cmFjdHMgaXQuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbnkgXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBleHRyYWN0ZWQuCi0KLS5QUAotCi1BIG51bWJlciBvZiBtb2RpZmllcnMgKFxjCi0uSSBtb2RcYwotXCYpIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIFxjCi0uSSBwXGMKLVwmCi1rZXlsZXR0ZXIsIHRvIHNwZWNpZnkgdmFyaWF0aW9ucyBvbiBhbiBvcGVyYXRpb24ncyBiZWhhdmlvcjoKLQotLlRQCi0uQiBhCi1BZGQgbmV3IGZpbGVzIFxjCi0uSSBhZnRlclxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGFcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLgotCi0uVFAKLS5CIGIKLUFkZCBuZXcgZmlsZXMgXGMKLS5JIGJlZm9yZVxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGJcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgYFx8XGMKLS5CIGlcYwotXHwnKS4KLQotLlRQCi0uQiBjCi1cYwotLkkgQ3JlYXRlXGMKLVwmIHRoZSBhcmNoaXZlLiAgVGhlIHNwZWNpZmllZCBcYwotLkkgYXJjaGl2ZVxjCi1cJiBpcyBhbHdheXMKLWNyZWF0ZWQgaWYgaXQgZGlkbid0IGV4aXN0LCB3aGVuIHlvdSByZXF1ZXN0IGFuIHVwZGF0ZS4gIEJ1dCBhIHdhcm5pbmcgaXMKLWlzc3VlZCB1bmxlc3MgeW91IHNwZWNpZnkgaW4gYWR2YW5jZSB0aGF0IHlvdSBleHBlY3QgdG8gY3JlYXRlIGl0LCBieQotdXNpbmcgdGhpcyBtb2RpZmllci4KLQotLlRQCi0uQiBmCi1UcnVuY2F0ZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4gIAotLkIgYXIKLXdpbGwgbm9ybWFsbHkgcGVybWl0IGZpbGUgbmFtZXMgb2YgYW55IGxlbmd0aC4gIFRoaXMgd2lsbCBjYXVzZSBpdCB0bwotY3JlYXRlIGFyY2hpdmVzIHdoaWNoIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgCi0uQiBhcgotcHJvZ3JhbSBvbiBzb21lIHN5c3RlbXMuICBJZiB0aGlzIGlzIGEgY29uY2VybiwgdGhlIAotLkIgZgotbW9kaWZpZXIgbWF5IGJlIHVzZWQgdG8gdHJ1bmNhdGUgZmlsZSBuYW1lcyB3aGVuIHB1dHRpbmcgdGhlbSBpbiB0aGUKLWFyY2hpdmUuCi0KLS5UUAotLkIgaQotSW5zZXJ0IG5ldyBmaWxlcyBcYwotLkkgYmVmb3JlXGMKLVwmIGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBcYwotLkIgaVxjCi1cJiwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgXGMKLS5JIG1lbWJlcm5hbWVcYwotXCYgYXJndW1lbnQsIGJlZm9yZSB0aGUKLVxjCi0uSSBhcmNoaXZlXGMKLVwmIHNwZWNpZmljYXRpb24uICAoc2FtZSBhcyBgXHxcYwotLkIgYlxjCi1cfCcpLgotCi0uVFAKLS5CIGwKLVRoaXMgbW9kaWZpZXIgaXMgYWNjZXB0ZWQgYnV0IG5vdCB1c2VkLgotCi0uVFAKLS5CIE4KLVVzZXMgdGhlCi0uSSBjb3VudAotcGFyYW1ldGVyLiAgVGhpcyBpcyB1c2VkIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIGluIHRoZSBhcmNoaXZlCi13aXRoIHRoZSBzYW1lIG5hbWUuICBFeHRyYWN0IG9yIGRlbGV0ZSBpbnN0YW5jZQotLkkgY291bnQKLW9mIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgbwotUHJlc2VydmUgdGhlIFxjCi0uSSBvcmlnaW5hbFxjCi1cJiBkYXRlcyBvZiBtZW1iZXJzIHdoZW4gZXh0cmFjdGluZyB0aGVtLiAgSWYKLXlvdSBkbyBub3Qgc3BlY2lmeSB0aGlzIG1vZGlmaWVyLCBmaWxlcyBleHRyYWN0ZWQgZnJvbSB0aGUgYXJjaGl2ZQotd2lsbCBiZSBzdGFtcGVkIHdpdGggdGhlIHRpbWUgb2YgZXh0cmFjdGlvbi4KLQotLlRQCi0uQiBQCi1Vc2UgdGhlIGZ1bGwgcGF0aCBuYW1lIHdoZW4gbWF0Y2hpbmcgbmFtZXMgaW4gdGhlIGFyY2hpdmUuCi0uQiBhcgotY2FuIG5vdCBjcmVhdGUgYW4gYXJjaGl2ZSB3aXRoIGEgZnVsbCBwYXRoIG5hbWUgKHN1Y2ggYXJjaGl2ZXMgYXJlIG5vdAotUE9TSVggY29tcGxhaW50KSwgYnV0IG90aGVyIGFyY2hpdmUgY3JlYXRvcnMgY2FuLiAgVGhpcyBvcHRpb24gd2lsbAotY2F1c2UKLS5CIGFyCi10byBtYXRjaCBmaWxlIG5hbWVzIHVzaW5nIGEgY29tcGxldGUgcGF0aCBuYW1lLCB3aGljaCBjYW4gYmUKLWNvbnZlbmllbnQgd2hlbiBleHRyYWN0aW5nIGEgc2luZ2xlIGZpbGUgZnJvbSBhbiBhcmNoaXZlIGNyZWF0ZWQgYnkKLWFub3RoZXIgdG9vbC4KLQotLlRQCi0uQiBzCi1Xcml0ZSBhbiBvYmplY3QtZmlsZSBpbmRleCBpbnRvIHRoZSBhcmNoaXZlLCBvciB1cGRhdGUgYW4gZXhpc3Rpbmcgb25lLAotZXZlbiBpZiBubyBvdGhlciBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgYXJjaGl2ZS4gIFlvdSBtYXkgdXNlIHRoaXMgbW9kaWZpZXIKLWZsYWcgZWl0aGVyIHdpdGggYW55IG9wZXJhdGlvbiwgb3IgYWxvbmUuICBSdW5uaW5nIGBcfFxjCi0uQiBhciBzXGMKLVx8JyBvbiBhbgotYXJjaGl2ZSBpcyBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgYFx8XGMKLS5CIHJhbmxpYlxjCi1cfCcgb24gaXQuCi0KLS5UUAotLkIgUwotRG8gbm90IGdlbmVyYXRlIGFuIGFyY2hpdmUgc3ltYm9sIHRhYmxlLiAgVGhpcyBjYW4gc3BlZWQgdXAgYnVpbGRpbmcgYQotbGFyZ2UgbGlicmFyeSBpbiBzZXZlcmFsIHN0ZXBzLiAgVGhlIHJlc3VsdGluZyBhcmNoaXZlIGNhbiBub3QgYmUgdXNlZAotd2l0aCB0aGUgbGlua2VyLiAgSW4gb3JkZXIgdG8gYnVpbGQgYSBzeW1ib2wgdGFibGUsIHlvdSBtdXN0IG9taXQgdGhlCi1gXHxcYwotLkIgU1xjCi1cfCcgbW9kaWZpZXIgb24gdGhlIGxhc3QgZXhlY3V0aW9uIG9mIGBcfFxjCi0uQiBhclxjCi1cfCcsIG9yIHlvdSBtdXN0IHJ1biBgXHxcYwotLkIgcmFubGliXGMKLVx8JyBvbiB0aGUgYXJjaGl2ZS4KLQotLlRQCi0uQiB1Ci1Ob3JtYWxseSwgXGMKLS5CIGFyIHJcYwotXCYuXHwuXHwuIGluc2VydHMgYWxsIGZpbGVzCi1saXN0ZWQgaW50byB0aGUgYXJjaGl2ZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluc2VydCBcYwotLkkgb25seVxjCi1cJiB0aG9zZQotb2YgdGhlIGZpbGVzIHlvdSBsaXN0IHRoYXQgYXJlIG5ld2VyIHRoYW4gZXhpc3RpbmcgbWVtYmVycyBvZiB0aGUgc2FtZQotbmFtZXMsIHVzZSB0aGlzIG1vZGlmaWVyLiAgVGhlIGBcfFxjCi0uQiB1XGMKLVx8JyBtb2RpZmllciBpcyBhbGxvd2VkIG9ubHkgZm9yIHRoZQotb3BlcmF0aW9uIGBcfFxjCi0uQiByXGMKLVx8JyAocmVwbGFjZSkuICBJbiBwYXJ0aWN1bGFyLCB0aGUgY29tYmluYXRpb24gYFx8XGMKLS5CIHF1XGMKLVx8JyBpcwotbm90IGFsbG93ZWQsIHNpbmNlIGNoZWNraW5nIHRoZSB0aW1lc3RhbXBzIHdvdWxkIGxvc2UgYW55IHNwZWVkCi1hZHZhbnRhZ2UgZnJvbSB0aGUgb3BlcmF0aW9uIGBcfFxjCi0uQiBxXGMKLVx8Jy4KLQotLlRQCi0uQiB2Ci1UaGlzIG1vZGlmaWVyIHJlcXVlc3RzIHRoZSBcYwotLkkgdmVyYm9zZVxjCi1cJiB2ZXJzaW9uIG9mIGFuIG9wZXJhdGlvbi4gIE1hbnkKLW9wZXJhdGlvbnMgZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZpbGVuYW1lcyBwcm9jZXNzZWQsCi13aGVuIHRoZSBtb2RpZmllciBgXHxcYwotLkIgdlxjCi1cfCcgaXMgYXBwZW5kZWQuCi0KLS5UUAotLkIgVgotVGhpcyBtb2RpZmllciBzaG93cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YKLS5CUiBhciAuCi0KLS5QUAotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCi0uQlIgbm0gKCAxIClcYwotXCYsCi0uQlIgcmFubGliICggMSApXGMKLVwmLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9hci5jIGIvYmludXRpbHMvYXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5ZTU5ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxMSArMCwwIEBACi0vKiBhci5jIC0gQXJjaGl2ZSBtb2RpZnkgYW5kIGV4dHJhY3QuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0vKgotICAgQnVnczogc2hvdWxkIHVzZSBnZXRvcHQgdGhlIHdheSB0YXIgZG9lcyAoY29tcGxldGUgdy9vcHRpb25hbCAtKSBhbmQKLSAgIHNob3VsZCBoYXZlIGxvbmcgb3B0aW9ucyB0b28uIEdOVSBhciB1c2VkIHRvIGNoZWNrIGZpbGUgYWdhaW5zdCBmaWxlc3lzdGVtCi0gICBpbiBxdWlja191cGRhdGUgYW5kIHJlcGxhY2Ugb3BlcmF0aW9ucyAod291bGQgY2hlY2sgbXRpbWUpLiBEb2Vzbid0IHdhcm4KLSAgIHdoZW4gbmFtZSB0cnVuY2F0ZWQuIE5vIHdheSB0byBzcGVjaWZ5IHBvc19lbmQuIEVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZQotICAgbW9yZSBjb25zaXN0YW50LgotKi8KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJwcm9ncmVzcy5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhcnN1cC5oIgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBfX0dPMzJfX18KLSNkZWZpbmUgRVhUX05BTUVfTEVOIDMJCS8qIGJ1ZmZsZW4gb2YgYWRkaXRpb24gdG8gbmFtZSBpZiBpdCdzIE1TLURPUyAqLwotI2Vsc2UKLSNkZWZpbmUgRVhUX05BTUVfTEVOIDYJCS8qIGRpdHRvIGZvciAqTklYICovCi0jZW5kaWYKLQotLyogV2UgbmVlZCB0byBvcGVuIGZpbGVzIGluIGJpbmFyeSBtb2RlcyBvbiBzeXN0ZW0gd2hlcmUgdGhhdCBtYWtlcyBhCi0gICBkaWZmZXJlbmNlLiAgKi8KLSNpZm5kZWYgT19CSU5BUlkKLSNkZWZpbmUgT19CSU5BUlkgMAotI2VuZGlmCi0KLSNkZWZpbmUgQlVGU0laRSA4MTkyCi0KLS8qIEtsdWRnZSBkZWNsYXJhdGlvbiBmcm9tIEJGRCEgIFRoaXMgaXMgdWdseSEgIEZJWE1FISAgWFhYICovCi0KLXN0cnVjdCBhcl9oZHIgKgotICBiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSBQQVJBTVMgKChiZmQgKiBhYmZkLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0vKiBTdGF0aWMgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfZW11bCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLW1hcF9vdmVyX21lbWJlcnMgUEFSQU1TICgoYmZkICosIHZvaWQgKCopKGJmZCAqKSwgY2hhciAqKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9jb250ZW50cyBQQVJBTVMgKChiZmQgKiBtZW1iZXIpKTsKLQotc3RhdGljIHZvaWQKLWRlbGV0ZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fZGVsZXRlKSk7Ci0KLSNpZiAwCi1zdGF0aWMgdm9pZAotZG9fcXVpY2tfYXBwZW5kIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWUsCi0JCQkgY2hhciAqKmZpbGVzX3RvX2FwcGVuZCkpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1tb3ZlX21lbWJlcnMgUEFSQU1TICgoYmZkICosIGNoYXIgKipmaWxlc190b19tb3ZlKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZXBsYWNlX21lbWJlcnMgUEFSQU1TICgoYmZkICosIGNoYXIgKipmaWxlc190b19yZXBsYWNlLCBib29sZWFuIHF1aWNrKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9kZXNjciBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9hcmNoaXZlIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yYW5saWJfb25seSBQQVJBTVMgKChjb25zdCBjaGFyICphcmNobmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcmFubGliX3RvdWNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2huYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSBQQVJBTVMgKChpbnQpKTsKLQwKLS8qKiBHbG9iYWxzIGFuZCBmbGFncyAqLwotCi1pbnQgbXJpX21vZGU7Ci0KLS8qIFRoaXMgZmxhZyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYXIgYW5kIHJhbmxpYjoKLSAgIDEgbWVhbnMgdGhpcyBpcyAncmFubGliJzsgMCBtZWFucyB0aGlzIGlzICdhcicuCi0gICAtMSBtZWFucyBpZiB3ZSBzaG91bGQgdXNlIGFyZ3ZbMF0gdG8gZGVjaWRlLiAgKi8KLWV4dGVybiBpbnQgaXNfcmFubGliOwotCi0vKiBOb256ZXJvIG1lYW5zIGRvbid0IHdhcm4gYWJvdXQgY3JlYXRpbmcgdGhlIGFyY2hpdmUgZmlsZSBpZiBuZWNlc3NhcnkuICAqLwotaW50IHNpbGVudF9jcmVhdGUgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIGRlc2NyaWJlIGVhY2ggYWN0aW9uIHBlcmZvcm1lZC4gICovCi1pbnQgdmVyYm9zZSA9IDA7Ci0KLS8qIE5vbnplcm8gbWVhbnMgcHJlc2VydmUgZGF0ZXMgb2YgbWVtYmVycyB3aGVuIGV4dHJhY3RpbmcgdGhlbS4gICovCi1pbnQgcHJlc2VydmVfZGF0ZXMgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIGRvbid0IHJlcGxhY2UgZXhpc3RpbmcgbWVtYmVycyB3aG9zZSBkYXRlcyBhcmUgbW9yZSByZWNlbnQKLSAgIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMuICAqLwotaW50IG5ld2VyX29ubHkgPSAwOwotCi0vKiBDb250cm9scyB0aGUgd3JpdGluZyBvZiBhbiBhcmNoaXZlIHN5bWJvbCB0YWJsZSAoaW4gQlNEOiBhIF9fLlNZTURFRgotICAgbWVtYmVyKS4gIC0xIG1lYW5zIHdlJ3ZlIGJlZW4gZXhwbGljaXRseSBhc2tlZCB0byBub3Qgd3JpdGUgYSBzeW1ib2wgdGFibGU7Ci0gICArMSBtZWFucyB3ZSd2ZSBiZWVuIGV4cGxpY3RseSBhc2tlZCB0byB3cml0ZSBpdDsKLSAgIDAgaXMgdGhlIGRlZmF1bHQuCi0gICBUcmFkaXRpb25hbGx5LCB0aGUgZGVmYXVsdCBpbiBCU0QgaGFzIGJlZW4gdG8gbm90IHdyaXRlIHRoZSB0YWJsZS4KLSAgIEhvd2V2ZXIsIGZvciBQT1NJWC4yIGNvbXBsaWFuY2UgdGhlIGRlZmF1bHQgaXMgbm93IHRvIHdyaXRlIGEgc3ltYm9sIHRhYmxlCi0gICBpZiBhbnkgb2YgdGhlIG1lbWJlcnMgYXJlIG9iamVjdCBmaWxlcy4gICovCi1pbnQgd3JpdGVfYXJtYXAgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIGl0J3MgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbWVtYmVyOyBwb3NpdGlvbiBuZXcgb3IgbW92ZWQKLSAgIGZpbGVzIHdpdGggcmVzcGVjdCB0byB0aGlzIG9uZS4gICovCi1jaGFyICpwb3NuYW1lID0gTlVMTDsKLQotLyogU2V6IGhvdyB0byB1c2UgYHBvc25hbWUnOiBwb3NfYmVmb3JlIG1lYW5zIHBvc2l0aW9uIGJlZm9yZSB0aGF0IG1lbWJlci4KLSAgIHBvc19hZnRlciBtZWFucyBwb3NpdGlvbiBhZnRlciB0aGF0IG1lbWJlci4gcG9zX2VuZCBtZWFucyBhbHdheXMgYXQgZW5kLgotICAgcG9zX2RlZmF1bHQgbWVhbnMgZGVmYXVsdCBhcHByb3ByaWF0ZWx5LiBGb3IgdGhlIGxhdHRlciB0d28sIGBwb3NuYW1lJwotICAgc2hvdWxkIGFsc28gYmUgemVyby4gICovCi1lbnVtIHBvcwotICB7Ci0gICAgcG9zX2RlZmF1bHQsIHBvc19iZWZvcmUsIHBvc19hZnRlciwgcG9zX2VuZAotICB9IHBvc3R5cGUgPSBwb3NfZGVmYXVsdDsKLQotc3RhdGljIGJmZCAqKgotZ2V0X3Bvc19iZmQgUEFSQU1TICgoYmZkICoqLCBlbnVtIHBvcywgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEZvciBleHRyYWN0L2RlbGV0ZSBvbmx5LiAgSWYgQ09VTlRFRF9OQU1FX01PREUgaXMgdHJ1ZSwgd2Ugb25seQotICAgZXh0cmFjdCB0aGUgQ09VTlRFRF9OQU1FX0NPVU5URVIgaW5zdGFuY2Ugb2YgdGhhdCBuYW1lLiAgKi8KLXN0YXRpYyBib29sZWFuIGNvdW50ZWRfbmFtZV9tb2RlID0gMDsKLXN0YXRpYyBpbnQgY291bnRlZF9uYW1lX2NvdW50ZXIgPSAwOwotCi0vKiBXaGV0aGVyIHRvIHRydW5jYXRlIG5hbWVzIG9mIGZpbGVzIHN0b3JlZCBpbiB0aGUgYXJjaGl2ZS4gICovCi1zdGF0aWMgYm9vbGVhbiBhcl90cnVuY2F0ZSA9IGZhbHNlOwotCi0vKiBXaGV0aGVyIHRvIHVzZSBhIGZ1bGwgZmlsZSBuYW1lIG1hdGNoIHdoZW4gc2VhcmNoaW5nIGFuIGFyY2hpdmUuCi0gICBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIGFyY2hpdmVzIGNyZWF0ZWQgYnkgdGhlIE1pY3Jvc29mdCBsaWIKLSAgIHByb2dyYW0uICAqLwotc3RhdGljIGJvb2xlYW4gZnVsbF9wYXRobmFtZSA9IGZhbHNlOwotCi1pbnQgaW50ZXJhY3RpdmUgPSAwOwotCi1zdGF0aWMgdm9pZAotbXJpX2VtdWwgKCkKLXsKLSAgaW50ZXJhY3RpdmUgPSBpc2F0dHkgKGZpbGVubyAoc3RkaW4pKTsKLSAgeXlwYXJzZSAoKTsKLX0KLQotLyogSWYgQ09VTlQgaXMgMCwgdGhlbiBGVU5DVElPTiBpcyBjYWxsZWQgb25jZSBvbiBlYWNoIGVudHJ5LiAgSWYgbm9uemVybywKLSAgIENPVU5UIGlzIHRoZSBsZW5ndGggb2YgdGhlIEZJTEVTIGNoYWluOyBGVU5DVElPTiBpcyBjYWxsZWQgb24gZWFjaCBlbnRyeQotICAgd2hvc2UgbmFtZSBtYXRjaGVzIG9uZSBpbiBGSUxFUy4gICovCi0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9tZW1iZXJzIChhcmNoLCBmdW5jdGlvbiwgZmlsZXMsIGNvdW50KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHZvaWQgKCpmdW5jdGlvbikgUEFSQU1TICgoYmZkICopKTsKLSAgICAgY2hhciAqKmZpbGVzOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGJmZCAqaGVhZDsKLSAgaW50IG1hdGNoX2NvdW50OwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGZvciAoaGVhZCA9IGFyY2gtPm5leHQ7IGhlYWQ7IGhlYWQgPSBoZWFkLT5uZXh0KQotCXsKLQkgIFBST0dSRVNTICgxKTsKLQkgIGZ1bmN0aW9uIChoZWFkKTsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoaXMgbWF5IGFwcGVhciB0byBiZSBhIGJhcm9xdWUgd2F5IG9mIGFjY29tcGxpc2hpbmcgd2hhdCB3ZSB3YW50LgotICAgICBIb3dldmVyIHdlIGhhdmUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBmaWxlbmFtZXMgaW4gb3JkZXIgdG8gbm90aWNlIHdoZXJlCi0gICAgIGEgZmlsZW5hbWUgaXMgcmVxdWVzdGVkIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYXJjaGl2ZS4gIERpdHRvCi0gICAgIG1hcHBpbmcgb3ZlciBlYWNoIGZpbGUgZWFjaCB0aW1lIC0tIHdlIHdhbnQgdG8gaGFjayBtdWx0aXBsZQotICAgICByZWZlcmVuY2VzLiAgKi8KLQotICBmb3IgKDsgY291bnQgPiAwOyBmaWxlcysrLCBjb3VudC0tKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQotICAgICAgbWF0Y2hfY291bnQgPSAwOwotICAgICAgZm9yIChoZWFkID0gYXJjaC0+bmV4dDsgaGVhZDsgaGVhZCA9IGhlYWQtPm5leHQpCi0JewotCSAgUFJPR1JFU1MgKDEpOwotCSAgaWYgKGhlYWQtPmZpbGVuYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBTb21lIGFyY2hpdmUgZm9ybWF0cyBkb24ndCBnZXQgdGhlIGZpbGVuYW1lcyBmaWxsZWQgaW4KLQkJIHVudGlsIHRoZSBlbGVtZW50cyBhcmUgb3BlbmVkLiAgKi8KLQkgICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0JICAgICAgYmZkX3N0YXRfYXJjaF9lbHQgKGhlYWQsICZidWYpOwotCSAgICB9Ci0JICBpZiAoKGhlYWQtPmZpbGVuYW1lICE9IE5VTEwpICYmCi0JICAgICAgKCFzdHJjbXAgKG5vcm1hbGl6ZSAoKmZpbGVzLCBhcmNoKSwgaGVhZC0+ZmlsZW5hbWUpKSkKLQkgICAgewotCSAgICAgICsrbWF0Y2hfY291bnQ7Ci0JICAgICAgaWYgKGNvdW50ZWRfbmFtZV9tb2RlCi0JCSAgJiYgbWF0Y2hfY291bnQgIT0gY291bnRlZF9uYW1lX2NvdW50ZXIpIAotCQl7Ci0JCSAgLyogQ291bnRpbmcsIGFuZCBkaWRuJ3QgbWF0Y2ggb24gY291bnQ7IGdvIG9uIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgbmV4dCBvbmUuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgICAgZnVuY3Rpb24gKGhlYWQpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCFmb3VuZCkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWZwcmludGYgKHN0ZGVyciwgXygibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIiksICpmaWxlcyk7Ci0gICAgfQotfQotDAotYm9vbGVhbiBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSBmYWxzZTsKLQotc3RhdGljIHZvaWQKLXVzYWdlIChoZWxwKQotICAgICBpbnQgaGVscDsKLXsKLSAgRklMRSAqczsKLQotICBzID0gaGVscCA/IHN0ZG91dCA6IHN0ZGVycjsKLSAgCi0gIGlmICghIGlzX3JhbmxpYikKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAocywgXygiVXNhZ2U6ICVzIFstXXtkbXBxcnN0eH1bYWJjZmlsTm9Qc1N1dlZdIFttZW1iZXItbmFtZV0gW2NvdW50XSBhcmNoaXZlLWZpbGUgZmlsZS4uLlxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAocywgXygiICAgICAgICVzIC1NIFs8bXJpLXNjcmlwdF1cbiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgZnByaW50ZiAocywgXygiIGNvbW1hbmRzOlxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBkICAgICAgICAgICAgLSBkZWxldGUgZmlsZShzKSBmcm9tIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIG1bYWJdICAgICAgICAtIG1vdmUgZmlsZShzKSBpbiB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBwICAgICAgICAgICAgLSBwcmludCBmaWxlKHMpIGZvdW5kIGluIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIHFbZl0gICAgICAgICAtIHF1aWNrIGFwcGVuZCBmaWxlKHMpIHRvIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIHJbYWJdW2ZdW3VdICAtIHJlcGxhY2UgZXhpc3Rpbmcgb3IgaW5zZXJ0IG5ldyBmaWxlKHMpIGludG8gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgdCAgICAgICAgICAgIC0gZGlzcGxheSBjb250ZW50cyBvZiBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIHhbb10gICAgICAgICAtIGV4dHJhY3QgZmlsZShzKSBmcm9tIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgY29tbWFuZCBzcGVjaWZpYyBtb2RpZmllcnM6XG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFthXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGFmdGVyIFttZW1iZXItbmFtZV1cbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW2JdICAgICAgICAgIC0gcHV0IGZpbGUocykgYmVmb3JlIFttZW1iZXItbmFtZV0gKHNhbWUgYXMgW2ldKVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbTl0gICAgICAgICAgLSB1c2UgaW5zdGFuY2UgW2NvdW50XSBvZiBuYW1lXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtmXSAgICAgICAgICAtIHRydW5jYXRlIGluc2VydGVkIGZpbGUgbmFtZXNcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW1BdICAgICAgICAgIC0gdXNlIGZ1bGwgcGF0aCBuYW1lcyB3aGVuIG1hdGNoaW5nXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtvXSAgICAgICAgICAtIHByZXNlcnZlIG9yaWdpbmFsIGRhdGVzXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFt1XSAgICAgICAgICAtIG9ubHkgcmVwbGFjZSBmaWxlcyB0aGF0IGFyZSBuZXdlciB0aGFuIGN1cnJlbnQgYXJjaGl2ZSBjb250ZW50c1xuIikpOwotICAgICAgZnByaW50ZiAocywgXygiIGdlbmVyaWMgbW9kaWZpZXJzOlxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbY10gICAgICAgICAgLSBkbyBub3Qgd2FybiBpZiB0aGUgbGlicmFyeSBoYWQgdG8gYmUgY3JlYXRlZFxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbc10gICAgICAgICAgLSBjcmVhdGUgYW4gYXJjaGl2ZSBpbmRleCAoY2YuIHJhbmxpYilcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW1NdICAgICAgICAgIC0gZG8gbm90IGJ1aWxkIGEgc3ltYm9sIHRhYmxlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFt2XSAgICAgICAgICAtIGJlIHZlcmJvc2VcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW1ZdICAgICAgICAgIC0gZGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXJcbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZwcmludGYgKHMsIF8oIlVzYWdlOiAlcyBbLXZWXSBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLQotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0ZGVycik7Ci0KLSAgaWYgKGhlbHApCi0gICAgZnByaW50ZiAocywgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0KLSAgeGV4aXQgKGhlbHAgPyAwIDogMSk7Ci19Ci0KLS8qIE5vcm1hbGl6ZSBhIGZpbGUgbmFtZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBpbnRvIGEgZmlsZQotICAgbmFtZSB3aGljaCB3ZSB3aWxsIHVzZSBpbiBhbiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ybWFsaXplIChmaWxlLCBhYmZkKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCi0gIGlmIChmdWxsX3BhdGhuYW1lKQotICAgIHJldHVybiBmaWxlOwotCi0gIGZpbGVuYW1lID0gc3RycmNociAoZmlsZSwgJy8nKTsKLSAgaWYgKGZpbGVuYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgZmlsZW5hbWUrKzsKLSAgZWxzZQotICAgIGZpbGVuYW1lID0gZmlsZTsKLQotICBpZiAoYXJfdHJ1bmNhdGUKLSAgICAgICYmIGFiZmQgIT0gTlVMTAotICAgICAgJiYgc3RybGVuIChmaWxlbmFtZSkgPiBhYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbikKLSAgICB7Ci0gICAgICBjaGFyICpzOwotCi0gICAgICAvKiBTcGFjZSBsZWFrLiAgKi8KLSAgICAgIHMgPSAoY2hhciAqKSB4bWFsbG9jIChhYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbiArIDEpOwotICAgICAgbWVtY3B5IChzLCBmaWxlbmFtZSwgYWJmZC0+eHZlYy0+YXJfbWF4X25hbWVsZW4pOwotICAgICAgc1thYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbl0gPSAnXDAnOwotICAgICAgZmlsZW5hbWUgPSBzOwotICAgIH0KLQotICByZXR1cm4gZmlsZW5hbWU7Ci19Ci0KLS8qIFJlbW92ZSBhbnkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG9ubHkgY2FsbGVkIHZpYSB4YXRleGl0LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci1zdGF0aWMgRklMRSAqb3V0cHV0X2ZpbGUgPSBOVUxMOwotc3RhdGljIGJmZCAqb3V0cHV0X2JmZCA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfb3V0cHV0ICgpCi17Ci0gIGlmIChvdXRwdXRfZmlsZW5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMICYmIG91dHB1dF9iZmQtPmlvc3RyZWFtICE9IE5VTEwpCi0JZmNsb3NlICgoRklMRSAqKSAob3V0cHV0X2JmZC0+aW9zdHJlYW0pKTsKLSAgICAgIGlmIChvdXRwdXRfZmlsZSAhPSBOVUxMKQotCWZjbG9zZSAob3V0cHV0X2ZpbGUpOwotICAgICAgdW5saW5rIChvdXRwdXRfZmlsZW5hbWUpOwotICAgIH0KLX0KLQotLyogVGhlIG9wdGlvbiBwYXJzaW5nIHNob3VsZCBiZSBpbiBpdHMgb3duIGZ1bmN0aW9uLgotICAgSXQgd2lsbCBiZSB3aGVuIEkgaGF2ZSBnZXRvcHQgd29ya2luZy4gICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICphcmdfcHRyOwotICBjaGFyIGM7Ci0gIGVudW0KLSAgICB7Ci0gICAgICBub25lID0gMCwgZGVsZXRlLCByZXBsYWNlLCBwcmludF90YWJsZSwKLSAgICAgIHByaW50X2ZpbGVzLCBleHRyYWN0LCBtb3ZlLCBxdWlja19hcHBlbmQKLSAgICB9IG9wZXJhdGlvbiA9IG5vbmU7Ci0gIGludCBhcmdfaW5kZXg7Ci0gIGNoYXIgKipmaWxlczsKLSAgaW50IGZpbGVfY291bnQ7Ci0gIGNoYXIgKmluYXJjaF9maWxlbmFtZTsKLSAgaW50IHNob3dfdmVyc2lvbjsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBpZiAoaXNfcmFubGliIDwgMCkKLSAgICB7Ci0gICAgICBjaGFyICp0ZW1wOwotCi0gICAgICB0ZW1wID0gc3RycmNociAocHJvZ3JhbV9uYW1lLCAnLycpOwotICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKLQl0ZW1wID0gcHJvZ3JhbV9uYW1lOwotICAgICAgZWxzZQotCSsrdGVtcDsKLSAgICAgIGlmIChzdHJsZW4gKHRlbXApID49IDYKLQkgICYmIHN0cmNtcCAodGVtcCArIHN0cmxlbiAodGVtcCkgLSA2LCAicmFubGliIikgPT0gMCkKLQlpc19yYW5saWIgPSAxOwotICAgICAgZWxzZQotCWlzX3JhbmxpYiA9IDA7Ci0gICAgfQotCi0gIGlmIChhcmdjID4gMSAmJiBhcmd2WzFdWzBdID09ICctJykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChhcmd2WzFdLCAiLS1oZWxwIikgPT0gMCkKLQl1c2FnZSAoMSk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICItLXZlcnNpb24iKSA9PSAwKQotCXsKLQkgIGlmIChpc19yYW5saWIpCi0JICAgIHByaW50X3ZlcnNpb24gKCJyYW5saWIiKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRfdmVyc2lvbiAoImFyIik7Ci0JfQotICAgIH0KLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICBzaG93X3ZlcnNpb24gPSAwOwotCi0gIHhhdGV4aXQgKHJlbW92ZV9vdXRwdXQpOwotCi0gIGlmIChpc19yYW5saWIpCi0gICAgewotICAgICAgYm9vbGVhbiB0b3VjaCA9IGZhbHNlOwotCi0gICAgICBpZiAoYXJnYyA8IDIgfHwgc3RyY21wIChhcmd2WzFdLCAiLS1oZWxwIikgPT0gMCkKLQl1c2FnZSAoMCk7Ci0gICAgICBpZiAoc3RyY21wIChhcmd2WzFdLCAiLVYiKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZ3ZbMV0sICItdiIpID09IDAKLQkgIHx8IHN0cm5jbXAgKGFyZ3ZbMV0sICItLXYiLCAzKSA9PSAwKQotCXByaW50X3ZlcnNpb24gKCJyYW5saWIiKTsKLSAgICAgIGFyZ19pbmRleCA9IDE7Ci0gICAgICBpZiAoc3RyY21wIChhcmd2WzFdLCAiLXQiKSA9PSAwKQotCXsKLQkgICsrYXJnX2luZGV4OwotCSAgdG91Y2ggPSB0cnVlOwotCX0KLSAgICAgIHdoaWxlIChhcmdfaW5kZXggPCBhcmdjKQotCXsKLQkgIGlmICghIHRvdWNoKQotCSAgICByYW5saWJfb25seSAoYXJndlthcmdfaW5kZXhdKTsKLQkgIGVsc2UKLQkgICAgcmFubGliX3RvdWNoIChhcmd2W2FyZ19pbmRleF0pOwotCSAgKythcmdfaW5kZXg7Ci0JfQotICAgICAgeGV4aXQgKDApOwotICAgIH0KLQotICBpZiAoYXJnYyA9PSAyICYmIHN0cmNtcCAoYXJndlsxXSwgIi1NIikgPT0gMCkKLSAgICB7Ci0gICAgICBtcmlfZW11bCAoKTsKLSAgICAgIHhleGl0ICgwKTsKLSAgICB9Ci0KLSAgaWYgKGFyZ2MgPCAyKQotICAgIHVzYWdlICgwKTsKLQotICBhcmdfcHRyID0gYXJndlsxXTsKLQotICBpZiAoKmFyZ19wdHIgPT0gJy0nKQotICAgICsrYXJnX3B0cjsJCQkvKiBjb21wYXRpYmlsaXR5ICovCi0KLSAgd2hpbGUgKChjID0gKmFyZ19wdHIrKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ2QnOgotCWNhc2UgJ20nOgotCWNhc2UgJ3AnOgotCWNhc2UgJ3EnOgotCWNhc2UgJ3InOgotCWNhc2UgJ3QnOgotCWNhc2UgJ3gnOgotCSAgaWYgKG9wZXJhdGlvbiAhPSBub25lKQotCSAgICBmYXRhbCAoXygidHdvIGRpZmZlcmVudCBvcGVyYXRpb24gb3B0aW9ucyBzcGVjaWZpZWQiKSk7Ci0JICBzd2l0Y2ggKGMpCi0JICAgIHsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgb3BlcmF0aW9uID0gZGVsZXRlOwotCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ20nOgotCSAgICAgIG9wZXJhdGlvbiA9IG1vdmU7Ci0JICAgICAgb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncCc6Ci0JICAgICAgb3BlcmF0aW9uID0gcHJpbnRfZmlsZXM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3EnOgotCSAgICAgIG9wZXJhdGlvbiA9IHF1aWNrX2FwcGVuZDsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdyJzoKLQkgICAgICBvcGVyYXRpb24gPSByZXBsYWNlOwotCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3QnOgotCSAgICAgIG9wZXJhdGlvbiA9IHByaW50X3RhYmxlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd4JzoKLQkgICAgICBvcGVyYXRpb24gPSBleHRyYWN0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JY2FzZSAnbCc6Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIHNpbGVudF9jcmVhdGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBwcmVzZXJ2ZV9kYXRlcyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHNob3dfdmVyc2lvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIHdyaXRlX2FybWFwID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgd3JpdGVfYXJtYXAgPSAtMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3UnOgotCSAgbmV3ZXJfb25seSA9IDE7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBwb3N0eXBlID0gcG9zX2FmdGVyOwotCSAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICBwb3N0eXBlID0gcG9zX2JlZm9yZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgcG9zdHlwZSA9IHBvc19iZWZvcmU7Ci0JICBicmVhazsKLQljYXNlICdNJzoKLQkgIG1yaV9tb2RlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgY291bnRlZF9uYW1lX21vZGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBhcl90cnVuY2F0ZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLQkgIGZ1bGxfcGF0aG5hbWUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbGxlZ2FsIG9wdGlvbiAtLSAlY1xuIiksIHByb2dyYW1fbmFtZSwgYyk7Ci0JICB1c2FnZSAoMCk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJhciIpOwotCi0gIGlmIChhcmdjIDwgMykKLSAgICB1c2FnZSAoMCk7Ci0KLSAgaWYgKG1yaV9tb2RlKQotICAgIHsKLSAgICAgIG1yaV9lbXVsICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZCAqYXJjaDsKLQotICAgICAgLyogV2UgY2FuJ3Qgd3JpdGUgYW4gYXJtYXAgd2hlbiB1c2luZyBhciBxLCBzbyBqdXN0IGRvIGFyIHIKLSAgICAgICAgIGluc3RlYWQuICAqLwotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQgJiYgd3JpdGVfYXJtYXApCi0Jb3BlcmF0aW9uID0gcmVwbGFjZTsKLQotICAgICAgaWYgKChvcGVyYXRpb24gPT0gbm9uZSB8fCBvcGVyYXRpb24gPT0gcHJpbnRfdGFibGUpCi0JICAmJiB3cml0ZV9hcm1hcCA9PSAxKQotCXsKLQkgIHJhbmxpYl9vbmx5IChhcmd2WzJdKTsKLQkgIHhleGl0ICgwKTsKLQl9Ci0KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gbm9uZSkKLQlmYXRhbCAoXygibm8gb3BlcmF0aW9uIHNwZWNpZmllZCIpKTsKLQotICAgICAgaWYgKG5ld2VyX29ubHkgJiYgb3BlcmF0aW9uICE9IHJlcGxhY2UpCi0JZmF0YWwgKF8oImB1JyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgYHInIG9wdGlvbi4iKSk7Ci0KLSAgICAgIGFyZ19pbmRleCA9IDI7Ci0KLSAgICAgIGlmIChwb3N0eXBlICE9IHBvc19kZWZhdWx0KQotCXBvc25hbWUgPSBhcmd2W2FyZ19pbmRleCsrXTsKLQotICAgICAgaWYgKGNvdW50ZWRfbmFtZV9tb2RlKSAKLQl7Ci0gICAgICAgICAgaWYgKG9wZXJhdGlvbiAhPSBleHRyYWN0ICYmIG9wZXJhdGlvbiAhPSBkZWxldGUpIAotCSAgICAgZmF0YWwgKF8oImBOJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgYHgnIGFuZCAnZCcgb3B0aW9ucy4iKSk7Ci0JICBjb3VudGVkX25hbWVfY291bnRlciA9IGF0b2kgKGFyZ3ZbYXJnX2luZGV4KytdKTsKLSAgICAgICAgICBpZiAoY291bnRlZF9uYW1lX2NvdW50ZXIgPD0gMCkKLQkgICAgZmF0YWwgKF8oIlZhbHVlIGZvciBgTicgbXVzdCBiZSBwb3NpdGl2ZS4iKSk7Ci0JfQotCi0gICAgICBpbmFyY2hfZmlsZW5hbWUgPSBhcmd2W2FyZ19pbmRleCsrXTsKLQotICAgICAgZmlsZXMgPSBhcmdfaW5kZXggPCBhcmdjID8gYXJndiArIGFyZ19pbmRleCA6IE5VTEw7Ci0gICAgICBmaWxlX2NvdW50ID0gYXJnYyAtIGFyZ19pbmRleDsKLQotI2lmIDAKLSAgICAgIC8qIFdlIGRvbid0IHVzZSBkb19xdWlja19hcHBlbmQgYW55IG1vcmUuICBUb28gbWFueSBzeXN0ZW1zCi0gICAgICAgICBleHBlY3QgYXIgdG8gYWx3YXlzIHJlYnVpbGQgdGhlIHN5bWJvbCB0YWJsZSBldmVuIHdoZW4gcSBpcwotICAgICAgICAgdXNlZC4gICovCi0KLSAgICAgIC8qIFdlIGNhbid0IGRvIGEgcXVpY2sgYXBwZW5kIGlmIHdlIG5lZWQgdG8gY29uc3RydWN0IGFuCi0JIGV4dGVuZGVkIG5hbWUgdGFibGUsIGJlY2F1c2UgZG9fcXVpY2tfYXBwZW5kIHdvbid0IGJlIGFibGUgdG8KLQkgcmVidWlsZCB0aGUgbmFtZSB0YWJsZS4gIFVuZm9ydHVuYXRlbHksIGF0IHRoaXMgcG9pbnQgd2UKLQkgZG9uJ3QgYWN0dWFsbHkga25vdyB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aCBwZXJtaXR0ZWQgYnkgdGhpcwotCSBvYmplY3QgZmlsZSBmb3JtYXQuICBTbywgd2UgZ3Vlc3MuICBGSVhNRS4gICovCi0gICAgICBpZiAob3BlcmF0aW9uID09IHF1aWNrX2FwcGVuZCAmJiAhIGFyX3RydW5jYXRlKQotCXsKLQkgIGNoYXIgKipjaGs7Ci0KLQkgIGZvciAoY2hrID0gZmlsZXM7IGNoayAhPSBOVUxMICYmICpjaGsgIT0gJ1wwJzsgY2hrKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybGVuIChub3JtYWxpemUgKCpjaGssIChiZmQgKikgTlVMTCkpID4gMTQpCi0JCXsKLQkJICBvcGVyYXRpb24gPSByZXBsYWNlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kKQotCXsKLQkgIC8qIE5vdGUgdGhhdCBxdWljayBhcHBlbmRpbmcgdG8gYSBub24tZXhpc3RlbnQgYXJjaGl2ZSBjcmVhdGVzIGl0LAotCSAgICAgZXZlbiBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgdG8gYXBwZW5kLiAqLwotCSAgZG9fcXVpY2tfYXBwZW5kIChpbmFyY2hfZmlsZW5hbWUsIGZpbGVzKTsKLQkgIHhleGl0ICgwKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgYXJjaCA9IG9wZW5faW5hcmNoIChpbmFyY2hfZmlsZW5hbWUsCi0JCQkgIGZpbGVzID09IE5VTEwgPyAoY2hhciAqKSBOVUxMIDogZmlsZXNbMF0pOwotCi0gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikKLQl7Ci0JY2FzZSBwcmludF90YWJsZToKLQkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIHByaW50X2Rlc2NyLCBmaWxlcywgZmlsZV9jb3VudCk7Ci0JICBicmVhazsKLQotCWNhc2UgcHJpbnRfZmlsZXM6Ci0JICBtYXBfb3Zlcl9tZW1iZXJzIChhcmNoLCBwcmludF9jb250ZW50cywgZmlsZXMsIGZpbGVfY291bnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGV4dHJhY3Q6Ci0JICBtYXBfb3Zlcl9tZW1iZXJzIChhcmNoLCBleHRyYWN0X2ZpbGUsIGZpbGVzLCBmaWxlX2NvdW50KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBkZWxldGU6Ci0JICBpZiAoZmlsZXMgIT0gTlVMTCkKLQkgICAgZGVsZXRlX21lbWJlcnMgKGFyY2gsIGZpbGVzKTsKLQkgIGVsc2UKLQkgICAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSBtb3ZlOgotCSAgaWYgKGZpbGVzICE9IE5VTEwpCi0JICAgIG1vdmVfbWVtYmVycyAoYXJjaCwgZmlsZXMpOwotCSAgZWxzZQotCSAgICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIHJlcGxhY2U6Ci0JY2FzZSBxdWlja19hcHBlbmQ6Ci0JICBpZiAoZmlsZXMgIT0gTlVMTCB8fCB3cml0ZV9hcm1hcCA+IDApCi0JICAgIHJlcGxhY2VfbWVtYmVycyAoYXJjaCwgZmlsZXMsIG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQpOwotCSAgZWxzZQotCSAgICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFNob3VsZG4ndCBoYXBwZW4hICovCi0JZGVmYXVsdDoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnRlcm5hbCBlcnJvciAtLSB0aGlzIG9wdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIpLAotCQkgICBwcm9ncmFtX25hbWUpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICB9Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0gIHhleGl0ICgwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWJmZCAqCi1vcGVuX2luYXJjaCAoYXJjaGl2ZV9maWxlbmFtZSwgZmlsZSkKLSAgICAgY29uc3QgY2hhciAqYXJjaGl2ZV9maWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgY29uc3QgY2hhciAqdGFyZ2V0OwotICBiZmQgKipsYXN0X29uZTsKLSAgYmZkICpuZXh0X29uZTsKLSAgc3RydWN0IHN0YXQgc2J1ZjsKLSAgYmZkICphcmNoOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotICB0YXJnZXQgPSBOVUxMOwotCi0gIGlmIChzdGF0IChhcmNoaXZlX2ZpbGVuYW1lLCAmc2J1ZikgIT0gMCkKLSAgICB7Ci0jaWZuZGVmIF9fR08zMl9fCi0KLS8qIEtMVURHRSBBTEVSVCEgVGVtcG9yYXJ5IGZpeCB1bnRpbCBJIGZpZ2dlciB3aHkKLSAqIHN0YXQoKSBpcyB3cm9uZyAuLi4gdGhpbmsgaXQncyBidXJpZWQgaW4gR08zMidzIElEVAotICogLSBKYXgKLSAqLwotICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQliZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotI2VuZGlmCi0KLSAgICAgIGlmICghb3BlcmF0aW9uX2FsdGVyc19hcmNoKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgcGVycm9yIChhcmNoaXZlX2ZpbGVuYW1lKTsKLQkgIG1heWJlcXVpdCAoKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgLyogVHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIHRhcmdldCB0byB1c2UgZm9yIHRoZSBhcmNoaXZlIGZyb20gdGhlCi0gICAgICAgICBmaXJzdCBvYmplY3Qgb24gdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKLQl7Ci0JICBiZmQgKm9iajsKLQotCSAgb2JqID0gYmZkX29wZW5yIChmaWxlLCBOVUxMKTsKLQkgIGlmIChvYmogIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChvYmosIGJmZF9vYmplY3QpKQotCQl0YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAob2JqKTsKLQkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChvYmopOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZS4gICovCi0gICAgICBhcmNoID0gYmZkX29wZW53IChhcmNoaXZlX2ZpbGVuYW1lLCB0YXJnZXQpOwotICAgICAgaWYgKGFyY2ggPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X2Zvcm1hdCAoYXJjaCwgYmZkX2FyY2hpdmUpCi0JICB8fCAhIGJmZF9jbG9zZSAoYXJjaCkpCi0JYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLQotICAgICAgLyogSWYgd2UgZGllIGNyZWF0aW5nIGEgbmV3IGFyY2hpdmUsIGRvbid0IGxlYXZlIGl0IGFyb3VuZC4gICovCi0gICAgICBvdXRwdXRfZmlsZW5hbWUgPSBhcmNoaXZlX2ZpbGVuYW1lOwotICAgIH0KLQotICBhcmNoID0gYmZkX29wZW5yIChhcmNoaXZlX2ZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYXJjaCA9PSBOVUxMKQotICAgIHsKLSAgICBibG9zZXI6Ci0gICAgICBiZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFyY2gsIGJmZF9hcmNoaXZlLCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgbGFzdF9vbmUgPSAmKGFyY2gtPm5leHQpOwotICAvKiBSZWFkIGFsbCB0aGUgY29udGVudHMgcmlnaHQgYXdheSwgcmVnYXJkbGVzcy4gICovCi0gIGZvciAobmV4dF9vbmUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBOVUxMKTsKLSAgICAgICBuZXh0X29uZTsKLSAgICAgICBuZXh0X29uZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIG5leHRfb25lKSkKLSAgICB7Ci0gICAgICBQUk9HUkVTUyAoMSk7Ci0gICAgICAqbGFzdF9vbmUgPSBuZXh0X29uZTsKLSAgICAgIGxhc3Rfb25lID0gJm5leHRfb25lLT5uZXh0OwotICAgIH0KLSAgKmxhc3Rfb25lID0gKGJmZCAqKSBOVUxMOwotICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcykKLSAgICBnb3RvIGJsb3NlcjsKLSAgcmV0dXJuIGFyY2g7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbmNvcGllZCA9IDA7Ci0gIGNoYXIgKmNidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICBsb25nIHNpemU7Ci0gIGlmIChiZmRfc3RhdF9hcmNoX2VsdCAoYWJmZCwgJmJ1ZikgIT0gMCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICBwcmludGYgKCJcbjwlcz5cblxuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCk7Ci0KLSAgc2l6ZSA9IGJ1Zi5zdF9zaXplOwotICB3aGlsZSAobmNvcGllZCA8IHNpemUpCi0gICAgewotCi0gICAgICBpbnQgbnJlYWQ7Ci0gICAgICBpbnQgdG9jb3B5ID0gc2l6ZSAtIG5jb3BpZWQ7Ci0gICAgICBpZiAodG9jb3B5ID4gQlVGU0laRSkKLQl0b2NvcHkgPSBCVUZTSVpFOwotCi0gICAgICBucmVhZCA9IGJmZF9yZWFkIChjYnVmLCAxLCB0b2NvcHksIGFiZmQpOwkvKiBvb3BzIC0tIGJyb2tlCi0JCQkJCQkJICAgYWJzdHJhY3Rpb24hICAqLwotICAgICAgaWYgKG5yZWFkICE9IHRvY29weSkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWZhdGFsIChfKCIlcyBpcyBub3QgYSB2YWxpZCBhcmNoaXZlIiksCi0JICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSkpOwotICAgICAgZndyaXRlIChjYnVmLCAxLCBucmVhZCwgc3Rkb3V0KTsKLSAgICAgIG5jb3BpZWQgKz0gdG9jb3B5OwotICAgIH0KLSAgZnJlZSAoY2J1Zik7Ci19Ci0KLS8qIEV4dHJhY3QgYSBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgaW50byBpdHMgb3duIGZpbGUuCi0KLSAgIFdlIGRlZmVyIG9wZW5pbmcgdGhlIG5ldyBmaWxlIHVudGlsIGFmdGVyIHdlIGhhdmUgcmVhZCBhIEJVRlNJWiBjaHVuayBvZiB0aGUKLSAgIG9sZCBvbmUsIHNpbmNlIHdlIGtub3cgd2UgaGF2ZSBqdXN0IHJlYWQgdGhlIGFyY2hpdmUgaGVhZGVyIGZvciB0aGUgb2xkCi0gICBvbmUuICBTaW5jZSBtb3N0IG1lbWJlcnMgYXJlIHNob3J0ZXIgdGhhbiBCVUZTSVosIHRoaXMgbWVhbnMgd2Ugd2lsbCByZWFkCi0gICB0aGUgb2xkIGhlYWRlciwgcmVhZCB0aGUgb2xkIGRhdGEsIHdyaXRlIGEgbmV3IGlub2RlIGZvciB0aGUgbmV3IGZpbGUsIGFuZAotICAgd3JpdGUgdGhlIG5ldyBkYXRhLCBhbmQgYmUgZG9uZS4gVGhpcyAnb3B0aW1pemF0aW9uJyBpcyB3aGF0IGNvbWVzIGZyb20KLSAgIHNpdHRpbmcgbmV4dCB0byBhIGJhcmUgZGlzayBhbmQgaGVhcmluZyBpdCBldmVyeSB0aW1lIGl0IHNlZWtzLiAgLS0gR251Ci0gICBHaWxtb3JlICAqLwotCi12b2lkCi1leHRyYWN0X2ZpbGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRklMRSAqb3N0cmVhbTsKLSAgY2hhciAqY2J1ZiA9IHhtYWxsb2MgKEJVRlNJWkUpOwotICBpbnQgbnJlYWQsIHRvY29weTsKLSAgbG9uZyBuY29waWVkID0gMDsKLSAgbG9uZyBzaXplOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gIAotICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpICE9IDApCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIHNpemUgPSBidWYuc3Rfc2l6ZTsKLQotICBpZiAoc2l6ZSA8IDApCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygic3RhdCByZXR1cm5zIG5lZ2F0aXZlIHNpemUgZm9yICVzIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgCi0gIGlmICh2ZXJib3NlKQotICAgIHByaW50ZiAoInggLSAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCk7Ci0KLSAgb3N0cmVhbSA9IE5VTEw7Ci0gIGlmIChzaXplID09IDApCi0gICAgewotICAgICAgLyogU2VlbXMgbGlrZSBhbiBhYnN0cmFjdGlvbiB2aW9sYXRpb24sIGVoPyAgV2VsbCBpdCdzIE9LISAqLwotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0KLSAgICAgIG9zdHJlYW0gPSBmb3BlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIEZPUEVOX1dCKTsKLSAgICAgIGlmIChvc3RyZWFtID09IE5VTEwpCi0JewotCSAgcGVycm9yIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICB4ZXhpdCAoMSk7Ci0JfQotCi0gICAgICBvdXRwdXRfZmlsZSA9IG9zdHJlYW07Ci0gICAgfQotICBlbHNlCi0gICAgd2hpbGUgKG5jb3BpZWQgPCBzaXplKQotICAgICAgewotCXRvY29weSA9IHNpemUgLSBuY29waWVkOwotCWlmICh0b2NvcHkgPiBCVUZTSVpFKQotCSAgdG9jb3B5ID0gQlVGU0laRTsKLQotCW5yZWFkID0gYmZkX3JlYWQgKGNidWYsIDEsIHRvY29weSwgYWJmZCk7Ci0JaWYgKG5yZWFkICE9IHRvY29weSkKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmYXRhbCAoXygiJXMgaXMgbm90IGEgdmFsaWQgYXJjaGl2ZSIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSk7Ci0KLQkvKiBTZWUgY29tbWVudCBhYm92ZTsgdGhpcyBzYXZlcyBkaXNrIGFybSBtb3Rpb24gKi8KLQlpZiAob3N0cmVhbSA9PSBOVUxMKQotCSAgewotCSAgICAvKiBTZWVtcyBsaWtlIGFuIGFic3RyYWN0aW9uIHZpb2xhdGlvbiwgZWg/ICBXZWxsIGl0J3MgT0shICovCi0JICAgIG91dHB1dF9maWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotCi0JICAgIG9zdHJlYW0gPSBmb3BlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIEZPUEVOX1dCKTsKLQkgICAgaWYgKG9zdHJlYW0gPT0gTlVMTCkKLQkgICAgICB7Ci0JCXBlcnJvciAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQl4ZXhpdCAoMSk7Ci0JICAgICAgfQotCi0JICAgIG91dHB1dF9maWxlID0gb3N0cmVhbTsKLQkgIH0KLQlmd3JpdGUgKGNidWYsIDEsIG5yZWFkLCBvc3RyZWFtKTsKLQluY29waWVkICs9IHRvY29weTsKLSAgICAgIH0KLQotICBpZiAob3N0cmVhbSAhPSBOVUxMKQotICAgIGZjbG9zZSAob3N0cmVhbSk7Ci0KLSAgb3V0cHV0X2ZpbGUgPSBOVUxMOwotICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotCi0gIGNobW9kIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYnVmLnN0X21vZGUpOwotCi0gIGlmIChwcmVzZXJ2ZV9kYXRlcykKLSAgICBzZXRfdGltZXMgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAmYnVmKTsKLQotICBmcmVlIChjYnVmKTsKLX0KLQotI2lmIDAKLQotLyogV2UgZG9uJ3QgdXNlIHRoaXMgYW55bW9yZS4gIFRvbyBtYW55IHN5c3RlbXMgZXhwZWN0IGFyIHRvIHJlYnVpbGQKLSAgIHRoZSBzeW1ib2wgdGFibGUgZXZlbiB3aGVuIHEgaXMgdXNlZC4gICovCi0KLS8qIEp1c3QgZG8gaXQgcXVpY2tseTsgZG9uJ3Qgd29ycnkgYWJvdXQgZHVwcywgYXJtYXAsIG9yIGFueXRoaW5nIGxpa2UgdGhhdCAqLwotCi1zdGF0aWMgdm9pZAotZG9fcXVpY2tfYXBwZW5kIChhcmNoaXZlX2ZpbGVuYW1lLCBmaWxlc190b19hcHBlbmQpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWU7Ci0gICAgIGNoYXIgKipmaWxlc190b19hcHBlbmQ7Ci17Ci0gIEZJTEUgKm9maWxlLCAqaWZpbGU7Ci0gIGNoYXIgKmJ1ZiA9IHhtYWxsb2MgKEJVRlNJWkUpOwotICBsb25nIHRvY29weSwgdGhpc3RpbWU7Ci0gIGJmZCAqdGVtcDsKLSAgc3RydWN0IHN0YXQgc2J1ZjsKLSAgYm9vbGVhbiBuZXdmaWxlID0gZmFsc2U7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0KLSAgaWYgKHN0YXQgKGFyY2hpdmVfZmlsZW5hbWUsICZzYnVmKSAhPSAwKQotICAgIHsKLQotI2lmbmRlZiBfX0dPMzJfXwotCi0vKiBLTFVER0UgQUxFUlQhIFRlbXBvcmFyeSBmaXggdW50aWwgSSBmaWdnZXIgd2h5Ci0gKiBzdGF0KCkgaXMgd3JvbmcgLi4uIHRoaW5rIGl0J3MgYnVyaWVkIGluIEdPMzIncyBJRFQKLSAqIC0gSmF4Ci0gKi8KLQotICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQliZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotI2VuZGlmCi0KLSAgICAgIG5ld2ZpbGUgPSB0cnVlOwotICAgIH0KLQotICBvZmlsZSA9IGZvcGVuIChhcmNoaXZlX2ZpbGVuYW1lLCBGT1BFTl9BVUIpOwotICBpZiAob2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKHByb2dyYW1fbmFtZSk7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIHRlbXAgPSBiZmRfb3BlbnIgKGFyY2hpdmVfZmlsZW5hbWUsIE5VTEwpOwotICBpZiAodGVtcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0gICAgfQotICBpZiAobmV3ZmlsZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAodGVtcCwgYmZkX2FyY2hpdmUpICE9IHRydWUpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmYXRhbCAoXygiJXMgaXMgbm90IGFuIGFyY2hpdmUiKSwgYXJjaGl2ZV9maWxlbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZndyaXRlIChBUk1BRywgMSwgU0FSTUFHLCBvZmlsZSk7Ci0gICAgICBpZiAoIXNpbGVudF9jcmVhdGUpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjcmVhdGluZyAlc1xuIiksCi0JCSBwcm9ncmFtX25hbWUsIGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAoYXJfdHJ1bmNhdGUpCi0gICAgdGVtcC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLQotICAvKiBhc3N1bWUgaXQncyBhbiBhY2hpdmUsIGdvIHN0cmFpZ2h0IHRvIHRoZSBlbmQsIHNhbnMgJDIwMCAqLwotICBmc2VlayAob2ZpbGUsIDAsIDIpOwotCi0gIGZvciAoOyBmaWxlc190b19hcHBlbmQgJiYgKmZpbGVzX3RvX2FwcGVuZDsgKytmaWxlc190b19hcHBlbmQpCi0gICAgewotICAgICAgc3RydWN0IGFyX2hkciAqaGRyID0gYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgKHRlbXAsICpmaWxlc190b19hcHBlbmQpOwotICAgICAgaWYgKGhkciA9PSBOVUxMKQotCXsKLQkgIGJmZF9mYXRhbCAoKmZpbGVzX3RvX2FwcGVuZCk7Ci0JfQotCi0gICAgICBCRkRfU0VORCAodGVtcCwgX2JmZF90cnVuY2F0ZV9hcm5hbWUsICh0ZW1wLCAqZmlsZXNfdG9fYXBwZW5kLCAoY2hhciAqKSBoZHIpKTsKLQotICAgICAgaWZpbGUgPSBmb3BlbiAoKmZpbGVzX3RvX2FwcGVuZCwgRk9QRU5fUkIpOwotICAgICAgaWYgKGlmaWxlID09IE5VTEwpCi0JewotCSAgYmZkX25vbmZhdGFsICgqZmlsZXNfdG9fYXBwZW5kKTsKLQl9Ci0KLSAgICAgIGlmIChzdGF0ICgqZmlsZXNfdG9fYXBwZW5kLCAmc2J1ZikgIT0gMCkKLQl7Ci0JICBiZmRfbm9uZmF0YWwgKCpmaWxlc190b19hcHBlbmQpOwotCX0KLQotICAgICAgdG9jb3B5ID0gc2J1Zi5zdF9zaXplOwotCi0gICAgICAvKiBYWFggc2hvdWxkIGRvIGVycm9yLWNoZWNraW5nISAqLwotICAgICAgZndyaXRlIChoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIG9maWxlKTsKLQotICAgICAgd2hpbGUgKHRvY29weSA+IDApCi0JewotCSAgdGhpc3RpbWUgPSB0b2NvcHk7Ci0JICBpZiAodGhpc3RpbWUgPiBCVUZTSVpFKQotCSAgICB0aGlzdGltZSA9IEJVRlNJWkU7Ci0JICBmcmVhZCAoYnVmLCAxLCB0aGlzdGltZSwgaWZpbGUpOwotCSAgZndyaXRlIChidWYsIDEsIHRoaXN0aW1lLCBvZmlsZSk7Ci0JICB0b2NvcHkgLT0gdGhpc3RpbWU7Ci0JfQotICAgICAgZmNsb3NlIChpZmlsZSk7Ci0gICAgICBpZiAoKHNidWYuc3Rfc2l6ZSAlIDIpID09IDEpCi0JcHV0YyAoJ1wwMTInLCBvZmlsZSk7Ci0gICAgfQotICBmY2xvc2UgKG9maWxlKTsKLSAgYmZkX2Nsb3NlICh0ZW1wKTsKLSAgZnJlZSAoYnVmKTsKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX2FyY2hpdmUgKGlhcmNoKQotICAgICBiZmQgKmlhcmNoOwotewotICBiZmQgKm9iZmQ7Ci0gIGNoYXIgKm9sZF9uYW1lLCAqbmV3X25hbWU7Ci0gIGJmZCAqY29udGVudHNfaGVhZCA9IGlhcmNoLT5uZXh0OwotCi0gIG9sZF9uYW1lID0geG1hbGxvYyAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChpYXJjaCkpICsgMSk7Ci0gIHN0cmNweSAob2xkX25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGlhcmNoKSk7Ci0gIG5ld19uYW1lID0gbWFrZV90ZW1wbmFtZSAob2xkX25hbWUpOwotCi0gIG91dHB1dF9maWxlbmFtZSA9IG5ld19uYW1lOwotCi0gIG9iZmQgPSBiZmRfb3BlbncgKG5ld19uYW1lLCBiZmRfZ2V0X3RhcmdldCAoaWFyY2gpKTsKLQotICBpZiAob2JmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAob2xkX25hbWUpOwotCi0gIG91dHB1dF9iZmQgPSBvYmZkOwotCi0gIGJmZF9zZXRfZm9ybWF0IChvYmZkLCBiZmRfYXJjaGl2ZSk7Ci0KLSAgLyogUmVxdWVzdCB3cml0aW5nIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSB1bmxlc3Mgd2UndmUKLSAgICAgYmVlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCBub3QgdG8uICAqLwotICBvYmZkLT5oYXNfYXJtYXAgPSB3cml0ZV9hcm1hcCA+PSAwOwotCi0gIGlmIChhcl90cnVuY2F0ZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHNob3VsZCByZWFsbHkgdXNlIGJmZF9zZXRfZmlsZV9mbGFncywgYnV0IHRoYXQgcmVqZWN0cwotICAgICAgICAgYXJjaGl2ZXMuICAqLwotICAgICAgb2JmZC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvYmZkLCBjb250ZW50c19oZWFkKSAhPSB0cnVlKQotICAgIGJmZF9mYXRhbCAob2xkX25hbWUpOwotCi0gIGlmICghYmZkX2Nsb3NlIChvYmZkKSkKLSAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKLQotICBvdXRwdXRfYmZkID0gTlVMTDsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQotICAvKiBXZSBkb24ndCBjYXJlIGlmIHRoaXMgZmFpbHM7IHdlIG1pZ2h0IGJlIGNyZWF0aW5nIHRoZSBhcmNoaXZlLiAgKi8KLSAgYmZkX2Nsb3NlIChpYXJjaCk7Ci0KLSAgaWYgKHNtYXJ0X3JlbmFtZSAobmV3X25hbWUsIG9sZF9uYW1lLCAwKSAhPSAwKQotICAgIHhleGl0ICgxKTsKLX0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgZW50cnkgd2hpY2ggc2hvdWxkIGJlIHJwbGFjZCdkCi0gICBpbnRvIHdoZW4gYWx0ZXJpbmcuICBERUZBVUxUX1BPUyBzaG91bGQgYmUgaG93IHRvIGludGVycHJldCBwb3NfZGVmYXVsdCwKLSAgIGFuZCBzaG91bGQgYmUgYSBwb3MgdmFsdWUuICAqLwotCi1zdGF0aWMgYmZkICoqCi1nZXRfcG9zX2JmZCAoY29udGVudHMsIGRlZmF1bHRfcG9zLCBkZWZhdWx0X3Bvc25hbWUpCi0gICAgIGJmZCAqKmNvbnRlbnRzOwotICAgICBlbnVtIHBvcyBkZWZhdWx0X3BvczsKLSAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9wb3NuYW1lOwotewotICBiZmQgKiphZnRlcl9iZmQgPSBjb250ZW50czsKLSAgZW51bSBwb3MgcmVhbHBvczsKLSAgY29uc3QgY2hhciAqcmVhbHBvc25hbWU7Ci0KLSAgaWYgKHBvc3R5cGUgPT0gcG9zX2RlZmF1bHQpCi0gICAgewotICAgICAgcmVhbHBvcyA9IGRlZmF1bHRfcG9zOwotICAgICAgcmVhbHBvc25hbWUgPSBkZWZhdWx0X3Bvc25hbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVhbHBvcyA9IHBvc3R5cGU7Ci0gICAgICByZWFscG9zbmFtZSA9IHBvc25hbWU7Ci0gICAgfQotCi0gIGlmIChyZWFscG9zID09IHBvc19lbmQpCi0gICAgewotICAgICAgd2hpbGUgKCphZnRlcl9iZmQpCi0JYWZ0ZXJfYmZkID0gJigoKmFmdGVyX2JmZCktPm5leHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoOyAqYWZ0ZXJfYmZkOyBhZnRlcl9iZmQgPSAmKCphZnRlcl9iZmQpLT5uZXh0KQotCWlmIChzdHJjbXAgKCgqYWZ0ZXJfYmZkKS0+ZmlsZW5hbWUsIHJlYWxwb3NuYW1lKSA9PSAwKQotCSAgewotCSAgICBpZiAocmVhbHBvcyA9PSBwb3NfYWZ0ZXIpCi0JICAgICAgYWZ0ZXJfYmZkID0gJigqYWZ0ZXJfYmZkKS0+bmV4dDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgfQotICByZXR1cm4gYWZ0ZXJfYmZkOwotfQotCi1zdGF0aWMgdm9pZAotZGVsZXRlX21lbWJlcnMgKGFyY2gsIGZpbGVzX3RvX2RlbGV0ZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjaGFyICoqZmlsZXNfdG9fZGVsZXRlOwotewotICBiZmQgKipjdXJyZW50X3B0cl9wdHI7Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGJvb2xlYW4gc29tZXRoaW5nX2NoYW5nZWQgPSBmYWxzZTsKLSAgaW50IG1hdGNoX2NvdW50OwotCi0gIGZvciAoOyAqZmlsZXNfdG9fZGVsZXRlICE9IE5VTEw7ICsrZmlsZXNfdG9fZGVsZXRlKQotICAgIHsKLSAgICAgIC8qIEluIGEub3V0IHN5c3RlbXMsIHRoZSBhcm1hcCBpcyBvcHRpb25hbC4gIEl0J3MgYWxzbyBjYWxsZWQKLQkgX18uU1lNREVGLiAgU28gaWYgdGhlIHVzZXIgYXNrZWQgdG8gZGVsZXRlIGl0LCB3ZSBzaG91bGQgcmVtZW1iZXIKLQkgdGhhdCBmYWN0LiBUaGlzIGlzbid0IHF1aXRlIHJpZ2h0IGZvciBDT0ZGIHN5c3RlbXMgKHdoZXJlCi0JIF9fLlNZTURFRiBtaWdodCBiZSByZWd1bGFyIG1lbWJlciksIGJ1dCBpdCdzIHZlcnkgdW5saWtlbHkKLQkgdG8gYmUgYSBwcm9ibGVtLiAgRklYTUUgKi8KLQotICAgICAgaWYgKCFzdHJjbXAgKCpmaWxlc190b19kZWxldGUsICJfXy5TWU1ERUYiKSkKLQl7Ci0JICBhcmNoLT5oYXNfYXJtYXAgPSBmYWxzZTsKLQkgIHdyaXRlX2FybWFwID0gLTE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGZvdW5kID0gZmFsc2U7Ci0gICAgICBtYXRjaF9jb3VudCA9IDA7Ci0gICAgICBjdXJyZW50X3B0cl9wdHIgPSAmKGFyY2gtPm5leHQpOwotICAgICAgd2hpbGUgKCpjdXJyZW50X3B0cl9wdHIpCi0JewotCSAgaWYgKHN0cmNtcCAobm9ybWFsaXplICgqZmlsZXNfdG9fZGVsZXRlLCBhcmNoKSwKLQkJICAgICAgKCpjdXJyZW50X3B0cl9wdHIpLT5maWxlbmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgICsrbWF0Y2hfY291bnQ7Ci0JICAgICAgaWYgKGNvdW50ZWRfbmFtZV9tb2RlCi0JCSAgJiYgbWF0Y2hfY291bnQgIT0gY291bnRlZF9uYW1lX2NvdW50ZXIpIAotCQl7Ci0JCSAgLyogQ291bnRpbmcsIGFuZCBkaWRuJ3QgbWF0Y2ggb24gY291bnQ7IGdvIG9uIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgbmV4dCBvbmUuICAqLwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZm91bmQgPSB0cnVlOwotCQkgIHNvbWV0aGluZ19jaGFuZ2VkID0gdHJ1ZTsKLQkJICBpZiAodmVyYm9zZSkKLQkJICAgIHByaW50ZiAoImQgLSAlc1xuIiwKLQkJCSAgICAqZmlsZXNfdG9fZGVsZXRlKTsKLQkJICAqY3VycmVudF9wdHJfcHRyID0gKCgqY3VycmVudF9wdHJfcHRyKS0+bmV4dCk7Ci0JCSAgZ290byBuZXh0X2ZpbGU7Ci0JCX0KLQkgICAgfQotCi0JICBjdXJyZW50X3B0cl9wdHIgPSAmKCgqY3VycmVudF9wdHJfcHRyKS0+bmV4dCk7Ci0JfQotCi0gICAgICBpZiAodmVyYm9zZSAmJiBmb3VuZCA9PSBmYWxzZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgcHJpbnRmIChfKCJObyBtZW1iZXIgbmFtZWQgYCVzJ1xuIiksICpmaWxlc190b19kZWxldGUpOwotCX0KLSAgICBuZXh0X2ZpbGU6Ci0gICAgICA7Ci0gICAgfQotCi0gIGlmIChzb21ldGhpbmdfY2hhbmdlZCA9PSB0cnVlKQotICAgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotICBlbHNlCi0gICAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLX0KLQotCi0vKiBSZXBvc2l0aW9uIGV4aXN0aW5nIG1lbWJlcnMgd2l0aGluIGFuIGFyY2hpdmUgKi8KLQotc3RhdGljIHZvaWQKLW1vdmVfbWVtYmVycyAoYXJjaCwgZmlsZXNfdG9fbW92ZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjaGFyICoqZmlsZXNfdG9fbW92ZTsKLXsKLSAgYmZkICoqYWZ0ZXJfYmZkOwkJLyogTmV3IGVudHJpZXMgZ28gYWZ0ZXIgdGhpcyBvbmUgKi8KLSAgYmZkICoqY3VycmVudF9wdHJfcHRyOwkvKiBjZHIgcG9pbnRlciBpbnRvIGNvbnRlbnRzICovCi0KLSAgZm9yICg7ICpmaWxlc190b19tb3ZlOyArK2ZpbGVzX3RvX21vdmUpCi0gICAgewotICAgICAgY3VycmVudF9wdHJfcHRyID0gJihhcmNoLT5uZXh0KTsKLSAgICAgIHdoaWxlICgqY3VycmVudF9wdHJfcHRyKQotCXsKLQkgIGJmZCAqY3VycmVudF9wdHIgPSAqY3VycmVudF9wdHJfcHRyOwotCSAgaWYgKHN0cmNtcCAobm9ybWFsaXplICgqZmlsZXNfdG9fbW92ZSwgYXJjaCksCi0JCSAgICAgIGN1cnJlbnRfcHRyLT5maWxlbmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIE1vdmUgdGhpcyBmaWxlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgLSBmaXJzdCBjdXQgZnJvbQotCQkgd2hlcmUgaXQgaXMuICAqLwotCSAgICAgIGJmZCAqbGluazsKLQkgICAgICAqY3VycmVudF9wdHJfcHRyID0gY3VycmVudF9wdHItPm5leHQ7Ci0KLQkgICAgICAvKiBOb3cgZ2x1ZSB0byBlbmQgKi8KLQkgICAgICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19lbmQsIE5VTEwpOwotCSAgICAgIGxpbmsgPSAqYWZ0ZXJfYmZkOwotCSAgICAgICphZnRlcl9iZmQgPSBjdXJyZW50X3B0cjsKLQkgICAgICBjdXJyZW50X3B0ci0+bmV4dCA9IGxpbms7Ci0KLQkgICAgICBpZiAodmVyYm9zZSkKLQkJcHJpbnRmICgibSAtICVzXG4iLCAqZmlsZXNfdG9fbW92ZSk7Ci0KLQkgICAgICBnb3RvIG5leHRfZmlsZTsKLQkgICAgfQotCi0JICBjdXJyZW50X3B0cl9wdHIgPSAmKCgqY3VycmVudF9wdHJfcHRyKS0+bmV4dCk7Ci0JfQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUgJXMhXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCAqZmlsZXNfdG9fbW92ZSwgYXJjaC0+ZmlsZW5hbWUpOwotICAgICAgeGV4aXQgKDEpOwotICAgIG5leHRfZmlsZTo7Ci0gICAgfQotCi0gIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotfQotCi0vKiBPdWdodCB0byBkZWZhdWx0IHRvIHJlcGxhY2luZyBpbiBwbGFjZSwgYnV0IHRoaXMgaXMgZXhpc3RpbmcgcHJhY3RpY2UhICAqLwotCi1zdGF0aWMgdm9pZAotcmVwbGFjZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19tb3ZlLCBxdWljaykKLSAgICAgYmZkICphcmNoOwotICAgICBjaGFyICoqZmlsZXNfdG9fbW92ZTsKLSAgICAgYm9vbGVhbiBxdWljazsKLXsKLSAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gIGJmZCAqKmFmdGVyX2JmZDsJCS8qIE5ldyBlbnRyaWVzIGdvIGFmdGVyIHRoaXMgb25lICovCi0gIGJmZCAqY3VycmVudDsKLSAgYmZkICoqY3VycmVudF9wdHI7Ci0gIGJmZCAqdGVtcDsKLQotICB3aGlsZSAoZmlsZXNfdG9fbW92ZSAmJiAqZmlsZXNfdG9fbW92ZSkKLSAgICB7Ci0gICAgICBpZiAoISBxdWljaykKLQl7Ci0JICBjdXJyZW50X3B0ciA9ICZhcmNoLT5uZXh0OwotCSAgd2hpbGUgKCpjdXJyZW50X3B0cikKLQkgICAgewotCSAgICAgIGN1cnJlbnQgPSAqY3VycmVudF9wdHI7Ci0KLQkgICAgICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGFyIHByb2dyYW1zLCB3ZQotCQkgcGVybWl0IHRoZSBzYW1lIGZpbGUgdG8gYmUgYWRkZWQgbXVsdGlwbGUgdGltZXMuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5vcm1hbGl6ZSAoKmZpbGVzX3RvX21vdmUsIGFyY2gpLAotCQkJICBub3JtYWxpemUgKGN1cnJlbnQtPmZpbGVuYW1lLCBhcmNoKSkgPT0gMAotCQkgICYmIGN1cnJlbnQtPmFyZWx0X2RhdGEgIT0gTlVMTCkKLQkJewotCQkgIGlmIChuZXdlcl9vbmx5KQotCQkgICAgewotCQkgICAgICBzdHJ1Y3Qgc3RhdCBmc2J1ZiwgYXNidWY7Ci0KLQkJICAgICAgaWYgKHN0YXQgKCpmaWxlc190b19tb3ZlLCAmZnNidWYpICE9IDApCi0JCQl7Ci0JCQkgIGlmIChlcnJubyAhPSBFTk9FTlQpCi0JCQkgICAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7Ci0JCQkgIGdvdG8gbmV4dF9maWxlOwotCQkJfQotCQkgICAgICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGN1cnJlbnQsICZhc2J1ZikgIT0gMCkKLQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQlmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBjdXJyZW50LT5maWxlbmFtZSk7Ci0KLQkJICAgICAgaWYgKGZzYnVmLnN0X210aW1lIDw9IGFzYnVmLnN0X210aW1lKQotCQkJZ290byBuZXh0X2ZpbGU7Ci0JCSAgICB9Ci0KLQkJICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19hZnRlciwKLQkJCQkJICAgY3VycmVudC0+ZmlsZW5hbWUpOwotCQkgIHRlbXAgPSAqYWZ0ZXJfYmZkOwotCi0JCSAgKmFmdGVyX2JmZCA9IGJmZF9vcGVuciAoKmZpbGVzX3RvX21vdmUsIE5VTEwpOwotCQkgIGlmICgqYWZ0ZXJfYmZkID09IChiZmQgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7Ci0JCSAgICB9Ci0JCSAgKCphZnRlcl9iZmQpLT5uZXh0ID0gdGVtcDsKLQotCQkgIC8qIHNuaXAgb3V0IHRoaXMgZW50cnkgZnJvbSB0aGUgY2hhaW4gKi8KLQkJICAqY3VycmVudF9wdHIgPSAoKmN1cnJlbnRfcHRyKS0+bmV4dDsKLQotCQkgIGlmICh2ZXJib3NlKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCJyIC0gJXNcbiIsICpmaWxlc190b19tb3ZlKTsKLQkJICAgIH0KLQotCQkgIGNoYW5nZWQgPSB0cnVlOwotCi0JCSAgZ290byBuZXh0X2ZpbGU7Ci0JCX0KLQkgICAgICBjdXJyZW50X3B0ciA9ICYoY3VycmVudC0+bmV4dCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFkZCB0byB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiAgKi8KLQotICAgICAgYWZ0ZXJfYmZkID0gZ2V0X3Bvc19iZmQgKCZhcmNoLT5uZXh0LCBwb3NfZW5kLCBOVUxMKTsKLSAgICAgIHRlbXAgPSAqYWZ0ZXJfYmZkOwotICAgICAgKmFmdGVyX2JmZCA9IGJmZF9vcGVuciAoKmZpbGVzX3RvX21vdmUsIE5VTEwpOwotICAgICAgaWYgKCphZnRlcl9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIGJmZF9mYXRhbCAoKmZpbGVzX3RvX21vdmUpOwotCX0KLSAgICAgIGlmICh2ZXJib3NlKQotCXsKLQkgIHByaW50ZiAoImEgLSAlc1xuIiwgKmZpbGVzX3RvX21vdmUpOwotCX0KLQotICAgICAgKCphZnRlcl9iZmQpLT5uZXh0ID0gdGVtcDsKLQotICAgICAgY2hhbmdlZCA9IHRydWU7Ci0KLSAgICBuZXh0X2ZpbGU6OwotCi0gICAgICBmaWxlc190b19tb3ZlKys7Ci0gICAgfQotCi0gIGlmIChjaGFuZ2VkKQotICAgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotICBlbHNlCi0gICAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXJhbmxpYl9vbmx5IChhcmNobmFtZSkKLSAgICAgY29uc3QgY2hhciAqYXJjaG5hbWU7Ci17Ci0gIGJmZCAqYXJjaDsKLQotICB3cml0ZV9hcm1hcCA9IDE7Ci0gIGFyY2ggPSBvcGVuX2luYXJjaCAoYXJjaG5hbWUsIChjaGFyICopIE5VTEwpOwotICBpZiAoYXJjaCA9PSBOVUxMKQotICAgIHhleGl0ICgxKTsKLSAgd3JpdGVfYXJjaGl2ZSAoYXJjaCk7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBzeW1ib2wgbWFwIG9mIGFuIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgdm9pZAotcmFubGliX3RvdWNoIChhcmNobmFtZSkKLSAgICAgY29uc3QgY2hhciAqYXJjaG5hbWU7Ci17Ci0jaWZkZWYgX19HTzMyX18KLSAgLyogSSBkb24ndCB0aGluayB1cGRhdGluZyB3b3JrcyBvbiBnbzMyLiAgKi8KLSAgcmFubGliX29ubHkgKGFyY2huYW1lKTsKLSNlbHNlCi0gIGludCBmOwotICBiZmQgKmFyY2g7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBmID0gb3BlbiAoYXJjaG5hbWUsIE9fUkRXUiB8IE9fQklOQVJZLCAwKTsKLSAgaWYgKGYgPCAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBiZmRfZmF0YWwgKGFyY2huYW1lKTsKLSAgICB9Ci0KLSAgYXJjaCA9IGJmZF9mZG9wZW5yIChhcmNobmFtZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZik7Ci0gIGlmIChhcmNoID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChhcmNobmFtZSk7Ci0gIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYXJjaCwgYmZkX2FyY2hpdmUsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChhcmNobmFtZSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFyY2gpKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oIiVzOiBubyBhcmNoaXZlIG1hcCB0byB1cGRhdGUiKSwgYXJjaG5hbWUpOwotCi0gIGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKTsKLQotICBpZiAoISBiZmRfY2xvc2UgKGFyY2gpKQotICAgIGJmZF9mYXRhbCAoYXJjaG5hbWUpOwotI2VuZGlmCi19Ci0KLS8qIFRoaW5ncyB3aGljaCBhcmUgaW50ZXJlc3RpbmcgdG8gbWFwIG92ZXIgYWxsIG9yIHNvbWUgb2YgdGhlIGZpbGVzOiAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVzY3IgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfYXJlbHRfZGVzY3IgKHN0ZG91dCwgYWJmZCwgdmVyYm9zZSk7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hcmxleC5sIGIvYmludXRpbHMvYXJsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlMTNkMS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcmxleC5sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotJXsKLS8qIGFybGV4LmwgLSBTdHJhbmdlIHNjcmlwdCBsYW5ndWFnZSBsZXhlciAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5MiwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgotICAgCQkgIHNhY0BjeWdudXMuY29tCi0KLSovCi0jZGVmaW5lIERPTlRERUNMQVJFX01BTExPQwotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYXJwYXJzZS5oIgotCi1pbnQgbGluZW51bWJlcjsKLSV9Ci0lJQotCi0iQURETElCIiAgIAl7IHJldHVybiBBRERMSUI7IH0KLSJBRERNT0QiICAgCXsgcmV0dXJuIEFERE1PRDsgfQotIkNMRUFSIiAgIAl7IHJldHVybiBDTEVBUjsgfQotIkNSRUFURSIgICAJeyByZXR1cm4gQ1JFQVRFOyB9Ci0iREVMRVRFIiAgIAl7IHJldHVybiBERUxFVEU7IH0KLSJESVJFQ1RPUlkiICAgCXsgcmV0dXJuIERJUkVDVE9SWTsgfQotIkVORCIgICAJeyByZXR1cm4gRU5EOyB9Ci0iRVhUUkFDVCIgICAJeyByZXR1cm4gRVhUUkFDVDsgfQotIkZVTExESVIiICAgCXsgcmV0dXJuIEZVTExESVI7IH0KLSJIRUxQIiAgIAl7IHJldHVybiBIRUxQOyB9Ci0iTElTVCIJCXsgcmV0dXJuIExJU1Q7IH0KLSJPUEVOIiAgIAl7IHJldHVybiBPUEVOOyB9Ci0iUkVQTEFDRSIgICAJeyByZXR1cm4gUkVQTEFDRTsgfQotIlZFUkJPU0UiICAgCXsgcmV0dXJuIFZFUkJPU0U7IH0KLSJTQVZFIiAgIAl7IHJldHVybiBTQVZFOyB9Ci0iYWRkbGliIiAgIAl7IHJldHVybiBBRERMSUI7IH0KLSJhZGRtb2QiICAgCXsgcmV0dXJuIEFERE1PRDsgfQotImNsZWFyIiAgIAl7IHJldHVybiBDTEVBUjsgfQotImNyZWF0ZSIgICAJeyByZXR1cm4gQ1JFQVRFOyB9Ci0iZGVsZXRlIiAgIAl7IHJldHVybiBERUxFVEU7IH0KLSJkaXJlY3RvcnkiICAgCXsgcmV0dXJuIERJUkVDVE9SWTsgfQotImVuZCIgICAJeyByZXR1cm4gRU5EOyB9Ci0iZXh0cmFjdCIgICAJeyByZXR1cm4gRVhUUkFDVDsgfQotImZ1bGxkaXIiICAgCXsgcmV0dXJuIEZVTExESVI7IH0KLSJoZWxwIiAgIAl7IHJldHVybiBIRUxQOyB9Ci0ibGlzdCIJCXsgcmV0dXJuIExJU1Q7IH0KLSJvcGVuIiAgIAl7IHJldHVybiBPUEVOOyB9Ci0icmVwbGFjZSIgICAJeyByZXR1cm4gUkVQTEFDRTsgfQotInZlcmJvc2UiICAgCXsgcmV0dXJuIFZFUkJPU0U7IH0KLSJzYXZlIiAgIAl7IHJldHVybiBTQVZFOyB9Ci0iK1xuIiAgICAgICAgICAgeyBsaW5lbnVtYmVyICsrOyB9Ci0iKCIgICAgICAgICAgICAgeyByZXR1cm4gJygnOyB9Ci0iKSIgICAgICAgICAgICAgeyByZXR1cm4gJyknOyB9Ci0iLCIgICAgICAgICAgICAgeyByZXR1cm4gJywnOyB9Ci1bQS1aYS16MC05LyQ6LlwtXF9dKyAgeyAJCi0JCXl5bHZhbC5uYW1lID0gIHhzdHJkdXAgKHl5dGV4dCk7Ci0JCXJldHVybiBGSUxFTkFNRTsKLQkJfQotIioiLiogCQl7IH0KLSI7Ii4qIAkJeyB9Ci0iICIJCXsgfQotIlxuIgkgCSB7IGxpbmVudW1iZXIgKys7IHJldHVybiBORVdMSU5FOyB9CQotCi0lJQotI2lmbmRlZiB5eXdyYXAKLS8qIE5lZWRlZCBmb3IgbGV4LCB0aG91Z2ggbm90IGZsZXguICovCi1pbnQgeXl3cmFwKCkgeyByZXR1cm4gMTsgfQotI2VuZGlmCmRpZmYgLS1naXQgYS9iaW51dGlscy9hcnBhcnNlLnkgYi9iaW51dGlscy9hcnBhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTkwZmEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXJwYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSV7Ci0vKiBhcnBhcnNlLnkgLSBTdGFuZ2Ugc2NyaXB0IGxhbmd1YWdlIHBhcnNlciAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk1LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgotICAgCQkgIHNhY0BjeWdudXMuY29tCi0KLSovCi0jZGVmaW5lIERPTlRERUNMQVJFX01BTExPQwotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImFyc3VwLmgiCi1leHRlcm4gaW50IHZlcmJvc2U7Ci1leHRlcm4gaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLSV9Ci0KLSV1bmlvbiB7Ci0gIGNoYXIgKm5hbWU7Ci1zdHJ1Y3QgbGlzdCAqbGlzdCA7Ci0KLX07Ci0KLSV0b2tlbiBORVdMSU5FCi0ldG9rZW4gVkVSQk9TRQotJXRva2VuIDxuYW1lPiBGSUxFTkFNRQotJXRva2VuIEFERExJQgotJXRva2VuIExJU1QKLSV0b2tlbiBBRERNT0QKLSV0b2tlbiBDTEVBUgotJXRva2VuIENSRUFURQotJXRva2VuIERFTEVURQotJXRva2VuIERJUkVDVE9SWQotJXRva2VuIEVORAotJXRva2VuIEVYVFJBQ1QKLSV0b2tlbiBGVUxMRElSCi0ldG9rZW4gSEVMUAotJXRva2VuIFFVSVQKLSV0b2tlbiBSRVBMQUNFCi0ldG9rZW4gU0FWRQotJXRva2VuIE9QRU4KLQotJXR5cGUgPGxpc3Q+IG1vZHVsZWxpc3QgCi0ldHlwZSA8bGlzdD4gbW9kdWxlbmFtZQotJXR5cGUgPG5hbWU+IG9wdGlvbmFsX2ZpbGVuYW1lCi0lJQotCi1zdGFydDoKLQl7IHByb21wdCgpOyB9IHNlc3Npb24KLQk7Ci0KLXNlc3Npb246Ci0JICAgIHNlc3Npb24gY29tbWFuZF9saW5lCi0JfAotCTsKLQotY29tbWFuZF9saW5lOgotCQljb21tYW5kIE5FV0xJTkUgeyBwcm9tcHQoKTsgfQotCi1jb21tYW5kOgotCQlvcGVuX2NvbW1hbmQJCi0JfAljcmVhdGVfY29tbWFuZAkKLQl8IAl2ZXJib3NlX2NvbW1hbmQKLQl8CWRpcmVjdG9yeV9jb21tYW5kCi0JfAlhZGRsaWJfY29tbWFuZAotCXwJY2xlYXJfY29tbWFuZAotCXwJYWRkbW9kX2NvbW1hbmQKLQl8IAlzYXZlX2NvbW1hbmQKLSAgICAgICAgfCAgICAgICBleHRyYWN0X2NvbW1hbmQKLQl8CXJlcGxhY2VfY29tbWFuZAotCXwJZGVsZXRlX2NvbW1hbmQKLQl8CWxpc3RfY29tbWFuZAotCXwgCUVORAkgeyBhcl9lbmQoKTsgcmV0dXJuIDA7IH0KLQl8IAllcnJvcgotCXwgICAgICAgRklMRU5BTUUgeyB5eWVycm9yKCJmb28iKTsgfQotCXwKLQk7Ci0KLQotZXh0cmFjdF9jb21tYW5kOgotICAgICAgICAgICAgICAgIEVYVFJBQ1QgbW9kdWxlbmFtZQotCQl7IGFyX2V4dHJhY3QoJDIpOyB9Ci0JOwotCi1yZXBsYWNlX2NvbW1hbmQ6CQotCQlSRVBMQUNFIG1vZHVsZW5hbWUKLQkJeyBhcl9yZXBsYWNlKCQyKTsgfQotCTsKLQkKLWNsZWFyX2NvbW1hbmQ6Ci0JCUNMRUFSCi0JCXsgYXJfY2xlYXIoKTsgfQotCTsKLQotZGVsZXRlX2NvbW1hbmQ6Ci0JCURFTEVURSBtb2R1bGVuYW1lCi0JCXsgYXJfZGVsZXRlKCQyKTsgfQotCTsKLWFkZG1vZF9jb21tYW5kOgotCUFERE1PRCBtb2R1bGVuYW1lCi0JCXsgYXJfYWRkbW9kKCQyKTsgfQotCTsKLQotbGlzdF9jb21tYW5kOgkKLQkJTElTVAotCQl7IGFyX2xpc3QoKTsgfQotCTsKLQotc2F2ZV9jb21tYW5kOgkKLQkJU0FWRQotCQl7IGFyX3NhdmUoKTsgfQotCTsKLQotCi0KLW9wZW5fY29tbWFuZDoKLQkJT1BFTiBGSUxFTkFNRSAKLQkJeyBhcl9vcGVuKCQyLDApOyB9Ci0JOwotCi1jcmVhdGVfY29tbWFuZDoKLQkJQ1JFQVRFIEZJTEVOQU1FIAotCQl7IGFyX29wZW4oJDIsMSk7IH0KLQk7Ci0KLQotYWRkbGliX2NvbW1hbmQ6Ci0JCUFERExJQiBGSUxFTkFNRSBtb2R1bGVsaXN0Ci0JCXsgYXJfYWRkbGliKCQyLCQzKTsgfQotCTsKLWRpcmVjdG9yeV9jb21tYW5kOgotCQlESVJFQ1RPUlkgRklMRU5BTUUgbW9kdWxlbGlzdCBvcHRpb25hbF9maWxlbmFtZQotCQl7IGFyX2RpcmVjdG9yeSgkMiwgJDMsICQ0KTsgfQotCTsKLQotCi0KLW9wdGlvbmFsX2ZpbGVuYW1lOgotCQlGSUxFTkFNRQotCQl7ICQkID0gJDE7IH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotCi1tb2R1bGVsaXN0OgotCScoJyBtb2R1bGVuYW1lICcpJyAKLQkJeyAkJCA9ICQyOyB9Ci0JfAotCQl7ICQkID0gMDsgfQotCTsKLQotbW9kdWxlbmFtZToKLQkJbW9kdWxlbmFtZSBvcHRjb21tYSBGSUxFTkFNRQotCQl7IAlzdHJ1Y3QgbGlzdCAqbiAgPSAoc3RydWN0IGxpc3QgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdCkpOwotCQkJbi0+bmV4dCA9ICQxOyAKLQkJCW4tPm5hbWUgPSAkMzsKLQkJCSQkID0gbjsKLQkJIH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotCQotCi1vcHRjb21tYToKLQkJJywnCi0JfAotCTsKLQkKLQkJCi12ZXJib3NlX2NvbW1hbmQ6Ci0JVkVSQk9TRSAKLQkJeyB2ZXJib3NlID0gIXZlcmJvc2U7IH0KLQk7Ci0KLQotJSUKLQotc3RhdGljIGludAoteXllcnJvciAoeCkKLSAgICAgY29uc3QgY2hhciAqeCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBleHRlcm4gaW50IGxpbmVudW1iZXI7Ci0KLSAgcHJpbnRmIChfKCJTeW50YXggZXJyb3IgaW4gYXJjaGl2ZSBzY3JpcHQsIGxpbmUgJWRcbiIpLCBsaW5lbnVtYmVyICsgMSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXJzdXAuYyBiL2JpbnV0aWxzL2Fyc3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODA5ZmMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXJzdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKiBhcnN1cC5jIC0gQXJjaGl2ZSBzdXBwb3J0IGZvciBNUkkgY29tcGF0aWJpbGl0eQotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGxvb2tzIGFmdGVyIHJlcXVlc3RzIGZyb20gYXJwYXJzZS55LCB0byBwcm92aWRlIHRoZSBNUkkKLXN0eWxlIGxpYnJhcmlhbiBjb21tYW5kIHN5bnRheCArIDEgd29yZCBMSVNUCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhcnN1cC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1zdGF0aWMgdm9pZCBtYXBfb3Zlcl9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqZnVuY3Rpb24pIChiZmQgKiwgYmZkICopLCBzdHJ1Y3QgbGlzdCAqKSk7Ci1zdGF0aWMgdm9pZCBhcl9kaXJlY3RvcnlfZG9lciBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIGFyX2FkZGxpYl9kb2VyIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1leHRlcm4gaW50IHZlcmJvc2U7Ci0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9saXN0IChhcmNoLCBmdW5jdGlvbiwgbGlzdCkKLSAgICAgYmZkICphcmNoOwotICAgICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgICBzdHJ1Y3QgbGlzdCAqbGlzdDsKLXsKLSAgYmZkICpoZWFkOwotCi0gIGlmIChsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuZXh0OwotCi0gICAgICBoZWFkID0gYXJjaC0+bmV4dDsKLSAgICAgIHdoaWxlIChoZWFkICE9IE5VTEwpCi0JewotCSAgbmV4dCA9IGhlYWQtPm5leHQ7Ci0JICBmdW5jdGlvbiAoaGVhZCwgKGJmZCAqKSBOVUxMKTsKLQkgIGhlYWQgPSBuZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbGlzdCAqcHRyOwotCi0gICAgICAvKiBUaGlzIG1heSBhcHBlYXIgdG8gYmUgYSBiYXJvcXVlIHdheSBvZiBhY2NvbXBsaXNoaW5nIHdoYXQgd2UKLQkgd2FudC4gIGhvd2V2ZXIgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGZpbGVuYW1lcyBpbiBvcmRlcgotCSB0byBub3RpY2Ugd2hlcmUgYSBmaWxlbmFtZSBpcyByZXF1ZXN0ZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluCi0JIHRoZSBhcmNoaXZlLiAgRGl0dG8gbWFwcGluZyBvdmVyIGVhY2ggZmlsZSBlYWNoIHRpbWUgLS0gd2UKLQkgd2FudCB0byBoYWNrIG11bHRpcGxlIHJlZmVyZW5jZXMuICAqLwotICAgICAgZm9yIChwdHIgPSBsaXN0OyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkKLQl7Ci0JICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JICBiZmQgKnByZXYgPSBhcmNoOwotCi0JICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkgCi0JICAgIHsKLQkgICAgICBpZiAoaGVhZC0+ZmlsZW5hbWUgIT0gTlVMTAotCQkgICYmIHN0cmNtcCAocHRyLT5uYW1lLCBoZWFkLT5maWxlbmFtZSkgPT0gMCkKLQkJewotCQkgIGZvdW5kID0gdHJ1ZTsKLQkJICBmdW5jdGlvbiAoaGVhZCwgcHJldik7Ci0JCX0KLQkgICAgICBwcmV2ID0gaGVhZDsKLQkgICAgfQotCSAgaWYgKCEgZm91bmQpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiTm8gZW50cnkgJXMgaW4gYXJjaGl2ZS5cbiIpLCBwdHItPm5hbWUpOwotCX0KLSAgICB9Ci19Ci0KLQotRklMRSAqb3V0ZmlsZTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotYXJfZGlyZWN0b3J5X2RvZXIgKGFiZmQsIGlnbm9yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAgIHByaW50X2FyZWx0X2Rlc2NyKG91dGZpbGUsIGFiZmQsIHZlcmJvc2UpOwotfQotCi12b2lkCi1hcl9kaXJlY3RvcnkgKGFyX25hbWUsIGxpc3QsIG91dHB1dCkKLSAgICAgY2hhciAqYXJfbmFtZTsKLSAgICAgc3RydWN0IGxpc3QgKmxpc3Q7Ci0gICAgIGNoYXIgKm91dHB1dDsKLXsKLSAgYmZkICphcmNoOwotCi0gIGFyY2ggPSBvcGVuX2luYXJjaCAoYXJfbmFtZSwgKGNoYXIgKikgTlVMTCk7Ci0gIGlmIChvdXRwdXQpCi0gICAgewotICAgICAgb3V0ZmlsZSA9IGZvcGVuKG91dHB1dCwidyIpOwotICAgICAgaWYgKG91dGZpbGUgPT0gMCkKLQl7Ci0JICBvdXRmaWxlID0gc3Rkb3V0OwotCSAgZnByaW50ZiAoc3RkZXJyLF8oIkNhbid0IG9wZW4gZmlsZSAlc1xuIiksIG91dHB1dCk7Ci0JICBvdXRwdXQgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgCi0gICAgb3V0ZmlsZSA9IHN0ZG91dDsKLQotICBtYXBfb3Zlcl9saXN0IChhcmNoLCBhcl9kaXJlY3RvcnlfZG9lciwgbGlzdCk7Ci0KLSAgYmZkX2Nsb3NlIChhcmNoKTsKLQotICBpZiAob3V0cHV0KQotICAgZmNsb3NlIChvdXRmaWxlKTsKLX0KLQotdm9pZAotREVGVU5fVk9JRChwcm9tcHQpCi17Ci0gIGV4dGVybiBpbnQgaW50ZXJhY3RpdmU7Ci0gIGlmIChpbnRlcmFjdGl2ZSkgCi0gIHsKLSAgICBwcmludGYoIkFSID4iKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsgCi0gIH0KLX0KLQotdm9pZAotbWF5YmVxdWl0ICgpCi17Ci0gIGlmICghIGludGVyYWN0aXZlKSAKLSAgICB4ZXhpdCAoOSk7Ci19Ci0KLQotYmZkICpvYmZkOwotY2hhciAqcmVhbF9uYW1lIDsgCi12b2lkCi1ERUZVTihhcl9vcGVuLChuYW1lLCB0KSwKLSAgICAgIGNoYXIgKm5hbWUgQU5ECi0gICAgICBpbnQgdCkKLQotewotICBjaGFyICp0bmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxMCk7Ci0gIHJlYWxfbmFtZSA9IG5hbWU7Ci0gIHNwcmludGYodG5hbWUsICIlcy10bXAiLCBuYW1lKTsKLSAgb2JmZCA9IGJmZF9vcGVudyh0bmFtZSwgTlVMTCk7Ci0KLSAgaWYgKCFvYmZkKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsXygiJXM6IENhbid0IG9wZW4gb3V0cHV0IGFyY2hpdmUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgIHRuYW1lKTsKLQotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgewotICAgIGlmICghdCkgewotICAgICAgYmZkICoqcHRyOwotICAgICAgYmZkICplbGVtZW50OwotICAgICAgYmZkICppYmZkOwotICAgICAgaWJmZCA9IGJmZF9vcGVucihuYW1lLCBOVUxMKTsKLSAgICAgIGlmICghaWJmZCkgewotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBDYW4ndCBvcGVuIGlucHV0IGFyY2hpdmUgJXNcbiIpLAotCQlwcm9ncmFtX25hbWUsIG5hbWUpOwotCW1heWJlcXVpdCgpOwotCXJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0KGliZmQsIGJmZF9hcmNoaXZlKSAhPSB0cnVlKSB7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IGZpbGUgJXMgaXMgbm90IGFuIGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUsCi0JCW5hbWUpOwotCW1heWJlcXVpdCgpOwotCXJldHVybjsKLSAgICAgIH0KLSAgICAgIHB0ciA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGVsZW1lbnQgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKGliZmQsIE5VTEwpOwotCi0gICAgICB3aGlsZSAoZWxlbWVudCkgewotCSpwdHIgPSBlbGVtZW50OwotCXB0ciA9ICZlbGVtZW50LT5uZXh0OwotCWVsZW1lbnQgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKGliZmQsIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIGJmZF9zZXRfZm9ybWF0KG9iZmQsIGJmZF9hcmNoaXZlKTsKLQotICAgIG9iZmQtPmhhc19hcm1hcCA9IDE7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotYXJfYWRkbGliX2RvZXIgKGFiZmQsIHByZXYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICpwcmV2OwotewotICAvKiBBZGQgdGhpcyBtb2R1bGUgdG8gdGhlIG91dHB1dCBiZmQgKi8KLSAgaWYgKHByZXYgIT0gTlVMTCkKLSAgICBwcmV2LT5uZXh0ID0gYWJmZC0+bmV4dDsKLSAgYWJmZC0+bmV4dCA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLSAgb2JmZC0+YXJjaGl2ZV9oZWFkID0gYWJmZDsKLX0KLQotdm9pZAotYXJfYWRkbGliIChuYW1lLCBsaXN0KQotICAgICBjaGFyICpuYW1lOwotICAgICBzdHJ1Y3QgbGlzdCAqbGlzdDsKLXsKLSAgaWYgKG9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBvdXRwdXQgYXJjaGl2ZSBzcGVjaWZpZWQgeWV0XG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIG1heWJlcXVpdCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmQgKmFyY2g7Ci0KLSAgICAgIGFyY2ggPSBvcGVuX2luYXJjaCAobmFtZSwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBpZiAoYXJjaCAhPSBOVUxMKQotCW1hcF9vdmVyX2xpc3QgKGFyY2gsIGFyX2FkZGxpYl9kb2VyLCBsaXN0KTsKLQotICAgICAgLyogRG9uJ3QgY2xvc2UgdGhlIGJmZCwgc2luY2UgaXQgd2lsbCBtYWtlIHRoZSBlbGVtZW50cyBkaXNhc3BwZWFyICovCi0gICAgfQotfQotCi12b2lkCi1ERUZVTihhcl9hZGRtb2QsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgYmZkICphYmZkID0gYmZkX29wZW5yKGxpc3QtPm5hbWUsIE5VTEwpOwotICAgICAgaWYgKCFhYmZkKSAgewotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCi0JCWxpc3QtPm5hbWUpOwotCW1heWJlcXVpdCgpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JYWJmZC0+bmV4dCA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLQlvYmZkLT5hcmNoaXZlX2hlYWQgPSBhYmZkOwotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLQotCi12b2lkCi1ERUZVTl9WT0lEKGFyX2NsZWFyKQotewotaWYgKG9iZmQpIAotIG9iZmQtPmFyY2hpdmVfaGVhZCA9IDA7Ci19Ci0KLXZvaWQKLURFRlVOKGFyX2RlbGV0ZSwgKGxpc3QpLAotICAgICAgc3RydWN0IGxpc3QgKmxpc3QpCi17Ci0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIHdoaWxlIChsaXN0KSB7Ci0gICAgICAvKiBGaW5kIHRoaXMgbmFtZSBpbiB0aGUgYXJjaGl2ZSAqLwotICAgICAgYmZkICptZW1iZXIgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gICAgICBiZmQgKipwcmV2ID0gJihvYmZkLT5hcmNoaXZlX2hlYWQpOwotICAgICAgaW50IGZvdW5kID0gMDsKLSAgICAgIHdoaWxlIChtZW1iZXIpIHsKLQlpZiAoc3RyY21wKG1lbWJlci0+ZmlsZW5hbWUsIGxpc3QtPm5hbWUpID09IDApIHsKLQkgICpwcmV2ID0gbWVtYmVyLT5uZXh0OwotCSAgZm91bmQgPSAxOwotCX0KLQllbHNlIHsKLQkgIHByZXYgPSAmKG1lbWJlci0+bmV4dCk7Ci0JfQotCSAgbWVtYmVyID0gbWVtYmVyLT5uZXh0OwotICAgICAgfQotICAgICAgaWYgKCFmb3VuZCkgIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKLQkJbGlzdC0+bmFtZSk7Ci0JbWF5YmVxdWl0KCk7Ci0gICAgICB9Ci0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0gIH0KLX0KLQotCi12b2lkCi1ERUZVTl9WT0lEKGFyX3NhdmUpCi17Ci0KLSAgaWYgKCFvYmZkKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIHsKLSAgICBjaGFyICpvZmlsZW5hbWUgPSB4c3RyZHVwIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0gICAgYmZkX2Nsb3NlKG9iZmQpOwotICAgIAotICAgIHJlbmFtZSAob2ZpbGVuYW1lLCByZWFsX25hbWUpOwotICAgIG9iZmQgPSAwOwotICAgIGZyZWUob2ZpbGVuYW1lKTsKLSAgfQotfQotCi0KLQotdm9pZAotREVGVU4oYXJfcmVwbGFjZSwgKGxpc3QpLAotICAgICAgc3RydWN0IGxpc3QgKmxpc3QpCi17Ci0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIHdoaWxlIChsaXN0KSB7Ci0gICAgICAvKiBGaW5kIHRoaXMgbmFtZSBpbiB0aGUgYXJjaGl2ZSAqLwotICAgICAgYmZkICptZW1iZXIgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gICAgICBiZmQgKipwcmV2ID0gJihvYmZkLT5hcmNoaXZlX2hlYWQpOwotICAgICAgaW50IGZvdW5kID0gMDsKLSAgICAgIHdoaWxlIChtZW1iZXIpIAotICAgICAgewotCWlmIChzdHJjbXAobWVtYmVyLT5maWxlbmFtZSwgbGlzdC0+bmFtZSkgPT0gMCkgCi0JewotCSAgLyogRm91bmQgdGhlIG9uZSB0byByZXBsYWNlICovCi0JICBiZmQgKmFiZmQgPSBiZmRfb3BlbnIobGlzdC0+bmFtZSwgMCk7Ci0JICBpZiAoIWFiZmQpIAotCSAgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwgbGlzdC0+bmFtZSk7Ci0JICAgIG1heWJlcXVpdCgpOwotCSAgfQotCSAgZWxzZSB7Ci0JICAgICpwcmV2ID0gYWJmZDsKLQkgICAgYWJmZC0+bmV4dCA9IG1lbWJlci0+bmV4dDsKLQkgICAgZm91bmQgPSAxOwotCSAgfQotCX0KLQllbHNlIHsKLQkgIHByZXYgPSAmKG1lbWJlci0+bmV4dCk7Ci0JfQotCW1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JYmZkICphYmZkID0gYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQlpZiAoIWFiZmQpIAotCXsKLQkgIGZwcmludGYoc3RkZXJyLCBfKCIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBsaXN0LT5uYW1lKTsKLQkgIG1heWJlcXVpdCgpOwotCX0KLQllbHNlIAotCXsKLQkgICpwcmV2ID0gYWJmZDsKLQl9Ci0gICAgICB9Ci0KLSAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0gIH0KLX0KLQotLyogQW5kIEkgYWRkZWQgdGhpcyBvbmUgKi8KLXZvaWQKLURFRlVOX1ZPSUQoYXJfbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSAKLSAgewotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYmZkICphYmZkOwotICAgIG91dGZpbGUgPSBzdGRvdXQ7Ci0gICAgdmVyYm9zZSA9MSA7Ci0gICAgcHJpbnRmKF8oIkN1cnJlbnQgb3BlbiBhcmNoaXZlIGlzICVzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotICAgIGZvciAoYWJmZCA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLQkgYWJmZCAhPSAoYmZkICopTlVMTDsKLQkgYWJmZCA9IGFiZmQtPm5leHQpIAotICAgIHsKLSAgICAgIGFyX2RpcmVjdG9yeV9kb2VyIChhYmZkLCAoYmZkICopIE5VTEwpOwotICAgIH0KLSAgfQotfQotCi0KLXZvaWQgCi1ERUZVTl9WT0lEKGFyX2VuZCkKLXsKLSAgaWYgKG9iZmQpCi0gIHsKLSAgICBmY2xvc2UoKEZJTEUgKikob2JmZC0+aW9zdHJlYW0pKTsKLSAgICB1bmxpbmsoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotICB9Ci19Ci12b2lkCi1ERUZVTihhcl9leHRyYWN0LChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIAotICB7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gIGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgaW50IGZvdW5kID0gMDsKLSAgICAgIHdoaWxlIChtZW1iZXIgJiYgIWZvdW5kKSAKLSAgICAgIHsKLQlpZiAoc3RyY21wKG1lbWJlci0+ZmlsZW5hbWUsIGxpc3QtPm5hbWUpID09IDApIAotCXsKLQkgIGV4dHJhY3RfZmlsZShtZW1iZXIpOwotCSAgZm91bmQgPSAxOwotCSAgfQotCi0JbWVtYmVyID0gbWVtYmVyLT5uZXh0OwotICAgICAgfQotICAgICAgaWYgKCFmb3VuZCkgIHsKLQliZmRfb3BlbnIobGlzdC0+bmFtZSwgMCk7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCi0JCWxpc3QtPm5hbWUpOwotCi0gICAgICB9Ci0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2Fyc3VwLmggYi9iaW51dGlscy9hcnN1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTRhMzRiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2Fyc3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBhcnN1cC5oIC0gYXJjaGl2ZSBzdXBwb3J0IGhlYWRlciBmaWxlCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgbGlzdCB7Ci0JY2hhciAqbmFtZTsJCi0Jc3RydWN0IGxpc3QgKm5leHQ7Ci19OwotCi12b2lkCi1tYXliZXF1aXQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1wcm9tcHQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9jbGVhciBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLWFyX3JlcGxhY2UgUEFSQU1TICgoc3RydWN0IGxpc3QgKikpOwotCi12b2lkCi1hcl9kZWxldGUgUEFSQU1TICgoc3RydWN0IGxpc3QgKikpOwotCi12b2lkCi1hcl9zYXZlIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotYXJfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLWFyX29wZW4gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLQotdm9pZAotYXJfZGlyZWN0b3J5IFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IGxpc3QgKiwgY2hhciAqKSk7Ci0KLXZvaWQKLWFyX2FkZG1vZCBQQVJBTVMgKChzdHJ1Y3QgbGlzdCAqKSk7Ci0KLXZvaWQKLWFyX2FkZGxpYiBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZCAKLWFyX2VuZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLWFyX2V4dHJhY3QgUEFSQU1TICgoc3RydWN0IGxpc3QgKikpOwotCi1iZmQgKgotb3Blbl9pbmFyY2ggUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaGl2ZV9maWxlbmFtZSwgY29uc3QgY2hhciAqKSk7Ci0KLWludAoteXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZ1bmN0aW9ucyBmcm9tIGFyLmMgKi8KLQotdm9pZAotZXh0cmFjdF9maWxlIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotZXh0ZXJuIGludCBpbnRlcmFjdGl2ZTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2JpbnV0aWxzLnRleGkgYi9iaW51dGlscy9iaW51dGlscy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjFmMGRhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2JpbnV0aWxzLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTg5ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvICAgICAgIEBjICAgICAgICAgICAgICAgICAgICAtKi0gVGV4aW5mbyAtKi0KLUBzZXRmaWxlbmFtZSBiaW51dGlscy5pbmZvCi1AaW5jbHVkZSBjb25maWcudGV4aQotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBCaW51dGlsczogKGJpbnV0aWxzKS4gICAgICAgICBUaGUgR05VIGJpbmFyeSB1dGlsaXRpZXMuCi0qIGFyOiAoYmludXRpbHMpYXIuICAgICAgICAgICAgICAgQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMKLSogbm06IChiaW51dGlscylubS4gICAgICAgICAgICAgICBMaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLSogb2JqY29weTogKGJpbnV0aWxzKW9iamNvcHkuCSAgQ29weSBhbmQgdHJhbnNsYXRlIG9iamVjdCBmaWxlcwotKiBvYmpkdW1wOiAoYmludXRpbHMpb2JqZHVtcC4gICAgIERpc3BsYXkgaW5mb3JtYXRpb24gZnJvbSBvYmplY3QgZmlsZXMKLSogcmFubGliOiAoYmludXRpbHMpcmFubGliLiAgICAgICBHZW5lcmF0ZSBpbmRleCB0byBhcmNoaXZlIGNvbnRlbnRzCi0qIHJlYWRlbGY6IChiaW51dGlscylyZWFkZWxmLgkgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMuCi0qIHNpemU6IChiaW51dGlscylzaXplLiAgICAgICAgICAgTGlzdCBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0qIHN0cmluZ3M6IChiaW51dGlscylzdHJpbmdzLiAgICAgTGlzdCBwcmludGFibGUgc3RyaW5ncyBmcm9tIGZpbGVzCi0qIHN0cmlwOiAoYmludXRpbHMpc3RyaXAuICAgICAgICAgRGlzY2FyZCBzeW1ib2xzCi0qIGMrK2ZpbHQ6IChiaW51dGlscyljKytmaWx0LgkgIEZpbHRlciB0byBkZW1hbmdsZSBlbmNvZGVkIEMrKyBzeW1ib2xzCi0qIGN4eGZpbHQ6IChiaW51dGlscyljKytmaWx0LiAgICAgTVMtRE9TIG5hbWUgZm9yIGMrK2ZpbHQKLSogYWRkcjJsaW5lOiAoYmludXRpbHMpYWRkcjJsaW5lLiBDb252ZXJ0IGFkZHJlc3NlcyB0byBmaWxlIGFuZCBsaW5lCi0qIG5sbWNvbnY6IChiaW51dGlscylubG1jb252LiAgICAgQ29udmVydHMgb2JqZWN0IGNvZGUgaW50byBhbiBOTE0KLSogd2luZHJlczogKGJpbnV0aWxzKXdpbmRyZXMuCSAgTWFuaXB1bGF0ZSBXaW5kb3dzIHJlc291cmNlcwotKiBkbGx0b29sOiAoYmludXRpbHMpZGxsdG9vbC4JICBDcmVhdGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UgRExMcwotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBhIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUBzeW5pbmRleCBreSBjcAotQGMKLUBjIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzICJhciIsICJsZCIsICJvYmpjb3B5IiwKLUBjICAib2JqZHVtcCIsICJubSIsICJzaXplIiwgInN0cmluZ3MiLCAic3RyaXAiLCAicmVhZGVsZiIgYW5kICJyYW5saWIiLgotQGMKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyAKLUBjIFRoaXMgdGV4dCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi1AYyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotQGMKLQotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIEBzY3tnbnV9IEJpbmFyeSBVdGlsaXRpZXMKLUB0aXRsZXBhZ2UKLUBmaW5hbG91dAotQHRpdGxlIFRoZSBAc2N7Z251fSBCaW5hcnkgVXRpbGl0aWVzCi1Ac3VidGl0bGUgVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0KLUBzcCAxCi1Ac3VidGl0bGUgTWF5IDE5OTMKLUBhdXRob3IgUm9sYW5kIEguIFBlc2NoCi1AYXV0aG9yIEplZmZyZXkgTS4gT3NpZXIKLUBhdXRob3IgQ3lnbnVzIFN1cHBvcnQKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQgXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhciBcaGZpbGwKLVxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhciB9Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQG5vZGUgVG9wCi1AdG9wIEludHJvZHVjdGlvbgotCi1AY2luZGV4IHZlcnNpb24KLVRoaXMgYnJpZWYgbWFudWFsIGNvbnRhaW5zIHByZWxpbWluYXJ5IGRvY3VtZW50YXRpb24gZm9yIHRoZSBAc2N7Z251fSBiaW5hcnkKLXV0aWxpdGllcyAoY29sbGVjdGl2ZWx5IHZlcnNpb24gQHZhbHVle1ZFUlNJT059KTogCi0KLUBpZnRleAotQHRhYmxlIEBjb2RlCi1AaXRlbSBhcgotQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMKLQotQGl0ZW0gbm0KLUxpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcwotCi1AaXRlbSBvYmpjb3B5Ci1Db3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCi0KLUBpdGVtIG9iamR1bXAKLURpc3BsYXkgaW5mb3JtYXRpb24gZnJvbSBvYmplY3QgZmlsZXMKLQotQGl0ZW0gcmFubGliCi1HZW5lcmF0ZSBpbmRleCB0byBhcmNoaXZlIGNvbnRlbnRzCi0KLUBpdGVtIHJlYWRlbGYKLURpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMuCi0KLUBpdGVtIHNpemUKLUxpc3QgZmlsZSBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0KLUBpdGVtIHN0cmluZ3MKLUxpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotCi1AaXRlbSBzdHJpcAotRGlzY2FyZCBzeW1ib2xzCi0KLUBpdGVtIGMrK2ZpbHQKLURlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMgKG9uIE1TLURPUywgdGhpcyBwcm9ncmFtIGlzIG5hbWVkCi1AY29kZXtjeHhmaWx0fSkKLQotQGl0ZW0gYWRkcjJsaW5lCi1Db252ZXJ0IGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycwotCi1AaXRlbSBubG1jb252Ci1Db252ZXJ0IG9iamVjdCBjb2RlIGludG8gYSBOZXR3YXJlIExvYWRhYmxlIE1vZHVsZQotCi1AaXRlbSB3aW5kcmVzCi1NYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0KLUBpdGVtIGRsbHRvb2wKLUNyZWF0ZSB0aGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UgRHluYW1pYyBMaW5rIExpYnJhcmllcwotQGVuZCB0YWJsZQotQGVuZCBpZnRleAotCi1AbWVudQotKiBhcjo6ICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcwotKiBubTo6ICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLSogb2JqY29weTo6CQkJQ29weSBhbmQgdHJhbnNsYXRlIG9iamVjdCBmaWxlcwotKiBvYmpkdW1wOjogICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzCi0qIHJhbmxpYjo6ICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGluZGV4IHRvIGFyY2hpdmUgY29udGVudHMKLSogcmVhZGVsZjo6CQkJRGlzcGxheSB0aGUgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlcy4KLSogc2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0qIHN0cmluZ3M6OiAgICAgICAgICAgICAgICAgICAgIExpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotKiBzdHJpcDo6ICAgICAgICAgICAgICAgICAgICAgICBEaXNjYXJkIHN5bWJvbHMKLSogYysrZmlsdDo6CQkJRmlsdGVyIHRvIGRlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMKLSogY3h4ZmlsdDogYysrZmlsdC4gICAgICAgICAgICAgTVMtRE9TIG5hbWUgZm9yIGMrK2ZpbHQKLSogYWRkcjJsaW5lOjoJCQlDb252ZXJ0IGFkZHJlc3NlcyB0byBmaWxlIGFuZCBsaW5lCi0qIG5sbWNvbnY6OiAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRzIG9iamVjdCBjb2RlIGludG8gYW4gTkxNCi0qIHdpbmRyZXM6OgkJCU1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKLSogZGxsdG9vbDo6CQkJQ3JlYXRlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIERMTHMKLSogU2VsZWN0aW5nIFRoZSBUYXJnZXQgU3lzdGVtOjogSG93IHRoZXNlIHV0aWxpdGllcyBkZXRlcm1pbmUgdGhlIHRhcmdldC4KLSogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotCi1Abm9kZSBhcgotQGNoYXB0ZXIgYXIKLQotQGtpbmRleCBhcgotQGNpbmRleCBhcmNoaXZlcwotQGNpbmRleCBjb2xsZWN0aW9ucyBvZiBmaWxlcwotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV0gW0B2YXJ7Y291bnR9XV0gQHZhcnthcmNoaXZlfSBbQHZhcnttZW1iZXJ9QGRvdHN7fV0KLWFyIC1NIFsgPG1yaS1zY3JpcHQgXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzY3tnbnV9IEBjb2Rle2FyfSBwcm9ncmFtIGNyZWF0ZXMsIG1vZGlmaWVzLCBhbmQgZXh0cmFjdHMgZnJvbQotYXJjaGl2ZXMuICBBbiBAZGZue2FyY2hpdmV9IGlzIGEgc2luZ2xlIGZpbGUgaG9sZGluZyBhIGNvbGxlY3Rpb24gb2YKLW90aGVyIGZpbGVzIGluIGEgc3RydWN0dXJlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gcmV0cmlldmUKLXRoZSBvcmlnaW5hbCBpbmRpdmlkdWFsIGZpbGVzIChjYWxsZWQgQGRmbnttZW1iZXJzfSBvZiB0aGUgYXJjaGl2ZSkuCi0KLVRoZSBvcmlnaW5hbCBmaWxlcycgY29udGVudHMsIG1vZGUgKHBlcm1pc3Npb25zKSwgdGltZXN0YW1wLCBvd25lciwgYW5kCi1ncm91cCBhcmUgcHJlc2VydmVkIGluIHRoZSBhcmNoaXZlLCBhbmQgY2FuIGJlIHJlc3RvcmVkIG9uCi1leHRyYWN0aW9uLiAgCi0KLUBjaW5kZXggbmFtZSBsZW5ndGgKLUBzY3tnbnV9IEBjb2Rle2FyfSBjYW4gbWFpbnRhaW4gYXJjaGl2ZXMgd2hvc2UgbWVtYmVycyBoYXZlIG5hbWVzIG9mIGFueQotbGVuZ3RoOyBob3dldmVyLCBkZXBlbmRpbmcgb24gaG93IEBjb2Rle2FyfSBpcyBjb25maWd1cmVkIG9uIHlvdXIKLXN5c3RlbSwgYSBsaW1pdCBvbiBtZW1iZXItbmFtZSBsZW5ndGggbWF5IGJlIGltcG9zZWQgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggYXJjaGl2ZSBmb3JtYXRzIG1haW50YWluZWQgd2l0aCBvdGhlciB0b29scy4gIElmIGl0IGV4aXN0cywgdGhlCi1saW1pdCBpcyBvZnRlbiAxNSBjaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBhLm91dCkgb3IgMTYKLWNoYXJhY3RlcnMgKHR5cGljYWwgb2YgZm9ybWF0cyByZWxhdGVkIHRvIGNvZmYpLgotCi1AY2luZGV4IGxpYnJhcmllcwotQGNvZGV7YXJ9IGlzIGNvbnNpZGVyZWQgYSBiaW5hcnkgdXRpbGl0eSBiZWNhdXNlIGFyY2hpdmVzIG9mIHRoaXMgc29ydAotYXJlIG1vc3Qgb2Z0ZW4gdXNlZCBhcyBAZGZue2xpYnJhcmllc30gaG9sZGluZyBjb21tb25seSBuZWVkZWQKLXN1YnJvdXRpbmVzLgotCi1AY2luZGV4IHN5bWJvbCBpbmRleAotQGNvZGV7YXJ9IGNyZWF0ZXMgYW4gaW5kZXggdG8gdGhlIHN5bWJvbHMgZGVmaW5lZCBpbiByZWxvY2F0YWJsZQotb2JqZWN0IG1vZHVsZXMgaW4gdGhlIGFyY2hpdmUgd2hlbiB5b3Ugc3BlY2lmeSB0aGUgbW9kaWZpZXIgQHNhbXB7c30uCi1PbmNlIGNyZWF0ZWQsIHRoaXMgaW5kZXggaXMgdXBkYXRlZCBpbiB0aGUgYXJjaGl2ZSB3aGVuZXZlciBAY29kZXthcn0KLW1ha2VzIGEgY2hhbmdlIHRvIGl0cyBjb250ZW50cyAoc2F2ZSBmb3IgdGhlIEBzYW1we3F9IHVwZGF0ZSBvcGVyYXRpb24pLgotQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotCi1Zb3UgbWF5IHVzZSBAc2FtcHtubSAtc30gb3IgQHNhbXB7bm0gLS1wcmludC1hcm1hcH0gdG8gbGlzdCB0aGlzIGluZGV4Ci10YWJsZS4gIElmIGFuIGFyY2hpdmUgbGFja3MgdGhlIHRhYmxlLCBhbm90aGVyIGZvcm0gb2YgQGNvZGV7YXJ9IGNhbGxlZAotQGNvZGV7cmFubGlifSBjYW4gYmUgdXNlZCB0byBhZGQganVzdCB0aGUgdGFibGUuCi0KLUBjaW5kZXggY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1AY2luZGV4IEBjb2Rle2FyfSBjb21wYXRpYmlsaXR5Ci1Ac2N7Z251fSBAY29kZXthcn0gaXMgZGVzaWduZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHR3byBkaWZmZXJlbnQKLWZhY2lsaXRpZXMuICBZb3UgY2FuIGNvbnRyb2wgaXRzIGFjdGl2aXR5IHVzaW5nIGNvbW1hbmQtbGluZSBvcHRpb25zLAotbGlrZSB0aGUgZGlmZmVyZW50IHZhcmlldGllcyBvZiBAY29kZXthcn0gb24gVW5peCBzeXN0ZW1zOyBvciwgaWYgeW91Ci1zcGVjaWZ5IHRoZSBzaW5nbGUgY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0sIHlvdSBjYW4gY29udHJvbCBpdAotd2l0aCBhIHNjcmlwdCBzdXBwbGllZCB2aWEgc3RhbmRhcmQgaW5wdXQsIGxpa2UgdGhlIE1SSSBgYGxpYnJhcmlhbicnCi1wcm9ncmFtLgotCi1AbWVudQotKiBhciBjbWRsaW5lOjogICAgICAgICAgICAgICAgICBDb250cm9sbGluZyBAY29kZXthcn0gb24gdGhlIGNvbW1hbmQgbGluZQotKiBhciBzY3JpcHRzOjogICAgICAgICAgICAgICAgICBDb250cm9sbGluZyBAY29kZXthcn0gd2l0aCBhIHNjcmlwdAotQGVuZCBtZW51Ci0KLUBwYWdlCi1Abm9kZSBhciBjbWRsaW5lCi1Ac2VjdGlvbiBDb250cm9sbGluZyBAY29kZXthcn0gb24gdGhlIGNvbW1hbmQgbGluZQotCi1Ac21hbGxleGFtcGxlCi1hciBbLV1AdmFye3B9W0B2YXJ7bW9kfSBbQHZhcntyZWxwb3N9XSBbQHZhcntjb3VudH1dXSBAdmFye2FyY2hpdmV9IFtAdmFye21lbWJlcn1AZG90c3t9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBVbml4IGNvbXBhdGliaWxpdHksIEBjb2Rle2FyfQotV2hlbiB5b3UgdXNlIEBjb2Rle2FyfSBpbiB0aGUgVW5peCBzdHlsZSwgQGNvZGV7YXJ9IGluc2lzdHMgb24gYXQgbGVhc3QgdHdvCi1hcmd1bWVudHMgdG8gZXhlY3V0ZTogb25lIGtleWxldHRlciBzcGVjaWZ5aW5nIHRoZSBAZW1waHtvcGVyYXRpb259Ci0ob3B0aW9uYWxseSBhY2NvbXBhbmllZCBieSBvdGhlciBrZXlsZXR0ZXJzIHNwZWNpZnlpbmcKLUBlbXBoe21vZGlmaWVyc30pLCBhbmQgdGhlIGFyY2hpdmUgbmFtZSB0byBhY3Qgb24uCi0KLU1vc3Qgb3BlcmF0aW9ucyBjYW4gYWxzbyBhY2NlcHQgZnVydGhlciBAdmFye21lbWJlcn0gYXJndW1lbnRzLAotc3BlY2lmeWluZyBwYXJ0aWN1bGFyIGZpbGVzIHRvIG9wZXJhdGUgb24uCi0KLUBzY3tnbnV9IEBjb2Rle2FyfSBhbGxvd3MgeW91IHRvIG1peCB0aGUgb3BlcmF0aW9uIGNvZGUgQHZhcntwfSBhbmQgbW9kaWZpZXIKLWZsYWdzIEB2YXJ7bW9kfSBpbiBhbnkgb3JkZXIsIHdpdGhpbiB0aGUgZmlyc3QgY29tbWFuZC1saW5lIGFyZ3VtZW50LgotCi1JZiB5b3Ugd2lzaCwgeW91IG1heSBiZWdpbiB0aGUgZmlyc3QgY29tbWFuZC1saW5lIGFyZ3VtZW50IHdpdGggYQotZGFzaC4KLQotQGNpbmRleCBvcGVyYXRpb25zIG9uIGFyY2hpdmUKLVRoZSBAdmFye3B9IGtleWxldHRlciBzcGVjaWZpZXMgd2hhdCBvcGVyYXRpb24gdG8gZXhlY3V0ZTsgaXQgbWF5IGJlCi1hbnkgb2YgdGhlIGZvbGxvd2luZywgYnV0IHlvdSBtdXN0IHNwZWNpZnkgb25seSBvbmUgb2YgdGhlbToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBkCi1AY2luZGV4IGRlbGV0aW5nIGZyb20gYXJjaGl2ZQotQGVtcGh7RGVsZXRlfSBtb2R1bGVzIGZyb20gdGhlIGFyY2hpdmUuICBTcGVjaWZ5IHRoZSBuYW1lcyBvZiBtb2R1bGVzIHRvCi1iZSBkZWxldGVkIGFzIEB2YXJ7bWVtYmVyfUBkb3Rze307IHRoZSBhcmNoaXZlIGlzIHVudG91Y2hlZCBpZiB5b3UKLXNwZWNpZnkgbm8gZmlsZXMgdG8gZGVsZXRlLgotCi1JZiB5b3Ugc3BlY2lmeSB0aGUgQHNhbXB7dn0gbW9kaWZpZXIsIEBjb2Rle2FyfSBsaXN0cyBlYWNoIG1vZHVsZQotYXMgaXQgaXMgZGVsZXRlZC4KLQotQGl0ZW0gbQotQGNpbmRleCBtb3ZpbmcgaW4gYXJjaGl2ZQotVXNlIHRoaXMgb3BlcmF0aW9uIHRvIEBlbXBoe21vdmV9IG1lbWJlcnMgaW4gYW4gYXJjaGl2ZS4KLQotVGhlIG9yZGVyaW5nIG9mIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZSBjYW4gbWFrZSBhIGRpZmZlcmVuY2UgaW4gaG93Ci1wcm9ncmFtcyBhcmUgbGlua2VkIHVzaW5nIHRoZSBsaWJyYXJ5LCBpZiBhIHN5bWJvbCBpcyBkZWZpbmVkIGluIG1vcmUKLXRoYW4gb25lIG1lbWJlci4gIAotCi1JZiBubyBtb2RpZmllcnMgYXJlIHVzZWQgd2l0aCBAY29kZXttfSwgYW55IG1lbWJlcnMgeW91IG5hbWUgaW4gdGhlCi1AdmFye21lbWJlcn0gYXJndW1lbnRzIGFyZSBtb3ZlZCB0byB0aGUgQGVtcGh7ZW5kfSBvZiB0aGUgYXJjaGl2ZTsKLXlvdSBjYW4gdXNlIHRoZSBAc2FtcHthfSwgQHNhbXB7Yn0sIG9yIEBzYW1we2l9IG1vZGlmaWVycyB0byBtb3ZlIHRoZW0gdG8gYQotc3BlY2lmaWVkIHBsYWNlIGluc3RlYWQuCi0KLUBpdGVtIHAKLUBjaW5kZXggcHJpbnRpbmcgZnJvbSBhcmNoaXZlCi1AZW1waHtQcmludH0gdGhlIHNwZWNpZmllZCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLCB0byB0aGUgc3RhbmRhcmQKLW91dHB1dCBmaWxlLiAgSWYgdGhlIEBzYW1we3Z9IG1vZGlmaWVyIGlzIHNwZWNpZmllZCwgc2hvdyB0aGUgbWVtYmVyCi1uYW1lIGJlZm9yZSBjb3B5aW5nIGl0cyBjb250ZW50cyB0byBzdGFuZGFyZCBvdXRwdXQuCi0KLUlmIHlvdSBzcGVjaWZ5IG5vIEB2YXJ7bWVtYmVyfSBhcmd1bWVudHMsIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUgYXJlCi1wcmludGVkLgotCi1AaXRlbSBxCi1AY2luZGV4IHF1aWNrIGFwcGVuZCB0byBhcmNoaXZlCi1AZW1waHtRdWljayBhcHBlbmR9OyBIaXN0b3JpY2FsbHksIGFkZCB0aGUgZmlsZXMgQHZhcnttZW1iZXJ9QGRvdHN7fSB0byB0aGUgZW5kIG9mCi1AdmFye2FyY2hpdmV9LCB3aXRob3V0IGNoZWNraW5nIGZvciByZXBsYWNlbWVudC4KLQotVGhlIG1vZGlmaWVycyBAc2FtcHthfSwgQHNhbXB7Yn0sIGFuZCBAc2FtcHtpfSBkbyBAZW1waHtub3R9IGFmZmVjdCB0aGlzCi1vcGVyYXRpb247IG5ldyBtZW1iZXJzIGFyZSBhbHdheXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuCi0KLVRoZSBtb2RpZmllciBAc2FtcHt2fSBtYWtlcyBAY29kZXthcn0gbGlzdCBlYWNoIGZpbGUgYXMgaXQgaXMgYXBwZW5kZWQuCi0KLVNpbmNlIHRoZSBwb2ludCBvZiB0aGlzIG9wZXJhdGlvbiBpcyBzcGVlZCwgdGhlIGFyY2hpdmUncyBzeW1ib2wgdGFibGUKLWluZGV4IGlzIG5vdCB1cGRhdGVkLCBldmVuIGlmIGl0IGFscmVhZHkgZXhpc3RlZDsgeW91IGNhbiB1c2UgQHNhbXB7YXIgc30gb3IKLUBjb2Rle3JhbmxpYn0gZXhwbGljaXRseSB0byB1cGRhdGUgdGhlIHN5bWJvbCB0YWJsZSBpbmRleC4KLQotSG93ZXZlciwgdG9vIG1hbnkgZGlmZmVyZW50IHN5c3RlbXMgYXNzdW1lIHF1aWNrIGFwcGVuZCByZWJ1aWxkcyB0aGUKLWluZGV4LCBzbyBHTlUgYXIgaW1wbGVtZW50cyBAY29kZXtxfSBhcyBhIHN5bm9ueW0gZm9yIEBjb2Rle3J9LgotCi1AaXRlbSByCi1AY2luZGV4IHJlcGxhY2VtZW50IGluIGFyY2hpdmUKLUluc2VydCB0aGUgZmlsZXMgQHZhcnttZW1iZXJ9QGRvdHN7fSBpbnRvIEB2YXJ7YXJjaGl2ZX0gKHdpdGgKLUBlbXBoe3JlcGxhY2VtZW50fSkuIFRoaXMgb3BlcmF0aW9uIGRpZmZlcnMgZnJvbSBAc2FtcHtxfSBpbiB0aGF0IGFueQotcHJldmlvdXNseSBleGlzdGluZyBtZW1iZXJzIGFyZSBkZWxldGVkIGlmIHRoZWlyIG5hbWVzIG1hdGNoIHRob3NlIGJlaW5nCi1hZGRlZC4KLQotSWYgb25lIG9mIHRoZSBmaWxlcyBuYW1lZCBpbiBAdmFye21lbWJlcn1AZG90c3t9IGRvZXMgbm90IGV4aXN0LCBAY29kZXthcn0KLWRpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCBsZWF2ZXMgdW5kaXN0dXJiZWQgYW55IGV4aXN0aW5nIG1lbWJlcnMKLW9mIHRoZSBhcmNoaXZlIG1hdGNoaW5nIHRoYXQgbmFtZS4KLQotQnkgZGVmYXVsdCwgbmV3IG1lbWJlcnMgYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGU7IGJ1dCB5b3UgbWF5Ci11c2Ugb25lIG9mIHRoZSBtb2RpZmllcnMgQHNhbXB7YX0sIEBzYW1we2J9LCBvciBAc2FtcHtpfSB0byByZXF1ZXN0Ci1wbGFjZW1lbnQgcmVsYXRpdmUgdG8gc29tZSBleGlzdGluZyBtZW1iZXIuCi0KLVRoZSBtb2RpZmllciBAc2FtcHt2fSB1c2VkIHdpdGggdGhpcyBvcGVyYXRpb24gZWxpY2l0cyBhIGxpbmUgb2YKLW91dHB1dCBmb3IgZWFjaCBmaWxlIGluc2VydGVkLCBhbG9uZyB3aXRoIG9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHthfSBvcgotQHNhbXB7cn0gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZmlsZSB3YXMgYXBwZW5kZWQgKG5vIG9sZCBtZW1iZXIKLWRlbGV0ZWQpIG9yIHJlcGxhY2VkLgotCi1AaXRlbSB0Ci1AY2luZGV4IGNvbnRlbnRzIG9mIGFyY2hpdmUKLURpc3BsYXkgYSBAZW1waHt0YWJsZX0gbGlzdGluZyB0aGUgY29udGVudHMgb2YgQHZhcnthcmNoaXZlfSwgb3IgdGhvc2UKLW9mIHRoZSBmaWxlcyBsaXN0ZWQgaW4gQHZhcnttZW1iZXJ9QGRvdHN7fSB0aGF0IGFyZSBwcmVzZW50IGluIHRoZQotYXJjaGl2ZS4gIE5vcm1hbGx5IG9ubHkgdGhlIG1lbWJlciBuYW1lIGlzIHNob3duOyBpZiB5b3UgYWxzbyB3YW50IHRvCi1zZWUgdGhlIG1vZGVzIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGdyb3VwLCBhbmQgc2l6ZSwgeW91IGNhbgotcmVxdWVzdCB0aGF0IGJ5IGFsc28gc3BlY2lmeWluZyB0aGUgQHNhbXB7dn0gbW9kaWZpZXIuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIEB2YXJ7bWVtYmVyfSwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCi1hcmUgbGlzdGVkLgotCi1AY2luZGV4IHJlcGVhdGVkIG5hbWVzIGluIGFyY2hpdmUKLUBjaW5kZXggbmFtZSBkdXBsaWNhdGlvbiBpbiBhcmNoaXZlCi1JZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIChzYXksIEBzYW1we2ZpZX0pIGluCi1hbiBhcmNoaXZlIChzYXkgQHNhbXB7Yi5hfSksIEBzYW1we2FyIHQgYi5hIGZpZX0gbGlzdHMgb25seSB0aGUKLWZpcnN0IGluc3RhbmNlOyB0byBzZWUgdGhlbSBhbGwsIHlvdSBtdXN0IGFzayBmb3IgYSBjb21wbGV0ZQotbGlzdGluZy0tLWluIG91ciBleGFtcGxlLCBAc2FtcHthciB0IGIuYX0uCi1AYyBXUlMgb25seTsgcGVyIEd1bWJ5LCB0aGlzIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCwgYW5kIGluIGEgbW9yZQotQGMgcmVjZW50IGNhc2UgaW4gZmFjdCB3b3JrcyB0aGUgb3RoZXIgd2F5LgotCi1AaXRlbSB4Ci1AY2luZGV4IGV4dHJhY3QgZnJvbSBhcmNoaXZlCi1AZW1waHtFeHRyYWN0fSBtZW1iZXJzIChuYW1lZCBAdmFye21lbWJlcn0pIGZyb20gdGhlIGFyY2hpdmUuICBZb3UgY2FuCi11c2UgdGhlIEBzYW1we3Z9IG1vZGlmaWVyIHdpdGggdGhpcyBvcGVyYXRpb24sIHRvIHJlcXVlc3QgdGhhdAotQGNvZGV7YXJ9IGxpc3QgZWFjaCBuYW1lIGFzIGl0IGV4dHJhY3RzIGl0LgotCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBAdmFye21lbWJlcn0sIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotYXJlIGV4dHJhY3RlZC4KLQotQGVuZCB0YWJsZQotCi1BIG51bWJlciBvZiBtb2RpZmllcnMgKEB2YXJ7bW9kfSkgbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgQHZhcntwfQota2V5bGV0dGVyLCB0byBzcGVjaWZ5IHZhcmlhdGlvbnMgb24gYW4gb3BlcmF0aW9uJ3MgYmVoYXZpb3I6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gYQotQGNpbmRleCByZWxhdGl2ZSBwbGFjZW1lbnQgaW4gYXJjaGl2ZQotQWRkIG5ldyBmaWxlcyBAZW1waHthZnRlcn0gYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIEBzYW1we2F9LCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBAdmFye3JlbHBvc30gYXJndW1lbnQsIGJlZm9yZSB0aGUKLUB2YXJ7YXJjaGl2ZX0gc3BlY2lmaWNhdGlvbi4KLQotQGl0ZW0gYgotQWRkIG5ldyBmaWxlcyBAZW1waHtiZWZvcmV9IGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBAc2FtcHtifSwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgQHZhcntyZWxwb3N9IGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1AdmFye2FyY2hpdmV9IHNwZWNpZmljYXRpb24uICAoc2FtZSBhcyBAc2FtcHtpfSkuCi0KLUBpdGVtIGMKLUBjaW5kZXggY3JlYXRpbmcgYXJjaGl2ZXMKLUBlbXBoe0NyZWF0ZX0gdGhlIGFyY2hpdmUuICBUaGUgc3BlY2lmaWVkIEB2YXJ7YXJjaGl2ZX0gaXMgYWx3YXlzCi1jcmVhdGVkIGlmIGl0IGRpZCBub3QgZXhpc3QsIHdoZW4geW91IHJlcXVlc3QgYW4gdXBkYXRlLiAgQnV0IGEgd2FybmluZyBpcwotaXNzdWVkIHVubGVzcyB5b3Ugc3BlY2lmeSBpbiBhZHZhbmNlIHRoYXQgeW91IGV4cGVjdCB0byBjcmVhdGUgaXQsIGJ5Ci11c2luZyB0aGlzIG1vZGlmaWVyLgotCi1AaXRlbSBmCi1UcnVuY2F0ZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4gIEBzY3tnbnV9IEBjb2Rle2FyfSB3aWxsIG5vcm1hbGx5IHBlcm1pdCBmaWxlCi1uYW1lcyBvZiBhbnkgbGVuZ3RoLiAgVGhpcyB3aWxsIGNhdXNlIGl0IHRvIGNyZWF0ZSBhcmNoaXZlcyB3aGljaCBhcmUKLW5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5hdGl2ZSBAY29kZXthcn0gcHJvZ3JhbSBvbiBzb21lIHN5c3RlbXMuICBJZgotdGhpcyBpcyBhIGNvbmNlcm4sIHRoZSBAc2FtcHtmfSBtb2RpZmllciBtYXkgYmUgdXNlZCB0byB0cnVuY2F0ZSBmaWxlCi1uYW1lcyB3aGVuIHB1dHRpbmcgdGhlbSBpbiB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gaQotSW5zZXJ0IG5ldyBmaWxlcyBAZW1waHtiZWZvcmV9IGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBAc2FtcHtpfSwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgQHZhcntyZWxwb3N9IGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1AdmFye2FyY2hpdmV9IHNwZWNpZmljYXRpb24uICAoc2FtZSBhcyBAc2FtcHtifSkuCi0KLUBpdGVtIGwKLVRoaXMgbW9kaWZpZXIgaXMgYWNjZXB0ZWQgYnV0IG5vdCB1c2VkLgotQGMgd2hhZmZvciBhciBsIG1vZGlmaWVyPz8/IHByZXN1bWFibHkgY29tcGF0OyB3aXRoCi1AYyB3aGF0Pz8/LS0tZG9jQEBjeWdudXMuY29tLCAyNWphbjkxIAotCi1AaXRlbSBOCi1Vc2VzIHRoZSBAdmFye2NvdW50fSBwYXJhbWV0ZXIuICBUaGlzIGlzIHVzZWQgaWYgdGhlcmUgYXJlIG11bHRpcGxlCi1lbnRyaWVzIGluIHRoZSBhcmNoaXZlIHdpdGggdGhlIHNhbWUgbmFtZS4gIEV4dHJhY3Qgb3IgZGVsZXRlIGluc3RhbmNlCi1AdmFye2NvdW50fSBvZiB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoZSBhcmNoaXZlLgotCi1AaXRlbSBvCi1AY2luZGV4IGRhdGVzIGluIGFyY2hpdmUKLVByZXNlcnZlIHRoZSBAZW1waHtvcmlnaW5hbH0gZGF0ZXMgb2YgbWVtYmVycyB3aGVuIGV4dHJhY3RpbmcgdGhlbS4gIElmCi15b3UgZG8gbm90IHNwZWNpZnkgdGhpcyBtb2RpZmllciwgZmlsZXMgZXh0cmFjdGVkIGZyb20gdGhlIGFyY2hpdmUKLWFyZSBzdGFtcGVkIHdpdGggdGhlIHRpbWUgb2YgZXh0cmFjdGlvbi4KLQotQGl0ZW0gUAotVXNlIHRoZSBmdWxsIHBhdGggbmFtZSB3aGVuIG1hdGNoaW5nIG5hbWVzIGluIHRoZSBhcmNoaXZlLiAgQHNje2dudX0KLUBjb2Rle2FyfSBjYW4gbm90IGNyZWF0ZSBhbiBhcmNoaXZlIHdpdGggYSBmdWxsIHBhdGggbmFtZSAoc3VjaCBhcmNoaXZlcwotYXJlIG5vdCBQT1NJWCBjb21wbGFpbnQpLCBidXQgb3RoZXIgYXJjaGl2ZSBjcmVhdG9ycyBjYW4uICBUaGlzIG9wdGlvbgotd2lsbCBjYXVzZSBAc2N7Z251fSBAY29kZXthcn0gdG8gbWF0Y2ggZmlsZSBuYW1lcyB1c2luZyBhIGNvbXBsZXRlIHBhdGgKLW5hbWUsIHdoaWNoIGNhbiBiZSBjb252ZW5pZW50IHdoZW4gZXh0cmFjdGluZyBhIHNpbmdsZSBmaWxlIGZyb20gYW4KLWFyY2hpdmUgY3JlYXRlZCBieSBhbm90aGVyIHRvb2wuCi0KLUBpdGVtIHMKLUBjaW5kZXggd3JpdGluZyBhcmNoaXZlIGluZGV4Ci1Xcml0ZSBhbiBvYmplY3QtZmlsZSBpbmRleCBpbnRvIHRoZSBhcmNoaXZlLCBvciB1cGRhdGUgYW4gZXhpc3Rpbmcgb25lLAotZXZlbiBpZiBubyBvdGhlciBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgYXJjaGl2ZS4gIFlvdSBtYXkgdXNlIHRoaXMgbW9kaWZpZXIKLWZsYWcgZWl0aGVyIHdpdGggYW55IG9wZXJhdGlvbiwgb3IgYWxvbmUuICBSdW5uaW5nIEBzYW1we2FyIHN9IG9uIGFuCi1hcmNoaXZlIGlzIGVxdWl2YWxlbnQgdG8gcnVubmluZyBAc2FtcHtyYW5saWJ9IG9uIGl0LgotCi1AaXRlbSBTCi1AY2luZGV4IG5vdCB3cml0aW5nIGFyY2hpdmUgaW5kZXgKLURvIG5vdCBnZW5lcmF0ZSBhbiBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY2FuIHNwZWVkIHVwIGJ1aWxkaW5nIGEKLWxhcmdlIGxpYnJhcnkgaW4gc2V2ZXJhbCBzdGVwcy4gIFRoZSByZXN1bHRpbmcgYXJjaGl2ZSBjYW4gbm90IGJlIHVzZWQKLXdpdGggdGhlIGxpbmtlci4gIEluIG9yZGVyIHRvIGJ1aWxkIGEgc3ltYm9sIHRhYmxlLCB5b3UgbXVzdCBvbWl0IHRoZQotQHNhbXB7U30gbW9kaWZpZXIgb24gdGhlIGxhc3QgZXhlY3V0aW9uIG9mIEBzYW1we2FyfSwgb3IgeW91IG11c3QgcnVuCi1Ac2FtcHtyYW5saWJ9IG9uIHRoZSBhcmNoaXZlLgotCi1AaXRlbSB1Ci1AY2luZGV4IHVwZGF0aW5nIGFuIGFyY2hpdmUKLU5vcm1hbGx5LCBAc2FtcHthciByfUBkb3Rze30gaW5zZXJ0cyBhbGwgZmlsZXMKLWxpc3RlZCBpbnRvIHRoZSBhcmNoaXZlLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5zZXJ0IEBlbXBoe29ubHl9IHRob3NlCi1vZiB0aGUgZmlsZXMgeW91IGxpc3QgdGhhdCBhcmUgbmV3ZXIgdGhhbiBleGlzdGluZyBtZW1iZXJzIG9mIHRoZSBzYW1lCi1uYW1lcywgdXNlIHRoaXMgbW9kaWZpZXIuICBUaGUgQHNhbXB7dX0gbW9kaWZpZXIgaXMgYWxsb3dlZCBvbmx5IGZvciB0aGUKLW9wZXJhdGlvbiBAc2FtcHtyfSAocmVwbGFjZSkuICBJbiBwYXJ0aWN1bGFyLCB0aGUgY29tYmluYXRpb24gQHNhbXB7cXV9IGlzCi1ub3QgYWxsb3dlZCwgc2luY2UgY2hlY2tpbmcgdGhlIHRpbWVzdGFtcHMgd291bGQgbG9zZSBhbnkgc3BlZWQKLWFkdmFudGFnZSBmcm9tIHRoZSBvcGVyYXRpb24gQHNhbXB7cX0uCi0KLUBpdGVtIHYKLVRoaXMgbW9kaWZpZXIgcmVxdWVzdHMgdGhlIEBlbXBoe3ZlcmJvc2V9IHZlcnNpb24gb2YgYW4gb3BlcmF0aW9uLiAgTWFueQotb3BlcmF0aW9ucyBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHN1Y2ggYXMgZmlsZW5hbWVzIHByb2Nlc3NlZCwKLXdoZW4gdGhlIG1vZGlmaWVyIEBzYW1we3Z9IGlzIGFwcGVuZGVkLgotCi1AaXRlbSBWCi1UaGlzIG1vZGlmaWVyIHNob3dzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXthcn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIGFyIHNjcmlwdHMKLUBzZWN0aW9uIENvbnRyb2xsaW5nIEBjb2Rle2FyfSB3aXRoIGEgc2NyaXB0Ci0KLUBzbWFsbGV4YW1wbGUKLWFyIC1NIFsgPEB2YXJ7c2NyaXB0fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IE1SSSBjb21wYXRpYmlsaXR5LCBAY29kZXthcn0KLUBjaW5kZXggc2NyaXB0cywgQGNvZGV7YXJ9Ci1JZiB5b3UgdXNlIHRoZSBzaW5nbGUgY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0gd2l0aCBAY29kZXthcn0sIHlvdQotY2FuIGNvbnRyb2wgaXRzIG9wZXJhdGlvbiB3aXRoIGEgcnVkaW1lbnRhcnkgY29tbWFuZCBsYW5ndWFnZS4gIFRoaXMKLWZvcm0gb2YgQGNvZGV7YXJ9IG9wZXJhdGVzIGludGVyYWN0aXZlbHkgaWYgc3RhbmRhcmQgaW5wdXQgaXMgY29taW5nCi1kaXJlY3RseSBmcm9tIGEgdGVybWluYWwuICBEdXJpbmcgaW50ZXJhY3RpdmUgdXNlLCBAY29kZXthcn0gcHJvbXB0cyBmb3IKLWlucHV0ICh0aGUgcHJvbXB0IGlzIEBzYW1we0FSID59KSwgYW5kIGNvbnRpbnVlcyBleGVjdXRpbmcgZXZlbiBhZnRlcgotZXJyb3JzLiAgSWYgeW91IHJlZGlyZWN0IHN0YW5kYXJkIGlucHV0IHRvIGEgc2NyaXB0IGZpbGUsIG5vIHByb21wdHMgYXJlCi1pc3N1ZWQsIGFuZCBAY29kZXthcn0gYWJhbmRvbnMgZXhlY3V0aW9uICh3aXRoIGEgbm9uemVybyBleGl0IGNvZGUpCi1vbiBhbnkgZXJyb3IuCi0KLVRoZSBAY29kZXthcn0gY29tbWFuZCBsYW5ndWFnZSBpcyBAZW1waHtub3R9IGRlc2lnbmVkIHRvIGJlIGVxdWl2YWxlbnQKLXRvIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9uczsgaW4gZmFjdCwgaXQgcHJvdmlkZXMgc29tZXdoYXQgbGVzcyBjb250cm9sCi1vdmVyIGFyY2hpdmVzLiAgVGhlIG9ubHkgcHVycG9zZSBvZiB0aGUgY29tbWFuZCBsYW5ndWFnZSBpcyB0byBlYXNlIHRoZQotdHJhbnNpdGlvbiB0byBAc2N7Z251fSBAY29kZXthcn0gZm9yIGRldmVsb3BlcnMgd2hvIGFscmVhZHkgaGF2ZSBzY3JpcHRzCi13cml0dGVuIGZvciB0aGUgTVJJIGBgbGlicmFyaWFuJycgcHJvZ3JhbS4KLQotVGhlIHN5bnRheCBmb3IgdGhlIEBjb2Rle2FyfSBjb21tYW5kIGxhbmd1YWdlIGlzIHN0cmFpZ2h0Zm9yd2FyZDoKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1jb21tYW5kcyBhcmUgcmVjb2duaXplZCBpbiB1cHBlciBvciBsb3dlciBjYXNlOyBmb3IgZXhhbXBsZSwgQGNvZGV7TElTVH0KLWlzIHRoZSBzYW1lIGFzIEBjb2Rle2xpc3R9LiAgSW4gdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbnMsIGNvbW1hbmRzIGFyZQotc2hvd24gaW4gdXBwZXIgY2FzZSBmb3IgY2xhcml0eS4KLQotQGl0ZW0KLWEgc2luZ2xlIGNvbW1hbmQgbWF5IGFwcGVhciBvbiBlYWNoIGxpbmU7IGl0IGlzIHRoZSBmaXJzdCB3b3JkIG9uIHRoZQotbGluZS4KLQotQGl0ZW0KLWVtcHR5IGxpbmVzIGFyZSBhbGxvd2VkLCBhbmQgaGF2ZSBubyBlZmZlY3QuCi0KLUBpdGVtCi1jb21tZW50cyBhcmUgYWxsb3dlZDsgdGV4dCBhZnRlciBlaXRoZXIgb2YgdGhlIGNoYXJhY3RlcnMgQHNhbXB7Kn0KLW9yIEBzYW1wezt9IGlzIGlnbm9yZWQuCi0KLUBpdGVtCi1XaGVuZXZlciB5b3UgdXNlIGEgbGlzdCBvZiBuYW1lcyBhcyBwYXJ0IG9mIHRoZSBhcmd1bWVudCB0byBhbiBAY29kZXthcn0KLWNvbW1hbmQsIHlvdSBjYW4gc2VwYXJhdGUgdGhlIGluZGl2aWR1YWwgbmFtZXMgd2l0aCBlaXRoZXIgY29tbWFzIG9yCi1ibGFua3MuICBDb21tYXMgYXJlIHNob3duIGluIHRoZSBleHBsYW5hdGlvbnMgYmVsb3csIGZvciBjbGFyaXR5LgotCi1AaXRlbQotQHNhbXB7K30gaXMgdXNlZCBhcyBhIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlcjsgaWYgQHNhbXB7K30gYXBwZWFycwotYXQgdGhlIGVuZCBvZiBhIGxpbmUsIHRoZSB0ZXh0IG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb25zaWRlcmVkIHBhcnQKLW9mIHRoZSBjdXJyZW50IGNvbW1hbmQuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgdGhlIGNvbW1hbmRzIHlvdSBjYW4gdXNlIGluIEBjb2Rle2FyfSBzY3JpcHRzLCBvciB3aGVuIHVzaW5nCi1AY29kZXthcn0gaW50ZXJhY3RpdmVseS4gIFRocmVlIG9mIHRoZW0gaGF2ZSBzcGVjaWFsIHNpZ25pZmljYW5jZToKLQotQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfSBzcGVjaWZ5IGEgQGRmbntjdXJyZW50IGFyY2hpdmV9LCB3aGljaCBpcwotYSB0ZW1wb3JhcnkgZmlsZSByZXF1aXJlZCBmb3IgbW9zdCBvZiB0aGUgb3RoZXIgY29tbWFuZHMuCi0KLUBjb2Rle1NBVkV9IGNvbW1pdHMgdGhlIGNoYW5nZXMgc28gZmFyIHNwZWNpZmllZCBieSB0aGUgc2NyaXB0LiAgUHJpb3IKLXRvIEBjb2Rle1NBVkV9LCBjb21tYW5kcyBhZmZlY3Qgb25seSB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGN1cnJlbnQKLWFyY2hpdmUuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQURETElCIEB2YXJ7YXJjaGl2ZX0gCi1AaXRlbXggQURETElCIEB2YXJ7YXJjaGl2ZX0gKEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfSkKLUFkZCBhbGwgdGhlIGNvbnRlbnRzIG9mIEB2YXJ7YXJjaGl2ZX0gKG9yLCBpZiBzcGVjaWZpZWQsIGVhY2ggbmFtZWQKLUB2YXJ7bW9kdWxlfSBmcm9tIEB2YXJ7YXJjaGl2ZX0pIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUuCi0KLVJlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgotCi1AaXRlbSBBRERNT0QgQHZhcnttZW1iZXJ9LCBAdmFye21lbWJlcn0sIEBkb3Rze30gQHZhcnttZW1iZXJ9Ci1AYyBGSVhNRSEgdy9SZXBsYWNlbWVudD8/ICBJZiBzbywgbGlrZSAiYXIgciBAdmFye2FyY2hpdmV9IEB2YXJ7bmFtZXN9IgotQGMgICAgICAgIGVsc2UgbGlrZSAiYXIgcS4uLiIKLUFkZCBlYWNoIG5hbWVkIEB2YXJ7bWVtYmVyfSBhcyBhIG1vZHVsZSBpbiB0aGUgY3VycmVudCBhcmNoaXZlLgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gQ0xFQVIKLURpc2NhcmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGFyY2hpdmUsIGNhbmNlbGluZyB0aGUgZWZmZWN0IG9mCi1hbnkgb3BlcmF0aW9ucyBzaW5jZSB0aGUgbGFzdCBAY29kZXtTQVZFfS4gIE1heSBiZSBleGVjdXRlZCAod2l0aCBubwotZWZmZWN0KSBldmVuIGlmICBubyBjdXJyZW50IGFyY2hpdmUgaXMgc3BlY2lmaWVkLgotCi1AaXRlbSBDUkVBVEUgQHZhcnthcmNoaXZlfQotQ3JlYXRlcyBhbiBhcmNoaXZlLCBhbmQgbWFrZXMgaXQgdGhlIGN1cnJlbnQgYXJjaGl2ZSAocmVxdWlyZWQgZm9yIG1hbnkKLW90aGVyIGNvbW1hbmRzKS4gIFRoZSBuZXcgYXJjaGl2ZSBpcyBjcmVhdGVkIHdpdGggYSB0ZW1wb3JhcnkgbmFtZTsgaXQKLWlzIG5vdCBhY3R1YWxseSBzYXZlZCBhcyBAdmFye2FyY2hpdmV9IHVudGlsIHlvdSB1c2UgQGNvZGV7U0FWRX0uCi1Zb3UgY2FuIG92ZXJ3cml0ZSBleGlzdGluZyBhcmNoaXZlczsgc2ltaWxhcmx5LCB0aGUgY29udGVudHMgb2YgYW55Ci1leGlzdGluZyBmaWxlIG5hbWVkIEB2YXJ7YXJjaGl2ZX0gd2lsbCBub3QgYmUgZGVzdHJveWVkIHVudGlsIEBjb2Rle1NBVkV9LgotCi1AaXRlbSBERUxFVEUgQHZhcnttb2R1bGV9LCBAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9Ci1EZWxldGUgZWFjaCBsaXN0ZWQgQHZhcnttb2R1bGV9IGZyb20gdGhlIGN1cnJlbnQgYXJjaGl2ZTsgZXF1aXZhbGVudCB0bwotQHNhbXB7YXIgLWQgQHZhcnthcmNoaXZlfSBAdmFye21vZHVsZX0gQGRvdHN7fSBAdmFye21vZHVsZX19LgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gRElSRUNUT1JZIEB2YXJ7YXJjaGl2ZX0gKEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pCi1AaXRlbXggRElSRUNUT1JZIEB2YXJ7YXJjaGl2ZX0gKEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pIEB2YXJ7b3V0cHV0ZmlsZX0KLUxpc3QgZWFjaCBuYW1lZCBAdmFye21vZHVsZX0gcHJlc2VudCBpbiBAdmFye2FyY2hpdmV9LiAgVGhlIHNlcGFyYXRlCi1jb21tYW5kIEBjb2Rle1ZFUkJPU0V9IHNwZWNpZmllcyB0aGUgZm9ybSBvZiB0aGUgb3V0cHV0OiB3aGVuIHZlcmJvc2UKLW91dHB1dCBpcyBvZmYsIG91dHB1dCBpcyBsaWtlIHRoYXQgb2YgQHNhbXB7YXIgLXQgQHZhcnthcmNoaXZlfQotQHZhcnttb2R1bGV9QGRvdHN7fX0uICBXaGVuIHZlcmJvc2Ugb3V0cHV0IGlzIG9uLCB0aGUgbGlzdGluZyBpcyBsaWtlCi1Ac2FtcHthciAtdHYgQHZhcnthcmNoaXZlfSBAdmFye21vZHVsZX1AZG90c3t9fS4KLQotT3V0cHV0IG5vcm1hbGx5IGdvZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW07IGhvd2V2ZXIsIGlmIHlvdQotc3BlY2lmeSBAdmFye291dHB1dGZpbGV9IGFzIGEgZmluYWwgYXJndW1lbnQsIEBjb2Rle2FyfSBkaXJlY3RzIHRoZQotb3V0cHV0IHRvIHRoYXQgZmlsZS4KLQotQGl0ZW0gRU5ECi1FeGl0IGZyb20gQGNvZGV7YXJ9LCB3aXRoIGEgQGNvZGV7MH0gZXhpdCBjb2RlIHRvIGluZGljYXRlIHN1Y2Nlc3NmdWwKLWNvbXBsZXRpb24uICBUaGlzIGNvbW1hbmQgZG9lcyBub3Qgc2F2ZSB0aGUgb3V0cHV0IGZpbGU7IGlmIHlvdSBoYXZlCi1jaGFuZ2VkIHRoZSBjdXJyZW50IGFyY2hpdmUgc2luY2UgdGhlIGxhc3QgQGNvZGV7U0FWRX0gY29tbWFuZCwgdGhvc2UKLWNoYW5nZXMgYXJlIGxvc3QuCi0KLUBpdGVtIEVYVFJBQ1QgQHZhcnttb2R1bGV9LCBAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9Ci1FeHRyYWN0IGVhY2ggbmFtZWQgQHZhcnttb2R1bGV9IGZyb20gdGhlIGN1cnJlbnQgYXJjaGl2ZSwgd3JpdGluZyB0aGVtCi1pbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyBzZXBhcmF0ZSBmaWxlcy4gIEVxdWl2YWxlbnQgdG8gQHNhbXB7YXIgLXgKLUB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9QGRvdHN7fX0uCi0KLVJlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgotCi1AaWdub3JlCi1AYyBGSVhNRSBUb2tlbnMgYnV0IG5vIGNvbW1hbmRzPz8/Ci1AaXRlbSBGVUxMRElSCi0KLUBpdGVtIEhFTFAKLUBlbmQgaWdub3JlCi0KLUBpdGVtIExJU1QKLURpc3BsYXkgZnVsbCBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcmNoaXZlLCBpbiBgYHZlcmJvc2UnJyBzdHlsZQotcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2YgQGNvZGV7VkVSQk9TRX0uICBUaGUgZWZmZWN0IGlzIGxpa2UgQHNhbXB7YXIKLXR2IEB2YXJ7YXJjaGl2ZX19LiAgKFRoaXMgc2luZ2xlIGNvbW1hbmQgaXMgYSBAc2N7Z251fSBAY29kZXthcn0KLWVuaGFuY2VtZW50LCByYXRoZXIgdGhhbiBwcmVzZW50IGZvciBNUkkgY29tcGF0aWJpbGl0eS4pCi0KLVJlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgotCi1AaXRlbSBPUEVOIEB2YXJ7YXJjaGl2ZX0KLU9wZW5zIGFuIGV4aXN0aW5nIGFyY2hpdmUgZm9yIHVzZSBhcyB0aGUgY3VycmVudCBhcmNoaXZlIChyZXF1aXJlZCBmb3IKLW1hbnkgb3RoZXIgY29tbWFuZHMpLiAgQW55IGNoYW5nZXMgYXMgdGhlIHJlc3VsdCBvZiBzdWJzZXF1ZW50IGNvbW1hbmRzCi13aWxsIG5vdCBhY3R1YWxseSBhZmZlY3QgQHZhcnthcmNoaXZlfSB1bnRpbCB5b3UgbmV4dCB1c2UgQGNvZGV7U0FWRX0uCi0KLUBpdGVtIFJFUExBQ0UgQHZhcnttb2R1bGV9LCBAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9Ci1JbiB0aGUgY3VycmVudCBhcmNoaXZlLCByZXBsYWNlIGVhY2ggZXhpc3RpbmcgQHZhcnttb2R1bGV9IChuYW1lZCBpbgotdGhlIEBjb2Rle1JFUExBQ0V9IGFyZ3VtZW50cykgZnJvbSBmaWxlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLVRvIGV4ZWN1dGUgdGhpcyBjb21tYW5kIHdpdGhvdXQgZXJyb3JzLCBib3RoIHRoZSBmaWxlLCBhbmQgdGhlIG1vZHVsZSBpbgotdGhlIGN1cnJlbnQgYXJjaGl2ZSwgbXVzdCBleGlzdC4gCi0KLVJlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgotCi1AaXRlbSBWRVJCT1NFCi1Ub2dnbGUgYW4gaW50ZXJuYWwgZmxhZyBnb3Zlcm5pbmcgdGhlIG91dHB1dCBmcm9tIEBjb2Rle0RJUkVDVE9SWX0uCi1XaGVuIHRoZSBmbGFnIGlzIG9uLCBAY29kZXtESVJFQ1RPUll9IG91dHB1dCBtYXRjaGVzIG91dHB1dCBmcm9tCi1Ac2FtcHthciAtdHYgfUBkb3Rze30uCi0KLUBpdGVtIFNBVkUKLUNvbW1pdCB5b3VyIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgYXJjaGl2ZSwgYW5kIGFjdHVhbGx5IHNhdmUgaXQgYXMgYQotZmlsZSB3aXRoIHRoZSBuYW1lIHNwZWNpZmllZCBpbiB0aGUgbGFzdCBAY29kZXtDUkVBVEV9IG9yIEBjb2Rle09QRU59Ci1jb21tYW5kLiAKLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBlbmQgdGFibGUKLQotQGlmdGV4Ci1Abm9kZSBsZAotQGNoYXB0ZXIgbGQKLUBjaW5kZXggbGlua2VyCi1Aa2luZGV4IGxkCi1UaGUgQHNje2dudX0gbGlua2VyIEBjb2Rle2xkfSBpcyBub3cgZGVzY3JpYmVkIGluIGEgc2VwYXJhdGUgbWFudWFsLgotQHhyZWZ7VG9wLCwgT3ZlcnZpZXcsLCBVc2luZyBMRDogdGhlIEBzY3tnbnV9IGxpbmtlcn0uCi1AZW5kIGlmdGV4Ci0KLUBub2RlIG5tCi1AY2hhcHRlciBubQotQGNpbmRleCBzeW1ib2xzCi1Aa2luZGV4IG5tCi0KLUBzbWFsbGV4YW1wbGUKLW5tIFsgLWEgfCAtLWRlYnVnLXN5bXMgXSAgWyAtZyB8IC0tZXh0ZXJuLW9ubHkgXQotICAgWyAtQiBdICBbIC1DIHwgLS1kZW1hbmdsZSBdIFsgLUQgfCAtLWR5bmFtaWMgXQotICAgWyAtcyB8IC0tcHJpbnQtYXJtYXAgXSAgWyAtQSB8IC1vIHwgLS1wcmludC1maWxlLW5hbWUgXQotICAgWyAtbiB8IC12IHwgLS1udW1lcmljLXNvcnQgXSAgWyAtcCB8IC0tbm8tc29ydCBdCi0gICBbIC1yIHwgLS1yZXZlcnNlLXNvcnQgXSAgWyAtLXNpemUtc29ydCBdIFsgLXUgfCAtLXVuZGVmaW5lZC1vbmx5IF0KLSAgIFsgLXQgQHZhcntyYWRpeH0gfCAtLXJhZGl4PUB2YXJ7cmFkaXh9IF0gWyAtUCB8IC0tcG9ydGFiaWxpdHkgXQotICAgWyAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0gWyAtZiBAdmFye2Zvcm1hdH0gfCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0gXQotICAgWyAtLWRlZmluZWQtb25seSBdIFstbCB8IC0tbGluZS1udW1iZXJzIF0KLSAgIFsgLS1uby1kZW1hbmdsZSBdIFsgLVYgfCAtLXZlcnNpb24gXSAgWyAtLWhlbHAgXSAgWyBAdmFye29iamZpbGV9QGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ac2N7Z251fSBAY29kZXtubX0gbGlzdHMgdGhlIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMgQHZhcntvYmpmaWxlfUBkb3Rze30uCi1JZiBubyBvYmplY3QgZmlsZXMgYXJlIGxpc3RlZCBhcyBhcmd1bWVudHMsIEBjb2Rle25tfSBhc3N1bWVzIHRoZSBmaWxlCi1AZmlsZXthLm91dH0uCi0KLUZvciBlYWNoIHN5bWJvbCwgQGNvZGV7bm19IHNob3dzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIHN5bWJvbCB2YWx1ZSwgaW4gdGhlIHJhZGl4IHNlbGVjdGVkIGJ5IG9wdGlvbnMgKHNlZSBiZWxvdyksIG9yCi1oZXhhZGVjaW1hbCBieSBkZWZhdWx0LgotCi1AaXRlbQotVGhlIHN5bWJvbCB0eXBlLiAgQXQgbGVhc3QgdGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgdXNlZDsgb3RoZXJzIGFyZSwgYXMKLXdlbGwsIGRlcGVuZGluZyBvbiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgSWYgbG93ZXJjYXNlLCB0aGUgc3ltYm9sIGlzCi1sb2NhbDsgaWYgdXBwZXJjYXNlLCB0aGUgc3ltYm9sIGlzIGdsb2JhbCAoZXh0ZXJuYWwpLgotCi1AYyBTb21lIG1vcmUgZGV0YWlsIG9uIGV4YWN0bHkgd2hhdCB0aGVzZSBzeW1ib2wgdHlwZXMgYXJlIHVzZWQgZm9yCi1AYyB3b3VsZCBiZSBuaWNlLgotQHRhYmxlIEBjb2RlCi1AaXRlbSBBCi1UaGUgc3ltYm9sJ3MgdmFsdWUgaXMgYWJzb2x1dGUsIGFuZCB3aWxsIG5vdCBiZSBjaGFuZ2VkIGJ5IGZ1cnRoZXIKLWxpbmtpbmcuCi0KLUBpdGVtIEIKLVRoZSBzeW1ib2wgaXMgaW4gdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIChrbm93biBhcyBCU1MpLgotCi1AaXRlbSBDCi1UaGUgc3ltYm9sIGlzIGNvbW1vbi4gIENvbW1vbiBzeW1ib2xzIGFyZSB1bmluaXRpYWxpemVkIGRhdGEuICBXaGVuCi1saW5raW5nLCBtdWx0aXBsZSBjb21tb24gc3ltYm9scyBtYXkgYXBwZWFyIHdpdGggdGhlIHNhbWUgbmFtZS4gIElmIHRoZQotc3ltYm9sIGlzIGRlZmluZWQgYW55d2hlcmUsIHRoZSBjb21tb24gc3ltYm9scyBhcmUgdHJlYXRlZCBhcyB1bmRlZmluZWQKLXJlZmVyZW5jZXMuICBGb3IgbW9yZSBkZXRhaWxzIG9uIGNvbW1vbiBzeW1ib2xzLCBzZWUgdGhlIGRpc2N1c3Npb24gb2YKLS0td2Fybi1jb21tb24gaW4gQHJlZntPcHRpb25zLCxMaW5rZXIgb3B0aW9ucyxsZC5pbmZvLFRoZSBHTlUgbGlua2VyfS4KLQotQGl0ZW0gRAotVGhlIHN5bWJvbCBpcyBpbiB0aGUgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLgotCi1AaXRlbSBHCi1UaGUgc3ltYm9sIGlzIGluIGFuIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBmb3Igc21hbGwgb2JqZWN0cy4gIFNvbWUKLW9iamVjdCBmaWxlIGZvcm1hdHMgcGVybWl0IG1vcmUgZWZmaWNpZW50IGFjY2VzcyB0byBzbWFsbCBkYXRhIG9iamVjdHMsCi1zdWNoIGFzIGEgZ2xvYmFsIGludCB2YXJpYWJsZSBhcyBvcHBvc2VkIHRvIGEgbGFyZ2UgZ2xvYmFsIGFycmF5LgotCi1AaXRlbSBJCi1UaGUgc3ltYm9sIGlzIGFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhbm90aGVyIHN5bWJvbC4gIFRoaXMgaXMgYSBHTlUKLWV4dGVuc2lvbiB0byB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHdoaWNoIGlzIHJhcmVseSB1c2VkLgotCi1AaXRlbSBOCi1UaGUgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4KLQotQGl0ZW0gUgotVGhlIHN5bWJvbCBpcyBpbiBhIHJlYWQgb25seSBkYXRhIHNlY3Rpb24uCi0KLUBpdGVtIFMKLVRoZSBzeW1ib2wgaXMgaW4gYW4gdW5pbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gZm9yIHNtYWxsIG9iamVjdHMuCi0KLUBpdGVtIFQKLVRoZSBzeW1ib2wgaXMgaW4gdGhlIHRleHQgKGNvZGUpIHNlY3Rpb24uCi0KLUBpdGVtIFUKLVRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLgotCi1AaXRlbSBXCi1UaGUgc3ltYm9sIGlzIHdlYWsuICBXaGVuIGEgd2VhayBkZWZpbmVkIHN5bWJvbCBpcyBsaW5rZWQgd2l0aCBhIG5vcm1hbAotZGVmaW5lZCBzeW1ib2wsIHRoZSBub3JtYWwgZGVmaW5lZCBzeW1ib2wgaXMgdXNlZCB3aXRoIG5vIGVycm9yLiAgV2hlbiBhCi13ZWFrIHVuZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLCB0aGUgdmFsdWUKLW9mIHRoZSB3ZWFrIHN5bWJvbCBiZWNvbWVzIHplcm8gd2l0aCBubyBlcnJvci4KLQotQGl0ZW0gLQotVGhlIHN5bWJvbCBpcyBhIHN0YWJzIHN5bWJvbCBpbiBhbiBhLm91dCBvYmplY3QgZmlsZS4gIEluIHRoaXMgY2FzZSwgdGhlCi1uZXh0IHZhbHVlcyBwcmludGVkIGFyZSB0aGUgc3RhYnMgb3RoZXIgZmllbGQsIHRoZSBzdGFicyBkZXNjIGZpZWxkLCBhbmQKLXRoZSBzdGFiIHR5cGUuICBTdGFicyBzeW1ib2xzIGFyZSB1c2VkIHRvIGhvbGQgZGVidWdnaW5nIGluZm9ybWF0aW9uOwotZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme1RvcCxTdGFicyxTdGFicyBPdmVydmlldyxzdGFicy5pbmZvLCBUaGUKLWBgc3RhYnMnJyBkZWJ1ZyBmb3JtYXR9LgotCi1AaXRlbSA/Ci1UaGUgc3ltYm9sIHR5cGUgaXMgdW5rbm93biwgb3Igb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmljLgotQGVuZCB0YWJsZQotCi1AaXRlbQotVGhlIHN5bWJvbCBuYW1lLgotQGVuZCBpdGVtaXplCi0KLVRoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCi1lcXVpdmFsZW50LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1BCi1AaXRlbXggLW8KLUBpdGVteCAtLXByaW50LWZpbGUtbmFtZSAKLUBjaW5kZXggaW5wdXQgZmlsZSBuYW1lCi1AY2luZGV4IGZpbGUgbmFtZQotQGNpbmRleCBzb3VyY2UgZmlsZSBuYW1lCi1QcmVjZWRlIGVhY2ggc3ltYm9sIGJ5IHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIChvciBhcmNoaXZlIG1lbWJlcikKLWluIHdoaWNoIGl0IHdhcyBmb3VuZCwgcmF0aGVyIHRoYW4gaWRlbnRpZnlpbmcgdGhlIGlucHV0IGZpbGUgb25jZSBvbmx5LAotYmVmb3JlIGFsbCBvZiBpdHMgc3ltYm9scy4KLQotQGl0ZW0gLWEKLUBpdGVteCAtLWRlYnVnLXN5bXMgCi1AY2luZGV4IGRlYnVnZ2luZyBzeW1ib2xzCi1EaXNwbGF5IGFsbCBzeW1ib2xzLCBldmVuIGRlYnVnZ2VyLW9ubHkgc3ltYm9sczsgbm9ybWFsbHkgdGhlc2UgYXJlIG5vdAotbGlzdGVkLgotCi1AaXRlbSAtQgotQGNpbmRleCBAY29kZXtubX0gZm9ybWF0Ci1AY2luZGV4IEBjb2Rle25tfSBjb21wYXRpYmlsaXR5Ci1UaGUgc2FtZSBhcyBAc2FtcHstLWZvcm1hdD1ic2R9IChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNSVBTIEBjb2Rle25tfSkuCi0KLUBpdGVtIC1DCi1AaXRlbXggLS1kZW1hbmdsZQotQGNpbmRleCBkZW1hbmdsaW5nIGluIG5tCi1EZWNvZGUgKEBkZm57ZGVtYW5nbGV9KSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLiAgQHhyZWZ7YysrZmlsdH0sIGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiBkZW1hbmdsaW5nLgotCi1AaXRlbSAtLW5vLWRlbWFuZ2xlCi1EbyBub3QgZGVtYW5nbGUgbG93LWxldmVsIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0KLUBpdGVtIC1ECi1AaXRlbXggLS1keW5hbWljCi1AY2luZGV4IGR5bmFtaWMgc3ltYm9scwotRGlzcGxheSB0aGUgZHluYW1pYyBzeW1ib2xzIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgc3ltYm9scy4gIFRoaXMgaXMKLW9ubHkgbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuCi0KLUBpdGVtIC1mIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQGNpbmRleCBAY29kZXtubX0gZm9ybWF0Ci1AY2luZGV4IEBjb2Rle25tfSBjb21wYXRpYmlsaXR5Ci1Vc2UgdGhlIG91dHB1dCBmb3JtYXQgQHZhcntmb3JtYXR9LCB3aGljaCBjYW4gYmUgQGNvZGV7YnNkfSwKLUBjb2Rle3N5c3Z9LCBvciBAY29kZXtwb3NpeH0uICBUaGUgZGVmYXVsdCBpcyBAY29kZXtic2R9LgotT25seSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIEB2YXJ7Zm9ybWF0fSBpcyBzaWduaWZpY2FudDsgaXQgY2FuIGJlCi1laXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZS4KLQotQGl0ZW0gLWcKLUBpdGVteCAtLWV4dGVybi1vbmx5IAotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scy4KLQotQGl0ZW0gLWwKLUBpdGVteCAtLWxpbmUtbnVtYmVycwotQGNpbmRleCBzeW1ib2wgbGluZSBudW1iZXJzCi1Gb3IgZWFjaCBzeW1ib2wsIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdHJ5IHRvIGZpbmQgYSBmaWxlbmFtZSBhbmQKLWxpbmUgbnVtYmVyLiAgRm9yIGEgZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLWFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIEZvciBhbiB1bmRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZQotbnVtYmVyIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbC4gIElmIGxpbmUgbnVtYmVyCi1pbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQsIHByaW50IGl0IGFmdGVyIHRoZSBvdGhlciBzeW1ib2wgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1uCi1AaXRlbXggLXYKLUBpdGVteCAtLW51bWVyaWMtc29ydCAKLVNvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSB0aGVpciBhZGRyZXNzZXMsIHJhdGhlciB0aGFuIGFscGhhYmV0aWNhbGx5Ci1ieSB0aGVpciBuYW1lcy4gCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1uby1zb3J0IAotQGNpbmRleCBzb3J0aW5nIHN5bWJvbHMKLURvIG5vdCBib3RoZXIgdG8gc29ydCB0aGUgc3ltYm9scyBpbiBhbnkgb3JkZXI7IHByaW50IHRoZW0gaW4gdGhlIG9yZGVyCi1lbmNvdW50ZXJlZC4KLQotQGl0ZW0gLVAKLUBpdGVteCAtLXBvcnRhYmlsaXR5Ci1Vc2UgdGhlIFBPU0lYLjIgc3RhbmRhcmQgb3V0cHV0IGZvcm1hdCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvcm1hdC4KLUVxdWl2YWxlbnQgdG8gQHNhbXB7LWYgcG9zaXh9LgotCi1AaXRlbSAtcwotQGl0ZW14IC0tcHJpbnQtYXJtYXAKLUBjaW5kZXggc3ltYm9sIGluZGV4LCBsaXN0aW5nCi1XaGVuIGxpc3Rpbmcgc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycywgaW5jbHVkZSB0aGUgaW5kZXg6IGEgbWFwcGluZwotKHN0b3JlZCBpbiB0aGUgYXJjaGl2ZSBieSBAY29kZXthcn0gb3IgQGNvZGV7cmFubGlifSkgb2Ygd2hpY2ggbW9kdWxlcwotY29udGFpbiBkZWZpbml0aW9ucyBmb3Igd2hpY2ggbmFtZXMuCi0KLUBpdGVtIC1yCi1AaXRlbXggLS1yZXZlcnNlLXNvcnQgCi1SZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc29ydCAod2hldGhlciBudW1lcmljIG9yIGFscGhhYmV0aWMpOyBsZXQgdGhlCi1sYXN0IGNvbWUgZmlyc3QuCi0KLUBpdGVtIC0tc2l6ZS1zb3J0Ci1Tb3J0IHN5bWJvbHMgYnkgc2l6ZS4gIFRoZSBzaXplIGlzIGNvbXB1dGVkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLXRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB3aXRoIHRoZSBuZXh0IGhpZ2hlcgotdmFsdWUuICBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIHByaW50ZWQsIHJhdGhlciB0aGFuIHRoZSB2YWx1ZS4KLQotQGl0ZW0gLXQgQHZhcntyYWRpeH0KLUBpdGVteCAtLXJhZGl4PUB2YXJ7cmFkaXh9Ci1Vc2UgQHZhcntyYWRpeH0gYXMgdGhlIHJhZGl4IGZvciBwcmludGluZyB0aGUgc3ltYm9sIHZhbHVlcy4gIEl0IG11c3QgYmUKLUBzYW1we2R9IGZvciBkZWNpbWFsLCBAc2FtcHtvfSBmb3Igb2N0YWwsIG9yIEBzYW1we3h9IGZvciBoZXhhZGVjaW1hbC4KLQotQGl0ZW0gLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLXUKLUBpdGVteCAtLXVuZGVmaW5lZC1vbmx5IAotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgdW5kZWZpbmVkIHN5bWJvbHMgKHRob3NlIGV4dGVybmFsIHRvIGVhY2ggb2JqZWN0IGZpbGUpLgotCi1AaXRlbSAtLWRlZmluZWQtb25seQotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgZGVmaW5lZCBzeW1ib2xzIGZvciBlYWNoIG9iamVjdCBmaWxlLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7bm19IGFuZCBleGl0LgotCi1AaXRlbSAtLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle25tfSBhbmQgZXhpdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgb2JqY29weQotQGNoYXB0ZXIgb2JqY29weQotCi1Ac21hbGxleGFtcGxlCi1vYmpjb3B5IFsgLUYgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1JIEB2YXJ7YmZkbmFtZX0gfCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtTyBAdmFye2JmZG5hbWV9IHwgLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1TIHwgLS1zdHJpcC1hbGwgXSAgWyAtZyB8IC0tc3RyaXAtZGVidWcgXQotICAgICAgICBbIC1LIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLWtlZXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgICBbIC1OIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAtTCBAdmFye3N5bWJvbG5hbWV9IHwgLS1sb2NhbGl6ZS1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICAgIFsgLVcgQHZhcntzeW1ib2xuYW1lfSB8IC0td2Vha2VuLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAteCB8IC0tZGlzY2FyZC1hbGwgXSAgWyAtWCB8IC0tZGlzY2FyZC1sb2NhbHMgXQotICAgICAgICBbIC1iIEB2YXJ7Ynl0ZX0gfCAtLWJ5dGU9QHZhcntieXRlfSBdCi0gICAgICAgIFsgLWkgQHZhcntpbnRlcmxlYXZlfSB8IC0taW50ZXJsZWF2ZT1AdmFye2ludGVybGVhdmV9IF0KLSAgICAgICAgWyAtaiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tb25seS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9IF0KLSAgICAgICAgWyAtUiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQotICAgICAgICBbIC1wIHwgLS1wcmVzZXJ2ZS1kYXRlcyBdIFsgLS1kZWJ1Z2dpbmcgXQotICAgICAgICBbIC0tZ2FwLWZpbGw9QHZhcnt2YWx9IF0gWyAtLXBhZC10bz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXNldC1zdGFydD1AdmFye3ZhbH0gXSBbIC0tYWRqdXN0LXN0YXJ0PUB2YXJ7aW5jcn0gXQotICAgICAgICBbIC0tY2hhbmdlLWFkZHJlc3Nlcz1AdmFye2luY3J9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3M9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utc2VjdGlvbi1sbWE9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utc2VjdGlvbi12bWE9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utd2FybmluZ3MgXSBbIC0tbm8tY2hhbmdlLXdhcm5pbmdzIF0KLSAgICAgICAgWyAtLXNldC1zZWN0aW9uLWZsYWdzPUB2YXJ7c2VjdGlvbn09QHZhcntmbGFnc30gXQotICAgICAgICBbIC0tYWRkLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX09QHZhcntmaWxlbmFtZX0gXQotICAgICAgICBbIC0tY2hhbmdlLWxlYWRpbmctY2hhciBdIFsgLS1yZW1vdmUtbGVhZGluZy1jaGFyIF0KLSAgICAgICAgWyAtLXdlYWtlbiBdCi0gICAgICAgIFsgLXYgfCAtLXZlcmJvc2UgXSBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0KLSAgICAgICAgQHZhcntpbmZpbGV9IFtAdmFye291dGZpbGV9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzY3tnbnV9IEBjb2Rle29iamNvcHl9IHV0aWxpdHkgY29waWVzIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QKLWZpbGUgdG8gYW5vdGhlci4gIEBjb2Rle29iamNvcHl9IHVzZXMgdGhlIEBzY3tnbnV9IEBzY3tiZmR9IExpYnJhcnkgdG8KLXJlYWQgYW5kIHdyaXRlIHRoZSBvYmplY3QgZmlsZXMuICBJdCBjYW4gd3JpdGUgdGhlIGRlc3RpbmF0aW9uIG9iamVjdAotZmlsZSBpbiBhIGZvcm1hdCBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIHRoZSBzb3VyY2Ugb2JqZWN0IGZpbGUuICBUaGUKLWV4YWN0IGJlaGF2aW9yIG9mIEBjb2Rle29iamNvcHl9IGlzIGNvbnRyb2xsZWQgYnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0KLUBjb2Rle29iamNvcHl9IGNyZWF0ZXMgdGVtcG9yYXJ5IGZpbGVzIHRvIGRvIGl0cyB0cmFuc2xhdGlvbnMgYW5kCi1kZWxldGVzIHRoZW0gYWZ0ZXJ3YXJkLiAgQGNvZGV7b2JqY29weX0gdXNlcyBAc2N7YmZkfSB0byBkbyBhbGwgaXRzCi10cmFuc2xhdGlvbiB3b3JrOyBpdCBoYXMgYWNjZXNzIHRvIGFsbCB0aGUgZm9ybWF0cyBkZXNjcmliZWQgaW4gQHNje2JmZH0KLWFuZCB0aHVzIGlzIGFibGUgdG8gcmVjb2duaXplIG1vc3QgZm9ybWF0cyB3aXRob3V0IGJlaW5nIHRvbGQKLWV4cGxpY2l0bHkuICBAeHJlZntCRkQsLEJGRCxsZC5pbmZvLFVzaW5nIExEfS4KLQotQGNvZGV7b2JqY29weX0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgUy1yZWNvcmRzIGJ5IHVzaW5nIGFuIG91dHB1dAotdGFyZ2V0IG9mIEBzYW1we3NyZWN9IChlLmcuLCB1c2UgQHNhbXB7LU8gc3JlY30pLgotCi1AY29kZXtvYmpjb3B5fSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHJhdyBiaW5hcnkgZmlsZSBieSB1c2luZyBhbgotb3V0cHV0IHRhcmdldCBvZiBAc2FtcHtiaW5hcnl9IChlLmcuLCB1c2UgQHNhbXB7LU8gYmluYXJ5fSkuICBXaGVuCi1AY29kZXtvYmpjb3B5fSBnZW5lcmF0ZXMgYSByYXcgYmluYXJ5IGZpbGUsIGl0IHdpbGwgZXNzZW50aWFsbHkgcHJvZHVjZQotYSBtZW1vcnkgZHVtcCBvZiB0aGUgY29udGVudHMgb2YgdGhlIGlucHV0IG9iamVjdCBmaWxlLiAgQWxsIHN5bWJvbHMgYW5kCi1yZWxvY2F0aW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgZGlzY2FyZGVkLiAgVGhlIG1lbW9yeSBkdW1wIHdpbGwgc3RhcnQgYXQKLXRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIGxvd2VzdCBzZWN0aW9uIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLQotV2hlbiBnZW5lcmF0aW5nIGFuIFMtcmVjb3JkIG9yIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCBtYXkgYmUgaGVscGZ1bCB0bwotdXNlIEBzYW1wey1TfSB0byByZW1vdmUgc2VjdGlvbnMgY29udGFpbmluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbgotc29tZSBjYXNlcyBAc2FtcHstUn0gd2lsbCBiZSB1c2VmdWwgdG8gcmVtb3ZlIHNlY3Rpb25zIHdoaWNoIGNvbnRhaW4KLWluZm9ybWF0aW9uIHRoYXQgaXMgbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntpbmZpbGV9Ci1AaXRlbXggQHZhcntvdXRmaWxlfQotVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMsIHJlc3BlY3RpdmVseS4KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBAdmFye291dGZpbGV9LCBAY29kZXtvYmpjb3B5fSBjcmVhdGVzIGEKLXRlbXBvcmFyeSBmaWxlIGFuZCBkZXN0cnVjdGl2ZWx5IHJlbmFtZXMgdGhlIHJlc3VsdCB3aXRoCi10aGUgbmFtZSBvZiBAdmFye2luZmlsZX0uCi0KLUBpdGVtIC1JIEB2YXJ7YmZkbmFtZX0JCi1AaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotQ29uc2lkZXIgdGhlIHNvdXJjZSBmaWxlJ3Mgb2JqZWN0IGZvcm1hdCB0byBiZSBAdmFye2JmZG5hbWV9LCByYXRoZXIgdGhhbgotYXR0ZW1wdGluZyB0byBkZWR1Y2UgaXQuICBAeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1PIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotV3JpdGUgdGhlIG91dHB1dCBmaWxlIHVzaW5nIHRoZSBvYmplY3QgZm9ybWF0IEB2YXJ7YmZkbmFtZX0uCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1GIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1Vc2UgQHZhcntiZmRuYW1lfSBhcyB0aGUgb2JqZWN0IGZvcm1hdCBmb3IgYm90aCB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQKLWZpbGU7IGkuZS4sIHNpbXBseSB0cmFuc2ZlciBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdpdGggbm8KLXRyYW5zbGF0aW9uLiAgQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtaiBAdmFye3NlY3Rpb25uYW1lfQotQGl0ZW14IC0tb25seS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9Ci1Db3B5IG9ubHkgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgaW5wdXQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUuCi1UaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24KLWluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUgb3V0cHV0IGZpbGUgdW51c2FibGUuCi0KLUBpdGVtIC1SIEB2YXJ7c2VjdGlvbm5hbWV9Ci1AaXRlbXggLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfQotUmVtb3ZlIGFueSBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjdGlvbm5hbWV9IGZyb20gdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG9wdGlvbgotaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZSBvdXRwdXQgZmlsZSB1bnVzYWJsZS4KLQotQGl0ZW0gLVMKLUBpdGVteCAtLXN0cmlwLWFsbAotRG8gbm90IGNvcHkgcmVsb2NhdGlvbiBhbmQgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotCi1AaXRlbSAtZwotQGl0ZW14IC0tc3RyaXAtZGVidWcKLURvIG5vdCBjb3B5IGRlYnVnZ2luZyBzeW1ib2xzIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotCi1AaXRlbSAtLXN0cmlwLXVubmVlZGVkCi1TdHJpcCBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0KLUBpdGVtIC1LIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLWtlZXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLUNvcHkgb25seSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgb3B0aW9uIG1heQotYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0KLUBpdGVtIC1OIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1EbyBub3QgY29weSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0KLUBpdGVtIC1MIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLWxvY2FsaXplLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1NYWtlIHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGxvY2FsIHRvIHRoZSBmaWxlLCBzbyB0aGF0IGl0IGlzIG5vdAotdmlzaWJsZSBleHRlcm5hbGx5LiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtVyBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS13ZWFrZW4tc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLU1ha2Ugc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gd2Vhay4gVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLURvIG5vdCBjb3B5IG5vbi1nbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLUBjIEZJWE1FIGFueSByZWFzb24gdG8gcHJlZmVyICJub24tZ2xvYmFsIiB0byAibG9jYWwiIGhlcmU/Ci0KLUBpdGVtIC1YCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotRG8gbm90IGNvcHkgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuCi0oVGhlc2UgdXN1YWxseSBzdGFydCB3aXRoIEBzYW1we0x9IG9yIEBzYW1wey59LikKLQotQGl0ZW0gLWIgQHZhcntieXRlfQotQGl0ZW14IC0tYnl0ZT1AdmFye2J5dGV9Ci1LZWVwIG9ubHkgZXZlcnkgQHZhcntieXRlfXRoIGJ5dGUgb2YgdGhlIGlucHV0IGZpbGUgKGhlYWRlciBkYXRhIGlzIG5vdAotYWZmZWN0ZWQpLiAgQHZhcntieXRlfSBjYW4gYmUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byBAdmFye2ludGVybGVhdmV9LTEsCi13aGVyZSBAdmFye2ludGVybGVhdmV9IGlzIGdpdmVuIGJ5IHRoZSBAc2FtcHstaX0gb3IgQHNhbXB7LS1pbnRlcmxlYXZlfQotb3B0aW9uLCBvciB0aGUgZGVmYXVsdCBvZiA0LiAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIGZvciBjcmVhdGluZyBmaWxlcwotdG8gcHJvZ3JhbSBAc2N7cm9tfS4gIEl0IGlzIHR5cGljYWxseSB1c2VkIHdpdGggYW4gQGNvZGV7c3JlY30gb3V0cHV0Ci10YXJnZXQuCi0KLUBpdGVtIC1pIEB2YXJ7aW50ZXJsZWF2ZX0KLUBpdGVteCAtLWludGVybGVhdmU9QHZhcntpbnRlcmxlYXZlfQotT25seSBjb3B5IG9uZSBvdXQgb2YgZXZlcnkgQHZhcntpbnRlcmxlYXZlfSBieXRlcy4gIFNlbGVjdCB3aGljaCBieXRlIHRvCi1jb3B5IHdpdGggdGhlIEB2YXJ7LWJ9IG9yIEBzYW1wey0tYnl0ZX0gb3B0aW9uLiAgVGhlIGRlZmF1bHQgaXMgNC4KLUBjb2Rle29iamNvcHl9IGlnbm9yZXMgdGhpcyBvcHRpb24gaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGVpdGhlciBAc2FtcHstYn0gb3IKLUBzYW1wey0tYnl0ZX0uCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmVzZXJ2ZS1kYXRlcwotU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgdGhlIHNhbWUKLWFzIHRob3NlIG9mIHRoZSBpbnB1dCBmaWxlLgotCi1AaXRlbSAtLWRlYnVnZ2luZwotQ29udmVydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIHBvc3NpYmxlLiAgVGhpcyBpcyBub3QgdGhlIGRlZmF1bHQKLWJlY2F1c2Ugb25seSBjZXJ0YWluIGRlYnVnZ2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQsIGFuZCB0aGUKLWNvbnZlcnNpb24gcHJvY2VzcyBjYW4gYmUgdGltZSBjb25zdW1pbmcuCi0KLUBpdGVtIC0tZ2FwLWZpbGwgQHZhcnt2YWx9Ci1GaWxsIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyB3aXRoIEB2YXJ7dmFsfS4gIFRoaXMgb3BlcmF0aW9uIGFwcGxpZXMgdG8KLXRoZSBAZW1waHtsb2FkIGFkZHJlc3N9IChMTUEpIG9mIHRoZSBzZWN0aW9ucy4gIEl0IGlzIGRvbmUgYnkgaW5jcmVhc2luZwotdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXIgYWRkcmVzcywgYW5kIGZpbGxpbmcgaW4gdGhlIGV4dHJhCi1zcGFjZSBjcmVhdGVkIHdpdGggQHZhcnt2YWx9LgotCi1AaXRlbSAtLXBhZC10byBAdmFye2FkZHJlc3N9Ci1QYWQgdGhlIG91dHB1dCBmaWxlIHVwIHRvIHRoZSBsb2FkIGFkZHJlc3MgQHZhcnthZGRyZXNzfS4gIFRoaXMgaXMKLWRvbmUgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBzZWN0aW9uLiAgVGhlIGV4dHJhIHNwYWNlIGlzCi1maWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IEBzYW1wey0tZ2FwLWZpbGx9IChkZWZhdWx0IHplcm8pLgotCi1AaXRlbSAtLXNldC1zdGFydCBAdmFye3ZhbH0KLVNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV3IGZpbGUgdG8gQHZhcnt2YWx9LiAgTm90IGFsbCBvYmplY3QgZmlsZQotZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCi0KLUBpdGVtIC0tY2hhbmdlLXN0YXJ0IEB2YXJ7aW5jcn0KLUBpdGVteCAtLWFkanVzdC1zdGFydCBAdmFye2luY3J9Ci1AY2luZGV4IGNoYW5naW5nIHN0YXJ0IGFkZHJlc3MKLUNoYW5nZSB0aGUgc3RhcnQgYWRkcmVzcyBieSBhZGRpbmcgQHZhcntpbmNyfS4gIE5vdCBhbGwgb2JqZWN0IGZpbGUKLWZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotCi1AaXRlbSAtLWNoYW5nZS1hZGRyZXNzZXMgQHZhcntpbmNyfQotQGl0ZW14IC0tYWRqdXN0LXZtYSBAdmFye2luY3J9Ci1AY2luZGV4IGNoYW5naW5nIG9iamVjdCBhZGRyZXNzZXMKLUNoYW5nZSB0aGUgVk1BIGFuZCBMTUEgYWRkcmVzc2VzIG9mIGFsbCBzZWN0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3RhcnQKLWFkZHJlc3MsIGJ5IGFkZGluZyBAdmFye2luY3J9LiAgU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIGRvIG5vdCBwZXJtaXQKLXNlY3Rpb24gYWRkcmVzc2VzIHRvIGJlIGNoYW5nZWQgYXJiaXRyYXJpbHkuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAotcmVsb2NhdGUgdGhlIHNlY3Rpb25zOyBpZiB0aGUgcHJvZ3JhbSBleHBlY3RzIHNlY3Rpb25zIHRvIGJlIGxvYWRlZCBhdCBhCi1jZXJ0YWluIGFkZHJlc3MsIGFuZCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc2VjdGlvbnMgc3VjaAotdGhhdCB0aGV5IGFyZSBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcywgdGhlIHByb2dyYW0gbWF5IGZhaWwuIAotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MgQHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfQotQGl0ZW14IC0tYWRqdXN0LXNlY3Rpb24tdm1hIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBjaW5kZXggY2hhbmdpbmcgc2VjdGlvbiBhZGRyZXNzCi1TZXQgb3IgY2hhbmdlIGJvdGggdGhlIFZNQSBhZGRyZXNzIGFuZCB0aGUgTE1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkCi1AdmFye3NlY3Rpb259LiAgSWYgQHNhbXB7PX0gaXMgdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8KLUB2YXJ7dmFsfS4gIE90aGVyd2lzZSwgQHZhcnt2YWx9IGlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUKLXNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMgdW5kZXIgQHNhbXB7LS1jaGFuZ2UtYWRkcmVzc2VzfSwKLWFib3ZlLiBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbAotYmUgaXNzdWVkLCB1bmxlc3MgQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuCi0KLUBpdGVtIC0tY2hhbmdlLXNlY3Rpb24tbG1hIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBjaW5kZXggY2hhbmdpbmcgc2VjdGlvbiBMTUEKLVNldCBvciBjaGFuZ2UgdGhlIExNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZCBAdmFye3NlY3Rpb259LiAgVGhlIExNQQotYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsIGJlIGxvYWRlZCBpbnRvIG1lbW9yeSBhdAotcHJvZ3JhbSBsb2FkIHRpbWUuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBWTUEgYWRkcmVzcywgd2hpY2gKLWlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGF0IHByb2dyYW0gcnVuIHRpbWUsIGJ1dCBvbiBzb21lIHN5c3RlbXMsCi1lc3BlY2lhbGx5IHRob3NlIHdoZXJlIGEgcHJvZ3JhbSBpcyBoZWxkIGluIFJPTSwgdGhlIHR3byBjYW4gYmUKLWRpZmZlcmVudC4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvCi1AdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlCi1zZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyIEBzYW1wey0tY2hhbmdlLWFkZHJlc3Nlc30sCi1hYm92ZS4gIElmIEB2YXJ7c2VjdGlvbn0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZwotd2lsbCBiZSBpc3N1ZWQsIHVubGVzcyBAc2FtcHstLW5vLWNoYW5nZS13YXJuaW5nc30gaXMgdXNlZC4gIAotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLXZtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gVk1BCi1TZXQgb3IgY2hhbmdlIHRoZSBWTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFRoZSBWTUEKLWFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2NhdGVkIG9uY2UgdGhlCi1wcm9ncmFtIGhhcyBzdGFydGVkIGV4ZWN1dGluZy4gIE5vcm1hbGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIExNQQotYWRkcmVzcywgd2hpY2ggaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2FkZWQgaW50bwotbWVtb3J5LCBidXQgb24gc29tZSBzeXN0ZW1zLCBlc3BlY2lhbGx5IHRob3NlIHdoZXJlIGEgcHJvZ3JhbSBpcyBoZWxkIGluCi1ST00sIHRoZSB0d28gY2FuIGJlIGRpZmZlcmVudC4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MKLWlzIHNldCB0byBAdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkCi1mcm9tIHRoZSBzZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyCi1Ac2FtcHstLWNoYW5nZS1hZGRyZXNzZXN9LCBhYm92ZS4gIElmIEB2YXJ7c2VjdGlvbn0gZG9lcyBub3QgZXhpc3QgaW4KLXRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQsIHVubGVzcwotQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuICAgCi0KLUBpdGVtIC0tY2hhbmdlLXdhcm5pbmdzCi1AaXRlbXggLS1hZGp1c3Qtd2FybmluZ3MKLUlmIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzc30gb3IgQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi1sbWF9IG9yCi1Ac2FtcHstLWNoYW5nZS1zZWN0aW9uLXZtYX0gaXMgdXNlZCwgYW5kIHRoZSBuYW1lZCBzZWN0aW9uIGRvZXMgbm90Ci1leGlzdCwgaXNzdWUgYSB3YXJuaW5nLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4gCi0KLUBpdGVtIC0tbm8tY2hhbmdlLXdhcm5pbmdzCi1AaXRlbXggLS1uby1hZGp1c3Qtd2FybmluZ3MKLURvIG5vdCBpc3N1ZSBhIHdhcm5pbmcgaWYgQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzfSBvcgotQHNhbXB7LS1hZGp1c3Qtc2VjdGlvbi1sbWF9IG9yIEBzYW1wey0tYWRqdXN0LXNlY3Rpb24tdm1hfSBpcyB1c2VkLCBldmVuCi1pZiB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdCBleGlzdC4gCi0KLUBpdGVtIC0tc2V0LXNlY3Rpb24tZmxhZ3MgQHZhcntzZWN0aW9ufT1AdmFye2ZsYWdzfQotU2V0IHRoZSBmbGFncyBmb3IgdGhlIG5hbWVkIHNlY3Rpb24uICBUaGUgQHZhcntmbGFnc30gYXJndW1lbnQgaXMgYQotY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBmbGFnIG5hbWVzLiAgVGhlIHJlY29nbml6ZWQgbmFtZXMgYXJlCi1Ac2FtcHthbGxvY30sIEBzYW1we2NvbnRlbnRzfSwgQHNhbXB7bG9hZH0sIEBzYW1we25vbG9hZH0sCi1Ac2FtcHtyZWFkb25seX0sIEBzYW1we2NvZGV9LCBAc2FtcHtkYXRhfSwgQHNhbXB7cm9tfSwgQHNhbXB7c2hhcmV9LCBhbmQKLUBzYW1we2RlYnVnfS4gIFlvdSBjYW4gc2V0IHRoZSBAc2FtcHtjb250ZW50c30gZmxhZyBmb3IgYSBzZWN0aW9uIHdoaWNoCi1kb2VzIG5vdCBoYXZlIGNvbnRlbnRzLCBidXQgaXQgaXMgbm90IG1lYW5pbmdmdWwgdG8gY2xlYXIgdGhlCi1Ac2FtcHtjb250ZW50c30gZmxhZyBvZiBhIHNlY3Rpb24gd2hpY2ggZG9lcyBoYXZlIGNvbnRlbnRzLS1qdXN0IHJlbW92ZQotdGhlIHNlY3Rpb24gaW5zdGVhZC4gIE5vdCBhbGwgZmxhZ3MgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZQotZm9ybWF0cy4KLQotQGl0ZW0gLS1hZGQtc2VjdGlvbiBAdmFye3NlY3Rpb25uYW1lfT1AdmFye2ZpbGVuYW1lfQotQWRkIGEgbmV3IHNlY3Rpb24gbmFtZWQgQHZhcntzZWN0aW9ubmFtZX0gd2hpbGUgY29weWluZyB0aGUgZmlsZS4gIFRoZQotY29udGVudHMgb2YgdGhlIG5ldyBzZWN0aW9uIGFyZSB0YWtlbiBmcm9tIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LiAgVGhlCi1zaXplIG9mIHRoZSBzZWN0aW9uIHdpbGwgYmUgdGhlIHNpemUgb2YgdGhlIGZpbGUuICBUaGlzIG9wdGlvbiBvbmx5Ci13b3JrcyBvbiBmaWxlIGZvcm1hdHMgd2hpY2ggY2FuIHN1cHBvcnQgc2VjdGlvbnMgd2l0aCBhcmJpdHJhcnkgbmFtZXMuCi0KLUBpdGVtIC0tY2hhbmdlLWxlYWRpbmctY2hhcgotU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mCi1zeW1ib2xzLiAgVGhlIG1vc3QgY29tbW9uIHN1Y2ggY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUsIHdoaWNoIGNvbXBpbGVycwotb2Z0ZW4gYWRkIGJlZm9yZSBldmVyeSBzeW1ib2wuICBUaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtvYmpjb3B5fSB0bwotY2hhbmdlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBvZiBldmVyeSBzeW1ib2wgd2hlbiBpdCBjb252ZXJ0cyBiZXR3ZWVuCi1vYmplY3QgZmlsZSBmb3JtYXRzLiAgSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNlIHRoZSBzYW1lIGxlYWRpbmcKLWNoYXJhY3RlciwgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdC4gIE90aGVyd2lzZSwgaXQgd2lsbCBhZGQgYQotY2hhcmFjdGVyLCBvciByZW1vdmUgYSBjaGFyYWN0ZXIsIG9yIGNoYW5nZSBhIGNoYXJhY3RlciwgYXMKLWFwcHJvcHJpYXRlLgotCi1AaXRlbSAtLXJlbW92ZS1sZWFkaW5nLWNoYXIKLUlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBnbG9iYWwgc3ltYm9sIGlzIGEgc3BlY2lhbCBzeW1ib2wgbGVhZGluZwotY2hhcmFjdGVyIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgcmVtb3ZlIHRoZSBjaGFyYWN0ZXIuICBUaGUKLW1vc3QgY29tbW9uIHN5bWJvbCBsZWFkaW5nIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLiAgVGhpcyBvcHRpb24gd2lsbAotcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gYWxsIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi1pZiB5b3Ugd2FudCB0byBsaW5rIHRvZ2V0aGVyIG9iamVjdHMgb2YgZGlmZmVyZW50IGZpbGUgZm9ybWF0cyB3aXRoCi1kaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20KLUBjb2Rley0tY2hhbmdlLWxlYWRpbmctY2hhcn0gYmVjYXVzZSBpdCBhbHdheXMgY2hhbmdlcyB0aGUgc3ltYm9sIG5hbWUKLXdoZW4gYXBwcm9wcmlhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0Ci1maWxlLgotCi1AaXRlbSAtLXdlYWtlbgotQ2hhbmdlIGFsbCBnbG9iYWwgc3ltYm9scyBpbiB0aGUgZmlsZSB0byBiZSB3ZWFrLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi13aGVuIGJ1aWxkaW5nIGFuIG9iamVjdCB3aGljaCB3aWxsIGJlIGxpbmtlZCBhZ2FpbnN0IG90aGVyIG9iamVjdHMgdXNpbmcKLXRoZSBAY29kZXstUn0gb3B0aW9uIHRvIHRoZSBsaW5rZXIuICBUaGlzIG9wdGlvbiBpcyBvbmx5IGVmZmVjdGl2ZSB3aGVuCi11c2luZyBhbiBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgd2VhayBzeW1ib2xzLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7b2JqY29weX0uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJib3NlCi1WZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKLWFyY2hpdmVzLCBAc2FtcHtvYmpjb3B5IC1WfSBsaXN0cyBhbGwgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gLS1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtvYmpjb3B5fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgb2JqZHVtcAotQGNoYXB0ZXIgb2JqZHVtcAotCi1AY2luZGV4IG9iamVjdCBmaWxlIGluZm9ybWF0aW9uCi1Aa2luZGV4IG9iamR1bXAKLQotQHNtYWxsZXhhbXBsZQotb2JqZHVtcCBbIC1hIHwgLS1hcmNoaXZlLWhlYWRlcnMgXSAKLSAgICAgICAgWyAtYiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdIAotICAgICAgICBbIC1DIHwgLS1kZW1hbmdsZSBdCi0gICAgICAgIFsgLWQgfCAtLWRpc2Fzc2VtYmxlIF0KLSAgICAgICAgWyAtRCB8IC0tZGlzYXNzZW1ibGUtYWxsIF0KLSAgICAgICAgWyAteiB8IC0tZGlzYXNzZW1ibGUtemVyb2VzIF0KLSAgICAgICAgWyAtRUIgfCAtRUwgfCAtLWVuZGlhbj1Ae2JpZyB8IGxpdHRsZSBAfSBdCi0gICAgICAgIFsgLWYgfCAtLWZpbGUtaGVhZGVycyBdCi0gICAgICAgIFsgLWcgfCAtLWRlYnVnZ2luZyBdCi0gICAgICAgIFsgLWggfCAtLXNlY3Rpb24taGVhZGVycyB8IC0taGVhZGVycyBdCi0gICAgICAgIFsgLWkgfCAtLWluZm8gXQotICAgICAgICBbIC1qIEB2YXJ7c2VjdGlvbn0gfCAtLXNlY3Rpb249QHZhcntzZWN0aW9ufSBdCi0gICAgICAgIFsgLWwgfCAtLWxpbmUtbnVtYmVycyBdCi0gICAgICAgIFsgLVMgfCAtLXNvdXJjZSBdCi0gICAgICAgIFsgLW0gQHZhcnttYWNoaW5lfSB8IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7bWFjaGluZX0gXQotICAgICAgICBbIC1NIEB2YXJ7b3B0aW9uc30gfCAtLWRpc2Fzc2VtYmxlci1vcHRpb25zPUB2YXJ7b3B0aW9uc31dCi0gICAgICAgIFsgLXAgfCAtLXByaXZhdGUtaGVhZGVycyBdCi0gICAgICAgIFsgLXIgfCAtLXJlbG9jIF0KLSAgICAgICAgWyAtUiB8IC0tZHluYW1pYy1yZWxvYyBdCi0gICAgICAgIFsgLXMgfCAtLWZ1bGwtY29udGVudHMgXQotICAgICAgICBbIC1HIHwgLS1zdGFicyBdCi0gICAgICAgIFsgLXQgfCAtLXN5bXMgXQotICAgICAgICBbIC1UIHwgLS1keW5hbWljLXN5bXMgXQotICAgICAgICBbIC14IHwgLS1hbGwtaGVhZGVycyBdCi0gICAgICAgIFsgLXcgfCAtLXdpZGUgXQotICAgICAgICBbIC0tc3RhcnQtYWRkcmVzcz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXN0b3AtYWRkcmVzcz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXByZWZpeC1hZGRyZXNzZXNdCi0gICAgICAgIFsgLS1bbm8tXXNob3ctcmF3LWluc24gXQotICAgICAgICBbIC0tYWRqdXN0LXZtYT1AdmFye29mZnNldH0gXQotICAgICAgICBbIC1WIHwgLS12ZXJzaW9uIF0KLSAgICAgICAgWyAtSCB8IC0taGVscCBdCi0gICAgICAgIEB2YXJ7b2JqZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtvYmpkdW1wfSBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBvYmplY3QgZmlsZXMuCi1UaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LiAgVGhpcwotaW5mb3JtYXRpb24gaXMgbW9zdGx5IHVzZWZ1bCB0byBwcm9ncmFtbWVycyB3aG8gYXJlIHdvcmtpbmcgb24gdGhlCi1jb21waWxhdGlvbiB0b29scywgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWVycyB3aG8ganVzdCB3YW50IHRoZWlyCi1wcm9ncmFtIHRvIGNvbXBpbGUgYW5kIHdvcmsuCi0KLUB2YXJ7b2JqZmlsZX1AZG90c3t9IGFyZSB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlIGV4YW1pbmVkLiAgV2hlbiB5b3UKLXNwZWNpZnkgYXJjaGl2ZXMsIEBjb2Rle29iamR1bXB9IHNob3dzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIG1lbWJlcgotb2JqZWN0IGZpbGVzLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gZnJvbSB0aGUgbGlzdAotQHNhbXB7LWEsLWQsLUQsLWYsLWcsLUcsLWgsLUgsLXAsLXIsLVIsLVMsLXQsLVQsLVYsLXh9IG11c3QgYmUgZ2l2ZW4uIAotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hCi1AaXRlbXggLS1hcmNoaXZlLWhlYWRlcgotQGNpbmRleCBhcmNoaXZlIGhlYWRlcnMKLUlmIGFueSBvZiB0aGUgQHZhcntvYmpmaWxlfSBmaWxlcyBhcmUgYXJjaGl2ZXMsIGRpc3BsYXkgdGhlIGFyY2hpdmUKLWhlYWRlciBpbmZvcm1hdGlvbiAoaW4gYSBmb3JtYXQgc2ltaWxhciB0byBAc2FtcHtscyAtbH0pLiAgQmVzaWRlcyB0aGUKLWluZm9ybWF0aW9uIHlvdSBjb3VsZCBsaXN0IHdpdGggQHNhbXB7YXIgdHZ9LCBAc2FtcHtvYmpkdW1wIC1hfSBzaG93cwotdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiBlYWNoIGFyY2hpdmUgbWVtYmVyLgotCi1AaXRlbSAtLWFkanVzdC12bWE9QHZhcntvZmZzZXR9Ci1AY2luZGV4IHNlY3Rpb24gYWRkcmVzc2VzIGluIG9iamR1bXAKLUBjaW5kZXggVk1BIGluIG9iamR1bXAKLVdoZW4gZHVtcGluZyBpbmZvcm1hdGlvbiwgZmlyc3QgYWRkIEB2YXJ7b2Zmc2V0fSB0byBhbGwgdGhlIHNlY3Rpb24KLWFkZHJlc3Nlcy4gIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBkbyBub3QgY29ycmVzcG9uZCB0bwotdGhlIHN5bWJvbCB0YWJsZSwgd2hpY2ggY2FuIGhhcHBlbiB3aGVuIHB1dHRpbmcgc2VjdGlvbnMgYXQgcGFydGljdWxhcgotYWRkcmVzc2VzIHdoZW4gdXNpbmcgYSBmb3JtYXQgd2hpY2ggY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBhZGRyZXNzZXMsCi1zdWNoIGFzIGEub3V0LgotCi1AaXRlbSAtYiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgdGhhdCB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIGlzCi1AdmFye2JmZG5hbWV9LiAgVGhpcyBvcHRpb24gbWF5IG5vdCBiZSBuZWNlc3Nhcnk7IEB2YXJ7b2JqZHVtcH0gY2FuCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuCi0KLUZvciBleGFtcGxlLAotQGV4YW1wbGUKLW9iamR1bXAgLWIgb2FzeXMgLW0gdmF4IC1oIGZ1Lm8KLUBlbmQgZXhhbXBsZQotQG5vaW5kZW50Ci1kaXNwbGF5cyBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycyAoQHNhbXB7LWh9KSBvZgotQGZpbGV7ZnUub30sIHdoaWNoIGlzIGV4cGxpY2l0bHkgaWRlbnRpZmllZCAoQHNhbXB7LW19KSBhcyBhIFZBWCBvYmplY3QKLWZpbGUgaW4gdGhlIGZvcm1hdCBwcm9kdWNlZCBieSBPYXN5cyBjb21waWxlcnMuICBZb3UgY2FuIGxpc3QgdGhlCi1mb3JtYXRzIGF2YWlsYWJsZSB3aXRoIHRoZSBAc2FtcHstaX0gb3B0aW9uLgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtQwotQGl0ZW14IC0tZGVtYW5nbGUKLUBjaW5kZXggZGVtYW5nbGluZyBpbiBvYmpkdW1wCi1EZWNvZGUgKEBkZm57ZGVtYW5nbGV9KSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLiAgQHhyZWZ7YysrZmlsdH0sIGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiBkZW1hbmdsaW5nLgotCi1AaXRlbSAtRwotQGl0ZW0gLS1kZWJ1Z2dpbmcKLURpc3BsYXkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBhdHRlbXB0cyB0byBwYXJzZSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgZmlsZSBhbmQgcHJpbnQgaXQgb3V0IHVzaW5nIGEgQyBsaWtlIHN5bnRheC4KLU9ubHkgY2VydGFpbiB0eXBlcyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZGlzYXNzZW1ibGUKLUBjaW5kZXggZGlzYXNzZW1ibGluZyBvYmplY3QgY29kZQotQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucwotRGlzcGxheSB0aGUgYXNzZW1ibGVyIG1uZW1vbmljcyBmb3IgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGZyb20KLUB2YXJ7b2JqZmlsZX0uICBUaGlzIG9wdGlvbiBvbmx5IGRpc2Fzc2VtYmxlcyB0aG9zZSBzZWN0aW9ucyB3aGljaCBhcmUKLWV4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSAtRAotQGl0ZW14IC0tZGlzYXNzZW1ibGUtYWxsCi1MaWtlIEBzYW1wey1kfSwgYnV0IGRpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMsIG5vdCBqdXN0Ci10aG9zZSBleHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLS1wcmVmaXgtYWRkcmVzc2VzCi1XaGVuIGRpc2Fzc2VtYmxpbmcsIHByaW50IHRoZSBjb21wbGV0ZSBhZGRyZXNzIG9uIGVhY2ggbGluZS4gIFRoaXMgaXMKLXRoZSBvbGRlciBkaXNhc3NlbWJseSBmb3JtYXQuCi0KLUBpdGVtIC0tZGlzYXNzZW1ibGUtemVyb2VzCi1Ob3JtYWxseSB0aGUgZGlzYXNzZW1ibHkgb3V0cHV0IHdpbGwgc2tpcCBibG9ja3Mgb2YgemVyb2VzLiAgVGhpcwotb3B0aW9uIGRpcmVjdHMgdGhlIGRpc2Fzc2VtYmxlciB0byBkaXNhc3NlbWJsZSB0aG9zZSBibG9ja3MsIGp1c3QgbGlrZQotYW55IG90aGVyIGRhdGEuCi0KLUBpdGVtIC1FQgotQGl0ZW14IC1FTAotQGl0ZW14IC0tZW5kaWFuPUB7YmlnfGxpdHRsZUB9Ci1AY2luZGV4IGVuZGlhbm5lc3MKLUBjaW5kZXggZGlzYXNzZW1ibHkgZW5kaWFubmVzcwotU3BlY2lmeSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBvbmx5IGFmZmVjdHMKLWRpc2Fzc2VtYmx5LiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBhIGZpbGUgZm9ybWF0IHdoaWNoCi1kb2VzIG5vdCBkZXNjcmliZSBlbmRpYW5uZXNzIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4KLQotQGl0ZW0gLWYKLUBpdGVteCAtLWZpbGUtaGVhZGVyCi1AY2luZGV4IG9iamVjdCBmaWxlIGhlYWRlcgotRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIG92ZXJhbGwgaGVhZGVyIG9mCi1lYWNoIG9mIHRoZSBAdmFye29iamZpbGV9IGZpbGVzLgotCi1AaXRlbSAtaAotQGl0ZW14IC0tc2VjdGlvbi1oZWFkZXIKLUBpdGVteCAtLWhlYWRlcgotQGNpbmRleCBzZWN0aW9uIGhlYWRlcnMKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgb2YgdGhlCi1vYmplY3QgZmlsZS4KLQotRmlsZSBzZWdtZW50cyBtYXkgYmUgcmVsb2NhdGVkIHRvIG5vbnN0YW5kYXJkIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYnkKLXVzaW5nIHRoZSBAc2FtcHstVHRleHR9LCBAc2FtcHstVGRhdGF9LCBvciBAc2FtcHstVGJzc30gb3B0aW9ucyB0bwotQGNvZGV7bGR9LiAgSG93ZXZlciwgc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBzdWNoIGFzIGEub3V0LCBkbyBub3QKLXN0b3JlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmaWxlIHNlZ21lbnRzLiAgSW4gdGhvc2Ugc2l0dWF0aW9ucywKLWFsdGhvdWdoIEBjb2Rle2xkfSByZWxvY2F0ZXMgdGhlIHNlY3Rpb25zIGNvcnJlY3RseSwgdXNpbmcgQHNhbXB7b2JqZHVtcAotLWh9IHRvIGxpc3QgdGhlIGZpbGUgc2VjdGlvbiBoZWFkZXJzIGNhbm5vdCBzaG93IHRoZSBjb3JyZWN0IGFkZHJlc3Nlcy4KLUluc3RlYWQsIGl0IHNob3dzIHRoZSB1c3VhbCBhZGRyZXNzZXMsIHdoaWNoIGFyZSBpbXBsaWNpdCBmb3IgdGhlCi10YXJnZXQuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle29iamR1bXB9IGFuZCBleGl0LgotCi1AaXRlbSAtaQotQGl0ZW14IC0taW5mbwotQGNpbmRleCBhcmNoaXRlY3R1cmVzIGF2YWlsYWJsZQotQGNpbmRleCBvYmplY3QgZm9ybWF0cyBhdmFpbGFibGUKLURpc3BsYXkgYSBsaXN0IHNob3dpbmcgYWxsIGFyY2hpdGVjdHVyZXMgYW5kIG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotZm9yIHNwZWNpZmljYXRpb24gd2l0aCBAc2FtcHstYn0gb3IgQHNhbXB7LW19LgotCi1AaXRlbSAtaiBAdmFye25hbWV9Ci1AaXRlbXggLS1zZWN0aW9uPUB2YXJ7bmFtZX0KLUBjaW5kZXggc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheSBpbmZvcm1hdGlvbiBvbmx5IGZvciBzZWN0aW9uIEB2YXJ7bmFtZX0uCi0KLUBpdGVtIC1sCi1AaXRlbXggLS1saW5lLW51bWJlcnMKLUBjaW5kZXggc291cmNlIGZpbGVuYW1lcyBmb3Igb2JqZWN0IGZpbGVzCi1MYWJlbCB0aGUgZGlzcGxheSAodXNpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uKSB3aXRoIHRoZSBmaWxlbmFtZSBhbmQKLXNvdXJjZSBsaW5lIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGNvZGUgb3IgcmVsb2NzIHNob3duLgotT25seSB1c2VmdWwgd2l0aCBAc2FtcHstZH0sIEBzYW1wey1EfSwgb3IgQHNhbXB7LXJ9LgotCi1AaXRlbSAtbSBAdmFye21hY2hpbmV9Ci1AaXRlbXggLS1hcmNoaXRlY3R1cmU9QHZhcnttYWNoaW5lfQotQGNpbmRleCBhcmNoaXRlY3R1cmUKLUBjaW5kZXggZGlzYXNzZW1ibHkgYXJjaGl0ZWN0dXJlCi1TcGVjaWZ5IHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMuICBUaGlzCi1jYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgd2hpY2ggZG8gbm90IGRlc2NyaWJlCi1hcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLQotQGl0ZW0gLU0gQHZhcntvcHRpb25zfQotQGl0ZW14IC0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9QHZhcntvcHRpb25zfQotUGFzcyB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdGhlIGRpc2Fzc2VtYmxlci4gIE9ubHkgc3VwcG9ydGVkIG9uCi1zb21lIHRhcmdldHMuCi0KLUlmIHRoZSB0YXJnZXQgaXMgYW4gQVJNIGFyY2hpdGVjdHVyZSB0aGVuIHRoaXMgc3dpdGNoIGNhbiBiZSB1c2VkIHRvCi1zZWxlY3Qgd2hpY2ggcmVnaXN0ZXIgbmFtZSBzZXQgaXMgdXNlZCBkdXJpbmcgZGlzYXNzZW1ibGVyLiAgU3BlY2lmeWluZwotQHNhbXB7LS1kaXNhc3NlbWJsZXItb3B0aW9ucz1yZWctbmFtZS1zdGR9ICh0aGUgZGVmYXVsdCkgd2lsbCBzZWxlY3QgdGhlCi1yZWdpc3RlciBuYW1lcyBhcyB1c2VkIGluIEFSTSdzIGluc3RydWN0aW9uIHNldCBkb2N1bWVudGF0aW9uLCBidXQgd2l0aAotcmVnaXN0ZXIgMTMgY2FsbGVkICdzcCcsIHJlZ2lzdGVyIDE0IGNhbGxlZCAnbHInIGFuZCByZWdpc3RlciAxNSBjYWxsZWQKLSdwYycuICBTcGVjaWZ5aW5nIEBzYW1wey0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9cmVnLW5hbWVzLWFwY3N9IHdpbGwKLXNlbGVjdCB0aGUgbmFtZSBzZXQgdXNlZCBieSB0aGUgQVJNIFByb2NlZHVyZSBDYWxsIFN0YW5kYXJkLCB3aGlsc3QKLXNwZWNpZnlpbmcgQHNhbXB7LS1kaXNhc3NlbWJsZXItb3B0aW9ucz1yZWctbmFtZXMtcmF3fSB3aWxsIGp1c3QgdXNlCi1Ac2FtcHtyfSBmb2xsb3dlZCBieSB0aGUgcmVnaXN0ZXIgbnVtYmVyLgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJpdmF0ZS1oZWFkZXJzCi1QcmludCBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUgZXhhY3QKLWluZm9ybWF0aW9uIHByaW50ZWQgZGVwZW5kcyB1cG9uIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBGb3Igc29tZQotb2JqZWN0IGZpbGUgZm9ybWF0cywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLgotCi1AaXRlbSAtcgotQGl0ZW14IC0tcmVsb2MKLUBjaW5kZXggcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQotUHJpbnQgdGhlIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIElmIHVzZWQgd2l0aCBAc2FtcHstZH0gb3IKLUBzYW1wey1EfSwgdGhlIHJlbG9jYXRpb25zIGFyZSBwcmludGVkIGludGVyc3BlcnNlZCB3aXRoIHRoZQotZGlzYXNzZW1ibHkuCi0KLUBpdGVtIC1SCi1AaXRlbXggLS1keW5hbWljLXJlbG9jCi1AY2luZGV4IGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQotUHJpbnQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLWZ1bGwtY29udGVudHMKLUBjaW5kZXggc2VjdGlvbnMsIGZ1bGwgY29udGVudHMKLUBjaW5kZXggb2JqZWN0IGZpbGUgc2VjdGlvbnMKLURpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYW55IHNlY3Rpb25zIHJlcXVlc3RlZC4KLQotQGl0ZW0gLVMKLUBpdGVteCAtLXNvdXJjZQotQGNpbmRleCBzb3VyY2UgZGlzYXNzZW1ibHkKLUBjaW5kZXggZGlzYXNzZW1ibHksIHdpdGggc291cmNlCi1EaXNwbGF5IHNvdXJjZSBjb2RlIGludGVybWl4ZWQgd2l0aCBkaXNhc3NlbWJseSwgaWYgcG9zc2libGUuICBJbXBsaWVzCi1Ac2FtcHstZH0uCi0KLUBpdGVtIC0tc2hvdy1yYXctaW5zbgotV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgcHJpbnQgdGhlIGluc3RydWN0aW9uIGluIGhleCBhcyB3ZWxsIGFzCi1pbiBzeW1ib2xpYyBmb3JtLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBleGNlcHQgd2hlbgotQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgotCi1AaXRlbSAtLW5vLXNob3ctcmF3LWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIGRvIG5vdCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IHdoZW4gQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgotCi1AaXRlbSAtRwotQGl0ZW0gLS1zdGFicwotQGNpbmRleCBzdGFiCi1AY2luZGV4IC5zdGFiCi1AY2luZGV4IGRlYnVnIHN5bWJvbHMKLUBjaW5kZXggRUxGIG9iamVjdCBmaWxlIGZvcm1hdAotRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbnkgc2VjdGlvbnMgcmVxdWVzdGVkLiAgRGlzcGxheSB0aGUKLWNvbnRlbnRzIG9mIHRoZSAuc3RhYiBhbmQgLnN0YWIuaW5kZXggYW5kIC5zdGFiLmV4Y2wgc2VjdGlvbnMgZnJvbSBhbgotRUxGIGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgKHN1Y2ggYXMgU29sYXJpcyAyLjApIGluIHdoaWNoCi1AY29kZXsuc3RhYn0gZGVidWdnaW5nIHN5bWJvbC10YWJsZSBlbnRyaWVzIGFyZSBjYXJyaWVkIGluIGFuIEVMRgotc2VjdGlvbi4gIEluIG1vc3Qgb3RoZXIgZmlsZSBmb3JtYXRzLCBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlCi1pbnRlcmxlYXZlZCB3aXRoIGxpbmthZ2Ugc3ltYm9scywgYW5kIGFyZSB2aXNpYmxlIGluIHRoZSBAc2FtcHstLXN5bXN9Ci1vdXRwdXQuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdGFicyBzeW1ib2xzLCBzZWUgQHJlZntUb3AsU3RhYnMsU3RhYnMKLU92ZXJ2aWV3LHN0YWJzLmluZm8sIFRoZSBgYHN0YWJzJycgZGVidWcgZm9ybWF0fS4KLQotQGl0ZW0gLS1zdGFydC1hZGRyZXNzPUB2YXJ7YWRkcmVzc30KLUBjaW5kZXggc3RhcnQtYWRkcmVzcwotU3RhcnQgZGlzcGxheWluZyBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoaXMgYWZmZWN0cyB0aGUgb3V0cHV0Ci1vZiB0aGUgQGNvZGV7LWR9LCBAY29kZXstcn0gYW5kIEBjb2Rley1zfSBvcHRpb25zLgotCi1AaXRlbSAtLXN0b3AtYWRkcmVzcz1AdmFye2FkZHJlc3N9Ci1AY2luZGV4IHN0b3AtYWRkcmVzcwotU3RvcCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZSBAY29kZXstZH0sIEBjb2Rley1yfSBhbmQgQGNvZGV7LXN9IG9wdGlvbnMuCi0KLUBpdGVtIC10Ci1AaXRlbXggLS1zeW1zCi1AY2luZGV4IHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBwcmludGluZwotUHJpbnQgdGhlIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZSBmaWxlLgotVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgQHNhbXB7bm19IHByb2dyYW0uCi0KLUBpdGVtIC1UCi1AaXRlbXggLS1keW5hbWljLXN5bXMKLUBjaW5kZXggZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcywgcHJpbnRpbmcKLVByaW50IHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIEBzYW1we25tfQotcHJvZ3JhbSB3aGVuIGdpdmVuIHRoZSBAc2FtcHstRH0gKEBzYW1wey0tZHluYW1pY30pIG9wdGlvbi4KLQotQGl0ZW0gLS12ZXJzaW9uCi1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7b2JqZHVtcH0gYW5kIGV4aXQuCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1hbGwtaGVhZGVyCi1AY2luZGV4IGFsbCBoZWFkZXIgaW5mb3JtYXRpb24sIG9iamVjdCBmaWxlCi1AY2luZGV4IGhlYWRlciBpbmZvcm1hdGlvbiwgYWxsCi1EaXNwbGF5IGFsbCBhdmFpbGFibGUgaGVhZGVyIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB0YWJsZSBhbmQKLXJlbG9jYXRpb24gZW50cmllcy4gIFVzaW5nIEBzYW1wey14fSBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgYWxsIG9mCi1Ac2FtcHstYSAtZiAtaCAtciAtdH0uCi0KLUBpdGVtIC13Ci1AaXRlbXggLS13aWRlCi1AY2luZGV4IHdpZGUgb3V0cHV0LCBwcmludGluZwotRm9ybWF0IHNvbWUgbGluZXMgZm9yIG91dHB1dCBkZXZpY2VzIHRoYXQgaGF2ZSBtb3JlIHRoYW4gODAgY29sdW1ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgcmFubGliCi1AY2hhcHRlciByYW5saWIKLQotQGtpbmRleCByYW5saWIKLUBjaW5kZXggYXJjaGl2ZSBjb250ZW50cwotQGNpbmRleCBzeW1ib2wgaW5kZXgKLQotQHNtYWxsZXhhbXBsZQotcmFubGliIFstdlZdIEB2YXJ7YXJjaGl2ZX0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle3JhbmxpYn0gZ2VuZXJhdGVzIGFuIGluZGV4IHRvIHRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlIGFuZAotc3RvcmVzIGl0IGluIHRoZSBhcmNoaXZlLiAgVGhlIGluZGV4IGxpc3RzIGVhY2ggc3ltYm9sIGRlZmluZWQgYnkgYQotbWVtYmVyIG9mIGFuIGFyY2hpdmUgdGhhdCBpcyBhIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlLiAgCi0KLVlvdSBtYXkgdXNlIEBzYW1we25tIC1zfSBvciBAc2FtcHtubSAtLXByaW50LWFybWFwfSB0byBsaXN0IHRoaXMgaW5kZXguCi0KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5IGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotCi1UaGUgQHNje2dudX0gQGNvZGV7cmFubGlifSBwcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBAc2N7Z251fSBAY29kZXthcn07IHJ1bm5pbmcKLUBjb2Rle3JhbmxpYn0gaXMgY29tcGxldGVseSBlcXVpdmFsZW50IHRvIGV4ZWN1dGluZyBAc2FtcHthciAtc30uCi1AeHJlZnthcn0uCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLXYKLUBpdGVteCAtVgotQGl0ZW14IC0tdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7cmFubGlifS4KLUBlbmQgdGFibGUKLQotQG5vZGUgc2l6ZQotQGNoYXB0ZXIgc2l6ZQotCi1Aa2luZGV4IHNpemUKLUBjaW5kZXggc2VjdGlvbiBzaXplcwotCi1Ac21hbGxleGFtcGxlCi1zaXplIFsgLUEgfCAtQiB8IC0tZm9ybWF0PUB2YXJ7Y29tcGF0aWJpbGl0eX0gXQotICAgICBbIC0taGVscCBdICBbIC1kIHwgLW8gfCAteCB8IC0tcmFkaXg9QHZhcntudW1iZXJ9IF0KLSAgICAgWyAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0gIFsgLVYgfCAtLXZlcnNpb24gXSAgCi0gICAgIFsgQHZhcntvYmpmaWxlfUBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzY3tnbnV9IEBjb2Rle3NpemV9IHV0aWxpdHkgbGlzdHMgdGhlIHNlY3Rpb24gc2l6ZXMtLS1hbmQgdGhlIHRvdGFsCi1zaXplLS0tZm9yIGVhY2ggb2YgdGhlIG9iamVjdCBvciBhcmNoaXZlIGZpbGVzIEB2YXJ7b2JqZmlsZX0gaW4gaXRzCi1hcmd1bWVudCBsaXN0LiAgQnkgZGVmYXVsdCwgb25lIGxpbmUgb2Ygb3V0cHV0IGlzIGdlbmVyYXRlZCBmb3IgZWFjaAotb2JqZWN0IGZpbGUgb3IgZWFjaCBtb2R1bGUgaW4gYW4gYXJjaGl2ZS4KLQotQHZhcntvYmpmaWxlfUBkb3Rze30gYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuCi1JZiBub25lIGFyZSBzcGVjaWZpZWQsIHRoZSBmaWxlIEBjb2Rle2Eub3V0fSB3aWxsIGJlIHVzZWQuCi0KLVRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUEKLUBpdGVteCAtQgotQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Y29tcGF0aWJpbGl0eX0KLUBjaW5kZXggQGNvZGV7c2l6ZX0gZGlzcGxheSBmb3JtYXQKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNob29zZSB3aGV0aGVyIHRoZSBvdXRwdXQgZnJvbSBAc2N7Z251fQotQGNvZGV7c2l6ZX0gcmVzZW1ibGVzIG91dHB1dCBmcm9tIFN5c3RlbSBWIEBjb2Rle3NpemV9ICh1c2luZyBAc2FtcHstQX0sCi1vciBAc2FtcHstLWZvcm1hdD1zeXN2fSksIG9yIEJlcmtlbGV5IEBjb2Rle3NpemV9ICh1c2luZyBAc2FtcHstQn0sIG9yCi1Ac2FtcHstLWZvcm1hdD1iZXJrZWxleX0pLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG9uZS1saW5lIGZvcm1hdCBzaW1pbGFyIHRvCi1CZXJrZWxleSdzLiAgCi1AYyBCb251cyBmb3IgZG9jLXNvdXJjZSByZWFkZXJzOiB5b3UgY2FuIGFsc28gc2F5IC0tZm9ybWF0PXN0cmFuZ2UgKG9yCi1AYyBhbnl0aGluZyBlbHNlIHRoYXQgc3RhcnRzIHdpdGggJ3MnKSBmb3Igc3lzdiwgYW5kIC0tZm9ybWF0PWJvcmluZyAob3IKLUBjIGFueXRoaW5nIGVsc2UgdGhhdCBzdGFydHMgd2l0aCAnYicpIGZvciBCZXJrZWxleS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSBCZXJrZWxleSAoZGVmYXVsdCkgZm9ybWF0IG9mIG91dHB1dCBmcm9tCi1AY29kZXtzaXplfTogCi1Ac21hbGxleGFtcGxlCi0kIHNpemUgLS1mb3JtYXQ9QmVya2VsZXkgcmFubGliIHNpemUKLXRleHQgICAgZGF0YSAgICBic3MgICAgIGRlYyAgICAgaGV4ICAgICBmaWxlbmFtZQotMjk0ODgwICA4MTkyMCAgIDExNTkyICAgMzg4MzkyICA1ZWQyOCAgIHJhbmxpYgotMjk0ODgwICA4MTkyMCAgIDExODg4ICAgMzg4Njg4ICA1ZWU1MCAgIHNpemUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBpcyB0aGUgc2FtZSBkYXRhLCBidXQgZGlzcGxheWVkIGNsb3NlciB0byBTeXN0ZW0gViBjb252ZW50aW9uczoKLQotQHNtYWxsZXhhbXBsZQotJCBzaXplIC0tZm9ybWF0PVN5c1YgcmFubGliIHNpemUKLXJhbmxpYiAgOgotc2VjdGlvbiAgICAgICAgIHNpemUgICAgICAgICBhZGRyCi0udGV4dCAgICAgICAgIDI5NDg4MCAgICAgICAgIDgxOTIgICAgICAgCi0uZGF0YSAgICAgICAgICA4MTkyMCAgICAgICAzMDMxMDQgICAgICAgCi0uYnNzICAgICAgICAgICAxMTU5MiAgICAgICAzODUwMjQgICAgICAgCi1Ub3RhbCAgICAgICAgIDM4ODM5MiAgICAKLQotCi1zaXplICA6Ci1zZWN0aW9uICAgICAgICAgc2l6ZSAgICAgICAgIGFkZHIKLS50ZXh0ICAgICAgICAgMjk0ODgwICAgICAgICAgODE5MiAgICAgICAKLS5kYXRhICAgICAgICAgIDgxOTIwICAgICAgIDMwMzEwNCAgICAgICAKLS5ic3MgICAgICAgICAgIDExODg4ICAgICAgIDM4NTAyNCAgICAgICAKLVRvdGFsICAgICAgICAgMzg4Njg4ICAgIAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gLS1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiBhY2NlcHRhYmxlIGFyZ3VtZW50cyBhbmQgb3B0aW9ucy4KLQotQGl0ZW0gLWQKLUBpdGVteCAtbwotQGl0ZW14IC14Ci1AaXRlbXggLS1yYWRpeD1AdmFye251bWJlcn0KLUBjaW5kZXggQGNvZGV7c2l6ZX0gbnVtYmVyIGZvcm1hdAotQGNpbmRleCByYWRpeCBmb3Igc2VjdGlvbiBzaXplcwotVXNpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gY29udHJvbCB3aGV0aGVyIHRoZSBzaXplIG9mIGVhY2gKLXNlY3Rpb24gaXMgZ2l2ZW4gaW4gZGVjaW1hbCAoQHNhbXB7LWR9LCBvciBAc2FtcHstLXJhZGl4PTEwfSk7IG9jdGFsCi0oQHNhbXB7LW99LCBvciBAc2FtcHstLXJhZGl4PTh9KTsgb3IgaGV4YWRlY2ltYWwgKEBzYW1wey14fSwgb3IKLUBzYW1wey0tcmFkaXg9MTZ9KS4gIEluIEBzYW1wey0tcmFkaXg9QHZhcntudW1iZXJ9fSwgb25seSB0aGUgdGhyZWUKLXZhbHVlcyAoOCwgMTAsIDE2KSBhcmUgc3VwcG9ydGVkLiAgVGhlIHRvdGFsIHNpemUgaXMgYWx3YXlzIGdpdmVuIGluIHR3bwotcmFkaWNlczsgZGVjaW1hbCBhbmQgaGV4YWRlY2ltYWwgZm9yIEBzYW1wey1kfSBvciBAc2FtcHsteH0gb3V0cHV0LCBvcgotb2N0YWwgYW5kIGhleGFkZWNpbWFsIGlmIHlvdSdyZSB1c2luZyBAc2FtcHstb30uCi0KLUBpdGVtIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IHRoYXQgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgQHZhcntvYmpmaWxlfSBpcwotQHZhcntiZmRuYW1lfS4gIFRoaXMgb3B0aW9uIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBAY29kZXtzaXplfSBjYW4KLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle3NpemV9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBzdHJpbmdzCi1AY2hhcHRlciBzdHJpbmdzCi1Aa2luZGV4IHN0cmluZ3MKLUBjaW5kZXggbGlzdGluZ3Mgc3RyaW5ncwotQGNpbmRleCBwcmludGluZyBzdHJpbmdzCi1AY2luZGV4IHN0cmluZ3MsIHByaW50aW5nCi0KLUBzbWFsbGV4YW1wbGUKLXN0cmluZ3MgWy1hZm92XSBbLUB2YXJ7bWluLWxlbn1dIFstbiBAdmFye21pbi1sZW59XSBbLXQgQHZhcntyYWRpeH1dIFstXQotICAgICAgICBbLS1hbGxdIFstLXByaW50LWZpbGUtbmFtZV0gWy0tYnl0ZXM9QHZhcnttaW4tbGVufV0KLSAgICAgICAgWy0tcmFkaXg9QHZhcntyYWRpeH1dIFstLXRhcmdldD1AdmFye2JmZG5hbWV9XQotICAgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXSBAdmFye2ZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotRm9yIGVhY2ggQHZhcntmaWxlfSBnaXZlbiwgQHNje2dudX0gQGNvZGV7c3RyaW5nc30gcHJpbnRzIHRoZSBwcmludGFibGUKLWNoYXJhY3RlciBzZXF1ZW5jZXMgdGhhdCBhcmUgYXQgbGVhc3QgNCBjaGFyYWN0ZXJzIGxvbmcgKG9yIHRoZSBudW1iZXIKLWdpdmVuIHdpdGggdGhlIG9wdGlvbnMgYmVsb3cpIGFuZCBhcmUgZm9sbG93ZWQgYnkgYW4gdW5wcmludGFibGUKLWNoYXJhY3Rlci4gIEJ5IGRlZmF1bHQsIGl0IG9ubHkgcHJpbnRzIHRoZSBzdHJpbmdzIGZyb20gdGhlIGluaXRpYWxpemVkCi1hbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsgZm9yIG90aGVyIHR5cGVzIG9mIGZpbGVzLCBpdCBwcmludHMKLXRoZSBzdHJpbmdzIGZyb20gdGhlIHdob2xlIGZpbGUuCi0KLUBjb2Rle3N0cmluZ3N9IGlzIG1haW5seSB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50cyBvZiBub24tdGV4dAotZmlsZXMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWEKLUBpdGVteCAtLWFsbAotQGl0ZW14IC0KLURvIG5vdCBzY2FuIG9ubHkgdGhlIGluaXRpYWxpemVkIGFuZCBsb2FkZWQgc2VjdGlvbnMgb2Ygb2JqZWN0IGZpbGVzOwotc2NhbiB0aGUgd2hvbGUgZmlsZXMuCi0KLUBpdGVtIC1mCi1AaXRlbXggLS1wcmludC1maWxlLW5hbWUKLVByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4KLQotQGl0ZW0gLS1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIHByb2dyYW0gdXNhZ2Ugb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotQGl0ZW0gLUB2YXJ7bWluLWxlbn0KLUBpdGVteCAtbiBAdmFye21pbi1sZW59Ci1AaXRlbXggLS1ieXRlcz1AdmFye21pbi1sZW59Ci1QcmludCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhdCBsZWFzdCBAdmFye21pbi1sZW59IGNoYXJhY3RlcnMKLWxvbmcsIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNC4KLQotQGl0ZW0gLW8KLUxpa2UgQHNhbXB7LXQgb30uICBTb21lIG90aGVyIHZlcnNpb25zIG9mIEBjb2Rle3N0cmluZ3N9IGhhdmUgQHNhbXB7LW99Ci1hY3QgbGlrZSBAc2FtcHstdCBkfSBpbnN0ZWFkLiAgU2luY2Ugd2UgY2FuIG5vdCBiZSBjb21wYXRpYmxlIHdpdGggYm90aAotd2F5cywgd2Ugc2ltcGx5IGNob3NlIG9uZS4KLQotQGl0ZW0gLXQgQHZhcntyYWRpeH0KLUBpdGVteCAtLXJhZGl4PUB2YXJ7cmFkaXh9Ci1QcmludCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuICBUaGUgc2luZ2xlCi1jaGFyYWN0ZXIgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSByYWRpeCBvZiB0aGUgb2Zmc2V0LS0tQHNhbXB7b30gZm9yCi1vY3RhbCwgQHNhbXB7eH0gZm9yIGhleGFkZWNpbWFsLCBvciBAc2FtcHtkfSBmb3IgZGVjaW1hbC4KLQotQGl0ZW0gLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcnNpb24KLVByaW50IHRoZSBwcm9ncmFtIHZlcnNpb24gbnVtYmVyIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIHN0cmlwCi1AY2hhcHRlciBzdHJpcAotCi1Aa2luZGV4IHN0cmlwCi1AY2luZGV4IHJlbW92aW5nIHN5bWJvbHMKLUBjaW5kZXggZGlzY2FyZGluZyBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGRpc2NhcmRpbmcKLQotQHNtYWxsZXhhbXBsZQotc3RyaXAgWyAtRiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICBbIC1JIEB2YXJ7YmZkbmFtZX0gfCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgIFsgLU8gQHZhcntiZmRuYW1lfSB8IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgIFsgLXMgfCAtLXN0cmlwLWFsbCBdIFsgLVMgfCAtZyB8IC0tc3RyaXAtZGVidWcgXQotICAgICAgWyAtSyBAdmFye3N5bWJvbG5hbWV9IHwgLS1rZWVwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgIFsgLU4gQHZhcntzeW1ib2xuYW1lfSB8IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgWyAteCB8IC0tZGlzY2FyZC1hbGwgXSBbIC1YIHwgLS1kaXNjYXJkLWxvY2FscyBdCi0gICAgICBbIC1SIEB2YXJ7c2VjdGlvbm5hbWV9IHwgLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfSBdCi0gICAgICBbIC1vIEB2YXJ7ZmlsZX0gXSBbIC1wIHwgLS1wcmVzZXJ2ZS1kYXRlcyBdCi0gICAgICBbIC12IHwgLS12ZXJib3NlIF0gIFsgLVYgfCAtLXZlcnNpb24gXSAgWyAtLWhlbHAgXQotICAgICAgQHZhcntvYmpmaWxlfUBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBzY3tnbnV9IEBjb2Rle3N0cmlwfSBkaXNjYXJkcyBhbGwgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcwotQHZhcntvYmpmaWxlfS4gIFRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBtYXkgaW5jbHVkZSBhcmNoaXZlcy4KLUF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSBtdXN0IGJlIGdpdmVuLgotCi1AY29kZXtzdHJpcH0gbW9kaWZpZXMgdGhlIGZpbGVzIG5hbWVkIGluIGl0cyBhcmd1bWVudCwKLXJhdGhlciB0aGFuIHdyaXRpbmcgbW9kaWZpZWQgY29waWVzIHVuZGVyIGRpZmZlcmVudCBuYW1lcy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtRiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotVHJlYXQgdGhlIG9yaWdpbmFsIEB2YXJ7b2JqZmlsZX0gYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAotY29kZSBmb3JtYXQgQHZhcntiZmRuYW1lfSwgYW5kIHJld3JpdGUgaXQgaW4gdGhlIHNhbWUgZm9ybWF0LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle3N0cmlwfSBhbmQgZXhpdC4KLQotQGl0ZW0gLUkgQHZhcntiZmRuYW1lfQkKLUBpdGVteCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1UcmVhdCB0aGUgb3JpZ2luYWwgQHZhcntvYmpmaWxlfSBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Ci1jb2RlIGZvcm1hdCBAdmFye2JmZG5hbWV9LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtTyBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVJlcGxhY2UgQHZhcntvYmpmaWxlfSB3aXRoIGEgZmlsZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCBAdmFye2JmZG5hbWV9LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtUiBAdmFye3NlY3Rpb25uYW1lfQotQGl0ZW14IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0KLVJlbW92ZSBhbnkgc2VjdGlvbiBuYW1lZCBAdmFye3NlY3Rpb25uYW1lfSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24KLWluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUgb3V0cHV0IGZpbGUgdW51c2FibGUuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1zdHJpcC1hbGwKLVJlbW92ZSBhbGwgc3ltYm9scy4KLQotQGl0ZW0gLWcKLUBpdGVteCAtUwotQGl0ZW14IC0tc3RyaXAtZGVidWcKLVJlbW92ZSBkZWJ1Z2dpbmcgc3ltYm9scyBvbmx5LgotCi1AaXRlbSAtLXN0cmlwLXVubmVlZGVkCi1SZW1vdmUgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotCi1AaXRlbSAtSyBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1rZWVwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1LZWVwIG9ubHkgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkKLWJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtTiBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1zdHJpcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotUmVtb3ZlIHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbiBtYXkgYmUKLWdpdmVuIG1vcmUgdGhhbiBvbmNlLCBhbmQgbWF5IGJlIGNvbWJpbmVkIHdpdGggc3RyaXAgb3B0aW9ucyBvdGhlciB0aGFuCi1AY29kZXstS30uCi0KLUBpdGVtIC1vIEB2YXJ7ZmlsZX0KLVB1dCB0aGUgc3RyaXBwZWQgb3V0cHV0IGluIEB2YXJ7ZmlsZX0sIHJhdGhlciB0aGFuIHJlcGxhY2luZyB0aGUKLWV4aXN0aW5nIGZpbGUuICBXaGVuIHRoaXMgYXJndW1lbnQgaXMgdXNlZCwgb25seSBvbmUgQHZhcntvYmpmaWxlfQotYXJndW1lbnQgbWF5IGJlIHNwZWNpZmllZC4KLQotQGl0ZW0gLXAKLUBpdGVteCAtLXByZXNlcnZlLWRhdGVzCi1QcmVzZXJ2ZSB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIGZpbGUuCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1kaXNjYXJkLWFsbAotUmVtb3ZlIG5vbi1nbG9iYWwgc3ltYm9scy4KLQotQGl0ZW0gLVgKLUBpdGVteCAtLWRpc2NhcmQtbG9jYWxzCi1SZW1vdmUgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuCi0oVGhlc2UgdXN1YWxseSBzdGFydCB3aXRoIEBzYW1we0x9IG9yIEBzYW1wey59LikKLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXtzdHJpcH0uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJib3NlCi1WZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKLWFyY2hpdmVzLCBAc2FtcHtzdHJpcCAtdn0gbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIGMrK2ZpbHQsIGFkZHIybGluZSwgc3RyaXAsIFRvcAotQGNoYXB0ZXIgYysrZmlsdAotCi1Aa2luZGV4IGMrK2ZpbHQKLUBjaW5kZXggZGVtYW5nbGluZyBDKysgc3ltYm9scwotCi1Ac21hbGxleGFtcGxlCi1jKytmaWx0IFsgLV8gfCAtLXN0cmlwLXVuZGVyc2NvcmVzIF0KLSAgICAgICAgWyAtaiB8IC0tamF2YSBdCi0JWyAtbiB8IC0tbm8tc3RyaXAtdW5kZXJzY29yZXMgXQotICAgICAgICBbIC1zIEB2YXJ7Zm9ybWF0fSB8IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fSBdCi0gICAgICAgIFsgLS1oZWxwIF0gIFsgLS12ZXJzaW9uIF0gIFsgQHZhcntzeW1ib2x9QGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Aa2luZGV4IGN4eGZpbHQKLVRoZSBDKysgYW5kIEphdmEgbGFuZ3VhZ2VzIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucwotdGhhdCB5b3UgY2FuIHdyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2gKLXRha2VzIHBhcmFtZXRlcnMgb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgYW5kIEphdmEgZnVuY3Rpb24gbmFtZXMKLWFyZSBlbmNvZGVkIGludG8gYSBsb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcwotQGRmbnttYW5nbGluZ30pLiBUaGUgQGNvZGV7YysrZmlsdH0KLUBmb290bm90ZXtNUy1ET1MgZG9lcyBub3QgYWxsb3cgQGtiZHsrfSBjaGFyYWN0ZXJzIGluIGZpbGUgbmFtZXMsIHNvIG9uCi1NUy1ET1MgdGhpcyBwcm9ncmFtIGlzIG5hbWVkIEBjb2Rle2N4eGZpbHR9Ln0KLXByb2dyYW0gZG9lcyB0aGUgaW52ZXJzZSBtYXBwaW5nOiBpdCBkZWNvZGVzIChAZGZue2RlbWFuZ2xlc30pIGxvdy1sZXZlbAotbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4ga2VlcCB0aGVzZSBvdmVybG9hZGVkCi1mdW5jdGlvbnMgZnJvbSBjbGFzaGluZy4KLQotRXZlcnkgYWxwaGFudW1lcmljIHdvcmQgKGNvbnNpc3Rpbmcgb2YgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywKLWRvbGxhcnMsIG9yIHBlcmlvZHMpIHNlZW4gaW4gdGhlIGlucHV0IGlzIGEgcG90ZW50aWFsIGxhYmVsLiAgSWYgdGhlCi1sYWJlbCBkZWNvZGVzIGludG8gYSBDKysgbmFtZSwgdGhlIEMrKyBuYW1lIHJlcGxhY2VzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgaW4gdGhlIG91dHB1dC4KLQotWW91IGNhbiB1c2UgQGNvZGV7YysrZmlsdH0gdG8gZGVjaXBoZXIgaW5kaXZpZHVhbCBzeW1ib2xzOgotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye3N5bWJvbH0KLUBlbmQgZXhhbXBsZQotCi1JZiBubyBAdmFye3N5bWJvbH0gYXJndW1lbnRzIGFyZSBnaXZlbiwgQGNvZGV7YysrZmlsdH0gcmVhZHMgc3ltYm9sCi1uYW1lcyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGVzIHRoZSBkZW1hbmdsZWQgbmFtZXMgdG8gdGhlCi1zdGFuZGFyZCBvdXRwdXQuICBBbGwgcmVzdWx0cyBhcmUgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1fCi1AaXRlbXggLS1zdHJpcC11bmRlcnNjb3JlcwotT24gc29tZSBzeXN0ZW1zLCBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHB1dCBhbiB1bmRlcnNjb3JlIGluIGZyb250Ci1vZiBldmVyeSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBDIG5hbWUgQGNvZGV7Zm9vfSBnZXRzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgQGNvZGV7X2Zvb30uICBUaGlzIG9wdGlvbiByZW1vdmVzIHRoZSBpbml0aWFsIHVuZGVyc2NvcmUuICBXaGV0aGVyCi1AY29kZXtjKytmaWx0fSByZW1vdmVzIHRoZSB1bmRlcnNjb3JlIGJ5IGRlZmF1bHQgaXMgdGFyZ2V0IGRlcGVuZGVudC4KLQotQGl0ZW0gLWoKLUBpdGVteCAtLWphdmEKLVByaW50cyBkZW1hbmdsZWQgbmFtZXMgdXNpbmcgSmF2YSBzeW50YXguICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgQysrCi1zeW50YXguCi0KLUBpdGVtIC1uCi1AaXRlbXggLS1uby1zdHJpcC11bmRlcnNjb3JlcwotRG8gbm90IHJlbW92ZSB0aGUgaW5pdGlhbCB1bmRlcnNjb3JlLgotCi1AaXRlbSAtcyBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0KLUBzY3tnbnV9IEBjb2Rle25tfSBjYW4gZGVjb2RlIHRocmVlIGRpZmZlcmVudCBtZXRob2RzIG9mIG1hbmdsaW5nLCB1c2VkIGJ5Ci1kaWZmZXJlbnQgQysrIGNvbXBpbGVycy4gIFRoZSBhcmd1bWVudCB0byB0aGlzIG9wdGlvbiBzZWxlY3RzIHdoaWNoCi1tZXRob2QgaXQgdXNlczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBnbnUKLXRoZSBvbmUgdXNlZCBieSB0aGUgQHNje2dudX0gY29tcGlsZXIgKHRoZSBkZWZhdWx0IG1ldGhvZCkKLUBpdGVtIGx1Y2lkCi10aGUgb25lIHVzZWQgYnkgdGhlIEx1Y2lkIGNvbXBpbGVyCi1AaXRlbSBhcm0KLXRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBDKysgQW5ub3RhdGVkIFJlZmVyZW5jZSBNYW51YWwKLUBpdGVtIGhwCi10aGUgb25lIHVzZWQgYnkgdGhlIEhQIGNvbXBpbGVyCi1AaXRlbSBlZGcKLXRoZSBvbmUgdXNlZCBieSB0aGUgRURHIGNvbXBpbGVyCi1AZW5kIHRhYmxlCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle2MrK2ZpbHR9IGFuZCBleGl0LgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtjKytmaWx0fSBhbmQgZXhpdC4KLUBlbmQgdGFibGUKLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle2MrK2ZpbHR9IGlzIGEgbmV3IHV0aWxpdHksIGFuZCB0aGUgZGV0YWlscyBvZiBpdHMKLXVzZXIgaW50ZXJmYWNlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICBJbiBwYXJ0aWN1bGFyLAotYSBjb21tYW5kLWxpbmUgb3B0aW9uIG1heSBiZSByZXF1aXJlZCBpbiB0aGUgdGhlIGZ1dHVyZSB0byBkZWNvZGUgYSBuYW1lCi1wYXNzZWQgYXMgYW4gYXJndW1lbnQgb24gdGhlIGNvbW1hbmQgbGluZTsgaW4gb3RoZXIgd29yZHMsIAotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye3N5bWJvbH0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLW1heSBpbiBhIGZ1dHVyZSByZWxlYXNlIGJlY29tZQotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye29wdGlvbn0gQHZhcntzeW1ib2x9Ci1AZW5kIGV4YW1wbGUKLUBlbmQgcXVvdGF0aW9uCi0KLUBub2RlIGFkZHIybGluZQotQGNoYXB0ZXIgYWRkcjJsaW5lCi0KLUBraW5kZXggYWRkcjJsaW5lCi1AY2luZGV4IGFkZHJlc3MgdG8gZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgotCi1Ac21hbGxleGFtcGxlCi1hZGRyMmxpbmUgWyAtYiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgICAgWyAtQyB8IC0tZGVtYW5nbGUgXQotICAgICAgICAgIFsgLWUgQHZhcntmaWxlbmFtZX0gfCAtLWV4ZT1AdmFye2ZpbGVuYW1lfSBdCi0gICAgICAgICAgWyAtZiB8IC0tZnVuY3Rpb25zIF0gWyAtcyB8IC0tYmFzZW5hbWUgXQotICAgICAgICAgIFsgLUggfCAtLWhlbHAgXSBbIC1WIHwgLS12ZXJzaW9uIF0KLSAgICAgICAgICBbIGFkZHIgYWRkciAuLi4gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7YWRkcjJsaW5lfSB0cmFuc2xhdGVzIHByb2dyYW0gYWRkcmVzc2VzIGludG8gZmlsZSBuYW1lcyBhbmQgbGluZQotbnVtYmVycy4gIEdpdmVuIGFuIGFkZHJlc3MgYW5kIGFuIGV4ZWN1dGFibGUsIGl0IHVzZXMgdGhlIGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIGV4ZWN1dGFibGUgdG8gZmlndXJlIG91dCB3aGljaCBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYWRkcmVzcy4KLQotVGhlIGV4ZWN1dGFibGUgdG8gdXNlIGlzIHNwZWNpZmllZCB3aXRoIHRoZSBAY29kZXstZX0gb3B0aW9uLiAgVGhlCi1kZWZhdWx0IGlzIHRoZSBmaWxlIEBmaWxle2Eub3V0fS4KLQotQGNvZGV7YWRkcjJsaW5lfSBoYXMgdHdvIG1vZGVzIG9mIG9wZXJhdGlvbi4KLQotSW4gdGhlIGZpcnN0LCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLAotYW5kIEBjb2Rle2FkZHIybGluZX0gZGlzcGxheXMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2gKLWFkZHJlc3MuCi0KLUluIHRoZSBzZWNvbmQsIEBjb2Rle2FkZHIybGluZX0gcmVhZHMgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGZyb20KLXN0YW5kYXJkIGlucHV0LCBhbmQgcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoCi1hZGRyZXNzIG9uIHN0YW5kYXJkIG91dHB1dC4gIEluIHRoaXMgbW9kZSwgQGNvZGV7YWRkcjJsaW5lfSBtYXkgYmUgdXNlZAotaW4gYSBwaXBlIHRvIGNvbnZlcnQgZHluYW1pY2FsbHkgY2hvc2VuIGFkZHJlc3Nlcy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIEBzYW1we0ZJTEVOQU1FOkxJTkVOT30uICBUaGUgZmlsZSBuYW1lIGFuZAotbGluZSBudW1iZXIgZm9yIGVhY2ggYWRkcmVzcyBpcyBwcmludGVkIG9uIGEgc2VwYXJhdGUgbGluZS4gIElmIHRoZQotQGNvZGV7LWZ9IG9wdGlvbiBpcyB1c2VkLCB0aGVuIGVhY2ggQHNhbXB7RklMRU5BTUU6TElORU5PfSBsaW5lIGlzCi1wcmVjZWRlZCBieSBhIEBzYW1we0ZVTkNUSU9OTkFNRX0gbGluZSB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KLWNvbnRhaW5pbmcgdGhlIGFkZHJlc3MuCi0KLUlmIHRoZSBmaWxlIG5hbWUgb3IgZnVuY3Rpb24gbmFtZSBjYW4gbm90IGJlIGRldGVybWluZWQsCi1AY29kZXthZGRyMmxpbmV9IHdpbGwgcHJpbnQgdHdvIHF1ZXN0aW9uIG1hcmtzIGluIHRoZWlyIHBsYWNlLiAgSWYgdGhlCi1saW5lIG51bWJlciBjYW4gbm90IGJlIGRldGVybWluZWQsIEBjb2Rle2FkZHIybGluZX0gd2lsbCBwcmludCAwLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgdGhhdCB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIGlzCi1AdmFye2JmZG5hbWV9LgotCi1AaXRlbSAtQwotQGl0ZW14IC0tZGVtYW5nbGUKLUBjaW5kZXggZGVtYW5nbGluZyBpbiBvYmpkdW1wCi1EZWNvZGUgKEBkZm57ZGVtYW5nbGV9KSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLiAgQHhyZWZ7YysrZmlsdH0sIGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiBkZW1hbmdsaW5nLgotCi1AaXRlbSAtZSBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tZXhlPUB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGZvciB3aGljaCBhZGRyZXNzZXMgc2hvdWxkIGJlCi10cmFuc2xhdGVkLiAgVGhlIGRlZmF1bHQgZmlsZSBpcyBAZmlsZXthLm91dH0uCi0KLUBpdGVtIC1mCi1AaXRlbXggLS1mdW5jdGlvbnMKLURpc3BsYXkgZnVuY3Rpb24gbmFtZXMgYXMgd2VsbCBhcyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLWJhc2VuYW1lcwotRGlzcGxheSBvbmx5IHRoZSBiYXNlIG9mIGVhY2ggZmlsZSBuYW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBubG1jb252Ci1AY2hhcHRlciBubG1jb252Ci0KLUBjb2Rle25sbWNvbnZ9IGNvbnZlcnRzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUgaW50byBhIE5ldFdhcmUKLUxvYWRhYmxlIE1vZHVsZS4KLQotQGlnbm9yZQotQGNvZGV7bmxtY29udn0gY3VycmVudGx5IHdvcmtzIHdpdGggQHNhbXB7aTM4Nn0gb2JqZWN0Ci1maWxlcyBpbiBAY29kZXtjb2ZmfSwgQHNje2VsZn0sIG9yIEBjb2Rle2Eub3V0fSBmb3JtYXQsIGFuZCBAc2N7U1BBUkN9Ci1vYmplY3QgZmlsZXMgaW4gQHNje2VsZn0sIG9yIEBjb2Rle2Eub3V0fSBmb3JtYXRAZm9vdG5vdGV7Ci1AY29kZXtubG1jb252fSBzaG91bGQgd29yayB3aXRoIGFueSBAc2FtcHtpMzg2fSBvciBAc2N7c3BhcmN9IG9iamVjdAotZm9ybWF0IGluIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuICBJdCBoYXMgb25seSBiZWVuIHRlc3RlZAotd2l0aCB0aGUgYWJvdmUgZm9ybWF0cy59LgotQGVuZCBpZ25vcmUKLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle25sbWNvbnZ9IGlzIG5vdCBhbHdheXMgYnVpbHQgYXMgcGFydCBvZiB0aGUgYmluYXJ5Ci11dGlsaXRpZXMsIHNpbmNlIGl0IGlzIG9ubHkgdXNlZnVsIGZvciBOTE0gdGFyZ2V0cy4KLUBlbmQgcXVvdGF0aW9uCi0KLUBzbWFsbGV4YW1wbGUKLW5sbWNvbnYgWyAtSSBAdmFye2JmZG5hbWV9IHwgLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLU8gQHZhcntiZmRuYW1lfSB8IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtVCBAdmFye2hlYWRlcmZpbGV9IHwgLS1oZWFkZXItZmlsZT1AdmFye2hlYWRlcmZpbGV9IF0KLSAgICAgICAgWyAtZCB8IC0tZGVidWddICBbIC1sIEB2YXJ7bGlua2VyfSB8IC0tbGlua2VyPUB2YXJ7bGlua2VyfSBdCi0gICAgICAgIFsgLWggfCAtLWhlbHAgXSAgWyAtViB8IC0tdmVyc2lvbiBdCi0gICAgICAgIEB2YXJ7aW5maWxlfSBAdmFye291dGZpbGV9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtubG1jb252fSBjb252ZXJ0cyB0aGUgcmVsb2NhdGFibGUgQHNhbXB7aTM4Nn0gb2JqZWN0IGZpbGUKLUB2YXJ7aW5maWxlfSBpbnRvIHRoZSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSBAdmFye291dGZpbGV9LCBvcHRpb25hbGx5Ci1yZWFkaW5nIEB2YXJ7aGVhZGVyZmlsZX0gZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zCi1vbiB3cml0aW5nIHRoZSBOTE0gY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWUgdGhlCi1Ac2FtcHtsaW5rZXJzfSBzZWN0aW9uLCBAc2FtcHtOTE1MSU5LfSBpbiBwYXJ0aWN1bGFyLCBvZiB0aGUgQGNpdGV7TkxNCi1EZXZlbG9wbWVudCBhbmQgVG9vbHMgT3ZlcnZpZXd9LCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBOTE0gU29mdHdhcmUKLURldmVsb3BlcidzIEtpdCAoYGBOTE0gU0RLJycpLCBhdmFpbGFibGUgZnJvbSBOb3ZlbGwsIEluYy4KLUBjb2Rle25sbWNvbnZ9IHVzZXMgdGhlIEBzY3tnbnV9IEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeSB0byByZWFkCi1AdmFye2luZmlsZX07IHNlZSBAcmVme0JGRCwsQkZELGxkLmluZm8sVXNpbmcgTER9LCBmb3IKLW1vcmUgaW5mb3JtYXRpb24uCi0KLUBjb2Rle25sbWNvbnZ9IGNhbiBwZXJmb3JtIGEgbGluayBzdGVwLiAgSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gbGlzdAotbW9yZSB0aGFuIG9uZSBvYmplY3QgZmlsZSBmb3IgaW5wdXQgaWYgeW91IGxpc3QgdGhlbSBpbiB0aGUgZGVmaW5pdGlvbnMKLWZpbGUgKHJhdGhlciB0aGFuIHNpbXBseSBzcGVjaWZ5aW5nIG9uZSBpbnB1dCBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUpLgotSW4gdGhpcyBjYXNlLCBAY29kZXtubG1jb252fSBjYWxscyB0aGUgbGlua2VyIGZvciB5b3UuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUkgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLU9iamVjdCBmb3JtYXQgb2YgdGhlIGlucHV0IGZpbGUuICBAY29kZXtubG1jb252fSBjYW4gdXN1YWxseSBkZXRlcm1pbmUKLXRoZSBmb3JtYXQgb2YgYSBnaXZlbiBmaWxlIChzbyBubyBkZWZhdWx0IGlzIG5lY2Vzc2FyeSkuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1PIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotT2JqZWN0IGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICBAY29kZXtubG1jb252fSBpbmZlcnMgdGhlIG91dHB1dAotZm9ybWF0IGJhc2VkIG9uIHRoZSBpbnB1dCBmb3JtYXQsIGUuZy4gZm9yIGEgQHNhbXB7aTM4Nn0gaW5wdXQgZmlsZSB0aGUKLW91dHB1dCBmb3JtYXQgaXMgQHNhbXB7bmxtMzItaTM4Nn0uCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1UIEB2YXJ7aGVhZGVyZmlsZX0KLUBpdGVteCAtLWhlYWRlci1maWxlPUB2YXJ7aGVhZGVyZmlsZX0KLVJlYWRzIEB2YXJ7aGVhZGVyZmlsZX0gZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zIG9uCi13cml0aW5nIHRoZSBOTE0gY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWVAIHNlZSB0aGUKLUBzYW1we2xpbmtlcnN9IHNlY3Rpb24sIG9mIHRoZSBAY2l0ZXtOTE0gRGV2ZWxvcG1lbnQgYW5kIFRvb2xzCi1PdmVydmlld30sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIE5MTSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBLaXQsIGF2YWlsYWJsZQotZnJvbSBOb3ZlbGwsIEluYy4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWRlYnVnCi1EaXNwbGF5cyAob24gc3RhbmRhcmQgZXJyb3IpIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lIHVzZWQgYnkgQGNvZGV7bmxtY29udn0uCi0KLUBpdGVtIC1sIEB2YXJ7bGlua2VyfQotQGl0ZW14IC0tbGlua2VyPUB2YXJ7bGlua2VyfQotVXNlIEB2YXJ7bGlua2VyfSBmb3IgYW55IGxpbmtpbmcuICBAdmFye2xpbmtlcn0gY2FuIGJlIGFuIGFic29sdXRlIG9yIGEKLXJlbGF0aXZlIHBhdGhuYW1lLgotCi1AaXRlbSAtaAotQGl0ZW14IC0taGVscAotUHJpbnRzIGEgdXNhZ2Ugc3VtbWFyeS4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLVByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle25sbWNvbnZ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSB3aW5kcmVzCi1AY2hhcHRlciB3aW5kcmVzCi0KLUBjb2Rle3dpbmRyZXN9IG1heSBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXt3aW5kcmVzfSBpcyBub3QgYWx3YXlzIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIGJpbmFyeQotdXRpbGl0aWVzLCBzaW5jZSBpdCBpcyBvbmx5IHVzZWZ1bCBmb3IgV2luZG93cyB0YXJnZXRzLgotQGVuZCBxdW90YXRpb24KLQotQHNtYWxsZXhhbXBsZQotd2luZHJlcyBbb3B0aW9uc10gW2lucHV0LWZpbGVdIFtvdXRwdXQtZmlsZV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle3dpbmRyZXN9IHJlYWRzIHJlc291cmNlcyBmcm9tIGFuIGlucHV0IGZpbGUgYW5kIGNvcGllcyB0aGVtIGludG8KLWFuIG91dHB1dCBmaWxlLiAgRWl0aGVyIGZpbGUgbWF5IGJlIGluIG9uZSBvZiB0aHJlZSBmb3JtYXRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHJjCi1BIHRleHQgZm9ybWF0IHJlYWQgYnkgdGhlIFJlc291cmNlIENvbXBpbGVyLgotCi1AaXRlbSByZXMKLUEgYmluYXJ5IGZvcm1hdCBnZW5lcmF0ZWQgYnkgdGhlIFJlc291cmNlIENvbXBpbGVyLgotCi1AaXRlbSBjb2ZmCi1BIENPRkYgb2JqZWN0IG9yIGV4ZWN1dGFibGUuCi1AZW5kIHRhYmxlCi0KLVRoZSBleGFjdCBkZXNjcmlwdGlvbiBvZiB0aGVzZSBkaWZmZXJlbnQgZm9ybWF0cyBpcyBhdmFpbGFibGUgaW4KLWRvY3VtZW50YXRpb24gZnJvbSBNaWNyb3NvZnQuCi0KLVdoZW4gQGNvZGV7d2luZHJlc30gY29udmVydHMgZnJvbSB0aGUgQGNvZGV7cmN9IGZvcm1hdCB0byB0aGUgQGNvZGV7cmVzfQotZm9ybWF0LCBpdCBpcyBhY3RpbmcgbGlrZSB0aGUgV2luZG93cyBSZXNvdXJjZSBDb21waWxlci4gIFdoZW4KLUBjb2Rle3dpbmRyZXN9IGNvbnZlcnRzIGZyb20gdGhlIEBjb2Rle3Jlc30gZm9ybWF0IHRvIHRoZSBAY29kZXtjb2ZmfQotZm9ybWF0LCBpdCBpcyBhY3RpbmcgbGlrZSB0aGUgV2luZG93cyBAY29kZXtDVlRSRVN9IHByb2dyYW0uCi0KLVdoZW4gQGNvZGV7d2luZHJlc30gZ2VuZXJhdGVzIGFuIEBjb2Rle3JjfSBmaWxlLCB0aGUgb3V0cHV0IGlzIHNpbWlsYXIKLWJ1dCBub3QgaWRlbnRpY2FsIHRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgZm9yIHRoZSBpbnB1dC4gIFdoZW4gYW4gaW5wdXQKLUBjb2Rle3JjfSBmaWxlIHJlZmVycyB0byBhbiBleHRlcm5hbCBmaWxlbmFtZSwgYW4gb3V0cHV0IEBjb2Rle3JjfSBmaWxlCi13aWxsIGluc3RlYWQgaW5jbHVkZSB0aGUgZmlsZSBjb250ZW50cy4KLQotSWYgdGhlIGlucHV0IG9yIG91dHB1dCBmb3JtYXQgaXMgbm90IHNwZWNpZmllZCwgQGNvZGV7d2luZHJlc30gd2lsbAotZ3Vlc3MgYmFzZWQgb24gdGhlIGZpbGUgbmFtZSwgb3IsIGZvciB0aGUgaW5wdXQgZmlsZSwgdGhlIGZpbGUgY29udGVudHMuCi1BIGZpbGUgd2l0aCBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnJjfSB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gQGNvZGV7cmN9Ci1maWxlLCBhIGZpbGUgd2l0aCBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnJlc30gd2lsbCBiZSB0cmVhdGVkIGFzIGEKLUBjb2Rle3Jlc30gZmlsZSwgYW5kIGEgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsub30gb3IKLUBmaWxley5leGV9IHdpbGwgYmUgdHJlYXRlZCBhcyBhIEBjb2Rle2NvZmZ9IGZpbGUuCi0KLUlmIG5vIG91dHB1dCBmaWxlIGlzIHNwZWNpZmllZCwgQGNvZGV7d2luZHJlc30gd2lsbCBwcmludCB0aGUgcmVzb3VyY2VzCi1pbiBAY29kZXtyY30gZm9ybWF0IHRvIHN0YW5kYXJkIG91dHB1dC4KLQotVGhlIG5vcm1hbCB1c2UgaXMgZm9yIHlvdSB0byB3cml0ZSBhbiBAY29kZXtyY30gZmlsZSwgdXNlIEBjb2Rle3dpbmRyZXN9Ci10byBjb252ZXJ0IGl0IHRvIGEgQ09GRiBvYmplY3QgZmlsZSwgYW5kIHRoZW4gbGluayB0aGUgQ09GRiBmaWxlIGludG8KLXlvdXIgYXBwbGljYXRpb24uICBUaGlzIHdpbGwgbWFrZSB0aGUgcmVzb3VyY2VzIGRlc2NyaWJlZCBpbiB0aGUKLUBjb2Rle3JjfSBmaWxlIGF2YWlsYWJsZSB0byBXaW5kb3dzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1pIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1pbnB1dCBAdmFye2ZpbGVuYW1lfQotVGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbgotQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQgYXMgdGhlIGlucHV0IGZpbGUKLW5hbWUuICBJZiB0aGVyZSBhcmUgbm8gbm9uLW9wdGlvbiBhcmd1bWVudHMsIHRoZW4gQGNvZGV7d2luZHJlc30gd2lsbAotcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgQGNvZGV7d2luZHJlc30gY2FuIG5vdCByZWFkIGEgQ09GRiBmaWxlIGZyb20KLXN0YW5kYXJkIGlucHV0LgotCi1AaXRlbSAtbyBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tb3V0cHV0IEB2YXJ7ZmlsZW5hbWV9Ci1UaGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUuICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbgotQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQsIGFmdGVyIGFueSB1c2VkCi1mb3IgdGhlIGlucHV0IGZpbGUgbmFtZSwgYXMgdGhlIG91dHB1dCBmaWxlIG5hbWUuICBJZiB0aGVyZSBpcyBubwotbm9uLW9wdGlvbiBhcmd1bWVudCwgdGhlbiBAY29kZXt3aW5kcmVzfSB3aWxsIHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dC4KLUBjb2Rle3dpbmRyZXN9IGNhbiBub3Qgd3JpdGUgYSBDT0ZGIGZpbGUgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi1AaXRlbSAtSSBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLWlucHV0LWZvcm1hdCBAdmFye2Zvcm1hdH0KLVRoZSBpbnB1dCBmb3JtYXQgdG8gcmVhZC4gIEB2YXJ7Zm9ybWF0fSBtYXkgYmUgQHNhbXB7cmVzfSwgQHNhbXB7cmN9LCBvcgotQHNhbXB7Y29mZn0uICBJZiBubyBpbnB1dCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsCi1ndWVzcywgYXMgZGVzY3JpYmVkIGFib3ZlLgotCi1AaXRlbSAtTyBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLW91dHB1dC1mb3JtYXQgQHZhcntmb3JtYXR9Ci1UaGUgb3V0cHV0IGZvcm1hdCB0byBnZW5lcmF0ZS4gIEB2YXJ7Zm9ybWF0fSBtYXkgYmUgQHNhbXB7cmVzfSwKLUBzYW1we3JjfSwgb3IgQHNhbXB7Y29mZn0uICBJZiBubyBvdXRwdXQgZm9ybWF0IGlzIHNwZWNpZmllZCwKLUBjb2Rle3dpbmRyZXN9IHdpbGwgZ3Vlc3MsIGFzIGRlc2NyaWJlZCBhYm92ZS4KLQotQGl0ZW0gLUYgQHZhcnt0YXJnZXR9Ci1AaXRlbXggLS10YXJnZXQgQHZhcnt0YXJnZXR9Ci1TcGVjaWZ5IHRoZSBCRkQgZm9ybWF0IHRvIHVzZSBmb3IgYSBDT0ZGIGZpbGUgYXMgaW5wdXQgb3Igb3V0cHV0LiAgVGhpcwotaXMgYSBCRkQgdGFyZ2V0IG5hbWU7IHlvdSBjYW4gdXNlIHRoZSBAY29kZXstLWhlbHB9IG9wdGlvbiB0byBzZWUgYSBsaXN0Ci1vZiBzdXBwb3J0ZWQgdGFyZ2V0cy4gIE5vcm1hbGx5IEBjb2Rle3dpbmRyZXN9IHdpbGwgdXNlIHRoZSBkZWZhdWx0Ci1mb3JtYXQsIHdoaWNoIGlzIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGJ5IHRoZSBAY29kZXstLWhlbHB9IG9wdGlvbi4KLUByZWZ7VGFyZ2V0IFNlbGVjdGlvbn0uCi0KLUBpdGVtIC0tcHJlcHJvY2Vzc29yIEB2YXJ7cHJvZ3JhbX0KLVdoZW4gQGNvZGV7d2luZHJlc30gcmVhZHMgYW4gQGNvZGV7cmN9IGZpbGUsIGl0IHJ1bnMgaXQgdGhyb3VnaCB0aGUgQwotcHJlcHJvY2Vzc29yIGZpcnN0LiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJlcHJvY2Vzc29yCi10byB1c2UsIGluY2x1ZGluZyBhbnkgbGVhZGluZyBhcmd1bWVudHMuICBUaGUgZGVmYXVsdCBwcmVwcm9jZXNzb3IKLWFyZ3VtZW50IGlzIEBjb2Rle2djYyAtRSAteGMtaGVhZGVyIC1EUkNfSU5WT0tFRH0uCi0KLUBpdGVtIC0taW5jbHVkZS1kaXIgQHZhcntkaXJlY3Rvcnl9Ci1TcGVjaWZ5IGFuIGluY2x1ZGUgZGlyZWN0b3J5IHRvIHVzZSB3aGVuIHJlYWRpbmcgYW4gQGNvZGV7cmN9IGZpbGUuCi1AY29kZXt3aW5kcmVzfSB3aWxsIHBhc3MgdGhpcyB0byB0aGUgcHJlcHJvY2Vzc29yIGFzIGFuIEBjb2Rley1JfQotb3B0aW9uLiAgQGNvZGV7d2luZHJlc30gd2lsbCBhbHNvIHNlYXJjaCB0aGlzIGRpcmVjdG9yeSB3aGVuIGxvb2tpbmcgZm9yCi1maWxlcyBuYW1lZCBpbiB0aGUgQGNvZGV7cmN9IGZpbGUuCi0KLUBpdGVtIC1EIEB2YXJ7dGFyZ2V0fQotQGl0ZW14IC0tZGVmaW5lIEB2YXJ7c3ltfVs9QHZhcnt2YWx9XQotU3BlY2lmeSBhIEBjb2Rley1EfSBvcHRpb24gdG8gcGFzcyB0byB0aGUgcHJlcHJvY2Vzc29yIHdoZW4gcmVhZGluZyBhbgotQGNvZGV7cmN9IGZpbGUuCi0KLUBpdGVtIC12Ci1FbmFibGUgdmVyYm9zZSBtb2RlLiAgVGhpcyB0ZWxscyB5b3Ugd2hhdCB0aGUgcHJlcHJvY2Vzc29yIGlzIGlmIHlvdQotZGlkbid0IHNwZWNpZnkgb25lLgotCi1AaXRlbSAtLWxhbmd1YWdlIEB2YXJ7dmFsfQotU3BlY2lmeSB0aGUgZGVmYXVsdCBsYW5ndWFnZSB0byB1c2Ugd2hlbiByZWFkaW5nIGFuIEBjb2Rle3JjfSBmaWxlLgotQHZhcnt2YWx9IHNob3VsZCBiZSBhIGhleGFkZWNpbWFsIGxhbmd1YWdlIGNvZGUuICBUaGUgbG93IGVpZ2h0IGJpdHMgYXJlCi10aGUgbGFuZ3VhZ2UsIGFuZCB0aGUgaGlnaCBlaWdodCBiaXRzIGFyZSB0aGUgc3VibGFuZ3VhZ2UuCi0KLUBpdGVtIC0taGVscAotUHJpbnRzIGEgdXNhZ2Ugc3VtbWFyeS4KLQotQGl0ZW0gLS12ZXJzaW9uCi1QcmludHMgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXt3aW5kcmVzfS4KLQotQGl0ZW0gLS15eWRlYnVnCi1JZiBAY29kZXt3aW5kcmVzfSBpcyBjb21waWxlZCB3aXRoIEBjb2Rle1lZREVCVUd9IGRlZmluZWQgYXMgQGNvZGV7MX0sCi10aGlzIHdpbGwgdHVybiBvbiBwYXJzZXIgZGVidWdnaW5nLgotQGVuZCB0YWJsZQotCi0KLUBub2RlIGRsbHRvb2wKLUBjaGFwdGVyIENyZWF0ZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZSBETExzCi1AY2luZGV4IERMTAotQGtpbmRleCBkbGx0b29sCi0KLUBjb2Rle2RsbHRvb2x9IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UKLWR5bmFtaWMgbGluayBsaWJyYXJpZXMgKERMTHMpLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gQGNvZGV7ZGxsdG9vbH0gaXMgbm90IGFsd2F5cyBidWlsdCBhcyBwYXJ0IG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcywgc2luY2UgaXQgaXMgb25seSB1c2VmdWwgZm9yIHRob3NlIHRhcmdldHMgd2hpY2ggc3VwcG9ydCBETExzLgotQGVuZCBxdW90YXRpb24KLQotQHNtYWxsZXhhbXBsZQotZGxsdG9vbCBbLWR8LS1pbnB1dC1kZWYgQHZhcntkZWYtZmlsZS1uYW1lfV0KLSAgICAgICAgWy1ifC0tYmFzZS1maWxlIEB2YXJ7YmFzZS1maWxlLW5hbWV9XQotICAgICAgICBbLWV8LS1vdXRwdXQtZXhwIEB2YXJ7ZXhwb3J0cy1maWxlLW5hbWV9XQotICAgICAgICBbLXp8LS1vdXRwdXQtZGVmIEB2YXJ7ZGVmLWZpbGUtbmFtZX1dCi0gICAgICAgIFstbHwtLW91dHB1dC1saWIgQHZhcntsaWJyYXJ5LWZpbGUtbmFtZX1dICAgICAgICAKLSAgICAgICAgWy0tZXhwb3J0LWFsbC1zeW1ib2xzXSBbLS1uby1leHBvcnQtYWxsLXN5bWJvbHNdCi0gICAgICAgIFstLWV4Y2x1ZGUtc3ltYm9scyBAdmFye2xpc3R9XQotICAgICAgICBbLS1uby1kZWZhdWx0LWV4Y2x1ZGVzXQotICAgICAgICBbLVN8LS1hcyBAdmFye3BhdGgtdG8tYXNzZW1ibGVyfV0gWy1mfC0tYXMtZmxhZ3MgQHZhcntvcHRpb25zfV0KLSAgICAgICAgWy1EfC0tZGxsbmFtZSBAdmFye25hbWV9XSBbLW18LS1tYWNoaW5lIEB2YXJ7bWFjaGluZX1dCi0gICAgICAgIFstYXwtLWFkZC1pbmRpcmVjdF0gWy1VfC0tYWRkLXVuZGVyc2NvcmVdIFsta3wtLWtpbGwtYXRdCi0gICAgICAgIFstQXwtLWFkZC1zdGRjYWxsLWFsaWFzXQotICAgICAgICBbLXh8LS1uby1pZGF0YTRdIFstY3wtLW5vLWlkYXRhNV0gWy1pfC0taW50ZXJ3b3JrXQotICAgICAgICBbLW58LS1ub2RlbGV0ZV0gWy12fC0tdmVyYm9zZV0gWy1ofC0taGVscF0gWy1WfC0tdmVyc2lvbl0KLSAgICAgICAgW29iamVjdC1maWxlIEBkb3Rze31dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtkbGx0b29sfSByZWFkcyBpdHMgaW5wdXRzLCB3aGljaCBjYW4gY29tZSBmcm9tIHRoZSBAc2FtcHstZH0gYW5kCi1Ac2FtcHstYn0gb3B0aW9ucyBhcyB3ZWxsIGFzIG9iamVjdCBmaWxlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQKLWxpbmUuICBJdCB0aGVuIHByb2Nlc3NlcyB0aGVzZSBpbnB1dHMgYW5kIGlmIHRoZSBAc2FtcHstZX0gb3B0aW9uIGhhcwotYmVlbiBzcGVjaWZpZWQgaXQgY3JlYXRlcyBhIGV4cG9ydHMgZmlsZS4gIElmIHRoZSBAc2FtcHstbH0gb3B0aW9uCi1oYXMgYmVlbiBzcGVjaWZpZWQgaXQgY3JlYXRlcyBhIGxpYnJhcnkgZmlsZSBhbmQgaWYgdGhlIEBzYW1wey16fSBvcHRpb24KLWhhcyBiZWVuIHNwZWNpZmllZCBpdCBjcmVhdGVzIGEgZGVmIGZpbGUuICBBbnkgb3IgYWxsIG9mIHRoZSAtZSwgLWwKLWFuZCAteiBvcHRpb25zIGNhbiBiZSBwcmVzZW50IGluIG9uZSBpbnZvY2F0aW9uIG9mIGRsbHRvb2wuCi0KLVdoZW4gY3JlYXRpbmcgYSBETEwsIGFsb25nIHdpdGggdGhlIHNvdXJjZSBmb3IgdGhlIERMTCwgaXQgaXMgbmVjZXNzYXJ5Ci10byBoYXZlIHRocmVlIG90aGVyIGZpbGVzLiAgQGNvZGV7ZGxsdG9vbH0gY2FuIGhlbHAgd2l0aCB0aGUgY3JlYXRpb24gb2YKLXRoZXNlIGZpbGVzLgotCi1UaGUgZmlyc3QgZmlsZSBpcyBhIEBzYW1wey5kZWZ9IGZpbGUgd2hpY2ggc3BlY2lmaWVzIHdoaWNoIGZ1bmN0aW9ucyBhcmUKLWV4cG9ydGVkIGZyb20gdGhlIERMTCwgd2hpY2ggZnVuY3Rpb25zIHRoZSBETEwgaW1wb3J0cywgYW5kIHNvIG9uLiAgVGhpcwotaXMgYSB0ZXh0IGZpbGUgYW5kIGNhbiBiZSBjcmVhdGVkIGJ5IGhhbmQsIG9yIEBjb2Rle2RsbHRvb2x9IGNhbiBiZSB1c2VkCi10byBjcmVhdGUgaXQgdXNpbmcgdGhlIEBzYW1wey16fSBvcHRpb24uICBJbiB0aGlzIGNhc2UgQGNvZGV7ZGxsdG9vbH0KLXdpbGwgc2NhbiB0aGUgb2JqZWN0IGZpbGVzIHNwZWNpZmllZCBvbiBpdHMgY29tbWFuZCBsaW5lIGxvb2tpbmcgZm9yCi10aG9zZSBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIHNwZWNpYWxseSBtYXJrZWQgYXMgYmVpbmcgZXhwb3J0ZWQgYW5kCi1wdXQgZW50cmllcyBmb3IgdGhlbSBpbiB0aGUgLmRlZiBmaWxlIGl0IGNyZWF0ZXMuCi0KLUluIG9yZGVyIHRvIG1hcmsgYSBmdW5jdGlvbiBhcyBiZWluZyBleHBvcnRlZCBmcm9tIGEgRExMLCBpdCBuZWVkcyB0bwotaGF2ZSBhbiBAc2FtcHstZXhwb3J0OjxuYW1lX29mX2Z1bmN0aW9uPn0gZW50cnkgaW4gdGhlIEBzYW1wey5kcmVjdHZlfQotc2VjdGlvbiBvZiB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGNhbiBiZSBkb25lIGluIEMgYnkgdXNpbmcgdGhlCi1hc20oKSBvcGVyYXRvcjoKLQotQHNtYWxsZXhhbXBsZQotICBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZSIpOyAgCi0gIGFzbSAoIi5hc2NpaSBcIi1leHBvcnQ6bXlfZnVuY1wiIik7Ci0KLSAgaW50IG15X2Z1bmMgKHZvaWQpIEB7IEBkb3Rze30gQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBzZWNvbmQgZmlsZSBuZWVkZWQgZm9yIERMTCBjcmVhdGlvbiBpcyBhbiBleHBvcnRzIGZpbGUuICBUaGlzIGZpbGUKLWlzIGxpbmtlZCB3aXRoIHRoZSBvYmplY3QgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBib2R5IG9mIHRoZSBETEwgYW5kIGl0Ci1oYW5kbGVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgRExMIGFuZCB0aGUgb3V0c2lkZSB3b3JsZC4gIFRoaXMgaXMgYQotYmluYXJ5IGZpbGUgYW5kIGl0IGNhbiBiZSBjcmVhdGVkIGJ5IGdpdmluZyB0aGUgQHNhbXB7LWV9IG9wdGlvbiB0bwotQGNvZGV7ZGxsdG9vbH0gd2hlbiBpdCBpcyBjcmVhdGluZyBvciByZWFkaW5nIGluIGEgLmRlZiBmaWxlLiAKLQotVGhlIHRoaXJkIGZpbGUgbmVlZGVkIGZvciBETEwgY3JlYXRpb24gaXMgdGhlIGxpYnJhcnkgZmlsZSB0aGF0IHByb2dyYW1zCi13aWxsIGxpbmsgd2l0aCBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgRExMLiAgVGhpcyBmaWxlCi1jYW4gYmUgY3JlYXRlZCBieSBnaXZpbmcgdGhlIEBzYW1wey1sfSBvcHRpb24gdG8gZGxsdG9vbCB3aGVuIGl0Ci1pcyBjcmVhdGluZyBvciByZWFkaW5nIGluIGEgLmRlZiBmaWxlLgotCi1AY29kZXtkbGx0b29sfSBidWlsZHMgdGhlIGxpYnJhcnkgZmlsZSBieSBoYW5kLCBidXQgaXQgYnVpbGRzIHRoZQotZXhwb3J0cyBmaWxlIGJ5IGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlcyBjb250YWluaW5nIGFzc2VtYmxlciBzdGF0ZW1lbnRzCi1hbmQgdGhlbiBhc3NlbWJsaW5nIHRoZXNlLiAgVGhlIEBzYW1wey1TfSBjb21tYW5kIGxpbmUgb3B0aW9uIGNhbiBiZQotdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBhc3NlbWJsZXIgdGhhdCBkbGx0b29sIHdpbGwgdXNlLAotYW5kIHRoZSBAc2FtcHstZn0gb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHBhc3Mgc3BlY2lmaWMgZmxhZ3MgdG8gdGhhdAotYXNzZW1ibGVyLiAgVGhlIEBzYW1wey1ufSBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IGRsbHRvb2wgZnJvbSBkZWxldGluZwotdGhlc2UgdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlcyB3aGVuIGl0IGlzIGRvbmUsIGFuZCBpZiBAc2FtcHstbn0gaXMKLXNwZWNpZmllZCB0d2ljZSB0aGVuIHRoaXMgd2lsbCBwcmV2ZW50IGRsbHRvb2wgZnJvbSBkZWxldGluZyB0aGUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZXMgaXQgdXNlZCB0byBidWlsZCB0aGUgbGlicmFyeS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIGNyZWF0aW5nIGEgRExMIGZyb20gYSBzb3VyY2UgZmlsZSBAc2FtcHtkbGwuY30gYW5kCi1hbHNvIGNyZWF0aW5nIGEgcHJvZ3JhbSAoZnJvbSBhbiBvYmplY3QgZmlsZSBjYWxsZWQgQHNhbXB7cHJvZ3JhbS5vfSkKLXRoYXQgdXNlcyB0aGF0IERMTDoKLQotQHNtYWxsZXhhbXBsZQotICBnY2MgLWMgZGxsLmMKLSAgZGxsdG9vbCAtZSBleHBvcnRzLm8gLWwgZGxsLmxpYiBkbGwubwotICBnY2MgZGxsLm8gZXhwb3J0cy5vIC1vIGRsbC5kbGwKLSAgZ2NjIHByb2dyYW0ubyBkbGwubGliIC1vIHByb2dyYW0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6Ci0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtZCBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0taW5wdXQtZGVmIEB2YXJ7ZmlsZW5hbWV9Ci1AY2luZGV4IGlucHV0IC5kZWYgZmlsZQotU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgLmRlZiBmaWxlIHRvIGJlIHJlYWQgaW4gYW5kIHByb2Nlc3NlZC4KLQotQGl0ZW0gLWIgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWJhc2UtZmlsZSBAdmFye2ZpbGVuYW1lfQotQGNpbmRleCBiYXNlIGZpbGVzCi1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBiYXNlIGZpbGUgdG8gYmUgcmVhZCBpbiBhbmQgcHJvY2Vzc2VkLiAgVGhlCi1jb250ZW50cyBvZiB0aGlzIGZpbGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIGluIHRoZQotZXhwb3J0cyBmaWxlIGdlbmVyYXRlZCBieSBkbGx0b29sLgotCi1AaXRlbSAtZSBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tb3V0cHV0LWV4cCBAdmFye2ZpbGVuYW1lfQotU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBleHBvcnQgZmlsZSB0byBiZSBjcmVhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC16IEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtZGVmIEB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIC5kZWYgZmlsZSB0byBiZSBjcmVhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC1sIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtbGliIEB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgZmlsZSB0byBiZSBjcmVhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC0tZXhwb3J0LWFsbC1zeW1ib2xzCi1UcmVhdCBhbGwgZ2xvYmFsIGFuZCB3ZWFrIGRlZmluZWQgc3ltYm9scyBmb3VuZCBpbiB0aGUgaW5wdXQgb2JqZWN0Ci1maWxlcyBhcyBzeW1ib2xzIHRvIGJlIGV4cG9ydGVkLiAgVGhlcmUgaXMgYSBzbWFsbCBsaXN0IG9mIHN5bWJvbHMgd2hpY2gKLWFyZSBub3QgZXhwb3J0ZWQgYnkgZGVmYXVsdDsgc2VlIHRoZSBAY29kZXstLW5vLWRlZmF1bHQtZXhjbHVkZXN9Ci1vcHRpb24uICBZb3UgbWF5IGFkZCB0byB0aGUgbGlzdCBvZiBzeW1ib2xzIHRvIG5vdCBleHBvcnQgYnkgdXNpbmcgdGhlCi1AY29kZXstLWV4Y2x1ZGUtc3ltYm9sc30gb3B0aW9uLgotCi1AaXRlbSAtLW5vLWV4cG9ydC1hbGwtc3ltYm9scwotT25seSBleHBvcnQgc3ltYm9scyBleHBsaWNpdGx5IGxpc3RlZCBpbiBhbiBpbnB1dCAuZGVmIGZpbGUgb3IgaW4KLUBzYW1wey5kcmVjdHZlfSBzZWN0aW9ucyBpbiB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzLiAgVGhpcyBpcyB0aGUgZGVmYXVsdAotYmVoYXZpb3VyLiAgVGhlIEBzYW1wey5kcmVjdHZlfSBzZWN0aW9ucyBhcmUgY3JlYXRlZCBieSBAc2FtcHtkbGxleHBvcnR9Ci1hdHRyaWJ1dGVzIGluIHRoZSBzb3VyY2UgY29kZS4KLQotQGl0ZW0gLS1leGNsdWRlLXN5bWJvbHMgQHZhcntsaXN0fQotRG8gbm90IGV4cG9ydCB0aGUgc3ltYm9scyBpbiBAdmFye2xpc3R9LiAgVGhpcyBpcyBhIGxpc3Qgb2Ygc3ltYm9sIG5hbWVzCi1zZXBhcmF0ZWQgYnkgY29tbWEgb3IgY29sb24gY2hhcmFjdGVycy4gIFRoZSBzeW1ib2wgbmFtZXMgc2hvdWxkIG5vdAotY29udGFpbiBhIGxlYWRpbmcgdW5kZXJzY29yZS4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4KLUBjb2Rley0tZXhwb3J0LWFsbC1zeW1ib2xzfSBpcyB1c2VkLgotCi1AaXRlbSAtLW5vLWRlZmF1bHQtZXhjbHVkZXMKLVdoZW4gQGNvZGV7LS1leHBvcnQtYWxsLXN5bWJvbHN9IGlzIHVzZWQsIGl0IHdpbGwgYnkgZGVmYXVsdCBhdm9pZAotZXhwb3J0aW5nIGNlcnRhaW4gc3BlY2lhbCBzeW1ib2xzLiAgVGhlIGN1cnJlbnQgbGlzdCBvZiBzeW1ib2xzIHRvIGF2b2lkCi1leHBvcnRpbmcgaXMgQHNhbXB7RGxsTWFpbkBAMTJ9LCBAc2FtcHtEbGxFbnRyeVBvaW50QEAwfSwKLUBzYW1we2ltcHVyZV9wdHJ9LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rley0tbm8tZGVmYXVsdC1leGNsdWRlc30gb3B0aW9uCi10byBnbyBhaGVhZCBhbmQgZXhwb3J0IHRoZXNlIHNwZWNpYWwgc3ltYm9scy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsCi13aGVuIEBjb2Rley0tZXhwb3J0LWFsbC1zeW1ib2xzfSBpcyB1c2VkLgotCi1AaXRlbSAtUyBAdmFye3BhdGh9Ci1AaXRlbXggLS1hcyBAdmFye3BhdGh9Ci1TcGVjaWZpZXMgdGhlIHBhdGgsIGluY2x1ZGluZyB0aGUgZmlsZW5hbWUsIG9mIHRoZSBhc3NlbWJsZXIgdG8gYmUgdXNlZAotdG8gY3JlYXRlIHRoZSBleHBvcnRzIGZpbGUuCi0KLUBpdGVtIC1mIEB2YXJ7c3dpdGNoZXN9Ci1AaXRlbXggLS1hcy1mbGFncyBAdmFye3N3aXRjaGVzfQotU3BlY2lmaWVzIGFueSBzcGVjaWZpYyBjb21tYW5kIGxpbmUgc3dpdGNoZXMgdG8gYmUgcGFzc2VkIHRvIHRoZQotYXNzZW1ibGVyIHdoZW4gYnVpbGRpbmcgdGhlIGV4cG9ydHMgZmlsZS4gIFRoaXMgb3B0aW9uIHdpbGwgd29yayBldmVuIGlmCi10aGUgQHNhbXB7LVN9IG9wdGlvbiBpcyBub3QgdXNlZC4gIFRoaXMgb3B0aW9uIG9ubHkgdGFrZXMgb25lIGFyZ3VtZW50LAotYW5kIGlmIGl0IG9jY3VycyBtb3JlIHRoYW4gb25jZSBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGVuIGxhdGVyCi1vY2N1cnJlbmNlcyB3aWxsIG92ZXJyaWRlIGVhcmxpZXIgb2NjdXJyZW5jZXMuICBTbyBpZiBpdCBpcyBuZWNlc3NhcnkgdG8KLXBhc3MgbXVsdGlwbGUgc3dpdGNoZXMgdG8gdGhlIGFzc2VtYmxlciB0aGV5IHNob3VsZCBiZSBlbmNsb3NlZCBpbgotZG91YmxlIHF1b3Rlcy4KLQotQGl0ZW0gLUQgQHZhcntuYW1lfQotQGl0ZW14IC0tZGxsLW5hbWUgQHZhcntuYW1lfQotU3BlY2lmaWVzIHRoZSBuYW1lIHRvIGJlIHN0b3JlZCBpbiB0aGUgLmRlZiBmaWxlIGFzIHRoZSBuYW1lIG9mIHRoZSBETEwKLXdoZW4gdGhlIEBzYW1wey1lfSBvcHRpb24gaXMgdXNlZC4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBwcmVzZW50LCB0aGVuCi10aGUgZmlsZW5hbWUgZ2l2ZW4gdG8gdGhlIEBzYW1wey1lfSBvcHRpb24gd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mCi10aGUgRExMLgotCi1AaXRlbSAtbSBAdmFye21hY2hpbmV9Ci1AaXRlbXggLW1hY2hpbmUgQHZhcnttYWNoaW5lfQotU3BlY2lmaWVzIHRoZSB0eXBlIG9mIG1hY2hpbmUgZm9yIHdoaWNoIHRoZSBsaWJyYXJ5IGZpbGUgc2hvdWxkIGJlCi1idWlsdC4gIEBjb2Rle2RsbHRvb2x9IGhhcyBhIGJ1aWx0IGluIGRlZmF1bHQgdHlwZSwgZGVwZW5kaW5nIHVwb24gaG93Ci1pdCB3YXMgY3JlYXRlZCwgYnV0IHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoYXQuICBUaGlzIGlzCi1ub3JtYWxseSBvbmx5IHVzZWZ1bCB3aGVuIGNyZWF0aW5nIERMTHMgZm9yIGFuIEFSTSBwcm9jZXNzb3IsIHdoZW4gdGhlCi1jb250ZW50cyBvZiB0aGUgRExMIGFyZSBhY3R1YWxseSBlbmNvZGUgdXNpbmcgVEhVTUIgaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSAtYQotQGl0ZW14IC0tYWRkLWluZGlyZWN0Ci1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKLXNob3VsZCBhZGQgYSBzZWN0aW9uIHdoaWNoIGFsbG93cyB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIHRvIGJlCi1yZWZlcmVuY2VkIHdpdGhvdXQgdXNpbmcgdGhlIGltcG9ydCBsaWJyYXJ5LiAgV2hhdGV2ZXIgdGhlIGhlbGwgdGhhdAotbWVhbnMhIAotCi1AaXRlbSAtVQotQGl0ZW14IC0tYWRkLXVuZGVyc2NvcmUKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIHByZXBlbmQgYW4gdW5kZXJzY29yZSB0byB0aGUgbmFtZXMgb2YgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucy4gCi0KLUBpdGVtIC1rCi1AaXRlbXggLS1raWxsLWF0Ci1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKLXNob3VsZCBub3QgYXBwZW5kIHRoZSBzdHJpbmcgQHNhbXB7QEAgPG51bWJlcj59LiAgVGhlc2UgbnVtYmVycyBhcmUKLWNhbGxlZCBvcmRpbmFsIG51bWJlcnMgYW5kIHRoZXkgcmVwcmVzZW50IGFub3RoZXIgd2F5IG9mIGFjY2Vzc2luZyB0aGUKLWZ1bmN0aW9uIGluIGEgRExMLCBvdGhlciB0aGFuIGJ5IG5hbWUuCi0KLUBpdGVtIC1BCi1AaXRlbXggLS1hZGQtc3RkY2FsbC1hbGlhcwotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0Ci1zaG91bGQgYWRkIGFsaWFzZXMgZm9yIHN0ZGNhbGwgc3ltYm9scyB3aXRob3V0IEBzYW1we0BAIDxudW1iZXI+fQotaW4gYWRkaXRpb24gdG8gdGhlIHN5bWJvbHMgd2l0aCBAc2FtcHtAQCA8bnVtYmVyPn0uCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1uby1pZGF0YTQKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgYW5kIGxpYnJhcnkKLWZpbGVzIGl0IHNob3VsZCBvbWl0IHRoZSAuaWRhdGE0IHNlY3Rpb24uICBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLUBpdGVtIC1jCi1AaXRlbXggLS1uby1pZGF0YTUKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgYW5kIGxpYnJhcnkKLWZpbGVzIGl0IHNob3VsZCBvbWl0IHRoZSAuaWRhdGE1IHNlY3Rpb24uICBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLUBpdGVtIC1pCi1AaXRlbXggLS1pbnRlcndvcmsKLVNwZWNpZmllcyB0aGF0IEBjb2Rle2RsbHRvb2x9IHNob3VsZCBtYXJrIHRoZSBvYmplY3RzIGluIHRoZSBsaWJyYXJ5Ci1maWxlIGFuZCBleHBvcnRzIGZpbGUgdGhhdCBpdCBwcm9kdWNlcyBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZwotYmV0d2VlbiBBUk0gYW5kIFRIVU1CIGNvZGUuCi0KLUBpdGVtIC1uCi1AaXRlbXggLS1ub2RlbGV0ZQotTWFrZXMgQGNvZGV7ZGxsdG9vbH0gcHJlc2VydmUgdGhlIHRlbXBvcmFyeSBhc3NlbWJsZXIgZmlsZXMgaXQgdXNlZCB0bwotY3JlYXRlIHRoZSBleHBvcnRzIGZpbGUuICBJZiB0aGlzIG9wdGlvbiBpcyByZXBlYXRlZCB0aGVuIGRsbHRvb2wgd2lsbAotYWxzbyBwcmVzZXJ2ZSB0aGUgdGVtcG9yYXJ5IG9iamVjdCBmaWxlcyBpdCB1c2VzIHRvIGNyZWF0ZSB0aGUgbGlicmFyeQotZmlsZS4gCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJib3NlCi1NYWtlIGRsbHRvb2wgZGVzY3JpYmUgd2hhdCBpdCBpcyBkb2luZy4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWhlbHAKLURpc3BsYXlzIGEgbGlzdCBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgdGhlbiBleGl0cy4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXlzIGRsbHRvb2wncyB2ZXJzaW9uIG51bWJlciBhbmQgdGhlbiBleGl0cy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSByZWFkZWxmCi1AY2hhcHRlciByZWFkZWxmCi0KLUBjaW5kZXggRUxGIGZpbGUgaW5mb3JtYXRpb24KLUBraW5kZXggcmVhZGVsZgotCi1Ac21hbGxleGFtcGxlCi1yZWFkZWxmIFsgLWEgfCAtLWFsbCBdIAotICAgICAgICBbIC1oIHwgLS1maWxlLWhlYWRlcl0KLSAgICAgICAgWyAtbCB8IC0tcHJvZ3JhbS1oZWFkZXJzIHwgLS1zZWdtZW50c10KLSAgICAgICAgWyAtUyB8IC0tc2VjdGlvbi1oZWFkZXJzIHwgLS1zZWN0aW9uc10KLSAgICAgICAgWyAtZSB8IC0taGVhZGVyc10KLSAgICAgICAgWyAtcyB8IC0tc3ltcyB8IC0tc3ltYm9sc10KLSAgICAgICAgWyAtbiB8IC0tbm90ZXNdCi0gICAgICAgIFsgLXIgfCAtLXJlbG9jc10KLSAgICAgICAgWyAtZCB8IC0tZHluYW1pY10KLSAgICAgICAgWyAtViB8IC0tdmVyc2lvbi1pbmZvXQotICAgICAgICBbIC1EIHwgLS11c2UtZHluYW1pY10KLSAgICAgICAgWyAteCA8bnVtYmVyPiB8IC0taGV4LWR1bXA9PG51bWJlcj5dCi0gICAgICAgIFsgLXdbbGlhcHJdIHwgLS1kZWJ1Zy1kdW1wWz1pbmZvLD1saW5lLD1hYmJyZXYsPXB1Ym5hbWVzLD1yYW5nZXNdXQotICAgICAgICBbICAgICAgLS1oaXN0b2dyYW1dCi0gICAgICAgIFsgLXYgfCAtLXZlcnNpb25dCi0gICAgICAgIFsgLUggfCAtLWhlbHBdCi0gICAgICAgIEB2YXJ7ZWxmZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtyZWFkZWxmfSBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBFTEYgZm9ybWF0IG9iamVjdAotZmlsZXMuICBUaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LgotCi1AdmFye2VsZmZpbGV9QGRvdHN7fSBhcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4gIEF0IHRoZQotbW9tZW50LCBAY29kZXtyZWFkZWxmfSBkb2VzIG5vdCBzdXBwb3J0IGV4YW1pbmluZyBhcmNoaXZlcywgbm9yIGRvZXMgaXQKLXN1cHBvcnQgZXhhbWluZyA2NCBiaXQgRUxGIGZpbGVzLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyBAc2FtcHstdn0gb3IgQHNhbXB7LUh9IG11c3QgYmUKLWdpdmVuLiAKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYQotQGl0ZW14IC0tYWxsCi1FcXVpdmFsZW50IHRvIHNwZWNpZml5aW5nIEBzYW1wey0tZmlsZS1oZWFkZXJ9LAotQHNhbXB7LS1wcm9ncmFtLWhlYWRlcnN9LCBAc2FtcHstLXNlY3Rpb25zfSwgQHNhbXB7LS1zeW1ib2xzfSwKLUBzYW1wey0tcmVsb2NzfSwgQHNhbXB7LS1keW5hbWljfSwgQHNhbXB7LS1ub3Rlc30gYW5kCi1Ac2FtcHstLXZlcnNpb24taW5mb30uIAotCi1AaXRlbSAtaAotQGl0ZW14IC0tZmlsZS1oZWFkZXIKLUBjaW5kZXggRUxGIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBFTEYgaGVhZGVyIGF0IHRoZSBzdGFydCBvZiB0aGUKLWZpbGUuCi0KLUBpdGVtIC1sCi1AaXRlbXggLS1wcm9ncmFtLWhlYWRlcnMKLUBpdGVteCAtLXNlZ21lbnRzCi1AY2luZGV4IEVMRiBwcm9ncmFtIGhlYWRlciBpbmZvcm1hdGlvbgotQGNpbmRleCBFTEYgc2VnbWVudCBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSdzIHNlZ21lbnQgaGVhZGVycywgaWYgaXQKLWhhcyBhbnkuCi0KLUBpdGVtIC1TCi1AaXRlbXggLS1zZWN0aW9ucwotQGl0ZW14IC0tc2VjdGlvbi1oZWFkZXJzCi1AY2luZGV4IEVMRiBzZWN0aW9uIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBmaWxlJ3Mgc2VjdGlvbiBoZWFkZXJzLCBpZiBpdAotaGFzIGFueS4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLXN5bWJvbHMKLUBpdGVteCAtLXN5bXMKLUBjaW5kZXggRUxGIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGVudHJpZXMgaW4gc3ltYm9sIHRhYmxlIHNlY3Rpb24gb2YgdGhlIGZpbGUsIGlmIGl0IGhhcyBvbmUuCi0KLUBpdGVtIC1lCi1AaXRlbXggLS1oZWFkZXJzCi1EaXNwbGF5IGFsbCB0aGUgaGVhZGVycyBpbiB0aGUgZmlsZS4gIEVxdWl2YWxlbnQgdG8gQHNhbXB7LWggLWwgLVN9LgotCi1AaXRlbSAtbgotQGl0ZW14IC0tbm90ZXMKLUBjaW5kZXggRUxGIGNvcmUgbm90ZXMKLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgTk9URSBzZWdtZW50LCBpZiBpdCBleGlzdHMuCi0KLUBpdGVtIC1yCi1AaXRlbXggLS1yZWxvY3MKLUBjaW5kZXggRUxGIHJlbG9jIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUncyByZWxvY2F0aW9uIHNlY3Rpb24sIGlmIGl0IGhhIG9uZS4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWR5bmFtaWMKLUBjaW5kZXggRUxGIGR5bmFtaWMgc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlJ3MgZHluYW1pYyBzZWN0aW9uLCBpZiBpdCBoYXMgb25lLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbi1pbmZvCi1AY2luZGV4IEVMRiB2ZXJzaW9uIHNlY3Rpb25zIGluZm9ybWF0aW9ucwotRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZXJzaW9uIHNlY3Rpb25zIGluIHRoZSBmaWxlLCBpdCB0aGV5Ci1leGlzdC4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLXVzZS1keW5hbWljCi1XaGVuIGRpc3BsYXlpbmcgc3ltYm9scywgdGhpcyBvcHRpb24gbWFrZXMgQGNvZGV7cmVhZGVsZn0gdXNlIHRoZQotc3ltYmxvbCB0YWJsZSBpbiB0aGUgZmlsZSdzIGR5bmFtaWMgc2VjdGlvbiwgcmF0aGVyIHRoYW4gdGhlIG9uZSBpbiB0aGUKLXN5bWJvbHMgc2VjdGlvbi4KLQotQGl0ZW0gLXggPG51bWJlcj4KLUBpdGVteCAtLWhleC1kdW1wPTxudW1iZXI+Ci1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGluZGljYXRlZCBzZWN0aW9uIGFzIGEgaGV4YWRlY2ltYWwgZHVtcC4KLQotQGl0ZW0gLXdbbGlhcHJdCi1AaXRlbXggLS1kZWJ1Zy1kdW1wWz1saW5lLD1pbmZvLD1hYmJyZXYsPXB1Ym5hbWVzLD1yYW5nZXNdCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGRlYnVnIHNlY3Rpb25zIGluIHRoZSBmaWxlLCBpZiBhbnkgYXJlCi1wcmVzZW50LiAgSWYgb25lIG9mIHRoZSBvcHRpb25hbCBsZXR0ZXJzIG9yIHdvcmRzIGZvbGxvd3MgdGhlIHN3aXRjaAotdGhlbiBvbmx5IGRhdGEgZm91bmQgaW4gdGhvc2Ugc3BlY2lmaWMgc2VjdGlvbnMgd2lsbCBiZSBkdW1wZWQuCi0KLUBpdGVtIC0taGlzdG9ncmFtCi1EaXNwbGF5IGEgaGlzdG9ncmFtIG9mIGJ1Y2tldCBsaXN0IGxlbmd0aHMgd2hlbiBkaXNwbGF5aW5nIHRoZSBjb250ZW50cwotb2YgdGhlIHN5bWJvbCB0YWJsZXMuCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiByZWFkZWxmLgotCi1AaXRlbSAtSAotQGl0ZW14IC0taGVscAotRGlzcGxheSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgdW5kZXJzdG9vZCBieSBAY29kZXtyZWFkZWxmfS4KLQotQGVuZCB0YWJsZQotCi0KLUBub2RlIFNlbGVjdGluZyBUaGUgVGFyZ2V0IFN5c3RlbQotQGNoYXB0ZXIgU2VsZWN0aW5nIHRoZSB0YXJnZXQgc3lzdGVtCi0KLVlvdSBjYW4gc3BlY2lmeSB0aHJlZSBhc3BlY3RzIG9mIHRoZSB0YXJnZXQgc3lzdGVtIHRvIHRoZSBAc2N7Z251fQotYmluYXJ5IGZpbGUgdXRpbGl0aWVzLCBlYWNoIGluIHNldmVyYWwgd2F5czoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLXRoZSB0YXJnZXQKLQotQGl0ZW0KLXRoZSBhcmNoaXRlY3R1cmUKLQotQGl0ZW0KLXRoZSBsaW5rZXIgZW11bGF0aW9uICh3aGljaCBhcHBsaWVzIHRvIHRoZSBsaW5rZXIgb25seSkKLUBlbmQgaXRlbWl6ZQotCi1JbiB0aGUgZm9sbG93aW5nIHN1bW1hcmllcywgdGhlIGxpc3RzIG9mIHdheXMgdG8gc3BlY2lmeSB2YWx1ZXMgYXJlIGluCi1vcmRlciBvZiBkZWNyZWFzaW5nIHByZWNlZGVuY2UuICBUaGUgd2F5cyBsaXN0ZWQgZmlyc3Qgb3ZlcnJpZGUgdGhvc2UKLWxpc3RlZCBsYXRlci4KLQotVGhlIGNvbW1hbmRzIHRvIGxpc3QgdmFsaWQgdmFsdWVzIG9ubHkgbGlzdCB0aGUgdmFsdWVzIGZvciB3aGljaCB0aGUKLXByb2dyYW1zIHlvdSBhcmUgcnVubmluZyB3ZXJlIGNvbmZpZ3VyZWQuICBJZiB0aGV5IHdlcmUgY29uZmlndXJlZCB3aXRoCi1Ac2FtcHstLWVuYWJsZS10YXJnZXRzPWFsbH0sIHRoZSBjb21tYW5kcyBsaXN0IG1vc3Qgb2YgdGhlIGF2YWlsYWJsZQotdmFsdWVzLCBidXQgYSBmZXcgYXJlIGxlZnQgb3V0OyBub3QgYWxsIHRhcmdldHMgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gYXQKLW9uY2UgYmVjYXVzZSBzb21lIG9mIHRoZW0gY2FuIG9ubHkgYmUgY29uZmlndXJlZCBAZGZue25hdGl2ZX0gKG9uIGhvc3RzCi13aXRoIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHRhcmdldCBzeXN0ZW0pLgotCi1AbWVudQotKiBUYXJnZXQgU2VsZWN0aW9uOjogICAgICAgICAgICAKLSogQXJjaGl0ZWN0dXJlIFNlbGVjdGlvbjo6ICAgICAgCi0qIExpbmtlciBFbXVsYXRpb24gU2VsZWN0aW9uOjogIAotQGVuZCBtZW51Ci0KLUBub2RlIFRhcmdldCBTZWxlY3Rpb24KLUBzZWN0aW9uIFRhcmdldCBTZWxlY3Rpb24KLQotQSBAZGZue3RhcmdldH0gaXMgYW4gb2JqZWN0IGZpbGUgZm9ybWF0LiAgQSBnaXZlbiB0YXJnZXQgbWF5IGJlCi1zdXBwb3J0ZWQgZm9yIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgKEBweHJlZntBcmNoaXRlY3R1cmUgU2VsZWN0aW9ufSkuCi1BIHRhcmdldCBzZWxlY3Rpb24gbWF5IGFsc28gaGF2ZSB2YXJpYXRpb25zIGZvciBkaWZmZXJlbnQgb3BlcmF0aW5nCi1zeXN0ZW1zIG9yIGFyY2hpdGVjdHVyZXMuCi0KLVRoZSBjb21tYW5kIHRvIGxpc3QgdmFsaWQgdGFyZ2V0IHZhbHVlcyBpcyBAc2FtcHtvYmpkdW1wIC1pfQotKHRoZSBmaXJzdCBjb2x1bW4gb2Ygb3V0cHV0IGNvbnRhaW5zIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbikuCi0KLVNvbWUgc2FtcGxlIHZhbHVlcyBhcmU6IEBzYW1we2Eub3V0LWhwMzAwYnNkfSwgQHNhbXB7ZWNvZmYtbGl0dGxlbWlwc30sCi1Ac2FtcHthLm91dC1zdW5vcy1iaWd9LgotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSBhIHRhcmdldCB1c2luZyBhIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gIFRoaXMgaXMKLXRoZSBzYW1lIHNvcnQgb2YgbmFtZSB0aGF0IGlzIHBhc3NlZCB0byBAZmlsZXtjb25maWd1cmV9IHRvIHNwZWNpZnkgYQotdGFyZ2V0LiAgV2hlbiB5b3UgdXNlIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0IGFzIGFuIGFyZ3VtZW50LCBpdCBtdXN0IGJlCi1mdWxseSBjYW5vbmljYWxpemVkLiAgWW91IGNhbiBzZWUgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgdHJpcGxldCBieQotcnVubmluZyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy5zdWJ9IHdoaWNoIGlzIGluY2x1ZGVkIHdpdGggdGhlCi1zb3VyY2VzLgotCi1Tb21lIHNhbXBsZSBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFyZTogQHNhbXB7bTY4ay1ocC1ic2R9LAotQHNhbXB7bWlwcy1kZWMtdWx0cml4fSwgQHNhbXB7c3BhcmMtc3VuLXN1bm9zfS4KLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqZHVtcH0gVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1ifSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbnM6IEBzYW1wey1JfSBvciBAc2FtcHstLWlucHV0LXRhcmdldH0sIG9yIEBzYW1wey1GfSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBPdXRwdXQgVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb25zOiBAc2FtcHstT30gb3IgQHNhbXB7LS1vdXRwdXQtdGFyZ2V0fSwgb3IgQHNhbXB7LUZ9IG9yIEBzYW1wey0tdGFyZ2V0fQotCi1AaXRlbQotdGhlIGlucHV0IHRhcmdldCAoc2VlIGBgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQnJyBhYm92ZSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7bm19LCBAY29kZXtzaXplfSwgYW5kIEBjb2Rle3N0cmluZ3N9IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIElucHV0IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstYn0gb3IgQHNhbXB7LS1mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtUQVJHRVR9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQotKEBweHJlZntFbnZpcm9ubWVudCwsRW52aXJvbm1lbnQsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi10aGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIHNlbGVjdGVkIGxpbmtlciBlbXVsYXRpb24KLShAcHhyZWZ7TGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LW9mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfQotKEBweHJlZntPcHRpb24gQ29tbWFuZHMsLE9wdGlvbiBDb21tYW5kcyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLXRoZSBsaW5rZXIgaW5wdXQgdGFyZ2V0IChzZWUgYGBMaW5rZXIgSW5wdXQgVGFyZ2V0JycgYWJvdmUpCi1AZW5kIGVudW1lcmF0ZQotCi1Abm9kZSBBcmNoaXRlY3R1cmUgU2VsZWN0aW9uCi1Ac2VjdGlvbiBBcmNoaXRlY3R1cmUgc2VsZWN0aW9uCi0KLUFuIEBkZm57YXJjaGl0ZWN0dXJlfSBpcyBhIHR5cGUgb2YgQHNje2NwdX0gb24gd2hpY2ggYW4gb2JqZWN0IGZpbGUgaXMKLXRvIHJ1bi4gIEl0cyBuYW1lIG1heSBjb250YWluIGEgY29sb24sIHNlcGFyYXRpbmcgdGhlIG5hbWUgb2YgdGhlCi1wcm9jZXNzb3IgZmFtaWx5IGZyb20gdGhlIG5hbWUgb2YgdGhlIHBhcnRpY3VsYXIgQHNje2NwdX0uCi0KLVRoZSBjb21tYW5kIHRvIGxpc3QgdmFsaWQgYXJjaGl0ZWN0dXJlIHZhbHVlcyBpcyBAc2FtcHtvYmpkdW1wIC1pfSAodGhlCi1zZWNvbmQgY29sdW1uIGNvbnRhaW5zIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbikuCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we202OGs6NjgwMjB9LCBAc2FtcHttaXBzOjMwMDB9LCBAc2FtcHtzcGFyY30uCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamR1bXB9IEFyY2hpdGVjdHVyZQotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0gb3IgQHNhbXB7LS1hcmNoaXRlY3R1cmV9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamNvcHl9LCBAY29kZXtubX0sIEBjb2Rle3NpemV9LCBAY29kZXtzdHJpbmdzfSBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCi1AZW5kIGVudW1lcmF0ZQotCi1Ac3ViaGVhZGluZyBMaW5rZXIgSW5wdXQgQXJjaGl0ZWN0dXJlCi0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7T1VUUFVUX0FSQ0h9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGZyb20gdGhlIGxpbmtlciBvdXRwdXQgdGFyZ2V0Ci0oQHB4cmVme1RhcmdldCBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgTGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb24KLUBzZWN0aW9uIExpbmtlciBlbXVsYXRpb24gc2VsZWN0aW9uCi0KLUEgbGlua2VyIEBkZm57ZW11bGF0aW9ufSBpcyBhIGBgcGVyc29uYWxpdHknJyBvZiB0aGUgbGlua2VyLCB3aGljaCBnaXZlcwotdGhlIGxpbmtlciBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG90aGVyIGFzcGVjdHMgb2YgdGhlIHRhcmdldCBzeXN0ZW0uCi1JbiBwYXJ0aWN1bGFyLCBpdCBjb25zaXN0cyBvZgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIGxpbmtlciBzY3JpcHQKLQotQGl0ZW0KLXRoZSB0YXJnZXQKLQotQGl0ZW0KLXNldmVyYWwgYGBob29rJycgZnVuY3Rpb25zIHRoYXQgYXJlIHJ1biBhdCBjZXJ0YWluIHN0YWdlcyBvZiB0aGUgbGlua2luZwotcHJvY2VzcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB0aGF0IHNvbWUgdGFyZ2V0cyByZXF1aXJlCi1AZW5kIGl0ZW1pemUKLQotVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCBsaW5rZXIgZW11bGF0aW9uIHZhbHVlcyBpcyBAc2FtcHtsZCAtVn0uCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we2hwMzAwYnNkfSwgQHNhbXB7bWlwc2xpdH0sIEBzYW1we3N1bjR9LgotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0KLShAcHhyZWZ7T3B0aW9ucywsT3B0aW9ucyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0xERU1VTEFUSU9OfQotCi1AaXRlbQotY29tcGlsZWQtaW4gQGNvZGV7REVGQVVMVF9FTVVMQVRJT059IGZyb20gQGZpbGV7TWFrZWZpbGV9LAotd2hpY2ggY29tZXMgZnJvbSBAY29kZXtFTVVMfSBpbiBAZmlsZXtjb25maWcvQHZhcnt0YXJnZXR9Lm10fQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgUmVwb3J0aW5nIEJ1Z3MKLUBjaGFwdGVyIFJlcG9ydGluZyBCdWdzCi1AY2luZGV4IGJ1Z3MKLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MKLQotWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyB0aGUgYmluYXJ5IHV0aWxpdGllcwotcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yCi1pdCBtYXkgbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzCi10byBoZWxwIHRoZSBlbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcyB3b3JrIGJldHRlci4gIEJ1ZyByZXBvcnRzIGFyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byB0aGVpcgotbWFpbnRlbmFuY2UuCi0KLUluIG9yZGVyIGZvciBhIGJ1ZyByZXBvcnQgdG8gc2VydmUgaXRzIHB1cnBvc2UsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1pbmZvcm1hdGlvbiB0aGF0IGVuYWJsZXMgdXMgdG8gZml4IHRoZSBidWcuCi0KLUBtZW51Ci0qIEJ1ZyBDcml0ZXJpYTo6ICAgICAgICAgICAgICAgIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotKiBCdWcgUmVwb3J0aW5nOjogICAgICAgICAgICAgICBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBlbmQgbWVudQotCi1Abm9kZSBCdWcgQ3JpdGVyaWEKLUBzZWN0aW9uIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotQGNpbmRleCBidWcgY3JpdGVyaWEKLQotSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdSBoYXZlIGZvdW5kIGEgYnVnLCBoZXJlIGFyZSBzb21lIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggZmF0YWwgc2lnbmFsCi1AY2luZGV4IGNyYXNoCi1AaXRlbQotSWYgYSBiaW5hcnkgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzCi1hIGJ1Zy4gIFJlbGlhYmxlIHV0aWxpdGllcyBuZXZlciBjcmFzaC4KLQotQGNpbmRleCBlcnJvciBvbiB2YWxpZCBpbnB1dAotQGl0ZW0KLUlmIGEgYmluYXJ5IHV0aWxpdHkgcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYQotYnVnLgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGJpbmFyeSB1dGlsaXRpZXMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yCi1pbXByb3ZlbWVudCBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIHRoZSBiaW5hcnkgdXRpbGl0aWVzIGZyb20gYSBzdXBwb3J0Ci1vcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UgY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KLQotWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCi1pbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCi1kaXN0cmlidXRpb24uCi0KLUluIGFueSBldmVudCwgd2UgYWxzbyByZWNvbW1lbmQgdGhhdCB5b3Ugc2VuZCBidWcgcmVwb3J0cyBmb3IgdGhlIGJpbmFyeQotdXRpbGl0aWVzIHRvIEBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgotCi1UaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6Ci1Ac3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCi1mYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCi0KLU9mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlCi1wcm9ibGVtIGFuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodAotYXNzdW1lIHRoYXQgdGhlIG5hbWUgb2YgYSBmaWxlIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuCi1XZWxsLCBwcm9iYWJseSBpdCBkb2VzIG5vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcwotYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoIGhhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUKLXRoYXQgcGF0aG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIHBhdGhuYW1lIHdlcmUKLWRpZmZlcmVudCwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbCB0aGUgdXRpbGl0eSBpbnRvCi1kb2luZyB0aGUgcmlnaHQgdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZCBnaXZlIGEKLXNwZWNpZmljLCBjb21wbGV0ZSBleGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLAotYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIHRoZSB1dGlsaXR5LiAgRWFjaCB1dGlsaXR5IGFubm91bmNlcyBpdCBpZiB5b3Ugc3RhcnQgaXQKLXdpdGggdGhlIEBzYW1wey0tdmVyc2lvbn0gYXJndW1lbnQuCi0KLVdpdGhvdXQgdGhpcywgd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHRoZXJlIGlzIGFueSBwb2ludCBpbiBsb29raW5nIGZvcgotdGhlIGJ1ZyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkgdXRpbGl0aWVzLgotCi1AaXRlbQotQW55IHBhdGNoZXMgeW91IG1heSBoYXZlIGFwcGxpZWQgdG8gdGhlIHNvdXJjZSwgaW5jbHVkaW5nIGFueSBwYXRjaGVzCi1tYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHV0aWxpdGllcy0tLWUuZy4KLWBgQGNvZGV7Z2NjLTIuN30nJy4KLQotQGl0ZW0KLVRoZSBjb21tYW5kIGFyZ3VtZW50cyB5b3UgZ2F2ZSB0aGUgdXRpbGl0eSB0byBvYnNlcnZlIHRoZSBidWcuICBUbwotZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbSBhbGwuICBBIGNvcHkKLW9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIElmIHRoZSB1dGlsaXR5IGlzIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUgb3IgZmlsZXMsIHRoZW4gaXQgaXMKLWdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywgdXVlbmNvZGVkIGlmCi1uZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBOb3RlIHRoYXQKLUBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9IGlzIGEgbWFpbGluZyBsaXN0LCBzbyB5b3Ugc2hvdWxkIGF2b2lkCi1zZW5kaW5nIHZlcnkgbGFyZ2UgZmlsZXMgdG8gaXQuICBNYWtpbmcgdGhlIGZpbGVzIGF2YWlsYWJsZSBmb3IKLWFub255bW91cyBGVFAgaXMgT0suCi0KLUlmIHRoZSBzb3VyY2UgZmlsZXMgd2VyZSBwcm9kdWNlZCBleGNsdXNpdmVseSB1c2luZyBAc2N7Z251fSBwcm9ncmFtcwotKGUuZy4sIEBjb2Rle2djY30sIEBjb2Rle2dhc30sIGFuZC9vciB0aGUgQHNje2dudX0gQGNvZGV7bGR9KSwgdGhlbiBpdAotbWF5IGJlIE9LIHRvIHNlbmQgdGhlIHNvdXJjZSBmaWxlcyByYXRoZXIgdGhhbiB0aGUgb2JqZWN0IGZpbGVzLiAgSW4KLXRoaXMgY2FzZSwgYmUgc3VyZSB0byBzYXkgZXhhY3RseSB3aGF0IHZlcnNpb24gb2YgQGNvZGV7Z2NjfSwgb3IKLXdoYXRldmVyLCB3YXMgdXNlZCB0byBwcm9kdWNlIHRoZSBvYmplY3QgZmlsZXMuICBBbHNvIHNheSBob3cKLUBjb2Rle2djY30sIG9yIHdoYXRldmVyLCB3YXMgY29uZmlndXJlZC4KLQotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2Ygd2hhdCBiZWhhdmlvciB5b3Ugb2JzZXJ2ZSB0aGF0IHlvdSBiZWxpZXZlIGlzCi1pbmNvcnJlY3QuICBGb3IgZXhhbXBsZSwgYGBJdCBnZXRzIGEgZmF0YWwgc2lnbmFsLicnCi0KLU9mIGNvdXJzZSwgaWYgdGhlIGJ1ZyBpcyB0aGF0IHRoZSB1dGlsaXR5IGdldHMgYSBmYXRhbCBzaWduYWwsIHRoZW4gd2UKLXdpbGwgY2VydGFpbmx5IG5vdGljZSBpdC4gIEJ1dCBpZiB0aGUgYnVnIGlzIGluY29ycmVjdCBvdXRwdXQsIHdlIG1pZ2h0Ci1ub3Qgbm90aWNlIHVubGVzcyBpdCBpcyBnbGFyaW5nbHkgd3JvbmcuICBZb3UgbWlnaHQgYXMgd2VsbCBub3QgZ2l2ZSB1cwotYSBjaGFuY2UgdG8gbWFrZSBhIG1pc3Rha2UuCi0KLUV2ZW4gaWYgdGhlIHByb2JsZW0geW91IGV4cGVyaWVuY2UgaXMgYSBmYXRhbCBzaWduYWwsIHlvdSBzaG91bGQgc3RpbGwKLXNheSBzbyBleHBsaWNpdGx5LiAgU3VwcG9zZSBzb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbiwgc3VjaCBhcyB5b3VyCi1jb3B5IG9mIHRoZSB1dGlsaXR5IGlzIG91dCBvZiBzeW5jaCwgb3IgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBidWcgaW4KLXRoZSBDIGxpYnJhcnkgb24geW91ciBzeXN0ZW0uICAoVGhpcyBoYXMgaGFwcGVuZWQhKSAgWW91ciBjb3B5IG1pZ2h0Ci1jcmFzaCBhbmQgb3VycyB3b3VsZCBub3QuICBJZiB5b3UgdG9sZCB1cyB0byBleHBlY3QgYSBjcmFzaCwgdGhlbiB3aGVuCi1vdXJzIGZhaWxzIHRvIGNyYXNoLCB3ZSB3b3VsZCBrbm93IHRoYXQgdGhlIGJ1ZyB3YXMgbm90IGhhcHBlbmluZyBmb3IKLXVzLiAgSWYgeW91IGhhZCBub3QgdG9sZCB1cyB0byBleHBlY3QgYSBjcmFzaCwgdGhlbiB3ZSB3b3VsZCBub3QgYmUgYWJsZQotdG8gZHJhdyBhbnkgY29uY2x1c2lvbiBmcm9tIG91ciBvYnNlcnZhdGlvbnMuCi0KLUBpdGVtCi1JZiB5b3Ugd2lzaCB0byBzdWdnZXN0IGNoYW5nZXMgdG8gdGhlIHNvdXJjZSwgc2VuZCB1cyBjb250ZXh0IGRpZmZzLCBhcwotZ2VuZXJhdGVkIGJ5IEBjb2Rle2RpZmZ9IHdpdGggdGhlIEBzYW1wey11fSwgQHNhbXB7LWN9LCBvciBAc2FtcHstcH0KLW9wdGlvbi4gIEFsd2F5cyBzZW5kIGRpZmZzIGZyb20gdGhlIG9sZCBmaWxlIHRvIHRoZSBuZXcgZmlsZS4gIElmIHlvdQotd2lzaCB0byBkaXNjdXNzIHNvbWV0aGluZyBpbiB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgcmVmZXIgdG8gaXQgYnkKLWNvbnRleHQsIG5vdCBieSBsaW5lIG51bWJlci4KLQotVGhlIGxpbmUgbnVtYmVycyBpbiBvdXIgZGV2ZWxvcG1lbnQgc291cmNlcyB3aWxsIG5vdCBtYXRjaCB0aG9zZSBpbiB5b3VyCi1zb3VyY2VzLiAgWW91ciBsaW5lIG51bWJlcnMgd291bGQgY29udmV5IG5vIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB1cy4KLUBlbmQgaXRlbWl6ZQotCi1IZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5OgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQSBkZXNjcmlwdGlvbiBvZiB0aGUgZW52ZWxvcGUgb2YgdGhlIGJ1Zy4KLQotT2Z0ZW4gcGVvcGxlIHdobyBlbmNvdW50ZXIgYSBidWcgc3BlbmQgYSBsb3Qgb2YgdGltZSBpbnZlc3RpZ2F0aW5nCi13aGljaCBjaGFuZ2VzIHRvIHRoZSBpbnB1dCBmaWxlIHdpbGwgbWFrZSB0aGUgYnVnIGdvIGF3YXkgYW5kIHdoaWNoCi1jaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCBpdC4KLQotVGhpcyBpcyBvZnRlbiB0aW1lIGNvbnN1bWluZyBhbmQgbm90IHZlcnkgdXNlZnVsLCBiZWNhdXNlIHRoZSB3YXkgd2UKLXdpbGwgZmluZCB0aGUgYnVnIGlzIGJ5IHJ1bm5pbmcgYSBzaW5nbGUgZXhhbXBsZSB1bmRlciB0aGUgZGVidWdnZXIKLXdpdGggYnJlYWtwb2ludHMsIG5vdCBieSBwdXJlIGRlZHVjdGlvbiBmcm9tIGEgc2VyaWVzIG9mIGV4YW1wbGVzLgotV2UgcmVjb21tZW5kIHRoYXQgeW91IHNhdmUgeW91ciB0aW1lIGZvciBzb21ldGhpbmcgZWxzZS4KLQotT2YgY291cnNlLCBpZiB5b3UgY2FuIGZpbmQgYSBzaW1wbGVyIGV4YW1wbGUgdG8gcmVwb3J0IEBlbXBoe2luc3RlYWR9Ci1vZiB0aGUgb3JpZ2luYWwgb25lLCB0aGF0IGlzIGEgY29udmVuaWVuY2UgZm9yIHVzLiAgRXJyb3JzIGluIHRoZQotb3V0cHV0IHdpbGwgYmUgZWFzaWVyIHRvIHNwb3QsIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIHdpbGwgdGFrZQotbGVzcyB0aW1lLCBhbmQgc28gb24uCi0KLUhvd2V2ZXIsIHNpbXBsaWZpY2F0aW9uIGlzIG5vdCB2aXRhbDsgaWYgeW91IGRvIG5vdCB3YW50IHRvIGRvIHRoaXMsCi1yZXBvcnQgdGhlIGJ1ZyBhbnl3YXkgYW5kIHNlbmQgdXMgdGhlIGVudGlyZSB0ZXN0IGNhc2UgeW91IHVzZWQuCi0KLUBpdGVtCi1BIHBhdGNoIGZvciB0aGUgYnVnLgotCi1BIHBhdGNoIGZvciB0aGUgYnVnIGRvZXMgaGVscCB1cyBpZiBpdCBpcyBhIGdvb2Qgb25lLiAgQnV0IGRvIG5vdCBvbWl0Ci10aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0ZXN0IGNhc2UsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKLWEgcGF0Y2ggaXMgYWxsIHdlIG5lZWQuICBXZSBtaWdodCBzZWUgcHJvYmxlbXMgd2l0aCB5b3VyIHBhdGNoIGFuZCBkZWNpZGUKLXRvIGZpeCB0aGUgcHJvYmxlbSBhbm90aGVyIHdheSwgb3Igd2UgbWlnaHQgbm90IHVuZGVyc3RhbmQgaXQgYXQgYWxsLgotCi1Tb21ldGltZXMgd2l0aCBwcm9ncmFtcyBhcyBjb21wbGljYXRlZCBhcyB0aGUgYmluYXJ5IHV0aWxpdGllcyBpdCBpcwotdmVyeSBoYXJkIHRvIGNvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhCi1jZXJ0YWluIHBhdGggdGhyb3VnaCB0aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2UKLXdpbGwgbm90IGJlIGFibGUgdG8gY29uc3RydWN0IG9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdAotdGhlIGJ1ZyBpcyBmaXhlZC4KLQotQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKLXBhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKLWhlbHAgdXMgdG8gdW5kZXJzdGFuZC4KLQotQGl0ZW0KLUEgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KLQotU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAotdGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2J1Y29tbS5jIGIvYmludXRpbHMvYnVjb21tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjAwNTQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYnVjb21tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogYnVjb21tLmMgLS0gQmluIFV0aWxzIENPTW1vbiBjb2RlLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIFdlIG1pZ2h0IHB1dCB0aGlzIGluIGEgbGlicmFyeSBzb21lZGF5IHNvIGl0IGNvdWxkIGJlIGR5bmFtaWNhbGx5Ci0gICBsb2FkZWQsIGJ1dCBmb3Igbm93IGl0J3Mgbm90IG5lY2Vzc2FyeS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dGltZS5oPgkJLyogY3RpbWUsIG1heWJlIHRpbWVfdCAqLwotCi0jaWZuZGVmIEhBVkVfVElNRV9UX0lOX1RJTUVfSAotI2lmbmRlZiBIQVZFX1RJTUVfVF9JTl9UWVBFU19ICi10eXBlZGVmIGxvbmcgdGltZV90OwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQwKLS8qIEVycm9yIHJlcG9ydGluZyAqLwotCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLXZvaWQKLWJmZF9ub25mYXRhbCAoc3RyaW5nKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci17Ci0gIENPTlNUIGNoYXIgKmVycm1zZyA9IGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpOwotCi0gIGlmIChzdHJpbmcpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHJpbmcsIGVycm1zZyk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIHByb2dyYW1fbmFtZSwgZXJybXNnKTsKLX0KLQotdm9pZAotYmZkX2ZhdGFsIChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgYmZkX25vbmZhdGFsIChzdHJpbmcpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZXBvcnQgKGZvcm1hdCwgYXJncykKLSAgICAgY29uc3QgY2hhciAqIGZvcm1hdDsKLSAgICAgdmFfbGlzdCBhcmdzOwotewotICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotdm9pZAotZmF0YWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJlcG9ydCAoZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgeGV4aXQgKDEpOwotfQotCi12b2lkCi1ub25fZmF0YWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJlcG9ydCAoZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLX0KLSNlbHNlCi12b2lkIAotZmF0YWwgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqRm9ybWF0OwotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBGb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0gIHJlcG9ydCAoRm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgeGV4aXQgKDEpOwotfQotCi12b2lkIAotbm9uX2ZhdGFsICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi17Ci0gIGNoYXIgKkZvcm1hdDsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgRm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICByZXBvcnQgKEZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci19Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBkZWZhdWx0IEJGRCB0YXJnZXQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0LiAgRG9pbmcKLSAgIHRoaXMgcGVybWl0cyB0aGUgYmludXRpbHMgdG8gYmUgY29uZmlndXJlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCwKLSAgIGFuZCBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBCRkQgbGlicmFyeSB3aGljaCB3YXMgY29uZmlndXJlZCBmb3IgYQotICAgZGlmZmVyZW50IHRhcmdldC4gICovCi0KLXZvaWQKLXNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCkKLXsKLSAgLyogVGhlIG1hY3JvIFRBUkdFVCBpcyBkZWZpbmVkIGJ5IE1ha2VmaWxlLiAgKi8KLSAgY29uc3QgY2hhciAqdGFyZ2V0ID0gVEFSR0VUOwotCi0gIGlmICghIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKHRhcmdldCkpCi0gICAgZmF0YWwgKF8oImNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJXMiKSwKLQkgICB0YXJnZXQsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLX0KLQotLyogQWZ0ZXIgYSBmYWxzZSByZXR1cm4gZnJvbSBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgd2l0aAotICAgYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLCBwcmludAotICAgdGhlIHBvc3NpYmxlIG1hdGNoaW5nIHRhcmdldHMuICAqLwotCi12b2lkCi1saXN0X21hdGNoaW5nX2Zvcm1hdHMgKHApCi0gICAgIGNoYXIgKipwOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBNYXRjaGluZyBmb3JtYXRzOiIpLCBwcm9ncmFtX25hbWUpOwotICB3aGlsZSAoKnApCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgKnArKyk7Ci0gIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotfQotCi0vKiBMaXN0IHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cy4gICovCi0KLXZvaWQKLWxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKG5hbWUsIGYpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEZJTEUgKmY7Ci17Ci0gIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOwotICBpbnQgdDsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIGZwcmludGYgKGYsIF8oIlN1cHBvcnRlZCB0YXJnZXRzOiIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGYsIF8oIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiKSwgbmFtZSk7Ci0gIGZvciAodCA9IDA7IGJmZF90YXJnZXRfdmVjdG9yW3RdICE9IE5VTEw7IHQrKykKLSAgICBmcHJpbnRmIChmLCAiICVzIiwgYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpOwotICBmcHJpbnRmIChmLCAiXG4iKTsKLX0KLQwKLS8qIERpc3BsYXkgdGhlIGFyY2hpdmUgaGVhZGVyIGZvciBhbiBlbGVtZW50IGFzIGlmIGl0IHdlcmUgYW4gbHMgLWwgbGlzdGluZzoKLQotICAgTW9kZSAgICAgICBVc2VyXHRHcm91cFx0U2l6ZVx0RGF0ZSAgICAgICAgICAgICAgIE5hbWUgKi8KLQotdm9pZAotcHJpbnRfYXJlbHRfZGVzY3IgKGZpbGUsIGFiZmQsIHZlcmJvc2UpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB2ZXJib3NlOwotewotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChhYmZkLCAmYnVmKSA9PSAwKQotCXsKLQkgIGNoYXIgbW9kZWJ1ZlsxMV07Ci0JICBjaGFyIHRpbWVidWZbNDBdOwotCSAgdGltZV90IHdoZW4gPSBidWYuc3RfbXRpbWU7Ci0JICBDT05TVCBjaGFyICpjdGltZV9yZXN1bHQgPSAoQ09OU1QgY2hhciAqKSBjdGltZSAoJndoZW4pOwotCi0JICAvKiBQT1NJWCBmb3JtYXQ6ICBza2lwIHdlZWtkYXkgYW5kIHNlY29uZHMgZnJvbSBjdGltZSBvdXRwdXQuICAqLwotCSAgc3ByaW50ZiAodGltZWJ1ZiwgIiUuMTJzICUuNHMiLCBjdGltZV9yZXN1bHQgKyA0LCBjdGltZV9yZXN1bHQgKyAyMCk7Ci0KLQkgIG1vZGVfc3RyaW5nIChidWYuc3RfbW9kZSwgbW9kZWJ1Zik7Ci0JICBtb2RlYnVmWzEwXSA9ICdcMCc7Ci0JICAvKiBQT1NJWCAxMDAzLjIvRDExIHNheXMgdG8gc2tpcCBmaXJzdCBjaGFyYWN0ZXIgKGVudHJ5IHR5cGUpLiAgKi8KLQkgIGZwcmludGYgKGZpbGUsICIlcyAlbGQvJWxkICU2bGQgJXMgIiwgbW9kZWJ1ZiArIDEsCi0JCSAgIChsb25nKSBidWYuc3RfdWlkLCAobG9uZykgYnVmLnN0X2dpZCwKLQkJICAgKGxvbmcpIGJ1Zi5zdF9zaXplLCB0aW1lYnVmKTsKLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbGUsICIlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgRklMRU5BTUUuICAqLwotCi1jaGFyICoKLW1ha2VfdGVtcG5hbWUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RhdGljIGNoYXIgdGVtcGxhdGVbXSA9ICJzdFhYWFhYWCI7Ci0gIGNoYXIgKnRtcG5hbWU7Ci0gIGNoYXIgKnNsYXNoID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0KLSNpZiBkZWZpbmVkIChfX0RKR1BQX18pIHx8IGRlZmluZWQgKF9fR08zMl9fKSB8fCBkZWZpbmVkIChfV0lOMzIpCi0gIGlmIChzbGFzaCA9PSBOVUxMKQotICAgIHNsYXNoID0gc3RycmNociAoZmlsZW5hbWUsICdcXCcpOwotI2VuZGlmCi0KLSAgaWYgKHNsYXNoICE9IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBjID0gKnNsYXNoOwotICAgICAgKnNsYXNoID0gMDsKLSAgICAgIHRtcG5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKSArIHNpemVvZiAodGVtcGxhdGUpICsgMSk7Ci0gICAgICBzdHJjcHkgKHRtcG5hbWUsIGZpbGVuYW1lKTsKLSAgICAgIHN0cmNhdCAodG1wbmFtZSwgIi8iKTsKLSAgICAgIHN0cmNhdCAodG1wbmFtZSwgdGVtcGxhdGUpOwotICAgICAgbWt0ZW1wICh0bXBuYW1lKTsKLSAgICAgICpzbGFzaCA9IGM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdG1wbmFtZSA9IHhtYWxsb2MgKHNpemVvZiAodGVtcGxhdGUpKTsKLSAgICAgIHN0cmNweSAodG1wbmFtZSwgdGVtcGxhdGUpOwotICAgICAgbWt0ZW1wICh0bXBuYW1lKTsKLSAgICB9Ci0gIHJldHVybiB0bXBuYW1lOwotfQotCi0vKiBQYXJzZSBhIHN0cmluZyBpbnRvIGEgVk1BLCB3aXRoIGEgZmF0YWwgZXJyb3IgaWYgaXQgY2FuJ3QgYmUKLSAgIHBhcnNlZC4gICovCi0KLWJmZF92bWEKLXBhcnNlX3ZtYSAocywgYXJnKQotICAgICBjb25zdCBjaGFyICpzOwotICAgICBjb25zdCBjaGFyICphcmc7Ci17Ci0gIGJmZF92bWEgcmV0OwotICBjb25zdCBjaGFyICplbmQ7Ci0KLSAgcmV0ID0gYmZkX3NjYW5fdm1hIChzLCAmZW5kLCAwKTsKLSAgCi0gIGlmICgqZW5kICE9ICdcMCcpCi0gICAgZmF0YWwgKF8oIiVzOiBiYWQgbnVtYmVyOiAlcyIpLCBhcmcsIHMpOwotCi0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9idWNvbW0uaCBiL2JpbnV0aWxzL2J1Y29tbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmU2YTc5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2J1Y29tbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qIGJ1Y29tbS5oIC0tIGJpbnV0aWxzIGNvbW1vbiBpbmNsdWRlIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaWZuZGVmIF9CVUNPTU1fSAotI2RlZmluZSBfQlVDT01NX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgVVNFX0JJTkFSWV9GT1BFTgotI2luY2x1ZGUgImZvcGVuLWJpbi5oIgotI2Vsc2UKLSNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TWVNfRklMRV9ICi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TQlJLCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi1leHRlcm4gY2hhciAqc2JyayAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi1leHRlcm4gY2hhciAqKmVudmlyb247Ci0jZW5kaWYKLQotI2lmbmRlZiBPX1JET05MWQotI2RlZmluZSBPX1JET05MWSAwCi0jZW5kaWYKLQotI2lmbmRlZiBPX1JEV1IKLSNkZWZpbmUgT19SRFdSIDIKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfU0VUCi0jZGVmaW5lIFNFRUtfU0VUIDAKLSNlbmRpZgotI2lmbmRlZiBTRUVLX0NVUgotI2RlZmluZSBTRUVLX0NVUiAxCi0jZW5kaWYKLSNpZm5kZWYgU0VFS19FTkQKLSNkZWZpbmUgU0VFS19FTkQgMgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWYgZGVmaW5lZChIQVZFX0FMTE9DQV9IKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgIGlmICFkZWZpbmVkIChfX1NURENfXykgJiYgIWRlZmluZWQgKF9faHB1eCkKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbHNlCi12b2lkICphbGxvY2EgKCk7Ci0jICAgZW5kaWYgLyogX19TVERDX18sIF9faHB1eCAqLwotIyAgZW5kaWYgLyogYWxsb2NhICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0KLS8qIGJ1Y29tbS5jICovCi12b2lkIGJmZF9ub25mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKLQotdm9pZCBiZmRfZmF0YWwgUEFSQU1TICgoQ09OU1QgY2hhciAqKSk7Ci0KLXZvaWQgZmF0YWwgUEFSQU1TICgoQ09OU1QgY2hhciAqLCAuLi4pKTsKLQotdm9pZCBub25fZmF0YWwgUEFSQU1TICgoQ09OU1QgY2hhciAqLCAuLi4pKTsKLQotdm9pZCBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgUEFSQU1TICgoY2hhciAqKnApKTsKLQotdm9pZCBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgRklMRSAqKSk7Ci0KLXZvaWQgcHJpbnRfYXJlbHRfZGVzY3IgUEFSQU1TICgoRklMRSAqZmlsZSwgYmZkICphYmZkLCBib29sZWFuIHZlcmJvc2UpKTsKLQotY2hhciAqbWFrZV90ZW1wbmFtZSBQQVJBTVMgKChjaGFyICopKTsKLQotYmZkX3ZtYSBwYXJzZV92bWEgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogZmlsZW1vZGUuYyAqLwotdm9pZCBtb2RlX3N0cmluZyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG1vZGUsIGNoYXIgKmJ1ZikpOwotCi0vKiB2ZXJzaW9uLmMgKi8KLWV4dGVybiB2b2lkIHByaW50X3ZlcnNpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIHJlbmFtZS5jICovCi1leHRlcm4gdm9pZCBzZXRfdGltZXMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLWV4dGVybiBpbnQgc21hcnRfcmVuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotLyogbGliaWJlcnR5ICovCi1QVFIgeG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotUFRSIHhyZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci0KLSNlbmRpZiAvKiBfQlVDT01NX0ggKi8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2J1ZGJnLmggYi9iaW51dGlscy9idWRiZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGVlODg5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2J1ZGJnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiBidWRiZy5jIC0tIEludGVyZmFjZXMgdG8gdGhlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHJvdXRpbmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQlVEQkdfSAotI2RlZmluZSBCVURCR19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBSb3V0aW5lIHVzZWQgdG8gcmVhZCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBQVFIgcmVhZF9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZykpOwotCi0vKiBSb3V0aW5lIHVzZWQgdG8gcHJpbnQgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gYm9vbGVhbiBwcmludF9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChGSUxFICosIFBUUikpOwotCi0vKiBSb3V0aW5lcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIHN0YWJzIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIFBUUiBzdGFydF9zdGFiIFBBUkFNUyAoKFBUUiwgYmZkICosIGJvb2xlYW4sIGFzeW1ib2wgKiosIGxvbmcpKTsKLQotZXh0ZXJuIGJvb2xlYW4gZmluaXNoX3N0YWIgUEFSQU1TICgoUFRSLCBQVFIpKTsKLQotZXh0ZXJuIGJvb2xlYW4gcGFyc2Vfc3RhYiBQQVJBTVMgKChQVFIsIFBUUiwgaW50LCBpbnQsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gYm9vbGVhbiB3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgUFRSLCBiZmRfYnl0ZSAqKiwgYmZkX3NpemVfdHlwZSAqLCBiZmRfYnl0ZSAqKiwKLQkgICBiZmRfc2l6ZV90eXBlICopKTsKLQotLyogUm91dGluZXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIHBhcnNlX2llZWUKLSAgUEFSQU1TICgoUFRSLCBiZmQgKiwgY29uc3QgYmZkX2J5dGUgKiwgYmZkX3NpemVfdHlwZSkpOwotCi1leHRlcm4gYm9vbGVhbiB3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotLyogUm91dGluZSB1c2VkIHRvIHJlYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gYm9vbGVhbiBwYXJzZV9jb2ZmIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nLCBQVFIpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb2ZmZHVtcC5jIGIvYmludXRpbHMvY29mZmR1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4NGQ1MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb2ZmZHVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qIENvZmYgZmlsZSBkdW1wZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgbW9kdWxlIHJlYWRzIGEgdHlwZSB0cmVlIGdlbmVyYXRlZCBieSBjb2ZmZ3JvayBhbmQgcHJpbnRzCi0gICBpdCBvdXQgc28gd2UgY2FuIHRlc3QgdGhlIGdyb2trZXIuCi0qLwotCi0jaW5jbHVkZSA8YmZkLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8bGliaWJlcnR5Lmg+Ci0KLSNpbmNsdWRlICJjb2ZmZ3Jvay5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jZGVmaW5lIFBST0dSQU1fVkVSU0lPTiAiMS4wIgotCi1zdGF0aWMgaW50IGF0bmw7Ci1zdGF0aWMgdm9pZCBkdW1wX2NvZmZfc2NvcGUgKCk7Ci0KLXN0YXRpYyB2b2lkCi10YWIgKHgpCi1pbnQgeDsKLXsKLSAgc3RhdGljIGludCBpbmRlbnQ7Ci0gIGludCBpOwotCi0gIGlmIChhdG5sKQotICAgIHsKLSAgICAgIGlmICh4IDwgMCkKLQl7Ci0JICBwcmludGYgKCIpIik7Ci0JICBpbmRlbnQgKz0geDsKLQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgYXRubCA9IDA7Ci0JfQotICAgIH0KLQotICBpZiAoeCA9PSAtMSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0JcHJpbnRmICgiICAgIik7Ci0KLSAgICAgIGluZGVudCArPSB4OwotICAgICAgcHJpbnRmICgiKSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbmRlbnQgKz0geDsKLQotICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0gICAgcHJpbnRmICgiICAgIik7Ci0KLSAgaWYgKHgpCi0gICAgewotICAgICAgcHJpbnRmICgiKCIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgbmwgKCkKLXsKLSAgYXRubCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfbGluZXMgKHApCi0gICAgIHN0cnVjdCBjb2ZmX2xpbmUgKnA7Ci17Ci0gIGludCBpOwotICBpbnQgb25saW5lID0gMDsKLSAgdGFiKDEpOwotICBwcmludGYoXygiI2xpbmVzICVkICIpLHAtPm5saW5lcyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwLT5ubGluZXM7IGkrKykgCi0gICAgewotICAgICAgcHJpbnRmKCIoJWQgMHgleCkiLCBwLT5saW5lc1tpXSwgcC0+YWRkcmVzc2VzW2ldKTsKLSAgICAgIG9ubGluZSsrOwotICAgICAgaWYgKG9ubGluZSA+IDYpCi0JewotCSAgbmwoKTsKLQkgIHRhYigwKTsKLQkgIG9ubGluZSA9IDA7Ci0JfQotICAgIH0KLSAgbmwoKTsKLSAgdGFiKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl90eXBlIChwKQotICAgICBzdHJ1Y3QgY29mZl90eXBlICpwOwotewotICB0YWIgKDEpOwotICBwcmludGYgKCJzaXplICVkICIsIHAtPnNpemUpOwotICBzd2l0Y2ggKHAtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl9zZWNkZWZfdHlwZToKLSAgICAgIHByaW50ZiAoInNlY3Rpb24gZGVmaW5pdGlvbiBhdCAleCBzaXplICV4XG4iLCAKLQkgICAgICBwLT51LmFzZWNkZWYuYWRkcmVzcywKLQkgICAgICBwLT51LmFzZWNkZWYuc2l6ZSk7Ci0gICAgICBubCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKLSAgICAgIHByaW50ZiAoInBvaW50ZXIgdG8iKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3R5cGUgKHAtPnUucG9pbnRlci5wb2ludHNfdG8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2FycmF5X3R5cGU6Ci0gICAgICBwcmludGYgKCJhcnJheSBbJWRdIG9mIiwgcC0+dS5hcnJheS5kaW0pOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5hcnJheS5hcnJheV9vZik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZnVuY3Rpb25fdHlwZToKLSAgICAgIHByaW50ZiAoImZ1bmN0aW9uIHJldHVybmluZyIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5mdW5jdGlvbi5mdW5jdGlvbl9yZXR1cm5zKTsKLSAgICAgIGR1bXBfY29mZl9saW5lcyAocC0+dS5mdW5jdGlvbi5saW5lcyk7Ci0gICAgICBwcmludGYgKCJhcmd1bWVudHMiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMpOwotICAgICAgdGFiICgwKTsKLSAgICAgIHByaW50ZiAoImNvZGUiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmZ1bmN0aW9uLmNvZGUpOwotICAgICAgdGFiKDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdGRlZl90eXBlOgotICAgICAgcHJpbnRmICgic3RydWN0dXJlIGRlZmluaXRpb24iKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdHJlZl90eXBlOgotICAgICAgaWYgKCFwLT51LmFlbnVtcmVmLnJlZikKLQlwcmludGYgKCJzdHJ1Y3R1cmUgcmVmIHRvIFVOS05PV04gc3RydWN0Iik7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgic3RydWN0dXJlIHJlZiB0byAlcyIsIHAtPnUuYWVudW1yZWYucmVmLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtcmVmX3R5cGU6Ci0gICAgICBwcmludGYgKCJlbnVtIHJlZiB0byAlcyIsIHAtPnUuYXN0cnVjdHJlZi5yZWYtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1kZWZfdHlwZToKLSAgICAgIHByaW50ZiAoImVudW0gZGVmaW5pdGlvbiIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuYWVudW1kZWYuZWxlbWVudHMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2Jhc2ljX3R5cGU6Ci0gICAgICBzd2l0Y2ggKHAtPnUuYmFzaWMpCi0JewotCWNhc2UgVF9OVUxMOgotCSAgcHJpbnRmICgiTlVMTCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1ZPSUQ6Ci0JICBwcmludGYgKCJWT0lEIik7Ci0JICBicmVhazsKLQljYXNlIFRfQ0hBUjoKLQkgIHByaW50ZiAoIkNIQVIiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9TSE9SVDoKLQkgIHByaW50ZiAoIlNIT1JUIik7Ci0JICBicmVhazsKLQljYXNlIFRfSU5UOgotCSAgcHJpbnRmICgiSU5UICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0xPTkc6Ci0JICBwcmludGYgKCJMT05HIik7Ci0JICBicmVhazsKLQljYXNlIFRfRkxPQVQ6Ci0JICBwcmludGYgKCJGTE9BVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0RPVUJMRToKLQkgIHByaW50ZiAoIkRPVUJMRSIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1NUUlVDVDoKLQkgIHByaW50ZiAoIlNUUlVDVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VOSU9OOgotCSAgcHJpbnRmICgiVU5JT04iKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9FTlVNOgotCSAgcHJpbnRmICgiRU5VTSIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX01PRToKLQkgIHByaW50ZiAoIk1PRSAiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VQ0hBUjoKLQkgIHByaW50ZiAoIlVDSEFSIik7Ci0JICBicmVhazsKLQljYXNlIFRfVVNIT1JUOgotCSAgcHJpbnRmICgiVVNIT1JUIik7Ci0JICBicmVhazsKLQljYXNlIFRfVUlOVDoKLQkgIHByaW50ZiAoIlVJTlQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VTE9ORzoKLQkgIHByaW50ZiAoIlVMT05HIik7Ci0JICBicmVhazsKLQljYXNlIFRfTE5HREJMOgotCSAgcHJpbnRmICgiTE5HREJMIik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLSAgbmwgKCk7Ci0gIHRhYiAoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3doZXJlIChwKQotICAgICBzdHJ1Y3QgY29mZl93aGVyZSAqcDsKLXsKLSAgdGFiICgxKTsKLSAgc3dpdGNoIChwLT53aGVyZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0YWNrOgotICAgICAgcHJpbnRmICgiU3RhY2sgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1vcnk6Ci0gICAgICBwcmludGYgKCJNZW1vcnkgc2VjdGlvbiAlcysleCIsIHAtPnNlY3Rpb24tPm5hbWUsIHAtPm9mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfcmVnaXN0ZXI6Ci0gICAgICBwcmludGYgKCJSZWdpc3RlciAlZCIsIHAtPm9mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDoKLSAgICAgIHByaW50ZiAoIlN0cnVjdCBNZW1iZXIgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bToKLSAgICAgIHByaW50ZiAoIkVudW0gTWVtYmVyIG9mZnNldCAleCIsIHAtPm9mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfdW5rbm93bjoKLSAgICAgIHByaW50ZiAoIlVuZGVmaW5lZCBzeW1ib2wiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9zdHJ0YWc6Ci0gICAgICBwcmludGYgKCJTVFJUQUciKTsKLSAgICBjYXNlIGNvZmZfd2hlcmVfZW50YWc6Ci0gICAgICBwcmludGYgKCJFTlRBRyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3R5cGVkZWY6Ci0gICAgICBwcmludGYgKCJUWVBFREVGIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBubCAoKTsKLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfdmlzaWJsZSAocCkKLSAgICAgc3RydWN0IGNvZmZfdmlzaWJsZSAqcDsKLXsKLSAgdGFiICgxKTsKLSAgc3dpdGNoIChwLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9kZWY6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19leHRfZGVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9yZWY6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19leHRfcmVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19pbnRfZGVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2NvbW1vbjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2NvbW1vbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfYXV0byIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvcGFyYW06Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19hdXRvcGFyYW0iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfcmVncGFyYW06Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19yZWdwYXJhbSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdpc3RlcjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX3JlZ2lzdGVyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3RhZzoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX3RhZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0OgotICAgICAgcHJpbnRmICgiY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bToKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX21lbWJlcl9vZl9lbnVtIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBubCAoKTsKLSAgdGFiICgtMSk7Ci19Ci0KLQotdm9pZAotZHVtcF9jb2ZmX3N5bWJvbCAocCkKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpwOwotewotICB0YWIgKDEpOwotICBwcmludGYgKCJMaXN0IG9mIHN5bWJvbHMiKTsKLSAgbmwgKCk7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiU3ltYm9sICAlcywgdGFnICVkLCBudW1iZXIgJWQiLCBwLT5uYW1lLCBwLT50YWcsIHAtPm51bWJlcik7Ci0gICAgICBubCAoKTsKLSAgICAgIHRhYiAoLTEpOwotICAgICAgdGFiICgxKTsKLSAgICAgIHByaW50ZiAoIlR5cGUiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3R5cGUgKHAtPnR5cGUpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiV2hlcmUiKTsKLSAgICAgIGR1bXBfY29mZl93aGVyZSAocC0+d2hlcmUpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiVmlzaWJsZSIpOwotICAgICAgZHVtcF9jb2ZmX3Zpc2libGUgKHAtPnZpc2libGUpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICAgIHRhYiAoLTEpOwotICAgIH0KLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfc2NvcGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpwOwotewotaWYgKHApIHsKLSAgdGFiICgxKTsKLSAgcHJpbnRmICgiTGlzdCBvZiBibG9ja3MgJWx4ICIsKHVuc2lnbmVkIGxvbmcpIHApOwotCi0gIGlmIChwLT5zZWMpIHsKLSAgICBwcmludGYoICIgICVzICV4Li4leCIsICBwLT5zZWMtPm5hbWUscC0+b2Zmc2V0LCBwLT5vZmZzZXQgKyBwLT5zaXplIC0xKTsKLSAgfQotICBubCAoKTsKLSAgdGFiICgwKTsKLSAgcHJpbnRmICgiKioqKioqKioqKioqKioqKioiKTsKLSAgbmwgKCk7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYiAoMCk7Ci0gICAgICBwcmludGYgKCJ2YXJzICVkIiwgcC0+bnZhcnMpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc3ltYm9sIChwLT52YXJzX2hlYWQpOwotICAgICAgcHJpbnRmICgiYmxvY2tzIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+bGlzdF9oZWFkKTsKLSAgICAgIG5sICgpOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotCi0gIHRhYiAoMCk7Ci0gIHByaW50ZiAoIioqKioqKioqKioqKioqKioqIik7Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9zZmlsZSAocCkKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoIkxpc3Qgb2Ygc291cmNlIGZpbGVzIik7Ci0gIG5sICgpOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICB0YWIgKDApOwotICAgICAgcHJpbnRmICgiU291cmNlIGZpbGUgJXMiLCBwLT5uYW1lKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT5zY29wZSk7Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0gIHRhYiAoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3NlY3Rpb24ocHRyKQotc3RydWN0IGNvZmZfc2VjdGlvbiAqcHRyOwotewotICBpbnQgaTsKLSAgdGFiKDEpOwotICBwcmludGYoInNlY3Rpb24gJXMgJWQgJWQgYWRkcmVzcyAleCBzaXplICV4IG51bWJlciAlZCBucmVsb2NzICVkIiwgCi0JIHB0ci0+bmFtZSwgcHRyLT5jb2RlLCBwdHItPmRhdGEsIHB0ci0+YWRkcmVzcyxwdHItPnNpemUsIHB0ci0+bnVtYmVyLCBwdHItPm5yZWxvY3MpOwotICBubCgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBwdHItPm5yZWxvY3M7IGkrKykgCi0gICAgewotICAgICAgdGFiKDApOyAgICAKLSAgICAgIHByaW50ZigiKCV4ICVzICV4KSIsCi0JICAgICBwdHItPnJlbG9jc1tpXS5vZmZzZXQsCi0JICAgICBwdHItPnJlbG9jc1tpXS5zeW1ib2wtPm5hbWUsCi0JICAgICBwdHItPnJlbG9jc1tpXS5hZGRlbmQpOwotICAgICAgbmwoKTsKLSAgICB9Ci0gIHRhYigtMSk7Ci0KLX0KLQotdm9pZAotY29mZl9kdW1wIChwdHIpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci17Ci0gIGludCBpOwotICBwcmludGYgKCJDb2ZmIGR1bXAiKTsKLSAgbmwgKCk7Ci0gIHByaW50ZiAoIiNzb3VjZXMgJWQiLCBwdHItPm5zb3VyY2VzKTsKLSAgbmwgKCk7Ci0gIGR1bXBfY29mZl9zZmlsZSAocHRyLT5zb3VyY2VfaGVhZCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwdHItPm5zZWN0aW9uczsgaSsrKQotICAgIGR1bXBfY29mZl9zZWN0aW9uKHB0ci0+c2VjdGlvbnMgKyBpKTsKLX0KLQotCi0KLWNoYXIgKiBwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsICJVc2FnZTogJXMgWy1oVl0gaW4tZmlsZVxuIiwgICBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqYXZbXTsKLXsKLSAgYmZkICphYmZkOwotICBzdHJ1Y3QgY29mZl9vZmlsZSAqdHJlZTsKLSAgY2hhciAqKm1hdGNoaW5nOwotICBjaGFyICppbnB1dF9maWxlID0gTlVMTDsKLSAgaW50IG9wdDsKLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotICAgIHsKLSAgICAgIHsgImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnIH0sCi0gICAgICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJyB9LAotICAgICAgeyBOVUxMLCBub19hcmd1bWVudCwgMCwgMCB9Ci0gICAgfTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiaFYiLCBsb25nX29wdGlvbnMsCi0JCQkgICAgIChpbnQgKikgTlVMTCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ1YnOgotCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKLQkgIGV4aXQgKDApOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICBpZiAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaW5wdXRfZmlsZSA9IGF2W29wdGluZF07Ci0gICAgfQotCi0gIGlmICghaW5wdXRfZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsXygiJXM6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICBhYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlLCAwKTsKLQotICBpZiAoIWFiZmQpCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHRyZWUgPSBjb2ZmX2dyb2sgKGFiZmQpOwotCi0gIGNvZmZfZHVtcCh0cmVlKTsKLSAgcHJpbnRmKCJcbiIpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvZmZncm9rLmMgYi9iaW51dGlscy9jb2ZmZ3Jvay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRlNmM5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvZmZncm9rLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzcgKzAsMCBAQAotLyogY29mZmdyb2suYwotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pCi0KLSAgIFRoaXMgbW9kdWxlIHJlYWRzIGEgY29mZiBmaWxlIGFuZCBidWlsZHMgYSByZWFsbHkgc2ltcGxlIHR5cGUgdHJlZQotICAgd2hpY2ggY2FuIGJlIHJlYWQgYnkgb3RoZXIgcHJvZ3JhbXMuICBUaGUgZmlyc3QgYXBwbGljYXRpb24gaXMgYQotICAgY29mZi0+c3lzcm9mZiBjb252ZXJ0ZXIuICBJdCBjYW4gYmUgdGVzdGVkIHdpdGggY29mZmR1bXAuYy4KLQotKi8KLQotI2luY2x1ZGUgPGJmZC5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZmdyb2suaCIKLWludCBsb2ZpbGUgPSAxOwotc3RhdGljIHN0cnVjdCBjb2ZmX3Njb3BlICp0b3Bfc2NvcGU7Ci1zdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKmZpbGVfc2NvcGU7Ci1zdGF0aWMgc3RydWN0IGNvZmZfb2ZpbGUgKm9maWxlOwotCi1zdHJ1Y3QgY29mZl9zeW1ib2wgKmxhc3RfZnVuY3Rpb25fc3ltYm9sOwotc3RydWN0IGNvZmZfdHlwZSAqbGFzdF9mdW5jdGlvbl90eXBlOwotc3RydWN0IGNvZmZfdHlwZSAqbGFzdF9zdHJ1Y3Q7Ci1zdHJ1Y3QgY29mZl90eXBlICpsYXN0X2VudW07Ci1zdHJ1Y3QgY29mZl9zZmlsZSAqY3VyX3NmaWxlOwotCi1zdGF0aWMgc3RydWN0IGNvZmZfc3ltYm9sICoqdGluZGV4OwotCi0KLXN0YXRpYyBhc3ltYm9sICoqc3ltczsKLXN0YXRpYyBsb25nIHN5bWNvdW50OwotCi0jZGVmaW5lIE4oeCkgKCh4KS0+X24uX25fbnB0clsxXSkKLQotc3RhdGljIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd3N5bXM7Ci1zdGF0aWMgaW50IHJhd2NvdW50Owotc3RhdGljIGJmZCAqYWJmZDsKLWV4dGVybiBjaGFyICp4Y2FsbG9jICgpOwotI2RlZmluZSBQVFJfU0laRSAJNAotI2RlZmluZSBTSE9SVF9TSVpFIAkyCi0jZGVmaW5lIElOVF9TSVpFIAk0Ci0jZGVmaW5lIExPTkdfU0laRSAJNAotI2RlZmluZSBGTE9BVF9TSVpFIAk0Ci0jZGVmaW5lIERPVUJMRV9TSVpFIAk4Ci0KLSNkZWZpbmUgSU5ERVhPRihwKSAgKChzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICopKHApLShyYXdzeW1zKSkKLQotc3RhdGljIHN0cnVjdCBjb2ZmX3Njb3BlICoKLWVtcHR5X3Njb3BlICgpCi17Ci0gIHN0cnVjdCBjb2ZmX3Njb3BlICpsOwotICBsID0gKHN0cnVjdCBjb2ZmX3Njb3BlICopICh4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3Njb3BlKSwgMSkpOwotICByZXR1cm4gbDsKLX0KLQotc3RhdGljIHN0cnVjdCBjb2ZmX3N5bWJvbCAqCi1lbXB0eV9zeW1ib2wgKCkKLXsKLSAgcmV0dXJuIChzdHJ1Y3QgY29mZl9zeW1ib2wgKikgKHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc3ltYm9sKSwgMSkpOwotfQotCi0vKmludCBsOyovCi1zdGF0aWMgdm9pZAotcHVzaF9zY29wZSAobGluaykKLSAgICAgaW50IGxpbms7Ci17Ci0gIHN0cnVjdCBjb2ZmX3Njb3BlICpuID0gZW1wdHlfc2NvcGUgKCk7Ci0gIGlmIChsaW5rKQotICAgIHsKLSAgICAgIGlmICh0b3Bfc2NvcGUpCi0JewotCSAgaWYgKHRvcF9zY29wZS0+bGlzdF90YWlsKQotCSAgICB7Ci0JICAgICAgdG9wX3Njb3BlLT5saXN0X3RhaWwtPm5leHQgPSBuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB0b3Bfc2NvcGUtPmxpc3RfaGVhZCA9IG47Ci0JICAgIH0KLQkgIHRvcF9zY29wZS0+bGlzdF90YWlsID0gbjsKLQl9Ci0gICAgfQotICBuLT5wYXJlbnQgPSB0b3Bfc2NvcGU7Ci0KLSAgdG9wX3Njb3BlID0gbjsKLX0KLQotc3RhdGljIHZvaWQKLXBvcF9zY29wZSAoKQotewotICB0b3Bfc2NvcGUgPSB0b3Bfc2NvcGUtPnBhcmVudDsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3NlY3Rpb25zX3AxIChoZWFkKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqaGVhZDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGludCBpZHg7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKmFsbCA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uICopICh4Y2FsbG9jIChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSwKLQkJCQkJICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb24pKSk7Ci0gIGhlYWQtPm5zZWN0aW9ucyA9IGFiZmQtPnNlY3Rpb25fY291bnQgKyAxOwotICBoZWFkLT5zZWN0aW9ucyA9IGFsbDsKLQotICBmb3IgKGlkeCA9IDAsIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQsIGlkeCsrKQotICAgIHsKLSAgICAgIGxvbmcgcmVsc2l6ZTsKLSAgICAgIGludCBpID0gc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgYXJlbGVudCAqKnJlbHBwOwotICAgICAgbG9uZyByZWxjb3VudDsKLQotICAgICAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHAsIHN5bXMpOwotICAgICAgaWYgKHJlbGNvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubmFtZSA9IChjaGFyICopIChzZWN0aW9uLT5uYW1lKTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmNvZGUgPSBzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uZGF0YSA9IHNlY3Rpb24tPmZsYWdzICYgU0VDX0RBVEE7Ci0gICAgICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmJzcyIpID09IDApCi0JaGVhZC0+c2VjdGlvbnNbaV0uZGF0YSA9IDE7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5hZGRyZXNzID0gc2VjdGlvbi0+bG1hOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uc2l6ZSA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLm51bWJlciA9IGlkeDsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLm5yZWxvY3MgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLnJlbG9jcyA9Ci0JKHN0cnVjdCBjb2ZmX3JlbG9jICopICh4Y2FsbG9jIChzZWN0aW9uLT5yZWxvY19jb3VudCwKLQkJCQkJc2l6ZW9mIChzdHJ1Y3QgY29mZl9yZWxvYykpKTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmJmZF9zZWN0aW9uID0gc2VjdGlvbjsKLSAgICB9Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLm5hbWUgPSAiQUJTT0xVVEUiOwotICBoZWFkLT5zZWN0aW9uc1swXS5jb2RlID0gMDsKLSAgaGVhZC0+c2VjdGlvbnNbMF0uZGF0YSA9IDA7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLmFkZHJlc3MgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5zaXplID0gMDsKLSAgaGVhZC0+c2VjdGlvbnNbMF0ubnVtYmVyID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3NlY3Rpb25zX3AyIChoZWFkKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqaGVhZDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBqKyspCi0JewotCSAgaW50IGlkeDsKLQkgIGludCBpID0gc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgc3RydWN0IGNvZmZfcmVsb2MgKnIgPSBoZWFkLT5zZWN0aW9uc1tpXS5yZWxvY3MgKyBqOwotCSAgYXJlbGVudCAqc3IgPSBzZWN0aW9uLT5yZWxvY2F0aW9uICsgajsKLQkgIHItPm9mZnNldCA9IHNyLT5hZGRyZXNzOwotCSAgci0+YWRkZW5kID0gc3ItPmFkZGVuZDsKLQkgIGlkeCA9ICgoY29mZl9zeW1ib2xfdHlwZSAqKSAoc3ItPnN5bV9wdHJfcHRyWzBdKSktPm5hdGl2ZSAtIHJhd3N5bXM7Ci0JICByLT5zeW1ib2wgPSB0aW5kZXhbaWR4XTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfd2hlcmUgKgotZG9fd2hlcmUgKGkpCi0gICAgIGludCBpOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgc3RydWN0IGNvZmZfd2hlcmUgKndoZXJlID0KLSAgICAoc3RydWN0IGNvZmZfd2hlcmUgKikgKHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfd2hlcmUpKSk7Ci0gIHdoZXJlLT5vZmZzZXQgPSBzeW0tPm5fdmFsdWU7Ci0KLSAgaWYgKHN5bS0+bl9zY251bSA9PSAtMSkKLSAgICBzeW0tPm5fc2NudW0gPSAwOwotCi0gIHN3aXRjaCAoc3ltLT5uX3NjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBDX0ZJRUxEOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OwotICAgICAgd2hlcmUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZSAvIDg7Ci0gICAgICB3aGVyZS0+Yml0b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlICUgODsKLSAgICAgIHdoZXJlLT5iaXRzaXplID0gcmF3c3ltc1tpICsgMV0udS5hdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfTU9FOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PVToKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19BVVRPOgotICAgIGNhc2UgQ19BUkc6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3N0YWNrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfU1RBVDoKLSAgICBjYXNlIENfRVhUREVGOgotICAgIGNhc2UgQ19MQUJFTDoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfbWVtb3J5OwotICAgICAgd2hlcmUtPnNlY3Rpb24gPSAmb2ZpbGUtPnNlY3Rpb25zW3N5bS0+bl9zY251bV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfUkVHOgotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9yZWdpc3RlcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19FTlRBRzoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfZW50YWc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfU1RSVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfc3RydGFnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX1RQREVGOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV90eXBlZGVmOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gd2hlcmU7Ci19Ci0KLXN0YXRpYwotc3RydWN0IGNvZmZfbGluZSAqCi1kb19saW5lcyAoaSwgbmFtZSkKLSAgICAgaW50IGk7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmUgKnJlcyA9IChzdHJ1Y3QgY29mZl9saW5lICopIHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfbGluZSksIDEpOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IGw7Ci0KLSAgLyogRmluZCBvdXQgaWYgdGhpcyBmdW5jdGlvbiBoYXMgYW55IGxpbmUgbnVtYmVycyBpbiB0aGUgdGFibGUgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAobCA9IDA7IGwgPCBzLT5saW5lbm9fY291bnQ7IGwrKykKLQl7Ci0JICBpZiAocy0+bGluZW5vW2xdLmxpbmVfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICBpZiAocmF3c3ltcyArIGkgPT0gKChjb2ZmX3N5bWJvbF90eXBlICopICgmKHMtPmxpbmVub1tsXS51LnN5bVswXSkpKS0+bmF0aXZlKQotCQl7Ci0JCSAgLyogVGhlc2UgbGluZXMgYXJlIGZvciB0aGlzIGZ1bmN0aW9uIC0gc28gY291bnQgdGhlbSBhbmQgc3RpY2sgdGhlbSBvbiAqLwotCQkgIGludCBjID0gMDsKLQkJICAvKiBGaW5kIHRoZSBsaW5lbnVtYmVyIG9mIHRoZSB0b3Agb2YgdGhlIGZ1bmN0aW9uLCBzaW5jZSBjb2ZmIGxpbmVudW1iZXJzCi0JCSAgICAgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICovCi0JCSAgaW50IHN0YXJ0X2xpbmUgPSByYXdzeW1zW2kgKyAzXS51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubzsKLQotCQkgIGwrKzsKLQkJICBmb3IgKGMgPSAwOyBzLT5saW5lbm9bbCArIGMgKyAxXS5saW5lX251bWJlcjsgYysrKQotCQkgICAgOwotCi0JCSAgLyogQWRkIHR3byBleHRyYSByZWNvcmRzLCBvbmUgZm9yIHRoZSBwcm9sb2d1ZSBhbmQgb25lIGZvciB0aGUgZXBpbG9ndWUgKi8KLQkJICBjICs9IDE7Ci0JCSAgcmVzLT5ubGluZXMgPSBjOwotCQkgIHJlcy0+bGluZXMgPSAoaW50ICopICh4Y2FsbG9jIChzaXplb2YgKGludCksIGMpKTsKLQkJICByZXMtPmFkZHJlc3NlcyA9IChpbnQgKikgKHhjYWxsb2MgKHNpemVvZiAoaW50KSwgYykpOwotCQkgIHJlcy0+bGluZXNbMF0gPSBzdGFydF9saW5lOwotCQkgIHJlcy0+YWRkcmVzc2VzWzBdID0gcmF3c3ltc1tpXS51LnN5bWVudC5uX3ZhbHVlIC0gcy0+dm1hOwotCQkgIGZvciAoYyA9IDA7IHMtPmxpbmVub1tsICsgYyArIDFdLmxpbmVfbnVtYmVyOyBjKyspCi0JCSAgICB7Ci0JCSAgICAgIHJlcy0+bGluZXNbYyArIDFdID0gcy0+bGluZW5vW2wgKyBjXS5saW5lX251bWJlciArIHN0YXJ0X2xpbmUgLSAxOwotCQkgICAgICByZXMtPmFkZHJlc3Nlc1tjICsgMV0gPSBzLT5saW5lbm9bbCArIGNdLnUub2Zmc2V0OwotCQkgICAgfQotCQkgIHJldHVybiByZXM7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYwotc3RydWN0IGNvZmZfdHlwZSAqCi1kb190eXBlIChpKQotICAgICBpbnQgaTsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4ID0gJnJhd3N5bXNbaSArIDFdLnUuYXV4ZW50OwotICBzdHJ1Y3QgY29mZl90eXBlICpyZXMgPQotICAgIChzdHJ1Y3QgY29mZl90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfdHlwZSkpOwotICBpbnQgdHlwZSA9IHN5bS0+bl90eXBlOwotICBpbnQgd2hpY2hfZHQgPSAwOwotICBpbnQgZGltaW5kID0gMDsKLQotICByZXMtPnR5cGUgPSBjb2ZmX2Jhc2ljX3R5cGU7Ci0gIHJlcy0+dS5iYXNpYyA9IHR5cGUgJiAweGY7Ci0KLSAgc3dpdGNoICh0eXBlICYgMHhmKQotICAgIHsKLSAgICBjYXNlIFRfTlVMTDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIGlmIChzeW0tPm5fbnVtYXV4ICYmIHN5bS0+bl9zY2xhc3MgPT0gQ19TVEFUKQotCXsKLQkgIC8qIFRoaXMgaXMgcHJvYmFibHkgYSBzZWN0aW9uIGRlZmluaXRpb24gKi8KLQkgIHJlcy0+dHlwZSA9IGNvZmZfc2VjZGVmX3R5cGU7Ci0JICByZXMtPnNpemUgPSBhdXgtPnhfc2NuLnhfc2NubGVuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAodHlwZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMsIGxldCdzIG1ha2UgaXQgYSBzaW1wbGUgaW50ICovCi0JICAgICAgcmVzLT5zaXplID0gSU5UX1NJWkU7Ci0JICAgICAgcmVzLT51LmJhc2ljID0gVF9VSU5UOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBFbHNlIGl0IGNvdWxkIGJlIGEgZnVuY3Rpb24gb3IgcG9pbnRlciB0byB2b2lkICovCi0JICAgICAgcmVzLT5zaXplID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VQ0hBUjoKLSAgICBjYXNlIFRfQ0hBUjoKLSAgICAgIHJlcy0+c2l6ZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfVVNIT1JUOgotICAgIGNhc2UgVF9TSE9SVDoKLSAgICAgIHJlcy0+c2l6ZSA9IFNIT1JUX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfVUlOVDoKLSAgICBjYXNlIFRfSU5UOgotICAgICAgcmVzLT5zaXplID0gSU5UX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfVUxPTkc6Ci0gICAgY2FzZSBUX0xPTkc6Ci0gICAgICByZXMtPnNpemUgPSBMT05HX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfRkxPQVQ6Ci0gICAgICByZXMtPnNpemUgPSBGTE9BVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX0RPVUJMRToKLSAgICAgIHJlcy0+c2l6ZSA9IERPVUJMRV9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICBjYXNlIFRfVU5JT046Ci0gICAgICBpZiAoc3ltLT5uX251bWF1eCkKLQl7Ci0JICBpZiAoYXV4LT54X3N5bS54X3RhZ25keC5wKQotCSAgICB7Ci0JICAgICAgLyogUmVmZXJpbmcgdG8gYSBzdHJ1Y3QgZGVmaW5lZCBlbHNld2hlcmUgKi8KLQkgICAgICByZXMtPnR5cGUgPSBjb2ZmX3N0cnVjdHJlZl90eXBlOwotCSAgICAgIHJlcy0+dS5hc3RydWN0cmVmLnJlZiA9IHRpbmRleFtJTkRFWE9GIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApXTsKLQkgICAgICByZXMtPnNpemUgPSByZXMtPnUuYXN0cnVjdHJlZi5yZWYgPwotCQlyZXMtPnUuYXN0cnVjdHJlZi5yZWYtPnR5cGUtPnNpemUgOiAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBBIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3QgKi8KLQkgICAgICBsYXN0X3N0cnVjdCA9IHJlczsKLQkgICAgICByZXMtPnR5cGUgPSBjb2ZmX3N0cnVjdGRlZl90eXBlOwotCSAgICAgIHJlcy0+dS5hc3RydWN0ZGVmLmVsZW1lbnRzID0gZW1wdHlfc2NvcGUgKCk7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RkZWYuaWR4ID0gMDsKLQkgICAgICByZXMtPnUuYXN0cnVjdGRlZi5pc3N0cnVjdCA9ICh0eXBlICYgMHhmKSA9PSBUX1NUUlVDVDsKLQkgICAgICByZXMtPnNpemUgPSBhdXgtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE5vIGF1eGVudHMgLSBpdCdzIGFub255bm1vdXMgKi8KLQkgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0cmVmX3R5cGU7Ci0JICByZXMtPnUuYXN0cnVjdHJlZi5yZWYgPSAwOwotCSAgcmVzLT5zaXplID0gMDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfRU5VTToKLSAgICAgIGlmIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApCi0JewotCSAgLyogUmVmZXJpbmcgdG8gYSBlbnVtIGRlZmluZWQgZWxzZXdoZXJlICovCi0JICByZXMtPnR5cGUgPSBjb2ZmX2VudW1yZWZfdHlwZTsKLQkgIHJlcy0+dS5hZW51bXJlZi5yZWYgPSB0aW5kZXhbSU5ERVhPRiAoYXV4LT54X3N5bS54X3RhZ25keC5wKV07Ci0JICByZXMtPnNpemUgPSByZXMtPnUuYWVudW1yZWYucmVmLT50eXBlLT5zaXplOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBIGRlZmluaXRpb24gb2YgYW4gZW51bSAqLwotCSAgbGFzdF9lbnVtID0gcmVzOwotCSAgcmVzLT50eXBlID0gY29mZl9lbnVtZGVmX3R5cGU7Ci0JICByZXMtPnUuYWVudW1kZWYuZWxlbWVudHMgPSBlbXB0eV9zY29wZSAoKTsKLQkgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX01PRToKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBmb3IgKHdoaWNoX2R0ID0gNTsgd2hpY2hfZHQgPj0gMDsgd2hpY2hfZHQtLSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCh0eXBlID4+ICgod2hpY2hfZHQgKiAyKSArIDQpKSAmIDB4MykKLQl7Ci0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JY2FzZSBEVF9BUlk6Ci0JICB7Ci0JICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnB0ciA9ICgoc3RydWN0IGNvZmZfdHlwZSAqKQotCQkJCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSkpOwotCSAgICBpbnQgZWxzID0gKGRpbWluZCA8IERJTU5VTQotCQkgICAgICAgPyBhdXgtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bZGltaW5kXQotCQkgICAgICAgOiAwKTsKLQkgICAgKytkaW1pbmQ7Ci0JICAgIHB0ci0+dHlwZSA9IGNvZmZfYXJyYXlfdHlwZTsKLQkgICAgcHRyLT5zaXplID0gZWxzICogcmVzLT5zaXplOwotCSAgICBwdHItPnUuYXJyYXkuZGltID0gZWxzOwotCSAgICBwdHItPnUuYXJyYXkuYXJyYXlfb2YgPSByZXM7Ci0JICAgIHJlcyA9IHB0cjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBEVF9QVFI6Ci0JICB7Ci0JICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnB0ciA9Ci0JICAgICAgKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7Ci0JICAgIHB0ci0+c2l6ZSA9IFBUUl9TSVpFOwotCSAgICBwdHItPnR5cGUgPSBjb2ZmX3BvaW50ZXJfdHlwZTsKLQkgICAgcHRyLT51LnBvaW50ZXIucG9pbnRzX3RvID0gcmVzOwotCSAgICByZXMgPSBwdHI7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgRFRfRkNOOgotCSAgewotCSAgICBzdHJ1Y3QgY29mZl90eXBlICpwdHIKLQkgICAgICA9IChzdHJ1Y3QgY29mZl90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfdHlwZSkpOwotCSAgICBwdHItPnNpemUgPSAwOwotCSAgICBwdHItPnR5cGUgPSBjb2ZmX2Z1bmN0aW9uX3R5cGU7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5mdW5jdGlvbl9yZXR1cm5zID0gcmVzOwotCSAgICBwdHItPnUuZnVuY3Rpb24ucGFyYW1ldGVycyA9IGVtcHR5X3Njb3BlICgpOwotCSAgICBwdHItPnUuZnVuY3Rpb24ubGluZXMgPSBkb19saW5lcyAoaSwgc3ltLT5fbi5fbl9ucHRyWzFdKTsKLQkgICAgcHRyLT51LmZ1bmN0aW9uLmNvZGUgPSAwOwotCSAgICBsYXN0X2Z1bmN0aW9uX3R5cGUgPSBwdHI7Ci0JICAgIHJlcyA9IHB0cjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHN0cnVjdCBjb2ZmX3Zpc2libGUgKgotZG9fdmlzaWJsZSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotICBzdHJ1Y3QgY29mZl92aXNpYmxlICp2aXNpYmxlID0KLSAgICAoc3RydWN0IGNvZmZfdmlzaWJsZSAqKSAoeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl92aXNpYmxlKSkpOwotICBlbnVtIGNvZmZfdmlzX3R5cGUgdDsKLSAgc3dpdGNoIChzeW0tPm5fc2NsYXNzKQotICAgIHsKLSAgICBjYXNlIENfTU9TOgotICAgIGNhc2UgQ19NT1U6Ci0gICAgY2FzZSBDX0ZJRUxEOgotICAgICAgdCA9IGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfTU9FOgotICAgICAgdCA9IGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICAgIHQgPSBjb2ZmX3Zpc19yZWdwYXJhbTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1JFRzoKLSAgICAgIHQgPSBjb2ZmX3Zpc19yZWdpc3RlcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB0ID0gY29mZl92aXNfdGFnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0FVVE9BUkc6Ci0gICAgY2FzZSBDX0FSRzoKLSAgICAgIHQgPSBjb2ZmX3Zpc19hdXRvcGFyYW07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfQVVUTzoKLQotCi0gICAgICB0ID0gY29mZl92aXNfYXV0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19MQUJFTDoKLSAgICBjYXNlIENfU1RBVDoKLSAgICAgIHQgPSBjb2ZmX3Zpc19pbnRfZGVmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0VYVDoKLSAgICAgIGlmIChzeW0tPm5fc2NudW0gPT0gTl9VTkRFRikKLQl7Ci0JICBpZiAoc3ltLT5uX3ZhbHVlKQotCSAgICB0ID0gY29mZl92aXNfY29tbW9uOwotCSAgZWxzZQotCSAgICB0ID0gY29mZl92aXNfZXh0X3JlZjsKLQl9Ci0gICAgICBlbHNlCi0JdCA9IGNvZmZfdmlzX2V4dF9kZWY7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgdmlzaWJsZS0+dHlwZSA9IHQ7Ci0gIHJldHVybiB2aXNpYmxlOwotfQotCi1zdGF0aWMgaW50Ci1kb19kZWZpbmUgKGksIGIpCi0gICAgIGludCBpOwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqYjsKLXsKLSAgc3RhdGljIGludCBzeW1ib2xfaW5kZXg7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotCi0gIC8qIERlZmluZSBhIHN5bWJvbCBhbmQgYXR0YWNoIHRvIGJsb2NrIGIgKi8KLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzID0gZW1wdHlfc3ltYm9sICgpOwotCi0gIHMtPm51bWJlciA9ICsrc3ltYm9sX2luZGV4OwotICBzLT5uYW1lID0gc3ltLT5fbi5fbl9ucHRyWzFdOwotICBzLT5zZmlsZSA9IGN1cl9zZmlsZTsKLSAgLyogR2x1ZSBvbnRvIHRoZSBvZmlsZSBsaXN0ICovCi0gIGlmIChsb2ZpbGUgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAob2ZpbGUtPnN5bWJvbF9saXN0X3RhaWwpCi0Jb2ZpbGUtPnN5bWJvbF9saXN0X3RhaWwtPm5leHRfaW5fb2ZpbGVfbGlzdCA9IHM7Ci0gICAgICBlbHNlCi0Jb2ZpbGUtPnN5bWJvbF9saXN0X2hlYWQgPSBzOwotICAgICAgb2ZpbGUtPnN5bWJvbF9saXN0X3RhaWwgPSBzOwotICAgICAgLyogQW5kIHRoZSBibG9jayBsaXN0ICovCi0gICAgfQotICBpZiAoYi0+dmFyc190YWlsKQotICAgIGItPnZhcnNfdGFpbC0+bmV4dCA9IHM7Ci0gIGVsc2UKLSAgICBiLT52YXJzX2hlYWQgPSBzOwotCi0gIGItPnZhcnNfdGFpbCA9IHM7Ci0gIGItPm52YXJzKys7Ci0gIHMtPnR5cGUgPSBkb190eXBlIChpKTsKLSAgcy0+d2hlcmUgPSBkb193aGVyZSAoaSk7Ci0gIHMtPnZpc2libGUgPSBkb192aXNpYmxlIChpKTsKLQotICB0aW5kZXhbaV0gPSBzOwotCi0gIC8qIFdlIHJlbWVtYmVyIHRoZSBsb3dlc3QgYWRkcmVzcyBpbiBlYWNoIHNlY3Rpb24gZm9yIGVhY2ggc291cmNlIGZpbGUgKi8KLQotICBpZiAocy0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfbWVtb3J5Ci0gICAgICAmJiBzLT50eXBlLT50eXBlID09IGNvZmZfc2VjZGVmX3R5cGUpCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfaXNlY3Rpb24gKmlzID0gY3VyX3NmaWxlLT5zZWN0aW9uICsgcy0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQotICAgICAgaWYgKCFpcy0+aW5pdCkKLQl7Ci0JICBpcy0+bG93ID0gcy0+d2hlcmUtPm9mZnNldDsKLQkgIGlzLT5oaWdoID0gcy0+d2hlcmUtPm9mZnNldCArIHMtPnR5cGUtPnNpemU7Ci0JICBpcy0+aW5pdCA9IDE7Ci0JICBpcy0+cGFyZW50ID0gcy0+d2hlcmUtPnNlY3Rpb247Ci0JfQotCi0gICAgfQotCi0gIGlmIChzLT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLSAgICBsYXN0X2Z1bmN0aW9uX3N5bWJvbCA9IHM7Ci0KLSAgcmV0dXJuIGkgKyBzeW0tPm5fbnVtYXV4ICsgMTsKLX0KLQotCi1zdGF0aWMKLXN0cnVjdCBjb2ZmX29maWxlICoKLWRvaXQgKCkKLXsKLSAgaW50IGk7Ci0gIGludCBpbmZpbGUgPSAwOwotICBzdHJ1Y3QgY29mZl9vZmlsZSAqaGVhZCA9Ci0gIChzdHJ1Y3QgY29mZl9vZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX29maWxlKSk7Ci0gIG9maWxlID0gaGVhZDsKLSAgaGVhZC0+c291cmNlX2hlYWQgPSAwOwotICBoZWFkLT5zb3VyY2VfdGFpbCA9IDA7Ci0gIGhlYWQtPm5zb3VyY2VzID0gMDsKLSAgaGVhZC0+c3ltYm9sX2xpc3RfdGFpbCA9IDA7Ci0gIGhlYWQtPnN5bWJvbF9saXN0X2hlYWQgPSAwOwotICBkb19zZWN0aW9uc19wMSAoaGVhZCk7Ci0gIHB1c2hfc2NvcGUgKDEpOwotCi0gIGZvciAoaSA9IDA7IGkgPCByYXdjb3VudDspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0gICAgICBzd2l0Y2ggKHN5bS0+bl9zY2xhc3MpCi0JewotCWNhc2UgQ19GSUxFOgotCSAgewotCSAgICAvKiBuZXcgc291cmNlIGZpbGUgYW5ub3VuY2VkICovCi0JICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpuID0KLQkgICAgICAoc3RydWN0IGNvZmZfc2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZmlsZSkpOwotCSAgICBuLT5zZWN0aW9uID0gKHN0cnVjdCBjb2ZmX2lzZWN0aW9uICopIHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfaXNlY3Rpb24pLCBhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSk7Ci0JICAgIGN1cl9zZmlsZSA9IG47Ci0JICAgIG4tPm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07Ci0JICAgIG4tPm5leHQgPSAwOwotCi0JICAgIGlmIChpbmZpbGUpCi0JICAgICAgewotCQlwb3Bfc2NvcGUgKCk7Ci0JICAgICAgfQotCSAgICBpbmZpbGUgPSAxOwotCSAgICBwdXNoX3Njb3BlICgxKTsKLQkgICAgZmlsZV9zY29wZSA9IG4tPnNjb3BlID0gdG9wX3Njb3BlOwotCi0JICAgIGlmIChoZWFkLT5zb3VyY2VfdGFpbCkKLQkgICAgICBoZWFkLT5zb3VyY2VfdGFpbC0+bmV4dCA9IG47Ci0JICAgIGVsc2UKLQkgICAgICBoZWFkLT5zb3VyY2VfaGVhZCA9IG47Ci0JICAgIGhlYWQtPnNvdXJjZV90YWlsID0gbjsKLQkgICAgaGVhZC0+bnNvdXJjZXMrKzsKLQkgICAgaSArPSBzeW0tPm5fbnVtYXV4ICsgMTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ19GQ046Ci0JICB7Ci0JICAgIGNoYXIgKm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07Ci0JICAgIGlmIChuYW1lWzFdID09ICdiJykKLQkgICAgICB7Ci0JCS8qIEZ1bmN0aW9uIHN0YXJ0ICovCi0JCXB1c2hfc2NvcGUgKDApOwotCQlsYXN0X2Z1bmN0aW9uX3R5cGUtPnUuZnVuY3Rpb24uY29kZSA9IHRvcF9zY29wZTsKLQkJdG9wX3Njb3BlLT5zZWMgPSBvZmlsZS0+c2VjdGlvbnMgKyBzeW0tPm5fc2NudW07Ci0JCXRvcF9zY29wZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdG9wX3Njb3BlLT5zaXplID0gc3ltLT5uX3ZhbHVlIC0gdG9wX3Njb3BlLT5vZmZzZXQgKyAxOwotCQlwb3Bfc2NvcGUgKCk7Ci0KLQkgICAgICB9Ci0JICAgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ19CTE9DSzoKLQkgIHsKLQkgICAgY2hhciAqbmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLQkgICAgaWYgKG5hbWVbMV0gPT0gJ2InKQotCSAgICAgIHsKLQkJLyogQmxvY2sgc3RhcnQgKi8KLQkJcHVzaF9zY29wZSAoMSk7Ci0JCXRvcF9zY29wZS0+c2VjID0gb2ZpbGUtPnNlY3Rpb25zICsgc3ltLT5uX3NjbnVtOwotCQl0b3Bfc2NvcGUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZTsKLQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdG9wX3Njb3BlLT5zaXplID0gc3ltLT5uX3ZhbHVlIC0gdG9wX3Njb3BlLT5vZmZzZXQgKyAxOwotCQlwb3Bfc2NvcGUgKCk7Ci0JICAgICAgfQotCSAgICBpICs9IHN5bS0+bl9udW1hdXggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDX1JFR1BBUk06Ci0JY2FzZSBDX0FSRzoKLQkgIGkgPSBkb19kZWZpbmUgKGksIGxhc3RfZnVuY3Rpb25fc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDX01PUzoKLQljYXNlIENfTU9VOgotCWNhc2UgQ19GSUVMRDoKLQkgIGkgPSBkb19kZWZpbmUgKGksIGxhc3Rfc3RydWN0LT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDX01PRToKLQkgIGkgPSBkb19kZWZpbmUgKGksIGxhc3RfZW51bS0+dS5hZW51bWRlZi5lbGVtZW50cyk7Ci0JICBicmVhazsKLQljYXNlIENfU1RSVEFHOgotCWNhc2UgQ19FTlRBRzoKLQljYXNlIENfVU5UQUc6Ci0JICAvKiBWYXJpb3VzIGRlZmluaXRpb24gKi8KLQkgIGkgPSBkb19kZWZpbmUgKGksIHRvcF9zY29wZSk7Ci0JICBicmVhazsKLQljYXNlIENfRVhUOgotCWNhc2UgQ19MQUJFTDoKLQkgIGkgPSBkb19kZWZpbmUgKGksIGZpbGVfc2NvcGUpOwotCSAgYnJlYWs7Ci0JY2FzZSBDX1NUQVQ6Ci0JY2FzZSBDX1RQREVGOgotCWNhc2UgQ19BVVRPOgotCWNhc2UgQ19SRUc6Ci0JICBpID0gZG9fZGVmaW5lIChpLCB0b3Bfc2NvcGUpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgQ19FT1M6Ci0JICBpICs9IHN5bS0+bl9udW1hdXggKyAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZG9fc2VjdGlvbnNfcDIgKGhlYWQpOwotICByZXR1cm4gaGVhZDsKLX0KLQotc3RydWN0IGNvZmZfb2ZpbGUgKgotY29mZl9ncm9rIChpbmFiZmQpCi0gICAgIGJmZCAqaW5hYmZkOwotewotICBsb25nIHN0b3JhZ2U7Ci0gIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICBhYmZkID0gaW5hYmZkOwotICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotCi0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICBiZmRfZmF0YWwgKGFiZmQtPmZpbGVuYW1lKTsKLQotICBzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2UpOwotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1zKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGFiZmQtPmZpbGVuYW1lKTsKLSAgcmF3c3ltcyA9IG9ial9yYXdfc3ltZW50cyAoYWJmZCk7Ci0gIHJhd2NvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOzsKLSAgdGluZGV4ID0gKHN0cnVjdCBjb2ZmX3N5bWJvbCAqKikgKHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc3ltYm9sICopLCByYXdjb3VudCkpOwotCi0gIHAgPSBkb2l0ICgpOwotICByZXR1cm4gcDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvZmZncm9rLmggYi9iaW51dGlscy9jb2ZmZ3Jvay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFkZTQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvZmZncm9rLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotI2RlZmluZSBUX05VTEwJCTAKLSNkZWZpbmUgVF9WT0lECQkxCS8qIGZ1bmN0aW9uIGFyZ3VtZW50IChvbmx5IHVzZWQgYnkgY29tcGlsZXIpICovCi0jZGVmaW5lIFRfQ0hBUgkJMgkvKiBjaGFyYWN0ZXIJCSovCi0jZGVmaW5lIFRfU0hPUlQJCTMJLyogc2hvcnQgaW50ZWdlcgkqLwotI2RlZmluZSBUX0lOVAkJNAkvKiBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0xPTkcJCTUJLyogbG9uZyBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0ZMT0FUCQk2CS8qIGZsb2F0aW5nIHBvaW50CSovCi0jZGVmaW5lIFRfRE9VQkxFCTcJLyogZG91YmxlIHdvcmQJCSovCi0jZGVmaW5lIFRfU1RSVUNUCTgJLyogc3RydWN0dXJlIAkJKi8KLSNkZWZpbmUgVF9VTklPTgkJOQkvKiB1bmlvbiAJCSovCi0jZGVmaW5lIFRfRU5VTQkJMTAJLyogZW51bWVyYXRpb24gCQkqLwotI2RlZmluZSBUX01PRQkJMTEJLyogbWVtYmVyIG9mIGVudW1lcmF0aW9uKi8KLSNkZWZpbmUgVF9VQ0hBUgkJMTIJLyogdW5zaWduZWQgY2hhcmFjdGVyCSovCi0jZGVmaW5lIFRfVVNIT1JUCTEzCS8qIHVuc2lnbmVkIHNob3J0CSovCi0jZGVmaW5lIFRfVUlOVAkJMTQJLyogdW5zaWduZWQgaW50ZWdlcgkqLwotI2RlZmluZSBUX1VMT05HCQkxNQkvKiB1bnNpZ25lZCBsb25nCSovCi0jZGVmaW5lIFRfTE5HREJMCTE2CS8qIGxvbmcgZG91YmxlCQkqLwotCi0KLSBzdHJ1Y3QgY29mZl9yZWxvYwotIHsKLSAgIGludCBvZmZzZXQ7Ci0gICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgIGludCBhZGRlbmQ7Ci0gfTsKLQotIHN0cnVjdCBjb2ZmX3NlY3Rpb24gCi0gewotICAgY2hhciAqbmFtZTsKLSAgIGludCBjb2RlOwotICAgaW50IGRhdGE7Ci0gICBpbnQgYWRkcmVzczsKLSAgIGludCBudW1iZXI7ICAvKiAwLi5uLCAudGV4dCA9IDAgKi8KLSAgIGludCBucmVsb2NzOwotICAgaW50IHNpemU7Ci0gICBzdHJ1Y3QgY29mZl9yZWxvYyAqcmVsb2NzOwotICAgc3RydWN0IHNlYyAqYmZkX3NlY3Rpb247Ci0gfTsKLQotc3RydWN0IGNvZmZfb2ZpbGUKLXsKLSAgaW50IG5zb3VyY2VzOwotICBzdHJ1Y3QgY29mZl9zZmlsZSAqc291cmNlX2hlYWQ7Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpzb3VyY2VfdGFpbDsKLSAgaW50IG5zZWN0aW9uczsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbnM7Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sX2xpc3RfaGVhZDsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2xfbGlzdF90YWlsOwotfTsKLQotc3RydWN0IGNvZmZfaXNlY3Rpb24gewotICBpbnQgbG93OwotICBpbnQgaGlnaDsKLSAgaW50IGluaXQ7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnBhcmVudDsKLX07Ci0KLXN0cnVjdCBjb2ZmX3NmaWxlCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBjb2ZmX3Njb3BlICpzY29wZTsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKm5leHQ7Ci0KLSAgLyogVmVjdG9yIHdoaWNoIG1hcHMgd2hlcmUgaW4gZWFjaCBvdXRwdXQgc2VjdGlvbgotICAgICB0aGUgaW5wdXQgZmlsZSBoYXMgaXQncyBkYXRhICovCi0gIHN0cnVjdCBjb2ZmX2lzZWN0aW9uICpzZWN0aW9uOyAKLQotfTsKLQotCi0gc3RydWN0IGNvZmZfdHlwZQotewotICBpbnQgc2l6ZTsKLSAgZW51bQotICAgIHsKLSAgICAgIGNvZmZfcG9pbnRlcl90eXBlLCBjb2ZmX2Z1bmN0aW9uX3R5cGUsIGNvZmZfYXJyYXlfdHlwZSwgY29mZl9zdHJ1Y3RkZWZfdHlwZSwgY29mZl9iYXNpY190eXBlLAotICAgICAgY29mZl9zdHJ1Y3RyZWZfdHlwZSwgY29mZl9lbnVtcmVmX3R5cGUsIGNvZmZfZW51bWRlZl90eXBlLCBjb2ZmX3NlY2RlZl90eXBlCi0gICAgICB9IHR5cGU7Ci0gIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0IAotCXsKLQlpbnQgYWRkcmVzczsKLQlpbnQgc2l6ZTsKLSAgICAgIH0gYXNlY2RlZjsKLQotICAgICAgc3RydWN0Ci0JewotCSAgaW50IGlzc3RydWN0OwotCSAgc3RydWN0IGNvZmZfc2NvcGUgKmVsZW1lbnRzOwotCSAgaW50IGlkeDsKLQl9Ci0gICAgICBhc3RydWN0ZGVmOwotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGNvZmZfc3ltYm9sICpyZWY7Ci0JfSBhc3RydWN0cmVmOwotCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl9zY29wZSAqZWxlbWVudHM7Ci0JICBpbnQgaWR4OwotCX0gYWVudW1kZWY7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnJlZjsKLQl9IGFlbnVtcmVmOwotCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl90eXBlICpwb2ludHNfdG87Ci0JfSBwb2ludGVyOwotICAgICAgc3RydWN0Ci0JewotCSAgaW50IGRpbTsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKmFycmF5X29mOwotCX0gYXJyYXk7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKmZ1bmN0aW9uX3JldHVybnM7Ci0JICBzdHJ1Y3QgY29mZl9zY29wZSAqcGFyYW1ldGVyczsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICpjb2RlOwotCSAgc3RydWN0IGNvZmZfbGluZSAqbGluZXM7Ci0JfSBmdW5jdGlvbjsKLSAgICAgIGludCBiYXNpYzsJCS8qIE9uZSBvZiBUX1ZPSUQuLiBUX1VJTlQgKi8KLSAgICB9ICB1OwotfTsKLQotCi0gc3RydWN0IGNvZmZfbGluZSAKLSB7Ci0gICBpbnQgbmxpbmVzOwotICAgaW50ICpsaW5lczsKLSAgIGludCAqYWRkcmVzc2VzOwotIH07Ci0KLQotIHN0cnVjdCBjb2ZmX3Njb3BlCi0gICB7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlYzsgLyogV2hhdCBzZWN0aW9uICovCi0gICAgIGludCBvZmZzZXQ7IC8qIHdoZXJlICovCi0gICAgIGludCBzaXplOyAvKiBIb3cgYmlnICovCi0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpwYXJlbnQ7CS8qIG9uZSB1cCAqLwotCi0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpuZXh0OwkvKm5leHQgYWxvbmcgKi8KLQotICAgICBpbnQgbnZhcnM7Ci0KLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICp2YXJzX2hlYWQ7CS8qIHN5bWJvbHMgKi8KLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICp2YXJzX3RhaWw7Ci0KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKmxpc3RfaGVhZDsJLyogY2hpbGRyZW4gKi8KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKmxpc3RfdGFpbDsKLQotICAgfTsKLQotCi0gc3RydWN0IGNvZmZfdmlzaWJsZQotICAgewotICAgICBlbnVtIGNvZmZfdmlzX3R5cGUKLSAgICAgICB7Ci0JIGNvZmZfdmlzX2V4dF9kZWYsCi0JIGNvZmZfdmlzX2V4dF9yZWYsCi0JIGNvZmZfdmlzX2ludF9kZWYsCi0JIGNvZmZfdmlzX2NvbW1vbiwKLQkgY29mZl92aXNfYXV0bywKLQkgY29mZl92aXNfcmVnaXN0ZXIsCi0JIGNvZmZfdmlzX3RhZywKLQkgY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdCwKLQkgY29mZl92aXNfbWVtYmVyX29mX2VudW0sCi0JIGNvZmZfdmlzX2F1dG9wYXJhbSwJCi0JIGNvZmZfdmlzX3JlZ3BhcmFtLAotICAgICAgIH0gdHlwZTsKLSAgIH07Ci0KLSBzdHJ1Y3QgY29mZl93aGVyZQotICAgewotICAgICBlbnVtCi0gICAgICAgewotCSBjb2ZmX3doZXJlX3N0YWNrLCBjb2ZmX3doZXJlX21lbW9yeSwgY29mZl93aGVyZV9yZWdpc3RlciwgY29mZl93aGVyZV91bmtub3duLAotCSBjb2ZmX3doZXJlX3N0cnRhZywgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0LAotCSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtLCBjb2ZmX3doZXJlX2VudGFnLCBjb2ZmX3doZXJlX3R5cGVkZWYKLQotICAgICAgIH0gd2hlcmU7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBiaXRvZmZzZXQ7Ci0gICAgIGludCBiaXRzaXplOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgfTsKLQotIHN0cnVjdCBjb2ZmX3N5bWJvbAotICAgewotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgdGFnOwotICAgICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOwotICAgICBzdHJ1Y3QgY29mZl93aGVyZSAqd2hlcmU7Ci0gICAgIHN0cnVjdCBjb2ZmX3Zpc2libGUgKnZpc2libGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqbmV4dDsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpuZXh0X2luX29maWxlX2xpc3Q7IC8qIEZvciB0aGUgb2ZpbGUgbGlzdCAqLwotICAgICBpbnQgbnVtYmVyOwotICAgICBpbnQgZXJfbnVtYmVyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gIH07Ci0KLXN0cnVjdCBjb2ZmX29maWxlICpjb2ZmX2dyb2soKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZy5pbiBiL2JpbnV0aWxzL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNmM1Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1dBSVRfSAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1dGltZXMgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVVRJTUVTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19GSUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRG9lcyB0aGUgcGxhdGZvcm0gdXNlIGFuIGV4ZWN1dGFibGUgc3VmZml4PyAqLwotI3VuZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLQotLyogU3VmZml4IHVzZWQgZm9yIGV4ZWN1dGFibGVzLCBpZiBhbnkuICovCi0jdW5kZWYgRVhFQ1VUQUJMRV9TVUZGSVgKLQotLyogSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHRpbWUuaD4/ICovCi0jdW5kZWYgSEFWRV9USU1FX1RfSU5fVElNRV9ICi0KLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4/ICovCi0jdW5kZWYgSEFWRV9USU1FX1RfSU5fVFlQRVNfSAotCi0vKiBEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/ICovCi0jdW5kZWYgSEFWRV9HT09EX1VUSU1FX0gKLQotLyogRGVmaW5lIGlmIGZwcmludGYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0KLS8qIERlZmluZSBpZiBnZXRlbnYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLQotLyogRGVmaW5lIGlmIGVudmlyb24gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBDb25maWd1cmVkIHRhcmdldCBuYW1lLiAqLwotI3VuZGVmIFRBUkdFVAotCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUgYi9iaW51dGlscy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljMmUwM2QuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNTY3NiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1hci5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYwNTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MjY6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0NDogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Nzk6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzMyOiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4OTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0KLVBBQ0tBR0U9YmludXRpbHMKLQotVkVSU0lPTj0yLjkuNQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzNTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFDTE9DQUw9YWNsb2NhbAotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDg6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9DT05GPWF1dG9jb25mCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9DT05GPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvY29uZiIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODYxOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODc0OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgTUFLRUlORk89bWFrZWluZm8KLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgTUFLRUlORk89IiRtaXNzaW5nX2Rpci9taXNzaW5nIG1ha2VpbmZvIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIG9yIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9mYXN0X2luc3RhbGwiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk3MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAwMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAzMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMTY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDExMjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNTg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTYzOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTcyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTE6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjM0OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNTg6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI2MTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyOTc6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMTM6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzUxOiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE4OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MTY6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MjU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyODogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTU0OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNTk2ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTk3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MTg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjMwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY1MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2ODU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzUyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLQotCi0KLQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotaWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTk4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDMwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMDQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDcyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3NzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA4NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTA1OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLWZvciBhY19wcm9nIGluICdiaXNvbiAteScgYnlhY2MKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBhY19jdl9wcm9nX1lBQ0M9IiRZQUNDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ZQUNDPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotWUFDQz0iJGFjX2N2X3Byb2dfWUFDQyIKLWlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFlBQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkWUFDQyIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRZQUNDIiB8fCBZQUNDPSJ5YWNjIgotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3MzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTg4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTk0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjExOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjI4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1mb3IgYWNfcHJvZyBpbiBmbGV4IGxleAotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRMRVgiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkTEVYIiB8fCBMRVg9IiIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IiIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyOTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSJmbGV4IgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MRVgiICYmIGFjX2N2X3Byb2dfTEVYPSJsZXgiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkTEVYTElCIgotdGhlbgotICBjYXNlICIkTEVYIiBpbgotICBmbGV4KikgYWNfbGliPWZsIDs7Ci0gICopIGFjX2xpYj1sIDs7Ci0gIGVzYWMKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMjU6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWwkYWNfbGliICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciB5eXdyYXAoKTsKLQotaW50IG1haW4oKSB7Ci15eXdyYXAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExFWExJQj0iLWwkYWNfbGliIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY3OiBjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfcm9vdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlIG1pbmltYWwgbGV4IHByb2dyYW0gaXMganVzdCBhIHNpbmdsZSBsaW5lOiAlJS4gIEJ1dCBzb21lIGJyb2tlbiBsZXhlcwotIyAoU29sYXJpcywgSSB0aGluayBpdCB3YXMpIHdhbnQgdHdvICUlIGxpbmVzLCBzbyBhY2NvbW1vZGF0ZSB0aGVtLgotZWNobyAnJSUKLSUlJyB8ICRMRVgKLWlmIHRlc3QgLWYgbGV4Lnl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKLWVsaWYgdGVzdCAtZiBsZXh5eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4eXkKLWVsc2UKLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW5ub3QgZmluZCBvdXRwdXQgZnJvbSAkTEVYOyBnaXZpbmcgdXAiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfcm9vdCIgMT4mNgotTEVYX09VVFBVVF9ST09UPSRhY19jdl9wcm9nX2xleF9yb290Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM4ODogY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgUE9TSVggc2F5cyBsZXggY2FuIGRlY2xhcmUgeXl0ZXh0IGVpdGhlciBhcyBhIHBvaW50ZXIgb3IgYW4gYXJyYXk7IHRoZQotIyBkZWZhdWx0IGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKLSMgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSB0aGUgJXBvaW50ZXIgYW5kICVhcnJheSBkZWNsYXJhdGlvbnMuCi1hY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj1ubwotZWNobyAnZXh0ZXJuIGNoYXIgKnl5dGV4dDsnID4+JExFWF9PVVRQVVRfUk9PVC5jCi1hY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iJExJQlMgJExFWExJQiIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotYGNhdCAkTEVYX09VVFBVVF9ST09ULmNgCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi1ybSAtZiAiJHtMRVhfT1VUUFVUX1JPT1R9LmMiCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBZWVRFWFRfUE9JTlRFUiAxCi1FT0YKLQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDMxOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDUyOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDU3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDY1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0ODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1MzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU1NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTYxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYzMTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY0NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NzE6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcwNDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzM5OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzUxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc3MjogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzc3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODM3OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg0MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg5NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTIyOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5NzQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTg0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMTM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA2NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNDI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjUyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI4MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI4NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzM5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwMTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MzQ6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ1NDogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDczOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM0ODM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTAwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUyODogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTYzOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1NjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYwMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYzNzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY0MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjkyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzYwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODcwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTYwOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTg4OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM5OTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA2MTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwODQ6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMTc6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDEyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMjk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE0ODogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLWlmIHRlc3QgLW4gIiRFWEVFWFQiOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0VYRUNVVEFCTEVfU1VGRklYIDEKLUVPRgotCi1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgRVhFQ1VUQUJMRV9TVUZGSVggIiR7RVhFRVhUfSIKLUVPRgotCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotSERFRklORVM9Ci0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLUFSPSR7QVItYXJ9Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIwMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI0MDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotCi0jIEFsc28gc2V0IEVYRUVYVF9GT1JfQlVJTEQuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBFWEVFWFRfRk9SX0JVSUxEPSckKEVYRUVYVCknCi1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzMDc6IGNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9idWlsZF9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgICAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC5jCi0gICAgIGJmZF9jdl9idWlsZF9leGVleHQ9Ci0gICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBjb25mdGVzdCBjb25mdGVzdC5jIDE+JjUgMj4mNQotICAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAgKikgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICAgZXNhYwotICAgICBkb25lCi0gICAgIHJtIC1mIGNvbmZ0ZXN0KgotICAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm8KLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2J1aWxkX2V4ZWV4dCIgMT4mNgotICBFWEVFWFRfRk9SX0JVSUxEPSIiCi0gIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9Ci1maQotCi0KLURFTUFOR0xFUl9OQU1FPWMrK2ZpbHQKLWNhc2UgIiR7aG9zdH0iIGluCi0gICotKi1nbzMyKiB8ICotKi1tc2RvcyopCi0gICAgREVNQU5HTEVSX05BTUU9Y3h4ZmlsdAotZXNhYwotCi0KLWZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oIGZjbnRsLmggc3lzL2ZpbGUuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNDI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzUyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNzk6IGNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHN0YXRfdmFsKSAoKHVuc2lnbmVkKShzdGF0X3ZhbCkgPj4gOCkKLSNlbmRpZgotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHN0YXRfdmFsKSAoKChzdGF0X3ZhbCkgJiAyNTUpID09IDApCi0jZW5kaWYKLWludCBtYWluKCkgewotaW50IHM7Ci13YWl0ICgmcyk7Ci1zID0gV0lGRVhJVEVEIChzKSA/IFdFWElUU1RBVFVTIChzKSA6IDE7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQyMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQzNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0NTY6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ2MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDUyMTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1MjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTUxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTU2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1Nzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYwNjogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2MTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDYzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIHNicmsgdXRpbWVzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjU3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjYyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBTb21lIHN5c3RlbXMgaGF2ZSBmcmV4cCBvbmx5IGluIC1sbSwgbm90IGluIC1sYy4KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBmcmV4cCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDcxMzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBmcmV4cCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc2VhcmNoX2ZyZXhwJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSIkTElCUyIKLWFjX2N2X3NlYXJjaF9mcmV4cD0ibm8iCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzIwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZnJleHAoKTsKLQotaW50IG1haW4oKSB7Ci1mcmV4cCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDczMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfc2VhcmNoX2ZyZXhwPSJub25lIHJlcXVpcmVkIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLXRlc3QgIiRhY19jdl9zZWFyY2hfZnJleHAiID0gIm5vIiAmJiBmb3IgaSBpbiAtbG07IGRvCi1MSUJTPSItbCRpICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc0MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGZyZXhwKCk7Ci0KLWludCBtYWluKCkgewotZnJleHAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3NTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3NlYXJjaF9mcmV4cD0iLWwkaSIKLWJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotTElCUz0iJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiAhPSAibm8iOyB0aGVuCi0gIHRlc3QgIiRhY19jdl9zZWFyY2hfZnJleHAiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfZnJleHAgJExJQlMiCi0gIAotZWxzZSA6Ci0gIAotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiB0aW1lLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3NzU6IGNoZWNraW5nIGZvciB0aW1lX3QgaW4gdGltZS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydidV9jdl9kZWNsX3RpbWVfdF90aW1lX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDx0aW1lLmg+Ci1pbnQgbWFpbigpIHsKLXRpbWVfdCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3ODc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2giIDE+JjYKLWlmIHRlc3QgJGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVElNRV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdGltZV90IGluIHN5cy90eXBlcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODA4OiBjaGVja2luZyBmb3IgdGltZV90IGluIHN5cy90eXBlcy5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDgxMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1pbnQgbWFpbigpIHsKLXRpbWVfdCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4MjA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2giIDE+JjYKLWlmIHRlc3QgJGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RZUEVTX0ggMQotRU9GCi0KLWZpCi0KLSMgVW5kZXIgTmV4dCAzLjIgPHV0aW1lLmg+IGFwcGFyZW50bHkgZG9lcyBub3QgZGVmaW5lIHN0cnVjdCB1dGltYnVmCi0jIGJ5IGRlZmF1bHQuCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdXRpbWUuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDg0MzogY2hlY2tpbmcgZm9yIHV0aW1lLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2J1X2N2X2hlYWRlcl91dGltZV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDg0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx1dGltZS5oPgotaW50IG1haW4oKSB7Ci1zdHJ1Y3QgdXRpbWJ1ZiBzOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4NTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9oZWFkZXJfdXRpbWVfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfaGVhZGVyX3V0aW1lX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYnVfY3ZfaGVhZGVyX3V0aW1lX2giIDE+JjYKLWlmIHRlc3QgJGJ1X2N2X2hlYWRlcl91dGltZV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dPT0RfVVRJTUVfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBmcHJpbnRmIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4ODA6IGNoZWNraW5nIHdoZXRoZXIgZnByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50Zicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4ODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZnByaW50ZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5MDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50Zj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50Zj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGYiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0ZQUklOVEYgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5Mjc6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5NTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDk3NDogY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zYnJrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDk3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzYnJrCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTAwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc2JyayIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU0JSSyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAyMTogY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZ2V0ZW52Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA0NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZW52aXJvbiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDY4OiBjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGVudmlyb24KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDk0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OIDEKLUVPRgotCi1maQotCi0KLQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKikKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9CSU5BUllfRk9QRU4gMQotRU9GCi0gOzsKLWVzYWMKLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIjsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1CVUlMRF9OTE1DT05WPQotTkxNQ09OVl9ERUZTPQotQlVJTERfU1JDT05WPQotQlVJTERfRExMVE9PTD0KLURMTFRPT0xfREVGUz0KLUJVSUxEX1dJTkRSRVM9Ci1CVUlMRF9ETExXUkFQPQotQlVJTERfTUlTQz0KLQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLQlCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScKLQlOTE1DT05WX0RFRlM9Ii1ETkxNQ09OVl9JMzg2IC1ETkxNQ09OVl9BTFBIQSAtRE5MTUNPTlZfUE9XRVJQQyAtRE5MTUNPTlZfU1BBUkMiCi0gICAgZWxzZQotCWNhc2UgJHRhcmcgaW4KLQlpWzM0NTZdODYqLSotbmV0d2FyZSopIAotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9JMzg2IgotCSAgOzsKLQlhbHBoYSotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfQUxQSEEiCi0JICA7OwotCXBvd2VycGMqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX1BPV0VSUEMiCi0JICA7OwotCXNwYXJjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9TUEFSQyIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQkqLSotaG1zKikgQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScgOzsKLQllc2FjCi0JY2FzZSAkdGFyZyBpbgotCWFybS0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JdGh1bWItKnBlKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCWlbMy02XTg2LSpwZSogfCBpWzMtNl04Ni0qLWN5Z3dpbiogfCBpWzMtNl04Ni0qLW1pbmd3MzIqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0kzODYiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICBCVUlMRF9ETExXUkFQPSckKERMTFdSQVBfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCWkzLTY4Ni0qLWludGVyaXgpCi0JICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRyknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0kzODYiCi0JICA7OwotCXBvd2VycGMqLSotKnBlKiB8IHBvd2VycGMqLSotY3lnd2luKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9QUEMiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCW1jb3JlLSpwZSkKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JbWNvcmUtKmVsZikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRV9FTEYiCi0JICA7OwotCWVzYWMKLSAgICBmaQotZG9uZQotCi0KLQotCi0KLQotCi0KLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVQgIiR7dGFyZ2V0fSIKLUVPRgotCi0KLXRhcmc9JHRhcmdldAotLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi1pZiB0ZXN0ICJ4JHRhcmdfdW5kZXJzY29yZSIgPSAieHllcyI7IHRoZW4KLSAgICBVTkRFUlNDT1JFPTEKLWVsc2UKLSAgICBVTkRFUlNDT1JFPTAKLWZpCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBDUFBAJSRDUFAlZwotcyVATEVYX09VVFBVVF9ST09UQCUkTEVYX09VVFBVVF9ST09UJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVARVhFRVhUX0ZPUl9CVUlMREAlJEVYRUVYVF9GT1JfQlVJTEQlZwotcyVAREVNQU5HTEVSX05BTUVAJSRERU1BTkdMRVJfTkFNRSVnCi1zJUBOTE1DT05WX0RFRlNAJSROTE1DT05WX0RFRlMlZwotcyVAQlVJTERfTkxNQ09OVkAlJEJVSUxEX05MTUNPTlYlZwotcyVAQlVJTERfU1JDT05WQCUkQlVJTERfU1JDT05WJWcKLXMlQEJVSUxEX0RMTFRPT0xAJSRCVUlMRF9ETExUT09MJWcKLXMlQERMTFRPT0xfREVGU0AlJERMTFRPT0xfREVGUyVnCi1zJUBCVUlMRF9XSU5EUkVTQCUkQlVJTERfV0lORFJFUyVnCi1zJUBCVUlMRF9ETExXUkFQQCUkQlVJTERfRExMV1JBUCVnCi1zJUBCVUlMRF9NSVNDQCUkQlVJTERfTUlTQyVnCi1zJUBVTkRFUlNDT1JFQCUkVU5ERVJTQ09SRSVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLQotY2FzZSAieCRDT05GSUdfRklMRVMiIGluCi0qKSBzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUgOzsKLWVzYWMKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5jb20gYi9iaW51dGlscy9jb25maWd1cmUuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTQ2M2Q1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5jb20KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0kIQotJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgYmludXRpbHMgZm9yIHVzZSB3aXRoIG9wZW5WTVMvQWxwaGEKLSQhIFdlIGRvIG5vdCB1c2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNpbmNlIHdlIGRvIG5vdCBoYXZlIC9iaW4vc2gKLSQhIHRvIGV4ZWN1dGUgaXQuCi0kIQotJCEgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotJCEKLSRhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkgICAgICAhIHZheD09MSwgYWxwaGE9PTIKLSRhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQhCi0kIQotJCEgR2VuZXJhdGUgY29uZmlnLmgKLSQhCi0kIGNyZWF0ZSBbXWNvbmZpZy5oCi0vKiBjb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovCi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDx0aW1lLmg+PyAgKi8KLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVElNRV9IIDEKLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4/ICAqLwotI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9UWVBFU19IIDEKLS8qIERvZXMgPHV0aW1lLmg+IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1Zj8gICovCi0jZGVmaW5lIEhBVkVfR09PRF9VVElNRV9IIDEKLS8qIFdoZXRoZXIgZnByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGlvLmg+IGlzIGluY2x1ZGVkLiAgKi8KLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIDEKLS8qIFdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHVuaXN0ZC5oPiBpcyBpbmNsdWRlZC4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0vKiBEbyB3ZSBuZWVkIHRvIHVzZSB0aGUgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAgKi8KLS8qICN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotLyogI3VuZGVmIEhBVkVfU0JSSyAxICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHV0aW1lcyBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfVVRJTUVTIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NZU19GSUxFX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgY29uZmlnLmgnIgotJCEKLSQhCi0kISBFZGl0IFZFUlNJT04gaW4gbWFrZWZpbGUudm1zLWluCi0kIQotJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCi0gICAgICAgIFtdbWFrZWZpbGUudm1zLWluIC9vdXRwdXQ9W11tYWtlZmlsZS52bXMKLSRERUNLCi0hCi0hIEdldCBWRVJTSU9OIGZyb20gY29uZmlndXJlLmluCi0hCi0gICBtZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJtZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihtZmlsZSksIEVORF9PRihtZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJpbnV0aWxzLCAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKLSAgIEVMU0U7Ci0gICAgIHZlcnMgOj0gInVua25vd24iOwotICAgRU5ESUY7Ci0KLSAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgIENPUFlfVEVYVCh2ZXJzKTsKLSAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7Ci0gICBRVUlUCi0kICBFT0QKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRlZCBgbWFrZWZpbGUudm1zJyIKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5pbiBiL2JpbnV0aWxzL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1ZWI3MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwKLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChhci5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UoYmludXRpbHMsIDIuOS41KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi0KLUFDX1BST0dfQ0MKLQotQUNfUFJPR19ZQUNDCi1BTV9QUk9HX0xFWAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi1pZiB0ZXN0IC1uICIkRVhFRVhUIjsgdGhlbgotICBBQ19ERUZJTkUoSEFWRV9FWEVDVVRBQkxFX1NVRkZJWCwgMSwKLQkgICAgW0RvZXMgdGhlIHBsYXRmb3JtIHVzZSBhbiBleGVjdXRhYmxlIHN1ZmZpeD9dKQotZmkKLUFDX0RFRklORV9VTlFVT1RFRChFWEVDVVRBQkxFX1NVRkZJWCwgIiR7RVhFRVhUfSIsCi0JCSAgIFtTdWZmaXggdXNlZCBmb3IgZXhlY3V0YWJsZXMsIGlmIGFueS5dKQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUhERUZJTkVTPQotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BUj0ke0FSLWFyfQotQUNfU1VCU1QoQVIpCi1BQ19QUk9HX1JBTkxJQgotQUNfUFJPR19JTlNUQUxMCi0KLUJGRF9DQ19GT1JfQlVJTEQKLQotREVNQU5HTEVSX05BTUU9YysrZmlsdAotY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLWdvMzIqIHwgKi0qLW1zZG9zKikKLSAgICBERU1BTkdMRVJfTkFNRT1jeHhmaWx0Ci1lc2FjCi1BQ19TVUJTVChERU1BTkdMRVJfTkFNRSkKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmggZmNudGwuaCBzeXMvZmlsZS5oKQotQUNfSEVBREVSX1NZU19XQUlUCi1BQ19GVU5DX0FMTE9DQQotQUNfQ0hFQ0tfRlVOQ1Moc2JyayB1dGltZXMpCi0KLSMgU29tZSBzeXN0ZW1zIGhhdmUgZnJleHAgb25seSBpbiAtbG0sIG5vdCBpbiAtbGMuCi1BQ19TRUFSQ0hfTElCUyhmcmV4cCwgLWxtKQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRpbWVfdCBpbiB0aW1lLmgpCi1BQ19DQUNIRV9WQUwoYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8dGltZS5oPl0sIFt0aW1lX3QgaTtdLAotYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPXllcywgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2gpCi1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2ggPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtIQVZFX1RJTUVfVF9JTl9USU1FX0hdLCAxLAotCSAgICBbSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHRpbWUuaD4/XSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgdGltZV90IGluIHN5cy90eXBlcy5oKQotQUNfQ0FDSEVfVkFMKGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2gsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLCBbdGltZV90IGk7XSwKLWJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9eWVzLCBidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oKQotaWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW0hBVkVfVElNRV9UX0lOX1RZUEVTX0hdLCAxLAotCSAgICBbSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPj9dKQotZmkKLQotIyBVbmRlciBOZXh0IDMuMiA8dXRpbWUuaD4gYXBwYXJlbnRseSBkb2VzIG5vdCBkZWZpbmUgc3RydWN0IHV0aW1idWYKLSMgYnkgZGVmYXVsdC4KLUFDX01TR19DSEVDS0lORyhbZm9yIHV0aW1lLmhdKQotQUNfQ0FDSEVfVkFMKGJ1X2N2X2hlYWRlcl91dGltZV9oLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx1dGltZS5oPl0sCi1bc3RydWN0IHV0aW1idWYgcztdLAotYnVfY3ZfaGVhZGVyX3V0aW1lX2g9eWVzLCBidV9jdl9oZWFkZXJfdXRpbWVfaD1ubyldKQotQUNfTVNHX1JFU1VMVCgkYnVfY3ZfaGVhZGVyX3V0aW1lX2gpCi1pZiB0ZXN0ICRidV9jdl9oZWFkZXJfdXRpbWVfaCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoSEFWRV9HT09EX1VUSU1FX0gsIDEsIFtEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/XSkKLWZpCi0KLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGZwcmludGYpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzYnJrKQotQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KQotQkZEX05FRURfREVDTEFSQVRJT04oZW52aXJvbikKLQotQkZEX0JJTkFSWV9GT1BFTgotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLQllbHNlCi0JICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgotCWZpCi0gICAgZG9uZQotZmkKLQotYWxsX3RhcmdldHM9ZmFsc2UKLUJVSUxEX05MTUNPTlY9Ci1OTE1DT05WX0RFRlM9Ci1CVUlMRF9TUkNPTlY9Ci1CVUlMRF9ETExUT09MPQotRExMVE9PTF9ERUZTPQotQlVJTERfV0lORFJFUz0KLUJVSUxEX0RMTFdSQVA9Ci1CVUlMRF9NSVNDPQotCi1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotCUJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQlCVUlMRF9TUkNPTlY9JyQoU1JDT05WX1BST0cpJwotCU5MTUNPTlZfREVGUz0iLUROTE1DT05WX0kzODYgLUROTE1DT05WX0FMUEhBIC1ETkxNQ09OVl9QT1dFUlBDIC1ETkxNQ09OVl9TUEFSQyIKLSAgICBlbHNlCi0JY2FzZSAkdGFyZyBpbgotY2hhbmdlcXVvdGUoLClkbmwKLQlpWzM0NTZdODYqLSotbmV0d2FyZSopIAotY2hhbmdlcXVvdGUoWyxdKWRubAotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9JMzg2IgotCSAgOzsKLQlhbHBoYSotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfQUxQSEEiCi0JICA7OwotCXBvd2VycGMqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX1BPV0VSUEMiCi0JICA7OwotCXNwYXJjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9TUEFSQyIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQkqLSotaG1zKikgQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScgOzsKLQllc2FjCi0JY2FzZSAkdGFyZyBpbgotCWFybS0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JdGh1bWItKnBlKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotY2hhbmdlcXVvdGUoLClkbmwKLQlpWzMtNl04Ni0qcGUqIHwgaVszLTZdODYtKi1jeWd3aW4qIHwgaVszLTZdODYtKi1taW5ndzMyKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9JMzg2IgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgQlVJTERfRExMV1JBUD0nJChETExXUkFQX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLQlpWzMtNl04Ni0qLWludGVyaXgpCi0JICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRyknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0kzODYiCi0JICA7OwotCXBvd2VycGMqLSotKnBlKiB8IHBvd2VycGMqLSotY3lnd2luKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9QUEMiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCW1jb3JlLSpwZSkKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JbWNvcmUtKmVsZikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRV9FTEYiCi0JICA7OwotCWVzYWMKLSAgICBmaQotZG9uZQotCi1BQ19TVUJTVChOTE1DT05WX0RFRlMpCi1BQ19TVUJTVChCVUlMRF9OTE1DT05WKQotQUNfU1VCU1QoQlVJTERfU1JDT05WKQotQUNfU1VCU1QoQlVJTERfRExMVE9PTCkKLUFDX1NVQlNUKERMTFRPT0xfREVGUykKLUFDX1NVQlNUKEJVSUxEX1dJTkRSRVMpCi1BQ19TVUJTVChCVUlMRF9ETExXUkFQKQotQUNfU1VCU1QoQlVJTERfTUlTQykKLQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVCwgIiR7dGFyZ2V0fSIsIFtDb25maWd1cmVkIHRhcmdldCBuYW1lLl0pCi0KLXRhcmc9JHRhcmdldAotLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi1pZiB0ZXN0ICJ4JHRhcmdfdW5kZXJzY29yZSIgPSAieHllcyI7IHRoZW4KLSAgICBVTkRFUlNDT1JFPTEKLWVsc2UKLSAgICBVTkRFUlNDT1JFPTAKLWZpCi1BQ19TVUJTVChVTkRFUlNDT1JFKQotCi1BQ19PVVRQVVQoTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVsKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotKikgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlIDs7Ci1lc2FjCi1dKQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY3h4ZmlsdC5tYW4gYi9iaW51dGlscy9jeHhmaWx0Lm1hbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNWQ0NS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jeHhmaWx0Lm1hbgorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggQFBST0dSQU1AIDEgIkp1bmUgMTk5MyIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLUBQUk9HUkFNQCBcLSBkZW1hbmdsZSBDKysgc3ltYm9scwotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgQFBST0dSQU1ACi0uUkIgIltcfCIgXC1fIHwgXC1cLXN0cmlwLXVuZGVyc2NvcmVzICJcfF0iCi0uUkIgIltcfCIgIlwtcyB7Z251LGx1Y2lkLGFybX0gIiB8ICIgXC1cLWZvcm1hdD17Z251LGx1Y2lkLGFybX0iICJcfF0iCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIHN5bWJvbCAiLi4uXHxdIgotLlNIIERFU0NSSVBUSU9OCi1UaGUgQysrIGxhbmd1YWdlIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucyB0aGF0IHlvdSBjYW4KLXdyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2ggdGFrZXMgcGFyYW1ldGVycwotb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgZnVuY3Rpb24gbmFtZXMgYXJlIGVuY29kZWQgaW50byBhCi1sb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcwotLkkgbWFuZ2xpbmdcYwotKS4gIFRoZSAKLS5CIEBQUk9HUkFNQAotcHJvZ3JhbSBkb2VzIHRoZSBpbnZlcnNlIG1hcHBpbmc6IGl0IGRlY29kZXMgKFxmSWRlbWFuZ2xlc1xmUikKLWxvdy1sZXZlbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBrZWVwCi10aGVzZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBmcm9tIGNsYXNoaW5nLgotLlBQCi1FdmVyeSBhbHBoYW51bWVyaWMgd29yZCAoY29uc2lzdGluZyBvZiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLAotZG9sbGFycywgb3IgcGVyaW9kcykgc2VlbiBpbiB0aGUgaW5wdXQgaXMgYSBwb3RlbnRpYWwgbGFiZWwuICBJZiB0aGUKLWxhYmVsIGRlY29kZXMgaW50byBhIEMrKyBuYW1lLCB0aGUgQysrIG5hbWUgcmVwbGFjZXMgdGhlIGxvdy1sZXZlbAotbmFtZSBpbiB0aGUgb3V0cHV0LgotLlBQCi1Zb3UgY2FuIHVzZQotLkIgQFBST0dSQU1ACi10byBkZWNpcGhlciBpbmRpdmlkdWFsIHN5bWJvbHMgYnkgc3BlY2lmeWluZyB0aGVzZSBzeW1ib2xzIG9uIHRoZQotY29tbWFuZCBsaW5lLgotLlBQCi1JZiBubwotLkIgc3ltYm9sCi1hcmd1bWVudHMgYXJlIGdpdmVuLAotLkIgQFBST0dSQU1ACi1yZWFkcyBzeW1ib2wgbmFtZXMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyB0aGUgZGVtYW5nbGVkCi1uYW1lcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgQWxsIHJlc3VsdHMgYXJlIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkCi1vdXRwdXQuCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLV8KLS5UUAotLkIgXC1cLXN0cmlwXC11bmRlcnNjb3JlcwotT24gc29tZSBzeXN0ZW1zLCBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHB1dCBhbgotdW5kZXJzY29yZSBpbiBmcm9udCBvZiBldmVyeSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBDIG5hbWUgCi0uQiBmb28KLWdldHMgdGhlIGxvdy1sZXZlbCBuYW1lIAotLkJSIF9mb28gLgotVGhpcyBvcHRpb24gcmVtb3ZlcyB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLgotCi0uVFAKLS5CICJcLXMge2dudSxsdWNpZCxhcm19IgotLlRQCi0uQiBcLVwtZm9ybWF0PXtnbnUsbHVjaWQsYXJtfQotR05VCi0uQiBubQotY2FuIGRlY29kZSB0aHJlZSBkaWZmZXJlbnQgbWV0aG9kcyBvZiBtYW5nbGluZywgdXNlZCBieSBkaWZmZXJlbnQgQysrCi1jb21waWxlcnMuICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoaWNoIG1ldGhvZCBpdCB1c2VzOiB0aGUgb25lIHVzZWQgYnkKLXRoZSBHTlUgY29tcGlsZXIsIHRoZSBvbmUgdXNlZCBieSB0aGUgTHVjaWQgY29tcGlsZXIsIG9yIHRoZSBvbmUKLXNwZWNpZmllZCBieSB0aGUgQysrIEFubm90YXRlZCBSZWZlcmVuY2UgTWFudWFsLiAgVGhlIGRlZmF1bHQgaXMgdGhlCi1HTlUgc3R5bGUuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgQFBST0dSQU1ACi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLVwtdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiBAUFJPR1JBTUAKLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKEp1bmUgMTk5MykuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlYnVnLmMgYi9iaW51dGlscy9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQ0NTU5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTY3ICswLDAgQEAKLS8qIGRlYnVnLmMgLS0gSGFuZGxlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcgZm9ybWF0LiAgV2UgbWF5IGV2ZW50dWFsbHkKLSAgIGhhdmUgcmVhZGVycyB3aGljaCBjb252ZXJ0IGRpZmZlcmVudCBmb3JtYXRzIGludG8gdGhpcyBnZW5lcmljCi0gICBmb3JtYXQsIGFuZCB3cml0ZXJzIHdoaWNoIHdyaXRlIGl0IG91dC4gIFRoZSBpbml0aWFsIGltcGV0dXMgZm9yCi0gICB0aGlzIHdhcyB3cml0aW5nIGEgY29udmVydG9yIGZyb20gc3RhYnMgdG8gSFAgSUVFRS02OTUgZGVidWdnaW5nCi0gICBmb3JtYXQuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0KLS8qIEdsb2JhbCBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBkZWJ1Z2dpbmcuICBBIHBvaW50ZXIgdG8gdGhpcwotICAgc3RydWN0dXJlIGlzIHRoZSBkZWJ1Z2dpbmcgaGFuZGxlIHBhc3NlZCB0byBhbGwgdGhlIHJvdXRpbmVzLiAgKi8KLQotc3RydWN0IGRlYnVnX2hhbmRsZQotewotICAvKiBBIGxpbmtlZCBsaXN0IG9mIGNvbXBpbGF0aW9uIHVuaXRzLiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKnVuaXRzOwotICAvKiBUaGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKmN1cnJlbnRfdW5pdDsKLSAgLyogVGhlIGN1cnJlbnQgc291cmNlIGZpbGUuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqY3VycmVudF9maWxlOwotICAvKiBUaGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqY3VycmVudF9mdW5jdGlvbjsKLSAgLyogVGhlIGN1cnJlbnQgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmN1cnJlbnRfYmxvY2s7Ci0gIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqY3VycmVudF9saW5lbm87Ci0gIC8qIE1hcmsuICBUaGlzIGlzIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogQSBzdHJ1Y3QvY2xhc3MgSUQgdXNlZCBieSBkZWJ1Z193cml0ZS4gICovCi0gIHVuc2lnbmVkIGludCBjbGFzc19pZDsKLSAgLyogVGhlIGJhc2UgZm9yIGNsYXNzX2lkIGZvciB0aGlzIGNhbGwgdG8gZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgYmFzZV9pZDsKLSAgLyogVGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gZGVidWdfd3JpdGUuICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpjdXJyZW50X3dyaXRlX2xpbmVubzsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4OwotICAvKiBBIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCBoYXZlIGFzc2lnbmVkIElEJ3MgZHVyaW5nIGRlYnVnX3dyaXRlLgotICAgICBUaGlzIGlzIGxpbmtlZCB0aHJvdWdoIHRoZSBuZXh0X2lkIGZpZWxkIG9mIGRlYnVnX2NsYXNzX3R5cGUuICAqLwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKmlkX2xpc3Q7Ci0gIC8qIEEgbGlzdCB1c2VkIHRvIGF2b2lkIHJlY3Vyc2lvbiBkdXJpbmcgZGVidWdfdHlwZV9zYW1lcC4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCAqY29tcGFyZV9saXN0OwotfTsKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0cnVjdCBkZWJ1Z191bml0Ci17Ci0gIC8qIFRoZSBuZXh0IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqbmV4dDsKLSAgLyogQSBsaXN0IG9mIGZpbGVzIGluY2x1ZGVkIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gIFRoZSBmaXJzdAotICAgICBmaWxlIGlzIGFsd2F5cyB0aGUgbWFpbiBvbmUsIGFuZCB0aGF0IGlzIHdoZXJlIHRoZSBtYWluIGZpbGUgbmFtZQotICAgICBpcyBzdG9yZWQuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZmlsZXM7Ci0gIC8qIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICBUaGlzIGlzIG5vdAotICAgICBzdG9yZWQgYnkgZnVuY3Rpb24sIGJlY2F1c2UgYXNzZW1ibGVyIGNvZGUgbWF5IGhhdmUgbGluZSBudW1iZXIKLSAgICAgaW5mb3JtYXRpb24gd2l0aG91dCBmdW5jdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmxpbmVub3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHNpbmdsZSBzb3VyY2UgZmlsZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19maWxlCi17Ci0gIC8qIFRoZSBuZXh0IHNvdXJjZSBmaWxlIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z19maWxlICpuZXh0OwotICAvKiBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogR2xvYmFsIGZ1bmN0aW9ucywgdmFyaWFibGVzLCB0eXBlcywgZXRjLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqZ2xvYmFsczsKLX07Ci0KLS8qIEEgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z190eXBlCi17Ci0gIC8qIEtpbmQgb2YgdHlwZS4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gIC8qIFNpemUgb2YgdHlwZSAoMCBpZiBub3Qga25vd24pLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIFR5cGUgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoaXMgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcG9pbnRlcjsKLSAgLyogVGFnZ2VkIHVuaW9uIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogREVCVUdfS0lORF9JTkRJUkVDVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZSAqa2luZGlyZWN0OwotICAgICAgLyogREVCVUdfS0lORF9JTlQuICAqLwotICAgICAgLyogV2hldGhlciB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCi0gICAgICBib29sZWFuIGtpbnQ7Ci0gICAgICAvKiBERUJVR19LSU5EX1NUUlVDVCwgREVCVUdfS0lORF9VTklPTiwgREVCVUdfS0lORF9DTEFTUywKLSAgICAgICAgIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmtjbGFzczsKLSAgICAgIC8qIERFQlVHX0tJTkRfRU5VTS4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZW51bV90eXBlICprZW51bTsKLSAgICAgIC8qIERFQlVHX0tJTkRfUE9JTlRFUi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqa3BvaW50ZXI7Ci0gICAgICAvKiBERUJVR19LSU5EX0ZVTkNUSU9OLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlICprZnVuY3Rpb247Ci0gICAgICAvKiBERUJVR19LSU5EX1JFRkVSRU5DRS4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqa3JlZmVyZW5jZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfUkFOR0UuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUgKmtyYW5nZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfQVJSQVkuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2FycmF5X3R5cGUgKmthcnJheTsKLSAgICAgIC8qIERFQlVHX0tJTkRfU0VULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19zZXRfdHlwZSAqa3NldDsKLSAgICAgIC8qIERFQlVHX0tJTkRfT0ZGU0VULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZSAqa29mZnNldDsKLSAgICAgIC8qIERFQlVHX0tJTkRfTUVUSE9ELiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSAqa21ldGhvZDsKLSAgICAgIC8qIERFQlVHX0tJTkRfQ09OU1QuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtjb25zdDsKLSAgICAgIC8qIERFQlVHX0tJTkRfVk9MQVRJTEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmt2b2xhdGlsZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfTkFNRUQsIERFQlVHX0tJTkRfVEFHR0VELiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICprbmFtZWQ7Ci0gICAgfSB1OwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlCi17Ci0gIC8qIFNsb3Qgd2hlcmUgdGhlIGZpbmFsIHR5cGUgd2lsbCBhcHBlYXIuICAqLwotICBkZWJ1Z190eXBlICpzbG90OwotICAvKiBUYWcuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHN0cnVjdCwgdW5pb24sIG9yIGNsYXNzLiAgKi8KLQotc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUKLXsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcy4gICovCi0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIC8qIEEgbWFyayBmaWVsZCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RydWN0IGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgcHJpbnRlZC4gICovCi0gIHVuc2lnbmVkIGludCBtYXJrOwotICAvKiBUaGlzIGlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdW5uYW1lZCBzdHJ1Y3RzIHdoZW4gcHJpbnRpbmcuICAqLwotICB1bnNpZ25lZCBpbnQgaWQ7Ci0gIC8qIFRoZSByZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgZm9yIERFQlVHX0tJTkRfQ0xBU1MgYW5kCi0gICAgIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MuICAqLwotICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLiAgKi8KLSAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZHMuICAqLwotICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyBwcm92aWRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZm9yCi0gICAgIHRoaXMgY2xhc3MuICBUaGlzIG1heSBwb2ludCB0byB0aGUgdHlwZSBpdHNlbGYuICAqLwotICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gZW51bS4gICovCi0KLXN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUKLXsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG5hbWVzLiAgKi8KLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICAvKiBBcnJheSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4gICovCi0gIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIGZ1bmN0aW9uLiAgRklYTUU6IFdlIHNob3VsZCBiZSBhYmxlIHRvCi0gICByZWNvcmQgdGhlIHBhcmFtZXRlciB0eXBlcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlCi17Ci0gIC8qIFJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHJhbmdlLiAgKi8KLQotc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUKLXsKLSAgLyogUmFuZ2UgYmFzZSB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBMb3dlciBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAvKiBVcHBlciBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gYXJyYXkuICAqLwotCi1zdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZQotewotICAvKiBFbGVtZW50IHR5cGUuICAqLwotICBkZWJ1Z190eXBlIGVsZW1lbnRfdHlwZTsKLSAgLyogUmFuZ2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmFuZ2VfdHlwZTsKLSAgLyogTG93ZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgLyogVXBwZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLSAgLyogV2hldGhlciB0aGlzIGFycmF5IGlzIHJlYWxseSBhIHN0cmluZy4gICovCi0gIGJvb2xlYW4gc3RyaW5ncDsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgc2V0LiAgKi8KLQotc3RydWN0IGRlYnVnX3NldF90eXBlCi17Ci0gIC8qIEJhc2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogV2hldGhlciB0aGlzIHNldCBpcyByZWFsbHkgYSBiaXRzdHJpbmcuICAqLwotICBib29sZWFuIGJpdHN0cmluZ3A7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhbiBvZmZzZXQgdHlwZSAoYSBiYXNlZCBwb2ludGVyKS4gICovCi0KLXN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZQotewotICAvKiBUaGUgdHlwZSB0aGUgcG9pbnRlciBpcyBhbiBvZmZzZXQgZnJvbS4gICovCi0gIGRlYnVnX3R5cGUgYmFzZV90eXBlOwotICAvKiBUaGUgdHlwZSB0aGUgcG9pbnRlciBwb2ludHMgdG8uICAqLwotICBkZWJ1Z190eXBlIHRhcmdldF90eXBlOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBtZXRob2QgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZQotewotICAvKiBUaGUgcmV0dXJuIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotICAvKiBUaGUgb2JqZWN0IHR5cGUgd2hpY2ggdGhpcyBtZXRob2QgaXMgZm9yLiAgKi8KLSAgZGVidWdfdHlwZSBkb21haW5fdHlwZTsKLSAgLyogQSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLwotICBkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0gIC8qIFdoZXRoZXIgdGhlIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIG5hbWVkIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZQotewotICAvKiBOYW1lLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWUgKm5hbWU7Ci0gIC8qIFJlYWwgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLX07Ci0KLS8qIEEgZmllbGQgaW4gYSBzdHJ1Y3Qgb3IgdW5pb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfZmllbGQKLXsKLSAgLyogTmFtZSBvZiB0aGUgZmllbGQuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIG9mIHRoZSBmaWVsZC4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAvKiBWaXNpYmlsaXR5IG9mIHRoZSBmaWVsZC4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBXaGV0aGVyIHRoaXMgaXMgYSBzdGF0aWMgbWVtYmVyLiAgKi8KLSAgYm9vbGVhbiBzdGF0aWNfbWVtYmVyOwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIElmIHN0YXRpY19tZW1iZXIgaXMgZmFsc2UuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgLyogQml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3RydWN0LiAgKi8KLQkgIHVuc2lnbmVkIGludCBiaXRwb3M7Ci0JICAvKiBTaXplIG9mIHRoZSBmaWVsZCBpbiBiaXRzLiAgKi8KLQkgIHVuc2lnbmVkIGludCBiaXRzaXplOwotCX0gZjsKLSAgICAgIC8qIElmIHN0YXRpY19tZW1iZXIgaXMgdHJ1ZS4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLQl9IHM7Ci0gICAgfSB1OwotfTsKLQotLyogQSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgZGVidWdfYmFzZWNsYXNzCi17Ci0gIC8qIFR5cGUgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogQml0IHBvc2l0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIGluIHRoZSBvYmplY3QuICAqLwotICB1bnNpZ25lZCBpbnQgYml0cG9zOwotICAvKiBXaGV0aGVyIHRoZSBiYXNlIGNsYXNzIGlzIHZpcnR1YWwuICAqLwotICBib29sZWFuIHZpcnR1YWw7Ci0gIC8qIFZpc2liaWxpdHkgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLX07Ci0KLS8qIEEgbWV0aG9kIG9mIGFuIG9iamVjdC4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2QKLXsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIEEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYW50cy4gICovCi0gIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKnZhcmlhbnRzOwotfTsKLQotLyogVGhlIHZhcmlhbnRzIG9mIGEgbWV0aG9kIGZ1bmN0aW9uIG9mIGFuIG9iamVjdC4gIFRoZXNlIGluZGljYXRlCi0gICB3aGljaCBtZXRob2QgdG8gcnVuLiAgKi8KLQotc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50Ci17Ci0gIC8qIFRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVGhlIHZpc2liaWxpdHkgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gIC8qIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGNvbnN0LiAgKi8KLSAgYm9vbGVhbiBjb25zdHA7Ci0gIC8qIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIHZvbGF0aWxlLiAgKi8KLSAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gIC8qIFRoZSBvZmZzZXQgdG8gdGhlIGZ1bmN0aW9uIGluIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgKi8KLSAgYmZkX3ZtYSB2b2Zmc2V0OwotICAvKiBJZiB2b2Zmc2V0IGlzIFZPRkZTRVRfU1RBVElDX01FVEhPRCwgdGhpcyBpcyBhIHN0YXRpYyBtZXRob2QuICAqLwotI2RlZmluZSBWT0ZGU0VUX1NUQVRJQ19NRVRIT0QgKChiZmRfdm1hKSAtMSkKLSAgLyogQ29udGV4dCBvZiBhIHZpcnR1YWwgbWV0aG9kIGZ1bmN0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKmNvbnRleHQ7Ci19OwotCi0vKiBBIHZhcmlhYmxlLiAgVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSB2YXJpYWJsZSBvYmplY3QuCi0gICBUaGlzIGhhcyBubyBuYW1lOyBhIG5hbWUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdmFyaWFibGUgaW4gYQotICAgZGVidWdfbmFtZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZGVidWdfdmFyaWFibGUKLXsKLSAgLyogS2luZCBvZiB2YXJpYWJsZS4gICovCi0gIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogVmFsdWUuICBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHZhbHVlIGRlcGVuZHMgdXBvbiBraW5kLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBBIGZ1bmN0aW9uLiAgVGhpcyBoYXMgbm8gbmFtZTsgYSBuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGZ1bmN0aW9uCi0gICBpbiBhIGRlYnVnX25hbWUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGRlYnVnX2Z1bmN0aW9uCi17Ci0gIC8qIFJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogUGFyYW1ldGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqcGFyYW1ldGVyczsKLSAgLyogQmxvY2sgaW5mb3JtYXRpb24uICBUaGUgZmlyc3Qgc3RydWN0dXJlIG9uIHRoZSBsaXN0IGlzIHRoZSBtYWluCi0gICAgIGJsb2NrIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGRlc2NyaWJlcyBmdW5jdGlvbiBsb2NhbCB2YXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmJsb2NrczsKLX07Ci0KLS8qIEEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLQotc3RydWN0IGRlYnVnX3BhcmFtZXRlcgotewotICAvKiBOZXh0IHBhcmFtZXRlci4gICovCi0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKm5leHQ7Ci0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBLaW5kLiAgKi8KLSAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgLyogVmFsdWUgKG1lYW5pbmcgZGVwZW5kcyB1cG9uIGtpbmQpLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBBIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50Ci17Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFZhbHVlLiAgRklYTUU6IFdlIG1heSBldmVudHVhbGx5IG5lZWQgdG8gc3VwcG9ydCBub24taW50ZWdyYWwKLSAgICAgdmFsdWVzLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBhYm91dCBhIGJsb2NrIHdpdGhpbiBhIGZ1bmN0aW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX2Jsb2NrCi17Ci0gIC8qIE5leHQgYmxvY2sgd2l0aCB0aGUgc2FtZSBwYXJlbnQuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKm5leHQ7Ci0gIC8qIFBhcmVudCBibG9jay4gICovCi0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqcGFyZW50OwotICAvKiBMaXN0IG9mIGNoaWxkIGJsb2Nrcy4gICovCi0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqY2hpbGRyZW47Ci0gIC8qIFN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJsb2NrLiAgKi8KLSAgYmZkX3ZtYSBzdGFydDsKLSAgLyogRW5kIGFkZHJlc3Mgb2YgdGhlIGJsb2NrLiAgKi8KLSAgYmZkX3ZtYSBlbmQ7Ci0gIC8qIExvY2FsIHZhcmlhYmxlcy4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKmxvY2FsczsKLX07Ci0KLS8qIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gIEZJWE1FOgotICAgVGhpcyBzdHJ1Y3R1cmUgaXMgZWFzeSB0byBjcmVhdGUsIGJ1dCBjYW4gYmUgdmVyeSBzcGFjZQotICAgaW5lZmZpY2llbnQuICAqLwotCi1zdHJ1Y3QgZGVidWdfbGluZW5vCi17Ci0gIC8qIE1vcmUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpuZXh0OwotICAvKiBTb3VyY2UgZmlsZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19maWxlICpmaWxlOwotICAvKiBMaW5lIG51bWJlcnMsIHRlcm1pbmF0ZWQgYnkgYSAtMSBvciB0aGUgZW5kIG9mIHRoZSBhcnJheS4gICovCi0jZGVmaW5lIERFQlVHX0xJTkVOT19DT1VOVCAxMAotICB1bnNpZ25lZCBsb25nIGxpbmVub3NbREVCVUdfTElORU5PX0NPVU5UXTsKLSAgLyogQWRkcmVzc2VzIGZvciB0aGUgbGluZSBudW1iZXJzLiAgKi8KLSAgYmZkX3ZtYSBhZGRyc1tERUJVR19MSU5FTk9fQ09VTlRdOwotfTsKLQotLyogQSBuYW1lc3BhY2UuICBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIG5hbWVzIHRvIG9iamVjdHMuICBGSVhNRTogVGhpcwotICAgc2hvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UKLXsKLSAgLyogTGlzdCBvZiBpdGVtcyBpbiB0aGlzIG5hbWVzcGFjZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpsaXN0OwotICAvKiBQb2ludGVyIHRvIHdoZXJlIHRoZSBuZXh0IGl0ZW0gaW4gdGhpcyBuYW1lc3BhY2Ugc2hvdWxkIGdvLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWUgKip0YWlsOwotfTsKLQotLyogS2luZHMgb2Ygb2JqZWN0cyB0aGF0IGFwcGVhciBpbiBhIG5hbWVzcGFjZS4gICovCi0KLWVudW0gZGVidWdfb2JqZWN0X2tpbmQKLXsKLSAgLyogQSB0eXBlLiAgKi8KLSAgREVCVUdfT0JKRUNUX1RZUEUsCi0gIC8qIEEgdGFnZ2VkIHR5cGUgKHJlYWxseSBhIGRpZmZlcmVudCBzb3J0IG9mIG5hbWVzcGFjZSkuICAqLwotICBERUJVR19PQkpFQ1RfVEFHLAotICAvKiBBIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfT0JKRUNUX1ZBUklBQkxFLAotICAvKiBBIGZ1bmN0aW9uLiAgKi8KLSAgREVCVUdfT0JKRUNUX0ZVTkNUSU9OLAotICAvKiBBbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLSAgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVCwKLSAgLyogQSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVCwKLSAgLyogQSB0eXBlZCBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9UWVBFRF9DT05TVEFOVAotfTsKLQotLyogTGlua2FnZSBvZiBhbiBvYmplY3QgdGhhdCBhcHBlYXJzIGluIGEgbmFtZXNwYWNlLiAgKi8KLQotZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZQotewotICAvKiBMb2NhbCB2YXJpYWJsZS4gICovCi0gIERFQlVHX0xJTktBR0VfQVVUT01BVElDLAotICAvKiBTdGF0aWMtLWVpdGhlciBmaWxlIHN0YXRpYyBvciBmdW5jdGlvbiBzdGF0aWMsIGRlcGVuZGluZyB1cG9uIHRoZQotICAgICBuYW1lc3BhY2UgaXMuICAqLwotICBERUJVR19MSU5LQUdFX1NUQVRJQywKLSAgLyogR2xvYmFsLiAgKi8KLSAgREVCVUdfTElOS0FHRV9HTE9CQUwsCi0gIC8qIE5vIGxpbmthZ2UuICAqLwotICBERUJVR19MSU5LQUdFX05PTkUKLX07Ci0KLS8qIEEgbmFtZSBpbiBhIG5hbWVzcGFjZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19uYW1lCi17Ci0gIC8qIE5leHQgbmFtZSBpbiB0aGlzIG5hbWVzcGFjZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTWFyay4gIFRoaXMgaXMgdXNlZCBieSBkZWJ1Z193cml0ZS4gICovCi0gIHVuc2lnbmVkIGludCBtYXJrOwotICAvKiBLaW5kIG9mIG9iamVjdC4gICovCi0gIGVudW0gZGVidWdfb2JqZWN0X2tpbmQga2luZDsKLSAgLyogTGlua2FnZSBvZiBvYmplY3QuICAqLwotICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gIC8qIFRhZ2dlZCB1bmlvbiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdC4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogREVCVUdfT0JKRUNUX1RZUEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVEFHLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0YWc7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVkFSSUFCTEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3ZhcmlhYmxlICp2YXJpYWJsZTsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9GVU5DVElPTi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmZ1bmN0aW9uOwotICAgICAgLyogREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVC4gICovCi0gICAgICBiZmRfdm1hIGludF9jb25zdGFudDsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVC4gICovCi0gICAgICBkb3VibGUgZmxvYXRfY29uc3RhbnQ7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICp0eXBlZF9jb25zdGFudDsKLSAgICB9IHU7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfd3JpdGUsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyB1c2VkIHRvCi0gICBrZWVwIHRyYWNrIG9mIElEIG51bWJlcnMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gY2xhc3Nlcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19jbGFzc19pZAotewotICAvKiBOZXh0IElEIG51bWJlci4gICovCi0gIHN0cnVjdCBkZWJ1Z19jbGFzc19pZCAqbmV4dDsKLSAgLyogVGhlIHR5cGUgd2l0aCB0aGUgSUQuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVGhlIHRhZzsgTlVMTCBpZiBubyB0YWcuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfdHlwZV9zYW1lcCwgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIGtlcHQKLSAgIG9uIHRoZSBzdGFjayB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QKLXsKLSAgLyogTmV4dCB0eXBlIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlcyB3ZSBhcmUgY29tcGFyaW5nLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQxOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDI7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfZ2V0X3JlYWxfdHlwZSwgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzCi0gICBrZXB0IG9uIHRoZSBzdGFjayB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QKLXsKLSAgLyogTmV4dCB0eXBlIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlIHdlIGFyZSBjaGVja2luZy4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotfTsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgZGVidWdfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGRlYnVnX25hbWUgKmRlYnVnX2FkZF90b19uYW1lc3BhY2UKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqLCBjb25zdCBjaGFyICosCi0JICAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCwgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICpkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfb2JqZWN0X2tpbmQsCi0JICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICpkZWJ1Z19tYWtlX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBlbnVtIGRlYnVnX3R5cGVfa2luZCwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGRlYnVnX3R5cGUgKmRlYnVnX2dldF9yZWFsX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfbmFtZQotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z19uYW1lICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBzdHJ1Y3QgZGVidWdfdHlwZSAqLCBzdHJ1Y3QgZGVidWdfbmFtZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9jbGFzc190eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9mdW5jdGlvbgotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSwgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX2Jsb2NrCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX2Jsb2NrICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX2xpbmVub3MKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z19zZXRfY2xhc3NfaWQKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3R5cGVfc2FtZXAKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z19jbGFzc190eXBlX3NhbWVwCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKikpOwotDAotLyogSXNzdWUgYW4gZXJyb3IgbWVzc2FnZS4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19lcnJvciAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIG1lc3NhZ2UpOwotfQotCi0vKiBBZGQgYW4gb2JqZWN0IHRvIGEgbmFtZXNwYWNlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICoKLWRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sIG5zcCwgbmFtZSwga2luZCwgbGlua2FnZSkKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqbnNwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9raW5kIGtpbmQ7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKLXsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKm5zOwotCi0gIG4gPSAoc3RydWN0IGRlYnVnX25hbWUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOwotCi0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT5raW5kID0ga2luZDsKLSAgbi0+bGlua2FnZSA9IGxpbmthZ2U7Ci0KLSAgbnMgPSAqbnNwOwotICBpZiAobnMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBucyA9IChzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICopIHhtYWxsb2MgKHNpemVvZiAqbnMpOwotICAgICAgbWVtc2V0IChucywgMCwgc2l6ZW9mICpucyk7Ci0KLSAgICAgIG5zLT50YWlsID0gJm5zLT5saXN0OwotCi0gICAgICAqbnNwID0gbnM7Ci0gICAgfQotCi0gICpucy0+dGFpbCA9IG47Ci0gIG5zLT50YWlsID0gJm4tPm5leHQ7Ci0KLSAgcmV0dXJuIG47Ci19Ci0KLS8qIEFkZCBhbiBvYmplY3QgdG8gdGhlIGN1cnJlbnQgbmFtZXNwYWNlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICoKLWRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwga2luZCwgbGlua2FnZSkKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCBraW5kOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKipuc3A7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlOiBubyBjdXJyZW50IGZpbGUiKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfYmxvY2sgIT0gTlVMTCkKLSAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9ibG9jay0+bG9jYWxzOwotICBlbHNlCi0gICAgbnNwID0gJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFsczsKLQotICByZXR1cm4gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgbnNwLCBuYW1lLCBraW5kLCBsaW5rYWdlKTsKLX0KLQwKLS8qIFJldHVybiBhIGhhbmRsZSBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotUFRSCi1kZWJ1Z19pbml0ICgpCi17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKnJldDsKLQotICByZXQgPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIG1lbXNldCAocmV0LCAwLCBzaXplb2YgKnJldCk7Ci0gIHJldHVybiAoUFRSKSByZXQ7Ci19Ci0KLS8qIFNldCB0aGUgc291cmNlIGZpbGVuYW1lLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIG5ldyBjb21waWxhdGlvbgotICAgdW5pdC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3NldF9maWxlbmFtZSAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqbmZpbGU7Ci0gIHN0cnVjdCBkZWJ1Z191bml0ICpudW5pdDsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSAiIjsKLQotICBuZmlsZSA9IChzdHJ1Y3QgZGVidWdfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKm5maWxlKTsKLSAgbWVtc2V0IChuZmlsZSwgMCwgc2l6ZW9mICpuZmlsZSk7Ci0KLSAgbmZpbGUtPmZpbGVuYW1lID0gbmFtZTsKLQotICBudW5pdCA9IChzdHJ1Y3QgZGVidWdfdW5pdCAqKSB4bWFsbG9jIChzaXplb2YgKm51bml0KTsKLSAgbWVtc2V0IChudW5pdCwgMCwgc2l6ZW9mICpudW5pdCk7Ci0KLSAgbnVuaXQtPmZpbGVzID0gbmZpbGU7Ci0gIGluZm8tPmN1cnJlbnRfZmlsZSA9IG5maWxlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgIT0gTlVMTCkKLSAgICBpbmZvLT5jdXJyZW50X3VuaXQtPm5leHQgPSBudW5pdDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5mby0+dW5pdHMgPT0gTlVMTCk7Ci0gICAgICBpbmZvLT51bml0cyA9IG51bml0OwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50X3VuaXQgPSBudW5pdDsKLQotICBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID0gTlVMTDsKLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IE5VTEw7Ci0gIGluZm8tPmN1cnJlbnRfbGluZW5vID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hhbmdlIHNvdXJjZSBmaWxlcyB0byB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgaW5jbHVkZSBmaWxlcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotYm9vbGVhbgotZGVidWdfc3RhcnRfc291cmNlIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19maWxlICpmLCAqKnBmOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgbmFtZSA9ICIiOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfc3RhcnRfc291cmNlOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChmID0gaW5mby0+Y3VycmVudF91bml0LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+ZmlsZW5hbWVbMF0gPT0gbmFtZVswXQotCSAgJiYgZi0+ZmlsZW5hbWVbMV0gPT0gbmFtZVsxXQotCSAgJiYgc3RyY21wIChmLT5maWxlbmFtZSwgbmFtZSkgPT0gMCkKLQl7Ci0JICBpbmZvLT5jdXJyZW50X2ZpbGUgPSBmOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICBmID0gKHN0cnVjdCBkZWJ1Z19maWxlICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5maWxlbmFtZSA9IG5hbWU7Ci0KLSAgZm9yIChwZiA9ICZpbmZvLT5jdXJyZW50X2ZpbGUtPm5leHQ7Ci0gICAgICAgKnBmICE9IE5VTEw7Ci0gICAgICAgcGYgPSAmKCpwZiktPm5leHQpCi0gICAgOwotICAqcGYgPSBmOwotCi0gIGluZm8tPmN1cnJlbnRfZmlsZSA9IGY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgZnVuY3Rpb24KLSAgIGJsb2NrLiAgVGhlIGRlYnVnX3R5cGUgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4KLSAgIFRoZSBib29sZWFuIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBnbG9iYWxseSB2aXNpYmxlLgotICAgVGhlIGJmZF92bWEgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gIEN1cnJlbnRseQotICAgdGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgc3BlY2lmaWVkIGJ5IGNhbGxzIHRvCi0gICBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyLiAgRklYTUU6IFRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IG5lc3RlZAotICAgZnVuY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChoYW5kbGUsIG5hbWUsIHJldHVybl90eXBlLCBnbG9iYWwsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqZjsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSAiIjsKLSAgaWYgKHJldHVybl90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2Z1bmN0aW9uOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZiA9IChzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKLSAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOwotCi0gIGYtPnJldHVybl90eXBlID0gcmV0dXJuX3R5cGU7Ci0KLSAgYiA9IChzdHJ1Y3QgZGVidWdfYmxvY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKLSAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOwotCi0gIGItPnN0YXJ0ID0gYWRkcjsKLSAgYi0+ZW5kID0gKGJmZF92bWEpIC0xOwotCi0gIGYtPmJsb2NrcyA9IGI7Ci0KLSAgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9IGY7Ci0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBiOwotCi0gIC8qIEZJWE1FOiBJZiB3ZSBjb3VsZCBoYW5kbGUgbmVzdGVkIGZ1bmN0aW9ucywgdGhpcyB3b3VsZCBiZSB0aGUKLSAgICAgcGxhY2U6IHdlIHdvdWxkIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG5hbWVzcGFjZS4gICovCi0gIG4gPSBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLAotCQkJICAgICAgJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFscywKLQkJCSAgICAgIG5hbWUsCi0JCQkgICAgICBERUJVR19PQkpFQ1RfRlVOQ1RJT04sCi0JCQkgICAgICAoZ2xvYmFsCi0JCQkgICAgICAgPyBERUJVR19MSU5LQUdFX0dMT0JBTAotCQkJICAgICAgIDogREVCVUdfTElOS0FHRV9TVEFUSUMpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+dS5mdW5jdGlvbiA9IGY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIHBhcmFtZXRlciBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChoYW5kbGUsIG5hbWUsIHR5cGUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqcCwgKipwcDsKLQotICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF9wYXJhbWV0ZXI6IG5vIGN1cnJlbnQgZnVuY3Rpb24iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHAgPSAoc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqKSB4bWFsbG9jIChzaXplb2YgKnApOwotICBtZW1zZXQgKHAsIDAsIHNpemVvZiAqcCk7Ci0KLSAgcC0+bmFtZSA9IG5hbWU7Ci0gIHAtPnR5cGUgPSB0eXBlOwotICBwLT5raW5kID0ga2luZDsKLSAgcC0+dmFsID0gdmFsOwotCi0gIGZvciAocHAgPSAmaW5mby0+Y3VycmVudF9mdW5jdGlvbi0+cGFyYW1ldGVyczsKLSAgICAgICAqcHAgIT0gTlVMTDsKLSAgICAgICBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBhIGZ1bmN0aW9uLiAgRklYTUU6IFRoaXMgc2hvdWxkIGhhbmRsZSBmdW5jdGlvbiBuZXN0aW5nLiAgKi8KLQotYm9vbGVhbgotZGVidWdfZW5kX2Z1bmN0aW9uIChoYW5kbGUsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfYmxvY2sgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfZnVuY3Rpb246IG5vIGN1cnJlbnQgZnVuY3Rpb24iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5jdXJyZW50X2Jsb2NrLT5wYXJlbnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Z1bmN0aW9uOiBzb21lIGJsb2NrcyB3ZXJlIG5vdCBjbG9zZWQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPmN1cnJlbnRfYmxvY2stPmVuZCA9IGFkZHI7Ci0KLSAgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7Ci0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBBbGwgbG9jYWwgaW5mb3JtYXRpb24gd2lsbCBiZQotICAgcmVjb3JkZWQgaW4gdGhpcyBibG9jaywgdW50aWwgdGhlIG1hdGNoaW5nIGNhbGwgdG8gZGVidWdfZW5kX2Jsb2NrLgotICAgZGVidWdfc3RhcnRfYmxvY2sgYW5kIGRlYnVnX2VuZF9ibG9jayBtYXkgYmUgbmVzdGVkLiAgVGhlIGJmZF92bWEKLSAgIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sgc3RhcnRzLiAgKi8KLQotYm9vbGVhbgotZGVidWdfc3RhcnRfYmxvY2sgKGhhbmRsZSwgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmIsICoqcGI7Ci0KLSAgLyogV2UgbXVzdCBhbHdheXMgaGF2ZSBhIGN1cnJlbnQgYmxvY2s6IGRlYnVnX3JlY29yZF9mdW5jdGlvbiBzZXRzCi0gICAgIG9uZSB1cC4gICovCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19zdGFydF9ibG9jazogbm8gY3VycmVudCBibG9jayIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYiA9IChzdHJ1Y3QgZGVidWdfYmxvY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKLSAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOwotCi0gIGItPnBhcmVudCA9IGluZm8tPmN1cnJlbnRfYmxvY2s7Ci0gIGItPnN0YXJ0ID0gYWRkcjsKLSAgYi0+ZW5kID0gKGJmZF92bWEpIC0xOwotCi0gIC8qIFRoaXMgbmV3IGJsb2NrIGlzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgYmxvY2suICAqLwotICBmb3IgKHBiID0gJmluZm8tPmN1cnJlbnRfYmxvY2stPmNoaWxkcmVuOwotICAgICAgICpwYiAhPSBOVUxMOwotICAgICAgIHBiID0gJigqcGIpLT5uZXh0KQotICAgIDsKLSAgKnBiID0gYjsKLQotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gYjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIFRoaXMgbWF0Y2hlcyB0aGUgY2FsbCB0bwotICAgZGVidWdfc3RhcnRfYmxvY2suICBUaGUgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jawotICAgZW5kcy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX2VuZF9ibG9jayAoaGFuZGxlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqcGFyZW50OwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHBhcmVudCA9IGluZm8tPmN1cnJlbnRfYmxvY2stPnBhcmVudDsKLSAgaWYgKHBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfYmxvY2s6IGF0dGVtcHQgdG8gY2xvc2UgdG9wIGxldmVsIGJsb2NrIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50X2Jsb2NrLT5lbmQgPSBhZGRyOwotCi0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBwYXJlbnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFzc29jaWF0ZSBhIGxpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGFuZCBmdW5jdGlvbgotICAgd2l0aCBhIGdpdmVuIGFkZHJlc3MuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfbGluZSAoaGFuZGxlLCBsaW5lbm8sIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGluZW5vOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmw7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2xpbmU6IG5vIGN1cnJlbnQgdW5pdCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbCA9IGluZm8tPmN1cnJlbnRfbGluZW5vOwotICBpZiAobCAhPSBOVUxMICYmIGwtPmZpbGUgPT0gaW5mby0+Y3VycmVudF9maWxlKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBERUJVR19MSU5FTk9fQ09VTlQ7IGkrKykKLQl7Ci0JICBpZiAobC0+bGluZW5vc1tpXSA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JICAgIHsKLQkgICAgICBsLT5saW5lbm9zW2ldID0gbGluZW5vOwotCSAgICAgIGwtPmFkZHJzW2ldID0gYWRkcjsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZ2V0IGhlcmUsIHRoZW4gZWl0aGVyIDEpIHRoZXJlIGlzIG5vIGN1cnJlbnRfbGluZW5vCi0gICAgIHN0cnVjdHVyZSwgd2hpY2ggbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgaW4gdGhpcwotICAgICBjb21waWxhdGlvbiB1bml0LCAyKSB0aGUgY3VycmVudF9saW5lbm8gc3RydWN0dXJlIGlzIGZvciBhCi0gICAgIGRpZmZlcmVudCBmaWxlLCBvciAzKSB0aGUgY3VycmVudF9saW5lbm8gc3RydWN0dXJlIGlzIGZ1bGwuCi0gICAgIFJlZ2FyZGxlc3MsIHdlIHdhbnQgdG8gYWxsb2NhdGUgYSBuZXcgZGVidWdfbGluZW5vIHN0cnVjdHVyZSwgcHV0Ci0gICAgIGl0IGluIHRoZSByaWdodCBwbGFjZSwgYW5kIG1ha2UgaXQgdGhlIG5ldyBjdXJyZW50X2xpbmVubwotICAgICBzdHJ1Y3R1cmUuICAqLwotCi0gIGwgPSAoc3RydWN0IGRlYnVnX2xpbmVubyAqKSB4bWFsbG9jIChzaXplb2YgKmwpOwotICBtZW1zZXQgKGwsIDAsIHNpemVvZiAqbCk7Ci0KLSAgbC0+ZmlsZSA9IGluZm8tPmN1cnJlbnRfZmlsZTsKLSAgbC0+bGluZW5vc1swXSA9IGxpbmVubzsKLSAgbC0+YWRkcnNbMF0gPSBhZGRyOwotICBmb3IgKGkgPSAxOyBpIDwgREVCVUdfTElORU5PX0NPVU5UOyBpKyspCi0gICAgbC0+bGluZW5vc1tpXSA9ICh1bnNpZ25lZCBsb25nKSAtMTsKLQotICBpZiAoaW5mby0+Y3VycmVudF9saW5lbm8gIT0gTlVMTCkKLSAgICBpbmZvLT5jdXJyZW50X2xpbmVuby0+bmV4dCA9IGw7Ci0gIGVsc2UKLSAgICBpbmZvLT5jdXJyZW50X3VuaXQtPmxpbmVub3MgPSBsOwotCi0gIGluZm8tPmN1cnJlbnRfbGluZW5vID0gbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBuYW1lZCBjb21tb24gYmxvY2suICBUaGlzIGlzIGEgYmxvY2sgb2YgdmFyaWFibGVzIHRoYXQgbWF5Ci0gICBtb3ZlIGluIG1lbW9yeS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jayAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUgKi8KLSAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIikpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEVuZCBhIG5hbWVkIGNvbW1vbiBibG9jay4gICovCi0KLWJvb2xlYW4KLWRlYnVnX2VuZF9jb21tb25fYmxvY2sgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9pbnRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVCwKLQkJCQkgICAgICBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuLT51LmludF9jb25zdGFudCA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkb3VibGUgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+dS5mbG9hdF9jb25zdGFudCA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgdHlwZWQgY29uc3RhbnQgd2l0aCBhbiBpbnRlZ3JhbCB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF90eXBlZF9jb25zdCAoaGFuZGxlLCBuYW1lLCB0eXBlLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfdHlwZWRfY29uc3RhbnQgKnRjOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdGMgPSAoc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICopIHhtYWxsb2MgKHNpemVvZiAqdGMpOwotICBtZW1zZXQgKHRjLCAwLCBzaXplb2YgKnRjKTsKLQotICB0Yy0+dHlwZSA9IHR5cGU7Ci0gIHRjLT52YWwgPSB2YWw7Ci0KLSAgbi0+dS50eXBlZF9jb25zdGFudCA9IHRjOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBsYWJlbC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9sYWJlbCAoaGFuZGxlLCBuYW1lLCB0eXBlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfdHlwZSB0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfbGFiZWwgbm90IGltcGxlbWVudGVkIikpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChoYW5kbGUsIG5hbWUsIHR5cGUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqbnNwOwotICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfdmFyaWFibGUgKnY7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoa2luZCA9PSBERUJVR19HTE9CQUwgfHwga2luZCA9PSBERUJVR19TVEFUSUMpCi0gICAgewotICAgICAgbnNwID0gJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFsczsKLSAgICAgIGlmIChraW5kID09IERFQlVHX0dMT0JBTCkKLQlsaW5rYWdlID0gREVCVUdfTElOS0FHRV9HTE9CQUw7Ci0gICAgICBlbHNlCi0JbGlua2FnZSA9IERFQlVHX0xJTktBR0VfU1RBVElDOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwpCi0JewotCSAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBibG9jayIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9ibG9jay0+bG9jYWxzOwotICAgICAgbGlua2FnZSA9IERFQlVHX0xJTktBR0VfQVVUT01BVElDOwotICAgIH0KLQotICBuID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgbnNwLCBuYW1lLCBERUJVR19PQkpFQ1RfVkFSSUFCTEUsIGxpbmthZ2UpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2ID0gKHN0cnVjdCBkZWJ1Z192YXJpYWJsZSAqKSB4bWFsbG9jIChzaXplb2YgKnYpOwotICBtZW1zZXQgKHYsIDAsIHNpemVvZiAqdik7Ci0KLSAgdi0+a2luZCA9IGtpbmQ7Ci0gIHYtPnR5cGUgPSB0eXBlOwotICB2LT52YWwgPSB2YWw7Ci0KLSAgbi0+dS52YXJpYWJsZSA9IHY7Ci0KLSAgcmV0dXJuIHRydWU7ICAKLX0KLQotLyogTWFrZSBhIHR5cGUgd2l0aCBhIGdpdmVuIGtpbmQgYW5kIHNpemUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqCi1kZWJ1Z19tYWtlX3R5cGUgKGluZm8sIGtpbmQsIHNpemUpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIHQgPSAoc3RydWN0IGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICp0KTsKLSAgbWVtc2V0ICh0LCAwLCBzaXplb2YgKnQpOwotCi0gIHQtPmtpbmQgPSBraW5kOwotICB0LT5zaXplID0gc2l6ZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiBpbmRpcmVjdCB0eXBlIHdoaWNoIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGEgdHlwZQotICAgd2hpY2ggaXMgcmVmZXJlbmNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoaGFuZGxlLCBzbG90LCB0YWcpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgKnNsb3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlICppOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfSU5ESVJFQ1QsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaSA9IChzdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmkpOwotICBtZW1zZXQgKGksIDAsIHNpemVvZiAqaSk7Ci0KLSAgaS0+c2xvdCA9IHNsb3Q7Ci0gIGktPnRhZyA9IHRhZzsKLQotICB0LT51LmtpbmRpcmVjdCA9IGk7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSB2b2lkIHR5cGUuICBUaGVyZSBpcyBvbmx5IG9uZSBvZiB0aGVzZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfdm9pZF90eXBlIChoYW5kbGUpCi0gICAgIFBUUiBoYW5kbGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9WT0lELCAwKTsKLX0KLQotLyogTWFrZSBhbiBpbnRlZ2VyIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgVGhlIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZQotICAgaWYgdGhlIGludGVnZXIgaXMgdW5zaWduZWQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2ludF90eXBlIChoYW5kbGUsIHNpemUsIHVuc2lnbmVkcCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0lOVCwgc2l6ZSk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51LmtpbnQgPSB1bnNpZ25lZHA7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBmbG9hdGluZyBwb2ludCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gIEZJWE1FOiBPbiBzb21lCi0gICBwbGF0Zm9ybXMsIGxpa2UgYW4gQWxwaGEsIHlvdSBwcm9iYWJseSBuZWVkIHRvIGJlIGFibGUgdG8gc3BlY2lmeQotICAgdGhlIGZvcm1hdC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfZmxvYXRfdHlwZSAoaGFuZGxlLCBzaXplKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0ZMT0FULCBzaXplKTsKLX0KLQotLyogTWFrZSBhIGJvb2xlYW4gdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoaGFuZGxlLCBzaXplKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0JPT0wsIHNpemUpOwotfQotCi0vKiBNYWtlIGEgY29tcGxleCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfY29tcGxleF90eXBlIChoYW5kbGUsIHNpemUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQ09NUExFWCwgc2l6ZSk7Ci19Ci0KLS8qIE1ha2UgYSBzdHJ1Y3R1cmUgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdHJ1ZSBmb3IgYSBzdHJ1Y3QsCi0gICBmYWxzZSBmb3IgYSB1bmlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0LgotICAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICBiZmRfdm1hIHNpemU7Ci0gICAgIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLAotCQkgICAgICAgc3RydWN0cCA/IERFQlVHX0tJTkRfU1RSVUNUIDogREVCVUdfS0lORF9VTklPTiwKLQkJICAgICAgIHNpemUpOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgYyA9IChzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmMpOwotICBtZW1zZXQgKGMsIDAsIHNpemVvZiAqYyk7Ci0KLSAgYy0+ZmllbGRzID0gZmllbGRzOwotCi0gIHQtPnUua2NsYXNzID0gYzsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiBvYmplY3QgdHlwZS4gIFRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGhhbmRsZQotICAgYXJlIHRoZSBzYW1lIGFzIGZvciBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlLiAgVGhlIG5leHQgYXJndW1lbnRzIGFyZQotICAgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLCBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZgotICAgbWV0aG9kcywgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBob2xkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCi0gICBpZiBpdCBpcyBub3QgdGhpcyBvYmplY3QsIGFuZCBhIGJvb2xlYW4gd2hpY2ggaXMgdHJ1ZSBpZiB0aGlzCi0gICBvYmplY3QgaGFzIGl0cyBvd24gdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfb2JqZWN0X3R5cGUgKGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzLCBiYXNlY2xhc3NlcywKLQkJCW1ldGhvZHMsIHZwdHJiYXNlLCBvd252cHRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIGJmZF92bWEgc2l6ZTsKLSAgICAgZGVidWdfZmllbGQgKmZpZWxkczsKLSAgICAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgICAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICAgICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotICAgICBib29sZWFuIG93bnZwdHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLAotCQkgICAgICAgc3RydWN0cCA/IERFQlVHX0tJTkRfQ0xBU1MgOiBERUJVR19LSU5EX1VOSU9OX0NMQVNTLAotCQkgICAgICAgc2l6ZSk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBjID0gKHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYyk7Ci0gIG1lbXNldCAoYywgMCwgc2l6ZW9mICpjKTsKLQotICBjLT5maWVsZHMgPSBmaWVsZHM7Ci0gIGMtPmJhc2VjbGFzc2VzID0gYmFzZWNsYXNzZXM7Ci0gIGMtPm1ldGhvZHMgPSBtZXRob2RzOwotICBpZiAob3dudnB0cikKLSAgICBjLT52cHRyYmFzZSA9IHQ7Ci0gIGVsc2UKLSAgICBjLT52cHRyYmFzZSA9IHZwdHJiYXNlOwotCi0gIHQtPnUua2NsYXNzID0gYzsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiBlbnVtZXJhdGlvbiB0eXBlLiAgVGhlIGFyZ3VtZW50cyBhcmUgYSBudWxsIHRlcm1pbmF0ZWQKLSAgIGFycmF5IG9mIHN0cmluZ3MsIGFuZCBhbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfZW51bV90eXBlIChoYW5kbGUsIG5hbWVzLCB2YWx1ZXMpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgICAgYmZkX3NpZ25lZF92bWEgKnZhbHVlczsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUgKmU7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9FTlVNLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGUgPSAoc3RydWN0IGRlYnVnX2VudW1fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOwotICBtZW1zZXQgKGUsIDAsIHNpemVvZiAqZSk7Ci0KLSAgZS0+bmFtZXMgPSBuYW1lczsKLSAgZS0+dmFsdWVzID0gdmFsdWVzOwotCi0gIHQtPnUua2VudW0gPSBlOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgcG9pbnRlciB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAodHlwZS0+cG9pbnRlciAhPSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIHR5cGUtPnBvaW50ZXI7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9QT0lOVEVSLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua3BvaW50ZXIgPSB0eXBlOwotCi0gIHR5cGUtPnBvaW50ZXIgPSB0OwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgZ2l2ZW4gdHlwZS4gIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZQotICAgdG8gcmVjb3JkIHRoZSBwYXJhbWV0ZXIgdHlwZXMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGhhbmRsZSwgdHlwZSwgYXJnX3R5cGVzLCB2YXJhcmdzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uX3R5cGUgKmY7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfRlVOQ1RJT04sIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgZiA9IChzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+cmV0dXJuX3R5cGUgPSB0eXBlOwotICBmLT5hcmdfdHlwZXMgPSBhcmdfdHlwZXM7Ci0gIGYtPnZhcmFyZ3MgPSB2YXJhcmdzOwotCi0gIHQtPnUua2Z1bmN0aW9uID0gZjsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHJlZmVyZW5jZSB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfUkVGRVJFTkNFLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua3JlZmVyZW5jZSA9IHR5cGU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSByYW5nZSBvZiBhIGdpdmVuIHR5cGUgZnJvbSBhIGxvd2VyIHRvIGFuIHVwcGVyIGJvdW5kLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9yYW5nZV90eXBlIChoYW5kbGUsIHR5cGUsIGxvd2VyLCB1cHBlcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfcmFuZ2VfdHlwZSAqcjsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9SQU5HRSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICByID0gKHN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcik7Ci0gIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKLQotICByLT50eXBlID0gdHlwZTsKLSAgci0+bG93ZXIgPSBsb3dlcjsKLSAgci0+dXBwZXIgPSB1cHBlcjsKLQotICB0LT51LmtyYW5nZSA9IHI7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gYXJyYXkgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYW4gZWxlbWVudAotICAgb2YgdGhlIGFycmF5LiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGEgcmFuZ2Ugb2YgdGhlCi0gICBhcnJheS4gIFRoZSBmb3VydGggYW5kIGZpZnRoIGFyZ3VtZW50IGFyZSB0aGUgbG93ZXIgYW5kIHVwcGVyCi0gICBib3VuZHMsIHJlc3BlY3RpdmVseS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgYXJyYXkgaXMKLSAgIGFjdHVhbGx5IGEgc3RyaW5nLCBhcyBpbiBDLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9hcnJheV90eXBlIChoYW5kbGUsIGVsZW1lbnRfdHlwZSwgcmFuZ2VfdHlwZSwgbG93ZXIsIHVwcGVyLAotCQkgICAgICAgc3RyaW5ncCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSBlbGVtZW50X3R5cGU7Ci0gICAgIGRlYnVnX3R5cGUgcmFuZ2VfdHlwZTsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotICAgICBib29sZWFuIHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZSAqYTsKLQotICBpZiAoZWxlbWVudF90eXBlID09IE5VTEwgfHwgcmFuZ2VfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9BUlJBWSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBhID0gKHN0cnVjdCBkZWJ1Z19hcnJheV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYSk7Ci0gIG1lbXNldCAoYSwgMCwgc2l6ZW9mICphKTsKLQotICBhLT5lbGVtZW50X3R5cGUgPSBlbGVtZW50X3R5cGU7Ci0gIGEtPnJhbmdlX3R5cGUgPSByYW5nZV90eXBlOwotICBhLT5sb3dlciA9IGxvd2VyOwotICBhLT51cHBlciA9IHVwcGVyOwotICBhLT5zdHJpbmdwID0gc3RyaW5ncDsKLQotICB0LT51LmthcnJheSA9IGE7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgb2YgYSBnaXZlbiB0eXBlLiAgRm9yIGV4YW1wbGUsIGEgUGFzY2FsIHNldCB0eXBlLiAgVGhlCi0gICBib29sZWFuIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcyBzZXQgaXMgYWN0dWFsbHkgYSBiaXRzdHJpbmcsIGFzIGluCi0gICBDSElMTC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfc2V0X3R5cGUgKGhhbmRsZSwgdHlwZSwgYml0c3RyaW5ncCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBib29sZWFuIGJpdHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfc2V0X3R5cGUgKnM7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfU0VULCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHMgPSAoc3RydWN0IGRlYnVnX3NldF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcyk7Ci0gIG1lbXNldCAocywgMCwgc2l6ZW9mICpzKTsKLQotICBzLT50eXBlID0gdHlwZTsKLSAgcy0+Yml0c3RyaW5ncCA9IGJpdHN0cmluZ3A7Ci0KLSAgdC0+dS5rc2V0ID0gczsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHR5cGUgZm9yIGEgcG9pbnRlciB3aGljaCBpcyByZWxhdGl2ZSB0byBhbiBvYmplY3QuICBUaGUKLSAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBwb2ludGVyIGlzCi0gICByZWxhdGl2ZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSB0aGF0IHRoZSBwb2ludGVyIHBvaW50cwotICAgdG8uICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX29mZnNldF90eXBlIChoYW5kbGUsIGJhc2VfdHlwZSwgdGFyZ2V0X3R5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgYmFzZV90eXBlOwotICAgICBkZWJ1Z190eXBlIHRhcmdldF90eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX29mZnNldF90eXBlICpvOwotCi0gIGlmIChiYXNlX3R5cGUgPT0gTlVMTCB8fCB0YXJnZXRfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9PRkZTRVQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgbyA9IChzdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpvKTsKLSAgbWVtc2V0IChvLCAwLCBzaXplb2YgKm8pOwotCi0gIG8tPmJhc2VfdHlwZSA9IGJhc2VfdHlwZTsKLSAgby0+dGFyZ2V0X3R5cGUgPSB0YXJnZXRfdHlwZTsKLQotICB0LT51LmtvZmZzZXQgPSBvOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBtZXRob2QgZnVuY3Rpb24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQotICAgcmV0dXJuIHR5cGUsIHRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgZG9tYWluLCBhbmQgdGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX21ldGhvZF90eXBlIChoYW5kbGUsIHJldHVybl90eXBlLCBkb21haW5fdHlwZSwgYXJnX3R5cGVzLCB2YXJhcmdzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotICAgICBkZWJ1Z190eXBlIGRvbWFpbl90eXBlOwotICAgICBkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSAqbTsKLQotICBpZiAocmV0dXJuX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfTUVUSE9ELCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5yZXR1cm5fdHlwZSA9IHJldHVybl90eXBlOwotICBtLT5kb21haW5fdHlwZSA9IGRvbWFpbl90eXBlOwotICBtLT5hcmdfdHlwZXMgPSBhcmdfdHlwZXM7Ci0gIG0tPnZhcmFyZ3MgPSB2YXJhcmdzOwotCi0gIHQtPnUua21ldGhvZCA9IG07Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdmVyc2lvbiBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9DT05TVCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51Lmtjb25zdCA9IHR5cGU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSB2b2xhdGlsZSBxdWFsaWZpZWQgdmVyc2lvbiBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9WT0xBVElMRSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51Lmt2b2xhdGlsZSA9IHR5cGU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gdW5kZWZpbmVkIHRhZ2dlZCB0eXBlLiAgRm9yIGV4YW1wbGUsIGEgc3RydWN0IHdoaWNoIGhhcwotICAgYmVlbiBtZW50aW9uZWQsIGJ1dCBub3QgZGVmaW5lZC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlIChoYW5kbGUsIG5hbWUsIGtpbmQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfbWFrZV91bmRlZmluZWRfdHlwZTogdW5zdXBwb3J0ZWQga2luZCIpKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIGtpbmQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgcmV0dXJuIGRlYnVnX3RhZ190eXBlIChoYW5kbGUsIG5hbWUsIHQpOwotfQotCi0vKiBNYWtlIGEgYmFzZSBjbGFzcyBmb3IgYW4gb2JqZWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgYmFzZQotICAgY2xhc3MgdHlwZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgYml0IHBvc2l0aW9uIG9mIHRoaXMgYmFzZQotICAgY2xhc3MgaW4gdGhlIG9iamVjdCAoYWx3YXlzIDAgdW5sZXNzIGRvaW5nIG11bHRpcGxlIGluaGVyaXRhbmNlKS4KLSAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzIGEgdmlydHVhbCBjbGFzcy4gIFRoZSBmaWZ0aAotICAgYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX2Jhc2VjbGFzcwotZGVidWdfbWFrZV9iYXNlY2xhc3MgKGhhbmRsZSwgdHlwZSwgYml0cG9zLCB2aXJ0dWFsLCB2aXNpYmlsaXR5KQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17ICAgICAKLSAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqYjsKLQotICBiID0gKHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKLSAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOwotCi0gIGItPnR5cGUgPSB0eXBlOwotICBiLT5iaXRwb3MgPSBiaXRwb3M7Ci0gIGItPnZpcnR1YWwgPSB2aXJ0dWFsOwotICBiLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gYjsKLX0KLQotLyogTWFrZSBhIGZpZWxkIGZvciBhIHN0cnVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUuICBUaGUKLSAgIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIGZpZWxkLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mCi0gICB0aGUgZmllbGQgKGl0IG1heSBiZSB6ZXJvKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eQotICAgb2YgdGhlIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19maWVsZAotZGVidWdfbWFrZV9maWVsZCAoaGFuZGxlLCBuYW1lLCB0eXBlLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5uYW1lID0gbmFtZTsKLSAgZi0+dHlwZSA9IHR5cGU7Ci0gIGYtPnN0YXRpY19tZW1iZXIgPSBmYWxzZTsKLSAgZi0+dS5mLmJpdHBvcyA9IGJpdHBvczsKLSAgZi0+dS5mLmJpdHNpemUgPSBiaXRzaXplOwotICBmLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gZjsKLX0KLQotLyogTWFrZSBhIHN0YXRpYyBtZW1iZXIgb2YgYW4gb2JqZWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUKLSAgIG5hbWUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIG1lbWJlci4gIFRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBtZW1iZXIgKGkuZS4sIHRoZSBuYW1lIGFzIGEKLSAgIGdsb2JhbCB2YXJpYWJsZSkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlCi0gICBtZW1iZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX2ZpZWxkCi1kZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIgKGhhbmRsZSwgbmFtZSwgdHlwZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotICBmID0gKHN0cnVjdCBkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+bmFtZSA9IG5hbWU7Ci0gIGYtPnR5cGUgPSB0eXBlOwotICBmLT5zdGF0aWNfbWVtYmVyID0gdHJ1ZTsKLSAgZi0+dS5zLnBoeXNuYW1lID0gcGh5c25hbWU7Ci0gIGYtPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OwotCi0gIHJldHVybiBmOwotfQotCi0vKiBNYWtlIGEgbWV0aG9kLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZSwgYW5kIHRoZSB0aGlyZAotICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbWV0aG9kIHZhcmlhbnRzLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19tZXRob2QKLWRlYnVnX21ha2VfbWV0aG9kIChoYW5kbGUsIG5hbWUsIHZhcmlhbnRzKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX21ldGhvZF92YXJpYW50ICp2YXJpYW50czsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTsKLQotICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2QgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPm5hbWUgPSBuYW1lOwotICBtLT52YXJpYW50cyA9IHZhcmlhbnRzOwotCi0gIHJldHVybiBtOwotfQotCi0vKiBNYWtlIGEgbWV0aG9kIGFyZ3VtZW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcmVhbCBuYW1lIG9mCi0gICB0aGUgZnVuY3Rpb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhlCi0gICBmb3VydGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgd2hldGhlcgotICAgdGhpcyBpcyBhIGNvbnN0IGZ1bmN0aW9uLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhCi0gICB2b2xhdGlsZSBmdW5jdGlvbi4gIFRoZSBzZXZlbnRoIGFyZ3VtZW50IGlzIHRoZSBvZmZzZXQgaW4gdGhlCi0gICB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLCBpZiBhbnkuICBUaGUgZWlnaHRoIGFyZ3VtZW50IGlzIHRoZSB2aXJ0dWFsCi0gICBmdW5jdGlvbiBjb250ZXh0LiAgRklYTUU6IEFyZSB0aGUgY29uc3QgYW5kIHZvbGF0aWxlIGFyZ3VtZW50cwotICAgbmVjZXNzYXJ5PyAgQ291bGQgd2UganVzdCB1c2UgZGVidWdfbWFrZV9jb25zdF90eXBlPyAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19tZXRob2RfdmFyaWFudAotZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoaGFuZGxlLCBwaHlzbmFtZSwgdHlwZSwgdmlzaWJpbGl0eSwgY29uc3RwLAotCQkJICAgdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgZGVidWdfdHlwZSBjb250ZXh0OwotewotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKm07Ci0KLSAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPnBoeXNuYW1lID0gcGh5c25hbWU7Ci0gIG0tPnR5cGUgPSB0eXBlOwotICBtLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLSAgbS0+Y29uc3RwID0gY29uc3RwOwotICBtLT52b2xhdGlsZXAgPSB2b2xhdGlsZXA7Ci0gIG0tPnZvZmZzZXQgPSB2b2Zmc2V0OwotICBtLT5jb250ZXh0ID0gY29udGV4dDsKLQotICByZXR1cm4gbTsKLX0KLQotLyogTWFrZSBhIHN0YXRpYyBtZXRob2QgYXJndW1lbnQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IKLSAgIGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmUgb21pdHRlZAotICAgc2luY2UgYSBzdGF0aWMgbWV0aG9kIGNhbiBub3QgYWxzbyBiZSB2aXJ0dWFsLiAgKi8KLQotZGVidWdfbWV0aG9kX3ZhcmlhbnQKLWRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50IChoYW5kbGUsIHBoeXNuYW1lLCB0eXBlLCB2aXNpYmlsaXR5LAotCQkJCSAgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICptOwotCi0gIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5waHlzbmFtZSA9IHBoeXNuYW1lOwotICBtLT50eXBlID0gdHlwZTsKLSAgbS0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0gIG0tPmNvbnN0cCA9IGNvbnN0cDsKLSAgbS0+dm9sYXRpbGVwID0gdm9sYXRpbGVwOwotICBtLT52b2Zmc2V0ID0gVk9GRlNFVF9TVEFUSUNfTUVUSE9EOwotCi0gIHJldHVybiBtOwotfQotCi0vKiBOYW1lIGEgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX25hbWVfdHlwZSAoaGFuZGxlLCBuYW1lLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqbjsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm5tOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfbmFtZV90eXBlOiBubyBjdXJyZW50IGZpbGUiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX05BTUVELCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIG4gPSAoc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOwotCi0gIG4tPnR5cGUgPSB0eXBlOwotCi0gIHQtPnUua25hbWVkID0gbjsKLQotICAvKiBXZSBhbHdheXMgYWRkIHRoZSBuYW1lIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgVGhpcyBpcyBwcm9iYWJseQotICAgICB3cm9uZyBpbiBzb21lIGNhc2VzLCBidXQgaXQgc2VlbXMgdG8gYmUgcmlnaHQgZm9yIHN0YWJzLiAgRklYTUUuICAqLwotCi0gIG5tID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFscywgbmFtZSwKLQkJCSAgICAgICBERUJVR19PQkpFQ1RfVFlQRSwgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG5tID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5tLT51LnR5cGUgPSB0OwotCi0gIG4tPm5hbWUgPSBubTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogVGFnIGEgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX3RhZ190eXBlIChoYW5kbGUsIG5hbWUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICpuOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbm07Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAoaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3RhZ190eXBlOiBubyBjdXJyZW50IGZpbGUiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICh0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwgbmFtZSkgPT0gMCkKLQlyZXR1cm4gdHlwZTsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z190YWdfdHlwZTogZXh0cmEgdGFnIGF0dGVtcHRlZCIpKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfVEFHR0VELCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIG4gPSAoc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOwotCi0gIG4tPnR5cGUgPSB0eXBlOwotCi0gIHQtPnUua25hbWVkID0gbjsKLQotICAvKiBXZSBrZWVwIGEgZ2xvYmFsIG5hbWVzcGFjZSBvZiB0YWdzIGZvciBlYWNoIGNvbXBpbGF0aW9uIHVuaXQuICBJCi0gICAgIGRvbid0IGtub3cgaWYgdGhhdCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uICAqLwotCi0gIG5tID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFscywgbmFtZSwKLQkJCSAgICAgICBERUJVR19PQkpFQ1RfVEFHLCBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobm0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbm0tPnUudGFnID0gdDsKLQotICBuLT5uYW1lID0gbm07Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIFJlY29yZCB0aGUgc2l6ZSBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF90eXBlX3NpemUgKGhhbmRsZSwgdHlwZSwgc2l6ZSkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBpZiAodHlwZS0+c2l6ZSAhPSAwICYmIHR5cGUtPnNpemUgIT0gc2l6ZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIldhcm5pbmc6IGNoYW5naW5nIHR5cGUgc2l6ZSBmcm9tICVkIHRvICVkXG4iKSwKLQkgICAgIHR5cGUtPnNpemUsIHNpemUpOwotCi0gIHR5cGUtPnNpemUgPSBzaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5kIGEgbmFtZWQgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7Ci0gIHN0cnVjdCBkZWJ1Z19maWxlICpmOwotCi0gIC8qIFdlIG9ubHkgc2VhcmNoIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICBJIGRvbid0IGtub3cgaWYKLSAgICAgdGhpcyBpcyByaWdodCBvciBub3QuICAqLwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZmluZF9uYW1lZF90eXBlOiBubyBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBmb3IgKGIgPSBpbmZvLT5jdXJyZW50X2Jsb2NrOyBiICE9IE5VTEw7IGIgPSBiLT5wYXJlbnQpCi0gICAgewotICAgICAgaWYgKGItPmxvY2FscyAhPSBOVUxMKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBmb3IgKG4gPSBiLT5sb2NhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAobi0+a2luZCA9PSBERUJVR19PQkpFQ1RfVFlQRQotCQkgICYmIG4tPm5hbWVbMF0gPT0gbmFtZVswXQotCQkgICYmIHN0cmNtcCAobi0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJcmV0dXJuIG4tPnUudHlwZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yIChmID0gaW5mby0+Y3VycmVudF91bml0LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+Z2xvYmFscyAhPSBOVUxMKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBmb3IgKG4gPSBmLT5nbG9iYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKG4tPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RZUEUKLQkJICAmJiBuLT5uYW1lWzBdID09IG5hbWVbMF0KLQkJICAmJiBzdHJjbXAgKG4tPm5hbWUsIG5hbWUpID09IDApCi0JCXJldHVybiBuLT51LnR5cGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBERUJVR19UWVBFX05VTEw7CSAgCi19Ci0KLS8qIEZpbmQgYSB0YWdnZWQgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGhhbmRsZSwgbmFtZSwga2luZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3VuaXQgKnU7Ci0KLSAgLyogV2Ugc2VhcmNoIHRoZSBnbG9iYWxzIG9mIGFsbCB0aGUgY29tcGlsYXRpb24gdW5pdHMuICBJIGRvbid0IGtub3cKLSAgICAgaWYgdGhpcyBpcyBjb3JyZWN0IG9yIG5vdC4gIEl0IHdvdWxkIGJlIGVhc3kgdG8gY2hhbmdlLiAgKi8KLQotICBmb3IgKHUgPSBpbmZvLT51bml0czsgdSAhPSBOVUxMOyB1ID0gdS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfZmlsZSAqZjsKLQotICAgICAgZm9yIChmID0gdS0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JewotCSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLQkgIGlmIChmLT5nbG9iYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKG4gPSBmLT5nbG9iYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQl7Ci0JCSAgaWYgKG4tPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RBRwotCQkgICAgICAmJiAoa2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwKLQkJCSAgfHwgbi0+dS50YWctPmtpbmQgPT0ga2luZCkKLQkJICAgICAgJiYgbi0+bmFtZVswXSA9PSBuYW1lWzBdCi0JCSAgICAgICYmIHN0cmNtcCAobi0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJICAgIHJldHVybiBuLT51LnRhZzsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotfQotCi0vKiBHZXQgYSBiYXNlIHR5cGUuICBXZSBidWlsZCBhIGxpbmtlZCBsaXN0IG9uIHRoZSBzdGFjayB0byBhdm9pZAotICAgY3Jhc2hpbmcgaWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBjaXJjdWxhcmx5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICoKLWRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgbGlzdCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKmxpc3Q7Ci17Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCAqbDsKLSAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0IHJsOwotCi0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0eXBlOwotCi0gICAgY2FzZSBERUJVR19LSU5EX0lORElSRUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGZvciAobCA9IGxpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnQgPT0gdHlwZSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgIF8oImRlYnVnX2dldF9yZWFsX3R5cGU6IGNpcmN1bGFyIGRlYnVnIGluZm9ybWF0aW9uIGZvciAlc1xuIiksCi0JCSAgIGRlYnVnX2dldF90eXBlX25hbWUgKGhhbmRsZSwgdHlwZSkpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICBybC5uZXh0ID0gbGlzdDsKLSAgcmwudCA9IHR5cGU7Ci0KLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICAgIC8qIFRoZSBkZWZhdWx0IGNhc2UgaXMganVzdCBoZXJlIHRvIGF2b2lkIHdhcm5pbmdzLiAgKi8KLSAgICBkZWZhdWx0OgotICAgIGNhc2UgREVCVUdfS0lORF9JTkRJUkVDVDoKLSAgICAgIGlmICgqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QgIT0gTlVMTCkKLQlyZXR1cm4gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCAqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QsICZybCk7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIHJldHVybiBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlLCAmcmwpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSBraW5kIG9mIGEgdHlwZS4gICovCi0KLWVudW0gZGVidWdfdHlwZV9raW5kCi1kZWJ1Z19nZXRfdHlwZV9raW5kIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfS0lORF9JTExFR0FMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfS0lORF9JTExFR0FMOwotICByZXR1cm4gdHlwZS0+a2luZDsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgdHlwZS4gICovCi0KLWNvbnN0IGNoYXIgKgotZGVidWdfZ2V0X3R5cGVfbmFtZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgaWYgKCp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCAhPSBOVUxMKQotCXJldHVybiBkZWJ1Z19nZXRfdHlwZV9uYW1lIChoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCk7Ci0gICAgICByZXR1cm4gdHlwZS0+dS5raW5kaXJlY3QtPnRhZzsKLSAgICB9Ci0gIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgcmV0dXJuIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIGEgdHlwZS4gICovCi0KLWJmZF92bWEKLWRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIGRvbid0IGNhbGwgZGVidWdfZ2V0X3JlYWxfdHlwZSwgYmVjYXVzZSBzb21lYm9keSBtaWdodCBoYXZlCi0gICAgIGNhbGxlZCBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIG9uIGEgbmFtZWQgb3IgaW5kaXJlY3QgdHlwZS4gICovCi0KLSAgaWYgKHR5cGUtPnNpemUgIT0gMCkKLSAgICByZXR1cm4gdHlwZS0+c2l6ZTsKLQotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6Ci0gICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ICE9IE5VTEwpCi0JcmV0dXJuIGRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgKnR5cGUtPnUua2luZGlyZWN0LT5zbG90KTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgcmV0dXJuIGRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfZ2V0X3JldHVybl90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgIHJldHVybiB0eXBlLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGU7Ci0gICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKLSAgICAgIHJldHVybiB0eXBlLT51LmttZXRob2QtPnJldHVybl90eXBlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8gICAgICAKLX0KLQotLyogR2V0IHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZSAoZXhjZXB0IHRoYXQKLSAgIHdlIGRvbid0IGN1cnJlbnRseSBzdG9yZSB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIGEgZnVuY3Rpb24pLiAgKi8KLQotY29uc3QgZGVidWdfdHlwZSAqCi1kZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIChoYW5kbGUsIHR5cGUsIHB2YXJhcmdzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJvb2xlYW4gKnB2YXJhcmdzOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OOgotICAgICAgKnB2YXJhcmdzID0gdHlwZS0+dS5rZnVuY3Rpb24tPnZhcmFyZ3M7Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlczsKLSAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgotICAgICAgKnB2YXJhcmdzID0gdHlwZS0+dS5rbWV0aG9kLT52YXJhcmdzOwotICAgICAgcmV0dXJuIHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSB0YXJnZXQgdHlwZSBvZiBhIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX1BPSU5URVI6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rcG9pbnRlcjsKLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgcmV0dXJuIHR5cGUtPnUua3JlZmVyZW5jZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rY29uc3Q7Ci0gICAgY2FzZSBERUJVR19LSU5EX1ZPTEFUSUxFOgotICAgICAgcmV0dXJuIHR5cGUtPnUua3ZvbGF0aWxlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzIGZvciBhIHN0cnVjdCwgdW5pb24sIG9yCi0gICBjbGFzcy4gICovCi0KLWNvbnN0IGRlYnVnX2ZpZWxkICoKLWRlYnVnX2dldF9maWVsZHMgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIHJldHVybiB0eXBlLT51LmtjbGFzcy0+ZmllbGRzOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSB0eXBlIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX3R5cGUKLWRlYnVnX2dldF9maWVsZF90eXBlIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGZpZWxkLT50eXBlOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotY29uc3QgY2hhciAqCi1kZWJ1Z19nZXRfZmllbGRfbmFtZSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBmaWVsZC0+bmFtZTsKLX0KLQotLyogR2V0IHRoZSBiaXQgcG9zaXRpb24gb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3ZtYQotZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwgfHwgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSAgcmV0dXJuIGZpZWxkLT51LmYuYml0cG9zOwotfQotCi0vKiBHZXQgdGhlIGJpdCBzaXplIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJmZF92bWEKLWRlYnVnX2dldF9maWVsZF9iaXRzaXplIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCB8fCBmaWVsZC0+c3RhdGljX21lbWJlcikKLSAgICByZXR1cm4gKGJmZF92bWEpIC0xOwotICByZXR1cm4gZmllbGQtPnUuZi5iaXRzaXplOwotfQotCi0vKiBHZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotZW51bSBkZWJ1Z192aXNpYmlsaXR5Ci1kZWJ1Z19nZXRfZmllbGRfdmlzaWJpbGl0eSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOwotICByZXR1cm4gZmllbGQtPnZpc2liaWxpdHk7Ci19Ci0KLS8qIEdldCB0aGUgcGh5c2ljYWwgbmFtZSBvZiBhIGZpZWxkLiAgKi8KLQotY29uc3QgY2hhciAqCi1kZWJ1Z19nZXRfZmllbGRfcGh5c25hbWUgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMIHx8ICEgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBmaWVsZC0+dS5zLnBoeXNuYW1lOwotfQotDAotLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGlzIGdpdmVuIGEgaGFuZGxlIHRvCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGFuZCBhIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyB0byBjYWxsLiAgKi8KLQotYm9vbGVhbgotZGVidWdfd3JpdGUgKGhhbmRsZSwgZm5zLCBmaGFuZGxlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqdTsKLQotICAvKiBXZSB1c2UgYSBtYXJrIHRvIHRlbGwgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgYQotICAgICBwYXJ0aWN1bGFyIG5hbWUuICBXZSB1c2UgYW4gaW50ZWdlciwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvCi0gICAgIGNsZWFyIHRoZSBtYXJrIGZpZWxkcyBpZiB3ZSBoYXBwZW4gdG8gd3JpdGUgb3V0IHRoZSBzYW1lCi0gICAgIGluZm9ybWF0aW9uIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgKytpbmZvLT5tYXJrOwotCi0gIC8qIFRoZSBiYXNlX2lkIGZpZWxkIGhvbGRzIGFuIElEIHZhbHVlIHdoaWNoIHdpbGwgbmV2ZXIgYmUgdXNlZCwgc28KLSAgICAgdGhhdCB3ZSBjYW4gdGVsbCB3aGV0aGVyIHdlIGhhdmUgYXNzaWduZWQgYW4gSUQgZHVyaW5nIHRoaXMgY2FsbAotICAgICB0byBkZWJ1Z193cml0ZS4gICovCi0gIGluZm8tPmJhc2VfaWQgPSBpbmZvLT5jbGFzc19pZDsKLQotICAvKiBXZSBrZWVwIGEgbGlua2VkIGxpc3Qgb2YgY2xhc3NlcyBmb3Igd2hpY2ggd2FzIGhhdmUgYXNzaWduZWQgSUQncwotICAgICBkdXJpbmcgdGhpcyBjYWxsIHRvIGRlYnVnX3dyaXRlLiAgKi8KLSAgaW5mby0+aWRfbGlzdCA9IE5VTEw7Ci0KLSAgZm9yICh1ID0gaW5mby0+dW5pdHM7IHUgIT0gTlVMTDsgdSA9IHUtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2ZpbGUgKmY7Ci0gICAgICBib29sZWFuIGZpcnN0X2ZpbGU7Ci0KLSAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vID0gdS0+bGluZW5vczsKLSAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4ID0gMDsKLQotICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X2NvbXBpbGF0aW9uX3VuaXQpIChmaGFuZGxlLCB1LT5maWxlcy0+ZmlsZW5hbWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZmlyc3RfZmlsZSA9IHRydWU7Ci0gICAgICBmb3IgKGYgPSB1LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotCSAgaWYgKGZpcnN0X2ZpbGUpCi0JICAgIGZpcnN0X2ZpbGUgPSBmYWxzZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgqZm5zLT5zdGFydF9zb3VyY2UpIChmaGFuZGxlLCBmLT5maWxlbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoZi0+Z2xvYmFscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChuID0gZi0+Z2xvYmFscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJewotCQkgIGlmICghIGRlYnVnX3dyaXRlX25hbWUgKGluZm8sIGZucywgZmhhbmRsZSwgbikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogT3V0cHV0IGFueSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aGljaCBoYXNuJ3QgYWxyZWFkeSBiZWVuCi0gICAgICAgICBoYW5kbGVkLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgKGJmZF92bWEpIC0xKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gZWxlbWVudCBpbiBhIG5hbWVzcGFjZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9uYW1lIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4pCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotewotICBzd2l0Y2ggKG4tPmtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RZUEU6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudHlwZSwgbikKLQkgIHx8ICEgKCpmbnMtPnR5cGRlZikgKGZoYW5kbGUsIG4tPm5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RBRzoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS50YWcsIG4pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+dGFnKSAoZmhhbmRsZSwgbi0+bmFtZSk7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVkFSSUFCTEU6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudmFyaWFibGUtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT52YXJpYWJsZSkgKGZoYW5kbGUsIG4tPm5hbWUsIG4tPnUudmFyaWFibGUtPmtpbmQsCi0JCQkgICAgICAgbi0+dS52YXJpYWJsZS0+dmFsKTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9GVU5DVElPTjoKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV9mdW5jdGlvbiAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT5uYW1lLAotCQkJCSAgIG4tPmxpbmthZ2UsIG4tPnUuZnVuY3Rpb24pOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVDoKLSAgICAgIHJldHVybiAoKmZucy0+aW50X2NvbnN0YW50KSAoZmhhbmRsZSwgbi0+bmFtZSwgbi0+dS5pbnRfY29uc3RhbnQpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX0ZMT0FUX0NPTlNUQU5UOgotICAgICAgcmV0dXJuICgqZm5zLT5mbG9hdF9jb25zdGFudCkgKGZoYW5kbGUsIG4tPm5hbWUsIG4tPnUuZmxvYXRfY29uc3RhbnQpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5UOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnR5cGVkX2NvbnN0YW50LT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+dHlwZWRfY29uc3RhbnQpIChmaGFuZGxlLCBuLT5uYW1lLAotCQkJCSAgICAgbi0+dS50eXBlZF9jb25zdGFudC0+dmFsKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBXcml0ZSBvdXQgYSB0eXBlLiAgSWYgdGhlIHR5cGUgaXMgREVCVUdfS0lORF9OQU1FRCBvcgotICAgREVCVUdfS0lORF9UQUdHRUQsIHRoZW4gdGhlIG5hbWUgYXJndW1lbnQgaXMgdGhlIG5hbWUgZm9yIHdoaWNoIHdlCi0gICBhcmUgYWJvdXQgdG8gY2FsbCB0eXBlZGVmIG9yIHRhZy4gIElmIHRoZSB0eXBlIGlzIGFueXRoaW5nIGVsc2UsCi0gICB0aGVuIHRoZSBuYW1lIGFyZ3VtZW50IGlzIGEgdGFnIGZyb20gYSBERUJVR19LSU5EX1RBR0dFRCB0eXBlIHdoaWNoCi0gICBwb2ludHMgdG8gdGhpcyBvbmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLCBuYW1lKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgICAgc3RydWN0IGRlYnVnX25hbWUgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgaXM7Ci0gIGNvbnN0IGNoYXIgKnRhZyA9IE5VTEw7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhIG5hbWUgZm9yIHRoaXMgdHlwZSwganVzdCBvdXRwdXQgaXQuICBXZSBvbmx5IG91dHB1dAotICAgICB0eXBlZGVmIG5hbWVzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGRlZmluZWQuICBXZSBvdXRwdXQgdHlwZSB0YWdzCi0gICAgIHdoZW5ldmVyIHdlIGFyZSBub3QgYWN0dWFsbHkgZGVmaW5pbmcgdGhlbS4gICovCi0gIGlmICgodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX05BTUVECi0gICAgICAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRCkKLSAgICAgICYmICh0eXBlLT51LmtuYW1lZC0+bmFtZS0+bWFyayA9PSBpbmZvLT5tYXJrCi0JICB8fCAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRAotCSAgICAgICYmIHR5cGUtPnUua25hbWVkLT5uYW1lICE9IG5hbWUpKSkKLSAgICB7Ci0gICAgICBpZiAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX05BTUVEKQotCXJldHVybiAoKmZucy0+dHlwZWRlZl90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBkZWJ1Z190eXBlICpyZWFsOwotCSAgdW5zaWduZWQgaW50IGlkOwotCi0JICByZWFsID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoKFBUUikgaW5mbywgdHlwZSwgTlVMTCk7Ci0JICBpZiAocmVhbCA9PSBOVUxMKQotCSAgICByZXR1cm4gKCpmbnMtPmVtcHR5X3R5cGUpIChmaGFuZGxlKTsKLQkgIGlkID0gMDsKLQkgIGlmICgocmVhbC0+a2luZCA9PSBERUJVR19LSU5EX1NUUlVDVAotCSAgICAgICB8fCByZWFsLT5raW5kID09IERFQlVHX0tJTkRfVU5JT04KLQkgICAgICAgfHwgcmVhbC0+a2luZCA9PSBERUJVR19LSU5EX0NMQVNTCi0JICAgICAgIHx8IHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTl9DTEFTUykKLQkgICAgICAmJiByZWFsLT51LmtjbGFzcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHJlYWwtPnUua2NsYXNzLT5pZCA8PSBpbmZvLT5iYXNlX2lkKQotCQl7Ci0JCSAgaWYgKCEgZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLAotCQkJCQkgICAgdHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsCi0JCQkJCSAgICByZWFsKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGlkID0gcmVhbC0+dS5rY2xhc3MtPmlkOwotCSAgICB9Ci0KLQkgIHJldHVybiAoKmZucy0+dGFnX3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwgaWQsCi0JCQkJICAgcmVhbC0+a2luZCk7Ci0JfQotICAgIH0KLQotICAvKiBNYXJrIHRoZSBuYW1lIGFmdGVyIHdlIGhhdmUgYWxyZWFkeSBsb29rZWQgZm9yIGEga25vd24gbmFtZSwgc28KLSAgICAgdGhhdCB3ZSBkb24ndCBqdXN0IGRlZmluZSBhIHR5cGUgaW4gdGVybXMgb2YgaXRzZWxmLiAgV2UgbmVlZCB0bwotICAgICBtYXJrIHRoZSBuYW1lIGhlcmUgc28gdGhhdCBhIHN0cnVjdCBjb250YWluaW5nIGEgcG9pbnRlciB0bwotICAgICBpdHNlbGYgd2lsbCB3b3JrLiAgKi8KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICBuYW1lLT5tYXJrID0gaW5mby0+bWFyazsKLQotICBpZiAobmFtZSAhPSBOVUxMCi0gICAgICAmJiB0eXBlLT5raW5kICE9IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgICYmIHR5cGUtPmtpbmQgIT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgewotICAgICAgYXNzZXJ0IChuYW1lLT5raW5kID09IERFQlVHX09CSkVDVF9UQUcpOwotICAgICAgdGFnID0gbmFtZS0+bmFtZTsKLSAgICB9Ci0KLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBjYXNlIERFQlVHX0tJTkRfSUxMRUdBTDoKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z193cml0ZV90eXBlOiBpbGxlZ2FsIHR5cGUgZW5jb3VudGVyZWQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lORElSRUNUOgotICAgICAgaWYgKCp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuICgqZm5zLT5lbXB0eV90eXBlKSAoZmhhbmRsZSk7Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCAqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QsCi0JCQkgICAgICAgbmFtZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1ZPSUQ6Ci0gICAgICByZXR1cm4gKCpmbnMtPnZvaWRfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9JTlQ6Ci0gICAgICByZXR1cm4gKCpmbnMtPmludF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSwgdHlwZS0+dS5raW50KTsKLSAgICBjYXNlIERFQlVHX0tJTkRfRkxPQVQ6Ci0gICAgICByZXR1cm4gKCpmbnMtPmZsb2F0X3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09NUExFWDoKLSAgICAgIHJldHVybiAoKmZucy0+Y29tcGxleF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0JPT0w6Ci0gICAgICByZXR1cm4gKCpmbnMtPmJvb2xfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUpOwotICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwpCi0JewotCSAgaWYgKHR5cGUtPnUua2NsYXNzLT5pZCA8PSBpbmZvLT5iYXNlX2lkKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLCB0YWcsIHR5cGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGluZm8tPm1hcmsgPT0gdHlwZS0+dS5rY2xhc3MtPm1hcmspCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmUgY3VycmVudGx5IG91dHB1dHRpbmcgdGhpcyBzdHJ1Y3QsIG9yIHdlIGhhdmUKLQkJIGFscmVhZHkgb3V0cHV0IGl0LiAgSSBkb24ndCBrbm93IGlmIHRoaXMgY2FuIGhhcHBlbiwKLQkJIGJ1dCBpdCBjYW4gaGFwcGVuIGZvciBhIGNsYXNzLiAgKi8KLQkgICAgICBhc3NlcnQgKHR5cGUtPnUua2NsYXNzLT5pZCA+IGluZm8tPmJhc2VfaWQpOwotCSAgICAgIHJldHVybiAoKmZucy0+dGFnX3R5cGUpIChmaGFuZGxlLCB0YWcsIHR5cGUtPnUua2NsYXNzLT5pZCwKLQkJCQkgICAgICAgdHlwZS0+a2luZCk7Ci0JICAgIH0KLQkgIHR5cGUtPnUua2NsYXNzLT5tYXJrID0gaW5mby0+bWFyazsKLQl9Ci0KLSAgICAgIGlmICghICgqZm5zLT5zdGFydF9zdHJ1Y3RfdHlwZSkgKGZoYW5kbGUsIHRhZywKLQkJCQkgICAgICAgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwKLQkJCQkJPyB0eXBlLT51LmtjbGFzcy0+aWQKLQkJCQkJOiAwKSwKLQkJCQkgICAgICAgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1NUUlVDVCwKLQkJCQkgICAgICAgdHlwZS0+c2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwKLQkgICYmIHR5cGUtPnUua2NsYXNzLT5maWVsZHMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotCSAgICAgIGYgPSB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldOwotCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgZi0+dHlwZSwKLQkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKLQkJICB8fCAhICgqZm5zLT5zdHJ1Y3RfZmllbGQpIChmaGFuZGxlLCBmLT5uYW1lLCBmLT51LmYuYml0cG9zLAotCQkJCQkgICAgIGYtPnUuZi5iaXRzaXplLCBmLT52aXNpYmlsaXR5KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuICgqZm5zLT5lbmRfc3RydWN0X3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZSwgdGFnKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfRU5VTToKLSAgICAgIGlmICh0eXBlLT51LmtlbnVtID09IE5VTEwpCi0JcmV0dXJuICgqZm5zLT5lbnVtX3R5cGUpIChmaGFuZGxlLCB0YWcsIChjb25zdCBjaGFyICoqKSBOVUxMLAotCQkJCSAgKGJmZF9zaWduZWRfdm1hICopIE5VTEwpOwotICAgICAgcmV0dXJuICgqZm5zLT5lbnVtX3R5cGUpIChmaGFuZGxlLCB0YWcsIHR5cGUtPnUua2VudW0tPm5hbWVzLAotCQkJCXR5cGUtPnUua2VudW0tPnZhbHVlcyk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1BPSU5URVI6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3BvaW50ZXIsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5wb2ludGVyX3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT046Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkgICAgICB0eXBlLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQlpcyA9IC0xOwotICAgICAgZWxzZQotCXsKLQkgIGZvciAoaXMgPSAwOyB0eXBlLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzW2lzXSAhPSBOVUxMOyBpcysrKQotCSAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJICAgIHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXNbaXNdLAotCQkJCSAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHJldHVybiAoKmZucy0+ZnVuY3Rpb25fdHlwZSkgKGZoYW5kbGUsIGlzLAotCQkJCSAgICB0eXBlLT51LmtmdW5jdGlvbi0+dmFyYXJncyk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1JFRkVSRU5DRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rcmVmZXJlbmNlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+cmVmZXJlbmNlX3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfUkFOR0U6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3JhbmdlLT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+cmFuZ2VfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua3JhbmdlLT5sb3dlciwKLQkJCQkgdHlwZS0+dS5rcmFuZ2UtPnVwcGVyKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQVJSQVk6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua2FycmF5LT5lbGVtZW50X3R5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKLQkgIHx8ICEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSB0eXBlLT51LmthcnJheS0+cmFuZ2VfdHlwZSwKLQkJCQkgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+YXJyYXlfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua2FycmF5LT5sb3dlciwKLQkJCQkgdHlwZS0+dS5rYXJyYXktPnVwcGVyLAotCQkJCSB0eXBlLT51LmthcnJheS0+c3RyaW5ncCk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NFVDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rc2V0LT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+c2V0X3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtzZXQtPmJpdHN0cmluZ3ApOwotICAgIGNhc2UgREVCVUdfS0lORF9PRkZTRVQ6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua29mZnNldC0+YmFzZV90eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCi0JICB8fCAhIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgdHlwZS0+dS5rb2Zmc2V0LT50YXJnZXRfdHlwZSwKLQkJCQkgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+b2Zmc2V0X3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJICAgICAgdHlwZS0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodHlwZS0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQlpcyA9IC0xOwotICAgICAgZWxzZQotCXsKLQkgIGZvciAoaXMgPSAwOyB0eXBlLT51LmttZXRob2QtPmFyZ190eXBlc1tpc10gIT0gTlVMTDsgaXMrKykKLQkgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSAgICB0eXBlLT51LmttZXRob2QtPmFyZ190eXBlc1tpc10sCi0JCQkJICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHR5cGUtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUgIT0gTlVMTCkKLQl7Ci0JICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJICB0eXBlLT51LmttZXRob2QtPmRvbWFpbl90eXBlLAotCQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcmV0dXJuICgqZm5zLT5tZXRob2RfdHlwZSkgKGZoYW5kbGUsCi0JCQkJICB0eXBlLT51LmttZXRob2QtPmRvbWFpbl90eXBlICE9IE5VTEwsCi0JCQkJICBpcywKLQkJCQkgIHR5cGUtPnUua21ldGhvZC0+dmFyYXJncyk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0NPTlNUOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51Lmtjb25zdCwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPmNvbnN0X3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfVk9MQVRJTEU6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3ZvbGF0aWxlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+dm9sYXRpbGVfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlLAotCQkJICAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUsCi0JCQkgICAgICAgdHlwZS0+dS5rbmFtZWQtPm5hbWUpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCBhIGNsYXNzIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfY2xhc3NfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLCB0YWcpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgaWQ7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp2cHRyYmFzZTsKLQotICBpZiAodHlwZS0+dS5rY2xhc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZCA9IDA7Ci0gICAgICB2cHRyYmFzZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5pZCA8PSBpbmZvLT5iYXNlX2lkKQotCXsKLQkgIGlmICghIGRlYnVnX3NldF9jbGFzc19pZCAoaW5mbywgdGFnLCB0eXBlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGluZm8tPm1hcmsgPT0gdHlwZS0+dS5rY2xhc3MtPm1hcmspCi0JewotCSAgLyogV2UgYXJlIGN1cnJlbnRseSBvdXRwdXR0aW5nIHRoaXMgY2xhc3MsIG9yIHdlIGhhdmUKLQkgICAgIGFscmVhZHkgb3V0cHV0IGl0LiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlcmUgYXJlCi0JICAgICBtZXRob2RzIGZvciBhbiBhbm9ueW1vdXMgY2xhc3MuICAqLwotCSAgYXNzZXJ0ICh0eXBlLT51LmtjbGFzcy0+aWQgPiBpbmZvLT5iYXNlX2lkKTsKLQkgIHJldHVybiAoKmZucy0+dGFnX3R5cGUpIChmaGFuZGxlLCB0YWcsIHR5cGUtPnUua2NsYXNzLT5pZCwKLQkJCQkgICB0eXBlLT5raW5kKTsKLQl9Ci0gICAgICB0eXBlLT51LmtjbGFzcy0+bWFyayA9IGluZm8tPm1hcms7Ci0gICAgICBpZCA9IHR5cGUtPnUua2NsYXNzLT5pZDsKLQotICAgICAgdnB0cmJhc2UgPSB0eXBlLT51LmtjbGFzcy0+dnB0cmJhc2U7Ci0gICAgICBpZiAodnB0cmJhc2UgIT0gTlVMTCAmJiB2cHRyYmFzZSAhPSB0eXBlKQotCXsKLQkgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdnB0cmJhc2UsCi0JCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICghICgqZm5zLT5zdGFydF9jbGFzc190eXBlKSAoZmhhbmRsZSwgdGFnLCBpZCwKLQkJCQkgIHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9DTEFTUywKLQkJCQkgIHR5cGUtPnNpemUsCi0JCQkJICB2cHRyYmFzZSAhPSBOVUxMLAotCQkJCSAgdnB0cmJhc2UgPT0gdHlwZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh0eXBlLT51LmtjbGFzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcy0+ZmllbGRzICE9IE5VTEwpCi0JewotCSAgZm9yIChpID0gMDsgdHlwZS0+dS5rY2xhc3MtPmZpZWxkc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfZmllbGQgKmY7Ci0KLQkgICAgICBmID0gdHlwZS0+dS5rY2xhc3MtPmZpZWxkc1tpXTsKLQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGYtPnR5cGUsCi0JCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGYtPnN0YXRpY19tZW1iZXIpCi0JCXsKLQkJICBpZiAoISAoKmZucy0+Y2xhc3Nfc3RhdGljX21lbWJlcikgKGZoYW5kbGUsIGYtPm5hbWUsCi0JCQkJCQkgICAgIGYtPnUucy5waHlzbmFtZSwKLQkJCQkJCSAgICAgZi0+dmlzaWJpbGl0eSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISAoKmZucy0+c3RydWN0X2ZpZWxkKSAoZmhhbmRsZSwgZi0+bmFtZSwgZi0+dS5mLmJpdHBvcywKLQkJCQkJICAgICAgZi0+dS5mLmJpdHNpemUsIGYtPnZpc2liaWxpdHkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcy0+YmFzZWNsYXNzZXMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+YmFzZWNsYXNzZXNbaV0gIT0gTlVMTDsgaSsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqYjsKLQotCSAgICAgIGIgPSB0eXBlLT51LmtjbGFzcy0+YmFzZWNsYXNzZXNbaV07Ci0JICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBiLT50eXBlLAotCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19iYXNlY2xhc3MpIChmaGFuZGxlLCBiLT5iaXRwb3MsIGItPnZpcnR1YWwsCi0JCQkJCSAgICAgYi0+dmlzaWJpbGl0eSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5tZXRob2RzICE9IE5VTEwpCi0JewotCSAgZm9yIChpID0gMDsgdHlwZS0+dS5rY2xhc3MtPm1ldGhvZHNbaV0gIT0gTlVMTDsgaSsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTsKLQkgICAgICB1bnNpZ25lZCBpbnQgajsKLQotCSAgICAgIG0gPSB0eXBlLT51LmtjbGFzcy0+bWV0aG9kc1tpXTsKLQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3Nfc3RhcnRfbWV0aG9kKSAoZmhhbmRsZSwgbS0+bmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBmb3IgKGogPSAwOyBtLT52YXJpYW50c1tqXSAhPSBOVUxMOyBqKyspCi0JCXsKLQkJICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnY7Ci0KLQkJICB2ID0gbS0+dmFyaWFudHNbal07Ci0JCSAgaWYgKHYtPmNvbnRleHQgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB2LT5jb250ZXh0LAotCQkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB2LT50eXBlLAotCQkJCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpZiAodi0+dm9mZnNldCAhPSBWT0ZGU0VUX1NUQVRJQ19NRVRIT0QpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19tZXRob2RfdmFyaWFudCkgKGZoYW5kbGUsIHYtPnBoeXNuYW1lLAotCQkJCQkJCSAgdi0+dmlzaWJpbGl0eSwKLQkJCQkJCQkgIHYtPmNvbnN0cCwKLQkJCQkJCQkgIHYtPnZvbGF0aWxlcCwKLQkJCQkJCQkgIHYtPnZvZmZzZXQsCi0JCQkJCQkJICB2LT5jb250ZXh0ICE9IE5VTEwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCkgKGZoYW5kbGUsCi0JCQkJCQkJCSB2LT5waHlzbmFtZSwKLQkJCQkJCQkJIHYtPnZpc2liaWxpdHksCi0JCQkJCQkJCSB2LT5jb25zdHAsCi0JCQkJCQkJCSB2LT52b2xhdGlsZXApKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX2VuZF9tZXRob2QpIChmaGFuZGxlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gKCpmbnMtPmVuZF9jbGFzc190eXBlKSAoZmhhbmRsZSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9mdW5jdGlvbiAoaW5mbywgZm5zLCBmaGFuZGxlLCBuYW1lLCBsaW5rYWdlLCBmdW5jdGlvbikKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotICAgICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmZ1bmN0aW9uOwotewotICBzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICpwOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBmdW5jdGlvbi0+YmxvY2tzLT5zdGFydCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgZnVuY3Rpb24tPnJldHVybl90eXBlLAotCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghICgqZm5zLT5zdGFydF9mdW5jdGlvbikgKGZoYW5kbGUsIG5hbWUsCi0JCQkJbGlua2FnZSA9PSBERUJVR19MSU5LQUdFX0dMT0JBTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAocCA9IGZ1bmN0aW9uLT5wYXJhbWV0ZXJzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgcC0+dHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCSAgfHwgISAoKmZucy0+ZnVuY3Rpb25fcGFyYW1ldGVyKSAoZmhhbmRsZSwgcC0+bmFtZSwgcC0+a2luZCwgcC0+dmFsKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGZvciAoYiA9IGZ1bmN0aW9uLT5ibG9ja3M7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfYmxvY2sgKGluZm8sIGZucywgZmhhbmRsZSwgYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gKCpmbnMtPmVuZF9mdW5jdGlvbikgKGZoYW5kbGUpOwotfQotCi0vKiBXcml0ZSBvdXQgaW5mb3JtYXRpb24gZm9yIGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfYmxvY2sgKGluZm8sIGZucywgZmhhbmRsZSwgYmxvY2spCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z19ibG9jayAqYmxvY2s7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBibG9jay0+c3RhcnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJIGNhbid0IHNlZSBhbnkgcG9pbnQgdG8gd3JpdGluZyBvdXQgYSBibG9jayB3aXRoIG5vIGxvY2FsCi0gICAgIHZhcmlhYmxlcywgc28gd2UgZG9uJ3QgYm90aGVyLCBleGNlcHQgZm9yIHRoZSB0b3AgbGV2ZWwgYmxvY2suICAqLwotICBpZiAoYmxvY2stPmxvY2FscyAhPSBOVUxMIHx8IGJsb2NrLT5wYXJlbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmZucy0+c3RhcnRfYmxvY2spIChmaGFuZGxlLCBibG9jay0+c3RhcnQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJsb2NrLT5sb2NhbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKG4gPSBibG9jay0+bG9jYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCXsKLQkgIGlmICghIGRlYnVnX3dyaXRlX25hbWUgKGluZm8sIGZucywgZmhhbmRsZSwgbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGZvciAoYiA9IGJsb2NrLT5jaGlsZHJlbjsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV9ibG9jayAoaW5mbywgZm5zLCBmaGFuZGxlLCBiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgYmxvY2stPmVuZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChibG9jay0+bG9jYWxzICE9IE5VTEwgfHwgYmxvY2stPnBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgqZm5zLT5lbmRfYmxvY2spIChmaGFuZGxlLCBibG9jay0+ZW5kKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gdXAgdG8gQUREUkVTUy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgd2hpbGUgKGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2xpbmVubyAqbDsKLQotICAgICAgbCA9IGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vOwotCi0gICAgICB3aGlsZSAoaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXggPCBERUJVR19MSU5FTk9fQ09VTlQpCi0JewotCSAgaWYgKGwtPmxpbmVub3NbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdCi0JICAgICAgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCSAgICBicmVhazsKLQotCSAgaWYgKGwtPmFkZHJzW2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4XSA+PSBhZGRyZXNzKQotCSAgICByZXR1cm4gdHJ1ZTsKLQotCSAgaWYgKCEgKCpmbnMtPmxpbmVubykgKGZoYW5kbGUsIGwtPmZpbGUtPmZpbGVuYW1lLAotCQkJCWwtPmxpbmVub3NbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdLAotCQkJCWwtPmFkZHJzW2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4XSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgKytpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleDsKLQl9Ci0KLSAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vID0gbC0+bmV4dDsKLSAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4ID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgSUQgbnVtYmVyIGZvciBhIGNsYXNzLiAgSWYgZHVyaW5nIHRoZSBzYW1lIGNhbGwgdG8KLSAgIGRlYnVnX3dyaXRlIHdlIGZpbmQgYSBzdHJ1Y3Qgd2l0aCB0aGUgc2FtZSBkZWZpbml0aW9uIHdpdGggdGhlIHNhbWUKLSAgIG5hbWUsIHdlIHVzZSB0aGUgc2FtZSBJRC4gIFRoaXMgdHlwZSBvZiB0aGluZ3MgaGFwcGVucyBiZWNhdXNlIHRoZQotICAgc2FtZSBzdHJ1Y3Qgd2lsbCBiZSBkZWZpbmVkIGJ5IG11bHRpcGxlIGNvbXBpbGF0aW9uIHVuaXRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3NldF9jbGFzc19pZCAoaW5mbywgdGFnLCB0eXBlKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX2lkICpsOwotCi0gIGFzc2VydCAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1NUUlVDVAotCSAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OCi0JICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfQ0xBU1MKLQkgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTl9DTEFTUyk7Ci0KLSAgYyA9IHR5cGUtPnUua2NsYXNzOwotCi0gIGlmIChjLT5pZCA+IGluZm8tPmJhc2VfaWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChsID0gaW5mby0+aWRfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobC0+dHlwZS0+a2luZCAhPSB0eXBlLT5raW5kKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAodGFnID09IE5VTEwpCi0JewotCSAgaWYgKGwtPnRhZyAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGwtPnRhZyA9PSBOVUxMCi0JICAgICAgfHwgbC0+dGFnWzBdICE9IHRhZ1swXQotCSAgICAgIHx8IHN0cmNtcCAobC0+dGFnLCB0YWcpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIGwtPnR5cGUsIHR5cGUpKQotCXsKLQkgIGMtPmlkID0gbC0+dHlwZS0+dS5rY2xhc3MtPmlkOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBUaGVyZSBhcmUgbm8gaWRlbnRpY2FsIHR5cGVzLiAgVXNlIGEgbmV3IElELCBhbmQgYWRkIGl0IHRvIHRoZQotICAgICBsaXN0LiAgKi8KLSAgKytpbmZvLT5jbGFzc19pZDsKLSAgYy0+aWQgPSBpbmZvLT5jbGFzc19pZDsKLQotICBsID0gKHN0cnVjdCBkZWJ1Z19jbGFzc19pZCAqKSB4bWFsbG9jIChzaXplb2YgKmwpOwotICBtZW1zZXQgKGwsIDAsIHNpemVvZiAqbCk7Ci0KLSAgbC0+dHlwZSA9IHR5cGU7Ci0gIGwtPnRhZyA9IHRhZzsKLQotICBsLT5uZXh0ID0gaW5mby0+aWRfbGlzdDsKLSAgaW5mby0+aWRfbGlzdCA9IGw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiB0d28gdHlwZXMgYXJlIHRoZSBzYW1lLiAgQXQgdGhpcyBwb2ludCwgd2UgZG9uJ3QgY2FyZSBhYm91dAotICAgdGFncyBhbmQgdGhlIGxpa2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDE7Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MjsKLXsKLSAgc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0ICpsOwotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgdG9wOwotICBib29sZWFuIHJldDsKLQotICBpZiAodDEgPT0gTlVMTCkKLSAgICByZXR1cm4gdDIgPT0gTlVMTDsKLSAgaWYgKHQyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdoaWxlICh0MS0+a2luZCA9PSBERUJVR19LSU5EX0lORElSRUNUKQotICAgIHsKLSAgICAgIHQxID0gKnQxLT51LmtpbmRpcmVjdC0+c2xvdDsKLSAgICAgIGlmICh0MSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHdoaWxlICh0Mi0+a2luZCA9PSBERUJVR19LSU5EX0lORElSRUNUKQotICAgIHsKLSAgICAgIHQyID0gKnQyLT51LmtpbmRpcmVjdC0+c2xvdDsKLSAgICAgIGlmICh0MiA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHQxID09IHQyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEFzIGEgc3BlY2lhbCBjYXNlLCBwZXJtaXQgYSB0eXBlZGVmIHRvIG1hdGNoIGEgdGFnLCBzaW5jZSBDKysKLSAgICAgZGVidWdnaW5nIG91dHB1dCB3aWxsIHNvbWV0aW1lcyBhZGQgYSB0eXBlZGVmIHdoZXJlIEMgZGVidWdnaW5nCi0gICAgIG91dHB1dCB3aWxsIG5vdC4gICovCi0gIGlmICh0MS0+a2luZCA9PSBERUJVR19LSU5EX05BTUVECi0gICAgICAmJiB0Mi0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRCkKLSAgICByZXR1cm4gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua25hbWVkLT50eXBlLCB0Mik7Ci0gIGVsc2UgaWYgKHQxLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VECi0JICAgJiYgdDItPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRCkKLSAgICByZXR1cm4gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyLT51LmtuYW1lZC0+dHlwZSk7Ci0KLSAgaWYgKHQxLT5raW5kICE9IHQyLT5raW5kCi0gICAgICB8fCB0MS0+c2l6ZSAhPSB0Mi0+c2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2V0IHJpZCBvZiB0aGUgdHJpdmlhbCBjYXNlcyBmaXJzdC4gICovCi0gIHN3aXRjaCAodDEtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfVk9JRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfRkxPQVQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX0NPTVBMRVg6Ci0gICAgY2FzZSBERUJVR19LSU5EX0JPT0w6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5UOgotICAgICAgcmV0dXJuIHQxLT51LmtpbnQgPT0gdDItPnUua2ludDsKLSAgICB9Ci0KLSAgLyogV2UgaGF2ZSB0byBhdm9pZCBhbiBpbmZpbml0ZSByZWN1cnNpb24uICBXZSBkbyB0aGlzIGJ5IGtlZXBpbmcgYQotICAgICBsaXN0IG9mIHR5cGVzIHdoaWNoIHdlIGFyZSBjb21wYXJpbmcuICBXZSBqdXN0IGtlZXAgdGhlIGxpc3Qgb24KLSAgICAgdGhlIHN0YWNrLiAgSWYgd2UgZW5jb3VudGVyIGEgcGFpciBvZiB0eXBlcyB3ZSBhcmUgY3VycmVudGx5Ci0gICAgIGNvbXBhcmluZywgd2UganVzdCBhc3N1bWUgdGhhdCB0aGV5IGFyZSBlcXVhbC4gICovCi0gIGZvciAobCA9IGluZm8tPmNvbXBhcmVfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobC0+dDEgPT0gdDEgJiYgbC0+dDIgPT0gdDIpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHRvcC50MSA9IHQxOwotICB0b3AudDIgPSB0MjsKLSAgdG9wLm5leHQgPSBpbmZvLT5jb21wYXJlX2xpc3Q7Ci0gIGluZm8tPmNvbXBhcmVfbGlzdCA9ICZ0b3A7Ci0KLSAgc3dpdGNoICh0MS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgICBpZiAodDEtPnUua2NsYXNzID09IE5VTEwpCi0JcmV0ID0gdDItPnUua2NsYXNzID09IE5VTEw7Ci0gICAgICBlbHNlIGlmICh0Mi0+dS5rY2xhc3MgPT0gTlVMTCkKLQlyZXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKHQxLT51LmtjbGFzcy0+aWQgPiBpbmZvLT5iYXNlX2lkCi0JICAgICAgICYmIHQxLT51LmtjbGFzcy0+aWQgPT0gdDItPnUua2NsYXNzLT5pZCkKLQlyZXQgPSB0cnVlOwotICAgICAgZWxzZQotCXJldCA9IGRlYnVnX2NsYXNzX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0Mik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgaWYgKHQxLT51LmtlbnVtID09IE5VTEwpCi0JcmV0ID0gdDItPnUua2VudW0gPT0gTlVMTDsKLSAgICAgIGVsc2UgaWYgKHQyLT51LmtlbnVtID09IE5VTEwpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqKnBuMSwgKipwbjI7Ci0JICBiZmRfc2lnbmVkX3ZtYSAqcHYxLCAqcHYyOwotCi0JICBwbjEgPSB0MS0+dS5rZW51bS0+bmFtZXM7Ci0JICBwbjIgPSB0Mi0+dS5rZW51bS0+bmFtZXM7Ci0JICBwdjEgPSB0MS0+dS5rZW51bS0+dmFsdWVzOwotCSAgcHYyID0gdDItPnUua2VudW0tPnZhbHVlczsKLQkgIHdoaWxlICgqcG4xICE9IE5VTEwgJiYgKnBuMiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCoqcG4xICE9ICoqcG4yCi0JCSAgfHwgKnB2MSAhPSAqcHYyCi0JCSAgfHwgc3RyY21wICgqcG4xLCAqcG4yKSAhPSAwKQotCQlicmVhazsKLQkgICAgICArK3BuMTsKLQkgICAgICArK3BuMjsKLQkgICAgICArK3B2MTsKLQkgICAgICArK3B2MjsKLQkgICAgfQotCSAgcmV0ID0gKnBuMSA9PSBOVUxMICYmICpwbjIgPT0gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9QT0lOVEVSOgotICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3BvaW50ZXIsIHQyLT51Lmtwb2ludGVyKTsKLSAgICAgIGJyZWFrOwotCSAgICAgCi0gICAgY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OOgotICAgICAgaWYgKHQxLT51LmtmdW5jdGlvbi0+dmFyYXJncyAhPSB0Mi0+dS5rZnVuY3Rpb24tPnZhcmFyZ3MKLQkgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua2Z1bmN0aW9uLT5yZXR1cm5fdHlwZSwKLQkJCQkgdDItPnUua2Z1bmN0aW9uLT5yZXR1cm5fdHlwZSkKLQkgIHx8ICgodDEtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQkgICAgICAhPSAodDItPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXMgPT0gTlVMTCkpKQotCXJldCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAodDEtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQlyZXQgPSB0cnVlOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBkZWJ1Z190eXBlICoqYTEsICoqYTI7Ci0KLQkgIGExID0gdDEtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXM7Ci0JICBhMiA9IHQyLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzOwotCSAgd2hpbGUgKCphMSAhPSBOVUxMICYmICphMiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgKmExLCAqYTIpKQotCQlicmVhazsKLQkgICAgICArK2ExOwotCSAgICAgICsrYTI7Ci0JICAgIH0KLQkgIHJldCA9ICphMSA9PSBOVUxMICYmICphMiA9PSBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1JFRkVSRU5DRToKLSAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtyZWZlcmVuY2UsIHQyLT51LmtyZWZlcmVuY2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfUkFOR0U6Ci0gICAgICByZXQgPSAodDEtPnUua3JhbmdlLT5sb3dlciA9PSB0Mi0+dS5rcmFuZ2UtPmxvd2VyCi0JICAgICAmJiB0MS0+dS5rcmFuZ2UtPnVwcGVyID09IHQyLT51LmtyYW5nZS0+dXBwZXIKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtyYW5nZS0+dHlwZSwKLQkJCQkgIHQyLT51LmtyYW5nZS0+dHlwZSkpOwotCi0gICAgY2FzZSBERUJVR19LSU5EX0FSUkFZOgotICAgICAgcmV0ID0gKHQxLT51LmthcnJheS0+bG93ZXIgPT0gdDItPnUua2FycmF5LT5sb3dlcgotCSAgICAgJiYgdDEtPnUua2FycmF5LT51cHBlciA9PSB0Mi0+dS5rYXJyYXktPnVwcGVyCi0JICAgICAmJiB0MS0+dS5rYXJyYXktPnN0cmluZ3AgPT0gdDItPnUua2FycmF5LT5zdHJpbmdwCi0JICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rYXJyYXktPmVsZW1lbnRfdHlwZSwKLQkJCQkgIHQyLT51LmthcnJheS0+ZWxlbWVudF90eXBlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9TRVQ6Ci0gICAgICByZXQgPSAodDEtPnUua3NldC0+Yml0c3RyaW5ncCA9PSB0Mi0+dS5rc2V0LT5iaXRzdHJpbmdwCi0JICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rc2V0LT50eXBlLCB0Mi0+dS5rc2V0LT50eXBlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9PRkZTRVQ6Ci0gICAgICByZXQgPSAoZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua29mZnNldC0+YmFzZV90eXBlLAotCQkJICAgICAgIHQyLT51LmtvZmZzZXQtPmJhc2VfdHlwZSkKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtvZmZzZXQtPnRhcmdldF90eXBlLAotCQkJCSAgdDItPnUua29mZnNldC0+dGFyZ2V0X3R5cGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKLSAgICAgIGlmICh0MS0+dS5rbWV0aG9kLT52YXJhcmdzICE9IHQyLT51LmttZXRob2QtPnZhcmFyZ3MKLQkgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua21ldGhvZC0+cmV0dXJuX3R5cGUsCi0JCQkJIHQyLT51LmttZXRob2QtPnJldHVybl90eXBlKQotCSAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSwKLQkJCQkgdDItPnUua21ldGhvZC0+ZG9tYWluX3R5cGUpCi0JICB8fCAoKHQxLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKQotCSAgICAgICE9ICh0Mi0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkpKQotCXJldCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAodDEtPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpCi0JcmV0ID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfdHlwZSAqKmExLCAqKmEyOwotCi0JICBhMSA9IHQxLT51LmttZXRob2QtPmFyZ190eXBlczsKLQkgIGEyID0gdDItPnUua21ldGhvZC0+YXJnX3R5cGVzOwotCSAgd2hpbGUgKCphMSAhPSBOVUxMICYmICphMiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgKmExLCAqYTIpKQotCQlicmVhazsKLQkgICAgICArK2ExOwotCSAgICAgICsrYTI7Ci0JICAgIH0KLQkgIHJldCA9ICphMSA9PSBOVUxMICYmICphMiA9PSBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX0NPTlNUOgotICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua2NvbnN0LCB0Mi0+dS5rY29uc3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfVk9MQVRJTEU6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rdm9sYXRpbGUsIHQyLT51Lmt2b2xhdGlsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgcmV0ID0gKHN0cmNtcCAodDEtPnUua25hbWVkLT5uYW1lLT5uYW1lLCB0Mi0+dS5rbmFtZWQtPm5hbWUtPm5hbWUpID09IDAKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtuYW1lZC0+dHlwZSwKLQkJCQkgIHQyLT51LmtuYW1lZC0+dHlwZSkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGluZm8tPmNvbXBhcmVfbGlzdCA9IHRvcC5uZXh0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFNlZSBpZiB0d28gY2xhc3NlcyBhcmUgdGhlIHNhbWUuICBUaGlzIGlzIGEgc3Vicm91dGluZSBvZgotICAgZGVidWdfdHlwZV9zYW1lcC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z19jbGFzc190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDIpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQyOwotewotICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzEsICpjMjsKLQotICBjMSA9IHQxLT51LmtjbGFzczsKLSAgYzIgPSB0Mi0+dS5rY2xhc3M7Ci0KLSAgaWYgKChjMS0+ZmllbGRzID09IE5VTEwpICE9IChjMi0+ZmllbGRzID09IE5VTEwpCi0gICAgICB8fCAoYzEtPmJhc2VjbGFzc2VzID09IE5VTEwpICE9IChjMi0+YmFzZWNsYXNzZXMgPT0gTlVMTCkKLSAgICAgIHx8IChjMS0+bWV0aG9kcyA9PSBOVUxMKSAhPSAoYzItPm1ldGhvZHMgPT0gTlVMTCkKLSAgICAgIHx8IChjMS0+dnB0cmJhc2UgPT0gTlVMTCkgIT0gKGMyLT52cHRyYmFzZSA9PSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGMxLT5maWVsZHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfZmllbGQgKipwZjEsICoqcGYyOwotCi0gICAgICBmb3IgKHBmMSA9IGMxLT5maWVsZHMsIHBmMiA9IGMyLT5maWVsZHM7Ci0JICAgKnBmMSAhPSBOVUxMICYmICpwZjIgIT0gTlVMTDsKLQkgICBwZjErKywgcGYyKyspCi0JewotCSAgc3RydWN0IGRlYnVnX2ZpZWxkICpmMSwgKmYyOwotCi0JICBmMSA9ICpwZjE7Ci0JICBmMiA9ICpwZjI7Ci0JICBpZiAoZjEtPm5hbWVbMF0gIT0gZjItPm5hbWVbMF0KLQkgICAgICB8fCBmMS0+dmlzaWJpbGl0eSAhPSBmMi0+dmlzaWJpbGl0eQotCSAgICAgIHx8IGYxLT5zdGF0aWNfbWVtYmVyICE9IGYyLT5zdGF0aWNfbWVtYmVyKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoZjEtPnN0YXRpY19tZW1iZXIpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChmMS0+dS5zLnBoeXNuYW1lLCBmMi0+dS5zLnBoeXNuYW1lKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChmMS0+dS5mLmJpdHBvcyAhPSBmMi0+dS5mLmJpdHBvcwotCQkgIHx8IGYxLT51LmYuYml0c2l6ZSAhPSBmMi0+dS5mLmJpdHNpemUpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgLyogV2UgZG8gdGhlIGNoZWNrcyB3aGljaCByZXF1aXJlIGZ1bmN0aW9uIGNhbGxzIGxhc3QuICBXZQotICAgICAgICAgICAgIGRvbid0IHJlcXVpcmUgdGhhdCB0aGUgdHlwZXMgb2YgZmllbGRzIGhhdmUgdGhlIHNhbWUKLSAgICAgICAgICAgICBuYW1lcywgc2luY2UgdGhhdCBzb21ldGltZXMgZmFpbHMgaW4gdGhlIHByZXNlbmNlIG9mCi0gICAgICAgICAgICAgdHlwZWRlZnMgYW5kIHdlIHJlYWxseSBkb24ndCBjYXJlLiAgKi8KLQkgIGlmIChzdHJjbXAgKGYxLT5uYW1lLCBmMi0+bmFtZSkgIT0gMAotCSAgICAgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywKLQkJCQkgICAgIGRlYnVnX2dldF9yZWFsX3R5cGUgKChQVFIpIGluZm8sCi0JCQkJCQkJICBmMS0+dHlwZSwgTlVMTCksCi0JCQkJICAgICBkZWJ1Z19nZXRfcmVhbF90eXBlICgoUFRSKSBpbmZvLAotCQkJCQkJCSAgZjItPnR5cGUsIE5VTEwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICgqcGYxICE9IE5VTEwgfHwgKnBmMiAhPSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGMxLT52cHRyYmFzZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIGMxLT52cHRyYmFzZSwgYzItPnZwdHJiYXNlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjMS0+YmFzZWNsYXNzZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICoqcGIxLCAqKnBiMjsKLQotICAgICAgZm9yIChwYjEgPSBjMS0+YmFzZWNsYXNzZXMsIHBiMiA9IGMyLT5iYXNlY2xhc3NlczsKLQkgICAqcGIxICE9IE5VTEwgJiYgKnBiMiAhPSBOVUxMOwotCSAgICsrcGIxLCArK3BiMikKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICpiMSwgKmIyOwotCi0JICBiMSA9ICpwYjE7Ci0JICBiMiA9ICpwYjI7Ci0JICBpZiAoYjEtPmJpdHBvcyAhPSBiMi0+Yml0cG9zCi0JICAgICAgfHwgYjEtPnZpcnR1YWwgIT0gYjItPnZpcnR1YWwKLQkgICAgICB8fCBiMS0+dmlzaWJpbGl0eSAhPSBiMi0+dmlzaWJpbGl0eQotCSAgICAgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgYjEtPnR5cGUsIGIyLT50eXBlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICgqcGIxICE9IE5VTEwgfHwgKnBiMiAhPSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGMxLT5tZXRob2RzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX21ldGhvZCAqKnBtMSwgKipwbTI7Ci0KLSAgICAgIGZvciAocG0xID0gYzEtPm1ldGhvZHMsIHBtMiA9IGMyLT5tZXRob2RzOwotCSAgICpwbTEgIT0gTlVMTCAmJiAqcG0yICE9IE5VTEw7Ci0JICAgKytwbTEsICsrcG0yKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19tZXRob2QgKm0xLCAqbTI7Ci0KLQkgIG0xID0gKnBtMTsKLQkgIG0yID0gKnBtMjsKLQkgIGlmIChtMS0+bmFtZVswXSAhPSBtMi0+bmFtZVswXQotCSAgICAgIHx8IHN0cmNtcCAobTEtPm5hbWUsIG0yLT5uYW1lKSAhPSAwCi0JICAgICAgfHwgKG0xLT52YXJpYW50cyA9PSBOVUxMKSAhPSAobTItPnZhcmlhbnRzID09IE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAobTEtPnZhcmlhbnRzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKipwdjEsICoqcHYyOwotCi0JICAgICAgZm9yIChwdjEgPSBtMS0+dmFyaWFudHMsIHB2MiA9IG0yLT52YXJpYW50czsKLQkJICAgKnB2MSAhPSBOVUxMICYmICpwdjIgIT0gTlVMTDsKLQkJICAgKytwdjEsICsrcHYyKQotCQl7Ci0JCSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICp2MSwgKnYyOwotCi0JCSAgdjEgPSAqcHYxOwotCQkgIHYyID0gKnB2MjsKLQkJICBpZiAodjEtPnBoeXNuYW1lWzBdICE9IHYyLT5waHlzbmFtZVswXQotCQkgICAgICB8fCB2MS0+dmlzaWJpbGl0eSAhPSB2Mi0+dmlzaWJpbGl0eQotCQkgICAgICB8fCB2MS0+Y29uc3RwICE9IHYyLT5jb25zdHAKLQkJICAgICAgfHwgdjEtPnZvbGF0aWxlcCAhPSB2Mi0+dm9sYXRpbGVwCi0JCSAgICAgIHx8IHYxLT52b2Zmc2V0ICE9IHYyLT52b2Zmc2V0Ci0JCSAgICAgIHx8ICh2MS0+Y29udGV4dCA9PSBOVUxMKSAhPSAodjItPmNvbnRleHQgPT0gTlVMTCkKLQkJICAgICAgfHwgc3RyY21wICh2MS0+cGh5c25hbWUsIHYyLT5waHlzbmFtZSkgIT0gMAotCQkgICAgICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHYxLT50eXBlLCB2Mi0+dHlwZSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaWYgKHYxLT5jb250ZXh0ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHYxLT5jb250ZXh0LAotCQkJCQkgICAgICB2Mi0+Y29udGV4dCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoKnB2MSAhPSBOVUxMIHx8ICpwdjIgIT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCpwbTEgIT0gTlVMTCB8fCAqcG0yICE9IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlYnVnLmggYi9iaW51dGlscy9kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjg5MGIyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OTggKzAsMCBAQAotLyogZGVidWcuaCAtLSBEZXNjcmliZSBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIERFQlVHX0gKLSNkZWZpbmUgREVCVUdfSAotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGRlc2NyaWJlcyBhIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvcm1hdC4KLSAgIFdlIG1heSBldmVudHVhbGx5IGhhdmUgcmVhZGVycyB3aGljaCBjb252ZXJ0IGRpZmZlcmVudCBmb3JtYXRzIGludG8KLSAgIHRoaXMgZ2VuZXJpYyBmb3JtYXQsIGFuZCB3cml0ZXJzIHdoaWNoIHdyaXRlIGl0IG91dC4gIFRoZSBpbml0aWFsCi0gICBpbXBldHVzIGZvciB0aGlzIHdhcyB3cml0aW5nIGEgY29udmVydG9yIGZyb20gc3RhYnMgdG8gSFAgSUVFRS02OTUKLSAgIGRlYnVnZ2luZyBmb3JtYXQuICAqLwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgdHlwZXMuICAqLwotCi1lbnVtIGRlYnVnX3R5cGVfa2luZAotewotICAvKiBOb3QgdXNlZC4gICovCi0gIERFQlVHX0tJTkRfSUxMRUdBTCwKLSAgLyogSW5kaXJlY3QgdmlhIGEgcG9pbnRlci4gICovCi0gIERFQlVHX0tJTkRfSU5ESVJFQ1QsCi0gIC8qIFZvaWQuICAqLwotICBERUJVR19LSU5EX1ZPSUQsCi0gIC8qIEludGVnZXIuICAqLwotICBERUJVR19LSU5EX0lOVCwKLSAgLyogRmxvYXRpbmcgcG9pbnQuICAqLwotICBERUJVR19LSU5EX0ZMT0FULAotICAvKiBDb21wbGV4LiAgKi8KLSAgREVCVUdfS0lORF9DT01QTEVYLAotICAvKiBCb29sZWFuLiAgKi8KLSAgREVCVUdfS0lORF9CT09MLAotICAvKiBTdHJ1Y3QuICAqLwotICBERUJVR19LSU5EX1NUUlVDVCwKLSAgLyogVW5pb24uICAqLwotICBERUJVR19LSU5EX1VOSU9OLAotICAvKiBDbGFzcy4gICovCi0gIERFQlVHX0tJTkRfQ0xBU1MsCi0gIC8qIFVuaW9uIGNsYXNzIChjYW4gdGhpcyByZWFsbHkgaGFwcGVuPykuICAqLwotICBERUJVR19LSU5EX1VOSU9OX0NMQVNTLAotICAvKiBFbnVtZXJhdGlvbiB0eXBlLiAgKi8KLSAgREVCVUdfS0lORF9FTlVNLAotICAvKiBQb2ludGVyLiAgKi8KLSAgREVCVUdfS0lORF9QT0lOVEVSLAotICAvKiBGdW5jdGlvbi4gICovCi0gIERFQlVHX0tJTkRfRlVOQ1RJT04sCi0gIC8qIFJlZmVyZW5jZS4gICovCi0gIERFQlVHX0tJTkRfUkVGRVJFTkNFLAotICAvKiBSYW5nZS4gICovCi0gIERFQlVHX0tJTkRfUkFOR0UsCi0gIC8qIEFycmF5LiAgKi8KLSAgREVCVUdfS0lORF9BUlJBWSwKLSAgLyogU2V0LiAgKi8KLSAgREVCVUdfS0lORF9TRVQsCi0gIC8qIEJhc2VkIHBvaW50ZXIuICAqLwotICBERUJVR19LSU5EX09GRlNFVCwKLSAgLyogTWV0aG9kLiAgKi8KLSAgREVCVUdfS0lORF9NRVRIT0QsCi0gIC8qIENvbnN0IHF1YWxpZmllZCB0eXBlLiAgKi8KLSAgREVCVUdfS0lORF9DT05TVCwKLSAgLyogVm9sYXRpbGUgcXVhbGlmaWVkIHR5cGUuICAqLwotICBERUJVR19LSU5EX1ZPTEFUSUxFLAotICAvKiBOYW1lZCB0eXBlLiAgKi8KLSAgREVCVUdfS0lORF9OQU1FRCwKLSAgLyogVGFnZ2VkIHR5cGUuICAqLwotICBERUJVR19LSU5EX1RBR0dFRAotfTsKLQotLyogRGlmZmVyZW50IGtpbmRzIG9mIHZhcmlhYmxlcy4gICovCi0KLWVudW0gZGVidWdfdmFyX2tpbmQKLXsKLSAgLyogTm90IHVzZWQuICAqLwotICBERUJVR19WQVJfSUxMRUdBTCwKLSAgLyogQSBnbG9iYWwgdmFyaWFibGUuICAqLwotICBERUJVR19HTE9CQUwsCi0gIC8qIEEgc3RhdGljIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfU1RBVElDLAotICAvKiBBIGxvY2FsIHN0YXRpYyB2YXJpYWJsZS4gICovCi0gIERFQlVHX0xPQ0FMX1NUQVRJQywKLSAgLyogQSBsb2NhbCB2YXJpYWJsZS4gICovCi0gIERFQlVHX0xPQ0FMLAotICAvKiBBIHJlZ2lzdGVyIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfUkVHSVNURVIKLX07Ci0KLS8qIERpZmZlcmVudCBraW5kcyBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLQotZW51bSBkZWJ1Z19wYXJtX2tpbmQKLXsKLSAgLyogTm90IHVzZWQuICAqLwotICBERUJVR19QQVJNX0lMTEVHQUwsCi0gIC8qIEEgc3RhY2sgYmFzZWQgcGFyYW1ldGVyLiAgKi8KLSAgREVCVUdfUEFSTV9TVEFDSywKLSAgLyogQSByZWdpc3RlciBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1JFRywKLSAgLyogQSBzdGFjayBiYXNlZCByZWZlcmVuY2UgcGFyYW1ldGVyLiAgKi8KLSAgREVCVUdfUEFSTV9SRUZFUkVOQ0UsCi0gIC8qIEEgcmVnaXN0ZXIgcmVmZXJlbmNlIHBhcmFtZXRlci4gICovCi0gIERFQlVHX1BBUk1fUkVGX1JFRwotfTsKLQotLyogRGlmZmVyZW50IGtpbmRzIG9mIHZpc2liaWxpdHkuICAqLwotCi1lbnVtIGRlYnVnX3Zpc2liaWxpdHkKLXsKLSAgLyogQSBwdWJsaWMgZmllbGQgKGUuZy4sIGEgZmllbGQgaW4gYSBDIHN0cnVjdCkuICAqLwotICBERUJVR19WSVNJQklMSVRZX1BVQkxJQywKLSAgLyogQSBwcm90ZWN0ZWQgZmllbGQuICAqLwotICBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRCwKLSAgLyogQSBwcml2YXRlIGZpZWxkLiAgKi8KLSAgREVCVUdfVklTSUJJTElUWV9QUklWQVRFLAotICAvKiBBIGZpZWxkIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KLSAgREVCVUdfVklTSUJJTElUWV9JR05PUkUKLX07Ci0KLS8qIEEgdHlwZS4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRlYnVnX3R5cGUgKmRlYnVnX3R5cGU7Ci0KLSNkZWZpbmUgREVCVUdfVFlQRV9OVUxMICgoZGVidWdfdHlwZSkgTlVMTCkKLQotLyogQSBmaWVsZCBpbiBhIHN0cnVjdCBvciB1bmlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRlYnVnX2ZpZWxkICpkZWJ1Z19maWVsZDsKLQotI2RlZmluZSBERUJVR19GSUVMRF9OVUxMICgoZGVidWdfZmllbGQpIE5VTEwpCi0KLS8qIEEgYmFzZSBjbGFzcyBmb3IgYW4gb2JqZWN0LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICpkZWJ1Z19iYXNlY2xhc3M7Ci0KLSNkZWZpbmUgREVCVUdfQkFTRUNMQVNTX05VTEwgKChkZWJ1Z19iYXNlY2xhc3MpIE5VTEwpCi0KLS8qIEEgbWV0aG9kIG9mIGFuIG9iamVjdC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRlYnVnX21ldGhvZCAqZGVidWdfbWV0aG9kOwotCi0jZGVmaW5lIERFQlVHX01FVEhPRF9OVUxMICgoZGVidWdfbWV0aG9kKSBOVUxMKQotCi0vKiBUaGUgYXJndW1lbnRzIHRvIGEgbWV0aG9kIGZ1bmN0aW9uIG9mIGFuIG9iamVjdC4gIFRoZXNlIGluZGljYXRlCi0gICB3aGljaCBtZXRob2QgdG8gcnVuLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKmRlYnVnX21ldGhvZF92YXJpYW50OwotCi0jZGVmaW5lIERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEwgKChkZWJ1Z19tZXRob2RfdmFyaWFudCkgTlVMTCkKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIHRvIGRlYnVnX3dyaXRlLiAgSXQgaG9sZHMgZnVuY3Rpb24KLSAgIHBvaW50ZXJzIHRoYXQgZGVidWdfd3JpdGUgd2lsbCBjYWxsIGJhc2VkIG9uIHRoZSBhY2N1bXVsYXRlZAotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX3dyaXRlX2ZucwotewotICAvKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBuZXcgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZQotICAgICBuYW1lIG9mIHRoZSBtYWluIGZpbGUgaW4gdGhlIG5ldyB1bml0LiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X2NvbXBpbGF0aW9uX3VuaXQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgd2l0aGluIGEKLSAgICAgY29tcGlsYXRpb24gdW5pdCwgYmVmb3JlIG91dHB1dHRpbmcgYW55IGdsb2JhbCBpbmZvcm1hdGlvbiBmb3IKLSAgICAgdGhhdCBmaWxlLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X3NvdXJjZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBFYWNoIHdyaXRlciBtdXN0IGtlZXAgYSBzdGFjayBvZiB0eXBlcy4gICovCi0KLSAgLyogUHVzaCBhbiBlbXB0eSB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGlzIHR5cGUgY2FuIGFwcGVhciBpZgotICAgICB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIHR5cGUgd2hpY2ggaXMgbmV2ZXIgZGVmaW5lZC4gICovCi0gIGJvb2xlYW4gKCplbXB0eV90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQdXNoIGEgdm9pZCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqdm9pZF90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQdXNoIGFuIGludGVnZXIgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZSBhbmQKLSAgICAgd2hldGhlciBpdCBpcyB1bnNpZ25lZC4gICovCi0gIGJvb2xlYW4gKCppbnRfdHlwZSkgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLQotICAvKiBQdXNoIGEgZmxvYXRpbmcgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpmbG9hdF90eXBlKSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0gIC8qIFB1c2ggYSBjb21wbGV4IHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHNpemUuICAqLwotICBib29sZWFuICgqY29tcGxleF90eXBlKSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0gIC8qIFB1c2ggYSBib29sZWFuIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHNpemUuICAqLwotICBib29sZWFuICgqYm9vbF90eXBlKSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0gIC8qIFB1c2ggYW4gZW51bSB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSB0YWcsIGEgTlVMTAotICAgICB0ZXJtaW5hdGVkIGFycmF5IG9mIG5hbWVzIGFuZCB0aGUgYXNzb2NpYXRlZCB2YWx1ZXMuICBJZiB0aGVyZSBpcwotICAgICBubyB0YWcsIHRoZSB0YWcgYXJndW1lbnQgd2lsbCBiZSBOVUxMLiAgSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQKLSAgICAgZW51bSwgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgYXJndW1lbnRzIHdpbGwgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCplbnVtX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLAotCQkJCWJmZF9zaWduZWRfdm1hICopKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHBvaW50ZXIgdG8gdGhhdAotICAgICB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqcG9pbnRlcl90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQdXNoIGEgZnVuY3Rpb24gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhlIHNlY29uZCBhcmd1bWVudAotICAgICBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudCB0eXBlcyB0aGF0IGhhdmUgYmVlbiBwdXNoZWQgb250bwotICAgICB0aGUgc3RhY2suICBJZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IHR5cGVzIGlzIHBhc3NlZCBhcyAtMSwgdGhlbgotICAgICB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGZ1bmN0aW9uIGFyZSB1bmtub3duLCBhbmQgbm8gdHlwZXMgaGF2ZQotICAgICBiZWVuIHB1c2hlZCBvbnRvIHRoZSBzdGFjay4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZQotICAgICBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICBUaGUgcmV0dXJuIHR5cGUKLSAgICAgb2YgdGhlIGZ1bmN0aW9uIGlzIHB1c2hlZCBvbnRvIHRoZSB0eXBlIHN0YWNrIGJlbG93IHRoZSBhcmd1bWVudAotICAgICB0eXBlcywgaWYgYW55LiAgKi8KLSAgYm9vbGVhbiAoKmZ1bmN0aW9uX3R5cGUpIFBBUkFNUyAoKFBUUiwgaW50LCBib29sZWFuKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSByZWZlcmVuY2UgdG8gdGhhdAotICAgICB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqcmVmZXJlbmNlX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgcmFuZ2Ugb2YgdGhhdCB0eXBlCi0gICAgIHdpdGggdGhlIGdpdmVuIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpyYW5nZV90eXBlKSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotCi0gIC8qIFB1c2ggYW4gYXJyYXkgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlCi0gICAgIHN0YWNrIGlzIHRoZSByYW5nZSwgYW5kIHRoZSBuZXh0IHR5cGUgb24gdGhlIHR5cGUgc3RhY2sgaXMgdGhlCi0gICAgIGVsZW1lbnQgdHlwZS4gIFRoZXNlIHNob3VsZCBiZSBwb3BwZWQgYmVmb3JlIHRoZSBhcnJheSB0eXBlIGlzCi0gICAgIHB1c2hlZC4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBsb3dlciBib3VuZCwgdGhlIHVwcGVyIGJvdW5kLCBhbmQKLSAgICAgd2hldGhlciB0aGUgYXJyYXkgaXMgYSBzdHJpbmcuICAqLwotICBib29sZWFuICgqYXJyYXlfdHlwZSkgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEsCi0JCQkJIGJvb2xlYW4pKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHNldCBvZiB0aGF0IHR5cGUKLSAgICAgb250byB0aGUgdHlwZSBzdGFjay4gIFRoZSBhcmd1bWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHNldCBpcwotICAgICBhIGJpdHN0cmluZy4gICovCi0gIGJvb2xlYW4gKCpzZXRfdHlwZSkgUEFSQU1TICgoUFRSLCBib29sZWFuKSk7Ci0KLSAgLyogUHVzaCBhbiBvZmZzZXQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhlIHRvcCB0eXBlIG9uIHRoZQotICAgICB0eXBlIHN0YWNrIGlzIHRoZSB0YXJnZXQgdHlwZSwgYW5kIHRoZSBuZXh0IHR5cGUgb24gdGhlIHR5cGUKLSAgICAgc3RhY2sgaXMgdGhlIGJhc2UgdHlwZS4gIFRoZXNlIHNob3VsZCBiZSBwb3BwZWQgYmVmb3JlIHRoZSBvZmZzZXQKLSAgICAgdHlwZSBpcyBwdXNoZWQuICAqLwotICBib29sZWFuICgqb2Zmc2V0X3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYSBtZXRob2QgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudAotICAgICBpcyB0cnVlLCB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGlzIHRoZSBjbGFzcyB0byB3aGljaCB0aGUKLSAgICAgbWV0aG9kIGJlbG9uZ3M7IG90aGVyd2lzZSwgdGhlIGNsYXNzIG11c3QgYmUgZGV0ZXJtaW5lZCBieSB0aGUKLSAgICAgY2xhc3MgdG8gd2hpY2ggdGhlIG1ldGhvZCBpcyBhdHRhY2hlZC4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUKLSAgICAgbnVtYmVyIG9mIGFyZ3VtZW50IHR5cGVzOyB0aGVzZSBhcmUgcHVzaGVkIG9udG8gdGhlIHR5cGUgc3RhY2sgaW4KLSAgICAgcmV2ZXJzZSBvcmRlciAodGhlIGZpcnN0IHR5cGUgcG9wcGVkIGlzIHRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoZQotICAgICBtZXRob2QpLiAgQSB2YWx1ZSBvZiAtMSBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50IG1lYW5zIHRoYXQgbm8KLSAgICAgYXJndW1lbnQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLiAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB0cnVlCi0gICAgIGlmIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICBUaGUgbmV4dAotICAgICB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrIGJlbG93IHRoZSBkb21haW4gYW5kIHRoZSBhcmd1bWVudCB0eXBlcyBpcwotICAgICB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZC4gIEFsbCB0aGVzZSB0eXBlcyBtdXN0IGJlIHBvcHBlZCwKLSAgICAgYW5kIHRoZW4gdGhlIG1ldGhvZCB0eXBlIG11c3QgYmUgcHVzaGVkLiAgKi8KLSAgYm9vbGVhbiAoKm1ldGhvZF90eXBlKSBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGludCwgYm9vbGVhbikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb2ZmIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIGNvbnN0IHF1YWxpZmllZAotICAgICB2ZXJzaW9uIG9mIHRoYXQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmNvbnN0X3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb2ZmIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHZvbGF0aWxlCi0gICAgIHF1YWxpZmllZCB2ZXJzaW9uIG9mIHRoYXQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnZvbGF0aWxlX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgc3RydWN0LiAgVGhpcyBpcyBmb2xsb3dlZCBieSBjYWxscyB0byB0aGUKLSAgICAgc3RydWN0X2ZpZWxkIGZ1bmN0aW9uLCBhbmQgZmluaXNoZWQgYnkgYSBjYWxsIHRvIHRoZQotICAgICBlbmRfc3RydWN0X3R5cGUgZnVuY3Rpb24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0YWc7IHRoaXMKLSAgICAgd2lsbCBiZSBOVUxMIGlmIHRoZXJlIGlzbid0IG9uZS4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgTlVMTCwKLSAgICAgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIGEgY29uc3RhbnQgaWRlbnRpZnlpbmcgdGhpcyBzdHJ1Y3QgZm9yIHVzZQotICAgICB3aXRoIHRhZ190eXBlLiAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB0cnVlIGZvciBhIHN0cnVjdCwgZmFsc2UKLSAgICAgZm9yIGEgdW5pb24uICBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHNpemUuICBJZiB0aGlzIGlzIGFuCi0gICAgIHVuZGVmaW5lZCBzdHJ1Y3Qgb3IgdW5pb24sIHRoZSBzaXplIHdpbGwgYmUgMCBhbmQgc3RydWN0X2ZpZWxkCi0gICAgIHdpbGwgbm90IGJlIGNhbGxlZCBiZWZvcmUgZW5kX3N0cnVjdF90eXBlIGlzIGNhbGxlZC4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9zdHJ1Y3RfdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCQkJYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogQWRkIGEgZmllbGQgdG8gdGhlIHN0cnVjdCB0eXBlIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZSB0eXBlCi0gICAgIG9mIHRoZSBmaWVsZCBzaG91bGQgYmUgcG9wcGVkIG9mZiB0aGUgdHlwZSBzdGFjay4gIFRoZSBhcmd1bWVudHMKLSAgICAgYXJlIHRoZSBuYW1lLCB0aGUgYml0IHBvc2l0aW9uLCB0aGUgYml0IHNpemUgKG1heSBiZSB6ZXJvIGlmIHRoZQotICAgICBmaWVsZCBpcyBub3QgcGFja2VkKSwgYW5kIHRoZSB2aXNpYmlsaXR5LiAgKi8KLSAgYm9vbGVhbiAoKnN0cnVjdF9maWVsZCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsCi0JCQkJICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLSAgLyogRmluaXNoIGJ1aWxkaW5nIGEgc3RydWN0LCBhbmQgcHVzaCBpdCBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmVuZF9zdHJ1Y3RfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBjbGFzcy4gIFRoaXMgaXMgZm9sbG93ZWQgYnkgY2FsbHMgdG8gc2V2ZXJhbAotICAgICBmdW5jdGlvbnM6IHN0cnVjdF9maWVsZCwgY2xhc3Nfc3RhdGljX21lbWJlciwgY2xhc3NfYmFzZWNsYXNzLAotICAgICBjbGFzc19zdGFydF9tZXRob2QsIGNsYXNzX21ldGhvZF92YXJpYW50LAotICAgICBjbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQsIGFuZCBjbGFzc19lbmRfbWV0aG9kLiAgVGhlIGNsYXNzIGlzCi0gICAgIGZpbmlzaGVkIGJ5IGEgY2FsbCB0byBlbmRfY2xhc3NfdHlwZS4gIFRoZSBmaXJzdCBmaXZlIGFyZ3VtZW50cwotICAgICBhcmUgdGhlIHNhbWUgYXMgZm9yIHN0YXJ0X3N0cnVjdF90eXBlLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzCi0gICAgIHRydWUgaWYgdGhlcmUgaXMgYSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlOyBpZiB0aGVyZSBpcywgdGhlCi0gICAgIHNldmVudGggYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBjYW4gYmUKLSAgICAgZm91bmQgaW4gdGhlIHR5cGUgaXRzZWxmLCBhbmQgaXMgZmFsc2UgaWYgdGhlIHR5cGUgb2YgdGhlIG9iamVjdAotICAgICBob2xkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIHNob3VsZCBiZSBwb3BwZWQgZnJvbSB0aGUgdHlwZQotICAgICBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9jbGFzc190eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCSAgICAgICBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JCQkJICAgICAgIGJvb2xlYW4pKTsKLQotICAvKiBBZGQgYSBzdGF0aWMgbWVtYmVyIHRvIHRoZSBjbGFzcyBjdXJyZW50bHkgYmVpbmcgYnVpbHQuICBUaGUKLSAgICAgYXJndW1lbnRzIGFyZSB0aGUgZmllbGQgbmFtZSwgdGhlIHBoeXNpY2FsIG5hbWUsIGFuZCB0aGUKLSAgICAgdmlzaWJpbGl0eS4gIFRoZSB0eXBlIG11c3QgYmUgcG9wcGVkIG9mZiB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19zdGF0aWNfbWVtYmVyKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCQkgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotICAKLSAgLyogQWRkIGEgYmFzZWNsYXNzIHRvIHRoZSBjbGFzcyBjdXJyZW50bHkgYmVpbmcgYnVpbHQuICBUaGUgdHlwZSBvZgotICAgICB0aGUgYmFzZWNsYXNzIG11c3QgYmUgcG9wcGVkIG9mZiB0aGUgdHlwZSBzdGFjay4gIFRoZSBhcmd1bWVudHMKLSAgICAgYXJlIHRoZSBiaXQgcG9zaXRpb24sIHdoZXRoZXIgdGhlIGNsYXNzIGlzIHZpcnR1YWwsIGFuZCB0aGUKLSAgICAgdmlzaWJpbGl0eS4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19iYXNlY2xhc3MpIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSwgYm9vbGVhbiwKLQkJCQkgICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotICAvKiBTdGFydCBhZGRpbmcgYSBtZXRob2QgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoaXMKLSAgICAgaXMgZm9sbG93ZWQgYnkgY2FsbHMgdG8gY2xhc3NfbWV0aG9kX3ZhcmlhbnQgYW5kCi0gICAgIGNsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCB0byBkZXNjcmliZSBkaWZmZXJlbnQgdmFyaWFudHMgb2YgdGhlCi0gICAgIG1ldGhvZCB3aGljaCB0YWtlIGRpZmZlcmVudCBhcmd1bWVudHMuICBUaGUgbWV0aG9kIGlzIGZpbmlzaGVkCi0gICAgIHdpdGggYSBjYWxsIHRvIGNsYXNzX2VuZF9tZXRob2QuICBUaGUgYXJndW1lbnQgaXMgdGhlIG1ldGhvZAotICAgICBuYW1lLiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX3N0YXJ0X21ldGhvZCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBEZXNjcmliZSBhIHZhcmlhbnQgdG8gdGhlIGNsYXNzIG1ldGhvZCBjdXJyZW50bHkgYmVpbmcgYnVpbHQuCi0gICAgIFRoZSB0eXBlIG9mIHRoZSB2YXJpYW50IG11c3QgYmUgcG9wcGVkIG9mZiB0aGUgdHlwZSBzdGFjay4gIFRoZQotICAgICBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhlCi0gICAgIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIHRoZSB2aXNpYmlsaXR5LCB3aGV0aGVyIHRoZSB2YXJpYW50IGlzCi0gICAgIGNvbnN0LCB3aGV0aGVyIHRoZSB2YXJpYW50IGlzIHZvbGF0aWxlLCB0aGUgb2Zmc2V0IGluIHRoZSB2aXJ0dWFsCi0gICAgIGZ1bmN0aW9uIHRhYmxlLCBhbmQgd2hldGhlciB0aGUgY29udGV4dCBpcyBvbiB0aGUgdHlwZSBzdGFjawotICAgICAoYmVsb3cgdGhlIHZhcmlhbnQgdHlwZSkuICAqLwotICBib29sZWFuICgqY2xhc3NfbWV0aG9kX3ZhcmlhbnQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotCQkJCQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHksCi0JCQkJCSAgIGJvb2xlYW4sIGJvb2xlYW4sCi0JCQkJCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLQotICAvKiBEZXNjcmliZSBhIHN0YXRpYyB2YXJpYW50IHRvIHRoZSBjbGFzcyBtZXRob2QgY3VycmVudGx5IGJlaW5nCi0gICAgIGJ1aWx0LiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIGNsYXNzX21ldGhvZF92YXJpYW50LAotICAgICBleGNlcHQgdGhhdCB0aGUgbGFzdCB0d28gYXJndW1lbnRzIGFyZSBvbWl0dGVkLiAgVGhlIHR5cGUgb2YgdGhlCi0gICAgIHZhcmlhbnQgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JCQkJCQkgIGVudW0gZGVidWdfdmlzaWJpbGl0eSwKLQkJCQkJCSAgYm9vbGVhbiwgYm9vbGVhbikpOwotCi0gIC8qIEZpbmlzaCBkZXNjcmliaW5nIGEgY2xhc3MgbWV0aG9kLiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX2VuZF9tZXRob2QpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIEZpbmlzaCBkZXNjcmliaW5nIGEgY2xhc3MsIGFuZCBwdXNoIGl0IG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqZW5kX2NsYXNzX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYSB0eXBlIG9uIHRoZSBzdGFjayB3aGljaCB3YXMgZ2l2ZW4gYSBuYW1lIGJ5IGFuIGVhcmxpZXIKLSAgICAgY2FsbCB0byB0eXBkZWYuICAqLwotICBib29sZWFuICgqdHlwZWRlZl90eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIFB1c2ggYSB0YWdnZWQgdHlwZSBvbiB0aGUgc3RhY2sgd2hpY2ggd2FzIGRlZmluZWQgZWFybGllci4gIElmCi0gICAgIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZSB0eXBlIHdhcyBkZWZpbmVkIGJ5IGEgY2FsbAotICAgICB0byB0YWcuICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIE5VTEwsIHRoZSB0eXBlIHdhcyBkZWZpbmVkIGJ5Ci0gICAgIGEgY2FsbCB0byBzdGFydF9zdHJ1Y3RfdHlwZSBvciBzdGFydF9jbGFzc190eXBlIHdpdGggYSB0YWcgb2YKLSAgICAgTlVMTCBhbmQgdGhlIG51bWJlciBvZiB0aGUgdGhpcmQgYXJndW1lbnQuICBFaXRoZXIgd2F5LCB0aGUKLSAgICAgZm91cnRoIGFyZ3VtZW50IGlzIHRoZSB0YWcga2luZC4gIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBjYWxsZWQKLSAgICAgZm9yIGEgc3RydWN0IChjbGFzcykgYmVpbmcgZGVmaW5lZCwgaW4gYmV0d2VlbiB0aGUgY2FsbCB0bwotICAgICBzdGFydF9zdHJ1Y3RfdHlwZSAoc3RhcnRfY2xhc3NfdHlwZSkgYW5kIHRoZSBjYWxsIHRvCi0gICAgIGVuZF9zdHJ1Y3RfdHlwZSAoZW5kX2NsYXNzX3R5cGUpLiAgKi8KLSAgYm9vbGVhbiAoKnRhZ190eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJICAgICAgIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci0KLSAgLyogUG9wIHRoZSB0eXBlIHN0YWNrLCBhbmQgdHlwZWRlZiBpdCB0byB0aGUgZ2l2ZW4gbmFtZS4gICovCi0gIGJvb2xlYW4gKCp0eXBkZWYpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogUG9wIHRoZSB0eXBlIHN0YWNrLCBhbmQgZGVjbGFyZSBpdCBhcyBhIHRhZ2dlZCBzdHJ1Y3Qgb3IgdW5pb24gb3IKLSAgICAgZW51bSBvciB3aGF0ZXZlci4gIFRoZSB0YWcgcGFzc2VkIGRvd24gaGVyZSBpcyByZWR1bmRhbnQsIHNpbmNlCi0gICAgIHdhcyBhbHNvIHBhc3NlZCB3aGVuIGVudW1fdHlwZSwgc3RhcnRfc3RydWN0X3R5cGUsIG9yCi0gICAgIHN0YXJ0X2NsYXNzX3R5cGUgd2FzIGNhbGxlZC4gICovCi0gIGJvb2xlYW4gKCp0YWcpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgdG8gcmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCi0gIGJvb2xlYW4gKCppbnRfY29uc3RhbnQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgdG8gcmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotICBib29sZWFuICgqZmxvYXRfY29uc3RhbnQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkb3VibGUpKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSB0eXBlZCBpbnRlZ2VyIGNvbnN0YW50LiAgVGhlIHR5cGUgaXMKLSAgICAgcG9wcGVkIG9mZiB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp0eXBlZF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSB2YXJpYWJsZS4gIFRoZSB0eXBlIGlzIHBvcHBlZCBvZmYgdGhlCi0gICAgIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqdmFyaWFibGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLAotCQkJICAgICAgIGJmZF92bWEpKTsKLQotICAvKiBTdGFydCB3cml0aW5nIG91dCBhIGZ1bmN0aW9uLiAgVGhlIHJldHVybiB0eXBlIG11c3QgYmUgcG9wcGVkIG9mZgotICAgICB0aGUgc3RhY2suICBUaGUgYm9vbGVhbiBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBpcyBnbG9iYWwuICBUaGlzCi0gICAgIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIGZ1bmN0aW9uX3BhcmFtZXRlciwgZm9sbG93ZWQgYnkgYmxvY2sKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqc3RhcnRfZnVuY3Rpb24pIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci0KLSAgLyogUmVjb3JkIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4gIFRoZSB0eXBlCi0gICAgIG11c3QgYmUgcG9wcGVkIG9mZiB0aGUgc3RhY2suICAqLwotICBib29sZWFuICgqZnVuY3Rpb25fcGFyYW1ldGVyKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkJCQkJIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7Ci0KLSAgLyogU3RhcnQgd3JpdGluZyBvdXQgYSBibG9jay4gIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSB0b3AgbGV2ZWwgYmxvY2sKLSAgICAgcGVyIGZ1bmN0aW9uLiAgQmxvY2tzIG1heSBiZSBuZXN0ZWQuICBUaGUgYXJndW1lbnQgaXMgdGhlCi0gICAgIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGJsb2NrLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X2Jsb2NrKSBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotICAvKiBGaW5pc2ggd3JpdGluZyBvdXQgYSBibG9jay4gIFRoZSBhcmd1bWVudCBpcyB0aGUgZW5kaW5nIGFkZHJlc3MKLSAgICAgb2YgdGhlIGJsb2NrLiAgKi8KLSAgYm9vbGVhbiAoKmVuZF9ibG9jaykgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLSAgLyogRmluaXNoIHdyaXRpbmcgb3V0IGEgZnVuY3Rpb24uICAqLwotICBib29sZWFuICgqZW5kX2Z1bmN0aW9uKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBSZWNvcmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBib29sZWFuICgqbGluZW5vKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotfTsKLQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zLiAgKi8KLQotLyogVGhlIGZpcnN0IGFyZ3VtZW50IHRvIG1vc3Qgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGEgaGFuZGxlLiAgVGhpcwotICAgaGFuZGxlIGlzIHJldHVybmVkIGJ5IHRoZSBkZWJ1Z19pbml0IGZ1bmN0aW9uLiAgVGhlIHB1cnBvc2Ugb2YgdGhlCi0gICBoYW5kbGUgaXMgdG8gcGVybWl0IHRoZSBkZWJ1Z2dpbmcgcm91dGluZXMgdG8gbm90IHVzZSBzdGF0aWMKLSAgIHZhcmlhYmxlcywgYW5kIGhlbmNlIHRvIGJlIHJlZW50cmFudC4gIFRoaXMgd291bGQgYmUgdXNlZnVsIGZvciBhCi0gICBwcm9ncmFtIHdoaWNoIHdhbnRlZCB0byBoYW5kbGUgdHdvIGV4ZWN1dGFibGVzIHNpbXVsdGFuZW91c2x5LiAgKi8KLQotLyogUmV0dXJuIGEgZGVidWdnaW5nIGhhbmRsZS4gICovCi0KLWV4dGVybiBQVFIgZGVidWdfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFNldCB0aGUgc291cmNlIGZpbGVuYW1lLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIG5ldyBjb21waWxhdGlvbgotICAgdW5pdC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3NldF9maWxlbmFtZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBDaGFuZ2Ugc291cmNlIGZpbGVzIHRvIHRoZSBnaXZlbiBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQgZm9yCi0gICBpbmNsdWRlIGZpbGVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogUmVjb3JkIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoaXMgaW1wbGljaXRseSBzdGFydHMgYSBmdW5jdGlvbgotICAgYmxvY2suICBUaGUgZGVidWdfdHlwZSBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLgotICAgVGhlIGJvb2xlYW4gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGdsb2JhbGx5IHZpc2libGUuCi0gICBUaGUgYmZkX3ZtYSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgQ3VycmVudGx5Ci0gICB0aGUgcGFyYW1ldGVyIHR5cGVzIGFyZSBzcGVjaWZpZWQgYnkgY2FsbHMgdG8KLSAgIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24KLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGJvb2xlYW4sIGJmZF92bWEpKTsKLQotLyogUmVjb3JkIGEgcGFyYW1ldGVyIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7Ci0KLS8qIEVuZCBhIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGUgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlCi0gICBmdW5jdGlvbiBlbmRzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfZW5kX2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotCi0vKiBTdGFydCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBBbGwgbG9jYWwgaW5mb3JtYXRpb24gd2lsbCBiZQotICAgcmVjb3JkZWQgaW4gdGhpcyBibG9jaywgdW50aWwgdGhlIG1hdGNoaW5nIGNhbGwgdG8gZGVidWdfZW5kX2Jsb2NrLgotICAgZGVidWdfc3RhcnRfYmxvY2sgYW5kIGRlYnVnX2VuZF9ibG9jayBtYXkgYmUgbmVzdGVkLiAgVGhlIGFyZ3VtZW50Ci0gICBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGlzIGJsb2NrIHN0YXJ0cy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3N0YXJ0X2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotCi0vKiBGaW5pc2ggYSBibG9jayBpbiBhIGZ1bmN0aW9uLiAgVGhpcyBtYXRjaGVzIHRoZSBjYWxsIHRvCi0gICBkZWJ1Z19zdGFydF9ibG9jay4gIFRoZSBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGlzIGJsb2NrCi0gICBlbmRzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfZW5kX2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotCi0vKiBBc3NvY2lhdGUgYSBsaW5lIG51bWJlciBpbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSB3aXRoIGEgZ2l2ZW4KLSAgIGFkZHJlc3MuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfbGluZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotLyogU3RhcnQgYSBuYW1lZCBjb21tb24gYmxvY2suICBUaGlzIGlzIGEgYmxvY2sgb2YgdmFyaWFibGVzIHRoYXQgbWF5Ci0gICBtb3ZlIGluIG1lbW9yeS4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jayBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBFbmQgYSBuYW1lZCBjb21tb24gYmxvY2suICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFJlY29yZCBhIG5hbWVkIGludGVnZXIgY29uc3RhbnQuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfaW50X2NvbnN0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIG5hbWVkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2Zsb2F0X2NvbnN0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkb3VibGUpKTsKLQotLyogUmVjb3JkIGEgdHlwZWQgY29uc3RhbnQgd2l0aCBhbiBpbnRlZ3JhbCB2YWx1ZS4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF90eXBlZF9jb25zdAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgYmZkX3ZtYSkpOwotCi0vKiBSZWNvcmQgYSBsYWJlbC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9sYWJlbAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgYmZkX3ZtYSkpOwotCi0vKiBSZWNvcmQgYSB2YXJpYWJsZS4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF92YXJpYWJsZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z192YXJfa2luZCwgYmZkX3ZtYSkpOwotCi0vKiBNYWtlIGFuIGluZGlyZWN0IHR5cGUuICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHRoZQotICAgbG9jYXRpb24gd2hlcmUgdGhlIHJlYWwgdHlwZSB3aWxsIGJlIHBsYWNlZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQKLSAgIGlzIHRoZSB0eXBlIHRhZywgaWYgdGhlcmUgaXMgb25lOyB0aGlzIG1heSBiZSBOVUxMOyB0aGUgb25seQotICAgcHVycG9zZSBvZiB0aGlzIGFyZ3VtZW50IGlzIHNvIHRoYXQgZGVidWdfZ2V0X3R5cGVfbmFtZSBjYW4gcmV0dXJuCi0gICBzb21ldGhpbmcgdXNlZnVsLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB3aGVuIGEgdHlwZSBpcwotICAgcmVmZXJlbmNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIE1ha2UgYSB2b2lkIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLQotLyogTWFrZSBhbiBpbnRlZ2VyIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgVGhlIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZQotICAgaWYgdGhlIGludGVnZXIgaXMgdW5zaWduZWQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2ludF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYSBmbG9hdGluZyBwb2ludCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gIEZJWE1FOiBPbiBzb21lCi0gICBwbGF0Zm9ybXMsIGxpa2UgYW4gQWxwaGEsIHlvdSBwcm9iYWJseSBuZWVkIHRvIGJlIGFibGUgdG8gc3BlY2lmeQotICAgdGhlIGZvcm1hdC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0vKiBNYWtlIGEgYm9vbGVhbiB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIE1ha2UgYSBjb21wbGV4IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogTWFrZSBhIHN0cnVjdHVyZSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0cnVlIGZvciBhIHN0cnVjdCwKLSAgIGZhbHNlIGZvciBhIHVuaW9uLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QuCi0gICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcy4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBib29sZWFuLCBiZmRfdm1hLCBkZWJ1Z19maWVsZCAqKSk7Ci0KLS8qIE1ha2UgYW4gb2JqZWN0IHR5cGUuICBUaGUgZmlyc3QgdGhyZWUgYXJndW1lbnRzIGFmdGVyIHRoZSBoYW5kbGUKLSAgIGFyZSB0aGUgc2FtZSBhcyBmb3IgZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZS4gIFRoZSBuZXh0IGFyZ3VtZW50cyBhcmUKLSAgIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGJhc2UgY2xhc3NlcywgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YKLSAgIG1ldGhvZHMsIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaG9sZGluZyB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQotICAgaWYgaXQgaXMgbm90IHRoaXMgb2JqZWN0LCBhbmQgYSBib29sZWFuIHdoaWNoIGlzIHRydWUgaWYgdGhpcwotICAgb2JqZWN0IGhhcyBpdHMgb3duIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX29iamVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgYmZkX3ZtYSwgZGVidWdfZmllbGQgKiwgZGVidWdfYmFzZWNsYXNzICosCi0JICAgZGVidWdfbWV0aG9kICosIGRlYnVnX3R5cGUsIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhbiBlbnVtZXJhdGlvbiB0eXBlLiAgVGhlIGFyZ3VtZW50cyBhcmUgYSBudWxsIHRlcm1pbmF0ZWQKLSAgIGFycmF5IG9mIHN0cmluZ3MsIGFuZCBhbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfZW51bV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotCi0vKiBNYWtlIGEgcG9pbnRlciB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIGZ1bmN0aW9uIHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSByZXR1cm4gdHlwZS4gIFRoZQotICAgdGhpcmQgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICBUaGUKLSAgIGZvdXJ0aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZgotICAgYXJndW1lbnRzLiAgSWYgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIE5VTEwsIHRoZW4gdGhlIGFyZ3VtZW50IHR5cGVzCi0gICBhcmUgdW5rbm93bi4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGRlYnVnX3R5cGUgKiwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgcmVmZXJlbmNlIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIE1ha2UgYSByYW5nZSBvZiBhIGdpdmVuIHR5cGUgZnJvbSBhIGxvd2VyIHRvIGFuIHVwcGVyIGJvdW5kLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9yYW5nZV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci0KLS8qIE1ha2UgYW4gYXJyYXkgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYW4gZWxlbWVudAotICAgb2YgdGhlIGFycmF5LiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGEgcmFuZ2Ugb2YgdGhlCi0gICBhcnJheS4gIFRoZSBmb3VydGggYW5kIGZpZnRoIGFyZ3VtZW50IGFyZSB0aGUgbG93ZXIgYW5kIHVwcGVyCi0gICBib3VuZHMsIHJlc3BlY3RpdmVseSAoaWYgdGhlIGJvdW5kcyBhcmUgbm90IGtub3duLCBsb3dlciBzaG91bGQgYmUKLSAgIDAgYW5kIHVwcGVyIHNob3VsZCBiZSAtMSkuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzCi0gICBhcnJheSBpcyBhY3R1YWxseSBhIHN0cmluZywgYXMgaW4gQy4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGRlYnVnX3R5cGUsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwKLQkgICBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYSBzZXQgb2YgYSBnaXZlbiB0eXBlLiAgRm9yIGV4YW1wbGUsIGEgUGFzY2FsIHNldCB0eXBlLiAgVGhlCi0gICBib29sZWFuIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcyBzZXQgaXMgYWN0dWFsbHkgYSBiaXRzdHJpbmcsIGFzIGluCi0gICBDSElMTC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfc2V0X3R5cGUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYSB0eXBlIGZvciBhIHBvaW50ZXIgd2hpY2ggaXMgcmVsYXRpdmUgdG8gYW4gb2JqZWN0LiAgVGhlCi0gICBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byB3aGljaCB0aGUgcG9pbnRlciBpcwotICAgcmVsYXRpdmUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgdGhhdCB0aGUgcG9pbnRlciBwb2ludHMKLSAgIHRvLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9vZmZzZXRfdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHR5cGUgZm9yIGEgbWV0aG9kIGZ1bmN0aW9uLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUKLSAgIHJldHVybiB0eXBlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBkb21haW4uICBUaGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gIFRoZSBmaWZ0aAotICAgYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YKLSAgIGFyZ3VtZW50cywgaW4gd2hpY2ggY2FzZSB0aGUgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMgaW5kaWNhdGVzIHRoZQotICAgdHlwZXMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50cy4gIFRoZSBkb21haW4gYW5kIHRoZSBhcmd1bWVudCBhcnJheQotICAgbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UgdGhpcyBpcyBhIHN0dWIgbWV0aG9kIGFuZCB0aGF0Ci0gICBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgU3RhYnMgZGVidWdnaW5nIHVzZXMgdGhpcywgYW5kIGdldHMKLSAgIHRoZSBhcmd1bWVudCB0eXBlcyBmcm9tIHRoZSBtYW5nbGVkIG5hbWUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSAqLCBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdmVyc2lvbiBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIE1ha2UgYSB2b2xhdGlsZSBxdWFsaWZpZWQgdmVyc2lvbiBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIE1ha2UgYW4gdW5kZWZpbmVkIHRhZ2dlZCB0eXBlLiAgRm9yIGV4YW1wbGUsIGEgc3RydWN0IHdoaWNoIGhhcwotICAgYmVlbiBtZW50aW9uZWQsIGJ1dCBub3QgZGVmaW5lZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotCi0vKiBNYWtlIGEgYmFzZSBjbGFzcyBmb3IgYW4gb2JqZWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgYmFzZQotICAgY2xhc3MgdHlwZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgYml0IHBvc2l0aW9uIG9mIHRoaXMgYmFzZQotICAgY2xhc3MgaW4gdGhlIG9iamVjdC4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzIGEKLSAgIHZpcnR1YWwgY2xhc3MuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGJhc2UKLSAgIGNsYXNzLiAgKi8KLQotZXh0ZXJuIGRlYnVnX2Jhc2VjbGFzcyBkZWJ1Z19tYWtlX2Jhc2VjbGFzcwotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGJmZF92bWEsIGJvb2xlYW4sIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0vKiBNYWtlIGEgZmllbGQgZm9yIGEgc3RydWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZS4gIFRoZQotICAgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIGZpZWxkLiAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcwotICAgdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgZmllbGQuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHNpemUgb2YKLSAgIHRoZSBmaWVsZCAoaXQgbWF5IGJlIHplcm8pLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5Ci0gICBvZiB0aGUgZmllbGQuICAqLwotCi1leHRlcm4gZGVidWdfZmllbGQgZGVidWdfbWFrZV9maWVsZAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgYmZkX3ZtYSwgYmZkX3ZtYSwKLQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotLyogTWFrZSBhIHN0YXRpYyBtZW1iZXIgb2YgYW4gb2JqZWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUKLSAgIG5hbWUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIG1lbWJlci4gIFRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBtZW1iZXIgKGkuZS4sIHRoZSBuYW1lIGFzIGEKLSAgIGdsb2JhbCB2YXJpYWJsZSkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlCi0gICBtZW1iZXIuICAqLwotCi1leHRlcm4gZGVidWdfZmllbGQgZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBjb25zdCBjaGFyICosCi0JICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLS8qIE1ha2UgYSBtZXRob2QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLCBhbmQgdGhlIHRoaXJkCi0gICBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBtZXRob2QgdmFyaWFudHMuICBFYWNoCi0gICBtZXRob2QgdmFyaWFudCBpcyBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSBidXQgd2l0aCBkaWZmZXJlbnQKLSAgIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotZXh0ZXJuIGRlYnVnX21ldGhvZCBkZWJ1Z19tYWtlX21ldGhvZAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikpOwotCi0vKiBNYWtlIGEgbWV0aG9kIHZhcmlhbnQuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBwaHlzaWNhbCBuYW1lIG9mCi0gICB0aGUgZnVuY3Rpb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLAotICAgcHJvYmFibHkgY29uc3RydWN0ZWQgYnkgZGVidWdfbWFrZV9tZXRob2RfdHlwZS4gIFRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5LiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcwotICAgYSBjb25zdCBmdW5jdGlvbi4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYSB2b2xhdGlsZQotICAgZnVuY3Rpb24uICBUaGUgc2V2ZW50aCBhcmd1bWVudCBpcyB0aGUgaW5kZXggaW4gdGhlIHZpcnR1YWwKLSAgIGZ1bmN0aW9uIHRhYmxlLCBpZiBhbnkuICBUaGUgZWlnaHRoIGFyZ3VtZW50IGlzIHRoZSB2aXJ0dWFsCi0gICBmdW5jdGlvbiBjb250ZXh0LiAgKi8KLQotZXh0ZXJuIGRlYnVnX21ldGhvZF92YXJpYW50IGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwKLQkgICBib29sZWFuLCBiZmRfdm1hLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWV0aG9kIGFyZ3VtZW50LiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yCi0gICBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50LCBleGNlcHQgdGhhdCB0aGUgbGFzdCB0d28gYXJlIG9taXR0ZWQKLSAgIHNpbmNlIGEgc3RhdGljIG1ldGhvZCBjYW4gbm90IGFsc28gYmUgdmlydHVhbC4gICovCi0KLWV4dGVybiBkZWJ1Z19tZXRob2RfdmFyaWFudCBkZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLQotLyogTmFtZSBhIHR5cGUuICBUaGlzIHJldHVybnMgYSBuZXcgdHlwZSB3aXRoIGFuIGF0dGFjaGVkIG5hbWUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19uYW1lX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUpKTsKLQotLyogR2l2ZSBhIHRhZyB0byBhIHR5cGUsIHN1Y2ggYXMgYSBzdHJ1Y3Qgb3IgdW5pb24uICBUaGlzIHJldHVybnMgYQotICAgbmV3IHR5cGUgd2l0aCBhbiBhdHRhY2hlZCB0YWcuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z190YWdfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSkpOwotCi0vKiBSZWNvcmQgdGhlIHNpemUgb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3R5cGVfc2l6ZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIHVuc2lnbmVkIGludCkpOwotCi0vKiBGaW5kIGEgbmFtZWQgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBGaW5kIGEgdGFnZ2VkIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19maW5kX3RhZ2dlZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotCi0vKiBHZXQgdGhlIGtpbmQgb2YgYSB0eXBlLiAgKi8KLQotZXh0ZXJuIGVudW0gZGVidWdfdHlwZV9raW5kIGRlYnVnX2dldF90eXBlX2tpbmQgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIHR5cGUuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqZGVidWdfZ2V0X3R5cGVfbmFtZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSBzaXplIG9mIGEgdHlwZS4gICovCi0KLWV4dGVybiBiZmRfdm1hIGRlYnVnX2dldF90eXBlX3NpemUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdldCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2dldF9yZXR1cm5fdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgcGFyYW1ldGVyIHR5cGVzIGZvciBhIGZ1bmN0aW9uIG9yCi0gICBtZXRob2QgdHlwZSAoYWN0dWFsbHksIHBhcmFtZXRlciB0eXBlcyBhcmUgbm90IGN1cnJlbnRseSBzdG9yZWQgZm9yCi0gICBmdW5jdGlvbiB0eXBlcykuICBUaGlzIG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgbWV0aG9kCi0gICB0eXBlIGlzIGEgc3R1YiBtZXRob2Qgb3Igbm90LiAgVGhlIGxhc3QgYXJndW1lbnQgcG9pbnRzIHRvIGEKLSAgIGJvb2xlYW4gd2hpY2ggaXMgc2V0IHRvIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUKLSAgIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotCi1leHRlcm4gY29uc3QgZGVidWdfdHlwZSAqZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyBQQVJBTVMgKChQVFIsCi0JCQkJCQkJICAgIGRlYnVnX3R5cGUsCi0JCQkJCQkJICAgIGJvb2xlYW4gKikpOwotCi0vKiBHZXQgdGhlIHRhcmdldCB0eXBlIG9mIGEgcG9pbnRlciBvciByZWZlcmVuY2Ugb3IgY29uc3Qgb3Igdm9sYXRpbGUKLSAgIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdldCB0aGUgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QsIHVuaW9uLCBvcgotICAgY2xhc3MuICAqLwotCi1leHRlcm4gY29uc3QgZGVidWdfZmllbGQgKmRlYnVnX2dldF9maWVsZHMgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdldCB0aGUgdHlwZSBvZiBhIGZpZWxkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZ2V0X2ZpZWxkX3R5cGUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBmaWVsZC4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpkZWJ1Z19nZXRfZmllbGRfbmFtZSBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgYml0IHBvc2l0aW9uIG9mIGEgZmllbGQgd2l0aGluIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZS4KLSAgIElmIHRoZSBmaWVsZCBpcyBhIHN0YXRpYyBtZW1iZXIsIHRoaXMgd2lsbCByZXR1cm4gKGJmZF92bWEpIC0xLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgYml0IHNpemUgb2YgYSBmaWVsZC4gIElmIHRoZSBmaWVsZCBpcyBhIHN0YXRpYyBtZW1iZXIsIHRoaXMKLSAgIHdpbGwgcmV0dXJuIChiZmRfdm1hKSAtMS4gICovCi0KLWV4dGVybiBiZmRfdm1hIGRlYnVnX2dldF9maWVsZF9iaXRzaXplIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSB2aXNpYmlsaXR5IG9mIGEgZmllbGQuICAqLwotCi1leHRlcm4gZW51bSBkZWJ1Z192aXNpYmlsaXR5IGRlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5Ci0gIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBwaHlzaWNhbCBuYW1lIG9mIGEgZmllbGQsIGlmIGl0IGlzIGEgc3RhdGljIG1lbWJlci4gIElmIHRoZQotICAgZmllbGQgaXMgbm90IGEgc3RhdGljIG1lbWJlciwgdGhpcyB3aWxsIHJldHVybiBOVUxMLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlYnVnX2dldF9maWVsZF9waHlzbmFtZSBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgcmVjb3JkZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyB0YWtlcyBhIHNldCBvZgotICAgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIGNhbGxlZCB0byBkbyB0aGUgYWN0dWFsIHdyaXRpbmcuICBUaGUKLSAgIGZpcnN0IFBUUiBpcyB0aGUgZGVidWdnaW5nIGhhbmRsZS4gIFRoZSBzZWNvbmQgUFRSIGlzIGEgaGFuZGxlCi0gICB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3dyaXRlIFBBUkFNUyAoKFBUUiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIpKTsKLQotI2VuZGlmIC8qIERFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlZmxleC5sIGIvYmludXRpbHMvZGVmbGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YTQzYzAuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGVmbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0ley8qIGRlZmxleC5sIC0gTGV4ZXIgZm9yIC5kZWYgZmlsZXMgKi8KLQotLyogICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgotICAgCQkgIHNhY0BjeWdudXMuY29tCi0KLSovCi0jZGVmaW5lIERPTlRERUNMQVJFX01BTExPQwotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlZnBhcnNlLmgiCi0jaW5jbHVkZSAiZGxsdG9vbC5oIgotCi1pbnQgbGluZW51bWJlcjsKLQotJX0KLSUlCi0iTkFNRSIgCQl7IHJldHVybiBOQU1FO30KLSJMSUJSQVJZIgl7IHJldHVybiBMSUJSQVJZO30KLSJERVNDUklQVElPTiIgCXsgcmV0dXJuIERFU0NSSVBUSU9OO30KLSJTVEFDS1NJWkUiCXsgcmV0dXJuIFNUQUNLU0laRTt9Ci0iSEVBUFNJWkUiIAl7IHJldHVybiBIRUFQU0laRTt9Ci0iQ09ERSIgCQl7IHJldHVybiBDT0RFO30KLSJEQVRBIgkJeyByZXR1cm4gREFUQTt9Ci0iU0VDVElPTlMiCXsgcmV0dXJuIFNFQ1RJT05TO30KLSJFWFBPUlRTIgl7IHJldHVybiBFWFBPUlRTO30KLSJJTVBPUlRTIgl7IHJldHVybiBJTVBPUlRTO30KLSJWRVJTSU9OIgl7IHJldHVybiBWRVJTSU9OSzt9Ci0iQkFTRSIJCXsgcmV0dXJuIEJBU0U7fQotIkNPTlNUQU5UIgl7IHJldHVybiBDT05TVEFOVDsgfQotIk5PTkFNRSIJeyByZXR1cm4gTk9OQU1FOyB9Ci0iUkVBRCIJCXsgcmV0dXJuIFJFQUQ7fQotIldSSVRFIgkJeyByZXR1cm4gV1JJVEU7fQotIkVYRUNVVEUiCXsgcmV0dXJuIEVYRUNVVEU7fQotIlNIQVJFRCIJeyByZXR1cm4gU0hBUkVEO30KLSJOT05TSEFSRUQiCXsgcmV0dXJuIE5PTlNIQVJFRDt9Ci0iU0lOR0xFIgl7IHJldHVybiBTSU5HTEU7fQotIk1VTFRJUExFIgl7IHJldHVybiBNVUxUSVBMRTt9Ci0iSU5JVElOU1RBTkNFIgl7IHJldHVybiBJTklUSU5TVEFOQ0U7fQotIklOSVRHTE9CQUwiCXsgcmV0dXJuIElOSVRHTE9CQUw7fQotIlRFUk1JTlNUQU5DRSIJeyByZXR1cm4gVEVSTUlOU1RBTkNFO30KLSJURVJNR0xPQkFMIgl7IHJldHVybiBURVJNR0xPQkFMO30KLQotWzAtOV1beDAtOUEtRmEtZl0qIHsgeXlsdmFsLm51bWJlciA9IHN0cnRvbCAoeXl0ZXh0LDAsMCk7IAotCQlyZXR1cm4gTlVNQkVSOyB9Ci0KLVtBLVphLXokOlwtXF8/XVtBLVphLXowLTkvJDpcLVxfQD9dKiB7IAkKLQkJeXlsdmFsLmlkID0gIHhzdHJkdXAgKHl5dGV4dCk7Ci0JCXJldHVybiBJRDsKLQkJfQotCi0iXCIiW15cIl0qIlwiIiB7Ci0JCXl5bHZhbC5pZCA9IHhzdHJkdXAgKHl5dGV4dCsxKTsKLQkJeXlsdmFsLmlkW3l5bGVuZy0yXSA9IDA7Ci0JCXJldHVybiBJRDsKLQkJfQotCi0iXCciW15cJ10qIlwnIiB7Ci0JCXl5bHZhbC5pZCA9IHhzdHJkdXAgKHl5dGV4dCsxKTsKLQkJeXlsdmFsLmlkW3l5bGVuZy0yXSA9IDA7Ci0JCXJldHVybiBJRDsKLQkJfQotIioiLiogCQl7IH0KLSI7Ii4qIAkJeyB9Ci0iICIJCXsgfQotIlx0IgkJeyB9Ci0iXG4iCSAJeyBsaW5lbnVtYmVyICsrIDt9Ci0iPSIgCQl7IHJldHVybiAnPSc7fQotIi4iIAkJeyByZXR1cm4gJy4nO30KLSJAIgkgCXsgcmV0dXJuICdAJzt9Ci0iLCIJCXsgcmV0dXJuICcsJzt9Ci0lJQotI2lmbmRlZiB5eXdyYXAKLS8qIE5lZWRlZCBmb3IgbGV4LCB0aG91Z2ggbm90IGZsZXguICovCi1pbnQgeXl3cmFwKCkgeyByZXR1cm4gMTsgfQotI2VuZGlmCmRpZmYgLS1naXQgYS9iaW51dGlscy9kZWZwYXJzZS55IGIvYmludXRpbHMvZGVmcGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxOGQ0Ni4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWZwYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSV7IC8qIGRlZnBhcnNlLnkgLSBwYXJzZXIgZm9yIC5kZWYgZmlsZXMgKi8KLQotLyogICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImRsbHRvb2wuaCIKLSV9Ci0KLSV1bmlvbiB7Ci0gIGNoYXIgKmlkOwotICBpbnQgbnVtYmVyOwotfTsKLQotJXRva2VuIE5BTUUsIExJQlJBUlksIERFU0NSSVBUSU9OLCBTVEFDS1NJWkUsIEhFQVBTSVpFLCBDT0RFLCBEQVRBCi0ldG9rZW4gU0VDVElPTlMsIEVYUE9SVFMsIElNUE9SVFMsIFZFUlNJT05LLCBCQVNFLCBDT05TVEFOVAotJXRva2VuIFJFQUQgV1JJVEUgRVhFQ1VURSBTSEFSRUQgTk9OU0hBUkVEIE5PTkFNRQotJXRva2VuIFNJTkdMRSBNVUxUSVBMRSBJTklUSU5TVEFOQ0UgSU5JVEdMT0JBTCBURVJNSU5TVEFOQ0UgVEVSTUdMT0JBTAotJXRva2VuIDxpZD4gSUQKLSV0b2tlbiA8bnVtYmVyPiBOVU1CRVIKLSV0eXBlICA8bnVtYmVyPiBvcHRfYmFzZSBvcHRfb3JkaW5hbCBvcHRfTk9OQU1FIG9wdF9DT05TVEFOVCBvcHRfREFUQQotJXR5cGUgIDxudW1iZXI+IGF0dHIgYXR0cl9saXN0IG9wdF9udW1iZXIKLSV0eXBlICA8aWQ+IG9wdF9uYW1lIG9wdF9lcXVhbF9uYW1lIAotCi0lJQotCi1zdGFydDogc3RhcnQgY29tbWFuZAotCXwgY29tbWFuZAotCTsKLQotY29tbWFuZDogCi0JCU5BTUUgb3B0X25hbWUgb3B0X2Jhc2UgeyBkZWZfbmFtZSAoJDIsICQzKTsgfQotCXwJTElCUkFSWSBvcHRfbmFtZSBvcHRfYmFzZSBvcHRpb25fbGlzdCB7IGRlZl9saWJyYXJ5ICgkMiwgJDMpOyB9Ci0JfAlFWFBPUlRTIGV4cGxpc3QgCi0JfAlERVNDUklQVElPTiBJRCB7IGRlZl9kZXNjcmlwdGlvbiAoJDIpO30KLQl8CVNUQUNLU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9zdGFja3NpemUgKCQyLCAkMyk7fQotCXwJSEVBUFNJWkUgTlVNQkVSIG9wdF9udW1iZXIgeyBkZWZfaGVhcHNpemUgKCQyLCAkMyk7fQotCXwJQ09ERSBhdHRyX2xpc3QgeyBkZWZfY29kZSAoJDIpO30KLQl8CURBVEEgYXR0cl9saXN0ICB7IGRlZl9kYXRhICgkMik7fQotCXwJU0VDVElPTlMgc2VjbGlzdAotCXwJSU1QT1JUUyBpbXBsaXN0Ci0JfAlWRVJTSU9OSyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsMCk7fQotCXwJVkVSU0lPTksgTlVNQkVSICcuJyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsJDQpO30KLQk7Ci0KLQotZXhwbGlzdDoKLQkJLyogRU1QVFkgKi8KLQl8CWV4cGxpc3QgZXhwbGluZQotCTsKLQotZXhwbGluZToKLQkJSUQgb3B0X2VxdWFsX25hbWUgb3B0X29yZGluYWwgb3B0X05PTkFNRSBvcHRfQ09OU1RBTlQgb3B0X0RBVEEKLQkJCXsgZGVmX2V4cG9ydHMgKCQxLCAkMiwgJDMsICQ0LCAkNSwgJDYpO30KLQk7Ci1pbXBsaXN0OgkKLQkJaW1wbGlzdCBpbXBsaW5lCi0JfAlpbXBsaW5lCi0JOwotCi1pbXBsaW5lOgotICAgICAgICAgICAgICAgSUQgJz0nIElEICcuJyBJRCAnLicgSUQgICAgIHsgZGVmX2ltcG9ydCAoJDEsJDMsJDUsJDcsIDApOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBOVU1CRVIgeyBkZWZfaW1wb3J0ICgkMSwkMywkNSwgMCwkNyk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgSUQgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCQxLCQzLCAwLCQ1LCAwKTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBOVU1CRVIgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsJDMsIDAsIDAsJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwkMywkNSwgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBJRCAnLicgTlVNQkVSICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCQzLCAwLCQ1KTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIElEICAgICAgICAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsJDEsIDAsJDMsIDApOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgTlVNQkVSICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwgMCwgMCwkMyk7IH0KLTsKLQotc2VjbGlzdDoKLQkJc2VjbGlzdCBzZWNsaW5lCi0JfAlzZWNsaW5lCi0JOwotCi1zZWNsaW5lOgotCUlEIGF0dHJfbGlzdCB7IGRlZl9zZWN0aW9uICgkMSwkMik7fQotCTsKLQotYXR0cl9saXN0OgotCWF0dHJfbGlzdCBvcHRfY29tbWEgYXR0cgotCXwgYXR0cgotCTsKLQotb3B0X2NvbW1hOgotCScsJwotCXwgCi0JOwotb3B0X251bWJlcjogJywnIE5VTUJFUiB7ICQkPSQyO30KLQl8CSAgIHsgJCQ9LTE7fQotCTsKLQkKLWF0dHI6Ci0JCVJFQUQgeyAkJCA9IDE7IH0KLQl8CVdSSVRFIHsgJCQgPSAyOyB9Ci0JfAlFWEVDVVRFIHsgJCQgPSA0OyB9Ci0JfAlTSEFSRUQgeyAkJCA9IDg7IH0KLQl8CU5PTlNIQVJFRCB7ICQkID0gMDsgfQotCXwJU0lOR0xFIHsgJCQgPSAwOyB9Ci0JfAlNVUxUSVBMRSB7ICQkID0gMDsgfQotCTsKLQotb3B0X0NPTlNUQU5UOgotCQlDT05TVEFOVCB7JCQ9MTt9Ci0JfAkJIHskJD0wO30KLQk7Ci0KLW9wdF9OT05BTUU6Ci0JCU5PTkFNRSB7JCQ9MTt9Ci0JfAkJIHskJD0wO30KLQk7Ci0KLW9wdF9EQVRBOgotCQlEQVRBIHsgJCQgPSAxOyB9Ci0JfAkgICAgIHsgJCQgPSAwOyB9Ci0JOwotCi1vcHRfbmFtZTogSUQJCXsgJCQgPSQxOyB9Ci0JfCBJRCAnLicgSUQJCi0JICB7IAotCSAgICBjaGFyICpuYW1lID0geG1hbGxvYyAoc3RybGVuICgkMSkgKyAxICsgc3RybGVuICgkMykgKyAxKTsKLQkgICAgc3ByaW50ZiAobmFtZSwgIiVzLiVzIiwgJDEsICQzKTsKLQkgICAgJCQgPSBuYW1lOwotCSAgfQotCXwJCXsgJCQ9IiI7IH0KLQk7Ci0KLW9wdF9vcmRpbmFsOiAKLQkgICdAJyBOVU1CRVIgICAgIHsgJCQ9JDI7fQotCXwgICAgICAgICAgICAgICAgeyAkJD0tMTt9Ci0JOwotCi1vcHRfZXF1YWxfbmFtZToKLSAgICAgICAgICAnPScgSUQJeyAkJCA9ICQyOyB9Ci0gICAgICAgIHwgCQl7ICQkID0gIDA7IH0JCQkgCi0JOwotCi1vcHRfYmFzZTogQkFTRQknPScgTlVNQkVSCXsgJCQ9ICQzO30KLQl8CXsgJCQ9LTE7fQotCTsKLQotb3B0aW9uX2xpc3Q6Ci0JCS8qIGVtcHR5ICovCi0JfAlvcHRpb25fbGlzdCBvcHRfY29tbWEgb3B0aW9uCi0JOwotCi1vcHRpb246Ci0JCUlOSVRJTlNUQU5DRQotCXwJSU5JVEdMT0JBTAotCXwJVEVSTUlOU1RBTkNFCi0JfAlURVJNR0xPQkFMCi0JOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVwLWluLnNlZCBiL2JpbnV0aWxzL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MTkyMWEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTpsb29wCi0vXFwkL04KLS9cXCQvYiBsb29wCi0KLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQEJGRERJUkAhJChCRkRESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi1zIUBPQkpESVJALyEhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi0vOiQvZAotCi1zL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAotICAvZwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGxsdG9vbC5jIGIvYmludXRpbHMvZGxsdG9vbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzIwNmE2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RsbHRvb2wuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MDAgKzAsMCBAQAotLyogZGxsdG9vbC5jIC0tIHRvb2wgdG8gZ2VuZXJhdGUgc3R1ZmYgZm9yIFBFIHN0eWxlIERMTHMKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKgotICAgVGhpcyBwcm9ncmFtIGFsbG93cyB5b3UgdG8gYnVpbGQgdGhlIGZpbGVzIG5lY2Vzc2FyeSB0byBjcmVhdGUKLSAgIERMTHMgdG8gcnVuIG9uIGEgc3lzdGVtIHdoaWNoIHVuZGVyc3RhbmRzIFBFIGZvcm1hdCBpbWFnZSBmaWxlcy4KLSAgIChlZywgV2luZG93cyBOVCkKLQotICAgU2VlICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICBBbHNvIHNlZSAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQsCi0gICBTcGVjaWZpY2F0aW9uIDQuMSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgIEEgRExMIGNvbnRhaW5zIGFuIGV4cG9ydCB0YWJsZSB3aGljaCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KLSAgIHdoaWNoIHRoZSBydW50aW1lIGxvYWRlciBuZWVkcyB0byB0aWUgdXAgcmVmZXJlbmNlcyBmcm9tIGEKLSAgIHJlZmVyZW5jaW5nIHByb2dyYW0uCi0KLSAgIFRoZSBleHBvcnQgdGFibGUgaXMgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbSBieSByZWFkaW5nCi0gICBpbiBhIC5ERUYgZmlsZSBvciBzY2FubmluZyB0aGUgLmEgYW5kIC5vIGZpbGVzIHdoaWNoIHdpbGwgYmUgaW4gdGhlCi0gICBETEwuICBBIC5vIGZpbGUgY2FuIGNvbnRhaW4gaW5mb3JtYXRpb24gaW4gc3BlY2lhbCAgIi5kcmVjdHZlIiBzZWN0aW9ucwotICAgd2l0aCBleHBvcnQgaW5mb3JtYXRpb24uCi0KLSAgIEEgREVGIGZpbGUgY29udGFpbnMgYW55IG51bWJlciBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotCi0KLSAgIE5BTUUgPG5hbWU+IFsgLCA8YmFzZT4gXQotICAgVGhlIHJlc3VsdCBpcyBnb2luZyB0byBiZSA8bmFtZT4uRVhFCi0KLSAgIExJQlJBUlkgPG5hbWU+IFsgLCA8YmFzZT4gXQotICAgVGhlIHJlc3VsdCBpcyBnb2luZyB0byBiZSA8bmFtZT4uRExMCi0KLSAgIEVYUE9SVFMgICggPG5hbWUxPiBbID0gPG5hbWUyPiBdIFsgQCA8aW50ZWdlcj4gXSBbIE5PTkFNRSBdIFtDT05TVEFOVF0gW0RBVEFdICkgKgotICAgRGVjbGFyZXMgbmFtZTEgYXMgYW4gZXhwb3J0ZWQgc3ltYm9sIGZyb20gdGhlCi0gICBETEwsIHdpdGggb3B0aW9uYWwgb3JkaW5hbCBudW1iZXIgPGludGVnZXI+Ci0KLSAgIElNUE9SVFMgICggICggICA8aW50ZXJuYWwtbmFtZT4gPSAgIDxtb2R1bGUtbmFtZT4gLiA8aW50ZWdlcj4gKQotICAgICAgICAgICAgIHwgKCBbIDxpbnRlcm5hbC1uYW1lPiA9IF0gPG1vZHVsZS1uYW1lPiAuIDxleHRlcm5hbC1uYW1lPiApKSAqCi0gICBEZWNsYXJlcyB0aGF0IDxleHRlcm5hbC1uYW1lPiBvciB0aGUgZXhwb3J0ZWQgZnVuY3Rpb24gd2hvZXMgb3JkaW5hbCBudW1iZXIKLSAgIGlzIDxpbnRlZ2VyPiBpcyB0byBiZSBpbXBvcnRlZCBmcm9tIHRoZSBmaWxlIDxtb2R1bGUtbmFtZT4uICBJZgotICAgPGludGVybmFsLW5hbWU+IGlzIHNwZWNpZmllZCB0aGVuIHRoaXMgaXMgdGhlIG5hbWUgdGhhdCB0aGUgaW1wb3J0ZWQKLSAgIGZ1bmN0aW9uIHdpbGwgYmUgcmVmZXJlZCB0byBpbiB0aGUgYm9keSBvZiB0aGUgRExMLgotCi0gICBERVNDUklQVElPTiA8c3RyaW5nPgotICAgUHV0cyA8c3RyaW5nPiBpbnRvIG91dHB1dCAuZXhwIGZpbGUgaW4gdGhlIC5yZGF0YSBzZWN0aW9uCi0KLSAgIFtTVEFDS1NJWkV8SEVBUFNJWkVdIDxudW1iZXItcmVzZXJ2ZT4gWyAsIDxudW1iZXItY29tbWl0PiBdCi0gICBHZW5lcmF0ZXMgLS1zdGFja3wtLWhlYXAgPG51bWJlci1yZXNlcnZlPiw8bnVtYmVyLWNvbW1pdD4KLSAgIGluIHRoZSBvdXRwdXQgLmRyZWN0dmUgc2VjdGlvbi4gIFRoZSBsaW5rZXIgd2lsbAotICAgc2VlIHRoaXMgYW5kIGFjdCB1cG9uIGl0LgotCi0gICBbQ09ERXxEQVRBXSA8YXR0cj4rCi0gICBTRUNUSU9OUyAoIDxzZWN0aW9ubmFtZT4gPGF0dHI+KyApKgotICAgPGF0dHI+ID0gUkVBRCB8IFdSSVRFIHwgRVhFQ1VURSB8IFNIQVJFRAotICAgR2VuZXJhdGVzIC0tYXR0ciA8c2VjdGlvbm5hbWU+IDxhdHRyPiBpbiB0aGUgb3V0cHV0Ci0gICAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGxpbmtlciB3aWxsIHNlZSB0aGlzIGFuZCBhY3QKLSAgIHVwb24gaXQuCi0KLQotICAgQSAtZXhwb3J0OjxuYW1lPiBpbiBhIC5kcmVjdHZlIHNlY3Rpb24gaW4gYW4gaW5wdXQgLm8gb3IgLmEKLSAgIGZpbGUgdG8gdGhpcyBwcm9ncmFtIGlzIGVxdWl2YWxlbnQgdG8gYSBFWFBPUlRTIDxuYW1lPgotICAgaW4gYSAuREVGIGZpbGUuCi0KLQotCi0gICBUaGUgcHJvZ3JhbSBnZW5lcmF0ZXMgb3V0cHV0IGZpbGVzIHdpdGggdGhlIHByZWZpeCBzdXBwbGllZAotICAgb24gdGhlIGNvbW1hbmQgbGluZSwgb3IgaW4gdGhlIGRlZiBmaWxlLCBvciB0YWtlbiBmcm9tIHRoZSBmaXJzdAotICAgc3VwcGxpZWQgYXJndW1lbnQuCi0KLSAgIFRoZSAuZXhwLnMgZmlsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGV4cG9ydAotICAgdGhlIHJvdXRpbmVzIGluIHRoZSBETEwuICBUaGUgLmxpYi5zIGZpbGUgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uCi0gICBuZWNlc3NhcnkgdG8gdXNlIHRoZSBETEwncyByb3V0aW5lcyBmcm9tIGEgcmVmZXJlbmNpbmcgcHJvZ3JhbS4KLQotCi0KLSAgIEV4YW1wbGU6Ci0KLSBmaWxlMS5jOgotICAgYXNtICgiLnNlY3Rpb24gLmRyZWN0dmUiKTsKLSAgIGFzbSAoIi5hc2NpaSBcIi1leHBvcnQ6YWRlZlwiIik7Ci0KLSAgIHZvaWQgYWRlZiAoY2hhciAqIHMpCi0gICB7Ci0gICAgIHByaW50ZiAoImhlbGxvIGZyb20gdGhlIGRsbCAlc1xuIiwgcyk7Ci0gICB9Ci0KLSAgIHZvaWQgYmRlZiAoY2hhciAqIHMpCi0gICB7Ci0gICAgIHByaW50ZiAoImhlbGxvIGZyb20gdGhlIGRsbCBhbmQgdGhlIG90aGVyIGVudHJ5IHBvaW50ICVzXG4iLCBzKTsKLSAgIH0KLQotIGZpbGUyLmM6Ci0gICBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZSIpOwotICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpjZGVmXCIiKTsKLSAgIGFzbSAoIi5hc2NpaSBcIi1leHBvcnQ6ZGRlZlwiIik7Ci0gICAKLSAgIHZvaWQgY2RlZiAoY2hhciAqIHMpCi0gICB7Ci0gICAgIHByaW50ZiAoImhlbGxvIGZyb20gdGhlIGRsbCAlc1xuIiwgcyk7Ci0gICB9Ci0KLSAgIHZvaWQgZGRlZiAoY2hhciAqIHMpCi0gICB7Ci0gICAgIHByaW50ZiAoImhlbGxvIGZyb20gdGhlIGRsbCBhbmQgdGhlIG90aGVyIGVudHJ5IHBvaW50ICVzXG4iLCBzKTsKLSAgIH0KLQotICAgaW50IHByaW50ZiAodm9pZCkKLSAgIHsKLSAgICAgcmV0dXJuIDk7Ci0gICB9Ci0KLSB0aGVtYWluLmM6Ci0gICBpbnQgbWFpbiAodm9pZCkKLSAgIHsKLSAgICAgY2RlZiAoKTsKLSAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSB0aGVkbGwuZGVmCi0KLSAgIExJQlJBUlkgdGhlZGxsCi0gICBIRUFQU0laRSAweDQwMDAwLCAweDIwMDAKLSAgIEVYUE9SVFMgYmRlZiBAIDIwCi0gICAgICAgICAgIGNkZWYgQCAzMCBOT05BTUUKLQotICAgU0VDVElPTlMgZG9ua2V5IFJFQUQgV1JJVEUKLSAgIGFhcmR2YXJrIEVYRUNVVEUKLQotICMgQ29tcGlsZSB1cCB0aGUgcGFydHMgb2YgdGhlIGRsbCBhbmQgdGhlIHByb2dyYW0KLQotICAgZ2NjIC1jIGZpbGUxLmMgZmlsZTIuYyB0aGVtYWluLmMKLQotICMgT3B0aW9uYWw6IHB1dCB0aGUgZGxsIG9iamVjdHMgaW50byBhIGxpYnJhcnkKLSAjICh5b3UgZG9uJ3QgaGF2ZSB0bywgeW91IGNvdWxkIG5hbWUgYWxsIHRoZSBvYmplY3QKLSAjIGZpbGVzIG9uIHRoZSBkbGx0b29sIGxpbmUpCi0KLSAgIGFyICBxY3YgdGhlZGxsLmluIGZpbGUxLm8gZmlsZTIubwotICAgcmFubGliIHRoZWRsbC5pbgotCi0gIyBSdW4gdGhpcyB0b29sIG92ZXIgdGhlIERMTCdzIC5kZWYgZmlsZSBhbmQgZ2VuZXJhdGUgYW4gZXhwb3J0cwotICMgZmlsZSAodGhlZGxsLm8pIGFuZCBhbiBpbXBvcnRzIGZpbGUgKHRoZWRsbC5hKS4KLSAjIChZb3UgbWF5IGhhdmUgdG8gdXNlIC1TIHRvIHRlbGwgZGxsdG9vbCB3aGVyZSB0byBmaW5kIHRoZSBhc3NlbWJsZXIpLgotIAotICAgZGxsdG9vbCAtLWRlZiB0aGVkbGwuZGVmIC0tb3V0cHV0LWV4cCB0aGVkbGwubyAtLW91dHB1dC1saWIgdGhlZGxsLmEKLQotICMgQnVpbGQgdGhlIGRsbCB3aXRoIHRoZSBsaWJyYXJ5IGFuZCB0aGUgZXhwb3J0IHRhYmxlCi0gCi0gICBsZCAtbyB0aGVkbGwuZGxsIHRoZWRsbC5vIHRoZWRsbC5pbgotCi0gIyBMaW5rIHRoZSBleGVjdXRhYmxlIHdpdGggdGhlIGltcG9ydCBsaWJyYXJ5Ci0gCi0gICBnY2MgLW8gdGhlbWFpbi5leGUgdGhlbWFpbi5vIHRoZWRsbC5hCi0KLSBUaGlzIGV4YW1wbGUgY2FuIGJlIGV4dGVuZGVkIGlmIHJlbG9jYXRpb25zIGFyZSBuZWVkZWQgaW4gdGhlIERMTDoKLQotICMgQ29tcGlsZSB1cCB0aGUgcGFydHMgb2YgdGhlIGRsbCBhbmQgdGhlIHByb2dyYW0KLQotICAgZ2NjIC1jIGZpbGUxLmMgZmlsZTIuYyB0aGVtYWluLmMKLQotICMgUnVuIHRoaXMgdG9vbCBvdmVyIHRoZSBETEwncyAuZGVmIGZpbGUgYW5kIGdlbmVyYXRlIGFuIGltcG9ydHMgZmlsZS4KLSAKLSAgIGRsbHRvb2wgLS1kZWYgdGhlZGxsLmRlZiAtLW91dHB1dC1saWIgdGhlZGxsLmxpYgotCi0gIyBMaW5rIHRoZSBleGVjdXRhYmxlIHdpdGggdGhlIGltcG9ydCBsaWJyYXJ5IGFuZCBnZW5lcmF0ZSBhIGJhc2UgZmlsZQotICMgYXQgdGhlIHNhbWUgdGltZQotIAotICAgZ2NjIC1vIHRoZW1haW4uZXhlIHRoZW1haW4ubyB0aGVkbGwubGliIC1XbCwtLWJhc2UtZmlsZSAtV2wsdGhlbWFpbi5iYXNlCi0KLSAjIFJ1biB0aGlzIHRvb2wgb3ZlciB0aGUgRExMJ3MgLmRlZiBmaWxlIGFuZCBnZW5lcmF0ZSBhbiBleHBvcnRzIGZpbGUKLSAjIHdoaWNoIGluY2x1ZGVzIHRoZSByZWxvY2F0aW9ucyBmcm9tIHRoZSBiYXNlIGZpbGUuCi0gCi0gICBkbGx0b29sIC0tZGVmIHRoZWRsbC5kZWYgLS1iYXNlLWZpbGUgdGhlbWFpbi5iYXNlIC0tb3V0cHV0LWV4cCB0aGVkbGwuZXhwCi0KLSAjIEJ1aWxkIHRoZSBkbGwgd2l0aCBmaWxlMS5vLCBmaWxlMi5vIGFuZCB0aGUgZXhwb3J0IHRhYmxlCi0gCi0gICBsZCAtbyB0aGVkbGwuZGxsIHRoZWRsbC5leHAgZmlsZTEubyBmaWxlMi5vCi0gKi8KLQotLyogLmlkYXRhIHNlY3Rpb24gZGVzY3JpcHRpb24KLQotICAgVGhlIC5pZGF0YSBzZWN0aW9uIGlzIHRoZSBpbXBvcnQgdGFibGUuICBJdCBpcyBhIGNvbGxlY3Rpb24gb2Ygc2V2ZXJhbAotICAgc3Vic2VjdGlvbnMgdXNlZCB0byBrZWVwIHRoZSBwaWVjZXMgZm9yIGVhY2ggZGxsIHRvZ2V0aGVyOiAuaWRhdGEkWzIzNDU2N10uCi0gICBJRTogRWFjaCBkbGwncyAuaWRhdGEkMidzIGFyZSBjYXRlbmF0ZWQgdG9nZXRoZXIsIGVhY2ggLmlkYXRhJDMncywgZXRjLgotCi0gICAuaWRhdGEkMiA9IEltcG9ydCBEaXJlY3RvcnkgVGFibGUKLSAgID0gYXJyYXkgb2YgSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1Incy4KLQotCURXT1JEICAgSW1wb3J0IExvb2t1cCBUYWJsZTsgIC0gcG9pbnRlciB0byAuaWRhdGEkNAotCURXT1JEICAgVGltZURhdGVTdGFtcDsgICAgICAgIC0gY3VycmVudGx5IGFsd2F5cyAwCi0JRFdPUkQgICBGb3J3YXJkZXJDaGFpbjsgICAgICAgLSBjdXJyZW50bHkgYWx3YXlzIDAKLQlEV09SRCAgIE5hbWU7ICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZGxsJ3MgbmFtZQotCVBJTUFHRV9USFVOS19EQVRBIEZpcnN0VGh1bms7IC0gcG9pbnRlciB0byAuaWRhdGEkNQotCi0gICAuaWRhdGEkMyA9IG51bGwgdGVybWluYXRpbmcgZW50cnkgZm9yIC5pZGF0YSQyLgotCi0gICAuaWRhdGEkNCA9IEltcG9ydCBMb29rdXAgVGFibGUKLSAgID0gYXJyYXkgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGludCBuYW1lIHRhYmxlLgotICAgVGhlcmUgaXMgb25lIGZvciBlYWNoIGRsbCBiZWluZyBpbXBvcnRlZCBmcm9tLCBhbmQgZWFjaCBkbGwncyBzZXQgaXMKLSAgIHRlcm1pbmF0ZWQgYnkgYSB0cmFpbGluZyBOVUxMLgotCi0gICAuaWRhdGEkNSA9IEltcG9ydCBBZGRyZXNzIFRhYmxlCi0gICA9IGFycmF5IG9mIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhpbnQgbmFtZSB0YWJsZS4KLSAgIFRoZXJlIGlzIG9uZSBmb3IgZWFjaCBkbGwgYmVpbmcgaW1wb3J0ZWQgZnJvbSwgYW5kIGVhY2ggZGxsJ3Mgc2V0IGlzCi0gICB0ZXJtaW5hdGVkIGJ5IGEgdHJhaWxpbmcgTlVMTC4KLSAgIEluaXRpYWxseSwgdGhpcyB0YWJsZSBpcyBpZGVudGljYWwgdG8gdGhlIEltcG9ydCBMb29rdXAgVGFibGUuICBIb3dldmVyLAotICAgYXQgbG9hZCB0aW1lLCB0aGUgbG9hZGVyIG92ZXJ3cml0ZXMgdGhlIGVudHJpZXMgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIGZ1bmN0aW9uLgotCi0gICAuaWRhdGEkNiA9IEhpbnQgTmFtZSBUYWJsZQotICAgPSBBcnJheSBvZiB7IHNob3J0LCBhc2NpeiB9IGVudHJpZXMsIG9uZSBmb3IgZWFjaCBpbXBvcnRlZCBmdW5jdGlvbi4KLSAgIFRoZSBgc2hvcnQnIGlzIHRoZSBmdW5jdGlvbidzIG9yZGluYWwgbnVtYmVyLgotCi0gICAuaWRhdGEkNyA9IGRsbCBuYW1lIChlZzogImtlcm5lbDMyLmRsbCIpLiAoLmlkYXRhJDYgZm9yIHBwYykKLSovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZuZGVmIF9fR05VQ19fCi0jIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBzaG93X2FsbG5hbWVzIDAKLQotI2RlZmluZSBQQUdFX1NJWkUgNDA5NgotI2RlZmluZSBQQUdFX01BU0sgKC1QQUdFX1NJWkUpCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSNpbmNsdWRlICJkeW4tc3RyaW5nLmgiCi0jaW5jbHVkZSAiZGxsdG9vbC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfQVJNCi0jaW5jbHVkZSAiY29mZi9hcm0uaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jZW5kaWYKLQotLyogRm9yd2FyZCByZWZlcmVuY2VzLiAgKi8KLXN0YXRpYyBjaGFyICpsb29rX2Zvcl9wcm9nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBjaGFyICpkZWR1Y2VfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi1zdGF0aWMgdm9pZCBtY29yZV9lbGZfY2FjaGVfZmlsZW5hbWUgKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBtY29yZV9lbGZfZ2VuX291dF9maWxlICh2b2lkKTsKLSNlbmRpZgotICAgICAKLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2Vsc2UgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpID4+IDgpICYgMDM3NykKLSNlbmRpZgotI2Vsc2UgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSAmIDB4ZmYpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykgJiAweGZmKSAhPSAwICYmICgodykgJiAweGZmKSAhPSAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpICYgMHhmZjAwKSA+PiA4KQotI2VuZGlmCi0jZW5kaWYgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNlbmRpZiAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotCi0vKiBpZnVuYyBhbmQgaWhlYWQgZGF0YSBzdHJ1Y3R1cmVzOiB0dGtAY3lnbnVzLmNvbSAxOTk3Ci0KLSAgIFdoZW4gSU1QT1JUIGRlY2xhcmF0aW9ucyBhcmUgZW5jb3VudGVyZWQgaW4gYSAuZGVmIGZpbGUgdGhlCi0gICBmdW5jdGlvbiBpbXBvcnQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGEgc3RydWN0dXJlIHJlZmVyZW5jZWQgYnkKLSAgIHRoZSBnbG9iYWwgdmFyaWFibGUgSU1QT1JUX0xJU1QuICBUaGUgc3RydWN0dXJlIGlzIGEgbGlua2VkIGxpc3QKLSAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBkbGwgZmlsZXMgZWFjaCBmdW5jdGlvbiBpcyBpbXBvcnRlZAotICAgZnJvbSBhbmQgYSBsaW5rZWQgbGlzdCBvZiBmdW5jdGlvbnMgYmVpbmcgaW1wb3J0ZWQgZnJvbSB0aGF0IGRsbAotICAgZmlsZS4gIFRoaXMgcm91Z2hseSBwYXJhbGxlbHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgLmlkYXRhIHNlY3Rpb24KLSAgIGluIHRoZSBQRSBvYmplY3QgZmlsZS4KLQotICAgVGhlIGNvbnRlbnRzIG9mIC5kZWYgZmlsZSBhcmUgaW50ZXJwcmV0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICBwcm9jZXNzX2RlZl9maWxlIGZ1bmN0aW9uLiAgRXZlcnkgdGltZSBhbiBJTVBPUlQgZGVjbGFyYXRpb24gaXMKLSAgIGVuY291bnRlcmVkLCBpdCBpcyBicm9rZW4gdXAgaW50byBpdHMgY29tcG9uZW50IHBhcnRzIGFuZCBwYXNzZWQgdG8KLSAgIGRlZl9pbXBvcnQuICBJTVBPUlRfTElTVCBpcyBpbml0aWFsaXplZCB0byBOVUxMIGluIGZ1bmN0aW9uIG1haW4uICAqLwotCi10eXBlZGVmIHN0cnVjdCBpZnVuY3QKLXsKLSAgY2hhciAgICAgICAgICAqbmFtZTsgICAvKiBuYW1lIG9mIGZ1bmN0aW9uIGJlaW5nIGltcG9ydGVkICovCi0gIGludCAgICAgICAgICAgIG9yZDsgICAgLyogdHdvLWJ5dGUgb3JkaW5hbCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZnVuY3Rpb24gKi8KLSAgc3RydWN0IGlmdW5jdCAqbmV4dDsKLX0gaWZ1bmN0eXBlOwotCi10eXBlZGVmIHN0cnVjdCBpaGVhZHQKLXsKLSAgY2hhciAgICAgICAgICAqZGxsbmFtZTsgIC8qIG5hbWUgb2YgZGxsIGZpbGUgaW1wb3J0ZWQgZnJvbSAqLwotICBsb25nICAgICAgICAgICBuZnVuY3M7ICAgLyogbnVtYmVyIG9mIGZ1bmN0aW9ucyBpbiBsaXN0ICovCi0gIHN0cnVjdCBpZnVuY3QgKmZ1bmNoZWFkOyAvKiBmaXJzdCBmdW5jdGlvbiBpbiBsaXN0ICovCi0gIHN0cnVjdCBpZnVuY3QgKmZ1bmN0YWlsOyAvKiBsYXN0ICBmdW5jdGlvbiBpbiBsaXN0ICovCi0gIHN0cnVjdCBpaGVhZHQgKm5leHQ7ICAgICAvKiBuZXh0IGRsbCBmaWxlIGluIGxpc3QgKi8KLX0gaWhlYWR0eXBlOwotCi0vKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgaW1wb3J0IGluZm9ybWF0aW9uIGFzIGRlZmluZWQgaW4gLmRlZiBmaWxlCi0gICAocXYgImloZWFkIHN0cnVjdHVyZSIpLiAgKi8KLQotc3RhdGljIGloZWFkdHlwZSAqaW1wb3J0X2xpc3QgPSBOVUxMOwotCi1zdGF0aWMgY2hhciAqYXNfbmFtZSA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqIGFzX2ZsYWdzID0gIiI7Ci0KLXN0YXRpYyBpbnQgbm9faWRhdGE0Owotc3RhdGljIGludCBub19pZGF0YTU7Ci1zdGF0aWMgY2hhciAqZXhwX25hbWU7Ci1zdGF0aWMgY2hhciAqaW1wX25hbWU7Ci1zdGF0aWMgY2hhciAqaGVhZF9sYWJlbDsKLXN0YXRpYyBjaGFyICppbXBfbmFtZV9sYWI7Ci1zdGF0aWMgY2hhciAqZGxsX25hbWU7Ci0KLXN0YXRpYyBpbnQgYWRkX2luZGlyZWN0ID0gMDsKLXN0YXRpYyBpbnQgYWRkX3VuZGVyc2NvcmUgPSAwOwotc3RhdGljIGludCBkb250ZGVsdGVtcHMgPSAwOwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBleHBvcnQgYWxsIHN5bWJvbHMuICBPdGhlcndpc2UsIHdlIG9ubHkgZXhwb3J0Ci0gICBzeW1ib2xzIGxpc3RlZCBpbiAuZHJlY3R2ZSBzZWN0aW9ucyBvciBpbiB0aGUgZGVmIGZpbGUuICAqLwotc3RhdGljIGJvb2xlYW4gZXhwb3J0X2FsbF9zeW1ib2xzOwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBleGNsdWRlIHRoZSBzeW1ib2xzIGluIERFRkFVTFRfRVhDTFVERVMgd2hlbgotICAgZXhwb3J0aW5nIGFsbCBzeW1ib2xzLiAgKi8KLXN0YXRpYyBib29sZWFuIGRvX2RlZmF1bHRfZXhjbHVkZXM7Ci0KLS8qIERlZmF1bHQgc3ltYm9scyB0byBleGNsdWRlIHdoZW4gZXhwb3J0aW5nIGFsbCB0aGUgc3ltYm9scy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9leGNsdWRlcyA9ICJEbGxNYWluQDEyLERsbEVudHJ5UG9pbnRAMCxpbXB1cmVfcHRyIjsKLQotc3RhdGljIGNoYXIgKmRlZl9maWxlOwotCi1leHRlcm4gY2hhciAqIHByb2dyYW1fbmFtZTsKLQotc3RhdGljIGludCBtYWNoaW5lOwotc3RhdGljIGludCBraWxsYXQ7Ci1zdGF0aWMgaW50IGFkZF9zdGRjYWxsX2FsaWFzOwotc3RhdGljIGludCB2ZXJib3NlOwotc3RhdGljIEZJTEUgKm91dHB1dF9kZWY7Ci1zdGF0aWMgRklMRSAqYmFzZV9maWxlOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLXN0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJhcm0iOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX0kzODYKLXN0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJpMzg2IjsKLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9QUEMKLXN0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJwcGMiOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX01DT1JFCi1zdGF0aWMgY29uc3QgY2hhciAqIG1uYW1lID0gIm1jb3JlLWxlIjsKLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLXN0YXRpYyBjb25zdCBjaGFyICogbW5hbWUgPSAibWNvcmUtZWxmIjsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX291dF9maWxlID0gTlVMTDsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX2xpbmtlciAgID0gTlVMTDsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX2xpbmtlcl9mbGFncyA9IE5VTEw7Ci0KLSNkZWZpbmUgRFJFQ1RWRV9TRUNUSU9OX05BTUUgKChtYWNoaW5lID09IE1NQ09SRV9FTEYgfHwgbWFjaGluZSA9PSBNTUNPUkVfRUxGX0xFKSA/ICIuZXhwb3J0cyIgOiAiLmRyZWN0dmUiKQotI2VuZGlmCi0KLSNpZm5kZWYgRFJFQ1RWRV9TRUNUSU9OX05BTUUKLSNkZWZpbmUgRFJFQ1RWRV9TRUNUSU9OX05BTUUgIi5kcmVjdHZlIgotI2VuZGlmCi0KLSNkZWZpbmUgUEFUSE1BWCAyNTAJCS8qIFdoYXQncyB0aGUgcmlnaHQgbmFtZSBmb3IgdGhpcyA/ICovCi0KLSNkZWZpbmUgVE1QX0FTTQkJImRjLnMiCi0jZGVmaW5lIFRNUF9IRUFEX1MJImRoLnMiCi0jZGVmaW5lIFRNUF9IRUFEX08JImRoLm8iCi0jZGVmaW5lIFRNUF9UQUlMX1MJImR0LnMiCi0jZGVmaW5lIFRNUF9UQUlMX08JImR0Lm8iCi0jZGVmaW5lIFRNUF9TVFVCCSJkcyIKLQotLyogVGhpcyBiaXQgb2YgYXNzZW1seSBkb2VzIGptcCAqIC4uLi4gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGkzODZfanRhYltdID0KLXsKLSAgMHhmZiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXJtX2p0YWJbXSA9Ci17Ci0gIDB4MDAsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgaXAsIFtwY10gKi8KLSAgMHgwMCwgMHhmMCwgMHg5YywgMHhlNSwJLyogbGRyICBwYywgW2lwXSAqLwotICAwLCAgICAwLCAgICAwLCAgICAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhcm1faW50ZXJ3b3JrX2p0YWJbXSA9Ci17Ci0gIDB4MDQsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgaXAsIFtwY10gKi8KLSAgMHgwMCwgMHhjMCwgMHg5YywgMHhlNSwJLyogbGRyICBpcCwgW2lwXSAqLwotICAweDFjLCAweGZmLCAweDJmLCAweGUxLAkvKiBieCAgIGlwICAgICAgICovCi0gIDAsICAgIDAsICAgIDAsICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRodW1iX2p0YWJbXSA9Ci17Ci0gIDB4NDAsIDB4YjQsICAgICAgICAgICAvKiBwdXNoIHtyNn0gICAgICAgICAqLwotICAweDAyLCAweDRlLCAgICAgICAgICAgLyogbGRyICByNiwgW3BjLCAjOF0gKi8KLSAgMHgzNiwgMHg2OCwgICAgICAgICAgIC8qIGxkciAgcjYsIFtyNl0gICAgICovCi0gIDB4YjQsIDB4NDYsICAgICAgICAgICAvKiBtb3YgIGlwLCByNiAgICAgICAqLwotICAweDQwLCAweGJjLCAgICAgICAgICAgLyogcG9wICB7cjZ9ICAgICAgICAgKi8KLSAgMHg2MCwgMHg0NywgICAgICAgICAgIC8qIGJ4ICAgaXAgICAgICAgICAgICovCi0gIDAsICAgIDAsICAgIDAsICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1jb3JlX2JlX2p0YWJbXSA9Ci17Ci0gIDB4NzAsIDB4MDEsICAgICAgICAgICAgLyogam1waSAxICAgICAqLwotICAweDEyLCAweDExLCAgICAgICAgICAgIC8qIG5vcCAqLwotICAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDxhZGRyZXNzPiAgKi8gIAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWNvcmVfbGVfanRhYltdID0KLXsKLSAgMHgwMSwgMHg3MCwgICAgICAgICAgICAvKiBqbXBpIDEgICAgICovCi0gIDB4MTEsIDB4MTIsICAgICAgICAgICAgLyogbm9wICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgLyogPGFkZHJlc3M+ICAqLyAgCi19OwotCi0vKiBUaGlzIGlzIHRoZSBnbHVlIHNlcXVlbmNlIGZvciBQb3dlclBDIFBFLiBUaGVyZSBpcyBhICAqLwotLyogdG9jcmVsMTYtdG9jZGVmbiByZWxvYyBhZ2FpbnN0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4gKi8KLS8qIFdlIGFsc28gbmVlZCBhIElNR0xVRSByZWxvYyBhZ2FpbnN0IHRoZSBnbHVlIGZ1bmN0aW9uICovCi0vKiB0byByZXN0b3JlIHRoZSB0b2Mgc2F2ZWQgYnkgdGhlIHRoaXJkIGluc3RydWN0aW9uIGluICAqLwotLyogdGhlIGdsdWUuICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcGNfanRhYltdID0KLXsKLSAgMHgwMCwgMHgwMCwgMHg2MiwgMHg4MSwgLyogbHd6IHIxMSwwKHIyKSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgUmVsb2MgVE9DUkVMMTYgX19pbXBfeHh4ICAqLwotICAweDAwLCAweDAwLCAweDhCLCAweDgxLCAvKiBsd3ogcjEyLDAocjExKSAgICAgICAgICAgICAgKi8KLSAgMHgwNCwgMHgwMCwgMHg0MSwgMHg5MCwgLyogc3R3IHIyLDQocjEpICAgICAgICAgICAgICAgICovCi0gIDB4QTYsIDB4MDMsIDB4ODksIDB4N0QsIC8qIG10Y3RyIHIxMiAgICAgICAgICAgICAgICAgICAqLwotICAweDA0LCAweDAwLCAweDRCLCAweDgwLCAvKiBsd3ogcjIsNChyMTEpICAgICAgICAgICAgICAgKi8KLSAgMHgyMCwgMHgwNCwgMHg4MCwgMHg0RSAgLyogYmN0ciAgICAgICAgICAgICAgICAgICAgICAgICovCi19OwotCi0jaWZkZWYgRExMVE9PTF9QUEMKLS8qIHRoZSBnbHVlIGluc3RydWN0aW9uLCBwaWNrcyB1cCB0aGUgdG9jIGZyb20gdGhlIHN0dyBpbiAqLwotLyogdGhlIGFib3ZlIGNvZGU6ICJsd3ogcjIsNChyMSkiICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgYmZkX3ZtYSBwcGNfZ2x1ZV9pbnNuID0gMHg4MDQxMDAwNDsKLSNlbmRpZgotCi1zdHJ1Y3QgbWFjCi0gIHsKLSAgICBjb25zdCBjaGFyICp0eXBlOwotICAgIGNvbnN0IGNoYXIgKmhvd19ieXRlOwotICAgIGNvbnN0IGNoYXIgKmhvd19zaG9ydDsKLSAgICBjb25zdCBjaGFyICpob3dfbG9uZzsKLSAgICBjb25zdCBjaGFyICpob3dfYXNjaXo7Ci0gICAgY29uc3QgY2hhciAqaG93X2NvbW1lbnQ7Ci0gICAgY29uc3QgY2hhciAqaG93X2p1bXA7Ci0gICAgY29uc3QgY2hhciAqaG93X2dsb2JhbDsKLSAgICBjb25zdCBjaGFyICpob3dfc3BhY2U7Ci0gICAgY29uc3QgY2hhciAqaG93X2FsaWduX3Nob3J0OwotICAgIGNvbnN0IGNoYXIgKmhvd19hbGlnbl9sb25nOwotICAgIGNvbnN0IGNoYXIgKmhvd19kZWZhdWx0X2FzX3N3aXRjaGVzOwotICAgIGNvbnN0IGNoYXIgKmhvd19iZmRfdGFyZ2V0OwotICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBob3dfYmZkX2FyY2g7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqaG93X2p0YWI7Ci0gICAgaW50IGhvd19qdGFiX3NpemU7IC8qIHNpemUgb2YgdGhlIGp0YWIgZW50cnkgKi8KLSAgICBpbnQgaG93X2p0YWJfcm9mZjsgLyogb2Zmc2V0IGludG8gaXQgZm9yIHRoZSBpbmQgMzIgcmVsb2MgaW50byBpZGF0YSA1ICovCi0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjCi1tdGFibGVbXSA9Ci17Ci0gIHsKLSNkZWZpbmUgTUFSTSAwCi0gICAgImFybSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIkAiLAotICAgICJsZHJcdGlwLFtwY11cblx0bGRyXHRwYyxbaXBdXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwgIiIsCi0gICAgInBlLWFybS1saXR0bGUiLCBiZmRfYXJjaF9hcm0sCi0gICAgYXJtX2p0YWIsIHNpemVvZiAoYXJtX2p0YWIpLCA4Ci0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE0zODYgMQotICAgICJpMzg2IiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiIyIsCi0gICAgImptcCAqIiwgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICIiLAotICAgICJwZS1pMzg2IixiZmRfYXJjaF9pMzg2LAotICAgIGkzODZfanRhYiwgc2l6ZW9mIChpMzg2X2p0YWIpLCAyCi0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1QUEMgMgotICAgICJwcGMiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIjIiwKLSAgICAiam1wICoiLCAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwgIiIsCi0gICAgInBlLXBvd2VycGNsZSIsYmZkX2FyY2hfcG93ZXJwYywKLSAgICBwcGNfanRhYiwgc2l6ZW9mIChwcGNfanRhYiksIDAKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTVRIVU1CIDMKLSAgICAidGh1bWIiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICJAIiwKLSAgICAicHVzaFx0e3I2fVxuXHRsZHJcdHI2LCBbcGMsICM4XVxuXHRsZHJcdHI2LCBbcjZdXG5cdG1vdlx0aXAsIHI2XG5cdHBvcFx0e3I2fVxuXHRieFx0aXAiLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiPW10aHVtYi1pbnRlcndvcmsiLAotICAgICJwZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAotICAgIHRodW1iX2p0YWIsIHNpemVvZiAodGh1bWJfanRhYiksIDEyCi0gIH0KLSAgLAotI2RlZmluZSBNQVJNX0lOVEVSV09SSyA0Ci0gIHsKLSAgICAiYXJtX2ludGVyd29yayIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIkAiLAotICAgICJsZHJcdGlwLFtwY11cblx0bGRyXHRpcCxbaXBdXG5cdGJ4XHRpcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICItbXRodW1iLWludGVyd29yayIsCi0gICAgInBlLWFybS1saXR0bGUiLCBiZmRfYXJjaF9hcm0sCi0gICAgYXJtX2ludGVyd29ya19qdGFiLCBzaXplb2YgKGFybV9pbnRlcndvcmtfanRhYiksIDEyCi0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1NQ09SRV9CRSA1Ci0gICAgIm1jb3JlLWJlIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiLy8iLAotICAgICJqbXBpXHQxXG5cdG5vcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICIiLAotICAgICJwZS1tY29yZS1iaWciLCBiZmRfYXJjaF9tY29yZSwKLSAgICBtY29yZV9iZV9qdGFiLCBzaXplb2YgKG1jb3JlX2JlX2p0YWIpLCA4Ci0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1NQ09SRV9MRSA2Ci0gICAgIm1jb3JlLWxlIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiLy8iLAotICAgICJqbXBpXHQxXG5cdG5vcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICItRUwiLAotICAgICJwZS1tY29yZS1saXR0bGUiLCBiZmRfYXJjaF9tY29yZSwKLSAgICBtY29yZV9sZV9qdGFiLCBzaXplb2YgKG1jb3JlX2xlX2p0YWIpLCA4Ci0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1NQ09SRV9FTEYgNwotICAgICJtY29yZS1lbGYtYmUiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImptcGlcdDFcblx0bm9wXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwgIiIsCi0gICAgImVsZjMyLW1jb3JlLWJpZyIsIGJmZF9hcmNoX21jb3JlLAotICAgIG1jb3JlX2JlX2p0YWIsIHNpemVvZiAobWNvcmVfYmVfanRhYiksIDgKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTU1DT1JFX0VMRl9MRSA4Ci0gICAgIm1jb3JlLWVsZi1sZSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIi8vIiwKLSAgICAiam1waVx0MVxuXHRub3Bcblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiLUVMIiwKLSAgICAiZWxmMzItbWNvcmUtbGl0dGxlIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfbGVfanRhYiwgc2l6ZW9mIChtY29yZV9sZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgeyAwIH0KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGRsaXN0Ci17Ci0gIGNoYXIgKnRleHQ7Ci0gIHN0cnVjdCBkbGlzdCAqbmV4dDsKLX0KLWRsaXN0X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGV4cG9ydAotICB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotICAgIGludCBvcmRpbmFsOwotICAgIGludCBjb25zdGFudDsKLSAgICBpbnQgbm9uYW1lOwotICAgIGludCBkYXRhOwotICAgIGludCBoaW50OwotICAgIHN0cnVjdCBleHBvcnQgKm5leHQ7Ci0gIH0KLWV4cG9ydF90eXBlOwotCi0vKiBBIGxpc3Qgb2Ygc3ltYm9scyB3aGljaCB3ZSBzaG91bGQgbm90IGV4cG9ydC4gICovCi0gCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OwotICBjaGFyICpzdHJpbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICpleGNsdWRlczsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWFmdGVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWJlZm9yZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICphc21fcHJlZml4IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYXBwZW5kX2ltcG9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBydW4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fZHJlY3R2ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX2ZpbHRlcmVkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBhZGRfZXhjbHVkZXMgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYXRjaF9leGNsdWRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZXhjbHVkZXMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGxvbmcgZmlsdGVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzY2FuX2FsbF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX29wZW5fb2JqX2ZpbGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fb2JqX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkdW1wX2RlZl9pbmZvIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCBzZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIHZvaWQgZmx1c2hfcGFnZSBQQVJBTVMgKChGSUxFICosIGxvbmcgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGdlbl9kZWZfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9pZGF0YV9vZmlsZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGdlbl9leHBfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqeGxhdGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgZHVtcF9pYXQgUEFSQU1TICgoRklMRSAqLCBleHBvcnRfdHlwZSAqKSk7Ci0jZW5kaWYKLXN0YXRpYyBjaGFyICptYWtlX2xhYmVsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkICptYWtlX29uZV9saWJfZmlsZSBQQVJBTVMgKChleHBvcnRfdHlwZSAqLCBpbnQpKTsKLXN0YXRpYyBiZmQgKm1ha2VfaGVhZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkICptYWtlX3RhaWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2VuX2xpYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcGZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyBpbnQgbmZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9udWxsX25hbWVzIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7Ci1zdGF0aWMgdm9pZCBkdGFiIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2R1cGxpY2F0ZXMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyB2b2lkIGZpbGxfb3JkaW5hbHMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyBpbnQgYWxwaGFmdW5jIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBtYW5nbGVfZGVmcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluZm9ybSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIHZvaWQgd2FybiBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheSAobWVzc2FnZSwgYXJncykKLSAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7Ci0gICAgIHZhX2xpc3QgICAgICBhcmdzOwotewotICBpZiAocHJvZ3JhbV9uYW1lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0KLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0KLSAgaWYgKG1lc3NhZ2UgW3N0cmxlbiAobWVzc2FnZSkgLSAxXSAhPSAnXG4nKQotICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotfSAgCi0KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBfX1NURENfXwotaW5mb3JtIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLWluZm9ybSAobWVzc2FnZSwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0gIAotICBpZiAoIXZlcmJvc2UpCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotI2VuZGlmCi0KLSAgZGlzcGxheSAobWVzc2FnZSwgYXJncyk7Ci0gIAotICB2YV9lbmQgKGFyZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fU1REQ19fCi13YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLXdhcm4gKG1lc3NhZ2UsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICAKLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLSAgCi0gIGRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpOwotCi0gIHZhX2VuZCAoYXJncyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXJ2YWFmdGVyIChtYWNoaW5lKQotICAgICBpbnQgbWFjaGluZTsKLXsKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIE1BUk06Ci0gICAgY2FzZSBNMzg2OgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcnZhYmVmb3JlIChtYWNoaW5lKQotICAgICBpbnQgbWFjaGluZTsKLXsKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIE1BUk06Ci0gICAgY2FzZSBNMzg2OgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICByZXR1cm4gIi5ydmFcdCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmYXRhbCAoXygiSW50ZXJuYWwgZXJyb3I6IFVua25vd24gbWFjaGluZSB0eXBlOiAlZFxuIiksIG1hY2hpbmUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gIiI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWFzbV9wcmVmaXggKG1hY2hpbmUpCi0gICAgIGludCBtYWNoaW5lOwotewotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgTUFSTToKLSAgICBjYXNlIE1QUEM6Ci0gICAgY2FzZSBNVEhVTUI6Ci0gICAgY2FzZSBNQVJNX0lOVEVSV09SSzoKLSAgICBjYXNlIE1NQ09SRV9CRToKLSAgICBjYXNlIE1NQ09SRV9MRToKLSAgICBjYXNlIE1NQ09SRV9FTEY6Ci0gICAgY2FzZSBNTUNPUkVfRUxGX0xFOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzg2OgotICAgICAgcmV0dXJuICJfIjsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotI2RlZmluZSBBU01fQllURSAJbXRhYmxlW21hY2hpbmVdLmhvd19ieXRlCi0jZGVmaW5lIEFTTV9TSE9SVCAJbXRhYmxlW21hY2hpbmVdLmhvd19zaG9ydAotI2RlZmluZSBBU01fTE9ORwltdGFibGVbbWFjaGluZV0uaG93X2xvbmcKLSNkZWZpbmUgQVNNX1RFWFQJbXRhYmxlW21hY2hpbmVdLmhvd19hc2NpegotI2RlZmluZSBBU01fQyAJCW10YWJsZVttYWNoaW5lXS5ob3dfY29tbWVudAotI2RlZmluZSBBU01fSlVNUCAJbXRhYmxlW21hY2hpbmVdLmhvd19qdW1wCi0jZGVmaW5lIEFTTV9HTE9CQUwJbXRhYmxlW21hY2hpbmVdLmhvd19nbG9iYWwKLSNkZWZpbmUgQVNNX1NQQUNFCW10YWJsZVttYWNoaW5lXS5ob3dfc3BhY2UKLSNkZWZpbmUgQVNNX0FMSUdOX1NIT1JUIG10YWJsZVttYWNoaW5lXS5ob3dfYWxpZ25fc2hvcnQKLSNkZWZpbmUgQVNNX1JWQV9CRUZPUkUgCXJ2YWJlZm9yZShtYWNoaW5lKQotI2RlZmluZSBBU01fUlZBX0FGVEVSICAJcnZhYWZ0ZXIobWFjaGluZSkKLSNkZWZpbmUgQVNNX1BSRUZJWAlhc21fcHJlZml4KG1hY2hpbmUpCi0jZGVmaW5lIEFTTV9BTElHTl9MT05HICBtdGFibGVbbWFjaGluZV0uaG93X2FsaWduX2xvbmcKLSNkZWZpbmUgSE9XX0JGRF9SRUFEX1RBUkdFVCAgMCAgLyogYWx3YXlzIGRlZmF1bHQqLwotI2RlZmluZSBIT1dfQkZEX1dSSVRFX1RBUkdFVCBtdGFibGVbbWFjaGluZV0uaG93X2JmZF90YXJnZXQKLSNkZWZpbmUgSE9XX0JGRF9BUkNIICAgIG10YWJsZVttYWNoaW5lXS5ob3dfYmZkX2FyY2gKLSNkZWZpbmUgSE9XX0pUQUIgICAgICAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYgotI2RlZmluZSBIT1dfSlRBQl9TSVpFICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiX3NpemUKLSNkZWZpbmUgSE9XX0pUQUJfUk9GRiAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYl9yb2ZmCi0jZGVmaW5lIEFTTV9TV0lUQ0hFUyAgICBtdGFibGVbbWFjaGluZV0uaG93X2RlZmF1bHRfYXNfc3dpdGNoZXMKLQotc3RhdGljIGNoYXIgKipvYXY7Ci0KLXZvaWQKLXByb2Nlc3NfZGVmX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIEZJTEUgKmYgPSBmb3BlbiAobmFtZSwgRk9QRU5fUlQpOwotICAKLSAgaWYgKCFmKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oIkNhbid0IG9wZW4gZGVmIGZpbGU6ICVzIiksIG5hbWUpOwotCi0gIHl5aW4gPSBmOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiUHJvY2Vzc2luZyBkZWYgZmlsZTogJXMiKSwgbmFtZSk7Ci0gIAotICB5eXBhcnNlICgpOwotCi0gIGluZm9ybSAoXygiUHJvY2Vzc2VkIGRlZiBmaWxlIikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgcGFyc2VyICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpkX25hbWU7CS8qIEFyZyB0byBOQU1FIG9yIExJQlJBUlkgKi8KLXN0YXRpYyBpbnQgZF9uZnVuY3M7CQkvKiBOdW1iZXIgb2YgZnVuY3Rpb25zIGV4cG9ydGVkICovCi1zdGF0aWMgaW50IGRfbmFtZWRfbmZ1bmNzOwkvKiBOdW1iZXIgb2YgbmFtZWQgZnVuY3Rpb25zIGV4cG9ydGVkICovCi1zdGF0aWMgaW50IGRfbG93X29yZDsJCS8qIExvd2VzdCBvcmRpbmFsIGluZGV4ICovCi1zdGF0aWMgaW50IGRfaGlnaF9vcmQ7CQkvKiBIaWdoZXN0IG9yZGluYWwgaW5kZXggKi8KLXN0YXRpYyBleHBvcnRfdHlwZSAqZF9leHBvcnRzOwkvKmxpc3Qgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zICovCi1zdGF0aWMgZXhwb3J0X3R5cGUgKipkX2V4cG9ydHNfbGV4aWNhbGx5OwkvKiB2ZWN0b3Igb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIGFscGhhIG9yZGVyICovCi1zdGF0aWMgZGxpc3RfdHlwZSAqZF9saXN0OwkvKiBEZXNjcmlwdGlvbnMgKi8KLXN0YXRpYyBkbGlzdF90eXBlICphX2xpc3Q7CS8qIFN0dWZmIHRvIGdvIGluIGRpcmVjdGl2ZXMgKi8KLQotc3RhdGljIGludCBkX2lzX2RsbDsKLXN0YXRpYyBpbnQgZF9pc19leGU7Ci0KLWludAoteXllcnJvciAoZXJyKQotICAgICBjb25zdCBjaGFyICplcnI7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHdhcm4gKF8oIlN5bnRheCBlcnJvciBpbiBkZWYgZmlsZSAlczolZFxuIiksIGRlZl9maWxlLCBsaW5lbnVtYmVyKTsKLSAgCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1kZWZfZXhwb3J0cyAobmFtZSwgaW50ZXJuYWxfbmFtZSwgb3JkaW5hbCwgbm9uYW1lLCBjb25zdGFudCwgZGF0YSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGludCBub25hbWU7Ci0gICAgIGludCBjb25zdGFudDsKLSAgICAgaW50IGRhdGE7Ci17Ci0gIHN0cnVjdCBleHBvcnQgKnAgPSAoc3RydWN0IGV4cG9ydCAqKSB4bWFsbG9jIChzaXplb2YgKCpwKSk7Ci0KLSAgcC0+bmFtZSA9IG5hbWU7Ci0gIHAtPmludGVybmFsX25hbWUgPSBpbnRlcm5hbF9uYW1lID8gaW50ZXJuYWxfbmFtZSA6IG5hbWU7Ci0gIHAtPm9yZGluYWwgPSBvcmRpbmFsOwotICBwLT5jb25zdGFudCA9IGNvbnN0YW50OwotICBwLT5ub25hbWUgPSBub25hbWU7Ci0gIHAtPmRhdGEgPSBkYXRhOwotICBwLT5uZXh0ID0gZF9leHBvcnRzOwotICBkX2V4cG9ydHMgPSBwOwotICBkX25mdW5jcysrOwotfQotCi12b2lkCi1kZWZfbmFtZSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiTkFNRTogJXMgYmFzZTogJXgiKSwgbmFtZSwgYmFzZSk7Ci0gIAotICBpZiAoZF9pc19kbGwpCi0gICAgd2FybiAoXygiQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iKSk7Ci0gIAotICBkX25hbWUgPSBuYW1lOwotICAvKiBpZiAtLWRsbG5hbWUgbm90IHByb3ZpZGVkLCB1c2UgdGhlIG9uZSBpbiB0aGUgREVGIGZpbGUuCi0gICAgIEZJWE1FOiBJcyB0aGlzIGFwcHJvcHJpYXRlIGZvciBleGVjdXRhYmxlcz8gKi8KLSAgaWYgKCEgZGxsX25hbWUpCi0gICAgZGxsX25hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgZF9pc19leGUgPSAxOwotfQotCi12b2lkCi1kZWZfbGlicmFyeSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiTElCUkFSWTogJXMgYmFzZTogJXgiKSwgbmFtZSwgYmFzZSk7Ci0gIAotICBpZiAoZF9pc19leGUpCi0gICAgd2FybiAoXygiJXM6IENhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIAotICBkX25hbWUgPSBuYW1lOwotICAvKiBpZiAtLWRsbG5hbWUgbm90IHByb3ZpZGVkLCB1c2UgdGhlIG9uZSBpbiB0aGUgREVGIGZpbGUuICovCi0gIGlmICghIGRsbF9uYW1lKQotICAgIGRsbF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRfaXNfZGxsID0gMTsKLX0KLQotdm9pZAotZGVmX2Rlc2NyaXB0aW9uIChkZXNjKQotICAgICBjb25zdCBjaGFyICpkZXNjOwotewotICBkbGlzdF90eXBlICpkID0gKGRsaXN0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkbGlzdF90eXBlKSk7Ci0gIGQtPnRleHQgPSB4c3RyZHVwIChkZXNjKTsKLSAgZC0+bmV4dCA9IGRfbGlzdDsKLSAgZF9saXN0ID0gZDsKLX0KLQotdm9pZAotbmV3X2RpcmVjdGl2ZSAoZGlyKQotICAgICBjaGFyICpkaXI7Ci17Ci0gIGRsaXN0X3R5cGUgKmQgPSAoZGxpc3RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGRsaXN0X3R5cGUpKTsKLSAgZC0+dGV4dCA9IHhzdHJkdXAgKGRpcik7Ci0gIGQtPm5leHQgPSBhX2xpc3Q7Ci0gIGFfbGlzdCA9IGQ7Ci19Ci0KLXZvaWQKLWRlZl9oZWFwc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQotICAgICBpbnQgcmVzZXJ2ZTsKLSAgICAgaW50IGNvbW1pdDsKLXsKLSAgY2hhciBiWzIwMF07Ci0gIGlmIChjb21taXQgPiAwKQotICAgIHNwcmludGYgKGIsICItaGVhcCAweCV4LDB4JXggIiwgcmVzZXJ2ZSwgY29tbWl0KTsKLSAgZWxzZQotICAgIHNwcmludGYgKGIsICItaGVhcCAweCV4ICIsIHJlc2VydmUpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChiKSk7Ci19Ci0KLXZvaWQKLWRlZl9zdGFja3NpemUgKHJlc2VydmUsIGNvbW1pdCkKLSAgICAgaW50IHJlc2VydmU7Ci0gICAgIGludCBjb21taXQ7Ci17Ci0gIGNoYXIgYlsyMDBdOwotICBpZiAoY29tbWl0ID4gMCkKLSAgICBzcHJpbnRmIChiLCAiLXN0YWNrIDB4JXgsMHgleCAiLCByZXNlcnZlLCBjb21taXQpOwotICBlbHNlCi0gICAgc3ByaW50ZiAoYiwgIi1zdGFjayAweCV4ICIsIHJlc2VydmUpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChiKSk7Ci19Ci0KLS8qIGFwcGVuZF9pbXBvcnQgc2ltcGx5IGFkZHMgdGhlIGdpdmVuIGltcG9ydCBkZWZpbml0aW9uIHRvIHRoZSBnbG9iYWwKLSAgIGltcG9ydF9saXN0LiAgSXQgaXMgdXNlZCBieSBkZWZfaW1wb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLWFwcGVuZF9pbXBvcnQgKHN5bWJvbF9uYW1lLCBkbGxfbmFtZSwgZnVuY19vcmRpbmFsKQotICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGxsX25hbWU7Ci0gICAgIGludCBmdW5jX29yZGluYWw7Ci17Ci0gIGloZWFkdHlwZSAqKnBxOwotICBpaGVhZHR5cGUgKnE7Ci0KLSAgZm9yIChwcSA9ICZpbXBvcnRfbGlzdDsgKnBxICE9IE5VTEw7IHBxID0gJigqcHEpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKCgqcHEpLT5kbGxuYW1lLCBkbGxfbmFtZSkgPT0gMCkKLQl7Ci0JICBxID0gKnBxOwotCSAgcS0+ZnVuY3RhaWwtPm5leHQgPSB4bWFsbG9jIChzaXplb2YgKGlmdW5jdHlwZSkpOwotCSAgcS0+ZnVuY3RhaWwgPSBxLT5mdW5jdGFpbC0+bmV4dDsKLQkgIHEtPmZ1bmN0YWlsLT5vcmQgID0gZnVuY19vcmRpbmFsOwotCSAgcS0+ZnVuY3RhaWwtPm5hbWUgPSB4c3RyZHVwIChzeW1ib2xfbmFtZSk7Ci0JICBxLT5mdW5jdGFpbC0+bmV4dCA9IE5VTEw7Ci0JICBxLT5uZnVuY3MrKzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHEgPSB4bWFsbG9jIChzaXplb2YgKGloZWFkdHlwZSkpOwotICBxLT5kbGxuYW1lID0geHN0cmR1cCAoZGxsX25hbWUpOwotICBxLT5uZnVuY3MgPSAxOwotICBxLT5mdW5jaGVhZCA9IHhtYWxsb2MgKHNpemVvZiAoaWZ1bmN0eXBlKSk7Ci0gIHEtPmZ1bmN0YWlsID0gcS0+ZnVuY2hlYWQ7Ci0gIHEtPm5leHQgPSBOVUxMOwotICBxLT5mdW5jdGFpbC0+bmFtZSA9IHhzdHJkdXAgKHN5bWJvbF9uYW1lKTsKLSAgcS0+ZnVuY3RhaWwtPm9yZCAgPSBmdW5jX29yZGluYWw7Ci0gIHEtPmZ1bmN0YWlsLT5uZXh0ID0gTlVMTDsKLQotICAqcHEgPSBxOwotfQotCi0vKiBkZWZfaW1wb3J0IGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBkZWZwYXJzZS55IHdoZW4gYW4gSU1QT1JUCi0gICBkZWNsYXJhdGlvbiBpcyBlbmNvdW50ZXJlZC4gIERlcGVuZGluZyBvbiB0aGUgZm9ybSBvZiB0aGUKLSAgIGRlY2xhcmF0aW9uLCB0aGUgbW9kdWxlIG5hbWUgbWF5IG9yIG1heSBub3QgbmVlZCAiLmRsbCIgdG8gYmUKLSAgIGFwcGVuZGVkIHRvIGl0LCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gbWF5IGJlIHN0b3JlZCBpbiBpbnRlcm5hbAotICAgb3IgZW50cnksIGFuZCB0aGVyZSBtYXkgb3IgbWF5IG5vdCBiZSBhbiBvcmRpbmFsIHZhbHVlIGFzc29jaWF0ZWQKLSAgIHdpdGggaXQuICAqLwotCi0vKiBBIG5vdGUgcmVnYXJkaW5nIHRoZSBwYXJzZSBtb2RlczoKLSAgIEluIGRlZnBhcnNlLnkgd2UgaGF2ZSB0byBhY2NlcHQgaW1wb3J0IGRlY2xhcmF0aW9ucyB3aGljaCBmb2xsb3cKLSAgIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKLSAgICAgPGZ1bmNfbmFtZV9pbl9hcHA+ID0gPGRsbF9uYW1lPi48ZnVuY19uYW1lX2luX2RsbD4KLSAgICAgPGZ1bmNfbmFtZV9pbl9hcHA+ID0gPGRsbF9uYW1lPi48bnVtYmVyPgotICAgICA8ZGxsX25hbWU+LjxmdW5jX25hbWVfaW5fZGxsPgotICAgICA8ZGxsX25hbWU+LjxudW1iZXI+Ci0gICBGdXJ0aGVybW9yZSwgdGhlIGRsbCdzIG5hbWUgbWF5IG9yIG1heSBub3QgZW5kIHdpdGggIi5kbGwiLCB3aGljaAotICAgY29tcGxpY2F0ZXMgdGhlIHBhcnNpbmcgYSBsaXR0bGUuICBOb3JtYWxseSB0aGUgZGxsJ3MgbmFtZSBpcwotICAgcGFzc2VkIHRvIGRlZl9pbXBvcnQoKSBpbiB0aGUgIm1vZHVsZSIgcGFyYW1ldGVyLCBidXQgd2hlbiBpdCBlbmRzCi0gICB3aXRoICIuZGxsIiBpdCBnZXRzIHBhc3NlZCBpbiAibW9kdWxlIiBzYW5zICIuZGxsIiBhbmQgdGhhdCBuZWVkcwotICAgdG8gYmUgcmVhcHBlbmRlZC4KLQotICBkZWZfaW1wb3J0IGdldHMgZml2ZSBwYXJhbWV0ZXJzOgotICBBUFBfTkFNRSAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgYXBwbGljYXRpb24sIGlmCi0gICAgICAgICAgICAgcHJlc2VudCwgb3IgTlVMTCBpZiBub3QgcHJlc2VudC4KLSAgTU9EVUxFICAgLSB0aGUgbmFtZSBvZiB0aGUgZGxsLCBwb3NzaWJseSBzYW5zIGV4dGVuc2lvbiAoaWUsICcuZGxsJykuCi0gIERMTEVYVCAgIC0gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZGxsLCBpZiBwcmVzZW50LCBOVUxMIGlmIG5vdCBwcmVzZW50LgotICBFTlRSWSAgICAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgZGxsLCBpZiBwcmVzZW50LCBvciBOVUxMLgotICBPUkRfVkFMICAtIHRoZSBudW1lcmljYWwgdGFnIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgZGxsLCBpZiBwcmVzZW50LAotICAgICAgICAgICAgIG9yIE5VTEwuICBFeGFjdGx5IG9uZSBvZiA8ZW50cnk+IG9yIDxvcmRfdmFsPiBtdXN0IGJlCi0gICAgICAgICAgICAgcHJlc2VudCAoaS5lLiwgbm90IE5VTEwpLiAgKi8KLQotdm9pZAotZGVmX2ltcG9ydCAoYXBwX25hbWUsIG1vZHVsZSwgZGxsZXh0LCBlbnRyeSwgb3JkX3ZhbCkKLSAgICAgY29uc3QgY2hhciAqYXBwX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsKLSAgICAgY29uc3QgY2hhciAqZGxsZXh0OwotICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICAgaW50IG9yZF92YWw7Ci17Ci0gIGNvbnN0IGNoYXIgKmFwcGxpY2F0aW9uX25hbWU7Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAoZW50cnkgIT0gTlVMTCkKLSAgICBhcHBsaWNhdGlvbl9uYW1lID0gZW50cnk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYXBwX25hbWUgIT0gTlVMTCkKLQlhcHBsaWNhdGlvbl9uYW1lID0gYXBwX25hbWU7Ci0gICAgICBlbHNlCi0JYXBwbGljYXRpb25fbmFtZSA9ICIiOwotICAgIH0KLSAgCi0gIGlmIChkbGxleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAobW9kdWxlKSArIHN0cmxlbiAoZGxsZXh0KSArIDIpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJXMuJXMiLCBtb2R1bGUsIGRsbGV4dCk7Ci0gICAgICBtb2R1bGUgPSBidWY7Ci0gICAgfQotCi0gIGFwcGVuZF9pbXBvcnQgKGFwcGxpY2F0aW9uX25hbWUsIG1vZHVsZSwgb3JkX3ZhbCk7Ci19Ci0KLXZvaWQKLWRlZl92ZXJzaW9uIChtYWpvciwgbWlub3IpCi0gICAgIGludCBtYWpvcjsKLSAgICAgaW50IG1pbm9yOwotewotICBwcmludGYgKCJWRVJTSU9OICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwotfQotCi12b2lkCi1kZWZfc2VjdGlvbiAobmFtZSwgYXR0cikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGF0dHI7Ci17Ci0gIGNoYXIgYnVmWzIwMF07Ci0gIGNoYXIgYXR0c1s1XTsKLSAgY2hhciAqZCA9IGF0dHM7Ci0gIGlmIChhdHRyICYgMSkKLSAgICAqZCsrID0gJ1InOwotCi0gIGlmIChhdHRyICYgMikKLSAgICAqZCsrID0gJ1cnOwotICBpZiAoYXR0ciAmIDQpCi0gICAgKmQrKyA9ICdYJzsKLSAgaWYgKGF0dHIgJiA4KQotICAgICpkKysgPSAnUyc7Ci0gICpkKysgPSAwOwotICBzcHJpbnRmIChidWYsICItYXR0ciAlcyAlcyIsIG5hbWUsIGF0dHMpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChidWYpKTsKLX0KLQotdm9pZAotZGVmX2NvZGUgKGF0dHIpCi0gICAgIGludCBhdHRyOwotewotCi0gIGRlZl9zZWN0aW9uICgiQ09ERSIsIGF0dHIpOwotfQotCi12b2lkCi1kZWZfZGF0YSAoYXR0cikKLSAgICAgaW50IGF0dHI7Ci17Ci0gIGRlZl9zZWN0aW9uICgiREFUQSIsIGF0dHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLXJ1biAod2hhdCwgYXJncykKLSAgICAgY29uc3QgY2hhciAqd2hhdDsKLSAgICAgY2hhciAqYXJnczsKLXsKLSAgY2hhciAqczsKLSAgaW50IHBpZCwgd2FpdF9zdGF0dXM7Ci0gIGludCBpOwotICBjb25zdCBjaGFyICoqYXJndjsKLSAgY2hhciAqZXJybXNnX2ZtdCwgKmVycm1zZ19hcmc7Ci0gIGNoYXIgKnRlbXBfYmFzZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0KLSAgaW5mb3JtICgicnVuOiAlcyAlc1xuIiwgd2hhdCwgYXJncyk7Ci0KLSAgLyogQ291bnQgdGhlIGFyZ3MgKi8KLSAgaSA9IDA7Ci0gIGZvciAocyA9IGFyZ3M7ICpzOyBzKyspCi0gICAgaWYgKCpzID09ICcgJykKLSAgICAgIGkrKzsKLSAgaSsrOwotICBhcmd2ID0gYWxsb2NhIChzaXplb2YgKGNoYXIgKikgKiAoaSArIDMpKTsKLSAgaSA9IDA7Ci0gIGFyZ3ZbaSsrXSA9IHdoYXQ7Ci0gIHMgPSBhcmdzOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoKnMgPT0gJyAnKQotCSsrczsKLSAgICAgIGFyZ3ZbaSsrXSA9IHM7Ci0gICAgICB3aGlsZSAoKnMgIT0gJyAnICYmICpzICE9IDApCi0JcysrOwotICAgICAgaWYgKCpzID09IDApCi0JYnJlYWs7Ci0gICAgICAqcysrID0gMDsKLSAgICB9Ci0gIGFyZ3ZbaSsrXSA9IE5VTEw7Ci0KLSAgcGlkID0gcGV4ZWN1dGUgKGFyZ3ZbMF0sIChjaGFyICogY29uc3QgKikgYXJndiwgcHJvZ3JhbV9uYW1lLCB0ZW1wX2Jhc2UsCi0JCSAgJmVycm1zZ19mbXQsICZlcnJtc2dfYXJnLCBQRVhFQ1VURV9PTkUgfCBQRVhFQ1VURV9TRUFSQ0gpOwotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgaW5mb3JtIChzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIAotICAgICAgZmF0YWwgKGVycm1zZ19mbXQsIGVycm1zZ19hcmcpOwotICAgIH0KLQotICBwaWQgPSBwd2FpdCAocGlkLCAmIHdhaXRfc3RhdHVzLCAwKTsKLSAgCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJ3YWl0OiAlcyIpLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRlNJR05BTEVEICh3YWl0X3N0YXR1cykpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWQiKSwgV1RFUk1TSUcgKHdhaXRfc3RhdHVzKSk7Ci0gICAgfQotICBlbHNlIGlmIChXSUZFWElURUQgKHdhaXRfc3RhdHVzKSkKLSAgICB7Ci0gICAgICBpZiAoV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSAhPSAwKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0Jd2FybiAoXygiJXMgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iKSwKLQkgICAgICB3aGF0LCBXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotLyogTG9vayBmb3IgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0IGluIHRoZSAuZHJlY3R2ZSBzZWN0aW9uIG9mCi0gICBBQkZELiAgUGFzcyBlYWNoIG9uZSB0byBkZWZfZXhwb3J0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1zY2FuX2RyZWN0dmVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqIHM7Ci0gIGludCAgICAgICAgc2l6ZTsKLSAgY2hhciAqICAgICBidWY7Ci0gIGNoYXIgKiAgICAgcDsKLSAgY2hhciAqICAgICBlOwotCi0gIC8qIExvb2sgZm9yIC5kcmVjdHZlJ3MgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBEUkVDVFZFX1NFQ1RJT05fTkFNRSk7Ci0gIAotICBpZiAocyA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgICAgIAotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzKTsKLSAgYnVmICA9IHhtYWxsb2MgKHNpemUpOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgYnVmLCAwLCBzaXplKTsKLSAgICAgIAotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIlN1Y2tpbmcgaW4gaW5mbyBmcm9tICVzIHNlY3Rpb24gaW4gJXNcbiIpLAotCSAgRFJFQ1RWRV9TRUNUSU9OX05BTUUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAvKiBTZWFyY2ggZm9yIC1leHBvcnQ6IHN0cmluZ3MuIFRoZSBleHBvcnRlZCBzeW1ib2xzIGNhbiBvcHRpb25hbGx5Ci0gICAgIGhhdmUgdHlwZSB0YWdzIChlZy4sIC1leHBvcnQ6Zm9vLGRhdGEpLCBzbyBoYW5kbGUgdGhvc2UgYXMgd2VsbC4KLSAgICAgQ3VycmVudGx5IG9ubHkgZGF0YSB0YWcgaXMgc3VwcG9ydGVkLiAqLwotICBwID0gYnVmOwotICBlID0gYnVmICsgc2l6ZTsKLSAgd2hpbGUgKHAgPCBlKQotICAgIHsKLSAgICAgIGlmIChwWzBdID09ICctJwotCSAgJiYgc3RybmNtcCAocCwgIi1leHBvcnQ6IiwgOCkgPT0gMCkKLQl7Ci0JICBjaGFyICogbmFtZTsKLQkgIGNoYXIgKiBjOwotCSAgZmxhZ3dvcmQgZmxhZ3MgPSBCU0ZfRlVOQ1RJT047Ci0JICAKLQkgIHAgKz0gODsKLQkgIG5hbWUgPSBwOwotCSAgd2hpbGUgKHAgPCBlICYmICpwICE9ICcsJyAmJiAqcCAhPSAnICcgJiYgKnAgIT0gJy0nKQotCSAgICBwKys7Ci0JICBjID0geG1hbGxvYyAocCAtIG5hbWUgKyAxKTsKLQkgIG1lbWNweSAoYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgY1twIC0gbmFtZV0gPSAwOwotCSAgaWYgKHAgPCBlICYmICpwID09ICcsJykgICAgICAgLyogZm91bmQgdHlwZSB0YWcuICovCi0JICAgIHsKLQkgICAgICBjaGFyICp0YWdfc3RhcnQgPSArK3A7Ci0JICAgICAgd2hpbGUgKHAgPCBlICYmICpwICE9ICcgJyAmJiAqcCAhPSAnLScpCi0JCXArKzsKLQkgICAgICBpZiAoc3RybmNtcCAodGFnX3N0YXJ0LCAiZGF0YSIsIDQpID09IDApCi0JCWZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0JICAgIH0KLQotCi0JICAvKiBGSVhNRTogVGhlIDV0aCBhcmcgaXMgZm9yIHRoZSBgY29uc3RhbnQnIGZpZWxkLgotCSAgICAgV2hhdCBzaG91bGQgaXQgYmU/ICBOb3QgdGhhdCBpdCBtYXR0ZXJzIHNpbmNlIGl0J3Mgbm90Ci0JICAgICBjdXJyZW50bHkgdXNlZnVsLiAgKi8KLQkgIGRlZl9leHBvcnRzIChjLCAwLCAtMSwgMCwgMCwgISAoZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKTsKLQotCSAgaWYgKGFkZF9zdGRjYWxsX2FsaWFzICYmIHN0cmNociAoYywgJ0AnKSkKLQkgICAgewotCSAgICAgIGNoYXIgKmV4cG9ydGVkX25hbWUgPSB4c3RyZHVwIChjKTsKLQkgICAgICBjaGFyICphdHN5bSA9IHN0cmNociAoZXhwb3J0ZWRfbmFtZSwgJ0AnKTsKLQkgICAgICAqYXRzeW0gPSAnXDAnOwotCSAgICAgIC8qIE5vdGU6IHN0ZGNhbGwgYWxpYXMgc3ltYm9scyBjYW4gbmV2ZXIgYmUgZGF0YS4gKi8KLQkgICAgICBkZWZfZXhwb3J0cyAoZXhwb3J0ZWRfbmFtZSwgeHN0cmR1cCAoYyksIC0xLCAwLCAwLCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlwKys7Ci0gICAgfQotICBmcmVlIChidWYpOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgaW4gTUlOSVNZTVMsIGFuZCBhZGQgZWFjaCBvbmUgdG8gbGlzdCBvZgotICAgc3ltYm9scyB0byBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9maWx0ZXJlZF9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZDsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLQotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBmYWxzZSwgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBzeW1ib2xfbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSBzeW1ib2xfbmFtZVswXSkKLQkrK3N5bWJvbF9uYW1lOwotCi0gICAgICBkZWZfZXhwb3J0cyAoeHN0cmR1cCAoc3ltYm9sX25hbWUpICwgMCwgLTEsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgISAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikpOwotCi0gICAgICBpZiAoYWRkX3N0ZGNhbGxfYWxpYXMgJiYgc3RyY2hyIChzeW1ib2xfbmFtZSwgJ0AnKSkKLSAgICAgICAgewotCSAgY2hhciAqZXhwb3J0ZWRfbmFtZSA9IHhzdHJkdXAgKHN5bWJvbF9uYW1lKTsKLQkgIGNoYXIgKmF0c3ltID0gc3RyY2hyIChleHBvcnRlZF9uYW1lLCAnQCcpOwotCSAgKmF0c3ltID0gJ1wwJzsKLQkgIC8qIE5vdGU6IHN0ZGNhbGwgYWxpYXMgc3ltYm9scyBjYW4gbmV2ZXIgYmUgZGF0YS4gKi8KLQkgIGRlZl9leHBvcnRzIChleHBvcnRlZF9uYW1lLCB4c3RyZHVwIChzeW1ib2xfbmFtZSksIC0xLCAwLCAwLCAwKTsKLQl9Ci0gICAgfQotfQotCi0vKiBBZGQgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfZXhjbHVkZXMgKG5ld19leGNsdWRlcykKLSAgICAgY29uc3QgY2hhciAqbmV3X2V4Y2x1ZGVzOwotewotICBjaGFyICpsb2NhbF9jb3B5OwotICBjaGFyICpleGNsdWRlX3N0cmluZzsKLQotICBsb2NhbF9jb3B5ID0geHN0cmR1cCAobmV3X2V4Y2x1ZGVzKTsKLQotICBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAobG9jYWxfY29weSwgIiw6Iik7Ci0gIGZvciAoOyBleGNsdWRlX3N0cmluZzsgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKE5VTEwsICIsOiIpKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbmV3X2V4Y2x1ZGU7Ci0gICAgICAKLSAgICAgIG5ld19leGNsdWRlID0gKChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikKLQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdHJpbmdfbGlzdCkpKTsKLSAgICAgIG5ld19leGNsdWRlLT5zdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGV4Y2x1ZGVfc3RyaW5nKSArIDIpOwotICAgICAgLyogRklYTUU6IElzIGl0IGFsd2F5cyByaWdodCB0byBhZGQgYSBsZWFkaW5nIHVuZGVyc2NvcmU/ICAqLwotICAgICAgc3ByaW50ZiAobmV3X2V4Y2x1ZGUtPnN0cmluZywgIl8lcyIsIGV4Y2x1ZGVfc3RyaW5nKTsKLSAgICAgIG5ld19leGNsdWRlLT5uZXh0ID0gZXhjbHVkZXM7Ci0gICAgICBleGNsdWRlcyA9IG5ld19leGNsdWRlOwotCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgaW5mb3JtIChfKCJFeGNsdWRpbmcgc3ltYm9sOiAlc1xuIiksIGV4Y2x1ZGVfc3RyaW5nKTsKLSAgICB9Ci0KLSAgZnJlZSAobG9jYWxfY29weSk7Ci19Ci0KLS8qIFNlZSBpZiBTVFJJTkcgaXMgb24gdGhlIGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1hdGNoX2V4Y2x1ZGUgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmV4Y2xfaXRlbTsKLQotICBmb3IgKGV4Y2xfaXRlbSA9IGV4Y2x1ZGVzOyBleGNsX2l0ZW07IGV4Y2xfaXRlbSA9IGV4Y2xfaXRlbS0+bmV4dCkKLSAgICBpZiAoc3RyY21wIChzdHJpbmcsIGV4Y2xfaXRlbS0+c3RyaW5nKSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHRoZSBkZWZhdWx0IGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9kZWZhdWx0X2V4Y2x1ZGVzICh2b2lkKQotewotICBhZGRfZXhjbHVkZXMgKGRlZmF1bHRfZXhjbHVkZXMpOwotfQotCi0vKiBDaG9vc2Ugd2hpY2ggc3ltYm9scyB0byBleHBvcnQuICAqLwotCi1zdGF0aWMgbG9uZwotZmlsdGVyX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQsICp0bzsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgdG8gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0KLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgaW50IGtlZXAgPSAwOwotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGZhbHNlLCAoY29uc3QgUFRSKSBmcm9tLCBzdG9yZSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBleHRlcm5hbCBhbmQgZGVmaW5lZCBvbmx5IHN5bWJvbHMuICAqLwotICAgICAga2VlcCA9ICgoKHN5bS0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCi0JICAgICAgIHx8IChzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICAgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLSAgICAgIAotICAgICAga2VlcCA9IGtlZXAgJiYgISBtYXRjaF9leGNsdWRlIChzeW0tPm5hbWUpOwotCi0gICAgICBpZiAoa2VlcCkKLQl7Ci0JICBtZW1jcHkgKHRvLCBmcm9tLCBzaXplKTsKLQkgIHRvICs9IHNpemU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKHRvIC0gKGJmZF9ieXRlICopIG1pbmlzeW1zKSAvIHNpemU7Ci19Ci0KLS8qIEV4cG9ydCBhbGwgc3ltYm9scyBpbiBBQkZELCBleGNlcHQgZm9yIG9uZXMgd2Ugd2VyZSB0b2xkIG5vdCB0bwotICAgZXhwb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNjYW5fYWxsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgUFRSIG1pbmlzeW1zOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotICAvKiBJZ25vcmUgYmZkcyB3aXRoIGFuIGltcG9ydCBkZXNjcmlwdG9yIHRhYmxlLiAgV2UgYXNzdW1lIHRoYXQgYW55Ci0gICAgIHN1Y2ggQkZEIGNvbnRhaW5zIHN5bWJvbHMgd2hpY2ggYXJlIGV4cG9ydGVkIGZyb20gYW5vdGhlciBETEwsCi0gICAgIGFuZCB3ZSBkb24ndCB3YW50IHRvIHJlZXhwb3J0IHRoZW0gZnJvbSBoZXJlLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmlkYXRhJDQiKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHdhcm4gKF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzeW1jb3VudCA9IGJmZF9yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBmYWxzZSwgJm1pbmlzeW1zLCAmc2l6ZSk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKHN5bWNvdW50ID09IDApCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHdhcm4gKF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEaXNjYXJkIHRoZSBzeW1ib2xzIHdlIGRvbid0IHdhbnQgdG8gZXhwb3J0LiAgSXQncyBPSyB0byBkbyB0aGlzCi0gICAgIGluIHBsYWNlOyB3ZSdsbCBmcmVlIHRoZSBzdG9yYWdlIGFueXdheS4gICovCi0KLSAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKLSAgc2Nhbl9maWx0ZXJlZF9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpOwotCi0gIGZyZWUgKG1pbmlzeW1zKTsKLX0KLQotLyogTG9vayBhdCB0aGUgb2JqZWN0IGZpbGUgdG8gZGVjaWRlIHdoaWNoIHN5bWJvbHMgdG8gZXhwb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNjYW5fb3Blbl9vYmpfZmlsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoZXhwb3J0X2FsbF9zeW1ib2xzKQotICAgIHNjYW5fYWxsX3N5bWJvbHMgKGFiZmQpOwotICBlbHNlCi0gICAgc2Nhbl9kcmVjdHZlX3N5bWJvbHMgKGFiZmQpOwotIAotICAvKiBGSVhNRTogd2Ugb3VnaHQgdG8gcmVhZCBpbiBhbmQgYmxvY2sgb3V0IHRoZSBiYXNlIHJlbG9jYXRpb25zICovCi0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJEb25lIHJlYWRpbmcgJXNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zY2FuX29ial9maWxlIChmaWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGJmZCAqIGYgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCAwKTsKLQotICBpZiAoIWYpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiVW5hYmxlIHRvIG9wZW4gb2JqZWN0IGZpbGU6ICVzIiksIGZpbGVuYW1lKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIlNjYW5uaW5nIG9iamVjdCBmaWxlICVzIiksIGZpbGVuYW1lKTsKLSAgCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmLCBiZmRfYXJjaGl2ZSkpCi0gICAgewotICAgICAgYmZkICphcmZpbGUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmLCAwKTsKLSAgICAgIHdoaWxlIChhcmZpbGUpCi0JewotCSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFyZmlsZSwgYmZkX29iamVjdCkpCi0JICAgIHNjYW5fb3Blbl9vYmpfZmlsZSAoYXJmaWxlKTsKLQkgIGJmZF9jbG9zZSAoYXJmaWxlKTsKLQkgIGFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYsIGFyZmlsZSk7Ci0JfQotICAgICAgCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLSAgICAgIGlmIChtY29yZV9lbGZfb3V0X2ZpbGUpCi0JaW5mb3JtIChfKCJDYW5ub3QgcHJvZHVjZSBtY29yZS1lbGYgZGxsIGZyb20gYXJjaGl2ZSBmaWxlOiAlcyIpLCBmaWxlbmFtZSk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9jaGVja19mb3JtYXQgKGYsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgIHNjYW5fb3Blbl9vYmpfZmlsZSAoZik7Ci0KLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotICAgICAgaWYgKG1jb3JlX2VsZl9vdXRfZmlsZSkKLQltY29yZV9lbGZfY2FjaGVfZmlsZW5hbWUgKChjaGFyICopIGZpbGVuYW1lKTsKLSNlbmRpZgotICAgIH0KLQotICBiZmRfY2xvc2UgKGYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfZGVmX2luZm8gKGYpCi0gICAgIEZJTEUgKmY7Ci17Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotICBmcHJpbnRmIChmLCAiJXMgIiwgQVNNX0MpOwotICBmb3IgKGkgPSAwOyBvYXZbaV07IGkrKykKLSAgICBmcHJpbnRmIChmLCAiJXMgIiwgb2F2W2ldKTsKLSAgZnByaW50ZiAoZiwgIlxuIik7Ci0gIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiJXMgICVkID0gJXMgJXMgQCAlZCAlcyVzJXNcbiIsCi0JICAgICAgIEFTTV9DLAotCSAgICAgICBpLAotCSAgICAgICBleHAtPm5hbWUsCi0JICAgICAgIGV4cC0+aW50ZXJuYWxfbmFtZSwKLQkgICAgICAgZXhwLT5vcmRpbmFsLAotCSAgICAgICBleHAtPm5vbmFtZSA/ICJOT05BTUUgIiA6ICIiLAotCSAgICAgICBleHAtPmNvbnN0YW50ID8gIkNPTlNUQU5UIiA6ICIiLAotCSAgICAgICBleHAtPmRhdGEgPyAiREFUQSIgOiAiIik7Ci0gICAgfQotfQotCi0vKiBHZW5lcmF0ZSB0aGUgLmV4cCBmaWxlICovCi0KLXN0YXRpYyBpbnQKLXNmdW5jIChhLCBiKQotICAgICBjb25zdCB2b2lkICphOwotICAgICBjb25zdCB2b2lkICpiOwotewotICByZXR1cm4gKihjb25zdCBsb25nICopIGEgLSAqKGNvbnN0IGxvbmcgKikgYjsKLX0KLQotc3RhdGljIHZvaWQKLWZsdXNoX3BhZ2UgKGYsIG5lZWQsIHBhZ2VfYWRkciwgb25fcGFnZSkKLSAgICAgRklMRSAqZjsKLSAgICAgbG9uZyAqbmVlZDsKLSAgICAgaW50IHBhZ2VfYWRkcjsKLSAgICAgaW50IG9uX3BhZ2U7Ci17Ci0gIGludCBpOwotCi0gIC8qIEZsdXNoIHRoaXMgcGFnZSAqLwotICBmcHJpbnRmIChmLCAiXHQlc1x0MHglMDh4XHQlcyBTdGFydGluZyBSVkEgZm9yIGNodW5rXG4iLAotCSAgIEFTTV9MT05HLAotCSAgIHBhZ2VfYWRkciwKLQkgICBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQweCV4XHQlcyBTaXplIG9mIGJsb2NrXG4iLAotCSAgIEFTTV9MT05HLAotCSAgIChvbl9wYWdlICogMikgKyAob25fcGFnZSAmIDEpICogMiArIDgsCi0JICAgQVNNX0MpOwotICAKLSAgZm9yIChpID0gMDsgaSA8IG9uX3BhZ2U7IGkrKykKLSAgICBmcHJpbnRmIChmLCAiXHQlc1x0MHglbHhcbiIsIEFTTV9TSE9SVCwKLQkgICAgICgobmVlZFtpXSAtIHBhZ2VfYWRkcikgfCAweDMwMDApICYgMHhmZmZmKTsKLQotICAvKiBBbmQgcGFkZGluZyAqLwotICBpZiAob25fcGFnZSAmIDEpCi0gICAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JXhcbiIsIEFTTV9TSE9SVCwgMCB8IDB4MDAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZGVmX2ZpbGUgKCkKLXsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0KLSAgaW5mb3JtIChfKCJBZGRpbmcgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIpKTsKLSAgCi0gIGZwcmludGYgKG91dHB1dF9kZWYsICI7Iik7Ci0gIGZvciAoaSA9IDA7IG9hdltpXTsgaSsrKQotICAgIGZwcmludGYgKG91dHB1dF9kZWYsICIgJXMiLCBvYXZbaV0pOwotCi0gIGZwcmludGYgKG91dHB1dF9kZWYsICJcbkVYUE9SVFNcbiIpOwotCi0gIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyICpxdW90ZSA9IHN0cmNociAoZXhwLT5uYW1lLCAnLicpID8gIlwiIiA6ICIiOwotICAgICAgY2hhciAqcmVzID0gY3BsdXNfZGVtYW5nbGUgKGV4cC0+aW50ZXJuYWxfbmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotCi0gICAgICBpZiAoc3RyY21wIChleHAtPm5hbWUsIGV4cC0+aW50ZXJuYWxfbmFtZSkgPT0gMCkKLSAgICAgICAgewotCi0JICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXHQlcyVzJXMgQCAlZCVzJXMgOyAlc1xuIiwKLQkJICAgcXVvdGUsCi0JCSAgIGV4cC0+bmFtZSwKLQkJICAgcXVvdGUsCi0JCSAgIGV4cC0+b3JkaW5hbCwKLQkJICAgZXhwLT5ub25hbWUgPyAiIE5PTkFNRSIgOiAiIiwKLQkJICAgZXhwLT5kYXRhID8gIiBEQVRBIiA6ICIiLAotCQkgICByZXMgPyByZXMgOiAiIik7Ci0JfQotICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKnF1b3RlMSA9IHN0cmNociAoZXhwLT5pbnRlcm5hbF9uYW1lLCAnLicpID8gIlwiIiA6ICIiOwotCSAgLyogY2hhciAqYWxpYXMgPSAgKi8KLQkgIGZwcmludGYgKG91dHB1dF9kZWYsICJcdCVzJXMlcyA9ICVzJXMlcyBAICVkJXMlcyA7ICVzXG4iLAotCQkgICBxdW90ZSwKLQkJICAgZXhwLT5uYW1lLAotCQkgICBxdW90ZSwKLQkJICAgcXVvdGUxLAotCQkgICBleHAtPmludGVybmFsX25hbWUsCi0JCSAgIHF1b3RlMSwKLQkJICAgZXhwLT5vcmRpbmFsLAotCQkgICBleHAtPm5vbmFtZSA/ICIgTk9OQU1FIiA6ICIiLAotCQkgICBleHAtPmRhdGEgPyAiIERBVEEiIDogIiIsCi0JCSAgIHJlcyA/IHJlcyA6ICIiKTsKLQl9Ci0gICAgICBpZiAocmVzKQotICAgICAgICBmcmVlIChyZXMpOwotICAgIH0KLSAgCi0gIGluZm9ybSAoXygiQWRkZWQgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIpKTsKLX0KLQotLyogZ2VuZXJhdGVfaWRhdGFfb2ZpbGUgZ2VuZXJhdGVzIHRoZSBwb3J0YWJsZSBhc3NlbWJseSBzb3VyY2UgY29kZQotICAgZm9yIHRoZSBpZGF0YSBzZWN0aW9ucy4gIEl0IGFwcGVuZHMgdGhlIHNvdXJjZSBjb2RlIHRvIHRoZSBlbmQgb2YKLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2lkYXRhX29maWxlIChmaWx2YXIpCi0gICAgIEZJTEUgKmZpbHZhcjsKLXsKLSAgaWhlYWR0eXBlICpoZWFkcHRyOwotICBpZnVuY3R5cGUgKmZ1bmNwdHI7Ci0gIGludCAgICAgICAgaGVhZGluZGV4OwotICBpbnQgICAgICAgIGZ1bmNpbmRleDsKLSAgaW50CSAgICAgbmhlYWRzOwotCi0gIGlmIChpbXBvcnRfbGlzdCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmcHJpbnRmIChmaWx2YXIsICIlcyBJbXBvcnQgZGF0YSBzZWN0aW9uc1xuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQyXG4iKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0ZG9pX2lkYXRhXG4iLCBBU01fR0xPQkFMKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiZG9pX2lkYXRhOlxuIik7Ci0KLSAgbmhlYWRzID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc2xpc3RvbmUlZCVzXHQlcyAlc1xuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUiwKLQkgICAgICAgQVNNX0MsIGhlYWRwdHItPmRsbG5hbWUpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc2RsbG5hbWUlZCVzXG4iLAotCSAgICAgICBBU01fUlZBX0JFRk9SRSwgbmhlYWRzLCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNsaXN0dHdvJWQlc1xuXG4iLAotCSAgICAgICBBU01fUlZBX0JFRk9SRSwgbmhlYWRzLCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIG5oZWFkcysrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIE5VTEwgcmVjb3JkIGF0ICovCi0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogZW5kIG9mIGlkYXRhJDIgKi8KLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBzZWN0aW9uICAgICAgICAqLwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ0XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCAibGlzdG9uZSVkOlxuIiwgaGVhZGluZGV4KTsKLSAgICAgIGZvciAoIGZ1bmNpbmRleCA9IDA7IGZ1bmNpbmRleCA8IGhlYWRwdHItPm5mdW5jczsgZnVuY2luZGV4KysgKQotCWZwcmludGYgKGZpbHZhciwgIlx0JXNmdW5jcHRyJWRfJWQlc1xuIiwKLQkJIEFTTV9SVkFfQkVGT1JFLCBoZWFkaW5kZXgsIGZ1bmNpbmRleCwgQVNNX1JWQV9BRlRFUik7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogTlVMTCB0ZXJtaW5hdGluZyBsaXN0ICovCi0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNVxuIik7Ci0gIGhlYWRpbmRleCA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgImxpc3R0d28lZDpcbiIsIGhlYWRpbmRleCk7Ci0gICAgICBmb3IgKCBmdW5jaW5kZXggPSAwOyBmdW5jaW5kZXggPCBoZWFkcHRyLT5uZnVuY3M7IGZ1bmNpbmRleCsrICkKLQlmcHJpbnRmIChmaWx2YXIsICJcdCVzZnVuY3B0ciVkXyVkJXNcbiIsCi0JCSBBU01fUlZBX0JFRk9SRSwgaGVhZGluZGV4LCBmdW5jaW5kZXgsIEFTTV9SVkFfQUZURVIpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBOVUxMIHRlcm1pbmF0aW5nIGxpc3QgKi8KLSAgICAgIGhlYWRpbmRleCsrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ2XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnVuY2luZGV4ID0gMDsKLSAgICAgIGZvciAoZnVuY3B0ciA9IGhlYWRwdHItPmZ1bmNoZWFkOyBmdW5jcHRyICE9IE5VTEw7Ci0JICAgZnVuY3B0ciA9IGZ1bmNwdHItPm5leHQpCi0JewotCSAgZnByaW50ZiAoZmlsdmFyLCJmdW5jcHRyJWRfJWQ6XG4iLCBoZWFkaW5kZXgsIGZ1bmNpbmRleCk7Ci0JICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdCVkXG4iLCBBU01fU0hPUlQsCi0JCSAgICgoZnVuY3B0ci0+b3JkKSAmIDB4RkZGRikpOwotCSAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCBmdW5jcHRyLT5uYW1lKTsKLQkgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0MFxuIiwgQVNNX0JZVEUpOwotCSAgZnVuY2luZGV4Kys7Ci0JfQotICAgICAgaGVhZGluZGV4Kys7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDdcbiIpOwotICBoZWFkaW5kZXggPSAwOwotICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsImRsbG5hbWUlZDpcbiIsIGhlYWRpbmRleCk7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIGhlYWRwdHItPmRsbG5hbWUpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQwXG4iLCBBU01fQllURSk7Ci0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci19Ci0KLS8qIEFzc2VtYmxlIHRoZSBzcGVjaWZpZWQgZmlsZS4gKi8KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV9maWxlIChzb3VyY2UsIGRlc3QpCi0gICAgIGNvbnN0IGNoYXIgKiBzb3VyY2U7Ci0gICAgIGNvbnN0IGNoYXIgKiBkZXN0OwotewotICBjaGFyICogY21kOwotICAKLSAgY21kID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKEFTTV9TV0lUQ0hFUykgKyBzdHJsZW4gKGFzX2ZsYWdzKQotCQkJICsgc3RybGVuIChzb3VyY2UpICsgc3RybGVuIChkZXN0KSArIDUwKTsKLQotICBzcHJpbnRmIChjbWQsICIlcyAlcyAtbyAlcyAlcyIsIEFTTV9TV0lUQ0hFUywgYXNfZmxhZ3MsIGRlc3QsIHNvdXJjZSk7Ci0KLSAgcnVuIChhc19uYW1lLCBjbWQpOwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2V4cF9maWxlICgpCi17Ci0gIEZJTEUgKmY7Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotICBkbGlzdF90eXBlICpkbDsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkdlbmVyYXRpbmcgZXhwb3J0IGZpbGU6ICVzXG4iKSwgZXhwX25hbWUpOwotICAKLSAgZiA9IGZvcGVuIChUTVBfQVNNLCBGT1BFTl9XVCk7Ci0gIGlmICghZikKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGU6ICVzIiksIFRNUF9BU00pOwotICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJPcGVuZWQgdGVtcG9yYXJ5IGZpbGU6ICVzIiksIFRNUF9BU00pOwotCi0gIGR1bXBfZGVmX2luZm8gKGYpOwotICAKLSAgaWYgKGRfZXhwb3J0cykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuZWRhdGFcblxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwkwCSVzIEFsbHdheXMgMFxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCTB4JWx4CSVzIFRpbWUgYW5kIGRhdGVcbiIsIEFTTV9MT05HLCAobG9uZykgdGltZSgwKSwKLQkgICAgICAgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJMAklcyBNYWpvciBhbmQgTWlub3IgdmVyc2lvblxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzbmFtZSVzCSVzIFB0ciB0byBuYW1lIG9mIGRsbFxuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIFN0YXJ0aW5nIG9yZGluYWwgb2YgZXhwb3J0c1xuIiwgQVNNX0xPTkcsIGRfbG93X29yZCwgQVNNX0MpOwotCi0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIE51bWJlciBvZiBmdW5jdGlvbnNcbiIsIEFTTV9MT05HLCBkX2hpZ2hfb3JkIC0gZF9sb3dfb3JkICsgMSwgQVNNX0MpOwotICAgICAgZnByaW50ZihmLCJcdCVzIG5hbWVkIGZ1bmNzICVkLCBsb3cgb3JkICVkLCBoaWdoIG9yZCAlZFxuIiwKLQkgICAgICBBU01fQywKLQkgICAgICBkX25hbWVkX25mdW5jcywgZF9sb3dfb3JkLCBkX2hpZ2hfb3JkKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIE51bWJlciBvZiBuYW1lc1xuIiwgQVNNX0xPTkcsCi0JICAgICAgIHNob3dfYWxsbmFtZXMgPyBkX2hpZ2hfb3JkIC0gZF9sb3dfb3JkICsgMSA6IGRfbmFtZWRfbmZ1bmNzLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc2FmdW5jcyVzICAlcyBBZGRyZXNzIG9mIGZ1bmN0aW9uc1xuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0JXNhbmFtZXMlcwklcyBBZGRyZXNzIG9mIE5hbWUgUG9pbnRlciBUYWJsZVxuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0JXNhbm9yZHMlcwklcyBBZGRyZXNzIG9mIG9yZGluYWxzXG4iLCBBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotCi0gICAgICBmcHJpbnRmIChmLCAibmFtZToJJXMJXCIlc1wiXG4iLCBBU01fVEVYVCwgZGxsX25hbWUpOwotCi0KLSAgICAgIGZwcmludGYoZiwiJXMgRXhwb3J0IGFkZHJlc3MgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYoZiwiXHQlc1xuIiwgQVNNX0FMSUdOX0xPTkcpOwotICAgICAgZnByaW50ZiAoZiwgImFmdW5jczpcbiIpOwotICAgICAgaSA9IGRfbG93X29yZDsKLQotICAgICAgZm9yIChleHAgPSBkX2V4cG9ydHM7IGV4cDsgZXhwID0gZXhwLT5uZXh0KQotCXsKLQkgIGlmIChleHAtPm9yZGluYWwgIT0gaSkKLQkgICAgewotI2lmIDAKLQkgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0JWRcdCVzICVkLi4lZCBtaXNzaW5nXG4iLAotCQkgICAgICAgQVNNX1NQQUNFLAotCQkgICAgICAgKGV4cC0+b3JkaW5hbCAtIGkpICogNCwKLQkJICAgICAgIEFTTV9DLAotCQkgICAgICAgaSwgZXhwLT5vcmRpbmFsIC0gMSk7Ci0JICAgICAgaSA9IGV4cC0+b3JkaW5hbDsKLSNlbmRpZgotCSAgICAgIHdoaWxlIChpIDwgZXhwLT5vcmRpbmFsKQotCQl7Ci0JCSAgZnByaW50ZihmLCJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0JCSAgaSsrOwotCQl9Ci0JICAgIH0KLQkgIGZwcmludGYgKGYsICJcdCVzJXMlcyVzXHQlcyAlZFxuIiwgQVNNX1JWQV9CRUZPUkUsCi0gICAgICAgICAgICAgICAgICAgQVNNX1BSRUZJWCwKLSAgICAgICAgICAgICAgICAgICBleHAtPmludGVybmFsX25hbWUsIEFTTV9SVkFfQUZURVIsIEFTTV9DLCBleHAtPm9yZGluYWwpOwotCSAgaSsrOwotCX0KLQotICAgICAgZnByaW50ZiAoZiwiJXMgRXhwb3J0IE5hbWUgUG9pbnRlciBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgImFuYW1lczpcbiIpOwotCi0gICAgICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLQl7Ci0JICBpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICAgIGZwcmludGYgKGYsICJcdCVzbiVkJXNcbiIsCi0JCSAgICAgQVNNX1JWQV9CRUZPUkUsIGV4cC0+b3JkaW5hbCwgQVNNX1JWQV9BRlRFUik7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmLCIlcyBFeHBvcnQgT3JpZGluYWwgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJhbm9yZHM6XG4iKTsKLSAgICAgIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQotCXsKLQkgIGlmICghZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQkgICAgZnByaW50ZiAoZiwgIlx0JXMJJWRcbiIsIEFTTV9TSE9SVCwgZXhwLT5vcmRpbmFsIC0gZF9sb3dfb3JkKTsKLQl9Ci0KLSAgICAgIGZwcmludGYoZiwiJXMgRXhwb3J0IE5hbWUgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQotCWlmICghZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQkgIGZwcmludGYgKGYsICJuJWQ6CSVzCVwiJXNcIlxuIiwKLQkJICAgZXhwLT5vcmRpbmFsLCBBU01fVEVYVCwgZXhwLT5uYW1lKTsKLQotICAgICAgaWYgKGFfbGlzdCkKLQl7Ci0JICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbiAlc1xuIiwgRFJFQ1RWRV9TRUNUSU9OX05BTUUpOwotCSAgZm9yIChkbCA9IGFfbGlzdDsgZGw7IGRsID0gZGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0XCIlc1wiXG4iLCBBU01fVEVYVCwgZGwtPnRleHQpOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBpZiAoZF9saXN0KQotCXsKLQkgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uIC5yZGF0YVxuIik7Ci0JICBmb3IgKGRsID0gZF9saXN0OyBkbDsgZGwgPSBkbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGNoYXIgKnA7Ci0JICAgICAgaW50IGw7Ci0JICAgICAgLyogV2UgZG9udCBvdXRwdXQgYXMgYXNjaWkgJ2NhdXNlIHRoZXJlIGNhbgotCSAgICAgICAgIGJlIHF1b3RlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyAqLwotCi0JICAgICAgbCA9IDA7Ci0JICAgICAgZm9yIChwID0gZGwtPnRleHQ7ICpwOyBwKyspCi0JCXsKLQkJICBpZiAobCA9PSAwKQotCQkgICAgZnByaW50ZiAoZiwgIlx0JXNcdCIsIEFTTV9CWVRFKTsKLQkJICBlbHNlCi0JCSAgICBmcHJpbnRmIChmLCAiLCIpOwotCQkgIGZwcmludGYgKGYsICIlZCIsICpwKTsKLQkJICBpZiAocFsxXSA9PSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmLCAiLDBcbiIpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpZiAoKytsID09IDEwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmLCAiXG4iKTsKLQkJICAgICAgbCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICAvKiBBZGQgdG8gdGhlIG91dHB1dCBmaWxlIGEgd2F5IG9mIGdldHRpbmcgdG8gdGhlIGV4cG9ydGVkIG5hbWVzCi0gICAgIHdpdGhvdXQgdXNpbmcgdGhlIGltcG9ydCBsaWJyYXJ5LiAqLwotICBpZiAoYWRkX2luZGlyZWN0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQucmRhdGFcbiIpOwotICAgICAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotCWlmICghZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQkgIHsKLQkgICAgLyogV2UgdXNlIGEgc2luZ2xlIHVuZGVyc2NvcmUgZm9yIE1TIGNvbXBhdGliaWxpdHksIGFuZCBhCi0gICAgICAgICAgICAgICBkb3VibGUgdW5kZXJzY29yZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZAotICAgICAgICAgICAgICAgY3lnd2luIHJlbGVhc2VzLiAgKi8KLQkgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9faW1wXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotCSAgICBmcHJpbnRmIChmLCAiXHQlc1x0X2ltcF9fJXNcbiIsIEFTTV9HTE9CQUwsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJfX2ltcF8lczpcbiIsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJfaW1wX18lczpcbiIsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJcdCVzXHQlc1xuIiwgQVNNX0xPTkcsIGV4cC0+bmFtZSk7Ci0JICB9Ci0gICAgfQotCi0gIC8qIER1bXAgdGhlIHJlbG9jIHNlY3Rpb24gaWYgYSBiYXNlIGZpbGUgaXMgcHJvdmlkZWQgKi8KLSAgaWYgKGJhc2VfZmlsZSkKLSAgICB7Ci0gICAgICBpbnQgYWRkcjsKLSAgICAgIGxvbmcgbmVlZFtQQUdFX1NJWkVdOwotICAgICAgbG9uZyBwYWdlX2FkZHI7Ci0gICAgICBpbnQgbnVtYnl0ZXM7Ci0gICAgICBpbnQgbnVtX2VudHJpZXM7Ci0gICAgICBsb25nICpjb3B5OwotICAgICAgaW50IGo7Ci0gICAgICBpbnQgb25fcGFnZTsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaW5pdFxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAibGFiOlxuIik7Ci0KLSAgICAgIGZzZWVrIChiYXNlX2ZpbGUsIDAsIFNFRUtfRU5EKTsKLSAgICAgIG51bWJ5dGVzID0gZnRlbGwgKGJhc2VfZmlsZSk7Ci0gICAgICBmc2VlayAoYmFzZV9maWxlLCAwLCBTRUVLX1NFVCk7Ci0gICAgICBjb3B5ID0geG1hbGxvYyAobnVtYnl0ZXMpOwotICAgICAgZnJlYWQgKGNvcHksIDEsIG51bWJ5dGVzLCBiYXNlX2ZpbGUpOwotICAgICAgbnVtX2VudHJpZXMgPSBudW1ieXRlcyAvIHNpemVvZiAobG9uZyk7Ci0KLQotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5yZWxvY1xuIik7Ci0gICAgICBpZiAobnVtX2VudHJpZXMpCi0JewotCSAgaW50IHNyYzsKLQkgIGludCBkc3QgPSAwOwotCSAgaW50IGxhc3QgPSAtMTsKLQkgIHFzb3J0IChjb3B5LCBudW1fZW50cmllcywgc2l6ZW9mIChsb25nKSwgc2Z1bmMpOwotCSAgLyogRGVsZXRlIGR1cGxjYXRlcyAqLwotCSAgZm9yIChzcmMgPSAwOyBzcmMgPCBudW1fZW50cmllczsgc3JjKyspCi0JICAgIHsKLQkgICAgICBpZiAobGFzdCAhPSBjb3B5W3NyY10pCi0JCWxhc3QgPSBjb3B5W2RzdCsrXSA9IGNvcHlbc3JjXTsKLQkgICAgfQotCSAgbnVtX2VudHJpZXMgPSBkc3Q7Ci0JICBhZGRyID0gY29weVswXTsKLQkgIHBhZ2VfYWRkciA9IGFkZHIgJiBQQUdFX01BU0s7CQkvKiB3b3JrIG91dCB0aGUgcGFnZSBhZGRyICovCi0JICBvbl9wYWdlID0gMDsKLQkgIGZvciAoaiA9IDA7IGogPCBudW1fZW50cmllczsgaisrKQotCSAgICB7Ci0JICAgICAgYWRkciA9IGNvcHlbal07Ci0JICAgICAgaWYgKChhZGRyICYgUEFHRV9NQVNLKSAhPSBwYWdlX2FkZHIpCi0JCXsKLQkJICBmbHVzaF9wYWdlIChmLCBuZWVkLCBwYWdlX2FkZHIsIG9uX3BhZ2UpOwotCQkgIG9uX3BhZ2UgPSAwOwotCQkgIHBhZ2VfYWRkciA9IGFkZHIgJiBQQUdFX01BU0s7Ci0JCX0KLQkgICAgICBuZWVkW29uX3BhZ2UrK10gPSBhZGRyOwotCSAgICB9Ci0JICBmbHVzaF9wYWdlIChmLCBuZWVkLCBwYWdlX2FkZHIsIG9uX3BhZ2UpOwotCi0vKgkgIGZwcmludGYgKGYsICJcdCVzXHQwLDBcdCVzIEVuZFxuIiwgQVNNX0xPTkcsIEFTTV9DKTsqLwotCX0KLSAgICB9Ci0KLSAgZ2VuZXJhdGVfaWRhdGFfb2ZpbGUgKGYpOwotCi0gIGZjbG9zZSAoZik7Ci0KLSAgLyogYXNzZW1ibGUgdGhlIGZpbGUgKi8KLSAgYXNzZW1ibGVfZmlsZSAoVE1QX0FTTSwgZXhwX25hbWUpOwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB1bmxpbmsgKFRNUF9BU00pOwotICAKLSAgaW5mb3JtIChfKCJHZW5lcmF0ZWQgZXhwb3J0cyBmaWxlIikpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi14bGF0ZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGFkZF91bmRlcnNjb3JlKQotICAgIHsKLSAgICAgIGNoYXIgKmNvcHkgPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMik7Ci0gICAgICBjb3B5WzBdID0gJ18nOwotICAgICAgc3RyY3B5IChjb3B5ICsgMSwgbmFtZSk7Ci0gICAgICBuYW1lID0gY29weTsKLSAgICB9Ci0KLSAgaWYgKGtpbGxhdCkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgcCA9IHN0cmNociAobmFtZSwgJ0AnKTsKLSAgICAgIGlmIChwKQotCSpwID0gMDsKLSAgICB9Ci0gIHJldHVybiBuYW1lOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIDAKLQotc3RhdGljIHZvaWQKLWR1bXBfaWF0IChmLCBleHApCi0gICAgIEZJTEUgKmY7Ci0gICAgIGV4cG9ydF90eXBlICpleHA7Ci17Ci0gIGlmIChleHAtPm5vbmFtZSAmJiAhc2hvd19hbGxuYW1lcyApCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JTA4eFxuIiwKLQkgICAgICAgQVNNX0xPTkcsCi0JICAgICAgIGV4cC0+b3JkaW5hbCB8IDB4ODAwMDAwMDApOyAvKiBoaW50IG9yIG9yaW5kYWwgPz8gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc0lEJWQlc1xuIiwgQVNNX1JWQV9CRUZPUkUsCi0JICAgICAgIGV4cC0+b3JkaW5hbCwKLQkgICAgICAgQVNNX1JWQV9BRlRFUik7Ci0gICAgfQotfQotCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IGlkOwotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgZmxhZ3M7Ci0gIGludCBhbGlnbjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqc3ltOwotICBhc3ltYm9sICoqc3ltcHA7Ci0gIGludCBzaXplOwotICB1bnNpZ25lZCAgIGNoYXIgKmRhdGE7Ci19IHNpbmZvOwotCi0jaWZuZGVmIERMTFRPT0xfUFBDCi0KLSNkZWZpbmUgVEVYVCAwCi0jZGVmaW5lIERBVEEgMQotI2RlZmluZSBCU1MgMgotI2RlZmluZSBJREFUQTcgMwotI2RlZmluZSBJREFUQTUgNAotI2RlZmluZSBJREFUQTQgNQotI2RlZmluZSBJREFUQTYgNgotCi0jZGVmaW5lIE5TRUNTIDcKLQotc3RhdGljIHNpbmZvIHNlY2RhdGFbTlNFQ1NdID0KLXsKLSAgeyBURVhULCAgICIudGV4dCIsICAgIFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUywgMn0sCi0gIHsgREFUQSwgICAiLmRhdGEiLCAgICBTRUNfREFUQSwgICAgICAgICAgICAgICAgICAgIDJ9LAotICB7IEJTUywgICAgIi5ic3MiLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTcsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE1LCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTYsICIuaWRhdGEkNiIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMX0KLX07Ci0KLSNlbHNlCi0KLS8qIFNlY3Rpb25zIG51bWJlcmVkIHRvIG1ha2UgdGhlIG9yZGVyIHRoZSBzYW1lIGFzIG90aGVyIFBvd2VyUEMgTlQgICAgKi8KLS8qIGNvbXBpbGVycy4gVGhpcyBhbHNvIGtlZXBzIGZ1bm55IGFsaWdubWVudCB0aGluZ2llcyBmcm9tIGhhcHBlbmluZy4gKi8KLSNkZWZpbmUgVEVYVCAgIDAKLSNkZWZpbmUgUERBVEEgIDEKLSNkZWZpbmUgUkRBVEEgIDIKLSNkZWZpbmUgSURBVEE1IDMKLSNkZWZpbmUgSURBVEE0IDQKLSNkZWZpbmUgSURBVEE2IDUKLSNkZWZpbmUgSURBVEE3IDYKLSNkZWZpbmUgREFUQSAgIDcKLSNkZWZpbmUgQlNTICAgIDgKLQotI2RlZmluZSBOU0VDUyA5Ci0KLXN0YXRpYyBzaW5mbyBzZWNkYXRhW05TRUNTXSA9Ci17Ci0gIHsgVEVYVCwgICAiLnRleHQiLCAgICBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMsIDN9LAotICB7IFBEQVRBLCAgIi5wZGF0YSIsICAgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBSREFUQSwgICIucmVsZGF0YSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE1LCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTYsICIuaWRhdGEkNiIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMX0sCi0gIHsgSURBVEE3LCAiLmlkYXRhJDciLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IERBVEEsICAgIi5kYXRhIiwgICAgU0VDX0RBVEEsICAgICAgICAgICAgICAgICAgICAyfSwKLSAgeyBCU1MsICAgICIuYnNzIiwgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMn0KLX07Ci0KLSNlbmRpZgotCi0vKgotVGhpcyBpcyB3aGF0IHdlJ3JlIHRyeWluZyB0byBtYWtlLiAgV2UgZ2VuZXJhdGUgdGhlIGltcCBzeW1ib2xzIHdpdGgKLWJvdGggc2luZ2xlIGFuZCBkb3VibGUgdW5kZXJzY29yZXMsIGZvciBjb21wYXRpYmlsaXR5LgotCi0JLnRleHQKLQkuZ2xvYmFsCV9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4Ci0JLmdsb2JhbAlfX2ltcF9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4Ci1fR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAODoKLQlqbXAgKglfX2ltcF9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4Ci0JLnNlY3Rpb24JLmlkYXRhJDcJIyBUbyBmb3JjZSBsb2FkaW5nIG9mIGhlYWQKLQkubG9uZwlfX3ZlcnNpb25fYV9oZWFkCi0jIEltcG9ydCBBZGRyZXNzIFRhYmxlCi0JLnNlY3Rpb24JLmlkYXRhJDUKLV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDg6Ci0JLnJ2YQlJRDIKLQotIyBJbXBvcnQgTG9va3VwIFRhYmxlCi0JLnNlY3Rpb24JLmlkYXRhJDQKLQkucnZhCUlEMgotIyBIaW50L05hbWUgdGFibGUKLQkuc2VjdGlvbgkuaWRhdGEkNgotSUQyOgkuc2hvcnQJMgotCS5hc2NpegkiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVciCi0KLQotRm9yIHRoZSBQb3dlclBDLCBoZXJlJ3MgdGhlIHZhcmlhdGlvbiBvbiB0aGUgYWJvdmUgc2NoZW1lOgotCi0jIFJhdGhlciB0aGFuIGEgc2ltcGxlICJqbXAgKiIsIHRoZSBjb2RlIHRvIGdldCB0byB0aGUgZGxsIGZ1bmN0aW9uCi0jIGxvb2tzIGxpa2U6Ci0gICAgICAgICAudGV4dAotICAgICAgICAgbHd6CXIxMSxbdG9jdl1fX2ltcF9mdW5jdGlvbl9uYW1lKHIyKQotIwkJICAgUkVMT0M6IDAwMDAwMDAwIFRPQ1JFTDE2LFRPQ0RFRk4gX19pbXBfZnVuY3Rpb25fbmFtZQotICAgICAgICAgbHd6CXIxMiwwKHIxMSkKLQkgc3R3CXIyLDQocjEpCi0JIG10Y3RyCXIxMgotCSBsd3oJcjIsNChyMTEpCi0JIGJjdHIKLSovCi0KLXN0YXRpYyBjaGFyICoKLW1ha2VfbGFiZWwgKHByZWZpeCwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcHJlZml4OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbGVuID0gc3RybGVuIChBU01fUFJFRklYKSArIHN0cmxlbiAocHJlZml4KSArIHN0cmxlbiAobmFtZSk7Ci0gIGNoYXIgKmNvcHkgPSB4bWFsbG9jIChsZW4gKzEgKTsKLSAgc3RyY3B5IChjb3B5LCBBU01fUFJFRklYKTsKLSAgc3RyY2F0IChjb3B5LCBwcmVmaXgpOwotICBzdHJjYXQgKGNvcHksIG5hbWUpOwotICByZXR1cm4gY29weTsKLX0KLQotc3RhdGljIGJmZCAqCi1tYWtlX29uZV9saWJfZmlsZSAoZXhwLCBpKQotICAgICBleHBvcnRfdHlwZSAqZXhwOwotICAgICBpbnQgaTsKLXsKLSNpZiAwCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIEZJTEUgKmY7Ci0gICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiZCI7Ci0gICAgICBjaGFyICpkZXN0OwotCi0gICAgICBuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHByZWZpeCkgKyAxMCk7Ci0gICAgICBzcHJpbnRmIChuYW1lLCAiJXNzJTA1ZC5zIiwgcHJlZml4LCBpKTsKLSAgICAgIGYgPSBmb3BlbiAobmFtZSwgRk9QRU5fV1QpOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnRleHRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVzJXNcbiIsIEFTTV9HTE9CQUwsIEFTTV9QUkVGSVgsIGV4cC0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0X19pbXBfJXNcbiIsIEFTTV9HTE9CQUwsIGV4cC0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0X2ltcF9fJXNcbiIsIEFTTV9HTE9CQUwsIGV4cC0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChmLCAiJXMlczpcblx0JXNcdF9faW1wXyVzXG4iLCBBU01fUFJFRklYLAotCSAgICAgICBleHAtPm5hbWUsIEFTTV9KVU1QLCBleHAtPm5hbWUpOwotCi0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmlkYXRhJDdcdCVzIFRvIGZvcmNlIGxvYWRpbmcgb2YgaGVhZFxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVzXG4iLCBBU01fTE9ORywgaGVhZF9sYWJlbCk7Ci0KLQotICAgICAgZnByaW50ZiAoZiwiJXMgSW1wb3J0IEFkZHJlc3MgVGFibGVcbiIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDVcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIl9faW1wXyVzOlxuIiwgZXhwLT5uYW1lKTsKLSAgICAgIGZwcmludGYgKGYsICJfaW1wX18lczpcbiIsIGV4cC0+bmFtZSk7Ci0KLSAgICAgIGR1bXBfaWF0IChmLCBleHApOwotCi0gICAgICBmcHJpbnRmIChmLCAiXG4lcyBJbXBvcnQgTG9va3VwIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNFxuIik7Ci0KLSAgICAgIGR1bXBfaWF0IChmLCBleHApOwotCi0gICAgICBpZighZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQl7Ci0JICBmcHJpbnRmIChmLCAiJXMgSGludC9OYW1lIHRhYmxlXG4iLCBBU01fQyk7Ci0JICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNlxuIik7Ci0JICBmcHJpbnRmIChmLCAiSUQlZDpcdCVzXHQlZFxuIiwgZXhwLT5vcmRpbmFsLCBBU01fU0hPUlQsIGV4cC0+aGludCk7Ci0JICBmcHJpbnRmIChmLCAiXHQlc1x0XCIlc1wiXG4iLCBBU01fVEVYVCwgeGxhdGUgKGV4cC0+bmFtZSkpOwotCX0KLQotICAgICAgZmNsb3NlIChmKTsKLQotICAgICAgZGVzdCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChwcmVmaXgpICsgMTApOwotICAgICAgc3ByaW50ZiAoZGVzdCwgIiVzcyUwNWQubyIsIHByZWZpeCwgaSk7Ci0gICAgICBhc3NlbWJsZV9maWxlIChuYW1lLCBkZXN0KTsKLSAgICB9Ci0jZWxzZSAvKiBpZiAwICovCi0gICAgewotICAgICAgYmZkICogICAgICBhYmZkOwotICAgICAgYXN5bWJvbCAqICBleHBfbGFiZWw7Ci0gICAgICBhc3ltYm9sICogIGluYW1lOwotICAgICAgYXN5bWJvbCAqICBpbmFtZTI7Ci0gICAgICBhc3ltYm9sICogIGluYW1lX2xhYjsKLSAgICAgIGFzeW1ib2wgKiogaW5hbWVfbGFiX3BwOwotICAgICAgYXN5bWJvbCAqKiBpbmFtZV9wcDsKLSNpZmRlZiBETExUT09MX1BQQwotICAgICAgYXN5bWJvbCAqKiBmbl9wcDsKLSAgICAgIGFzeW1ib2wgKiogdG9jX3BwOwotI2RlZmluZSBFWFRSQQkgMgotI2VuZGlmCi0jaWZuZGVmIEVYVFJBCi0jZGVmaW5lIEVYVFJBICAgIDAKLSNlbmRpZgotICAgICAgYXN5bWJvbCAqICBwdHJzW05TRUNTICsgNCArIEVYVFJBICsgMV07Ci0KLSAgICAgIGNoYXIgKiAgICAgb3V0bmFtZSA9IHhtYWxsb2MgKDEwKTsKLSAgICAgIGludCAgICAgICAgb2lkeCA9IDA7Ci0KLSAgICAgIAotICAgICAgc3ByaW50ZiAob3V0bmFtZSwgIiVzJTA1ZC5vIiwgVE1QX1NUVUIsIGkpOwotICAgICAgCi0gICAgICBhYmZkID0gYmZkX29wZW53IChvdXRuYW1lLCBIT1dfQkZEX1dSSVRFX1RBUkdFVCk7Ci0gICAgICAKLSAgICAgIGlmICghYWJmZCkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWZhdGFsIChfKCJiZmRfb3BlbiBmYWlsZWQgb3BlbiBzdHViIGZpbGU6ICVzIiksIG91dG5hbWUpOwotCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgaW5mb3JtIChfKCJDcmVhdGluZyBzdHViIGZpbGU6ICVzIiksIG91dG5hbWUpOwotICAgICAgCi0gICAgICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gICAgICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgSE9XX0JGRF9BUkNILCAwKTsKLQotI2lmZGVmIERMTFRPT0xfQVJNCi0gICAgICBpZiAobWFjaGluZSA9PSBNQVJNX0lOVEVSV09SSyB8fCBtYWNoaW5lID09IE1USFVNQikKLQliZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIEZfSU5URVJXT1JLKTsKLSNlbmRpZgotICAgICAgCi0gICAgICAvKiBGaXJzdCBtYWtlIHN5bWJvbHMgZm9yIHRoZSBzZWN0aW9ucyAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IE5TRUNTOyBpKyspCi0JewotCSAgc2luZm8gKnNpID0gc2VjZGF0YSArIGk7Ci0JICBpZiAoc2ktPmlkICE9IGkpCi0JICAgIGFib3J0KCk7Ci0JICBzaS0+c2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBzaS0+bmFtZSk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJIHNpLT5zZWMsCi0JCQkJIHNpLT5mbGFncyk7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYWJmZCwgc2ktPnNlYywgc2ktPmFsaWduKTsKLQkgIHNpLT5zZWMtPm91dHB1dF9zZWN0aW9uID0gc2ktPnNlYzsKLQkgIHNpLT5zeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0JICBzaS0+c3ltLT5uYW1lID0gc2ktPnNlYy0+bmFtZTsKLQkgIHNpLT5zeW0tPnNlY3Rpb24gPSBzaS0+c2VjOwotCSAgc2ktPnN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JICBzaS0+c3ltLT52YWx1ZSA9IDA7Ci0JICBwdHJzW29pZHhdID0gc2ktPnN5bTsKLQkgIHNpLT5zeW1wcCA9IHB0cnMgKyBvaWR4OwotCSAgc2ktPnNpemUgPSAwOwotCSAgc2ktPmRhdGEgPSBOVUxMOwotCi0JICBvaWR4Kys7Ci0JfQotCi0gICAgICBpZiAoISBleHAtPmRhdGEpCi0JewotCSAgZXhwX2xhYmVsID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLQkgIGV4cF9sYWJlbC0+bmFtZSA9IG1ha2VfbGFiZWwgKCIiLCBleHAtPm5hbWUpOwotCi0JICAvKiBPbiBQb3dlclBDLCB0aGUgZnVuY3Rpb24gbmFtZSBwb2ludHMgdG8gYSBkZXNjcmlwdG9yIGluCi0JICAgICB0aGUgcmRhdGEgc2VjdGlvbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2Ygd2hpY2ggaXMgYQotCSAgICAgcG9pbnRlciB0byB0aGUgY29kZSAoLi5mdW5jdGlvbl9uYW1lKSwgYW5kIHRoZSBzZWNvbmQKLQkgICAgIHBvaW50cyB0byB0aGUgLnRvYyAqLwotI2lmZGVmIERMTFRPT0xfUFBDCi0JICBpZiAobWFjaGluZSA9PSBNUFBDKQotCSAgICBleHBfbGFiZWwtPnNlY3Rpb24gPSBzZWNkYXRhW1JEQVRBXS5zZWM7Ci0JICBlbHNlCi0jZW5kaWYKLQkgICAgZXhwX2xhYmVsLT5zZWN0aW9uID0gc2VjZGF0YVtURVhUXS5zZWM7Ci0KLQkgIGV4cF9sYWJlbC0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgZXhwX2xhYmVsLT52YWx1ZSA9IDA7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotCSAgaWYgKG1hY2hpbmUgPT0gTVRIVU1CKQotCSAgICBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzIChhYmZkLCBleHBfbGFiZWwsIENfVEhVTUJFWFRGVU5DKTsKLSNlbmRpZgotCSAgcHRyc1tvaWR4KytdID0gZXhwX2xhYmVsOwotCX0KLQotICAgICAgLyogR2VuZXJhdGUgaW1wIHN5bWJvbHMgd2l0aCBvbmUgdW5kZXJzY29yZSBmb3IgTWljcm9zb2Z0Ci0gICAgICAgICBjb21wYXRpYmlsaXR5LCBhbmQgd2l0aCB0d28gdW5kZXJzY29yZXMgZm9yIGJhY2t3YXJkCi0gICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb25zIG9mIGN5Z3dpbi4gICovCi0gICAgICBpbmFtZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLSAgICAgIGluYW1lLT5uYW1lID0gbWFrZV9sYWJlbCAoIl9faW1wXyIsIGV4cC0+bmFtZSk7Ci0gICAgICBpbmFtZS0+c2VjdGlvbiA9IHNlY2RhdGFbSURBVEE1XS5zZWM7Ci0gICAgICBpbmFtZS0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICAgICAgaW5hbWUtPnZhbHVlID0gMDsKLQotICAgICAgaW5hbWUyID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotICAgICAgaW5hbWUyLT5uYW1lID0gbWFrZV9sYWJlbCAoIl9pbXBfXyIsIGV4cC0+bmFtZSk7Ci0gICAgICBpbmFtZTItPnNlY3Rpb24gPSBzZWNkYXRhW0lEQVRBNV0uc2VjOwotICAgICAgaW5hbWUyLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBpbmFtZTItPnZhbHVlID0gMDsKLQotICAgICAgaW5hbWVfbGFiID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotCi0gICAgICBpbmFtZV9sYWItPm5hbWUgPSBoZWFkX2xhYmVsOwotICAgICAgaW5hbWVfbGFiLT5zZWN0aW9uID0gKGFzZWN0aW9uICopJmJmZF91bmRfc2VjdGlvbjsKLSAgICAgIGluYW1lX2xhYi0+ZmxhZ3MgPSAwOwotICAgICAgaW5hbWVfbGFiLT52YWx1ZSA9IDA7Ci0KLQotICAgICAgaW5hbWVfcHAgPSBwdHJzICsgb2lkeDsKLSAgICAgIHB0cnNbb2lkeCsrXSA9IGluYW1lOwotICAgICAgcHRyc1tvaWR4KytdID0gaW5hbWUyOwotCi0gICAgICBpbmFtZV9sYWJfcHAgPSBwdHJzICsgb2lkeDsKLSAgICAgIHB0cnNbb2lkeCsrXSA9IGluYW1lX2xhYjsKLQotI2lmZGVmIERMTFRPT0xfUFBDCi0gICAgICAvKiBUaGUgc3ltYm9sIHJlZmVyaW5nIHRvIHRoZSBjb2RlICgudGV4dCkgKi8KLSAgICAgIHsKLQlhc3ltYm9sICpmdW5jdGlvbl9uYW1lOwotCi0JZnVuY3Rpb25fbmFtZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLQlmdW5jdGlvbl9uYW1lLT5uYW1lID0gbWFrZV9sYWJlbCAoIi4uIiwgZXhwLT5uYW1lKTsKLQlmdW5jdGlvbl9uYW1lLT5zZWN0aW9uID0gc2VjZGF0YVtURVhUXS5zZWM7Ci0JZnVuY3Rpb25fbmFtZS0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCWZ1bmN0aW9uX25hbWUtPnZhbHVlID0gMDsKLQotCWZuX3BwID0gcHRycyArIG9pZHg7Ci0JcHRyc1tvaWR4KytdID0gZnVuY3Rpb25fbmFtZTsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIC50b2Mgc3ltYm9sICovCi0gICAgICB7Ci0JYXN5bWJvbCAqdG9jX3N5bWJvbDsgICAgLyogVGhlIC50b2Mgc3ltYm9sICovCi0KLQl0b2Nfc3ltYm9sID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLQl0b2Nfc3ltYm9sLT5uYW1lID0gbWFrZV9sYWJlbCAoIi4iLCAidG9jIik7Ci0JdG9jX3N5bWJvbC0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSZiZmRfdW5kX3NlY3Rpb247Ci0JdG9jX3N5bWJvbC0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCXRvY19zeW1ib2wtPnZhbHVlID0gMDsKLQotCXRvY19wcCA9IHB0cnMgKyBvaWR4OwotCXB0cnNbb2lkeCsrXSA9IHRvY19zeW1ib2w7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIAotICAgICAgcHRyc1tvaWR4XSA9IDA7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCXsKLQkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCSAgYXNlY3Rpb24gKnNlYyA9IHNpLT5zZWM7Ci0JICBhcmVsZW50ICpyZWw7Ci0JICBhcmVsZW50ICoqcnBwOwotCi0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSBURVhUOgotCSAgICAgIGlmICghIGV4cC0+ZGF0YSkKLQkJewotCQkgIHNpLT5zaXplID0gSE9XX0pUQUJfU0laRTsKLQkJICBzaS0+ZGF0YSA9IHhtYWxsb2MgKEhPV19KVEFCX1NJWkUpOwotCQkgIG1lbWNweSAoc2ktPmRhdGEsIEhPV19KVEFCLCBIT1dfSlRBQl9TSVpFKTsKLQotCQkgIC8qIGFkZCB0aGUgcmVsb2MgaW50byBpZGF0YSQ1ICovCi0JCSAgcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCSAgCi0JCSAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMik7Ci0JCSAgcnBwWzBdID0gcmVsOwotCQkgIHJwcFsxXSA9IDA7Ci0JCSAgCi0JCSAgcmVsLT5hZGRyZXNzID0gSE9XX0pUQUJfUk9GRjsKLQkJICByZWwtPmFkZGVuZCA9IDA7Ci0KLQkJICBpZiAobWFjaGluZSA9PSBNUFBDKQotCQkgICAgewotCQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLAotCQkJCQkJCSAgQkZEX1JFTE9DXzE2X0dPVE9GRik7Ci0JCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBpbmFtZV9wcDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBzZWNkYXRhW0lEQVRBNV0uc3ltcHA7Ci0JCSAgICB9Ci0JCSAgc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkJICBzZWMtPnJlbG9jX2NvdW50ID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElEQVRBNDoKLQkgICAgY2FzZSBJREFUQTU6Ci0JICAgICAgLyogQW4gaWRhdGEkNCBvciBpZGF0YSQ1IGlzIG9uZSB3b3JkIGxvbmcsIGFuZCBoYXMgYW4KLQkJIHJ2YSB0byBpZGF0YSQ2ICovCi0KLQkgICAgICBzaS0+ZGF0YSA9IHhtYWxsb2MgKDQpOwotCSAgICAgIHNpLT5zaXplID0gNDsKLQotCSAgICAgIGlmIChleHAtPm5vbmFtZSkKLQkJewotCQkgIHNpLT5kYXRhWzBdID0gZXhwLT5vcmRpbmFsIDsKLQkJICBzaS0+ZGF0YVsxXSA9IGV4cC0+b3JkaW5hbCA+PiA4OwotCQkgIHNpLT5kYXRhWzJdID0gZXhwLT5vcmRpbmFsID4+IDE2OwotCQkgIHNpLT5kYXRhWzNdID0gMHg4MDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNlYy0+cmVsb2NfY291bnQgPSAxOwotCQkgIG1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKLQkJICByZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJICBycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiAyKTsKLQkJICBycHBbMF0gPSByZWw7Ci0JCSAgcnBwWzFdID0gMDsKLQkJICByZWwtPmFkZHJlc3MgPSAwOwotCQkgIHJlbC0+YWRkZW5kID0gMDsKLQkJICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfUlZBKTsKLQkJICByZWwtPnN5bV9wdHJfcHRyID0gc2VjZGF0YVtJREFUQTZdLnN5bXBwOwotCQkgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgSURBVEE2OgotCSAgICAgIGlmICghZXhwLT5ub25hbWUpCi0JCXsKLQkJICAvKiBUaGlzIHVzZWQgdG8gYWRkIDEgdG8gZXhwLT5oaW50LiAgSSBkb24ndCBrbm93Ci0gICAgICAgICAgICAgICAgICAgICB3aHkgaXQgZGlkIHRoYXQsIGFuZCBpdCBkb2VzIG5vdCBtYXRjaCB3aGF0IEkgc2VlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwcm9ncmFtcyBjb21waWxlZCB3aXRoIHRoZSBNUyB0b29scy4gICovCi0JCSAgaW50IGlkeCA9IGV4cC0+aGludDsKLQkJICBzaS0+c2l6ZSA9IHN0cmxlbiAoeGxhdGUgKGV4cC0+bmFtZSkpICsgMzsKLQkJICBzaS0+ZGF0YSA9IHhtYWxsb2MgKHNpLT5zaXplKTsKLQkJICBzaS0+ZGF0YVswXSA9IGlkeCAmIDB4ZmY7Ci0JCSAgc2ktPmRhdGFbMV0gPSBpZHggPj4gODsKLQkJICBzdHJjcHkgKHNpLT5kYXRhICsgMiwgeGxhdGUgKGV4cC0+bmFtZSkpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSURBVEE3OgotCSAgICAgIHNpLT5zaXplID0gNDsKLQkgICAgICBzaS0+ZGF0YSA9eG1hbGxvYyg0KTsKLQkgICAgICBtZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7Ci0JICAgICAgcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JICAgICAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMik7Ci0JICAgICAgcnBwWzBdID0gcmVsOwotCSAgICAgIHJlbC0+YWRkcmVzcyA9IDA7Ci0JICAgICAgcmVsLT5hZGRlbmQgPSAwOwotCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ19SVkEpOwotCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBpbmFtZV9sYWJfcHA7Ci0JICAgICAgc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkgICAgICBzZWMtPnJlbG9jX2NvdW50ID0gMTsKLQkgICAgICBicmVhazsKLQotI2lmZGVmIERMTFRPT0xfUFBDCi0JICAgIGNhc2UgUERBVEE6Ci0JICAgICAgewotCQkvKiBUaGUgLnBkYXRhIHNlY3Rpb24gaXMgNSB3b3JkcyBsb25nLiAqLwotCQkvKiBUaGluayBvZiBpdCBhczogICAgICAgICAgICAgICAgICAgICAqLwotCQkvKiBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkvKiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkvKiAgIGJmZF92bWEgQmVnaW5BZGRyZXNzLCAgICAgWzB4MDBdICAqLwotCQkvKiAgICAgICAgICAgRW5kQWRkcmVzcywgICAgICAgWzB4MDRdICAqLwotCQkvKgkgICAgIEV4Y2VwdGlvbkhhbmRsZXIsIFsweDA4XSAgKi8KLQkJLyoJICAgICBIYW5kbGVyRGF0YSwgICAgICBbMHgwY10gICovCi0JCS8qCSAgICAgUHJvbG9nRW5kQWRkcmVzczsgWzB4MTBdICAqLwotCQkvKiB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0JCS8qIFNvIHRoaXMgcGRhdGEgc2VjdGlvbiBzZXR1cHMgdXAgdGhpcyBhcyBhIGdsdWUgbGlua2FnZSB0bwotCQkgICBhIGRsbCByb3V0aW5lLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgaG91c2Uga2VlcGluZyB0aGluZ3MKLQkJICAgd2UgbmVlZCB0byBkbzoKLQotCQkgICAxLiBJbiB0aGUgbmFtZSBvZiBnbHVlIHRyaWNrZXJ5LCB0aGUgQUREUjMyIHJlbG9jcyBmb3IgMCwKLQkJICAgICAgNCwgYW5kIDB4MTAgYXJlIHNldCB0byBwb2ludCB0byB0aGUgc2FtZSBwbGFjZToKLQkJICAgICAgIi4uZnVuY3Rpb25fbmFtZSIuCi0JCSAgIDIuIFRoZXJlIGlzIG9uZSBtb3JlIHJlbG9jIG5lZWRlZCBpbiB0aGUgcGRhdGEgc2VjdGlvbi4KLQkJICAgICAgVGhlIGFjdHVhbCBnbHVlIGluc3RydWN0aW9uIHRvIHJlc3RvcmUgdGhlIHRvYyBvbgotCQkgICAgICByZXR1cm4gaXMgc2F2ZWQgYXMgdGhlIG9mZnNldCBpbiBhbiBJTUdMVUUgcmVsb2MuCi0JCSAgICAgIFNvIHdlIG5lZWQgYSB0b3RhbCBvZiBmb3VyIHJlbG9jcyBmb3IgdGhpcyBzZWN0aW9uLgotCi0JCSAgIDMuIExhc3RseSwgdGhlIEhhbmRsZXJEYXRhIGZpZWxkIGlzIHNldCB0byAweDAzLCB0byBpbmRpY2F0ZQotCQkgICAgICB0aGF0IHRoaXMgaXMgYSBnbHVlIHJvdXRpbmUuCi0JCSovCi0JCWFyZWxlbnQgKmltZ2x1ZSwgKmJhX3JlbCwgKmVhX3JlbCwgKnBlYV9yZWw7Ci0KLQkJLyogYWxpZ25tZW50IG11c3QgYmUgc2V0IHRvIDIqKjIgb3IgeW91IGdldCBleHRyYSBzdHVmZiAqLwotCQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGFiZmQsIHNlYywgMik7Ci0KLQkJc2ktPnNpemUgPSA0ICogNTsKLQkJc2ktPmRhdGEgPXhtYWxsb2MoNCAqIDUpOwotCQltZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7Ci0JCXJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDUpOwotCQlycHBbMF0gPSBpbWdsdWUgID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCXJwcFsxXSA9IGJhX3JlbCAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJcnBwWzJdID0gZWFfcmVsICA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQlycHBbM10gPSBwZWFfcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCXJwcFs0XSA9IDA7Ci0KLQkJLyogc3RpY2sgdGhlIHRvYyByZWxvYWQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGdsdWUgcmVsb2MgKi8KLQkJYmZkX3B1dF8zMihhYmZkLCBwcGNfZ2x1ZV9pbnNuLCAoY2hhciAqKSAmaW1nbHVlLT5hZGRyZXNzKTsKLQotCQlpbWdsdWUtPmFkZGVuZCA9IDA7Ci0JCWltZ2x1ZS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsCi0JCQkJCQkgICAgICAgQkZEX1JFTE9DXzMyX0dPVE9GRik7Ci0JCWltZ2x1ZS0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCQliYV9yZWwtPmFkZHJlc3MgPSAwOwotCQliYV9yZWwtPmFkZGVuZCA9IDA7Ci0JCWJhX3JlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JCWJhX3JlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCQliZmRfcHV0XzMyKGFiZmQsIDB4MTgsIHNpLT5kYXRhICsgMHgwNCk7Ci0JCWVhX3JlbC0+YWRkcmVzcyA9IDQ7Ci0JCWVhX3JlbC0+YWRkZW5kID0gMDsKLQkJZWFfcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJZWFfcmVsLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JCS8qIG1hcmsgaXQgYXMgZ2x1ZSAqLwotCQliZmRfcHV0XzMyKGFiZmQsIDB4MDMsIHNpLT5kYXRhICsgMHgwYyk7Ci0KLQkJLyogbWFyayB0aGUgcHJvbG9nIGVuZCBhZGRyZXNzICovCi0JCWJmZF9wdXRfMzIoYWJmZCwgMHgwRCwgc2ktPmRhdGEgKyAweDEwKTsKLQkJcGVhX3JlbC0+YWRkcmVzcyA9IDB4MTA7Ci0JCXBlYV9yZWwtPmFkZGVuZCA9IDA7Ci0JCXBlYV9yZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCQlwZWFfcmVsLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JCXNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JCXNlYy0+cmVsb2NfY291bnQgPSA0OwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGNhc2UgUkRBVEE6Ci0JICAgICAgLyogRWFjaCBleHRlcm5hbCBmdW5jdGlvbiBpbiBhIFBvd2VyUEMgUEUgZmlsZSBoYXMgYSB0d28gd29yZAotCQkgZGVzY3JpcHRvciBjb25zaXN0aW5nIG9mOgotCQkgMS4gVGhlIGFkZHJlc3Mgb2YgdGhlIGNvZGUuCi0JCSAyLiBUaGUgYWRkcmVzcyBvZiB0aGUgYXBwcm9wcmlhdGUgLnRvYwotCSAgICAgICAgIFdlIHVzZSByZWxvY3MgdG8gYnVpbGQgdGhpcy4KLQkgICAgICAqLwotCi0JICAgICAgc2ktPnNpemUgPSA4OwotCSAgICAgIHNpLT5kYXRhID0geG1hbGxvYyAoOCk7Ci0JICAgICAgbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOwotCi0JICAgICAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMyk7Ci0JICAgICAgcnBwWzBdID0gcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JICAgICAgcnBwWzFdID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JICAgICAgcnBwWzJdID0gMDsKLQotCSAgICAgIHJlbC0+YWRkcmVzcyA9IDA7Ci0JICAgICAgcmVsLT5hZGRlbmQgPSAwOwotCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JICAgICAgcmVsID0gcnBwWzFdOwotCi0JICAgICAgcmVsLT5hZGRyZXNzID0gNDsKLQkgICAgICByZWwtPmFkZGVuZCA9IDA7Ci0JICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gdG9jX3BwOwotCi0JICAgICAgc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkgICAgICBzZWMtPnJlbG9jX2NvdW50ID0gMjsKLQkgICAgICBicmVhazsKLSNlbmRpZiAvKiBETExUT09MX1BQQyAqLwotCSAgICB9Ci0JfQotCi0gICAgICB7Ci0JYmZkX3ZtYSB2bWEgPSAwOwotCS8qIFNpemUgdXAgYWxsIHRoZSBzZWN0aW9ucyAqLwotCWZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCSAgewotCSAgICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKLQotCSAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2ktPnNlYywgc2ktPnNpemUpOwotCSAgICBiZmRfc2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzaS0+c2VjLCB2bWEpOwotCi0vKgkgICAgdm1hICs9IHNpLT5zaXplOyovCi0JICB9Ci0gICAgICB9Ci0gICAgICAvKiBXcml0ZSB0aGVtIG91dCAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IE5TRUNTOyBpKyspCi0JewotCSAgc2luZm8gKnNpID0gc2VjZGF0YSArIGk7Ci0KLQkgIGlmIChpID09IElEQVRBNSAmJiBub19pZGF0YTUpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoaSA9PSBJREFUQTQgJiYgbm9faWRhdGE0KQotCSAgICBjb250aW51ZTsKLQotCSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzaS0+c2VjLAotCQkJCSAgICBzaS0+ZGF0YSwgMCwKLQkJCQkgICAgc2ktPnNpemUpOwotCX0KLQotICAgICAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHB0cnMsIG9pZHgpOwotICAgICAgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIGFiZmQgPSBiZmRfb3BlbnIgKG91dG5hbWUsIEhPV19CRkRfUkVBRF9UQVJHRVQpOwotICAgICAgcmV0dXJuIGFiZmQ7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBiZmQgKgotbWFrZV9oZWFkICgpCi17Ci0gIEZJTEUgKmYgPSBmb3BlbiAoVE1QX0hFQURfUywgRk9QRU5fV1QpOwotCi0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgZmF0YWwgKF8oImZhaWxlZCB0byBvcGVuIHRlbXBvcmFyeSBoZWFkIGZpbGU6ICVzIiksIFRNUF9IRUFEX1MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgZnByaW50ZiAoZiwgIiVzIElNQUdFX0lNUE9SVF9ERVNDUklQVE9SXG4iLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQyXG4iKTsKLQotICBmcHJpbnRmKGYsIlx0JXNcdCVzXG4iLCBBU01fR0xPQkFMLGhlYWRfbGFiZWwpOwotCi0gIGZwcmludGYgKGYsICIlczpcbiIsIGhlYWRfbGFiZWwpOwotCi0gIGZwcmludGYgKGYsICJcdCVzaG5hbWUlc1x0JXNQdHIgdG8gaW1hZ2UgaW1wb3J0IGJ5IG5hbWUgbGlzdFxuIiwKLQkgICBBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotCi0gIGZwcmludGYgKGYsICJcdCVzdGhpcyBzaG91bGQgYmUgdGhlIHRpbWVzdGFtcCwgYnV0IE5UIHNvbWV0aW1lc1xuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc2RvZXNuJ3QgbG9hZCBETExzIHdoZW4gdGhpcyBpcyBzZXQuXG4iLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXHQlcyBsb2FkZWQgdGltZVxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNcdDBcdCVzIEZvcndhcmRlciBjaGFpblxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNfXyVzX2luYW1lJXNcdCVzIGltcG9ydGVkIGRsbCdzIG5hbWVcbiIsCi0JICAgQVNNX1JWQV9CRUZPUkUsCi0JICAgaW1wX25hbWVfbGFiLAotCSAgIEFTTV9SVkFfQUZURVIsCi0JICAgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc2Z0aHVuayVzXHQlcyBwb2ludGVyIHRvIGZpcnN0dGh1bmtcbiIsCi0JICAgQVNNX1JWQV9CRUZPUkUsCi0JICAgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotCi0gIGZwcmludGYgKGYsICIlc1N0dWZmIGZvciBjb21wYXRpYmlsaXR5XG4iLCBBU01fQyk7Ci0KLSAgaWYgKCFub19pZGF0YTUpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pZGF0YSQ1XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gICAgICBmcHJpbnRmIChmLCAiZnRodW5rOlxuIik7Ci0gICAgfQotICAKLSAgaWYgKCFub19pZGF0YTQpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pZGF0YSQ0XG4iKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ0XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJobmFtZTpcbiIpOwotICAgIH0KLSAgCi0gIGZjbG9zZSAoZik7Ci0KLSAgYXNzZW1ibGVfZmlsZSAoVE1QX0hFQURfUywgVE1QX0hFQURfTyk7Ci0KLSAgcmV0dXJuIGJmZF9vcGVuciAoVE1QX0hFQURfTywgSE9XX0JGRF9SRUFEX1RBUkdFVCk7Ci19Ci0KLXN0YXRpYyBiZmQgKgotbWFrZV90YWlsICgpCi17Ci0gIEZJTEUgKmYgPSBmb3BlbiAoVE1QX1RBSUxfUywgRk9QRU5fV1QpOwotCi0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgZmF0YWwgKF8oImZhaWxlZCB0byBvcGVuIHRlbXBvcmFyeSB0YWlsIGZpbGU6ICVzIiksIFRNUF9UQUlMX1MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKCFub19pZGF0YTQpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICB9Ci0gIAotICBpZiAoIW5vX2lkYXRhNSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNVxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgIH0KLQotI2lmZGVmIERMTFRPT0xfUFBDCi0gIC8qIE5vcm1hbGx5LCB3ZSBuZWVkIHRvIHNlZSBhIG51bGwgZGVzY3JpcHRvciBidWlsdCBpbiBpZGF0YSQzIHRvCi0gICAgIGFjdCBhcyB0aGUgdGVybWluYXRvciBmb3IgdGhlIGxpc3QuIFRoZSBpZGVhbCB3YXksIEkgc3VwcG9zZSwKLSAgICAgd291bGQgYmUgdG8gbWFyayB0aGlzIHNlY3Rpb24gYXMgYSBjb21kYXQgdHlwZSAyIHNlY3Rpb24sIHNvCi0gICAgIG9ubHkgb25lIHdvdWxkIGFwcGVhciBpbiB0aGUgZmluYWwgLmV4ZSAoaWYgb3VyIGxpbmtlciBzdXBwb3J0ZWQKLSAgICAgY29tZGF0LCB0aGF0IGlzKSBvciBjYXVzZSBpdCB0byBiZSBpbnNlcnRlZCBieSBzb21ldGhpbmcgZWxzZSAoc2F5Ci0gICAgIGNydDApCi0gICovCi0KLSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDNcbiIpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX1BQQwotICAvKiBPdGhlciBQb3dlclBDIE5UIGNvbXBpbGVycyB1c2UgaWRhdGEkNiBmb3IgdGhlIGRsbG5hbWUsIHNvIEkKLSAgICAgZG8gdG9vLiBPcmlnaW5hbCwgaHVoPyAqLwotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNlxuIik7Ci0jZWxzZQotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkN1xuIik7Ci0jZW5kaWYKLQotICBmcHJpbnRmIChmLCAiXHQlc1x0X18lc19pbmFtZVxuIiwgQVNNX0dMT0JBTCwgaW1wX25hbWVfbGFiKTsKLSAgZnByaW50ZiAoZiwgIl9fJXNfaW5hbWU6XHQlc1x0XCIlc1wiXG4iLAotCSAgIGltcF9uYW1lX2xhYiwgQVNNX1RFWFQsIGRsbF9uYW1lKTsKLQotICBmY2xvc2UgKGYpOwotCi0gIGFzc2VtYmxlX2ZpbGUgKFRNUF9UQUlMX1MsIFRNUF9UQUlMX08pOwotICAKLSAgcmV0dXJuICBiZmRfb3BlbnIgKFRNUF9UQUlMX08sIEhPV19CRkRfUkVBRF9UQVJHRVQpOwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2xpYl9maWxlICgpCi17Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotICBiZmQgKmFyX2hlYWQ7Ci0gIGJmZCAqYXJfdGFpbDsKLSAgYmZkICpvdXRhcmNoOwotICBiZmQgKiBoZWFkICA9IDA7Ci0KLSAgdW5saW5rIChpbXBfbmFtZSk7Ci0KLSAgb3V0YXJjaCA9IGJmZF9vcGVudyAoaW1wX25hbWUsIEhPV19CRkRfV1JJVEVfVEFSR0VUKTsKLQotICBpZiAoIW91dGFyY2gpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiQ2FuJ3Qgb3BlbiAubGliIGZpbGU6ICVzIiksIGltcF9uYW1lKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIpLCBpbXBfbmFtZSk7Ci0gIAotICBiZmRfc2V0X2Zvcm1hdCAob3V0YXJjaCwgYmZkX2FyY2hpdmUpOwotICBvdXRhcmNoLT5oYXNfYXJtYXAgPSAxOwotCi0gIC8qIFdvcmsgb3V0IGEgcmVhc29uYWJsZSBzaXplIG9mIHRoaW5ncyB0byBwdXQgb250byBvbmUgbGluZS4gKi8KLQotICBhcl9oZWFkID0gbWFrZV9oZWFkICgpOwotICBhcl90YWlsID0gbWFrZV90YWlsKCk7Ci0KLSAgaWYgKGFyX2hlYWQgPT0gTlVMTCB8fCBhcl90YWlsID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCi0gICAgewotICAgICAgYmZkICpuID0gbWFrZV9vbmVfbGliX2ZpbGUgKGV4cCwgaSk7Ci0gICAgICBuLT5uZXh0ID0gaGVhZDsKLSAgICAgIGhlYWQgPSBuOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlbSBhbGwgaW50byB0aGUgYXJjaGl2ZSAqLwotCi0gIGFyX2hlYWQtPm5leHQgPSBoZWFkOwotICBhcl90YWlsLT5uZXh0ID0gYXJfaGVhZDsKLSAgaGVhZCA9IGFyX3RhaWw7Ci0KLSAgaWYgKCEgYmZkX3NldF9hcmNoaXZlX2hlYWQgKG91dGFyY2gsIGhlYWQpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfYXJjaGl2ZV9oZWFkIik7Ci0gIAotICBpZiAoISBiZmRfY2xvc2UgKG91dGFyY2gpKQotICAgIGJmZF9mYXRhbCAoaW1wX25hbWUpOwotCi0gIHdoaWxlIChoZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuID0gaGVhZC0+bmV4dDsKLSAgICAgIGJmZF9jbG9zZSAoaGVhZCk7Ci0gICAgICBoZWFkID0gbjsKLSAgICB9Ci0KLSAgLyogRGVsZXRlIGFsbCB0aGUgdGVtcCBmaWxlcyAqLwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB7Ci0gICAgICB1bmxpbmsgKFRNUF9IRUFEX08pOwotICAgICAgdW5saW5rIChUTVBfSEVBRF9TKTsKLSAgICAgIHVubGluayAoVE1QX1RBSUxfTyk7Ci0gICAgICB1bmxpbmsgKFRNUF9UQUlMX1MpOwotICAgIH0KLQotICBpZiAoZG9udGRlbHRlbXBzIDwgMikKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzaXplb2YgVE1QX1NUVUIgKyAxMCk7Ci0gICAgICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0JewotCSAgc3ByaW50ZiAobmFtZSwgIiVzJTA1ZC5vIiwgVE1QX1NUVUIsIGkpOwotCSAgaWYgKHVubGluayAobmFtZSkgPCAwKQotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICB3YXJuIChfKCJjYW5ub3QgZGVsZXRlICVzOiAlc1xuIiksIG5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCX0KLSAgICB9Ci0gIAotICBpbmZvcm0gKF8oIkNyZWF0ZWQgbGliIGZpbGUiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBSdW4gdGhyb3VnaCB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgLm8gZmlsZXMgYW5kIHRoZQotICAgLmRlZiBmaWxlIGFuZCB3b3JrIG91dCB0aGUgYmVzdCBzdHVmZiAqLwotc3RhdGljIGludAotcGZ1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIGV4cG9ydF90eXBlICphcCA9ICooZXhwb3J0X3R5cGUgKiopIGE7Ci0gIGV4cG9ydF90eXBlICpicCA9ICooZXhwb3J0X3R5cGUgKiopIGI7Ci0gIGlmIChhcC0+b3JkaW5hbCA9PSBicC0+b3JkaW5hbCkKLSAgICByZXR1cm4gMDsKLQotICAvKiB1bnNldCBvcmRpbmFscyBnbyB0byB0aGUgYm90dG9tICovCi0gIGlmIChhcC0+b3JkaW5hbCA9PSAtMSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKGJwLT5vcmRpbmFsID09IC0xKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIChhcC0+b3JkaW5hbCAtIGJwLT5vcmRpbmFsKTsKLX0KLQotc3RhdGljIGludAotbmZ1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIGV4cG9ydF90eXBlICphcCA9ICooZXhwb3J0X3R5cGUgKiopIGE7Ci0gIGV4cG9ydF90eXBlICpicCA9ICooZXhwb3J0X3R5cGUgKiopIGI7Ci0KLSAgcmV0dXJuIChzdHJjbXAgKGFwLT5uYW1lLCBicC0+bmFtZSkpOwotfQotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX251bGxfbmFtZXMgKHB0cikKLSAgICAgZXhwb3J0X3R5cGUgKipwdHI7Ci17Ci0gIGludCBzcmM7Ci0gIGludCBkc3Q7Ci0gIGZvciAoZHN0ID0gc3JjID0gMDsgc3JjIDwgZF9uZnVuY3M7IHNyYysrKQotICAgIHsKLSAgICAgIGlmIChwdHJbc3JjXSkKLQl7Ci0JICBwdHJbZHN0XSA9IHB0cltzcmNdOwotCSAgZHN0Kys7Ci0JfQotICAgIH0KLSAgZF9uZnVuY3MgPSBkc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdGFiIChwdHIpCi0gICAgIGV4cG9ydF90eXBlICoqcHRyOwotewotI2lmZGVmIFNBQ0RFQlVHCi0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocHRyW2ldKQotCXsKLQkgIHByaW50ZiAoIiVkICVzIEAgJWQgJXMlcyVzXG4iLAotCQkgIGksIHB0cltpXS0+bmFtZSwgcHRyW2ldLT5vcmRpbmFsLAotCQkgIHB0cltpXS0+bm9uYW1lID8gIk5PTkFNRSAiIDogIiIsCi0JCSAgcHRyW2ldLT5jb25zdGFudCA/ICJDT05TVEFOVCIgOiAiIiwKLQkJICBwdHJbaV0tPmRhdGEgPyAiREFUQSIgOiAiIik7Ci0JfQotICAgICAgZWxzZQotCXByaW50ZiAoImVtcHR5XG4iKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZHVwbGljYXRlcyAoZF9leHBvcnRfdmVjKQotICAgICBleHBvcnRfdHlwZSAqKmRfZXhwb3J0X3ZlYzsKLXsKLSAgaW50IG1vcmUgPSAxOwotICBpbnQgaTsKLSAgd2hpbGUgKG1vcmUpCi0gICAgewotCi0gICAgICBtb3JlID0gMDsKLSAgICAgIC8qIFJlbW92ZSBkdXBsaWNhdGVzICovCi0gICAgICBxc29ydCAoZF9leHBvcnRfdmVjLCBkX25mdW5jcywgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgbmZ1bmMpOwotCi0gICAgICBkdGFiIChkX2V4cG9ydF92ZWMpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzIC0gMTsgaSsrKQotCXsKLQkgIGlmIChzdHJjbXAgKGRfZXhwb3J0X3ZlY1tpXS0+bmFtZSwKLQkJICAgICAgZF9leHBvcnRfdmVjW2kgKyAxXS0+bmFtZSkgPT0gMCkKLQkgICAgewotCi0JICAgICAgZXhwb3J0X3R5cGUgKmEgPSBkX2V4cG9ydF92ZWNbaV07Ci0JICAgICAgZXhwb3J0X3R5cGUgKmIgPSBkX2V4cG9ydF92ZWNbaSArIDFdOwotCi0JICAgICAgbW9yZSA9IDE7Ci0JICAgICAgCi0JICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgICBpbmZvcm0gKF8oIldhcm5pbmcsIGlnbm9yaW5nIGR1cGxpY2F0ZSBFWFBPUlQgJXMgJWQsJWRcbiIpLAotCQkgICAgICBhLT5uYW1lLCBhLT5vcmRpbmFsLCBiLT5vcmRpbmFsKTsKLQkgICAgICAKLQkgICAgICBpZiAoYS0+b3JkaW5hbCAhPSAtMQotCQkgICYmIGItPm9yZGluYWwgIT0gLTEpCi0JCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCWZhdGFsIChfKCJFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMiKSwKLQkJICAgICAgYS0+bmFtZSk7Ci0KLQkgICAgICAvKiBNZXJnZSBhdHRyaWJ1dGVzICovCi0JICAgICAgYi0+b3JkaW5hbCA9IGEtPm9yZGluYWwgPiAwID8gYS0+b3JkaW5hbCA6IGItPm9yZGluYWw7Ci0JICAgICAgYi0+Y29uc3RhbnQgfD0gYS0+Y29uc3RhbnQ7Ci0JICAgICAgYi0+bm9uYW1lIHw9IGEtPm5vbmFtZTsKLQkgICAgICBiLT5kYXRhIHw9IGEtPmRhdGE7Ci0JICAgICAgZF9leHBvcnRfdmVjW2ldID0gMDsKLQkgICAgfQotCi0JICBkdGFiIChkX2V4cG9ydF92ZWMpOwotCSAgcmVtb3ZlX251bGxfbmFtZXMgKGRfZXhwb3J0X3ZlYyk7Ci0JICBkdGFiIChkX2V4cG9ydF92ZWMpOwotCX0KLSAgICB9Ci0KLQotICAvKiBDb3VudCB0aGUgbmFtZXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKCFkX2V4cG9ydF92ZWNbaV0tPm5vbmFtZSkKLQlkX25hbWVkX25mdW5jcysrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWZpbGxfb3JkaW5hbHMgKGRfZXhwb3J0X3ZlYykKLSAgICAgZXhwb3J0X3R5cGUgKipkX2V4cG9ydF92ZWM7Ci17Ci0gIGludCBsb3dlc3QgPSAtMTsKLSAgaW50IGk7Ci0gIGNoYXIgKnB0cjsKLSAgaW50IHNpemUgPSA2NTUzNjsKLQotICBxc29ydCAoZF9leHBvcnRfdmVjLCBkX25mdW5jcywgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgcGZ1bmMpOwotCi0gIC8qIGZpbGwgaW4gdGhlIHVuc2V0IG9yZGluYWxzIHdpdGggb25lcyBmcm9tIG91ciByYW5nZSAqLwotCi0gIHB0ciA9IChjaGFyICopIHhtYWxsb2MgKHNpemUpOwotCi0gIG1lbXNldCAocHRyLCAwLCBzaXplKTsKLQotICAvKiBNYXJrIGluIG91ciBsYXJnZSB2ZWN0b3IgYWxsIHRoZSBudW1iZXJzIHRoYXQgYXJlIHRha2VuICovCi0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmIChkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgIT0gLTEpCi0JewotCSAgcHRyW2RfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbF0gPSAxOwotCSAgaWYgKGxvd2VzdCA9PSAtMSB8fCBkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPCBsb3dlc3QpCi0JICAgIHsKLQkgICAgICBsb3dlc3QgPSBkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWw7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFN0YXJ0IGF0IDEgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNUyB0b29sY2hhaW4uICAqLwotICBpZiAobG93ZXN0ID09IC0xKQotICAgIGxvd2VzdCA9IDE7Ci0KLSAgLyogTm93IGZpbGwgaW4gb3JkaW5hbHMgd2hlcmUgdGhlIHVzZXIgd2FudHMgdXMgdG8gY2hvb3NlLiAqLwotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsID09IC0xKQotCXsKLQkgIHJlZ2lzdGVyIGludCBqOwotCi0JICAvKiBGaXJzdCB0cnkgd2l0aGluIG9yIGFmdGVyIGFueSB1c2VyIHN1cHBsaWVkIHJhbmdlLiAqLwotCSAgZm9yIChqID0gbG93ZXN0OyBqIDwgc2l6ZTsgaisrKQotCSAgICBpZiAocHRyW2pdID09IDApCi0JICAgICAgewotCQlwdHJbal0gPSAxOwotCQlkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPSBqOwotCQlnb3RvIGRvbmU7Ci0JICAgICAgfQotCi0JICAvKiBUaGVuIHRyeSBiZWZvcmUgdGhlIHJhbmdlLiAqLwotCSAgZm9yIChqID0gbG93ZXN0OyBqID4wOyBqLS0pCi0JICAgIGlmIChwdHJbal0gPT0gMCkKLQkgICAgICB7Ci0JCXB0cltqXSA9IDE7Ci0JCWRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCA9IGo7Ci0JCWdvdG8gZG9uZTsKLQkgICAgICB9Ci0JZG9uZTo7Ci0JfQotICAgIH0KLQotICBmcmVlIChwdHIpOwotCi0gIC8qIEFuZCByZXNvcnQgKi8KLQotICBxc29ydCAoZF9leHBvcnRfdmVjLCBkX25mdW5jcywgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgcGZ1bmMpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBsb3dlc3QgYW5kIGhpZ2hlc3Qgb3JkaW5hbCBudW1iZXJzLiAgKi8KLSAgaWYgKGRfbmZ1bmNzKQotICAgIHsKLSAgICAgIGlmIChkX2V4cG9ydF92ZWNbMF0pCi0JZF9sb3dfb3JkID0gZF9leHBvcnRfdmVjWzBdLT5vcmRpbmFsOwotICAgICAgaWYgKGRfZXhwb3J0X3ZlY1tkX25mdW5jcy0xXSkKLQlkX2hpZ2hfb3JkID0gZF9leHBvcnRfdmVjW2RfbmZ1bmNzLTFdLT5vcmRpbmFsOwotICAgIH0KLX0KLQotc3RhdGljIGludAotYWxwaGFmdW5jIChhdixidikKLSAgICAgY29uc3Qgdm9pZCAqYXY7Ci0gICAgIGNvbnN0IHZvaWQgKmJ2OwotewotICBjb25zdCBleHBvcnRfdHlwZSAqKmEgPSAoY29uc3QgZXhwb3J0X3R5cGUgKiopIGF2OwotICBjb25zdCBleHBvcnRfdHlwZSAqKmIgPSAoY29uc3QgZXhwb3J0X3R5cGUgKiopIGJ2OwotCi0gIHJldHVybiBzdHJjbXAgKCgqYSktPm5hbWUsICgqYiktPm5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotbWFuZ2xlX2RlZnMgKCkKLXsKLSAgLyogRmlyc3Qgd29yayBvdXQgdGhlIG1pbmltdW0gb3JkaW5hbCBjaG9zZW4gKi8KLQotICBleHBvcnRfdHlwZSAqZXhwOwotCi0gIGludCBpOwotICBpbnQgaGludCA9IDA7Ci0gIGV4cG9ydF90eXBlICoqZF9leHBvcnRfdmVjCi0gID0gKGV4cG9ydF90eXBlICoqKSB4bWFsbG9jIChzaXplb2YgKGV4cG9ydF90eXBlICopICogZF9uZnVuY3MpOwotCi0gIGluZm9ybSAoXygiUHJvY2Vzc2luZyBkZWZpbml0aW9ucyIpKTsKLSAgCi0gIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLSAgICB7Ci0gICAgICBkX2V4cG9ydF92ZWNbaV0gPSBleHA7Ci0gICAgfQotCi0gIHByb2Nlc3NfZHVwbGljYXRlcyAoZF9leHBvcnRfdmVjKTsKLSAgZmlsbF9vcmRpbmFscyAoZF9leHBvcnRfdmVjKTsKLQotICAvKiBQdXQgYmFjayB0aGUgbGlzdCBpbiB0aGUgbmV3IG9yZGVyICovCi0gIGRfZXhwb3J0cyA9IDA7Ci0gIGZvciAoaSA9IGRfbmZ1bmNzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgZF9leHBvcnRfdmVjW2ldLT5uZXh0ID0gZF9leHBvcnRzOwotICAgICAgZF9leHBvcnRzID0gZF9leHBvcnRfdmVjW2ldOwotICAgIH0KLQotICAvKiBCdWlsZCBsaXN0IGluIGFscGhhIG9yZGVyICovCi0gIGRfZXhwb3J0c19sZXhpY2FsbHkgPSAoZXhwb3J0X3R5cGUgKiopCi0gICAgeG1hbGxvYyAoc2l6ZW9mIChleHBvcnRfdHlwZSAqKSAqIChkX25mdW5jcyArIDEpKTsKLQotICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0gICAgewotICAgICAgZF9leHBvcnRzX2xleGljYWxseVtpXSA9IGV4cDsKLSAgICB9Ci0gIGRfZXhwb3J0c19sZXhpY2FsbHlbaV0gPSAwOwotCi0gIHFzb3J0IChkX2V4cG9ydHNfbGV4aWNhbGx5LCBpLCBzaXplb2YgKGV4cG9ydF90eXBlICopLCBhbHBoYWZ1bmMpOwotCi0gIC8qIEZpbGwgZXhwIGVudHJpZXMgd2l0aCB0aGVpciBoaW50IHZhbHVlcyAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmICghZF9leHBvcnRzX2xleGljYWxseVtpXS0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JZF9leHBvcnRzX2xleGljYWxseVtpXS0+aGludCA9IGhpbnQrKzsKLSAgICB9Ci0gIAotICBpbmZvcm0gKF8oIlByb2Nlc3NlZCBkZWZpbml0aW9ucyIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAoZmlsZSwgc3RhdHVzKQotICAgICBGSUxFICpmaWxlOwotICAgICBpbnQgc3RhdHVzOwotewotICAvKiB4Z2V0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIC8qIHhnZXRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLW0gLS1tYWNoaW5lIDxtYWNoaW5lPiAgICBDcmVhdGUgYXMgRExMIGZvciA8bWFjaGluZT4uICBbZGVmYXVsdDogJXNdXG4iKSwgbW5hbWUpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAgIHBvc3NpYmxlIDxtYWNoaW5lPjogYXJtW19pbnRlcndvcmtdLCBpMzg2LCBtY29yZVstZWxmXXstbGV8LWJlfSwgcHBjLCB0aHVtYlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtZSAtLW91dHB1dC1leHAgPG91dG5hbWU+IEdlbmVyYXRlIGFuIGV4cG9ydCBmaWxlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtbCAtLW91dHB1dC1saWIgPG91dG5hbWU+IEdlbmVyYXRlIGFuIGludGVyZmFjZSBsaWJyYXJ5LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtYSAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtRCAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIGludGVyZmFjZSBsaWIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1kIC0taW5wdXQtZGVmIDxkZWZmaWxlPiAgTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLXogLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG9mIC5kZWYgZmlsZSB0byBiZSBjcmVhdGVkLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCBsaXN0ZWQgc3ltYm9sc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLWV4Y2x1ZGUtc3ltYm9scyA8bGlzdD4gRG9uJ3QgZXhwb3J0IDxsaXN0PlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLW5vLWRlZmF1bHQtZXhjbHVkZXMgIENsZWFyIGRlZmF1bHQgZXhjbHVkZSBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1iIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLXggLS1uby1pZGF0YTQgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ0IHNlY3Rpb24uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1jIC0tbm8taWRhdGE1ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtVSAtLWFkZC11bmRlcnNjb3JlICAgICAgIEFkZCB1bmRlcnNjb3JlcyB0byBzeW1ib2xzIGluIGludGVyZmFjZSBsaWJyYXJ5LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtayAtLWtpbGwtYXQgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtQSAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLVMgLS1hcyA8bmFtZT4gICAgICAgICAgICBVc2UgPG5hbWU+IGZvciBhc3NlbWJsZXIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1mIC0tYXMtZmxhZ3MgPGZsYWdzPiAgICAgUGFzcyA8ZmxhZ3M+IHRvIHRoZSBhc3NlbWJsZXIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1uIC0tbm8tZGVsZXRlICAgICAgICAgICAgS2VlcCB0ZW1wIGZpbGVzIChyZXBlYXQgZm9yIGV4dHJhIHByZXNlcnZhdGlvbikuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC12IC0tdmVyYm9zZSAgICAgICAgICAgICAgQmUgdmVyYm9zZS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBwcm9ncmFtIHZlcnNpb24uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1oIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uLlxuIikpOwotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1NIC0tbWNvcmUtZWxmIDxvdXRuYW1lPiAgUHJvY2VzcyBtY29yZS1lbGYgb2JqZWN0IGZpbGVzIGludG8gPG91dG5hbWU+LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtTCAtLWxpbmtlciA8bmFtZT4gICAgICAgIFVzZSA8bmFtZT4gYXMgdGhlIGxpbmtlci5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLUYgLS1saW5rZXItZmxhZ3MgPGZsYWdzPiBQYXNzIDxmbGFncz4gdG8gdGhlIGxpbmtlci5cbiIpKTsKLSNlbmRpZgotICBleGl0IChzdGF0dXMpOwotfQotCi0jZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJCTE1MAotI2RlZmluZSBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TCShPUFRJT05fRVhQT1JUX0FMTF9TWU1TICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNUwkJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUwkoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJuby1kZWxldGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ24nfSwKLSAgeyJkbGxuYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdEJ30sCi0gIHsibm8taWRhdGE0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICd4J30sCi0gIHsibm8taWRhdGE1Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdjJ30sCi0gIHsib3V0cHV0LWV4cCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7Im91dHB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3onfSwKLSAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTExfU1lNU30sCi0gIHsibm8tZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVN9LAotICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1TfSwKLSAgeyJuby1kZWZhdWx0LWV4Y2x1ZGVzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTfSwKLSAgeyJvdXRwdXQtbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gIHsiZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdkJ30sIC8qIGZvciBjb21wYXRpYmxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyAqLwotICB7ImlucHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAotICB7ImFkZC11bmRlcnNjb3JlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdVJ30sCi0gIHsia2lsbC1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnayd9LAotICB7ImFkZC1zdGRjYWxsLWFsaWFzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdBJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgJ1YnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsibWFjaGluZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAotICB7ImFkZC1pbmRpcmVjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICB7ImFzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdTJ30sCi0gIHsiYXMtZmxhZ3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJtY29yZS1lbGYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ00nfSwKLSAgezB9Ci19OwotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICoqYXY7Ci17Ci0gIGludCBjOwotICBpbnQgaTsKLSAgY2hhciAqZmlyc3RhcmcgPSAwOwotICBwcm9ncmFtX25hbWUgPSBhdlswXTsKLSAgb2F2ID0gYXY7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LAotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCQkJICAgCi0JCQkgICAibTplOmw6YUQ6ZDp6OmI6eGN1VWtBUzpmOm52VmhNOkw6RjoiLAotI2Vsc2UKLQkJCSAgICJtOmU6bDphRDpkOno6Yjp4Y3VVa0FTOmY6bnZWaCIsCi0jZW5kaWYKLQkJCSAgIGxvbmdfb3B0aW9ucywgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgT1BUSU9OX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGxfc3ltYm9scyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVM6Ci0JICBleHBvcnRfYWxsX3N5bWJvbHMgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYQ0xVREVfU1lNUzoKLQkgIGFkZF9leGNsdWRlcyAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVM6Ci0JICBkb19kZWZhdWx0X2V4Y2x1ZGVzID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIG5vX2lkYXRhNCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIG5vX2lkYXRhNSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGFzX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGFzX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQkgIC8qIGlnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgKi8KLQljYXNlICd1JzoKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgYWRkX2luZGlyZWN0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgb3V0cHV0X2RlZiA9IGZvcGVuIChvcHRhcmcsIEZPUEVOX1dUKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZGxsX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGltcF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICBleHBfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQljYXNlICdtJzoKLQkgIG1uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgcHJpbnRfdmVyc2lvbiAocHJvZ3JhbV9uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1UnOgotCSAgYWRkX3VuZGVyc2NvcmUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnayc6Ci0JICBraWxsYXQgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBhZGRfc3RkY2FsbF9hbGlhcyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRlZl9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBkb250ZGVsdGVtcHMrKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgYmFzZV9maWxlID0gZm9wZW4gKG9wdGFyZywgRk9QRU5fUkIpOwotCSAgCi0JICBpZiAoIWJhc2VfZmlsZSkKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZmF0YWwgKF8oIlVuYWJsZSB0byBvcGVuIGJhc2UtZmlsZTogJXMiKSwgb3B0YXJnKTsKLQotCSAgYnJlYWs7Ci0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLQljYXNlICdNJzoKLQkgIG1jb3JlX2VsZl9vdXRfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0wnOgotCSAgbWNvcmVfZWxmX2xpbmtlciA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgbWNvcmVfZWxmX2xpbmtlcl9mbGFncyA9IG9wdGFyZzsKLQkgIGJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBtdGFibGVbaV0udHlwZTsgaSsrKQotICAgIGlmIChzdHJjbXAgKG10YWJsZVtpXS50eXBlLCBtbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmICghbXRhYmxlW2ldLnR5cGUpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiKSwgbW5hbWUpOwotCi0gIG1hY2hpbmUgPSBpOwotCi0gIGlmICghZGxsX25hbWUgJiYgZXhwX25hbWUpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoZXhwX25hbWUpICsgNTsKLSAgICAgIGRsbF9uYW1lID0geG1hbGxvYyAobGVuKTsKLSAgICAgIHN0cmNweSAoZGxsX25hbWUsIGV4cF9uYW1lKTsKLSAgICAgIHN0cmNhdCAoZGxsX25hbWUsICIuZGxsIik7Ci0gICAgfQotCi0gIGlmIChhc19uYW1lID09IE5VTEwpCi0gICAgYXNfbmFtZSA9IGRlZHVjZV9uYW1lICgiYXMiKTsKLSAgCi0gIC8qIERvbid0IHVzZSB0aGUgZGVmYXVsdCBleGNsdWRlIGxpc3QgaWYgd2UncmUgcmVhZGluZyBvbmx5IHRoZQotICAgICBzeW1ib2xzIGluIHRoZSAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGRlZmF1bHQgZXhjbHVkZXMgYXJlIG1lYW50Ci0gICAgIHRvIGF2b2lkIGV4cG9ydGluZyBETEwgZW50cnkgcG9pbnQgYW5kIEN5Z3dpbjMyIGltcHVyZV9wdHIuICAqLwotICBpZiAoISBleHBvcnRfYWxsX3N5bWJvbHMpCi0gICAgZG9fZGVmYXVsdF9leGNsdWRlcyA9IGZhbHNlOwotICAKLSAgaWYgKGRvX2RlZmF1bHRfZXhjbHVkZXMpCi0gICAgc2V0X2RlZmF1bHRfZXhjbHVkZXMgKCk7Ci0KLSAgaWYgKGRlZl9maWxlKQotICAgIHByb2Nlc3NfZGVmX2ZpbGUgKGRlZl9maWxlKTsKLQotICB3aGlsZSAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaWYgKCFmaXJzdGFyZykKLQlmaXJzdGFyZyA9IGF2W29wdGluZF07Ci0gICAgICBzY2FuX29ial9maWxlIChhdltvcHRpbmRdKTsKLSAgICAgIG9wdGluZCsrOwotICAgIH0KLQotICBtYW5nbGVfZGVmcyAoKTsKLQotICBpZiAoZXhwX25hbWUpCi0gICAgZ2VuX2V4cF9maWxlICgpOwotICAKLSAgaWYgKGltcF9uYW1lKQotICAgIHsKLSAgICAgIC8qIE1ha2UgaW1wX25hbWUgc2FmZSBmb3IgdXNlIGFzIGEgbGFiZWwuICovCi0gICAgICBjaGFyICpwOwotCi0gICAgICBpbXBfbmFtZV9sYWIgPSB4c3RyZHVwIChpbXBfbmFtZSk7Ci0gICAgICBmb3IgKHAgPSBpbXBfbmFtZV9sYWI7ICpwOyBwKyspCi0JewotCSAgaWYgKCFpc2FscGhhICgodW5zaWduZWQgY2hhcikgKnApICYmICFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKQotCSAgICAqcCA9ICdfJzsKLQl9Ci0gICAgICBoZWFkX2xhYmVsID0gbWFrZV9sYWJlbCgiX2hlYWRfIiwgaW1wX25hbWVfbGFiKTsKLSAgICAgIGdlbl9saWJfZmlsZSAoKTsKLSAgICB9Ci0gIAotICBpZiAob3V0cHV0X2RlZikKLSAgICBnZW5fZGVmX2ZpbGUgKCk7Ci0gIAotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gIGlmIChtY29yZV9lbGZfb3V0X2ZpbGUpCi0gICAgbWNvcmVfZWxmX2dlbl9vdXRfZmlsZSAoKTsKLSNlbmRpZgotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIExvb2sgZm9yIHRoZSBwcm9ncmFtIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIFBST0dfTkFNRSBhbmQgdGhlCi0gICBzdHJpbmcgcnVubmluZyBmcm9tIFBSRUZJWCB0byBFTkRfUFJFRklYLiAgSWYgdGhlIGNvbmNhdGVuYXRlZAotICAgc3RyaW5nIGNvbnRhaW5zIGEgJy8nLCB0cnkgYXBwZW5kaW5nIEVYRUNVVEFCTEVfU1VGRklYIGlmIGl0IGlzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWxvb2tfZm9yX3Byb2cgKHByb2dfbmFtZSwgcHJlZml4LCBlbmRfcHJlZml4KQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgICAgaW50IGVuZF9wcmVmaXg7Ci17Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKmNtZDsKLQotICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByZWZpeCkgCi0gICAgICAgICAgICAgICAgICsgc3RybGVuIChwcm9nX25hbWUpIAotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKEVYRUNVVEFCTEVfU1VGRklYKSAKLSNlbmRpZgotCQkgKyAxMCk7Ci0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCArIGVuZF9wcmVmaXgsICIlcyIsIHByb2dfbmFtZSk7Ci0KLSAgaWYgKHN0cmNociAoY21kLCAnLycpICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGZvdW5kOwotCi0gICAgICBmb3VuZCA9IChzdGF0IChjbWQsICZzKSA9PSAwCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgfHwgc3RhdCAoc3RyY2F0IChjbWQsIEVYRUNVVEFCTEVfU1VGRklYKSwgJnMpID09IDAKLSNlbmRpZgotCSAgICAgICApOwotCi0gICAgICBpZiAoISBmb3VuZCkKLSAgICAgICAgewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGluZm9ybSAoXygiVHJpZWQgZmlsZTogJXMiKSwgY21kKTsKLQkgIGZyZWUgKGNtZCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiVXNpbmcgZmlsZTogJXMiKSwgY21kKTsKLQotICByZXR1cm4gY21kOwotfQotCi0vKiBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gd2UgYXJlIHdhbnQgdG8gaW52b2tlLgotICAgUFJPR19OQU1FIGlzIHRoZSBiYXNpYyBuYW1lIG9mIHRoZSBwcm9ncmFtIHdlIHdhbnQgdG8gcnVuLAotICAgZWcgImFzIiBvciAibGQiLiAgVGhlIGNhdGNoIGlzIHRoYXQgd2UgbWlnaHQgd2FudCBhY3R1YWxseQotICAgcnVuICJpMzg2LXBlLWFzIiBvciAicHBjLXBlLWxkIi4gIAotCi0gICBJZiBhcmd2WzBdIGNvbnRhaW5zIHRoZSBmdWxsIHBhdGgsIHRoZW4gdHJ5IHRvIGZpbmQgdGhlIHByb2dyYW0KLSAgIGluIHRoZSBzYW1lIHBsYWNlLCB3aXRoIGFuZCB0aGVuIHdpdGhvdXQgYSB0YXJnZXQtbGlrZSBwcmVmaXguCi0KLSAgIEdpdmVuLCBhcmd2WzBdID0gL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1kbGx0b29sLAotICAgZGVkdWNlX25hbWUoImFzIikgdXNlcyB0aGUgZm9sbG93aW5nIHNlYXJjaCBvcmRlcjogCi0KLSAgICAgL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1hcwotICAgICAvdXNyL2xvY2FsL2Jpbi9hcwotICAgICBhcwotICAgCi0gICBJZiB0aGVyZSdzIGFuIEVYRUNVVEFCTEVfU1VGRklYLCBpdCdsbCB1c2UgdGhhdCBhcyB3ZWxsOyBmb3IgZWFjaAotICAgbmFtZSwgaXQnbGwgdHJ5IHdpdGhvdXQgYW5kIHRoZW4gd2l0aCBFWEVDVVRBQkxFX1NVRkZJWC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSBpNTg2LWN5Z3dpbjMyLWRsbHRvb2wsIGl0IHdpbGwgbm90IGV2ZW4gdHJ5ICJhcyIKLSAgIGFzIHRoZSBmYWxsYmFjaywgYnV0IHJhdGhlciByZXR1cm4gaTU4Ni1jeWd3aW4zMi1hcy4KLSAgICAgCi0gICBPaCwgYW5kIGdpdmVuLCBhcmd2WzBdID0gZGxsdG9vbCwgaXQnbGwgcmV0dXJuICJhcyIuCi0KLSAgIFJldHVybnMgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZGVkdWNlX25hbWUgKHByb2dfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcHJvZ19uYW1lOwotewotICBjaGFyICpjbWQ7Ci0gIGNoYXIgKmRhc2gsICpzbGFzaCwgKmNwOwotCi0gIGRhc2ggPSBOVUxMOwotICBzbGFzaCA9IE5VTEw7Ci0gIGZvciAoY3AgPSBwcm9ncmFtX25hbWU7ICpjcCAhPSAnXDAnOyArK2NwKQotICAgIHsKLSAgICAgIGlmICgqY3AgPT0gJy0nKQotCWRhc2ggPSBjcDsKLSAgICAgIGlmICgKLSNpZiBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0JICAqY3AgPT0gJzonIHx8ICpjcCA9PSAnXFwnIHx8Ci0jZW5kaWYKLQkgICpjcCA9PSAnLycpCi0JewotCSAgc2xhc2ggPSBjcDsKLQkgIGRhc2ggPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgY21kID0gTlVMTDsKLQotICBpZiAoZGFzaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZpcnN0LCB0cnkgbG9va2luZyBmb3IgYSBwcmVmaXhlZCBQUk9HX05BTUUgaW4gdGhlCi0gICAgICAgICBQUk9HUkFNX05BTUUgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIHByZWZpeCBhcyBQUk9HUkFNX05BTUUuICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIGRhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKHNsYXNoICE9IE5VTEwgJiYgY21kID09IE5VTEwpCi0gICAgewotICAgICAgLyogTmV4dCwgdHJ5IGxvb2tpbmcgZm9yIGEgUFJPR19OQU1FIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcwotICAgICAgICAgdGhhdCBvZiB0aGlzIHByb2dyYW0uICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIHNsYXNoIC0gcHJvZ3JhbV9uYW1lICsgMSk7Ci0gICAgfQotCi0gIGlmIChjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBKdXN0IHJldHVybiBQUk9HX05BTUUgYXMgaXMuICAqLwotICAgICAgY21kID0geHN0cmR1cCAocHJvZ19uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNtZDsKLX0KLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi10eXBlZGVmIHN0cnVjdCBmbmFtZV9jYWNoZQotewotICBjaGFyICogICAgICAgICAgICAgICBmaWxlbmFtZTsKLSAgc3RydWN0IGZuYW1lX2NhY2hlICogbmV4dDsKLX0KLWZuYW1lX2NhY2hlOwotCi1zdGF0aWMgZm5hbWVfY2FjaGUgZm5hbWVzOwotCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lIChjaGFyICogZmlsZW5hbWUpCi17Ci0gIGZuYW1lX2NhY2hlICogcHRyOwotCi0gIHB0ciA9ICYgZm5hbWVzOwotCi0gIHdoaWxlIChwdHItPm5leHQgIT0gTlVMTCkKLSAgICBwdHIgPSBwdHItPm5leHQ7Ci0KLSAgcHRyLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBwdHItPm5leHQgICAgID0gKGZuYW1lX2NhY2hlICopIG1hbGxvYyAoc2l6ZW9mIChmbmFtZV9jYWNoZSkpOwotICBpZiAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgcHRyLT5uZXh0LT5uZXh0ID0gTlVMTDsKLX0KLQotI2RlZmluZSBNQ09SRV9FTEZfVE1QX09CSiAibWNvcmVlbGYubyIKLSNkZWZpbmUgTUNPUkVfRUxGX1RNUF9FWFAgIm1jb3JlZWxmLmV4cCIKLSNkZWZpbmUgTUNPUkVfRUxGX1RNUF9MSUIgIm1jb3JlZWxmLmxpYiIKLQotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUgKHZvaWQpCi17Ci0gIGZuYW1lX2NhY2hlICogcHRyOwotICBkeW5fc3RyaW5nX3QgZHM7Ci0KLSAgLyogU3RlcCBvbmUuICBSdW4gJ2xkIC1yJyBvbiB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGluIG9yZGVyIHRvIHJlc29sdmUKLSAgICAgYW55IGludGVybmFsIHJlZmVyZW5jZXMgYW5kIHRvIGdlbmVyYXRlIGEgc2luZ2xlIC5leHBvcnRzIHNlY3Rpb24uICAqLwotICBwdHIgPSAmIGZuYW1lczsKLQotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICItciAiKTsKLQotICBpZiAobWNvcmVfZWxmX2xpbmtlcl9mbGFncyAhPSBOVUxMKQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgbWNvcmVfZWxmX2xpbmtlcl9mbGFncyk7Ci0gIAotICB3aGlsZSAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBwdHItPmZpbGVuYW1lKTsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAiKTsKLQotICAgICAgcHRyID0gcHRyLT5uZXh0OwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICItbyAiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXIgPT0gTlVMTCkKLSAgICBtY29yZV9lbGZfbGlua2VyID0gZGVkdWNlX25hbWUgKCJsZCIpOwotICAKLSAgcnVuIChtY29yZV9lbGZfbGlua2VyLCBkcy0+cyk7Ci0KLSAgZHluX3N0cmluZ19kZWxldGUgKGRzKTsKLQotICAvKiBTdGVwIHR3by4gQ3JlYXRlIGEgLmV4cCBmaWxlIGFuZCBhIC5saWIgZmlsZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZS4gCi0gICAgIERvIHRoaXMgYnkgcmVjdXJzaXZlbHkgaW52b2tpbmcgZGxsdG9vbC4uLi4qLwotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1TICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIGFzX25hbWUpOwotICAKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1lICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfRVhQKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1sICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfTElCKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiICIgKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC12Iik7Ci0gIAotICBpZiAoZG9udGRlbHRlbXBzKQotICAgIHsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbiIpOwotICAKLSAgICAgIGlmIChkb250ZGVsdGVtcHMgPiAxKQotCWR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbiIpOwotICAgIH0KLQotICAvKiBYWFggLSBGSU1FOiBvdWdodCB0byBjaGVjay9jb3B5IG90aGVyIGNvbW1hbmQgbGluZSBvcHRpb25zIGFzIHdlbGwuICAqLwotICAKLSAgcnVuIChwcm9ncmFtX25hbWUsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIC8qIFN0ZXAgZm91ci4gRmVlZCB0aGUgLmV4cCBhbmQgb2JqZWN0IGZpbGVzIHRvIGxkIC1zaGFyZWQgdG8gY3JlYXRlIHRoZSBkbGwuICAqLwotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1zaGFyZWQgIik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXJfZmxhZ3MpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBtY29yZV9lbGZfbGlua2VyX2ZsYWdzKTsKLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9FWFApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9PQkopOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgLW8gIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgbWNvcmVfZWxmX291dF9maWxlKTsKLQotICBydW4gKG1jb3JlX2VsZl9saW5rZXIsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB1bmxpbmsgKE1DT1JFX0VMRl9UTVBfRVhQKTsKLQotICBpZiAoZG9udGRlbHRlbXBzIDwgMikKLSAgICB1bmxpbmsgKE1DT1JFX0VMRl9UTVBfT0JKKTsKLX0KLSNlbmRpZiAvKiBETExUT09MX01DT1JFX0VMRiAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGxsdG9vbC5oIGIvYmludXRpbHMvZGxsdG9vbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE2N2M4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RsbHRvb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGRsbHRvb2wuaCAtLSBoZWFkZXIgZmlsZSBmb3IgZGxsdG9vbAotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gdm9pZCBkZWZfY29kZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9kYXRhIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2Rlc2NyaXB0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmX2V4cG9ydHMKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2hlYXBzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfaW1wb3J0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfbGlicmFyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfc3RhY2tzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfdmVyc2lvbiBQQVJBTVMgKChpbnQsIGludCkpOwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBpbnQgeXlkZWJ1ZzsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIEZJTEUgKnl5aW47Ci1leHRlcm4gaW50IGxpbmVudW1iZXI7CmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx3cmFwLmMgYi9iaW51dGlscy9kbGx3cmFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjA2ZmIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsd3JhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMyArMCwwIEBACi0vKiBkbGx3cmFwLmMgLS0gd3JhcHBlciBmb3IgRExMVE9PTCBhbmQgR0NDIHRvIGdlbmVyYXRlIFBFIHN0eWxlIERMTHMKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE11bWl0IEtoYW4gKGtoYW5AeHJheWxpdGgud2lzYy5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLwotI2lmbmRlZiBfX0dOVUNfXwotIyBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2Vsc2UgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpID4+IDgpICYgMDM3NykKLSNlbmRpZgotI2Vsc2UgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSAmIDB4ZmYpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykgJiAweGZmKSAhPSAwICYmICgodykgJiAweGZmKSAhPSAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpICYgMHhmZjAwKSA+PiA4KQotI2VuZGlmCi0jZW5kaWYgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNlbmRpZiAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotCi1zdGF0aWMgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjAuMi40IjsKLXN0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqY3lnd2luX2RyaXZlcl9mbGFncyA9IAotICAiLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMiOwotc3RhdGljIGNoYXIgKm1pbmd3MzJfZHJpdmVyX2ZsYWdzID0gIi1tZGxsIjsKLXN0YXRpYyBjaGFyICpnZW5lcmljX2RyaXZlcl9mbGFncyA9ICItV2wsLS1kbGwiOwotCi1zdGF0aWMgY2hhciAqZW50cnlfcG9pbnQ7Ci0KLXN0YXRpYyBjaGFyICpkbGx0b29sX25hbWUgPSBOVUxMOwotCi1zdGF0aWMgY2hhciAqdGFyZ2V0ID0gVEFSR0VUOwotCi10eXBlZGVmIGVudW0gewotICBVTktOT1dOX1RBUkdFVCwgCi0gIENZR1dJTl9UQVJHRVQsIAotICBNSU5HVzMyX1RBUkdFVAotfSAKLXRhcmdldF90eXBlOwotCi1zdGF0aWMgdGFyZ2V0X3R5cGUgd2hpY2hfdGFyZ2V0ID0gVU5LTk9XTl9UQVJHRVQ7Ci0KLXN0YXRpYyBpbnQgZG9udGRlbHRlbXBzID0gMDsKLXN0YXRpYyBpbnQgZHJ5X3J1biA9IDA7Ci0KLXN0YXRpYyBjaGFyICpwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyBpbnQgdmVyYm9zZSA9IDA7Ci0KLXN0YXRpYyBjaGFyICpkbGxfZmlsZV9uYW1lOwotc3RhdGljIGNoYXIgKmRsbF9uYW1lOwotc3RhdGljIGNoYXIgKmJhc2VfZmlsZV9uYW1lOwotc3RhdGljIGNoYXIgKmV4cF9maWxlX25hbWU7Ci1zdGF0aWMgY2hhciAqZGVmX2ZpbGVfbmFtZTsKLXN0YXRpYyBpbnQgZGVsZXRlX2Jhc2VfZmlsZSA9IDE7Ci1zdGF0aWMgaW50IGRlbGV0ZV9leHBfZmlsZSA9IDE7Ci1zdGF0aWMgaW50IGRlbGV0ZV9kZWZfZmlsZSA9IDE7Ci0KLXN0YXRpYyBpbnQgcnVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluZm9ybSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIGNoYXIgKmxvb2tfZm9yX3Byb2cgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGNoYXIgKmRlZHVjZV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZGVsZXRlX3RlbXBfZmlsZXMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2xlYW51cF9hbmRfZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQbGVhc2Uga2VlcCB0aGUgZm9sbG93aW5nIDQgcm91dGluZXMgaW4gc3luYyB3aXRoIGRsbHRvb2wuYzoKLSAgICAgZGlzcGxheSAoKQotICAgICBpbmZvcm0gKCkKLSAgICAgbG9va19mb3JfcHJvZyAoKQotICAgICBkZWR1Y2VfbmFtZSAoKQotICAgSXQncyBub3Qgd29ydGggdGhlIGhhc3NsZSB0byBicmVhayB0aGVzZSBvdXQgc2luY2UgZGxsd3JhcCB3aWxsCi0gICAoaG9wZWZ1bGx5KSBzb29uIGJlIHJldGlyZWQgaW4gZmF2b3Igb2YgYGxkIC0tc2hhcmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9saXN0ICAgICAgYXJnczsKLXsKLSAgaWYgKHByb2dyYW1fbmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCi0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotCi0gIGlmIChtZXNzYWdlIFtzdHJsZW4gKG1lc3NhZ2UpIC0gMV0gIT0gJ1xuJykKLSAgICBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0gIAotCi0KLXN0YXRpYyB2b2lkCi0jaWZkZWYgX19TVERDX18KLWluZm9ybSAoY29uc3QgY2hhciAqIG1lc3NhZ2UsIC4uLikKLSNlbHNlCi1pbmZvcm0gKG1lc3NhZ2UsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICAKLSAgaWYgKCF2ZXJib3NlKQotICAgIHJldHVybjsKLQotI2lmZGVmIF9fU1REQ19fCi0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSNlbmRpZgotCi0gIGRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpOwotICAKLSAgdmFfZW5kIChhcmdzKTsKLX0KLQotLyogTG9vayBmb3IgdGhlIHByb2dyYW0gZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgUFJPR19OQU1FIGFuZCB0aGUKLSAgIHN0cmluZyBydW5uaW5nIGZyb20gUFJFRklYIHRvIEVORF9QUkVGSVguICBJZiB0aGUgY29uY2F0ZW5hdGVkCi0gICBzdHJpbmcgY29udGFpbnMgYSAnLycsIHRyeSBhcHBlbmRpbmcgRVhFQ1VUQUJMRV9TVUZGSVggaWYgaXQgaXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcmVmaXgsIGVuZF9wcmVmaXgpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJlZml4OwotICAgICBpbnQgZW5kX3ByZWZpeDsKLXsKLSAgc3RydWN0IHN0YXQgczsKLSAgY2hhciAqY21kOwotCi0gIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJlZml4KSAKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKHByb2dfbmFtZSkgCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgICArIHN0cmxlbiAoRVhFQ1VUQUJMRV9TVUZGSVgpIAotI2VuZGlmCi0JCSArIDEwKTsKLSAgc3RyY3B5IChjbWQsIHByZWZpeCk7Ci0KLSAgc3ByaW50ZiAoY21kICsgZW5kX3ByZWZpeCwgIiVzIiwgcHJvZ19uYW1lKTsKLQotICBpZiAoc3RyY2hyIChjbWQsICcvJykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgZm91bmQ7Ci0KLSAgICAgIGZvdW5kID0gKHN0YXQgKGNtZCwgJnMpID09IDAKLSNpZmRlZiBIQVZFX0VYRUNVVEFCTEVfU1VGRklYCi0gICAgICAgICAgICAgICB8fCBzdGF0IChzdHJjYXQgKGNtZCwgRVhFQ1VUQUJMRV9TVUZGSVgpLCAmcykgPT0gMAotI2VuZGlmCi0JICAgICAgICk7Ci0KLSAgICAgIGlmICghIGZvdW5kKQotICAgICAgICB7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgaW5mb3JtIChfKCJUcmllZCBmaWxlOiAlcyIpLCBjbWQpOwotCSAgZnJlZSAoY21kKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJVc2luZyBmaWxlOiAlcyIpLCBjbWQpOwotCi0gIHJldHVybiBjbWQ7Ci19Ci0KLS8qIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB3ZSBhcmUgd2FudCB0byBpbnZva2UuCi0gICBQUk9HX05BTUUgaXMgdGhlIGJhc2ljIG5hbWUgb2YgdGhlIHByb2dyYW0gd2Ugd2FudCB0byBydW4sCi0gICBlZyAiYXMiIG9yICJsZCIuICBUaGUgY2F0Y2ggaXMgdGhhdCB3ZSBtaWdodCB3YW50IGFjdHVhbGx5Ci0gICBydW4gImkzODYtcGUtYXMiIG9yICJwcGMtcGUtbGQiLiAgCi0KLSAgIElmIGFyZ3ZbMF0gY29udGFpbnMgdGhlIGZ1bGwgcGF0aCwgdGhlbiB0cnkgdG8gZmluZCB0aGUgcHJvZ3JhbQotICAgaW4gdGhlIHNhbWUgcGxhY2UsIHdpdGggYW5kIHRoZW4gd2l0aG91dCBhIHRhcmdldC1saWtlIHByZWZpeC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSAvdXNyL2xvY2FsL2Jpbi9pNTg2LWN5Z3dpbjMyLWRsbHRvb2wsCi0gICBkZWR1Y2VfbmFtZSgiYXMiKSB1c2VzIHRoZSBmb2xsb3dpbmcgc2VhcmNoIG9yZGVyOiAKLQotICAgICAvdXNyL2xvY2FsL2Jpbi9pNTg2LWN5Z3dpbjMyLWFzCi0gICAgIC91c3IvbG9jYWwvYmluL2FzCi0gICAgIGFzCi0gICAKLSAgIElmIHRoZXJlJ3MgYW4gRVhFQ1VUQUJMRV9TVUZGSVgsIGl0J2xsIHVzZSB0aGF0IGFzIHdlbGw7IGZvciBlYWNoCi0gICBuYW1lLCBpdCdsbCB0cnkgd2l0aG91dCBhbmQgdGhlbiB3aXRoIEVYRUNVVEFCTEVfU1VGRklYLgotCi0gICBHaXZlbiwgYXJndlswXSA9IGk1ODYtY3lnd2luMzItZGxsdG9vbCwgaXQgd2lsbCBub3QgZXZlbiB0cnkgImFzIgotICAgYXMgdGhlIGZhbGxiYWNrLCBidXQgcmF0aGVyIHJldHVybiBpNTg2LWN5Z3dpbjMyLWFzLgotICAgICAKLSAgIE9oLCBhbmQgZ2l2ZW4sIGFyZ3ZbMF0gPSBkbGx0b29sLCBpdCdsbCByZXR1cm4gImFzIi4KLQotICAgUmV0dXJucyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1kZWR1Y2VfbmFtZSAocHJvZ19uYW1lKQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci17Ci0gIGNoYXIgKmNtZDsKLSAgY2hhciAqZGFzaCwgKnNsYXNoLCAqY3A7Ci0KLSAgZGFzaCA9IE5VTEw7Ci0gIHNsYXNoID0gTlVMTDsKLSAgZm9yIChjcCA9IHByb2dyYW1fbmFtZTsgKmNwICE9ICdcMCc7ICsrY3ApCi0gICAgewotICAgICAgaWYgKCpjcCA9PSAnLScpCi0JZGFzaCA9IGNwOwotICAgICAgaWYgKAotI2lmIGRlZmluZWQoX19ESkdQUF9fKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKLQkgICpjcCA9PSAnOicgfHwgKmNwID09ICdcXCcgfHwKLSNlbmRpZgotCSAgKmNwID09ICcvJykKLQl7Ci0JICBzbGFzaCA9IGNwOwotCSAgZGFzaCA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBjbWQgPSBOVUxMOwotCi0gIGlmIChkYXNoICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRmlyc3QsIHRyeSBsb29raW5nIGZvciBhIHByZWZpeGVkIFBST0dfTkFNRSBpbiB0aGUKLSAgICAgICAgIFBST0dSQU1fTkFNRSBkaXJlY3RvcnksIHdpdGggdGhlIHNhbWUgcHJlZml4IGFzIFBST0dSQU1fTkFNRS4gICovCi0gICAgICBjbWQgPSBsb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByb2dyYW1fbmFtZSwgZGFzaCAtIHByb2dyYW1fbmFtZSArIDEpOwotICAgIH0KLQotICBpZiAoc2xhc2ggIT0gTlVMTCAmJiBjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOZXh0LCB0cnkgbG9va2luZyBmb3IgYSBQUk9HX05BTUUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzCi0gICAgICAgICB0aGF0IG9mIHRoaXMgcHJvZ3JhbS4gICovCi0gICAgICBjbWQgPSBsb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByb2dyYW1fbmFtZSwgc2xhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKGNtZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEp1c3QgcmV0dXJuIFBST0dfTkFNRSBhcyBpcy4gICovCi0gICAgICBjbWQgPSB4c3RyZHVwIChwcm9nX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gY21kOwotfQotCi1zdGF0aWMgdm9pZAotZGVsZXRlX3RlbXBfZmlsZXMgKCkKLXsKLSAgaWYgKGRlbGV0ZV9iYXNlX2ZpbGUgJiYgYmFzZV9maWxlX25hbWUpCi0gICAgewotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGJhc2UgZmlsZSAlc1xuIiwKLQkJIGRvbnRkZWx0ZW1wcyA/ICJLZWVwaW5nIiA6ICJEZWxldGluZyIsCi0JICAgICAgICAgYmFzZV9maWxlX25hbWUpOwotICAgICAgaWYgKCEgZG9udGRlbHRlbXBzKQotICAgICAgICB7Ci0gICAgICAgICAgdW5saW5rIChiYXNlX2ZpbGVfbmFtZSk7Ci0JICBmcmVlIChiYXNlX2ZpbGVfbmFtZSk7Ci0JfQotICAgIH0KLSAgCi0gIGlmIChkZWxldGVfZXhwX2ZpbGUgJiYgZXhwX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBpZiAodmVyYm9zZSkKLQlmcHJpbnRmIChzdGRlcnIsICIlcyB0ZW1wb3JhcnkgZXhwIGZpbGUgJXNcbiIsCi0JCSBkb250ZGVsdGVtcHMgPyAiS2VlcGluZyIgOiAiRGVsZXRpbmciLAotCSAgICAgICAgIGV4cF9maWxlX25hbWUpOwotICAgICAgaWYgKCEgZG9udGRlbHRlbXBzKQotICAgICAgICB7Ci0gICAgICAgICAgdW5saW5rIChleHBfZmlsZV9uYW1lKTsKLSAgICAgICAgICBmcmVlIChleHBfZmlsZV9uYW1lKTsKLQl9Ci0gICAgfQotICBpZiAoZGVsZXRlX2RlZl9maWxlICYmIGRlZl9maWxlX25hbWUpCi0gICAgewotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGRlZiBmaWxlICVzXG4iLAotCQkgZG9udGRlbHRlbXBzID8gIktlZXBpbmciIDogIkRlbGV0aW5nIiwKLQkgICAgICAgICBkZWZfZmlsZV9uYW1lKTsKLSAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKLSAgICAgICAgewotICAgICAgICAgIHVubGluayAoZGVmX2ZpbGVfbmFtZSk7Ci0gICAgICAgICAgZnJlZSAoZGVmX2ZpbGVfbmFtZSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgCi1jbGVhbnVwX2FuZF9leGl0IChpbnQgc3RhdHVzKQotewotICBkZWxldGVfdGVtcF9maWxlcyAoKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLSAgCi1zdGF0aWMgaW50Ci1ydW4gKHdoYXQsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKndoYXQ7Ci0gICAgIGNoYXIgKmFyZ3M7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBwaWQsIHdhaXRfc3RhdHVzLCByZXRjb2RlOwotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqKmFyZ3Y7Ci0gIGNoYXIgKmVycm1zZ19mbXQsICplcnJtc2dfYXJnOwotICBjaGFyICp0ZW1wX2Jhc2UgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBpbnQgaW5fcXVvdGU7Ci0gIGNoYXIgc2VwOwotCi0gIGlmICh2ZXJib3NlIHx8IGRyeV9ydW4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXMgJXNcbiIsIHdoYXQsIGFyZ3MpOwotCi0gIC8qIENvdW50IHRoZSBhcmdzICovCi0gIGkgPSAwOwotICBmb3IgKHMgPSBhcmdzOyAqczsgcysrKQotICAgIGlmICgqcyA9PSAnICcpCi0gICAgICBpKys7Ci0gIGkrKzsKLSAgYXJndiA9IGFsbG9jYSAoc2l6ZW9mIChjaGFyICopICogKGkgKyAzKSk7Ci0gIGkgPSAwOwotICBhcmd2W2krK10gPSB3aGF0OwotICBzID0gYXJnczsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgd2hpbGUgKCpzID09ICcgJyAmJiAqcyAhPSAwKQotCXMrKzsKLSAgICAgIGlmICgqcyA9PSAwKQotCWJyZWFrOwotICAgICAgaW5fcXVvdGUgPSAoKnMgPT0gJ1wnJyB8fCAqcyA9PSAnIicpOwotICAgICAgc2VwID0gKGluX3F1b3RlKSA/ICpzKysgOiAnICc7Ci0gICAgICBhcmd2W2krK10gPSBzOwotICAgICAgd2hpbGUgKCpzICE9IHNlcCAmJiAqcyAhPSAwKQotCXMrKzsKLSAgICAgIGlmICgqcyA9PSAwKQotCWJyZWFrOwotICAgICAgKnMrKyA9IDA7Ci0gICAgICBpZiAoaW5fcXVvdGUpCi0gICAgICAgIHMrKzsKLSAgICB9Ci0gIGFyZ3ZbaSsrXSA9IE5VTEw7Ci0KLSAgaWYgKGRyeV9ydW4pCi0gICAgcmV0dXJuIDA7Ci0KLSAgcGlkID0gcGV4ZWN1dGUgKGFyZ3ZbMF0sIChjaGFyICogY29uc3QgKikgYXJndiwgcHJvZ3JhbV9uYW1lLCB0ZW1wX2Jhc2UsCi0JCSAgJmVycm1zZ19mbXQsICZlcnJtc2dfYXJnLCBQRVhFQ1VURV9PTkUgfCBQRVhFQ1VURV9TRUFSQ0gpOwotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgaW50IGVycm5vX3ZhbCA9IGVycm5vOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6ICVzXG4iLCBzdHJlcnJvciAoZXJybm9fdmFsKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0Y29kZSA9IDA7Ci0gIHBpZCA9IHB3YWl0IChwaWQsICZ3YWl0X3N0YXR1cywgMCk7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHdhaXQ6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgcmV0Y29kZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChXSUZTSUdOQUxFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWRcbiIsCi0JICAgICAgIHByb2dyYW1fbmFtZSwgV1RFUk1TSUcgKHdhaXRfc3RhdHVzKSk7Ci0gICAgICByZXRjb2RlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRkVYSVRFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGlmIChXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpICE9IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwKLQkgIAkgICBwcm9ncmFtX25hbWUsIHdoYXQsIFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykpOwotCSAgcmV0Y29kZSA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHJldGNvZGUgPSAxOwotICAKLSAgcmV0dXJuIHJldGNvZGU7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW15YmFzZW5hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKmJhc2UgPSBuYW1lOwotCi0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUgPT0gJy8nIHx8ICpuYW1lID09ICdcXCcpCi0JewotCSAgYmFzZSA9IG5hbWUgKyAxOwotCX0KLSAgICAgICsrbmFtZTsKLSAgICB9Ci0gIHJldHVybiAoY2hhciAqKSBiYXNlOwotfQotCi1zdGF0aWMgaW50IAotc3RyaGFzaCAoY29uc3QgY2hhciAqc3RyKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIGhhc2ggPSAwOwotICBsZW4gPSAwOwotICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyOwotICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggKz0gYyArIChjIDw8IDE3KTsKLSAgICAgIGhhc2ggXj0gaGFzaCA+PiAyOwotICAgICAgKytsZW47Ci0gICAgfQotICBoYXNoICs9IGxlbiArIChsZW4gPDwgMTcpOwotICBoYXNoIF49IGhhc2ggPj4gMjsKLQotICByZXR1cm4gaGFzaDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLXByaW50X3ZlcnNpb24gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoIkdOVSAlcyAlc1xuIiwgbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKLSAgcHJpbnRmICgiQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKTsKLSAgcHJpbnRmICgiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIik7Ci0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIiwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgR2VuZXJpYyBvcHRpb25zOlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXF1aWV0LCAtcSAgICAgICAgICAgIFdvcmsgcXVpZXRseVxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXZlcmJvc2UsIC12ICAgICAgICAgIFZlcmJvc2VcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS12ZXJzaW9uICAgICAgICAgICAgICBQcmludCBkbGx3cmFwIHZlcnNpb25cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1pbXBsaWIgPG91dG5hbWU+ICAgICBTeW5vbnltIGZvciAtLW91dHB1dC1saWJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICBPcHRpb25zIGZvciAlczpcbiIsIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRyaXZlci1uYW1lIDxkcml2ZXI+IERlZmF1bHRzIHRvIFwiZ2NjXCJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcml2ZXItZmxhZ3MgPGZsYWdzPiBPdmVycmlkZSBkZWZhdWx0IGxkIGZsYWdzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGxsdG9vbC1uYW1lIDxkbGx0b29sPiBEZWZhdWx0cyB0byBcImRsbHRvb2xcIlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWVudHJ5IDxlbnRyeT4gICAgICAgIFNwZWNpZnkgYWx0ZXJuYXRlIERMTCBlbnRyeSBwb2ludFxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWltYWdlLWJhc2UgPGJhc2U+ICAgIFNwZWNpZnkgaW1hZ2UgYmFzZSBhZGRyZXNzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tdGFyZ2V0IDxtYWNoaW5lPiAgICAgaTM4Ni1jeWd3aW4zMiBvciBpMzg2LW1pbmd3MzJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcnktcnVuICAgICAgICAgICAgICBTaG93IHdoYXQgbmVlZHMgdG8gYmUgcnVuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbW5vLWN5Z3dpbiAgICAgICAgICAgQ3JlYXRlIE1pbmd3IERMTFxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgIE9wdGlvbnMgcGFzc2VkIHRvIERMTFRPT0w6XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbWFjaGluZSA8bWFjaGluZT5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBleHBvcnQgZmlsZS5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtbGliIDxvdXRuYW1lPiBHZW5lcmF0ZSBpbnB1dCBsaWJyYXJ5LlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIG91dHB1dCBsaWIuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGVmIDxkZWZmaWxlPiAgICAgICAgTmFtZSBpbnB1dCAuZGVmIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG91dHB1dCAuZGVmIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCAuZHJlY3R2ZSBzeW1ib2xzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiBFeGNsdWRlIDxsaXN0PiBmcm9tIC5kZWZcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzICAgIFphcCBkZWZhdWx0IGV4Y2x1ZGUgc3ltYm9sc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWJhc2UtZmlsZSA8YmFzZWZpbGU+IFJlYWQgbGlua2VyIGdlbmVyYXRlZCBiYXNlIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1pZGF0YTQgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvblxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vLWlkYXRhNSAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC1VICAgICAgICAgICAgICAgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIC5saWJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLWsgICAgICAgICAgICAgICAgICAgICBLaWxsIEA8bj4gZnJvbSBleHBvcnRlZCBuYW1lc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlclxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vZGVsZXRlICAgICAgICAgICAgIEtlZXAgdGVtcCBmaWxlcy5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICBSZXN0IGFyZSBwYXNzZWQgdW5tb2RpZmllZCB0byB0aGUgbGFuZ3VhZ2UgZHJpdmVyXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuXG4iKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotI2RlZmluZSBPUFRJT05fU1RBUlQJCTE0OQotCi0vKiBHRU5FUklDIG9wdGlvbnMuICovCi0jZGVmaW5lIE9QVElPTl9RVUlFVAkJKE9QVElPTl9TVEFSVCArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJCT1NFCQkoT1BUSU9OX1FVSUVUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCShPUFRJT05fVkVSQk9TRSArIDEpCi0KLS8qIERMTFdSQVAgb3B0aW9ucy4gKi8KLSNkZWZpbmUgT1BUSU9OX0RSWV9SVU4JCShPUFRJT05fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9EUklWRVJfTkFNRQkoT1BUSU9OX0RSWV9SVU4gKyAxKQotI2RlZmluZSBPUFRJT05fRFJJVkVSX0ZMQUdTCShPUFRJT05fRFJJVkVSX05BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fRExMVE9PTF9OQU1FCShPUFRJT05fRFJJVkVSX0ZMQUdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VOVFJZCQkoT1BUSU9OX0RMTFRPT0xfTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCShPUFRJT05fRU5UUlkgKyAxKQotI2RlZmluZSBPUFRJT05fVEFSR0VUCQkoT1BUSU9OX0lNQUdFX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fTU5PX0NZR1dJTgkoT1BUSU9OX1RBUkdFVCArIDEpCi0KLS8qIERMTFRPT0wgb3B0aW9ucy4gKi8KLSNkZWZpbmUgT1BUSU9OX05PREVMRVRFCQkoT1BUSU9OX01OT19DWUdXSU4gKyAxKQotI2RlZmluZSBPUFRJT05fRExMTkFNRQkJKE9QVElPTl9OT0RFTEVURSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19JREFUQTQgCShPUFRJT05fRExMTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19JREFUQTUJKE9QVElPTl9OT19JREFUQTQgKyAxKQotI2RlZmluZSBPUFRJT05fT1VUUFVUX0VYUAkoT1BUSU9OX05PX0lEQVRBNSArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfREVGCShPUFRJT05fT1VUUFVUX0VYUCArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJKE9QVElPTl9PVVRQVVRfREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUyAoT1BUSU9OX0VYUE9SVF9BTExfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWENMVURFX1NZTVMJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyAoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfTElCCShPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyArIDEpCi0jZGVmaW5lIE9QVElPTl9ERUYJCShPUFRJT05fT1VUUFVUX0xJQiArIDEpCi0jZGVmaW5lIE9QVElPTl9BRERfVU5ERVJTQ09SRQkoT1BUSU9OX0RFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9LSUxMQVQJCShPUFRJT05fQUREX1VOREVSU0NPUkUgKyAxKQotI2RlZmluZSBPUFRJT05fSEVMUAkJKE9QVElPTl9LSUxMQVQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFDSElORQkJKE9QVElPTl9IRUxQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FERF9JTkRJUkVDVAkoT1BUSU9OX01BQ0hJTkUgKyAxKQotI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCShPUFRJT05fQUREX0lORElSRUNUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FTCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgLyogZ2VuZXJpYyBvcHRpb25zLiAqLwotICB7InF1aWV0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdxJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAotICB7ImltcGxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUUFVUX0xJQn0sCi0KLSAgLyogZGxsd3JhcCBvcHRpb25zLiAqLwotICB7ImRyeS1ydW4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RSWV9SVU59LAotICB7ImRyaXZlci1uYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfTkFNRX0sCi0gIHsiZHJpdmVyLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfRkxBR1N9LAotICB7ImRsbHRvb2wtbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMVE9PTF9OQU1FfSwKLSAgeyJlbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEFSR0VUfSwKLQotICAvKiBkbGx0b29sIG9wdGlvbnMuICovCi0gIHsibm8tZGVsZXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsiZGxsbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMTkFNRX0sCi0gIHsibm8taWRhdGE0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19JREFUQTR9LAotICB7Im5vLWlkYXRhNSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fSURBVEE1fSwKLSAgeyJvdXRwdXQtZXhwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfRVhQfSwKLSAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfREVGfSwKLSAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTExfU1lNU30sCi0gIHsibm8tZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVN9LAotICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1TfSwKLSAgeyJuby1kZWZhdWx0LWV4Y2x1ZGVzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTfSwKLSAgeyJvdXRwdXQtbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfTElCfSwKLSAgeyJkZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRn0sCi0gIHsiYWRkLXVuZGVyc2NvcmUiLCBub19hcmd1bWVudCwgTlVMTCwgJ1UnfSwKLSAgeyJraWxsYXQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2snfSwKLSAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJtYWNoaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUNISU5FfSwKLSAgeyJhZGQtaW5kaXJlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FERF9JTkRJUkVDVH0sCi0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAotICB7ImFzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU30sCi0gIHswfQotfTsKLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgaTsKLQotICBjaGFyICoqc2F2ZWRfYXJndiA9IDA7Ci0gIGludCBjbWRsaW5lX2xlbiA9IDA7Ci0KLSAgaW50IGV4cG9ydF9hbGwgPSAwOwotCi0gIGludCAqZGxsdG9vbF9hcmdfaW5kaWNlczsKLSAgaW50ICpkcml2ZXJfYXJnX2luZGljZXM7Ci0KLSAgY2hhciAqZHJpdmVyX2ZsYWdzID0gMDsKLSAgY2hhciAqb3V0cHV0X2xpYl9maWxlX25hbWUgPSAwOwotCi0gIGR5bl9zdHJpbmdfdCBkbGx0b29sX2NtZGxpbmU7Ci0gIGR5bl9zdHJpbmdfdCBkcml2ZXJfY21kbGluZTsKLQotICBpbnQgZGVmX2ZpbGVfc2VlbiA9IDA7Ci0KLSAgY2hhciAqaW1hZ2VfYmFzZV9zdHIgPSAwOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgc2F2ZWRfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChjaGFyKikpOwotICBkbGx0b29sX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKLSAgZHJpdmVyX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKLSAgZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJndltpXSk7Ci0gICAgICBjaGFyICphcmcgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cmNweSAoYXJnLCBhcmd2W2ldKTsKLSAgICAgIGNtZGxpbmVfbGVuICs9IGxlbjsKLSAgICAgIHNhdmVkX2FyZ3ZbaV0gPSBhcmc7Ci0gICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW2ldID0gMDsKLSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tpXSA9IDE7Ci0gICAgfQotICBjbWRsaW5lX2xlbisrOwotCi0gIC8qIFdlIHJlY29nbml6ZSBkbGx3cmFwIGFuZCBkbGx0b29sIG9wdGlvbnMsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMKLSAgICAgcGFzc2VkIG9udG8gdGhlIGxhbmd1YWdlIGRyaXZlciAoZWcuLCB0byBHQ0MpLiBXZSBjb2xsZWN0IG9wdGlvbnMKLSAgICAgdG8gZGxsdG9vbCBhbmQgZHJpdmVyIGluIGRsbHRvb2xfYXJncyBhbmQgZHJpdmVyX2FyZ3MuICovCi0gICAKLSAgb3B0ZXJyID0gMDsKLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIm5rQXF2ZTpVaG86bDpMOkk6IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGludCBkbGx0b29sX2FyZzsKLSAgICAgIGludCBkcml2ZXJfYXJnOwotICAgICAgaW50IHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyOwotCi0gICAgICBkbGx0b29sX2FyZyA9IDA7Ci0gICAgICBkcml2ZXJfYXJnID0gMTsKLSAgICAgIHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMDsKLQotICAgICAgaWYgKGMgIT0gJz8nKQotICAgICAgICB7Ci0JICAvKiBXZSByZWNvZ25pemUgdGhpcyBvcHRpb24sIHNvIGl0IGhhcyB0byBiZSBlaXRoZXIgZGxsd3JhcCBvcgotCSAgICAgZGxsdG9vbCBvcHRpb24uIERvIG5vdCBwYXNzIHRvIGRyaXZlciB1bmxlc3MgaXQncyBvbmUgb2YgdGhlCi0JICAgICBnZW5lcmljIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIGFsbCB0aGUgdG9vbHMgKHN1Y2ggYXMgLXYpCi0JICAgICB3aGljaCBhcmUgZGVhbHQgd2l0aCBsYXRlci4gKi8KLQkgIGRyaXZlcl9hcmcgPSAwOwotCX0KLQotICAgICAgLyogZGVhbCB3aXRoIGdlbmVyaWMgYW5kIGRsbHdyYXAgb3B0aW9ucyBmaXJzdC4gKi8KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgdmVyYm9zZSA9IDA7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIHByaW50X3ZlcnNpb24gKHByb2dyYW1fbmFtZSk7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGVudHJ5X3BvaW50ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLQkgIGltYWdlX2Jhc2Vfc3RyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVGOgotCSAgZGVmX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGRlZl9maWxlX3NlZW4gPSAxOwotCSAgZGVsZXRlX2RlZl9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgZG9udGRlbHRlbXBzID0gMTsKLQkgIGRsbHRvb2xfYXJnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgZGxsX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCWNhc2UgJ2wnOgotCWNhc2UgJ0wnOgotCSAgZHJpdmVyX2FyZyA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ETExOQU1FOgotCSAgZGxsX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUllfUlVOOgotCSAgZHJ5X3J1biA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUklWRVJfTkFNRToKLQkgIGRyaXZlcl9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFJJVkVSX0ZMQUdTOgotCSAgZHJpdmVyX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRExMVE9PTF9OQU1FOgotCSAgZGxsdG9vbF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEFSR0VUOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTU5PX0NZR1dJTjoKLQkgIHRhcmdldCA9ICJpMzg2LW1pbmd3MzIiOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotCSAgYmFzZV9maWxlX25hbWUgPSBvcHRhcmc7Ci0JICBkZWxldGVfYmFzZV9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX09VVFBVVF9FWFA6Ci0JICBleHBfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgZGVsZXRlX2V4cF9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGwgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fT1VUUFVUX0xJQjoKLQkgIG91dHB1dF9saWJfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnPyc6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZGxsdG9vbF9hcmcgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICAvKiBIYW5kbGUgcGFzc2luZyB0aHJvdWdoIC0tb3B0aW9uPXZhbHVlIGNhc2UuICovCi0gICAgICBpZiAob3B0YXJnIAotICAgICAgICAgICYmIHNhdmVkX2FyZ3Zbb3B0aW5kLTFdWzBdID09ICctJyAKLSAgICAgICAgICAmJiBzYXZlZF9hcmd2W29wdGluZC0xXVsxXSA9PSAnLScgCi0JICAmJiBzdHJjaHIgKHNhdmVkX2FyZ3Zbb3B0aW5kLTFdLCAnPScpKQotCXNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMTsKLQotICAgICAgaWYgKGRsbHRvb2xfYXJnKQotICAgICAgICB7Ci0JICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0xXSA9IDE7Ci0JICBpZiAob3B0YXJnICYmICEgc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXIpCi0JICAgIHsKLQkgICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0yXSA9IDE7Ci0JICAgIH0gCi0JfQotCi0gICAgICBpZiAoISBkcml2ZXJfYXJnKQotICAgICAgICB7Ci0JICBkcml2ZXJfYXJnX2luZGljZXNbb3B0aW5kLTFdID0gMDsKLQkgIGlmIChvcHRhcmcgJiYgISBzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpcikKLQkgICAgewotCSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tvcHRpbmQtMl0gPSAwOwotCSAgICB9IAotCX0KLSAgICB9Ci0KLSAgLyogc2FuaXR5IGNoZWNrcy4gKi8KLSAgaWYgKCEgZGxsX25hbWUgJiYgISBkbGxfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgICAgICIlczogTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBvZiAtbyBvciAtLWRsbG5hbWUgb3B0aW9uc1xuIiwKLSAgICAgICAgICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZGxsX25hbWUpCi0gICAgewotICAgICAgZGxsX25hbWUgPSB4c3RyZHVwIChteWJhc2VuYW1lIChkbGxfZmlsZV9uYW1lKSk7Ci0gICAgfQotICBlbHNlIGlmICghIGRsbF9maWxlX25hbWUpCi0gICAgewotICAgICAgZGxsX2ZpbGVfbmFtZSA9IHhzdHJkdXAgKGRsbF9uYW1lKTsKLSAgICB9Ci0KLSAgLyogRGVkdWNlIGRyaXZlci1uYW1lIGFuZCBkbGx0b29sLW5hbWUgZnJvbSBvdXIgb3duLiAqLwotICBpZiAoZHJpdmVyX25hbWUgPT0gTlVMTCkKLSAgICBkcml2ZXJfbmFtZSA9IGRlZHVjZV9uYW1lICgiZ2NjIik7Ci0KLSAgaWYgKGRsbHRvb2xfbmFtZSA9PSBOVUxMKQotICAgIGRsbHRvb2xfbmFtZSA9IGRlZHVjZV9uYW1lICgiZGxsdG9vbCIpOwotCi0gIGlmICghIGRlZl9maWxlX3NlZW4pCi0gICAgewotICAgICAgY2hhciAqZmlsZXByZWZpeCA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gICAgICBkZWZfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDUpOwotICAgICAgc3ByaW50ZiAoZGVmX2ZpbGVfbmFtZSwgIiVzLmRlZiIsIAotICAgICAgICAgICAgICAgKGRvbnRkZWx0ZW1wcykgPyBteWJhc2VuYW1lIChmaWxlcHJlZml4KSA6IGZpbGVwcmVmaXgpOwotICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IG5vIGV4cG9ydCBkZWZpbml0aW9uIGZpbGUgcHJvdmlkZWRcbiIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAKLSAgICAgICAgICAgICAgICJkbGx3cmFwIHdpbGwgY3JlYXRlIG9uZSwgYnV0IG1heSBub3QgYmUgd2hhdCB5b3Ugd2FudFxuIik7Ci0gICAgfQotICAKLSAgLyogc2V0IHRoZSB0YXJnZXQgcGxhdGZvcm0uICovCi0gIGlmIChzdHJzdHIgKHRhcmdldCwgImN5Z3dpbjMyIikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gQ1lHV0lOX1RBUkdFVDsKLSAgZWxzZSBpZiAoc3Ryc3RyICh0YXJnZXQsICJtaW5ndzMyIikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gTUlOR1czMl9UQVJHRVQ7Ci0gIGVsc2UgCi0gICAgd2hpY2hfdGFyZ2V0ID0gVU5LTk9XTl9UQVJHRVQ7Ci0KLSAgLyogcmUtY3JlYXRlIHRoZSBjb21tYW5kIGxpbmVzIGFzIGEgc3RyaW5nLCB0YWtpbmcgY2FyZSB0byBxdW90ZSBzdHVmZi4gKi8KLSAgZGxsdG9vbF9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtdiIpOwotICAgIH0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtLWRsbG5hbWUgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGRsbF9uYW1lKTsKLQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKQotICAgIHsKLSAgICAgIGlmIChkbGx0b29sX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgCi0JICAgICAgICAgICAgICAgICAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGFyZyk7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotCi0gIGRyaXZlcl9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKLSAgaWYgKCEgZHJpdmVyX2ZsYWdzIHx8IHN0cmxlbiAoZHJpdmVyX2ZsYWdzKSA9PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAod2hpY2hfdGFyZ2V0KQotICAgICAgICB7Ci0JY2FzZSBDWUdXSU5fVEFSR0VUOgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IGN5Z3dpbl9kcml2ZXJfZmxhZ3M7Ci0JICBicmVhazsKLQkKLQljYXNlIE1JTkdXMzJfVEFSR0VUOgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IG1pbmd3MzJfZHJpdmVyX2ZsYWdzOwotCSAgYnJlYWs7Ci0JCi0JZGVmYXVsdDoKLSAgICAgICAgICBkcml2ZXJfZmxhZ3MgPSBnZW5lcmljX2RyaXZlcl9mbGFnczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZHJpdmVyX2ZsYWdzKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAiIC1vICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGRsbF9maWxlX25hbWUpOwotCi0gIGlmICghIGVudHJ5X3BvaW50IHx8IHN0cmxlbiAoZW50cnlfcG9pbnQpID09IDApCi0gICAgewotICAgICAgc3dpdGNoICh3aGljaF90YXJnZXQpCi0gICAgICAgIHsKLQljYXNlIENZR1dJTl9UQVJHRVQ6Ci0JICBlbnRyeV9wb2ludCA9ICJfX2N5Z3dpbl9kbGxfZW50cnlAMTIiOwotCSAgYnJlYWs7Ci0JCi0JY2FzZSBNSU5HVzMyX1RBUkdFVDoKLQkgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQ1JUU3RhcnR1cEAxMiI7Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotICAgICAgICAgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQDEyIjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLWUsIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZW50cnlfcG9pbnQpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZXhjbHVkZS1zeW1ib2w9Iik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgKGVudHJ5X3BvaW50WzBdID09ICdfJykgPyBlbnRyeV9wb2ludCsxIDogZW50cnlfcG9pbnQpOwotCi0gIGlmICghIGltYWdlX2Jhc2Vfc3RyIHx8IHN0cmxlbiAoaW1hZ2VfYmFzZV9zdHIpID09IDApCi0gICAgewotICAgICAgY2hhciAqdG1wYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICgiMHgxMjM0NTY3OCIpICsgMSk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhhc2ggPSBzdHJoYXNoIChkbGxfZmlsZV9uYW1lKTsKLSAgICAgIHNwcmludGYgKHRtcGJ1ZiwgIjB4JS44bFgiLCAweDYwMDAwMDAwfCgoaGFzaDw8MTYpJjB4RkZDMDAwMCkpOwotICAgICAgaW1hZ2VfYmFzZV9zdHIgPSB0bXBidWY7Ci0gICAgfQotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLS1pbWFnZS1iYXNlLCIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGltYWdlX2Jhc2Vfc3RyKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsICIgLXYiKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoZHJpdmVyX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIiBcIiIgOiAiICIpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBhcmcpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotICAKLSAgLyoKLSAgICogU3RlcCBwcmUtMS4gSWYgbm8gLS1kZWYgPEVYUE9SVF9ERUY+IGlzIHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgaXQKLSAgICogYW5kIHRoZW4gcGFzcyBpdCBvbi4KLSAgICovCi0gIAotICBpZiAoISBkZWZfZmlsZV9zZWVuKSAKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGR5bl9zdHJpbmdfdCBzdGVwX3ByZTE7Ci0KLSAgICAgIHN0ZXBfcHJlMSA9IGR5bl9zdHJpbmdfbmV3ICgxMDI0KTsKLQotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIGlmIChleHBvcnRfYWxsKQotCXsKLSAgICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCAiIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9sPSIpOwotICAgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsIAotCSAgIl9jeWd3aW5fZGxsX2VudHJ5QDEyLERsbE1haW5DUlRTdGFydHVwQDEyLERsbE1haW5AMTIsRGxsRW50cnlQb2ludEAxMiIpOwotCX0KLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsICIgLS1vdXRwdXQtZGVmICIpOwotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGVmX2ZpbGVfbmFtZSk7Ci0KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0JewotCSAgaWYgKGRyaXZlcl9hcmdfaW5kaWNlc1tpXSkKLQkgICAgewotCSAgICAgIGNoYXIgKmFyZyA9IHNhdmVkX2FyZ3ZbaV07Ci0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJnKTsKLQkgICAgICBpZiAobGVuID49IDIgJiYgYXJnW2xlbi0yXSA9PSAnLicgCi0JICAgICAgICAgICYmIChhcmdbbGVuLTFdID09ICdvJyB8fCBhcmdbbGVuLTFdID09ICdhJykpCi0JCXsKLQkJICBpbnQgcXVvdGUgPSAoc3RyY2hyIChhcmcsICcgJykgfHwgc3RyY2hyIChhcmcsICdcdCcpKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLAotCQkJCSAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCBhcmcpOwotCQkgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsCi0JCQkJICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXBfcHJlMS0+cykpCi0JY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgICAKLSAgICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwX3ByZTEpOwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZGVmICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCBkZWZfZmlsZV9uYW1lKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJETExUT09MIG5hbWUgICAgOiAlc1xuIiwgZGxsdG9vbF9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRMTFRPT0wgb3B0aW9ucyA6ICVzXG4iLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRFJJVkVSIG5hbWUgICAgIDogJXNcbiIsIGRyaXZlcl9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRSSVZFUiBvcHRpb25zICA6ICVzXG4iLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgfQotIAotICAvKgotICAgKiBTdGVwIDEuIENhbGwgR0NDL0xEIHRvIGNyZWF0ZSBiYXNlIHJlbG9jYXRpb24gZmlsZS4gSWYgdXNpbmcgR0NDLCB0aGUKLSAgICogZHJpdmVyIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBnY2MgLVdsLC0tZGxsIC0tV2wsLS1iYXNlLWZpbGUsZm9vLmJhc2UgW3Jlc3Qgb2YgY29tbWFuZCBsaW5lXQotICAgKgotICAgKiBJZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGEgYmFzZSBuYW1lLCBjcmVhdGUgdGVtcG9yYXJ5IG9uZSB0aGF0Ci0gICAqIGlzIGRlbGV0ZWQgYXQgZXhpdC4KLSAgICoKLSAgICovCi0gIAotICBpZiAoISBiYXNlX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlcHJlZml4ID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgICAgIGJhc2VfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDYpOwotICAgICAgc3ByaW50ZiAoYmFzZV9maWxlX25hbWUsICIlcy5iYXNlIiwgCi0gICAgICAgICAgICAgICAoZG9udGRlbHRlbXBzKSA/IG15YmFzZW5hbWUgKGZpbGVwcmVmaXgpIDogZmlsZXByZWZpeCk7Ci0gICAgICBkZWxldGVfYmFzZV9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgIH0KLSAgCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDEgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGJhc2VfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIi1XbCwtLWJhc2UtZmlsZSwiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDEsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDEtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAxKTsKLSAgfQotCi0KLQotICAvKgotICAgKiBTdGVwIDIuIGdlbmVyYXRlIHRoZSBleHAgZmlsZSBieSBydW5uaW5nIGRsbHRvb2wuIAotICAgKiBkbGx0b29sIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBkbGx0b29sIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIFtyZXN0IG9mIGNvbW1hbmQgbGluZV0KLSAgICoKLSAgICogSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhIGJhc2UgbmFtZSwgY3JlYXRlIHRlbXBvcmFyeSBvbmUgdGhhdAotICAgKiBpcyBkZWxldGVkIGF0IGV4aXQuCi0gICAqCi0gICAqLwotICAKLSAgaWYgKCEgZXhwX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpwID0gc3RycmNociAoZGxsX25hbWUsICcuJyk7Ci0gICAgICBzaXplX3QgcHJlZml4X2xlbiA9IChwKSA/IHAgLSBkbGxfbmFtZSA6IHN0cmxlbiAoZGxsX25hbWUpOwotICAgICAgZXhwX2ZpbGVfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHByZWZpeF9sZW4gKyA0ICsgMSk7Ci0gICAgICBzdHJuY3B5IChleHBfZmlsZV9uYW1lLCBkbGxfbmFtZSwgcHJlZml4X2xlbik7Ci0gICAgICBleHBfZmlsZV9uYW1lW3ByZWZpeF9sZW5dID0gJ1wwJzsKLSAgICAgIHN0cmNhdCAoZXhwX2ZpbGVfbmFtZSwgIi5leHAiKTsKLSAgICAgIGRlbGV0ZV9leHBfZmlsZSA9IDE7Ci0gICAgfQotICAKLSAgewotICAgIGludCBxdW90ZTsKLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDIgPSBkeW5fc3RyaW5nX25ldyAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChiYXNlX2ZpbGVfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsICItLWJhc2UtZmlsZSAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiAiIDogIiAiKTsKLQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIi0tb3V0cHV0LWV4cCAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIGV4cF9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0KLSAgICBpZiAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgfQotCi0gICAgaWYgKHJ1biAoZGxsdG9vbF9uYW1lLCBzdGVwMi0+cykpCi0gICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAKLSAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDIpOwotICB9Ci0KLSAgLyoKLSAgICogU3RlcCAzLiBDYWxsIEdDQy9MRCB0byBhZ2FpbiwgYWRkaW5nIHRoZSBleHAgZmlsZSB0aGlzIHRpbWUuCi0gICAqIGRyaXZlciBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICogICAgCi0gICAqICAgICUgZ2NjIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIGZvby5leHAgW3Jlc3QgLi4uXQotICAgKi8KLQotICB7Ci0gICAgaW50IHF1b3RlOwotCi0gICAgZHluX3N0cmluZ190IHN0ZXAzID0gZHluX3N0cmluZ19uZXcgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAiLVdsLC0tYmFzZS1maWxlLCIpOwotICAgIHF1b3RlID0gKHN0cmNociAoYmFzZV9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBiYXNlX2ZpbGVfbmFtZSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiICIgOiAiICIpOwotCi0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDMtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAzKTsKLSAgfQotCi0KLSAgLyoKLSAgICogU3RlcCA0LiBSdW4gRExMVE9PTCBhZ2FpbiB1c2luZyB0aGUgc2FtZSBjb21tYW5kIGxpbmUuCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0gICAgZHluX3N0cmluZ190IHN0ZXA0ID0gZHluX3N0cmluZ19uZXcgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiLS1iYXNlLWZpbGUgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJyAnKSAKLSAgICAgICAgICAgICB8fCBzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIGJhc2VfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIgIiA6ICIgIik7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICItLW91dHB1dC1leHAgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoKQotICAgICAgewotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICIgIik7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIH0KLQotICAgIGlmIChvdXRwdXRfbGliX2ZpbGVfbmFtZSkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiIC0tb3V0cHV0LWxpYiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBvdXRwdXRfbGliX2ZpbGVfbmFtZSk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXA0LT5zKSkKLSAgICAgIGNsZWFudXBfYW5kX2V4aXQgKDEpOwotICAgIAotICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwNCk7Ci0gIH0KLSAgCi0KLSAgLyoKLSAgICogU3RlcCA1LiBMaW5rIGl0IGFsbCB0b2dldGhlciBhbmQgYmUgZG9uZSB3aXRoIGl0LgotICAgKiBkcml2ZXIgY29tbWFuZCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAqICAgIAotICAgKiAgICAlIGdjYyAtV2wsLS1kbGwgZm9vLmV4cCBbcmVzdCAuLi5dCi0gICAqCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDUgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDUsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDUtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXA1KTsKLSAgfQotCi0gIGNsZWFudXBfYW5kX2V4aXQgKDApOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5jIGIvYmludXRpbHMvZHluLXN0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTY0MDE4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKiBBbiBhYnN0cmFjdCBzdHJpbmcgZGF0YXR5cGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLSAgIEdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBiaW51dGlscyBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpZmRlZiBJTl9HQ0MKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLSNpbmNsdWRlICJnYW5zaWRlY2wuaCIKLSNlbHNlCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNlbmRpZgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7Ci1leHRlcm4gY2hhciAqeHJlYWxsb2MgKCk7Ci0KLS8qIENyZWF0ZSBhIG5ldyBkeW5hbWljIHN0cmluZyBjYXBhYmxlIG9mIGhvbGRpbmcgYXQgbGVhc3QgU1BBQ0UKLSAgIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLiAgSWYgU1BBQ0UgaXMgMCwgaXQKLSAgIHdpbGwgYmUgc2lsZW50bHkgaW5jcmVhc2VkIHRvIDEuICAqLwotCi1keW5fc3RyaW5nX3QgCi1keW5fc3RyaW5nX25ldyAoc3BhY2UpCi0gICAgIGludCBzcGFjZTsKLXsKLSAgZHluX3N0cmluZ190IHJlc3VsdCA9IChkeW5fc3RyaW5nX3QpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGR5bl9zdHJpbmcpKTsKLSAKLSAgaWYgKHNwYWNlID09IDApCi0gICAgLyogV2UgbmVlZCBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdGVybWluYXRpbmcKLSAgICAgICBOVUwuICAqLwotICAgIHNwYWNlID0gMTsKLQotICByZXN1bHQtPmFsbG9jYXRlZCA9IHNwYWNlOwotICByZXN1bHQtPnMgPSAoY2hhciopIHhtYWxsb2MgKHNwYWNlKTsKLSAgcmVzdWx0LT5sZW5ndGggPSAwOwotICByZXN1bHQtPnNbMF0gPSAnXDAnOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IERTLiAgKi8KLQotdm9pZCAKLWR5bl9zdHJpbmdfZGVsZXRlIChkcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotewotICBmcmVlIChkcy0+cyk7Ci0gIGZyZWUgKGRzKTsKLX0KLQotLyogQXBwZW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgUyB0byBEUywgcmVzaXppbmcgRFMgaWYKLSAgIG5lY2Vzc2FyeS4gICovCi0KLWR5bl9zdHJpbmdfdCAKLWR5bl9zdHJpbmdfYXBwZW5kIChkcywgcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBjaGFyICpzOwotewotICBpbnQgbGVuID0gc3RybGVuIChzKTsKLSAgZHluX3N0cmluZ19yZXNpemUgKGRzLCBkcy0+bGVuZ3RoICsgbGVuICsgMSAvKiAnXDAnICovKTsKLSAgc3RyY3B5IChkcy0+cyArIGRzLT5sZW5ndGgsIHMpOwotICBkcy0+bGVuZ3RoICs9IGxlbjsKLQotICByZXR1cm4gZHM7Ci19Ci0KLS8qIEluY3JlYXNlIHRoZSBjYXBhY2l0eSBvZiBEUyBzbyB0aGF0IGl0IGNhbiBob2xkIGF0IGxlYXN0IFNQQUNFCi0gICBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgIChhdCBwcmVzZW50KSByZWR1Y2UgdGhlIGNhcGFjaXR5IG9mIERTLiAgKi8KLQotZHluX3N0cmluZ190IAotZHluX3N0cmluZ19yZXNpemUgKGRzLCBzcGFjZSkKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBpbnQgc3BhY2U7Ci17Ci0gIGludCBuZXdfYWxsb2NhdGVkID0gZHMtPmFsbG9jYXRlZDsKLQotICB3aGlsZSAoc3BhY2UgPiBuZXdfYWxsb2NhdGVkKQotICAgIG5ld19hbGxvY2F0ZWQgKj0gMjsKLSAgICAKLSAgaWYgKG5ld19hbGxvY2F0ZWQgIT0gZHMtPmFsbG9jYXRlZCkKLSAgICB7Ci0gICAgICAvKiBXZSBhY3R1YWxseSBuZWVkIG1vcmUgc3BhY2UuICAqLwotICAgICAgZHMtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7Ci0gICAgICBkcy0+cyA9IChjaGFyKikgeHJlYWxsb2MgKGRzLT5zLCBkcy0+YWxsb2NhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRzOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5oIGIvYmludXRpbHMvZHluLXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQyNWMzLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIEFuIGFic3RyYWN0IHN0cmluZyBkYXRhdHlwZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotICAgR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGJpbnV0aWxzIGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZHluX3N0cmluZwotewotICBpbnQgYWxsb2NhdGVkOyAvKiBUaGUgYW1vdW50IG9mIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIHN0cmluZy4gICovCi0gIGludCBsZW5ndGg7IC8qIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICAqLwotICBjaGFyICpzOyAvKiBUaGUgc3RyaW5nIGl0c2VsZiwgTlVMLXRlcm1pbmF0ZWQuICAqLwotfSogZHluX3N0cmluZ190OwotCi1leHRlcm4gZHluX3N0cmluZ190IGR5bl9zdHJpbmdfbmV3ICAgICAgUEFSQU1TKChpbnQpKTsKLWV4dGVybiB2b2lkIGR5bl9zdHJpbmdfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKGR5bl9zdHJpbmdfdCkpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX2FwcGVuZCAgIFBBUkFNUygoZHluX3N0cmluZ190LCBjaGFyKikpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX3Jlc2l6ZSAgIFBBUkFNUygoZHluX3N0cmluZ190LCBpbnQpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMgYi9iaW51dGlscy9maWxlbW9kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTgxMWJjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogZmlsZW1vZGUuYyAtLSBtYWtlIGEgc3RyaW5nIGRlc2NyaWJpbmcgZmlsZSBtb2RlcwotICAgQ29weXJpZ2h0IChDKSAxOTg1LCA5MCwgOTEsIDk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1zdGF0aWMgY2hhciBmdHlwZWxldCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBzZXRzdCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBjaGFyICopKTsKLQotLyogZmlsZW1vZGVzdHJpbmcgLSBmaWxsIGluIHN0cmluZyBTVFIgd2l0aCBhbiBscy1zdHlsZSBBU0NJSQotICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0X21vZGUgZmllbGQgb2YgZmlsZSBzdGF0cyBibG9jayBTVEFUUC4KLSAgIDEwIGNoYXJhY3RlcnMgYXJlIHN0b3JlZCBpbiBTVFI7IG5vIHRlcm1pbmF0aW5nIG51bGwgaXMgYWRkZWQuCi0gICBUaGUgY2hhcmFjdGVycyBzdG9yZWQgaW4gU1RSIGFyZToKLQotICAgMAlGaWxlIHR5cGUuICAnZCcgZm9yIGRpcmVjdG9yeSwgJ2MnIGZvciBjaGFyYWN0ZXIKLQlzcGVjaWFsLCAnYicgZm9yIGJsb2NrIHNwZWNpYWwsICdtJyBmb3IgbXVsdGlwbGV4LAotCSdsJyBmb3Igc3ltYm9saWMgbGluaywgJ3MnIGZvciBzb2NrZXQsICdwJyBmb3IgZmlmbywKLQknLScgZm9yIGFueSBvdGhlciBmaWxlIHR5cGUKLQotICAgMQkncicgaWYgdGhlIG93bmVyIG1heSByZWFkLCAnLScgb3RoZXJ3aXNlLgotCi0gICAyCSd3JyBpZiB0aGUgb3duZXIgbWF5IHdyaXRlLCAnLScgb3RoZXJ3aXNlLgotCi0gICAzCSd4JyBpZiB0aGUgb3duZXIgbWF5IGV4ZWN1dGUsICdzJyBpZiB0aGUgZmlsZSBpcwotCXNldC11c2VyLWlkLCAnLScgb3RoZXJ3aXNlLgotCSdTJyBpZiB0aGUgZmlsZSBpcyBzZXQtdXNlci1pZCwgYnV0IHRoZSBleGVjdXRlCi0JYml0IGlzbid0IHNldC4KLQotICAgNAkncicgaWYgZ3JvdXAgbWVtYmVycyBtYXkgcmVhZCwgJy0nIG90aGVyd2lzZS4KLQotICAgNQkndycgaWYgZ3JvdXAgbWVtYmVycyBtYXkgd3JpdGUsICctJyBvdGhlcndpc2UuCi0KLSAgIDYJJ3gnIGlmIGdyb3VwIG1lbWJlcnMgbWF5IGV4ZWN1dGUsICdzJyBpZiB0aGUgZmlsZSBpcwotCXNldC1ncm91cC1pZCwgJy0nIG90aGVyd2lzZS4KLQknUycgaWYgaXQgaXMgc2V0LWdyb3VwLWlkIGJ1dCBub3QgZXhlY3V0YWJsZS4KLQotICAgNwkncicgaWYgYW55IHVzZXIgbWF5IHJlYWQsICctJyBvdGhlcndpc2UuCi0KLSAgIDgJJ3cnIGlmIGFueSB1c2VyIG1heSB3cml0ZSwgJy0nIG90aGVyd2lzZS4KLQotICAgOQkneCcgaWYgYW55IHVzZXIgbWF5IGV4ZWN1dGUsICd0JyBpZiB0aGUgZmlsZSBpcyAic3RpY2t5IgotCSh3aWxsIGJlIHJldGFpbmVkIGluIHN3YXAgc3BhY2UgYWZ0ZXIgZXhlY3V0aW9uKSwgJy0nCi0Jb3RoZXJ3aXNlLgotCSdUJyBpZiB0aGUgZmlsZSBpcyBzdGlja3kgYnV0IG5vdCBleGVjdXRhYmxlLiAqLwotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkOyBvbmx5IG1vZGVfc3RyaW5nIGlzIHVzZWQuICAqLwotCi12b2lkCi1maWxlbW9kZXN0cmluZyAoc3RhdHAsIHN0cikKLSAgICAgc3RydWN0IHN0YXQgKnN0YXRwOwotICAgICBjaGFyICpzdHI7Ci17Ci0gIG1vZGVfc3RyaW5nICgodW5zaWduZWQgbG9uZykgc3RhdHAtPnN0X21vZGUsIHN0cik7Ci19Ci0KLSNlbmRpZgotCi0vKiBHZXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBmaWxlIHBlcm1pc3Npb24gYml0cy4gICovCi0KLSNpZm5kZWYgU19JUldYVQotI2RlZmluZSBTX0lSV1hVIDA3MDAKLSNlbmRpZgotI2lmbmRlZiBTX0lSVVNSCi0jZGVmaW5lIFNfSVJVU1IgMDQwMAotI2VuZGlmCi0jaWZuZGVmIFNfSVdVU1IKLSNkZWZpbmUgU19JV1VTUiAwMjAwCi0jZW5kaWYKLSNpZm5kZWYgU19JWFVTUgotI2RlZmluZSBTX0lYVVNSIDAxMDAKLSNlbmRpZgotCi0jaWZuZGVmIFNfSVJXWEcKLSNkZWZpbmUgU19JUldYRyAwMDcwCi0jZW5kaWYKLSNpZm5kZWYgU19JUkdSUAotI2RlZmluZSBTX0lSR1JQIDAwNDAKLSNlbmRpZgotI2lmbmRlZiBTX0lXR1JQCi0jZGVmaW5lIFNfSVdHUlAgMDAyMAotI2VuZGlmCi0jaWZuZGVmIFNfSVhHUlAKLSNkZWZpbmUgU19JWEdSUCAwMDEwCi0jZW5kaWYKLQotI2lmbmRlZiBTX0lSV1hPCi0jZGVmaW5lIFNfSVJXWE8gMDAwNwotI2VuZGlmCi0jaWZuZGVmIFNfSVJPVEgKLSNkZWZpbmUgU19JUk9USCAwMDA0Ci0jZW5kaWYKLSNpZm5kZWYgU19JV09USAotI2RlZmluZSBTX0lXT1RIIDAwMDIKLSNlbmRpZgotI2lmbmRlZiBTX0lYT1RICi0jZGVmaW5lIFNfSVhPVEggMDAwMQotI2VuZGlmCi0KLS8qIExpa2UgZmlsZW1vZGVzdHJpbmcsIGJ1dCBvbmx5IHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBgc3RydWN0IHN0YXQnCi0gICBpcyBnaXZlbiBhcyBhbiBhcmd1bWVudC4gKi8KLQotdm9pZAotbW9kZV9zdHJpbmcgKG1vZGUsIHN0cikKLSAgICAgdW5zaWduZWQgbG9uZyBtb2RlOwotICAgICBjaGFyICpzdHI7Ci17Ci0gIHN0clswXSA9IGZ0eXBlbGV0ICgodW5zaWduZWQgbG9uZykgbW9kZSk7Ci0gIHN0clsxXSA9IChtb2RlICYgU19JUlVTUikgIT0gMCA/ICdyJyA6ICctJzsKLSAgc3RyWzJdID0gKG1vZGUgJiBTX0lXVVNSKSAhPSAwID8gJ3cnIDogJy0nOwotICBzdHJbM10gPSAobW9kZSAmIFNfSVhVU1IpICE9IDAgPyAneCcgOiAnLSc7Ci0gIHN0cls0XSA9IChtb2RlICYgU19JUkdSUCkgIT0gMCA/ICdyJyA6ICctJzsKLSAgc3RyWzVdID0gKG1vZGUgJiBTX0lXR1JQKSAhPSAwID8gJ3cnIDogJy0nOwotICBzdHJbNl0gPSAobW9kZSAmIFNfSVhHUlApICE9IDAgPyAneCcgOiAnLSc7Ci0gIHN0cls3XSA9IChtb2RlICYgU19JUk9USCkgIT0gMCA/ICdyJyA6ICctJzsKLSAgc3RyWzhdID0gKG1vZGUgJiBTX0lXT1RIKSAhPSAwID8gJ3cnIDogJy0nOwotICBzdHJbOV0gPSAobW9kZSAmIFNfSVhPVEgpICE9IDAgPyAneCcgOiAnLSc7Ci0gIHNldHN0ICgodW5zaWduZWQgbG9uZykgbW9kZSwgc3RyKTsKLX0KLQotLyogUmV0dXJuIGEgY2hhcmFjdGVyIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZmlsZSBkZXNjcmliZWQgYnkKLSAgIGZpbGUgbW9kZSBCSVRTOgotICAgJ2QnIGZvciBkaXJlY3RvcmllcwotICAgJ2InIGZvciBibG9jayBzcGVjaWFsIGZpbGVzCi0gICAnYycgZm9yIGNoYXJhY3RlciBzcGVjaWFsIGZpbGVzCi0gICAnbScgZm9yIG11bHRpcGxleG9yIGZpbGVzCi0gICAnbCcgZm9yIHN5bWJvbGljIGxpbmtzCi0gICAncycgZm9yIHNvY2tldHMKLSAgICdwJyBmb3IgZmlmb3MKLSAgICctJyBmb3IgYW55IG90aGVyIGZpbGUgdHlwZS4gKi8KLQotI2lmbmRlZiBTX0lTRElSCi0jaWZkZWYgU19JRkRJUgotI2RlZmluZSBTX0lTRElSKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGRElSKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGRElSKSAqLwotI2RlZmluZSBTX0lTRElSKGkpICgoKGkpICYgMDE3MDAwMCkgPT0gMDQwMDAwKQotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkRJUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNESVIpICovCi0KLSNpZm5kZWYgU19JU0JMSwotI2lmZGVmIFNfSUZCTEsKLSNkZWZpbmUgU19JU0JMSyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRkJMSykKLSNlbHNlIC8qICEgZGVmaW5lZCAoU19JRkJMSykgKi8KLSNkZWZpbmUgU19JU0JMSyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGQkxLKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0JMSykgKi8KLQotI2lmbmRlZiBTX0lTQ0hSCi0jaWZkZWYgU19JRkNIUgotI2RlZmluZSBTX0lTQ0hSKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGQ0hSKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGQ0hSKSAqLwotI2RlZmluZSBTX0lTQ0hSKGkpIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZDSFIpICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTQ0hSKSAqLwotCi0jaWZuZGVmIFNfSVNGSUZPCi0jaWZkZWYgU19JRklGTwotI2RlZmluZSBTX0lTRklGTyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRklGTykKLSNlbHNlIC8qICEgZGVmaW5lZCAoU19JRklGTykgKi8KLSNkZWZpbmUgU19JU0ZJRk8oaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRklGTykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNGSUZPKSAqLwotCi0jaWZuZGVmIFNfSVNTT0NLCi0jaWZkZWYgU19JRlNPQ0sKLSNkZWZpbmUgU19JU1NPQ0soaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZTT0NLKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGU09DSykgKi8KLSNkZWZpbmUgU19JU1NPQ0soaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRlNPQ0spICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTU09DSykgKi8KLQotI2lmbmRlZiBTX0lTTE5LCi0jaWZkZWYgU19JRkxOSwotI2RlZmluZSBTX0lTTE5LKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGTE5LKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGTE5LKSAqLwotI2RlZmluZSBTX0lTTE5LKGkpIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZMTkspICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTTE5LKSAqLwotCi1zdGF0aWMgY2hhcgotZnR5cGVsZXQgKGJpdHMpCi0gICAgIHVuc2lnbmVkIGxvbmcgYml0czsKLXsKLSAgaWYgKFNfSVNESVIgKGJpdHMpKQotICAgIHJldHVybiAnZCc7Ci0gIGlmIChTX0lTTE5LIChiaXRzKSkKLSAgICByZXR1cm4gJ2wnOwotICBpZiAoU19JU0JMSyAoYml0cykpCi0gICAgcmV0dXJuICdiJzsKLSAgaWYgKFNfSVNDSFIgKGJpdHMpKQotICAgIHJldHVybiAnYyc7Ci0gIGlmIChTX0lTU09DSyAoYml0cykpCi0gICAgcmV0dXJuICdzJzsKLSAgaWYgKFNfSVNGSUZPIChiaXRzKSkKLSAgICByZXR1cm4gJ3AnOwotCi0jaWZkZWYgU19JRk1UCi0jaWZkZWYgU19JRk1QQwotICBpZiAoKGJpdHMgJiBTX0lGTVQpID09IFNfSUZNUEMKLSAgICAgIHx8IChiaXRzICYgU19JRk1UKSA9PSBTX0lGTVBCKQotICAgIHJldHVybiAnbSc7Ci0jZW5kaWYKLSNpZmRlZiBTX0lGTldLCi0gIGlmICgoYml0cyAmIFNfSUZNVCkgPT0gU19JRk5XSykKLSAgICByZXR1cm4gJ24nOwotI2VuZGlmCi0jZW5kaWYKLQotICByZXR1cm4gJy0nOwotfQotCi0vKiBTZXQgdGhlICdzJyBhbmQgJ3QnIGZsYWdzIGluIGZpbGUgYXR0cmlidXRlcyBzdHJpbmcgQ0hBUlMsCi0gICBhY2NvcmRpbmcgdG8gdGhlIGZpbGUgbW9kZSBCSVRTLiAqLwotCi1zdGF0aWMgdm9pZAotc2V0c3QgKGJpdHMsIGNoYXJzKQotICAgICB1bnNpZ25lZCBsb25nIGJpdHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqY2hhcnMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBTX0lTVUlECi0gIGlmIChiaXRzICYgU19JU1VJRCkKLSAgICB7Ci0gICAgICBpZiAoY2hhcnNbM10gIT0gJ3gnKQotCS8qIFNldC11aWQsIGJ1dCBub3QgZXhlY3V0YWJsZSBieSBvd25lci4gKi8KLQljaGFyc1szXSA9ICdTJzsKLSAgICAgIGVsc2UKLQljaGFyc1szXSA9ICdzJzsKLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBTX0lTR0lECi0gIGlmIChiaXRzICYgU19JU0dJRCkKLSAgICB7Ci0gICAgICBpZiAoY2hhcnNbNl0gIT0gJ3gnKQotCS8qIFNldC1naWQsIGJ1dCBub3QgZXhlY3V0YWJsZSBieSBncm91cC4gKi8KLQljaGFyc1s2XSA9ICdTJzsKLSAgICAgIGVsc2UKLQljaGFyc1s2XSA9ICdzJzsKLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBTX0lTVlRYCi0gIGlmIChiaXRzICYgU19JU1ZUWCkKLSAgICB7Ci0gICAgICBpZiAoY2hhcnNbOV0gIT0gJ3gnKQotCS8qIFN0aWNreSwgYnV0IG5vdCBleGVjdXRhYmxlIGJ5IG90aGVycy4gKi8KLQljaGFyc1s5XSA9ICdUJzsKLSAgICAgIGVsc2UKLQljaGFyc1s5XSA9ICd0JzsKLSAgICB9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2llZWUuYyBiL2JpbnV0aWxzL2llZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNjkyOC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9pZWVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjA5ICswLDAgQEAKLS8qIGllZWUuYyAtLSBSZWFkIGFuZCB3cml0ZSBJRUVFLTY5NSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHJlYWRzIGFuZCB3cml0ZXMgSUVFRS02OTUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJpZWVlLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbiBlbnRyeSBvbiB0aGUgYmxvY2sgc3RhY2suICAqLwotCi1zdHJ1Y3QgaWVlZV9ibG9jawotewotICAvKiBUaGUga2luZCBvZiBibG9jay4gICovCi0gIGludCBraW5kOwotICAvKiBUaGUgc291cmNlIGZpbGUgbmFtZSwgZm9yIGEgQkI1IGJsb2NrLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIFRoZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gdHlwZSwgZm9yIGEgQkI0IG9yIEJCNiBibG9jay4gICovCi0gIHVuc2lnbmVkIGludCBmbmluZHg7Ci0gIC8qIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBza2lwcGVkLiAgKi8KLSAgYm9vbGVhbiBza2lwOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGJsb2NrIHN0YWNrLiAgKi8KLQotI2RlZmluZSBCTE9DS1NUQUNLX1NJWkUgKDE2KQotCi1zdHJ1Y3QgaWVlZV9ibG9ja3N0YWNrCi17Ci0gIC8qIFRoZSBzdGFjayBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGllZWVfYmxvY2sgKmJzcDsKLSAgLyogVGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IGllZWVfYmxvY2sgc3RhY2tbQkxPQ0tTVEFDS19TSVpFXTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHZhcmlhYmxlLiAgKi8KLQotc3RydWN0IGllZWVfdmFyCi17Ci0gIC8qIFN0YXJ0IG9mIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBMZW5ndGggb2YgbmFtZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBTbG90IGlmIHdlIG1ha2UgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgKnBzbG90OwotICAvKiBLaW5kIG9mIHZhcmlhYmxlIG9yIGZ1bmN0aW9uLiAgKi8KLSAgZW51bQotICAgIHsKLSAgICAgIElFRUVfVU5LTk9XTiwKLSAgICAgIElFRUVfRVhURVJOQUwsCi0gICAgICBJRUVFX0dMT0JBTCwKLSAgICAgIElFRUVfU1RBVElDLAotICAgICAgSUVFRV9MT0NBTCwKLSAgICAgIElFRUVfRlVOQ1RJT04KLSAgICB9IGtpbmQ7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgdGhlIHZhcmlhYmxlcy4gICovCi0KLXN0cnVjdCBpZWVlX3ZhcnMKLXsKLSAgLyogTnVtYmVyIG9mIHNsb3RzIGFsbG9jYXRlZC4gICovCi0gIHVuc2lnbmVkIGludCBhbGxvYzsKLSAgLyogVmFyaWFibGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdmFyICp2YXJzOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgdHlwZS4gIFdlIG5lZWQgdGhpcyBiZWNhdXNlCi0gICB3ZSBkb24ndCB3YW50IHRvIHJlcHJlc2VudCBiaXRmaWVsZHMgYXMgcmVhbCB0eXBlcy4gICovCi0KLXN0cnVjdCBpZWVlX3R5cGUKLXsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogU2xvdCBpZiB0aGlzIGlzIHR5cGUgaXMgcmVmZXJlbmNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4gICovCi0gIGRlYnVnX3R5cGUgKnBzbG90OwotICAvKiBTbG90cyBmb3IgYXJndW1lbnRzIGlmIHdlIG1ha2UgaW5kaXJlY3QgdHlwZXMgZm9yIHRoZW0uICAqLwotICBkZWJ1Z190eXBlICphcmdfc2xvdHM7Ci0gIC8qIElmIHRoaXMgaXMgYSBiaXRmaWVsZCwgdGhpcyBpcyB0aGUgc2l6ZSBpbiBiaXRzLiAgSWYgdGhpcyBpcyBub3QKLSAgICAgYSBiaXRmaWVsZCwgdGhpcyBpcyB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBiaXRzaXplOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGllZWVfdHlwZXMKLXsKLSAgLyogTnVtYmVyIG9mIHNsb3RzIGFsbG9jYXRlZC4gICovCi0gIHVuc2lnbmVkIGludCBhbGxvYzsKLSAgLyogVHlwZXMuICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlICp0eXBlczsKLSAgLyogQnVpbHRpbiB0eXBlcy4gICovCi0jZGVmaW5lIEJVSUxUSU5fVFlQRV9DT1VOVCAoNjApCi0gIGRlYnVnX3R5cGUgYnVpbHRpbnNbQlVJTFRJTl9UWVBFX0NPVU5UXTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGEgbGlua2VkIGxhc3Qgb2Ygc3RydWN0cyB3aXRoIHRoZWlyIHRhZyBuYW1lcywKLSAgIHNvIHRoYXQgd2UgY2FuIGNvbnZlcnQgdGhlbSB0byBDKysgY2xhc3NlcyBpZiBuZWNlc3NhcnkuICAqLwotCi1zdHJ1Y3QgaWVlZV90YWcKLXsKLSAgLyogTmV4dCB0YWcuICAqLwotICBzdHJ1Y3QgaWVlZV90YWcgKm5leHQ7Ci0gIC8qIFRoaXMgdGFnIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgdGFnLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBUaGUgdGFnZ2VkIHR5cGUgaXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyBhdCB0aGlzIHNsb3QuICAqLwotICBkZWJ1Z190eXBlIHNsb3Q7Ci0gIC8qIFRoaXMgaXMgYW4gYXJyYXkgb2Ygc2xvdHMgdXNlZCB3aGVuIGEgZmllbGQgdHlwZSBpcyBjb252ZXJ0ZWQKLSAgICAgaW50byBhIGluZGlyZWN0IHR5cGUsIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgbGF0ZXIgY29udmVydGVkIGludG8KLSAgICAgYSByZWZlcmVuY2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgKmZzbG90czsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiB3ZSBwYXNzIGFyb3VuZCB0byB0aGUgcGFyc2luZwotICAgZnVuY3Rpb25zLiAgKi8KLQotc3RydWN0IGllZWVfaW5mbwotewotICAvKiBUaGUgZGVidWdnaW5nIGhhbmRsZS4gICovCi0gIFBUUiBkaGFuZGxlOwotICAvKiBUaGUgQkZELiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUaGUgc3RhcnQgb2YgdGhlIGJ5dGVzIHRvIGJlIHBhcnNlZC4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpieXRlczsKLSAgLyogVGhlIGVuZCBvZiB0aGUgYnl0ZXMgdG8gYmUgcGFyc2VkLiAgKi8KLSAgY29uc3QgYmZkX2J5dGUgKnBlbmQ7Ci0gIC8qIFRoZSBibG9jayBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX2Jsb2Nrc3RhY2sgYmxvY2tzdGFjazsKLSAgLyogV2hldGhlciB3ZSBoYXZlIHNlZW4gYSBCQjEgb3IgQkIyLiAgKi8KLSAgYm9vbGVhbiBzYXdfZmlsZW5hbWU7Ci0gIC8qIFRoZSB2YXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgaWVlZV92YXJzIHZhcnM7Ci0gIC8qIFRoZSBnbG9iYWwgdmFyaWFibGVzLCBhZnRlciBhIGdsb2JhbCB0eXBlZGVmIGJsb2NrLiAgKi8KLSAgc3RydWN0IGllZWVfdmFycyAqZ2xvYmFsX3ZhcnM7Ci0gIC8qIFRoZSB0eXBlcy4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVzIHR5cGVzOwotICAvKiBUaGUgZ2xvYmFsIHR5cGVzLCBhZnRlciBhIGdsb2JhbCB0eXBlZGVmIGJsb2NrLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZXMgKmdsb2JhbF90eXBlczsKLSAgLyogVGhlIGxpc3Qgb2YgdGFnZ2VkIHN0cnVjdHMuICAqLwotICBzdHJ1Y3QgaWVlZV90YWcgKnRhZ3M7Ci19OwotCi0vKiBCYXNpYyBidWlsdGluIHR5cGVzLCBub3QgaW5jbHVkaW5nIHRoZSBwb2ludGVycy4gICovCi0KLWVudW0gYnVpbHRpbl90eXBlcwotewotICBidWlsdGluX3Vua25vd24gPSAwLAotICBidWlsdGluX3ZvaWQgPSAxLAotICBidWlsdGluX3NpZ25lZF9jaGFyID0gMiwKLSAgYnVpbHRpbl91bnNpZ25lZF9jaGFyID0gMywKLSAgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50ID0gNCwKLSAgYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQgPSA1LAotICBidWlsdGluX3NpZ25lZF9sb25nID0gNiwKLSAgYnVpbHRpbl91bnNpZ25lZF9sb25nID0gNywKLSAgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nID0gOCwKLSAgYnVpbHRpbl91bnNpZ25lZF9sb25nX2xvbmcgPSA5LAotICBidWlsdGluX2Zsb2F0ID0gMTAsCi0gIGJ1aWx0aW5fZG91YmxlID0gMTEsCi0gIGJ1aWx0aW5fbG9uZ19kb3VibGUgPSAxMiwKLSAgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlID0gMTMsCi0gIGJ1aWx0aW5fcXVvdGVkX3N0cmluZyA9IDE0LAotICBidWlsdGluX2luc3RydWN0aW9uX2FkZHJlc3MgPSAxNSwKLSAgYnVpbHRpbl9pbnQgPSAxNiwKLSAgYnVpbHRpbl91bnNpZ25lZCA9IDE3LAotICBidWlsdGluX3Vuc2lnbmVkX2ludCA9IDE4LAotICBidWlsdGluX2NoYXIgPSAxOSwKLSAgYnVpbHRpbl9sb25nID0gMjAsCi0gIGJ1aWx0aW5fc2hvcnQgPSAyMSwKLSAgYnVpbHRpbl91bnNpZ25lZF9zaG9ydCA9IDIyLAotICBidWlsdGluX3Nob3J0X2ludCA9IDIzLAotICBidWlsdGluX3NpZ25lZF9zaG9ydCA9IDI0LAotICBidWlsdGluX2JjZF9mbG9hdCA9IDI1Ci19OwotCi0vKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGUgZGVyaXZhdGlvbiBmbGFncyBvZiBhICdiJwotICAgY29tcG9uZW50IHJlY29yZCBvZiBhICdUJyB0eXBlIGV4dGVuc2lvbiByZWNvcmQgaW4gYSBDKysgcG1pc2MKLSAgIHJlY29yZC4gIFRoZXNlIGFyZSBiaXRtYXNrcy4gICovCi0KLS8qIFNldCBmb3IgYSBwcml2YXRlIGJhc2UgY2xhc3MsIGNsZWFyIGZvciBhIHB1YmxpYyBiYXNlIGNsYXNzLgotICAgUHJvdGVjdGVkIGJhc2UgY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZC4gICovCi0jZGVmaW5lIEJBU0VGTEFHU19QUklWQVRFICgweDEpCi0vKiBTZXQgZm9yIGEgdmlydHVhbCBiYXNlIGNsYXNzLiAgKi8KLSNkZWZpbmUgQkFTRUZMQUdTX1ZJUlRVQUwgKDB4MikKLS8qIFNldCBmb3IgYSBmcmllbmQgY2xhc3MsIGNsZWFyIGZvciBhIGJhc2UgY2xhc3MuICAqLwotI2RlZmluZSBCQVNFRkxBR1NfRlJJRU5EICgweDEwKQotCi0vKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGUgc3BlY3MgZmxhZ3Mgb2YgYSAnZCcsICdtJywgb3IgJ3YnCi0gICBjb21wb25lbnQgcmVjb3JkIG9mIGEgJ1QnIHR5cGUgZXh0ZW5zaW9uIHJlY29yZCBpbiBhIEMrKyBwbWlzYwotICAgcmVjb3JkLiAgVGhlIHNhbWUgZmxhZ3MgYXJlIHVzZWQgZm9yIGEgJ00nIHJlY29yZCBpbiBhIEMrKyBwbWlzYwotICAgcmVjb3JkLiAgKi8KLQotLyogVGhlIGxvd2VyIHR3byBiaXRzIGhvbGQgdmlzaWJpbGl0eSBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX1ZJU0lCSUxJVFkgKDB4MykKLS8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHB1YmxpYyBtZW1iZXIuICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQyAoMHgwKQotLyogVGhpcyB2YWx1ZSBpbiB0aGUgbG93ZXIgdHdvIGJpdHMgaW5kaWNhdGVzIGEgcHJpdmF0ZSBtZW1iZXIuICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEUgKDB4MSkKLS8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHByb3RlY3RlZCBtZW1iZXIuICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRCAoMHgyKQotLyogU2V0IGZvciBhIHN0YXRpYyBtZW1iZXIuICAqLwotI2RlZmluZSBDWFhGTEFHU19TVEFUSUMgKDB4NCkKLS8qIFNldCBmb3IgYSB2aXJ0dWFsIG92ZXJyaWRlLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfT1ZFUlJJREUgKDB4OCkKLS8qIFNldCBmb3IgYSBmcmllbmQgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19GUklFTkQgKDB4MTApCi0vKiBTZXQgZm9yIGEgY29uc3QgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19DT05TVCAoMHgyMCkKLS8qIFNldCBmb3IgYSB2b2xhdGlsZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX1ZPTEFUSUxFICgweDQwKQotLyogU2V0IGZvciBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfT1ZFUkxPQURFRCAoMHg4MCkKLS8qIFNldCBmb3IgYW4gb3BlcmF0b3IgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19PUEVSQVRPUiAoMHgxMDApCi0vKiBTZXQgZm9yIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gICovCi0jZGVmaW5lIENYWEZMQUdTX0NUT1JEVE9SICgweDQwMCkKLS8qIFNldCBmb3IgYSBjb25zdHJ1Y3Rvci4gICovCi0jZGVmaW5lIENYWEZMQUdTX0NUT1IgKDB4MjAwKQotLyogU2V0IGZvciBhbiBpbmxpbmUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19JTkxJTkUgKDB4ODAwKQotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZCBpZWVlX2Vycm9yCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpZWVlX2VvZiBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICopKTsKLXN0YXRpYyBjaGFyICpzYXZlc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX251bWJlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9pZAotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAotCSAgIHVuc2lnbmVkIGxvbmcgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX29wdGlvbmFsX2lkCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGNvbnN0IGNoYXIgKiosCi0JICAgdW5zaWduZWQgbG9uZyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgaWVlZV9idWlsdGluX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYWxsb2NfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX3R5cGVfaW5kZXgKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgaW50IGllZWVfcmVnbm9fdG9fZ2VucmVnIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgaWVlZV9nZW5yZWdfdG9fcmVnbm8gUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9iYiBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX2JlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfbm4gUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV90eSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX2F0biBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfY3h4X21pc2MKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9jbGFzcwotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfY3h4X2RlZmF1bHRzCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9yZWZlcmVuY2UKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZXF1aXJlX2FzbgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVxdWlyZV9hdG42NQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAotCSAgIHVuc2lnbmVkIGxvbmcgKikpOwotCi0vKiBSZXBvcnQgYW4gZXJyb3IgaW4gdGhlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfZXJyb3IgKGluZm8sIHAsIHMpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpZiAocCAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAweCVseDogJXMgKDB4JXgpXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSAocCAtIGluZm8tPmJ5dGVzKSwgcywgKnApOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgcyk7Ci19Ci0KLS8qIFJlcG9ydCBhbiB1bmV4cGVjdGVkIEVPRiBpbiB0aGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaWVlZV9lb2YgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci17Ci0gIGllZWVfZXJyb3IgKGluZm8sIChjb25zdCBiZmRfYnl0ZSAqKSBOVUxMLAotCSAgICAgIF8oInVuZXhwZWN0ZWQgZW5kIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpKTsKLX0KLQotLyogU2F2ZSBhIHN0cmluZyBpbiBtZW1vcnkuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zYXZlc3RyaW5nIChzdGFydCwgbGVuKQotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW47Ci17Ci0gIGNoYXIgKnJldDsKLQotICByZXQgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5IChyZXQsIHN0YXJ0LCBsZW4pOwotICByZXRbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgd2hpY2ggbXVzdCBiZSBwcmVzZW50IGluIGFuIElFRUUgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgcHYpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGJmZF92bWEgKnB2OwotewotICByZXR1cm4gaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsIHB2LCAoYm9vbGVhbiAqKSBOVUxMKTsKLX0KLQotLyogUmVhZCBhIG51bWJlciBpbiBhbiBJRUVFIGZpbGUuICBJZiBwcHJlc2VudCBpcyBub3QgTlVMTCwgdGhlIG51bWJlcgotICAgbmVlZCBub3QgYmUgdGhlcmUuICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgcHYsIHBwcmVzZW50KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBiZmRfdm1hICpwdjsKLSAgICAgYm9vbGVhbiAqcHByZXNlbnQ7Ci17Ci0gIGllZWVfcmVjb3JkX2VudW1fdHlwZSBiOwotCi0gIGlmICgqcHAgPj0gaW5mby0+cGVuZCkKLSAgICB7Ci0gICAgICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLQl7Ci0JICAqcHByZXNlbnQgPSBmYWxzZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGllZWVfZW9mIChpbmZvKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYiA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7Ci0gICsrKnBwOwotCi0gIGlmIChiIDw9IGllZWVfbnVtYmVyX2VuZF9lbnVtKQotICAgIHsKLSAgICAgICpwdiA9IChiZmRfdm1hKSBiOwotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JKnBwcmVzZW50ID0gdHJ1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoYiA+PSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSAmJiBiIDw9IGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaSA9IChpbnQpIGIgLSAoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bTsKLSAgICAgIGlmICgqcHAgKyBpIC0gMSA+PSBpbmZvLT5wZW5kKQotCXsKLQkgIGllZWVfZW9mIChpbmZvKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgICpwdiA9IDA7Ci0gICAgICBmb3IgKDsgaSA+IDA7IGktLSkKLQl7Ci0JICAqcHYgPDw9IDg7Ci0JICAqcHYgKz0gKipwcDsKLQkgICsrKnBwOwotCX0KLQotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JKnBwcmVzZW50ID0gdHJ1ZTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChwcHJlc2VudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC0tKnBwOwotICAgICAgKnBwcmVzZW50ID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWVlZV9lcnJvciAoaW5mbywgKnBwIC0gMSwgXygiaW52YWxpZCBudW1iZXIiKSk7Ci0gIHJldHVybiBmYWxzZTsgIAotfQotCi0vKiBSZWFkIGEgcmVxdWlyZWQgc3RyaW5nIGZyb20gYW4gSUVFRSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9pZCAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcG5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Ci17Ci0gIHJldHVybiBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbiwgKGJvb2xlYW4gKikgTlVMTCk7Ci19Ci0KLS8qIFJlYWQgYSBzdHJpbmcgZnJvbSBhbiBJRUVFIGZpbGUuICBJZiBwcHJlc2VudCBpcyBub3QgTlVMTCwgdGhlCi0gICBzdHJpbmcgaXMgb3B0aW9uYWwuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4sIHBwcmVzZW50KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcG5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Ci0gICAgIGJvb2xlYW4gKnBwcmVzZW50OwotewotICBiZmRfYnl0ZSBiOwotICB1bnNpZ25lZCBsb25nIGxlbjsKLQotICBpZiAoKnBwID49IGluZm8tPnBlbmQpCi0gICAgewotICAgICAgaWVlZV9lb2YgKGluZm8pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiID0gKipwcDsKLSAgKysqcHA7Ci0KLSAgaWYgKGIgPD0gMHg3ZikKLSAgICBsZW4gPSBiOwotICBlbHNlIGlmICgoaWVlZV9yZWNvcmRfZW51bV90eXBlKSBiID09IGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCi0gICAgewotICAgICAgbGVuID0gKipwcDsKLSAgICAgICsrKnBwOwotICAgIH0KLSAgZWxzZSBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgYiA9PSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMl9lbnVtKQotICAgIHsKLSAgICAgIGxlbiA9ICgqKnBwIDw8IDgpICsgKCpwcClbMV07Ci0gICAgICAqcHAgKz0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLQl7Ci0JICAtLSpwcDsKLQkgICpwcHJlc2VudCA9IGZhbHNlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwIC0gMSwgXygiaW52YWxpZCBzdHJpbmcgbGVuZ3RoIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKHVuc2lnbmVkIGxvbmcpIChpbmZvLT5wZW5kIC0gKnBwKSA8IGxlbikKLSAgICB7Ci0gICAgICBpZWVlX2VvZiAoaW5mbyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICpwbmFtZSA9IChjb25zdCBjaGFyICopICpwcDsKLSAgKnBuYW1sZW4gPSBsZW47Ci0gICpwcCArPSBsZW47Ci0KLSAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0gICAgKnBwcmVzZW50ID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbiBleHByZXNzaW9uIGZyb20gYW4gSUVFRSBmaWxlLiAgU2luY2UgdGhpcyBjb2RlIGlzIG9ubHkgdXNlZAotICAgdG8gcGFyc2UgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBJIGhhdmVuJ3QgYm90aGVyZWQgdG8gd3JpdGUgYSBmdWxsCi0gICBibG93biBJRUVFIGV4cHJlc3Npb24gcGFyc2VyLiAgSSd2ZSBvbmx5IHRocm93biBpbiB0aGUgdGhpbmdzIEkndmUKLSAgIHNlZW4gaW4gZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gYmUgZWFzaWx5IGV4dGVuZGVkIGlmCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCBwdikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpleHByX3N0YXJ0OwotI2RlZmluZSBFWFBSX1NUQUNLX1NJWkUgKDEwKQotICBiZmRfdm1hIGV4cHJfc3RhY2tbRVhQUl9TVEFDS19TSVpFXTsKLSAgYmZkX3ZtYSAqZXNwOwotCi0gIGV4cHJfc3RhcnQgPSAqcHA7Ci0KLSAgZXNwID0gZXhwcl9zdGFjazsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIGJvb2xlYW4gcHJlc2VudDsKLSAgICAgIGllZWVfcmVjb3JkX2VudW1fdHlwZSBjOwotCi0gICAgICBzdGFydCA9ICpwcDsKLQotICAgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2YWwsICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChwcmVzZW50KQotCXsKLQkgIGlmIChlc3AgLSBleHByX3N0YWNrID49IEVYUFJfU1RBQ0tfU0laRSkKLQkgICAgewotCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIG92ZXJmbG93IikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgKmVzcCsrID0gdmFsOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKLQotICAgICAgaWYgKGMgPj0gaWVlZV9tb2R1bGVfYmVnaW5uaW5nX2VudW0pCi0JYnJlYWs7Ci0KLSAgICAgICsrKnBwOwotCi0gICAgICBpZiAoYyA9PSBpZWVlX2NvbW1hKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWRlZmF1bHQ6Ci0JICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5zdXBwb3J0ZWQgSUVFRSBleHByZXNzaW9uIG9wZXJhdG9yIikpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfdmFyaWFibGVfUl9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIGluZHg7Ci0JICAgIGFzZWN0aW9uICpzOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaW5keCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBmb3IgKHMgPSBpbmZvLT5hYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgICBpZiAoKGJmZF92bWEpIHMtPnRhcmdldF9pbmRleCA9PSBpbmR4KQotCQlicmVhazsKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmtub3duIHNlY3Rpb24iKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgIAotCSAgICBpZiAoZXNwIC0gZXhwcl9zdGFjayA+PSBFWFBSX1NUQUNLX1NJWkUpCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBvdmVyZmxvdyIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICAqZXNwKysgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bToKLQljYXNlIGllZWVfZnVuY3Rpb25fbWludXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2MSwgdjI7Ci0KLQkgICAgaWYgKGVzcCAtIGV4cHJfc3RhY2sgPCAyKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImV4cHJlc3Npb24gc3RhY2sgdW5kZXJmbG93IikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIHYxID0gKi0tZXNwOwotCSAgICB2MiA9ICotLWVzcDsKLQkgICAgKmVzcCsrID0gdjEgKyB2MjsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVzcCAtIDEgIT0gZXhwcl9zdGFjaykKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBleHByX3N0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIG1pc21hdGNoIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqcHYgPSAqLS1lc3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiBhbiBJRUVFIGJ1aWx0aW4gdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1pZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgcCwgaW5keCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotewotICBQVFIgZGhhbmRsZTsKLSAgZGVidWdfdHlwZSB0eXBlOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmIChpbmR4IDwgQlVJTFRJTl9UWVBFX0NPVU5UCi0gICAgICAmJiBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XSAhPSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdOwotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIGlmIChpbmR4ID49IDMyICYmIGluZHggPCA2NCkKLSAgICB7Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsIGluZHggLSAzMikpOwotICAgICAgYXNzZXJ0IChpbmR4IDwgQlVJTFRJTl9UWVBFX0NPVU5UKTsKLSAgICAgIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdID0gdHlwZTsKLSAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICBzd2l0Y2ggKChlbnVtIGJ1aWx0aW5fdHlwZXMpIGluZHgpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBwLCBfKCJ1bmtub3duIGJ1aWx0aW4gdHlwZSIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FzZSBidWlsdGluX3Vua25vd246Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl92b2lkOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfY2hhcjoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX2NoYXI6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGNoYXIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNpZ25lZCBzaG9ydCBpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCBpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9sb25nX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgbG9uZyBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX2xvbmdfbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2Zsb2F0OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBuYW1lID0gImZsb2F0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2RvdWJsZToKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgbmFtZSA9ICJkb3VibGUiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fbG9uZ19kb3VibGU6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTIpOwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTYpOwotICAgICAgbmFtZSA9ICJsb25nIGxvbmcgZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3F1b3RlZF9zdHJpbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLAotCQkJCSAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgcCwKLQkJCQkJCSAgICAgICAoKHVuc2lnbmVkIGludCkKLQkJCQkJCQlidWlsdGluX2NoYXIpKSwKLQkJCQkgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsCi0JCQkJCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJYnVpbHRpbl9pbnQpKSwKLQkJCQkgICAgMCwgLTEsIHRydWUpOwotICAgICAgbmFtZSA9ICJRVU9URUQgU1RSSU5HIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2luc3RydWN0aW9uX2FkZHJlc3M6Ci0gICAgICAvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBjb2RlIGFkZHJlc3MuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJpbnN0cnVjdGlvbiBhZGRyZXNzIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2ludDoKLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBmb3IgdGhpcyB0eXBlIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUKLSAgICAgICAgIHByb2Nlc3Nvci4gICovCi0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWQ6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9pbnQ6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fY2hhcjoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImNoYXIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2hvcnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9zaG9ydDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2hvcnRfaW50OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2hvcnQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9zaG9ydDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNpZ25lZCBzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9iY2RfZmxvYXQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBwLCBfKCJCQ0QgZmxvYXQgdHlwZSBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUpOwotCi0gIGFzc2VydCAoaW5keCA8IEJVSUxUSU5fVFlQRV9DT1VOVCk7Ci0KLSAgaW5mby0+dHlwZXMuYnVpbHRpbnNbaW5keF0gPSB0eXBlOwotCi0gIHJldHVybiB0eXBlOwotfQotCi0vKiBBbGxvY2F0ZSBtb3JlIHNwYWNlIGluIHRoZSB0eXBlIHRhYmxlLiAgSWYgcmVmIGlzIHRydWUsIHRoaXMgaXMgYQotICAgcmVmZXJlbmNlIHRvIHRoZSB0eXBlOyBpZiBpdCBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCB3ZSBzaG91bGQgc2V0Ci0gICB1cCBhbiBpbmRpcmVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfYWxsb2NfdHlwZSAoaW5mbywgaW5keCwgcmVmKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgYm9vbGVhbiByZWY7Ci17Ci0gIHVuc2lnbmVkIGludCBuYWxsb2M7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBpZWVlX3R5cGUgKnQ7Ci0gIHN0cnVjdCBpZWVlX3R5cGUgKnRlbmQ7Ci0KLSAgaWYgKGluZHggPj0gaW5mby0+dHlwZXMuYWxsb2MpCi0gICAgewotICAgICAgbmFsbG9jID0gaW5mby0+dHlwZXMuYWxsb2M7Ci0gICAgICBpZiAobmFsbG9jID09IDApCi0JbmFsbG9jID0gNDsKLSAgICAgIHdoaWxlIChpbmR4ID49IG5hbGxvYykKLQluYWxsb2MgKj0gMjsKLQotICAgICAgaW5mby0+dHlwZXMudHlwZXMgPSAoKHN0cnVjdCBpZWVlX3R5cGUgKikKLQkJCSAgIHhyZWFsbG9jIChpbmZvLT50eXBlcy50eXBlcywKLQkJCQkgICAgIG5hbGxvYyAqIHNpemVvZiAqaW5mby0+dHlwZXMudHlwZXMpKTsKLQotICAgICAgbWVtc2V0IChpbmZvLT50eXBlcy50eXBlcyArIGluZm8tPnR5cGVzLmFsbG9jLCAwLAotCSAgICAgIChuYWxsb2MgLSBpbmZvLT50eXBlcy5hbGxvYykgKiBzaXplb2YgKmluZm8tPnR5cGVzLnR5cGVzKTsKLQotICAgICAgdGVuZCA9IGluZm8tPnR5cGVzLnR5cGVzICsgbmFsbG9jOwotICAgICAgZm9yICh0ID0gaW5mby0+dHlwZXMudHlwZXMgKyBpbmZvLT50eXBlcy5hbGxvYzsgdCA8IHRlbmQ7IHQrKykKLQl0LT50eXBlID0gREVCVUdfVFlQRV9OVUxMOwotCi0gICAgICBpbmZvLT50eXBlcy5hbGxvYyA9IG5hbGxvYzsKLSAgICB9Ci0KLSAgaWYgKHJlZikKLSAgICB7Ci0gICAgICB0ID0gaW5mby0+dHlwZXMudHlwZXMgKyBpbmR4OwotICAgICAgaWYgKHQtPnR5cGUgPT0gTlVMTCkKLQl7Ci0JICB0LT5wc2xvdCA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqdC0+cHNsb3QpOwotCSAgKnQtPnBzbG90ID0gREVCVUdfVFlQRV9OVUxMOwotCSAgdC0+dHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoaW5mby0+ZGhhbmRsZSwgdC0+cHNsb3QsCi0JCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgaWYgKHQtPnR5cGUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSB0eXBlIGluZGV4IGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsIHB0eXBlKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBkZWJ1Z190eXBlICpwdHlwZTsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBiZmRfdm1hIGluZHg7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZHggPCAyNTYpCi0gICAgewotICAgICAgKnB0eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHN0YXJ0LCBpbmR4KTsKLSAgICAgIGlmICgqcHR5cGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaW5keCAtPSAyNTY7Ci0gIGlmICghIGllZWVfYWxsb2NfdHlwZSAoaW5mbywgaW5keCwgdHJ1ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpwdHlwZSA9IGluZm8tPnR5cGVzLnR5cGVzW2luZHhdLnR5cGU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIGZpbGUuICBUaGlzIGlzIHBhc3NlZCB0aGUKLSAgIGJ5dGVzIHdoaWNoIGNvbXBvc2UgdGhlIERlYnVnIEluZm9ybWF0aW9uIFBhcnQgb2YgYW4gSUVFRSBmaWxlLiAgKi8KLQotYm9vbGVhbgotcGFyc2VfaWVlZSAoZGhhbmRsZSwgYWJmZCwgYnl0ZXMsIGxlbikKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkX2J5dGUgKmJ5dGVzOwotICAgICBiZmRfc2l6ZV90eXBlIGxlbjsKLXsKLSAgc3RydWN0IGllZWVfaW5mbyBpbmZvOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgY29uc3QgYmZkX2J5dGUgKnAsICpwZW5kOwotCi0gIGluZm8uZGhhbmRsZSA9IGRoYW5kbGU7Ci0gIGluZm8uYWJmZCA9IGFiZmQ7Ci0gIGluZm8uYnl0ZXMgPSBieXRlczsKLSAgaW5mby5wZW5kID0gYnl0ZXMgKyBsZW47Ci0gIGluZm8uYmxvY2tzdGFjay5ic3AgPSBpbmZvLmJsb2Nrc3RhY2suc3RhY2s7Ci0gIGluZm8uc2F3X2ZpbGVuYW1lID0gZmFsc2U7Ci0gIGluZm8udmFycy5hbGxvYyA9IDA7Ci0gIGluZm8udmFycy52YXJzID0gTlVMTDsKLSAgaW5mby5nbG9iYWxfdmFycyA9IE5VTEw7Ci0gIGluZm8udHlwZXMuYWxsb2MgPSAwOwotICBpbmZvLnR5cGVzLnR5cGVzID0gTlVMTDsKLSAgaW5mby5nbG9iYWxfdHlwZXMgPSBOVUxMOwotICBpbmZvLnRhZ3MgPSBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgQlVJTFRJTl9UWVBFX0NPVU5UOyBpKyspCi0gICAgaW5mby50eXBlcy5idWlsdGluc1tpXSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICBwID0gYnl0ZXM7Ci0gIHBlbmQgPSBpbmZvLnBlbmQ7Ci0gIHdoaWxlIChwIDwgcGVuZCkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYnl0ZSAqcmVjb3JkX3N0YXJ0OwotICAgICAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0KLSAgICAgIHJlY29yZF9zdGFydCA9IHA7Ci0KLSAgICAgIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqcCsrOwotCi0gICAgICBpZiAoYyA9PSBpZWVlX2F0X3JlY29yZF9lbnVtKQotCWMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAoKCh1bnNpZ25lZCBpbnQpIGMgPDwgOCkgfCAqcCsrKTsKLQotICAgICAgaWYgKGMgPD0gaWVlZV9udW1iZXJfcmVwZWF0X2VuZF9lbnVtKQotCXsKLQkgIGllZWVfZXJyb3IgKCZpbmZvLCByZWNvcmRfc3RhcnQsIF8oInVuZXhwZWN0ZWQgbnVtYmVyIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc3dpdGNoIChjKQotCXsKLQlkZWZhdWx0OgotCSAgaWVlZV9lcnJvciAoJmluZm8sIHJlY29yZF9zdGFydCwgXygidW5leHBlY3RlZCByZWNvcmQgdHlwZSIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQotCWNhc2UgaWVlZV9iYl9yZWNvcmRfZW51bToKLQkgIGlmICghIHBhcnNlX2llZWVfYmIgKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2JlX3JlY29yZF9lbnVtOgotCSAgaWYgKCEgcGFyc2VfaWVlZV9iZSAoJmluZm8sICZwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfbm5fcmVjb3JkOgotCSAgaWYgKCEgcGFyc2VfaWVlZV9ubiAoJmluZm8sICZwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfdHlfcmVjb3JkX2VudW06Ci0JICBpZiAoISBwYXJzZV9pZWVlX3R5ICgmaW5mbywgJnApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9hdG5fcmVjb3JkX2VudW06Ci0JICBpZiAoISBwYXJzZV9pZWVlX2F0biAoJmluZm8sICZwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby5ibG9ja3N0YWNrLmJzcCAhPSBpbmZvLmJsb2Nrc3RhY2suc3RhY2spCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoJmluZm8sIChjb25zdCBiZmRfYnl0ZSAqKSBOVUxMLAotCQkgIF8oImJsb2NrcyBsZWZ0IG9uIHN0YWNrIGF0IGVuZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhbiBJRUVFIEJCIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9pZWVlX2JiIChpbmZvLCBwcCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKmJsb2NrX3N0YXJ0OwotICBiZmRfYnl0ZSBiOwotICBiZmRfdm1hIHNpemU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICBjaGFyICpuYW1jb3B5ID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IGZuaW5keDsKLSAgYm9vbGVhbiBza2lwOwotCi0gIGJsb2NrX3N0YXJ0ID0gKnBwOwotCi0gIGIgPSAqKnBwOwotICArKypwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpCi0gICAgICB8fCAhIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm5pbmR4ID0gKHVuc2lnbmVkIGludCkgLTE7Ci0gIHNraXAgPSBmYWxzZTsKLQotICBzd2l0Y2ggKGIpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIEJCMTogVHlwZSBkZWZpbml0aW9ucyBsb2NhbCB0byBhIG1vZHVsZS4gICovCi0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIGlmIChuYW1jb3B5ID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT5zYXdfZmlsZW5hbWUgPSB0cnVlOwotCi0gICAgICAvKiBEaXNjYXJkIGFueSB2YXJpYWJsZXMgb3IgdHlwZXMgd2UgbWF5IGhhdmUgc2VlbiBiZWZvcmUuICAqLwotICAgICAgaWYgKGluZm8tPnZhcnMudmFycyAhPSBOVUxMKQotCWZyZWUgKGluZm8tPnZhcnMudmFycyk7Ci0gICAgICBpbmZvLT52YXJzLnZhcnMgPSBOVUxMOwotICAgICAgaW5mby0+dmFycy5hbGxvYyA9IDA7Ci0gICAgICBpZiAoaW5mby0+dHlwZXMudHlwZXMgIT0gTlVMTCkKLQlmcmVlIChpbmZvLT50eXBlcy50eXBlcyk7Ci0gICAgICBpbmZvLT50eXBlcy50eXBlcyA9IE5VTEw7Ci0gICAgICBpbmZvLT50eXBlcy5hbGxvYyA9IDA7Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIHR5cGVzIHRvIHRoZSBnbG9iYWwgdHlwZXMuICAqLwotICAgICAgaWYgKGluZm8tPmdsb2JhbF90eXBlcyAhPSBOVUxMKQotCXsKLQkgIGluZm8tPnR5cGVzLmFsbG9jID0gaW5mby0+Z2xvYmFsX3R5cGVzLT5hbGxvYzsKLQkgIGluZm8tPnR5cGVzLnR5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlICopCi0JCQkgICAgICAgeG1hbGxvYyAoaW5mby0+dHlwZXMuYWxsb2MKLQkJCQkJKiBzaXplb2YgKCppbmZvLT50eXBlcy50eXBlcykpKTsKLQkgIG1lbWNweSAoaW5mby0+dHlwZXMudHlwZXMsIGluZm8tPmdsb2JhbF90eXBlcy0+dHlwZXMsCi0JCSAgaW5mby0+dHlwZXMuYWxsb2MgKiBzaXplb2YgKCppbmZvLT50eXBlcy50eXBlcykpOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICAvKiBCQjI6IEdsb2JhbCB0eXBlIGRlZmluaXRpb25zLiAgVGhlIG5hbWUgaXMgc3VwcG9zZWQgdG8gYmUKLQkgZW1wdHksIGJ1dCB3ZSBkb24ndCBjaGVjay4gKi8KLSAgICAgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoaW5mby0+ZGhhbmRsZSwgIipnbG9iYWwqIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+c2F3X2ZpbGVuYW1lID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogQkIzOiBIaWdoIGxldmVsIG1vZHVsZSBibG9jayBiZWdpbi4gIFdlIGRvbid0IGhhdmUgdG8gZG8KLQkgYW55dGhpbmcgaGVyZS4gIFRoZSBuYW1lIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGFzIGZvcgotCSB0aGUgQkIxLCBidXQgd2UgZG9uJ3QgY2hlY2suICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICAvKiBCQjQ6IEdsb2JhbCBmdW5jdGlvbi4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzdGFja3NwYWNlLCB0eXBpbmR4LCBvZmZzZXQ7Ci0JZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc3RhY2tzcGFjZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGluZHgpCi0JICAgIHx8ICEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgc3RhY2sgc3BhY2UuICBGSVhNRS4gICovCi0KLQlpZiAodHlwaW5keCA8IDI1NikKLQkgIHsKLQkgICAgcmV0dXJuX3R5cGUgPSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgYmxvY2tfc3RhcnQsIHR5cGluZHgpOwotCSAgICBpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHR5cGluZHggLT0gMjU2OwotCSAgICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHR5cGluZHgsIHRydWUpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgZm5pbmR4ID0gdHlwaW5keDsKLQkgICAgcmV0dXJuX3R5cGUgPSBpbmZvLT50eXBlcy50eXBlc1t0eXBpbmR4XS50eXBlOwotCSAgICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoaW5mby0+ZGhhbmRsZSwgcmV0dXJuX3R5cGUpCi0JCT09IERFQlVHX0tJTkRfRlVOQ1RJT04pCi0JICAgICAgcmV0dXJuX3R5cGUgPSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGluZm8tPmRoYW5kbGUsCi0JCQkJCQkgICByZXR1cm5fdHlwZSk7Ci0JICB9Ci0KLQluYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQlpZiAobmFtY29weSA9PSBOVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSwgcmV0dXJuX3R5cGUsCi0JCQkJICAgICB0cnVlLCBvZmZzZXQpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDU6Ci0gICAgICAvKiBCQjU6IEZpbGUgbmFtZSBmb3Igc291cmNlIGxpbmUgbnVtYmVycy4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQkvKiBXZSBpZ25vcmUgdGhlIGRhdGUgYW5kIHRpbWUuICBGSVhNRS4gICovCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkgIHsKLQkgICAgYmZkX3ZtYSBpZ25vcmU7Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJmlnbm9yZSwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgcHJlc2VudCkKLQkgICAgICBicmVhazsKLQkgIH0KLQotCW5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCWlmIChuYW1jb3B5ID09IE5VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5KSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA2OgotICAgICAgLyogQkI2OiBMb2NhbCBmdW5jdGlvbiBvciBibG9jay4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzdGFja3NwYWNlLCB0eXBpbmR4LCBvZmZzZXQ7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnN0YWNrc3BhY2UpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0eXBpbmR4KQotCSAgICB8fCAhIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIHN0YWNrIHNwYWNlLiAgRklYTUUuICAqLwotCi0JaWYgKG5hbWxlbiA9PSAwKQotCSAgewotCSAgICBpZiAoISBkZWJ1Z19zdGFydF9ibG9jayAoaW5mby0+ZGhhbmRsZSwgb2Zmc2V0KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIC8qIENoYW5nZSBiIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIGJsb2NrCi0JICAgICAgIHJhdGhlciB0aGFuIGEgZnVuY3Rpb24uICAqLwotCSAgICBiID0gMHg4NjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIFRoZSBNUkkgQysrIGNvbXBpbGVyIHdpbGwgb3V0cHV0IGEgZmFrZSBmdW5jdGlvbiBuYW1lZAotCSAgICAgICBfX1hSWUNQUCB0byBob2xkIEMrKyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXZSBza2lwCi0JICAgICAgIHRoYXQgZnVuY3Rpb24uICBUaGlzIGlzIG5vdCBjcnVjaWFsLCBidXQgaXQgbWFrZXMKLQkgICAgICAgY29udmVydGluZyBmcm9tIElFRUUgdG8gb3RoZXIgZGVidWcgZm9ybWF0cyB3b3JrCi0JICAgICAgIGJldHRlci4gICovCi0JICAgIGlmIChzdHJuY21wIChuYW1lLCAiX19YUllDUFAiLCBuYW1sZW4pID09IDApCi0JICAgICAgc2tpcCA9IHRydWU7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0KLQkJaWYgKHR5cGluZHggPCAyNTYpCi0JCSAgewotCQkgICAgcmV0dXJuX3R5cGUgPSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgYmxvY2tfc3RhcnQsCi0JCQkJCQkgICAgIHR5cGluZHgpOwotCQkgICAgaWYgKHJldHVybl90eXBlID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICB0eXBpbmR4IC09IDI1NjsKLQkJICAgIGlmICghIGllZWVfYWxsb2NfdHlwZSAoaW5mbywgdHlwaW5keCwgdHJ1ZSkpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGZuaW5keCA9IHR5cGluZHg7Ci0JCSAgICByZXR1cm5fdHlwZSA9IGluZm8tPnR5cGVzLnR5cGVzW3R5cGluZHhdLnR5cGU7Ci0JCSAgICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoaW5mby0+ZGhhbmRsZSwgcmV0dXJuX3R5cGUpCi0JCQk9PSBERUJVR19LSU5EX0ZVTkNUSU9OKQotCQkgICAgICByZXR1cm5fdHlwZSA9IGRlYnVnX2dldF9yZXR1cm5fdHlwZSAoaW5mby0+ZGhhbmRsZSwKLQkJCQkJCQkgICByZXR1cm5fdHlwZSk7Ci0JCSAgfQotCi0JCW5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCQlpZiAobmFtY29weSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKCEgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5LAotCQkJCQkgICAgIHJldHVybl90eXBlLCBmYWxzZSwgb2Zmc2V0KSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEwOgotICAgICAgLyogQkIxMDogQXNzZW1ibGVyIG1vZHVsZSBzY29wZS4gIEluIHRoZSBub3JtYWwgY2FzZSwgd2UKLQkgY29tcGxldGVseSBpZ25vcmUgYWxsIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0gICAgICB7Ci0JY29uc3QgY2hhciAqaW5hbSwgKnZzdHI7Ci0JdW5zaWduZWQgbG9uZyBpbmFtbGVuLCB2c3RybGVuOwotCWJmZF92bWEgdG9vbF90eXBlOwotCWJvb2xlYW4gcHJlc2VudDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICghIGluZm8tPnNhd19maWxlbmFtZSkKLQkgIHsKLQkgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JICAgIGlmIChuYW1jb3B5ID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGluZm8tPmRoYW5kbGUsIG5hbWNvcHkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaW5mby0+c2F3X2ZpbGVuYW1lID0gdHJ1ZTsKLQkgIH0KLQotCWlmICghIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZpbmFtLCAmaW5hbWxlbikKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnRvb2xfdHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmdnN0ciwgJnZzdHJsZW4sICZwcmVzZW50KSkKLQkgIHJldHVybiBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCSAgewotCSAgICBiZmRfdm1hIGlnbm9yZTsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJmlnbm9yZSwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgcHJlc2VudCkKLQkgICAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMToKLSAgICAgIC8qIEJCMTE6IE1vZHVsZSBzZWN0aW9uLiAgV2UgY29tcGxldGVseSBpZ25vcmUgYWxsIHRoaXMKLQkgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzZWN0eXBlLCBzZWNpbmR4LCBvZmZzZXQsIG1hcDsKLQlib29sZWFuIHByZXNlbnQ7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNlY3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzZWNpbmR4KQotCSAgICB8fCAhIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkKLQkgICAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJm1hcCwgJnByZXNlbnQpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgYmxvY2tfc3RhcnQsIF8oInVua25vd24gQkIgdHlwZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAvKiBQdXNoIHRoaXMgYmxvY2sgb24gdGhlIGJsb2NrIHN0YWNrLiAgKi8KLQotICBpZiAoaW5mby0+YmxvY2tzdGFjay5ic3AgPj0gaW5mby0+YmxvY2tzdGFjay5zdGFjayArIEJMT0NLU1RBQ0tfU0laRSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCAoY29uc3QgYmZkX2J5dGUgKikgTlVMTCwgXygic3RhY2sgb3ZlcmZsb3ciKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPmJsb2Nrc3RhY2suYnNwLT5raW5kID0gYjsKLSAgaWYgKGIgPT0gNSkKLSAgICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+ZmlsZW5hbWUgPSBuYW1jb3B5OwotICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+Zm5pbmR4ID0gZm5pbmR4OwotICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+c2tpcCA9IHNraXA7Ci0gICsraW5mby0+YmxvY2tzdGFjay5ic3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhbiBJRUVFIEJFIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9pZWVlX2JlIChpbmZvLCBwcCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLXsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0KLSAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwIDw9IGluZm8tPmJsb2Nrc3RhY2suc3RhY2spCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwLCBfKCJzdGFjayB1bmRlcmZsb3ciKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAtLWluZm8tPmJsb2Nrc3RhY2suYnNwOwotCi0gIHN3aXRjaCAoaW5mby0+YmxvY2tzdGFjay5ic3AtPmtpbmQpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIC8qIFdoZW4gd2UgZW5kIHRoZSBnbG9iYWwgdHlwZWRlZnMgYmxvY2ssIHdlIGNvcHkgb3V0IHRoZSB0aGUKLSAgICAgICAgIGNvbnRlbnRzIG9mIGluZm8tPnZhcnMuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHZhcmlhYmxlIGluZGljZXMKLSAgICAgICAgIG1heSBiZSByZXVzZWQgaW4gdGhlIGxvY2FsIGJsb2Nrcy4gIEhvd2V2ZXIsIHdlIG5lZWQgdG8KLSAgICAgICAgIHByZXNlcnZlIHRoZW0gc28gdGhhdCB3ZSBjYW4gbG9jYXRlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEKLSAgICAgICAgIHJlZmVyZW5jZSB2YXJpYWJsZSB3aG9zZSB0eXBlIGlzIG5hbWVkIGluIHRoZSBnbG9iYWwgdHlwZWRlZgotICAgICAgICAgYmxvY2suICAqLwotICAgICAgaW5mby0+Z2xvYmFsX3ZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhcnMgKikKLQkJCSAgIHhtYWxsb2MgKHNpemVvZiAqaW5mby0+Z2xvYmFsX3ZhcnMpKTsKLSAgICAgIGluZm8tPmdsb2JhbF92YXJzLT5hbGxvYyA9IGluZm8tPnZhcnMuYWxsb2M7Ci0gICAgICBpbmZvLT5nbG9iYWxfdmFycy0+dmFycyA9ICgoc3RydWN0IGllZWVfdmFyICopCi0JCQkJIHhtYWxsb2MgKGluZm8tPnZhcnMuYWxsb2MKLQkJCQkJICAqIHNpemVvZiAoKmluZm8tPnZhcnMudmFycykpKTsKLSAgICAgIG1lbWNweSAoaW5mby0+Z2xvYmFsX3ZhcnMtPnZhcnMsIGluZm8tPnZhcnMudmFycywKLQkgICAgICBpbmZvLT52YXJzLmFsbG9jICogc2l6ZW9mICgqaW5mby0+dmFycy52YXJzKSk7Ci0KLSAgICAgIC8qIFdlIGFsc28gY29weSBvdXQgdGhlIG5vbiBidWlsdGluIHBhcnRzIG9mIGluZm8tPnR5cGVzLCBzaW5jZQotICAgICAgICAgdGhlIHR5cGVzIGFyZSBkaXNjYXJkZWQgd2hlbiB3ZSBzdGFydCBhIG5ldyBibG9jay4gICovCi0gICAgICBpbmZvLT5nbG9iYWxfdHlwZXMgPSAoKHN0cnVjdCBpZWVlX3R5cGVzICopCi0JCQkgICAgeG1hbGxvYyAoc2l6ZW9mICppbmZvLT5nbG9iYWxfdHlwZXMpKTsKLSAgICAgIGluZm8tPmdsb2JhbF90eXBlcy0+YWxsb2MgPSBpbmZvLT50eXBlcy5hbGxvYzsKLSAgICAgIGluZm8tPmdsb2JhbF90eXBlcy0+dHlwZXMgPSAoKHN0cnVjdCBpZWVlX3R5cGUgKikKLQkJCQkgICB4bWFsbG9jIChpbmZvLT50eXBlcy5hbGxvYwotCQkJCQkgICAgKiBzaXplb2YgKCppbmZvLT50eXBlcy50eXBlcykpKTsKLSAgICAgIG1lbWNweSAoaW5mby0+Z2xvYmFsX3R5cGVzLT50eXBlcywgaW5mby0+dHlwZXMudHlwZXMsCi0JICAgICAgaW5mby0+dHlwZXMuYWxsb2MgKiBzaXplb2YgKCppbmZvLT50eXBlcy50eXBlcykpOwotICAgICAgbWVtc2V0IChpbmZvLT5nbG9iYWxfdHlwZXMtPmJ1aWx0aW5zLCAwLAotCSAgICAgIHNpemVvZiAoaW5mby0+Z2xvYmFsX3R5cGVzLT5idWlsdGlucykpOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICBjYXNlIDY6Ci0gICAgICBpZiAoISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGluZm8tPmJsb2Nrc3RhY2suYnNwLT5za2lwKQotCXsKLQkgIGlmICghIGRlYnVnX2VuZF9mdW5jdGlvbiAoaW5mby0+ZGhhbmRsZSwgb2Zmc2V0ICsgMSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHg4NjoKLSAgICAgIC8qIFRoaXMgaXMgQkU2IHdoZW4gQkI2IHN0YXJ0ZWQgYSBibG9jayByYXRoZXIgdGhhbiBhIGxvY2FsCi0JIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChpbmZvLT5kaGFuZGxlLCBvZmZzZXQgKyAxKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNToKLSAgICAgIC8qIFdoZW4gd2UgZW5kIGEgQkI1LCB3ZSBsb29rIHVwIHRoZSBzdGFjayBmb3IgdGhlIGxhc3QgQkI1LCBpZgotICAgICAgICAgdGhlcmUgaXMgb25lLCBzbyB0aGF0IHdlIGNhbiBjYWxsIGRlYnVnX3N0YXJ0X3NvdXJjZS4gICovCi0gICAgICBpZiAoaW5mby0+YmxvY2tzdGFjay5ic3AgPiBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKQotCXsKLQkgIHN0cnVjdCBpZWVlX2Jsb2NrICpibDsKLQotCSAgYmwgPSBpbmZvLT5ibG9ja3N0YWNrLmJzcDsKLQkgIGRvCi0JICAgIHsKLQkgICAgICAtLWJsOwotCSAgICAgIGlmIChibC0+a2luZCA9PSA1KQotCQl7Ci0JCSAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChpbmZvLT5kaGFuZGxlLCBibC0+ZmlsZW5hbWUpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIHdoaWxlIChibCAhPSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTE6Ci0gICAgICBpZiAoISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFdlIGp1c3QgaWdub3JlIHRoZSBtb2R1bGUgc2l6ZS4gIEZJWE1FLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIE90aGVyIGJsb2NrIHR5cGVzIGRvIG5vdCBoYXZlIGFueSB0cmFpbGluZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGFuIE5OIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9pZWVlX25uIChpbmZvLCBwcCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKm5uX3N0YXJ0OwotICBiZmRfdm1hIHZhcmluZHg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCi0gIG5uX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmFyaW5keCA8IDMyKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIG5uX3N0YXJ0LCBfKCJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgdmFyaW5keCAtPSAzMjsKLQotICBpZiAodmFyaW5keCA+PSBpbmZvLT52YXJzLmFsbG9jKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBhbGxvYzsKLQotICAgICAgYWxsb2MgPSBpbmZvLT52YXJzLmFsbG9jOwotICAgICAgaWYgKGFsbG9jID09IDApCi0JYWxsb2MgPSA0OwotICAgICAgd2hpbGUgKHZhcmluZHggPj0gYWxsb2MpCi0JYWxsb2MgKj0gMjsKLSAgICAgIGluZm8tPnZhcnMudmFycyA9ICgoc3RydWN0IGllZWVfdmFyICopCi0JCQkgeHJlYWxsb2MgKGluZm8tPnZhcnMudmFycywKLQkJCQkgICBhbGxvYyAqIHNpemVvZiAqaW5mby0+dmFycy52YXJzKSk7Ci0gICAgICBtZW1zZXQgKGluZm8tPnZhcnMudmFycyArIGluZm8tPnZhcnMuYWxsb2MsIDAsCi0JICAgICAgKGFsbG9jIC0gaW5mby0+dmFycy5hbGxvYykgKiBzaXplb2YgKmluZm8tPnZhcnMudmFycyk7Ci0gICAgICBpbmZvLT52YXJzLmFsbG9jID0gYWxsb2M7Ci0gICAgfQotCi0gIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lID0gbmFtZTsKLSAgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWxlbiA9IG5hbWxlbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSBUWSByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV90eSAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICp0eV9zdGFydCwgKnR5X3Zhcl9zdGFydCwgKnR5X2NvZGVfc3RhcnQ7Ci0gIGJmZF92bWEgdHlwZWluZHgsIHZhcmluZHgsIHRjOwotICBQVFIgZGhhbmRsZTsKLSAgYm9vbGVhbiB0YWcsIHR5cGRlZjsKLSAgZGVidWdfdHlwZSAqYXJnX3Nsb3RzOwotICB1bnNpZ25lZCBsb25nIHR5cGVfYml0c2l6ZTsKLSAgZGVidWdfdHlwZSB0eXBlOwotCi0gIHR5X3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdHlwZWluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodHlwZWluZHggPCAyNTYpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfc3RhcnQsIF8oImlsbGVnYWwgdHlwZSBpbmRleCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgdHlwZWluZHggLT0gMjU2OwotICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHR5cGVpbmR4LCBmYWxzZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqKnBwICE9IDB4Y2UpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwLCBfKCJ1bmtub3duIFRZIGNvZGUiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICB0eV92YXJfc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2YXJpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZhcmluZHggPCAzMikKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV92YXJfc3RhcnQsIF8oImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB2YXJpbmR4IC09IDMyOwotCi0gIGlmICh2YXJpbmR4ID49IGluZm8tPnZhcnMuYWxsb2MgfHwgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV92YXJfc3RhcnQsIF8oInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBUWSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgdHlfY29kZV9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnRjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7Ci0KLSAgdGFnID0gZmFsc2U7Ci0gIHR5cGRlZiA9IGZhbHNlOwotICBhcmdfc2xvdHMgPSBOVUxMOwotICB0eXBlX2JpdHNpemUgPSAwOwotICBzd2l0Y2ggKHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfY29kZV9zdGFydCwgXygidW5rbm93biBUWSBjb2RlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSAnISc6Ci0gICAgICAvKiBVbmtub3duIHR5cGUsIHdpdGggc2l6ZS4gIFdlIHRyZWF0IGl0IGFzIGludC4gIEZJWE1FLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCXR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCBzaXplLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOiAvKiBBcnJheS4gICovCi0gICAgY2FzZSAnYSc6IC8qIEZPUlRSQU4gYXJyYXkgaW4gY29sdW1uL3JvdyBvcmRlci4gIEZJWE1FOiBOb3QKLQkJIGRpc3Rpbmd1aXNoZWQgZnJvbSBub3JtYWwgYXJyYXkuICAqLwotICAgICAgewotCWRlYnVnX3R5cGUgZWxlX3R5cGU7Ci0JYmZkX3ZtYSBsb3dlciwgdXBwZXI7Ci0KLQlpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZlbGVfdHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmxvd2VyKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdXBwZXIpKQotCSAgcmV0dXJuIGZhbHNlOwotCXR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIGVsZV90eXBlLAotCQkJCSAgICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCB0eV9jb2RlX3N0YXJ0LAotCQkJCQkJCSAoKHVuc2lnbmVkIGludCkKLQkJCQkJCQkgIGJ1aWx0aW5faW50KSksCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSBsb3dlciwKLQkJCQkgICAgICAoYmZkX3NpZ25lZF92bWEpIHVwcGVyLAotCQkJCSAgICAgIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRSc6Ci0gICAgICAvKiBTaW1wbGUgZW51bWVyYXRpb24uICAqLwotICAgICAgewotCWJmZF92bWEgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgYWxsb2M7Ci0JY29uc3QgY2hhciAqKm5hbWVzOwotCXVuc2lnbmVkIGludCBjOwotCWJmZF9zaWduZWRfdm1hICp2YWxzOwotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLQkvKiBGSVhNRTogd2UgaWdub3JlIHRoZSBlbnVtZXJhdGlvbiBzaXplLiAgKi8KLQotCWFsbG9jID0gMTA7Ci0JbmFtZXMgPSAoY29uc3QgY2hhciAqKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLQltZW1zZXQgKG5hbWVzLCAwLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotCWMgPSAwOwotCXdoaWxlICgxKQotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQkgICAgYm9vbGVhbiBwcmVzZW50OwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBwcmVzZW50KQotCSAgICAgIGJyZWFrOwotCi0JICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQkgICAgICB7Ci0JCWFsbG9jICs9IDEwOwotCQluYW1lcyA9ICgoY29uc3QgY2hhciAqKikKLQkJCSB4cmVhbGxvYyAobmFtZXMsIGFsbG9jICogc2l6ZW9mICpuYW1lcykpOwotCSAgICAgIH0KLQotCSAgICBuYW1lc1tjXSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JICAgIGlmIChuYW1lc1tjXSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgKytjOwotCSAgfQotCi0JbmFtZXNbY10gPSBOVUxMOwotCi0JdmFscyA9IChiZmRfc2lnbmVkX3ZtYSAqKSB4bWFsbG9jIChjICogc2l6ZW9mICp2YWxzKTsKLQlmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotCSAgdmFsc1tpXSA9IGk7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWxzKTsKLQl0YWcgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgIC8qIFN0cnVjdCB3aXRoIGJpdCBmaWVsZHMuICAqLwotICAgICAgewotCWJmZF92bWEgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgYWxsb2M7Ci0JZGVidWdfZmllbGQgKmZpZWxkczsKLQl1bnNpZ25lZCBpbnQgYzsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlhbGxvYyA9IDEwOwotCWZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKLQljID0gMDsKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQkgICAgZGVidWdfdHlwZSBmdHlwZTsKLQkgICAgYmZkX3ZtYSBiaXRwb3MsIGJpdHNpemU7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJmZ0eXBlKQotCQl8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYml0cG9zKQotCQl8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYml0c2l6ZSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQkgICAgICB7Ci0JCWFsbG9jICs9IDEwOwotCQlmaWVsZHMgPSAoKGRlYnVnX2ZpZWxkICopCi0JCQkgIHhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgICB9Ci0KLQkgICAgZmllbGRzW2NdID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKSwKLQkJCQkJICBmdHlwZSwgYml0cG9zLCBiaXRzaXplLAotCQkJCQkgIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDKTsKLQkgICAgaWYgKGZpZWxkc1tjXSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgKytjOwotCSAgfQotCi0JZmllbGRzW2NdID0gTlVMTDsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCB0cnVlLCBzaXplLCBmaWVsZHMpOwotCXRhZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ04nOgotICAgICAgLyogRW51bWVyYXRpb24uICAqLwotICAgICAgewotCXVuc2lnbmVkIGludCBhbGxvYzsKLQljb25zdCBjaGFyICoqbmFtZXM7Ci0JYmZkX3NpZ25lZF92bWEgKnZhbHM7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlhbGxvYyA9IDEwOwotCW5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0JdmFscyA9IChiZmRfc2lnbmVkX3ZtYSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotCWMgPSAwOwotCXdoaWxlICgxKQotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQkgICAgYm9vbGVhbiBwcmVzZW50OwotCSAgICBiZmRfdm1hIHZhbDsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgcHJlc2VudCkKLQkgICAgICBicmVhazsKLQkgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2YWwpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICAvKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGlzIHplcm8sIHRoZW4gdGhlIHZhbHVlIGlzCi0gICAgICAgICAgICAgICBhY3R1YWxseSB0aGUgc2l6ZSBvZiB0aGUgZW51bS4gIFdlIGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KLQkgICAgaWYgKG5hbWxlbiA9PSAwKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQkgICAgICB7Ci0JCWFsbG9jICs9IDEwOwotCQluYW1lcyA9ICgoY29uc3QgY2hhciAqKikKLQkJCSB4cmVhbGxvYyAobmFtZXMsIGFsbG9jICogc2l6ZW9mICpuYW1lcykpOwotCQl2YWxzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkJeHJlYWxsb2MgKHZhbHMsIGFsbG9jICogc2l6ZW9mICp2YWxzKSk7Ci0JICAgICAgfQotCi0JICAgIG5hbWVzW2NdID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQkgICAgaWYgKG5hbWVzW2NdID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB2YWxzW2NdID0gKGJmZF9zaWduZWRfdm1hKSB2YWw7Ci0JICAgICsrYzsKLQkgIH0KLQotCW5hbWVzW2NdID0gTlVMTDsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgbmFtZXMsIHZhbHMpOwotCXRhZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ08nOiAvKiBTbWFsbCBwb2ludGVyLiAgV2UgZG9uJ3QgZGlzdGluZ3Vpc2ggc21hbGwgYW5kIGxhcmdlCi0JCSBwb2ludGVycy4gIEZJWE1FLiAgKi8KLSAgICBjYXNlICdQJzogLyogTGFyZ2UgcG9pbnRlci4gICovCi0gICAgICB7Ci0JZGVidWdfdHlwZSB0OwotCi0JaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCB0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAvKiBSYW5nZS4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBsb3csIGhpZ2gsIHNpZ25lZHAsIHNpemU7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmxvdykKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmhpZ2gpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaWduZWRwKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9yYW5nZV90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIHNpemUsCi0JCQkJCQkJICAgISBzaWduZWRwKSwKLQkJCQkgICAgICAoYmZkX3NpZ25lZF92bWEpIGxvdywKLQkJCQkgICAgICAoYmZkX3NpZ25lZF92bWEpIGhpZ2gpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzogLyogU3RydWN0LiAgKi8KLSAgICBjYXNlICdVJzogLyogVW5pb24uICAqLwotICAgICAgewotCWJmZF92bWEgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgYWxsb2M7Ci0JZGVidWdfZmllbGQgKmZpZWxkczsKLQl1bnNpZ25lZCBpbnQgYzsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlhbGxvYyA9IDEwOwotCWZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKLQljID0gMDsKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQkgICAgYmZkX3ZtYSB0aW5keDsKLQkgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICAgIGRlYnVnX3R5cGUgZnR5cGU7Ci0JICAgIGJmZF92bWEgYml0c2l6ZTsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgcHJlc2VudCkKLQkgICAgICBicmVhazsKLQkgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0aW5keCkKLQkJfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJm9mZnNldCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGlmICh0aW5keCA8IDI1NikKLQkgICAgICB7Ci0JCWZ0eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHR5X2NvZGVfc3RhcnQsIHRpbmR4KTsKLQkJYml0c2l6ZSA9IDA7Ci0JCW9mZnNldCAqPSA4OwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IGllZWVfdHlwZSAqdDsKLQotCQl0aW5keCAtPSAyNTY7Ci0JCWlmICghIGllZWVfYWxsb2NfdHlwZSAoaW5mbywgdGluZHgsIHRydWUpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJdCA9IGluZm8tPnR5cGVzLnR5cGVzICsgdGluZHg7Ci0JCWZ0eXBlID0gdC0+dHlwZTsKLQkJYml0c2l6ZSA9IHQtPmJpdHNpemU7Ci0JCWlmIChiaXRzaXplID09IDApCi0JCSAgb2Zmc2V0ICo9IDg7Ci0JICAgICAgfQotCi0JICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQkgICAgICB7Ci0JCWFsbG9jICs9IDEwOwotCQlmaWVsZHMgPSAoKGRlYnVnX2ZpZWxkICopCi0JCQkgIHhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgICB9Ci0KLQkgICAgZmllbGRzW2NdID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKSwKLQkJCQkJICBmdHlwZSwgb2Zmc2V0LCBiaXRzaXplLAotCQkJCQkgIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDKTsKLQkgICAgaWYgKGZpZWxkc1tjXSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgKytjOwotCSAgfQotCi0JZmllbGRzW2NdID0gTlVMTDsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCB0YyA9PSAnUycsIHNpemUsIGZpZWxkcyk7Ci0JdGFnID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBUeXBlZGVmLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHR5cGRlZiA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgLyogUHJvY2VkdXJlLiAgRklYTUU6IFRoaXMgaXMgYW4gZXh0ZXJuIGRlY2xhcmF0aW9uLCB3aGljaCB3ZQotICAgICAgICAgaGF2ZSBubyB3YXkgb2YgcmVwcmVzZW50aW5nLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIGF0dHI7Ci0JZGVidWdfdHlwZSBydHlwZTsKLQliZmRfdm1hIG5hcmdzOwotCWJvb2xlYW4gcHJlc2VudDsKLQlzdHJ1Y3QgaWVlZV92YXIgKnB2OwotCi0JLyogRklYTUU6IFdlIGlnbm9yZSB0aGUgYXR0cmlidXRlIGFuZCB0aGUgYXJndW1lbnQgbmFtZXMuICAqLwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdHRyKQotCSAgICB8fCAhIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnJ0eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbmFyZ3MpKQotCSAgcmV0dXJuIGZhbHNlOwotCWRvCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCXdoaWxlIChwcmVzZW50KTsKLQotCXB2ID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKLQlwdi0+a2luZCA9IElFRUVfRVhURVJOQUw7Ci0JaWYgKHB2LT5uYW1sZW4gPiAwCi0JICAgICYmIGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIHJ0eXBlKSA9PSBERUJVR19LSU5EX1BPSU5URVIpCi0JICB7Ci0JICAgIC8qIFNldCB1cCB0aGUgcmV0dXJuIHR5cGUgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyB0bwotICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlIHNsb3QsIHNvIHRoYXQgd2UgY2FuIGNoYW5nZSBpdCB0byBhCi0gICAgICAgICAgICAgICByZWZlcmVuY2UgbGF0ZXIgaWYgYXBwcm9wcmlhdGUuICAqLwotCSAgICBwdi0+cHNsb3QgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnB2LT5wc2xvdCk7Ci0JICAgICpwdi0+cHNsb3QgPSBydHlwZTsKLQkgICAgcnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHB2LT5wc2xvdCwKLQkJCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICB9Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChkaGFuZGxlLCBydHlwZSwgKGRlYnVnX3R5cGUgKikgTlVMTCwKLQkJCQkJIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICAvKiBWb2lkLiAgVGhpcyBpcyBub3QgZG9jdW1lbnRlZCwgYnV0IHRoZSBNUkkgY29tcGlsZXIgZW1pdHMgaXQuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWic6Ci0gICAgICAvKiBBcnJheSB3aXRoIDAgbG93ZXIgYm91bmQuICAqLwotICAgICAgewotCWRlYnVnX3R5cGUgZXR5cGU7Ci0JYmZkX3ZtYSBoaWdoOwotCi0JaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmZXR5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZoaWdoKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIGV0eXBlLAotCQkJCSAgICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCB0eV9jb2RlX3N0YXJ0LAotCQkJCQkJCSAoKHVuc2lnbmVkIGludCkKLQkJCQkJCQkgIGJ1aWx0aW5faW50KSksCi0JCQkJICAgICAgMCwgKGJmZF9zaWduZWRfdm1hKSBoaWdoLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2MnOiAvKiBDb21wbGV4LiAgKi8KLSAgICBjYXNlICdkJzogLyogRG91YmxlIGNvbXBsZXguICAqLwotICAgICAgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0KLQkvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQgdGhlIG5hbWUgbWVhbnMuICAqLwotCi0JaWYgKCEgaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCB0YyA9PSAnYycgPyA0IDogOCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgICAgLyogUGFzY2FsIGZpbGUgbmFtZS4gIEZJWE1FLiAgKi8KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X2NvZGVfc3RhcnQsIF8oIlBhc2NhbCBmaWxlIG5hbWUgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgJ2cnOgotICAgICAgLyogQml0ZmllbGQgdHlwZS4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzaWduZWRwLCBiaXRzaXplLCBkdW1teTsKLQljb25zdCBiZmRfYnl0ZSAqaG9sZDsKLQlib29sZWFuIHByZXNlbnQ7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpZ25lZHApCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZiaXRzaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIEkgdGhpbmsgdGhlIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IHRoZXJlIGlzIGEgdHlwZSBpbmRleCwKLSAgICAgICAgICAgYnV0IHNvbWUgYWN0dWFsIGZpbGVzIGRvIG5vdCBoYXZlIG9uZS4gICovCi0JaG9sZCA9ICpwcDsKLQlpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJmR1bW15LCAmcHJlc2VudCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKCEgcHJlc2VudCkKLQkgIHsKLQkgICAgLyogRklYTUU6IFRoaXMgaXMganVzdCBhIGd1ZXNzLiAgKi8KLQkgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsCi0JCQkJCXNpZ25lZHAgPyBmYWxzZSA6IHRydWUpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgKnBwID0gaG9sZDsKLQkgICAgaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdHlwZSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCXR5cGVfYml0c2l6ZSA9IGJpdHNpemU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ24nOgotICAgICAgLyogUXVhbGlmaWVyLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIGtpbmQ7Ci0JZGVidWdfdHlwZSB0OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZraW5kKQotCSAgICB8fCAhIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0Jc3dpdGNoIChraW5kKQotCSAgewotCSAgZGVmYXVsdDoKLQkgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfc3RhcnQsIF8oInVuc3VwcG9ydGVkIHF1YWxpZmVyIikpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGNhc2UgMToKLQkgICAgdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAoZGhhbmRsZSwgdCk7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUgKGRoYW5kbGUsIHQpOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgICAvKiBTZXQuICAqLwotICAgICAgewotCWJmZF92bWEgc2l6ZTsKLQlkZWJ1Z190eXBlIGV0eXBlOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKQotCSAgICB8fCAhIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJmV0eXBlKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIEZJWE1FOiBXZSBpZ25vcmUgdGhlIHNpemUuICAqLwotCi0JdHlwZSA9IGRlYnVnX21ha2Vfc2V0X3R5cGUgKGRoYW5kbGUsIGV0eXBlLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgICAgLyogUHJvY2VkdXJlIHdpdGggY29tcGlsZXIgZGVwZW5kZW5jaWVzLiAgKi8KLSAgICAgIHsKLQlzdHJ1Y3QgaWVlZV92YXIgKnB2OwotCWJmZF92bWEgYXR0ciwgZnJhbWVfdHlwZSwgcHVzaF9tYXNrLCBuYXJncywgbGV2ZWwsIGZhdGhlcjsKLQlkZWJ1Z190eXBlIHJ0eXBlOwotCWRlYnVnX3R5cGUgKmFyZ190eXBlczsKLQlib29sZWFuIHZhcmFyZ3M7Ci0JYm9vbGVhbiBwcmVzZW50OwotCi0JLyogRklYTUU6IFdlIGlnbm9yZSBzb21lIG9mIHRoaXMgaW5mb3JtYXRpb24uICAqLwotCi0JcHYgPSBpbmZvLT52YXJzLnZhcnMgKyB2YXJpbmR4OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdHRyKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmZnJhbWVfdHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnB1c2hfbWFzaykKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZydHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJm5hcmdzKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAobmFyZ3MgPT0gKGJmZF92bWEpIC0xKQotCSAgewotCSAgICBhcmdfdHlwZXMgPSBOVUxMOwotCSAgICB2YXJhcmdzID0gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgICBhcmdfdHlwZXMgPSAoKGRlYnVnX3R5cGUgKikKLQkJCSB4bWFsbG9jICgobmFyZ3MgKyAxKSAqIHNpemVvZiAqYXJnX3R5cGVzKSk7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQotCSAgICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgYXJnX3R5cGVzICsgaSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAvKiBJZiB0aGUgbGFzdCB0eXBlIGlzIHBvaW50ZXIgdG8gdm9pZCwgdGhpcyBpcyByZWFsbHkgYQotICAgICAgICAgICAgICAgdmFyYXJncyBmdW5jdGlvbi4gICovCi0JICAgIHZhcmFyZ3MgPSBmYWxzZTsKLQkgICAgaWYgKG5hcmdzID4gMCkKLQkgICAgICB7Ci0JCWRlYnVnX3R5cGUgbGFzdDsKLQotCQlsYXN0ID0gYXJnX3R5cGVzW25hcmdzIC0gMV07Ci0JCWlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBsYXN0KSA9PSBERUJVR19LSU5EX1BPSU5URVIKLQkJICAgICYmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLAotCQkJCQkgICAgIGRlYnVnX2dldF90YXJnZXRfdHlwZSAoZGhhbmRsZSwKLQkJCQkJCQkJICAgIGxhc3QpKQotCQkJPT0gREVCVUdfS0lORF9WT0lEKSkKLQkJICB7Ci0JCSAgICAtLW5hcmdzOwotCQkgICAgdmFyYXJncyA9IHRydWU7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBJZiB0aGVyZSBhcmUgYW55IHBvaW50ZXIgYXJndW1lbnRzLCB0dXJuIHRoZW0gaW50bwotICAgICAgICAgICAgICAgaW5kaXJlY3QgdHlwZXMgaW4gY2FzZSB3ZSBsYXRlciBuZWVkIHRvIGNvbnZlcnQgdGhlbSB0bwotICAgICAgICAgICAgICAgcmVmZXJlbmNlIHR5cGVzLiAgKi8KLQkgICAgZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCi0JICAgICAgewotCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgYXJnX3R5cGVzW2ldKQotCQkgICAgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotCQkgIHsKLQkJICAgIGlmIChhcmdfc2xvdHMgPT0gTlVMTCkKLQkJICAgICAgewotCQkJYXJnX3Nsb3RzID0gKChkZWJ1Z190eXBlICopCi0JCQkJICAgICB4bWFsbG9jIChuYXJncyAqIHNpemVvZiAqYXJnX3Nsb3RzKSk7Ci0JCQltZW1zZXQgKGFyZ19zbG90cywgMCwgbmFyZ3MgKiBzaXplb2YgKmFyZ19zbG90cyk7Ci0JCSAgICAgIH0KLQkJICAgIGFyZ19zbG90c1tpXSA9IGFyZ190eXBlc1tpXTsKLQkJICAgIGFyZ190eXBlc1tpXSA9Ci0JCSAgICAgIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwKLQkJCQkJCWFyZ19zbG90cyArIGksCi0JCQkJCQkoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGFyZ190eXBlc1tuYXJnc10gPSBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZsZXZlbCkKLQkgICAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJmZhdGhlciwgJnByZXNlbnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogV2UgY2FuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGdsb2JhbCBmdW5jdGlvbiBhbmQgYSBzdGF0aWMKLSAgICAgICAgICAgZnVuY3Rpb24uICAqLwotCXB2LT5raW5kID0gSUVFRV9GVU5DVElPTjsKLQotCWlmIChwdi0+bmFtbGVuID4gMAotCSAgICAmJiBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBydHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotCSAgewotCSAgICAvKiBTZXQgdXAgdGhlIHJldHVybiB0eXBlIGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgdG8KLSAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSBzbG90LCBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UgaXQgdG8gYQotICAgICAgICAgICAgICAgcmVmZXJlbmNlIGxhdGVyIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgICAgcHYtPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpwdi0+cHNsb3QpOwotCSAgICAqcHYtPnBzbG90ID0gcnR5cGU7Ci0JICAgIHJ0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBwdi0+cHNsb3QsCi0JCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgfQotCi0JdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgcnR5cGUsIGFyZ190eXBlcywgdmFyYXJncyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogUmVjb3JkIHRoZSB0eXBlIGluIHRoZSB0YWJsZS4gICovCi0KLSAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0udHlwZSA9IHR5cGU7Ci0KLSAgaWYgKCh0YWcgfHwgdHlwZGVmKQotICAgICAgJiYgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWxlbiA+IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IHNhdmVzdHJpbmcgKGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lLAotCQkJIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1sZW4pOwotICAgICAgaWYgKHR5cGRlZikKLQl0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKLSAgICAgIGVsc2UgaWYgKHRjID09ICdFJyB8fCB0YyA9PSAnTicpCi0JdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgaWVlZV90YWcgKml0OwotCi0JICAvKiBXZSBtdXN0IGFsbG9jYXRlIGFsbCBzdHJ1Y3QgdGFncyBhcyBpbmRpcmVjdCB0eXBlcywgc28KLSAgICAgICAgICAgICB0aGF0IGlmIHdlIGxhdGVyIHNlZSBhIGRlZmluaXRpb24gb2YgdGhlIHRhZyBhcyBhIEMrKwotICAgICAgICAgICAgIHJlY29yZCB3ZSBjYW4gdXBkYXRlIHRoZSBpbmRpcmVjdCBzbG90IGFuZCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgY2hhbmdlIGFsbCB0aGUgZXhpc3RpbmcgcmVmZXJlbmNlcy4gICovCi0JICBpdCA9IChzdHJ1Y3QgaWVlZV90YWcgKikgeG1hbGxvYyAoc2l6ZW9mICppdCk7Ci0JICBtZW1zZXQgKGl0LCAwLCBzaXplb2YgKml0KTsKLQkgIGl0LT5uZXh0ID0gaW5mby0+dGFnczsKLQkgIGluZm8tPnRhZ3MgPSBpdDsKLQkgIGl0LT5uYW1lID0gbmFtZTsKLQkgIGl0LT5zbG90ID0gdHlwZTsKLQotCSAgdHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgJml0LT5zbG90LCBuYW1lKTsKLQkgIHR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7Ci0KLQkgIGl0LT50eXBlID0gdHlwZTsKLQl9Ci0gICAgICBpZiAodHlwZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLnR5cGUgPSB0eXBlOwotICBpbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0uYXJnX3Nsb3RzID0gYXJnX3Nsb3RzOwotICBpbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0uYml0c2l6ZSA9IHR5cGVfYml0c2l6ZTsKLQotICAvKiBXZSBtYXkgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCB0eXBlIGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcKLSAgICAgdG8gc2xvdC4gIEl0IGRvZXMgbm8gaGFybSB0byByZXBsYWNlIHRoZSBpbmRpcmVjdCB0eXBlIHdpdGggdGhlCi0gICAgIHJlYWwgdHlwZS4gIEZpbGxpbmcgaW4gc2xvdCBhcyB3ZWxsIGhhbmRsZXMgdGhlIGluZGlyZWN0IHR5cGVzCi0gICAgIHdoaWNoIGFyZSBhbHJlYWR5IGhhbmdpbmcgYXJvdW5kLiAgKi8KLSAgaWYgKGluZm8tPnR5cGVzLnR5cGVzW3R5cGVpbmR4XS5wc2xvdCAhPSBOVUxMKQotICAgICppbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0ucHNsb3QgPSB0eXBlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhbiBBVE4gcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2llZWVfYXRuIChpbmZvLCBwcCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKmF0bl9zdGFydCwgKmF0bl9jb2RlX3N0YXJ0OwotICBiZmRfdm1hIHZhcmluZHg7Ci0gIHN0cnVjdCBpZWVlX3ZhciAqcHZhcjsKLSAgZGVidWdfdHlwZSB0eXBlOwotICBiZmRfdm1hIGF0bl9jb2RlOwotICBQVFIgZGhhbmRsZTsKLSAgYmZkX3ZtYSB2LCB2MiwgdjMsIHY0LCB2NTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0gIGNoYXIgKm5hbWNvcHk7Ci0gIGJvb2xlYW4gcHJlc2VudDsKLSAgaW50IGJsb2NrdHlwZTsKLQotICBhdG5fc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2YXJpbmR4KQotICAgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0eXBlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXRuX2NvZGVfc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdG5fY29kZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2YXJpbmR4ID09IDApCi0gICAgewotICAgICAgcHZhciA9IE5VTEw7Ci0gICAgICBuYW1lID0gIiI7Ci0gICAgICBuYW1sZW4gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAodmFyaW5keCA8IDMyKQotICAgIHsKLSAgICAgIC8qIFRoZSBNUkkgY29tcGlsZXIgcmVwb3J0ZWRseSBzb21ldGltZXMgZW1pdHMgdmFyaWFibGUgbGlmZXRpbWUKLSAgICAgICAgIGluZm9ybWF0aW9uIGZvciBhIHJlZ2lzdGVyLiAgV2UganVzdCBpZ25vcmUgaXQuICAqLwotICAgICAgaWYgKGF0bl9jb2RlID09IDkpCi0JcmV0dXJuIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdik7Ci0KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9zdGFydCwgXygiaWxsZWdhbCB2YXJpYWJsZSBpbmRleCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YXJpbmR4IC09IDMyOwotICAgICAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYwotCSAgfHwgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGUgTVJJIGNvbXBpbGVyIG9yIGxpbmtlciBzb21ldGltZXMgb21pdHMgdGhlIE5OIHJlY29yZAotICAgICAgICAgICAgIGZvciBhIHBtaXNjIHJlY29yZC4gICovCi0JICBpZiAoYXRuX2NvZGUgPT0gNjIpCi0JICAgIHsKLQkgICAgICBpZiAodmFyaW5keCA+PSBpbmZvLT52YXJzLmFsbG9jKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0JCSAgYWxsb2MgPSBpbmZvLT52YXJzLmFsbG9jOwotCQkgIGlmIChhbGxvYyA9PSAwKQotCQkgICAgYWxsb2MgPSA0OwotCQkgIHdoaWxlICh2YXJpbmR4ID49IGFsbG9jKQotCQkgICAgYWxsb2MgKj0gMjsKLQkJICBpbmZvLT52YXJzLnZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhciAqKQotCQkJCSAgICAgeHJlYWxsb2MgKGluZm8tPnZhcnMudmFycywKLQkJCQkJICAgICAgIChhbGxvYwotCQkJCQkJKiBzaXplb2YgKmluZm8tPnZhcnMudmFycykpKTsKLQkJICBtZW1zZXQgKGluZm8tPnZhcnMudmFycyArIGluZm8tPnZhcnMuYWxsb2MsIDAsCi0JCQkgICgoYWxsb2MgLSBpbmZvLT52YXJzLmFsbG9jKQotCQkJICAgKiBzaXplb2YgKmluZm8tPnZhcnMudmFycykpOwotCQkgIGluZm8tPnZhcnMuYWxsb2MgPSBhbGxvYzsKLQkJfQotCi0JICAgICAgcHZhciA9IGluZm8tPnZhcnMudmFycyArIHZhcmluZHg7Ci0JICAgICAgcHZhci0+bmFtZSA9ICIiOwotCSAgICAgIHB2YXItPm5hbWxlbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9zdGFydCwgXygidW5kZWZpbmVkIHZhcmlhYmxlIGluIEFUTiIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHB2YXIgPSBpbmZvLT52YXJzLnZhcnMgKyB2YXJpbmR4OwotCi0gICAgICBwdmFyLT50eXBlID0gdHlwZTsKLQotICAgICAgbmFtZSA9IHB2YXItPm5hbWU7Ci0gICAgICBuYW1sZW4gPSBwdmFyLT5uYW1sZW47Ci0gICAgfQotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSB3aXRoIGEgcG9pbnRlcgotICAgICB0eXBlLCBjaGFuZ2UgdGhlIHR5cGUgdG8gYW4gaW5kaXJlY3QgdHlwZSBzbyB0aGF0IHdlIGNhbiBsYXRlcgotICAgICBjaGFuZ2UgaXQgdG8gYSByZWZlcmVuY2UgdHlwZSBpZiB3ZSBlbmNvdW50ZXIgYSBDKysgcG1pc2MgJ1InCi0gICAgIHJlY29yZC4gICovCi0gIGlmIChwdmFyICE9IE5VTEwKLSAgICAgICYmIHR5cGUgIT0gREVCVUdfVFlQRV9OVUxMCi0gICAgICAmJiBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCB0eXBlKSA9PSBERUJVR19LSU5EX1BPSU5URVIpCi0gICAgewotICAgICAgc3dpdGNoIChhdG5fY29kZSkKLQl7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQljYXNlIDM6Ci0JY2FzZSA1OgotCWNhc2UgODoKLQljYXNlIDEwOgotCSAgcHZhci0+cHNsb3QgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnB2YXItPnBzbG90KTsKLQkgICpwdmFyLT5wc2xvdCA9IHR5cGU7Ci0JICB0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBwdmFyLT5wc2xvdCwKLQkJCQkJICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICBwdmFyLT50eXBlID0gdHlwZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgc3dpdGNoIChhdG5fY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9jb2RlX3N0YXJ0LCBfKCJ1bmtub3duIEFUTiB0eXBlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSAxOgotICAgICAgLyogQXV0b21hdGljIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAodHlwZSA9PSBOVUxMKQotCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXB2YXItPmtpbmQgPSBJRUVFX0xPQ0FMOwotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwgREVCVUdfTE9DQUwsIHYpOwotCi0gICAgY2FzZSAyOgotICAgICAgLyogUmVnaXN0ZXIgdmFyaWFibGUuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIGlmICh0eXBlID09IE5VTEwpCi0JdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGlmIChwdmFyICE9IE5VTEwpCi0JcHZhci0+a2luZCA9IElFRUVfTE9DQUw7Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLCBERUJVR19SRUdJU1RFUiwKLQkJCQkgICAgaWVlZV9yZWdub190b19nZW5yZWcgKGluZm8tPmFiZmQsIHYpKTsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIFN0YXRpYyB2YXJpYWJsZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwIDw9IGluZm8tPmJsb2Nrc3RhY2suc3RhY2spCi0JYmxvY2t0eXBlID0gMDsKLSAgICAgIGVsc2UKLQlibG9ja3R5cGUgPSBpbmZvLT5ibG9ja3N0YWNrLmJzcFstMV0ua2luZDsKLSAgICAgIGlmIChwdmFyICE9IE5VTEwpCi0JewotCSAgaWYgKGJsb2NrdHlwZSA9PSA0IHx8IGJsb2NrdHlwZSA9PSA2KQotCSAgICBwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKLQkgIGVsc2UKLQkgICAgcHZhci0+a2luZCA9IElFRUVfU1RBVElDOwotCX0KLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsCi0JCQkJICAgIChibG9ja3R5cGUgPT0gNCB8fCBibG9ja3R5cGUgPT0gNgotCQkJCSAgICAgPyBERUJVR19MT0NBTF9TVEFUSUMKLQkJCQkgICAgIDogREVCVUdfU1RBVElDKSwKLQkJCQkgICAgdik7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICAvKiBFeHRlcm5hbCBmdW5jdGlvbi4gIFdlIGRvbid0IGN1cnJlbnRseSByZWNvcmQgdGhlc2UuICBGSVhNRS4gICovCi0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXB2YXItPmtpbmQgPSBJRUVFX0VYVEVSTkFMOwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDU6Ci0gICAgICAvKiBFeHRlcm5hbCB2YXJpYWJsZS4gIFdlIGRvbid0IGN1cnJlbnRseSByZWNvcmQgdGhlc2UuICBGSVhNRS4gICovCi0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXB2YXItPmtpbmQgPSBJRUVFX0VYVEVSTkFMOwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDc6Ci0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCi0JICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdjIpCi0JICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjMsICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHJlc2VudCkKLQl7Ci0JICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnY0LCAmcHJlc2VudCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGp1c3QgaWdub3JlIHRoZSB0d28gb3B0aW9uYWwgZmllbGRzIGluIHYzIGFuZCB2NCwgc2luY2UKLSAgICAgICAgIHRoZXkgYXJlIG5vdCBkZWZpbmVkLiAgKi8KLQotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2MykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGNvbHVtbiBudW1iZXIuICBGSVhNRS4gICovCi0KLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfbGluZSAoZGhhbmRsZSwgdiwgdjMpOwotCi0gICAgY2FzZSA4OgotICAgICAgLyogR2xvYmFsIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAodHlwZSA9PSBOVUxMKQotCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXB2YXItPmtpbmQgPSBJRUVFX0dMT0JBTDsKLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX0dMT0JBTCwgdik7Ci0KLSAgICBjYXNlIDk6Ci0gICAgICAvKiBWYXJpYWJsZSBsaWZldGltZSBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgMTA6Ci0gICAgICAvKiBMb2NrZWQgcmVnaXN0ZXIuICBUaGUgc3BlYyBzYXlzIHRoYXQgdGhlcmUgYXJlIHR3byByZXF1aXJlZAotICAgICAgICAgZmllbGRzLCBidXQgYXQgbGVhc3Qgb24gb2NjYXNpb24gdGhlIE1SSSBjb21waWxlciBvbmx5IGVtaXRzCi0gICAgICAgICBvbmUuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQotCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYyLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJIHRoaW5rIHRoaXMgbWVhbnMgYSB2YXJpYWJsZSB0aGF0IGlzIGJvdGggaW4gYSByZWdpc3RlciBhbmQKLSAgICAgICAgIGEgZnJhbWUgc2xvdC4gIFdlIGlnbm9yZSB0aGUgZnJhbWUgc2xvdC4gIEZJWE1FLiAgKi8KLQotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAodHlwZSA9PSBOVUxMKQotCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXB2YXItPmtpbmQgPSBJRUVFX0xPQ0FMOwotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwgREVCVUdfUkVHSVNURVIsIHYpOwotCi0gICAgY2FzZSAxMToKLSAgICAgIC8qIFJlc2VydmVkIGZvciBGT1JUUkFOIGNvbW1vbi4gICovCi0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fY29kZV9zdGFydCwgXygidW5zdXBwb3J0ZWQgQVROMTEiKSk7Ci0KLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDEyOgotICAgICAgLyogQmFzZWQgdmFyaWFibGUuICAqLwotICAgICAgdjMgPSAwOwotICAgICAgdjQgPSAweDgwOwotICAgICAgdjUgPSAwOwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQotCSAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYyKQotCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYzLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHByZXNlbnQpCi0JewotCSAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2NCwgJnByZXNlbnQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAocHJlc2VudCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjUsICZwcmVzZW50KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KLQotICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsIF8oInVuc3VwcG9ydGVkIEFUTjEyIikpOwotCi0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSAxNjoKLSAgICAgIC8qIENvbnN0YW50LiAgVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgdGhhdCBJIGhhdmUgaXMgYW1iaWd1b3VzLAotICAgICAgICAgc28gSSdtIG5vdCBnb2luZyB0byB0cnkgdG8gaW1wbGVtZW50IGl0LiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwcmVzZW50KQotCXsKLQkgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjIsICZwcmVzZW50KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKHByZXNlbnQpCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICgoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwID09IGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtKQotCXsKLQkgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgMTk6Ci0gICAgICAvKiBTdGF0aWMgdmFyaWFibGUgZnJvbSBhc3NlbWJsZXIuICAqLwotICAgICAgdjIgPSAwOwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQotCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYyLCAmcHJlc2VudCkKLQkgIHx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2MykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICAvKiBXZSBkb24ndCByZWFsbHkgaGFuZGxlIHRoaXMgY29ycmVjdGx5LiAgRklYTUUuICAqLwotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwKLQkJCQkgICAgZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpLAotCQkJCSAgICB2MiAhPSAwID8gREVCVUdfR0xPQkFMIDogREVCVUdfU1RBVElDLAotCQkJCSAgICB2Myk7Ci0KLSAgICBjYXNlIDYyOgotICAgICAgLyogUHJvY2VkdXJlIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24uICAqLwotICAgIGNhc2UgNjM6Ci0gICAgICAvKiBWYXJpYWJsZSBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uLiAgKi8KLSAgICBjYXNlIDY0OgotICAgICAgLyogTW9kdWxlIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQotCSAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYyKQotCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGF0bl9jb2RlID09IDYyICYmIHYgPT0gODApCi0JewotCSAgaWYgKHByZXNlbnQpCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fY29kZV9zdGFydCwKLQkJCSAgXygidW5leHBlY3RlZCBzdHJpbmcgaW4gQysrIG1pc2MiKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICByZXR1cm4gaWVlZV9yZWFkX2N4eF9taXNjIChpbmZvLCBwcCwgdjIpOwotCX0KLQotICAgICAgLyogV2UganVzdCBpZ25vcmUgYWxsIG9mIHRoaXMgc3R1ZmYuICBGSVhNRS4gICovCi0KLSAgICAgIGZvciAoOyB2MiA+IDA7IC0tdjIpCi0JewotCSAgc3dpdGNoICgoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwLCBfKCJiYWQgbWlzYyByZWNvcmQiKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGNhc2UgaWVlZV9hdF9yZWNvcmRfZW51bToKLQkgICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtOgotCSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBIYW5kbGUgQysrIGRlYnVnZ2luZyBtaXNjZWxsYW5lb3VzIHJlY29yZHMuICBUaGlzIGlzIGNhbGxlZCBmb3IKLSAgIHByb2NlZHVyZSBtaXNjZWxsYW5lb3VzIHJlY29yZHMgb2YgdHlwZSA4MC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfY3h4X21pc2MgKGluZm8sIHBwLCBjb3VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBiZmRfdm1hIGNhdGVnb3J5OwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIC8qIEdldCB0aGUgY2F0ZWdvcnkgb2YgQysrIG1pc2MgcmVjb3JkLiAgKi8KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjYXRlZ29yeSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAtLWNvdW50OwotCi0gIHN3aXRjaCAoY2F0ZWdvcnkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5yZWNvZ25pemVkIEMrKyBtaXNjIHJlY29yZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2N4eF9jbGFzcyAoaW5mbywgcHAsIGNvdW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgICAgewotCWJmZF92bWEgZmxhZ3M7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQotCS8qIFRoZSBJRUVFIHNwZWMgaW5kaWNhdGVzIHRoYXQgdGhlICdNJyByZWNvcmQgb25seSBoYXMgYQotICAgICAgICAgICBmbGFncyBmaWVsZC4gIFRoZSBNUkkgY29tcGlsZXIgYWxzbyBlbWl0cyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgZnVuY3Rpb24uICAqLwotCi0JaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKCpwcCA8IGluZm8tPnBlbmQKLQkgICAgJiYgKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcCA9PSBpZWVlX2F0X3JlY29yZF9lbnVtKQotCSAgewotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JLyogVGhpcyBpcyBlbWl0dGVkIGZvciBtZXRob2QgZnVuY3Rpb25zLCBidXQgSSBkb24ndCB0aGluayB3ZQotICAgICAgICAgICBjYXJlIHZlcnkgbXVjaC4gIEl0IG1pZ2h0IGhlbHAgaWYgaXQgdG9sZCB1cyB1c2VmdWwKLSAgICAgICAgICAgaW5mb3JtYXRpb24gbGlrZSB0aGUgY2xhc3Mgd2l0aCB3aGljaCB0aGlzIGZ1bmN0aW9uIGlzCi0gICAgICAgICAgIGFzc29jaWF0ZWQsIGJ1dCBpdCBkb2Vzbid0LCBzbyBpdCBpc24ndCBoZWxwZnVsLiAgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgICBpZiAoISBpZWVlX3JlYWRfY3h4X2RlZmF1bHRzIChpbmZvLCBwcCwgY291bnQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneic6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqbmFtZSwgKm1hbmdsZWQsICpjbGFzczsKLQl1bnNpZ25lZCBsb25nIG5hbWxlbiwgbWFuZ2xlZGxlbiwgY2xhc3NsZW47Ci0JYmZkX3ZtYSBjb250cm9sOwotCi0JLyogUG9pbnRlciB0byBtZW1iZXIuICAqLwotCi0JaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pCi0JICAgIHx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm1hbmdsZWQsICZtYW5nbGVkbGVuKQotCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZjbGFzcywgJmNsYXNzbGVuKQotCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY29udHJvbCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBGSVhNRTogV2Ugc2hvdWxkIG5vdyB0cmFjayBkb3duIG5hbWUgYW5kIGNoYW5nZSBpdHMgdHlwZS4gICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgaWYgKCEgaWVlZV9yZWFkX3JlZmVyZW5jZSAoaW5mbywgcHApKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIEMrKyBjbGFzcyBkZWZpbml0aW9uLiAgVGhpcyBpcyBhIHBtaXNjIHR5cGUgODAgcmVjb3JkIG9mCi0gICBjYXRlZ29yeSAnVCcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX2N4eF9jbGFzcyAoaW5mbywgcHAsIGNvdW50KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGJmZF92bWEgY2xhc3M7Ci0gIGNvbnN0IGNoYXIgKnRhZzsKLSAgdW5zaWduZWQgbG9uZyB0YWdsZW47Ci0gIHN0cnVjdCBpZWVlX3RhZyAqaXQ7Ci0gIFBUUiBkaGFuZGxlOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICB1bnNpZ25lZCBpbnQgZmllbGRfY291bnQsIGZpZWxkX2FsbG9jOwotICBkZWJ1Z19iYXNlY2xhc3MgKmJhc2VjbGFzc2VzOwotICB1bnNpZ25lZCBpbnQgYmFzZWNsYXNzZXNfY291bnQsIGJhc2VjbGFzc2VzX2FsbG9jOwotICBjb25zdCBkZWJ1Z19maWVsZCAqc3RydWN0ZmllbGRzOwotICBzdHJ1Y3QgaWVlZV9tZXRob2QKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0gICAgICBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdmFyaWFudHM7Ci0gICAgICB1bnNpZ25lZCBjb3VudDsKLSAgICAgIHVuc2lnbmVkIGludCBhbGxvYzsKLSAgICB9ICptZXRob2RzOwotICB1bnNpZ25lZCBpbnQgbWV0aG9kc19jb3VudCwgbWV0aG9kc19hbGxvYzsKLSAgZGVidWdfdHlwZSB2cHRyYmFzZTsKLSAgYm9vbGVhbiBvd252cHRyOwotICBkZWJ1Z19tZXRob2QgKmRtZXRob2RzOwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY2xhc3MpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLS1jb3VudDsKLQotICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmdGFnLCAmdGFnbGVuKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC0tY291bnQ7Ci0KLSAgLyogRmluZCB0aGUgQyBzdHJ1Y3Qgd2l0aCB0aGlzIG5hbWUuICAqLwotICBmb3IgKGl0ID0gaW5mby0+dGFnczsgaXQgIT0gTlVMTDsgaXQgPSBpdC0+bmV4dCkKLSAgICBpZiAoaXQtPm5hbWVbMF0gPT0gdGFnWzBdCi0JJiYgc3RybmNtcCAoaXQtPm5hbWUsIHRhZywgdGFnbGVuKSA9PSAwCi0JJiYgc3RybGVuIChpdC0+bmFtZSkgPT0gdGFnbGVuKQotICAgICAgYnJlYWs7Ci0gIGlmIChpdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmRlZmluZWQgQysrIG9iamVjdCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7Ci0KLSAgZmllbGRzID0gTlVMTDsKLSAgZmllbGRfY291bnQgPSAwOwotICBmaWVsZF9hbGxvYyA9IDA7Ci0gIGJhc2VjbGFzc2VzID0gTlVMTDsKLSAgYmFzZWNsYXNzZXNfY291bnQgPSAwOwotICBiYXNlY2xhc3Nlc19hbGxvYyA9IDA7Ci0gIG1ldGhvZHMgPSBOVUxMOwotICBtZXRob2RzX2NvdW50ID0gMDsKLSAgbWV0aG9kc19hbGxvYyA9IDA7Ci0gIHZwdHJiYXNlID0gREVCVUdfVFlQRV9OVUxMOwotICBvd252cHRyID0gZmFsc2U7Ci0KLSAgc3RydWN0ZmllbGRzID0gZGVidWdfZ2V0X2ZpZWxkcyAoZGhhbmRsZSwgaXQtPnR5cGUpOwotCi0gIHdoaWxlIChjb3VudCA+IDApCi0gICAgewotICAgICAgYmZkX3ZtYSBpZDsKLSAgICAgIGNvbnN0IGJmZF9ieXRlICpzcGVjX3N0YXJ0OwotCi0gICAgICBzcGVjX3N0YXJ0ID0gKnBwOwotCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmlkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAtLWNvdW50OwotCi0gICAgICBzd2l0Y2ggKGlkKQotCXsKLQlkZWZhdWx0OgotCSAgaWVlZV9lcnJvciAoaW5mbywgc3BlY19zdGFydCwgXygidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgc3BlYyIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQotCWNhc2UgJ2InOgotCSAgewotCSAgICBiZmRfdm1hIGZsYWdzLCBjaW5saW5lOwotCSAgICBjb25zdCBjaGFyICpiYXNlbmFtZSwgKmZpZWxkbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBiYXNlbGVuLCBmaWVsZGxlbjsKLQkgICAgY2hhciAqYmFzZWNvcHk7Ci0JICAgIGRlYnVnX3R5cGUgYmFzZXR5cGU7Ci0JICAgIGJmZF92bWEgYml0cG9zOwotCSAgICBib29sZWFuIHZpcnR1YWxwOwotCSAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLQkgICAgZGVidWdfYmFzZWNsYXNzIGJhc2VjbGFzczsKLQotCSAgICAvKiBUaGlzIHJlcHJlc2VudHMgYSBiYXNlIG9yIGZyaWVuZCBjbGFzcy4gICovCi0KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmYmFzZW5hbWUsICZiYXNlbGVuKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY2lubGluZSkKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmZmllbGRuYW1lLCAmZmllbGRsZW4pKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgY291bnQgLT0gNDsKLQotCSAgICAvKiBXZSBoYXZlIG5vIHdheSBvZiByZWNvcmRpbmcgZnJpZW5kIGluZm9ybWF0aW9uLCBzbyB3ZQotICAgICAgICAgICAgICAganVzdCBpZ25vcmUgaXQuICAqLwotCSAgICBpZiAoKGZsYWdzICYgQkFTRUZMQUdTX0ZSSUVORCkgIT0gMCkKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBJIGFzc3VtZSB0aGF0IGVpdGhlciBhbGwgb2YgdGhlIG1lbWJlcnMgb2YgdGhlCi0gICAgICAgICAgICAgICBiYXNlY2xhc3MgYXJlIGluY2x1ZGVkIGluIHRoZSBvYmplY3QsIHN0YXJ0aW5nIGF0IHRoZQotICAgICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3QsIG9yIHRoYXQgbm9uZSBvZiB0aGVtIGFyZQotICAgICAgICAgICAgICAgaW5jbHVkZWQuICAqLwotCi0JICAgIGlmICgoZmllbGRsZW4gPT0gMCkgPT0gKGNpbmxpbmUgPT0gMCkpCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5zdXBwb3J0ZWQgQysrIG9iamVjdCB0eXBlIikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGJhc2Vjb3B5ID0gc2F2ZXN0cmluZyAoYmFzZW5hbWUsIGJhc2VsZW4pOwotCSAgICBiYXNldHlwZSA9IGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIGJhc2Vjb3B5LAotCQkJCQkgICAgICAgREVCVUdfS0lORF9JTExFR0FMKTsKLQkgICAgZnJlZSAoYmFzZWNvcHkpOwotCSAgICBpZiAoYmFzZXR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBiYXNlIGNsYXNzIG5vdCBkZWZpbmVkIikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmIChmaWVsZGxlbiA9PSAwKQotCSAgICAgIGJpdHBvcyA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNvbnN0IGRlYnVnX2ZpZWxkICpwZjsKLQotCQlpZiAoc3RydWN0ZmllbGRzID09IE5VTEwpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBvYmplY3QgaGFzIG5vIGZpZWxkcyIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJZm9yIChwZiA9IHN0cnVjdGZpZWxkczsgKnBmICE9IERFQlVHX0ZJRUxEX05VTEw7IHBmKyspCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqZm5hbWU7Ci0KLQkJICAgIGZuYW1lID0gZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGRoYW5kbGUsICpwZik7Ci0JCSAgICBpZiAoZm5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaWYgKGZuYW1lWzBdID09IGZpZWxkbmFtZVswXQotCQkJJiYgc3RybmNtcCAoZm5hbWUsIGZpZWxkbmFtZSwgZmllbGRsZW4pID09IDAKLQkJCSYmIHN0cmxlbiAoZm5hbWUpID09IGZpZWxkbGVuKQotCQkgICAgICBicmVhazsKLQkJICB9Ci0JCWlmICgqcGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQlfKCJDKysgYmFzZSBjbGFzcyBub3QgZm91bmQgaW4gY29udGFpbmVyIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQotCQliaXRwb3MgPSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIChkaGFuZGxlLCAqcGYpOwotCSAgICAgIH0KLQotCSAgICBpZiAoKGZsYWdzICYgQkFTRUZMQUdTX1ZJUlRVQUwpICE9IDApCi0JICAgICAgdmlydHVhbHAgPSB0cnVlOwotCSAgICBlbHNlCi0JICAgICAgdmlydHVhbHAgPSBmYWxzZTsKLQkgICAgaWYgKChmbGFncyAmIEJBU0VGTEFHU19QUklWQVRFKSAhPSAwKQotCSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0JICAgIGVsc2UKLQkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0KLQkgICAgYmFzZWNsYXNzID0gZGVidWdfbWFrZV9iYXNlY2xhc3MgKGRoYW5kbGUsIGJhc2V0eXBlLCBiaXRwb3MsCi0JCQkJCSAgICAgIHZpcnR1YWxwLCB2aXNpYmlsaXR5KTsKLQkgICAgaWYgKGJhc2VjbGFzcyA9PSBERUJVR19CQVNFQ0xBU1NfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgaWYgKGJhc2VjbGFzc2VzX2NvdW50ICsgMSA+PSBiYXNlY2xhc3Nlc19hbGxvYykKLQkgICAgICB7Ci0JCWJhc2VjbGFzc2VzX2FsbG9jICs9IDEwOwotCQliYXNlY2xhc3NlcyA9ICgoZGVidWdfYmFzZWNsYXNzICopCi0JCQkgICAgICAgeHJlYWxsb2MgKGJhc2VjbGFzc2VzLAotCQkJCQkgKGJhc2VjbGFzc2VzX2FsbG9jCi0JCQkJCSAgKiBzaXplb2YgKmJhc2VjbGFzc2VzKSkpOwotCSAgICAgIH0KLQotCSAgICBiYXNlY2xhc3Nlc1tiYXNlY2xhc3Nlc19jb3VudF0gPSBiYXNlY2xhc3M7Ci0JICAgICsrYmFzZWNsYXNzZXNfY291bnQ7Ci0JICAgIGJhc2VjbGFzc2VzW2Jhc2VjbGFzc2VzX2NvdW50XSA9IERFQlVHX0JBU0VDTEFTU19OVUxMOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdkJzoKLQkgIHsKLQkgICAgYmZkX3ZtYSBmbGFnczsKLQkgICAgY29uc3QgY2hhciAqZmllbGRuYW1lLCAqbWFuZ2xlZG5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgZmllbGRsZW4sIG1hbmdsZWRsZW47Ci0JICAgIGNoYXIgKmZpZWxkY29weTsKLQkgICAgYm9vbGVhbiBzdGF0aWNwOwotCSAgICBkZWJ1Z190eXBlIGZ0eXBlOwotCSAgICBjb25zdCBkZWJ1Z19maWVsZCAqcGYgPSBOVUxMOwotCSAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLQkgICAgZGVidWdfZmllbGQgZmllbGQ7Ci0KLQkgICAgLyogVGhpcyByZXByZXNlbnRzIGEgZGF0YSBtZW1iZXIuICAqLwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmZpZWxkbmFtZSwgJmZpZWxkbGVuKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkbmFtZSwgJm1hbmdsZWRsZW4pKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgY291bnQgLT0gMzsKLQotCSAgICBmaWVsZGNvcHkgPSBzYXZlc3RyaW5nIChmaWVsZG5hbWUsIGZpZWxkbGVuKTsKLQotCSAgICBzdGF0aWNwID0gKGZsYWdzICYgQ1hYRkxBR1NfU1RBVElDKSAhPSAwID8gdHJ1ZSA6IGZhbHNlOwotCi0JICAgIGlmIChzdGF0aWNwKQotCSAgICAgIHsKLQkJc3RydWN0IGllZWVfdmFyICpwdiwgKnB2ZW5kOwotCi0JCS8qIFNlZSBpZiB3ZSBjYW4gZmluZCBhIGRlZmluaXRpb24gZm9yIHRoaXMgdmFyaWFibGUuICAqLwotCQlwdiA9IGluZm8tPnZhcnMudmFyczsKLQkJcHZlbmQgPSBwdiArIGluZm8tPnZhcnMuYWxsb2M7Ci0JCWZvciAoOyBwdiA8IHB2ZW5kOyBwdisrKQotCQkgIGlmIChwdi0+bmFtbGVuID09IG1hbmdsZWRsZW4KLQkJICAgICAgJiYgc3RybmNtcCAocHYtPm5hbWUsIG1hbmdsZWRuYW1lLCBtYW5nbGVkbGVuKSA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCWlmIChwdiA8IHB2ZW5kKQotCQkgIGZ0eXBlID0gcHYtPnR5cGU7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHZhcmlhYmxlIGlzIG5ldmVyIHVzZWQuICAqLwotCQkgICAgZnR5cGUgPSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgc3RhcnQsCi0JCQkJCSAgICAgICAodW5zaWduZWQgaW50KSBidWlsdGluX3ZvaWQpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBmaW5keDsKLQotCQlpZiAoc3RydWN0ZmllbGRzID09IE5VTEwpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBvYmplY3QgaGFzIG5vIGZpZWxkcyIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJZm9yIChwZiA9IHN0cnVjdGZpZWxkcywgZmluZHggPSAwOwotCQkgICAgICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOwotCQkgICAgIHBmKyssIGZpbmR4KyspCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqZm5hbWU7Ci0KLQkJICAgIGZuYW1lID0gZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGRoYW5kbGUsICpwZik7Ci0JCSAgICBpZiAoZm5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaWYgKGZuYW1lWzBdID09IG1hbmdsZWRuYW1lWzBdCi0JCQkmJiBzdHJuY21wIChmbmFtZSwgbWFuZ2xlZG5hbWUsIG1hbmdsZWRsZW4pID09IDAKLQkJCSYmIHN0cmxlbiAoZm5hbWUpID09IG1hbmdsZWRsZW4pCi0JCSAgICAgIGJyZWFrOwotCQkgIH0KLQkJaWYgKCpwZiA9PSBERUJVR19GSUVMRF9OVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJCV8oIkMrKyBkYXRhIG1lbWJlciBub3QgZm91bmQgaW4gY29udGFpbmVyIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQotCQlmdHlwZSA9IGRlYnVnX2dldF9maWVsZF90eXBlIChkaGFuZGxlLCAqcGYpOwotCi0JCWlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBmdHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotCQkgIHsKLQkJICAgIC8qIFdlIG1pZ2h0IG5lZWQgdG8gY29udmVydCB0aGlzIGZpZWxkIGludG8gYQotICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdHlwZSBsYXRlciBvbiwgc28gbWFrZSBpdCBhbiBpbmRpcmVjdAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlLiAgKi8KLQkJICAgIGlmIChpdC0+ZnNsb3RzID09IE5VTEwpCi0JCSAgICAgIHsKLQkJCXVuc2lnbmVkIGludCBmY250OwotCQkJY29uc3QgZGVidWdfZmllbGQgKnBmY250OwotCi0JCQlmY250ID0gMDsKLQkJCWZvciAocGZjbnQgPSBzdHJ1Y3RmaWVsZHM7Ci0JCQkgICAgICpwZmNudCAhPSBERUJVR19GSUVMRF9OVUxMOwotCQkJICAgICBwZmNudCsrKQotCQkJICArK2ZjbnQ7Ci0JCQlpdC0+ZnNsb3RzID0gKChkZWJ1Z190eXBlICopCi0JCQkJICAgICAgeG1hbGxvYyAoZmNudCAqIHNpemVvZiAqaXQtPmZzbG90cykpOwotCQkJbWVtc2V0IChpdC0+ZnNsb3RzLCAwLAotCQkJCWZjbnQgKiBzaXplb2YgKml0LT5mc2xvdHMpOwotCQkgICAgICB9Ci0KLQkJICAgIGlmIChmdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGl0LT5mc2xvdHNbZmluZHhdID0gZnR5cGU7Ci0JCSAgICBmdHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwKLQkJCQkJCSAgICAgIGl0LT5mc2xvdHMgKyBmaW5keCwKLQkJCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGlmIChmdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIHN3aXRjaCAoZmxhZ3MgJiBDWFhGTEFHU19WSVNJQklMSVRZKQotCSAgICAgIHsKLQkgICAgICBkZWZhdWx0OgotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5rbm93biBDKysgdmlzaWJpbGl0eSIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQzoKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmIChzdGF0aWNwKQotCSAgICAgIHsKLQkJY2hhciAqbWFuZ2xlZGNvcHk7Ci0KLQkJbWFuZ2xlZGNvcHkgPSBzYXZlc3RyaW5nIChtYW5nbGVkbmFtZSwgbWFuZ2xlZGxlbik7Ci0KLQkJZmllbGQgPSBkZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIgKGRoYW5kbGUsIGZpZWxkY29weSwKLQkJCQkJCSAgZnR5cGUsIG1hbmdsZWRjb3B5LAotCQkJCQkJICB2aXNpYmlsaXR5KTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWJmZF92bWEgYml0cG9zLCBiaXRzaXplOwotCi0JCWJpdHBvcyA9IGRlYnVnX2dldF9maWVsZF9iaXRwb3MgKGRoYW5kbGUsICpwZik7Ci0JCWJpdHNpemUgPSBkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSAoZGhhbmRsZSwgKnBmKTsKLQkJaWYgKGJpdHBvcyA9PSAoYmZkX3ZtYSkgLTEgfHwgYml0c2l6ZSA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImJhZCBDKysgZmllbGQgYml0IHBvcyBvciBzaXplIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJZmllbGQgPSBkZWJ1Z19tYWtlX2ZpZWxkIChkaGFuZGxlLCBmaWVsZGNvcHksIGZ0eXBlLCBiaXRwb3MsCi0JCQkJCSAgYml0c2l6ZSwgdmlzaWJpbGl0eSk7Ci0JICAgICAgfQotCi0JICAgIGlmIChmaWVsZCA9PSBERUJVR19GSUVMRF9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAoZmllbGRfY291bnQgKyAxID49IGZpZWxkX2FsbG9jKQotCSAgICAgIHsKLQkJZmllbGRfYWxsb2MgKz0gMTA7Ci0JCWZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJCSAgeHJlYWxsb2MgKGZpZWxkcywgZmllbGRfYWxsb2MgKiBzaXplb2YgKmZpZWxkcykpOwotCSAgICAgIH0KLQotCSAgICBmaWVsZHNbZmllbGRfY291bnRdID0gZmllbGQ7Ci0JICAgICsrZmllbGRfY291bnQ7Ci0JICAgIGZpZWxkc1tmaWVsZF9jb3VudF0gPSBERUJVR19GSUVMRF9OVUxMOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdtJzoKLQljYXNlICd2JzoKLQkgIHsKLQkgICAgYmZkX3ZtYSBmbGFncywgdm9mZnNldCwgY29udHJvbDsKLQkgICAgY29uc3QgY2hhciAqbmFtZSwgKm1hbmdsZWQ7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuLCBtYW5nbGVkbGVuOwotCSAgICBzdHJ1Y3QgaWVlZV92YXIgKnB2LCAqcHZlbmQ7Ci0JICAgIGRlYnVnX3R5cGUgdHlwZTsKLQkgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0JICAgIGJvb2xlYW4gY29uc3RwLCB2b2xhdGlsZXA7Ci0JICAgIGNoYXIgKm1hbmdsZWRjb3B5OwotCSAgICBkZWJ1Z19tZXRob2RfdmFyaWFudCBtdjsKLQkgICAgc3RydWN0IGllZWVfbWV0aG9kICptZXRoOwotCSAgICB1bnNpZ25lZCBpbnQgaW07Ci0KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbWFuZ2xlZCwgJm1hbmdsZWRsZW4pKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgY291bnQgLT0gMzsKLQkgICAgaWYgKGlkICE9ICd2JykKLQkgICAgICB2b2Zmc2V0ID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2b2Zmc2V0KSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCS0tY291bnQ7Ci0JICAgICAgfQotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNvbnRyb2wpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgLS1jb3VudDsKLQotCSAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgY29udHJvbCBpbmZvcm1hdGlvbi4gICovCi0KLQkgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVwcmVzZW50IGZyaWVuZCBpbmZvcm1hdGlvbiwgc28gd2UKLSAgICAgICAgICAgICAgIGp1c3QgaWdub3JlIGl0LiAgKi8KLQkgICAgaWYgKChmbGFncyAmIENYWEZMQUdTX0ZSSUVORCkgIT0gMCkKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBXZSBzaG91bGQgYWxyZWFkeSBoYXZlIHNlZW4gYSB0eXBlIGZvciB0aGUgZnVuY3Rpb24uICAqLwotCSAgICBwdiA9IGluZm8tPnZhcnMudmFyczsKLQkgICAgcHZlbmQgPSBwdiArIGluZm8tPnZhcnMuYWxsb2M7Ci0JICAgIGZvciAoOyBwdiA8IHB2ZW5kOyBwdisrKQotCSAgICAgIGlmIChwdi0+bmFtbGVuID09IG1hbmdsZWRsZW4KLQkJICAmJiBzdHJuY21wIChwdi0+bmFtZSwgbWFuZ2xlZCwgbWFuZ2xlZGxlbikgPT0gMCkKLQkJYnJlYWs7Ci0KLQkgICAgaWYgKHB2ID49IHB2ZW5kKQotCSAgICAgIHsKLQkJLyogV2Ugd29uJ3QgaGF2ZSB0eXBlIGluZm9ybWF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uIGlmCi0JCSAgIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGZpbGUuICBXZSBkb24ndCB0cnkgdG8KLQkJICAgaGFuZGxlIHRoaXMgY2FzZS4gIEZJWE1FLiAgKi8KLQkJdHlwZSA9IChkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUKLQkJCShkaGFuZGxlLAotCQkJIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBzdGFydCwKLQkJCQkJICAgICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fdm9pZCksCi0JCQkgKGRlYnVnX3R5cGUgKikgTlVMTCwKLQkJCSBmYWxzZSkpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLQkJY29uc3QgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotCQlib29sZWFuIHZhcmFyZ3M7Ci0KLQkJaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIHB2LT50eXBlKQotCQkgICAgIT0gREVCVUdfS0lORF9GVU5DVElPTikKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQlfKCJiYWQgdHlwZSBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJcmV0dXJuX3R5cGUgPSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGRoYW5kbGUsIHB2LT50eXBlKTsKLQkJYXJnX3R5cGVzID0gZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyAoZGhhbmRsZSwgcHYtPnR5cGUsCi0JCQkJCQkgICAgICAgJnZhcmFyZ3MpOwotCQlpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMIHx8IGFyZ190eXBlcyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJCV8oIm5vIHR5cGUgaW5mb3JtYXRpb24gZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCXR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChkaGFuZGxlLCByZXR1cm5fdHlwZSwgaXQtPnR5cGUsCi0JCQkJCSAgICAgICAoZGVidWdfdHlwZSAqKSBhcmdfdHlwZXMsCi0JCQkJCSAgICAgICB2YXJhcmdzKTsKLQkgICAgICB9Ci0JICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgc3dpdGNoIChmbGFncyAmIENYWEZMQUdTX1ZJU0lCSUxJVFkpCi0JICAgICAgewotCSAgICAgIGRlZmF1bHQ6Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmtub3duIEMrKyB2aXNpYmlsaXR5IikpOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFVCTElDOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEU6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgY29uc3RwID0gKGZsYWdzICYgQ1hYRkxBR1NfQ09OU1QpICE9IDAgPyB0cnVlIDogZmFsc2U7Ci0JICAgIHZvbGF0aWxlcCA9IChmbGFncyAmIENYWEZMQUdTX1ZPTEFUSUxFKSAhPSAwID8gdHJ1ZSA6IGZhbHNlOwotCi0JICAgIG1hbmdsZWRjb3B5ID0gc2F2ZXN0cmluZyAobWFuZ2xlZCwgbWFuZ2xlZGxlbik7Ci0KLQkgICAgaWYgKChmbGFncyAmIENYWEZMQUdTX1NUQVRJQykgIT0gMCkKLQkgICAgICB7Ci0JCWlmIChpZCA9PSAndicpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBzdGF0aWMgdmlydHVhbCBtZXRob2QiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQltdiA9IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50IChkaGFuZGxlLCBtYW5nbGVkY29weSwKLQkJCQkJCSAgICAgICB0eXBlLCB2aXNpYmlsaXR5LAotCQkJCQkJICAgICAgIGNvbnN0cCwgdm9sYXRpbGVwKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRlYnVnX3R5cGUgdmNvbnRleHQ7Ci0KLQkJaWYgKGlkICE9ICd2JykKLQkJICB2Y29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIEZJWE1FOiBIb3cgY2FuIHdlIGNhbGN1bGF0ZSB0aGlzIGNvcnJlY3RseT8gICovCi0JCSAgICB2Y29udGV4dCA9IGl0LT50eXBlOwotCQkgIH0KLQkJbXYgPSBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50IChkaGFuZGxlLCBtYW5nbGVkY29weSwgdHlwZSwKLQkJCQkJCXZpc2liaWxpdHksIGNvbnN0cCwKLQkJCQkJCXZvbGF0aWxlcCwgdm9mZnNldCwKLQkJCQkJCXZjb250ZXh0KTsKLQkgICAgICB9Ci0JICAgIGlmIChtdiA9PSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBmb3IgKG1ldGggPSBtZXRob2RzLCBpbSA9IDA7IGltIDwgbWV0aG9kc19jb3VudDsgbWV0aCsrLCBpbSsrKQotCSAgICAgIGlmIChtZXRoLT5uYW1sZW4gPT0gbmFtbGVuCi0JCSAgJiYgc3RybmNtcCAobWV0aC0+bmFtZSwgbmFtZSwgbmFtbGVuKSA9PSAwKQotCQlicmVhazsKLQkgICAgaWYgKGltID49IG1ldGhvZHNfY291bnQpCi0JICAgICAgewotCQlpZiAobWV0aG9kc19jb3VudCA+PSBtZXRob2RzX2FsbG9jKQotCQkgIHsKLQkJICAgIG1ldGhvZHNfYWxsb2MgKz0gMTA7Ci0JCSAgICBtZXRob2RzID0gKChzdHJ1Y3QgaWVlZV9tZXRob2QgKikKLQkJCSAgICAgICB4cmVhbGxvYyAobWV0aG9kcywKLQkJCQkJIG1ldGhvZHNfYWxsb2MgKiBzaXplb2YgKm1ldGhvZHMpKTsKLQkJICB9Ci0JCW1ldGhvZHNbbWV0aG9kc19jb3VudF0ubmFtZSA9IG5hbWU7Ci0JCW1ldGhvZHNbbWV0aG9kc19jb3VudF0ubmFtbGVuID0gbmFtbGVuOwotCQltZXRob2RzW21ldGhvZHNfY291bnRdLnZhcmlhbnRzID0gTlVMTDsKLQkJbWV0aG9kc1ttZXRob2RzX2NvdW50XS5jb3VudCA9IDA7Ci0JCW1ldGhvZHNbbWV0aG9kc19jb3VudF0uYWxsb2MgPSAwOwotCQltZXRoID0gbWV0aG9kcyArIG1ldGhvZHNfY291bnQ7Ci0JCSsrbWV0aG9kc19jb3VudDsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG1ldGgtPmNvdW50ICsgMSA+PSBtZXRoLT5hbGxvYykKLQkgICAgICB7Ci0JCW1ldGgtPmFsbG9jICs9IDEwOwotCQltZXRoLT52YXJpYW50cyA9ICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikKLQkJCQkgIHhyZWFsbG9jIChtZXRoLT52YXJpYW50cywKLQkJCQkJICAgIChtZXRoLT5hbGxvYwotCQkJCQkgICAgICogc2l6ZW9mICptZXRoLT52YXJpYW50cykpKTsKLQkgICAgICB9Ci0KLQkgICAgbWV0aC0+dmFyaWFudHNbbWV0aC0+Y291bnRdID0gbXY7Ci0JICAgICsrbWV0aC0+Y291bnQ7Ci0JICAgIG1ldGgtPnZhcmlhbnRzW21ldGgtPmNvdW50XSA9IERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEw7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgewotCSAgICBiZmRfdm1hIHNwZWM7Ci0KLQkgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiwgc28gd2UganVzdAotCSAgICAgICBpZ25vcmUgaXQuICAqLwotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnNwZWMpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgLS1jb3VudDsKLQkgICAgaWYgKChzcGVjICYgNCkgIT0gMCkKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCQl1bnNpZ25lZCBsb25nIGZpbGVuYW1sZW47Ci0JCWJmZF92bWEgbGluZW5vOwotCi0JCWlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmaWxlbmFtZSwgJmZpbGVuYW1sZW4pCi0JCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmbGluZW5vKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWNvdW50IC09IDI7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmICgoc3BlYyAmIDgpICE9IDApCi0JICAgICAgewotCQljb25zdCBjaGFyICptYW5nbGVkOwotCQl1bnNpZ25lZCBsb25nIG1hbmdsZWRsZW47Ci0KLQkJaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm1hbmdsZWQsICZtYW5nbGVkbGVuKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCS0tY291bnQ7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCSAgICBfKCJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBvdmVyaGVhZCBzcGVjIikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICd6JzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqdm5hbWUsICpiYXNlbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyB2bmFtZWxlbiwgYmFzZWxlbjsKLQkgICAgYmZkX3ZtYSB2c2l6ZSwgY29udHJvbDsKLQotCSAgICAvKiBBIHZpcnR1YWwgdGFibGUgcG9pbnRlci4gICovCi0KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJnZuYW1lLCAmdm5hbWVsZW4pCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2c2l6ZSkKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmYmFzZW5hbWUsICZiYXNlbGVuKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY29udHJvbCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBjb3VudCAtPSA0OwotCi0JICAgIC8qIFdlIGp1c3QgaWdub3JlIHRoZSBjb250cm9sIG51bWJlci4gIFdlIGRvbid0IGNhcmUgd2hhdAotCSAgICAgICB0aGUgdmlydHVhbCB0YWJsZSBuYW1lIGlzLiAgV2UgaGF2ZSBubyB3YXkgdG8gc3RvcmUgdGhlCi0JICAgICAgIHZpcnR1YWwgdGFibGUgc2l6ZSwgYW5kIEkgZG9uJ3QgdGhpbmsgd2UgY2FyZSBhbnlob3cuICAqLwotCi0JICAgIC8qIEZJWE1FOiBXZSBjYW4ndCBoYW5kbGUgbXVsdGlwbGUgdmlydHVhbCB0YWJsZSBwb2ludGVycy4gICovCi0KLQkgICAgaWYgKGJhc2VsZW4gPT0gMCkKLQkgICAgICBvd252cHRyID0gdHJ1ZTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY2hhciAqYmFzZWNvcHk7Ci0KLQkJYmFzZWNvcHkgPSBzYXZlc3RyaW5nIChiYXNlbmFtZSwgYmFzZWxlbik7Ci0JCXZwdHJiYXNlID0gZGVidWdfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgYmFzZWNvcHksCi0JCQkJCQkgICBERUJVR19LSU5EX0lMTEVHQUwpOwotCQlmcmVlIChiYXNlY29weSk7Ci0JCWlmICh2cHRyYmFzZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuZGVmaW5lZCBDKysgdnRhYmxlIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgc2VlbiBhbGwgdGhlIG1ldGhvZCB2YXJpYW50cywgd2UgY2FuIGNhbGwKLSAgICAgZGVidWdfbWFrZV9tZXRob2QgZm9yIGVhY2ggb25lLiAgKi8KLQotICBpZiAobWV0aG9kc19jb3VudCA9PSAwKQotICAgIGRtZXRob2RzID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBkbWV0aG9kcyA9ICgoZGVidWdfbWV0aG9kICopCi0JCSAgeG1hbGxvYyAoKG1ldGhvZHNfY291bnQgKyAxKSAqIHNpemVvZiAqZG1ldGhvZHMpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBtZXRob2RzX2NvdW50OyBpKyspCi0JewotCSAgY2hhciAqbmFtY29weTsKLQotCSAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG1ldGhvZHNbaV0ubmFtZSwgbWV0aG9kc1tpXS5uYW1sZW4pOwotCSAgZG1ldGhvZHNbaV0gPSBkZWJ1Z19tYWtlX21ldGhvZCAoZGhhbmRsZSwgbmFtY29weSwKLQkJCQkJICAgbWV0aG9kc1tpXS52YXJpYW50cyk7Ci0JICBpZiAoZG1ldGhvZHNbaV0gPT0gREVCVUdfTUVUSE9EX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBkbWV0aG9kc1tpXSA9IERFQlVHX01FVEhPRF9OVUxMOwotICAgICAgZnJlZSAobWV0aG9kcyk7Ci0gICAgfQotCi0gIC8qIFRoZSBzdHJ1Y3QgdHlwZSB3YXMgY3JlYXRlZCBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nIGF0Ci0gICAgIGl0LT5zbG90LiAgV2UgdXBkYXRlIGl0LT5zbG90IHRvIGF1dG9tYXRpY2FsbHkgdXBkYXRlIGFsbAotICAgICByZWZlcmVuY2VzIHRvIHRoaXMgc3RydWN0LiAgKi8KLSAgaXQtPnNsb3QgPSBkZWJ1Z19tYWtlX29iamVjdF90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgY2xhc3MgIT0gJ3UnLAotCQkJCSAgICAgZGVidWdfZ2V0X3R5cGVfc2l6ZSAoZGhhbmRsZSwKLQkJCQkJCQkgIGl0LT5zbG90KSwKLQkJCQkgICAgIGZpZWxkcywgYmFzZWNsYXNzZXMsIGRtZXRob2RzLAotCQkJCSAgICAgdnB0cmJhc2UsIG93bnZwdHIpOwotICBpZiAoaXQtPnNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBDKysgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZSBhbmQgcmVmZXJlbmNlIHR5cGUgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX2N4eF9kZWZhdWx0cyAoaW5mbywgcHAsIGNvdW50KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGNvbnN0IGNoYXIgKmZubmFtZTsKLSAgdW5zaWduZWQgbG9uZyBmbmxlbjsKLSAgYmZkX3ZtYSBkZWZjb3VudDsKLQotICBzdGFydCA9ICpwcDsKLQotICAvKiBHaXZpbmcgdGhlIGZ1bmN0aW9uIG5hbWUgYmVmb3JlIHRoZSBhcmd1bWVudCBjb3VudCBpcyBhbiBhZGRlbmR1bQotICAgICB0byB0aGUgc3BlYy4gIFRoZSBmdW5jdGlvbiBuYW1lIGlzIGRlbWFuZ2xlZCwgdGhvdWdoLCBzbyB0aGlzCi0gICAgIHJlY29yZCBtdXN0IGFsd2F5cyByZWZlciB0byB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0KLSAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwIDw9IGluZm8tPmJsb2Nrc3RhY2suc3RhY2sKLSAgICAgIHx8IGluZm8tPmJsb2Nrc3RhY2suYnNwWy0xXS5mbmluZHggPT0gKHVuc2lnbmVkIGludCkgLTEpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBkZWZhdWx0IHZhbHVlcyBub3QgaW4gYSBmdW5jdGlvbiIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmZubmFtZSwgJmZubGVuKQotICAgICAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmRlZmNvdW50KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNvdW50IC09IDI7Ci0KLSAgd2hpbGUgKGRlZmNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIGJmZF92bWEgdHlwZSwgdmFsOwotICAgICAgY29uc3QgY2hhciAqc3RydmFsOwotICAgICAgdW5zaWduZWQgbG9uZyBzdHJ2YWxsZW47Ci0KLSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLS1jb3VudDsKLQotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIDA6Ci0JY2FzZSA0OgotCSAgYnJlYWs7Ci0KLQljYXNlIDE6Ci0JY2FzZSAyOgotCSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2YWwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAtLWNvdW50OwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6Ci0JY2FzZSA3OgotCSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJnN0cnZhbCwgJnN0cnZhbGxlbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC0tY291bnQ7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5yZWNvZ25pemVkIEMrKyBkZWZhdWx0IHR5cGUiKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzLCBzbyB3ZQotICAgICAgICAganVzdCBpZ25vcmUgdGhlbS4gIEZJWE1FLiAgKi8KLSAgICB9Ci0KLSAgLyogQW55IHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGluZGljZXMgb2YgcGFyYW1ldGVycyB0aGF0IGFyZSByZWFsbHkKLSAgICAgcmVmZXJlbmNlIHR5cGUuICAqLwotICBpZiAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIFBUUiBkaGFuZGxlOwotICAgICAgZGVidWdfdHlwZSAqYXJnX3Nsb3RzOwotCi0gICAgICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLSAgICAgIGFyZ19zbG90cyA9IGluZm8tPnR5cGVzLnR5cGVzW2luZm8tPmJsb2Nrc3RhY2suYnNwWy0xXS5mbmluZHhdLmFyZ19zbG90czsKLSAgICAgIHdoaWxlIChjb3VudC0tID4gMCkKLQl7Ci0JICBiZmRfdm1hIGluZHg7Ci0JICBkZWJ1Z190eXBlIHRhcmdldDsKLQotCSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZpbmR4KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogVGhlIGluZGV4IGlzIDEgYmFzZWQuICAqLwotCSAgLS1pbmR4OwotCSAgaWYgKGFyZ19zbG90cyA9PSBOVUxMCi0JICAgICAgfHwgYXJnX3Nsb3RzW2luZHhdID09IERFQlVHX1RZUEVfTlVMTAotCSAgICAgIHx8IChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBhcmdfc2xvdHNbaW5keF0pCi0JCSAgIT0gREVCVUdfS0lORF9QT0lOVEVSKSkKLQkgICAgewotCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJyZWZlcmVuY2UgcGFyYW1ldGVyIGlzIG5vdCBhIHBvaW50ZXIiKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHRhcmdldCA9IGRlYnVnX2dldF90YXJnZXRfdHlwZSAoZGhhbmRsZSwgYXJnX3Nsb3RzW2luZHhdKTsKLQkgIGFyZ19zbG90c1tpbmR4XSA9IGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKGRoYW5kbGUsIHRhcmdldCk7Ci0JICBpZiAoYXJnX3Nsb3RzW2luZHhdID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBDKysgcmVmZXJlbmNlIGRlZmluaXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX3JlZmVyZW5jZSAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgYmZkX3ZtYSBmbGFnczsKLSAgY29uc3QgY2hhciAqY2xhc3MsICpuYW1lOwotICB1bnNpZ25lZCBsb25nIGNsYXNzbGVuLCBuYW1sZW47Ci0gIGRlYnVnX3R5cGUgKnBzbG90OwotICBkZWJ1Z190eXBlIHRhcmdldDsKLQotICBzdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmZsYWdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2l2aW5nIHRoZSBjbGFzcyBuYW1lIGJlZm9yZSB0aGUgbWVtYmVyIG5hbWUgaXMgaW4gYW4gYWRkZW5kdW0gdG8KLSAgICAgdGhlIHNwZWMuICAqLwotICBpZiAoZmxhZ3MgPT0gMykKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmY2xhc3MsICZjbGFzc2xlbikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBzbG90ID0gTlVMTDsKLSAgaWYgKGZsYWdzICE9IDMpCi0gICAgewotICAgICAgaW50IHBhc3M7Ci0KLSAgICAgIC8qIFdlIHNlYXJjaCBmcm9tIHRoZSBsYXN0IHZhcmlhYmxlIGluZGljZXMgdG8gdGhlIGZpcnN0IGluCi0JIGhvcGVzIG9mIGZpbmRpbmcgbG9jYWwgdmFyaWFibGVzIGNvcnJlY3RseS4gIFdlIHNlYXJjaCB0aGUKLQkgbG9jYWwgdmFyaWFibGVzIG9uIHRoZSBmaXJzdCBwYXNzLCBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZXMKLQkgb24gdGhlIHNlY29uZC4gIEZJWE1FOiBUaGlzIHByb2JhYmx5IHdvbid0IHdvcmsgaW4gYWxsIGNhc2VzLgotCSBPbiB0aGUgb3RoZXIgaGFuZCwgSSBkb24ndCBrbm93IHdoYXQgd2lsbC4gICovCi0gICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKQotCXsKLQkgIHN0cnVjdCBpZWVlX3ZhcnMgKnZhcnM7Ci0JICBpbnQgaTsKLQkgIHN0cnVjdCBpZWVlX3ZhciAqcHYgPSBOVUxMOwotCi0JICBpZiAocGFzcyA9PSAwKQotCSAgICB2YXJzID0gJmluZm8tPnZhcnM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YXJzID0gaW5mby0+Z2xvYmFsX3ZhcnM7Ci0JICAgICAgaWYgKHZhcnMgPT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gKGludCkgdmFycy0+YWxsb2MgLSAxOyBpID49IDA7IGktLSkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gZm91bmQ7Ci0KLQkgICAgICBwdiA9IHZhcnMtPnZhcnMgKyBpOwotCi0JICAgICAgaWYgKHB2LT5wc2xvdCA9PSBOVUxMCi0JCSAgfHwgcHYtPm5hbWxlbiAhPSBuYW1sZW4KLQkJICB8fCBzdHJuY21wIChwdi0+bmFtZSwgbmFtZSwgbmFtbGVuKSAhPSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIGZvdW5kID0gZmFsc2U7Ci0JICAgICAgc3dpdGNoIChmbGFncykKLQkJewotCQlkZWZhdWx0OgotCQkgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJICAgICAgXygidW5yZWNvZ25pemVkIEMrKyByZWZlcmVuY2UgdHlwZSIpKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0KLQkJY2FzZSAwOgotCQkgIC8qIEdsb2JhbCB2YXJpYWJsZSBvciBmdW5jdGlvbi4gICovCi0JCSAgaWYgKHB2LT5raW5kID09IElFRUVfR0xPQkFMCi0JCSAgICAgIHx8IHB2LT5raW5kID09IElFRUVfRVhURVJOQUwKLQkJICAgICAgfHwgcHYtPmtpbmQgPT0gSUVFRV9GVU5DVElPTikKLQkJICAgIGZvdW5kID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIDE6Ci0JCSAgLyogR2xvYmFsIHN0YXRpYyB2YXJpYWJsZSBvciBmdW5jdGlvbi4gICovCi0JCSAgaWYgKHB2LT5raW5kID09IElFRUVfU1RBVElDCi0JCSAgICAgIHx8IHB2LT5raW5kID09IElFRUVfRlVOQ1RJT04pCi0JCSAgICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAyOgotCQkgIC8qIExvY2FsIHZhcmlhYmxlLiAgKi8KLQkJICBpZiAocHYtPmtpbmQgPT0gSUVFRV9MT0NBTCkKLQkJICAgIGZvdW5kID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgaWYgKGZvdW5kKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAoaSA+PSAwKQotCSAgICB7Ci0JICAgICAgcHNsb3QgPSBwdi0+cHNsb3Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGllZWVfdGFnICppdDsKLQotICAgICAgZm9yIChpdCA9IGluZm8tPnRhZ3M7IGl0ICE9IE5VTEw7IGl0ID0gaXQtPm5leHQpCi0JewotCSAgaWYgKGl0LT5uYW1lWzBdID09IGNsYXNzWzBdCi0JICAgICAgJiYgc3RybmNtcCAoaXQtPm5hbWUsIGNsYXNzLCBjbGFzc2xlbikgPT0gMAotCSAgICAgICYmIHN0cmxlbiAoaXQtPm5hbWUpID09IGNsYXNzbGVuKQotCSAgICB7Ci0JICAgICAgaWYgKGl0LT5mc2xvdHMgIT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGRlYnVnX2ZpZWxkICpwZjsKLQkJICB1bnNpZ25lZCBpbnQgZmluZHg7Ci0KLQkJICBwZiA9IGRlYnVnX2dldF9maWVsZHMgKGluZm8tPmRoYW5kbGUsIGl0LT50eXBlKTsKLQkJICBpZiAocGYgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJICAiQysrIHJlZmVyZW5jZSBpbiBjbGFzcyB3aXRoIG5vIGZpZWxkcyIpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBmb3IgKGZpbmR4ID0gMDsgKnBmICE9IERFQlVHX0ZJRUxEX05VTEw7IHBmKyssIGZpbmR4KyspCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotCi0JCSAgICAgIGZuYW1lID0gZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGluZm8tPmRoYW5kbGUsICpwZik7Ci0JCSAgICAgIGlmIChmbmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoc3RybmNtcCAoZm5hbWUsIG5hbWUsIG5hbWxlbikgPT0gMAotCQkJICAmJiBzdHJsZW4gKGZuYW1lKSA9PSBuYW1sZW4pCi0JCQl7Ci0JCQkgIHBzbG90ID0gaXQtPmZzbG90cyArIGZpbmR4OwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChwc2xvdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgcmVmZXJlbmNlIG5vdCBmb3VuZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2UgYWxsb2NhdGVkIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZwotICAgICB0byAqcHNsb3QsIHdoaWNoIHdlIGNhbiBub3cgdXBkYXRlIHRvIGJlIGEgcmVmZXJlbmNlIHR5cGUuICAqLwotICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoaW5mby0+ZGhhbmRsZSwgKnBzbG90KSAhPSBERUJVR19LSU5EX1BPSU5URVIpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyByZWZlcmVuY2UgaXMgbm90IHBvaW50ZXIiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHRhcmdldCA9IGRlYnVnX2dldF90YXJnZXRfdHlwZSAoaW5mby0+ZGhhbmRsZSwgKnBzbG90KTsKLSAgKnBzbG90ID0gZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSAoaW5mby0+ZGhhbmRsZSwgdGFyZ2V0KTsKLSAgaWYgKCpwc2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXF1aXJlIGFuIEFTTiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsIHB2KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBiZmRfdm1hICpwdjsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYzsKLSAgYmZkX3ZtYSB2YXJpbmR4OwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotICBpZiAoYyAhPSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBU04iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKCgodW5zaWduZWQgaW50KSBjIDw8IDgpIHwgKipwcCk7Ci0gIGlmIChjICE9IGllZWVfYXNuX3JlY29yZF9lbnVtKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFTTiIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIC8qIEp1c3QgaWdub3JlIHRoZSB2YXJpYWJsZSBpbmRleC4gICovCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsIHB2KTsKLX0KLQotLyogUmVxdWlyZSBhbiBBVE42NSByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4pCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKipwbmFtZTsKLSAgICAgdW5zaWduZWQgbG9uZyAqcG5hbWxlbjsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYzsKLSAgYmZkX3ZtYSBuYW1lX2luZHgsIHR5cGVfaW5keCwgYXRuX2NvZGU7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7Ci0gIGlmIChjICE9IGllZWVfYXRfcmVjb3JkX2VudW0pCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIm1pc3NpbmcgcmVxdWlyZWQgQVRONjUiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKCgodW5zaWduZWQgaW50KSBjIDw8IDgpIHwgKipwcCk7Ci0gIGlmIChjICE9IGllZWVfYXRuX3JlY29yZF9lbnVtKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZuYW1lX2luZHgpCi0gICAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdHlwZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmF0bl9jb2RlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSnVzdCBpZ25vcmUgbmFtZV9pbmR4LiAgKi8KLQotICBpZiAodHlwZV9pbmR4ICE9IDAgfHwgYXRuX2NvZGUgIT0gNjUpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImJhZCBBVE42NSByZWNvcmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbik7Ci19Ci0MCi0vKiBDb252ZXJ0IGEgcmVnaXN0ZXIgbnVtYmVyIGluIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYQotICAgZ2VuZXJpYyByZWdpc3RlciBudW1iZXIuICAqLwotCi1zdGF0aWMgaW50Ci1pZWVlX3JlZ25vX3RvX2dlbnJlZyAoYWJmZCwgcikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcjsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb25zIHN0YWJzIGFkZHMgMiB0byB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIKLSAgICAgICAgIG51bWJlcnMuICAqLwotICAgICAgaWYgKHIgPj0gMTYpCi0JciArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0gICAgICAvKiBTdGFicyB1c2VzIDAgdG8gMTUgZm9yIHIwIHRvIHIxNSwgMTYgdG8gMzEgZm9yIGcwIHRvIGcxNSwgYW5kCi0gICAgICAgICAzMiB0byAzNSBmb3IgZnAwIHRvIGZwMy4gICovCi0gICAgICAtLXI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBnZW5lcmljIHJlZ2lzdGVyIG51bWJlciB0byBhbiBJRUVFIHNwZWNpZmljIG9uZS4gICovCi0KLXN0YXRpYyBpbnQKLWllZWVfZ2VucmVnX3RvX3JlZ25vIChhYmZkLCByKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBzdGFicyBhZGQgMiB0byB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIKLSAgICAgICAgIG51bWJlcnMuICAqLwotICAgICAgaWYgKHIgPj0gMTgpCi0JciAtPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0gICAgICAvKiBTdGFicyB1c2VzIDAgdG8gMTUgZm9yIHIwIHRvIHIxNSwgMTYgdG8gMzEgZm9yIGcwIHRvIGcxNSwgYW5kCi0gICAgICAgICAzMiB0byAzNSBmb3IgZnAwIHRvIGZwMy4gICovCi0gICAgICArK3I7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHI7Ci19Ci0MCi0vKiBUaGVzZSByb3V0aW5lcyBidWlsZCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvdXQgb2YgdGhlIGdlbmVyaWMKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qIFdlIGJ1aWxkIHRoZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBieXRlIGJ5IGJ5dGUuICBSYXRoZXIgdGhhbgotICAgd2FzdGUgdGltZSBjb3B5aW5nIGRhdGEgYXJvdW5kLCB3ZSB1c2UgYSBsaW5rZWQgbGlzdCBvZiBidWZmZXJzIHRvCi0gICBob2xkIHRoZSBkYXRhLiAgKi8KLQotI2RlZmluZSBJRUVFX0JVRlNJWkUgKDQ5MCkKLQotc3RydWN0IGllZWVfYnVmCi17Ci0gIC8qIE5leHQgYnVmZmVyLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmICpuZXh0OwotICAvKiBOdW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGlzIGJ1ZmZlci4gICovCi0gIHVuc2lnbmVkIGludCBjOwotICAvKiBCeXRlcy4gICovCi0gIGJmZF9ieXRlIGJ1ZltJRUVFX0JVRlNJWkVdOwotfTsKLQotLyogQSBsaXN0IG9mIGJ1ZmZlcnMuICAqLwotCi1zdHJ1Y3QgaWVlZV9idWZsaXN0Ci17Ci0gIC8qIEhlYWQgb2YgbGlzdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1ZiAqaGVhZDsKLSAgLyogVGFpbC0tbGFzdCBidWZmZXIgb24gbGlzdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1ZiAqdGFpbDsKLX07Ci0KLS8qIEluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBCQjExIGJsb2NrcyByZXF1aXJlZCBieSB0aGUgSFAgZW11bGF0b3IsCi0gICB3ZSBrZWVwIHRyYWNrIG9mIHJhbmdlcyBvZiBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZCB0byBhIGdpdmVuCi0gICBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RydWN0IGllZWVfcmFuZ2UKLXsKLSAgLyogTmV4dCByYW5nZS4gICovCi0gIHN0cnVjdCBpZWVlX3JhbmdlICpuZXh0OwotICAvKiBMb3cgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgbG93OwotICAvKiBIaWdoIGFkZHJlc3MuICAqLwotICBiZmRfdm1hIGhpZ2g7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBjbGFzcyBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0cnVjdCBpZWVlX3R5cGVfY2xhc3MKLXsKLSAgLyogVGhlIG5hbWUgaW5kZXggaW4gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCBpbmR4OwotICAvKiBUaGUgcG1pc2MgcmVjb3JkcyBmb3IgdGhlIGNsYXNzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBwbWlzY2J1ZjsKLSAgLyogVGhlIG51bWJlciBvZiBwbWlzYyByZWNvcmRzLiAgKi8KLSAgdW5zaWduZWQgaW50IHBtaXNjY291bnQ7Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBob2xkaW5nIHRoZSB2aXJ0dWFsIHRhYmxlLCBpZiBub3QgdGhpcwotICAgICBjbGFzcy4gICovCi0gIGNvbnN0IGNoYXIgKnZjbGFzczsKLSAgLyogV2hldGhlciB0aGlzIGNsYXNzIGhvbGRzIGl0cyBvd24gdmlydHVhbCB0YWJsZS4gICovCi0gIGJvb2xlYW4gb3dudnB0cjsKLSAgLyogVGhlIGxhcmdlc3QgdmlydHVhbCB0YWJsZSBvZmZzZXQgc2VlbiBzbyBmYXIuICAqLwotICBiZmRfdm1hIHZvZmZzZXQ7Ci0gIC8qIFRoZSBjdXJyZW50IG1ldGhvZC4gICovCi0gIGNvbnN0IGNoYXIgKm1ldGhvZDsKLSAgLyogQWRkaXRpb25hbCBwbWlzYyByZWNvcmRzIHVzZWQgdG8gcmVjb3JkIGZpZWxkcyBvZiByZWZlcmVuY2UgdHlwZS4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgcmVmczsKLX07Ci0KLS8qIFRoaXMgaXMgaG93IHdlIHN0b3JlIHR5cGVzIGZvciB0aGUgd3JpdGluZyByb3V0aW5lcy4gIE1vc3QgdHlwZXMKLSAgIGFyZSBzaW1wbHkgcmVwcmVzZW50ZWQgYnkgYSB0eXBlIGluZGV4LiAgKi8KLQotc3RydWN0IGllZWVfd3JpdGVfdHlwZQotewotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSB0eXBlLCBpZiBrbm93bi4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBUaGUgbmFtZSBvZiB0aGUgdHlwZSwgaWYgYW55LiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLCB3ZSBidWlsZCB0aGUgdHlwZSBoZXJlLCBhbmQKLSAgICAgb25seSBhZGQgaXQgdG8gdGhlIG91dHB1dCBidWZmZXJzIGlmIHdlIG5lZWQgaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGZuZGVmOwotICAvKiBJZiB0aGlzIGlzIGEgc3RydWN0LCB0aGlzIGlzIHdoZXJlIHRoZSBzdHJ1Y3QgZGVmaW5pdGlvbiBpcwotICAgICBidWlsdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3Qgc3RyZGVmOwotICAvKiBJZiB0aGlzIGlzIGEgY2xhc3MsIHRoaXMgaXMgd2hlcmUgdGhlIGNsYXNzIGluZm9ybWF0aW9uIGlzIGJ1aWx0LiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZV9jbGFzcyAqY2xhc3NkZWY7Ci0gIC8qIFdoZXRoZXIgdGhlIHR5cGUgaXMgdW5zaWduZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdW5zaWduZWRwIDogMTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGEgcmVmZXJlbmNlIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgcmVmZXJlbmNlcCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBpcyBpbiB0aGUgbG9jYWwgdHlwZSBibG9jay4gICovCi0gIHVuc2lnbmVkIGludCBsb2NhbHAgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgaXMgYSBkdXBsaWNhdGUgc3RydWN0IGRlZmluaXRpb24gd2hpY2ggd2UgYXJlCi0gICAgIGlnbm9yaW5nLiAgKi8KLSAgdW5zaWduZWQgaW50IGlnbm9yZXAgOiAxOwotfTsKLQotLyogVGhpcyBpcyB0aGUgdHlwZSBzdGFjayB1c2VkIGJ5IHRoZSBkZWJ1ZyB3cml0aW5nIHJvdXRpbmVzLiAgRklYTUU6Ci0gICBXZSBjb3VsZCBnZW5lcmF0ZSBtb3JlIGVmZmljaWVudCBvdXRwdXQgaWYgd2UgcmVtZW1iZXJlZCB3aGVuIHdlCi0gICBoYXZlIG91dHB1dCBhIHBhcnRpY3VsYXIgdHlwZSBiZWZvcmUuICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlX3N0YWNrCi17Ci0gIC8qIE5leHQgZW50cnkgb24gc3RhY2suICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICpuZXh0OwotICAvKiBUeXBlIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGllZWVfd3JpdGVfdHlwZSB0eXBlOwotfTsKLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgYXNzb2NpYXRpb25zIGJldHdlZW4gYSBuYW1lIGFuZCBzb21lIHR5cGVzLgotICAgVGhlc2UgYXJlIHVzZWQgZm9yIHR5cGVkZWZzIGFuZCB0YWdzLiAgKi8KLQotc3RydWN0IGllZWVfbmFtZV90eXBlCi17Ci0gIC8qIE5leHQgdHlwZSBmb3IgdGhpcyBuYW1lLiAgKi8KLSAgc3RydWN0IGllZWVfbmFtZV90eXBlICpuZXh0OwotICAvKiBJRCBudW1iZXIuICBGb3IgYSB0eXBlZGVmLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgdHlwZSB0byB3aGljaAotICAgICB0aGlzIG5hbWUgaXMgdHlwZWRlZmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGlkOwotICAvKiBUeXBlLiAgKi8KLSAgc3RydWN0IGllZWVfd3JpdGVfdHlwZSB0eXBlOwotICAvKiBJZiB0aGlzIGlzIGEgdGFnIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZCwgdGhpcyBpcyB0aGUKLSAgICAga2luZC4gIElmIHRoZSB0YWcgaGFzIGJlZW4gZGVmaW5lZCwgdGhpcyBpcyBERUJVR19LSU5EX0lMTEVHQUwuICAqLwotICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotfTsKLQotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBhc3NvY2lhdGUgbmFtZXMgYW5kIHR5cGVzLiAgKi8KLQotc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi1zdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogSW5mb3JtYXRpb24gZm9yIHRoaXMgbmFtZS4gICovCi0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqdHlwZXM7Ci19OwotCi0vKiBUaGlzIGlzIGEgbGlzdCBvZiBlbnVtcy4gICovCi0KLXN0cnVjdCBpZWVlX2RlZmluZWRfZW51bQotewotICAvKiBOZXh0IGVudW0uICAqLwotICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKm5leHQ7Ci0gIC8qIFR5cGUgaW5kZXguICAqLwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgLyogV2hldGhlciB0aGlzIGVudW0gaGFzIGJlZW4gZGVmaW5lZC4gICovCi0gIGJvb2xlYW4gZGVmaW5lZDsKLSAgLyogVGFnLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotICAvKiBOYW1lcy4gICovCi0gIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgLyogVmFsdWVzLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgKnZhbHM7Ci19OwotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0eXBlcywgc28gdGhhdCB3ZSBkb24ndAotICAgb3V0cHV0IHRoZW0gbW9yZSB0aGFuIG9uY2UuICAqLwotCi1zdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlCi17Ci0gIC8qIFBvaW50ZXIgdG8gdGhpcyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHBvaW50ZXI7Ci0gIC8qIEZ1bmN0aW9uIHdpdGggdW5rbm93biBhcmd1bWVudHMgcmV0dXJuaW5nIHRoaXMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBmdW5jdGlvbjsKLSAgLyogQ29uc3QgdmVyc2lvbiBvZiB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgY29uc3RfcXVhbGlmaWVkOwotICAvKiBWb2xhdGlsZSB2ZXJzaW9uIG9mIHRoaXMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCB2b2xhdGlsZV9xdWFsaWZpZWQ7Ci0gIC8qIExpc3Qgb2YgYXJyYXlzIG9mIHRoaXMgdHlwZSBvZiB2YXJpb3VzIGJvdW5kcy4gICovCi0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKmFycmF5czsKLX07Ci0KLS8qIEEgbGlzdCBvZiBhcnJheXMgYm91bmRzLiAgKi8KLQotc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZQotewotICAvKiBOZXh0IGFycmF5IGJvdW5kcy4gICovCi0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKm5leHQ7Ci0gIC8qIFR5cGUgaW5kZXggd2l0aCB0aGVzZSBib3VuZHMuICAqLwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgLyogTG93IGJvdW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgbG93OwotICAvKiBIaWdoIGJvdW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgaGlnaDsKLX07Ci0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIHBlbmRpbmcgZnVuY3Rpb24gcGFyYW1ldGVyIGluZm9ybWF0aW9uLiAgV2UgZG9uJ3QKLSAgIG91dHB1dCB0aGVtIHVudGlsIHdlIHNlZSB0aGUgZmlyc3QgYmxvY2suICAqLwotCi1zdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0KLXsKLSAgLyogTmV4dCBwZW5kaW5nIHBhcmFtZXRlci4gICovCi0gIHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqbmV4dDsKLSAgLyogTmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFR5cGUgaW5kZXguICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgLyogV2hldGhlciB0aGUgdHlwZSBpcyBhIHJlZmVyZW5jZS4gICovCi0gIGJvb2xlYW4gcmVmZXJlbmNlcDsKLSAgLyogS2luZC4gICovCi0gIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gIC8qIFZhbHVlLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSBoYW5kbGUgcGFzc2VkIGRvd24gYnkgZGVidWdfd3JpdGUuICAqLwotCi1zdHJ1Y3QgaWVlZV9oYW5kbGUKLXsKLSAgLyogQkZEIHdlIGFyZSB3cml0aW5nIHRvLiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBXaGV0aGVyIHdlIGdvdCBhbiBlcnJvciBpbiBhIHN1YnJvdXRpbmUgY2FsbGVkIHZpYSB0cmF2ZXJzZSBvcgotICAgICBtYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gZXJyb3I7Ci0gIC8qIEN1cnJlbnQgZGF0YSBidWZmZXIgbGlzdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmN1cnJlbnQ7Ci0gIC8qIEN1cnJlbnQgZGF0YSBidWZmZXIuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKmN1cmJ1ZjsKLSAgLyogRmlsZW5hbWUgb2YgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIE1vZHVsZSBuYW1lIG9mIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIGNvbnN0IGNoYXIgKm1vZG5hbWU7Ci0gIC8qIExpc3Qgb2YgYnVmZmVyIGZvciBnbG9iYWwgdHlwZXMuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGdsb2JhbF90eXBlczsKLSAgLyogTGlzdCBvZiBmaW5pc2hlZCBkYXRhIGJ1ZmZlcnMuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGRhdGE7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgdHlwZWRlZnMgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgdHlwZXM7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgaW4gdGhlIGN1cnJlbnQKLSAgICAgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgdmFyczsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciBDKysgY2xhc3MgZGVmaW5pdGlvbnMgaW4gdGhlIGN1cnJlbnQKLSAgICAgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgY3h4OwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIGxpbmUgbnVtYmVycyBpbiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBsaW5lbm9zOwotICAvKiBSYW5nZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcmFuZ2VzOwotICAvKiBSYW5nZXMgZm9yIGFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqZ2xvYmFsX3JhbmdlczsKLSAgLyogTmVzdGVkIHBlbmRpbmcgcmFuZ2VzLiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKnBlbmRpbmdfcmFuZ2VzOwotICAvKiBUeXBlIHN0YWNrLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqdHlwZV9zdGFjazsKLSAgLyogTmV4dCB1bmFsbG9jYXRlZCB0eXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGVfaW5keDsKLSAgLyogTmV4dCB1bmFsbG9jYXRlZCBuYW1lIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKLSAgLyogVHlwZWRlZnMuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF90YWJsZSB0eXBlZGVmczsKLSAgLyogVGFncy4gICovCi0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX3RhYmxlIHRhZ3M7Ci0gIC8qIEVudW1zLiAgKi8KLSAgc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICplbnVtczsKLSAgLyogTW9kaWZpZWQgdmVyc2lvbnMgb2YgdHlwZXMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptb2RpZmllZDsKLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgYWxsb2NhdGVkIGluIG1vZGlmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IG1vZGlmaWVkX2FsbG9jOwotICAvKiA0IGJ5dGUgY29tcGxleCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbXBsZXhfZmxvYXRfaW5kZXg7Ci0gIC8qIDggYnl0ZSBjb21wbGV4IHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgY29tcGxleF9kb3VibGVfaW5kZXg7Ci0gIC8qIFRoZSBkZXB0aCBvZiBibG9jayBuZXN0aW5nLiAgVGhpcyBpcyAwIG91dHNpZGUgYSBmdW5jdGlvbiwgYW5kIDEKLSAgICAganVzdCBhZnRlciBzdGFydF9mdW5jdGlvbiBpcyBjYWxsZWQuICAqLwotICB1bnNpZ25lZCBpbnQgYmxvY2tfZGVwdGg7Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLSAgY29uc3QgY2hhciAqZm5uYW1lOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiB3ZSBhcmUgY3VycmVudGx5Ci0gICAgIHdyaXRpbmcgb3V0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbnR5cGU7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGZ1bmN0aW9uIHdlIGFyZQotICAgICBjdXJyZW50bHkgd3JpdGluZyBvdXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGZuYXJnczsKLSAgLyogTnVtYmVyIG9mIGFyZ3VtZW50cyB3cml0dGVuIHRvIGZuYXJncy4gICovCi0gIHVuc2lnbmVkIGludCBmbmFyZ2NvdW50OwotICAvKiBQZW5kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKnBlbmRpbmdfcGFybXM7Ci0gIC8qIEN1cnJlbnQgbGluZSBudW1iZXIgZmlsZW5hbWUuICAqLwotICBjb25zdCBjaGFyICpsaW5lbm9fZmlsZW5hbWU7Ci0gIC8qIExpbmUgbnVtYmVyIG5hbWUgaW5kZXguICAqLwotICB1bnNpZ25lZCBpbnQgbGluZW5vX25hbWVfaW5keDsKLSAgLyogRmlsZW5hbWUgb2YgcGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIGNvbnN0IGNoYXIgKnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lOwotICAvKiBQZW5kaW5nIGxpbmUgbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwZW5kaW5nX2xpbmVubzsKLSAgLyogQWRkcmVzcyBvZiBwZW5kaW5nIGxpbmUgbnVtYmVyLiAgKi8KLSAgYmZkX3ZtYSBwZW5kaW5nX2xpbmVub19hZGRyOwotICAvKiBIaWdoZXN0IGFkZHJlc3Mgc2VlbiBhdCBlbmQgb2YgcHJvY2VkdXJlLiAgKi8KLSAgYmZkX3ZtYSBoaWdoYWRkcjsKLX07Ci0KLXN0YXRpYyBib29sZWFuIGllZWVfaW5pdF9idWZmZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jaGFuZ2VfYnVmZmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYXBwZW5kX2J1ZmZlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgc3RydWN0IGllZWVfYnVmbGlzdCAqLAotCSAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFsX3dyaXRlX2J5dGUgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV8yYnl0ZXMgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9udW1iZXIgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaWQgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9hc24KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9hdG42NQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcHVzaF90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKLQkgICBib29sZWFuKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGllZWVfcG9wX3R5cGUgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICopKTsKLXN0YXRpYyB2b2lkIGllZWVfcG9wX3VudXNlZF90eXBlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGllZWVfcG9wX3R5cGVfdXNlZAotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9hZGRfcmFuZ2UKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJvb2xlYW4sIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfcmFuZ2UgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX3JhbmdlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2RlZmluZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZGVmaW5lX25hbWVkX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgc3RydWN0IGllZWVfYnVmbGlzdCAqKSk7Ci1zdGF0aWMgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqaWVlZV9nZXRfbW9kaWZpZWRfaW5mbwotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICppZWVlX25hbWVfdHlwZV9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX3VuZGVmaW5lZF90YWcKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBpZWVlX2FkZF9iYjExX2Jsb2NrcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FkZF9iYjExCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX291dHB1dF9wZW5kaW5nX3Bhcm1zIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGllZWVfdmlzX3RvX2ZsYWdzIFBBUkFNUyAoKGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19tZXRob2RfdmFyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwKLQkgICBib29sZWFuLCBib29sZWFuLCBiZmRfdm1hLCBib29sZWFuKSk7Ci0KLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW1wdHlfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9mbG9hdF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW51bV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBiZmRfc2lnbmVkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmFuZ2VfdHlwZSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3NldF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9vZmZzZXRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfbWV0aG9kX3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY29uc3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0cnVjdF9maWVsZAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9zdHJ1Y3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfY2xhc3NfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19zdGF0aWNfbWVtYmVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19iYXNlY2xhc3MKLSAgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgYmZkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19lbmRfbWV0aG9kIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfY2xhc3NfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdHlwZWRlZl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3RhZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGRlZiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90YWcgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfaW50X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Zsb2F0X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkb3VibGUpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdHlwZWRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfZnVuY3Rpb24gUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZnVuY3Rpb25fcGFyYW1ldGVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2xpbmVubwotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyBpZWVlX2ZucyA9Ci17Ci0gIGllZWVfc3RhcnRfY29tcGlsYXRpb25fdW5pdCwKLSAgaWVlZV9zdGFydF9zb3VyY2UsCi0gIGllZWVfZW1wdHlfdHlwZSwKLSAgaWVlZV92b2lkX3R5cGUsCi0gIGllZWVfaW50X3R5cGUsCi0gIGllZWVfZmxvYXRfdHlwZSwKLSAgaWVlZV9jb21wbGV4X3R5cGUsCi0gIGllZWVfYm9vbF90eXBlLAotICBpZWVlX2VudW1fdHlwZSwKLSAgaWVlZV9wb2ludGVyX3R5cGUsCi0gIGllZWVfZnVuY3Rpb25fdHlwZSwKLSAgaWVlZV9yZWZlcmVuY2VfdHlwZSwKLSAgaWVlZV9yYW5nZV90eXBlLAotICBpZWVlX2FycmF5X3R5cGUsCi0gIGllZWVfc2V0X3R5cGUsCi0gIGllZWVfb2Zmc2V0X3R5cGUsCi0gIGllZWVfbWV0aG9kX3R5cGUsCi0gIGllZWVfY29uc3RfdHlwZSwKLSAgaWVlZV92b2xhdGlsZV90eXBlLAotICBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlLAotICBpZWVlX3N0cnVjdF9maWVsZCwKLSAgaWVlZV9lbmRfc3RydWN0X3R5cGUsCi0gIGllZWVfc3RhcnRfY2xhc3NfdHlwZSwKLSAgaWVlZV9jbGFzc19zdGF0aWNfbWVtYmVyLAotICBpZWVlX2NsYXNzX2Jhc2VjbGFzcywKLSAgaWVlZV9jbGFzc19zdGFydF9tZXRob2QsCi0gIGllZWVfY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gIGllZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LAotICBpZWVlX2NsYXNzX2VuZF9tZXRob2QsCi0gIGllZWVfZW5kX2NsYXNzX3R5cGUsCi0gIGllZWVfdHlwZWRlZl90eXBlLAotICBpZWVlX3RhZ190eXBlLAotICBpZWVlX3R5cGRlZiwKLSAgaWVlZV90YWcsCi0gIGllZWVfaW50X2NvbnN0YW50LAotICBpZWVlX2Zsb2F0X2NvbnN0YW50LAotICBpZWVlX3R5cGVkX2NvbnN0YW50LAotICBpZWVlX3ZhcmlhYmxlLAotICBpZWVlX3N0YXJ0X2Z1bmN0aW9uLAotICBpZWVlX2Z1bmN0aW9uX3BhcmFtZXRlciwKLSAgaWVlZV9zdGFydF9ibG9jaywKLSAgaWVlZV9lbmRfYmxvY2ssCi0gIGllZWVfZW5kX2Z1bmN0aW9uLAotICBpZWVlX2xpbmVubwotfTsKLQotLyogSW5pdGlhbGl6ZSBhIGJ1ZmZlciB0byBiZSBlbXB0eS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWllZWVfaW5pdF9idWZmZXIgKGluZm8sIGJ1Zmxpc3QpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpidWZsaXN0OwotewotICBidWZsaXN0LT5oZWFkID0gTlVMTDsKLSAgYnVmbGlzdC0+dGFpbCA9IE5VTEw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgd2hldGhlciBhIGJ1ZmZlciBsaXN0IGhhcyBhbnkgZGF0YS4gICovCi0KLSNkZWZpbmUgaWVlZV9idWZmZXJfZW1wdHlwKGJ1Zmxpc3QpICgoYnVmbGlzdCktPmhlYWQgPT0gTlVMTCkKLQotLyogQ2hhbmdlIHRoZSBjdXJyZW50IGJ1ZmZlciB0byBhIHNwZWNpZmllZCBidWZmZXIgY2hhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCBidWZsaXN0KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmJ1Zmxpc3Q7Ci17Ci0gIGlmIChidWZsaXN0LT5oZWFkID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGllZWVfYnVmICpidWY7Ci0KLSAgICAgIGJ1ZiA9IChzdHJ1Y3QgaWVlZV9idWYgKikgeG1hbGxvYyAoc2l6ZW9mICpidWYpOwotICAgICAgYnVmLT5uZXh0ID0gTlVMTDsKLSAgICAgIGJ1Zi0+YyA9IDA7Ci0gICAgICBidWZsaXN0LT5oZWFkID0gYnVmOwotICAgICAgYnVmbGlzdC0+dGFpbCA9IGJ1ZjsKLSAgICB9Ci0KLSAgaW5mby0+Y3VycmVudCA9IGJ1Zmxpc3Q7Ci0gIGluZm8tPmN1cmJ1ZiA9IGJ1Zmxpc3QtPnRhaWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFwcGVuZCBhIGJ1ZmZlciBjaGFpbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgbWFpbmJ1ZiwgbmV3YnVmKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqbWFpbmJ1ZjsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqbmV3YnVmOwotewotICBpZiAobmV3YnVmLT5oZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG1haW5idWYtPmhlYWQgPT0gTlVMTCkKLQltYWluYnVmLT5oZWFkID0gbmV3YnVmLT5oZWFkOwotICAgICAgZWxzZQotCW1haW5idWYtPnRhaWwtPm5leHQgPSBuZXdidWYtPmhlYWQ7Ci0gICAgICBtYWluYnVmLT50YWlsID0gbmV3YnVmLT50YWlsOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgYnl0ZSBpbnRvIHRoZSBidWZmZXIuICBXZSB1c2UgYSBtYWNybyBmb3Igc3BlZWQgYW5kIGEKLSAgIGZ1bmN0aW9uIGZvciB0aGUgY29tcGxleCBjYXNlcy4gICovCi0KLSNkZWZpbmUgaWVlZV93cml0ZV9ieXRlKGluZm8sIGIpCQkJCVwKLSAgKChpbmZvKS0+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+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggLSBsb3cpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWRkIHRoaXMgcmFuZ2UgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIHJhbmdlcy4gICovCi0gICAgICBpZiAoISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgdHJ1ZSwgbG93LCBoaWdoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgQkIxMSBibG9ja3MgZGVzY3JpYmluZyBlYWNoIHJhbmdlIHRoYXQgd2UgaGF2ZSBub3QgYWxyZWFkeQotICAgZGVzY3JpYmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfYWRkX2JiMTFfYmxvY2tzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBkYXRhOwotICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKnI7Ci0KLSAgbG93ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKLSAgaGlnaCA9IGxvdyArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYyk7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3QgcmFuZ2UgYXQgb3IgYWZ0ZXIgdGhpcyBzZWN0aW9uLiAgVGhlIHJhbmdlcyBhcmUKLSAgICAgc29ydGVkIGJ5IGFkZHJlc3MuICAqLwotICBmb3IgKHIgPSBpbmZvLT5nbG9iYWxfcmFuZ2VzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIGlmIChyLT5oaWdoID4gbG93KQotICAgICAgYnJlYWs7Ci0KLSAgd2hpbGUgKGxvdyA8IGhpZ2gpCi0gICAgewotICAgICAgaWYgKHIgPT0gTlVMTCB8fCByLT5sb3cgPj0gaGlnaCkKLQl7Ci0JICBpZiAoISBpZWVlX2FkZF9iYjExIChpbmZvLCBzZWMsIGxvdywgaGlnaCkpCi0JICAgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChsb3cgPCByLT5sb3cKLQkgICYmIHItPmxvdyAtIGxvdyA+IDB4MTAwKQotCXsKLQkgIGlmICghIGllZWVfYWRkX2JiMTEgKGluZm8sIHNlYywgbG93LCByLT5sb3cpKQotCSAgICB7Ci0JICAgICAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGxvdyA9IHItPmhpZ2g7Ci0KLSAgICAgIHIgPSByLT5uZXh0OwotICAgIH0KLX0KLQotLyogQWRkIGEgc2luZ2xlIEJCMTEgYmxvY2sgZm9yIGEgcmFuZ2UuICBXZSBhZGQgaXQgdG8gaW5mby0+dmFycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2FkZF9iYjExIChpbmZvLCBzZWMsIGxvdywgaGlnaCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGxvdzsKLSAgICAgYmZkX3ZtYSBoaWdoOwotewotICBpbnQga2luZDsKLQotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICptb2RuYW1lOwotICAgICAgY2hhciAqYywgKnM7Ci0KLSAgICAgIC8qIFN0YXJ0IHRoZSBlbmNsb3NpbmcgQkIxMCBibG9jay4gICovCi0gICAgICBmaWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpOwotICAgICAgbW9kbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOwotICAgICAgaWYgKG1vZG5hbWUgIT0gTlVMTCkKLQkrK21vZG5hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgbW9kbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnXFwnKTsKLQkgIGlmIChtb2RuYW1lICE9IE5VTEwpCi0JICAgICsrbW9kbmFtZTsKLQkgIGVsc2UKLQkgICAgbW9kbmFtZSA9IGZpbGVuYW1lOwotCX0KLSAgICAgIGMgPSB4c3RyZHVwIChtb2RuYW1lKTsKLSAgICAgIHMgPSBzdHJyY2hyIChjLCAnLicpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQkqcyA9ICdcMCc7Ci0KLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGMpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIkdOVSBvYmpjb3B5IikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmcmVlIChjKTsKLSAgICB9Ci0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0NPREUpICE9IDApCi0gICAga2luZCA9IDE7Ci0gIGVsc2UgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQotICAgIGtpbmQgPSAzOwotICBlbHNlCi0gICAga2luZCA9IDI7Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDExKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBraW5kKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2VjLT5pbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGxvdykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaGlnaCAtIGxvdykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCByZWNvcmRpbmcgaW5mb3JtYXRpb24gZnJvbSBhIHBhcnRpY3VsYXIgc291cmNlIGZpbGUuICBUaGlzIGlzCi0gICB1c2VkIHRvIHJlY29yZCB3aGljaCBmaWxlIGRlZmluZWQgd2hpY2ggdHlwZXMsIHZhcmlhYmxlcywgZXRjLiAgSXQKLSAgIGlzIG5vdCB1c2VkIGZvciBsaW5lIG51bWJlcnMsIHNpbmNlIHRoZSBsaW5lbm8gZW50cnkgcG9pbnQgcGFzc2VzCi0gICBkb3duIHRoZSBmaWxlIG5hbWUgYW55aG93LiAgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZG9lc24ndCBzZWVtCi0gICB0byBzdG9yZSB0aGlzIGluZm9ybWF0aW9uIGFueXdoZXJlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9zb3VyY2UgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhbiBlbXB0eSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW1wdHlfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIChpbnQpIGJ1aWx0aW5fdW5rbm93biwgMCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIChpbnQpIGJ1aWx0aW5fdm9pZCwgMCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhbiBpbnRlZ2VyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9pbnRfdHlwZSAocCwgc2l6ZSwgdW5zaWduZWRwKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2xvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodW5zaWduZWRwKQotICAgICsraW5keDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIHVuc2lnbmVkcCwgZmFsc2UpOwotfQotCi0vKiBNYWtlIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Zsb2F0X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2Zsb2F0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHNpemUgcmVhbGx5IGRlcGVuZHMgdXBvbiB0aGUgcHJvY2Vzc29yLiAgKi8KLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2xvbmdfZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2xvbmdfbG9uZ19kb3VibGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHVuc3VwcG9ydGVkIGZsb2F0IHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qIE1ha2UgYSBjb21wbGV4IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jb21wbGV4X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjaGFyIGNvZGU7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCAhPSAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCwgc2l6ZSAqIDIsCi0JCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGNvZGUgPSAnYyc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTY6Ci0gICAgICAvKiBUaGVzZSBjYXNlcyBjYW4gYmUgb3V0cHV0IGJ5IGdjYyAtZ3N0YWJzLiAgT3V0cHV0dGluZyB0aGUKLSAgICAgICAgIHdyb25nIHR5cGUgaXMgYmV0dGVyIHRoYW4gY3Jhc2hpbmcuICAqLwotICAgIGNhc2UgODoKLSAgICAgIGlmIChpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCAhPSAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5mby0+Y29tcGxleF9kb3VibGVfaW5kZXgsIHNpemUgKiAyLAotCQkJICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBjb2RlID0gJ2QnOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBjb21wbGV4IHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQgdGhlIHN0cmluZyBpcyBmb3IuICAqLwotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplICogMiwgZmFsc2UsIGZhbHNlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgY29kZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc2l6ZSA9PSA0KQotICAgIGluZm8tPmNvbXBsZXhfZmxvYXRfaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0gIGVsc2UKLSAgICBpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGJvb2xlYW4gdHlwZS4gIElFRUUgZG9lc24ndCBzdXBwb3J0IHRoZXNlLCBzbyB3ZSBqdXN0IG1ha2UKLSAgIGFuIGludGVnZXIgdHlwZSBpbnN0ZWFkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfYm9vbF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHJldHVybiBpZWVlX2ludF90eXBlIChwLCBzaXplLCB0cnVlKTsKLX0KLQotLyogTWFrZSBhbiBlbnVtZXJhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFscykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKmU7Ci0gIGJvb2xlYW4gbG9jYWxwLCBzaW1wbGU7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBpbnQgaSA9IDA7Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0gIGluZHggPSAodW5zaWduZWQgaW50KSAtMTsKLSAgZm9yIChlID0gaW5mby0+ZW51bXM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0gICAgewotICAgICAgaWYgKHRhZyA9PSBOVUxMKQotCXsKLQkgIGlmIChlLT50YWcgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlLT50YWcgPT0gTlVMTAotCSAgICAgIHx8IHRhZ1swXSAhPSBlLT50YWdbMF0KLQkgICAgICB8fCBzdHJjbXAgKHRhZywgZS0+dGFnKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghIGUtPmRlZmluZWQpCi0JewotCSAgLyogVGhpcyBlbnVtIHRhZyBoYXMgYmVlbiBzZWVuIGJ1dCBub3QgZGVmaW5lZC4gICovCi0JICBpbmR4ID0gZS0+aW5keDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKG5hbWVzICE9IE5VTEwgJiYgZS0+bmFtZXMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMICYmIGUtPm5hbWVzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChuYW1lc1tpXVswXSAhPSBlLT5uYW1lc1tpXVswXQotCQkgIHx8IHZhbHNbaV0gIT0gZS0+dmFsc1tpXQotCQkgIHx8IHN0cmNtcCAobmFtZXNbaV0sIGUtPm5hbWVzW2ldKSAhPSAwKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKChuYW1lcyA9PSBOVUxMICYmIGUtPm5hbWVzID09IE5VTEwpCi0JICB8fCAobmFtZXMgIT0gTlVMTAotCSAgICAgICYmIGUtPm5hbWVzICE9IE5VTEwKLQkgICAgICAmJiBuYW1lc1tpXSA9PSBOVUxMCi0JICAgICAgJiYgZS0+bmFtZXNbaV0gPT0gTlVMTCkpCi0JewotCSAgLyogV2UndmUgc2VlbiB0aGlzIGVudW0gYmVmb3JlLiAgKi8KLQkgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgZS0+aW5keCwgMCwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotICAgICAgaWYgKHRhZyAhPSBOVUxMKQotCXsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgc2VlbiBhbiBlbnVtIG9mIHRoZSBzYW1lIG5hbWUsIHNvIHdlIG11c3QgbWFrZQotCSAgICAgc3VyZSB0byBvdXRwdXQgdGhpcyBvbmUgbG9jYWxseS4gICovCi0JICBsb2NhbHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgc2ltcGxlIGVudW1lcmF0aW9uLCBpbiB3aGljaCB0aGUgdmFsdWVzIHN0YXJ0IGF0IDAKLSAgICAgYW5kIGFsd2F5cyBpbmNyZW1lbnQgYnkgMSwgd2UgY2FuIHVzZSB0eXBlIEUuICBPdGhlcndpc2Ugd2UgbXVzdAotICAgICB1c2UgdHlwZSBOLiAgKi8KLQotICBzaW1wbGUgPSB0cnVlOwotICBpZiAobmFtZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMOyBpKyspCi0JewotCSAgaWYgKHZhbHNbaV0gIT0gaSkKLQkgICAgewotCSAgICAgIHNpbXBsZSA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCB0YWcsIGluZHgsIDAsIHRydWUsIGxvY2FscCwKLQkJCQkoc3RydWN0IGllZWVfYnVmbGlzdCAqKSBOVUxMKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2ltcGxlID8gJ0UnIDogJ04nKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaW1wbGUpCi0gICAgewotICAgICAgLyogRklYTUU6IFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIGVudW1lcmF0aW9uIHNpemUsIGJ1dCB3ZQotICAgICAgICAgZG9uJ3Qgc3RvcmUgdGhhdC4gICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKG5hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWVzW2ldKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCEgc2ltcGxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHZhbHNbaV0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBpZiAoaW5keCA9PSAodW5zaWduZWQgaW50KSAtMSkKLQl7Ci0JICBlID0gKHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOwotCSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKmUpOwotCSAgZS0+aW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQkgIGUtPnRhZyA9IHRhZzsKLQotCSAgZS0+bmV4dCA9IGluZm8tPmVudW1zOwotCSAgaW5mby0+ZW51bXMgPSBlOwotCX0KLQotICAgICAgZS0+bmFtZXMgPSBuYW1lczsKLSAgICAgIGUtPnZhbHMgPSB2YWxzOwotICAgICAgZS0+ZGVmaW5lZCA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgcG9pbnRlciB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcG9pbnRlcl90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm0gPSBOVUxMOwotCi0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQSBwb2ludGVyIHRvIGEgc2ltcGxlIGJ1aWx0aW4gdHlwZSBjYW4gYmUgb2J0YWluZWQgYnkgYWRkaW5nIDMyLgotICAgICBGSVhNRTogV2lsbCB0aGlzIGJlIGEgc2hvcnQgcG9pbnRlciwgYW5kIHdpbGwgdGhhdCBtYXR0ZXI/ICAqLwotICBpZiAoaW5keCA8IDMyKQotICAgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCArIDMyLCAwLCB0cnVlLCBmYWxzZSk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChwLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKG0tPnBvaW50ZXIgPiAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+cG9pbnRlciwgNCwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCA0LCB0cnVlLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnUCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIG0tPnBvaW50ZXIgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBmdW5jdGlvbiB0eXBlLiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgYSBtZXRob2QsIGJ1dCB3ZQotICAgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBhZGQgaXQgdG8gdGhlIHR5cGUgdGFibGUgaW4gdGhhdCBjYXNlLiAgV2UKLSAgIGhhbmRsZSB0aGlzIGJ5IGRlZmluaW5nIHRoZSB0eXBlIGluIGEgcHJpdmF0ZSBidWZmZXIsIGFuZCBvbmx5Ci0gICBhZGRpbmcgdGhhdCBidWZmZXIgdG8gdGhlIHR5cGVkZWYgYmxvY2sgaWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Z1bmN0aW9uX3R5cGUgKHAsIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCAqYXJncyA9IE5VTEw7Ci0gIGludCBpOwotICB1bnNpZ25lZCBpbnQgcmV0aW5keDsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmRlZjsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbTsKLQotICBsb2NhbHAgPSBmYWxzZTsKLQotICBpZiAoYXJnY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZ3MgPSAodW5zaWduZWQgaW50ICopIHhtYWxsb2MgKGFyZ2NvdW50ICogc2l6ZW9mICphcmdzKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotCSAgICBsb2NhbHAgPSB0cnVlOwotCSAgYXJnc1tpXSA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGFyZ2NvdW50IDwgMCkKLSAgICB2YXJhcmdzID0gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotICAgIGxvY2FscCA9IHRydWU7Ci0gIHJldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBtID0gTlVMTDsKLSAgaWYgKGFyZ2NvdW50IDwgMCAmJiAhIGxvY2FscCkKLSAgICB7Ci0gICAgICBtID0gaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAocCwgcmV0aW5keCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKG0tPmZ1bmN0aW9uID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPmZ1bmN0aW9uLCAwLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gIC8qIEFuIGF0dHJpYnV0ZSBvZiAweDQxIG1lYW5zIHRoYXQgdGhlIGZyYW1lIGFuZCBwdXNoIG1hc2sgYXJlCi0gICAgIHVua25vd24uICAqLwotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmZm5kZWYpCi0gICAgICB8fCAhIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgKHVuc2lnbmVkIGludCkgLTEsIDAsIHRydWUsIGxvY2FscCwKLQkJCQkgICAmZm5kZWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAneCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAweDQxKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZXRpbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgKGJmZF92bWEpIGFyZ2NvdW50ICsgKHZhcmFyZ3MgPyAxIDogMCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGFyZ2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLQlpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYXJnc1tpXSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICBmcmVlIChhcmdzKTsKLSAgICB9Ci0gIGlmICh2YXJhcmdzKQotICAgIHsKLSAgICAgIC8qIEEgdmFyYXJncyBmdW5jdGlvbiBpcyByZXByZXNlbnRlZCBieSB3cml0aW5nIG91dCB0aGUgbGFzdAotICAgICAgICAgYXJndW1lbnQgYXMgdHlwZSB2b2lkICosIGFsdGhvdWdoIHRoaXMgbWFrZXMgbGl0dGxlIHNlbnNlLiAgKi8KLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgYnVpbHRpbl92b2lkICsgMzIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSB3cm90ZSB0aGUgaW5mb3JtYXRpb24gaW50byBmbmRlZiwgaW4gY2FzZSB3ZSBkb24ndCBuZWVkIGl0LgotICAgICBJdCB3aWxsIGJlIGFwcGVuZGVkIHRvIGluZm8tPnR5cGVzIGJ5IGllZWVfcG9wX3R5cGUuICAqLwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmZuZGVmID0gZm5kZWY7Ci0KLSAgaWYgKG0gIT0gTlVMTCkKLSAgICBtLT5mdW5jdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVmZXJlbmNlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogSUVFRSBhcHBlYXJzIHRvIHJlY29yZCBhIG5vcm1hbCBwb2ludGVyIHR5cGUsIGFuZCB0aGVuIHVzZSBhCi0gICAgIHBtaXNjIHJlY29yZCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIHJlYWxseSBhIHJlZmVyZW5jZS4gICovCi0KLSAgaWYgKCEgaWVlZV9wb2ludGVyX3R5cGUgKHApKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSByYW5nZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmFuZ2VfdHlwZSAocCwgbG93LCBoaWdoKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93OwotICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotCi0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIHVuc2lnbmVkcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUudW5zaWduZWRwOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICByZXR1cm4gKGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdSJykKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgbG93KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBoaWdoKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHVuc2lnbmVkcCA/IDAgOiAxKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNpemUpKTsKLX0KLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hcnJheV90eXBlIChwLCBsb3csIGhpZ2gsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBlbGVpbmR4OwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm0gPSBOVUxMOwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICphOwotCi0gIC8qIElFRUUgZG9lcyBub3Qgc3RvcmUgdGhlIHJhbmdlLCBzbyB3ZSBqdXN0IGlnbm9yZSBpdC4gICovCi0gIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIGVsZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBJZiB3ZSBkb24ndCBrbm93IHRoZSByYW5nZSwgdHJlYXQgdGhlIHNpemUgYXMgZXhhY3RseSBvbmUKLSAgICAgZWxlbWVudC4gICovCi0gIGlmIChsb3cgPCBoaWdoKQotICAgIHNpemUgKj0gKGhpZ2ggLSBsb3cpICsgMTsKLQotICBpZiAoISBsb2NhbHApCi0gICAgewotICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGVsZWluZHgpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoYSA9IG0tPmFycmF5czsgYSAhPSBOVUxMOyBhID0gYS0+bmV4dCkKLQl7Ci0JICBpZiAoYS0+bG93ID09IGxvdyAmJiBhLT5oaWdoID09IGhpZ2gpCi0JICAgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgYS0+aW5keCwgc2l6ZSwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIGZhbHNlLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cgPT0gMCA/ICdaJyA6ICdDJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGVsZWluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGxvdyAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggKyAxKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIGEgPSAoc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmEpOwotICAgICAgbWVtc2V0IChhLCAwLCBzaXplb2YgKmEpOwotCi0gICAgICBhLT5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OwotICAgICAgYS0+bG93ID0gbG93OwotICAgICAgYS0+aGlnaCA9IGhpZ2g7Ci0KLSAgICAgIGEtPm5leHQgPSBtLT5hcnJheXM7Ci0gICAgICBtLT5hcnJheXMgPSBhOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIHNldCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2V0X3R5cGUgKHAsIGJpdHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBib29sZWFuIGJpdHN0cmluZ3AgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGVsZWluZHg7Ci0KLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGVsZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBGSVhNRTogV2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSwgc28gd2UganVzdCB1c2UgNC4gICovCi0KLSAgcmV0dXJuIChpZWVlX2RlZmluZV90eXBlIChpbmZvLCAwLCB0cnVlLCBsb2NhbHApCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ3MnKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDQpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgZWxlaW5keCkpOwotfQotCi0vKiBNYWtlIGFuIG9mZnNldCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfb2Zmc2V0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCB0YXJnZXRpbmR4LCBiYXNlaW5keDsKLQotICB0YXJnZXRpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gIGJhc2VpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogRklYTUU6IFRoZSBNUkkgQysrIGNvbXBpbGVyIGRvZXMgbm90IGFwcGVhciB0byBnZW5lcmF0ZSBhbnkKLSAgICAgdXNlZnVsIHR5cGUgaW5mb3JtYXRpb24gYWJvdXQgYW4gb2Zmc2V0IHR5cGUuICBJdCBqdXN0IHJlY29yZHMgYQotICAgICBwb2ludGVyIHRvIG1lbWJlciBhcyBhbiBpbnRlZ2VyLiAgVGhlIE1SSS9IUCBJRUVFIHNwZWMgZG9lcwotICAgICBkZXNjcmliZSBhIHBtaXNjIHJlY29yZCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgYSBwb2ludGVyIHRvCi0gICAgIG1lbWJlci4gIFVuZm9ydHVuYXRlbHksIGl0IGRvZXMgbm90IGRlc2NyaWJlIHRoZSB0YXJnZXQgdHlwZSwKLSAgICAgd2hpY2ggc2VlbXMgcHJldHR5IGltcG9ydGFudC4gIEknbSBnb2luZyB0byBwdW50IHRoaXMgZm9yIG5vdy4gICovCi0KLSAgcmV0dXJuIGllZWVfaW50X3R5cGUgKHAsIDQsIHRydWUpOwotfSAgCi0KLS8qIE1ha2UgYSBtZXRob2QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX21ldGhvZF90eXBlIChwLCBkb21haW4sIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBkb21haW47Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUU6IFRoZSBNUkkvSFAgSUVFRSBzcGVjIGRlZmluZXMgYSBwbWlzYyByZWNvcmQgdG8gdXNlIGZvciBhCi0gICAgIG1ldGhvZCwgYnV0IHRoZSBkZWZpbml0aW9uIGlzIGluY29tcGxldGUuICBXZSBqdXN0IG91dHB1dCBhbiAneCcKLSAgICAgdHlwZS4gICovCi0KLSAgaWYgKGRvbWFpbikKLSAgICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0KLSAgcmV0dXJuIGllZWVfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpOwotfQotCi0vKiBNYWtlIGEgY29uc3QgcXVhbGlmaWVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jb25zdF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYm9vbGVhbiB1bnNpZ25lZHAsIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm0gPSBOVUxMOwotCi0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIHVuc2lnbmVkcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUudW5zaWduZWRwOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBtID0gaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAoaW5mbywgaW5keCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKG0tPmNvbnN0X3F1YWxpZmllZCA+IDApCi0JcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBtLT5jb25zdF9xdWFsaWZpZWQsIHNpemUsIHVuc2lnbmVkcCwKLQkJCSAgICAgICBmYWxzZSk7Ci0gICAgfQotCi0gIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ24nKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBsb2NhbHApCi0gICAgbS0+Y29uc3RfcXVhbGlmaWVkID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV92b2xhdGlsZV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYm9vbGVhbiB1bnNpZ25lZHAsIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm0gPSBOVUxMOwotCi0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIHVuc2lnbmVkcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUudW5zaWduZWRwOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBtID0gaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAoaW5mbywgaW5keCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKG0tPnZvbGF0aWxlX3F1YWxpZmllZCA+IDApCi0JcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBtLT52b2xhdGlsZV9xdWFsaWZpZWQsIHNpemUsIHVuc2lnbmVkcCwKLQkJCSAgICAgICBmYWxzZSk7Ci0gICAgfQotCi0gIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ24nKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBsb2NhbHApCi0gICAgbS0+dm9sYXRpbGVfcXVhbGlmaWVkID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb252ZXJ0IGFuIGVudW0gZGVidWdfdmlzaWJpbGl0eSBpbnRvIGEgQ1hYRkxBR1MgdmFsdWUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pZWVlX3Zpc190b19mbGFncyAodmlzaWJpbGl0eSkKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICByZXR1cm4gQ1hYRkxBR1NfVklTSUJJTElUWV9QVUJMSUM7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6Ci0gICAgICByZXR1cm4gQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICByZXR1cm4gQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBTdGFydCBkZWZpbmluZyBhIHN0cnVjdCB0eXBlLiAgV2UgYnVpbGQgaXQgaW4gdGhlIHN0cmRlZiBmaWVsZCBvbgotICAgdGhlIHN0YWNrLCB0byBhdm9pZCBjb25mdXNpbmcgdHlwZSBkZWZpbml0aW9ucyByZXF1aXJlZCBieSB0aGUKLSAgIGZpZWxkcyB3aXRoIHRoZSBzdHJ1Y3QgdHlwZSBpdHNlbGYuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gbG9jYWxwLCBpZ25vcmVwOwotICBib29sZWFuIGNvcHk7Ci0gIGNoYXIgYWJbMjBdOwotICBjb25zdCBjaGFyICpsb29rOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlICpudCwgKm50bG9vazsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCBzdHJkZWY7Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0gIGlnbm9yZXAgPSBmYWxzZTsKLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIHRhZyBmb3IgaW50ZXJuYWwgdXNlIGV2ZW4gaWYgd2UgZG9uJ3Qgd2FudAotICAgICBvbmUgZm9yIGV4dGVybmFsIHVzZS4gIFRoaXMgd2lsbCBsZXQgdXMgcmVmZXIgdG8gYW4gYW5vbnltb3VzCi0gICAgIHN0cnVjdC4gICovCi0gIGlmICh0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsb29rID0gdGFnOwotICAgICAgY29weSA9IGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNwcmludGYgKGFiLCAiX19hbm9uJXUiLCBpZCk7Ci0gICAgICBsb29rID0gYWI7Ci0gICAgICBjb3B5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYWxyZWFkeSBoYXZlIHJlZmVyZW5jZXMgdG8gdGhlIHRhZywgd2UgbXVzdCB1c2UgdGhlCi0gICAgIGV4aXN0aW5nIHR5cGUgaW5kZXguICAqLwotICBoID0gaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAgKCZpbmZvLT50YWdzLCBsb29rLCB0cnVlLCBjb3B5KTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbnQgPSBOVUxMOwotICBmb3IgKG50bG9vayA9IGgtPnR5cGVzOyBudGxvb2sgIT0gTlVMTDsgbnRsb29rID0gbnRsb29rLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChudGxvb2stPmlkID09IGlkKQotCW50ID0gbnRsb29rOwotICAgICAgZWxzZSBpZiAoISBudGxvb2stPnR5cGUubG9jYWxwKQotCXsKLQkgIC8qIFdlIGFyZSBjcmVhdGluZyBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIGEgZ2xvYmFsbHkKLQkgICAgIGRlZmluZWQgdGFnLiAgRm9yY2UgaXQgdG8gYmUgbG9jYWwgdG8gYXZvaWQKLQkgICAgIGNvbmZ1c2lvbi4gICovCi0JICBsb2NhbHAgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgaWYgKG50ICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0IChsb2NhbHAgPT0gbnQtPnR5cGUubG9jYWxwKTsKLSAgICAgIGlmIChudC0+a2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwgJiYgISBsb2NhbHApCi0JewotCSAgLyogV2UndmUgYWxyZWFkeSBzZWVuIGEgZ2xvYmFsIGRlZmluaXRpb24gb2YgdGhlIHR5cGUuCi0gICAgICAgICAgICAgSWdub3JlIHRoaXMgbmV3IGRlZmluaXRpb24uICAqLwotCSAgaWdub3JlcCA9IHRydWU7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG50ID0gKHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm50KTsKLSAgICAgIG1lbXNldCAobnQsIDAsIHNpemVvZiAqbnQpOwotICAgICAgbnQtPmlkID0gaWQ7Ci0gICAgICBudC0+dHlwZS5uYW1lID0gaC0+cm9vdC5zdHJpbmc7Ci0gICAgICBudC0+bmV4dCA9IGgtPnR5cGVzOwotICAgICAgaC0+dHlwZXMgPSBudDsKLSAgICAgIG50LT50eXBlLmluZHggPSBpbmZvLT50eXBlX2luZHg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5keDsKLSAgICB9Ci0KLSAgbnQtPmtpbmQgPSBERUJVR19LSU5EX0lMTEVHQUw7Ci0KLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJnN0cmRlZikKLSAgICAgIHx8ICEgaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgdGFnLCBudC0+dHlwZS5pbmR4LCBzaXplLCB0cnVlLAotCQkJCSAgIGxvY2FscCwgJnN0cmRlZikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHN0cnVjdHAgPyAnUycgOiAnVScpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWdub3JlcCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpob2xkOwotCi0gICAgICAvKiBXZSBuZXZlciB3YW50IG50LT50eXBlLm5hbWUgdG8gYmUgTlVMTC4gIFdlIHdhbnQgdGhlIHJlc3Qgb2YKLQkgdGhlIHR5cGUgdG8gYmUgdGhlIG9iamVjdCBzZXQgdXAgb24gdGhlIHR5cGUgc3RhY2s7IGl0IHdpbGwKLQkgaGF2ZSBhIE5VTEwgbmFtZSBpZiB0YWcgaXMgTlVMTC4gICovCi0gICAgICBob2xkID0gbnQtPnR5cGUubmFtZTsKLSAgICAgIG50LT50eXBlID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZTsKLSAgICAgIG50LT50eXBlLm5hbWUgPSBob2xkOwotICAgIH0KLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWUgPSB0YWc7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmID0gc3RyZGVmOwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmlnbm9yZXAgPSBpZ25vcmVwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBmaWVsZCB0byBhIHN0cnVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0cnVjdF9maWVsZCAocCwgbmFtZSwgYml0cG9zLCBiaXRzaXplLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJmZF92bWEgYml0c2l6ZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGJvb2xlYW4gdW5zaWduZWRwOwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPm5leHQgIT0gTlVMTAotCSAgJiYgISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlX3N0YWNrLT5uZXh0LT50eXBlLnN0cmRlZikpOwotCi0gIC8qIElmIHdlIGFyZSBpZ25vcmluZyB0aGlzIHN0cnVjdCBkZWZpbml0aW9uLCBqdXN0IHBvcCBhbmQgaWdub3JlCi0gICAgIHRoZSB0eXBlLiAgKi8KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPm5leHQtPnR5cGUuaWdub3JlcCkKLSAgICB7Ci0gICAgICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7Ci0gIHJlZmVyZW5jZXAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXA7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKGxvY2FscCkKLSAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCA9IHRydWU7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBjbGFzcy4gIFdlIG11c3QgYWRkIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWVsZCB0bwotICAgICAgICAgdGhlIGNsYXNzIHJlY29yZHMgd2UgYXJlIGJ1aWxkaW5nLiAgKi8KLQotICAgICAgZmxhZ3MgPSBpZWVlX3Zpc190b19mbGFncyAodmlzaWJpbGl0eSk7Ci0gICAgICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCi0JCQkJJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdkJykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCBmbGFncykKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDQ7Ci0KLSAgICAgIGlmIChyZWZlcmVuY2VwKQotCXsKLQkgIHVuc2lnbmVkIGludCBuaW5keDsKLQotCSAgLyogV2UgbmVlZCB0byBvdXRwdXQgYSByZWNvcmQgcmVjb3JkaW5nIHRoYXQgdGhpcyBmaWVsZCBpcwotICAgICAgICAgICAgIHJlYWxseSBvZiByZWZlcmVuY2UgdHlwZS4gIFdlIHB1dCB0aGlzIG9uIHRoZSByZWZzIGZpZWxkCi0gICAgICAgICAgICAgb2YgY2xhc3NkZWYsIHNvIHRoYXQgaXQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBDKysKLSAgICAgICAgICAgICByZWNvcmRzIGFmdGVyIHRoZSBjbGFzcyBpcyBkZWZpbmVkLiAgKi8KLQotCSAgbmluZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0JICArK2luZm8tPm5hbWVfaW5keDsKLQotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLAotCQkJCSAgICAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cmVmcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDYyKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDQpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdSJykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgMykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWUpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoZSBiaXRzaXplIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHNpemUsIHdlIG5lZWQgdG8gb3V0cHV0Ci0gICAgIGEgYml0ZmllbGQgdHlwZS4gICovCi0gIGlmIChzaXplID09IDAgfHwgYml0c2l6ZSA9PSAwIHx8IGJpdHNpemUgPT0gc2l6ZSAqIDgpCi0gICAgb2Zmc2V0ID0gYml0cG9zIC8gODsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIDAsIHVuc2lnbmVkcCwKLQkJCSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ2cnKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdW5zaWduZWRwID8gMCA6IDEpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBiaXRzaXplKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotICAgICAgb2Zmc2V0ID0gYml0cG9zOwotICAgIH0KLQotICAvKiBTd2l0Y2ggdG8gdGhlIHN0cnVjdCB3ZSBhcmUgYnVpbGRpbmcgaW4gb3JkZXIgdG8gb3V0cHV0IHRoaXMKLSAgICAgZmllbGQgZGVmaW5pdGlvbi4gICovCi0gIHJldHVybiAoaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpCi0JICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgb2Zmc2V0KSk7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX3N0cnVjdF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpwYjsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikpOwotCi0gIC8qIElmIHdlIHdlcmUgaWdub3JpbmcgdGhpcyBzdHJ1Y3QgZGVmaW5pdGlvbiBiZWNhdXNlIGl0IHdhcyBhCi0gICAgIGR1cGxpY2F0ZSBkZWZpbnRpb24sIGp1c3QgdGhyb3VnaCBhd2F5IHdoYXRldmVyIGJ5dGVzIHdlIGhhdmUKLSAgICAgYWNjdW11bGF0ZWQuICBMZWF2ZSB0aGUgdHlwZSBvbiB0aGUgc3RhY2suICovCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmlnbm9yZXApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBub3QgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiB0aGlzIHRhZywgdGhlbiBsb2NhbHAKLSAgICAgd2lsbCBiZSBmYWxzZSwgYW5kIHdlIGNhbiBwdXQgaXQgaW4gdGhlIGdsb2JhbCB0eXBlIGJsb2NrLgotICAgICBGSVhNRTogV2Ugc2hvdWxkIGF2b2lkIG91dHB1dHRpbmcgZHVwbGljYXRlIGRlZmluaXRpb25zIHdoaWNoIGFyZQotICAgICB0aGUgc2FtZS4gICovCi0gIGlmICghIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHN0YXJ0ZWQgdGhlIGdsb2JhbCB0eXBlIGJsb2NrLiAgKi8KLSAgICAgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcGIgPSAmaW5mby0+Z2xvYmFsX3R5cGVzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHN0YXJ0ZWQgdGhlIHR5cGVzIGJsb2NrLiAgKi8KLSAgICAgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcGIgPSAmaW5mby0+dHlwZXM7Ci0gICAgfQotCi0gIC8qIEFwcGVuZCB0aGUgc3RydWN0IGRlZmluaXRpb24gdG8gdGhlIHR5cGVzLiAgKi8KLSAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCBwYiwgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMZWF2ZSB0aGUgc3RydWN0IG9uIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBjbGFzcyB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfY2xhc3NfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSwgdnB0ciwgb3dudnB0cikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHZwdHI7Ci0gICAgIGJvb2xlYW4gb3dudnB0cjsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjb25zdCBjaGFyICp2Y2xhc3M7Ci0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgcG1pc2NidWY7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBzdHJ1Y3QgaWVlZV90eXBlX2NsYXNzICpjbGFzc2RlZjsKLQotICAvKiBBIEMrKyBjbGFzcyBpcyBvdXRwdXQgYXMgYSBDKysgc3RydWN0IGFsb25nIHdpdGggYSBzZXQgb2YgcG1pc2MKLSAgICAgcmVjb3JkcyBkZXNjcmliaW5nIHRoZSBjbGFzcy4gICovCi0KLSAgLyogV2UgbmVlZCB0byBoYXZlIGEgbmFtZSBzbyB0aGF0IHdlIGNhbiBhc3NvY2lhdGUgdGhlIHN0cnVjdCBhbmQKLSAgICAgdGhlIGNsYXNzLiAgKi8KLSAgaWYgKHRhZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnQ7Ci0KLSAgICAgIHQgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gICAgICBzcHJpbnRmICh0LCAiX19hbm9uJXUiLCBpZCk7Ci0gICAgICB0YWcgPSB0OwotICAgIH0KLQotICAvKiBXZSBjYW4ndCB3cml0ZSBvdXQgdGhlIHZpcnR1YWwgdGFibGUgaW5mb3JtYXRpb24gdW50aWwgd2UgaGF2ZQotICAgICBmaW5pc2hlZCB0aGUgY2xhc3MsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgdmlydHVhbCB0YWJsZSBzaXplLgotICAgICBXZSBnZXQgdGhlIHNpemUgZnJvbSB0aGUgbGFyZ2VzdCB2b2Zmc2V0IHdlIHNlZS4gICovCi0gIHZjbGFzcyA9IE5VTEw7Ci0gIGlmICh2cHRyICYmICEgb3dudnB0cikKLSAgICB7Ci0gICAgICB2Y2xhc3MgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWU7Ci0gICAgICBhc3NlcnQgKHZjbGFzcyAhPSBOVUxMKTsKLSAgICAgIC8qIFdlIGRvbid0IGNhbGwgaWVlZV9wb3BfdW51c2VkX3R5cGUsIHNpbmNlIHRoZSBjbGFzcyBzaG91bGQKLSAgICAgICAgIGdldCBkZWZpbmVkLiAgKi8KLSAgICAgICh2b2lkKSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0gICsraW5mby0+bmFtZV9pbmR4OwotCi0gIC8qIFdlIHdyaXRlIG91dCBwbWlzYyByZWNvcmRzIGludG8gdGhlIGNsYXNzZGVmIGZpZWxkLiAgV2Ugd2lsbAotICAgICB3cml0ZSBvdXQgdGhlIHBtaXNjIHN0YXJ0IGFmdGVyIHdlIGtub3cgdGhlIG51bWJlciBvZiByZWNvcmRzIHdlCi0gICAgIG5lZWQuICAqLwotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmcG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJnBtaXNjYnVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgaW5keCwgJ1QnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgaW5keCwgc3RydWN0cCA/ICdvJyA6ICd1JykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgaW5keCwgdGFnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY2xhc3NkZWYgPSAoc3RydWN0IGllZWVfdHlwZV9jbGFzcyAqKSB4bWFsbG9jIChzaXplb2YgKmNsYXNzZGVmKTsKLSAgbWVtc2V0IChjbGFzc2RlZiwgMCwgc2l6ZW9mICpjbGFzc2RlZik7Ci0KLSAgY2xhc3NkZWYtPmluZHggPSBpbmR4OwotICBjbGFzc2RlZi0+cG1pc2NidWYgPSBwbWlzY2J1ZjsKLSAgY2xhc3NkZWYtPnBtaXNjY291bnQgPSAzOwotICBjbGFzc2RlZi0+dmNsYXNzID0gdmNsYXNzOwotICBjbGFzc2RlZi0+b3dudnB0ciA9IG93bnZwdHI7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiA9IGNsYXNzZGVmOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgbWVtYmVyIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19zdGF0aWNfbWVtYmVyIChwLCBuYW1lLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0gIHVuc2lnbmVkIGludCBuaW5keDsKLQotICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSB0eXBlLiAgSG9wZWZ1bGx5IHRoZXJlIHdpbGwgYmUgYSBjYWxsIHRvCi0gICAgIGllZWVfdmFyaWFibGUgZGVjbGFyaW5nIHRoZSBwaHlzaWNhbCBuYW1lIGFuZCB0aGUgdHlwZSwgc2luY2UKLSAgICAgdGhhdCBpcyB3aGVyZSBhbiBJRUVFIGNvbnN1bWVyIG11c3QgZ2V0IHRoZSB0eXBlLiAgKi8KLSAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwpOwotCi0gIGZsYWdzID0gaWVlZV92aXNfdG9fZmxhZ3MgKHZpc2liaWxpdHkpOwotICBmbGFncyB8PSBDWFhGTEFHU19TVEFUSUM7Ci0KLSAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdkJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCBmbGFncykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBwaHlzbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGJhc2UgY2xhc3MgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX2Jhc2VjbGFzcyAocCwgYml0cG9zLCB2aXJ0dWFsLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgY29uc3QgY2hhciAqYm5hbWU7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgYmluZHg7Ci0gIGNoYXIgKmZuYW1lOwotICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0gIHVuc2lnbmVkIGludCBuaW5keDsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPm5leHQgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMCi0JICAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPm5leHQtPnR5cGUuc3RyZGVmKSk7Ci0KLSAgYm5hbWUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWU7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBiaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIFdlIGFyZSBjdXJyZW50bHkgZGVmaW5pbmcgYm90aCBhIHN0cnVjdCBhbmQgYSBjbGFzcy4gIFdlIG11c3QKLSAgICAgd3JpdGUgb3V0IGEgZmllbGQgZGVmaW5pdGlvbiBpbiB0aGUgc3RydWN0IHdoaWNoIGhvbGRzIHRoZSBiYXNlCi0gICAgIGNsYXNzLiAgVGhlIHN0YWJzIGRlYnVnZ2luZyByZWFkZXIgd2lsbCBjcmVhdGUgYSBmaWVsZCBuYW1lZAotICAgICBfdmIkQ0xBU1MgZm9yIGEgdmlydHVhbCBiYXNlIGNsYXNzLCBzbyB3ZSBqdXN0IHVzZSB0aGF0LiAgRklYTUU6Ci0gICAgIHdlIHNob3VsZCBub3QgZGVwZW5kIHVwb24gYSBkZXRhaWwgb2Ygc3RhYnMgZGVidWdnaW5nLiAgKi8KLSAgaWYgKHZpcnR1YWwpCi0gICAgewotICAgICAgZm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGJuYW1lKSArIHNpemVvZiAiX3ZiJCIpOwotICAgICAgc3ByaW50ZiAoZm5hbWUsICJfdmIkJXMiLCBibmFtZSk7Ci0gICAgICBmbGFncyA9IEJBU0VGTEFHU19WSVJUVUFMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChsb2NhbHApCi0JaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHAgPSB0cnVlOwotCi0gICAgICBmbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYm5hbWUpICsgc2l6ZW9mICJfYiQiKTsKLSAgICAgIHNwcmludGYgKGZuYW1lLCAiX2IkJXMiLCBibmFtZSk7Ci0KLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBmbmFtZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGJpbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYml0cG9zIC8gOCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZmxhZ3MgPSAwOwotICAgIH0KLQotICBpZiAodmlzaWJpbGl0eSA9PSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEUpCi0gICAgZmxhZ3MgfD0gQkFTRUZMQUdTX1BSSVZBVEU7Ci0KLSAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdiJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCBmbGFncykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGJuYW1lKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBmbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDU7Ci0KLSAgZnJlZSAoZm5hbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBidWlsZGluZyBhIG1ldGhvZCBmb3IgYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX3N0YXJ0X21ldGhvZCAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgPT0gTlVMTCk7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kID0gbmFtZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVmaW5lIGEgbmV3IG1ldGhvZCB2YXJpYW50LCBlaXRoZXIgc3RhdGljIG9yIG5vdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX21ldGhvZF92YXIgKGluZm8sIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBzdGF0aWNwLCBjb25zdHAsCi0JCSAgICAgICB2b2xhdGlsZXAsIHZvZmZzZXQsIGNvbnRleHQpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIHN0YXRpY3A7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLSAgICAgYmZkX3ZtYSB2b2Zmc2V0OwotICAgICBib29sZWFuIGNvbnRleHQ7Ci17Ci0gIHVuc2lnbmVkIGludCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotICBib29sZWFuIHZpcnR1YWw7Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kLiAgQW4gSUVFRSBjb25zdW1lciB3aGljaAotICAgICB3YW50cyB0aGUgdHlwZSBtdXN0IHRyYWNrIGRvd24gdGhlIGZ1bmN0aW9uIGJ5IHRoZSBwaHlzaWNhbCBuYW1lCi0gICAgIGFuZCBnZXQgdGhlIHR5cGUgZnJvbSB0aGF0LiAgKi8KLSAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCi0gIC8qIFdlIGRvbid0IHVzZSB0aGUgY29udGV4dC4gIEZJWE1FOiBXZSBwcm9iYWJseSBvdWdodCB0byB1c2UgaXQgdG8KLSAgICAgYWRqdXN0IHRoZSB2b2Zmc2V0IHNvbWVob3csIGJ1dCBJIGRvbid0IHJlYWxseSBrbm93IGhvdy4gICovCi0gIGlmIChjb250ZXh0KQotICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgIT0gTlVMTCk7Ci0KLSAgZmxhZ3MgPSBpZWVlX3Zpc190b19mbGFncyAodmlzaWJpbGl0eSk7Ci0KLSAgLyogRklYTUU6IFdlIG5ldmVyIHNldCBDWFhGTEFHU19PVkVSUklERSwgQ1hYRkxBR1NfT1BFUkFUT1IsCi0gICAgIENYWEZMQUdTX0NUT1JEVE9SLCBDWFhGTEFHU19DVE9SLCBvciBDWFhGTEFHU19JTkxJTkUuICAqLwotCi0gIGlmIChzdGF0aWNwKQotICAgIGZsYWdzIHw9IENYWEZMQUdTX1NUQVRJQzsKLSAgaWYgKGNvbnN0cCkKLSAgICBmbGFncyB8PSBDWFhGTEFHU19DT05TVDsKLSAgaWYgKHZvbGF0aWxlcCkKLSAgICBmbGFncyB8PSBDWFhGTEFHU19WT0xBVElMRTsKLQotICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0KLSAgdmlydHVhbCA9IGNvbnRleHQgfHwgdm9mZnNldCA+IDA7Ci0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLAotCQkJICAgICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCB2aXJ0dWFsID8gJ3YnIDogJ20nKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwKLQkJCSAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgcGh5c25hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmlydHVhbCkKLSAgICB7Ci0gICAgICBpZiAodm9mZnNldCA+IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZvZmZzZXQpCi0JaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dm9mZnNldCA9IHZvZmZzZXQ7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIHZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgICsraW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudDsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCArPSA1OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZWZpbmUgYSBuZXcgbWV0aG9kIHZhcmlhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwLAotCQkJICAgdm9mZnNldCwgY29udGV4dCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBpZWVlX2NsYXNzX21ldGhvZF92YXIgKGluZm8sIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBmYWxzZSwgY29uc3RwLAotCQkJCXZvbGF0aWxlcCwgdm9mZnNldCwgY29udGV4dCk7Ci19Ci0KLS8qIERlZmluZSBhIG5ldyBzdGF0aWMgbWV0aG9kIHZhcmlhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIGllZWVfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIHRydWUsIGNvbnN0cCwKLQkJCQl2b2xhdGlsZXAsIDAsIGZhbHNlKTsKLX0KLQotLyogRmluaXNoIHVwIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3NfZW5kX21ldGhvZCAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgIT0gTlVMTCk7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfY2xhc3NfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwpOwotCi0gIC8qIElmIHdlIHdlcmUgaWdub3JpbmcgdGhpcyBjbGFzcyBkZWZpbml0aW9uIGJlY2F1c2UgaXQgd2FzIGEKLSAgICAgZHVwbGljYXRlIGRlZmluaXRpb24sIGp1c3QgdGhyb3VnaCBhd2F5IHdoYXRldmVyIGJ5dGVzIHdlIGhhdmUKLSAgICAgYWNjdW11bGF0ZWQuICBMZWF2ZSB0aGUgdHlwZSBvbiB0aGUgc3RhY2suICAqLwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pZ25vcmVwKQotICAgIHJldHVybiB0cnVlOwotCi0gIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLQotICAvKiBJZiB3ZSBoYXZlIGEgdmlydHVhbCB0YWJsZSwgd2UgY2FuIHdyaXRlIG91dCB0aGUgaW5mb3JtYXRpb24gbm93LiAgKi8KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZjbGFzcyAhPSBOVUxMCi0gICAgICB8fCBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5vd252cHRyKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywKLQkJCQkmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ3onKQotCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwKLQkJCSAgICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52b2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+b3dudnB0cikKLQl7Ci0JICBpZiAoISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LAotCQkJCSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dmNsYXNzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCArPSA1OwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBudW1iZXIgb2YgcG1pc2MgcmVjb3Jkcywgd2UgY2FuIHdyaXRlIG91dAotICAgICB0aGUgYXRuNjIgd2hpY2ggc3RhcnRzIHRoZSBwbWlzYyByZWNvcmRzLCBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlCi0gICAgIEMrKyBidWZmZXJzLiAgKi8KLQotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDYyKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLAotCQkJICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCwKLQkJCSAgICAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cmVmcykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4LAotCQkJCSZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5yZWZzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiBpZWVlX2VuZF9zdHJ1Y3RfdHlwZSAocCk7Ci19Ci0KLS8qIFB1c2ggYSBwcmV2aW91c2x5IHNlZW4gdHlwZWRlZiBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdHlwZWRlZl90eXBlIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlICpudDsKLQotICBoID0gaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAgKCZpbmZvLT50eXBlZGVmcywgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotICAvKiBoIHNob3VsZCBuZXZlciBiZSBOVUxMLCBzaW5jZSB0aGF0IHdvdWxkIGltcGx5IHRoYXQgdGhlIGdlbmVyaWMKLSAgICAgZGVidWdnaW5nIGNvZGUgaGFzIGFza2VkIGZvciBhIHR5cGVkZWYgd2hpY2ggaXQgaGFzIG5vdCB5ZXQKLSAgICAgZGVmaW5lZC4gICovCi0gIGFzc2VydCAoaCAhPSBOVUxMKTsKLQotICAvKiBXZSBhbHdheXMgdXNlIHRoZSBtb3N0IHJlY2VudGx5IGRlZmluZWQgdHlwZSBmb3IgdGhpcyBuYW1lLCB3aGljaAotICAgICB3aWxsIGJlIHRoZSBmaXJzdCBvbmUgb24gdGhlIGxpc3QuICAqLwotCi0gIG50ID0gaC0+dHlwZXM7Ci0gIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCBudC0+dHlwZS5pbmR4LCBudC0+dHlwZS5zaXplLAotCQkJbnQtPnR5cGUudW5zaWduZWRwLCBudC0+dHlwZS5sb2NhbHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDb3B5IG92ZXIgYW55IG90aGVyIHR5cGUgaW5mb3JtYXRpb24gd2UgbWF5IGhhdmUuICAqLwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlID0gbnQtPnR5cGU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSB0YWdnZWQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdGFnX3R5cGUgKHAsIG5hbWUsIGlkLCBraW5kKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICBib29sZWFuIGNvcHk7Ci0gIGNoYXIgYWJbMjBdOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlICpudDsKLQotICBpZiAoa2luZCA9PSBERUJVR19LSU5EX0VOVU0pCi0gICAgewotICAgICAgc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICplOwotCi0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCWFib3J0ICgpOwotICAgICAgZm9yIChlID0gaW5mby0+ZW51bXM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0JaWYgKGUtPnRhZyAhPSBOVUxMICYmIHN0cmNtcCAoZS0+dGFnLCBuYW1lKSA9PSAwKQotCSAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBlLT5pbmR4LCAwLCB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgIGUgPSAoc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICopIHhtYWxsb2MgKHNpemVvZiAqZSk7Ci0gICAgICBtZW1zZXQgKGUsIDAsIHNpemVvZiAqZSk7Ci0KLSAgICAgIGUtPmluZHggPSBpbmZvLT50eXBlX2luZHg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5keDsKLSAgICAgIGUtPnRhZyA9IG5hbWU7Ci0gICAgICBlLT5kZWZpbmVkID0gZmFsc2U7Ci0KLSAgICAgIGUtPm5leHQgPSBpbmZvLT5lbnVtczsKLSAgICAgIGluZm8tPmVudW1zID0gZTsKLQotICAgICAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBlLT5pbmR4LCAwLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gIGxvY2FscCA9IGZhbHNlOwotCi0gIGNvcHkgPSBmYWxzZTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChhYiwgIl9fYW5vbiV1IiwgaWQpOwotICAgICAgbmFtZSA9IGFiOwotICAgICAgY29weSA9IHRydWU7Ci0gICAgfQotCi0gIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnRhZ3MsIG5hbWUsIHRydWUsIGNvcHkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKG50ID0gaC0+dHlwZXM7IG50ICE9IE5VTEw7IG50ID0gbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKG50LT5pZCA9PSBpZCkKLQl7Ci0JICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbnQtPnR5cGUuaW5keCwgbnQtPnR5cGUuc2l6ZSwKLQkJCQludC0+dHlwZS51bnNpZ25lZHAsIG50LT50eXBlLmxvY2FscCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIENvcHkgb3ZlciBhbnkgb3RoZXIgdHlwZSBpbmZvcm1hdGlvbiB3ZSBtYXkgaGF2ZS4gICovCi0JICBpbmZvLT50eXBlX3N0YWNrLT50eXBlID0gbnQtPnR5cGU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmICghIG50LT50eXBlLmxvY2FscCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIGEgZ2xvYmFsIHR5cGUsIHNvIGl0IG11c3QgYmUKLSAgICAgICAgICAgICBsb2NhbC4gKi8KLQkgIGxvY2FscCA9IHRydWU7Ci0JfQotICAgIH0KLQotICBudCA9IChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpudCk7Ci0gIG1lbXNldCAobnQsIDAsIHNpemVvZiAqbnQpOwotCi0gIG50LT5pZCA9IGlkOwotICBudC0+dHlwZS5uYW1lID0gaC0+cm9vdC5zdHJpbmc7Ci0gIG50LT50eXBlLmluZHggPSBpbmZvLT50eXBlX2luZHg7Ci0gIG50LT50eXBlLmxvY2FscCA9IGxvY2FscDsKLSAgKytpbmZvLT50eXBlX2luZHg7Ci0gIG50LT5raW5kID0ga2luZDsKLQotICBudC0+bmV4dCA9IGgtPnR5cGVzOwotICBoLT50eXBlcyA9IG50OwotCi0gIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCBudC0+dHlwZS5pbmR4LCAwLCBmYWxzZSwgbG9jYWxwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lID0gaC0+cm9vdC5zdHJpbmc7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHR5cGVkZWYuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90eXBkZWYgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlICpudDsKLQotICB0eXBlID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZTsKLSAgaW5keCA9IHR5cGUuaW5keDsKLQotICAvKiBJZiB0aGlzIGlzIGEgc2ltcGxlIGJ1aWx0aW4gdHlwZSB1c2luZyBhIGJ1aWx0aW4gbmFtZSwgd2UgZG9uJ3QKLSAgICAgd2FudCB0byBvdXRwdXQgdGhlIHR5cGVkZWYgaXRzZWxmLiAgV2UgYWxzbyB3YW50IHRvIGNoYW5nZSB0aGUKLSAgICAgdHlwZSBpbmRleCB0byBjb3JyZXNwb25kIHRvIHRoZSBuYW1lIGJlaW5nIHVzZWQuICBXZSByZWNvZ25pemUKLSAgICAgbmFtZXMgdXNlZCBpbiBzdGFicyBkZWJ1Z2dpbmcgb3V0cHV0IGV2ZW4gaWYgdGhleSBkb24ndCBleGFjdGx5Ci0gICAgIGNvcnJlc3BvbmQgdG8gdGhlIG5hbWVzIHVzZWQgZm9yIHRoZSBJRUVFIGJ1aWx0aW4gdHlwZXMuICAqLwotICBmb3VuZCA9IGZhbHNlOwotICBpZiAoaW5keCA8PSAodW5zaWduZWQgaW50KSBidWlsdGluX2JjZF9mbG9hdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKChlbnVtIGJ1aWx0aW5fdHlwZXMpIGluZHgpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl92b2lkOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInZvaWQiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9zaWduZWRfY2hhcjoKLQljYXNlIGJ1aWx0aW5fY2hhcjoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJzaWduZWQgY2hhciIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9zaWduZWRfY2hhcjsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImNoYXIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fY2hhcjsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3Vuc2lnbmVkX2NoYXI6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgY2hhciIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3NpZ25lZF9zaG9ydF9pbnQ6Ci0JY2FzZSBidWlsdGluX3Nob3J0OgotCWNhc2UgYnVpbHRpbl9zaG9ydF9pbnQ6Ci0JY2FzZSBidWlsdGluX3NpZ25lZF9zaG9ydDoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJzaWduZWQgc2hvcnQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3NpZ25lZF9zaG9ydF9pbnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzaG9ydCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9zaG9ydDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNob3J0IGludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9zaG9ydF9pbnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzaWduZWQgc2hvcnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2lnbmVkX3Nob3J0OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50OgotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9zaG9ydDoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBzaG9ydCBpbnQiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCAic2hvcnQgdW5zaWduZWQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0X2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIHNob3J0IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fc2lnbmVkX2xvbmc6Ci0JY2FzZSBidWlsdGluX2ludDogLyogRklYTUU6IFNpemUgZGVwZW5kcyB1cG9uIGFyY2hpdGVjdHVyZS4gICovCi0JY2FzZSBidWlsdGluX2xvbmc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIGxvbmciKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fc2lnbmVkX2xvbmc7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5faW50OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibG9uZyIpID09IDAKLQkJICAgfHwgc3RyY21wIChuYW1lLCAibG9uZyBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fbG9uZzsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3Vuc2lnbmVkX2xvbmc6Ci0JY2FzZSBidWlsdGluX3Vuc2lnbmVkOiAvKiBGSVhNRTogU2l6ZSBkZXBlbmRzIHVwb24gYXJjaGl0ZWN0dXJlLiAgKi8KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfaW50OiAvKiBGSVhNRTogTGlrZSBidWlsdGluX3Vuc2lnbmVkLiAgKi8KLQkgIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBsb25nIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgImxvbmcgdW5zaWduZWQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkX2xvbmc7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl91bnNpZ25lZDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl91bnNpZ25lZF9pbnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBsb25nIGxvbmciKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCAibG9uZyBsb25nIGludCIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3Vuc2lnbmVkX2xvbmdfbG9uZzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBsb25nIGxvbmciKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCAibG9uZyBsb25nIHVuc2lnbmVkIGludCIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX2Zsb2F0OgotCSAgaWYgKHN0cmNtcCAobmFtZSwgImZsb2F0IikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fZG91YmxlOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgImRvdWJsZSIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX2xvbmdfZG91YmxlOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgImxvbmcgZG91YmxlIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZToKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJsb25nIGxvbmcgZG91YmxlIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoZm91bmQpCi0JdHlwZS5pbmR4ID0gaW5keDsKLSAgICB9Ci0KLSAgaCA9IGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwICgmaW5mby0+dHlwZWRlZnMsIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBkZWZpbmVkIHRoaXMgdHlwZSB3aXRoIHRoaXMgbmFtZS4gICovCi0gIGxvY2FscCA9IHR5cGUubG9jYWxwOwotICBmb3IgKG50ID0gaC0+dHlwZXM7IG50ICE9IE5VTEw7IG50ID0gbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKG50LT5pZCA9PSBpbmR4KQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgZGVmaW5pdGlvbiwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvCi0JICAgICBkbyBhbnl0aGluZyBoZXJlLiAgKi8KLQkgIGlmICghIG50LT50eXBlLmxvY2FscCkKLQkgICAgewotCSAgICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlIGRlZmluaXRpb24sIHNvIG1ha2UgdGhpcyBvbmUgbG9jYWwuICAqLwotCSAgbG9jYWxwID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gYWRkIGEgbmV3IHR5cGVkZWYgZm9yIHRoaXMgdHlwZS4gICovCi0KLSAgbnQgPSAoc3RydWN0IGllZWVfbmFtZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbnQpOwotICBtZW1zZXQgKG50LCAwLCBzaXplb2YgKm50KTsKLSAgbnQtPmlkID0gaW5keDsKLSAgbnQtPnR5cGUgPSB0eXBlOwotICBudC0+dHlwZS5uYW1lID0gbmFtZTsKLSAgbnQtPnR5cGUubG9jYWxwID0gbG9jYWxwOwotICBudC0+a2luZCA9IERFQlVHX0tJTkRfSUxMRUdBTDsKLQotICBudC0+bmV4dCA9IGgtPnR5cGVzOwotICBoLT50eXBlcyA9IG50OwotCi0gIGlmIChmb3VuZCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIG9uZSBvZiB0aGUgYnVpbHRpbiB0eXBlZGVmcywgc28gd2UgZG9uJ3QgbmVlZCB0bwotICAgICAgICAgYWN0dWFsbHkgZGVmaW5lIGl0LiAgKi8KLSAgICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgbmFtZSwgKHVuc2lnbmVkIGludCkgLTEsIHR5cGUuc2l6ZSwKLQkJCQl0eXBlLnVuc2lnbmVkcCwJbG9jYWxwLAotCQkJCShzdHJ1Y3QgaWVlZV9idWZsaXN0ICopIE5VTEwpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnVCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVtb3ZlIHRoZSB0eXBlIHdlIGp1c3QgYWRkZWQgdG8gdGhlIHR5cGUgc3RhY2suICBUaGlzIHNob3VsZCBub3QKLSAgICAgYmUgaWVlZV9wb3BfdW51c2VkX3R5cGUsIHNpbmNlIHRoZSB0eXBlIGlzIHVzZWQsIHdlIGp1c3QgZG9uJ3QKLSAgICAgbmVlZCBpdCBub3cuICAqLwotICAodm9pZCkgaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHRhZyBmb3IgYSB0eXBlLiAgV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdGFnIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogVGhpcyBzaG91bGQgbm90IGJlIGllZWVfcG9wX3VudXNlZF90eXBlLCBzaW5jZSB3ZSB3YW50IHRoZSB0eXBlCi0gICAgIHRvIGJlIGRlZmluZWQuICAqLwotICAodm9pZCkgaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYW4gaW50ZWdlciBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgdmFsIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkb3VibGUgdmFsIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSB2YWwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIC8qIEZJWE1FLiAgKi8KLSAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV92YXJpYWJsZSAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgbmFtZV9pbmR4OwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYm9vbGVhbiByZWZlcmVuY2VwOwotICB1bnNpZ25lZCBpbnQgdHlwZV9pbmR4OwotICBib29sZWFuIGFzbjsKLSAgaW50IHJlZmZsYWc7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgcmVmZXJlbmNlcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcDsKLSAgdHlwZV9pbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYXNzZXJ0ICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKTsKLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgLyogV3JpdGUgb3V0IGFuIE5OIGFuZCBhbiBBVE4gcmVjb3JkIGZvciB0aGlzIHZhcmlhYmxlLiAgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgbmFtZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdHlwZV9pbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgREVCVUdfR0xPQkFMOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgpCi0JICB8fCAhIGllZWVfYWRkX3JhbmdlIChpbmZvLCBmYWxzZSwgdmFsLCB2YWwgKyBzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMDsKLSAgICAgIGFzbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1NUQVRJQzoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAzKQotCSAgfHwgISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgZmFsc2UsIHZhbCwgdmFsICsgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVmZmxhZyA9IDE7Ci0gICAgICBhc24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19MT0NBTF9TVEFUSUM6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKLQkgIHx8ICEgaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCB2YWwsIHZhbCArIHNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlZmZsYWcgPSAyOwotICAgICAgYXNuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfTE9DQUw6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHZhbCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVmZmxhZyA9IDI7Ci0gICAgICBhc24gPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfUkVHSVNURVI6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sCi0JCQkJICBpZWVlX2dlbnJlZ190b19yZWdubyAoaW5mby0+YWJmZCwgdmFsKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVmZmxhZyA9IDI7Ci0gICAgICBhc24gPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoYXNuKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuYW1lX2luZHgsIHZhbCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIHJlYWxseSBhIHJlZmVyZW5jZSB0eXBlLCB0aGVuIHdlIGp1c3Qgb3V0cHV0IGl0IHdpdGgKLSAgICAgcG9pbnRlciB0eXBlLCBhbmQgbXVzdCBub3cgb3V0cHV0IGEgQysrIHJlY29yZCBpbmRpY2F0aW5nIHRoYXQgaXQKLSAgICAgaXMgcmVhbGx5IHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgaWYgKHJlZmVyZW5jZXApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gICAgICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlLCB3ZSB3YW50IHRvIG91dHB1dCB0aGUgbWlzYwotICAgICAgICAgcmVjb3JkIGluIHRoZSBDKysgbWlzYyByZWNvcmQgYmxvY2suICBPdGhlcndpc2UsIHdlIHdhbnQgdG8KLSAgICAgICAgIG91dHB1dCBpdCBqdXN0IGFmdGVyIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uLCB3aGljaCBpcyB3aGVyZQotICAgICAgICAgdGhlIGN1cnJlbnQgYnVmZmVyIGlzLiAgKi8KLSAgICAgIGlmIChyZWZmbGFnICE9IDIpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4MCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDMpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ1InKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIHJlZmZsYWcpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBvdXRwdXR0aW5nIGluZm9ybWF0aW9uIGZvciBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfZnVuY3Rpb24gKHAsIG5hbWUsIGdsb2JhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJvb2xlYW4gZ2xvYmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gcmVmZXJlbmNlcDsKLSAgdW5zaWduZWQgaW50IHJldGluZHgsIHR5cGVpbmR4OwotCi0gIHJlZmVyZW5jZXAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXA7Ci0gIHJldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBCZXNpZGVzIHJlY29yZGluZyBhIEJCNCBvciBCQjYgYmxvY2ssIHdlIHJlY29yZCB0aGUgdHlwZSBvZiB0aGUKLSAgICAgZnVuY3Rpb24gaW4gdGhlIEJCMSB0eXBlZGVmIGJsb2NrLiAgV2UgY2FuJ3Qgd3JpdGUgb3V0IHRoZSBmdWxsCi0gICAgIHR5cGUgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgcGFyYW1ldGVycywgc28gd2UgYWNjdW11bGF0ZSBpdAotICAgICBpbiBpbmZvLT5mbnR5cGUgYW5kIGluZm8tPmZuYXJncy4gICovCi0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmZudHlwZSkpCi0gICAgewotICAgICAgLyogRklYTUU6IFRoaXMgbWlnaHQgaGFwcGVuIHNvbWVkYXkgaWYgd2Ugc3VwcG9ydCBuZXN0ZWQKLSAgICAgICAgIGZ1bmN0aW9ucy4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaW5mby0+Zm5uYW1lID0gbmFtZTsKLQotICAvKiBBbiBhdHRyaWJ1dGUgb2YgMHg0MCBtZWFucyB0aGF0IHRoZSBwdXNoIG1hc2sgaXMgdW5rbm93bi4gICovCi0gIGlmICghIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIG5hbWUsICh1bnNpZ25lZCBpbnQpIC0xLCAwLCBmYWxzZSwgdHJ1ZSwKLQkJCQkmaW5mby0+Zm50eXBlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ3gnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMHg0MCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgcmV0aW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHR5cGVpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmZuYXJncykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT5mbmFyZ2NvdW50ID0gMDsKLQotICAvKiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIGlzIGFjdHVhbGx5IGEgcmVmZXJlbmNlIHR5cGUsIHdlCi0gICAgIG11c3QgYWRkIGEgcmVjb3JkIGluZGljYXRpbmcgdGhhdC4gICovCi0gIGlmIChyZWZlcmVuY2VwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuaW5keDsKLQotICAgICAgbmluZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0gICAgICArK2luZm8tPm5hbWVfaW5keDsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4MCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDMpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ1InKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGdsb2JhbCA/IDAgOiAxKQotCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBhc3NlcnQgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpOwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGFkZHJlc3MgaXMgd3JpdHRlbiBvdXQgYXMgdGhlIGZpcnN0IGJsb2NrLiAgKi8KLQotICArK2luZm8tPmJsb2NrX2RlcHRoOwotCi0gIHJldHVybiAoaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBnbG9iYWwgPyA0IDogNikKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgJiYgaWVlZV93cml0ZV9pZCAoaW5mbywgbmFtZSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHR5cGVpbmR4KSk7Ci19Ci0KLS8qIEFkZCBhIGZ1bmN0aW9uIHBhcmFtZXRlci4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQgYmVmb3JlIHRoZQotICAgZmlyc3QgYmxvY2ssIHNvIHdlIHBvc3Rwb25lIHRoZW0gdW50aWwgd2Ugc2VlIHRoZSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Z1bmN0aW9uX3BhcmFtZXRlciAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICptLCAqKnBtOwotCi0gIGFzc2VydCAoaW5mby0+YmxvY2tfZGVwdGggPT0gMSk7Ci0KLSAgbSA9IChzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPm5leHQgPSBOVUxMOwotICBtLT5uYW1lID0gbmFtZTsKLSAgbS0+cmVmZXJlbmNlcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcDsKLSAgbS0+dHlwZSA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotICBtLT5raW5kID0ga2luZDsKLSAgbS0+dmFsID0gdmFsOwotCi0gIGZvciAocG0gPSAmaW5mby0+cGVuZGluZ19wYXJtczsgKnBtICE9IE5VTEw7IHBtID0gJigqcG0pLT5uZXh0KQotICAgIDsKLSAgKnBtID0gbTsKLQotICAvKiBBZGQgdGhlIHR5cGUgdG8gdGhlIGZuYXJncyBsaXN0LiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbS0+dHlwZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICArK2luZm8tPmZuYXJnY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7ICAKLX0KLQotLyogT3V0cHV0IHBlbmRpbmcgZnVuY3Rpb24gcGFyYW1ldGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX291dHB1dF9wZW5kaW5nX3Bhcm1zIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci17Ci0gIHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqbTsKLSAgdW5zaWduZWQgaW50IHJlZmNvdW50OwotCi0gIHJlZmNvdW50ID0gMDsKLSAgZm9yIChtID0gaW5mby0+cGVuZGluZ19wYXJtczsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLSAgICB7Ci0gICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIHZraW5kOwotCi0gICAgICBzd2l0Y2ggKG0tPmtpbmQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIERFQlVHX1BBUk1fU1RBQ0s6Ci0JY2FzZSBERUJVR19QQVJNX1JFRkVSRU5DRToKLQkgIHZraW5kID0gREVCVUdfTE9DQUw7Ci0JICBicmVhazsKLQljYXNlIERFQlVHX1BBUk1fUkVHOgotCWNhc2UgREVCVUdfUEFSTV9SRUZfUkVHOgotCSAgdmtpbmQgPSBERUJVR19SRUdJU1RFUjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPnR5cGUsIDAsIGZhbHNlLCBmYWxzZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwID0gbS0+cmVmZXJlbmNlcDsKLSAgICAgIGlmIChtLT5yZWZlcmVuY2VwKQotCSsrcmVmY291bnQ7Ci0gICAgICBpZiAoISBpZWVlX3ZhcmlhYmxlICgoUFRSKSBpbmZvLCBtLT5uYW1lLCB2a2luZCwgbS0+dmFsKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGFyZSBhbnkgcmVmZXJlbmNlIHBhcmFtZXRlcnMsIHdlIG5lZWQgdG8gb3V0cHV0IGEKLSAgICAgbWlzY2VsbGFuZW91cyByZWNvcmQgaW5kaWNhdGluZyB0aGVtLiAgKi8KLSAgaWYgKHJlZmNvdW50ID4gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmluZHgsIHZhcmluZHg7Ci0KLSAgICAgIC8qIEZJWE1FOiBUaGUgTVJJIGNvbXBpbGVyIG91dHB1dHMgdGhlIGRlbWFuZ2xlZCBmdW5jdGlvbiBuYW1lCi0gICAgICAgICBoZXJlLCBidXQgd2UgYXJlIG91dHB1dHRpbmcgdGhlIG1hbmdsZWQgbmFtZS4gICovCi0gICAgICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4MCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHJlZmNvdW50ICsgMykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnQicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBpbmZvLT5mbm5hbWUpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChtID0gaW5mby0+cGVuZGluZ19wYXJtcywgdmFyaW5keCA9IDE7Ci0JICAgbSAhPSBOVUxMOwotCSAgIG0gPSBtLT5uZXh0LCB2YXJpbmR4KyspCi0JewotCSAgaWYgKG0tPnJlZmVyZW5jZXApCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIHZhcmluZHgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIG0gPSBpbmZvLT5wZW5kaW5nX3Bhcm1zOwotICB3aGlsZSAobSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqbmV4dDsKLQotICAgICAgbmV4dCA9IG0tPm5leHQ7Ci0gICAgICBmcmVlIChtKTsKLSAgICAgIG0gPSBuZXh0OwotICAgIH0KLQotICBpbmZvLT5wZW5kaW5nX3Bhcm1zID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBibG9jay4gIElmIHRoaXMgaXMgdGhlIGZpcnN0IGJsb2NrLCB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MKLSAgIHRvIGZpbmlzaCB0aGUgQkI0IG9yIEJCNiwgYW5kIHRoZW4gb3V0cHV0IHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPmJsb2NrX2RlcHRoID09IDEpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGFkZHIpCi0JICB8fCAhIGllZWVfb3V0cHV0X3BlbmRpbmdfcGFybXMgKGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgNikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBhZGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfc3RhcnRfcmFuZ2UgKGluZm8sIGFkZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICArK2luZm8tPmJsb2NrX2RlcHRoOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbmQgYSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VuZF9ibG9jayAocCwgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIC8qIFRoZSBhZGRyZXNzIHdlIGFyZSBnaXZlbiBpcyB0aGUgZW5kIG9mIHRoZSBibG9jaywgYnV0IElFRUUgc2VlbXMKLSAgICAgdG8gd2FudCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBieXRlIGluIHRoZSBibG9jaywgc28gd2UKLSAgICAgc3VidHJhY3Qgb25lLiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYWRkciAtIDEpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpZWVlX2VuZF9yYW5nZSAoaW5mbywgYWRkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC0taW5mby0+YmxvY2tfZGVwdGg7Ci0KLSAgaWYgKGFkZHIgPiBpbmZvLT5oaWdoYWRkcikKLSAgICBpbmZvLT5oaWdoYWRkciA9IGFkZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX2Z1bmN0aW9uIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+YmxvY2tfZGVwdGggPT0gMSk7Ci0KLSAgLS1pbmZvLT5ibG9ja19kZXB0aDsKLQotICAvKiBOb3cgd2UgY2FuIGZpbmlzaCB1cCBmbnR5cGUsIGFuZCBhZGQgaXQgdG8gdGhlIHR5cGRlZiBzZWN0aW9uLgotICAgICBBdCB0aGlzIHBvaW50LCBmbnR5cGUgaXMgdGhlICd4JyB0eXBlIHVwIHRvIHRoZSBhcmd1bWVudCBjb3VudCwKLSAgICAgYW5kIGZuYXJncyBpcyB0aGUgYXJndW1lbnQgdHlwZXMuICBXZSBtdXN0IGFkZCB0aGUgYXJndW1lbnQKLSAgICAgY291bnQsIGFuZCB3ZSBtdXN0IGFkZCB0aGUgbGV2ZWwuICBGSVhNRTogV2UgZG9uJ3QgcmVjb3JkIHZhcmFyZ3MKLSAgICAgZnVuY3Rpb25zIGNvcnJlY3RseS4gIEluIGZhY3QsIHN0YWJzIGRlYnVnZ2luZyBkb2VzIG5vdCBnaXZlIHVzCi0gICAgIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkbyBzby4gICovCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmZudHlwZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmZuYXJnY291bnQpCi0gICAgICB8fCAhIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmZuYXJncykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIHR5cGRlZiBibG9jayBoYXMgYmVlbiBzdGFydGVkLiAgKi8KLSAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzLCAmaW5mby0+Zm50eXBlKQotICAgICAgfHwgISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcywgJmluZm8tPmZuYXJncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPmZubmFtZSA9IE5VTEw7Ci0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT5mbmFyZ3MpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+Zm5hcmdjb3VudCA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2xpbmVubyAocCwgZmlsZW5hbWUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5maWxlbmFtZSAhPSBOVUxMKTsKLQotICAvKiBUaGUgSFAgc2ltdWxhdG9yIHNlZW1zIHRvIGdldCBjb25mdXNlZCB3aGVuIG1vcmUgdGhhbiBvbmUgbGluZSBpcwotICAgICBsaXN0ZWQgZm9yIHRoZSBzYW1lIGFkZHJlc3MsIGF0IGxlYXN0IGlmIHRoZXkgYXJlIGluIGRpZmZlcmVudAotICAgICBmaWxlcy4gIFdlIGhhbmRsZSB0aGlzIGJ5IGFsd2F5cyBsaXN0aW5nIHRoZSBsYXN0IGxpbmUgZm9yIGEKLSAgICAgZ2l2ZW4gYWRkcmVzcywgc2luY2UgdGhhdCBzZWVtcyB0byBiZSB0aGUgb25lIHRoYXQgZ2RiIHVzZXMuICAqLwotICBpZiAoaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgYWRkciAhPSBpbmZvLT5wZW5kaW5nX2xpbmVub19hZGRyKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbGluZSBudW1iZXIgYmxvY2suICAqLwotICAgICAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+bGluZW5vcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+bGluZW5vcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5mby0+bGluZW5vX25hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLQkgICsraW5mby0+bmFtZV9pbmR4OwotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+bGluZW5vcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgNSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+ZmlsZW5hbWUpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGluZm8tPmxpbmVub19maWxlbmFtZSA9IGluZm8tPmZpbGVuYW1lOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUsIGluZm8tPmxpbmVub19maWxlbmFtZSkgIT0gMCkKLQl7Ci0JICBpZiAoc3RyY21wIChpbmZvLT5maWxlbmFtZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2Ugd2VyZSBub3QgaW4gdGhlIG1haW4gZmlsZS4gIENsb3NlIHRoZSBibG9jayBmb3IgdGhlCi0JCSBpbmNsdWRlZCBmaWxlLiAgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lKSA9PSAwKQotCQl7Ci0JCSAgLyogV2UgbmVlZCBhIG5ldyBOTiByZWNvcmQsIGFuZCB3ZSBhcmVuJ3QgYWJvdXQgdG8KLQkJICAgICBvdXRwdXQgb25lLiAgKi8KLQkJICBpbmZvLT5saW5lbm9fbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotCQkgICsraW5mby0+bmFtZV9pbmR4OwotCQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgpCi0JCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQkgIGlmIChzdHJjbXAgKGluZm8tPmZpbGVuYW1lLCBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSkgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBub3QgY2hhbmdpbmcgdG8gdGhlIG1haW4gZmlsZS4gIE9wZW4gYSBibG9jayBmb3IKLQkJIHRoZSBuZXcgaW5jbHVkZWQgZmlsZS4gICovCi0JICAgICAgaW5mby0+bGluZW5vX25hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLQkgICAgICArK2luZm8tPm5hbWVfaW5keDsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDUpCi0JCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGluZm8tPmxpbmVub19maWxlbmFtZSA9IGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lOwotCX0KLQotICAgICAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA3KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+cGVuZGluZ19saW5lbm8pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCwKLQkJCSAgICAgICBpbmZvLT5wZW5kaW5nX2xpbmVub19hZGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIGluZm8tPnBlbmRpbmdfbGluZW5vID0gbGluZW5vOwotICBpbmZvLT5wZW5kaW5nX2xpbmVub19hZGRyID0gYWRkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2lzLXJhbmxpYi5jIGIvYmludXRpbHMvaXMtcmFubGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZTcyYTQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvaXMtcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAncmFubGliJyAobm90ICdhcicpLiAqLwotCi1pbnQgaXNfcmFubGliID0gMTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2lzLXN0cmlwLmMgYi9iaW51dGlscy9pcy1zdHJpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTUzNDFhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2lzLXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIG9iamNvcHkubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdzdHJpcCcgKG5vdAotICAgJ29iamNvcHknKS4gKi8KLQotaW50IGlzX3N0cmlwID0gMTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21hYy1iaW51dGlscy5yIGIvYmludXRpbHMvbWFjLWJpbnV0aWxzLnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMWEzMDMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbWFjLWJpbnV0aWxzLnIKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSZXNvdXJjZXMgZm9yIEdOVSBiaW51dGlscy4gKi8KLQotI2luY2x1ZGUgIlN5c1R5cGVzLnIiCi0KLS8qIFZlcnNpb24gcmVzb3VyY2VzLiAqLwotCi1yZXNvdXJjZSAndmVycycgKDEpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQlWRVJTSU9OX1NUUklORyAgIiAoQykgMTk4Ni05NSBGU0YsIEluYy4iCi19OwotCi1yZXNvdXJjZSAndmVycycgKDIsIHB1cmdlYWJsZSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCSJiaW51dGlscyAiIFZFUlNJT05fU1RSSU5HICIgZm9yIE1QVyIKLX07Ci0KLSNpZmRlZiBXQU5UX0NGUkcKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotCXsKLQkJa1Bvd2VyUEMsCi0JCWtGdWxsTGliLAotCQlrTm9WZXJzaW9uTnVtLCBrTm9WZXJzaW9uTnVtLAotCQkwLDAsCi0JCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAotCQlQUk9HX05BTUUKLQl9Ci19OwotCi0jZW5kaWYgLyogV0FOVF9DRlJHICovCmRpZmYgLS1naXQgYS9iaW51dGlscy9tYWtlZmlsZS52bXMtaW4gYi9iaW51dGlscy9tYWtlZmlsZS52bXMtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDlkMWIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbWFrZWZpbGUudm1zLWluCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgYmludXRpbHMgdW5kZXIgb3BlblZNUyAoQWxwaGEgYW5kIFZheCkKLSMKLSMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcm1pLmRlCi0jCi0jCi0KLSMgRGlzdHJpYnV0aW9uIHZlcnNpb24sIGZpbGxlZCBpbiBieSBjb25maWd1cmUuY29tCi1WRVJTSU9OPUBWRVJTSU9OQAotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotVEFSR0VUPSIidm1zLWFscGhhIiIKLWVsc2UKLVRBUkdFVD0iInZtcy12YXgiIgotZW5kaWYKLQotaWZlcSAoJChDQyksZ2NjKQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSxbLS5iZmRdKSQoREVGUykKLURFRlM9L2RlZmluZT0oIlRBUkdFVD0kKFRBUkdFVCkiKQotTElCUz0sZ251X2NjX2xpYnJhcnk6bGliZ2NjL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliLGdudV9jY19saWJyYXJ5OmNydDAub2JqCi1lbHNlCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKVwKLS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxsb25nZXh0ZXJuKQotREVGUz0vZGVmaW5lPSgiVEFSR0VUPSQoVEFSR0VUKSIsImNvbnN0PSIsInVubGluaz1yZW1vdmUiKQotTElCUz0sc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotZW5kaWYKLQotQkZETElCID0gWy0uYmZkXWxpYmJmZC5vbGIvbGliCi1CRkRMSUJfREVQID0gWy0uYmZkXWxpYmJmZC5vbGIKLUxJQklCRVJUWV9ERVAgPSBbLS5saWJpYmVydHldbGliaWJlcnR5Lm9sYgotTElCSUJFUlRZID0gWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGIvbGliCi1PUENPREVTX0RFUCA9IFstLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGIKLU9QQ09ERVMgPSBbLS5vcGNvZGVzXWxpYm9wY29kZXMub2xiL2xpYgotCi1ERUJVR19PQkpTID0gcmRkYmcub2JqLGRlYnVnLm9iaixzdGFicy5vYmosaWVlZS5vYmoscmRjb2ZmLm9iagotCi1XUklURV9ERUJVR19PQkpTID0gJChERUJVR19PQkpTKSx3cnN0YWJzLm9iagotCi1CVUxJQlMgPSBbXWJ1Y29tbS5vYmosdmVyc2lvbi5vYmosZmlsZW1vZGUub2JqCi0KLUFERExfREVQUyA9ICQoQlVMSUJTKSwkKEJGRExJQl9ERVApLCQoTElCSUJFUlRZX0RFUCkKLUFERExfTElCUyA9ICQoQlVMSUJTKSwkKEJGRExJQiksJChMSUJJQkVSVFkpCi0KLVNJWkVPQkpTID0gJChBRERMX0RFUFMpLHNpemUub2JqCi0KLVNUUklOR1NPQkpTID0gJChBRERMX0RFUFMpLHN0cmluZ3Mub2JqCi0KLU5NT0JKUyA9ICQoQURETF9ERVBTKSxubS5vYmoKLQotT0JKRFVNUE9CSlMgPSAkKEFERExfREVQUyksb2JqZHVtcC5vYmoscHJkYmcub2JqLCQoREVCVUdfT0JKUyksJChPUENPREVTX0RFUCkKLQotYWxsOiBjb25maWcuaCBzaXplLmV4ZSBzdHJpbmdzLmV4ZSBvYmpkdW1wLmV4ZSBubS5leGUKLQotc2l6ZS5leGU6ICQoU0laRU9CSlMpCi0JbGluay9leGU9JEAgc2l6ZS5vYmosJChBRERMX0xJQlMpJChMSUJTKQotCi1zdHJpbmdzLmV4ZTogJChTVFJJTkdTT0JKUykKLQlsaW5rL2V4ZT0kQCBzdHJpbmdzLm9iaiwkKEFERExfTElCUykkKExJQlMpCi0KLW5tLmV4ZTogJChOTU9CSlMpCi0JbGluay9leGU9JEAgbm0ub2JqLCQoQURETF9MSUJTKSQoTElCUykKLQotb2JqZHVtcC5leGU6ICQoT0JKRFVNUE9CSlMpCi0JbGluay9leGU9JEAgb2JqZHVtcC5vYmoscHJkYmcub2JqLCQoREVCVUdfT0JKUyksJChCRkRMSUIpLCQoT1BDT0RFUyksJChBRERMX0xJQlMpJChMSUJTKQotCi0KLXZlcnNpb24ub2JqOiB2ZXJzaW9uLmMKLQkkKENDKSAkKENGTEFHUykvZGVmaW5lPShWRVJTSU9OPSIiIiQoVkVSU0lPTikiIiIpICQ8Ci0KLWNvbmZpZy5oOgotCSQkIEBjb25maWd1cmUKLQkkKE1BS0UpIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCi0KLVstLmJmZF1saWJiZmQub2xiOgotCSQoQ0QpIFstLmJmZF0KLQkkKE1BS0UpIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCi0JJChDRCkgWy0uYmludXRpbHNdCi0KLVstLmxpYmliZXJ0eV1saWJpYmVydHkub2xiOgotCSQoQ0QpIFstLmxpYmliZXJ0eV0KLQkkKE1BS0UpIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCi0JJChDRCkgWy0uYmludXRpbHNdCi0KLVstLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGI6Ci0JJChDRCkgWy0ub3Bjb2Rlc10KLQkkKE1BS0UpIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCi0JJChDRCkgWy0uYmludXRpbHNdCi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgKi5vYmo7Ci0JJChSTSkgKi5leGU7Ci0KLWRpc3RjbGVhbjogY2xlYW4KLQkkKFJNKSBjb25maWcuaDsKLQkkKFJNKSBtYWtlZmlsZS52bXM7CmRpZmYgLS1naXQgYS9iaW51dGlscy9tYXliZS1yYW5saWIuYyBiL2JpbnV0aWxzL21heWJlLXJhbmxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdiYzBmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL21heWJlLXJhbmxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0vKiBMaW5rZWQgd2l0aCBhci5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gZGVjaWRlcyBhdCBydW50aW1lCi0gICAodXNpbmcgYXJndlswXSBpZiBpdCBpcyBpcyAnYXInIG9yICdyYW5saWInLiAqLwotCi1pbnQgaXNfcmFubGliID0gLTE7CmRpZmYgLS1naXQgYS9iaW51dGlscy9tYXliZS1zdHJpcC5jIGIvYmludXRpbHMvbWF5YmUtc3RyaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ2N2M5OS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tYXliZS1zdHJpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0vKiBMaW5rZWQgd2l0aCBvYmpjb3B5Lm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBkZWNpZGVzIGF0IHJ1bnRpbWUKLSAgICh1c2luZyBhcmd2WzBdIGlmIGl0IGlzIGlzICdzdHJpcCcgb3IgJ29iamNvcHknLiAqLwotCi1pbnQgaXNfc3RyaXAgPSAtMTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21wdy1jb25maWcuaW4gYi9iaW51dGlscy9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWEwNjdkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIGJpbnV0aWxzLgotCi1TZXQgdGFyZ2V0X2FyY2ggYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy0uKi0uKi8vJ2AKLQotIyAoc2hvdWxkIGNhbm9uaWNhbGl6ZSBhcmNoIG5hbWUpICovCi0KLVNldCBhcmNobmFtZSBBUkNIX3t0YXJnZXRfYXJjaH0KLQotU2V0IHVuZGVyc2NvcmUgMAotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtaGl0YWNoaS1obXMvCi0JU2V0IHVuZGVyc2NvcmUgMQotRW5kIElmCi0KLUVjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJwkJCQkgPiAie299Im1rLnRtcAotRWNobyAiQVJDSERFRlMgPSAtZCIge2FyY2huYW1lfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAiVU5ERVJTQ09SRSA9ICIge3VuZGVyc2NvcmV9CQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkJVSUxEX05MTUNPTlYgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAiQlVJTERfU1JDT05WID0gIgkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gIlNZU0lORk9fUFJPRyA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJCVUlMRF9ETExUT09MID0gIgkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCQk+PiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCmRpZmYgLS1naXQgYS9iaW51dGlscy9tcHctbWFrZS5zZWQgYi9iaW51dGlscy9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWJmZmUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgYmludXRpbHMgVW5peCBtYWtlZmlsZSBpbnRvIE1QVyBzeW50YXguCi0KLSMgQWRkIGEgcnVsZS4KLS9eIyMjIyAuKi9hXAotXAotIntvfSJ1bmRlcnNjb3JlLmMubyBcXE9wdGlvbi1mICJ7b30idW5kZXJzY29yZS5jXAotCi0jIENvbW1lbnQgb3V0IGFueSBhbGlhcyBzZXR0aW5ncy4KLS9eaG9zdF9hbGlhcyA9L3MvXi8jLwotL150YXJnZXRfYWxpYXMgPS9zL14vIy8KLQotIyBXaGFjayBvdXQgdW51c2VkIGhvc3QgZGVmaW5lIGJpdHMuCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLQotIyBEb24ndCBidWlsZCBzcGVjaWFsaXplZCB0b29scy4KLS9CVUlMRF9OTE1DT05WL3MvQEJVSUxEX05MTUNPTlZALy8KLS9CVUlMRF9TUkNPTlYvcy9AQlVJTERfU1JDT05WQC8vCi0vQlVJTERfRExMVE9PTC9zL0BCVUlMRF9ETExUT09MQC8vCi0KLS9VTkRFUlNDT1JFL3MvQFVOREVSU0NPUkVAL3tVTkRFUlNDT1JFfS8KLQotIyBEb24ndCBuZWVkIHRoaXMuCi0vQEhMREZMQUdTQC9zL0BITERGTEFHU0AvLwotCi0jIFBvaW50IGF0IHRoZSBsaWJyYXJpZXMgZGlyZWN0bHkuCi0vQEJGRExJQkAvcy9AQkZETElCQC86OmJmZDpsaWJiZmQuby8KLS9AT1BDT0RFU0Avcy9AT1BDT0RFU0AvOjpvcGNvZGVzOmxpYm9wY29kZXMuby8KLQotIyBXaGFjayBvdXQgdGFyZ2V0IG1ha2VmaWxlIGZyYWdtZW50LgotL3RhcmdldF9tYWtlZmlsZV9mcmFnbWVudC9zL3RhcmdldF9tYWtlZmlsZV9mcmFnbWVudEAvLwotCi0jIEZpeCBhbmQgYWRkIHRvIHRoZSBpbmNsdWRlIHBhdGhzLgotL15JTkNMVURFUyA9IC4qJC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotL0JGRERJUi9zLy1pIHtCRkRESVJ9IC8taSAie0JGRERJUn0iOiAvCi0vSU5DRElSL3MvLWkge0lOQ0RJUn0gLy1pICJ7SU5DRElSfSI6IC8KLQotIyBVc2UgYnlhY2MgaW5zdGVhZCBvZiBiaXNvbiAoZm9yIG5vdyBhbnl3YXkpLgotL0JJU09OL3MvXkJJU09OID0uKiQvQklTT04gPSBieWFjYy8KLSMvQklTT05GTEFHUy9zL15CSVNPTkZMQUdTID0uKiQvQklTT05GTEFHUyA9IC8KLQotIyBFbWJlZCB0aGUgdmVyc2lvbiBpbiBzeW1ib2xpYyBkb3VibGVxdW90ZXMgdGhhdCB3aWxsIGV4cGFuZCB0bwotIyB0aGUgcmlnaHQgdGhpbmcgZm9yIGVhY2ggY29tcGlsZXIuCi0vVkVSU0lPTi9zLycie1ZFUlNJT059Iicve2RxfXtWRVJTSU9OfXtkcX0vCi0KLSMgJysnIGlzIGEgc3BlY2lhbCBjaGFyIHRvIE1QVywgZG9uJ3QgdXNlIGl0IGV2ZXIuCi0vYysrZmlsdC9zL2MrK2ZpbHQvY3BsdXNmaWx0LwotCi0jIEFsbCBvZiB0aGUgYmludXRpbHMgdXNlIHRoZSBzYW1lIFJleiBmaWxlLCBjaGFuZ2UgbmFtZXMgdG8gcmVmZXIgdG8gaXQuCi0vXntbQS1aXSpfUFJPR30vcy8kLyAie3N9Im1hYy1iaW51dGlscy5yLwotL3tbQS1aXSpfUFJPR31cLnIvcy97W0EtWl0qX1BST0d9XC5yL21hYy1iaW51dGlscy5yLwotCi0jIFRoZXJlIGFyZSBhdXRvLWdlbmVyYXRlZCByZWZlcmVuY2VzIHRvIEJGRCAuaCBmaWxlcyB0aGF0IGFyZSBub3QKLSMgaW4gdGhlIG9iamRpciAobGlrZSBiZmQuaCkgYnV0IGFyZSBpbiB0aGUgc291cmNlIGRpci4KLS86OmJmZDpsaWIvcy86OmJmZDpsaWJcKFthLXpdKlwpXC5oL3tCRkRESVJ9OmxpYlwxLmgvZwotCi0jIEZpeCB0aGUgbG9jYXRpb25zIG9mIGdlbmVyYXRlZCBmaWxlcy4KLS9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS9jb25maWcvcy9eY29uZmlnXC5oLyJ7b30iY29uZmlnXC5oLwotL3VuZGVyc2NvcmUvcy8ie3N9InVuZGVyc2NvcmVcLmMvIntvfSJ1bmRlcnNjb3JlLmMvZwotL3VuZGVyc2NvcmUvcy9edW5kZXJzY29yZVwuYy8ie299InVuZGVyc2NvcmVcLmMvCi0KLSMgRml4IHBhdGhzIHRvIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMuCi0vbGV4Lnl5LmMvcy8ie3N9ImxleFwueXlcLmMvIntvfSJsZXgueXkuYy9nCi0vbGV4Lnl5LmMvcy9ebGV4XC55eVwuYy8ie299ImxleC55eS5jLwotL2FybGV4LmMvcy8ie3N9ImFybGV4XC5jLyJ7b30iYXJsZXguYy9nCi0vYXJsZXguYy9zL15hcmxleFwuYy8ie299ImFybGV4LmMvCi0veS50YWIuYy9zLyJ7c30ieVwudGFiXC5jLyJ7b30ieS50YWIuYy9nCi0veS50YWIuYy9zL155XC50YWJcLmMvIntvfSJ5LnRhYi5jLwotL2FycGFyc2UuYy9zLyJ7c30iYXJwYXJzZVwuYy8ie299ImFycGFyc2UuYy9nCi0vYXJwYXJzZS5jL3MvXmFycGFyc2VcLmMvIntvfSJhcnBhcnNlLmMvCi0veS50YWIuaC9zLyJ7c30ieVwudGFiXC5oLyJ7b30ieS50YWIuaC9nCi0veS50YWIuaC9zL155XC50YWJcLmgvIntvfSJ5LnRhYi5oLwotL2FycGFyc2UuaC9zLyJ7c30iYXJwYXJzZVwuaC8ie299ImFycGFyc2UuaC9nCi0vYXJwYXJzZS5oL3MvXmFycGFyc2VcLmgvIntvfSJhcnBhcnNlLmgvCi0KLS8ie3N9IntJTkNESVJ9L3MvIntzfSJ7SU5DRElSfS8ie0lOQ0RJUn0iL2cKLQotIyBUaGUgZ2VuZXJhdGVkIGxleGVyIG1heSBpbmNsdWRlIGFuIGlmZGVmIGZvciBvbGRlciBNYWMgY29tcGlsZXJzIHRoYXQKLSMgbmVlZHMgdG8gd29yayB3aXRoIG5ld2VyIGNvbXBpbGVycyBhbHNvLgotL2xleC55eS5jL3MvUmVuYW1lIC15IFwoW14gXSpcKSBcKFteIF0qXCkkL3NlZCAtZSAncyxpZmRlZiBtYWNpbnRvc2gsaWYgZGVmaW5lZChtYWNpbnRvc2gpIHx8IGRlZmluZWQoX19NV0VSS1NfXyksJyBcMSA+IFwyLwotCi0jIEZpeCBhbiBvdmVyLWVhZ2VybmVzcy4KLS9lY2hvLipXQVJOSU5HLipUaGlzIGZpbGUvcy8nLionLycgJy8KLQotIyBBZGQgYSAic3RhbXBzIiB0YXJnZXQuCi0kYVwKLXN0YW1wcyBcXE9wdGlvbi1mIHN0YW1wLXVuZGVyXAotCi0vXmluc3RhbGwgXFxPcHRpb24tZiAvLC9eJC9jXAotaW5zdGFsbCBcXE9wdGlvbi1mICBhbGwgaW5zdGFsbC1vbmx5XAotXAotaW5zdGFsbC1vbmx5IFxcT3B0aW9uLWZcCi0JTmV3Rm9sZGVyUmVjdXJzaXZlICJ7YmluZGlyfSJcCi0JIyBOZWVkIHRvIGNvcHkgYWxsIHRoZSB0b29sc1wKLQlGb3IgcHJvZyBpbiB7UFJPR1N9XAotCQlTZXQgcHJvZ25hbWUgYGVjaG8ge3Byb2d9IHwgc2VkIC1lICdzLy5uZXcvLydgXAotCQlEdXBsaWNhdGUgLXkgOntwcm9nfSAie2JpbmRpcn0ie3Byb2duYW1lfVwKLQlFbmQgRm9yXAotCi0KLS90cnVlL3MvIDsgQHRydWUkLy8KLQotIyBkb3QgZmlsZXMgYXJlIHRyb3VibGUsIHJlbW92ZSB0aGVtIGFuZCB0aGVpciBhY3Rpb25zLgotL15cLmRlcC8sL14kL2QKLQotIyBSZW1vdmUgdW4tdXNlZnVsIHRhcmdldHMuCi0vXk1ha2VmaWxlIFxcT3B0aW9uLWYvLC9eJC9kCi0vXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi8sL14kL2QKLS9eY29uZmlnLnN0YXR1cyBcXE9wdGlvbi1mLywvXiQvZAotCi0jIERvbid0IHRyeSB0byBtYWtlIHRoZSBkZW1hbmdsZXIncyBtYW4gcGFnZSwgaXQncyB1c2VsZXNzLgotL157REVNQU5HTEVSX1BST0d9XC4xIFxcT3B0aW9uLWYvLC9eJC9kCi0jIERvbid0IGRlcGVuZCBvbiBpdCBlaXRoZXIuCi0ve0RFTUFOR0xFUl9QUk9HfS9zLyB7REVNQU5HTEVSX1BST0d9XC4xLy8KLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbmxtY29udi4xIGIvYmludXRpbHMvbmxtY29udi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMzYWVkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWNvbnYuMQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTk2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG5sbWNvbnYgMSAiTWFyY2ggMTk5NiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLW5sbWNvbnYgXC0gY29udmVydHMgb2JqZWN0IGNvZGUgaW50byBhbiBOTE0KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG5sbWNvbnYKLS5SQiAiW1x8IiBcLUlcIFxmSWJmZG5hbWVcZkJcIHxcIFwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1PXCBcZkliZmRuYW1lXGZCXCB8XCBcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVRcIFxmSWhlYWRlcmZpbGVcZkJcIHxcIFwtXC1oZWFkZXJcLWZpbGU9XGZJaGVhZGVyZmlsZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVZcIHxcIFwtXC12ZXJzaW9uXGZSICJcfF0iIAotLlJCICJbXHwiIFwtXC1oZWxwXGZSICJcfF0iIAotLkIgaW5maWxlCi0uQiBvdXRmaWxlCi0uU0ggREVTQ1JJUFRJT04KLS5CIG5sbWNvbnYKLWNvbnZlcnRzIHRoZSByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSAKLS5CIGluZmlsZQotaW50byB0aGUgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUgCi0uQlIgb3V0ZmlsZSAsCi1vcHRpb25hbGx5IHJlYWRpbmcgCi0uSSBoZWFkZXJmaWxlCi1mb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMgb24gd3JpdGluZyB0aGUgTkxNCi1jb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZSAKLS5JUiAiVGhlIE5ldFdhcmUgVG9vbCBNYWtlciBTcGVjaWZpY2F0aW9uIE1hbnVhbCIgLAotYXZhaWxhYmxlIGZyb20gTm92ZWxsLCBJbmMuCi0uQiBubG1jb252Ci1jdXJyZW50bHkgd29ya3Mgd2l0aCBpMzg2IG9iamVjdCBmaWxlcyBpbiAKLS5CUiBDT0ZGICwKLS5CUiBFTEYgLAotb3IKLS5CIGEub3V0Ci1mb3JtYXQsIGFuZCB3aXRoIFNQQVJDIG9iamVjdCBmaWxlcyBpbgotLkIgRUxGCi1vcgotLkIgYS5vdXQKLWZvcm1hdC4KLS5icgotLkIgbmxtY29udgotdXNlcyB0aGUgR05VIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeSB0byByZWFkIAotLklSIGluZmlsZSAuCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLUkgXGZJYmZkbmFtZVxmUiwgXGZCXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZQotQ29uc2lkZXIgdGhlIHNvdXJjZSBmaWxlJ3Mgb2JqZWN0IGZvcm1hdCB0byBiZSAKLS5JUiBiZmRuYW1lICwKLXJhdGhlciB0aGFuIGF0dGVtcHRpbmcgdG8gZGVkdWNlIGl0LgotLlRQCi0uQiBcLU8gXGZJYmZkbmFtZVxmUiwgXGZCXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKLVdyaXRlIHRoZSBvdXRwdXQgZmlsZSB1c2luZyB0aGUgb2JqZWN0IGZvcm1hdCAKLS5JUiBiZmRuYW1lIC4KLS5CIG5sbWNvbnYKLWluZmVycyB0aGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiB0aGUgaW5wdXQgZm9ybWF0LCBlLmcuIGZvciBhbiBpMzg2Ci1pbnB1dCBmaWxlIHRoZSBvdXRwdXQgZm9ybWF0IGlzCi0uSVIgbmxtMzJcLWkzODYgLgotLlRQCi0uQiBcLVQgXGZJaGVhZGVyZmlsZVxmUiwgXGZCXC1cLWhlYWRlclwtZmlsZT1cZkloZWFkZXJmaWxlCi1SZWFkcyAKLS5JIGhlYWRlcmZpbGUKLWZvciBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgRm9yIGluc3RydWN0aW9ucyBvbiB3cml0aW5nIHRoZSBOTE0KLWNvbW1hbmQgZmlsZSBsYW5ndWFnZSB1c2VkIGluIGhlYWRlciBmaWxlcywgc2VlIAotLklSICJUaGUgTmV0V2FyZSBUb29sIE1ha2VyIFNwZWNpZmljYXRpb24gTWFudWFsIiAsCi1hdmFpbGFibGUgZnJvbSBOb3ZlbGwsIEluYy4KLS5UUAotLkIgXC1WXGZSLCBcZkJcLVwtdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YKLS5CIG5sbWNvbnYKLWFuZCBleGl0LgotLlRQCi0uQiBcLWhcZlIsIFxmQlwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgbmxtY29udgotYW5kIGV4aXQuCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKEp1bmUgMTk5MykuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25sbWNvbnYuYyBiL2JpbnV0aWxzL25sbWNvbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjOGI2Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ubG1jb252LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEyICswLDAgQEAKLS8qIG5sbWNvbnYuYyAtLSBOTE0gY29udmVyc2lvbiBwcm9ncmFtCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYW55IGFwcHJvcHJpYXRlIG9iamVjdCBmaWxlCi0gICBpbnRvIGEgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUgKGFuIE5MTSkuICBJdCB3aWxsIGFjY2VwdCBhIGxpbmtlcgotICAgc3BlY2lmaWNhdGlvbiBmaWxlIHdoaWNoIGlzIGlkZW50aWNhbCB0byB0aGF0IGFjY2VwdGVkIGJ5IHRoZQotICAgTmV0V2FyZSBsaW5rZXIsIE5MTUxJTksuICAqLwotCi0vKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLwotI2lmbmRlZiBfX0dOVUNfXwotIyBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotCi0vKiBJbnRlcm5hbCBCRkQgTkxNIGhlYWRlci4gICovCi0jaW5jbHVkZSAibGlibmxtLmgiCi0jaW5jbHVkZSAibmxtY29udi5oIgotCi0jaWZkZWYgTkxNQ09OVl9BTFBIQQotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2VuZGlmCi0KLS8qIElmIHN0cmVycm9yIGlzIGp1c3QgYSBtYWNybywgd2Ugd2FudCB0byB1c2UgdGhlIG9uZSBmcm9tIGxpYmliZXJ0eQotICAgc2luY2UgaXQgd2lsbCBoYW5kbGUgdW5kZWZpbmVkIHZhbHVlcy4gICovCi0jdW5kZWYgc3RyZXJyb3IKLWV4dGVybiBjaGFyICpzdHJlcnJvciAoKTsKLQotI2lmbmRlZiBsb2NhbHRpbWUKLWV4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZSAoKTsKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfU0VUCi0jZGVmaW5lIFNFRUtfU0VUIDAKLSNlbmRpZgotCi0jaWZuZGVmIFJfT0sKLSNkZWZpbmUgUl9PSyA0Ci0jZGVmaW5lIFdfT0sgMgotI2RlZmluZSBYX09LIDEKLSNlbmRpZgotDAotLyogR2xvYmFsIHZhcmlhYmxlcy4gICovCi0KLS8qIFRoZSBuYW1lIHVzZWQgdG8gaW52b2tlIHRoZSBwcm9ncmFtLiAgKi8KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogTG9jYWwgdmFyaWFibGVzLiAgKi8KLQotLyogV2hldGhlciB0byBwcmludCBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIChjdXJyZW50bHkganVzdCBjb250cm9scwotICAgd2hldGhlciBpdCBwcmludHMgdGhlIGxpbmtlciBjb21tYW5kIGlmIHRoZXJlIGlzIG9uZSkuICAqLwotc3RhdGljIGludCBkZWJ1ZzsKLQotLyogVGhlIHN5bWJvbCB0YWJsZS4gICovCi1zdGF0aWMgYXN5bWJvbCAqKnN5bWJvbHM7Ci0KLS8qIEEgc2VjdGlvbiB3ZSBjcmVhdGUgaW4gdGhlIG91dHB1dCBmaWxlIHRvIGhvbGQgcG9pbnRlcnMgdG8gd2hlcmUKLSAgIHRoZSBzZWN0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBlbmQgdXAuICBXZSB3aWxsIHB1dCBhIHBvaW50ZXIgdG8KLSAgIHRoaXMgc2VjdGlvbiBpbiB0aGUgTkxNIGhlYWRlci4gIFRoZXNlIGlzIGFuIGVudHJ5IGZvciBlYWNoIGlucHV0Ci0gICBzZWN0aW9uLiAgVGhlIGZvcm1hdCBpcwotICAgICAgIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIG5hbWUKLSAgICAgICB6ZXJvZXMgdG8gYWRqdXN0IHRvIDQgYnl0ZSBib3VuZGFyeQotICAgICAgIDQgYnl0ZSBzZWN0aW9uIGRhdGEgZmlsZSBwb2ludGVyCi0gICAgICAgNCBieXRlIHNlY3Rpb24gc2l6ZQotICAgV2UgZG9uJ3QgbmVlZCBhIHZlcnNpb24gbnVtYmVyLiAgVGhlIHdheSB3ZSBmaW5kIHRoaXMgaW5mb3JtYXRpb24KLSAgIGlzIGJ5IGZpbmRpbmcgYSBzdGFtcCBpbiB0aGUgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIElmIHdlIG5lZWQgdG8KLSAgIGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoaXMgaW5mb3JtYXRpb24sIHdlIGNhbiBzaW1wbHkgY2hhbmdlIHRoZQotICAgc3RhbXAuICAqLwotc3RhdGljIGFzZWN0aW9uICpzZWNzZWM7Ci0KLS8qIEEgdGVtcG9yYXJ5IGZpbGUgbmFtZSB0byBiZSB1bmxpbmtlZCBvbiBleGl0LiAgQWN0dWFsbHksIGZvciBtb3N0Ci0gICBlcnJvcnMsIHdlIGxlYXZlIGl0IGFyb3VuZC4gIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgdGhhdCBpcyBoZWxwZnVsCi0gICBvciBub3QuICAqLwotc3RhdGljIGNoYXIgKnVubGlua19vbl9leGl0OwotCi0vKiBUaGUgbGlzdCBvZiBsb25nIG9wdGlvbnMuICAqLwotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ICJkZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnZCcgfSwKLSAgeyAiaGVhZGVyLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1QnIH0sCi0gIHsgImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnIH0sCi0gIHsgImlucHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSScgfSwKLSAgeyAiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LCAvKiBPYnNvbGV0ZSAqLwotICB7ICJsaW5rZXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2wnIH0sCi0gIHsgIm91dHB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nIH0sCi0gIHsgIm91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nIH0sIC8qIE9ic29sZXRlICovCi0gIHsgInZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnIH0sCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIDAsIDAgfQotfTsKLQotLyogTG9jYWwgcm91dGluZXMuICAqLwotCi1zdGF0aWMgdm9pZCBzaG93X2hlbHAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnNlbGVjdF9vdXRwdXRfZm9ybWF0IFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJCSB1bnNpZ25lZCBsb25nLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb3B5X3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIG1hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAotCQkJCSAgIGxvbmcgKiwgY2hhciAqLAotCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGRlZmF1bHRfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJCSAgIGxvbmcgKiwgY2hhciAqLAotCQkJCQkgICBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgY2hhciAqbGlua19pbnB1dHMgUEFSQU1TICgoc3RydWN0IHN0cmluZ19saXN0ICosIGNoYXIgKikpOwotCi0jaWZkZWYgTkxNQ09OVl9JMzg2Ci1zdGF0aWMgdm9pZCBpMzg2X21hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAotCQkJCQlsb25nICosIGNoYXIgKiwKLQkJCQkJYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBOTE1DT05WX0FMUEhBCi1zdGF0aWMgdm9pZCBhbHBoYV9tYW5nbGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqKiwKLQkJCQkJIGxvbmcgKiwgY2hhciAqLAotCQkJCQkgYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLXN0YXRpYyB2b2lkIHBvd2VycGNfYnVpbGRfc3R1YnMgUEFSQU1TICgoYmZkICosIGJmZCAqLCBhc3ltYm9sICoqKiwgbG9uZyAqKSk7Ci1zdGF0aWMgdm9pZCBwb3dlcnBjX3Jlc29sdmVfc3R1YnMgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwb3dlcnBjX21hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAotCQkJCQkgICBsb25nICosIGNoYXIgKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi0MCi0vKiBUaGUgbWFpbiByb3V0aW5lLiAgKi8KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBvcHQ7Ci0gIGNoYXIgKmlucHV0X2ZpbGUgPSBOVUxMOwotICBjb25zdCBjaGFyICppbnB1dF9mb3JtYXQgPSBOVUxMOwotICBjb25zdCBjaGFyICpvdXRwdXRfZm9ybWF0ID0gTlVMTDsKLSAgY29uc3QgY2hhciAqaGVhZGVyX2ZpbGUgPSBOVUxMOwotICBjaGFyICpsZF9hcmcgPSBOVUxMOwotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyIGZpeGVkX2hkcl9zdHJ1Y3Q7Ci0gIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgdmFyX2hkcl9zdHJ1Y3Q7Ci0gIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlciB2ZXJzaW9uX2hkcl9zdHJ1Y3Q7Ci0gIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIGNvcHlyaWdodF9oZHJfc3RydWN0OwotICBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIGV4dGVuZGVkX2hkcl9zdHJ1Y3Q7Ci0gIGJmZCAqaW5iZmQ7Ci0gIGJmZCAqb3V0YmZkOwotICBhc3ltYm9sICoqbmV3c3ltcywgKipvdXRzeW1zOwotICBsb25nIHN5bWNvdW50LCBuZXdzeW1hbGxvYywgbmV3c3ltY291bnQ7Ci0gIGxvbmcgc3ltc2l6ZTsKLSAgYXNlY3Rpb24gKnRleHRfc2VjLCAqYnNzX3NlYywgKmRhdGFfc2VjOwotICBiZmRfdm1hIHZtYTsKLSAgYmZkX3NpemVfdHlwZSBhbGlnbjsKLSAgYXN5bWJvbCAqZW5kc3ltOwotICBsb25nIGk7Ci0gIGNoYXIgaW5sZWFkLCBvdXRsZWFkOwotICBib29sZWFuIGdvdHN0YXJ0LCBnb3RleGl0LCBnb3RjaGVjazsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIEZJTEUgKmN1c3RvbV9kYXRhID0gTlVMTDsKLSAgRklMRSAqaGVscF9kYXRhID0gTlVMTDsKLSAgRklMRSAqbWVzc2FnZV9kYXRhID0gTlVMTDsKLSAgRklMRSAqcnBjX2RhdGEgPSBOVUxMOwotICBGSUxFICpzaGFyZWRfZGF0YSA9IE5VTEw7Ci0gIHNpemVfdCBjdXN0b21fc2l6ZSA9IDA7Ci0gIHNpemVfdCBoZWxwX3NpemUgPSAwOwotICBzaXplX3QgbWVzc2FnZV9zaXplID0gMDsKLSAgc2l6ZV90IG1vZHVsZV9zaXplID0gMDsKLSAgc2l6ZV90IHJwY19zaXplID0gMDsKLSAgYXNlY3Rpb24gKmN1c3RvbV9zZWN0aW9uID0gTlVMTDsKLSAgYXNlY3Rpb24gKmhlbHBfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICptZXNzYWdlX3NlY3Rpb24gPSBOVUxMOwotICBhc2VjdGlvbiAqbW9kdWxlX3NlY3Rpb24gPSBOVUxMOwotICBhc2VjdGlvbiAqcnBjX3NlY3Rpb24gPSBOVUxMOwotICBhc2VjdGlvbiAqc2hhcmVkX3NlY3Rpb24gPSBOVUxMOwotICBiZmQgKnNoYXJlZGJmZDsKLSAgc2l6ZV90IHNoYXJlZF9vZmZzZXQgPSAwOwotICBzaXplX3Qgc2hhcmVkX3NpemUgPSAwOwotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyIHNoYXJlZGhkcjsKLSAgaW50IGxlbjsKLSAgY2hhciAqbW9kbmFtZTsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJkaEk6bDpPOlQ6ViIsIGxvbmdfb3B0aW9ucywKLQkJCSAgICAgKGludCAqKSBOVUxMKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdkJzoKLQkgIGRlYnVnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlICdJJzoKLQkgIGlucHV0X2Zvcm1hdCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbGRfYXJnID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTyc6Ci0JICBvdXRwdXRfZm9ybWF0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnVCc6Ci0JICBoZWFkZXJfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgcHJpbnRfdmVyc2lvbiAoIm5sbWNvbnYiKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbWF5IGJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICBvdXRwdXRfZmlsZSA9IE5VTEw7Ci0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGUgPSBhcmd2W29wdGluZF07Ci0gICAgICArK29wdGluZDsKLSAgICAgIGlmIChvcHRpbmQgPCBhcmdjKQotCXsKLQkgIG91dHB1dF9maWxlID0gYXJndltvcHRpbmRdOwotCSAgKytvcHRpbmQ7Ci0JICBpZiAob3B0aW5kIDwgYXJnYykKLQkgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIGlmIChzdHJjbXAgKGlucHV0X2ZpbGUsIG91dHB1dF9maWxlKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbXVzdCBiZSBkaWZmZXJlbnRcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICBleGl0ICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIHRvIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgZml4ZWRfaGRyID0gJmZpeGVkX2hkcl9zdHJ1Y3Q7Ci0gIG1lbXNldCAoKFBUUikgJmZpeGVkX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiBmaXhlZF9oZHJfc3RydWN0KTsKLSAgdmFyX2hkciA9ICZ2YXJfaGRyX3N0cnVjdDsKLSAgbWVtc2V0ICgoUFRSKSAmdmFyX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiB2YXJfaGRyX3N0cnVjdCk7Ci0gIHZlcnNpb25faGRyID0gJnZlcnNpb25faGRyX3N0cnVjdDsKLSAgbWVtc2V0ICgoUFRSKSAmdmVyc2lvbl9oZHJfc3RydWN0LCAwLCBzaXplb2YgdmVyc2lvbl9oZHJfc3RydWN0KTsKLSAgY29weXJpZ2h0X2hkciA9ICZjb3B5cmlnaHRfaGRyX3N0cnVjdDsKLSAgbWVtc2V0ICgoUFRSKSAmY29weXJpZ2h0X2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiBjb3B5cmlnaHRfaGRyX3N0cnVjdCk7Ci0gIGV4dGVuZGVkX2hkciA9ICZleHRlbmRlZF9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZleHRlbmRlZF9oZHJfc3RydWN0LCAwLCBzaXplb2YgZXh0ZW5kZWRfaGRyX3N0cnVjdCk7Ci0gIGNoZWNrX3Byb2NlZHVyZSA9IE5VTEw7Ci0gIGN1c3RvbV9maWxlID0gTlVMTDsKLSAgZGVidWdfaW5mbyA9IGZhbHNlOwotICBleGl0X3Byb2NlZHVyZSA9ICJfU3RvcCI7Ci0gIGV4cG9ydF9zeW1ib2xzID0gTlVMTDsKLSAgbWFwX2ZpbGUgPSBOVUxMOwotICBmdWxsX21hcCA9IGZhbHNlOwotICBoZWxwX2ZpbGUgPSBOVUxMOwotICBpbXBvcnRfc3ltYm9scyA9IE5VTEw7Ci0gIG1lc3NhZ2VfZmlsZSA9IE5VTEw7Ci0gIG1vZHVsZXMgPSBOVUxMOwotICBzaGFyZWxpYl9maWxlID0gTlVMTDsKLSAgc3RhcnRfcHJvY2VkdXJlID0gIl9QcmVsdWRlIjsKLSAgdmVyYm9zZSA9IGZhbHNlOwotICBycGNfZmlsZSA9IE5VTEw7Ci0KLSAgcGFyc2VfZXJyb3JzID0gMDsKLQotICAvKiBQYXJzZSB0aGUgaGVhZGVyIGZpbGUgKGlmIHRoZXJlIGlzIG9uZSkuICAqLwotICBpZiAoaGVhZGVyX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBubG1sZXhfZmlsZSAoaGVhZGVyX2ZpbGUpCi0JICB8fCB5eXBhcnNlICgpICE9IDAKLQkgIHx8IHBhcnNlX2Vycm9ycyAhPSAwKQotCWV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoaW5wdXRfZmlsZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRfZmlsZSAhPSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiJXM6IGlucHV0IGZpbGUgbmFtZWQgYm90aCBvbiBjb21tYW5kIGxpbmUgYW5kIHdpdGggSU5QVVRcbiIpLAotCQkgICBwcm9ncmFtX25hbWUpOwotCSAgZXhpdCAoMSk7Ci0JfQotICAgICAgaWYgKGlucHV0X2ZpbGVzLT5uZXh0ID09IE5VTEwpCi0JaW5wdXRfZmlsZSA9IGlucHV0X2ZpbGVzLT5zdHJpbmc7Ci0gICAgICBlbHNlCi0JaW5wdXRfZmlsZSA9IGxpbmtfaW5wdXRzIChpbnB1dF9maWxlcywgbGRfYXJnKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBpbnB1dCBmaWxlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0gICAgfQotCi0gIGluYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlLCBpbnB1dF9mb3JtYXQpOwotICBpZiAoaW5iZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoaW5iZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfZm9ybWF0ID09IE5VTEwpCi0gICAgb3V0cHV0X2Zvcm1hdCA9IHNlbGVjdF9vdXRwdXRfZm9ybWF0IChiZmRfZ2V0X2FyY2ggKGluYmZkKSwKLQkJCQkJICBiZmRfZ2V0X21hY2ggKGluYmZkKSwKLQkJCQkJICBiZmRfYmlnX2VuZGlhbiAoaW5iZmQpKTsKLQotICBhc3NlcnQgKG91dHB1dF9mb3JtYXQgIT0gTlVMTCk7Ci0KLSAgLyogVXNlIHRoZSBvdXRwdXQgZmlsZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lIGlmIGl0IGV4aXN0cy4KLSAgICAgT3RoZXJ3aXNlIHVzZSB0aGUgZmlsZSBuYW1lZCBpbiB0aGUgT1VUUFVUIHN0YXRlbWVudC4gICovCi0gIGlmIChvdXRwdXRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0gICAgfQotCi0gIG91dGJmZCA9IGJmZF9vcGVudyAob3V0cHV0X2ZpbGUsIG91dHB1dF9mb3JtYXQpOwotICBpZiAob3V0YmZkID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChvdXRwdXRfZmlsZSk7Ci0gIGlmICghIGJmZF9zZXRfZm9ybWF0IChvdXRiZmQsIGJmZF9vYmplY3QpKQotICAgIGJmZF9mYXRhbCAob3V0cHV0X2ZpbGUpOwotCi0gIGFzc2VydCAoYmZkX2dldF9mbGF2b3VyIChvdXRiZmQpID09IGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIpOwotCi0gIGlmIChiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSAoaW5iZmQsIG91dGJmZCkgPT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICBfKCIlczogd2FybmluZzppbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgYXJlIG5vdCBjb21wYXRpYmxlXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSk7Ci0KLSAgLyogTW92ZSB0aGUgdmFsdWVzIHJlYWQgZnJvbSB0aGUgY29tbWFuZCBmaWxlIGludG8gb3V0YmZkLiAgKi8KLSAgKm5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCkgPSBmaXhlZF9oZHJfc3RydWN0OwotICAqbmxtX3ZhcmlhYmxlX2hlYWRlciAob3V0YmZkKSA9IHZhcl9oZHJfc3RydWN0OwotICAqbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpID0gdmVyc2lvbl9oZHJfc3RydWN0OwotICAqbmxtX2NvcHlyaWdodF9oZWFkZXIgKG91dGJmZCkgPSBjb3B5cmlnaHRfaGRyX3N0cnVjdDsKLSAgKm5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCkgPSBleHRlbmRlZF9oZHJfc3RydWN0OwotCi0gIC8qIFN0YXJ0IGNvcHlpbmcgdGhlIGlucHV0IEJGRCB0byB0aGUgb3V0cHV0IEJGRC4gICovCi0gIGlmICghIGJmZF9zZXRfZmlsZV9mbGFncyAob3V0YmZkLCBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGluYmZkKSkpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChvdXRiZmQpKTsKLQotICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGluYmZkKTsKLSAgaWYgKHN5bXNpemUgPCAwKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0gIHN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGluYmZkLCBzeW1ib2xzKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgLmJzcyBzZWN0aW9uLiAgKi8KLSAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGlmIChic3Nfc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYnNzX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgICAgIGlmIChic3Nfc2VjID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIGJzc19zZWMsIFNFQ19BTExPQykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob3V0YmZkLCBic3Nfc2VjLCAxKSkKLQliZmRfZmF0YWwgKF8oIm1ha2UgLmJzcyBzZWN0aW9uIikpOwotICAgIH0KLQotICAvKiBXZSBzdG9yZSB0aGUgb3JpZ2luYWwgc2VjdGlvbiBuYW1lcyBpbiB0aGUgLm5sbXNlY3Rpb25zIHNlY3Rpb24sCi0gICAgIHNvIHRoYXQgcHJvZ3JhbXMgd2hpY2ggdW5kZXJzdGFuZCBpdCBjYW4gcmVzdXJyZWN0IHRoZSBvcmlnaW5hbAotICAgICBzZWN0aW9ucyBmcm9tIHRoZSBOTE0uICBXZSB3aWxsIHB1dCBhIHBvaW50ZXIgdG8gLm5sbXNlY3Rpb25zIGluCi0gICAgIHRoZSBOTE0gaGVhZGVyIGFyZWEuICAqLwotICBzZWNzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtc2VjdGlvbnMiKTsKLSAgaWYgKHNlY3NlYyA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoXygibWFrZSAubmxtc2VjdGlvbnMgc2VjdGlvbiIpKTsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIHNlY3NlYywgU0VDX0hBU19DT05URU5UUykpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb25zIGZsYWdzIikpOwotCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0gIC8qIEZvciBQb3dlclBDIE5ldFdhcmUgd2UgbmVlZCB0byBidWlsZCBzdHVicyBmb3IgY2FsbHMgdG8gdW5kZWZpbmVkCi0gICAgIHN5bWJvbHMuICBCZWNhdXNlIGVhY2ggc3R1YiByZXF1aXJlcyBhbiBlbnRyeSBpbiB0aGUgVE9DIHNlY3Rpb24KLSAgICAgd2hpY2ggbXVzdCBiZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcyBvdGhlciBlbnRyaWVzIGluIHRoZSBUT0MKLSAgICAgc2VjdGlvbiwgd2UgbXVzdCBkbyB0aGlzIGJlZm9yZSBkZXRlcm1pbmluZyB3aGVyZSB0aGUgVE9DIHNlY3Rpb24KLSAgICAgZ29lcyBpbiBzZXR1cF9zZWN0aW9ucy4gICovCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGluYmZkKSA9PSBiZmRfYXJjaF9wb3dlcnBjKQotICAgIHBvd2VycGNfYnVpbGRfc3R1YnMgKGluYmZkLCBvdXRiZmQsICZzeW1ib2xzLCAmc3ltY291bnQpOwotI2VuZGlmCi0KLSAgLyogU2V0IHVwIHRoZSBzZWN0aW9ucy4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaW5iZmQsIHNldHVwX3NlY3Rpb25zLCAoUFRSKSBvdXRiZmQpOwotCi0gIHRleHRfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwgTkxNX0NPREVfTkFNRSk7Ci0KLSAgLyogVGhlIC5ic3Mgc2VjdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKGRhdGFfc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0KLSAgICAgIHZtYSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoZGF0YV9zZWMpOwotICAgICAgYWxpZ24gPSAxIDw8IGJzc19zZWMtPmFsaWdubWVudF9wb3dlcjsKLSAgICAgIGFkZCA9ICgodm1hICsgYWxpZ24gLSAxKSAmfiAoYWxpZ24gLSAxKSkgLSB2bWE7Ci0gICAgICB2bWEgKz0gYWRkOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAob3V0YmZkLCBic3Nfc2VjLCB2bWEpKQotCWJmZF9mYXRhbCAoXygic2V0IC5ic3Mgdm1hIikpOwotICAgICAgaWYgKGFkZCAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgZGF0YV9zaXplOwotCi0JICBkYXRhX3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGRhdGFfc2VjKTsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIGRhdGFfc2VjLCBkYXRhX3NpemUgKyBhZGQpKQotCSAgICBiZmRfZmF0YWwgKF8oInNldCAuZGF0YSBzaXplIikpOwotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIGlubGVhZCA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoaW5iZmQpOwotICBvdXRsZWFkID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvdXRiZmQpOwotICBnb3RzdGFydCA9IGZhbHNlOwotICBnb3RleGl0ID0gZmFsc2U7Ci0gIGdvdGNoZWNrID0gZmFsc2U7Ci0gIG5ld3N5bWFsbG9jID0gMTA7Ci0gIG5ld3N5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAobmV3c3ltYWxsb2MgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBuZXdzeW1jb3VudCA9IDA7Ci0gIGVuZHN5bSA9IE5VTEw7Ci0gIGZvciAoaSA9IDA7IGkgPCBzeW1jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGFzeW1ib2wgKnN5bTsKLQotICAgICAgc3ltID0gc3ltYm9sc1tpXTsKLQotICAgICAgLyogQWRkIG9yIHJlbW92ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4gICovCi0gICAgICBpZiAoaW5sZWFkICE9IG91dGxlYWQpCi0JewotCSAgaWYgKGlubGVhZCAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gPT0gaW5sZWFkKQotCQl7Ci0JCSAgaWYgKG91dGxlYWQgPT0gJ1wwJykKLQkJICAgICsrc3ltLT5uYW1lOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgY2hhciAqbmV3OwotCi0JCSAgICAgIG5ldyA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgKyAxKTsKLQkJICAgICAgbmV3WzBdID0gb3V0bGVhZDsKLQkJICAgICAgc3RyY3B5IChuZXcgKyAxLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pICsgMSk7Ci0JCSAgICAgIHN5bS0+bmFtZSA9IG5ldzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpuZXc7Ci0KLQkgICAgICBuZXcgPSB4bWFsbG9jIChzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpICsgMik7Ci0JICAgICAgbmV3WzBdID0gb3V0bGVhZDsKLQkgICAgICBzdHJjcHkgKG5ldyArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpOwotCSAgICAgIHN5bS0+bmFtZSA9IG5ldzsKLQkgICAgfQotCX0KLQotICAgICAgLyogTkxNJ3MgaGF2ZSBhbiB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiwgYnV0IHRoZXkgZG8gbm90Ci0JIGhhdmUgYSBjb21tb24gc2VjdGlvbiBpbiB0aGUgVW5peCBzZW5zZS4gIE1vdmUgYWxsIGNvbW1vbgotCSBzeW1ib2xzIGludG8gdGhlIC5ic3Mgc2VjdGlvbiwgYW5kIG1hcmsgdGhlbSBhcyBleHBvcnRlZC4gICovCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXsKLQkgIGJmZF92bWEgc2l6ZTsKLQotCSAgc3ltLT5zZWN0aW9uID0gYnNzX3NlYzsKLQkgIHNpemUgPSBzeW0tPnZhbHVlOwotCSAgc3ltLT52YWx1ZSA9IGJzc19zZWMtPl9yYXdfc2l6ZTsKLQkgIGJzc19zZWMtPl9yYXdfc2l6ZSArPSBzaXplOwotCSAgYWxpZ24gPSAxIDw8IGJzc19zZWMtPmFsaWdubWVudF9wb3dlcjsKLQkgIGJzc19zZWMtPl9yYXdfc2l6ZSA9IChic3Nfc2VjLT5fcmF3X3NpemUgKyBhbGlnbiAtIDEpICZ+IChhbGlnbiAtIDEpOwotCSAgc3ltLT5mbGFncyB8PSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgLyogTW92ZSB0aGUgc3ltYm9sIGludG8gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIHN5bS0+dmFsdWUgKz0gYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vdXRwdXRfb2Zmc2V0OwotCSAgc3ltLT5zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vdXRwdXRfc2VjdGlvbjsKLQkgIC8qIFRoaXMgaXMgbm8gbG9uZ2VyIGEgc2VjdGlvbiBzeW1ib2wuICAqLwotCSAgc3ltLT5mbGFncyAmPX4gQlNGX1NFQ1RJT05fU1lNOwotCX0KLQotICAgICAgLyogRm9yY2UgX2VkYXRhIGFuZCBfZW5kIHRvIGJlIGRlZmluZWQuICBUaGlzIHdvdWxkIG5vcm1hbGx5IGJlCi0JIGRvbmUgYnkgdGhlIGxpbmtlciwgYnV0IHRoZSBtYW5pcHVsYXRpb24gb2YgdGhlIGNvbW1vbgotCSBzeW1ib2xzIHdpbGwgY29uZnVzZSBpdC4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwCi0JICAmJiBiZmRfYXN5bWJvbF9uYW1lIChzeW0pWzBdID09ICdfJwotCSAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXsKLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJfZWRhdGEiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3ltLT5zZWN0aW9uID0gYnNzX3NlYzsKLQkgICAgICBzeW0tPnZhbHVlID0gMDsKLQkgICAgfQotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgIl9lbmQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3ltLT5zZWN0aW9uID0gYnNzX3NlYzsKLQkgICAgICBlbmRzeW0gPSBzeW07Ci0JICAgIH0KLQotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotCSAgLyogRm9yIFBvd2VyUEMgTmV0V2FyZSwgd2UgZGVmaW5lIF9fR09UMC4gIFRoaXMgaXMgdGhlIHN0YXJ0Ci0JICAgICBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgIGlmIChiZmRfZ2V0X2FyY2ggKGluYmZkKSA9PSBiZmRfYXJjaF9wb3dlcnBjCi0JICAgICAgJiYgc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiX19HT1QwIikgPT0gMCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpnb3Rfc2VjOwotCi0JICAgICAgZ290X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbmJmZCwgIi5nb3QiKTsKLQkgICAgICBhc3NlcnQgKGdvdF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpOwotCSAgICAgIHN5bS0+dmFsdWUgPSBnb3Rfc2VjLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIHN5bS0+c2VjdGlvbiA9IGdvdF9zZWMtPm91dHB1dF9zZWN0aW9uOwotCSAgICB9Ci0jZW5kaWYKLSAJfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCwgY2hlY2sgdGhlIGV4cG9ydCBsaXN0LiAgKi8KLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCkpICE9IDApCi0JewotCSAgcmVnaXN0ZXIgc3RydWN0IHN0cmluZ19saXN0ICpsOwotCSAgaW50IGZvdW5kX3NpbXBsZTsKLQotCSAgLyogVW5mb3J0dW5hdGVseSwgYSBzeW1ib2wgY2FuIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBvbiB0aGUKLQkgICAgIGV4cG9ydCBsaXN0LCB3aXRoIGFuZCB3aXRob3V0IHByZWZpeGVzLiAgKi8KLQkgIGZvdW5kX3NpbXBsZSA9IDA7Ci0JICBmb3IgKGwgPSBleHBvcnRfc3ltYm9sczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKGwtPnN0cmluZywgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgPT0gMCkKLQkJZm91bmRfc2ltcGxlID0gMTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICp6YmFzZTsKLQotCQkgIHpiYXNlID0gc3RyY2hyIChsLT5zdHJpbmcsICdAJyk7Ci0JCSAgaWYgKHpiYXNlICE9IE5VTEwKLQkJICAgICAgJiYgc3RyY21wICh6YmFzZSArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIG11c3QgYWRkIGEgc3ltYm9sIHdpdGggdGhpcyBwcmVmaXguICAqLwotCQkgICAgICBpZiAobmV3c3ltY291bnQgPj0gbmV3c3ltYWxsb2MpCi0JCQl7Ci0JCQkgIG5ld3N5bWFsbG9jICs9IDEwOwotCQkJICBuZXdzeW1zID0gKChhc3ltYm9sICoqKQotCQkJCSAgICAgeHJlYWxsb2MgKChQVFIpIG5ld3N5bXMsCi0JCQkJCSAgICAgICAobmV3c3ltYWxsb2MKLQkJCQkJCSogc2l6ZW9mIChhc3ltYm9sICopKSkpOwotCQkJfQotCQkgICAgICBuZXdzeW1zW25ld3N5bWNvdW50XSA9Ci0JCQkoYXN5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wpKTsKLQkJICAgICAgKm5ld3N5bXNbbmV3c3ltY291bnRdID0gKnN5bTsKLQkJICAgICAgbmV3c3ltc1tuZXdzeW1jb3VudF0tPm5hbWUgPSBsLT5zdHJpbmc7Ci0JCSAgICAgICsrbmV3c3ltY291bnQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgaWYgKCEgZm91bmRfc2ltcGxlKQotCSAgICB7Ci0JICAgICAgLyogVGhlIHVubW9kaWZpZWQgc3ltYm9sIGlzIGFjdHVhbGx5IG5vdCBleHBvcnRlZCBhdAotCQkgYWxsLiAgKi8KLQkgICAgICBzeW0tPmZsYWdzICY9fiAoQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQpOwotCSAgICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX0xPQ0FMOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiBpdCdzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHNlZSBpZiBpdCdzIG9uIHRoZSBpbXBvcnQgbGlzdC4KLQkgQ2hhbmdlIHRoZSBwcmVmaXggaWYgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgcmVnaXN0ZXIgc3RydWN0IHN0cmluZ19saXN0ICpsOwotCi0JICBmb3IgKGwgPSBpbXBvcnRfc3ltYm9sczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKGwtPnN0cmluZywgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqemJhc2U7Ci0KLQkJICB6YmFzZSA9IHN0cmNociAobC0+c3RyaW5nLCAnQCcpOwotCQkgIGlmICh6YmFzZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cmNtcCAoemJhc2UgKyAxLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQotCQkgICAgewotCQkgICAgICBzeW0tPm5hbWUgPSBsLT5zdHJpbmc7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGlmIChsID09IE5VTEwpCi0JICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICBfKCIlczogd2FybmluZzogc3ltYm9sICVzIGltcG9ydGVkIGJ1dCBub3QgaW4gaW1wb3J0IGxpc3RcbiIpLAotCQkgICAgIHByb2dyYW1fbmFtZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSk7Ci0JfQotCQotICAgICAgLyogU2VlIGlmIGl0J3Mgb25lIG9mIHRoZSBzcGVjaWFsIG5hbWVkIHN5bWJvbHMuICAqLwotICAgICAgaWYgKChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgPT0gMCkKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgLyogRklYTUU6IElmIHRoZXNlIHN5bWJvbHMgYXJlIG5vdCBpbiB0aGUgLnRleHQgc2VjdGlvbiwgd2UKLQkgICAgIGFkZCB0aGUgLnRleHQgc2VjdGlvbiBzaXplIHRvIHRoZSB2YWx1ZS4gIFRoaXMgbWF5IG5vdCBiZQotCSAgICAgY29ycmVjdCBmb3IgYWxsIHRhcmdldHMuICBJJ20gbm90IHN1cmUgaG93IHRoaXMgc2hvdWxkCi0JICAgICByZWFsbHkgYmUgaGFuZGxlZC4gICovCi0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCBzdGFydF9wcm9jZWR1cmUpID09IDApCi0JICAgIHsKLQkgICAgICB2YWwgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pID09IGRhdGFfc2VjCi0JCSAgJiYgdGV4dF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCXZhbCArPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHRleHRfc2VjKTsKLQkgICAgICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dGJmZCwgdmFsKSkKLQkJYmZkX2ZhdGFsIChfKCJzZXQgc3RhcnQgYWRkcmVzcyIpKTsKLQkgICAgICBnb3RzdGFydCA9IHRydWU7Ci0JICAgIH0KLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGV4aXRfcHJvY2VkdXJlKSA9PSAwKQotCSAgICB7Ci0JICAgICAgdmFsID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSA9PSBkYXRhX3NlYwotCQkgICYmIHRleHRfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCQl2YWwgKz0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCB0ZXh0X3NlYyk7Ci0JICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+ZXhpdFByb2NlZHVyZU9mZnNldCA9IHZhbDsKLQkgICAgICBnb3RleGl0ID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKGNoZWNrX3Byb2NlZHVyZSAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCBjaGVja19wcm9jZWR1cmUpID09IDApCi0JICAgIHsKLQkgICAgICB2YWwgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pID09IGRhdGFfc2VjCi0JCSAgJiYgdGV4dF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCXZhbCArPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHRleHRfc2VjKTsKLQkgICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCA9IHZhbDsKLQkgICAgICBnb3RjaGVjayA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChlbmRzeW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBlbmRzeW0tPnZhbHVlID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChic3Nfc2VjKTsKLQotICAgICAgLyogRklYTUU6IElmIGFueSByZWxvY3MgcmVmZXJyaW5nIHRvIF9lbmQgdXNlIGlucGxhY2UgYWRkZW5kcywKLQkgdGhlbiBJIHRoaW5rIHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLiAgVGhpcyBpcyBoYW5kbGVkIGJ5Ci0JIGkzODZfbWFuZ2xlX3JlbG9jcy4gIElzIGl0IG5lZWRlZCBmb3IgYW55IG90aGVyIG9iamVjdAotCSBmb3JtYXRzPyAgKi8KLSAgICB9Ci0KLSAgaWYgKG5ld3N5bWNvdW50ID09IDApCi0gICAgb3V0c3ltcyA9IHN5bWJvbHM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvdXRzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKChzeW1jb3VudCArIG5ld3N5bWNvdW50ICsgMSkKLQkJCQkgICAgICAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBtZW1jcHkgKG91dHN5bXMsIHN5bWJvbHMsIHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIG1lbWNweSAob3V0c3ltcyArIHN5bWNvdW50LCBuZXdzeW1zLCBuZXdzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBvdXRzeW1zW3N5bWNvdW50ICsgbmV3c3ltY291bnRdID0gTlVMTDsKLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKG91dGJmZCwgb3V0c3ltcywgc3ltY291bnQgKyBuZXdzeW1jb3VudCk7Ci0gICAgCi0gIGlmICghIGdvdHN0YXJ0KQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6IFNUQVJUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIHN0YXJ0X3Byb2NlZHVyZSk7Ci0gIGlmICghIGdvdGV4aXQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogRVhJVCBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lLCBleGl0X3Byb2NlZHVyZSk7Ci0gIGlmIChjaGVja19wcm9jZWR1cmUgIT0gTlVMTAotICAgICAgJiYgISBnb3RjaGVjaykKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBDSEVDSyBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lLCBjaGVja19wcm9jZWR1cmUpOwotCi0gIC8qIEFkZCBhZGRpdGlvbmFsIHNlY3Rpb25zIHJlcXVpcmVkIGZvciB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGN1c3RvbV9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgY3VzdG9tX2RhdGEgPSBmb3BlbiAoY3VzdG9tX2ZpbGUsICJyIik7Ci0gICAgICBpZiAoY3VzdG9tX2RhdGEgPT0gTlVMTAotCSAgfHwgZnN0YXQgKGZpbGVubyAoY3VzdG9tX2RhdGEpLCAmc3QpIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgY3VzdG9tX2ZpbGUsCi0JCSAgIHN0cmVycm9yIChlcnJubykpOwotCSAgY3VzdG9tX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjdXN0b21fc2l6ZSA9IHN0LnN0X3NpemU7Ci0JICBjdXN0b21fc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1jdXN0b20iKTsKLQkgIGlmIChjdXN0b21fc2VjdGlvbiA9PSBOVUxMCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBjdXN0b21fc2VjdGlvbiwgY3VzdG9tX3NpemUpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgY3VzdG9tX3NlY3Rpb24sCi0JCQkJCSAgU0VDX0hBU19DT05URU5UUykpCi0JICAgIGJmZF9mYXRhbCAoXygiY3VzdG9tIHNlY3Rpb24iKSk7Ci0JfQotICAgIH0KLSAgaWYgKGhlbHBfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGhlbHBfZGF0YSA9IGZvcGVuIChoZWxwX2ZpbGUsICJyIik7Ci0gICAgICBpZiAoaGVscF9kYXRhID09IE5VTEwKLQkgIHx8IGZzdGF0IChmaWxlbm8gKGhlbHBfZGF0YSksICZzdCkgPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBoZWxwX2ZpbGUsCi0JCSAgIHN0cmVycm9yIChlcnJubykpOwotCSAgaGVscF9maWxlID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaGVscF9zaXplID0gc3Quc3Rfc2l6ZTsKLQkgIGhlbHBfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1oZWxwIik7Ci0JICBpZiAoaGVscF9zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIGhlbHBfc2VjdGlvbiwgaGVscF9zaXplKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIGhlbHBfc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJoZWxwIHNlY3Rpb24iKSk7Ci0JICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0JfQotICAgIH0KLSAgaWYgKG1lc3NhZ2VfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIG1lc3NhZ2VfZGF0YSA9IGZvcGVuIChtZXNzYWdlX2ZpbGUsICJyIik7Ci0gICAgICBpZiAobWVzc2FnZV9kYXRhID09IE5VTEwKLQkgIHx8IGZzdGF0IChmaWxlbm8gKG1lc3NhZ2VfZGF0YSksICZzdCkgPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBtZXNzYWdlX2ZpbGUsCi0JCSAgIHN0cmVycm9yIChlcnJubykpOwotCSAgbWVzc2FnZV9maWxlID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVzc2FnZV9zaXplID0gc3Quc3Rfc2l6ZTsKLQkgIG1lc3NhZ2Vfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1tZXNzYWdlcyIpOwotCSAgaWYgKG1lc3NhZ2Vfc2VjdGlvbiA9PSBOVUxMCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBtZXNzYWdlX3NlY3Rpb24sIG1lc3NhZ2Vfc2l6ZSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBtZXNzYWdlX3NlY3Rpb24sCi0JCQkJCSAgU0VDX0hBU19DT05URU5UUykpCi0JICAgIGJmZF9mYXRhbCAoXygibWVzc2FnZSBzZWN0aW9uIikpOwotCSAgc3RybmNweSAobmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJNZVNzQWdFcyIsIDgpOwotCX0KLSAgICB9Ci0gIGlmIChtb2R1bGVzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsOwotCi0gICAgICBtb2R1bGVfc2l6ZSA9IDA7Ci0gICAgICBmb3IgKGwgPSBtb2R1bGVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCW1vZHVsZV9zaXplICs9IHN0cmxlbiAobC0+c3RyaW5nKSArIDE7Ci0gICAgICBtb2R1bGVfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1tb2R1bGVzIik7Ci0gICAgICBpZiAobW9kdWxlX3NlY3Rpb24gPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBtb2R1bGVfc2VjdGlvbiwgbW9kdWxlX3NpemUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBtb2R1bGVfc2VjdGlvbiwKLQkJCQkgICAgICBTRUNfSEFTX0NPTlRFTlRTKSkKLQliZmRfZmF0YWwgKF8oIm1vZHVsZSBzZWN0aW9uIikpOwotICAgIH0KLSAgaWYgKHJwY19maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgcnBjX2RhdGEgPSBmb3BlbiAocnBjX2ZpbGUsICJyIik7Ci0gICAgICBpZiAocnBjX2RhdGEgPT0gTlVMTAotCSAgfHwgZnN0YXQgKGZpbGVubyAocnBjX2RhdGEpLCAmc3QpIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgcnBjX2ZpbGUsCi0JCSAgIHN0cmVycm9yIChlcnJubykpOwotCSAgcnBjX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBycGNfc2l6ZSA9IHN0LnN0X3NpemU7Ci0JICBycGNfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1ycGMiKTsKLQkgIGlmIChycGNfc2VjdGlvbiA9PSBOVUxMCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBycGNfc2VjdGlvbiwgcnBjX3NpemUpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgcnBjX3NlY3Rpb24sCi0JCQkJCSAgU0VDX0hBU19DT05URU5UUykpCi0JICAgIGJmZF9mYXRhbCAoXygicnBjIHNlY3Rpb24iKSk7Ci0JICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0JfQotICAgIH0KLSAgaWYgKHNoYXJlbGliX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaGFyZWRiZmQgPSBiZmRfb3BlbnIgKHNoYXJlbGliX2ZpbGUsIG91dHB1dF9mb3JtYXQpOwotICAgICAgaWYgKHNoYXJlZGJmZCA9PSBOVUxMCi0JICB8fCAhIGJmZF9jaGVja19mb3JtYXQgKHNoYXJlZGJmZCwgYmZkX29iamVjdCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUsCi0JCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHNoYXJlbGliX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzaGFyZWRoZHIgPSAqbmxtX2ZpeGVkX2hlYWRlciAoc2hhcmVkYmZkKTsKLQkgIGJmZF9jbG9zZSAoc2hhcmVkYmZkKTsKLQkgIHNoYXJlZF9kYXRhID0gZm9wZW4gKHNoYXJlbGliX2ZpbGUsICJyIik7Ci0JICBpZiAoc2hhcmVkX2RhdGEgPT0gTlVMTAotCSAgICAgIHx8IChmc3RhdCAoZmlsZW5vIChzaGFyZWRfZGF0YSksICZzdCkgPCAwKSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzaGFyZWxpYl9maWxlLAotCQkgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICAgICAgc2hhcmVsaWJfZmlsZSA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIElmIHdlIHdlcmUgY2xldmVyLCB3ZSBjb3VsZCBqdXN0IGNvcHkgb3V0IHRoZQotCQkgc2VjdGlvbnMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHdoaWNoIHdlIGFjdHVhbGx5Ci0JCSBuZWVkLiAgSG93ZXZlciwgd2Ugd291bGQgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBzaXplcwotCQkgb2YgdGhlIGV4dGVybmFsIGFuZCBwdWJsaWMgaW5mb3JtYXRpb24sIGFuZCB0aGF0IGNhbgotCQkgbm90IGJlIGRvbmUgd2l0aG91dCByZWFkaW5nIHRocm91Z2ggdGhlbS4gICovCi0JICAgICAgaWYgKHNoYXJlZGhkci51bmluaXRpYWxpemVkRGF0YVNpemUgPiAwKQotCQl7Ci0JCSAgLyogVGhlcmUgaXMgbm8gcGxhY2UgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICAqLwotCQkgIGZwcmludGYgKHN0ZGVyciwKLQkJCSAgIF8oIiVzOiVzOiB3YXJuaW5nOiBzaGFyZWQgbGlicmFyaWVzIGNhbiBub3QgaGF2ZSB1bmluaXRpYWxpemVkIGRhdGFcbiIpLAotCQkJICAgcHJvZ3JhbV9uYW1lLCBzaGFyZWxpYl9maWxlKTsKLQkJfQotCSAgICAgIHNoYXJlZF9vZmZzZXQgPSBzdC5zdF9zaXplOwotCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLmNvZGVJbWFnZU9mZnNldCkKLQkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5jb2RlSW1hZ2VPZmZzZXQ7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIuZGF0YUltYWdlT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLmRhdGFJbWFnZU9mZnNldDsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5yZWxvY2F0aW9uRml4dXBPZmZzZXQpCi0JCXNoYXJlZF9vZmZzZXQgPSBzaGFyZWRoZHIucmVsb2NhdGlvbkZpeHVwT2Zmc2V0OwotCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCkKLQkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQ7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIucHVibGljc09mZnNldCkKLQkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5wdWJsaWNzT2Zmc2V0OwotCSAgICAgIHNoYXJlZF9zaXplID0gc3Quc3Rfc2l6ZSAtIHNoYXJlZF9vZmZzZXQ7Ci0JICAgICAgc2hhcmVkX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtc2hhcmVkIik7Ci0JICAgICAgaWYgKHNoYXJlZF9zZWN0aW9uID09IE5VTEwKLQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHNoYXJlZF9zZWN0aW9uLAotCQkJCQkgICAgIHNoYXJlZF9zaXplKQotCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIHNoYXJlZF9zZWN0aW9uLAotCQkJCQkgICAgICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkJYmZkX2ZhdGFsIChfKCJzaGFyZWQgc2VjdGlvbiIpKTsKLQkgICAgICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIENoZWNrIHdoZXRoZXIgYSB2ZXJzaW9uIHdhcyBnaXZlbi4gICovCi0gIGlmIChzdHJuY21wICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpICE9IDApCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogTm8gdmVyc2lvbiBudW1iZXIgZ2l2ZW5cbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lKTsKLQotICAvKiBBdCBsZWFzdCBmb3Igbm93LCBhbHdheXMgY3JlYXRlIGFuIGV4dGVuZGVkIGhlYWRlciwgYmVjYXVzZSB0aGF0Ci0gICAgIGlzIHdoYXQgTkxNTElOSyBkb2VzLiAgKi8KLSAgc3RybmNweSAobmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJNZVNzQWdFcyIsIDgpOwotCi0gIHN0cm5jcHkgKG5sbV9jeWdudXNfZXh0X2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJDeUduVXNFeCIsIDgpOwotCi0gIC8qIElmIHRoZSBkYXRlIHdhcyBub3QgZ2l2ZW4sIGZvcmNlIGl0IGluLiAgKi8KLSAgaWYgKG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+bW9udGggPT0gMAotICAgICAgJiYgbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT5kYXkgPT0gMAotICAgICAgJiYgbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT55ZWFyID09IDApCi0gICAgewotICAgICAgdGltZV90IG5vdzsKLSAgICAgIHN0cnVjdCB0bSAqcHRtOwotCi0gICAgICB0aW1lICgmbm93KTsKLSAgICAgIHB0bSA9IGxvY2FsdGltZSAoJm5vdyk7Ci0gICAgICBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPm1vbnRoID0gcHRtLT50bV9tb24gKyAxOwotICAgICAgbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT5kYXkgPSBwdG0tPnRtX21kYXk7Ci0gICAgICBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPnllYXIgPSBwdG0tPnRtX3llYXIgKyAxOTAwOwotICAgICAgc3RybmNweSAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKLSAgICB9Ci0KLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLSAgLyogUmVzb2x2ZSB0aGUgc3R1YnMgd2UgYnVpbGQgZm9yIFBvd2VyUEMgTmV0V2FyZS4gICovCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGluYmZkKSA9PSBiZmRfYXJjaF9wb3dlcnBjKQotICAgIHBvd2VycGNfcmVzb2x2ZV9zdHVicyAoaW5iZmQsIG91dGJmZCk7Ci0jZW5kaWYKLQotICAvKiBDb3B5IG92ZXIgdGhlIHNlY3Rpb25zLiAgKi8KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpbmJmZCwgY29weV9zZWN0aW9ucywgKFBUUikgb3V0YmZkKTsKLQotICAvKiBGaW5pc2ggdXAgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChjdXN0b21fZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAoY3VzdG9tX3NpemUpOwotICAgICAgaWYgKGZyZWFkIChkYXRhLCAxLCBjdXN0b21fc2l6ZSwgY3VzdG9tX2RhdGEpICE9IGN1c3RvbV9zaXplKQotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBjdXN0b21fZmlsZSwKLQkJIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBjdXN0b21fc2VjdGlvbiwgZGF0YSwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIGN1c3RvbV9zaXplKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJjdXN0b20gc2VjdGlvbiIpKTsKLQkgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmN1c3RvbURhdGFPZmZzZXQgPQotCSAgICBjdXN0b21fc2VjdGlvbi0+ZmlsZXBvczsKLQkgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmN1c3RvbURhdGFTaXplID0gY3VzdG9tX3NpemU7Ci0JfQotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgfQotICBpZiAoISBkZWJ1Z19pbmZvKQotICAgIHsKLSAgICAgIC8qIEFzIGEgc3BlY2lhbCBoYWNrLCB0aGUgYmFja2VuZCByZWNvZ25pemVzIGEgZGVidWdJbmZvT2Zmc2V0Ci0JIG9mIC0xIHRvIG1lYW4gdGhhdCBpdCBzaG91bGQgbm90IG91dHB1dCBhbnkgZGVidWdnaW5nCi0JIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gbm90IGJlIGhhbmRsaW5nIGJ5IGZpZGRsaW5nIHdpdGggdGhlCi0JIHN5bWJvbCB0YWJsZSBiZWNhdXNlIGV4cG9ydGVkIHN5bWJvbHMgYXBwZWFyIGluIGJvdGggdGhlCi0JIGV4cG9ydCBpbmZvcm1hdGlvbiBhbmQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSAoZmlsZV9wdHIpIC0xOwotICAgIH0KLSAgaWYgKG1hcF9maWxlICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgXygiJXM6IHdhcm5pbmc6IE1BUCBhbmQgRlVMTE1BUCBhcmUgbm90IHN1cHBvcnRlZDsgdHJ5IGxkIC1NXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSk7Ci0gIGlmIChoZWxwX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKGhlbHBfc2l6ZSk7Ci0gICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIGhlbHBfc2l6ZSwgaGVscF9kYXRhKSAhPSBoZWxwX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIGhlbHBfZmlsZSwKLQkJIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBoZWxwX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBoZWxwX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oImhlbHAgc2VjdGlvbiIpKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPmhlbHBGaWxlT2Zmc2V0ID0KLQkgICAgaGVscF9zZWN0aW9uLT5maWxlcG9zOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+aGVscEZpbGVMZW5ndGggPSBoZWxwX3NpemU7Ci0JfQotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgfQotICBpZiAobWVzc2FnZV9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChtZXNzYWdlX3NpemUpOwotICAgICAgaWYgKGZyZWFkIChkYXRhLCAxLCBtZXNzYWdlX3NpemUsIG1lc3NhZ2VfZGF0YSkgIT0gbWVzc2FnZV9zaXplKQotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBtZXNzYWdlX2ZpbGUsCi0JCSBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgbWVzc2FnZV9zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgbWVzc2FnZV9zaXplKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJtZXNzYWdlIHNlY3Rpb24iKSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5tZXNzYWdlRmlsZU9mZnNldCA9Ci0JICAgIG1lc3NhZ2Vfc2VjdGlvbi0+ZmlsZXBvczsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPm1lc3NhZ2VGaWxlTGVuZ3RoID0gbWVzc2FnZV9zaXplOwotCi0JICAvKiBGSVhNRTogQXJlIHRoZXNlIG9mZnNldHMgY29ycmVjdCBvbiBhbGwgcGxhdGZvcm1zPyAgQXJlCi0JICAgICB0aGV5IDMyIGJpdHMgb24gYWxsIHBsYXRmb3Jtcz8gIFdoYXQgZW5kaWFubmVzcz8gICovCi0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5sYW5ndWFnZUlEID0KLQkgICAgYmZkX2hfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgMTA2KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPm1lc3NhZ2VDb3VudCA9Ci0JICAgIGJmZF9oX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIDExMCk7Ci0JfQotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgfQotICBpZiAobW9kdWxlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotICAgICAgdW5zaWduZWQgY2hhciAqc2V0OwotICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsOwotICAgICAgYmZkX3NpemVfdHlwZSBjOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAobW9kdWxlX3NpemUpOwotICAgICAgYyA9IDA7Ci0gICAgICBzZXQgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhOwotICAgICAgZm9yIChsID0gbW9kdWxlczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQl7Ci0JICAqc2V0ID0gc3RybGVuIChsLT5zdHJpbmcpOwotCSAgc3RybmNweSAoc2V0ICsgMSwgbC0+c3RyaW5nLCAqc2V0KTsKLQkgIHNldCArPSAqc2V0ICsgMTsKLQkgICsrYzsKLQl9Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgbW9kdWxlX3NlY3Rpb24sIGRhdGEsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBtb2R1bGVfc2l6ZSkpCi0JYmZkX2ZhdGFsIChfKCJtb2R1bGUgc2VjdGlvbiIpKTsKLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQgPQotCW1vZHVsZV9zZWN0aW9uLT5maWxlcG9zOwotICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMgPSBjOwotICAgIH0KLSAgaWYgKHJwY19maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChycGNfc2l6ZSk7Ci0gICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIHJwY19zaXplLCBycGNfZGF0YSkgIT0gcnBjX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIHJwY19maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHJwY19zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgcnBjX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oInJwYyBzZWN0aW9uIikpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+UlBDRGF0YU9mZnNldCA9Ci0JICAgIHJwY19zZWN0aW9uLT5maWxlcG9zOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+UlBDRGF0YUxlbmd0aCA9IHJwY19zaXplOwotCX0KLSAgICAgIGZyZWUgKGRhdGEpOwotICAgIH0KLSAgaWYgKHNoYXJlbGliX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKHNoYXJlZF9zaXplKTsKLSAgICAgIGlmIChmc2VlayAoc2hhcmVkX2RhdGEsIHNoYXJlZF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBmcmVhZCAoZGF0YSwgMSwgc2hhcmVkX3NpemUsIHNoYXJlZF9kYXRhKSAhPSBzaGFyZWRfc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgc2hhcmVsaWJfZmlsZSwKLQkJIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzaGFyZWRfc2VjdGlvbiwgZGF0YSwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHNoYXJlZF9zaXplKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJzaGFyZWQgc2VjdGlvbiIpKTsKLQl9Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRDb2RlT2Zmc2V0ID0KLQlzaGFyZWRoZHIuY29kZUltYWdlT2Zmc2V0IC0gc2hhcmVkX29mZnNldCArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkQ29kZUxlbmd0aCA9Ci0Jc2hhcmVkaGRyLmNvZGVJbWFnZVNpemU7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREYXRhT2Zmc2V0ID0KLQlzaGFyZWRoZHIuZGF0YUltYWdlT2Zmc2V0IC0gc2hhcmVkX29mZnNldCArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRGF0YUxlbmd0aCA9Ci0Jc2hhcmVkaGRyLmRhdGFJbWFnZVNpemU7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQgPQotCShzaGFyZWRoZHIucmVsb2NhdGlvbkZpeHVwT2Zmc2V0Ci0JIC0gc2hhcmVkX29mZnNldAotCSArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zKTsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cENvdW50ID0KLQlzaGFyZWRoZHIubnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQgPQotCShzaGFyZWRoZHIuZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0Ci0JIC0gc2hhcmVkX29mZnNldAotCSArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zKTsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZFB1YmxpY3NPZmZzZXQgPQotCXNoYXJlZGhkci5wdWJsaWNzT2Zmc2V0IC0gc2hhcmVkX29mZnNldCArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUHVibGljc0NvdW50ID0KLQlzaGFyZWRoZHIubnVtYmVyT2ZQdWJsaWNzOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgPQotCXNoYXJlZGhkci5kZWJ1Z0luZm9PZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZENvdW50ID0KLQlzaGFyZWRoZHIubnVtYmVyT2ZEZWJ1Z1JlY29yZHM7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCA9Ci0Jc2hhcmVkaGRyLmNvZGVTdGFydE9mZnNldDsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQgPQotCXNoYXJlZGhkci5leGl0UHJvY2VkdXJlT2Zmc2V0OwotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgfQotICBsZW4gPSBzdHJsZW4gKG91dHB1dF9maWxlKTsKLSAgaWYgKGxlbiA+IE5MTV9NT0RVTEVfTkFNRV9TSVpFIC0gMikKLSAgICBsZW4gPSBOTE1fTU9EVUxFX05BTUVfU0laRSAtIDI7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZU5hbWVbMF0gPSBsZW47Ci0KLSAgc3RybmNweSAobmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZSArIDEsIG91dHB1dF9maWxlLAotCSAgIE5MTV9NT0RVTEVfTkFNRV9TSVpFIC0gMik7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZU5hbWVbTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAxXSA9ICdcMCc7Ci0gIGZvciAobW9kbmFtZSA9IG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZU5hbWU7Ci0gICAgICAgKm1vZG5hbWUgIT0gJ1wwJzsKLSAgICAgICBtb2RuYW1lKyspCi0gICAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqbW9kbmFtZSkpCi0gICAgICAqbW9kbmFtZSA9IHRvdXBwZXIgKCptb2RuYW1lKTsKLQotICBzdHJuY3B5IChubG1fdmFyaWFibGVfaGVhZGVyIChvdXRiZmQpLT5vbGRUaHJlYWROYW1lLCAiIExPTkciLAotCSAgIE5MTV9PTERfVEhSRUFEX05BTUVfTEVOR1RIKTsKLQotICBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKG91dGJmZCktPm9mZnNldCA9IHNlY3NlYy0+ZmlsZXBvczsKLSAgbmxtX2N5Z251c19leHRfaGVhZGVyIChvdXRiZmQpLT5sZW5ndGggPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHNlY3NlYyk7Ci0KLSAgaWYgKCEgYmZkX2Nsb3NlIChvdXRiZmQpKQotICAgIGJmZF9mYXRhbCAob3V0cHV0X2ZpbGUpOwotICBpZiAoISBiZmRfY2xvc2UgKGluYmZkKSkKLSAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOwotCi0gIGlmICh1bmxpbmtfb25fZXhpdCAhPSBOVUxMKQotICAgIHVubGluayAodW5saW5rX29uX2V4aXQpOwotCi0gIHJldHVybiAwOwotfQotDAotLyogRGlzcGxheSBhIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogQ29udmVydCBhbiBvYmplY3QgZmlsZSBpbnRvIGEgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotLyogU2hvdyBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLwotCi1zdGF0aWMgdm9pZAotc2hvd191c2FnZSAoZmlsZSwgc3RhdHVzKQotICAgICBGSUxFICpmaWxlOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChmaWxlLCBfKCJcCi1Vc2FnZTogJXMgWy1kaFZdIFstSSBiZmRuYW1lXSBbLU8gYmZkbmFtZV0gWy1UIGhlYWRlci1maWxlXSBbLWwgbGlua2VyXVxuXAotICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdXG5cCi0gICAgICAgWy0taGVhZGVyLWZpbGU9ZmlsZV0gWy0tbGlua2VyPWxpbmtlcl0gWy0tZGVidWddXG5cCi0gICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl1cblwKLSAgICAgICBbaW4tZmlsZSBbb3V0LWZpbGVdXVxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKGZpbGUsIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotDAotLyogU2VsZWN0IHRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIHRoZSBpbnB1dCBhcmNoaXRlY3R1cmUsIG1hY2hpbmUsCi0gICBhbmQgZW5kaWFubmVzcy4gIFRoaXMgY2hvb3NlcyB0aGUgYXBwcm9wcmlhdGUgTkxNIHRhcmdldC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXNlbGVjdF9vdXRwdXRfZm9ybWF0IChhcmNoLCBtYWNoLCBiaWdlbmRpYW4pCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci0gICAgIGJvb2xlYW4gYmlnZW5kaWFuOwotewotICBzd2l0Y2ggKGFyY2gpCi0gICAgewotI2lmZGVmIE5MTUNPTlZfSTM4NgotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIHJldHVybiAibmxtMzItaTM4NiI7Ci0jZW5kaWYKLSNpZmRlZiBOTE1DT05WX1NQQVJDCi0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIHJldHVybiAibmxtMzItc3BhcmMiOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9BTFBIQQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICByZXR1cm4gIm5sbTMyLWFscGhhIjsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIHJldHVybiAibmxtMzItcG93ZXJwYyI7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogc3VwcG9ydCBub3QgY29tcGlsZWQgaW4gZm9yICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYXJjaCwgbWFjaCkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgICAvKiBBdm9pZCB3YXJuaW5nLiAgKi8KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQwKLS8qIFRoZSBCRkQgc2VjdGlvbnMgYXJlIGNvcGllZCBpbiB0d28gcGFzc2VzLiAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzCi0gICB0aGUgb3V0cHV0IHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgc2VjdGlvbiwgYW5kIHNldHMgdXAgdGhlIHNlY3Rpb24KLSAgIG5hbWUsIHNpemUsIGV0Yy4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9zZWN0aW9ucyAoaW5iZmQsIGluc2VjLCBkYXRhX3B0cikKLSAgICAgYmZkICppbmJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICBQVFIgZGF0YV9wdHI7Ci17Ci0gIGJmZCAqb3V0YmZkID0gKGJmZCAqKSBkYXRhX3B0cjsKLSAgZmxhZ3dvcmQgZjsKLSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLSAgYXNlY3Rpb24gKm91dHNlYzsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0gIGJmZF9zaXplX3R5cGUgYWRkOwotICBiZmRfc2l6ZV90eXBlIHNlY3NlY3NpemU7Ci0KLSAgZiA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIGluc2VjKTsKLSAgaWYgKGYgJiBTRUNfQ09ERSkKLSAgICBvdXRuYW1lID0gTkxNX0NPREVfTkFNRTsKLSAgZWxzZSBpZiAoKGYgJiBTRUNfTE9BRCkgJiYgKGYgJiBTRUNfSEFTX0NPTlRFTlRTKSkKLSAgICBvdXRuYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgZWxzZSBpZiAoZiAmIFNFQ19BTExPQykKLSAgICBvdXRuYW1lID0gTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FOwotICBlbHNlCi0gICAgb3V0bmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGluYmZkLCBpbnNlYyk7Ci0KLSAgb3V0c2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwgb3V0bmFtZSk7Ci0gIGlmIChvdXRzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvdXRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsIG91dG5hbWUpOwotICAgICAgaWYgKG91dHNlYyA9PSBOVUxMKQotCWJmZF9mYXRhbCAoXygibWFrZSBzZWN0aW9uIikpOwotICAgIH0KLQotICBpbnNlYy0+b3V0cHV0X3NlY3Rpb24gPSBvdXRzZWM7Ci0KLSAgb2Zmc2V0ID0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBvdXRzZWMpOwotICBhbGlnbiA9IDEgPDwgYmZkX3NlY3Rpb25fYWxpZ25tZW50IChpbmJmZCwgaW5zZWMpOwotICBhZGQgPSAoKG9mZnNldCArIGFsaWduIC0gMSkgJn4gKGFsaWduIC0gMSkpIC0gb2Zmc2V0OwotICBpbnNlYy0+b3V0cHV0X29mZnNldCA9IG9mZnNldCArIGFkZDsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBvdXRzZWMsCi0JCQkgICAgICAoYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBvdXRzZWMpCi0JCQkgICAgICAgKyBiZmRfc2VjdGlvbl9zaXplIChpbmJmZCwgaW5zZWMpCi0JCQkgICAgICAgKyBhZGQpKSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCBzZWN0aW9uIHNpemUiKSk7Ci0KLSAgaWYgKChiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBpbnNlYykKLSAgICAgICA+IGJmZF9zZWN0aW9uX2FsaWdubWVudCAob3V0YmZkLCBvdXRzZWMpKQotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvdXRiZmQsIG91dHNlYywKLQkJCQkgICAgICBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBpbnNlYykpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IHNlY3Rpb24gYWxpZ25tZW50IikpOwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBvdXRzZWMsCi0JCQkgICAgICAgZiB8IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBvdXRzZWMpKSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCBzZWN0aW9uIGZsYWdzIikpOwotCi0gIGJmZF9zZXRfcmVsb2MgKG91dGJmZCwgb3V0c2VjLCAoYXJlbGVudCAqKikgTlVMTCwgMCk7Ci0KLSAgLyogRm9yIGVhY2ggaW5wdXQgc2VjdGlvbiB3ZSBhbGxvY2F0ZSBzcGFjZSBmb3IgYW4gZW50cnkgaW4KLSAgICAgLm5sbXNlY3Rpb25zLiAgKi8KLSAgc2Vjc2Vjc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2Vjc2VjKTsKLSAgc2Vjc2Vjc2l6ZSArPSBzdHJsZW4gKGJmZF9zZWN0aW9uX25hbWUgKGluYmZkLCBpbnNlYykpICsgMTsKLSAgc2Vjc2Vjc2l6ZSA9IChzZWNzZWNzaXplICsgMykgJn4gMzsKLSAgc2Vjc2Vjc2l6ZSArPSA4OwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBzZWNzZWMsIHNlY3NlY3NpemUpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9ucyBzaXplIikpOwotfQotCi0vKiBDb3B5IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfc2VjdGlvbnMgKGluYmZkLCBpbnNlYywgZGF0YV9wdHIpCi0gICAgIGJmZCAqaW5iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgUFRSIGRhdGFfcHRyOwotewotICBzdGF0aWMgYmZkX3NpemVfdHlwZSBzZWNzZWNvZmYgPSAwOwotICBiZmQgKm91dGJmZCA9IChiZmQgKikgZGF0YV9wdHI7Ci0gIGNvbnN0IGNoYXIgKmlubmFtZTsKLSAgYXNlY3Rpb24gKm91dHNlYzsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBQVFIgY29udGVudHM7Ci0gIGxvbmcgcmVsb2Nfc2l6ZTsKLSAgYmZkX2J5dGUgYnVmWzRdOwotICBiZmRfc2l6ZV90eXBlIGFkZDsKLQotICBpbm5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbmJmZCwgaW5zZWMpOwotCi0gIG91dHNlYyA9IGluc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgYXNzZXJ0IChvdXRzZWMgIT0gTlVMTCk7Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoaW5zZWMpOwotCi0gIC8qIEZJWE1FOiBXaHkgYXJlIHRoZXNlIG5lY2Vzc2FyeT8gICovCi0gIGluc2VjLT5fY29va2VkX3NpemUgPSBpbnNlYy0+X3Jhd19zaXplOwotICBpbnNlYy0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGluYmZkLCBpbnNlYykgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotICAgIGNvbnRlbnRzID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRlbnRzID0geG1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGluYmZkLCBpbnNlYywgY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplKSkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGluYmZkKSk7Ci0gICAgfQotCi0gIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbmJmZCwgaW5zZWMpOwotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChpbmJmZCkpOwotICBpZiAocmVsb2Nfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipyZWxvY3M7Ci0gICAgICBsb25nIHJlbG9jX2NvdW50OwotCi0gICAgICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gICAgICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGluYmZkLCBpbnNlYywgcmVsb2NzLCBzeW1ib2xzKTsKLSAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChpbmJmZCkpOwotICAgICAgbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgJnJlbG9jcywgJnJlbG9jX2NvdW50LCAoY2hhciAqKSBjb250ZW50cywKLQkJICAgICBzaXplKTsKLQotICAgICAgLyogRklYTUU6IHJlZmVycyB0byBpbnRlcm5hbCBCRkQgZmllbGRzLiAgKi8KLSAgICAgIGlmIChvdXRzZWMtPm9yZWxvY2F0aW9uICE9IChhcmVsZW50ICoqKSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgdG90YWxfY291bnQ7Ci0JICBhcmVsZW50ICoqY29tYmluZWQ7Ci0KLQkgIHRvdGFsX2NvdW50ID0gcmVsb2NfY291bnQgKyBvdXRzZWMtPnJlbG9jX2NvdW50OwotCSAgY29tYmluZWQgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAodG90YWxfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotCSAgbWVtY3B5IChjb21iaW5lZCwgb3V0c2VjLT5vcmVsb2NhdGlvbiwKLQkJICBvdXRzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQkgIG1lbWNweSAoY29tYmluZWQgKyBvdXRzZWMtPnJlbG9jX2NvdW50LCByZWxvY3MsCi0JCSAgKHNpemVfdCkgKHJlbG9jX2NvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKSk7Ci0JICBmcmVlIChvdXRzZWMtPm9yZWxvY2F0aW9uKTsKLQkgIHJlbG9jX2NvdW50ID0gdG90YWxfY291bnQ7Ci0JICByZWxvY3MgPSBjb21iaW5lZDsKLQl9Ci0KLSAgICAgIGJmZF9zZXRfcmVsb2MgKG91dGJmZCwgb3V0c2VjLCByZWxvY3MsIHJlbG9jX2NvdW50KTsKLSAgICB9Ci0KLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIG91dHNlYywgY29udGVudHMsCi0JCQkJICAgICAgaW5zZWMtPm91dHB1dF9vZmZzZXQsIHNpemUpKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAob3V0YmZkKSk7Ci0gICAgICBmcmVlIChjb250ZW50cyk7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGlzIHNlY3Rpb24gdG8gLm5sbXNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgKFBUUikgaW5uYW1lLCBzZWNzZWNvZmYsCi0JCQkJICBzdHJsZW4gKGlubmFtZSkgKyAxKSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIpKTsKLSAgc2Vjc2Vjb2ZmICs9IHN0cmxlbiAoaW5uYW1lKSArIDE7Ci0KLSAgYWRkID0gKChzZWNzZWNvZmYgKyAzKSAmfiAzKSAtIHNlY3NlY29mZjsKLSAgaWYgKGFkZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9oX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgMCwgYnVmKTsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzZWNzZWMsIGJ1Ziwgc2Vjc2Vjb2ZmLCBhZGQpKQotCWJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOwotICAgICAgc2Vjc2Vjb2ZmICs9IGFkZDsKLSAgICB9Ci0KLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgYmZkX2hfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBvdXRzZWMtPmZpbGVwb3MsIGJ1Zik7Ci0gIGVsc2UKLSAgICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIDAsIGJ1Zik7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzZWNzZWMsIGJ1Ziwgc2Vjc2Vjb2ZmLCA0KSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIpKTsKLSAgc2Vjc2Vjb2ZmICs9IDQ7Ci0KLSAgYmZkX2hfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBzaXplLCBidWYpOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgc2Vjc2VjLCBidWYsIHNlY3NlY29mZiwgNCkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb24gY29udGVudHMiKSk7Ci0gIHNlY3NlY29mZiArPSA0OwotfQotCi0vKiBTb21lLCBwZXJoYXBzIGFsbCwgTmV0V2FyZSB0YXJnZXRzIHJlcXVpcmUgY2hhbmdpbmcgdGhlIHJlbG9jcyB1c2VkCi0gICBieSB0aGUgaW5wdXQgZm9ybWF0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCSAgICAgICBjb250ZW50c19zaXplKQotICAgICBiZmQgKm91dGJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICBhcmVsZW50ICoqKnJlbG9jc19wdHI7Ci0gICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKLSAgICAgY2hhciAqY29udGVudHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKG91dGJmZCkpCi0gICAgewotI2lmZGVmIE5MTUNPTlZfSTM4NgotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIGkzODZfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLAotCQkJICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgYWxwaGFfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLAotCQkJICAgY29udGVudHMsIGNvbnRlbnRzX3NpemUpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBwb3dlcnBjX21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwKLQkJCSAgICAgY29udGVudHMsIGNvbnRlbnRzX3NpemUpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgZGVmYXVsdF9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCi0JCQkgICAgIGNvbnRlbnRzLCBjb250ZW50c19zaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogQnkgZGVmYXVsdCBhbGwgd2UgbmVlZCB0byBkbyBmb3IgcmVsb2NzIGlzIGNoYW5nZSB0aGUgYWRkcmVzcyBieQotICAgdGhlIG91dHB1dF9vZmZzZXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1kZWZhdWx0X21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCi0JCSAgICAgICBjb250ZW50c19zaXplKQotICAgICBiZmQgKm91dGJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICBhcmVsZW50ICoqKnJlbG9jc19wdHI7Ci0gICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKLSAgICAgY2hhciAqY29udGVudHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKLXsKLSAgaWYgKGluc2VjLT5vdXRwdXRfb2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgbG9uZyByZWxvY19jb3VudDsKLSAgICAgIHJlZ2lzdGVyIGFyZWxlbnQgKipyZWxvY3M7Ci0gICAgICByZWdpc3RlciBsb25nIGk7Ci0KLSAgICAgIHJlbG9jX2NvdW50ID0gKnJlbG9jX2NvdW50X3B0cjsKLSAgICAgIHJlbG9jcyA9ICpyZWxvY3NfcHRyOwotICAgICAgZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyssIHJlbG9jcysrKQotCSgqcmVsb2NzKS0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci19Ci0MCi0jaWZkZWYgTkxNQ09OVl9JMzg2Ci0KLS8qIE5ldFdhcmUgb24gdGhlIGkzODYgc3VwcG9ydHMgYSByZXN0cmljdGVkIHNldCBvZiByZWxvY3MsIHdoaWNoIGFyZQotICAgZGlmZmVyZW50IGZyb20gdGhvc2UgdXNlZCBvbiBvdGhlciBpMzg2IHRhcmdldHMuICBUaGlzIHJvdXRpbmUKLSAgIGNvbnZlcnRzIHRoZSByZWxvY3MuICBJdCBpcywgb2J2aW91c2x5LCB2ZXJ5IHRhcmdldCBkZXBlbmRlbnQuICBBdAotICAgdGhlIG1vbWVudCwgdGhlIG5sbTMyLWkzODYgYmFja2VuZCBwZXJmb3JtcyBzaW1pbGFyIHRyYW5zbGF0aW9uczsKLSAgIGhvd2V2ZXIsIGl0IGlzIG1vcmUgcmVsaWFibGUgYW5kIGVmZmljaWVudCB0byBkbyB0aGVtIGhlcmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1faTM4Nl9wY3JlbF9ob3d0byA9Ci0gIEhPV1RPICgxLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotc3RhdGljIHZvaWQKLWkzODZfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkJICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICBsb25nIHJlbG9jX2NvdW50LCBpOwotICBhcmVsZW50ICoqcmVsb2NzOwotCi0gIHJlbG9jX2NvdW50ID0gKnJlbG9jX2NvdW50X3B0cjsKLSAgcmVsb2NzID0gKnJlbG9jc19wdHI7Ci0gIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotCi0gICAgICByZWwgPSAqcmVsb2NzKys7Ci0gICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAgICAgLyogV2UncmUgbW92aW5nIHRoZSByZWxvY3MgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0Ci0JIHNlY3Rpb24sIHNvIHdlIG11c3QgYWRqdXN0IHRoZSBhZGRyZXNzIGFjY29yZGluZ2x5LiAgKi8KLSAgICAgIGFkZHJlc3MgPSByZWwtPmFkZHJlc3M7Ci0gICAgICByZWwtPmFkZHJlc3MgKz0gaW5zZWMtPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIC8qIE5vdGUgdGhhdCBubyBzZXJpb3VzIGhhcm0gd2lsbCBlbnN1ZSBpZiB3ZSBmYWlsIHRvIGNoYW5nZSBhCi0JIHJlbG9jLiAgVGhlIGJhY2tlbmQgd2lsbCBmYWlsIHdoZW4gd3JpdGluZyBvdXQgdGhlIHJlbG9jLiAgKi8KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgcmVsb2MgaXMgd2l0aGluIHRoZSBkYXRhIHdlIGhhdmUuICBXZSB1c2Ugb25seQotCSA0IGJ5dGUgcmVsb2NzIGhlcmUsIHNvIHdlIGluc2lzdCBvbiBoYXZpbmcgNCBieXRlcy4gICovCi0gICAgICBpZiAoYWRkcmVzcyArIDQgPiBjb250ZW50c19zaXplKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBBIFBDIHJlbGF0aXZlIHJlbG9jIGVudGlyZWx5IHdpdGhpbiBhIHNpbmdsZSBzZWN0aW9uIGlzCi0JIGNvbXBsZXRlbHkgdW5uZWNlc3NhcnkuICBUaGlzIGNhbiBiZSBnZW5lcmF0ZWQgYnkgbGQgLXIuICAqLwotICAgICAgaWYgKHN5bSA9PSBpbnNlYy0+c3ltYm9sCi0JICAmJiByZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0JICAmJiAhIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCkKLQl7Ci0JICAtLSpyZWxvY19jb3VudF9wdHI7Ci0JICAtLXJlbG9jczsKLQkgIG1lbW1vdmUgKHJlbG9jcywgcmVsb2NzICsgMSwKLQkJICAgKHNpemVfdCkgKChyZWxvY19jb3VudCAtIGkpICogc2l6ZW9mIChhcmVsZW50ICopKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgYW1vdW50IHRoZSByZWxvY2F0aW9uIHdpbGwgYWRkIGluLiAgKi8KLSAgICAgIGFkZGVuZCA9IHJlbC0+YWRkZW5kICsgc3ltLT52YWx1ZTsKLQotICAgICAgLyogTmV0V2FyZSBkb2Vzbid0IHN1cHBvcnQgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3QgZGVmaW5lZAotCSBzeW1ib2xzLCBzbyB3ZSBoYXZlIHRvIGVsaW1pbmF0ZSB0aGVtIGJ5IGRvaW5nIHRoZSByZWxvY2F0aW9uCi0JIG5vdy4gIFdlIGNhbiBvbmx5IGRvIHRoaXMgaWYgdGhlIHJlbG9jIGlzIHdpdGhpbiBhIHNpbmdsZQotCSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0JICAmJiBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gaW5zZWMtPm91dHB1dF9zZWN0aW9uKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICBpZiAocmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCSAgICBhZGRlbmQgLT0gYWRkcmVzczsKLQotCSAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQkgIHZhbCArPSBhZGRlbmQ7Ci0JICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0KLQkgIC0tKnJlbG9jX2NvdW50X3B0cjsKLQkgIC0tcmVsb2NzOwotCSAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAotCQkgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gaSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTmV0V2FyZSBkb2Vzbid0IHN1cHBvcnQgcmVsb2MgYWRkZW5kcywgc28gd2UgZ2V0IHJpZCBvZiB0aGVtCi0JIGhlcmUgYnkgc2ltcGx5IGFkZGluZyB0aGVtIGludG8gdGhlIG9iamVjdCBkYXRhLiAgV2UgaGFuZGxlCi0JIHRoZSBzeW1ib2wgdmFsdWUsIGlmIGFueSwgdGhlIHNhbWUgd2F5LiAgKi8KLSAgICAgIGlmIChhZGRlbmQgIT0gMAotCSAgJiYgcmVsLT5ob3d0byAhPSBOVUxMCi0JICAmJiByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNpemUgPT0gMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0c2l6ZSA9PSAzMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0cG9zID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNyY19tYXNrID09IDB4ZmZmZmZmZmYKLQkgICYmIHJlbC0+aG93dG8tPmRzdF9tYXNrID09IDB4ZmZmZmZmZmYpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0JICB2YWwgKz0gYWRkZW5kOwotCSAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCi0JICAvKiBBZGp1c3QgdGhlIHJlbG9jIGZvciB0aGUgY2hhbmdlcyB3ZSBqdXN0IG1hZGUuICAqLwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uIChzeW0pLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIC8qIE5ldFdhcmUgdXNlcyBhIHJlbG9jIHdpdGggcGNyZWxfb2Zmc2V0IHNldC4gIFdlIGFkanVzdAotCSBwY19yZWxhdGl2ZSByZWxvY3MgYWNjb3JkaW5nbHkuICBXZSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoZQotCSBob3d0byBmaWVsZCwgc28gd2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgY3VycmVudCBvbmUgaXMKLQkgY29tcGF0aWJsZS4gIFdlIHNob3VsZCBjaGVjayB0aGF0IHNwZWNpYWxfZnVuY3Rpb24gaXMgTlVMTAotCSBoZXJlLCBidXQgYXQgdGhlIG1vbWVudCBjb2ZmLWkzODYgdXNlcyBhIHNwZWNpYWxfZnVuY3Rpb24KLQkgd2hpY2ggZG9lcyBub3QgYWZmZWN0IHdoYXQgd2UgYXJlIGRvaW5nIGhlcmUuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmICEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0Ci0JICAmJiByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNpemUgPT0gMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0c2l6ZSA9PSAzMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0cG9zID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNyY19tYXNrID09IDB4ZmZmZmZmZmYKLQkgICYmIHJlbC0+aG93dG8tPmRzdF9tYXNrID09IDB4ZmZmZmZmZmYpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIC8qIFdoZW4gcGNyZWxfb2Zmc2V0IGlzIG5vdCBzZXQsIGl0IG1lYW5zIHRoYXQgdGhlIG5lZ2F0aXZlCi0JICAgICBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB0aGUKLQkgICAgIG1lbW9yeSBsb2NhdGlvbi4gIFdlIG11c3QgYWRkIGl0IGJhY2sgaW4uICAqLwotCSAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQkgIHZhbCArPSBhZGRyZXNzOwotCSAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCi0JICAvKiBXZSBtdXN0IGNoYW5nZSB0byBhIG5ldyBob3d0by4gICovCi0JICByZWwtPmhvd3RvID0gJm5sbV9pMzg2X3BjcmVsX2hvd3RvOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBOTE1DT05WX0kzODYgKi8KLQwKLSNpZmRlZiBOTE1DT05WX0FMUEhBCi0KLS8qIE9uIHRoZSBBbHBoYSB0aGUgZmlyc3QgcmVsb2MgZm9yIGV2ZXJ5IHNlY3Rpb24gbXVzdCBiZSBhIHNwZWNpYWwKLSAgIHJlbG9jcyB3aGljaCBob2xkIHRoZSBHUCBhZGRyZXNzLiAgQWxzbywgdGhlIGZpcnN0IHJlbG9jIGluIHRoZQotICAgZmlsZSBtdXN0IGJlIGEgc3BlY2lhbCByZWxvYyB3aGljaCBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgLmxpdGEKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG0zMl9hbHBoYV9ud19ob3d0byA9Ci0gIEhPV1RPIChBTFBIQV9SX05XX1JFTE9DLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJOV19SRUxPQyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWFscGhhX21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCi0JCSAgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgcmVnaXN0ZXIgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIGxvbmcgb2xkX3JlbG9jX2NvdW50OwotICBhcmVsZW50ICoqb2xkX3JlbG9jczsKLSAgcmVnaXN0ZXIgYXJlbGVudCAqKnJlbG9jczsKLQotICBvbGRfcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOwotICBvbGRfcmVsb2NzID0gKnJlbG9jc19wdHI7Ci0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jICgob2xkX3JlbG9jX2NvdW50ICsgMykgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICAqcmVsb2NzX3B0ciA9IHJlbG9jczsKLQotICBpZiAobmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9hZGRyZXNzID09IDApCi0gICAgewotICAgICAgYmZkICppbmJmZDsKLSAgICAgIGFzZWN0aW9uICpsaXRhX3NlY3Rpb247Ci0KLSAgICAgIGluYmZkID0gaW5zZWMtPm93bmVyOwotICAgICAgbGl0YV9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCBfTElUQSk7Ci0gICAgICBpZiAobGl0YV9zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfYWRkcmVzcyA9Ci0JICAgIGJmZF9nZXRfc2VjdGlvbl92bWEgKGluYmZkLCBsaXRhX3NlY3Rpb24pOwotCSAgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9zaXplID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoaW5iZmQsIGxpdGFfc2VjdGlvbik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEF2b2lkIG91dHB1dHRpbmcgdGhpcyByZWxvYyBhZ2Fpbi4gICovCi0JICBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3MgPSA0OwotCX0KLQotICAgICAgKnJlbG9jcyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgKCpyZWxvY3MpLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgKCpyZWxvY3MpLT5hZGRyZXNzID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9hZGRyZXNzOwotICAgICAgKCpyZWxvY3MpLT5hZGRlbmQgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX3NpemUgKyAxOwotICAgICAgKCpyZWxvY3MpLT5ob3d0byA9ICZubG0zMl9hbHBoYV9ud19ob3d0bzsKLSAgICAgICsrcmVsb2NzOwotICAgICAgKysoKnJlbG9jX2NvdW50X3B0cik7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgR1AgdmFsdWUgZnJvbSBiZmQuICAqLwotICBpZiAobmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+Z3AgPT0gMCkKLSAgICBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5ncCA9Ci0gICAgICBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIChpbnNlYy0+b3duZXIpOwotCi0gICpyZWxvY3MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgKCpyZWxvY3MpLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAoKnJlbG9jcyktPmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5ncDsKLSAgKCpyZWxvY3MpLT5hZGRlbmQgPSAwOwotICAoKnJlbG9jcyktPmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOwotICArK3JlbG9jczsKLSAgKysoKnJlbG9jX2NvdW50X3B0cik7Ci0KLSAgbWVtY3B5ICgoUFRSKSByZWxvY3MsIChQVFIpIG9sZF9yZWxvY3MsCi0JICAoc2l6ZV90KSBvbGRfcmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICByZWxvY3Nbb2xkX3JlbG9jX2NvdW50XSA9IChhcmVsZW50ICopIE5VTEw7Ci0KLSAgZnJlZSAob2xkX3JlbG9jcyk7Ci0KLSAgaWYgKGluc2VjLT5vdXRwdXRfb2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgcmVnaXN0ZXIgYmZkX3NpemVfdHlwZSBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgKGJmZF9zaXplX3R5cGUpIG9sZF9yZWxvY19jb3VudDsgaSsrLCByZWxvY3MrKykKLQkoKnJlbG9jcyktPmFkZHJlc3MgKz0gaW5zZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogTkxNQ09OVl9BTFBIQSAqLwotDAotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotCi0vKiBXZSBrZWVwIGEgbGlua2VkIGxpc3Qgb2Ygc3R1YnMgd2hpY2ggd2UgbXVzdCBidWlsZC4gIEJlY2F1c2UgQkZECi0gICByZXF1aXJlcyB1cyB0byBrbm93IHRoZSBzaXplcyBvZiBhbGwgc2VjdGlvbnMgYmVmb3JlIHdlIGNhbiBzZXQgdGhlCi0gICBjb250ZW50cyBvZiBhbnksIHdlIG11c3QgZmlndXJlIG91dCB3aGljaCBzdHVicyB3ZSB3YW50IHRvIGJ1aWxkCi0gICBiZWZvcmUgd2UgY2FuIGFjdHVhbGx5IGJ1aWxkIGFueSBvZiB0aGVtLiAgKi8KLQotc3RydWN0IHBvd2VycGNfc3R1YgotewotICAvKiBOZXh0IHN0dWIgaW4gbGlua2VkIGxpc3QuICAqLwotICBzdHJ1Y3QgcG93ZXJwY19zdHViICpuZXh0OwotCi0gIC8qIFN5bWJvbCB3aG9zZSB2YWx1ZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHN0dWIuICBUaGlzIGlzIGEgc3ltYm9sCi0gICAgIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYC4nLiAgKi8KLSAgYXN5bWJvbCAqc3RhcnQ7Ci0KLSAgLyogU3ltYm9sIHdlIGFyZSBnb2luZyB0byBjcmVhdGUgYSByZWxvYyBhZ2FpbnN0LiAgVGhpcyBpcyBhIHN5bWJvbAotICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgU1RBUlQgYnV0IHdpdGhvdXQgdGhlIGxlYWRpbmcgYC4nLiAgKi8KLSAgYXN5bWJvbCAqcmVsb2M7Ci0KLSAgLyogVGhlIFRPQyBpbmRleCBmb3IgdGhpcyBzdHViLiAgVGhpcyBpcyB0aGUgaW5kZXggaW50byB0aGUgVE9DCi0gICAgIHNlY3Rpb24gYXQgd2hpY2ggdGhlIHJlbG9jIGlzIGNyZWF0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdG9jX2luZGV4OwotfTsKLQotLyogVGhlIGxpbmtlZCBsaXN0IG9mIHN0dWJzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBwb3dlcnBjX3N0dWIgKnBvd2VycGNfc3R1YnM7Ci0KLS8qIFRoaXMgaXMgd2hhdCBhIHN0dWIgbG9va3MgbGlrZS4gIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3aWxsIGdldAotICAgYWRqdXN0ZWQgd2l0aCB0aGUgY29ycmVjdCBUT0MgaW5kZXguICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwb3dlcnBjX3N0dWJfaW5zbnNbXSA9Ci17Ci0gIDB4ODE4MjAwMDAsCQkvKiBsd3oJIHIxMiwwKHIyKSAqLwotICAweDkwNDEwMDE0LAkJLyogc3R3CSByMiwyMChyMSkgKi8KLSAgMHg4MDBjMDAwMCwJCS8qIGx3egkgcjAsMChyMTIpICovCi0gIDB4ODA0YzAwMDQsCQkvKiBsd3oJIHIyLHIocjEyKSAqLwotICAweDdjMDkwM2E2LAkJLyogbXRjdHIgcjAgKi8KLSAgMHg0ZTgwMDQyMCwJCS8qIGJjdHIgKi8KLSAgMCwJCQkvKiBUcmFjZWJhY2sgdGFibGUuICAqLwotICAweGM4MDAwLAotICAwCi19OwotCi0jZGVmaW5lIFBPV0VSUENfU1RVQl9JTlNOX0NPVU5UIFwKLSAgKHNpemVvZiBwb3dlcnBjX3N0dWJfaW5zbnMgLyBzaXplb2YgcG93ZXJwY19zdHViX2luc25zWzBdKQotCi0jZGVmaW5lIFBPV0VSUENfU1RVQl9TSVpFICg0ICogUE9XRVJQQ19TVFVCX0lOU05fQ09VTlQpCi0KLS8qIEVhY2ggc3R1YiB1c2VzIGEgZm91ciBieXRlIFRPQyBlbnRyeS4gICovCi0jZGVmaW5lIFBPV0VSUENfU1RVQl9UT0NfRU5UUllfU0laRSAoNCkKLQotLyogVGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi1zdGF0aWMgYmZkX3NpemVfdHlwZSBwb3dlcnBjX2luaXRpYWxfZ290X3NpemU7Ci0KLS8qIExvb2sgZm9yIGFsbCB1bmRlZmluZWQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCBgLicsIGFuZCBwcmVwYXJlIHRvCi0gICBidWlsZCBhIHN0dWIgZm9yIGVhY2ggb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLXBvd2VycGNfYnVpbGRfc3R1YnMgKGluYmZkLCBvdXRiZmQsIHN5bWJvbHNfcHRyLCBzeW1jb3VudF9wdHIpCi0gICAgIGJmZCAqaW5iZmQ7Ci0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc3ltYm9sICoqKnN5bWJvbHNfcHRyOwotICAgICBsb25nICpzeW1jb3VudF9wdHI7Ci17Ci0gIGFzZWN0aW9uICpzdHViX3NlYzsKLSAgYXNlY3Rpb24gKmdvdF9zZWM7Ci0gIHVuc2lnbmVkIGludCBnb3RfYmFzZTsKLSAgbG9uZyBpOwotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN0dWJjb3VudDsKLQotICAvKiBNYWtlIGEgc2VjdGlvbiB0byBob2xkIHN0dWJzLiAgV2UgZG9uJ3Qgc2V0IFNFQ19IQVNfQ09OVEVOVFMgZm9yCi0gICAgIHRoZSBzZWN0aW9uIHRvIHByZXZlbnQgY29weV9zZWN0aW9ucyBmcm9tIHJlYWRpbmcgZnJvbSBpdC4gICovCi0gIHN0dWJfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoaW5iZmQsICIuc3R1YnMiKTsKLSAgaWYgKHN0dWJfc2VjID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIHN0dWJfc2VjLAotCQkJCSAgKFNFQ19DT0RFCi0JCQkJICAgfCBTRUNfUkVMT0MKLQkJCQkgICB8IFNFQ19BTExPQwotCQkJCSAgIHwgU0VDX0xPQUQpKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChpbmJmZCwgc3R1Yl9zZWMsIDIpKQotICAgIGJmZF9mYXRhbCAoIi5zdHVicyIpOwotCi0gIC8qIEdldCB0aGUgVE9DIHNlY3Rpb24sIHdoaWNoIGlzIG5hbWVkIC5nb3QuICAqLwotICBnb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCAiLmdvdCIpOwotICBpZiAoZ290X3NlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBnb3Rfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoaW5iZmQsICIuZ290Iik7Ci0gICAgICBpZiAoZ290X3NlYyA9PSAoYXNlY3Rpb24gKikgTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGluYmZkLCBnb3Rfc2VjLAotCQkJCSAgICAgIChTRUNfREFUQQotCQkJCSAgICAgICB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBnb3Rfc2VjLCAyKSkKLQliZmRfZmF0YWwgKCIuZ290Iik7Ci0gICAgfQotCi0gIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGluYmZkLCBnb3Rfc2VjKTsKLSAgZ290X2Jhc2UgPSBwb3dlcnBjX2luaXRpYWxfZ290X3NpemU7Ci0gIGdvdF9iYXNlID0gKGdvdF9iYXNlICsgMykgJn4gMzsKLQotICBzdHViY291bnQgPSAwOwotCi0gIHN5bWNvdW50ID0gKnN5bWNvdW50X3B0cjsKLSAgZm9yIChpID0gMDsgaSA8IHN5bWNvdW50OyBpKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYXN5bWJvbCAqbmV3c3ltOwotICAgICAgY2hhciAqbmV3bmFtZTsKLSAgICAgIHN0cnVjdCBwb3dlcnBjX3N0dWIgKml0ZW07Ci0KLSAgICAgIHN5bSA9ICgqc3ltYm9sc19wdHIpW2ldOwotCi0gICAgICAvKiBXZSBtdXN0IG1ha2UgYSBzdHViIGZvciBldmVyeSB1bmRlZmluZWQgc3ltYm9sIHdob3NlIG5hbWUKLQkgc3RhcnRzIHdpdGggJy4nLiAgKi8KLSAgICAgIGlmIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pWzBdICE9ICcuJwotCSAgfHwgISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE1ha2UgYSBuZXcgdW5kZWZpbmVkIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IHdpdGhvdXQKLQkgdGhlIGxlYWRpbmcgYC4nLiAgKi8KLSAgICAgIG5ld3N5bSA9IChhc3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCkpOwotICAgICAgKm5ld3N5bSA9ICpzeW07Ci0gICAgICBuZXduYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSk7Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgKyAxKTsKLSAgICAgIG5ld3N5bS0+bmFtZSA9IG5ld25hbWU7Ci0KLSAgICAgIC8qIERlZmluZSB0aGUgYC4nIHN5bWJvbCB0byBiZSBpbiB0aGUgc3R1YiBzZWN0aW9uLiAgKi8KLSAgICAgIHN5bS0+c2VjdGlvbiA9IHN0dWJfc2VjOwotICAgICAgc3ltLT52YWx1ZSA9IHN0dWJjb3VudCAqIFBPV0VSUENfU1RVQl9TSVpFOwotICAgICAgLyogV2Ugc2V0IHRoZSBCU0ZfRFlOQU1JQyBmbGFnIGhlcmUgc28gdGhhdCB3ZSBjYW4gY2hlY2sgaXQgd2hlbgotCSB3ZSBhcmUgbWFuZ2xpbmcgcmVsb2NzLiAgRklYTUU6IFRoaXMgaXMgYSBoYWNrLiAgKi8KLSAgICAgIHN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUwgfCBCU0ZfRFlOQU1JQzsKLQotICAgICAgLyogQWRkIHRoaXMgc3R1YiB0byB0aGUgbGlua2VkIGxpc3QuICAqLwotICAgICAgaXRlbSA9IChzdHJ1Y3QgcG93ZXJwY19zdHViICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHBvd2VycGNfc3R1YikpOwotICAgICAgaXRlbS0+c3RhcnQgPSBzeW07Ci0gICAgICBpdGVtLT5yZWxvYyA9IG5ld3N5bTsKLSAgICAgIGl0ZW0tPnRvY19pbmRleCA9IGdvdF9iYXNlICsgc3R1YmNvdW50ICogUE9XRVJQQ19TVFVCX1RPQ19FTlRSWV9TSVpFOwotCi0gICAgICBpdGVtLT5uZXh0ID0gcG93ZXJwY19zdHViczsKLSAgICAgIHBvd2VycGNfc3R1YnMgPSBpdGVtOwotICAgICAgCi0gICAgICArK3N0dWJjb3VudDsKLSAgICB9Ci0KLSAgaWYgKHN0dWJjb3VudCA+IDApCi0gICAgewotICAgICAgYXN5bWJvbCAqKnM7Ci0gICAgICBzdHJ1Y3QgcG93ZXJwY19zdHViICpsOwotCi0gICAgICAvKiBBZGQgdGhlIG5ldyBzeW1ib2xzIHdlIGp1c3QgY3JlYXRlZCB0byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgICpzeW1ib2xzX3B0ciA9IChhc3ltYm9sICoqKSB4cmVhbGxvYyAoKGNoYXIgKikgKnN5bWJvbHNfcHRyLAotCQkJCQkgICAgKChzeW1jb3VudCArIHN0dWJjb3VudCkKLQkJCQkJICAgICAqIHNpemVvZiAoYXN5bWJvbCkpKTsKLSAgICAgICpzeW1jb3VudF9wdHIgKz0gc3R1YmNvdW50OwotICAgICAgcyA9ICYoKnN5bWJvbHNfcHRyKVtzeW1jb3VudF07Ci0gICAgICBmb3IgKGwgPSBwb3dlcnBjX3N0dWJzOyBsICE9IChzdHJ1Y3QgcG93ZXJwY19zdHViICopIE5VTEw7IGwgPSBsLT5uZXh0KQotCSpzKysgPSBsLT5yZWxvYzsKLQotICAgICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAuc3R1YnMgc2VjdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHNpemUgb2YKLQkgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoaW5iZmQsIHN0dWJfc2VjLAotCQkJCSAgc3R1YmNvdW50ICogUE9XRVJQQ19TVFVCX1NJWkUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChpbmJmZCwgZ290X3NlYywKLQkJCQkgICAgIChnb3RfYmFzZQotCQkJCSAgICAgICsgKHN0dWJjb3VudAotCQkJCQkgKiBQT1dFUlBDX1NUVUJfVE9DX0VOVFJZX1NJWkUpKSkpCi0JYmZkX2ZhdGFsIChfKCJzdHViIHNlY3Rpb24gc2l6ZXMiKSk7Ci0gICAgfQotfQotCi0vKiBSZXNvbHZlIGFsbCB0aGUgc3R1YnMgZm9yIFBvd2VyUEMgTmV0V2FyZS4gIFdlIGZpbGwgaW4gdGhlIGNvbnRlbnRzCi0gICBvZiB0aGUgb3V0cHV0IHNlY3Rpb24sIGFuZCBjcmVhdGUgbmV3IHJlbG9jcyBpbiB0aGUgVE9DLiAgKi8KLQotc3RhdGljIHZvaWQKLXBvd2VycGNfcmVzb2x2ZV9zdHVicyAoaW5iZmQsIG91dGJmZCkKLSAgICAgYmZkICppbmJmZDsKLSAgICAgYmZkICpvdXRiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJ1ZltQT1dFUlBDX1NUVUJfU0laRV07Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgc3R1YmNvdW50OwotICBhcmVsZW50ICoqcmVsb2NzOwotICBhc2VjdGlvbiAqZ290X3NlYzsKLSAgYXJlbGVudCAqKnI7Ci0gIHN0cnVjdCBwb3dlcnBjX3N0dWIgKmw7Ci0KLSAgaWYgKHBvd2VycGNfc3R1YnMgPT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChpID0gMDsgaSA8IFBPV0VSUENfU1RVQl9JTlNOX0NPVU5UOyBpKyspCi0gICAgYmZkX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgcG93ZXJwY19zdHViX2luc25zW2ldLCBidWYgKyBpICogNCk7Ci0KLSAgZ290X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbmJmZCwgIi5nb3QiKTsKLSAgYXNzZXJ0IChnb3Rfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKTsKLSAgYXNzZXJ0IChnb3Rfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3JlbG9jYXRpb24gPT0gKGFyZWxlbnQgKiopIE5VTEwpOwotCi0gIHN0dWJjb3VudCA9IDA7Ci0gIGZvciAobCA9IHBvd2VycGNfc3R1YnM7IGwgIT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgKytzdHViY291bnQ7Ci0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChzdHViY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotCi0gIHIgPSByZWxvY3M7Ci0gIGZvciAobCA9IHBvd2VycGNfc3R1YnM7IGwgIT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gdG8gdXNlIHRoZSByaWdodCBUT0MgaW5kZXguICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgcG93ZXJwY19zdHViX2luc25zWzBdICsgbC0+dG9jX2luZGV4LCBidWYpOwotCi0gICAgICAvKiBXcml0ZSB0aGlzIHN0dWIgb3V0LiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLAotCQkJCSAgICAgIGJmZF9nZXRfc2VjdGlvbiAobC0+c3RhcnQpLAotCQkJCSAgICAgIGJ1ZiwKLQkJCQkgICAgICBsLT5zdGFydC0+dmFsdWUsCi0JCQkJICAgICAgUE9XRVJQQ19TVFVCX1NJWkUpKQotCWJmZF9mYXRhbCAoXygid3JpdGluZyBzdHViIikpOwotCi0gICAgICAvKiBDcmVhdGUgYSBuZXcgcmVsb2MgZm9yIHRoZSBUT0MgZW50cnkuICAqLwotICAgICAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZsLT5yZWxvYzsKLSAgICAgIHJlbG9jLT5hZGRyZXNzID0gbC0+dG9jX2luZGV4ICsgZ290X3NlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSAwOwotICAgICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChpbmJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJCQkgICAgICAKLSAgICAgICpyKysgPSByZWxvYzsKLSAgICB9Ci0KLSAgYmZkX3NldF9yZWxvYyAob3V0YmZkLCBnb3Rfc2VjLT5vdXRwdXRfc2VjdGlvbiwgcmVsb2NzLCBzdHViY291bnQpOwotfQotCi0vKiBBZGp1c3QgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciBQb3dlclBDIE5ldFdhcmUuICBXZSBkbyBub3Qgb3V0cHV0Ci0gICBUT0MgcmVsb2NhdGlvbnMuICBUaGUgb2JqZWN0IGNvZGUgYWxyZWFkeSBjb250YWlucyB0aGUgb2Zmc2V0IGZyb20KLSAgIHRoZSBUT0MgcG9pbnRlci4gIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIFRPQyByZWdpc3RlciwKLSAgIHIyLCB3aWxsIGJlIHNldCB0byB0aGUgY29ycmVjdCBUT0MgdmFsdWUsIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yCi0gICBhbnkgZnVydGhlciByZWxvYy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXBvd2VycGNfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkJICAgICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIHJlZ2lzdGVyIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICByZWxvY19ob3d0b190eXBlICp0b2NfaG93dG87Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0gIHJlZ2lzdGVyIGFyZWxlbnQgKipyZWxvY3M7Ci0gIHJlZ2lzdGVyIGxvbmcgaTsKLQotICB0b2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGluc2VjLT5vd25lciwgQkZEX1JFTE9DX1BQQ19UT0MxNik7Ci0gIGlmICh0b2NfaG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICBhYm9ydCAoKTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSAuZ290IHNlY3Rpb24sIGNsZWFyIG91dCBhbGwgdGhlIGNvbnRlbnRzIGJleW9uZAotICAgICB0aGUgaW5pdGlhbCBzaXplLiAgV2UgbXVzdCBkbyB0aGlzIGhlcmUgYmVjYXVzZSBjb3B5X3NlY3Rpb25zIGlzCi0gICAgIGdvaW5nIHRvIHdyaXRlIG91dCB3aGF0ZXZlciB3ZSByZXR1cm4gaW4gdGhlIGNvbnRlbnRzIGZpZWxkLiAgKi8KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGluc2VjLT5vd25lciwgaW5zZWMpLCAiLmdvdCIpID09IDApCi0gICAgbWVtc2V0IChjb250ZW50cyArIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZSwgMCwKLQkgICAgKHNpemVfdCkgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jIChpbnNlYykKLQkJICAgICAgLSBwb3dlcnBjX2luaXRpYWxfZ290X3NpemUpKTsKLQotICByZWxvY19jb3VudCA9ICpyZWxvY19jb3VudF9wdHI7Ci0gIHJlbG9jcyA9ICpyZWxvY3NfcHRyOwotICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWw7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBiZmRfdm1hIHN5bV92YWx1ZTsKLQotICAgICAgcmVsID0gKnJlbG9jcysrOwotICAgICAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgICAgIC8qIENvbnZlcnQgYW55IHJlbG9jcyBhZ2FpbnN0IHRoZSAuYnNzIHNlY3Rpb24gaW50byByZWxvY3MKLSAgICAgICAgIGFnYWluc3QgdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dGJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSwKLQkJICBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpID09IDApCi0JewotCSAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0KLQkgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLAotCQkJCQkgICAgIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCSAgaWYgKGRhdGFzZWMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHJlbC0+YWRkZW5kICs9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRiZmQsCi0JCQkJCQkgICBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JCQkgICAgICArIHN5bS0+dmFsdWUpOwotCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBkYXRhc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQkgICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2UgbXVzdCBiZSBhYmxlIHRvIHJlc29sdmUgYWxsIFBDIHJlbGF0aXZlIHJlbG9jcyBhdCB0aGlzCi0JIHBvaW50LiAgSWYgd2UgZ2V0IGEgYnJhbmNoIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2UgYnVpbGQgYQotCSBzdHViLCBzaW5jZSBOZXRXYXJlIHdpbGwgcmVzb2x2ZSB1bmRlZmluZWQgc3ltYm9scyBpbnRvIGEKLQkgcG9pbnRlciB0byBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlKQotCXsKLQkgIC8qIFRoaXMgY2hlY2sgZm9yIHdoZXRoZXIgYSBzeW1ib2wgaXMgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcwotCSAgICAgdGhlIHJlbG9jIHdpbGwgYmUgd3JvbmcgaWYgdGhlcmUgaXMgYSBQQyByZWxhdGl2ZSByZWxvYwotCSAgICAgYmV0d2VlbiB0d28gc2VjdGlvbnMgYm90aCBvZiB3aGljaCB3ZXJlIHBsYWNlZCBpbiB0aGUKLQkgICAgIHNhbWUgb3V0cHV0IHNlY3Rpb24uICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgIT0gaW5zZWMtPm91dHB1dF9zZWN0aW9uKQotCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlc29sdmVkIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgJXNcbiIpLAotCQkgICAgIHByb2dyYW1fbmFtZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIGFzc2VydCAocmVsLT5ob3d0by0+c2l6ZSA9PSAyICYmIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCk7Ci0JICAgICAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOwotCSAgICAgIHZhbCA9ICgodmFsICZ+IHJlbC0+aG93dG8tPmRzdF9tYXNrKQotCQkgICAgIHwgKCgodmFsICYgcmVsLT5ob3d0by0+c3JjX21hc2spCi0JCQkgKyAoc3ltLT52YWx1ZSAtIHJlbC0+YWRkcmVzcykKLQkJCSArIHJlbC0+YWRkZW5kKQotCQkJJiByZWwtPmhvd3RvLT5kc3RfbWFzaykpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIHN0dWJiZWQgc3ltYm9sIGFuZCB0aGUKLQkJIG5leHQgaW5zdHJ1Y3Rpb24gaXMKLQkJICAgICBjcm9yIDMxLDMxLDMxCi0JCSB0aGVuIHdlIHJlcGxhY2UgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gd2l0aAotCQkgICAgIGx3eiAgcjIsMjAocjEpCi0JCSBUaGlzIHJlbG9hZHMgdGhlIFRPQyBwb2ludGVyIGFmdGVyIGEgc3R1YiBjYWxsLiAgKi8KLQkgICAgICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKVswXSA9PSAnLicKLQkJICAmJiAoc3ltLT5mbGFncyAmIEJTRl9EWU5BTUlDKSAhPSAwCi0JCSAgJiYgKGJmZF9nZXRfMzIgKG91dGJmZCwKLQkJCQkgIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyArIDQpCi0JCSAgICAgID09IDB4NGZmZmZiODIpKSAvKiBjcm9yIDMxLDMxLDMxICovCi0JCWJmZF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIDB4ODA0MTAwMTQsIC8qIGx3eiByMiwyMChyMSkgKi8KLQkJCSAgICAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MgKyA0KTsKLQotCSAgICAgIC0tKnJlbG9jX2NvdW50X3B0cjsKLQkgICAgICAtLXJlbG9jczsKLQkgICAgICBtZW1tb3ZlIChyZWxvY3MsIHJlbG9jcyArIDEsCi0JCSAgICAgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gMSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2hlbiBjb25zaWRlcmluZyBhIFRPQyByZWxvYywgd2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSB0aGUKLQkgc3ltYm9sIHZhbHVlLiAgVGhlIHN5bWJvbCB3aWxsIGJlIHN0YXJ0IG9mIHRoZSBUT0Mgc2VjdGlvbgotCSAod2hpY2ggaXMgbmFtZWQgLmdvdCkuICBXZSBkbyB3YW50IHRvIGluY2x1ZGUgdGhlIGFkZGVuZC4gICovCi0gICAgICBpZiAocmVsLT5ob3d0byA9PSB0b2NfaG93dG8pCi0Jc3ltX3ZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQlzeW1fdmFsdWUgPSBzeW0tPnZhbHVlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIHdpdGggYSB2YWx1ZSwgb3IKLQkgdGhlcmUgaXMgYSByZWxvYyBhZGRlbmQsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhZGRlbmQgaW4gdGhlCi0JIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgIGlmIChzeW1fdmFsdWUgKyByZWwtPmFkZGVuZCAhPSAwKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICBzd2l0Y2ggKHJlbC0+aG93dG8tPnNpemUpCi0JICAgIHsKLQkgICAgY2FzZSAxOgotCSAgICAgIHZhbCA9IGJmZF9nZXRfMTYgKG91dGJmZCwKLQkJCQkoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOwotCSAgICAgIHZhbCA9ICgodmFsICZ+IHJlbC0+aG93dG8tPmRzdF9tYXNrKQotCQkgICAgIHwgKCgodmFsICYgcmVsLT5ob3d0by0+c3JjX21hc2spCi0JCQkgKyBzeW1fdmFsdWUKLQkJCSArIHJlbC0+YWRkZW5kKQotCQkJJiByZWwtPmhvd3RvLT5kc3RfbWFzaykpOwotCSAgICAgIGlmICgoYmZkX3NpZ25lZF92bWEpIHZhbCA8IC0gMHg4MDAwCi0JCSAgfHwgKGJmZF9zaWduZWRfdm1hKSB2YWwgPj0gMHg4MDAwKQotCQlmcHJpbnRmIChzdGRlcnIsCi0JCQkgXygiJXM6IG92ZXJmbG93IHdoZW4gYWRqdXN0aW5nIHJlbG9jYXRpb24gYWdhaW5zdCAlc1xuIiksCi0JCQkgcHJvZ3JhbV9uYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKLQkgICAgICBiZmRfcHV0XzE2IChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDI6Ci0JICAgICAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLAotCQkJCShiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgdmFsID0gKCh2YWwgJn4gcmVsLT5ob3d0by0+ZHN0X21hc2spCi0JCSAgICAgfCAoKCh2YWwgJiByZWwtPmhvd3RvLT5zcmNfbWFzaykKLQkJCSArIHN5bV92YWx1ZQotCQkJICsgcmVsLT5hZGRlbmQpCi0JCQkmIHJlbC0+aG93dG8tPmRzdF9tYXNrKSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCi0JICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPnN5bWJvbF9wdHJfcHRyOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogTm93IHRoYXQgd2UgaGF2ZSBpbmNvcnBvcmF0ZWQgdGhlIGFkZGVuZCwgcmVtb3ZlIGFueSBUT0MKLQkgcmVsb2NzLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvID09IHRvY19ob3d0bykKLQl7Ci0JICAtLSpyZWxvY19jb3VudF9wdHI7Ci0JICAtLXJlbG9jczsKLQkgIG1lbW1vdmUgKHJlbG9jcywgcmVsb2NzICsgMSwKLQkJICAgKHNpemVfdCkgKChyZWxvY19jb3VudCAtIGkpICogc2l6ZW9mIChhcmVsZW50ICopKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHJlbC0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBOTE1DT05WX1BPV0VSUEMgKi8KLQwKLS8qIE5hbWUgb2YgbGlua2VyLiAgKi8KLSNpZm5kZWYgTERfTkFNRQotI2RlZmluZSBMRF9OQU1FICJsZCIKLSNlbmRpZgotCi0vKiBUZW1wb3JhcnkgZmlsZSBuYW1lIGJhc2UuICAqLwotc3RhdGljIGNoYXIgKnRlbXBfZmlsZW5hbWU7Ci0KLS8qIFRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgc2V2ZXJhbCBpbnB1dCBmaWxlcy4gIEludm9rZSB0aGUgbGlua2VyIHRvCi0gICBsaW5rIHRoZW0gYWxsIHRvZ2V0aGVyLCBhbmQgY29udmVydCBhbmQgZGVsZXRlIHRoZSByZXN1bHRpbmcgb3V0cHV0Ci0gICBmaWxlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbGlua19pbnB1dHMgKGlucHV0cywgbGQpCi0gICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqaW5wdXRzOwotICAgICBjaGFyICpsZDsKLXsKLSAgc2l6ZV90IGM7Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqcTsKLSAgY2hhciAqKmFyZ3Y7Ci0gIHNpemVfdCBpOwotICBpbnQgcGlkOwotICBpbnQgc3RhdHVzOwotICBjaGFyICplcnJmbXQ7Ci0gIGNoYXIgKmVycmFyZzsKLQotICBjID0gMDsKLSAgZm9yIChxID0gaW5wdXRzOyBxICE9IE5VTEw7IHEgPSBxLT5uZXh0KQotICAgICsrYzsKLQotICBhcmd2ID0gKGNoYXIgKiopIGFsbG9jYSAoKGMgKyA1KSAqIHNpemVvZihjaGFyICopKTsKLQotI2lmbmRlZiBfX01TRE9TX18KLSAgaWYgKGxkID09IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqcDsKLQotICAgICAgLyogRmluZCB0aGUgbGlua2VyIHRvIGludm9rZSBiYXNlZCBvbiBob3cgbmxtY29udiB3YXMgcnVuLiAgKi8KLSAgICAgIHAgPSBwcm9ncmFtX25hbWUgKyBzdHJsZW4gKHByb2dyYW1fbmFtZSk7Ci0gICAgICB3aGlsZSAocCAhPSBwcm9ncmFtX25hbWUpCi0JewotCSAgaWYgKHBbLTFdID09ICcvJykKLQkgICAgewotCSAgICAgIGxkID0gKGNoYXIgKikgeG1hbGxvYyAocCAtIHByb2dyYW1fbmFtZSArIHN0cmxlbiAoTERfTkFNRSkgKyAxKTsKLQkgICAgICBtZW1jcHkgKGxkLCBwcm9ncmFtX25hbWUsIHAgLSBwcm9ncmFtX25hbWUpOwotCSAgICAgIHN0cmNweSAobGQgKyAocCAtIHByb2dyYW1fbmFtZSksIExEX05BTUUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAtLXA7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIGlmIChsZCA9PSBOVUxMKQotICAgIGxkID0gKGNoYXIgKikgTERfTkFNRTsKLQotICB0ZW1wX2ZpbGVuYW1lID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLQotICB1bmxpbmtfb25fZXhpdCA9IHhtYWxsb2MgKHN0cmxlbiAodGVtcF9maWxlbmFtZSkgKyAzKTsKLSAgc3ByaW50ZiAodW5saW5rX29uX2V4aXQsICIlcy5PIiwgdGVtcF9maWxlbmFtZSk7Ci0KLSAgYXJndlswXSA9IGxkOwotICBhcmd2WzFdID0gKGNoYXIgKikgIi1VciI7Ci0gIGFyZ3ZbMl0gPSAoY2hhciAqKSAiLW8iOwotICBhcmd2WzNdID0gdW5saW5rX29uX2V4aXQ7Ci0gIGkgPSA0OwotICBmb3IgKHEgPSBpbnB1dHM7IHEgIT0gTlVMTDsgcSA9IHEtPm5leHQsIGkrKykKLSAgICBhcmd2W2ldID0gcS0+c3RyaW5nOwotICBhcmd2W2ldID0gTlVMTDsKLQotICBpZiAoZGVidWcpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgYXJndltpXSAhPSBOVUxMOyBpKyspCi0JZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgYXJndltpXSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLQotICBwaWQgPSBwZXhlY3V0ZSAobGQsIGFyZ3YsIHByb2dyYW1fbmFtZSwgKGNoYXIgKikgTlVMTCwgJmVycmZtdCwgJmVycmFyZywKLQkJICBQRVhFQ1VURV9TRUFSQ0ggfCBQRVhFQ1VURV9PTkUpOwotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGV4ZWN1dGlvbiBvZiAlcyBmYWlsZWQ6ICIpLCBwcm9ncmFtX25hbWUsIGxkKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgZXJyZm10LCBlcnJhcmcpOwotICAgICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKHB3YWl0IChwaWQsICZzdGF0dXMsIDApIDwgMCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJwd2FpdCIpOwotICAgICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IEV4ZWN1dGlvbiBvZiAlcyBmYWlsZWRcbiIpLCBwcm9ncmFtX25hbWUsIGxkKTsKLSAgICAgIHVubGluayAodW5saW5rX29uX2V4aXQpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHJldHVybiB1bmxpbmtfb25fZXhpdDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25sbWNvbnYuaCBiL2JpbnV0aWxzL25sbWNvbnYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyYTU1Ny4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ubG1jb252LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKiBubG1jb252LmggLS0gaGVhZGVyIGZpbGUgZm9yIE5MTSBjb252ZXJzaW9uIHByb2dyYW0KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgYmZkLmgsIG5sbS9jb21tb24uaCBhbmQgbmxtL2ludGVybmFsLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcwotICAgZmlsZS4gICovCi0KLS8qIEEgbGlua2VkIGxpc3Qgb2Ygc3RyaW5ncy4gICovCi0KLXN0cnVjdCBzdHJpbmdfbGlzdAotewotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKnN0cmluZzsKLX07Ci0KLS8qIFRoZSBOTE0gaGVhZGVyIHBhcnNlciBpbiBubG1oZWFkZXIueSBzdG9yZXMgaW5mb3JtYXRpb24gaW4gdGhlCi0gICBmb2xsb3dpbmcgdmFyaWFibGVzLiAgKi8KLQotZXh0ZXJuIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmZpeGVkX2hkcjsKLWV4dGVybiBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyICp2YXJfaGRyOwotZXh0ZXJuIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlciAqdmVyc2lvbl9oZHI7Ci1leHRlcm4gTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgKmNvcHlyaWdodF9oZHI7Ci1leHRlcm4gTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciAqZXh0ZW5kZWRfaGRyOwotCi0vKiBQcm9jZWR1cmUgbmFtZWQgYnkgQ0hFQ0suICAqLwotZXh0ZXJuIGNoYXIgKmNoZWNrX3Byb2NlZHVyZTsKLS8qIEZpbGUgbmFtZWQgYnkgQ1VTVE9NLiAgKi8KLWV4dGVybiBjaGFyICpjdXN0b21fZmlsZTsKLS8qIFdoZXRoZXIgdG8gZ2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIChERUJVRykuICAqLwotZXh0ZXJuIGJvb2xlYW4gZGVidWdfaW5mbzsKLS8qIFByb2NlZHVyZSBuYW1lZCBieSBFWElULiAgKi8KLWV4dGVybiBjaGFyICpleGl0X3Byb2NlZHVyZTsKLS8qIEV4cG9ydGVkIHN5bWJvbHMgKEVYUE9SVCkuICAqLwotZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqZXhwb3J0X3N5bWJvbHM7Ci0vKiBMaXN0IG9mIGZpbGVzIGZyb20gSU5QVVQuICAqLwotZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqaW5wdXRfZmlsZXM7Ci0vKiBNYXAgZmlsZSBuYW1lIChNQVAsIEZVTExNQVApLiAgKi8KLWV4dGVybiBjaGFyICptYXBfZmlsZTsKLS8qIFdoZXRoZXIgYSBmdWxsIG1hcCBoYXMgYmVlbiByZXF1ZXN0ZWQgKEZVTExNQVApLiAgKi8KLWV4dGVybiBib29sZWFuIGZ1bGxfbWFwOwotLyogRmlsZSBuYW1lZCBieSBIRUxQLiAgKi8KLWV4dGVybiBjaGFyICpoZWxwX2ZpbGU7Ci0vKiBJbXBvcnRlZCBzeW1ib2xzIChJTVBPUlQpLiAgKi8KLWV4dGVybiBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmltcG9ydF9zeW1ib2xzOwotLyogRmlsZSBuYW1lZCBieSBNRVNTQUdFUy4gICovCi1leHRlcm4gY2hhciAqbWVzc2FnZV9maWxlOwotLyogQXV0b2xvYWQgbW9kdWxlIGxpc3QgKE1PRFVMRSkuICAqLwotZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqbW9kdWxlczsKLS8qIEZpbGUgbmFtZWQgYnkgT1VUUFVULiAgKi8KLWV4dGVybiBjaGFyICpvdXRwdXRfZmlsZTsKLS8qIEZpbGUgbmFtZWQgYnkgU0hBUkVMSUIuICAqLwotZXh0ZXJuIGNoYXIgKnNoYXJlbGliX2ZpbGU7Ci0vKiBTdGFydCBwcm9jZWR1cmUgbmFtZSAoU1RBUlQpLiAgKi8KLWV4dGVybiBjaGFyICpzdGFydF9wcm9jZWR1cmU7Ci0vKiBWRVJCT1NFLiAgKi8KLWV4dGVybiBib29sZWFuIHZlcmJvc2U7Ci0vKiBSUEMgZGVzY3JpcHRpb24gZmlsZSAoWERDREFUQSkuICAqLwotZXh0ZXJuIGNoYXIgKnJwY19maWxlOwotCi0vKiBUaGUgbnVtYmVyIG9mIHNlcmlvdXMgcGFyc2UgZXJyb3JzLiAgKi8KLWV4dGVybiBpbnQgcGFyc2VfZXJyb3JzOwotCi0vKiBUaGUgcGFyc2VyLiAgKi8KLWV4dGVybiBpbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRlbGwgdGhlIGxleGVyIHdoYXQgZmlsZSB0byByZWFkLiAgKi8KLWV4dGVybiBib29sZWFuIG5sbWxleF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbmxtaGVhZGVyLnkgYi9iaW51dGlscy9ubG1oZWFkZXIueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxZTIyYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ubG1oZWFkZXIueQorKysgL2Rldi9udWxsCkBAIC0xLDk3OCArMCwwIEBACi0ley8qIG5sbWhlYWRlci55IC0gcGFyc2UgTkxNIGhlYWRlciBzcGVjaWZpY2F0aW9uIGtleXdvcmRzLgotICAgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgYmlzb24gZmlsZSBwYXJzZXMgdGhlIGNvbW1hbmRzIHJlY29nbml6ZWQgYnkgdGhlIE5ldFdhcmUgTkxNCi0gICBsaW5rZXIsIGV4Y2VwdCBmb3IgbGlzdHMgb2Ygb2JqZWN0IGZpbGVzLiAgSXQgc3RvcmVzIHRoZQotICAgaW5mb3JtYXRpb24gaW4gZ2xvYmFsIHZhcmlhYmxlcy4KLQotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIE5ldFdhcmUgVG9vbAotICAgTWFrZXIgU3BlY2lmaWNhdGlvbiBtYW51YWwsIGVkaXRpb24gMS4wLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgIm5sbS9jb21tb24uaCIKLSNpbmNsdWRlICJubG0vaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJubG1jb252LmgiCi0KLS8qIEluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgc3RydWN0dXJlcyBwb2ludGVkIHRvIGJ5IHRoZXNlCi0gICB2YXJpYWJsZXMuICAqLwotCi1ObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICpmaXhlZF9oZHI7Ci1ObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyICp2YXJfaGRyOwotTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyICp2ZXJzaW9uX2hkcjsKLU5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyICpjb3B5cmlnaHRfaGRyOwotTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciAqZXh0ZW5kZWRfaGRyOwotCi0vKiBQcm9jZWR1cmUgbmFtZWQgYnkgQ0hFQ0suICAqLwotY2hhciAqY2hlY2tfcHJvY2VkdXJlOwotLyogRmlsZSBuYW1lZCBieSBDVVNUT00uICAqLwotY2hhciAqY3VzdG9tX2ZpbGU7Ci0vKiBXaGV0aGVyIHRvIGdlbmVyYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAoREVCVUcpLiAgKi8KLWJvb2xlYW4gZGVidWdfaW5mbzsKLS8qIFByb2NlZHVyZSBuYW1lZCBieSBFWElULiAgKi8KLWNoYXIgKmV4aXRfcHJvY2VkdXJlOwotLyogRXhwb3J0ZWQgc3ltYm9scyAoRVhQT1JUKS4gICovCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QgKmV4cG9ydF9zeW1ib2xzOwotLyogTGlzdCBvZiBmaWxlcyBmcm9tIElOUFVULiAgKi8KLXN0cnVjdCBzdHJpbmdfbGlzdCAqaW5wdXRfZmlsZXM7Ci0vKiBNYXAgZmlsZSBuYW1lIChNQVAsIEZVTExNQVApLiAgKi8KLWNoYXIgKm1hcF9maWxlOwotLyogV2hldGhlciBhIGZ1bGwgbWFwIGhhcyBiZWVuIHJlcXVlc3RlZCAoRlVMTE1BUCkuICAqLwotYm9vbGVhbiBmdWxsX21hcDsKLS8qIEZpbGUgbmFtZWQgYnkgSEVMUC4gICovCi1jaGFyICpoZWxwX2ZpbGU7Ci0vKiBJbXBvcnRlZCBzeW1ib2xzIChJTVBPUlQpLiAgKi8KLXN0cnVjdCBzdHJpbmdfbGlzdCAqaW1wb3J0X3N5bWJvbHM7Ci0vKiBGaWxlIG5hbWVkIGJ5IE1FU1NBR0VTLiAgKi8KLWNoYXIgKm1lc3NhZ2VfZmlsZTsKLS8qIEF1dG9sb2FkIG1vZHVsZSBsaXN0IChNT0RVTEUpLiAgKi8KLXN0cnVjdCBzdHJpbmdfbGlzdCAqbW9kdWxlczsKLS8qIEZpbGUgbmFtZWQgYnkgT1VUUFVULiAgKi8KLWNoYXIgKm91dHB1dF9maWxlOwotLyogRmlsZSBuYW1lZCBieSBTSEFSRUxJQi4gICovCi1jaGFyICpzaGFyZWxpYl9maWxlOwotLyogU3RhcnQgcHJvY2VkdXJlIG5hbWUgKFNUQVJUKS4gICovCi1jaGFyICpzdGFydF9wcm9jZWR1cmU7Ci0vKiBWRVJCT1NFLiAgKi8KLWJvb2xlYW4gdmVyYm9zZTsKLS8qIFJQQyBkZXNjcmlwdGlvbiBmaWxlIChYRENEQVRBKS4gICovCi1jaGFyICpycGNfZmlsZTsKLQotLyogVGhlIG51bWJlciBvZiBzZXJpb3VzIGVycm9ycyB0aGF0IGhhdmUgb2NjdXJyZWQuICAqLwotaW50IHBhcnNlX2Vycm9yczsKLQotLyogVGhlIGN1cnJlbnQgc3ltYm9sIHByZWZpeCB3aGVuIHJlYWRpbmcgYSBsaXN0IG9mIGltcG9ydCBvciBleHBvcnQKLSAgIHN5bWJvbHMuICAqLwotc3RhdGljIGNoYXIgKnN5bWJvbF9wcmVmaXg7Ci0KLS8qIFBhcnNlciBlcnJvciBtZXNzYWdlIGhhbmRsZXIuICAqLwotI2RlZmluZSB5eWVycm9yKG1zZykgbmxtaGVhZGVyX2Vycm9yIChtc2cpOwotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBubG1sZXhfZmlsZV9wdXNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtbGV4X2ZpbGVfb3BlbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgbmxtbGV4X2J1Zl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyIG5sbWxleF9idWZfYWRkIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGxvbmcgbmxtbGV4X2dldF9udW1iZXIgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBubG1oZWFkZXJfaWRlbnRpZnkgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbmxtaGVhZGVyX3dhcm4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIG5sbWhlYWRlcl9lcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiBzdHJpbmdfbGlzdF9jb25zIFBBUkFNUyAoKGNoYXIgKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqKSk7Ci1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICogc3RyaW5nX2xpc3RfYXBwZW5kIFBBUkFNUyAoKHN0cnVjdCBzdHJpbmdfbGlzdCAqLAotCQkJCQkJCXN0cnVjdCBzdHJpbmdfbGlzdCAqKSk7Ci1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICogc3RyaW5nX2xpc3RfYXBwZW5kMSBQQVJBTVMgKChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiwKLQkJCQkJCQkgY2hhciAqKSk7Ci1zdGF0aWMgY2hhciAqeHN0cmR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotJX0KLQotJXVuaW9uCi17Ci0gIGNoYXIgKnN0cmluZzsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpsaXN0OwotfTsKLQotLyogVGhlIHJlc2VydmVkIHdvcmRzLiAgKi8KLQotJXRva2VuIENIRUNLIENPREVTVEFSVCBDT1BZUklHSFQgQ1VTVE9NIERBVEUgREVCVUcgREVTQ1JJUFRJT04gRVhJVAotJXRva2VuIEVYUE9SVCBGTEFHX09OIEZMQUdfT0ZGIEZVTExNQVAgSEVMUCBJTVBPUlQgSU5QVVQgTUFQIE1FU1NBR0VTCi0ldG9rZW4gTU9EVUxFIE1VTFRJUExFIE9TX0RPTUFJTiBPVVRQVVQgUFNFVURPUFJFRU1QVElPTiBSRUVOVFJBTlQKLSV0b2tlbiBTQ1JFRU5OQU1FIFNIQVJFTElCIFNUQUNLIFNUQVJUIFNZTkNIUk9OSVpFCi0ldG9rZW4gVEhSRUFETkFNRSBUWVBFIFZFUkJPU0UgVkVSU0lPTksgWERDREFUQQotCi0vKiBBcmd1bWVudHMuICAqLwotCi0ldG9rZW4gPHN0cmluZz4gU1RSSU5HCi0ldG9rZW4gPHN0cmluZz4gUVVPVEVEX1NUUklORwotCi0vKiBUeXBlZCBub24tdGVybWluYWxzLiAgKi8KLSV0eXBlIDxsaXN0PiBzeW1ib2xfbGlzdF9vcHQgc3ltYm9sX2xpc3Qgc3RyaW5nX2xpc3QKLSV0eXBlIDxzdHJpbmc+IHN5bWJvbAotCi0lJQotCi0vKiBLZXl3b3JkcyBtdXN0IHN0YXJ0IGluIHRoZSBsZWZ0bW9zdCBjb2x1bW4gb2YgdGhlIGZpbGUuICBBcmd1bWVudHMKLSAgIG1heSBhcHBlYXIgYW55d2hlcmUgZWxzZS4gIFRoZSBsZXhlciB1c2VzIHRoaXMgdG8gZGV0ZXJtaW5lIHdoYXQKLSAgIHRva2VuIHRvIHJldHVybiwgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpdCBoZXJlLiAgKi8KLQotLyogVGhlIGVudGlyZSBmaWxlIGlzIGp1c3QgYSBsaXN0IG9mIGNvbW1hbmRzLiAgKi8KLQotZmlsZToJCi0JICBjb21tYW5kcwotCTsKLQotLyogQSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIGNvbW1hbmRzLiAgKi8KLQotY29tbWFuZHM6Ci0JICAvKiBNYXkgYmUgZW1wdHkuICAqLwotCXwgY29tbWFuZCBjb21tYW5kcwotCTsKLQotLyogQSBzaW5nbGUgY29tbWFuZC4gIFRoZXJlIGlzIHdoZXJlIG1vc3Qgb2YgdGhlIHdvcmsgdGFrZXMgcGxhY2UuICAqLwotCi1jb21tYW5kOgotCSAgQ0hFQ0sgU1RSSU5HCi0JICB7Ci0JICAgIGNoZWNrX3Byb2NlZHVyZSA9ICQyOwotCSAgfQotCXwgQ09ERVNUQVJUIFNUUklORwotCSAgewotCSAgICBubG1oZWFkZXJfd2FybiAoXygiQ09ERVNUQVJUIGlzIG5vdCBpbXBsZW1lbnRlZDsgc29ycnkiKSwgLTEpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBDT1BZUklHSFQgUVVPVEVEX1NUUklORwotCSAgewotCSAgICBpbnQgbGVuOwotCi0JICAgIHN0cm5jcHkgKGNvcHlyaWdodF9oZHItPnN0YW1wLCAiQ29QeVJpR2hUPSIsIDEwKTsKLQkgICAgbGVuID0gc3RybGVuICgkMik7Ci0JICAgIGlmIChsZW4gPj0gTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEgpCi0JICAgICAgewotCQlubG1oZWFkZXJfd2FybiAoXygiY29weXJpZ2h0IHN0cmluZyBpcyB0b28gbG9uZyIpLAotCQkJCU5MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RIIC0gMSk7Ci0JCWxlbiA9IE5MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RIIC0gMTsKLQkgICAgICB9Ci0JICAgIGNvcHlyaWdodF9oZHItPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggPSBsZW47Ci0JICAgIHN0cm5jcHkgKGNvcHlyaWdodF9oZHItPmNvcHlyaWdodE1lc3NhZ2UsICQyLCBsZW4pOwotCSAgICBjb3B5cmlnaHRfaGRyLT5jb3B5cmlnaHRNZXNzYWdlW2xlbl0gPSAnXDAnOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBDVVNUT00gU1RSSU5HCi0JICB7Ci0JICAgIGN1c3RvbV9maWxlID0gJDI7Ci0JICB9Ci0JfCBEQVRFIFNUUklORyBTVFJJTkcgU1RSSU5HCi0JICB7Ci0JICAgIC8qIFdlIGRvbid0IHNldCB0aGUgdmVyc2lvbiBzdGFtcCBoZXJlLCBiZWNhdXNlIHdlIHVzZSB0aGUKLQkgICAgICAgdmVyc2lvbiBzdGFtcCB0byBkZXRlY3Qgd2hldGhlciB0aGUgcmVxdWlyZWQgVkVSU0lPTgotCSAgICAgICBrZXl3b3JkIHdhcyBnaXZlbi4gICovCi0JICAgIHZlcnNpb25faGRyLT5tb250aCA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIHZlcnNpb25faGRyLT5kYXkgPSBubG1sZXhfZ2V0X251bWJlciAoJDMpOwotCSAgICB2ZXJzaW9uX2hkci0+eWVhciA9IG5sbWxleF9nZXRfbnVtYmVyICgkNCk7Ci0JICAgIGZyZWUgKCQyKTsKLQkgICAgZnJlZSAoJDMpOwotCSAgICBmcmVlICgkNCk7Ci0JICAgIGlmICh2ZXJzaW9uX2hkci0+bW9udGggPCAxIHx8IHZlcnNpb25faGRyLT5tb250aCA+IDEyKQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIG1vbnRoIiksIC0xKTsKLQkgICAgaWYgKHZlcnNpb25faGRyLT5kYXkgPCAxIHx8IHZlcnNpb25faGRyLT5kYXkgPiAzMSkKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCBkYXkiKSwgLTEpOwotCSAgICBpZiAodmVyc2lvbl9oZHItPnllYXIgPCAxOTAwIHx8IHZlcnNpb25faGRyLT55ZWFyID4gMzAwMCkKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCB5ZWFyIiksIC0xKTsKLQkgIH0KLQl8IERFQlVHCi0JICB7Ci0JICAgIGRlYnVnX2luZm8gPSB0cnVlOwotCSAgfQotCXwgREVTQ1JJUFRJT04gUVVPVEVEX1NUUklORwotCSAgewotCSAgICBpbnQgbGVuOwotCi0JICAgIGxlbiA9IHN0cmxlbiAoJDIpOwotCSAgICBpZiAobGVuID4gTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEgpCi0JICAgICAgewotCQlubG1oZWFkZXJfd2FybiAoXygiZGVzY3JpcHRpb24gc3RyaW5nIGlzIHRvbyBsb25nIiksCi0JCQkJTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEgpOwotCQlsZW4gPSBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDsKLQkgICAgICB9Ci0JICAgIHZhcl9oZHItPmRlc2NyaXB0aW9uTGVuZ3RoID0gbGVuOwotCSAgICBzdHJuY3B5ICh2YXJfaGRyLT5kZXNjcmlwdGlvblRleHQsICQyLCBsZW4pOwotCSAgICB2YXJfaGRyLT5kZXNjcmlwdGlvblRleHRbbGVuXSA9ICdcMCc7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IEVYSVQgU1RSSU5HCi0JICB7Ci0JICAgIGV4aXRfcHJvY2VkdXJlID0gJDI7Ci0JICB9Ci0JfCBFWFBPUlQKLQkgIHsKLQkgICAgc3ltYm9sX3ByZWZpeCA9IE5VTEw7Ci0JICB9Ci0JICBzeW1ib2xfbGlzdF9vcHQKLQkgIHsKLQkgICAgZXhwb3J0X3N5bWJvbHMgPSBzdHJpbmdfbGlzdF9hcHBlbmQgKGV4cG9ydF9zeW1ib2xzLCAkMyk7Ci0JICB9Ci0JfCBGTEFHX09OIFNUUklORwotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzIHw9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IEZMQUdfT0ZGIFNUUklORwotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzICY9fiBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBGVUxMTUFQCi0JICB7Ci0JICAgIG1hcF9maWxlID0gIiI7Ci0JICAgIGZ1bGxfbWFwID0gdHJ1ZTsKLQkgIH0KLQl8IEZVTExNQVAgU1RSSU5HCi0JICB7Ci0JICAgIG1hcF9maWxlID0gJDI7Ci0JICAgIGZ1bGxfbWFwID0gdHJ1ZTsKLQkgIH0KLQl8IEhFTFAgU1RSSU5HCi0JICB7Ci0JICAgIGhlbHBfZmlsZSA9ICQyOwotCSAgfQotCXwgSU1QT1JUCi0JICB7Ci0JICAgIHN5bWJvbF9wcmVmaXggPSBOVUxMOwotCSAgfQotCSAgc3ltYm9sX2xpc3Rfb3B0Ci0JICB7Ci0JICAgIGltcG9ydF9zeW1ib2xzID0gc3RyaW5nX2xpc3RfYXBwZW5kIChpbXBvcnRfc3ltYm9scywgJDMpOwotCSAgfQotCXwgSU5QVVQgc3RyaW5nX2xpc3QKLQkgIHsKLQkgICAgaW5wdXRfZmlsZXMgPSBzdHJpbmdfbGlzdF9hcHBlbmQgKGlucHV0X2ZpbGVzLCAkMik7Ci0JICB9Ci0JfCBNQVAKLQkgIHsKLQkgICAgbWFwX2ZpbGUgPSAiIjsKLQkgIH0KLQl8IE1BUCBTVFJJTkcKLQkgIHsKLQkgICAgbWFwX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IE1FU1NBR0VTIFNUUklORwotCSAgewotCSAgICBtZXNzYWdlX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IE1PRFVMRSBzdHJpbmdfbGlzdAotCSAgewotCSAgICBtb2R1bGVzID0gc3RyaW5nX2xpc3RfYXBwZW5kIChtb2R1bGVzLCAkMik7Ci0JICB9Ci0JfCBNVUxUSVBMRQotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzIHw9IDB4MjsKLQkgIH0KLQl8IE9TX0RPTUFJTgotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzIHw9IDB4MTA7Ci0JICB9Ci0JfCBPVVRQVVQgU1RSSU5HCi0JICB7Ci0JICAgIGlmIChvdXRwdXRfZmlsZSA9PSBOVUxMKQotCSAgICAgIG91dHB1dF9maWxlID0gJDI7Ci0JICAgIGVsc2UKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWdub3JpbmcgZHVwbGljYXRlIE9VVFBVVCBzdGF0ZW1lbnQiKSwgLTEpOwotCSAgfQotCXwgUFNFVURPUFJFRU1QVElPTgotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzIHw9IDB4ODsKLQkgIH0KLQl8IFJFRU5UUkFOVAotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzIHw9IDB4MTsKLQkgIH0KLQl8IFNDUkVFTk5BTUUgUVVPVEVEX1NUUklORwotCSAgewotCSAgICBpbnQgbGVuOwotCi0JICAgIGxlbiA9IHN0cmxlbiAoJDIpOwotCSAgICBpZiAobGVuID49IE5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIKQotCSAgICAgIHsKLQkJbmxtaGVhZGVyX3dhcm4gKF8oInNjcmVlbiBuYW1lIGlzIHRvbyBsb25nIiksCi0JCQkJTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEgpOwotCQlsZW4gPSBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSDsKLQkgICAgICB9Ci0JICAgIHZhcl9oZHItPnNjcmVlbk5hbWVMZW5ndGggPSBsZW47Ci0JICAgIHN0cm5jcHkgKHZhcl9oZHItPnNjcmVlbk5hbWUsICQyLCBsZW4pOwotCSAgICB2YXJfaGRyLT5zY3JlZW5OYW1lW05MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIXSA9ICdcMCc7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IFNIQVJFTElCIFNUUklORwotCSAgewotCSAgICBzaGFyZWxpYl9maWxlID0gJDI7Ci0JICB9Ci0JfCBTVEFDSyBTVFJJTkcKLQkgIHsKLQkgICAgdmFyX2hkci0+c3RhY2tTaXplID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgU1RBUlQgU1RSSU5HCi0JICB7Ci0JICAgIHN0YXJ0X3Byb2NlZHVyZSA9ICQyOwotCSAgfQotCXwgU1lOQ0hST05JWkUKLQkgIHsKLQkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDQ7Ci0JICB9Ci0JfCBUSFJFQUROQU1FIFFVT1RFRF9TVFJJTkcKLQkgIHsKLQkgICAgaW50IGxlbjsKLQotCSAgICBsZW4gPSBzdHJsZW4gKCQyKTsKLQkgICAgaWYgKGxlbiA+PSBOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCkKLQkgICAgICB7Ci0JCW5sbWhlYWRlcl93YXJuIChfKCJ0aHJlYWQgbmFtZSBpcyB0b28gbG9uZyIpLAotCQkJCU5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RIKTsKLQkJbGVuID0gTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEg7Ci0JICAgICAgfQotCSAgICB2YXJfaGRyLT50aHJlYWROYW1lTGVuZ3RoID0gbGVuOwotCSAgICBzdHJuY3B5ICh2YXJfaGRyLT50aHJlYWROYW1lLCAkMiwgbGVuKTsKLQkgICAgdmFyX2hkci0+dGhyZWFkTmFtZVtsZW5dID0gJ1wwJzsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgVFlQRSBTVFJJTkcKLQkgIHsKLQkgICAgZml4ZWRfaGRyLT5tb2R1bGVUeXBlID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgVkVSQk9TRQotCSAgewotCSAgICB2ZXJib3NlID0gdHJ1ZTsKLQkgIH0KLQl8IFZFUlNJT05LIFNUUklORyBTVFJJTkcgU1RSSU5HCi0JICB7Ci0JICAgIGxvbmcgdmFsOwotCi0JICAgIHN0cm5jcHkgKHZlcnNpb25faGRyLT5zdGFtcCwgIlZlUnNJb04jIiwgOCk7Ci0JICAgIHZlcnNpb25faGRyLT5tYWpvclZlcnNpb24gPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICB2YWwgPSBubG1sZXhfZ2V0X251bWJlciAoJDMpOwotCSAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiA5OSkKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCBtaW5vciB2ZXJzaW9uIG51bWJlciAobXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDk5KSIpLAotCQkJICAgICAgLTEpOwotCSAgICBlbHNlCi0JICAgICAgdmVyc2lvbl9oZHItPm1pbm9yVmVyc2lvbiA9IHZhbDsKLQkgICAgdmFsID0gbmxtbGV4X2dldF9udW1iZXIgKCQ0KTsKLQkgICAgaWYgKHZhbCA8IDApCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgcmV2aXNpb24gbnVtYmVyIChtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjYpIiksCi0JCQkgICAgICAtMSk7Ci0JICAgIGVsc2UgaWYgKHZhbCA+IDI2KQotCSAgICAgIHZlcnNpb25faGRyLT5yZXZpc2lvbiA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB2ZXJzaW9uX2hkci0+cmV2aXNpb24gPSB2YWw7Ci0JICAgIGZyZWUgKCQyKTsKLQkgICAgZnJlZSAoJDMpOwotCSAgICBmcmVlICgkNCk7Ci0JICB9Ci0JfCBWRVJTSU9OSyBTVFJJTkcgU1RSSU5HCi0JICB7Ci0JICAgIGxvbmcgdmFsOwotCi0JICAgIHN0cm5jcHkgKHZlcnNpb25faGRyLT5zdGFtcCwgIlZlUnNJb04jIiwgOCk7Ci0JICAgIHZlcnNpb25faGRyLT5tYWpvclZlcnNpb24gPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICB2YWwgPSBubG1sZXhfZ2V0X251bWJlciAoJDMpOwotCSAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiA5OSkKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCBtaW5vciB2ZXJzaW9uIG51bWJlciAobXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDk5KSIpLAotCQkJICAgICAgLTEpOwotCSAgICBlbHNlCi0JICAgICAgdmVyc2lvbl9oZHItPm1pbm9yVmVyc2lvbiA9IHZhbDsKLQkgICAgdmVyc2lvbl9oZHItPnJldmlzaW9uID0gMDsKLQkgICAgZnJlZSAoJDIpOwotCSAgICBmcmVlICgkMyk7Ci0JICB9Ci0JfCBYRENEQVRBIFNUUklORwotCSAgewotCSAgICBycGNfZmlsZSA9ICQyOwotCSAgfQotCTsKLQotLyogQSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIHN5bWJvbHMuICAqLwotCi1zeW1ib2xfbGlzdF9vcHQ6Ci0JICAvKiBFbXB0eS4gICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IHN5bWJvbF9saXN0Ci0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBBIGxpc3Qgb2Ygc3ltYm9scyBpbiBhbiBpbXBvcnQgb3IgZXhwb3J0IGxpc3QuICBQcmVmaXhlcyBtYXkgYXBwZWFyCi0gICBpbiBwYXJlbnRoZXNlcy4gIFdlIG5lZWQgdG8gdXNlIGxlZnQgcmVjdXJzaW9uIGhlcmUgdG8gYXZvaWQKLSAgIGJ1aWxkaW5nIHVwIGEgbGFyZ2UgaW1wb3J0IGxpc3Qgb24gdGhlIHBhcnNlciBzdGFjay4gICovCi0KLXN5bWJvbF9saXN0OgotCSAgc3ltYm9sCi0JICB7Ci0JICAgICQkID0gc3RyaW5nX2xpc3RfY29ucyAoJDEsIE5VTEwpOwotCSAgfQotCXwgc3ltYm9sX3ByZWZpeAotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCBzeW1ib2xfbGlzdCBzeW1ib2wKLQkgIHsKLQkgICAgJCQgPSBzdHJpbmdfbGlzdF9hcHBlbmQxICgkMSwgJDIpOwotCSAgfQotCXwgc3ltYm9sX2xpc3Qgc3ltYm9sX3ByZWZpeAotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotLyogQSBwcmVmaXggZm9yIHN1YnNlcXVlbnQgc3ltYm9scy4gICovCi0KLXN5bWJvbF9wcmVmaXg6Ci0JICAnKCcgU1RSSU5HICcpJwotCSAgewotCSAgICBpZiAoc3ltYm9sX3ByZWZpeCAhPSBOVUxMKQotCSAgICAgIGZyZWUgKHN5bWJvbF9wcmVmaXgpOwotCSAgICBzeW1ib2xfcHJlZml4ID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHNpbmdsZSBzeW1ib2wuICAqLwotCi1zeW1ib2w6Ci0JICBTVFJJTkcKLQkgIHsKLQkgICAgaWYgKHN5bWJvbF9wcmVmaXggPT0gTlVMTCkKLQkgICAgICAkJCA9ICQxOwotCSAgICBlbHNlCi0JICAgICAgewotCQkkJCA9IHhtYWxsb2MgKHN0cmxlbiAoc3ltYm9sX3ByZWZpeCkgKyBzdHJsZW4gKCQxKSArIDIpOwotCQlzcHJpbnRmICgkJCwgIiVzQCVzIiwgc3ltYm9sX3ByZWZpeCwgJDEpOwotCQlmcmVlICgkMSk7Ci0JICAgICAgfQotCSAgfQotCTsKLQotLyogQSBsaXN0IG9mIHN0cmluZ3MuICAqLwotCi1zdHJpbmdfbGlzdDoKLQkgIC8qIE1heSBiZSBlbXB0eS4gICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IFNUUklORyBzdHJpbmdfbGlzdAotCSAgewotCSAgICAkJCA9IHN0cmluZ19saXN0X2NvbnMgKCQxLCAkMik7Ci0JICB9Ci0JOwotCi0lJQotCi0vKiBJZiBzdHJlcnJvciBpcyBqdXN0IGEgbWFjcm8sIHdlIHdhbnQgdG8gdXNlIHRoZSBvbmUgZnJvbSBsaWJpYmVydHkKLSAgIHNpbmNlIGl0IHdpbGwgaGFuZGxlIHVuZGVmaW5lZCB2YWx1ZXMuICAqLwotI3VuZGVmIHN0cmVycm9yCi1leHRlcm4gY2hhciAqc3RyZXJyb3IgKCk7Ci0KLS8qIFRoZSBsZXhlciBpcyBzaW1wbGUsIHRvbyBzaW1wbGUgZm9yIGZsZXguICBLZXl3b3JkcyBhcmUgb25seQotICAgcmVjb2duaXplZCBhdCB0aGUgc3RhcnQgb2YgbGluZXMuICBFdmVyeXRoaW5nIGVsc2UgbXVzdCBiZSBhbgotICAgYXJndW1lbnQuICBBIGNvbW1hIGlzIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZS4gICovCi0KLS8qIFRoZSBzdGF0ZXMgdGhlIGxleGVyIGNhbiBiZSBpbi4gICovCi0KLWVudW0gbGV4X3N0YXRlCi17Ci0gIC8qIEF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLSAgQkVHSU5OSU5HX09GX0xJTkUsCi0gIC8qIEluIHRoZSBtaWRkbGUgb2YgYSBsaW5lLiAgKi8KLSAgSU5fTElORQotfTsKLQotLyogV2UgbmVlZCB0byBrZWVwIGEgc3RhY2sgb2YgZmlsZXMgdG8gaGFuZGxlIGZpbGUgaW5jbHVzaW9uLiAgKi8KLQotc3RydWN0IGlucHV0Ci17Ci0gIC8qIFRoZSBmaWxlIHRvIHJlYWQgZnJvbS4gICovCi0gIEZJTEUgKmZpbGU7Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgKi8KLSAgY2hhciAqbmFtZTsKLSAgLyogVGhlIGN1cnJlbnQgbGluZSBudW1iZXIuICAqLwotICBpbnQgbGluZW5vOwotICAvKiBUaGUgY3VycmVudCBzdGF0ZS4gICovCi0gIGVudW0gbGV4X3N0YXRlIHN0YXRlOwotICAvKiBUaGUgbmV4dCBmaWxlIG9uIHRoZSBzdGFjay4gICovCi0gIHN0cnVjdCBpbnB1dCAqbmV4dDsKLX07Ci0KLS8qIFRoZSBjdXJyZW50IGlucHV0IGZpbGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGlucHV0IGN1cnJlbnQ7Ci0KLS8qIFRoZSBjaGFyYWN0ZXIgd2hpY2ggaW50cm9kdWNlcyBjb21tZW50cy4gICovCi0jZGVmaW5lIENPTU1FTlRfQ0hBUiAnIycKLQwKLS8qIFN0YXJ0IHRoZSBsZXhlciBnb2luZyBvbiB0aGUgbWFpbiBpbnB1dCBmaWxlLiAgKi8KLQotYm9vbGVhbgotbmxtbGV4X2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGN1cnJlbnQubmV4dCA9IE5VTEw7Ci0gIHJldHVybiBubG1sZXhfZmlsZV9vcGVuIChuYW1lKTsKLX0KLQotLyogU3RhcnQgdGhlIGxleGVyIGdvaW5nIG9uIGEgc3Vic2lkaWFyeSBpbnB1dCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLW5sbWxleF9maWxlX3B1c2ggKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBpbnB1dCAqcHVzaDsKLQotICBwdXNoID0gKHN0cnVjdCBpbnB1dCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbnB1dCkpOwotICAqcHVzaCA9IGN1cnJlbnQ7Ci0gIGlmIChubG1sZXhfZmlsZV9vcGVuIChuYW1lKSkKLSAgICBjdXJyZW50Lm5leHQgPSBwdXNoOwotICBlbHNlCi0gICAgewotICAgICAgY3VycmVudCA9ICpwdXNoOwotICAgICAgZnJlZSAocHVzaCk7Ci0gICAgfQotfQotCi0vKiBTdGFydCBsZXhpbmcgZnJvbSBhIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtbGV4X2ZpbGVfb3BlbiAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY3VycmVudC5maWxlID0gZm9wZW4gKG5hbWUsICJyIik7Ci0gIGlmIChjdXJyZW50LmZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICArK3BhcnNlX2Vycm9yczsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGN1cnJlbnQubmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBjdXJyZW50LmxpbmVubyA9IDE7Ci0gIGN1cnJlbnQuc3RhdGUgPSBCRUdJTk5JTkdfT0ZfTElORTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUYWJsZSB1c2VkIHRvIHR1cm4ga2V5d29yZHMgaW50byB0b2tlbnMuICAqLwotCi1zdHJ1Y3Qga2V5d29yZF90b2tlbnNfc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIgKmtleXdvcmQ7Ci0gIGludCB0b2tlbjsKLX07Ci0KLXN0cnVjdCBrZXl3b3JkX3Rva2Vuc19zdHJ1Y3Qga2V5d29yZF90b2tlbnNbXSA9Ci17Ci0gIHsgIkNIRUNLIiwgQ0hFQ0sgfSwKLSAgeyAiQ09ERVNUQVJUIiwgQ09ERVNUQVJUIH0sCi0gIHsgIkNPUFlSSUdIVCIsIENPUFlSSUdIVCB9LAotICB7ICJDVVNUT00iLCBDVVNUT00gfSwKLSAgeyAiREFURSIsIERBVEUgfSwKLSAgeyAiREVCVUciLCBERUJVRyB9LAotICB7ICJERVNDUklQVElPTiIsIERFU0NSSVBUSU9OIH0sCi0gIHsgIkVYSVQiLCBFWElUIH0sCi0gIHsgIkVYUE9SVCIsIEVYUE9SVCB9LAotICB7ICJGTEFHX09OIiwgRkxBR19PTiB9LAotICB7ICJGTEFHX09GRiIsIEZMQUdfT0ZGIH0sCi0gIHsgIkZVTExNQVAiLCBGVUxMTUFQIH0sCi0gIHsgIkhFTFAiLCBIRUxQIH0sCi0gIHsgIklNUE9SVCIsIElNUE9SVCB9LAotICB7ICJJTlBVVCIsIElOUFVUIH0sCi0gIHsgIk1BUCIsIE1BUCB9LAotICB7ICJNRVNTQUdFUyIsIE1FU1NBR0VTIH0sCi0gIHsgIk1PRFVMRSIsIE1PRFVMRSB9LAotICB7ICJNVUxUSVBMRSIsIE1VTFRJUExFIH0sCi0gIHsgIk9TX0RPTUFJTiIsIE9TX0RPTUFJTiB9LAotICB7ICJPVVRQVVQiLCBPVVRQVVQgfSwKLSAgeyAiUFNFVURPUFJFRU1QVElPTiIsIFBTRVVET1BSRUVNUFRJT04gfSwKLSAgeyAiUkVFTlRSQU5UIiwgUkVFTlRSQU5UIH0sCi0gIHsgIlNDUkVFTk5BTUUiLCBTQ1JFRU5OQU1FIH0sCi0gIHsgIlNIQVJFTElCIiwgU0hBUkVMSUIgfSwKLSAgeyAiU1RBQ0siLCBTVEFDSyB9LAotICB7ICJTVEFDS1NJWkUiLCBTVEFDSyB9LAotICB7ICJTVEFSVCIsIFNUQVJUIH0sCi0gIHsgIlNZTkNIUk9OSVpFIiwgU1lOQ0hST05JWkUgfSwKLSAgeyAiVEhSRUFETkFNRSIsIFRIUkVBRE5BTUUgfSwKLSAgeyAiVFlQRSIsIFRZUEUgfSwKLSAgeyAiVkVSQk9TRSIsIFZFUkJPU0UgfSwKLSAgeyAiVkVSU0lPTiIsIFZFUlNJT05LIH0sCi0gIHsgIlhEQ0RBVEEiLCBYRENEQVRBIH0KLX07Ci0KLSNkZWZpbmUgS0VZV09SRF9DT1VOVCAoc2l6ZW9mIChrZXl3b3JkX3Rva2VucykgLyBzaXplb2YgKGtleXdvcmRfdG9rZW5zWzBdKSkKLQwKLS8qIFRoZSBsZXhlciBhY2N1bXVsYXRlcyBzdHJpbmdzIGluIHRoZXNlIHZhcmlhYmxlcy4gICovCi1zdGF0aWMgY2hhciAqbGV4X2J1ZjsKLXN0YXRpYyBpbnQgbGV4X3NpemU7Ci1zdGF0aWMgaW50IGxleF9wb3M7Ci0KLS8qIFN0YXJ0IGFjY3VtdWxhdGluZyBzdHJpbmdzIGludG8gdGhlIGJ1ZmZlci4gICovCi0jZGVmaW5lIEJVRl9JTklUKCkgXAotICAoKHZvaWQpIChsZXhfYnVmICE9IE5VTEwgPyBsZXhfcG9zID0gMCA6IG5sbWxleF9idWZfaW5pdCAoKSkpCi0KLXN0YXRpYyBpbnQKLW5sbWxleF9idWZfaW5pdCAoKQotewotICBsZXhfc2l6ZSA9IDEwOwotICBsZXhfYnVmID0geG1hbGxvYyAobGV4X3NpemUgKyAxKTsKLSAgbGV4X3BvcyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0vKiBGaW5pc2ggYSBzdHJpbmcgaW4gdGhlIGJ1ZmZlci4gICovCi0jZGVmaW5lIEJVRl9GSU5JU0goKSAoKHZvaWQpIChsZXhfYnVmW2xleF9wb3NdID0gJ1wwJykpCi0KLS8qIEFjY3VtdWxhdGUgYSBjaGFyYWN0ZXIgaW50byB0aGUgYnVmZmVyLiAgKi8KLSNkZWZpbmUgQlVGX0FERChjKSBcCi0gICgodm9pZCkgKGxleF9wb3MgPCBsZXhfc2l6ZSBcCi0JICAgPyBsZXhfYnVmW2xleF9wb3MrK10gPSAoYykgXAotCSAgIDogbmxtbGV4X2J1Zl9hZGQgKGMpKSkKLQotc3RhdGljIGNoYXIKLW5sbWxleF9idWZfYWRkIChjKQotICAgICBpbnQgYzsKLXsKLSAgaWYgKGxleF9wb3MgPj0gbGV4X3NpemUpCi0gICAgewotICAgICAgbGV4X3NpemUgKj0gMjsKLSAgICAgIGxleF9idWYgPSB4cmVhbGxvYyAobGV4X2J1ZiwgbGV4X3NpemUgKyAxKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxleF9idWZbbGV4X3BvcysrXSA9IGM7Ci19Ci0MCi0vKiBUaGUgbGV4ZXIgcHJvcGVyLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJpc29uIGdlbmVyYXRlZCBwYXJzaW5nCi0gICBjb2RlLiAgKi8KLQotc3RhdGljIGludAoteXlsZXggKCkKLXsKLSAgaW50IGM7Ci0KLXRhaWxfcmVjdXJzZToKLQotICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQotICAvKiBDb21tYXMgYXJlIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKSB8fCBjID09ICcsJykKLSAgICB7Ci0gICAgICBjdXJyZW50LnN0YXRlID0gSU5fTElORTsKLSAgICAgIGlmIChjID09ICdcbicpCi0JewotCSAgKytjdXJyZW50LmxpbmVubzsKLQkgIGN1cnJlbnQuc3RhdGUgPSBCRUdJTk5JTkdfT0ZfTElORTsKLQl9Ci0gICAgICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLSAgICB9Ci0KLSAgLyogQXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB3ZSBlaXRoZXIgcG9wIHRvIHRoZSBwcmV2aW91cyBmaWxlIG9yCi0gICAgIGZpbmlzaCB1cC4gICovCi0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBmY2xvc2UgKGN1cnJlbnQuZmlsZSk7Ci0gICAgICBmcmVlIChjdXJyZW50Lm5hbWUpOwotICAgICAgaWYgKGN1cnJlbnQubmV4dCA9PSBOVUxMKQotCXJldHVybiAwOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBpbnB1dCAqbmV4dDsKLQotCSAgbmV4dCA9IGN1cnJlbnQubmV4dDsKLQkgIGN1cnJlbnQgPSAqbmV4dDsKLQkgIGZyZWUgKG5leHQpOwotCSAgZ290byB0YWlsX3JlY3Vyc2U7Ci0JfQotICAgIH0KLQotICAvKiBBIGNvbW1lbnQgY2hhcmFjdGVyIGFsd2F5cyBtZWFucyB0byBkcm9wIGV2ZXJ5dGhpbmcgdW50aWwgdGhlCi0gICAgIG5leHQgbmV3bGluZS4gICovCi0gIGlmIChjID09IENPTU1FTlRfQ0hBUikKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCX0KLSAgICAgIHdoaWxlIChjICE9ICdcbicpOwotICAgICAgKytjdXJyZW50LmxpbmVubzsKLSAgICAgIGN1cnJlbnQuc3RhdGUgPSBCRUdJTk5JTkdfT0ZfTElORTsKLSAgICAgIGdvdG8gdGFpbF9yZWN1cnNlOwotICAgIH0KLQotICAvKiBBbiAnQCcgaW50cm9kdWNlcyBhbiBpbmNsdWRlIGZpbGUuICAqLwotICBpZiAoYyA9PSAnQCcpCi0gICAgewotICAgICAgZG8KLQl7Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQkgIGlmIChjID09ICdcbicpCi0JICAgICsrY3VycmVudC5saW5lbm87Ci0JfQotICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKSk7Ci0gICAgICBCVUZfSU5JVCAoKTsKLSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKSAmJiBjICE9IEVPRikKLQl7Ci0JICBCVUZfQUREIChjKTsKLQkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCX0KLSAgICAgIEJVRl9GSU5JU0ggKCk7Ci0KLSAgICAgIHVuZ2V0YyAoYywgY3VycmVudC5maWxlKTsKLSAgICAgIAotICAgICAgbmxtbGV4X2ZpbGVfcHVzaCAobGV4X2J1Zik7Ci0gICAgICBnb3RvIHRhaWxfcmVjdXJzZTsKLSAgICB9Ci0KLSAgLyogQSBub24tc3BhY2UgY2hhcmFjdGVyIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgbXVzdCBiZSB0aGUgc3RhcnQgb2YKLSAgICAgYSBrZXl3b3JkLiAgKi8KLSAgaWYgKGN1cnJlbnQuc3RhdGUgPT0gQkVHSU5OSU5HX09GX0xJTkUpCi0gICAgewotICAgICAgQlVGX0lOSVQgKCk7Ci0gICAgICB3aGlsZSAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGMpIHx8IGMgPT0gJ18nKQotCXsKLQkgIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgYykpCi0JICAgIEJVRl9BREQgKHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSk7Ci0JICBlbHNlCi0JICAgIEJVRl9BREQgKGMpOwotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JfQotICAgICAgQlVGX0ZJTklTSCAoKTsKLQotICAgICAgaWYgKGMgIT0gRU9GICYmICEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpICYmIGMgIT0gJywnKQotCXsKLQkgIG5sbWhlYWRlcl9pZGVudGlmeSAoKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6JWQ6IGlsbGVnYWwgY2hhcmFjdGVyIGluIGtleXdvcmQ6ICVjXG4iKSwKLQkJICAgY3VycmVudC5uYW1lLCBjdXJyZW50LmxpbmVubywgYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgS0VZV09SRF9DT1VOVDsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKGxleF9idWZbMF0gPT0ga2V5d29yZF90b2tlbnNbaV0ua2V5d29yZFswXQotCQkgICYmIHN0cmNtcCAobGV4X2J1Ziwga2V5d29yZF90b2tlbnNbaV0ua2V5d29yZCkgPT0gMCkKLQkJewotCQkgIC8qIFB1c2hpbmcgYmFjayB0aGUgZmluYWwgd2hpdGVzcGFjZSBhdm9pZHMgd29ycnlpbmcKLQkJICAgICBhYm91dCBcbiBoZXJlLiAgKi8KLQkJICB1bmdldGMgKGMsIGN1cnJlbnQuZmlsZSk7Ci0JCSAgY3VycmVudC5zdGF0ZSA9IElOX0xJTkU7Ci0JCSAgcmV0dXJuIGtleXdvcmRfdG9rZW5zW2ldLnRva2VuOwotCQl9Ci0JICAgIH0KLQkgIAotCSAgbmxtaGVhZGVyX2lkZW50aWZ5ICgpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczolZDogdW5yZWNvZ25pemVkIGtleXdvcmQ6ICVzXG4iKSwKLQkJICAgY3VycmVudC5uYW1lLCBjdXJyZW50LmxpbmVubywgbGV4X2J1Zik7Ci0JfQotCi0gICAgICArK3BhcnNlX2Vycm9yczsKLSAgICAgIC8qIFRyZWF0IHRoZSByZXN0IG9mIHRoaXMgbGluZSBhcyBhIGNvbW1lbnQuICAqLwotICAgICAgdW5nZXRjIChDT01NRU5UX0NIQVIsIGN1cnJlbnQuZmlsZSk7Ci0gICAgICBnb3RvIHRhaWxfcmVjdXJzZTsKLSAgICB9Ci0KLSAgLyogUGFyZW50aGVzZXMganVzdCByZXByZXNlbnQgdGhlbXNlbHZlcy4gICovCi0gIGlmIChjID09ICcoJyB8fCBjID09ICcpJykKLSAgICByZXR1cm4gYzsKLQotICAvKiBIYW5kbGUgcXVvdGVkIHN0cmluZ3MuICAqLwotICBpZiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKQotICAgIHsKLSAgICAgIGludCBxdW90ZTsKLSAgICAgIGludCBzdGFydF9saW5lbm87Ci0KLSAgICAgIHF1b3RlID0gYzsKLSAgICAgIHN0YXJ0X2xpbmVubyA9IGN1cnJlbnQubGluZW5vOwotCi0gICAgICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLSAgICAgIEJVRl9JTklUICgpOwotICAgICAgd2hpbGUgKGMgIT0gcXVvdGUgJiYgYyAhPSBFT0YpCi0JewotCSAgQlVGX0FERCAoYyk7Ci0JICBpZiAoYyA9PSAnXG4nKQotCSAgICArK2N1cnJlbnQubGluZW5vOwotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JfQotICAgICAgQlVGX0ZJTklTSCAoKTsKLQotICAgICAgaWYgKGMgPT0gRU9GKQotCXsKLQkgIG5sbWhlYWRlcl9pZGVudGlmeSAoKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6JWQ6IGVuZCBvZiBmaWxlIGluIHF1b3RlZCBzdHJpbmdcbiIpLAotCQkgICBjdXJyZW50Lm5hbWUsIHN0YXJ0X2xpbmVubyk7Ci0JICArK3BhcnNlX2Vycm9yczsKLQl9Ci0KLSAgICAgIC8qIEZJWE1FOiBQb3NzaWJsZSBtZW1vcnkgbGVhay4gICovCi0gICAgICB5eWx2YWwuc3RyaW5nID0geHN0cmR1cCAobGV4X2J1Zik7Ci0gICAgICByZXR1cm4gUVVPVEVEX1NUUklORzsKLSAgICB9Ci0KLSAgLyogR2F0aGVyIGEgZ2VuZXJpYyBhcmd1bWVudC4gICovCi0gIEJVRl9JTklUICgpOwotICB3aGlsZSAoISBpc3NwYWNlIChjKQotCSAmJiBjICE9ICcsJwotCSAmJiBjICE9IENPTU1FTlRfQ0hBUgotCSAmJiBjICE9ICcoJwotCSAmJiBjICE9ICcpJykKLSAgICB7Ci0gICAgICBCVUZfQUREIChjKTsKLSAgICAgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotICAgIH0KLSAgQlVGX0ZJTklTSCAoKTsKLQotICB1bmdldGMgKGMsIGN1cnJlbnQuZmlsZSk7Ci0KLSAgLyogRklYTUU6IFBvc3NpYmxlIG1lbW9yeSBsZWFrLiAgKi8KLSAgeXlsdmFsLnN0cmluZyA9IHhzdHJkdXAgKGxleF9idWYpOwotICByZXR1cm4gU1RSSU5HOwotfQotDAotLyogR2V0IGEgbnVtYmVyIGZyb20gYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgbG9uZwotbmxtbGV4X2dldF9udW1iZXIgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGxvbmcgcmV0OwotICBjaGFyICpzZW5kOwotCi0gIHJldCA9IHN0cnRvbCAocywgJnNlbmQsIDEwKTsKLSAgaWYgKCpzZW5kICE9ICdcMCcpCi0gICAgbmxtaGVhZGVyX3dhcm4gKF8oImJhZCBudW1iZXIiKSwgLTEpOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBQcmVmaXggdGhlIG5sbWNvbnYgd2FybmluZ3Mgd2l0aCBhIG5vdGUgYXMgdG8gd2hlcmUgdGhleSBjb21lIGZyb20uCi0gICBXZSBkb24ndCB1c2UgcHJvZ3JhbV9uYW1lIG9uIGV2ZXJ5IHdhcm5pbmcsIGJlY2F1c2UgdGhlbiBzb21lCi0gICB2ZXJzaW9ucyBvZiB0aGUgZW1hY3MgbmV4dC1lcnJvciBmdW5jdGlvbiBjYW4ndCByZWNvZ25pemUgdGhlIGxpbmUKLSAgIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1ubG1oZWFkZXJfaWRlbnRpZnkgKCkKLXsKLSAgc3RhdGljIGludCBkb25lOwotCi0gIGlmICghIGRvbmUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogcHJvYmxlbXMgaW4gTkxNIGNvbW1hbmQgbGFuZ3VhZ2UgaW5wdXQ6XG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGRvbmUgPSAxOwotICAgIH0KLX0KLQotLyogSXNzdWUgYSB3YXJuaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLW5sbWhlYWRlcl93YXJuIChzLCBpbWF4KQotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgaW1heDsKLXsKLSAgbmxtaGVhZGVyX2lkZW50aWZ5ICgpOwotICBmcHJpbnRmIChzdGRlcnIsICIlczolZDogJXMiLCBjdXJyZW50Lm5hbWUsIGN1cnJlbnQubGluZW5vLCBzKTsKLSAgaWYgKGltYXggIT0gLTEpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIChtYXggJWQpIiwgaW1heCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLS8qIFJlcG9ydCBhbiBlcnJvci4gICovCi0KLXN0YXRpYyB2b2lkCi1ubG1oZWFkZXJfZXJyb3IgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIG5sbWhlYWRlcl93YXJuIChzLCAtMSk7Ci0gICsrcGFyc2VfZXJyb3JzOwotfQotCi0vKiBBZGQgYSBzdHJpbmcgdG8gYSBzdHJpbmcgbGlzdC4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKgotc3RyaW5nX2xpc3RfY29ucyAocywgbCkKLSAgICAgY2hhciAqczsKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsOwotewotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnJldDsKLQotICByZXQgPSAoc3RydWN0IHN0cmluZ19saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ19saXN0KSk7Ci0gIHJldC0+bmV4dCA9IGw7Ci0gIHJldC0+c3RyaW5nID0gczsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIGxpc3QgdG8gYW5vdGhlciBzdHJpbmcgbGlzdC4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKgotc3RyaW5nX2xpc3RfYXBwZW5kIChsMSwgbDIpCi0gICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDE7Ci0gICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDI7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzdHJpbmdfbGlzdCAqKnBwOwotCi0gIGZvciAocHAgPSAmbDE7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IGwyOwotICByZXR1cm4gbDE7Ci19Ci0KLS8qIEFwcGVuZCBhIHN0cmluZyB0byBhIHN0cmluZyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqCi1zdHJpbmdfbGlzdF9hcHBlbmQxIChsLCBzKQotICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0gICAgIGNoYXIgKnM7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqbjsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cmluZ19saXN0ICoqcHA7Ci0KLSAgbiA9IChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2xpc3QpKTsKLSAgbi0+bmV4dCA9IE5VTEw7Ci0gIG4tPnN0cmluZyA9IHM7Ci0gIGZvciAocHAgPSAmbDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gbjsKLSAgcmV0dXJuIGw7Ci19Ci0KLS8qIER1cGxpY2F0ZSBhIHN0cmluZyBpbiBtZW1vcnkuICAqLwotCi1zdGF0aWMgY2hhciAqCi14c3RyZHVwIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICB1bnNpZ25lZCBsb25nIGxlbjsKLSAgY2hhciAqcmV0OwotCi0gIGxlbiA9IHN0cmxlbiAocyk7Ci0gIHJldCA9IHhtYWxsb2MgKGxlbiArIDEpOwotICBzdHJjcHkgKHJldCwgcyk7Ci0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9ubS4xIGIvYmludXRpbHMvbm0uMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZDk5ZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ubS4xCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBubSAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1ubSBcLSBsaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBubQotLlJCICJbXHwiIFwtYSB8IFwtXC1kZWJ1Z1wtc3ltcyAiXHxdIiAKLS5SQiAiW1x8IiBcLWcgfCBcLVwtZXh0ZXJuXC1vbmx5ICJcfF0iCi0uUkIgIltcfCIgXC1CICJcfF0iICAKLS5SQiAiW1x8IiBcLUMgfCBcLVwtZGVtYW5nbGUgIlx8XSIgCi0uUkIgIltcfCIgXC1EIHwgXC1cLWR5bmFtaWMgIlx8XSIgCi0uUkIgIltcfCIgXC1zIHwgXC1cLXByaW50XC1hcm1hcCAiXHxdIiAKLS5SQiAiW1x8IiBcLW8gfCBcLVwtcHJpbnRcLWZpbGVcLW5hbWUgIlx8XSIgIAotLlJCICJbXHwiIFwtbiB8IFwtXC1udW1lcmljXC1zb3J0ICJcfF0iIAotLlJCICJbXHwiIFwtcCB8IFwtXC1ub1wtc29ydCAiXHxdIgotLlJCICJbXHwiIFwtciB8IFwtXC1yZXZlcnNlXC1zb3J0ICJcfF0iIAotLlJCICJbXHwiIFwtXC1zaXplXC1zb3J0ICJcfF0iIAotLlJCICJbXHwiIFwtdSB8IFwtXC11bmRlZmluZWRcLW9ubHkgIlx8XSIgIAotLlJCICJbXHwiIFwtbCB8IFwtXC1saW5lXC1udW1iZXJzICJcfF0iCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIgIAotLlJCICJbXHwiIFwtXC12ZXJzaW9uICJcfF0iICAKLS5SQiAiW1x8IiAiXC10IFxmSXJhZGl4IiB8IFwtXC1yYWRpeD1cZklyYWRpeCAiXHxdIgotLlJCICJbXHwiIFwtUCB8IC0tcG9ydGFiaWxpdHkgIlx8XSIKLS5SQiAiW1x8IiAiXC1mIFxmSWZvcm1hdCIgfCBcLVwtZm9ybWF0PVxmSWZvcm1hdCAiXHxdIgotLlJCICJbXHwiICJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUiICJcfF0iCi0uUkIgIltcfCIgXGMKLS5JIG9iamZpbGVcYwotXCYuXHwuXHwuXHxdCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotR05VIFxjCi0uQiBubVxjCi1cJiBsaXN0cyB0aGUgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcyBcYwotLkkgb2JqZmlsZVxjCi1cJi4gIElmIG5vIG9iamVjdCBmaWxlcyBhcmUgZ2l2ZW4gYXMgYXJndW1lbnRzLCBcYwotLkIgbm1cYwotXCYgYXNzdW1lcyBgXHxcYwotLkIgYS5vdXRcYwotXHwnLgotCi0uU0ggT1BUSU9OUwotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuCi0KLS5UUAotLkIgXC1BCi0uVFAKLS5CIFwtbwotLlRQCi0uQiBcLVwtcHJpbnRcLWZpbGVcLW5hbWUgCi1QcmVjZWRlIGVhY2ggc3ltYm9sIGJ5IHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIHdoZXJlIGl0IHdhcyBmb3VuZCwKLXJhdGhlciB0aGFuIGlkZW50aWZ5aW5nIHRoZSBpbnB1dCBmaWxlIG9uY2Ugb25seSBiZWZvcmUgYWxsIG9mIGl0cwotc3ltYm9scy4gCi0KLS5UUAotLkIgXC1hCi0uVFAKLS5CIFwtXC1kZWJ1Z1wtc3ltcyAKLURpc3BsYXkgZGVidWdnZXItb25seSBzeW1ib2xzOyBub3JtYWxseSB0aGVzZSBhcmUgbm90IGxpc3RlZC4KLQotLlRQCi0uQiBcLUIKLVRoZSBzYW1lIGFzCi0uQiBcLVwtZm9ybWF0PWJzZAotKGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JUFMgXGZCbm1cZlApLgotCi0uVFAKLS5CIFwtQwotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLURlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCi0KLS5UUAotLkIgXC1ECi0uVFAKLS5CIFwtXC1keW5hbWljCi1EaXNwbGF5IHRoZSBkeW5hbWljIHN5bWJvbHMgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBzeW1ib2xzLiAgVGhpcyBpcwotb25seSBtZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotLlRQCi0uQiAiXC1mIFxmSWZvcm1hdCIKLVVzZSB0aGUgb3V0cHV0IGZvcm1hdCBcZklmb3JtYXRcZlAsIHdoaWNoIGNhbiBiZSBgYGJzZCcnLAotYGBzeXN2JycsIG9yIGBgcG9zaXgnJy4gIFRoZSBkZWZhdWx0IGlzIGBgYnNkJycuCi1Pbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgXGZJZm9ybWF0XGZQIGlzIHNpZ25pZmljYW50OyBpdCBjYW4gYmUKLWVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLgotCi0uVFAKLS5CIFwtZwotLlRQCi0uQiBcLVwtZXh0ZXJuXC1vbmx5IAotRGlzcGxheSBvbmx5IGV4dGVybmFsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1uCi0uVFAKLS5CIFwtdgotLlRQCi0uQiBcLVwtbnVtZXJpY1wtc29ydCAKLVNvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSB0aGVpciBhZGRyZXNzZXMsIG5vdCBhbHBoYWJldGljYWxseSBieSB0aGVpcgotbmFtZXMuIAotCi0uVFAKLS5CIFwtcAotLlRQCi0uQiBcLVwtbm9cLXNvcnQgCi1Eb24ndCBib3RoZXIgdG8gc29ydCB0aGUgc3ltYm9scyBpbiBhbnkgb3JkZXI7IGp1c3QgcHJpbnQgdGhlbSBpbiB0aGUKLW9yZGVyIGVuY291bnRlcmVkLgotCi0uVFAKLS5CIFwtUAotLlRQCi0uQiBcLVwtcG9ydGFiaWxpdHkKLVVzZSB0aGUgUE9TSVguMiBzdGFuZGFyZCBvdXRwdXQgZm9ybWF0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9ybWF0LgotRXF1aXZhbGVudCB0byBgYFwtZiBwb3NpeCcnLgotCi0uVFAKLS5CIFwtcwotLlRQCi0uQiBcLVwtcHJpbnRcLWFybWFwCi1XaGVuIGxpc3Rpbmcgc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycywgaW5jbHVkZSB0aGUgaW5kZXg6IGEgbWFwcGluZwotKHN0b3JlZCBpbiB0aGUgYXJjaGl2ZSBieSBcYwotLkIgYXJcYwotXCYgb3IgXGMKLS5CIHJhbmxpYlxjCi1cJikgb2Ygd2hhdCBtb2R1bGVzCi1jb250YWluIGRlZmluaXRpb25zIGZvciB3aGF0IG5hbWVzLgotCi0uVFAKLS5CIFwtcgotLlRQCi0uQiBcLVwtcmV2ZXJzZVwtc29ydCAKLVJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBzb3J0ICh3aGV0aGVyIG51bWVyaWMgb3IgYWxwaGFiZXRpYyk7IGxldCB0aGUKLWxhc3QgY29tZSBmaXJzdC4KLQotLlRQCi0uQiBcLVwtc2l6ZVwtc29ydCAKLVNvcnQgc3ltYm9scyBieSBzaXplLiAgVGhlIHNpemUgaXMgY29tcHV0ZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHdpdGggdGhlIG5leHQgaGlnaGVyCi12YWx1ZS4gIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaXMgcHJpbnRlZCwgcmF0aGVyIHRoYW4gdGhlIHZhbHVlLgotCi0uVFAKLS5CICJcLXQgXGZJcmFkaXgiCi0uVFAKLS5CICJcLVwtcmFkaXg9XGZJcmFkaXgiCi1Vc2UgXGZJcmFkaXhcZlAgYXMgdGhlIHJhZGl4IGZvciBwcmludGluZyB0aGUgc3ltYm9sIHZhbHVlcy4gIEl0IG11c3QgYmUKLWBgZCcnIGZvciBkZWNpbWFsLCBgYG8nJyBmb3Igb2N0YWwsIG9yIGBgeCcnIGZvciBoZXhhZGVjaW1hbC4KLQotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLVNlZSAKLS5CUiBvYmpkdW1wICggMSApLAotZm9yIGluZm9ybWF0aW9uIG9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCi0KLS5UUAotLkIgXC11Ci0uVFAKLS5CIFwtXC11bmRlZmluZWRcLW9ubHkgCi1EaXNwbGF5IG9ubHkgdW5kZWZpbmVkIHN5bWJvbHMgKHRob3NlIGV4dGVybmFsIHRvIGVhY2ggb2JqZWN0IGZpbGUpLgotCi0uVFAKLS5CIFwtbAotLlRQCi0uQiBcLVwtbGluZVwtbnVtYmVycwotRm9yIGVhY2ggc3ltYm9sLCB1c2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRyeSB0byBmaW5kIGEgZmlsZW5hbWUgYW5kCi1saW5lIG51bWJlci4gIEZvciBhIGRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZSBudW1iZXIgb2YgdGhlCi1hZGRyZXNzIG9mIHRoZSBzeW1ib2wuICBGb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCwgbG9vayBmb3IgdGhlIGxpbmUKLW51bWJlciBvZiBhIHJlbG9jYXRpb24gZW50cnkgd2hpY2ggcmVmZXJzIHRvIHRoZSBzeW1ib2wuICBJZiBsaW5lIG51bWJlcgotaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kLCBwcmludCBpdCBhZnRlciB0aGUgb3RoZXIgc3ltYm9sIGluZm9ybWF0aW9uLgotCi0uVFAKLS5CIFwtVgotLlRQCi0uQiBcLVwtdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YKLS5CIG5tCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIG5tCi1hbmQgZXhpdC4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSk7Ci0uQlIgYXIgIigiIDEgIiksIgotLkJSIG9iamR1bXAgKCAxICksCi0uQlIgcmFubGliICIoIiAxICIpLiIKLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9ubS5jIGIvYmludXRpbHMvbm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyZWUxMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ubS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU1OCArMCwwIEBACi0vKiBubS5jIC0tIERlc2NyaWJlIHN5bWJvbCB0YWJsZSBvZiBhIHJlbCBmaWxlLgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInByb2dyZXNzLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvcmFubGliLmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotLyogV2hlbiBzb3J0aW5nIGJ5IHNpemUsIHdlIHVzZSB0aGlzIHN0cnVjdHVyZSB0byBob2xkIHRoZSBzaXplIGFuZCBhCi0gICBwb2ludGVyIHRvIHRoZSBtaW5pc3ltYm9sLiAgKi8KLQotc3RydWN0IHNpemVfc3ltCi17Ci0gIGNvbnN0IFBUUiBtaW5pc3ltOwotICBiZmRfdm1hIHNpemU7Ci19OwotCi0vKiBXaGVuIGZldGNoaW5nIHJlbG9jcywgd2UgdXNlIHRoaXMgc3RydWN0dXJlIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIGdldF9yZWxvY3MuICAqLwotCi1zdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvCi17Ci0gIGFzZWN0aW9uICoqc2VjczsKLSAgYXJlbGVudCAqKipyZWxvY3M7Ci0gIGxvbmcgKnJlbGNvdW50OwotICBhc3ltYm9sICoqc3ltczsKLX07Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotc2V0X3ByaW50X3JhZGl4IFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotc2V0X291dHB1dF9mb3JtYXQgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2FyY2hpdmUgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWRpc3BsYXlfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9yZWxfZmlsZSBQQVJBTVMgKChiZmQgKiBmaWxlLCBiZmQgKiBhcmNoaXZlKSk7Ci0KLXN0YXRpYyBsb25nCi1maWx0ZXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLQotc3RhdGljIGxvbmcKLXNvcnRfc3ltYm9sc19ieV9zaXplIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwKLQkJCSAgICAgIHN0cnVjdCBzaXplX3N5bSAqKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQsIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zaXplX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIHN0cnVjdCBzaXplX3N5bSAqLCBsb25nLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltZGVmX2VudHJ5IFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotLyogVGhlIHNvcnRpbmcgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGludAotbnVtZXJpY19mb3J3YXJkIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLW51bWVyaWNfcmV2ZXJzZSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1ub25fbnVtZXJpY19mb3J3YXJkIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX3JldmVyc2UgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1zaXplX2ZvcndhcmQyIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIFRoZSBvdXRwdXQgZm9ybWF0dGluZyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX2JzZCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3N5c3YgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9wb3NpeCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX2JzZCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2IFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX2JzZCBQQVJBTVMgKChjaGFyICphcmNoaXZlLCBDT05TVCBjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfc3lzdiBQQVJBTVMgKChjaGFyICphcmNoaXZlLCBDT05TVCBjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXggUEFSQU1TICgoY2hhciAqYXJjaGl2ZSwgQ09OU1QgY2hhciAqZmlsZW5hbWUpKTsKLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX2JzZCBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3N5c3YgUEFSQU1TICgoYmZkICogYXJjaGl2ZV9iZmQsIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9maWxlbmFtZV9wb3NpeCBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF92YWx1ZSBQQVJBTVMgKChiZmRfdm1hKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19ic2QgUEFSQU1TICgoc3ltYm9sX2luZm8gKiBpbmZvLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19zeXN2IFBBUkFNUyAoKHN5bWJvbF9pbmZvICogaW5mbywgYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fcG9zaXggUEFSQU1TICgoc3ltYm9sX2luZm8gKiBpbmZvLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1nZXRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotLyogU3VwcG9ydCBmb3IgZGlmZmVyZW50IG91dHB1dCBmb3JtYXRzLiAgKi8KLXN0cnVjdCBvdXRwdXRfZm5zCi0gIHsKLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBvYmplY3QgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfb2JqZWN0X2ZpbGVuYW1lKSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi0gICAgLyogUHJpbnQgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICAgIHZvaWQgKCpwcmludF9hcmNoaXZlX2ZpbGVuYW1lKSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi0gICAgLyogUHJpbnQgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSBtZW1iZXIgZmlsZS4gICovCi0gICAgdm9pZCAoKnByaW50X2FyY2hpdmVfbWVtYmVyKSBQQVJBTVMgKChjaGFyICphcmNoaXZlLCBDT05TVCBjaGFyICpmaWxlbmFtZSkpOwotCi0gICAgLyogUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgKGFuZCBhcmNoaXZlLCBpZiB0aGVyZSBpcyBvbmUpCi0gICAgICAgY29udGFpbmluZyBhIHN5bWJvbC4gICovCi0gICAgdm9pZCAoKnByaW50X3N5bWJvbF9maWxlbmFtZSkgUEFSQU1TICgoYmZkICogYXJjaGl2ZV9iZmQsIGJmZCAqIGFiZmQpKTsKLQotICAgIC8qIFByaW50IGEgbGluZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0gICAgdm9pZCAoKnByaW50X3N5bWJvbF9pbmZvKSBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLSAgfTsKLXN0YXRpYyBzdHJ1Y3Qgb3V0cHV0X2ZucyBmb3JtYXRzW10gPQotewotICB7cHJpbnRfb2JqZWN0X2ZpbGVuYW1lX2JzZCwKLSAgIHByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfYnNkLAotICAgcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX2JzZCwKLSAgIHByaW50X3N5bWJvbF9pbmZvX2JzZH0sCi0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfc3lzdiwKLSAgIHByaW50X2FyY2hpdmVfZmlsZW5hbWVfc3lzdiwKLSAgIHByaW50X2FyY2hpdmVfbWVtYmVyX3N5c3YsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiwKLSAgIHByaW50X3N5bWJvbF9pbmZvX3N5c3Z9LAotICB7cHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4LAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9wb3NpeCwKLSAgIHByaW50X2FyY2hpdmVfbWVtYmVyX3Bvc2l4LAotICAgcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3Bvc2l4LAotICAgcHJpbnRfc3ltYm9sX2luZm9fcG9zaXh9Ci19OwotCi0vKiBJbmRpY2VzIGluIGBmb3JtYXRzJy4gICovCi0jZGVmaW5lIEZPUk1BVF9CU0QgMAotI2RlZmluZSBGT1JNQVRfU1lTViAxCi0jZGVmaW5lIEZPUk1BVF9QT1NJWCAyCi0jZGVmaW5lIEZPUk1BVF9ERUZBVUxUIEZPUk1BVF9CU0QKLQotLyogVGhlIG91dHB1dCBmb3JtYXQgdG8gdXNlLiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgb3V0cHV0X2ZucyAqZm9ybWF0ID0gJmZvcm1hdHNbRk9STUFUX0RFRkFVTFRdOwotCi0KLS8qIENvbW1hbmQgb3B0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQgZG9fZGVtYW5nbGUgPSAwOwkvKiBQcmV0dHkgcHJpbnQgQysrIHN5bWJvbCBuYW1lcy4gICovCi1zdGF0aWMgaW50IGV4dGVybmFsX29ubHkgPSAwOwkvKiBwcmludCBleHRlcm5hbCBzeW1ib2xzIG9ubHkgKi8KLXN0YXRpYyBpbnQgZGVmaW5lZF9vbmx5ID0gMDsJLyogUHJpbnQgZGVmaW5lZCBzeW1ib2xzIG9ubHkgKi8KLXN0YXRpYyBpbnQgbm9fc29ydCA9IDA7CQkvKiBkb24ndCBzb3J0OyBwcmludCBzeW1zIGluIG9yZGVyIGZvdW5kICovCi1zdGF0aWMgaW50IHByaW50X2RlYnVnX3N5bXMgPSAwOwkvKiBwcmludCBkZWJ1Z2dlci1vbmx5IHN5bWJvbHMgdG9vICovCi1zdGF0aWMgaW50IHByaW50X2FybWFwID0gMDsJLyogZGVzY3JpYmUgX18uU1lNREVGIGRhdGEgaW4gYXJjaGl2ZSBmaWxlcy4gICovCi1zdGF0aWMgaW50IHJldmVyc2Vfc29ydCA9IDA7CS8qIHNvcnQgaW4gZG93bndhcmQoYWxwaGEgb3IgbnVtZXJpYykgb3JkZXIgKi8KLXN0YXRpYyBpbnQgc29ydF9udW1lcmljYWxseSA9IDA7CS8qIHNvcnQgaW4gbnVtZXJpYyByYXRoZXIgdGhhbiBhbHBoYSBvcmRlciAqLwotc3RhdGljIGludCBzb3J0X2J5X3NpemUgPSAwOwkvKiBzb3J0IGJ5IHNpemUgb2Ygc3ltYm9sICovCi1zdGF0aWMgaW50IHVuZGVmaW5lZF9vbmx5ID0gMDsJLyogcHJpbnQgdW5kZWZpbmVkIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBkeW5hbWljID0gMDsJCS8qIHByaW50IGR5bmFtaWMgc3ltYm9scy4gICovCi1zdGF0aWMgaW50IHNob3dfdmVyc2lvbiA9IDA7CS8qIHNob3cgdGhlIHZlcnNpb24gbnVtYmVyICovCi1zdGF0aWMgaW50IHNob3dfc3RhdHMgPSAwOwkvKiBzaG93IHN0YXRpc3RpY3MgKi8KLXN0YXRpYyBpbnQgbGluZV9udW1iZXJzID0gMDsJLyogcHJpbnQgbGluZSBudW1iZXJzIGZvciBzeW1ib2xzICovCi0KLS8qIFdoZW4gdG8gcHJpbnQgdGhlIG5hbWVzIG9mIGZpbGVzLiAgTm90IG11dHVhbGx5IGV4Y2x1c2l2ZSBpbiBTWVNWIGZvcm1hdC4gICovCi1zdGF0aWMgaW50IGZpbGVuYW1lX3Blcl9maWxlID0gMDsJLyogT25jZSBwZXIgZmlsZSwgb24gaXRzIG93biBsaW5lLiAgKi8KLXN0YXRpYyBpbnQgZmlsZW5hbWVfcGVyX3N5bWJvbCA9IDA7CS8qIE9uY2UgcGVyIHN5bWJvbCwgYXQgc3RhcnQgb2YgbGluZS4gICovCi0KLS8qIFByaW50IGZvcm1hdHMgZm9yIHByaW50aW5nIGEgc3ltYm9sIHZhbHVlLiAgKi8KLSNpZm5kZWYgQkZENjQKLXN0YXRpYyBjaGFyIHZhbHVlX2Zvcm1hdFtdID0gIiUwOGx4IjsKLSNlbHNlCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotc3RhdGljIGNoYXIgdmFsdWVfZm9ybWF0W10gPSAiJTAxNmx4IjsKLSNlbHNlCi0vKiBXZSBkb24ndCB1c2UgdmFsdWVfZm9ybWF0IGZvciB0aGlzIGNhc2UuICAqLwotI2VuZGlmCi0jZW5kaWYKLXN0YXRpYyBpbnQgcHJpbnRfcmFkaXggPSAxNjsKLS8qIFByaW50IGZvcm1hdHMgZm9yIHByaW50aW5nIHN0YWIgaW5mby4gICovCi1zdGF0aWMgY2hhciBvdGhlcl9mb3JtYXRbXSA9ICIlMDJ4IjsKLXN0YXRpYyBjaGFyIGRlc2NfZm9ybWF0W10gPSAiJTA0eCI7Ci0KLXN0YXRpYyBjaGFyICp0YXJnZXQgPSBOVUxMOwotCi0vKiBVc2VkIHRvIGNhY2hlIHRoZSBsaW5lIG51bWJlcnMgZm9yIGEgQkZELiAgKi8KLXN0YXRpYyBiZmQgKmxpbmVub19jYWNoZV9iZmQ7Ci1zdGF0aWMgYmZkICpsaW5lbm9fY2FjaGVfcmVsX2JmZDsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImRlYnVnLXN5bXMiLCBub19hcmd1bWVudCwgJnByaW50X2RlYnVnX3N5bXMsIDF9LAotICB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsICZkb19kZW1hbmdsZSwgMX0sCi0gIHsiZHluYW1pYyIsIG5vX2FyZ3VtZW50LCAmZHluYW1pYywgMX0sCi0gIHsiZXh0ZXJuLW9ubHkiLCBub19hcmd1bWVudCwgJmV4dGVybmFsX29ubHksIDF9LAotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZid9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJsaW5lLW51bWJlcnMiLCBub19hcmd1bWVudCwgMCwgJ2wnfSwKLSAgeyJuby1jcGx1cyIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDB9LCAgLyogTGludXggY29tcGF0aWJpbGl0eS4gICovCi0gIHsibm8tZGVtYW5nbGUiLCBub19hcmd1bWVudCwgJmRvX2RlbWFuZ2xlLCAwfSwKLSAgeyJuby1zb3J0Iiwgbm9fYXJndW1lbnQsICZub19zb3J0LCAxfSwKLSAgeyJudW1lcmljLXNvcnQiLCBub19hcmd1bWVudCwgJnNvcnRfbnVtZXJpY2FsbHksIDF9LAotICB7InBvcnRhYmlsaXR5Iiwgbm9fYXJndW1lbnQsIDAsICdQJ30sCi0gIHsicHJpbnQtYXJtYXAiLCBub19hcmd1bWVudCwgJnByaW50X2FybWFwLCAxfSwKLSAgeyJwcmludC1maWxlLW5hbWUiLCBub19hcmd1bWVudCwgMCwgJ28nfSwKLSAgeyJyYWRpeCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndCd9LAotICB7InJldmVyc2Utc29ydCIsIG5vX2FyZ3VtZW50LCAmcmV2ZXJzZV9zb3J0LCAxfSwKLSAgeyJzaXplLXNvcnQiLCBub19hcmd1bWVudCwgJnNvcnRfYnlfc2l6ZSwgMX0sCi0gIHsic3RhdHMiLCBub19hcmd1bWVudCwgJnNob3dfc3RhdHMsIDF9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAyMDB9LAotICB7ImRlZmluZWQtb25seSIsIG5vX2FyZ3VtZW50LCAmZGVmaW5lZF9vbmx5LCAxfSwKLSAgeyJ1bmRlZmluZWQtb25seSIsIG5vX2FyZ3VtZW50LCAmdW5kZWZpbmVkX29ubHksIDF9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgJnNob3dfdmVyc2lvbiwgMX0sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0MCi0vKiBTb21lIGVycm9yLXJlcG9ydGluZyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLWFBQkNEZ2xub3BQcnN1dlZdIFstdCByYWRpeF0gWy0tcmFkaXg9cmFkaXhdIFstLXRhcmdldD1iZmRuYW1lXVxuXAotICAgICAgIFstLWRlYnVnLXN5bXNdIFstLWV4dGVybi1vbmx5XSBbLS1wcmludC1hcm1hcF0gWy0tcHJpbnQtZmlsZS1uYW1lXVxuXAotICAgICAgIFstLW51bWVyaWMtc29ydF0gWy0tbm8tc29ydF0gWy0tcmV2ZXJzZS1zb3J0XSBbLS1zaXplLXNvcnRdXG5cCi0gICAgICAgWy0tdW5kZWZpbmVkLW9ubHldIFstLXBvcnRhYmlsaXR5XSBbLWYge2JzZCxzeXN2LHBvc2l4fV1cblwKLSAgICAgICBbLS1mb3JtYXQ9e2JzZCxzeXN2LHBvc2l4fV0gWy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXSBbLS1keW5hbWljXVxuXAotICAgICAgIFstLWRlZmluZWQtb25seV0gWy0tbGluZS1udW1iZXJzXVxuXAotICAgICAgIFstLXZlcnNpb25dIFstLWhlbHBdXG5cCi0gICAgICAgW2ZpbGUuLi5dXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0vKiBTZXQgdGhlIHJhZGl4IGZvciB0aGUgc3ltYm9sIHZhbHVlIGFuZCBzaXplIGFjY29yZGluZyB0byBSQURJWC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfcHJpbnRfcmFkaXggKHJhZGl4KQotICAgICBjaGFyICpyYWRpeDsKLXsKLSAgc3dpdGNoICgqcmFkaXgpCi0gICAgewotICAgIGNhc2UgJ3gnOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnbyc6Ci0gICAgICBpZiAoKnJhZGl4ID09ICdkJykKLQlwcmludF9yYWRpeCA9IDEwOwotICAgICAgZWxzZQotCXByaW50X3JhZGl4ID0gODsKLSNpZm5kZWYgQkZENjQKLSAgICAgIHZhbHVlX2Zvcm1hdFs0XSA9ICpyYWRpeDsKLSNlbHNlCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotICAgICAgdmFsdWVfZm9ybWF0WzVdID0gKnJhZGl4OwotI2Vsc2UKLSAgICAgIC8qIFRoaXMgY2FzZSByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBvY3RhbCBhbmQgZGVjaW1hbAotICAgICAgICAgcHJpbnRpbmcuICAqLwotI2VuZGlmCi0jZW5kaWYKLSAgICAgIG90aGVyX2Zvcm1hdFszXSA9IGRlc2NfZm9ybWF0WzNdID0gKnJhZGl4OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBpbnZhbGlkIHJhZGl4XG4iKSwgcHJvZ3JhbV9uYW1lLCByYWRpeCk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfb3V0cHV0X2Zvcm1hdCAoZikKLSAgICAgY2hhciAqZjsKLXsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICgqZikKLSAgICB7Ci0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAnQic6Ci0gICAgICBpID0gRk9STUFUX0JTRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgaSA9IEZPUk1BVF9QT1NJWDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgaSA9IEZPUk1BVF9TWVNWOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBpbnZhbGlkIG91dHB1dCBmb3JtYXRcbiIpLCBwcm9ncmFtX25hbWUsIGYpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBmb3JtYXQgPSAmZm9ybWF0c1tpXTsKLX0KLQwKLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgaW50IHJldHZhbDsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9ICphcmd2OwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSwgMCk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJhQUJDRGVmOmdsbm9wUHJzdDp1dlYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ2EnOgotCSAgcHJpbnRfZGVidWdfc3ltcyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdBJzoKLQljYXNlICdvJzoKLQkgIGZpbGVuYW1lX3Blcl9zeW1ib2wgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnQic6CQkvKiBGb3IgTUlQUyBjb21wYXRpYmlsaXR5LiAgKi8KLQkgIHNldF9vdXRwdXRfZm9ybWF0ICgiYnNkIik7Ci0JICBicmVhazsKLQljYXNlICdDJzoKLQkgIGRvX2RlbWFuZ2xlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZHluYW1pYyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIC8qIElnbm9yZWQgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkuICAqLwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBzZXRfb3V0cHV0X2Zvcm1hdCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgZXh0ZXJuYWxfb25seSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCWNhc2UgJ2wnOgotCSAgbGluZV9udW1iZXJzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCWNhc2UgJ3YnOgotCSAgc29ydF9udW1lcmljYWxseSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIG5vX3NvcnQgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnUCc6Ci0JICBzZXRfb3V0cHV0X2Zvcm1hdCAoInBvc2l4Iik7Ci0JICBicmVhazsKLQljYXNlICdyJzoKLQkgIHJldmVyc2Vfc29ydCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIHByaW50X2FybWFwID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgc2V0X3ByaW50X3JhZGl4IChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JICB1bmRlZmluZWRfb25seSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHNob3dfdmVyc2lvbiA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgMjAwOgkJLyogLS10YXJnZXQgKi8KLQkgIHRhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSAwOgkJLyogQSBsb25nIG9wdGlvbiB0aGF0IGp1c3Qgc2V0cyBhIGZsYWcuICAqLwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJubSIpOwotCi0gIC8qIE9LLCBhbGwgb3B0aW9ucyBub3cgcGFyc2VkLiAgSWYgbm8gZmlsZW5hbWUgc3BlY2lmaWVkLCBkbyBhLm91dC4gICovCi0gIGlmIChvcHRpbmQgPT0gYXJnYykKLSAgICByZXR1cm4gIWRpc3BsYXlfZmlsZSAoImEub3V0Iik7Ci0KLSAgcmV0dmFsID0gMDsKLQotICBpZiAoYXJnYyAtIG9wdGluZCA+IDEpCi0gICAgZmlsZW5hbWVfcGVyX2ZpbGUgPSAxOwotCi0gIC8qIFdlIHdlcmUgZ2l2ZW4gc2V2ZXJhbCBmaWxlbmFtZXMgdG8gZG8uICAqLwotICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBQUk9HUkVTUyAoMSk7Ci0gICAgICBpZiAoIWRpc3BsYXlfZmlsZSAoYXJndltvcHRpbmQrK10pKQotCXJldHZhbCsrOwotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSNpZmRlZiBIQVZFX1NCUksKLSAgaWYgKHNob3dfc3RhdHMpCi0gICAgewotICAgICAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRhdGEgc2l6ZSAlbGRcbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgICAgIChsb25nKSAobGltIC0gKGNoYXIgKikgJmVudmlyb24pKTsKLSAgICB9Ci0jZW5kaWYKLQotICBleGl0IChyZXR2YWwpOwotICByZXR1cm4gcmV0dmFsOwotfQotDAotc3RhdGljIHZvaWQKLWRpc3BsYXlfYXJjaGl2ZSAoZmlsZSkKLSAgICAgYmZkICpmaWxlOwotewotICBiZmQgKmFyZmlsZSA9IE5VTEw7Ci0gIGJmZCAqbGFzdF9hcmZpbGUgPSBOVUxMOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgKCpmb3JtYXQtPnByaW50X2FyY2hpdmVfZmlsZW5hbWUpIChiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7Ci0KLSAgaWYgKHByaW50X2FybWFwKQotICAgIHByaW50X3N5bWRlZl9lbnRyeSAoZmlsZSk7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBQUk9HUkVTUyAoMSk7Ci0KLSAgICAgIGFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGZpbGUsIGFyZmlsZSk7Ci0KLSAgICAgIGlmIChhcmZpbGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcykKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFyZmlsZSwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLQl7Ci0JICAoKmZvcm1hdC0+cHJpbnRfYXJjaGl2ZV9tZW1iZXIpIChiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSwKLQkJCQkJICAgYmZkX2dldF9maWxlbmFtZSAoYXJmaWxlKSk7Ci0JICBkaXNwbGF5X3JlbF9maWxlIChhcmZpbGUsIGZpbGUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFyZmlsZSkpOwotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQkgICAgewotCSAgICAgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgICAgIGZyZWUgKG1hdGNoaW5nKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxhc3RfYXJmaWxlICE9IE5VTEwpCi0JewotCSAgYmZkX2Nsb3NlIChsYXN0X2FyZmlsZSk7Ci0JICBsaW5lbm9fY2FjaGVfYmZkID0gTlVMTDsKLQkgIGxpbmVub19jYWNoZV9yZWxfYmZkID0gTlVMTDsKLQl9Ci0gICAgICBsYXN0X2FyZmlsZSA9IGFyZmlsZTsKLSAgICB9Ci0KLSAgaWYgKGxhc3RfYXJmaWxlICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChsYXN0X2FyZmlsZSk7Ci0gICAgICBsaW5lbm9fY2FjaGVfYmZkID0gTlVMTDsKLSAgICAgIGxpbmVub19jYWNoZV9yZWxfYmZkID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1kaXNwbGF5X2ZpbGUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgYm9vbGVhbiByZXR2YWwgPSB0cnVlOwotICBiZmQgKmZpbGU7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBmaWxlID0gYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGZpbGUsIGJmZF9hcmNoaXZlKSkKLSAgICB7Ci0gICAgICBkaXNwbGF5X2FyY2hpdmUgKGZpbGUpOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChmaWxlLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgICgqZm9ybWF0LT5wcmludF9vYmplY3RfZmlsZW5hbWUpIChmaWxlbmFtZSk7Ci0gICAgICBkaXNwbGF5X3JlbF9maWxlIChmaWxlLCBOVUxMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGZpbGVuYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgcmV0dmFsID0gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfY2xvc2UgKGZpbGUpID09IGZhbHNlKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotICBsaW5lbm9fY2FjaGVfcmVsX2JmZCA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQwKLS8qIFRoZXNlIGdsb2JhbHMgYXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBzb3J0aW5nCi0gICByb3V0aW5lcy4gICovCi1zdGF0aWMgYmZkICpzb3J0X2JmZDsKLXN0YXRpYyBib29sZWFuIHNvcnRfZHluYW1pYzsKLXN0YXRpYyBhc3ltYm9sICpzb3J0X3g7Ci1zdGF0aWMgYXN5bWJvbCAqc29ydF95OwotCi0vKiBTeW1ib2wtc29ydGluZyBwcmVkaWNhdGVzICovCi0jZGVmaW5lIHZhbHVlb2YoeCkgKCh4KS0+c2VjdGlvbi0+dm1hICsgKHgpLT52YWx1ZSkKLQotLyogTnVtZXJpYyBzb3J0cy4gIFVuZGVmaW5lZCBzeW1ib2xzIGFyZSBhbHdheXMgY29uc2lkZXJlZCAibGVzcyB0aGFuIgotICAgZGVmaW5lZCBzeW1ib2xzIHdpdGggemVybyB2YWx1ZXMuICBDb21tb24gc3ltYm9scyBhcmUgbm90IHRyZWF0ZWQKLSAgIHNwZWNpYWxseSAtLSBpLmUuLCB0aGVpciBzaXplcyBhcmUgdXNlZCBhcyB0aGVpciAidmFsdWVzIi4gICovCi0KLXN0YXRpYyBpbnQKLW51bWVyaWNfZm9yd2FyZCAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGFzeW1ib2wgKngsICp5OwotICBhc2VjdGlvbiAqeHMsICp5czsKLQotICB4ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3gsIHNvcnRfeCk7Ci0gIHkgPSAgYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3ksIHNvcnRfeSk7Ci0gIGlmICh4ID09IE5VTEwgfHwgeSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoc29ydF9iZmQpKTsKLQotICB4cyA9IGJmZF9nZXRfc2VjdGlvbiAoeCk7Ci0gIHlzID0gYmZkX2dldF9zZWN0aW9uICh5KTsKLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uICh4cykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uICh5cykpCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uICh5cykpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKHZhbHVlb2YgKHgpICE9IHZhbHVlb2YgKHkpKQotICAgIHJldHVybiB2YWx1ZW9mICh4KSA8IHZhbHVlb2YgKHkpID8gLTEgOiAxOwotCi0gIHJldHVybiBub25fbnVtZXJpY19mb3J3YXJkIChQX3gsIFBfeSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW51bWVyaWNfcmV2ZXJzZSAoeCwgeSkKLSAgICAgY29uc3QgUFRSIHg7Ci0gICAgIGNvbnN0IFBUUiB5OwotewotICByZXR1cm4gLSBudW1lcmljX2ZvcndhcmQgKHgsIHkpOwotfQotCi1zdGF0aWMgaW50Ci1ub25fbnVtZXJpY19mb3J3YXJkIChQX3gsIFBfeSkKLSAgICAgY29uc3QgUFRSIFBfeDsKLSAgICAgY29uc3QgUFRSIFBfeTsKLXsKLSAgYXN5bWJvbCAqeCwgKnk7Ci0gIGNvbnN0IGNoYXIgKnhuLCAqeW47Ci0KLSAgeCA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF94LCBzb3J0X3gpOwotICB5ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3ksIHNvcnRfeSk7Ci0gIGlmICh4ID09IE5VTEwgfHwgeSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoc29ydF9iZmQpKTsKLQotICB4biA9IGJmZF9hc3ltYm9sX25hbWUgKHgpOwotICB5biA9IGJmZF9hc3ltYm9sX25hbWUgKHkpOwotCi0gIHJldHVybiAoKHhuID09IE5VTEwpID8gKCh5biA9PSBOVUxMKSA/IDAgOiAtMSkgOgotCSAgKCh5biA9PSBOVUxMKSA/IDEgOiBzdHJjbXAgKHhuLCB5bikpKTsKLX0KLQotc3RhdGljIGludAotbm9uX251bWVyaWNfcmV2ZXJzZSAoeCwgeSkKLSAgICAgY29uc3QgUFRSIHg7Ci0gICAgIGNvbnN0IFBUUiB5OwotewotICByZXR1cm4gLSBub25fbnVtZXJpY19mb3J3YXJkICh4LCB5KTsKLX0KLQotc3RhdGljIGludCAoKihzb3J0ZXJzWzJdWzJdKSkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKSA9Ci17Ci0gIHsgbm9uX251bWVyaWNfZm9yd2FyZCwgbm9uX251bWVyaWNfcmV2ZXJzZSB9LAotICB7IG51bWVyaWNfZm9yd2FyZCwgbnVtZXJpY19yZXZlcnNlIH0KLX07Ci0KLS8qIFRoaXMgc29ydCByb3V0aW5lIGlzIHVzZWQgYnkgc29ydF9zeW1ib2xzX2J5X3NpemUuICBJdCBpcyBzaW1pbGFyCi0gICB0byBudW1lcmljX2ZvcndhcmQsIGJ1dCB3aGVuIHN5bWJvbHMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBpdCBzb3J0cwotICAgYnkgc2VjdGlvbiBWTUEuICBUaGlzIHNpbXBsaWZpZXMgdGhlIHNvcnRfc3ltYm9sc19ieV9zaXplIGNvZGUKLSAgIHdoaWNoIGhhbmRsZXMgc3ltYm9scyBhdCB0aGUgZW5kIG9mIHNlY3Rpb25zLiAgQWxzbywgdGhpcyByb3V0aW5lCi0gICB0cmllcyB0byBzb3J0IGZpbGUgbmFtZXMgYmVmb3JlIG90aGVyIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLSAgIFRoYXQgd2lsbCBtYWtlIHRoZSBmaWxlIG5hbWUgaGF2ZSBhIHplcm8gc2l6ZSwgd2hpY2ggd2lsbCBtYWtlCi0gICBzb3J0X3N5bWJvbHNfYnlfc2l6ZSBjaG9vc2UgdGhlIG5vbiBmaWxlIG5hbWUgc3ltYm9sLCBsZWFkaW5nIHRvCi0gICBtb3JlIG1lYW5pbmdmdWwgb3V0cHV0LiAgRm9yIHNpbWlsYXIgcmVhc29ucywgdGhpcyBjb2RlIHNvcnRzCi0gICBnbnVfY29tcGlsZWRfKiBhbmQgZ2NjMl9jb21waWxlZCBiZWZvcmUgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lCi0gICB2YWx1ZS4gICovCi0KLXN0YXRpYyBpbnQKLXNpemVfZm9yd2FyZDEgKFBfeCwgUF95KQotICAgICBjb25zdCBQVFIgUF94OwotICAgICBjb25zdCBQVFIgUF95OwotewotICBhc3ltYm9sICp4LCAqeTsKLSAgYXNlY3Rpb24gKnhzLCAqeXM7Ci0gIGNvbnN0IGNoYXIgKnhuLCAqeW47Ci0gIHNpemVfdCB4bmwsIHlubDsKLSAgaW50IHhmLCB5ZjsKLQotICB4ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3gsIHNvcnRfeCk7Ci0gIHkgPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhzID0gYmZkX2dldF9zZWN0aW9uICh4KTsKLSAgeXMgPSBiZmRfZ2V0X3NlY3Rpb24gKHkpOwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHhzKSkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoeXMpKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh2YWx1ZW9mICh4KSAhPSB2YWx1ZW9mICh5KSkKLSAgICByZXR1cm4gdmFsdWVvZiAoeCkgPCB2YWx1ZW9mICh5KSA/IC0xIDogMTsKLQotICBpZiAoeHMtPnZtYSAhPSB5cy0+dm1hKQotICAgIHJldHVybiB4cy0+dm1hIDwgeXMtPnZtYSA/IC0xIDogMTsKLQotICB4biA9IGJmZF9hc3ltYm9sX25hbWUgKHgpOwotICB5biA9IGJmZF9hc3ltYm9sX25hbWUgKHkpOwotICB4bmwgPSBzdHJsZW4gKHhuKTsKLSAgeW5sID0gc3RybGVuICh5bik7Ci0KLSAgLyogVGhlIHN5bWJvbHMgZ251X2NvbXBpbGVkIGFuZCBnY2MyX2NvbXBpbGVkIGNvbnZleSBldmVuIGxlc3MKLSAgICAgaW5mb3JtYXRpb24gdGhhbiB0aGUgZmlsZSBuYW1lLCBzbyBzb3J0IHRoZW0gb3V0IGZpcnN0LiAgKi8KLQotICB4ZiA9IChzdHJzdHIgKHhuLCAiZ251X2NvbXBpbGVkIikgIT0gTlVMTAotCXx8IHN0cnN0ciAoeG4sICJnY2MyX2NvbXBpbGVkIikgIT0gTlVMTCk7Ci0gIHlmID0gKHN0cnN0ciAoeW4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyICh5biwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLQotICBpZiAoeGYgJiYgISB5ZikKLSAgICByZXR1cm4gLTE7Ci0gIGlmICghIHhmICYmIHlmKQotICAgIHJldHVybiAxOwotCi0gIC8qIFdlIHVzZSBhIGhldXJpc3RpYyBmb3IgdGhlIGZpbGUgbmFtZS4gIEl0IG1heSBub3Qgd29yayBvbiBub24KLSAgICAgVW5peCBzeXN0ZW1zLCBidXQgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyOyB0aGUgb25seSBkaWZmZXJlbmNlCi0gICAgIGlzIHByZWNpc2VseSB3aGljaCBzeW1ib2wgbmFtZXMgZ2V0IHByaW50ZWQuICAqLwotCi0jZGVmaW5lIGZpbGVfc3ltYm9sKHMsIHNuLCBzbmwpCQkJXAotICAoKChzKS0+ZmxhZ3MgJiBCU0ZfRklMRSkgIT0gMAkJCVwKLSAgIHx8ICgoc24pWyhzbmwpIC0gMl0gPT0gJy4nCQkJXAotICAgICAgICYmICgoc24pWyhzbmwpIC0gMV0gPT0gJ28nCQlcCi0JICAgfHwgKHNuKVsoc25sKSAtIDFdID09ICdhJykpKQotCi0gIHhmID0gZmlsZV9zeW1ib2wgKHgsIHhuLCB4bmwpOwotICB5ZiA9IGZpbGVfc3ltYm9sICh5LCB5biwgeW5sKTsKLQotICBpZiAoeGYgJiYgISB5ZikKLSAgICByZXR1cm4gLTE7Ci0gIGlmICghIHhmICYmIHlmKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiBub25fbnVtZXJpY19mb3J3YXJkIChQX3gsIFBfeSk7Ci19Ci0KLS8qIFRoaXMgc29ydCByb3V0aW5lIGlzIHVzZWQgYnkgc29ydF9zeW1ib2xzX2J5X3NpemUuICBJdCBpcyBzb3J0aW5nCi0gICBhbiBhcnJheSBvZiBzaXplX3N5bSBzdHJ1Y3R1cmVzIGludG8gc2l6ZSBvcmRlci4gICovCi0KLXN0YXRpYyBpbnQKLXNpemVfZm9yd2FyZDIgKFBfeCwgUF95KQotICAgICBjb25zdCBQVFIgUF94OwotICAgICBjb25zdCBQVFIgUF95OwotewotICBjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKnggPSAoY29uc3Qgc3RydWN0IHNpemVfc3ltICopIFBfeDsKLSAgY29uc3Qgc3RydWN0IHNpemVfc3ltICp5ID0gKGNvbnN0IHN0cnVjdCBzaXplX3N5bSAqKSBQX3k7Ci0KLSAgaWYgKHgtPnNpemUgPCB5LT5zaXplKQotICAgIHJldHVybiByZXZlcnNlX3NvcnQgPyAxIDogLTE7Ci0gIGVsc2UgaWYgKHgtPnNpemUgPiB5LT5zaXplKQotICAgIHJldHVybiByZXZlcnNlX3NvcnQgPyAtMSA6IDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gc29ydGVyc1swXVtyZXZlcnNlX3NvcnRdICh4LT5taW5pc3ltLCB5LT5taW5pc3ltKTsKLX0KLQotLyogU29ydCB0aGUgc3ltYm9scyBieSBzaXplLiAgV2UgZ3Vlc3MgdGhlIHNpemUgYnkgYXNzdW1pbmcgdGhhdCB0aGUKLSAgIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICBuZXh0IGhpZ2hlciBzeW1ib2wgaXMgdGhlIHNpemUuICBGSVhNRTogRUxGIGFjdHVhbGx5IHN0b3JlcyBhIHNpemUKLSAgIHdpdGggZWFjaCBzeW1ib2wuICBXZSBzaG91bGQgdXNlIGl0LiAgKi8KLQotc3RhdGljIGxvbmcKLXNvcnRfc3ltYm9sc19ieV9zaXplIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUsIHN5bXNpemVzcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHN0cnVjdCBzaXplX3N5bSAqKnN5bXNpemVzcDsKLXsKLSAgc3RydWN0IHNpemVfc3ltICpzeW1zaXplczsKLSAgYmZkX2J5dGUgKmZyb20sICpmcm9tZW5kOwotICBhc3ltYm9sICpzeW0gPSBOVUxMOwotICBhc3ltYm9sICpzdG9yZV9zeW0sICpzdG9yZV9uZXh0OwotCi0gIHFzb3J0IChtaW5pc3ltcywgc3ltY291bnQsIHNpemUsIHNpemVfZm9yd2FyZDEpOwotCi0gIC8qIFdlIGFyZSBnb2luZyB0byByZXR1cm4gYSBzcGVjaWFsIHNldCBvZiBzeW1ib2xzIGFuZCBzaXplcyB0bwotICAgICBwcmludC4gICovCi0gIHN5bXNpemVzID0gKHN0cnVjdCBzaXplX3N5bSAqKSB4bWFsbG9jIChzeW1jb3VudCAqIHNpemVvZiAoc3RydWN0IHNpemVfc3ltKSk7Ci0gICpzeW1zaXplc3AgPSBzeW1zaXplczsKLQotICAvKiBOb3RlIHRoYXQgZmlsdGVyX3N5bWJvbHMgaGFzIGFscmVhZHkgcmVtb3ZlZCBhbGwgYWJzb2x1dGUgYW5kCi0gICAgIHVuZGVmaW5lZCBzeW1ib2xzLiAgSGVyZSB3ZSByZW1vdmUgYWxsIHN5bWJvbHMgd2hvc2Ugc2l6ZSB3aW5kcwotICAgICB1cCBhcyB6ZXJvLiAgKi8KLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLQotICBzdG9yZV9zeW0gPSBzb3J0X3g7Ci0gIHN0b3JlX25leHQgPSBzb3J0X3k7Ci0KLSAgaWYgKGZyb20gPCBmcm9tZW5kKQotICAgIHsKLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgKGNvbnN0IFBUUikgZnJvbSwKLQkJCQkgICAgICBzdG9yZV9zeW0pOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgIH0KLQotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpuZXh0OwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgc3o7Ci0gICAgICBhc3ltYm9sICp0ZW1wOwotCi0gICAgICBpZiAoZnJvbSArIHNpemUgPCBmcm9tZW5kKQotCXsKLQkgIG5leHQgPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsCi0JCQkJCSAgIGR5bmFtaWMsCi0JCQkJCSAgIChjb25zdCBQVFIpIChmcm9tICsgc2l6ZSksCi0JCQkJCSAgIHN0b3JlX25leHQpOwotCSAgaWYgKG5leHQgPT0gTlVMTCkKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JfQotICAgICAgZWxzZQotCW5leHQgPSBOVUxMOwotCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSk7Ci0KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0Jc3ogPSBzeW0tPnZhbHVlOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChmcm9tICsgc2l6ZSA8IGZyb21lbmQKLQkgICAgICAmJiBzZWMgPT0gYmZkX2dldF9zZWN0aW9uIChuZXh0KSkKLQkgICAgc3ogPSB2YWx1ZW9mIChuZXh0KSAtIHZhbHVlb2YgKHN5bSk7Ci0JICBlbHNlCi0JICAgIHN6ID0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJICArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykKLQkJICAtIHZhbHVlb2YgKHN5bSkpOwotCX0KLQotICAgICAgaWYgKHN6ICE9IDApCi0JewotCSAgc3ltc2l6ZXMtPm1pbmlzeW0gPSAoY29uc3QgUFRSKSBmcm9tOwotCSAgc3ltc2l6ZXMtPnNpemUgPSBzejsKLQkgICsrc3ltc2l6ZXM7Ci0JfQotCi0gICAgICBzeW0gPSBuZXh0OwotCi0gICAgICB0ZW1wID0gc3RvcmVfc3ltOwotICAgICAgc3RvcmVfc3ltID0gc3RvcmVfbmV4dDsKLSAgICAgIHN0b3JlX25leHQgPSB0ZW1wOwotICAgIH0KLQotICBzeW1jb3VudCA9IHN5bXNpemVzIC0gKnN5bXNpemVzcDsKLQotICAvKiBXZSBtdXN0IG5vdyBzb3J0IGFnYWluIGJ5IHNpemUuICAqLwotICBxc29ydCAoKFBUUikgKnN5bXNpemVzcCwgc3ltY291bnQsIHNpemVvZiAoc3RydWN0IHNpemVfc3ltKSwgc2l6ZV9mb3J3YXJkMik7Ci0KLSAgcmV0dXJuIHN5bWNvdW50OwotfQotDAotLyogSWYgQVJDSElWRV9CRkQgaXMgbm9uLU5VTEwsIGl0IGlzIHRoZSBhcmNoaXZlIGNvbnRhaW5pbmcgQUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3JlbF9maWxlIChhYmZkLCBhcmNoaXZlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKmFyY2hpdmVfYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBQVFIgbWluaXN5bXM7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotCi0gIGlmICghIGR5bmFtaWMpCi0gICAgewotICAgICAgaWYgKCEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEhBU19TWU1TKSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgc3ltY291bnQgPSBiZmRfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgJm1pbmlzeW1zLCAmc2l6ZSk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKHN5bWNvdW50ID09IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRGlzY2FyZCB0aGUgc3ltYm9scyB3ZSBkb24ndCB3YW50IHRvIHByaW50LgotICAgICBJdCdzIE9LIHRvIGRvIHRoaXMgaW4gcGxhY2U7IHdlJ2xsIGZyZWUgdGhlIHN0b3JhZ2UgYW55d2F5Ci0gICAgIChhZnRlciBwcmludGluZykuICAqLwotCi0gIHN5bWNvdW50ID0gZmlsdGVyX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSk7Ci0KLSAgc3ltc2l6ZXMgPSBOVUxMOwotICBpZiAoISBub19zb3J0KQotICAgIHsKLSAgICAgIHNvcnRfYmZkID0gYWJmZDsKLSAgICAgIHNvcnRfZHluYW1pYyA9IGR5bmFtaWM7Ci0gICAgICBzb3J0X3ggPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICAgICAgc29ydF95ID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgICAgIGlmIChzb3J0X3ggPT0gTlVMTCB8fCBzb3J0X3kgPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgaWYgKCEgc29ydF9ieV9zaXplKQotCXFzb3J0IChtaW5pc3ltcywgc3ltY291bnQsIHNpemUsCi0JICAgICAgIHNvcnRlcnNbc29ydF9udW1lcmljYWxseV1bcmV2ZXJzZV9zb3J0XSk7Ci0gICAgICBlbHNlCi0Jc3ltY291bnQgPSBzb3J0X3N5bWJvbHNfYnlfc2l6ZSAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LAotCQkJCQkgc2l6ZSwgJnN5bXNpemVzKTsKLSAgICB9Ci0KLSAgaWYgKCEgc29ydF9ieV9zaXplKQotICAgIHByaW50X3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgYXJjaGl2ZV9iZmQpOwotICBlbHNlCi0gICAgcHJpbnRfc2l6ZV9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBzeW1zaXplcywgc3ltY291bnQsIGFyY2hpdmVfYmZkKTsKLQotICBmcmVlIChtaW5pc3ltcyk7Ci19Ci0MCi0vKiBDaG9vc2Ugd2hpY2ggc3ltYm9sIGVudHJpZXMgdG8gcHJpbnQ7Ci0gICBjb21wYWN0IHRoZW0gZG93bndhcmQgdG8gZ2V0IHJpZCBvZiB0aGUgcmVzdC4KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gYmUgcHJpbnRlZC4gICovCi0KLXN0YXRpYyBsb25nCi1maWx0ZXJfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgYmZkX2J5dGUgKmZyb20sICpmcm9tZW5kLCAqdG87Ci0gIGFzeW1ib2wgKnN0b3JlOwotCi0gIHN0b3JlID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgaWYgKHN0b3JlID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgZnJvbSA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudCAqIHNpemU7Ci0gIHRvID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotCi0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGludCBrZWVwID0gMDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLQotICAgICAgUFJPR1JFU1MgKDEpOwotICAgICAgCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIChjb25zdCBQVFIpIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgaWYgKHVuZGVmaW5lZF9vbmx5KQotCWtlZXAgPSBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbik7Ci0gICAgICBlbHNlIGlmIChleHRlcm5hbF9vbmx5KQotCWtlZXAgPSAoKHN5bS0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCi0JCXx8IChzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkJfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JCXx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSk7Ci0gICAgICBlbHNlCi0Ja2VlcCA9IDE7Ci0KLSAgICAgIGlmIChrZWVwCi0JICAmJiAhIHByaW50X2RlYnVnX3N5bXMKLQkgICYmIChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkKLQlrZWVwID0gMDsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmIHNvcnRfYnlfc2l6ZQotCSAgJiYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkpCi0Ja2VlcCA9IDA7Ci0KLSAgICAgIGlmIChrZWVwCi0JICAmJiBkZWZpbmVkX29ubHkpCi0JewotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkgICAga2VlcCA9IDA7Ci0JfQotCi0gICAgICBpZiAoa2VlcCkKLQl7Ci0JICBtZW1jcHkgKHRvLCBmcm9tLCBzaXplKTsKLQkgIHRvICs9IHNpemU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKHRvIC0gKGJmZF9ieXRlICopIG1pbmlzeW1zKSAvIHNpemU7Ci19Ci0MCi0vKiBQcmludCBzeW1ib2wgbmFtZSBOQU1FLCByZWFkIGZyb20gQUJGRCwgd2l0aCBwcmludGYgZm9ybWF0IEZPUk1BVCwKLSAgIGRlbWFuZ2xpbmcgaXQgaWYgcmVxdWVzdGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bW5hbWUgKGZvcm1hdCwgbmFtZSwgYWJmZCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChkb19kZW1hbmdsZSAmJiAqbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpyZXM7Ci0KLSAgICAgIC8qIEluIHRoaXMgbW9kZSwgZ2l2ZSBhIHVzZXItbGV2ZWwgdmlldyBvZiB0aGUgc3ltYm9sIG5hbWUKLQkgZXZlbiBpZiBpdCdzIG5vdCBtYW5nbGVkOyBzdHJpcCBvZmYgYW55IGxlYWRpbmcKLQkgdW5kZXJzY29yZS4gICovCi0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSBuYW1lWzBdKQotCW5hbWUrKzsKLQotICAgICAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKG5hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLSAgICAgIGlmIChyZXMpCi0JewotCSAgcHJpbnRmIChmb3JtYXQsIHJlcyk7Ci0JICBmcmVlIChyZXMpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgcHJpbnRmIChmb3JtYXQsIG5hbWUpOwotfQotCi0vKiBQcmludCB0aGUgc3ltYm9scy4gIElmIEFSQ0hJVkVfQkZEIGlzIG5vbi1OVUxMLCBpdCBpcyB0aGUgYXJjaGl2ZQotICAgY29udGFpbmluZyBBQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgYXJjaGl2ZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBiZmQgKmFyY2hpdmVfYmZkOwotewotICBhc3ltYm9sICpzdG9yZTsKLSAgYmZkX2J5dGUgKmZyb20sICpmcm9tZW5kOwotCi0gIHN0b3JlID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgaWYgKHN0b3JlID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgZnJvbSA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudCAqIHNpemU7Ci0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLQotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBmcm9tLCBzdG9yZSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIHByaW50X3N5bWJvbCAoYWJmZCwgc3ltLCBhcmNoaXZlX2JmZCk7Ci0gICAgfQotfQotCi0vKiBQcmludCB0aGUgc3ltYm9scyB3aGVuIHNvcnRpbmcgYnkgc2l6ZS4gICovCi0KLXN0YXRpYyB2b2lkIAotcHJpbnRfc2l6ZV9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBzeW1zaXplcywgc3ltY291bnQsIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgc3RydWN0IHNpemVfc3ltICpzeW1zaXplczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgYmZkICphcmNoaXZlX2JmZDsKLXsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0gIHN0cnVjdCBzaXplX3N5bSAqZnJvbSwgKmZyb21lbmQ7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gc3ltc2l6ZXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQ7Ci0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLQotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBmcm9tLT5taW5pc3ltLCBzdG9yZSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIC8qIFNldCB0aGUgc3ltYm9sIHZhbHVlIHNvIHRoYXQgd2UgYWN0dWFsbHkgZGlzcGxheSB0aGUgc3ltYm9sCi0gICAgICAgICBzaXplLiAgKi8KLSAgICAgIHN5bS0+dmFsdWUgPSBmcm9tLT5zaXplIC0gYmZkX3NlY3Rpb25fdm1hIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpOwotCi0gICAgICBwcmludF9zeW1ib2wgKGFiZmQsIHN5bSwgYXJjaGl2ZV9iZmQpOwotICAgIH0KLX0KLQotLyogUHJpbnQgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbCAoYWJmZCwgc3ltLCBhcmNoaXZlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIFBST0dSRVNTICgxKTsKLQotICAoKmZvcm1hdC0+cHJpbnRfc3ltYm9sX2ZpbGVuYW1lKSAoYXJjaGl2ZV9iZmQsIGFiZmQpOwotCi0gIGlmICh1bmRlZmluZWRfb25seSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXByaW50X3N5bW5hbWUgKCIlcyIsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGFiZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbF9pbmZvIHN5bWluZm87Ci0KLSAgICAgIGJmZF9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bSwgJnN5bWluZm8pOwotICAgICAgKCpmb3JtYXQtPnByaW50X3N5bWJvbF9pbmZvKSAoJnN5bWluZm8sIGFiZmQpOwotICAgIH0KLQotICBpZiAobGluZV9udW1iZXJzKQotICAgIHsKLSAgICAgIHN0YXRpYyBhc3ltYm9sICoqc3ltczsKLSAgICAgIHN0YXRpYyBsb25nIHN5bWNvdW50OwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICpmdW5jdGlvbm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZW5vOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGdldCB0aGUgY2Fub25pY2FsIHN5bWJvbHMgaW4gb3JkZXIgdG8gY2FsbAotICAgICAgICAgYmZkX2ZpbmRfbmVhcmVzdF9saW5lLiAgVGhpcyBpcyBpbmVmZmljaWVudCwgYnV0LCB0aGVuLCB5b3UKLSAgICAgICAgIGRvbid0IGhhdmUgdG8gdXNlIC0tbGluZS1udW1iZXJzLiAgKi8KLSAgICAgIGlmIChhYmZkICE9IGxpbmVub19jYWNoZV9iZmQgJiYgc3ltcyAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHN5bXMpOwotCSAgc3ltcyA9IE5VTEw7Ci0JfQotICAgICAgaWYgKHN5bXMgPT0gTlVMTCkKLQl7Ci0JICBsb25nIHN5bXNpemU7Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0JICBpZiAoc3ltc2l6ZSA8IDApCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bXMpOwotCSAgaWYgKHN5bWNvdW50IDwgMCkKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBsaW5lbm9fY2FjaGVfYmZkID0gYWJmZDsKLQl9Ci0KLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgc3RhdGljIGFzZWN0aW9uICoqc2VjczsKLQkgIHN0YXRpYyBhcmVsZW50ICoqKnJlbG9jczsKLQkgIHN0YXRpYyBsb25nICpyZWxjb3VudDsKLQkgIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VjY291bnQ7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQkgIGNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0KLQkgIC8qIEZvciBhbiB1bmRlZmluZWQgc3ltYm9sLCB3ZSB0cnkgdG8gZmluZCBhIHJlbG9jIGZvciB0aGUKLSAgICAgICAgICAgICBzeW1ib2wsIGFuZCBwcmludCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHJlbG9jLiAgKi8KLQotCSAgaWYgKGFiZmQgIT0gbGluZW5vX2NhY2hlX3JlbF9iZmQgJiYgcmVsb2NzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VjY291bnQ7IGkrKykKLQkJaWYgKHJlbG9jc1tpXSAhPSBOVUxMKQotCQkgIGZyZWUgKHJlbG9jc1tpXSk7Ci0JICAgICAgZnJlZSAoc2Vjcyk7Ci0JICAgICAgZnJlZSAocmVsb2NzKTsKLQkgICAgICBmcmVlIChyZWxjb3VudCk7Ci0JICAgICAgc2VjcyA9IE5VTEw7Ci0JICAgICAgcmVsb2NzID0gTlVMTDsKLQkgICAgICByZWxjb3VudCA9IE5VTEw7Ci0JICAgIH0KLQotCSAgaWYgKHJlbG9jcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGdldF9yZWxvY3NfaW5mbyBpbmZvOwotCi0JICAgICAgc2VjY291bnQgPSBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpOwotCi0JICAgICAgc2VjcyA9IChhc2VjdGlvbiAqKikgeG1hbGxvYyAoc2VjY291bnQgKiBzaXplb2YgKnNlY3MpOwotCSAgICAgIHJlbG9jcyA9IChhcmVsZW50ICoqKikgeG1hbGxvYyAoc2VjY291bnQgKiBzaXplb2YgKnJlbG9jcyk7Ci0JICAgICAgcmVsY291bnQgPSAobG9uZyAqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqcmVsY291bnQpOwotCi0JICAgICAgaW5mby5zZWNzID0gc2VjczsKLQkgICAgICBpbmZvLnJlbG9jcyA9IHJlbG9jczsKLQkgICAgICBpbmZvLnJlbGNvdW50ID0gcmVsY291bnQ7Ci0JICAgICAgaW5mby5zeW1zID0gc3ltczsKLQkgICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGdldF9yZWxvY3MsIChQVFIpICZpbmZvKTsKLQkgICAgICBsaW5lbm9fY2FjaGVfcmVsX2JmZCA9IGFiZmQ7Ci0JICAgIH0KLQotCSAgc3ltbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2VjY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGxvbmcgajsKLQotCSAgICAgIGZvciAoaiA9IDA7IGogPCByZWxjb3VudFtpXTsgaisrKQotCQl7Ci0JCSAgYXJlbGVudCAqcjsKLQotCQkgIHIgPSByZWxvY3NbaV1bal07Ci0JCSAgaWYgKHItPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkJICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24gPT0gc3ltLT5zZWN0aW9uCi0JCSAgICAgICYmICgqci0+c3ltX3B0cl9wdHIpLT52YWx1ZSA9PSBzeW0tPnZhbHVlCi0JCSAgICAgICYmIHN0cmNtcCAoc3ltbmFtZSwKLQkJCQkgYmZkX2FzeW1ib2xfbmFtZSAoKnItPnN5bV9wdHJfcHRyKSkgPT0gMAotCQkgICAgICAmJiBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3NbaV0sIHN5bXMsCi0JCQkJCQlyLT5hZGRyZXNzLCAmZmlsZW5hbWUsCi0JCQkJCQkmZnVuY3Rpb25uYW1lLCAmbGluZW5vKSkKLQkJICAgIHsKLQkJICAgICAgLyogV2Ugb25seSBwcmludCB0aGUgZmlyc3Qgb25lIHdlIGZpbmQuICAqLwotCQkgICAgICBwcmludGYgKCJcdCVzOiV1IiwgZmlsZW5hbWUsIGxpbmVubyk7Ci0JCSAgICAgIGkgPSBzZWNjb3VudDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+b3duZXIgPT0gYWJmZCkKLQl7Ci0JICBpZiAoYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSksIHN5bXMsCi0JCQkJICAgICBzeW0tPnZhbHVlLCAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsCi0JCQkJICAgICAmbGluZW5vKQotCSAgICAgICYmIGZpbGVuYW1lICE9IE5VTEwKLQkgICAgICAmJiBsaW5lbm8gIT0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlx0JXM6JXUiLCBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcHV0Y2hhciAoJ1xuJyk7Ci19Ci0MCi0vKiBUaGUgZm9sbG93aW5nIDMgZ3JvdXBzIG9mIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHVuY29uZGl0aW9uYWxseSwKLSAgIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIHByb2Nlc3NpbmcgZWFjaCBmaWxlIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgotICAgVGhleSBzaG91bGQgY2hlY2sgYGZpbGVuYW1lX3Blcl9maWxlJyBhbmQgYGZpbGVuYW1lX3Blcl9zeW1ib2wnLAotICAgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZWlyIG91dHB1dCBmb3JtYXQsIHRvIGRldGVybWluZSB3aGV0aGVyIHRvCi0gICBwcmludCBhbnl0aGluZy4gICovCi0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiBhbiBvYmplY3QgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9ic2QgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9maWxlICYmICFmaWxlbmFtZV9wZXJfc3ltYm9sKQotICAgIHByaW50ZiAoIlxuJXM6XG4iLCBmaWxlbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfc3lzdiAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAodW5kZWZpbmVkX29ubHkpCi0gICAgcHJpbnRmIChfKCJcblxuVW5kZWZpbmVkIHN5bWJvbHMgZnJvbSAlczpcblxuIiksIGZpbGVuYW1lKTsKLSAgZWxzZQotICAgIHByaW50ZiAoXygiXG5cblN5bWJvbHMgZnJvbSAlczpcblxuIiksIGZpbGVuYW1lKTsKLSAgcHJpbnRmIChfKCJcCi1OYW1lICAgICAgICAgICAgICAgICAgVmFsdWUgICBDbGFzcyAgICAgICAgVHlwZSAgICAgICAgIFNpemUgICBMaW5lICBTZWN0aW9uXG5cbiIpKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9wb3NpeCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoZmlsZW5hbWVfcGVyX2ZpbGUgJiYgIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiJXM6XG4iLCBmaWxlbmFtZSk7Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX2JzZCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoZmlsZW5hbWVfcGVyX2ZpbGUpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfc3lzdiAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLX0KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgbWVtYmVyIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfYnNkIChhcmNoaXZlLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqYXJjaGl2ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKCFmaWxlbmFtZV9wZXJfc3ltYm9sKQotICAgIHByaW50ZiAoIlxuJXM6XG4iLCBmaWxlbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9zeXN2IChhcmNoaXZlLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqYXJjaGl2ZTsKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICh1bmRlZmluZWRfb25seSkKLSAgICBwcmludGYgKF8oIlxuXG5VbmRlZmluZWQgc3ltYm9scyBmcm9tICVzWyVzXTpcblxuIiksIGFyY2hpdmUsIGZpbGVuYW1lKTsKLSAgZWxzZQotICAgIHByaW50ZiAoXygiXG5cblN5bWJvbHMgZnJvbSAlc1slc106XG5cbiIpLCBhcmNoaXZlLCBmaWxlbmFtZSk7Ci0gIHByaW50ZiAoXygiXAotTmFtZSAgICAgICAgICAgICAgICAgIFZhbHVlICAgQ2xhc3MgICAgICAgIFR5cGUgICAgICAgICBTaXplICAgTGluZSAgU2VjdGlvblxuXG4iKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCAoYXJjaGl2ZSwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKmFyY2hpdmU7Ci0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiJXNbJXNdOlxuIiwgYXJjaGl2ZSwgZmlsZW5hbWUpOwotfQotDAotLyogUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgKGFuZCBhcmNoaXZlLCBpZiB0aGVyZSBpcyBvbmUpCi0gICBjb250YWluaW5nIGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9maWxlbmFtZV9ic2QgKGFyY2hpdmVfYmZkLCBhYmZkKQotICAgICBiZmQgKmFyY2hpdmVfYmZkLCAqYWJmZDsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgewotICAgICAgaWYgKGFyY2hpdmVfYmZkKQotCXByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFyY2hpdmVfYmZkKSk7Ci0gICAgICBwcmludGYgKCIlczoiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3N5c3YgKGFyY2hpdmVfYmZkLCBhYmZkKQotICAgICBiZmQgKmFyY2hpdmVfYmZkLCAqYWJmZDsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgewotICAgICAgaWYgKGFyY2hpdmVfYmZkKQotCXByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFyY2hpdmVfYmZkKSk7Ci0gICAgICBwcmludGYgKCIlczoiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3Bvc2l4IChhcmNoaXZlX2JmZCwgYWJmZCkKLSAgICAgYmZkICphcmNoaXZlX2JmZCwgKmFiZmQ7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfc3ltYm9sKQotICAgIHsKLSAgICAgIGlmIChhcmNoaXZlX2JmZCkKLQlwcmludGYgKCIlc1slc106ICIsIGJmZF9nZXRfZmlsZW5hbWUgKGFyY2hpdmVfYmZkKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVzOiAiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotfQotDAotLyogUHJpbnQgYSBzeW1ib2wgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfdmFsdWUgKHZhbCkKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0jaWYgISBkZWZpbmVkIChCRkQ2NCkgfHwgQkZEX0hPU1RfNjRCSVRfTE9ORwotICBwcmludGYgKHZhbHVlX2Zvcm1hdCwgdmFsKTsKLSNlbHNlCi0gIC8qIFdlIGhhdmUgYSA2NCBiaXQgdmFsdWUgdG8gcHJpbnQsIGJ1dCB0aGUgaG9zdCBpcyBvbmx5IDMyIGJpdC4gICovCi0gIGlmIChwcmludF9yYWRpeCA9PSAxNikKLSAgICBmcHJpbnRmX3ZtYSAoc3Rkb3V0LCB2YWwpOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbMzBdOwotICAgICAgY2hhciAqczsKLQotICAgICAgcyA9IGJ1ZiArIHNpemVvZiBidWY7Ci0gICAgICAqLS1zID0gJ1wwJzsKLSAgICAgIHdoaWxlICh2YWwgPiAwKQotCXsKLQkgICotLXMgPSAodmFsICUgcHJpbnRfcmFkaXgpICsgJzAnOwotCSAgdmFsIC89IHByaW50X3JhZGl4OwotCX0KLSAgICAgIHdoaWxlICgoYnVmICsgc2l6ZW9mIGJ1ZiAtIDEpIC0gcyA8IDE2KQotCSotLXMgPSAnMCc7Ci0gICAgICBwcmludGYgKCIlcyIsIHMpOwotICAgIH0KLSNlbmRpZgotfQotCi0vKiBQcmludCBhIGxpbmUgb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fYnNkIChpbmZvLCBhYmZkKQotICAgICBzeW1ib2xfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoaW5mby0+dHlwZSA9PSAnVScgfHwgaW5mby0+dHlwZSA9PSAndycpCi0gICAgewotICAgICAgcHJpbnRmICgiJSpzIiwKLSNpZmRlZiBCRkQ2NAotCSAgICAgIDE2LAotI2Vsc2UKLQkgICAgICA4LAotI2VuZGlmCi0JICAgICAgIiIpOwotICAgIH0KLSAgZWxzZQotICAgIHByaW50X3ZhbHVlIChpbmZvLT52YWx1ZSk7Ci0gIHByaW50ZiAoIiAlYyIsIGluZm8tPnR5cGUpOwotICBpZiAoaW5mby0+dHlwZSA9PSAnLScpCi0gICAgewotICAgICAgLyogQSBzdGFiLiAgKi8KLSAgICAgIHByaW50ZiAoIiAiKTsKLSAgICAgIHByaW50ZiAob3RoZXJfZm9ybWF0LCBpbmZvLT5zdGFiX290aGVyKTsKLSAgICAgIHByaW50ZiAoIiAiKTsKLSAgICAgIHByaW50ZiAoZGVzY19mb3JtYXQsIGluZm8tPnN0YWJfZGVzYyk7Ci0gICAgICBwcmludGYgKCIgJTVzIiwgaW5mby0+c3RhYl9uYW1lKTsKLSAgICB9Ci0gIHByaW50X3N5bW5hbWUgKCIgJXMiLCBpbmZvLT5uYW1lLCBhYmZkKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX3N5c3YgKGluZm8sIGFiZmQpCi0gICAgIHN5bWJvbF9pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHByaW50X3N5bW5hbWUgKCIlLTIwc3wiLCBpbmZvLT5uYW1lLCBhYmZkKTsJLyogTmFtZSAqLwotICBpZiAoaW5mby0+dHlwZSA9PSAnVScgfHwgaW5mby0+dHlwZSA9PSAndycpCi0gICAgcHJpbnRmICgiICAgICAgICAiKTsJLyogVmFsdWUgKi8KLSAgZWxzZQotICAgIHByaW50X3ZhbHVlIChpbmZvLT52YWx1ZSk7Ci0gIHByaW50ZiAoInwgICAlYyAgfCIsIGluZm8tPnR5cGUpOwkvKiBDbGFzcyAqLwotICBpZiAoaW5mby0+dHlwZSA9PSAnLScpCi0gICAgewotICAgICAgLyogQSBzdGFiLiAgKi8KLSAgICAgIHByaW50ZiAoIiUxOHN8ICAiLCBpbmZvLT5zdGFiX25hbWUpOwkvKiAoQykgVHlwZSAqLwotICAgICAgcHJpbnRmIChkZXNjX2Zvcm1hdCwgaW5mby0+c3RhYl9kZXNjKTsJLyogU2l6ZSAqLwotICAgICAgcHJpbnRmICgifCAgICAgfCIpOwkvKiBMaW5lLCBTZWN0aW9uICovCi0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmICgiICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgIHwiKTsJLyogVHlwZSwgU2l6ZSwgTGluZSwgU2VjdGlvbiAqLwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fcG9zaXggKGluZm8sIGFiZmQpCi0gICAgIHN5bWJvbF9pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHByaW50X3N5bW5hbWUgKCIlcyAiLCBpbmZvLT5uYW1lLCBhYmZkKTsKLSAgcHJpbnRmICgiJWMgIiwgaW5mby0+dHlwZSk7Ci0gIGlmIChpbmZvLT50eXBlID09ICdVJyB8fCBpbmZvLT50eXBlID09ICd3JykKLSAgICBwcmludGYgKCIgICAgICAgICIpOwotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgLyogUE9TSVguMiB3YW50cyB0aGUgc3ltYm9sIHNpemUgcHJpbnRlZCBoZXJlLCB3aGVuIGFwcGxpY2FibGU7Ci0gICAgIEJGRCBjdXJyZW50bHkgZG9lc24ndCBwcm92aWRlIGl0LCBzbyB3ZSB0YWtlIHRoZSBlYXN5IHdheSBvdXQgYnkKLSAgICAgY29uc2lkZXJpbmcgaXQgdG8gbmV2ZXIgYmUgYXBwbGljYWJsZS4gICovCi19Ci0MCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltZGVmX2VudHJ5IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN5bWluZGV4IGlkeCA9IEJGRF9OT19NT1JFX1NZTUJPTFM7Ci0gIGNhcnN5bSAqdGhlc3ltOwotICBib29sZWFuIGV2ZXJwcmludGVkID0gZmFsc2U7Ci0KLSAgZm9yIChpZHggPSBiZmRfZ2V0X25leHRfbWFwZW50IChhYmZkLCBpZHgsICZ0aGVzeW0pOwotICAgICAgIGlkeCAhPSBCRkRfTk9fTU9SRV9TWU1CT0xTOwotICAgICAgIGlkeCA9IGJmZF9nZXRfbmV4dF9tYXBlbnQgKGFiZmQsIGlkeCwgJnRoZXN5bSkpCi0gICAgewotICAgICAgYmZkICplbHQ7Ci0gICAgICBpZiAoIWV2ZXJwcmludGVkKQotCXsKLQkgIHByaW50ZiAoXygiXG5BcmNoaXZlIGluZGV4OlxuIikpOwotCSAgZXZlcnByaW50ZWQgPSB0cnVlOwotCX0KLSAgICAgIGVsdCA9IGJmZF9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpZHgpOwotICAgICAgaWYgKGVsdCA9PSBOVUxMKQotCWJmZF9mYXRhbCAoImJmZF9nZXRfZWx0X2F0X2luZGV4Iik7Ci0gICAgICBpZiAodGhlc3ltLT5uYW1lICE9IChjaGFyICopIE5VTEwpCi0JewotCSAgcHJpbnRfc3ltbmFtZSAoIiVzIiwgdGhlc3ltLT5uYW1lLCBhYmZkKTsKLQkgIHByaW50ZiAoIiBpbiAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoZWx0KSk7Ci0JfQotICAgIH0KLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgdGhlIHJlbG9jcyBmb3IgYSBwYXJ0aWN1bGFyIHNlY3Rpb24uCi0gICBJdCBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGFhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGFhcmc7Ci17Ci0gIHN0cnVjdCBnZXRfcmVsb2NzX2luZm8gKmRhdGEgPSAoc3RydWN0IGdldF9yZWxvY3NfaW5mbyAqKSBkYXRhYXJnOwotCi0gICpkYXRhLT5zZWNzID0gc2VjOwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLSAgICB7Ci0gICAgICAqZGF0YS0+cmVsb2NzID0gTlVMTDsKLSAgICAgICpkYXRhLT5yZWxjb3VudCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyByZWxzaXplOwotCi0gICAgICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKTsKLSAgICAgIGlmIChyZWxzaXplIDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgKmRhdGEtPnJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgICAgICpkYXRhLT5yZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlYywgKmRhdGEtPnJlbG9jcywKLQkJCQkJCWRhdGEtPnN5bXMpOwotICAgICAgaWYgKCpkYXRhLT5yZWxjb3VudCA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotCi0gICsrZGF0YS0+c2VjczsKLSAgKytkYXRhLT5yZWxvY3M7Ci0gICsrZGF0YS0+cmVsY291bnQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9ub3QtcmFubGliLmMgYi9iaW51dGlscy9ub3QtcmFubGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjljZWIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbm90LXJhbmxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0vKiBMaW5rZWQgd2l0aCBhci5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gaXMgJ2FyJyAobm90ICdyYW5saWInKS4gKi8KLQotaW50IGlzX3JhbmxpYiA9IDA7CmRpZmYgLS1naXQgYS9iaW51dGlscy9ub3Qtc3RyaXAuYyBiL2JpbnV0aWxzL25vdC1zdHJpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA5M2NlLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25vdC1zdHJpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0vKiBMaW5rZWQgd2l0aCBvYmpjb3B5Lm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAnb2JqY29weScgKG5vdAotICAgJ3N0cmlwJykuICovCi0KLWludCBpc19zdHJpcCA9IDA7CmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpjb3B5LjEgYi9iaW51dGlscy9vYmpjb3B5LjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmEyOTYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvb2JqY29weS4xCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBvYmpjb3B5IDEgIjE5OTkiICJDeWdudXMgU29sdXRpb25zIiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLW9iamNvcHkgXC0gY29weSBhbmQgdHJhbnNsYXRlIG9iamVjdCBmaWxlcwotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgb2JqY29weQotLlJCICJbXHwiIFwtRlwgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtSVwgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU9cIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtalwgXGZJc2VjdGlvbm5hbWVcZlJcIHxcIFxmQlwtXC1vbmx5XC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1SXCBcZklzZWN0aW9ubmFtZVxmUlwgfFwgXGZCXC1cLXJlbW92ZVwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZVxmUiAiXHxdIgotLlJCICJbXHwiIFwtU1xmUlwgfFwgXGZCXC1cLXN0cmlwXC1hbGxcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1nXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWRlYnVnXGZSICJcfF0iIAotLlJCICJbXHwiIFwtXC1zdHJpcFwtdW5uZWVkZWRcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1LXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1OXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtTFwgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLWxvY2FsaXplXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVdcIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC13ZWFrZW5cLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwteFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWFsbFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVhcZlJcIHxcIFxmQlwtXC1kaXNjYXJkXC1sb2NhbHNcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1iXCBcZklieXRlXGZSXCB8XCBcZkJcLVwtYnl0ZT1cZklieXRlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtaVwgXGZJaW50ZXJsZWF2ZVxmUlwgfFwgXGZCXC1cLWludGVybGVhdmU9XGZJaW50ZXJsZWF2ZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLXBcZlJcIHxcIFxmQlwtXC1wcmVzZXJ2ZVwtZGF0ZXNcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWRlYnVnZ2luZyAiXHxdIgotLlJCICJbXHwiIFwtXC1nYXBcLWZpbGw9XGZJdmFsXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXBhZFwtdG89XGZJYWRkcmVzc1xmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1zZXRcLXN0YXJ0PVxmSXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXN0YXJ0PVxmSWluY3JcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1hZGRyZXNzZXM9XGZJaW5jclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLWFkZHJlc3M9XGZJc2VjdGlvbns9LCssLX12YWxcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1zZWN0aW9uXC1sbWE9XGZJc2VjdGlvbns9LCssLX12YWxcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1zZWN0aW9uXC12bWE9XGZJc2VjdGlvbns9LCssLX12YWxcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC13YXJuaW5nc1xmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1zZXRcLXNlY3Rpb25cLWZsYWdzPVxmSXNlY3Rpb249ZmxhZ3NcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtYWRkXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lPWZpbGVuYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtbGVhZGluZ1wtY2hhclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1yZW1vdmVcLWxlYWRpbmdcLWNoYXJcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtd2Vha2VuXGZSICJcfF0iCi0uUkIgIltcfCIgXC12XCB8XCBcLVwtdmVyYm9zZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVZcIHxcIFwtXC12ZXJzaW9uXGZSICJcfF0iIAotLlJCICJbXHwiIFwtXC1oZWxwXGZSICJcfF0iIAotLkIgaW5maWxlCi0uUkIgIltcfCIgb3V0ZmlsZVxmUiAiXHxdIiAKLS5TSCBERVNDUklQVElPTgotVGhlIEdOVSAKLS5CIG9iamNvcHkKLXV0aWxpdHkgY29waWVzIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QgZmlsZSB0byBhbm90aGVyLiAgCi0uQiBvYmpjb3B5IAotdXNlcyB0aGUgR05VIEJGRCBMaWJyYXJ5IHRvIHJlYWQgYW5kIHdyaXRlIHRoZSBvYmplY3QgZmlsZXMuICBJdCBjYW4KLXdyaXRlIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZmlsZSBpbiBhIGZvcm1hdCBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mCi10aGUgc291cmNlIG9iamVjdCBmaWxlLiAgVGhlIGV4YWN0IGJlaGF2aW9yIG9mIAotLkIgb2JqY29weQotaXMgY29udHJvbGxlZCBieSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KLS5QUAotLkIgb2JqY29weQotY3JlYXRlcyB0ZW1wb3JhcnkgZmlsZXMgdG8gZG8gaXRzIHRyYW5zbGF0aW9ucyBhbmQgZGVsZXRlcyB0aGVtCi1hZnRlcndhcmQuCi0uQiBvYmpjb3B5Ci11c2VzIEJGRCB0byBkbyBhbGwgaXRzIHRyYW5zbGF0aW9uIHdvcms7IGl0IGtub3dzIGFib3V0IGFsbCB0aGUKLWZvcm1hdHMgQkZEIGtub3dzIGFib3V0LCBhbmQgdGh1cyBpcyBhYmxlIHRvIHJlY29nbml6ZSBtb3N0IGZvcm1hdHMKLXdpdGhvdXQgYmVpbmcgdG9sZCBleHBsaWNpdGx5LgotLlBQCi0uQiBvYmpjb3B5Ci1jYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBTLXJlY29yZHMgYnkgdXNpbmcgYW4gb3V0cHV0IHRhcmdldCBvZgotLkIgc3JlYwotKGUuZy4sIHVzZQotLkIgLU8gc3JlYykuCi0uUFAKLS5CIG9iamNvcHkKLWNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcmF3IGJpbmFyeSBmaWxlIGJ5IHVzaW5nIGFuIG91dHB1dCB0YXJnZXQgb2YKLS5CIGJpbmFyeQotKGUuZy4sIHVzZQotLkIgLU8gYmluYXJ5KS4KLVdoZW4KLS5CIG9iamNvcHkKLWdlbmVyYXRlcyBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgd2lsbCBlc3NlbnRpYWxseSBwcm9kdWNlIGEgbWVtb3J5IGR1bXAKLW9mIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgb2JqZWN0IGZpbGUuICBBbGwgc3ltYm9scyBhbmQgcmVsb2NhdGlvbgotaW5mb3JtYXRpb24gd2lsbCBiZSBkaXNjYXJkZWQuICBUaGUgbWVtb3J5IGR1bXAgd2lsbCBzdGFydCBhdCB0aGUKLXZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgbG93ZXN0IHNlY3Rpb24gY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLgotLlBQCi1XaGVuIGdlbmVyYXRpbmcgYW4gUy1yZWNvcmQgb3IgYSByYXcgYmluYXJ5IGZpbGUsIGl0IG1heSBiZSBoZWxwZnVsIHRvCi11c2UKLS5CIC1TCi10byByZW1vdmUgc2VjdGlvbnMgY29udGFpbmluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbiBzb21lIGNhc2VzCi0uQiAtUgotd2lsbCBiZSB1c2VmdWwgdG8gcmVtb3ZlIHNlY3Rpb25zIHdoaWNoIGNvbnRhaW4gaW5mb3JtYXRpb24gd2hpY2ggaXMKLW5vdCBuZWVkZWQgYnkgdGhlIGJpbmFyeSBmaWxlLgotLlBQCi0uSSBpbmZpbGUKLWFuZAotLkkgb3V0ZmlsZQotYXJlIHRoZSBzb3VyY2UgYW5kIG91dHB1dCBmaWxlcyByZXNwZWN0aXZlbHkuICBJZiB5b3UgZG8gbm90IHNwZWNpZnkKLS5JUiBvdXRmaWxlICwKLS5CIG9iamNvcHkKLWNyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSBhbmQgZGVzdHJ1Y3RpdmVseSByZW5hbWVzIHRoZSByZXN1bHQgd2l0aCB0aGUKLW5hbWUgb2YgdGhlIGlucHV0IGZpbGUuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtSSBcZkliZmRuYW1lXGZSLCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Db25zaWRlciB0aGUgc291cmNlIGZpbGUncyBvYmplY3QgZm9ybWF0IHRvIGJlIAotLklSIGJmZG5hbWUgLAotcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBkZWR1Y2UgaXQuCi0uVFAKLS5CIFwtTyBcZkliZmRuYW1lXGZSLCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZQotV3JpdGUgdGhlIG91dHB1dCBmaWxlIHVzaW5nIHRoZSBvYmplY3QgZm9ybWF0IAotLklSIGJmZG5hbWUgLgotLlRQCi0uQiBcLUYgXGZJYmZkbmFtZVxmUiwgXGZCXC1cLXRhcmdldD1cZkliZmRuYW1lCi1Vc2UgCi0uSSBiZmRuYW1lCi1hcyB0aGUgb2JqZWN0IGZvcm1hdCBmb3IgYm90aCB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQgZmlsZTsgaS5lLgotc2ltcGx5IHRyYW5zZmVyIGRhdGEgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gd2l0aCBubyB0cmFuc2xhdGlvbi4KLS5UUAotLkIgXC1qIFxmSXNlY3Rpb25uYW1lXGZSLCBcZkJcLVwtb25seVwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZQotQ29weSBvbmx5IHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGlucHV0IGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlLAotZGlzY2FyZGluZyBhbGwgb3RoZXIgc2VjdGlvbnMuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuCi1vbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uIGluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUgb3V0cHV0Ci1maWxlIHVudXNhYmxlLgotLlRQCi0uQiBcLVIgXGZJc2VjdGlvbm5hbWVcZlIsIFxmQlwtXC1yZW1vdmUtc2VjdGlvbj1cZklzZWN0aW9ubmFtZQotUmVtb3ZlIHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZQotdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uIGluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUKLW91dHB1dCBmaWxlIHVudXNhYmxlLgotLlRQCi0uQiBcLVNcZlIsIFxmQlwtXC1zdHJpcFwtYWxsCi1EbyBub3QgY29weSByZWxvY2F0aW9uIGFuZCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSB0aGUgc291cmNlIGZpbGUuCi0uVFAKLS5CIFwtZ1xmUiwgXGZCXC1cLXN0cmlwXC1kZWJ1ZwotRG8gbm90IGNvcHkgZGVidWdnaW5nIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCi0uVFAKLS5CIFwtXC1zdHJpcFwtdW5uZWVkZWQKLVN0cmlwIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KLS5UUAotLkIgXC1LIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotQ29weSBvbmx5IHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotLlRQCi0uQiBcLU4gXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotRG8gbm90IGNvcHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwtTCBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtbG9jYWxpemVcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1NYWtlIHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGxvY2FsIHRvIHRoZSBmaWxlLCBzbyB0aGF0IGl0IGlzIG5vdAotdmlzaWJsZSBleHRlcm5hbGx5LiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotLlRQCi0uQiBcLVcgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXdlYWtlblwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLU1ha2Ugc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgd2Vhay4gVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotLlRQCi0uQiBcLXhcZlIsIFxmQiBcLVwtZGlzY2FyZFwtYWxsCi1EbyBub3QgY29weSBub24tZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCi0uVFAKLS5CIFwtWFxmUiwgXGZCXC1cLWRpc2NhcmRcLWxvY2FscwotRG8gbm90IGNvcHkgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuIChUaGVzZSB1c3VhbGx5IHN0YXJ0Ci13aXRoICJMIiBvciAiLiIpLgotLlRQCi0uQiBcLWIgXGZJYnl0ZVxmUiwgXGZCXC1cLWJ5dGU9XGZJYnl0ZQotS2VlcCBvbmx5IGV2ZXJ5IFxmSWJ5dGVcZlB0aCBieXRlIG9mIHRoZSBpbnB1dCBmaWxlIChoZWFkZXIgZGF0YSBpcwotbm90IGFmZmVjdGVkKS4gIFxmSWJ5dGVcZlAgY2FuIGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gdGhlCi1pbnRlcmxlYXZlLTEuICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIGZpbGVzIHRvIHByb2dyYW0KLVJPTXMuICBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFuIHNyZWMgb3V0cHV0IHRhcmdldC4KLS5UUAotLkIgXC1pIFxmSWludGVybGVhdmVcZlIsIFxmQlwtXC1pbnRlcmxlYXZlPVxmSWludGVybGVhdmUKLU9ubHkgY29weSBvbmUgb3V0IG9mIGV2ZXJ5IFxmSWludGVybGVhdmVcZlAgYnl0ZXMuICBXaGljaCBvbmUgdG8gY29weSBpcwotc2VsZWN0ZWQgYnkgdGhlIFxmQlwtYlxmUCBvciBcZkJcLVwtYnl0ZVxmUCBvcHRpb24uICBUaGUgZGVmYXVsdCBpcyA0LgotVGhlIGludGVybGVhdmUgaXMgaWdub3JlZCBpZiBuZWl0aGVyIFxmQlwtYlxmUCBub3IgXGZCXC1cLWJ5dGVcZlAgaXMgZ2l2ZW4uCi0uVFAKLS5CIFwtcFxmUiwgXGZCXC1cLXByZXNlcnZlXC1kYXRlcwotU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgdGhlIHNhbWUKLWFzIHRob3NlIG9mIHRoZSBpbnB1dCBmaWxlLgotLlRQCi0uQiBcLVwtZGVidWdnaW5nCi1Db252ZXJ0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgcG9zc2libGUuICBUaGlzIGlzIG5vdCB0aGUgZGVmYXVsdAotYmVjYXVzZSBvbmx5IGNlcnRhaW4gZGVidWdnaW5nIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgYW5kIHRoZQotY29udmVyc2lvbiBwcm9jZXNzIGNhbiBiZSB0aW1lIGNvbnN1bWluZy4KLS5UUAotLkIgXC1cLWdhcFwtZmlsbD1cZkl2YWwKLUZpbGwgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIHdpdGggXGZJdmFsXGZQLiAgVGhpcyBvcGVyYXRpb24gYXBwbGllcyB0bwotdGhlIFxmSWxvYWQgYWRkcmVzc1xmUCAoTE1BKSBvZiB0aGUgc2VjdGlvbnMuICBJdCBpcyBkb25lIGJ5IGluY3JlYXNpbmcKLXRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIHdpdGggdGhlIGxvd2VyIGFkZHJlc3MsIGFuZCBmaWxsaW5nIGluIHRoZSBleHRyYQotc3BhY2UgY3JlYXRlZCB3aXRoIFxmSXZhbFxmUC4KLS5UUAotLkIgXC1cLXBhZFwtdG89XGZJYWRkcmVzcwotUGFkIHRoZSBvdXRwdXQgZmlsZSB1cCB0byB0aGUgbG9hZCBhZGRyZXNzIFxmSWFkZHJlc3NcZlAuICBUaGlzIGlzCi1kb25lIGJ5IGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbi4gIFRoZSBleHRyYSBzcGFjZSBpcwotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZCBieSBcZkJcLVwtZ2FwXC1maWxsXGZQIChkZWZhdWx0Ci16ZXJvKS4KLS5UUAotLkIgXGZCXC1cLXNldFwtc3RhcnQ9XGZJdmFsCi1TZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5ldyBmaWxlIHRvIFxmSXZhbFxmUC4gIE5vdCBhbGwgb2JqZWN0Ci1maWxlIGZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1zdGFydD1cZklpbmNyXGZSLCBcZkJcLVwtYWRqdXN0XC1zdGFydD1cZklpbmNyCi1DaGFuZ2VzIHRoZSBzdGFydCBhZGRyZXNzIGJ5IGFkZGluZyBcZklpbmNyXGZQLiAgTm90IGFsbCBvYmplY3QgZmlsZQotZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlcz1cZklpbmNyXGZSLCBcZkJcLVwtYWRqdXN0XC12bWE9XGZJaW5jcgotQ2hhbmdlcyB0aGUgYWRkcmVzcyBvZiBhbGwgc2VjdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN0YXJ0IGFkZHJlc3MsIGJ5Ci1hZGRpbmcgXGZJaW5jclxmUC4gIFNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBkbyBub3QgcGVybWl0IHNlY3Rpb24KLWFkZHJlc3NlcyB0byBiZSBjaGFuZ2VkIGFyYml0cmFyaWx5LiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgcmVsb2NhdGUKLXRoZSBzZWN0aW9uczsgaWYgdGhlIHByb2dyYW0gZXhwZWN0cyBzZWN0aW9ucyB0byBiZSBsb2FkZWQgYXQgYQotY2VydGFpbiBhZGRyZXNzLCBhbmQgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHNlY3Rpb25zIHN1Y2gKLXRoYXQgdGhleSBhcmUgbG9hZGVkIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MsIHRoZSBwcm9ncmFtIG1heSBmYWlsLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC1hZGRyZXNzPVxmSXNlY3Rpb257PSwrLC19dmFsXGZSLCBcZkJcLVwtYWRqdXN0XC1zZWN0aW9uXC12bWE9XGZJc2VjdGlvbns9LCssLX12YWwKLVNldCBvciBjaGFuZ2VzIHRoZSBWTUEgYW5kIExNQSBhZGRyZXNzZXMgb2YgdGhlIG5hbWVkIFxmSXNlY3Rpb25cZlAuCi1JZiBcZkk9XGZQIGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4KLU90aGVyd2lzZSwgXGZJdmFsXGZQIGlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUgc2VjdGlvbgotYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMgdW5kZXIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzXGZQLCBhYm92ZS4gIElmCi1cZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZQotaXNzdWVkLCB1bmxlc3MgXGZCXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZQIGlzIHVzZWQuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLWxtYT1cZklzZWN0aW9uez0sKywtfXZhbAotU2V0IG9yIGNoYW5nZSB0aGUgTE1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIFxmSXNlY3Rpb25cZlAuICBJZiBcZkk9XGZQIGlzCi11c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0byBcZkl2YWxcZlAuICBPdGhlcndpc2UsIFxmSXZhbFxmUAotaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBzZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzCi11bmRlciBcZkJcLVwtY2hhbmdlXC1hZGRyZXNzZXNcZlAsIGFib3ZlLiAgSWYgXGZJc2VjdGlvblxmUCBkb2VzIG5vdCBleGlzdAotaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCwgdW5sZXNzCi1cZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlAgaXMgdXNlZC4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtdm1hPVxmSXNlY3Rpb257PSwrLC19dmFsCi1TZXQgb3IgY2hhbmdlIHRoZSBWTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4gIElmIFxmST1cZlAgaXMKLXVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4gIE90aGVyd2lzZSwgXGZJdmFsXGZQCi1pcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMKLXVuZGVyIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlc1xmUCwgYWJvdmUuICBJZiBcZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0Ci1pbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKLVxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUCBpcyB1c2VkLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC13YXJuaW5nc1xmUiwgXGZCXC1cLWFkanVzdFwtd2FybmluZ3MKLUlmIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLVhYWFxmUCBpcyB1c2VkLCBhbmQgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcwotbm90IGV4aXN0LCBpc3N1ZSBhIHdhcm5pbmcuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgotLlRQCi0uQiBcZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlIsIFxmQlwtXC1ub1wtYWRqdXN0XC13YXJuaW5ncwotRG8gbm90IGlzc3VlIGEgd2FybmluZyBpZiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC1YWFhcZlAgaXMgdXNlZCwgZXZlbgotaWYgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcyBub3QgZXhpc3QuCi0uVFAKLS5CIFxmQlwtXC1zZXRcLXNlY3Rpb25cLWZsYWdzPVxmSXNlY3Rpb249ZmxhZ3MKLVNldCB0aGUgZmxhZ3MgZm9yIHRoZSBuYW1lZCBzZWN0aW9uLiAgVGhlIFxmSWZsYWdzXGZQIGFyZ3VtZW50IGlzIGEKLWNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgZmxhZyBuYW1lcy4gIFRoZSByZWNvZ25pemVkIG5hbWVzIGFyZQotXGZJYWxsb2NcZlAsIFxmSWNvbnRlbnRzXGZQLCBcZklsb2FkXGZQLCBcZklub2xvYWRcZlAsIFxmSXJlYWRvbmx5XGZQLAotXGZJY29kZVxmUCwgXGZJZGF0YVxmUCwgXGZJcm9tXGZQLCBcZklzaGFyZVxmUCwgYW5kIFxmSWRlYnVnXGZQLiAgTm90Ci1hbGwgZmxhZ3MgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzLgotLlRQCi0uQiBcZkJcLVwtYWRkXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lPWZpbGVuYW1lCi1BZGQgYSBuZXcgc2VjdGlvbiBuYW1lZCBcZklzZWN0aW9ubmFtZVxmUiB3aGlsZSBjb3B5aW5nIHRoZSBmaWxlLiAgVGhlCi1jb250ZW50cyBvZiB0aGUgbmV3IHNlY3Rpb24gYXJlIHRha2VuIGZyb20gdGhlIGZpbGUgXGZJZmlsZW5hbWVcZlIuCi1UaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgVGhpcyBvcHRpb24KLW9ubHkgd29ya3Mgb24gZmlsZSBmb3JtYXRzIHdoaWNoIGNhbiBzdXBwb3J0IHNlY3Rpb25zIHdpdGggYXJiaXRyYXJ5Ci1uYW1lcy4KLS5UUAotLkIgXC1cLWNoYW5nZVwtbGVhZGluZ1wtY2hhcgotU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mCi1zeW1ib2xzLiAgVGhlIG1vc3QgY29tbW9uIHN1Y2ggY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUsIHdoaWNoIGNvbXBpbGVycwotb2Z0ZW4gYWRkIGJlZm9yZSBldmVyeSBzeW1ib2wuICBUaGlzIG9wdGlvbiB0ZWxscyAKLS5CIG9iamNvcHkKLXRvIGNoYW5nZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgb2YgZXZlcnkgc3ltYm9sIHdoZW4gaXQgY29udmVydHMKLWJldHdlZW4gb2JqZWN0IGZpbGUgZm9ybWF0cy4gIElmIHRoZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSB0aGUgc2FtZQotbGVhZGluZyBjaGFyYWN0ZXIsIHRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QuICBPdGhlcndpc2UsIGl0IHdpbGwgYWRkCi1hIGNoYXJhY3Rlciwgb3IgcmVtb3ZlIGEgY2hhcmFjdGVyLCBvciBjaGFuZ2UgYSBjaGFyYWN0ZXIsIGFzCi1hcHByb3ByaWF0ZS4KLS5UUAotLkIgXC1cLXJlbW92ZVwtbGVhZGluZ1wtY2hhcgotSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGdsb2JhbCBzeW1ib2wgaXMgYSBzcGVjaWFsIHN5bWJvbCBsZWFkaW5nCi1jaGFyYWN0ZXIgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCByZW1vdmUgdGhlIGNoYXJhY3Rlci4gIFRoZQotbW9zdCBjb21tb24gc3ltYm9sIGxlYWRpbmcgY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUuICBUaGlzIG9wdGlvbiB3aWxsCi1yZW1vdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSBhbGwgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGNhbiBiZQotdXNlZnVsIGlmIHlvdSB3YW50IHRvIGxpbmsgdG9nZXRoZXIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzCi13aXRoIGRpZmZlcmVudCBjb252ZW50aW9ucyBmb3Igc3ltYm9sIG5hbWVzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotXGZCXC1cLWNoYW5nZVwtbGVhZGluZ1wtY2hhclxmUCBiZWNhdXNlIGl0IGFsd2F5cyBjaGFuZ2VzIHRoZSBzeW1ib2wgbmFtZQotd2hlbiBhcHByb3ByaWF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQKLS5UUAotLkIgXC1cLXdlYWtlbgotQ2hhbmdlIGFsbCBnbG9iYWwgc3ltYm9scyBpbiB0aGUgZmlsZSB0byBiZSB3ZWFrLgotLlRQCi0uQiBcLXZcZlIsIFxmQlwtXC12ZXJib3NlCi1WZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKLWFyY2hpdmVzLCAiXGZCb2JqY29weSBcLVZcZlIiIGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotLlRQCi0uQiBcLVZcZlIsIFxmQlwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgb2JqY29weQotYW5kIGV4aXQuCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgb2JqY29weQotYW5kIGV4aXQuCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKEp1bmUgMTk5MykuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvb2JqY29weS5jIGIvYmludXRpbHMvb2JqY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2IxMmU3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL29iamNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMTAgKzAsMCBAQAotLyogb2JqY29weS5jIC0tIGNvcHkgb2JqZWN0IGZpbGUgZnJvbSBpbnB1dCB0byBvdXRwdXQsIG9wdGlvbmFsbHkgbWFzc2FnaW5nIGl0LgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLS8qIEEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cGxpY2l0bHkgc3RyaXAgb3V0LCBvciB0byBrZWVwLiAgQSBsaW5rZWQKLSAgIGxpc3QgaXMgZ29vZCBlbm91Z2ggZm9yIGEgc21hbGwgbnVtYmVyIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgYnV0Ci0gICB0aGlzIHdpbGwgc2xvdyB0aGluZ3MgZG93biBhIGxvdCBpZiBtYW55IHN5bWJvbHMgYXJlIGJlaW5nCi0gICBkZWxldGVkLiAqLwotCi1zdHJ1Y3Qgc3ltbGlzdAotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3Qgc3ltbGlzdCAqbmV4dDsKLX07Ci0KLXN0YXRpYyB2b2lkIGNvcHlfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHN0cmlwX3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgZmxhZ3dvcmQgcGFyc2VfZmxhZ3MgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbGlzdCAqZmluZF9zZWN0aW9uX2xpc3QgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvcHlfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBnZXRfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGludCBjb21wYXJlX3NlY3Rpb25fbG1hIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhZGRfc3BlY2lmaWNfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN5bWxpc3QgKiopKTsKLXN0YXRpYyBib29sZWFuIGlzX3NwZWNpZmllZF9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3ltbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpc19zdHJpcF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGZpbHRlcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXN5bWJvbCAqKiwgYXN5bWJvbCAqKiwgbG9uZykpOwotc3RhdGljIHZvaWQgbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgZmlsdGVyX2J5dGVzIFBBUkFNUyAoKGNoYXIgKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB3cml0ZV9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgUFRSLCBsb25nICosIGFzeW1ib2wgKioqKSk7Ci1zdGF0aWMgdm9pZCBjb3B5X29iamVjdCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIGNvcHlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKiwgYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgY29weV9maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBzdHJpcF9tYWluIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIGludCBjb3B5X21haW4gUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSNkZWZpbmUgUkVUVVJOX05PTkZBVEFMKHMpIHtiZmRfbm9uZmF0YWwgKHMpOyBzdGF0dXMgPSAxOyByZXR1cm47fQotCi1zdGF0aWMgYXN5bWJvbCAqKmlzeW1wcCA9IE5VTEw7CS8qIElucHV0IHN5bWJvbHMgKi8KLXN0YXRpYyBhc3ltYm9sICoqb3N5bXBwID0gTlVMTDsJLyogT3V0cHV0IHN5bWJvbHMgdGhhdCBzdXJ2aXZlIHN0cmlwcGluZyAqLwotCi0vKiBJZiBgY29weV9ieXRlJyA+PSAwLCBjb3B5IG9ubHkgdGhhdCBieXRlIG9mIGV2ZXJ5IGBpbnRlcmxlYXZlJyBieXRlcy4gICovCi1zdGF0aWMgaW50IGNvcHlfYnl0ZSA9IC0xOwotc3RhdGljIGludCBpbnRlcmxlYXZlID0gNDsKLQotc3RhdGljIGJvb2xlYW4gdmVyYm9zZTsJCS8qIFByaW50IGZpbGUgYW5kIHRhcmdldCBuYW1lcy4gKi8KLXN0YXRpYyBib29sZWFuIHByZXNlcnZlX2RhdGVzOwkvKiBQcmVzZXJ2ZSBpbnB1dCBmaWxlIHRpbWVzdGFtcC4gICovCi1zdGF0aWMgaW50IHN0YXR1cyA9IDA7CQkvKiBFeGl0IHN0YXR1cy4gICovCi0KLWVudW0gc3RyaXBfYWN0aW9uCi0gIHsKLSAgICBTVFJJUF9VTkRFRiwKLSAgICBTVFJJUF9OT05FLAkJCS8qIGRvbid0IHN0cmlwICovCi0gICAgU1RSSVBfREVCVUcsCQkvKiBzdHJpcCBhbGwgZGVidWdnZXIgc3ltYm9scyAqLwotICAgIFNUUklQX1VOTkVFREVELAkJLyogc3RyaXAgdW5uZWNlc3Nhcnkgc3ltYm9scyAqLwotICAgIFNUUklQX0FMTAkJCS8qIHN0cmlwIGFsbCBzeW1ib2xzICovCi0gIH07Ci0KLS8qIFdoaWNoIHN5bWJvbHMgdG8gcmVtb3ZlLiAqLwotc3RhdGljIGVudW0gc3RyaXBfYWN0aW9uIHN0cmlwX3N5bWJvbHM7Ci0KLWVudW0gbG9jYWxzX2FjdGlvbgotICB7Ci0gICAgTE9DQUxTX1VOREVGLAotICAgIExPQ0FMU19TVEFSVF9MLAkJLyogZGlzY2FyZCBsb2NhbHMgc3RhcnRpbmcgd2l0aCBMICovCi0gICAgTE9DQUxTX0FMTAkJCS8qIGRpc2NhcmQgYWxsIGxvY2FscyAqLwotICB9OwotCi0vKiBXaGljaCBsb2NhbCBzeW1ib2xzIHRvIHJlbW92ZS4gIE92ZXJyaWRlcyBTVFJJUF9BTEwuICAqLwotc3RhdGljIGVudW0gbG9jYWxzX2FjdGlvbiBkaXNjYXJkX2xvY2FsczsKLQotLyogV2hhdCBraW5kIG9mIGNoYW5nZSB0byBwZXJmb3JtLiAgKi8KLWVudW0gY2hhbmdlX2FjdGlvbgotewotICBDSEFOR0VfSUdOT1JFLAotICBDSEFOR0VfTU9ESUZZLAotICBDSEFOR0VfU0VUCi19OwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGxpc3RzIG9mIHNlY3Rpb25zIGFuZCBhY3Rpb25zIHRvIHRha2UuICAqLwotc3RydWN0IHNlY3Rpb25fbGlzdAotewotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICogbmV4dDsgICAgICAvKiBOZXh0IHNlY3Rpb24gdG8gY2hhbmdlLiAgKi8KLSAgY29uc3QgY2hhciAqICAgICAgICAgIG5hbWU7ICAgICAgLyogU2VjdGlvbiBuYW1lLiAgKi8KLSAgYm9vbGVhbiAgICAgICAgICAgICAgIHVzZWQ7ICAgICAgLyogV2hldGhlciB0aGlzIGVudHJ5IHdhcyB1c2VkLiAgKi8KLSAgYm9vbGVhbiAgICAgICAgICAgICAgIHJlbW92ZTsgICAgLyogV2hldGhlciB0byByZW1vdmUgdGhpcyBzZWN0aW9uLiAgKi8KLSAgYm9vbGVhbgkJY29weTsgICAgICAvKiBXaGV0aGVyIHRvIGNvcHkgdGhpcyBzZWN0aW9uLiAgKi8KLSAgZW51bSBjaGFuZ2VfYWN0aW9uICAgIGNoYW5nZV92bWE7LyogV2hldGhlciB0byBjaGFuZ2Ugb3Igc2V0IFZNQS4gICovCi0gIGJmZF92bWEgCQl2bWFfdmFsOyAgIC8qIEFtb3VudCB0byBjaGFuZ2UgYnkgb3Igc2V0IHRvLiAgKi8KLSAgZW51bSBjaGFuZ2VfYWN0aW9uICAgIGNoYW5nZV9sbWE7LyogV2hldGhlciB0byBjaGFuZ2Ugb3Igc2V0IExNQS4gICovCi0gIGJmZF92bWEgCQlsbWFfdmFsOyAgIC8qIEFtb3VudCB0byBjaGFuZ2UgYnkgb3Igc2V0IHRvLiAgKi8KLSAgYm9vbGVhbiAJCXNldF9mbGFnczsgLyogV2hldGhlciB0byBzZXQgdGhlIHNlY3Rpb24gZmxhZ3MuICAqLwotICBmbGFnd29yZCAJCWZsYWdzOyAgICAgLyogV2hhdCB0byBzZXQgdGhlIHNlY3Rpb24gZmxhZ3MgdG8uICAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QgKmNoYW5nZV9zZWN0aW9uczsKLXN0YXRpYyBib29sZWFuIHNlY3Rpb25zX3JlbW92ZWQ7Ci1zdGF0aWMgYm9vbGVhbiBzZWN0aW9uc19jb3BpZWQ7Ci0KLS8qIENoYW5nZXMgdG8gdGhlIHN0YXJ0IGFkZHJlc3MuICAqLwotc3RhdGljIGJmZF92bWEgY2hhbmdlX3N0YXJ0ID0gMDsKLXN0YXRpYyBib29sZWFuIHNldF9zdGFydF9zZXQgPSBmYWxzZTsKLXN0YXRpYyBiZmRfdm1hIHNldF9zdGFydDsKLQotLyogQ2hhbmdlcyB0byBzZWN0aW9uIGFkZHJlc3Nlcy4gICovCi1zdGF0aWMgYmZkX3ZtYSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzID0gMDsKLQotLyogRmlsbGluZyBnYXBzIGJldHdlZW4gc2VjdGlvbnMuICAqLwotc3RhdGljIGJvb2xlYW4gZ2FwX2ZpbGxfc2V0ID0gZmFsc2U7Ci1zdGF0aWMgYmZkX2J5dGUgZ2FwX2ZpbGwgPSAwOwotCi0vKiBQYWQgdG8gYSBnaXZlbiBhZGRyZXNzLiAgKi8KLXN0YXRpYyBib29sZWFuIHBhZF90b19zZXQgPSBmYWxzZTsKLXN0YXRpYyBiZmRfdm1hIHBhZF90bzsKLQotLyogTGlzdCBvZiBzZWN0aW9ucyB0byBhZGQuICAqLwotCi1zdHJ1Y3Qgc2VjdGlvbl9hZGQKLXsKLSAgLyogTmV4dCBzZWN0aW9uIHRvIGFkZC4gICovCi0gIHN0cnVjdCBzZWN0aW9uX2FkZCAqbmV4dDsKLSAgLyogTmFtZSBvZiBzZWN0aW9uIHRvIGFkZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIE5hbWUgb2YgZmlsZSBob2xkaW5nIHNlY3Rpb24gY29udGVudHMuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogU2l6ZSBvZiBmaWxlLiAgKi8KLSAgc2l6ZV90IHNpemU7Ci0gIC8qIENvbnRlbnRzIG9mIGZpbGUuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJGRCBzZWN0aW9uLCBhZnRlciBpdCBoYXMgYmVlbiBhZGRlZC4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2FkZCAqYWRkX3NlY3Rpb25zOwotCi0vKiBXaGV0aGVyIHRvIGNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29udmVydF9kZWJ1Z2dpbmcgPSBmYWxzZTsKLQotLyogV2hldGhlciB0byBjaGFuZ2UgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGluIHN5bWJvbCBuYW1lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIGNoYW5nZV9sZWFkaW5nX2NoYXIgPSBmYWxzZTsKLQotLyogV2hldGhlciB0byByZW1vdmUgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGZyb20gZ2xvYmFsIHN5bWJvbCBuYW1lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIHJlbW92ZV9sZWFkaW5nX2NoYXIgPSBmYWxzZTsKLQotLyogTGlzdCBvZiBzeW1ib2xzIHRvIHN0cmlwLCBrZWVwLCBsb2NhbGl6ZSwgYW5kIHdlYWtlbi4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqc3RyaXBfc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKmtlZXBfc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKmxvY2FsaXplX3NwZWNpZmljX2xpc3QgPSBOVUxMOwotc3RhdGljIHN0cnVjdCBzeW1saXN0ICp3ZWFrZW5fc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci0KLS8qIElmIHRoaXMgaXMgdHJ1ZSwgd2Ugd2Vha2VuIGdsb2JhbCBzeW1ib2xzIChzZXQgQlNGX1dFQUspLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gd2Vha2VuID0gZmFsc2U7Ci0KLS8qIDE1MCBpc24ndCBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KLQotI2RlZmluZSBPUFRJT05fQUREX1NFQ1RJT04gMTUwCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTIChPUFRJT05fQUREX1NFQ1RJT04gKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUiAoT1BUSU9OX0NIQU5HRV9BRERSRVNTRVMgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NUQVJUIChPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUiArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTIChPUFRJT05fQ0hBTkdFX1NUQVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQSAoT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1MgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BIChPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9XQVJOSU5HUyAoT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQSArIDEpCi0jZGVmaW5lIE9QVElPTl9ERUJVR0dJTkcgKE9QVElPTl9DSEFOR0VfV0FSTklOR1MgKyAxKQotI2RlZmluZSBPUFRJT05fR0FQX0ZJTEwgKE9QVElPTl9ERUJVR0dJTkcgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTIChPUFRJT05fR0FQX0ZJTEwgKyAxKQotI2RlZmluZSBPUFRJT05fUEFEX1RPIChPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVIgKE9QVElPTl9QQURfVE8gKyAxKQotI2RlZmluZSBPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1MgKE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NFVF9TVEFSVCAoT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUUklQX1VOTkVFREVEIChPUFRJT05fU0VUX1NUQVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dFQUtFTiAoT1BUSU9OX1NUUklQX1VOTkVFREVEICsgMSkKLQotLyogT3B0aW9ucyB0byBoYW5kbGUgaWYgcnVubmluZyBhcyAic3RyaXAiLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvcHRpb24gc3RyaXBfb3B0aW9uc1tdID0KLXsKLSAgeyJkaXNjYXJkLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAneCd9LAotICB7ImRpc2NhcmQtbG9jYWxzIiwgbm9fYXJndW1lbnQsIDAsICdYJ30sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sIC8qIE9ic29sZXRlICovCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImlucHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LCAvKiBPYnNvbGV0ZSAqLwotICB7ImlucHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7ImtlZXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdLJ30sCi0gIHsib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAkvKiBPYnNvbGV0ZSAqLwotICB7Im91dHB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJwcmVzZXJ2ZS1kYXRlcyIsIG5vX2FyZ3VtZW50LCAwLCAncCd9LAotICB7InJlbW92ZS1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdSJ30sCi0gIHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0gIHsic3RyaXAtZGVidWciLCBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzdHJpcC11bm5lZWRlZCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fU1RSSVBfVU5ORUVERUR9LAotICB7InN0cmlwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTid9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJ30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLS8qIE9wdGlvbnMgdG8gaGFuZGxlIGlmIHJ1bm5pbmcgYXMgIm9iamNvcHkiLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvcHRpb24gY29weV9vcHRpb25zW10gPQotewotICB7ImFkZC1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9BRERfU0VDVElPTn0sCi0gIHsiYWRqdXN0LXN0YXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU1RBUlR9LAotICB7ImFkanVzdC12bWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9BRERSRVNTRVN9LAotICB7ImFkanVzdC1zZWN0aW9uLXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTU30sCi0gIHsiYWRqdXN0LXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfV0FSTklOR1N9LAotICB7ImJ5dGUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InfSwKLSAgeyJjaGFuZ2UtYWRkcmVzc2VzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTfSwKLSAgeyJjaGFuZ2UtbGVhZGluZy1jaGFyIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSfSwKLSAgeyJjaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTfSwKLSAgeyJjaGFuZ2Utc2VjdGlvbi1sbWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQX0sCi0gIHsiY2hhbmdlLXNlY3Rpb24tdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUF9LAotICB7ImNoYW5nZS1zdGFydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NUQVJUfSwKLSAgeyJjaGFuZ2Utd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsiZGVidWdnaW5nIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ERUJVR0dJTkd9LAotICB7ImRpc2NhcmQtYWxsIiwgbm9fYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgMCwgJ1gnfSwKLSAgeyJvbmx5LXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2onfSwKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJnYXAtZmlsbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fR0FQX0ZJTEx9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJpbnB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJpbnRlcmxlYXZlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdpJ30sCi0gIHsia2VlcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0snfSwKLSAgeyJuby1hZGp1c3Qtd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsibm8tY2hhbmdlLXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1N9LAotICB7Im91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwJLyogT2Jzb2xldGUgKi8KLSAgeyJvdXRwdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsicGFkLXRvIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9QQURfVE99LAotICB7InByZXNlcnZlLWRhdGVzIiwgbm9fYXJndW1lbnQsIDAsICdwJ30sCi0gIHsibG9jYWxpemUtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdMJ30sCi0gIHsicmVtb3ZlLWxlYWRpbmctY2hhciIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUn0sCi0gIHsicmVtb3ZlLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1InfSwKLSAgeyJzZXQtc2VjdGlvbi1mbGFncyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1N9LAotICB7InNldC1zdGFydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fU0VUX1NUQVJUfSwKLSAgeyJzdHJpcC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnZyd9LAotICB7InN0cmlwLXVubmVlZGVkIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9TVFJJUF9VTk5FRURFRH0sCi0gIHsic3RyaXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdOJ30sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgeyJ3ZWFrZW4iLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1dFQUtFTn0sCi0gIHsid2Vha2VuLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnVyd9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBJTVBPUlRTICovCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBUaGlzIGZsYWcgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHN0cmlwIGFuZCBvYmpjb3B5OgotICAgMSBtZWFucyB0aGlzIGlzICdzdHJpcCc7IDAgbWVhbnMgdGhpcyBpcyAnb2JqY29weScuCi0gICAtMSBtZWFucyBpZiB3ZSBzaG91bGQgdXNlIGFyZ3ZbMF0gdG8gZGVjaWRlLiAqLwotZXh0ZXJuIGludCBpc19zdHJpcDsKLQotCi1zdGF0aWMgdm9pZAotY29weV91c2FnZSAoc3RyZWFtLCBleGl0X3N0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgZXhpdF9zdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiVXNhZ2U6ICVzIDxzd2l0Y2hlcz4gaW4tZmlsZSBbb3V0LWZpbGVdXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgVGhlIHN3aXRjaGVzIGFyZTpcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1JIC0taW5wdXQtdGFyZ2V0IDxiZmRuYW1lPiAgICAgIEFzc3VtZSBpbnB1dCBmaWxlIGlzIGluIGZvcm1hdCA8YmZkbmFtZT5cblwKLSAgLU8gLS1vdXRwdXQtdGFyZ2V0IDxiZmRuYW1lPiAgICAgQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGluIGZvcm1hdCA8YmZkbmFtZT5cblwKLSAgLUYgLS10YXJnZXQgPGJmZG5hbWU+ICAgICAgICAgICAgU2V0IGJvdGggaW5wdXQgYW5kIG91dHB1dCBmb3JtYXQgdG8gPGJmZG5hbWU+XG5cCi0gICAgIC0tZGVidWdnaW5nICAgICAgICAgICAgICAgICAgIENvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpZiBwb3NzaWJsZVxuXAotICAtcCAtLXByZXNlcnZlLWRhdGVzICAgICAgICAgICAgICBDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSBvdXRwdXRcblwKLSAgLWogLS1vbmx5LXNlY3Rpb24gPG5hbWU+ICAgICAgICAgT25seSBjb3B5IHNlY3Rpb24gPG5hbWU+IGludG8gdGhlIG91dHB1dFxuXAotICAtUiAtLXJlbW92ZS1zZWN0aW9uIDxuYW1lPiAgICAgICBSZW1vdmUgc2VjdGlvbiA8bmFtZT4gZnJvbSB0aGUgb3V0cHV0XG5cCi0gIC1TIC0tc3RyaXAtYWxsICAgICAgICAgICAgICAgICAgIFJlbW92ZSBhbGwgc3ltYm9sIGFuZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uXG5cCi0gIC1nIC0tc3RyaXAtZGVidWcgICAgICAgICAgICAgICAgIFJlbW92ZSBhbGwgZGVidWdnaW5nIHN5bWJvbHNcblwKLSAgICAgLS1zdHJpcC11bm5lZWRlZCAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBzeW1ib2xzIG5vdCBuZWVkZWQgYnkgcmVsb2NhdGlvbnNcblwKLSAgLU4gLS1zdHJpcC1zeW1ib2wgPG5hbWU+ICAgICAgICAgRG8gbm90IGNvcHkgc3ltYm9sIDxuYW1lPlxuXAotICAtSyAtLWtlZXAtc3ltYm9sIDxuYW1lPiAgICAgICAgICBPbmx5IGNvcHkgc3ltYm9sIDxuYW1lPlxuXAotICAtTCAtLWxvY2FsaXplLXN5bWJvbCA8bmFtZT4gICAgICBGb3JjZSBzeW1ib2wgPG5hbWU+IHRvIGJlIG1hcmtlZCBhcyBhIGxvY2FsXG5cCi0gIC1XIC0td2Vha2VuLXN5bWJvbCA8bmFtZT4gICAgICAgIEZvcmNlIHN5bWJvbCA8bmFtZT4gdG8gYmUgbWFya2VkIGFzIGEgd2Vha1xuXAotICAgICAtLXdlYWtlbiAgICAgICAgICAgICAgICAgICAgICBGb3JjZSBhbGwgZ2xvYmFsIHN5bWJvbHMgdG8gYmUgbWFya2VkIGFzIHdlYWtcblwKLSAgLXggLS1kaXNjYXJkLWFsbCAgICAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBub24tZ2xvYmFsIHN5bWJvbHNcblwKLSAgLVggLS1kaXNjYXJkLWxvY2FscyAgICAgICAgICAgICAgUmVtb3ZlIGFueSBjb21waWxlci1nZW5lcmF0ZWQgc3ltYm9sc1xuXAotICAtaSAtLWludGVybGVhdmUgPG51bWJlcj4gICAgICAgICBPbmx5IGNvcHkgb25lIG91dCBvZiBldmVyeSA8bnVtYmVyPiBieXRlc1xuXAotICAtYiAtLWJ5dGUgPG51bT4gICAgICAgICAgICAgICAgICBTZWxlY3QgYnl0ZSA8bnVtPiBpbiBldmVyeSBpbnRlcmxlYXZlZCBibG9ja1xuXAotICAgICAtLWdhcC1maWxsIDx2YWw+ICAgICAgICAgICAgICBGaWxsIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyB3aXRoIDx2YWw+XG5cCi0gICAgIC0tcGFkLXRvIDxhZGRyPiAgICAgICAgICAgICAgIFBhZCB0aGUgbGFzdCBzZWN0aW9uIHVwIHRvIGFkZHJlc3MgPGFkZHI+XG5cCi0gICAgIC0tc2V0LXN0YXJ0IDxhZGRyPiAgICAgICAgICAgIFNldCB0aGUgc3RhcnQgYWRkcmVzcyB0byA8YWRkcj5cblwKLSAgICB7LS1jaGFuZ2Utc3RhcnR8LS1hZGp1c3Qtc3RhcnR9IDxpbmNyPlxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgPGluY3I+IHRvIHRoZSBzdGFydCBhZGRyZXNzXG5cCi0gICAgey0tY2hhbmdlLWFkZHJlc3Nlc3wtLWFkanVzdC12bWF9IDxpbmNyPlxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgPGluY3I+IHRvIExNQSwgVk1BIGFuZCBzdGFydCBhZGRyZXNzZXNcblwKLSAgICB7LS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzfC0tYWRqdXN0LXNlY3Rpb24tdm1hfSA8bmFtZT57PXwrfC19PHZhbD5cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIExNQSBhbmQgVk1BIG9mIHNlY3Rpb24gPG5hbWU+IGJ5IDx2YWw+XG5cCi0gICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIDxuYW1lPns9fCt8LX08dmFsPlxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgdGhlIExNQSBvZiBzZWN0aW9uIDxuYW1lPiBieSA8dmFsPlxuXAotICAgICAtLWNoYW5nZS1zZWN0aW9uLXZtYSA8bmFtZT57PXwrfC19PHZhbD5cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIHRoZSBWTUEgb2Ygc2VjdGlvbiA8bmFtZT4gYnkgPHZhbD5cblwKLSAgICB7LS1bbm8tXWNoYW5nZS13YXJuaW5nc3wtLVtuby1dYWRqdXN0LXdhcm5pbmdzfVxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuIGlmIGEgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdCBleGlzdFxuXAotICAgICAtLXNldC1zZWN0aW9uLWZsYWdzIDxuYW1lPj08ZmxhZ3M+XG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBzZWN0aW9uIDxuYW1lPidzIHByb3BlcnRpZXMgdG8gPGZsYWdzPlxuXAotICAgICAtLWFkZC1zZWN0aW9uIDxuYW1lPj08ZmlsZT4gICBBZGQgc2VjdGlvbiA8bmFtZT4gZm91bmQgaW4gPGZpbGU+IHRvIG91dHB1dFxuXAotICAgICAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgICAgICAgICBGb3JjZSBvdXRwdXQgZm9ybWF0J3MgbGVhZGluZyBjaGFyYWN0ZXIgc3R5bGVcblwKLSAgICAgLS1yZW1vdmUtbGVhZGluZy1jaGFyICAgICAgICAgUmVtb3ZlIGxlYWRpbmcgY2hhcmFjdGVyIGZyb20gZ2xvYmFsIHN5bWJvbHNcblwKLSAgLXYgLS12ZXJib3NlICAgICAgICAgICAgICAgICAgICAgTGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkXG5cCi0gIC1WIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXJcblwKLSAgLWggLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIG91dHB1dFxuXAotIikpOwotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChleGl0X3N0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKGV4aXRfc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmlwX3VzYWdlIChzdHJlYW0sIGV4aXRfc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBleGl0X3N0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgPHN3aXRjaGVzPiBpbi1maWxlKHMpXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgVGhlIHN3aXRjaGVzIGFyZTpcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1JIC0taW5wdXQtdGFyZ2V0IDxiZmRuYW1lPiAgICAgIEFzc3VtZSBpbnB1dCBmaWxlIGlzIGluIGZvcm1hdCA8YmZkbmFtZT5cblwKLSAgLU8gLS1vdXRwdXQtdGFyZ2V0IDxiZmRuYW1lPiAgICAgQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGluIGZvcm1hdCA8YmZkbmFtZT5cblwKLSAgLUYgLS10YXJnZXQgPGJmZG5hbWU+ICAgICAgICAgICAgU2V0IGJvdGggaW5wdXQgYW5kIG91dHB1dCBmb3JtYXQgdG8gPGJmZG5hbWU+XG5cCi0gIC1wIC0tcHJlc2VydmUtZGF0ZXMgICAgICAgICAgICAgIENvcHkgbW9kaWZpZWQvYWNjZXNzIHRpbWVzdGFtcHMgdG8gdGhlIG91dHB1dFxuXAotICAtUiAtLXJlbW92ZS1zZWN0aW9uIDxuYW1lPiAgICAgICBSZW1vdmUgc2VjdGlvbiA8bmFtZT4gZnJvbSB0aGUgb3V0cHV0XG5cCi0gIC1zIC0tc3RyaXAtYWxsICAgICAgICAgICAgICAgICAgIFJlbW92ZSBhbGwgc3ltYm9sIGFuZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uXG5cCi0gIC1nIC1TIC0tc3RyaXAtZGVidWcgICAgICAgICAgICAgIFJlbW92ZSBhbGwgZGVidWdnaW5nIHN5bWJvbHNcblwKLSAgICAgLS1zdHJpcC11bm5lZWRlZCAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBzeW1ib2xzIG5vdCBuZWVkZWQgYnkgcmVsb2NhdGlvbnNcblwKLSAgLU4gLS1zdHJpcC1zeW1ib2wgPG5hbWU+ICAgICAgICAgRG8gbm90IGNvcHkgc3ltYm9sIDxuYW1lPlxuXAotICAtSyAtLWtlZXAtc3ltYm9sIDxuYW1lPiAgICAgICAgICBPbmx5IGNvcHkgc3ltYm9sIDxuYW1lPlxuXAotICAteCAtLWRpc2NhcmQtYWxsICAgICAgICAgICAgICAgICBSZW1vdmUgYWxsIG5vbi1nbG9iYWwgc3ltYm9sc1xuXAotICAtWCAtLWRpc2NhcmQtbG9jYWxzICAgICAgICAgICAgICBSZW1vdmUgYW55IGNvbXBpbGVyLWdlbmVyYXRlZCBzeW1ib2xzXG5cCi0gIC12IC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgICAgIExpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZFxuXAotICAtViAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyXG5cCi0gIC1oIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBvdXRwdXRcblwKLSAgLW8gPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gPGZpbGU+XG5cCi0iKSk7Ci0KLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoZXhpdF9zdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChleGl0X3N0YXR1cyk7Ci19Ci0KLS8qIFBhcnNlIHNlY3Rpb24gZmxhZ3MgaW50byBhIGZsYWd3b3JkLCB3aXRoIGEgZmF0YWwgZXJyb3IgaWYgdGhlCi0gICBzdHJpbmcgY2FuJ3QgYmUgcGFyc2VkLiAgKi8KLQotc3RhdGljIGZsYWd3b3JkCi1wYXJzZV9mbGFncyAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgZmxhZ3dvcmQgcmV0OwotICBjb25zdCBjaGFyICpzbmV4dDsKLSAgaW50IGxlbjsKLQotICByZXQgPSBTRUNfTk9fRkxBR1M7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzbmV4dCA9IHN0cmNociAocywgJywnKTsKLSAgICAgIGlmIChzbmV4dCA9PSBOVUxMKQotCWxlbiA9IHN0cmxlbiAocyk7Ci0gICAgICBlbHNlCi0JewotCSAgbGVuID0gc25leHQgLSBzOwotCSAgKytzbmV4dDsKLQl9Ci0KLSAgICAgIGlmICgwKSA7Ci0jZGVmaW5lIFBBUlNFX0ZMQUcoZm5hbWUsZnZhbCkgXAotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoZm5hbWUsIHMsIGxlbikgPT0gMCkgcmV0IHw9IGZ2YWwKLSAgICAgIFBBUlNFX0ZMQUcgKCJhbGxvYyIsIFNFQ19BTExPQyk7Ci0gICAgICBQQVJTRV9GTEFHICgibG9hZCIsIFNFQ19MT0FEKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJub2xvYWQiLCBTRUNfTkVWRVJfTE9BRCk7Ci0gICAgICBQQVJTRV9GTEFHICgicmVhZG9ubHkiLCBTRUNfUkVBRE9OTFkpOwotICAgICAgUEFSU0VfRkxBRyAoImRlYnVnIiwgU0VDX0RFQlVHR0lORyk7Ci0gICAgICBQQVJTRV9GTEFHICgiY29kZSIsIFNFQ19DT0RFKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJkYXRhIiwgU0VDX0RBVEEpOwotICAgICAgUEFSU0VfRkxBRyAoInJvbSIsIFNFQ19ST00pOwotICAgICAgUEFSU0VfRkxBRyAoInNoYXJlIiwgU0VDX1NIQVJFRCk7Ci0gICAgICBQQVJTRV9GTEFHICgiY29udGVudHMiLCBTRUNfSEFTX0NPTlRFTlRTKTsKLSN1bmRlZiBQQVJTRV9GTEFHCi0gICAgICBlbHNlCi0JewotCSAgY2hhciAqY29weTsKLQotCSAgY29weSA9IHhtYWxsb2MgKGxlbiArIDEpOwotCSAgc3RybmNweSAoY29weSwgcywgbGVuKTsKLQkgIGNvcHlbbGVuXSA9ICdcMCc7Ci0JICBub25fZmF0YWwgKF8oInVucmVjb2duaXplZCBzZWN0aW9uIGZsYWcgYCVzJyIpLCBjb3B5KTsKLQkgIGZhdGFsIChfKCJzdXBwb3J0ZWQgZmxhZ3M6IGFsbG9jLCBsb2FkLCBub2xvYWQsIHJlYWRvbmx5LCBkZWJ1ZywgY29kZSwgZGF0YSwgcm9tLCBzaGFyZSwgY29udGVudHMiKSk7Ci0JfQotCi0gICAgICBzID0gc25leHQ7Ci0gICAgfQotICB3aGlsZSAocyAhPSBOVUxMKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBGaW5kIGFuZCBvcHRpb25hbGx5IGFkZCBhbiBlbnRyeSBpbiB0aGUgY2hhbmdlX3NlY3Rpb25zIGxpc3QuICAqLwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbGlzdCAqCi1maW5kX3NlY3Rpb25fbGlzdCAobmFtZSwgYWRkKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGFkZDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLQotICBmb3IgKHAgPSBjaGFuZ2Vfc2VjdGlvbnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgaWYgKHN0cmNtcCAocC0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiBwOwotCi0gIGlmICghIGFkZCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBwID0gKHN0cnVjdCBzZWN0aW9uX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KSk7Ci0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT51c2VkID0gZmFsc2U7Ci0gIHAtPnJlbW92ZSA9IGZhbHNlOwotICBwLT5jb3B5ID0gZmFsc2U7Ci0gIHAtPmNoYW5nZV92bWEgPSBDSEFOR0VfSUdOT1JFOwotICBwLT5jaGFuZ2VfbG1hID0gQ0hBTkdFX0lHTk9SRTsKLSAgcC0+dm1hX3ZhbCA9IDA7Ci0gIHAtPmxtYV92YWwgPSAwOwotICBwLT5zZXRfZmxhZ3MgPSBmYWxzZTsKLSAgcC0+ZmxhZ3MgPSAwOwotCi0gIHAtPm5leHQgPSBjaGFuZ2Vfc2VjdGlvbnM7Ci0gIGNoYW5nZV9zZWN0aW9ucyA9IHA7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byBzdHJpcF9zcGVjaWZpY19saXN0LiAgKi8KLQotc3RhdGljIHZvaWQgCi1hZGRfc3BlY2lmaWNfc3ltYm9sIChuYW1lLCBsaXN0KQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzdHJ1Y3Qgc3ltbGlzdCAqKmxpc3Q7Ci17Ci0gIHN0cnVjdCBzeW1saXN0ICp0bXBfbGlzdDsKLQotICB0bXBfbGlzdCA9IChzdHJ1Y3Qgc3ltbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW1saXN0KSk7Ci0gIHRtcF9saXN0LT5uYW1lID0gbmFtZTsKLSAgdG1wX2xpc3QtPm5leHQgPSAqbGlzdDsKLSAgKmxpc3QgPSB0bXBfbGlzdDsKLX0KLQotLyogU2VlIHdoZXRoZXIgYSBzeW1ib2wgc2hvdWxkIGJlIHN0cmlwcGVkIG9yIGtlcHQgYmFzZWQgb24KLSAgIHN0cmlwX3NwZWNpZmljX2xpc3QgYW5kIGtlZXBfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCBsaXN0KQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzdHJ1Y3Qgc3ltbGlzdCAqbGlzdDsKLXsKLSAgc3RydWN0IHN5bWxpc3QgKnRtcF9saXN0OwotCi0gIGZvciAodG1wX2xpc3QgPSBsaXN0OyB0bXBfbGlzdDsgdG1wX2xpc3QgPSB0bXBfbGlzdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCB0bXBfbGlzdC0+bmFtZSkgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VlIGlmIGEgc2VjdGlvbiBpcyBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWlzX3N0cmlwX3NlY3Rpb24gKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0KLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0gICAgICAmJiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9ERUJVRwotCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTk5FRURFRAotCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwKLQkgIHx8IGRpc2NhcmRfbG9jYWxzID09IExPQ0FMU19BTEwKLQkgIHx8IGNvbnZlcnRfZGVidWdnaW5nKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBzZWN0aW9uc19yZW1vdmVkICYmICEgc2VjdGlvbnNfY29waWVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBmYWxzZSk7Ci0gIGlmIChzZWN0aW9uc19yZW1vdmVkICYmIHAgIT0gTlVMTCAmJiBwLT5yZW1vdmUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChzZWN0aW9uc19jb3BpZWQgJiYgKHAgPT0gTlVMTCB8fCAhIHAtPmNvcHkpKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENob29zZSB3aGljaCBzeW1ib2wgZW50cmllcyB0byBjb3B5OyBwdXQgdGhlIHJlc3VsdCBpbiBPU1lNUy4KLSAgIFdlIGRvbid0IGNvcHkgaW4gcGxhY2UsIGJlY2F1c2UgdGhhdCBjb25mdXNlcyB0aGUgcmVsb2NzLgotICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBwcmludC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWZpbHRlcl9zeW1ib2xzIChhYmZkLCBvYmZkLCBvc3ltcywgaXN5bXMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXN5bWJvbCAqKm9zeW1zLCAqKmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotewotICByZWdpc3RlciBhc3ltYm9sICoqZnJvbSA9IGlzeW1zLCAqKnRvID0gb3N5bXM7Ci0gIGxvbmcgc3JjX2NvdW50ID0gMCwgZHN0X2NvdW50ID0gMDsKLQotICBmb3IgKDsgc3JjX2NvdW50IDwgc3ltY291bnQ7IHNyY19jb3VudCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bSA9IGZyb21bc3JjX2NvdW50XTsKLSAgICAgIGZsYWd3b3JkIGZsYWdzID0gc3ltLT5mbGFnczsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOwotICAgICAgaW50IGtlZXA7Ci0KLSAgICAgIGlmIChjaGFuZ2VfbGVhZGluZ19jaGFyCi0JICAmJiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKQotCSAgICAgICE9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JmZCkpCi0JICAmJiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXDAnCi0JICAgICAgfHwgKG5hbWVbMF0gPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSkpKQotCXsKLQkgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG9iZmQpID09ICdcMCcpCi0JICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pID0gbmFtZSArIDE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpuOwotCi0JICAgICAgbiA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyKTsKLQkgICAgICBuWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvYmZkKTsKLQkgICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXDAnKQotCQlzdHJjcHkgKG4gKyAxLCBuYW1lKTsKLQkgICAgICBlbHNlCi0JCXN0cmNweSAobiArIDEsIG5hbWUgKyAxKTsKLQkgICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSA9IG47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChyZW1vdmVfbGVhZGluZ19jaGFyCi0JICAmJiAoKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAotCSAgICAgIHx8IChmbGFncyAmIEJTRl9XRUFLKSAhPSAwCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgJiYgbmFtZVswXSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpKQotCW5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pID0gbmFtZSArIDE7Ci0KLSAgICAgIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTCkKLQlrZWVwID0gMDsKLSAgICAgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9LRUVQKSAhPSAwCQkvKiBVc2VkIGluIHJlbG9jYXRpb24uICAqLwotCSAgICAgICB8fCAoKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0JCSAgICYmICgoKmJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+c3ltYm9sX3B0cl9wdHIpLT5mbGFncwotCQkgICAgICAgJiBCU0ZfS0VFUCkgIT0gMCkpCi0Ja2VlcCA9IDE7Ci0gICAgICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCS8qIEdsb2JhbCBzeW1ib2wuICAqLwotCSAgICAgICB8fCAoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCWtlZXAgPSBzdHJpcF9zeW1ib2xzICE9IFNUUklQX1VOTkVFREVEOwotICAgICAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkJLyogRGVidWdnaW5nIHN5bWJvbC4gICovCi0Ja2VlcCA9IChzdHJpcF9zeW1ib2xzICE9IFNUUklQX0RFQlVHCi0JCSYmIHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfVU5ORUVERUQKLQkJJiYgISBjb252ZXJ0X2RlYnVnZ2luZyk7Ci0gICAgICBlbHNlCQkJLyogTG9jYWwgc3ltYm9sLiAgKi8KLQlrZWVwID0gKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfVU5ORUVERUQKLQkJJiYgKGRpc2NhcmRfbG9jYWxzICE9IExPQ0FMU19BTEwKLQkJICAgICYmIChkaXNjYXJkX2xvY2FscyAhPSBMT0NBTFNfU1RBUlRfTAotCQkJfHwgISBiZmRfaXNfbG9jYWxfbGFiZWwgKGFiZmQsIHN5bSkpKSk7Ci0KLSAgICAgIGlmIChrZWVwICYmIGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIHN0cmlwX3NwZWNpZmljX2xpc3QpKQotCWtlZXAgPSAwOwotICAgICAgaWYgKCFrZWVwICYmIGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIGtlZXBfc3BlY2lmaWNfbGlzdCkpCi0Ja2VlcCA9IDE7Ci0gICAgICBpZiAoa2VlcCAmJiBpc19zdHJpcF9zZWN0aW9uIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCWtlZXAgPSAwOwotCi0gICAgICBpZiAoa2VlcCAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCi0JICAmJiAod2Vha2VuIHx8IGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIHdlYWtlbl9zcGVjaWZpY19saXN0KSkpCi0JewotCSAgc3ltLT5mbGFncyAmPX4gQlNGX0dMT0JBTDsKLQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0JfQotICAgICAgaWYgKGtlZXAgJiYgKGZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpCi0JICAmJiBpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCBsb2NhbGl6ZV9zcGVjaWZpY19saXN0KSkKLQl7Ci0JICBzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTCB8IEJTRl9XRUFLKTsKLQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0xPQ0FMOwotCX0KLQotICAgICAgaWYgKGtlZXApCi0JdG9bZHN0X2NvdW50KytdID0gc3ltOwotICAgIH0KLQotICB0b1tkc3RfY291bnRdID0gTlVMTDsKLQotICByZXR1cm4gZHN0X2NvdW50OwotfQotCi0vKiBLZWVwIG9ubHkgZXZlcnkgYGNvcHlfYnl0ZSd0aCBieXRlIGluIE1FTUhVTkssIHdoaWNoIGlzICpTSVpFIGJ5dGVzIGxvbmcuCi0gICBBZGp1c3QgKlNJWkUuICAqLwotCi1zdGF0aWMgdm9pZAotZmlsdGVyX2J5dGVzIChtZW1odW5rLCBzaXplKQotICAgICBjaGFyICptZW1odW5rOwotICAgICBiZmRfc2l6ZV90eXBlICpzaXplOwotewotICBjaGFyICpmcm9tID0gbWVtaHVuayArIGNvcHlfYnl0ZSwgKnRvID0gbWVtaHVuaywgKmVuZCA9IG1lbWh1bmsgKyAqc2l6ZTsKLQotICBmb3IgKDsgZnJvbSA8IGVuZDsgZnJvbSArPSBpbnRlcmxlYXZlKQotICAgICp0bysrID0gKmZyb207Ci0gIGlmICgqc2l6ZSAlIGludGVybGVhdmUgPiAoYmZkX3NpemVfdHlwZSkgY29weV9ieXRlKQotICAgICpzaXplID0gKCpzaXplIC8gaW50ZXJsZWF2ZSkgKyAxOwotICBlbHNlCi0gICAgKnNpemUgLz0gaW50ZXJsZWF2ZTsKLX0KLQotLyogQ29weSBvYmplY3QgZmlsZSBJQkZEIG9udG8gT0JGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb3B5X29iamVjdCAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGJmZF92bWEgc3RhcnQ7Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIGFzZWN0aW9uICoqb3NlY3Rpb25zID0gTlVMTDsKLSAgYmZkX3NpemVfdHlwZSAqZ2FwcyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgbWF4X2dhcCA9IDA7Ci0gIGxvbmcgc3ltc2l6ZTsKLSAgUFRSIGRoYW5kbGU7Ci0KLQotICBpZiAoIWJmZF9zZXRfZm9ybWF0IChvYmZkLCBiZmRfZ2V0X2Zvcm1hdCAoaWJmZCkpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIGlmICh2ZXJib3NlKQotICAgIHByaW50ZiAoXygiY29weSBmcm9tICVzKCVzKSB0byAlcyglcylcbiIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgYmZkX2dldF90YXJnZXQgKGliZmQpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF90YXJnZXQgKG9iZmQpKTsKLQotICBpZiAoc2V0X3N0YXJ0X3NldCkKLSAgICBzdGFydCA9IHNldF9zdGFydDsKLSAgZWxzZQotICAgIHN0YXJ0ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChpYmZkKTsKLSAgc3RhcnQgKz0gY2hhbmdlX3N0YXJ0OwotCi0gIGlmICghYmZkX3NldF9zdGFydF9hZGRyZXNzIChvYmZkLCBzdGFydCkKLSAgICAgIHx8ICFiZmRfc2V0X2ZpbGVfZmxhZ3MgKG9iZmQsCi0JCQkgICAgICAoYmZkX2dldF9maWxlX2ZsYWdzIChpYmZkKQotCQkJICAgICAgICYgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyAob2JmZCkpKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAvKiBDb3B5IGFyY2hpdGVjdHVyZSBvZiBpbnB1dCBmaWxlIHRvIG91dHB1dCBmaWxlICovCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksCi0JCQkgIGJmZF9nZXRfbWFjaCAoaWJmZCkpKQotICAgIG5vbl9mYXRhbCAoXygiV2FybmluZzogT3V0cHV0IGZpbGUgY2Fubm90IHJlcHJlc2VudCBhcmNoaXRlY3R1cmUgJXMiKSwKLQkgICAgICAgYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGJmZF9nZXRfYXJjaCAoaWJmZCksCi0JCQkJCWJmZF9nZXRfbWFjaCAoaWJmZCkpKTsKLSAgCi0gIGlmICghYmZkX3NldF9mb3JtYXQgKG9iZmQsIGJmZF9nZXRfZm9ybWF0IChpYmZkKSkpCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgaWYgKGlzeW1wcCkKLSAgICBmcmVlIChpc3ltcHApOwotICAKLSAgaWYgKG9zeW1wcCAhPSBpc3ltcHApCi0gICAgZnJlZSAob3N5bXBwKTsKLQotICAvKiBCRkQgbWFuZGF0ZXMgdGhhdCBhbGwgb3V0cHV0IHNlY3Rpb25zIGJlIGNyZWF0ZWQgYW5kIHNpemVzIHNldCBiZWZvcmUKLSAgICAgYW55IG91dHB1dCBpcyBkb25lLiAgVGh1cywgd2UgdHJhdmVyc2UgYWxsIHNlY3Rpb25zIG11bHRpcGxlIHRpbWVzLiAgKi8KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpYmZkLCBzZXR1cF9zZWN0aW9uLCAodm9pZCAqKSBvYmZkKTsKLQotICBpZiAoYWRkX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fYWRkICpwYWRkOwotICAgICAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcHNldDsKLQotICAgICAgZm9yIChwYWRkID0gYWRkX3NlY3Rpb25zOyBwYWRkICE9IE5VTEw7IHBhZGQgPSBwYWRkLT5uZXh0KQotCXsKLQkgIHBhZGQtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvYmZkLCBwYWRkLT5uYW1lKTsKLQkgIGlmIChwYWRkLT5zZWN0aW9uID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBub25fZmF0YWwgKF8oImNhbid0IGNyZWF0ZSBzZWN0aW9uIGAlcyc6ICVzIiksCi0JCSAgICAgICBwYWRkLT5uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgc3RhdHVzID0gMTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCSAgICAgIAotCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBwYWRkLT5zZWN0aW9uLCBwYWRkLT5zaXplKSkKLQkJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBwc2V0ID0gZmluZF9zZWN0aW9uX2xpc3QgKHBhZGQtPm5hbWUsIGZhbHNlKTsKLQkgICAgICBpZiAocHNldCAhPSBOVUxMKQotCQlwc2V0LT51c2VkID0gdHJ1ZTsKLQotCSAgICAgIGlmIChwc2V0ICE9IE5VTEwgJiYgcHNldC0+c2V0X2ZsYWdzKQotCQlmbGFncyA9IHBzZXQtPmZsYWdzIHwgU0VDX0hBU19DT05URU5UUzsKLQkgICAgICBlbHNlCi0JCWZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBOwotCSAgICAgIAotCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgcGFkZC0+c2VjdGlvbiwgZmxhZ3MpKQotCQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIGlmIChwc2V0ICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocHNldC0+Y2hhbmdlX3ZtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQkgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAob2JmZCwgcGFkZC0+c2VjdGlvbiwgcHNldC0+dm1hX3ZhbCkpCi0JCSAgICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCQkgIAotCQkgIGlmIChwc2V0LT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCi0JCSAgICB7Ci0JCSAgICAgIHBhZGQtPnNlY3Rpb24tPmxtYSA9IHBzZXQtPmxtYV92YWw7Ci0JCSAgICAgIAotCQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50Ci0JCQkgIChvYmZkLCBwYWRkLT5zZWN0aW9uLAotCQkJICAgYmZkX3NlY3Rpb25fYWxpZ25tZW50IChvYmZkLCBwYWRkLT5zZWN0aW9uKSkpCi0JCQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZ2FwX2ZpbGxfc2V0IHx8IHBhZF90b19zZXQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKipzZXQ7Ci0gICAgICB1bnNpZ25lZCBpbnQgYywgaTsKLQotICAgICAgLyogV2UgbXVzdCBmaWxsIGluIGdhcHMgYmV0d2VlbiB0aGUgc2VjdGlvbnMgYW5kL29yIHdlIG11c3QgcGFkCi0JIHRoZSBsYXN0IHNlY3Rpb24gdG8gYSBzcGVjaWZpZWQgYWRkcmVzcy4gIFdlIGRvIHRoaXMgYnkKLQkgZ3JhYmJpbmcgYSBsaXN0IG9mIHRoZSBzZWN0aW9ucywgc29ydGluZyB0aGVtIGJ5IFZNQSwgYW5kCi0JIGluY3JlYXNpbmcgdGhlIHNlY3Rpb24gc2l6ZXMgYXMgcmVxdWlyZWQgdG8gZmlsbCB0aGUgZ2Fwcy4KLQkgV2Ugd3JpdGUgb3V0IHRoZSBnYXAgY29udGVudHMgYmVsb3cuICAqLwotCi0gICAgICBjID0gYmZkX2NvdW50X3NlY3Rpb25zIChvYmZkKTsKLSAgICAgIG9zZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgeG1hbGxvYyAoYyAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgc2V0ID0gb3NlY3Rpb25zOwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvYmZkLCBnZXRfc2VjdGlvbnMsICh2b2lkICopICZzZXQpOwotCi0gICAgICBxc29ydCAob3NlY3Rpb25zLCBjLCBzaXplb2YgKGFzZWN0aW9uICopLCBjb21wYXJlX3NlY3Rpb25fbG1hKTsKLQotICAgICAgZ2FwcyA9IChiZmRfc2l6ZV90eXBlICopIHhtYWxsb2MgKGMgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLSAgICAgIG1lbXNldCAoZ2FwcywgMCwgYyAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpOwotCi0gICAgICBpZiAoZ2FwX2ZpbGxfc2V0KQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBjIC0gMTsgaSsrKQotCSAgICB7Ci0JICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIGJmZF92bWEgZ2FwX3N0YXJ0LCBnYXBfc3RvcDsKLQotCSAgICAgIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBvc2VjdGlvbnNbaV0pOwotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JCSAgfHwgKGZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tpXSk7Ci0JICAgICAgZ2FwX3N0YXJ0ID0gYmZkX3NlY3Rpb25fbG1hIChvYmZkLCBvc2VjdGlvbnNbaV0pICsgc2l6ZTsKLQkgICAgICBnYXBfc3RvcCA9IGJmZF9zZWN0aW9uX2xtYSAob2JmZCwgb3NlY3Rpb25zW2kgKyAxXSk7Ci0JICAgICAgaWYgKGdhcF9zdGFydCA8IGdhcF9zdG9wKQotCQl7Ci0JCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tpXSwKLQkJCQkJICAgICAgc2l6ZSArIChnYXBfc3RvcCAtIGdhcF9zdGFydCkpKQotCQkgICAgewotCQkgICAgICBub25fZmF0YWwgKF8oIkNhbid0IGZpbGwgZ2FwIGFmdGVyICVzOiAlcyIpLAotCQkJICAgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvYmZkLCBvc2VjdGlvbnNbaV0pLAotCQkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkJICAgICAgc3RhdHVzID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgZ2Fwc1tpXSA9IGdhcF9zdG9wIC0gZ2FwX3N0YXJ0OwotCQkgIGlmIChtYXhfZ2FwIDwgZ2FwX3N0b3AgLSBnYXBfc3RhcnQpCi0JCSAgICBtYXhfZ2FwID0gZ2FwX3N0b3AgLSBnYXBfc3RhcnQ7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHBhZF90b19zZXQpCi0JewotCSAgYmZkX3ZtYSBsbWE7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLQkgIGxtYSA9IGJmZF9zZWN0aW9uX2xtYSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSk7Ci0JICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSk7Ci0JICBpZiAobG1hICsgc2l6ZSA8IHBhZF90bykKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdLAotCQkJCQkgIHBhZF90byAtIGxtYSkpCi0JCXsKLQkJICBub25fZmF0YWwgKF8oIkNhbid0IGFkZCBwYWRkaW5nIHRvICVzOiAlcyIpLAotCQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0pLAotCQkJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCQkgIHN0YXR1cyA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBnYXBzW2MgLSAxXSA9IHBhZF90byAtIChsbWEgKyBzaXplKTsKLQkJICBpZiAobWF4X2dhcCA8IHBhZF90byAtIChsbWEgKyBzaXplKSkKLQkJICAgIG1heF9nYXAgPSBwYWRfdG8gLSAobG1hICsgc2l6ZSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogU3ltYm9sIGZpbHRlcmluZyBtdXN0IGhhcHBlbiBhZnRlciB0aGUgb3V0cHV0IHNlY3Rpb25zIGhhdmUKLSAgICAgYmVlbiBjcmVhdGVkLCBidXQgYmVmb3JlIHRoZWlyIGNvbnRlbnRzIGFyZSBzZXQuICAqLwotICBkaGFuZGxlID0gTlVMTDsKLSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChpYmZkKTsKLSAgaWYgKHN5bXNpemUgPCAwKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAKLSAgb3N5bXBwID0gaXN5bXBwID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChpYmZkLCBpc3ltcHApOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAKLSAgaWYgKGNvbnZlcnRfZGVidWdnaW5nKQotICAgIGRoYW5kbGUgPSByZWFkX2RlYnVnZ2luZ19pbmZvIChpYmZkLCBpc3ltcHAsIHN5bWNvdW50KTsKLSAgCi0gIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHIAotICAgICAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwKLSAgICAgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLSAgICAgIHx8IGRpc2NhcmRfbG9jYWxzICE9IExPQ0FMU19VTkRFRgotICAgICAgfHwgc3RyaXBfc3BlY2lmaWNfbGlzdCAhPSBOVUxMCi0gICAgICB8fCBrZWVwX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwgbG9jYWxpemVfc3BlY2lmaWNfbGlzdCAhPSBOVUxMCi0gICAgICB8fCB3ZWFrZW5fc3BlY2lmaWNfbGlzdCAhPSBOVUxMCi0gICAgICB8fCBzZWN0aW9uc19yZW1vdmVkCi0gICAgICB8fCBzZWN0aW9uc19jb3BpZWQKLSAgICAgIHx8IGNvbnZlcnRfZGVidWdnaW5nCi0gICAgICB8fCBjaGFuZ2VfbGVhZGluZ19jaGFyCi0gICAgICB8fCByZW1vdmVfbGVhZGluZ19jaGFyCi0gICAgICB8fCB3ZWFrZW4pCi0gICAgewotICAgICAgLyogTWFyayBzeW1ib2xzIHVzZWQgaW4gb3V0cHV0IHJlbG9jYXRpb25zIHNvIHRoYXQgdGhleQotCSBhcmUga2VwdCwgZXZlbiBpZiB0aGV5IGFyZSBsb2NhbCBsYWJlbHMgb3Igc3RhdGljIHN5bWJvbHMuCi0JIAotCSBOb3RlIHdlIGl0ZXJhdGUgb3ZlciB0aGUgaW5wdXQgc2VjdGlvbnMgZXhhbWluaW5nIHRoZWlyCi0JIHJlbG9jYXRpb25zIHNpbmNlIHRoZSByZWxvY2F0aW9ucyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucwotCSBoYXZlbid0IGJlZW4gc2V0IHlldC4gIG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zIHdpbGwKLQkgaWdub3JlIGlucHV0IHNlY3Rpb25zIHdoaWNoIGhhdmUgbm8gY29ycmVzcG9uZGluZyBvdXRwdXQKLQkgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9BTEwpCi0JYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpYmZkLAotCQkJICAgICAgIG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zLAotCQkJICAgICAgIChQVFIpaXN5bXBwKTsKLSAgICAgIG9zeW1wcCA9IChhc3ltYm9sICoqKSB4bWFsbG9jICgoc3ltY291bnQgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBzeW1jb3VudCA9IGZpbHRlcl9zeW1ib2xzIChpYmZkLCBvYmZkLCBvc3ltcHAsIGlzeW1wcCwgc3ltY291bnQpOwotICAgIH0KLQotICBpZiAoY29udmVydF9kZWJ1Z2dpbmcgJiYgZGhhbmRsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHdyaXRlX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlLCAmc3ltY291bnQsICZvc3ltcHApKQotCXsKLQkgIHN0YXR1cyA9IDE7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBiZmRfc2V0X3N5bXRhYiAob2JmZCwgb3N5bXBwLCBzeW1jb3VudCk7Ci0KLSAgLyogVGhpcyBoYXMgdG8gaGFwcGVuIGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gc2V0LiAgKi8KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpYmZkLCBjb3B5X3NlY3Rpb24sICh2b2lkICopIG9iZmQpOwotCi0gIGlmIChhZGRfc2VjdGlvbnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKnBhZGQ7Ci0KLSAgICAgIGZvciAocGFkZCA9IGFkZF9zZWN0aW9uczsgcGFkZCAhPSBOVUxMOyBwYWRkID0gcGFkZC0+bmV4dCkKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIHBhZGQtPnNlY3Rpb24sCi0JCQkJCSAgKFBUUikgcGFkZC0+Y29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLAotCQkJCQkgIChiZmRfc2l6ZV90eXBlKSBwYWRkLT5zaXplKSkKLQkgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0JfQotICAgIH0KLQotICBpZiAoZ2FwX2ZpbGxfc2V0IHx8IHBhZF90b19zZXQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGludCBjLCBpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBnYXBzLiAgKi8KLQotICAgICAgaWYgKG1heF9nYXAgPiA4MTkyKQotCW1heF9nYXAgPSA4MTkyOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKG1heF9nYXApOwotICAgICAgbWVtc2V0IChidWYsIGdhcF9maWxsLCAoc2l6ZV90KSBtYXhfZ2FwKTsKLQotICAgICAgYyA9IGJmZF9jb3VudF9zZWN0aW9ucyAob2JmZCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotCXsKLQkgIGlmIChnYXBzW2ldICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGxlZnQ7Ci0JICAgICAgZmlsZV9wdHIgb2ZmOwotCi0JICAgICAgbGVmdCA9IGdhcHNbaV07Ci0JICAgICAgb2ZmID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2ldKSAtIGxlZnQ7Ci0JICAgICAgd2hpbGUgKGxlZnQgPiAwKQotCQl7Ci0JCSAgYmZkX3NpemVfdHlwZSBub3c7Ci0KLQkJICBpZiAobGVmdCA+IDgxOTIpCi0JCSAgICBub3cgPSA4MTkyOwotCQkgIGVsc2UKLQkJICAgIG5vdyA9IGxlZnQ7Ci0KLQkJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIG9zZWN0aW9uc1tpXSwgYnVmLAotCQkJCQkJICBvZmYsIG5vdykpCi0JCSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCQkgIGxlZnQgLT0gbm93OwotCQkgIG9mZiArPSBub3c7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWxsb3cgdGhlIEJGRCBiYWNrZW5kIHRvIGNvcHkgYW55IHByaXZhdGUgZGF0YSBpdCB1bmRlcnN0YW5kcwotICAgICBmcm9tIHRoZSBpbnB1dCBCRkQgdG8gdGhlIG91dHB1dCBCRkQuICBUaGlzIGlzIGRvbmUgbGFzdCB0bwotICAgICBwZXJtaXQgdGhlIHJvdXRpbmUgdG8gbG9vayBhdCB0aGUgZmlsdGVyZWQgc3ltYm9sIHRhYmxlLCB3aGljaCBpcwotICAgICBpbXBvcnRhbnQgZm9yIHRoZSBFQ09GRiBjb2RlIGF0IGxlYXN0LiAgKi8KLSAgaWYgKCFiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKSkKLSAgICB7Ci0gICAgICBub25fZmF0YWwgKF8oIiVzOiBlcnJvciBjb3B5aW5nIHByaXZhdGUgQkZEIGRhdGE6ICVzIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIHN0YXR1cyA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotCi0vKiBSZWFkIGVhY2ggYXJjaGl2ZSBlbGVtZW50IGluIHR1cm4gZnJvbSBJQkZELCBjb3B5IHRoZQotICAgY29udGVudHMgdG8gdGVtcCBmaWxlLCBhbmQga2VlcCB0aGUgdGVtcCBmaWxlIGhhbmRsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1jb3B5X2FyY2hpdmUgKGliZmQsIG9iZmQsIG91dHB1dF90YXJnZXQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotICAgICBjb25zdCBjaGFyICpvdXRwdXRfdGFyZ2V0OwotewotICBzdHJ1Y3QgbmFtZV9saXN0Ci0gICAgewotICAgICAgc3RydWN0IG5hbWVfbGlzdCAqbmV4dDsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBiZmQgKm9iZmQ7Ci0gICAgfSAqbGlzdCwgKmw7Ci0gIGJmZCAqKnB0ciA9ICZvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIGJmZCAqdGhpc19lbGVtZW50OwotICBjaGFyICpkaXIgPSBtYWtlX3RlbXBuYW1lIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgLyogTWFrZSBhIHRlbXAgZGlyZWN0b3J5IHRvIGhvbGQgdGhlIGNvbnRlbnRzLiAgKi8KLSNpZiBkZWZpbmVkIChfV0lOMzIpICYmICFkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0gIGlmIChta2RpciAoZGlyKSAhPSAwKQotI2Vsc2UKLSAgaWYgKG1rZGlyIChkaXIsIDA3MDApICE9IDApCi0jZW5kaWYKLSAgICB7Ci0gICAgICBmYXRhbCAoXygiY2Fubm90IG1rZGlyICVzIGZvciBhcmNoaXZlIGNvcHlpbmcgKGVycm9yOiAlcykiKSwKLQkgICAgIGRpciwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgfQotICBvYmZkLT5oYXNfYXJtYXAgPSBpYmZkLT5oYXNfYXJtYXA7Ci0KLSAgbGlzdCA9IE5VTEw7Ci0KLSAgdGhpc19lbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoaWJmZCwgTlVMTCk7Ci0gIHdoaWxlICghc3RhdHVzICYmIHRoaXNfZWxlbWVudCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGZvciB0aGlzIG1lbWJlci4gICovCi0gICAgICBjaGFyICpvdXRwdXRfbmFtZSA9IGNvbmNhdCAoZGlyLCAiLyIsIGJmZF9nZXRfZmlsZW5hbWUgKHRoaXNfZWxlbWVudCksCi0JCQkJICAoY2hhciAqKSBOVUxMKTsKLSAgICAgIGJmZCAqb3V0cHV0X2JmZCA9IGJmZF9vcGVudyAob3V0cHV0X25hbWUsIG91dHB1dF90YXJnZXQpOwotICAgICAgYmZkICpsYXN0X2VsZW1lbnQ7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgICBpbnQgc3RhdF9zdGF0dXMgPSAwOwotCi0gICAgICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JewotCSAgc3RhdF9zdGF0dXMgPSBiZmRfc3RhdF9hcmNoX2VsdCAodGhpc19lbGVtZW50LCAmYnVmKTsKLQkgIGlmIChzdGF0X3N0YXR1cyAhPSAwKQotCSAgICBub25fZmF0YWwgKF8oImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiKSwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHRoaXNfZWxlbWVudCkpOwotCX0KLQotICAgICAgbCA9IChzdHJ1Y3QgbmFtZV9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG5hbWVfbGlzdCkpOwotICAgICAgbC0+bmFtZSA9IG91dHB1dF9uYW1lOwotICAgICAgbC0+bmV4dCA9IGxpc3Q7Ci0gICAgICBsaXN0ID0gbDsKLQotICAgICAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X25hbWUpOwotCi0gICAgICBpZiAoIWJmZF9zZXRfZm9ybWF0IChvYmZkLCBiZmRfZ2V0X2Zvcm1hdCAoaWJmZCkpKQotCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAodGhpc19lbGVtZW50LCBiZmRfb2JqZWN0KSA9PSB0cnVlKQotCWNvcHlfb2JqZWN0ICh0aGlzX2VsZW1lbnQsIG91dHB1dF9iZmQpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAob3V0cHV0X2JmZCkpCi0JewotCSAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSk7Ci0JICAvKiBFcnJvciBpbiBuZXcgb2JqZWN0IGZpbGUuIERvbid0IGNoYW5nZSBhcmNoaXZlLiAqLwotCSAgc3RhdHVzID0gMTsKLQl9Ci0KLSAgICAgIGlmIChwcmVzZXJ2ZV9kYXRlcyAmJiBzdGF0X3N0YXR1cyA9PSAwKQotCXNldF90aW1lcyAob3V0cHV0X25hbWUsICZidWYpOwotCi0gICAgICAvKiBPcGVuIHRoZSBuZXdseSBvdXRwdXQgZmlsZSBhbmQgYXR0YWNoIHRvIG91ciBsaXN0LiAgKi8KLSAgICAgIG91dHB1dF9iZmQgPSBiZmRfb3BlbnIgKG91dHB1dF9uYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLQotICAgICAgbC0+b2JmZCA9IG91dHB1dF9iZmQ7Ci0KLSAgICAgICpwdHIgPSBvdXRwdXRfYmZkOwotICAgICAgcHRyID0gJm91dHB1dF9iZmQtPm5leHQ7Ci0KLSAgICAgIGxhc3RfZWxlbWVudCA9IHRoaXNfZWxlbWVudDsKLQotICAgICAgdGhpc19lbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoaWJmZCwgbGFzdF9lbGVtZW50KTsKLQotICAgICAgYmZkX2Nsb3NlIChsYXN0X2VsZW1lbnQpOwotICAgIH0KLSAgKnB0ciA9IChiZmQgKikgTlVMTDsKLQotICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgaWYgKCFiZmRfY2xvc2UgKGliZmQpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIC8qIERlbGV0ZSBhbGwgdGhlIGZpbGVzIHRoYXQgd2Ugb3BlbmVkLiAgKi8KLSAgZm9yIChsID0gbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfY2xvc2UgKGwtPm9iZmQpOwotICAgICAgdW5saW5rIChsLT5uYW1lKTsKLSAgICB9Ci0gIHJtZGlyIChkaXIpOwotfQotCi0vKiBUaGUgdG9wLWxldmVsIGNvbnRyb2wuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9maWxlIChpbnB1dF9maWxlbmFtZSwgb3V0cHV0X2ZpbGVuYW1lLCBpbnB1dF90YXJnZXQsIG91dHB1dF90YXJnZXQpCi0gICAgIGNvbnN0IGNoYXIgKmlucHV0X2ZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmlucHV0X3RhcmdldDsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X3RhcmdldDsKLXsKLSAgYmZkICppYmZkOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgLyogVG8gYWxsb3cgdXMgdG8gZG8gInN0cmlwICoiIHdpdGhvdXQgZHlpbmcgb24gdGhlIGZpcnN0Ci0gICAgIG5vbi1vYmplY3QgZmlsZSwgZmFpbHVyZXMgYXJlIG5vbmZhdGFsLiAgKi8KLQotICBpYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0KTsKLSAgaWYgKGliZmQgPT0gTlVMTCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGlucHV0X2ZpbGVuYW1lKTsKLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoaWJmZCwgYmZkX2FyY2hpdmUpKQotICAgIHsKLSAgICAgIGJmZCAqb2JmZDsKLQotICAgICAgLyogYmZkX2dldF90YXJnZXQgZG9lcyBub3QgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHVudGlsCi0gICAgICAgICBiZmRfY2hlY2tfZm9ybWF0IHN1Y2NlZWRzLiAgKi8KLSAgICAgIGlmIChvdXRwdXRfdGFyZ2V0ID09IE5VTEwpCi0Jb3V0cHV0X3RhcmdldCA9IGJmZF9nZXRfdGFyZ2V0IChpYmZkKTsKLQotICAgICAgb2JmZCA9IGJmZF9vcGVudyAob3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChvYmZkID09IE5VTEwpCi0JUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfZmlsZW5hbWUpOwotCi0gICAgICBjb3B5X2FyY2hpdmUgKGliZmQsIG9iZmQsIG91dHB1dF90YXJnZXQpOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChpYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZCAqb2JmZDsKLQotICAgICAgLyogYmZkX2dldF90YXJnZXQgZG9lcyBub3QgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHVudGlsCi0gICAgICAgICBiZmRfY2hlY2tfZm9ybWF0IHN1Y2NlZWRzLiAgKi8KLSAgICAgIGlmIChvdXRwdXRfdGFyZ2V0ID09IE5VTEwpCi0Jb3V0cHV0X3RhcmdldCA9IGJmZF9nZXRfdGFyZ2V0IChpYmZkKTsKLQotICAgICAgb2JmZCA9IGJmZF9vcGVudyAob3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChvYmZkID09IE5VTEwpCi0JUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfZmlsZW5hbWUpOwotCi0gICAgICBjb3B5X29iamVjdCAoaWJmZCwgb2JmZCk7Ci0KLSAgICAgIGlmICghYmZkX2Nsb3NlIChvYmZkKSkKLQlSRVRVUk5fTk9ORkFUQUwgKG91dHB1dF9maWxlbmFtZSk7Ci0KLSAgICAgIGlmICghYmZkX2Nsb3NlIChpYmZkKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGlucHV0X2ZpbGVuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGVuYW1lKTsKLSAgICAgIAotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICAKLSAgICAgIHN0YXR1cyA9IDE7Ci0gICAgfQotfQotCi0vKiBDcmVhdGUgYSBzZWN0aW9uIGluIE9CRkQgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBhdHRyaWJ1dGVzCi0gICBhcyBJU0VDVElPTiBpbiBJQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLXNldHVwX3NlY3Rpb24gKGliZmQsIGlzZWN0aW9uLCBvYmZkYXJnKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIHNlY19wdHIgaXNlY3Rpb247Ci0gICAgIFBUUiBvYmZkYXJnOwotewotICBiZmQgKm9iZmQgPSAoYmZkICopIG9iZmRhcmc7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIHNlY19wdHIgb3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgYmZkX3ZtYSB2bWE7Ci0gIGJmZF92bWEgbG1hOwotICBmbGFnd29yZCBmbGFnczsKLSAgY2hhciAqZXJyOwotCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpYmZkLCBpc2VjdGlvbikgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0gICAgICAmJiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9ERUJVRwotCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTk5FRURFRAotCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwKLQkgIHx8IGRpc2NhcmRfbG9jYWxzID09IExPQ0FMU19BTEwKLQkgIHx8IGNvbnZlcnRfZGVidWdnaW5nKSkKLSAgICByZXR1cm47Ci0KLSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbiksIGZhbHNlKTsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICBwLT51c2VkID0gdHJ1ZTsKLQotICBpZiAoc2VjdGlvbnNfcmVtb3ZlZCAmJiBwICE9IE5VTEwgJiYgcC0+cmVtb3ZlKQotICAgIHJldHVybjsKLSAgaWYgKHNlY3Rpb25zX2NvcGllZCAmJiAocCA9PSBOVUxMIHx8ICEgcC0+Y29weSkpCi0gICAgcmV0dXJuOwotCi0gIG9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKG9iZmQsIGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSk7Ci0gIAotICBpZiAob3NlY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnIgPSAibWFraW5nIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChjb3B5X2J5dGUgPj0gMCkKLSAgICBzaXplID0gKHNpemUgKyBpbnRlcmxlYXZlIC0gMSkgLyBpbnRlcmxlYXZlOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb24sIHNpemUpKQotICAgIHsKLSAgICAgIGVyciA9ICJzaXplIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotICAKLSAgdm1hID0gYmZkX3NlY3Rpb25fdm1hIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChwICE9IE5VTEwgJiYgcC0+Y2hhbmdlX3ZtYSA9PSBDSEFOR0VfTU9ESUZZKQotICAgIHZtYSArPSBwLT52bWFfdmFsOwotICBlbHNlIGlmIChwICE9IE5VTEwgJiYgcC0+Y2hhbmdlX3ZtYSA9PSBDSEFOR0VfU0VUKQotICAgIHZtYSA9IHAtPnZtYV92YWw7Ci0gIGVsc2UKLSAgICB2bWEgKz0gY2hhbmdlX3NlY3Rpb25fYWRkcmVzczsKLSAgCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKG9iZmQsIG9zZWN0aW9uLCB2bWEpKQotICAgIHsKLSAgICAgIGVyciA9ICJ2bWEiOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgbG1hID0gaXNlY3Rpb24tPmxtYTsKLSAgaWYgKChwICE9IE5VTEwpICYmIHAtPmNoYW5nZV9sbWEgIT0gQ0hBTkdFX0lHTk9SRSkKLSAgICB7Ci0gICAgICBpZiAocC0+Y2hhbmdlX2xtYSA9PSBDSEFOR0VfTU9ESUZZKQotCWxtYSArPSBwLT5sbWFfdmFsOwotICAgICAgZWxzZSBpZiAocC0+Y2hhbmdlX2xtYSA9PSBDSEFOR0VfU0VUKQotCWxtYSA9IHAtPmxtYV92YWw7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgbG1hICs9IGNoYW5nZV9zZWN0aW9uX2FkZHJlc3M7Ci0gIAotICBvc2VjdGlvbi0+bG1hID0gbG1hOwotCi0gIC8qIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IG5vdCBlbm91Z2guICBJZiB3ZSBjaGFuZ2UgdGhlIExNQSB3ZQotICAgICBtYXkgaGF2ZSB0byByZWNvbXB1dGUgdGhlIGhlYWRlciBmb3IgdGhlIGZpbGUgYXMgd2VsbC4gICovCi0gIGlmIChiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvYmZkLAotCQkJCSBvc2VjdGlvbiwKLQkJCQkgYmZkX3NlY3Rpb25fYWxpZ25tZW50IChpYmZkLCBpc2VjdGlvbikpCi0gICAgICA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBlcnIgPSAiYWxpZ25tZW50IjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChwICE9IE5VTEwgJiYgcC0+c2V0X2ZsYWdzKQotICAgIGZsYWdzID0gcC0+ZmxhZ3MgfCAoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKTsKLSAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIG9zZWN0aW9uLCBmbGFncykpCi0gICAgewotICAgICAgZXJyID0gImZsYWdzIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIC8qIFRoaXMgdXNlZCB0byBiZSBtYW5nbGVfc2VjdGlvbjsgd2UgZG8gaGVyZSB0byBhdm9pZCB1c2luZwotICAgICBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSBzaW5jZSBzb21lIGZvcm1hdHMgYWxsb3cgbXVsdGlwbGUKLSAgICAgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gb3NlY3Rpb247Ci0gIGlzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gMDsKLQotICAvKiBBbGxvdyB0aGUgQkZEIGJhY2tlbmQgdG8gY29weSBhbnkgcHJpdmF0ZSBkYXRhIGl0IHVuZGVyc3RhbmRzCi0gICAgIGZyb20gdGhlIGlucHV0IHNlY3Rpb24gdG8gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgaWYgKCFiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBlcnIgPSAicHJpdmF0ZSBkYXRhIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIC8qIEFsbCB3ZW50IHdlbGwgKi8KLSAgcmV0dXJuOwotCi1sb3NlcjoKLSAgbm9uX2ZhdGFsIChfKCIlczogc2VjdGlvbiBgJXMnOiBlcnJvciBpbiAlczogJXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgICAgYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pLAotCSAgICAgZXJyLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIHN0YXR1cyA9IDE7Ci19Ci0KLS8qIENvcHkgdGhlIGRhdGEgb2YgaW5wdXQgc2VjdGlvbiBJU0VDVElPTiBvZiBJQkZECi0gICB0byBhbiBvdXRwdXQgc2VjdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gT0JGRC4KLSAgIElmIHN0cmlwcGluZyB0aGVuIGRvbid0IGNvcHkgYW55IHJlbG9jYXRpb24gaW5mby4gICovCi0KLXN0YXRpYyB2b2lkCi1jb3B5X3NlY3Rpb24gKGliZmQsIGlzZWN0aW9uLCBvYmZkYXJnKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIHNlY19wdHIgaXNlY3Rpb247Ci0gICAgIFBUUiBvYmZkYXJnOwotewotICBiZmQgKm9iZmQgPSAoYmZkICopIG9iZmRhcmc7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudDsKLSAgc2VjX3B0ciBvc2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBsb25nIHJlbHNpemU7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCBlYXJsaWVyIG9uLCBkbyBub3Qga2VlcCBvbiBnZW5lcmF0aW5nCi0gICAgIGNvbXBsYWludHMgbm93LiAgKi8KLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHJldHVybjsKLSAgCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpYmZkLCBpc2VjdGlvbikgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0gICAgICAmJiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9ERUJVRwotCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTk5FRURFRAotCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwKLQkgIHx8IGRpc2NhcmRfbG9jYWxzID09IExPQ0FMU19BTEwKLQkgIHx8IGNvbnZlcnRfZGVidWdnaW5nKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pLCBmYWxzZSk7Ci0KLSAgaWYgKHNlY3Rpb25zX3JlbW92ZWQgJiYgcCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKLSAgICByZXR1cm47Ci0gIGlmIChzZWN0aW9uc19jb3BpZWQgJiYgKHAgPT0gTlVMTCB8fCAhIHAtPmNvcHkpKQotICAgIHJldHVybjsKLQotICBvc2VjdGlvbiA9IGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoaXNlY3Rpb24pOwotCi0gIGlmIChzaXplID09IDAgfHwgb3NlY3Rpb24gPT0gMCkKLSAgICByZXR1cm47Ci0KLQotICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocmVsc2l6ZSA8IDApCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gIAotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIGJmZF9zZXRfcmVsb2MgKG9iZmQsIG9zZWN0aW9uLCAoYXJlbGVudCAqKikgTlVMTCwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaWJmZCwgaXNlY3Rpb24sIHJlbHBwLCBpc3ltcHApOwotICAgICAgaWYgKHJlbGNvdW50IDwgMCkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgIAotICAgICAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMKQotCXsKLQkgIC8qIFJlbW92ZSByZWxvY2F0aW9ucyB3aGljaCBhcmUgbm90IGluCi0JICAgICBrZWVwX3N0cmlwX3NwZWNpZmljX2xpc3QuICovCi0JICBhcmVsZW50ICoqdGVtcF9yZWxwcDsKLQkgIGxvbmcgdGVtcF9yZWxjb3VudCA9IDA7Ci0JICBsb25nIGk7Ci0JICAKLQkgIHRlbXBfcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgcmVsY291bnQ7IGkrKykKLQkgICAgaWYgKGlzX3NwZWNpZmllZF9zeW1ib2wKLQkJKGJmZF9hc3ltYm9sX25hbWUgKCpyZWxwcCBbaV0tPnN5bV9wdHJfcHRyKSwKLQkJIGtlZXBfc3BlY2lmaWNfbGlzdCkpCi0JICAgICAgdGVtcF9yZWxwcCBbdGVtcF9yZWxjb3VudCsrXSA9IHJlbHBwIFtpXTsKLQkgIHJlbGNvdW50ID0gdGVtcF9yZWxjb3VudDsKLQkgIGZyZWUgKHJlbHBwKTsKLQkgIHJlbHBwID0gdGVtcF9yZWxwcDsKLQl9Ci0gICAgICBiZmRfc2V0X3JlbG9jIChvYmZkLCBvc2VjdGlvbiwKLQkJICAgICAocmVsY291bnQgPT0gMCA/IChhcmVsZW50ICoqKSBOVUxMIDogcmVscHApLCByZWxjb3VudCk7Ci0gICAgfQotICAKLSAgaXNlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlzZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGlzZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpYmZkLCBpc2VjdGlvbikgJiBTRUNfSEFTX0NPTlRFTlRTKQotICAgIHsKLSAgICAgIFBUUiBtZW1odW5rID0gKFBUUikgeG1hbGxvYyAoKHVuc2lnbmVkKSBzaXplKTsKLQotICAgICAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGliZmQsIGlzZWN0aW9uLCBtZW1odW5rLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICBzaXplKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAgICAgaWYgKGNvcHlfYnl0ZSA+PSAwKSAKLQlmaWx0ZXJfYnl0ZXMgKG1lbWh1bmssICZzaXplKTsKLQotICAgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIG9zZWN0aW9uLCBtZW1odW5rLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICBzaXplKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICAgICAgZnJlZSAobWVtaHVuayk7Ci0gICAgfQotICBlbHNlIGlmIChwICE9IE5VTEwgJiYgcC0+c2V0X2ZsYWdzICYmIChwLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0gICAgewotICAgICAgUFRSIG1lbWh1bmsgPSAoUFRSKSB4bWFsbG9jICgodW5zaWduZWQpIHNpemUpOwotCi0gICAgICAvKiBXZSBkb24ndCBwZXJtaXQgdGhlIHVzZXIgdG8gdHVybiBvZmYgdGhlIFNFQ19IQVNfQ09OVEVOVFMKLQkgZmxhZy0tdGhleSBjYW4ganVzdCByZW1vdmUgdGhlIHNlY3Rpb24gZW50aXJlbHkgYW5kIGFkZCBpdAotCSBiYWNrIGFnYWluLiAgSG93ZXZlciwgd2UgZG8gcGVybWl0IHRoZW0gdG8gdHVybiBvbiB0aGUKLQkgU0VDX0hBU19DT05URU5UUyBmbGFnLCBhbmQgdGFrZSBpdCB0byBtZWFuIHRoYXQgdGhlIHNlY3Rpb24KLQkgY29udGVudHMgc2hvdWxkIGJlIHplcm9lZCBvdXQuICAqLwotCi0gICAgICBtZW1zZXQgKG1lbWh1bmssIDAsIHNpemUpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIHNpemUpKQotCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotICAgICAgZnJlZSAobWVtaHVuayk7Ci0gICAgfQotfQotCi0vKiBHZXQgYWxsIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgdXNlZCB3aGVuIC0tZ2FwLWZpbGwgb3IgLS1wYWQtdG8gaXMKLSAgIHVzZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2V0X3NlY3Rpb25zIChvYmZkLCBvc2VjdGlvbiwgc2VjcHBwYXJnKQotICAgICBiZmQgKm9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKm9zZWN0aW9uOwotICAgICBQVFIgc2VjcHBwYXJnOwotewotICBhc2VjdGlvbiAqKipzZWNwcHAgPSAoYXNlY3Rpb24gKioqKSBzZWNwcHBhcmc7Ci0KLSAgKipzZWNwcHAgPSBvc2VjdGlvbjsKLSAgKysoKnNlY3BwcCk7Ci19Ci0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgVk1BLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHFzb3J0LCBhbmQgaXMgdXNlZCB3aGVuCi0gICAtLWdhcC1maWxsIG9yIC0tcGFkLXRvIGlzIHVzZWQuICBXZSBmb3JjZSBub24gbG9hZGFibGUgb3IgZW1wdHkKLSAgIHNlY3Rpb25zIHRvIHRoZSBmcm9udCwgd2hlcmUgdGhleSBhcmUgZWFzaWVyIHRvIGlnbm9yZS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc2VjdGlvbl9sbWEgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKipzZWMxID0gKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqKnNlYzIgPSAoY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0gIGZsYWd3b3JkIGZsYWdzMSwgZmxhZ3MyOwotCi0gIC8qIFNvcnQgbm9uIGxvYWRhYmxlIHNlY3Rpb25zIHRvIHRoZSBmcm9udC4gICovCi0gIGZsYWdzMSA9ICgqc2VjMSktPmZsYWdzOwotICBmbGFnczIgPSAoKnNlYzIpLT5mbGFnczsKLSAgaWYgKChmbGFnczEgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0gICAgICB8fCAoZmxhZ3MxICYgU0VDX0xPQUQpID09IDApCi0gICAgewotICAgICAgaWYgKChmbGFnczIgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JICAmJiAoZmxhZ3MyICYgU0VDX0xPQUQpICE9IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoZmxhZ3MyICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgKGZsYWdzMiAmIFNFQ19MT0FEKSA9PSAwKQotCXJldHVybiAxOwotICAgIH0KLQotICAvKiBTb3J0IHNlY3Rpb25zIGJ5IExNQS4gICovCi0gIGlmICgoKnNlYzEpLT5sbWEgPiAoKnNlYzIpLT5sbWEpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKCgqc2VjMSktPmxtYSA8ICgqc2VjMiktPmxtYSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogU29ydCBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIExNQSBieSBzaXplLiAgKi8KLSAgaWYgKCgqc2VjMSktPl9yYXdfc2l6ZSA+ICgqc2VjMiktPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoKCpzZWMxKS0+X3Jhd19zaXplIDwgKCpzZWMyKS0+X3Jhd19zaXplKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogTWFyayBhbGwgdGhlIHN5bWJvbHMgd2hpY2ggd2lsbCBiZSB1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyB3aXRoCi0gICB0aGUgQlNGX0tFRVAgZmxhZyBzbyB0aGF0IHRob3NlIHN5bWJvbHMgd2lsbCBub3QgYmUgc3RyaXBwZWQuCi0KLSAgIElnbm9yZSByZWxvY2F0aW9ucyB3aGljaCB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zIChpYmZkLCBpc2VjdGlvbiwgc3ltYm9sc2FyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgc3ltYm9sc2FyZzsKLXsKLSAgYXN5bWJvbCAqKnN5bWJvbHMgPSAoYXN5bWJvbCAqKikgc3ltYm9sc2FyZzsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQsIGk7Ci0KLSAgLyogSWdub3JlIGFuIGlucHV0IHNlY3Rpb24gd2l0aCBubyBjb3JyZXNwb25kaW5nIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgaWYgKGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocmVsc2l6ZSA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaWJmZCwgaXNlY3Rpb24sIHJlbHBwLCBzeW1ib2xzKTsKLSAgaWYgKHJlbGNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAvKiBFeGFtaW5lIGVhY2ggc3ltYm9sIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgSWYgaXQncyBub3Qgb25lIG9mIHRoZQotICAgICBzcGVjaWFsIGJmZCBzZWN0aW9uIHN5bWJvbHMsIHRoZW4gbWFyayBpdCB3aXRoIEJTRl9LRUVQLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHJlbGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKCpyZWxwcFtpXS0+c3ltX3B0cl9wdHIgIT0gYmZkX2NvbV9zZWN0aW9uX3B0ci0+c3ltYm9sCi0JICAmJiAqcmVscHBbaV0tPnN5bV9wdHJfcHRyICE9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbAotCSAgJiYgKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciAhPSBiZmRfdW5kX3NlY3Rpb25fcHRyLT5zeW1ib2wpCi0JKCpyZWxwcFtpXS0+c3ltX3B0cl9wdHIpLT5mbGFncyB8PSBCU0ZfS0VFUDsKLSAgICB9Ci0KLSAgaWYgKHJlbHBwICE9IE5VTEwpCi0gICAgZnJlZSAocmVscHApOwotfQotCi0vKiBXcml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXdyaXRlX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlLCBzeW1jb3VudHAsIHN5bXBwcCkKLSAgICAgYmZkICpvYmZkOwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgbG9uZyAqc3ltY291bnRwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKioqc3ltcHBwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpID09IGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyKQotICAgIHJldHVybiB3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlKTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpzeW1zLCAqc3RyaW5nczsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltc2l6ZSwgc3RyaW5nc2l6ZTsKLSAgICAgIGFzZWN0aW9uICpzdGFic2VjLCAqc3RhYnN0cnNlYzsKLQotICAgICAgaWYgKCEgd3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8gKG9iZmQsIGRoYW5kbGUsICZzeW1zLAotCQkJCQkJICAgICZzeW1zaXplLCAmc3RyaW5ncywKLQkJCQkJCSAgICAmc3RyaW5nc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzdGFic2VjID0gYmZkX21ha2Vfc2VjdGlvbiAob2JmZCwgIi5zdGFiIik7Ci0gICAgICBzdGFic3Ryc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAob2JmZCwgIi5zdGFic3RyIik7Ci0gICAgICBpZiAoc3RhYnNlYyA9PSBOVUxMCi0JICB8fCBzdGFic3Ryc2VjID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIHN0YWJzZWMsIHN5bXNpemUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBzdGFic3Ryc2VjLCBzdHJpbmdzaXplKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvYmZkLCBzdGFic2VjLCAyKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvYmZkLCBzdGFic3Ryc2VjLCAwKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIHN0YWJzZWMsCi0JCQkJICAgKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkgICAgfCBTRUNfREVCVUdHSU5HKSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBzdGFic3Ryc2VjLAotCQkJCSAgICAgIChTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJICAgICAgIHwgU0VDX0RFQlVHR0lORykpKQotCXsKLQkgIG5vbl9mYXRhbCAoXygiJXM6IGNhbid0IGNyZWF0ZSBkZWJ1Z2dpbmcgc2VjdGlvbjogJXMiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aCBzZXR0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzIG5vdyBiZWNhdXNlCi0gICAgICAgICB0aGUgbmV4dCB0aGluZyB0aGUgY2FsbGVyIGlzIGdvaW5nIHRvIGRvIGlzIGNvcHkgb3ZlciB0aGUKLSAgICAgICAgIHJlYWwgc2VjdGlvbnMuICBXZSBtYXkgc29tZWRheSBoYXZlIHRvIHNwbGl0IHRoZSBjb250ZW50cwotICAgICAgICAgc2V0dGluZyBvdXQgb2YgdGhpcyBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIHN0YWJzZWMsIHN5bXMsIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBzeW1zaXplKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIHN0YWJzdHJzZWMsIHN0cmluZ3MsCi0JCQkJCSAoZmlsZV9wdHIpIDAsIHN0cmluZ3NpemUpKQotCXsKLQkgIG5vbl9mYXRhbCAoXygiJXM6IGNhbid0IHNldCBkZWJ1Z2dpbmcgc2VjdGlvbiBjb250ZW50czogJXMiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbm9uX2ZhdGFsIChfKCIlczogZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciAlcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIGJmZF9nZXRfdGFyZ2V0IChvYmZkKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotc3RyaXBfbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgY2hhciAqaW5wdXRfdGFyZ2V0ID0gTlVMTCwgKm91dHB1dF90YXJnZXQgPSBOVUxMOwotICBib29sZWFuIHNob3dfdmVyc2lvbiA9IGZhbHNlOwotICBpbnQgYywgaTsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLSAgY2hhciAqb3V0cHV0X2ZpbGUgPSBOVUxMOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiSTpPOkY6SzpOOlI6bzpzU3BneFhWdiIsCi0JCQkgICBzdHJpcF9vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdJJzoKLQkgIGlucHV0X3RhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCSAgb3V0cHV0X3RhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgaW5wdXRfdGFyZ2V0ID0gb3V0cHV0X3RhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChvcHRhcmcsIHRydWUpOwotCSAgcC0+cmVtb3ZlID0gdHJ1ZTsKLQkgIHNlY3Rpb25zX3JlbW92ZWQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JY2FzZSAnZyc6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfREVCVUc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVFJJUF9VTk5FRURFRDoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTk5FRURFRDsKLQkgIGJyZWFrOwotCWNhc2UgJ0snOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAma2VlcF9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAmc3RyaXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdvJzoKLQkgIG91dHB1dF9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAncCc6Ci0JICBwcmVzZXJ2ZV9kYXRlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX0FMTDsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfU1RBUlRfTDsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgdmVyYm9zZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHNob3dfdmVyc2lvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDA6Ci0JICBicmVhazsJCS8qIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBsb25nIG9wdGlvbiAqLwotCWNhc2UgJ2gnOgotCSAgc3RyaXBfdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JZGVmYXVsdDoKLQkgIHN0cmlwX3VzYWdlIChzdGRlcnIsIDEpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgic3RyaXAiKTsKLQotICAvKiBEZWZhdWx0IGlzIHRvIHN0cmlwIGFsbCBzeW1ib2xzLiAgKi8KLSAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ERUYKLSAgICAgICYmIGRpc2NhcmRfbG9jYWxzID09IExPQ0FMU19VTkRFRgotICAgICAgJiYgc3RyaXBfc3BlY2lmaWNfbGlzdCA9PSBOVUxMKQotICAgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9BTEw7Ci0KLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKLSAgICBvdXRwdXRfdGFyZ2V0ID0gaW5wdXRfdGFyZ2V0OwotCi0gIGkgPSBvcHRpbmQ7Ci0gIGlmIChpID09IGFyZ2MKLSAgICAgIHx8IChvdXRwdXRfZmlsZSAhPSBOVUxMICYmIChpICsgMSkgPCBhcmdjKSkKLSAgICBzdHJpcF91c2FnZSAoc3RkZXJyLCAxKTsKLQotICBmb3IgKDsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgaG9sZF9zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICAgICAgY2hhciAqdG1wbmFtZTsKLQotICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQotCXsKLQkgIGlmIChzdGF0IChhcmd2W2ldLCAmc3RhdGJ1ZikgPCAwKQotCSAgICB7Ci0JICAgICAgbm9uX2ZhdGFsIChfKCIlczogY2Fubm90IHN0YXQ6ICVzIiksIGFyZ3ZbaV0sIHN0cmVycm9yIChlcnJubykpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAob3V0cHV0X2ZpbGUgIT0gTlVMTCkKLQl0bXBuYW1lID0gb3V0cHV0X2ZpbGU7Ci0gICAgICBlbHNlCi0JdG1wbmFtZSA9IG1ha2VfdGVtcG5hbWUgKGFyZ3ZbaV0pOwotICAgICAgc3RhdHVzID0gMDsKLQotICAgICAgY29weV9maWxlIChhcmd2W2ldLCB0bXBuYW1lLCBpbnB1dF90YXJnZXQsIG91dHB1dF90YXJnZXQpOwotICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCXsKLQkgIGlmIChwcmVzZXJ2ZV9kYXRlcykKLQkgICAgc2V0X3RpbWVzICh0bXBuYW1lLCAmc3RhdGJ1Zik7Ci0JICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKLQkgICAgc21hcnRfcmVuYW1lICh0bXBuYW1lLCBhcmd2W2ldLCBwcmVzZXJ2ZV9kYXRlcyk7Ci0JICBzdGF0dXMgPSBob2xkX3N0YXR1czsKLQl9Ci0gICAgICBlbHNlCi0JdW5saW5rICh0bXBuYW1lKTsKLSAgICAgIGlmIChvdXRwdXRfZmlsZSA9PSBOVUxMKQotCWZyZWUgKHRtcG5hbWUpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY29weV9tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotICBjaGFyICppbnB1dF9maWxlbmFtZSA9IE5VTEwsICpvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotICBjaGFyICppbnB1dF90YXJnZXQgPSBOVUxMLCAqb3V0cHV0X3RhcmdldCA9IE5VTEw7Ci0gIGJvb2xlYW4gc2hvd192ZXJzaW9uID0gZmFsc2U7Ci0gIGJvb2xlYW4gY2hhbmdlX3dhcm4gPSB0cnVlOwotICBpbnQgYzsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImI6aTpJOmo6SzpOOnM6TzpkOkY6TDpSOlNwZ3hYVnZXOiIsCi0JCQkgICBjb3B5X29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ2InOgotCSAgY29weV9ieXRlID0gYXRvaSAob3B0YXJnKTsKLQkgIGlmIChjb3B5X2J5dGUgPCAwKQotCSAgICBmYXRhbCAoXygiYnl0ZSBudW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmUiKSk7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIGludGVybGVhdmUgPSBhdG9pIChvcHRhcmcpOwotCSAgaWYgKGludGVybGVhdmUgPCAxKQotCSAgICBmYXRhbCAoXygiaW50ZXJsZWF2ZSBtdXN0IGJlIHBvc2l0aXZlIikpOwotCSAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JY2FzZSAncyc6CQkvKiAic291cmNlIiAtICdJJyBpcyBwcmVmZXJyZWQgKi8KLQkgIGlucHV0X3RhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCWNhc2UgJ2QnOgkJLyogImRlc3RpbmF0aW9uIiAtICdPJyBpcyBwcmVmZXJyZWQgKi8KLQkgIG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIGlucHV0X3RhcmdldCA9IG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdqJzoKLQkgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAob3B0YXJnLCB0cnVlKTsKLQkgIGlmIChwLT5yZW1vdmUpCi0JICAgIGZhdGFsIChfKCIlcyBib3RoIGNvcGllZCBhbmQgcmVtb3ZlZCIpLCBvcHRhcmcpOwotCSAgcC0+Y29weSA9IHRydWU7Ci0JICBzZWN0aW9uc19jb3BpZWQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0JICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG9wdGFyZywgdHJ1ZSk7Ci0JICBpZiAocC0+Y29weSkKLQkgICAgZmF0YWwgKF8oIiVzIGJvdGggY29waWVkIGFuZCByZW1vdmVkIiksIG9wdGFyZyk7Ci0JICBwLT5yZW1vdmUgPSB0cnVlOwotCSAgc2VjdGlvbnNfcmVtb3ZlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9BTEw7Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9ERUJVRzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NUUklQX1VOTkVFREVEOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX1VOTkVFREVEOwotCSAgYnJlYWs7Ci0JY2FzZSAnSyc6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZrZWVwX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTic6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZzdHJpcF9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ0wnOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAmbG9jYWxpemVfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdXJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJndlYWtlbl9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgcHJlc2VydmVfZGF0ZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19BTEw7Ci0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX1NUQVJUX0w7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV0VBS0VOOgotCSAgd2Vha2VuID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0FERF9TRUNUSU9OOgotCSAgewotCSAgICBjb25zdCBjaGFyICpzOwotCSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLQkgICAgc3RydWN0IHNlY3Rpb25fYWRkICpwYTsKLQkgICAgaW50IGxlbjsKLQkgICAgY2hhciAqbmFtZTsKLQkgICAgRklMRSAqZjsKLQotCSAgICBzID0gc3RyY2hyIChvcHRhcmcsICc9Jyk7Ci0JICAgIAotCSAgICBpZiAocyA9PSBOVUxMKQotCSAgICAgIGZhdGFsIChfKCJiYWQgZm9ybWF0IGZvciAtLWFkZC1zZWN0aW9uIE5BTUU9RklMRU5BTUUiKSk7Ci0KLQkgICAgaWYgKHN0YXQgKHMgKyAxLCAmIHN0KSA8IDApCi0JICAgICAgZmF0YWwgKF8oImNhbm5vdCBzdGF0OiAlczogJXMiKSwgcyArIDEsIHN0cmVycm9yIChlcnJubykpOwotCi0JICAgIHBhID0gKHN0cnVjdCBzZWN0aW9uX2FkZCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX2FkZCkpOwotCi0JICAgIGxlbiA9IHMgLSBvcHRhcmc7Ci0JICAgIG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgICAgc3RybmNweSAobmFtZSwgb3B0YXJnLCBsZW4pOwotCSAgICBuYW1lW2xlbl0gPSAnXDAnOwotCSAgICBwYS0+bmFtZSA9IG5hbWU7Ci0KLQkgICAgcGEtPmZpbGVuYW1lID0gcyArIDE7Ci0KLQkgICAgcGEtPnNpemUgPSBzdC5zdF9zaXplOwotCi0JICAgIHBhLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChwYS0+c2l6ZSk7Ci0JICAgIGYgPSBmb3BlbiAocGEtPmZpbGVuYW1lLCBGT1BFTl9SQik7Ci0JICAgIAotCSAgICBpZiAoZiA9PSBOVUxMKQotCSAgICAgIGZhdGFsIChfKCJjYW5ub3Qgb3BlbjogJXM6ICVzIiksIHBhLT5maWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICAgIAotCSAgICBpZiAoZnJlYWQgKHBhLT5jb250ZW50cywgMSwgcGEtPnNpemUsIGYpID09IDAKLQkJfHwgZmVycm9yIChmKSkKLQkgICAgICBmYXRhbCAoXygiJXM6IGZyZWFkIGZhaWxlZCIpLCBwYS0+ZmlsZW5hbWUpOwotCi0JICAgIGZjbG9zZSAoZik7Ci0KLQkgICAgcGEtPm5leHQgPSBhZGRfc2VjdGlvbnM7Ci0JICAgIGFkZF9zZWN0aW9ucyA9IHBhOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1NUQVJUOgotCSAgY2hhbmdlX3N0YXJ0ID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLWNoYW5nZS1zdGFydCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUzoKLQljYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUE6Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BOgotCSAgewotCSAgICBjb25zdCBjaGFyICpzOwotCSAgICBpbnQgbGVuOwotCSAgICBjaGFyICpuYW1lOwotCSAgICBjaGFyICpvcHRpb24gPSBOVUxMOwotCSAgICBiZmRfdm1hIHZhbDsKLQkgICAgZW51bSBjaGFuZ2VfYWN0aW9uIHdoYXQgPSBDSEFOR0VfSUdOT1JFOwotCSAgICAKLQkgICAgc3dpdGNoIChjKQotCSAgICAgIHsKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTOgotCQlvcHRpb24gPSAiLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BOgotCQlvcHRpb24gPSAiLS1jaGFuZ2Utc2VjdGlvbi1sbWEiOwotCQlicmVhazsKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUE6Ci0JCW9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLXZtYSI7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgCi0JICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJz0nKTsKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXMgPSBzdHJjaHIgKG9wdGFyZywgJysnKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzID0gc3RyY2hyIChvcHRhcmcsICctJyk7Ci0JCSAgICBpZiAocyA9PSBOVUxMKQotCQkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgJXMiKSwgb3B0aW9uKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGxlbiA9IHMgLSBvcHRhcmc7Ci0JICAgIG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgICAgc3RybmNweSAobmFtZSwgb3B0YXJnLCBsZW4pOwotCSAgICBuYW1lW2xlbl0gPSAnXDAnOwotCi0JICAgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAobmFtZSwgdHJ1ZSk7Ci0KLQkgICAgdmFsID0gcGFyc2Vfdm1hIChzICsgMSwgb3B0aW9uKTsKLQotCSAgICBzd2l0Y2ggKCpzKQotCSAgICAgIHsKLQkgICAgICBjYXNlICc9Jzogd2hhdCA9IENIQU5HRV9TRVQ7IGJyZWFrOwotCSAgICAgIGNhc2UgJy0nOiB2YWwgID0gLSB2YWw7IC8qIERyb3AgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnKyc6IHdoYXQgPSBDSEFOR0VfTU9ESUZZOyBicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICBzd2l0Y2ggKGMpCi0JICAgICAgewotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6Ci0JCXAtPmNoYW5nZV92bWEgPSB3aGF0OwotCQlwLT52bWFfdmFsICAgID0gdmFsOwotCQkvKiBEcm9wIHRocm91Z2guICAqLwotCQkKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUE6Ci0JCXAtPmNoYW5nZV9sbWEgPSB3aGF0OwotCQlwLT5sbWFfdmFsICAgID0gdmFsOwotCQlicmVhazsKLQkJCi0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BOgotCQlwLT5jaGFuZ2Vfdm1hID0gd2hhdDsKLQkJcC0+dm1hX3ZhbCAgICA9IHZhbDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX0FERFJFU1NFUzoKLQkgIGNoYW5nZV9zZWN0aW9uX2FkZHJlc3MgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tY2hhbmdlLWFkZHJlc3NlcyIpOwotCSAgY2hhbmdlX3N0YXJ0ID0gY2hhbmdlX3NlY3Rpb25fYWRkcmVzczsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9XQVJOSU5HUzoKLQkgIGNoYW5nZV93YXJuID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVI6Ci0JICBjaGFuZ2VfbGVhZGluZ19jaGFyID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RFQlVHR0lORzoKLQkgIGNvbnZlcnRfZGVidWdnaW5nID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0dBUF9GSUxMOgotCSAgewotCSAgICBiZmRfdm1hIGdhcF9maWxsX3ZtYTsKLQotCSAgICBnYXBfZmlsbF92bWEgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tZ2FwLWZpbGwiKTsKLQkgICAgZ2FwX2ZpbGwgPSAoYmZkX2J5dGUpIGdhcF9maWxsX3ZtYTsKLQkgICAgaWYgKChiZmRfdm1hKSBnYXBfZmlsbCAhPSBnYXBfZmlsbF92bWEpCi0JICAgICAgewotCQljaGFyIGJ1ZmZbMjBdOwotCQkKLQkJc3ByaW50Zl92bWEgKGJ1ZmYsIGdhcF9maWxsX3ZtYSk7Ci0JCQotCQlub25fZmF0YWwgKF8oIldhcm5pbmc6IHRydW5jYXRpbmcgZ2FwLWZpbGwgZnJvbSAweCVzIHRvIDB4JXgiKSwKLQkJCSAgIGJ1ZmYsIGdhcF9maWxsKTsKLQkgICAgICB9Ci0JICAgIGdhcF9maWxsX3NldCA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1M6Ci0JICBjaGFuZ2Vfd2FybiA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fUEFEX1RPOgotCSAgcGFkX3RvID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLXBhZC10byIpOwotCSAgcGFkX3RvX3NldCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSOgotCSAgcmVtb3ZlX2xlYWRpbmdfY2hhciA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TRVRfU0VDVElPTl9GTEFHUzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgaW50IGxlbjsKLQkgICAgY2hhciAqbmFtZTsKLQotCSAgICBzID0gc3RyY2hyIChvcHRhcmcsICc9Jyk7Ci0JICAgIGlmIChzID09IE5VTEwpCi0JICAgICAgZmF0YWwgKF8oImJhZCBmb3JtYXQgZm9yIC0tc2V0LXNlY3Rpb24tZmxhZ3MiKSk7Ci0KLQkgICAgbGVuID0gcyAtIG9wdGFyZzsKLQkgICAgbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotCSAgICBzdHJuY3B5IChuYW1lLCBvcHRhcmcsIGxlbik7Ci0JICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0KLQkgICAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChuYW1lLCB0cnVlKTsKLQotCSAgICBwLT5zZXRfZmxhZ3MgPSB0cnVlOwotCSAgICBwLT5mbGFncyA9IHBhcnNlX2ZsYWdzIChzICsgMSk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TRVRfU1RBUlQ6Ci0JICBzZXRfc3RhcnQgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tc2V0LXN0YXJ0Iik7Ci0JICBzZXRfc3RhcnRfc2V0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnaCc6Ci0JICBjb3B5X3VzYWdlIChzdGRvdXQsIDApOwotCWRlZmF1bHQ6Ci0JICBjb3B5X3VzYWdlIChzdGRlcnIsIDEpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgib2JqY29weSIpOwotCi0gIGlmIChjb3B5X2J5dGUgPj0gaW50ZXJsZWF2ZSkKLSAgICBmYXRhbCAoXygiYnl0ZSBudW1iZXIgbXVzdCBiZSBsZXNzIHRoYW4gaW50ZXJsZWF2ZSIpKTsKLQotICBpZiAob3B0aW5kID09IGFyZ2MgfHwgb3B0aW5kICsgMiA8IGFyZ2MpCi0gICAgY29weV91c2FnZSAoc3RkZXJyLCAxKTsKLQotICBpbnB1dF9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgaWYgKG9wdGluZCArIDEgPCBhcmdjKQotICAgIG91dHB1dF9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kICsgMV07Ci0KLSAgLyogRGVmYXVsdCBpcyB0byBzdHJpcCBubyBzeW1ib2xzLiAgKi8KLSAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ERUYgJiYgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX1VOREVGKQotICAgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9OT05FOwotCi0gIGlmIChvdXRwdXRfdGFyZ2V0ID09IChjaGFyICopIE5VTEwpCi0gICAgb3V0cHV0X3RhcmdldCA9IGlucHV0X3RhcmdldDsKLQotICBpZiAocHJlc2VydmVfZGF0ZXMpCi0gICAgewotICAgICAgaWYgKHN0YXQgKGlucHV0X2ZpbGVuYW1lLCAmc3RhdGJ1ZikgPCAwKQotCWZhdGFsIChfKCJDYW5ub3Qgc3RhdDogJXM6ICVzIiksIGlucHV0X2ZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgbm8gZGVzdGluYXRpb24gZmlsZSB0aGVuIGNyZWF0ZSBhIHRlbXAgYW5kIHJlbmFtZQotICAgICB0aGUgcmVzdWx0IGludG8gdGhlIGlucHV0LiAgKi8KLQotICBpZiAob3V0cHV0X2ZpbGVuYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciAqdG1wbmFtZSA9IG1ha2VfdGVtcG5hbWUgKGlucHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9maWxlIChpbnB1dF9maWxlbmFtZSwgdG1wbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQl7CQotCSAgaWYgKHByZXNlcnZlX2RhdGVzKQotCSAgICBzZXRfdGltZXMgKHRtcG5hbWUsICZzdGF0YnVmKTsKLQkgIHNtYXJ0X3JlbmFtZSAodG1wbmFtZSwgaW5wdXRfZmlsZW5hbWUsIHByZXNlcnZlX2RhdGVzKTsKLQl9Ci0gICAgICBlbHNlCi0JdW5saW5rICh0bXBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb3B5X2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCBvdXRwdXRfZmlsZW5hbWUsIGlucHV0X3RhcmdldCwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAoc3RhdHVzID09IDAgJiYgcHJlc2VydmVfZGF0ZXMpCi0Jc2V0X3RpbWVzIChvdXRwdXRfZmlsZW5hbWUsICZzdGF0YnVmKTsKLSAgICB9Ci0KLSAgaWYgKGNoYW5nZV93YXJuKQotICAgIHsKLSAgICAgIGZvciAocCA9IGNoYW5nZV9zZWN0aW9uczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAoISBwLT51c2VkKQotCSAgICB7Ci0JICAgICAgaWYgKHAtPmNoYW5nZV92bWEgIT0gQ0hBTkdFX0lHTk9SRSkKLQkJewotCQkgIGNoYXIgYnVmZiBbMjBdOwotCi0JCSAgc3ByaW50Zl92bWEgKGJ1ZmYsIHAtPnZtYV92YWwpOwotCQkgIAotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgbm9uX2ZhdGFsIChfKCJXYXJuaW5nOiAtLWNoYW5nZS1zZWN0aW9uLXZtYSAlcyVjMHglcyBuZXZlciB1c2VkIiksCi0JCQkgICAgIHAtPm5hbWUsCi0JCQkgICAgIHAtPmNoYW5nZV92bWEgPT0gQ0hBTkdFX1NFVCA/ICc9JyA6ICcrJywKLQkJCSAgICAgYnVmZik7Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAocC0+Y2hhbmdlX2xtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQl7Ci0JCSAgY2hhciBidWZmIFsyMF07Ci0KLQkJICBzcHJpbnRmX3ZtYSAoYnVmZiwgcC0+bG1hX3ZhbCk7Ci0JCSAgCi0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBub25fZmF0YWwgKF8oIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tbG1hICVzJWMweCVzIG5ldmVyIHVzZWQiKSwKLQkJCSAgICAgcC0+bmFtZSwKLQkJCSAgICAgcC0+Y2hhbmdlX2xtYSA9PSBDSEFOR0VfU0VUID8gJz0nIDogJysnLAotCQkJICAgICBidWZmKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfVU5ERUY7Ci0gIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX1VOREVGOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIGlmIChpc19zdHJpcCA8IDApCi0gICAgewotICAgICAgaW50IGkgPSBzdHJsZW4gKHByb2dyYW1fbmFtZSk7Ci0gICAgICBpc19zdHJpcCA9IChpID49IDUgJiYgc3RyY21wIChwcm9ncmFtX25hbWUgKyBpIC0gNSwgInN0cmlwIikgPT0gMCk7Ci0gICAgfQotCi0gIGlmIChpc19zdHJpcCkKLSAgICBzdHJpcF9tYWluIChhcmdjLCBhcmd2KTsKLSAgZWxzZQotICAgIGNvcHlfbWFpbiAoYXJnYywgYXJndik7Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpkdW1wLjEgYi9iaW51dGlscy9vYmpkdW1wLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzE1M2UuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvb2JqZHVtcC4xCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBvYmpkdW1wIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLW9iamR1bXAgXC0gZGlzcGxheSBpbmZvcm1hdGlvbiBmcm9tIG9iamVjdCBmaWxlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG9iamR1bXAKLS5SQiAiW1x8IiBcLWEgfCBcLVwtYXJjaGl2ZVwtaGVhZGVycyAiXHxdIiAKLS5SQiAiW1x8IiAiXC1iXCAiXGMKLS5JIGJmZG5hbWVcYwotLlJCICIgfCAiICJcLVwtdGFyZ2V0PSJcYwotLkkgYmZkbmFtZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLUMgfCBcLVwtZGVtYW5nbGUgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWRlYnVnZ2luZyAiXHxdIiAKLS5SQiAiW1x8IiBcLWQgfCBcLVwtZGlzYXNzZW1ibGUgIlx8XSIgCi0uUkIgIltcfCIgXC1EIHwgXC1cLWRpc2Fzc2VtYmxlLWFsbCAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGlzYXNzZW1ibGVcLXplcm9lcyAiXHxdIiAKLS5SQiAiW1x8IiBcLUVCIHwgXC1FTCB8IFwtXC1lbmRpYW49XGMKLS5JIHtiaWd8bGl0dGxlfVxjCi1cJlx8XQotLlJCICJbXHwiIFwtZiB8IFwtXC1maWxlXC1oZWFkZXJzICJcfF0iCi0uUkIgIltcfCIgXC1oIHwgXC1cLXNlY3Rpb25cLWhlYWRlcnMKLS5SQiAifCAiIFwtXC1oZWFkZXJzICJcfF0iIAotLlJCICJbXHwiIFwtaSB8IFwtXC1pbmZvICJcfF0iIAotLlJCICJbXHwiICJcLWpcICJcYwotLkkgc2VjdGlvblxjCi0uUkIgIiB8ICIgIlwtXC1zZWN0aW9uPSJcYwotLkkgc2VjdGlvblxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLWwgfCBcLVwtbGluZVwtbnVtYmVycyAiXHxdIgotLlJCICJbXHwiICJcLW1cICJcYwotLkkgbWFjaGluZVxjCi0uUkIgIiB8ICIgIlwtXC1hcmNoaXRlY3R1cmU9IlxjCi0uSSBtYWNoaW5lXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtcCB8IFwtXC1wcml2YXRlXC1oZWFkZXJzICJcfF0iIAotLlJCICJbXHwiIFwtXC1wcmVmaXhcLWFkZHJlc3NlcyAiXHxdIiAKLS5SQiAiW1x8IiBcLXIgfCBcLVwtcmVsb2MgIlx8XSIgCi0uUkIgIltcfCIgXC1SIHwgXC1cLWR5bmFtaWNcLXJlbG9jICJcfF0iIAotLlJCICJbXHwiIFwtcyB8IFwtXC1mdWxsXC1jb250ZW50cyAiXHxdIgotLlJCICJbXHwiIFwtUyB8IFwtXC1zb3VyY2UgIlx8XSIKLS5SQiAiW1x8IiBcLVwtW25vXC1dc2hvd1wtcmF3XC1pbnNuICJcfF0iIAotLlJCICJbXHwiIFwtXC1zdGFicyAiXHxdIgotLlJCICJbXHwiIFwtdCB8IFwtXC1zeW1zICJcfF0iIAotLlJCICJbXHwiIFwtVCB8IFwtXC1keW5hbWljXC1zeW1zICJcfF0iIAotLlJCICJbXHwiIFwteCB8IFwtXC1hbGxcLWhlYWRlcnMgIlx8XSIKLS5SQiAiW1x8IiAiXC1cLXN0YXJ0XC1hZGRyZXNzPSJcYwotLkkgYWRkcmVzc1xjCi1cJlx8XQotLlJCICJbXHwiICJcLVwtc3RvcFwtYWRkcmVzcz0iXGMKLS5JIGFkZHJlc3NcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1cLWFkanVzdFwtdm1hPSJcYwotLkkgb2Zmc2V0XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIgotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1cYwotLkIgb2JqZHVtcFxjCi1cJiBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBvYmplY3QgZmlsZXMuCi1UaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LiAgVGhpcwotaW5mb3JtYXRpb24gaXMgbW9zdGx5IHVzZWZ1bCB0byBwcm9ncmFtbWVycyB3aG8gYXJlIHdvcmtpbmcgb24gdGhlCi1jb21waWxhdGlvbiB0b29scywgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWVycyB3aG8ganVzdCB3YW50IHRoZWlyCi1wcm9ncmFtIHRvIGNvbXBpbGUgYW5kIHdvcmsuCi0uUFAKLS5JUiAgIm9iamZpbGUiIC5cfC5cfC4KLWFyZSB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlIGV4YW1pbmVkLiAgV2hlbiB5b3Ugc3BlY2lmeSBhcmNoaXZlcywKLVxjCi0uQiBvYmpkdW1wXGMKLVwmIHNob3dzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIG1lbWJlciBvYmplY3QgZmlsZXMuCi0KLS5TSCBPUFRJT05TCi1XaGVyZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBhbiBvcHRpb24gYXJlIHNob3duIHRvZ2V0aGVyLCB0aGV5IGFyZQotZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcwotLkIgXC1sCi0oXGZCXC1cLWxpbmVcLW51bWJlcnNcZlApIG11c3QgYmUgZ2l2ZW4uCi0KLS5UUAotLkIgXC1hCi0uVFAKLS5CIFwtXC1hcmNoaXZlXC1oZWFkZXJzCi1JZiBhbnkgZmlsZXMgZnJvbSBcYwotLkkgb2JqZmlsZVxjCi1cJiBhcmUgYXJjaGl2ZXMsIGRpc3BsYXkgdGhlIGFyY2hpdmUKLWhlYWRlciBpbmZvcm1hdGlvbiAoaW4gYSBmb3JtYXQgc2ltaWxhciB0byBgXHxcYwotLkIgbHMgXC1sXGMKLVx8JykuICBCZXNpZGVzIHRoZQotaW5mb3JtYXRpb24geW91IGNvdWxkIGxpc3Qgd2l0aCBgXHxcYwotLkIgYXIgdHZcYwotXHwnLCBgXHxcYwotLkIgb2JqZHVtcCBcLWFcYwotXHwnIHNob3dzCi10aGUgb2JqZWN0IGZpbGUgZm9ybWF0IG9mIGVhY2ggYXJjaGl2ZSBtZW1iZXIuCi0KLS5UUAotLkJJICJcLVwtYWRqdXN0XC12bWE9IiAib2Zmc2V0IgotV2hlbiBkdW1waW5nIGluZm9ybWF0aW9uLCBmaXJzdCBhZGQKLS5JIG9mZnNldAotdG8gYWxsIHRoZSBzZWN0aW9uIGFkZHJlc3Nlcy4gIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBzZWN0aW9uIGFkZHJlc3NlcwotZG8gbm90IGNvcnJlc3BvbmQgdG8gdGhlIHN5bWJvbCB0YWJsZSwgd2hpY2ggY2FuIGhhcHBlbiB3aGVuIHB1dHRpbmcKLXNlY3Rpb25zIGF0IHBhcnRpY3VsYXIgYWRkcmVzc2VzIHdoZW4gdXNpbmcgYSBmb3JtYXQgd2hpY2ggY2FuIG5vdAotcmVwcmVzZW50IHNlY3Rpb24gYWRkcmVzc2VzLCBzdWNoIGFzIGEub3V0LgotCi0uVFAKLS5CSSAiXC1iICIgImJmZG5hbWUiXGMKLS5UUAotLkJJICJcLVwtdGFyZ2V0PSIgImJmZG5hbWUiCi1TcGVjaWZ5IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUKLVxjCi0uSSBiZmRuYW1lXGMKLVwmLiAgVGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeTsgXGMKLS5JIG9iamR1bXBcYwotXCYgY2FuCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuICBGb3IgZXhhbXBsZSwKLS5zcAotLmJyCi1vYmpkdW1wXCBcLWJcIG9hc3lzXCBcLW1cIHZheFwgXC1oXCBmdS5vCi0uYnIKLS5zcAotZGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycyAoYFx8XGMKLS5CIFwtaFxjCi1cfCcpIG9mCi1gXHxcYwotLkIgZnUub1xjCi1cfCcsIHdoaWNoIGlzIGV4cGxpY2l0bHkgaWRlbnRpZmllZCAoYFx8XGMKLS5CIFwtbVxjCi1cfCcpIGFzIGEgVmF4IG9iamVjdAotZmlsZSBpbiB0aGUgZm9ybWF0IHByb2R1Y2VkIGJ5IE9hc3lzIGNvbXBpbGVycy4gIFlvdSBjYW4gbGlzdCB0aGUKLWZvcm1hdHMgYXZhaWxhYmxlIHdpdGggdGhlIGBcfFxjCi0uQiBcLWlcYwotXHwnIG9wdGlvbi4KLQotLlRQCi0uQiBcLUMKLS5UUAotLkIgXC1cLWRlbWFuZ2xlCi1EZWNvZGUgKFxmSWRlbWFuZ2xlXGZQKSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLgotCi0uVFAKLS5CIFwtXC1kZWJ1Z2dpbmcKLURpc3BsYXkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBhdHRlbXB0cyB0byBwYXJzZSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgZmlsZSBhbmQgcHJpbnQgaXQgb3V0IHVzaW5nIGEgQyBsaWtlIHN5bnRheC4KLU9ubHkgY2VydGFpbiB0eXBlcyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotCi0uVFAKLS5CIFwtZAotLlRQCi0uQiBcLVwtZGlzYXNzZW1ibGUKLURpc3BsYXkgdGhlIGFzc2VtYmxlciBtbmVtb25pY3MgZm9yIHRoZSBtYWNoaW5lCi1pbnN0cnVjdGlvbnMgZnJvbSBcYwotLkkgb2JqZmlsZVxjCi1cJi4KLVRoaXMgb3B0aW9uIG9ubHkgZGlzYXNzZW1ibGVzIHRob3NlIHNlY3Rpb25zIHdoaWNoIGFyZQotZXhwZWN0ZWQgdG8gY29udGFpbiBpbnN0cnVjdGlvbnMuCi0KLS5UUAotLkIgXC1ECi0uVFAKLS5CIFwtXC1kaXNhc3NlbWJsZS1hbGwKLUxpa2UgXGZCXC1kXGZQLCBidXQgZGlzYXNzZW1ibGUgdGhlIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9ucywgbm90IGp1c3QKLXRob3NlIGV4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgotCi0uVFAKLS5CIFwtXC1wcmVmaXhcLWFkZHJlc3NlcwotV2hlbiBkaXNhc3NlbWJsaW5nLCBwcmludCB0aGUgY29tcGxldGUgYWRkcmVzcyBvbiBlYWNoIGxpbmUuICBUaGlzIGlzCi10aGUgb2xkZXIgZGlzYXNzZW1ibHkgZm9ybWF0LgotCi0uVFAKLS5CIFwtXC1kaXNhc3NlbWJsZVwtemVyb2VzCi1Ob3JtYWxseSB0aGUgZGlzYXNzZW1ibHkgb3V0cHV0IHdpbGwgc2tpcCBibG9ja3Mgb2YgemVyb2VzLiAgVGhpcwotb3B0aW9uIGRpcmVjdHMgdGhlIGRpc2Fzc2VtYmxlciB0byBkaXNhc3NlbWJsZSB0aG9zZSBibG9ja3MsIGp1c3QgbGlrZQotYW55IG90aGVyIGRhdGEuCi0KLS5UUAotLkIgXC1FQgotLlRQCi0uQiBcLUVMCi0uVFAKLS5CSSAiXC1cLWVuZGlhbj0iICJ7YmlnfGxpdHRsZX0iCi1TcGVjaWZ5IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvYmplY3QgZmlsZXMuICBUaGlzIG9ubHkgYWZmZWN0cwotZGlzYXNzZW1ibHkuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkaXNhc3NlbWJsaW5nIGEgZmlsZSBmb3JtYXQgd2hpY2gKLWRvZXMgbm90IGRlc2NyaWJlIGVuZGlhbm5lc3MgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtZmlsZVwtaGVhZGVycwotRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIG92ZXJhbGwgaGVhZGVyIG9mCi1lYWNoIGZpbGUgaW4gXGMKLS5JIG9iamZpbGVcYwotXCYuCi0KLS5UUAotLkIgXC1oCi0uVFAKLS5CIFwtXC1zZWN0aW9uXC1oZWFkZXJzCi0uVFAKLS5CIFwtXC1oZWFkZXJzCi1EaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzIG9mIHRoZQotb2JqZWN0IGZpbGUuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgb2JqZHVtcAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC1pCi0uVFAKLS5CIFwtXC1pbmZvCi1EaXNwbGF5IGEgbGlzdCBzaG93aW5nIGFsbCBhcmNoaXRlY3R1cmVzIGFuZCBvYmplY3QgZm9ybWF0cyBhdmFpbGFibGUKLWZvciBzcGVjaWZpY2F0aW9uIHdpdGggXGMKLS5CIFwtYlxjCi1cJiBvciBcYwotLkIgXC1tXGMKLVwmLgotCi0uVFAKLS5CSSAiXC1qICIgIm5hbWUiXGMKLS5UUAotLkJJICJcLVwtc2VjdGlvbj0iICJuYW1lIgotRGlzcGxheSBpbmZvcm1hdGlvbiBvbmx5IGZvciBzZWN0aW9uIFxjCi0uSSBuYW1lXGMKLVwmLgotCi0uVFAKLS5CIFwtbAotLlRQCi0uQiBcLVwtbGluZVwtbnVtYmVycwotTGFiZWwgdGhlIGRpc3BsYXkgKHVzaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbikgd2l0aCB0aGUgZmlsZW5hbWUKLWFuZCBzb3VyY2UgbGluZSBudW1iZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCBjb2RlIHNob3duLgotT25seSB1c2VmdWwgd2l0aCBcZkJcLWRcZlAsIFxmQlwtRFxmUCwgb3IgXGZCXC1yXGZQLgotCi0uVFAKLS5CSSAiXC1tICIgIm1hY2hpbmUiXGMKLS5UUAotLkJJICJcLVwtYXJjaGl0ZWN0dXJlPSIgIm1hY2hpbmUiCi1TcGVjaWZ5IHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMuICBUaGlzCi1jYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgd2hpY2ggZG8gbm90IGRlc2NyaWJlCi1hcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgXGZCXC1pXGZQIG9wdGlvbi4gCi0KLS5UUAotLkIgXC1wCi0uVFAKLS5CIFwtXC1wcml2YXRlXC1oZWFkZXJzCi1QcmludCBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUKLWV4YWN0IGluZm9ybWF0aW9uIHByaW50ZWQgZGVwZW5kcyB1cG9uIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBGb3IKLXNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLgotCi0uVFAKLS5CIFwtcgotLlRQCi0uQiBcLVwtcmVsb2MKLVByaW50IHRoZSByZWxvY2F0aW9uIGVudHJpZXMgb2YgdGhlIGZpbGUuICBJZiB1c2VkIHdpdGggXGZCXC1kXGZQIG9yCi1cZkJcLURcZlAsIHRoZSByZWxvY2F0aW9ucyBhcmUgcHJpbnRlZCBpbnRlcnNwZXJzZWQgd2l0aCB0aGUKLWRpc2Fzc2VtYmx5LgotCi0uVFAKLS5CIFwtUgotLlRQCi0uQiBcLVwtZHluYW1pY1wtcmVsb2MKLVByaW50IHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIFRoaXMgaXMgb25seQotbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1mdWxsXC1jb250ZW50cwotRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbnkgc2VjdGlvbnMgcmVxdWVzdGVkLgotCi0uVFAKLS5CIFwtUwotLlRQCi0uQiBcLVwtc291cmNlCi1EaXNwbGF5IHNvdXJjZSBjb2RlIGludGVybWl4ZWQgd2l0aCBkaXNhc3NlbWJseSwgaWYgcG9zc2libGUuICBJbXBsaWVzCi1cZkItZFxmUC4KLQotLlRQCi0uQiBcLVwtc2hvd1wtcmF3XC1pbnNuCi1XaGVuIGRpc2Fzc2VtYmxpbmcgaW5zdHJ1Y3Rpb25zLCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gaW4gaGV4IGFzIHdlbGwgYXMKLWluIHN5bWJvbGljIGZvcm0uICBUaGlzIGlzIHRoZSBkZWZhdWx0IGV4Y2VwdCB3aGVuCi0uQiBcLVwtcHJlZml4XC1hZGRyZXNzZXMKLWlzIHVzZWQuCi0KLS5UUAotLkIgXC1cLW5vXC1zaG93XC1yYXdcLWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIGRvIG5vdCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IHdoZW4KLS5CIFwtXC1wcmVmaXhcLWFkZHJlc3NlcwotaXMgdXNlZC4KLQotLlRQCi0uQiBcLVwtc3RhYnMKLURpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSAuc3RhYiwgLnN0YWIuaW5kZXgsIGFuZCAuc3RhYi5leGNsCi1zZWN0aW9ucyBmcm9tIGFuIEVMRiBmaWxlLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBvbiBzeXN0ZW1zIChzdWNoIGFzCi1Tb2xhcmlzIDIuMCkgaW4gd2hpY2ggLnN0YWIgZGVidWdnaW5nIHN5bWJvbC10YWJsZSBlbnRyaWVzIGFyZSBjYXJyaWVkCi1pbiBhbiBFTEYgc2VjdGlvbi4gIEluIG1vc3Qgb3RoZXIgZmlsZSBmb3JtYXRzLCBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlCi1lbnRyaWVzIGFyZSBpbnRlcmxlYXZlZCB3aXRoIGxpbmthZ2Ugc3ltYm9scywgYW5kIGFyZSB2aXNpYmxlIGluIHRoZQotLkIgXC1cLXN5bXMKLW91dHB1dC4KLQotLlRQCi0uQkkgIlwtXC1zdGFydFwtYWRkcmVzcz0iICJhZGRyZXNzIgotU3RhcnQgZGlzcGxheWluZyBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoaXMgYWZmZWN0cyB0aGUgb3V0cHV0Ci1vZiB0aGUKLS5CIFwtZFxjCi0sCi0uQiBcLXIKLWFuZAotLkIgXC1zCi1vcHRpb25zLgotCi0uVFAKLS5CSSAiXC1cLXN0b3BcLWFkZHJlc3M9IiAiYWRkcmVzcyIKLVN0b3AgZGlzcGxheWluZyBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoaXMgYWZmZWN0cyB0aGUgb3V0cHV0Ci1vZiB0aGUKLS5CIFwtZFxjCi0sCi0uQiBcLXIKLWFuZAotLkIgXC1zCi1vcHRpb25zLgotCi0uVFAKLS5CIFwtdAotLlRQCi0uQiBcLVwtc3ltcwotU3ltYm9sIFRhYmxlLiAgUHJpbnQgdGhlIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZSBmaWxlLgotVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgYFx8XGMKLS5CIG5tXGMKLVx8JyBwcm9ncmFtLgotCi0uVFAKLS5CIFwtVAotLlRQCi0uQiBcLVwtZHluYW1pY1wtc3ltcwotRHluYW1pYyBTeW1ib2wgVGFibGUuICBQcmludCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcyBvZiB0aGUKLWZpbGUuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4KLXR5cGVzIG9mIHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uCi1wcm92aWRlZCBieSB0aGUgYFx8XGMKLS5CIG5tXGMKLVx8JyBwcm9ncmFtIHdoZW4gZ2l2ZW4gdGhlCi0uQiBcLUQgKFwtXC1keW5hbWljKQotb3B0aW9uLgotCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKLS5CIG9iamR1bXAKLWFuZCBleGl0LgotCi0uVFAKLS5CIFwteAotLlRQCi0uQiBcLVwtYWxsXC1oZWFkZXJzCi1EaXNwbGF5IGFsbCBhdmFpbGFibGUgaGVhZGVyIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB0YWJsZSBhbmQKLXJlbG9jYXRpb24gZW50cmllcy4gIFVzaW5nIGBcfFxjCi0uQiBcLXhcYwotXHwnIGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhbGwgb2YKLWBcfFxjCi0uQiBcLWEgXC1mIFwtaCBcLXIgXC10XGMKLVx8Jy4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSk7IAotLkJSIG5tICIoIiAxICIpLiIKLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamR1bXAuYyBiL2JpbnV0aWxzL29iamR1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjOTJlNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTY3ICswLDAgQEAKLS8qIG9iamR1bXAuYyAtLSBkdW1wIGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdCBmaWxlLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgInByb2dyZXNzLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLS8qIEludGVybmFsIGhlYWRlcnMgZm9yIHRoZSBFTEYgLnN0YWItZHVtcCBjb2RlIC0gc29ycnkuICAqLwotI2RlZmluZQlCWVRFU19JTl9XT1JECTMyCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlBSSU5URgotLyogVGhpcyBpcyBuZWVkZWQgYnkgSU5JVF9ESVNBU1NFTUJMRV9JTkZPLiAgKi8KLWV4dGVybiBpbnQgZnByaW50ZiBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0jZW5kaWYKLQotLyogRXhpdCBzdGF0dXMuICAqLwotc3RhdGljIGludCBleGl0X3N0YXR1cyA9IDA7Ci0KLXN0YXRpYyBjaGFyICpkZWZhdWx0X3RhcmdldCA9IE5VTEw7CS8qIGRlZmF1bHQgYXQgcnVudGltZSAqLwotCi1zdGF0aWMgaW50IHNob3dfdmVyc2lvbiA9IDA7CQkvKiBzaG93IHRoZSB2ZXJzaW9uIG51bWJlciAqLwotc3RhdGljIGludCBkdW1wX3NlY3Rpb25fY29udGVudHM7CS8qIC1zICovCi1zdGF0aWMgaW50IGR1bXBfc2VjdGlvbl9oZWFkZXJzOwkvKiAtaCAqLwotc3RhdGljIGJvb2xlYW4gZHVtcF9maWxlX2hlYWRlcjsJLyogLWYgKi8KLXN0YXRpYyBpbnQgZHVtcF9zeW10YWI7CQkJLyogLXQgKi8KLXN0YXRpYyBpbnQgZHVtcF9keW5hbWljX3N5bXRhYjsJCS8qIC1UICovCi1zdGF0aWMgaW50IGR1bXBfcmVsb2NfaW5mbzsJCS8qIC1yICovCi1zdGF0aWMgaW50IGR1bXBfZHluYW1pY19yZWxvY19pbmZvOwkvKiAtUiAqLwotc3RhdGljIGludCBkdW1wX2FyX2hkcnM7CQkvKiAtYSAqLwotc3RhdGljIGludCBkdW1wX3ByaXZhdGVfaGVhZGVyczsJLyogLXAgKi8KLXN0YXRpYyBpbnQgcHJlZml4X2FkZHJlc3NlczsJCS8qIC0tcHJlZml4LWFkZHJlc3NlcyAqLwotc3RhdGljIGludCB3aXRoX2xpbmVfbnVtYmVyczsJCS8qIC1sICovCi1zdGF0aWMgYm9vbGVhbiB3aXRoX3NvdXJjZV9jb2RlOwkvKiAtUyAqLwotc3RhdGljIGludCBzaG93X3Jhd19pbnNuOwkJLyogLS1zaG93LXJhdy1pbnNuICovCi1zdGF0aWMgaW50IGR1bXBfc3RhYl9zZWN0aW9uX2luZm87CS8qIC0tc3RhYnMgKi8KLXN0YXRpYyBpbnQgZG9fZGVtYW5nbGU7CQkJLyogLUMsIC0tZGVtYW5nbGUgKi8KLXN0YXRpYyBib29sZWFuIGRpc2Fzc2VtYmxlOwkJLyogLWQgKi8KLXN0YXRpYyBib29sZWFuIGRpc2Fzc2VtYmxlX2FsbDsJCS8qIC1EICovCi1zdGF0aWMgaW50IGRpc2Fzc2VtYmxlX3plcm9lczsJCS8qIC0tZGlzYXNzZW1ibGUtemVyb2VzICovCi1zdGF0aWMgYm9vbGVhbiBmb3JtYXRzX2luZm87CQkvKiAtaSAqLwotc3RhdGljIGNoYXIgKm9ubHk7CQkJLyogLWogc2VjbmFtZSAqLwotc3RhdGljIGludCB3aWRlX291dHB1dDsJCQkvKiAtdyAqLwotc3RhdGljIGJmZF92bWEgc3RhcnRfYWRkcmVzcyA9IChiZmRfdm1hKSAtMTsgLyogLS1zdGFydC1hZGRyZXNzICovCi1zdGF0aWMgYmZkX3ZtYSBzdG9wX2FkZHJlc3MgPSAoYmZkX3ZtYSkgLTE7ICAvKiAtLXN0b3AtYWRkcmVzcyAqLwotc3RhdGljIGludCBkdW1wX2RlYnVnZ2luZzsJCS8qIC0tZGVidWdnaW5nICovCi1zdGF0aWMgYmZkX3ZtYSBhZGp1c3Rfc2VjdGlvbl92bWEgPSAwOwkvKiAtLWFkanVzdC12bWEgKi8KLQotLyogRXh0cmEgaW5mbyB0byBwYXNzIHRvIHRoZSBkaXNhc3NlbWJsZXIgYWRkcmVzcyBwcmludGluZyBmdW5jdGlvbi4gICovCi1zdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyB7Ci0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYm9vbGVhbiByZXF1aXJlX3NlYzsKLX07Ci0KLS8qIEFyY2hpdGVjdHVyZSB0byBkaXNhc3NlbWJsZSBmb3IsIG9yIGRlZmF1bHQgaWYgTlVMTC4gICovCi1zdGF0aWMgY2hhciAqbWFjaGluZSA9IChjaGFyICopIE5VTEw7Ci0KLS8qIFRhcmdldCBzcGVjaWZpYyBvcHRpb25zIHRvIHRoZSBkaXNhc3NlbWJsZXIuICAqLwotc3RhdGljIGNoYXIgKmRpc2Fzc2VtYmxlcl9vcHRpb25zID0gKGNoYXIgKikgTlVMTDsKLQotLyogRW5kaWFubmVzcyB0byBkaXNhc3NlbWJsZSBmb3IsIG9yIGRlZmF1bHQgaWYgQkZEX0VORElBTl9VTktOT1dOLiAgKi8KLXN0YXRpYyBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOOwotCi0vKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqc3ltczsKLQotLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN5bXMnLiAgKi8KLXN0YXRpYyBsb25nIHN5bWNvdW50ID0gMDsKLQotLyogVGhlIHNvcnRlZCBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIGFzeW1ib2wgKipzb3J0ZWRfc3ltczsKLQotLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYHNvcnRlZF9zeW1zJy4gICovCi1zdGF0aWMgbG9uZyBzb3J0ZWRfc3ltY291bnQgPSAwOwotCi0vKiBUaGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIGFzeW1ib2wgKipkeW5zeW1zOwotCi0vKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBgZHluc3ltcycuICAqLwotc3RhdGljIGxvbmcgZHluc3ltY291bnQgPSAwOwotCi0vKiBTdGF0aWMgZGVjbGFyYXRpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1ub25mYXRhbCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgY2hhciAqdGFyZ2V0KSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25faGVhZGVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9kYXRhIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY3MgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2R5bmFtaWNfcmVsb2NzIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfcmVsb2Nfc2V0IFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBsb25nKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N5bWJvbHMgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGR5bmFtaWMpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfYmZkX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYmZkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV90YXJnZXRfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2luZm9fdGFibGUgUEFSQU1TICgoaW50LCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X3RhYmxlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2luZm8gUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF92YWx1ZSBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3N5bW5hbWUgUEFSQU1TICgoYmZkICosIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGFzeW1ib2wgKikpOwotCi1zdGF0aWMgYXN5bWJvbCAqCi1maW5kX3N5bWJvbF9mb3JfYWRkcmVzcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbiwgbG9uZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiwgYmZkX3ZtYSwKLQkJCQkgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkciBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHJlc3MgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZAotc2hvd19saW5lIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9ieXRlcyBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBkaXNhc3NlbWJsZXJfZnR5cGUsCi0JCQkgICBib29sZWFuLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLCBiZmRfdm1hLAotCQkJICAgYXJlbGVudCAqKiosIGFyZWxlbnQgKiopKTsKLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX2RhdGEgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZW5kaWFuX3N0cmluZyBQQVJBTVMgKChlbnVtIGJmZF9lbmRpYW4pKTsKLQotc3RhdGljIGFzeW1ib2wgKioKLXNsdXJwX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGxvbmcKLXJlbW92ZV91c2VsZXNzX3N5bWJvbHMgUEFSQU1TICgoYXN5bWJvbCAqKiwgbG9uZykpOwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3N5bWJvbHMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotY29tcGFyZV9yZWxvY3MgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc3RhYnMgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc2VjdGlvbl9zdGFicyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3NlY3Rpb25fc3RhYnMgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0MCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiVXNhZ2U6ICVzIDxzd2l0Y2hlcz4gZmlsZShzKVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHN3aXRjaGVzIG11c3QgYmUgZ2l2ZW46XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtYSAgLS1hcmNoaXZlLWhlYWRlcnMgICAgRGlzcGxheSBhcmNoaXZlIGhlYWRlciBpbmZvcm1hdGlvblxuXAotICAtZiAgLS1maWxlLWhlYWRlcnMgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIG92ZXJhbGwgZmlsZSBoZWFkZXJcblwKLSAgLXAgIC0tcHJpdmF0ZS1oZWFkZXJzICAgIERpc3BsYXkgb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBmaWxlIGhlYWRlciBjb250ZW50c1xuXAotICAtaCAgLS1bc2VjdGlvbi1daGVhZGVycyAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gaGVhZGVyc1xuXAotICAteCAgLS1hbGwtaGVhZGVycyAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgYWxsIGhlYWRlcnNcblwKLSAgLWQgIC0tZGlzYXNzZW1ibGUgICAgICAgIERpc3BsYXkgYXNzZW1ibGVyIGNvbnRlbnRzIG9mIGV4ZWN1dGFibGUgc2VjdGlvbnNcblwKLSAgLUQgIC0tZGlzYXNzZW1ibGUtYWxsICAgIERpc3BsYXkgYXNzZW1ibGVyIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9uc1xuXAotICAtUyAgLS1zb3VyY2UgICAgICAgICAgICAgSW50ZXJtaXggc291cmNlIGNvZGUgd2l0aCBkaXNhc3NlbWJseVxuXAotICAtcyAgLS1mdWxsLWNvbnRlbnRzICAgICAgRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMgcmVxdWVzdGVkXG5cCi0gIC1nICAtLWRlYnVnZ2luZyAgICAgICAgICBEaXNwbGF5IGRlYnVnIGluZm9ybWF0aW9uIGluIG9iamVjdCBmaWxlXG5cCi0gIC1HICAtLXN0YWJzICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBTVEFCUyBjb250ZW50cyBvZiBhbiBFTEYgZm9ybWF0IGZpbGVcblwKLSAgLXQgIC0tc3ltcyAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1ib2wgdGFibGUocylcblwKLSAgLVQgIC0tZHluYW1pYy1zeW1zICAgICAgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZVxuXAotICAtciAgLS1yZWxvYyAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGluIHRoZSBmaWxlXG5cCi0gIC1SICAtLWR5bmFtaWMtcmVsb2MgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBpbiB0aGUgZmlsZVxuXAotICAtViAgLS12ZXJzaW9uICAgICAgICAgICAgRGlzcGxheSB0aGlzIHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlclxuXAotICAtaSAgLS1pbmZvICAgICAgICAgICAgICAgTGlzdCBvYmplY3QgZm9ybWF0cyBhbmQgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWRcblwKLSAgLUggIC0taGVscCAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvblxuXAotIikpOwotICBpZiAoc3RhdHVzICE9IDIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbiBUaGUgZm9sbG93aW5nIHN3aXRjaGVzIGFyZSBvcHRpb25hbDpcbiIpKTsKLSAgICAgIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtYiAgLS10YXJnZXQgPGJmZG5hbWU+ICAgICAgICAgU3BlY2lmeSB0aGUgdGFyZ2V0IG9iamVjdCBmb3JtYXQgYXMgPGJmZG5hbWU+XG5cCi0gIC1tICAtLWFyY2hpdGVjdHVyZSA8bWFjaGluZT4gICBTcGVjaWZ5IHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGFzIDxtYWNoaW5lPlxuXAotICAtaiAgLS1zZWN0aW9uIDxuYW1lPiAgICAgICAgICAgT25seSBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBzZWN0aW9uIDxuYW1lPlxuXAotICAtTSAgLS1kaXNhc3NlbWJsZXItb3B0aW9ucyA8bz4gUGFzcyB0ZXh0IDxvPiBvbiB0byB0aGUgZGlzYXNzZW1ibGVyXG5cCi0gIC1FQiAtLWVuZGlhbj1iaWcgICAgICAgICAgICAgICBBc3N1bWUgYmlnIGVuZGlhbiBmb3JtYXQgd2hlbiBkaXNhc3NlbWJsaW5nXG5cCi0gIC1FTCAtLWVuZGlhbj1saXR0bGUgICAgICAgICAgICBBc3N1bWUgbGl0dGxlIGVuZGlhbiBmb3JtYXQgd2hlbiBkaXNhc3NlbWJsaW5nXG5cCi0gIC1sICAtLWxpbmUtbnVtYmVycyAgICAgICAgICAgICBJbmNsdWRlIGxpbmUgbnVtYmVycyBhbmQgZmlsZW5hbWVzIGluIG91dHB1dFxuXAotICAtQyAgLS1kZW1hbmdsZSAgICAgICAgICAgICAgICAgRGVjb2RlIG1hbmdsZWQvcHJvY2Vzc2VkIHN5bWJvbCBuYW1lc1xuXAotICAtdyAgLS13aWRlICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IG91dHB1dCBmb3IgbW9yZSB0aGFuIDgwIGNvbHVtbnNcblwKLSAgLXogIC0tZGlzYXNzZW1ibGUtemVyb2VzICAgICAgIERvIG5vdCBza2lwIGJsb2NrcyBvZiB6ZXJvZXMgd2hlbiBkaXNhc3NlbWJsaW5nXG5cCi0gICAgICAtLXN0YXJ0LWFkZHJlc3MgPGFkZHI+ICAgICBPbmx5IHByb2Nlc3MgZGF0YSB3aG9lcyBhZGRyZXNzIGlzID49IDxhZGRyPlxuXAotICAgICAgLS1zdG9wLWFkZHJlc3MgPGFkZHI+ICAgICAgT25seSBwcm9jZXNzIGRhdGEgd2hvZXMgYWRkcmVzcyBpcyA8PSA8YWRkcj5cblwKLSAgICAgIC0tcHJlZml4LWFkZHJlc3NlcyAgICAgICAgIFByaW50IGNvbXBsZXRlIGFkZHJlc3MgYWxvbmdzaWRlIGRpc2Fzc2VtYmx5XG5cCi0gICAgICAtLVtuby1dc2hvdy1yYXctaW5zbiAgICAgICBEaXNwbGF5IGhleCBhbG9uZ3NpZGUgc3ltYm9saWMgZGlzYXNzZW1ibHlcblwKLSAgICAgIC0tYWRqdXN0LXZtYSA8b2Zmc2V0PiAgICAgIEFkZCA8b2Zmc2V0PiB0byBhbGwgZGlzcGxheWVkIHNlY3Rpb24gYWRkcmVzc2VzXG5cCi1cbiIpKTsKLSAgICAgIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgICB9Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0vKiAxNTAgaXNuJ3Qgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0VORElBTiAoMTUwKQotI2RlZmluZSBPUFRJT05fU1RBUlRfQUREUkVTUyAoT1BUSU9OX0VORElBTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TVE9QX0FERFJFU1MgKE9QVElPTl9TVEFSVF9BRERSRVNTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FESlVTVF9WTUEgKE9QVElPTl9TVE9QX0FERFJFU1MgKyAxKQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXT0KLXsKLSAgeyJhZGp1c3Qtdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BREpVU1RfVk1BfSwKLSAgeyJhbGwtaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAneCd9LAotICB7InByaXZhdGUtaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncCd9LAotICB7ImFyY2hpdGVjdHVyZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAotICB7ImFyY2hpdmUtaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7ImRlYnVnZ2luZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZyd9LAotICB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdDJ30sCi0gIHsiZGlzYXNzZW1ibGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ2QnfSwKLSAgeyJkaXNhc3NlbWJsZS1hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ0QnfSwKLSAgeyJkaXNhc3NlbWJsZXItb3B0aW9ucyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnTSd9LAotICB7ImRpc2Fzc2VtYmxlLXplcm9lcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAneid9LAotICB7ImR5bmFtaWMtcmVsb2MiLCBub19hcmd1bWVudCwgTlVMTCwgJ1InfSwKLSAgeyJkeW5hbWljLXN5bXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgeyJlbmRpYW4iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VORElBTn0sCi0gIHsiZmlsZS1oZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gIHsiZnVsbC1jb250ZW50cyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncyd9LAotICB7ImhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdIJ30sCi0gIHsiaW5mbyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaSd9LAotICB7ImxpbmUtbnVtYmVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAotICB7Im5vLXNob3ctcmF3LWluc24iLCBub19hcmd1bWVudCwgJnNob3dfcmF3X2luc24sIC0xfSwKLSAgeyJwcmVmaXgtYWRkcmVzc2VzIiwgbm9fYXJndW1lbnQsICZwcmVmaXhfYWRkcmVzc2VzLCAxfSwKLSAgeyJyZWxvYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAotICB7InNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2onfSwKLSAgeyJzZWN0aW9uLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJzaG93LXJhdy1pbnNuIiwgbm9fYXJndW1lbnQsICZzaG93X3Jhd19pbnNuLCAxfSwKLSAgeyJzb3VyY2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ1MnfSwKLSAgeyJzdGFicyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnRyd9LAotICB7InN0YXJ0LWFkZHJlc3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQVJUX0FERFJFU1N9LAotICB7InN0b3AtYWRkcmVzcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RPUF9BRERSRVNTfSwKLSAgeyJzeW1zIiwgbm9fYXJndW1lbnQsIE5VTEwsICd0J30sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdiJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAotICB7IndpZGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ3cnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQwKLXN0YXRpYyB2b2lkCi1ub25mYXRhbCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGJmZF9ub25mYXRhbCAobXNnKTsKLSAgZXhpdF9zdGF0dXMgPSAxOwotfQotDAotc3RhdGljIHZvaWQKLWR1bXBfc2VjdGlvbl9oZWFkZXIgKGFiZmQsIHNlY3Rpb24sIGlnbm9yZWQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGlnbm9yZWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqY29tbWEgPSAiIjsKLQotICBwcmludGYgKCIlM2QgJS0xM3MgJTA4bHggICIsIHNlY3Rpb24tPmluZGV4LAotCSAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLAotCSAgKHVuc2lnbmVkIGxvbmcpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgcHJpbnRmX3ZtYSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbikpOwotICBwcmludGYgKCIgICIpOwotICBwcmludGZfdm1hIChzZWN0aW9uLT5sbWEpOwotICBwcmludGYgKCIgICUwOGx4ICAyKioldSIsIHNlY3Rpb24tPmZpbGVwb3MsCi0JICBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWN0aW9uKSk7Ci0gIGlmICghIHdpZGVfb3V0cHV0KQotICAgIHByaW50ZiAoIlxuICAgICAgICAgICAgICAgICIpOwotICBwcmludGYgKCIgICIpOwotCi0jZGVmaW5lIFBGKHgsIHkpIFwKLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgeCkgeyBwcmludGYgKCIlcyVzIiwgY29tbWEsIHkpOyBjb21tYSA9ICIsICI7IH0KLQotICBQRiAoU0VDX0hBU19DT05URU5UUywgIkNPTlRFTlRTIik7Ci0gIFBGIChTRUNfQUxMT0MsICJBTExPQyIpOwotICBQRiAoU0VDX0NPTlNUUlVDVE9SLCAiQ09OU1RSVUNUT1IiKTsKLSAgUEYgKFNFQ19DT05TVFJVQ1RPUl9URVhULCAiQ09OU1RSVUNUT1IgVEVYVCIpOwotICBQRiAoU0VDX0NPTlNUUlVDVE9SX0RBVEEsICJDT05TVFJVQ1RPUiBEQVRBIik7Ci0gIFBGIChTRUNfQ09OU1RSVUNUT1JfQlNTLCAiQ09OU1RSVUNUT1IgQlNTIik7Ci0gIFBGIChTRUNfTE9BRCwgIkxPQUQiKTsKLSAgUEYgKFNFQ19SRUxPQywgIlJFTE9DIik7Ci0jaWZkZWYgU0VDX0JBTElHTgotICBQRiAoU0VDX0JBTElHTiwgIkJBTElHTiIpOwotI2VuZGlmCi0gIFBGIChTRUNfUkVBRE9OTFksICJSRUFET05MWSIpOwotICBQRiAoU0VDX0NPREUsICJDT0RFIik7Ci0gIFBGIChTRUNfREFUQSwgIkRBVEEiKTsKLSAgUEYgKFNFQ19ST00sICJST00iKTsKLSAgUEYgKFNFQ19ERUJVR0dJTkcsICJERUJVR0dJTkciKTsKLSAgUEYgKFNFQ19ORVZFUl9MT0FELCAiTkVWRVJfTE9BRCIpOwotICBQRiAoU0VDX0VYQ0xVREUsICJFWENMVURFIik7Ci0gIFBGIChTRUNfU09SVF9FTlRSSUVTLCAiU09SVF9FTlRSSUVTIik7Ci0gIFBGIChTRUNfU01BTExfREFUQSwgIlNNQUxMX0RBVEEiKTsKLSAgUEYgKFNFQ19TSEFSRUQsICJTSEFSRUQiKTsKLQotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpsczsKLQotICAgICAgc3dpdGNoIChzZWN0aW9uLT5mbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDoKLQkgIGxzID0gIkxJTktfT05DRV9ESVNDQVJEIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKLQkgIGxzID0gIkxJTktfT05DRV9PTkVfT05MWSI7Ci0JICBicmVhazsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCSAgbHMgPSAiTElOS19PTkNFX1NBTUVfU0laRSI7Ci0JICBicmVhazsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKLQkgIGxzID0gIkxJTktfT05DRV9TQU1FX0NPTlRFTlRTIjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIiVzJXMiLCBjb21tYSwgbHMpOwotCi0gICAgICBpZiAoc2VjdGlvbi0+Y29tZGF0ICE9IE5VTEwpCi0JcHJpbnRmICgiIChDT01EQVQgJXMgJWxkKSIsIHNlY3Rpb24tPmNvbWRhdC0+bmFtZSwKLQkJc2VjdGlvbi0+Y29tZGF0LT5zeW1ib2wpOwotCi0gICAgICBjb21tYSA9ICIsICI7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0jdW5kZWYgUEYKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBwcmludGYgKF8oIlNlY3Rpb25zOlxuIikpOwotCi0jaWZuZGVmIEJGRDY0Ci0gIHByaW50ZiAoXygiSWR4IE5hbWUgICAgICAgICAgU2l6ZSAgICAgIFZNQSAgICAgICBMTUEgICAgICAgRmlsZSBvZmYgIEFsZ24iKSk7Ci0jZWxzZQotICBwcmludGYgKF8oIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgICAgICAgICBMTUEgICAgICAgICAgICAgICBGaWxlIG9mZiAgQWxnbiIpKTsKLSNlbmRpZgotCi0gIGlmICh3aWRlX291dHB1dCkKLSAgICBwcmludGYgKF8oIiAgRmxhZ3MiKSk7Ci0gIHByaW50ZiAoIlxuIik7Ci0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBkdW1wX3NlY3Rpb25faGVhZGVyLCAoUFRSKSBOVUxMKTsKLX0KLQwKLXN0YXRpYyBhc3ltYm9sICoqCi1zbHVycF9zeW10YWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqKnN5ID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0gIGxvbmcgc3RvcmFnZTsKLQotICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBzeW1jb3VudCA9IDA7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGlmIChzdG9yYWdlKQotICAgIHsKLSAgICAgIHN5ID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2UpOwotICAgIH0KLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3kpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICByZXR1cm4gc3k7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoqCi1zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICoqc3kgPSAoYXN5bWJvbCAqKikgTlVMTDsKLSAgbG9uZyBzdG9yYWdlOwotCi0gIHN0b3JhZ2UgPSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIHsKLSAgICAgIGlmICghKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogbm90IGEgZHluYW1pYyBvYmplY3RcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGR5bnN5bWNvdW50ID0gMDsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotCi0gIGlmIChzdG9yYWdlKQotICAgIHsKLSAgICAgIHN5ID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2UpOwotICAgIH0KLSAgZHluc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIChhYmZkLCBzeSk7Ci0gIGlmIChkeW5zeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIGlmIChkeW5zeW1jb3VudCA9PSAwKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBObyBkeW5hbWljIHN5bWJvbHNcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIHJldHVybiBzeTsKLX0KLQotLyogRmlsdGVyIG91dCAoaW4gcGxhY2UpIHN5bWJvbHMgdGhhdCBhcmUgdXNlbGVzcyBmb3IgZGlzYXNzZW1ibHkuCi0gICBDT1VOVCBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIFNZTUJPTFMuCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiB1c2VmdWwgc3ltYm9scy4gKi8KLQotc3RhdGljIGxvbmcKLXJlbW92ZV91c2VsZXNzX3N5bWJvbHMgKHN5bWJvbHMsIGNvdW50KQotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgbG9uZyBjb3VudDsKLXsKLSAgcmVnaXN0ZXIgYXN5bWJvbCAqKmluX3B0ciA9IHN5bWJvbHMsICoqb3V0X3B0ciA9IHN5bWJvbHM7Ci0KLSAgd2hpbGUgKC0tY291bnQgPj0gMCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW0gPSAqaW5fcHRyKys7Ci0KLSAgICAgIGlmIChzeW0tPm5hbWUgPT0gTlVMTCB8fCBzeW0tPm5hbWVbMF0gPT0gJ1wwJykKLQljb250aW51ZTsKLSAgICAgIGlmIChzeW0tPmZsYWdzICYgKEJTRl9ERUJVR0dJTkcpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCWNvbnRpbnVlOwotCi0gICAgICAqb3V0X3B0cisrID0gc3ltOwotICAgIH0KLSAgcmV0dXJuIG91dF9wdHIgLSBzeW1ib2xzOwotfQotCi0vKiBTb3J0IHN5bWJvbHMgaW50byB2YWx1ZSBvcmRlci4gICovCi0KLXN0YXRpYyBpbnQgCi1jb21wYXJlX3N5bWJvbHMgKGFwLCBicCkKLSAgICAgY29uc3QgUFRSIGFwOwotICAgICBjb25zdCBQVFIgYnA7Ci17Ci0gIGNvbnN0IGFzeW1ib2wgKmEgPSAqKGNvbnN0IGFzeW1ib2wgKiopYXA7Ci0gIGNvbnN0IGFzeW1ib2wgKmIgPSAqKGNvbnN0IGFzeW1ib2wgKiopYnA7Ci0gIGNvbnN0IGNoYXIgKmFuLCAqYm47Ci0gIHNpemVfdCBhbmwsIGJubDsKLSAgYm9vbGVhbiBhZiwgYmY7Ci0gIGZsYWd3b3JkIGFmbGFncywgYmZsYWdzOwotCi0gIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoYSkgPiBiZmRfYXN5bWJvbF92YWx1ZSAoYikpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChhKSA8IGJmZF9hc3ltYm9sX3ZhbHVlIChiKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGEtPnNlY3Rpb24gPiBiLT5zZWN0aW9uKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChhLT5zZWN0aW9uIDwgYi0+c2VjdGlvbikKLSAgICByZXR1cm4gLTE7Ci0KLSAgYW4gPSBiZmRfYXN5bWJvbF9uYW1lIChhKTsKLSAgYm4gPSBiZmRfYXN5bWJvbF9uYW1lIChiKTsKLSAgYW5sID0gc3RybGVuIChhbik7Ci0gIGJubCA9IHN0cmxlbiAoYm4pOwotCi0gIC8qIFRoZSBzeW1ib2xzIGdudV9jb21waWxlZCBhbmQgZ2NjMl9jb21waWxlZCBjb252ZXkgbm8gcmVhbAotICAgICBpbmZvcm1hdGlvbiwgc28gcHV0IHRoZW0gYWZ0ZXIgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLiAgKi8KLQotICBhZiA9IChzdHJzdHIgKGFuLCAiZ251X2NvbXBpbGVkIikgIT0gTlVMTAotCXx8IHN0cnN0ciAoYW4sICJnY2MyX2NvbXBpbGVkIikgIT0gTlVMTCk7Ci0gIGJmID0gKHN0cnN0ciAoYm4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyIChibiwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLQotICBpZiAoYWYgJiYgISBiZikKLSAgICByZXR1cm4gMTsKLSAgaWYgKCEgYWYgJiYgYmYpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFdlIHVzZSBhIGhldXJpc3RpYyBmb3IgdGhlIGZpbGUgbmFtZSwgdG8gdHJ5IHRvIHNvcnQgaXQgYWZ0ZXIKLSAgICAgbW9yZSB1c2VmdWwgc3ltYm9scy4gIEl0IG1heSBub3Qgd29yayBvbiBub24gVW5peCBzeXN0ZW1zLCBidXQgaXQKLSAgICAgZG9lc24ndCByZWFsbHkgbWF0dGVyOyB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHByZWNpc2VseSB3aGljaAotICAgICBzeW1ib2wgbmFtZXMgZ2V0IHByaW50ZWQuICAqLwotCi0jZGVmaW5lIGZpbGVfc3ltYm9sKHMsIHNuLCBzbmwpCQkJXAotICAoKChzKS0+ZmxhZ3MgJiBCU0ZfRklMRSkgIT0gMAkJCVwKLSAgIHx8ICgoc24pWyhzbmwpIC0gMl0gPT0gJy4nCQkJXAotICAgICAgICYmICgoc24pWyhzbmwpIC0gMV0gPT0gJ28nCQlcCi0JICAgfHwgKHNuKVsoc25sKSAtIDFdID09ICdhJykpKQotCi0gIGFmID0gZmlsZV9zeW1ib2wgKGEsIGFuLCBhbmwpOwotICBiZiA9IGZpbGVfc3ltYm9sIChiLCBibiwgYm5sKTsKLQotICBpZiAoYWYgJiYgISBiZikKLSAgICByZXR1cm4gMTsKLSAgaWYgKCEgYWYgJiYgYmYpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFRyeSB0byBzb3J0IGdsb2JhbCBzeW1ib2xzIGJlZm9yZSBsb2NhbCBzeW1ib2xzIGJlZm9yZSBmdW5jdGlvbgotICAgICBzeW1ib2xzIGJlZm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0KLSAgYWZsYWdzID0gYS0+ZmxhZ3M7Ci0gIGJmbGFncyA9IGItPmZsYWdzOwotCi0gIGlmICgoYWZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gKGJmbGFncyAmIEJTRl9ERUJVR0dJTkcpKQotICAgIHsKLSAgICAgIGlmICgoYWZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoKGFmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gKGJmbGFncyAmIEJTRl9GVU5DVElPTikpCi0gICAgewotICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDApCi0JcmV0dXJuIC0xOwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLSAgaWYgKChhZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IChiZmxhZ3MgJiBCU0ZfTE9DQUwpKQotICAgIHsKLSAgICAgIGlmICgoYWZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwKQotCXJldHVybiAxOwotICAgICAgZWxzZQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGlmICgoYWZsYWdzICYgQlNGX0dMT0JBTCkgIT0gKGJmbGFncyAmIEJTRl9HTE9CQUwpKQotICAgIHsKLSAgICAgIGlmICgoYWZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFN5bWJvbHMgdGhhdCBzdGFydCB3aXRoICcuJyBtaWdodCBiZSBzZWN0aW9uIG5hbWVzLCBzbyBzb3J0IHRoZW0KLSAgICAgYWZ0ZXIgc3ltYm9scyB0aGF0IGRvbid0IHN0YXJ0IHdpdGggJy4nLiAgKi8KLSAgaWYgKGFuWzBdID09ICcuJyAmJiBiblswXSAhPSAnLicpCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChhblswXSAhPSAnLicgJiYgYm5bMF0gPT0gJy4nKQotICAgIHJldHVybiAtMTsKLQotICAvKiBGaW5hbGx5LCBpZiB3ZSBjYW4ndCBkaXN0aW5ndWlzaCB0aGVtIGluIGFueSBvdGhlciB3YXksIHRyeSB0bwotICAgICBnZXQgY29uc2lzdGVudCByZXN1bHRzIGJ5IHNvcnRpbmcgdGhlIHN5bWJvbHMgYnkgbmFtZS4gICovCi0gIHJldHVybiBzdHJjbXAgKGFuLCBibik7Ci19Ci0KLS8qIFNvcnQgcmVsb2NzIGludG8gYWRkcmVzcyBvcmRlci4gICovCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfcmVsb2NzIChhcCwgYnApCi0gICAgIGNvbnN0IFBUUiBhcDsKLSAgICAgY29uc3QgUFRSIGJwOwotewotICBjb25zdCBhcmVsZW50ICphID0gKihjb25zdCBhcmVsZW50ICoqKWFwOwotICBjb25zdCBhcmVsZW50ICpiID0gKihjb25zdCBhcmVsZW50ICoqKWJwOwotCi0gIGlmIChhLT5hZGRyZXNzID4gYi0+YWRkcmVzcykKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYS0+YWRkcmVzcyA8IGItPmFkZHJlc3MpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFNvIHRoYXQgYXNzb2NpYXRlZCByZWxvY2F0aW9ucyB0aWVkIHRvIHRoZSBzYW1lIGFkZHJlc3Mgc2hvdyB1cAotICAgICBpbiB0aGUgY29ycmVjdCBvcmRlciwgd2UgZG9uJ3QgZG8gYW55IGZ1cnRoZXIgc29ydGluZy4gICovCi0gIGlmIChhID4gYikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYSA8IGIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFByaW50IFZNQSB0byBTVFJFQU0uICBJZiBTS0lQX1pFUk9FUyBpcyB0cnVlLCBvbWl0IGxlYWRpbmcgemVyb2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBza2lwX3plcm9lczsKLXsKLSAgY2hhciBidWZbMzBdOwotICBjaGFyICpwOwotCi0gIHNwcmludGZfdm1hIChidWYsIHZtYSk7Ci0gIGlmICghIHNraXBfemVyb2VzKQotICAgIHAgPSBidWY7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBidWY7ICpwID09ICcwJzsgKytwKQotCTsKLSAgICAgIGlmICgqcCA9PSAnXDAnKQotCS0tcDsKLSAgICB9Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBwKTsKLX0KLQotLyogUHJpbnQgdGhlIG5hbWUgb2YgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9zeW1uYW1lIChhYmZkLCBpbmZvLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgY2hhciAqYWxsb2M7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKnByaW50OwotCi0gIGFsbG9jID0gTlVMTDsKLSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0gIGlmICghIGRvX2RlbWFuZ2xlIHx8IG5hbWVbMF0gPT0gJ1wwJykKLSAgICBwcmludCA9IG5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBEZW1hbmdsZSB0aGUgbmFtZS4gICovCi0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSBuYW1lWzBdKQotCSsrbmFtZTsKLQotICAgICAgYWxsb2MgPSBjcGx1c19kZW1hbmdsZSAobmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICAgICAgaWYgKGFsbG9jID09IE5VTEwpCi0JcHJpbnQgPSBuYW1lOwotICAgICAgZWxzZQotCXByaW50ID0gYWxsb2M7Ci0gICAgfQotCi0gIGlmIChpbmZvICE9IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHByaW50KTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiVzIiwgcHJpbnQpOwotCi0gIGlmIChhbGxvYyAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jKTsKLX0KLQotLyogTG9jYXRlIGEgc3ltYm9sIGdpdmVuIGEgYmZkLCBhIHNlY3Rpb24sIGFuZCBhIFZNQS4gIElmIFJFUVVJUkVfU0VDCi0gICBpcyB0cnVlLCB0aGVuIGFsd2F5cyByZXF1aXJlIHRoZSBzeW1ib2wgdG8gYmUgaW4gdGhlIHNlY3Rpb24uICBUaGlzCi0gICByZXR1cm5zIE5VTEwgaWYgdGhlcmUgaXMgbm8gc3VpdGFibGUgc3ltYm9sLiAgSWYgUExBQ0UgaXMgbm90IE5VTEwsCi0gICB0aGVuICpQTEFDRSBpcyBzZXQgdG8gdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wgaW4gc29ydGVkX3N5bXMuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1maW5kX3N5bWJvbF9mb3JfYWRkcmVzcyAoYWJmZCwgc2VjLCB2bWEsIHJlcXVpcmVfc2VjLCBwbGFjZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgYm9vbGVhbiByZXF1aXJlX3NlYzsKLSAgICAgbG9uZyAqcGxhY2U7Ci17Ci0gIC8qIEBAIFdvdWxkIGl0IHNwZWVkIHRoaW5ncyB1cCB0byBjYWNoZSB0aGUgbGFzdCB0d28gc3ltYm9scyByZXR1cm5lZCwKLSAgICAgYW5kIG1heWJlIHRoZWlyIGFkZHJlc3MgcmFuZ2VzPyAgRm9yIG1hbnkgcHJvY2Vzc29ycywgb25seSBvbmUgbWVtb3J5Ci0gICAgIG9wZXJhbmQgY2FuIGJlIHByZXNlbnQgYXQgYSB0aW1lLCBzbyB0aGUgMi1lbnRyeSBjYWNoZSB3b3VsZG4ndCBiZQotICAgICBjb25zdGFudGx5IGNodXJuZWQgYnkgY29kZSBkb2luZyBoZWF2eSBtZW1vcnkgYWNjZXNzZXMuICAqLwotCi0gIC8qIEluZGljZXMgaW4gYHNvcnRlZF9zeW1zJy4gICovCi0gIGxvbmcgbWluID0gMDsKLSAgbG9uZyBtYXggPSBzb3J0ZWRfc3ltY291bnQ7Ci0gIGxvbmcgdGhpc3BsYWNlOwotCi0gIGlmIChzb3J0ZWRfc3ltY291bnQgPCAxKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIGxvb2tpbmcgZm9yIHRoZSBjbG9zZXN0IHN5bWJvbCB0byB0aGUKLSAgICAgcmVxdWlyZWQgdmFsdWUuICBXZSBhcmUgc2VhcmNoaW5nIHRoZSByYW5nZSAobWluLCBtYXhdLiAgKi8KLSAgd2hpbGUgKG1pbiArIDEgPCBtYXgpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICB0aGlzcGxhY2UgPSAobWF4ICsgbWluKSAvIDI7Ci0gICAgICBzeW0gPSBzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdOwotCi0gICAgICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiB2bWEpCi0JbWF4ID0gdGhpc3BsYWNlOwotICAgICAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPCB2bWEpCi0JbWluID0gdGhpc3BsYWNlOwotICAgICAgZWxzZQotCXsKLQkgIG1pbiA9IHRoaXNwbGFjZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIHN5bWJvbCB3ZSB3YW50IGlzIG5vdyBpbiBtaW4sIHRoZSBsb3cgZW5kIG9mIHRoZSByYW5nZSB3ZQotICAgICB3ZXJlIHNlYXJjaGluZy4gIElmIHRoZXJlIGFyZSBzZXZlcmFsIHN5bWJvbHMgd2l0aCB0aGUgc2FtZQotICAgICB2YWx1ZSwgd2Ugd2FudCB0aGUgZmlyc3Qgb25lLiAgKi8KLSAgdGhpc3BsYWNlID0gbWluOwotICB3aGlsZSAodGhpc3BsYWNlID4gMAotCSAmJiAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0pCi0JICAgICA9PSBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbdGhpc3BsYWNlIC0gMV0pKSkKLSAgICAtLXRoaXNwbGFjZTsKLQotICAvKiBJZiB0aGUgZmlsZSBpcyByZWxvY2F0ZWFibGUsIGFuZCB0aGUgc3ltYm9sIGNvdWxkIGJlIGZyb20gdGhpcwotICAgICBzZWN0aW9uLCBwcmVmZXIgYSBzeW1ib2wgZnJvbSB0aGlzIHNlY3Rpb24gb3ZlciBzeW1ib2xzIGZyb20KLSAgICAgb3RoZXJzLCBldmVuIGlmIHRoZSBvdGhlciBzeW1ib2wncyB2YWx1ZSBtaWdodCBiZSBjbG9zZXIuCi0gICAgICAgCi0gICAgIE5vdGUgdGhhdCB0aGlzIG1heSBiZSB3cm9uZyBmb3Igc29tZSBzeW1ib2wgcmVmZXJlbmNlcyBpZiB0aGUKLSAgICAgc2VjdGlvbnMgaGF2ZSBvdmVybGFwcGluZyBtZW1vcnkgcmFuZ2VzLCBidXQgaW4gdGhhdCBjYXNlIHRoZXJlJ3MKLSAgICAgbm8gd2F5IHRvIHRlbGwgd2hhdCdzIGRlc2lyZWQgd2l0aG91dCBsb29raW5nIGF0IHRoZSByZWxvY2F0aW9uCi0gICAgIHRhYmxlLiAgKi8KLQotICBpZiAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXS0+c2VjdGlvbiAhPSBzZWMKLSAgICAgICYmIChyZXF1aXJlX3NlYwotCSAgfHwgKChhYmZkLT5mbGFncyAmIEhBU19SRUxPQykgIT0gMAotCSAgICAgICYmIHZtYSA+PSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JICAgICAgJiYgdm1hIDwgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJCSsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSkpKSkKLSAgICB7Ci0gICAgICBsb25nIGk7Ci0KLSAgICAgIGZvciAoaSA9IHRoaXNwbGFjZSArIDE7IGkgPCBzb3J0ZWRfc3ltY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW2ldKQotCSAgICAgICE9IGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgLS1pOwotICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmIChzb3J0ZWRfc3ltc1tpXS0+c2VjdGlvbiA9PSBzZWMKLQkgICAgICAmJiAoaSA9PSAwCi0JCSAgfHwgc29ydGVkX3N5bXNbaSAtIDFdLT5zZWN0aW9uICE9IHNlYwotCQkgIHx8IChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbaV0pCi0JCSAgICAgICE9IGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1tpIC0gMV0pKSkpCi0JICAgIHsKLQkgICAgICB0aGlzcGxhY2UgPSBpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXS0+c2VjdGlvbiAhPSBzZWMpCi0JewotCSAgLyogV2UgZGlkbid0IGZpbmQgYSBnb29kIHN5bWJvbCB3aXRoIGEgc21hbGxlciB2YWx1ZS4KLQkgICAgIExvb2sgZm9yIG9uZSB3aXRoIGEgbGFyZ2VyIHZhbHVlLiAgKi8KLQkgIGZvciAoaSA9IHRoaXNwbGFjZSArIDE7IGkgPCBzb3J0ZWRfc3ltY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzb3J0ZWRfc3ltc1tpXS0+c2VjdGlvbiA9PSBzZWMpCi0JCXsKLQkJICB0aGlzcGxhY2UgPSBpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdLT5zZWN0aW9uICE9IHNlYwotCSAgJiYgKHJlcXVpcmVfc2VjCi0JICAgICAgfHwgKChhYmZkLT5mbGFncyAmIEhBU19SRUxPQykgIT0gMAotCQkgICYmIHZtYSA+PSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCSAgJiYgdm1hIDwgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJCSAgICArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykpKSkpCi0JewotCSAgLyogVGhlcmUgaXMgbm8gc3VpdGFibGUgc3ltYm9sLiAgKi8KLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBsYWNlICE9IE5VTEwpCi0gICAgKnBsYWNlID0gdGhpc3BsYWNlOwotCi0gIHJldHVybiBzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdOwotfQotCi0vKiBQcmludCBhbiBhZGRyZXNzIHRvIElORk8gc3ltYm9saWNhbGx5LiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSAoYWJmZCwgc2VjLCBzeW0sIHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gc2tpcF96ZXJvZXM7Ci17Ci0gIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpOwotCi0gIGlmIChzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHNlY2FkZHI7Ci0KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIDwlcyIsCi0JCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpKTsKLSAgICAgIHNlY2FkZHIgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHZtYSA8IHNlY2FkZHIpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItMHgiKTsKLQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHNlY2FkZHIgLSB2bWEsIGluZm8sIHRydWUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHZtYSA+IHNlY2FkZHIpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrMHgiKTsKLQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSAtIHNlY2FkZHIsIGluZm8sIHRydWUpOwotCX0KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIDwiKTsKLSAgICAgIG9iamR1bXBfcHJpbnRfc3ltbmFtZSAoYWJmZCwgaW5mbywgc3ltKTsKLSAgICAgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHZtYSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0weCIpOwotCSAgb2JqZHVtcF9wcmludF92YWx1ZSAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgLSB2bWEsIGluZm8sIHRydWUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHZtYSA+IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKzB4Iik7Ci0JICBvYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEgLSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSwgaW5mbywgdHJ1ZSk7Ci0JfQotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI+Iik7Ci0gICAgfQotfQotCi0vKiBQcmludCBWTUEgdG8gSU5GTywgc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgSWYgU0tJUF9aRVJPRVMgaXMKLSAgIHRydWUsIGRvbid0IG91dHB1dCBsZWFkaW5nIHplcm9lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHIgKHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBza2lwX3plcm9lczsKLXsKLSAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKmF1eDsKLSAgYXN5bWJvbCAqc3ltOwotCi0gIGlmIChzb3J0ZWRfc3ltY291bnQgPCAxKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgiKTsKLSAgICAgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhdXggPSAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKLSAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGF1eC0+YWJmZCwgYXV4LT5zZWMsIHZtYSwgYXV4LT5yZXF1aXJlX3NlYywKLQkJCQkgKGxvbmcgKikgTlVMTCk7Ci0gIG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSAoYXV4LT5hYmZkLCBhdXgtPnNlYywgc3ltLCB2bWEsIGluZm8sCi0JCQkgICAgICAgc2tpcF96ZXJvZXMpOwotfQotCi0vKiBQcmludCBWTUEgdG8gSU5GTy4gIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBkaXNhc3NlbWJsZXIKLSAgIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyZXNzICh2bWEsIGluZm8pCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgb2JqZHVtcF9wcmludF9hZGRyICh2bWEsIGluZm8sICEgcHJlZml4X2FkZHJlc3Nlcyk7Ci19Ci0KLS8qIERldGVybWluZSBvZiB0aGUgZ2l2ZW4gYWRkcmVzcyBoYXMgYSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGl0LiAgKi8KLQotc3RhdGljIGludAotb2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzcyAodm1hLCBpbmZvKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICBzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqIGF1eDsKLSAgYXN5bWJvbCAqIHN5bTsKLQotICAvKiBObyBzeW1ib2xzIC0gZG8gbm90IGJvdGhlciBjaGVja2luZy4gICovCi0gIGlmIChzb3J0ZWRfc3ltY291bnQgPCAxKQotICAgIHJldHVybiAwOwotCi0gIGF1eCA9IChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOwotICBzeW0gPSBmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcyAoYXV4LT5hYmZkLCBhdXgtPnNlYywgdm1hLCBhdXgtPnJlcXVpcmVfc2VjLAotCQkJCSAobG9uZyAqKSBOVUxMKTsKLQotICByZXR1cm4gKHN5bSAhPSBOVUxMICYmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA9PSB2bWEpKTsKLX0KLQotLyogSG9sZCB0aGUgbGFzdCBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGFzdCBsaW5lIG51bWJlciB3ZSBkaXNwbGF5ZWQKLSAgIGluIGEgZGlzYXNzZW1ibHkuICAqLwotCi1zdGF0aWMgY2hhciAqcHJldl9mdW5jdGlvbm5hbWU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHByZXZfbGluZTsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgYWxsIGZpbGVzIHRoYXQgd2UgaGF2ZSBzZWVuIHdoZW4gZG9pbmcgYQotICAgZGlzc2Fzc2VtYmx5IHdpdGggc291cmNlLCBzbyB0aGF0IHdlIGtub3cgaG93IG11Y2ggb2YgdGhlIGZpbGUgdG8KLSAgIGRpc3BsYXkuICBUaGlzIGNhbiBiZSBpbXBvcnRhbnQgZm9yIGlubGluZWQgZnVuY3Rpb25zLiAgKi8KLQotc3RydWN0IHByaW50X2ZpbGVfbGlzdAotewotICBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICpuZXh0OwotICBjaGFyICpmaWxlbmFtZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIEZJTEUgKmY7Ci19OwotCi1zdGF0aWMgc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqcHJpbnRfZmlsZXM7Ci0KLS8qIFRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIGNvbnRleHQgbGluZXMgdG8gc2hvdyB3aGVuIHdlIHN0YXJ0Ci0gICBkaXNwbGF5aW5nIGEgZmlsZSBmb3IgdGhlIGZpcnN0IHRpbWUuICAqLwotCi0jZGVmaW5lIFNIT1dfUFJFQ0VESU5HX0NPTlRFWFRfTElORVMgKDUpCi0KLS8qIFNraXAgYWhlYWQgdG8gYSBnaXZlbiBsaW5lIGluIGEgZmlsZSwgb3B0aW9uYWxseSBwcmludGluZyBlYWNoCi0gICBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLXNraXBfdG9fbGluZSBQQVJBTVMgKChzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICosIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZAotc2tpcF90b19saW5lIChwLCBsaW5lLCBzaG93KQotICAgICBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICpwOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgYm9vbGVhbiBzaG93OwotewotICB3aGlsZSAocC0+bGluZSA8IGxpbmUpCi0gICAgewotICAgICAgY2hhciBidWZbMTAwXTsKLQotICAgICAgaWYgKGZnZXRzIChidWYsIHNpemVvZiBidWYsIHAtPmYpID09IE5VTEwpCi0JewotCSAgZmNsb3NlIChwLT5mKTsKLQkgIHAtPmYgPSBOVUxMOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2hvdykKLQlwcmludGYgKCIlcyIsIGJ1Zik7Ci0KLSAgICAgIGlmIChzdHJjaHIgKGJ1ZiwgJ1xuJykgIT0gTlVMTCkKLQkrK3AtPmxpbmU7Ci0gICAgfQotfSAgCi0KLS8qIFNob3cgdGhlIGxpbmUgbnVtYmVyLCBvciB0aGUgc291cmNlIGxpbmUsIGluIGEgZGlzc2Fzc2VtYmx5Ci0gICBsaXN0aW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXNob3dfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2ZmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIG9mZjsKLXsKLSAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gIENPTlNUIGNoYXIgKmZ1bmN0aW9ubmFtZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLSAgaWYgKCEgd2l0aF9saW5lX251bWJlcnMgJiYgISB3aXRoX3NvdXJjZV9jb2RlKQotICAgIHJldHVybjsKLQotICBpZiAoISBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bXMsIG9mZiwgJmZpbGVuYW1lLAotCQkJICAgICAgICZmdW5jdGlvbm5hbWUsICZsaW5lKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwgJiYgKmZpbGVuYW1lID09ICdcMCcpCi0gICAgZmlsZW5hbWUgPSBOVUxMOwotICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgKmZ1bmN0aW9ubmFtZSA9PSAnXDAnKQotICAgIGZ1bmN0aW9ubmFtZSA9IE5VTEw7Ci0KLSAgaWYgKHdpdGhfbGluZV9udW1iZXJzKQotICAgIHsKLSAgICAgIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTAotCSAgJiYgKHByZXZfZnVuY3Rpb25uYW1lID09IE5VTEwKLQkgICAgICB8fCBzdHJjbXAgKGZ1bmN0aW9ubmFtZSwgcHJldl9mdW5jdGlvbm5hbWUpICE9IDApKQotCXByaW50ZiAoIiVzKCk6XG4iLCBmdW5jdGlvbm5hbWUpOwotICAgICAgaWYgKGxpbmUgPiAwICYmIGxpbmUgIT0gcHJldl9saW5lKQotCXByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA9PSBOVUxMID8gIj8/PyIgOiBmaWxlbmFtZSwgbGluZSk7Ci0gICAgfQotCi0gIGlmICh3aXRoX3NvdXJjZV9jb2RlCi0gICAgICAmJiBmaWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBsaW5lID4gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICoqcHAsICpwOwotCi0gICAgICBmb3IgKHBwID0gJnByaW50X2ZpbGVzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JaWYgKHN0cmNtcCAoKCpwcCktPmZpbGVuYW1lLCBmaWxlbmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgcCA9ICpwcDsKLQotICAgICAgaWYgKHAgIT0gTlVMTCkKLQl7Ci0JICBpZiAocCAhPSBwcmludF9maWxlcykKLQkgICAgewotCSAgICAgIGludCBsOwotCi0JICAgICAgLyogV2UgaGF2ZSByZWVuY291bnRlcmVkIGEgZmlsZSBuYW1lIHdoaWNoIHdlIHNhdwotCQkgZWFybGllci4gIFRoaXMgaW1wbGllcyB0aGF0IGVpdGhlciB3ZSBhcmUgZHVtcGluZyBvdXQKLQkJIGNvZGUgZnJvbSBhbiBpbmNsdWRlZCBmaWxlLCBvciB0aGUgc2FtZSBmaWxlIHdhcwotCQkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlLiAgVGhlcmUgYXJlIHR3byBjb21tb24gY2FzZXMKLQkJIG9mIGFuIGluY2x1ZGVkIGZpbGU6IGlubGluZSBmdW5jdGlvbnMgaW4gYSBoZWFkZXIKLQkJIGZpbGUsIGFuZCBhIGJpc29uIG9yIGZsZXggc2tlbGV0b24gZmlsZS4gIEluIHRoZQotCQkgZm9ybWVyIGNhc2Ugd2Ugd2FudCB0byBqdXN0IHN0YXJ0IHByaW50aW5nIChidXQgd2UKLQkJIGJhY2sgdXAgYSBmZXcgbGluZXMgdG8gZ2l2ZSBjb250ZXh0KTsgaW4gdGhlIGxhdHRlcgotCQkgY2FzZSB3ZSB3YW50IHRvIGNvbnRpbnVlIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYuICBJCi0JCSBjYW4ndCB0aGluayBvZiBhIGdvb2Qgd2F5IHRvIGRpc3Rpbmd1aXNoIHRoZSBjYXNlcywKLQkJIHNvIEkgdXNlZCBhIGhldXJpc3RpYyBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lLiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChwLT5maWxlbmFtZSArIHN0cmxlbiAocC0+ZmlsZW5hbWUpIC0gMiwgIi5oIikgIT0gMCkKLQkJbCA9IHAtPmxpbmU7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbCA9IGxpbmUgLSBTSE9XX1BSRUNFRElOR19DT05URVhUX0xJTkVTOwotCQkgIGlmIChsIDw9IDApCi0JCSAgICBsID0gMTsKLQkJfQotCi0JICAgICAgaWYgKHAtPmYgPT0gTlVMTCkKLQkJewotCQkgIHAtPmYgPSBmb3BlbiAocC0+ZmlsZW5hbWUsICJyIik7Ci0JCSAgcC0+bGluZSA9IDA7Ci0JCX0KLQkgICAgICBpZiAocC0+ZiAhPSBOVUxMKQotCQlza2lwX3RvX2xpbmUgKHAsIGwsIGZhbHNlKTsKLQotCSAgICAgIGlmIChwcmludF9maWxlcy0+ZiAhPSBOVUxMKQotCQl7Ci0JCSAgZmNsb3NlIChwcmludF9maWxlcy0+Zik7Ci0JCSAgcHJpbnRfZmlsZXMtPmYgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKHAtPmYgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNraXBfdG9fbGluZSAocCwgbGluZSwgdHJ1ZSk7Ci0JICAgICAgKnBwID0gcC0+bmV4dDsKLQkgICAgICBwLT5uZXh0ID0gcHJpbnRfZmlsZXM7Ci0JICAgICAgcHJpbnRfZmlsZXMgPSBwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEZJTEUgKmY7Ci0KLQkgIGYgPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0JICBpZiAoZiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaW50IGw7Ci0KLQkgICAgICBwID0gKChzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICopCi0JCSAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHByaW50X2ZpbGVfbGlzdCkpKTsKLQkgICAgICBwLT5maWxlbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpICsgMSk7Ci0JICAgICAgc3RyY3B5IChwLT5maWxlbmFtZSwgZmlsZW5hbWUpOwotCSAgICAgIHAtPmxpbmUgPSAwOwotCSAgICAgIHAtPmYgPSBmOwotCi0JICAgICAgaWYgKHByaW50X2ZpbGVzICE9IE5VTEwgJiYgcHJpbnRfZmlsZXMtPmYgIT0gTlVMTCkKLQkJewotCQkgIGZjbG9zZSAocHJpbnRfZmlsZXMtPmYpOwotCQkgIHByaW50X2ZpbGVzLT5mID0gTlVMTDsKLQkJfQotCSAgICAgIHAtPm5leHQgPSBwcmludF9maWxlczsKLQkgICAgICBwcmludF9maWxlcyA9IHA7Ci0KLQkgICAgICBsID0gbGluZSAtIFNIT1dfUFJFQ0VESU5HX0NPTlRFWFRfTElORVM7Ci0JICAgICAgaWYgKGwgPD0gMCkKLQkJbCA9IDE7Ci0JICAgICAgc2tpcF90b19saW5lIChwLCBsLCBmYWxzZSk7Ci0JICAgICAgaWYgKHAtPmYgIT0gTlVMTCkKLQkJc2tpcF90b19saW5lIChwLCBsaW5lLCB0cnVlKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMCi0gICAgICAmJiAocHJldl9mdW5jdGlvbm5hbWUgPT0gTlVMTAotCSAgfHwgc3RyY21wIChmdW5jdGlvbm5hbWUsIHByZXZfZnVuY3Rpb25uYW1lKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAocHJldl9mdW5jdGlvbm5hbWUgIT0gTlVMTCkKLQlmcmVlIChwcmV2X2Z1bmN0aW9ubmFtZSk7Ci0gICAgICBwcmV2X2Z1bmN0aW9ubmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoZnVuY3Rpb25uYW1lKSArIDEpOwotICAgICAgc3RyY3B5IChwcmV2X2Z1bmN0aW9ubmFtZSwgZnVuY3Rpb25uYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxpbmUgPiAwICYmIGxpbmUgIT0gcHJldl9saW5lKQotICAgIHByZXZfbGluZSA9IGxpbmU7Ci19Ci0KLS8qIFBzZXVkbyBGSUxFIG9iamVjdCBmb3Igc3RyaW5ncy4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBjaGFyICpidWZmZXI7Ci0gIHNpemVfdCBzaXplOwotICBjaGFyICpjdXJyZW50OwotfSBTRklMRTsKLQotLyogc3ByaW50ZiB0byBhICJzdHJlYW0iICovCi0KLXN0YXRpYyBpbnQKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLW9iamR1bXBfc3ByaW50ZiAoU0ZJTEUgKmYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotI2Vsc2UKLW9iamR1bXBfc3ByaW50ZiAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0jaWZuZGVmIEFOU0lfUFJPVE9UWVBFUwotICBTRklMRSAqZjsKLSAgY29uc3QgY2hhciAqZm9ybWF0OwotI2VuZGlmCi0gIGNoYXIgKmJ1ZjsKLSAgdmFfbGlzdCBhcmdzOwotICBzaXplX3QgbjsKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZiA9IHZhX2FyZyAoYXJncywgU0ZJTEUgKik7Ci0gIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0gIHZhc3ByaW50ZiAoJmJ1ZiwgZm9ybWF0LCBhcmdzKTsKLQotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGlmIChidWYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIk91dCBvZiB2aXJ0dWFsIG1lbW9yeVxuIikpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIG4gPSBzdHJsZW4gKGJ1Zik7Ci0KLSAgd2hpbGUgKChzaXplX3QpICgoZi0+YnVmZmVyICsgZi0+c2l6ZSkgLSBmLT5jdXJyZW50KSA8IG4gKyAxKQotICAgIHsKLSAgICAgIHNpemVfdCBjdXJyb2ZmOwotCi0gICAgICBjdXJyb2ZmID0gZi0+Y3VycmVudCAtIGYtPmJ1ZmZlcjsKLSAgICAgIGYtPnNpemUgKj0gMjsKLSAgICAgIGYtPmJ1ZmZlciA9IHhyZWFsbG9jIChmLT5idWZmZXIsIGYtPnNpemUpOwotICAgICAgZi0+Y3VycmVudCA9IGYtPmJ1ZmZlciArIGN1cnJvZmY7Ci0gICAgfQotCi0gIG1lbWNweSAoZi0+Y3VycmVudCwgYnVmLCBuKTsKLSAgZi0+Y3VycmVudCArPSBuOwotICBmLT5jdXJyZW50WzBdID0gJ1wwJzsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiBuOwotfQotCi0vKiBUaGUgbnVtYmVyIG9mIHplcm9lcyB3ZSB3YW50IHRvIHNlZSBiZWZvcmUgd2Ugc3RhcnQgc2tpcHBpbmcgdGhlbS4KLSAgIFRoZSBudW1iZXIgaXMgYXJiaXRyYXJpbHkgY2hvc2VuLiAgKi8KLQotI2RlZmluZSBTS0lQX1pFUk9FUyAoOCkKLQotLyogVGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIElmIHRoZQotICAgbnVtYmVyIG9mIHplcm9lcyBhdCB0aGUgZW5kIGlzIGJldHdlZW4gU0tJUF9aRVJPRVNfQVRfRU5EIGFuZAotICAgU0tJUF9aRVJPRVMsIHRoZXkgd2lsbCBiZSBkaXNhc3NlbWJsZWQuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgotICAgU0tJUF9aRVJPRVNfQVRfRU5ELCB0aGV5IHdpbGwgYmUgc2tpcHBlZC4gIFRoaXMgaXMgYSBoZXVyaXN0aWMKLSAgIGF0dGVtcHQgdG8gYXZvaWQgZGlzYXNzZW1ibGluZyB6ZXJvZXMgaW5zZXJ0ZWQgYnkgc2VjdGlvbgotICAgYWxpZ25tZW50LiAgKi8KLQotI2RlZmluZSBTS0lQX1pFUk9FU19BVF9FTkQgKDMpCi0KLS8qIERpc2Fzc2VtYmxlIHNvbWUgZGF0YSBpbiBtZW1vcnkgYmV0d2VlbiBnaXZlbiB2YWx1ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfYnl0ZXMgKGluZm8sIGRpc2Fzc2VtYmxlX2ZuLCBpbnNucywgZGF0YSwgc3RhcnQsIHN0b3AsIHJlbHBwcCwKLQkJICAgcmVscHBlbmQpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGVfZm47Ci0gICAgIGJvb2xlYW4gaW5zbnM7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBiZmRfdm1hIHN0YXJ0OwotICAgICBiZmRfdm1hIHN0b3A7Ci0gICAgIGFyZWxlbnQgKioqcmVscHBwOwotICAgICBhcmVsZW50ICoqcmVscHBlbmQ7Ci17Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICphdXg7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBpbnQgYnl0ZXNfcGVyX2xpbmU7Ci0gIGJvb2xlYW4gZG9uZV9kb3Q7Ci0gIGludCBza2lwX2FkZHJfY2hhcnM7Ci0gIGJmZF92bWEgaTsKLQotICBhdXggPSAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKLSAgc2VjdGlvbiA9IGF1eC0+c2VjOwotCi0gIGlmIChpbnNucykKLSAgICBieXRlc19wZXJfbGluZSA9IDQ7Ci0gIGVsc2UKLSAgICBieXRlc19wZXJfbGluZSA9IDE2OwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgY2hhcmFjdGVycyB0byBza2lwIGF0IHRoZSBzdGFydCBvZiBhbgotICAgICBhZGRyZXNzLCB0byBtYWtlIHRoZSBkaXNhc3NlbWJseSBsb29rIG5pY2VyLiAgV2UgZGlzY2FyZCBsZWFkaW5nCi0gICAgIHplcm9lcyBpbiBjaHVua3Mgb2YgNCwgZW5zdXJpbmcgdGhhdCB0aGVyZSBpcyBhbHdheXMgYSBsZWFkaW5nCi0gICAgIHplcm8gcmVtYWluaW5nLiAgKi8KLSAgc2tpcF9hZGRyX2NoYXJzID0gMDsKLSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlszMF07Ci0gICAgICBjaGFyICpzOwotCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmLAotCQkgICBzZWN0aW9uLT52bWEgKyBiZmRfc2VjdGlvbl9zaXplIChzZWN0aW9uLT5vd25lciwgc2VjdGlvbikpOwotICAgICAgcyA9IGJ1ZjsKLSAgICAgIHdoaWxlIChzWzBdID09ICcwJyAmJiBzWzFdID09ICcwJyAmJiBzWzJdID09ICcwJyAmJiBzWzNdID09ICcwJwotCSAgICAgJiYgc1s0XSA9PSAnMCcpCi0JewotCSAgc2tpcF9hZGRyX2NoYXJzICs9IDQ7Ci0JICBzICs9IDQ7Ci0JfQotICAgIH0KLQotICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAwOwotCi0gIGRvbmVfZG90ID0gZmFsc2U7Ci0gIGkgPSBzdGFydDsKLSAgd2hpbGUgKGkgPCBzdG9wKQotICAgIHsKLSAgICAgIGJmZF92bWEgejsKLSAgICAgIGludCBieXRlcyA9IDA7Ci0gICAgICBib29sZWFuIG5lZWRfbmwgPSBmYWxzZTsKLQotICAgICAgLyogSWYgd2Ugc2VlIG1vcmUgdGhhbiBTS0lQX1pFUk9FUyBieXRlcyBvZiB6ZXJvZXMsIHdlIGp1c3QKLSAgICAgICAgIHByaW50IGAuLi4nLiAgKi8KLSAgICAgIGZvciAoeiA9IGk7IHogPCBzdG9wOyB6KyspCi0JaWYgKGRhdGFbel0gIT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKCEgZGlzYXNzZW1ibGVfemVyb2VzCi0JICAmJiAoaW5mby0+aW5zbl9pbmZvX3ZhbGlkID09IDAKLQkgICAgICB8fCBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPT0gMCkKLQkgICYmICh6IC0gaSA+PSBTS0lQX1pFUk9FUwotCSAgICAgIHx8ICh6ID09IHN0b3AgJiYgeiAtIGkgPCBTS0lQX1pFUk9FU19BVF9FTkQpKSkKLQl7Ci0JICBwcmludGYgKCJcdC4uLlxuIik7Ci0KLQkgIC8qIElmIHRoZXJlIGFyZSBtb3JlIG5vbnplcm8gYnl0ZXMgdG8gZm9sbG93LCB3ZSBvbmx5IHNraXAKLSAgICAgICAgICAgICB6ZXJvZXMgaW4gbXVsdGlwbGVzIG9mIDQsIHRvIHRyeSB0byBhdm9pZCBydW5uaW5nIG92ZXIKLSAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaGFwcGVucyB0byBzdGFydCB3aXRoCi0gICAgICAgICAgICAgemVyby4gICovCi0JICBpZiAoeiAhPSBzdG9wKQotCSAgICB6ID0gaSArICgoeiAtIGkpICZ+IDMpOwotCi0JICBieXRlcyA9IHogLSBpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyIGJ1Zls1MF07Ci0JICBTRklMRSBzZmlsZTsKLQkgIGludCBicGMgPSAwOwotCSAgaW50IHBiID0gMDsKLQotCSAgZG9uZV9kb3QgPSBmYWxzZTsKLQotCSAgaWYgKHdpdGhfbGluZV9udW1iZXJzIHx8IHdpdGhfc291cmNlX2NvZGUpCi0JICAgIHNob3dfbGluZSAoYXV4LT5hYmZkLCBzZWN0aW9uLCBpKTsKLQotCSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKLQkgICAgewotCSAgICAgIGNoYXIgKnM7Ci0KLQkgICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBzZWN0aW9uLT52bWEgKyBpKTsKLQkgICAgICBmb3IgKHMgPSBidWYgKyBza2lwX2FkZHJfY2hhcnM7ICpzID09ICcwJzsgcysrKQotCQkqcyA9ICcgJzsKLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJKi0tcyA9ICcwJzsKLQkgICAgICBwcmludGYgKCIlczpcdCIsIGJ1ZiArIHNraXBfYWRkcl9jaGFycyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGF1eC0+cmVxdWlyZV9zZWMgPSB0cnVlOwotCSAgICAgIG9iamR1bXBfcHJpbnRfYWRkcmVzcyAoc2VjdGlvbi0+dm1hICsgaSwgaW5mbyk7Ci0JICAgICAgYXV4LT5yZXF1aXJlX3NlYyA9IGZhbHNlOwotCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JICAgIH0KLQotCSAgaWYgKGluc25zKQotCSAgICB7Ci0JICAgICAgc2ZpbGUuc2l6ZSA9IDEyMDsKLQkgICAgICBzZmlsZS5idWZmZXIgPSB4bWFsbG9jIChzZmlsZS5zaXplKTsKLQkgICAgICBzZmlsZS5jdXJyZW50ID0gc2ZpbGUuYnVmZmVyOwotCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKSBvYmpkdW1wX3NwcmludGY7Ci0JICAgICAgaW5mby0+c3RyZWFtID0gKEZJTEUgKikgJnNmaWxlOwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gMDsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAwOwotCi0JICAgICAgLyogRklYTUU6IFRoaXMgaXMgd3JvbmcuICBJdCB0ZXN0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICAgICAgICAgICAgIGluIHRoZSBsYXN0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgb25lLiAgKi8KLQkgICAgICBpZiAoKnJlbHBwcCA8IHJlbHBwZW5kCi0JCSAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA+PSBpCi0JCSAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA8IGkgKyBieXRlcykKLQkJaW5mby0+ZmxhZ3MgPSBJTlNOX0hBU19SRUxPQzsKLQkgICAgICBlbHNlCi0JCWluZm8tPmZsYWdzID0gMDsKLQotCSAgICAgIGJ5dGVzID0gKCpkaXNhc3NlbWJsZV9mbikgKHNlY3Rpb24tPnZtYSArIGksIGluZm8pOwotCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKSBmcHJpbnRmOwotCSAgICAgIGluZm8tPnN0cmVhbSA9IHN0ZG91dDsKLQkgICAgICBpZiAoaW5mby0+Ynl0ZXNfcGVyX2xpbmUgIT0gMCkKLQkJYnl0ZXNfcGVyX2xpbmUgPSBpbmZvLT5ieXRlc19wZXJfbGluZTsKLQkgICAgICBpZiAoYnl0ZXMgPCAwKQotCQl7Ci0JCSAgaWYgKHNmaWxlLmN1cnJlbnQgIT0gc2ZpbGUuYnVmZmVyKQotCQkgICAgcHJpbnRmICgiJXNcbiIsIHNmaWxlLmJ1ZmZlcik7Ci0JCSAgZnJlZSAoc2ZpbGUuYnVmZmVyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIGo7Ci0KLQkgICAgICBieXRlcyA9IGJ5dGVzX3Blcl9saW5lOwotCSAgICAgIGlmIChpICsgYnl0ZXMgPiBzdG9wKQotCQlieXRlcyA9IHN0b3AgLSBpOwotCi0JICAgICAgZm9yIChqID0gaTsgaiA8IGkgKyBieXRlczsgKytqKQotCQl7Ci0JCSAgaWYgKGlzcHJpbnQgKGRhdGFbal0pKQotCQkgICAgYnVmW2ogLSBpXSA9IGRhdGFbal07Ci0JCSAgZWxzZQotCQkgICAgYnVmW2ogLSBpXSA9ICcuJzsKLQkJfQotCSAgICAgIGJ1ZltqIC0gaV0gPSAnXDAnOwotCSAgICB9Ci0KLQkgIGlmIChwcmVmaXhfYWRkcmVzc2VzCi0JICAgICAgPyBzaG93X3Jhd19pbnNuID4gMAotCSAgICAgIDogc2hvd19yYXdfaW5zbiA+PSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBqOwotCi0JICAgICAgLyogSWYgISBwcmVmaXhfYWRkcmVzc2VzIGFuZCAhIHdpZGVfb3V0cHV0LCB3ZSBwcmludAotICAgICAgICAgICAgICAgICBieXRlc19wZXJfbGluZSBieXRlcyBwZXIgbGluZS4gICovCi0JICAgICAgcGIgPSBieXRlczsKLQkgICAgICBpZiAocGIgPiBieXRlc19wZXJfbGluZSAmJiAhIHByZWZpeF9hZGRyZXNzZXMgJiYgISB3aWRlX291dHB1dCkKLQkJcGIgPSBieXRlc19wZXJfbGluZTsKLQotCSAgICAgIGlmIChpbmZvLT5ieXRlc19wZXJfY2h1bmspCi0JCWJwYyA9IGluZm8tPmJ5dGVzX3Blcl9jaHVuazsKLQkgICAgICBlbHNlCi0JCWJwYyA9IDE7Ci0KLQkgICAgICBmb3IgKGogPSBpOyBqIDwgaSArIHBiOyBqICs9IGJwYykKLQkJewotCQkgIGludCBrOwotCQkgIGlmIChicGMgPiAxICYmIGluZm8tPmRpc3BsYXlfZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCQkgICAgewotCQkgICAgICBmb3IgKGsgPSBicGMgLSAxOyBrID49IDA7IGstLSkKLQkJCXByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIGRhdGFbaiArIGtdKTsKLQkJICAgICAgcHV0Y2hhciAoJyAnKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGZvciAoayA9IDA7IGsgPCBicGM7IGsrKykKLQkJCXByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIGRhdGFbaiArIGtdKTsKLQkJICAgICAgcHV0Y2hhciAoJyAnKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZm9yICg7IHBiIDwgYnl0ZXNfcGVyX2xpbmU7IHBiICs9IGJwYykKLQkJewotCQkgIGludCBrOwotCi0JCSAgZm9yIChrID0gMDsgayA8IGJwYzsgaysrKQotCQkgICAgcHJpbnRmICgiICAiKTsKLQkJICBwdXRjaGFyICgnICcpOwotCQl9Ci0KLQkgICAgICAvKiBTZXBhcmF0ZSByYXcgZGF0YSBmcm9tIGluc3RydWN0aW9uIGJ5IGV4dHJhIHNwYWNlLiAgKi8KLQkgICAgICBpZiAoaW5zbnMpCi0JCXB1dGNoYXIgKCdcdCcpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiICAgICIpOwotCSAgICB9Ci0KLQkgIGlmICghIGluc25zKQotCSAgICBwcmludGYgKCIlcyIsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlcyIsIHNmaWxlLmJ1ZmZlcik7Ci0JICAgICAgZnJlZSAoc2ZpbGUuYnVmZmVyKTsKLQkgICAgfQotCi0JICBpZiAocHJlZml4X2FkZHJlc3NlcwotCSAgICAgID8gc2hvd19yYXdfaW5zbiA+IDAKLQkgICAgICA6IHNob3dfcmF3X2luc24gPj0gMCkKLQkgICAgewotCSAgICAgIHdoaWxlIChwYiA8IGJ5dGVzKQotCQl7Ci0JCSAgYmZkX3ZtYSBqOwotCQkgIGNoYXIgKnM7Ci0KLQkJICBwdXRjaGFyICgnXG4nKTsKLQkJICBqID0gaSArIHBiOwotCi0JCSAgc3ByaW50Zl92bWEgKGJ1Ziwgc2VjdGlvbi0+dm1hICsgaik7Ci0JCSAgZm9yIChzID0gYnVmICsgc2tpcF9hZGRyX2NoYXJzOyAqcyA9PSAnMCc7IHMrKykKLQkJICAgICpzID0gJyAnOwotCQkgIGlmICgqcyA9PSAnXDAnKQotCQkgICAgKi0tcyA9ICcwJzsKLQkJICBwcmludGYgKCIlczpcdCIsIGJ1ZiArIHNraXBfYWRkcl9jaGFycyk7Ci0KLQkJICBwYiArPSBieXRlc19wZXJfbGluZTsKLQkJICBpZiAocGIgPiBieXRlcykKLQkJICAgIHBiID0gYnl0ZXM7Ci0JCSAgZm9yICg7IGogPCBpICsgcGI7IGogKz0gYnBjKQotCQkgICAgewotCQkgICAgICBpbnQgazsKLQotCQkgICAgICBpZiAoYnBjID4gMSAmJiBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLQkJCXsKLQkJCSAgZm9yIChrID0gYnBjIC0gMTsgayA+PSAwOyBrLS0pCi0JCQkgICAgcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOwotCQkJICBwdXRjaGFyICgnICcpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZvciAoayA9IDA7IGsgPCBicGM7IGsrKykKLQkJCSAgICBwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoIXdpZGVfb3V0cHV0KQotCSAgICBwdXRjaGFyICgnXG4nKTsKLQkgIGVsc2UKLQkgICAgbmVlZF9ubCA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoZHVtcF9yZWxvY19pbmZvCi0JICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgd2hpbGUgKCgqcmVscHBwKSA8IHJlbHBwZW5kCi0JCSAmJiAoKCoqcmVscHBwKS0+YWRkcmVzcyA+PSAoYmZkX3ZtYSkgaQotCQkgICAgICYmICgqKnJlbHBwcCktPmFkZHJlc3MgPCAoYmZkX3ZtYSkgaSArIGJ5dGVzKSkKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnE7Ci0KLQkgICAgICBxID0gKipyZWxwcHA7Ci0KLQkgICAgICBpZiAod2lkZV9vdXRwdXQpCi0JCXB1dGNoYXIgKCdcdCcpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiXHRcdFx0Iik7Ci0KLQkgICAgICBvYmpkdW1wX3ByaW50X3ZhbHVlIChzZWN0aW9uLT52bWEgKyBxLT5hZGRyZXNzLCBpbmZvLCB0cnVlKTsKLQotCSAgICAgIHByaW50ZiAoIjogJXNcdCIsIHEtPmhvd3RvLT5uYW1lKTsKLQotCSAgICAgIGlmIChxLT5zeW1fcHRyX3B0ciA9PSBOVUxMIHx8ICpxLT5zeW1fcHRyX3B0ciA9PSBOVUxMKQotCQlwcmludGYgKCIqdW5rbm93bioiKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQotCQkgIHN5bV9uYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKTsKLQkJICBpZiAoc3ltX25hbWUgIT0gTlVMTCAmJiAqc3ltX25hbWUgIT0gJ1wwJykKLQkJICAgIG9iamR1bXBfcHJpbnRfc3ltbmFtZSAoYXV4LT5hYmZkLCBpbmZvLCAqcS0+c3ltX3B0cl9wdHIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0KLQkJICAgICAgc3ltX3NlYyA9IGJmZF9nZXRfc2VjdGlvbiAoKnEtPnN5bV9wdHJfcHRyKTsKLQkJICAgICAgc3ltX25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYXV4LT5hYmZkLCBzeW1fc2VjKTsKLQkJICAgICAgaWYgKHN5bV9uYW1lID09IE5VTEwgfHwgKnN5bV9uYW1lID09ICdcMCcpCi0JCQlzeW1fbmFtZSA9ICIqdW5rbm93bioiOwotCQkgICAgICBwcmludGYgKCIlcyIsIHN5bV9uYW1lKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKHEtPmFkZGVuZCkKLQkJewotCQkgIHByaW50ZiAoIisweCIpOwotCQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHEtPmFkZGVuZCwgaW5mbywgdHJ1ZSk7Ci0JCX0KLQotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgbmVlZF9ubCA9IGZhbHNlOwotCSAgICAgICsrKCpyZWxwcHApOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobmVlZF9ubCkKLQlwcmludGYgKCJcbiIpOwotCi0gICAgICBpICs9IGJ5dGVzOwotICAgIH0KLX0KLQotLyogRGlzYXNzZW1ibGUgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBpOwotICBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGVfZm47Ci0gIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvIGRpc2FzbV9pbmZvOwotICBzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyBhdXg7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIHByaW50X2ZpbGVzID0gTlVMTDsKLSAgcHJldl9mdW5jdGlvbm5hbWUgPSBOVUxMOwotICBwcmV2X2xpbmUgPSAtMTsKLQotICAvKiBXZSBtYWtlIGEgY29weSBvZiBzeW1zIHRvIHNvcnQuICBXZSBkb24ndCB3YW50IHRvIHNvcnQgc3ltcwotICAgICBiZWNhdXNlIHRoYXQgd2lsbCBzY3JldyB1cCB0aGUgcmVsb2NzLiAgKi8KLSAgc29ydGVkX3N5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBtZW1jcHkgKHNvcnRlZF9zeW1zLCBzeW1zLCBzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0KLSAgc29ydGVkX3N5bWNvdW50ID0gcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyAoc29ydGVkX3N5bXMsIHN5bWNvdW50KTsKLQotICAvKiBTb3J0IHRoZSBzeW1ib2xzIGludG8gc2VjdGlvbiBhbmQgc3ltYm9sIG9yZGVyICovCi0gIHFzb3J0IChzb3J0ZWRfc3ltcywgc29ydGVkX3N5bWNvdW50LCBzaXplb2YgKGFzeW1ib2wgKiksIGNvbXBhcmVfc3ltYm9scyk7Ci0KLSAgSU5JVF9ESVNBU1NFTUJMRV9JTkZPKGRpc2FzbV9pbmZvLCBzdGRvdXQsIGZwcmludGYpOwotICBkaXNhc21faW5mby5hcHBsaWNhdGlvbl9kYXRhID0gKFBUUikgJmF1eDsKLSAgYXV4LmFiZmQgPSBhYmZkOwotICBhdXgucmVxdWlyZV9zZWMgPSBmYWxzZTsKLSAgZGlzYXNtX2luZm8ucHJpbnRfYWRkcmVzc19mdW5jID0gb2JqZHVtcF9wcmludF9hZGRyZXNzOwotICBkaXNhc21faW5mby5zeW1ib2xfYXRfYWRkcmVzc19mdW5jID0gb2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzczsKLQotICBpZiAobWFjaGluZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqaW5mbyA9IGJmZF9zY2FuX2FyY2ggKG1hY2hpbmUpOwotICAgICAgaWYgKGluZm8gPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCB1c2Ugc3VwcGxpZWQgbWFjaGluZSAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwKLQkJICAgbWFjaGluZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBhYmZkLT5hcmNoX2luZm8gPSBpbmZvOwotICAgIH0KLQotICBpZiAoZW5kaWFuICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLQotICAgICAgeHZlYyA9IChzdHJ1Y3QgYmZkX3RhcmdldCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfdGFyZ2V0KSk7Ci0gICAgICBtZW1jcHkgKHh2ZWMsIGFiZmQtPnh2ZWMsIHNpemVvZiAoc3RydWN0IGJmZF90YXJnZXQpKTsKLSAgICAgIHh2ZWMtPmJ5dGVvcmRlciA9IGVuZGlhbjsKLSAgICAgIGFiZmQtPnh2ZWMgPSB4dmVjOwotICAgIH0KLQotICBkaXNhc3NlbWJsZV9mbiA9IGRpc2Fzc2VtYmxlciAoYWJmZCk7Ci0gIGlmICghZGlzYXNzZW1ibGVfZm4pCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogQ2FuJ3QgZGlzYXNzZW1ibGUgZm9yIGFyY2hpdGVjdHVyZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwKLQkgICAgICAgYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGJmZF9nZXRfYXJjaCAoYWJmZCksIDApKTsKLSAgICAgIGV4aXRfc3RhdHVzID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGlzYXNtX2luZm8uZmxhdm91ciA9IGJmZF9nZXRfZmxhdm91ciAoYWJmZCk7Ci0gIGRpc2FzbV9pbmZvLmFyY2ggPSBiZmRfZ2V0X2FyY2ggKGFiZmQpOwotICBkaXNhc21faW5mby5tYWNoID0gYmZkX2dldF9tYWNoIChhYmZkKTsKLSAgZGlzYXNtX2luZm8uZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBkaXNhc3NlbWJsZXJfb3B0aW9uczsKLSAgCi0gIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgZGlzYXNtX2luZm8uZGlzcGxheV9lbmRpYW4gPSBkaXNhc21faW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLSAgZWxzZSBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGRpc2FzbV9pbmZvLmRpc3BsYXlfZW5kaWFuID0gZGlzYXNtX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7Ci0gIGVsc2UKLSAgICAvKiA/Pz8gQWJvcnRpbmcgaGVyZSBzZWVtcyB0b28gZHJhc3RpYy4gIFdlIGNvdWxkIGRlZmF1bHQgdG8gYmlnIG9yIGxpdHRsZQotICAgICAgIGluc3RlYWQuICAqLwotICAgIGRpc2FzbV9pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTjsKLQotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBzZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpkYXRhID0gTlVMTDsKLSAgICAgIGJmZF9zaXplX3R5cGUgZGF0YXNpemUgPSAwOwotICAgICAgYXJlbGVudCAqKnJlbGJ1ZiA9IE5VTEw7Ci0gICAgICBhcmVsZW50ICoqcmVscHAgPSBOVUxMOwotICAgICAgYXJlbGVudCAqKnJlbHBwZW5kID0gTlVMTDsKLSAgICAgIGxvbmcgc3RvcDsKLSAgICAgIGFzeW1ib2wgKnN5bSA9IE5VTEw7Ci0gICAgICBsb25nIHBsYWNlID0gMDsKLQotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwCi0JICB8fCAoISBkaXNhc3NlbWJsZV9hbGwKLQkgICAgICAmJiBvbmx5ID09IE5VTEwKLQkgICAgICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkpCi0JY29udGludWU7Ci0gICAgICBpZiAob25seSAhPSAoY2hhciAqKSBOVUxMICYmIHN0cmNtcCAob25seSwgc2VjdGlvbi0+bmFtZSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGR1bXBfcmVsb2NfaW5mbwotCSAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGxvbmcgcmVsc2l6ZTsKLQotCSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlY3Rpb24pOwotCSAgaWYgKHJlbHNpemUgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotCSAgaWYgKHJlbHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgbG9uZyByZWxjb3VudDsKLQotCSAgICAgIHJlbGJ1ZiA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLQkgICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbGJ1Ziwgc3ltcyk7Ci0JICAgICAgaWYgKHJlbGNvdW50IDwgMCkKLQkJYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgICAgICAvKiBTb3J0IHRoZSByZWxvY3MgYnkgYWRkcmVzcy4gICovCi0JICAgICAgcXNvcnQgKHJlbGJ1ZiwgcmVsY291bnQsIHNpemVvZiAoYXJlbGVudCAqKSwgY29tcGFyZV9yZWxvY3MpOwotCi0JICAgICAgcmVscHAgPSByZWxidWY7Ci0JICAgICAgcmVscHBlbmQgPSByZWxwcCArIHJlbGNvdW50OwotCi0JICAgICAgLyogU2tpcCBvdmVyIHRoZSByZWxvY3MgYmVsb25naW5nIHRvIGFkZHJlc3NlcyBiZWxvdyB0aGUKLQkJIHN0YXJ0IGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChzdGFydF9hZGRyZXNzICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIHdoaWxlIChyZWxwcCA8IHJlbHBwZW5kCi0JCQkgJiYgKCpyZWxwcCktPmFkZHJlc3MgPCBzdGFydF9hZGRyZXNzKQotCQkgICAgKytyZWxwcDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBwcmludGYgKF8oIkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gJXM6XG4iKSwgc2VjdGlvbi0+bmFtZSk7Ci0KLSAgICAgIGRhdGFzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0aW9uKTsKLSAgICAgIGlmIChkYXRhc2l6ZSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBkYXRhID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKChzaXplX3QpIGRhdGFzaXplKTsKLQotICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBkYXRhLCAwLCBkYXRhc2l6ZSk7Ci0KLSAgICAgIGF1eC5zZWMgPSBzZWN0aW9uOwotICAgICAgZGlzYXNtX2luZm8uYnVmZmVyID0gZGF0YTsKLSAgICAgIGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWEgPSBzZWN0aW9uLT52bWE7Ci0gICAgICBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoID0gZGF0YXNpemU7Ci0gICAgICBpZiAoc3RhcnRfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEKLQkgIHx8IHN0YXJ0X2FkZHJlc3MgPCBkaXNhc21faW5mby5idWZmZXJfdm1hKQotCWkgPSAwOwotICAgICAgZWxzZQotCWkgPSBzdGFydF9hZGRyZXNzIC0gZGlzYXNtX2luZm8uYnVmZmVyX3ZtYTsKLSAgICAgIGlmIChzdG9wX2FkZHJlc3MgPT0gKGJmZF92bWEpIC0xKQotCXN0b3AgPSBkYXRhc2l6ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc3RvcF9hZGRyZXNzIDwgZGlzYXNtX2luZm8uYnVmZmVyX3ZtYSkKLQkgICAgc3RvcCA9IDA7Ci0JICBlbHNlCi0JICAgIHN0b3AgPSBzdG9wX2FkZHJlc3MgLSBkaXNhc21faW5mby5idWZmZXJfdm1hOwotCSAgaWYgKHN0b3AgPiBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoKQotCSAgICBzdG9wID0gZGlzYXNtX2luZm8uYnVmZmVyX2xlbmd0aDsKLQl9Ci0KLSAgICAgIHN5bSA9IGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhYmZkLCBzZWN0aW9uLCBzZWN0aW9uLT52bWEgKyBpLAotCQkJCSAgICAgdHJ1ZSwgJnBsYWNlKTsKLQotICAgICAgd2hpbGUgKGkgPCBzdG9wKQotCXsKLQkgIGFzeW1ib2wgKm5leHRzeW07Ci0JICBsb25nIG5leHRzdG9wOwotCSAgYm9vbGVhbiBpbnNuczsKLQkgIAotCSAgaWYgKHN5bSAhPSBOVUxMICYmIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIDw9IHNlY3Rpb24tPnZtYSArIGkpCi0JICAgIHsKLQkgICAgICBpbnQgeDsKLQotCSAgICAgIGZvciAoeCA9IHBsYWNlOwotCQkgICAoeCA8IHNvcnRlZF9zeW1jb3VudAotCQkgICAgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3hdKSA8PSBzZWN0aW9uLT52bWEgKyBpKTsKLQkJICAgKyt4KQotCQljb250aW51ZTsKLQkgICAgICBkaXNhc21faW5mby5zeW1ib2xzID0gJiBzb3J0ZWRfc3ltc1twbGFjZV07Ci0JICAgICAgZGlzYXNtX2luZm8ubnVtX3N5bWJvbHMgPSB4IC0gcGxhY2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZGlzYXNtX2luZm8uc3ltYm9scyA9IE5VTEw7Ci0KLQkgIGlmICghIHByZWZpeF9hZGRyZXNzZXMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICAgIG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSAoYWJmZCwgc2VjdGlvbiwgc3ltLAotCQkJCQkgICBzZWN0aW9uLT52bWEgKyBpLAotCQkJCQkgICAmZGlzYXNtX2luZm8sCi0JCQkJCSAgIGZhbHNlKTsKLQkgICAgICBwcmludGYgKCI6XG4iKTsKLQkgICAgfQotCSAgCi0JICBpZiAoc3ltICE9IE5VTEwgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBzZWN0aW9uLT52bWEgKyBpKQotCSAgICBuZXh0c3ltID0gc3ltOwotCSAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgIG5leHRzeW0gPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2VhcmNoIGZvcndhcmQgZm9yIHRoZSBuZXh0IGFwcHJvcHJpYXRlIHN5bWJvbCBpbgotICAgICAgICAgICAgICAgICBTRUNUSU9OLiAgTm90ZSB0aGF0IGFsbCB0aGUgc3ltYm9scyBhcmUgc29ydGVkCi0gICAgICAgICAgICAgICAgIHRvZ2V0aGVyIGludG8gb25lIGJpZyBhcnJheSwgYW5kIHRoYXQgc29tZSBzZWN0aW9ucwotICAgICAgICAgICAgICAgICBtYXkgaGF2ZSBvdmVybGFwcGluZyBhZGRyZXNzZXMuICAqLwotCSAgICAgIHdoaWxlIChwbGFjZSA8IHNvcnRlZF9zeW1jb3VudAotCQkgICAgICYmIChzb3J0ZWRfc3ltc1twbGFjZV0tPnNlY3Rpb24gIT0gc2VjdGlvbgotCQkJIHx8IChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbcGxhY2VdKQotCQkJICAgICA8PSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpKQotCQkrK3BsYWNlOwotCSAgICAgIGlmIChwbGFjZSA+PSBzb3J0ZWRfc3ltY291bnQpCi0JCW5leHRzeW0gPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJbmV4dHN5bSA9IHNvcnRlZF9zeW1zW3BsYWNlXTsKLQkgICAgfQotCSAgCi0JICBpZiAoc3ltICE9IE5VTEwgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBzZWN0aW9uLT52bWEgKyBpKQotCSAgICB7Ci0JICAgICAgbmV4dHN0b3AgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICBpZiAobmV4dHN0b3AgPiBzdG9wKQotCQluZXh0c3RvcCA9IHN0b3A7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG5leHRzeW0gPT0gTlVMTCkKLQkgICAgbmV4dHN0b3AgPSBzdG9wOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmV4dHN0b3AgPSBiZmRfYXN5bWJvbF92YWx1ZSAobmV4dHN5bSkgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgaWYgKG5leHRzdG9wID4gc3RvcCkKLQkJbmV4dHN0b3AgPSBzdG9wOwotCSAgICB9Ci0JICAKLQkgIC8qIElmIGEgc3ltYm9sIGlzIGV4cGxpY2l0bHkgbWFya2VkIGFzIGJlaW5nIGFuIG9iamVjdAotCSAgICAgcmF0aGVyIHRoYW4gYSBmdW5jdGlvbiwganVzdCBkdW1wIHRoZSBieXRlcyB3aXRob3V0Ci0JICAgICBkaXNhc3NlbWJsaW5nIHRoZW0uICAqLwotCSAgaWYgKGRpc2Fzc2VtYmxlX2FsbAotCSAgICAgIHx8IHN5bSA9PSBOVUxMCi0JICAgICAgfHwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBzZWN0aW9uLT52bWEgKyBpCi0JICAgICAgfHwgKChzeW0tPmZsYWdzICYgQlNGX09CSkVDVCkgPT0gMAotCQkgICYmIChzdHJzdHIgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJnbnVfY29tcGlsZWQiKQotCQkgICAgICA9PSBOVUxMKQotCQkgICYmIChzdHJzdHIgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJnY2MyX2NvbXBpbGVkIikKLQkJICAgICAgPT0gTlVMTCkpCi0JICAgICAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDApCi0JICAgIGluc25zID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgaW5zbnMgPSBmYWxzZTsKLQkgIAotCSAgZGlzYXNzZW1ibGVfYnl0ZXMgKCZkaXNhc21faW5mbywgZGlzYXNzZW1ibGVfZm4sIGluc25zLCBkYXRhLCBpLAotCQkJICAgICBuZXh0c3RvcCwgJnJlbHBwLCByZWxwcGVuZCk7Ci0JICAKLQkgIGkgPSBuZXh0c3RvcDsKLQkgIHN5bSA9IG5leHRzeW07Ci0JfQotICAgICAgCi0gICAgICBmcmVlIChkYXRhKTsKLSAgICAgIGlmIChyZWxidWYgIT0gTlVMTCkKLQlmcmVlIChyZWxidWYpOwotICAgIH0KLSAgZnJlZSAoc29ydGVkX3N5bXMpOwotfQotDAotCi0vKiBEZWZpbmUgYSB0YWJsZSBvZiBzdGFiIHZhbHVlcyBhbmQgcHJpbnQtc3RyaW5ncy4gIFdlIHdpc2ggdGhlIGluaXRpYWxpemVyCi0gICBjb3VsZCBiZSBhIGRpcmVjdC1tYXBwZWQgdGFibGUsIGJ1dCBpbnN0ZWFkIHdlIGJ1aWxkIG9uZSB0aGUgZmlyc3QKLSAgIHRpbWUgd2UgbmVlZCBpdC4gICovCi0KLXN0YXRpYyB2b2lkIGR1bXBfc2VjdGlvbl9zdGFicyBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKnN0YWJzZWN0X25hbWUsCi0JCQkJCWNoYXIgKnN0cnNlY3RfbmFtZSkpOwotCi0vKiBEdW1wIHRoZSBzdGFicyBzZWN0aW9ucyBmcm9tIGFuIG9iamVjdCBmaWxlIHRoYXQgaGFzIGEgc2VjdGlvbiB0aGF0Ci0gICB1c2VzIFN1biBzdGFicyBlbmNvZGluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1kdW1wX3N0YWJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGR1bXBfc2VjdGlvbl9zdGFicyAoYWJmZCwgIi5zdGFiIiwgIi5zdGFic3RyIik7Ci0gIGR1bXBfc2VjdGlvbl9zdGFicyAoYWJmZCwgIi5zdGFiLmV4Y2wiLCAiLnN0YWIuZXhjbHN0ciIpOwotICBkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsICIuc3RhYi5pbmRleCIsICIuc3RhYi5pbmRleHN0ciIpOwotICBkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsICIkR0RCX1NZTUJPTFMkIiwgIiRHREJfU1RSSU5HUyQiKTsKLX0KLQotc3RhdGljIGJmZF9ieXRlICpzdGFiczsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHN0YWJfc2l6ZTsKLQotc3RhdGljIGNoYXIgKnN0cnRhYjsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHN0YWJzdHJfc2l6ZTsKLQotLyogUmVhZCBBQkZEJ3Mgc3RhYnMgc2VjdGlvbiBTVEFCU0VDVF9OQU1FIGludG8gYHN0YWJzJwotICAgYW5kIHN0cmluZyB0YWJsZSBzZWN0aW9uIFNUUlNFQ1RfTkFNRSBpbnRvIGBzdHJ0YWInLgotICAgSWYgdGhlIHNlY3Rpb24gZXhpc3RzIGFuZCB3YXMgcmVhZCwgYWxsb2NhdGUgdGhlIHNwYWNlIGFuZCByZXR1cm4gdHJ1ZS4KLSAgIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcmVhZF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzdGFic2VjdF9uYW1lLCBzdHJzZWN0X25hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqc3RhYnNlY3RfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqc3Ryc2VjdF9uYW1lOwotewotICBhc2VjdGlvbiAqc3RhYnNlY3QsICpzdGFic3Ryc2VjdDsKLQotICBzdGFic2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdGFic2VjdF9uYW1lKTsKLSAgaWYgKDAgPT0gc3RhYnNlY3QpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJObyAlcyBzZWN0aW9uIHByZXNlbnRcblxuIiksIHN0YWJzZWN0X25hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzdGFic3Ryc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdHJzZWN0X25hbWUpOwotICBpZiAoMCA9PSBzdGFic3Ryc2VjdCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlcyBoYXMgbm8gJXMgc2VjdGlvblxuIiksIHByb2dyYW1fbmFtZSwKLQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN0cnNlY3RfbmFtZSk7Ci0gICAgICBleGl0X3N0YXR1cyA9IDE7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotIAotICBzdGFiX3NpemUgICAgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdGFic2VjdCk7Ci0gIHN0YWJzdHJfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0YWJzdHJzZWN0KTsKLQotICBzdGFicyAgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc3RhYl9zaXplKTsKLSAgc3RydGFiID0gKGNoYXIgKikgeG1hbGxvYyAoc3RhYnN0cl9zaXplKTsKLSAgCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3RhYnNlY3QsIChQVFIpIHN0YWJzLCAwLCBzdGFiX3NpemUpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IFJlYWRpbmcgJXMgc2VjdGlvbiBvZiAlcyBmYWlsZWQ6ICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBzdGFic2VjdF9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgZnJlZSAoc3RhYnMpOwotICAgICAgZnJlZSAoc3RydGFiKTsKLSAgICAgIGV4aXRfc3RhdHVzID0gMTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic3Ryc2VjdCwgKFBUUikgc3RydGFiLCAwLAotCQkJCSAgc3RhYnN0cl9zaXplKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBSZWFkaW5nICVzIHNlY3Rpb24gb2YgJXMgZmFpbGVkOiAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgc3Ryc2VjdF9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgZnJlZSAoc3RhYnMpOwotICAgICAgZnJlZSAoc3RydGFiKTsKLSAgICAgIGV4aXRfc3RhdHVzID0gMTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YWJzIGVudHJpZXMgdXNlIGEgMTIgYnl0ZSBmb3JtYXQ6Ci0gICAgIDQgYnl0ZSBzdHJpbmcgdGFibGUgaW5kZXgKLSAgICAgMSBieXRlIHN0YWIgdHlwZQotICAgICAxIGJ5dGUgc3RhYiBvdGhlciBmaWVsZAotICAgICAyIGJ5dGUgc3RhYiBkZXNjIGZpZWxkCi0gICAgIDQgYnl0ZSBzdGFiIHZhbHVlCi0gICBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIGZvciBhIDY0IGJpdCBvYmplY3QgZm9ybWF0LiAgKi8KLQotI2RlZmluZSBTVFJEWE9GRiAoMCkKLSNkZWZpbmUgVFlQRU9GRiAoNCkKLSNkZWZpbmUgT1RIRVJPRkYgKDUpCi0jZGVmaW5lIERFU0NPRkYgKDYpCi0jZGVmaW5lIFZBTE9GRiAoOCkKLSNkZWZpbmUgU1RBQlNJWkUgKDEyKQotCi0vKiBQcmludCBBQkZEJ3Mgc3RhYnMgc2VjdGlvbiBTVEFCU0VDVF9OQU1FIChpbiBgc3RhYnMnKSwKLSAgIHVzaW5nIHN0cmluZyB0YWJsZSBzZWN0aW9uIFNUUlNFQ1RfTkFNRSAoaW4gYHN0cnRhYicpLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpzdGFic2VjdF9uYW1lOwotICAgICBjb25zdCBjaGFyICpzdHJzZWN0X25hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCA9IDAsIG5leHRfZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gMDsKLSAgYmZkX2J5dGUgKnN0YWJwLCAqc3RhYnNfZW5kOwotCi0gIHN0YWJwID0gc3RhYnM7Ci0gIHN0YWJzX2VuZCA9IHN0YWJwICsgc3RhYl9zaXplOwotCi0gIHByaW50ZiAoXygiQ29udGVudHMgb2YgJXMgc2VjdGlvbjpcblxuIiksIHN0YWJzZWN0X25hbWUpOwotICBwcmludGYgKCJTeW1udW0gbl90eXBlIG5fb3RociBuX2Rlc2Mgbl92YWx1ZSAgbl9zdHJ4IFN0cmluZ1xuIik7Ci0KLSAgLyogTG9vcCB0aHJvdWdoIGFsbCBzeW1ib2xzIGFuZCBwcmludCB0aGVtLgotCi0gICAgIFdlIHN0YXJ0IHRoZSBpbmRleCBhdCAtMSBiZWNhdXNlIHRoZXJlIGlzIGEgZHVtbXkgc3ltYm9sIG9uCi0gICAgIHRoZSBmcm9udCBvZiBzdGFicy1pbi17Y29mZixlbGZ9IHNlY3Rpb25zIHRoYXQgc3VwcGxpZXMgc2l6ZXMuICAqLwotCi0gIGZvciAoaSA9IC0xOyBzdGFicCA8IHN0YWJzX2VuZDsgc3RhYnAgKz0gU1RBQlNJWkUsIGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgdW5zaWduZWQgbG9uZyBzdHJ4OwotICAgICAgdW5zaWduZWQgY2hhciB0eXBlLCBvdGhlcjsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGRlc2M7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotCi0gICAgICBzdHJ4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzdGFicCArIFNUUkRYT0ZGKTsKLSAgICAgIHR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgc3RhYnAgKyBUWVBFT0ZGKTsKLSAgICAgIG90aGVyID0gYmZkX2hfZ2V0XzggKGFiZmQsIHN0YWJwICsgT1RIRVJPRkYpOwotICAgICAgZGVzYyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3RhYnAgKyBERVNDT0ZGKTsKLSAgICAgIHZhbHVlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzdGFicCArIFZBTE9GRik7Ci0KLSAgICAgIHByaW50ZiAoIlxuJS02ZCAiLCBpKTsKLSAgICAgIC8qIEVpdGhlciBwcmludCB0aGUgc3RhYiBuYW1lLCBvciwgaWYgdW5uYW1lZCwgcHJpbnQgaXRzIG51bWJlcgotCSBhZ2FpbiAobWFrZXMgY29uc2lzdGVudCBmb3JtYXR0aW5nIGZvciB0b29scyBsaWtlIGF3aykuICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zdGFiX25hbWUgKHR5cGUpOwotICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKLQlwcmludGYgKCIlLTZzIiwgbmFtZSk7Ci0gICAgICBlbHNlIGlmICh0eXBlID09IE5fVU5ERikKLQlwcmludGYgKCJIZHJTeW0iKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlLTZkIiwgdHlwZSk7Ci0gICAgICBwcmludGYgKCIgJS02ZCAlLTZkICIsIG90aGVyLCBkZXNjKTsKLSAgICAgIHByaW50Zl92bWEgKHZhbHVlKTsKLSAgICAgIHByaW50ZiAoIiAlLTZsdSIsIHN0cngpOwotCi0gICAgICAvKiBTeW1ib2xzIHdpdGggdHlwZSA9PSAwIChOX1VOREYpIHNwZWNpZnkgdGhlIGxlbmd0aCBvZiB0aGUKLQkgc3RyaW5nIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUuICBXZSB1c2UgdGhhdCBpbmZvCi0JIHRvIGtub3cgaG93IHRvIHJlbG9jYXRlIHRoZSAqbmV4dCogZmlsZSdzIHN0cmluZyB0YWJsZSBpbmRpY2VzLiAgKi8KLQotICAgICAgaWYgKHR5cGUgPT0gTl9VTkRGKQotCXsKLQkgIGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCA9IG5leHRfZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0OwotCSAgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgKz0gdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFVzaW5nIHRoZSAocG9zc2libHkgdXBkYXRlZCkgc3RyaW5nIHRhYmxlIG9mZnNldCwgcHJpbnQgdGhlCi0JICAgICBzdHJpbmcgKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3ltYm9sLiAgKi8KLQotCSAgaWYgKChzdHJ4ICsgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0KSA8IHN0YWJzdHJfc2l6ZSkKLQkgICAgcHJpbnRmICgiICVzIiwgJnN0cnRhYltzdHJ4ICsgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0XSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiAqIik7Ci0JfQotICAgIH0KLSAgcHJpbnRmICgiXG5cbiIpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzdGFic2VjdF9uYW1lLCBzdHJzZWN0X25hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqc3RhYnNlY3RfbmFtZTsKLSAgICAgY2hhciAqc3Ryc2VjdF9uYW1lOwotewotICBhc2VjdGlvbiAqczsKLQotICAvKiBDaGVjayBmb3Igc2VjdGlvbiBuYW1lcyBmb3Igd2hpY2ggc3RhYnNlY3RfbmFtZSBpcyBhIHByZWZpeCwgdG8KLSAgICAgaGFuZGxlIC5zdGFiMCwgZXRjLiAgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgcyAhPSBOVUxMOwotICAgICAgIHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBsZW47Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoc3RhYnNlY3RfbmFtZSk7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmVmaXggbWF0Y2hlcywgYW5kIHRoZSBmaWxlcyBzZWN0aW9uIG5hbWUgZW5kcyB3aXRoIGEKLQkgbnVsIG9yIGEgZGlnaXQsIHRoZW4gd2UgbWF0Y2guICBJLmUuLCB3ZSB3YW50IGVpdGhlciBhbiBleGFjdAotCSBtYXRjaCBvciBhIHNlY3Rpb24gZm9sbG93ZWQgYnkgYSBudW1iZXIuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKHN0YWJzZWN0X25hbWUsIHMtPm5hbWUsIGxlbikgPT0gMAotCSAgJiYgKHMtPm5hbWVbbGVuXSA9PSAnXDAwMCcKLQkgICAgICB8fCBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgcy0+bmFtZVtsZW5dKSkpCi0JewotCSAgaWYgKHJlYWRfc2VjdGlvbl9zdGFicyAoYWJmZCwgcy0+bmFtZSwgc3Ryc2VjdF9uYW1lKSkKLQkgICAgewotCSAgICAgIHByaW50X3NlY3Rpb25fc3RhYnMgKGFiZmQsIHMtPm5hbWUsIHN0cnNlY3RfbmFtZSk7Ci0JICAgICAgZnJlZSAoc3RhYnMpOwotCSAgICAgIGZyZWUgKHN0cnRhYik7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotDAotc3RhdGljIHZvaWQKLWR1bXBfYmZkX2hlYWRlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpjb21tYSA9ICIiOwotCi0gIHByaW50ZiAoXygiYXJjaGl0ZWN0dXJlOiAlcywgIiksCi0JICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYmZkX2dldF9hcmNoIChhYmZkKSwKLQkJCQkgICBiZmRfZ2V0X21hY2ggKGFiZmQpKSk7Ci0gIHByaW50ZiAoXygiZmxhZ3MgMHglMDh4OlxuIiksIGFiZmQtPmZsYWdzKTsKLQotI2RlZmluZSBQRih4LCB5KSAgICBpZiAoYWJmZC0+ZmxhZ3MgJiB4KSB7cHJpbnRmKCIlcyVzIiwgY29tbWEsIHkpOyBjb21tYT0iLCAiO30KLSAgUEYgKEhBU19SRUxPQywgIkhBU19SRUxPQyIpOwotICBQRiAoRVhFQ19QLCAiRVhFQ19QIik7Ci0gIFBGIChIQVNfTElORU5PLCAiSEFTX0xJTkVOTyIpOwotICBQRiAoSEFTX0RFQlVHLCAiSEFTX0RFQlVHIik7Ci0gIFBGIChIQVNfU1lNUywgIkhBU19TWU1TIik7Ci0gIFBGIChIQVNfTE9DQUxTLCAiSEFTX0xPQ0FMUyIpOwotICBQRiAoRFlOQU1JQywgIkRZTkFNSUMiKTsKLSAgUEYgKFdQX1RFWFQsICJXUF9URVhUIik7Ci0gIFBGIChEX1BBR0VELCAiRF9QQUdFRCIpOwotICBQRiAoQkZEX0lTX1JFTEFYQUJMRSwgIkJGRF9JU19SRUxBWEFCTEUiKTsKLSAgcHJpbnRmIChfKCJcbnN0YXJ0IGFkZHJlc3MgMHgiKSk7Ci0gIHByaW50Zl92bWEgKGFiZmQtPnN0YXJ0X2FkZHJlc3MpOwotICBwcmludGYgKCJcbiIpOwotfQotDAotc3RhdGljIHZvaWQKLWR1bXBfYmZkX3ByaXZhdGVfaGVhZGVyIChhYmZkKQotYmZkICphYmZkOwotewotICBiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgc3Rkb3V0KTsKLX0KLQotLyogRHVtcCBzZWxlY3RlZCBjb250ZW50cyBvZiBBQkZEICovCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2JmZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBJZiB3ZSBhcmUgYWRqdXN0aW5nIHNlY3Rpb24gVk1BJ3MsIGNoYW5nZSB0aGVtIGFsbCBub3cuICBDaGFuZ2luZwotICAgICB0aGUgQkZEIGluZm9ybWF0aW9uIGlzIGEgaGFjay4gIEhvd2V2ZXIsIHdlIG11c3QgZG8gaXQsIG9yCi0gICAgIGJmZF9maW5kX25lYXJlc3RfbGluZSB3aWxsIG5vdCBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLwotICBpZiAoYWRqdXN0X3NlY3Rpb25fdm1hICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIHMtPnZtYSArPSBhZGp1c3Rfc2VjdGlvbl92bWE7Ci0JICBzLT5sbWEgKz0gYWRqdXN0X3NlY3Rpb25fdm1hOwotCX0KLSAgICB9Ci0KLSAgcHJpbnRmIChfKCJcbiVzOiAgICAgZmlsZSBmb3JtYXQgJXNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgIGFiZmQtPnh2ZWMtPm5hbWUpOwotICBpZiAoZHVtcF9hcl9oZHJzKQotICAgIHByaW50X2FyZWx0X2Rlc2NyIChzdGRvdXQsIGFiZmQsIHRydWUpOwotICBpZiAoZHVtcF9maWxlX2hlYWRlcikKLSAgICBkdW1wX2JmZF9oZWFkZXIgKGFiZmQpOwotICBpZiAoZHVtcF9wcml2YXRlX2hlYWRlcnMpCi0gICAgZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgKGFiZmQpOwotICBwdXRjaGFyICgnXG4nKTsKLSAgaWYgKGR1bXBfc2VjdGlvbl9oZWFkZXJzKQotICAgIGR1bXBfaGVhZGVycyAoYWJmZCk7Ci0gIGlmIChkdW1wX3N5bXRhYiB8fCBkdW1wX3JlbG9jX2luZm8gfHwgZGlzYXNzZW1ibGUgfHwgZHVtcF9kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgc3ltcyA9IHNsdXJwX3N5bXRhYiAoYWJmZCk7Ci0gICAgfQotICBpZiAoZHVtcF9keW5hbWljX3N5bXRhYiB8fCBkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbykKLSAgICB7Ci0gICAgICBkeW5zeW1zID0gc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpOwotICAgIH0KLSAgaWYgKGR1bXBfc3ltdGFiKQotICAgIGR1bXBfc3ltYm9scyAoYWJmZCwgZmFsc2UpOwotICBpZiAoZHVtcF9keW5hbWljX3N5bXRhYikKLSAgICBkdW1wX3N5bWJvbHMgKGFiZmQsIHRydWUpOwotICBpZiAoZHVtcF9zdGFiX3NlY3Rpb25faW5mbykKLSAgICBkdW1wX3N0YWJzIChhYmZkKTsKLSAgaWYgKGR1bXBfcmVsb2NfaW5mbyAmJiAhIGRpc2Fzc2VtYmxlKQotICAgIGR1bXBfcmVsb2NzIChhYmZkKTsKLSAgaWYgKGR1bXBfZHluYW1pY19yZWxvY19pbmZvKQotICAgIGR1bXBfZHluYW1pY19yZWxvY3MgKGFiZmQpOwotICBpZiAoZHVtcF9zZWN0aW9uX2NvbnRlbnRzKQotICAgIGR1bXBfZGF0YSAoYWJmZCk7Ci0gIGlmIChkaXNhc3NlbWJsZSkKLSAgICBkaXNhc3NlbWJsZV9kYXRhIChhYmZkKTsKLSAgaWYgKGR1bXBfZGVidWdnaW5nKQotICAgIHsKLSAgICAgIFBUUiBkaGFuZGxlOwotCi0gICAgICBkaGFuZGxlID0gcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQpOwotICAgICAgaWYgKGRoYW5kbGUgIT0gTlVMTCkKLQl7Ci0JICBpZiAoISBwcmludF9kZWJ1Z2dpbmdfaW5mbyAoc3Rkb3V0LCBkaGFuZGxlKSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBwcmludGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmFpbGVkXG4iKSwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgICAgICBleGl0X3N0YXR1cyA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoc3ltcykKLSAgICB7Ci0gICAgICBmcmVlIChzeW1zKTsKLSAgICAgIHN5bXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGR5bnN5bXMpCi0gICAgewotICAgICAgZnJlZSAoZHluc3ltcyk7Ci0gICAgICBkeW5zeW1zID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2JmZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBkdW1wX2JmZCAoYWJmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0gICAgewotICAgICAgbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotICAgICAgZnJlZSAobWF0Y2hpbmcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfY29yZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBkdW1wX2JmZCAoYWJmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLSAgICAgIGZyZWUgKG1hdGNoaW5nKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotICAgICBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqZmlsZSwgKmFyZmlsZSA9IChiZmQgKikgTlVMTDsKLQotICBmaWxlID0gYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpID09IHRydWUpCi0gICAgewotICAgICAgYmZkICpsYXN0X2FyZmlsZSA9IE5VTEw7Ci0KLSAgICAgIHByaW50ZiAoXygiSW4gYXJjaGl2ZSAlczpcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7Ci0gICAgICBmb3IgKDs7KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0KLQkgIGFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGZpbGUsIGFyZmlsZSk7Ci0JICBpZiAoYXJmaWxlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcykKLQkJbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBkaXNwbGF5X2JmZCAoYXJmaWxlKTsKLQotCSAgaWYgKGxhc3RfYXJmaWxlICE9IE5VTEwpCi0JICAgIGJmZF9jbG9zZSAobGFzdF9hcmZpbGUpOwotCSAgbGFzdF9hcmZpbGUgPSBhcmZpbGU7Ci0JfQotCi0gICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQliZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBkaXNwbGF5X2JmZCAoZmlsZSk7Ci0KLSAgYmZkX2Nsb3NlIChmaWxlKTsKLX0KLQwKLS8qIEFjdHVhbGx5IGRpc3BsYXkgdGhlIHZhcmlvdXMgcmVxdWVzdGVkIHJlZ2lvbnMgKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBiZmRfc2l6ZV90eXBlIHN0YXJ0LCBzdG9wOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPQotICAgICAgIHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IG9uYWxpbmUgPSAxNjsKLQotICAgICAgaWYgKG9ubHkgPT0gKGNoYXIgKikgTlVMTCB8fAotCSAgc3RyY21wIChvbmx5LCBzZWN0aW9uLT5uYW1lKSA9PSAwKQotCXsKLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iKSwgc2VjdGlvbi0+bmFtZSk7Ci0KLQkgICAgICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgZGF0YSA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0JICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQotCi0JICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCAwLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0KLQkgICAgICBpZiAoc3RhcnRfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEKLQkJICB8fCBzdGFydF9hZGRyZXNzIDwgc2VjdGlvbi0+dm1hKQotCQlzdGFydCA9IDA7Ci0JICAgICAgZWxzZQotCQlzdGFydCA9IHN0YXJ0X2FkZHJlc3MgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCi0JCXN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoc3RvcF9hZGRyZXNzIDwgc2VjdGlvbi0+dm1hKQotCQkgICAgc3RvcCA9IDA7Ci0JCSAgZWxzZQotCQkgICAgc3RvcCA9IHN0b3BfYWRkcmVzcyAtIHNlY3Rpb24tPnZtYTsKLQkJICBpZiAoc3RvcCA+IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKQotCQkgICAgc3RvcCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotCQl9Ci0JICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIGo7Ci0KLQkJICBwcmludGYgKCIgJTA0bHggIiwgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSkpOwotCQkgIGZvciAoaiA9IGk7IGogPCBpICsgb25hbGluZTsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoaiA8IHN0b3ApCi0JCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSAoZGF0YVtqXSkpOwotCQkgICAgICBlbHNlCi0JCQlwcmludGYgKCIgICIpOwotCQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQotCQkJcHJpbnRmICgiICIpOwotCQkgICAgfQotCi0JCSAgcHJpbnRmICgiICIpOwotCQkgIGZvciAoaiA9IGk7IGogPCBpICsgb25hbGluZTsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoaiA+PSBzdG9wKQotCQkJcHJpbnRmICgiICIpOwotCQkgICAgICBlbHNlCi0JCQlwcmludGYgKCIlYyIsIGlzcHJpbnQgKGRhdGFbal0pID8gZGF0YVtqXSA6ICcuJyk7Ci0JCSAgICB9Ci0JCSAgcHV0Y2hhciAoJ1xuJyk7Ci0JCX0KLQkgICAgICBmcmVlIChkYXRhKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFNob3VsZCBwZXJoYXBzIHNoYXJlIGNvZGUgYW5kIGRpc3BsYXkgd2l0aCBubT8gKi8KLXN0YXRpYyB2b2lkCi1kdW1wX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIGFzeW1ib2wgKipjdXJyZW50OwotICBsb25nIG1heDsKLSAgbG9uZyBjb3VudDsKLQotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICBjdXJyZW50ID0gZHluc3ltczsKLSAgICAgIG1heCA9IGR5bnN5bWNvdW50OwotICAgICAgaWYgKG1heCA9PSAwKQotCXJldHVybjsKLSAgICAgIHByaW50ZiAoIkRZTkFNSUMgU1lNQk9MIFRBQkxFOlxuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY3VycmVudCA9IHN5bXM7Ci0gICAgICBtYXggPSBzeW1jb3VudDsKLSAgICAgIGlmIChtYXggPT0gMCkKLQlyZXR1cm47Ci0gICAgICBwcmludGYgKCJTWU1CT0wgVEFCTEU6XG4iKTsKLSAgICB9Ci0KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbWF4OyBjb3VudCsrKQotICAgIHsKLSAgICAgIGlmICgqY3VycmVudCkKLQl7Ci0JICBiZmQgKmN1cl9iZmQgPSBiZmRfYXN5bWJvbF9iZmQgKCpjdXJyZW50KTsKLQotCSAgaWYgKGN1cl9iZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgICAgY2hhciAqYWxsb2M7Ci0KLQkgICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKmN1cnJlbnQpOwotCSAgICAgIGFsbG9jID0gTlVMTDsKLQkgICAgICBpZiAoZG9fZGVtYW5nbGUgJiYgbmFtZSAhPSBOVUxMICYmICpuYW1lICE9ICdcMCcpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuOwotCi0JCSAgLyogSWYgd2Ugd2FudCB0byBkZW1hbmdsZSB0aGUgbmFtZSwgd2UgZGVtYW5nbGUgaXQKLSAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGFuZCB0ZW1wb3JhcmlseSBjbG9iYmVyIGl0IHdoaWxlIGNhbGxpbmcKLSAgICAgICAgICAgICAgICAgICAgIGJmZF9wcmludF9zeW1ib2wuICBGSVhNRTogVGhpcyBpcyBhIGdyb3NzIGhhY2suICAqLwotCi0JCSAgbiA9IG5hbWU7Ci0JCSAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoY3VyX2JmZCkgPT0gKm4pCi0JCSAgICArK247Ci0JCSAgYWxsb2MgPSBjcGx1c19kZW1hbmdsZSAobiwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotCQkgIGlmIChhbGxvYyAhPSBOVUxMKQotCQkgICAgKCpjdXJyZW50KS0+bmFtZSA9IGFsbG9jOwotCQkgIGVsc2UKLQkJICAgICgqY3VycmVudCktPm5hbWUgPSBuOwotCQl9Ci0KLQkgICAgICBiZmRfcHJpbnRfc3ltYm9sIChjdXJfYmZkLCBzdGRvdXQsICpjdXJyZW50LAotCQkJCWJmZF9wcmludF9zeW1ib2xfYWxsKTsKLQotCSAgICAgICgqY3VycmVudCktPm5hbWUgPSBuYW1lOwotCSAgICAgIGlmIChhbGxvYyAhPSBOVUxMKQotCQlmcmVlIChhbGxvYyk7Ci0KLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICB9Ci0JfQotICAgICAgY3VycmVudCsrOwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLSAgcHJpbnRmICgiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfcmVsb2NzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudDsKLSAgYXNlY3Rpb24gKmE7Ci0KLSAgZm9yIChhID0gYWJmZC0+c2VjdGlvbnM7IGEgIT0gKGFzZWN0aW9uICopIE5VTEw7IGEgPSBhLT5uZXh0KQotICAgIHsKLSAgICAgIGxvbmcgcmVsc2l6ZTsKLQotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoYSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChhKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGEpKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAob25seSkKLQl7Ci0JICBpZiAoc3RyY21wIChvbmx5LCBhLT5uYW1lKSkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZSBpZiAoKGEtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYSk7Ci0gICAgICBpZiAocmVsc2l6ZSA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIHByaW50ZiAoIlJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWyVzXToiLCBhLT5uYW1lKTsKLQotICAgICAgaWYgKHJlbHNpemUgPT0gMCkKLQl7Ci0JICBwcmludGYgKCIgKG5vbmUpXG5cbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLQkgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgYSwgcmVscHAsIHN5bXMpOwotCSAgaWYgKHJlbGNvdW50IDwgMCkKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBlbHNlIGlmIChyZWxjb3VudCA9PSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgICBkdW1wX3JlbG9jX3NldCAoYWJmZCwgYSwgcmVscHAsIHJlbGNvdW50KTsKLQkgICAgICBwcmludGYgKCJcblxuIik7Ci0JICAgIH0KLQkgIGZyZWUgKHJlbHBwKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9keW5hbWljX3JlbG9jcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHJlbHNpemU7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudDsKLQotICByZWxzaXplID0gYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHJlbHNpemUgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIHByaW50ZiAoIkRZTkFNSUMgUkVMT0NBVElPTiBSRUNPUkRTIik7Ci0KLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIgKG5vbmUpXG5cbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHJlbHBwLCBkeW5zeW1zKTsKLSAgICAgIGlmIChyZWxjb3VudCA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlIGlmIChyZWxjb3VudCA9PSAwKQotCXsKLQkgIHByaW50ZiAoIiAobm9uZSlcblxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIlxuIik7Ci0JICBkdW1wX3JlbG9jX3NldCAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsIHJlbHBwLCByZWxjb3VudCk7Ci0JICBwcmludGYgKCJcblxuIik7Ci0JfQotICAgICAgZnJlZSAocmVscHApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfcmVsb2Nfc2V0IChhYmZkLCBzZWMsIHJlbHBwLCByZWxjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICoqcmVscHA7Ci0gICAgIGxvbmcgcmVsY291bnQ7Ci17Ci0gIGFyZWxlbnQgKipwOwotICBjaGFyICpsYXN0X2ZpbGVuYW1lLCAqbGFzdF9mdW5jdGlvbm5hbWU7Ci0gIHVuc2lnbmVkIGludCBsYXN0X2xpbmU7Ci0KLSAgLyogR2V0IGNvbHVtbiBoZWFkZXJzIGxpbmVkIHVwIHJlYXNvbmFibHkuICAqLwotICB7Ci0gICAgc3RhdGljIGludCB3aWR0aDsKLSAgICBpZiAod2lkdGggPT0gMCkKLSAgICAgIHsKLQljaGFyIGJ1ZlszMF07Ci0Jc3ByaW50Zl92bWEgKGJ1ZiwgKGJmZF92bWEpIC0xKTsKLQl3aWR0aCA9IHN0cmxlbiAoYnVmKSAtIDc7Ci0gICAgICB9Ci0gICAgcHJpbnRmICgiT0ZGU0VUICUqcyBUWVBFICUqcyBWQUxVRSBcbiIsIHdpZHRoLCAiIiwgMTIsICIiKTsKLSAgfQotCi0gIGxhc3RfZmlsZW5hbWUgPSBOVUxMOwotICBsYXN0X2Z1bmN0aW9ubmFtZSA9IE5VTEw7Ci0gIGxhc3RfbGluZSA9IDA7Ci0KLSAgZm9yIChwID0gcmVscHA7IHJlbGNvdW50ICYmICpwICE9IChhcmVsZW50ICopIE5VTEw7IHArKywgcmVsY291bnQtLSkKLSAgICB7Ci0gICAgICBhcmVsZW50ICpxID0gKnA7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKmZ1bmN0aW9ubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpzZWN0aW9uX25hbWU7Ci0KLSAgICAgIGlmIChzdGFydF9hZGRyZXNzICE9IChiZmRfdm1hKSAtMQotCSAgJiYgcS0+YWRkcmVzcyA8IHN0YXJ0X2FkZHJlc3MpCi0JY29udGludWU7Ci0gICAgICBpZiAoc3RvcF9hZGRyZXNzICE9IChiZmRfdm1hKSAtMQotCSAgJiYgcS0+YWRkcmVzcyA+IHN0b3BfYWRkcmVzcykKLQljb250aW51ZTsKLQotICAgICAgaWYgKHdpdGhfbGluZV9udW1iZXJzCi0JICAmJiBzZWMgIT0gTlVMTAotCSAgJiYgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWMsIHN5bXMsIHEtPmFkZHJlc3MsCi0JCQkJICAgICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwgJmxpbmUpKQotCXsKLQkgIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTAotCSAgICAgICYmIChsYXN0X2Z1bmN0aW9ubmFtZSA9PSBOVUxMCi0JCSAgfHwgc3RyY21wIChmdW5jdGlvbm5hbWUsIGxhc3RfZnVuY3Rpb25uYW1lKSAhPSAwKSkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzKCk6XG4iLCBmdW5jdGlvbm5hbWUpOwotCSAgICAgIGlmIChsYXN0X2Z1bmN0aW9ubmFtZSAhPSBOVUxMKQotCQlmcmVlIChsYXN0X2Z1bmN0aW9ubmFtZSk7Ci0JICAgICAgbGFzdF9mdW5jdGlvbm5hbWUgPSB4c3RyZHVwIChmdW5jdGlvbm5hbWUpOwotCSAgICB9Ci0JICBpZiAobGluZSA+IDAKLQkgICAgICAmJiAobGluZSAhPSBsYXN0X2xpbmUKLQkJICB8fCAoZmlsZW5hbWUgIT0gTlVMTAotCQkgICAgICAmJiBsYXN0X2ZpbGVuYW1lICE9IE5VTEwKLQkJICAgICAgJiYgc3RyY21wIChmaWxlbmFtZSwgbGFzdF9maWxlbmFtZSkgIT0gMCkpKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJXM6JXVcbiIsIGZpbGVuYW1lID09IE5VTEwgPyAiPz8/IiA6IGZpbGVuYW1lLCBsaW5lKTsKLQkgICAgICBsYXN0X2xpbmUgPSBsaW5lOwotCSAgICAgIGlmIChsYXN0X2ZpbGVuYW1lICE9IE5VTEwpCi0JCWZyZWUgKGxhc3RfZmlsZW5hbWUpOwotCSAgICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotCQlsYXN0X2ZpbGVuYW1lID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCWxhc3RfZmlsZW5hbWUgPSB4c3RyZHVwIChmaWxlbmFtZSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChxLT5zeW1fcHRyX3B0ciAmJiAqcS0+c3ltX3B0cl9wdHIpCi0JewotCSAgc3ltX25hbWUgPSAoKihxLT5zeW1fcHRyX3B0cikpLT5uYW1lOwotCSAgc2VjdGlvbl9uYW1lID0gKCoocS0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+bmFtZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltX25hbWUgPSBOVUxMOwotCSAgc2VjdGlvbl9uYW1lID0gTlVMTDsKLQl9Ci0gICAgICBpZiAoc3ltX25hbWUpCi0JewotCSAgcHJpbnRmX3ZtYSAocS0+YWRkcmVzcyk7Ci0JICBpZiAocS0+aG93dG8tPm5hbWUpCi0JICAgIHByaW50ZiAoIiAlLTE2cyAgIiwgcS0+aG93dG8tPm5hbWUpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIgJS0xNmQgICIsIHEtPmhvd3RvLT50eXBlKTsKLQkgIG9iamR1bXBfcHJpbnRfc3ltbmFtZSAoYWJmZCwgKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopIE5VTEwsCi0JCQkJICpxLT5zeW1fcHRyX3B0cik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChzZWN0aW9uX25hbWUgPT0gKENPTlNUIGNoYXIgKikgTlVMTCkKLQkgICAgc2VjdGlvbl9uYW1lID0gIip1bmtub3duKiI7Ci0JICBwcmludGZfdm1hIChxLT5hZGRyZXNzKTsKLQkgIHByaW50ZiAoIiAlLTE2cyAgWyVzXSIsCi0JCSAgcS0+aG93dG8tPm5hbWUsCi0JCSAgc2VjdGlvbl9uYW1lKTsKLQl9Ci0gICAgICBpZiAocS0+YWRkZW5kKQotCXsKLQkgIHByaW50ZiAoIisweCIpOwotCSAgcHJpbnRmX3ZtYSAocS0+YWRkZW5kKTsKLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQwKLS8qIFRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgYXJjaGl0ZWN0dXJlIG5hbWUgKyAxLiAgKi8KLSNkZWZpbmUgTE9OR0VTVF9BUkNIIHNpemVvZigicnM2MDAwOjYwMDAiKQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1lbmRpYW5fc3RyaW5nIChlbmRpYW4pCi0gICAgIGVudW0gYmZkX2VuZGlhbiBlbmRpYW47Ci17Ci0gIGlmIChlbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0gICAgcmV0dXJuICJiaWcgZW5kaWFuIjsKLSAgZWxzZSBpZiAoZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotICAgIHJldHVybiAibGl0dGxlIGVuZGlhbiI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImVuZGlhbm5lc3MgdW5rbm93biI7Ci19Ci0KLS8qIExpc3QgdGhlIHRhcmdldHMgdGhhdCBCRkQgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0LCBlYWNoIGZvbGxvd2VkCi0gICBieSBpdHMgZW5kaWFubmVzcyBhbmQgdGhlIGFyY2hpdGVjdHVyZXMgaXQgc3VwcG9ydHMuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV90YXJnZXRfbGlzdCAoKQotewotICBleHRlcm4gYmZkX3RhcmdldCAqYmZkX3RhcmdldF92ZWN0b3JbXTsKLSAgY2hhciAqZHVtbXlfbmFtZTsKLSAgaW50IHQ7Ci0KLSAgZHVtbXlfbmFtZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gIGZvciAodCA9IDA7IGJmZF90YXJnZXRfdmVjdG9yW3RdOyB0KyspCi0gICAgewotICAgICAgYmZkX3RhcmdldCAqcCA9IGJmZF90YXJnZXRfdmVjdG9yW3RdOwotICAgICAgYmZkICphYmZkID0gYmZkX29wZW53IChkdW1teV9uYW1lLCBwLT5uYW1lKTsKLSAgICAgIGludCBhOwotCi0gICAgICBwcmludGYgKCIlc1xuIChoZWFkZXIgJXMsIGRhdGEgJXMpXG4iLCBwLT5uYW1lLAotCSAgICAgIGVuZGlhbl9zdHJpbmcgKHAtPmhlYWRlcl9ieXRlb3JkZXIpLAotCSAgICAgIGVuZGlhbl9zdHJpbmcgKHAtPmJ5dGVvcmRlcikpOwotCi0gICAgICBpZiAoYWJmZCA9PSBOVUxMKQotCXsKLQkgIG5vbmZhdGFsIChkdW1teV9uYW1lKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbikKLQkgICAgbm9uZmF0YWwgKHAtPm5hbWUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBmb3IgKGEgPSAoaW50KSBiZmRfYXJjaF9vYnNjdXJlICsgMTsgYSA8IChpbnQpIGJmZF9hcmNoX2xhc3Q7IGErKykKLQlpZiAoYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpIGEsIDApKQotCSAgcHJpbnRmICgiICAlc1xuIiwKLQkJICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSkgYSwgMCkpOwotICAgIH0KLSAgdW5saW5rIChkdW1teV9uYW1lKTsKLSAgZnJlZSAoZHVtbXlfbmFtZSk7Ci19Ci0KLS8qIFByaW50IGEgdGFibGUgc2hvd2luZyB3aGljaCBhcmNoaXRlY3R1cmVzIGFyZSBzdXBwb3J0ZWQgZm9yIGVudHJpZXMKLSAgIEZJUlNUIHRocm91Z2ggTEFTVC0xIG9mIGJmZF90YXJnZXRfdmVjdG9yICh0YXJnZXRzIGFjcm9zcywKLSAgIGFyY2hpdGVjdHVyZXMgZG93bikuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9pbmZvX3RhYmxlIChmaXJzdCwgbGFzdCkKLSAgICAgaW50IGZpcnN0OwotICAgICBpbnQgbGFzdDsKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGludCB0LCBhOwotICBjaGFyICpkdW1teV9uYW1lOwotCi0gIC8qIFByaW50IGhlYWRpbmcgb2YgdGFyZ2V0IG5hbWVzLiAgKi8KLSAgcHJpbnRmICgiXG4lKnMiLCAoaW50KSBMT05HRVNUX0FSQ0gsICIgIik7Ci0gIGZvciAodCA9IGZpcnN0OyB0IDwgbGFzdCAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQotICAgIHByaW50ZiAoIiVzICIsIGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKTsKLSAgcHV0Y2hhciAoJ1xuJyk7Ci0KLSAgZHVtbXlfbmFtZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gIGZvciAoYSA9IChpbnQpIGJmZF9hcmNoX29ic2N1cmUgKyAxOyBhIDwgKGludCkgYmZkX2FyY2hfbGFzdDsgYSsrKQotICAgIGlmIChzdHJjbXAgKGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhLCAwKSwgIlVOS05PV04hIikgIT0gMCkKLSAgICAgIHsKLQlwcmludGYgKCIlKnMgIiwgKGludCkgTE9OR0VTVF9BUkNIIC0gMSwKLQkJYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGEsIDApKTsKLQlmb3IgKHQgPSBmaXJzdDsgdCA8IGxhc3QgJiYgYmZkX3RhcmdldF92ZWN0b3JbdF07IHQrKykKLQkgIHsKLQkgICAgYmZkX3RhcmdldCAqcCA9IGJmZF90YXJnZXRfdmVjdG9yW3RdOwotCSAgICBib29sZWFuIG9rID0gdHJ1ZTsKLQkgICAgYmZkICphYmZkID0gYmZkX29wZW53IChkdW1teV9uYW1lLCBwLT5uYW1lKTsKLQotCSAgICBpZiAoYWJmZCA9PSBOVUxMKQotCSAgICAgIHsKLQkJbm9uZmF0YWwgKHAtPm5hbWUpOwotCQlvayA9IGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAob2spCi0JICAgICAgewotCQlpZiAoISBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0JCSAgewotCQkgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKQotCQkgICAgICBub25mYXRhbCAocC0+bmFtZSk7Ci0JCSAgICBvayA9IGZhbHNlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKG9rKQotCSAgICAgIHsKLQkJaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGEsIDApKQotCQkgIG9rID0gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmIChvaykKLQkgICAgICBwcmludGYgKCIlcyAiLCBwLT5uYW1lKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IGwgPSBzdHJsZW4gKHAtPm5hbWUpOwotCQl3aGlsZSAobC0tKQotCQkgIHB1dGNoYXIgKCctJyk7Ci0JCXB1dGNoYXIgKCcgJyk7Ci0JICAgICAgfQotCSAgfQotCXB1dGNoYXIgKCdcbicpOwotICAgICAgfQotICB1bmxpbmsgKGR1bW15X25hbWUpOwotICBmcmVlIChkdW1teV9uYW1lKTsKLX0KLQotLyogUHJpbnQgdGFibGVzIG9mIGFsbCB0aGUgdGFyZ2V0LWFyY2hpdGVjdHVyZSBjb21iaW5hdGlvbnMgdGhhdAotICAgQkZEIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydC4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3RhcmdldF90YWJsZXMgKCkKLXsKLSAgaW50IHQsIGNvbHVtbnM7Ci0gIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOwotICBjaGFyICpjb2x1bTsKLQotICBjb2x1bW5zID0gMDsKLSAgY29sdW0gPSBnZXRlbnYgKCJDT0xVTU5TIik7Ci0gIGlmIChjb2x1bSAhPSBOVUxMKQotICAgIGNvbHVtbnMgPSBhdG9pIChjb2x1bSk7Ci0gIGlmIChjb2x1bW5zID09IDApCi0gICAgY29sdW1ucyA9IDgwOwotCi0gIHQgPSAwOwotICB3aGlsZSAoYmZkX3RhcmdldF92ZWN0b3JbdF0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgb2xkdCA9IHQsIHdpZDsKLQotICAgICAgd2lkID0gTE9OR0VTVF9BUkNIICsgc3RybGVuIChiZmRfdGFyZ2V0X3ZlY3Rvclt0XS0+bmFtZSkgKyAxOwotICAgICAgKyt0OwotICAgICAgd2hpbGUgKHdpZCA8IGNvbHVtbnMgJiYgYmZkX3RhcmdldF92ZWN0b3JbdF0gIT0gTlVMTCkKLQl7Ci0JICBpbnQgbmV3d2lkOwotCi0JICBuZXd3aWQgPSB3aWQgKyBzdHJsZW4gKGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKSArIDE7Ci0JICBpZiAobmV3d2lkID49IGNvbHVtbnMpCi0JICAgIGJyZWFrOwotCSAgd2lkID0gbmV3d2lkOwotCSAgKyt0OwotCX0KLSAgICAgIGRpc3BsYXlfaW5mb190YWJsZSAob2xkdCwgdCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9pbmZvICgpCi17Ci0gIHByaW50ZiAoXygiQkZEIGhlYWRlciBmaWxlIHZlcnNpb24gJXNcbiIpLCBCRkRfVkVSU0lPTik7Ci0gIGRpc3BsYXlfdGFyZ2V0X2xpc3QgKCk7Ci0gIGRpc3BsYXlfdGFyZ2V0X3RhYmxlcyAoKTsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBjaGFyICp0YXJnZXQgPSBkZWZhdWx0X3RhcmdldDsKLSAgYm9vbGVhbiBzZWVuZmxhZyA9IGZhbHNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgInBpYjptOk06VkNkRGxmYWhIclJ0VHhzU2o6d0U6emdHIiwKLQkJCSAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAwOgotCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KLQljYXNlICdtJzoKLQkgIG1hY2hpbmUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdNJzoKLQkgIGRpc2Fzc2VtYmxlcl9vcHRpb25zID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBvbmx5ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICB3aXRoX2xpbmVfbnVtYmVycyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIHRhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgZG9fZGVtYW5nbGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAndyc6Ci0JICB3aWRlX291dHB1dCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9BREpVU1RfVk1BOgotCSAgYWRqdXN0X3NlY3Rpb25fdm1hID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLWFkanVzdC12bWEiKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NUQVJUX0FERFJFU1M6Ci0JICBzdGFydF9hZGRyZXNzID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLXN0YXJ0LWFkZHJlc3MiKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NUT1BfQUREUkVTUzoKLQkgIHN0b3BfYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zdG9wLWFkZHJlc3MiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0UnOgotCSAgaWYgKHN0cmNtcCAob3B0YXJnLCAiQiIpID09IDApCi0JICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJMIikgPT0gMCkKLQkgICAgZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgLUUgb3B0aW9uXG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VORElBTjoKLQkgIGlmIChzdHJuY21wIChvcHRhcmcsICJiaWciLCBzdHJsZW4gKG9wdGFyZykpID09IDApCi0JICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotCSAgZWxzZSBpZiAoc3RybmNtcCAob3B0YXJnLCAibGl0dGxlIiwgc3RybGVuIChvcHRhcmcpKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCAtLWVuZGlhbiB0eXBlIGAlcydcbiIpLAotCQkgICAgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSAnZic6Ci0JICBkdW1wX2ZpbGVfaGVhZGVyID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgZm9ybWF0c19pbmZvID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgZHVtcF9wcml2YXRlX2hlYWRlcnMgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkdW1wX3ByaXZhdGVfaGVhZGVycyA9IHRydWU7Ci0JICBkdW1wX3N5bXRhYiA9IHRydWU7Ci0JICBkdW1wX3JlbG9jX2luZm8gPSB0cnVlOwotCSAgZHVtcF9maWxlX2hlYWRlciA9IHRydWU7Ci0JICBkdW1wX2FyX2hkcnMgPSB0cnVlOwotCSAgZHVtcF9zZWN0aW9uX2hlYWRlcnMgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBkdW1wX3N5bXRhYiA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGR1bXBfZHluYW1pY19zeW10YWIgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkaXNhc3NlbWJsZSA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICd6JzoKLQkgIGRpc2Fzc2VtYmxlX3plcm9lcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGRpc2Fzc2VtYmxlID0gdHJ1ZTsKLQkgIGRpc2Fzc2VtYmxlX2FsbCA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGRpc2Fzc2VtYmxlID0gdHJ1ZTsKLQkgIHdpdGhfc291cmNlX2NvZGUgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBkdW1wX2RlYnVnZ2luZyA9IDE7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdHJzoKLQkgIGR1bXBfc3RhYl9zZWN0aW9uX2luZm8gPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBkdW1wX3NlY3Rpb25fY29udGVudHMgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6Ci0JICBkdW1wX3JlbG9jX2luZm8gPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0JICBkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIGR1bXBfYXJfaGRycyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIGR1bXBfc2VjdGlvbl9oZWFkZXJzID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ0gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JICAKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJvYmpkdW1wIik7Ci0KLSAgaWYgKHNlZW5mbGFnID09IGZhbHNlKQotICAgIHVzYWdlIChzdGRlcnIsIDIpOwotCi0gIGlmIChmb3JtYXRzX2luZm8pCi0gICAgZGlzcGxheV9pbmZvICgpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9wdGluZCA9PSBhcmdjKQotCWRpc3BsYXlfZmlsZSAoImEub3V0IiwgdGFyZ2V0KTsKLSAgICAgIGVsc2UKLQlmb3IgKDsgb3B0aW5kIDwgYXJnYzspCi0JICBkaXNwbGF5X2ZpbGUgKGFyZ3Zbb3B0aW5kKytdLCB0YXJnZXQpOwotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgcmV0dXJuIGV4aXRfc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcG8vTWFrZS1pbiBiL2JpbnV0aWxzL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iaW51dGlscy9wby9QT1RGSUxFUy5pbiBiL2JpbnV0aWxzL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2EwNTg2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotYWRkcjJsaW5lLmMKLWFyLmMKLWFyc3VwLmMKLWFyc3VwLmgKLWJ1Y29tbS5jCi1idWNvbW0uaAotYnVkYmcuaAotY29mZmR1bXAuYwotY29mZmdyb2suYwotY29mZmdyb2suaAotZGVidWcuYwotZGVidWcuYwotZGVidWcuaAotZGxsdG9vbC5jCi1kbGx0b29sLmgKLWRsbHdyYXAuYwotZHluLXN0cmluZy5jCi1keW4tc3RyaW5nLmgKLWZpbGVtb2RlLmMKLWllZWUuYwotaWVlZS5jCi1pcy1yYW5saWIuYwotaXMtc3RyaXAuYwotbWF5YmUtcmFubGliLmMKLW1heWJlLXN0cmlwLmMKLW5sbWNvbnYuYwotbmxtY29udi5oCi1ubS5jCi1ub3QtcmFubGliLmMKLW5vdC1zdHJpcC5jCi1vYmpjb3B5LmMKLW9iamR1bXAuYwotcHJkYmcuYwotcmRjb2ZmLmMKLXJkY29mZi5jCi1yZGRiZy5jCi1yZGRiZy5jCi1yZWFkZWxmLmMKLXJlbmFtZS5jCi1yZXNiaW4uYwotcmVzY29mZi5jCi1yZXNyYy5jCi1yZXNyZXMuYwotc2l6ZS5jCi1zcmNvbnYuYwotc3RhYnMuYwotc3RhYnMuYwotc3RyaW5ncy5jCi1zeXNkdW1wLmMKLXZlcnNpb24uYwotd2luZHJlcy5jCi13aW5kcmVzLmgKLXdpbmR1bmkuYwotd2luZHVuaS5oCi13cnN0YWJzLmMKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdCBiL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3OTVjYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wby9iaW51dGlscy5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNDgzICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA2LTAzIDAyOjU4LTA3MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhZGRyMmxpbmUuYzo3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstQ2ZzSFZdIFstYiBiZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy1lIGV4ZWN1dGFibGVdIFstLWV4ZT1leGVjdXRhYmxlXSBbLS1kZW1hbmdsZV1cbiIKLSIgICAgICAgWy0tYmFzZW5hbWVzXSBbLS1mdW5jdGlvbnNdIFthZGRyIGFkZHIgLi4uXVxuIgotbXNnc3RyICIiCi0KLSM6IGFkZHIybGluZS5jOjgzIGFyLmM6MjU1IG5sbWNvbnYuYzoxMTQxIG5tLmM6MzA0IG9iamNvcHkuYzozMTggb2JqY29weS5jOjMzNwotIzogb2JqZHVtcC5jOjIzNiByZWFkZWxmLmM6MTE2OCBzaXplLmM6ODkgc3RyaW5ncy5jOjUxMiB3aW5kcmVzLmM6NzMwCi1tc2dpZCAiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iCi1tc2dzdHIgIiIKLQotIzogYWRkcjJsaW5lLmM6MjQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4gbm90IGdldCBhZGRyZXNzZXMgZnJvbSBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstXXtkbXBxcnN0eH1bYWJjaWxvc1N1dlZdIFttZW1iZXItbmFtZV0gYXJjaGl2ZS1maWxlIGZpbGUuLi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgJXMgLU0gWzxtcmktc2NyaXB0XVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI3Ci1tc2dpZCAiIGNvbW1hbmRzOlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI4Ci1tc2dpZCAiICBkICAgICAgICAgICAgLSBkZWxldGUgZmlsZShzKSBmcm9tIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMjkKLW1zZ2lkICIgIG1bYWJdICAgICAgICAtIG1vdmUgZmlsZShzKSBpbiB0aGUgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjMwCi1tc2dpZCAiICBwICAgICAgICAgICAgLSBwcmludCBmaWxlKHMpIGZvdW5kIGluIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzEKLW1zZ2lkICIgIHFbZl0gICAgICAgICAtIHF1aWNrIGFwcGVuZCBmaWxlKHMpIHRvIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzIKLW1zZ2lkICIiCi0iICByW2FiXVtmXVt1XSAgLSByZXBsYWNlIGV4aXN0aW5nIG9yIGluc2VydCBuZXcgZmlsZShzKSBpbnRvIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzMKLW1zZ2lkICIgIHQgICAgICAgICAgICAtIGRpc3BsYXkgY29udGVudHMgb2YgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM0Ci1tc2dpZCAiICB4W29dICAgICAgICAgLSBleHRyYWN0IGZpbGUocykgZnJvbSB0aGUgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM1Ci1tc2dpZCAiIGNvbW1hbmQgc3BlY2lmaWMgbW9kaWZpZXJzOlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM2Ci1tc2dpZCAiICBbYV0gICAgICAgICAgLSBwdXQgZmlsZShzKSBhZnRlciBbbWVtYmVyLW5hbWVdXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzcKLW1zZ2lkICIgIFtiXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGJlZm9yZSBbbWVtYmVyLW5hbWVdIChzYW1lIGFzIFtpXSlcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzOAotbXNnaWQgIiAgW2ZdICAgICAgICAgIC0gdHJ1bmNhdGUgaW5zZXJ0ZWQgZmlsZSBuYW1lc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM5Ci1tc2dpZCAiICBbb10gICAgICAgICAgLSBwcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQwCi1tc2dpZCAiIgotIiAgW3VdICAgICAgICAgIC0gb25seSByZXBsYWNlIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gY3VycmVudCBhcmNoaXZlICIKLSJjb250ZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQxCi1tc2dpZCAiIGdlbmVyaWMgbW9kaWZpZXJzOlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQyCi1tc2dpZCAiICBbY10gICAgICAgICAgLSBkbyBub3Qgd2FybiBpZiB0aGUgbGlicmFyeSBoYWQgdG8gYmUgY3JlYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQzCi1tc2dpZCAiICBbc10gICAgICAgICAgLSBjcmVhdGUgYW4gYXJjaGl2ZSBpbmRleCAoY2YuIHJhbmxpYilcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI0NAotbXNnaWQgIiAgW1NdICAgICAgICAgIC0gZG8gbm90IGJ1aWxkIGEgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDUKLW1zZ2lkICIgIFt2XSAgICAgICAgICAtIGJlIHZlcmJvc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI0NgotbXNnaWQgIiAgW1ZdICAgICAgICAgIC0gZGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgWy12Vl0gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NDMxCi1tc2dpZCAidHdvIGRpZmZlcmVudCBvcGVyYXRpb24gb3B0aW9ucyBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo1MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlsbGVnYWwgb3B0aW9uIC0tICVjXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo1MzIKLW1zZ2lkICJubyBvcGVyYXRpb24gc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NTM1Ci1tc2dpZCAiYHUnIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSBgcicgb3B0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjYxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW50ZXJuYWwgZXJyb3IgLS0gdGhpcyBvcHRpb24gbm90IGltcGxlbWVudGVkXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo3MzAgYXIuYzo3ODIgYXIuYzoxMjEyIG9iamNvcHkuYzo5NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjczNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iPG1lbWJlciAlcz5cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjc1MSBhci5jOjgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpcyBub3QgYSB2YWxpZCBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6Nzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXQgcmV0dXJucyBuZWdhdGl2ZSBzaXplIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjkwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpcyBub3QgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjkxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY3JlYXRpbmcgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjExMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gbWVtYmVyIG5hbWVkIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjExNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUgJXMhXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoxMzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBhcmNoaXZlIG1hcCB0byB1cGRhdGUiCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzo4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBlbnRyeSAlcyBpbiBhcmNoaXZlLlxuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MTE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBhcmNoaXZlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gaW5wdXQgYXJjaGl2ZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlICVzIGlzIG5vdCBhbiBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIG91dHB1dCBhcmNoaXZlIHNwZWNpZmllZCB5ZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjI0NSBhcnN1cC5jOjI4MCBhcnN1cC5jOjMxNiBhcnN1cC5jOjMzNiBhcnN1cC5jOjM5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MjUzIGFyc3VwLmM6MzU0IGFyc3VwLmM6Mzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjMwMSBhcnN1cC5jOjM3MCBhcnN1cC5jOjQ0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6NDAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkN1cnJlbnQgb3BlbiBhcmNoaXZlIGlzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzo0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIG9wZW4gIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBidWNvbW0uYzoxMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBidWNvbW0uYzoxNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IE1hdGNoaW5nIGZvcm1hdHM6IgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjE2OAotbXNnaWQgIlN1cHBvcnRlZCB0YXJnZXRzOiIKLW1zZ3N0ciAiIgotCi0jOiBidWNvbW0uYzoxNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN1cHBvcnRlZCB0YXJnZXRzOiIKLW1zZ3N0ciAiIgotCi0jOiBidWNvbW0uYzoyNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBudW1iZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZkdW1wLmM6OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiI2xpbmVzICVkICIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZHVtcC5jOjQ1NiBzeXNkdW1wLmM6NzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBQcmludCBhIGh1bWFuIHJlYWRhYmxlIGludGVycHJldGF0aW9uIG9mIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvZmZkdW1wLmM6NDk4IHNyY29udi5jOjE5NDAgc3lzZHVtcC5jOjc1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgJXMgdmVyc2lvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvZmZkdW1wLmM6NTE2IHNyY29udi5jOjE5Nzcgc3lzZHVtcC5jOjc3NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjY1MwotbXNnaWQgImRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZTogbm8gY3VycmVudCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6NzM2Ci1tc2dpZCAiZGVidWdfc3RhcnRfc291cmNlOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjc5NQotbXNnaWQgImRlYnVnX3JlY29yZF9mdW5jdGlvbjogbm8gZGVidWdfc2V0X2ZpbGVuYW1lIGNhbGwiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo4NTEKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyOiBubyBjdXJyZW50IGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6ODg1Ci1tc2dpZCAiZGVidWdfZW5kX2Z1bmN0aW9uOiBubyBjdXJyZW50IGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6ODkxCi1tc2dpZCAiZGVidWdfZW5kX2Z1bmN0aW9uOiBzb21lIGJsb2NrcyB3ZXJlIG5vdCBjbG9zZWQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo5MjEKLW1zZ2lkICJkZWJ1Z19zdGFydF9ibG9jazogbm8gY3VycmVudCBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjk1OQotbXNnaWQgImRlYnVnX2VuZF9ibG9jazogbm8gY3VycmVudCBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjk2NgotbXNnaWQgImRlYnVnX2VuZF9ibG9jazogYXR0ZW1wdCB0byBjbG9zZSB0b3AgbGV2ZWwgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo5OTIKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfbGluZTogbm8gY3VycmVudCB1bml0IgotbXNnc3RyICIiCi0KLSMuIEZJWE1FCi0jOiBkZWJ1Zy5jOjEwNDYKLW1zZ2lkICJkZWJ1Z19zdGFydF9jb21tb25fYmxvY2s6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRQotIzogZGVidWcuYzoxMDU4Ci1tc2dpZCAiZGVidWdfZW5kX2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSMuIEZJWE1FLgotIzogZGVidWcuYzoxMTUyCi1tc2dpZCAiZGVidWdfcmVjb3JkX2xhYmVsIG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjExNzgKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjExOTQKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoxNzY0Ci1tc2dpZCAiZGVidWdfbWFrZV91bmRlZmluZWRfdHlwZTogdW5zdXBwb3J0ZWQga2luZCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjE5NzAKLW1zZ2lkICJkZWJ1Z19uYW1lX3R5cGU6IG5vIGN1cnJlbnQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIwMTgKLW1zZ2lkICJkZWJ1Z190YWdfdHlwZTogbm8gY3VycmVudCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjAyNgotbXNnaWQgImRlYnVnX3RhZ190eXBlOiBleHRyYSB0YWcgYXR0ZW1wdGVkIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjA2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBjaGFuZ2luZyB0eXBlIHNpemUgZnJvbSAlZCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjA5MAotbXNnaWQgImRlYnVnX2ZpbmRfbmFtZWRfdHlwZTogbm8gY3VycmVudCBjb21waWxhdGlvbiB1bml0IgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjE5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWJ1Z19nZXRfcmVhbF90eXBlOiBjaXJjdWxhciBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjI2NjMKLW1zZ2lkICJkZWJ1Z193cml0ZV90eXBlOiBpbGxlZ2FsIHR5cGUgZW5jb3VudGVyZWQiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjcxMSBkbGx0b29sLmM6NzM1IGRsbHRvb2wuYzo3NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IFVua25vd24gbWFjaGluZSB0eXBlOiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo3OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBkZWYgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjc5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzaW5nIGRlZiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODAzCi1tc2dpZCAiUHJvY2Vzc2VkIGRlZiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ludGF4IGVycm9yIGluIGRlZiBmaWxlICVzOiVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjg2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJOQU1FOiAlcyBiYXNlOiAleCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODY0Ci1tc2dpZCAiQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjg4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJMSUJSQVJZOiAlcyBiYXNlOiAleCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTEzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3YWl0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWQiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjExNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjExODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3Vja2luZyBpbiBpbmZvIGZyb20gJXMgc2VjdGlvbiBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkV4Y2x1ZGluZyBzeW1ib2w6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEzODYgZGxsdG9vbC5jOjEzOTcgbm0uYzo5MDIgbm0uYzo5MTMgb2JqZHVtcC5jOjM3OSBvYmpkdW1wLmM6Mzk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IHdlIG91Z2h0IHRvIHJlYWQgaW4gYW5kIGJsb2NrIG91dCB0aGUgYmFzZSByZWxvY2F0aW9ucwotIzogZGxsdG9vbC5jOjE0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRG9uZSByZWFkaW5nICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE0MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hYmxlIHRvIG9wZW4gb2JqZWN0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNDM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNjYW5uaW5nIG9iamVjdCBmaWxlICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBwcm9kdWNlIG1jb3JlLWVsZiBkbGwgZnJvbSBhcmNoaXZlIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNTM4Ci1tc2dpZCAiQWRkaW5nIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE1ODMKLW1zZ2lkICJBZGRlZCBleHBvcnRzIHRvIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkdlbmVyYXRpbmcgZXhwb3J0IGZpbGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTY5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGVuZWQgdGVtcG9yYXJ5IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxOTE4Ci1tc2dpZCAiR2VuZXJhdGVkIGV4cG9ydHMgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjE3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmRfb3BlbiBmYWlsZWQgb3BlbiBzdHViIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyMTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNyZWF0aW5nIHN0dWIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI1NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHRvIG9wZW4gdGVtcG9yYXJ5IGhlYWQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI2MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHRvIG9wZW4gdGVtcG9yYXJ5IHRhaWwgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI2OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiAubGliIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjc1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGVsZXRlICVzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNzYxCi1tc2dpZCAiQ3JlYXRlZCBsaWIgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjg2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nLCBpZ25vcmluZyBkdXBsaWNhdGUgRVhQT1JUICVzICVkLCVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI4NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTk1Ci1tc2dpZCAiUHJvY2Vzc2luZyBkZWZpbml0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzAzMwotbXNnaWQgIlByb2Nlc3NlZCBkZWZpbml0aW9ucyIKLW1zZ3N0ciAiIgotCi0jLiB4Z2V0ZXh0OmMtZm9ybWF0Ci0jOiBkbGx0b29sLmM6MzA0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIKLW1zZ3N0ciAiIgotCi0jLiB4Z2V0ZXh0OmMtZm9ybWF0Ci0jOiBkbGx0b29sLmM6MzA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICAgLW0gLS1tYWNoaW5lIDxtYWNoaW5lPiAgICBDcmVhdGUgYXMgRExMIGZvciA8bWFjaGluZT4uICBbZGVmYXVsdDogJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNDcKLW1zZ2lkICIiCi0iICAgICAgICBwb3NzaWJsZSA8bWFjaGluZT46IGFybVtfaW50ZXJ3b3JrXSwgaTM4NiwgbWNvcmVbLWVsZl1bLWxlXSwgcHBjLCAiCi0idGh1bWJcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA0OAotbXNnaWQgIiAgIC1lIC0tb3V0cHV0LWV4cCA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gZXhwb3J0IGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNDkKLW1zZ2lkICIgICAtbCAtLW91dHB1dC1saWIgPG91dG5hbWU+IEdlbmVyYXRlIGFuIGludGVyZmFjZSBsaWJyYXJ5LlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDUwCi1tc2dpZCAiICAgLWEgLS1hZGQtaW5kaXJlY3QgICAgICAgICBBZGQgZGxsIGluZGlyZWN0cyB0byBleHBvcnQgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1MQotbXNnaWQgIiIKLSIgICAtRCAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIGludGVyZmFjZSBsaWIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTIKLW1zZ2lkICIgICAtZCAtLWlucHV0LWRlZiA8ZGVmZmlsZT4gIE5hbWUgb2YgLmRlZiBmaWxlIHRvIGJlIHJlYWQgaW4uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTMKLW1zZ2lkICIgICAteiAtLW91dHB1dC1kZWYgPGRlZmZpbGU+IE5hbWUgb2YgLmRlZiBmaWxlIHRvIGJlIGNyZWF0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTQKLW1zZ2lkICIgICAgICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTUKLW1zZ2lkICIgICAgICAtLW5vLWV4cG9ydC1hbGwtc3ltYm9scyAgT25seSBleHBvcnQgbGlzdGVkIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NgotbXNnaWQgIiAgICAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiBEb24ndCBleHBvcnQgPGxpc3Q+XG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTcKLW1zZ2lkICIgICAgICAtLW5vLWRlZmF1bHQtZXhjbHVkZXMgIENsZWFyIGRlZmF1bHQgZXhjbHVkZSBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTgKLW1zZ2lkICIgICAtYiAtLWJhc2UtZmlsZSA8YmFzZWZpbGU+IFJlYWQgbGlua2VyIGdlbmVyYXRlZCBiYXNlIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTkKLW1zZ2lkICIgICAteCAtLW5vLWlkYXRhNCAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA2MAotbXNnaWQgIiAgIC1jIC0tbm8taWRhdGE1ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDYxCi1tc2dpZCAiIgotIiAgIC1VIC0tYWRkLXVuZGVyc2NvcmUgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIHN5bWJvbHMgaW4gaW50ZXJmYWNlICIKLSJsaWJyYXJ5LlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDYyCi1tc2dpZCAiICAgLWsgLS1raWxsLWF0ICAgICAgICAgICAgICBLaWxsIEA8bj4gZnJvbSBleHBvcnRlZCBuYW1lcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA2MwotbXNnaWQgIiAgIC1BIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgQWRkIGFsaWFzZXMgd2l0aG91dCBAPG4+LlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDY0Ci1tc2dpZCAiICAgLVMgLS1hcyA8bmFtZT4gICAgICAgICAgICBVc2UgPG5hbWU+IGZvciBhc3NlbWJsZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjUKLW1zZ2lkICIgICAtZiAtLWFzLWZsYWdzIDxmbGFncz4gICAgIFBhc3MgPGZsYWdzPiB0byB0aGUgYXNzZW1ibGVyLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDY2Ci1tc2dpZCAiIgotIiAgIC1uIC0tbm8tZGVsZXRlICAgICAgICAgICAgS2VlcCB0ZW1wIGZpbGVzIChyZXBlYXQgZm9yIGV4dHJhICIKLSJwcmVzZXJ2YXRpb24pLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDY3Ci1tc2dpZCAiICAgLXYgLS12ZXJib3NlICAgICAgICAgICAgICBCZSB2ZXJib3NlLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDY4Ci1tc2dpZCAiICAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBwcm9ncmFtIHZlcnNpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjkKLW1zZ2lkICIgICAtaCAtLWhlbHAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA3MQotbXNnaWQgIiIKLSIgICAtTSAtLW1jb3JlLWVsZiA8b3V0bmFtZT4gIFByb2Nlc3MgbWNvcmUtZWxmIG9iamVjdCBmaWxlcyBpbnRvIDxvdXRuYW1lPi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA3MgotbXNnaWQgIiAgIC1MIC0tbGlua2VyIDxuYW1lPiAgICAgICAgVXNlIDxuYW1lPiBhcyB0aGUgbGlua2VyLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDczCi1tc2dpZCAiICAgLUYgLS1saW5rZXItZmxhZ3MgPGZsYWdzPiBQYXNzIDxmbGFncz4gdG8gdGhlIGxpbmtlci5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzIxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gb3BlbiBiYXNlLWZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIk1hY2hpbmUgJyVzJyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMzg1Ci1tc2dpZCAiYnVmZmVyIG92ZXJmbG93XG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMxNgotbXNnaWQgInVuZXhwZWN0ZWQgZW5kIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDExCi1tc2dpZCAiaW52YWxpZCBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjQ3MAotbXNnaWQgImludmFsaWQgc3RyaW5nIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTI3IGllZWUuYzo1NjgKLW1zZ2lkICJleHByZXNzaW9uIHN0YWNrIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1NDcKLW1zZ2lkICJ1bnN1cHBvcnRlZCBJRUVFIGV4cHJlc3Npb24gb3BlcmF0b3IiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjU2MgotbXNnaWQgInVua25vd24gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTgzCi1tc2dpZCAiZXhwcmVzc2lvbiBzdGFjayB1bmRlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjU5NwotbXNnaWQgImV4cHJlc3Npb24gc3RhY2sgbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjYzNgotbXNnaWQgInVua25vd24gYnVpbHRpbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo3ODEKLW1zZ2lkICJCQ0QgZmxvYXQgdHlwZSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo5MjcKLW1zZ2lkICJ1bmV4cGVjdGVkIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6OTM0Ci1tc2dpZCAidW5leHBlY3RlZCByZWNvcmQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6OTY3Ci1tc2dpZCAiYmxvY2tzIGxlZnQgb24gc3RhY2sgYXQgZW5kIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxMjMyCi1tc2dpZCAidW5rbm93biBCQiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxMjQxCi1tc2dpZCAic3RhY2sgb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEyNjYKLW1zZ2lkICJzdGFjayB1bmRlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEzODAgaWVlZS5jOjE0NTIgaWVlZS5jOjIxNTEKLW1zZ2lkICJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxNDMwCi1tc2dpZCAiaWxsZWdhbCB0eXBlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxNDQwIGllZWUuYzoxNDc3Ci1tc2dpZCAidW5rbm93biBUWSBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxNDU5Ci1tc2dpZCAidW5kZWZpbmVkIHZhcmlhYmxlIGluIFRZIgotbXNnc3RyICIiCi0KLSMuIFBhc2NhbCBmaWxlIG5hbWUuICBGSVhNRS4KLSM6IGllZWUuYzoxODcwCi1tc2dpZCAiUGFzY2FsIGZpbGUgbmFtZSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxOTE4Ci1tc2dpZCAidW5zdXBwb3J0ZWQgcXVhbGlmZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjIxODkKLW1zZ2lkICJ1bmRlZmluZWQgdmFyaWFibGUgaW4gQVROIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyMjMyCi1tc2dpZCAidW5rbm93biBBVE4gdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBSZXNlcnZlZCBmb3IgRk9SVFJBTiBjb21tb24uCi0jOiBpZWVlLmM6MjM1NAotbXNnaWQgInVuc3VwcG9ydGVkIEFUTjExIgotbXNnc3RyICIiCi0KLSMuIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuCi0jOiBpZWVlLmM6MjM4MQotbXNnaWQgInVuc3VwcG9ydGVkIEFUTjEyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNDQxCi1tc2dpZCAidW5leHBlY3RlZCBzdHJpbmcgaW4gQysrIG1pc2MiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI0NTQKLW1zZ2lkICJiYWQgbWlzYyByZWNvcmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI0OTcKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG1pc2MgcmVjb3JkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNjE0Ci1tc2dpZCAidW5kZWZpbmVkIEMrKyBvYmplY3QiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2NDgKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBzcGVjIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNjg0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgQysrIG9iamVjdCB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNjk0Ci1tc2dpZCAiQysrIGJhc2UgY2xhc3Mgbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI3MDYgaWVlZS5jOjI4MTEKLW1zZ2lkICJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI3MjUKLW1zZ2lkICJDKysgYmFzZSBjbGFzcyBub3QgZm91bmQgaW4gY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyODMyCi1tc2dpZCAiQysrIGRhdGEgbWVtYmVyIG5vdCBmb3VuZCBpbiBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI4NzMgaWVlZS5jOjMwMjMKLW1zZ2lkICJ1bmtub3duIEMrKyB2aXNpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyOTA3Ci1tc2dpZCAiYmFkIEMrKyBmaWVsZCBiaXQgcG9zIG9yIHNpemUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI5OTkKLW1zZ2lkICJiYWQgdHlwZSBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzAwOQotbXNnaWQgIm5vIHR5cGUgaW5mb3JtYXRpb24gZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMwNDgKLW1zZ2lkICJDKysgc3RhdGljIHZpcnR1YWwgbWV0aG9kIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMTQzCi1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgb3ZlcmhlYWQgc3BlYyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzE4MgotbXNnaWQgInVuZGVmaW5lZCBDKysgdnRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMjUzCi1tc2dpZCAiQysrIGRlZmF1bHQgdmFsdWVzIG5vdCBpbiBhIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMjkzCi1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBkZWZhdWx0IHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMzMjQKLW1zZ2lkICJyZWZlcmVuY2UgcGFyYW1ldGVyIGlzIG5vdCBhIHBvaW50ZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM0MDkKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIHJlZmVyZW5jZSB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNDkxCi1tc2dpZCAiQysrIHJlZmVyZW5jZSBub3QgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM0OTkKLW1zZ2lkICJDKysgcmVmZXJlbmNlIGlzIG5vdCBwb2ludGVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNTI4IGllZWUuYzozNTM2Ci1tc2dpZCAibWlzc2luZyByZXF1aXJlZCBBU04iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM1NjYgaWVlZS5jOjM1NzQKLW1zZ2lkICJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNTg4Ci1tc2dpZCAiYmFkIEFUTjY1IHJlY29yZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDIzNQotbXNnaWQgIklFRUUgbnVtZXJpYyBvdmVyZmxvdzogMHgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjQyODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSBzdHJpbmcgbGVuZ3RoIG92ZXJmbG93OiAldVxuIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1MzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgaW50ZWdlciB0eXBlIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTM1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJRUVFIHVuc3VwcG9ydGVkIGZsb2F0IHR5cGUgc2l6ZSAldVxuIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1Mzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgY29tcGxleCB0eXBlIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6Mjc1IHNyY29udi5jOjE5NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbXVzdCBiZSBkaWZmZXJlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnB1dCBmaWxlIG5hbWVkIGJvdGggb24gY29tbWFuZCBsaW5lIGFuZCB3aXRoIElOUFVUXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjMzNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gaW5wdXQgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzozNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjM4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzppbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgYXJlIG5vdCBjb21wYXRpYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQxMQotbXNnaWQgIm1ha2UgLmJzcyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo0MjAKLW1zZ2lkICJtYWtlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo0MjIKLW1zZ2lkICJzZXQgLm5sbXNlY3Rpb25zIGZsYWdzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo0NTAKLW1zZ2lkICJzZXQgLmJzcyB2bWEiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQ1NwotbXNnaWQgInNldCAuZGF0YSBzaXplIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo2MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IHN5bWJvbCAlcyBpbXBvcnRlZCBidXQgbm90IGluIGltcG9ydCBsaXN0XG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjY1OAotbXNnaWQgInNldCBzdGFydCBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IFNUQVJUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IEVYSVQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjcxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogQ0hFQ0sgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjczNiBubG1jb252LmM6OTI4Ci1tc2dpZCAiY3VzdG9tIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjc1NyBubG1jb252LmM6OTYwCi1tc2dpZCAiaGVscCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3NzkgbmxtY29udi5jOjk3OQotbXNnaWQgIm1lc3NhZ2Ugc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6Nzk1IG5sbWNvbnYuYzoxMDEyCi1tc2dpZCAibW9kdWxlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjgxNSBubG1jb252LmM6MTAyOQotbXNnaWQgInJwYyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo4NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXM6IHdhcm5pbmc6IHNoYXJlZCBsaWJyYXJpZXMgY2FuIG5vdCBoYXZlIHVuaW5pdGlhbGl6ZWQgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo4NzMgbmxtY29udi5jOjEwNDkKLW1zZ2lkICJzaGFyZWQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6ODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBObyB2ZXJzaW9uIG51bWJlciBnaXZlblxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo5MjIgbmxtY29udi5jOjk1NCBubG1jb252LmM6OTczIG5sbWNvbnYuYzoxMDIzIG5sbWNvbnYuYzoxMDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVzOiByZWFkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo5NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IE1BUCBhbmQgRlVMTE1BUCBhcmUgbm90IHN1cHBvcnRlZDsgdHJ5IGxkIC1NXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjExMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENvbnZlcnQgYW4gb2JqZWN0IGZpbGUgaW50byBhIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjExMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWRoVl0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLVQgaGVhZGVyLWZpbGVdIFstbCBsaW5rZXJdXG4iCi0iICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdXG4iCi0iICAgICAgIFstLWhlYWRlci1maWxlPWZpbGVdIFstLWxpbmtlcj1saW5rZXJdIFstLWRlYnVnXVxuIgotIiAgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXVxuIgotIiAgICAgICBbaW4tZmlsZSBbb3V0LWZpbGVdXVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiBmb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTIxNgotbXNnaWQgIm1ha2Ugc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTIzMAotbXNnaWQgInNldCBzZWN0aW9uIHNpemUiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjEyMzYKLW1zZ2lkICJzZXQgc2VjdGlvbiBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjEyNDAKLW1zZ2lkICJzZXQgc2VjdGlvbiBmbGFncyIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTI1MQotbXNnaWQgInNldCAubmxtc2VjdGlvbnMgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTMzOSBubG1jb252LmM6MTM0NyBubG1jb252LmM6MTM1NiBubG1jb252LmM6MTM2MQotbXNnaWQgInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTg2NAotbXNnaWQgInN0dWIgc2VjdGlvbiBzaXplcyIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTkxMwotbXNnaWQgIndyaXRpbmcgc3R1YiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjAwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZXNvbHZlZCBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjIwNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG92ZXJmbG93IHdoZW4gYWRqdXN0aW5nIHJlbG9jYXRpb24gYWdhaW5zdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyMTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBleGVjdXRpb24gb2YgJXMgZmFpbGVkOiAiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjIyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEV4ZWN1dGlvbiBvZiAlcyBmYWlsZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstYUFCQ0RnbG5vcFByc3V2Vl0gWy10IHJhZGl4XSBbLS1yYWRpeD1yYWRpeF0gWy0tdGFyZ2V0PWJmZG5hbWVdXG4iCi0iICAgICAgIFstLWRlYnVnLXN5bXNdIFstLWV4dGVybi1vbmx5XSBbLS1wcmludC1hcm1hcF0gWy0tcHJpbnQtZmlsZS1uYW1lXVxuIgotIiAgICAgICBbLS1udW1lcmljLXNvcnRdIFstLW5vLXNvcnRdIFstLXJldmVyc2Utc29ydF0gWy0tc2l6ZS1zb3J0XVxuIgotIiAgICAgICBbLS11bmRlZmluZWQtb25seV0gWy0tcG9ydGFiaWxpdHldIFstZiB7YnNkLHN5c3YscG9zaXh9XVxuIgotIiAgICAgICBbLS1mb3JtYXQ9e2JzZCxzeXN2LHBvc2l4fV0gWy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXSBbLS1keW5hbWljXVxuIgotIiAgICAgICBbLS1kZWZpbmVkLW9ubHldIFstLWxpbmUtbnVtYmVyc11cbiIKLSIgICAgICAgWy0tdmVyc2lvbl0gWy0taGVscF1cbiIKLSIgICAgICAgW2ZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzozMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBpbnZhbGlkIHJhZGl4XG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzozNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBpbnZhbGlkIG91dHB1dCBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjQ5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZGF0YSBzaXplICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTI4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iVW5kZWZpbmVkIHN5bWJvbHMgZnJvbSAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEyODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEyODQgbm0uYzoxMzM4Ci1tc2dpZCAiIgotIk5hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgICIKLSJTZWN0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxMzM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJVbmRlZmluZWQgc3ltYm9scyBmcm9tICVzWyVzXTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEzMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlc1slc106XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxNTA4Ci1tc2dpZCAiIgotIlxuIgotIkFyY2hpdmUgaW5kZXg6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjI5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstdlZTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1iIGJ5dGVdXG4iCi0iICAgICAgIFstUiBzZWN0aW9uXSBbLWkgaW50ZXJsZWF2ZV0gWy0taW50ZXJsZWF2ZT1pbnRlcmxlYXZlXSBbLS1ieXRlPWJ5dGVdXG4iCi0iICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdICIKLSJbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0tc3RyaXAtYWxsXSBbLS1zdHJpcC1kZWJ1Z10gWy0tc3RyaXAtdW5uZWVkZWRdIFstLWRpc2NhcmQtYWxsXVxuIgotIiAgICAgICBbLS1kaXNjYXJkLWxvY2Fsc10gWy0tZGVidWdnaW5nXSBbLS1yZW1vdmUtc2VjdGlvbj1zZWN0aW9uXVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzozMDAKLW1zZ2lkICIiCi0iICAgICAgIFstLWdhcC1maWxsPXZhbF0gWy0tcGFkLXRvPWFkZHJlc3NdIFstLXByZXNlcnZlLWRhdGVzXVxuIgotIiAgICAgICBbLS1zZXQtc3RhcnQ9dmFsXSBcbiIKLSIgICAgICAgWy0tY2hhbmdlLXN0YXJ0PWluY3JdIFstLWNoYW5nZS1hZGRyZXNzZXM9aW5jcl0gXG4iCi0iICAgICAgICgtLWFkanVzdC1zdGFydCAgIGFuZCAgLS1hZGp1c3Qtdm1hIGFyZSBhbGlhc2VzIGZvciB0aGVzZSB0d28pIFxuIgotIiAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzPXNlY3Rpb257PSwrLC19dmFsXVxuIgotIiAgICAgICAoLS1hZGp1c3Qtc2VjdGlvbi12bWEgaXMgYW4gYWxpYXMgZm9yIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcylcbiIKLSIgICAgICAgWy0tY2hhbmdlLXNlY3Rpb24tbG1hPXNlY3Rpb257PSwrLC19dmFsXVxuIgotIiAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi12bWE9c2VjdGlvbns9LCssLX12YWxdXG4iCi0iICAgICAgIFstLWFkanVzdC13YXJuaW5nc10gWy0tbm8tYWRqdXN0LXdhcm5pbmdzXVxuIgotIiAgICAgICBbLS1jaGFuZ2Utd2FybmluZ3NdIFstLW5vLWNoYW5nZS13YXJuaW5nc11cbiIKLSIgICAgICAgWy0tc2V0LXNlY3Rpb24tZmxhZ3M9c2VjdGlvbj1mbGFnc10gIgotIlstLWFkZC1zZWN0aW9uPXNlY3Rpb25uYW1lPWZpbGVuYW1lXVxuIgotIiAgICAgICBbLS1rZWVwLXN5bWJvbCBzeW1ib2xdIFstSyBzeW1ib2xdIFstLXN0cmlwLXN5bWJvbCBzeW1ib2xdIFstTiAiCi0ic3ltYm9sXVxuIgotIiAgICAgICBbLS1sb2NhbGl6ZS1zeW1ib2wgc3ltYm9sXSBbLUwgc3ltYm9sXSBbLS13ZWFrZW4tc3ltYm9sIHN5bWJvbF1cbiIKLSIgICAgICAgWy1XIHN5bWJvbF0gWy0tY2hhbmdlLWxlYWRpbmctY2hhcl0gWy0tcmVtb3ZlLWxlYWRpbmctY2hhcl0gIgotIlstLXdlYWtlbl1cbiIKLSIgICAgICAgWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gaW4tZmlsZSBbb3V0LWZpbGVdXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjMyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstdlZzU3BneFhdIFstSSBiZmRuYW1lXSBbLU8gYmZkbmFtZV0gWy1GIGJmZG5hbWVdIFstUiBzZWN0aW9uXVxuIgotIiAgICAgICBbLS1pbnB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tb3V0cHV0LXRhcmdldD1iZmRuYW1lXSAiCi0iWy0tdGFyZ2V0PWJmZG5hbWVdXG4iCi0iICAgICAgIFstLXN0cmlwLWFsbF0gWy0tc3RyaXAtZGVidWddIFstLXN0cmlwLXVubmVlZGVkXSBbLS1kaXNjYXJkLWFsbF1cbiIKLSIgICAgICAgWy0tZGlzY2FyZC1sb2NhbHNdIFstLWtlZXAtc3ltYm9sIHN5bWJvbF0gWy1LIHN5bWJvbF1cbiIKLSIgICAgICAgWy0tc3RyaXAtc3ltYm9sIHN5bWJvbF0gWy1OIHN5bWJvbF0gWy0tcmVtb3ZlLXNlY3Rpb249c2VjdGlvbl1cbiIKLSIgICAgICAgWy1vIGZpbGVdIFstLXByZXNlcnZlLWRhdGVzXSBbLS12ZXJib3NlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSAiCi0iZmlsZS4uLlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzozODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIHNlY3Rpb24gZmxhZyBgJXMnIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzozODQKLW1zZ2lkICJzdXBwb3J0ZWQgZmxhZ3M6IGFsbG9jLCBsb2FkLCByZWFkb25seSwgY29kZSwgZGF0YSwgcm9tLCBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6NjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNvcHkgZnJvbSAlcyglcykgdG8gJXMoJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjY0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBPdXRwdXQgZmlsZSBjYW5ub3QgcmVwcmVzZW50IGFyY2hpdGVjdHVyZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6NjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IGNyZWF0ZSBzZWN0aW9uIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgZmlsbCBnYXAgYWZ0ZXIgJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo3ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgYWRkIHBhZGRpbmcgdG8gJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo5MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVycm9yIGNvcHlpbmcgcHJpdmF0ZSBCRkQgZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjk1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgbWtkaXIgJXMgZm9yIGFyY2hpdmUgY29weWluZyAoZXJyb3I6ICVzKSIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTIxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2VjdGlvbiBgJXMnOiBlcnJvciBpbiAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IGNyZWF0ZSBkZWJ1Z2dpbmcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE1MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IHNldCBkZWJ1Z2dpbmcgc2VjdGlvbiBjb250ZW50czogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE1MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGRvbid0IGtub3cgaG93IHRvIHdyaXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE2MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBzdGF0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTY2OAotbXNnaWQgImJ5dGUgbnVtYmVyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNjczCi1tc2dpZCAiaW50ZXJsZWF2ZSBtdXN0IGJlIHBvc2l0aXZlIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNzQyCi1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgLS1hZGQtc2VjdGlvbiBOQU1FPUZJTEVOQU1FIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0OiAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW46ICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTc2NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZnJlYWQgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxODA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBmb3JtYXQgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxODY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHRydW5jYXRpbmcgZ2FwLWZpbGwgZnJvbSAweCVzIHRvIDB4JXgiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4OTIKLW1zZ2lkICJiYWQgZm9ybWF0IGZvciAtLXNldC1zZWN0aW9uLWZsYWdzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxOTIyCi1tc2dpZCAiYnl0ZSBudW1iZXIgbXVzdCBiZSBsZXNzIHRoYW4gaW50ZXJsZWF2ZSIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTk0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3Qgc3RhdDogJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxOTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tdm1hICVzJWMweCVzIG5ldmVyIHVzZWQiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi1sbWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1haGlmQ2REcHJSdFR4c1Nsd10gWy1iIGJmZG5hbWVdIFstbSBtYWNoaW5lXSBbLWogc2VjdGlvbi1uYW1lXVxuIgotIiAgICAgICBbLS1hcmNoaXZlLWhlYWRlcnNdIFstLXRhcmdldD1iZmRuYW1lXSBbLS1kZWJ1Z2dpbmddIFstLWRpc2Fzc2VtYmxlXVxuIgotIiAgICAgICBbLS1kaXNhc3NlbWJsZS1hbGxdIFstLWRpc2Fzc2VtYmxlLXplcm9lc10gWy0tZmlsZS1oZWFkZXJzXVxuIgotIiAgICAgICBbLS1zZWN0aW9uLWhlYWRlcnNdIFstLWhlYWRlcnNdXG4iCi0iICAgICAgIFstLWluZm9dIFstLXNlY3Rpb249c2VjdGlvbi1uYW1lXSBbLS1saW5lLW51bWJlcnNdIFstLXNvdXJjZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjI2Ci1tc2dpZCAiIgotIiAgICAgICBbLS1hcmNoaXRlY3R1cmU9bWFjaGluZV0gWy0tcmVsb2NdIFstLWZ1bGwtY29udGVudHNdIFstLXN0YWJzXVxuIgotIiAgICAgICBbLS1zeW1zXSBbLS1hbGwtaGVhZGVyc10gWy0tZHluYW1pYy1zeW1zXSBbLS1keW5hbWljLXJlbG9jXVxuIgotIiAgICAgICBbLS13aWRlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBbLS1wcml2YXRlLWhlYWRlcnNdXG4iCi0iICAgICAgIFstLXN0YXJ0LWFkZHJlc3M9YWRkcl0gWy0tc3RvcC1hZGRyZXNzPWFkZHJdXG4iCi0iICAgICAgIFstLXByZWZpeC1hZGRyZXNzZXNdIFstLVtuby1dc2hvdy1yYXctaW5zbl0gWy0tZGVtYW5nbGVdXG4iCi0iICAgICAgIFstLWFkanVzdC12bWE9b2Zmc2V0XSBbLUVCfC1FTF0gWy0tZW5kaWFuPXtiaWd8bGl0dGxlfV0gb2JqZmlsZS4uLlxuIgotImF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyAtbCAoLS1saW5lLW51bWJlcnMpIG11c3QgYmUgZ2l2ZW5cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MzYxCi1tc2dpZCAiU2VjdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjM2MwotbXNnaWQgIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgTE1BICAgICAgIEZpbGUgb2ZmICBBbGduXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjM2NQotbXNnaWQgIiIKLSJJZHggTmFtZSAgICAgICAgICBTaXplICAgICAgVk1BICAgICAgICAgICAgICAgTE1BICAgICAgICAgICAgICAgRmlsZSBvZmYgICIKLSJBbGduXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjQxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IG5vdCBhIGR5bmFtaWMgb2JqZWN0XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjQzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IE5vIGR5bmFtaWMgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxMTMxCi1tc2dpZCAiT3V0IG9mIHZpcnR1YWwgbWVtb3J5XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE1MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IHVzZSBzdXBwbGllZCBtYWNoaW5lICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE1NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IGRpc2Fzc2VtYmxlIGZvciBhcmNoaXRlY3R1cmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTYyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJEaXNhc3NlbWJseSBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxNzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJObyAlcyBzZWN0aW9uIHByZXNlbnRcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTgwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXMgaGFzIG5vICVzIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTgxOCBvYmpkdW1wLmM6MTgyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUmVhZGluZyAlcyBzZWN0aW9uIG9mICVzIGZhaWxlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTg3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iQ29udGVudHMgb2YgJXMgc2VjdGlvbjpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTk3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJhcmNoaXRlY3R1cmU6ICVzLCAiCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmxhZ3MgMHglMDh4OlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxOTg3Ci1tc2dpZCAiIgotIlxuIgotInN0YXJ0IGFkZHJlc3MgMHgiCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIwMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiVzOiAgICAgZmlsZSBmb3JtYXQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjA3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcHJpbnRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkluIGFyY2hpdmUgJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIxNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjY2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyNzg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlY29nbml6ZWQgLUUgb3B0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjI4MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCAtLWVuZGlhbiB0eXBlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiByZGNvZmYuYzoyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHBhcnNlX2NvZmZfdHlwZTogQmFkIHR5cGUgY29kZSAweCV4XG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6NDIzIHJkY29mZi5jOjUzMSByZGNvZmYuYzo3MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjQzOSByZGNvZmYuYzo3MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJmZF9jb2ZmX2dldF9hdXhlbnQgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJWxkOiAuYmYgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZGNvZmYuYzo4NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVsZDogdW5leHBlY3RlZCAuZWZcbiIKLW1zZ3N0ciAiIgotCi0jOiByZGRiZy5jOjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyByZWNvZ25pemVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHJkZGJnLmM6NDAwCi1tc2dpZCAiTGFzdCBzdGFicyBlbnRyaWVzIGJlZm9yZSBlcnJvcjpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjM3IHJlYWRlbGYuYzoyNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEVycm9yOiAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI0OSByZWFkZWxmLmM6Mjc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBXYXJuaW5nOiAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwOCByZWFkZWxmLmM6MzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuaGFuZGxlZCBkYXRhIGxlbmd0aDogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzcyCi1tc2dpZCAiRG9uJ3Qga25vdyBhYm91dCByZWxvY2F0aW9ucyBvbiB0aGlzIG1hY2hpbmUgYXJjaGl0ZWN0dXJlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQxMCByZWFkZWxmLmM6NDM5Ci1tc2dpZCAib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDU2Ci1tc2dpZCAiIgotIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZSAgICAgICAgICAiCi0iQWRkZW5kXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ1OQotbXNnaWQgIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pc2VkOiAlLTdseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjxzdHJpbmcgdGFibGUgaW5kZXggJTNsZD4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjczOQotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzb3IgU3BlY2lmaWM6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9wZXJhdGluZyBTeXN0ZW0gc3BlY2lmaWM6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzQ0IHJlYWRlbGYuYzo5OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc1OAotbXNnaWQgIk5PTkUgKE5vbmUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NTkKLW1zZ2lkICJSRUwgKFJlbG9jYXRhYmxlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NjAKLW1zZ2lkICJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NjEKLW1zZ2lkICJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2MgotbXNnaWQgIkNPUkUgKENvcmUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzb3IgU3BlY2lmaWM6ICgleCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJPUyBTcGVjaWZpYzogKCV4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzcwIHJlYWRlbGYuYzo4MjkgcmVhZGVsZi5jOjkzMiByZWFkZWxmLmM6MTEwNwotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICV4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3ODMKLW1zZ2lkICJOb25lIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo5MjkKLW1zZ2lkICJFTEZEQVRBMkxTQiAobGl0dGxlIGVuZGlhbikiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjkzMAotbXNnaWQgIkVMRkRBVEEyTVNCIChiaWcgZW5kaWFuKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE0MwotbXNnaWQgIlVzYWdlOiByZWFkZWxmIHtvcHRpb25zfSBlbGYtZmlsZShzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ0Ci1tc2dpZCAiICBPcHRpb25zIGFyZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE0NQotbXNnaWQgIiIKLSIgIC1hIG9yIC0tYWxsICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVMgLXMgLXIgLWQgLVYgLS1oaXN0b2dyYW1cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE0NgotbXNnaWQgIiAgLWggb3IgLS1maWxlLWhlYWRlciAgICAgICBEaXNwbGF5IHRoZSBFTEYgZmlsZSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE0NwotbXNnaWQgIiAgLWwgb3IgLS1wcm9ncmFtLWhlYWRlcnMgb3IgLS1zZWdtZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ4Ci1tc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVyc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ5Ci1tc2dpZCAiICAtUyBvciAtLXNlY3Rpb24taGVhZGVycyBvciAtLXNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTAKLW1zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgc2VjdGlvbnMnIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTUxCi1tc2dpZCAiICAtZSBvciAtLWhlYWRlcnMgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1oIC1sIC1TXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTIKLW1zZ2lkICIgIC1zIG9yIC0tc3ltcyBvciAtLXN5bWJvbHMgRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTMKLW1zZ2lkICIgIC1yIG9yIC0tcmVsb2NzICAgICAgICAgICAgRGlzcGxheSB0aGUgcmVsb2NhdGlvbnMgKGlmIHByZXNlbnQpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTQKLW1zZ2lkICIgIC1kIG9yIC0tZHluYW1pYyAgICAgICAgICAgRGlzcGxheSB0aGUgZHluYW1pYyBzZWdtZW50IChpZiBwcmVzZW50KVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTU1Ci1tc2dpZCAiICAtViBvciAtLXZlcnNpb24taW5mbyAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gc2VjdGlvbnMgKGlmIHByZXNlbnQpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTYKLW1zZ2lkICIiCi0iICAtRCBvciAtLXVzZS1keW5hbWljICAgICAgIFVzZSB0aGUgZHluYW1pYyBzZWN0aW9uIGluZm8gd2hlbiBkaXNwbGF5aW5nICIKLSJzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTcKLW1zZ2lkICIgIC14IDxudW1iZXI+IG9yIC0taGV4LWR1bXA9PG51bWJlcj5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1OAotbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1wIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTkKLW1zZ2lkICIgIC13W2xpYXByXSBvciAtLWRlYnVnLWR1bXBbPWxpbmUsPWluZm8sPWFiYnJldiw9cHVibmFtZXMsPXJhbmdlc11cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE2MAotbXNnaWQgIiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgRFdBUkYyIGRlYnVnIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjIKLW1zZ2lkICIgIC1pIDxudW1iZXI+IG9yIC0taW5zdHJ1Y3Rpb24tZHVtcD08bnVtYmVyPlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTYzCi1tc2dpZCAiIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2Ygc2VjdGlvbiA8bnVtYmVyPlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTY1Ci1tc2dpZCAiICAgICAgICAtLWhpc3RvZ3JhbSAgICAgICAgIERpc3BsYXkgaGlzdG9ncmFtIG9mIGJ1Y2tldCBsaXN0IGxlbmd0aHNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE2NgotbXNnaWQgIiAgLXYgb3IgLS12ZXJzaW9uICAgICAgICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiByZWFkZWxmXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjcKLW1zZ2lkICIgIC1IIG9yIC0taGVscCAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExODUKLW1zZ2lkICJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgZHVtcCByZXF1ZXN0IHRhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbmlzZWQgZGVidWcgb3B0aW9uICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTMzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG9wdGlvbiAnLSVjJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzQ3Ci1tc2dpZCAiTm90aGluZyB0byBkby5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM2MCByZWFkZWxmLmM6MTM3NyByZWFkZWxmLmM6MjUzMQotbXNnaWQgIm5vbmUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNjEKLW1zZ2lkICJFTEYzMiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM2MgotbXNnaWQgIkVMRjY0IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzY0IHJlYWRlbGYuYzoxMzgxIHJlYWRlbGYuYzoxMzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duOiAlbHg+IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzc4Ci1tc2dpZCAiMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNzkKLW1zZ2lkICIyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM5NAotbXNnaWQgIlVOSVggLSBTeXN0ZW0gViIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM5NQotbXNnaWQgIlVOSVggLSBIUC1VWCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM5NgotbXNnaWQgIlN0YW5kYWxvbmUgQXBwIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDEzCi1tc2dpZCAiTm90IGFuIEVMRiBmaWxlIC0gaXQgaGFzIHRoZSB3cm9uZyBtYWdpYyBieXRlcyBhdCB0aGUgc3RhcnRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQyMQotbXNnaWQgIkVMRiBIZWFkZXI6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0MjIKLW1zZ2lkICIgIE1hZ2ljOiAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQyOCByZWFkZWxmLmM6MTQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIERhdGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgJWQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICVsZCAoYnl0ZXMgaW50byBmaWxlKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseCVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICVsZCAoYnl0ZXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NzYKLW1zZ2lkICJOb3QgYSAzMiBiaXQgRUxGIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ5NgotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBhcmUgbm8gcHJvZ3JhbSBoZWFkZXJzIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTUwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRWxmIGZpbGUgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTUwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJFbnRyeSBwb2ludCAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRoZXJlIGFyZSAlZCBwcm9ncmFtIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAlbHg6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1MTcgcmVhZGVsZi5jOjE2NjggcmVhZGVsZi5jOjE3MTEgcmVhZGVsZi5jOjIwOTAgcmVhZGVsZi5jOjIyMTQKLSM6IHJlYWRlbGYuYzozMTE1IHJlYWRlbGYuYzozMTI5Ci1tc2dpZCAiT3V0IG9mIG1lbW9yeVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJQcm9ncmFtIEhlYWRlciVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTQyCi1tc2dpZCAiIgotIiAgVHlwZSAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICBQaHlzQWRkciAgIEZpbGVTaXogTWVtU2l6ICBGbGcgQWxpZ25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTU3OAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgZHluYW1pYyBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1ODYKLW1zZ2lkICJVbmFibGUgdG8gZmluZCBwcm9ncmFtIGludGVycHJldGVyIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTU5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgW1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjExCi1tc2dpZCAiIgotIlxuIgotIiBTZWN0aW9uIHRvIFNlZ21lbnQgbWFwcGluZzpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTYxMgotbXNnaWQgIiAgU2VnbWVudCBTZWN0aW9ucy4uLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNzQ2Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBzZWN0aW9ucyBpbiB0aGlzIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE3NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhlcmUgYXJlICVkIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICVseDpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTc4NgotbXNnaWQgIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzeW1ib2wgdGFibGVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE3OTkKLW1zZ2lkICJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3RyaW5nIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxODI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIEhlYWRlciVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxODI4Ci1tc2dpZCAiIgotIiAgW05yXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgIgotIkluZiBBbFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsZCBieXRlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTkxNgotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBhcmUgbm8gZHluYW1pYyByZWxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5NDMKLW1zZ2lkICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTgyCi1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyByZWxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIwNzAKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgaXMgbm8gZHluYW1pYyBzZWdtZW50IGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjEyOAotbXNnaWQgIlVuYWJsZSB0byBzZWVrIHRvIGVuZCBvZiBmaWxlISIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjEzNAotbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzeW1ib2xzIHRvIGxvYWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjE2NAotbXNnaWQgIlVuYWJsZSB0byBzZWVrIHRvIGVuZCBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIxNzAKLW1zZ2lkICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgc2VnbWVudCBhdCBvZmZzZXQgMHgleCBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjM0Ci1tc2dpZCAiICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgMHglLTguOGx4ICglcyklKnMiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNTQKLW1zZ2lkICJBdXhpbGlhcnkgbGlicmFyeSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjI1NgotbXNnaWQgIkZpbHRlciBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjY4IHJlYWRlbGYuYzoyMjg5IHJlYWRlbGYuYzoyMzE1Ci1tc2dpZCAiRmxhZ3M6IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjcwIHJlYWRlbGYuYzoyMjkxIHJlYWRlbGYuYzoyMzE3Ci1tc2dpZCAiIE5vbmVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJTaGFyZWQgbGlicmFyeTogWyVzXSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQyNQotbXNnaWQgIiBwcm9ncmFtIGludGVycHJldGVyXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBzb25hbWU6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHJwYXRoOiBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI0ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm90IG5lZWRlZCBvYmplY3Q6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gJyVzJyBjb250YWlucyAlbGQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU4MAotbXNnaWQgIiAgQWRkcjogMHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI1ODIgcmVhZGVsZi5jOjI3NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPZmZzZXQ6ICUjMDhseCAgTGluazogJWx4ICglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjYxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBSZXY6ICVkICBGbGFnczogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJbmRleDogJWQgIENudDogJWQgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjYyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJOYW1lOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5hbWUgaW5kZXg6ICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFBhcmVudCAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQsIG5hbWUgaW5kZXg6ICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIG5lZWRzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlbGQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY2OAotbXNnaWQgIiBBZGRyOiAweCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldDogJSMwOGx4ICBMaW5rIHRvIHNlY3Rpb246ICVsZCAoJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZpbGU6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIENudDogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjcyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBOYW1lOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjcyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBOYW1lIGluZGV4OiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI3MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogJXMgIFZlcnNpb246ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gc3ltYm9scyBzZWN0aW9uICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjc2OQotbXNnaWQgIiBBZGRyOiAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI3OTgKLW1zZ2lkICIgICAwICgqbG9jYWwqKSAgICAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI4MDIKLW1zZ2lkICIgICAxICgqZ2xvYmFsKikgICAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwMjUKLW1zZ2lkICIiCi0iXG4iCi0iTm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGlzIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwMzgKLW1zZ2lkICJMT0NBTCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzAzOQotbXNnaWQgIkdMT0JBTCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA0MAotbXNnaWQgIldFQUsiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNDMgcmVhZGVsZi5jOjMwNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHByb2Nlc3NvciBzcGVjaWZpYz46ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDQ1IHJlYWRlbGYuYzozMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjxPUyBzcGVjaWZpYz46ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDQ3IHJlYWRlbGYuYzozMDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNjAKLW1zZ2lkICJOT1RZUEUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNjEKLW1zZ2lkICJPQkpFQ1QiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNjIKLW1zZ2lkICJGVU5DIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDYzCi1tc2dpZCAiU0VDVElPTiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2NAotbXNnaWQgIkZJTEUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxMjEKLW1zZ2lkICJVbmFibGUgdG8gcmVhZCBpbiBkeW5hbWljIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE2MwotbXNnaWQgIlVuYWJsZSB0byBzZWVrIHRvIHN0YXJ0IG9mIGR5bmFtaWMgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxNjkKLW1zZ2lkICJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgYnVja2V0c1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMTc1Ci1tc2dpZCAiRmFpbGVkIHRvIHJlYWQgaW4gbnVtYmVyIG9mIGNoYWluc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMTk1Ci1tc2dpZCAiIgotIlxuIgotIlN5bWJvbCB0YWJsZSBmb3IgaW1hZ2U6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxOTYKLW1zZ2lkICIgIE51bSBCdWM6ICAgIFZhbHVlICBTaXplICAgVHlwZSAgIEJpbmQgT3QgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzI0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlICclcycgY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMyNDQKLW1zZ2lkICIgIE51bTogICAgVmFsdWUgIFNpemUgVHlwZSAgICBCaW5kICAgT3QgIE5keCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMzNTYKLW1zZ2lkICJiYWQgZHluYW1pYyBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM0MTUKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzcGxheWluZyBzeW1ib2xzLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNDI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCAodG90YWwgb2YgJWQgYnVja2V0cyk6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM0MjkKLW1zZ2lkICIgTGVuZ3RoICBOdW1iZXIgICAgICUlIG9mIHRvdGFsICBDb3ZlcmFnZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNDM0IHJlYWRlbGYuYzozNDUzIHJlYWRlbGYuYzo1MzM2IHJlYWRlbGYuYzo1NTI2Ci1tc2dpZCAiT3V0IG9mIG1lbW9yeSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzQ5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBpbmZvIHNlZ21lbnQgYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1MDIKLW1zZ2lkICIgTnVtOiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmRUbyAgICAgRmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzU1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQXNzZW1ibHkgZHVtcCBvZiBzZWN0aW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gJyVzJyBoYXMgbm8gZGF0YSB0byBkdW1wLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uICclcyc6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3MjgKLW1zZ2lkICJiYWRseSBmb3JtZWQgZXh0ZW5kZWQgbGluZSBvcCBlbmNvdW50ZXJlZCEiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBFeHRlbmRlZCBvcGNvZGUgJWQ6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc0MAotbXNnaWQgIiIKLSJFbmQgb2YgU2VxdWVuY2VcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZXQgQWRkcmVzcyB0byAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzUyCi1tc2dpZCAiICBkZWZpbmUgbmV3IEZpbGUgVGFibGUgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc1MyByZWFkZWxmLmM6Mzg3MQotbXNnaWQgIiAgRW50cnlcdERpclx0VGltZVx0U2l6ZVx0TmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICVkXHQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NTggcmVhZGVsZi5jOjM3NjAgcmVhZGVsZi5jOjM3NjIgcmVhZGVsZi5jOjM4ODMgcmVhZGVsZi5jOjM4ODUKLSM6IHJlYWRlbGYuYzozODg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVsdVx0IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlc1xuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVOS05PV046IGxlbmd0aCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEdW1wIG9mIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MDEKLW1zZ2lkICJUaGUgbGluZSBpbmZvIGFwcGVhcnMgdG8gYmUgY29ycnVwdCAtIHRoZSBzZWN0aW9uIGlzIHRvbyBzbWFsbFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODA5Ci1tc2dpZCAiT25seSBEV0FSRiB2ZXJzaW9uIDIgbGluZSBpbmZvIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRFdBUkYgVmVyc2lvbjogICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgUHJvbGd1ZSBMZW5ndGg6ICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTWluaW11bSBJbnN0cnVjdGlvbiBMZW5ndGg6ICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgSW5pdGlhbCB2YWx1ZSBvZiAnaXNfc3RtdCc6ICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGluZSBCYXNlOiAgICAgICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGluZSBSYW5nZTogICAgICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT3Bjb2RlIEJhc2U6ICAgICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODQwCi1tc2dpZCAiIgotIlxuIgotIiBPcGNvZGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT3Bjb2RlICVkIGhhcyAlZCBhcmdzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NDkKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBEaXJlY3RvcnkgVGFibGUgaXMgZW1wdHkuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NTIKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBEaXJlY3RvcnkgVGFibGU6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODY3Ci1tc2dpZCAiIgotIlxuIgotIiBUaGUgRmlsZSBOYW1lIFRhYmxlIGlzIGVtcHR5LlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODcwCi1tc2dpZCAiIgotIlxuIgotIiBUaGUgRmlsZSBOYW1lIFRhYmxlOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJWRcdCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlc1xuIgotbXNnc3RyICIiCi0KLSMuIE5vdyBkaXNwbGF5IHRoZSBzdGF0ZW1lbnRzLgotIzogcmVhZGVsZi5jOjM4OTcKLW1zZ2lkICIiCi0iXG4iCi0iIExpbmUgTnVtYmVyIFN0YXRlbWVudHM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5MTUKLW1zZ2lkICIgIENvcHlcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgJWQgdG8gJWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBBZHZhbmNlIExpbmUgYnkgJWQgdG8gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNldCBGaWxlIE5hbWUgdG8gZW50cnkgJWQgaW4gdGhlIEZpbGUgTmFtZSBUYWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2V0IGNvbHVtbiB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2V0IGlzX3N0bXQgdG8gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk1NwotbXNnaWQgIiAgU2V0IGJhc2ljIGJsb2NrXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBBZHZhbmNlIFBDIGJ5IGNvbnN0YW50ICVkIHRvIDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBBZHZhbmNlIFBDIGJ5IGZpeGVkIHNpemUgYW1vdW50ICVkIHRvIDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTcGVjaWFsIG9wY29kZSAlZDogYWR2YW5jZSBBZGRyZXNzIGJ5ICVkIHRvIDB4JWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhbmQgTGluZSBieSAlZCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDA3IHJlYWRlbGYuYzo0NDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb250ZW50cyBvZiB0aGUgJXMgc2VjdGlvbjpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDAyNgotbXNnaWQgIk9ubHkgRFdBUkYgMiBwdWJuYW1lcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDAzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDAzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT2Zmc2V0IGludG8gLmRlYnVnX2luZm8gc2VjdGlvbjogICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBhcmVhIGluIC5kZWJ1Z19pbmZvIHNlY3Rpb246ICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDM5Ci1tc2dpZCAiIgotIlxuIgotIiAgICBPZmZzZXRcdE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIFRBRyB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gQVQgdmFsdWU6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDI1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIEZPUk0gdmFsdWU6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDQzMgotbXNnaWQgIiAgTnVtYmVyIFRBR1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICVsZCAgICAgICVzICAgIFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDQ0MQotbXNnaWQgImhhcyBjaGlsZHJlbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDQ0MQotbXNnaWQgIm5vIGNoaWxkcmVuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAlLTE4cyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAlbHUgYnl0ZSBibG9jazogIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NjMzCi1tc2dpZCAiKFVzZXIgZGVmaW5lZCBsb2NhdGlvbiBvcCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ2MzUKLW1zZ2lkICIoVW5rbm93biBsb2NhdGlvbiBvcCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hYmxlIHRvIGhhbmRsZSBGT1JNOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbmlzZWQgZm9ybTogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NjkKLW1zZ2lkICIobm90IGlubGluZWQpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzcwCi1tc2dpZCAiKGlubGluZWQpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzcxCi1tc2dpZCAiKGRlY2xhcmVkIGFzIGlubGluZSBidXQgaWdub3JlZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NzIKLW1zZ2lkICIoZGVjbGFyZWQgYXMgaW5saW5lIGFuZCBpbmxpbmVkKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIChVbmtub3duIGlubGluZSBhdHRyaWJ1dGUgdmFsdWU6ICVseCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MDMgcmVhZGVsZi5jOjUwMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTI1Ci1tc2dpZCAiT25seSB2ZXJzaW9uIDIgRFdBUkYgZGVidWcgaW5mb3JtYXRpb24gaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDkyOQotbXNnaWQgIiAgQ29tcGlsYXRpb24gVW5pdDpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDkzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICBMZW5ndGg6ICAgICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDkzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICBWZXJzaW9uOiAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIEFiYnJldiBPZmZzZXQ6ICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIFBvaW50ZXIgU2l6ZTogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5NTMKLW1zZ2lkICJVbmFibGUgdG8gbG9jYXRlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbiFcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gbG9jYXRlIGVudHJ5ICVkIGluIHRoZSBhYmJyZXZpYXRpb24gdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgPCVkPjwleD46IEFiYnJldiBOdW1iZXI6ICVkICglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTA0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbzogICVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgUG9pbnRlciBTaXplOiAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2VnbWVudCBTaXplOiAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDUxCi1tc2dpZCAiIgotIlxuIgotIiAgICBBZGRyZXNzICBMZW5ndGhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTA4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJEaXNwbGF5aW5nIHRoZSBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICclcycgaGFzIG5vIGRlYnVnZ2luZyBkYXRhLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBkZWJ1ZyBzZWN0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MTgzCi1tc2dpZCAiU29tZSBzZWN0aW9ucyB3ZXJlIG5vdCBkdW1wZWQgYmVjYXVzZSB0aGV5IGRvIG5vdCBleGlzdCFcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTM1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU1MTkKLW1zZ2lkICJjb25mbGljdCBsaXN0IHdpdGggd2l0aG91dCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTU0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiAnLmNvbmZsaWN0JyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1NTQ4Ci1tc2dpZCAiICBOdW06ICAgIEluZGV4ICAgICAgIFZhbHVlICBOYW1lIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1NjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5wdXQgZmlsZSAlcyBub3QgZm91bmQuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEZhaWxlZCB0byByZWFkIGZpbGUgaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkZpbGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVuYW1lLmM6MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3Qgc2V0IHRpbWU6ICVzIgotbXNnc3RyICIiCi0KLSMuIFdlIGhhdmUgdG8gY2xlYW4gdXAgaGVyZS4KLSM6IHJlbmFtZS5jOjE2MCByZW5hbWUuYzoxOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbmFtZTogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVuYW1lLmM6MjAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzaW1wbGVfY29weTogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBub3QgZW5vdWdoIGJpbmFyeSBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjE0OQotbXNnaWQgIm51bGwgdGVybWluYXRlZCB1bmljb2RlIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxNzkgcmVzYmluLmM6MTg1Ci1tc2dpZCAicmVzb3VyY2UgSUQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MjI5Ci1tc2dpZCAiY3Vyc29yIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjI2MyByZXNiaW4uYzoyNzAKLW1zZ2lkICJtZW51IGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyODAKLW1zZ2lkICJtZW51ZXggaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjI4NAotbXNnaWQgIm1lbnVleCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIG1lbnUgdmVyc2lvbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzozMTkgcmVzYmluLmM6MzM0IHJlc2Jpbi5jOjQwMAotbXNnaWQgIm1lbnVpdGVtIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo0MzAKLW1zZ2lkICJtZW51aXRlbSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo0NzEgcmVzYmluLmM6NDk5Ci1tc2dpZCAiZGlhbG9nIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBkaWFsb2cgc2lnbmF0dXJlICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjUzMQotbXNnaWQgImRpYWxvZyBmb250IHBvaW50IHNpemUiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NTM5Ci1tc2dpZCAiZGlhbG9nZXggZm9udCBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1NjQgcmVzYmluLmM6NTgyCi1tc2dpZCAiZGlhbG9nIGNvbnRyb2wiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NTc0Ci1tc2dpZCAiZGlhbG9nZXggY29udHJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo2MDMKLW1zZ2lkICJkaWFsb2cgY29udHJvbCBlbmQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NjE1Ci1tc2dpZCAiZGlhbG9nIGNvbnRyb2wgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo2NTgKLW1zZ2lkICJzdHJpbmd0YWJsZSBzdHJpbmcgbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjY2OAotbXNnaWQgInN0cmluZ3RhYmxlIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3MDEKLW1zZ2lkICJmb250ZGlyIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3MTQKLW1zZ2lkICJmb250ZGlyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjczMAotbXNnaWQgImZvbnRkaXIgZGV2aWNlIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NzM2Ci1tc2dpZCAiZm9udGRpciBmYWNlIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6Nzc5Ci1tc2dpZCAiYWNjZWxlcmF0b3IiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6ODQzCi1tc2dpZCAiZ3JvdXAgY3Vyc29yIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo4NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBncm91cCBjdXJzb3IgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo4NjIKLW1zZ2lkICJncm91cCBjdXJzb3IiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6OTAxCi1tc2dpZCAiZ3JvdXAgaWNvbiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6OTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZ3JvdXAgaWNvbiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjkyMAotbXNnaWQgImdyb3VwIGljb24iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6OTkxIHJlc2Jpbi5jOjEyMTAKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidmVyc2lvbiBsZW5ndGggJWQgZG9lcyBub3QgbWF0Y2ggcmVzb3VyY2UgbGVuZ3RoICVsdSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGxlbmd0aCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDQ0Ci1tc2dpZCAiZml4ZWQgdmVyc2lvbiBpbmZvIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIHNpZ25hdHVyZSAlbHUiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mbyB2ZXJzaW9uICVsdSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDgxCi1tc2dpZCAidmVyc2lvbiB2YXIgaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgc3RyaW5nZmlsZWluZm8gdmFsdWUgbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjExMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZ3RhYmxlIHZhbHVlIGxlbmd0aCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmcgbGVuZ3RoICVkICE9ICVkICsgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTE1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIGxlbmd0aCAlZCA8ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjExNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2YXJmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTE4OQotbXNnaWQgInZlcnNpb24gdmFyZmlsZWluZm8iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTIwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gdmFsdWUgbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxMjgKLW1zZ2lkICJmaWxlbmFtZSByZXF1aXJlZCBmb3IgQ09GRiBpbnB1dCIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogbm8gcmVzb3VyY2Ugc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxNTQKLW1zZ2lkICJjYW4ndCByZWFkIHJlc291cmNlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjE4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IGFkZHJlc3Mgb3V0IG9mIGJvdW5kcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MTk5Ci1tc2dpZCAiZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoyMjcKLW1zZ2lkICJuYW1lZCBkaXJlY3RvcnkgZW50cnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjIzNgotbXNnaWQgImRpcmVjdG9yeSBlbnRyeSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoyNTYKLW1zZ2lkICJuYW1lZCBzdWJkaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI2NAotbXNnaWQgIm5hbWVkIHJlc291cmNlIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoyNzkKLW1zZ2lkICJJRCBkaXJlY3RvcnkgZW50cnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI5NgotbXNnaWQgIklEIHN1YmRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MzA0Ci1tc2dpZCAiSUQgcmVzb3VyY2UiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjMzMAotbXNnaWQgInJlc291cmNlIHR5cGUgdW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MzMzCi1tc2dpZCAiZGF0YSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MzQxCi1tc2dpZCAicmVzb3VyY2UgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MzQ2Ci1tc2dpZCAicmVzb3VyY2UgZGF0YSBzaXplIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzo0NDEKLW1zZ2lkICJmaWxlbmFtZSByZXF1aXJlZCBmb3IgQ09GRiBvdXRwdXQiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjczNAotbXNnaWQgImNhbid0IGdldCBCRkRfUkVMT0NfUlZBIHJlbG9jYXRpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjI1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBwb3BlbiBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjI2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogcHJlcHJvY2Vzc29yIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MzExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmV4cGVjdGVkIEVPRiIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjM2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVhZCBvZiAlbHUgcmV0dXJuZWQgJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6NDEwIHJlc3JjLmM6NjQxIHJlc3JjLmM6OTE0IHJlc3JjLmM6MTA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzdGF0IGZhaWxlZCBvbiBiaXRtYXAgZmlsZSBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjQ2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjdXJzb3IgZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gY3Vyc29yIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzo0OTUgcmVzcmMuYzo3ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZzZWVrIHRvICVsdSBmYWlsZWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6NzU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImljb24gZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gaWNvbiBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MTI3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBvcGVuIGAlcycgZm9yIG91dHB1dDogJXMiCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1BQmRveFZdIFstLWZvcm1hdD1iZXJrZWxleXxzeXN2XSBbLS1yYWRpeD04fDEwfDE2XVxuIgotIiAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW2ZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjgzCi1tc2dpZCAiZGVmYXVsdCBpcyAtLWZvcm1hdD1iZXJrZWxleVxuIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzo4NQotbXNnaWQgImRlZmF1bHQgaXMgLS1mb3JtYXQ9c3lzdlxuIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzoxMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmd1bWVudCB0byAtLWZvcm1hdDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6MTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgcmFkaXg6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3Jjb252LmM6MTg3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgWy1kaFZxXSBpbi1maWxlIFtvdXQtZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmNvbnYuYzoxODg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDb252ZXJ0IGEgQ09GRiBvYmplY3QgZmlsZSBpbnRvIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyY29udi5jOjIwMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozNDkgc3RhYnMuYzoxNzYyCi1tc2dpZCAibnVtZXJpYyBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgc3RhYjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiAlczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjQ5MgotbXNnaWQgIk5fTEJSQUMgbm90IHdpdGhpbiBmdW5jdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NTMxCi1tc2dpZCAiVG9vIG1hbnkgTl9SQlJBQ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjc4MAotbXNnaWQgInVua25vd24gQysrIGVuY29kZWQgbmFtZSIKLW1zZ3N0ciAiIgotCi0jLiBDb21wbGFpbiBhbmQga2VlcCBnb2luZywgc28gY29tcGlsZXJzIGNhbiBpbnZlbnQgbmV3Ci0jLiBjcm9zcy1yZWZlcmVuY2UgdHlwZXMuCi0jOiBzdGFicy5jOjEzMDYKLW1zZ2lkICJ1bnJlY29nbml6ZWQgY3Jvc3MgcmVmZXJlbmNlIHR5cGUiCi1tc2dzdHIgIiIKLQotIy4gRG9lcyB0aGlzIGFjdHVhbGx5IGV2ZXIgaGFwcGVuPyAgSXMgdGhhdCB3aHkgd2UgYXJlIHdvcnJ5aW5nCi0jLiBhYm91dCBkZWFsaW5nIHdpdGggaXQgcmF0aGVyIHRoYW4ganVzdCBjYWxsaW5nIGVycm9yX3R5cGU/Ci0jOiBzdGFicy5jOjE4NTQKLW1zZ2lkICJtaXNzaW5nIGluZGV4IHR5cGUiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMTgxCi1tc2dpZCAidW5rbm93biB2aXJ0dWFsIGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjE5OQotbXNnaWQgInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGJhc2VjbGFzcyIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIzOTEKLW1zZ2lkICJ1bm5hbWVkICR2YiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjM5NwotbXNnaWQgInVucmVjb2duaXplZCBDKysgYWJicmV2aWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjQ3NwotbXNnaWQgInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjczMwotbXNnaWQgImNvbnN0L3ZvbGF0aWxlIGluZGljYXRvciBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6Mjk3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBtYW5nbGluZyBmb3IgXCIlc1wiXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozMjg2Ci1tc2dpZCAiVW5kZWZpbmVkIE5fRVhDTCIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjMzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHlwZSBmaWxlIG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjMzNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHlwZSBpbmRleCBudW1iZXIgJWQgb3V0IG9mIHJhbmdlXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBYQ09GRiB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozNzY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBtYW5nbGVkIG5hbWUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6Mzg2MQotbXNnaWQgIm5vIGFyZ3VtZW50IHR5cGVzIGluIG1hbmdsZWQgc3RyaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3RyaW5ncy5jOjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW52YWxpZCBudW1iZXIgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdHJpbmdzLmM6NDk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIGludGVnZXIgYXJndW1lbnQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdHJpbmdzLmM6NTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1hZm92XSBbLW4gbWluLWxlbl0gWy1taW4tbGVuXSBbLXQge28seCxkfV0gWy1dXG4iCi0iICAgICAgIFstLWFsbF0gWy0tcHJpbnQtZmlsZS1uYW1lXSBbLS1ieXRlcz1taW4tbGVuXSBbLS1yYWRpeD17byx4LGR9XVxuIgotIiAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0taGVscF0gWy0tdmVyc2lvbl0gZmlsZS4uLlxuIgotbXNnc3RyICIiCi0KLSM6IHN5c2R1bXAuYzo3MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzeXNkdW1wLmM6NzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogdmVyc2lvbi5jOjM5Ci1tc2dpZCAiQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iCi1tc2dzdHIgIiIKLQotIzogdmVyc2lvbi5jOjQwCi1tc2dpZCAiIgotIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcbiIKLSJ0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjIzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBvcGVuICVzIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo0MTIKLW1zZ2lkICI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQyNAotbXNnaWQgIjogZXhwZWN0ZWQgdG8gYmUgYSBsZWFmXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo0MzUKLW1zZ2lkICI6IGR1cGxpY2F0ZSB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo1OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gZm9ybWF0IHR5cGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo1OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN1cHBvcnRlZCBmb3JtYXRzOiIKLW1zZ3N0ciAiIgotCi0jLiBPdGhlcndpc2UsIHdlIGdpdmUgdXAuCi0jOiB3aW5kcmVzLmM6Njg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbiBub3QgZGV0ZXJtaW5lIHR5cGUgb2YgZmlsZSBgJXMnOyB1c2UgdGhlIC1JIG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbb3B0aW9uc10gW2lucHV0LWZpbGVdIFtvdXRwdXQtZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzAyCi1tc2dpZCAiIgotIk9wdGlvbnM6XG4iCi0iICAtaSBGSUxFLCAtLWlucHV0IEZJTEUgICAgICAgTmFtZSBpbnB1dCBmaWxlXG4iCi0iICAtbyBGSUxFLCAtLW91dHB1dCBGSUxFICAgICAgTmFtZSBvdXRwdXQgZmlsZVxuIgotIiAgLUkgRk9STUFULCAtLWlucHV0LWZvcm1hdCBGT1JNQVRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGlucHV0IGZvcm1hdFxuIgotIiAgLU8gRk9STUFULCAtLW91dHB1dC1mb3JtYXQgRk9STUFUXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBvdXRwdXQgZm9ybWF0XG4iCi0iICAtRiBUQVJHRVQsIC0tdGFyZ2V0IFRBUkdFVCAgU3BlY2lmeSBDT0ZGIHRhcmdldFxuIgotIiAgLS1wcmVwcm9jZXNzb3IgUFJPR1JBTSAgICAgIFByb2dyYW0gdG8gdXNlIHRvIHByZXByb2Nlc3MgcmMgZmlsZVxuIgotIiAgLS1pbmNsdWRlLWRpciBESVIgICAgICAgICAgIEluY2x1ZGUgZGlyZWN0b3J5IHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG4iCi0iICAtRFNZTVs9VkFMXSwgLS1kZWZpbmUgU1lNWz1WQUxdXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIFNZTSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuIgotIiAgLXYgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcmJvc2UgLSB0ZWxscyB5b3Ugd2hhdCBpdCdzIGRvaW5nXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjcxOAotbXNnaWQgIiAgLS15eWRlYnVnICAgICAgICAgICAgICAgICAgIFR1cm4gb24gcGFyc2VyIGRlYnVnZ2luZ1xuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo3MjEKLW1zZ2lkICIiCi0iICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2VcbiIKLSIgIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICBQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjcyNAotbXNnaWQgIiIKLSJGT1JNQVQgaXMgb25lIG9mIHJjLCByZXMsIG9yIGNvZmYsIGFuZCBpcyBkZWR1Y2VkIGZyb20gdGhlIGZpbGUgbmFtZVxuIgotImV4dGVuc2lvbiBpZiBub3Qgc3BlY2lmaWVkLiAgQSBzaW5nbGUgZmlsZSBuYW1lIGlzIGFuIGlucHV0IGZpbGUuXG4iCi0iTm8gaW5wdXQtZmlsZSBpcyBzdGRpbiwgZGVmYXVsdCByYy4gIE5vIG91dHB1dC1maWxlIGlzIHN0ZG91dCwgZGVmYXVsdCByYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6OTYzCi1tc2dpZCAibm8gcmVzb3VyY2VzIgotbXNnc3RyICIiCi0KLSM6IHdyc3RhYnMuYzozNjYgd3JzdGFicy5jOjIwMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RyaW5nX2hhc2hfbG9va3VwIGZhaWxlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiB3cnN0YWJzLmM6NjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YWJfaW50X3R5cGU6IGJhZCBzaXplICV1XG4iCi1tc2dzdHIgIiIKLQotIzogd3JzdGFicy5jOjE0NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IHVua25vd24gc2l6ZSBmb3IgZmllbGQgYCVzJyBpbiBzdHJ1Y3RcbiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcHJkYmcuYyBiL2JpbnV0aWxzL3ByZGJnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDY4NGQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcHJkYmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NjIgKzAsMCBAQAotLyogcHJkYmcuYyAtLSBQcmludCBvdXQgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHByaW50cyBvdXQgdGhlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBieQotICAgc3VwcGx5aW5nIGEgc2V0IG9mIHJvdXRpbmVzIHRvIGRlYnVnX3dyaXRlLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLS8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3ZSB1c2UgYXMgYSBoYW5kbGUgZm9yIHRoZXNlIHJvdXRpbmVzLiAgKi8KLQotc3RydWN0IHByX2hhbmRsZQotewotICAvKiBGaWxlIHRvIHByaW50IGluZm9ybWF0aW9uIHRvLiAgKi8KLSAgRklMRSAqZjsKLSAgLyogQ3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4gICovCi0gIHVuc2lnbmVkIGludCBpbmRlbnQ7Ci0gIC8qIFR5cGUgc3RhY2suICAqLwotICBzdHJ1Y3QgcHJfc3RhY2sgKnN0YWNrOwotICAvKiBQYXJhbWV0ZXIgbnVtYmVyIHdlIGFyZSBhYm91dCB0byBvdXRwdXQuICAqLwotICBpbnQgcGFyYW1ldGVyOwotfTsKLQotLyogVGhlIHR5cGUgc3RhY2suICAqLwotCi1zdHJ1Y3QgcHJfc3RhY2sKLXsKLSAgLyogTmV4dCBlbGVtZW50IG9uIHRoZSBzdGFjay4gICovCi0gIHN0cnVjdCBwcl9zdGFjayAqbmV4dDsKLSAgLyogVGhpcyBlbGVtZW50LiAgKi8KLSAgY2hhciAqdHlwZTsKLSAgLyogQ3VycmVudCB2aXNpYmlsaXR5IG9mIGZpZWxkcyBpZiB0aGlzIGlzIGEgY2xhc3MuICAqLwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgLyogTmFtZSBvZiB0aGUgY3VycmVudCBtZXRob2Qgd2UgYXJlIGhhbmRsaW5nLiAgKi8KLSAgY29uc3QgY2hhciAqbWV0aG9kOwotfTsKLQotc3RhdGljIHZvaWQgaW5kZW50IFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOwotc3RhdGljIGJvb2xlYW4gcHVzaF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcmVwZW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGFwcGVuZF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdWJzdGl0dXRlX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGluZGVudF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOwotc3RhdGljIGNoYXIgKnBvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOwotc3RhdGljIHZvaWQgcHJpbnRfdm1hIFBBUkFNUyAoKGJmZF92bWEsIGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfZml4X3Zpc2liaWxpdHkKLSAgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9lbXB0eV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2Zsb2F0X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHByX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gcHJfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9lbnVtX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGJmZF9zaWduZWRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHByX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfcmFuZ2VfdHlwZSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfc2V0X3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9vZmZzZXRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jb25zdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX3N0YXJ0X3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RydWN0X2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hLCBiZmRfdm1hLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9zdHJ1Y3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX3N0YXJ0X2NsYXNzX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXRpY19tZW1iZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19iYXNlY2xhc3MKLSAgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBiZmRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9jbGFzc190eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfdHlwZWRlZl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90YWdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGJvb2xlYW4gcHJfdHlwZGVmIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90YWcgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfZmxvYXRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotc3RhdGljIGJvb2xlYW4gcHJfdHlwZWRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9mdW5jdGlvbiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfZnVuY3Rpb25fcGFyYW1ldGVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9saW5lbm8gUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgcHJfZm5zID0KLXsKLSAgcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCwKLSAgcHJfc3RhcnRfc291cmNlLAotICBwcl9lbXB0eV90eXBlLAotICBwcl92b2lkX3R5cGUsCi0gIHByX2ludF90eXBlLAotICBwcl9mbG9hdF90eXBlLAotICBwcl9jb21wbGV4X3R5cGUsCi0gIHByX2Jvb2xfdHlwZSwKLSAgcHJfZW51bV90eXBlLAotICBwcl9wb2ludGVyX3R5cGUsCi0gIHByX2Z1bmN0aW9uX3R5cGUsCi0gIHByX3JlZmVyZW5jZV90eXBlLAotICBwcl9yYW5nZV90eXBlLAotICBwcl9hcnJheV90eXBlLAotICBwcl9zZXRfdHlwZSwKLSAgcHJfb2Zmc2V0X3R5cGUsCi0gIHByX21ldGhvZF90eXBlLAotICBwcl9jb25zdF90eXBlLAotICBwcl92b2xhdGlsZV90eXBlLAotICBwcl9zdGFydF9zdHJ1Y3RfdHlwZSwKLSAgcHJfc3RydWN0X2ZpZWxkLAotICBwcl9lbmRfc3RydWN0X3R5cGUsCi0gIHByX3N0YXJ0X2NsYXNzX3R5cGUsCi0gIHByX2NsYXNzX3N0YXRpY19tZW1iZXIsCi0gIHByX2NsYXNzX2Jhc2VjbGFzcywKLSAgcHJfY2xhc3Nfc3RhcnRfbWV0aG9kLAotICBwcl9jbGFzc19tZXRob2RfdmFyaWFudCwKLSAgcHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LAotICBwcl9jbGFzc19lbmRfbWV0aG9kLAotICBwcl9lbmRfY2xhc3NfdHlwZSwKLSAgcHJfdHlwZWRlZl90eXBlLAotICBwcl90YWdfdHlwZSwKLSAgcHJfdHlwZGVmLAotICBwcl90YWcsCi0gIHByX2ludF9jb25zdGFudCwKLSAgcHJfZmxvYXRfY29uc3RhbnQsCi0gIHByX3R5cGVkX2NvbnN0YW50LAotICBwcl92YXJpYWJsZSwKLSAgcHJfc3RhcnRfZnVuY3Rpb24sCi0gIHByX2Z1bmN0aW9uX3BhcmFtZXRlciwKLSAgcHJfc3RhcnRfYmxvY2ssCi0gIHByX2VuZF9ibG9jaywKLSAgcHJfZW5kX2Z1bmN0aW9uLAotICBwcl9saW5lbm8KLX07Ci0MCi0vKiBQcmludCBvdXQgdGhlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHJlY29yZGVkIGluIGRoYW5kbGUuICAqLwotCi1ib29sZWFuCi1wcmludF9kZWJ1Z2dpbmdfaW5mbyAoZiwgZGhhbmRsZSkKLSAgICAgRklMRSAqZjsKLSAgICAgUFRSIGRoYW5kbGU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgaW5mbzsKLQotICBpbmZvLmYgPSBmOwotICBpbmZvLmluZGVudCA9IDA7Ci0gIGluZm8uc3RhY2sgPSBOVUxMOwotICBpbmZvLnBhcmFtZXRlciA9IDA7Ci0KLSAgcmV0dXJuIGRlYnVnX3dyaXRlIChkaGFuZGxlLCAmcHJfZm5zLCAoUFRSKSAmaW5mbyk7Ci19Ci0MCi0vKiBJbmRlbnQgdG8gdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuICAqLwotCi1zdGF0aWMgdm9pZAotaW5kZW50IChpbmZvKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+aW5kZW50OyBpKyspCi0gICAgcHV0YyAoJyAnLCBpbmZvLT5mKTsKLX0KLQotLyogUHVzaCBhIHR5cGUgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHVzaF90eXBlIChpbmZvLCB0eXBlKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0eXBlOwotewotICBzdHJ1Y3QgcHJfc3RhY2sgKm47Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IChzdHJ1Y3QgcHJfc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOwotCi0gIG4tPnR5cGUgPSB4c3RyZHVwICh0eXBlKTsKLSAgbi0+dmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOwotICBuLT5tZXRob2QgPSBOVUxMOwotICBuLT5uZXh0ID0gaW5mby0+c3RhY2s7Ci0gIGluZm8tPnN0YWNrID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJlcGVuZCBhIHN0cmluZyBvbnRvIHRoZSB0eXBlIG9uIHRoZSB0b3Agb2YgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJlcGVuZF90eXBlIChpbmZvLCBzKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBjaGFyICpuOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIDEpOwotICBzcHJpbnRmIChuLCAiJXMlcyIsIHMsIGluZm8tPnN0YWNrLT50eXBlKTsKLSAgZnJlZSAoaW5mby0+c3RhY2stPnR5cGUpOwotICBpbmZvLT5zdGFjay0+dHlwZSA9IG47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgdHlwZSBvbiB0aGUgdG9wIG9mIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFwcGVuZF90eXBlIChpbmZvLCBzKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpzOwotewotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIGlmIChzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgbGVuID0gc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gKGNoYXIgKikgeHJlYWxsb2MgKGluZm8tPnN0YWNrLT50eXBlLAotCQkJCQkgbGVuICsgc3RybGVuIChzKSArIDEpOwotICBzdHJjcHkgKGluZm8tPnN0YWNrLT50eXBlICsgbGVuLCBzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgdXNlIGFuIHVuZGVyc2NvcmUgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIG5hbWUgc2hvdWxkIGdvIGluIGEgdHlwZQotICAgc3RyaW5nLiAgVGhpcyBmdW5jdGlvbiBzdWJzdGl0dXRlcyBhIHN0cmluZyBmb3IgdGhlIHVuZGVyc2NvcmUuICBJZgotICAgdGhlcmUgaXMgbm8gdW5kZXJzY29yZSwgdGhlIG5hbWUgZm9sbG93cyB0aGUgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGNoYXIgKnU7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICB1ID0gc3RyY2hyIChpbmZvLT5zdGFjay0+dHlwZSwgJ3wnKTsKLSAgaWYgKHUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpuOwotCi0gICAgICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgKyBzdHJsZW4gKHMpKTsKLQotICAgICAgbWVtY3B5IChuLCBpbmZvLT5zdGFjay0+dHlwZSwgdSAtIGluZm8tPnN0YWNrLT50eXBlKTsKLSAgICAgIHN0cmNweSAobiArICh1IC0gaW5mby0+c3RhY2stPnR5cGUpLCBzKTsKLSAgICAgIHN0cmNhdCAobiwgdSArIDEpOwotCi0gICAgICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gICAgICBpbmZvLT5zdGFjay0+dHlwZSA9IG47Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoc3RyY2hyIChzLCAnfCcpICE9IE5VTEwKLSAgICAgICYmIChzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAneycpICE9IE5VTEwKLQkgIHx8IHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICcoJykgIT0gTlVMTCkpCi0gICAgewotICAgICAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAiKCIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiKSIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCpzID09ICdcMCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgIiAiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIHMpKTsKLX0KLQotLyogSW5kZW50IHRoZSB0eXBlIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGJ5IGFwcGVuZGluZyBzcGFjZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaW5kZW50X3R5cGUgKGluZm8pCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5pbmRlbnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQb3AgYSB0eXBlIGZyb20gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgY2hhciAqCi1wb3BfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IHByX3N0YWNrICpvOwotICBjaGFyICpyZXQ7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBvID0gaW5mby0+c3RhY2s7Ci0gIGluZm8tPnN0YWNrID0gby0+bmV4dDsKLSAgcmV0ID0gby0+dHlwZTsKLSAgZnJlZSAobyk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUHJpbnQgYSBWTUEgdmFsdWUgaW50byBhIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF92bWEgKHZtYSwgYnVmLCB1bnNpZ25lZHAsIGhleHApCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBjaGFyICpidWY7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGhleHA7Ci17Ci0gIGlmIChzaXplb2YgKHZtYSkgPD0gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKLSAgICB7Ci0gICAgICBpZiAoaGV4cCkKLQlzcHJpbnRmIChidWYsICIweCVseCIsICh1bnNpZ25lZCBsb25nKSB2bWEpOwotICAgICAgZWxzZSBpZiAodW5zaWduZWRwKQotCXNwcmludGYgKGJ1ZiwgIiVsdSIsICh1bnNpZ25lZCBsb25nKSB2bWEpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZiwgIiVsZCIsIChsb25nKSB2bWEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1ZlswXSA9ICcwJzsKLSAgICAgIGJ1ZlsxXSA9ICd4JzsKLSAgICAgIHNwcmludGZfdm1hIChidWYgKyAyLCB2bWEpOwotICAgIH0KLX0KLQwKLS8qIFN0YXJ0IGEgbmV3IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCAocCwgZmlsZW5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5pbmRlbnQgPT0gMCk7Ci0KLSAgZnByaW50ZiAoaW5mby0+ZiwgIiVzOlxuIiwgZmlsZW5hbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIHNvdXJjZSBmaWxlIHdpdGhpbiBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmluZGVudCA9PSAwKTsKLQotICBmcHJpbnRmIChpbmZvLT5mLCAiICVzOlxuIiwgZmlsZW5hbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGFuIGVtcHR5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9lbXB0eV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgIjx1bmRlZmluZWQ+Iik7Ci19Ci0KLS8qIFB1c2ggYSB2b2lkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl92b2lkX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAidm9pZCIpOwotfQotCi0vKiBQdXNoIGFuIGludGVnZXIgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2ludF90eXBlIChwLCBzaXplLCB1bnNpZ25lZHApCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzEwXTsKLQotICBzcHJpbnRmIChhYiwgIiVzaW50JWQiLCB1bnNpZ25lZHAgPyAidSIgOiAiIiwgc2l6ZSAqIDgpOwotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCBhYik7Ci19Ci0KLS8qIFB1c2ggYSBmbG9hdGluZyB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZmxvYXRfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsxMF07Ci0KLSAgaWYgKHNpemUgPT0gNCkKLSAgICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAiZmxvYXQiKTsKLSAgZWxzZSBpZiAoc2l6ZSA9PSA4KQotICAgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJkb3VibGUiKTsKLQotICBzcHJpbnRmIChhYiwgImZsb2F0JWQiLCBzaXplICogOCk7Ci0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKLX0KLQotLyogUHVzaCBhIGNvbXBsZXggdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NvbXBsZXhfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpZiAoISBwcl9mbG9hdF90eXBlIChwLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHByZXBlbmRfdHlwZSAoaW5mbywgImNvbXBsZXggIik7Ci19Ci0KLS8qIFB1c2ggYSBib29sZWFuIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9ib29sX3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMTBdOwotCi0gIHNwcmludGYgKGFiLCAiYm9vbCVkIiwgc2l6ZSAqIDgpOwotCi0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKLX0KLQotLyogUHVzaCBhbiBlbnVtIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9lbnVtX3R5cGUgKHAsIHRhZywgbmFtZXMsIHZhbHVlcykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9zaWduZWRfdm1hIHZhbDsKLQotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sICJlbnVtICIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAieyAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG5hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIvKiB1bmRlZmluZWQgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IG5hbWVzW2ldICE9IE5VTEw7IGkrKykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiwgIikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgbmFtZXNbaV0pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICh2YWx1ZXNbaV0gIT0gdmFsKQotCSAgICB7Ci0JICAgICAgY2hhciBhYlsyMF07Ci0KLQkgICAgICBwcmludF92bWEgKHZhbHVlc1tpXSwgYWIsIGZhbHNlLCBmYWxzZSk7Ci0JICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgPSAiKQotCQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHZhbCA9IHZhbHVlc1tpXTsKLQkgICAgfQotCi0JICArK3ZhbDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgIiB9Iik7Ci19Ci0KLS8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgcG9pbnRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9wb2ludGVyX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqczsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIHMgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAnfCcpOwotICBpZiAocyAhPSBOVUxMICYmIHNbMV0gPT0gJ1snKQotICAgIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIoKnwpIik7Ci0gIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIqfCIpOwotfQotCi0vKiBUdXJuIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2sgaW50byBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGF0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKiphcmdfdHlwZXM7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIGNoYXIgKnM7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBsZW4gPSAxMDsKLQotICBpZiAoYXJnY291bnQgPD0gMCkKLSAgICB7Ci0gICAgICBhcmdfdHlwZXMgPSBOVUxMOwotICAgICAgbGVuICs9IDE1OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBhcmdfdHlwZXMgPSAoY2hhciAqKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ190eXBlcyk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBhcmdfdHlwZXNbaV0gPSBwb3BfdHlwZSAoaW5mbyk7Ci0JICBpZiAoYXJnX3R5cGVzW2ldID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGxlbiArPSBzdHJsZW4gKGFyZ190eXBlc1tpXSkgKyAyOwotCX0KLSAgICAgIGlmICh2YXJhcmdzKQotCWxlbiArPSA1OwotICAgIH0KLQotICAvKiBOb3cgdGhlIHJldHVybiB0eXBlIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBzID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgc3RyY3B5IChzLCAiKHwpICgiKTsKLQotICBpZiAoYXJnY291bnQgPCAwKQotICAgIHN0cmNhdCAocywgIi8qIHVua25vd24gKi8iKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsIGFyZ190eXBlc1tpXSk7Ci0JfQotICAgICAgaWYgKHZhcmFyZ3MpCi0JewotCSAgaWYgKGkgPiAwKQotCSAgICBzdHJjYXQgKHMsICIsICIpOwotCSAgc3RyY2F0IChzLCAiLi4uIik7Ci0JfQotICAgICAgaWYgKGFyZ2NvdW50ID4gMCkKLQlmcmVlIChhcmdfdHlwZXMpOwotICAgIH0KLQotICBzdHJjYXQgKHMsICIpIik7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgcmVmZXJlbmNlIHRvIHRoYXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9yZWZlcmVuY2VfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiZ8Iik7Ci19Ci0KLS8qIE1ha2UgYSByYW5nZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3JhbmdlX3R5cGUgKHAsIGxvd2VyLCB1cHBlcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAgICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJsWzIwXSwgYWJ1WzIwXTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwcmludF92bWEgKGxvd2VyLCBhYmwsIGZhbHNlLCBmYWxzZSk7Ci0gIHByaW50X3ZtYSAodXBwZXIsIGFidSwgZmFsc2UsIGZhbHNlKTsKLQotICByZXR1cm4gKHByZXBlbmRfdHlwZSAoaW5mbywgInJhbmdlICgiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICIpOiIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgYWJsKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICI6IikKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBhYnUpKTsKLX0KLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHJfYXJyYXlfdHlwZSAocCwgbG93ZXIsIHVwcGVyLCBzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotICAgICBib29sZWFuIHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpyYW5nZV90eXBlOwotICBjaGFyIGFibFsyMF0sIGFidVsyMF0sIGFiWzUwXTsKLQotICByYW5nZV90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAocmFuZ2VfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobG93ZXIgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAodXBwZXIgPT0gLTEpCi0Jc3ByaW50ZiAoYWIsICJ8W10iKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludF92bWEgKHVwcGVyICsgMSwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotCSAgc3ByaW50ZiAoYWIsICJ8WyVzXSIsIGFidSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50X3ZtYSAobG93ZXIsIGFibCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIHByaW50X3ZtYSAodXBwZXIsIGFidSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIHNwcmludGYgKGFiLCAifFslczolc10iLCBhYmwsIGFidSk7Ci0gICAgfQotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgYWIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc3RyY21wIChyYW5nZV90eXBlLCAiaW50IikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIjoiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgcmFuZ2VfdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc3RyaW5ncCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiBzdHJpbmcgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgc2V0IHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl9zZXRfdHlwZSAocCwgYml0c3RyaW5ncCkKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gYml0c3RyaW5ncDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInNldCB7ICIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiIH0iKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJpdHN0cmluZ3ApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIvKiBiaXRzdHJpbmcgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGFuIG9mZnNldCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX29mZnNldF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiAoc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikKLQkgICYmIHByZXBlbmRfdHlwZSAoaW5mbywgIiAiKQotCSAgJiYgcHJlcGVuZF90eXBlIChpbmZvLCB0KQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICI6OnwiKSk7Ci19Ci0KLS8qIE1ha2UgYSBtZXRob2QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9tZXRob2RfdHlwZSAocCwgZG9tYWluLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gZG9tYWluOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIGNoYXIgKmRvbWFpbl90eXBlOwotICBjaGFyICoqYXJnX3R5cGVzOwotICBjaGFyICpzOwotCi0gIGxlbiA9IDEwOwotCi0gIGlmICghIGRvbWFpbikKLSAgICBkb21haW5fdHlwZSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBkb21haW5fdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKLSAgICAgIGlmIChkb21haW5fdHlwZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChzdHJuY21wIChkb21haW5fdHlwZSwgImNsYXNzICIsIHNpemVvZiAiY2xhc3MgIiAtIDEpID09IDAKLQkgICYmIHN0cmNociAoZG9tYWluX3R5cGUgKyBzaXplb2YgImNsYXNzICIgLSAxLCAnICcpID09IE5VTEwpCi0JZG9tYWluX3R5cGUgKz0gc2l6ZW9mICJjbGFzcyAiIC0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGRvbWFpbl90eXBlLCAidW5pb24gY2xhc3MgIiwKLQkJCXNpemVvZiAidW5pb24gY2xhc3MgIikgPT0gMAotCSAgICAgICAmJiAoc3RyY2hyIChkb21haW5fdHlwZSArIHNpemVvZiAidW5pb24gY2xhc3MgIiAtIDEsICcgJykKLQkJICAgPT0gTlVMTCkpCi0JZG9tYWluX3R5cGUgKz0gc2l6ZW9mICJ1bmlvbiBjbGFzcyAiIC0gMTsKLSAgICAgIGxlbiArPSBzdHJsZW4gKGRvbWFpbl90eXBlKTsKLSAgICB9Ci0KLSAgaWYgKGFyZ2NvdW50IDw9IDApCi0gICAgewotICAgICAgYXJnX3R5cGVzID0gTlVMTDsKLSAgICAgIGxlbiArPSAxNTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgYXJnX3R5cGVzID0gKGNoYXIgKiopIHhtYWxsb2MgKGFyZ2NvdW50ICogc2l6ZW9mICphcmdfdHlwZXMpOwotICAgICAgZm9yIChpID0gYXJnY291bnQgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYXJnX3R5cGVzW2ldID0gcG9wX3R5cGUgKGluZm8pOwotCSAgaWYgKGFyZ190eXBlc1tpXSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBsZW4gKz0gc3RybGVuIChhcmdfdHlwZXNbaV0pICsgMjsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQlsZW4gKz0gNTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSByZXR1cm4gdHlwZSBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCi0KLSAgcyA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0gIGlmICghIGRvbWFpbikKLSAgICAqcyA9ICdcMCc7Ci0gIGVsc2UKLSAgICBzdHJjcHkgKHMsIGRvbWFpbl90eXBlKTsKLSAgc3RyY2F0IChzLCAiOjp8ICgiKTsKLQotICBpZiAoYXJnY291bnQgPCAwKQotICAgIHN0cmNhdCAocywgIi8qIHVua25vd24gKi8iKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsIGFyZ190eXBlc1tpXSk7Ci0JfQotICAgICAgaWYgKHZhcmFyZ3MpCi0JewotCSAgaWYgKGkgPiAwKQotCSAgICBzdHJjYXQgKHMsICIsICIpOwotCSAgc3RyY2F0IChzLCAiLi4uIik7Ci0JfQotICAgICAgaWYgKGFyZ2NvdW50ID4gMCkKLQlmcmVlIChhcmdfdHlwZXMpOwotICAgIH0KLQotICBzdHJjYXQgKHMsICIpIik7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jb25zdF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgImNvbnN0IHwiKTsKLX0KLQotLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3ZvbGF0aWxlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAidm9sYXRpbGUgfCIpOwotfQotCi0vKiBTdGFydCBhY2N1bXVsYXRpbmcgYSBzdHJ1Y3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9zdHJ1Y3RfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHN0cnVjdHAgPyAic3RydWN0ICIgOiAidW5pb24gIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgaWRidWZbMjBdOwotCi0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiUlYW5vbiV1IiwgaWQpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGlkYnVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHsiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaXplICE9IDAgfHwgdGFnICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciBhYlszMF07Ci0KLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc2l6ZSAhPSAwKQotCXsKLQkgIHNwcmludGYgKGFiLCAiIHNpemUgJXUiLCBzaXplKTsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAodGFnICE9IE5VTEwpCi0JewotCSAgc3ByaW50ZiAoYWIsICIgaWQgJXUiLCBpZCk7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIlxuIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0KLSAgcmV0dXJuIGluZGVudF90eXBlIChpbmZvKTsKLX0KLQotLyogT3V0cHV0IHRoZSB2aXNpYmlsaXR5IG9mIGEgZmllbGQgaW4gYSBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBjb25zdCBjaGFyICpzID0gTlVMTDsKLSAgY2hhciAqdDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIGlmIChpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSA9PSB2aXNpYmlsaXR5KQotICAgIHJldHVybiB0cnVlOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2stPnZpc2liaWxpdHkgIT0gREVCVUdfVklTSUJJTElUWV9JR05PUkUpOwotCi0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHMgPSAicHVibGljIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgcyA9ICJwcml2YXRlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICBzID0gInByb3RlY3RlZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOgotICAgICAgcyA9ICIvKiBpZ25vcmUgKi8iOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUcmltIG9mZiBhIHRyYWlsaW5nIHNwYWNlIGluIHRoZSBzdHJ1Y3Qgc3RyaW5nLCB0byBtYWtlIHRoZQotICAgICBvdXRwdXQgbG9vayBhIGJpdCBiZXR0ZXIsIHRoZW4gc3RpY2sgb24gdGhlIHZpc2liaWxpdHkgc3RyaW5nLiAgKi8KLQotICB0ID0gaW5mby0+c3RhY2stPnR5cGU7Ci0gIGxlbiA9IHN0cmxlbiAodCk7Ci0gIGFzc2VydCAodFtsZW4gLSAxXSA9PSAnICcpOwotICB0W2xlbiAtIDFdID0gJ1wwJzsKLQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgcykKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICI6XG4iKQotICAgICAgfHwgISBpbmRlbnRfdHlwZSAoaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgZmllbGQgdG8gYSBzdHJ1Y3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdHJ1Y3RfZmllbGQgKHAsIG5hbWUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBiZmRfdm1hIGJpdHNpemU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICI7IC8qICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0c2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X3ZtYSAoYml0c2l6ZSwgYWIsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiYml0c2l6ZSAiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiLCAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHByaW50X3ZtYSAoYml0cG9zLCBhYiwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgImJpdHBvcyAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICovXG4iKQotICAgICAgfHwgISBpbmRlbnRfdHlwZSAoaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGFwcGVuZF90eXBlIChpbmZvLCB0KTsKLX0KLQotLyogRmluaXNoIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX3N0cnVjdF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnM7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5pbmRlbnQgPj0gMik7Ci0KLSAgaW5mby0+aW5kZW50IC09IDI7Ci0KLSAgLyogQ2hhbmdlIHRoZSB0cmFpbGluZyBpbmRlbnRhdGlvbiB0byBoYXZlIGEgY2xvc2UgYnJhY2UuICAqLwotICBzID0gaW5mby0+c3RhY2stPnR5cGUgKyBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSAtIDI7Ci0gIGFzc2VydCAoc1swXSA9PSAnICcgJiYgc1sxXSA9PSAnICcgJiYgc1syXSA9PSAnXDAnKTsKLQotICAqcysrID0gJ30nOwotICAqcyA9ICdcMCc7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgY2xhc3MgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9jbGFzc190eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplLCB2cHRyLCBvd252cHRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdnB0cjsKLSAgICAgYm9vbGVhbiBvd252cHRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdHYgPSBOVUxMOwotCi0gIGluZm8tPmluZGVudCArPSAyOwotCi0gIGlmICh2cHRyICYmICEgb3dudnB0cikKLSAgICB7Ci0gICAgICB0diA9IHBvcF90eXBlIChpbmZvKTsKLSAgICAgIGlmICh0diA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgcHVzaF90eXBlIChpbmZvLCBzdHJ1Y3RwID8gImNsYXNzICIgOiAidW5pb24gY2xhc3MgIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgaWRidWZbMjBdOwotCi0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiUlYW5vbiV1IiwgaWQpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGlkYnVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHsiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaXplICE9IDAgfHwgdnB0ciB8fCBvd252cHRyIHx8IHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc2l6ZSAhPSAwKQotCXsKLQkgIGNoYXIgYWJbMjBdOwotCi0JICBzcHJpbnRmIChhYiwgIiV1Iiwgc2l6ZSk7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiBzaXplICIpCi0JICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAodnB0cikKLQl7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB2dGFibGUgIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChvd252cHRyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJzZWxmICIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0dikKLQkJICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICh0YWcgIT0gTlVMTCkKLQl7Ci0JICBjaGFyIGFiWzMwXTsKLQotCSAgc3ByaW50ZiAoYWIsICIgaWQgJXUiLCBpZCk7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgIlxuIikKLQkgICYmIGluZGVudF90eXBlIChpbmZvKSk7Ci19Ci0KLS8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19zdGF0aWNfbWVtYmVyIChwLCBuYW1lLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic3RhdGljICIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiOyAvKiAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgcGh5c25hbWUpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICovXG4iKQotICAgICAgfHwgISBpbmRlbnRfdHlwZSAoaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGFwcGVuZF90eXBlIChpbmZvLCB0KTsKLX0KLQotLyogQWRkIGEgYmFzZSBjbGFzcyB0byBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX2Jhc2VjbGFzcyAocCwgYml0cG9zLCB2aXJ0dWFsLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjb25zdCBjaGFyICpwcmVmaXg7Ci0gIGNoYXIgYWJbMjBdOwotICBjaGFyICpzLCAqbCwgKm47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMICYmIGluZm8tPnN0YWNrLT5uZXh0ICE9IE5VTEwpOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc3RybmNtcCAodCwgImNsYXNzICIsIHNpemVvZiAiY2xhc3MgIiAtIDEpID09IDApCi0gICAgdCArPSBzaXplb2YgImNsYXNzICIgLSAxOwotCi0gIC8qIFB1c2ggaXQgYmFjayBvbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgcHJlcGVuZF90eXBlIGFuZAotICAgICBhcHBlbmRfdHlwZSByb3V0aW5lcy4gICovCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2aXJ0dWFsKQotICAgIHsKLSAgICAgIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInZpcnR1YWwgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICBwcmVmaXggPSAicHVibGljICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgcHJlZml4ID0gInByb3RlY3RlZCAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6Ci0gICAgICBwcmVmaXggPSAicHJpdmF0ZSAiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByZWZpeCA9ICIvKiB1bmtub3duIHZpc2liaWxpdHkgKi8gIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sIHByZWZpeCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiaXRwb3MgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF92bWEgKGJpdHBvcywgYWIsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIGJpdHBvcyAiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICovIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgc29tZXRoaW5nIGxpa2UgInB1YmxpYyBBIC8gKiBiaXRwb3MKLSAgICAgMTAgKiAvIi4gIFRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIHN0YWNrIGlzIHNvbWV0aGluZyBsaWtlICJjbGFzcwotICAgICB4eCB7IC8gKiBzaXplIDggKiAvXG4uLi4iLiAgV2Ugd2FudCB0byBzdWJzdGl0dXRlIHRoZSB0b3Agb2YgdGhlCi0gICAgIHN0YWNrIGluIGJlZm9yZSB0aGUgey4gICovCi0gIHMgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT5uZXh0LT50eXBlLCAneycpOwotICBhc3NlcnQgKHMgIT0gTlVMTCk7Ci0gIC0tczsKLQotICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgJzonLCB0aGVuIHdlIGFscmVhZHkgaGF2ZSBhIGJhc2VjbGFzcywgYW5kCi0gICAgIHdlIG11c3QgYXBwZW5kIHRoaXMgb25lIGFmdGVyIGEgY29tbWEuICAqLwotICBmb3IgKGwgPSBpbmZvLT5zdGFjay0+bmV4dC0+dHlwZTsgbCAhPSBzOyBsKyspCi0gICAgaWYgKCpsID09ICc6JykKLSAgICAgIGJyZWFrOwotICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sIGwgPT0gcyA/ICIgOiAiIDogIiwgIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIHN0cmxlbiAodCkgKyAxKTsKLSAgbWVtY3B5IChuLCBpbmZvLT5zdGFjay0+dHlwZSwgcyAtIGluZm8tPnN0YWNrLT50eXBlKTsKLSAgc3RyY3B5IChuICsgKHMgLSBpbmZvLT5zdGFjay0+dHlwZSksIHQpOwotICBzdHJjYXQgKG4sIHMpOwotCi0gIGZyZWUgKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgaW5mby0+c3RhY2stPnR5cGUgPSBuOwotCi0gIGZyZWUgKHQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhZGRpbmcgYSBtZXRob2QgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19zdGFydF9tZXRob2QgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotICBpbmZvLT5zdGFjay0+bWV0aG9kID0gbmFtZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHZhcmlhbnQgdG8gYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCwgdm9mZnNldCwKLQkJCSBjb250ZXh0KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgYm9vbGVhbiBjb250ZXh0OwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqbWV0aG9kX3R5cGU7Ci0gIGNoYXIgKmNvbnRleHRfdHlwZTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotICBhc3NlcnQgKGluZm8tPnN0YWNrLT5uZXh0ICE9IE5VTEwpOwotCi0gIC8qIFB1dCB0aGUgY29uc3QgYW5kIHZvbGF0aWxlIHF1YWxpZmllcnMgb24gdGhlIHR5cGUuICAqLwotICBpZiAodm9sYXRpbGVwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHZvbGF0aWxlIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKGNvbnN0cCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiBjb25zdCIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU3RpY2sgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpbnRvIGl0cyB0eXBlLiAgKi8KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLAotCQkJIChjb250ZXh0Ci0JCQkgID8gaW5mby0+c3RhY2stPm5leHQtPm5leHQtPm1ldGhvZAotCQkJICA6IGluZm8tPnN0YWNrLT5uZXh0LT5tZXRob2QpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2V0IHRoZSB0eXBlLiAgKi8KLSAgbWV0aG9kX3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChtZXRob2RfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQdWxsIG9mZiB0aGUgY29udGV4dCB0eXBlIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmICghIGNvbnRleHQpCi0gICAgY29udGV4dF90eXBlID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRleHRfdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKLSAgICAgIGlmIChjb250ZXh0X3R5cGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyB0aGUgY2xhc3MuICAqLwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIG1ldGhvZF90eXBlKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgcGh5c25hbWUpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGNvbnRleHQgfHwgdm9mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgYWJbMjBdOwotCi0gICAgICBpZiAoY29udGV4dCkKLQl7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgImNvbnRleHQgIikKLQkgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBjb250ZXh0X3R5cGUpCi0JICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHByaW50X3ZtYSAodm9mZnNldCwgYWIsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAidm9mZnNldCAiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgIiAqLztcbiIpCi0JICAmJiBpbmRlbnRfdHlwZSAoaW5mbykpOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgdmFyaWFudCB0byBhIG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqbWV0aG9kX3R5cGU7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5zdGFjay0+bmV4dCAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5zdGFjay0+bmV4dC0+bWV0aG9kICE9IE5VTEwpOwotCi0gIC8qIFB1dCB0aGUgY29uc3QgYW5kIHZvbGF0aWxlIHF1YWxpZmllcnMgb24gdGhlIHR5cGUuICAqLwotICBpZiAodm9sYXRpbGVwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHZvbGF0aWxlIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKGNvbnN0cCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiBjb25zdCIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFyayBpdCBhcyBzdGF0aWMuICAqLwotICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICJzdGF0aWMgIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN0aWNrIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW50byBpdHMgdHlwZS4gICovCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgaW5mby0+c3RhY2stPm5leHQtPm1ldGhvZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCB0aGUgdHlwZS4gICovCi0gIG1ldGhvZF90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAobWV0aG9kX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBjbGFzcy4gICovCi0KLSAgaWYgKCEgcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCBtZXRob2RfdHlwZSkKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qICIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgcGh5c25hbWUpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLztcbiIpCi0JICAmJiBpbmRlbnRfdHlwZSAoaW5mbykpOwotfQotCi0vKiBGaW5pc2ggdXAgYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3NfZW5kX21ldGhvZCAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZm8tPnN0YWNrLT5tZXRob2QgPSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2NsYXNzX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICByZXR1cm4gcHJfZW5kX3N0cnVjdF90eXBlIChwKTsKLX0KLQotLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHVzaW5nIGEgdHlwZWRlZiBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3R5cGVkZWZfdHlwZSAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIG5hbWUpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBvbiB0aGUgc3RhY2sgdXNpbmcgYSB0YWcgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90YWdfdHlwZSAocCwgbmFtZSwgaWQsIGtpbmQpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjb25zdCBjaGFyICp0LCAqdGFnOwotICBjaGFyIGlkYnVmWzIwXTsKLQotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6Ci0gICAgICB0ID0gInN0cnVjdCAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgotICAgICAgdCA9ICJ1bmlvbiAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICB0ID0gImVudW0gIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICAgIHQgPSAiY2xhc3MgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIHQgPSAidW5pb24gY2xhc3MgIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgcHVzaF90eXBlIChpbmZvLCB0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgdGFnID0gbmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNwcmludGYgKGlkYnVmLCAiJSVhbm9uJXUiLCBpZCk7Ci0gICAgICB0YWcgPSBpZGJ1ZjsKLSAgICB9Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobmFtZSAhPSBOVUxMICYmIGtpbmQgIT0gREVCVUdfS0lORF9FTlVNKQotICAgIHsKLSAgICAgIHNwcmludGYgKGlkYnVmLCAiIC8qIGlkICV1ICovIiwgaWQpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGlkYnVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0eXBlZGVmLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3R5cGRlZiAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJ0eXBlZGVmICVzO1xuIiwgcyk7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHRhZy4gIFRoZSB0YWcgc2hvdWxkIGFscmVhZHkgYmUgaW4gdGhlIHN0cmluZyBvbiB0aGUKLSAgIHN0YWNrLCBzbyBhbGwgd2UgaGF2ZSB0byBkbyBoZXJlIGlzIHByaW50IGl0IG91dC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXByX3RhZyAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgIiVzO1xuIiwgdCk7Ci0KLSAgZnJlZSAodCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzIwXTsKLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKHZhbCwgYWIsIGZhbHNlLCBmYWxzZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCBpbnQgJXMgPSAlcztcbiIsIG5hbWUsIGFiKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Zsb2F0X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkb3VibGUgdmFsOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAiY29uc3QgZG91YmxlICVzID0gJWc7XG4iLCBuYW1lLCB2YWwpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hICh2YWwsIGFiLCBmYWxzZSwgZmFsc2UpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiY29uc3QgJXMgJXMgPSAlcztcbiIsIHQsIG5hbWUsIGFiKTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdmFyaWFibGUgKHAsIG5hbWUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfU1RBVElDOgotICAgIGNhc2UgREVCVUdfTE9DQUxfU1RBVElDOgotICAgICAgZnByaW50ZiAoaW5mby0+ZiwgInN0YXRpYyAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfUkVHSVNURVI6Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAicmVnaXN0ZXIgIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICBwcmludF92bWEgKHZhbCwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgLyogJXMgKi87XG4iLCB0LCBhYik7Ci0KLSAgZnJlZSAodCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9mdW5jdGlvbiAocCwgbmFtZSwgZ2xvYmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBnbG9iYWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIGlmICghIGdsb2JhbCkKLSAgICBmcHJpbnRmIChpbmZvLT5mLCAic3RhdGljICIpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgKCIsIHQpOwotCi0gIGluZm8tPnBhcmFtZXRlciA9IDE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mdW5jdGlvbl9wYXJhbWV0ZXIgKHAsIG5hbWUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaWYgKGtpbmQgPT0gREVCVUdfUEFSTV9SRUZFUkVOQ0UKLSAgICAgIHx8IGtpbmQgPT0gREVCVUdfUEFSTV9SRUZfUkVHKQotICAgIHsKLSAgICAgIGlmICghIHByX3JlZmVyZW5jZV90eXBlIChwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5wYXJhbWV0ZXIgIT0gMSkKLSAgICBmcHJpbnRmIChpbmZvLT5mLCAiLCAiKTsKLQotICBpZiAoa2luZCA9PSBERUJVR19QQVJNX1JFRyB8fCBraW5kID09IERFQlVHX1BBUk1fUkVGX1JFRykKLSAgICBmcHJpbnRmIChpbmZvLT5mLCAicmVnaXN0ZXIgIik7Ci0KLSAgcHJpbnRfdm1hICh2YWwsIGFiLCB0cnVlLCB0cnVlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgIiVzIC8qICVzICovIiwgdCwgYWIpOwotCi0gIGZyZWUgKHQpOwotCi0gICsraW5mby0+cGFyYW1ldGVyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCB3cml0aW5nIG91dCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaWYgKGluZm8tPnBhcmFtZXRlciA+IDApCi0gICAgewotICAgICAgZnByaW50ZiAoaW5mby0+ZiwgIilcbiIpOwotICAgICAgaW5mby0+cGFyYW1ldGVyID0gMDsKLSAgICB9Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJ7IC8qICVzICovXG4iLCBhYik7Ci0KLSAgaW5mby0+aW5kZW50ICs9IDI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9saW5lbm8gKHAsIGZpbGVuYW1lLCBsaW5lbm8sIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHByaW50X3ZtYSAoYWRkciwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiLyogZmlsZSAlcyBsaW5lICVsdSBhZGRyICVzICovXG4iLCBmaWxlbmFtZSwgbGluZW5vLCBhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9ibG9jayAocCwgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGluZm8tPmluZGVudCAtPSAyOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHByaW50X3ZtYSAoYWRkciwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAifSAvKiAlcyAqL1xuIiwgYWIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9mdW5jdGlvbiAocCkKLSAgICAgUFRSIHAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuMSBiL2JpbnV0aWxzL3JhbmxpYi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZiNWM4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JhbmxpYi4xCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHJhbmxpYiAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1yYW5saWIgXC0gZ2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZS4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQiByYW5saWIgXGMKLS5SQiAiW1x8IiBcLXYgfCBcLVYgIlx8XSIKLS5JIGFyY2hpdmVcYwotXCYKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi0uQiByYW5saWIKLWdlbmVyYXRlcyBhbiBpbmRleCB0byB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSwgYW5kCi1zdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCi1tZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKLS5QUAotWW91IG1heSB1c2UKLS5SQiBgICJubSBcLXMiICcKLW9yCi0uUkIgYCAibm0gXC1cLXByaW50LWFybWFwIiAnCi10byBsaXN0IHRoaXMgaW5kZXguCi0uUFAKLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLS5QUAotVGhlIEdOVQotLkIgcmFubGliCi1wcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBHTlUKLS5CUiBhciA7Ci1ydW5uaW5nCi0uQiByYW5saWIKLWlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0byBleGVjdXRpbmcKLS5SQiBgICJhciBcLXMiICcuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtdgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiByYW5saWIKLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgYXIgIigiIDEgIiksIgotLkJSIG5tICIoIiAxICIpLiIKLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuc2ggYi9iaW51dGlscy9yYW5saWIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiNmZiYzQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmFubGliLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQSBzaW1wbGUgcmFubGliIHNjcmlwdCwgdG8gdXNlIGxlc3MgZGlzayBzcGFjZSB0aGFuIGEgcmFubGliIHByb2dyYW0uCi1hciBzICQxCmRpZmYgLS1naXQgYS9iaW51dGlscy9yY2xleC5sIGIvYmludXRpbHMvcmNsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiNDc5Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yY2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLSV7IC8qIHJjbGV4LmwgLS0gbGV4ZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMgcGFyc2VyICAqLwotLyogQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgbGV4IGlucHV0IGZpbGUgd2hpY2ggZ2VuZXJhdGVzIGEgbGV4ZXIgdXNlZCBieSB0aGUKLSAgIFdpbmRvd3MgcmMgZmlsZSBwYXJzZXIuICBJdCBiYXNpY2FsbHkganVzdCByZWNvZ25pemVkIGEgYnVuY2ggb2YKLSAgIGtleXdvcmRzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLSNpbmNsdWRlICJyY3BhcnNlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiByY2RhdGEgbW9kZSwgaW4gd2hpY2ggd2UgcmV0dXJucyB0aGUgbGVuZ3RocyBvZgotICAgc3RyaW5ncy4gICovCi0KLXN0YXRpYyBpbnQgcmNkYXRhX21vZGU7Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIHN1cHJlc3NpbmcgbGluZXMgZnJvbSBjcHAgKGluY2x1ZGluZyB3aW5kb3dzLmggb3IKLSAgIGhlYWRlcnMgZnJvbSB5b3VyIEMgc291cmNlcyBtYXkgYnJpbmcgaW4gZXh0ZXJucyBhbmQgdHlwZWRlZnMpLgotICAgV2hlbiBhY3RpdmUsIHdlIHJldHVybiBJR05PUkVEX1RPS0VOLCB3aGljaCBsZXRzIHVzIGlnbm9yZSB0aGVzZQotICAgb3V0c2lkZSBvZiByZXNvdXJjZSBjb25zdHJ1Y3RzLiAgVGh1cywgaXQgaXNuJ3QgcmVxdWlyZWQgdG8gcHJvdGVjdAotICAgYWxsIHRoZSBub24tcHJlcHJvY2Vzc29yIGxpbmVzIGluIHlvdXIgaGVhZGVyIGZpbGVzIHdpdGggI2lmZGVmCi0gICBSQ19JTlZPS0VELiAgSXQgYWxzbyBtZWFucyB5b3VyIFJDIGZpbGUgY2FuJ3QgaW5jbHVkZSBvdGhlciBSQwotICAgZmlsZXMgaWYgdGhleSdyZSBuYW1lZCAiKi5oIi4gIFNvcnJ5LiAgTmFtZSB0aGVtICoucmNoIG9yIHdoYXRldmVyLiAgKi8KLQotc3RhdGljIGludCBzdXBwcmVzc19jcHBfZGF0YTsKLQotI2RlZmluZSBNQVlCRV9SRVRVUk4oeCkgcmV0dXJuIHN1cHByZXNzX2NwcF9kYXRhID8gSUdOT1JFRF9UT0tFTiA6ICh4KQotCi0vKiBUaGUgZmlyc3QgZmlsZW5hbWUgd2UgZGV0ZWN0IGluIHRoZSBjcHAgb3V0cHV0LiAgV2UgdXNlIHRoaXMgdG8KLSAgIHRlbGwgaW5jbHVkZWQgZmlsZXMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICppbml0aWFsX2ZuOwotCi0vKiBMaXN0IG9mIGFsbG9jYXRlZCBzdHJpbmdzLiAgKi8KLQotc3RydWN0IGFsbG9jX3N0cmluZwotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICpuZXh0OwotICBjaGFyICpzOwotfTsKLQotc3RhdGljIHN0cnVjdCBhbGxvY19zdHJpbmcgKnN0cmluZ3M7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGNwcF9saW5lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGNoYXIgKmhhbmRsZV9xdW90ZXMgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBjaGFyICpnZXRfc3RyaW5nIFBBUkFNUyAoKGludCkpOwotCi0lfQotCi0lJQotCi0iQkVHSU4iCQkJeyBNQVlCRV9SRVRVUk4gKEJFRyk7IH0KLSJ7IgkJCXsgTUFZQkVfUkVUVVJOIChCRUcpOyB9Ci0iRU5EIgkJCXsgTUFZQkVfUkVUVVJOIChFTkQpOyB9Ci0ifSIJCQl7IE1BWUJFX1JFVFVSTiAoRU5EKTsgfQotIkFDQ0VMRVJBVE9SUyIJCXsgTUFZQkVfUkVUVVJOIChBQ0NFTEVSQVRPUlMpOyB9Ci0iVklSVEtFWSIJCXsgTUFZQkVfUkVUVVJOIChWSVJUS0VZKTsgfQotIkFTQ0lJIgkJCXsgTUFZQkVfUkVUVVJOIChBU0NJSSk7IH0KLSJOT0lOVkVSVCIJCXsgTUFZQkVfUkVUVVJOIChOT0lOVkVSVCk7IH0KLSJTSElGVCIJCQl7IE1BWUJFX1JFVFVSTiAoU0hJRlQpOyB9Ci0iQ09OVFJPTCIJCXsgTUFZQkVfUkVUVVJOIChDT05UUk9MKTsgfQotIkFMVCIJCQl7IE1BWUJFX1JFVFVSTiAoQUxUKTsgfQotIkJJVE1BUCIJCXsgTUFZQkVfUkVUVVJOIChCSVRNQVApOyB9Ci0iQ1VSU09SIgkJeyBNQVlCRV9SRVRVUk4gKENVUlNPUik7IH0KLSJESUFMT0ciCQl7IE1BWUJFX1JFVFVSTiAoRElBTE9HKTsgfQotIkRJQUxPR0VYIgkJeyBNQVlCRV9SRVRVUk4gKERJQUxPR0VYKTsgfQotIkVYU1RZTEUiCQl7IE1BWUJFX1JFVFVSTiAoRVhTVFlMRSk7IH0KLSJDQVBUSU9OIgkJeyBNQVlCRV9SRVRVUk4gKENBUFRJT04pOyB9Ci0iQ0xBU1MiCQkJeyBNQVlCRV9SRVRVUk4gKENMQVNTKTsgfQotIlNUWUxFIgkJCXsgTUFZQkVfUkVUVVJOIChTVFlMRSk7IH0KLSJBVVRPM1NUQVRFIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE8zU1RBVEUpOyB9Ci0iQVVUT0NIRUNLQk9YIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE9DSEVDS0JPWCk7IH0KLSJBVVRPUkFESU9CVVRUT04iCXsgTUFZQkVfUkVUVVJOIChBVVRPUkFESU9CVVRUT04pOyB9Ci0iQ0hFQ0tCT1giCQl7IE1BWUJFX1JFVFVSTiAoQ0hFQ0tCT1gpOyB9Ci0iQ09NQk9CT1giCQl7IE1BWUJFX1JFVFVSTiAoQ09NQk9CT1gpOyB9Ci0iQ1RFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKENURVhUKTsgfQotIkRFRlBVU0hCVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoREVGUFVTSEJVVFRPTik7IH0KLSJFRElUVEVYVCIJCXsgTUFZQkVfUkVUVVJOIChFRElUVEVYVCk7IH0KLSJHUk9VUEJPWCIJCXsgTUFZQkVfUkVUVVJOIChHUk9VUEJPWCk7IH0KLSJMSVNUQk9YIgkJeyBNQVlCRV9SRVRVUk4gKExJU1RCT1gpOyB9Ci0iTFRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKExURVhUKTsgfQotIlBVU0hCT1giCQl7IE1BWUJFX1JFVFVSTiAoUFVTSEJPWCk7IH0KLSJQVVNIQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFBVU0hCVVRUT04pOyB9Ci0iUkFESU9CVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoUkFESU9CVVRUT04pOyB9Ci0iUlRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKFJURVhUKTsgfQotIlNDUk9MTEJBUiIJCXsgTUFZQkVfUkVUVVJOIChTQ1JPTExCQVIpOyB9Ci0iU1RBVEUzIgkJeyBNQVlCRV9SRVRVUk4gKFNUQVRFMyk7IH0KLSJVU0VSQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFVTRVJCVVRUT04pOyB9Ci0iQkVESVQiCQkJeyBNQVlCRV9SRVRVUk4gKEJFRElUKTsgfQotIkhFRElUIgkJCXsgTUFZQkVfUkVUVVJOIChIRURJVCk7IH0KLSJJRURJVCIJCQl7IE1BWUJFX1JFVFVSTiAoSUVESVQpOyB9Ci0iRk9OVCIJCQl7IE1BWUJFX1JFVFVSTiAoRk9OVCk7IH0KLSJJQ09OIgkJCXsgTUFZQkVfUkVUVVJOIChJQ09OKTsgfQotIkxBTkdVQUdFIgkJeyBNQVlCRV9SRVRVUk4gKExBTkdVQUdFKTsgfQotIkNIQVJBQ1RFUklTVElDUyIJeyBNQVlCRV9SRVRVUk4gKENIQVJBQ1RFUklTVElDUyk7IH0KLSJWRVJTSU9OIgkJeyBNQVlCRV9SRVRVUk4gKFZFUlNJT05LKTsgfQotIk1FTlUiCQkJeyBNQVlCRV9SRVRVUk4gKE1FTlUpOyB9Ci0iTUVOVUVYIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVFWCk7IH0KLSJNRU5VSVRFTSIJCXsgTUFZQkVfUkVUVVJOIChNRU5VSVRFTSk7IH0KLSJTRVBBUkFUT1IiCQl7IE1BWUJFX1JFVFVSTiAoU0VQQVJBVE9SKTsgfQotIlBPUFVQIgkJCXsgTUFZQkVfUkVUVVJOIChQT1BVUCk7IH0KLSJDSEVDS0VEIgkJeyBNQVlCRV9SRVRVUk4gKENIRUNLRUQpOyB9Ci0iR1JBWUVEIgkJeyBNQVlCRV9SRVRVUk4gKEdSQVlFRCk7IH0KLSJIRUxQIgkJCXsgTUFZQkVfUkVUVVJOIChIRUxQKTsgfQotIklOQUNUSVZFIgkJeyBNQVlCRV9SRVRVUk4gKElOQUNUSVZFKTsgfQotIk1FTlVCQVJCUkVBSyIJCXsgTUFZQkVfUkVUVVJOIChNRU5VQkFSQlJFQUspOyB9Ci0iTUVOVUJSRUFLIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVCUkVBSyk7IH0KLSJNRVNTQUdFVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoTUVTU0FHRVRBQkxFKTsgfQotIlJDREFUQSIJCXsgTUFZQkVfUkVUVVJOIChSQ0RBVEEpOyB9Ci0iU1RSSU5HVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoU1RSSU5HVEFCTEUpOyB9Ci0iVkVSU0lPTklORk8iCQl7IE1BWUJFX1JFVFVSTiAoVkVSU0lPTklORk8pOyB9Ci0iRklMRVZFUlNJT04iCQl7IE1BWUJFX1JFVFVSTiAoRklMRVZFUlNJT04pOyB9Ci0iUFJPRFVDVFZFUlNJT04iCXsgTUFZQkVfUkVUVVJOIChQUk9EVUNUVkVSU0lPTik7IH0KLSJGSUxFRkxBR1NNQVNLIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHU01BU0spOyB9Ci0iRklMRUZMQUdTIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHUyk7IH0KLSJGSUxFT1MiCQl7IE1BWUJFX1JFVFVSTiAoRklMRU9TKTsgfQotIkZJTEVUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVUWVBFKTsgfQotIkZJTEVTVUJUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVTVUJUWVBFKTsgfQotIlZBTFVFIgkJCXsgTUFZQkVfUkVUVVJOIChWQUxVRSk7IH0KLSJNT1ZFQUJMRSIJCXsgTUFZQkVfUkVUVVJOIChNT1ZFQUJMRSk7IH0KLSJGSVhFRCIJCQl7IE1BWUJFX1JFVFVSTiAoRklYRUQpOyB9Ci0iUFVSRSIJCQl7IE1BWUJFX1JFVFVSTiAoUFVSRSk7IH0KLSJJTVBVUkUiCQl7IE1BWUJFX1JFVFVSTiAoSU1QVVJFKTsgfQotIlBSRUxPQUQiCQl7IE1BWUJFX1JFVFVSTiAoUFJFTE9BRCk7IH0KLSJMT0FET05DQUxMIgkJeyBNQVlCRV9SRVRVUk4gKExPQURPTkNBTEwpOyB9Ci0iRElTQ0FSREFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoRElTQ0FSREFCTEUpOyB9Ci0iTk9UIgkJCXsgTUFZQkVfUkVUVVJOIChOT1QpOyB9Ci0KLSJCTE9DSyJbIFx0XG5dKiJcIiJbXlwjXG5dKiJcIiIgewotCQkJICBjaGFyICpzLCAqc2VuZDsKLQotCQkJICAvKiBUaGlzIGlzIGEgaGFjayB0byBsZXQgdXMgcGFyc2UgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBlYXNpbHkuICAqLwotCi0JCQkgIHMgPSBzdHJjaHIgKHl5dGV4dCwgJyInKTsKLQkJCSAgKytzOwotCQkJICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotCQkJICBpZiAoc3RybmNtcCAocywgIlN0cmluZ0ZpbGVJbmZvIiwKLQkJCQkgICAgICAgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxKSA9PSAwCi0JCQkgICAgICAmJiBzICsgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxID09IHNlbmQpCi0JCQkgICAgTUFZQkVfUkVUVVJOIChCTE9DS1NUUklOR0ZJTEVJTkZPKTsKLQkJCSAgZWxzZSBpZiAoc3RybmNtcCAocywgIlZhckZpbGVJbmZvIiwKLQkJCQkJICAgIHNpemVvZiAiVmFyRmlsZUluZm8iIC0gMSkgPT0gMAotCQkJCSAgICYmIHMgKyBzaXplb2YgIlZhckZpbGVJbmZvIiAtIDEgPT0gc2VuZCkKLQkJCSAgICBNQVlCRV9SRVRVUk4gKEJMT0NLVkFSRklMRUlORk8pOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgY2hhciAqcjsKLQotCQkJICAgICAgciA9IGdldF9zdHJpbmcgKHNlbmQgLSBzICsgMSk7Ci0JCQkgICAgICBzdHJuY3B5IChyLCBzLCBzZW5kIC0gcyk7Ci0JCQkgICAgICByW3NlbmQgLSBzXSA9ICdcMCc7Ci0JCQkgICAgICB5eWx2YWwucyA9IHI7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKEJMT0NLKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLSIjIlteXG5dKgkJewotCQkJICBjcHBfbGluZSAoeXl0ZXh0KTsKLQkJCX0KLQotWzAtOV1beDAtOUEtRmEtZl0qTAl7Ci0JCQkgIHl5bHZhbC5pLnZhbCA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0JCQkgIHl5bHZhbC5pLmR3b3JkID0gMTsKLQkJCSAgTUFZQkVfUkVUVVJOIChOVU1CRVIpOwotCQkJfQotCi1bMC05XVt4MC05QS1GYS1mXSoJewotCQkJICB5eWx2YWwuaS52YWwgPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotCQkJICB5eWx2YWwuaS5kd29yZCA9IDA7Ci0JCQkgIE1BWUJFX1JFVFVSTiAoTlVNQkVSKTsKLQkJCX0KLQotKCJcIiJbXlwiXG5dKiJcIiJbIFx0XSopKyB7Ci0JCQkgIGNoYXIgKnM7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotCi0JCQkgIHMgPSBoYW5kbGVfcXVvdGVzICh5eXRleHQsICZsZW5ndGgpOwotCQkJICBpZiAoISByY2RhdGFfbW9kZSkKLQkJCSAgICB7Ci0JCQkgICAgICB5eWx2YWwucyA9IHM7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKFFVT1RFRFNUUklORyk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgeXlsdmFsLnNzLmxlbmd0aCA9IGxlbmd0aDsKLQkJCSAgICAgIHl5bHZhbC5zcy5zID0gczsKLQkJCSAgICAgIE1BWUJFX1JFVFVSTiAoU0laRURTVFJJTkcpOwotCQkJICAgIH0KLQkJCX0KLQotW0EtWmEtel1bXiAsXHRcclxuXSoJewotCQkJICBjaGFyICpzOwotCi0JCQkgIC8qIEkgcmVqZWN0ZWQgY29tbWEgaW4gYSBzdHJpbmcgaW4gb3JkZXIgdG8KLQkJCSAgICAgaGFuZGxlIFZJUlRLRVksIENPTlRST0wgaW4gYW4gYWNjZWxlcmF0b3IKLQkJCSAgICAgcmVzb3VyY2UuICBUaGlzIG1lYW5zIHRoYXQgYW4gdW5xdW90ZWQKLQkJCSAgICAgZmlsZSBuYW1lIGNhbiBub3QgY29udGFpbiBhIGNvbW1hLiAgSQotCQkJICAgICBkb24ndCBrbm93IHdoYXQgcmMgcGVybWl0cy4gICovCi0KLQkJCSAgcyA9IGdldF9zdHJpbmcgKHN0cmxlbiAoeXl0ZXh0KSArIDEpOwotCQkJICBzdHJjcHkgKHMsIHl5dGV4dCk7Ci0JCQkgIHl5bHZhbC5zID0gczsKLQkJCSAgTUFZQkVfUkVUVVJOIChTVFJJTkcpOwotCQkJfQotCi1bXG5dCQkJeyArK3JjX2xpbmVubzsgfQotWyBcdFxyXSsJCXsgLyogaWdub3JlIHdoaXRlc3BhY2UgKi8gfQotLgkJCXsgTUFZQkVfUkVUVVJOICgqeXl0ZXh0KTsgfQotCi0lJQotI2lmbmRlZiB5eXdyYXAKLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBzb21lIHZlcnNpb25zIG9mIGxleC4gICovCi1pbnQgeXl3cmFwICgpCi17Ci0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIEMgcHJlcHJvY2Vzc29yIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotY3BwX2xpbmUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGludCBsaW5lOwotICBjaGFyICpzZW5kLCAqZm47Ci0KLSAgKytzOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0gIAotICBsaW5lID0gc3RydG9sIChzLCAmc2VuZCwgMCk7Ci0gIGlmICgqc2VuZCAhPSAnXDAnICYmICEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZW5kKSkKLSAgICByZXR1cm47Ci0KLSAgLyogU3VidHJhY3QgMSBiZWNhdXNlIHdlIGFyZSBhYm91dCB0byBjb3VudCB0aGUgbmV3bGluZS4gICovCi0gIHJjX2xpbmVubyA9IGxpbmUgLSAxOwotCi0gIHMgPSBzZW5kOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0KLSAgaWYgKCpzICE9ICciJykKLSAgICByZXR1cm47Ci0KLSAgKytzOwotICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotICBpZiAoc2VuZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmbiA9IChjaGFyICopIHhtYWxsb2MgKHNlbmQgLSBzICsgMSk7Ci0gIHN0cm5jcHkgKGZuLCBzLCBzZW5kIC0gcyk7Ci0gIGZuW3NlbmQgLSBzXSA9ICdcMCc7Ci0KLSAgZnJlZSAocmNfZmlsZW5hbWUpOwotICByY19maWxlbmFtZSA9IGZuOwotCi0gIGlmICghaW5pdGlhbF9mbikKLSAgICB7Ci0gICAgICBpbml0aWFsX2ZuID0geG1hbGxvYyAoc3RybGVuIChmbikgKyAxKTsKLSAgICAgIHN0cmNweShpbml0aWFsX2ZuLCBmbik7Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBpbml0aWFsIGZpbGUsIHJlZ2FyZGxlc3Mgb2YgbmFtZS4gIFN1cHByZXNzIGFsbCBvdGhlcgotICAgICBmaWxlcyBpZiB0aGV5IGVuZCBpbiAiLmgiICh0aGlzIGFsbG93cyBpbmNsdWRlZCAiKi5yYyIpICovCi0gIGlmIChzdHJjbXAgKGluaXRpYWxfZm4sIGZuKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGZuICsgc3RybGVuIChmbikgLSAyLCAiLmgiKSAhPSAwKQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMDsKLSAgZWxzZQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMTsKLX0KLQotLyogSGFuZGxlIGEgcXVvdGVkIHN0cmluZy4gIFRoZSBxdW90ZXMgYXJlIHN0cmlwcGVkLiAgQSBwYWlyIG9mIHF1b3RlcwotICAgaW4gYSBzdHJpbmcgYXJlIHR1cm5lZCBpbnRvIGEgc2luZ2xlIHF1b3RlLiAgQWRqYWNlbnQgc3RyaW5ncyBhcmUKLSAgIG1lcmdlZCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhcmUgbWVyZ2VkLCBhcyBpbiBDLiAgKi8KLQotc3RhdGljIGNoYXIgKgotaGFuZGxlX3F1b3RlcyAoaW5wdXQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqaW5wdXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmxlbjsKLXsKLSAgY2hhciAqcmV0LCAqczsKLSAgY29uc3QgY2hhciAqdDsKLSAgaW50IGNoOwotCi0gIHJldCA9IGdldF9zdHJpbmcgKHN0cmxlbiAoaW5wdXQpICsgMSk7Ci0KLSAgcyA9IHJldDsKLSAgdCA9IGlucHV0OwotICBpZiAoKnQgPT0gJyInKQotICAgICsrdDsKLSAgd2hpbGUgKCp0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCp0ID09ICdcXCcpCi0JewotCSAgKyt0OwotCSAgc3dpdGNoICgqdCkKLQkgICAgewotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgiYmFja3NsYXNoIGF0IGVuZCBvZiBzdHJpbmciKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcIic6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgidXNlIFwiXCIgdG8gcHV0IFwiIGluIGEgc3RyaW5nIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9BOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdiJzoKLQkgICAgICAqcysrID0gRVNDQVBFX0I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2YnOgotCSAgICAgICpzKysgPSBFU0NBUEVfRjsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9OOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdyJzoKLQkgICAgICAqcysrID0gRVNDQVBFX1I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgICpzKysgPSBFU0NBUEVfVDsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAndic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9WOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcXCc6Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotCSAgICAgIGNoID0gKnQgLSAnMCc7Ci0JICAgICAgKyt0OwotCSAgICAgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzcnKQotCQl7Ci0JCSAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOwotCQkgICsrdDsKLQkJICBpZiAoKnQgPj0gJzAnICYmICp0IDw9ICc3JykKLQkJICAgIHsKLQkJICAgICAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOwotCQkgICAgICArK3Q7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAqcysrID0gY2g7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgKyt0OwotCSAgICAgIGNoID0gMDsKLQkgICAgICB3aGlsZSAoMSkKLQkJewotCQkgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzknKQotCQkgICAgY2ggPSAoY2ggPDwgNCkgfCAoKnQgLSAnMCcpOwotCQkgIGVsc2UgaWYgKCp0ID49ICdhJyAmJiAqdCA8PSAnZicpCi0JCSAgICBjaCA9IChjaCA8PCA0KSB8ICgqdCAtICdhJyk7Ci0JCSAgZWxzZSBpZiAoKnQgPj0gJ0EnICYmICp0IDw9ICdGJykKLQkJICAgIGNoID0gKGNoIDw8IDQpIHwgKCp0IC0gJ0EnKTsKLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQkJICArK3Q7Ci0JCX0KLQkgICAgICAqcysrID0gY2g7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKCJ1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlIik7Ci0JICAgICAgKnMrKyA9ICdcXCc7Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgqdCAhPSAnIicpCi0JKnMrKyA9ICp0Kys7Ci0gICAgICBlbHNlIGlmICh0WzFdID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBlbHNlIGlmICh0WzFdID09ICciJykKLQl7Ci0JICAqcysrID0gJyInOwotCSAgdCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK3Q7Ci0JICBhc3NlcnQgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpOwotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpCi0JICAgICsrdDsKLQkgIGlmICgqdCA9PSAnXDAnKQotCSAgICBicmVhazsKLQkgIGFzc2VydCAoKnQgPT0gJyInKTsKLQkgICsrdDsKLQl9Ci0gICAgfQotCi0gICpzID0gJ1wwJzsKLQotICAqbGVuID0gcyAtIHJldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBbGxvY2F0ZSBhIHN0cmluZyBvZiBhIGdpdmVuIGxlbmd0aC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9zdHJpbmcgKGxlbikKLSAgICAgaW50IGxlbjsKLXsKLSAgc3RydWN0IGFsbG9jX3N0cmluZyAqYXM7Ci0KLSAgYXMgPSAoc3RydWN0IGFsbG9jX3N0cmluZyAqKSB4bWFsbG9jIChzaXplb2YgKmFzKTsKLSAgYXMtPnMgPSB4bWFsbG9jIChsZW4pOwotCi0gIGFzLT5uZXh0ID0gc3RyaW5nczsKLSAgc3RyaW5ncyA9IGFzLT5uZXh0OwotCi0gIHJldHVybiBhcy0+czsKLX0KLQotLyogRGlzY2FyZCBhbGwgdGhlIHN0cmluZ3Mgd2UgaGF2ZSBhbGxvY2F0ZWQuICBUaGUgcGFyc2VyIGNhbGxzIHRoaXMKLSAgIHdoZW4gaXQgbm8gbG9uZ2VyIG5lZWRzIHRoZW0uICAqLwotCi12b2lkCi1yY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKQotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICphczsKLQotICBhcyA9IHN0cmluZ3M7Ci0gIHdoaWxlIChhcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBhbGxvY19zdHJpbmcgKm47Ci0KLSAgICAgIGZyZWUgKGFzLT5zKTsKLSAgICAgIG4gPSBhcy0+bmV4dDsKLSAgICAgIGZyZWUgKGFzKTsKLSAgICAgIGFzID0gbjsKLSAgICB9Ci0KLSAgc3RyaW5ncyA9IE5VTEw7Ci19Ci0KLS8qIEVudGVyIHJjZGF0YSBtb2RlLiAgKi8KLQotdm9pZAotcmNwYXJzZV9yY2RhdGEgKCkKLXsKLSAgcmNkYXRhX21vZGUgPSAxOwotfQotCi0vKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlIGZyb20gcmNkYXRhIG1vZGUuICAqLwotCi12b2lkCi1yY3BhcnNlX25vcm1hbCAoKQotewotICByY2RhdGFfbW9kZSA9IDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yY3BhcnNlLnkgYi9iaW51dGlscy9yY3BhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzY2JiZGMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmNwYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsMTYxOSArMCwwIEBACi0leyAvKiByY3BhcnNlLnkgLS0gcGFyc2VyIGZvciBXaW5kb3dzIHJjIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBwYXJzZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMuICBJdCBpcyBiYXNlZCBvbiB0aGUgcGFyc2VyCi0gICBieSBHdW50aGVyIEViZXJ0IDxndW50aGVyLmViZXJ0QGl4b3MtbGVpcHppZy5kZT4uICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogVGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbGFuZ3VhZ2U7Ci0KLS8qIFRoZSByZXNvdXJjZSBpbmZvcm1hdGlvbiBkdXJpbmcgYSBzdWIgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzX2luZm8gc3ViX3Jlc19pbmZvOwotCi0vKiBEaWFsb2cgaW5mb3JtYXRpb24uICBUaGlzIGlzIGJ1aWx0IGJ5IHRoZSBub250ZXJtaW5hbHMgc3R5bGVzIGFuZAotICAgY29udHJvbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGRpYWxvZyBkaWFsb2c7Ci0KLS8qIFRoaXMgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgc3R5bGUuICBJdCBpcyBtb2RpZmllZCBieSB0aGUKLSAgIG5vbnRlcm1pbmFsIHN0eWxlZXhwci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0eWxlOwotCi0vKiBUaGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgY29udHJvbC4gIFRoZXkgYXJlIHNldCBiZWZvcmUgdXNpbmcKLSAgIGNvbnRyb2xfcGFyYW1zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFzZV9zdHlsZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRfc3R5bGU7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGFzczsKLQotJX0KLQotJXVuaW9uCi17Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciBhY2M7Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciAqcGFjYzsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkaWFsb2dfY29udHJvbDsKLSAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbTsKLSAgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmZpcnN0OwotICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqbGFzdDsKLSAgfSByY2RhdGE7Ci0gIHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhX2l0ZW07Ci0gIHN0cnVjdCBzdHJpbmd0YWJsZV9kYXRhICpzdHJpbmd0YWJsZTsKLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaXh2ZXI7Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmVyaW5mbzsKLSAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2ZXJzdHJpbmc7Ci0gIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmVydmFyOwotICBzdHJ1Y3QgcmVzX2lkIGlkOwotICBzdHJ1Y3QgcmVzX3Jlc19pbmZvIHJlc19pbmZvOwotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIHNob3J0IG9uOwotICAgIHVuc2lnbmVkIHNob3J0IG9mZjsKLSAgfSBtZW1mbGFnczsKLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgbnVtYmVyIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhcyBsb25nLiAgKi8KLSAgICBpbnQgZHdvcmQ7Ci0gIH0gaTsKLSAgdW5zaWduZWQgbG9uZyBpbDsKLSAgdW5zaWduZWQgc2hvcnQgaXM7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgY29uc3QgY2hhciAqczsKLSAgfSBzczsKLX07Ci0KLSV0b2tlbiBCRUcgRU5ECi0ldG9rZW4gQUNDRUxFUkFUT1JTIFZJUlRLRVkgQVNDSUkgTk9JTlZFUlQgU0hJRlQgQ09OVFJPTCBBTFQKLSV0b2tlbiBCSVRNQVAKLSV0b2tlbiBDVVJTT1IKLSV0b2tlbiBESUFMT0cgRElBTE9HRVggRVhTVFlMRSBDQVBUSU9OIENMQVNTIFNUWUxFCi0ldG9rZW4gQVVUTzNTVEFURSBBVVRPQ0hFQ0tCT1ggQVVUT1JBRElPQlVUVE9OIENIRUNLQk9YIENPTUJPQk9YIENURVhUCi0ldG9rZW4gREVGUFVTSEJVVFRPTiBFRElUVEVYVCBHUk9VUEJPWCBMSVNUQk9YIExURVhUIFBVU0hCT1ggUFVTSEJVVFRPTgotJXRva2VuIFJBRElPQlVUVE9OIFJURVhUIFNDUk9MTEJBUiBTVEFURTMgVVNFUkJVVFRPTgotJXRva2VuIEJFRElUIEhFRElUIElFRElUCi0ldG9rZW4gRk9OVAotJXRva2VuIElDT04KLSV0b2tlbiBMQU5HVUFHRSBDSEFSQUNURVJJU1RJQ1MgVkVSU0lPTksKLSV0b2tlbiBNRU5VIE1FTlVFWCBNRU5VSVRFTSBTRVBBUkFUT1IgUE9QVVAgQ0hFQ0tFRCBHUkFZRUQgSEVMUCBJTkFDVElWRQotJXRva2VuIE1FTlVCQVJCUkVBSyBNRU5VQlJFQUsKLSV0b2tlbiBNRVNTQUdFVEFCTEUKLSV0b2tlbiBSQ0RBVEEKLSV0b2tlbiBTVFJJTkdUQUJMRQotJXRva2VuIFZFUlNJT05JTkZPIEZJTEVWRVJTSU9OIFBST0RVQ1RWRVJTSU9OIEZJTEVGTEFHU01BU0sgRklMRUZMQUdTCi0ldG9rZW4gRklMRU9TIEZJTEVUWVBFIEZJTEVTVUJUWVBFIEJMT0NLU1RSSU5HRklMRUlORk8gQkxPQ0tWQVJGSUxFSU5GTwotJXRva2VuIFZBTFVFCi0ldG9rZW4gPHM+IEJMT0NLCi0ldG9rZW4gTU9WRUFCTEUgRklYRUQgUFVSRSBJTVBVUkUgUFJFTE9BRCBMT0FET05DQUxMIERJU0NBUkRBQkxFCi0ldG9rZW4gTk9UCi0ldG9rZW4gPHM+IFFVT1RFRFNUUklORyBTVFJJTkcKLSV0b2tlbiA8aT4gTlVNQkVSCi0ldG9rZW4gPHNzPiBTSVpFRFNUUklORwotJXRva2VuIElHTk9SRURfVE9LRU4KLQotJXR5cGUgPHBhY2M+IGFjY19lbnRyaWVzCi0ldHlwZSA8YWNjPiBhY2NfZW50cnkgYWNjX2V2ZW50Ci0ldHlwZSA8ZGlhbG9nX2NvbnRyb2w+IGNvbnRyb2wgY29udHJvbF9wYXJhbXMKLSV0eXBlIDxtZW51aXRlbT4gbWVudWl0ZW1zIG1lbnVpdGVtIG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KLSV0eXBlIDxyY2RhdGE+IG9wdHJjZGF0YV9kYXRhIG9wdHJjZGF0YV9kYXRhX2ludCByY2RhdGFfZGF0YQotJXR5cGUgPHJjZGF0YV9pdGVtPiBvcHRfY29udHJvbF9kYXRhCi0ldHlwZSA8Zml4dmVyPiBmaXhlZHZlcmluZm8KLSV0eXBlIDx2ZXJpbmZvPiB2ZXJibG9ja3MKLSV0eXBlIDx2ZXJzdHJpbmc+IHZlcnZhbHMKLSV0eXBlIDx2ZXJ2YXI+IHZlcnRyYW5zCi0ldHlwZSA8cmVzX2luZm8+IHN1Ym9wdGlvbnMgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWdzX21vdmUKLSV0eXBlIDxtZW1mbGFncz4gbWVtZmxhZwotJXR5cGUgPGlkPiBpZAotJXR5cGUgPGlsPiBleHN0eWxlIHBhcmVubnVtYmVyCi0ldHlwZSA8aWw+IG51bWV4cHIgcG9zbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBjcG9zbnVtZXhwcgotJXR5cGUgPGlzPiBhY2Nfb3B0aW9ucyBhY2Nfb3B0aW9uIG1lbnVpdGVtX2ZsYWdzIG1lbnVpdGVtX2ZsYWcKLSV0eXBlIDxzPiBvcHRzdHJpbmdjIGZpbGVfbmFtZQotJXR5cGUgPGk+IHNpemVkbnVtZXhwciBzaXplZHBvc251bWV4cHIKLQotJWxlZnQgJ3wnCi0lbGVmdCAnXicKLSVsZWZ0ICcmJwotJWxlZnQgJysnICctJwotJWxlZnQgJyonICcvJyAnJScKLSVyaWdodCAnficgTkVHCi0KLSUlCi0KLWlucHV0OgotCSAgLyogZW1wdHkgKi8KLQl8IGlucHV0IG5ld2NtZCBhY2NlbGVyYXRvcgotCXwgaW5wdXQgbmV3Y21kIGJpdG1hcAotCXwgaW5wdXQgbmV3Y21kIGN1cnNvcgotCXwgaW5wdXQgbmV3Y21kIGRpYWxvZwotCXwgaW5wdXQgbmV3Y21kIGZvbnQKLQl8IGlucHV0IG5ld2NtZCBpY29uCi0JfCBpbnB1dCBuZXdjbWQgbGFuZ3VhZ2UKLQl8IGlucHV0IG5ld2NtZCBtZW51Ci0JfCBpbnB1dCBuZXdjbWQgbWVudWV4Ci0JfCBpbnB1dCBuZXdjbWQgbWVzc2FnZXRhYmxlCi0JfCBpbnB1dCBuZXdjbWQgcmNkYXRhCi0JfCBpbnB1dCBuZXdjbWQgc3RyaW5ndGFibGUKLQl8IGlucHV0IG5ld2NtZCB1c2VyCi0JfCBpbnB1dCBuZXdjbWQgdmVyc2lvbmluZm8KLQl8IGlucHV0IG5ld2NtZCBJR05PUkVEX1RPS0VOCi0JOwotCi1uZXdjbWQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICByY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKTsKLQkgIH0KLQk7Ci0KLS8qIEFjY2VsZXJhdG9yIHJlc291cmNlcy4gICovCi0KLWFjY2VsZXJhdG9yOgotCSAgaWQgQUNDRUxFUkFUT1JTIHN1Ym9wdGlvbnMgQkVHIGFjY19lbnRyaWVzIEVORAotCSAgewotCSAgICBkZWZpbmVfYWNjZWxlcmF0b3IgKCQxLCAmJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLWFjY19lbnRyaWVzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgYWNjX2VudHJpZXMgYWNjX2VudHJ5Ci0JICB7Ci0JICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYTsKLQotCSAgICBhID0gKHN0cnVjdCBhY2NlbGVyYXRvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYSk7Ci0JICAgICphID0gJDI7Ci0JICAgIGlmICgkMSA9PSBOVUxMKQotCSAgICAgICQkID0gYTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IGFjY2VsZXJhdG9yICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gYTsKLQkJJCQgPSAkMTsKLQkgICAgICB9Ci0JICB9Ci0JOwotCi1hY2NfZW50cnk6Ci0JICBhY2NfZXZlbnQgY3Bvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuaWQgPSAkMjsKLQkgIH0KLQl8IGFjY19ldmVudCBjcG9zbnVtZXhwciAnLCcgYWNjX29wdGlvbnMKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuaWQgPSAkMjsKLQkgICAgJCQuZmxhZ3MgfD0gJDQ7Ci0JICAgIGlmICgoJCQuZmxhZ3MgJiBBQ0NfVklSVEtFWSkgPT0gMAotCQkmJiAoJCQuZmxhZ3MgJiAoQUNDX1NISUZUIHwgQUNDX0NPTlRST0wgfCBBQ0NfQUxUKSkgIT0gMCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImluYXBwcm9wcmlhdGUgbW9kaWZpZXJzIGZvciBub24tVklSVEtFWSIpKTsKLQkgIH0KLQk7Ci0KLWFjY19ldmVudDoKLQkgIFFVT1RFRFNUUklORwotCSAgewotCSAgICBjb25zdCBjaGFyICpzID0gJDE7Ci0JICAgIGNoYXIgY2g7Ci0KLQkgICAgJCQubmV4dCA9IE5VTEw7Ci0JICAgICQkLmlkID0gMDsKLQkgICAgY2ggPSAqczsKLQkgICAgaWYgKGNoICE9ICdeJykKLQkgICAgICAkJC5mbGFncyA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSQkLmZsYWdzID0gQUNDX0NPTlRST0wgfCBBQ0NfVklSVEtFWTsKLQkJKytzOwotCQljaCA9ICpzOwotCQljaCA9IHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjaCk7Ci0JICAgICAgfQotCSAgICAkJC5rZXkgPSBjaDsKLQkgICAgaWYgKHNbMV0gIT0gJ1wwJykKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImFjY2VsZXJhdG9yIHNob3VsZCBvbmx5IGJlIG9uZSBjaGFyYWN0ZXIiKSk7Ci0JICB9Ci0JfCBwb3NudW1leHByCi0JICB7Ci0JICAgICQkLm5leHQgPSBOVUxMOwotCSAgICAkJC5mbGFncyA9IDA7Ci0JICAgICQkLmlkID0gMDsKLQkgICAgJCQua2V5ID0gJDE7Ci0JICB9Ci0JOwotCi1hY2Nfb3B0aW9uczoKLQkgIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGFjY19vcHRpb25zICcsJyBhY2Nfb3B0aW9uCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMzsKLQkgIH0KLQkvKiBJJ3ZlIGhhZCBvbmUgcmVwb3J0IHRoYXQgdGhlIGNvbW1hIGlzIG9wdGlvbmFsLiAgKi8KLQl8IGFjY19vcHRpb25zIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMSB8ICQyOwotCSAgfQotCTsKLQotYWNjX29wdGlvbjoKLQkgIFZJUlRLRVkKLQkgIHsKLQkgICAgJCQgPSBBQ0NfVklSVEtFWTsKLQkgIH0KLQl8IEFTQ0lJCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMganVzdCB0aGUgYWJzZW5jZSBvZiBWSVJUS0VZLiAgKi8KLQkgICAgJCQgPSAwOwotCSAgfQotCXwgTk9JTlZFUlQKLQkgIHsKLQkgICAgJCQgPSBBQ0NfTk9JTlZFUlQ7Ci0JICB9Ci0JfCBTSElGVAotCSAgewotCSAgICAkJCA9IEFDQ19TSElGVDsKLQkgIH0KLQl8IENPTlRST0wKLQkgIHsKLQkgICAgJCQgPSBBQ0NfQ09OVFJPTDsKLQkgIH0KLQl8IEFMVAotCSAgewotCSAgICAkJCA9IEFDQ19BTFQ7Ci0JICB9Ci0JOwotCi0vKiBCaXRtYXAgcmVzb3VyY2VzLiAgKi8KLQotYml0bWFwOgotCSAgaWQgQklUTUFQIG1lbWZsYWdzX21vdmUgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV9iaXRtYXAgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIEN1cnNvciByZXNvdXJjZXMuICAqLwotCi1jdXJzb3I6Ci0JICBpZCBDVVJTT1IgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfY3Vyc29yICgkMSwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBEaWFsb2cgcmVzb3VyY2VzLiAgKi8KLQotZGlhbG9nOgotCSAgaWQgRElBTE9HIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9IE5VTEw7Ci0JICAgICAgZGlhbG9nLmNvbnRyb2xzID0gTlVMTDsKLQkgICAgICBzdWJfcmVzX2luZm8gPSAkMzsKLQkgICAgfQotCSAgICBzdHlsZXMgQkVHIGNvbnRyb2xzIEVORAotCSAgewotCSAgICBkZWZpbmVfZGlhbG9nICgkMSwgJnN1Yl9yZXNfaW5mbywgJmRpYWxvZyk7Ci0JICB9Ci0JfCBpZCBESUFMT0dFWCBtZW1mbGFnc19tb3ZlIGV4c3R5bGUgcG9zbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwcgotCSAgICB7Ci0JICAgICAgbWVtc2V0ICgmZGlhbG9nLCAwLCBzaXplb2YgZGlhbG9nKTsKLQkgICAgICBkaWFsb2cueCA9ICQ1OwotCSAgICAgIGRpYWxvZy55ID0gJDY7Ci0JICAgICAgZGlhbG9nLndpZHRoID0gJDc7Ci0JICAgICAgZGlhbG9nLmhlaWdodCA9ICQ4OwotCSAgICAgIGRpYWxvZy5zdHlsZSA9IFdTX1BPUFVQIHwgV1NfQk9SREVSIHwgV1NfU1lTTUVOVTsKLQkgICAgICBkaWFsb2cuZXhzdHlsZSA9ICQ0OwotCSAgICAgIGRpYWxvZy5tZW51Lm5hbWVkID0gMTsKLQkgICAgICBkaWFsb2cuY2xhc3MubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5mb250ID0gTlVMTDsKLQkgICAgICBkaWFsb2cuZXggPSAoKHN0cnVjdCBkaWFsb2dfZXggKikKLQkJCSAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlhbG9nX2V4KSkpOwotCSAgICAgIG1lbXNldCAoZGlhbG9nLmV4LCAwLCBzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKTsKLQkgICAgICBkaWFsb2cuY29udHJvbHMgPSBOVUxMOwotCSAgICAgIHN1Yl9yZXNfaW5mbyA9ICQzOwotCSAgICB9Ci0JICAgIHN0eWxlcyBCRUcgY29udHJvbHMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9kaWFsb2cgKCQxLCAmc3ViX3Jlc19pbmZvLCAmZGlhbG9nKTsKLQkgIH0KLQl8IGlkIERJQUxPR0VYIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9ICgoc3RydWN0IGRpYWxvZ19leCAqKQotCQkJICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKSk7Ci0JICAgICAgbWVtc2V0IChkaWFsb2cuZXgsIDAsIHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOwotCSAgICAgIGRpYWxvZy5leC0+aGVscCA9ICQ5OwotCSAgICAgIGRpYWxvZy5jb250cm9scyA9IE5VTEw7Ci0JICAgICAgc3ViX3Jlc19pbmZvID0gJDM7Ci0JICAgIH0KLQkgICAgc3R5bGVzIEJFRyBjb250cm9scyBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX2RpYWxvZyAoJDEsICZzdWJfcmVzX2luZm8sICZkaWFsb2cpOwotCSAgfQotCTsKLQotZXhzdHlsZToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gMDsKLQkgIH0KLQl8IEVYU1RZTEUgJz0nIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQk7Ci0KLXN0eWxlczoKLQkgIC8qIGVtcHR5ICovCi0JfCBzdHlsZXMgQ0FQVElPTiBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZkaWFsb2cuY2FwdGlvbiwgJDMpOwotCSAgfQotCXwgc3R5bGVzIENMQVNTIGlkCi0JICB7Ci0JICAgIGRpYWxvZy5jbGFzcyA9ICQzOwotCSAgfQotCXwgc3R5bGVzIFNUWUxFCi0JICAgIHsgc3R5bGUgPSBkaWFsb2cuc3R5bGU7IH0KLQkgICAgc3R5bGVleHByCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSA9IHN0eWxlOwotCSAgfQotCXwgc3R5bGVzIEVYU1RZTEUgbnVtZXhwcgotCSAgewotCSAgICBkaWFsb2cuZXhzdHlsZSA9ICQzOwotCSAgfQotCXwgc3R5bGVzIEZPTlQgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSB8PSBEU19TRVRGT05UOwotCSAgICBkaWFsb2cucG9pbnRzaXplID0gJDM7Ci0JICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmZGlhbG9nLmZvbnQsICQ1KTsKLQkgIH0KLQl8IHN0eWxlcyBGT05UIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBkaWFsb2cuc3R5bGUgfD0gRFNfU0VURk9OVDsKLQkgICAgZGlhbG9nLnBvaW50c2l6ZSA9ICQzOwotCSAgICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJmRpYWxvZy5mb250LCAkNSk7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImV4dGVuZGVkIEZPTlQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRpYWxvZy5leC0+d2VpZ2h0ID0gJDY7Ci0JCWRpYWxvZy5leC0+aXRhbGljID0gJDc7Ci0JICAgICAgfQotCSAgfQotCXwgc3R5bGVzIE1FTlUgaWQKLQkgIHsKLQkgICAgZGlhbG9nLm1lbnUgPSAkMzsKLQkgIH0KLQl8IHN0eWxlcyBDSEFSQUNURVJJU1RJQ1MgbnVtZXhwcgotCSAgewotCSAgICBzdWJfcmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzID0gJDM7Ci0JICB9Ci0JfCBzdHlsZXMgTEFOR1VBR0UgbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBzdWJfcmVzX2luZm8ubGFuZ3VhZ2UgPSAkMyB8ICgkNCA8PCA4KTsKLQkgIH0KLQl8IHN0eWxlcyBWRVJTSU9OSyBudW1leHByCi0JICB7Ci0JICAgIHN1Yl9yZXNfaW5mby52ZXJzaW9uID0gJDM7Ci0JICB9Ci0JOwotCi1jb250cm9sczoKLQkgIC8qIGVtcHR5ICovCi0JfCBjb250cm9scyBjb250cm9sCi0JICB7Ci0JICAgIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKnBwOwotCi0JICAgIGZvciAocHAgPSAmZGlhbG9nLmNvbnRyb2xzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgICAgOwotCSAgICAqcHAgPSAkMjsKLQkgIH0KLQk7Ci0KLWNvbnRyb2w6Ci0JICBBVVRPM1NUQVRFCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQVVUTzNTVEFURSB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTX0FVVE8zU1RBVEU7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBBVVRPQ0hFQ0tCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1g7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBBVVRPUkFESU9CVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT047Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBCRURJVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oIklFRElUIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCSAgICByZXNfc3RyaW5nX3RvX2lkICgmJCQtPmNsYXNzLCAiQkVESVQiKTsKLQkgIH0KLQl8IENIRUNLQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19DSEVDS0JPWCB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBDT01CT0JPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IENCU19TSU1QTEUgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSAwOwotCSAgICAgIGNsYXNzID0gQ1RMX0NPTUJPQk9YOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKLQkgICAgaWYgKCQxMSAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQxMTsKLQkgICAgICB9Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkMTE7Ci0JICAgICQkLT5kYXRhID0gJDEyOwotCSAgfQotCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKLQkgICAgaWYgKCQxMiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpOwotCQkkJC0+ZGF0YSA9ICQxMjsKLQkgICAgICB9Ci0JICAgICQkLT5jbGFzcy5uYW1lZCA9IDE7Ci0gIAkgICAgdW5pY29kZV9mcm9tX2FzY2lpKCYkJC0+Y2xhc3MudS5uLmxlbmd0aCwgJiQkLT5jbGFzcy51Lm4ubmFtZSwgJDUpOwotCSAgfQotCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoImhlbHAgSUQgcmVxdWlyZXMgRElBTE9HRVgiKTsKLQkgICAgJCQtPmhlbHAgPSAkMTI7Ci0JICAgICQkLT5kYXRhID0gJDEzOwotCSAgICAkJC0+Y2xhc3MubmFtZWQgPSAxOwotICAJICAgIHVuaWNvZGVfZnJvbV9hc2NpaSgmJCQtPmNsYXNzLnUubi5sZW5ndGgsICYkJC0+Y2xhc3MudS5uLm5hbWUsICQ1KTsKLQkgIH0KLQl8IENURVhUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU1NfQ0VOVEVSIHwgV1NfR1JPVVA7Ci0JICAgICAgYmFzZV9zdHlsZSA9IFNTX0NFTlRFUjsKLQkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IERFRlBVU0hCVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBFRElUVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBHUk9VUEJPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX0dST1VQQk9YOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19HUk9VUEJPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEhFRElUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGNsYXNzID0gQ1RMX0VESVQ7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiSUVESVQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIHJlc19zdHJpbmdfdG9faWQgKCYkJC0+Y2xhc3MsICJIRURJVCIpOwotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMiwgJDMsICQ0LCAkNSwgMCwgMCwgQ1RMX1NUQVRJQywKLQkJCQkgU1NfSUNPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwgMCk7Ci0JICAgIGlmICgkNiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ2OwotCSAgICAgIH0KLQkgIH0KLQl8IElDT04gb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGljb25fc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLSAgICAJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDQsICQ1LCAkNiwgJDcsIENUTF9TVEFUSUMsCi0JCQkJIHN0eWxlLCAkOSk7Ci0JICAgIGlmICgkMTAgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkJJCQtPmRhdGEgPSAkMTA7Ci0JICAgICAgfQotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgaWNvbl9zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotICAgIAkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgQ1RMX1NUQVRJQywKLQkJCQkgc3R5bGUsICQ5KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkMTA7Ci0JICAgICQkLT5kYXRhID0gJDExOwotCSAgfQotCXwgSUVESVQKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfRURJVDsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJJRURJVCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLT5jbGFzcywgIklFRElUIik7Ci0JICB9Ci0JfCBMSVNUQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKLQkgICAgICBiYXNlX3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKLQkgICAgICBjbGFzcyA9IENUTF9MSVNUQk9YOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBMVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX0xFRlQgfCBXU19HUk9VUDsKLQkgICAgICBiYXNlX3N0eWxlID0gU1NfTEVGVDsKLQkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFBVU0hCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQk9YIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFBVU0hCVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBSQURJT0JVVFRPTgotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUkFESU9CVVRUT047Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBSVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX1JJR0hUIHwgV1NfR1JPVVA7Ci0JICAgICAgYmFzZV9zdHlsZSA9IFNTX1JJR0hUOwotCSAgICAgIGNsYXNzID0gQ1RMX1NUQVRJQzsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCXwgU0NST0xMQkFSCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU0JTX0hPUlo7Ci0JICAgICAgYmFzZV9zdHlsZSA9IDA7Ci0JICAgICAgY2xhc3MgPSBDVExfU0NST0xMQkFSOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBTVEFURTMKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU18zU1RBVEUgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU18zU1RBVEU7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBVU0VSQlVUVE9OIFFVT1RFRFNUUklORyAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcKLQkgICAgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgCi0JICAgIHsgc3R5bGUgPSBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KLQkgICAgc3R5bGVleHByIG9wdGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkNCwgJDYsICQ4LCAkMTAsICQxMiwgQ1RMX0JVVFRPTiwKLQkJCQkgc3R5bGUsICQxNik7Ci0JICB9Ci0JOwotCi0vKiBQYXJhbWV0ZXJzIGZvciBhIGNvbnRyb2wuICBUaGUgc3RhdGljIHZhcmlhYmxlcyBERUZBVUxUX1NUWUxFLAotICAgQkFTRV9TVFlMRSwgYW5kIENMQVNTIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgbm9udGVybWluYWwKLSAgIGlzIHVzZWQuICBERUZBVUxUX1NUWUxFIGlzIHRoZSBzdHlsZSB0byB1c2UgaWYgbm8gc3R5bGUgZXhwcmVzc2lvbgotICAgaXMgc3BlY2lmaWVkLiAgQkFTRV9TVFlMRSBpcyB0aGUgYmFzZSBzdHlsZSB0byB1c2UgaWYgYSBzdHlsZQotICAgZXhwcmVzc2lvbiBpcyBzcGVjaWZpZWQ7IHRoZSBzdHlsZSBleHByZXNzaW9uIG1vZGlmaWVzIHRoZSBiYXNlCi0gICBzdHlsZS4gIENMQVNTIGlzIHRoZSBjbGFzcyBvZiB0aGUgY29udHJvbC4gICovCi0KLWNvbnRyb2xfcGFyYW1zOgotCSAgb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsCi0JCQkJIGRlZmF1bHRfc3R5bGUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUsIDApOwotCSAgICBpZiAoJDcgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkJJCQtPmRhdGEgPSAkNzsKLQkgICAgICB9Ci0JICB9Ci0JfCBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgY29udHJvbF9wYXJhbXNfc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsIHN0eWxlLCAkOCk7Ci0JICAgIGlmICgkOSAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ5OwotCSAgICAgIH0KLQkgIH0KLQl8IG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjb250cm9sX3BhcmFtc19zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCBjbGFzcywgc3R5bGUsICQ4KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkOTsKLQkgICAgJCQtPmRhdGEgPSAkMTA7Ci0JICB9Ci0JOwotCi1vcHRzdHJpbmdjOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgUVVPVEVEU1RSSU5HICcsJwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotb3B0X2NvbnRyb2xfZGF0YToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgJCQgPSAkMi5maXJzdDsKLQkgIH0KLQk7Ci0KLS8qIFRoZXNlIG9ubHkgZXhpc3QgdG8gcGFyc2UgYSByZWR1Y3Rpb24gb3V0IG9mIGEgY29tbW9uIGNhc2UuICAqLwotCi1jb250cm9sX3N0eWxlZXhwcjoKLQkgICcsJwotCSAgeyBzdHlsZSA9IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi1pY29uX3N0eWxlZXhwcjoKLQkgICcsJwotCSAgeyBzdHlsZSA9IFNTX0lDT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KLQkgIHN0eWxlZXhwcgotCTsKLQotY29udHJvbF9wYXJhbXNfc3R5bGVleHByOgotCSAgJywnCi0JICB7IHN0eWxlID0gYmFzZV9zdHlsZSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi0vKiBGb250IHJlc291cmNlcy4gICovCi0KLWZvbnQ6Ci0JICBpZCBGT05UIG1lbWZsYWdzX21vdmVfZGlzY2FyZCBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX2ZvbnQgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIEljb24gcmVzb3VyY2VzLiAgKi8KLQotaWNvbjoKLQkgIGlkIElDT04gbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfaWNvbiAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogTGFuZ3VhZ2UgY29tbWFuZC4gIFRoaXMgY2hhbmdlcyB0aGUgc3RhdGljIHZhcmlhYmxlIGxhbmd1YWdlLCB3aGljaAotICAgYWZmZWN0cyBhbGwgc3Vic2VxdWVudCByZXNvdXJjZXMuICAqLwotCi1sYW5ndWFnZToKLQkgIExBTkdVQUdFIG51bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgbGFuZ3VhZ2UgPSAkMiB8ICgkMyA8PCA4KTsKLQkgIH0KLQk7Ci0KLS8qIE1lbnUgcmVzb3VyY2VzLiAgKi8KLQotbWVudToKLQkgIGlkIE1FTlUgc3Vib3B0aW9ucyBCRUcgbWVudWl0ZW1zIEVORAotCSAgewotCSAgICBkZWZpbmVfbWVudSAoJDEsICYkMywgJDUpOwotCSAgfQotCTsKLQotbWVudWl0ZW1zOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgbWVudWl0ZW1zIG1lbnVpdGVtCi0JICB7Ci0JICAgIGlmICgkMSA9PSBOVUxMKQotCSAgICAgICQkID0gJDI7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cnVjdCBtZW51aXRlbSAqKnBwOwotCi0JCWZvciAocHAgPSAmJDEtPm5leHQ7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkJICA7Ci0JCSpwcCA9ICQyOwotCQkkJCA9ICQxOwotCSAgICAgIH0KLQkgIH0KLQk7Ci0KLW1lbnVpdGVtOgotCSAgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIG1lbnVpdGVtX2ZsYWdzCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAwLCAwLCBOVUxMKTsKLQkgIH0KLQl8IE1FTlVJVEVNIFNFUEFSQVRPUgotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoTlVMTCwgMCwgMCwgMCwgMCwgTlVMTCk7Ci0JICB9Ci0JfCBQT1BVUCBRVU9URURTVFJJTkcgbWVudWl0ZW1fZmxhZ3MgQkVHIG1lbnVpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAwLCAkMywgMCwgMCwgJDUpOwotCSAgfQotCTsKLQotbWVudWl0ZW1fZmxhZ3M6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IDA7Ci0JICB9Ci0JfCBtZW51aXRlbV9mbGFncyAnLCcgbWVudWl0ZW1fZmxhZwotCSAgewotCSAgICAkJCA9ICQxIHwgJDM7Ci0JICB9Ci0JfCBtZW51aXRlbV9mbGFncyBtZW51aXRlbV9mbGFnCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMjsKLQkgIH0KLQk7Ci0KLW1lbnVpdGVtX2ZsYWc6Ci0JICBDSEVDS0VECi0JICB7Ci0JICAgICQkID0gTUVOVUlURU1fQ0hFQ0tFRDsKLQkgIH0KLQl8IEdSQVlFRAotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX0dSQVlFRDsKLQkgIH0KLQl8IEhFTFAKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9IRUxQOwotCSAgfQotCXwgSU5BQ1RJVkUKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9JTkFDVElWRTsKLQkgIH0KLQl8IE1FTlVCQVJCUkVBSwotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCQVJCUkVBSzsKLQkgIH0KLQl8IE1FTlVCUkVBSwotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCUkVBSzsKLQkgIH0KLQk7Ci0KLS8qIE1lbnVleCByZXNvdXJjZXMuICAqLwotCi1tZW51ZXg6Ci0JICBpZCBNRU5VRVggc3Vib3B0aW9ucyBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9tZW51ICgkMSwgJiQzLCAkNSk7Ci0JICB9Ci0JOwotCi1tZW51ZXhpdGVtczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KLQkgIHsKLQkgICAgaWYgKCQxID09IE5VTEwpCi0JICAgICAgJCQgPSAkMjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IG1lbnVpdGVtICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gJDI7Ci0JCSQkID0gJDE7Ci0JICAgICAgfQotCSAgfQotCTsKLQotbWVudWV4aXRlbToKLQkgIE1FTlVJVEVNIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsIDAsIDAsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsIDAsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIG9wdGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgMCwgTlVMTCk7Ci0JICB9Ci0gCXwgTUVOVUlURU0gU0VQQVJBVE9SCi0gCSAgewotIAkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwpOwotIAkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgMCwgMCwgMCwgMCwgJDQpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgMCwgMCwgMCwgJDUpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgJDQsIDAsIDAsICQ2KTsKLQkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwcgotCSAgICBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgJDYsICQ4KTsKLQkgIH0KLQk7Ci0KLS8qIE1lc3NhZ2V0YWJsZSByZXNvdXJjZXMuICAqLwotCi1tZXNzYWdldGFibGU6Ci0JICBpZCBNRVNTQUdFVEFCTEUgbWVtZmxhZ3NfbW92ZSBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX21lc3NhZ2V0YWJsZSAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogUmNkYXRhIHJlc291cmNlcy4gICovCi0KLXJjZGF0YToKLQkgIGlkIFJDREFUQSBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX3JjZGF0YSAoJDEsICYkMywgJDUuZmlyc3QpOwotCSAgfQotCTsKLQotLyogV2UgdXNlIGEgZGlmZmVyZW50IGxleGluZyBhbGdvcml0aG0sIGJlY2F1c2UgcmNkYXRhIHN0cmluZ3MgbWF5Ci0gICBjb250YWluIGVtYmVkZGVkIG51bGwgYnl0ZXMsIGFuZCB3ZSBuZWVkIHRvIGtub3cgdGhlIGxlbmd0aCB0byB1c2UuICAqLwotCi1vcHRyY2RhdGFfZGF0YToKLQkgIHsKLQkgICAgcmNwYXJzZV9yY2RhdGEgKCk7Ci0JICB9Ci0JICBvcHRyY2RhdGFfZGF0YV9pbnQKLQkgIHsKLQkgICAgcmNwYXJzZV9ub3JtYWwgKCk7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi1vcHRyY2RhdGFfZGF0YV9pbnQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJC5maXJzdCA9IE5VTEw7Ci0JICAgICQkLmxhc3QgPSBOVUxMOwotCSAgfQotCXwgcmNkYXRhX2RhdGEKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLXJjZGF0YV9kYXRhOgotCSAgU0laRURTVFJJTkcKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfc3RyaW5nICgkMS5zLCAkMS5sZW5ndGgpOwotCSAgICAkJC5maXJzdCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfbnVtYmVyICgkMS52YWwsICQxLmR3b3JkKTsKLQkgICAgJCQuZmlyc3QgPSByaTsKLQkgICAgJCQubGFzdCA9IHJpOwotCSAgfQotCXwgcmNkYXRhX2RhdGEgJywnIFNJWkVEU1RSSU5HCi0JICB7Ci0JICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLQkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX3N0cmluZyAoJDMucywgJDMubGVuZ3RoKTsKLQkgICAgJCQuZmlyc3QgPSAkMS5maXJzdDsKLQkgICAgJDEubGFzdC0+bmV4dCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCByY2RhdGFfZGF0YSAnLCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLQkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX251bWJlciAoJDMudmFsLCAkMy5kd29yZCk7Ci0JICAgICQkLmZpcnN0ID0gJDEuZmlyc3Q7Ci0JICAgICQxLmxhc3QtPm5leHQgPSByaTsKLQkgICAgJCQubGFzdCA9IHJpOwotCSAgfQotCTsKLQotLyogU3RyaW5ndGFibGUgcmVzb3VyY2VzLiAgKi8KLQotc3RyaW5ndGFibGU6Ci0JICBTVFJJTkdUQUJMRSBzdWJvcHRpb25zIEJFRyAKLQkgICAgeyBzdWJfcmVzX2luZm8gPSAkMjsgfQotCSAgICBzdHJpbmdfZGF0YSBFTkQKLQk7Ci0KLXN0cmluZ19kYXRhOgotCSAgLyogZW1wdHkgKi8KLQl8IHN0cmluZ19kYXRhIG51bWV4cHIgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRlZmluZV9zdHJpbmd0YWJsZSAoJnN1Yl9yZXNfaW5mbywgJDIsICQzKTsKLQkgIH0KLQl8IHN0cmluZ19kYXRhIG51bWV4cHIgJywnIFFVT1RFRFNUUklORwotCSAgewotCSAgICBkZWZpbmVfc3RyaW5ndGFibGUgKCZzdWJfcmVzX2luZm8sICQyLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBVc2VyIGRlZmluZWQgcmVzb3VyY2VzLiAgV2UgYWNjZXB0IGdlbmVyYWwgc3Vib3B0aW9ucyBpbiB0aGUKLSAgIGZpbGVfbmFtZSBjYXNlIHRvIGtlZXAgdGhlIHBhcnNlciBoYXBweS4gICovCi0KLXVzZXI6Ci0JICBpZCBpZCBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX3VzZXJfZGF0YSAoJDEsICQyLCAmJDMsICQ1LmZpcnN0KTsKLQkgIH0KLQl8IGlkIGlkIHN1Ym9wdGlvbnMgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV91c2VyX2ZpbGUgKCQxLCAkMiwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBWZXJzaW9uaW5mbyByZXNvdXJjZXMuICAqLwotCi12ZXJzaW9uaW5mbzoKLQkgIGlkIFZFUlNJT05JTkZPIGZpeGVkdmVyaW5mbyBCRUcgdmVyYmxvY2tzIEVORAotCSAgewotCSAgICBkZWZpbmVfdmVyc2lvbmluZm8gKCQxLCBsYW5ndWFnZSwgJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLWZpeGVkdmVyaW5mbzoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gKChzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKikKLQkJICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvKSkpOwotCSAgICBtZW1zZXQgKCQkLCAwLCBzaXplb2YgKHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbykpOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVWRVJTSU9OIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgJDEtPmZpbGVfdmVyc2lvbl9tcyA9ICgkMyA8PCAxNikgfCAkNDsKLQkgICAgJDEtPmZpbGVfdmVyc2lvbl9scyA9ICgkNSA8PCAxNikgfCAkNjsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBQUk9EVUNUVkVSU0lPTiBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbXMgPSAoJDMgPDwgMTYpIHwgJDQ7Ci0JICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbHMgPSAoJDUgPDwgMTYpIHwgJDY7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRUZMQUdTTUFTSyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX2ZsYWdzX21hc2sgPSAkMzsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBGSUxFRkxBR1MgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV9mbGFncyA9ICQzOwotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVPUyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX29zID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVRZUEUgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV90eXBlID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVNVQlRZUEUgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV9zdWJ0eXBlID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBUbyBoYW5kbGUgdmVyYmxvY2tzIHN1Y2Nlc3NmdWxseSwgdGhlIGxleGVyIGhhbmRsZXMgQkxPQ0sKLSAgIHNwZWNpYWxseS4gIEEgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcwotICAgQkxPQ0tTVFJJTkdGSUxFSU5GTy4gIEEgQkxPQ0sgIlZhckZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcwotICAgQkxPQ0tWQVJGSUxFSU5GTy4gIEEgQkxPQ0sgd2l0aCBzb21lIG90aGVyIHN0cmluZyByZXR1cm5zIEJMT0NLCi0gICB3aXRoIHRoZSBzdHJpbmcgYXMgdGhlIHZhbHVlLiAgKi8KLQotdmVyYmxvY2tzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgdmVyYmxvY2tzIEJMT0NLU1RSSU5HRklMRUlORk8gQkVHIEJMT0NLIEJFRyB2ZXJ2YWxzIEVORCBFTkQKLQkgIHsKLQkgICAgJCQgPSBhcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvICgkMSwgJDQsICQ2KTsKLQkgIH0KLQl8IHZlcmJsb2NrcyBCTE9DS1ZBUkZJTEVJTkZPIEJFRyBWQUxVRSBRVU9URURTVFJJTkcgdmVydHJhbnMgRU5ECi0JICB7Ci0JICAgICQkID0gYXBwZW5kX3Zlcl92YXJmaWxlaW5mbyAoJDEsICQ1LCAkNik7Ci0JICB9Ci0JOwotCi12ZXJ2YWxzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgdmVydmFscyBWQUxVRSBRVU9URURTVFJJTkcgJywnIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJ2YWwgKCQxLCAkMywgJDUpOwotCSAgfQotCTsKLQotdmVydHJhbnM6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCB2ZXJ0cmFucyBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJ0cmFucyAoJDEsICQyLCAkMyk7Ci0JICB9Ci0JOwotCi0vKiBBIHJlc291cmNlIElELiAgKi8KLQotaWQ6Ci0JICBwb3NudW1leHByCi0JICB7Ci0JICAgICQkLm5hbWVkID0gMDsKLQkgICAgJCQudS5pZCA9ICQxOwotCSAgfQotCXwgU1RSSU5HCi0JICB7Ci0JICAgIGNoYXIgKmNvcHksICpzOwotCi0JICAgIC8qIEl0IHNlZW1zIHRoYXQgcmVzb3VyY2UgSUQncyBhcmUgZm9yY2VkIHRvIHVwcGVyIGNhc2UuICAqLwotCSAgICBjb3B5ID0geHN0cmR1cCAoJDEpOwotCSAgICBmb3IgKHMgPSBjb3B5OyAqcyAhPSAnXDAnOyBzKyspCi0JICAgICAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSpzID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLCBjb3B5KTsKLQkgICAgZnJlZSAoY29weSk7Ci0JICB9Ci0JOwotCi0vKiBHZW5lcmljIHN1Ym9wdGlvbnMuICBUaGVzZSBtYXkgYXBwZWFyIGJlZm9yZSB0aGUgQkVHSU4gaW4gYW55Ci0gICBtdWx0aWxpbmUgc3RhdGVtZW50LiAgKi8KLQotc3Vib3B0aW9uczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgIG1lbXNldCAoJiQkLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfcmVzX2luZm8pKTsKLQkgICAgJCQubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQkgICAgLyogRklYTUU6IElzIHRoaXMgdGhlIHJpZ2h0IGRlZmF1bHQ/ICAqLwotCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEU7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIG1lbWZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247Ci0JICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIENIQVJBQ1RFUklTVElDUyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLmNoYXJhY3RlcmlzdGljcyA9ICQzOwotCSAgfQotCXwgc3Vib3B0aW9ucyBMQU5HVUFHRSBudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLmxhbmd1YWdlID0gJDMgfCAoJDQgPDwgOCk7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIFZFUlNJT05LIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQudmVyc2lvbiA9ICQzOwotCSAgfQotCTsKLQotLyogTWVtb3J5IGZsYWdzIHdoaWNoIGRlZmF1bHQgdG8gTU9WRUFCTEUgYW5kIERJU0NBUkRBQkxFLiAgKi8KLQotbWVtZmxhZ3NfbW92ZV9kaXNjYXJkOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgbWVtc2V0ICgmJCQsIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotCSAgICAkJC5sYW5ndWFnZSA9IGxhbmd1YWdlOwotCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEUgfCBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgfQotCXwgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247Ci0JICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7Ci0JICB9Ci0JOwotCi0vKiBNZW1vcnkgZmxhZ3Mgd2hpY2ggZGVmYXVsdCB0byBNT1ZFQUJMRS4gICovCi0KLW1lbWZsYWdzX21vdmU6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICBtZW1zZXQgKCYkJCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0JICAgICQkLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JICAgICQkLm1lbWZsYWdzID0gTUVNRkxBR19NT1ZFQUJMRTsKLQkgIH0KLQl8IG1lbWZsYWdzX21vdmUgbWVtZmxhZwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC5tZW1mbGFncyB8PSAkMi5vbjsKLQkgICAgJCQubWVtZmxhZ3MgJj1+ICQyLm9mZjsKLQkgIH0KLQk7Ci0KLS8qIE1lbW9yeSBmbGFncy4gIFRoaXMgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHR3byBpbnRlZ2VycywgYmVjYXVzZSB3ZQotICAgc29tZXRpbWVzIHdhbnQgdG8gc2V0IGJpdHMgYW5kIHdlIHNvbWV0aW1lcyB3YW50IHRvIGNsZWFyIHRoZW0uICAqLwotCi1tZW1mbGFnOgotCSAgTU9WRUFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCXwgRklYRUQKLQkgIHsKLQkgICAgJCQub24gPSAwOwotCSAgICAkJC5vZmYgPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgfQotCXwgUFVSRQotCSAgewotCSAgICAkJC5vbiA9IE1FTUZMQUdfUFVSRTsKLQkgICAgJCQub2ZmID0gMDsKLQkgIH0KLQl8IElNUFVSRQotCSAgewotCSAgICAkJC5vbiA9IDA7Ci0JICAgICQkLm9mZiA9IE1FTUZMQUdfUFVSRTsKLQkgIH0KLQl8IFBSRUxPQUQKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX1BSRUxPQUQ7Ci0JICAgICQkLm9mZiA9IDA7Ci0JICB9Ci0JfCBMT0FET05DQUxMCi0JICB7Ci0JICAgICQkLm9uID0gMDsKLQkgICAgJCQub2ZmID0gTUVNRkxBR19QUkVMT0FEOwotCSAgfQotCXwgRElTQ0FSREFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCTsKLQotLyogQSBmaWxlIG5hbWUuICAqLwotCi1maWxlX25hbWU6Ci0JICBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IFNUUklORwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotLyogQSBzdHlsZSBleHByZXNzaW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBzdGF0aWMgdmFyaWFibGUgU1RZTEUuICBXZSBkbwotICAgaXQgdGhpcyB3YXkgYmVjYXVzZSByYyBhcHBlYXJzIHRvIHBlcm1pdCBhIHN0eWxlIHRvIGJlIHNldCB0bwotICAgc29tZXRoaW5nIGxpa2UKLSAgICAgICBXU19HUk9VUCB8IE5PVCBXU19UQUJTVE9QCi0gICB0byBtZWFuIHRoYXQgYSBkZWZhdWx0IG9mIFdTX1RBQlNUT1Agc2hvdWxkIGJlIHJlbW92ZWQuICBBbnl0aGluZwotICAgd2hpY2ggd2FudHMgdG8gYWNjZXB0IGEgc3R5bGUgbXVzdCBmaXJzdCBzZXQgU1RZTEUgdG8gdGhlIGRlZmF1bHQKLSAgIHZhbHVlLiAgVGhlIHN0eWxlZXhwciBub250ZXJtaW5hbCB3aWxsIGNoYW5nZSBTVFlMRSBhcyBzcGVjaWZpZWQgYnkKLSAgIHRoZSB1c2VyLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGhlcmUsCi0gICBqdXN0IG51bWJlcnMgc2VwYXJhdGVkIGJ5ICd8Jy4gICovCi0KLXN0eWxlZXhwcjoKLQkgIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlIHw9ICQxOwotCSAgfQotCXwgTk9UIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlICY9fiAkMjsKLQkgIH0KLQl8IHN0eWxlZXhwciAnfCcgcGFyZW5udW1iZXIKLQkgIHsKLQkgICAgc3R5bGUgfD0gJDM7Ci0JICB9Ci0JfCBzdHlsZWV4cHIgJ3wnIE5PVCBwYXJlbm51bWJlcgotCSAgewotCSAgICBzdHlsZSAmPX4gJDQ7Ci0JICB9Ci0JOwotCi1wYXJlbm51bWJlcjoKLQkgIE5VTUJFUgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQl8ICcoJyBudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCTsKLQotLyogQW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIGEgbGVhZGluZyBjb21tYS4gICovCi0KLW9wdGNudW1leHByOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSAwOwotCSAgfQotCXwgY251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEuICAqLwotCi1jbnVtZXhwcjoKLQkgICcsJyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHBvc3NpYmx5IG5lZ2F0ZWQgbnVtZXJpYyBleHByZXNzaW9uLiAgKi8KLQotbnVtZXhwcjoKLQkgIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEEgcG9zc2libHkgbmVnYXRlZCBleHByZXNzaW9uIHdpdGggYSBzaXplLiAgKi8KLQotc2l6ZWRudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCAnLScgc2l6ZWRudW1leHByICVwcmVjIE5FRwotCSAgewotCSAgICAkJC52YWwgPSAtICQyLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMi5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAqICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAvICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAlICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCArICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAtICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAmICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnXicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCBeICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnfCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCB8ICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEgd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5Ci0gICBuZWdhdGlvbi4gICovCi0KLWNwb3NudW1leHByOgotCSAgJywnIHBvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgKi8KLQotcG9zbnVtZXhwcjoKLQkgIHNpemVkcG9zbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgV2Ugc2VwYXJhdGUgdW5hcnkKLSAgIG5lZ2F0aW9uIHRvIGF2b2lkIHBhcnNpbmcgY29uZmxpY3RzIHdoZW4gdHdvIG51bWVyaWMgZXhwcmVzc2lvbnMKLSAgIGFwcGVhciBjb25zZWN1dGl2ZWx5LiAgKi8KLQotc2l6ZWRwb3NudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyonIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy8nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyUnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJysnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy0nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyYnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ14nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgXiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ3wnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgfCAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JOwotCi0lJQotCi0vKiBTZXQgdGhlIGxhbmd1YWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLXZvaWQKLXJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5nKQotICAgICBpbnQgbGFuZzsKLXsKLSAgbGFuZ3VhZ2UgPSBsYW5nOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmRjb2ZmLmMgYi9iaW51dGlscy9yZGNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlZTZlNi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDg4OSArMCwwIEBACi0vKiBzdGFicy5jIC0tIFBhcnNlIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggcGFyc2VzIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0aGlzIEJGRCBpbnRlcm5hbCBmaWxlLiAgV2UgbmVlZCBpdCBmb3IKLSAgIHRoZSBOX0JUTUFTSywgZXRjLiwgdmFsdWVzLiAgKi8KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoZXNlIG1hY3JvcyBleHRyYWN0IHRoZSByaWdodCBtYXNrIGFuZCBzaGlmdHMgZm9yIHRoaXMgQkZELiAgVGhleQotICAgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCBBQkZELiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBtYWNyb3MgbGlrZSBJU0ZDTiBhbmQgREVDUkVGLCBmcm9tIGNvZmYvaW50ZXJuYWwuaCwgd2lsbCB3b3JrCi0gICB3aXRob3V0IG1vZGlmaWNhdGlvbi4gICovCi0jZGVmaW5lIE5fQlRNQVNLIChjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0bWFzaykKLSNkZWZpbmUJTl9CVFNIRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0KQotI2RlZmluZQlOX1RNQVNLICAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzaykKLSNkZWZpbmUJTl9UU0hJRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdHNoaWZ0KQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlIHN5bWJvbHMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQKLSAgIGxvY2F0aW9uIHdpdGhpbiB0aGUgc3ltYm9scy4gICovCi0KLXN0cnVjdCBjb2ZmX3N5bWJvbHMKLXsKLSAgLyogVGhlIHN5bWJvbHMuICAqLwotICBhc3ltYm9sICoqc3ltczsKLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgLyogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHN5bWJvbC4gICovCi0gIGxvbmcgc3ltbm87Ci0gIC8qIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzeW1ib2wgaW4gdGhlIENPRkYgc3ltYm9sIHRhYmxlICh3aGVyZQotICAgICBlYWNoIGF1eGVudCBjb3VudHMgYXMgYSBzeW1ib2wpLiAgKi8KLSAgbG9uZyBjb2ZmX3N5bW5vOwotfTsKLQotLyogVGhlIGxhcmdlc3QgYmFzaWMgdHlwZSB3ZSBhcmUgcHJlcGFyZWQgdG8gaGFuZGxlLiAgKi8KLQotI2RlZmluZSBUX01BWCAoVF9MTkdEQkwpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBzbG90cy4gICovCi0KLXN0cnVjdCBjb2ZmX3Nsb3RzCi17Ci0gIC8qIE5leHQgc2V0IG9mIHNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKm5leHQ7Ci0gIC8qIFNsb3RzLiAgKi8KLSNkZWZpbmUgQ09GRl9TTE9UUyAoMTYpCi0gIGRlYnVnX3R5cGUgc2xvdHNbQ09GRl9TTE9UU107Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBzeW1ib2wgaW5kaWNlcyB0byB0eXBlcy4gICovCi0KLXN0cnVjdCBjb2ZmX3R5cGVzCi17Ci0gIC8qIFNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKnNsb3RzOwotICAvKiBCYXNpYyB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgYmFzaWNbVF9NQVggKyAxXTsKLX07Ci0KLXN0YXRpYyBkZWJ1Z190eXBlICpjb2ZmX2dldF9zbG90IFBBUkFNUyAoKHN0cnVjdCBjb2ZmX3R5cGVzICosIGludCkpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl90eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGxvbmcsIGludCwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgYm9vbGVhbiwgUFRSKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX2Jhc2VfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBsb25nLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9lbnVtX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9jb2ZmX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwgYXN5bWJvbCAqLCBsb25nLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgUFRSLCBkZWJ1Z190eXBlLCBib29sZWFuKSk7Ci0MCi0vKiBSZXR1cm4gdGhlIHNsb3QgZm9yIGEgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLWNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBpbmR4KQotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGludCBpbmR4OwotewotICBzdHJ1Y3QgY29mZl9zbG90cyAqKnBwczsKLQotICBwcHMgPSAmdHlwZXMtPnNsb3RzOwotCi0gIHdoaWxlIChpbmR4ID49IENPRkZfU0xPVFMpCi0gICAgewotICAgICAgaWYgKCpwcHMgPT0gTlVMTCkKLQl7Ci0JICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0JICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0JfQotICAgICAgcHBzID0gJigqcHBzKS0+bmV4dDsKLSAgICAgIGluZHggLT0gQ09GRl9TTE9UUzsKLSAgICB9Ci0KLSAgaWYgKCpwcHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0gICAgICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0gICAgfQotCi0gIHJldHVybiAoKnBwcyktPnNsb3RzICsgaW5keDsKLX0KLQotLyogUGFyc2UgYSBDT0ZGIHR5cGUgY29kZSBpbiBOVFlQRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwgdXNlYXV4LAotCQkgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIGJvb2xlYW4gdXNlYXV4OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgZGVidWdfdHlwZSB0eXBlOwotCi0gIGlmICgobnR5cGUgJiB+Tl9CVE1BU0spICE9IDApCi0gICAgewotICAgICAgaW50IG5ld3R5cGU7Ci0KLSAgICAgIG5ld3R5cGUgPSBERUNSRUYgKG50eXBlKTsKLQotICAgICAgaWYgKElTUFRSIChudHlwZSkpCi0JewotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG5ld3R5cGUsCi0JCQkJICBwYXV4ZW50LCB1c2VhdXgsIGRoYW5kbGUpOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0ZDTiAobnR5cGUpKQotCXsKLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBuZXd0eXBlLAotCQkJCSAgcGF1eGVudCwgdXNlYXV4LCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHR5cGUsIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkJCSAgIGZhbHNlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0FSWSAobnR5cGUpKQotCXsKLQkgIGludCBuOwotCi0JICBpZiAocGF1eGVudCA9PSBOVUxMKQotCSAgICBuID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIHNob3J0ICpkaW07Ci0JICAgICAgaW50IGk7Ci0KLQkgICAgICAvKiBGSVhNRTogSWYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9PSAwLCBnZGIgc2V0cwotICAgICAgICAgICAgICAgICB0aGUgY19uYXV4IGZpZWxkIG9mIHRoZSBzeW1lbnQgdG8gMC4gICovCi0KLQkgICAgICAvKiBNb3ZlIHRoZSBkaW1lbnNpb25zIGRvd24sIHNvIHRoYXQgdGhlIG5leHQgYXJyYXkKLSAgICAgICAgICAgICAgICAgcGlja3MgdXAgdGhlIG5leHQgb25lLiAgKi8KLQkgICAgICBkaW0gPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuOwotCSAgICAgIG4gPSBkaW1bMF07Ci0JICAgICAgZm9yIChpID0gMDsgKmRpbSAhPSAwICYmIGkgPCBESU1OVU0gLSAxOyBpKyssIGRpbSsrKQotCQkqZGltID0gKihkaW0gKyAxKTsKLQkgICAgICAqZGltID0gMDsKLQkgICAgfQotCi0JICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgY29mZl9zeW1ubywgbmV3dHlwZSwKLQkJCQkgIHBhdXhlbnQsIGZhbHNlLCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIHR5cGUsCi0JCQkJCXBhcnNlX2NvZmZfYmFzZV90eXBlIChhYmZkLCBzeW1ib2xzLAotCQkJCQkJCSAgICAgIHR5cGVzLAotCQkJCQkJCSAgICAgIGNvZmZfc3ltbm8sCi0JCQkJCQkJICAgICAgVF9JTlQsCi0JCQkJCQkJICAgICAgTlVMTCwgZGhhbmRsZSksCi0JCQkJCTAsIG4gLSAxLCBmYWxzZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHBhcnNlX2NvZmZfdHlwZTogQmFkIHR5cGUgY29kZSAweCV4XG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBudHlwZSk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLQotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gIGlmIChwYXV4ZW50ICE9IE5VTEwgJiYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA+IDApCi0gICAgewotICAgICAgZGVidWdfdHlwZSAqc2xvdDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyB0eXBlLiAgRklYTUU6IGdkYiBjaGVja3MKLQkgdGhhdCB0aGUgY2xhc3MgaXMgbm90IENfU1RSVEFHLCBub3IgQ19VTlRBRywgbm9yIENfRU5UQUcuICAqLwotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sKTsKLSAgICAgIGlmICgqc2xvdCAhPSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuICpzbG90OwotICAgICAgZWxzZQotCXJldHVybiBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHNsb3QsIChjb25zdCBjaGFyICopIE5VTEwpOwotICAgIH0KLQotICAvKiBJZiB0aGUgYXV4IGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3Igc29tZXRoaW5nLCB1c2VhdXggd2lsbAotICAgICBoYXZlIGJlZW4gc2V0IHRvIGZhbHNlLCBpbmRpY2F0aW5nIHRoYXQgcGFyc2VfY29mZl9iYXNlX3R5cGUKLSAgICAgc2hvdWxkIG5vdCB1c2UgaXQuICBXZSBuZWVkIHRvIGRvIGl0IHRoaXMgd2F5LCByYXRoZXIgdGhhbiBzaW1wbHkKLSAgICAgcGFzc2luZyBwYXV4ZW50IGFzIE5VTEwsIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIGhhbmRsZQotICAgICBtdWx0aXBsZSBhcnJheSBkaW1lbnNpb25zIHdoaWxlIHN0aWxsIGRpc2NhcmRpbmcgcGF1eGVudCBhZnRlcgotICAgICBoYXZpbmcgaGFuZGxlZCBhbGwgb2YgdGhlbS4gICovCi0gIGlmICghIHVzZWF1eCkKLSAgICBwYXV4ZW50ID0gTlVMTDsKLQotICByZXR1cm4gcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwKLQkJCSAgICAgICBwYXV4ZW50LCBkaGFuZGxlKTsKLX0KLQotLyogUGFyc2UgYSBiYXNpYyBDT0ZGIHR5cGUgaW4gTlRZUEUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwKLQkJICAgICAgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBkZWJ1Z190eXBlIHJldDsKLSAgYm9vbGVhbiBzZXRfYmFzaWM7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGRlYnVnX3R5cGUgKnNsb3Q7Ci0KLSAgaWYgKG50eXBlID49IDAKLSAgICAgICYmIG50eXBlIDw9IFRfTUFYCi0gICAgICAmJiB0eXBlcy0+YmFzaWNbbnR5cGVdICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gdHlwZXMtPmJhc2ljW250eXBlXTsKLQotICBzZXRfYmFzaWMgPSB0cnVlOwotICBuYW1lID0gTlVMTDsKLQotICBzd2l0Y2ggKG50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0ID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTlVMTDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9DSEFSOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NIT1JUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9JTlQ6Ci0gICAgICAvKiBGSVhNRTogUGVyaGFwcyB0aGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9MT05HOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0ZMT0FUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0xOR0RCTDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTIpOwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VQ0hBUjoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1VTSE9SVDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VSU5UOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VTE9ORzoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdHJ1ZSwgMCwKLQkJCQkgICAgICAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfVU5JT046Ci0gICAgICBpZiAocGF1eGVudCA9PSBOVUxMKQotCXJldCA9IGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGZhbHNlLCAwLCAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRU5VTToKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIChjb25zdCBjaGFyICoqKSBOVUxMLAotCQkJCSAgICAoYmZkX3NpZ25lZF92bWEgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKTsKLQotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBjb2ZmX3N5bW5vKTsKLSAgICAgICpzbG90ID0gcmV0OwotCi0gICAgICBzZXRfYmFzaWMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHJldCA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgcmV0KTsKLQotICBpZiAoc2V0X2Jhc2ljCi0gICAgICAmJiBudHlwZSA+PSAwCi0gICAgICAmJiBudHlwZSA8PSBUX01BWCkKLSAgICB0eXBlcy0+YmFzaWNbbnR5cGVdID0gcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFBhcnNlIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBsb25nIHN5bWVuZDsKLSAgaW50IGFsbG9jOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICBpbnQgY291bnQ7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBzeW1lbmQgPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCi0gIGFsbG9jID0gMTA7Ci0gIGZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKLSAgY291bnQgPSAwOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZQotCSAmJiBzeW1ib2xzLT5jb2ZmX3N5bW5vIDwgc3ltZW5kCi0JICYmIHN5bWJvbHMtPnN5bW5vIDwgc3ltYm9scy0+c3ltY291bnQpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgbG9uZyB0aGlzX2NvZmZfc3ltbm87Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBzdWJhdXg7Ci0gICAgICBiZmRfdm1hIGJpdHBvcyA9IDAsIGJpdHNpemUgPSAwOwotCi0gICAgICBzeW0gPSBzeW1ib2xzLT5zeW1zW3N5bWJvbHMtPnN5bW5vXTsKLQotICAgICAgaWYgKCEgYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltLCAmc3ltZW50KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfc3ltZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotCi0gICAgICB0aGlzX2NvZmZfc3ltbm8gPSBzeW1ib2xzLT5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMtPnN5bW5vOwotICAgICAgc3ltYm9scy0+Y29mZl9zeW1ubyArPSAxICsgc3ltZW50Lm5fbnVtYXV4OwotCi0gICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JcHN1YmF1eCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltLCAwLCAmYXV4ZW50KSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9hdXhlbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICBwc3ViYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfTU9TOgotCWNhc2UgQ19NT1U6Ci0JICBiaXRwb3MgPSA4ICogYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJRUxEOgotCSAgYml0cG9zID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRU9TOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGRvbmUpCi0JewotCSAgZGVidWdfdHlwZSBmdHlwZTsKLQkgIGRlYnVnX2ZpZWxkIGY7Ci0KLQkgIGZ0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgIHN5bWVudC5uX3R5cGUsIHBzdWJhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgZiA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGZ0eXBlLAotCQkJCWJpdHBvcywgYml0c2l6ZSwgREVCVUdfVklTSUJJTElUWV9QVUJMSUMpOwotCSAgaWYgKGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgaWYgKGNvdW50ICsgMSA+PSBhbGxvYykKLQkgICAgewotCSAgICAgIGFsbG9jICs9IDEwOwotCSAgICAgIGZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJCXhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgfQotCi0JICBmaWVsZHNbY291bnRdID0gZjsKLQkgICsrY291bnQ7Ci0JfQotICAgIH0KLQotICBmaWVsZHNbY291bnRdID0gREVCVUdfRklFTERfTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgbnR5cGUgPT0gVF9TVFJVQ1QsCi0JCQkJIHBhdXhlbnQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJCSBmaWVsZHMpOwotfQotCi0vKiBQYXJzZSBhbiBlbnVtIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlcyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBsb25nIHN5bWVuZDsKLSAgaW50IGFsbG9jOwotICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gIGJmZF9zaWduZWRfdm1hICp2YWxzOwotICBpbnQgY291bnQ7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBzeW1lbmQgPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCi0gIGFsbG9jID0gMTA7Ci0gIG5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0gIHZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKnZhbHMpOwotICBjb3VudCA9IDA7Ci0KLSAgZG9uZSA9IGZhbHNlOwotICB3aGlsZSAoISBkb25lCi0JICYmIHN5bWJvbHMtPmNvZmZfc3ltbm8gPCBzeW1lbmQKLQkgJiYgc3ltYm9scy0+c3ltbm8gPCBzeW1ib2xzLT5zeW1jb3VudCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLQotICAgICAgc3ltID0gc3ltYm9scy0+c3ltc1tzeW1ib2xzLT5zeW1ub107Ci0KLSAgICAgIGlmICghIGJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bSwgJnN5bWVudCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLQotICAgICAgKytzeW1ib2xzLT5zeW1ubzsKLSAgICAgIHN5bWJvbHMtPmNvZmZfc3ltbm8gKz0gMSArIHN5bWVudC5uX251bWF1eDsKLQotICAgICAgc3dpdGNoIChzeW1lbnQubl9zY2xhc3MpCi0JewotCWNhc2UgQ19NT0U6Ci0JICBpZiAoY291bnQgKyAxID49IGFsbG9jKQotCSAgICB7Ci0JICAgICAgYWxsb2MgKz0gMTA7Ci0JICAgICAgbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCSAgICAgICB4cmVhbGxvYyAobmFtZXMsIGFsbG9jICogc2l6ZW9mICpuYW1lcykpOwotCSAgICAgIHZhbHMgPSAoKGJmZF9zaWduZWRfdm1hICopCi0JCSAgICAgIHhyZWFsbG9jICh2YWxzLCBhbGxvYyAqIHNpemVvZiAqdmFscykpOwotCSAgICB9Ci0KLQkgIG5hbWVzW2NvdW50XSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0JICB2YWxzW2NvdW50XSA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgKytjb3VudDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX0VPUzoKLQkgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBuYW1lc1tjb3VudF0gPSBOVUxMOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgbmFtZXMsIHZhbHMpOwotfQotCi0vKiBIYW5kbGUgYSBzaW5nbGUgQ09GRiBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfY29mZl9zeW1ib2wgKGFiZmQsIHR5cGVzLCBzeW0sIGNvZmZfc3ltbm8sIHBzeW1lbnQsIGRoYW5kbGUsIHR5cGUsCi0JCSAgIHdpdGhpbl9mdW5jdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBsb25nIGNvZmZfc3ltbm87Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnBzeW1lbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJvb2xlYW4gd2l0aGluX2Z1bmN0aW9uOwotewotICBzd2l0Y2ggKHBzeW1lbnQtPm5fc2NsYXNzKQotICAgIHsKLSAgICBjYXNlIENfTlVMTDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0FVVE86Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgREVCVUdfTE9DQUwsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19FWFQ6Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgREVCVUdfR0xPQkFMLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfU1RBVDoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICAod2l0aGluX2Z1bmN0aW9uCi0JCQkJICAgID8gREVCVUdfTE9DQUxfU1RBVElDCi0JCQkJICAgIDogREVCVUdfU1RBVElDKSwKLQkJCQkgICBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfUkVHOgotICAgICAgLyogRklYTUU6IFdlIG1heSBuZWVkIHRvIGNvbnZlcnQgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgREVCVUdfUkVHSVNURVIsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19MQUJFTDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0FSRzoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgIERFQlVHX1BBUk1fU1RBQ0ssIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgICAgLyogRklYTUU6IFdlIG1heSBuZWVkIHRvIGNvbnZlcnQgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAotCQkJCSAgICBERUJVR19QQVJNX1JFRywgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1RQREVGOgotICAgICAgdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSk7Ci0gICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfU1RSVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICBjYXNlIENfRU5UQUc6Ci0gICAgICB7Ci0JZGVidWdfdHlwZSAqc2xvdDsKLQotCXR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSk7Ci0JaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogU3RvcmUgdGhlIG5hbWVkIHR5cGUgaW50byB0aGUgc2xvdCwgc28gdGhhdCByZWZlcmVuY2VzIGdldAotICAgICAgICAgICB0aGUgbmFtZS4gICovCi0Jc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBjb2ZmX3N5bW5vKTsKLQkqc2xvdCA9IHR5cGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7CQkJCSAgIAotfQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIHJvdXRpbmUuICBJdCBsb29rcyB0aHJvdWdoIGFsbCB0aGUgc3ltYm9scyBhbmQKLSAgIGhhbmRsZXMgdGhlbS4gICovCi0KLWJvb2xlYW4KLXBhcnNlX2NvZmYgKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgc3RydWN0IGNvZmZfc3ltYm9scyBzeW1ib2xzOwotICBzdHJ1Y3QgY29mZl90eXBlcyB0eXBlczsKLSAgaW50IGk7Ci0gIGxvbmcgbmV4dF9jX2ZpbGU7Ci0gIGNvbnN0IGNoYXIgKmZubmFtZTsKLSAgaW50IGZuY2xhc3M7Ci0gIGludCBmbnR5cGU7Ci0gIGJmZF92bWEgZm5lbmQ7Ci0gIGFsZW50ICpsaW5lbm9zOwotICBib29sZWFuIHdpdGhpbl9mdW5jdGlvbjsKLSAgbG9uZyB0aGlzX2NvZmZfc3ltbm87Ci0KLSAgc3ltYm9scy5zeW1zID0gc3ltczsKLSAgc3ltYm9scy5zeW1jb3VudCA9IHN5bWNvdW50OwotICBzeW1ib2xzLnN5bW5vID0gMDsKLSAgc3ltYm9scy5jb2ZmX3N5bW5vID0gMDsKLQotICB0eXBlcy5zbG90cyA9IE5VTEw7Ci0gIGZvciAoaSA9IDA7IGkgPD0gVF9NQVg7IGkrKykKLSAgICB0eXBlcy5iYXNpY1tpXSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICBuZXh0X2NfZmlsZSA9IC0xOwotICBmbm5hbWUgPSBOVUxMOwotICBmbmNsYXNzID0gMDsKLSAgZm50eXBlID0gMDsKLSAgZm5lbmQgPSAwOwotICBsaW5lbm9zID0gTlVMTDsKLSAgd2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0KLSAgd2hpbGUgKHN5bWJvbHMuc3ltbm8gPCBzeW1jb3VudCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4ZW50OwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICpwYXV4OwotICAgICAgZGVidWdfdHlwZSB0eXBlOwotCi0gICAgICBzeW0gPSBzeW1zW3N5bWJvbHMuc3ltbm9dOwotCi0gICAgICBpZiAoISBiZmRfY29mZl9nZXRfc3ltZW50IChhYmZkLCBzeW0sICZzeW1lbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0KLSAgICAgIHRoaXNfY29mZl9zeW1ubyA9IHN5bWJvbHMuY29mZl9zeW1ubzsKLQotICAgICAgKytzeW1ib2xzLnN5bW5vOwotICAgICAgc3ltYm9scy5jb2ZmX3N5bW5vICs9IDEgKyBzeW1lbnQubl9udW1hdXg7Ci0KLSAgICAgIC8qIFdlIG9ubHkgd29ycnkgYWJvdXQgdGhlIGZpcnN0IGF1eGVudCwgYmVjYXVzZSB0aGF0IGlzIHRoZQotCSBvbmx5IG9uZSB3aGljaCBpcyByZWxldmFudCBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChzeW1lbnQubl9udW1hdXggPT0gMCkKLQlwYXV4ID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfY29mZl9nZXRfYXV4ZW50IChhYmZkLCBzeW0sIDAsICZhdXhlbnQpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X2F1eGVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgcGF1eCA9ICZhdXhlbnQ7Ci0JfQotCi0gICAgICBpZiAodGhpc19jb2ZmX3N5bW5vID09IG5leHRfY19maWxlICYmIHN5bWVudC5uX3NjbGFzcyAhPSBDX0ZJTEUpCi0JewotCSAgLyogVGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBwb2ludHMgdG8gdGhlIGZpcnN0IGV4dGVybmFsCi0gICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoZGhhbmRsZSwgIipnbG9iYWxzKiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHN5bWVudC5uX3NjbGFzcykKLQl7Ci0JY2FzZSBDX0VGQ046Ci0JY2FzZSBDX0VYVERFRjoKLQljYXNlIENfVUxBQkVMOgotCWNhc2UgQ19VU1RBVElDOgotCWNhc2UgQ19MSU5FOgotCWNhc2UgQ19BTElBUzoKLQljYXNlIENfSElEREVOOgotCSAgLyogSnVzdCBpZ25vcmUgdGhlc2UgY2xhc3Nlcy4gICovCi0JICBicmVhazsKLQotCWNhc2UgQ19GSUxFOgotCSAgbmV4dF9jX2ZpbGUgPSBzeW1lbnQubl92YWx1ZTsKLQkgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoZGhhbmRsZSwgbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX1NUQVQ6Ci0JICAvKiBJZ25vcmUgc3RhdGljIHN5bWJvbHMgd2l0aCBhIHR5cGUgb2YgVF9OVUxMLiAgVGhlc2UKLSAgICAgICAgICAgICByZXByZXNlbnQgc2VjdGlvbiBlbnRyaWVzLiAgKi8KLQkgIGlmIChzeW1lbnQubl90eXBlID09IFRfTlVMTCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgQ19FWFQ6Ci0JICBpZiAoSVNGQ04gKHN5bWVudC5uX3R5cGUpKQotCSAgICB7Ci0JICAgICAgZm5uYW1lID0gbmFtZTsKLQkgICAgICBmbmNsYXNzID0gc3ltZW50Lm5fc2NsYXNzOwotCSAgICAgIGZudHlwZSA9IHN5bWVudC5uX3R5cGU7Ci0JICAgICAgaWYgKHN5bWVudC5uX251bWF1eCA+IDApCi0JCWZuZW5kID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgKyBhdXhlbnQueF9zeW0ueF9taXNjLnhfZnNpemU7Ci0JICAgICAgZWxzZQotCQlmbmVuZCA9IDA7Ci0JICAgICAgbGluZW5vcyA9IEJGRF9TRU5EIChhYmZkLCBfZ2V0X2xpbmVubywgKGFiZmQsIHN5bSkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCAmc3ltYm9scywgJnR5cGVzLCB0aGlzX2NvZmZfc3ltbm8sCi0JCQkJICBzeW1lbnQubl90eXBlLCBwYXV4LCB0cnVlLCBkaGFuZGxlKTsKLQkgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCEgcGFyc2VfY29mZl9zeW1ib2wgKGFiZmQsICZ0eXBlcywgc3ltLCB0aGlzX2NvZmZfc3ltbm8sICZzeW1lbnQsCi0JCQkJICAgZGhhbmRsZSwgdHlwZSwgd2l0aGluX2Z1bmN0aW9uKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRkNOOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5iZiIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoZm5uYW1lID09IE5VTEwpCi0JCXsKLQkJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlbGQ6IC5iZiB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHRoaXNfY29mZl9zeW1ubyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCAmc3ltYm9scywgJnR5cGVzLCB0aGlzX2NvZmZfc3ltbm8sCi0JCQkJICAgICAgREVDUkVGIChmbnR5cGUpLCBwYXV4LCBmYWxzZSwgZGhhbmRsZSk7Ci0JICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGRoYW5kbGUsIGZubmFtZSwgdHlwZSwKLQkJCQkJICAgZm5jbGFzcyA9PSBDX0VYVCwKLQkJCQkJICAgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAobGluZW5vcyAhPSBOVUxMKQotCQl7Ci0JCSAgaW50IGJhc2U7Ci0JCSAgYmZkX3ZtYSBhZGRyOwotCi0JCSAgaWYgKHN5bWVudC5uX251bWF1eCA9PSAwKQotCQkgICAgYmFzZSA9IDA7Ci0JCSAgZWxzZQotCQkgICAgYmFzZSA9IGF1eGVudC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubyAtIDE7Ci0KLQkJICBhZGRyID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKTsKLQotCQkgICsrbGluZW5vczsKLQotCQkgIHdoaWxlIChsaW5lbm9zLT5saW5lX251bWJlciAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfbGluZSAoZGhhbmRsZSwKLQkJCQkJICAgICAgIGxpbmVub3MtPmxpbmVfbnVtYmVyICsgYmFzZSwKLQkJCQkJICAgICAgIGxpbmVub3MtPnUub2Zmc2V0ICsgYWRkcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgICsrbGluZW5vczsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZm5uYW1lID0gTlVMTDsKLQkgICAgICBsaW5lbm9zID0gTlVMTDsKLQkgICAgICBmbmNsYXNzID0gMDsKLQkgICAgICBmbnR5cGUgPSAwOwotCi0JICAgICAgd2l0aGluX2Z1bmN0aW9uID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmVmIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIHdpdGhpbl9mdW5jdGlvbikKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVsZDogdW5leHBlY3RlZCAuZWZcbiIpLAotCQkJICAgcHJvZ3JhbV9uYW1lLCB0aGlzX2NvZmZfc3ltbm8pOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gZm5lbmQpCi0JCWZuZW5kID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICAgICAgaWYgKCEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCBmbmVuZCkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGZuZW5kID0gMDsKLQkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIENfQkxPQ0s6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmJiIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X2Jsb2NrIChkaGFuZGxlLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmViIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX2VuZF9ibG9jayAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgIHN5bWVudC5uX3R5cGUsIHBhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoISBwYXJzZV9jb2ZmX3N5bWJvbCAoYWJmZCwgJnR5cGVzLCBzeW0sIHRoaXNfY29mZl9zeW1ubywgJnN5bWVudCwKLQkJCQkgICBkaGFuZGxlLCB0eXBlLCB3aXRoaW5fZnVuY3Rpb24pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmRkYmcuYyBiL2JpbnV0aWxzL3JkZGJnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MjhjMzcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmRkYmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKiByZGRiZy5jIC0tIFJlYWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYSBnZW5lcmljIGZvcm0uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSByZWFkcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBhIGdlbmVyaWMgZm9ybS4gIFRoaXMKLSAgIGZpbGUga25vd3MgaG93IHRvIGRpZyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIG91dCBvZiBhbiBvYmplY3QKLSAgIGZpbGUuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi1zdGF0aWMgYm9vbGVhbiByZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGxvbmcsIFBUUiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiByZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgUFRSLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIHNhdmVfc3RhYiBQQVJBTVMgKChpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBzdGFiX2NvbnRleHQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV9zYXZlZF9zdGFicyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFJlYWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBCRkQuICBSZXR1cm5zIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcKLSAgIHBvaW50ZXIuICAqLwotCi1QVFIKLXJlYWRfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotewotICBQVFIgZGhhbmRsZTsKLSAgYm9vbGVhbiBmb3VuZDsKLQotICBkaGFuZGxlID0gZGVidWdfaW5pdCAoKTsKLSAgaWYgKGRoYW5kbGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISByZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlLAotCQkJCQkgICAmZm91bmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotICAgIHsKLSAgICAgIGlmICghIHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwKLQkJCQkJICAgICAgJmZvdW5kKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIpCi0gICAgewotICAgICAgaWYgKCEgcmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBkaGFuZGxlLCAmZm91bmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBUcnkgcmVhZGluZyB0aGUgQ09GRiBzeW1ib2xzIGlmIHdlIGRpZG4ndCBmaW5kIGFueSBzdGFicyBpbiBDT0ZGCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgZm91bmQKLSAgICAgICYmIGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgICYmIHN5bWNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBpZiAoISBwYXJzZV9jb2ZmIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBmb3VuZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmICghIGZvdW5kKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHJlY29nbml6ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iKSwKLQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkaGFuZGxlOwotfQotCi0vKiBSZWFkIHN0YWJzIGluIHNlY3Rpb25zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsIHBmb3VuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGJvb2xlYW4gKnBmb3VuZDsKLXsKLSAgc3RhdGljIHN0cnVjdAotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpzdHJzZWNuYW1lOwotICAgIH0gbmFtZXNbXSA9IHsgeyAiLnN0YWIiLCAiLnN0YWJzdHIiIH0gfTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIFBUUiBzaGFuZGxlOwotCi0gICpwZm91bmQgPSBmYWxzZTsKLSAgc2hhbmRsZSA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBuYW1lcyAvIHNpemVvZiBuYW1lc1swXTsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWMsICpzdHJzZWM7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lc1tpXS5zZWNuYW1lKTsKLSAgICAgIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lc1tpXS5zdHJzZWNuYW1lKTsKLSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBzdHJzZWMgIT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHN0YWJzaXplLCBzdHJzaXplOwotCSAgYmZkX2J5dGUgKnN0YWJzLCAqc3RyaW5nczsKLQkgIGJmZF9ieXRlICpzdGFiOwotCSAgYmZkX3NpemVfdHlwZSBzdHJvZmYsIG5leHRfc3Ryb2ZmOwotCi0JICBzdGFic2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYyk7Ci0JICBzdGFicyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzdGFic2l6ZSk7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgc3RhYnMsIDAsIHN0YWJzaXplKSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsCi0JCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZXNbaV0uc2VjbmFtZSwKLQkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgc3Ryc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0cnNlYyk7Ci0JICBzdHJpbmdzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0cnNpemUpOwotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdHJzZWMsIHN0cmluZ3MsIDAsIHN0cnNpemUpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lc1tpXS5zdHJzZWNuYW1lLAotCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2hhbmRsZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2hhbmRsZSA9IHN0YXJ0X3N0YWIgKGRoYW5kbGUsIGFiZmQsIHRydWUsIHN5bXMsIHN5bWNvdW50KTsKLQkgICAgICBpZiAoc2hhbmRsZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgKnBmb3VuZCA9IHRydWU7Ci0KLQkgIHN0cm9mZiA9IDA7Ci0JICBuZXh0X3N0cm9mZiA9IDA7Ci0JICBmb3IgKHN0YWIgPSBzdGFiczsgc3RhYiA8IHN0YWJzICsgc3RhYnNpemU7IHN0YWIgKz0gMTIpCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHN0cng7Ci0JICAgICAgaW50IHR5cGU7Ci0JICAgICAgaW50IG90aGVyOwotCSAgICAgIGludCBkZXNjOwotCSAgICAgIGJmZF92bWEgdmFsdWU7Ci0KLQkgICAgICAvKiBUaGlzIGNvZGUgcHJlc3VtZXMgMzIgYml0IHZhbHVlcy4gICovCi0KLQkgICAgICBzdHJ4ID0gYmZkX2dldF8zMiAoYWJmZCwgc3RhYik7Ci0JICAgICAgdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3RhYiArIDQpOwotCSAgICAgIG90aGVyID0gYmZkX2dldF84IChhYmZkLCBzdGFiICsgNSk7Ci0JICAgICAgZGVzYyA9IGJmZF9nZXRfMTYgKGFiZmQsIHN0YWIgKyA2KTsKLQkgICAgICB2YWx1ZSA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyA4KTsKLQotCSAgICAgIGlmICh0eXBlID09IDApCi0JCXsKLQkJICAvKiBTcGVjaWFsIHR5cGUgMCBzdGFicyBpbmRpY2F0ZSB0aGUgb2Zmc2V0IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgbmV4dCBzdHJpbmcgdGFibGUuICAqLwotCQkgIHN0cm9mZiA9IG5leHRfc3Ryb2ZmOwotCQkgIG5leHRfc3Ryb2ZmICs9IHZhbHVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqZiwgKnM7Ci0KLQkJICBmID0gTlVMTDsKLQkJICBzID0gKGNoYXIgKikgc3RyaW5ncyArIHN0cm9mZiArIHN0cng7Ci0JCSAgd2hpbGUgKHNbc3RybGVuIChzKSAtIDFdID09ICdcXCcKLQkJCSAmJiBzdGFiICsgMTIgPCBzdGFicyArIHN0YWJzaXplKQotCQkgICAgewotCQkgICAgICBjaGFyICpwOwotCi0JCSAgICAgIHN0YWIgKz0gMTI7Ci0JCSAgICAgIHAgPSBzICsgc3RybGVuIChzKSAtIDE7Ci0JCSAgICAgICpwID0gJ1wwJzsKLQkJICAgICAgcyA9IGNvbmNhdCAocywKLQkJCQkgICgoY2hhciAqKSBzdHJpbmdzCi0JCQkJICAgKyBzdHJvZmYKLQkJCQkgICArIGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIpKSwKLQkJCQkgIChjb25zdCBjaGFyICopIE5VTEwpOwotCi0JCSAgICAgIC8qIFdlIGhhdmUgdG8gcmVzdG9yZSB0aGUgYmFja3NsYXNoLCBiZWNhdXNlLCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgaXMgaGFzaGluZyBzdGFicyBzdHJpbmdzLCB3ZSBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgdGhlIHNhbWUgc3RyaW5nIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQkJICAgICAgKnAgPSAnXFwnOwotCi0JCSAgICAgIGlmIChmICE9IE5VTEwpCi0JCQlmcmVlIChmKTsKLQkJICAgICAgZiA9IHM7Ci0JCSAgICB9Ci0KLQkJICBzYXZlX3N0YWIgKHR5cGUsIGRlc2MsIHZhbHVlLCBzKTsKLQotCQkgIGlmICghIHBhcnNlX3N0YWIgKGRoYW5kbGUsIHNoYW5kbGUsIHR5cGUsIGRlc2MsIHZhbHVlLCBzKSkKLQkJICAgIHsKLQkJICAgICAgc3RhYl9jb250ZXh0ICgpOwotCQkgICAgICBmcmVlX3NhdmVkX3N0YWJzICgpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBEb24ndCBmcmVlIGYsIHNpbmNlIEkgdGhpbmsgdGhlIHN0YWJzIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgIGV4cGVjdHMgc3RyaW5ncyB0byBoYW5nIGFyb3VuZC4gIFRoaXMgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICBzdHJhaWdodGVuZWQgb3V0LiAgRklYTUUuICAqLwotCQl9Ci0JICAgIH0KLQotCSAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQkgIGZyZWUgKHN0YWJzKTsKLQotCSAgLyogRG9uJ3QgZnJlZSBzdHJpbmdzLCBzaW5jZSBJIHRoaW5rIHRoZSBzdGFicyBjb2RlIGV4cGVjdHMKLSAgICAgICAgICAgICB0aGUgc3RyaW5ncyB0byBoYW5nIGFyb3VuZC4gIFRoaXMgc2hvdWxkIGJlIHN0cmFpZ2h0ZW5lZAotICAgICAgICAgICAgIG91dC4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIGlmIChzaGFuZGxlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgZmluaXNoX3N0YWIgKGRoYW5kbGUsIHNoYW5kbGUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgc3RhYnMgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsIHBmb3VuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGJvb2xlYW4gKnBmb3VuZDsKLXsKLSAgUFRSIHNoYW5kbGU7Ci0gIGFzeW1ib2wgKipwcywgKipzeW1lbmQ7Ci0KLSAgc2hhbmRsZSA9IE5VTEw7Ci0gIHN5bWVuZCA9IHN5bXMgKyBzeW1jb3VudDsKLSAgZm9yIChwcyA9IHN5bXM7IHBzIDwgc3ltZW5kOyBwcysrKQotICAgIHsKLSAgICAgIHN5bWJvbF9pbmZvIGk7Ci0KLSAgICAgIGJmZF9nZXRfc3ltYm9sX2luZm8gKGFiZmQsICpwcywgJmkpOwotCi0gICAgICBpZiAoaS50eXBlID09ICctJykKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCSAgY2hhciAqZjsKLQotCSAgaWYgKHNoYW5kbGUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNoYW5kbGUgPSBzdGFydF9zdGFiIChkaGFuZGxlLCBhYmZkLCBmYWxzZSwgc3ltcywgc3ltY291bnQpOwotCSAgICAgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAqcGZvdW5kID0gdHJ1ZTsKLQotCSAgcyA9IGkubmFtZTsKLQkgIGYgPSBOVUxMOwotCSAgd2hpbGUgKHNbc3RybGVuIChzKSAtIDFdID09ICdcXCcKLQkJICYmIHBzICsgMSA8IHN5bWVuZCkKLQkgICAgewotCSAgICAgIGNoYXIgKnNjLCAqbjsKLQotCSAgICAgICsrcHM7Ci0JICAgICAgc2MgPSB4c3RyZHVwIChzKTsKLQkgICAgICBzY1tzdHJsZW4gKHNjKSAtIDFdID0gJ1wwJzsKLQkgICAgICBuID0gY29uY2F0IChzYywgYmZkX2FzeW1ib2xfbmFtZSAoKnBzKSwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICAgICAgZnJlZSAoc2MpOwotCSAgICAgIGlmIChmICE9IE5VTEwpCi0JCWZyZWUgKGYpOwotCSAgICAgIGYgPSBuOwotCSAgICAgIHMgPSBuOwotCSAgICB9Ci0KLQkgIHNhdmVfc3RhYiAoaS5zdGFiX3R5cGUsIGkuc3RhYl9kZXNjLCBpLnZhbHVlLCBzKTsKLQotCSAgaWYgKCEgcGFyc2Vfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSwgaS5zdGFiX3R5cGUsIGkuc3RhYl9kZXNjLAotCQkJICAgIGkudmFsdWUsIHMpKQotCSAgICB7Ci0JICAgICAgc3RhYl9jb250ZXh0ICgpOwotCSAgICAgIGZyZWVfc2F2ZWRfc3RhYnMgKCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIERvbid0IGZyZWUgZiwgc2luY2UgSSB0aGluayB0aGUgc3RhYnMgY29kZSBleHBlY3RzCi0JICAgICBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUgc3RyYWlnaHRlbmVkIG91dC4KLQkgICAgIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIGZyZWVfc2F2ZWRfc3RhYnMgKCk7Ci0KLSAgaWYgKHNoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBmaW5pc2hfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWFkX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsIHBmb3VuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBhc2VjdGlvbiAqZHNlYzsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLSAgLyogVGhlIEJGRCBiYWNrZW5kIHB1dHMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEgc2VjdGlvbgotICAgICBuYW1lZCAuZGVidWcuICAqLwotCi0gIGRzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOwotICBpZiAoZHNlYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkc2VjKTsKLSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc2l6ZSk7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZHNlYywgY29udGVudHMsIDAsIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwYXJzZV9pZWVlIChkaGFuZGxlLCBhYmZkLCBjb250ZW50cywgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGNvbnRlbnRzKTsKLQotICAqcGZvdW5kID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlY29yZCBzdGFicyBzdHJpbmdzLCBzbyB0aGF0IHdlIGNhbiBnaXZlIHNvbWUgY29udGV4dCBmb3IgZXJyb3JzLiAgKi8KLQotI2RlZmluZSBTQVZFX1NUQUJTX0NPVU5UICgxNikKLQotc3RydWN0IHNhdmVkX3N0YWIKLXsKLSAgaW50IHR5cGU7Ci0gIGludCBkZXNjOwotICBiZmRfdm1hIHZhbHVlOwotICBjaGFyICpzdHJpbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNhdmVkX3N0YWIgc2F2ZWRfc3RhYnNbU0FWRV9TVEFCU19DT1VOVF07Ci1zdGF0aWMgaW50IHNhdmVkX3N0YWJzX2luZGV4OwotCi0vKiBTYXZlIGEgc3RhYnMgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXNhdmVfc3RhYiAodHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBkZXNjOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nICE9IE5VTEwpCi0gICAgZnJlZSAoc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnN0cmluZyk7Ci0gIHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS50eXBlID0gdHlwZTsKLSAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLmRlc2MgPSBkZXNjOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0udmFsdWUgPSB2YWx1ZTsKLSAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnN0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7Ci0gIHNhdmVkX3N0YWJzX2luZGV4ID0gKHNhdmVkX3N0YWJzX2luZGV4ICsgMSkgJSBTQVZFX1NUQUJTX0NPVU5UOwotfQotCi0vKiBQcm92aWRlIGNvbnRleHQgZm9yIGFuIGVycm9yLiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YWJfY29udGV4dCAoKQotewotICBpbnQgaTsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIkxhc3Qgc3RhYnMgZW50cmllcyBiZWZvcmUgZXJyb3I6XG4iKSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIm5fdHlwZSBuX2Rlc2Mgbl92YWx1ZSAgc3RyaW5nXG4iKTsKLQotICBpID0gc2F2ZWRfc3RhYnNfaW5kZXg7Ci0gIGRvCi0gICAgewotICAgICAgc3RydWN0IHNhdmVkX3N0YWIgKnN0YWJwOwotCi0gICAgICBzdGFicCA9IHNhdmVkX3N0YWJzICsgaTsKLSAgICAgIGlmIChzdGFicC0+c3RyaW5nICE9IE5VTEwpCi0JewotCSAgY29uc3QgY2hhciAqczsKLQotCSAgcyA9IGJmZF9nZXRfc3RhYl9uYW1lIChzdGFicC0+dHlwZSk7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIlLTZzIiwgcyk7Ci0JICBlbHNlIGlmIChzdGFicC0+dHlwZSA9PSAwKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJIZHJTeW0iKTsKLQkgIGVsc2UKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiJS02ZCIsIHN0YWJwLT50eXBlKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiAlLTZkICIsIHN0YWJwLT5kZXNjKTsKLQkgIGZwcmludGZfdm1hIChzdGRlcnIsIHN0YWJwLT52YWx1ZSk7Ci0JICBpZiAoc3RhYnAtPnR5cGUgIT0gMCkKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgc3RhYnAtPnN0cmluZyk7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotCX0KLSAgICAgIGkgPSAoaSArIDEpICUgU0FWRV9TVEFCU19DT1VOVDsKLSAgICB9Ci0gIHdoaWxlIChpICE9IHNhdmVkX3N0YWJzX2luZGV4KTsKLX0KLQotLyogRnJlZSB0aGUgc2F2ZWQgc3RhYiBzdHJpbmdzLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfc2F2ZWRfc3RhYnMgKCkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFNBVkVfU1RBQlNfQ09VTlQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2F2ZWRfc3RhYnNbaV0uc3RyaW5nICE9IE5VTEwpCi0JewotCSAgZnJlZSAoc2F2ZWRfc3RhYnNbaV0uc3RyaW5nKTsKLQkgIHNhdmVkX3N0YWJzW2ldLnN0cmluZyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBzYXZlZF9zdGFic19pbmRleCA9IDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZWFkZWxmLmMgYi9iaW51dGlscy9yZWFkZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NGFjNTMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVhZGVsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjk5OCArMCwwIEBACi0vKiByZWFkZWxmLmMgLS0gZGlzcGxheSBjb250ZW50cyBvZiBhbiBFTEYgZm9ybWF0IGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgT3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgotICAgTW9kaWZpY2F0aW9ucyBieSBOaWNrIENsaWZ0b24gPG5pY2tjQGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWYgX19HTlVDX18gPj0gMgotLyogRGVmaW5lIEJGRDY0IGhlcmUsIGV2ZW4gaWYgb3VyIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGlzIDMyIGJpdCBFTEYKLSAgIGFzIHRoaXMgd2lsbCBhbGxvdyB1cyB0byByZWFkIGluIGFuZCBwYXJzZSA2NGJpdCBhbmQgMzJiaXQgRUxGIGZpbGVzLgotICAgT25seSBkbyB0aGlzIGlmIHdlIGJlbGl2ZSB0aGF0IHRoZSBjb21waWxlciBjYW4gc3VwcG9ydCBhIDY0IGJpdAotICAgZGF0YSB0eXBlLiAgRm9yIG5vdyB3ZSBvbmx5IHJlbHkgb24gR0NDIGJlaW5nIGFibGUgdG8gZG8gdGhpcy4gICovCi0jZGVmaW5lIEJGRDY0Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotCi0jaW5jbHVkZSAiZWxmL2NvbW1vbi5oIgotI2luY2x1ZGUgImVsZi9leHRlcm5hbC5oIgotI2luY2x1ZGUgImVsZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKLQotLyogVGhlIGZvbGxvd2luZyBoZWFkZXJzIHVzZSB0aGUgZWxmL3JlbG9jLW1hY3Jvcy5oIGZpbGUgdG8KLSAgIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgcmVsb2NhdGlvbiByZWNvZ25pdGlvbiBmdW5jdGlvbnMKLSAgIHN1Y2ggYXMgZWxmX21pcHNfcmVsb2NfdHlwZSgpICAqLwotCi0jZGVmaW5lIFJFTE9DX01BQ1JPU19HRU5fRlVOQwotCi0jaW5jbHVkZSAiZWxmL2kzODYuaCIKLSNpbmNsdWRlICJlbGYvdjg1MC5oIgotI2luY2x1ZGUgImVsZi9wcGMuaCIKLSNpbmNsdWRlICJlbGYvbWlwcy5oIgotI2luY2x1ZGUgImVsZi9hbHBoYS5oIgotI2luY2x1ZGUgImVsZi9hcm0uaCIKLSNpbmNsdWRlICJlbGYvbTY4ay5oIgotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotI2luY2x1ZGUgImVsZi9tMzJyLmgiCi0jaW5jbHVkZSAiZWxmL2QxMHYuaCIKLSNpbmNsdWRlICJlbGYvZDMwdi5oIgotI2luY2x1ZGUgImVsZi9zaC5oIgotI2luY2x1ZGUgImVsZi9tbjEwMjAwLmgiCi0jaW5jbHVkZSAiZWxmL21uMTAzMDAuaCIKLSNpbmNsdWRlICJlbGYvaHBwYS5oIgotI2luY2x1ZGUgImVsZi9hcmMuaCIKLSNpbmNsdWRlICJlbGYvZnIzMC5oIgotI2luY2x1ZGUgImVsZi9tY29yZS5oIgotI2luY2x1ZGUgImVsZi9pOTYwLmgiCi0jaW5jbHVkZSAiZWxmL3BqLmgiCi0KLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotY2hhciAqICAgICAgICAgIAlwcm9ncmFtX25hbWUgPSAicmVhZGVsZiI7Ci11bnNpZ25lZCBpbnQgICAgCWR5bmFtaWNfYWRkcjsKLWJmZF9zaXplX3R5cGUgIAkJZHluYW1pY19zaXplOwotdW5zaWduZWQgaW50ICAgIAlyZWxhX2FkZHI7Ci11bnNpZ25lZCBpbnQgICAgCXJlbGFfc2l6ZTsKLWNoYXIgKiAgICAgICAgICAJZHluYW1pY19zdHJpbmdzOwotY2hhciAqCQkJc3RyaW5nX3RhYmxlOwotdW5zaWduZWQgbG9uZyAgICAgICAgICAgbnVtX2R5bmFtaWNfc3ltczsKLUVsZl9JbnRlcm5hbF9TeW0gKiAJZHluYW1pY19zeW1ib2xzOwotRWxmX0ludGVybmFsX1N5bWluZm8gKglkeW5hbWljX3N5bWluZm87Ci11bnNpZ25lZCBsb25nICAgCWR5bmFtaWNfc3ltaW5mb19vZmZzZXQ7Ci11bnNpZ25lZCBpbnQJCWR5bmFtaWNfc3ltaW5mb19uZW50OwotY2hhciAgICAgICAgICAgIAlwcm9ncmFtX2ludGVycHJldGVyIFs2NF07Ci1pbnQgICAgICAgICAgICAgCWR5bmFtaWNfaW5mb1tEVF9KTVBSRUwgKyAxXTsKLWludCAgICAgICAgICAgICAJdmVyc2lvbl9pbmZvWzE2XTsKLWludCAgICAgICAgICAgICAJbG9hZGFkZHIgPSAwOwotRWxmX0ludGVybmFsX0VoZHIgICAgICAgZWxmX2hlYWRlcjsKLUVsZl9JbnRlcm5hbF9TaGRyICogICAgIHNlY3Rpb25faGVhZGVyczsKLUVsZl9JbnRlcm5hbF9EeW4gKiAgICAgIGR5bmFtaWNfc2VnbWVudDsKLWludCAJCQlzaG93X25hbWU7Ci1pbnQgCQkJZG9fZHluYW1pYzsKLWludCAJCQlkb19zeW1zOwotaW50IAkJCWRvX3JlbG9jOwotaW50IAkJCWRvX3NlY3Rpb25zOwotaW50IAkJCWRvX3NlZ21lbnRzOwotaW50IAkJCWRvX3VzaW5nX2R5bmFtaWM7Ci1pbnQgCQkJZG9faGVhZGVyOwotaW50IAkJCWRvX2R1bXA7Ci1pbnQgCQkJZG9fdmVyc2lvbjsKLWludAkJCWRvX2hpc3RvZ3JhbTsKLWludAkJCWRvX2RlYnVnZ2luZzsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX2luZm87Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19hYmJyZXZzOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfbGluZXM7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19wdWJuYW1lczsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX2FyYW5nZXM7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19hcmNoOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fbm90ZXM7Ci1pbnQJCQlpc18zMmJpdF9lbGY7Ci0KLS8qIEEgZHluYW1pYyBhcnJheSBvZiBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIHNlY3Rpb25zIHJlcXVpcmUgZHVtcGluZy4gICovCi1jaGFyICoJCQlkdW1wX3NlY3RzID0gTlVMTDsKLXVuc2lnbmVkIGludAkJbnVtX2R1bXBfc2VjdHMgPSAwOwotCi0jZGVmaW5lIEhFWF9EVU1QCSgxIDw8IDApCi0jZGVmaW5lIERJU0FTU19EVU1QCSgxIDw8IDEpCi0jZGVmaW5lIERFQlVHX0RVTVAJKDEgPDwgMikKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGR1bWIgY29tcGlsZXJzLiAgKi8KLXN0YXRpYyBiZmRfdm1hICgqICAgICAgICAgYnl0ZV9nZXQpICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSAgICAgICAgICAgIGJ5dGVfZ2V0X2xpdHRsZV9lbmRpYW4gICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgICAgICAgICAgICBieXRlX2dldF9iaWdfZW5kaWFuICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X21pcHNfZHluYW1pY190eXBlICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3NwYXJjNjRfZHluYW1pY190eXBlICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3BhcmlzY19keW5hbWljX3R5cGUgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X2R5bmFtaWNfdHlwZSAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZHVtcF9yZWxvY2F0aW9ucyAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgRWxmX0ludGVybmFsX1N5bSAqLCB1bnNpZ25lZCBsb25nLCBjaGFyICosIGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfZmlsZV90eXBlICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X21hY2hpbmVfbmFtZSAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9tYWNoaW5lX2ZsYWdzICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCwgdW5zaWduZWQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X21pcHNfc2VnbWVudF90eXBlICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3BhcmlzY19zZWdtZW50X3R5cGUgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3NlZ21lbnRfdHlwZSAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfcGFyaXNjX3NlY3Rpb25fdHlwZV9uYW1lIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfc2VjdGlvbl90eXBlX25hbWUgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9zeW1ib2xfYmluZGluZyAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3N5bWJvbF90eXBlICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICB1c2FnZSAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBwYXJzZV9hcmdzICAgICAgICAgICAgICAgICAgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfZmlsZV9oZWFkZXIgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzICAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBkeW5hbWljX3NlZ21lbnRfbWlwc192YWwgICAgUEFSQU1TICgoRWxmX0ludGVybmFsX0R5biAqKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGR5bmFtaWNfc2VnbWVudF9wYXJpc2NfdmFsICBQQVJBTVMgKChFbGZfSW50ZXJuYWxfRHluICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3N5bWJvbF90YWJsZSAgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgcHJvY2Vzc19maWxlICAgICAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3JlbG9jcyAgICAgICAgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfdmVyc2lvbl9zZWN0aW9ucyAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3Zlcl9mbGFncyAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfc3ltYm9sX2luZGV4X3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF8zMmJpdF9zZWN0aW9uX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0XzY0Yml0X3NlY3Rpb25faGVhZGVycyAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludAkJICBnZXRfMzJiaXRfcHJvZ3JhbV9oZWFkZXJzICAgUEFSQU1TICgoRklMRSAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7Ci1zdGF0aWMgaW50CQkgIGdldF82NGJpdF9wcm9ncmFtX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0X2ZpbGVfaGVhZGVyICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIEVsZl9JbnRlcm5hbF9TeW0gKiBnZXRfMzJiaXRfZWxmX3N5bWJvbHMgICAgICAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqIGdldF82NGJpdF9lbGZfc3ltYm9scyAgICAgICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgKiAgICAgICAgICAgICAgZ2V0X2R5bmFtaWNfZGF0YSAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF8zMmJpdF9keW5hbWljX3NlZ21lbnQgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAgIFBBUkFNUyAoKEZJTEUgKikpOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLXN0YXRpYyBpbnQgCSAgICAgICAgICBkaXNhc3NlbWJsZV9zZWN0aW9uICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBGSUxFICopKTsKLSNlbmRpZgotc3RhdGljIGludCAJICAgICAgICAgIGR1bXBfc2VjdGlvbiAgICAgICAgICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotc3RhdGljIGludCAJICAgICAgICAgIGRpc3BsYXlfZGVidWdfc2VjdGlvbiAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2luZm8gICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2xpbmVzICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2FiYnJldiAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2FyYW5nZXMgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiAgICBwcm9jZXNzX2FiYnJldl9zZWN0aW9uICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICAgICAgcmVhZF9sZWIxMjggICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50ICosIGludCkpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3AgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICByZXNldF9zdGF0ZV9tYWNoaW5lICAgICAgICAgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9UQUdfbmFtZSAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9BVF9uYW1lICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9GT1JNX25hbWUgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGZyZWVfYWJicmV2cyAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGFkZF9hYmJyZXYgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgYWRkX2FiYnJldl9hdHRyICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogICAgcmVhZF9hbmRfZGlzcGxheV9hdHRyICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiAgICBkaXNwbGF5X2Jsb2NrICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQJCSAgcmVxdWVzdF9kdW1wICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZWxmX2NsYXNzICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZGF0YV9lbmNvZGluZyAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfb3NhYmlfbmFtZSAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotc3RhdGljIGludAkJICBndWVzc19pc19yZWxhICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNoYXIgKiAJCSAgZ2V0X25vdGVfdHlwZQkJICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50CQkgIHByb2Nlc3Nfbm90ZQkJICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfTm90ZSAqKSk7Ci1zdGF0aWMgaW50CQkgIHByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50ICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQJCSAgcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnRzIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAJCSAgcHJvY2Vzc19jb3JlZmlsZV9jb250ZW50cwkgUEFSQU1TICgoRklMRSAqKSk7Ci0KLXR5cGVkZWYgaW50IEVsZjMyX1dvcmQ7Ci0KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAgICAxCi0jZGVmaW5lIEZBTFNFICAgIDAKLSNlbmRpZgotI2RlZmluZSBVTktOT1dOIC0xCi0KLSNkZWZpbmUgU0VDVElPTl9OQU1FKFgpIAkoc3RyaW5nX3RhYmxlICsgKFgpLT5zaF9uYW1lKQotCi0jZGVmaW5lIERUX1ZFUlNJT05UQUdJRFgodGFnKQkoRFRfVkVSTkVFRE5VTSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLwotCi0jZGVmaW5lIEJZVEVfR0VUKGZpZWxkKSAJYnl0ZV9nZXQgKGZpZWxkLCBzaXplb2YgKGZpZWxkKSkKLQotLyogSWYgd2UgY2FuIHN1cHBvcnQgYSA2NCBiaXQgZGF0YSB0eXBlIHRoZW4gQkZENjQgc2hvdWxkIGJlIGRlZmluZWQKLSAgIGFuZCBzaXplb2YgKGJmZF92bWEpID09IDguICBJbiB0aGlzIGNhc2Ugd2hlbiB0cmFuc2xhdGluZyBmcm9tIGFuCi0gICBleHRlcm5hbCA4IGJ5dGUgZmllbGQgdG8gYW4gaW50ZXJuYWwgZmllbGQsIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUKLSAgIGludGVybmFsIGZpZWxkIGlzIGFsc28gOCBieXRlcyB3aWRlIGFuZCBzbyB3ZSBjYW4gZXh0YWN0IGFsbCB0aGUgZGF0YS4KLSAgIElmLCBob3dldmVyLCBCRkQ2NCBpcyBub3QgZGVmaW5lZCwgdGhlbiB3ZSBtdXN0IGFzc3VtZSB0aGF0IHRoZQotICAgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgb25seSBoYXMgNCBieXRlIHdpZGUgZmllbGRzIHRoYXQgYXJlIHRoZQotICAgZXF1aXZhbGVudCBvZiB0aGUgOCBieXRlIHdpZGUgZXh0ZXJuYWwgY291bnRlcnBhcnRzLCBhbmQgc28gd2UgbXVzdAotICAgdHJ1bmNhdGUgdGhlIGRhdGEuICAqLwotI2lmZGVmICBCRkQ2NAotI2RlZmluZSBCWVRFX0dFVDgoZmllbGQpIAlieXRlX2dldCAoZmllbGQsIC04KQotI2Vsc2UKLSNkZWZpbmUgQllURV9HRVQ4KGZpZWxkKSAJYnl0ZV9nZXQgKGZpZWxkLCA4KQotI2VuZGlmCi0KLSNkZWZpbmUgTlVNX0VMRU0oYXJyYXkpIAkoc2l6ZW9mIChhcnJheSkgLyBzaXplb2YgKChhcnJheSlbMF0pKQotCi0jZGVmaW5lIEdFVF9EQVRBX0FMTE9DKG9mZnNldCwgc2l6ZSwgdmFyLCB0eXBlLCByZWFzb24pCQkJXAotICBpZiAoZnNlZWsgKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpKQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgJXMgYXQgJXhcbiIpLCByZWFzb24sIG9mZnNldCk7IFwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gIHZhciA9ICh0eXBlKSBtYWxsb2MgKHNpemUpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgaWYgKHZhciA9PSBOVUxMKQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgJWQgYnl0ZXMgZm9yICVzXG4iKSwgc2l6ZSwgcmVhc29uKTsgXAotICAgICAgcmV0dXJuIDA7CQkJCQkJCQlcCi0gICAgfSAJCQkJCQkJCQlcCi0gCQkJCQkJCQkJXAotICBpZiAoZnJlYWQgKHZhciwgc2l6ZSwgMSwgZmlsZSkgIT0gMSkgCQkJCQlcCi0gICAgeyAJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgaW4gJWQgYnl0ZXMgb2YgJXNcbiIpLCBzaXplLCByZWFzb24pOyAJXAotICAgICAgZnJlZSAodmFyKTsgCQkJCQkJCVwKLSAgICAgIHZhciA9IE5VTEw7CQkJCQkJCVwKLSAgICAgIHJldHVybiAwOyAJCQkJCQkJXAotICAgIH0KLQotCi0jZGVmaW5lIEdFVF9EQVRBKG9mZnNldCwgdmFyLCByZWFzb24pIAkJCQkJXAotICBpZiAoZnNlZWsgKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpKQkJCQkJXAotICAgIHsgCQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvICV4IGZvciAlc1xuIiksIG9mZnNldCwgcmVhc29uKTsJXAotICAgICAgcmV0dXJuIDA7CQkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgZWxzZSBpZiAoZnJlYWQgKCYgdmFyLCBzaXplb2YgKHZhciksIDEsIGZpbGUpICE9IDEpCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgZGF0YSBhdCAleCBmb3IgJXNcbiIpLCBvZmZzZXQsIHJlYXNvbik7CVwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0KLQotI2RlZmluZSBHRVRfRUxGX1NZTUJPTFMoZmlsZSwgb2Zmc2V0LCBzaXplKQkJCVwKLSAgKGlzXzMyYml0X2VsZiA/IGdldF8zMmJpdF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBzaXplKQlcCi0gICA6IGdldF82NGJpdF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBzaXplKSkKLQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdGF0aWMgdm9pZAotZXJyb3IgKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBFcnJvcjogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXdhcm4gKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBXYXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuOwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkCi1lcnJvciAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICBjaGFyICogbWVzc2FnZTsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IEVycm9yOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBtZXNzYWdlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotd2FybiAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICBjaGFyICogbWVzc2FnZTsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IFdhcm5pbmc6ICIpLCBwcm9ncmFtX25hbWUpOwotICB2YV9zdGFydCAoYXJncyk7Ci0gIG1lc3NhZ2UgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotc3RhdGljIGJmZF92bWEKLWJ5dGVfZ2V0X2xpdHRsZV9lbmRpYW4gKGZpZWxkLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICogZmllbGQ7Ci0gICAgIGludCAgICAgICAgICAgICBzaXplOwotewotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiAqIGZpZWxkOwotCi0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuICAoKHVuc2lnbmVkIGludCkgKGZpZWxkIFswXSkpCi0JfCAgICAoKCh1bnNpZ25lZCBpbnQpIChmaWVsZCBbMV0pKSA8PCA4KTsKLQotICAgIGNhc2UgODoKLSAgICAgIC8qIFdlIHdhbnQgdG8gZXh0cmFjdCBkYXRhIGZyb20gYW4gOCBieXRlIHdpZGUgZmllbGQgYW5kCi0JIHBsYWNlIGl0IGludG8gYSA0IGJ5dGUgd2lkZSBmaWVsZC4gIFNpbmNlIHRoaXMgaXMgYSBsaXR0bGUKLQkgZW5kaWFuIHNvdXJjZSB3ZSBjYW4ganV0cyB1c2UgdGhlIDQgYnl0ZSBleHRyYWN0aW9uIGNvZGUuICAqLwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gICgodW5zaWduZWQgbG9uZykgKGZpZWxkIFswXSkpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzFdKSkgPDwgOCkKLQl8ICAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMl0pKSA8PCAxNikKLQl8ICAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbM10pKSA8PCAyNCk7Ci0KLSNpZmRlZiBCRkQ2NAotICAgIGNhc2UgLTg6Ci0gICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBnZW5lcmF0ZWQgYnkgdGhlIEJZVEVfR0VUOCBtYWNyby4KLQkgSXQgbWVhbnMgdGhhdCB3ZSBhcmUgbG9hZGluZyBhbiA4IGJ5dGUgdmFsdWUgZnJvbSBhIGZpZWxkCi0JIGluIGFuIGV4dGVybmFsIHN0cnVjdHVyZSBpbnRvIGFuIDggYnl0ZSB2YWx1ZSBpbiBhIGZpZWxkCi0JIGluIGFuIGludGVybmFsIHN0cmN1dHVyZS4gICovCi0gICAgICByZXR1cm4gICgoYmZkX3ZtYSkgKGZpZWxkIFswXSkpCi0JfCAgICAoKChiZmRfdm1hKSAoZmllbGQgWzFdKSkgPDwgOCkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbMl0pKSA8PCAxNikKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbM10pKSA8PCAyNCkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbNF0pKSA8PCAzMikKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbNV0pKSA8PCA0MCkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbNl0pKSA8PCA0OCkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbN10pKSA8PCA1Nik7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgKF8oIlVuaGFuZGxlZCBkYXRhIGxlbmd0aDogJWRcbiIpLCBzaXplKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotc3RhdGljIGJmZF92bWEKLWJ5dGVfZ2V0X2JpZ19lbmRpYW4gKGZpZWxkLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICogZmllbGQ7Ci0gICAgIGludCAgICAgICAgICAgICBzaXplOwotewotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiAqIGZpZWxkOwotCi0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuICgodW5zaWduZWQgaW50KSAoZmllbGQgWzFdKSkgfCAoKChpbnQpIChmaWVsZCBbMF0pKSA8PCA4KTsKLQotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiAoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbM10pKQotCXwgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzJdKSkgPDwgOCkKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsxXSkpIDw8IDE2KQotCXwgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzBdKSkgPDwgMjQpOwotCi0gICAgY2FzZSA4OgotICAgICAgLyogQWx0aG91Z2ggd2UgYXJlIGV4dHJhY2luZyBkYXRhIGZyb20gYW4gOCBieXRlIHdpZGUgZmllbGQsIHdlCi0JIGFyZSByZXR1cm5pbmcgb25seSA0IGJ5dGVzIG9mIGRhdGEuICAqLwotICAgICAgcmV0dXJuICgodW5zaWduZWQgbG9uZykgKGZpZWxkIFs3XSkpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbNl0pKSA8PCA4KQotCXwgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzVdKSkgPDwgMTYpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbNF0pKSA8PCAyNCk7Ci0KLSNpZmRlZiBCRkQ2NAotICAgIGNhc2UgLTg6Ci0gICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBnZW5lcmF0ZWQgYnkgdGhlIEJZVEVfR0VUOCBtYWNyby4KLQkgSXQgbWVhbnMgdGhhdCB3ZSBhcmUgbG9hZGluZyBhbiA4IGJ5dGUgdmFsdWUgZnJvbSBhIGZpZWxkCi0JIGluIGFuIGV4dGVybmFsIHN0cnVjdHVyZSBpbnRvIGFuIDggYnl0ZSB2YWx1ZSBpbiBhIGZpZWxkCi0JIGluIGFuIGludGVybmFsIHN0cmN1dHVyZS4gICovCi0gICAgICByZXR1cm4gKChiZmRfdm1hKSAoZmllbGQgWzddKSkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs2XSkpIDw8IDgpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbNV0pKSA8PCAxNikKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs0XSkpIDw8IDI0KQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzNdKSkgPDwgMzIpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbMl0pKSA8PCA0MCkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFsxXSkpIDw8IDQ4KQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzBdKSkgPDwgNTYpOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgKF8oIlVuaGFuZGxlZCBkYXRhIGxlbmd0aDogJWRcbiIpLCBzaXplKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotCi0vKiBHdWVzcyB0aGUgcmVsb2NhdGlvbiBzaXplZCBiYXNlZCBvbiB0aGUgc2l6ZWQgY29tbW9ubHkgdXNlZCBieSB0aGUgc3BlY2lmaWMgbWFjaGluZS4gICovCi1zdGF0aWMgaW50Ci1ndWVzc19pc19yZWxhIChlX21hY2hpbmUpCi0gICAgIHVuc2lnbmVkIGxvbmcgZV9tYWNoaW5lOwotewotICBzd2l0Y2ggKGVfbWFjaGluZSkKLSAgICB7Ci0gICAgICAvKiBUYXJnZXRzIHRoYXQgdXNlIFJFTCByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBFTV9BUk06Ci0gICAgY2FzZSBFTV8zODY6Ci0gICAgY2FzZSBFTV80ODY6Ci0gICAgY2FzZSBFTV85NjA6Ci0gICAgY2FzZSBFTV9DWUdOVVNfTTMyUjoKLSAgICBjYXNlIEVNX0NZR05VU19EMTBWOgotICAgIGNhc2UgRU1fTUlQUzoKLSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAvKiBUYXJnZXRzIHRoYXQgdXNlIFJFTEEgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgRU1fNjhLOgotICAgIGNhc2UgRU1fU1BBUkMzMlBMVVM6Ci0gICAgY2FzZSBFTV9TUEFSQ1Y5OgotICAgIGNhc2UgRU1fU1BBUkM6Ci0gICAgY2FzZSBFTV9QUEM6Ci0gICAgY2FzZSBFTV9DWUdOVVNfVjg1MDoKLSAgICBjYXNlIEVNX0NZR05VU19EMzBWOgotICAgIGNhc2UgRU1fQ1lHTlVTX01OMTAyMDA6Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDMwMDoKLSAgICBjYXNlIEVNX0NZR05VU19GUjMwOgotICAgIGNhc2UgRU1fU0g6Ci0gICAgY2FzZSBFTV9BTFBIQToKLSAgICBjYXNlIEVNX01DT1JFOgotICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgd2FybiAoXygiRG9uJ3Qga25vdyBhYm91dCByZWxvY2F0aW9ucyBvbiB0aGlzIG1hY2hpbmUgYXJjaGl0ZWN0dXJlXG4iKSk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotCi0vKiBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgcmVsb2NhdGlvbiBkYXRhIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiAgKi8KLXN0YXRpYyBpbnQKLWR1bXBfcmVsb2NhdGlvbnMgKGZpbGUsIHJlbF9vZmZzZXQsIHJlbF9zaXplLCBzeW10YWIsIG5zeW1zLCBzdHJ0YWIsIGlzX3JlbGEpCi0gICAgIEZJTEUgKiAgICAgICAgICAgICBmaWxlOwotICAgICB1bnNpZ25lZCBsb25nICAgICAgcmVsX29mZnNldDsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgIHJlbF9zaXplOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogc3ltdGFiOwotICAgICB1bnNpZ25lZCBsb25nICAgICAgbnN5bXM7Ci0gICAgIGNoYXIgKiAgICAgICAgICAgICBzdHJ0YWI7Ci0gICAgIGludCAgICAgICAgICAgICAgICBpc19yZWxhOwotewotICB1bnNpZ25lZCBpbnQgICAgICAgIGk7Ci0gIEVsZl9JbnRlcm5hbF9SZWwgKiAgcmVsczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiByZWxhczsKLQotCi0gIGlmIChpc19yZWxhID09IFVOS05PV04pCi0gICAgaXNfcmVsYSA9IGd1ZXNzX2lzX3JlbGEgKGVsZl9oZWFkZXIuZV9tYWNoaW5lKTsKLQotICBpZiAoaXNfcmVsYSkKLSAgICB7Ci0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIEVsZjMyX0V4dGVybmFsX1JlbGEgKiBlcmVsYXM7Ci0KLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbGFzLAotCQkJICBFbGYzMl9FeHRlcm5hbF9SZWxhICosICJyZWxvY3MiKTsKLQotCSAgcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgIHJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopCi0JICAgIG1hbGxvYyAocmVsX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7Ci0KLQkgIGlmIChyZWxhcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IoXygib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgICAgewotCSAgICAgIHJlbGFzW2ldLnJfb2Zmc2V0ID0gQllURV9HRVQgKGVyZWxhc1tpXS5yX29mZnNldCk7Ci0JICAgICAgcmVsYXNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfaW5mbyk7Ci0JICAgICAgcmVsYXNbaV0ucl9hZGRlbmQgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfYWRkZW5kKTsKLQkgICAgfQotCi0JICBmcmVlIChlcmVsYXMpOwotCi0JICByZWxzID0gKEVsZl9JbnRlcm5hbF9SZWwgKikgcmVsYXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEVsZjY0X0V4dGVybmFsX1JlbGEgKiBlcmVsYXM7Ci0KLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbGFzLAotCQkJICBFbGY2NF9FeHRlcm5hbF9SZWxhICosICJyZWxvY3MiKTsKLQotCSAgcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgIHJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopCi0JICAgIG1hbGxvYyAocmVsX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7Ci0KLQkgIGlmIChyZWxhcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IoXygib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgICAgewotCSAgICAgIHJlbGFzW2ldLnJfb2Zmc2V0ID0gQllURV9HRVQ4IChlcmVsYXNbaV0ucl9vZmZzZXQpOwotCSAgICAgIHJlbGFzW2ldLnJfaW5mbyAgID0gQllURV9HRVQ4IChlcmVsYXNbaV0ucl9pbmZvKTsKLQkgICAgICByZWxhc1tpXS5yX2FkZGVuZCA9IEJZVEVfR0VUOCAoZXJlbGFzW2ldLnJfYWRkZW5kKTsKLQkgICAgfQotCi0JICBmcmVlIChlcmVsYXMpOwotCi0JICByZWxzID0gKEVsZl9JbnRlcm5hbF9SZWwgKikgcmVsYXM7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc18zMmJpdF9lbGYpCi0JewotCSAgRWxmMzJfRXh0ZXJuYWxfUmVsICogZXJlbHM7Ci0KLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbHMsCi0JCQkgIEVsZjMyX0V4dGVybmFsX1JlbCAqLCAicmVsb2NzIik7Ci0KLQkgIHJlbF9zaXplID0gcmVsX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLQkgIHJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKQotCSAgICBtYWxsb2MgKHJlbF9zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsKSk7Ci0KLQkgIGlmIChyZWxzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgcmVsc1tpXS5yX29mZnNldCA9IEJZVEVfR0VUIChlcmVsc1tpXS5yX29mZnNldCk7Ci0JICAgICAgcmVsc1tpXS5yX2luZm8gICA9IEJZVEVfR0VUIChlcmVsc1tpXS5yX2luZm8pOwotCSAgICB9Ci0KLQkgIGZyZWUgKGVyZWxzKTsKLQotCSAgcmVsYXMgPSAoRWxmX0ludGVybmFsX1JlbGEgKikgcmVsczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfRXh0ZXJuYWxfUmVsICogZXJlbHM7Ci0KLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbHMsCi0JCQkgIEVsZjY0X0V4dGVybmFsX1JlbCAqLCAicmVsb2NzIik7Ci0KLQkgIHJlbF9zaXplID0gcmVsX3NpemUgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbCk7Ci0KLQkgIHJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKQotCSAgICBtYWxsb2MgKHJlbF9zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsKSk7Ci0KLQkgIGlmIChyZWxzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgcmVsc1tpXS5yX29mZnNldCA9IEJZVEVfR0VUOCAoZXJlbHNbaV0ucl9vZmZzZXQpOwotCSAgICAgIHJlbHNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVDggKGVyZWxzW2ldLnJfaW5mbyk7Ci0JICAgIH0KLQotCSAgZnJlZSAoZXJlbHMpOwotCi0JICByZWxhcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSByZWxzOwotCX0KLSAgICB9Ci0KLSAgaWYgKGlzX3JlbGEpCi0gICAgcHJpbnRmCi0gICAgICAoXygiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lICAgICAgICAgIEFkZGVuZFxuIikpOwotICBlbHNlCi0gICAgcHJpbnRmCi0gICAgICAoXygiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lXG4iKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIHJ0eXBlOwotICAgICAgYmZkX3ZtYSAgICAgIG9mZnNldDsKLSAgICAgIGJmZF92bWEgICAgICBpbmZvOwotICAgICAgYmZkX3ZtYSAgICAgIHN5bXRhYl9pbmRleDsKLSAgICAgIGJmZF92bWEgICAgICB0eXBlOwotCi0gICAgICBpZiAoaXNfcmVsYSkKLQl7Ci0JICBvZmZzZXQgPSByZWxhcyBbaV0ucl9vZmZzZXQ7Ci0JICBpbmZvICAgPSByZWxhcyBbaV0ucl9pbmZvOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvZmZzZXQgPSByZWxzIFtpXS5yX29mZnNldDsKLQkgIGluZm8gICA9IHJlbHMgW2ldLnJfaW5mbzsKLQl9Ci0KLSAgICAgIGlmIChpc18zMmJpdF9lbGYpCi0JewotCSAgdHlwZSAgICAgICAgID0gRUxGMzJfUl9UWVBFIChpbmZvKTsKLQkgIHN5bXRhYl9pbmRleCA9IEVMRjMyX1JfU1lNICAoaW5mbyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlbGZfaGVhZGVyLmVfbWFjaGluZSA9PSBFTV9TUEFSQ1Y5KQotCSAgICB0eXBlICAgICAgID0gRUxGNjRfUl9UWVBFX0lEIChpbmZvKTsKLQkgIGVsc2UKLQkgICAgdHlwZSAgICAgICA9IEVMRjY0X1JfVFlQRSAoaW5mbyk7Ci0JICAvKiBUaGUgI2lmZGVmIEJGRDY0IGJlbG93IGlzIHRvIHByZXZlbnQgYSBjb21waWxlIHRpbWUgd2FybmluZy4KLQkgICAgIFdlIGtub3cgdGhhdCBpZiB3ZSBkbyBub3QgaGF2ZSBhIDY0IGJpdCBkYXRhIHR5cGUgdGhhdCB3ZQotCSAgICAgd2lsbCBuZXZlciBleGVjdXRlIHRoaXMgY29kZSBhbnl3YXkuICAqLwotI2lmZGVmIEJGRDY0Ci0JICBzeW10YWJfaW5kZXggPSBFTEY2NF9SX1NZTSAgKGluZm8pOwotI2VuZGlmCi0JfQotCi0jaWZkZWYgX2JmZF9pbnQ2NF9sb3cKLSAgICAgIHByaW50ZiAoIiAgJTguOGx4ICAlNS41bHggIiwgX2JmZF9pbnQ2NF9sb3cgKG9mZnNldCksIF9iZmRfaW50NjRfbG93IChpbmZvKSk7Ci0jZWxzZQotICAgICAgcHJpbnRmICgiICAlOC44bHggICU1LjVseCAiLCBvZmZzZXQsIGluZm8pOwotI2VuZGlmCi0KLSAgICAgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JewotCWRlZmF1bHQ6Ci0JICBydHlwZSA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX00zMlI6Ci0JICBydHlwZSA9IGVsZl9tMzJyX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNXzM4NjoKLQljYXNlIEVNXzQ4NjoKLQkgIHJ0eXBlID0gZWxmX2kzODZfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fNjhLOgotCSAgcnR5cGUgPSBlbGZfbTY4a19yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV85NjA6Ci0JICBydHlwZSA9IGVsZl9pOTYwX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX09MRF9TUEFSQ1Y5OgotCWNhc2UgRU1fU1BBUkMzMlBMVVM6Ci0JY2FzZSBFTV9TUEFSQ1Y5OgotCWNhc2UgRU1fU1BBUkM6Ci0JICBydHlwZSA9IGVsZl9zcGFyY19yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfVjg1MDoKLQkgIHJ0eXBlID0gdjg1MF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfRDEwVjoKLQkgIHJ0eXBlID0gZWxmX2QxMHZfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0QzMFY6Ci0JICBydHlwZSA9IGVsZl9kMzB2X3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX1NIOgotCSAgcnR5cGUgPSBlbGZfc2hfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX01OMTAzMDA6Ci0JICBydHlwZSA9IGVsZl9tbjEwMzAwX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19NTjEwMjAwOgotCSAgcnR5cGUgPSBlbGZfbW4xMDIwMF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfRlIzMDoKLQkgIHJ0eXBlID0gZWxmX2ZyMzBfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fTUNPUkU6Ci0JICBydHlwZSA9IGVsZl9tY29yZV9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9QUEM6Ci0JICBydHlwZSA9IGVsZl9wcGNfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fTUlQUzoKLQljYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgcnR5cGUgPSBlbGZfbWlwc19yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9BTFBIQToKLQkgIHJ0eXBlID0gZWxmX2FscGhhX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0FSTToKLQkgIHJ0eXBlID0gZWxmX2FybV9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfQVJDOgotCSAgcnR5cGUgPSBlbGZfYXJjX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX1BBUklTQzoKLQkgIHJ0eXBlID0gZWxmX2hwcGFfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fUEo6Ci0JICBydHlwZSA9IGVsZl9wal9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJ0eXBlID09IE5VTEwpCi0jaWZkZWYgX2JmZF9pbnQ2NF9sb3cKLQlwcmludGYgKF8oInVucmVjb2duaXNlZDogJS03bHgiKSwgX2JmZF9pbnQ2NF9sb3cgKHR5cGUpKTsKLSNlbHNlCi0JcHJpbnRmIChfKCJ1bnJlY29nbmlzZWQ6ICUtN2x4IiksIHR5cGUpOwotI2VuZGlmCi0gICAgICBlbHNlCi0JcHJpbnRmICgiJS0yMS4yMXMiLCBydHlwZSk7Ci0KLSAgICAgIGlmIChzeW10YWJfaW5kZXgpCi0JewotCSAgaWYgKHN5bXRhYiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bXRhYl9pbmRleCA+PSBuc3ltcykKLQkJcHJpbnRmICgiIGJhZCBzeW1ib2wgaW5kZXg6ICUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpIHN5bXRhYl9pbmRleCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSAqIHBzeW07Ci0KLQkJICBwc3ltID0gc3ltdGFiICsgc3ltdGFiX2luZGV4OwotCi0JCSAgcHJpbnRmICgiICUwOGx4ICAiLCAodW5zaWduZWQgbG9uZykgcHN5bS0+c3RfdmFsdWUpOwotCi0JCSAgaWYgKHBzeW0tPnN0X25hbWUgPT0gMCkKLQkJICAgIHByaW50ZiAoIiUtMjUuMjVzIiwKLQkJCSAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb25faGVhZGVycyArIHBzeW0tPnN0X3NobmR4KSk7Ci0JCSAgZWxzZSBpZiAoc3RydGFiID09IE5VTEwpCi0JCSAgICBwcmludGYgKF8oIjxzdHJpbmcgdGFibGUgaW5kZXggJTNsZD4iKSwgcHN5bS0+c3RfbmFtZSk7Ci0JCSAgZWxzZQotCQkgICAgcHJpbnRmICgiJS0yNS4yNXMiLCBzdHJ0YWIgKyBwc3ltLT5zdF9uYW1lKTsKLQotCQkgIGlmIChpc19yZWxhKQotCQkgICAgcHJpbnRmICgiICsgJWx4IiwgKHVuc2lnbmVkIGxvbmcpIHJlbGFzIFtpXS5yX2FkZGVuZCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGlzX3JlbGEpCi0JcHJpbnRmICgiJTM0YyVseCIsICcgJywgKHVuc2lnbmVkIGxvbmcpIHJlbGFzW2ldLnJfYWRkZW5kKTsKLQotICAgICAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX1NQQVJDVjkKLQkgICYmICFzdHJjbXAgKHJ0eXBlLCAiUl9TUEFSQ19PTE8xMCIpKQotCXByaW50ZiAoIiArICVseCIsICh1bnNpZ25lZCBsb25nKSBFTEY2NF9SX1RZUEVfREFUQSAoaW5mbykpOwotCi0gICAgICBwdXRjaGFyICgnXG4nKTsKLSAgICB9Ci0KLSAgZnJlZSAocmVsYXMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfbWlwc19keW5hbWljX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIERUX01JUFNfUkxEX1ZFUlNJT046IHJldHVybiAiTUlQU19STERfVkVSU0lPTiI7Ci0gICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6IHJldHVybiAiTUlQU19USU1FX1NUQU1QIjsKLSAgICBjYXNlIERUX01JUFNfSUNIRUNLU1VNOiByZXR1cm4gIk1JUFNfSUNIRUNLU1VNIjsKLSAgICBjYXNlIERUX01JUFNfSVZFUlNJT046IHJldHVybiAiTUlQU19JVkVSU0lPTiI7Ci0gICAgY2FzZSBEVF9NSVBTX0ZMQUdTOiByZXR1cm4gIk1JUFNfRkxBR1MiOwotICAgIGNhc2UgRFRfTUlQU19CQVNFX0FERFJFU1M6IHJldHVybiAiTUlQU19CQVNFX0FERFJFU1MiOwotICAgIGNhc2UgRFRfTUlQU19NU1lNOiByZXR1cm4gIk1JUFNfTVNZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOiByZXR1cm4gIk1JUFNfQ09ORkxJQ1QiOwotICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUOiByZXR1cm4gIk1JUFNfTElCTElTVCI7Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMX0dPVE5POiByZXR1cm4gIk1JUFNfTE9DQUxfR09UTk8iOwotICAgIGNhc2UgRFRfTUlQU19DT05GTElDVE5POiByZXR1cm4gIk1JUFNfQ09ORkxJQ1ROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzogcmV0dXJuICJNSVBTX0xJQkxJU1ROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX1NZTVRBQk5POiByZXR1cm4gIk1JUFNfU1lNVEFCTk8iOwotICAgIGNhc2UgRFRfTUlQU19VTlJFRkVYVE5POiByZXR1cm4gIk1JUFNfVU5SRUZFWFROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0dPVFNZTTogcmV0dXJuICJNSVBTX0dPVFNZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0hJUEFHRU5POiByZXR1cm4gIk1JUFNfSElQQUdFTk8iOwotICAgIGNhc2UgRFRfTUlQU19STERfTUFQOiByZXR1cm4gIk1JUFNfUkxEX01BUCI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTOiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1MiOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU19OTzogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTX05PIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfSU5TVEFOQ0U6IHJldHVybiAiTUlQU19ERUxUQV9JTlNUQU5DRSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFX05POiByZXR1cm4gIk1JUFNfREVMVEFfSU5TVEFOQ0VfTk8iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9SRUxPQzogcmV0dXJuICJNSVBTX0RFTFRBX1JFTE9DIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0NfTk86IHJldHVybiAiTUlQU19ERUxUQV9SRUxPQ19OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTTogcmV0dXJuICJNSVBTX0RFTFRBX1NZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTV9OTzogcmV0dXJuICJNSVBTX0RFTFRBX1NZTV9OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNOiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1NTWU0iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU1NZTV9OTzogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTU1lNX05PIjsKLSAgICBjYXNlIERUX01JUFNfQ1hYX0ZMQUdTOiByZXR1cm4gIk1JUFNfQ1hYX0ZMQUdTIjsKLSAgICBjYXNlIERUX01JUFNfUElYSUVfSU5JVDogcmV0dXJuICJNSVBTX1BJWElFX0lOSVQiOwotICAgIGNhc2UgRFRfTUlQU19TWU1CT0xfTElCOiByZXR1cm4gIk1JUFNfU1lNQk9MX0xJQiI7Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMUEFHRV9HT1RJRFg6IHJldHVybiAiTUlQU19MT0NBTFBBR0VfR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09USURYOiByZXR1cm4gIk1JUFNfTE9DQUxfR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfSElEREVOX0dPVElEWDogcmV0dXJuICJNSVBTX0hJRERFTl9HT1RJRFgiOwotICAgIGNhc2UgRFRfTUlQU19QUk9URUNURURfR09USURYOiByZXR1cm4gIk1JUFNfUFJPVEVDVEVEX0dPVElEWCI7Ci0gICAgY2FzZSBEVF9NSVBTX09QVElPTlM6IHJldHVybiAiTUlQU19PUFRJT05TIjsKLSAgICBjYXNlIERUX01JUFNfSU5URVJGQUNFOiByZXR1cm4gIk1JUFNfSU5URVJGQUNFIjsKLSAgICBjYXNlIERUX01JUFNfRFlOU1RSX0FMSUdOOiByZXR1cm4gIk1JUFNfRFlOU1RSX0FMSUdOIjsKLSAgICBjYXNlIERUX01JUFNfSU5URVJGQUNFX1NJWkU6IHJldHVybiAiTUlQU19JTlRFUkZBQ0VfU0laRSI7Ci0gICAgY2FzZSBEVF9NSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUjogcmV0dXJuICJNSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUiI7Ci0gICAgY2FzZSBEVF9NSVBTX1BFUkZfU1VGRklYOiByZXR1cm4gIk1JUFNfUEVSRl9TVUZGSVgiOwotICAgIGNhc2UgRFRfTUlQU19DT01QQUNUX1NJWkU6IHJldHVybiAiTUlQU19DT01QQUNUX1NJWkUiOwotICAgIGNhc2UgRFRfTUlQU19HUF9WQUxVRTogcmV0dXJuICJNSVBTX0dQX1ZBTFVFIjsKLSAgICBjYXNlIERUX01JUFNfQVVYX0RZTkFNSUM6IHJldHVybiAiTUlQU19BVVhfRFlOQU1JQyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3NwYXJjNjRfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBEVF9TUEFSQ19SRUdJU1RFUjogcmV0dXJuICJTUEFSQ19SRUdJU1RFUiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3BhcmlzY19keW5hbWljX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIERUX0hQX0xPQURfTUFQOglyZXR1cm4gIkhQX0xPQURfTUFQIjsKLSAgICBjYXNlIERUX0hQX0RMRF9GTEFHUzoJcmV0dXJuICJIUF9ETERfRkxBR1MiOwotICAgIGNhc2UgRFRfSFBfRExEX0hPT0s6CXJldHVybiAiSFBfRExEX0hPT0siOwotICAgIGNhc2UgRFRfSFBfVVgxMF9JTklUOglyZXR1cm4gIkhQX1VYMTBfSU5JVCI7Ci0gICAgY2FzZSBEVF9IUF9VWDEwX0lOSVRTWjoJcmV0dXJuICJIUF9VWDEwX0lOSVRTWiI7Ci0gICAgY2FzZSBEVF9IUF9QUkVJTklUOgkJcmV0dXJuICJIUF9QUkVJTklUIjsKLSAgICBjYXNlIERUX0hQX1BSRUlOSVRTWjoJcmV0dXJuICJIUF9QUkVJTklUU1oiOwotICAgIGNhc2UgRFRfSFBfTkVFREVEOgkJcmV0dXJuICJIUF9ORUVERUQiOwotICAgIGNhc2UgRFRfSFBfVElNRV9TVEFNUDoJcmV0dXJuICJIUF9USU1FX1NUQU1QIjsKLSAgICBjYXNlIERUX0hQX0NIRUNLU1VNOglyZXR1cm4gIkhQX0NIRUNLU1VNIjsKLSAgICBjYXNlIERUX0hQX0dTVF9TSVpFOglyZXR1cm4gIkhQX0dTVF9TSVpFIjsKLSAgICBjYXNlIERUX0hQX0dTVF9WRVJTSU9OOglyZXR1cm4gIkhQX0dTVF9WRVJTSU9OIjsKLSAgICBjYXNlIERUX0hQX0dTVF9IQVNIVkFMOglyZXR1cm4gIkhQX0dTVF9IQVNIVkFMIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgRFRfTlVMTDoJcmV0dXJuICJOVUxMIjsKLSAgICBjYXNlIERUX05FRURFRDoJcmV0dXJuICJORUVERUQiOwotICAgIGNhc2UgRFRfUExUUkVMU1o6CXJldHVybiAiUExUUkVMU1oiOwotICAgIGNhc2UgRFRfUExUR09UOglyZXR1cm4gIlBMVEdPVCI7Ci0gICAgY2FzZSBEVF9IQVNIOglyZXR1cm4gIkhBU0giOwotICAgIGNhc2UgRFRfU1RSVEFCOglyZXR1cm4gIlNUUlRBQiI7Ci0gICAgY2FzZSBEVF9TWU1UQUI6CXJldHVybiAiU1lNVEFCIjsKLSAgICBjYXNlIERUX1JFTEE6CXJldHVybiAiUkVMQSI7Ci0gICAgY2FzZSBEVF9SRUxBU1o6CXJldHVybiAiUkVMQVNaIjsKLSAgICBjYXNlIERUX1JFTEFFTlQ6CXJldHVybiAiUkVMQUVOVCI7Ci0gICAgY2FzZSBEVF9TVFJTWjoJcmV0dXJuICJTVFJTWiI7Ci0gICAgY2FzZSBEVF9TWU1FTlQ6CXJldHVybiAiU1lNRU5UIjsKLSAgICBjYXNlIERUX0lOSVQ6CXJldHVybiAiSU5JVCI7Ci0gICAgY2FzZSBEVF9GSU5JOglyZXR1cm4gIkZJTkkiOwotICAgIGNhc2UgRFRfU09OQU1FOglyZXR1cm4gIlNPTkFNRSI7Ci0gICAgY2FzZSBEVF9SUEFUSDoJcmV0dXJuICJSUEFUSCI7Ci0gICAgY2FzZSBEVF9TWU1CT0xJQzoJcmV0dXJuICJTWU1CT0xJQyI7Ci0gICAgY2FzZSBEVF9SRUw6CXJldHVybiAiUkVMIjsKLSAgICBjYXNlIERUX1JFTFNaOglyZXR1cm4gIlJFTFNaIjsKLSAgICBjYXNlIERUX1JFTEVOVDoJcmV0dXJuICJSRUxFTlQiOwotICAgIGNhc2UgRFRfUExUUkVMOglyZXR1cm4gIlBMVFJFTCI7Ci0gICAgY2FzZSBEVF9ERUJVRzoJcmV0dXJuICJERUJVRyI7Ci0gICAgY2FzZSBEVF9URVhUUkVMOglyZXR1cm4gIlRFWFRSRUwiOwotICAgIGNhc2UgRFRfSk1QUkVMOglyZXR1cm4gIkpNUFJFTCI7Ci0gICAgY2FzZSBEVF9CSU5EX05PVzogICByZXR1cm4gIkJJTkRfTk9XIjsKLSAgICBjYXNlIERUX0lOSVRfQVJSQVk6IHJldHVybiAiSU5JVF9BUlJBWSI7Ci0gICAgY2FzZSBEVF9GSU5JX0FSUkFZOiByZXR1cm4gIkZJTklfQVJSQVkiOwotICAgIGNhc2UgRFRfSU5JVF9BUlJBWVNaOiByZXR1cm4gIklOSVRfQVJSQVlTWiI7Ci0gICAgY2FzZSBEVF9GSU5JX0FSUkFZU1o6IHJldHVybiAiRklOSV9BUlJBWVNaIjsKLQotICAgIGNhc2UgRFRfUExUUEFEU1o6CXJldHVybiAiUExUUEFEU1oiOwotICAgIGNhc2UgRFRfTU9WRUVOVDoJcmV0dXJuICJNT1ZFRU5UIjsKLSAgICBjYXNlIERUX01PVkVTWjoJcmV0dXJuICJNT1ZFU1oiOwotICAgIGNhc2UgRFRfRkVBVFVSRV8xOglyZXR1cm4gIkZFQVRVUkVfMSI7Ci0gICAgY2FzZSBEVF9QT1NGTEFHXzE6CXJldHVybiAiUE9TRkxBR18xIjsKLSAgICBjYXNlIERUX1NZTUlOU1o6CXJldHVybiAiU1lNSU5TWiI7Ci0gICAgY2FzZSBEVF9TWU1JTkVOVDoJcmV0dXJuICJTWU1JTkVOVCI7IC8qIGFrYSBWQUxSTkdISSAqLwotCi0gICAgY2FzZSBEVF9BRERSUk5HTE86ICByZXR1cm4gIkFERFJSTkdMTyI7Ci0gICAgY2FzZSBEVF9TWU1JTkZPOglyZXR1cm4gIlNZTUlORk8iOyAvKiBha2EgQUREUlJOR0hJICovCi0KLSAgICBjYXNlIERUX1ZFUlNZTToJcmV0dXJuICJWRVJTWU0iOwotCi0gICAgY2FzZSBEVF9SRUxBQ09VTlQ6CXJldHVybiAiUkVMQUNPVU5UIjsKLSAgICBjYXNlIERUX1JFTENPVU5UOglyZXR1cm4gIlJFTENPVU5UIjsKLSAgICBjYXNlIERUX0ZMQUdTXzE6CXJldHVybiAiRkxBR1NfMSI7Ci0gICAgY2FzZSBEVF9WRVJERUY6CXJldHVybiAiVkVSREVGIjsKLSAgICBjYXNlIERUX1ZFUkRFRk5VTToJcmV0dXJuICJWRVJERUZOVU0iOwotICAgIGNhc2UgRFRfVkVSTkVFRDoJcmV0dXJuICJWRVJORUVEIjsKLSAgICBjYXNlIERUX1ZFUk5FRUROVU06CXJldHVybiAiVkVSTkVFRE5VTSI7Ci0KLSAgICBjYXNlIERUX0FVWElMSUFSWToJcmV0dXJuICJBVVhJTEFSWSI7Ci0gICAgY2FzZSBEVF9VU0VEOglyZXR1cm4gIlVTRUQiOwotICAgIGNhc2UgRFRfRklMVEVSOglyZXR1cm4gIkZJTFRFUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCh0eXBlID49IERUX0xPUFJPQykgJiYgKHR5cGUgPD0gRFRfSElQUk9DKSkKLQl7Ci0JICBjb25zdCBjaGFyICogcmVzdWx0OwotCi0JICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCSAgICB7Ci0JICAgIGNhc2UgRU1fTUlQUzoKLQkgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgICAgICByZXN1bHQgPSBnZXRfbWlwc19keW5hbWljX3R5cGUgKHR5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVNX1NQQVJDVjk6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X3NwYXJjNjRfZHluYW1pY190eXBlICh0eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgXygiUHJvY2Vzc29yIFNwZWNpZmljOiAlbHgiKSwgdHlwZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHR5cGUgPj0gRFRfTE9PUykgJiYgKHR5cGUgPD0gRFRfSElPUykpCi0JewotCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKLQotCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkgICAgewotCSAgICBjYXNlIEVNX1BBUklTQzoKLQkgICAgICByZXN1bHQgPSBnZXRfcGFyaXNjX2R5bmFtaWNfdHlwZSAodHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmVzdWx0ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JICAgIHJldHVybiByZXN1bHQ7Ci0KLQkgIHNwcmludGYgKGJ1ZmYsIF8oIk9wZXJhdGluZyBTeXN0ZW0gc3BlY2lmaWM6ICVseCIpLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlbHgiKSwgdHlwZSk7Ci0KLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2ZpbGVfdHlwZSAoZV90eXBlKQotICAgICB1bnNpZ25lZCBlX3R5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFVF9OT05FOglyZXR1cm4gXygiTk9ORSAoTm9uZSkiKTsKLSAgICBjYXNlIEVUX1JFTDoJcmV0dXJuIF8oIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0VYRUM6ICAgICAgIHJldHVybiBfKCJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIik7Ci0gICAgY2FzZSBFVF9EWU46ICAgICAgICByZXR1cm4gXygiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIik7Ci0gICAgY2FzZSBFVF9DT1JFOiAgICAgICByZXR1cm4gXygiQ09SRSAoQ29yZSBmaWxlKSIpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICgoZV90eXBlID49IEVUX0xPUFJPQykgJiYgKGVfdHlwZSA8PSBFVF9ISVBST0MpKQotCXNwcmludGYgKGJ1ZmYsIF8oIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KSIpLCBlX3R5cGUpOwotICAgICAgZWxzZSBpZiAoKGVfdHlwZSA+PSBFVF9MT09TKSAmJiAoZV90eXBlIDw9IEVUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsIF8oIk9TIFNwZWNpZmljOiAoJXgpIiksIGVfdHlwZSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBlX3R5cGUpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfbWFjaGluZV9uYW1lIChlX21hY2hpbmUpCi0gICAgIHVuc2lnbmVkIGVfbWFjaGluZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoZV9tYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIEVNX05PTkU6ICAgICAgICAJcmV0dXJuIF8oIk5vbmUiKTsKLSAgICBjYXNlIEVNX00zMjogICAgICAgICAJcmV0dXJuICJXRTMyMTAwIjsKLSAgICBjYXNlIEVNX1NQQVJDOiAgICAgICAJcmV0dXJuICJTcGFyYyI7Ci0gICAgY2FzZSBFTV8zODY6ICAgICAgICAgCXJldHVybiAiSW50ZWwgODAzODYiOwotICAgIGNhc2UgRU1fNjhLOiAgICAgICAgIAlyZXR1cm4gIk1DNjgwMDAiOwotICAgIGNhc2UgRU1fODhLOiAgICAgICAgIAlyZXR1cm4gIk1DODgwMDAiOwotICAgIGNhc2UgRU1fNDg2OiAgICAgICAgIAlyZXR1cm4gIkludGVsIDgwNDg2IjsKLSAgICBjYXNlIEVNXzg2MDogICAgICAgICAJcmV0dXJuICJJbnRlbCA4MDg2MCI7Ci0gICAgY2FzZSBFTV9NSVBTOiAgICAgICAgCXJldHVybiAiTUlQUyBSMzAwMCBiaWctZW5kaWFuIjsKLSAgICBjYXNlIEVNX1MzNzA6ICAgICAgICAJcmV0dXJuICJBbWRhaGwiOwotICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6IAlyZXR1cm4gIk1JUFMgUjQwMDAgYmlnLWVuZGlhbiI7Ci0gICAgY2FzZSBFTV9PTERfU1BBUkNWOToJcmV0dXJuICJTcGFyYyB2OSAob2xkKSI7Ci0gICAgY2FzZSBFTV9QQVJJU0M6ICAgICAgCXJldHVybiAiSFBQQSI7Ci0gICAgY2FzZSBFTV9QUENfT0xEOgkJcmV0dXJuICJQb3dlciBQQyAob2xkKSI7Ci0gICAgY2FzZSBFTV9TUEFSQzMyUExVUzogCXJldHVybiAiU3BhcmMgdjgrIiA7Ci0gICAgY2FzZSBFTV85NjA6ICAgICAgICAgCXJldHVybiAiSW50ZWwgOTA4NjAiOwotICAgIGNhc2UgRU1fUFBDOiAgICAgICAgIAlyZXR1cm4gIlBvd2VyUEMiOwotICAgIGNhc2UgRU1fVjgwMDogICAgICAgICAJcmV0dXJuICJORUMgVjgwMCI7Ci0gICAgY2FzZSBFTV9GUjIwOiAgICAgICAgIAlyZXR1cm4gIkZ1aml0c3UgRlIyMCI7Ci0gICAgY2FzZSBFTV9SSDMyOiAgICAgICAgIAlyZXR1cm4gIlRSVyBSSDMyIjsKLSAgICBjYXNlIEVNX01DT1JFOgkgICAgICAgIHJldHVybiAiTUNPUkUiOwotICAgIGNhc2UgRU1fQVJNOgkgCXJldHVybiAiQVJNIjsKLSAgICBjYXNlIEVNX09MRF9BTFBIQToJIAlyZXR1cm4gIkRpZ2l0YWwgQWxwaGEgKG9sZCkiOwotICAgIGNhc2UgRU1fU0g6CQkgCXJldHVybiAiSGl0YWNoaSBTSCI7Ci0gICAgY2FzZSBFTV9TUEFSQ1Y5OiAgICAgCXJldHVybiAiU3BhcmMgdjkiOwotICAgIGNhc2UgRU1fVFJJQ09SRTogICAgCXJldHVybiAiU2llbWVucyBUcmljb3JlIjsKLSAgICBjYXNlIEVNX0FSQzoJCXJldHVybiAiQXJnb25hdXQgUklTQyBDb3JlIjsKLSAgICBjYXNlIEVNX0g4XzMwMDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDAiOwotICAgIGNhc2UgRU1fSDhfMzAwSDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDBIIjsKLSAgICBjYXNlIEVNX0g4UzoJCXJldHVybiAiSGl0YWNoaSBIOFMiOwotICAgIGNhc2UgRU1fSDhfNTAwOgkJcmV0dXJuICJIaXRhY2hpIEg4LzUwMCI7Ci0gICAgY2FzZSBFTV9JQV82NDoJCXJldHVybiAiSW50ZWwgTWVyY2VkIjsKLSAgICBjYXNlIEVNX01JUFNfWDoJCXJldHVybiAiU3RhbmZvcmQgTUlQUy1YIjsKLSAgICBjYXNlIEVNX0NPTERGSVJFOgkJcmV0dXJuICJNb3Rvcm9sYSBDb2xkZmlyZSI7Ci0gICAgY2FzZSBFTV82OEhDMTI6CQlyZXR1cm4gIk1vdG9yb2xhIE02OEhDMTIiOwotICAgIGNhc2UgRU1fQUxQSEE6ICAgICAgIAlyZXR1cm4gIkFscGhhIjsKLSAgICBjYXNlIEVNX0NZR05VU19EMTBWOiAgICAgICAgcmV0dXJuICJkMTB2IjsKLSAgICBjYXNlIEVNX0NZR05VU19EMzBWOiAgICAgICAgcmV0dXJuICJkMzB2IjsKLSAgICBjYXNlIEVNX0NZR05VU19BUkM6CQlyZXR1cm4gIkFyYyI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfTTMyUjoJcmV0dXJuICJNaXRzdWJpc2hpIE0zMnIiOwotICAgIGNhc2UgRU1fQ1lHTlVTX1Y4NTA6CXJldHVybiAiTkVDIHY4NTAiOwotICAgIGNhc2UgRU1fQ1lHTlVTX01OMTAzMDA6CXJldHVybiAibW4xMDMwMCI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoJcmV0dXJuICJtbjEwMjAwIjsKLSAgICBjYXNlIEVNX0NZR05VU19GUjMwOglyZXR1cm4gIkZ1aml0c3UgRlIzMCI7Ci0gICAgY2FzZSBFTV9QSjogICAgICAgICAgICAgICAgIHJldHVybiAicGljb0phdmEiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIGVfbWFjaGluZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9tYWNoaW5lX2ZsYWdzIChlX2ZsYWdzLCBlX21hY2hpbmUpCi0gICAgIHVuc2lnbmVkIGVfZmxhZ3M7Ci0gICAgIHVuc2lnbmVkIGVfbWFjaGluZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmIFsxMDI0XTsKLQotICBidWZbMF0gPSAnXDAnOwotICBpZiAoZV9mbGFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVfbWFjaGluZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRU1fNjhLOgotICAgICAgICAgIGlmIChlX2ZsYWdzICYgRUZfQ1BVMzIpCi0gICAgICAgICAgICBzdHJjYXQgKGJ1ZiwgIiwgY3B1MzIiKTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgRU1fUFBDOgotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfRU1CKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgZW1iIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUtbGliIik7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0JICBzd2l0Y2ggKGVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0JICAgIHsKLQkgICAgY2FzZSBFX1Y4NTBFX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTBlIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRV9WODUwRUFfQVJDSDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdjg1MGVhIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRV9WODUwX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTAiKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdW5rbm93biB2ODUwIGFyY2hpdGVjdHVyZSB2YXJpYW50Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTTMyUjoKLQkgIGlmICgoZV9mbGFncyAmIEVGX00zMlJfQVJDSCkgPT0gRV9NMzJSX0FSQ0gpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtMzJyIik7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9NSVBTOgotCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICBpZiAoZV9mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbm9yZW9yZGVyIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19QSUMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBwaWMiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBjcGljIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19BQkkyKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgYWJpMiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMSIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzIpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMyIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzQpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzNCIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX1NQQVJDVjk6Ci0JICBpZiAoZV9mbGFncyAmIEVGX1NQQVJDXzMyUExVUykKLQkgICAgc3RyY2F0IChidWYsICIsIHY4KyIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB1bHRyYXNwYXJjSSIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB1bHRyYXNwYXJjSUlJIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfU1BBUkNfSEFMX1IxKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgaGFscjEiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBsZWRhdGEiKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfU1BBUkNWOV9NTSkgPT0gRUZfU1BBUkNWOV9UU08pCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB0c28iKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfU1BBUkNWOV9NTSkgPT0gRUZfU1BBUkNWOV9QU08pCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBwc28iKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfU1BBUkNWOV9NTSkgPT0gRUZfU1BBUkNWOV9STU8pCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBybW8iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9QQVJJU0M6Ci0JICBzd2l0Y2ggKGVfZmxhZ3MgJiBFRl9QQVJJU0NfQVJDSCkKLQkgICAgewotCSAgICBjYXNlIEVGQV9QQVJJU0NfMV8wOgotCSAgICAgIHN0cmNweSAoYnVmLCAiLCBQQS1SSVNDIDEuMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVGQV9QQVJJU0NfMV8xOgotCSAgICAgIHN0cmNweSAoYnVmLCAiLCBQQS1SSVNDIDEuMSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVGQV9QQVJJU0NfMl8wOgotCSAgICAgIHN0cmNweSAoYnVmLCAiLCBQQS1SSVNDIDIuMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BBUklTQ19UUkFQTklMKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgdHJhcG5pbCIpOwotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QQVJJU0NfRVhUKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgZXh0Iik7Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BBUklTQ19MU0IpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBsc2IiKTsKLQkgIGlmIChlX2ZsYWdzICYgRUZfUEFSSVNDX1dJREUpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB3aWRlIik7Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BBUklTQ19OT19LQUJQKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbm8ga2FicCIpOwotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QQVJJU0NfTEFaWVNXQVApCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBsYXp5c3dhcCIpOwotCi0JY2FzZSBFTV9QSjoKLQkgIGlmICgoZV9mbGFncyAmIEVGX1BJQ09KQVZBX05FV0NBTExTKSA9PSBFRl9QSUNPSkFWQV9ORVdDQUxMUykKLQkgICAgc3RyY2F0IChidWYsICIsIG5ldyBjYWxsaW5nIGNvbnZlbnRpb24iKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfUElDT0pBVkFfR05VQ0FMTFMpID09IEVGX1BJQ09KQVZBX0dOVUNBTExTKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgZ251IGNhbGxpbmcgY29udmVudGlvbiIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfbWlwc19zZWdtZW50X3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX01JUFNfUkVHSU5GTzoKLSAgICAgIHJldHVybiAiUkVHSU5GTyI7Ci0gICAgY2FzZSBQVF9NSVBTX1JUUFJPQzoKLSAgICAgIHJldHVybiAiUlRQUk9DIjsKLSAgICBjYXNlIFBUX01JUFNfT1BUSU9OUzoKLSAgICAgIHJldHVybiAiT1BUSU9OUyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3BhcmlzY19zZWdtZW50X3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX0hQX1RMUzoJCXJldHVybiAiSFBfVExTIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfTk9ORToJcmV0dXJuICJIUF9DT1JFX05PTkUiOwotICAgIGNhc2UgUFRfSFBfQ09SRV9WRVJTSU9OOglyZXR1cm4gIkhQX0NPUkVfVkVSU0lPTiI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX0tFUk5FTDoJcmV0dXJuICJIUF9DT1JFX0tFUk5FTCI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX0NPTU06CXJldHVybiAiSFBfQ09SRV9DT01NIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfUFJPQzoJcmV0dXJuICJIUF9DT1JFX1BST0MiOwotICAgIGNhc2UgUFRfSFBfQ09SRV9MT0FEQUJMRToJcmV0dXJuICJIUF9DT1JFX0xPQURBQkxFIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfU1RBQ0s6CXJldHVybiAiSFBfQ09SRV9TVEFDSyI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX1NITToJcmV0dXJuICJIUF9DT1JFX1NITSI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX01NRjoJcmV0dXJuICJIUF9DT1JFX01NRiI7Ci0gICAgY2FzZSBQVF9IUF9QQVJBTExFTDoJcmV0dXJuICJIUF9QQVJBTExFTCI7Ci0gICAgY2FzZSBQVF9IUF9GQVNUQklORDoJcmV0dXJuICJIUF9GQVNUQklORCI7Ci0gICAgY2FzZSBQVF9QQVJJU0NfQVJDSEVYVDoJcmV0dXJuICJQQVJJU0NfQVJDSEVYVCI7Ci0gICAgY2FzZSBQVF9QQVJJU0NfVU5XSU5EOglyZXR1cm4gIlBBUklTQ19VTldJTkQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9zZWdtZW50X3R5cGUgKHBfdHlwZSkKLSAgICAgdW5zaWduZWQgbG9uZyBwX3R5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHBfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBQVF9OVUxMOiAgICAgICByZXR1cm4gIk5VTEwiOwotICAgIGNhc2UgUFRfTE9BRDogICAgICAgcmV0dXJuICJMT0FEIjsKLSAgICBjYXNlIFBUX0RZTkFNSUM6CXJldHVybiAiRFlOQU1JQyI7Ci0gICAgY2FzZSBQVF9JTlRFUlA6ICAgICByZXR1cm4gIklOVEVSUCI7Ci0gICAgY2FzZSBQVF9OT1RFOiAgICAgICByZXR1cm4gIk5PVEUiOwotICAgIGNhc2UgUFRfU0hMSUI6ICAgICAgcmV0dXJuICJTSExJQiI7Ci0gICAgY2FzZSBQVF9QSERSOiAgICAgICByZXR1cm4gIlBIRFIiOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICgocF90eXBlID49IFBUX0xPUFJPQykgJiYgKHBfdHlwZSA8PSBQVF9ISVBST0MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0KLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9NSVBTOgotCSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgICAgIHJlc3VsdCA9IGdldF9taXBzX3NlZ21lbnRfdHlwZSAocF90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBFTV9QQVJJU0M6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X3BhcmlzY19zZWdtZW50X3R5cGUgKHBfdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmVzdWx0ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JICAgIHJldHVybiByZXN1bHQ7Ci0KLQkgIHNwcmludGYgKGJ1ZmYsICJMT1BST0MrJWx4IiwgcF90eXBlIC0gUFRfTE9QUk9DKTsKLQl9Ci0gICAgICBlbHNlIGlmICgocF90eXBlID49IFBUX0xPT1MpICYmIChwX3R5cGUgPD0gUFRfSElPUykpCi0JewotCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKLQotCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkgICAgewotCSAgICBjYXNlIEVNX1BBUklTQzoKLQkgICAgICByZXN1bHQgPSBnZXRfcGFyaXNjX3NlZ21lbnRfdHlwZSAocF90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgIkxPT1MrJWx4IiwgcF90eXBlIC0gUFRfTE9PUyk7Ci0JfQotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWx4IiksIHBfdHlwZSk7Ci0KLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpCi0gICAgIHVuc2lnbmVkIGludCBzaF90eXBlOwotewotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX01JUFNfTElCTElTVDogICAgICAgcmV0dXJuICJNSVBTX0xJQkxJU1QiOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTTogICAgICAgICAgcmV0dXJuICJNSVBTX01TWU0iOwotICAgIGNhc2UgU0hUX01JUFNfQ09ORkxJQ1Q6ICAgICAgcmV0dXJuICJNSVBTX0NPTkZMSUNUIjsKLSAgICBjYXNlIFNIVF9NSVBTX0dQVEFCOiAgICAgICAgIHJldHVybiAiTUlQU19HUFRBQiI7Ci0gICAgY2FzZSBTSFRfTUlQU19VQ09ERTogICAgICAgICByZXR1cm4gIk1JUFNfVUNPREUiOwotICAgIGNhc2UgU0hUX01JUFNfREVCVUc6ICAgICAgICAgcmV0dXJuICJNSVBTX0RFQlVHIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JFR0lORk86ICAgICAgIHJldHVybiAiTUlQU19SRUdJTkZPIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BBQ0tBR0U6ICAgICAgIHJldHVybiAiTUlQU19QQUNLQUdFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BBQ0tTWU06ICAgICAgIHJldHVybiAiTUlQU19QQUNLU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JFTEQ6ICAgICAgICAgIHJldHVybiAiTUlQU19SRUxEIjsKLSAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOiAgICAgICAgIHJldHVybiAiTUlQU19JRkFDRSI7Ci0gICAgY2FzZSBTSFRfTUlQU19DT05URU5UOiAgICAgICByZXR1cm4gIk1JUFNfQ09OVEVOVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19PUFRJT05TOiAgICAgICByZXR1cm4gIk1JUFNfT1BUSU9OUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19TSERSOiAgICAgICAgICByZXR1cm4gIk1JUFNfU0hEUiI7Ci0gICAgY2FzZSBTSFRfTUlQU19GREVTQzogICAgICAgICByZXR1cm4gIk1JUFNfRkRFU0MiOwotICAgIGNhc2UgU0hUX01JUFNfRVhUU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0VYVFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERU5TRTogICAgICAgICByZXR1cm4gIk1JUFNfREVOU0UiOwotICAgIGNhc2UgU0hUX01JUFNfUERFU0M6ICAgICAgICAgcmV0dXJuICJNSVBTX1BERVNDIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xPQ1NZTTogICAgICAgIHJldHVybiAiTUlQU19MT0NTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfQVVYU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0FVWFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19PUFRTWU06ICAgICAgICByZXR1cm4gIk1JUFNfT1BUU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xPQ1NUUjogICAgICAgIHJldHVybiAiTUlQU19MT0NTVFIiOwotICAgIGNhc2UgU0hUX01JUFNfTElORTogICAgICAgICAgcmV0dXJuICJNSVBTX0xJTkUiOwotICAgIGNhc2UgU0hUX01JUFNfUkZERVNDOiAgICAgICAgcmV0dXJuICJNSVBTX1JGREVTQyI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQVNZTTogICAgICByZXR1cm4gIk1JUFNfREVMVEFTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFJTlNUOiAgICAgcmV0dXJuICJNSVBTX0RFTFRBSU5TVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQUNMQVNTOiAgICByZXR1cm4gIk1JUFNfREVMVEFDTEFTUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19EV0FSRjogICAgICAgICByZXR1cm4gIk1JUFNfRFdBUkYiOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFERUNMOiAgICAgcmV0dXJuICJNSVBTX0RFTFRBREVDTCI7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOiAgICByZXR1cm4gIk1JUFNfU1lNQk9MX0xJQiI7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6ICAgICAgICByZXR1cm4gIk1JUFNfRVZFTlRTIjsKLSAgICBjYXNlIFNIVF9NSVBTX1RSQU5TTEFURTogICAgIHJldHVybiAiTUlQU19UUkFOU0xBVEUiOwotICAgIGNhc2UgU0hUX01JUFNfUElYSUU6ICAgICAgICAgcmV0dXJuICJNSVBTX1BJWElFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1hMQVRFOiAgICAgICAgIHJldHVybiAiTUlQU19YTEFURSI7Ci0gICAgY2FzZSBTSFRfTUlQU19YTEFURV9ERUJVRzogICByZXR1cm4gIk1JUFNfWExBVEVfREVCVUciOwotICAgIGNhc2UgU0hUX01JUFNfV0hJUkw6ICAgICAgICAgcmV0dXJuICJNSVBTX1dISVJMIjsKLSAgICBjYXNlIFNIVF9NSVBTX0VIX1JFR0lPTjogICAgIHJldHVybiAiTUlQU19FSF9SRUdJT04iOwotICAgIGNhc2UgU0hUX01JUFNfWExBVEVfT0xEOiAgICAgcmV0dXJuICJNSVBTX1hMQVRFX09MRCI7Ci0gICAgY2FzZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OOiByZXR1cm4gIk1JUFNfUERSX0VYQ0VQVElPTiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9wYXJpc2Nfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpCi0gICAgIHVuc2lnbmVkIGludCBzaF90eXBlOwotewotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX1BBUklTQ19FWFQ6CXJldHVybiAiUEFSSVNDX0VYVCI7Ci0gICAgY2FzZSBTSFRfUEFSSVNDX1VOV0lORDoJcmV0dXJuICJQQVJJU0NfVU5XSU5EIjsKLSAgICBjYXNlIFNIVF9QQVJJU0NfRE9DOglyZXR1cm4gIlBBUklTQ19ET0MiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpCi0gICAgIHVuc2lnbmVkIGludCBzaF90eXBlOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChzaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9OVUxMOgkJcmV0dXJuICJOVUxMIjsKLSAgICBjYXNlIFNIVF9QUk9HQklUUzoJCXJldHVybiAiUFJPR0JJVFMiOwotICAgIGNhc2UgU0hUX1NZTVRBQjoJCXJldHVybiAiU1lNVEFCIjsKLSAgICBjYXNlIFNIVF9TVFJUQUI6CQlyZXR1cm4gIlNUUlRBQiI7Ci0gICAgY2FzZSBTSFRfUkVMQToJCXJldHVybiAiUkVMQSI7Ci0gICAgY2FzZSBTSFRfSEFTSDoJCXJldHVybiAiSEFTSCI7Ci0gICAgY2FzZSBTSFRfRFlOQU1JQzoJCXJldHVybiAiRFlOQU1JQyI7Ci0gICAgY2FzZSBTSFRfTk9URToJCXJldHVybiAiTk9URSI7Ci0gICAgY2FzZSBTSFRfTk9CSVRTOgkJcmV0dXJuICJOT0JJVFMiOwotICAgIGNhc2UgU0hUX1JFTDoJCXJldHVybiAiUkVMIjsKLSAgICBjYXNlIFNIVF9TSExJQjoJCXJldHVybiAiU0hMSUIiOwotICAgIGNhc2UgU0hUX0RZTlNZTToJCXJldHVybiAiRFlOU1lNIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVyZGVmOglyZXR1cm4gIlZFUkRFRiI7Ci0gICAgY2FzZSBTSFRfR05VX3Zlcm5lZWQ6CXJldHVybiAiVkVSTkVFRCI7Ci0gICAgY2FzZSBTSFRfR05VX3ZlcnN5bToJcmV0dXJuICJWRVJTWU0iOwotICAgIGNhc2UgMHg2ZmZmZmZmMDoJICAgICAgICByZXR1cm4gIlZFUlNZTSI7Ci0gICAgY2FzZSAweDZmZmZmZmZjOgkgICAgICAgIHJldHVybiAiVkVSREVGIjsKLSAgICBjYXNlIDB4N2ZmZmZmZmQ6CQlyZXR1cm4gIkFVWElMSUFSWSI7Ci0gICAgY2FzZSAweDdmZmZmZmZmOgkJcmV0dXJuICJGSUxURVIiOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICgoc2hfdHlwZSA+PSBTSFRfTE9QUk9DKSAmJiAoc2hfdHlwZSA8PSBTSFRfSElQUk9DKSkKLQl7Ci0JICBjb25zdCBjaGFyICogcmVzdWx0OwotCi0JICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCSAgICB7Ci0JICAgIGNhc2UgRU1fTUlQUzoKLQkgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgICAgICByZXN1bHQgPSBnZXRfbWlwc19zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRU1fUEFSSVNDOgotCSAgICAgIHJlc3VsdCA9IGdldF9wYXJpc2Nfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCSAgICByZXR1cm4gcmVzdWx0OwotCi0JICBzcHJpbnRmIChidWZmLCAiU0hUX0xPUFJPQysleCIsIHNoX3R5cGUgLSBTSFRfTE9QUk9DKTsKLQl9Ci0gICAgICBlbHNlIGlmICgoc2hfdHlwZSA+PSBTSFRfTE9PUykgJiYgKHNoX3R5cGUgPD0gU0hUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsICJTSFRfTE9PUysleCIsIHNoX3R5cGUgLSBTSFRfTE9PUyk7Ci0gICAgICBlbHNlIGlmICgoc2hfdHlwZSA+PSBTSFRfTE9VU0VSKSAmJiAoc2hfdHlwZSA8PSBTSFRfSElVU0VSKSkKLQlzcHJpbnRmIChidWZmLCAiU0hUX0xPVVNFUisleCIsIHNoX3R5cGUgLSBTSFRfTE9VU0VSKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIHNoX3R5cGUpOwotCi0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0cnVjdCBvcHRpb24gb3B0aW9ucyBbXSA9Ci17Ci0gIHsiYWxsIiwgICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnYSd9LAotICB7ImZpbGUtaGVhZGVyIiwgICAgICBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJwcm9ncmFtLWhlYWRlcnMiLCAgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsiaGVhZGVycyIsICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnZSd9LAotICB7Imhpc3RvZ3JhbSIsICAgICAgICBub19hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJzZWdtZW50cyIsICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsic2VjdGlvbnMiLCAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InNlY3Rpb24taGVhZGVycyIsICBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzeW1ib2xzIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0gIHsic3ltcyIsICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAncyd9LAotICB7InJlbG9jcyIsICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3InfSwKLSAgeyJub3RlcyIsICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICduJ30sCi0gIHsiZHluYW1pYyIsICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnZCd9LAotICB7ImFyY2gtc3BlY2lmaWMiLCAgICBub19hcmd1bWVudCwgMCwgJ0EnfSwKLSAgeyJ2ZXJzaW9uLWluZm8iLCAgICAgbm9fYXJndW1lbnQsIDAsICdWJ30sCi0gIHsidXNlLWR5bmFtaWMiLCAgICAgIG5vX2FyZ3VtZW50LCAwLCAnRCd9LAotICB7ImhleC1kdW1wIiwgICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3gnfSwKLSAgeyJkZWJ1Zy1kdW1wIiwgICAgICAgb3B0aW9uYWxfYXJndW1lbnQsIDAsICd3J30sCi0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotICB7Imluc3RydWN0aW9uLWR1bXAiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2knfSwKLSNlbmRpZgotCi0gIHsidmVyc2lvbiIsICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7ImhlbHAiLCAgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ0gnfSwKLSAgezAsICAgICAgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKCkKLXsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCJVc2FnZTogcmVhZGVsZiB7b3B0aW9uc30gZWxmLWZpbGUocylcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIE9wdGlvbnMgYXJlOlxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWEgb3IgLS1hbGwgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvOiAtaCAtbCAtUyAtcyAtciAtZCAtViAtQSAtSVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWggb3IgLS1maWxlLWhlYWRlciAgICAgICBEaXNwbGF5IHRoZSBFTEYgZmlsZSBoZWFkZXJcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1sIG9yIC0tcHJvZ3JhbS1oZWFkZXJzIG9yIC0tc2VnbWVudHNcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtUyBvciAtLXNlY3Rpb24taGVhZGVycyBvciAtLXNlY3Rpb25zXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHNlY3Rpb25zJyBoZWFkZXJcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1lIG9yIC0taGVhZGVycyAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVNcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1zIG9yIC0tc3ltcyBvciAtLXN5bWJvbHMgRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtbiBvciAtLW5vdGVzICAgICAgICAgICAgIERpc3BsYXkgdGhlIGNvcmUgbm90ZXMgKGlmIHByZXNlbnQpXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtciBvciAtLXJlbG9jcyAgICAgICAgICAgIERpc3BsYXkgdGhlIHJlbG9jYXRpb25zIChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWQgb3IgLS1keW5hbWljICAgICAgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQgKGlmIHByZXNlbnQpXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtViBvciAtLXZlcnNpb24taW5mbyAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gc2VjdGlvbnMgKGlmIHByZXNlbnQpXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtQSBvciAtLWFyY2gtc3BlY2lmaWMgICAgIERpc3BsYXkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGluZm9ybWF0aW9uIChpZiBhbnkpLlxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLUQgb3IgLS11c2UtZHluYW1pYyAgICAgICBVc2UgdGhlIGR5bmFtaWMgc2VjdGlvbiBpbmZvIHdoZW4gZGlzcGxheWluZyBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAteCA8bnVtYmVyPiBvciAtLWhleC1kdW1wPTxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXAgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC13W2xpYXByXSBvciAtLWRlYnVnLWR1bXBbPWxpbmUsPWluZm8sPWFiYnJldiw9cHVibmFtZXMsPXJhbmdlc11cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgRFdBUkYyIGRlYnVnIHNlY3Rpb25zXG4iKSk7Ci0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWkgPG51bWJlcj4gb3IgLS1pbnN0cnVjdGlvbi1kdW1wPTxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iKSk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1JIG9yIC0taGlzdG9ncmFtICAgICAgICAgRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3Roc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXYgb3IgLS12ZXJzaW9uICAgICAgICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiByZWFkZWxmXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtSCBvciAtLWhlbHAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvblxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotCi0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotcmVxdWVzdF9kdW1wIChzZWN0aW9uLCB0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbjsKLSAgICAgY2hhciAgICAgICAgIHR5cGU7Ci17Ci0gIGlmIChzZWN0aW9uID49IG51bV9kdW1wX3NlY3RzKQotICAgIHsKLSAgICAgIGNoYXIgKiBuZXdfZHVtcF9zZWN0czsKLQotICAgICAgbmV3X2R1bXBfc2VjdHMgPSAoY2hhciAqKSBjYWxsb2MgKHNlY3Rpb24gKyAxLCAxKTsKLQotICAgICAgaWYgKG5ld19kdW1wX3NlY3RzID09IE5VTEwpCi0JZXJyb3IgKF8oIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkdW1wIHJlcXVlc3QgdGFibGUuIikpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENvcHkgY3VycmVudCBmbGFnIHNldHRpbmdzLiAgKi8KLQkgIG1lbWNweSAobmV3X2R1bXBfc2VjdHMsIGR1bXBfc2VjdHMsIG51bV9kdW1wX3NlY3RzKTsKLQotCSAgZnJlZSAoZHVtcF9zZWN0cyk7Ci0KLQkgIGR1bXBfc2VjdHMgPSBuZXdfZHVtcF9zZWN0czsKLQkgIG51bV9kdW1wX3NlY3RzID0gc2VjdGlvbiArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoZHVtcF9zZWN0cykKLSAgICBkdW1wX3NlY3RzIFtzZWN0aW9uXSB8PSB0eXBlOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCBjOwotCi0gIGlmIChhcmdjIDwgMikKLSAgICB1c2FnZSAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZwotCSAgKGFyZ2MsIGFyZ3YsICJlcnNhaG5sZFNEQUl3Ojp4Omk6dlYiLCBvcHRpb25zLCBOVUxMKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGNoYXIgKiAgICBjcDsKLSAgICAgIGludAlzZWN0aW9uOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIC8qIExvbmcgb3B0aW9ucy4gICovCi0JICBicmVhazsKLQljYXNlICdIJzoKLQkgIHVzYWdlICgpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIGRvX3N5bXMgKys7Ci0JICBkb19yZWxvYyArKzsKLQkgIGRvX2R5bmFtaWMgKys7Ci0JICBkb19oZWFkZXIgKys7Ci0JICBkb19zZWN0aW9ucyArKzsKLQkgIGRvX3NlZ21lbnRzICsrOwotCSAgZG9fdmVyc2lvbiArKzsKLQkgIGRvX2hpc3RvZ3JhbSArKzsKLQkgIGRvX2FyY2ggKys7Ci0JICBkb19ub3RlcyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZG9faGVhZGVyICsrOwotCSAgZG9fc2VjdGlvbnMgKys7Ci0JICBkb19zZWdtZW50cyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotCSAgZG9fYXJjaCArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZG9fdXNpbmdfZHluYW1pYyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgZG9fcmVsb2MgKys7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIGRvX2hlYWRlciArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgZG9fc2VnbWVudHMgKys7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGRvX3N5bXMgKys7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGRvX3NlY3Rpb25zICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkb19keW5hbWljICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JICBkb19oaXN0b2dyYW0gKys7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGRvX25vdGVzICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkb19kdW1wICsrOwotCSAgc2VjdGlvbiA9IHN0cnRvdWwgKG9wdGFyZywgJiBjcCwgMCk7Ci0JICBpZiAoISAqIGNwICYmIHNlY3Rpb24gPj0gMCkKLQkgICAgewotCSAgICAgIHJlcXVlc3RfZHVtcCAoc2VjdGlvbiwgSEVYX0RVTVApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBnb3RvIG9vcHM7Ci0JY2FzZSAndyc6Ci0JICBkb19kdW1wICsrOwotCSAgaWYgKG9wdGFyZyA9PSAwKQotCSAgICBkb19kZWJ1Z2dpbmcgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZG9fZGVidWdnaW5nID0gMDsKLQkgICAgICBzd2l0Y2ggKG9wdGFyZ1swXSkKLQkJewotCQljYXNlICdpJzoKLQkJY2FzZSAnSSc6Ci0JCSAgZG9fZGVidWdfaW5mbyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnYSc6Ci0JCWNhc2UgJ0EnOgotCQkgIGRvX2RlYnVnX2FiYnJldnMgPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2wnOgotCQljYXNlICdMJzoKLQkJICBkb19kZWJ1Z19saW5lcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncCc6Ci0JCWNhc2UgJ1AnOgotCQkgIGRvX2RlYnVnX3B1Ym5hbWVzID0gMTsKLQkJICBicmVhazsKLQotCQljYXNlICdyJzoKLQkJY2FzZSAnUic6Ci0JCSAgZG9fZGVidWdfYXJhbmdlcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICB3YXJuIChfKCJVbnJlY29nbmlzZWQgZGVidWcgb3B0aW9uICclcydcbiIpLCBvcHRhcmcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLQljYXNlICdpJzoKLQkgIGRvX2R1bXAgKys7Ci0JICBzZWN0aW9uID0gc3RydG91bCAob3B0YXJnLCAmIGNwLCAwKTsKLQkgIGlmICghICogY3AgJiYgc2VjdGlvbiA+PSAwKQotCSAgICB7Ci0JICAgICAgcmVxdWVzdF9kdW1wIChzZWN0aW9uLCBESVNBU1NfRFVNUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGdvdG8gb29wczsKLSNlbmRpZgotCWNhc2UgJ3YnOgotCSAgcHJpbnRfdmVyc2lvbiAocHJvZ3JhbV9uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgZG9fdmVyc2lvbiArKzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0Jb29wczoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlcnJvciAoXygiSW52YWxpZCBvcHRpb24gJy0lYydcbiIpLCBjKTsKLQkgIC8qIERyb3AgdGhyb3VnaC4gICovCi0JY2FzZSAnPyc6Ci0JICB1c2FnZSAoKTsKLQl9Ci0gICAgfQotCi0gIGlmICghZG9fZHluYW1pYyAmJiAhZG9fc3ltcyAmJiAhZG9fcmVsb2MgJiYgIWRvX3NlY3Rpb25zCi0gICAgICAmJiAhZG9fc2VnbWVudHMgJiYgIWRvX2hlYWRlciAmJiAhZG9fZHVtcCAmJiAhZG9fdmVyc2lvbgotICAgICAgJiYgIWRvX2hpc3RvZ3JhbSAmJiAhZG9fZGVidWdnaW5nICYmICFkb19hcmNoICYmICFkb19ub3RlcykKLSAgICB1c2FnZSAoKTsKLSAgZWxzZSBpZiAoYXJnYyA8IDMpCi0gICAgewotICAgICAgd2FybiAoXygiTm90aGluZyB0byBkby5cbiIpKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfZWxmX2NsYXNzIChlbGZfY2xhc3MpCi0gICAgIHVuc2lnbmVkIGNoYXIgZWxmX2NsYXNzOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChlbGZfY2xhc3MpCi0gICAgewotICAgIGNhc2UgRUxGQ0xBU1NOT05FOiByZXR1cm4gXygibm9uZSIpOwotICAgIGNhc2UgRUxGQ0xBU1MzMjogICByZXR1cm4gXygiRUxGMzIiKTsKLSAgICBjYXNlIEVMRkNMQVNTNjQ6ICAgcmV0dXJuIF8oIkVMRjY0Iik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duOiAleD4iKSwgZWxmX2NsYXNzKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X2RhdGFfZW5jb2RpbmcgKGVuY29kaW5nKQotICAgICB1bnNpZ25lZCBjaGFyIGVuY29kaW5nOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChlbmNvZGluZykKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBTk9ORTogcmV0dXJuIF8oIm5vbmUiKTsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOiByZXR1cm4gXygiMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4iKTsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOiByZXR1cm4gXygiMidzIGNvbXBsZW1lbnQsIGJpZyBlbmRpYW4iKTsKLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd246ICV4PiIpLCBlbmNvZGluZyk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9vc2FiaV9uYW1lIChvc2FiaSkKLSAgICAgdW5zaWduZWQgY2hhciBvc2FiaTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAob3NhYmkpCi0gICAgewotICAgIGNhc2UgRUxGT1NBQklfU1lTVjogICAgICAgcmV0dXJuIF8oIlVOSVggLSBTeXN0ZW0gViIpOwotICAgIGNhc2UgRUxGT1NBQklfSFBVWDogICAgICAgcmV0dXJuIF8oIlVOSVggLSBIUC1VWCIpOwotICAgIGNhc2UgRUxGT1NBQklfU1RBTkRBTE9ORTogcmV0dXJuIF8oIlN0YW5kYWxvbmUgQXBwIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duOiAleD4iKSwgb3NhYmkpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi0vKiBEZWNvZGUgdGhlIGRhdGEgaGVsZCBpbiAnZWxmX2hlYWRlcicuICAqLwotc3RhdGljIGludAotcHJvY2Vzc19maWxlX2hlYWRlciAoKQotewotICBpZiAoICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUcwXSAhPSBFTEZNQUcwCi0gICAgICB8fCBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX01BRzFdICE9IEVMRk1BRzEKLSAgICAgIHx8IGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHMl0gIT0gRUxGTUFHMgotICAgICAgfHwgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUczXSAhPSBFTEZNQUczKQotICAgIHsKLSAgICAgIGVycm9yCi0JKF8oIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX2hlYWRlcikKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgcHJpbnRmIChfKCJFTEYgSGVhZGVyOlxuIikpOwotICAgICAgcHJpbnRmIChfKCIgIE1hZ2ljOiAgICIpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBFSV9OSURFTlQ7IGkgKyspCi0JcHJpbnRmICgiJTIuMnggIiwgZWxmX2hlYWRlci5lX2lkZW50IFtpXSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmIChfKCIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9lbGZfY2xhc3MgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfQ0xBU1NdKSk7Ci0gICAgICBwcmludGYgKF8oIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X2RhdGFfZW5jb2RpbmcgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfREFUQV0pKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iKSwKLQkgICAgICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dLAotCSAgICAgIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dID09IEVWX0NVUlJFTlQKLQkgICAgICAgPyAiKGN1cnJlbnQpIgotCSAgICAgICA6IChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dICE9IEVWX05PTkUKLQkJICA/ICI8dW5rbm93bjogJWx4PiIKLQkJICA6ICIiKSkpOwotICAgICAgcHJpbnRmIChfKCIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9vc2FiaV9uYW1lIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX09TQUJJXSkpOwotICAgICAgcHJpbnRmIChfKCIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIpLAotCSAgICAgIGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfQUJJVkVSU0lPTl0pOwotICAgICAgcHJpbnRmIChfKCIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9maWxlX3R5cGUgKGVsZl9oZWFkZXIuZV90eXBlKSk7Ci0gICAgICBwcmludGYgKF8oIiAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X21hY2hpbmVfbmFtZSAoZWxmX2hlYWRlci5lX21hY2hpbmUpKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4XG4iKSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgMHglbHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZW50cnkpOwotICAgICAgcHJpbnRmIChfKCIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3Bob2ZmKTsKLSAgICAgIHByaW50ZiAoXygiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICVsZCAoYnl0ZXMgaW50byBmaWxlKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaG9mZik7Ci0gICAgICBwcmludGYgKF8oIiAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseCVzXG4iKSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX2ZsYWdzLAotCSAgICAgIGdldF9tYWNoaW5lX2ZsYWdzIChlbGZfaGVhZGVyLmVfZmxhZ3MsIGVsZl9oZWFkZXIuZV9tYWNoaW5lKSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9laHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfcGhlbnRzaXplKTsKLSAgICAgIHByaW50ZiAoXygiICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9waG51bSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaGVudHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3NobnVtKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWdldF8zMmJpdF9wcm9ncmFtX2hlYWRlcnMgKGZpbGUsIHByb2dyYW1faGVhZGVycykKLSAgICAgRklMRSAqIGZpbGU7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyICogcHJvZ3JhbV9oZWFkZXJzOwotewotICBFbGYzMl9FeHRlcm5hbF9QaGRyICogcGhkcnM7Ci0gIEVsZjMyX0V4dGVybmFsX1BoZHIgKiBleHRlcm5hbDsKLSAgRWxmMzJfSW50ZXJuYWxfUGhkciAqIGludGVybmFsOwotICB1bnNpZ25lZCBpbnQgICAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZWxmX2hlYWRlci5lX3Bob2ZmLAotCQkgIGVsZl9oZWFkZXIuZV9waGVudHNpemUgKiBlbGZfaGVhZGVyLmVfcGhudW0sCi0JCSAgcGhkcnMsIEVsZjMyX0V4dGVybmFsX1BoZHIgKiwgInByb2dyYW0gaGVhZGVycyIpOwotCi0gIGZvciAoaSA9IDAsIGludGVybmFsID0gcHJvZ3JhbV9oZWFkZXJzLCBleHRlcm5hbCA9IHBoZHJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfcGhudW07Ci0gICAgICAgaSArKywgaW50ZXJuYWwgKyssIGV4dGVybmFsICsrKQotICAgIHsKLSAgICAgIGludGVybmFsLT5wX3R5cGUgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF90eXBlKTsKLSAgICAgIGludGVybmFsLT5wX29mZnNldCA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnBfdmFkZHIgID0gQllURV9HRVQgKGV4dGVybmFsLT5wX3ZhZGRyKTsKLSAgICAgIGludGVybmFsLT5wX3BhZGRyICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9wYWRkcik7Ci0gICAgICBpbnRlcm5hbC0+cF9maWxlc3ogPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfZmlsZXN6KTsKLSAgICAgIGludGVybmFsLT5wX21lbXN6ICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9tZW1zeik7Ci0gICAgICBpbnRlcm5hbC0+cF9mbGFncyAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfZmxhZ3MpOwotICAgICAgaW50ZXJuYWwtPnBfYWxpZ24gID0gQllURV9HRVQgKGV4dGVybmFsLT5wX2FsaWduKTsKLSAgICB9Ci0KLSAgZnJlZSAocGhkcnMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfNjRiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpCi0gICAgIEZJTEUgKiBmaWxlOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciAqIHByb2dyYW1faGVhZGVyczsKLXsKLSAgRWxmNjRfRXh0ZXJuYWxfUGhkciAqIHBoZHJzOwotICBFbGY2NF9FeHRlcm5hbF9QaGRyICogZXh0ZXJuYWw7Ci0gIEVsZjY0X0ludGVybmFsX1BoZHIgKiBpbnRlcm5hbDsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgIGk7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9waG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplICogZWxmX2hlYWRlci5lX3BobnVtLAotCQkgIHBoZHJzLCBFbGY2NF9FeHRlcm5hbF9QaGRyICosICJwcm9ncmFtIGhlYWRlcnMiKTsKLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHByb2dyYW1faGVhZGVycywgZXh0ZXJuYWwgPSBwaGRyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrLCBleHRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+cF90eXBlICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+cF9mbGFncyAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfZmxhZ3MpOwotICAgICAgaW50ZXJuYWwtPnBfb2Zmc2V0ID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnBfdmFkZHIgID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF92YWRkcik7Ci0gICAgICBpbnRlcm5hbC0+cF9wYWRkciAgPSBCWVRFX0dFVDggKGV4dGVybmFsLT5wX3BhZGRyKTsKLSAgICAgIGludGVybmFsLT5wX2ZpbGVzeiA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfZmlsZXN6KTsKLSAgICAgIGludGVybmFsLT5wX21lbXN6ICA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfbWVtc3opOwotICAgICAgaW50ZXJuYWwtPnBfYWxpZ24gID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9hbGlnbik7Ci0gICAgfQotCi0gIGZyZWUgKHBoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGZfSW50ZXJuYWxfUGhkciAqIHByb2dyYW1faGVhZGVyczsKLSAgRWxmX0ludGVybmFsX1BoZHIgKiBzZWdtZW50OwotICB1bnNpZ25lZCBpbnQJICAgICAgaTsKLQotICBpZiAoZWxmX2hlYWRlci5lX3BobnVtID09IDApCi0gICAgewotICAgICAgaWYgKGRvX3NlZ21lbnRzKQotCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gcHJvZ3JhbSBoZWFkZXJzIGluIHRoaXMgZmlsZS5cbiIpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoZG9fc2VnbWVudHMgJiYgIWRvX2hlYWRlcikKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuRWxmIGZpbGUgaXMgJXNcbiIpLCBnZXRfZmlsZV90eXBlIChlbGZfaGVhZGVyLmVfdHlwZSkpOwotICAgICAgcHJpbnRmIChfKCJFbnRyeSBwb2ludCAweCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZW50cnkpOwotICAgICAgcHJpbnRmIChfKCJUaGVyZSBhcmUgJWQgcHJvZ3JhbSBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIiksCi0JICAgICAgZWxmX2hlYWRlci5lX3BobnVtLCAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3Bob2ZmKTsKLSAgICB9Ci0KLSAgcHJvZ3JhbV9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9QaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfcGhudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci0KLSAgaWYgKHByb2dyYW1faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICBpID0gZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKTsKLSAgZWxzZQotICAgIGkgPSBnZXRfNjRiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpOwotCi0gIGlmIChpID09IDApCi0gICAgewotICAgICAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoZG9fc2VnbWVudHMpCi0gICAgewotICAgICAgcHJpbnRmCi0JKF8oIlxuUHJvZ3JhbSBIZWFkZXIlczpcbiIpLCBlbGZfaGVhZGVyLmVfcGhudW0gPiAxID8gInMiIDogIiIpOwotICAgICAgcHJpbnRmCi0JKF8oIiAgVHlwZSAgICAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICBQaHlzQWRkciAgIEZpbGVTaXogTWVtU2l6ICBGbGcgQWxpZ25cbiIpKTsKLSAgICB9Ci0KLSAgbG9hZGFkZHIgPSAtMTsKLSAgZHluYW1pY19hZGRyID0gMDsKLSAgZHluYW1pY19zaXplID0gMDsKLQotICBmb3IgKGkgPSAwLCBzZWdtZW50ID0gcHJvZ3JhbV9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfcGhudW07Ci0gICAgICAgaSArKywgc2VnbWVudCArKykKLSAgICB7Ci0gICAgICBpZiAoZG9fc2VnbWVudHMpCi0JewotCSAgcHJpbnRmICgiICAlLTE0LjE0cyAiLCBnZXRfc2VnbWVudF90eXBlIChzZWdtZW50LT5wX3R5cGUpKTsKLQkgIHByaW50ZiAoIjB4JTYuNmx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX29mZnNldCk7Ci0JICBwcmludGYgKCIweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF92YWRkcik7Ci0JICBwcmludGYgKCIweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9wYWRkcik7Ci0JICBwcmludGYgKCIweCU1LjVseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9maWxlc3opOwotCSAgcHJpbnRmICgiMHglNS41bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfbWVtc3opOwotCSAgcHJpbnRmICgiJWMlYyVjICIsCi0JCSAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9SID8gJ1InIDogJyAnKSwKLQkJICAoc2VnbWVudC0+cF9mbGFncyAmIFBGX1cgPyAnVycgOiAnICcpLAotCQkgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfWCA/ICdFJyA6ICcgJykpOwotCSAgcHJpbnRmICgiJSNseCIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX2FsaWduKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc2VnbWVudC0+cF90eXBlKQotCXsKLQljYXNlIFBUX0xPQUQ6Ci0JICBpZiAobG9hZGFkZHIgPT0gLTEpCi0JICAgIGxvYWRhZGRyID0gKHNlZ21lbnQtPnBfdmFkZHIgJiAweGZmZmZmMDAwKQotCSAgICAgIC0gKHNlZ21lbnQtPnBfb2Zmc2V0ICYgMHhmZmZmZjAwMCk7Ci0JICBicmVhazsKLQotCWNhc2UgUFRfRFlOQU1JQzoKLQkgIGlmIChkeW5hbWljX2FkZHIpCi0JICAgIGVycm9yIChfKCJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VnbWVudFxuIikpOwotCi0JICBkeW5hbWljX2FkZHIgPSBzZWdtZW50LT5wX29mZnNldDsKLQkgIGR5bmFtaWNfc2l6ZSA9IHNlZ21lbnQtPnBfZmlsZXN6OwotCSAgYnJlYWs7Ci0KLQljYXNlIFBUX0lOVEVSUDoKLQkgIGlmIChmc2VlayAoZmlsZSwgc2VnbWVudC0+cF9vZmZzZXQsIFNFRUtfU0VUKSkKLQkgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBmaW5kIHByb2dyYW0gaW50ZXJwcmV0ZXIgbmFtZVxuIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJvZ3JhbV9pbnRlcnByZXRlclswXSA9IDA7Ci0JICAgICAgZnNjYW5mIChmaWxlLCAiJTYzcyIsIHByb2dyYW1faW50ZXJwcmV0ZXIpOwotCi0JICAgICAgaWYgKGRvX3NlZ21lbnRzKQotCQlwcmludGYgKF8oIlxuICAgICAgW1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdIiksCi0JCSAgICBwcm9ncmFtX2ludGVycHJldGVyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoZG9fc2VnbWVudHMpCi0JcHV0YyAoJ1xuJywgc3Rkb3V0KTsKLSAgICB9Ci0KLSAgaWYgKGxvYWRhZGRyID09IC0xKQotICAgIHsKLSAgICAgIC8qIFZlcnkgc3RyYW5nZS4gKi8KLSAgICAgIGxvYWRhZGRyID0gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX3NlZ21lbnRzICYmIHNlY3Rpb25faGVhZGVycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG4gU2VjdGlvbiB0byBTZWdtZW50IG1hcHBpbmc6XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2VnbWVudCBTZWN0aW9ucy4uLlxuIikpOwotCi0gICAgICBhc3NlcnQgKHN0cmluZ190YWJsZSAhPSBOVUxMKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsgaSsrKQotCXsKLQkgIGludCAgICAgICAgICAgICAgICAgajsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLQotCSAgc2VnbWVudCA9IHByb2dyYW1faGVhZGVycyArIGk7Ci0JICBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotCi0JICBwcmludGYgKCIgICAlMi4yZCAgICAgIiwgaSk7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBlbGZfaGVhZGVyLmVfc2hudW07IGorKywgc2VjdGlvbiArKykKLQkgICAgewotCSAgICAgIGlmIChzZWN0aW9uLT5zaF9zaXplID4gMAotCQkgIC8qIENvbXBhcmUgYWxsb2NhdGVkIHNlY3Rpb25zIGJ5IFZNQSwgdW5hbGxvY2F0ZWQKLQkJICAgICBzZWN0aW9ucyBieSBmaWxlIG9mZnNldC4gICovCi0JCSAgJiYgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX0FMTE9DCi0JCSAgICAgID8gKHNlY3Rpb24tPnNoX2FkZHIgPj0gc2VnbWVudC0+cF92YWRkcgotCQkJICYmIHNlY3Rpb24tPnNoX2FkZHIgKyBzZWN0aW9uLT5zaF9zaXplCi0JCQkgPD0gc2VnbWVudC0+cF92YWRkciArIHNlZ21lbnQtPnBfbWVtc3opCi0JCSAgICAgIDogKChiZmRfdm1hKSBzZWN0aW9uLT5zaF9vZmZzZXQgPj0gc2VnbWVudC0+cF9vZmZzZXQKLQkJCSAmJiAoc2VjdGlvbi0+c2hfb2Zmc2V0ICsgc2VjdGlvbi0+c2hfc2l6ZQotCQkJICAgICA8PSBzZWdtZW50LT5wX29mZnNldCArIHNlZ21lbnQtPnBfZmlsZXN6KSkpKQotCQlwcmludGYgKCIlcyAiLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQkgICAgfQotCi0JICBwdXRjICgnXG4nLHN0ZG91dCk7Ci0JfQotICAgIH0KLQotICBmcmVlIChwcm9ncmFtX2hlYWRlcnMpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWdldF8zMmJpdF9zZWN0aW9uX2hlYWRlcnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9FeHRlcm5hbF9TaGRyICogc2hkcnM7Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiBpbnRlcm5hbDsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgIGk7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9zaG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfc2hlbnRzaXplICogZWxmX2hlYWRlci5lX3NobnVtLAotCQkgIHNoZHJzLCBFbGYzMl9FeHRlcm5hbF9TaGRyICosICJzZWN0aW9uIGhlYWRlcnMiKTsKLQotICBzZWN0aW9uX2hlYWRlcnMgPSAoRWxmX0ludGVybmFsX1NoZHIgKikgbWFsbG9jCi0gICAgKGVsZl9oZWFkZXIuZV9zaG51bSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKTsKLQotICBpZiAoc2VjdGlvbl9oZWFkZXJzID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrKQotICAgIHsKLSAgICAgIGludGVybmFsLT5zaF9uYW1lICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbmFtZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfdHlwZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX3R5cGUpOwotICAgICAgaW50ZXJuYWwtPnNoX2ZsYWdzICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9mbGFncyk7Ci0gICAgICBpbnRlcm5hbC0+c2hfYWRkciAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2FkZHIpOwotICAgICAgaW50ZXJuYWwtPnNoX29mZnNldCAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnNoX3NpemUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9zaXplKTsKLSAgICAgIGludGVybmFsLT5zaF9saW5rICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbGluayk7Ci0gICAgICBpbnRlcm5hbC0+c2hfaW5mbyAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2luZm8pOwotICAgICAgaW50ZXJuYWwtPnNoX2FkZHJhbGlnbiA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9hZGRyYWxpZ24pOwotICAgICAgaW50ZXJuYWwtPnNoX2VudHNpemUgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9lbnRzaXplKTsKLSAgICB9Ci0KLSAgZnJlZSAoc2hkcnMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfNjRiaXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmNjRfRXh0ZXJuYWxfU2hkciAqIHNoZHJzOwotICBFbGY2NF9JbnRlcm5hbF9TaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotCi0gIEdFVF9EQVRBX0FMTE9DIChlbGZfaGVhZGVyLmVfc2hvZmYsCi0JCSAgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSAqIGVsZl9oZWFkZXIuZV9zaG51bSwKLQkJICBzaGRycywgRWxmNjRfRXh0ZXJuYWxfU2hkciAqLCAic2VjdGlvbiBoZWFkZXJzIik7Ci0KLSAgc2VjdGlvbl9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfc2hudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0KLSAgaWYgKHNlY3Rpb25faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgaW50ZXJuYWwgPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLSAgICAgICBpICsrLCBpbnRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+c2hfbmFtZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX25hbWUpOwotICAgICAgaW50ZXJuYWwtPnNoX3R5cGUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF90eXBlKTsKLSAgICAgIGludGVybmFsLT5zaF9mbGFncyAgICAgPSBCWVRFX0dFVDggKHNoZHJzW2ldLnNoX2ZsYWdzKTsKLSAgICAgIGludGVybmFsLT5zaF9hZGRyICAgICAgPSBCWVRFX0dFVDggKHNoZHJzW2ldLnNoX2FkZHIpOwotICAgICAgaW50ZXJuYWwtPnNoX3NpemUgICAgICA9IEJZVEVfR0VUOCAoc2hkcnNbaV0uc2hfc2l6ZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfZW50c2l6ZSAgID0gQllURV9HRVQ4IChzaGRyc1tpXS5zaF9lbnRzaXplKTsKLSAgICAgIGludGVybmFsLT5zaF9saW5rICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbGluayk7Ci0gICAgICBpbnRlcm5hbC0+c2hfaW5mbyAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2luZm8pOwotICAgICAgaW50ZXJuYWwtPnNoX29mZnNldCAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnNoX2FkZHJhbGlnbiA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9hZGRyYWxpZ24pOwotICAgIH0KLQotICBmcmVlIChzaGRycyk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfU3ltICoKLWdldF8zMmJpdF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBudW1iZXIpCi0gICAgIEZJTEUgKiBmaWxlOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci17Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqIGVzeW1zOwotICBFbGZfSW50ZXJuYWxfU3ltICogICBpc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgcHN5bTsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgajsKLQotICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBudW1iZXIgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCSAgZXN5bXMsIEVsZjMyX0V4dGVybmFsX1N5bSAqLCAic3ltYm9scyIpOwotCi0gIGlzeW1zID0gKEVsZl9JbnRlcm5hbF9TeW0gKikgbWFsbG9jIChudW1iZXIgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKLQotICBpZiAoaXN5bXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgZnJlZSAoZXN5bXMpOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChqID0gMCwgcHN5bSA9IGlzeW1zOwotICAgICAgIGogPCBudW1iZXI7Ci0gICAgICAgaiArKywgcHN5bSArKykKLSAgICB7Ci0gICAgICBwc3ltLT5zdF9uYW1lICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9uYW1lKTsKLSAgICAgIHBzeW0tPnN0X3ZhbHVlID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3ZhbHVlKTsKLSAgICAgIHBzeW0tPnN0X3NpemUgID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3NpemUpOwotICAgICAgcHN5bS0+c3Rfc2huZHggPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfc2huZHgpOwotICAgICAgcHN5bS0+c3RfaW5mbyAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfaW5mbyk7Ci0gICAgICBwc3ltLT5zdF9vdGhlciA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9vdGhlcik7Ci0gICAgfQotCi0gIGZyZWUgKGVzeW1zKTsKLQotICByZXR1cm4gaXN5bXM7Ci19Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfU3ltICoKLWdldF82NGJpdF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBudW1iZXIpCi0gICAgIEZJTEUgKiBmaWxlOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqIGVzeW1zOwotICBFbGZfSW50ZXJuYWxfU3ltICogICBpc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgcHN5bTsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgajsKLQotICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBudW1iZXIgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSksCi0JCSAgZXN5bXMsIEVsZjY0X0V4dGVybmFsX1N5bSAqLCAic3ltYm9scyIpOwotCi0gIGlzeW1zID0gKEVsZl9JbnRlcm5hbF9TeW0gKikgbWFsbG9jIChudW1iZXIgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKLQotICBpZiAoaXN5bXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgZnJlZSAoZXN5bXMpOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChqID0gMCwgcHN5bSA9IGlzeW1zOwotICAgICAgIGogPCBudW1iZXI7Ci0gICAgICAgaiArKywgcHN5bSArKykKLSAgICB7Ci0gICAgICBwc3ltLT5zdF9uYW1lICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9uYW1lKTsKLSAgICAgIHBzeW0tPnN0X2luZm8gID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X2luZm8pOwotICAgICAgcHN5bS0+c3Rfb3RoZXIgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfb3RoZXIpOwotICAgICAgcHN5bS0+c3Rfc2huZHggPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfc2huZHgpOwotICAgICAgcHN5bS0+c3RfdmFsdWUgPSBCWVRFX0dFVDggKGVzeW1zW2pdLnN0X3ZhbHVlKTsKLSAgICAgIHBzeW0tPnN0X3NpemUgID0gQllURV9HRVQ4IChlc3ltc1tqXS5zdF9zaXplKTsKLSAgICB9Ci0KLSAgZnJlZSAoZXN5bXMpOwotCi0gIHJldHVybiBpc3ltczsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gIGludCAgICAgICAgICAgICAgICAgaTsKLQotICBzZWN0aW9uX2hlYWRlcnMgPSBOVUxMOwotCi0gIGlmIChlbGZfaGVhZGVyLmVfc2hudW0gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZG9fc2VjdGlvbnMpCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyBzZWN0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoZG9fc2VjdGlvbnMgJiYgIWRvX2hlYWRlcikKLSAgICBwcmludGYgKF8oIlRoZXJlIGFyZSAlZCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweCVseDpcbiIpLAotCSAgICBlbGZfaGVhZGVyLmVfc2hudW0sICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfc2hvZmYpOwotCi0gIGlmIChpc18zMmJpdF9lbGYpCi0gICAgewotICAgICAgaWYgKCEgZ2V0XzMyYml0X3NlY3Rpb25faGVhZGVycyAoZmlsZSkpCi0JcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlIGlmICghIGdldF82NGJpdF9zZWN0aW9uX2hlYWRlcnMgKGZpbGUpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSwgc28gdGhhdCB3ZSBoYXZlIG5hbWVzIHRvIGRpc3BsYXkuICAqLwotICBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzICsgZWxmX2hlYWRlci5lX3Noc3RybmR4OwotCi0gIGlmIChzZWN0aW9uLT5zaF9zaXplICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBzdHJpbmdfdGFibGVfb2Zmc2V0OwotCi0gICAgICBzdHJpbmdfdGFibGVfb2Zmc2V0ID0gc2VjdGlvbi0+c2hfb2Zmc2V0OwotCi0gICAgICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9zaXplLAotCQkgICAgICBzdHJpbmdfdGFibGUsIGNoYXIgKiwgInN0cmluZyB0YWJsZSIpOwotICAgIH0KLQotICAvKiBTY2FuIHRoZSBzZWN0aW9ucyBmb3IgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0gICAgIGFuZCBkeW5hbWljIHN0cmluZyB0YWJsZSBhbmQgZGVidWcgc2VjdGlvbnMuICovCi0gIGR5bmFtaWNfc3ltYm9scyA9IE5VTEw7Ci0gIGR5bmFtaWNfc3RyaW5ncyA9IE5VTEw7Ci0gIGR5bmFtaWNfc3ltaW5mbyA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgY2hhciAqIG5hbWUgPSBTRUNUSU9OX05BTUUgKHNlY3Rpb24pOwotCi0gICAgICBpZiAoc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCXsKLQkgIGlmIChkeW5hbWljX3N5bWJvbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIikpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIG51bV9keW5hbWljX3N5bXMgPSBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgIGR5bmFtaWNfc3ltYm9scyA9Ci0JICAgIEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LCBudW1fZHluYW1pY19zeW1zKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9TVFJUQUIKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApCi0JewotCSAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKF8oIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzdHJpbmcgdGFibGVzXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJCSAgZHluYW1pY19zdHJpbmdzLCBjaGFyICosICJkeW5hbWljIHN0cmluZ3MiKTsKLQl9Ci0gICAgICBlbHNlIGlmICgoZG9fZGVidWdnaW5nIHx8IGRvX2RlYnVnX2luZm8gfHwgZG9fZGVidWdfYWJicmV2cwotCQl8fCBkb19kZWJ1Z19saW5lcyB8fCBkb19kZWJ1Z19wdWJuYW1lcyB8fCBkb19kZWJ1Z19hcmFuZ2VzKQotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIDcpID09IDApCi0JewotCSAgbmFtZSArPSA3OwotCi0JICBpZiAoZG9fZGVidWdnaW5nCi0JICAgICAgfHwgKGRvX2RlYnVnX2luZm8gICAgICYmIChzdHJjbXAgKG5hbWUsICJpbmZvIikgPT0gMCkpCi0JICAgICAgfHwgKGRvX2RlYnVnX2FiYnJldnMgICYmIChzdHJjbXAgKG5hbWUsICJhYmJyZXYiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfbGluZXMgICAgJiYgKHN0cmNtcCAobmFtZSwgImxpbmUiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfcHVibmFtZXMgJiYgKHN0cmNtcCAobmFtZSwgInB1Ym5hbWVzIikgPT0gMCkpCi0JICAgICAgfHwgKGRvX2RlYnVnX2FyYW5nZXMgICYmIChzdHJjbXAgKG5hbWUsICJhcmFuZ2VzIikgPT0gMCkpCi0JICAgICAgKQotCSAgICByZXF1ZXN0X2R1bXAgKGksIERFQlVHX0RVTVApOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZG9fc2VjdGlvbnMpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcHJpbnRmIChfKCJcblNlY3Rpb24gSGVhZGVyJXM6XG4iKSwgZWxmX2hlYWRlci5lX3NobnVtID4gMSA/ICJzIiA6ICIiKTsKLSAgcHJpbnRmCi0gICAgKF8oIiAgW05yXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgSW5mIEFsXG4iKSk7Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgcHJpbnRmICgiICBbJTJkXSAlLTE3LjE3cyAlLTE1LjE1cyAiLAotCSAgICAgIGksCi0JICAgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwKLQkgICAgICBnZXRfc2VjdGlvbl90eXBlX25hbWUgKHNlY3Rpb24tPnNoX3R5cGUpKTsKLQotICAgICAgcHJpbnRmICggIiU4LjhseCAlNi42bHggJTYuNmx4ICUyLjJseCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9hZGRyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfc2l6ZSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2VudHNpemUpOwotCi0gICAgICBwcmludGYgKCIgJWMlYyVjICUybGQgJTNseCAlbGRcbiIsCi0JICAgICAgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX1dSSVRFID8gJ1cnIDogJyAnKSwKLQkgICAgICAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MgPyAnQScgOiAnICcpLAotCSAgICAgIChzZWN0aW9uLT5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIgPyAnWCcgOiAnICcpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9saW5rLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9pbmZvLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9hZGRyYWxpZ24pOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogUHJvY2VzcyB0aGUgcmVsb2Mgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3JlbG9jcyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgcmVsX3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcJICAgcmVsX29mZnNldDsKLQotCi0gIGlmICghZG9fcmVsb2MpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGRvX3VzaW5nX2R5bmFtaWMpCi0gICAgewotICAgICAgaW50IGlzX3JlbGEgPSBGQUxTRTsKLQotICAgICAgcmVsX3NpemUgICA9IDA7Ci0gICAgICByZWxfb2Zmc2V0ID0gMDsKLQotICAgICAgaWYgKGR5bmFtaWNfaW5mb1tEVF9SRUxdKQotCXsKLQkgIHJlbF9vZmZzZXQgPSBkeW5hbWljX2luZm9bRFRfUkVMXTsKLQkgIHJlbF9zaXplICAgPSBkeW5hbWljX2luZm9bRFRfUkVMU1pdOwotCSAgaXNfcmVsYSAgICA9IEZBTFNFOwotCX0KLSAgICAgIGVsc2UgaWYgKGR5bmFtaWNfaW5mbyBbRFRfUkVMQV0pCi0JewotCSAgcmVsX29mZnNldCA9IGR5bmFtaWNfaW5mb1tEVF9SRUxBXTsKLQkgIHJlbF9zaXplICAgPSBkeW5hbWljX2luZm9bRFRfUkVMQVNaXTsKLQkgIGlzX3JlbGEgICAgPSBUUlVFOwotCX0KLSAgICAgIGVsc2UgaWYgKGR5bmFtaWNfaW5mb1tEVF9KTVBSRUxdKQotCXsKLQkgIHJlbF9vZmZzZXQgPSBkeW5hbWljX2luZm9bRFRfSk1QUkVMXTsKLQkgIHJlbF9zaXplICAgPSBkeW5hbWljX2luZm9bRFRfUExUUkVMU1pdOwotCi0JICBzd2l0Y2ggKGR5bmFtaWNfaW5mb1tEVF9QTFRSRUxdKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUkVMOgotCSAgICAgIGlzX3JlbGEgPSBGQUxTRTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBOgotCSAgICAgIGlzX3JlbGEgPSBUUlVFOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGlzX3JlbGEgPSBVTktOT1dOOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmVsX3NpemUpCi0JewotCSAgcHJpbnRmCi0JICAgIChfKCJcblJlbG9jYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWxkIGJ5dGVzOlxuIiksCi0JICAgICByZWxfb2Zmc2V0LCByZWxfc2l6ZSk7Ci0KLQkgIGR1bXBfcmVsb2NhdGlvbnMgKGZpbGUsIHJlbF9vZmZzZXQgLSBsb2FkYWRkciwgcmVsX3NpemUsCi0JCQkgICAgZHluYW1pY19zeW1ib2xzLCBudW1fZHluYW1pY19zeW1zLCBkeW5hbWljX3N0cmluZ3MsIGlzX3JlbGEpOwotCX0KLSAgICAgIGVsc2UKLQlwcmludGYgKF8oIlxuVGhlcmUgYXJlIG5vIGR5bmFtaWMgcmVsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLlxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgc2VjdGlvbjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgCQlpOwotICAgICAgaW50ICAgICAgICAgICAJCWZvdW5kID0gMDsKLQotICAgICAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLQkgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotCSAgIGkrKywgc2VjdGlvbiArKykKLQl7Ci0JICBpZiAoICAgc2VjdGlvbi0+c2hfdHlwZSAhPSBTSFRfUkVMQQotCSAgICAgICYmIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX1JFTCkKLQkgICAgY29udGludWU7Ci0KLQkgIHJlbF9vZmZzZXQgPSBzZWN0aW9uLT5zaF9vZmZzZXQ7Ci0JICByZWxfc2l6ZSAgID0gc2VjdGlvbi0+c2hfc2l6ZTsKLQotCSAgaWYgKHJlbF9zaXplKQotCSAgICB7Ci0JICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHN0cnNlYzsKLQkgICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc3ltc2VjOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICBzeW10YWI7Ci0JICAgICAgY2hhciAqICAgICAgICAgICAgICAgIHN0cnRhYjsKLQkgICAgICBpbnQgICAgICAgICAgICAgICAgICAgaXNfcmVsYTsKLQkgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgbnN5bXM7Ci0KLQkgICAgICBwcmludGYgKF8oIlxuUmVsb2NhdGlvbiBzZWN0aW9uICIpKTsKLQotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJcHJpbnRmICgiJWQiLCBzZWN0aW9uLT5zaF9uYW1lKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiclcyciLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotCSAgICAgIHByaW50ZiAoXygiIGF0IG9mZnNldCAweCVseCBjb250YWlucyAlbHUgZW50cmllczpcbiIpLAotCQkgcmVsX29mZnNldCwgKHVuc2lnbmVkIGxvbmcpIChyZWxfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpKTsKLQotCSAgICAgIHN5bXNlYyA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgICBuc3ltcyA9IHN5bXNlYy0+c2hfc2l6ZSAvIHN5bXNlYy0+c2hfZW50c2l6ZTsKLQkgICAgICBzeW10YWIgPSBHRVRfRUxGX1NZTUJPTFMgKGZpbGUsIHN5bXNlYy0+c2hfb2Zmc2V0LCBuc3ltcyk7Ci0KLQkgICAgICBpZiAoc3ltdGFiID09IE5VTEwpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc3Ryc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgc3ltc2VjLT5zaF9saW5rOwotCi0JICAgICAgR0VUX0RBVEFfQUxMT0MgKHN0cnNlYy0+c2hfb2Zmc2V0LCBzdHJzZWMtPnNoX3NpemUsIHN0cnRhYiwKLQkJCSAgICAgIGNoYXIgKiwgInN0cmluZyB0YWJsZSIpOwotCi0JICAgICAgaXNfcmVsYSA9IHNlY3Rpb24tPnNoX3R5cGUgPT0gU0hUX1JFTEE7Ci0KLQkgICAgICBkdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0LCByZWxfc2l6ZSwgc3ltdGFiLCBuc3ltcywgc3RydGFiLCBpc19yZWxhKTsKLQotCSAgICAgIGZyZWUgKHN0cnRhYik7Ci0JICAgICAgZnJlZSAoc3ltdGFiKTsKLQotCSAgICAgIGZvdW5kID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgZm91bmQpCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyByZWxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB2b2lkCi1keW5hbWljX3NlZ21lbnRfbWlwc192YWwgKGVudHJ5KQotICAgICBFbGZfSW50ZXJuYWxfRHluICogZW50cnk7Ci17Ci0gIHN3aXRjaCAoZW50cnktPmRfdGFnKQotICAgIHsKLSAgICBjYXNlIERUX01JUFNfRkxBR1M6Ci0gICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQlwcmludGYgKCJOT05FXG4iKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciAqIG9wdHNbXSA9Ci0JICB7Ci0JICAgICJRVUlDS1NUQVJUIiwgIk5PVFBPVCIsICJOT19MSUJSQVJZX1JFUExBQ0VNRU5UIiwKLQkgICAgIk5PX01PVkUiLCAiU0dJX09OTFkiLCAiR1VBUkFOVEVFX0lOSVQiLCAiREVMVEFfQ19QTFVTX1BMVVMiLAotCSAgICAiR1VBUkFOVEVFX1NUQVJUX0lOSVQiLCAiUElYSUUiLCAiREVGQVVMVF9ERUxBWV9MT0FEIiwKLQkgICAgIlJFUVVJQ0tTVEFSVCIsICJSRVFVSUNLU1RBUlRFRCIsICJDT1JEIiwgIk5PX1VOUkVTX1VOREVGIiwKLQkgICAgIlJMRF9PUkRFUl9TQUZFIgotCSAgfTsKLQkgIHVuc2lnbmVkIGludCBjbnQ7Ci0JICBpbnQgZmlyc3QgPSAxOwotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fRUxFTSAob3B0cyk7ICsrIGNudCkKLQkgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsICYgKDEgPDwgY250KSkKLQkgICAgICB7Ci0JCXByaW50ZiAoIiVzJXMiLCBmaXJzdCA/ICIiIDogIiAiLCBvcHRzW2NudF0pOwotCQlmaXJzdCA9IDA7Ci0JICAgICAgfQotCSAgcHV0cyAoIiIpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOgotICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCXByaW50ZiAoIkludGVyZmFjZSBWZXJzaW9uOiAlc1xuIiwKLQkJZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWwpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6Ci0gICAgICB7Ci0JY2hhciB0aW1lYnVmWzIwXTsKLQl0aW1lX3QgdGltZSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCXN0cmZ0aW1lICh0aW1lYnVmLCAyMCwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgZ210aW1lICgmdGltZSkpOwotCXByaW50ZiAoIlRpbWUgU3RhbXA6ICVzXG4iLCB0aW1lYnVmKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOgotICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzoKLSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKLSAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgotICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKLSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKLSAgICBjYXNlIERUX01JUFNfSElQQUdFTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05POgotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0NfTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTV9OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk86Ci0gICAgY2FzZSBEVF9NSVBTX0NPTVBBQ1RfU0laRToKLSAgICAgIHByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3B0cik7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1keW5hbWljX3NlZ21lbnRfcGFyaXNjX3ZhbCAoZW50cnkpCi0gICAgIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLXsKLSAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0gICAgewotICAgIGNhc2UgRFRfSFBfRExEX0ZMQUdTOgotICAgICAgewotCXN0YXRpYyBzdHJ1Y3QKLQl7Ci0JICBsb25nIGludCBiaXQ7Ci0JICBjb25zdCBjaGFyICpzdHI7Ci0JfSBmbGFnc1tdID0KLQkgIHsKLQkgICAgeyBEVF9IUF9ERUJVR19QUklWQVRFLCAiSFBfREVCVUdfUFJJVkFURSIgfSwKLQkgICAgeyBEVF9IUF9ERUJVR19DQUxMQkFDSywgIkhQX0RFQlVHX0NBTExCQUNLIiB9LAotCSAgICB7IERUX0hQX0RFQlVHX0NBTExCQUNLX0JPUiwgIkhQX0RFQlVHX0NBTExCQUNLX0JPUiIgfSwKLQkgICAgeyBEVF9IUF9OT19FTlZWQVIsICJIUF9OT19FTlZWQVIiIH0sCi0JICAgIHsgRFRfSFBfQklORF9OT1csICJIUF9CSU5EX05PVyIgfSwKLQkgICAgeyBEVF9IUF9CSU5EX05PTkZBVEFMLCAiSFBfQklORF9OT05GQVRBTCIgfSwKLQkgICAgeyBEVF9IUF9CSU5EX1ZFUkJPU0UsICJIUF9CSU5EX1ZFUkJPU0UiIH0sCi0JICAgIHsgRFRfSFBfQklORF9SRVNUUklDVEVELCAiSFBfQklORF9SRVNUUklDVEVEIiB9LAotCSAgICB7IERUX0hQX0JJTkRfU1lNQk9MSUMsICJIUF9CSU5EX1NZTUJPTElDIiB9LAotCSAgICB7IERUX0hQX1JQQVRIX0ZJUlNULCAiSFBfUlBBVEhfRklSU1QiIH0sCi0JICAgIHsgRFRfSFBfQklORF9ERVBUSF9GSVJTVCwgIkhQX0JJTkRfREVQVEhfRklSU1QiIH0KLQkgIH07Ci0JaW50IGZpcnN0ID0gMTsKLQlpbnQgY250OwotCWxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZsYWdzKSAvIHNpemVvZiAoZmxhZ3NbMF0pOyArK2NudCkKLQkgIGlmICh2YWwgJiBmbGFnc1tjbnRdLmJpdCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGlmICghIGZpcnN0KQotICAgICAgICAgICAgICAgcHV0Y2hhciAoJyAnKTsKLSAgICAgICAgICAgICBmcHV0cyAoZmxhZ3NbY250XS5zdHIsIHN0ZG91dCk7Ci0gICAgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICAgICAgIHZhbCBePSBmbGFnc1tjbnRdLmJpdDsKLSAgICAgICAgICAgfQotCWlmICh2YWwgIT0gMCB8fCBmaXJzdCkKLQkgIHByaW50ZiAoIiVzJSNseCIsIGZpcnN0ID8gIiIgOiAiICIsIHZhbCk7Ci0JcHV0cyAoIiIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRmICgiJSNseFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF8zMmJpdF9keW5hbWljX3NlZ21lbnQgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9FeHRlcm5hbF9EeW4gKiBlZHluOwotICBFbGZfSW50ZXJuYWxfRHluICogICBlbnRyeTsKLSAgYmZkX3NpemVfdHlwZSAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUsCi0JCSAgZWR5biwgRWxmMzJfRXh0ZXJuYWxfRHluICosICJkeW5hbWljIHNlZ21lbnQiKTsKLQotICAvKiBTR0kncyBFTEYgaGFzIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBpbiB0aGUgRFlOQU1JQyBzZWdtZW50LiAgRGV0ZXJtaW5lCi0gICAgIGhvdyBsYXJnZSB0aGlzIC5keW5hbWljIGlzIG5vdy4gIFdlIGNhbiBkbyB0aGlzIGV2ZW4gYmVmb3JlIHRoZSBieXRlCi0gICAgIHN3YXBwaW5nIHNpbmNlIHRoZSBEVF9OVUxMIHRhZyBpcyByZWNvZ25pemFibGUuICAqLwotICBkeW5hbWljX3NpemUgPSAwOwotICB3aGlsZSAoKihFbGYzMl9Xb3JkICopIGVkeW4gW2R5bmFtaWNfc2l6ZSsrXS5kX3RhZyAhPSBEVF9OVUxMKQotICAgIDsKLQotICBkeW5hbWljX3NlZ21lbnQgPSAoRWxmX0ludGVybmFsX0R5biAqKQotICAgIG1hbGxvYyAoZHluYW1pY19zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfRHluKSk7Ci0KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlZHluKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKLSAgICAgICBpIDwgZHluYW1pY19zaXplOwotICAgICAgIGkgKyssIGVudHJ5ICsrKQotICAgIHsKLSAgICAgIGVudHJ5LT5kX3RhZyAgICAgID0gQllURV9HRVQgKGVkeW4gW2ldLmRfdGFnKTsKLSAgICAgIGVudHJ5LT5kX3VuLmRfdmFsID0gQllURV9HRVQgKGVkeW4gW2ldLmRfdW4uZF92YWwpOwotICAgIH0KLQotICBmcmVlIChlZHluKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX0R5biAqIGVkeW47Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiAgIGVudHJ5OwotICBiZmRfc2l6ZV90eXBlICAgICAgICBpOwotCi0gIEdFVF9EQVRBX0FMTE9DIChkeW5hbWljX2FkZHIsIGR5bmFtaWNfc2l6ZSwKLQkJICBlZHluLCBFbGY2NF9FeHRlcm5hbF9EeW4gKiwgImR5bmFtaWMgc2VnbWVudCIpOwotCi0gIC8qIFNHSSdzIEVMRiBoYXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBEWU5BTUlDIHNlZ21lbnQuICBEZXRlcm1pbmUKLSAgICAgaG93IGxhcmdlIHRoaXMgLmR5bmFtaWMgaXMgbm93LiAgV2UgY2FuIGRvIHRoaXMgZXZlbiBiZWZvcmUgdGhlIGJ5dGUKLSAgICAgc3dhcHBpbmcgc2luY2UgdGhlIERUX05VTEwgdGFnIGlzIHJlY29nbml6YWJsZS4gICovCi0gIGR5bmFtaWNfc2l6ZSA9IDA7Ci0gIHdoaWxlICgqKGJmZF92bWEgKikgZWR5biBbZHluYW1pY19zaXplICsrXS5kX3RhZyAhPSBEVF9OVUxMKQotICAgIDsKLQotICBkeW5hbWljX3NlZ21lbnQgPSAoRWxmX0ludGVybmFsX0R5biAqKQotICAgIG1hbGxvYyAoZHluYW1pY19zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfRHluKSk7Ci0KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlZHluKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKLSAgICAgICBpIDwgZHluYW1pY19zaXplOwotICAgICAgIGkgKyssIGVudHJ5ICsrKQotICAgIHsKLSAgICAgIGVudHJ5LT5kX3RhZyAgICAgID0gQllURV9HRVQ4IChlZHluIFtpXS5kX3RhZyk7Ci0gICAgICBlbnRyeS0+ZF91bi5kX3ZhbCA9IEJZVEVfR0VUOCAoZWR5biBbaV0uZF91bi5kX3ZhbCk7Ci0gICAgfQotCi0gIGZyZWUgKGVkeW4pOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBhbmQgZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGR5bmFtaWMgc2VnbWVudC4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLSAgYmZkX3NpemVfdHlwZSAgICAgIGk7Ci0KLSAgaWYgKGR5bmFtaWNfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkb19keW5hbWljKQotCXByaW50ZiAoXygiXG5UaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBpZiAoISBnZXRfMzJiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAoZmlsZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltYm9scyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotCSAgIGkgPCBkeW5hbWljX3NpemU7Ci0JICAgKytpLCArKyBlbnRyeSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkgIGlmIChlbnRyeS0+ZF90YWcgIT0gRFRfU1lNVEFCKQotCSAgICBjb250aW51ZTsKLQotCSAgZHluYW1pY19pbmZvW0RUX1NZTVRBQl0gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgLyogU2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZyB0aGUgc3ltYm9sIHRhYmxlIGlzLAotCSAgICAgd2UgZGVmYXVsdCB0byByZWFkaW5nIGluIHRoZSBlbnRpcmUgZmlsZSAoISkgYW5kCi0JICAgICBwcm9jZXNzaW5nIHRoYXQuICBUaGlzIGlzIG92ZXJraWxsLCBJIGtub3csIGJ1dCBpdAotCSAgICAgc2hvdWxkIHdvcmsuICovCi0JICBvZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCi0JICBpZiAoZnNlZWsgKGZpbGUsIDAsIFNFRUtfRU5EKSkKLQkgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIGVuZCBvZiBmaWxlISIpKTsKLQotCSAgaWYgKGlzXzMyYml0X2VsZikKLQkgICAgbnVtX2R5bmFtaWNfc3ltcyA9IChmdGVsbCAoZmlsZSkgLSBvZmZzZXQpIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCSAgZWxzZQotCSAgICBudW1fZHluYW1pY19zeW1zID0gKGZ0ZWxsIChmaWxlKSAtIG9mZnNldCkgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSk7Ci0KLQkgIGlmIChudW1fZHluYW1pY19zeW1zIDwgMSkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBsb2FkXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgZHluYW1pY19zeW1ib2xzID0gR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBvZmZzZXQsIG51bV9keW5hbWljX3N5bXMpOwotCX0KLSAgICB9Ci0KLSAgLyogU2ltaWxhcmx5IGZpbmQgYSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCSAgbG9uZyAgICAgICAgICBzdHJfdGFiX2xlbjsKLQotCSAgaWYgKGVudHJ5LT5kX3RhZyAhPSBEVF9TVFJUQUIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBkeW5hbWljX2luZm9bRFRfU1RSVEFCXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICAvKiBTaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnIHRoZSBzdHJpbmcgdGFibGUgaXMsCi0JICAgICB3ZSBkZWZhdWx0IHRvIHJlYWRpbmcgaW4gdGhlIGVudGlyZSBmaWxlICghKSBhbmQKLQkgICAgIHByb2Nlc3NpbmcgdGhhdC4gIFRoaXMgaXMgb3ZlcmtpbGwsIEkga25vdywgYnV0IGl0Ci0JICAgICBzaG91bGQgd29yay4gKi8KLQotCSAgb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQkgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19FTkQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIpKTsKLQkgIHN0cl90YWJfbGVuID0gZnRlbGwgKGZpbGUpIC0gb2Zmc2V0OwotCi0JICBpZiAoc3RyX3RhYl9sZW4gPCAxKQotCSAgICB7Ci0JICAgICAgZXJyb3IKLQkJKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBzdHJfdGFiX2xlbiwgZHluYW1pY19zdHJpbmdzLCBjaGFyICosCi0JCQkgICJkeW5hbWljIHN0cmluZyB0YWJsZSIpOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFuZCBmaW5kIHRoZSBzeW1pbmZvIHNlY3Rpb24gaWYgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzeW1pbnN6ID0gMDsKLQotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5FTlQpCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiB0aGVzZSBicmFjZXMgYXJlIG5lY2Vzc2FyeSB0byBhdm9pZCBhIHN5bnRheAotCQkgZXJyb3IgZnJvbSB0aGUgU3VuT1M0IEMgY29tcGlsZXIuICAqLwotCSAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltaW5mbykgPT0gZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBlbHNlIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5TWikKLQkgICAgc3ltaW5zeiA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCSAgZWxzZSBpZiAoZW50cnktPmRfdGFnID09IERUX1NZTUlORk8pCi0JICAgIGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCX0KLQotICAgICAgaWYgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgIT0gMCAmJiBzeW1pbnN6ICE9IDApCi0JewotCSAgRWxmX0V4dGVybmFsX1N5bWluZm8gKiBleHRzeW1pbmZvOwotCSAgRWxmX0ludGVybmFsX1N5bWluZm8gKiBzeW1pbmZvOwotCi0JICAvKiBUaGVyZSBpcyBhIHN5bWluZm8gc2VjdGlvbi4gIFJlYWQgdGhlIGRhdGEuICAqLwotCSAgR0VUX0RBVEFfQUxMT0MgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQsIHN5bWluc3osIGV4dHN5bWluZm8sCi0JCQkgIEVsZl9FeHRlcm5hbF9TeW1pbmZvICosICJzeW1ib2wgaW5mb3JtYXRpb24iKTsKLQotCSAgZHluYW1pY19zeW1pbmZvID0gKEVsZl9JbnRlcm5hbF9TeW1pbmZvICopIG1hbGxvYyAoc3ltaW5zeik7Ci0JICBpZiAoZHluYW1pY19zeW1pbmZvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGR5bmFtaWNfc3ltaW5mb19uZW50ID0gc3ltaW5zeiAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bWluZm8pOwotCSAgZm9yIChpID0gMCwgc3ltaW5mbyA9IGR5bmFtaWNfc3ltaW5mbzsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OwotCSAgICAgICArK2ksICsrc3ltaW5mbykKLQkgICAgewotCSAgICAgIHN5bWluZm8tPnNpX2JvdW5kdG8gPSBCWVRFX0dFVCAoZXh0c3ltaW5mb1tpXS5zaV9ib3VuZHRvKTsKLQkgICAgICBzeW1pbmZvLT5zaV9mbGFncyA9IEJZVEVfR0VUIChleHRzeW1pbmZvW2ldLnNpX2ZsYWdzKTsKLQkgICAgfQotCi0JICBmcmVlIChleHRzeW1pbmZvKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkb19keW5hbWljICYmIGR5bmFtaWNfYWRkcikKLSAgICBwcmludGYgKF8oIlxuRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIiksCi0JICAgIGR5bmFtaWNfYWRkciwgKGxvbmcpIGR5bmFtaWNfc2l6ZSk7Ci0gIGlmIChkb19keW5hbWljKQotICAgIHByaW50ZiAoXygiICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZVxuIikpOwotCi0gIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotICAgICAgIGkgPCBkeW5hbWljX3NpemU7Ci0gICAgICAgaSsrLCBlbnRyeSArKykKLSAgICB7Ci0gICAgICBpZiAoZG9fZHluYW1pYykKLQlwcmludGYgKF8oIiAgMHglLTguOGx4ICglcyklKnMiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5kX3RhZywKLQkJZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdGFnKSwKLQkJMjcgLSBzdHJsZW4gKGdldF9keW5hbWljX3R5cGUgKGVudHJ5LT5kX3RhZykpLAotCQkiICIpOwotCi0gICAgICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLQl7Ci0JY2FzZSBEVF9BVVhJTElBUlk6Ci0JY2FzZSBEVF9GSUxURVI6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfQVVYSUxJQVJZKQotCQlwcmludGYgKF8oIkF1eGlsaWFyeSBsaWJyYXJ5IikpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmIChfKCJGaWx0ZXIgbGlicmFyeSIpKTsKLQotCSAgICAgIGlmIChkeW5hbWljX3N0cmluZ3MpCi0JCXByaW50ZiAoIjogWyVzXVxuIiwgZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWwpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiOiAlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkVBVFVSRV8xOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkZsYWdzOiIpKTsKLQkgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQkJcHJpbnRmIChfKCIgTm9uZVxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCQkgIGlmICh2YWwgJiBEVEZfMV9QQVJJTklUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgUEFSSU5JVCIpOwotCQkgICAgICB2YWwgXj0gRFRGXzFfUEFSSU5JVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICE9IDApCi0JCSAgICBwcmludGYgKCIgJWx4IiwgdmFsKTsKLQkJICBwdXRzICgiIik7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1BPU0ZMQUdfMToKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQkJICBpZiAodmFsICYgREZfUDFfTEFaWUxPQUQpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBMQVpZTE9BRCIpOwotCQkgICAgICB2YWwgXj0gREZfUDFfTEFaWUxPQUQ7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGX1AxX0dST1VQUEVSTSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdST1VQUEVSTSIpOwotCQkgICAgICB2YWwgXj0gREZfUDFfR1JPVVBQRVJNOwotCQkgICAgfQotCQkgIGlmICh2YWwgIT0gMCkKLQkJICAgIHByaW50ZiAoIiAlbHgiLCB2YWwpOwotCQkgIHB1dHMgKCIiKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkxBR1NfMToKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQkJICBpZiAodmFsICYgREZfMV9OT1cpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBOT1ciKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9XOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0dMT0JBTCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdMT0JBTCIpOwotCQkgICAgICB2YWwgXj0gREZfMV9HTE9CQUw7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfR1JPVVApCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBHUk9VUCIpOwotCQkgICAgICB2YWwgXj0gREZfMV9HUk9VUDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9OT0RFTEVURSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE5PREVMRVRFIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX05PREVMRVRFOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0xPQURGTFRSKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgTE9BREZMVFIiKTsKLQkJICAgICAgdmFsIF49IERGXzFfTE9BREZMVFI7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfSU5JVEZJUlNUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgSU5JVEZJUlNUIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0lOSVRGSVJTVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9OT09QRU4pCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBOT09QRU4iKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9PUEVOOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX09SSUdJTikKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE9SSUdJTiIpOwotCQkgICAgICB2YWwgXj0gREZfMV9PUklHSU47Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfRElSRUNUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgRElSRUNUIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0RJUkVDVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9UUkFOUykKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIFRSQU5TIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX1RSQU5TOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0lOVEVSUE9TRSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIElOVEVSUE9TRSIpOwotCQkgICAgICB2YWwgXj0gREZfMV9JTlRFUlBPU0U7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAhPSAwKQotCQkgICAgcHJpbnRmICgiICVseCIsIHZhbCk7Ci0JCSAgcHV0cyAoIiIpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QTFRSRUw6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgcHV0cyAoZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdW4uZF92YWwpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9OVUxMCToKLQljYXNlIERUX05FRURFRAk6Ci0JY2FzZSBEVF9QTFRHT1QJOgotCWNhc2UgRFRfSEFTSAk6Ci0JY2FzZSBEVF9TVFJUQUIJOgotCWNhc2UgRFRfU1lNVEFCCToKLQljYXNlIERUX1JFTEEJOgotCWNhc2UgRFRfSU5JVAk6Ci0JY2FzZSBEVF9GSU5JCToKLQljYXNlIERUX1NPTkFNRQk6Ci0JY2FzZSBEVF9SUEFUSAk6Ci0JY2FzZSBEVF9TWU1CT0xJQzoKLQljYXNlIERUX1JFTAk6Ci0JY2FzZSBEVF9ERUJVRwk6Ci0JY2FzZSBEVF9URVhUUkVMCToKLQljYXNlIERUX0pNUFJFTAk6Ci0JICBkeW5hbWljX2luZm9bZW50cnktPmRfdGFnXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGNoYXIgKiBuYW1lOwotCi0JICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyA9PSBOVUxMKQotCQluYW1lID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCW5hbWUgPSBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgICAgIGlmIChuYW1lKQotCQl7Ci0JCSAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERUX05FRURFRDoKLQkJICAgICAgcHJpbnRmIChfKCJTaGFyZWQgbGlicmFyeTogWyVzXSIpLCBuYW1lKTsKLQotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCBwcm9ncmFtX2ludGVycHJldGVyKSkKLQkJCXByaW50ZiAoIlxuIik7Ci0JCSAgICAgIGVsc2UKLQkJCXByaW50ZiAoXygiIHByb2dyYW0gaW50ZXJwcmV0ZXJcbiIpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFRfU09OQU1FOgotCQkgICAgICBwcmludGYgKF8oIkxpYnJhcnkgc29uYW1lOiBbJXNdXG4iKSwgbmFtZSk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIERUX1JQQVRIOgotCQkgICAgICBwcmludGYgKF8oIkxpYnJhcnkgcnBhdGg6IFslc11cbiIpLCBuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QTFRSRUxTWjoKLQljYXNlIERUX1JFTEFTWgk6Ci0JY2FzZSBEVF9TVFJTWgk6Ci0JY2FzZSBEVF9SRUxTWgk6Ci0JY2FzZSBEVF9SRUxBRU5UCToKLQljYXNlIERUX1NZTUVOVAk6Ci0JY2FzZSBEVF9SRUxFTlQJOgotCWNhc2UgRFRfUExUUEFEU1o6Ci0JY2FzZSBEVF9NT1ZFRU5UCToKLQljYXNlIERUX01PVkVTWgk6Ci0JY2FzZSBEVF9JTklUX0FSUkFZU1o6Ci0JY2FzZSBEVF9GSU5JX0FSUkFZU1o6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgcHJpbnRmICgiJWx1IChieXRlcylcbiIsICh1bnNpZ25lZCBsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFRfVkVSREVGTlVNOgotCWNhc2UgRFRfVkVSTkVFRE5VTToKLQljYXNlIERUX1JFTEFDT1VOVDoKLQljYXNlIERUX1JFTENPVU5UOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHByaW50ZiAoIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5kX3VuLmRfdmFsKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9TWU1JTlNaOgotCWNhc2UgRFRfU1lNSU5FTlQ6Ci0JY2FzZSBEVF9TWU1JTkZPOgotCWNhc2UgRFRfVVNFRDoKLQljYXNlIERUX0lOSVRfQVJSQVk6Ci0JY2FzZSBEVF9GSU5JX0FSUkFZOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBpZiAoZHluYW1pY19zdHJpbmdzICE9IE5VTEwgJiYgZW50cnktPmRfdGFnID09IERUX1VTRUQpCi0JCXsKLQkJICBjaGFyICogbmFtZTsKLQotCQkgIG5hbWUgPSBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCQkgIGlmICgqIG5hbWUpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoXygiTm90IG5lZWRlZCBvYmplY3Q6IFslc11cbiIpLCBuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9CSU5EX05PVzoKLQkgIC8qIFRoZSB2YWx1ZSBvZiB0aGlzIGVudHJ5IGlzIGlnbm9yZWQuICAqLwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKChlbnRyeS0+ZF90YWcgPj0gRFRfVkVSU1lNKSAmJiAoZW50cnktPmRfdGFnIDw9IERUX1ZFUk5FRUROVU0pKQotCSAgICB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKGVudHJ5LT5kX3RhZyldID0KLQkgICAgICBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCQl7Ci0JCWNhc2UgRU1fTUlQUzoKLQkJY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkJICBkeW5hbWljX3NlZ21lbnRfbWlwc192YWwgKGVudHJ5KTsKLQkJICBicmVhazsKLQkJY2FzZSBFTV9QQVJJU0M6Ci0JCSAgZHluYW1pY19zZWdtZW50X3BhcmlzY192YWwgKGVudHJ5KTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBwcmludGYgKCIlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF9wdHIpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF92ZXJfZmxhZ3MgKGZsYWdzKQotICAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBidWZmWzBdID0gMDsKLQotICBpZiAoZmxhZ3MgPT0gMCkKLSAgICByZXR1cm4gXygibm9uZSIpOwotCi0gIGlmIChmbGFncyAmIFZFUl9GTEdfQkFTRSkKLSAgICBzdHJjYXQgKGJ1ZmYsICJCQVNFICIpOwotCi0gIGlmIChmbGFncyAmIFZFUl9GTEdfV0VBSykKLSAgICB7Ci0gICAgICBpZiAoZmxhZ3MgJiBWRVJfRkxHX0JBU0UpCi0Jc3RyY2F0IChidWZmLCAifCAiKTsKLQotICAgICAgc3RyY2F0IChidWZmLCAiV0VBSyAiKTsKLSAgICB9Ci0KLSAgaWYgKGZsYWdzICYgfihWRVJfRkxHX0JBU0UgfCBWRVJfRkxHX1dFQUspKQotICAgIHN0cmNhdCAoYnVmZiwgInwgPHVua25vd24+Iik7Ci0KLSAgcmV0dXJuIGJ1ZmY7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZXJzaW9uIHNlY3Rpb25zLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfdmVyc2lvbl9zZWN0aW9ucyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICB1bnNpZ25lZCAgIGk7Ci0gIGludCAgICAgICAgZm91bmQgPSAwOwotCi0gIGlmICghIGRvX3ZlcnNpb24pCi0gICAgcmV0dXJuIDE7Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkrKywgc2VjdGlvbiArKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNlY3Rpb24tPnNoX3R5cGUpCi0JewotCWNhc2UgU0hUX0dOVV92ZXJkZWY6Ci0JICB7Ci0JICAgIEVsZl9FeHRlcm5hbF9WZXJkZWYgKiBlZGVmczsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGlkeDsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGNudDsKLQotCSAgICBmb3VuZCA9IDE7Ci0KLQkgICAgcHJpbnRmCi0JICAgICAgKF8oIlxuVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gJyVzJyBjb250YWlucyAlbGQgZW50cmllczpcbiIpLAotCSAgICAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLCBzZWN0aW9uLT5zaF9pbmZvKTsKLQotCSAgICBwcmludGYgKF8oIiAgQWRkcjogMHgiKSk7Ci0JICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOwotCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbms6ICVseCAoJXMpXG4iKSwKLQkJICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX2xpbmssCi0JCSAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbmspKTsKLQotCSAgICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9zaXplLAotCQkJICAgIGVkZWZzLCBFbGZfRXh0ZXJuYWxfVmVyZGVmICosCi0JCQkgICAgInZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIik7Ci0KLQkgICAgZm9yIChpZHggPSBjbnQgPSAwOyBjbnQgPCBzZWN0aW9uLT5zaF9pbmZvOyArKyBjbnQpCi0JICAgICAgewotCQljaGFyICogICAgICAgICAgICAgICAgIHZzdGFydDsKLQkJRWxmX0V4dGVybmFsX1ZlcmRlZiAqICBlZGVmOwotCQlFbGZfSW50ZXJuYWxfVmVyZGVmICAgIGVudDsKLQkJRWxmX0V4dGVybmFsX1ZlcmRhdXggKiBlYXV4OwotCQlFbGZfSW50ZXJuYWxfVmVyZGF1eCAgIGF1eDsKLQkJaW50ICAgICAgICAgICAgICAgICAgICBqOwotCQlpbnQgICAgICAgICAgICAgICAgICAgIGlzdW07Ci0KLQkJdnN0YXJ0ID0gKChjaGFyICopIGVkZWZzKSArIGlkeDsKLQotCQllZGVmID0gKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgdnN0YXJ0OwotCi0JCWVudC52ZF92ZXJzaW9uID0gQllURV9HRVQgKGVkZWYtPnZkX3ZlcnNpb24pOwotCQllbnQudmRfZmxhZ3MgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9mbGFncyk7Ci0JCWVudC52ZF9uZHggICAgID0gQllURV9HRVQgKGVkZWYtPnZkX25keCk7Ci0JCWVudC52ZF9jbnQgICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2NudCk7Ci0JCWVudC52ZF9oYXNoICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2hhc2gpOwotCQllbnQudmRfYXV4ICAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9hdXgpOwotCQllbnQudmRfbmV4dCAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9uZXh0KTsKLQotCQlwcmludGYgKF8oIiAgJSMwNng6IFJldjogJWQgIEZsYWdzOiAlcyIpLAotCQkJaWR4LCBlbnQudmRfdmVyc2lvbiwgZ2V0X3Zlcl9mbGFncyAoZW50LnZkX2ZsYWdzKSk7Ci0KLQkJcHJpbnRmIChfKCIgIEluZGV4OiAlZCAgQ250OiAlZCAgIiksCi0JCQllbnQudmRfbmR4LCBlbnQudmRfY250KTsKLQotCQl2c3RhcnQgKz0gZW50LnZkX2F1eDsKLQotCQllYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHZzdGFydDsKLQotCQlhdXgudmRhX25hbWUgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25hbWUpOwotCQlhdXgudmRhX25leHQgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25leHQpOwotCi0JCWlmIChkeW5hbWljX3N0cmluZ3MpCi0JCSAgcHJpbnRmIChfKCJOYW1lOiAlc1xuIiksIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52ZGFfbmFtZSk7Ci0JCWVsc2UKLQkJICBwcmludGYgKF8oIk5hbWUgaW5kZXg6ICVsZFxuIiksIGF1eC52ZGFfbmFtZSk7Ci0KLQkJaXN1bSA9IGlkeCArIGVudC52ZF9hdXg7Ci0KLQkJZm9yIChqID0gMTsgaiA8IGVudC52ZF9jbnQ7IGogKyspCi0JCSAgewotCQkgICAgaXN1bSAgICs9IGF1eC52ZGFfbmV4dDsKLQkJICAgIHZzdGFydCArPSBhdXgudmRhX25leHQ7Ci0KLQkJICAgIGVhdXggPSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgdnN0YXJ0OwotCi0JCSAgICBhdXgudmRhX25hbWUgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25hbWUpOwotCQkgICAgYXV4LnZkYV9uZXh0ID0gQllURV9HRVQgKGVhdXgtPnZkYV9uZXh0KTsKLQotCQkgICAgaWYgKGR5bmFtaWNfc3RyaW5ncykKLQkJICAgICAgcHJpbnRmIChfKCIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iKSwKLQkJCSAgICAgIGlzdW0sIGosIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52ZGFfbmFtZSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogUGFyZW50ICVkLCBuYW1lIGluZGV4OiAlbGRcbiIpLAotCQkJICAgICAgaXN1bSwgaiwgYXV4LnZkYV9uYW1lKTsKLQkJICB9Ci0KLQkJaWR4ICs9IGVudC52ZF9uZXh0OwotCSAgICAgIH0KLQotCSAgICBmcmVlIChlZGVmcyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0dOVV92ZXJuZWVkOgotCSAgewotCSAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqICBlbmVlZDsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgaWR4OwotCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbnQ7Ci0KLQkgICAgZm91bmQgPSAxOwotCi0JICAgIHByaW50ZiAoXygiXG5WZXJzaW9uIG5lZWRzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlbGQgZW50cmllczpcbiIpLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgc2VjdGlvbi0+c2hfaW5mbyk7Ci0KLQkgICAgcHJpbnRmIChfKCIgQWRkcjogMHgiKSk7Ci0JICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOwotCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbmsgdG8gc2VjdGlvbjogJWxkICglcylcbiIpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfbGluaywKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluaykpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCi0JCQkgICAgZW5lZWQsIEVsZl9FeHRlcm5hbF9WZXJuZWVkICosCi0JCQkgICAgInZlcnNpb24gbmVlZCBzZWN0aW9uIik7Ci0KLQkgICAgZm9yIChpZHggPSBjbnQgPSAwOyBjbnQgPCBzZWN0aW9uLT5zaF9pbmZvOyArK2NudCkKLQkgICAgICB7Ci0JCUVsZl9FeHRlcm5hbF9WZXJuZWVkICogZW50cnk7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuZWVkICAgICBlbnQ7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgICBqOwotCQlpbnQgICAgICAgICAgICAgICAgICAgICAgaXN1bTsKLQkJY2hhciAqICAgICAgICAgICAgICAgICAgIHZzdGFydDsKLQotCQl2c3RhcnQgPSAoKGNoYXIgKikgZW5lZWQpICsgaWR4OwotCi0JCWVudHJ5ID0gKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHZzdGFydDsKLQotCQllbnQudm5fdmVyc2lvbiA9IEJZVEVfR0VUIChlbnRyeS0+dm5fdmVyc2lvbik7Ci0JCWVudC52bl9jbnQgICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9jbnQpOwotCQllbnQudm5fZmlsZSAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fZmlsZSk7Ci0JCWVudC52bl9hdXggICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9hdXgpOwotCQllbnQudm5fbmV4dCAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fbmV4dCk7Ci0KLQkJcHJpbnRmIChfKCIgICUjMDZ4OiBWZXJzaW9uOiAlZCIpLCBpZHgsIGVudC52bl92ZXJzaW9uKTsKLQotCQlpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgIHByaW50ZiAoXygiICBGaWxlOiAlcyIpLCBkeW5hbWljX3N0cmluZ3MgKyBlbnQudm5fZmlsZSk7Ci0JCWVsc2UKLQkJICBwcmludGYgKF8oIiAgRmlsZTogJWx4IiksIGVudC52bl9maWxlKTsKLQotCQlwcmludGYgKF8oIiAgQ250OiAlZFxuIiksIGVudC52bl9jbnQpOwotCi0JCXZzdGFydCArPSBlbnQudm5fYXV4OwotCi0JCWZvciAoaiA9IDAsIGlzdW0gPSBpZHggKyBlbnQudm5fYXV4OyBqIDwgZW50LnZuX2NudDsgKytqKQotCQkgIHsKLQkJICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICogZWF1eDsKLQkJICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgYXV4OwotCi0JCSAgICBlYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopIHZzdGFydDsKLQotCQkgICAgYXV4LnZuYV9oYXNoICA9IEJZVEVfR0VUIChlYXV4LT52bmFfaGFzaCk7Ci0JCSAgICBhdXgudm5hX2ZsYWdzID0gQllURV9HRVQgKGVhdXgtPnZuYV9mbGFncyk7Ci0JCSAgICBhdXgudm5hX290aGVyID0gQllURV9HRVQgKGVhdXgtPnZuYV9vdGhlcik7Ci0JCSAgICBhdXgudm5hX25hbWUgID0gQllURV9HRVQgKGVhdXgtPnZuYV9uYW1lKTsKLQkJICAgIGF1eC52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX25leHQpOwotCi0JCSAgICBpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IE5hbWU6ICVzIiksCi0JCQkgICAgICBpc3VtLCBkeW5hbWljX3N0cmluZ3MgKyBhdXgudm5hX25hbWUpOwotCQkgICAgZWxzZQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IE5hbWUgaW5kZXg6ICVseCIpLAotCQkJICAgICAgaXN1bSwgYXV4LnZuYV9uYW1lKTsKLQotCQkgICAgcHJpbnRmIChfKCIgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWRcbiIpLAotCQkJICAgIGdldF92ZXJfZmxhZ3MgKGF1eC52bmFfZmxhZ3MpLCBhdXgudm5hX290aGVyKTsKLQotCQkgICAgaXN1bSAgICs9IGF1eC52bmFfbmV4dDsKLQkJICAgIHZzdGFydCArPSBhdXgudm5hX25leHQ7Ci0JCSAgfQotCi0JCWlkeCArPSBlbnQudm5fbmV4dDsKLQkgICAgICB9Ci0KLQkgICAgZnJlZSAoZW5lZWQpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9HTlVfdmVyc3ltOgotCSAgewotCSAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICAgICAgbGlua19zZWN0aW9uOwotCSAgICBpbnQgICAgICAgICAgICAgIAkJdG90YWw7Ci0JICAgIGludCAgICAgICAgICAgICAgCQljbnQ7Ci0JICAgIHVuc2lnbmVkIGNoYXIgKiAJCWVkYXRhOwotCSAgICB1bnNpZ25lZCBzaG9ydCAqIAkJZGF0YTsKLQkgICAgY2hhciAqICAgICAgICAgICAJCXN0cnRhYjsKLQkgICAgRWxmX0ludGVybmFsX1N5bSAqIAkJc3ltYm9sczsKLQkgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgICAgIHN0cmluZ19zZWM7Ci0KLQkgICAgbGlua19zZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluazsKLQkgICAgdG90YWwgPSBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQotCSAgICBmb3VuZCA9IDE7Ci0KLQkgICAgc3ltYm9scyA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgbGlua19zZWN0aW9uLT5zaF9vZmZzZXQsCi0JCQkJICAgICAgIGxpbmtfc2VjdGlvbi0+c2hfc2l6ZSAvIGxpbmtfc2VjdGlvbi0+c2hfZW50c2l6ZSk7Ci0KLQkgICAgc3RyaW5nX3NlYyA9IHNlY3Rpb25faGVhZGVycyArIGxpbmtfc2VjdGlvbi0+c2hfbGluazsKLQotCSAgICBHRVRfREFUQV9BTExPQyAoc3RyaW5nX3NlYy0+c2hfb2Zmc2V0LCBzdHJpbmdfc2VjLT5zaF9zaXplLAotCQkJICAgIHN0cnRhYiwgY2hhciAqLCAidmVyc2lvbiBzdHJpbmcgdGFibGUiKTsKLQotCSAgICBwcmludGYgKF8oIlxuVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiksCi0JCSAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLCB0b3RhbCk7Ci0KLQkgICAgcHJpbnRmIChfKCIgQWRkcjogIikpOwotCSAgICBwcmludGZfdm1hIChzZWN0aW9uLT5zaF9hZGRyKTsKLQkgICAgcHJpbnRmIChfKCIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIiksCi0JCSAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9saW5rLAotCQkgICAgU0VDVElPTl9OQU1FIChsaW5rX3NlY3Rpb24pKTsKLQotCSAgICBHRVRfREFUQV9BTExPQyAodmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXQotCQkJICAgIC0gbG9hZGFkZHIsCi0JCQkgICAgdG90YWwgKiBzaXplb2YgKHNob3J0KSwgZWRhdGEsCi0JCQkgICAgdW5zaWduZWQgY2hhciAqLCAidmVyc2lvbiBzeW1ib2wgZGF0YSIpOwotCi0JICAgIGRhdGEgPSAodW5zaWduZWQgc2hvcnQgKikgbWFsbG9jICh0b3RhbCAqIHNpemVvZiAoc2hvcnQpKTsKLQotCSAgICBmb3IgKGNudCA9IHRvdGFsOyBjbnQgLS07KQotCSAgICAgIGRhdGEgW2NudF0gPSBieXRlX2dldCAoZWRhdGEgKyBjbnQgKiBzaXplb2YgKHNob3J0KSwKLQkJCQkgICAgIHNpemVvZiAoc2hvcnQpKTsKLQotCSAgICBmcmVlIChlZGF0YSk7Ci0KLQkgICAgZm9yIChjbnQgPSAwOyBjbnQgPCB0b3RhbDsgY250ICs9IDQpCi0JICAgICAgewotCQlpbnQgaiwgbm47Ci0KLQkJcHJpbnRmICgiICAlMDN4OiIsIGNudCk7Ci0KLQkJZm9yIChqID0gMDsgKGogPCA0KSAmJiAoY250ICsgaikgPCB0b3RhbDsgKytqKQotCQkgIHN3aXRjaCAoZGF0YSBbY250ICsgal0pCi0JCSAgICB7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIGZwdXRzIChfKCIgICAwICgqbG9jYWwqKSAgICAiKSwgc3Rkb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgMToKLQkJICAgICAgZnB1dHMgKF8oIiAgIDEgKCpnbG9iYWwqKSAgICIpLCBzdGRvdXQpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbm4gPSBwcmludGYgKCIlNHglYyIsIGRhdGEgW2NudCArIGpdICYgMHg3ZmZmLAotCQkJCSAgIGRhdGEgW2NudCArIGpdICYgMHg4MDAwID8gJ2gnIDogJyAnKTsKLQotCQkgICAgICBpZiAoc3ltYm9scyBbY250ICsgal0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFCi0JCQkgICYmIHNlY3Rpb25faGVhZGVyc1tzeW1ib2xzIFtjbnQgKyBqXS5zdF9zaG5keF0uc2hfdHlwZQotCQkJICA9PSBTSFRfTk9CSVRTKQotCQkJewotCQkJICAvKiBXZSBtdXN0IHRlc3QgYm90aC4gICovCi0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICAgICBpdm47Ci0JCQkgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBvZmZzZXQ7Ci0KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJORUVEKV0KLQkJCSAgICAtIGxvYWRhZGRyOwotCi0JCQkgIGRvCi0JCQkgICAgewotCQkJICAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgICBldm47Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgIGV2bmE7Ci0JCQkgICAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAgICAgaXZuYTsKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICB2bmFfb2ZmOwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldm4sICJ2ZXJzaW9uIG5lZWQiKTsKLQotCQkJICAgICAgaXZuLnZuX2F1eCAgPSBCWVRFX0dFVCAoZXZuLnZuX2F1eCk7Ci0JCQkgICAgICBpdm4udm5fbmV4dCA9IEJZVEVfR0VUIChldm4udm5fbmV4dCk7Ci0KLQkJCSAgICAgIHZuYV9vZmYgPSBvZmZzZXQgKyBpdm4udm5fYXV4OwotCi0JCQkgICAgICBkbwotCQkJCXsKLQkJCQkgIEdFVF9EQVRBICh2bmFfb2ZmLCBldm5hLAotCQkJCQkgICAgInZlcnNpb24gbmVlZCBhdXggKDEpIik7Ci0KLQkJCQkgIGl2bmEudm5hX25leHQgID0gQllURV9HRVQgKGV2bmEudm5hX25leHQpOwotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCi0JCQkJICB2bmFfb2ZmICs9IGl2bmEudm5hX25leHQ7Ci0JCQkJfQotCQkJICAgICAgd2hpbGUgKGl2bmEudm5hX290aGVyICE9IGRhdGEgW2NudCArIGpdCi0JCQkJICAgICAmJiBpdm5hLnZuYV9uZXh0ICE9IDApOwotCi0JCQkgICAgICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gZGF0YSBbY250ICsgal0pCi0JCQkJewotCQkJCSAgaXZuYS52bmFfbmFtZSA9IEJZVEVfR0VUIChldm5hLnZuYV9uYW1lKTsKLQotCQkJCSAgbm4gKz0gcHJpbnRmICgiKCVzJS0qcyIsCi0JCQkJCQlzdHJ0YWIgKyBpdm5hLnZuYV9uYW1lLAotCQkJCQkJMTIgLSBzdHJsZW4gKHN0cnRhYgotCQkJCQkJCSAgICAgKyBpdm5hLnZuYV9uYW1lKSwKLQkJCQkJCSIpIik7Ci0JCQkJICBicmVhazsKLQkJCQl9Ci0JCQkgICAgICBlbHNlIGlmIChpdm4udm5fbmV4dCA9PSAwKQotCQkJCXsKLQkJCQkgIGlmIChkYXRhIFtjbnQgKyBqXSAhPSAweDgwMDEpCi0JCQkJICAgIHsKLQkJCQkgICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICBpdmQ7Ci0JCQkJICAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAgZXZkOwotCi0JCQkJICAgICAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkJCVtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJERUYpXQotCQkJCQktIGxvYWRhZGRyOwotCi0JCQkJICAgICAgZG8KLQkJCQkJewotCQkJCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2ZCwKLQkJCQkJCSAgICAidmVyc2lvbiBkZWZpbml0aW9uIik7Ci0KLQkJCQkJICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0JCQkJCSAgaXZkLnZkX25keCAgPSBCWVRFX0dFVCAoZXZkLnZkX25keCk7Ci0KLQkJCQkJICBvZmZzZXQgKz0gaXZkLnZkX25leHQ7Ci0JCQkJCX0KLQkJCQkgICAgICB3aGlsZSAoaXZkLnZkX25keAotCQkJCQkgICAgICE9IChkYXRhIFtjbnQgKyBqXSAmIDB4N2ZmZikKLQkJCQkJICAgICAmJiBpdmQudmRfbmV4dCAhPSAwKTsKLQotCQkJCSAgICAgIGlmIChpdmQudmRfbmR4Ci0JCQkJCSAgPT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKSkKLQkJCQkJewotCQkJCQkgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJCQkgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICBpdmRhOwotCi0JCQkJCSAgaXZkLnZkX2F1eCA9IEJZVEVfR0VUIChldmQudmRfYXV4KTsKLQotCQkJCQkgIEdFVF9EQVRBIChvZmZzZXQgKyBpdmQudmRfYXV4LCBldmRhLAotCQkJCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24gYXV4Iik7Ci0KLQkJCQkJICBpdmRhLnZkYV9uYW1lID0KLQkJCQkJICAgIEJZVEVfR0VUIChldmRhLnZkYV9uYW1lKTsKLQotCQkJCQkgIG5uICs9Ci0JCQkJCSAgICBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJCSAgICBzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lLAotCQkJCQkJICAgIDEyCi0JCQkJCQkgICAgLSBzdHJsZW4gKHN0cnRhYgotCQkJCQkJCSAgICAgICsgaXZkYS52ZGFfbmFtZSksCi0JCQkJCQkgICAgIikiKTsKLQkJCQkJfQotCQkJCSAgICB9Ci0KLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQlvZmZzZXQgKz0gaXZuLnZuX25leHQ7Ci0JCQkgICAgfQotCQkJICB3aGlsZSAoaXZuLnZuX25leHQpOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChzeW1ib2xzIFtjbnQgKyBqXS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCQl7Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICAgICBpdm47Ci0JCQkgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBvZmZzZXQ7Ci0KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJORUVEKV0KLQkJCSAgICAtIGxvYWRhZGRyOwotCi0JCSAgICAgICAgICBkbwotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgICBpdm5hOwotCQkJICAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgICBldm47Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgIGV2bmE7Ci0JCQkgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgYV9vZmY7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgICAgICBpdm4udm5fYXV4ICA9IEJZVEVfR0VUIChldm4udm5fYXV4KTsKLQkJCSAgICAgIGl2bi52bl9uZXh0ID0gQllURV9HRVQgKGV2bi52bl9uZXh0KTsKLQotCQkJICAgICAgYV9vZmYgPSBvZmZzZXQgKyBpdm4udm5fYXV4OwotCi0JCQkgICAgICBkbwotCQkJCXsKLQkJCQkgIEdFVF9EQVRBIChhX29mZiwgZXZuYSwKLQkJCQkJICAgICJ2ZXJzaW9uIG5lZWQgYXV4ICgyKSIpOwotCi0JCQkJICBpdm5hLnZuYV9uZXh0ICA9IEJZVEVfR0VUIChldm5hLnZuYV9uZXh0KTsKLQkJCQkgIGl2bmEudm5hX290aGVyID0gQllURV9HRVQgKGV2bmEudm5hX290aGVyKTsKLQotCQkJCSAgYV9vZmYgKz0gaXZuYS52bmFfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZuYS52bmFfb3RoZXIgIT0gZGF0YSBbY250ICsgal0KLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSBkYXRhIFtjbnQgKyBqXSkKLQkJCQl7Ci0JCQkJICBpdm5hLnZuYV9uYW1lID0gQllURV9HRVQgKGV2bmEudm5hX25hbWUpOwotCi0JCQkJICBubiArPSBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJCXN0cnRhYiArIGl2bmEudm5hX25hbWUsCi0JCQkJCQkxMiAtIHN0cmxlbiAoc3RydGFiCi0JCQkJCQkJICAgICArIGl2bmEudm5hX25hbWUpLAotCQkJCQkJIikiKTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQotCQkJICAgICAgb2Zmc2V0ICs9IGl2bi52bl9uZXh0OwotCQkJICAgIH0KLQkJCSAgd2hpbGUgKGl2bi52bl9uZXh0KTsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoZGF0YSBbY250ICsgal0gIT0gMHg4MDAxKQotCQkJewotCQkJICBFbGZfSW50ZXJuYWxfVmVyZGVmICBpdmQ7Ci0JCQkgIEVsZl9FeHRlcm5hbF9WZXJkZWYgIGV2ZDsKLQkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgb2Zmc2V0OwotCi0JCQkgIG9mZnNldCA9IHZlcnNpb25faW5mbwotCQkJICAgIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJERUYpXSAtIGxvYWRhZGRyOwotCi0JCQkgIGRvCi0JCQkgICAgewotCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZkLCAidmVyc2lvbiBkZWYiKTsKLQotCQkJICAgICAgaXZkLnZkX25leHQgPSBCWVRFX0dFVCAoZXZkLnZkX25leHQpOwotCQkJICAgICAgaXZkLnZkX25keCAgPSBCWVRFX0dFVCAoZXZkLnZkX25keCk7Ci0KLQkJCSAgICAgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdmQudmRfbmR4ICE9IChkYXRhIFtjbnQgKyBqXSAmIDB4N2ZmZikKLQkJCQkgJiYgaXZkLnZkX25leHQgIT0gMCk7Ci0KLQkJCSAgaWYgKGl2ZC52ZF9uZHggPT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKSkKLQkJCSAgICB7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAgZXZkYTsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICBpdmRhOwotCi0JCQkgICAgICBpdmQudmRfYXV4ID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0IC0gaXZkLnZkX25leHQgKyBpdmQudmRfYXV4LAotCQkJCQlldmRhLCAidmVyc2lvbiBkZWYgYXV4Iik7Ci0KLQkJCSAgICAgIGl2ZGEudmRhX25hbWUgPSBCWVRFX0dFVCAoZXZkYS52ZGFfbmFtZSk7Ci0KLQkJCSAgICAgIG5uICs9IHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkgICAgc3RydGFiICsgaXZkYS52ZGFfbmFtZSwKLQkJCQkJICAgIDEyIC0gc3RybGVuIChzdHJ0YWIKLQkJCQkJCQkgKyBpdmRhLnZkYV9uYW1lKSwKLQkJCQkJICAgICIpIik7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIGlmIChubiA8IDE4KQotCQkJcHJpbnRmICgiJSpjIiwgMTggLSBubiwgJyAnKTsKLQkJICAgIH0KLQotCQlwdXRjaGFyICgnXG4nKTsKLQkgICAgICB9Ci0KLQkgICAgZnJlZSAoZGF0YSk7Ci0JICAgIGZyZWUgKHN0cnRhYik7Ci0JICAgIGZyZWUgKHN5bWJvbHMpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoISBmb3VuZCkKLSAgICBwcmludGYgKF8oIlxuTm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9zeW1ib2xfYmluZGluZyAoYmluZGluZykKLSAgICAgdW5zaWduZWQgaW50IGJpbmRpbmc7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGJpbmRpbmcpCi0gICAgewotICAgIGNhc2UgU1RCX0xPQ0FMOiAgcmV0dXJuICJMT0NBTCI7Ci0gICAgY2FzZSBTVEJfR0xPQkFMOiByZXR1cm4gIkdMT0JBTCI7Ci0gICAgY2FzZSBTVEJfV0VBSzogICByZXR1cm4gIldFQUsiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoYmluZGluZyA+PSBTVEJfTE9QUk9DICYmIGJpbmRpbmcgPD0gU1RCX0hJUFJPQykKLQlzcHJpbnRmIChidWZmLCBfKCI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiKSwgYmluZGluZyk7Ci0gICAgICBlbHNlIGlmIChiaW5kaW5nID49IFNUQl9MT09TICYmIGJpbmRpbmcgPD0gU1RCX0hJT1MpCi0Jc3ByaW50ZiAoYnVmZiwgXygiPE9TIHNwZWNpZmljPjogJWQiKSwgYmluZGluZyk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlZCIpLCBiaW5kaW5nKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3N5bWJvbF90eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTVFRfTk9UWVBFOiAgIHJldHVybiAiTk9UWVBFIjsKLSAgICBjYXNlIFNUVF9PQkpFQ1Q6ICAgcmV0dXJuICJPQkpFQ1QiOwotICAgIGNhc2UgU1RUX0ZVTkM6ICAgICByZXR1cm4gIkZVTkMiOwotICAgIGNhc2UgU1RUX1NFQ1RJT046ICByZXR1cm4gIlNFQ1RJT04iOwotICAgIGNhc2UgU1RUX0ZJTEU6ICAgICByZXR1cm4gIkZJTEUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAodHlwZSA+PSBTVFRfTE9QUk9DICYmIHR5cGUgPD0gU1RUX0hJUFJPQykKLQl7Ci0JICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fQVJNICYmIHR5cGUgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgcmV0dXJuICJUSFVNQl9GVU5DIjsKLQotCSAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX1NQQVJDVjkgJiYgdHlwZSA9PSBTVFRfUkVHSVNURVIpCi0JICAgIHJldHVybiAiUkVHSVNURVIiOwotCi0JICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fUEFSSVNDICYmIHR5cGUgPT0gU1RUX1BBUklTQ19NSUxMSSkKLQkgICAgcmV0dXJuICJQQVJJU0NfTUlMTEkiOwotCi0JICBzcHJpbnRmIChidWZmLCBfKCI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiKSwgdHlwZSk7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZSA+PSBTVFRfTE9PUyAmJiB0eXBlIDw9IFNUVF9ISU9TKQotCXsKLQkgIGlmIChlbGZfaGVhZGVyLmVfbWFjaGluZSA9PSBFTV9QQVJJU0MpCi0JICAgIHsKLQkgICAgICBpZiAodHlwZSA9PSBTVFRfSFBfT1BBUVVFKQotCQlyZXR1cm4gIkhQX09QQVFVRSI7Ci0JICAgICAgaWYgKHR5cGUgPT0gU1RUX0hQX1NUVUIpCi0JCXJldHVybiAiSFBfU1RVQiI7Ci0JICAgIH0KLQotCSAgc3ByaW50ZiAoYnVmZiwgXygiPE9TIHNwZWNpZmljPjogJWQiKSwgdHlwZSk7Ci0JfQotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWQiKSwgdHlwZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9zeW1ib2xfaW5kZXhfdHlwZSAodHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSE5fVU5ERUY6ICByZXR1cm4gIlVORCI7Ci0gICAgY2FzZSBTSE5fQUJTOiAgICByZXR1cm4gIkFCUyI7Ci0gICAgY2FzZSBTSE5fQ09NTU9OOiByZXR1cm4gIkNPTSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh0eXBlID49IFNITl9MT1BST0MgJiYgdHlwZSA8PSBTSE5fSElQUk9DKQotCXJldHVybiAiUFJDIjsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPj0gU0hOX0xPUkVTRVJWRSAmJiB0eXBlIDw9IFNITl9ISVJFU0VSVkUpCi0JcmV0dXJuICJSU1YiOwotICAgICAgZWxzZSBpZiAodHlwZSA+PSBTSE5fTE9PUyAmJiB0eXBlIDw9IFNITl9ISU9TKQotCXJldHVybiAiT1MgIjsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLQkgIHNwcmludGYgKGJ1ZmYsICIlM2QiLCB0eXBlKTsKLQkgIHJldHVybiBidWZmOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIGludCAqCi1nZXRfZHluYW1pY19kYXRhIChmaWxlLCBudW1iZXIpCi0gICAgIEZJTEUgKiAgICAgICBmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOwotewotICBjaGFyICogZV9kYXRhOwotICBpbnQgKiAgaV9kYXRhOwotCi0gIGVfZGF0YSA9IChjaGFyICopIG1hbGxvYyAobnVtYmVyICogNCk7Ci0KLSAgaWYgKGVfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWFkIChlX2RhdGEsIDQsIG51bWJlciwgZmlsZSkgIT0gbnVtYmVyKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gcmVhZCBpbiBkeW5hbWljIGRhdGFcbiIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpX2RhdGEgPSAoaW50ICopIG1hbGxvYyAobnVtYmVyICogc2l6ZW9mICgqIGlfZGF0YSkpOwotCi0gIGlmIChpX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgZnJlZSAoZV9kYXRhKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB3aGlsZSAobnVtYmVyLS0pCi0gICAgaV9kYXRhIFtudW1iZXJdID0gYnl0ZV9nZXQgKGVfZGF0YSArIG51bWJlciAqIDQsIDQpOwotCi0gIGZyZWUgKGVfZGF0YSk7Ci0KLSAgcmV0dXJuIGlfZGF0YTsKLX0KLQotLyogRHVtcCB0aGUgc3ltYm9sIHRhYmxlICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3N5bWJvbF90YWJsZSAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgIHNlY3Rpb247Ci0gIGNoYXIgICBuYiBbNF07Ci0gIGNoYXIgICBuYyBbNF07Ci0gIGludCAgICBuYnVja2V0cyA9IDA7Ci0gIGludCAgICBuY2hhaW5zOwotICBpbnQgKiAgYnVja2V0cyA9IE5VTEw7Ci0gIGludCAqICBjaGFpbnMgPSBOVUxMOwotCi0gIGlmICghIGRvX3N5bXMgJiYgIWRvX2hpc3RvZ3JhbSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZHluYW1pY19pbmZvW0RUX0hBU0hdICYmICgoZG9fdXNpbmdfZHluYW1pYyAmJiBkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCkKLQkJCQl8fCBkb19oaXN0b2dyYW0pKQotICAgIHsKLSAgICAgIGlmIChmc2VlayAoZmlsZSwgZHluYW1pY19pbmZvW0RUX0hBU0hdIC0gbG9hZGFkZHIsIFNFRUtfU0VUKSkKLQl7Ci0JICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKGZyZWFkIChuYiwgc2l6ZW9mIChuYiksIDEsIGZpbGUpICE9IDEpCi0JewotCSAgZXJyb3IgKF8oIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmIChmcmVhZCAobmMsIHNpemVvZiAobmMpLCAxLCBmaWxlKSAhPSAxKQotCXsKLQkgIGVycm9yIChfKCJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIG5idWNrZXRzID0gYnl0ZV9nZXQgKG5iLCA0KTsKLSAgICAgIG5jaGFpbnMgID0gYnl0ZV9nZXQgKG5jLCA0KTsKLQotICAgICAgYnVja2V0cyA9IGdldF9keW5hbWljX2RhdGEgKGZpbGUsIG5idWNrZXRzKTsKLSAgICAgIGNoYWlucyAgPSBnZXRfZHluYW1pY19kYXRhIChmaWxlLCBuY2hhaW5zKTsKLQotICAgICAgaWYgKGJ1Y2tldHMgPT0gTlVMTCB8fCBjaGFpbnMgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX3N5bXMKLSAgICAgICYmIGR5bmFtaWNfaW5mb1tEVF9IQVNIXSAmJiBkb191c2luZ19keW5hbWljICYmIGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAgICBobjsKLSAgICAgIGludCAgICBzaTsKLQotICAgICAgcHJpbnRmIChfKCJcblN5bWJvbCB0YWJsZSBmb3IgaW1hZ2U6XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgTnVtIEJ1YzogICAgVmFsdWUgIFNpemUgICBUeXBlICAgQmluZCBPdCBOZHggTmFtZVxuIikpOwotCi0gICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgaG4rKykKLQl7Ci0JICBpZiAoISBidWNrZXRzIFtobl0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBmb3IgKHNpID0gYnVja2V0cyBbaG5dOyBzaTsgc2kgPSBjaGFpbnMgW3NpXSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBwc3ltOwotCi0JICAgICAgcHN5bSA9IGR5bmFtaWNfc3ltYm9scyArIHNpOwotCi0JICAgICAgcHJpbnRmICgiICAlM2QgJTNkOiAlOGx4ICU1bGQgJTZzICU2cyAlMmQgIiwKLQkJICAgICAgc2ksIGhuLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgcHN5bS0+c3RfdmFsdWUsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF9zaXplLAotCQkgICAgICBnZXRfc3ltYm9sX3R5cGUgKEVMRl9TVF9UWVBFIChwc3ltLT5zdF9pbmZvKSksCi0JCSAgICAgIGdldF9zeW1ib2xfYmluZGluZyAoRUxGX1NUX0JJTkQgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgcHN5bS0+c3Rfb3RoZXIpOwotCi0JICAgICAgcHJpbnRmICgiJTMuM3MiLCBnZXRfc3ltYm9sX2luZGV4X3R5cGUgKHBzeW0tPnN0X3NobmR4KSk7Ci0KLQkgICAgICBwcmludGYgKCIgJXNcbiIsIGR5bmFtaWNfc3RyaW5ncyArIHBzeW0tPnN0X25hbWUpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZG9fc3ltcyAmJiAhZG9fdXNpbmdfZHluYW1pYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgICAgIGk7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLQkgICBpKyssIHNlY3Rpb24rKykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgICAgICAgICAgc2k7Ci0JICBjaGFyICogICAgICAgICAgICAgICAgc3RydGFiOwotCSAgRWxmX0ludGVybmFsX1N5bSAqICAgIHN5bXRhYjsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICBwc3ltOwotCi0KLQkgIGlmICggICBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9TWU1UQUIKLQkgICAgICAmJiBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBwcmludGYgKF8oIlxuU3ltYm9sIHRhYmxlICclcycgY29udGFpbnMgJWx1IGVudHJpZXM6XG4iKSwKLQkJICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLAotCQkgICh1bnNpZ25lZCBsb25nKSAoc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpKTsKLQkgIGZwdXRzIChfKCIgIE51bTogICAgVmFsdWUgIFNpemUgVHlwZSAgICBCaW5kICAgT3QgIE5keCBOYW1lXG4iKSwKLQkJIHN0ZG91dCk7Ci0KLQkgIHN5bXRhYiA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCQkJCSAgICBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSk7Ci0JICBpZiAoc3ltdGFiID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoc2VjdGlvbi0+c2hfbGluayA9PSBlbGZfaGVhZGVyLmVfc2hzdHJuZHgpCi0JICAgIHN0cnRhYiA9IHN0cmluZ190YWJsZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzdHJpbmdfc2VjOwotCi0JICAgICAgc3RyaW5nX3NlYyA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgICBHRVRfREFUQV9BTExPQyAoc3RyaW5nX3NlYy0+c2hfb2Zmc2V0LCBzdHJpbmdfc2VjLT5zaF9zaXplLAotCQkJICAgICAgc3RydGFiLCBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKLQkgICAgfQotCi0JICBmb3IgKHNpID0gMCwgcHN5bSA9IHN5bXRhYjsKLQkgICAgICAgc2kgPCBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgICAgICAgc2kgKyssIHBzeW0gKyspCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgICUzZDogJThseCAlNWxkICUtN3MgJS02cyAlMmQgIiwKLQkJICAgICAgc2ksCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF92YWx1ZSwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3NpemUsCi0JCSAgICAgIGdldF9zeW1ib2xfdHlwZSAoRUxGX1NUX1RZUEUgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgZ2V0X3N5bWJvbF9iaW5kaW5nIChFTEZfU1RfQklORCAocHN5bS0+c3RfaW5mbykpLAotCQkgICAgICBwc3ltLT5zdF9vdGhlcik7Ci0KLQkgICAgICBwcmludGYgKCIlNHMiLCBnZXRfc3ltYm9sX2luZGV4X3R5cGUgKHBzeW0tPnN0X3NobmR4KSk7Ci0KLQkgICAgICBwcmludGYgKCIgJXMiLCBzdHJ0YWIgKyBwc3ltLT5zdF9uYW1lKTsKLQotCSAgICAgIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9EWU5TWU0gJiYKLQkJICB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBjaGFyICAgZGF0YVsyXTsKLQkJICB1bnNpZ25lZCBzaG9ydCAgdmVyc19kYXRhOwotCQkgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7Ci0JCSAgaW50ICAgICAgICAgICAgIGlzX25vYml0czsKLQkJICBpbnQgICAgICAgICAgICAgY2hlY2tfZGVmOwotCi0JCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXQotCQkgICAgLSBsb2FkYWRkcjsKLQotCQkgIEdFVF9EQVRBIChvZmZzZXQgKyBzaSAqIHNpemVvZiAodmVyc19kYXRhKSwgZGF0YSwKLQkJCSAgICAidmVyc2lvbiBkYXRhIik7Ci0KLQkJICB2ZXJzX2RhdGEgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0KLQkJICBpc19ub2JpdHMgPSBwc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUgPwotCQkgICAgKHNlY3Rpb25faGVhZGVycyBbcHN5bS0+c3Rfc2huZHhdLnNoX3R5cGUgPT0gU0hUX05PQklUUykKLQkJICAgIDogMDsKLQotCQkgIGNoZWNrX2RlZiA9IChwc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpOwotCi0JCSAgaWYgKCh2ZXJzX2RhdGEgJiAweDgwMDApIHx8IHZlcnNfZGF0YSA+IDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpc19ub2JpdHMgfHwgISBjaGVja19kZWYpCi0JCQl7Ci0JCQkgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICBldm47Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICBpdm47Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICBpdm5hOwotCi0JCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXSAtIGxvYWRhZGRyOwotCi0JCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOwotCQkJICBpdm4udm5fbmV4dCA9IEJZVEVfR0VUIChldm4udm5fbmV4dCk7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICB1bnNpZ25lZCBsb25nICB2bmFfb2ZmOwotCi0JCQkgICAgICB2bmFfb2ZmID0gb2Zmc2V0ICsgaXZuLnZuX2F1eDsKLQotCQkJICAgICAgZG8KLQkJCQl7Ci0JCQkJICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgZXZuYTsKLQotCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCi0JCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMykiKTsKLQotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7Ci0JCQkJICBpdm5hLnZuYV9uYW1lICA9IEJZVEVfR0VUIChldm5hLnZuYV9uYW1lKTsKLQotCQkJCSAgdm5hX29mZiArPSBpdm5hLnZuYV9uZXh0OwotCQkJCX0KLQkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSB2ZXJzX2RhdGEKLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSB2ZXJzX2RhdGEpCi0JCQkJYnJlYWs7Ci0KLQkJCSAgICAgIG9mZnNldCArPSBpdm4udm5fbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdm4udm5fbmV4dCAhPSAwKTsKLQotCQkJICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gdmVyc19kYXRhKQotCQkJICAgIHsKLQkJCSAgICAgIHByaW50ZiAoIkAlcyAoJWQpIiwKLQkJCQkgICAgICBzdHJ0YWIgKyBpdm5hLnZuYV9uYW1lLCBpdm5hLnZuYV9vdGhlcik7Ci0JCQkgICAgICBjaGVja19kZWYgPSAwOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoISBpc19ub2JpdHMpCi0JCQkgICAgZXJyb3IgKF8oImJhZCBkeW5hbWljIHN5bWJvbCIpKTsKLQkJCSAgZWxzZQotCQkJICAgIGNoZWNrX2RlZiA9IDE7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGNoZWNrX2RlZikKLQkJCXsKLQkJCSAgaWYgKHZlcnNfZGF0YSAhPSAweDgwMDEpCi0JCQkgICAgewotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAgICAgaXZkOwotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggICAgaXZkYTsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgb2Zmc2V0OwotCi0JCQkgICAgICBvZmZzZXQgPQotCQkJCXZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSREVGKV0KLQkJCQktIGxvYWRhZGRyOwotCi0JCQkgICAgICBkbwotCQkJCXsKLQkJCQkgIEVsZl9FeHRlcm5hbF9WZXJkZWYgICBldmQ7Ci0KLQkJCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2ZCwgInZlcnNpb24gZGVmIik7Ci0KLQkJCQkgIGl2ZC52ZF9uZHggID0gQllURV9HRVQgKGV2ZC52ZF9uZHgpOwotCQkJCSAgaXZkLnZkX2F1eCAgPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7Ci0JCQkJICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0KLQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZkLnZkX25keCAhPSAodmVyc19kYXRhICYgMHg3ZmZmKQotCQkJCSAgICAgJiYgaXZkLnZkX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIG9mZnNldCAtPSBpdmQudmRfbmV4dDsKLQkJCSAgICAgIG9mZnNldCArPSBpdmQudmRfYXV4OwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmRhLCAidmVyc2lvbiBkZWYgYXV4Iik7Ci0KLQkJCSAgICAgIGl2ZGEudmRhX25hbWUgPSBCWVRFX0dFVCAoZXZkYS52ZGFfbmFtZSk7Ci0KLQkJCSAgICAgIGlmIChwc3ltLT5zdF9uYW1lICE9IGl2ZGEudmRhX25hbWUpCi0JCQkJcHJpbnRmICgodmVyc19kYXRhICYgMHg4MDAwKQotCQkJCQk/ICJAJXMiIDogIkBAJXMiLAotCQkJCQlzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHB1dGNoYXIgKCdcbicpOwotCSAgICB9Ci0KLQkgIGZyZWUgKHN5bXRhYik7Ci0JICBpZiAoc3RydGFiICE9IHN0cmluZ190YWJsZSkKLQkgICAgZnJlZSAoc3RydGFiKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkb19zeW1zKQotICAgIHByaW50ZgotICAgICAgKF8oIlxuRHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzcGxheWluZyBzeW1ib2xzLlxuIikpOwotCi0gIGlmIChkb19oaXN0b2dyYW0gJiYgYnVja2V0cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAqbGVuZ3RoczsKLSAgICAgIGludCAqY291bnRzOwotICAgICAgaW50IGhuOwotICAgICAgaW50IHNpOwotICAgICAgaW50IG1heGxlbmd0aCA9IDA7Ci0gICAgICBpbnQgbnplcm9fY291bnRzID0gMDsKLSAgICAgIGludCBuc3ltcyA9IDA7Ci0KLSAgICAgIHByaW50ZiAoXygiXG5IaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCAodG90YWwgb2YgJWQgYnVja2V0cyk6XG4iKSwKLQkgICAgICBuYnVja2V0cyk7Ci0gICAgICBwcmludGYgKF8oIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iKSk7Ci0KLSAgICAgIGxlbmd0aHMgPSAoaW50ICopIGNhbGxvYyAobmJ1Y2tldHMsIHNpemVvZiAoaW50KSk7Ci0gICAgICBpZiAobGVuZ3RocyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZm9yIChobiA9IDA7IGhuIDwgbmJ1Y2tldHM7ICsraG4pCi0JewotCSAgaWYgKCEgYnVja2V0cyBbaG5dKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yIChzaSA9IGJ1Y2tldHNbaG5dOyBzaTsgc2kgPSBjaGFpbnNbc2ldKQotCSAgICB7Ci0JICAgICAgKytuc3ltczsKLQkgICAgICBpZiAobWF4bGVuZ3RoIDwgKytsZW5ndGhzW2huXSkKLQkJKyttYXhsZW5ndGg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGNvdW50cyA9IChpbnQgKikgY2FsbG9jIChtYXhsZW5ndGggKyAxLCBzaXplb2YgKGludCkpOwotICAgICAgaWYgKGNvdW50cyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgKytobikKLQkrK2NvdW50c1tsZW5ndGhzIFtobl1dOwotCi0gICAgICBpZiAobmJ1Y2tldHMgPiAwKQotCXsKLQkgIHByaW50ZiAoIiAgICAgIDAgICUtMTBkICglNS4xZiUlKVxuIiwKLQkJICBjb3VudHNbMF0sIChjb3VudHNbMF0gKiAxMDAuMCkgLyBuYnVja2V0cyk7Ci0JICBmb3IgKHNpID0gMTsgc2kgPD0gbWF4bGVuZ3RoOyArK3NpKQotCSAgICB7Ci0JICAgICAgbnplcm9fY291bnRzICs9IGNvdW50c1tzaV0gKiBzaTsKLQkgICAgICBwcmludGYgKCIlN2QgICUtMTBkICglNS4xZiUlKSAgICAlNS4xZiUlXG4iLAotCQkgICAgICBzaSwgY291bnRzW3NpXSwgKGNvdW50c1tzaV0gKiAxMDAuMCkgLyBuYnVja2V0cywKLQkJICAgICAgKG56ZXJvX2NvdW50cyAqIDEwMC4wKSAvIG5zeW1zKTsKLQkgICAgfQotCX0KLQotICAgICAgZnJlZSAoY291bnRzKTsKLSAgICAgIGZyZWUgKGxlbmd0aHMpOwotICAgIH0KLQotICBpZiAoYnVja2V0cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1Y2tldHMpOwotICAgICAgZnJlZSAoY2hhaW5zKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc3ltaW5mbyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMCi0gICAgICB8fCAhZG9fZHluYW1pYykKLSAgICAvKiBObyBzeW1pbmZvLCB0aGlzIGlzIG9rLiAgKi8KLSAgICByZXR1cm4gMTsKLQotICAvKiBUaGVyZSBiZXR0ZXIgc2hvdWxkIGJlIGEgZHluYW1pYyBzeW1ib2wgc2VjdGlvbi4gICovCi0gIGlmIChkeW5hbWljX3N5bWJvbHMgPT0gTlVMTCB8fCBkeW5hbWljX3N0cmluZ3MgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZHluYW1pY19hZGRyKQotICAgIHByaW50ZiAoXygiXG5EeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIpLAotCSAgICBkeW5hbWljX3N5bWluZm9fb2Zmc2V0LCBkeW5hbWljX3N5bWluZm9fbmVudCk7Ci0KLSAgcHJpbnRmIChfKCIgTnVtOiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmRUbyAgICAgRmxhZ3NcbiIpKTsKLSAgZm9yIChpID0gMDsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgc2hvcnQgaW50IGZsYWdzID0gZHluYW1pY19zeW1pbmZvW2ldLnNpX2ZsYWdzOwotCi0gICAgICBwcmludGYgKCIlNGQ6ICUtMzBzICIsIGksCi0JICAgICAgZHluYW1pY19zdHJpbmdzICsgZHluYW1pY19zeW1ib2xzW2ldLnN0X25hbWUpOwotCi0gICAgICBzd2l0Y2ggKGR5bmFtaWNfc3ltaW5mb1tpXS5zaV9ib3VuZHRvKQotCXsKLQljYXNlIFNZTUlORk9fQlRfU0VMRjoKLQkgIGZwdXRzICgiU0VMRiAgICAgICAiLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0JY2FzZSBTWU1JTkZPX0JUX1BBUkVOVDoKLQkgIGZwdXRzICgiUEFSRU5UICAgICAiLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmIChkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA+IDAKLQkgICAgICAmJiBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA8IGR5bmFtaWNfc2l6ZSkKLQkgICAgcHJpbnRmICgiJS0xMHMgIiwKLQkJICAgIGR5bmFtaWNfc3RyaW5ncwotCQkgICAgKyBkeW5hbWljX3NlZ21lbnRbZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG9dLmRfdW4uZF92YWwpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIlLTEwZCAiLCBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0RJUkVDVCkKLQlwcmludGYgKCIgRElSRUNUIik7Ci0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19QQVNTVEhSVSkKLQlwcmludGYgKCIgUEFTU1RIUlUiKTsKLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0NPUFkpCi0JcHJpbnRmICgiIENPUFkiKTsKLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0xBWllMT0FEKQotCXByaW50ZiAoIiBMQVpZTE9BRCIpOwotCi0gICAgICBwdXRzICgiIik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICBGSUxFICogZmlsZTsKLXsKLSAgcHJpbnRmIChfKCJcbkFzc2VtYmx5IGR1bXAgb2Ygc2VjdGlvbiAlc1xuIiksCi0JICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICAvKiBYWFggLS0gdG8gYmUgZG9uZSAtLS0gWFhYICovCi0KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotZHVtcF9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGJmZF9zaXplX3R5cGUgICBieXRlczsKLSAgYmZkX3ZtYSAgICAgICAgIGFkZHI7Ci0gIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0KLSAgYnl0ZXMgPSBzZWN0aW9uLT5zaF9zaXplOwotCi0gIGlmIChieXRlcyA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIpLAotCSAgICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcbkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICBhZGRyID0gc2VjdGlvbi0+c2hfYWRkcjsKLQotICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBieXRlcywgc3RhcnQsIHVuc2lnbmVkIGNoYXIgKiwKLQkJICAic2VjdGlvbiBkYXRhIik7Ci0KLSAgZGF0YSA9IHN0YXJ0OwotCi0gIHdoaWxlIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGludCBrOwotICAgICAgaW50IGxieXRlczsKLQotICAgICAgbGJ5dGVzID0gKGJ5dGVzID4gMTYgPyAxNiA6IGJ5dGVzKTsKLQotICAgICAgcHJpbnRmICgiICAweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgYWRkcik7Ci0KLSAgICAgIHN3aXRjaCAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIEVMRkRBVEEyTFNCOgotCSAgZm9yIChqID0gMTU7IGogPj0gMDsgaiAtLSkKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoIShqICYgMHgzKSkKLQkJcHJpbnRmICgiICIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUxGREFUQTJNU0I6Ci0JICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQotCQlwcmludGYgKCIgIik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgZm9yIChqID0gMDsgaiA8IGxieXRlczsgaisrKQotCXsKLQkgIGsgPSBkYXRhIFtqXTsKLQkgIGlmIChrID49ICcgJyAmJiBrIDwgMHg4MCkKLQkgICAgcHJpbnRmICgiJWMiLCBrKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiLiIpOwotCX0KLQotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0KLSAgICAgIGRhdGEgICs9IGxieXRlczsKLSAgICAgIGFkZHIgICs9IGxieXRlczsKLSAgICAgIGJ5dGVzIC09IGxieXRlczsKLSAgICB9Ci0KLSAgZnJlZSAoc3RhcnQpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludAotcmVhZF9sZWIxMjggKGRhdGEsIGxlbmd0aF9yZXR1cm4sIHNpZ24pCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICBpbnQgKiAgICAgICAgICAgbGVuZ3RoX3JldHVybjsKLSAgICAgaW50ICAgICAgICAgICAgIHNpZ247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJlc3VsdCA9IDA7Ci0gIHVuc2lnbmVkIGludCAgICAgIG51bV9yZWFkID0gMDsKLSAgaW50ICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICB1bnNpZ25lZCBjaGFyICAgICBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICogZGF0YSArKzsKLSAgICAgIG51bV9yZWFkICsrOwotCi0gICAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLQotICAgICAgc2hpZnQgKz0gNzsKLQotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICBpZiAobGVuZ3RoX3JldHVybiAhPSBOVUxMKQotICAgICogbGVuZ3RoX3JldHVybiA9IG51bV9yZWFkOwotCi0gIGlmIChzaWduICYmIChzaGlmdCA8IDMyKSAmJiAoYnl0ZSAmIDB4NDApKQotICAgIHJlc3VsdCB8PSAtMSA8PCBzaGlmdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdCBTdGF0ZV9NYWNoaW5lX1JlZ2lzdGVycwotewotICB1bnNpZ25lZCBsb25nCWFkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCAgZmlsZTsKLSAgdW5zaWduZWQgaW50ICBsaW5lOwotICB1bnNpZ25lZCBpbnQgIGNvbHVtbjsKLSAgaW50ICAgICAgICAgICBpc19zdG10OwotICBpbnQgICAgICAgICAgIGJhc2ljX2Jsb2NrOwotICBpbnQJICAgICAgICBlbmRfc2VxdWVuY2U7Ci0vKiBUaGlzIHZhcmlhYmxlIGhvbGQgdGhlIG51bWJlciBvZiB0aGUgbGFzdCBlbnRyeSBzZWVuCi0gICBpbiB0aGUgRmlsZSBUYWJsZS4gICovCi0gIHVuc2lnbmVkIGludCAgbGFzdF9maWxlX2VudHJ5OwotfSBTTVI7Ci0KLXN0YXRpYyBTTVIgc3RhdGVfbWFjaGluZV9yZWdzOwotCi1zdGF0aWMgdm9pZAotcmVzZXRfc3RhdGVfbWFjaGluZSAoaXNfc3RtdCkKLSAgICAgaW50IGlzX3N0bXQ7Ci17Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzID0gMDsKLSAgc3RhdGVfbWFjaGluZV9yZWdzLmZpbGUgPSAxOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSA9IDE7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5jb2x1bW4gPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdCA9IGlzX3N0bXQ7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5iYXNpY19ibG9jayA9IDA7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5lbmRfc2VxdWVuY2UgPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGFzdF9maWxlX2VudHJ5ID0gMDsKLX0KLQotLyogSGFuZGxlZCBhbiBleHRlbmQgbGluZSBvcC4gIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBlbmQKLSAgIG9mIHNlcXVlbmNlLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCAoZGF0YSwgaXNfc3RtdCwgcG9pbnRlcl9zaXplKQotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgaW50IGlzX3N0bXQ7Ci0gICAgIGludCBwb2ludGVyX3NpemU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICBvcF9jb2RlOwotICBpbnQgICAgICAgICAgICAgYnl0ZXNfcmVhZDsKLSAgdW5zaWduZWQgaW50ICAgIGxlbjsKLSAgdW5zaWduZWQgY2hhciAqIG5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgICBhZHI7Ci0KLSAgbGVuID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQotICBpZiAobGVuID09IDApCi0gICAgewotICAgICAgd2FybiAoXygiYmFkbHkgZm9ybWVkIGV4dGVuZGVkIGxpbmUgb3AgZW5jb3VudGVyZWQhIikpOwotICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Ci0gICAgfQotCi0gIGxlbiArPSBieXRlc19yZWFkOwotICBvcF9jb2RlID0gKiBkYXRhICsrOwotCi0gIHByaW50ZiAoXygiICBFeHRlbmRlZCBvcGNvZGUgJWQ6ICIpLCBvcF9jb2RlKTsKLQotICBzd2l0Y2ggKG9wX2NvZGUpCi0gICAgewotICAgIGNhc2UgRFdfTE5FX2VuZF9zZXF1ZW5jZToKLSAgICAgIHByaW50ZiAoXygiRW5kIG9mIFNlcXVlbmNlXG5cbiIpKTsKLSAgICAgIHJlc2V0X3N0YXRlX21hY2hpbmUgKGlzX3N0bXQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0xORV9zZXRfYWRkcmVzczoKLSAgICAgIGFkciA9IGJ5dGVfZ2V0IChkYXRhLCBwb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmIChfKCJzZXQgQWRkcmVzcyB0byAweCVseFxuIiksIGFkcik7Ci0gICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyA9IGFkcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19MTkVfZGVmaW5lX2ZpbGU6Ci0gICAgICBwcmludGYgKF8oIiAgZGVmaW5lIG5ldyBGaWxlIFRhYmxlIGVudHJ5XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgRW50cnlcdERpclx0VGltZVx0U2l6ZVx0TmFtZVxuIikpOwotCi0gICAgICBwcmludGYgKF8oIiAgICVkXHQiKSwgKysgc3RhdGVfbWFjaGluZV9yZWdzLmxhc3RfZmlsZV9lbnRyeSk7Ci0gICAgICBuYW1lID0gZGF0YTsKLSAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7Ci0gICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0gICAgICBwcmludGYgKF8oIiVzXG5cbiIpLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoXygiVU5LTk9XTjogbGVuZ3RoICVkXG4iKSwgbGVuIC0gYnl0ZXNfcmVhZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbjsKLX0KLQotLyogU2l6ZSBvZiBwb2ludGVycyBpbiB0aGUgLmRlYnVnX2xpbmUgc2VjdGlvbi4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90Ci0gICByZWFsbHkgcHJlc2VudCBpbiB0aGF0IHNlY3Rpb24uICBJdCdzIG9idGFpbmVkIGJlZm9yZSBkdW1waW5nIHRoZSBkZWJ1ZwotICAgc2VjdGlvbnMgYnkgZG9pbmcgc29tZSBwcmUtc2NhbiBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi1zdGF0aWMgaW50IGRlYnVnX2xpbmVfcG9pbnRlcl9zaXplID0gNDsKLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19saW5lcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIERXQVJGMl9FeHRlcm5hbF9MaW5lSW5mbyAqIGV4dGVybmFsOwotICBEV0FSRjJfSW50ZXJuYWxfTGluZUluZm8gICBpbmZvOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBzdGFuZGFyZF9vcGNvZGVzOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBkYXRhID0gc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIGVuZCAgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIGVuZF9vZl9zZXF1ZW5jZTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQotICBwcmludGYgKF8oIlxuRHVtcCBvZiBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzOlxuXG4iKSwKLQkgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHdoaWxlIChkYXRhIDwgZW5kKQotICAgIHsKLSAgICAgIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9MaW5lSW5mbyAqKSBkYXRhOwotCi0gICAgICAvKiBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBibG9jay4gICovCi0gICAgICBpbmZvLmxpX2xlbmd0aCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfbGVuZ3RoKTsKLSAgICAgIGlmIChpbmZvLmxpX2xlbmd0aCA+IHNlY3Rpb24tPnNoX3NpemUpCi0JewotCSAgd2FybgotCSAgICAoXygiVGhlIGxpbmUgaW5mbyBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQgLSB0aGUgc2VjdGlvbiBpcyB0b28gc21hbGxcbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ2hlY2sgaXRzIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgICAgIGluZm8ubGlfdmVyc2lvbiA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfdmVyc2lvbik7Ci0gICAgICBpZiAoaW5mby5saV92ZXJzaW9uICE9IDIpCi0JewotCSAgd2FybiAoXygiT25seSBEV0FSRiB2ZXJzaW9uIDIgbGluZSBpbmZvIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGluZm8ubGlfcHJvbG9ndWVfbGVuZ3RoID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9wcm9sb2d1ZV9sZW5ndGgpOwotICAgICAgaW5mby5saV9taW5faW5zbl9sZW5ndGggPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX21pbl9pbnNuX2xlbmd0aCk7Ci0gICAgICBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfZGVmYXVsdF9pc19zdG10KTsKLSAgICAgIGluZm8ubGlfbGluZV9iYXNlICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9saW5lX2Jhc2UpOwotICAgICAgaW5mby5saV9saW5lX3JhbmdlICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2xpbmVfcmFuZ2UpOwotICAgICAgaW5mby5saV9vcGNvZGVfYmFzZSAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX29wY29kZV9iYXNlKTsKLQotICAgICAgLyogU2lnbiBleHRlbmQgdGhlIGxpbmUgYmFzZSBmaWVsZC4gICovCi0gICAgICBpbmZvLmxpX2xpbmVfYmFzZSA8PD0gMjQ7Ci0gICAgICBpbmZvLmxpX2xpbmVfYmFzZSA+Pj0gMjQ7Ci0KLSAgICAgIHByaW50ZiAoXygiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICVsZFxuIiksIGluZm8ubGlfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBEV0FSRiBWZXJzaW9uOiAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiICBQcm9sZ3VlIExlbmd0aDogICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9wcm9sb2d1ZV9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIE1pbmltdW0gSW5zdHJ1Y3Rpb24gTGVuZ3RoOiAgJWRcbiIpLCBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgSW5pdGlhbCB2YWx1ZSBvZiAnaXNfc3RtdCc6ICAlZFxuIiksIGluZm8ubGlfZGVmYXVsdF9pc19zdG10KTsKLSAgICAgIHByaW50ZiAoXygiICBMaW5lIEJhc2U6ICAgICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9saW5lX2Jhc2UpOwotICAgICAgcHJpbnRmIChfKCIgIExpbmUgUmFuZ2U6ICAgICAgICAgICAgICAgICAgJWRcbiIpLCBpbmZvLmxpX2xpbmVfcmFuZ2UpOwotICAgICAgcHJpbnRmIChfKCIgIE9wY29kZSBCYXNlOiAgICAgICAgICAgICAgICAgJWRcbiIpLCBpbmZvLmxpX29wY29kZV9iYXNlKTsKLQotICAgICAgZW5kX29mX3NlcXVlbmNlID0gZGF0YSArIGluZm8ubGlfbGVuZ3RoICsgc2l6ZW9mIChpbmZvLmxpX2xlbmd0aCk7Ci0KLSAgICAgIHJlc2V0X3N0YXRlX21hY2hpbmUgKGluZm8ubGlfZGVmYXVsdF9pc19zdG10KTsKLQotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIE9wY29kZXMgdGFibGUuICAqLwotICAgICAgc3RhbmRhcmRfb3Bjb2RlcyA9IGRhdGEgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotCi0gICAgICBwcmludGYgKF8oIlxuIE9wY29kZXM6XG4iKSk7Ci0KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBpbmZvLmxpX29wY29kZV9iYXNlOyBpKyspCi0JcHJpbnRmIChfKCIgIE9wY29kZSAlZCBoYXMgJWQgYXJnc1xuIiksIGksIHN0YW5kYXJkX29wY29kZXNbaSAtIDFdKTsKLQotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIERpcmVjdG9yeSB0YWJsZS4gICovCi0gICAgICBkYXRhID0gc3RhbmRhcmRfb3Bjb2RlcyArIGluZm8ubGlfb3Bjb2RlX2Jhc2UgLSAxOwotCi0gICAgICBpZiAoKiBkYXRhID09IDApCi0JcHJpbnRmIChfKCJcbiBUaGUgRGlyZWN0b3J5IFRhYmxlIGlzIGVtcHR5LlxuIikpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXG4gVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIpKTsKLQotCSAgd2hpbGUgKCogZGF0YSAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCIgICVzXG4iKSwgZGF0YSk7Ci0KLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTa2lwIHRoZSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLwotICAgICAgZGF0YSArKzsKLQotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIEZpbGUgTmFtZSB0YWJsZS4gICovCi0gICAgICBpZiAoKiBkYXRhID09IDApCi0JcHJpbnRmIChfKCJcbiBUaGUgRmlsZSBOYW1lIFRhYmxlIGlzIGVtcHR5LlxuIikpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXG4gVGhlIEZpbGUgTmFtZSBUYWJsZTpcbiIpKTsKLQkgIHByaW50ZiAoXygiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iKSk7Ci0KLQkgIHdoaWxlICgqIGRhdGEgIT0gMCkKLQkgICAgewotCSAgICAgIGNoYXIgKiBuYW1lOwotCSAgICAgIGludCBieXRlc19yZWFkOwotCi0JICAgICAgcHJpbnRmIChfKCIgICVkXHQiKSwgKysgc3RhdGVfbWFjaGluZV9yZWdzLmxhc3RfZmlsZV9lbnRyeSk7Ci0JICAgICAgbmFtZSA9IGRhdGE7Ci0KLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCi0JICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgcHJpbnRmIChfKCIlc1xuIiksIG5hbWUpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTa2lwIHRoZSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLwotICAgICAgZGF0YSArKzsKLQotICAgICAgLyogTm93IGRpc3BsYXkgdGhlIHN0YXRlbWVudHMuICAqLwotICAgICAgcHJpbnRmIChfKCJcbiBMaW5lIE51bWJlciBTdGF0ZW1lbnRzOlxuIikpOwotCi0KLSAgICAgIHdoaWxlIChkYXRhIDwgZW5kX29mX3NlcXVlbmNlKQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgb3BfY29kZTsKLQkgIGludCAgICAgICAgICAgYWR2OwotCSAgaW50ICAgICAgICAgICBieXRlc19yZWFkOwotCi0JICBvcF9jb2RlID0gKiBkYXRhICsrOwotCi0JICBzd2l0Y2ggKG9wX2NvZGUpCi0JICAgIHsKLQkgICAgY2FzZSBEV19MTlNfZXh0ZW5kZWRfb3A6Ci0JICAgICAgZGF0YSArPSBwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3AgKGRhdGEsIGluZm8ubGlfZGVmYXVsdF9pc19zdG10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbGluZV9wb2ludGVyX3NpemUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX2NvcHk6Ci0JICAgICAgcHJpbnRmIChfKCIgIENvcHlcbiIpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX3BjOgotCSAgICAgIGFkdiA9IGluZm8ubGlfbWluX2luc25fbGVuZ3RoICogcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBQQyBieSAlZCB0byAlbHhcbiIpLCBhZHYsCi0JCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX2xpbmU6Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMSk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5saW5lICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBMaW5lIGJ5ICVkIHRvICVkXG4iKSwgYWR2LAotCQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgRmlsZSBOYW1lIHRvIGVudHJ5ICVkIGluIHRoZSBGaWxlIE5hbWUgVGFibGVcbiIpLAotCQkgICAgICBhZHYpOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5maWxlID0gYWR2OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX3NldF9jb2x1bW46Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgY29sdW1uIHRvICVkXG4iKSwgYWR2KTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuY29sdW1uID0gYWR2OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX25lZ2F0ZV9zdG10OgotCSAgICAgIGFkdiA9IHN0YXRlX21hY2hpbmVfcmVncy5pc19zdG10OwotCSAgICAgIGFkdiA9ICEgYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgaXNfc3RtdCB0byAlZFxuIiksIGFkdik7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmlzX3N0bXQgPSBhZHY7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIHByaW50ZiAoXygiICBTZXQgYmFzaWMgYmxvY2tcbiIpKTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYmFzaWNfYmxvY2sgPSAxOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKLQkgICAgICBhZHYgPSAoKCgyNTUgLSBpbmZvLmxpX29wY29kZV9iYXNlKSAvIGluZm8ubGlfbGluZV9yYW5nZSkKLQkJICAgICAqIGluZm8ubGlfbWluX2luc25fbGVuZ3RoKTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgUEMgYnkgY29uc3RhbnQgJWQgdG8gMHglbHhcbiIpLCBhZHYsCi0JCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgotCSAgICAgIGFkdiA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLQkgICAgICBkYXRhICs9IDI7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIFBDIGJ5IGZpeGVkIHNpemUgYW1vdW50ICVkIHRvIDB4JWx4XG4iKSwKLQkJICAgICAgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBvcF9jb2RlIC09IGluZm8ubGlfb3Bjb2RlX2Jhc2U7Ci0JICAgICAgYWR2ICAgICAgPSAob3BfY29kZSAvIGluZm8ubGlfbGluZV9yYW5nZSkgKiBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aDsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIFNwZWNpYWwgb3Bjb2RlICVkOiBhZHZhbmNlIEFkZHJlc3MgYnkgJWQgdG8gMHglbHgiKSwKLQkJICAgICAgb3BfY29kZSwgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYWR2ID0gKG9wX2NvZGUgJSBpbmZvLmxpX2xpbmVfcmFuZ2UpICsgaW5mby5saV9saW5lX2Jhc2U7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiIGFuZCBMaW5lIGJ5ICVkIHRvICVkXG4iKSwKLQkJICAgICAgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19wdWJuYW1lcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIERXQVJGMl9FeHRlcm5hbF9QdWJOYW1lcyAqIGV4dGVybmFsOwotICBEV0FSRjJfSW50ZXJuYWxfUHViTmFtZXMgICBwdWJuYW1lczsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgZW5kOwotCi0gIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldDsKLQotICAgICAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX1B1Yk5hbWVzICopIHN0YXJ0OwotCi0gICAgICBwdWJuYW1lcy5wbl9sZW5ndGggID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl9sZW5ndGgpOwotICAgICAgcHVibmFtZXMucG5fdmVyc2lvbiA9IEJZVEVfR0VUIChleHRlcm5hbC0+cG5fdmVyc2lvbik7Ci0gICAgICBwdWJuYW1lcy5wbl9vZmZzZXQgID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl9vZmZzZXQpOwotICAgICAgcHVibmFtZXMucG5fc2l6ZSAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cG5fc2l6ZSk7Ci0KLSAgICAgIGRhdGEgICA9IHN0YXJ0ICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLSAgICAgIHN0YXJ0ICs9IHB1Ym5hbWVzLnBuX2xlbmd0aCArIHNpemVvZiAoZXh0ZXJuYWwtPnBuX2xlbmd0aCk7Ci0KLSAgICAgIGlmIChwdWJuYW1lcy5wbl92ZXJzaW9uICE9IDIpCi0JewotCSAgd2FybiAoXygiT25seSBEV0FSRiAyIHB1Ym5hbWVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBwcmludGYgKF8oIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIpLAotCSAgICAgIHB1Ym5hbWVzLnBuX3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvIHNlY3Rpb246ICAgICAlbGRcbiIpLAotCSAgICAgIHB1Ym5hbWVzLnBuX29mZnNldCk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiBhcmVhIGluIC5kZWJ1Z19pbmZvIHNlY3Rpb246ICVsZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fc2l6ZSk7Ci0KLSAgICAgIHByaW50ZiAoXygiXG4gICAgT2Zmc2V0XHROYW1lXG4iKSk7Ci0KLSAgICAgIGRvCi0JewotCSAgb2Zmc2V0ID0gYnl0ZV9nZXQgKGRhdGEsIDQpOwotCi0JICBpZiAob2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICBkYXRhICs9IDQ7Ci0JICAgICAgcHJpbnRmICgiICAgICVsZFx0XHQlc1xuIiwgb2Zmc2V0LCBkYXRhKTsKLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKG9mZnNldCAhPSAwKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgiXG4iKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9UQUdfbmFtZSAodGFnKQotICAgICB1bnNpZ25lZCBsb25nIHRhZzsKLXsKLSAgc3dpdGNoICh0YWcpCi0gICAgewotICAgIGNhc2UgRFdfVEFHX3BhZGRpbmc6IHJldHVybiAiRFdfVEFHX3BhZGRpbmciOwotICAgIGNhc2UgRFdfVEFHX2FycmF5X3R5cGU6IHJldHVybiAiRFdfVEFHX2FycmF5X3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6IHJldHVybiAiRFdfVEFHX2NsYXNzX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2VudHJ5X3BvaW50OiByZXR1cm4gIkRXX1RBR19lbnRyeV9wb2ludCI7Ci0gICAgY2FzZSBEV19UQUdfZW51bWVyYXRpb25fdHlwZTogcmV0dXJuICJEV19UQUdfZW51bWVyYXRpb25fdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfZm9ybWFsX3BhcmFtZXRlcjogcmV0dXJuICJEV19UQUdfZm9ybWFsX3BhcmFtZXRlciI7Ci0gICAgY2FzZSBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb246IHJldHVybiAiRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uIjsKLSAgICBjYXNlIERXX1RBR19sYWJlbDogcmV0dXJuICJEV19UQUdfbGFiZWwiOwotICAgIGNhc2UgRFdfVEFHX2xleGljYWxfYmxvY2s6IHJldHVybiAiRFdfVEFHX2xleGljYWxfYmxvY2siOwotICAgIGNhc2UgRFdfVEFHX21lbWJlcjogcmV0dXJuICJEV19UQUdfbWVtYmVyIjsKLSAgICBjYXNlIERXX1RBR19wb2ludGVyX3R5cGU6IHJldHVybiAiRFdfVEFHX3BvaW50ZXJfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfcmVmZXJlbmNlX3R5cGU6IHJldHVybiAiRFdfVEFHX3JlZmVyZW5jZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19jb21waWxlX3VuaXQ6IHJldHVybiAiRFdfVEFHX2NvbXBpbGVfdW5pdCI7Ci0gICAgY2FzZSBEV19UQUdfc3RyaW5nX3R5cGU6IHJldHVybiAiRFdfVEFHX3N0cmluZ190eXBlIjsKLSAgICBjYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZTogcmV0dXJuICJEV19UQUdfc3RydWN0dXJlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZTogcmV0dXJuICJEV19UQUdfc3Vicm91dGluZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR190eXBlZGVmOiByZXR1cm4gIkRXX1RBR190eXBlZGVmIjsKLSAgICBjYXNlIERXX1RBR191bmlvbl90eXBlOiByZXR1cm4gIkRXX1RBR191bmlvbl90eXBlIjsKLSAgICBjYXNlIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzOiByZXR1cm4gIkRXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzIjsKLSAgICBjYXNlIERXX1RBR192YXJpYW50OiByZXR1cm4gIkRXX1RBR192YXJpYW50IjsKLSAgICBjYXNlIERXX1RBR19jb21tb25fYmxvY2s6IHJldHVybiAiRFdfVEFHX2NvbW1vbl9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfY29tbW9uX2luY2x1c2lvbjogcmV0dXJuICJEV19UQUdfY29tbW9uX2luY2x1c2lvbiI7Ci0gICAgY2FzZSBEV19UQUdfaW5oZXJpdGFuY2U6IHJldHVybiAiRFdfVEFHX2luaGVyaXRhbmNlIjsKLSAgICBjYXNlIERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmU6IHJldHVybiAiRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSI7Ci0gICAgY2FzZSBEV19UQUdfbW9kdWxlOiByZXR1cm4gIkRXX1RBR19tb2R1bGUiOwotICAgIGNhc2UgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZTogcmV0dXJuICJEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlIjsKLSAgICBjYXNlIERXX1RBR19zZXRfdHlwZTogcmV0dXJuICJEV19UQUdfc2V0X3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6IHJldHVybiAiRFdfVEFHX3N1YnJhbmdlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3dpdGhfc3RtdDogcmV0dXJuICJEV19UQUdfd2l0aF9zdG10IjsKLSAgICBjYXNlIERXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb246IHJldHVybiAiRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiI7Ci0gICAgY2FzZSBEV19UQUdfYmFzZV90eXBlOiByZXR1cm4gIkRXX1RBR19iYXNlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2NhdGNoX2Jsb2NrOiByZXR1cm4gIkRXX1RBR19jYXRjaF9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfY29uc3RfdHlwZTogcmV0dXJuICJEV19UQUdfY29uc3RfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY29uc3RhbnQ6IHJldHVybiAiRFdfVEFHX2NvbnN0YW50IjsKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdG9yOiByZXR1cm4gIkRXX1RBR19lbnVtZXJhdG9yIjsKLSAgICBjYXNlIERXX1RBR19maWxlX3R5cGU6IHJldHVybiAiRFdfVEFHX2ZpbGVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfZnJpZW5kOiByZXR1cm4gIkRXX1RBR19mcmllbmQiOwotICAgIGNhc2UgRFdfVEFHX25hbWVsaXN0OiByZXR1cm4gIkRXX1RBR19uYW1lbGlzdCI7Ci0gICAgY2FzZSBEV19UQUdfbmFtZWxpc3RfaXRlbTogcmV0dXJuICJEV19UQUdfbmFtZWxpc3RfaXRlbSI7Ci0gICAgY2FzZSBEV19UQUdfcGFja2VkX3R5cGU6IHJldHVybiAiRFdfVEFHX3BhY2tlZF90eXBlIjsKLSAgICBjYXNlIERXX1RBR19zdWJwcm9ncmFtOiByZXR1cm4gIkRXX1RBR19zdWJwcm9ncmFtIjsKLSAgICBjYXNlIERXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtOiByZXR1cm4gIkRXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtIjsKLSAgICBjYXNlIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbTogcmV0dXJuICJEV19UQUdfdGVtcGxhdGVfdmFsdWVfcGFyYW0iOwotICAgIGNhc2UgRFdfVEFHX3Rocm93bl90eXBlOiByZXR1cm4gIkRXX1RBR190aHJvd25fdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfdHJ5X2Jsb2NrOiByZXR1cm4gIkRXX1RBR190cnlfYmxvY2siOwotICAgIGNhc2UgRFdfVEFHX3ZhcmlhbnRfcGFydDogcmV0dXJuICJEV19UQUdfdmFyaWFudF9wYXJ0IjsKLSAgICBjYXNlIERXX1RBR192YXJpYWJsZTogcmV0dXJuICJEV19UQUdfdmFyaWFibGUiOwotICAgIGNhc2UgRFdfVEFHX3ZvbGF0aWxlX3R5cGU6IHJldHVybiAiRFdfVEFHX3ZvbGF0aWxlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX01JUFNfbG9vcDogcmV0dXJuICJEV19UQUdfTUlQU19sb29wIjsKLSAgICBjYXNlIERXX1RBR19mb3JtYXRfbGFiZWw6IHJldHVybiAiRFdfVEFHX2Zvcm1hdF9sYWJlbCI7Ci0gICAgY2FzZSBEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGU6IHJldHVybiAiRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlIjsKLSAgICBjYXNlIERXX1RBR19jbGFzc190ZW1wbGF0ZTogcmV0dXJuICJEV19UQUdfY2xhc3NfdGVtcGxhdGUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyIFsxMDBdOwotCi0Jc3ByaW50ZiAoYnVmZmVyLCBfKCJVbmtub3duIFRBRyB2YWx1ZTogJWx4IiksIHRhZyk7Ci0JcmV0dXJuIGJ1ZmZlcjsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9BVF9uYW1lIChhdHRyaWJ1dGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlOwotewotICBzd2l0Y2ggKGF0dHJpYnV0ZSkKLSAgICB7Ci0gICAgY2FzZSBEV19BVF9zaWJsaW5nOiByZXR1cm4gIkRXX0FUX3NpYmxpbmciOwotICAgIGNhc2UgRFdfQVRfbG9jYXRpb246IHJldHVybiAiRFdfQVRfbG9jYXRpb24iOwotICAgIGNhc2UgRFdfQVRfbmFtZTogcmV0dXJuICJEV19BVF9uYW1lIjsKLSAgICBjYXNlIERXX0FUX29yZGVyaW5nOiByZXR1cm4gIkRXX0FUX29yZGVyaW5nIjsKLSAgICBjYXNlIERXX0FUX3N1YnNjcl9kYXRhOiByZXR1cm4gIkRXX0FUX3N1YnNjcl9kYXRhIjsKLSAgICBjYXNlIERXX0FUX2J5dGVfc2l6ZTogcmV0dXJuICJEV19BVF9ieXRlX3NpemUiOwotICAgIGNhc2UgRFdfQVRfYml0X29mZnNldDogcmV0dXJuICJEV19BVF9iaXRfb2Zmc2V0IjsKLSAgICBjYXNlIERXX0FUX2JpdF9zaXplOiByZXR1cm4gIkRXX0FUX2JpdF9zaXplIjsKLSAgICBjYXNlIERXX0FUX2VsZW1lbnRfbGlzdDogcmV0dXJuICJEV19BVF9lbGVtZW50X2xpc3QiOwotICAgIGNhc2UgRFdfQVRfc3RtdF9saXN0OiByZXR1cm4gIkRXX0FUX3N0bXRfbGlzdCI7Ci0gICAgY2FzZSBEV19BVF9sb3dfcGM6IHJldHVybiAiRFdfQVRfbG93X3BjIjsKLSAgICBjYXNlIERXX0FUX2hpZ2hfcGM6IHJldHVybiAiRFdfQVRfaGlnaF9wYyI7Ci0gICAgY2FzZSBEV19BVF9sYW5ndWFnZTogcmV0dXJuICJEV19BVF9sYW5ndWFnZSI7Ci0gICAgY2FzZSBEV19BVF9tZW1iZXI6IHJldHVybiAiRFdfQVRfbWVtYmVyIjsKLSAgICBjYXNlIERXX0FUX2Rpc2NyOiByZXR1cm4gIkRXX0FUX2Rpc2NyIjsKLSAgICBjYXNlIERXX0FUX2Rpc2NyX3ZhbHVlOiByZXR1cm4gIkRXX0FUX2Rpc2NyX3ZhbHVlIjsKLSAgICBjYXNlIERXX0FUX3Zpc2liaWxpdHk6IHJldHVybiAiRFdfQVRfdmlzaWJpbGl0eSI7Ci0gICAgY2FzZSBEV19BVF9pbXBvcnQ6IHJldHVybiAiRFdfQVRfaW1wb3J0IjsKLSAgICBjYXNlIERXX0FUX3N0cmluZ19sZW5ndGg6IHJldHVybiAiRFdfQVRfc3RyaW5nX2xlbmd0aCI7Ci0gICAgY2FzZSBEV19BVF9jb21tb25fcmVmZXJlbmNlOiByZXR1cm4gIkRXX0FUX2NvbW1vbl9yZWZlcmVuY2UiOwotICAgIGNhc2UgRFdfQVRfY29tcF9kaXI6IHJldHVybiAiRFdfQVRfY29tcF9kaXIiOwotICAgIGNhc2UgRFdfQVRfY29uc3RfdmFsdWU6IHJldHVybiAiRFdfQVRfY29uc3RfdmFsdWUiOwotICAgIGNhc2UgRFdfQVRfY29udGFpbmluZ190eXBlOiByZXR1cm4gIkRXX0FUX2NvbnRhaW5pbmdfdHlwZSI7Ci0gICAgY2FzZSBEV19BVF9kZWZhdWx0X3ZhbHVlOiByZXR1cm4gIkRXX0FUX2RlZmF1bHRfdmFsdWUiOwotICAgIGNhc2UgRFdfQVRfaW5saW5lOiByZXR1cm4gIkRXX0FUX2lubGluZSI7Ci0gICAgY2FzZSBEV19BVF9pc19vcHRpb25hbDogcmV0dXJuICJEV19BVF9pc19vcHRpb25hbCI7Ci0gICAgY2FzZSBEV19BVF9sb3dlcl9ib3VuZDogcmV0dXJuICJEV19BVF9sb3dlcl9ib3VuZCI7Ci0gICAgY2FzZSBEV19BVF9wcm9kdWNlcjogcmV0dXJuICJEV19BVF9wcm9kdWNlciI7Ci0gICAgY2FzZSBEV19BVF9wcm90b3R5cGVkOiByZXR1cm4gIkRXX0FUX3Byb3RvdHlwZWQiOwotICAgIGNhc2UgRFdfQVRfcmV0dXJuX2FkZHI6IHJldHVybiAiRFdfQVRfcmV0dXJuX2FkZHIiOwotICAgIGNhc2UgRFdfQVRfc3RhcnRfc2NvcGU6IHJldHVybiAiRFdfQVRfc3RhcnRfc2NvcGUiOwotICAgIGNhc2UgRFdfQVRfc3RyaWRlX3NpemU6IHJldHVybiAiRFdfQVRfc3RyaWRlX3NpemUiOwotICAgIGNhc2UgRFdfQVRfdXBwZXJfYm91bmQ6IHJldHVybiAiRFdfQVRfdXBwZXJfYm91bmQiOwotICAgIGNhc2UgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luOiByZXR1cm4gIkRXX0FUX2Fic3RyYWN0X29yaWdpbiI7Ci0gICAgY2FzZSBEV19BVF9hY2Nlc3NpYmlsaXR5OiByZXR1cm4gIkRXX0FUX2FjY2Vzc2liaWxpdHkiOwotICAgIGNhc2UgRFdfQVRfYWRkcmVzc19jbGFzczogcmV0dXJuICJEV19BVF9hZGRyZXNzX2NsYXNzIjsKLSAgICBjYXNlIERXX0FUX2FydGlmaWNpYWw6IHJldHVybiAiRFdfQVRfYXJ0aWZpY2lhbCI7Ci0gICAgY2FzZSBEV19BVF9iYXNlX3R5cGVzOiByZXR1cm4gIkRXX0FUX2Jhc2VfdHlwZXMiOwotICAgIGNhc2UgRFdfQVRfY2FsbGluZ19jb252ZW50aW9uOiByZXR1cm4gIkRXX0FUX2NhbGxpbmdfY29udmVudGlvbiI7Ci0gICAgY2FzZSBEV19BVF9jb3VudDogcmV0dXJuICJEV19BVF9jb3VudCI7Ci0gICAgY2FzZSBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbjogcmV0dXJuICJEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9kZWNsX2NvbHVtbjogcmV0dXJuICJEV19BVF9kZWNsX2NvbHVtbiI7Ci0gICAgY2FzZSBEV19BVF9kZWNsX2ZpbGU6IHJldHVybiAiRFdfQVRfZGVjbF9maWxlIjsKLSAgICBjYXNlIERXX0FUX2RlY2xfbGluZTogcmV0dXJuICJEV19BVF9kZWNsX2xpbmUiOwotICAgIGNhc2UgRFdfQVRfZGVjbGFyYXRpb246IHJldHVybiAiRFdfQVRfZGVjbGFyYXRpb24iOwotICAgIGNhc2UgRFdfQVRfZGlzY3JfbGlzdDogcmV0dXJuICJEV19BVF9kaXNjcl9saXN0IjsKLSAgICBjYXNlIERXX0FUX2VuY29kaW5nOiByZXR1cm4gIkRXX0FUX2VuY29kaW5nIjsKLSAgICBjYXNlIERXX0FUX2V4dGVybmFsOiByZXR1cm4gIkRXX0FUX2V4dGVybmFsIjsKLSAgICBjYXNlIERXX0FUX2ZyYW1lX2Jhc2U6IHJldHVybiAiRFdfQVRfZnJhbWVfYmFzZSI7Ci0gICAgY2FzZSBEV19BVF9mcmllbmQ6IHJldHVybiAiRFdfQVRfZnJpZW5kIjsKLSAgICBjYXNlIERXX0FUX2lkZW50aWZpZXJfY2FzZTogcmV0dXJuICJEV19BVF9pZGVudGlmaWVyX2Nhc2UiOwotICAgIGNhc2UgRFdfQVRfbWFjcm9faW5mbzogcmV0dXJuICJEV19BVF9tYWNyb19pbmZvIjsKLSAgICBjYXNlIERXX0FUX25hbWVsaXN0X2l0ZW1zOiByZXR1cm4gIkRXX0FUX25hbWVsaXN0X2l0ZW1zIjsKLSAgICBjYXNlIERXX0FUX3ByaW9yaXR5OiByZXR1cm4gIkRXX0FUX3ByaW9yaXR5IjsKLSAgICBjYXNlIERXX0FUX3NlZ21lbnQ6IHJldHVybiAiRFdfQVRfc2VnbWVudCI7Ci0gICAgY2FzZSBEV19BVF9zcGVjaWZpY2F0aW9uOiByZXR1cm4gIkRXX0FUX3NwZWNpZmljYXRpb24iOwotICAgIGNhc2UgRFdfQVRfc3RhdGljX2xpbms6IHJldHVybiAiRFdfQVRfc3RhdGljX2xpbmsiOwotICAgIGNhc2UgRFdfQVRfdHlwZTogcmV0dXJuICJEV19BVF90eXBlIjsKLSAgICBjYXNlIERXX0FUX3VzZV9sb2NhdGlvbjogcmV0dXJuICJEV19BVF91c2VfbG9jYXRpb24iOwotICAgIGNhc2UgRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyOiByZXR1cm4gIkRXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciI7Ci0gICAgY2FzZSBEV19BVF92aXJ0dWFsaXR5OiByZXR1cm4gIkRXX0FUX3ZpcnR1YWxpdHkiOwotICAgIGNhc2UgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb246IHJldHVybiAiRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24iOwotICAgIGNhc2UgRFdfQVRfTUlQU19mZGU6IHJldHVybiAiRFdfQVRfTUlQU19mZGUiOwotICAgIGNhc2UgRFdfQVRfTUlQU19sb29wX2JlZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfbG9vcF9iZWdpbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX3RhaWxfbG9vcF9iZWdpbjogcmV0dXJuICJEV19BVF9NSVBTX3RhaWxfbG9vcF9iZWdpbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2VwaWxvZ19iZWdpbjogcmV0dXJuICJEV19BVF9NSVBTX2VwaWxvZ19iZWdpbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2xvb3BfdW5yb2xsX2ZhY3RvcjogcmV0dXJuICJEV19BVF9NSVBTX2xvb3BfdW5yb2xsX2ZhY3RvciI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoOiByZXR1cm4gIkRXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGgiOwotICAgIGNhc2UgRFdfQVRfTUlQU19saW5rYWdlX25hbWU6IHJldHVybiAiRFdfQVRfTUlQU19saW5rYWdlX25hbWUiOwotICAgIGNhc2UgRFdfQVRfTUlQU19zdHJpZGU6IHJldHVybiAiRFdfQVRfTUlQU19zdHJpZGUiOwotICAgIGNhc2UgRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lOiByZXR1cm4gIkRXX0FUX01JUFNfYWJzdHJhY3RfbmFtZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2Nsb25lX29yaWdpbjogcmV0dXJuICJEV19BVF9NSVBTX2Nsb25lX29yaWdpbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2hhc19pbmxpbmVzOiByZXR1cm4gIkRXX0FUX01JUFNfaGFzX2lubGluZXMiOwotICAgIGNhc2UgRFdfQVRfc2ZfbmFtZXM6IHJldHVybiAiRFdfQVRfc2ZfbmFtZXMiOwotICAgIGNhc2UgRFdfQVRfc3JjX2luZm86IHJldHVybiAiRFdfQVRfc3JjX2luZm8iOwotICAgIGNhc2UgRFdfQVRfbWFjX2luZm86IHJldHVybiAiRFdfQVRfbWFjX2luZm8iOwotICAgIGNhc2UgRFdfQVRfc3JjX2Nvb3JkczogcmV0dXJuICJEV19BVF9zcmNfY29vcmRzIjsKLSAgICBjYXNlIERXX0FUX2JvZHlfYmVnaW46IHJldHVybiAiRFdfQVRfYm9keV9iZWdpbiI7Ci0gICAgY2FzZSBEV19BVF9ib2R5X2VuZDogcmV0dXJuICJEV19BVF9ib2R5X2VuZCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlzdGF0aWMgY2hhciBidWZmZXIgWzEwMF07Ci0KLQlzcHJpbnRmIChidWZmZXIsIF8oIlVua25vd24gQVQgdmFsdWU6ICVseCIpLCBhdHRyaWJ1dGUpOwotCXJldHVybiBidWZmZXI7Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfRk9STV9uYW1lIChmb3JtKQotICAgICB1bnNpZ25lZCBsb25nIGZvcm07Ci17Ci0gIHN3aXRjaCAoZm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX2FkZHI6IHJldHVybiAiRFdfRk9STV9hZGRyIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2syOiByZXR1cm4gIkRXX0ZPUk1fYmxvY2syIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OiByZXR1cm4gIkRXX0ZPUk1fYmxvY2s0IjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTI6IHJldHVybiAiRFdfRk9STV9kYXRhMiI7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE0OiByZXR1cm4gIkRXX0ZPUk1fZGF0YTQiOwotICAgIGNhc2UgRFdfRk9STV9kYXRhODogcmV0dXJuICJEV19GT1JNX2RhdGE4IjsKLSAgICBjYXNlIERXX0ZPUk1fc3RyaW5nOiByZXR1cm4gIkRXX0ZPUk1fc3RyaW5nIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6IHJldHVybiAiRFdfRk9STV9ibG9jayI7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMTogcmV0dXJuICJEV19GT1JNX2Jsb2NrMSI7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGExOiByZXR1cm4gIkRXX0ZPUk1fZGF0YTEiOwotICAgIGNhc2UgRFdfRk9STV9mbGFnOiByZXR1cm4gIkRXX0ZPUk1fZmxhZyI7Ci0gICAgY2FzZSBEV19GT1JNX3NkYXRhOiByZXR1cm4gIkRXX0ZPUk1fc2RhdGEiOwotICAgIGNhc2UgRFdfRk9STV9zdHJwOiByZXR1cm4gIkRXX0ZPUk1fc3RycCI7Ci0gICAgY2FzZSBEV19GT1JNX3VkYXRhOiByZXR1cm4gIkRXX0ZPUk1fdWRhdGEiOwotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjogcmV0dXJuICJEV19GT1JNX3JlZl9hZGRyIjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmMTogcmV0dXJuICJEV19GT1JNX3JlZjEiOwotICAgIGNhc2UgRFdfRk9STV9yZWYyOiByZXR1cm4gIkRXX0ZPUk1fcmVmMiI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjQ6IHJldHVybiAiRFdfRk9STV9yZWY0IjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmODogcmV0dXJuICJEV19GT1JNX3JlZjgiOwotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6IHJldHVybiAiRFdfRk9STV9yZWZfdWRhdGEiOwotICAgIGNhc2UgRFdfRk9STV9pbmRpcmVjdDogcmV0dXJuICJEV19GT1JNX2luZGlyZWN0IjsKLSAgICBkZWZhdWx0OgotICAgICAgewotCXN0YXRpYyBjaGFyIGJ1ZmZlciBbMTAwXTsKLQotCXNwcmludGYgKGJ1ZmZlciwgXygiVW5rbm93biBGT1JNIHZhbHVlOiAlbHgiKSwgZm9ybSk7Ci0JcmV0dXJuIGJ1ZmZlcjsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIEZJWE1FOiAgVGhlcmUgYXJlIGJldHRlciBhbmQgbW9yZSBlZmZpZWNpbnQgd2F5cyB0byBoYW5kbGUKLSAgIHRoZXNlIHN0cnVjdHVyZXMuICBGb3Igbm93IHRob3VnaCwgSSBqdXN0IHdhbnQgc29tZXRoaW5nIHRoYXQKLSAgIGlzIHNpbXBsZSB0byBpbXBsZW1lbnQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgYWJicmV2X2F0dHIKLXsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgYXR0cmlidXRlOwotICB1bnNpZ25lZCBsb25nICAgICAgICBmb3JtOwotICBzdHJ1Y3QgYWJicmV2X2F0dHIgKiBuZXh0OwotfQotYWJicmV2X2F0dHI7Ci0KLXR5cGVkZWYgc3RydWN0IGFiYnJldl9lbnRyeQotewotICB1bnNpZ25lZCBsb25nICAgICAgICAgIGVudHJ5OwotICB1bnNpZ25lZCBsb25nICAgICAgICAgIHRhZzsKLSAgaW50ICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjsKLSAgc3RydWN0IGFiYnJldl9hdHRyICogICBmaXJzdF9hdHRyOwotICBzdHJ1Y3QgYWJicmV2X2F0dHIgKiAgIGxhc3RfYXR0cjsKLSAgc3RydWN0IGFiYnJldl9lbnRyeSAqICBuZXh0OwotfQotYWJicmV2X2VudHJ5OwotCi1zdGF0aWMgYWJicmV2X2VudHJ5ICogZmlyc3RfYWJicmV2ID0gTlVMTDsKLXN0YXRpYyBhYmJyZXZfZW50cnkgKiBsYXN0X2FiYnJldiA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX2FiYnJldnMgUEFSQU1TICgodm9pZCkpCi17Ci0gIGFiYnJldl9lbnRyeSAqIGFiYnJldjsKLQotICBmb3IgKGFiYnJldiA9IGZpcnN0X2FiYnJldjsgYWJicmV2OykKLSAgICB7Ci0gICAgICBhYmJyZXZfZW50cnkgKiBuZXh0ID0gYWJicmV2LT5uZXh0OwotICAgICAgYWJicmV2X2F0dHIgICogYXR0cjsKLQotICAgICAgZm9yIChhdHRyID0gYWJicmV2LT5maXJzdF9hdHRyOyBhdHRyOykKLQl7Ci0JICBhYmJyZXZfYXR0ciAqIG5leHQgPSBhdHRyLT5uZXh0OwotCi0JICBmcmVlIChhdHRyKTsKLQkgIGF0dHIgPSBuZXh0OwotCX0KLQotICAgICAgZnJlZSAoYWJicmV2KTsKLSAgICAgIGFiYnJldiA9IG5leHQ7Ci0gICAgfQotCi0gIGxhc3RfYWJicmV2ID0gZmlyc3RfYWJicmV2ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLWFkZF9hYmJyZXYgKG51bWJlciwgdGFnLCBjaGlsZHJlbikKLSAgICAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdGFnOwotICAgICBpbnQgICAgICAgICAgIGNoaWxkcmVuOwotewotICBhYmJyZXZfZW50cnkgKiBlbnRyeTsKLQotICBlbnRyeSA9IChhYmJyZXZfZW50cnkgKikgbWFsbG9jIChzaXplb2YgKCogZW50cnkpKTsKLQotICBpZiAoZW50cnkgPT0gTlVMTCkKLSAgICAvKiB1Z2cgKi8KLSAgICByZXR1cm47Ci0KLSAgZW50cnktPmVudHJ5ICAgICAgPSBudW1iZXI7Ci0gIGVudHJ5LT50YWcgICAgICAgID0gdGFnOwotICBlbnRyeS0+Y2hpbGRyZW4gICA9IGNoaWxkcmVuOwotICBlbnRyeS0+Zmlyc3RfYXR0ciA9IE5VTEw7Ci0gIGVudHJ5LT5sYXN0X2F0dHIgID0gTlVMTDsKLSAgZW50cnktPm5leHQgICAgICAgPSBOVUxMOwotCi0gIGlmIChmaXJzdF9hYmJyZXYgPT0gTlVMTCkKLSAgICBmaXJzdF9hYmJyZXYgPSBlbnRyeTsKLSAgZWxzZQotICAgIGxhc3RfYWJicmV2LT5uZXh0ID0gZW50cnk7Ci0KLSAgbGFzdF9hYmJyZXYgPSBlbnRyeTsKLX0KLQotc3RhdGljIHZvaWQKLWFkZF9hYmJyZXZfYXR0ciAoYXR0cmlidXRlLCBmb3JtKQotICAgICB1bnNpZ25lZCBsb25nIGF0dHJpYnV0ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBmb3JtOwotewotICBhYmJyZXZfYXR0ciAqIGF0dHI7Ci0KLSAgYXR0ciA9IChhYmJyZXZfYXR0ciAqKSBtYWxsb2MgKHNpemVvZiAoKiBhdHRyKSk7Ci0KLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICAvKiB1Z2cgKi8KLSAgICByZXR1cm47Ci0KLSAgYXR0ci0+YXR0cmlidXRlID0gYXR0cmlidXRlOwotICBhdHRyLT5mb3JtICAgICAgPSBmb3JtOwotICBhdHRyLT5uZXh0ICAgICAgPSBOVUxMOwotCi0gIGlmIChsYXN0X2FiYnJldi0+Zmlyc3RfYXR0ciA9PSBOVUxMKQotICAgIGxhc3RfYWJicmV2LT5maXJzdF9hdHRyID0gYXR0cjsKLSAgZWxzZQotICAgIGxhc3RfYWJicmV2LT5sYXN0X2F0dHItPm5leHQgPSBhdHRyOwotCi0gIGxhc3RfYWJicmV2LT5sYXN0X2F0dHIgPSBhdHRyOwotfQotCi0vKiBQcm9jZXNzZXMgdGhlIChwYXJ0aWFsKSBjb250ZW50cyBvZiBhIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4KLSAgIFJldHVybnMgTlVMTCBpZiB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIHdhcyBlbmNvdW50ZXJlZC4KLSAgIFJldHVybnMgdGhlIGFkZHJlc3MgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSByZWFkIGlmIHRoZSBlbmQgb2YKLSAgIGFuIGFiYnJldmlhdGlvbiBzZXQgd2FzIGZvdW5kLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcHJvY2Vzc19hYmJyZXZfc2VjdGlvbiAoc3RhcnQsIGVuZCkKLSAgICAgdW5zaWduZWQgY2hhciAqIHN0YXJ0OwotICAgICB1bnNpZ25lZCBjaGFyICogZW5kOwotewotICBpZiAoZmlyc3RfYWJicmV2ICE9IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgYnl0ZXNfcmVhZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZW50cnk7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRhZzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlOwotICAgICAgaW50ICAgICAgICAgICBjaGlsZHJlbjsKLQotICAgICAgZW50cnkgPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBzdGFydCArPSBieXRlc19yZWFkOwotCi0gICAgICAvKiBBIHNpbmdsZSB6ZXJvIGlzIHN1cHBvc2VkIHRvIGVuZCB0aGUgc2VjdGlvbiBhY2NvcmRpbmcKLQkgdG8gdGhlIHN0YW5kYXJkLiAgSWYgdGhlcmUncyBtb3JlLCB0aGVuIHNpZ25hbCB0aGF0IHRvCi0JIHRoZSBjYWxsZXIuICAqLwotICAgICAgaWYgKGVudHJ5ID09IDApCi0JcmV0dXJuIHN0YXJ0ID09IGVuZCA/IE5VTEwgOiBzdGFydDsKLQotICAgICAgdGFnID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotICAgICAgY2hpbGRyZW4gPSAqIHN0YXJ0ICsrOwotCi0gICAgICBhZGRfYWJicmV2IChlbnRyeSwgdGFnLCBjaGlsZHJlbik7Ci0KLSAgICAgIGRvCi0JewotCSAgdW5zaWduZWQgbG9uZyBmb3JtOwotCi0JICBhdHRyaWJ1dGUgPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICBzdGFydCArPSBieXRlc19yZWFkOwotCi0JICBmb3JtID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotCSAgaWYgKGF0dHJpYnV0ZSAhPSAwKQotCSAgICBhZGRfYWJicmV2X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSk7Ci0JfQotICAgICAgd2hpbGUgKGF0dHJpYnV0ZSAhPSAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19hYmJyZXYgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYmJyZXZfZW50cnkgKiBlbnRyeTsKLSAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzdGFydCA9IHByb2Nlc3NfYWJicmV2X3NlY3Rpb24gKHN0YXJ0LCBlbmQpOwotCi0gICAgICBwcmludGYgKF8oIiAgTnVtYmVyIFRBR1xuIikpOwotCi0gICAgICBmb3IgKGVudHJ5ID0gZmlyc3RfYWJicmV2OyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLQl7Ci0JICBhYmJyZXZfYXR0ciAqIGF0dHI7Ci0KLQkgIHByaW50ZiAoXygiICAgJWxkICAgICAgJXMgICAgWyVzXVxuIiksCi0JCSAgZW50cnktPmVudHJ5LAotCQkgIGdldF9UQUdfbmFtZSAoZW50cnktPnRhZyksCi0JCSAgZW50cnktPmNoaWxkcmVuID8gXygiaGFzIGNoaWxkcmVuIikgOiBfKCJubyBjaGlsZHJlbiIpKTsKLQotCSAgZm9yIChhdHRyID0gZW50cnktPmZpcnN0X2F0dHI7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCIgICAgJS0xOHMgJXNcbiIpLAotCQkgICAgICBnZXRfQVRfbmFtZSAoYXR0ci0+YXR0cmlidXRlKSwKLQkJICAgICAgZ2V0X0ZPUk1fbmFtZSAoYXR0ci0+Zm9ybSkpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgd2hpbGUgKHN0YXJ0KTsKLQotICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLWRpc3BsYXlfYmxvY2sgKGRhdGEsIGxlbmd0aCkKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICBsZW5ndGg7Ci17Ci0gIHByaW50ZiAoXygiICVsdSBieXRlIGJsb2NrOiAiKSwgbGVuZ3RoKTsKLQotICB3aGlsZSAobGVuZ3RoIC0tKQotICAgIHByaW50ZiAoIiVseCAiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEgKyssIDEpKTsKLQotICByZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLWRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uIChkYXRhLCBwb2ludGVyX3NpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgICAgcG9pbnRlcl9zaXplOwotewotICB1bnNpZ25lZCBjaGFyIG9wOwotICBpbnQgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gIHVuc2lnbmVkIGxvbmcgdXZhbHVlOwotCi0gIG9wID0gKiBkYXRhICsrOwotCi0gIHN3aXRjaCAob3ApCi0gICAgewotICAgIGNhc2UgRFdfT1BfYWRkcjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2FkZHI6ICVseCIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgcG9pbnRlcl9zaXplKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2RlcmVmOgotICAgICAgcHJpbnRmICgiRFdfT1BfZGVyZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3QxdToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0MXU6ICVsdSIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDFzOgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3QxczogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MnU6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDJ1OiAlbHUiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3QyczoKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0MnM6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDR1OgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3Q0dTogJWx1IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0NHM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDRzOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q4dToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0OHU6ICVsdSAlbHUiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIDQpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q4czoKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0OHM6ICVsZCAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDQpLAotCSAgICAgIChsb25nKSBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3R1OgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3R1OiAlbHUiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdHM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdHM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2R1cDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2R1cCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kcm9wOgotICAgICAgcHJpbnRmICgiRFdfT1BfZHJvcCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9vdmVyOgotICAgICAgcHJpbnRmICgiRFdfT1Bfb3ZlciIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9waWNrOgotICAgICAgcHJpbnRmICgiRFdfT1BfcGljazogJWxkIiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3N3YXA6Ci0gICAgICBwcmludGYgKCJEV19PUF9zd2FwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JvdDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JvdCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF94ZGVyZWY6Ci0gICAgICBwcmludGYgKCJEV19PUF94ZGVyZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYWJzOgotICAgICAgcHJpbnRmICgiRFdfT1BfYWJzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2FuZDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2FuZCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kaXY6Ci0gICAgICBwcmludGYgKCJEV19PUF9kaXYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbWludXM6Ci0gICAgICBwcmludGYgKCJEV19PUF9taW51cyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9tb2Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9tb2QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbXVsOgotICAgICAgcHJpbnRmICgiRFdfT1BfbXVsIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX25lZzoKLSAgICAgIHByaW50ZiAoIkRXX09QX25lZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9ub3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9ub3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfb3I6Ci0gICAgICBwcmludGYgKCJEV19PUF9vciIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9wbHVzOgotICAgICAgcHJpbnRmICgiRFdfT1BfcGx1cyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9wbHVzX3Vjb25zdDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3BsdXNfdWNvbnN0OiAlbHUiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zaGw6Ci0gICAgICBwcmludGYgKCJEV19PUF9zaGwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2hyOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2hyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3NocmE6Ci0gICAgICBwcmludGYgKCJEV19PUF9zaHJhIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3hvcjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3hvciIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmE6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9lcToKLSAgICAgIHByaW50ZiAoIkRXX09QX2VxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2dlOgotICAgICAgcHJpbnRmICgiRFdfT1BfZ2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZ3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9ndCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9sZToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2x0OgotICAgICAgcHJpbnRmICgiRFdfT1BfbHQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbmU6Ci0gICAgICBwcmludGYgKCJEV19PUF9uZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9za2lwOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2tpcDogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDA6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDM6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDU6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDY6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDc6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDg6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDk6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDEwOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTE6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDEyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDEzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxNCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE2OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTc6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxNyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE5OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjA6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDIxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIyOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjM6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyMyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI1OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjY6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyNiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI4OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0Mjk6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyOSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQzMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDMwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDMxOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MzEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnODoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnOToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTA6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzExIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzEyOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTM6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxMyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE1OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTY6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxNiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE4OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTk6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxOSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzIxOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjI6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyMiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI0OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjU6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyNSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI3OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjg6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyOCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyOToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzMwOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMzAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWczMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcwOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWczOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc0OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc1OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc2OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc3OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc4OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnOToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc5OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTA6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEyOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzEyOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTM6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE1OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE1OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTY6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTY6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE4OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE4OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTk6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTk6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIxOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzIxOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjI6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjI6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyMzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI0OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI0OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjU6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjU6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyNjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI3OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI3OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjg6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjg6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyOToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyOTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzMwOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzMwOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMzE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZ3g6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWd4OiAlbHUiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9mYnJlZzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2ZicmVnOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVneDoKLSAgICAgIHV2YWx1ZSA9IHJlYWRfbGViMTI4IChkYXRhLCAmYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVneDogJWx1ICVsZCIsIHV2YWx1ZSwKLQkgICAgICByZWFkX2xlYjEyOCAoZGF0YSArIGJ5dGVzX3JlYWQsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGllY2U6Ci0gICAgICBwcmludGYgKCJEV19PUF9waWVjZTogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZGVyZWZfc2l6ZToKLSAgICAgIHByaW50ZiAoIkRXX09QX2RlcmVmX3NpemU6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF94ZGVyZWZfc2l6ZToKLSAgICAgIHByaW50ZiAoIkRXX09QX3hkZXJlZl9zaXplOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfbm9wOgotICAgICAgcHJpbnRmICgiRFdfT1Bfbm9wIik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAob3AgPj0gRFdfT1BfbG9fdXNlcgotCSAgJiYgb3AgPD0gRFdfT1BfaGlfdXNlcikKLQlwcmludGYgKF8oIihVc2VyIGRlZmluZWQgbG9jYXRpb24gb3ApIikpOwotICAgICAgZWxzZQotCXByaW50ZiAoXygiKFVua25vd24gbG9jYXRpb24gb3ApIikpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXJlYWRfYW5kX2Rpc3BsYXlfYXR0ciAoYXR0cmlidXRlLCBmb3JtLCBkYXRhLCBwb2ludGVyX3NpemUpCi0gICAgIHVuc2lnbmVkIGxvbmcgICBhdHRyaWJ1dGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICBmb3JtOwotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyAgIHBvaW50ZXJfc2l6ZTsKLXsKLSAgdW5zaWduZWQgbG9uZyAgIHV2YWx1ZSA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKiBibG9ja19zdGFydCA9IE5VTEw7Ci0gIGludCAgICAgICAgICAgICBieXRlc19yZWFkOwotICBpbnQJCSAgaXNfcmVmID0gMDsKLQotICBwcmludGYgKCIgICAgICUtMThzOiIsIGdldF9BVF9uYW1lIChhdHRyaWJ1dGUpKTsKLQotICBzd2l0Y2ggKGZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKLSAgICBjYXNlIERXX0ZPUk1fcmVmMToKLSAgICBjYXNlIERXX0ZPUk1fcmVmMjoKLSAgICBjYXNlIERXX0ZPUk1fcmVmNDoKLSAgICBjYXNlIERXX0ZPUk1fcmVmODoKLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgICAgaXNfcmVmID0gMTsKLSAgICB9Ci0KLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX2FkZHI6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgcG9pbnRlcl9zaXplKTsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JXg+IiA6ICIgJSN4IiwgdXZhbHVlKTsKLSAgICAgIGRhdGEgKz0gcG9pbnRlcl9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmMToKLSAgICBjYXNlIERXX0ZPUk1fZmxhZzoKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTE6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSArKywgMSk7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCV4PiIgOiAiICVkIiwgdXZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZjI6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGEyOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDIpOwotICAgICAgZGF0YSArPSAyOwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwleD4iIDogIiAlZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWY0OgotICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLSAgICAgIGRhdGEgKz0gNDsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JXg+IiA6ICIgJWQiLCB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmODoKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTg6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0gICAgICBwcmludGYgKCIgJWx4IiwgdXZhbHVlKTsKLSAgICAgIHByaW50ZiAoIiAlbHgiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7Ci0gICAgICBkYXRhICs9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6Ci0gICAgICBwcmludGYgKCIgJXMiLCBkYXRhKTsKLSAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9zZGF0YToKLSAgICAgIHV2YWx1ZSA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDEpOwotICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotICAgICAgcHJpbnRmICgiICVsZCIsIChsb25nKSB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgIGNhc2UgRFdfRk9STV91ZGF0YToKLSAgICAgIHV2YWx1ZSA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwlbHg+IiA6ICIgJWxkIiwgdXZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrOgotICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBibG9ja19zdGFydCA9IGRhdGEgKyBieXRlc19yZWFkOwotICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOwotICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCAxKTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIDE7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2syOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDIpOwotICAgICAgYmxvY2tfc3RhcnQgPSBkYXRhICsgMjsKLSAgICAgIGRhdGEgPSBkaXNwbGF5X2Jsb2NrIChibG9ja19zdGFydCwgdXZhbHVlKTsKLSAgICAgIHV2YWx1ZSA9ICogYmxvY2tfc3RhcnQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0gICAgICBibG9ja19zdGFydCA9IGRhdGEgKyA0OwotICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOwotICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3N0cnA6Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgotICAgICAgd2FybiAoXygiVW5hYmxlIHRvIGhhbmRsZSBGT1JNOiAlZCIpLCBmb3JtKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHdhcm4gKF8oIlVucmVjb2duaXNlZCBmb3JtOiAlZCIpLCBmb3JtKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBGb3Igc29tZSBhdHRyaWJ1dGVzIHdlIGNhbiBkaXNwbGF5IGZ1dGhlciBpbmZvcm1hdGlvbi4gICovCi0KLSAgcHJpbnRmICgiXHQiKTsKLQotICBzd2l0Y2ggKGF0dHJpYnV0ZSkKLSAgICB7Ci0gICAgY2FzZSBEV19BVF9pbmxpbmU6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19JTkxfbm90X2lubGluZWQ6ICAgICAgICAgIHByaW50ZiAoXygiKG5vdCBpbmxpbmVkKSIpKTsgYnJlYWs7Ci0JY2FzZSBEV19JTkxfaW5saW5lZDogICAgICAgICAgICAgIHByaW50ZiAoXygiKGlubGluZWQpIikpOyBicmVhazsKLQljYXNlIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZDogcHJpbnRmIChfKCIoZGVjbGFyZWQgYXMgaW5saW5lIGJ1dCBpZ25vcmVkKSIpKTsgYnJlYWs7Ci0JY2FzZSBEV19JTkxfZGVjbGFyZWRfaW5saW5lZDogICAgIHByaW50ZiAoXygiKGRlY2xhcmVkIGFzIGlubGluZSBhbmQgaW5saW5lZCkiKSk7IGJyZWFrOwotCWRlZmF1bHQ6IHByaW50ZiAoXygiICAoVW5rbm93biBpbmxpbmUgYXR0cmlidXRlIHZhbHVlOiAlbHgpIiksIHV2YWx1ZSk7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9mcmFtZV9iYXNlOgotICAgICAgaWYgKHV2YWx1ZSA+PSBEV19PUF9yZWcwICYmIHV2YWx1ZSA8PSBEV19PUF9yZWczMSkKLQlwcmludGYgKCIocmVnICVsZCkiLCB1dmFsdWUgLSBEV19PUF9yZWcwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9sYW5ndWFnZToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0xBTkdfQzogICAgICAgICAgICAgIHByaW50ZiAoIihub24tQU5TSSBDKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfQzg5OiAgICAgICAgICAgIHByaW50ZiAoIihBTlNJIEMpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19DX3BsdXNfcGx1czogICAgcHJpbnRmICgiKEMrKykiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0ZvcnRyYW43NzogICAgICBwcmludGYgKCIoRk9SVFJBTiA3NykiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0ZvcnRyYW45MDogICAgICBwcmludGYgKCIoRm9ydHJhbiA5MCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX01vZHVsYTI6ICAgICAgICBwcmludGYgKCIoTW9kdWxhIDIpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19QYXNjYWw4MzogICAgICAgcHJpbnRmICgiKEFOU0kgUGFzY2FsKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfQWRhODM6ICAgICAgICAgIHByaW50ZiAoIihBZGEpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19Db2JvbDc0OiAgICAgICAgcHJpbnRmICgiKENvYm9sIDc0KSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfQ29ib2w4NTogICAgICAgIHByaW50ZiAoIihDb2JvbCA4NSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX01pcHNfQXNzZW1ibGVyOiBwcmludGYgKCIoTUlQUyBhc3NlbWJsZXIpIik7IGJyZWFrOwotCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiKFVua25vd246ICVseCkiLCB1dmFsdWUpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfZW5jb2Rpbmc6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19BVEVfdm9pZDogICAgICAgICAgICBwcmludGYgKCIodm9pZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfYWRkcmVzczogICAgICAgICBwcmludGYgKCIobWFjaGluZSBhZGRyZXNzKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9ib29sZWFuOiAgICAgICAgIHByaW50ZiAoIihib29sZWFuKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9jb21wbGV4X2Zsb2F0OiAgIHByaW50ZiAoIihjb21wbGV4IGZsb2F0KSIpOyBicmVhazsKLQljYXNlIERXX0FURV9mbG9hdDogICAgICAgICAgIHByaW50ZiAoIihmbG9hdCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfc2lnbmVkOiAgICAgICAgICBwcmludGYgKCIoc2lnbmVkKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9zaWduZWRfY2hhcjogICAgIHByaW50ZiAoIihzaWduZWQgY2hhcikiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfdW5zaWduZWQ6ICAgICAgICBwcmludGYgKCIodW5zaWduZWQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX3Vuc2lnbmVkX2NoYXI6ICAgcHJpbnRmICgiKHVuc2lnbmVkIGNoYXIpIik7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAodXZhbHVlID49IERXX0FURV9sb191c2VyCi0JICAgICAgJiYgdXZhbHVlIDw9IERXX0FURV9oaV91c2VyKQotCSAgICBwcmludGYgKCIodXNlciBkZWZpbmVkIHR5cGUpIik7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIih1bmtub3duIHR5cGUpIik7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfYWNjZXNzaWJpbGl0eToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0FDQ0VTU19wdWJsaWM6CQlwcmludGYgKCIocHVibGljKSIpOyBicmVhazsKLQljYXNlIERXX0FDQ0VTU19wcm90ZWN0ZWQ6CXByaW50ZiAoIihwcm90ZWN0ZWQpIik7IGJyZWFrOwotCWNhc2UgRFdfQUNDRVNTX3ByaXZhdGU6CQlwcmludGYgKCIocHJpdmF0ZSkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoJCSAgICAgICAgcHJpbnRmICgiKHVua25vd24gYWNjZXNzaWJpbGl0eSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX3Zpc2liaWxpdHk6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19WSVNfbG9jYWw6CXByaW50ZiAoIihsb2NhbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19WSVNfZXhwb3J0ZWQ6CXByaW50ZiAoIihleHBvcnRlZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19WSVNfcXVhbGlmaWVkOglwcmludGYgKCIocXVhbGlmaWVkKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJcHJpbnRmICgiKHVua25vd24gdmlzaWJpbGl0eSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX3ZpcnR1YWxpdHk6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19WSVJUVUFMSVRZX25vbmU6CXByaW50ZiAoIihub25lKSIpOyBicmVhazsKLQljYXNlIERXX1ZJUlRVQUxJVFlfdmlydHVhbDoJcHJpbnRmICgiKHZpcnR1YWwpIik7IGJyZWFrOwotCWNhc2UgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWw6cHJpbnRmICgiKHB1cmVfdmlydHVhbCkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoJCSAgICAgICAgcHJpbnRmICgiKHVua25vd24gdmlydHVhbGl0eSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2lkZW50aWZpZXJfY2FzZToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlOglwcmludGYgKCIoY2FzZV9zZW5zaXRpdmUpIik7IGJyZWFrOwotCWNhc2UgRFdfSURfdXBfY2FzZToJCXByaW50ZiAoIih1cF9jYXNlKSIpOyBicmVhazsKLQljYXNlIERXX0lEX2Rvd25fY2FzZToJCXByaW50ZiAoIihkb3duX2Nhc2UpIik7IGJyZWFrOwotCWNhc2UgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZToJcHJpbnRmICgiKGNhc2VfaW5zZW5zaXRpdmUpIik7IGJyZWFrOwotCWRlZmF1bHQ6CQkgICAgICAgIHByaW50ZiAoIih1bmtub3duIGNhc2UpIik7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb246Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19DQ19ub3JtYWw6CXByaW50ZiAoIihub3JtYWwpIik7IGJyZWFrOwotCWNhc2UgRFdfQ0NfcHJvZ3JhbToJcHJpbnRmICgiKHByb2dyYW0pIik7IGJyZWFrOwotCWNhc2UgRFdfQ0Nfbm9jYWxsOglwcmludGYgKCIobm9jYWxsKSIpOyBicmVhazsKLQlkZWZhdWx0OgotCSAgaWYgKHV2YWx1ZSA+PSBEV19DQ19sb191c2VyCi0JICAgICAgJiYgdXZhbHVlIDw9IERXX0NDX2hpX3VzZXIpCi0JICAgIHByaW50ZiAoIih1c2VyIGRlZmluZWQpIik7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIih1bmtub3duIGNvbnZlbnRpb24pIik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2xvY2F0aW9uOgotICAgIGNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246Ci0gICAgY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjoKLSAgICAgIHByaW50ZiAoIigiKTsKLSAgICAgIGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uIChibG9ja19zdGFydCwgcG9pbnRlcl9zaXplKTsKLSAgICAgIHByaW50ZiAoIikiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotICByZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19pbmZvIChzZWN0aW9uLCBzdGFydCwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICBzdGFydDsKLSAgICAgRklMRSAqICAgICAgICAgICAgICAgIGZpbGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKiBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgKiBzZWN0aW9uX2JlZ2luID0gc3RhcnQ7Ci0KLSAgcHJpbnRmIChfKCJUaGUgc2VjdGlvbiAlcyBjb250YWluczpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHdoaWxlIChzdGFydCA8IGVuZCkKLSAgICB7Ci0gICAgICBEV0FSRjJfRXh0ZXJuYWxfQ29tcFVuaXQgKiBleHRlcm5hbDsKLSAgICAgIERXQVJGMl9JbnRlcm5hbF9Db21wVW5pdCAgIGNvbXB1bml0OwotICAgICAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgdGFnczsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgICBpbnQJCQkgbGV2ZWw7Ci0KLSAgICAgIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9Db21wVW5pdCAqKSBzdGFydDsKLQotICAgICAgY29tcHVuaXQuY3VfbGVuZ3RoICAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfbGVuZ3RoKTsKLSAgICAgIGNvbXB1bml0LmN1X3ZlcnNpb24gICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X3ZlcnNpb24pOwotICAgICAgY29tcHVuaXQuY3VfYWJicmV2X29mZnNldCA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfYWJicmV2X29mZnNldCk7Ci0gICAgICBjb21wdW5pdC5jdV9wb2ludGVyX3NpemUgID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9wb2ludGVyX3NpemUpOwotCi0gICAgICB0YWdzID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotICAgICAgc3RhcnQgKz0gY29tcHVuaXQuY3VfbGVuZ3RoICsgc2l6ZW9mIChleHRlcm5hbC0+Y3VfbGVuZ3RoKTsKLQotICAgICAgaWYgKGNvbXB1bml0LmN1X3ZlcnNpb24gIT0gMikKLQl7Ci0JICB3YXJuIChfKCJPbmx5IHZlcnNpb24gMiBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBwcmludGYgKF8oIiAgQ29tcGlsYXRpb24gVW5pdDpcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICAgTGVuZ3RoOiAgICAgICAgJWxkXG4iKSwgY29tcHVuaXQuY3VfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICAgVmVyc2lvbjogICAgICAgJWRcbiIpLCBjb21wdW5pdC5jdV92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiICAgQWJicmV2IE9mZnNldDogJWxkXG4iKSwgY29tcHVuaXQuY3VfYWJicmV2X29mZnNldCk7Ci0gICAgICBwcmludGYgKF8oIiAgIFBvaW50ZXIgU2l6ZTogICVkXG4iKSwgY29tcHVuaXQuY3VfcG9pbnRlcl9zaXplKTsKLQotICAgICAgaWYgKGZpcnN0X2FiYnJldiAhPSBOVUxMKQotCWZyZWVfYWJicmV2cyAoKTsKLQotICAgICAgLyogUmVhZCBpbiB0aGUgYWJicmV2cyB1c2VkIGJ5IHRoaXMgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLSAgICAgIHsKLQlFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjOwotCXVuc2lnbmVkIGNoYXIgKiAgICAgICBiZWdpbjsKLQotCS8qIExvY2F0ZSB0aGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIGFuZCBwcm9jZXNzIGl0LiAgKi8KLQlmb3IgKGkgPSAwLCBzZWMgPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotCSAgICAgaSArKywgc2VjICsrKQotCSAgaWYgKHN0cmNtcCAoU0VDVElPTl9OQU1FIChzZWMpLCAiLmRlYnVnX2FiYnJldiIpID09IDApCi0JICAgIGJyZWFrOwotCi0JaWYgKGkgPT0gLTEgfHwgc2VjLT5zaF9zaXplID09IDApCi0JICB7Ci0JICAgIHdhcm4gKF8oIlVuYWJsZSB0byBsb2NhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIVxuIikpOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQotCUdFVF9EQVRBX0FMTE9DIChzZWMtPnNoX29mZnNldCwgc2VjLT5zaF9zaXplLCBiZWdpbiwgdW5zaWduZWQgY2hhciAqLAotCQkJImRlYnVnX2FiYnJldiBzZWN0aW9uIGRhdGEiKTsKLQotCXByb2Nlc3NfYWJicmV2X3NlY3Rpb24gKGJlZ2luICsgY29tcHVuaXQuY3VfYWJicmV2X29mZnNldCwKLQkJCQliZWdpbiArIHNlYy0+c2hfc2l6ZSk7Ci0KLQlmcmVlIChiZWdpbik7Ci0gICAgICB9Ci0KLSAgICAgIGxldmVsID0gMDsKLSAgICAgIHdoaWxlICh0YWdzIDwgc3RhcnQpCi0JewotCSAgaW50ICAgICAgICAgICAgYnl0ZXNfcmVhZDsKLQkgIHVuc2lnbmVkIGxvbmcgIGFiYnJldl9udW1iZXI7Ci0JICBhYmJyZXZfZW50cnkgKiBlbnRyeTsKLQkgIGFiYnJldl9hdHRyICAqIGF0dHI7Ci0KLQkgIGFiYnJldl9udW1iZXIgPSByZWFkX2xlYjEyOCAodGFncywgJiBieXRlc19yZWFkLCAwKTsKLQkgIHRhZ3MgKz0gYnl0ZXNfcmVhZDsKLQotCSAgLyogQSBudWxsIERJRSBtYXJrcyB0aGUgZW5kIG9mIGEgbGlzdCBvZiBjaGlsZHJlbi4gICovCi0JICBpZiAoYWJicmV2X251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgLS1sZXZlbDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTY2FuIHRocm91Z2ggdGhlIGFiYnJldmlhdGlvbiBsaXN0IHVudGlsIHdlIHJlYWNoIHRoZQotCSAgICAgY29ycmVjdCBlbnRyeS4gICovCi0JICBmb3IgKGVudHJ5ID0gZmlyc3RfYWJicmV2OwotCSAgICAgICBlbnRyeSAmJiBlbnRyeS0+ZW50cnkgIT0gYWJicmV2X251bWJlcjsKLQkgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChlbnRyeSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgd2FybiAoXygiVW5hYmxlIHRvIGxvY2F0ZSBlbnRyeSAlbHUgaW4gdGhlIGFiYnJldmlhdGlvbiB0YWJsZVxuIiksCi0JCSAgICBhYmJyZXZfbnVtYmVyKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCi0JICBwcmludGYgKF8oIiA8JWQ+PCV4PjogQWJicmV2IE51bWJlcjogJWx1ICglcylcbiIpLAotCQkgIGxldmVsLCB0YWdzIC0gc2VjdGlvbl9iZWdpbiAtIGJ5dGVzX3JlYWQsCi0JCSAgYWJicmV2X251bWJlciwKLQkJICBnZXRfVEFHX25hbWUgKGVudHJ5LT50YWcpKTsKLQotCSAgZm9yIChhdHRyID0gZW50cnktPmZpcnN0X2F0dHI7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQotCSAgICB0YWdzID0gcmVhZF9hbmRfZGlzcGxheV9hdHRyIChhdHRyLT5hdHRyaWJ1dGUsCi0JCQkJCSAgYXR0ci0+Zm9ybSwKLQkJCQkJICB0YWdzLAotCQkJCQkgIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSk7Ci0KLQkgIGlmIChlbnRyeS0+Y2hpbGRyZW4pCi0JICAgICsrbGV2ZWw7Ci0JfQotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX2FyYW5nZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBjaGFyICogZW5kID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotCi0gIHByaW50ZiAoXygiVGhlIHNlY3Rpb24gJXMgY29udGFpbnM6XG5cbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoc3RhcnQgPCBlbmQpCi0gICAgewotICAgICAgRFdBUkYyX0V4dGVybmFsX0FSYW5nZSAqIGV4dGVybmFsOwotICAgICAgRFdBUkYyX0ludGVybmFsX0FSYW5nZSAgIGFyYW5nZTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICByYW5nZXM7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgbGVuZ3RoOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGFkZHJlc3M7Ci0gICAgICBpbnQJCSAgICAgICBleGNlc3M7Ci0KLSAgICAgIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9BUmFuZ2UgKikgc3RhcnQ7Ci0KLSAgICAgIGFyYW5nZS5hcl9sZW5ndGggICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmFyX2xlbmd0aCk7Ci0gICAgICBhcmFuZ2UuYXJfdmVyc2lvbiAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl92ZXJzaW9uKTsKLSAgICAgIGFyYW5nZS5hcl9pbmZvX29mZnNldCAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmFyX2luZm9fb2Zmc2V0KTsKLSAgICAgIGFyYW5nZS5hcl9wb2ludGVyX3NpemUgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmFyX3BvaW50ZXJfc2l6ZSk7Ci0gICAgICBhcmFuZ2UuYXJfc2VnbWVudF9zaXplID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9zZWdtZW50X3NpemUpOwotCi0gICAgICBwcmludGYgKF8oIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAlbGRcbiIpLCBhcmFuZ2UuYXJfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICVkXG4iKSwgYXJhbmdlLmFyX3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvOiAgJWx4XG4iKSwgYXJhbmdlLmFyX2luZm9fb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoXygiICBQb2ludGVyIFNpemU6ICAgICAgICAgICAgICVkXG4iKSwgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2VnbWVudCBTaXplOiAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl9zZWdtZW50X3NpemUpOwotCi0gICAgICBwcmludGYgKF8oIlxuICAgIEFkZHJlc3MgIExlbmd0aFxuIikpOwotCi0gICAgICByYW5nZXMgPSBzdGFydCArIHNpemVvZiAoKiBleHRlcm5hbCk7Ci0KLSAgICAgIC8qIE11c3QgcGFkIHRvIGFuIGFsaWdubWVudCBib3VuZGFyeSB0aGF0IGlzIHR3aWNlIHRoZSBwb2ludGVyIHNpemUuICAqLwotICAgICAgZXhjZXNzID0gc2l6ZW9mICgqZXh0ZXJuYWwpICUgKDIgKiBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKTsKLSAgICAgIGlmIChleGNlc3MpCi0JcmFuZ2VzICs9ICgyICogYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSkgLSBleGNlc3M7Ci0KLSAgICAgIGZvciAoOzspCi0JewotCSAgYWRkcmVzcyA9IGJ5dGVfZ2V0IChyYW5nZXMsIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpOwotCi0JICByYW5nZXMgKz0gYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZTsKLQotCSAgbGVuZ3RoICA9IGJ5dGVfZ2V0IChyYW5nZXMsIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpOwotCi0JICByYW5nZXMgKz0gYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZTsKLQotCSAgLyogQSBwYWlyIG9mIHplcm9zIG1hcmtzIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLwotCSAgaWYgKGFkZHJlc3MgPT0gMCAmJiBsZW5ndGggPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIHByaW50ZiAoIiAgICAlOC44bHggJWx1XG4iLCBhZGRyZXNzLCBsZW5ndGgpOwotCX0KLQotICAgICAgc3RhcnQgKz0gYXJhbmdlLmFyX2xlbmd0aCArIHNpemVvZiAoZXh0ZXJuYWwtPmFyX2xlbmd0aCk7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIChzZWN0aW9uLCBzdGFydCwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICBzdGFydCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBwcmludGYgKF8oIkRpc3BsYXlpbmcgdGhlIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iKSwKLQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFByZS1zY2FuIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIHRvIHJlY29yZCB0aGUgc2l6ZSBvZiBhZGRyZXNzLgotICAgV2hlbiBkdW1waW5nIHRoZSAuZGVidWdfbGluZSwgd2UgdXNlIHRoYXQgc2l6ZSBpbmZvcm1hdGlvbiwgYXNzdW1pbmcKLSAgIHRoYXQgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIGhhdmUgdGhlIHNhbWUgYWRkcmVzcyBzaXplLiAgKi8KLXN0YXRpYyBpbnQKLXByZXNjYW5fZGVidWdfaW5mbyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICBzdGFydDsKLSAgICAgRklMRSAqICAgICAgICAgICAgICAgIGZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgRFdBUkYyX0V4dGVybmFsX0NvbXBVbml0ICogZXh0ZXJuYWw7Ci0KLSAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX0NvbXBVbml0ICopIHN0YXJ0OwotCi0gIGRlYnVnX2xpbmVfcG9pbnRlcl9zaXplID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9wb2ludGVyX3NpemUpOwotICByZXR1cm4gMDsKLX0KLQotICAvKiBBIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgZGVidWcgc2VjdGlvbiBhbmQgYSBwb2ludGVyCi0gICAgIHRvIGEgZnVuY3Rpb24gdGhhdCBjYW4gZGVjb2RlIGl0LiAgVGhlIHRoaXJkIGZpZWxkIGlzIGEgcHJlc2NhbgotICAgICBmdW5jdGlvbiB0byBiZSBydW4gb3ZlciB0aGUgc2VjdGlvbiBiZWZvcmUgZGlzcGxheWluZyBhbnkgb2YgdGhlCi0gICAgIHNlY3Rpb25zLiAgKi8KLXN0cnVjdAotewotICBjaGFyICogbmFtZTsKLSAgaW50ICgqIGRpc3BsYXkpIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLSAgaW50ICgqIHByZXNjYW4pIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLX0KLWRlYnVnX2Rpc3BsYXlzW10gPQotewotICB7ICIuZGVidWdfaW5mbyIsICAgICAgICBkaXNwbGF5X2RlYnVnX2luZm8sIHByZXNjYW5fZGVidWdfaW5mbyB9LAotICB7ICIuZGVidWdfYWJicmV2IiwgICAgICBkaXNwbGF5X2RlYnVnX2FiYnJldiwgTlVMTCB9LAotICB7ICIuZGVidWdfbGluZSIsICAgICAgICBkaXNwbGF5X2RlYnVnX2xpbmVzLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z19hcmFuZ2VzIiwgICAgIGRpc3BsYXlfZGVidWdfYXJhbmdlcywgTlVMTCB9LAotICB7ICIuZGVidWdfcHVibmFtZXMiLCAgICBkaXNwbGF5X2RlYnVnX3B1Ym5hbWVzLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z19tYWNpbmZvIiwgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCwgTlVMTCB9LAotICB7ICIuZGVidWdfZnJhbWUiLCAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX3N0ciIsICAgICAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z19zdGF0aWNfZnVuYyIsIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCwgTlVMTCB9LAotICB7ICIuZGVidWdfc3RhdGljX3ZhcnMiLCBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX3R5cGVzIiwgICAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z193ZWFrbmFtZXMiLCAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICBGSUxFICogZmlsZTsKLXsKLSAgY2hhciAqICAgICAgICAgIG5hbWUgPSBTRUNUSU9OX05BTUUgKHNlY3Rpb24pOwotICBiZmRfc2l6ZV90eXBlICAgbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0gIGludCAgICAgICAgICAgICBpOwotCi0gIGxlbmd0aCA9IHNlY3Rpb24tPnNoX3NpemU7Ci0gIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuU2VjdGlvbiAnJXMnIGhhcyBubyBkZWJ1Z2dpbmcgZGF0YS5cbiIpLCBuYW1lKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBsZW5ndGgsIHN0YXJ0LCB1bnNpZ25lZCBjaGFyICosCi0JCSAgImRlYnVnIHNlY3Rpb24gZGF0YSIpOwotCi0gIC8qIFNlZSBpZiB3ZSBrbm93IGhvdyB0byBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uICAqLwotICBmb3IgKGkgPSBOVU1fRUxFTSAoZGVidWdfZGlzcGxheXMpOyBpLS07KQotICAgIGlmIChzdHJjbXAgKGRlYnVnX2Rpc3BsYXlzW2ldLm5hbWUsIG5hbWUpID09IDApCi0gICAgICB7Ci0JZGVidWdfZGlzcGxheXNbaV0uZGlzcGxheSAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gIGlmIChpID09IC0xKQotICAgIHByaW50ZiAoXygiVW5yZWNvZ25pc2VkIGRlYnVnIHNlY3Rpb246ICVzXG4iKSwgbmFtZSk7Ci0KLSAgZnJlZSAoc3RhcnQpOwotCi0gIC8qIElmIHdlIGxvYWRlZCBpbiB0aGUgYWJicmV2IHNlY3Rpb24gYXQgc29tZSBwb2ludCwKLSAgICAgd2UgbXVzdCByZWxlYXNlIGl0IGhlcmUuICAqLwotICBpZiAoZmlyc3RfYWJicmV2ICE9IE5VTEwpCi0gICAgZnJlZV9hYmJyZXZzICgpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3NlY3Rpb25fY29udGVudHMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgdW5zaWduZWQgaW50ICAJaTsKLQotICBpZiAoISBkb19kdW1wKQotICAgIHJldHVybiAxOwotCi0gIC8qIFByZS1zY2FuIHRoZSBkZWJ1ZyBzZWN0aW9ucyB0byBmaW5kIHNvbWUgZGVidWcgaW5mb3JtYXRpb24gbm90Ci0gICAgIHByZXNlbnQgaW4gc29tZSBvZiB0aGVtLiAgRm9yIHRoZSAuZGVidWdfbGluZSwgd2UgbXVzdCBmaW5kIG91dCB0aGUKLSAgICAgc2l6ZSBvZiBhZGRyZXNzIChzcGVjaWZpZWQgaW4gLmRlYnVnX2luZm8gYW5kIC5kZWJ1Z19hcmFuZ2VzKS4gICovCi0gIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bSAmJiBpIDwgbnVtX2R1bXBfc2VjdHM7Ci0gICAgICAgaSArKywgc2VjdGlvbiArKykKLSAgICB7Ci0gICAgICBjaGFyICoJbmFtZSA9IFNFQ1RJT05fTkFNRSAoc2VjdGlvbik7Ci0gICAgICBpbnQgICAgICAgajsKLQotICAgICAgaWYgKHNlY3Rpb24tPnNoX3NpemUgPT0gMCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBzb21lIHByZS1zY2FuIG9wZXJhdGlvbiBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaiA9IE5VTV9FTEVNIChkZWJ1Z19kaXNwbGF5cyk7IGotLTspCi0gICAgICAgIGlmIChzdHJjbXAgKGRlYnVnX2Rpc3BsYXlzW2pdLm5hbWUsIG5hbWUpID09IDApCi0JICB7Ci0JICAgIGlmIChkZWJ1Z19kaXNwbGF5c1tqXS5wcmVzY2FuICE9IE5VTEwpCi0JICAgICAgewotCQliZmRfc2l6ZV90eXBlICAgbGVuZ3RoOwotCQl1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0KLQkJbGVuZ3RoID0gc2VjdGlvbi0+c2hfc2l6ZTsKLQkJR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgbGVuZ3RoLCBzdGFydCwgdW5zaWduZWQgY2hhciAqLAotCQkJCSJkZWJ1ZyBzZWN0aW9uIGRhdGEiKTsKLQotCQlkZWJ1Z19kaXNwbGF5c1tqXS5wcmVzY2FuIChzZWN0aW9uLCBzdGFydCwgZmlsZSk7Ci0JCWZyZWUgKHN0YXJ0KTsKLQkgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtICYmIGkgPCBudW1fZHVtcF9zZWN0czsKLSAgICAgICBpICsrLCBzZWN0aW9uICsrKQotICAgIHsKLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0gICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIERJU0FTU19EVU1QKQotCWRpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOwotI2VuZGlmCi0gICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIEhFWF9EVU1QKQotCWR1bXBfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSk7Ci0KLSAgICAgIGlmIChkdW1wX3NlY3RzW2ldICYgREVCVUdfRFVNUCkKLQlkaXNwbGF5X2RlYnVnX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOwotICAgIH0KLQotICBpZiAoaSA8IG51bV9kdW1wX3NlY3RzKQotICAgIHdhcm4gKF8oIlNvbWUgc2VjdGlvbnMgd2VyZSBub3QgZHVtcGVkIGJlY2F1c2UgdGhleSBkbyBub3QgZXhpc3QhXG4iKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAobWFzaykKLSAgICAgaW50IG1hc2s7Ci17Ci0gIGlmIChtYXNrKQotICAgIHsKLSAgICAgIGludCBmaXJzdCA9IDE7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfSU5FWCkKLQlmcHV0cyAoIklORVgiLCBzdGRvdXQpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfVUZMTykKLQlwcmludGYgKCIlc1VGTE8iLCBmaXJzdCA/ICIiIDogInwiKSwgZmlyc3QgPSAwOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX09GTE8pCi0JcHJpbnRmICgiJXNPRkxPIiwgZmlyc3QgPyAiIiA6ICJ8IiksIGZpcnN0ID0gMDsKLSAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9ESVYwKQotCXByaW50ZiAoIiVzRElWMCIsIGZpcnN0ID8gIiIgOiAifCIpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfSU5WQUwpCi0JcHJpbnRmICgiJXNJTlZBTCIsIGZpcnN0ID8gIiIgOiAifCIpOwotICAgIH0KLSAgZWxzZQotICAgIGZwdXRzICgiMCIsIHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfbWlwc19zcGVjaWZpYyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLSAgc2l6ZV90IGxpYmxpc3Rfb2Zmc2V0ID0gMDsKLSAgc2l6ZV90IGxpYmxpc3RubyA9IDA7Ci0gIHNpemVfdCBjb25mbGljdHNubyA9IDA7Ci0gIHNpemVfdCBvcHRpb25zX29mZnNldCA9IDA7Ci0gIHNpemVfdCBjb25mbGljdHNfb2Zmc2V0ID0gMDsKLQotICAvKiBXZSBoYXZlIGEgbG90IG9mIHNwZWNpYWwgc2VjdGlvbnMuICBUaGFua3MgU0dJISAgKi8KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIC8qIE5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gICovCi0gICAgcmV0dXJuIDA7Ci0KLSAgZm9yIChlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsgZW50cnktPmRfdGFnICE9IERUX05VTEw7ICsrZW50cnkpCi0gICAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0gICAgICB7Ci0gICAgICBjYXNlIERUX01JUFNfTElCTElTVDoKLQlsaWJsaXN0X29mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgotCWxpYmxpc3RubyA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX09QVElPTlM6Ci0Jb3B0aW9uc19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOgotCWNvbmZsaWN0c19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86Ci0JY29uZmxpY3Rzbm8gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgaWYgKGxpYmxpc3Rfb2Zmc2V0ICE9IDAgJiYgbGlibGlzdG5vICE9IDAgJiYgZG9fZHluYW1pYykKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9MaWIgKiBlbGliOwotICAgICAgc2l6ZV90IGNudDsKLQotICAgICAgR0VUX0RBVEFfQUxMT0MgKGxpYmxpc3Rfb2Zmc2V0LCBsaWJsaXN0bm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX0xpYiksCi0JCSAgICAgIGVsaWIsIEVsZjMyX0V4dGVybmFsX0xpYiAqLCAibGlibGlzdCIpOwotCi0gICAgICBwcmludGYgKCJcblNlY3Rpb24gJy5saWJsaXN0JyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwgbGlibGlzdG5vKTsKLSAgICAgIGZwdXRzICgiICAgICBMaWJyYXJ5ICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtICAgVmVyc2lvbiBGbGFnc1xuIiwKLQkgICAgIHN0ZG91dCk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgbGlibGlzdG5vOyArK2NudCkKLQl7Ci0JICBFbGYzMl9MaWIgbGlibGlzdDsKLQkgIHRpbWVfdCB0aW1lOwotCSAgY2hhciB0aW1lYnVmWzIwXTsKLQotCSAgbGlibGlzdC5sX25hbWUgPSBCWVRFX0dFVCAoZWxpYltjbnRdLmxfbmFtZSk7Ci0JICB0aW1lID0gQllURV9HRVQgKGVsaWJbY250XS5sX3RpbWVfc3RhbXApOwotCSAgbGlibGlzdC5sX2NoZWNrc3VtID0gQllURV9HRVQgKGVsaWJbY250XS5sX2NoZWNrc3VtKTsKLQkgIGxpYmxpc3QubF92ZXJzaW9uID0gQllURV9HRVQgKGVsaWJbY250XS5sX3ZlcnNpb24pOwotCSAgbGlibGlzdC5sX2ZsYWdzID0gQllURV9HRVQgKGVsaWJbY250XS5sX2ZsYWdzKTsKLQotCSAgc3RyZnRpbWUgKHRpbWVidWYsIDIwLCAiJVktJW0tJWRUJUg6JU06JVMiLCBnbXRpbWUgKCZ0aW1lKSk7Ci0KLQkgIHByaW50ZiAoIiUzZDogJS0yMHMgJXMgJSMxMGx4ICUtN2xkIiwgY250LAotCQkgIGR5bmFtaWNfc3RyaW5ncyArIGxpYmxpc3QubF9uYW1lLCB0aW1lYnVmLAotCQkgIGxpYmxpc3QubF9jaGVja3N1bSwgbGlibGlzdC5sX3ZlcnNpb24pOwotCi0JICBpZiAobGlibGlzdC5sX2ZsYWdzID09IDApCi0JICAgIHB1dHMgKCIgTk9ORSIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdAotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQkJaW50IGJpdDsKLQkgICAgICB9IGxfZmxhZ3NfdmFsc1tdID0KLQkJewotCQkgIHsgIiBFWEFDVF9NQVRDSCIsIExMX0VYQUNUX01BVENIIH0sCi0JCSAgeyAiIElHTk9SRV9JTlRfVkVSIiwgTExfSUdOT1JFX0lOVF9WRVIgfSwKLQkJICB7ICIgUkVRVUlSRV9NSU5PUiIsIExMX1JFUVVJUkVfTUlOT1IgfSwKLQkJICB7ICIgRVhQT1JUUyIsIExMX0VYUE9SVFMgfSwKLQkJICB7ICIgREVMQVlfTE9BRCIsIExMX0RFTEFZX0xPQUQgfSwKLQkJICB7ICIgREVMVEEiLCBMTF9ERUxUQSB9Ci0JCX07Ci0JICAgICAgaW50IGZsYWdzID0gbGlibGlzdC5sX2ZsYWdzOwotCSAgICAgIHNpemVfdCBmY250OwotCi0JICAgICAgZm9yIChmY250ID0gMDsKLQkJICAgZmNudCA8IHNpemVvZiAobF9mbGFnc192YWxzKSAvIHNpemVvZiAobF9mbGFnc192YWxzWzBdKTsKLQkJICAgKytmY250KQotCQlpZiAoKGZsYWdzICYgbF9mbGFnc192YWxzW2ZjbnRdLmJpdCkgIT0gMCkKLQkJICB7Ci0JCSAgICBmcHV0cyAobF9mbGFnc192YWxzW2ZjbnRdLm5hbWUsIHN0ZG91dCk7Ci0JCSAgICBmbGFncyBePSBsX2ZsYWdzX3ZhbHNbZmNudF0uYml0OwotCQkgIH0KLQkgICAgICBpZiAoZmxhZ3MgIT0gMCkKLQkJcHJpbnRmICgiICUjeCIsICh1bnNpZ25lZCBpbnQpIGZsYWdzKTsKLQotCSAgICAgIHB1dHMgKCIiKTsKLQkgICAgfQotCX0KLQotICAgICAgZnJlZSAoZWxpYik7Ci0gICAgfQotCi0gIGlmIChvcHRpb25zX29mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICogZW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICogc2VjdCA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICogaW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICogb3B0aW9uOwotICAgICAgc2l6ZV90IG9mZnNldDsKLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHNlY3Rpb24gaGVhZGVyIHNvIHRoYXQgd2UgZ2V0IHRoZSBzaXplLiAgKi8KLSAgICAgIHdoaWxlIChzZWN0LT5zaF90eXBlICE9IFNIVF9NSVBTX09QVElPTlMpCi0JKytzZWN0OwotCi0gICAgICBHRVRfREFUQV9BTExPQyAob3B0aW9uc19vZmZzZXQsIHNlY3QtPnNoX3NpemUsIGVvcHQsCi0JCSAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICosICJvcHRpb25zIik7Ci0KLSAgICAgIGlvcHQgPSAoRWxmX0ludGVybmFsX09wdGlvbnMgKikgbWFsbG9jICgoc2VjdC0+c2hfc2l6ZSAvIHNpemVvZiAoZW9wdCkpCi0JCQkJCSAgICAgICogc2l6ZW9mICgqaW9wdCkpOwotICAgICAgaWYgKGlvcHQgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgb2Zmc2V0ID0gY250ID0gMDsKLSAgICAgIG9wdGlvbiA9IGlvcHQ7Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgc2VjdC0+c2hfc2l6ZSkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqIGVvcHRpb247Ci0KLQkgIGVvcHRpb24gPSAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgKChjaGFyICopIGVvcHQgKyBvZmZzZXQpOwotCi0JICBvcHRpb24tPmtpbmQgPSBCWVRFX0dFVCAoZW9wdGlvbi0+a2luZCk7Ci0JICBvcHRpb24tPnNpemUgPSBCWVRFX0dFVCAoZW9wdGlvbi0+c2l6ZSk7Ci0JICBvcHRpb24tPnNlY3Rpb24gPSBCWVRFX0dFVCAoZW9wdGlvbi0+c2VjdGlvbik7Ci0JICBvcHRpb24tPmluZm8gPSBCWVRFX0dFVCAoZW9wdGlvbi0+aW5mbyk7Ci0KLQkgIG9mZnNldCArPSBvcHRpb24tPnNpemU7Ci0JICArK29wdGlvbjsKLQkgICsrY250OwotCX0KLQotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiksCi0JICAgICAgc3RyaW5nX3RhYmxlICsgc2VjdC0+c2hfbmFtZSwgY250KTsKLQotICAgICAgb3B0aW9uID0gaW9wdDsKLSAgICAgIHdoaWxlIChjbnQtLSA+IDApCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgc3dpdGNoIChvcHRpb24tPmtpbmQpCi0JICAgIHsKLQkgICAgY2FzZSBPREtfTlVMTDoKLQkgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICAqLwotCSAgICAgIHByaW50ZiAoIiBOVUxMICAgICAgICVkICVseCIsIG9wdGlvbi0+c2VjdGlvbiwgb3B0aW9uLT5pbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfUkVHSU5GTzoKLQkgICAgICBwcmludGYgKCIgUkVHSU5GTyAgICAiKTsKLQkgICAgICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fTUlQUykKLQkJewotCQkgIC8qIDMyYml0IGZvcm0uICAqLwotCQkgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmVyZWc7Ci0JCSAgRWxmMzJfUmVnSW5mbyByZWdpbmZvOwotCi0JCSAgZXJlZyA9IChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopIChvcHRpb24gKyAxKTsKLQkJICByZWdpbmZvLnJpX2dwcm1hc2sgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BybWFzayk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMF0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1sxXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzFdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1syXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzNdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbM10pOwotCQkgIHJlZ2luZm8ucmlfZ3BfdmFsdWUgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BfdmFsdWUpOwotCi0JCSAgcHJpbnRmICgiR1BSICUwOGx4ICBHUCAweCVseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9ncHJtYXNrLAotCQkJICAodW5zaWduZWQgbG9uZykgcmVnaW5mby5yaV9ncF92YWx1ZSk7Ci0JCSAgcHJpbnRmICgiICAgICAgICAgICAgQ1BSMCAlMDhseCAgQ1BSMSAlMDhseCAgQ1BSMiAlMDhseCAgQ1BSMyAlMDhseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdLCByZWdpbmZvLnJpX2Nwcm1hc2tbMV0sCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSwgcmVnaW5mby5yaV9jcHJtYXNrWzNdKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIDY0IGJpdCBmb3JtLiAgKi8KLQkJICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICogZXJlZzsKLQkJICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIHJlZ2luZm87Ci0KLQkJICBlcmVnID0gKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikgKG9wdGlvbiArIDEpOwotCQkgIHJlZ2luZm8ucmlfZ3BybWFzayAgICA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncHJtYXNrKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1swXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzFdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMV0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzJdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1szXSk7Ci0JCSAgcmVnaW5mby5yaV9ncF92YWx1ZSAgID0gQllURV9HRVQ4IChlcmVnLT5yaV9ncF92YWx1ZSk7Ci0KLQkJICBwcmludGYgKCJHUFIgJTA4bHggIEdQIDB4IiwKLQkJCSAgcmVnaW5mby5yaV9ncHJtYXNrKTsKLQkJICBwcmludGZfdm1hIChyZWdpbmZvLnJpX2dwX3ZhbHVlKTsKLQkJICBwcmludGYgKCJcbiIpOwotCi0JCSAgcHJpbnRmICgiICAgICAgICAgICAgQ1BSMCAlMDhseCAgQ1BSMSAlMDhseCAgQ1BSMiAlMDhseCAgQ1BSMyAlMDhseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdLCByZWdpbmZvLnJpX2Nwcm1hc2tbMV0sCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSwgcmVnaW5mby5yaV9jcHJtYXNrWzNdKTsKLQkJfQotCSAgICAgICsrb3B0aW9uOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICBjYXNlIE9ES19FWENFUFRJT05TOgotCSAgICAgIGZwdXRzICgiIEVYQ0VQVElPTlMgZnBlX21pbigiLCBzdGRvdXQpOwotCSAgICAgIHByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uIChvcHRpb24tPmluZm8gJiBPRVhfRlBVX01JTik7Ci0JICAgICAgZnB1dHMgKCIpIGZwZV9tYXgoIiwgc3Rkb3V0KTsKLQkgICAgICBwcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAoKG9wdGlvbi0+aW5mbyAmIE9FWF9GUFVfTUFYKSA+PiA4KTsKLQkgICAgICBmcHV0cyAoIikiLCBzdGRvdXQpOwotCi0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9FWF9QQUdFMCkKLQkJZnB1dHMgKCIgUEFHRTAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfU01NKQotCQlmcHV0cyAoIiBTTU0iLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfRlBEQlVHKQotCQlmcHV0cyAoIiBGUERCVUciLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfRElTTUlTUykKLQkJZnB1dHMgKCIgRElTTUlTUyIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX1BBRDoKLQkgICAgICBmcHV0cyAoIiBQQUQgICAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT1BBRF9QUkVGSVgpCi0JCWZwdXRzICgiIFBSRUZJWCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfUE9TVEZJWCkKLQkJZnB1dHMgKCIgUE9TVEZJWCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfU1lNQk9MKQotCQlmcHV0cyAoIiBTWU1CT0wiLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19IV1BBVENIOgotCSAgICAgIGZwdXRzICgiIEhXUEFUQ0ggICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjRLRU9QKQotCQlmcHV0cyAoIiBSNEtFT1AiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjhLUEZFVENIKQotCQlmcHV0cyAoIiBSOEtQRkVUQ0giLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjVLRU9QKQotCQlmcHV0cyAoIiBSNUtFT1AiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjVLQ1ZUTCkKLQkJZnB1dHMgKCIgUjVLQ1ZUTCIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0ZJTEw6Ci0JICAgICAgZnB1dHMgKCIgRklMTCAgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIC8qIFhYWCBQcmludCBjb250ZW50IG9mIGluZm8gd29yZD8gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX1RBR1M6Ci0JICAgICAgZnB1dHMgKCIgVEFHUyAgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIC8qIFhYWCBQcmludCBjb250ZW50IG9mIGluZm8gd29yZD8gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0hXQU5EOgotCSAgICAgIGZwdXRzICgiIEhXQU5EICAgICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0hFQ0tFRCkKLQkJZnB1dHMgKCIgUjRLRU9QX0NIRUNLRUQiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0xFQU4pCi0JCWZwdXRzICgiIFI0S0VPUF9DTEVBTiIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0hXT1I6Ci0JICAgICAgZnB1dHMgKCIgSFdPUiAgICAgICIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DSEVDS0VEKQotCQlmcHV0cyAoIiBSNEtFT1BfQ0hFQ0tFRCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DTEVBTikKLQkJZnB1dHMgKCIgUjRLRU9QX0NMRUFOIiwgc3Rkb3V0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfR1BfR1JPVVA6Ci0JICAgICAgcHJpbnRmICgiIEdQX0dST1VQICAlIzA2bHggIHNlbGYtY29udGFpbmVkICUjMDZseCIsCi0JCSAgICAgIG9wdGlvbi0+aW5mbyAmIE9HUF9HUk9VUCwKLQkJICAgICAgKG9wdGlvbi0+aW5mbyAmIE9HUF9TRUxGKSA+PiAxNik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0lERU5UOgotCSAgICAgIHByaW50ZiAoIiBJREVOVCAgICAgJSMwNmx4ICBzZWxmLWNvbnRhaW5lZCAlIzA2bHgiLAotCQkgICAgICBvcHRpb24tPmluZm8gJiBPR1BfR1JPVVAsCi0JCSAgICAgIChvcHRpb24tPmluZm8gJiBPR1BfU0VMRikgPj4gMTYpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gICovCi0JICAgICAgcHJpbnRmICgiICUzZCA/Pz8gICAgICVkICVseCIsCi0JCSAgICAgIG9wdGlvbi0+a2luZCwgb3B0aW9uLT5zZWN0aW9uLCBvcHRpb24tPmluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGxlbiA9IHNpemVvZiAoKmVvcHQpOwotCSAgd2hpbGUgKGxlbiA8IG9wdGlvbi0+c2l6ZSkKLQkgICAgaWYgKCgoY2hhciAqKSBvcHRpb24pW2xlbl0gPj0gJyAnCi0JCSYmICgoY2hhciAqKSBvcHRpb24pW2xlbl0gPCAweDdmKQotCSAgICAgIHByaW50ZiAoIiVjIiwgKChjaGFyICopIG9wdGlvbilbbGVuKytdKTsKLQkgICAgZWxzZQotCSAgICAgIHByaW50ZiAoIlxcJTAzbyIsICgoY2hhciAqKSBvcHRpb24pW2xlbisrXSk7Ci0KLQkgIGZwdXRzICgiXG4iLCBzdGRvdXQpOwotCSAgKytvcHRpb247Ci0JfQotCi0gICAgICBmcmVlIChlb3B0KTsKLSAgICB9Ci0KLSAgaWYgKGNvbmZsaWN0c19vZmZzZXQgIT0gMCAmJiBjb25mbGljdHNubyAhPSAwKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0NvbmZsaWN0ICogZWNvbmYzMjsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0ICogZWNvbmY2NDsKLSAgICAgIEVsZjMyX0NvbmZsaWN0ICogaWNvbmY7Ci0gICAgICBzaXplX3QgY250OwotCi0gICAgICBpZiAoZHluYW1pY19zeW1ib2xzID09IE5VTEwpCi0JewotCSAgZXJyb3IgKF8oImNvbmZsaWN0IGxpc3Qgd2l0aCB3aXRob3V0IHRhYmxlIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpY29uZiA9IChFbGYzMl9Db25mbGljdCAqKSBtYWxsb2MgKGNvbmZsaWN0c25vICogc2l6ZW9mICgqaWNvbmYpKTsKLSAgICAgIGlmIChpY29uZiA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIEdFVF9EQVRBX0FMTE9DIChjb25mbGljdHNfb2Zmc2V0LCBjb25mbGljdHNubyAqIHNpemVvZiAoKmVjb25mMzIpLAotCQkJICBlY29uZjMyLCBFbGYzMl9FeHRlcm5hbF9Db25mbGljdCAqLCAiY29uZmxpY3QiKTsKLQotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb25mbGljdHNubzsgKytjbnQpCi0JICAgIGljb25mW2NudF0gPSBCWVRFX0dFVCAoZWNvbmYzMltjbnRdKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgR0VUX0RBVEFfQUxMT0MgKGNvbmZsaWN0c19vZmZzZXQsIGNvbmZsaWN0c25vICogc2l6ZW9mICgqZWNvbmY2NCksCi0JCQkgIGVjb25mNjQsIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0ICosICJjb25mbGljdCIpOwotCi0JICBmb3IgKGNudCA9IDA7IGNudCA8IGNvbmZsaWN0c25vOyArK2NudCkKLQkgICAgaWNvbmZbY250XSA9IEJZVEVfR0VUIChlY29uZjY0W2NudF0pOwotCX0KLQotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJy5jb25mbGljdCcgY29udGFpbnMgJWQgZW50cmllczpcbiIpLCBjb25mbGljdHNubyk7Ci0gICAgICBwdXRzIChfKCIgIE51bTogICAgSW5kZXggICAgICAgVmFsdWUgIE5hbWUiKSk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgY29uZmxpY3Rzbm87ICsrY250KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKiBwc3ltID0gJmR5bmFtaWNfc3ltYm9sc1tpY29uZltjbnRdXTsKLQotCSAgcHJpbnRmICgiJTV1OiAlOGx1ICAlIzEwbHggICVzXG4iLAotCQkgIGNudCwgaWNvbmZbY250XSwgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3ZhbHVlLAotCQkgIGR5bmFtaWNfc3RyaW5ncyArIHBzeW0tPnN0X25hbWUpOwotCX0KLQotCi0gICAgICBmcmVlIChpY29uZik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfbm90ZV90eXBlIChlX3R5cGUpCi0gICAgIHVuc2lnbmVkIGVfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZls2NF07Ci0KLSAgc3dpdGNoIChlX3R5cGUpCi0gICAgewotICAgIGNhc2UgTlRfUFJTVEFUVVM6CXJldHVybiBfKCJOVF9QUlNUQVRVUyAocHJzdGF0dXMgc3RydWN0dXJlKSIpOwotICAgIGNhc2UgTlRfRlBSRUdTRVQ6CXJldHVybiBfKCJOVF9GUFJFR1NFVCAoZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKSIpOwotICAgIGNhc2UgTlRfUFJQU0lORk86ICAgcmV0dXJuIF8oIk5UX1BSUFNJTkZPIChwcnBzaW5mbyBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9UQVNLU1RSVUNUOiByZXR1cm4gXygiTlRfVEFTS1NUUlVDVCAodGFzayBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9QU1RBVFVTOglyZXR1cm4gXygiTlRfUFNUQVRVUyAocHN0YXR1cyBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9GUFJFR1M6CXJldHVybiBfKCJOVF9GUFJFR1MgKGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycykiKTsKLSAgICBjYXNlIE5UX1BTSU5GTzoJcmV0dXJuIF8oIk5UX1BTSU5GTyAocHNpbmZvIHN0cnVjdHVyZSkiKTsKLSAgICBjYXNlIE5UX0xXUFNUQVRVUzoJcmV0dXJuIF8oIk5UX0xXUFNUQVRVUyAobHdwc3RhdHVzX3Qgc3RydWN0dXJlKSIpOwotICAgIGNhc2UgTlRfTFdQU0lORk86CXJldHVybiBfKCJOVF9MV1BTSU5GTyAobHdwc2luZm9fdCBzdHJ1Y3R1cmUpIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIlVua25vd24gbm90ZSB0eXBlOiAoMHglMDh4KSIpLCBlX3R5cGUpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi0vKiBOb3RlIHRoYXQgYnkgdGhlIEVMRiBzdGFuZGFyZCwgdGhlIG5hbWUgZmllbGQgaXMgYWxyZWFkeSBudWxsIGJ5dGUKLSAgIHRlcm1pbmF0ZWQsIGFuZCBuYW1lc3ogaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIG51bGwgYnl0ZS4KLSAgIEkuRS4gdGhlIHZhbHVlIG9mIG5hbWVzeiBmb3IgdGhlIG5hbWUgIkZTRiIgaXMgNC4KLQotICAgSWYgdGhlIHZhbHVlIG9mIG5hbWVzeiBpcyB6ZXJvLCB0aGVyZSBpcyBubyBuYW1lIHByZXNlbnQuICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX25vdGUgKHBub3RlKQotICBFbGYzMl9JbnRlcm5hbF9Ob3RlICogcG5vdGU7Ci17Ci0gIHByaW50ZiAoIiAgJXNcdFx0MHglMDhseFx0JXNcbiIsCi0JICBwbm90ZS0+bmFtZXN6ID8gcG5vdGUtPm5hbWVkYXRhIDogIihOT05FKSIsCi0gIAkgIHBub3RlLT5kZXNjc3osIGdldF9ub3RlX3R5cGUgKHBub3RlLT50eXBlKSk7Ci0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50IChmaWxlLCBvZmZzZXQsIGxlbmd0aCkKLSAgICAgRklMRSAqIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLXsKLSAgRWxmX0V4dGVybmFsX05vdGUgKiAgcG5vdGVzOwotICBFbGZfRXh0ZXJuYWxfTm90ZSAqICBleHRlcm5hbDsKLSAgaW50ICAgICAgICAgICAgICAgICAgcmVzID0gMTsKLQotICBpZiAobGVuZ3RoIDw9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKG9mZnNldCwgbGVuZ3RoLCBwbm90ZXMsIEVsZl9FeHRlcm5hbF9Ob3RlICosICJub3RlcyIpOwotCi0gIGV4dGVybmFsID0gcG5vdGVzOwotCi0gIHByaW50ZiAoXygiXG5Ob3RlcyBhdCBvZmZzZXQgMHglMDhseCB3aXRoIGxlbmd0aCAweCUwOGx4OlxuIiksIG9mZnNldCwgbGVuZ3RoKTsKLSAgcHJpbnRmIChfKCIgIE93bmVyXHRcdERhdGEgc2l6ZVx0RGVzY3JpcHRpb25cbiIpKTsKLQotICB3aGlsZSAoZXh0ZXJuYWwgPCAoRWxmX0V4dGVybmFsX05vdGUgKikoKGNoYXIgKikgcG5vdGVzICsgbGVuZ3RoKSkKLSAgICB7Ci0gICAgICBFbGYzMl9JbnRlcm5hbF9Ob3RlIGlub3RlOwotICAgICAgY2hhciAqIHRlbXAgPSBOVUxMOwotCi0gICAgICBpbm90ZS50eXBlICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+dHlwZSk7Ci0gICAgICBpbm90ZS5uYW1lc3ogICA9IEJZVEVfR0VUIChleHRlcm5hbC0+bmFtZXN6KTsKLSAgICAgIGlub3RlLm5hbWVkYXRhID0gZXh0ZXJuYWwtPm5hbWU7Ci0gICAgICBpbm90ZS5kZXNjc3ogICA9IEJZVEVfR0VUIChleHRlcm5hbC0+ZGVzY3N6KTsKLSAgICAgIGlub3RlLmRlc2NkYXRhID0gaW5vdGUubmFtZWRhdGEgKyBhbGlnbl9wb3dlciAoaW5vdGUubmFtZXN6LCAyKTsKLSAgICAgIGlub3RlLmRlc2Nwb3MgID0gb2Zmc2V0ICsgKGlub3RlLmRlc2NkYXRhIC0gKGNoYXIgKikgcG5vdGVzKTsKLSAgICAgIAotICAgICAgZXh0ZXJuYWwgPSAoRWxmX0V4dGVybmFsX05vdGUgKikoaW5vdGUuZGVzY2RhdGEgKyBhbGlnbl9wb3dlciAoaW5vdGUuZGVzY3N6LCAyKSk7Ci0KLSAgICAgIC8qIFZlcmlmeSB0aGF0IG5hbWUgaXMgbnVsbCB0ZXJtaW5hdGVkLiAgSXQgYXBwZWFycyB0aGF0IGF0IGxlYXN0Ci0JIG9uZSB2ZXJzaW9uIG9mIExpbnV4IChSZWRIYXQgNi4wKSBnZW5lcmF0ZXMgY29yZWZpbGVzIHRoYXQgZG9uJ3QKLQkgY29tcGx5IHdpdGggdGhlIEVMRiBzcGVjIGJ5IGZhaWxpbmcgdG8gaW5jbHVkZSB0aGUgbnVsbCBieXRlIGluCi0JIG5hbWVzei4gICovCi0gICAgICBpZiAoaW5vdGUubmFtZWRhdGFbaW5vdGUubmFtZXN6XSAhPSAnXDAnKQotCXsKLQkgIHRlbXAgPSBtYWxsb2MgKGlub3RlLm5hbWVzeiArIDEpOwotCSAgCi0JICBpZiAodGVtcCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLQkgICAgICByZXMgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAKLQkgIHN0cm5jcHkgKHRlbXAsIGlub3RlLm5hbWVkYXRhLCBpbm90ZS5uYW1lc3opOwotCSAgdGVtcFtpbm90ZS5uYW1lc3pdID0gMDsKLQkgIAotCSAgLyogd2FybiAoXygiJyVzJyBOT1RFIG5hbWUgbm90IHByb3Blcmx5IG51bGwgdGVybWluYXRlZFxuIiksIHRlbXApOyAgKi8KLQkgIGlub3RlLm5hbWVkYXRhID0gdGVtcDsKLQl9Ci0KLSAgICAgIHJlcyAmPSBwcm9jZXNzX25vdGUgKCYgaW5vdGUpOwotCi0gICAgICBpZiAodGVtcCAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHRlbXApOwotCSAgdGVtcCA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBmcmVlIChwbm90ZXMpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50cyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICogcHJvZ3JhbV9oZWFkZXJzOwotICBFbGZfSW50ZXJuYWxfUGhkciAqIHNlZ21lbnQ7Ci0gIHVuc2lnbmVkIGludAkgICAgICBpOwotICBpbnQgICAgICAgICAgICAgICAgIHJlcyA9IDE7Ci0KLSAgcHJvZ3JhbV9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9QaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfcGhudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci0KLSAgaWYgKHByb2dyYW1faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICBpID0gZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKTsKLSAgZWxzZQotICAgIGkgPSBnZXRfNjRiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpOwotCi0gIGlmIChpID09IDApCi0gICAgewotICAgICAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBzZWdtZW50ID0gcHJvZ3JhbV9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfcGhudW07Ci0gICAgICAgaSArKywgc2VnbWVudCArKykKLSAgICB7Ci0gICAgICBpZiAoc2VnbWVudC0+cF90eXBlID09IFBUX05PVEUpCi0JcmVzICY9IHByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50IChmaWxlLAotCQkJCQkgICAgICAodW5zaWduZWQgbG9uZylzZWdtZW50LT5wX29mZnNldCwKLQkJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpc2VnbWVudC0+cF9maWxlc3opOwotICAgIH0KLQotICBmcmVlIChwcm9ncmFtX2hlYWRlcnMpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfY29yZWZpbGVfY29udGVudHMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICAvKiBJZiB3ZSBoYXZlIG5vdCBiZWVuIGFza2VkIHRvIGRpc3BsYXkgdGhlIG5vdGVzIHRoZW4gZG8gbm90aGluZy4gICovCi0gIGlmICghIGRvX25vdGVzKQotICAgIHJldHVybiAxOwotCi0gIC8qIElmIGZpbGUgaXMgbm90IGEgY29yZSBmaWxlIHRoZW4gZXhpdC4gICovCi0gIGlmIChlbGZfaGVhZGVyLmVfdHlwZSAhPSBFVF9DT1JFKQotICAgIHJldHVybiAxOwotCi0gIC8qIE5vIHByb2dyYW0gaGVhZGVycyBtZWFucyBubyBOT1RFIHNlZ21lbnQuICAqLwotICBpZiAoZWxmX2hlYWRlci5lX3BobnVtID09IDApCi0gICAgewotICAgICAgcHJpbnRmIChfKCJObyBub3RlIHNlZ21lbnRzIHByZXNlbnQgaW4gdGhlIGNvcmUgZmlsZS5cbiIpKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotCi0gIHJldHVybiBwcm9jZXNzX2NvcmVmaWxlX25vdGVfc2VnbWVudHMgKGZpbGUpOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2FyY2hfc3BlY2lmaWMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBpZiAoISBkb19hcmNoKQotICAgIHJldHVybiAxOwotCi0gIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0gICAgewotICAgIGNhc2UgRU1fTUlQUzoKLSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotICAgICAgcmV0dXJuIHByb2Nlc3NfbWlwc19zcGVjaWZpYyAoZmlsZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZ2V0X2ZpbGVfaGVhZGVyIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgLyogUmVhZCBpbiB0aGUgaWRlbnRpdHkgYXJyYXkuICAqLwotICBpZiAoZnJlYWQgKGVsZl9oZWFkZXIuZV9pZGVudCwgRUlfTklERU5ULCAxLCBmaWxlKSAhPSAxKQotICAgIHJldHVybiAwOwotCi0gIC8qIERldGVybWluZSBob3cgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLiAgKi8KLSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0RBVEFdKQotICAgIHsKLSAgICBkZWZhdWx0OiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIEVMRkRBVEFOT05FOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIEVMRkRBVEEyTFNCOiBieXRlX2dldCA9IGJ5dGVfZ2V0X2xpdHRsZV9lbmRpYW47IGJyZWFrOwotICAgIGNhc2UgRUxGREFUQTJNU0I6IGJ5dGVfZ2V0ID0gYnl0ZV9nZXRfYmlnX2VuZGlhbjsgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IDMyIGJpdCBhbmQgNjQgYml0IEVMRiBmaWxlcy4gICovCi0gIGlzXzMyYml0X2VsZiA9IChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0NMQVNTXSAhPSBFTEZDTEFTUzY0KTsKLQotICAvKiBSZWFkIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIuICAqLwotICBpZiAoaXNfMzJiaXRfZWxmKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0VoZHIgZWhkcjMyOwotCi0gICAgICBpZiAoZnJlYWQgKGVoZHIzMi5lX3R5cGUsIHNpemVvZiAoZWhkcjMyKSAtIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLQlyZXR1cm4gMDsKLQotICAgICAgZWxmX2hlYWRlci5lX3R5cGUgICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV90eXBlKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9tYWNoaW5lICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfbWFjaGluZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfdmVyc2lvbiAgID0gQllURV9HRVQgKGVoZHIzMi5lX3ZlcnNpb24pOwotICAgICAgZWxmX2hlYWRlci5lX2VudHJ5ICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9lbnRyeSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhvZmYgICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3Bob2ZmKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaG9mZiAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfc2hvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX2ZsYWdzICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9mbGFncyk7Ci0gICAgICBlbGZfaGVhZGVyLmVfZWhzaXplICAgID0gQllURV9HRVQgKGVoZHIzMi5lX2Voc2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplID0gQllURV9HRVQgKGVoZHIzMi5lX3BoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhudW0gICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3BobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgPSBCWVRFX0dFVCAoZWhkcjMyLmVfc2hlbnRzaXplKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaG51bSAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfc2hudW0pOwotICAgICAgZWxmX2hlYWRlci5lX3Noc3RybmR4ICA9IEJZVEVfR0VUIChlaGRyMzIuZV9zaHN0cm5keCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmNjRfRXh0ZXJuYWxfRWhkciBlaGRyNjQ7Ci0KLSAgICAgIC8qIElmIHdlIGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIHNpemVvZiAoYmZkX3ZtYSkgPT0gNCwgdGhlbgotCSB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvcGUgd2l0aCB0aGUgNjRiaXQgZGF0YSBmb3VuZCBpbgotCSA2NCBFTEYgZmlsZXMuICBEZXRlY3QgdGhpcyBub3cgYW5kIGFib3J0IGJlZm9yZSB3ZSBzdGFydAotCSBvdmVyd3JpdHRpbmcgdGhpbmdzLiAgKi8KLSAgICAgIGlmIChzaXplb2YgKGJmZF92bWEpIDwgOCkKLQl7Ci0JICBlcnJvciAoXygiVGhpcyBpbnN0YW5jZSBvZiByZWFkZWxmIGhhcyBiZWVuIGJ1aWx0IHdpdGhvdXQgc3VwcG9ydCBmb3IgYVxuIikpOwotCSAgZXJyb3IgKF8oIjY0IGJpdCBkYXRhIHR5cGUgYW5kIHNvIGl0IGNhbm5vdCByZWFkIDY0IGJpdCBFTEYgZmlsZXMuXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmIChmcmVhZCAoZWhkcjY0LmVfdHlwZSwgc2l6ZW9mIChlaGRyNjQpIC0gRUlfTklERU5ULCAxLCBmaWxlKSAhPSAxKQotCXJldHVybiAwOwotCi0gICAgICBlbGZfaGVhZGVyLmVfdHlwZSAgICAgID0gQllURV9HRVQgKGVoZHI2NC5lX3R5cGUpOwotICAgICAgZWxmX2hlYWRlci5lX21hY2hpbmUgICA9IEJZVEVfR0VUIChlaGRyNjQuZV9tYWNoaW5lKTsKLSAgICAgIGVsZl9oZWFkZXIuZV92ZXJzaW9uICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfdmVyc2lvbik7Ci0gICAgICBlbGZfaGVhZGVyLmVfZW50cnkgICAgID0gQllURV9HRVQ4IChlaGRyNjQuZV9lbnRyeSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhvZmYgICAgID0gQllURV9HRVQ4IChlaGRyNjQuZV9waG9mZik7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hvZmYgICAgID0gQllURV9HRVQ4IChlaGRyNjQuZV9zaG9mZik7Ci0gICAgICBlbGZfaGVhZGVyLmVfZmxhZ3MgICAgID0gQllURV9HRVQgKGVoZHI2NC5lX2ZsYWdzKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9laHNpemUgICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfZWhzaXplKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9waGVudHNpemUgPSBCWVRFX0dFVCAoZWhkcjY0LmVfcGhlbnRzaXplKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9waG51bSAgICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfcGhudW0pOwotICAgICAgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSA9IEJZVEVfR0VUIChlaGRyNjQuZV9zaGVudHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3NobnVtICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV9zaG51bSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hzdHJuZHggID0gQllURV9HRVQgKGVoZHI2NC5lX3Noc3RybmR4KTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2ZpbGUgKGZpbGVfbmFtZSkKLSAgICAgY2hhciAqIGZpbGVfbmFtZTsKLXsKLSAgRklMRSAqICAgICAgIGZpbGU7Ci0gIHN0cnVjdCBzdGF0ICBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoc3RhdCAoZmlsZV9uYW1lLCAmIHN0YXRidWYpIDwgMCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiQ2Fubm90IHN0YXQgaW5wdXQgZmlsZSAlcy5cbiIpLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmaWxlID0gZm9wZW4gKGZpbGVfbmFtZSwgInJiIik7Ci0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIklucHV0IGZpbGUgJXMgbm90IGZvdW5kLlxuIiksIGZpbGVfbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICghIGdldF9maWxlX2hlYWRlciAoZmlsZSkpCi0gICAgewotICAgICAgZXJyb3IgKF8oIiVzOiBGYWlsZWQgdG8gcmVhZCBmaWxlIGhlYWRlclxuIiksIGZpbGVfbmFtZSk7Ci0gICAgICBmY2xvc2UgKGZpbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJbml0aWFsaXNlIHBlciBmaWxlIHZhcmlhYmxlcy4gICovCi0gIGZvciAoaSA9IE5VTV9FTEVNICh2ZXJzaW9uX2luZm8pOyBpLS07KQotICAgIHZlcnNpb25faW5mb1tpXSA9IDA7Ci0KLSAgZm9yIChpID0gTlVNX0VMRU0gKGR5bmFtaWNfaW5mbyk7IGktLTspCi0gICAgZHluYW1pY19pbmZvW2ldID0gMDsKLQotICAvKiBQcm9jZXNzIHRoZSBmaWxlLiAgKi8KLSAgaWYgKHNob3dfbmFtZSkKLSAgICBwcmludGYgKF8oIlxuRmlsZTogJXNcbiIpLCBmaWxlX25hbWUpOwotCi0gIGlmICghIHByb2Nlc3NfZmlsZV9oZWFkZXIgKCkpCi0gICAgewotICAgICAgZmNsb3NlIChmaWxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMgKGZpbGUpOwotCi0gIHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzIChmaWxlKTsKLQotICBwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19yZWxvY3MgKGZpbGUpOwotCi0gIHByb2Nlc3Nfc3ltYm9sX3RhYmxlIChmaWxlKTsKLQotICBwcm9jZXNzX3N5bWluZm8gKGZpbGUpOwotCi0gIHByb2Nlc3NfdmVyc2lvbl9zZWN0aW9ucyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzIChmaWxlKTsKLQotICBwcm9jZXNzX2NvcmVmaWxlX2NvbnRlbnRzIChmaWxlKTsKLQotICBwcm9jZXNzX2FyY2hfc3BlY2lmaWMgKGZpbGUpOwotCi0gIGZjbG9zZSAoZmlsZSk7Ci0KLSAgaWYgKHNlY3Rpb25faGVhZGVycykKLSAgICB7Ci0gICAgICBmcmVlIChzZWN0aW9uX2hlYWRlcnMpOwotICAgICAgc2VjdGlvbl9oZWFkZXJzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHN0cmluZ190YWJsZSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmdfdGFibGUpOwotICAgICAgc3RyaW5nX3RhYmxlID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGR5bmFtaWNfc3RyaW5ncykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5hbWljX3N0cmluZ3MpOwotICAgICAgZHluYW1pY19zdHJpbmdzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGR5bmFtaWNfc3ltYm9scykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5hbWljX3N5bWJvbHMpOwotICAgICAgZHluYW1pY19zeW1ib2xzID0gTlVMTDsKLSAgICAgIG51bV9keW5hbWljX3N5bXMgPSAwOwotICAgIH0KLQotICBpZiAoZHluYW1pY19zeW1pbmZvKQotICAgIHsKLSAgICAgIGZyZWUgKGR5bmFtaWNfc3ltaW5mbyk7Ci0gICAgICBkeW5hbWljX3N5bWluZm8gPSBOVUxMOwotICAgIH0KLX0KLQotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLS8qIE5lZWRlZCBieSB0aGUgaTM4NiBkaXNhc3NlbWJsZXIuICBGb3IgZXh0cmEgY3JlZGl0LCBzb21lb25lIGNvdWxkCi0gICBmaXggdGhpcyBzbyB0aGF0IHdlIGluc2VydCBzeW1ib2xpYyBhZGRyZXNzZXMgaGVyZSwgZXNwIGZvciBHT1QvUExUCi0gICBzeW1ib2xzICovCi0KLXZvaWQKLXByaW50X2FkZHJlc3MgKHVuc2lnbmVkIGludCBhZGRyLCBGSUxFICogb3V0ZmlsZSkKLXsKLSAgZnByaW50ZiAob3V0ZmlsZSwiMHglOC44eCIsIGFkZHIpOwotfQotCi0vKiBOZWVkZWQgYnkgdGhlIGkzODYgZGlzYXNzZW1ibGVyLiAqLwotdm9pZAotZGJfdGFza19wcmludHN5bSAodW5zaWduZWQgaW50IGFkZHIpCi17Ci0gIHByaW50X2FkZHJlc3MgKGFkZHIsIHN0ZGVycik7Ci19Ci0jZW5kaWYKLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgICAgIGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLXsKLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwYXJzZV9hcmdzIChhcmdjLCBhcmd2KTsKLQotICBpZiAob3B0aW5kIDwgKGFyZ2MgLSAxKSkKLSAgICBzaG93X25hbWUgPSAxOwotCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotICAgIHByb2Nlc3NfZmlsZSAoYXJndiBbb3B0aW5kICsrXSk7Ci0KLSAgaWYgKGR1bXBfc2VjdHMgIT0gTlVMTCkKLSAgICBmcmVlIChkdW1wX3NlY3RzKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JlbmFtZS5jIGIvYmludXRpbHMvcmVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWE5ZmQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyogcmVuYW1lLmMgLS0gcmVuYW1lIGEgZmlsZSwgcHJlc2VydmluZyBzeW1saW5rcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEhBVkVfR09PRF9VVElNRV9ICi0jaW5jbHVkZSA8dXRpbWUuaD4KLSNlbHNlIC8qICEgSEFWRV9HT09EX1VUSU1FX0ggKi8KLSNpZmRlZiBIQVZFX1VUSU1FUwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYgLyogSEFWRV9VVElNRVMgKi8KLSNlbmRpZiAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0KLS8qIFdlIG5lZWQgdG8gb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZXMgb24gc3lzdGVtIHdoZXJlIHRoYXQgbWFrZXMKLSAgIGEgZGlmZmVyZW5jZS4gICovCi0jaWZuZGVmIE9fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZIDAKLSNlbmRpZgotCi1zdGF0aWMgaW50IHNpbXBsZV9jb3B5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBhdCBvbmNlLiAgKi8KLSNkZWZpbmUgQ09QWV9CVUYgODE5MgotCi0vKiBDb3B5IGZpbGUgRlJPTSB0byBmaWxlIFRPLCBwZXJmb3JtaW5nIG5vIHRyYW5zbGF0aW9ucy4KLSAgIFJldHVybiAwIGlmIG9rLCAtMSBpZiBlcnJvci4gICovCi0KLXN0YXRpYyBpbnQKLXNpbXBsZV9jb3B5IChmcm9tLCB0bykKLSAgICAgY29uc3QgY2hhciAqZnJvbTsKLSAgICAgY29uc3QgY2hhciAqdG87Ci17Ci0gIGludCBmcm9tZmQsIHRvZmQsIG5yZWFkOwotICBpbnQgc2F2ZWQ7Ci0gIGNoYXIgYnVmW0NPUFlfQlVGXTsKLQotICBmcm9tZmQgPSBvcGVuIChmcm9tLCBPX1JET05MWSB8IE9fQklOQVJZKTsKLSAgaWYgKGZyb21mZCA8IDApCi0gICAgcmV0dXJuIC0xOwotI2lmZGVmIE9fQ1JFQVQKLSAgdG9mZCA9IG9wZW4gKHRvLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA3NzcpOwotI2Vsc2UKLSAgdG9mZCA9IGNyZWF0ICh0bywgMDc3Nyk7Ci0jZW5kaWYKLSAgaWYgKHRvZmQgPCAwKQotICAgIHsKLSAgICAgIHNhdmVkID0gZXJybm87Ci0gICAgICBjbG9zZSAoZnJvbWZkKTsKLSAgICAgIGVycm5vID0gc2F2ZWQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB3aGlsZSAoKG5yZWFkID0gcmVhZCAoZnJvbWZkLCBidWYsIHNpemVvZiBidWYpKSA+IDApCi0gICAgewotICAgICAgaWYgKHdyaXRlICh0b2ZkLCBidWYsIG5yZWFkKSAhPSBucmVhZCkKLQl7Ci0JICBzYXZlZCA9IGVycm5vOwotCSAgY2xvc2UgKGZyb21mZCk7Ci0JICBjbG9zZSAodG9mZCk7Ci0JICBlcnJubyA9IHNhdmVkOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gIHNhdmVkID0gZXJybm87Ci0gIGNsb3NlIChmcm9tZmQpOwotICBjbG9zZSAodG9mZCk7Ci0gIGlmIChucmVhZCA8IDApCi0gICAgewotICAgICAgZXJybm8gPSBzYXZlZDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBTZXQgdGhlIHRpbWVzIG9mIHRoZSBmaWxlIERFU1RJTkFUSU9OIHRvIGJlIHRoZSBzYW1lIGFzIHRob3NlIGluCi0gICBTVEFUQlVGLiAgKi8KLQotdm9pZAotc2V0X3RpbWVzIChkZXN0aW5hdGlvbiwgc3RhdGJ1ZikKLSAgICAgY29uc3QgY2hhciAqZGVzdGluYXRpb247Ci0gICAgIGNvbnN0IHN0cnVjdCBzdGF0ICpzdGF0YnVmOwotewotICBpbnQgcmVzdWx0OwotCi0gIHsKLSNpZmRlZiBIQVZFX0dPT0RfVVRJTUVfSAotICAgIHN0cnVjdCB1dGltYnVmIHRiOwotCi0gICAgdGIuYWN0aW1lID0gc3RhdGJ1Zi0+c3RfYXRpbWU7Ci0gICAgdGIubW9kdGltZSA9IHN0YXRidWYtPnN0X210aW1lOwotICAgIHJlc3VsdCA9IHV0aW1lIChkZXN0aW5hdGlvbiwgJnRiKTsKLSNlbHNlIC8qICEgSEFWRV9HT09EX1VUSU1FX0ggKi8KLSNpZm5kZWYgSEFWRV9VVElNRVMKLSAgICBsb25nIHRiWzJdOwotCi0gICAgdGJbMF0gPSBzdGF0YnVmLT5zdF9hdGltZTsKLSAgICB0YlsxXSA9IHN0YXRidWYtPnN0X210aW1lOwotICAgIHJlc3VsdCA9IHV0aW1lIChkZXN0aW5hdGlvbiwgdGIpOwotI2Vsc2UgLyogSEFWRV9VVElNRVMgKi8KLSAgICBzdHJ1Y3QgdGltZXZhbCB0dlsyXTsKLQotICAgIHR2WzBdLnR2X3NlYyA9IHN0YXRidWYtPnN0X2F0aW1lOwotICAgIHR2WzBdLnR2X3VzZWMgPSAwOwotICAgIHR2WzFdLnR2X3NlYyA9IHN0YXRidWYtPnN0X210aW1lOwotICAgIHR2WzFdLnR2X3VzZWMgPSAwOwotICAgIHJlc3VsdCA9IHV0aW1lcyAoZGVzdGluYXRpb24sIHR2KTsKLSNlbmRpZiAvKiBIQVZFX1VUSU1FUyAqLwotI2VuZGlmIC8qICEgSEFWRV9HT09EX1VUSU1FX0ggKi8KLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gMCkKLSAgICBub25fZmF0YWwgKF8oIiVzOiBjYW5ub3Qgc2V0IHRpbWU6ICVzIiksIGRlc3RpbmF0aW9uLCBzdHJlcnJvciAoZXJybm8pKTsKLX0KLQotI2lmbmRlZiBTX0lTTE5LCi0jaWZkZWYgU19JRkxOSwotI2RlZmluZSBTX0lTTE5LKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGTE5LKQotI2Vsc2UKLSNkZWZpbmUgU19JU0xOSyhtKSAwCi0jZGVmaW5lIGxzdGF0IHN0YXQKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFJlbmFtZSBGUk9NIHRvIFRPLCBjb3B5aW5nIGlmIFRPIGlzIGEgbGluay4KLSAgIFJldHVybiAwIGlmIG9rLCAtMSBpZiBlcnJvci4gICovCi0KLWludAotc21hcnRfcmVuYW1lIChmcm9tLCB0bywgcHJlc2VydmVfZGF0ZXMpCi0gICAgIGNvbnN0IGNoYXIgKmZyb207Ci0gICAgIGNvbnN0IGNoYXIgKnRvOwotICAgICBpbnQgcHJlc2VydmVfZGF0ZXM7Ci17Ci0gIGJvb2xlYW4gZXhpc3RzOwotICBzdHJ1Y3Qgc3RhdCBzOwotICBpbnQgcmV0ID0gMDsKLQotICBleGlzdHMgPSBsc3RhdCAodG8sICZzKSA9PSAwOwotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotICAvKiBXaW4zMiwgdW5saWtlIHVuaXgsIHdpbGwgbm90IGVyYXNlIGB0bycgaW4gYHJlbmFtZShmcm9tLCB0byknIGJ1dAotICAgICBmYWlsIGluc3RlYWQuICBBbHNvLCBjaG93biBpcyBub3QgcHJlc2VudC4gICovCi0KLSAgaWYgKGV4aXN0cykKLSAgICByZW1vdmUgKHRvKTsKLQotICByZXQgPSByZW5hbWUgKGZyb20sIHRvKTsKLSAgaWYgKHJldCAhPSAwKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gY2xlYW4gdXAgaGVyZS4gKi8KLSAgICAgIAotICAgICAgbm9uX2ZhdGFsIChfKCIlczogcmVuYW1lOiAlcyIpLCB0bywgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICB1bmxpbmsgKGZyb20pOwotICAgIH0KLSNlbHNlCi0gIC8qIFVzZSByZW5hbWUgb25seSBpZiBUTyBpcyBub3QgYSBzeW1ib2xpYyBsaW5rIGFuZCBoYXMKLSAgICAgb25seSBvbmUgaGFyZCBsaW5rLiAgKi8KLSAgaWYgKCEgZXhpc3RzIHx8ICghU19JU0xOSyAocy5zdF9tb2RlKSAmJiBzLnN0X25saW5rID09IDEpKQotICAgIHsKLSAgICAgIHJldCA9IHJlbmFtZSAoZnJvbSwgdG8pOwotICAgICAgaWYgKHJldCA9PSAwKQotCXsKLQkgIGlmIChleGlzdHMpCi0JICAgIHsKLQkgICAgICAvKiBUcnkgdG8gcHJlc2VydmUgdGhlIHBlcm1pc3Npb24gYml0cyBhbmQgb3duZXJzaGlwIG9mCi0JCSBUTy4gIEZpcnN0IGdldCB0aGUgbW9kZSByaWdodCBleGNlcHQgZm9yIHRoZSBzZXR1aWQKLQkJIGJpdC4gIFRoZW4gY2hhbmdlIHRoZSBvd25lcnNoaXAuICBUaGVuIGZpeCB0aGUgc2V0dWlkCi0JCSBiaXQuICBXZSBkbyB0aGUgY2htb2QgYmVmb3JlIHRoZSBjaG93biBiZWNhdXNlIGlmIHRoZQotCQkgY2hvd24gc3VjY2VlZHMsIGFuZCB3ZSBhcmUgYSBub3JtYWwgdXNlciwgd2Ugd29uJ3QgYmUKLQkJIGFibGUgdG8gZG8gdGhlIGNobW9kIGFmdGVyd2FyZC4gIFdlIGRvbid0IGJvdGhlciB0bwotCQkgZml4IHRoZSBzZXR1aWQgYml0IGZpcnN0IGJlY2F1c2UgdGhhdCBtaWdodCBpbnRyb2R1Y2UKLQkJIGEgZmxlZXRpbmcgc2VjdXJpdHkgcHJvYmxlbSwgYW5kIGJlY2F1c2UgdGhlIGNob3duCi0JCSB3aWxsIGNsZWFyIHRoZSBzZXR1aWQgYml0IGFueWhvdy4gIFdlIG9ubHkgZml4IHRoZQotCQkgc2V0dWlkIGJpdCBpZiB0aGUgY2hvd24gc3VjY2VlZHMsIGJlY2F1c2Ugd2UgZG9uJ3QKLQkJIHdhbnQgdG8gaW50cm9kdWNlIGFuIHVuZXhwZWN0ZWQgc2V0dWlkIGZpbGUgb3duZWQgYnkKLQkJIHRoZSB1c2VyIHJ1bm5pbmcgb2JqY29weS4gICovCi0JICAgICAgY2htb2QgKHRvLCBzLnN0X21vZGUgJiAwNzc3KTsKLQkgICAgICBpZiAoY2hvd24gKHRvLCBzLnN0X3VpZCwgcy5zdF9naWQpID49IDApCi0JCWNobW9kICh0bywgcy5zdF9tb2RlICYgMDc3NzcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGhhdmUgdG8gY2xlYW4gdXAgaGVyZS4gKi8KLQkgIG5vbl9mYXRhbCAoXygiJXM6IHJlbmFtZTogJXMiKSwgdG8sIHN0cmVycm9yIChlcnJubykpOwotCSAgdW5saW5rIChmcm9tKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0ID0gc2ltcGxlX2NvcHkgKGZyb20sIHRvKTsKLSAgICAgIGlmIChyZXQgIT0gMCkKLQlub25fZmF0YWwgKF8oIiVzOiBzaW1wbGVfY29weTogJXMiKSwgdG8sIHN0cmVycm9yIChlcnJubykpOwotCi0gICAgICBpZiAocHJlc2VydmVfZGF0ZXMpCi0Jc2V0X3RpbWVzICh0bywgJnMpOwotICAgICAgdW5saW5rIChmcm9tKTsKLSAgICB9Ci0jZW5kaWYgLyogX1dJTjMyICYmICFfX0NZR1dJTjMyX18gKi8KLQotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmVzYmluLmMgYi9iaW51dGlscy9yZXNiaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjMDdmYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZXNiaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDIzODcgKzAsMCBAQAotLyogcmVzYmluLmMgLS0gbWFuaXB1bGF0ZSB0aGUgV2luZG93cyBiaW5hcnkgcmVzb3VyY2UgZm9ybWF0LgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgYmluYXJ5IHJlc291cmNlCi0gICBmb3JtYXQgYW5kIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIHRoYXQgd2Ugd2FudCB0byB1c2UuICBUaGUgc2FtZQotICAgYmluYXJ5IHJlc291cmNlIGZvcm1hdCBpcyB1c2VkIGluIGJvdGggcmVzIGFuZCBDT0ZGIGZpbGVzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLQotLyogTWFjcm9zIHRvIHN3YXAgaW4gdmFsdWVzLiAgKi8KLQotI2RlZmluZSBnZXRfMTYoYmUsIHMpICgoYmUpID8gYmZkX2dldGIxNiAocykgOiBiZmRfZ2V0bDE2IChzKSkKLSNkZWZpbmUgZ2V0XzMyKGJlLCBzKSAoKGJlKSA/IGJmZF9nZXRiMzIgKHMpIDogYmZkX2dldGwzMiAocykpCi0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIHRvb3NtYWxsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHVuaWNoYXIgKmdldF91bmljb2RlCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50LCBpbnQgKikpOwotc3RhdGljIGludCBnZXRfcmVzaWQKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZ2VuZXJpYwotICBQQVJBTVMgKChlbnVtIHJlc190eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2N1cnNvcgotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfbWVudQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCBtZW51aXRlbSAqYmluX3RvX3Jlc19tZW51aXRlbXMKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKSk7Ci1zdGF0aWMgc3RydWN0IG1lbnVpdGVtICpiaW5fdG9fcmVzX21lbnVleGl0ZW1zCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50LCBpbnQgKikpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZGlhbG9nCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19zdHJpbmcKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2ZvbnRkaXIKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2FjY2VsZXJhdG9ycwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfcmNkYXRhCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19ncm91cF9jdXJzb3IKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2dyb3VwX2ljb24KLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX3ZlcnNpb24KLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX3VzZXJkYXRhCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci0KLS8qIEdpdmVuIGEgcmVzb3VyY2UgdHlwZSBJRCwgYSBwb2ludGVyIHRvIGRhdGEsIGEgbGVuZ3RoLCByZXR1cm4gYQotICAgcmVzX3Jlc291cmNlIHN0cnVjdHVyZSB3aGljaCByZXByZXNlbnRzIHRoYXQgcmVzb3VyY2UuICBUaGUgY2FsbGVyCi0gICBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSByZXNfaW5mbyBhbmQgY29mZl9pbmZvIGZpZWxkcwotICAgb2YgdGhlIHJldHVybmVkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3JlcyAodHlwZSwgZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBzdHJ1Y3QgcmVzX2lkIHR5cGU7Ci0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaWYgKHR5cGUubmFtZWQpCi0gICAgcmV0dXJuIGJpbl90b19yZXNfdXNlcmRhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHR5cGUudS5pZCkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBiaW5fdG9fcmVzX3VzZXJkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfQ1VSU09SOgotCSAgcmV0dXJuIGJpbl90b19yZXNfY3Vyc29yIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfQklUTUFQOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZ2VuZXJpYyAoUkVTX1RZUEVfQklUTUFQLCBkYXRhLCBsZW5ndGgpOwotCWNhc2UgUlRfSUNPTjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX0lDT04sIGRhdGEsIGxlbmd0aCk7Ci0JY2FzZSBSVF9NRU5VOgotCSAgcmV0dXJuIGJpbl90b19yZXNfbWVudSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0RJQUxPRzoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2RpYWxvZyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX1NUUklORzoKLQkgIHJldHVybiBiaW5fdG9fcmVzX3N0cmluZyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0ZPTlRESVI6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19mb250ZGlyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfRk9OVDoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX0ZPTlQsIGRhdGEsIGxlbmd0aCk7Ci0JY2FzZSBSVF9BQ0NFTEVSQVRPUjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2FjY2VsZXJhdG9ycyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX1JDREFUQToKLQkgIHJldHVybiBiaW5fdG9fcmVzX3JjZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX01FU1NBR0VUQUJMRToKLQkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX01FU1NBR0VUQUJMRSwgZGF0YSwgbGVuZ3RoKTsKLQljYXNlIFJUX0dST1VQX0NVUlNPUjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2dyb3VwX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0dST1VQX0lDT046Ci0JICByZXR1cm4gYmluX3RvX3Jlc19ncm91cF9pY29uIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfVkVSU0lPTjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX3ZlcnNpb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JfQotICAgIH0KLX0KLQotLyogR2l2ZSBhbiBlcnJvciBpZiB0aGUgYmluYXJ5IGRhdGEgaXMgdG9vIHNtYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLXRvb3NtYWxsIChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgZmF0YWwgKF8oIiVzOiBub3QgZW5vdWdoIGJpbmFyeSBkYXRhIiksIG1zZyk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBOVUxMIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdW5pY2hhciAqCi1nZXRfdW5pY29kZSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCByZXRsZW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLSAgICAgaW50ICpyZXRsZW47Ci17Ci0gIGludCBjLCBpOwotICB1bmljaGFyICpyZXQ7Ci0KLSAgYyA9IDA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPCAodW5zaWduZWQgbG9uZykgYyAqIDIgKyAyKQotCXRvb3NtYWxsIChfKCJudWxsIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmciKSk7Ci0gICAgICBpZiAoZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgYyAqIDIpID09IDApCi0JYnJlYWs7Ci0gICAgICArK2M7Ci0gICAgfQotCi0gIHJldCA9ICh1bmljaGFyICopIHJlc19hbGxvYyAoKGMgKyAxKSAqIHNpemVvZiAodW5pY2hhcikpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgcmV0W2ldID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgaSAqIDIpOwotICByZXRbaV0gPSAwOwotCi0gIGlmIChyZXRsZW4gIT0gTlVMTCkKLSAgICAqcmV0bGVuID0gYzsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBHZXQgYSByZXNvdXJjZSBpZGVudGlmaWVyLiAgVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9yZXNpZCAoaWQsIGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgc3RydWN0IHJlc19pZCAqaWQ7Ci0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IGZpcnN0OwotCi0gIGlmIChsZW5ndGggPCAyKQotICAgIHRvb3NtYWxsIChfKCJyZXNvdXJjZSBJRCIpKTsKLQotICBmaXJzdCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gIGlmIChmaXJzdCA9PSAweGZmZmYpCi0gICAgewotICAgICAgaWYgKGxlbmd0aCA8IDQpCi0JdG9vc21hbGwgKF8oInJlc291cmNlIElEIikpOwotICAgICAgaWQtPm5hbWVkID0gMDsKLSAgICAgIGlkLT51LmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZC0+bmFtZWQgPSAxOwotICAgICAgaWQtPnUubi5uYW1lID0gZ2V0X3VuaWNvZGUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgJmlkLT51Lm4ubGVuZ3RoKTsKLSAgICAgIHJldHVybiBpZC0+dS5uLmxlbmd0aCAqIDIgKyAyOwotICAgIH0KLX0KLQotLyogQ29udmVydCBhIHJlc291cmNlIHdoaWNoIGp1c3Qgc3RvcmVzIHVuaW50ZXJwcmV0ZWQgZGF0YSBmcm9tCi0gICBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfZ2VuZXJpYyAodHlwZSwgZGF0YSwgbGVuZ3RoKQotICAgICBlbnVtIHJlc190eXBlIHR5cGU7Ci0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSB0eXBlOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnUuZGF0YS5sZW5ndGggPSBsZW5ndGg7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBjdXJzb3IgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfY3Vyc29yIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGN1cnNvciAqYzsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBpZiAobGVuZ3RoIDwgNCkKLSAgICB0b29zbWFsbCAoXygiY3Vyc29yIikpOwotCi0gIGMgPSAoc3RydWN0IGN1cnNvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYyk7Ci0gIGMtPnhob3RzcG90ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgYy0+eWhvdHNwb3QgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgYy0+bGVuZ3RoID0gbGVuZ3RoIC0gNDsKLSAgYy0+ZGF0YSA9IGRhdGEgKyA0OwotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9DVVJTT1I7Ci0gIHItPnUuY3Vyc29yID0gYzsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIG1lbnUgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfbWVudSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0gIHN0cnVjdCBtZW51ICptOwotICBpbnQgdmVyc2lvbiwgcmVhZDsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfTUVOVTsKLQotICBtID0gKHN0cnVjdCBtZW51ICopIHJlc19hbGxvYyAoc2l6ZW9mICptKTsKLSAgci0+dS5tZW51ID0gbTsKLQotICBpZiAobGVuZ3RoIDwgMikKLSAgICB0b29zbWFsbCAoXygibWVudSBoZWFkZXIiKSk7Ci0KLSAgdmVyc2lvbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0KLSAgaWYgKHZlcnNpb24gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoIDwgNCkKLQl0b29zbWFsbCAoXygibWVudSBoZWFkZXIiKSk7Ci0gICAgICBtLT5oZWxwID0gMDsKLSAgICAgIG0tPml0ZW1zID0gYmluX3RvX3Jlc19tZW51aXRlbXMgKGRhdGEgKyA0LCBsZW5ndGggLSA0LCBiaWdfZW5kaWFuLAotCQkJCSAgICAgICAmcmVhZCk7Ci0gICAgfQotICBlbHNlIGlmICh2ZXJzaW9uID09IDEpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKLQotICAgICAgaWYgKGxlbmd0aCA8IDgpCi0JdG9vc21hbGwgKF8oIm1lbnVleCBoZWFkZXIiKSk7Ci0gICAgICBtLT5oZWxwID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBvZmZzZXQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGlmIChvZmZzZXQgKyA0ID49IGxlbmd0aCkKLQl0b29zbWFsbCAoXygibWVudWV4IG9mZnNldCIpKTsKLSAgICAgIG0tPml0ZW1zID0gYmluX3RvX3Jlc19tZW51ZXhpdGVtcyAoZGF0YSArIDQgKyBvZmZzZXQsCi0JCQkJCSBsZW5ndGggLSAoNCArIG9mZnNldCksCi0JCQkJCSBiaWdfZW5kaWFuLAotCQkJCQkgJnJlYWQpOwotICAgIH0KLSAgZWxzZQotICAgIGZhdGFsIChfKCJ1bnN1cHBvcnRlZCBtZW51IHZlcnNpb24gJWQiKSwgdmVyc2lvbik7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgbWVudSBpdGVtcyBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWVudWl0ZW0gKgotYmluX3RvX3Jlc19tZW51aXRlbXMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgcmVhZCkKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotICAgICBpbnQgKnJlYWQ7Ci17Ci0gIHN0cnVjdCBtZW51aXRlbSAqZmlyc3QsICoqcHA7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICAqcmVhZCA9IDA7Ci0KLSAgd2hpbGUgKGxlbmd0aCA+IDApCi0gICAgewotICAgICAgaW50IGZsYWdzLCBzbGVuLCBpdGVtbGVuOwotICAgICAgdW5zaWduZWQgaW50IHN0cm9mZjsKLSAgICAgIHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA0KQotCXRvb3NtYWxsIChfKCJtZW51aXRlbSBoZWFkZXIiKSk7Ci0KLSAgICAgIG1pID0gKHN0cnVjdCBtZW51aXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqbWkpOwotICAgICAgbWktPnN0YXRlID0gMDsKLSAgICAgIG1pLT5oZWxwID0gMDsKLQotICAgICAgZmxhZ3MgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgbWktPnR5cGUgPSBmbGFncyAmfiAoTUVOVUlURU1fUE9QVVAgfCBNRU5VSVRFTV9FTkRNRU5VKTsKLQotICAgICAgaWYgKChmbGFncyAmIE1FTlVJVEVNX1BPUFVQKSA9PSAwKQotCXN0cm9mZiA9IDQ7Ci0gICAgICBlbHNlCi0Jc3Ryb2ZmID0gMjsKLQotICAgICAgaWYgKGxlbmd0aCA8IHN0cm9mZiArIDIpCi0JdG9vc21hbGwgKF8oIm1lbnVpdGVtIGhlYWRlciIpKTsKLQotICAgICAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIHN0cm9mZikgPT0gMCkKLQl7Ci0JICBzbGVuID0gMDsKLQkgIG1pLT50ZXh0ID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JbWktPnRleHQgPSBnZXRfdW5pY29kZSAoZGF0YSArIHN0cm9mZiwgbGVuZ3RoIC0gc3Ryb2ZmLCBiaWdfZW5kaWFuLAotCQkJCSZzbGVuKTsKLQotICAgICAgaXRlbWxlbiA9IHN0cm9mZiArIHNsZW4gKiAyICsgMjsKLQotICAgICAgaWYgKChmbGFncyAmIE1FTlVJVEVNX1BPUFVQKSA9PSAwKQotCXsKLQkgIG1pLT5wb3B1cCA9IE5VTEw7Ci0JICBtaS0+aWQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHN1YnJlYWQ7Ci0KLQkgIG1pLT5pZCA9IDA7Ci0JICBtaS0+cG9wdXAgPSBiaW5fdG9fcmVzX21lbnVpdGVtcyAoZGF0YSArIGl0ZW1sZW4sIGxlbmd0aCAtIGl0ZW1sZW4sCi0JCQkJCSAgICBiaWdfZW5kaWFuLCAmc3VicmVhZCk7Ci0JICBpdGVtbGVuICs9IHN1YnJlYWQ7Ci0JfQotCi0gICAgICBtaS0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBtaTsKLSAgICAgIHBwID0gJm1pLT5uZXh0OwotCi0gICAgICBkYXRhICs9IGl0ZW1sZW47Ci0gICAgICBsZW5ndGggLT0gaXRlbWxlbjsKLSAgICAgICpyZWFkICs9IGl0ZW1sZW47Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBNRU5VSVRFTV9FTkRNRU5VKSAhPSAwKQotCXJldHVybiBmaXJzdDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IG1lbnVleCBpdGVtcyBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWVudWl0ZW0gKgotYmluX3RvX3Jlc19tZW51ZXhpdGVtcyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCByZWFkKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci0gICAgIGludCAqcmVhZDsKLXsKLSAgc3RydWN0IG1lbnVpdGVtICpmaXJzdCwgKipwcDsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gICpyZWFkID0gMDsKLQotICB3aGlsZSAobGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBpbnQgZmxhZ3MsIHNsZW47Ci0gICAgICB1bnNpZ25lZCBpbnQgaXRlbWxlbjsKLSAgICAgIHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgICAgIGlmIChsZW5ndGggPCAxNCkKLQl0b29zbWFsbCAoXygibWVudWl0ZW0gaGVhZGVyIikpOwotCi0gICAgICBtaSA9IChzdHJ1Y3QgbWVudWl0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKm1pKTsKLSAgICAgIG1pLT50eXBlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIG1pLT5zdGF0ZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgbWktPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgOCk7Ci0KLSAgICAgIGZsYWdzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMTApOwotCi0gICAgICBpZiAoZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMTIpID09IDApCi0JewotCSAgc2xlbiA9IDA7Ci0JICBtaS0+dGV4dCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCW1pLT50ZXh0ID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyAxMiwgbGVuZ3RoIC0gMTIsIGJpZ19lbmRpYW4sICZzbGVuKTsKLQotICAgICAgaXRlbWxlbiA9IDEyICsgc2xlbiAqIDIgKyAyOwotICAgICAgaXRlbWxlbiA9IChpdGVtbGVuICsgMykgJn4gMzsKLQotICAgICAgaWYgKChmbGFncyAmIDEpID09IDApCi0JewotCSAgbWktPnBvcHVwID0gTlVMTDsKLQkgIG1pLT5oZWxwID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHN1YnJlYWQ7Ci0KLQkgIGlmIChsZW5ndGggPCBpdGVtbGVuICsgNCkKLQkgICAgdG9vc21hbGwgKF8oIm1lbnVpdGVtIikpOwotCSAgbWktPmhlbHAgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBpdGVtbGVuKTsKLQkgIGl0ZW1sZW4gKz0gNDsKLQotCSAgbWktPnBvcHVwID0gYmluX3RvX3Jlc19tZW51ZXhpdGVtcyAoZGF0YSArIGl0ZW1sZW4sCi0JCQkJCSAgICAgIGxlbmd0aCAtIGl0ZW1sZW4sCi0JCQkJCSAgICAgIGJpZ19lbmRpYW4sICZzdWJyZWFkKTsKLQkgIGl0ZW1sZW4gKz0gc3VicmVhZDsKLQl9Ci0KLSAgICAgIG1pLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IG1pOwotICAgICAgcHAgPSAmbWktPm5leHQ7Ci0KLSAgICAgIGRhdGEgKz0gaXRlbWxlbjsKLSAgICAgIGxlbmd0aCAtPSBpdGVtbGVuOwotICAgICAgKnJlYWQgKz0gaXRlbWxlbjsKLQotICAgICAgaWYgKChmbGFncyAmIDB4ODApICE9IDApCi0JcmV0dXJuIGZpcnN0OwotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBkaWFsb2cgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2RpYWxvZyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCB2ZXJzaW9uOwotICBzdHJ1Y3QgZGlhbG9nICpkOwotICBpbnQgYywgc3VibGVuLCBpOwotICB1bnNpZ25lZCBpbnQgb2ZmOwotICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKipwcDsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBpZiAobGVuZ3RoIDwgMTgpCi0gICAgdG9vc21hbGwgKF8oImRpYWxvZyBoZWFkZXIiKSk7Ci0KLSAgZCA9IChzdHJ1Y3QgZGlhbG9nICopIHJlc19hbGxvYyAoc2l6ZW9mICpkKTsKLQotICB2ZXJzaW9uID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgaWYgKHZlcnNpb24gIT0gMSkKLSAgICB7Ci0gICAgICBkLT5leCA9IE5VTEw7Ci0gICAgICBkLT5zdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBkLT5leHN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBvZmYgPSA4OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBzaWduYXR1cmU7Ci0KLSAgICAgIHNpZ25hdHVyZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICAgICAgaWYgKHNpZ25hdHVyZSAhPSAweGZmZmYpCi0JZmF0YWwgKF8oInVuZXhwZWN0ZWQgZGlhbG9nIHNpZ25hdHVyZSAlZCIpLCBzaWduYXR1cmUpOwotCi0gICAgICBkLT5leCA9IChzdHJ1Y3QgZGlhbG9nX2V4ICopIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlhbG9nX2V4KSk7Ci0gICAgICBkLT5leC0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgZC0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOwotICAgICAgZC0+c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7Ci0gICAgICBvZmYgPSAxNjsKLSAgICB9Ci0KLSAgaWYgKGxlbmd0aCA8IG9mZiArIDEwKQotICAgIHRvb3NtYWxsIChfKCJkaWFsb2cgaGVhZGVyIikpOwotCi0gIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotICBkLT54ID0gZ2V0XzE2ICAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDIpOwotICBkLT55ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7Ci0gIGQtPndpZHRoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNik7Ci0gIGQtPmhlaWdodCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDgpOwotCi0gIG9mZiArPSAxMDsKLQotICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkLT5tZW51LCBkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4pOwotICBvZmYgKz0gc3VibGVuOwotCi0gIHN1YmxlbiA9IGdldF9yZXNpZCAoJmQtPmNsYXNzLCBkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4pOwotICBvZmYgKz0gc3VibGVuOwotCi0gIGQtPmNhcHRpb24gPSBnZXRfdW5pY29kZSAoZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuLCAmc3VibGVuKTsKLSAgb2ZmICs9IHN1YmxlbiAqIDIgKyAyOwotCi0gIGlmICgoZC0+c3R5bGUgJiBEU19TRVRGT05UKSA9PSAwKQotICAgIHsKLSAgICAgIGQtPnBvaW50c2l6ZSA9IDA7Ci0gICAgICBkLT5mb250ID0gTlVMTDsKLSAgICAgIGlmIChkLT5leCAhPSBOVUxMKQotCXsKLQkgIGQtPmV4LT53ZWlnaHQgPSAwOwotCSAgZC0+ZXgtPml0YWxpYyA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPCBvZmYgKyAyKQotCXRvb3NtYWxsIChfKCJkaWFsb2cgZm9udCBwb2ludCBzaXplIikpOwotCi0gICAgICBkLT5wb2ludHNpemUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotICAgICAgb2ZmICs9IDI7Ci0KLSAgICAgIGlmIChkLT5leCAhPSBOVUxMKQotCXsKLQkgIGlmIChsZW5ndGggPCBvZmYgKyA0KQotCSAgICB0b29zbWFsbCAoXygiZGlhbG9nZXggZm9udCBpbmZvcm1hdGlvbiIpKTsKLQkgIGQtPmV4LT53ZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotCSAgZC0+ZXgtPml0YWxpYyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDIpOwotCSAgb2ZmICs9IDQ7Ci0JfQotCi0gICAgICBkLT5mb250ID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbiwgJnN1Ymxlbik7Ci0gICAgICBvZmYgKz0gc3VibGVuICogMiArIDI7Ci0gICAgfQotCi0gIGQtPmNvbnRyb2xzID0gTlVMTDsKLSAgcHAgPSAmZC0+Y29udHJvbHM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmRjOwotICAgICAgaW50IGRhdGFsZW47Ci0KLSAgICAgIG9mZiA9IChvZmYgKyAzKSAmfiAzOwotCi0gICAgICBkYyA9IChzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKikgcmVzX2FsbG9jIChzaXplb2YgKmRjKTsKLQotICAgICAgaWYgKGQtPmV4ID09IE5VTEwpCi0JewotCSAgaWYgKGxlbmd0aCA8IG9mZiArIDgpCi0JICAgIHRvb3NtYWxsIChfKCJkaWFsb2cgY29udHJvbCIpKTsKLQotCSAgZGMtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLQkgIGRjLT5leHN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7Ci0JICBkYy0+aGVscCA9IDA7Ci0JICBvZmYgKz0gODsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGxlbmd0aCA8IG9mZiArIDEyKQotCSAgICB0b29zbWFsbCAoXygiZGlhbG9nZXggY29udHJvbCIpKTsKLQkgIGRjLT5oZWxwID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLQkgIGRjLT5leHN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7Ci0JICBkYy0+c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKLQkgIG9mZiArPSAxMjsKLQl9Ci0KLSAgICAgIGlmIChsZW5ndGggPCBvZmYgKyAxMCkKLQl0b29zbWFsbCAoXygiZGlhbG9nIGNvbnRyb2wiKSk7Ci0KLSAgICAgIGRjLT54ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLSAgICAgIGRjLT55ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgMik7Ci0gICAgICBkYy0+d2lkdGggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA0KTsKLSAgICAgIGRjLT5oZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA2KTsKLQotICAgICAgaWYgKGQtPmV4ICE9IE5VTEwpCi0gICAgICAgIGRjLT5pZCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDgpOwotICAgICAgZWxzZQotICAgICAgICBkYy0+aWQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKLQotICAgICAgb2ZmICs9IDEwICsgKGQtPmV4ICE9IE5VTEwgPyAyIDogMCk7Ci0KLSAgICAgIHN1YmxlbiA9IGdldF9yZXNpZCAoJmRjLT5jbGFzcywgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgICAgIG9mZiArPSBzdWJsZW47Ci0KLSAgICAgIHN1YmxlbiA9IGdldF9yZXNpZCAoJmRjLT50ZXh0LCBkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4pOwotICAgICAgb2ZmICs9IHN1YmxlbjsKLQotICAgICAgaWYgKGxlbmd0aCA8IG9mZiArIDIpCi0JdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIGVuZCIpKTsKLQotICAgICAgZGF0YWxlbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0gICAgICBvZmYgKz0gMjsKLQotICAgICAgaWYgKGRhdGFsZW4gPT0gMCkKLQlkYy0+ZGF0YSA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgb2ZmID0gKG9mZiArIDMpICZ+IDM7Ci0KLQkgIGlmIChsZW5ndGggPCBvZmYgKyBkYXRhbGVuKQotCSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGNvbnRyb2wgZGF0YSIpKTsKLQotCSAgZGMtPmRhdGEgPSAoKHN0cnVjdCByY2RhdGFfaXRlbSAqKQotCQkgICAgICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IHJjZGF0YV9pdGVtKSkpOwotCSAgZGMtPmRhdGEtPm5leHQgPSBOVUxMOwotCSAgZGMtPmRhdGEtPnR5cGUgPSBSQ0RBVEFfQlVGRkVSOwotCSAgZGMtPmRhdGEtPnUuYnVmZmVyLmxlbmd0aCA9IGRhdGFsZW47Ci0JICBkYy0+ZGF0YS0+dS5idWZmZXIuZGF0YSA9IGRhdGEgKyBvZmY7Ci0KLQkgIG9mZiArPSBkYXRhbGVuOwkgIAotCX0KLQotICAgICAgZGMtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZGM7Ci0gICAgICBwcCA9ICZkYy0+bmV4dDsKLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0RJQUxPRzsKLSAgci0+dS5kaWFsb2cgPSBkOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgc3RyaW5ndGFibGUgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3N0cmluZyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBzdHJpbmd0YWJsZSAqc3Q7Ci0gIGludCBpOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHN0ID0gKHN0cnVjdCBzdHJpbmd0YWJsZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqc3QpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzbGVuOwotCi0gICAgICBpZiAobGVuZ3RoIDwgMikKLQl0b29zbWFsbCAoXygic3RyaW5ndGFibGUgc3RyaW5nIGxlbmd0aCIpKTsKLSAgICAgIHNsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgc3QtPnN0cmluZ3NbaV0ubGVuZ3RoID0gc2xlbjsKLQotICAgICAgaWYgKHNsZW4gPiAwKQotCXsKLQkgIHVuaWNoYXIgKnM7Ci0JICB1bnNpZ25lZCBpbnQgajsKLQotCSAgaWYgKGxlbmd0aCA8IDIgKyAyICogc2xlbikKLQkgICAgdG9vc21hbGwgKF8oInN0cmluZ3RhYmxlIHN0cmluZyIpKTsKLQotCSAgcyA9ICh1bmljaGFyICopIHJlc19hbGxvYyAoc2xlbiAqIHNpemVvZiAodW5pY2hhcikpOwotCSAgc3QtPnN0cmluZ3NbaV0uc3RyaW5nID0gczsKLQotCSAgZm9yIChqID0gMDsgaiA8IHNsZW47IGorKykKLQkgICAgc1tqXSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIgKyBqICogMik7Ci0JfQotCi0gICAgICBkYXRhICs9IDIgKyAyICogc2xlbjsKLSAgICAgIGxlbmd0aCAtPSAyICsgMiAqIHNsZW47Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9TVFJJTkdUQUJMRTsKLSAgci0+dS5zdHJpbmd0YWJsZSA9IHN0OwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZm9udGRpciByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfZm9udGRpciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBjLCBpOwotICBzdHJ1Y3QgZm9udGRpciAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgdG9vc21hbGwgKF8oImZvbnRkaXIgaGVhZGVyIikpOwotCi0gIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZm9udGRpciAqZmQ7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2ZmOwotCi0gICAgICBpZiAobGVuZ3RoIDwgNTYpCi0JdG9vc21hbGwgKF8oImZvbnRkaXIiKSk7Ci0KLSAgICAgIGZkID0gKHN0cnVjdCBmb250ZGlyICopIHJlc19hbGxvYyAoc2l6ZW9mICpmZCk7Ci0gICAgICBmZC0+aW5kZXggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotCi0gICAgICAvKiBUbyB3b3JrIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBmb250ZGlyIGRhdGEsIHdlIG11c3QgZ2V0IHRoZQotICAgICAgICAgbGVuZ3RoIG9mIHRoZSBkZXZpY2UgbmFtZSBhbmQgZmFjZSBuYW1lIHN0cmluZ3MsIGV2ZW4gdGhvdWdoCi0gICAgICAgICB3ZSBkb24ndCBzdG9yZSB0aGVtIGluIHRoZSBmb250ZGlyIHN0cnVjdHVyZS4gIFRoZQotICAgICAgICAgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgdGhlc2UgYXJlIE5VTEwgdGVybWluYXRlZCBjaGFyCi0gICAgICAgICBzdHJpbmdzLCBub3QgVW5pY29kZSBzdHJpbmdzLiAgKi8KLQotICAgICAgb2ZmID0gNTY7Ci0KLSAgICAgIHdoaWxlIChvZmYgPCBsZW5ndGggJiYgZGF0YVtvZmZdICE9ICdcMCcpCi0JKytvZmY7Ci0gICAgICBpZiAob2ZmID49IGxlbmd0aCkKLQl0b29zbWFsbCAoXygiZm9udGRpciBkZXZpY2UgbmFtZSIpKTsKLSAgICAgICsrb2ZmOwotCi0gICAgICB3aGlsZSAob2ZmIDwgbGVuZ3RoICYmIGRhdGFbb2ZmXSAhPSAnXDAnKQotCSsrb2ZmOwotICAgICAgaWYgKG9mZiA+PSBsZW5ndGgpCi0JdG9vc21hbGwgKF8oImZvbnRkaXIgZmFjZSBuYW1lIikpOwotICAgICAgKytvZmY7Ci0KLSAgICAgIGZkLT5sZW5ndGggPSBvZmY7Ci0gICAgICBmZC0+ZGF0YSA9IGRhdGE7Ci0KLSAgICAgIGZkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGZkOwotICAgICAgcHAgPSAmZmQtPm5leHQ7Ci0KLSAgICAgIC8qIFRoZSBkb2N1bWVudGF0aW9uIGRvZXMgbm90IGluZGljYXRlIHRoYXQgYW55IHJvdW5kaW5nIGlzCi0gICAgICAgICByZXF1aXJlZC4gICovCi0KLSAgICAgIGRhdGEgKz0gb2ZmOwotICAgICAgbGVuZ3RoIC09IG9mZjsKLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0ZPTlRESVI7Ci0gIHItPnUuZm9udGRpciA9IGZpcnN0OwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGFuIGFjY2VsZXJhdG9ycyByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfYWNjZWxlcmF0b3JzIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGFjY2VsZXJhdG9yICpmaXJzdCwgKipwcDsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYTsKLQotICAgICAgaWYgKGxlbmd0aCA8IDgpCi0JdG9vc21hbGwgKF8oImFjY2VsZXJhdG9yIikpOwotCi0gICAgICBhID0gKHN0cnVjdCBhY2NlbGVyYXRvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYSk7Ci0KLSAgICAgIGEtPmZsYWdzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIGEtPmtleSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICAgICAgYS0+aWQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLQotICAgICAgYS0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBhOwotICAgICAgcHAgPSAmYS0+bmV4dDsKLQotICAgICAgaWYgKChhLT5mbGFncyAmIEFDQ19MQVNUKSAhPSAwKQotCWJyZWFrOwotCi0gICAgICBkYXRhICs9IDg7Ci0gICAgICBsZW5ndGggLT0gODsKLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0FDQ0VMRVJBVE9SOwotICByLT51LmFjYyA9IGZpcnN0OwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGFuIHJjZGF0YSByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfcmNkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLQotICByaS0+bmV4dCA9IE5VTEw7Ci0gIHJpLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKLSAgcmktPnUuYnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKLSAgcmktPnUuYnVmZmVyLmRhdGEgPSBkYXRhOwotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9SQ0RBVEE7Ci0gIHItPnUucmNkYXRhID0gcmk7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBncm91cCBjdXJzb3IgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2dyb3VwX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCB0eXBlLCBjLCBpOwotICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpmaXJzdCwgKipwcDsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBpZiAobGVuZ3RoIDwgNikKLSAgICB0b29zbWFsbCAoXygiZ3JvdXAgY3Vyc29yIGhlYWRlciIpKTsKLQotICB0eXBlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gIGlmICh0eXBlICE9IDIpCi0gICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgZ3JvdXAgY3Vyc29yIHR5cGUgJWQiKSwgdHlwZSk7Ci0KLSAgYyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotCi0gIGRhdGEgKz0gNjsKLSAgbGVuZ3RoIC09IDY7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBncm91cF9jdXJzb3IgKmdjOwotCi0gICAgICBpZiAobGVuZ3RoIDwgMTQpCi0JdG9vc21hbGwgKF8oImdyb3VwIGN1cnNvciIpKTsKLQotICAgICAgZ2MgPSAoc3RydWN0IGdyb3VwX2N1cnNvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqZ2MpOwotCi0gICAgICBnYy0+d2lkdGggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgZ2MtPmhlaWdodCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICAgICAgZ2MtPnBsYW5lcyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgZ2MtPmJpdHMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA2KTsKLSAgICAgIGdjLT5ieXRlcyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOwotICAgICAgZ2MtPmluZGV4ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMTIpOwotCi0gICAgICBnYy0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBnYzsKLSAgICAgIHBwID0gJmdjLT5uZXh0OwotCi0gICAgICBkYXRhICs9IDE0OwotICAgICAgbGVuZ3RoIC09IDE0OwotICAgIH0KLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfR1JPVVBfQ1VSU09SOwotICByLT51Lmdyb3VwX2N1cnNvciA9IGZpcnN0OwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZ3JvdXAgaWNvbiByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfZ3JvdXBfaWNvbiAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCB0eXBlLCBjLCBpOwotICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDYpCi0gICAgdG9vc21hbGwgKF8oImdyb3VwIGljb24gaGVhZGVyIikpOwotCi0gIHR5cGUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgaWYgKHR5cGUgIT0gMSkKLSAgICBmYXRhbCAoXygidW5leHBlY3RlZCBncm91cCBpY29uIHR5cGUgJWQiKSwgdHlwZSk7Ci0KLSAgYyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotCi0gIGRhdGEgKz0gNjsKLSAgbGVuZ3RoIC09IDY7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBncm91cF9pY29uICpnaTsKLQotICAgICAgaWYgKGxlbmd0aCA8IDE0KQotCXRvb3NtYWxsIChfKCJncm91cCBpY29uIikpOwotCi0gICAgICBnaSA9IChzdHJ1Y3QgZ3JvdXBfaWNvbiAqKSByZXNfYWxsb2MgKHNpemVvZiAqZ2kpOwotCi0gICAgICBnaS0+d2lkdGggPSBkYXRhWzBdOwotICAgICAgZ2ktPmhlaWdodCA9IGRhdGFbMV07Ci0gICAgICBnaS0+Y29sb3JzID0gZGF0YVsyXTsKLSAgICAgIGdpLT5wbGFuZXMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGdpLT5iaXRzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNik7Ci0gICAgICBnaS0+Ynl0ZXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGdpLT5pbmRleCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKTsKLQotICAgICAgZ2ktPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZ2k7Ci0gICAgICBwcCA9ICZnaS0+bmV4dDsKLQotICAgICAgZGF0YSArPSAxNDsKLSAgICAgIGxlbmd0aCAtPSAxNDsKLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0dST1VQX0lDT047Ci0gIHItPnUuZ3JvdXBfaWNvbiA9IGZpcnN0OwotCi0gIHJldHVybiByOwotfQotCi0vKiBFeHRyYWN0IGRhdGEgZnJvbSBhIHZlcnNpb24gaGVhZGVyLiAgSWYgS0VZIGlzIG5vdCBOVUxMLCB0aGVuIHRoZQotICAga2V5IG11c3QgYmUgS0VZOyBvdGhlcndpc2UsIHRoZSBrZXkgaXMgcmV0dXJuZWQgaW4gKlBLRVkuICBUaGlzCi0gICBzZXRzICpMRU4gdG8gdGhlIHRvdGFsIGxlbmd0aCwgKlZBTExFTiB0byB0aGUgdmFsdWUgbGVuZ3RoLCAqVFlQRQotICAgdG8gdGhlIHR5cGUsIGFuZCAqT0ZGIHRvIHRoZSBvZmZzZXQgdG8gdGhlIGNoaWxkcmVuLiAgKi8KLQotc3RhdGljIHZvaWQKLWdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCBrZXksIHBrZXksIGxlbiwgdmFsbGVuLCB0eXBlLAotCQkgICAgb2ZmKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgdW5pY2hhciAqKnBrZXk7Ci0gICAgIGludCAqbGVuOwotICAgICBpbnQgKnZhbGxlbjsKLSAgICAgaW50ICp0eXBlOwotICAgICBpbnQgKm9mZjsKLXsKLSAgaWYgKGxlbmd0aCA8IDgpCi0gICAgdG9vc21hbGwgKGtleSk7Ci0KLSAgKmxlbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICp2YWxsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgKnR5cGUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLQotICAqb2ZmID0gNjsKLQotICBsZW5ndGggLT0gNjsKLSAgZGF0YSArPSA2OwotCi0gIGlmIChrZXkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgc3VibGVuOwotCi0gICAgICAqcGtleSA9IGdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICZzdWJsZW4pOwotICAgICAgKm9mZiArPSBzdWJsZW4gKiAyICsgMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAobGVuZ3RoIDwgMikKLQkgICAgdG9vc21hbGwgKGtleSk7Ci0JICBpZiAoZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKSAhPSAodW5zaWduZWQgY2hhcikgKmtleSkKLQkgICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciKSk7Ci0KLQkgICpvZmYgKz0gMjsKLQkgIGxlbmd0aCAtPSAyOwotCSAgZGF0YSArPSAyOwotCi0JICBpZiAoKmtleSA9PSAnXDAnKQotCSAgICBicmVhazsKLQotCSAgKytrZXk7Ci0JfQotICAgIH0KLQotICAqb2ZmID0gKCpvZmYgKyAzKSAmfiAzOwotfQotCi0vKiBDb252ZXJ0IGEgdmVyc2lvbiByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfdmVyc2lvbiAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCB2ZXJsZW4sIHZhbGxlbiwgdHlwZSwgb2ZmOwotICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpOwotICBzdHJ1Y3QgdmVyX2luZm8gKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgdmVyc2lvbmluZm8gKnY7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICJWU19WRVJTSU9OX0lORk8iLAotCQkgICAgICAodW5pY2hhciAqKSBOVUxMLCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwgJm9mZik7Ci0KLSAgaWYgKCh1bnNpZ25lZCBpbnQpIHZlcmxlbiAhPSBsZW5ndGgpCi0gICAgZmF0YWwgKF8oInZlcnNpb24gbGVuZ3RoICVkIGRvZXMgbm90IG1hdGNoIHJlc291cmNlIGxlbmd0aCAlbHUiKSwKLQkgICB2ZXJsZW4sIGxlbmd0aCk7Ci0KLSAgaWYgKHR5cGUgIT0gMCkKLSAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHR5cGUgJWQiKSwgdHlwZSk7Ci0KLSAgZGF0YSArPSBvZmY7Ci0gIGxlbmd0aCAtPSBvZmY7Ci0KLSAgaWYgKHZhbGxlbiA9PSAwKQotICAgIGZpID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlLCBmaXY7Ci0KLSAgICAgIGlmICh2YWxsZW4gIT0gNTIpCi0JZmF0YWwgKF8oInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBsZW5ndGggJWQiKSwgdmFsbGVuKTsKLQotICAgICAgaWYgKGxlbmd0aCA8IDUyKQotCXRvb3NtYWxsIChfKCJmaXhlZCB2ZXJzaW9uIGluZm8iKSk7Ci0KLSAgICAgIHNpZ25hdHVyZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBpZiAoc2lnbmF0dXJlICE9IDB4ZmVlZjA0YmQpCi0JZmF0YWwgKF8oInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBzaWduYXR1cmUgJWx1IiksIHNpZ25hdHVyZSk7Ci0KLSAgICAgIGZpdiA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgaWYgKGZpdiAhPSAwICYmIGZpdiAhPSAweDEwMDAwKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mbyB2ZXJzaW9uICVsdSIpLCBmaXYpOwotCi0gICAgICBmaSA9IChzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKmZpKTsKLQotICAgICAgZmktPmZpbGVfdmVyc2lvbl9tcyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOwotICAgICAgZmktPmZpbGVfdmVyc2lvbl9scyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKTsKLSAgICAgIGZpLT5wcm9kdWN0X3ZlcnNpb25fbXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAxNik7Ci0gICAgICBmaS0+cHJvZHVjdF92ZXJzaW9uX2xzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMjApOwotICAgICAgZmktPmZpbGVfZmxhZ3NfbWFzayA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDI0KTsKLSAgICAgIGZpLT5maWxlX2ZsYWdzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMjgpOwotICAgICAgZmktPmZpbGVfb3MgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAzMik7Ci0gICAgICBmaS0+ZmlsZV90eXBlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMzYpOwotICAgICAgZmktPmZpbGVfc3VidHlwZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQwKTsKLSAgICAgIGZpLT5maWxlX2RhdGVfbXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0NCk7Ci0gICAgICBmaS0+ZmlsZV9kYXRlX2xzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNDgpOwotCi0gICAgICBkYXRhICs9IDUyOwotICAgICAgbGVuZ3RoIC09IDUyOwotICAgIH0KLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIHdoaWxlIChsZW5ndGggPiAwKQotICAgIHsKLSAgICAgIHN0cnVjdCB2ZXJfaW5mbyAqdmk7Ci0gICAgICBpbnQgY2g7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA4KQotCXRvb3NtYWxsIChfKCJ2ZXJzaW9uIHZhciBpbmZvIikpOwotCi0gICAgICB2aSA9IChzdHJ1Y3QgdmVyX2luZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKnZpKTsKLQotICAgICAgY2ggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA2KTsKLQotICAgICAgaWYgKGNoID09ICdTJykKLQl7Ci0JICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKipwcHZzOwotCi0JICB2aS0+dHlwZSA9IFZFUklORk9fU1RSSU5HOwotCi0JICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgIlN0cmluZ0ZpbGVJbmZvIiwKLQkJCSAgICAgICh1bmljaGFyICopIE5VTEwsICZ2ZXJsZW4sICZ2YWxsZW4sICZ0eXBlLAotCQkJICAgICAgJm9mZik7Ci0KLQkgIGlmICh2YWxsZW4gIT0gMCkKLQkgICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgc3RyaW5nZmlsZWluZm8gdmFsdWUgbGVuZ3RoICVkIiksIHZhbGxlbik7Ci0KLQkgIGRhdGEgKz0gb2ZmOwotCSAgbGVuZ3RoIC09IG9mZjsKLQotCSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkgICAgICAmdmktPnUuc3RyaW5nLmxhbmd1YWdlLCAmdmVybGVuLCAmdmFsbGVuLAotCQkJICAgICAgJnR5cGUsICZvZmYpOwotCi0JICBpZiAodmFsbGVuICE9IDApCi0JICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5ndGFibGUgdmFsdWUgbGVuZ3RoICVkIiksIHZhbGxlbik7Ci0KLQkgIGRhdGEgKz0gb2ZmOwotCSAgbGVuZ3RoIC09IG9mZjsKLQkgIHZlcmxlbiAtPSBvZmY7Ci0KLQkgIHZpLT51LnN0cmluZy5zdHJpbmdzID0gTlVMTDsKLQkgIHBwdnMgPSAmdmktPnUuc3RyaW5nLnN0cmluZ3M7Ci0KLQkgIC8qIEl0J3MgY29udmVuaWVudCB0byByb3VuZCB2ZXJsZW4gdG8gYSA0IGJ5dGUgYWxpZ25tZW50LAotICAgICAgICAgICAgIHNpbmNlIHdlIHJvdW5kIHRoZSBzdWJ2YXJpYWJsZXMgaW4gdGhlIGxvb3AuICAqLwotCSAgdmVybGVuID0gKHZlcmxlbiArIDMpICZ+IDM7Ci0KLQkgIHdoaWxlICh2ZXJsZW4gPiAwKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2czsKLQkgICAgICBpbnQgc3VidmVybGVuLCB2c2xlbiwgdmFsb2ZmOwotCi0JICAgICAgdnMgPSAoc3RydWN0IHZlcl9zdHJpbmdpbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2cyk7Ci0KLQkgICAgICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwKLQkJCQkgIChjb25zdCBjaGFyICopIE5VTEwsICZ2cy0+a2V5LCAmc3VidmVybGVuLAotCQkJCSAgJnZhbGxlbiwgJnR5cGUsICZvZmYpOwotCi0JICAgICAgc3VidmVybGVuID0gKHN1YnZlcmxlbiArIDMpICZ+IDM7Ci0KLQkgICAgICBkYXRhICs9IG9mZjsKLQkgICAgICBsZW5ndGggLT0gb2ZmOwotCi0JICAgICAgdnMtPnZhbHVlID0gZ2V0X3VuaWNvZGUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgJnZzbGVuKTsKLQkgICAgICB2YWxvZmYgPSB2c2xlbiAqIDIgKyAyOwotCSAgICAgIHZhbG9mZiA9ICh2YWxvZmYgKyAzKSAmfiAzOwotCi0JICAgICAgaWYgKG9mZiArIHZhbG9mZiAhPSBzdWJ2ZXJsZW4pCi0JCWZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIGxlbmd0aCAlZCAhPSAlZCArICVkIiksCi0JCSAgICAgICBzdWJ2ZXJsZW4sIG9mZiwgdmFsb2ZmKTsKLQotCSAgICAgIHZzLT5uZXh0ID0gTlVMTDsKLQkgICAgICAqcHB2cyA9IHZzOwotCSAgICAgIHBwdnMgPSAmdnMtPm5leHQ7Ci0KLQkgICAgICBkYXRhICs9IHZhbG9mZjsKLQkgICAgICBsZW5ndGggLT0gdmFsb2ZmOwotCi0JICAgICAgaWYgKHZlcmxlbiA8IHN1YnZlcmxlbikKLQkJZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmcgbGVuZ3RoICVkIDwgJWQiKSwKLQkJICAgICAgIHZlcmxlbiwgc3VidmVybGVuKTsKLQotCSAgICAgIHZlcmxlbiAtPSBzdWJ2ZXJsZW47Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChjaCA9PSAnVicpCi0JewotCSAgc3RydWN0IHZlcl92YXJpbmZvICoqcHB2djsKLQotCSAgdmktPnR5cGUgPSBWRVJJTkZPX1ZBUjsKLQotCSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICJWYXJGaWxlSW5mbyIsCi0JCQkgICAgICAodW5pY2hhciAqKSBOVUxMLCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwKLQkJCSAgICAgICZvZmYpOwotCi0JICBpZiAodmFsbGVuICE9IDApCi0JICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHZhcmZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICBkYXRhICs9IG9mZjsKLQkgIGxlbmd0aCAtPSBvZmY7Ci0KLQkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJICAgICAgJnZpLT51LnZhci5rZXksICZ2ZXJsZW4sICZ2YWxsZW4sICZ0eXBlLCAmb2ZmKTsKLQotCSAgZGF0YSArPSBvZmY7Ci0JICBsZW5ndGggLT0gb2ZmOwotCi0JICB2aS0+dS52YXIudmFyID0gTlVMTDsKLQkgIHBwdnYgPSAmdmktPnUudmFyLnZhcjsKLQotCSAgd2hpbGUgKHZhbGxlbiA+IDApCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2OwotCi0JICAgICAgaWYgKGxlbmd0aCA8IDQpCi0JCXRvb3NtYWxsIChfKCJ2ZXJzaW9uIHZhcmZpbGVpbmZvIikpOwotCi0JICAgICAgdnYgPSAoc3RydWN0IHZlcl92YXJpbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2dik7Ci0KLQkgICAgICB2di0+bGFuZ3VhZ2UgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotCSAgICAgIHZ2LT5jaGFyc2V0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0KLQkgICAgICB2di0+bmV4dCA9IE5VTEw7Ci0JICAgICAgKnBwdnYgPSB2djsKLQkgICAgICBwcHZ2ID0gJnZ2LT5uZXh0OwotCi0JICAgICAgZGF0YSArPSA0OwotCSAgICAgIGxlbmd0aCAtPSA0OwotCi0JICAgICAgaWYgKHZhbGxlbiA8IDQpCi0JCWZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gdmFsdWUgbGVuZ3RoICVkIiksIHZhbGxlbik7Ci0KLQkgICAgICB2YWxsZW4gLT0gNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyIpKTsKLQotICAgICAgdmktPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gdmk7Ci0gICAgICBwcCA9ICZ2aS0+bmV4dDsgICAgICAKLSAgICB9Ci0KLSAgdiA9IChzdHJ1Y3QgdmVyc2lvbmluZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKnYpOwotICB2LT5maXhlZCA9IGZpOwotICB2LT52YXIgPSBmaXJzdDsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfVkVSU0lPTklORk87Ci0gIHItPnUudmVyc2lvbmluZm8gPSB2OwotCi0gIHJldHVybiByOyAgCi19Ci0KLS8qIENvbnZlcnQgYW4gYXJiaXRyYXJ5IHVzZXIgZGVmaW5lZCByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfdXNlcmRhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHJpID0gKHN0cnVjdCByY2RhdGFfaXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmkpOwotCi0gIHJpLT5uZXh0ID0gTlVMTDsKLSAgcmktPnR5cGUgPSBSQ0RBVEFfQlVGRkVSOwotICByaS0+dS5idWZmZXIubGVuZ3RoID0gbGVuZ3RoOwotICByaS0+dS5idWZmZXIuZGF0YSA9IGRhdGE7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX1VTRVJEQVRBOwotICByLT51LnJjZGF0YSA9IHJpOwotCi0gIHJldHVybiByOwotfQotDAotLyogTWFjcm9zIHRvIHN3YXAgb3V0IHZhbHVlcy4gICovCi0KLSNkZWZpbmUgcHV0XzE2KGJlLCB2LCBzKSAoKGJlKSA/IGJmZF9wdXRiMTYgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMTYgKCh2KSwgKHMpKSkKLSNkZWZpbmUgcHV0XzMyKGJlLCB2LCBzKSAoKGJlKSA/IGJmZF9wdXRiMzIgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMzIgKCh2KSwgKHMpKSkKLQotLyogTG9jYWwgZnVuY3Rpb25zIHVzZWQgdG8gY29udmVydCByZXNvdXJjZXMgdG8gYmluYXJ5IGZvcm1hdC4gICovCi0KLXN0YXRpYyB2b2lkIGR3b3JkX2FsaWduX2JpbiBQQVJBTVMgKChzdHJ1Y3QgYmluZGF0YSAqKiosIHVuc2lnbmVkIGxvbmcgKikpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNpZF90b19iaW4gUEFSQU1TICgoc3RydWN0IHJlc19pZCwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnVuaWNvZGVfdG9fYmluIFBBUkFNUyAoKGNvbnN0IHVuaWNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fYWNjZWxlcmF0b3IKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2N1cnNvcgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgY3Vyc29yICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2dyb3VwX2N1cnNvcgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2RpYWxvZwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZGlhbG9nICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2ZvbnRkaXIKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZvbnRkaXIgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fZ3JvdXBfaWNvbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9tZW51Ci0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51ICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX21lbnVpdGVtcwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fbWVudWV4aXRlbXMKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnVpdGVtICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX3JjZGF0YQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fc3RyaW5ndGFibGUKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHN0cmluZ3RhYmxlICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpzdHJpbmdfdG9fdW5pY29kZV9iaW4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl92ZXJzaW9uaW5mbwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgdmVyc2lvbmluZm8gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fZ2VuZXJpYwotICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogQ29udmVydCBhIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW4gKHJlcywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3dpdGNoIChyZXMtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKLSAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6Ci0gICAgY2FzZSBSRVNfVFlQRV9JQ09OOgotICAgIGNhc2UgUkVTX1RZUEVfTUVTU0FHRVRBQkxFOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZ2VuZXJpYyAocmVzLT51LmRhdGEubGVuZ3RoLCByZXMtPnUuZGF0YS5kYXRhKTsKLSAgICBjYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fYWNjZWxlcmF0b3IgKHJlcy0+dS5hY2MsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fY3Vyc29yIChyZXMtPnUuY3Vyc29yLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2dyb3VwX2N1cnNvciAocmVzLT51Lmdyb3VwX2N1cnNvciwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9ESUFMT0c6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9kaWFsb2cgKHJlcy0+dS5kaWFsb2csIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2ZvbnRkaXIgKHJlcy0+dS5mb250ZGlyLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9ncm91cF9pY29uIChyZXMtPnUuZ3JvdXBfaWNvbiwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9NRU5VOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fbWVudSAocmVzLT51Lm1lbnUsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfUkNEQVRBOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fcmNkYXRhIChyZXMtPnUucmNkYXRhLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fc3RyaW5ndGFibGUgKHJlcy0+dS5zdHJpbmd0YWJsZSwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9VU0VSREFUQToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX3JjZGF0YSAocmVzLT51LnJjZGF0YSwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9WRVJTSU9OSU5GTzoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX3ZlcnNpb25pbmZvIChyZXMtPnUudmVyc2lvbmluZm8sIGJpZ19lbmRpYW4pOwotICAgIH0KLX0KLQotLyogQWxpZ24gdG8gYSAzMiBiaXQgYm91bmRhcnkuICBQUFAgcG9pbnRzIHRvIHRoZSBvZiBhIGxpc3Qgb2YgYmluZGF0YQotICAgc3RydWN0dXJlcy4gIExFTkdUSCBwb2ludHMgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RydWN0dXJlcy4gIElmCi0gICBuZWNlc3NhcnksIHRoaXMgYWRkcyBhIG5ldyBiaW5kYXRhIHRvIGJyaW5nIGxlbmd0aCB1cCB0byBhIDMyIGJpdAotICAgYm91bmRhcnkuICBJdCB1cGRhdGVzICpQUFAgYW5kICpMRU5HVEguICAqLwotCi1zdGF0aWMgdm9pZAotZHdvcmRfYWxpZ25fYmluIChwcHAsIGxlbmd0aCkKLSAgICAgc3RydWN0IGJpbmRhdGEgKioqcHBwOwotICAgICB1bnNpZ25lZCBsb25nICpsZW5ndGg7Ci17Ci0gIGludCBhZGQ7Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGlmICgoKmxlbmd0aCAmIDMpID09IDApCi0gICAgcmV0dXJuOwotCi0gIGFkZCA9IDQgLSAoKmxlbmd0aCAmIDMpOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPmxlbmd0aCA9IGFkZDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChhZGQpOwotICBtZW1zZXQgKGQtPmRhdGEsIDAsIGFkZCk7Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0gICoqcHBwID0gZDsKLSAgKnBwcCA9ICYoKipwcHApLT5uZXh0OwotCi0gICpsZW5ndGggKz0gYWRkOwotfQotCi0vKiBDb252ZXJ0IGEgcmVzb3VyY2UgSUQgdG8gYmluYXJ5LiAgVGhpcyBhbHdheXMgcmV0dXJucyBleGFjdGx5IG9uZQotICAgYmluZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzaWRfdG9fYmluIChpZCwgYmlnX2VuZGlhbikKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0KLSAgaWYgKCEgaWQubmFtZWQpCi0gICAgewotICAgICAgZC0+bGVuZ3RoID0gNDsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDB4ZmZmZiwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGlkLnUuaWQsIGQtPmRhdGEgKyAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZC0+bGVuZ3RoID0gaWQudS5uLmxlbmd0aCAqIDIgKyAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGlkLnUubi5sZW5ndGg7IGkrKykKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIGlkLnUubi5uYW1lW2ldLCBkLT5kYXRhICsgaSAqIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgaSAqIDIpOwotICAgIH0KLQotICBkLT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsKLX0KLQotLyogQ29udmVydCBhIG51bGwgdGVybWluYXRlZCB1bmljb2RlIHN0cmluZyB0byBiaW5hcnkuICBUaGlzIGFsd2F5cwotICAgcmV0dXJucyBleGFjdGx5IG9uZSBiaW5kYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi11bmljb2RlX3RvX2JpbiAoc3RyLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bmljaGFyICpzdHI7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgbGVuOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBsZW4gPSAwOwotICBpZiAoc3RyICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgdW5pY2hhciAqczsKLQotICAgICAgZm9yIChzID0gc3RyOyAqcyAhPSAwOyBzKyspCi0JKytsZW47Ci0gICAgfQotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPmxlbmd0aCA9IGxlbiAqIDIgKyAyOwotICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0KLSAgaWYgKHN0ciA9PSBOVUxMKQotICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCB1bmljaGFyICpzOwotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAocyA9IHN0ciwgaSA9IDA7ICpzICE9IDA7IHMrKywgaSsrKQotCXB1dF8xNiAoYmlnX2VuZGlhbiwgKnMsIGQtPmRhdGEgKyBpICogMik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyBpICogMik7Ci0gICAgfQotCi0gIGQtPm5leHQgPSBOVUxMOwotCi0gIHJldHVybiBkOwotfQotCi0vKiBDb252ZXJ0IGFuIGFjY2VsZXJhdG9yIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2FjY2VsZXJhdG9yIChhY2NlbGVyYXRvcnMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjZWxlcmF0b3JzOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmE7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKGEgPSBhY2NlbGVyYXRvcnM7IGEgIT0gTlVMTDsgYSA9IGEtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSA4OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg4KTsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLAotCSAgICAgIGEtPmZsYWdzIHwgKGEtPm5leHQgIT0gTlVMTCA/IDAgOiBBQ0NfTEFTVCksCi0JICAgICAgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGEtPmtleSwgZC0+ZGF0YSArIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBhLT5pZCwgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgOCk7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIGN1cnNvciByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9jdXJzb3IgKGMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBjdXJzb3IgKmM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSA0OwotICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYy0+eGhvdHNwb3QsIGQtPmRhdGEpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMtPnlob3RzcG90LCBkLT5kYXRhICsgMik7Ci0KLSAgZC0+bmV4dCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bmV4dC0+bGVuZ3RoID0gYy0+bGVuZ3RoOwotICBkLT5uZXh0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgYy0+ZGF0YTsKLSAgZC0+bmV4dC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7Ci19Ci0KLS8qIENvbnZlcnQgYSBncm91cCBjdXJzb3IgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZ3JvdXBfY3Vyc29yIChncm91cF9jdXJzb3JzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpncm91cF9jdXJzb3JzOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBpbnQgYzsKLSAgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqZ2M7Ci0KLSAgZmlyc3QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZmlyc3QpOwotICBmaXJzdC0+bGVuZ3RoID0gNjsKLSAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSk7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMiwgZmlyc3QtPmRhdGEgKyAyKTsKLQotICBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gIGMgPSAwOwotICBmb3IgKGdjID0gZ3JvdXBfY3Vyc29yczsgZ2MgIT0gTlVMTDsgZ2MgPSBnYy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICAgICAgKytjOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gMTQ7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDE0KTsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+d2lkdGgsIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+aGVpZ2h0LCBkLT5kYXRhICsgMik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT5wbGFuZXMsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPmJpdHMsIGQtPmRhdGEgKyA2KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZ2MtPmJ5dGVzLCBkLT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT5pbmRleCwgZC0+ZGF0YSArIDEyKTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSArIDQpOwotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIGRpYWxvZyByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9kaWFsb2cgKGRpYWxvZywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IGRpYWxvZyAqZGlhbG9nOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IGRpYWxvZ2V4OwotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICBpbnQgb2ZmLCBjOwotICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmRjOwotCi0gIGRpYWxvZ2V4ID0gZXh0ZW5kZWRfZGlhbG9nIChkaWFsb2cpOwotCi0gIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKLSAgZmlyc3QtPmxlbmd0aCA9IGRpYWxvZ2V4ID8gMjYgOiAxODsKLSAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZmlyc3QtPmxlbmd0aCk7Ci0KLSAgbGVuZ3RoID0gZmlyc3QtPmxlbmd0aDsKLQotICBpZiAoISBkaWFsb2dleCkKLSAgICB7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+c3R5bGUsIGZpcnN0LT5kYXRhKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5leHN0eWxlLCBmaXJzdC0+ZGF0YSArIDQpOwotICAgICAgb2ZmID0gODsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDEsIGZpcnN0LT5kYXRhKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMHhmZmZmLCBmaXJzdC0+ZGF0YSArIDIpOwotCi0gICAgICBpZiAoZGlhbG9nLT5leCA9PSBOVUxMKQotCXB1dF8zMiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEgKyA0KTsKLSAgICAgIGVsc2UKLQlwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXgtPmhlbHAsIGZpcnN0LT5kYXRhICsgNCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXhzdHlsZSwgZmlyc3QtPmRhdGEgKyA4KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5zdHlsZSwgZmlyc3QtPmRhdGEgKyAxMik7Ci0gICAgICBvZmYgPSAxNjsKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPngsIGZpcnN0LT5kYXRhICsgb2ZmICsgMik7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT55LCBmaXJzdC0+ZGF0YSArIG9mZiArIDQpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+d2lkdGgsIGZpcnN0LT5kYXRhICsgb2ZmICsgNik7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5oZWlnaHQsIGZpcnN0LT5kYXRhICsgb2ZmICsgOCk7Ci0KLSAgcHAgPSAmZmlyc3QtPm5leHQ7Ci0KLSAgKnBwID0gcmVzaWRfdG9fYmluIChkaWFsb2ctPm1lbnUsIGJpZ19lbmRpYW4pOwotICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLSAgKnBwID0gcmVzaWRfdG9fYmluIChkaWFsb2ctPmNsYXNzLCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gICpwcCA9IHVuaWNvZGVfdG9fYmluIChkaWFsb2ctPmNhcHRpb24sIGJpZ19lbmRpYW4pOwotICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLSAgaWYgKChkaWFsb2ctPnN0eWxlICYgRFNfU0VURk9OVCkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IGRpYWxvZ2V4ID8gNiA6IDI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0KLSAgICAgIGxlbmd0aCArPSBkLT5sZW5ndGg7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5wb2ludHNpemUsIGQtPmRhdGEpOwotCi0gICAgICBpZiAoZGlhbG9nZXgpCi0JewotCSAgaWYgKGRpYWxvZy0+ZXggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIDIpOwotCSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIDQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXgtPndlaWdodCwgZC0+ZGF0YSArIDIpOwotCSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5leC0+aXRhbGljLCBkLT5kYXRhICsgNCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAoZGlhbG9nLT5mb250LCBiaWdfZW5kaWFuKTsKLSAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0gICAgfQotCi0gIGMgPSAwOwotICBmb3IgKGRjID0gZGlhbG9nLT5jb250cm9sczsgZGMgIT0gTlVMTDsgZGMgPSBkYy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgICAgIGludCBkY29mZjsKLQotICAgICAgKytjOwotCi0gICAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSBkaWFsb2dleCA/IDI0IDogMTg7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0KLSAgICAgIGxlbmd0aCArPSBkLT5sZW5ndGg7Ci0KLSAgICAgIGlmICghIGRpYWxvZ2V4KQotCXsKLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPnN0eWxlLCBkLT5kYXRhKTsKLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmV4c3R5bGUsIGQtPmRhdGEgKyA0KTsKLQkgIGRjb2ZmID0gODsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+aGVscCwgZC0+ZGF0YSk7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5leHN0eWxlLCBkLT5kYXRhICsgNCk7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5zdHlsZSwgZC0+ZGF0YSArIDgpOwotCSAgZGNvZmYgPSAxMjsKLQl9Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGMtPngsIGQtPmRhdGEgKyBkY29mZik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT55LCBkLT5kYXRhICsgZGNvZmYgKyAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGMtPndpZHRoLCBkLT5kYXRhICsgZGNvZmYgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGMtPmhlaWdodCwgZC0+ZGF0YSArIGRjb2ZmICsgNik7Ci0KLSAgICAgIGlmIChkaWFsb2dleCkKLSAgICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+aWQsIGQtPmRhdGEgKyBkY29mZiArIDgpOwotICAgICAgZWxzZQotICAgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT5pZCwgZC0+ZGF0YSArIGRjb2ZmICsgOCk7Ci0KLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICAqcHAgPSByZXNpZF90b19iaW4gKGRjLT5jbGFzcywgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICAqcHAgPSByZXNpZF90b19iaW4gKGRjLT50ZXh0LCBiaWdfZW5kaWFuKTsKLSAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgyKTsKLQotICAgICAgbGVuZ3RoICs9IDI7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0KLSAgICAgIGlmIChkYy0+ZGF0YSA9PSBOVUxMKQotCXB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSk7Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBzdWJsZW47Ci0KLQkgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotCSAgKnBwID0gcmVzX3RvX2Jpbl9yY2RhdGEgKGRjLT5kYXRhLCBiaWdfZW5kaWFuKTsKLQkgIHN1YmxlbiA9IDA7Ci0JICB3aGlsZSAoKnBwICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdWJsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQkgICAgfQotCi0JICBwdXRfMTYgKGJpZ19lbmRpYW4sIHN1YmxlbiwgZC0+ZGF0YSk7Ci0KLQkgIGxlbmd0aCArPSBzdWJsZW47Ci0JfQotICAgIH0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSArIG9mZik7Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgZm9udGRpciByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9mb250ZGlyIChmb250ZGlycywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IGZvbnRkaXIgKmZvbnRkaXJzOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBpbnQgYzsKLSAgY29uc3Qgc3RydWN0IGZvbnRkaXIgKmZkOwotCi0gIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKLSAgZmlyc3QtPmxlbmd0aCA9IDI7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDIpOwotCi0gIGZpcnN0LT5uZXh0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3QtPm5leHQ7Ci0KLSAgYyA9IDA7Ci0gIGZvciAoZmQgPSBmb250ZGlyczsgZmQgIT0gTlVMTDsgZmQgPSBmZC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICAgICAgKytjOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZmQtPmluZGV4LCBkLT5kYXRhKTsKLQotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSBmZC0+bGVuZ3RoOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGZkLT5kYXRhOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OyAgICAgIAotICAgIH0KLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMsIGZpcnN0LT5kYXRhKTsKLQotICByZXR1cm4gZmlyc3Q7ICAKLX0KLQotLyogQ29udmVydCBhIGdyb3VwIGljb24gcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZ3JvdXBfaWNvbiAoZ3JvdXBfaWNvbnMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpncm91cF9pY29uczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgaW50IGM7Ci0gIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpnaTsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSA2OwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhKTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCAxLCBmaXJzdC0+ZGF0YSArIDIpOwotCi0gIGZpcnN0LT5uZXh0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3QtPm5leHQ7Ci0KLSAgYyA9IDA7Ci0gIGZvciAoZ2kgPSBncm91cF9pY29uczsgZ2kgIT0gTlVMTDsgZ2kgPSBnaS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICAgICAgKytjOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gMTQ7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDE0KTsKLQotICAgICAgZC0+ZGF0YVswXSA9IGdpLT53aWR0aDsKLSAgICAgIGQtPmRhdGFbMV0gPSBnaS0+aGVpZ2h0OwotICAgICAgZC0+ZGF0YVsyXSA9IGdpLT5jb2xvcnM7Ci0gICAgICBkLT5kYXRhWzNdID0gMDsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2ktPnBsYW5lcywgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnaS0+Yml0cywgZC0+ZGF0YSArIDYpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBnaS0+Ynl0ZXMsIGQtPmRhdGEgKyA4KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2ktPmluZGV4LCBkLT5kYXRhICsgMTIpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotICAgIH0KLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMsIGZpcnN0LT5kYXRhICsgNCk7Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgbWVudSByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9tZW51IChtZW51LCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgbWVudSAqbWVudTsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBtZW51ZXg7Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIG1lbnVleCA9IGV4dGVuZGVkX21lbnUgKG1lbnUpOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPmxlbmd0aCA9IG1lbnVleCA/IDggOiA0OwotICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0KLSAgaWYgKCEgbWVudWV4KQotICAgIHsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyAyKTsKLQotICAgICAgZC0+bmV4dCA9IHJlc190b19iaW5fbWVudWl0ZW1zIChtZW51LT5pdGVtcywgYmlnX2VuZGlhbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAxLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgNCwgZC0+ZGF0YSArIDIpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBtZW51LT5oZWxwLCBkLT5kYXRhICsgNCk7Ci0KLSAgICAgIGQtPm5leHQgPSByZXNfdG9fYmluX21lbnVleGl0ZW1zIChtZW51LT5pdGVtcywgYmlnX2VuZGlhbik7Ci0gICAgfQotCi0gIHJldHVybiBkOwotfQotCi0vKiBDb252ZXJ0IG1lbnUgaXRlbXMgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fbWVudWl0ZW1zIChpdGVtcywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICppdGVtczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAobWkgPSBpdGVtczsgbWkgIT0gTlVMTDsgbWkgPSBtaS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgICAgIGludCBmbGFnczsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IG1pLT5wb3B1cCA9PSBOVUxMID8gNCA6IDI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0KLSAgICAgIGZsYWdzID0gbWktPnR5cGU7Ci0gICAgICBpZiAobWktPm5leHQgPT0gTlVMTCkKLQlmbGFncyB8PSBNRU5VSVRFTV9FTkRNRU5VOwotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCWZsYWdzIHw9IE1FTlVJVEVNX1BPUFVQOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGZsYWdzLCBkLT5kYXRhKTsKLQotICAgICAgaWYgKG1pLT5wb3B1cCA9PSBOVUxMKQotCXB1dF8xNiAoYmlnX2VuZGlhbiwgbWktPmlkLCBkLT5kYXRhICsgMik7Ci0KLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAobWktPnRleHQsIGJpZ19lbmRpYW4pOwotICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLSAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKLQl7Ci0JICAqcHAgPSByZXNfdG9fYmluX21lbnVpdGVtcyAobWktPnBvcHVwLCBiaWdfZW5kaWFuKTsKLQkgIHdoaWxlICgqcHAgIT0gTlVMTCkKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgbWVudWV4IGl0ZW1zIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX21lbnVleGl0ZW1zIChpdGVtcywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICppdGVtczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBsZW5ndGggPSAwOwotCi0gIGZvciAobWkgPSBpdGVtczsgbWkgIT0gTlVMTDsgbWkgPSBtaS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgICAgIGludCBmbGFnczsKLQotICAgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gMTI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDEyKTsKLQotICAgICAgbGVuZ3RoICs9IDEyOwotCi0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIG1pLT50eXBlLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWktPnN0YXRlLCBkLT5kYXRhICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIG1pLT5pZCwgZC0+ZGF0YSArIDgpOwotCi0gICAgICBmbGFncyA9IDA7Ci0gICAgICBpZiAobWktPm5leHQgPT0gTlVMTCkKLQlmbGFncyB8PSAweDgwOwotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCWZsYWdzIHw9IDE7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGZsYWdzLCBkLT5kYXRhICsgMTApOwotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gdW5pY29kZV90b19iaW4gKG1pLT50ZXh0LCBiaWdfZW5kaWFuKTsKLSAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLSAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKLQl7Ci0JICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0KLQkgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0JICBkLT5sZW5ndGggPSA0OwotCSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg0KTsKLQotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBtaS0+aGVscCwgZC0+ZGF0YSk7Ci0KLQkgICpwcCA9IGQ7Ci0JICBwcCA9ICZkLT5uZXh0OwotCi0JICAqcHAgPSByZXNfdG9fYmluX21lbnVleGl0ZW1zIChtaS0+cG9wdXAsIGJpZ19lbmRpYW4pOwotCSAgd2hpbGUgKCpwcCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhbiByY2RhdGEgcmVzb3VyY2UgdG8gYmluYXJ5LiAgVGhpcyBpcyBhbHNvIHVzZWQgdG8gY29udmVydAotICAgb3RoZXIgaW5mb3JtYXRpb24gd2hpY2ggaGFwcGVucyB0byBiZSBzdG9yZWQgaW4gcmNkYXRhX2l0ZW0gbGlzdHMKLSAgIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX3JjZGF0YSAoaXRlbXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqaXRlbXM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKHJpID0gaXRlbXM7IHJpICE9IE5VTEw7IHJpID0gcmktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0KLSAgICAgIHN3aXRjaCAocmktPnR5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgUkNEQVRBX1dPUkQ6Ci0JICBkLT5sZW5ndGggPSAyOwotCSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgyKTsKLQkgIHB1dF8xNiAoYmlnX2VuZGlhbiwgcmktPnUud29yZCwgZC0+ZGF0YSk7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX0RXT1JEOgotCSAgZC0+bGVuZ3RoID0gNDsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIHJpLT51LmR3b3JkLCBkLT5kYXRhKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSQ0RBVEFfU1RSSU5HOgotCSAgZC0+bGVuZ3RoID0gcmktPnUuc3RyaW5nLmxlbmd0aDsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByaS0+dS5zdHJpbmcuczsKLQkgIGJyZWFrOwotCi0JY2FzZSBSQ0RBVEFfV1NUUklORzoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpOwotCi0JICAgIGQtPmxlbmd0aCA9IHJpLT51LndzdHJpbmcubGVuZ3RoICogMjsKLQkgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgcmktPnUud3N0cmluZy5sZW5ndGg7IGkrKykKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHJpLT51LndzdHJpbmcud1tpXSwgZC0+ZGF0YSArIGkgKiAyKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIFJDREFUQV9CVUZGRVI6Ci0JICBkLT5sZW5ndGggPSByaS0+dS5idWZmZXIubGVuZ3RoOwotCSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJpLT51LmJ1ZmZlci5kYXRhOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBzdHJpbmd0YWJsZSByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9zdHJpbmd0YWJsZSAoc3QsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqc3Q7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGludCBpOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgaW50IHNsZW4sIGo7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgICAgIHVuaWNoYXIgKnM7Ci0KLSAgICAgIHNsZW4gPSBzdC0+c3RyaW5nc1tpXS5sZW5ndGg7Ci0gICAgICBzID0gc3QtPnN0cmluZ3NbaV0uc3RyaW5nOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gMiArIHNsZW4gKiAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHNsZW4sIGQtPmRhdGEpOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgc2xlbjsgaisrKQotCXB1dF8xNiAoYmlnX2VuZGlhbiwgc1tqXSwgZC0+ZGF0YSArIDIgKyBqICogMik7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7ICAgICAgCi0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIGJpbmFyeSBzdHJpbmcuICBUaGlzIGFsd2F5cwotICAgcmV0dXJucyBleGFjdGx5IG9uZSBiaW5kYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1zdHJpbmdfdG9fdW5pY29kZV9iaW4gKHMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzaXplX3QgbGVuLCBpOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBsZW4gPSBzdHJsZW4gKHMpOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPmxlbmd0aCA9IGxlbiAqIDIgKyAyOwotICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgc1tpXSwgZC0+ZGF0YSArIGkgKiAyKTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgaSAqIDIpOwotCi0gIGQtPm5leHQgPSBOVUxMOwotCi0gIHJldHVybiBkOyAgCi19Ci0KLS8qIENvbnZlcnQgYSB2ZXJzaW9uaW5mbyByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl92ZXJzaW9uaW5mbyAodmVyc2lvbmluZm8sIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCB2ZXJzaW9uaW5mbyAqdmVyc2lvbmluZm87Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICBzdHJ1Y3QgdmVyX2luZm8gKnZpOwotCi0gIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKLSAgZmlyc3QtPmxlbmd0aCA9IDY7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0gIGxlbmd0aCA9IDY7Ci0KLSAgaWYgKHZlcnNpb25pbmZvLT5maXhlZCA9PSBOVUxMKQotICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEgKyAyKTsKLSAgZWxzZQotICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgNTIsIGZpcnN0LT5kYXRhICsgMik7Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSArIDQpOwotCi0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gICpwcCA9IHN0cmluZ190b191bmljb2RlX2JpbiAoIlZTX1ZFUlNJT05fSU5GTyIsIGJpZ19lbmRpYW4pOwotICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLSAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0gIGlmICh2ZXJzaW9uaW5mby0+Zml4ZWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpOwotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSA1MjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNTIpOwotCi0gICAgICBsZW5ndGggKz0gNTI7Ci0KLSAgICAgIGZpID0gdmVyc2lvbmluZm8tPmZpeGVkOwotCi0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIDB4ZmVlZjA0YmQsIGQtPmRhdGEpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCAweDEwMDAwLCBkLT5kYXRhICsgNCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX3ZlcnNpb25fbXMsIGQtPmRhdGEgKyA4KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfdmVyc2lvbl9scywgZC0+ZGF0YSArIDEyKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPnByb2R1Y3RfdmVyc2lvbl9tcywgZC0+ZGF0YSArIDE2KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPnByb2R1Y3RfdmVyc2lvbl9scywgZC0+ZGF0YSArIDIwKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZmxhZ3NfbWFzaywgZC0+ZGF0YSArIDI0KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZmxhZ3MsIGQtPmRhdGEgKyAyOCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX29zLCBkLT5kYXRhICsgMzIpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV90eXBlLCBkLT5kYXRhICsgMzYpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9zdWJ0eXBlLCBkLT5kYXRhICsgNDApOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9kYXRlX21zLCBkLT5kYXRhICsgNDQpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9kYXRlX2xzLCBkLT5kYXRhICsgNDgpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotICAgIH0KLQotICBmb3IgKHZpID0gdmVyc2lvbmluZm8tPnZhcjsgdmkgIT0gTlVMTDsgdmkgPSB2aS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqdmlkOwotICAgICAgdW5zaWduZWQgbG9uZyB2aWxlbjsKLQotICAgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0gICAgICB2aWQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqdmlkKTsKLSAgICAgIHZpZC0+bGVuZ3RoID0gNjsKLSAgICAgIHZpZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotICAgICAgbGVuZ3RoICs9IDY7Ci0gICAgICB2aWxlbiA9IDY7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgdmlkLT5kYXRhICsgMik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZpZC0+ZGF0YSArIDQpOwotCi0gICAgICAqcHAgPSB2aWQ7Ci0gICAgICBwcCA9ICZ2aWQtPm5leHQ7Ci0KLSAgICAgIHN3aXRjaCAodmktPnR5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgVkVSSU5GT19TVFJJTkc6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaG9sZCwgdnNsZW47Ci0JICAgIHN0cnVjdCBiaW5kYXRhICp2c2Q7Ci0JICAgIGNvbnN0IHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnM7Ci0KLQkgICAgKnBwID0gc3RyaW5nX3RvX3VuaWNvZGVfYmluICgiU3RyaW5nRmlsZUluZm8iLCBiaWdfZW5kaWFuKTsKLQkgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0JICAgIGhvbGQgPSBsZW5ndGg7Ci0JICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQkgICAgdmlsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQotCSAgICB2c2QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqdnNkKTsKLQkgICAgdnNkLT5sZW5ndGggPSA2OwotCSAgICB2c2QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLQkgICAgbGVuZ3RoICs9IDY7Ci0JICAgIHZpbGVuICs9IDY7Ci0JICAgIHZzbGVuID0gNjsKLQotCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZzZC0+ZGF0YSArIDIpOwotCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZzZC0+ZGF0YSArIDQpOwotCi0JICAgICpwcCA9IHZzZDsKLQkgICAgcHAgPSAmdnNkLT5uZXh0OwotCi0JICAgICpwcCA9IHVuaWNvZGVfdG9fYmluICh2aS0+dS5zdHJpbmcubGFuZ3VhZ2UsIGJpZ19lbmRpYW4pOwotCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdnNsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkgICAgZm9yICh2cyA9IHZpLT51LnN0cmluZy5zdHJpbmdzOyB2cyAhPSBOVUxMOyB2cyA9IHZzLT5uZXh0KQotCSAgICAgIHsKLQkJc3RydWN0IGJpbmRhdGEgKnZzc2Q7Ci0JCXVuc2lnbmVkIGxvbmcgdnNzbGVuOwotCi0JCWhvbGQgPSBsZW5ndGg7Ci0JCWR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQkJdmlsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQkJdnNsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQotCQl2c3NkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZzc2QpOwotCQl2c3NkLT5sZW5ndGggPSA2OwotCQl2c3NkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0JCWxlbmd0aCArPSA2OwotCQl2aWxlbiArPSA2OwotCQl2c2xlbiArPSA2OwotCQl2c3NsZW4gPSA2OwotCi0JCXB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgdnNzZC0+ZGF0YSArIDQpOwotCi0JCSpwcCA9IHZzc2Q7Ci0JCXBwID0gJnZzc2QtPm5leHQ7Ci0KLQkJKnBwID0gdW5pY29kZV90b19iaW4gKHZzLT5rZXksIGJpZ19lbmRpYW4pOwotCQlsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkJdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJdnNsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJdnNzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXBwID0gJigqcHApLT5uZXh0OwotCi0JCWhvbGQgPSBsZW5ndGg7Ci0JCWR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQkJdmlsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQkJdnNsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQkJdnNzbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkJKnBwID0gdW5pY29kZV90b19iaW4gKHZzLT52YWx1ZSwgYmlnX2VuZGlhbik7Ci0gCQlwdXRfMTYgKGJpZ19lbmRpYW4sICgqcHApLT5sZW5ndGggLyAyLCB2c3NkLT5kYXRhICsgMik7Ci0JCWxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCQl2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCQl2c2xlbiArPSAoKnBwKS0+bGVuZ3RoOwotCQl2c3NsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkJcHV0XzE2IChiaWdfZW5kaWFuLCB2c3NsZW4sIHZzc2QtPmRhdGEpOwotCSAgICAgIH0KLQotCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHZzbGVuLCB2c2QtPmRhdGEpOwotCi0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBWRVJJTkZPX1ZBUjoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBob2xkLCB2dmxlbiwgdnZ2bGVuOwotCSAgICBzdHJ1Y3QgYmluZGF0YSAqdnZkOwotCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2OwotCi0JICAgICpwcCA9IHN0cmluZ190b191bmljb2RlX2JpbiAoIlZhckZpbGVJbmZvIiwgYmlnX2VuZGlhbik7Ci0JICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICB2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotCSAgICBob2xkID0gbGVuZ3RoOwotCSAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JICAgIHZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkgICAgdnZkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZ2ZCk7Ci0JICAgIHZ2ZC0+bGVuZ3RoID0gNjsKLQkgICAgdnZkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0JICAgIGxlbmd0aCArPSA2OwotCSAgICB2aWxlbiArPSA2OwotCSAgICB2dmxlbiA9IDY7Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2dmQtPmRhdGEgKyA0KTsKLQotCSAgICAqcHAgPSB2dmQ7Ci0JICAgIHBwID0gJnZ2ZC0+bmV4dDsKLQotCSAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAodmktPnUudmFyLmtleSwgYmlnX2VuZGlhbik7Ci0JICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICB2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICB2dmxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotCSAgICBob2xkID0gbGVuZ3RoOwotCSAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JICAgIHZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JICAgIHZ2bGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkgICAgdnZ2bGVuID0gMDsKLQotCSAgICBmb3IgKHZ2ID0gdmktPnUudmFyLnZhcjsgdnYgIT0gTlVMTDsgdnYgPSB2di0+bmV4dCkKLQkgICAgICB7Ci0JCXN0cnVjdCBiaW5kYXRhICp2dnNkOwotCi0JCXZ2c2QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqdnZzZCk7Ci0JCXZ2c2QtPmxlbmd0aCA9IDQ7Ci0JCXZ2c2QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7Ci0KLQkJbGVuZ3RoICs9IDQ7Ci0JCXZpbGVuICs9IDQ7Ci0JCXZ2bGVuICs9IDQ7Ci0JCXZ2dmxlbiArPSA0OwotCi0JCXB1dF8xNiAoYmlnX2VuZGlhbiwgdnYtPmxhbmd1YWdlLCB2dnNkLT5kYXRhKTsKLQkJcHV0XzE2IChiaWdfZW5kaWFuLCB2di0+Y2hhcnNldCwgdnZzZC0+ZGF0YSArIDIpOwotCi0JCXZ2c2QtPm5leHQgPSBOVUxMOwotCQkqcHAgPSB2dnNkOwotCQlwcCA9ICZ2dnNkLT5uZXh0OwotCSAgICAgIH0KLQotCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHZ2bGVuLCB2dmQtPmRhdGEpOwotCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHZ2dmxlbiwgdnZkLT5kYXRhICsgMik7Ci0KLQkgICAgYnJlYWs7Ci0JICB9Ci0JfQotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHZpbGVuLCB2aWQtPmRhdGEpOwotICAgIH0KLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGxlbmd0aCwgZmlyc3QtPmRhdGEpOwotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIGdlbmVyaWMgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZ2VuZXJpYyAobGVuZ3RoLCBkYXRhKQotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bGVuZ3RoID0gbGVuZ3RoOwotICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YTsKLQotICBkLT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc2NvZmYuYyBiL2JpbnV0aWxzL3Jlc2NvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyNDg3YS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZXNjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODEgKzAsMCBAQAotLyogcmVzY29mZi5jIC0tIHJlYWQgYW5kIHdyaXRlIHJlc291cmNlcyBpbiBXaW5kb3dzIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbiB0aGF0IHJlYWQgYW5kIHdyaXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0gICBpbiBDT0ZGIGZpbGVzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vKiBJbiBvcmRlciB0byB1c2UgdGhlIGFkZHJlc3Mgb2YgYSByZXNvdXJjZSBkYXRhIGVudHJ5LCB3ZSBuZWVkIHRvCi0gICBnZXQgdGhlIGltYWdlIGJhc2Ugb2YgdGhlIGZpbGUuICBSaWdodCBub3cgd2UgZXh0cmFjdCBpdCBmcm9tCi0gICBpbnRlcm5hbCBCRkQgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBJbmZvcm1hdGlvbiB3ZSBleHRyYWN0IGZyb20gdGhlIGZpbGUuICAqLwotCi1zdHJ1Y3QgY29mZl9maWxlX2luZm8KLXsKLSAgLyogRmlsZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIERhdGEgcmVhZCBmcm9tIHRoZSBmaWxlLiAgKi8KLSAgY29uc3QgYmZkX2J5dGUgKmRhdGE7Ci0gIC8qIEVuZCBvZiBkYXRhIHJlYWQgZnJvbSBmaWxlLiAgKi8KLSAgY29uc3QgYmZkX2J5dGUgKmRhdGFfZW5kOwotICAvKiBBZGRyZXNzIG9mIHRoZSByZXNvdXJjZSBzZWN0aW9uIG1pbnVzIHRoZSBpbWFnZSBiYXNlIG9mIHRoZSBmaWxlLiAgKi8KLSAgYmZkX3ZtYSBzZWNhZGRyOwotICAvKiBOb24temVybyBpZiB0aGUgZmlsZSBpcyBiaWcgZW5kaWFuLiAgKi8KLSAgaW50IGJpZ19lbmRpYW47Ci19OwotCi0vKiBBIHJlc291cmNlIGRpcmVjdG9yeSB0YWJsZSBpbiBhIENPRkYgZmlsZS4gICovCi0KLXN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeQotewotICAvKiBDaGFyYWN0ZXJpc3RpY3MuICAqLwotICBiZmRfYnl0ZSBjaGFyYWN0ZXJpc3RpY3NbNF07Ci0gIC8qIFRpbWUgc3RhbXAuICAqLwotICBiZmRfYnl0ZSB0aW1lWzRdOwotICAvKiBNYWpvciB2ZXJzaW9uIG51bWJlci4gICovCi0gIGJmZF9ieXRlIG1ham9yWzJdOwotICAvKiBNaW5vciB2ZXJzaW9uIG51bWJlci4gICovCi0gIGJmZF9ieXRlIG1pbm9yWzJdOwotICAvKiBOdW1iZXIgb2YgbmFtZWQgZGlyZWN0b3J5IGVudHJpZXMuICAqLwotICBiZmRfYnl0ZSBuYW1lX2NvdW50WzJdOwotICAvKiBOdW1iZXIgb2YgZGlyZWN0b3J5IGVudHJpZXMgd2l0aCBJRHMuICAqLwotICBiZmRfYnl0ZSBpZF9jb3VudFsyXTsKLX07Ci0KLS8qIEEgcmVzb3VyY2UgZGlyZWN0b3J5IGVudHJ5IGluIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RydWN0IGV4dGVybl9yZXNfZW50cnkKLXsKLSAgLyogTmFtZSBvciBJRC4gICovCi0gIGJmZF9ieXRlIG5hbWVbNF07Ci0gIC8qIEFkZHJlc3Mgb2YgcmVzb3VyY2UgZW50cnkgb3Igc3ViZGlyZWN0b3J5LiAgKi8KLSAgYmZkX2J5dGUgcnZhWzRdOwotfTsKLQotLyogQSByZXNvdXJjZSBkYXRhIGVudHJ5IGluIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RydWN0IGV4dGVybl9yZXNfZGF0YQotewotICAvKiBBZGRyZXNzIG9mIHJlc291cmNlIGRhdGEuICBUaGlzIGlzIGFwcGFyZW50bHkgYSBmaWxlIHJlbGF0aXZlCi0gICAgIGFkZHJlc3MsIHJhdGhlciB0aGFuIGEgc2VjdGlvbiBvZmZzZXQuICAqLwotICBiZmRfYnl0ZSBydmFbNF07Ci0gIC8qIFNpemUgb2YgcmVzb3VyY2UgZGF0YS4gICovCi0gIGJmZF9ieXRlIHNpemVbNF07Ci0gIC8qIENvZGUgcGFnZS4gICovCi0gIGJmZF9ieXRlIGNvZGVwYWdlWzRdOwotICAvKiBSZXNlcnZlZC4gICovCi0gIGJmZF9ieXRlIHJlc2VydmVkWzRdOwotfTsKLQotLyogTWFjcm9zIHRvIHN3YXAgaW4gdmFsdWVzLiAgKi8KLQotI2RlZmluZSBnZXRmaV8xNihmaSwgcykgKChmaSktPmJpZ19lbmRpYW4gPyBiZmRfZ2V0YjE2IChzKSA6IGJmZF9nZXRsMTYgKHMpKQotI2RlZmluZSBnZXRmaV8zMihmaSwgcykgKChmaSktPmJpZ19lbmRpYW4gPyBiZmRfZ2V0YjMyIChzKSA6IGJmZF9nZXRsMzIgKHMpKQotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZCBvdmVycnVuIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVhZF9jb2ZmX3Jlc19kaXIKLSAgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKiwgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZWFkX2NvZmZfZGF0YV9lbnRyeQotICBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqLCBjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKLQwKLS8qIFJlYWQgdGhlIHJlc291cmNlcyBpbiBhIENPRkYgZmlsZS4gICovCi0KLXN0cnVjdCByZXNfZGlyZWN0b3J5ICoKLXJlYWRfY29mZl9yc3JjIChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKmFiZmQ7Ci0gIGNoYXIgKiptYXRjaGluZzsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgc3RydWN0IGNvZmZfZmlsZV9pbmZvIGZpbmZvOwotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZhdGFsIChfKCJmaWxlbmFtZSByZXF1aXJlZCBmb3IgQ09GRiBpbnB1dCIpKTsKLQotICBhYmZkID0gYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGZpbGVuYW1lKTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCWxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yc3JjIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogbm8gcmVzb3VyY2Ugc2VjdGlvblxuIiksIHByb2dyYW1fbmFtZSwKLQkgICAgICAgZmlsZW5hbWUpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKTsKLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSByZXNfYWxsb2MgKHNpemUpOwotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCAwLCBzaXplKSkKLSAgICBiZmRfZmF0YWwgKF8oImNhbid0IHJlYWQgcmVzb3VyY2Ugc2VjdGlvbiIpKTsKLQotICBmaW5mby5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBmaW5mby5kYXRhID0gZGF0YTsKLSAgZmluZm8uZGF0YV9lbmQgPSBkYXRhICsgc2l6ZTsKLSAgZmluZm8uc2VjYWRkciA9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCSAgIC0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpOwotICBmaW5mby5iaWdfZW5kaWFuID0gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOwotCi0gIGJmZF9jbG9zZSAoYWJmZCk7Ci0KLSAgLyogTm93IGp1c3QgcmVhZCBpbiB0aGUgdG9wIGxldmVsIHJlc291cmNlIGRpcmVjdG9yeS4gIE5vdGUgdGhhdCB3ZQotICAgICBkb24ndCBmcmVlIGRhdGEsIHNpbmNlIHdlIGNyZWF0ZSByZXNvdXJjZSBlbnRyaWVzIHRoYXQgcG9pbnQgaW50bwotICAgICBpdC4gIElmIHdlIGV2ZXIgd2FudCB0byBmcmVlIHVwIHRoZSByZXNvdXJjZSBpbmZvcm1hdGlvbiB3ZSByZWFkLAotICAgICB0aGlzIHdpbGwgaGF2ZSB0byBiZSBjbGVhbmVkIHVwLiAgKi8KLQotICByZXR1cm4gcmVhZF9jb2ZmX3Jlc19kaXIgKGRhdGEsICZmaW5mbywgKGNvbnN0IHN0cnVjdCByZXNfaWQgKikgTlVMTCwgMCk7Ci19Ci0KLS8qIEdpdmUgYW4gZXJyb3IgaWYgd2UgYXJlIG91dCBvZiBib3VuZHMuICAqLwotCi1zdGF0aWMgdm9pZAotb3ZlcnJ1biAoZmluZm8sIG1zZykKLSAgICAgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICpmaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBmYXRhbCAoXygiJXM6ICVzOiBhZGRyZXNzIG91dCBvZiBib3VuZHMiKSwgZmluZm8tPmZpbGVuYW1lLCBtc2cpOwotfQotCi0vKiBSZWFkIGEgcmVzb3VyY2UgZGlyZWN0b3J5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfZGlyZWN0b3J5ICoKLXJlYWRfY29mZl9yZXNfZGlyIChkYXRhLCBmaW5mbywgdHlwZSwgbGV2ZWwpCi0gICAgIGNvbnN0IGJmZF9ieXRlICpkYXRhOwotICAgICBjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKmZpbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBpbnQgbGV2ZWw7Ci17Ci0gIGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSAqZXJkOwotICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmQ7Ci0gIGludCBuYW1lX2NvdW50LCBpZF9jb3VudCwgaTsKLSAgc3RydWN0IHJlc19lbnRyeSAqKnBwOwotICBjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSAqZXJlOwotCi0gIGlmICgoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZGF0YSkgPCBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSkpCi0gICAgb3ZlcnJ1biAoZmluZm8sIF8oImRpcmVjdG9yeSIpKTsKLQotICBlcmQgPSAoY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5ICopIGRhdGE7Ci0KLSAgcmQgPSAoc3RydWN0IHJlc19kaXJlY3RvcnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJkKTsKLSAgcmQtPmNoYXJhY3RlcmlzdGljcyA9IGdldGZpXzMyIChmaW5mbywgZXJkLT5jaGFyYWN0ZXJpc3RpY3MpOwotICByZC0+dGltZSA9IGdldGZpXzMyIChmaW5mbywgZXJkLT50aW1lKTsKLSAgcmQtPm1ham9yID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcmQtPm1ham9yKTsKLSAgcmQtPm1pbm9yID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcmQtPm1pbm9yKTsKLSAgcmQtPmVudHJpZXMgPSBOVUxMOwotCi0gIG5hbWVfY291bnQgPSBnZXRmaV8xNiAoZmluZm8sIGVyZC0+bmFtZV9jb3VudCk7Ci0gIGlkX2NvdW50ID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcmQtPmlkX2NvdW50KTsKLQotICBwcCA9ICZyZC0+ZW50cmllczsKLQotICAvKiBUaGUgcmVzb3VyY2UgZGlyZWN0b3J5IGVudHJpZXMgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBkaXJlY3RvcnkKLSAgICAgdGFibGUuICAqLwotICBlcmUgPSAoY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKikgKGVyZCArIDEpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBuYW1lX2NvdW50OyBpKyssIGVyZSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZSwgcnZhOwotICAgICAgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0gICAgICBjb25zdCBiZmRfYnl0ZSAqZXJzOwotICAgICAgaW50IGxlbmd0aCwgajsKLQotICAgICAgaWYgKChjb25zdCBiZmRfYnl0ZSAqKSBlcmUgPj0gZmluZm8tPmRhdGFfZW5kKQotCW92ZXJydW4gKGZpbmZvLCBfKCJuYW1lZCBkaXJlY3RvcnkgZW50cnkiKSk7Ci0KLSAgICAgIG5hbWUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZS0+bmFtZSk7Ci0gICAgICBydmEgPSBnZXRmaV8zMiAoZmluZm8sIGVyZS0+cnZhKTsKLQotICAgICAgLyogRm9yIHNvbWUgcmVhc29uIHRoZSBoaWdoIGJpdCBpbiBOQU1FIGlzIHNldC4gICovCi0gICAgICBuYW1lICY9fiAweDgwMDAwMDAwOwotCi0gICAgICBpZiAobmFtZSA+IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0Jb3ZlcnJ1biAoZmluZm8sIF8oImRpcmVjdG9yeSBlbnRyeSBuYW1lIikpOwotCi0gICAgICBlcnMgPSBmaW5mby0+ZGF0YSArIG5hbWU7Ci0KLSAgICAgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKLSAgICAgIHJlLT5uZXh0ID0gTlVMTDsKLSAgICAgIHJlLT5pZC5uYW1lZCA9IDE7Ci0gICAgICBsZW5ndGggPSBnZXRmaV8xNiAoZmluZm8sIGVycyk7Ci0gICAgICByZS0+aWQudS5uLmxlbmd0aCA9IGxlbmd0aDsKLSAgICAgIHJlLT5pZC51Lm4ubmFtZSA9ICh1bmljaGFyICopIHJlc19hbGxvYyAobGVuZ3RoICogc2l6ZW9mICh1bmljaGFyKSk7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspCi0JcmUtPmlkLnUubi5uYW1lW2pdID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcnMgKyBqICogMiArIDIpOwotCi0gICAgICBpZiAobGV2ZWwgPT0gMCkKLQl0eXBlID0gJnJlLT5pZDsKLQotICAgICAgaWYgKChydmEgJiAweDgwMDAwMDAwKSAhPSAwKQotCXsKLQkgIHJ2YSAmPX4gMHg4MDAwMDAwMDsKLQkgIGlmIChydmEgPj0gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKLQkgICAgb3ZlcnJ1biAoZmluZm8sIF8oIm5hbWVkIHN1YmRpcmVjdG9yeSIpKTsKLQkgIHJlLT5zdWJkaXIgPSAxOwotCSAgcmUtPnUuZGlyID0gcmVhZF9jb2ZmX3Jlc19kaXIgKGZpbmZvLT5kYXRhICsgcnZhLCBmaW5mbywgdHlwZSwKLQkJCQkJIGxldmVsICsgMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChydmEgPj0gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKLQkgICAgb3ZlcnJ1biAoZmluZm8sIF8oIm5hbWVkIHJlc291cmNlIikpOwotCSAgcmUtPnN1YmRpciA9IDA7Ci0JICByZS0+dS5yZXMgPSByZWFkX2NvZmZfZGF0YV9lbnRyeSAoZmluZm8tPmRhdGEgKyBydmEsIGZpbmZvLCB0eXBlKTsKLQl9Ci0KLSAgICAgICpwcCA9IHJlOwotICAgICAgcHAgPSAmcmUtPm5leHQ7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBpZF9jb3VudDsgaSsrLCBlcmUrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG5hbWUsIHJ2YTsKLSAgICAgIHN0cnVjdCByZXNfZW50cnkgKnJlOwotCi0gICAgICBpZiAoKGNvbnN0IGJmZF9ieXRlICopIGVyZSA+PSBmaW5mby0+ZGF0YV9lbmQpCi0Jb3ZlcnJ1biAoZmluZm8sIF8oIklEIGRpcmVjdG9yeSBlbnRyeSIpKTsKLQotICAgICAgbmFtZSA9IGdldGZpXzMyIChmaW5mbywgZXJlLT5uYW1lKTsKLSAgICAgIHJ2YSA9IGdldGZpXzMyIChmaW5mbywgZXJlLT5ydmEpOwotCi0gICAgICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0gICAgICByZS0+bmV4dCA9IE5VTEw7Ci0gICAgICByZS0+aWQubmFtZWQgPSAwOwotICAgICAgcmUtPmlkLnUuaWQgPSBuYW1lOwotCi0gICAgICBpZiAobGV2ZWwgPT0gMCkKLQl0eXBlID0gJnJlLT5pZDsKLQotICAgICAgaWYgKChydmEgJiAweDgwMDAwMDAwKSAhPSAwKQotCXsKLQkgIHJ2YSAmPX4gMHg4MDAwMDAwMDsKLQkgIGlmIChydmEgPj0gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKLQkgICAgb3ZlcnJ1biAoZmluZm8sIF8oIklEIHN1YmRpcmVjdG9yeSIpKTsKLQkgIHJlLT5zdWJkaXIgPSAxOwotCSAgcmUtPnUuZGlyID0gcmVhZF9jb2ZmX3Jlc19kaXIgKGZpbmZvLT5kYXRhICsgcnZhLCBmaW5mbywgdHlwZSwKLQkJCQkJIGxldmVsICsgMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChydmEgPj0gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKLQkgICAgb3ZlcnJ1biAoZmluZm8sIF8oIklEIHJlc291cmNlIikpOwotCSAgcmUtPnN1YmRpciA9IDA7Ci0JICByZS0+dS5yZXMgPSByZWFkX2NvZmZfZGF0YV9lbnRyeSAoZmluZm8tPmRhdGEgKyBydmEsIGZpbmZvLCB0eXBlKTsKLQl9Ci0KLSAgICAgICpwcCA9IHJlOwotICAgICAgcHAgPSAmcmUtPm5leHQ7Ci0gICAgfQotCi0gIHJldHVybiByZDsKLX0KLQotLyogUmVhZCBhIHJlc291cmNlIGRhdGEgZW50cnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1yZWFkX2NvZmZfZGF0YV9lbnRyeSAoZGF0YSwgZmluZm8sIHR5cGUpCi0gICAgIGNvbnN0IGJmZF9ieXRlICpkYXRhOwotICAgICBjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKmZpbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotewotICBjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhICplcmQ7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcnZhOwotICBjb25zdCBiZmRfYnl0ZSAqcmVzZGF0YTsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIGZhdGFsIChfKCJyZXNvdXJjZSB0eXBlIHVua25vd24iKSk7Ci0KLSAgaWYgKChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBkYXRhKSA8IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGF0YSkpCi0gICAgb3ZlcnJ1biAoZmluZm8sIF8oImRhdGEgZW50cnkiKSk7Ci0KLSAgZXJkID0gKGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2RhdGEgKikgZGF0YTsKLQotICBzaXplID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPnNpemUpOwotICBydmEgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+cnZhKTsKLSAgaWYgKHJ2YSA8IGZpbmZvLT5zZWNhZGRyCi0gICAgICB8fCBydmEgLSBmaW5mby0+c2VjYWRkciA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJyZXNvdXJjZSBkYXRhIikpOwotCi0gIHJlc2RhdGEgPSBmaW5mby0+ZGF0YSArIChydmEgLSBmaW5mby0+c2VjYWRkcik7Ci0KLSAgaWYgKHNpemUgPiAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gcmVzZGF0YSkpCi0gICAgb3ZlcnJ1biAoZmluZm8sIF8oInJlc291cmNlIGRhdGEgc2l6ZSIpKTsKLQotICByID0gYmluX3RvX3JlcyAoKnR5cGUsIHJlc2RhdGEsIHNpemUsIGZpbmZvLT5iaWdfZW5kaWFuKTsKLQotICBtZW1zZXQgKCZyLT5yZXNfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0gIHItPmNvZmZfaW5mby5jb2RlcGFnZSA9IGdldGZpXzMyIChmaW5mbywgZXJkLT5jb2RlcGFnZSk7Ci0gIHItPmNvZmZfaW5mby5yZXNlcnZlZCA9IGdldGZpXzMyIChmaW5mbywgZXJkLT5yZXNlcnZlZCk7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0MCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGJ1aWxkIGEgbGlzdCBvZiBiaW5kYXRhIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgYmluZGF0YV9idWlsZAotewotICAvKiBUaGUgZGF0YS4gICovCi0gIHN0cnVjdCBiaW5kYXRhICpkOwotICAvKiBUaGUgbGFzdCBzdHJ1Y3R1cmUgd2UgaGF2ZSBhZGRlZCB0byB0aGUgbGlzdC4gICovCi0gIHN0cnVjdCBiaW5kYXRhICpsYXN0OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgbGlzdCBhcyBhIHdob2xlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiBpbmZvcm1hdGlvbiBhcyB3ZSBidWlsZCB0aGUgZGlyZWN0b3J5Ci0gICB0cmVlLiAgKi8KLQotc3RydWN0IGNvZmZfd3JpdGVfaW5mbwotewotICAvKiBUaGVzZSBmaWVsZHMgYXJlIGJhc2VkIG9uIHRoZSBCRkQuICAqLwotICAvKiBUaGUgQkZEIGl0c2VsZi4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogTm9uLXplcm8gaWYgdGhlIGZpbGUgaXMgYmlnIGVuZGlhbi4gICovCi0gIGludCBiaWdfZW5kaWFuOwotICAvKiBQb2ludGVyIHRvIHNlY3Rpb24gc3ltYm9sIHVzZWQgdG8gYnVpbGQgUlZBIHJlbG9jcy4gICovCi0gIGFzeW1ib2wgKipzeW1wcDsKLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGluaXRpYWxseSwgYW5kIHRoZW4gbm90IGNoYW5nZWQuICAqLwotICAvKiBMZW5ndGggb2YgZGlyZWN0b3J5IHRhYmxlcyBhbmQgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZGlyc2l6ZTsKLSAgLyogTGVuZ3RoIG9mIGRpcmVjdG9yeSBlbnRyeSBzdHJpbmdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkaXJzdHJzaXplOwotICAvKiBMZW5ndGggb2YgcmVzb3VyY2UgZGF0YSBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkYXRhZW50c2l6ZTsKLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVwZGF0ZWQgYXMgd2UgYWRkIGRhdGEuICAqLwotICAvKiBEaXJlY3RvcnkgdGFibGVzIGFuZCBlbnRyaWVzLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgZGlyczsKLSAgLyogRGlyZWN0b3J5IGVudHJ5IHN0cmluZ3MuICAqLwotICBzdHJ1Y3QgYmluZGF0YV9idWlsZCBkaXJzdHJzOwotICAvKiBSZXNvdXJjZSBkYXRhIGVudHJpZXMuICAqLwotICBzdHJ1Y3QgYmluZGF0YV9idWlsZCBkYXRhZW50czsKLSAgLyogQWN0dWFsIHJlc291cmNlIGRhdGEuICAqLwotICBzdHJ1Y3QgYmluZGF0YV9idWlsZCByZXNvdXJjZXM7Ci0gIC8qIFJlbG9jYXRpb25zLiAgKi8KLSAgYXJlbGVudCAqKnJlbG9jczsKLSAgLyogTnVtYmVyIG9mIHJlbG9jYXRpb25zLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlbG9jX2NvdW50OwotfTsKLQotLyogTWFjcm9zIHRvIHN3YXAgb3V0IHZhbHVlcy4gICovCi0KLSNkZWZpbmUgcHV0Y3dpXzE2KGN3aSwgdiwgcykgXAotICAoKGN3aS0+YmlnX2VuZGlhbikgPyBiZmRfcHV0YjE2ICgodiksIChzKSkgOiBiZmRfcHV0bDE2ICgodiksIChzKSkpCi0jZGVmaW5lIHB1dGN3aV8zMihjd2ksIHYsIHMpIFwKLSAgKChjd2ktPmJpZ19lbmRpYW4pID8gYmZkX3B1dGIzMiAoKHYpLCAocykpIDogYmZkX3B1dGwzMiAoKHYpLCAocykpKQotCi1zdGF0aWMgdm9pZCBjb2ZmX2Jpbl9zaXplcwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLCBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpjb2ZmX2FsbG9jIFBBUkFNUyAoKHN0cnVjdCBiaW5kYXRhX2J1aWxkICosIHNpemVfdCkpOwotc3RhdGljIHZvaWQgY29mZl90b19iaW4KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3Jlc190b19iaW4KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICopKTsKLQotLyogV3JpdGUgcmVzb3VyY2VzIHRvIGEgQ09GRiBmaWxlLiAgUkVTT1VSQ0VTIHNob3VsZCBhbHJlYWR5IGJlCi0gICBzb3J0ZWQuCi0KLSAgIFJpZ2h0IG5vdyB3ZSBhbHdheXMgY3JlYXRlIGEgbmV3IGZpbGUuICBTb21lZGF5IHdlIHNob3VsZCBhbHNvCi0gICBvZmZlciB0aGUgYWJpbGl0eSB0byBtZXJnZSByZXNvdXJjZXMgaW50byBhbiBleGlzdGluZyBmaWxlLiAgVGhpcwotICAgd291bGQgcmVxdWlyZSBkb2luZyB0aGUgYmFzaWMgd29yayBvZiBvYmpjb3B5LCBqdXN0IG1vZGlmeWluZyBvcgotICAgYWRkaW5nIHRoZSAucnNyYyBzZWN0aW9uLiAgKi8KLQotdm9pZAotd3JpdGVfY29mZl9maWxlIChmaWxlbmFtZSwgdGFyZ2V0LCByZXNvdXJjZXMpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXM7Ci17Ci0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyBjd2k7Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aCwgb2Zmc2V0OwotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZhdGFsIChfKCJmaWxlbmFtZSByZXF1aXJlZCBmb3IgQ09GRiBvdXRwdXQiKSk7Ci0KLSAgYWJmZCA9IGJmZF9vcGVudyAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfZm9ybWF0Iik7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfYXJtLCAwKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2FyY2hfbWFjaChhcm0pIik7Ci0jZWxzZQotICAvKiBGSVhNRTogVGhpcyBpcyBvYnZpb3VzbHkgaTM4NiBzcGVjaWZpYy4gICovCi0gIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9pMzg2LCAwKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2FyY2hfbWFjaChpMzg2KSIpOwotI2VuZGlmIC8qIGFybSAqLwotCi0gIGlmICghIGJmZF9zZXRfZmlsZV9mbGFncyAoYWJmZCwgSEFTX1NZTVMgfCBIQVNfUkVMT0MpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfZmlsZV9mbGFncyIpOwotCi0gIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnNyYyIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsICgiYmZkX21ha2Vfc2VjdGlvbiIpOwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLAotCQkJICAgICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DCi0JCQkJfCBTRUNfTE9BRCB8IFNFQ19EQVRBKSkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX2ZsYWdzIik7Ci0KLSAgaWYgKCEgYmZkX3NldF9zeW10YWIgKGFiZmQsIHNlYy0+c3ltYm9sX3B0cl9wdHIsIDEpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfc3ltdGFiIik7Ci0KLSAgLyogUmVxdWlyaW5nIHRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gQkZELiAgKi8KLSAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNlYzsKLQotICAvKiBUaGUgb3JkZXIgb2YgZGF0YSBpbiB0aGUgLnJzcmMgc2VjdGlvbiBpcwotICAgICAgIHJlc291cmNlIGRpcmVjdG9yeSB0YWJsZXMgYW5kIGVudHJpZXMKLSAgICAgICByZXNvdXJjZSBkaXJlY3Rvcnkgc3RyaW5ncwotICAgICAgIHJlc291cmNlIGRhdGEgZW50cmllcwotICAgICAgIGFjdHVhbCByZXNvdXJjZSBkYXRhCi0KLSAgICAgV2UgYnVpbGQgdGhlc2UgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgaW4gZGlmZmVyZW50IGxpc3RzLiAgKi8KLQotICBjd2kuYWJmZCA9IGFiZmQ7Ci0gIGN3aS5iaWdfZW5kaWFuID0gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOwotICBjd2kuc3ltcHAgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotICBjd2kuZGlyc2l6ZSA9IDA7Ci0gIGN3aS5kaXJzdHJzaXplID0gMDsKLSAgY3dpLmRhdGFlbnRzaXplID0gMDsKLSAgY3dpLmRpcnMuZCA9IE5VTEw7Ci0gIGN3aS5kaXJzLmxhc3QgPSBOVUxMOwotICBjd2kuZGlycy5sZW5ndGggPSAwOwotICBjd2kuZGlyc3Rycy5kID0gTlVMTDsKLSAgY3dpLmRpcnN0cnMubGFzdCA9IE5VTEw7Ci0gIGN3aS5kaXJzdHJzLmxlbmd0aCA9IDA7Ci0gIGN3aS5kYXRhZW50cy5kID0gTlVMTDsKLSAgY3dpLmRhdGFlbnRzLmxhc3QgPSBOVUxMOwotICBjd2kuZGF0YWVudHMubGVuZ3RoID0gMDsKLSAgY3dpLnJlc291cmNlcy5kID0gTlVMTDsKLSAgY3dpLnJlc291cmNlcy5sYXN0ID0gTlVMTDsKLSAgY3dpLnJlc291cmNlcy5sZW5ndGggPSAwOwotICBjd2kucmVsb2NzID0gTlVMTDsKLSAgY3dpLnJlbG9jX2NvdW50ID0gMDsKLQotICAvKiBXb3JrIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyaWVzLCBzbyB0aGF0IHdlCi0gICAgIGtub3cgdGhlIHZhcmlvdXMgb2Zmc2V0cyB3ZSB3aWxsIG5lZWQuICAqLwotICBjb2ZmX2Jpbl9zaXplcyAocmVzb3VyY2VzLCAmY3dpKTsKLQotICAvKiBGb3JjZSB0aGUgZGlyZWN0b3J5IHN0cmluZ3MgdG8gYmUgMzIgYml0IGFsaWduZWQuICBFdmVyeSBvdGhlcgotICAgICBzdHJ1Y3R1cmUgaXMgMzIgYml0IGFsaWduZWQgYW55aG93LiAgKi8KLSAgY3dpLmRpcnN0cnNpemUgPSAoY3dpLmRpcnN0cnNpemUgKyAzKSAmfiAzOwotCi0gIC8qIEFjdHVhbGx5IGNvbnZlcnQgdGhlIHJlc291cmNlcyB0byBiaW5hcnkuICAqLwotICBjb2ZmX3RvX2JpbiAocmVzb3VyY2VzLCAmY3dpKTsKLQotICAvKiBBZGQgYW5vdGhlciAyIGJ5dGVzIHRvIHRoZSBkaXJlY3Rvcnkgc3RyaW5ncyBpZiBuZWVkZWQgZm9yCi0gICAgIGFsaWdubWVudC4gICovCi0gIGlmICgoY3dpLmRpcnN0cnMubGVuZ3RoICYgMykgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpleDsKLQotICAgICAgZXggPSBjb2ZmX2FsbG9jICgmY3dpLmRpcnN0cnMsIDIpOwotICAgICAgZXhbMF0gPSAwOwotICAgICAgZXhbMV0gPSAwOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGF0YSB3ZSBidWlsdCBjYW1lIG91dCB0byB0aGUgc2FtZSBzaXplIGFzIHdlCi0gICAgIGNhbGN1bGF0ZWQgaW5pdGlhbGx5LiAgKi8KLSAgYXNzZXJ0IChjd2kuZGlycy5sZW5ndGggPT0gY3dpLmRpcnNpemUpOwotICBhc3NlcnQgKGN3aS5kaXJzdHJzLmxlbmd0aCA9PSBjd2kuZGlyc3Ryc2l6ZSk7Ci0gIGFzc2VydCAoY3dpLmRhdGFlbnRzLmxlbmd0aCA9PSBjd2kuZGF0YWVudHNpemUpOwotCi0gIGxlbmd0aCA9IChjd2kuZGlyc2l6ZQotCSAgICArIGN3aS5kaXJzdHJzaXplCi0JICAgICsgY3dpLmRhdGFlbnRzaXplCi0JICAgICsgY3dpLnJlc291cmNlcy5sZW5ndGgpOwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMsIGxlbmd0aCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX3NpemUiKTsKLQotICBiZmRfc2V0X3JlbG9jIChhYmZkLCBzZWMsIGN3aS5yZWxvY3MsIGN3aS5yZWxvY19jb3VudCk7Ci0KLSAgb2Zmc2V0ID0gMDsKLSAgZm9yIChkID0gY3dpLmRpcnMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQotCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKLSAgICB9Ci0gIGZvciAoZCA9IGN3aS5kaXJzdHJzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKLQliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7Ci0gICAgfQotICBmb3IgKGQgPSBjd2kuZGF0YWVudHMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQotCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKLSAgICB9Ci0gIGZvciAoZCA9IGN3aS5yZXNvdXJjZXMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQotCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKLSAgICB9Ci0KLSAgYXNzZXJ0IChvZmZzZXQgPT0gbGVuZ3RoKTsKLQotICBpZiAoISBiZmRfY2xvc2UgKGFiZmQpKQotICAgIGJmZF9mYXRhbCAoImJmZF9jbG9zZSIpOwotCi0gIC8qIFdlIGFsbG9jYXRlZCB0aGUgcmVsb2NzIGFycmF5IHVzaW5nIG1hbGxvYy4gICovCi0gIGZyZWUgKGN3aS5yZWxvY3MpOwotfQotCi0vKiBXb3JrIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZml4ZWQgc2l6ZSByZXNvdXJjZSBkaXJlY3RvcnkKLSAgIGVudHJpZXMuICBUaGlzIHVwZGF0ZXMgZmllbGRzIGluIENXSS4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX2Jpbl9zaXplcyAocmVzZGlyLCBjd2kpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNkaXI7Ci0gICAgIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKmN3aTsKLXsKLSAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0KLSAgY3dpLT5kaXJzaXplICs9IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5KTsKLQotICBmb3IgKHJlID0gcmVzZGlyLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgIHsKLSAgICAgIGN3aS0+ZGlyc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5KTsKLQotICAgICAgaWYgKHJlLT5pZC5uYW1lZCkKLQljd2ktPmRpcnN0cnNpemUgKz0gcmUtPmlkLnUubi5sZW5ndGggKiAyICsgMjsKLQotICAgICAgaWYgKHJlLT5zdWJkaXIpCi0JY29mZl9iaW5fc2l6ZXMgKHJlLT51LmRpciwgY3dpKTsKLSAgICAgIGVsc2UKLQljd2ktPmRhdGFlbnRzaXplICs9IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGF0YSk7Ci0gICAgfQotfQotCi0vKiBBbGxvY2F0ZSBkYXRhIGZvciBhIHBhcnRpY3VsYXIgbGlzdC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLWNvZmZfYWxsb2MgKGJiLCBzaXplKQotICAgICBzdHJ1Y3QgYmluZGF0YV9idWlsZCAqYmI7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCi0gIGQtPm5leHQgPSBOVUxMOwotICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKHNpemUpOwotICBkLT5sZW5ndGggPSBzaXplOwotCi0gIGlmIChiYi0+ZCA9PSBOVUxMKQotICAgIGJiLT5kID0gZDsKLSAgZWxzZQotICAgIGJiLT5sYXN0LT5uZXh0ID0gZDsKLSAgYmItPmxhc3QgPSBkOwotICBiYi0+bGVuZ3RoICs9IHNpemU7Ci0KLSAgcmV0dXJuIGQtPmRhdGE7Ci19Ci0KLS8qIENvbnZlcnQgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBSRVNESVIgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfdG9fYmluIChyZXNkaXIsIGN3aSkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLSAgICAgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqY3dpOwotewotICBzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKmVyZDsKLSAgaW50IGNpLCBjbjsKLSAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqZTsKLSAgc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKmVyZTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRpcmVjdG9yeSB0YWJsZS4gICovCi0KLSAgZXJkID0gKChzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKikKLQkgY29mZl9hbGxvYyAoJmN3aS0+ZGlycywgc2l6ZW9mICgqZXJkKSkpOwotCi0gIHB1dGN3aV8zMiAoY3dpLCByZXNkaXItPmNoYXJhY3RlcmlzdGljcywgZXJkLT5jaGFyYWN0ZXJpc3RpY3MpOwotICBwdXRjd2lfMzIgKGN3aSwgcmVzZGlyLT50aW1lLCBlcmQtPnRpbWUpOwotICBwdXRjd2lfMTYgKGN3aSwgcmVzZGlyLT5tYWpvciwgZXJkLT5tYWpvcik7Ci0gIHB1dGN3aV8xNiAoY3dpLCByZXNkaXItPm1pbm9yLCBlcmQtPm1pbm9yKTsKLQotICBjaSA9IDA7Ci0gIGNuID0gMDsKLSAgZm9yIChlID0gcmVzZGlyLT5lbnRyaWVzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChlLT5pZC5uYW1lZCkKLQkrK2NuOwotICAgICAgZWxzZQotCSsrY2k7Ci0gICAgfQotCi0gIHB1dGN3aV8xNiAoY3dpLCBjbiwgZXJkLT5uYW1lX2NvdW50KTsKLSAgcHV0Y3dpXzE2IChjd2ksIGNpLCBlcmQtPmlkX2NvdW50KTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRhdGEgZW50cmllcy4gIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBzcGFjZSBmb3IgYWxsCi0gICAgIHRoZSBlbnRyaWVzIGJlZm9yZSB3cml0aW5nIHRoZW0gb3V0LiAgVGhhdCBwZXJtaXRzIGEgcmVjdXJzaXZlCi0gICAgIGNhbGwgdG8gd29yayBjb3JyZWN0bHkgd2hlbiB3cml0aW5nIG91dCBzdWJkaXJlY3Rvcmllcy4gICovCi0KLSAgZXJlID0gKChzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSAqKQotCSBjb2ZmX2FsbG9jICgmY3dpLT5kaXJzLCAoY2kgKyBjbikgKiBzaXplb2YgKCplcmUpKSk7Ci0gIGZvciAoZSA9IHJlc2Rpci0+ZW50cmllczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCwgZXJlKyspCi0gICAgewotICAgICAgaWYgKCEgZS0+aWQubmFtZWQpCi0JcHV0Y3dpXzMyIChjd2ksIGUtPmlkLnUuaWQsIGVyZS0+bmFtZSk7Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgY2hhciAqc3RyOwotCSAgaW50IGk7Ci0KLQkgIC8qIEZvciBzb21lIHJlYXNvbiBleGlzdGluZyBmaWxlcyBzZWVtIHRvIGhhdmUgdGhlIGhpZ2ggYml0Ci0gICAgICAgICAgICAgc2V0IG9uIHRoZSBhZGRyZXNzIG9mIHRoZSBuYW1lLCBhbHRob3VnaCB0aGF0IGlzIG5vdAotICAgICAgICAgICAgIGRvY3VtZW50ZWQuICAqLwotCSAgcHV0Y3dpXzMyIChjd2ksCi0JCSAgICAgMHg4MDAwMDAwMCB8IChjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnMubGVuZ3RoKSwKLQkJICAgICBlcmUtPm5hbWUpOwotCi0JICBzdHIgPSBjb2ZmX2FsbG9jICgmY3dpLT5kaXJzdHJzLCBlLT5pZC51Lm4ubGVuZ3RoICogMiArIDIpOwotCSAgcHV0Y3dpXzE2IChjd2ksIGUtPmlkLnUubi5sZW5ndGgsIHN0cik7Ci0JICBmb3IgKGkgPSAwOyBpIDwgZS0+aWQudS5uLmxlbmd0aDsgaSsrKQotCSAgICBwdXRjd2lfMTYgKGN3aSwgZS0+aWQudS5uLm5hbWVbaV0sIHN0ciArIGkgKiAyICsgMik7Ci0JfQotCi0gICAgICBpZiAoZS0+c3ViZGlyKQotCXsKLQkgIHB1dGN3aV8zMiAoY3dpLCAweDgwMDAwMDAwIHwgY3dpLT5kaXJzLmxlbmd0aCwgZXJlLT5ydmEpOwotCSAgY29mZl90b19iaW4gKGUtPnUuZGlyLCBjd2kpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwdXRjd2lfMzIgKGN3aSwKLQkJICAgICBjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnNpemUgKyBjd2ktPmRhdGFlbnRzLmxlbmd0aCwKLQkJICAgICBlcmUtPnJ2YSk7Ci0KLQkgIGNvZmZfcmVzX3RvX2JpbiAoZS0+dS5yZXMsIGN3aSk7Ci0JfQotICAgIH0KLX0KLQotLyogQ29udmVydCB0aGUgcmVzb3VyY2UgUkVTIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3Jlc190b19iaW4gKHJlcywgY3dpKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKmN3aTsKLXsKLSAgYXJlbGVudCAqcjsKLSAgc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqZXJkOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uLCBhbHRob3VnaCBldmVyeSBvdGhlciBhZGRyZXNzIGlzIGEgc2VjdGlvbgotICAgICBvZmZzZXQsIHRoZSBhZGRyZXNzIG9mIHRoZSByZXNvdXJjZSBkYXRhIGl0c2VsZiBpcyBhbiBSVkEuICBUaGF0Ci0gICAgIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIHJlbG9jYXRpb24gZm9yIGl0LiAgV2UgYWxsb2NhdGUKLSAgICAgdGhlIHJlbG9jcyBhcnJheSB1c2luZyBtYWxsb2Mgc28gdGhhdCB3ZSBjYW4gdXNlIHJlYWxsb2MuICBGSVhNRToKLSAgICAgVGhpcyByZWxvY2F0aW9uIGhhbmRsaW5nIGlzIGNvcnJlY3QgZm9yIHRoZSBpMzg2LCBidXQgcHJvYmFibHkKLSAgICAgbm90IGZvciBhbnkgb3RoZXIgdGFyZ2V0LiAgKi8KLQotICByID0gKGFyZWxlbnQgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByLT5zeW1fcHRyX3B0ciA9IGN3aS0+c3ltcHA7Ci0gIHItPmFkZHJlc3MgPSBjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnNpemUgKyBjd2ktPmRhdGFlbnRzLmxlbmd0aDsKLSAgci0+YWRkZW5kID0gMDsKLSAgci0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGN3aS0+YWJmZCwgQkZEX1JFTE9DX1JWQSk7Ci0gIGlmIChyLT5ob3d0byA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoXygiY2FuJ3QgZ2V0IEJGRF9SRUxPQ19SVkEgcmVsb2NhdGlvbiB0eXBlIikpOwotCi0gIGN3aS0+cmVsb2NzID0geHJlYWxsb2MgKGN3aS0+cmVsb2NzLAotCQkJICAoY3dpLT5yZWxvY19jb3VudCArIDIpICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgY3dpLT5yZWxvY3NbY3dpLT5yZWxvY19jb3VudF0gPSByOwotICBjd2ktPnJlbG9jc1tjd2ktPnJlbG9jX2NvdW50ICsgMV0gPSBOVUxMOwotICArK2N3aS0+cmVsb2NfY291bnQ7Ci0KLSAgZXJkID0gKHN0cnVjdCBleHRlcm5fcmVzX2RhdGEgKikgY29mZl9hbGxvYyAoJmN3aS0+ZGF0YWVudHMsIHNpemVvZiAoKmVyZCkpOwotCi0gIHB1dGN3aV8zMiAoY3dpLAotCSAgICAgKGN3aS0+ZGlyc2l6ZQotCSAgICAgICsgY3dpLT5kaXJzdHJzaXplCi0JICAgICAgKyBjd2ktPmRhdGFlbnRzaXplCi0JICAgICAgKyBjd2ktPnJlc291cmNlcy5sZW5ndGgpLAotCSAgICAgZXJkLT5ydmEpOwotICBwdXRjd2lfMzIgKGN3aSwgcmVzLT5jb2ZmX2luZm8uY29kZXBhZ2UsIGVyZC0+Y29kZXBhZ2UpOwotICBwdXRjd2lfMzIgKGN3aSwgcmVzLT5jb2ZmX2luZm8ucmVzZXJ2ZWQsIGVyZC0+cmVzZXJ2ZWQpOwotCi0gIGQgPSByZXNfdG9fYmluIChyZXMsIGN3aS0+YmlnX2VuZGlhbik7Ci0KLSAgaWYgKGN3aS0+cmVzb3VyY2VzLmQgPT0gTlVMTCkKLSAgICBjd2ktPnJlc291cmNlcy5kID0gZDsKLSAgZWxzZQotICAgIGN3aS0+cmVzb3VyY2VzLmxhc3QtPm5leHQgPSBkOwotCi0gIGxlbmd0aCA9IDA7Ci0gIGZvciAoOyBkLT5uZXh0ICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotICAgIGxlbmd0aCArPSBkLT5sZW5ndGg7Ci0gIGxlbmd0aCArPSBkLT5sZW5ndGg7Ci0gIGN3aS0+cmVzb3VyY2VzLmxhc3QgPSBkOwotICBjd2ktPnJlc291cmNlcy5sZW5ndGggKz0gbGVuZ3RoOwotCi0gIHB1dGN3aV8zMiAoY3dpLCBsZW5ndGgsIGVyZC0+c2l6ZSk7Ci0KLSAgLyogRm9yY2UgdGhlIG5leHQgcmVzb3VyY2UgdG8gaGF2ZSAzMiBiaXQgYWxpZ25tZW50LiAgKi8KLQotICBpZiAoKGxlbmd0aCAmIDMpICE9IDApCi0gICAgewotICAgICAgaW50IGFkZDsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmV4OwotCi0gICAgICBhZGQgPSA0IC0gKGxlbmd0aCAmIDMpOwotCi0gICAgICBleCA9IGNvZmZfYWxsb2MgKCZjd2ktPnJlc291cmNlcywgYWRkKTsKLSAgICAgIG1lbXNldCAoZXgsIDAsIGFkZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmVzcmMuYyBiL2JpbnV0aWxzL3Jlc3JjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDZhNWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MTYgKzAsMCBAQAotLyogcmVzcmMuYyAtLSByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJjIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgcmVhZCBhbmQgd3JpdGUgV2luZG93cyByYyBmaWxlcy4KLSAgIFRoZXNlIGFyZSB0ZXh0IGZpbGVzIHRoYXQgcmVwcmVzZW50IHJlc291cmNlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2RlZmluZSBwb3BlbiBfcG9wZW4KLSNkZWZpbmUgcGNsb3NlIF9wY2xvc2UKLSNlbmRpZgotCi0vKiBUaGUgZGVmYXVsdCBwcmVwcm9jZXNzb3IuICAqLwotCi0jZGVmaW5lIERFRkFVTFRfUFJFUFJPQ0VTU09SICJnY2MgLUUgLXhjLWhlYWRlciAtRFJDX0lOVk9LRUQiCi0KLS8qIFdlIHJlYWQgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGluIGEgY3Vyc29yIG9yIGljb24gZmlsZSBpbnRvCi0gICBpbnN0YW5jZXMgb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgaWNvbmRpcgotewotICAvKiBXaWR0aCBvZiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgd2lkdGg7Ci0gIC8qIEhlaWdodCBvZiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgaGVpZ2h0OwotICAvKiBOdW1iZXIgb2YgY29sb3JzIGluIGltYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBjb2xvcmNvdW50OwotICB1bmlvbgotICB7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogQ29sb3IgcGxhbmVzLiAgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IHBsYW5lczsKLSAgICAgIC8qIEJpdHMgcGVyIHBpeGVsLiAgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IGJpdHM7Ci0gICAgfSBpY29uOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIFggY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IHhob3RzcG90OwotICAgICAgLyogWSBjb29yZGluYXRlIG9mIGhvdHNwb3QuICAqLwotICAgICAgdW5zaWduZWQgc2hvcnQgeWhvdHNwb3Q7Ci0gICAgfSBjdXJzb3I7Ci0gIH0gdTsKLSAgLyogQnl0ZXMgaW4gaW1hZ2UuICAqLwotICB1bnNpZ25lZCBsb25nIGJ5dGVzOwotICAvKiBGaWxlIG9mZnNldCBvZiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotfTsKLQotLyogVGhlIG5hbWUgb2YgdGhlIHJjIGZpbGUgd2UgYXJlIHJlYWRpbmcuICAqLwotCi1jaGFyICpyY19maWxlbmFtZTsKLQotLyogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSByYyBmaWxlLiAgKi8KLQotaW50IHJjX2xpbmVubzsKLQotLyogVGhlIHBpcGUgd2UgYXJlIHJlYWRpbmcgZnJvbSwgc28gdGhhdCB3ZSBjYW4gY2xvc2UgaXQgaWYgd2UgZXhpdC4gICovCi0KLXN0YXRpYyBGSUxFICpjcHBfcGlwZTsKLQotLyogQXMgd2UgcmVhZCB0aGUgcmMgZmlsZSwgd2UgYXR0YWNoIGluZm9ybWF0aW9uIHRvIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXM7Ci0KLS8qIFRoZSBudW1iZXIgb2YgY3Vyc29yIHJlc291cmNlcyB3ZSBoYXZlIHdyaXR0ZW4gb3V0LiAgKi8KLQotc3RhdGljIGludCBjdXJzb3JzOwotCi0vKiBUaGUgbnVtYmVyIG9mIGZvbnQgcmVzb3VyY2VzIHdlIGhhdmUgd3JpdHRlbiBvdXQuICAqLwotCi1zdGF0aWMgaW50IGZvbnRzOwotCi0vKiBGb250IGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBmb250ZGlyICpmb250ZGlyczsKLQotLyogUmVzb3VyY2UgaW5mbyB0byB1c2UgZm9yIGZvbnRkaXJzLiAgKi8KLQotc3RydWN0IHJlc19yZXNfaW5mbyBmb250ZGlyc19yZXNpbmZvOwotCi0vKiBUaGUgbnVtYmVyIG9mIGljb24gcmVzb3VyY2VzIHdlIGhhdmUgd3JpdHRlbiBvdXQuICAqLwotCi1zdGF0aWMgaW50IGljb25zOwotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgRklMRSAqbG9va19mb3JfZGVmYXVsdCBQQVJBTVMgKChjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAotCQkJCSAgICAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgY2xvc2VfcGlwZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB1bmV4cGVjdGVkX2VvZiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgZ2V0X3dvcmQgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9sb25nIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBnZXRfZGF0YQotICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkZWZpbmVfZm9udGRpcnMgUEFSQU1TICgodm9pZCkpOwotDAotLyogbG9vayBmb3IgdGhlIHByZXByb2Nlc3NvciBwcm9ncmFtICovCi0KLXN0YXRpYyBGSUxFICoKLWxvb2tfZm9yX2RlZmF1bHQgKGNtZCwgcHJlZml4LCBlbmRfcHJlZml4LCBwcmVwcm9jYXJncywgZmlsZW5hbWUpCi0gICAgIGNoYXIgKmNtZDsKLSAgICAgY29uc3QgY2hhciAqcHJlZml4OwotICAgICBpbnQgZW5kX3ByZWZpeDsKLSAgICAgY29uc3QgY2hhciAqcHJlcHJvY2FyZ3M7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBjaGFyICpzcGFjZTsKLSAgaW50IGZvdW5kOwotICBzdHJ1Y3Qgc3RhdCBzOwotCi0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCArIGVuZF9wcmVmaXgsICIlcyIsIERFRkFVTFRfUFJFUFJPQ0VTU09SKTsKLSAgc3BhY2UgPSBzdHJjaHIgKGNtZCArIGVuZF9wcmVmaXgsICcgJyk7Ci0gIGlmIChzcGFjZSkKLSAgICAqc3BhY2UgPSAwOwotCi0gIGlmIChzdHJjaHIgKGNtZCwgJy8nKSkKLSAgICB7Ci0gICAgICBmb3VuZCA9IChzdGF0IChjbWQsICZzKSA9PSAwCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotCSAgICAgICB8fCBzdGF0IChzdHJjYXQgKGNtZCwgRVhFQ1VUQUJMRV9TVUZGSVgpLCAmcykgPT0gMAotI2VuZGlmCi0JICAgICAgICk7Ci0KLSAgICAgIGlmICghIGZvdW5kKQotCXsKLQkgIGlmICh2ZXJib3NlKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJUcmllZCBgJXMnXG4iLCBjbWQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICBzdHJjcHkgKGNtZCwgcHJlZml4KTsKLQotICBzcHJpbnRmIChjbWQgKyBlbmRfcHJlZml4LCAiJXMgJXMgJXMiLAotCSAgIERFRkFVTFRfUFJFUFJPQ0VTU09SLCBwcmVwcm9jYXJncywgZmlsZW5hbWUpOwotCi0gIGlmICh2ZXJib3NlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIlVzaW5nIGAlcydcbiIsIGNtZCk7Ci0KLSAgY3BwX3BpcGUgPSBwb3BlbiAoY21kLCBGT1BFTl9SVCk7Ci0gIHJldHVybiBjcHBfcGlwZTsKLX0KLQotLyogUmVhZCBhbiByYyBmaWxlLiAgKi8KLQotc3RydWN0IHJlc19kaXJlY3RvcnkgKgotcmVhZF9yY19maWxlIChmaWxlbmFtZSwgcHJlcHJvY2Vzc29yLCBwcmVwcm9jYXJncywgbGFuZ3VhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICpwcmVwcm9jZXNzb3I7Ci0gICAgIGNvbnN0IGNoYXIgKnByZXByb2NhcmdzOwotICAgICBpbnQgbGFuZ3VhZ2U7Ci17Ci0gIGNoYXIgKmNtZDsKLQotICBpZiAocHJlcHJvY2FyZ3MgPT0gTlVMTCkKLSAgICBwcmVwcm9jYXJncyA9ICIiOwotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9ICItIjsKLQotICBpZiAocHJlcHJvY2Vzc29yKQotICAgIHsKLSAgICAgIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2Vzc29yKQotCQkgICAgICsgc3RybGVuIChwcmVwcm9jYXJncykKLQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCSAgICAgKyAxMCk7Ci0gICAgICBzcHJpbnRmIChjbWQsICIlcyAlcyAlcyIsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsIGZpbGVuYW1lKTsKLQotICAgICAgY3BwX3BpcGUgPSBwb3BlbiAoY21kLCBGT1BFTl9SVCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZGFzaCwgKnNsYXNoLCAqY3A7Ci0KLSAgICAgIHByZXByb2Nlc3NvciA9IERFRkFVTFRfUFJFUFJPQ0VTU09SOwotCi0gICAgICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByb2dyYW1fbmFtZSkKLQkJICAgICArIHN0cmxlbiAocHJlcHJvY2Vzc29yKQotCQkgICAgICsgc3RybGVuIChwcmVwcm9jYXJncykKLQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotCQkgICAgICsgc3RybGVuIChFWEVDVVRBQkxFX1NVRkZJWCkKLSNlbmRpZgotCQkgICAgICsgMTApOwotCi0KLSAgICAgIGRhc2ggPSBzbGFzaCA9IDA7Ci0gICAgICBmb3IgKGNwID0gcHJvZ3JhbV9uYW1lOyAqY3A7IGNwKyspCi0JewotCSAgaWYgKCpjcCA9PSAnLScpCi0JICAgIGRhc2ggPSBjcDsKLQkgIGlmICgKLSNpZiBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0JICAgICAgKmNwID09ICc6JyB8fCAqY3AgPT0gJ1xcJyB8fAotI2VuZGlmCi0JICAgICAgKmNwID09ICcvJykKLQkgICAgewotCSAgICAgIHNsYXNoID0gY3A7Ci0JICAgICAgZGFzaCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGNwcF9waXBlID0gMDsKLQotICAgICAgaWYgKGRhc2gpCi0JewotCSAgLyogRmlyc3QsIHRyeSBsb29raW5nIGZvciBhIHByZWZpeGVkIGdjYyBpbiB0aGUgd2luZHJlcwotCSAgICAgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIHByZWZpeCBhcyB3aW5kcmVzICovCi0KLQkgIGNwcF9waXBlID0gbG9va19mb3JfZGVmYXVsdCAoY21kLCBwcm9ncmFtX25hbWUsIGRhc2gtcHJvZ3JhbV9uYW1lKzEsCi0JCQkJICAgICAgIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICBpZiAoc2xhc2ggJiYgIWNwcF9waXBlKQotCXsKLQkgIC8qIE5leHQsIHRyeSBsb29raW5nIGZvciBhIGdjYyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMKLSAgICAgICAgICAgICB0aGF0IHdpbmRyZXMgKi8KLQotCSAgY3BwX3BpcGUgPSBsb29rX2Zvcl9kZWZhdWx0IChjbWQsIHByb2dyYW1fbmFtZSwgc2xhc2gtcHJvZ3JhbV9uYW1lKzEsCi0JCQkJICAgICAgIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICBpZiAoIWNwcF9waXBlKQotCXsKLQkgIC8qIFNpZ2gsIHRyeSB0aGUgZGVmYXVsdCAqLwotCi0JICBjcHBfcGlwZSA9IGxvb2tfZm9yX2RlZmF1bHQgKGNtZCwgIiIsIDAsIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgfQotICBpZiAoY3BwX3BpcGUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygiY2FuJ3QgcG9wZW4gYCVzJzogJXMiKSwgY21kLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgZnJlZSAoY21kKTsKLQotICB4YXRleGl0IChjbG9zZV9waXBlKTsKLQotICByY19maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgcmNfbGluZW5vID0gMTsKLSAgaWYgKGxhbmd1YWdlICE9IC0xKQotICAgIHJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5ndWFnZSk7Ci0gIHl5aW4gPSBjcHBfcGlwZTsKLSAgeXlwYXJzZSAoKTsKLQotICBpZiAocGNsb3NlIChjcHBfcGlwZSkgIT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBwcmVwcm9jZXNzb3IgZmFpbGVkXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgY3BwX3BpcGUgPSBOVUxMOwotCi0gIGlmIChmb250ZGlycyAhPSBOVUxMKQotICAgIGRlZmluZV9mb250ZGlycyAoKTsKLQotICBmcmVlIChyY19maWxlbmFtZSk7Ci0gIHJjX2ZpbGVuYW1lID0gTlVMTDsKLQotICByZXR1cm4gcmVzb3VyY2VzOwotfQotCi0vKiBDbG9zZSB0aGUgcGlwZSBpZiBpdCBpcyBvcGVuLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHhhdGV4aXQuICAqLwotCi12b2lkCi1jbG9zZV9waXBlICgpCi17Ci0gIGlmIChjcHBfcGlwZSAhPSBOVUxMKQotICAgIHBjbG9zZSAoY3BwX3BpcGUpOwotfQotCi0vKiBSZXBvcnQgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyBhbiByYyBmaWxlLiAgKi8KLQotdm9pZAoteXllcnJvciAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsICgiJXM6JWQ6ICVzIiwgcmNfZmlsZW5hbWUsIHJjX2xpbmVubywgbXNnKTsKLX0KLQotLyogSXNzdWUgYSB3YXJuaW5nIHdoaWxlIHJlYWRpbmcgYW4gcmMgZmlsZS4gICovCi0KLXZvaWQKLXJjcGFyc2Vfd2FybmluZyAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgcmNfZmlsZW5hbWUsIHJjX2xpbmVubywgbXNnKTsKLX0KLQotLyogRGllIGlmIHdlIGdldCBhbiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXVuZXhwZWN0ZWRfZW9mIChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgZmF0YWwgKF8oIiVzOiB1bmV4cGVjdGVkIEVPRiIpLCBtc2cpOwotfQotCi0vKiBSZWFkIGEgMTYgYml0IHdvcmQgZnJvbSBhIGZpbGUuICBUaGUgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGxpdHRsZQotICAgZW5kaWFuLiAgKi8KLQotc3RhdGljIGludAotZ2V0X3dvcmQgKGUsIG1zZykKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBpbnQgYjEsIGIyOwotCi0gIGIxID0gZ2V0YyAoZSk7Ci0gIGIyID0gZ2V0YyAoZSk7Ci0gIGlmIChmZW9mIChlKSkKLSAgICB1bmV4cGVjdGVkX2VvZiAobXNnKTsKLSAgcmV0dXJuICgoYjIgJiAweGZmKSA8PCA4KSB8IChiMSAmIDB4ZmYpOwotfQotCi0vKiBSZWFkIGEgMzIgYml0IHdvcmQgZnJvbSBhIGZpbGUuICBUaGUgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGxpdHRsZQotICAgZW5kaWFuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldF9sb25nIChlLCBtc2cpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IGIxLCBiMiwgYjMsIGI0OwotCi0gIGIxID0gZ2V0YyAoZSk7Ci0gIGIyID0gZ2V0YyAoZSk7Ci0gIGIzID0gZ2V0YyAoZSk7Ci0gIGI0ID0gZ2V0YyAoZSk7Ci0gIGlmIChmZW9mIChlKSkKLSAgICB1bmV4cGVjdGVkX2VvZiAobXNnKTsKLSAgcmV0dXJuICgoKCgoKChiNCAmIDB4ZmYpIDw8IDgpCi0JICAgICAgfCAoYjMgJiAweGZmKSkgPDwgOCkKLQkgICAgfCAoYjIgJiAweGZmKSkgPDwgOCkKLQkgIHwgKGIxICYgMHhmZikpOwotfQotCi0vKiBSZWFkIGRhdGEgZnJvbSBhIGZpbGUuICBUaGlzIGlzIGEgd3JhcHBlciB0byBkbyBlcnJvciBjaGVja2luZy4gICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfZGF0YSAoZSwgcCwgYywgbXNnKQotICAgICBGSUxFICplOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBsb25nIGM7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgdW5zaWduZWQgbG9uZyBnb3Q7Ci0KLSAgZ290ID0gZnJlYWQgKHAsIDEsIGMsIGUpOwotICBpZiAoZ290ID09IGMpCi0gICAgcmV0dXJuOwotCi0gIGZhdGFsIChfKCIlczogcmVhZCBvZiAlbHUgcmV0dXJuZWQgJWx1IiksIG1zZywgYywgZ290KTsKLX0KLQwKLS8qIERlZmluZSBhbiBhY2NlbGVyYXRvciByZXNvdXJjZS4gICovCi0KLXZvaWQKLWRlZmluZV9hY2NlbGVyYXRvciAoaWQsIHJlc2luZm8sIGRhdGEpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqZGF0YTsKLXsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9BQ0NFTEVSQVRPUiwgaWQsCi0JCQkJcmVzaW5mby0+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+dS5zdHJpbmcubGVuZ3RoOyBpKyspCi0JICAgICAgewotCQlpZiAoaXNwcmludCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICBwdXRjICgqcywgZSk7Ci0JCWVsc2UKLQkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgKnMpOwotCSAgICAgIH0KLQkgICAgZnByaW50ZiAoZSwgIlwiIik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBSQ0RBVEFfV1NUUklORzoKLQkgIGZwcmludGYgKGUsICJMXCIiKTsKLQkgIHVuaWNvZGVfcHJpbnQgKGUsIHJpLT51LndzdHJpbmcudywgcmktPnUud3N0cmluZy5sZW5ndGgpOwotCSAgZnByaW50ZiAoZSwgIlwiIik7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX0JVRkZFUjoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpOwotCSAgICBpbnQgZmlyc3Q7Ci0KLQkgICAgLyogQXNzdW1lIGxpdHRsZSBlbmRpYW4gZGF0YS4gICovCi0KLQkgICAgZmlyc3QgPSAxOwotCSAgICBmb3IgKGkgPSAwOyBpICsgMyA8IHJpLT51LmJ1ZmZlci5sZW5ndGg7IGkgKz0gNCkKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGxvbmcgbDsKLQkJaW50IGo7Ci0KLQkJaWYgKCEgZmlyc3QpCi0JCSAgaW5kZW50IChlLCBpbmQgKyAyKTsKLQkJbCA9ICgoKCgoKHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAzXSA8PCA4KQotCQkJIHwgcmktPnUuYnVmZmVyLmRhdGFbaSArIDJdKSA8PCA4KQotCQkgICAgICAgfCByaS0+dS5idWZmZXIuZGF0YVtpICsgMV0pIDw8IDgpCi0JCSAgICAgfCByaS0+dS5idWZmZXIuZGF0YVtpXSk7Ci0JCWZwcmludGYgKGUsICIlbHVMIiwgbCk7Ci0JCWlmIChpICsgNCA8IHJpLT51LmJ1ZmZlci5sZW5ndGggfHwgcmktPm5leHQgIT0gTlVMTCkKLQkJICBmcHJpbnRmIChlLCAiLCIpOwotCQlmb3IgKGogPSAwOyBqIDwgNDsgKytqKQotCQkgIGlmICghIGlzcHJpbnQgKHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSkKLQkJICAgICAgJiYgcmktPnUuYnVmZmVyLmRhdGFbaSArIGpdICE9IDApCi0JCSAgICBicmVhazsKLQkJaWYgKGogPj0gNCkKLQkJICB7Ci0JCSAgICBmcHJpbnRmIChlLCAiXHQvLyAiKTsKLQkJICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opCi0JCSAgICAgIHsKLQkJCWlmICghIGlzcHJpbnQgKHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSkpCi0JCQkgIGZwcmludGYgKGUsICJcXCUwM28iLCByaS0+dS5idWZmZXIuZGF0YVtpICsgal0pOwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaWYgKHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSA9PSAnXFwnKQotCQkJICAgICAgZnByaW50ZiAoZSwgIlxcIik7Ci0JCQkgICAgZnByaW50ZiAoZSwgIiVjIiwgcmktPnUuYnVmZmVyLmRhdGFbaSArIGpdKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQlmcHJpbnRmIChlLCAiXG4iKTsKLQkJZmlyc3QgPSAwOwotCSAgICAgIH0KLQotCSAgICBpZiAoaSArIDEgPCByaS0+dS5idWZmZXIubGVuZ3RoKQotCSAgICAgIHsKLQkJaW50IHM7Ci0JCWludCBqOwotCi0JCWlmICghIGZpcnN0KQotCQkgIGluZGVudCAoZSwgaW5kICsgMik7Ci0JCXMgPSAocmktPnUuYnVmZmVyLmRhdGFbaSArIDFdIDw8IDgpIHwgcmktPnUuYnVmZmVyLmRhdGFbaV07Ci0JCWZwcmludGYgKGUsICIlZCIsIHMpOwotCQlpZiAoaSArIDIgPCByaS0+dS5idWZmZXIubGVuZ3RoIHx8IHJpLT5uZXh0ICE9IE5VTEwpCi0JCSAgZnByaW50ZiAoZSwgIiwiKTsKLQkJZm9yIChqID0gMDsgaiA8IDI7ICsraikKLQkJICBpZiAoISBpc3ByaW50IChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0pCi0JCSAgICAgICYmIHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JCWlmIChqID49IDIpCi0JCSAgewotCQkgICAgZnByaW50ZiAoZSwgIlx0Ly8gIik7Ci0JCSAgICBmb3IgKGogPSAwOyBqIDwgMjsgKytqKQotCQkgICAgICB7Ci0JCQlpZiAoISBpc3ByaW50IChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0pKQotCQkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgcmktPnUuYnVmZmVyLmRhdGFbaSArIGpdKTsKLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGlmIChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0gPT0gJ1xcJykKLQkJCSAgICAgIGZwcmludGYgKGUsICJcXCIpOwotCQkJICAgIGZwcmludGYgKGUsICIlYyIsIHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLQkJZnByaW50ZiAoZSwgIlxuIik7Ci0JCWkgKz0gMjsKLQkJZmlyc3QgPSAwOwotCSAgICAgIH0KLQotCSAgICBpZiAoaSA8IHJpLT51LmJ1ZmZlci5sZW5ndGgpCi0JICAgICAgewotCQlpZiAoISBmaXJzdCkKLQkJICBpbmRlbnQgKGUsIGluZCArIDIpOwotCQlpZiAoKHJpLT51LmJ1ZmZlci5kYXRhW2ldICYgMHg3ZikgPT0gcmktPnUuYnVmZmVyLmRhdGFbaV0KLQkJICAgICYmIGlzcHJpbnQgKHJpLT51LmJ1ZmZlci5kYXRhW2ldKSkKLQkJICBmcHJpbnRmIChlLCAiXCIlY1wiIiwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZSwgIlwiXFwlMDNvXCIiLCByaS0+dS5idWZmZXIuZGF0YVtpXSk7Ci0JCWlmIChyaS0+bmV4dCAhPSBOVUxMKQotCQkgIGZwcmludGYgKGUsICIsIik7Ci0JCWZwcmludGYgKGUsICJcbiIpOwotCQlmaXJzdCA9IDA7Ci0JICAgICAgfQotCi0JICAgIGJyZWFrOwotCSAgfQotCX0KLQotICAgICAgaWYgKHJpLT50eXBlICE9IFJDREFUQV9CVUZGRVIpCi0JewotCSAgaWYgKHJpLT5uZXh0ICE9IE5VTEwpCi0JICAgIGZwcmludGYgKGUsICIsIik7Ci0JICBmcHJpbnRmIChlLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIGluZGVudCAoZSwgaW5kKTsKLSAgZnByaW50ZiAoZSwgIkVORFxuIik7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cmluZ3RhYmxlIHJlc291cmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3N0cmluZ3RhYmxlIChlLCBuYW1lLCBzdHJpbmd0YWJsZSkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHN0cmluZ3RhYmxlICpzdHJpbmd0YWJsZTsKLXsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gIGludCBpOwotCi0gIGlmIChuYW1lICE9IE5VTEwgJiYgISBuYW1lLT5uYW1lZCkKLSAgICBvZmZzZXQgPSAobmFtZS0+dS5pZCAtIDEpIDw8IDQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gJXMgc3RyaW5nIHRhYmxlIG5hbWVcbiIsCi0JICAgICAgIG5hbWUgPT0gTlVMTCA/ICJNaXNzaW5nIiA6ICJJbnZhbGlkIik7Ci0gICAgICBvZmZzZXQgPSAwOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5sZW5ndGggIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChlLCAiICAlbHUsIFwiIiwgb2Zmc2V0ICsgaSk7Ci0JICB1bmljb2RlX3ByaW50IChlLCBzdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5zdHJpbmcsCi0JCQkgc3RyaW5ndGFibGUtPnN0cmluZ3NbaV0ubGVuZ3RoKTsKLQkgIGZwcmludGYgKGUsICJcIlxuIik7Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGEgdmVyc2lvbmluZm8gcmVzb3VyY2UuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfdmVyc2lvbmluZm8gKGUsIHZlcnNpb25pbmZvKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmY7Ci0gIGNvbnN0IHN0cnVjdCB2ZXJfaW5mbyAqdmk7Ci0KLSAgZiA9IHZlcnNpb25pbmZvLT5maXhlZDsKLSAgaWYgKGYtPmZpbGVfdmVyc2lvbl9tcyAhPSAwIHx8IGYtPmZpbGVfdmVyc2lvbl9scyAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRVZFUlNJT04gJWx1LCAlbHUsICVsdSwgJWx1XG4iLAotCSAgICAgKGYtPmZpbGVfdmVyc2lvbl9tcyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5maWxlX3ZlcnNpb25fbXMgJiAweGZmZmYsCi0JICAgICAoZi0+ZmlsZV92ZXJzaW9uX2xzID4+IDE2KSAmIDB4ZmZmZiwKLQkgICAgIGYtPmZpbGVfdmVyc2lvbl9scyAmIDB4ZmZmZik7Ci0gIGlmIChmLT5wcm9kdWN0X3ZlcnNpb25fbXMgIT0gMCB8fCBmLT5wcm9kdWN0X3ZlcnNpb25fbHMgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIFBST0RVQ1RWRVJTSU9OICVsdSwgJWx1LCAlbHUsICVsdVxuIiwKLQkgICAgIChmLT5wcm9kdWN0X3ZlcnNpb25fbXMgPj4gMTYpICYgMHhmZmZmLAotCSAgICAgZi0+cHJvZHVjdF92ZXJzaW9uX21zICYgMHhmZmZmLAotCSAgICAgKGYtPnByb2R1Y3RfdmVyc2lvbl9scyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5wcm9kdWN0X3ZlcnNpb25fbHMgJiAweGZmZmYpOwotICBpZiAoZi0+ZmlsZV9mbGFnc19tYXNrICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFRkxBR1NNQVNLIDB4JWx4XG4iLCBmLT5maWxlX2ZsYWdzX21hc2spOwotICBpZiAoZi0+ZmlsZV9mbGFncyAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRUZMQUdTIDB4JWx4XG4iLCBmLT5maWxlX2ZsYWdzKTsKLSAgaWYgKGYtPmZpbGVfb3MgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVPUyAweCVseFxuIiwgZi0+ZmlsZV9vcyk7Ci0gIGlmIChmLT5maWxlX3R5cGUgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVUWVBFIDB4JWx4XG4iLCBmLT5maWxlX3R5cGUpOwotICBpZiAoZi0+ZmlsZV9zdWJ0eXBlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFU1VCVFlQRSAweCVseFxuIiwgZi0+ZmlsZV9zdWJ0eXBlKTsKLSAgaWYgKGYtPmZpbGVfZGF0ZV9tcyAhPSAwIHx8IGYtPmZpbGVfZGF0ZV9scyAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBEYXRlOiAlbHUsICVsdVxuIiwgZi0+ZmlsZV9kYXRlX21zLCBmLT5maWxlX2RhdGVfbHMpOwotCi0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0KLSAgZm9yICh2aSA9IHZlcnNpb25pbmZvLT52YXI7IHZpICE9IE5VTEw7IHZpID0gdmktPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoICh2aS0+dHlwZSkKLQl7Ci0JY2FzZSBWRVJJTkZPX1NUUklORzoKLQkgIHsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2czsKLQotCSAgICBmcHJpbnRmIChlLCAiICBCTE9DSyBcIlN0cmluZ0ZpbGVJbmZvXCJcbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICBCRUdJTlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgICAgQkxPQ0sgXCIiKTsKLQkgICAgdW5pY29kZV9wcmludCAoZSwgdmktPnUuc3RyaW5nLmxhbmd1YWdlLCAtMSk7Ci0JICAgIGZwcmludGYgKGUsICJcIlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgICAgQkVHSU5cbiIpOwotCi0JICAgIGZvciAodnMgPSB2aS0+dS5zdHJpbmcuc3RyaW5nczsgdnMgIT0gTlVMTDsgdnMgPSB2cy0+bmV4dCkKLQkgICAgICB7Ci0JCWZwcmludGYgKGUsICIgICAgICBWQUxVRSBcIiIpOwotCQl1bmljb2RlX3ByaW50IChlLCB2cy0+a2V5LCAtMSk7Ci0JCWZwcmludGYgKGUsICJcIiwgXCIiKTsKLQkJdW5pY29kZV9wcmludCAoZSwgdnMtPnZhbHVlLCAtMSk7Ci0JCWZwcmludGYgKGUsICJcIlxuIik7Ci0JICAgICAgfQotCi0JICAgIGZwcmludGYgKGUsICIgICAgRU5EXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgRU5EXG4iKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIFZFUklORk9fVkFSOgotCSAgewotCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2OwotCi0JICAgIGZwcmludGYgKGUsICIgIEJMT0NLIFwiVmFyRmlsZUluZm9cIlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgIEJFR0lOXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgICBWQUxVRSBcIiIpOwotCSAgICB1bmljb2RlX3ByaW50IChlLCB2aS0+dS52YXIua2V5LCAtMSk7Ci0JICAgIGZwcmludGYgKGUsICJcIiIpOwotCi0JICAgIGZvciAodnYgPSB2aS0+dS52YXIudmFyOyB2diAhPSBOVUxMOyB2diA9IHZ2LT5uZXh0KQotCSAgICAgIGZwcmludGYgKGUsICIsIDB4JXgsICVkIiwgKHVuc2lnbmVkIGludCkgdnYtPmxhbmd1YWdlLAotCQkgICAgICAgdnYtPmNoYXJzZXQpOwotCi0JICAgIGZwcmludGYgKGUsICJcbiAgRU5EXG4iKTsKLQotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgZGF0YSB3aGljaCB3b3VsZCBub3JtYWxseSBiZSByZWFkIGZyb20gYSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2ZpbGVkYXRhIChlLCBsZW5ndGgsIGRhdGEpCi0gICAgIEZJTEUgKmU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotewotICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgZm9yIChpID0gMDsgaSArIDE1IDwgbGVuZ3RoOyBpICs9IDE2KQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyAlNGx4OiAiLCBpKTsKLSAgICAgIGZwcmludGYgKGUsICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIiwKLQkgICAgICAgZGF0YVtpICsgMF0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSwgZGF0YVtpICsgM10sCi0JICAgICAgIGRhdGFbaSArIDRdLCBkYXRhW2kgKyA1XSwgZGF0YVtpICsgNl0sIGRhdGFbaSArIDddKTsKLSAgICAgIGZwcmludGYgKGUsICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JICAgICAgIGRhdGFbaSArICA4XSwgZGF0YVtpICsgIDldLCBkYXRhW2kgKyAxMF0sIGRhdGFbaSArIDExXSwKLQkgICAgICAgZGF0YVtpICsgMTJdLCBkYXRhW2kgKyAxM10sIGRhdGFbaSArIDE0XSwgZGF0YVtpICsgMTVdKTsKLSAgICB9Ci0KLSAgaWYgKGkgPCBsZW5ndGgpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vICU0bHg6IiwgaSk7Ci0gICAgICB3aGlsZSAoaSA8IGxlbmd0aCkKLQl7Ci0JICBmcHJpbnRmIChlLCAiICUwMngiLCBkYXRhW2ldKTsKLQkgICsraTsKLQl9Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZXNyZXMuYyBiL2JpbnV0aWxzL3Jlc3Jlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTg2MGViLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Jlc3Jlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLS8qIHJlc3Jlcy5jOiByZWFkX3Jlc19maWxlIGFuZCB3cml0ZV9yZXNfZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3Igd2luZHJlcy4KLSAgIENvcHlyaWdodCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBBbmRlcnMgTm9ybGFuZGVyIDxhbm9ybGFuZEBoZW0yLnBhc3NhZ2VuLnNlPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRklYTUU6IFRoaXMgZmlsZSBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBpbiBhIGNyb3NzIGNvbmZpZ3VyYXRpb24uCi0gICBJdCBhc3N1bWVzIHRoYXQgaXQgY2FuIHVzZSBmcmVhZCBhbmQgZndyaXRlIHRvIHJlYWQgYW5kIHdyaXRlCi0gICBpbnRlZ2Vycy4gIEl0IGRvZXMgbm8gc3dhcHBpbmcuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1zdHJ1Y3QgcmVzX2hkcgotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBkYXRhX3NpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBoZWFkZXJfc2l6ZTsKLSAgfTsKLQotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2RpcmVjdG9yeQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGludCAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19yZXNvdXJjZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19pZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19pbmZvIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2RhdGEgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2hlYWRlcgotICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICopKTsKLQotc3RhdGljIGludCByZWFkX3Jlc291cmNlX2VudHJ5IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHJlYWRfcmVzX2RhdGEgUEFSQU1TICgodm9pZCAqLCBzaXplX3QsIGludCkpOwotc3RhdGljIHZvaWQgcmVhZF9yZXNfaWQgUEFSQU1TICgoc3RydWN0IHJlc19pZCAqKSk7Ci1zdGF0aWMgdW5pY2hhciAqcmVhZF91bmlzdHJpbmcgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyB2b2lkIHNraXBfbnVsbF9yZXNvdXJjZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9pZF9zaXplIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfaWQgKikpOwotc3RhdGljIHZvaWQgcmVzX2FsaWduX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotICByZXNfYWRkX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50LCBpbnQpKTsKLQotdm9pZAotICByZXNfYXBwZW5kX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqLCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosCi0JICAgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOwotCi1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlcyA9IE5VTEw7Ci0KLXN0YXRpYyBGSUxFICpmcmVzOwotc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBSZWFkIHJlc291cmNlIGZpbGUgKi8KLXN0cnVjdCByZXNfZGlyZWN0b3J5ICoKLXJlYWRfcmVzX2ZpbGUgKGZuKQotICAgICBjb25zdCBjaGFyICpmbjsKLXsKLSAgZmlsZW5hbWUgPSBmbjsKLSAgZnJlcyA9IGZvcGVuIChmaWxlbmFtZSwgInJiIik7Ci0gIGlmIChmcmVzID09IE5VTEwpCi0gICAgZmF0YWwgKCJjYW4ndCBvcGVuIGAlcycgZm9yIG91dHB1dDogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgc2tpcF9udWxsX3Jlc291cmNlICgpOwotCi0gIHdoaWxlIChyZWFkX3Jlc291cmNlX2VudHJ5ICgpKQotICAgIDsKLQotICBmY2xvc2UgKGZyZXMpOwotCi0gIHJldHVybiByZXNvdXJjZXM7Ci19Ci0KLS8qIFdyaXRlIHJlc291cmNlIGZpbGUgKi8KLXZvaWQKLXdyaXRlX3Jlc19maWxlIChmbiwgcmVzZGlyKQotICAgICBjb25zdCBjaGFyICpmbjsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLXsKLSAgaW50IGxhbmd1YWdlOwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaWduW10gPQotICB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gIGxvbmcgZnBvczsKLQotICBmaWxlbmFtZSA9IGZuOwotCi0gIGZyZXMgPSBmb3BlbiAoZmlsZW5hbWUsICJ3YiIpOwotICBpZiAoZnJlcyA9PSBOVUxMKQotICAgIGZhdGFsICgiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIC8qIFdyaXRlIDMyIGJpdCByZXNvdXJjZSBzaWduYXR1cmUgKi8KLSAgd3JpdGVfcmVzX2RhdGEgKHNpZ24sIHNpemVvZiAoc2lnbiksIDEpOwotCi0gIC8qIHdyaXRlIHJlc291cmNlcyAqLwotCi0gIGxhbmd1YWdlID0gLTE7Ci0gIHdyaXRlX3Jlc19kaXJlY3RvcnkgKHJlc2RpciwgKGNvbnN0IHN0cnVjdCByZXNfaWQgKikgTlVMTCwKLQkJICAgICAgIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsICZsYW5ndWFnZSwgMSk7Ci0KLSAgLyogZW5kIGZpbGUgb24gRFdPUkQgYm91bmRhcnkgKi8KLSAgZnBvcyA9IGZ0ZWxsIChmcmVzKTsKLSAgaWYgKGZwb3MgJSA0KQotICAgIHdyaXRlX3Jlc19kYXRhIChzaWduLCBmcG9zICUgNCwgMSk7Ci0KLSAgZmNsb3NlIChmcmVzKTsKLX0KLQotLyogUmVhZCBhIHJlc291cmNlIGVudHJ5LCByZXR1cm5zIDAgd2hlbiBhbGwgcmVzb3VyY2VzIGFyZSByZWFkICovCi1zdGF0aWMgaW50Ci1yZWFkX3Jlc291cmNlX2VudHJ5ICh2b2lkKQotewotICBzdHJ1Y3QgcmVzX2lkIHR5cGU7Ci0gIHN0cnVjdCByZXNfaWQgbmFtZTsKLSAgc3RydWN0IHJlc19yZXNfaW5mbyByZXNpbmZvOwotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHI7Ci0gIGxvbmcgdmVyc2lvbjsKLSAgdm9pZCAqYnVmZjsKLQotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIC8qIFJlYWQgaGVhZGVyICovCi0gIGlmIChmcmVhZCAoJnJlc2hkciwgc2l6ZW9mIChyZXNoZHIpLCAxLCBmcmVzKSAhPSAxKQotICAgIHJldHVybiAwOwotCi0gIC8qIHJlYWQgcmVzb3VyY2UgdHlwZSAqLwotICByZWFkX3Jlc19pZCAoJnR5cGUpOwotICAvKiByZWFkIHJlc291cmNlIGlkICovCi0gIHJlYWRfcmVzX2lkICgmbmFtZSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0KLSAgLyogUmVhZCBhZGRpdGlvbmFsIHJlc291cmNlIGhlYWRlciAqLwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby52ZXJzaW9uLCBzaXplb2YgKHJlc2luZm8udmVyc2lvbiksIDEpOwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5tZW1mbGFncywgc2l6ZW9mIChyZXNpbmZvLm1lbWZsYWdzKSwgMSk7Ci0gIHJlYWRfcmVzX2RhdGEgKCZyZXNpbmZvLmxhbmd1YWdlLCBzaXplb2YgKHJlc2luZm8ubGFuZ3VhZ2UpLCAxKTsKLSAgcmVhZF9yZXNfZGF0YSAoJnZlcnNpb24sIHNpemVvZiAodmVyc2lvbiksIDEpOwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5jaGFyYWN0ZXJpc3RpY3MsIHNpemVvZiAocmVzaW5mby5jaGFyYWN0ZXJpc3RpY3MpLCAxKTsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLQotICAvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIGRhdGEgKi8KLSAgYnVmZiA9IHJlc19hbGxvYyAocmVzaGRyLmRhdGFfc2l6ZSk7Ci0gIC8qIFJlYWQgZGF0YSAqLwotICByZWFkX3Jlc19kYXRhIChidWZmLCByZXNoZHIuZGF0YV9zaXplLCAxKTsKLSAgLyogQ29udmVydCBiaW5hcnkgZGF0YSB0byByZXNvdXJjZSAqLwotICByID0gYmluX3RvX3JlcyAodHlwZSwgYnVmZiwgcmVzaGRyLmRhdGFfc2l6ZSwgMCk7Ci0gIHItPnJlc19pbmZvID0gcmVzaW5mbzsKLSAgLyogQWRkIHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeSAqLwotICByZXNfYWRkX3Jlc291cmNlIChyLCAmdHlwZSwgJm5hbWUsIHJlc2luZm8ubGFuZ3VhZ2UsIDApOwotCi0gIHJldHVybiAxOwotfQotCi0vKiB3cml0ZSByZXNvdXJjZSBkaXJlY3RvcnkgdG8gYmluYXJ5IHJlc291cmNlIGZpbGUgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfZGlyZWN0b3J5IChyZCwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci0gICAgIGludCBsZXZlbDsKLXsKLSAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0KLSAgZm9yIChyZSA9IHJkLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAobGV2ZWwpCi0JewotCWNhc2UgMToKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDEsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUKLQkgICAgIHR5cGUuICBUaGlzIG5vcm1hbGx5IGR1cGxpY2F0ZXMgdGhlIGluZm9ybWF0aW9uIHdlIGhhdmUKLQkgICAgIHN0b3JlZCB3aXRoIHRoZSByZXNvdXJjZSBpdHNlbGYsIGJ1dCB3ZSBuZWVkIHRvIHJlbWVtYmVyCi0JICAgICB0aGUgdHlwZSBpZiB0aGlzIGlzIGEgdXNlciBkZWZpbmUgcmVzb3VyY2UgdHlwZS4gICovCi0JICB0eXBlID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAyOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMiwgdGhlIGtleSBvZiB0aGlzIHJlc291cmNlIGlzIHRoZSBuYW1lCi0JICAgICB3ZSBhcmUgZ29pbmcgdG8gdXNlIGluIHRoZSByYyBwcmludG91dC4gKi8KLQkgIG5hbWUgPSAmcmUtPmlkOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAzLCB0aGVuIHRoaXMga2V5IHJlcHJlc2VudHMgYSBsYW5ndWFnZS4KLQkgICAgIFVzZSBpdCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLwotCSAgaWYgKCFyZS0+aWQubmFtZWQKLQkgICAgICAmJiByZS0+aWQudS5pZCAhPSAodW5zaWduZWQgbG9uZykgKmxhbmd1YWdlCi0JICAgICAgJiYgKHJlLT5pZC51LmlkICYgMHhmZmZmKSA9PSByZS0+aWQudS5pZCkKLQkgICAgewotCSAgICAgICpsYW5ndWFnZSA9IHJlLT5pZC51LmlkOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChyZS0+c3ViZGlyKQotCXdyaXRlX3Jlc19kaXJlY3RvcnkgKHJlLT51LmRpciwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsICsgMSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGxldmVsID09IDMpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBub3JtYWwgY2FzZTogdGhlIHRocmVlIGxldmVscyBhcmUKLQkgICAgICAgICBUWVBFL05BTUUvTEFOR1VBR0UuICBOQU1FIHdpbGwgaGF2ZSBiZWVuIHNldCBhdCBsZXZlbAotCSAgICAgICAgIDIsIGFuZCByZXByZXNlbnRzIHRoZSBuYW1lIHRvIHVzZS4gIFdlIHByb2JhYmx5IGp1c3QKLQkgICAgICAgICBzZXQgTEFOR1VBR0UsIGFuZCBpdCB3aWxsIHByb2JhYmx5IG1hdGNoIHdoYXQgdGhlCi0JICAgICAgICAgcmVzb3VyY2UgaXRzZWxmIHJlY29yZHMgaWYgYW55dGhpbmcuICAqLwotCSAgICAgIHdyaXRlX3Jlc19yZXNvdXJjZSAodHlwZSwgbmFtZSwgcmUtPnUucmVzLCBsYW5ndWFnZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIi8vIFJlc291cmNlIGF0IHVuZXhwZWN0ZWQgbGV2ZWwgJWRcbiIsIGxldmVsKTsKLQkgICAgICB3cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIChzdHJ1Y3QgcmVzX2lkICopIE5VTEwsIHJlLT51LnJlcywKLQkJCQkgIGxhbmd1YWdlKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19yZXNvdXJjZSAodHlwZSwgbmFtZSwgcmVzLCBsYW5ndWFnZSkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBpbnQgKmxhbmd1YWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBydDsKLQotICBzd2l0Y2ggKHJlcy0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHJ0ID0gUlRfQUNDRUxFUkFUT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQklUTUFQOgotICAgICAgcnQgPSBSVF9CSVRNQVA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgotICAgICAgcnQgPSBSVF9DVVJTT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfQ1VSU09SOgotICAgICAgcnQgPSBSVF9HUk9VUF9DVVJTT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgotICAgICAgcnQgPSBSVF9ESUFMT0c7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVDoKLSAgICAgIHJ0ID0gUlRfRk9OVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9GT05URElSOgotICAgICAgcnQgPSBSVF9GT05URElSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0lDT046Ci0gICAgICBydCA9IFJUX0lDT047Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfSUNPTjoKLSAgICAgIHJ0ID0gUlRfR1JPVVBfSUNPTjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9NRU5VOgotICAgICAgcnQgPSBSVF9NRU5VOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHJ0ID0gUlRfTUVTU0FHRVRBQkxFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKLSAgICAgIHJ0ID0gUlRfUkNEQVRBOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotICAgICAgcnQgPSBSVF9TVFJJTkc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICBydCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICBydCA9IFJUX1ZFUlNJT047Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJ0ICE9IDAKLSAgICAgICYmIHR5cGUgIT0gTlVMTAotICAgICAgJiYgKHR5cGUtPm5hbWVkIHx8IHR5cGUtPnUuaWQgIT0gKHVuc2lnbmVkIGxvbmcpIHJ0KSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIvLyBVbmV4cGVjdGVkIHJlc291cmNlIHR5cGUgbWlzbWF0Y2g6ICIpOwotICAgICAgcmVzX2lkX3ByaW50IChzdGRlcnIsICp0eXBlLCAxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAhPSAlZCIsIHJ0KTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICB3cml0ZV9yZXNfYmluIChyZXMsIHR5cGUsIG5hbWUsICZyZXMtPnJlc19pbmZvKTsKLSAgcmV0dXJuOwotfQotCi0vKiBXcml0ZSBhIHJlc291cmNlIGluIGJpbmFyeSByZXNvdXJjZSBmb3JtYXQgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfYmluIChyZXMsIHR5cGUsIG5hbWUsIHJlc2luZm8pCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLXsKLSAgdW5zaWduZWQgbG9uZyBkYXRhc2l6ZSA9IDA7Ci0gIGNvbnN0IHN0cnVjdCBiaW5kYXRhICpiaW5fcmVwLCAqZGF0YTsKLQotICBiaW5fcmVwID0gcmVzX3RvX2JpbiAocmVzLCAwKTsKLSAgZm9yIChkYXRhID0gYmluX3JlcDsgZGF0YSAhPSBOVUxMOyBkYXRhID0gZGF0YS0+bmV4dCkKLSAgICBkYXRhc2l6ZSArPSBkYXRhLT5sZW5ndGg7Ci0KLSAgd3JpdGVfcmVzX2hlYWRlciAoZGF0YXNpemUsIHR5cGUsIG5hbWUsIHJlc2luZm8pOwotCi0gIGZvciAoZGF0YSA9IGJpbl9yZXA7IGRhdGEgIT0gTlVMTDsgZGF0YSA9IGRhdGEtPm5leHQpCi0gICAgd3JpdGVfcmVzX2RhdGEgKGRhdGEtPmRhdGEsIGRhdGEtPmxlbmd0aCwgMSk7Ci19Ci0KLS8qIEdldCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIGFuIGlkIGluIGJpbmFyeSBmb3JtYXQgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1nZXRfaWRfc2l6ZSAoaWQpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkOwotewotICBpZiAoaWQtPm5hbWVkKQotICAgIHJldHVybiBzaXplb2YgKHVuaWNoYXIpICogKGlkLT51Lm4ubGVuZ3RoICsgMSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gc2l6ZW9mICh1bmljaGFyKSAqIDI7Ci19Ci0KLS8qIFdyaXRlIGEgcmVzb3VyY2UgaGVhZGVyICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2hlYWRlciAoZGF0YXNpemUsIHR5cGUsIG5hbWUsIHJlc2luZm8pCi0gICAgIHVuc2lnbmVkIGxvbmcgZGF0YXNpemU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci17Ci0gIHN0cnVjdCByZXNfaGRyIHJlc2hkcjsKLSAgcmVzaGRyLmRhdGFfc2l6ZSA9IGRhdGFzaXplOwotICByZXNoZHIuaGVhZGVyX3NpemUgPSAyNCArIGdldF9pZF9zaXplICh0eXBlKSArIGdldF9pZF9zaXplIChuYW1lKTsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLSAgd3JpdGVfcmVzX2RhdGEgKCZyZXNoZHIsIHNpemVvZiAocmVzaGRyKSwgMSk7Ci0gIHdyaXRlX3Jlc19pZCAodHlwZSk7Ci0gIHdyaXRlX3Jlc19pZCAobmFtZSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0KLSAgd3JpdGVfcmVzX2luZm8gKHJlc2luZm8pOwotICByZXNfYWxpZ25fZmlsZSAoKTsKLX0KLQotCi0vKiBXcml0ZSBkYXRhIHRvIGZpbGUsIGFib3J0IG9uIGZhaWx1cmUgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfZGF0YSAoZGF0YSwgc2l6ZSwgY291bnQpCi0gICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgIHNpemVfdCBzaXplOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGlmIChmd3JpdGUgKGRhdGEsIHNpemUsIGNvdW50LCBmcmVzKSAhPSAoc2l6ZV90KSBjb3VudCkKLSAgICBmYXRhbCAoIiVzOiBjb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSIsIGZpbGVuYW1lKTsKLX0KLQotLyogUmVhZCBkYXRhIGZyb20gZmlsZSwgYWJvcnQgb24gZmFpbHVyZSAqLwotc3RhdGljIHZvaWQKLXJlYWRfcmVzX2RhdGEgKGRhdGEsIHNpemUsIGNvdW50KQotICAgICB2b2lkICpkYXRhOwotICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgaW50IGNvdW50OwotewotICBpZiAoZnJlYWQgKGRhdGEsIHNpemUsIGNvdW50LCBmcmVzKSAhPSAoc2l6ZV90KSBjb3VudCkKLSAgICBmYXRhbCAoIiVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIiwgZmlsZW5hbWUpOwotfQotCi0vKiBXcml0ZSBhIHJlc291cmNlIGlkICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2lkIChpZCkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWQ7Ci17Ci0gIGlmIChpZC0+bmFtZWQpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBsZW4gPSBpZC0+dS5uLmxlbmd0aDsKLSAgICAgIHVuaWNoYXIgbnVsbF90ZXJtID0gMDsKLSAgICAgIHdyaXRlX3Jlc19kYXRhIChpZC0+dS5uLm5hbWUsIGxlbiAqIHNpemVvZiAodW5pY2hhciksIDEpOwotICAgICAgd3JpdGVfcmVzX2RhdGEgKCZudWxsX3Rlcm0sIHNpemVvZiAobnVsbF90ZXJtKSwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgc2hvcnQgaSA9IDB4RkZGRjsKLSAgICAgIHdyaXRlX3Jlc19kYXRhICgmaSwgc2l6ZW9mIChpKSwgMSk7Ci0gICAgICBpID0gaWQtPnUuaWQ7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoJmksIHNpemVvZiAoaSksIDEpOwotICAgIH0KLX0KLQotLyogV3JpdGUgcmVzb3VyY2UgaW5mbyAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19pbmZvIChpbmZvKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICppbmZvOwotewotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPnZlcnNpb24sIHNpemVvZiAoaW5mby0+dmVyc2lvbiksIDEpOwotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPm1lbWZsYWdzLCBzaXplb2YgKGluZm8tPm1lbWZsYWdzKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+bGFuZ3VhZ2UsIHNpemVvZiAoaW5mby0+bGFuZ3VhZ2UpLCAxKTsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT52ZXJzaW9uLCBzaXplb2YgKGluZm8tPnZlcnNpb24pLCAxKTsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT5jaGFyYWN0ZXJpc3RpY3MsIHNpemVvZiAoaW5mby0+Y2hhcmFjdGVyaXN0aWNzKSwgMSk7Ci19Ci0KLS8qIHJlYWQgYSByZXNvdXJjZSBpZGVudGlmaWVyICovCi12b2lkIAotcmVhZF9yZXNfaWQgKGlkKQotICAgICBzdHJ1Y3QgcmVzX2lkICppZDsKLXsKLSAgdW5zaWduZWQgc2hvcnQgb3JkOwotICB1bmljaGFyICppZF9zID0gTlVMTDsKLSAgaW50IGxlbjsKLQotICByZWFkX3Jlc19kYXRhICgmb3JkLCBzaXplb2YgKG9yZCksIDEpOwotICBpZiAob3JkID09IDB4RkZGRikJCS8qIGFuIG9yZGluYWwgaWQgKi8KLSAgICB7Ci0gICAgICByZWFkX3Jlc19kYXRhICgmb3JkLCBzaXplb2YgKG9yZCksIDEpOwotICAgICAgaWQtPm5hbWVkID0gMDsKLSAgICAgIGlkLT51LmlkID0gb3JkOwotICAgIH0KLSAgZWxzZQotICAgIC8qIG5hbWVkIGlkICovCi0gICAgewotICAgICAgaWYgKGZzZWVrIChmcmVzLCAtc2l6ZW9mIChvcmQpLCBTRUVLX0NVUikgIT0gMCkKLQlmYXRhbCAoIiVzOiAlczogY291bGQgbm90IHNlZWsgaW4gZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOwotICAgICAgaWRfcyA9IHJlYWRfdW5pc3RyaW5nICgmbGVuKTsKLSAgICAgIGlkLT5uYW1lZCA9IDE7Ci0gICAgICBpZC0+dS5uLmxlbmd0aCA9IGxlbjsKLSAgICAgIGlkLT51Lm4ubmFtZSA9IGlkX3M7Ci0gICAgfQotfQotCi0vKiBSZWFkIGEgbnVsbCB0ZXJtaW5hdGVkIFVOSUNPREUgc3RyaW5nICovCi1zdGF0aWMgdW5pY2hhciAqCi1yZWFkX3VuaXN0cmluZyAobGVuKQotICAgICBpbnQgKmxlbjsKLXsKLSAgdW5pY2hhciAqczsKLSAgdW5pY2hhciBjOwotICB1bmljaGFyICpwOwotICBpbnQgbDsKLQotICAqbGVuID0gMDsKLSAgbCA9IDA7Ci0KLSAgLyogdGhlcmUgYXJlIGhhcmRseSBhbnkgbmFtZXMgbG9uZ2VyIHRoYW4gMjU2IGNoYXJhY3RlcnMgKi8KLSAgcCA9IHMgPSAodW5pY2hhciAqKSB4bWFsbG9jIChzaXplb2YgKHVuaWNoYXIpICogMjU2KTsKLSAgZG8KLSAgICB7Ci0gICAgICByZWFkX3Jlc19kYXRhICgmYywgc2l6ZW9mIChjKSwgMSk7Ci0gICAgICAqcCsrID0gYzsKLSAgICAgIGlmIChjICE9IDApCi0JbCsrOwotICAgIH0KLSAgd2hpbGUgKGMgIT0gMCk7Ci0gICpsZW4gPSBsOwotICByZXR1cm4gczsKLX0KLQotLyogYWxpZ24gZmlsZSBvbiBEV09SRCBib3VuZGFyeSAqLwotc3RhdGljIHZvaWQKLXJlc19hbGlnbl9maWxlICh2b2lkKQotewotICBpZiAoZnNlZWsgKGZyZXMsIGZ0ZWxsIChmcmVzKSAlIDQsIFNFRUtfQ1VSKSAhPSAwKQotICAgIGZhdGFsICgiJXM6ICVzOiB1bmFibGUgdG8gYWxpZ24gZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOwotfQotCi0vKiBDaGVjayBpZiBmaWxlIGlzIGEgd2luMzIgYmluYXJ5IHJlc291cmNlIGZpbGUsIGlmIHNvCi0gICBza2lwIHBhc3QgdGhlIG51bGwgcmVzb3VyY2UuIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBvbgotICAgZXJyb3IuCi0gKi8KLXN0YXRpYyB2b2lkCi1za2lwX251bGxfcmVzb3VyY2UgKHZvaWQpCi17Ci0gIHN0cnVjdCByZXNfaGRyIHJlc2hkciA9Ci0gIHswLCAwfTsKLSAgcmVhZF9yZXNfZGF0YSAoJnJlc2hkciwgc2l6ZW9mIChyZXNoZHIpLCAxKTsKLSAgaWYgKChyZXNoZHIuZGF0YV9zaXplICE9IDApIHx8IChyZXNoZHIuaGVhZGVyX3NpemUgIT0gMHgyMCkpCi0gICAgZ290byBza2lwX2VycjsKLQotICAvKiBTdWJ0cmFjdCBzaXplIG9mIEhlYWRlclNpemUgYW5kIERhdGFTaXplICovCi0gIGlmIChmc2VlayAoZnJlcywgcmVzaGRyLmhlYWRlcl9zaXplIC0gOCwgU0VFS19DVVIpICE9IDApCi0gICAgZ290byBza2lwX2VycjsKLQotICByZXR1cm47Ci0KLXNraXBfZXJyOgotICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6IE5vdCBhIHZhbGlkIFdJTjMyIHJlc291cmNlIGZpbGVcbiIsIHByb2dyYW1fbmFtZSwKLQkgICBmaWxlbmFtZSk7Ci0gIHhleGl0ICgxKTsKLX0KLQotLyogQWRkIGEgcmVzb3VyY2UgdG8gcmVzb3VyY2UgZGlyZWN0b3J5ICovCi12b2lkCi1yZXNfYWRkX3Jlc291cmNlIChyLCB0eXBlLCBpZCwgbGFuZ3VhZ2UsIGR1cG9rKQotICAgICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZDsKLSAgICAgaW50IGxhbmd1YWdlOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfaWQgYVszXTsKLQotICBhWzBdID0gKnR5cGU7Ci0gIGFbMV0gPSAqaWQ7Ci0gIGFbMl0ubmFtZWQgPSAwOwotICBhWzJdLnUuaWQgPSBsYW5ndWFnZTsKLSAgcmVzX2FwcGVuZF9yZXNvdXJjZSAoJnJlc291cmNlcywgciwgMywgYSwgZHVwb2spOwotfQotCi0vKiBBcHBlbmQgYSByZXNvdXJjZSB0byByZXNvdXJjZSBkaXJlY3RvcnkuCi0gICBUaGlzIGlzIGp1c3QgY29waWVkIGZyb20gZGVmaW5lX3Jlc291cmNlCi0gICBhbmQgbW9kaWZpZWQgdG8gYWRkIGFuIGV4aXN0aW5nIHJlc291cmNlLgotICovCi12b2lkCi1yZXNfYXBwZW5kX3Jlc291cmNlIChyZXNvdXJjZXMsIHJlc291cmNlLCBjaWRzLCBpZHMsIGR1cG9rKQotICAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKnJlc291cmNlczsKLSAgICAgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzb3VyY2U7Ci0gICAgIGludCBjaWRzOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZHM7Ci0gICAgIGludCBkdXBvazsKLXsKLSAgc3RydWN0IHJlc19lbnRyeSAqcmUgPSBOVUxMOwotICBpbnQgaTsKLQotICBhc3NlcnQgKGNpZHMgPiAwKTsKLSAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICoqcHA7Ci0KLSAgICAgIGlmICgqcmVzb3VyY2VzID09IE5VTEwpCi0JewotCSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXZhbDsKLQotCSAgLyogVXNlIHRoZSBzYW1lIHRpbWVzdGFtcCBmb3IgZXZlcnkgcmVzb3VyY2UgY3JlYXRlZCBpbiBhCi0JICAgICBzaW5nbGUgcnVuLiAgKi8KLQkgIGlmICh0aW1ldmFsID09IDApCi0JICAgIHRpbWV2YWwgPSB0aW1lIChOVUxMKTsKLQotCSAgKnJlc291cmNlcyA9ICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKikKLQkJCXJlc19hbGxvYyAoc2l6ZW9mICoqcmVzb3VyY2VzKSk7Ci0JICAoKnJlc291cmNlcyktPmNoYXJhY3RlcmlzdGljcyA9IDA7Ci0JICAoKnJlc291cmNlcyktPnRpbWUgPSB0aW1ldmFsOwotCSAgKCpyZXNvdXJjZXMpLT5tYWpvciA9IDA7Ci0JICAoKnJlc291cmNlcyktPm1pbm9yID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+ZW50cmllcyA9IE5VTEw7Ci0JfQotCi0gICAgICBmb3IgKHBwID0gJigqcmVzb3VyY2VzKS0+ZW50cmllczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCWlmIChyZXNfaWRfY21wICgoKnBwKS0+aWQsIGlkc1tpXSkgPT0gMCkKLQkgIGJyZWFrOwotCi0gICAgICBpZiAoKnBwICE9IE5VTEwpCi0JcmUgPSAqcHA7Ci0gICAgICBlbHNlCi0JewotCSAgcmUgPSAoc3RydWN0IHJlc19lbnRyeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmUpOwotCSAgcmUtPm5leHQgPSBOVUxMOwotCSAgcmUtPmlkID0gaWRzW2ldOwotCSAgaWYgKChpICsgMSkgPCBjaWRzKQotCSAgICB7Ci0JICAgICAgcmUtPnN1YmRpciA9IDE7Ci0JICAgICAgcmUtPnUuZGlyID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmUtPnN1YmRpciA9IDA7Ci0JICAgICAgcmUtPnUucmVzID0gTlVMTDsKLQkgICAgfQotCi0JICAqcHAgPSByZTsKLQl9Ci0KLSAgICAgIGlmICgoaSArIDEpIDwgY2lkcykKLQl7Ci0JICBpZiAoIXJlLT5zdWJkaXIpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGksIGlkcyk7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiBleHBlY3RlZCB0byBiZSBhIGRpcmVjdG9yeVxuIik7Ci0JICAgICAgeGV4aXQgKDEpOwotCSAgICB9Ci0KLQkgIHJlc291cmNlcyA9ICZyZS0+dS5kaXI7Ci0JfQotICAgIH0KLQotICBpZiAocmUtPnN1YmRpcikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZXhwZWN0ZWQgdG8gYmUgYSBsZWFmXG4iKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKHJlLT51LnJlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkdXBvaykKLQlyZXR1cm47Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB3YXJuaW5nOiAiLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiBkdXBsaWNhdGUgdmFsdWVcbiIpOwotICAgIH0KLQotICByZS0+dS5yZXMgPSByZXNvdXJjZTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Nhbml0eS5zaCBiL2JpbnV0aWxzL3Nhbml0eS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQyY2FiZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zYW5pdHkuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIS9iaW4vc2gKLSMjIyBxdWljayBzYW5pdHkgdGVzdCBmb3IgdGhlIGJpbnV0aWxzLgotIyMjCi0jIyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGFuZCBpcyBtYWludGFpbmVkIGJ5IEsuIFJpY2hhcmQgUGl4bGV5LAotIyMjIHJpY2hAY3lnbnVzLmNvbS4KLQotIyMjIGZhaWwgb24gZXJyb3JzCi1zZXQgLWUKLQotIyMjIGZpcnN0IGFyZyBpcyBkaXJlY3RvcnkgaW4gd2hpY2ggYmluYXJpZXMgdG8gYmUgdGVzdGVkIHJlc2lkZS4KLWNhc2UgIiQxIiBpbgotIiIpIEJJTj0uIDs7Ci0qKSAgQklOPSIkMSIgOzsKLWVzYWMKLQotIyMjIHNpemUKLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciBzdHJpcCByYW5saWIgOyBkbwotCSR7QklOfS9zaXplICR7QklOfS8kaSA+IC9kZXYvbnVsbAotZG9uZQotCi0jIyMgb2JqZHVtcAotZm9yIGkgaW4gc2l6ZSBvYmpkdW1wIG5tIGFyIHN0cmlwIHJhbmxpYiA7IGRvCi0JJHtCSU59L29iamR1bXAgLWFoaWZkcnR4c2wgJHtCSU59LyRpID4gL2Rldi9udWxsCi1kb25lCi0KLSMjIyBubQotZm9yIGkgaW4gc2l6ZSBvYmpkdW1wIG5tIGFyIHN0cmlwIHJhbmxpYiA7IGRvCi0JJHtCSU59L25tICR7QklOfS8kaSA+IC9kZXYvbnVsbAotZG9uZQotCi0jIyMgc3RyaXAKLVRNUERJUj0uL2JpbnV0aWxzLSQkCi1ta2RpciAke1RNUERJUn0KLQotY3AgJHtCSU59L3N0cmlwICR7VE1QRElSfS9zdHJpcAotCi1mb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgcmFubGliIDsgZG8KLQljcCAke0JJTn0vJGkgJHtUTVBESVJ9LyRpCi0JJHtCSU59L3N0cmlwICR7VE1QRElSfS8kaQotCWNwICR7QklOfS8kaSAke1RNUERJUn0vJGkKLQkke1RNUERJUn0vc3RyaXAgJHtUTVBESVJ9LyRpCi1kb25lCi0KLSMjIyBhcgotCi0jIyMgcmFubGliCi0KLXJtIC1yZiAke1RNUERJUn0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9iaW51dGlscy9zaXplLjEgYi9iaW51dGlscy9zaXplLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTliZDIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc2l6ZS4xCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBzaXplIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLXNpemUgXC0gbGlzdCBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplLgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgc2l6ZQotLlJCICJbXHwiIFwtQSBcfHxcfCBcLUIgXHx8XHwgXGMKLS5CSSAiXC1cLWZvcm1hdD0iIGNvbXBhdGliaWxpdHlcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIiAKLS5SQiAiW1x8IiBcLWQgXHx8XHwgXC1vIFx8fFx8IFwteFxjCi1cfHxcfFxjCi0uQkkgIlwtXC1yYWRpeD0iIG51bWJlclxjCi1cJlx8XQotLlJCICJbXHwiIFxjCi0uQkkgIlwtXC10YXJnZXQ9IiBiZmRuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1WIFx8fFx8IFwtXC12ZXJzaW9uICJcfF0iICAKLS5JIG9iamZpbGVcYwotXCYuXHwuXHwuCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotVGhlIEdOVSBcYwotLkIgc2l6ZVxjCi1cJiB1dGlsaXR5IGxpc3RzIHRoZSBzZWN0aW9uIHNpemVzXChlbVwmYW5kIHRoZSB0b3RhbAotc2l6ZVwoZW1cJmZvciBlYWNoIG9mIHRoZSBvYmplY3QgZmlsZXMKLS5JIG9iamZpbGUKLWluIGl0cyBhcmd1bWVudCBsaXN0LgotQnkgZGVmYXVsdCwgb25lIGxpbmUgb2Ygb3V0cHV0IGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBvYmplY3QgZmlsZSBvciBlYWNoCi1tb2R1bGUgaW4gYW4gYXJjaGl2ZS4KLQotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1BCi0uVFAKLS5CIFwtQgotLlRQCi0uQkkgIlwtXC1mb3JtYXQgIiAiY29tcGF0aWJpbGl0eSIKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNob29zZSB3aGV0aGVyIHRoZSBvdXRwdXQgZnJvbSBHTlUKLVxjCi0uQiBzaXplXGMKLVwmIHJlc2VtYmxlcyBvdXRwdXQgZnJvbSBTeXN0ZW0gViBcYwotLkIgc2l6ZVxjCi1cJiAodXNpbmcgYFx8XGMKLS5CIFwtQVxjCi1cfCcsCi1vciBgXHxcYwotLkIgXC1cLWZvcm1hdD1zeXN2XGMKLVx8JyksIG9yIEJlcmtlbGV5IFxjCi0uQiBzaXplXGMKLVwmICh1c2luZyBgXHxcYwotLkIgXC1CXGMKLVx8Jywgb3IKLWBcfFxjCi0uQiBcLVwtZm9ybWF0PWJlcmtlbGV5XGMKLVx8JykuICBUaGUgZGVmYXVsdCBpcyB0aGUgb25lLWxpbmUgZm9ybWF0IHNpbWlsYXIgdG8KLUJlcmtlbGV5J3MuICAKLQotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgYWNjZXB0YWJsZSBhcmd1bWVudHMgYW5kIG9wdGlvbnMuCi0KLS5UUAotLkIgXC1kCi0uVFAKLS5CIFwtbwotLlRQCi0uQiBcLXgKLS5UUAotLkJJICJcLVwtcmFkaXggIiAibnVtYmVyIgotVXNpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gY29udHJvbCB3aGV0aGVyIHRoZSBzaXplIG9mIGVhY2gKLXNlY3Rpb24gaXMgZ2l2ZW4gaW4gZGVjaW1hbCAoYFx8XGMKLS5CIFwtZFxjCi1cfCcsIG9yIGBcfFxjCi0uQiBcLVwtcmFkaXggMTBcYwotXHwnKTsgb2N0YWwKLShgXHxcYwotLkIgXC1vXGMKLVx8Jywgb3IgYFx8XGMKLS5CIFwtXC1yYWRpeCA4XGMKLVx8Jyk7IG9yIGhleGFkZWNpbWFsIChgXHxcYwotLkIgXC14XGMKLVx8Jywgb3IKLWBcfFxjCi0uQiBcLVwtcmFkaXggMTZcYwotXHwnKS4gIEluIGBcfFxjCi0uQiBcLVwtcmFkaXggXGMKLS5JIG51bWJlclxjCi1cJlxjCi1cfCcsIG9ubHkgdGhlIHRocmVlCi12YWx1ZXMgKDgsIDEwLCAxNikgYXJlIHN1cHBvcnRlZC4gIFRoZSB0b3RhbCBzaXplIGlzIGFsd2F5cyBnaXZlbiBpbiB0d28KLXJhZGljZXM7IGRlY2ltYWwgYW5kIGhleGFkZWNpbWFsIGZvciBgXHxcYwotLkIgXC1kXGMKLVx8JyBvciBgXHxcYwotLkIgXC14XGMKLVx8JyBvdXRwdXQsIG9yCi1vY3RhbCBhbmQgaGV4YWRlY2ltYWwgaWYgeW91J3JlIHVzaW5nIGBcfFxjCi0uQiBcLW9cYwotXHwnLgotCi0uVFAKLS5CSSAiXC1cLXRhcmdldCAiICJiZmRuYW1lIgotWW91IGNhbiBzcGVjaWZ5IGEgcGFydGljdWxhciBvYmplY3QtY29kZSBmb3JtYXQgZm9yIFxjCi0uSSBvYmpmaWxlXGMKLVwmIGFzCi1cYwotLkkgYmZkbmFtZVxjCi1cJi4gIFRoaXMgbWF5IG5vdCBiZSBuZWNlc3Nhcnk7IFxjCi0uSSBzaXplXGMKLVwmIGNhbgotYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLiAgIFNlZSAKLS5CUiBvYmpkdW1wICggMSApIAotZm9yIGluZm9ybWF0aW9uCi1vbiBsaXN0aW5nIGF2YWlsYWJsZSBmb3JtYXRzLgotCi0uVFAKLS5CIFwtVgotLlRQCi0uQiBcLVwtdmVyc2lvbgotRGlzcGxheSB2ZXJzaW9uIG51bWJlciBpbmZvcm1hdGlvbiBvbiBcYwotLkIgc2l6ZVxjCi1cJiBpdHNlbGYuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CUiBpbmZvIDsKLS5JUiAiVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzIiAsCi0gUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpOyAKLS5CUiBhciAiKCIgMSAiKSwiCi0uQlIgb2JqZHVtcCAoIDEgKS4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc2l6ZS5jIGIvYmludXRpbHMvc2l6ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTM4NTBjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3NpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0vKiBzaXplLmMgLS0gcmVwb3J0IHNpemUgb2YgdmFyaW91cyBzZWN0aW9ucyBvZiBhbiBleGVjdXRhYmxlIGZpbGUuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0vKiBFeHRlbnNpb25zL2luY29tcGF0aWJpbGl0aWVzOgotICAgbyAtIEJTRCBvdXRwdXQgaGFzIGZpbGVuYW1lcyBhdCB0aGUgZW5kLgotICAgbyAtIEJTRCBvdXRwdXQgY2FuIGFwcGVhciBpbiBkaWZmZXJlbnQgcmFkaWNpZXMuCi0gICBvIC0gU3lzViBvdXRwdXQgaGFzIGxlc3MgcmVkdW5kYW50IHdoaXRlc3BhY2UuICBGaWxlbmFtZSBjb21lcyBhdCBlbmQuCi0gICBvIC0gU3lzViBvdXRwdXQgZG9lc24ndCBzaG93IFZNQSB3aGljaCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIFBNQS4KLSAgIG8gLSBXZSBhbHNvIGhhbmRsZSBjb3JlIGZpbGVzLgotICAgbyAtIFdlIGFsc28gaGFuZGxlIGFyY2hpdmVzLgotICAgSWYgeW91IHdyaXRlIHNoZWxsIHNjcmlwdHMgd2hpY2ggbWFuaXB1bGF0ZSB0aGlzIGluZm8gdGhlbiB5b3UgbWF5IGJlCi0gICBvdXQgb2YgbHVjazsgdGhlcmUncyBubyAtLWNvbXBhdGliaWxpdHkgb3IgLS1wZWRhbnRpYyBvcHRpb24uCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZm5kZWYgQlNEX0RFRkFVTFQKLSNkZWZpbmUgQlNEX0RFRkFVTFQgMQotI2VuZGlmCi0KLS8qIFByb2dyYW0gb3B0aW9ucy4gICovCi0KLWVudW0KLSAgewotICAgIGRlY2ltYWwsIG9jdGFsLCBoZXgKLSAgfSByYWRpeCA9IGRlY2ltYWw7Ci1pbnQgYmVya2VsZXlfZm9ybWF0ID0gQlNEX0RFRkFVTFQ7CS8qIDAgbWVhbnMgdXNlIEFUJlQtc3R5bGUgb3V0cHV0LiAgKi8KLWludCBzaG93X3ZlcnNpb24gPSAwOwotaW50IHNob3dfaGVscCA9IDA7Ci0KLS8qIFByb2dyYW0gZXhpdCBzdGF0dXMuICAqLwotaW50IHJldHVybl9jb2RlID0gMDsKLQotc3RhdGljIGNoYXIgKnRhcmdldCA9IE5VTEw7Ci0KLS8qIFN0YXRpYyBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRpc3BsYXlfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotc3RhdGljIHZvaWQgZGlzcGxheV9iZmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGRpc3BsYXlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzaXplX251bWJlciBQQVJBTVMgKChiZmRfc2l6ZV90eXBlKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgbHByaW50X251bWJlciBQQVJBTVMgKChpbnQsIGJmZF9zaXplX3R5cGUpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgcnByaW50X251bWJlciBQQVJBTVMgKChpbnQsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHByaW50X2JlcmtlbGV5X2Zvcm1hdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc3lzdl9pbnRlcm5hbF9zaXplciBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBzeXN2X2ludGVybmFsX3ByaW50ZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgcHJpbnRfc3lzdl9mb3JtYXQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHByaW50X3NpemVzIFBBUkFNUyAoKGJmZCAqIGZpbGUpKTsKLXN0YXRpYyB2b2lkIGJlcmtlbGV5X3N1bSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSKSk7Ci0MCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstQUJkb3hWXSBbLS1mb3JtYXQ9YmVya2VsZXl8c3lzdl0gWy0tcmFkaXg9OHwxMHwxNl1cblwKLSAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW2ZpbGUuLi5dXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSNpZiBCU0RfREVGQVVMVAotICBmcHV0cyAoXygiZGVmYXVsdCBpcyAtLWZvcm1hdD1iZXJrZWxleVxuIiksIHN0cmVhbSk7Ci0jZWxzZQotICBmcHV0cyAoXygiZGVmYXVsdCBpcyAtLWZvcm1hdD1zeXN2XG4iKSwgc3RyZWFtKTsKLSNlbmRpZgotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotCi1zdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAwfSwKLSAgeyJyYWRpeCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAyMDF9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAyMDJ9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgJnNob3dfdmVyc2lvbiwgMX0sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAmc2hvd19oZWxwLCAxfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCB0ZW1wOwotICBpbnQgYzsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9ICphcmd2OwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJBQlZkb3giLCBsb25nX29wdGlvbnMsCi0JCQkgICAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgc3dpdGNoIChjKQotICAgICAgewotICAgICAgY2FzZSAyMDA6CQkvKiAtLWZvcm1hdCAqLwotCXN3aXRjaCAoKm9wdGFyZykKLQkgIHsKLQkgIGNhc2UgJ0InOgotCSAgY2FzZSAnYic6Ci0JICAgIGJlcmtlbGV5X2Zvcm1hdCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnUyc6Ci0JICBjYXNlICdzJzoKLQkgICAgYmVya2VsZXlfZm9ybWF0ID0gMDsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oImludmFsaWQgYXJndW1lbnQgdG8gLS1mb3JtYXQ6ICVzXG4iKSwgb3B0YXJnKTsKLQkgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjAyOgkJLyogLS10YXJnZXQgKi8KLQl0YXJnZXQgPSBvcHRhcmc7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjAxOgkJLyogLS1yYWRpeCAqLwotI2lmZGVmIEFOU0lfTElCUkFSSUVTCi0JdGVtcCA9IHN0cnRvbCAob3B0YXJnLCBOVUxMLCAxMCk7Ci0jZWxzZQotCXRlbXAgPSBhdG9sIChvcHRhcmcpOwotI2VuZGlmCi0Jc3dpdGNoICh0ZW1wKQotCSAgewotCSAgY2FzZSAxMDoKLQkgICAgcmFkaXggPSBkZWNpbWFsOwotCSAgICBicmVhazsKLQkgIGNhc2UgODoKLQkgICAgcmFkaXggPSBvY3RhbDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE2OgotCSAgICByYWRpeCA9IGhleDsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBwcmludGYgKF8oIkludmFsaWQgcmFkaXg6ICVzXG4iKSwgb3B0YXJnKTsKLQkgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgJ0EnOgotCWJlcmtlbGV5X2Zvcm1hdCA9IDA7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdCJzoKLQliZXJrZWxleV9mb3JtYXQgPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSAnVic6Ci0Jc2hvd192ZXJzaW9uID0gMTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ2QnOgotCXJhZGl4ID0gZGVjaW1hbDsKLQlicmVhazsKLSAgICAgIGNhc2UgJ3gnOgotCXJhZGl4ID0gaGV4OwotCWJyZWFrOwotICAgICAgY2FzZSAnbyc6Ci0JcmFkaXggPSBvY3RhbDsKLQlicmVhazsKLSAgICAgIGNhc2UgMDoKLQlicmVhazsKLSAgICAgIGNhc2UgJz8nOgotCXVzYWdlIChzdGRlcnIsIDEpOwotICAgICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoInNpemUiKTsKLSAgaWYgKHNob3dfaGVscCkKLSAgICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQotICBpZiAob3B0aW5kID09IGFyZ2MpCi0gICAgZGlzcGxheV9maWxlICgiYS5vdXQiKTsKLSAgZWxzZQotICAgIGZvciAoOyBvcHRpbmQgPCBhcmdjOykKLSAgICAgIGRpc3BsYXlfZmlsZSAoYXJndltvcHRpbmQrK10pOwotCi0gIHJldHVybiByZXR1cm5fY29kZTsKLX0KLQwKLS8qIERpc3BsYXkgc3RhdHMgb24gZmlsZSBvciBhcmNoaXZlIG1lbWJlciBBQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYmZkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX2FyY2hpdmUpKQotICAgIC8qIEFuIGFyY2hpdmUgd2l0aGluIGFuIGFyY2hpdmUuICAqLwotICAgIHJldHVybjsKLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIHByaW50X3NpemVzIChhYmZkKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLSAgICAgIGZyZWUgKG1hdGNoaW5nKTsKLSAgICAgIHJldHVybl9jb2RlID0gMzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX2NvcmUsICZtYXRjaGluZykpCi0gICAgewotICAgICAgQ09OU1QgY2hhciAqY29yZV9jbWQ7Ci0KLSAgICAgIHByaW50X3NpemVzIChhYmZkKTsKLSAgICAgIGZwdXRzICgiIChjb3JlIGZpbGUiLCBzdGRvdXQpOwotCi0gICAgICBjb3JlX2NtZCA9IGJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKTsKLSAgICAgIGlmIChjb3JlX2NtZCkKLQlwcmludGYgKCIgaW52b2tlZCBhcyAlcyIsIGNvcmVfY21kKTsKLQotICAgICAgcHV0cyAoIilcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotICAgIHsKLSAgICAgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotICAgICAgZnJlZSAobWF0Y2hpbmcpOwotICAgIH0KLQotICByZXR1cm5fY29kZSA9IDM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2FyY2hpdmUgKGZpbGUpCi0gICAgIGJmZCAqZmlsZTsKLXsKLSAgYmZkICphcmZpbGUgPSAoYmZkICopIE5VTEw7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotCi0gICAgICBhcmZpbGUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmaWxlLCBhcmZpbGUpOwotICAgICAgaWYgKGFyZmlsZSA9PSBOVUxMKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCSAgICB7Ci0JICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7Ci0JICAgICAgcmV0dXJuX2NvZGUgPSAyOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGRpc3BsYXlfYmZkIChhcmZpbGUpOwotICAgICAgLyogRG9uJ3QgY2xvc2UgdGhlIGFyY2hpdmUgZWxlbWVudHM7IHdlIG5lZWQgdGhlbSBmb3IgbmV4dF9hcmNoaXZlICovCi0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9maWxlIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGJmZCAqZmlsZSA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm5fY29kZSA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaWxlLCBiZmRfYXJjaGl2ZSkgPT0gdHJ1ZSkKLSAgICBkaXNwbGF5X2FyY2hpdmUgKGZpbGUpOwotICBlbHNlCi0gICAgZGlzcGxheV9iZmQgKGZpbGUpOwotCi0gIGlmIChiZmRfY2xvc2UgKGZpbGUpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuX2NvZGUgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQwKLS8qIFRoaXMgaXMgd2hhdCBsZXhpY2FsIGZ1bmN0aW9ucyBhcmUgZm9yLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9udW1iZXIgKG51bSkKLSAgICAgYmZkX3NpemVfdHlwZSBudW07Ci17Ci0gIGNoYXIgYnVmZmVyWzQwXTsKLSAgc3ByaW50ZiAoYnVmZmVyLAotCSAgIChyYWRpeCA9PSBkZWNpbWFsID8gIiVsdSIgOgotCSAgICgocmFkaXggPT0gb2N0YWwpID8gIjAlbG8iIDogIjB4JWx4IikpLAotCSAgICh1bnNpZ25lZCBsb25nKSBudW0pOwotCi0gIHJldHVybiBzdHJsZW4gKGJ1ZmZlcik7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm90IHVzZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbHByaW50X251bWJlciAod2lkdGgsIG51bSkKLSAgICAgaW50IHdpZHRoOwotICAgICBiZmRfc2l6ZV90eXBlIG51bTsKLXsKLSAgY2hhciBidWZmZXJbNDBdOwotICBzcHJpbnRmIChidWZmZXIsCi0JICAgKHJhZGl4ID09IGRlY2ltYWwgPyAiJWx1IiA6Ci0JICAgKChyYWRpeCA9PSBvY3RhbCkgPyAiMCVsbyIgOiAiMHglbHgiKSksCi0JICAgKHVuc2lnbmVkIGxvbmcpIG51bSk7Ci0KLSAgcHJpbnRmICgiJS0qcyIsIHdpZHRoLCBidWZmZXIpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXJwcmludF9udW1iZXIgKHdpZHRoLCBudW0pCi0gICAgIGludCB3aWR0aDsKLSAgICAgYmZkX3NpemVfdHlwZSBudW07Ci17Ci0gIGNoYXIgYnVmZmVyWzQwXTsKLSAgc3ByaW50ZiAoYnVmZmVyLAotCSAgIChyYWRpeCA9PSBkZWNpbWFsID8gIiVsdSIgOgotCSAgICgocmFkaXggPT0gb2N0YWwpID8gIjAlbG8iIDogIjB4JWx4IikpLAotCSAgICh1bnNpZ25lZCBsb25nKSBudW0pOwotCi0gIHByaW50ZiAoIiUqcyIsIHdpZHRoLCBidWZmZXIpOwotfQotCi1zdGF0aWMgYmZkX3NpemVfdHlwZSBic3NzaXplOwotc3RhdGljIGJmZF9zaXplX3R5cGUgZGF0YXNpemU7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSB0ZXh0c2l6ZTsKLQotc3RhdGljIHZvaWQKLWJlcmtlbGV5X3N1bSAoYWJmZCwgc2VjLCBpZ25vcmUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlYzsKLSAgICAgUFRSIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOwotICBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybjsKLQotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOwotICBpZiAoKGZsYWdzICYgU0VDX0NPREUpICE9IDAgfHwgKGZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQotICAgIHRleHRzaXplICs9IHNpemU7Ci0gIGVsc2UgaWYgKChmbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0gICAgZGF0YXNpemUgKz0gc2l6ZTsKLSAgZWxzZQotICAgIGJzc3NpemUgKz0gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgCi1wcmludF9iZXJrZWxleV9mb3JtYXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RhdGljIGludCBmaWxlc19zZWVuID0gMDsKLSAgYmZkX3NpemVfdHlwZSB0b3RhbDsKLQotICBic3NzaXplID0gMDsKLSAgZGF0YXNpemUgPSAwOwotICB0ZXh0c2l6ZSA9IDA7Ci0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBiZXJrZWxleV9zdW0sIChQVFIpIE5VTEwpOwotCi0gIGlmIChmaWxlc19zZWVuKysgPT0gMCkKLSNpZiAwCi0gICAgLyogSW50ZWwgZG9lc24ndCBsaWtlIGJzcy9zdGsgYmVjYXVzZSB0aGV5IGRvbid0IGhhdmUgY29yZSBmaWxlcy4gICovCi0gICAgcHV0cyAoKHJhZGl4ID09IG9jdGFsKSA/ICIgICB0ZXh0XHQgICBkYXRhXHRic3Mvc3RrXHQgICAgb2N0XHQgICAgaGV4XHRmaWxlbmFtZSIgOgotCSAgIiAgIHRleHRcdCAgIGRhdGFcdGJzcy9zdGtcdCAgICBkZWNcdCAgICBoZXhcdGZpbGVuYW1lIik7Ci0jZWxzZQotICAgIHB1dHMgKChyYWRpeCA9PSBvY3RhbCkgPyAiICAgdGV4dFx0ICAgZGF0YVx0ICAgIGJzc1x0ICAgIG9jdFx0ICAgIGhleFx0ZmlsZW5hbWUiIDoKLQkgICIgICB0ZXh0XHQgICBkYXRhXHQgICAgYnNzXHQgICAgZGVjXHQgICAgaGV4XHRmaWxlbmFtZSIpOwotI2VuZGlmCi0KLSAgdG90YWwgPSB0ZXh0c2l6ZSArIGRhdGFzaXplICsgYnNzc2l6ZTsKLQotICBycHJpbnRfbnVtYmVyICg3LCB0ZXh0c2l6ZSk7Ci0gIHB1dGNoYXIgKCdcdCcpOwotICBycHJpbnRfbnVtYmVyICg3LCBkYXRhc2l6ZSk7Ci0gIHB1dGNoYXIgKCdcdCcpOwotICBycHJpbnRfbnVtYmVyICg3LCBic3NzaXplKTsKLSAgcHJpbnRmICgoKHJhZGl4ID09IG9jdGFsKSA/ICJcdCU3bG9cdCU3bHhcdCIgOiAiXHQlN2x1XHQlN2x4XHQiKSwKLQkgICh1bnNpZ25lZCBsb25nKSB0b3RhbCwgKHVuc2lnbmVkIGxvbmcpIHRvdGFsKTsKLQotICBmcHV0cyAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN0ZG91dCk7Ci0gIGlmIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpCi0gICAgcHJpbnRmICgiIChleCAlcykiLCBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKTsKLX0KLQotLyogSSBSRUFMTFkgbWlzcyBsZXhpY2FsIGZ1bmN0aW9ucyEgKi8KLWJmZF9zaXplX3R5cGUgc3ZpX3RvdGFsID0gMDsKLWJmZF92bWEgc3ZpX21heHZtYSA9IDA7Ci1pbnQgc3ZpX25hbWVsZW4gPSAwOwotaW50IHN2aV92bWFsZW4gPSAwOwotaW50IHN2aV9zaXplbGVuID0gMDsKLQotc3RhdGljIHZvaWQKLXN5c3ZfaW50ZXJuYWxfc2l6ZXIgKGZpbGUsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWM7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoZmlsZSwgc2VjKTsKLSAgaWYgKCFiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLSAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLSAgICAgICYmICFiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgewotICAgICAgaW50IG5hbWVsZW4gPSBzdHJsZW4gKGJmZF9zZWN0aW9uX25hbWUgKGZpbGUsIHNlYykpOwotICAgICAgaWYgKG5hbWVsZW4gPiBzdmlfbmFtZWxlbikKLQlzdmlfbmFtZWxlbiA9IG5hbWVsZW47Ci0KLSAgICAgIHN2aV90b3RhbCArPSBzaXplOwotICAgICAgaWYgKGJmZF9zZWN0aW9uX3ZtYSAoZmlsZSwgc2VjKSA+IHN2aV9tYXh2bWEpCi0Jc3ZpX21heHZtYSA9IGJmZF9zZWN0aW9uX3ZtYSAoZmlsZSwgc2VjKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zeXN2X2ludGVybmFsX3ByaW50ZXIgKGZpbGUsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWM7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoZmlsZSwgc2VjKTsKLSAgaWYgKCFiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLSAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLSAgICAgICYmICFiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgewotICAgICAgc3ZpX3RvdGFsICs9IHNpemU7Ci0KLSAgICAgIHByaW50ZiAoIiUtKnMgICAiLCBzdmlfbmFtZWxlbiwgYmZkX3NlY3Rpb25fbmFtZSAoZmlsZSwgc2VjKSk7Ci0gICAgICBycHJpbnRfbnVtYmVyIChzdmlfc2l6ZWxlbiwgc2l6ZSk7Ci0gICAgICBwcmludGYgKCIgICAiKTsKLSAgICAgIHJwcmludF9udW1iZXIgKHN2aV92bWFsZW4sIGJmZF9zZWN0aW9uX3ZtYSAoZmlsZSwgc2VjKSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N5c3ZfZm9ybWF0IChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIC8qIHNpemUgYWxsIG9mIHRoZSBjb2x1bW5zICovCi0gIHN2aV90b3RhbCA9IDA7Ci0gIHN2aV9tYXh2bWEgPSAwOwotICBzdmlfbmFtZWxlbiA9IDA7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZmlsZSwgc3lzdl9pbnRlcm5hbF9zaXplciwgKFBUUikgTlVMTCk7Ci0gIHN2aV92bWFsZW4gPSBzaXplX251bWJlciAoKGJmZF9zaXplX3R5cGUpc3ZpX21heHZtYSk7Ci0gIGlmICgoc2l6ZV90KSBzdmlfdm1hbGVuIDwgc2l6ZW9mICgiYWRkciIpIC0gMSkKLSAgICBzdmlfdm1hbGVuID0gc2l6ZW9mICgiYWRkciIpLTE7Ci0KLSAgc3ZpX3NpemVsZW4gPSBzaXplX251bWJlciAoc3ZpX3RvdGFsKTsKLSAgaWYgKChzaXplX3QpIHN2aV9zaXplbGVuIDwgc2l6ZW9mICgic2l6ZSIpIC0gMSkKLSAgICBzdmlfc2l6ZWxlbiA9IHNpemVvZiAoInNpemUiKS0xOwotCi0gIHN2aV90b3RhbCA9IDA7Ci0gIHByaW50ZiAoIiVzICAiLCBiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7Ci0gIGlmIChiZmRfbXlfYXJjaGl2ZSAoZmlsZSkpCi0gICAgcHJpbnRmICgiIChleCAlcykiLCBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoZmlsZSkpKTsKLQotICBwcmludGYgKCI6XG4lLSpzICAgJSpzICAgJSpzXG4iLCBzdmlfbmFtZWxlbiwgInNlY3Rpb24iLAotCSAgc3ZpX3NpemVsZW4sICJzaXplIiwgc3ZpX3ZtYWxlbiwgImFkZHIiKTsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChmaWxlLCBzeXN2X2ludGVybmFsX3ByaW50ZXIsIChQVFIpIE5VTEwpOwotCi0gIHByaW50ZiAoIiUtKnMgICAiLCBzdmlfbmFtZWxlbiwgIlRvdGFsIik7Ci0gIHJwcmludF9udW1iZXIgKHN2aV9zaXplbGVuLCBzdmlfdG90YWwpOwotICBwcmludGYgKCJcblxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zaXplcyAoZmlsZSkKLSAgICAgYmZkICpmaWxlOwotewotICBpZiAoYmVya2VsZXlfZm9ybWF0KQotICAgIHByaW50X2JlcmtlbGV5X2Zvcm1hdCAoZmlsZSk7Ci0gIGVsc2UKLSAgICBwcmludF9zeXN2X2Zvcm1hdCAoZmlsZSk7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zcmNvbnYuYyBiL2JpbnV0aWxzL3NyY29udi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjBmMmI3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3NyY29udi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzNiArMCwwIEBACi0vKiBzcmNvbnYuYyAtLSBTeXNyb2ZmIGNvbnZlcnNpb24gcHJvZ3JhbQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLQotICAgVGhpcyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSBjb2ZmIG9iamVjdCBmaWxlCi0gICBpbnRvIGEgSGl0YWNoaSBPTS9MTSAoU3lzcm9mZikgZm9ybWF0LgotCi0gICBBbGwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHByZXNlcnZlZCAqLwotCi0jaW5jbHVkZSA8YmZkLmg+Ci0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAic3lzcm9mZi5oIgotI2luY2x1ZGUgImNvZmZncm9rLmgiCi0jaW5jbHVkZSA8bGliaWJlcnR5Lmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKLQotI2RlZmluZSBQUk9HUkFNX1ZFUlNJT04gIjEuNSIKLS8qI2RlZmluZSBGT09QMSAxICovCi0KLXN0YXRpYyBpbnQgYWRkcnNpemU7Ci1zdGF0aWMgY2hhciAqdG9vbG5hbWU7Ci1zdGF0aWMgY2hhciAqKnJuYW1lczsKLQotc3RhdGljIHZvaWQgd3JfY3MgKCk7Ci1zdGF0aWMgdm9pZCB3YWxrX3RyZWVfc2NvcGUgKCk7Ci1zdGF0aWMgdm9pZCB3cl9nbG9iYWxzICgpOwotc3RhdGljIGludCBmaW5kX2Jhc2UgKCk7Ci0KLXN0YXRpYyBGSUxFICpmaWxlOwotc3RhdGljIGJmZCAqYWJmZDsKLXN0YXRpYyBpbnQgZGVidWcgPSAwOwotc3RhdGljIGludCBxdWljayA9IDA7Ci1zdGF0aWMgaW50IG5vcHJlc2NhbiA9IDA7Ci1zdGF0aWMgc3RydWN0IGNvZmZfb2ZpbGUgKnRyZWU7Ci0vKiBPYnNvbGV0ZSA/PyAKLSAgIHN0YXRpYyBpbnQgYWJzb2x1dGVfcDsKLSAqLwotCi1zdGF0aWMgaW50IHNlZ21lbnRlZF9wOwotc3RhdGljIGludCBjb2RlOwotCi1zdGF0aWMgaW50IGlkczFbMjAwMDBdOwotc3RhdGljIGludCBpZHMyWzIwMDAwXTsKLQotc3RhdGljIGludCBiYXNlMSA9IDB4MTg7Ci1zdGF0aWMgaW50IGJhc2UyID0gMHgyMDE4OwotCi1zdGF0aWMgaW50Ci1nZXRfbWVtYmVyX2lkICh4KQotICAgICBpbnQgeDsKLXsKLSAgaWYgKGlkczJbeF0pCi0gICAgewotICAgICAgcmV0dXJuIGlkczJbeF07Ci0gICAgfQotICBpZHMyW3hdID0gYmFzZTIrKzsKLSAgcmV0dXJuIGlkczJbeF07Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9vcmRpbmFyeV9pZCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGlmIChpZHMxW3hdKQotICAgIHsKLSAgICAgIHJldHVybiBpZHMxW3hdOwotICAgIH0KLSAgaWRzMVt4XSA9IGJhc2UxKys7Ci0gIHJldHVybiBpZHMxW3hdOwotfQotc3RhdGljIGNoYXIgKgotc2VjdGlvbl90cmFuc2xhdGUgKG4pCi0gICAgIGNoYXIgKm47Ci17Ci0gIGlmIChzdHJjbXAgKG4sICIudGV4dCIpID09IDApCi0gICAgcmV0dXJuICJQIjsKLSAgaWYgKHN0cmNtcCAobiwgIi5kYXRhIikgPT0gMCkKLSAgICByZXR1cm4gIkQiOwotICBpZiAoc3RyY21wIChuLCAiLmJzcyIpID09IDApCi0gICAgcmV0dXJuICJCIjsKLSAgcmV0dXJuIG47Ci19Ci0KLQotCi0jZGVmaW5lIERBVEUgIjk0MDIwMTA3MzAwMCI7CS8qIEp1c3QgYSB0aW1lIG9uIG15IGJpcnRoZGF5ICovCi0KLQotc3RhdGljCi1jaGFyICoKLXN0cmlwX3N1ZmZpeCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKnJlczsKLSAgZm9yIChpID0gMDsgbmFtZVtpXSAhPSAwICYmIG5hbWVbaV0gIT0gJy4nOyBpKyspCi0gICAgOwotICByZXMgPSAoY2hhciAqKSB4bWFsbG9jIChpICsgMSk7Ci0gIG1lbWNweSAocmVzLCBuYW1lLCBpKTsKLSAgcmVzW2ldID0gMDsKLSAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiBJVCBMRU4gc3R1ZmYgQ1MgKi8KLXN0YXRpYyB2b2lkCi1jaGVja3N1bSAoZmlsZSwgcHRyLCBzaXplLCBjb2RlKQotICAgICBGSUxFICpmaWxlOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgY29kZTsKLXsKLSAgaW50IGo7Ci0gIGludCBsYXN0OwotICBpbnQgc3VtID0gMDsKLSAgaW50IGJ5dGVzID0gc2l6ZSAvIDg7Ci0gIGxhc3QgPSAhKGNvZGUgJiAweGZmMDApOwotICBpZiAoc2l6ZSAmIDB4NykKLSAgICBhYm9ydCAoKTsKLSAgcHRyWzBdID0gY29kZSB8IChsYXN0ID8gMHg4MCA6IDApOwotICBwdHJbMV0gPSBieXRlcyArIDE7Ci0KLSAgZm9yIChqID0gMDsgaiA8IGJ5dGVzOyBqKyspCi0gICAgewotICAgICAgc3VtICs9IHB0cltqXTsKLSAgICB9Ci0gIC8qIEdsdWUgb24gYSBjaGVja3N1bSB0b28gKi8KLSAgcHRyW2J5dGVzXSA9IH5zdW07Ci0gIGZ3cml0ZSAocHRyLCBieXRlcyArIDEsIDEsIGZpbGUpOwotfQotCi0KLQotCi1zdGF0aWMgdm9pZAotd3JpdGVJTlQgKG4sIHB0ciwgaWR4LCBzaXplLCBmaWxlKQotICAgICBpbnQgbjsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0KLSAgaWYgKHNpemUgPT0gLTIpCi0gICAgc2l6ZSA9IGFkZHJzaXplOwotICBlbHNlIGlmIChzaXplID09IC0xKQotICAgIHNpemUgPSAwOwotCi0gIGlmIChieXRlID4gMjQwKQotICAgIHsKLSAgICAgIC8qIExldHMgd3JpdGUgb3V0IHRoYXQgcmVjb3JkIGFuZCBkbyBhbm90aGVyIG9uZSAqLwotICAgICAgY2hlY2tzdW0gKGZpbGUsIHB0ciwgKmlkeCwgY29kZSB8IDB4MTAwMCk7Ci0gICAgICAqaWR4ID0gMTY7Ci0gICAgICBieXRlID0gKmlkeCAvIDg7Ci0gICAgfQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIHB0cltieXRlXSA9IG47Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBwdHJbYnl0ZSArIDBdID0gbiA+PiA4OwotICAgICAgcHRyW2J5dGUgKyAxXSA9IG47Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBwdHJbYnl0ZSArIDBdID0gbiA+PiAyNDsKLSAgICAgIHB0cltieXRlICsgMV0gPSBuID4+IDE2OwotICAgICAgcHRyW2J5dGUgKyAyXSA9IG4gPj4gODsKLSAgICAgIHB0cltieXRlICsgM10gPSBuID4+IDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAqaWR4ICs9IHNpemUgKiA4OwotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZUJJVFMgKHZhbCwgcHRyLCBpZHgsIHNpemUpCi0gICAgIGludCB2YWw7Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotICBpbnQgYml0ID0gKmlkeCAlIDg7Ci0gIGludCBvbGQ7Ci0gICppZHggKz0gc2l6ZTsKLQotICBvbGQgPSBwdHJbYnl0ZV07Ci0gIC8qIFR1cm4gb2ZmIGFsbCBhYm91dCB0byBjaGFuZ2UgYml0cyAqLwotICBvbGQgJj0gfigofjAgPj4gKDggLSBiaXQgLSBzaXplKSkgJiAoKDEgPDwgc2l6ZSkgLSAxKSk7Ci0gIC8qIFR1cm4gb24gdGhlIGJpdHMgd2Ugd2FudCAqLwotICBvbGQgfD0gKHZhbCAmICgoMSA8PCBzaXplKSAtIDEpKSA8PCAoOCAtIGJpdCAtIHNpemUpOwotICBwdHJbYnl0ZV0gPSBvbGQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZUJBUlJBWSAoZGF0YSwgcHRyLCBpZHgsIHNpemUsIGZpbGUpCi0gICAgIGJhcnJheSBkYXRhOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaW50IGk7Ci0gIHdyaXRlSU5UIChkYXRhLmxlbiwgcHRyLCBpZHgsIDEsIGZpbGUpOwotICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5sZW47IGkrKykKLSAgICB7Ci0gICAgICB3cml0ZUlOVCAoZGF0YS5kYXRhW2ldLCBwdHIsIGlkeCwgMSwgZmlsZSk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZUNIQVJTIChzdHJpbmcsIHB0ciwgaWR4LCBzaXplLCBmaWxlKQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplOwotICAgICBGSUxFICpmaWxlOwotewotICBpbnQgaSA9ICppZHggLyA4OwotCi0gIGlmIChpID4gMjQwKQotICAgIHsKLSAgICAgIC8qIExldHMgd3JpdGUgb3V0IHRoYXQgcmVjb3JkIGFuZCBkbyBhbm90aGVyIG9uZSAqLwotICAgICAgY2hlY2tzdW0gKGZpbGUsIHB0ciwgKmlkeCwgY29kZSB8IDB4MTAwMCk7Ci0gICAgICAqaWR4ID0gMTY7Ci0gICAgICBpID0gKmlkeCAvIDg7Ci0gICAgfQotCi0gIGlmIChzaXplID09IDApCi0gICAgewotICAgICAgLyogVmFyaWFibGUgbGVuZ3RoIHN0cmluZyAqLwotICAgICAgc2l6ZSA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgICAgIHB0cltpKytdID0gc2l6ZTsKLSAgICB9Ci0KLSAgLyogQlVHIFdBSVRJTkcgVE8gSEFQUEVOICovCi0gIG1lbWNweSAocHRyICsgaSwgc3RyaW5nLCBzaXplKTsKLSAgaSArPSBzaXplOwotICAqaWR4ID0gaSAqIDg7Ci19Ci0KLSNkZWZpbmUgU1lTUk9GRl9TV0FQX09VVAotI2luY2x1ZGUgInN5c3JvZmYuYyIKLQotCi1zdGF0aWMgY2hhciAqcm5hbWVfc2hbXSA9Ci17Ci0gICJSMCIsICJSMSIsICJSMiIsICJSMyIsICJSNCIsICJSNSIsICJSNiIsICJSNyIsICJSOCIsICJSOSIsICJSMTAiLCAiUjExIiwgIlIxMiIsICJSMTMiLCAiUjE0IiwgIlIxNSIKLX07Ci0KLXN0YXRpYyBjaGFyICpybmFtZV9oODMwMFtdID0KLXsKLSAgIkVSMCIsICJFUjEiLCAiRVIyIiwgIkVSMyIsICJFUjQiLCAiRVI1IiwgIkVSNiIsICJFUjciLCAiUEMiLCAiQ0NSIgotfTsKLQotc3RhdGljIHZvaWQKLXdyX3RyICgpCi17Ci0gIC8qIFRoZSBUUiBibG9jayBpcyBub3Qgbm9ybWFsIC0gaXQgZG9lc24ndCBoYXZlIGFueSBjb250ZW50cy4gKi8KLQotICBzdGF0aWMgY2hhciBiW10gPSB7Ci0gICAgMHhmZiwJCQkvKiBJVCAqLwotICAgIDB4MDMsCQkJLyogUkwgKi8KLSAgICAweGZkLAkJCS8qIENTICovCi0gIH07Ci0gIGZ3cml0ZSAoYiwgMSwgc2l6ZW9mIChiKSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl91biAocHRyLCBzZmlsZSwgZmlyc3QsIG5zZWNzKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBmaXJzdDsKLSAgICAgaW50IG5zZWNzOwotewotICBzdHJ1Y3QgSVRfdW4gdW47Ci0KLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzOwotCi0gIHVuLnNwYXJlMSA9IDA7Ci0KLSAgaWYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1ApCi0gICAgdW4uZm9ybWF0ID0gRk9STUFUX0xNOwotICBlbHNlCi0gICAgdW4uZm9ybWF0ID0gRk9STUFUX09NOwotICB1bi5zcGFyZTEgPSAwOwotCi0KLSNpZiAxCi0gIHVuLm5zZWN0aW9ucyA9IHB0ci0+bnNlY3Rpb25zIC0gMTsJLyogIERvbid0IGNvdW50IHRoZSBhYnMgc2VjdGlvbiAqLwotI2Vsc2UKLSAgLypORVcgLSBvbmx5IGNvdW50IHNlY3Rpb25zIHdpdGggc2l6ZSAqLwotICB1bi5uc2VjdGlvbnMgPSBuc2VjczsKLSNlbmRpZgotCi0gIHVuLm5leHRkZWZzID0gMDsKLSAgdW4ubmV4dHJlZnMgPSAwOwotICAvKiBDb3VudCBhbGwgdGhlIHVuZGVmaW5lZCBhbmQgZGVmaW5lZCB2YXJpYWJsZXMgd2l0aCBnbG9iYWwgc2NvcGUgKi8KLQotICBpZiAoZmlyc3QpCi0gICAgewotICAgICAgZm9yIChzID0gcHRyLT5zeW1ib2xfbGlzdF9oZWFkOyBzOyBzID0gcy0+bmV4dF9pbl9vZmlsZV9saXN0KQotCXsKLQkgIGlmIChzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9kZWYKLQkgICAgICB8fCBzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKLQkgICAgdW4ubmV4dGRlZnMrKzsKLQotCSAgaWYgKHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X3JlZikKLQkgICAgdW4ubmV4dHJlZnMrKzsKLQl9Ci0gICAgfQotICB1bi50b29sID0gdG9vbG5hbWU7Ci0gIHVuLnRjZCA9IERBVEU7Ci0gIHVuLmxpbmtlciA9ICJMX0dYMDAiOwotICB1bi5sY2QgPSBEQVRFOwotICB1bi5uYW1lID0gc2ZpbGUtPm5hbWU7Ci0gIHN5c3JvZmZfc3dhcF91bl9vdXQgKGZpbGUsICZ1bik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyX2hkIChwKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLXsKLSAgc3RydWN0IElUX2hkIGhkOwotCi0gIGhkLnNwYXJlMSA9IDA7Ci0gIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKQotICAgIHsKLSAgICAgIGhkLm10ID0gTVRZUEVfQUJTX0xNOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhkLm10ID0gTVRZUEVfT01TX09SX0xNUzsKLSAgICB9Ci0gIGhkLmNkID0gREFURTsKLQotICBoZC5udSA9IHAtPm5zb3VyY2VzOwkJLyogQWx3YXlzIG9uZSB1bml0ICovCi0gIGhkLmNvZGUgPSAwOwkJCS8qIEFsd2F5cyBBU0NJSSAqLwotICBoZC52ZXIgPSAiMDIwMCI7CQkvKiBWZXJzaW9uIDIuMDAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX2g4MzAwOgotICAgICAgaGQuYXUgPSA4OwotICAgICAgaGQuc2kgPSAwOwotICAgICAgaGQuc3Bjc3ogPSAzMjsKLSAgICAgIGhkLnNlZ3N6ID0gMDsKLSAgICAgIGhkLnNlZ3NoID0gMDsKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9oODMwMDoKLQkgIGhkLmNwdSA9ICJIODMwMCI7Ci0JICBoZC5hZmwgPSAyOwotCSAgYWRkcnNpemUgPSAyOwotCSAgdG9vbG5hbWUgPSAiQ19IOC8zMDAiOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9oODMwMGg6Ci0JICBoZC5jcHUgPSAiSDgzMDBIIjsKLQkgIGhkLmFmbCA9IDQ7Ci0JICBhZGRyc2l6ZSA9IDQ7Ci0JICB0b29sbmFtZSA9ICJDX0g4LzMwMEgiOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9oODMwMHM6Ci0JICBoZC5jcHUgPSAiSDgzMDBTIjsKLQkgIGhkLmFmbCA9IDQ7Ci0JICBhZGRyc2l6ZSA9IDQ7Ci0JICB0b29sbmFtZSA9ICJDX0g4LzMwMFMiOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0KCk7Ci0JfQotICAgICAgcm5hbWVzID0gcm5hbWVfaDgzMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX3NoOgotICAgICAgaGQuYXUgPSA4OwotICAgICAgaGQuc2kgPSAwOwotICAgICAgaGQuYWZsID0gNDsKLSAgICAgIGhkLnNwY3N6ID0gMzI7Ci0gICAgICBoZC5zZWdzeiA9IDA7Ci0gICAgICBoZC5zZWdzaCA9IDA7Ci0gICAgICBoZC5jcHUgPSAiU0giOwotICAgICAgYWRkcnNpemUgPSA0OwotICAgICAgdG9vbG5hbWUgPSAiQ19TSCI7Ci0gICAgICBybmFtZXMgPSBybmFtZV9zaDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICYgRVhFQ19QKQotICAgIHsKLSAgICAgIGhkLmVwID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZC5lcCA9IDE7Ci0gICAgICBoZC51YW4gPSAwOwotICAgICAgaGQuc2EgPSAwOwotICAgICAgaGQuc2FkID0gMDsKLSAgICAgIGhkLmFkZHJlc3MgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICAgIH0KLQotICBoZC5vcyA9ICIiOwotICBoZC5zeXMgPSAiIjsKLSAgaGQubW4gPSBzdHJpcF9zdWZmaXggKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBzeXNyb2ZmX3N3YXBfaGRfb3V0IChmaWxlLCAmaGQpOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cl9zaCAocCwgc2VjKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjOwotewotICBzdHJ1Y3QgSVRfc2ggc2g7Ci0gIHNoLnVuaXQgPSAwOwotICBzaC5zZWN0aW9uID0gc2VjLT5udW1iZXI7Ci0jaWZkZWYgRk9PUDEKLSAgc2guc2VjdGlvbiA9IDA7Ci0jZW5kaWYKLSAgc3lzcm9mZl9zd2FwX3NoX291dCAoZmlsZSwgJnNoKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3Jfb2IgKHAsIHNlY3Rpb24pCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotewotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGludCBmaXJzdCA9IDE7Ci0gIHVuc2lnbmVkIGNoYXIgc3R1ZmZbMjAwXTsKLQotICBpID0gMDsKLSAgd2hpbGUgKGkgPCBzZWN0aW9uLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplKQotICAgIHsKLSAgICAgIHN0cnVjdCBJVF9vYiBvYjsKLSAgICAgIGludCB0b2RvID0gMjAwOwkJLyogQ29weSBpbiAyMDAgYnl0ZSBsdW1wcyAqLwotICAgICAgb2Iuc3BhcmUgPSAwOwotICAgICAgaWYgKGkgKyB0b2RvID4gc2VjdGlvbi0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQl0b2RvID0gc2VjdGlvbi0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSAtIGk7Ci0KLSAgICAgIGlmIChmaXJzdCkKLQl7Ci0JICBvYi5zYWYgPSAxOwotCSAgaWYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1ApCi0JICAgIG9iLmFkZHJlc3MgPSBzZWN0aW9uLT5hZGRyZXNzOwotCSAgZWxzZQotCSAgICBvYi5hZGRyZXNzID0gMDsKLQotCSAgZmlyc3QgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvYi5zYWYgPSAwOwotCX0KLQotICAgICAgb2IuY3BmID0gMDsJCS8qIE5ldmVyIGNvbXByZXNzICovCi0gICAgICBvYi5kYXRhLmxlbiA9IHRvZG87Ci0gICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24tPmJmZF9zZWN0aW9uLCBzdHVmZiwgaSwgdG9kbyk7Ci0gICAgICBvYi5kYXRhLmRhdGEgPSBzdHVmZjsKLSAgICAgIHN5c3JvZmZfc3dhcF9vYl9vdXQgKGZpbGUsICZvYiAvKiwgaSArIHRvZG8gPCBzZWN0aW9uLT5zaXplICovICk7Ci0gICAgICBpICs9IHRvZG87Ci0gICAgfQotICAvKiBOb3cgZmlsbCB0aGUgcmVzdCB3aXRoIGJsYW5rcyAqLwotICB3aGlsZSAoaSA8IChiZmRfc2l6ZV90eXBlKSBzZWN0aW9uLT5zaXplKQotICAgIHsKLSAgICAgIHN0cnVjdCBJVF9vYiBvYjsKLSAgICAgIGludCB0b2RvID0gMjAwOwkJLyogQ29weSBpbiAyMDAgYnl0ZSBsdW1wcyAqLwotICAgICAgb2Iuc3BhcmUgPSAwOwotICAgICAgaWYgKGkgKyB0b2RvID4gKGJmZF9zaXplX3R5cGUpIHNlY3Rpb24tPnNpemUpCi0JdG9kbyA9IHNlY3Rpb24tPnNpemUgLSBpOwotICAgICAgb2Iuc2FmID0gMDsKLQotICAgICAgb2IuY3BmID0gMDsJCS8qIE5ldmVyIGNvbXByZXNzICovCi0gICAgICBvYi5kYXRhLmxlbiA9IHRvZG87Ci0gICAgICBtZW1zZXQgKHN0dWZmLCAwLCB0b2RvKTsKLSAgICAgIG9iLmRhdGEuZGF0YSA9IHN0dWZmOwotICAgICAgc3lzcm9mZl9zd2FwX29iX291dCAoZmlsZSwgJm9iKTsKLSAgICAgIGkgKz0gdG9kbzsKLSAgICB9Ci0gIC8qIE5vdyBmaWxsIHRoZSByZXN0IHdpdGggYmxhbmtzICovCi0KLX0KLQotc3RhdGljIHZvaWQKLXdyX3JsIChwdHIsIHNlYykKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjOwotewotICBpbnQgbnIgPSBzZWMtPm5yZWxvY3M7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9yZWxvYyAqciA9IHNlYy0+cmVsb2NzICsgaTsKLSAgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqcmVmOwotICAgICAgc3RydWN0IElUX3JsIHJsOwotICAgICAgcmwuYXBvbCA9IDA7Ci0gICAgICBybC5ib3VuZGFyeSA9IDA7Ci0gICAgICBybC5zZWdtZW50ID0gMTsKLSAgICAgIHJsLnNpZ24gPSAwOwotICAgICAgcmwuY2hlY2sgPSAwOwotICAgICAgcmwuYWRkciA9IHItPm9mZnNldDsKLSAgICAgIHJsLmJpdGxvYyA9IDA7Ci0gICAgICBybC5mbGVuID0gMzI7CQkvKiBTSCBTcGVjaWZpYyAqLwotICAgICAgLyogV2hhdCBzb3J0IG9mIHJlbG9jID8gTG9vayBpbiB0aGUgc2VjdGlvbiB0byBmaW5kIG91dCAqLwotICAgICAgcmVmID0gci0+c3ltYm9sOwotICAgICAgaWYgKHJlZi0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfcmVmKQotCXsKLQkgIHJsLmJjb3VudCA9IDQ7CS8qIEFsd2F5cyA0IGZvciB1cyAqLwotCSAgcmwub3AgPSBPUF9FWFRfUkVGOwotCSAgcmwuc3ltbiA9IHJlZi0+ZXJfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UgaWYgKHJlZi0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19jb21tb24pCi0JewotCSAgcmwuYmNvdW50ID0gMTE7CS8qIEFsd2F5cyAxMSBmb3IgdXMgKi8KLQkgIHJsLm9wID0gT1BfU0VDX1JFRjsKLQkgIHJsLnNlY24gPSByZWYtPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0JICBybC5jb3Bjb2RlX2lzXzMgPSAzOwotCSAgcmwuYWxlbmd0aF9pc180ID0gNDsKLQkgIHJsLmFkZGVuZCA9IHJlZi0+d2hlcmUtPm9mZnNldCAtIHJlZi0+d2hlcmUtPnNlY3Rpb24tPmFkZHJlc3M7Ci0JICBybC5hb3Bjb2RlX2lzXzB4MjAgPSAweDIwOwotCX0KLQotICAgICAgZWxzZQotCXsKLQkgIHJsLmJjb3VudCA9IDExOwkvKiBBbHdheXMgMTEgZm9yIHVzICovCi0JICBybC5vcCA9IE9QX1NFQ19SRUY7Ci0JICBybC5zZWNuID0gcmVmLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCSAgcmwuY29wY29kZV9pc18zID0gMzsKLQkgIHJsLmFsZW5ndGhfaXNfNCA9IDQ7Ci0JICBybC5hZGRlbmQgPSAtcmVmLT53aGVyZS0+c2VjdGlvbi0+YWRkcmVzczsKLQkgIHJsLmFvcGNvZGVfaXNfMHgyMCA9IDB4MjA7Ci0JfQotICAgICAgcmwuZW5kID0gMHhmZjsKLSAgICAgIGlmIChybC5vcCA9PSBPUF9TRUNfUkVGCi0JICB8fCBybC5vcCA9PSBPUF9FWFRfUkVGKQotCXsKLQkgIHN5c3JvZmZfc3dhcF9ybF9vdXQgKGZpbGUsICZybCk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX29iamVjdF9ib2R5IChwKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDE7IGkgPCBwLT5uc2VjdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICB3cl9zaCAocCwgcC0+c2VjdGlvbnMgKyBpKTsKLSAgICAgIHdyX29iIChwLCBwLT5zZWN0aW9ucyArIGkpOwotICAgICAgd3JfcmwgKHAsIHAtPnNlY3Rpb25zICsgaSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3JfZHBzX3N0YXJ0IChzZmlsZSwgc2VjdGlvbiwgc2NvcGUsIHR5cGUsIG5lc3QpCi0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIHN0cnVjdCBJVF9kcHMgZHBzOwotICBkcHMuZW5kID0gMDsKLSAgZHBzLm9wdCA9IDA7Ci0gIGRwcy50eXBlID0gdHlwZTsKLSAgaWYgKHNjb3BlLT5zZWMpCi0gICAgewotICAgICAgZHBzLnNhbiA9IHNjb3BlLT5zZWMtPm51bWJlcjsKLSAgICAgIGRwcy5hZGRyZXNzID0gc2NvcGUtPm9mZnNldCAtIGZpbmRfYmFzZSAoc2ZpbGUsIHNjb3BlLT5zZWMpOwotICAgICAgZHBzLmJsb2NrX3NpemUgPSBzY29wZS0+c2l6ZTsKLSAgICAgIGlmIChkZWJ1ZykKLQl7Ci0JICBwcmludGYgKCJEUFMgJXMgJWQgJXhcbiIsCi0JCSAgc2ZpbGUtPm5hbWUsCi0JCSAgbmVzdCwKLQkJICBkcHMuYWRkcmVzcyk7Ci0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZHBzLnNhbiA9IDA7Ci0gICAgICBkcHMuYWRkcmVzcyA9IDA7Ci0gICAgICBkcHMuYmxvY2tfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIGRwcy5uZXN0aW5nID0gbmVzdDsKLSAgZHBzLm5lZyA9IDB4MTAwMTsKLSAgc3lzcm9mZl9zd2FwX2Rwc19vdXQgKGZpbGUsICZkcHMpOwotfQotCi1zdGF0aWMgdm9pZAotd3JfZHBzX2VuZCAoc2VjdGlvbiwgc2NvcGUsIHR5cGUpCi0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpzY29wZTsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIHN0cnVjdCBJVF9kcHMgZHBzOwotICBkcHMuZW5kID0gMTsKLSAgZHBzLnR5cGUgPSB0eXBlOwotICBzeXNyb2ZmX3N3YXBfZHBzX291dCAoZmlsZSwgJmRwcyk7Ci19Ci0KLXN0YXRpYyBpbnQgKgotbmludHMgKHgpCi0gICAgIGludCB4OwotewotICByZXR1cm4gKGludCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChpbnQpLCB4KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdhbGtfdHJlZV9zeW1ib2wgKCk7Ci1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZSwgbmVzdCkKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgICAgc3RydWN0IGNvZmZfdHlwZSAqdHlwZTsKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIHN3aXRjaCAodHlwZS0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3NlY2RlZl90eXBlOgotICAgIGNhc2UgY29mZl9iYXNpY190eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZGJ0OwotCi0Jc3dpdGNoICh0eXBlLT51LmJhc2ljKQotCSAgewotCSAgY2FzZSBUX05VTEw6Ci0JICBjYXNlIFRfVk9JRDoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfVk9JRDsKLQkgICAgZGJ0LnNpZ24gPSBCVFlQRV9VTlNQRUM7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfQ0hBUjoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfQ0hBUjsKLQkgICAgZGJ0LnNpZ24gPSBCVFlQRV9VTlNQRUM7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfU0hPUlQ6Ci0JICBjYXNlIFRfSU5UOgotCSAgY2FzZSBUX0xPTkc6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0lOVDsKLQkgICAgZGJ0LnNpZ24gPSBTSUdOX1NJR05FRDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9GTE9BVDoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfRkxPQVQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfU0lOR0xFOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9ET1VCTEU6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0ZMT0FUOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX0RPVUJMRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfTE5HREJMOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9GTE9BVDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9FWFRFTkRFRDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfVUNIQVI6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0NIQVI7Ci0JICAgIGRidC5zaWduID0gU0lHTl9VTlNJR05FRDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9VU0hPUlQ6Ci0JICBjYXNlIFRfVUlOVDoKLQkgIGNhc2UgVF9VTE9ORzoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfSU5UOwotCSAgICBkYnQuc2lnbiA9IFNJR05fVU5TSUdORUQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOwotCWRidC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOwotCWJyZWFrOwotICAgICAgfQotICAgIGNhc2UgY29mZl9wb2ludGVyX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RwdCBkcHQ7Ci0Jd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZS0+dS5wb2ludGVyLnBvaW50c190bywgbmVzdCArIDEpOwotCWRwdC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RwdF9vdXQgKGZpbGUsICZkcHQpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBjb2ZmX2Z1bmN0aW9uX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RmcCBkZnA7Ci0Jc3RydWN0IGNvZmZfc3ltYm9sICpwYXJhbTsKLQlkZnAuZW5kID0gMDsKLQlkZnAuc3BhcmUgPSAwOwotCWRmcC5ucGFyYW1zID0gdHlwZS0+dS5mdW5jdGlvbi5wYXJhbWV0ZXJzLT5udmFyczsKLQlkZnAubmVnID0gMHgxMDAxOwotCi0Jd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZS0+dS5mdW5jdGlvbi5mdW5jdGlvbl9yZXR1cm5zLCBuZXN0ICsgMSk7Ci0KLQlzeXNyb2ZmX3N3YXBfZGZwX291dCAoZmlsZSwgJmRmcCk7Ci0KLQlmb3IgKHBhcmFtID0gdHlwZS0+dS5mdW5jdGlvbi5wYXJhbWV0ZXJzLT52YXJzX2hlYWQ7Ci0JICAgICBwYXJhbTsKLQkgICAgIHBhcmFtID0gcGFyYW0tPm5leHQpCi0JICB7Ci0JICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBwYXJhbSwgbmVzdCk7Ci0JICB9Ci0JZGZwLmVuZCA9IDE7Ci0Jc3lzcm9mZl9zd2FwX2RmcF9vdXQgKGZpbGUsICZkZnApOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBjb2ZmX3N0cnVjdGRlZl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZGJ0OwotCXN0cnVjdCBJVF9kZHMgZGRzOwotCXN0cnVjdCBjb2ZmX3N5bWJvbCAqbWVtYmVyOwotCWRkcy5zcGFyZSA9IDA7Ci0JZGJ0LmJ0eXBlID0gQlRZUEVfU1RSVUNUOwotCWRidC5iaXRzaXplID0gdHlwZS0+c2l6ZTsKLQlkYnQuc2lnbiA9IFNJR05fVU5TUEVDOwotCWRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQlkYnQuc2lkID0gZ2V0X21lbWJlcl9pZCAodHlwZS0+dS5hc3RydWN0ZGVmLmlkeCk7Ci0JZGJ0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7Ci0JZGRzLmVuZCA9IDA7Ci0JZGRzLm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGRzX291dCAoZmlsZSwgJmRkcyk7Ci0JZm9yIChtZW1iZXIgPSB0eXBlLT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMtPnZhcnNfaGVhZDsKLQkgICAgIG1lbWJlcjsKLQkgICAgIG1lbWJlciA9IG1lbWJlci0+bmV4dCkKLQkgIHsKLQkgICAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIDAsIG1lbWJlciwgbmVzdCArIDEpOwotCSAgfQotCi0JZGRzLmVuZCA9IDE7Ci0Jc3lzcm9mZl9zd2FwX2Rkc19vdXQgKGZpbGUsICZkZHMpOwotCi0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0cmVmX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0JZGJ0LmJ0eXBlID0gQlRZUEVfVEFHOwotCWRidC5iaXRzaXplID0gdHlwZS0+c2l6ZTsKLQlkYnQuc2lnbiA9IFNJR05fVU5TUEVDOwotCWRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQlpZiAodHlwZS0+dS5hc3RydWN0cmVmLnJlZikKLQkgIHsKLQkgICAgZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYXN0cnVjdHJlZi5yZWYtPm51bWJlcik7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBkYnQuc2lkID0gMDsKLQkgIH0KLQotCWRidC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2FycmF5X3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RhciBkYXI7Ci0JaW50IGo7Ci0JaW50IGRpbXMgPSAxOwkJLyogT25seSBvdXRwdXQgb25lIGRpbWVuc2lvbiBhdCBhIHRpbWUgKi8KLQlkYXIuZGltcyA9IGRpbXM7Ci0JZGFyLnZhcmlhYmxlID0gbmludHMgKGRpbXMpOwotCWRhci5zdWJ0eXBlID0gbmludHMgKGRpbXMpOwotCWRhci5zcGFyZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWF4X3ZhcmlhYmxlID0gbmludHMgKGRpbXMpOwotCWRhci5tYXhzcGFyZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWF4ID0gbmludHMgKGRpbXMpOwotCWRhci5taW5fdmFyaWFibGUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1pbiA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWluc3BhcmUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLm5lZyA9IDB4MTAwMTsKLQlkYXIubGVuZ3RoID0gdHlwZS0+c2l6ZSAvIHR5cGUtPnUuYXJyYXkuZGltOwotCWZvciAoaiA9IDA7IGogPCBkaW1zOyBqKyspCi0JICB7Ci0JICAgIGRhci52YXJpYWJsZVtqXSA9IFZBUklBQkxFX0ZJWEVEOwotCSAgICBkYXIuc3VidHlwZVtqXSA9IFNVQl9JTlRFR0VSOwotCSAgICBkYXIuc3BhcmVbal0gPSAwOwotCSAgICBkYXIubWF4X3ZhcmlhYmxlW2pdID0gMDsKLQkgICAgZGFyLm1heFtqXSA9IHR5cGUtPnUuYXJyYXkuZGltOwotCSAgICBkYXIubWluX3ZhcmlhYmxlW2pdID0gMDsKLQkgICAgZGFyLm1pbltqXSA9IDE7CS8qIFdoeSBpc24ndCB0aGlzIDAgPyAqLwotCSAgfQotCXdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUtPnUuYXJyYXkuYXJyYXlfb2YsIG5lc3QgKyAxKTsKLQlzeXNyb2ZmX3N3YXBfZGFyX291dCAoZmlsZSwgJmRhcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZW51bWRlZl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZGJ0OwotCXN0cnVjdCBJVF9kZW4gZGVuOwotCXN0cnVjdCBjb2ZmX3N5bWJvbCAqbWVtYmVyOwotCWRidC5idHlwZSA9IEJUWVBFX0VOVU07Ci0JZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOwotCWRidC5zaWduID0gU0lHTl9VTlNQRUM7Ci0JZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCWRidC5zaWQgPSBnZXRfbWVtYmVyX2lkICh0eXBlLT51LmFlbnVtZGVmLmlkeCk7Ci0JZGJ0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7Ci0KLQlkZW4uZW5kID0gMDsKLQlkZW4ubmVnID0gMHgxMDAxOwotCWRlbi5zcGFyZSA9IDA7Ci0Jc3lzcm9mZl9zd2FwX2Rlbl9vdXQgKGZpbGUsICZkZW4pOwotCWZvciAobWVtYmVyID0gdHlwZS0+dS5hZW51bWRlZi5lbGVtZW50cy0+dmFyc19oZWFkOwotCSAgICAgbWVtYmVyOwotCSAgICAgbWVtYmVyID0gbWVtYmVyLT5uZXh0KQotCSAgewotCSAgICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgMCwgbWVtYmVyLCBuZXN0ICsgMSk7Ci0JICB9Ci0KLQlkZW4uZW5kID0gMTsKLQlzeXNyb2ZmX3N3YXBfZGVuX291dCAoZmlsZSwgJmRlbik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1yZWZfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQlkYnQuYnR5cGUgPSBCVFlQRV9UQUc7Ci0JZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOwotCWRidC5zaWduID0gU0lHTl9VTlNQRUM7Ci0JZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCWRidC5zaWQgPSBnZXRfbWVtYmVyX2lkICh0eXBlLT51LmFlbnVtcmVmLnJlZi0+bnVtYmVyKTsKLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIE9ic29sZXRlID8gCi0gICBzdGF0aWMgdm9pZAotICAgZHR5X3N0YXJ0ICgpCi0gICB7Ci0gICBzdHJ1Y3QgSVRfZHR5IGR0eTsKLSAgIGR0eS5lbmQgPSAwOwotICAgZHR5Lm5lZyA9IDB4MTAwMTsKLSAgIGR0eS5zcGFyZSA9IDA7Ci0gICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0gICB9Ci0KLSAgIHN0YXRpYyB2b2lkCi0gICBkdHlfc3RvcCAoKQotICAgewotICAgc3RydWN0IElUX2R0eSBkdHk7Ci0gICBkdHkuZW5kID0gMDsKLSAgIGR0eS5uZWcgPSAweDEwMDE7Ci0gICBkdHkuZW5kID0gMTsKLSAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLSAgIH0KLQotCi0gICBzdGF0aWMgdm9pZAotICAgZHVtcF90cmVlX3N0cnVjdHVyZSAoc2ZpbGUsIHN5bWJvbCwgdHlwZSwgbmVzdCkKLSAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgc3RydWN0IGNvZmZfdHlwZSAqdHlwZTsKLSAgIGludCBuZXN0OwotICAgewotICAgaWYgKHN5bWJvbC0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0gICB7Ci0KLQotICAgfQotCi0gICB9Ci0gKi8KLQotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV90eXBlIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KQotCi0gICAgIHN0cnVjdAotICAgICBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnR5cGU7Ci0gICAgIGludCBuZXN0OwotewotICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLSAgICB7Ci0KLSAgICAgIHN0cnVjdCBJVF9kdHkgZHR5OwotICAgICAgZHR5LmVuZCA9IDA7Ci0gICAgICBkdHkubmVnID0gMHgxMDAxOwotCi0gICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0gICAgICB3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KTsKLSAgICAgIGR0eS5lbmQgPSAxOwotICAgICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotCi0gICAgICB3cl9kcHNfc3RhcnQgKHNmaWxlLAotCQkgICAgc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKLQkJICAgIHN5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5jb2RlLAotCQkgICAgQkxPQ0tfVFlQRV9GVU5DVElPTiwgbmVzdCk7Ci0gICAgICB3cl9kcHNfc3RhcnQgKHNmaWxlLCBzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAotCQkgICAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsCi0JCSAgICBCTE9DS19UWVBFX0JMT0NLLCBuZXN0KTsKLSAgICAgIHdhbGtfdHJlZV9zY29wZSAoc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKLQkJICAgICAgIHNmaWxlLAotCQkgICAgICAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsCi0JCSAgICAgICBuZXN0ICsgMSwgQkxPQ0tfVFlQRV9CTE9DSyk7Ci0KLSAgICAgIHdyX2Rwc19lbmQgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsCi0JCSAgQkxPQ0tfVFlQRV9CTE9DSyk7Ci0gICAgICB3cl9kcHNfZW5kIChzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAotCQkgIHN5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5jb2RlLCBCTE9DS19UWVBFX0ZVTkNUSU9OKTsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBJVF9kdHkgZHR5OwotICAgICAgZHR5LmVuZCA9IDA7Ci0gICAgICBkdHkubmVnID0gMHgxMDAxOwotICAgICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgICAgd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZSwgbmVzdCk7Ci0gICAgICBkdHkuZW5kID0gMTsKLSAgICAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLSAgICB9Ci0KLX0KLQotCi0KLXN0YXRpYyB2b2lkCi13YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgc2VjdGlvbiwgc3ltYm9sLCBuZXN0KQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgICBpbnQgbmVzdDsKLXsKLSAgc3RydWN0IElUX2RzeSBkc3k7Ci0KLSAgbWVtc2V0KCZkc3ksIDAsIHNpemVvZihkc3kpKTsKLSAgZHN5Lm5lc3RpbmcgPSBuZXN0OwotCi0gIHN3aXRjaCAoc3ltYm9sLT50eXBlLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfZnVuY3Rpb25fdHlwZToKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfRlVOQzsKLSAgICAgIGRzeS5hc3NpZ24gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdHJlZl90eXBlOgotICAgIGNhc2UgY29mZl9wb2ludGVyX3R5cGU6Ci0gICAgY2FzZSBjb2ZmX2FycmF5X3R5cGU6Ci0gICAgY2FzZSBjb2ZmX2Jhc2ljX3R5cGU6Ci0gICAgY2FzZSBjb2ZmX2VudW1yZWZfdHlwZToKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfVkFSOwotICAgICAgZHN5LmFzc2lnbiA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZW51bWRlZl90eXBlOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9UQUc7Ci0gICAgICBkc3kuYXNzaWduID0gMDsKLSAgICAgIGRzeS5tYWdpYyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0ZGVmX3R5cGU6Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX1RBRzsKLSAgICAgIGRzeS5hc3NpZ24gPSAwOwotICAgICAgZHN5Lm1hZ2ljID0gc3ltYm9sLT50eXBlLT51LmFzdHJ1Y3RkZWYuaXNzdHJ1Y3QgPyAwIDogMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zZWNkZWZfdHlwZToKLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChzeW1ib2wtPndoZXJlLT53aGVyZSA9PSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3QpCi0gICAgewotICAgICAgZHN5LmFzc2lnbiA9IDA7Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX01FTUJFUjsKLSAgICB9Ci0gIGlmIChzeW1ib2wtPndoZXJlLT53aGVyZSA9PSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtKQotICAgIHsKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfRU5VTTsKLSAgICAgIGRzeS5hc3NpZ24gPSAwOwotICAgICAgZHN5LmV2YWxsZW4gPSA0OwotICAgICAgZHN5LmV2YWx1ZSA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbC0+dHlwZS0+dHlwZSA9PSBjb2ZmX3N0cnVjdGRlZl90eXBlCi0gICAgICB8fCBzeW1ib2wtPndoZXJlLT53aGVyZSA9PSBjb2ZmX3doZXJlX2VudGFnCi0gICAgICB8fCBzeW1ib2wtPndoZXJlLT53aGVyZSA9PSBjb2ZmX3doZXJlX3N0cnRhZykKLSAgICB7Ci0gICAgICBkc3kuc251bWJlciA9IGdldF9tZW1iZXJfaWQgKHN5bWJvbC0+bnVtYmVyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkc3kuc251bWJlciA9IGdldF9vcmRpbmFyeV9pZCAoc3ltYm9sLT5udW1iZXIpOwotICAgIH0KLQotCi0gIGRzeS5zbmFtZSA9IHN5bWJvbC0+bmFtZVswXSA9PSAnXycgPyBzeW1ib2wtPm5hbWUgKyAxIDogc3ltYm9sLT5uYW1lOwotCi0gIHN3aXRjaCAoc3ltYm9sLT52aXNpYmxlLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfdmlzX2NvbW1vbjoKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9kZWY6Ci0gICAgICBkc3kuYWluZm8gPSBBSU5GT19TVEFUSUNfRVhUX0RFRjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfZXh0X3JlZjoKLSAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1NUQVRJQ19FWFRfUkVGOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19pbnRfZGVmOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fU1RBVElDX0lOVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfYXV0bzoKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG9wYXJhbToKLSAgICAgIGRzeS5haW5mbyA9IEFJTkZPX0FVVE87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ2lzdGVyOgotICAgIGNhc2UgY29mZl92aXNfcmVncGFyYW06Ci0gICAgICBkc3kuYWluZm8gPSBBSU5GT19SRUc7Ci0gICAgICBicmVhazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfdGFnOgotICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdDoKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBkc3kuZGxlbmd0aCA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKLSAgc3dpdGNoIChzeW1ib2wtPndoZXJlLT53aGVyZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbW9yeToKLQotICAgICAgZHN5LnNlY3Rpb24gPSBzeW1ib2wtPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0jaWZkZWYgRk9PUAotICAgICAgZHN5LnNlY3Rpb24gPSAwOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDoKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW06Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0YWNrOgotICAgIGNhc2UgY29mZl93aGVyZV9yZWdpc3RlcjoKLSAgICBjYXNlIGNvZmZfd2hlcmVfdW5rbm93bjoKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RydGFnOgotCi0gICAgY2FzZSBjb2ZmX3doZXJlX2VudGFnOgotICAgIGNhc2UgY29mZl93aGVyZV90eXBlZGVmOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBzd2l0Y2ggKHN5bWJvbC0+d2hlcmUtPndoZXJlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtb3J5OgotICAgICAgZHN5LmFkZHJlc3MgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQgLSBmaW5kX2Jhc2UgKHNmaWxlLCBzeW1ib2wtPndoZXJlLT5zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9zdGFjazoKLSAgICAgIGRzeS5hZGRyZXNzID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0KLQotICAgICAgaWYgKHN5bWJvbC0+d2hlcmUtPmJpdHNpemUpCi0JewotCSAgaW50IGJpdHMgPSAoc3ltYm9sLT53aGVyZS0+b2Zmc2V0ICogOCArIHN5bWJvbC0+d2hlcmUtPmJpdG9mZnNldCk7Ci0JICBkc3kuYml0dW5pdCA9IDE7Ci0JICBkc3kuZmllbGRfbGVuID0gc3ltYm9sLT53aGVyZS0+Yml0c2l6ZTsKLQkgIGRzeS5maWVsZF9vZmYgPSAoYml0cyAvIDMyKSAqIDQ7Ci0JICBkc3kuZmllbGRfYml0b2ZmID0gYml0cyAlIDMyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkc3kuYml0dW5pdCA9IDA7Ci0KLQkgIGRzeS5maWVsZF9sZW4gPSBzeW1ib2wtPnR5cGUtPnNpemU7Ci0JICBkc3kuZmllbGRfb2ZmID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bToKLSAgICAgIC8qICAgICAgZHN5LmJpdHVuaXQgPSAwOwotICAgICAgICAgZHN5LmZpZWxkX2xlbiAgPSBzeW1ib2wtPnR5cGUtPnNpemU7Ci0gICAgICAgICBkc3kuZmllbGRfb2ZmID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OyAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3JlZ2lzdGVyOgotICAgIGNhc2UgY29mZl93aGVyZV91bmtub3duOgotICAgIGNhc2UgY29mZl93aGVyZV9zdHJ0YWc6Ci0KLSAgICBjYXNlIGNvZmZfd2hlcmVfZW50YWc6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3R5cGVkZWY6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChzeW1ib2wtPndoZXJlLT53aGVyZSA9PSBjb2ZmX3doZXJlX3JlZ2lzdGVyKQotICAgIGRzeS5yZWcgPSBybmFtZXNbc3ltYm9sLT53aGVyZS0+b2Zmc2V0XTsKLQotICBzd2l0Y2ggKHN5bWJvbC0+dmlzaWJsZS0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3Zpc19jb21tb246Ci0gICAgICAvKiBXZSBkbyB0aGlzICdjYXVzZSBjb21tb24gQyBzeW1ib2xzIGFyZSB0cmVhdGVkIGFzIGV4dGRlZnMgKi8KLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9kZWY6Ci0gICAgY2FzZSBjb2ZmX3Zpc19leHRfcmVmOgotCi0gICAgICBkc3kuZW5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29mZl92aXNfcmVncGFyYW06Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvcGFyYW06Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX1BBUkFNRVRFUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb2ZmX3Zpc19pbnRfZGVmOgotCi0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvOgotICAgIGNhc2UgY29mZl92aXNfcmVnaXN0ZXI6Ci0gICAgY2FzZSBjb2ZmX3Zpc190YWc6Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0OgotICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX2VudW06Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGRzeS5zZm4gPSAwOwotICBkc3kuc2xuID0gMjsKLQotICBkc3kubmVnID0gMHgxMDAxOwotCi0KLSAgc3lzcm9mZl9zd2FwX2RzeV9vdXQgKGZpbGUsICZkc3kpOwotCi0gIHdhbGtfdHJlZV90eXBlIChzZmlsZSwgc3ltYm9sLCBzeW1ib2wtPnR5cGUsIG5lc3QpOwotfQotCi0KLXN0YXRpYyB2b2lkCi13YWxrX3RyZWVfc2NvcGUgKHNlY3Rpb24sIHNmaWxlLCBzY29wZSwgbmVzdCwgdHlwZSkKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqc2NvcGU7Ci0gICAgIGludCBuZXN0OwotICAgICBpbnQgdHlwZTsKLXsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICp2YXJzOwotICBzdHJ1Y3QgY29mZl9zY29wZSAqY2hpbGQ7Ci0KLSAgaWYgKHNjb3BlLT52YXJzX2hlYWQKLSAgICAgIHx8IChzY29wZS0+bGlzdF9oZWFkICYmIHNjb3BlLT5saXN0X2hlYWQtPnZhcnNfaGVhZCkpCi0gICAgewotICAgICAgd3JfZHBzX3N0YXJ0IChzZmlsZSwgc2VjdGlvbiwgc2NvcGUsIHR5cGUsIG5lc3QpOwotCi0gICAgICBpZiAobmVzdCA9PSAwKQotCXdyX2dsb2JhbHMgKHRyZWUsIHNmaWxlLCBuZXN0ICsgMSk7Ci0KLSAgICAgIGZvciAodmFycyA9IHNjb3BlLT52YXJzX2hlYWQ7IHZhcnM7IHZhcnMgPSB2YXJzLT5uZXh0KQotCXsKLQkgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCBzZWN0aW9uLCB2YXJzLCBuZXN0KTsKLQl9Ci0KLSAgICAgIGZvciAoY2hpbGQgPSBzY29wZS0+bGlzdF9oZWFkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKLQl7Ci0JICB3YWxrX3RyZWVfc2NvcGUgKHNlY3Rpb24sIHNmaWxlLCBjaGlsZCwgbmVzdCArIDEsIEJMT0NLX1RZUEVfQkxPQ0spOwotCX0KLQotICAgICAgd3JfZHBzX2VuZCAoc2VjdGlvbiwgc2NvcGUsIHR5cGUpOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkCi13YWxrX3RyZWVfc2ZpbGUgKHNlY3Rpb24sIHNmaWxlKQotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci17Ci0gIHdhbGtfdHJlZV9zY29wZSAoc2VjdGlvbiwgc2ZpbGUsIHNmaWxlLT5zY29wZSwgMCwgQkxPQ0tfVFlQRV9DT01QVU5JVCk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdyX3Byb2dyYW1fc3RydWN0dXJlIChwLCBzZmlsZSkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLXsKLQotICB3YWxrX3RyZWVfc2ZpbGUgKHAtPnNlY3Rpb25zICsgNCwgc2ZpbGUpOwotCi19Ci0KLXN0YXRpYyB2b2lkCi13cl9kdSAocCwgc2ZpbGUsIG4pCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBuOwotewotICBzdHJ1Y3QgSVRfZHUgZHU7Ci0gIGludCBsaW07Ci0jaWYgMAotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgc3RhdGljIGludCBpbmNpdCA9IDB4NTAwMDAwOwotICBpbnQgdXNlZCA9IDA7Ci0jZW5kaWYKLSAgaW50IGk7Ci0gIGludCBqOwotICB1bnNpZ25lZCBpbnQgKmxvd2VzdCA9ICh1bnNpZ25lZCAqKSBuaW50cyAocC0+bnNlY3Rpb25zKTsKLSAgdW5zaWduZWQgaW50ICpoaWdoZXN0ID0gKHVuc2lnbmVkICopIG5pbnRzIChwLT5uc2VjdGlvbnMpOwotICBkdS5mb3JtYXQgPSBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QID8gMCA6IDE7Ci0gIGR1Lm9wdGltaXplZCA9IDA7Ci0gIGR1LnN0YWNrZnJtdCA9IDA7Ci0gIGR1LnNwYXJlID0gMDsKLSAgZHUudW5pdCA9IG47Ci0gIGR1LnNlY3Rpb25zID0gcC0+bnNlY3Rpb25zIC0gMTsKLSAgZHUuc2FuID0gKGludCAqKSB4Y2FsbG9jIChzaXplb2YgKGludCksIGR1LnNlY3Rpb25zKTsKLSAgZHUuYWRkcmVzcyA9IG5pbnRzIChkdS5zZWN0aW9ucyk7Ci0gIGR1Lmxlbmd0aCA9IG5pbnRzIChkdS5zZWN0aW9ucyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGR1LnNlY3Rpb25zOyBpKyspCi0gICAgewotICAgICAgbG93ZXN0W2ldID0gfjA7Ci0gICAgICBoaWdoZXN0W2ldID0gMDsKLSAgICB9Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgc3ltYm9scyBhbmQgdHJ5IGFuZCB3b3JrIG91dCB0aGUgZXh0ZW50cyBpbiB0aGlzCi0gICAgIHNvdXJjZSBmaWxlICovCi0jaWYgMAotICBmb3IgKHN5bWJvbCA9IHNmaWxlLT5zY29wZS0+dmFyc19oZWFkOwotICAgICAgIHN5bWJvbDsKLSAgICAgICBzeW1ib2wgPSBzeW1ib2wtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN5bWJvbC0+dHlwZS0+dHlwZSA9PSBjb2ZmX3NlY2RlZl90eXBlKQotCXsKLQkgIHVuc2lnbmVkIGludCBsb3cgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0JICB1bnNpZ25lZCBpbnQgaGlnaCA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldCArIHN5bWJvbC0+dHlwZS0+c2l6ZSAtIDE7Ci0JICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uID0gc3ltYm9sLT53aGVyZS0+c2VjdGlvbjsKLQotCSAgaW50IHNuID0gc2VjdGlvbi0+bnVtYmVyOwotCSAgaWYgKGxvdyA8IGxvd2VzdFtzbl0pCi0JICAgIGxvd2VzdFtzbl0gPSBsb3c7Ci0JICBpZiAoaGlnaCA+IGhpZ2hlc3Rbc25dKQotCSAgICBoaWdoZXN0W3NuXSA9IGhpZ2g7Ci0JfQotICAgIH0KLQotCi0gIGZvciAoaSA9IDA7IGkgPCBkdS5zZWN0aW9uczsgaSsrKQotICAgIHsKLSAgICAgIGlmIChoaWdoZXN0W2ldID09IDApCi0JewotCSAgbG93ZXN0W2ldID0gaGlnaGVzdFtpXSA9IGluY2l0OwotCX0KLSAgICAgIGR1LnNhblt1c2VkXSA9IGk7Ci0gICAgICBkdS5sZW5ndGhbdXNlZF0gPSBoaWdoZXN0W2ldIC0gbG93ZXN0W2ldOwotICAgICAgZHUuYWRkcmVzc1t1c2VkXSA9IGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1AgPyBsb3dlc3RbaV0gOiAwOwotICAgICAgaWYgKGRlYnVnKQotCXsKLQkgIHByaW50ZiAoIiBzZWN0aW9uICU2cyAweCUwOHguLjB4JTA4eFxuIiwKLQkJICBwLT5zZWN0aW9uc1tpICsgMV0ubmFtZSwKLQkJICBsb3dlc3RbaV0sCi0JCSAgaGlnaGVzdFtpXSk7Ci0JfQotICAgICAgdXNlZCsrOwotICAgIH0KLQotI2VuZGlmCi0gIGxpbSA9IGR1LnNlY3Rpb25zOwotICBmb3IgKGogPSAwOyBqIDwgbGltOyBqKyspCi0gICAgewotICAgICAgaW50IHNyYyA9IGo7Ci0gICAgICBpbnQgZHN0ID0gajsKLSAgICAgIGR1LnNhbltkc3RdID0gZHN0OwotICAgICAgaWYgKHNmaWxlLT5zZWN0aW9uW3NyY10uaW5pdCkKLQl7Ci0JICBkdS5sZW5ndGhbZHN0XQotCSAgICA9IHNmaWxlLT5zZWN0aW9uW3NyY10uaGlnaCAtIHNmaWxlLT5zZWN0aW9uW3NyY10ubG93ICsgMTsKLQkgIGR1LmFkZHJlc3NbZHN0XQotCSAgICA9IHNmaWxlLT5zZWN0aW9uW3NyY10ubG93OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkdS5sZW5ndGhbZHN0XSA9IDA7Ci0JICBkdS5hZGRyZXNzW2RzdF0gPSAwOwotCX0KLSAgICAgIGlmIChkZWJ1ZykKLQl7Ci0JICBpZiAoc2ZpbGUtPnNlY3Rpb25bc3JjXS5wYXJlbnQpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgc2VjdGlvbiAlNnMgMHglMDh4Li4weCUwOHhcbiIsCi0JCSAgICAgIHNmaWxlLT5zZWN0aW9uW3NyY10ucGFyZW50LT5uYW1lLAotCQkgICAgICBkdS5hZGRyZXNzW2RzdF0sCi0JCSAgICAgIGR1LmFkZHJlc3NbZHN0XSArIGR1Lmxlbmd0aFtkc3RdIC0gMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBkdS5zZWN0aW9ucyA9IGRzdCArIDE7Ci0gICAgfQotCi0gIGR1LnRvb2wgPSAiY19nY2MiOwotICBkdS5kYXRlID0gREFURTsKLQotICBzeXNyb2ZmX3N3YXBfZHVfb3V0IChmaWxlLCAmZHUpOwotfQotCi1zdGF0aWMgdm9pZAotd3JfZHVzIChwLCBzZmlsZSkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLXsKLQotICBzdHJ1Y3QgSVRfZHVzIGR1czsKLQotICBkdXMuZWZuID0gMHgxMDAxOwotICBkdXMubnMgPSAxOwkJCS8qIHAtPm5zb3VyY2VzOyBzYWMgMTQganVsIDk0ICovCi0gIGR1cy5kcmIgPSBuaW50cyAoZHVzLm5zKTsKLSAgZHVzLmZuYW1lID0gKGNoYXIgKiopIHhjYWxsb2MgKHNpemVvZiAoY2hhciAqKSwgZHVzLm5zKTsKLSAgZHVzLnNwYXJlID0gbmludHMgKGR1cy5ucyk7Ci0gIGR1cy5uZGlyID0gMDsKLSAgLyogRmluZCB0aGUgZmlsZW5hbWVzICovCi0jaWYgMAotICBpID0gMDsKLQotICBmb3IgKHNmaWxlID0gcC0+c291cmNlX2hlYWQ7Ci0gICAgICAgc2ZpbGU7Ci0gICAgICAgc2ZpbGUgPSBzZmlsZS0+bmV4dCkKLSAgICB7Ci0gICAgICBkdXMuZHJiW2ldID0gMDsKLSAgICAgIGR1cy5zcGFyZVtpXSA9IDA7Ci0gICAgICBkdXMuZm5hbWVbaV0gPSBzZmlsZS0+bmFtZTsKLSAgICAgIGkrKzsKLSAgICB9Ci0jZWxzZQotICBkdXMuZHJiWzBdID0gMDsKLSAgZHVzLmZuYW1lWzBdID0gc2ZpbGUtPm5hbWU7Ci0jZW5kaWYKLQotICBzeXNyb2ZmX3N3YXBfZHVzX291dCAoZmlsZSwgJmR1cyk7Ci0KLX0KLQotLyogRmluZCB0aGUgb2Zmc2V0IG9mIHRoZSAudGV4dCBzZWN0aW9uIGZvciB0aGlzIHNmaWxlIGluIHRoZQotICAgLnRleHQgc2VjdGlvbiBmb3IgdGhlIG91dHB1dCBmaWxlICovCi0KLXN0YXRpYyBpbnQKLWZpbmRfYmFzZSAoc2ZpbGUsIHNlY3Rpb24pCi0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgcmV0dXJuIHNmaWxlLT5zZWN0aW9uW3NlY3Rpb24tPm51bWJlcl0ubG93OwotfQotc3RhdGljIHZvaWQKLXdyX2RsbiAocCwgc2ZpbGUsIG4pCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBuOwotCi17Ci0jaWYgMAotICBpZiAobiA9PSAwKQotICAgIHsKLSAgICAgIC8qIENvdW50IHVwIGFsbCB0aGUgbGluZW51bWJlcnMgKi8KLSAgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3k7Ci0gICAgICBpbnQgbGMgPSAwOwotICAgICAgc3RydWN0IElUX2RsbiBkbG47Ci0KLSAgICAgIGludCBpZHg7Ci0KLSAgICAgIGZvciAoc3kgPSBwLT5zeW1ib2xfbGlzdF9oZWFkOwotCSAgIHN5OwotCSAgIHN5ID0gc3ktPm5leHRfaW5fb2ZpbGVfbGlzdCkKLQl7Ci0JICBzdHJ1Y3QgY29mZl90eXBlICp0ID0gc3ktPnR5cGU7Ci0JICBpZiAodC0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5lICpsID0gdC0+dS5mdW5jdGlvbi5saW5lczsKLQkgICAgICBsYyArPSBsLT5ubGluZXM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGRsbi5zZm4gPSBuaW50cyAobGMpOwotICAgICAgZGxuLnNsbiA9IG5pbnRzIChsYyk7Ci0gICAgICBkbG4ubGxuID0gbmludHMgKGxjKTsKLSAgICAgIGRsbi5zZWN0aW9uID0gbmludHMgKGxjKTsKLQotICAgICAgZGxuLmZyb21fYWRkcmVzcyA9IG5pbnRzIChsYyk7Ci0gICAgICBkbG4udG9fYWRkcmVzcyA9IG5pbnRzIChsYyk7Ci0KLQotICAgICAgZGxuLm5lZyA9IDB4MTAwMTsKLQotICAgICAgZGxuLm5sbiA9IGxjOwotCi0gICAgICAvKiBSdW4gdGhyb3VnaCBvbmNlIG1vcmUgYW5kIGZpbGwgdXAgdGhlIHN0cnVjdHVyZSAqLwotICAgICAgaWR4ID0gMDsKLSAgICAgIGZvciAoc3kgPSBwLT5zeW1ib2xfbGlzdF9oZWFkOwotCSAgIHN5OwotCSAgIHN5ID0gc3ktPm5leHRfaW5fb2ZpbGVfbGlzdCkKLQl7Ci0JICBpZiAoc3ktPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotCSAgICB7Ci0JICAgICAgaW50IGk7Ci0JICAgICAgc3RydWN0IGNvZmZfbGluZSAqbCA9IHN5LT50eXBlLT51LmZ1bmN0aW9uLmxpbmVzOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBsLT5ubGluZXM7IGkrKykKLQkJewotCQkgIGRsbi5zZWN0aW9uW2lkeF0gPSBzeS0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkJICBkbG4uc2ZuW2lkeF0gPSBuOwotCQkgIGRsbi5zbG5baWR4XSA9IGwtPmxpbmVzW2ldOwotCQkgIGRsbi5mcm9tX2FkZHJlc3NbaWR4XSA9IGwtPmFkZHJlc3Nlc1tpXTsKLQkJICBpZiAoaWR4KQotCQkgICAgZGxuLnRvX2FkZHJlc3NbaWR4IC0gMV0gPSBkbG4uZnJvbV9hZGRyZXNzW2lkeF07Ci0JCSAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCSAgbisrOwotCX0KLSAgICAgIHN5c3JvZmZfc3dhcF9kbG5fb3V0IChmaWxlLCAmZGxuKTsKLSAgICB9Ci0KLSNlbmRpZgotI2lmIDEKLSAgLyogQ291bnQgdXAgYWxsIHRoZSBsaW5lbnVtYmVycyAqLwotCi0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3k7Ci0gIGludCBsYyA9IDA7Ci0gIHN0cnVjdCBJVF9kbG4gZGxuOwotCi0gIGludCBpZHg7Ci0KLSAgZm9yIChzeSA9IHNmaWxlLT5zY29wZS0+dmFyc19oZWFkOwotICAgICAgIHN5OwotICAgICAgIHN5ID0gc3ktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfdHlwZSAqdCA9IHN5LT50eXBlOwotICAgICAgaWYgKHQtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotCXsKLQkgIHN0cnVjdCBjb2ZmX2xpbmUgKmwgPSB0LT51LmZ1bmN0aW9uLmxpbmVzOwotCSAgaWYgKGwpCi0JICAgIGxjICs9IGwtPm5saW5lczsKLQl9Ci0gICAgfQotCi0gIGRsbi5zZm4gPSBuaW50cyAobGMpOwotICBkbG4uc2xuID0gbmludHMgKGxjKTsKLSAgZGxuLmNjID0gbmludHMgKGxjKTsKLSAgZGxuLnNlY3Rpb24gPSBuaW50cyAobGMpOwotCi0gIGRsbi5mcm9tX2FkZHJlc3MgPSBuaW50cyAobGMpOwotICBkbG4udG9fYWRkcmVzcyA9IG5pbnRzIChsYyk7Ci0KLQotICBkbG4ubmVnID0gMHgxMDAxOwotCi0gIGRsbi5ubG4gPSBsYzsKLQotICAvKiBSdW4gdGhyb3VnaCBvbmNlIG1vcmUgYW5kIGZpbGwgdXAgdGhlIHN0cnVjdHVyZSAqLwotICBpZHggPSAwOwotICBmb3IgKHN5ID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7Ci0gICAgICAgc3k7Ci0gICAgICAgc3kgPSBzeS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3ktPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotCXsKLQkgIGludCBpOwotCSAgc3RydWN0IGNvZmZfbGluZSAqbCA9IHN5LT50eXBlLT51LmZ1bmN0aW9uLmxpbmVzOwotCSAgaWYgKGwpCi0JICAgIHsKLQkgICAgICBpbnQgYmFzZSA9IGZpbmRfYmFzZSAoc2ZpbGUsIHN5LT53aGVyZS0+c2VjdGlvbik7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGwtPm5saW5lczsgaSsrKQotCQl7Ci0JCSAgZGxuLnNlY3Rpb25baWR4XSA9IHN5LT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCQkgIGRsbi5zZm5baWR4XSA9IDA7Ci0JCSAgZGxuLnNsbltpZHhdID0gbC0+bGluZXNbaV07Ci0JCSAgZGxuLmZyb21fYWRkcmVzc1tpZHhdID0KLQkJICAgIGwtPmFkZHJlc3Nlc1tpXSArIHN5LT53aGVyZS0+c2VjdGlvbi0+YWRkcmVzcyAtIGJhc2U7Ci0JCSAgZGxuLmNjW2lkeF0gPSAwOwotCQkgIGlmIChpZHgpCi0JCSAgICBkbG4udG9fYWRkcmVzc1tpZHggLSAxXSA9IGRsbi5mcm9tX2FkZHJlc3NbaWR4XTsKLQkJICBpZHgrKzsKLQotCQl9Ci0JICAgICAgZGxuLnRvX2FkZHJlc3NbaWR4IC0gMV0gPSBkbG4uZnJvbV9hZGRyZXNzW2lkeCAtIDFdICsgMjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChsYykKLSAgICBzeXNyb2ZmX3N3YXBfZGxuX291dCAoZmlsZSwgJmRsbik7Ci0jZW5kaWYKLX0KLQotLyogV3JpdGUgdGhlIGdsb2JhbCBzeW1ib2xzIG91dCB0byB0aGUgZGVidWcgaW5mbyAqLwotc3RhdGljIHZvaWQKLXdyX2dsb2JhbHMgKHAsIHNmaWxlLCBuKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgbjsKLXsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeTsKLSAgZm9yIChzeSA9IHAtPnN5bWJvbF9saXN0X2hlYWQ7Ci0gICAgICAgc3k7Ci0gICAgICAgc3kgPSBzeS0+bmV4dF9pbl9vZmlsZV9saXN0KQotICAgIHsKLSAgICAgIGlmIChzeS0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfZGVmCi0JICB8fCBzeS0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfcmVmKQotCXsKLQkgIC8qIE9ubHkgd3JpdGUgb3V0IHN5bWJvbHMgaWYgdGhleSBiZWxvbmcgdG8KLQkgICAgIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlICovCi0JICBpZiAoc3ktPnNmaWxlID09IHNmaWxlKQotCSAgICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgMCwgc3ksIDApOwotCi0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX2RlYnVnIChwKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLXsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICBpbnQgbiA9IDA7Ci0gIGZvciAoc2ZpbGUgPSBwLT5zb3VyY2VfaGVhZDsKLSAgICAgICBzZmlsZTsKLSAgICAgICBzZmlsZSA9IHNmaWxlLT5uZXh0KQotCi0gICAgewotICAgICAgaWYgKGRlYnVnKQotCXsKLQkgIHByaW50ZiAoIiVzXG4iLCBzZmlsZS0+bmFtZSk7Ci0JfQotICAgICAgd3JfZHUgKHAsIHNmaWxlLCBuKTsKLSAgICAgIHdyX2R1cyAocCwgc2ZpbGUpOwotICAgICAgd3JfcHJvZ3JhbV9zdHJ1Y3R1cmUgKHAsIHNmaWxlKTsKLSAgICAgIHdyX2RsbiAocCwgc2ZpbGUsIG4pOwotICAgICAgbisrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX2NzICgpCi17Ci0gIC8qIEl0IHNlZW1zIHRoYXQgdGhlIENTIHN0cnVjdCBpcyBub3Qgbm9ybWFsIC0gdGhlIHNpemUgaXMgd3JvbmcKLSAgICAgaGVyZXMgb25lIEkgcHJlcGFyZWQgZWFybGllci4uICovCi0gIHN0YXRpYyBjaGFyIGJbXSA9IHsKLSAgICAweDgwLAkJCS8qIElUICovCi0gICAgMHgyMSwJCQkvKiBSTCAqLwotICAgIDB4MDAsCQkJLyogbnVtYmVyIG9mIGNoYXJzIGluIHZhcmlhYmxlIGxlbmd0aCBwYXJ0ICovCi0gICAgMHg4MCwJCQkvKiBoZCAqLyAKLSAgICAweDAwLAkJCS8qIGhzICovIAotICAgIDB4ODAsCQkJLyogdW4gKi8gCi0gICAgMHgwMCwJCQkvKiB1cyAqLyAKLSAgICAweDgwLAkJCS8qIHNjICovIAotICAgIDB4MDAsCQkJLyogc3MgKi8gCi0gICAgMHg4MCwJCQkvKiBlciAqLyAKLSAgICAweDgwLAkJCS8qIGVkICovIAotICAgIDB4ODAsCQkJLyogc2ggKi8gCi0gICAgMHg4MCwJCQkvKiBvYiAqLyAKLSAgICAweDgwLAkJCS8qIHJsICovIAotICAgIDB4ODAsCQkJLyogZHUgKi8KLSAgICAweDgwLAkJCS8qIGRwcyAqLwotICAgIDB4ODAsCQkJLyogZHN5ICovCi0gICAgMHg4MCwJCQkvKiBkdHkgKi8KLSAgICAweDgwLAkJCS8qIGRsbiAqLwotICAgIDB4ODAsCQkJLyogZHNvICovCi0gICAgMHg4MCwJCQkvKiBkdXMgKi8KLSAgICAweDAwLAkJCS8qIGRzcyAqLwotICAgIDB4ODAsCQkJLyogZGJ0ICovCi0gICAgMHgwMCwJCQkvKiBkcHAgKi8KLSAgICAweDgwLAkJCS8qIGRmcCAqLwotICAgIDB4ODAsCQkJLyogZGVuICovCi0gICAgMHg4MCwJCQkvKiBkZHMgKi8KLSAgICAweDgwLAkJCS8qIGRhciAqLwotICAgIDB4ODAsCQkJLyogZHB0ICovCi0gICAgMHgwMCwJCQkvKiBkdWwgKi8KLSAgICAweDAwLAkJCS8qIGRzZSAqLwotICAgIDB4MDAsCQkJLyogZG90ICovCi0gICAgMHhERQkJCS8qIENTICovCi0gIH07Ci0gIGZ3cml0ZSAoYiwgMSwgc2l6ZW9mIChiKSwgZmlsZSk7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgU0MgcmVjb3JkcyBmb3IgYSB1bml0LiAgQ3JlYXRlIGFuIFNDCi0gICBmb3IgYWxsIHRoZSBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIG91dHB1dCBmaWxlLCBldmVuCi0gICBpZiB0aGVyZSBpc24ndCBhbiBlcXVpdmFsZW50IG9uZSBvbiB0aGUgaW5wdXQgKi8KLQotc3RhdGljIGludAotd3Jfc2MgKHB0ciwgc2ZpbGUpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLXsKLSAgaW50IGk7Ci1pbnQgc2NvdW50ID0gMDsKLSAgLyogRmlyc3Qgd29yayBvdXQgdGhlIHRvdGFsIG51bWJlciBvZiBzZWN0aW9ucyAqLwotCi0gIGludCB0b3RhbF9zZWMgPSBwdHItPm5zZWN0aW9uczsKLQotICBzdHJ1Y3QgbXlpbmZvCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICAgfTsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0KLSAgc3RydWN0IG15aW5mbyAqaW5mbwotICAgID0gKHN0cnVjdCBteWluZm8gKikgY2FsbG9jICh0b3RhbF9zZWMsIHNpemVvZiAoc3RydWN0IG15aW5mbykpOwotCi0KLQotICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfc2VjOyBpKyspCi0gICAgewotICAgICAgaW5mb1tpXS5zZWMgPSBwdHItPnNlY3Rpb25zICsgaTsKLSAgICAgIGluZm9baV0uc3ltYm9sID0gMDsKLSAgICB9Ci0KLSAgZm9yIChzeW1ib2wgPSBzZmlsZS0+c2NvcGUtPnZhcnNfaGVhZDsKLSAgICAgICBzeW1ib2w7Ci0gICAgICAgc3ltYm9sID0gc3ltYm9sLT5uZXh0KQotICAgIHsKLQotICAgICAgaWYgKHN5bWJvbC0+dHlwZS0+dHlwZSA9PSBjb2ZmX3NlY2RlZl90eXBlKQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9zZWM7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzeW1ib2wtPndoZXJlLT5zZWN0aW9uID09IGluZm9baV0uc2VjKQotCQl7Ci0JCSAgaW5mb1tpXS5zeW1ib2wgPSBzeW1ib2w7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTm93IG91dHB1dCBhbGwgdGhlIHNlY3Rpb24gaW5mbywgYW5kIGZha2UgdXAgc29tZSBzdHVmZiBmb3Igc2VjdGlvbnMKLSAgICAgd2UgZG9uJ3QgaGF2ZSAqLwotCi0gIGZvciAoaSA9IDE7IGkgPCB0b3RhbF9zZWM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgSVRfc2Mgc2M7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgc3ltYm9sID0gaW5mb1tpXS5zeW1ib2w7Ci0gICAgICBzYy5zcGFyZSA9IDA7Ci0gICAgICBzYy5zcGFyZTEgPSAwOwotICAgICAgaWYgKCFzeW1ib2wpCi0JewotCSAgLyogRG9uJ3QgaGF2ZSBhIHN5bWJvbCBzZXQgYXNpZGUgZm9yIHRoaXMgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCBub3RoaW5nCi0JICAgICBpbiB0aGlzIGZpbGUgZG9lcyBhbnl0aGluZyBmb3IgdGhlIHNlY3Rpb24uICovCi0JICBzYy5mb3JtYXQgPSAhKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1ApOwotCSAgc2MuYWRkciA9IDA7Ci0JICBzYy5sZW5ndGggPSAwOwotCSAgbmFtZSA9IGluZm9baV0uc2VjLT5uYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKLQkgICAgewotCSAgICAgIHNjLmZvcm1hdCA9IDA7Ci0JICAgICAgc2MuYWRkciA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2MuZm9ybWF0ID0gMTsKLQkgICAgICBzYy5hZGRyID0gMDsKLQkgICAgfQotCSAgc2MubGVuZ3RoID0gc3ltYm9sLT50eXBlLT5zaXplOwotCSAgbmFtZSA9IHN5bWJvbC0+bmFtZTsKLQl9Ci0KLSAgICAgIHNjLmFsaWduID0gNDsKLQotICAgICAgc2MuY29uY2F0ID0gQ09OQ0FUX1NJTVBMRTsKLSAgICAgIHNjLnJlYWQgPSAzOwotICAgICAgc2Mud3JpdGUgPSAzOwotICAgICAgc2MuZXhlYyA9IDM7Ci0gICAgICBzYy5pbml0ID0gMzsKLSAgICAgIHNjLm1vZGUgPSAzOwotICAgICAgc2Muc3BhcmUgPSAwOwotICAgICAgc2Muc2VnYWRkID0gMDsKLSAgICAgIHNjLnNwYXJlMSA9IDA7CQkvKiBJZiBub3QgemVybywgdGhlbiBpdCBkb2Vzbid0IHdvcmsgKi8KLSAgICAgIHNjLm5hbWUgPSBzZWN0aW9uX3RyYW5zbGF0ZSAobmFtZSk7Ci0gICAgICBpZiAoc3RybGVuIChzYy5uYW1lKSA9PSAxKQotCXsKLQkgIHN3aXRjaCAoc2MubmFtZVswXSkKLQkgICAgewotCSAgICBjYXNlICdEJzoKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgc2MuY29udGVudHMgPSBDT05URU5UU19EQVRBOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHNjLmNvbnRlbnRzID0gQ09OVEVOVFNfQ09ERTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYy5jb250ZW50cyA9IENPTlRFTlRTX0NPREU7Ci0JfQotI2lmIDAKLSAgICAgIC8qIE5FVyAqLwotICAgICAgaWYgKHNjLmxlbmd0aCkgewotI2VuZGlmCi0Jc3lzcm9mZl9zd2FwX3NjX291dCAoZmlsZSwgJnNjKTsKLQlzY291bnQrKzsKLSNpZiAwCi0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci1yZXR1cm4gc2NvdW50OwotfQotCi0KLS8qIFdyaXRlIG91dCB0aGUgRVIgcmVjb3JkcyBmb3IgYSB1bml0LiAqLwotc3RhdGljIHZvaWQKLXdyX2VyIChwdHIsIHNmaWxlLCBmaXJzdCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgZmlyc3Q7Ci17Ci0gIGludCBpZHggPSAwOwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bTsKLSAgaWYgKGZpcnN0KQotICAgIHsKLSAgICAgIGZvciAoc3ltID0gcHRyLT5zeW1ib2xfbGlzdF9oZWFkOyBzeW07IHN5bSA9IHN5bS0+bmV4dF9pbl9vZmlsZV9saXN0KQotCXsKLQkgIGlmIChzeW0tPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X3JlZikKLQkgICAgewotCSAgICAgIHN0cnVjdCBJVF9lciBlcjsKLQkgICAgICBlci5zcGFyZSA9IDA7Ci0JICAgICAgZXIudHlwZSA9IEVSX05PVFNQRUM7Ci0JICAgICAgZXIubmFtZSA9IHN5bS0+bmFtZTsKLQkgICAgICBzeXNyb2ZmX3N3YXBfZXJfb3V0IChmaWxlLCAmZXIpOwotCSAgICAgIHN5bS0+ZXJfbnVtYmVyID0gaWR4Kys7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgdGhlIEVEIHJlY29yZHMgZm9yIGEgdW5pdC4gKi8KLXN0YXRpYyB2b2lkCi13cl9lZCAocHRyLCBzZmlsZSwgZmlyc3QpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IGZpcnN0OwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnM7Ci0gIGlmIChmaXJzdCkKLSAgICB7Ci0gICAgICBmb3IgKHMgPSBwdHItPnN5bWJvbF9saXN0X2hlYWQ7IHM7IHMgPSBzLT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgaWYgKHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X2RlZgotCSAgICAgIHx8IHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfY29tbW9uKQotCSAgICB7Ci0JICAgICAgc3RydWN0IElUX2VkIGVkOwotCi0JICAgICAgZWQuc2VjdGlvbiA9IHMtPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0JICAgICAgZWQuc3BhcmUgPSAwOwotCSAgICAgIGlmIChzLT53aGVyZS0+c2VjdGlvbi0+ZGF0YSkKLQkJewotCQkgIGVkLnR5cGUgPSBFRF9UWVBFX0RBVEE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzLT53aGVyZS0+c2VjdGlvbi0+Y29kZSAmIFNFQ19DT0RFKQotCQl7Ci0JCSAgZWQudHlwZSA9IEVEX1RZUEVfRU5UUlk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBlZC50eXBlID0gRURfVFlQRV9OT1RTUEVDOwotCQkgIGVkLnR5cGUgPSBFRF9UWVBFX0RBVEE7Ci0JCX0KLQkgICAgICBlZC5hZGRyZXNzID0gcy0+d2hlcmUtPm9mZnNldCAtIHMtPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzOwotCSAgICAgIGVkLm5hbWUgPSBzLT5uYW1lOwotCSAgICAgIHN5c3JvZmZfc3dhcF9lZF9vdXQgKGZpbGUsICZlZCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3JfdW5pdF9pbmZvIChwdHIpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci17Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgaW50IGZpcnN0ID0gMTsKLSAgZm9yIChzZmlsZSA9IHB0ci0+c291cmNlX2hlYWQ7Ci0gICAgICAgc2ZpbGU7Ci0gICAgICAgc2ZpbGUgPSBzZmlsZS0+bmV4dCkKLSAgICB7Ci0gICAgICBsb25nIHAxOwotICAgICAgbG9uZyBwMjsKLSAgICAgIGludCBuc2VjczsKLSAgICAgIHAxID0gZnRlbGwgKGZpbGUpOwotICAgICAgd3JfdW4gKHB0ciwgc2ZpbGUsIGZpcnN0LCAwKTsKLSAgICAgIG5zZWNzID0gd3Jfc2MgKHB0ciwgc2ZpbGUpOwotICAgICAgcDIgPSBmdGVsbCAoZmlsZSk7Ci0gICAgICBmc2VlayAoZmlsZSwgcDEsIFNFRUtfU0VUKTsKLSAgICAgIHdyX3VuIChwdHIsIHNmaWxlLCBmaXJzdCwgbnNlY3MpOwotICAgICAgZnNlZWsgKGZpbGUsIHAyLCBTRUVLX1NFVCk7IAotICAgICAgd3JfZXIgKHB0ciwgc2ZpbGUsIGZpcnN0KTsKLSAgICAgIHdyX2VkIChwdHIsIHNmaWxlLCBmaXJzdCk7Ci0gICAgICBmaXJzdCA9IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3JfbW9kdWxlIChwKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLXsKLSAgd3JfY3MgKCk7Ci0gIHdyX2hkIChwKTsKLSAgd3JfdW5pdF9pbmZvIChwKTsKLSAgd3Jfb2JqZWN0X2JvZHkgKHApOwotICB3cl9kZWJ1ZyAocCk7Ci0gIHdyX3RyICgpOwotfQotCi1zdGF0aWMgaW50Ci1hbGlnbiAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHJldHVybiAoeCArIDMpICYgfjM7Ci19Ci0KLS8qIEZpbmQgYWxsIHRoZSBjb21tb24gdmFyaWFibGVzIGFuZCB0dXJuIHRoZW0gaW50bwotICAgb3JkaW5hcnkgZGVmcyAtIGR1bm5vIHdoeSwgYnV0IHRoYXRzIHdoYXQgaGl0YWNoaSBkb2VzIHdpdGggJ2VtICovCi0KLXN0YXRpYyB2b2lkCi1wcmVzY2FuICh0cmVlKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqdHJlZTsKLXsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzOwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpjb21tb25fc2VjdGlvbjsKLSAgLyogRmluZCB0aGUgY29tbW9uIHNlY3Rpb24gLSBhbHdheXMgc2VjdGlvbiAzICovCi0gIGNvbW1vbl9zZWN0aW9uID0gdHJlZS0+c2VjdGlvbnMgKyAzOwotICBmb3IgKHMgPSB0cmVlLT5zeW1ib2xfbGlzdF9oZWFkOwotICAgICAgIHM7Ci0gICAgICAgcyA9IHMtPm5leHRfaW5fb2ZpbGVfbGlzdCkKLSAgICB7Ci0gICAgICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19jb21tb24pCi0JewotCSAgc3RydWN0IGNvZmZfd2hlcmUgKncgPSBzLT53aGVyZTsKLQkgIC8qICAgICAgcy0+dmlzaWJsZS0+dHlwZSA9IGNvZmZfdmlzX2V4dF9kZWY7IGxlYXZlIGl0IGFzIGNvbW1vbiAqLwotCSAgY29tbW9uX3NlY3Rpb24tPnNpemUgPSBhbGlnbiAoY29tbW9uX3NlY3Rpb24tPnNpemUpOwotCSAgdy0+b2Zmc2V0ID0gY29tbW9uX3NlY3Rpb24tPnNpemUgKyBjb21tb25fc2VjdGlvbi0+YWRkcmVzczsKLQkgIHctPnNlY3Rpb24gPSBjb21tb25fc2VjdGlvbjsKLQkgIGNvbW1vbl9zZWN0aW9uLT5zaXplICs9IHMtPnR5cGUtPnNpemU7Ci0JICBjb21tb25fc2VjdGlvbi0+c2l6ZSA9IGFsaWduIChjb21tb25fc2VjdGlvbi0+c2l6ZSk7Ci0JfQotICAgIH0KLX0KLQotY2hhciAqcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgdm9pZAotc2hvd191c2FnZSAoZmlsZSwgc3RhdHVzKQotICAgICBGSUxFICpmaWxlOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChmaWxlLCBfKCJVc2FnZTogJXMgWy1kaFZxXSBpbi1maWxlIFtvdXQtZmlsZV1cbiIpLCBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IENvbnZlcnQgYSBDT0ZGIG9iamVjdCBmaWxlIGludG8gYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLQotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICphdltdOwotewotICBpbnQgb3B0OwotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci0gIHsKLSAgICB7ImRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdkJ30sCi0gICAgeyJxdWljayIsIG5vX2FyZ3VtZW50LCAwLCAncSd9LAotICAgIHsibm9wcmVzY2FuIiwgbm9fYXJndW1lbnQsIDAsICduJ30sCi0gICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gICAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJ30sCi0gICAge05VTEwsIG5vX2FyZ3VtZW50LCAwLCAwfQotICB9OwotICBjaGFyICoqbWF0Y2hpbmc7Ci0gIGNoYXIgKmlucHV0X2ZpbGU7Ci0gIGNoYXIgKm91dHB1dF9maWxlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhYywgYXYsICJkaFZxbiIsIGxvbmdfb3B0aW9ucywKLQkJCSAgICAgKGludCAqKSBOVUxMKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdxJzoKLQkgIHF1aWNrID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgbm9wcmVzY2FuID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgZGVidWcgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQgKi8KLQljYXNlICdWJzoKLQkgIHByaW50ZiAoXygiR05VICVzIHZlcnNpb24gJXNcbiIpLCBwcm9ncmFtX25hbWUsIFBST0dSQU1fVkVSU0lPTik7Ci0JICBleGl0ICgwKTsKLQkgIC8qTk9UUkVBQ0hFRCAqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEICovCi0JfQotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIG91dHB1dF9maWxlID0gTlVMTDsKLSAgaWYgKG9wdGluZCA8IGFjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGUgPSBhdltvcHRpbmRdOwotICAgICAgKytvcHRpbmQ7Ci0gICAgICBpZiAob3B0aW5kIDwgYWMpCi0JewotCSAgb3V0cHV0X2ZpbGUgPSBhdltvcHRpbmRdOwotCSAgKytvcHRpbmQ7Ci0JICBpZiAob3B0aW5kIDwgYWMpCi0JICAgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBpZiAoc3RyY21wIChpbnB1dF9maWxlLCBvdXRwdXRfZmlsZSkgPT0gMCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG11c3QgYmUgZGlmZmVyZW50XG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgZXhpdCAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgaW5wdXRfZmlsZSA9IDA7Ci0KLSAgaWYgKCFpbnB1dF9maWxlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoIW91dHB1dF9maWxlKQotICAgIHsKLSAgICAgIC8qIFRha2UgYSAubyBvZmYgdGhlIGlucHV0IGZpbGUgYW5kIHN0aWNrIG9uIGEgLm9iai4gIElmCi0gICAgICAgICBpdCBkb2Vzbid0IGVuZCBpbiAubywgdGhlbiBzdGljayBhIC5vYmogb24gYW55d2F5ICovCi0KLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKGlucHV0X2ZpbGUpOwotICAgICAgb3V0cHV0X2ZpbGUgPSB4bWFsbG9jIChsZW4gKyA1KTsKLSAgICAgIHN0cmNweSAob3V0cHV0X2ZpbGUsIGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGxlbiA+IDMKLQkgICYmIG91dHB1dF9maWxlW2xlbiAtIDJdID09ICcuJwotCSAgJiYgb3V0cHV0X2ZpbGVbbGVuIC0gMV0gPT0gJ28nKQotCXsKLQkgIG91dHB1dF9maWxlW2xlbl0gPSAnYic7Ci0JICBvdXRwdXRfZmlsZVtsZW4gKyAxXSA9ICdqJzsKLQkgIG91dHB1dF9maWxlW2xlbiArIDJdID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RyY2F0IChvdXRwdXRfZmlsZSwgIi5vYmoiKTsKLQl9Ci0gICAgfQotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKGlucHV0X2ZpbGUsIDApOwotCi0gIGlmICghYWJmZCkKLSAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOwotCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoaW5wdXRfZmlsZSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBmaWxlID0gZm9wZW4gKG91dHB1dF9maWxlLCBGT1BFTl9XQik7Ci0KLSAgaWYgKCFmaWxlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBvdXRwdXRfZmlsZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKGRlYnVnKQotICAgIHByaW50ZiAoImlkcyAlZCAlZFxuIiwgYmFzZTEsIGJhc2UyKTsKLSAgdHJlZSA9IGNvZmZfZ3JvayAoYWJmZCk7Ci0gIGlmICghbm9wcmVzY2FuKQotICAgIHByZXNjYW4gKHRyZWUpOwotICB3cl9tb2R1bGUgKHRyZWUpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0YWJzLmMgYi9iaW51dGlscy9zdGFicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UxMDcwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N0YWJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjA5ICswLDAgQEAKLS8qIHN0YWJzLmMgLS0gUGFyc2Ugc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggcGFyc2VzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIFRoZSBvcmdhbml6YXRpb24gb2YgdGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBnZGIgc3RhYnMgcmVhZGluZwotICAgY29kZS4gIFRoZSBqb2IgaXQgZG9lcyBpcyBzb21ld2hhdCBkaWZmZXJlbnQsIGJlY2F1c2UgaXQgaXMgbm90Ci0gICB0cnlpbmcgdG8gaWRlbnRpZnkgdGhlIGNvcnJlY3QgYWRkcmVzcyBmb3IgYW55dGhpbmcuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLS8qIE1lYW5pbmdsZXNzIGRlZmluaXRpb24gbmVlZHMgYnkgYW91dDY0LmguICBGSVhNRS4gICovCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUgotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBESVJfU0VQQVJBVE9SICdcXCcKLSNlbHNlCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgbnVtYmVyIG9mIHByZWRlZmluZWQgWENPRkYgdHlwZXMuICAqLwotCi0jZGVmaW5lIFhDT0ZGX1RZUEVfQ09VTlQgMzQKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyBhIGhhbmRsZSBzbyB0aGF0IHRoZSBzdGFiIHBhcnNpbmcgZG9lc24ndAotICAgbmVlZCB0byB1c2UgYW55IHN0YXRpYyB2YXJpYWJsZXMuICAqLwotCi1zdHJ1Y3Qgc3RhYl9oYW5kbGUKLXsKLSAgLyogVGhlIEJGRC4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogVHJ1ZSBpZiB0aGlzIGlzIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiBzZWN0aW9uczsKLSAgLyogVGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGFzeW1ib2wgKipzeW1zOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMuICAqLwotICBsb25nIHN5bWNvdW50OwotICAvKiBUaGUgYWNjdW11bGF0ZWQgZmlsZSBuYW1lIHN0cmluZy4gICovCi0gIGNoYXIgKnNvX3N0cmluZzsKLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IE5fU08gc3ltYm9sLiAgKi8KLSAgYmZkX3ZtYSBzb192YWx1ZTsKLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgZmlsZSwgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGZpbGUKLSAgICAgcmVsYXRpdmUgTl9MQlJBQyBhbmQgTl9SQlJBQyBzeW1ib2xzLiAgKi8KLSAgYmZkX3ZtYSBmaWxlX3N0YXJ0X29mZnNldDsKLSAgLyogVGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLCBzbyB0aGF0IHdlIGNhbiBoYW5kbGUKLSAgICAgZnVuY3Rpb24gcmVsYXRpdmUgTl9MQlJBQyBhbmQgTl9SQlJBQyBzeW1ib2xzLiAgKi8KLSAgYmZkX3ZtYSBmdW5jdGlvbl9zdGFydF9vZmZzZXQ7Ci0gIC8qIFRoZSB2ZXJzaW9uIG51bWJlciBvZiBnY2Mgd2hpY2ggY29tcGlsZWQgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24KLSAgICAgdW5pdCwgMCBpZiBub3QgY29tcGlsZWQgYnkgZ2NjLiAgKi8KLSAgaW50IGdjY19jb21waWxlZDsKLSAgLyogV2hldGhlciBhbiBOX09QVCBzeW1ib2wgd2FzIHNlZW4gdGhhdCB3YXMgbm90IGdlbmVyYXRlZCBieSBnY2MsCi0gICAgIHNvIHRoYXQgd2UgY2FuIGRldGVjdCB0aGUgU3VuUFJPIGNvbXBpbGVyLiAgKi8KLSAgYm9vbGVhbiBuX29wdF9mb3VuZDsKLSAgLyogVGhlIG1haW4gZmlsZSBuYW1lLiAgKi8KLSAgY2hhciAqbWFpbl9maWxlbmFtZTsKLSAgLyogQSBzdGFjayBvZiB1bmZpbmlzaGVkIE5fQklOQ0wgZmlsZXMuICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqYmluY2xfc3RhY2s7Ci0gIC8qIEEgbGlzdCBvZiBmaW5pc2hlZCBOX0JJTkNMIGZpbGVzLiAgKi8KLSAgc3RydWN0IGJpbmNsX2ZpbGUgKmJpbmNsX2xpc3Q7Ci0gIC8qIFdoZXRoZXIgd2UgYXJlIGluc2lkZSBhIGZ1bmN0aW9uIG9yIG5vdC4gICovCi0gIGJvb2xlYW4gd2l0aGluX2Z1bmN0aW9uOwotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgdXNlZCBpZiB3ZSBoYXZlIHNlZW4gYW4KLSAgICAgTl9GVU4gc3ltYm9sIHdoaWxlIGluIGEgZnVuY3Rpb24uICBUaGlzIGlzIC0xIGlmIHdlIGhhdmUgbm90IHNlZW4KLSAgICAgYW4gTl9GVU4gKHRoZSBub3JtYWwgY2FzZSkuICAqLwotICBiZmRfdm1hIGZ1bmN0aW9uX2VuZDsKLSAgLyogVGhlIGRlcHRoIG9mIGJsb2NrIG5lc3RpbmcuICAqLwotICBpbnQgYmxvY2tfZGVwdGg7Ci0gIC8qIExpc3Qgb2YgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9ucy4gICovCi0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICpwZW5kaW5nOwotICAvKiBOdW1iZXIgb2YgZmlsZXMgZm9yIHdoaWNoIHdlIGhhdmUgdHlwZXMuICAqLwotICB1bnNpZ25lZCBpbnQgZmlsZXM7Ci0gIC8qIExpc3RzIG9mIHR5cGVzIHBlciBmaWxlLiAgKi8KLSAgc3RydWN0IHN0YWJfdHlwZXMgKipmaWxlX3R5cGVzOwotICAvKiBQcmVkZWZpbmVkIFhDT0ZGIHR5cGVzLiAgKi8KLSAgZGVidWdfdHlwZSB4Y29mZl90eXBlc1tYQ09GRl9UWVBFX0NPVU5UXTsKLSAgLyogVW5kZWZpbmVkIHRhZ3MuICAqLwotICBzdHJ1Y3Qgc3RhYl90YWcgKnRhZ3M7Ci0gIC8qIFNldCBieSBwYXJzZV9zdGFiX3R5cGUgaWYgaXQgc2VlcyBhIHN0cnVjdHVyZSBkZWZpbmVkIGFzIGEgY3Jvc3MKLSAgICAgcmVmZXJlbmNlIHRvIGl0c2VsZi4gIFJlc2V0IGJ5IHBhcnNlX3N0YWJfdHlwZSBvdGhlcndpc2UuICAqLwotICBib29sZWFuIHNlbGZfY3Jvc3NyZWY7Ci19OwotCi0vKiBBIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyB1c2VkIHRvIGhvbGQgcGVuZGluZyB2YXJpYWJsZQotICAgZGVmaW5pdGlvbnMgc2VlbiBiZWZvcmUgdGhlIE5fTEJSQUMgb2YgYSBibG9jay4gICovCi0KLXN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyCi17Ci0gIC8qIE5leHQgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9uLiAgKi8KLSAgc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKm5leHQ7Ci0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBLaW5kLiAgKi8KLSAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAvKiBWYWx1ZS4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogQSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgdXNlZCB0byBob2xkIHRoZSB0eXBlcyBmb3IgYSBzaW5nbGUKLSAgIGZpbGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl90eXBlcwotewotICAvKiBOZXh0IHNldCBvZiBzbG90cyBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgc3RydWN0IHN0YWJfdHlwZXMgKm5leHQ7Ci0gIC8qIFR5cGVzIGluZGV4ZWQgYnkgdHlwZSBudW1iZXIuICAqLwotI2RlZmluZSBTVEFCX1RZUEVTX1NMT1RTICgxNikKLSAgZGVidWdfdHlwZSB0eXBlc1tTVEFCX1RZUEVTX1NMT1RTXTsKLX07Ci0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIHVuZGVmaW5lZCB0YWdzIHRoYXQgd2UgZW5jb3VudGVyLCBzbyB0aGF0IHdlIGNhbgotICAgZmlsbCB0aGVtIGluIGlmIHRoZSB0YWcgaXMgbGF0ZXIgZGVmaW5lZC4gICovCi0KLXN0cnVjdCBzdGFiX3RhZwotewotICAvKiBOZXh0IHVuZGVmaW5lZCB0YWcuICAqLwotICBzdHJ1Y3Qgc3RhYl90YWcgKm5leHQ7Ci0gIC8qIFRhZyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZSBraW5kLiAgKi8KLSAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLSAgLyogU2xvdCB0byBob2xkIHJlYWwgdHlwZSB3aGVuIHdlIGRpc2NvdmVyIGl0LiAgSWYgd2UgZG9uJ3QsIHdlIGZpbGwKLSAgICAgaW4gYW4gdW5kZWZpbmVkIHRhZyB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSBzbG90OwotICAvKiBJbmRpcmVjdCB0eXBlIHdlIGhhdmUgY3JlYXRlZCB0byBwb2ludCBhdCBzbG90LiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotfTsKLQotc3RhdGljIGNoYXIgKnNhdmVzdHJpbmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hIHBhcnNlX251bWJlciBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIGJhZF9zdGFiIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgd2Fybl9zdGFiIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX3N0cmluZwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLAotCSAgIGRlYnVnX3R5cGUgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgaW50ICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfcmFuZ2VfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgaW50ICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfc3VuX2J1aWx0aW5fdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfc3VuX2Zsb2F0aW5nX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX2VudW1fdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBib29sZWFuLAotCSAgIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX2Jhc2VjbGFzc2VzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX2Jhc2VjbGFzcyAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9zdHJ1Y3RfZmllbGRzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX2ZpZWxkICoqLAotCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9jcHBfYWJicmV2Ci0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX2ZpZWxkICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfb25lX3N0cnVjdF9maWVsZAotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICosCi0JICAgZGVidWdfZmllbGQgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX21lbWJlcnMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGludCAqLCBkZWJ1Z19tZXRob2QgKiopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfYXJndHlwZXMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgZGVidWdfdHlwZSwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JICAgZGVidWdfdHlwZSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX3RpbGRlX2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGludCAqLAotCSAgIGRlYnVnX3R5cGUgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX2FycmF5X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgcHVzaF9iaW5jbCBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqcG9wX2JpbmNsIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2hhbmRsZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBmaW5kX2V4Y2wKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9yZWNvcmRfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLAotCSAgIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgKnN0YWJfZmluZF9zbG90Ci0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBpbnQgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgc3RhYl9maW5kX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgaW50ICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcmVjb3JkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgaW50ICosIGRlYnVnX3R5cGUpKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHN0YWJfeGNvZmZfYnVpbHRpbl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGludCkpOwotc3RhdGljIGRlYnVnX3R5cGUgc3RhYl9maW5kX3RhZ2dlZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgaW50LAotCSAgIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSAqc3RhYl9kZW1hbmdsZV9hcmd0eXBlcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gKikpOwotCi0vKiBTYXZlIGEgc3RyaW5nIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXNhdmVzdHJpbmcgKHN0YXJ0LCBsZW4pCi0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICBpbnQgbGVuOwotewotICBjaGFyICpyZXQ7Ci0KLSAgcmV0ID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAocmV0LCBzdGFydCwgbGVuKTsKLSAgcmV0W2xlbl0gPSAnXDAnOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBSZWFkIGEgbnVtYmVyIGZyb20gYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotcGFyc2VfbnVtYmVyIChwcCwgcG92ZXJmbG93KQotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGJvb2xlYW4gKnBvdmVyZmxvdzsKLXsKLSAgdW5zaWduZWQgbG9uZyB1bDsKLSAgY29uc3QgY2hhciAqb3JpZzsKLQotICBpZiAocG92ZXJmbG93ICE9IE5VTEwpCi0gICAgKnBvdmVyZmxvdyA9IGZhbHNlOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgZXJybm8gPSAwOwotICB1bCA9IHN0cnRvdWwgKCpwcCwgKGNoYXIgKiopIHBwLCAwKTsKLSAgaWYgKHVsICsgMSAhPSAwIHx8IGVycm5vID09IDApCi0gICAgewotICAgICAgLyogSWYgYmZkX3ZtYSBpcyBsYXJnZXIgdGhhbiB1bnNpZ25lZCBsb25nLCBhbmQgdGhlIG51bWJlciBpcwotICAgICAgICAgbWVhbnQgdG8gYmUgbmVnYXRpdmUsIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc2lnbgotICAgICAgICAgZXh0ZW5kIHByb3Blcmx5LiAgKi8KLSAgICAgIGlmICgqb3JpZyA9PSAnLScpCi0JcmV0dXJuIChiZmRfdm1hKSAoYmZkX3NpZ25lZF92bWEpIChsb25nKSB1bDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgdWw7Ci0gICAgfQotCi0gIC8qIE5vdGUgdGhhdCBldmVuIHRob3VnaCBzdHJ0b3VsIG92ZXJmbG93ZWQsIGl0IHNob3VsZCBoYXZlIHNldCAqcHAKLSAgICAgdG8gdGhlIGVuZCBvZiB0aGUgbnVtYmVyLCB3aGljaCBpcyB3aGVyZSB3ZSB3YW50IGl0LiAgKi8KLQotICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA+IHNpemVvZiAodW5zaWduZWQgbG9uZykpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgIGJvb2xlYW4gbmVnOwotICAgICAgaW50IGJhc2U7Ci0gICAgICBiZmRfdm1hIG92ZXIsIGxhc3RkaWc7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotICAgICAgYmZkX3ZtYSB2OwotCi0gICAgICAvKiBPdXIgb3duIHZlcnNpb24gb2Ygc3RydG91bCwgZm9yIGEgYmZkX3ZtYS4gICovCi0KLSAgICAgIHAgPSBvcmlnOwotCi0gICAgICBuZWcgPSBmYWxzZTsKLSAgICAgIGlmICgqcCA9PSAnKycpCi0JKytwOwotICAgICAgZWxzZSBpZiAoKnAgPT0gJy0nKQotCXsKLQkgIG5lZyA9IHRydWU7Ci0JICArK3A7Ci0JfQotCi0gICAgICBiYXNlID0gMTA7Ci0gICAgICBpZiAoKnAgPT0gJzAnKQotCXsKLQkgIGlmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykKLQkgICAgewotCSAgICAgIGJhc2UgPSAxNjsKLQkgICAgICBwICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJhc2UgPSA4OwotCSAgICAgICsrcDsKLQkgICAgfQotCX0KLQotICAgICAgb3ZlciA9ICgoYmZkX3ZtYSkgKGJmZF9zaWduZWRfdm1hKSAtMSkgLyAoYmZkX3ZtYSkgYmFzZTsKLSAgICAgIGxhc3RkaWcgPSAoKGJmZF92bWEpIChiZmRfc2lnbmVkX3ZtYSkgLTEpICUgKGJmZF92bWEpIGJhc2U7Ci0KLSAgICAgIG92ZXJmbG93ID0gZmFsc2U7Ci0gICAgICB2ID0gMDsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGludCBkOwotCi0JICBkID0gKnArKzsKLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgZCkpCi0JICAgIGQgLT0gJzAnOwotCSAgZWxzZSBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGQpKQotCSAgICBkIC09ICdBJzsKLQkgIGVsc2UgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBkKSkKLQkgICAgZCAtPSAnYSc7Ci0JICBlbHNlCi0JICAgIGJyZWFrOwotCi0JICBpZiAoZCA+PSBiYXNlKQotCSAgICBicmVhazsKLQotCSAgaWYgKHYgPiBvdmVyIHx8ICh2ID09IG92ZXIgJiYgKGJmZF92bWEpIGQgPiBsYXN0ZGlnKSkKLQkgICAgewotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgb3ZlcmZsb3cpCi0JewotCSAgaWYgKG5lZykKLQkgICAgdiA9IC0gdjsKLQkgIHJldHVybiB2OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZ2V0IGhlcmUsIHRoZSBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIHJlcHJlc2VudCBpbiBhCi0gICAgIGJmZF92bWEuICAqLwotCi0gIGlmIChwb3ZlcmZsb3cgIT0gTlVMTCkKLSAgICAqcG92ZXJmbG93ID0gdHJ1ZTsKLSAgZWxzZQotICAgIHdhcm5fc3RhYiAob3JpZywgXygibnVtZXJpYyBvdmVyZmxvdyIpKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogR2l2ZSBhbiBlcnJvciBmb3IgYSBiYWQgc3RhYiBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotYmFkX3N0YWIgKHApCi0gICAgIGNvbnN0IGNoYXIgKnA7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiQmFkIHN0YWI6ICVzXG4iKSwgcCk7Ci19Ci0KLS8qIFdhcm4gYWJvdXQgc29tZXRoaW5nIGluIGEgc3RhYiBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotd2Fybl9zdGFiIChwLCBlcnIpCi0gICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKmVycjsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJXYXJuaW5nOiAlczogJXNcbiIpLCBlcnIsIHApOwotfQotCi0vKiBDcmVhdGUgYSBoYW5kbGUgdG8gcGFyc2Ugc3RhYnMgc3ltYm9scyB3aXRoLiAgKi8KLQotLypBUkdTVVNFRCovCi1QVFIKLXN0YXJ0X3N0YWIgKGRoYW5kbGUsIGFiZmQsIHNlY3Rpb25zLCBzeW1zLCBzeW1jb3VudCkKLSAgICAgUFRSIGRoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHNlY3Rpb25zOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLXsKLSAgc3RydWN0IHN0YWJfaGFuZGxlICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBzdGFiX2hhbmRsZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIG1lbXNldCAocmV0LCAwLCBzaXplb2YgKnJldCk7Ci0gIHJldC0+YWJmZCA9IGFiZmQ7Ci0gIHJldC0+c2VjdGlvbnMgPSBzZWN0aW9uczsKLSAgcmV0LT5zeW1zID0gc3ltczsKLSAgcmV0LT5zeW1jb3VudCA9IHN5bWNvdW50OwotICByZXQtPmZpbGVzID0gMTsKLSAgcmV0LT5maWxlX3R5cGVzID0gKHN0cnVjdCBzdGFiX3R5cGVzICoqKSB4bWFsbG9jIChzaXplb2YgKnJldC0+ZmlsZV90eXBlcyk7Ci0gIHJldC0+ZmlsZV90eXBlc1swXSA9IE5VTEw7Ci0gIHJldC0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBXaGVuIHdlIGhhdmUgcHJvY2Vzc2VkIGFsbCB0aGUgc3RhYnMgaW5mb3JtYXRpb24sIHdlIG5lZWQgdG8gZ28KLSAgIHRocm91Z2ggYW5kIGZpbGwgaW4gYWxsIHRoZSB1bmRlZmluZWQgdGFncy4gICovCi0KLWJvb2xlYW4KLWZpbmlzaF9zdGFiIChkaGFuZGxlLCBoYW5kbGUpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBQVFIgaGFuZGxlOwotewotICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IHN0YWJfdGFnICpzdDsKLQotICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCi0JICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgaW5mby0+ZnVuY3Rpb25fZW5kKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLSAgICAgIGluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKLSAgICB9Ci0KLSAgZm9yIChzdCA9IGluZm8tPnRhZ3M7IHN0ICE9IE5VTEw7IHN0ID0gc3QtPm5leHQpCi0gICAgewotICAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLQotICAgICAga2luZCA9IHN0LT5raW5kOwotICAgICAgaWYgKGtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMKQotCWtpbmQgPSBERUJVR19LSU5EX1NUUlVDVDsKLSAgICAgIHN0LT5zbG90ID0gZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIHN0LT5uYW1lLCBraW5kKTsKLSAgICAgIGlmIChzdC0+c2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIHN0YWJzIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLXBhcnNlX3N0YWIgKGRoYW5kbGUsIGhhbmRsZSwgdHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgZGVzYzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfaGFuZGxlICopIGhhbmRsZTsKLQotICAvKiBnY2Mgd2lsbCBlbWl0IHR3byBOX1NPIHN0cmluZ3MgcGVyIGNvbXBpbGF0aW9uIHVuaXQsIG9uZSBmb3IgdGhlCi0gICAgIGRpcmVjdG9yeSBuYW1lIGFuZCBvbmUgZm9yIHRoZSBmaWxlIG5hbWUuICBXZSBqdXN0IGNvbGxlY3QgTl9TTwotICAgICBzdHJpbmdzIGFzIHdlIHNlZSB0aGVtLCBhbmQgc3RhcnQgdGhlIG5ldyBjb21waWxhdGlvbiB1bml0IHdoZW4KLSAgICAgd2Ugc2VlIGEgbm9uIE5fU08gc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnNvX3N0cmluZyAhPSBOVUxMCi0gICAgICAmJiAodHlwZSAhPSBOX1NPIHx8ICpzdHJpbmcgPT0gJ1wwJyB8fCB2YWx1ZSAhPSBpbmZvLT5zb192YWx1ZSkpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCBpbmZvLT5zb19zdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPm1haW5fZmlsZW5hbWUgPSBpbmZvLT5zb19zdHJpbmc7Ci0KLSAgICAgIGluZm8tPmdjY19jb21waWxlZCA9IDA7Ci0gICAgICBpbmZvLT5uX29wdF9mb3VuZCA9IGZhbHNlOwotCi0gICAgICAvKiBHZW5lcmFsbHksIGZvciBzdGFicyBpbiB0aGUgc3ltYm9sIHRhYmxlLCB0aGUgTl9MQlJBQyBhbmQKLQkgTl9SQlJBQyBzeW1ib2xzIGFyZSByZWxhdGl2ZSB0byB0aGUgTl9TTyBzeW1ib2wgdmFsdWUuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2VjdGlvbnMpCi0JaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQgPSBpbmZvLT5zb192YWx1ZTsKLQotICAgICAgLyogV2UgbmVlZCB0byByZXNldCB0aGUgbWFwcGluZyBmcm9tIHR5cGUgbnVtYmVycyB0byB0eXBlcy4gIFdlCi0JIGNhbid0IGZyZWUgdGhlIG9sZCBtYXBwaW5nLCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YKLQkgZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlLiAgKi8KLSAgICAgIGluZm8tPmZpbGVzID0gMTsKLSAgICAgIGluZm8tPmZpbGVfdHlwZXMgPSAoKHN0cnVjdCBzdGFiX3R5cGVzICoqKQotCQkJICB4bWFsbG9jIChzaXplb2YgKmluZm8tPmZpbGVfdHlwZXMpKTsKLSAgICAgIGluZm8tPmZpbGVfdHlwZXNbMF0gPSBOVUxMOwotCi0gICAgICBpbmZvLT5zb19zdHJpbmcgPSBOVUxMOwotCi0gICAgICAvKiBOb3cgcHJvY2VzcyB3aGF0ZXZlciB0eXBlIHdlIGp1c3QgZ290LiAgKi8KLSAgICB9Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIE5fRk46Ci0gICAgY2FzZSBOX0ZOX1NFUToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0xCUkFDOgotICAgICAgLyogSWdub3JlIGV4dHJhIG91dGVybW9zdCBjb250ZXh0IGZyb20gU3VuUFJPIGNjIGFuZCBhY2MuICAqLwotICAgICAgaWYgKGluZm8tPm5fb3B0X2ZvdW5kICYmIGRlc2MgPT0gMSkKLQlicmVhazsKLQotICAgICAgaWYgKCEgaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiTl9MQlJBQyBub3Qgd2l0aGluIGZ1bmN0aW9uXG4iKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdGFydCBhbiBpbm5lciBsZXhpY2FsIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X2Jsb2NrIChkaGFuZGxlLAotCQkJICAgICAgICh2YWx1ZQotCQkJCSsgaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQKLQkJCQkrIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRW1pdCBhbnkgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9ucy4gICovCi0gICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICsraW5mby0+YmxvY2tfZGVwdGg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9SQlJBQzoKLSAgICAgIC8qIElnbm9yZSBleHRyYSBvdXRlcm1vc3QgY29udGV4dCBmcm9tIFN1blBSTyBjYyBhbmQgYWNjLiAgKi8KLSAgICAgIGlmIChpbmZvLT5uX29wdF9mb3VuZCAmJiBkZXNjID09IDEpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlIHNob3VsZG4ndCBoYXZlIGFueSBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb25zIGhlcmUsIGJ1dCwKLSAgICAgICAgIGlmIHdlIGRvLCB3ZSBwcm9iYWJseSBuZWVkIHRvIGVtaXQgdGhlbSBiZWZvcmUgY2xvc2luZyB0aGUKLSAgICAgICAgIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRW5kIGFuIGlubmVyIGxleGljYWwgYmxvY2suICAqLwotICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChkaGFuZGxlLAotCQkJICAgICAodmFsdWUKLQkJCSAgICAgICsgaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQKLQkJCSAgICAgICsgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0KSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAtLWluZm8tPmJsb2NrX2RlcHRoOwotICAgICAgaWYgKGluZm8tPmJsb2NrX2RlcHRoIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIlRvbyBtYW55IE5fUkJSQUNzXG4iKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fU086Ci0gICAgICAvKiBUaGlzIGFsd2F5cyBlbmRzIGEgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKLQl7Ci0JICBiZmRfdm1hIGVuZHZhbDsKLQotCSAgZW5kdmFsID0gdmFsdWU7Ci0JICBpZiAoKnN0cmluZyAhPSAnXDAnCi0JICAgICAgJiYgaW5mby0+ZnVuY3Rpb25fZW5kICE9IChiZmRfdm1hKSAtMQotCSAgICAgICYmIGluZm8tPmZ1bmN0aW9uX2VuZCA8IGVuZHZhbCkKLQkgICAgZW5kdmFsID0gaW5mby0+ZnVuY3Rpb25fZW5kOwotCSAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKLQkgICAgICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgZW5kdmFsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0JICBpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JfQotCi0gICAgICAvKiBBbiBlbXB0eSBzdHJpbmcgaXMgZW1pdHRlZCBieSBnY2MgYXQgdGhlIGVuZCBvZiBhIGNvbXBpbGF0aW9uCi0gICAgICAgICB1bml0LiAgKi8KLSAgICAgIGlmICgqc3RyaW5nID09ICdcMCcpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIEp1c3QgYWNjdW11bGF0ZSBzdHJpbmdzIHVudGlsIHdlIHNlZSBhIG5vbiBOX1NPIHN5bWJvbC4gIElmCi0gICAgICAgICB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBvciBzb21lIG90aGVyCi0JIGZvcm0gb2YgYWJzb2x1dGUgcGF0aCBzcGVjaWZpY2F0aW9uLCB3ZSBkaXNjYXJkIHRoZSBwcmV2aW91c2x5Ci0gICAgICAgICBhY2N1bXVsYXRlZCBzdHJpbmdzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zb19zdHJpbmcgPT0gTlVMTCkKLQlpbmZvLT5zb19zdHJpbmcgPSB4c3RyZHVwIChzdHJpbmcpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmY7Ci0KLQkgIGYgPSBpbmZvLT5zb19zdHJpbmc7Ci0KLQkgIGlmICggICAoc3RyaW5nWzBdID09ICcvJykKLQkgICAgICB8fCAoc3RyaW5nWzBdID09IERJUl9TRVBBUkFUT1IpCi0JICAgICAgfHwgKCAgIChESVJfU0VQQVJBVE9SID09ICdcXCcpCi0JCSAgJiYgKHN0cmluZ1sxXSA9PSAnOicpCi0JCSAgJiYgKCAgIChzdHJpbmdbMl0gPT0gRElSX1NFUEFSQVRPUikKLQkJICAgICAgfHwgKHN0cmluZ1syXSA9PSAnLycpKSkpCi0JICAgIGluZm8tPnNvX3N0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7Ci0JICBlbHNlCi0JICAgIGluZm8tPnNvX3N0cmluZyA9IGNvbmNhdCAoaW5mby0+c29fc3RyaW5nLCBzdHJpbmcsCi0JCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICBmcmVlIChmKTsKLQl9Ci0KLSAgICAgIGluZm8tPnNvX3ZhbHVlID0gdmFsdWU7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NPTDoKLSAgICAgIC8qIFN0YXJ0IGFuIGluY2x1ZGUgZmlsZS4gICovCi0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGRoYW5kbGUsIHN0cmluZykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fQklOQ0w6Ci0gICAgICAvKiBTdGFydCBhbiBpbmNsdWRlIGZpbGUgd2hpY2ggbWF5IGJlIHJlcGxhY2VkLiAgKi8KLSAgICAgIHB1c2hfYmluY2wgKGluZm8sIHN0cmluZywgdmFsdWUpOwotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VJTkNMOgotICAgICAgLyogRW5kIGFuIE5fQklOQ0wgaW5jbHVkZS4gICovCi0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGRoYW5kbGUsIHBvcF9iaW5jbCAoaW5mbykpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VYQ0w6Ci0gICAgICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIGEgaGVhZGVyIGZpbGUgbmFtZWQgYnkgTl9CSU5DTCB3aGljaAotICAgICAgICAgd2FzIGVsaW1pbmF0ZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgICBpZiAoISBmaW5kX2V4Y2wgKGluZm8sIHN0cmluZywgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NMSU5FOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2xpbmUgKGRoYW5kbGUsIGRlc2MsCi0JCQkgICAgICAgdmFsdWUgKyBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0JDT01NOgotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VDT01NOgotICAgICAgaWYgKCEgZGVidWdfZW5kX2NvbW1vbl9ibG9jayAoZGhhbmRsZSwgc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9GVU46Ci0gICAgICBpZiAoKnN0cmluZyA9PSAnXDAnKQotCXsKLQkgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFsd2F5cyBtYXJrcyB0aGUgZW5kIG9mIGEgZnVuY3Rpb247IHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgIG5lZWQgdG8gd29ycnkgYWJvdXQgaW5mby0+ZnVuY3Rpb25fZW5kLiAgKi8KLQkgICAgICBpZiAoaW5mby0+c2VjdGlvbnMpCi0JCXZhbHVlICs9IGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldDsKLQkgICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCQkgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCB2YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQkgICAgICBpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQSBjb25zdCBzdGF0aWMgc3ltYm9sIGluIHRoZSAudGV4dCBzZWN0aW9uIHdpbGwgaGF2ZSBhbiBOX0ZVTgotICAgICAgICAgZW50cnkuICBXZSBuZWVkIHRvIHVzZSB0aGVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLAotICAgICAgICAgaW4gY2FzZSB3ZSBhcmUgbG9va2luZyBhdCBnY2Mgb3V0cHV0IGJlZm9yZSBpdCB3YXMgY2hhbmdlZCB0bwotICAgICAgICAgYWx3YXlzIGVtaXQgYW4gZW1wdHkgTl9GVU4uICBXZSBjYW4ndCBjYWxsIGRlYnVnX2VuZF9mdW5jdGlvbgotICAgICAgICAgaGVyZSwgYmVjYXVzZSBpdCBtaWdodCBiZSBhIGxvY2FsIHN0YXRpYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbgotCSAgJiYgKGluZm8tPmZ1bmN0aW9uX2VuZCA9PSAoYmZkX3ZtYSkgLTEKLQkgICAgICB8fCB2YWx1ZSA8IGluZm8tPmZ1bmN0aW9uX2VuZCkpCi0JaW5mby0+ZnVuY3Rpb25fZW5kID0gdmFsdWU7Ci0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyB0aGUgc3RyaW5nIGZvciBOX1NUU1lNLCBOX0xDU1lNIG9yIE5fUk9TWU0KLSAgICAgICAgIHN5bWJvbHMsIGFuZCBpZiBpdCBkb2VzIG5vdCBzdGFydCB3aXRoIDpTLCBnZGIgcmVsb2NhdGVzIHRoZQotICAgICAgICAgdmFsdWUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgZ2NjIGFsd2F5cyBzZWVtcyB0byB1c2UKLSAgICAgICAgIDpTLCBzbyB3ZSBkb24ndCB3b3JyeSBhYm91dCB0aGlzLiAgKi8KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQljb25zdCBjaGFyICpjb2xvbjsKLQotCWNvbG9uID0gc3RyY2hyIChzdHJpbmcsICc6Jyk7Ci0JaWYgKGNvbG9uICE9IE5VTEwKLQkgICAgJiYgKGNvbG9uWzFdID09ICdmJyB8fCBjb2xvblsxXSA9PSAnRicpKQotCSAgewotCSAgICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCSAgICAgIHsKLQkJYmZkX3ZtYSBlbmR2YWw7Ci0KLQkJZW5kdmFsID0gdmFsdWU7Ci0JCWlmIChpbmZvLT5mdW5jdGlvbl9lbmQgIT0gKGJmZF92bWEpIC0xCi0JCSAgICAmJiBpbmZvLT5mdW5jdGlvbl9lbmQgPCBlbmR2YWwpCi0JCSAgZW5kdmFsID0gaW5mby0+ZnVuY3Rpb25fZW5kOwotCQlpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCQkgICAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGVuZHZhbCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JICAgICAgfQotCSAgICAvKiBGb3Igc3RhYnMgaW4gc2VjdGlvbnMsIGxpbmUgbnVtYmVycyBhbmQgYmxvY2sgYWRkcmVzc2VzCi0gICAgICAgICAgICAgICBhcmUgb2Zmc2V0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICAqLwotCSAgICBpZiAoaW5mby0+c2VjdGlvbnMpCi0JICAgICAgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0ID0gdmFsdWU7Ci0JICAgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoISBwYXJzZV9zdGFiX3N0cmluZyAoZGhhbmRsZSwgaW5mbywgdHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9PUFQ6Ci0gICAgICBpZiAoc3RyaW5nICE9IE5VTEwgJiYgc3RyY21wIChzdHJpbmcsICJnY2MyX2NvbXBpbGVkLiIpID09IDApCi0JaW5mby0+Z2NjX2NvbXBpbGVkID0gMjsKLSAgICAgIGVsc2UgaWYgKHN0cmluZyAhPSBOVUxMICYmIHN0cmNtcCAoc3RyaW5nLCAiZ2NjX2NvbXBpbGVkLiIpID09IDApCi0JaW5mby0+Z2NjX2NvbXBpbGVkID0gMTsKLSAgICAgIGVsc2UKLQlpbmZvLT5uX29wdF9mb3VuZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9PQko6Ci0gICAgY2FzZSBOX0VORE06Ci0gICAgY2FzZSBOX01BSU46Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIHRoZSBzdGFicyBzdHJpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9zdHJpbmcgKGRoYW5kbGUsIGluZm8sIHN0YWJ0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBpbnQgc3RhYnR5cGU7Ci0gICAgIGludCBkZXNjOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCB0eXBlOwotICBkZWJ1Z190eXBlIGR0eXBlOwotICBib29sZWFuIHN5bm9ueW07Ci0gIGJvb2xlYW4gc2VsZl9jcm9zc3JlZjsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBwID0gc3RyY2hyIChzdHJpbmcsICc6Jyk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgd2hpbGUgKHBbMV0gPT0gJzonKQotICAgIHsKLSAgICAgIHAgKz0gMjsKLSAgICAgIHAgPSBzdHJjaHIgKHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogR0NDIDIueCBwdXRzIHRoZSBsaW5lIG51bWJlciBpbiBkZXNjLiAgU3VuT1MgYXBwYXJlbnRseSBwdXRzIGluCi0gICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgYSB0eXBlIG9yIG9iamVjdCwgd2hpY2ggd2UKLSAgICAgaWdub3JlLiAgKi8KLSAgaWYgKGluZm8tPmdjY19jb21waWxlZCA+PSAyKQotICAgIGxpbmVubyA9IGRlc2M7Ci0gIGVsc2UKLSAgICBsaW5lbm8gPSAwOwotCi0gIC8qIEZJWE1FOiBTb21ldGltZXMgdGhlIHNwZWNpYWwgQysrIG5hbWVzIHN0YXJ0IHdpdGggJy4nLiAgKi8KLSAgbmFtZSA9IE5VTEw7Ci0gIGlmIChzdHJpbmdbMF0gPT0gJyQnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3RyaW5nWzFdKQotCXsKLQljYXNlICd0JzoKLQkgIG5hbWUgPSAidGhpcyI7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIC8qIFdhczogbmFtZSA9ICJ2cHRyIjsgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgbmFtZSA9ICJlaF90aHJvdyI7Ci0JICBicmVhazsKLQljYXNlICdfJzoKLQkgIC8qIFRoaXMgd2FzIGFuIGFub255bW91cyB0eXBlIHRoYXQgd2FzIG5ldmVyIGZpeGVkIHVwLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgLyogU3VuUFJPICgzLjAgYXQgbGVhc3QpIHN0YXRpYyB2YXJpYWJsZSBlbmNvZGluZy4gICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgd2Fybl9zdGFiIChzdHJpbmcsIF8oInVua25vd24gQysrIGVuY29kZWQgbmFtZSIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAocCA9PSBzdHJpbmcgfHwgKHN0cmluZ1swXSA9PSAnICcgJiYgcCA9PSBzdHJpbmcgKyAxKSkKLQluYW1lID0gTlVMTDsKLSAgICAgIGVsc2UKLQluYW1lID0gc2F2ZXN0cmluZyAoc3RyaW5nLCBwIC0gc3RyaW5nKTsKLSAgICB9Ci0KLSAgKytwOwotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnKCcgfHwgKnAgPT0gJy0nKQotICAgIHR5cGUgPSAnbCc7Ci0gIGVsc2UKLSAgICB0eXBlID0gKnArKzsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2MnOgotICAgICAgLyogYyBpcyBhIHNwZWNpYWwgY2FzZSwgbm90IGZvbGxvd2VkIGJ5IGEgdHlwZS1udW1iZXIuCi0JIFNZTUJPTDpjPWlWQUxVRSBmb3IgYW4gaW50ZWdlciBjb25zdGFudCBzeW1ib2wuCi0JIFNZTUJPTDpjPXJWQUxVRSBmb3IgYSBmbG9hdGluZyBjb25zdGFudCBzeW1ib2wuCi0JIFNZTUJPTDpjPWVUWVBFLElOVFZBTFVFIGZvciBhbiBlbnVtIGNvbnN0YW50IHN5bWJvbC4KLQkgZS5nLiAiYjpjPWU2LDAiIGZvciAiY29uc3QgYiA9IGJsb2IxIgotCSAod2hlcmUgdHlwZSA2IGlzIGRlZmluZWQgYnkgImJsb2JzOnQ2PWVibG9iMTowLGJsb2IyOjEsOyIpLiAgKi8KLSAgICAgIGlmICgqcCAhPSAnPScpCi0JewotCSAgYmFkX3N0YWIgKHN0cmluZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKytwOwotICAgICAgc3dpdGNoICgqcCsrKQotCXsKLQljYXNlICdyJzoKLQkgIC8qIEZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQkgIGlmICghIGRlYnVnX3JlY29yZF9mbG9hdF9jb25zdCAoZGhhbmRsZSwgbmFtZSwgYXRvZiAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIC8qIEludGVnZXIgY29uc3RhbnQuICAqLwotCSAgLyogRGVmaW5pbmcgaW50ZWdlciBjb25zdGFudHMgdGhpcyB3YXkgaXMga2luZCBvZiBzaWxseSwKLQkgICAgIHNpbmNlICdlJyBjb25zdGFudHMgYWxsb3dzIHRoZSBjb21waWxlciB0byBnaXZlIG5vdCBvbmx5Ci0JICAgICB0aGUgdmFsdWUsIGJ1dCB0aGUgdHlwZSBhcyB3ZWxsLiAgQyBoYXMgYXQgbGVhc3QgaW50LAotCSAgICAgbG9uZywgdW5zaWduZWQgaW50LCBhbmQgbG9uZyBsb25nIGFzIGNvbnN0YW50IHR5cGVzOwotCSAgICAgb3RoZXIgbGFuZ3VhZ2VzIHByb2JhYmx5IHNob3VsZCBoYXZlIGF0IGxlYXN0IHVuc2lnbmVkIGFzCi0JICAgICB3ZWxsIGFzIHNpZ25lZCBjb25zdGFudHMuICAqLwotCSAgaWYgKCEgZGVidWdfcmVjb3JkX2ludF9jb25zdCAoZGhhbmRsZSwgbmFtZSwgYXRvaSAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIC8qIFNZTUJPTDpjPWVUWVBFLElOVFZBTFVFIGZvciBhIGNvbnN0YW50IHN5bWJvbCB3aG9zZSB2YWx1ZQotCSAgICAgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGludGVncmFsLgotCSAgICAgZS5nLiAiYjpjPWU2LDAiIGZvciAiY29uc3QgYiA9IGJsb2IxIgotCSAgICAgKHdoZXJlIHR5cGUgNiBpcyBkZWZpbmVkIGJ5ICJibG9iczp0Nj1lYmxvYjE6MCxibG9iMjoxLDsiKS4gICovCi0JICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAmcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCpwICE9ICcsJykKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgZGVidWdfcmVjb3JkX3R5cGVkX2NvbnN0IChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgYXRvaSAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYmFkX3N0YWIgKHN0cmluZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgLyogVGhlIG5hbWUgb2YgYSBjYXVnaHQgZXhjZXB0aW9uLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJICAgICAgICZwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9sYWJlbCAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgLyogQSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIHR5cGUgPT0gJ0YnLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTdW4gYWNjIHB1dHMgZGVjbGFyZWQgdHlwZXMgb2YgYXJndW1lbnRzIGhlcmUuICBXZSBkb24ndCBjYXJlCi0JIGFib3V0IHRoZWlyIGFjdHVhbCB0eXBlcyAoRklYTUUgLS0gd2Ugc2hvdWxkIHJlbWVtYmVyIHRoZSB3aG9sZQotCSBmdW5jdGlvbiBwcm90b3R5cGUpLCBidXQgdGhlIGxpc3QgbWF5IGRlZmluZSBzb21lIG5ldyB0eXBlcwotCSB0aGF0IHdlIGhhdmUgdG8gcmVtZW1iZXIsIHNvIHdlIG11c3Qgc2NhbiBpdCBub3cuICAqLwotICAgICAgd2hpbGUgKCpwID09ICc7JykKLQl7Ci0JICArK3A7Ci0JICBpZiAocGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCkKLQkgICAgICA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICB7Ci0JY2hhciBsZWFkaW5nOwotCWxvbmcgYzsKLQlhc3ltYm9sICoqcHM7Ci0KLQkvKiBBIGdsb2JhbCBzeW1ib2wuICBUaGUgdmFsdWUgbXVzdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUKLQkgICBzeW1ib2wgdGFibGUuICAqLwotCWR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0JbGVhZGluZyA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoaW5mby0+YWJmZCk7Ci0JZm9yIChjID0gaW5mby0+c3ltY291bnQsIHBzID0gaW5mby0+c3ltczsgYyA+IDA7IC0tYywgKytwcykKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbjsKLQotCSAgICBuID0gYmZkX2FzeW1ib2xfbmFtZSAoKnBzKTsKLQkgICAgaWYgKGxlYWRpbmcgIT0gJ1wwJyAmJiAqbiA9PSBsZWFkaW5nKQotCSAgICAgICsrbjsKLQkgICAgaWYgKCpuID09ICpuYW1lICYmIHN0cmNtcCAobiwgbmFtZSkgPT0gMCkKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoYyA+IDApCi0JICB2YWx1ZSA9IGJmZF9hc3ltYm9sX3ZhbHVlICgqcHMpOwotCWlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfR0xPQkFMLAotCQkJCSAgICB2YWx1ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogVGhpcyBjYXNlIGlzIGZha2VkIGJ5IGEgY29uZGl0aW9uYWwgYWJvdmUsIHdoZW4gdGhlcmUgaXMgbm8KLQkgY29kZSBsZXR0ZXIgaW4gdGhlIGRieCBkYXRhLiAgRGJ4IGRhdGEgbmV2ZXIgYWN0dWFsbHkKLQkgY29udGFpbnMgJ2wnLiAgKi8KLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdzJzoKLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfTE9DQUwsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICAgIC8qIEEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLSAgICAgIGlmICgqcCAhPSAnRicpCi0JZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCS8qIHBGIGlzIGEgdHdvLWxldHRlciBjb2RlIHRoYXQgbWVhbnMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgaW4KLQkgICBGb3J0cmFuLiAgVGhlIHR5cGUtbnVtYmVyIHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuCi0JICAgdmFsdWUuICBUcmFuc2xhdGUgaXQgaW50byBhIHBvaW50ZXItdG8tZnVuY3Rpb24gdHlwZS4gICovCi0JICArK3A7Ci0JICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkJICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGR0eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgewotCSAgICAgIGRlYnVnX3R5cGUgZnR5cGU7Ci0KLQkgICAgICBmdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgZHR5cGUsCi0JCQkJCQkoZGVidWdfdHlwZSAqKSBOVUxMLCBmYWxzZSk7Ci0JICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwgZnR5cGUpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9TVEFDSywKLQkJCQkgICAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IEF0IHRoaXMgcG9pbnQgZ2RiIGNvbnNpZGVycyByZWFycmFuZ2luZyB0aGUgcGFyYW1ldGVyCi0JIGFkZHJlc3Mgb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgaWYgaXQgaXMgc21hbGxlciB0aGFuIGFuIGludC4KLQkgV2UgaGF2ZSBubyB3YXkgdG8gZG8gdGhhdCwgc2luY2Ugd2UgZG9uJ3QgcmVhbGx5IGtub3cgbXVjaAotCSBhYm91dCB0aGUgdGFyZ2V0LiAgKi8KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgIGlmIChzdGFidHlwZSA9PSBOX0ZVTikKLQl7Ci0JICAvKiBQcm90b3R5cGUgb2YgYSBmdW5jdGlvbiByZWZlcmVuY2VkIGJ5IHRoaXMgZmlsZS4gICovCi0JICB3aGlsZSAoKnAgPT0gJzsnKQotCSAgICB7Ci0JICAgICAgKytwOwotCSAgICAgIGlmIChwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAgIChkZWJ1Z190eXBlICoqKSBOVUxMKQotCQkgID09IERFQlVHX1RZUEVfTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJ1InOgotICAgICAgLyogUGFyYW1ldGVyIHdoaWNoIGlzIGluIGEgcmVnaXN0ZXIuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fUkVHLAotCQkJCSAgICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIC8qIFJlZ2lzdGVyIHZhcmlhYmxlIChlaXRoZXIgZ2xvYmFsIG9yIGxvY2FsKS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX1JFR0lTVEVSLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IEF0IHRoaXMgcG9pbnQgZ2RiIGNoZWNrcyB0byBjb21iaW5lIHBhaXJzIG9mICdwJyBhbmQKLQkgJ3InIHN0YWJzIGludG8gYSBzaW5nbGUgJ1AnIHN0YWIuICAqLwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgLyogU3RhdGljIHN5bWJvbCBhdCB0b3AgbGV2ZWwgb2YgZmlsZSAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19TVEFUSUMsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIC8qIEEgdHlwZWRlZi4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgJnAsICZzbG90KTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBBIG5hbWVsZXNzIHR5cGUuICBOb3RoaW5nIHRvIGRvLiAgKi8KLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgZHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIGR0eXBlKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc2xvdCAhPSBOVUxMKQotCSpzbG90ID0gZHR5cGU7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBTdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHRhZy4gIEZvciBHTlUgQysrLCB0aGlzIGNhbiBiZSBiZSBmb2xsb3dlZAotCSBieSAndCcgd2hpY2ggbWVhbnMgd2UgYXJlIHR5cGVkZWYnaW5nIGl0IGFzIHdlbGwuICAqLwotICAgICAgaWYgKCpwICE9ICd0JykKLQl7Ci0JICBzeW5vbnltID0gZmFsc2U7Ci0JICAvKiBGSVhNRTogZ2RiIHNldHMgc3lub255bSB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGxhbmd1YWdlCi0gICAgICAgICAgICAgaXMgQysrLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3lub255bSA9IHRydWU7Ci0JICArK3A7Ci0JfQotCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgJnAsICZzbG90KTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogSU5GTy0+U0VMRl9DUk9TU1JFRiBpcyBzZXQgYnkgcGFyc2Vfc3RhYl90eXBlIGlmIHRoaXMgdHlwZSBpcwotICAgICAgICAgYSBjcm9zcyByZWZlcmVuY2UgdG8gaXRzZWxmLiAgVGhlc2UgYXJlIGdlbmVyYXRlZCBieSBzb21lCi0gICAgICAgICB2ZXJzaW9ucyBvZiBnKysuICAqLwotICAgICAgc2VsZl9jcm9zc3JlZiA9IGluZm8tPnNlbGZfY3Jvc3NyZWY7Ci0KLSAgICAgIGR0eXBlID0gZGVidWdfdGFnX3R5cGUgKGRoYW5kbGUsIG5hbWUsIGR0eXBlKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHNsb3QgIT0gTlVMTCkKLQkqc2xvdCA9IGR0eXBlOwotCi0gICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhIGNyb3NzIHJlZmVyZW5jZSB0byB0aGlzIHRhZyB3aGljaCB3ZSBjYW4gbm93Ci0gICAgICAgICBmaWxsIGluLiAgQXZvaWQgZmlsbGluZyBpbiBhIGNyb3NzIHJlZmVyZW5jZSB0byBvdXJzZWx2ZXMsCi0gICAgICAgICBiZWNhdXNlIHRoYXQgd291bGQgbGVhZCB0byBjaXJjdWxhciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCEgc2VsZl9jcm9zc3JlZikKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RhYl90YWcgKipwc3Q7Ci0KLQkgIGZvciAocHN0ID0gJmluZm8tPnRhZ3M7ICpwc3QgIT0gTlVMTDsgcHN0ID0gJigqcHN0KS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgoKnBzdCktPm5hbWVbMF0gPT0gbmFtZVswXQotCQkgICYmIHN0cmNtcCAoKCpwc3QpLT5uYW1lLCBuYW1lKSA9PSAwKQotCQl7Ci0JCSAgKCpwc3QpLT5zbG90ID0gZHR5cGU7Ci0JCSAgKnBzdCA9ICgqcHN0KS0+bmV4dDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc3lub255bSkKLQl7Ci0JICBkdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgZHR5cGUpOwotCSAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoc2xvdCAhPSBOVUxMKQotCSAgICAqc2xvdCA9IGR0eXBlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIC8qIFN0YXRpYyBzeW1ib2wgb2YgbG9jYWwgc2NvcGUgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsCi0JCQkJICBERUJVR19MT0NBTF9TVEFUSUMsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3YnOgotICAgICAgLyogUmVmZXJlbmNlIHBhcmFtZXRlci4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9SRUZFUkVOQ0UsCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2EnOgotICAgICAgLyogUmVmZXJlbmNlIHBhcmFtZXRlciB3aGljaCBpcyBpbiBhIHJlZ2lzdGVyLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1JFRl9SRUcsCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgLyogVGhpcyBpcyB1c2VkIGJ5IFN1biBGT1JUUkFOIGZvciAiZnVuY3Rpb24gcmVzdWx0IHZhbHVlIi4KLQkgU3VuIGNsYWltcyAoImRieCBhbmQgZGJ4dG9vbCBpbnRlcmZhY2VzIiwgMm5kIGVkKQotCSB0aGF0IFBhc2NhbCB1c2VzIGl0IHRvbywgYnV0IHdoZW4gSSB0cmllZCBpdCBQYXNjYWwgdXNlZAotCSAieDozIiAobG9jYWwgc3ltYm9sKSBpbnN0ZWFkLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfTE9DQUwsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYmFkX3N0YWIgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBnZGIgY29udmVydHMgc3RydWN0dXJlIHZhbHVlcyB0byBzdHJ1Y3R1cmUgcG9pbnRlcnMgaW4gYQotICAgICBjb3VwbGUgb2YgY2FzZXMsIGRlcGVuZGluZyB1cG9uIHRoZSB0YXJnZXQuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHN0YWJzIHR5cGUuICBUaGUgdHlwZW5hbWUgYXJndW1lbnQgaXMgbm9uLU5VTEwgaWYgdGhpcyBpcyBhCi0gICB0eXBlZGVmIG9yIGEgdGFnIGRlZmluaXRpb24uICBUaGUgcHAgYXJndW1lbnQgcG9pbnRzIHRvIHRoZSBzdGFiCi0gICBzdHJpbmcsIGFuZCBpcyB1cGRhdGVkLiAgVGhlIHNsb3RwIGFyZ3VtZW50IHBvaW50cyB0byBhIHBsYWNlIHRvCi0gICBzdG9yZSB0aGUgc2xvdCB1c2VkIGlmIHRoZSB0eXBlIGlzIGJlaW5nIGRlZmluZWQuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsIHNsb3RwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICoqc2xvdHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGludCB0eXBlbnVtc1syXTsKLSAgaW50IHNpemU7Ci0gIGJvb2xlYW4gc3RyaW5ncDsKLSAgaW50IGRlc2NyaXB0b3I7Ci0gIGRlYnVnX3R5cGUgZHR5cGU7Ci0KLSAgaWYgKHNsb3RwICE9IE5VTEwpCi0gICAgKnNsb3RwID0gTlVMTDsKLQotICBvcmlnID0gKnBwOwotCi0gIHNpemUgPSAtMTsKLSAgc3RyaW5ncCA9IGZhbHNlOwotCi0gIGluZm8tPnNlbGZfY3Jvc3NyZWYgPSBmYWxzZTsKLQotICAvKiBSZWFkIHR5cGUgbnVtYmVyIGlmIHByZXNlbnQuICBUaGUgdHlwZSBudW1iZXIgbWF5IGJlIG9taXR0ZWQuCi0gICAgIGZvciBpbnN0YW5jZSBpbiBhIHR3by1kaW1lbnNpb25hbCBhcnJheSBkZWNsYXJlZCB3aXRoIHR5cGUKLSAgICAgImFyMTsxOzEwO2FyMTsxOzEwOzQiLiAgKi8KLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApICYmICoqcHAgIT0gJygnICYmICoqcHAgIT0gJy0nKQotICAgIHsKLSAgICAgIC8qICd0eXBlbnVtcz0nIG5vdCBwcmVzZW50LCB0eXBlIGlzIGFub255bW91cy4gIFJlYWQgYW5kIHJldHVybgotCSB0aGUgZGVmaW5pdGlvbiwgYnV0IGRvbid0IHB1dCBpdCBpbiB0aGUgdHlwZSB2ZWN0b3IuICAqLwotICAgICAgdHlwZW51bXNbMF0gPSB0eXBlbnVtc1sxXSA9IC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCB0eXBlbnVtcykpCi0JcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgaWYgKCoqcHAgIT0gJz0nKQotCXsKLQkgIC8qIFR5cGUgaXMgbm90IGJlaW5nIGRlZmluZWQgaGVyZS4gIEVpdGhlciBpdCBhbHJlYWR5Ci0JICAgICBleGlzdHMsIG9yIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBpdC4gICovCi0JICByZXR1cm4gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKTsKLQl9Ci0KLSAgICAgIC8qIE9ubHkgc2V0IHRoZSBzbG90IGlmIHRoZSB0eXBlIGlzIGJlaW5nIGRlZmluZWQuICBUaGlzIG1lYW5zCi0gICAgICAgICB0aGF0IHRoZSBtYXBwaW5nIGZyb20gdHlwZSBudW1iZXJzIHRvIHR5cGVzIHdpbGwgb25seSByZWNvcmQKLSAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIHdoaWNoIGRlZmluZXMgYSB0eXBlLiAgSWYgd2UgZG9uJ3QgZG8KLSAgICAgICAgIHRoaXMsIHRoZW4gc29tZXRoaW5nIGxpa2UKLQkgICAgIHR5cGVkZWYgaW50IGZvbzsKLQkgICAgIGludCBpOwotCSB3aWxsIHJlY29yZCB0aGF0IGkgaXMgb2YgdHlwZSBmb28uICBVbmZvcnR1bmF0ZWx5LCBzdGFicwotCSBpbmZvcm1hdGlvbiBpcyBhbWJpZ3VvdXMgYWJvdXQgdmFyaWFibGUgdHlwZXMuICBGb3IgdGhpcyBjb2RlLAotCSAgICAgdHlwZWRlZiBpbnQgZm9vOwotCSAgICAgaW50IGk7Ci0JICAgICBmb28gajsKLQkgdGhlIHN0YWJzIGluZm9ybWF0aW9uIHJlY29yZHMgYm90aCBpIGFuZCBqIGFzIGhhdmluZyB0aGUgc2FtZQotCSB0eXBlLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBwYXRjaGluZyB0aGUgY29tcGlsZXIuICAqLwotICAgICAgaWYgKHNsb3RwICE9IE5VTEwgJiYgdHlwZW51bXNbMF0gPj0gMCAmJiB0eXBlbnVtc1sxXSA+PSAwKQotCSpzbG90cCA9IHN0YWJfZmluZF9zbG90IChpbmZvLCB0eXBlbnVtcyk7Ci0KLSAgICAgIC8qIFR5cGUgaXMgYmVpbmcgZGVmaW5lZCBoZXJlLiAgKi8KLSAgICAgIC8qIFNraXAgdGhlICc9Jy4gICovCi0gICAgICArKypwcDsKLQotICAgICAgd2hpbGUgKCoqcHAgPT0gJ0AnKQotCXsKLQkgIGNvbnN0IGNoYXIgKnAgPSAqcHAgKyAxOwotCSAgY29uc3QgY2hhciAqYXR0cjsKLQotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJygnIHx8ICpwID09ICctJykKLQkgICAgewotCSAgICAgIC8qIE1lbWJlciB0eXBlLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBUeXBlIGF0dHJpYnV0ZXMuICAqLwotCSAgYXR0ciA9IHA7Ci0KLQkgIGZvciAoOyAqcCAhPSAnOyc7ICsrcCkKLQkgICAgewotCSAgICAgIGlmICgqcCA9PSAnXDAnKQotCQl7Ci0JCSAgYmFkX3N0YWIgKG9yaWcpOwotCQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JCX0KLQkgICAgfQotCSAgKnBwID0gcCArIDE7Ci0KLQkgIHN3aXRjaCAoKmF0dHIpCi0JICAgIHsKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgc2l6ZSA9IGF0b2kgKGF0dHIgKyAxKTsKLQkgICAgICBpZiAoc2l6ZSA8PSAwKQotCQlzaXplID0gLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgc3RyaW5ncCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBJZ25vcmUgdW5yZWNvZ25pemVkIHR5cGUgYXR0cmlidXRlcywgc28gZnV0dXJlCi0JCSBjb21waWxlcnMgY2FuIGludmVudCBuZXcgb25lcy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGRlc2NyaXB0b3IgPSAqKnBwOwotICArKypwcDsKLQotICBzd2l0Y2ggKGRlc2NyaXB0b3IpCi0gICAgewotICAgIGNhc2UgJ3gnOgotICAgICAgewotCWVudW0gZGVidWdfdHlwZV9raW5kIGNvZGU7Ci0JY29uc3QgY2hhciAqcTEsICpxMiwgKnA7Ci0KLQkvKiBBIGNyb3NzIHJlZmVyZW5jZSB0byBhbm90aGVyIHR5cGUuICAqLwotCi0Jc3dpdGNoICgqKnBwKQotCSAgewotCSAgY2FzZSAncyc6Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX1NUUlVDVDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICd1JzoKLQkgICAgY29kZSA9IERFQlVHX0tJTkRfVU5JT047Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnZSc6Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX0VOVU07Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgLyogQ29tcGxhaW4gYW5kIGtlZXAgZ29pbmcsIHNvIGNvbXBpbGVycyBjYW4gaW52ZW50IG5ldwotCSAgICAgICBjcm9zcy1yZWZlcmVuY2UgdHlwZXMuICAqLwotCSAgICB3YXJuX3N0YWIgKG9yaWcsIF8oInVucmVjb2duaXplZCBjcm9zcyByZWZlcmVuY2UgdHlwZSIpKTsKLQkgICAgY29kZSA9IERFQlVHX0tJTkRfU1RSVUNUOwotCSAgICBicmVhazsKLQkgIH0KLQkrKypwcDsKLQotCXExID0gc3RyY2hyICgqcHAsICc8Jyk7Ci0JcCA9IHN0cmNociAoKnBwLCAnOicpOwotCWlmIChwID09IE5VTEwpCi0JICB7Ci0JICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQlpZiAocTEgIT0gTlVMTCAmJiBwID4gcTEgJiYgcFsxXSA9PSAnOicpCi0JICB7Ci0JICAgIGludCBuZXN0ID0gMDsKLQotCSAgICBmb3IgKHEyID0gcTE7ICpxMiAhPSAnXDAnOyArK3EyKQotCSAgICAgIHsKLQkJaWYgKCpxMiA9PSAnPCcpCi0JCSAgKytuZXN0OwotCQllbHNlIGlmICgqcTIgPT0gJz4nKQotCQkgIC0tbmVzdDsKLQkJZWxzZSBpZiAoKnEyID09ICc6JyAmJiBuZXN0ID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBwID0gcTI7Ci0JICAgIGlmICgqcCAhPSAnOicpCi0JICAgICAgewotCQliYWRfc3RhYiAob3JpZyk7Ci0JCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgfQotCSAgfQotCi0JLyogU29tZSB2ZXJzaW9ucyBvZiBnKysgY2FuIGVtaXQgc3RhYnMgbGlrZQotCSAgICAgICBmbGVlcDpUMjA9eHNmbGVlcDoKLQkgICB3aGljaCBkZWZpbmUgc3RydWN0dXJlcyBpbiB0ZXJtcyBvZiB0aGVtc2VsdmVzLiAgV2UgbmVlZCB0bwotCSAgIHRlbGwgdGhlIGNhbGxlciB0byBhdm9pZCBidWlsZGluZyBhIGNpcmN1bGFyIHN0cnVjdHVyZS4gICovCi0JaWYgKHR5cGVuYW1lICE9IE5VTEwKLQkgICAgJiYgc3RybmNtcCAodHlwZW5hbWUsICpwcCwgcCAtICpwcCkgPT0gMAotCSAgICAmJiB0eXBlbmFtZVtwIC0gKnBwXSA9PSAnXDAnKQotCSAgaW5mby0+c2VsZl9jcm9zc3JlZiA9IHRydWU7Ci0KLQlkdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgaW5mbywgKnBwLCBwIC0gKnBwLCBjb2RlKTsKLQotCSpwcCA9IHAgKyAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICctJzoKLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICBjYXNlICcoJzoKLSAgICAgIHsKLQljb25zdCBjaGFyICpob2xkOwotCWludCB4dHlwZW51bXNbMl07Ci0KLQkvKiBUaGlzIHR5cGUgaXMgZGVmaW5lZCBhcyBhbm90aGVyIHR5cGUuICAqLwotCi0JKCpwcCktLTsKLQlob2xkID0gKnBwOwotCi0JLyogUGVlayBhaGVhZCBhdCB0aGUgbnVtYmVyIHRvIGRldGVjdCB2b2lkLiAgKi8KLQlpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgeHR5cGVudW1zKSkKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQlpZiAodHlwZW51bXNbMF0gPT0geHR5cGVudW1zWzBdICYmIHR5cGVudW1zWzFdID09IHh0eXBlbnVtc1sxXSkKLQkgIHsKLQkgICAgLyogVGhpcyB0eXBlIGlzIGJlaW5nIGRlZmluZWQgYXMgaXRzZWxmLCB3aGljaCBtZWFucyB0aGF0Ci0gICAgICAgICAgICAgICBpdCBpcyB2b2lkLiAgKi8KLQkgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAqcHAgPSBob2xkOwotCi0JICAgIC8qIEdvIGJhY2sgdG8gdGhlIG51bWJlciBhbmQgaGF2ZSBwYXJzZV9zdGFiX3R5cGUgZ2V0IGl0LgotCSAgICAgICBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIGRlYWwgd2l0aCBzb21ldGhpbmcgbGlrZQotCSAgICAgICB0KDEsMik9KDMsNCk9Li4uIHdoaWNoIHRoZSBMdWNpZCBjb21waWxlciB1c2VzLiAgKi8KLQkgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0KLQlpZiAodHlwZW51bXNbMF0gIT0gLTEpCi0JICB7Ci0JICAgIGlmICghIHN0YWJfcmVjb3JkX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zLCBkdHlwZSkpCi0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAnKic6Ci0gICAgICBkdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgICBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkJKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCQlwcCwKLQkJCQkJCQkoZGVidWdfdHlwZSAqKikgTlVMTCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcmJzoKLSAgICAgIC8qIFJlZmVyZW5jZSB0byBhbm90aGVyIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZQotCSAgICAgICAoZGhhbmRsZSwKLQkJcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgICAgLyogRnVuY3Rpb24gcmV0dXJuaW5nIGFub3RoZXIgdHlwZS4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0JICAgICAgIChkaGFuZGxlLAotCQlwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCksCi0JCShkZWJ1Z190eXBlICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgLyogQ29uc3QgcXVhbGlmaWVyIG9uIHNvbWUgdHlwZSAoU3VuKS4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGFjY2VwdHMgJ2MnIGhlcmUgaWYgb3M5a19zdGFicy4gICovCi0gICAgICBkdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgIHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKLQkJCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgICBwcCwKLQkJCQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgLyogVm9sYXRpbGUgcXVhbCBvbiBzb21lIHR5cGUgKFN1bikuICAqLwotICAgICAgLyogRklYTUU6IGdkYiBhY2NlcHRzICdpJyBoZXJlIGlmIG9zOWtfc3RhYnMuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV92b2xhdGlsZV90eXBlCi0JICAgICAgIChkaGFuZGxlLAotCQlwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCkpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQCc6Ci0gICAgICAvKiBPZmZzZXQgKGNsYXNzICYgdmFyaWFibGUpIHR5cGUuICBUaGlzIGlzIHVzZWQgZm9yIGEgcG9pbnRlcgotICAgICAgICAgcmVsYXRpdmUgdG8gYW4gb2JqZWN0LiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGRvbWFpbjsKLQlkZWJ1Z190eXBlIG1lbXR5cGU7Ci0KLQkvKiBNZW1iZXIgdHlwZS4gICovCi0KLQlkb21haW4gPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChkb21haW4gPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCWlmICgqKnBwICE9ICcsJykKLQkgIHsKLQkgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCSsrKnBwOwotCi0JbWVtdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChtZW10eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQlkdHlwZSA9IGRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUgKGRoYW5kbGUsIGRvbWFpbiwgbWVtdHlwZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyMnOgotICAgICAgLyogTWV0aG9kIChjbGFzcyAmIGZuKSB0eXBlLiAgKi8KLSAgICAgIGlmICgqKnBwID09ICcjJykKLQl7Ci0JICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCi0JICArKypwcDsKLQkgIHJldHVybl90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChyZXR1cm5fdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICBpZiAoKipwcCAhPSAnOycpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgICAgfQotCSAgKysqcHA7Ci0JICBkdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLAotCQkJCQkgIERFQlVHX1RZUEVfTlVMTCwKLQkJCQkJICAoZGVidWdfdHlwZSAqKSBOVUxMLCBmYWxzZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlYnVnX3R5cGUgZG9tYWluOwotCSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLQkgIGRlYnVnX3R5cGUgKmFyZ3M7Ci0JICB1bnNpZ25lZCBpbnQgbjsKLQkgIHVuc2lnbmVkIGludCBhbGxvYzsKLQkgIGJvb2xlYW4gdmFyYXJnczsKLQotCSAgZG9tYWluID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGRvbWFpbiA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQkgIGlmICgqKnBwICE9ICcsJykKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICArKypwcDsKLQotCSAgcmV0dXJuX3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgYWxsb2MgPSAxMDsKLQkgIGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqYXJncyk7Ci0JICBuID0gMDsKLQkgIHdoaWxlICgqKnBwICE9ICc7JykKLQkgICAgewotCSAgICAgIGlmICgqKnBwICE9ICcsJykKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCQl9Ci0JICAgICAgKysqcHA7Ci0KLQkgICAgICBpZiAobiArIDEgPj0gYWxsb2MpCi0JCXsKLQkJICBhbGxvYyArPSAxMDsKLQkJICBhcmdzID0gKChkZWJ1Z190eXBlICopCi0JCQkgIHhyZWFsbG9jICgoUFRSKSBhcmdzLCBhbGxvYyAqIHNpemVvZiAqYXJncykpOwotCQl9Ci0KLQkgICAgICBhcmdzW25dID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgICAgICBpZiAoYXJnc1tuXSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgKytuOwotCSAgICB9Ci0JICArKypwcDsKLQotCSAgLyogSWYgdGhlIGxhc3QgdHlwZSBpcyBub3Qgdm9pZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHRha2VzIGEKLQkgICAgIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICBPdGhlcndpc2UsIHdlIG11c3Qgc3RyaXAKLQkgICAgIHRoZSB2b2lkIHR5cGUuICAqLwotCSAgaWYgKG4gPT0gMAotCSAgICAgIHx8IGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGFyZ3NbbiAtIDFdKSAhPSBERUJVR19LSU5EX1ZPSUQpCi0JICAgIHZhcmFyZ3MgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLS1uOwotCSAgICAgIHZhcmFyZ3MgPSBmYWxzZTsKLQkgICAgfQotCi0JICBhcmdzW25dID0gREVCVUdfVFlQRV9OVUxMOwotCi0JICBkdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBkb21haW4sIGFyZ3MsCi0JCQkJCSAgdmFyYXJncyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIC8qIFJhbmdlIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwgdHlwZW51bXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0gICAgICAvKiBTdW4gQUNDIGJ1aWx0aW4gaW50IHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAvKiBTdW4gQUNDIGJ1aWx0aW4gZmxvYXQgdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfc3VuX2Zsb2F0aW5nX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZSc6Ci0gICAgICAvKiBFbnVtZXJhdGlvbiB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9lbnVtX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAndSc6Ci0gICAgICAvKiBTdHJ1Y3Qgb3IgdW5pb24gdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwKLQkJCQkgICAgICBkZXNjcmlwdG9yID09ICdzJywgdHlwZW51bXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgIC8qIEFycmF5IHR5cGUuICAqLwotICAgICAgaWYgKCoqcHAgIT0gJ3InKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9hcnJheV90eXBlIChkaGFuZGxlLCBpbmZvLCBwcCwgc3RyaW5ncCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3NldF90eXBlIChkaGFuZGxlLAotCQkJCSAgIHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKLQkJCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkJICAgIHBwLAotCQkJCQkJICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKSwKLQkJCQkgICBzdHJpbmdwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAodHlwZW51bXNbMF0gIT0gLTEpCi0gICAgewotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIGR0eXBlKSkKLQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoc2l6ZSAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIChkaGFuZGxlLCBkdHlwZSwgKHVuc2lnbmVkIGludCkgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gZHR5cGU7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgYnkgd2hpY2ggYSB0eXBlIGlzIHJlZmVycmVkIHRvIGluIGRieCBkYXRhLCBvcgotICAgcGVyaGFwcyByZWFkIGEgcGFpciAoRklMRU5VTSwgVFlQRU5VTSkgaW4gcGFyZW50aGVzZXMuICBKdXN0IGEKLSAgIHNpbmdsZSBudW1iZXIgTiBpcyBlcXVpdmFsZW50IHRvICgwLE4pLiAgUmV0dXJuIHRoZSB0d28gbnVtYmVycyBieQotICAgc3RvcmluZyB0aGVtIGluIHRoZSB2ZWN0b3IgVFlQRU5VTVMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHR5cGVudW1zKQotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGludCAqdHlwZW51bXM7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBpZiAoKipwcCAhPSAnKCcpCi0gICAgewotICAgICAgdHlwZW51bXNbMF0gPSAwOwotICAgICAgdHlwZW51bXNbMV0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIHR5cGVudW1zWzBdID0gKGludCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgdHlwZW51bXNbMV0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICAgIGlmICgqKnBwICE9ICcpJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9yYW5nZV90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsIHR5cGVudW1zKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBpbnQgcmFuZ2VudW1zWzJdOwotICBib29sZWFuIHNlbGZfc3VicmFuZ2U7Ci0gIGRlYnVnX3R5cGUgaW5kZXhfdHlwZTsKLSAgY29uc3QgY2hhciAqczIsICpzMzsKLSAgYmZkX3NpZ25lZF92bWEgbjIsIG4zOwotICBib29sZWFuIG92Miwgb3YzOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgaW5kZXhfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAvKiBGaXJzdCBjb21lcyBhIHR5cGUgd2UgYXJlIGEgc3VicmFuZ2Ugb2YuCi0gICAgIEluIEMgaXQgaXMgdXN1YWxseSAwLCAxIG9yIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuICAqLwotICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgcmFuZ2VudW1zKSkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHNlbGZfc3VicmFuZ2UgPSAocmFuZ2VudW1zWzBdID09IHR5cGVudW1zWzBdCi0JCSAgICYmIHJhbmdlbnVtc1sxXSA9PSB0eXBlbnVtc1sxXSk7Ci0KLSAgaWYgKCoqcHAgPT0gJz0nKQotICAgIHsKLSAgICAgICpwcCA9IG9yaWc7Ci0gICAgICBpbmRleF90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmICgqKnBwID09ICc7JykKLSAgICArKypwcDsKLQotICAvKiBUaGUgcmVtYWluaW5nIHR3byBvcGVyYW5kcyBhcmUgdXN1YWxseSBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9mCi0gICAgIHRoZSByYW5nZS4gIEJ1dCBpbiBzb21lIHNwZWNpYWwgY2FzZXMgdGhleSBtZWFuIHNvbWV0aGluZyBlbHNlLiAgKi8KLSAgczIgPSAqcHA7Ci0gIG4yID0gcGFyc2VfbnVtYmVyIChwcCwgJm92Mik7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgczMgPSAqcHA7Ci0gIG4zID0gcGFyc2VfbnVtYmVyIChwcCwgJm92Myk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgaWYgKG92MiB8fCBvdjMpCi0gICAgewotICAgICAgLyogZ2NjIHdpbGwgZW1pdCByYW5nZSBzdGFicyBmb3IgbG9uZyBsb25nIHR5cGVzLiAgSGFuZGxlIHRoaXMKLSAgICAgICAgIGFzIGEgc3BlY2lhbCBjYXNlLiAgRklYTUU6IFRoaXMgbmVlZHMgdG8gYmUgbW9yZSBnZW5lcmFsLiAgKi8KLSNkZWZpbmUgTExMT1cgICIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDsiCi0jZGVmaW5lIExMSElHSCAiMDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsiCi0jZGVmaW5lIFVMTEhJR0ggIjAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIKLSAgICAgIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQl7Ci0JICBpZiAoc3RybmNtcCAoczIsIExMTE9XLCBzaXplb2YgTExMT1cgLSAxKSA9PSAwCi0JICAgICAgJiYgc3RybmNtcCAoczMsIExMSElHSCwgc2l6ZW9mIExMSElHSCAtIDEpID09IDApCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0JICBpZiAoISBvdjIKLQkgICAgICAmJiBuMiA9PSAwCi0JICAgICAgJiYgc3RybmNtcCAoczMsIFVMTEhJR0gsIHNpemVvZiBVTExISUdIIC0gMSkgPT0gMCkKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOwotCX0KLQotICAgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJudW1lcmljIG92ZXJmbG93IikpOwotICAgIH0KLQotICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgewotICAgICAgLyogQSB0eXBlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpdHNlbGYsIHdpdGggYm90aCBib3VuZHMgMCwKLSAgICAgICAgIGlzIHZvaWQuICAqLwotICAgICAgaWYgKHNlbGZfc3VicmFuZ2UgJiYgbjIgPT0gMCAmJiBuMyA9PSAwKQotCXJldHVybiBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0KLSAgICAgIC8qIEEgdHlwZSBkZWZpbmVkIGFzIGEgc3VicmFuZ2Ugb2YgaXRzZWxmLCB3aXRoIG4yIHBvc2l0aXZlIGFuZAotCSBuMyB6ZXJvLCBpcyBhIGNvbXBsZXggdHlwZSwgYW5kIG4yIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuICAqLwotICAgICAgaWYgKHNlbGZfc3VicmFuZ2UgJiYgbjMgPT0gMCAmJiBuMiA+IDApCi0JcmV0dXJuIGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCBuMik7Ci0KLSAgICAgIC8qIElmIG4zIGlzIHplcm8gYW5kIG4yIGlzIHBvc2l0aXZlLCB0aGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQKLSAgICAgICAgIHR5cGUsIGFuZCBuMiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAgKi8KLSAgICAgIGlmIChuMyA9PSAwICYmIG4yID4gMCkKLQlyZXR1cm4gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCBuMik7Ci0KLSAgICAgIC8qIElmIHRoZSB1cHBlciBib3VuZCBpcyAtMSwgdGhpcyBpcyBhbiB1bnNpZ25lZCBpbnQuICAqLwotICAgICAgaWYgKG4yID09IDAgJiYgbjMgPT0gLTEpCi0JewotCSAgLyogV2hlbiBnY2MgaXMgdXNlZCB3aXRoIC1nc3RhYnMsIGJ1dCBub3QgLWdzdGFicyssIGl0IHdpbGwgZW1pdAotCSAgICAgICAgIGxvbmcgbG9uZyBpbnQ6dDY9cjE7MDstMTsKLQkJIGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQ6dDc9cjE7MDstMTsKLQkgICAgIFdlIGhhY2sgaGVyZSB0byBoYW5kbGUgdGhpcyByZWFzb25hYmx5LiAgKi8KLQkgIGlmICh0eXBlbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJsb25nIGxvbmcgaW50IikgPT0gMCkKLQkJcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAibG9uZyBsb25nIHVuc2lnbmVkIGludCIpID09IDApCi0JCXJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLQkgICAgfQotCSAgLyogRklYTUU6IFRoZSBzaXplIGhlcmUgcmVhbGx5IGRlcGVuZHMgdXBvbiB0aGUgdGFyZ2V0LiAgKi8KLQkgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLQl9Ci0KLSAgICAgIC8qIEEgcmFuZ2Ugb2YgMCB0byAxMjcgaXMgY2hhci4gICovCi0gICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMiA9PSAwICYmIG4zID09IDEyNykKLQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBmb3IgdGhlIGxhbmd1YWdlIENISUxMIGhlcmUuICAqLwotCi0gICAgICBpZiAobjIgPT0gMCkKLQl7Ci0JICBpZiAobjMgPCAwKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgLSBuMywgdHJ1ZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweGZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweGZmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLQkgIGVsc2UgaWYgKG4zID09IChiZmRfc2lnbmVkX3ZtYSkgMHhmZmZmZmZmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotI2lmZGVmIEJGRDY0Ci0JICBlbHNlIGlmIChuMyA9PSAoKCgoYmZkX3ZtYSkgMHhmZmZmZmZmZikgPDwgMzIpIHwgMHhmZmZmZmZmZikpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLSNlbmRpZgotCX0KLSAgICAgIGVsc2UgaWYgKG4zID09IDAKLQkgICAgICAgJiYgbjIgPCAwCi0JICAgICAgICYmIChzZWxmX3N1YnJhbmdlIHx8IG4yID09IC04KSkKLQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgLSBuMiwgdHJ1ZSk7Ci0gICAgICBlbHNlIGlmIChuMiA9PSAtIG4zIC0gMSB8fCBuMiA9PSBuMyArIDEpCi0JewotCSAgaWYgKG4zID09IDB4N2YpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweDdmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweDdmZmZmZmZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotI2lmZGVmIEJGRDY0Ci0JICBlbHNlIGlmIChuMyA9PSAoKCgoYmZkX3ZtYSkgMHg3ZmZmZmZmZikgPDwgMzIpIHwgMHhmZmZmZmZmZikpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotCi0gIC8qIEF0IHRoaXMgcG9pbnQgSSBkb24ndCBoYXZlIHRoZSBmYWludGVzdCBpZGVhIGhvdyB0byBkZWFsIHdpdGggYQotICAgICBzZWxmX3N1YnJhbmdlIHR5cGU7IEknbSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGlzIGlzIHVzZWQgYXMgYW4KLSAgICAgaWRpb20sIGFuZCB0aGF0IGFsbCBvZiB0aGVtIGFyZSBzcGVjaWFsIGNhc2VzLiAgU28gLiAuIC4gICovCi0gIGlmIChzZWxmX3N1YnJhbmdlKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGluZGV4X3R5cGUgPSBzdGFiX2ZpbmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgcmFuZ2VudW1zKTsKLSAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHsKLSAgICAgIC8qIERvZXMgdGhpcyBhY3R1YWxseSBldmVyIGhhcHBlbj8gIElzIHRoYXQgd2h5IHdlIGFyZSB3b3JyeWluZwotICAgICAgICAgYWJvdXQgZGVhbGluZyB3aXRoIGl0IHJhdGhlciB0aGFuIGp1c3QgY2FsbGluZyBlcnJvcl90eXBlPyAgKi8KLSAgICAgIHdhcm5fc3RhYiAob3JpZywgXygibWlzc2luZyBpbmRleCB0eXBlIikpOwotICAgICAgaW5kZXhfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfcmFuZ2VfdHlwZSAoZGhhbmRsZSwgaW5kZXhfdHlwZSwgbjIsIG4zKTsKLX0KLQotLyogU3VuJ3MgQUNDIHVzZXMgYSBzb21ld2hhdCBzYW5lciBtZXRob2QgZm9yIHNwZWNpZnlpbmcgdGhlIGJ1aWx0aW4KLSAgIHR5cGVkZWZzIGluIGV2ZXJ5IGZpbGUgKGZvciBpbnQsIGxvbmcsIGV0Yyk6Ci0KLQl0eXBlID0gYiA8c2lnbmVkPiA8d2lkdGg+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+dHlwZXMgKyBpbmRleDsKLX0KLQotLyogRmluZCBhIHR5cGUgZ2l2ZW4gYSB0eXBlIG51bWJlci4gIElmIHRoZSB0eXBlIGhhcyBub3QgYmVlbgotICAgYWxsb2NhdGVkIHlldCwgY3JlYXRlIGFuIGluZGlyZWN0IHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBkZWJ1Z190eXBlICpzbG90OwotCi0gIGlmICh0eXBlbnVtc1swXSA9PSAwICYmIHR5cGVudW1zWzFdIDwgMCkKLSAgICB7Ci0gICAgICAvKiBBIG5lZ2F0aXZlIHR5cGUgbnVtYmVyIGluZGljYXRlcyBhbiBYQ09GRiBidWlsdGluIHR5cGUuICAqLwotICAgICAgcmV0dXJuIHN0YWJfeGNvZmZfYnVpbHRpbl90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtc1sxXSk7Ci0gICAgfQotCi0gIHNsb3QgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOwotICBpZiAoc2xvdCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKCpzbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBzbG90LCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQotICByZXR1cm4gKnNsb3Q7Ci19Ci0KLS8qIFJlY29yZCB0aGF0IGEgZ2l2ZW4gdHlwZSBudW1iZXIgcmVmZXJzIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3JlY29yZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcywgdHlwZSkKLSAgICAgUFRSIGRoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGRlYnVnX3R5cGUgKnNsb3Q7Ci0KLSAgc2xvdCA9IHN0YWJfZmluZF9zbG90IChpbmZvLCB0eXBlbnVtcyk7Ci0gIGlmIChzbG90ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGdkYiBhcHBlYXJzIHRvIGlnbm9yZSB0eXBlIHJlZGVmaW5pdGlvbnMsIHNvIHdlIGRvIGFzIHdlbGwuICAqLwotCi0gICpzbG90ID0gdHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIGFuIFhDT0ZGIGJ1aWx0aW4gdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1zdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bSkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IHR5cGVudW07Ci17Ci0gIGRlYnVnX3R5cGUgcmV0dHlwZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAodHlwZW51bSA+PSAwIHx8IHR5cGVudW0gPCAtWENPRkZfVFlQRV9DT1VOVCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBYQ09GRiB0eXBlICVkXG4iKSwgdHlwZW51bSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgaWYgKGluZm8tPnhjb2ZmX3R5cGVzWy10eXBlbnVtXSAhPSBOVUxMKQotICAgIHJldHVybiBpbmZvLT54Y29mZl90eXBlc1stdHlwZW51bV07Ci0KLSAgc3dpdGNoICgtdHlwZW51bSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgLyogVGhlIHNpemUgb2YgdGhpcyBhbmQgYWxsIHRoZSBvdGhlciB0eXBlcyBhcmUgZml4ZWQsIGRlZmluZWQKLQkgYnkgdGhlIGRlYnVnZ2luZyBmb3JtYXQuICAqLwotICAgICAgbmFtZSA9ICJpbnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG5hbWUgPSAiY2hhciI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgbmFtZSA9ICJzaG9ydCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGNoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgbmFtZSA9ICJzaWduZWQgY2hhciI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA3OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGludCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDk6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICBjYXNlIDEwOgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTE6Ci0gICAgICBuYW1lID0gInZvaWQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6Ci0gICAgICAvKiBJRUVFIHNpbmdsZSBwcmVjaXNpb24gKDMyIGJpdCkuICAqLwotICAgICAgbmFtZSA9ICJmbG9hdCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTM6Ci0gICAgICAvKiBJRUVFIGRvdWJsZSBwcmVjaXNpb24gKDY0IGJpdCkuICAqLwotICAgICAgbmFtZSA9ICJkb3VibGUiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE0OgotICAgICAgLyogVGhpcyBpcyBhbiBJRUVFIGRvdWJsZSBvbiB0aGUgUlMvNjAwMCwgYW5kIGRpZmZlcmVudCBtYWNoaW5lcwotCSB3aXRoIGRpZmZlcmVudCBzaXplcyBmb3IgImxvbmcgZG91YmxlIiBzaG91bGQgdXNlIGRpZmZlcmVudAotCSBuZWdhdGl2ZSB0eXBlIG51bWJlcnMuICBTZWUgc3RhYnMudGV4aW5mby4gICovCi0gICAgICBuYW1lID0gImxvbmcgZG91YmxlIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNToKLSAgICAgIG5hbWUgPSAiaW50ZWdlciI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIG5hbWUgPSAiYm9vbGVhbiI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzoKLSAgICAgIG5hbWUgPSAic2hvcnQgcmVhbCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTg6Ci0gICAgICBuYW1lID0gInJlYWwiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE5OgotICAgICAgLyogRklYTUUgKi8KLSAgICAgIG5hbWUgPSAic3RyaW5ncHRyIjsKLSAgICAgIHJldHR5cGUgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMDoKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBuYW1lID0gImNoYXJhY3RlciI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIxOgotICAgICAgbmFtZSA9ICJsb2dpY2FsKjEiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjI6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqMiI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMzoKLSAgICAgIG5hbWUgPSAibG9naWNhbCo0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgbmFtZSA9ICJsb2dpY2FsIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI1OgotICAgICAgLyogQ29tcGxleCB0eXBlIGNvbnNpc3Rpbmcgb2YgdHdvIElFRUUgc2luZ2xlIHByZWNpc2lvbiB2YWx1ZXMuICAqLwotICAgICAgbmFtZSA9ICJjb21wbGV4IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoZGhhbmRsZSwgOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI2OgotICAgICAgLyogQ29tcGxleCB0eXBlIGNvbnNpc3Rpbmcgb2YgdHdvIElFRUUgZG91YmxlIHByZWNpc2lvbiB2YWx1ZXMuICAqLwotICAgICAgbmFtZSA9ICJkb3VibGUgY29tcGxleCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjc6Ci0gICAgICBuYW1lID0gImludGVnZXIqMSI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyODoKLSAgICAgIG5hbWUgPSAiaW50ZWdlcioyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI5OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyKjQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzA6Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgbmFtZSA9ICJ3Y2hhciI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMToKLSAgICAgIG5hbWUgPSAibG9uZyBsb25nIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIGxvbmciOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMzoKLSAgICAgIG5hbWUgPSAibG9naWNhbCo4IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM0OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyKjgiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgcmV0dHlwZSk7Ci0KLSAgaW5mby0+eGNvZmZfdHlwZXNbLXR5cGVudW1dID0gcmV0dHlwZTsKLQotICByZXR1cm4gcmV0dHlwZTsKLX0KLQotLyogRmluZCBvciBjcmVhdGUgYSB0YWdnZWQgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1zdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIGluZm8sIHAsIGxlbiwga2luZCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgaW50IGxlbjsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgZGVidWdfdHlwZSBkdHlwZTsKLSAgc3RydWN0IHN0YWJfdGFnICpzdDsKLQotICBuYW1lID0gc2F2ZXN0cmluZyAocCwgbGVuKTsKLQotICAvKiBXZSBwYXNzIERFQlVHX0tJTkRfSUxMRUdBTCBiZWNhdXNlIHdlIHdhbnQgYWxsIHRhZ3MgaW4gdGhlIHNhbWUKLSAgICAgbmFtZXNwYWNlLiAgVGhpcyBpcyByaWdodCBmb3IgQywgYW5kIEkgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlCi0gICAgIG90aGVyIGxhbmd1YWdlcy4gIEZJWE1FLiAgKi8KLSAgZHR5cGUgPSBkZWJ1Z19maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBuYW1lLCBERUJVR19LSU5EX0lMTEVHQUwpOwotICBpZiAoZHR5cGUgIT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKG5hbWUpOwotICAgICAgcmV0dXJuIGR0eXBlOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGVudHJ5IG9uIHRoZSB1bmRlZmluZWQgdGFnIGxpc3QuICAqLwotICBmb3IgKHN0ID0gaW5mby0+dGFnczsgc3QgIT0gTlVMTDsgc3QgPSBzdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3QtPm5hbWVbMF0gPT0gbmFtZVswXQotCSAgJiYgc3RyY21wIChzdC0+bmFtZSwgbmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoc3QtPmtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMKQotCSAgICBzdC0+a2luZCA9IGtpbmQ7Ci0JICBmcmVlIChuYW1lKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmIChzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0ID0gKHN0cnVjdCBzdGFiX3RhZyAqKSB4bWFsbG9jIChzaXplb2YgKnN0KTsKLSAgICAgIG1lbXNldCAoc3QsIDAsIHNpemVvZiAqc3QpOwotCi0gICAgICBzdC0+bmV4dCA9IGluZm8tPnRhZ3M7Ci0gICAgICBzdC0+bmFtZSA9IG5hbWU7Ci0gICAgICBzdC0+a2luZCA9IGtpbmQ7Ci0gICAgICBzdC0+c2xvdCA9IERFQlVHX1RZUEVfTlVMTDsKLSAgICAgIHN0LT50eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCAmc3QtPnNsb3QsIG5hbWUpOwotICAgICAgaW5mby0+dGFncyA9IHN0OwotICAgIH0KLQotICByZXR1cm4gc3QtPnR5cGU7Ci19Ci0MCi0vKiBJbiBvcmRlciB0byBnZXQgdGhlIGNvcnJlY3QgYXJndW1lbnQgdHlwZXMgZm9yIGEgc3R1YmJlZCBtZXRob2QsIHdlCi0gICBuZWVkIHRvIGV4dHJhY3QgdGhlIGFyZ3VtZW50IHR5cGVzIGZyb20gYSBDKysgbWFuZ2xlZCBzdHJpbmcuCi0gICBTaW5jZSB0aGUgYXJndW1lbnQgdHlwZXMgY2FuIHJlZmVyIGJhY2sgdG8gdGhlIHJldHVybiB0eXBlLCB0aGlzCi0gICBtZWFucyB0aGF0IHdlIG11c3QgZGVtYW5nbGUgdGhlIGVudGlyZSBwaHlzaWNhbCBuYW1lLiAgSW4gZ2RiIHRoaXMKLSAgIGlzIGRvbmUgYnkgY2FsbGluZyBjcGx1c19kZW1hbmdsZSBhbmQgcnVubmluZyB0aGUgcmVzdWx0cyBiYWNrCi0gICB0aHJvdWdoIHRoZSBDKysgZXhwcmVzc2lvbiBwYXJzZXIuICBTaW5jZSB3ZSBoYXZlIG5vIGV4cHJlc3Npb24KLSAgIHBhcnNlciwgd2UgbXVzdCBkdXBsaWNhdGUgbXVjaCBvZiB0aGUgd29yayBvZiBjcGx1c19kZW1hbmdsZSBoZXJlLgotCi0gICBXZSBhc3N1bWUgdGhhdCBHTlUgc3R5bGUgZGVtYW5nbGluZyBpcyB1c2VkLCBzaW5jZSB0aGlzIGlzIG9ubHkKLSAgIGRvbmUgZm9yIG1ldGhvZCBzdHVicywgYW5kIG9ubHkgZysrIHNob3VsZCBvdXRwdXQgdGhhdCBmb3JtIG9mCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHR5cGUgaW5mb3JtYXRpb24gd2hpY2gKLSAgIGRlbWFuZ2xpbmcgYSBzdHJpbmcuICAqLwotCi1zdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nCi17Ci0gIC8qIFRoZSBzdGFydCBvZiB0aGUgdHlwZS4gIFRoaXMgaXMgbm90IG51bGwgdGVybWluYXRlZC4gICovCi0gIGNvbnN0IGNoYXIgKnR5cGVzdHJpbmc7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgbGVuOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIHdoaWxlIGRlbWFuZ2xpbmcgYQotICAgc3RyaW5nLiAgKi8KLQotc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbwotewotICAvKiBUaGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGhhbmRsZS4gICovCi0gIFBUUiBkaGFuZGxlOwotICAvKiBUaGUgc3RhYiBpbmZvcm1hdGlvbiBoYW5kbGUuICAqLwotICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gIC8qIFRoZSBhcnJheSBvZiBhcmd1bWVudHMgd2UgYXJlIGJ1aWxkaW5nLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnczsKLSAgLyogV2hldGhlciB0aGUgbWV0aG9kIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0gIGJvb2xlYW4gdmFyYXJnczsKLSAgLyogVGhlIGFycmF5IG9mIHR5cGVzIHdlIGhhdmUgcmVtZW1iZXJlZC4gICovCi0gIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcgKnR5cGVzdHJpbmdzOwotICAvKiBUaGUgbnVtYmVyIG9mIHR5cGVzdHJpbmdzLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGVzdHJpbmdfY291bnQ7Ci0gIC8qIFRoZSBudW1iZXIgb2YgdHlwZXN0cmluZyBzbG90cyB3ZSBoYXZlIGFsbG9jYXRlZC4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlc3RyaW5nX2FsbG9jOwotfTsKLQotc3RhdGljIHZvaWQgc3RhYl9iYWRfZGVtYW5nbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHN0YWJfZGVtYW5nbGVfY291bnQgUEFSQU1TICgoY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9nZXRfY291bnQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfcHJlZml4Ci0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9mdW5jdGlvbl9uYW1lCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3NpZ25hdHVyZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9jbGFzcwotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfYXJncwotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKiosCi0JICAgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2FyZwotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKiosCi0JICAgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi0vKiBXYXJuIGFib3V0IGEgYmFkIGRlbWFuZ2xpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotc3RhYl9iYWRfZGVtYW5nbGUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiYmFkIG1hbmdsZWQgbmFtZSBgJXMnXG4iKSwgcyk7Ci19Ci0KLS8qIEdldCBhIGNvdW50IGZyb20gYSBzdGFiIHN0cmluZy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXN0YWJfZGVtYW5nbGVfY291bnQgKHBwKQotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBjb3VudCA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0gICAgewotICAgICAgY291bnQgKj0gMTA7Ci0gICAgICBjb3VudCArPSAqKnBwIC0gJzAnOwotICAgICAgKysqcHA7Ci0gICAgfQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qIFJlcXVpcmUgYSBjb3VudCBpbiBhIHN0cmluZy4gIFRoZSBjb3VudCBtYXkgYmUgbXVsdGlwbGUgZGlnaXRzLCBpbgotICAgd2hpY2ggY2FzZSBpdCBtdXN0IGVuZCBpbiBhbiB1bmRlcnNjb3JlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgcGkpCi0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgdW5zaWduZWQgaW50ICpwaTsKLXsKLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqcGkgPSAqKnBwIC0gJzAnOwotICArKypwcDsKLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gICAgICBjb25zdCBjaGFyICpwOwotCi0gICAgICBjb3VudCA9ICpwaTsKLSAgICAgIHAgPSAqcHA7Ci0gICAgICBkbwotCXsKLQkgIGNvdW50ICo9IDEwOwotCSAgY291bnQgKz0gKnAgLSAnMCc7Ci0JICArK3A7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkpOwotICAgICAgaWYgKCpwID09ICdfJykKLQl7Ci0JICAqcHAgPSBwICsgMTsKLQkgICpwaSA9IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gZGVtYW5nbGVzIGEgcGh5c2ljYWwgbmFtZSwgcmV0dXJuaW5nIGEgTlVMTAotICAgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLXN0YWJfZGVtYW5nbGVfYXJndHlwZXMgKGRoYW5kbGUsIGluZm8sIHBoeXNuYW1lLCBwdmFyYXJncykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGJvb2xlYW4gKnB2YXJhcmdzOwotewotICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvIG1pbmZvOwotCi0gIG1pbmZvLmRoYW5kbGUgPSBkaGFuZGxlOwotICBtaW5mby5pbmZvID0gaW5mbzsKLSAgbWluZm8uYXJncyA9IE5VTEw7Ci0gIG1pbmZvLnZhcmFyZ3MgPSBmYWxzZTsKLSAgbWluZm8udHlwZXN0cmluZ19hbGxvYyA9IDEwOwotICBtaW5mby50eXBlc3RyaW5ncyA9ICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZyAqKQotCQkgICAgICAgeG1hbGxvYyAobWluZm8udHlwZXN0cmluZ19hbGxvYwotCQkJCSogc2l6ZW9mICptaW5mby50eXBlc3RyaW5ncykpOwotICBtaW5mby50eXBlc3RyaW5nX2NvdW50ID0gMDsKLQotICAvKiBjcGx1c19kZW1hbmdsZSBjaGVja3MgZm9yIHNwZWNpYWwgR05VIG1hbmdsZWQgZm9ybXMsIGJ1dCB3ZSBjYW4ndAotICAgICBzZWUgYW55IG9mIHRoZW0gaW4gbWFuZ2xlZCBtZXRob2QgYXJndW1lbnQgdHlwZXMuICAqLwotCi0gIGlmICghIHN0YWJfZGVtYW5nbGVfcHJlZml4ICgmbWluZm8sICZwaHlzbmFtZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCpwaHlzbmFtZSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfc2lnbmF0dXJlICgmbWluZm8sICZwaHlzbmFtZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZyZWUgKG1pbmZvLnR5cGVzdHJpbmdzKTsKLSAgbWluZm8udHlwZXN0cmluZ3MgPSBOVUxMOwotCi0gIGlmIChtaW5mby5hcmdzID09IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJubyBhcmd1bWVudCB0eXBlcyBpbiBtYW5nbGVkIHN0cmluZ1xuIikpOwotCi0gICpwdmFyYXJncyA9IG1pbmZvLnZhcmFyZ3M7Ci0gIHJldHVybiBtaW5mby5hcmdzOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAobWluZm8udHlwZXN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChtaW5mby50eXBlc3RyaW5ncyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZW1hbmdsZSB0aGUgcHJlZml4IG9mIHRoZSBtYW5nbGVkIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9wcmVmaXggKG1pbmZvLCBwcCkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgY29uc3QgY2hhciAqc2NhbjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogY3BsdXNfZGVtYW5nbGUgY2hlY2tzIGZvciBnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycywKLSAgICAgYnV0IHdlIGNhbid0IHNlZSB0aGVtIGluIG1hbmdsZWQgYXJndW1lbnQgdHlwZXMuICAqLwotCi0gIC8qIExvb2sgZm9yIGBfXycuICAqLwotICBzY2FuID0gKnBwOwotICBkbwotICAgIHsKLSAgICAgIHNjYW4gPSBzdHJjaHIgKHNjYW4sICdfJyk7Ci0gICAgfQotICB3aGlsZSAoc2NhbiAhPSBOVUxMICYmICorK3NjYW4gIT0gJ18nKTsKLQotICBpZiAoc2NhbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlICgqcHApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAtLXNjYW47Ci0KLSAgLyogV2UgZm91bmQgYF9fJzsgbW92ZSBhaGVhZCB0byB0aGUgbGFzdCBjb250aWd1b3VzIGBfXycgcGFpci4gICovCi0gIGkgPSBzdHJzcG4gKHNjYW4sICJfIik7Ci0gIGlmIChpID4gMikKLSAgICBzY2FuICs9IGkgLSAyOwotCi0gIGlmIChzY2FuID09ICpwcAotICAgICAgJiYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzY2FuWzJdKQotCSAgfHwgc2NhblsyXSA9PSAnUScKLQkgIHx8IHNjYW5bMl0gPT0gJ3QnKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgR05VIHN0eWxlIGNvbnN0cnVjdG9yIG5hbWUuICAqLwotICAgICAgKnBwID0gc2NhbiArIDI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHNjYW4gPT0gKnBwCi0JICAgJiYgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc2NhblsyXSkKLQkgICAmJiBzY2FuWzJdICE9ICd0JykKLSAgICB7Ci0gICAgICAvKiBMb29rIGZvciB0aGUgYF9fJyB0aGF0IHNlcGFyYXRlcyB0aGUgcHJlZml4IGZyb20gdGhlCi0gICAgICAgICBzaWduYXR1cmUuICAqLwotICAgICAgd2hpbGUgKCpzY2FuID09ICdfJykKLQkrK3NjYW47Ci0gICAgICBzY2FuID0gc3Ryc3RyIChzY2FuLCAiX18iKTsKLSAgICAgIGlmIChzY2FuID09IE5VTEwgfHwgc2NhblsyXSA9PSAnXDAnKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlICgqcHApOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAobWluZm8sIHBwLCBzY2FuKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHNjYW5bMl0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBUaGUgbmFtZSBkb2Vzbid0IHN0YXJ0IHdpdGggYF9fJywgYnV0IGl0IGRvZXMgY29udGFpbiBgX18nLiAgKi8KLSAgICAgIHJldHVybiBzdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKG1pbmZvLCBwcCwgc2Nhbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKCpwcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBEZW1hbmdsZSBhIGZ1bmN0aW9uIG5hbWUgcHJlZml4LiAgVGhlIHNjYW4gYXJndW1lbnQgcG9pbnRzIHRvIHRoZQotICAgZG91YmxlIHVuZGVyc2NvcmUgd2hpY2ggc2VwYXJhdGVzIHRoZSBmdW5jdGlvbiBuYW1lIGZyb20gdGhlCi0gICBzaWduYXR1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIChtaW5mbywgcHAsIHNjYW4pCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKnNjYW47Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIHN0cmluZyBmcm9tICpwcCB0byBzY2FuIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gIFdlCi0gICAgIGRvbid0IGNhcmUgYWJvdXQgdGhlIG5hbWUsIHNpbmNlIHdlIGp1c3QgbG9va2luZyBmb3IgYXJndW1lbnQKLSAgICAgdHlwZXMuICBIb3dldmVyLCBmb3IgY29udmVyc2lvbiBvcGVyYXRvcnMsIHRoZSBuYW1lIG1heSBpbmNsdWRlIGEKLSAgICAgdHlwZSB3aGljaCB3ZSBtdXN0IHJlbWVtYmVyIGluIG9yZGVyIHRvIGhhbmRsZSBiYWNrcmVmZXJlbmNlcy4gICovCi0KLSAgbmFtZSA9ICpwcDsKLSAgKnBwID0gc2NhbiArIDI7Ci0KLSAgaWYgKCpwcCAtIG5hbWUgPj0gNQotCSAgICYmIHN0cm5jbXAgKG5hbWUsICJ0eXBlIiwgNCkgPT0gMAotCSAgICYmIChuYW1lWzRdID09ICckJyB8fCBuYW1lWzRdID09ICcuJykpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqdGVtOwotCi0gICAgICAvKiBUaGlzIGlzIGEgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yLiAgKi8KLSAgICAgIHRlbSA9IG5hbWUgKyA1OwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgJnRlbSwgKGRlYnVnX3R5cGUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAobmFtZVswXSA9PSAnXycKLQkgICAmJiBuYW1lWzFdID09ICdfJwotCSAgICYmIG5hbWVbMl0gPT0gJ28nCi0JICAgJiYgbmFtZVszXSA9PSAncCcpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqdGVtOwotCi0gICAgICAvKiBUaGlzIGlzIGEgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yLiAgKi8KLSAgICAgIHRlbSA9IG5hbWUgKyA0OwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgJnRlbSwgKGRlYnVnX3R5cGUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgdGhlIHNpZ25hdHVyZS4gIFRoaXMgaXMgd2hlcmUgdGhlIGFyZ3VtZW50IHR5cGVzIGFyZQotICAgZm91bmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9zaWduYXR1cmUgKG1pbmZvLCBwcCkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgYm9vbGVhbiBleHBlY3RfZnVuYywgZnVuY19kb25lOwotICBjb25zdCBjaGFyICpob2xkOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgZXhwZWN0X2Z1bmMgPSBmYWxzZTsKLSAgZnVuY19kb25lID0gZmFsc2U7Ci0gIGhvbGQgPSBOVUxMOwotCi0gIHdoaWxlICgqKnBwICE9ICdcMCcpCi0gICAgewotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICdRJzoKLQkgIGhvbGQgPSAqcHA7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZCAobWluZm8sIHBwLCAoZGVidWdfdHlwZSAqKSBOVUxMKQotCSAgICAgIHx8ICEgc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgaG9sZCwgKnBwIC0gaG9sZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKLQkgIGhvbGQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdTJzoKLQkgIC8qIFN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uICBGSVhNRTogQ2FuIHRoaXMgaGFwcGVuPyAgKi8KLQkgIGlmIChob2xkID09IE5VTEwpCi0JICAgIGhvbGQgPSAqcHA7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQyc6Ci0JICAvKiBDb25zdCBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgaWYgKGhvbGQgPT0gTlVMTCkKLQkgICAgaG9sZCA9ICpwcDsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0JY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCSAgaWYgKGhvbGQgPT0gTlVMTCkKLQkgICAgaG9sZCA9ICpwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfY2xhc3MgKG1pbmZvLCBwcCwgKGNvbnN0IGNoYXIgKiopIE5VTEwpCi0JICAgICAgfHwgISBzdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBob2xkLCAqcHAgLSBob2xkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZXhwZWN0X2Z1bmMgPSB0cnVlOwotCSAgaG9sZCA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgLyogRnVuY3Rpb24uICBJIGRvbid0IGtub3cgaWYgdGhpcyBhY3R1YWxseSBoYXBwZW5zIHdpdGggZysrCi0gICAgICAgICAgICAgb3V0cHV0LiAgKi8KLQkgIGhvbGQgPSBOVUxMOwotCSAgZnVuY19kb25lID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsICZtaW5mby0+YXJncywgJm1pbmZvLT52YXJhcmdzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlICd0JzoKLQkgIC8qIFRlbXBsYXRlLiAgKi8KLQkgIGlmIChob2xkID09IE5VTEwpCi0JICAgIGhvbGQgPSAqcHA7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlIChtaW5mbywgcHAsIChjaGFyICoqKSBOVUxMKQotCSAgICAgIHx8ICEgc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgaG9sZCwgKnBwIC0gaG9sZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGhvbGQgPSBOVUxMOwotCSAgZXhwZWN0X2Z1bmMgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlICdfJzoKLQkgIC8qIEF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwsIHdlIGNhbm5vdCBoYXZlIGEgcmV0dXJuIHR5cGUKLQkgICAgIHNwZWNpZmllZCwgc28gaWYgd2UgcnVuIGludG8gYW5vdGhlciAnXycgYXQgdGhpcyBwb2ludCB3ZQotCSAgICAgYXJlIGRlYWxpbmcgd2l0aCBhIG1hbmdsZWQgbmFtZSB0aGF0IGlzIGVpdGhlciBib2d1cywgb3IKLQkgICAgIGhhcyBiZWVuIG1hbmdsZWQgYnkgc29tZSBhbGdvcml0aG0gd2UgZG9uJ3Qga25vdyBob3cgdG8KLQkgICAgIGRlYWwgd2l0aC4gIFNvIGp1c3QgcmVqZWN0IHRoZSBlbnRpcmUgZGVtYW5nbGluZy4gICovCi0JICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQlkZWZhdWx0OgotCSAgLyogQXNzdW1lIHdlIGhhdmUgc3R1bWJsZWQgb250byB0aGUgZmlyc3Qgb3V0ZXJtb3N0IGZ1bmN0aW9uCi0JICAgICBhcmd1bWVudCB0b2tlbiwgYW5kIHN0YXJ0IHByb2Nlc3NpbmcgYXJncy4gICovCi0JICBmdW5jX2RvbmUgPSB0cnVlOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsICZtaW5mby0+YXJncywgJm1pbmZvLT52YXJhcmdzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoZXhwZWN0X2Z1bmMpCi0JewotCSAgZnVuY19kb25lID0gdHJ1ZTsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGZ1bmNfZG9uZSkKLSAgICB7Ci0gICAgICAvKiBXaXRoIEdOVSBzdHlsZSBkZW1hbmdsaW5nLCBiYXJfXzNmb28gaXMgJ2Zvbzo6YmFyKHZvaWQpJywgYW5kCi0JIGJhcl9fM2Zvb2kgaXMgJ2Zvbzo6YmFyKGludCknLiAgV2UgZ2V0IGhlcmUgd2hlbiB3ZSBmaW5kIHRoZQotCSBmaXJzdCBjYXNlLCBhbmQgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgJyh2b2lkKScgZ2V0cyBhZGRlZAotCSB0byB0aGUgY3VycmVudCBkZWNscC4gICovCi0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgcXVhbGlmaWVkIG5hbWUsIHN1Y2ggYXMgIlEyNU91dGVyNUlubmVyIiB3aGljaCBpcyB0aGUKLSAgIG1hbmdsZWQgZm9ybSBvZiAiT3V0ZXI6OklubmVyIi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3F1YWxpZmllZCAobWluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBxdWFsaWZpZXJzOwotICBkZWJ1Z190eXBlIGNvbnRleHQ7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBzd2l0Y2ggKCgqcHApWzFdKQotICAgIHsKLSAgICBjYXNlICdfJzoKLSAgICAgIC8qIEdOVSBtYW5nbGVkIG5hbWUgd2l0aCBtb3JlIHRoYW4gOSBjbGFzc2VzLiAgVGhlIGNvdW50IGlzCi0JIHByZWNlZGVkIGJ5IGFuIHVuZGVyc2NvcmUgKHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIDw9IDkKLQkgY2FzZSkgYW5kIGZvbGxvd2VkIGJ5IGFuIHVuZGVyc2NvcmUuICAqLwotICAgICAgcCA9ICpwcCArIDI7Ci0gICAgICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApIHx8ICpwID09ICcwJykKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcXVhbGlmaWVycyA9IGF0b2kgKHApOwotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkpCi0JKytwOwotICAgICAgaWYgKCpwICE9ICdfJykKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKnBwID0gcCArIDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiBjYXNlICc1JzoKLSAgICBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLSAgICAgIHF1YWxpZmllcnMgPSAoKnBwKVsxXSAtICcwJzsKLSAgICAgIC8qIFNraXAgYW4gb3B0aW9uYWwgdW5kZXJzY29yZSBhZnRlciB0aGUgY291bnQuICAqLwotICAgICAgaWYgKCgqcHApWzJdID09ICdfJykKLQkrKypwcDsKLSAgICAgICpwcCArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcwJzoKLSAgICBkZWZhdWx0OgotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIC8qIFBpY2sgb2ZmIHRoZSBuYW1lcy4gICovCi0gIHdoaWxlIChxdWFsaWZpZXJzLS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgqKnBwID09ICdfJykKLQkrKypwcDsKLSAgICAgIGlmICgqKnBwID09ICd0JykKLQl7Ci0JICBjaGFyICpuYW1lOwotCi0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlIChtaW5mbywgcHAsCi0JCQkJCXB0eXBlICE9IE5VTEwgPyAmbmFtZSA6IE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChwdHlwZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY29udGV4dCA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAotCQkJCQkgICAgICAgbmFtZSwgc3RybGVuIChuYW1lKSwKLQkJCQkJICAgICAgIERFQlVHX0tJTkRfQ0xBU1MpOwotCSAgICAgIGZyZWUgKG5hbWUpOwotCSAgICAgIGlmIChjb250ZXh0ID09IERFQlVHX1RZUEVfTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkgIGxlbiA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgIGlmIChzdHJsZW4gKCpwcCkgPCBsZW4pCi0JICAgIHsKLQkgICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChwdHlwZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY29uc3QgZGVidWdfZmllbGQgKmZpZWxkczsKLQotCSAgICAgIGZpZWxkcyA9IE5VTEw7Ci0JICAgICAgaWYgKGNvbnRleHQgIT0gREVCVUdfVFlQRV9OVUxMKQotCQlmaWVsZHMgPSBkZWJ1Z19nZXRfZmllbGRzIChtaW5mby0+ZGhhbmRsZSwgY29udGV4dCk7Ci0KLQkgICAgICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCi0JICAgICAgaWYgKGZpZWxkcyAhPSBOVUxMKQotCQl7Ci0JCSAgY2hhciAqbmFtZTsKLQotCQkgIC8qIFRyeSB0byBmaW5kIHRoZSB0eXBlIGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkcyBvZiBjb250ZXh0IHVudGlsIHdlIGZpbmQgYSBmaWVsZCB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAgc2FtZSB0eXBlLiAgVGhpcyBvdWdodCB0byB3b3JrIGZvciBhIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzLCBidXQgaXQgd29uJ3Qgd29yayBmb3IsCi0gICAgICAgICAgICAgICAgICAgICBlLmcuLCBhbiBlbnVtIGRlZmluZWQgd2l0aGluIGEgY2xhc3MuICBzdGFicyBkb2VzCi0gICAgICAgICAgICAgICAgICAgICBub3QgZ2l2ZSB1cyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGxhdHRlciBjYXNlLiAgKi8KLQotCQkgIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIGxlbik7Ci0KLQkJICBmb3IgKDsgKmZpZWxkcyAhPSBERUJVR19GSUVMRF9OVUxMOyBmaWVsZHMrKykKLQkJICAgIHsKLQkJICAgICAgZGVidWdfdHlwZSBmdDsKLQkJICAgICAgY29uc3QgY2hhciAqZG47Ci0KLQkJICAgICAgZnQgPSBkZWJ1Z19nZXRfZmllbGRfdHlwZSAobWluZm8tPmRoYW5kbGUsICpmaWVsZHMpOwotCQkgICAgICBpZiAoZnQgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgZG4gPSBkZWJ1Z19nZXRfdHlwZV9uYW1lIChtaW5mby0+ZGhhbmRsZSwgZnQpOwotCQkgICAgICBpZiAoZG4gIT0gTlVMTCAmJiBzdHJjbXAgKGRuLCBuYW1lKSA9PSAwKQotCQkJewotCQkJICBjb250ZXh0ID0gZnQ7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCi0JCSAgZnJlZSAobmFtZSk7Ci0JCX0KLQotCSAgICAgIGlmIChjb250ZXh0ID09IERFQlVHX1RZUEVfTlVMTCkKLQkJewotCQkgIC8qIFdlIGhhdmUgdG8gZmFsbCBiYWNrIG9uIGZpbmRpbmcgdGhlIHR5cGUgYnkgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGFyZSBtb3JlIHR5cGVzIHRvIGNvbWUsIHRoZW4gdGhpcyBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICBiZSBhIGNsYXNzLiAgT3RoZXJ3aXNlLCBpdCBjb3VsZCBiZSBhbnl0aGluZy4gICovCi0KLQkJICBpZiAocXVhbGlmaWVycyA9PSAwKQotCQkgICAgewotCQkgICAgICBjaGFyICpuYW1lOwotCi0JCSAgICAgIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIGxlbik7Ci0JCSAgICAgIGNvbnRleHQgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkJICAgICAgIG5hbWUpOwotCQkgICAgICBmcmVlIChuYW1lKTsKLQkJICAgIH0KLQotCQkgIGlmIChjb250ZXh0ID09IERFQlVHX1RZUEVfTlVMTCkKLQkJICAgIHsKLQkJICAgICAgY29udGV4dCA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCQkgICAgICAgbWluZm8tPmluZm8sCi0JCQkJCQkgICAgICAgKnBwLCBsZW4sCi0JCQkJCQkgICAgICAgKHF1YWxpZmllcnMgPT0gMAotCQkJCQkJCT8gREVCVUdfS0lORF9JTExFR0FMCi0JCQkJCQkJOiBERUJVR19LSU5EX0NMQVNTKSk7Ci0JCSAgICAgIGlmIChjb250ZXh0ID09IERFQlVHX1RZUEVfTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgICpwcCArPSBsZW47Ci0JfQotICAgIH0KLQotICBpZiAocHR5cGUgIT0gTlVMTCkKLSAgICAqcHR5cGUgPSBjb250ZXh0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIHRlbXBsYXRlLiAgSWYgUE5BTUUgaXMgbm90IE5VTEwsIHRoaXMgc2V0cyAqUE5BTUUgdG8gYQotICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3RlbXBsYXRlIChtaW5mbywgcHAsIHBuYW1lKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjaGFyICoqcG5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIHVuc2lnbmVkIGludCByLCBpOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgKysqcHA7Ci0KLSAgLyogU2tpcCB0aGUgdGVtcGxhdGUgbmFtZS4gICovCi0gIHIgPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0gIGlmIChyID09IDAgfHwgc3RybGVuICgqcHApIDwgcikKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAqcHAgKz0gcjsKLQotICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBsaXN0LiAgKi8KLSAgaWYgKHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJnIpID09IDApCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQotICAgIHsKLSAgICAgIGlmICgqKnBwID09ICdaJykKLQl7Ci0JICAvKiBUaGlzIGlzIGEgdHlwZSBwYXJhbWV0ZXIuICAqLwotCSAgKysqcHA7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgKGRlYnVnX3R5cGUgKikgTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqb2xkX3A7Ci0JICBib29sZWFuIHBvaW50ZXJwLCByZWFscCwgaW50ZWdyYWxwLCBjaGFycCwgYm9vbHA7Ci0JICBib29sZWFuIGRvbmU7Ci0KLQkgIG9sZF9wID0gKnBwOwotCSAgcG9pbnRlcnAgPSBmYWxzZTsKLQkgIHJlYWxwID0gZmFsc2U7Ci0JICBpbnRlZ3JhbHAgPSBmYWxzZTsKLQkgIGNoYXJwID0gZmFsc2U7Ci0JICBib29scCA9IGZhbHNlOwotCSAgZG9uZSA9IGZhbHNlOwotCi0JICAvKiBUaGlzIGlzIGEgdmFsdWUgcGFyYW1ldGVyLiAgKi8KLQotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIChkZWJ1Z190eXBlICopIE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHdoaWxlICgqb2xkX3AgIT0gJ1wwJyAmJiAhIGRvbmUpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCpvbGRfcCkKLQkJewotCQljYXNlICdQJzoKLQkJY2FzZSAncCc6Ci0JCWNhc2UgJ1InOgotCQkgIHBvaW50ZXJwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAnQyc6CS8qIENvbnN0LiAgKi8KLQkJY2FzZSAnUyc6CS8qIFNpZ25lZC4gICovCi0JCWNhc2UgJ1UnOgkvKiBVbnNpZ25lZC4gICovCi0JCWNhc2UgJ1YnOgkvKiBWb2xhdGlsZS4gICovCi0JCWNhc2UgJ0YnOgkvKiBGdW5jdGlvbi4gICovCi0JCWNhc2UgJ00nOgkvKiBNZW1iZXIgZnVuY3Rpb24uICAqLwotCQljYXNlICdPJzoJLyogPz8/ICovCi0JCSAgKytvbGRfcDsKLQkJICBicmVhazsKLQkJY2FzZSAnUSc6CS8qIFF1YWxpZmllZCBuYW1lLiAgKi8KLQkJICBpbnRlZ3JhbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdUJzoJLyogUmVtZW1iZXJlZCB0eXBlLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJY2FzZSAndic6CS8qIFZvaWQuICAqLwotCQkgIGFib3J0ICgpOwotCQljYXNlICd4JzoJLyogTG9uZyBsb25nLiAgKi8KLQkJY2FzZSAnbCc6CS8qIExvbmcuICAqLwotCQljYXNlICdpJzoJLyogSW50LiAgKi8KLQkJY2FzZSAncyc6CS8qIFNob3J0LiAgKi8KLQkJY2FzZSAndyc6CS8qIFdjaGFyX3QuICAqLwotCQkgIGludGVncmFscCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2InOgkvKiBCb29sLiAgKi8KLQkJICBib29scCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2MnOgkvKiBDaGFyLiAgKi8KLQkJICBjaGFycCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3InOgkvKiBMb25nIGRvdWJsZS4gICovCi0JCWNhc2UgJ2QnOgkvKiBEb3VibGUuICAqLwotCQljYXNlICdmJzoJLyogRmxvYXQuICAqLwotCQkgIHJlYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAvKiBBc3N1bWUgaXQncyBhIHVzZXIgZGVmaW5lZCBpbnRlZ3JhbCB0eXBlLiAgKi8KLQkJICBpbnRlZ3JhbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGludGVncmFscCkKLQkgICAgewotCSAgICAgIGlmICgqKnBwID09ICdtJykKLQkJKysqcHA7Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkJKysqcHA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGNoYXJwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbDsKLQotCSAgICAgIGlmICgqKnBwID09ICdtJykKLQkJKysqcHA7Ci0JICAgICAgdmFsID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotCSAgICAgIGlmICh2YWwgPT0gMCkKLQkJewotCQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoYm9vbHApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgdmFsOwotCi0JICAgICAgdmFsID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotCSAgICAgIGlmICh2YWwgIT0gMCAmJiB2YWwgIT0gMSkKLQkJewotCQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocmVhbHApCi0JICAgIHsKLQkgICAgICBpZiAoKipwcCA9PSAnbScpCi0JCSsrKnBwOwotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0JCSsrKnBwOwotCSAgICAgIGlmICgqKnBwID09ICcuJykKLQkJewotCQkgICsrKnBwOwotCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0JCSAgICArKypwcDsKLQkJfQotCSAgICAgIGlmICgqKnBwID09ICdlJykKLQkJewotCQkgICsrKnBwOwotCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0JCSAgICArKypwcDsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwb2ludGVycCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZsZW4pKQotCQl7Ci0JCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgICpwcCArPSBsZW47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdlIGNhbiB0cmFuc2xhdGUgdGhpcyB0byBhIHN0cmluZyBmYWlybHkgZWFzaWx5IGJ5IGludm9raW5nIHRoZQotICAgICByZWd1bGFyIGRlbWFuZ2xpbmcgcm91dGluZS4gICovCi0gIGlmIChwbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnMxLCAqczIsICpzMywgKnM0OwotICAgICAgY2hhciAqZnJvbSwgKnRvOwotCi0gICAgICBzMSA9IHNhdmVzdHJpbmcgKG9yaWcsICpwcCAtIG9yaWcpOwotCi0gICAgICBzMiA9IGNvbmNhdCAoIk5vU3VjaFN0cmluR19fIiwgczEsIChjb25zdCBjaGFyICopIE5VTEwpOwotCi0gICAgICBmcmVlIChzMSk7Ci0KLSAgICAgIHMzID0gY3BsdXNfZGVtYW5nbGUgKHMyLCBETUdMX0FOU0kpOwotCi0gICAgICBmcmVlIChzMik7Ci0KLSAgICAgIGlmIChzMyAhPSBOVUxMKQotCXM0ID0gc3Ryc3RyIChzMywgIjo6Tm9TdWNoU3RyaW5HIik7Ci0gICAgICBpZiAoczMgPT0gTlVMTCB8fCBzNCA9PSBOVUxMKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIGlmIChzMyAhPSBOVUxMKQotCSAgICBmcmVlIChzMyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBFbGltaW5hdGluZyBhbGwgc3BhY2VzLCBleGNlcHQgdGhvc2UgYmV0d2VlbiA+IGNoYXJhY3RlcnMsCi0gICAgICAgICBtYWtlcyBpdCBtb3JlIGxpa2VseSB0aGF0IHRoZSBkZW1hbmdsZWQgbmFtZSB3aWxsIG1hdGNoIHRoZQotICAgICAgICAgbmFtZSB3aGljaCBnKysgdXNlZCBhcyB0aGUgc3RydWN0dXJlIG5hbWUuICAqLwotICAgICAgZm9yIChmcm9tID0gdG8gPSBzMzsgZnJvbSAhPSBzNDsgKytmcm9tKQotCWlmICgqZnJvbSAhPSAnICcKLQkgICAgfHwgKGZyb21bMV0gPT0gJz4nICYmIGZyb20gPiBzMyAmJiBmcm9tWy0xXSA9PSAnPicpKQotCSAgKnRvKysgPSAqZnJvbTsKLQotICAgICAgKnBuYW1lID0gc2F2ZXN0cmluZyAoczMsIHRvIC0gczMpOwotCi0gICAgICBmcmVlIChzMyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIGNsYXNzIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9jbGFzcyAobWluZm8sIHBwLCBwc3RhcnQpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBzdGFydDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgdW5zaWduZWQgaW50IG47Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBuID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotICBpZiAoc3RybGVuICgqcHApIDwgbikKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChwc3RhcnQgIT0gTlVMTCkKLSAgICAqcHN0YXJ0ID0gKnBwOwotCi0gICpwcCArPSBuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBmdW5jdGlvbiBhcmd1bWVudHMuICBJZiB0aGUgcGFyZ3MgYXJndW1lbnQgaXMgbm90IE5VTEwsIGl0Ci0gICBpcyBzZXQgdG8gYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgaG9sZGluZyB0aGUgYXJndW1lbnRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCBwYXJncywgcHZhcmFyZ3MpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKipwYXJnczsKLSAgICAgYm9vbGVhbiAqcHZhcmFyZ3M7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIHVuc2lnbmVkIGludCBhbGxvYywgY291bnQ7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBhbGxvYyA9IDEwOwotICBpZiAocGFyZ3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqKnBhcmdzKTsKLSAgICAgICpwdmFyYXJncyA9IGZhbHNlOwotICAgIH0KLSAgY291bnQgPSAwOwotCi0gIHdoaWxlICgqKnBwICE9ICdfJyAmJiAqKnBwICE9ICdcMCcgJiYgKipwcCAhPSAnZScpCi0gICAgewotICAgICAgaWYgKCoqcHAgPT0gJ04nIHx8ICoqcHAgPT0gJ1QnKQotCXsKLQkgIGNoYXIgdGVtcHR5cGU7Ci0JICB1bnNpZ25lZCBpbnQgciwgdDsKLQotCSAgdGVtcHR5cGUgPSAqKnBwOwotCSAgKysqcHA7Ci0KLQkgIGlmICh0ZW1wdHlwZSA9PSAnVCcpCi0JICAgIHIgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmcikpCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmdCkpCi0JICAgIHsKLQkgICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICh0ID49IG1pbmZvLT50eXBlc3RyaW5nX2NvdW50KQotCSAgICB7Ci0JICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgd2hpbGUgKHItLSA+IDApCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICp0ZW07Ci0KLQkgICAgICB0ZW0gPSBtaW5mby0+dHlwZXN0cmluZ3NbdF0udHlwZXN0cmluZzsKLQkgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZyAobWluZm8sICZ0ZW0sIHBhcmdzLCAmY291bnQsICZhbGxvYykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZyAobWluZm8sIHBwLCBwYXJncywgJmNvdW50LCAmYWxsb2MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAocGFyZ3MgIT0gTlVMTCkKLSAgICAoKnBhcmdzKVtjb3VudF0gPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKCoqcHAgPT0gJ2UnKQotICAgIHsKLSAgICAgIGlmIChwYXJncyAhPSBOVUxMKQotCSpwdmFyYXJncyA9IHRydWU7Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgc2luZ2xlIGFyZ3VtZW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfYXJnIChtaW5mbywgcHAsIHBhcmdzLCBwY291bnQsIHBhbGxvYykKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqKnBhcmdzOwotICAgICB1bnNpZ25lZCBpbnQgKnBjb3VudDsKLSAgICAgdW5zaWduZWQgaW50ICpwYWxsb2M7Ci17Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0gIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLAotCQkJICAgIHBhcmdzID09IE5VTEwgPyAoZGVidWdfdHlwZSAqKSBOVUxMIDogJnR5cGUpCi0gICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIHN0YXJ0LCAqcHAgLSBzdGFydCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwYXJncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICgqcGNvdW50ICsgMSA+PSAqcGFsbG9jKQotCXsKLQkgICpwYWxsb2MgKz0gMTA7Ci0JICAqcGFyZ3MgPSAoKGRlYnVnX3R5cGUgKikKLQkJICAgIHhyZWFsbG9jICgqcGFyZ3MsICpwYWxsb2MgKiBzaXplb2YgKipwYXJncykpOwotCX0KLSAgICAgICgqcGFyZ3MpWypwY291bnRdID0gdHlwZTsKLSAgICAgICsrKnBjb3VudDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgdHlwZS4gIElmIHRoZSBwdHlwZSBhcmd1bWVudCBpcyBub3QgTlVMTCwgKnB0eXBlIGlzIHNldAotICAgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBzd2l0Y2ggKCoqcHApCi0gICAgewotICAgIGNhc2UgJ1AnOgotICAgIGNhc2UgJ3AnOgotICAgICAgLyogQSBwb2ludGVyIHR5cGUuICAqLwotICAgICAgKysqcHA7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCSpwdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAvKiBBIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICAvKiBBbiBhcnJheS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBoaWdoOwotCi0JKysqcHA7Ci0JaGlnaCA9IDA7Ci0Jd2hpbGUgKCoqcHAgIT0gJ1wwJyAmJiAqKnBwICE9ICdfJykKLQkgIHsKLQkgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCSAgICAgIHsKLQkJc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICBoaWdoICo9IDEwOwotCSAgICBoaWdoICs9ICoqcHAgLSAnMCc7Ci0JICAgICsrKnBwOwotCSAgfQotCWlmICgqKnBwICE9ICdfJykKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JKysqcHA7Ci0KLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICBkZWJ1Z190eXBlIGludF90eXBlOwotCi0JICAgIGludF90eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImludCIpOwotCSAgICBpZiAoaW50X3R5cGUgPT0gTlVMTCkKLQkgICAgICBpbnRfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0LCBmYWxzZSk7Ci0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSwgaW50X3R5cGUsCi0JCQkJCSAgICAwLCBoaWdoLCBmYWxzZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHJlbWVtYmVyZWQgdHlwZS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0JY29uc3QgY2hhciAqcDsKLQotCSsrKnBwOwotCWlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJmkpKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQlpZiAoaSA+PSBtaW5mby0+dHlwZXN0cmluZ19jb3VudCkKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JcCA9IG1pbmZvLT50eXBlc3RyaW5nc1tpXS50eXBlc3RyaW5nOwotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0YnOgotICAgICAgLyogQSBmdW5jdGlvbi4gICovCi0gICAgICB7Ci0JZGVidWdfdHlwZSAqYXJnczsKLQlib29sZWFuIHZhcmFyZ3M7Ci0KLQkrKypwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwKLQkJCQkgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgPyAoZGVidWdfdHlwZSAqKikgTlVMTAotCQkJCSAgIDogJmFyZ3MpLAotCQkJCSAgKHB0eXBlID09IE5VTEwKLQkJCQkgICA/IChib29sZWFuICopIE5VTEwKLQkJCQkgICA6ICZ2YXJhcmdzKSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKCoqcHAgIT0gJ18nKQotCSAgewotCSAgICAvKiBjcGx1c19kZW1hbmdsZSB3aWxsIGFjY2VwdCBhIGZ1bmN0aW9uIHdpdGhvdXQgYSByZXR1cm4KLQkgICAgICAgdHlwZSwgYnV0IEkgZG9uJ3Qga25vdyB3aGVuIHRoYXQgd2lsbCBoYXBwZW4sIG9yIHdoYXQKLQkgICAgICAgdG8gZG8gaWYgaXQgZG9lcy4gICovCi0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSsrKnBwOwotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKHB0eXBlICE9IE5VTEwpCi0JICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUsIGFyZ3MsCi0JCQkJCSAgICAgdmFyYXJncyk7Ci0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgY2FzZSAnTyc6Ci0gICAgICB7Ci0JYm9vbGVhbiBtZW1iZXJwLCBjb25zdHAsIHZvbGF0aWxlcDsKLQlkZWJ1Z190eXBlIGNsYXNzX3R5cGUgPSBERUJVR19UWVBFX05VTEw7Ci0JZGVidWdfdHlwZSAqYXJnczsKLQlib29sZWFuIHZhcmFyZ3M7Ci0JdW5zaWduZWQgaW50IG47Ci0JY29uc3QgY2hhciAqbmFtZTsKLQotCW1lbWJlcnAgPSAqKnBwID09ICdNJzsKLQljb25zdHAgPSBmYWxzZTsKLQl2b2xhdGlsZXAgPSBmYWxzZTsKLQlhcmdzID0gTlVMTDsKLQl2YXJhcmdzID0gZmFsc2U7Ci0KLQkrKypwcDsKLQlpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCSAgewotCSAgICBuID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotCSAgICBpZiAoc3RybGVuICgqcHApIDwgbikKLQkgICAgICB7Ci0JCXN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgbmFtZSA9ICpwcDsKLQkgICAgKnBwICs9IG47Ci0KLQkgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JICAgICAgewotCQljbGFzc190eXBlID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJCSAgICBtaW5mby0+aW5mbywKLQkJCQkJCSAgICBuYW1lLCAoaW50KSBuLAotCQkJCQkJICAgIERFQlVHX0tJTkRfQ0xBU1MpOwotCQlpZiAoY2xhc3NfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmICgqKnBwID09ICdRJykKLQkgIHsKLQkgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwKLQkJCQkJICAgKHB0eXBlID09IE5VTEwKLQkJCQkJICAgID8gKGRlYnVnX3R5cGUgKikgTlVMTAotCQkJCQkgICAgOiAmY2xhc3NfdHlwZSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JaWYgKG1lbWJlcnApCi0JICB7Ci0JICAgIGlmICgqKnBwID09ICdDJykKLQkgICAgICB7Ci0JCWNvbnN0cCA9IHRydWU7Ci0JCSsrKnBwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKipwcCA9PSAnVicpCi0JICAgICAgewotCQl2b2xhdGlsZXAgPSB0cnVlOwotCQkrKypwcDsKLQkgICAgICB9Ci0JICAgIGlmICgqKnBwICE9ICdGJykKLQkgICAgICB7Ci0JCXN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgKysqcHA7Ci0JICAgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLAotCQkJCSAgICAgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgICAgID8gKGRlYnVnX3R5cGUgKiopIE5VTEwKLQkJCQkgICAgICAgOiAmYXJncyksCi0JCQkJICAgICAgKHB0eXBlID09IE5VTEwKLQkJCQkgICAgICAgPyAoYm9vbGVhbiAqKSBOVUxMCi0JCQkJICAgICAgIDogJnZhcmFyZ3MpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0KLQlpZiAoKipwcCAhPSAnXycpCi0JICB7Ci0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSsrKnBwOwotCi0JaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICBpZiAoISBtZW1iZXJwKQotCSAgICAgICpwdHlwZSA9IGRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBjbGFzc190eXBlLAotCQkJCQkgICAgICAgKnB0eXBlKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogRklYTUU6IFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCBjb25zdHAgb3IKLSAgICAgICAgICAgICAgICAgICB2b2xhdGlsZXAuICAqLwotCQkqcHR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlLAotCQkJCQkJIGNsYXNzX3R5cGUsIGFyZ3MsIHZhcmFyZ3MpOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICArKypwcDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdRJzoKLSAgICAgIHsKLQljb25zdCBjaGFyICpob2xkOwotCi0JaG9sZCA9ICpwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZCAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIGZ1bmRhbWVudGFsIHR5cGUuICBJZiB0aGUgcHR5cGUgYXJndW1lbnQgaXMgbm90IE5VTEwsCi0gICAqcHR5cGUgaXMgc2V0IHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJvb2xlYW4gY29uc3RwLCB2b2xhdGlsZXAsIHVuc2lnbmVkcCwgc2lnbmVkcDsKLSAgYm9vbGVhbiBkb25lOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgY29uc3RwID0gZmFsc2U7Ci0gIHZvbGF0aWxlcCA9IGZhbHNlOwotICB1bnNpZ25lZHAgPSBmYWxzZTsKLSAgc2lnbmVkcCA9IGZhbHNlOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqcHApCi0JewotCWNhc2UgJ0MnOgotCSAgY29uc3RwID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdVJzoKLQkgIHVuc2lnbmVkcCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6Ci0JICBzaWduZWRwID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdWJzoKLQkgIHZvbGF0aWxlcCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKCoqcHApCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICBjYXNlICdfJzoKLSAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIHBlcm1pdHMgdGhpcywgYnV0IEkgZG9uJ3Qga25vdyB3aGF0IGl0IG1lYW5zLiAgKi8KLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndic6IC8qIHZvaWQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJ2b2lkIik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKG1pbmZvLT5kaGFuZGxlKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6IC8qIGxvbmcgbG9uZyAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogImxvbmcgbG9uZyBpbnQiKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDgsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2wnOiAvKiBsb25nICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAibG9uZyB1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogImxvbmcgaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0LCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdpJzogLyogaW50ICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAidW5zaWduZWQgaW50IgotCQkJCQkgICA6ICJpbnQiKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOiAvKiBzaG9ydCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gInNob3J0IHVuc2lnbmVkIGludCIKLQkJCQkJICAgOiAic2hvcnQgaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAyLCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzogLyogYm9vbCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImJvb2wiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzogLyogY2hhciAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gInVuc2lnbmVkIGNoYXIiCi0JCQkJCSAgIDogKHNpZ25lZHAKLQkJCQkJICAgICAgPyAic2lnbmVkIGNoYXIiCi0JCQkJCSAgICAgIDogImNoYXIiKSkpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAxLCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd3JzogLyogd2NoYXJfdCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgIl9fd2NoYXJfdCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAyLCB0cnVlKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6IC8qIGxvbmcgZG91YmxlICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAibG9uZyBkb3VibGUiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA4KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6IC8qIGRvdWJsZSAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImRvdWJsZSIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDgpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzogLyogZmxvYXQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJmbG9hdCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqaG9sZDsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfY2xhc3MgKG1pbmZvLCBwcCwgJmhvbGQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICBjaGFyICpuYW1lOwotCi0JICAgIG5hbWUgPSBzYXZlc3RyaW5nIChob2xkLCAqcHAgLSBob2xkKTsKLQkgICAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbmFtZSk7Ci0JICAgIGZyZWUgKG5hbWUpOwotCSAgICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICB7Ci0JCS8qIEZJWE1FOiBJdCBpcyBwcm9iYWJseSBpbmNvcnJlY3QgdG8gYXNzdW1lIHRoYXQKLSAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgdHlwZXMgYXJlIHRhZ2dlZCB0eXBlcy4gICovCi0JCSpwdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAotCQkJCQkJaG9sZCwgKnBwIC0gaG9sZCwKLQkJCQkJCURFQlVHX0tJTkRfSUxMRUdBTCk7Ci0JCWlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgICAgewotCWNoYXIgKm5hbWU7Ci0KLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlIChtaW5mbywgcHAsCi0JCQkJICAgICAgcHR5cGUgIT0gTlVMTCA/ICZuYW1lIDogTlVMTCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKHB0eXBlICE9IE5VTEwpCi0JICB7Ci0JICAgICpwdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAotCQkJCQkgICAgbmFtZSwgc3RybGVuIChuYW1lKSwKLQkJCQkJICAgIERFQlVHX0tJTkRfQ0xBU1MpOwotCSAgICBmcmVlIChuYW1lKTsKLQkgICAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAocHR5cGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29uc3RwKQotCSpwdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgICBpZiAodm9sYXRpbGVwKQotCSpwdHlwZSA9IGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZW1lbWJlciBhIHR5cGUgc3RyaW5nIGluIGEgZGVtYW5nbGVkIHN0cmluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBwLCBsZW4pCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICpwOwotICAgICBpbnQgbGVuOwotewotICBpZiAobWluZm8tPnR5cGVzdHJpbmdfY291bnQgPj0gbWluZm8tPnR5cGVzdHJpbmdfYWxsb2MpCi0gICAgewotICAgICAgbWluZm8tPnR5cGVzdHJpbmdfYWxsb2MgKz0gMTA7Ci0gICAgICBtaW5mby0+dHlwZXN0cmluZ3MgPSAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcgKikKLQkJCSAgICB4cmVhbGxvYyAobWluZm8tPnR5cGVzdHJpbmdzLAotCQkJCSAgICAgIChtaW5mby0+dHlwZXN0cmluZ19hbGxvYwotCQkJCSAgICAgICAqIHNpemVvZiAqbWluZm8tPnR5cGVzdHJpbmdzKSkpOwotICAgIH0KLQotICBtaW5mby0+dHlwZXN0cmluZ3NbbWluZm8tPnR5cGVzdHJpbmdfY291bnRdLnR5cGVzdHJpbmcgPSBwOwotICBtaW5mby0+dHlwZXN0cmluZ3NbbWluZm8tPnR5cGVzdHJpbmdfY291bnRdLmxlbiA9ICh1bnNpZ25lZCBpbnQpIGxlbjsKLSAgKyttaW5mby0+dHlwZXN0cmluZ19jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0YW1wLWguaW4gYi9iaW51dGlscy9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0cmluZ3MuMSBiL2JpbnV0aWxzL3N0cmluZ3MuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZGUyOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdHJpbmdzLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHN0cmluZ3MgMSAiMjUgSnVuZSAxOTkzIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotc3RyaW5ncyBcLSBwcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcwotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgc3RyaW5ncwotLlJCICJbXHwiIFwtYSB8IFwtXGMKLS5SQiB8IFwtXC1hbGwgIlx8XSIgCi0uUkIgIltcfCIgXC1mIHwgXC1cLXByaW50XC1maWxlXC1uYW1lICJcfF0iCi0uUkIgIltcfCIgXC1vICJcfF0iIAotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iIAotLlJCICJbXHwiIFwtdiB8IFwtXC12ZXJzaW9uICJcfF0iICAKLS5SQiAiW1x8IiBcLW4KLS5JIG1pblwtbGVuXGMKLS5SSSB8IFwtbWluXC1sZW5cYwotLlJCIHwgIlwtXC1ieXRlcz0iXGMKLS5JIG1pblwtbGVuXGMKLVwmXHxdCi0uUkIgIltcfCIgXC10Ci0uSSB7byx4LGR9XGMKLS5SQiAiW1x8IiAiXC1cLXRhcmdldD1cZkliZmRuYW1lIiAiXHxdIgotLlJCIHwgIlwtXC1yYWRpeD0iXGMKLS5JIHtvLHgsZH1cYwotXCZcfF0KLS5JIGZpbGVcYwotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLUZvciBlYWNoCi0uSSBmaWxlCi1naXZlbiwgR05VIFxjCi0uQiBzdHJpbmdzCi1wcmludHMgdGhlIHByaW50YWJsZSBjaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIGF0IGxlYXN0IDQKLWNoYXJhY3RlcnMgbG9uZyAob3IgdGhlIG51bWJlciBnaXZlbiB3aXRoIHRoZSBvcHRpb25zIGJlbG93KSBhbmQgYXJlCi1mb2xsb3dlZCBieSBhbiB1bnByaW50YWJsZSBjaGFyYWN0ZXIuICBCeSBkZWZhdWx0LCBpdCBvbmx5IHByaW50cyB0aGUKLXN0cmluZ3MgZnJvbSB0aGUgaW5pdGlhbGl6ZWQgYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7IGZvcgotb3RoZXIgdHlwZXMgb2YgZmlsZXMsIGl0IHByaW50cyB0aGUgc3RyaW5ncyBmcm9tIHRoZSB3aG9sZSBmaWxlLgotCi0uUFAKLS5CIHN0cmluZ3MKLWlzIG1haW5seSB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50cyBvZiBub24tdGV4dCBmaWxlcy4KLQotLlNIIE9QVElPTlMKLVRoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCi1lcXVpdmFsZW50LgotCi0uVFAKLS5CIFwtYQotLlRQCi0uQiBcLVwtYWxsCi0uVFAKLS5CIFwtCi1EbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsKLXNjYW4gdGhlIHdob2xlIGZpbGVzLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtcHJpbnRcLWZpbGVcLW5hbWUKLVByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4KLQotLlRQCi0uQiBcLVwtaGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBzdHJpbmdzCi1vbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi0uVFAKLS5CIFwtdgotLlRQCi0uQiBcLVwtdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyCi1vZgotLkIgc3RyaW5ncwotb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotLlRQCi0uQiAiXC1uIFxmSW1pblwtbGVuXGZQIgotLlRQCi0uQiAiXC1cZkltaW5cLWxlblxmUCIKLS5UUAotLkIgIlwtYnl0ZXM9XGZJbWluXC1sZW5cZlAiCi1QcmludCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhdCBsZWFzdAotLkkgbWluXC1sZW4KLWNoYXJhY3RlcnMgbG9uZywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA0LgotCi0uVFAKLS5CUiAiXC10ICIge28seCxkfQotLlRQCi0uQlIgIlwtXC1yYWRpeD0iIHtvLHgsZH0KLVByaW50IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4gIFRoZSBzaW5nbGUKLWNoYXJhY3RlciBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHJhZGl4IG9mIHRoZSBvZmZzZXRcKGVtb2N0YWwsCi1oZXhhZGVjaW1hbCwgb3IgZGVjaW1hbC4KLQotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLVNlZSAKLS5CUiBvYmpkdW1wICggMSApLAotZm9yIGluZm9ybWF0aW9uIG9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCi0KLS5UUAotLkIgXC1vCi1MaWtlCi0uQlIgIlwtdCBvIiAuCi0KLS5QUAotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKLS5CUiBhciAoIDEgKSwKLS5CUiBubSAoIDEgKSwKLS5CUiBvYmpkdW1wICggMSApLAotLkJSIHJhbmxpYiAoIDEgKS4KLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpbmdzLmMgYi9iaW51dGlscy9zdHJpbmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmU2YTEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RyaW5ncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qIHN0cmluZ3MgLS0gcHJpbnQgdGhlIHN0cmluZ3Mgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gZmlsZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIFVzYWdlOiBzdHJpbmdzIFtvcHRpb25zXSBmaWxlLi4uCi0KLSAgIE9wdGlvbnM6Ci0gICAtLWFsbAotICAgLWEKLSAgIC0JCURvIG5vdCBzY2FuIG9ubHkgdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBvZiBvYmplY3QgZmlsZXMuCi0KLSAgIC0tcHJpbnQtZmlsZS1uYW1lCi0gICAtZgkJUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLgotCi0gICAtLWJ5dGVzPW1pbi1sZW4KLSAgIC1uIG1pbi1sZW4KLSAgIC1taW4tbGVuCVByaW50IGdyYXBoaWMgY2hhciBzZXF1ZW5jZXMsIE1JTi1MRU4gb3IgbW9yZSBieXRlcyBsb25nLAotCQl0aGF0IGFyZSBmb2xsb3dlZCBieSBhIE5VTCBvciBhIG5ld2xpbmUuICBEZWZhdWx0IGlzIDQuCi0KLSAgIC0tcmFkaXg9e28seCxkfQotICAgLXQge28seCxkfQlQcmludCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcsCi0JCWluIG9jdGFsL2hleC9kZWNpbWFsLgotCi0gICAtbwkJTGlrZSAtdG8uICAoU29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaGF2ZSAtbyBsaWtlIC10bywKLQkJb3RoZXJzIGxpa2UgLXRkLiAgV2UgY2hvc2Ugb25lIGFyYml0cmFyaWx5LikKLQotICAgLS10YXJnZXQ9QkZETkFNRQotCQlTcGVjaWZ5IGEgbm9uLWRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi0gICAtLWhlbHAKLSAgIC1oCQlQcmludCB0aGUgdXNhZ2UgbWVzc2FnZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0gICAtLXZlcnNpb24KLSAgIC12CQlQcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlci4KLQotICAgV3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIDxybXNAZ251LmFpLm1pdC5lZHU+Ci0gICBhbmQgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgaXNhc2NpaQotI2RlZmluZSBpc2dyYXBoaWMoYykgKGlzYXNjaWkgKGMpICYmIGlzcHJpbnQgKGMpKQotI2Vsc2UKLSNkZWZpbmUgaXNncmFwaGljKGMpIChpc3ByaW50IChjKSkKLSNlbmRpZgotCi0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLS8qIFRoZSBCRkQgc2VjdGlvbiBmbGFncyB0aGF0IGlkZW50aWZ5IGFuIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIERBVEFfRkxBR1MgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykKLQotLyogUmFkaXggZm9yIHByaW50aW5nIGFkZHJlc3NlcyAobXVzdCBiZSA4LCAxMCBvciAxNikuICAqLwotc3RhdGljIGludCBhZGRyZXNzX3JhZGl4OwotCi0vKiBNaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSBvZiBncmFwaGljIGNoYXJzIHRvIHRyaWdnZXIgb3V0cHV0LiAgKi8KLXN0YXRpYyBpbnQgc3RyaW5nX21pbjsKLQotLyogdHJ1ZSBtZWFucyBwcmludCBhZGRyZXNzIHdpdGhpbiBmaWxlIGZvciBlYWNoIHN0cmluZy4gICovCi1zdGF0aWMgYm9vbGVhbiBwcmludF9hZGRyZXNzZXM7Ci0KLS8qIHRydWUgbWVhbnMgcHJpbnQgZmlsZW5hbWUgZm9yIGVhY2ggc3RyaW5nLiAgKi8KLXN0YXRpYyBib29sZWFuIHByaW50X2ZpbGVuYW1lczsKLQotLyogdHJ1ZSBtZWFucyBmb3Igb2JqZWN0IGZpbGVzIHNjYW4gb25seSB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuIGRhdGFzZWN0aW9uX29ubHk7Ci0KLS8qIHRydWUgaWYgd2UgZm91bmQgYW4gaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGluIHRoZSBjdXJyZW50IGZpbGUuICAqLwotc3RhdGljIGJvb2xlYW4gZ290X2Ffc2VjdGlvbjsKLQotLyogVGhlIEJGRCBvYmplY3QgZmlsZSBmb3JtYXQuICAqLwotc3RhdGljIGNoYXIgKnRhcmdldDsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICB7ImJ5dGVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsicmFkaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7TlVMTCwgMCwgTlVMTCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkIHN0cmluZ3NfYV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0cmluZ3Nfb2JqZWN0X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdHJpbmdzX2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZSkpOwotc3RhdGljIGludCBpbnRlZ2VyX2FyZyBQQVJBTVMgKChjaGFyICpzKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdHJpbmdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBGSUxFICpzdHJlYW0sCi0JCQkJICBmaWxlX3B0ciBhZGRyZXNzLCBpbnQgc3RvcF9wb2ludCwKLQkJCQkgIGludCBtYWdpY2NvdW50LCBjaGFyICptYWdpYykpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqc3RyZWFtLCBpbnQgc3RhdHVzKSk7Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG9wdGM7Ci0gIGludCBleGl0X3N0YXR1cyA9IDA7Ci0gIGJvb2xlYW4gZmlsZXNfZ2l2ZW4gPSBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLSAgc3RyaW5nX21pbiA9IC0xOwotICBwcmludF9hZGRyZXNzZXMgPSBmYWxzZTsKLSAgcHJpbnRfZmlsZW5hbWVzID0gZmFsc2U7Ci0gIGRhdGFzZWN0aW9uX29ubHkgPSB0cnVlOwotICB0YXJnZXQgPSBOVUxMOwotCi0gIHdoaWxlICgob3B0YyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYWZuOm90OnYwMTIzNDU2Nzg5IiwKLQkJCSAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0YykKLQl7Ci0JY2FzZSAnYSc6Ci0JICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgcHJpbnRfZmlsZW5hbWVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQotCWNhc2UgJ24nOgotCSAgc3RyaW5nX21pbiA9IGludGVnZXJfYXJnIChvcHRhcmcpOwotCSAgaWYgKHN0cmluZ19taW4gPCAxKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW52YWxpZCBudW1iZXIgJXNcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgcHJpbnRfYWRkcmVzc2VzID0gdHJ1ZTsKLQkgIGFkZHJlc3NfcmFkaXggPSA4OwotCSAgYnJlYWs7Ci0KLQljYXNlICd0JzoKLQkgIHByaW50X2FkZHJlc3NlcyA9IHRydWU7Ci0JICBpZiAob3B0YXJnWzFdICE9ICdcMCcpCi0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgc3dpdGNoIChvcHRhcmdbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDEwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIGFkZHJlc3NfcmFkaXggPSAxNjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ1QnOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICd2JzoKLQkgIHByaW50X3ZlcnNpb24gKCJzdHJpbmdzIik7Ci0JICBicmVhazsKLQotCWNhc2UgJz8nOgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHN0cmluZ19taW4gPCAwKQotCSAgICBzdHJpbmdfbWluID0gb3B0YzsKLQkgIGVsc2UKLQkgICAgc3RyaW5nX21pbiA9IHN0cmluZ19taW4gKiAxMCArIG9wdGMgLSAnMCc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfbWluIDwgMCkKLSAgICBzdHJpbmdfbWluID0gNDsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICBpZiAob3B0aW5kID49IGFyZ2MpCi0gICAgewotICAgICAgZGF0YXNlY3Rpb25fb25seSA9IGZhbHNlOwotICAgICAgcHJpbnRfc3RyaW5ncyAoIntzdGFuZGFyZCBpbnB1dH0iLCBzdGRpbiwgMCwgMCwgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBmaWxlc19naXZlbiA9IHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yICg7IG9wdGluZCA8IGFyZ2M7ICsrb3B0aW5kKQotCXsKLQkgIGlmIChzdHJjbXAgKGFyZ3Zbb3B0aW5kXSwgIi0iKSA9PSAwKQotCSAgICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlc19naXZlbiA9IHRydWU7Ci0JICAgICAgZXhpdF9zdGF0dXMgfD0gKHN0cmluZ3NfZmlsZSAoYXJndltvcHRpbmRdKSA9PSBmYWxzZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmaWxlc19naXZlbiA9PSBmYWxzZSkKLSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQotICByZXR1cm4gKGV4aXRfc3RhdHVzKTsKLX0KLQwKLS8qIFNjYW4gc2VjdGlvbiBTRUNUIG9mIHRoZSBmaWxlIEFCRkQsIHdob3NlIHByaW50YWJsZSBuYW1lIGlzIEZJTEUuCi0gICBJZiBpdCBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLAotICAgc2V0IGBnb3RfYV9zZWN0aW9uJyBhbmQgcHJpbnQgdGhlIHN0cmluZ3MgaW4gaXQuICAqLwotCi1zdGF0aWMgdm9pZAotc3RyaW5nc19hX3NlY3Rpb24gKGFiZmQsIHNlY3QsIGZpbGVhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Q7Ci0gICAgIFBUUiBmaWxlYXJnOwotewotICBjb25zdCBjaGFyICpmaWxlID0gKGNvbnN0IGNoYXIgKikgZmlsZWFyZzsKLQotICBpZiAoKHNlY3QtPmZsYWdzICYgREFUQV9GTEFHUykgPT0gREFUQV9GTEFHUykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN6ID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KTsKLSAgICAgIFBUUiBtZW0gPSB4bWFsbG9jIChzeik7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0LCBtZW0sIChmaWxlX3B0cikgMCwgc3opKQotCXsKLQkgIGdvdF9hX3NlY3Rpb24gPSB0cnVlOwotCSAgcHJpbnRfc3RyaW5ncyAoZmlsZSwgKEZJTEUgKikgTlVMTCwgc2VjdC0+ZmlsZXBvcywgMCwgc3osIG1lbSk7Ci0JfQotICAgICAgZnJlZSAobWVtKTsKLSAgICB9Ci19Ci0KLS8qIFNjYW4gYWxsIG9mIHRoZSBzZWN0aW9ucyBpbiBGSUxFLCBhbmQgcHJpbnQgdGhlIHN0cmluZ3MKLSAgIGluIHRoZSBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24ocykuCi0KLSAgIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsCi0gICBmYWxzZSBpZiBub3QgKHN1Y2ggYXMgaWYgRklMRSBpcyBub3QgYW4gb2JqZWN0IGZpbGUpLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0cmluZ3Nfb2JqZWN0X2ZpbGUgKGZpbGUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIGJmZCAqYWJmZCA9IGJmZF9vcGVuciAoZmlsZSwgdGFyZ2V0KTsKLQotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IHRoZSBmaWxlIGFzIGEgbm9uLW9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBjYWxsIGlzIG1haW5seSBmb3IgaXRzIHNpZGUgZWZmZWN0IG9mIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb25zLgotICAgICBXZSBmb2xsb3cgdGhlIHRyYWRpdGlvbmFsIGJlaGF2aW9yIG9mIGBzdHJpbmdzJyBpbiB0aGF0IHdlIGRvbid0Ci0gICAgIGNvbXBsYWluIGlmIHdlIGRvbid0IHJlY29nbml6ZSBhIGZpbGUgdG8gYmUgYW4gb2JqZWN0IGZpbGUuICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZ290X2Ffc2VjdGlvbiA9IGZhbHNlOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIHN0cmluZ3NfYV9zZWN0aW9uLCAoUFRSKSBmaWxlKTsKLQotICBpZiAoIWJmZF9jbG9zZSAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGdvdF9hX3NlY3Rpb247Ci19Ci0KLS8qIFByaW50IHRoZSBzdHJpbmdzIGluIEZJTEUuICBSZXR1cm4gdHJ1ZSBpZiBvaywgZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0cmluZ3NfZmlsZSAoZmlsZSkKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgLyogSWYgd2Ugd2VyZW4ndCB0b2xkIHRvIHNjYW4gdGhlIHdob2xlIGZpbGUsCi0gICAgIHRyeSB0byBvcGVuIGl0IGFzIGFuIG9iamVjdCBmaWxlIGFuZCBvbmx5IGxvb2sgYXQKLSAgICAgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9ucy4gIElmIHRoYXQgZmFpbHMsIGZhbGwgYmFjayB0byB0aGUKLSAgICAgd2hvbGUgZmlsZS4gICovCi0gIGlmICghZGF0YXNlY3Rpb25fb25seSB8fCAhc3RyaW5nc19vYmplY3RfZmlsZSAoZmlsZSkpCi0gICAgewotICAgICAgRklMRSAqc3RyZWFtOwotCi0gICAgICBzdHJlYW0gPSBmb3BlbiAoZmlsZSwgInJiIik7Ci0gICAgICAvKiBOb3QgYWxsIHN5c3RlbXMgcGVybWl0ICJyYiIsIHNvIHRyeSAiciIgaWYgaXQgZmFpbGVkLiAgKi8KLSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQlzdHJlYW0gPSBmb3BlbiAoZmlsZSwgInIiKTsKLSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgIHBlcnJvciAoZmlsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBwcmludF9zdHJpbmdzIChmaWxlLCBzdHJlYW0sIChmaWxlX3B0cikgMCwgMCwgMCwgKGNoYXIgKikgMCk7Ci0KLSAgICAgIGlmIChmY2xvc2UgKHN0cmVhbSkgPT0gRU9GKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgcGVycm9yIChmaWxlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRmluZCB0aGUgc3RyaW5ncyBpbiBmaWxlIEZJTEVOQU1FLCByZWFkIGZyb20gU1RSRUFNLgotICAgQXNzdW1lIHRoYXQgU1RSRUFNIGlzIHBvc2l0aW9uZWQgc28gdGhhdCB0aGUgbmV4dCBieXRlIHJlYWQKLSAgIGlzIGF0IGFkZHJlc3MgQUREUkVTUyBpbiB0aGUgZmlsZS4KLSAgIFN0b3AgcmVhZGluZyBhdCBhZGRyZXNzIFNUT1BfUE9JTlQgaW4gdGhlIGZpbGUsIGlmIG5vbnplcm8uCi0KLSAgIElmIFNUUkVBTSBpcyBOVUxMLCBkbyBub3QgcmVhZCBmcm9tIGl0LgotICAgVGhlIGNhbGxlciBjYW4gc3VwcGx5IGEgYnVmZmVyIG9mIGNoYXJhY3RlcnMKLSAgIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGRhdGEgaW4gU1RSRUFNLgotICAgTUFHSUMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQKLSAgIE1BR0lDQ09VTlQgaXMgaG93IG1hbnkgY2hhcmFjdGVycyBhcmUgaW4gaXQuCi0gICBUaG9zZSBjaGFyYWN0ZXJzIGNvbWUgYXQgYWRkcmVzcyBBRERSRVNTIGFuZCB0aGUgZGF0YSBpbiBTVFJFQU0gZm9sbG93LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N0cmluZ3MgKGZpbGVuYW1lLCBzdHJlYW0sIGFkZHJlc3MsIHN0b3BfcG9pbnQsIG1hZ2ljY291bnQsIG1hZ2ljKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBmaWxlX3B0ciBhZGRyZXNzOwotICAgICBpbnQgc3RvcF9wb2ludDsKLSAgICAgaW50IG1hZ2ljY291bnQ7Ci0gICAgIGNoYXIgKm1hZ2ljOwotewotICBjaGFyICpidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJpbmdfbWluICsgMSk7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgZmlsZV9wdHIgc3RhcnQ7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBjOwotCi0gICAgICAvKiBTZWUgaWYgdGhlIG5leHQgYHN0cmluZ19taW4nIGNoYXJzIGFyZSBhbGwgZ3JhcGhpYyBjaGFycy4gICovCi0gICAgdHJ5bGluZToKLSAgICAgIGlmIChzdG9wX3BvaW50ICYmIGFkZHJlc3MgPj0gc3RvcF9wb2ludCkKLQlicmVhazsKLSAgICAgIHN0YXJ0ID0gYWRkcmVzczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdfbWluOyBpKyspCi0JewotCSAgaWYgKG1hZ2ljY291bnQpCi0JICAgIHsKLQkgICAgICBtYWdpY2NvdW50LS07Ci0JICAgICAgYyA9ICptYWdpYysrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0JCXJldHVybjsKLQkgICAgICBjID0gZ2V0YyAoc3RyZWFtKTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXJldHVybjsKLQkgICAgfQotCSAgYWRkcmVzcysrOwotCSAgaWYgKCFpc2dyYXBoaWMgKGMpKQotCSAgICAvKiBGb3VuZCBhIG5vbi1ncmFwaGljLiAgVHJ5IGFnYWluIHN0YXJ0aW5nIHdpdGggbmV4dCBjaGFyLiAgKi8KLQkgICAgZ290byB0cnlsaW5lOwotCSAgYnVmW2ldID0gYzsKLQl9Ci0KLSAgICAgIC8qIFdlIGZvdW5kIGEgcnVuIG9mIGBzdHJpbmdfbWluJyBncmFwaGljIGNoYXJhY3RlcnMuICBQcmludCB1cAotICAgICAgICAgdG8gdGhlIG5leHQgbm9uLWdyYXBoaWMgY2hhcmFjdGVyLiAgKi8KLQotICAgICAgaWYgKHByaW50X2ZpbGVuYW1lcykKLQlwcmludGYgKCIlczogIiwgZmlsZW5hbWUpOwotICAgICAgaWYgKHByaW50X2FkZHJlc3NlcykKLQlzd2l0Y2ggKGFkZHJlc3NfcmFkaXgpCi0JICB7Ci0JICBjYXNlIDg6Ci0JICAgIHByaW50ZiAoIiU3bG8gIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMTA6Ci0JICAgIHByaW50ZiAoIiU3bGQgIiwgKGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMTY6Ci0JICAgIHByaW50ZiAoIiU3bHggIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLSAgICAgIGJ1ZltpXSA9ICdcMCc7Ci0gICAgICBmcHV0cyAoYnVmLCBzdGRvdXQpOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAobWFnaWNjb3VudCkKLQkgICAgewotCSAgICAgIG1hZ2ljY291bnQtLTsKLQkgICAgICBjID0gKm1hZ2ljKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgICAgYyA9IGdldGMgKHN0cmVhbSk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQlicmVhazsKLQkgICAgfQotCSAgYWRkcmVzcysrOwotCSAgaWYgKCEgaXNncmFwaGljIChjKSkKLQkgICAgYnJlYWs7Ci0JICBwdXRjaGFyIChjKTsKLQl9Ci0KLSAgICAgIHB1dGNoYXIgKCdcbicpOwotICAgIH0KLX0KLQwKLS8qIFBhcnNlIHN0cmluZyBTIGFzIGFuIGludGVnZXIsIHVzaW5nIGRlY2ltYWwgcmFkaXggYnkgZGVmYXVsdCwKLSAgIGJ1dCBhbGxvd2luZyBvY3RhbCBhbmQgaGV4IG51bWJlcnMgYXMgaW4gQy4gICovCi0KLXN0YXRpYyBpbnQKLWludGVnZXJfYXJnIChzKQotICAgICBjaGFyICpzOwotewotICBpbnQgdmFsdWU7Ci0gIGludCByYWRpeCA9IDEwOwotICBjaGFyICpwID0gczsKLSAgaW50IGM7Ci0KLSAgaWYgKCpwICE9ICcwJykKLSAgICByYWRpeCA9IDEwOwotICBlbHNlIGlmICgqKytwID09ICd4JykKLSAgICB7Ci0gICAgICByYWRpeCA9IDE2OwotICAgICAgcCsrOwotICAgIH0KLSAgZWxzZQotICAgIHJhZGl4ID0gODsKLQotICB2YWx1ZSA9IDA7Ci0gIHdoaWxlICgoKGMgPSAqcCsrKSA+PSAnMCcgJiYgYyA8PSAnOScpCi0JIHx8IChyYWRpeCA9PSAxNiAmJiAoYyAmIH40MCkgPj0gJ0EnICYmIChjICYgfjQwKSA8PSAnWicpKQotICAgIHsKLSAgICAgIHZhbHVlICo9IHJhZGl4OwotICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCXZhbHVlICs9IGMgLSAnMCc7Ci0gICAgICBlbHNlCi0JdmFsdWUgKz0gKGMgJiB+NDApIC0gJ0EnOwotICAgIH0KLQotICBpZiAoYyA9PSAnYicpCi0gICAgdmFsdWUgKj0gNTEyOwotICBlbHNlIGlmIChjID09ICdCJykKLSAgICB2YWx1ZSAqPSAxMDI0OwotICBlbHNlCi0gICAgcC0tOwotCi0gIGlmICgqcCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnZhbGlkIGludGVnZXIgYXJndW1lbnQgJXNcbiIpLCBwcm9ncmFtX25hbWUsIHMpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1hZm92XSBbLW4gbWluLWxlbl0gWy1taW4tbGVuXSBbLXQge28seCxkfV0gWy1dXG5cCi0gICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPW1pbi1sZW5dIFstLXJhZGl4PXtvLHgsZH1dXG5cCi0gICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLWhlbHBdIFstLXZlcnNpb25dIGZpbGUuLi5cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpcC4xIGIvYmludXRpbHMvc3RyaXAuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4ODE3ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdHJpcC4xCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBzdHJpcCAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1zdHJpcCBcLSBEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBzdHJpcAotLlJCICJbXHwiIFwtRlwgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1PXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUCAiXHxdIgotLlJCICJbXHwiIFwtUlwgXGZJc2VjdGlvbm5hbWVcZlJcIHxcIFxmQlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWVcZlAgIlx8XSIKLS5SQiAiW1x8IiBcLXNcZlJcIHxcIFxmQlwtXC1zdHJpcFwtYWxsICJcfF0iCi0uUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWcgIlx8XSIKLS5SQiAiW1x8IiBcLVwtc3RyaXBcLXVubmVlZGVkXGZSICJcfF0iCi0uUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsICJcfF0iCi0uUkIgIltcfCIgXC1YXGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtbG9jYWxzICJcfF0iCi0uUkIgIltcfCIgXC1LXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1OXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1vXCBcZklmaWxlXGZcUiAiXHxdIgotLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlcyAiXHxdIgotLlJCICJbXHwiIFwtdlxmUlwgfFwgXGZCXC1cLXZlcmJvc2UgIlx8XSIKLS5SQiAiW1x8IiBcLVZcZlJcIHxcIFxmQlwtXC12ZXJzaW9uICJcfF0iCi0uUkIgIltcfCIgXC1WXGZSXCB8XCBcZkJcLVwtaGVscCAiXHxdIgotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLQotLlNIIERFU0NSSVBUSU9OCi1HTlUKLS5CIHN0cmlwCi1kaXNjYXJkcyBhbGwgc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZXMKLS5JUiBvYmpmaWxlIC4KLVRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBtYXkgaW5jbHVkZSBhcmNoaXZlcy4KLUF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSBtdXN0IGJlIGdpdmVuLgotCi0uUAotLkIgc3RyaXAKLW1vZGlmaWVzIHRoZSBmaWxlcyBuYW1lZCBpbiBpdHMgYXJndW1lbnQsCi1yYXRoZXIgdGhhbiB3cml0aW5nIG1vZGlmaWVkIGNvcGllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CICJcLUYgXGZJYmZkbmFtZSIKLS5UUAotLkIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIKLVRyZWF0IHRoZSBvcmlnaW5hbCBcZklvYmpmaWxlXGZQIGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IFxmSWJmZG5hbWVcZlAsIGFuZCByZXdyaXRlIGl0IGluIHRoZSBzYW1lIGZvcm1hdC4KLQotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIHN0cmlwCi1hbmQgZXhpdC4KLQotLlRQCi0uQiAiXC1JIFxmSWJmZG5hbWUKLS5UUAotLkIgIlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUiCi1UcmVhdCB0aGUgb3JpZ2luYWwgXGZJb2JqZmlsZVxmUCBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Ci1jb2RlIGZvcm1hdCBcZkliZmRuYW1lXGZQLgotCi0uVFAKLS5CICJcLU8gXGZJYmZkbmFtZVxmUCIKLS5UUAotLkIgIlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lIgotUmVwbGFjZSBcZklvYmpmaWxlXGZQIHdpdGggYSBmaWxlIGluIHRoZSBvdXRwdXQgZm9ybWF0IFxmSWJmZG5hbWVcZlAuCi0KLS5UUAotLkIgIlwtUiBcZklzZWN0aW9ubmFtZVxmUCIKLS5UUAotLkIgIlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWUiCi1SZW1vdmUgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlCi10aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZQotb2JqZWN0IGZpbGUgdW51c2FibGUuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1zdHJpcFwtYWxsCi1SZW1vdmUgYWxsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1TCi0uVFAKLS5CIFwtZwotLlRQCi0uQiBcLVwtc3RyaXBcLWRlYnVnCi1SZW1vdmUgZGVidWdnaW5nIHN5bWJvbHMgb25seS4KLQotLlRQCi0uQiBcLVwtc3RyaXBcLXVubmVlZGVkCi1TdHJpcCBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0KLS5UUAotLkIgXC1OIFxmSXN5bWJvbG5hbWVcZlIKLS5UUAotLkIgXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotUmVtb3ZlIHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLCBhbmQgbWF5IGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgc3RyaXAKLW9wdGlvbnMuCi0KLS5UUAotLkIgXC1vIFxmSWZpbGVcZlIKLVB1dCB0aGUgc3RyaXBwZWQgb3V0cHV0IGluIFxmSWZpbGVcZlIsIHJhdGhlciB0aGFuIHJlcGxhY2luZyB0aGUKLWV4aXN0aW5nIGZpbGUuICBXaGVuIHRoaXMgYXJndW1lbnQgaXMgdXNlZCwgb25seSBvbmUgXGZJb2JqZmlsZVxmUgotYXJndW1lbnQgbWF5IGJlIHNwZWNpZmllZC4KLQotLlRQCi0uQiBcLXAKLS5UUAotLkIgXC1cLXByZXNlcnZlLWRhdGVzCi1QcmVzZXJ2ZSB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIGZpbGUuCi0KLS5UUAotLkIgXC14Ci0uVFAKLS5CIFwtXC1kaXNjYXJkXC1hbGwKLVJlbW92ZSBub24tZ2xvYmFsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1YCi0uVFAKLS5CIFwtXC1kaXNjYXJkXC1sb2NhbHMKLVJlbW92ZSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4KLShUaGVzZSB1c3VhbGx5IHN0YXJ0IHdpdGggYGBMJycgb3IgYGAuJycuKQotCi0uVFAKLS5CIFwtSyBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLUNvcHkgb25seSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotLlRQCi0uQiBcLU4gXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotRG8gbm90IGNvcHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGFuZCBtYXkgYmUgY29tYmluZWQgd2l0aCBzdHJpcCBvcHRpb25zCi1vdGhlciB0aGFuIFxmQlwtS1xmUi4KLQotLlRQCi0uQiBcLXYKLS5UUAotLkIgXC1cLXZlcmJvc2UKLVZlcmJvc2Ugb3V0cHV0OiBsaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWQuICBJbiB0aGUgY2FzZSBvZgotYXJjaGl2ZXMsCi0uQiAic3RyaXAgXC12IgotbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGZCc3RyaXBcZlAgYW5kIGV4aXQuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CUiBpbmZvIDsKLS5JUiAiVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzIiAsCi1Sb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2R1bXAuYyBiL2JpbnV0aWxzL3N5c2R1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyMWU4Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTAgKzAsMCBAQAotLyogU3lzcm9mZiBvYmplY3QgZm9ybWF0IGR1bXBlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPi4KLQotIFRoaXMgcHJvZ3JhbSByZWFkcyBhIFNZU1JPRkYgb2JqZWN0IGZpbGUgYW5kIHByaW50cyBpdCBpbiBhbgotIGFsbW9zdCBodW1hbiByZWFkYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgInN5c3JvZmYuaCIKLQotI2RlZmluZSBQUk9HUkFNX1ZFUlNJT04gIjEuMCIKLQotc3RhdGljIGludCBkdW1wID0gMTsKLXN0YXRpYyBpbnQgc2VnbWVudGVkX3A7Ci1zdGF0aWMgaW50IGNvZGU7Ci1zdGF0aWMgaW50IGFkZHJzaXplID0gNDsKLXN0YXRpYyBGSUxFICpmaWxlOwotCi1jaGFyICoKLWdldENIQVJTIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgaW50IG9jID0gKmlkeCAvIDg7Ci0gIGNoYXIgKnI7Ci0gIGludCBiID0gc2l6ZTsKLSAgaWYgKGIgPj0gbWF4KQotICAgIHsKLSAgICAgIHJldHVybiAiKnVuZGVmaW5lZCoiOwotICAgIH0KLQotICBpZiAoYiA9PSAwKQotICAgIHsKLSAgICAgIC8qIEdvdCB0byB3b3JrIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgZnJvbSBzZWxmICovCi0gICAgICBiID0gcHRyW29jKytdOwotICAgICAgKCppZHgpICs9IDg7Ci0gICAgfQotCi0gICppZHggKz0gYiAqIDg7Ci0gIHIgPSB4Y2FsbG9jIChiICsgMSwgMSk7Ci0gIG1lbWNweSAociwgcHRyICsgb2MsIGIpOwotICByW2JdID0gMDsKLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaCAocHRyLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLSAgaW50IGo7Ci0gIGludCBzcGFuID0gMTY7Ci0KLSAgcHJpbnRmICgiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IHNwYW4pCi0gICAgewotICAgICAgZm9yIChqID0gMDsgaiA8IHNwYW47IGorKykKLQl7Ci0JICBpZiAoaiArIGkgPCBzaXplKSAKLQkgICAgcHJpbnRmICgiJTAyeCAiLCBwdHJbaSArIGpdKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYgKCIgICAiKTsKLQl9Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBzcGFuICYmIGogKyBpIDwgc2l6ZTsgaisrKQotCXsKLQkgIGludCBjID0gcHRyW2kgKyBqXTsKLQkgIGlmIChjIDwgMzIgfHwgYyA+IDEyNykKLQkgICAgYyA9ICcuJzsKLQkgIHByaW50ZiAoIiVjIiwgYyk7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLWludAotZmlsbHVwIChwdHIpCi0gICAgIGNoYXIgKnB0cjsKLXsKLSAgaW50IHNpemU7Ci0gIGludCBzdW07Ci0gIGludCBpOwotICBzaXplID0gZ2V0YyAoZmlsZSkgLSAyOwotICBmcmVhZCAocHRyLCAxLCBzaXplLCBmaWxlKTsKLSAgc3VtID0gY29kZSArIHNpemUgKyAyOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN1bSArPSBwdHJbaV07Ci0gICAgfQotCi0gIGlmICgoc3VtICYgMHhmZikgIT0gMHhmZikKLSAgICB7Ci0gICAgICBwcmludGYgKCJTVU0gSVMgJXhcbiIsIHN1bSk7Ci0gICAgfQotICBpZiAoZHVtcCkKLSAgICBkaCAocHRyLCBzaXplKTsKLQotICByZXR1cm4gc2l6ZSAtIDE7Ci19Ci0KLWJhcnJheQotZ2V0QkFSUkFZIChwdHIsIGlkeCwgZHNpemUsIG1heCkKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IGRzaXplOwotICAgICBpbnQgbWF4OwotewotICBiYXJyYXkgcmVzOwotICBpbnQgaTsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLSAgaW50IHNpemUgPSBwdHJbYnl0ZSsrXTsKLSAgcmVzLmxlbiA9IHNpemU7Ci0gIHJlcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoc2l6ZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgcmVzLmRhdGFbaV0gPSBwdHJbYnl0ZSsrXTsKLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLWludAotZ2V0SU5UIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgaW50IG4gPSAwOwotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotCi0gIGlmIChieXRlID49IG1heCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaXplID09IC0yKQotICAgIHNpemUgPSBhZGRyc2l6ZTsKLSAgaWYgKHNpemUgPT0gLTEpCi0gICAgc2l6ZSA9IDA7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSAxOgotICAgICAgbiA9IChwdHJbYnl0ZV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbiA9IChwdHJbYnl0ZSArIDBdIDw8IDgpICsgcHRyW2J5dGUgKyAxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG4gPSAocHRyW2J5dGUgKyAwXSA8PCAyNCkgKyAocHRyW2J5dGUgKyAxXSA8PCAxNikgKyAocHRyW2J5dGUgKyAyXSA8PCA4KSArIChwdHJbYnl0ZSArIDNdKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gICppZHggKz0gc2l6ZSAqIDg7Ci0gIHJldHVybiBuOwotfQotCi1pbnQKLWdldEJJVFMgKHB0ciwgaWR4LCBzaXplLCBtYXgpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplLCBtYXg7Ci17Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0gIGludCBiaXQgPSAqaWR4ICUgODsKLQotICBpZiAoYnl0ZSA+PSBtYXgpCi0gICAgcmV0dXJuIDA7Ci0KLSAgKmlkeCArPSBzaXplOwotCi0gIHJldHVybiAocHRyW2J5dGVdID4+ICg4IC0gYml0IC0gc2l6ZSkpICYgKCgxIDw8IHNpemUpIC0gMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pdGhlYWRlciAobmFtZSwgY29kZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHByaW50ZiAoIlxuJXMgMHglMDJ4XG4iLCBuYW1lLCBjb2RlKTsKLX0KLQotc3RhdGljIGludCBpbmRlbnQ7Ci1zdGF0aWMgdm9pZAotcCAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoInwgIik7Ci0gICAgfQotICBwcmludGYgKCI+ICIpOwotfQotCi1zdGF0aWMgdm9pZAotdGFib3V0ICgpCi17Ci0gIHAgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYmFycmF5ICh5KQotICAgICBiYXJyYXkgKnk7Ci17Ci0gIGludCB4OwotICBwcmludGYgKCIlZCAoIiwgeS0+bGVuKTsKLSAgZm9yICh4ID0gMDsgeCA8IHktPmxlbjsgeCsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiglMDJ4ICVjKSIsIHktPmRhdGFbeF0sIGlzcHJpbnQgKHktPmRhdGFbeF0pID8geS0+ZGF0YVt4XSA6ICcuJyk7Ci0gICAgfQotICBwcmludGYgKCIpXG4iKTsKLX0KLQotI2RlZmluZSBTWVNST0ZGX1BSSU5UCi0jZGVmaW5lIFNZU1JPRkZfU1dBUF9JTgotCi0jaW5jbHVkZSAic3lzcm9mZi5jIgotCi0vKiAKLSAqIEZJWE1FOiBzeXNpbmZvLCB3aGljaCBnZW5lcmF0ZXMgc3lzcm9mZi5bY2hdIGZyb20gc3lzcm9mZi5pbmZvLCBjYW4ndAotICogaGFjayB0aGUgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ciBibG9jaywgd2hpY2ggaGFzIG5vIGNvbnRlbnRzLiAgU28gd2UKLSAqIGltcGxlbWVudCBvdXIgb3duIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBpbiBhbmQgcHJpbnRpbmcgb3V0IHRoZSB0cgotICogYmxvY2suCi0gKi8KLQotI2RlZmluZSBJVF90cl9DT0RFCTB4N2YKLXZvaWQKLXN5c3JvZmZfc3dhcF90cl9pbigpCi17Ci0JY2hhciByYXdbMjU1XTsKLQotCW1lbXNldChyYXcsIDAsIDI1NSk7Ci0JZmlsbHVwKHJhdyk7Ci19Ci0KLXZvaWQKLXN5c3JvZmZfcHJpbnRfdHJfb3V0KCkKLXsKLQlpdGhlYWRlcigidHIiLCBJVF90cl9DT0RFKTsKLX0KLQotc3RhdGljIGludAotZ2V0b25lICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IGMgPSBnZXRjIChmaWxlKTsKLSAgY29kZSA9IGM7Ci0KLSAgaWYgKChjICYgMHg3ZikgIT0gdHlwZSkKLSAgICB7Ci0gICAgICB1bmdldGMgKGMsIGZpbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHN3aXRjaCAoYyAmIDB4N2YpCi0gICAgewotICAgIGNhc2UgSVRfY3NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfY3MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2NzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfY3Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kbG5fQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGxuIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kbG5faW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kbG5fb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9oZF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9oZCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfaGRfaW4gKCZkdW1teSk7Ci0JYWRkcnNpemUgPSBkdW1teS5hZmw7Ci0Jc3lzcm9mZl9wcmludF9oZF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rhcl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kYXIgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rhcl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rhcl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RzeV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc3kgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RzeV9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RzeV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RmcF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZnAgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RmcF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RmcF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rzb19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc28gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rzb19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rzb19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RwdF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kcHQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RwdF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RwdF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rlbl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZW4gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rlbl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rlbl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RidF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RidF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RidF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R0eV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdHkgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R0eV9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R0eV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3VuX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3VuIGR1bW15OwotCXN5c3JvZmZfc3dhcF91bl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3VuX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfc2NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfc2MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3NjX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfc2Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9lcl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9lciBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZXJfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9lcl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2VkX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2VkIGR1bW15OwotCXN5c3JvZmZfc3dhcF9lZF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2VkX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfc2hfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfc2ggZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3NoX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfc2hfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9vYl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9vYiBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfb2JfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9vYl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3JsX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3JsIGR1bW15OwotCXN5c3JvZmZfc3dhcF9ybF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3JsX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHVfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHUgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1X2luICgmZHVtbXkpOwotCi0Jc3lzcm9mZl9wcmludF9kdV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1c19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdXMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1c19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R1c19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1bF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdWwgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1bF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R1bF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rzc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc3MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rzc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rzc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2hzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2hzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9oc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2hzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHBzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RwcyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHBzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHBzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfdHJfQ09ERToKLSAgICAgIHsKLQlzeXNyb2ZmX3N3YXBfdHJfaW4gKCk7Ci0Jc3lzcm9mZl9wcmludF90cl9vdXQgKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rkc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZHMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rkc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rkc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRmICgiR09UIEEgJXhcbiIsIGMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1vcHQgKHgpCi0gICAgIGludCB4OwotewotICByZXR1cm4gZ2V0b25lICh4KTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi11bml0X2luZm9fbGlzdCAoKQotewotICB3aGlsZSAob3B0IChJVF91bl9DT0RFKSkKLSAgICB7Ci0gICAgICBnZXRvbmUgKElUX3VzX0NPREUpOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9zY19DT0RFKSkKLQlnZXRvbmUgKElUX3NzX0NPREUpOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9lcl9DT0RFKSkKLQk7Ci0KLSAgICAgIHdoaWxlIChnZXRvbmUgKElUX2VkX0NPREUpKQotCTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamVjdF9ib2R5X2xpc3QgKCkKLXsKLSAgd2hpbGUgKGdldG9uZSAoSVRfc2hfQ09ERSkpCi0gICAgewotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfb2JfQ09ERSkpCi0JOwotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfcmxfQ09ERSkpCi0JOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1tdXN0ICh4KQotICAgICBpbnQgeDsKLXsKLSAgaWYgKCFnZXRvbmUgKHgpKQotICAgIHsKLSAgICAgIHByaW50ZiAoIldBTlRFRCAleCEhXG4iLCB4KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWIgKGksIHMpCi0gICAgIGludCBpOwotICAgICBjaGFyICpzOwotewotICBpbmRlbnQgKz0gaTsKLSAgaWYgKHMpCi0gICAgewotICAgICAgcCAoKTsKLSAgICAgIHByaW50ZiAocyk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZGVyaXZlZF90eXBlICgpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zeW1ib2xfaW5mbyAoKQotewotICB0YWIgKDEsICJTWU1CT0wgSU5GTyIpOwotICB3aGlsZSAob3B0IChJVF9kc3lfQ09ERSkpCi0gICAgewotICAgICAgaWYgKG9wdCAoSVRfZHR5X0NPREUpKQotCXsKLQkgIG11c3QgKElUX2RidF9DT0RFKTsKLQkgIGRlcml2ZWRfdHlwZSAoKTsKLQkgIG11c3QgKElUX2R0eV9DT0RFKTsKLQl9Ci0gICAgfQotICB0YWIgKC0xLCAiIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZXJpdmVkX3R5cGUgKCkKLXsKLSAgdGFiICgxLCAiREVSSVZFRCBUWVBFIik7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChvcHQgKElUX2RwcF9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZHBwX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGZwX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZnBfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kZW5fQ09ERSkpCi0JewotCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLQkgIG11c3QgKElUX2Rlbl9DT0RFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2Rlbl9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZGVuX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGRzX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZHNfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kYXJfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZHB0X0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2R1bF9DT0RFKSkKLQl7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kc2VfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZG90X0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0gIHRhYiAoLTEsICIiKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9ncmFtX3N0cnVjdHVyZSAoKQotewotICB0YWIgKDEsICJQUk9HUkFNIFNUUlVDVFVSRSIpOwotICB3aGlsZSAob3B0IChJVF9kcHNfQ09ERSkpCi0gICAgewotICAgICAgbXVzdCAoSVRfZHNvX0NPREUpOwotICAgICAgb3B0IChJVF9kc3NfQ09ERSk7Ci0gICAgICBkdW1wX3N5bWJvbF9pbmZvICgpOwotICAgICAgbXVzdCAoSVRfZHBzX0NPREUpOwotICAgIH0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jZW5kaWYKLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19saXN0ICgpCi17Ci0gIHRhYiAoMSwgIkRFQlVHIExJU1QiKTsKLQotICBtdXN0IChJVF9kdV9DT0RFKTsKLSAgb3B0IChJVF9kdXNfQ09ERSk7Ci0gIHByb2dyYW1fc3RydWN0dXJlICgpOwotICBtdXN0IChJVF9kbG5fQ09ERSk7Ci0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLW1vZHVsZSAoKQotewotICBpbnQgYyA9IDA7Ci0gIGludCBsID0gMDsKLQotICB0YWIgKDEsICJNT0RVTEUqKipcbiIpOwotCi0gIGRvCi0gICAgewotICAgICAgYyA9IGdldGMgKGZpbGUpOwotICAgICAgdW5nZXRjIChjLCBmaWxlKTsKLQotICAgICAgYyAmPSAweDdmOwotICAgIH0KLSAgd2hpbGUgKGdldG9uZSAoYykgJiYgYyAhPSBJVF90cl9DT0RFKTsKLQotI2lmIDAKLSAgbXVzdCAoSVRfY3NfQ09ERSk7Ci0gIG11c3QgKElUX2hkX0NPREUpOwotICBvcHQgKElUX2hzX0NPREUpOwotCi0gIHVuaXRfaW5mb19saXN0ICgpOwotICBvYmplY3RfYm9keV9saXN0ICgpOwotICBkZWJ1Z19saXN0ICgpOwotCi0gIG11c3QgKElUX3RyX0NPREUpOwotI2VuZGlmCi0gIHRhYiAoLTEsICIiKTsKLQotICBjID0gZ2V0YyAoZmlsZSk7Ci0gIHdoaWxlIChjICE9IEVPRikKLSAgICB7Ci0gICAgICBwcmludGYgKCIlMDJ4ICIsIGMpOwotICAgICAgbCsrOwotICAgICAgaWYgKGwgPT0gMzIpCi0JewotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGwgPSAwOwotCX0KLSAgICAgIGMgPSBnZXRjIChmaWxlKTsKLSAgICB9Ci19Ci0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIpLCBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIGludCBvcHQ7Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLSAgewotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgMCwgMH0KLSAgfTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiaFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgTlVMTCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ1YnOgotCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKLQkgIGV4aXQgKDApOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLSAgaWYgKG9wdGluZCA8IGFjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGUgPSBhdltvcHRpbmRdOwotICAgIH0KLQotICBpZiAoIWlucHV0X2ZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGZpbGUgPSBmb3BlbiAoaW5wdXRfZmlsZSwgRk9QRU5fUkIpOwotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgaW5wdXRfZmlsZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgbW9kdWxlICgpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2luZm8ueSBiL2JpbnV0aWxzL3N5c2luZm8ueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhODczNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNpbmZvLnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotJXsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1leHRlcm4gY2hhciAqd29yZDsKLWV4dGVybiBjaGFyIHdyaXRlY29kZTsKLWV4dGVybiBpbnQgbnVtYmVyOwotZXh0ZXJuIGludCB1bml0OwotY2hhciBuaWNlX25hbWVbMTAwMF07Ci1jaGFyICppdDsKLWludCBzb2ZhcjsKLWludCB3aWR0aDsKLWludCBjb2RlOwotY2hhciAqIHJlcGVhdDsKLWNoYXIgKm9sZHJlcGVhdDsKLWNoYXIgKm5hbWU7Ci1pbnQgcmRlcHRoOwotY2hhciAqbG9vcCBbXSA9IHsiIiwibiIsIm0iLCIvKkJBRCovIn07Ci1jaGFyICpuYW1lc1tdID0geyIgIiwiW25dIiwiW25dW21dIn07Ci1jaGFyICpwbmFtZXNbXT0geyIiLCIqIiwiKioifTsKLSV9Ci0KLQotJXVuaW9uIHsKLSBpbnQgaTsKLSBjaGFyICpzOwotfSAKLSV0b2tlbiBDT05ECi0ldG9rZW4gUkVQRUFUCi0ldG9rZW4gJygnICcpJwotJXRva2VuIDxzPiBUWVBFCi0ldG9rZW4gPHM+IE5BTUUKLSV0b2tlbiA8aT4gTlVNQkVSIFVOSVQKLSV0eXBlIDxpPiBhdHRyX3NpemUgCi0ldHlwZSA8cz4gYXR0cl9kZXNjIGF0dHJfaWQgYXR0cl90eXBlCi0lJQotCi10b3A6ICB7Ci0gIHN3aXRjaCAod3JpdGVjb2RlKQotICAgIHsKLSAgICBjYXNlICdpJzoKLSAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfU1dBUF9JTlxuIik7Ci0gICAgICBicmVhazsgCi0gICAgY2FzZSAncCc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX3BcbiIpOwotICAgICAgYnJlYWs7IAotICAgIGNhc2UgJ2QnOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZyc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX1NXQVBfT1VUXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgICAgcHJpbnRmKCIjaWZkZWYgU1lTUk9GRl9QUklOVFxuIik7Ci0gICAgICBwcmludGYoIiNpbmNsdWRlIDxzdGRpby5oPlxuIik7Ci0gICAgICBwcmludGYoIiNpbmNsdWRlIDxzdGRsaWIuaD5cbiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotIH0gCi1pdF9saXN0IHsKLSAgc3dpdGNoICh3cml0ZWNvZGUpIHsKLSAgY2FzZSAnaSc6Ci0gIGNhc2UgJ3AnOgotICBjYXNlICdnJzoKLSAgY2FzZSAnYyc6Ci0gICAgcHJpbnRmKCIjZW5kaWZcbiIpOwotICAgIGJyZWFrOyAKLSAgY2FzZSAnZCc6Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotICA7Ci0KLQotaXRfbGlzdDogaXQgaXRfbGlzdAotICB8Ci0gIDsKLQotaXQ6Ci0JJygnIE5BTUUgTlVNQkVSIAotICAgICAgewotCWl0ID0gJDI7IGNvZGUgPSAkMzsKLQlzd2l0Y2ggKHdyaXRlY29kZSkgCi0JICB7Ci0JICBjYXNlICdkJzoKLQkgICAgcHJpbnRmKCJcblxuXG4jZGVmaW5lIElUXyVzX0NPREUgMHgleFxuIiwgaXQsY29kZSk7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzIHsgXG4iLCBpdCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnaSc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfaW4ocHRyKVxuIiwkMik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLCBpdCk7Ci0JICAgIHByaW50Zigie1xuIik7Ci0JICAgIHByaW50ZigiY2hhciByYXdbMjU1XTtcbiIpOwotCSAgICBwcmludGYoIlx0aW50IGlkeCA9IDAgO1xuIik7Ci0JICAgIHByaW50ZigiXHRpbnQgc2l6ZTtcbiIpOwotCSAgICBwcmludGYoIm1lbXNldChyYXcsMCwyNTUpO1xuIik7CQotCSAgICBwcmludGYoIm1lbXNldChwdHIsMCxzaXplb2YoKnB0cikpO1xuIik7Ci0JICAgIHByaW50Zigic2l6ZSA9IGZpbGx1cChyYXcpO1xuIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnZyc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfb3V0KGZpbGUscHRyKVxuIiwkMik7Ci0JICAgIHByaW50ZigiRklMRSAqIGZpbGU7XG4iKTsKLQkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsIGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJcdGNoYXIgcmF3WzI1NV07XG4iKTsKLQkgICAgcHJpbnRmKCJcdGludCBpZHggPSAxNiA7XG4iKTsKLQkgICAgcHJpbnRmKCJcdG1lbXNldCAocmF3LCAwLCAyNTUpO1xuIik7Ci0JICAgIHByaW50ZigiXHRjb2RlID0gSVRfJXNfQ09ERTtcbiIsIGl0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdvJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfc3dhcF8lc19vdXQoYWJmZCxwdHIpXG4iLCQyKTsKLQkgICAgcHJpbnRmKCJiZmQgKiBhYmZkO1xuIik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJpbnQgaWR4ID0gMCA7XG4iKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdjJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfcHJpbnRfJXNfb3V0KHB0cilcbiIsJDIpOwotCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyAqcHRyO1xuIiwgaXQpOwotCSAgICBwcmludGYoIntcbiIpOwotCSAgICBwcmludGYoIml0aGVhZGVyKFwiJXNcIiwgSVRfJXNfQ09ERSk7XG4iLCQyLCQyKTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgJ3QnOgotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgfSAKLQlpdF9maWVsZF9saXN0IAotJyknCi17Ci0gIHN3aXRjaCAod3JpdGVjb2RlKSB7Ci0gIGNhc2UgJ2QnOiAKLSAgICBwcmludGYoIn07XG4iKTsKLSAgICBicmVhazsKLSAgY2FzZSAnZyc6Ci0gICAgcHJpbnRmKCJcdGNoZWNrc3VtKGZpbGUscmF3LCBpZHgsIElUXyVzX0NPREUpO1xuIiwgaXQpOwotICAgIAotICBjYXNlICdpJzoKLQotICBjYXNlICdvJzoKLSAgY2FzZSAnYyc6Ci0gICAgcHJpbnRmKCJ9XG4iKTsKLSAgfQotfQotOwotCi0KLQotaXRfZmllbGRfbGlzdDoKLQkJaXRfZmllbGQgaXRfZmllbGRfbGlzdAotCXwJY29uZF9pdF9maWVsZCBpdF9maWVsZF9saXN0CQotCXwJcmVwZWF0X2l0X2ZpZWxkIGl0X2ZpZWxkX2xpc3QKLQl8Ci0JOwotCi1yZXBlYXRfaXRfZmllbGQ6ICcoJyBSRVBFQVQgTkFNRQotCXsKLQkgIHJkZXB0aCsrOwotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIGlmIChyZGVwdGg9PTEpCi0JICAgICAgcHJpbnRmKCJcdHByaW50ZihcInJlcGVhdCAlJWRcXG5cIiwgJXMpO1xuIiwkMyk7Ci0JICAgICAgaWYgKHJkZXB0aD09MikKLQkgICAgICBwcmludGYoIlx0cHJpbnRmKFwicmVwZWF0ICUlZFxcblwiLCAlc1tuXSk7XG4iLCQzKTsKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdvJzoKLQotCSAgICAgIGlmIChyZGVwdGg9PTEpIAotCQl7Ci0JICAgICAgcHJpbnRmKCJcdHsgaW50IG47IGZvciAobiA9IDA7IG4gPCAlczsgbisrKSB7XG4iLCAgICAkMyk7Ci0JICAgIH0KLQkgICAgICBpZiAocmRlcHRoID09IDIpIHsKLQkgICAgICBwcmludGYoIlx0eyBpbnQgbTsgZm9yIChtID0gMDsgbSA8ICVzW25dOyBtKyspIHtcbiIsICAgICQzKTsKLQkgICAgfQkJCi0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBvbGRyZXBlYXQgPSByZXBlYXQ7Ci0gICAgICAgICByZXBlYXQgPSAkMzsKLQl9Ci0KLQkgaXRfZmllbGRfbGlzdCAnKScgCi0KLQl7Ci0JICByZXBlYXQgPSBvbGRyZXBlYXQ7Ci0JICBvbGRyZXBlYXQgPTA7Ci0JICByZGVwdGgtLTsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgcHJpbnRmKCJcdH19XG4iKTsKLQl9Ci0JfQotICAgICAgIDsKLQotCi1jb25kX2l0X2ZpZWxkOiAnKCcgQ09ORCBOQU1FCi0JewotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIHByaW50ZigiXHRpZiAoJXMpIHtcbiIsICQzKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotCSBpdF9maWVsZF9saXN0ICcpJyAKLQl7Ci0JICBzd2l0Y2ggKHdyaXRlY29kZSkKLQkgICAgewotCSAgICBjYXNlICdpJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ28nOgotCSAgICBjYXNlICdjJzoKLQkgIHByaW50ZigiXHR9XG4iKTsKLQl9Ci0JfQotICAgICAgIDsKLQotaXRfZmllbGQ6Ci0JJygnIGF0dHJfZGVzYyAnKCcgYXR0cl90eXBlIGF0dHJfc2l6ZSAnKScgYXR0cl9pZCAKLQl7bmFtZSA9ICQ3OyB9IAotCWVudW1zICcpJwotCXsKLQkgIGNoYXIgKmRlc2MgPSAkMjsKLQkgIGNoYXIgKnR5cGUgPSAkNDsKLQkgIGludCBzaXplID0gJDU7Ci0JICBjaGFyICppZCA9ICQ3OwotY2hhciAqcCA9IG5hbWVzW3JkZXB0aF07Ci1jaGFyICpwdHIgPSBwbmFtZXNbcmRlcHRoXTsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdnJzoKLQkgICAgICBpZiAoc2l6ZSAlIDgpIAotCQl7Ci0JCSAgCi0JCSAgcHJpbnRmKCJcdHdyaXRlQklUUyhwdHItPiVzJXMscmF3LCZpZHgsJWQpO1xuIiwKLQkJCSBpZCwKLQkJCSBuYW1lc1tyZGVwdGhdLCBzaXplKTsKLQotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHR3cml0ZSVzKHB0ci0+JXMlcyxyYXcsJmlkeCwlZCxmaWxlKTtcbiIsCi0JCSAgICAgICB0eXBlLAotCQkgICAgICAgaWQsCi0JCSAgICAgICBuYW1lc1tyZGVwdGhdLHNpemUvOCk7Ci0JCX0KLQkgICAgICBicmVhazsJICAgICAgCi0JICAgIGNhc2UgJ2knOgotCSAgICAgIHsKLQotCQlpZiAocmRlcHRoID49IDEpCi0KLQkJICB7Ci0JCSAgICBwcmludGYoImlmICghcHRyLT4lcykgcHRyLT4lcyA9ICglcyopeGNhbGxvYyglcywgc2l6ZW9mKHB0ci0+JXNbMF0pKTtcbiIsIAotCQkJICAgaWQsIAotCQkJICAgaWQsCi0JCQkgICB0eXBlLAotCQkJICAgcmVwZWF0LAotCQkJICAgaWQpOwotCQkgIH0KLQotCQlpZiAocmRlcHRoID09IDIpCi0JCSAgewotCQkgICAgcHJpbnRmKCJpZiAoIXB0ci0+JXNbbl0pIHB0ci0+JXNbbl0gPSAoJXMqKil4Y2FsbG9jKCVzW25dLCBzaXplb2YocHRyLT4lc1tuXVswXSkpO1xuIiwgCi0JCQkgICBpZCwgCi0JCQkgICBpZCwKLQkJCSAgIHR5cGUsCi0JCQkgICByZXBlYXQsCi0JCQkgICBpZCk7Ci0JCSAgfQotCi0JICAgICAgfQotCi0JICAgICAgaWYgKHNpemUgJSA4KSAKLQkJewotCQkgIHByaW50ZigiXHRwdHItPiVzJXMgPSBnZXRCSVRTKHJhdywmaWR4LCAlZCxzaXplKTtcbiIsCi0JCQkgaWQsCi0JCQkgbmFtZXNbcmRlcHRoXSwgCi0JCQkgc2l6ZSk7Ci0JCX0KLQkgICAgICBlbHNlIHsKLQkJcHJpbnRmKCJcdHB0ci0+JXMlcyA9IGdldCVzKHJhdywmaWR4LCAlZCxzaXplKTtcbiIsCi0JCSAgICAgICBpZCwKLQkJICAgICAgIG5hbWVzW3JkZXB0aF0sCi0JCSAgICAgICB0eXBlLAotCQkgICAgICAgc2l6ZS84KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdvJzoKLQkgICAgICBwcmludGYoIlx0cHV0JXMocmF3LCVkLCVkLCZpZHgscHRyLT4lcyVzKTtcbiIsIHR5cGUsc2l6ZS84LHNpemUlOCxpZCxuYW1lc1tyZGVwdGhdKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgaWYgKHJlcGVhdCkgCi0JCXByaW50ZigiXHQvKiByZXBlYXQgJXMgKi9cbiIsIHJlcGVhdCk7Ci0KLQkJICBpZiAodHlwZVswXSA9PSAnSScpIHsKLQkJICBwcmludGYoIlx0aW50ICVzJXM7IFx0LyogJXMgKi9cbiIscHRyLGlkLCBkZXNjKTsKLQkJfQotCQkgIGVsc2UgaWYgKHR5cGVbMF0gPT0nQycpIHsKLQkJICBwcmludGYoIlx0Y2hhciAlcyolcztcdCAvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHRiYXJyYXkgJXMlcztcdCAvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCSAgICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSAnYyc6Ci0JICAgICAgcHJpbnRmKCJ0YWJvdXQoKTtcbiIpOwotCQkgIHByaW50ZigiXHRwcmludGYoXCIvKiUtMzBzKi8gcHRyLT4lcyA9IFwiKTtcbiIsIGRlc2MsIGlkKTsKLQotCQkgIGlmICh0eXBlWzBdID09ICdJJykKLQkJICBwcmludGYoIlx0cHJpbnRmKFwiJSVkXFxuXCIscHRyLT4lcyVzKTtcbiIsIGlkLHApOwotCQkgIGVsc2UgICBpZiAodHlwZVswXSA9PSAnQycpCi0JCSAgcHJpbnRmKCJcdHByaW50ZihcIiUlc1xcblwiLHB0ci0+JXMlcyk7XG4iLCBpZCxwKTsKLQotCQkgIGVsc2UgICBpZiAodHlwZVswXSA9PSAnQicpIAotCQkgICAgewotCQkgIHByaW50ZigiXHRwYmFycmF5KCZwdHItPiVzJXMpO1xuIiwgaWQscCk7Ci0JCX0KLQkgICAgICBlbHNlIGFib3J0KCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQl9Ci0KLQk7Ci0KLQotYXR0cl90eXBlOgkKLQkgVFlQRSB7ICQkID0gJDE7IH0KLSAJfCAgeyAkJCA9ICJJTlQiO30KLQk7Ci0KLWF0dHJfZGVzYzogCi0JJygnIE5BTUUgJyknCQotCXsgJCQgPSAkMjsgfQotCTsKLQotYXR0cl9zaXplOgotCSBOVU1CRVIgVU5JVCAKLQl7ICQkID0gJDEgKiAkMjsgfQotCTsKLQotCi1hdHRyX2lkOgotCQknKCcgTkFNRSAnKScJeyAkJCA9ICQyOyB9Ci0JfAl7ICQkID0gImR1bW15Ijt9Ci0JOwkKLQkKLWVudW1zOiAKLQl8ICcoJyBlbnVtX2xpc3QgJyknIDsKLQotZW51bV9saXN0OgotCXwKLQllbnVtX2xpc3QgJygnIE5BTUUgTkFNRSAnKScgeyAKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdkJzoKLQkgICAgICBwcmludGYoIiNkZWZpbmUgJXMgJXNcbiIsICQzLCQ0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYyc6Ci0JCXByaW50ZigiaWYgKHB0ci0+JXMlcyA9PSAlcykgeyB0YWJvdXQoKTsgcHJpbnRmKFwiJXNcXG5cIik7fVxuIiwgbmFtZSwgbmFtZXNbcmRlcHRoXSwkNCwkMyk7Ci0JICAgIH0KLQl9Ci0KLQk7Ci0KLQotCi0lJQotLyogZm91ciBtb2RlcwotCi0gICAtZCB3cml0ZSBzdHJ1Y3R1cmUgZGVmaW50aW9ucyBmb3Igc3lzcm9mZiBpbiBob3N0IGZvcm1hdAotICAgLWkgd3JpdGUgZnVuY3Rpb25zIHRvIHN3YXAgaW50byBzeXNyb2ZmIGZvcm1hdCBpbgotICAgLW8gd3JpdGUgZnVuY3Rpb25zIHRvIHN3YXAgaW50byBzeXNyb2ZmIGZvcm1hdCBvdXQKLSAgIC1jIHdyaXRlIGNvZGUgdG8gcHJpbnQgaW5mbyBpbiBodW1hbiBmb3JtICovCi0KLWludCB5eWRlYnVnOwotY2hhciB3cml0ZWNvZGU7Ci0KLWludCAKLW1haW4oYWMsYXYpCi1pbnQgYWM7Ci1jaGFyICoqYXY7Ci17Ci0gIHl5ZGVidWc9MDsKLSAgaWYgKGFjID4gMSkKLSAgICB3cml0ZWNvZGUgPSBhdlsxXVsxXTsKLWlmICh3cml0ZWNvZGUgPT0gJ2QnKQotICB7Ci0gICAgcHJpbnRmKCJ0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBsZW47IH0gYmFycmF5OyBcbiIpOwotICAgIHByaW50ZigidHlwZWRlZiAgaW50IElOVDtcbiIpOwotICAgIHByaW50ZigidHlwZWRlZiAgY2hhciAqIENIQVJTO1xuIik7Ci0KLSAgfQotICB5eXBhcnNlKCk7Ci1yZXR1cm4gMDsKLX0KLQotaW50Ci15eWVycm9yKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGZwcmludGYoc3RkZXJyLCAiJXNcbiIgLCBzKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNsZXgubCBiL2JpbnV0aWxzL3N5c2xleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk0ODQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N5c2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotJXsKLSNpbmNsdWRlICJzeXNpbmZvLmgiCi1jaGFyICp3b3JkOwotaW50IG51bWJlcjsKLWludCB1bml0OwotCi0jaWZuZGVmIHl5d3JhcAotc3RhdGljIGludCB5eXdyYXAgKCkgeyByZXR1cm4gMTsgfQotI2VuZGlmCi0lfQotJSUKLSIoIiB7IHJldHVybiAnKCc7fQotIikiIHsgcmV0dXJuICcpJzt9Ci0iWyIgeyByZXR1cm4gJ1snO30KLSJdIiB7IHJldHVybiAnXSc7fQotIiAiIHsgOyB9Ci0iOyIuKiB7IDsgfSAKLSJcdCIgeyA7IH0KLSJcbiIgeyA7IH0KLSJcIiJbXlwiXSoiXCIiIHsKLXl5bHZhbC5zID0gbWFsbG9jKHN0cmxlbiAoeXl0ZXh0KSk7Ci1zdHJjcHkoeXlsdmFsLnMsIHl5dGV4dCsxKTsKLXl5bHZhbC5zW3N0cmxlbih5eWx2YWwucyktMV0gPSAwOwotICAgICAgICByZXR1cm4gTkFNRTsKLQl9Ci0KLTB4WzAtOWEtZl0rIHsKLSAgICAgICAgeXlsdmFsLmkgPSBzdHJ0b2woeXl0ZXh0LDAsMTYpOwotCXJldHVybiAgTlVNQkVSOwotCX0KLQotWzAtOV0rIHsKLSAgICAgICAgeXlsdmFsLmkgPSBhdG9pKHl5dGV4dCk7Ci0JcmV0dXJuICBOVU1CRVI7Ci0JfQotCi0KLSJiaXRzIiB7IHl5bHZhbC5pID0xIDtyZXR1cm4gVU5JVDt9Ci0iYml0IiB7IHl5bHZhbC5pID0gMTsgcmV0dXJuIFVOSVQ7fQotImJ5dGVzIiB7IHl5bHZhbC5pPSA4OyByZXR1cm4gVU5JVDt9Ci0iYnl0ZSIgeyB5eWx2YWwuaSA9IDg7IHJldHVybiBVTklUO30KLQotImludCIgeyB5eWx2YWwucyA9ICJJTlQiOyByZXR1cm4gVFlQRTt9Ci0iYmFycmF5IiB7IHl5bHZhbC5zID0gIkJBUlJBWSI7IHJldHVybiBUWVBFO30KLSJjaGFycyIgeyB5eWx2YWwucyA9ICJDSEFSUyI7IHJldHVybiBUWVBFO30KLSJ2YXJpYWJsZSIgeyB5eWx2YWwuaSA9IDA7IHJldHVybiBOVU1CRVI7fQotImNvdW50ZWQiIHsgeXlsdmFsLmkgPSAtNDsgcmV0dXJuIE5VTUJFUjt9Ci0iYWRkcnNpemUiIHsgeXlsdmFsLmkgPSAtMjsgcmV0dXJuIE5VTUJFUjsgfQotInNlZ3NpemUiIHsgeXlsdmFsLmkgPSAtMTsgcmV0dXJuIE5VTUJFUjsgfQotImNvbmQiIHsgcmV0dXJuIENPTkQ7fQotInJlcGVhdCIgeyByZXR1cm4gUkVQRUFUO30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c3JvZmYuaW5mbyBiL2JpbnV0aWxzL3N5c3JvZmYuaW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmMDAxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNyb2ZmLmluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotKCJjcyIgMHgwCi0gKCgic2l6ZSIpICgxIGJ5dGUpICgic2l6ZSIpKQotCi0gKCgiaGQiKSAoMSBieXRlKSAoImhkIikpCi0gKCgiaHMiKSAoMSBieXRlKSAoImhzIikpCi0gKCgidW4iKSAoMSBieXRlKSAoInVuIikpCi0gKCgidXMiKSAoMSBieXRlKSAoInVzIikpCi0KLSAoKCJzYyIpICgxIGJ5dGUpICgic2MiKSkKLSAoKCJzcyIpICgxIGJ5dGUpICgic3MiKSkKLSAoKCJlciIpICgxIGJ5dGUpICgiZXIiKSkKLSAoKCJlZCIpICgxIGJ5dGUpICgiZWQiKSkKLQotICgoInNoIikgKDEgYnl0ZSkgKCJzaCIpKQotICgoIm9iIikgKDEgYnl0ZSkgKCJvYiIpKQotICgoInJsIikgKDEgYnl0ZSkgKCJybCIpKQotICgoImR1IikgKDEgYnl0ZSkgKCJkdSIpKQotCi0gKCgiZHBzIikgKDEgYnl0ZSkgKCJkcHMiKSkKLSAoKCJkc3kiKSAoMSBieXRlKSAoImRzeSIpKQotICgoImR0eSIpICgxIGJ5dGUpICgiZHR5IikpCi0gKCgiZGxuIikgKDEgYnl0ZSkgKCJkbG4iKSkKLQotICgoImRzbyIpICgxIGJ5dGUpICgiZHNvIikpCi0gKCgiZHVzIikgKDEgYnl0ZSkgKCJkdXMiKSkKLSAoKCJkc3MiKSAoMSBieXRlKSAoImRzcyIpKQotICgoImRidCIpICgxIGJ5dGUpICgiZGJ0IikpCi0KLSAoKCJkcHAiKSAoMSBieXRlKSAoImRwcCIpKQotICgoImRmcCIpICgxIGJ5dGUpICgiZGZwIikpCi0gKCgiZGVuIikgKDEgYnl0ZSkgKCJkZW4iKSkKLSAoKCJkZHMiKSAoMSBieXRlKSAoImRkcyIpKQotCi0gKCgiZGFyIikgKDEgYnl0ZSkgKCJkYXIiKSkKLSAoKCJkcHQiKSAoMSBieXRlKSAoImRwdCIpKQotICgoImR1bCIpICgxIGJ5dGUpICgiZHVsIikpCi0gKCgiZHNlIikgKDEgYnl0ZSkgKCJkc2UiKSkKLQotICgoImRvdCIpICgxIGJ5dGUpICgiZG90IikpKQotCi0KLSgiaGQiIDB4MDQKLSAoKCJtb2R1bGUgdHlwZSIpICg0IGJpdHMpICgibXQiKQotICAoKCJNVFlQRV9BQlNfTE0iIAkiMCIpCi0gICAoIk1UWVBFX1JFTF9MTSIgCSIxIikKLSAgICgiTVRZUEVfT01TX09SX0xNUyIgCSIyIikKLSAgICgiTVRZUEVfVU5TUEVDIiAJIjB4ZiIpKSkKLSAoKCJzcGFyZSIpKDQgYml0cykgKCJzcGFyZTEiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikoIGNoYXJzIDEyIGJ5dGVzKSggImNkIikpCi0gKCgibnVtYmVyIG9mIHVuaXRzIikgKDIgYnl0ZXMpICgibnUiKSkKLSAoKCJjb2RlIikgKDEgYnl0ZSkgKCJjb2RlIikpCi0gKCgidmVyc2lvbiIpIChjaGFycyA0IGJ5dGVzKSAoInZlciIpKQotICgoImFkZHJlc3MgdXBkYXRlIikgKDEgYnl0ZSkgKCJhdSIpKQotICgoInNlZ21lbnQgaWRlbnRpZmllciIpICgxIGJpdCkgKCJzaSIpKQotICgoImFkZHJlc3MgZmllbGQgbGVuZ3RoIikgKDQgYml0cykgKCJhZmwiKSkKLSAoKCJzcGFyZSIpKDMgYml0cykgKCJzcGFyZTIiKSkKLSAoKCJzcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IikgKDEgYnl0ZSkgKCJzcGNzeiIpKQotICgoInNlZ21lbnQgc2l6ZSIpICAJKDEgYnl0ZSkgKCJzZWdzeiIpKQotICgoInNlZ21lbnQgc2hpZnQiKSAJKDEgYnl0ZSkgKCJzZWdzaCIpKQotICgoImVudHJ5IHBvaW50IikgCSgxIGJ5dGUpICgiZXAiKSkKLSAoY29uZCAicHRyLT5lcCIKLSAgICAgICAoY29uZCAicHRyLT5tdCAhPSBNVFlQRV9BQlNfTE0iIAotCSAgICAgKCgidW5pdCBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInVhbiIpKQotCSAgICAgKCgic2VjdGlvbiBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInNhIikpKQotICAgICAgIChjb25kICJzZWdtZW50ZWRfcCIKLQkgICAgICgoInNlZ21lbnQgYWRkcmVzcyIpIChzZWdzaXplIGJ5dGVzKSAoInNhZCIpKSkKLSAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gKCgib3MgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJvcyIpKQotICgoInN5cyBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInN5cyIpKQotICgoIm1vZHVsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1uIikpCi0gKCgiY3B1IikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImNwdSIpKSkKLQotCi0oImhzIiAweDA1Ci0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCi0oInVuIiAweDA2Ci0gKCgiZm9ybWF0IikgKDIgYml0cykgKCJmb3JtYXQiKQotICAoKCJGT1JNQVRfTE0iICIwIikKLSAgICgiRk9STUFUX09NIiAiMSIpCi0gICAoIkZPUk1BVF9PTVNfT1JfTE1TIiAiMiIpKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCi0gKCgibnVtYmVyIG9mIHNlY3Rpb25zIikgKDIgYnl0ZXMpICgibnNlY3Rpb25zIikpCi0gKCgibnVtYmVyIG9mIGV4dGVybmFsIHJlZnMiKSAoMiBieXRlcykgKCJuZXh0cmVmcyIpKQotICgoIm51bWJlciBvZiBleHRlcm5hbCBkZWZzIikgKDIgYnl0ZXMpICgibmV4dGRlZnMiKSkKLSAoKCJ1bml0IG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpCi0gKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgidGNkIikpCi0gKCgibGlua2VyIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJsaW5rZXIiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikgKGNoYXJzIDEyIGJ5dGVzKSAoImxjZCIpKSkKLQotCi0oInVzIiAweDA3Ci0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKQotCi0KLSgic2MiIDB4MDgKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoKCJzZWdtZW50IGFkZHJlc3MiKSAoc2Vnc2l6ZSBieXRlcykgKCJzZWdhZGQiKSkKLSAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKLSAoKCJsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgibGVuZ3RoIikpCi0gKCgiYWxpZ25tZW50IikgKGFkZHJzaXplIGJ5dGVzKSAoImFsaWduIikpCi0gKCgiY29udGVudHMiKSAoNCBiaXRzKSAoImNvbnRlbnRzIikKLSAgKCgiQ09OVEVOVFNfQ09ERSIgIjAiKQotICAgKCJDT05URU5UU19EQVRBIiAiMSIpCi0gICAoIkNPTlRFTlRTX1NUQUNLIiAiMiIpCi0gICAoIkNPTlRFTlRTX0RVTU1ZIiAiMyIpCi0gICAoIkNPTlRFTlRTX1NQRUNJQUwiICI0IikKLSAgICgiQ09OVEVOVFNfTk9OU1BFQyIgIjB4ZiIpKSkKLSAoKCJjb25jYXQiKSAoNCBiaXRzKSAoImNvbmNhdCIpCi0gICgoIkNPTkNBVF9TSU1QTEUiICIwIikKLSAgICgiQ09OQ0FUX1NIQVJFREMiICIxIikKLSAgICgiQ09OQ0FUX0RVTU1ZIiAiMiIpCi0gICAoIkNPTkNBVF9HUk9VUCIgIjMiKQotICAgKCJDT05DQVRfU0hBUkVEIiAiNCIpCi0gICAoIkNPTkNBVF9QUklWQVRFIiAiNSIpCi0gICAoIkNPTkNBVF9VTlNQRUMiICIweGYiKSkpCi0gKCgicmVhZCIpICgyIGJpdHMpICgicmVhZCIpKQotICgoIndyaXRlIikgKDIgYml0cykgKCJ3cml0ZSIpKQotICgoImV4ZWMiKSAoMiBiaXRzKSAoImV4ZWMiKSkKLSAoKCJpbml0aWFsaXplZCIpICgyIGJpdHMpICgiaW5pdCIpKQotICgoIm1vZGUiKSAoMiBiaXRzKSAoIm1vZGUiKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCi0gKCgibmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoIm5hbWUiKSkpCi0KLQotKCJzcyIgMHgwOQotICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLQkKLSgiZXIiIDB4MGMKLSAoKCJzeW1ib2wgdHlwZSIpICgyIGJpdHMpICgidHlwZSIpCi0gICgoIkVSX0VOVFJZIiAiMCIpCi0gICAoIkVSX0RBVEEiICIxIikKLSAgICgiRVJfTk9UREVGIiAiMiIpCi0gICAoIkVSX05PVFNQRUMiICIzIikpKQotICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZSIpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibmFtZSIpKSkKLQkKLQotKCJlZCIgMHgxNAotICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpCi0gKCgic3ltYm9sIHR5cGUiKSAoMyBiaXRzKSAoInR5cGUiKQotICAoKCJFRF9UWVBFX0VOVFJZIiAiMCIpCi0gICAoIkVEX1RZUEVfREFUQSIgIjEiKQotICAgKCJFRF9UWVBFX0NPTlNUIiAiMiIpCi0gICAoIkVEX1RZUEVfTk9UU1BFQyIgIjciKSkpCi0gKCgic3BhcmUiKSAoNSBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgInB0ci0+dHlwZT09RURfVFlQRV9FTlRSWSB8fCBwdHItPnR5cGU9PUVEX1RZUEVfREFUQSIKLSAgICAgICAoKCJzeW1ib2wgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpKQotIChjb25kICJwdHItPnR5cGU9PUVEX1RZUEVfQ09OU1QiCi0gICAgICAgKCgiY29uc3RhbnQgdmFsdWUiKSAoYWRkcnNpemUgYnl0ZXMpICgiY29uc3RhbnQiKSkpCi0gKCgic3ltYm9sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpKQotCi0KLSgic2giIDB4MWEKLSAoKCJ1bml0IGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQotICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpKQotCi0KLSgib2IiIDB4MWMKLSAoKCJzdGFydGluZyBhZGRyZXNzIGZsYWciKSAoMSBiaXQpICgic2FmIikpCi0gKCgiY29tcHJlc3Npb24gZmxhZyIpICgxIGJpdCkgKCJjcGYiKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAicHRyLT5zYWYiCi0gICAgICAgKCAoInN0YXJ0aW5nIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKSkKLSAoY29uZCAicHRyLT5jcGYiCi0gICAgICAgKCgiY29tcCByZXBzIikgKGFkZHJzaXplIGJ5dGVzKSAoImNvbXByZXBzIikpKQotICgoImRhdGEiKSAoYmFycmF5IGNvdW50ZWQgYnl0ZSkgKCJkYXRhIikpKQotCQotCi0oInJsIiAweDIwCi0gKCgiYm91bmRhcnkgb2YgcmVsb2NhdGVhYmxlIGFyZWEiKSAoNCBiaXRzKSAoImJvdW5kYXJ5IikpCi0gKCgiYWRkcmVzcyBwb2xhcml0eSIpICgxIGJpdCkgKCJhcG9sIikpCi0gKCgic2VnbWVudCBudW1iZXIiKSAoMSBiaXQpICgic2VnbWVudCIpKQotICgoInNpZ24gb2YgcmVsb2NhdGlvbiIpICgxIGJpdCkgKCJzaWduIikpCi0gKCgiY2hlY2sgcmFuZ2UiKSAoMSBiaXQpICgiY2hlY2siKSkKLSAoKCJyZWxvYyBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKLQotICgoImJpdCBsb2MiKSAoMSBieXRlKSAoImJpdGxvYyIpKQotICgoImZpZWxkIGxlbmd0aCIpICgxIGJ5dGUpICgiZmxlbiIpKQotICgoImJjb3VudCIpICgxIGJ5dGUpICgiYmNvdW50IikpCi0gKCgib3BlcmF0b3IiKSAoMSBieXRlKSAoIm9wIikKLSAgKCgiT1BfUkVMT0NfQUREUiIgIjEiKQotICAgKCJPUF9TRUNfUkVGIiAiMCIpCi0gICAoIk9QX0VYVF9SRUYiICIyIikpKQotIChjb25kICJwdHItPm9wID09IE9QX0VYVF9SRUYiCi0gICAgICAgKCgic3ltYm9sIG51bWJlciIpICgyIGJ5dGVzKSAoInN5bW4iKSkJKQotCQotIChjb25kICJwdHItPm9wID09IE9QX1NFQ19SRUYiCi0gICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzZWNuIikpCi0gICAgICAgKCgiY29uc3Qgb3Bjb2RlIikgKDEgYnl0ZSkgKCJjb3Bjb2RlX2lzXzMiKSkKLSAgICAgICAoKCJhZGRlbmQgbGVuZ3RoIikgKDEgYnl0ZSkgKCJhbGVuZ3RoX2lzXzQiKSkKLSAgICAgICAoKCJhZGRlbmQiKSAoNCBieXRlKSAoImFkZGVuZCIpKQotICAgICAgICgoInBsdXMgb3Bjb2RlIikgKDEgYnl0ZSkgKCJhb3Bjb2RlX2lzXzB4MjAiKSkpCi0KLSAoY29uZCAicHRyLT5vcCA9PSBPUF9SRUxPQ19BRERSIgotICAgICAgICgoImR1bm5vIikgKDIgYnl0ZXMpICgiZHVubm8iKSkpCi0KLSAoKCJlbmQiKSAgKDEgYnl0ZSkgKCJlbmQiKSkpCi0JCi0KLSgiZHUiIDB4MzAKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQotICgoIm9wdGltaXplZCIpICgxIGJpdCkgKCJvcHRpbWl6ZWQiKSkKLSAoKCJzdGFja2ZybXQiKSAoMiBiaXRzKSAoInN0YWNrZnJtdCIpKQotICgoInNwYXJlIikgKDMgYml0cykgKCJzcGFyZSIpKQotICgoInVuaXQgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQotICgoInNlY3Rpb25zIikgKDIgYnl0ZXMpICgic2VjdGlvbnMiKSkKLSAocmVwZWF0ICJwdHItPnNlY3Rpb25zIgotCSAoKCJzZWN0aW9uIGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgic2FuIikpCi0JICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKQotCSAoKCJzZWN0aW9uIGxlbmd0aCIpIChhZGRyc2l6ZSBieXRlcykgKCJsZW5ndGgiKSkpCi0gKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgiZGF0ZSIpKSkKLQotCi0oImRzeSIgMHgzNAotICgoInN5bWJvbCB0eXBlIikgKDcgYml0cykgKCJ0eXBlIikKLSAgKCgiU1RZUEVfVkFSIiAiMCIpCi0gICAoIlNUWVBFX0xBQiIgIjEiKQotICAgKCJTVFlQRV9QUk9DIiAiMiIpCi0gICAoIlNUWVBFX0ZVTkMiICIzIikKLSAgICgiU1RZUEVfVFlQRSIgIjQiKQotICAgKCJTVFlQRV9DT05TVCIgIjUiKQotICAgKCJTVFlQRV9FTlRSWSIgIjYiKQotICAgKCJTVFlQRV9NRU1CRVIiICI3IikKLSAgICgiU1RZUEVfRU5VTSIgIjgiKQotICAgKCJTVFlQRV9UQUciICI5IikKLSAgICgiU1RZUEVfUEFDS0FHRSIgIjEwIikKLSAgICgiU1RZUEVfR0VORVJJQyIgIjExIikKLSAgICgiU1RZUEVfVEFTSyIgIjEyIikKLSAgICgiU1RZUEVfRVhDRVBUSU9OIiAiMTMiKQotICAgKCJTVFlQRV9QQVJBTUVURVIiICIxNCIpCi0gICAoIlNUWVBFX0VRVUFURSIgIjE1IikKLSAgICgiU1RZUEVfVU5TUEVDIiAiMHg3ZiIpKSkKLSAoKCJhc3NpZ25tZW50IGluZm8iKSAoMSBiaXQpICgiYXNzaWduIikpCi0gKCgic3ltYm9sIGlkIikgKDIgYnl0ZXMpICgic251bWJlciIpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInNuYW1lIikpCi0gKCgibmVzdGluZyBsZXZlbCIpICgyIGJ5dGVzKSAoIm5lc3RpbmciKSkKLSAoY29uZCAicHRyLT5hc3NpZ24iCi0gICAgICAgKCgiYXNzaWdubWVudCB0eXBlIikgKDEgYnl0ZSkgICgiYWluZm8iKQotCSgoIkFJTkZPX1JFRyIgIjEiKQotCSAoIkFJTkZPX1NUQVRJQ19FWFRfREVGIiAiMiIpCi0JICgiQUlORk9fU1RBVElDX0VYVF9SRUYiICIzIikKLQkgKCJBSU5GT19TVEFUSUNfSU5UIiAiNCIpCi0JICgiQUlORk9fU1RBVElDX0NPTSIgIjUiKQotCSAoIkFJTkZPX0FVVE8iICI2IikKLQkgKCJBSU5GT19DT05TVCIgIjciKQotCSAoIkFJTkZPX1VOU1BFQyIgIjB4ZmYiKSkpCi0gICAgICAgKCgiZGF0YSBsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgiZGxlbmd0aCIpKQotICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19FWFRfREVGCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19JTlQKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0NPTSIKLQkgICAgICgoInNlY3Rpb24gbnVtYmVyIikgICgyIGJ5dGVzKSAoInNlY3Rpb24iKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0lOVAotICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfQ09NCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX0FVVE8iCi0JICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fUkVHIgotCSAgICAgKCgicmVnaXN0ZXIgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJyZWciKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLQkgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfRVhUX1JFRiIKLQkgICAgICgoImV4dGVybmFsIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiZW5hbWUiKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fQ09OU1QiCi0JICAgICAoKCJjb25zdGFudCIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJjb25zdGFudCIpKSkpCi0gKGNvbmQgInB0ci0+dHlwZSA9PSBTVFlQRV9NRU1CRVIiCi0gICAgICAgKCgiYXNzaWdubWVudCB1bml0IikgKDEgYml0KSAoImJpdHVuaXQiKSkKLSAgICAgICAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUyIikpCi0gICAgICAgKCgiZmllbGQgbGVuZ3RoIikgKGFkZHJzaXplIGJ5dGVzKSAoImZpZWxkX2xlbiIpKQotICAgICAgICgoImZpZWxkIG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9vZmYiKSkKLSAgICAgICAoY29uZCAicHRyLT5iaXR1bml0IgotCSAgICAgKCgiYml0IG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9iaXRvZmYiKSkpKQotIChjb25kICJwdHItPnR5cGU9PSBTVFlQRV9FTlVNIgotICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgiZXZhbGxlbiIpKQotICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgiZXZhbHVlIikpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfQ09OU1QiCi0gICAgICAgKCgidmFsdWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiY3ZhbHVlIikpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfRVFVQVRFIgotICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgicXZhbGxlbiIpKQotICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgicXZhbHVlIikpCi0gICAgICAgKCgiYmFzaWMgdHlwZSIpICgxIGJ5dGUpICgiYnR5cGUiKSkKLSAgICAgICAoKCJzaXplIGluZm9ybWF0aW9uIikgKGFkZHJzaXplIGJ5dGVzKSAoInNpemVpbmZvIikpCi0gICAgICAgKCgic2lnbiIpICgyIGJpdHMpICgic2lnbiIpKQotICAgICAgICgoImZsb2F0aW5nIHBvaW50IHR5cGUiKSAoNiBiaXRzKSAoImZsdF90eXBlIikpKQotICgoInNvdXJjZSBmaWxlIG51bWJlciIpICgyIGJ5dGVzKSAoInNmbiIpKQotICgoInNvdXJjZSBsaW5lIG51bWJlciIpICgyIGJ5dGVzKSAoInNsbiIpKQotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfVEFHIgotICAgICAgICgoIm1hZ2ljIikgKDEgYnl0ZSkgKCJtYWdpYyIpKSkpCi0KLSAKLQotKCJkdWwiIDB4NTIKLSAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQotICgoIm1heCBzcGFyZSIpICg3IGJpdHMpICgibWF4c3BhcmUiKSkKLSAoY29uZCAicHRyLT5tYXhfdmFyaWFibGUgPT0gMCIKLSAgICAgICAoKCJtYXhpbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1heCIpKQotICAgICAgICgoIm1heCBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1heG1vZGUiKSkpCi0KLSAoKCJtaW4gZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1pbl92YXJpYWJsZSIpKQotICgoIm1pbiBzcGFyZSIpICg3IGJpdHMpICgibWluc3BhcmUiKSkKLSAoY29uZCAicHRyLT5taW5fdmFyaWFibGUgPT0gMCIKLSAgICAgICAoKCJtaW5pbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1pbiIpKQotICAgICAgICgoIm1pbiBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1pbm1vZGUiKSkpKQotCi0KLSgiZHR5IiAweDM2Ci0gKCgiZW5kIGZsYWciKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLQotKCJkYnQiIDB4NDQKLSAoKCJiYXNpYyB0eXBlIikgKDEgYnl0ZSkgKCJidHlwZSIpCi0gICgoIkJUWVBFX1ZPSUQiICIwIikKLSAgICgiQlRZUEVfVU5ERUYiICIxIikKLSAgICgiQlRZUEVfQ0hBUiIgIjIiKQotICAgKCJCVFlQRV9JTlQiICIzIikKLSAgICgiQlRZUEVfRkxPQVQiICI0IikKLSAgICgiQlRZUEVfQklUIiAiNSIpCi0gICAoIkJUWVBFX1NUUklORyIgIjYiKQotICAgKCJCVFlQRV9ERUNJTUFMIiAiNyIpCi0gICAoIkJUWVBFX0VOVU0iICI4IikKLSAgICgiQlRZUEVfU1RSVUNUIiAiOSIpCi0gICAoIkJUWVBFX1RZUEUiICIxMCIpCi0gICAoIkJUWVBFX1RBRyIgIjExIikKLSAgICgiQlRZUEVfVU5TUEVDIiAiMHhmZiIpKSkKLSAoKCJzaXplIGluZm8iKSAoYWRkcnNpemUgYnl0ZXMpICgiYml0c2l6ZSIpKQotICgoInNpZ24iKSAoMiBiaXRzKSAoInNpZ24iKQotICAoKCJTSUdOX1NJR05FRCIgIjAiKQotICAgKCJTSUdOX1VOU0lHTkVEIiAiMSIpCi0gICAoIlNJR05fVU5TUEVDIiAiMyIpKSkKLSAoKCJmbG9hdGluZyBwb2ludCB0eXBlIikgKDYgYml0cykgKCJmcHR5cGUiKQotICAoKCJGUFRZUEVfU0lOR0xFIiAiMCIpCi0gICAoIkZQVFlQRV9ET1VCTEUiICIxIikKLSAgICgiRlBUWVBFX0VYVEVOREVEIiAiMiIpCi0gICAoIkZQVFlQRV9OT1RTUEVDIiAiMHgzZiIpKSkKLSAoY29uZCAicHRyLT5idHlwZT09QlRZUEVfVEFHIHx8IHB0ci0+YnR5cGUgPT0gQlRZUEVfVFlQRSIKLSAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJzaWQiKSkpCi0gKCgibmVnb3RpYXRpb24iKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLSgiZGFyIiAweDRlCi0gKCgiZWxlbWVudCBsZW5ndGgiICkgKGFkZHJzaXplIGJ5dGVzKSAoImxlbmd0aCIpKQotICgoImRpbXMiKSAoMSBieXRlKSAoImRpbXMiKSkKLSAocmVwZWF0ICJwdHItPmRpbXMiCi0JICgoInZhcmlhYmxlIGZsYWciKSAoMSBiaXQpICgidmFyaWFibGUiKQotCSAgKCgiVkFSSUFCTEVfRklYRUQiICIwIikKLQkgICAoIlZBUklBQkxFX1ZBUklBQkxFIiAiMSIpKSkKLQotCSAoKCJzdWJzY3JpcHQgdHlwZSIpICgxIGJpdCkgKCJzdWJ0eXBlIikKLQkgICgoIlNVQl9JTlRFR0VSIiAiMCIpCi0JICAgKCJTVUJfVFlQRSIgICAgIjEiKSkpCi0KLQkgKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlIikpCi0KLQkgKGNvbmQgInB0ci0+c3VidHlwZVtuXSA9PSBTVUJfVFlQRSIKLQkgICAgICAgKCgic3ViIHN5bWJvbCBpZCIpICgyIGJ5dGVzKSAoInNpZCIpKSkKLQotCSAoY29uZCAicHRyLT5zdWJ0eXBlW25dID09IFNVQl9JTlRFR0VSIgotCSAgICAgICAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQotCSAgICAgICAoKCJtYXggc3BhcmUiKSAoNyBiaXRzKSAoIm1heHNwYXJlIikpCi0JICAgICAgIDs7IEZJWE1FOiBuZXh0IGZpZWxkIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBtYXhfdmFyaWFibGUsCi0JICAgICAgICgoIm1heGltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWF4IikpCi0KLQkgICAgICAgKCgibWluIGRlY2xhcmF0aW9uIHR5cGUgZmxhZyIpICgxIGJpdCkgKCJtaW5fdmFyaWFibGUiKSkKLQkgICAgICAgKCgibWluIHNwYXJlIikgKDcgYml0cykgKCJtaW5zcGFyZSIpKQotCSAgICAgICA7OyBGSVhNRTogbmV4dCBmaWVsZCBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gbWluX3ZhcmlhYmxlCi0JICAgICAgICgoIm1pbmltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWluIikpKSkKLSAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCSAgICAgICAKLSgiZHNvIiAweDNhCi0gKCgiZnVuY3Rpb24gbmFtZSIpICgyIGJ5dGVzKSAoInNpZCIpKQotICgoInNwIHVwZGF0ZSBjb3VudCIpICg0IGJ5dGVzKSAoInNwdXBkYXRlcyIpKQotIChyZXBlYXQgInB0ci0+c3B1cGRhdGVzIgotCSAoKCJ1cGRhdGUgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpCi0JICgoIm9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJvZmZzZXQiKSkpKQotCi0oImRsbiIgMHgzOAotICgoIm51bWJlciBvZiBsaW5lcyIpICgyIGJ5dGVzKSAoIm5sbiIpKQotIChyZXBlYXQgInB0ci0+bmxuIgotCSAoKCJzb3VyY2UgZmlsZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZm4iKSkKLQkgKCgic291cmNlIGxpbmUgbnVtYmVyIikgKDIgYnl0ZXMpICgic2xuIikpCi0JICgoInNlY3Rpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgic2VjdGlvbiIpKQotCSAoKCJmcm9tIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiZnJvbV9hZGRyZXNzIikpCi0JICgoInRvIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgidG9fYWRkcmVzcyIpKQotCSAoKCJjYWxsIGNvdW50IikgKDIgYnl0ZXMpICgiY2MiKSkKLQkgKQotICgoIm5lZyIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLSAKLSgiZHBwIiAweDQ2Ci0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgicGFyYW1zIikgKDEgYnl0ZSkgKCJwYXJhbXMiKSkKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZW4iIDB4NGEKLSAoKCJzdGFydC9lbmQiKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZnAiIDB4NDgKLSAoKCJzdGFydC9lbmQgZmxhZyIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm51bWJlciBvZiBwYXJhbWV0ZXJzIikgKDEgYnl0ZSkgKCJucGFyYW1zIikpCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZGRzIiAweDRjCi0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZHB0IiAweDUwCi0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotICgoImR1bm5vIikgKDEgYnl0ZSkgKCJkdW5ubyIpKSkKLQotKCJkc2UiIDB4NTQKLSAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpCi0gKCgiZHVubm8iKSAoMSBieXRlKSAoImR1bm5vIikpKQotCi0oImRvdCIgMHg1NgotICgoInVua25vd24iKSAoMSBieXRlKSAoInVua25vd24iKSkpCi07IEZJWE1FOiB1bmtub3duIGZpZWxkIHNob3VsZCBiZSByZXBlYXRlZCBzeW1ib2wgbnVtYmVyPwotCi0KLSgiZHNzIiAweDQyCi0gKCgidHlwZSIpICgxIGJ5dGUpICgidHlwZSIpKQotICgoImV4dGVybmFsL2ludGVybmFsIikgKDEgYml0KSAoImludGVybmFsIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmludGVybmFsIgotICAgICAgICggICgicGFja2FnZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicGFja2FnZSIpKSkKLSAoY29uZCAicHRyLT5pbnRlcm5hbCIKLSAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJpZCIpKSkKLSAoKCJyZWNvcmQgdHlwZSIpICgyIGJ5dGVzKSAoInJlY29yZCIpKQotICgoInJ1bGVzIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicnVsZXMiKSkKLSAoKCJudW1iZXIgb2Ygc3ltYm9scyIpICgyIGJ5dGVzKSAoIm5zeW1ib2xzIikpCi0gKCgidW5rbm93biIgKSAoMiBieXRlcykgKCJmaXhtZSIpKSkKLSAgICAgCi0oInBzcyIgMHg0MAotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoImVmbiIpKQotICgoIm51bWJlciBvZiBzb3VyY2UgZmlsZXMiKSAoMiBieXRlcykgKCJucyIpKQotIChyZXBlYXQgInB0ci0+bnMiCi0JICgoImRpcmVjdG9yeSByZWZlcmVuY2UgYml0IikgKDEgYml0KSAoImRyYiIpKQotCSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLQkgKCgiY29tcGxldGVkIGZpbGUgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoImZuYW1lIikpCi0JIChjb25kICJwdHItPmRyYltuXSIgCi0JICAgICAgICgoImRpcmVjdG9yeSBhcHBlcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgiZGFuIikpKSkKLSAKLSAoKCJudW1iZXIgb2YgZGlyZWN0b3JpZXMiKSAoMiBieXRlcykgKCJuZGlyIikpCi0gKHJlcGVhdCAicHRyLT5uZGlyIgotCSAoKCJkaXJlY3RvcnkgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJkbmFtZSIpKSkpCi0KLQotOyBGSVhNRTogdGhlIHRyIGJsb2NrIGhhcyBubyBjb250ZW50cy4gc3lzaW5mbywgZXRjLiBhcmVuJ3QgcHJlcGFyZWQgCi07IHRvIGRlYWwgd2l0aCB0aGF0LgotOyAoInRyIiAweDdmKQotCi0KLSgiZHVzIiAweDQwCi0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgiZWZuIikpCi0gKCgibnVtYmVyIG9mIHNvdXJjZSBmaWxlcyIpICgyIGJ5dGVzKSAoIm5zIikpCi0gKHJlcGVhdCAicHRyLT5ucyIKLQkgKCgiZGlyZWN0b3J5IHJlZmVyZW5jZSBiaXQiKSAoMSBiaXQpICgiZHJiIikpCi0JICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotCSAoKCJjb21wbGV0ZWQgZmlsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgiZm5hbWUiKSkKLQkgKGNvbmQgInB0ci0+ZHJiW25dIiAKLQkgICAgICAgKCgiZGlyZWN0b3J5IGFwcGVyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJkYW4iKSkpKQotICgoIm51bWJlciBvZiBkaXJlY3RvcmllcyIpICgyIGJ5dGVzKSAoIm5kaXIiKSkKLSAocmVwZWF0ICJwdHItPm5kaXIiCi0JICgoImRpcmVjdG9yeSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImRuYW1lIikpKSkKLQotCi0oImRwcyIgMHgzMgotICgoInN0YXJ0L2VuZCBmbGFnIikgKDEgYml0KSAoImVuZCIpKQotICgoImJsb2NrIHR5cGUiKSAoNyBiaXRzKSAoInR5cGUiKQotICAoKCJCTE9DS19UWVBFX0NPTVBVTklUIiAiMCIpCi0gICAoIkJMT0NLX1RZUEVfUFJPQ0VEVVJFIiAiMiIpCi0gICAoIkJMT0NLX1RZUEVfRlVOQ1RJT04iICIzIikKLSAgICgiQkxPQ0tfVFlQRV9CTE9DSyIgIjQiKQotICAgKCJCTE9DS19UWVBFX0JBU0lDIiAiOSIpKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm9wdGltaXphdGlvbiIpICgxIGJ5dGUpICgib3B0IikpCi0gICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzYW4iKSkKLSAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkKLSAgICAgICAoKCJibG9jayBzaXplIikgKGFkZHJzaXplIGJ5dGVzKSAoImJsb2NrX3NpemUiKSkKLSAgICAgICAoKCJuZXN0aW5nIikgKDEgYnl0ZSkgKCJuZXN0aW5nIikpCi0gICAgICAgKGNvbmQgInB0ci0+dHlwZSA9PSBCTE9DS19UWVBFX1BST0NFRFVSRSAKLQkgICAgfHwgcHRyLT50eXBlID09IEJMT0NLX1RZUEVfRlVOQ1RJT04iCi0JICAgICAoKCJyZXR1cm4gYWRkcmVzcyIpICgxIGJpdCkgKCJyZXRhZGRyIikpCi0JICAgICAoKCJpbnRlcnJ1cHQgZnVuY3Rpb24gZmxhZyIpICgxIGJpdCkgKCJpbnRyZmxhZyIpKQotCSAgICAgKCgic3RhY2sgdXBkYXRlIGZsYWciKSAoMSBiaXQpICgic3RhY2tmbGFnIikpCi0JICAgICAoKCJpbnRyYSBwYWdlIEpNUCIpICgxIGJpdCkgKCJpbnRycGFnZWptcCIpKQotCSAgICAgKCgic3BhcmUiKSAoNCBiaXRzKSAoInNwYXJlIikpKQotICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQotCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvYmludXRpbHMvdGVzdHN1aXRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhM2Q4Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjM0ICswLDAgQEAKLTE5OTktMTEtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRXhwZWN0IHNpbXBsZSBvYmpjb3B5IHRlc3QgZm9yIGZhaWwKLQlmb3IgQ09GRiBiYXNlZCBBUk0gYW5kIFRodW1iIHBvcnRzLgotCi1UdWUgU2VwIDE0IDAwOjI4OjE3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHA6IERvIG5vdCBydW4gZm9yIFBBNjQuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBBZGQgcGogdG8gY3B1c19leHBlY3RlZC4KLQotU2F0IEF1ZyAyOCAwMDoyNDoyNyAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL2hwcGEvZnJlZy5zOiAgTmV3IGZpbGUuCi0JKiBiaW51dGlscy1hbGwvaHBwYS9vYmpkdW1wLmV4cDogIEFkZCBmcmVnLnMgdGVzdC4KLQotMTk5OS0wOC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBzaW1wbGUgY29weSB0ZXN0Ci0JZm9yIGkqODYtKi1tc2RvcyouCi0KLTE5OTktMDctMjEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgotCi0xOTk5LTA2LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IEFkZCBmcjMwIGFuZCBNQ29yZSB0byBleHBlY3RlZCBjcHVzCi0JbGlzdC4gCi0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnI6IERvIG5vdCBhc3N1bWUgYSBmaXhlZCBudW1iZXIgb2Ygc3BhY2VzCi0JaW4gdGhlIG91dHB1dC4KLQotMTk5OS0wNi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYud2k6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3Qgb3V0cHV0LgotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuaDogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBvdXRwdXQuCi0KLVdlZCBKdW4gIDkgMTE6NTk6MjIgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IFRpZ2h0ZW4gcmVnZXhwIHRvIG1hdGNoIGBvYmpkdW1wIC1pJwotCW91dHB1dCB0byBhdm9pZCBtYXNzaXZlIGV4cG9uZW50aWFsIGJlaGF2aW91ci4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmg6IFVwZGF0ZSBmb3IgY2hhbmdlcyBvZiAxOTk5LTA0LTA4LgotCi0xOTk5LTAzLTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi53aTogUmVtb3ZlIEZSMzAgc3BlY2lmaWMgY29tcG9ubnRzLgotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuczogUmVtb3ZlIFJFTEEgc3BlY2lmaWMgY29tcG9uZW50cy4KLQotMTk5OS0wMi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuczogRG8gbm90IGFzc3VtZSBzZWN0aW9uIGFsaWdubWVudCBpcyA0LgotCSogYmludXRpbHMtYWxsL3JlYWRlbGYucjogRG8gbm90IGFzc3VtZSByZWxhJ3MgYXJlIGJlaW5nIHVzZWQuIAotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwOiBkaXNhYmxlIHRlc3RzIGZvciBub24gRUxGIGJhc2VkCi0JdGFyZ2V0cy4KLQotMTk5OS0wMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYud2k6IEFtZW5kIHRvIG1hdGNoIG5ldyByZWFkZWxmIG91dHB1dC4KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnI6IERvIG5vdCBhc3N1bWUgdGhhdCBSRUxBcyB3aWxsIGJlIHVzZWQuCi0KLTE5OTktMDEtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogQWRkIGRlZmluaXRpb25zIG9mIFJFQURFTEYgYW5kIFJFQURFTEZGTEFHUy4KLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwOiBOZXcgZmlsZTogUmVhZGVsZiB0ZXN0cwotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuaDogTmV3IGZpbGU6IEV4cGVjdGVkIHJlc3VsdHMgZm9yICdyZWFkZWxmIC1oJwotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuczogTmV3IGZpbGU6IEV4cGVjdGVkIHJlc3VsdHMgZm9yICdyZWFkZWxmIC1TJwotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuc3M6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtcycKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnI6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtcicKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLndpOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLXdpJwotCi1XZWQgRGVjICA5IDE5OjExOjM5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwIChjb3B5X2V4ZWN1dGFibGUpOiBFeHBlY3QgY29tcGFyaXNvbgotCWZhaWx1cmUgZm9yIG1pcHMqLSotZWxmLgotCi1GcmkgT2N0IDE2IDIyOjU3OjEyIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBmaXggIm5vIHN5bWJvbHMiIG1lc3NhZ2UuCi0KLVR1ZSBKdWwgMjggMTU6MTQ6MDQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEtlZXAgIm1haW4iIGFuZCAiX21haW4iIGZvciBzdHJpcCB3aXRoCi0Jc2F2aW5nIHN5bWJvbCB0ZXN0cy4gIExvb2sgZm9yIGVpdGhlciAibWFpbiIgb3IgIl9tYWluIiBpbiB0aGUgb3V0cHV0Ci0JZmlsZS4gIEZpeCB0ZXN0IGZvciAibm8gc3ltYm9scyIgaW4gdGhlIG91dHB1dCBmaWxlLgotCi0xOTk4LTA3LTIyICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBQb2xpc2ggb3V0cHV0IGFib3V0IGZhaWwgZm9yIG9iamNvcHkKLQkoc2ltcGxlIGNvcHkpLCBzdHJpcCB3aXRoL3dpdGhvdXQgc2F2aW5nIGEgc3ltYm9sIGZvciBvYmplY3QgZmlsZQotCWFuZCBleGVjdXRhYmxlLgotCi1XZWQgSnVsICAxIDE2OjI3OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQVJNIHNpbXBsZSBvYmpjb3B5IG5vdyBwYXNzZXMuCi0KLVdlZCBKdW4gMjQgMDk6MjA6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBMb29rIGZvciAnLmRhdGEnIHJhdGhlciB0aGFuICdkYXRhJwotCXdoZW4gcGFyc2luZyBvdXRwdXQgb2Ygb2JqZHVtcCAtaC4KLQkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogTG9vayBmb3IgJy5kYXRhJyByYXRoZXIgdGhhbiAnZGF0YScgd2hlbgotCXBhcnNpbmcgb3V0cHV0IG9mIHNpemUgLUEuCi0KLTE5OTgtMDctMjAgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmV4cDogVHdvIG5ldyB0ZXN0cyAtIHN0cmlwIG9iamVjdCBmaWxlIHdpdGggc2F2aW5nIGEKLQlzeW1ib2wgYW5kIHN0cmlwIGV4ZWN1dGFibGUgZmlsZSB3aXRoIHNhdmluZyBhIHN5bWJvbC4KLQotRnJpIE1heSAyOSAxNDo1MDoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRG9uJ3QgeGZhaWwgdGhlIHNpbXBsZSBvYmpjb3B5IHRlc3QKLQl3aGVuIGNyb3NzIGNvbXBpbGluZy4KLQotVGh1IE5vdiAgNiAxNDozMjozNyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbGliL3V0aWxzLWxpYi5leHA6IFRlbXBvcmFyeSBkZWZpbml0aW9uIG9mIHRhcmdldF9hc3NlbWJsZSBhbmQKLSAJZGVmYXVsdF90YXJnZXRfYXNzZW1ibGUgc28gdGhhdCB0ZXN0aW5nIGNhbiB3b3JrIHdpdGggb2xkZXIKLSAJZGVqYWdudSB2ZXJzaW9ucy4KLQotV2VkIFNlcCAyNCAxMjowOToxNSAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwKHN0cmlwX2V4ZWN1dGFibGUpOiBNYWtlIGEgbmV3IGNvcHkgb2YKLSAJdGhlIGV4ZWN1dGFibGUgYmVpbmcgdGVzdGVkLgotCi1Nb24gU2VwIDE1IDIxOjI1OjIwIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IENvbXBpbGUgdGhlIGV4ZWN1dGFibGVzIHRvIGJlIHRlc3RlZAotIAlvbiB0aGUgdGFyZ2V0IHdpdGggYSBzdGF0dXMgd3JhcHBlciAoYXMgbmVjZXNzYXJ5KS4KLQotCSogYmludXRpbHMtYWxsL2FyLmV4cDogSWYgdGVzdGluZyBvbiBhIHJlbW90ZSBob3N0LCBkb24ndCBib3RoZXIKLSAJbG9va2luZyBvbiB0aGUgbG9jYWwgaG9zdCBmb3IgdGhlIHByb2dyYW0gYmVpbmcgdGVzdGVkLiBVc2UgdGhlCi0gCWNvcnJlY3QgZmlsZW5hbWVzIG9uIHRoZSByZW1vdGUgaG9zdC4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogRGl0dG8uCi0KLQkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogRGl0dG8uCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRGl0dG8uCi0gCShjcHVzX2V4cGVjdGVkKTogQWRkIHRoZSB0YXJnZXQgQ1BVIHRvIHRoZSByZWdleHAgb2YgQ1BVcyB0byBiZQotIAlleHBlY3RlZCwgaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZS4KLQotVGh1IEF1ZyAyOCAwOTo1NzoyNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHAgKGNwdXNfZXhwZWN0ZWQpOiBBZGQgYXJjLgotCi1UdWUgQXVnICA1IDAwOjAzOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBMb29rIGZvciBubS1uZXcgYW5kIHN0cmlwLW5ldy4KLQotVHVlIEp1biAgMyAxNzoxMjo1NCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW1vdmUgZXhwZWN0X2JlZm9yZSBzdGF0ZW1lbnQuCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRG9uJ3QgdXNlIGdsb2JhbCBleGVjX291dHB1dCB2YXJpYWJsZTsKLSAJdGhlIG91dHB1dCBpcyByZXR1cm5lZCBmcm9tIHJlbW90ZV9sb2FkIGluc3RlYWQuCi0KLU1vbiBNYXkgMTIgMjI6MTQ6MjAgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cChzdHJpcF90ZXN0KTogVGVzdHMgdGhhdAotCWZhaWwgdG8gY29tcGlsZSBhcmUgdW50ZXN0ZWQsIG5vdCB1bnJlc29sdmVkLgotCShjb3B5X3NldHVwKTogRGl0dG8uCi0KLQkqIGxpYi91dGlscy1saWIuZXhwKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBDYWxsCi0JdGFyZ2V0X2Fzc2VtYmxlIGluc3RlYWQgb2YgdGFyZ2V0X2NvbXBpbGUuCi0KLVdlZCBBcHIgMzAgMjA6Mzc6NTEgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIHRvIHN1cHBvcnQgbXVsdGlsaWIgYW5kIHJlbW90ZSBob3N0ZWQgdGVzdGluZywgYWxvbmcgd2l0aAotIAlnZW5lcmFsIGNsZWFudXBzIGFuZCBzaW1wbGlmaWNhdGlvbnMuCi0KLQkqIGxpYi91dGlscy1saWIuZXhwKGJpbnV0aWxfdmVyc2lvbik6IFVzZSByZW1vdGVfZXhlYy4KLQkoZGVmYXVsdF9iaW51dGlsc19ydW4pOiBEaXR0by4KLQkoZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSk6IFJlbW92ZSBmaXJzdCBhcmd1bWVudDsgY2FsbAotIAl0YXJnZXRfY29tcGlsZSB0byBhY3R1YWxseSBkbyB0aGUgYXNzZW1ibHkuCi0JKGRlZmF1bHRfYmludXRpbHNfY29tcGlsZSxkZWZhdWx0X2JpbnV0aWxzX3JlbW92ZSxwcnVuZV93YXJuaW5ncyk6Ci0gCURlbGV0ZS4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW1vdmUgQVMgYW5kIEFTRkxBR1MuCi0JKGJpbnV0aWxzX2NvbXBpbGUsYmludXRpbHNfcmVtb3ZlKTogRGVsZXRlLgotCShiaW51dGlsc19hc3NlbWJsZSk6IFJlbW92ZSBmaXJzdCBhcmd1bWVudC4KLQotCSogYmludXRpbHMtYWxsL2FyLmV4cDogU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdGhlIHRlc3RzIG9uCi0JYSByZW1vdGUgaG9zdCwgYW5kIGRvd25sb2FkL3VwbG9hZCBmaWxlcyBhcyBhcHByb3ByaWF0ZS4KLQlSZXBsYWNlIGNhbGxzIHRvIGJpbnV0aWxzX3JlbW92ZSB3aXRoIHJlbW90ZV9maWxlLiBSZXBsYWNlCi0JY2FsbHMgdG8gYmludXRpbHNfY29tcGlsZSB3aXRoIHRhcmdldF9jb21waWxlLiBSZW1vdmUgaW5pdGlhbAotCWFyZ3VtZW50IHRvIGJpbnV0aWxzX2Fzc2VtYmxlLiBVc2UgcmVtb3RlX2xvYWQgdG8gZXhlY3V0ZQotCXByb2dyYW1zIG9uIHRoZSB0YXJnZXQuCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogIERpdHRvLgotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiAgRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IERpdHRvLgotCi1Nb24gQXByIDE0IDEyOjM2OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL2FyLmV4cCAobG9uZ19maWxlbmFtZXMpOiBDaGVjayBmb3IgYSBmaWxlIHN5c3RlbQotCXdpdGggYSAxNCBjaGFyYWN0ZXIgZmlsZSBuYW1lIGxlbmd0aCBsaW1pdC4KLQotVHVlIEFwciAgMSAwOTo1MjoxNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogSGFuZGxlIGQxMHYuCi0KLUZyaSBGZWIgIDcgMTY6NDU6MzQgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9hci5leHA6IFVzZSBwcnVuZV93YXJuaW5ncyBpbnN0ZWFkIG9mCi0JcHJ1bmVfc3lzdGVtX2NydWQuCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERpdHRvLgotCi1XZWQgSmFuIDI5IDAwOjE2OjQzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBVc2UgLyBiZXR3ZWVuICRzcmNkaXIgYW5kICRzdWJkaXIuCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERpdHRvLgotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvaHBwYS9vYmpkdW1wLmV4cDogRGl0dG8uCi0JCi0KLVdlZCBPY3QgMTYgMjI6NTc6NTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IEFkZCBtbjEwMjAwIGFuZCBtbjEwMzAwIHRvIGV4cGVjdGVkCi0JY3B1cyBsaXN0LgotCi1UdWUgT2N0ICAxIDE1OjA2OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKGJpbnV0aWxfdmVyc2lvbik6IEZpeCBmb3IgY3VycmVudCB2ZXJzaW9uCi0JcHJpbnRpbmcuCi0KLVN1biBBdWcgIDQgMjI6MjU6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEZpeCBlbmQgb2YgbGluZSBtYXRjaGluZyBpbiBzcmVjIHRlc3RzCi0JdG8gd29yayB3aXRoIFRDTCA3LjUuCi0KLVNhdCBKdW4gMjkgMTI6NTE6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IFNpbXBsZSBjb3B5IHRlc3Qgd29ya3MgZm9yIGk5NjAgYi5vdXQKLQl0YXJnZXRzLgotCi1Nb24gSnVuIDI0IDE0OjMzOjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBPbiBPU0YvMSwgdGhlIHNpbXBsZSBjb3B5IHRlc3Qgd2lsbAotCXN1Y2NlZWQgd2l0aCBnYXMsIGFuZCBmYWlsIHdpdGggL2Jpbi9hcywgc28gbWFyayBpdCBhcyBhbiBleHBlY3RlZAotCWZhaWx1cmUgb25seSBpZiBpdCBmYWlscy4KLQotVHVlIE1hciAyNiAxNjo1NTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBhZGp1c3Qtc2VjdGlvbi12bWEKLQl0ZXN0IHRvIGZhaWwgZm9yIGhwcGEqLSotcHJvZWxmKi4KLQotTW9uIE1hciAxMSAwODoyNToxNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogTG9vayBmb3IgIiRDT0RFJCIsIG5vdCBqdXN0ICJDT0RFIi4KLQotV2VkIEphbiAzMSAxMTo1NToxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRXhwZWN0IGFkanVzdC1zZWN0aW9uLXZtYSB0ZXN0cyB0bwotCWZhaWwgZm9yIGhwcGEqLSotcHJvZWxmKiB0YXJnZXRzLgotCi1UaHUgSmFuIDI1IDEzOjUzOjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBVcGRhdGUgZm9yIG9iamR1bXAgLWggZm9ybWF0IGNoYW5nZS4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMTUgMTg6MTQ6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IFVzZSB0aGUgbG1hLCBub3QgdGhlIHZtYSwgd2hlbiB0ZXN0aW5nCi0JYWRkcmVzcyBhZGp1c3RtZW50cy4KLQotRnJpIERlYyAxNSAxNjozMTo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogVXBkYXRlIG9iamR1bXAgLWkgdGVzdCBmb3IgY3VycmVudAotCW9iamR1bXAgb3V0cHV0LgotCi1Nb24gTm92IDI3IDE1OjE1OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBDb3JyZWN0IGZhaWwgY2FsbHMgdG8gYWx3YXlzIHVzZSB0aGUKLQlzYW1lIHN0cmluZyBhcyB0aGUgcGFzcyBjYWxsLgotCi1XZWQgTm92IDIyIDEzOjE4OjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKHBydW5lX3N5c3RlbV9jcnVkKTogRGlzY2FyZCAtZyAtTyB3YXJuaW5ncwotCWZyb20gbmF0aXZlIGNvbXBpbGVycyBvbiBPU0YvMSBhbmQgU3VuT1MuCi0KLUZyaSBOb3YgMTcgMTA6MzY6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19jb21waWxlcjogQ2hhbmdlIGVycm9yCi0JbWVzc2FnZSB0byBzYXkgY29tcGlsYXRpb24gcmF0aGVyIHRoYW4gYXNzZW1ibHkuCi0KLVdlZCBOb3YgMTUgMTg6MzQ6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogU2ltcGxlIGNvcHkgdGVzdCBkb2VzIGFwcGVhciB0byB3b3JrCi0Jb24gaSo4Ni1zdnI0LgotCi1XZWQgTm92IDE1IDEyOjE5OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBJZiBhc3NlbWJseSBmYWlscywgY2FsbCB1bnJlc29sdmVkLgotCVRlc3QgcnVubmluZyBvYmpjb3B5IGFuZCBzdHJpcCBvbiBhIGZpbmFsIGV4ZWN1dGFibGUuCi0JKiBiaW51dGlscy1hbGwvdGVzdHByb2cuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvZGVmYXVsdC5leHAgKFNUUklQLCBTVFJJUEZMQUdTKTogRGVmaW5lLgotCShiaW51dGlsc19jb21waWxlKTogTmV3IHByb2NlZHVyZS4KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX2NvbXBpbGUpOiBOZXcgcHJvY2VkdXJlLgotCi1GcmkgTm92ICAzIDEzOjIyOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfcnVuKTogRG9uJ3QgdXNlIHZlcmJvc2UKLQktbG9nLCByZXZlcnRpbmcgcGFydCBvZiBPY3QgMiBjaGFuZ2UuCi0KLVdlZCBOb3YgIDEgMTU6MDk6NTcgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IKLQltNjgqLW1vdG9yb2xhLXN5c3YqIGFuZCBtODgqLW1vdG9yb2xhLXN5c3YqLgotCi1XZWQgT2N0ICA0IDE0OjM4OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgWENPRkYuCi0KLU1vbiBPY3QgIDIgMTI6NDE6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvYXIuZXhwOiBOZXcgZmlsZS4KLQkqIGJpbnV0aWxzLWFsbC9iaW50ZXN0LnM6IE1ha2UgdGV4dF9zeW1ib2wgYW5kIGRhdGFfc3ltYm9sIGdsb2JhbC4KLQlBZGQgbmV3IHN0YXRpYyBzeW1ib2xzIHN0YXRpY190ZXh0X3N5bWJvbCBhbmQgc3RhdGljX2RhdGFfc3ltYm9sLgotCSogYmludXRpbHMtYWxsL25tLmV4cDogQWRqdXN0IGFjY29yZGluZ2x5LgotCSogY29uZmlnL2RlZmF1bHQuZXhwIChBUik6IFNldCBpZiBub3Qgc2V0LgotCShiaW51dGlsc19yZW1vdmUpOiBOZXcgcHJvY2VkdXJlLgotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfcnVuKTogQ2FsbAotCXBydW5lX3N5c3RlbV9jcnVkIG9uIHByb2dyYW0gb3V0cHV0LiAgVXNlIHZlcmJvc2UgLWxvZyBpbnN0ZWFkIG9mCi0JYm90aCB2ZXJib3NlIGFuZCBzZW5kX2xvZy4KLQkoZGVmYXVsdF9iaW51dGlsc19yZW1vdmUpOiBOZXcgcHJvY2VkdXJlLgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSk6IENhbGwKLQlwcnVuZV9zeXN0ZW1fY3J1ZCBvbiBhc3NlbWJsZXIgb3V0cHV0LgotCi1UdWUgU2VwIDI2IDE0OjA3OjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBzaW1wbGUgY29weSB0ZXN0Ci0JZm9yIGkzODYgQ09GRiB0YXJnZXRzLgotCi1XZWQgU2VwIDEzIDEzOjIwOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKHBydW5lX3N5c3RlbV9jcnVkKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkIG9uIGNtcCBvdXRwdXQuCi0KLVNhdCBBdWcgMTkgMTc6Mzg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCB4ZmFpbCBmb3IgaSo4Ni0qLWFvdXQqIGZvciBzaW1wbGUKLQljb3B5IHRlc3QuCi0KLVdlZCBBdWcgMTYgMTY6NTI6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIG1pcHMqLXNvbnktYnNkKiBmb3IKLQl0ZXN0cyB3aGljaCBmYWlsIG9uIEVDT0ZGIHRhcmdldHMuCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ2hhbmdlIGkqODYtKi1saW51eCB4ZmFpbCBmb3Igc2ltcGxlCi0JY29weSB0ZXN0IHRvIGNoZWNrIGZvciBpKjg2LSotbGludXhhb3V0KiBpbnN0ZWFkLgotCi1UdWUgQXVnICA4IDE3OjQ4OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGEyOWstKi12eHdvcmtzKgotCWZvciBzaW1wbGUgY29weSB0ZXN0LgotCi1UdWUgSnVsIDI1IDExOjU3OjEyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBDaGFuZ2Ugc2V0dXBfeGZhaWwgZm9yIHNpbXBsZSBjb3B5Ci0JdGVzdCBmcm9tIGk5NjAtKi12eHdvcmtzNS4xIHRvIGk5NjAtKi12eHdvcmtzKi4KLQotTW9uIEp1bCAxMCAxMjoyNTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciB6OCotKi1jb2ZmIGZvcgotCXNpbXBsZSBjb3B5IHRlc3QuCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHAgKGNwdXNfZXhwZWN0ZWQpOiBBZGQgejgwMDEgYW5kIHo4MDAyLgotCi1TdW4gTWF5IDIxIDIwOjMyOjUzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiaW51dGlscy1hbGwvaHBwYS9vYmpkdW1wLmV4cCAoYWRkZW5kYnVnKTogSGFuZGxlIFBBIEVMRiB0YXJnZXRzCi0JdG9vLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwIChzaW1wbGUgY29weSk6IERvbid0IGV4cGVjdCBQQSBFTEYKLQl0YXJnZXRzIHRvIGZhaWwuCi0KLVR1ZSBBcHIgIDQgMTQ6NTI6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJpbnV0aWxzLWFsbC9ocHBhOiBSZW5hbWVkIGZyb20gYmludXRpbHMtaHBwYS4KLQotV2VkIE1hciAyOSAxMjowMjo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBzaW1wbGUgY29weSB0ZXN0Ci0JZm9yIGg4NTAwLSotaG1zIGFuZCBoODUwMC0qLWNvZmYuCi0KLVR1ZSBNYXIgMjggMTE6MTg6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2ltcGxlIGNvcHkgdGVzdAotCWZvciBtNjgqLWVyaWNzc29uLW9zZSBhbmQgbTg4Ki0qLWNvZmYuCi0KLU1vbiBNYXIgMjcgMTE6Mjc6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2ltcGxlIGNvcHkgdGVzdAotCWZvciBtNjgqLSotdnh3b3JrcyouCi0KLUZyaSBNYXIgMjQgMTE6NDQ6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1ocHBhL29iamR1bXAuZXhwOiBDb3JyZWN0IGhwcGEqLSotKiBjaGVjay4KLQotVHVlIE1hciAyMSAxMDo0ODo0NSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmludXRpbHMtaHBwYS9hZGRlbmRidWcuczogTmV3IHRlc3RjYXNlLgotCSogYmludXRpbHMtaHBwYS9vYmpkdW1wLmV4cDogUnVuIGl0LgotCi1Nb24gTWFyIDIwIDExOjMxOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfcnVuKTogUXVvdGUgYW55IGRvbGxhciBzaWducwotCWluIHByb2dhcmdzIGJlZm9yZSBwYXNzaW5nIGl0IHRvIGV4ZWMuCi0KLUZyaSBNYXIgMTcgMTY6Mzk6MzEgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9ocHBhLnNlZDogU2VkIHNjcmlwdCB0byB0cmFuc2Zvcm0gYmludGVzdC5zIGludG8gcHJvcGVyCi0JUEEgYXNzZW1ibHkgY29kZS4KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEVuYWJsZSB0aGVzZSB0ZXN0cyBvbiB0aGUgUEEuCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEVuYWJsZSB0aGVzZSB0ZXN0cyBvbiB0aGUgUEEuICBFeHBlY3QKLQlzaW1wbGUgY29weSB0byBmYWlsLgotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBFbmFibGUgdGhlc2UgdGVzdHMgb24gdGhlIFBBLiAgSGFuZGxlCi0JIkNPREUiIGFzIGEgc2VjdGlvbiBuYW1lLgotCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBFbmFibGUgdGhlc2UgdGVzdHMgb24gdGhlIFBBLgotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBGb3IgImhwcGEqLSotKiIsCi0JcnVuIHRoZSBhc3NlbWJseSB0aHJvdWdoIGEgc2VkIHNjcmlwdCBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUKLQlhc3NlbWJsZXIuCi0KLVdlZCBNYXIgMTUgMTY6NDc6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IEZvcmNlIHNlY3Rpb24gc2l6ZXMgdG8gYmUgaW50ZXJwcmV0ZWQKLQlpbiBoZXguICBDaGFuZ2Ugb2JqZHVtcCAtaCBmYWlsdXJlIG1vZGUgdG8gYWx3YXlzIHVzZSB0aGUgc2FtZQotCXN0cmluZy4KLQotVGh1IEphbiAgNSAxMzowMTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEp1c3QgY2hlY2sgZm9yIGlyaXg0KiwgcmF0aGVyIHRoYW4KLQlpcml4XFswLTRcXSosIHRvIGF2b2lkIERlamFHbnUgYnVnLgotCi1UaHUgRGVjIDE1IDE5OjM1OjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRXhwZWN0IHNpbXBsZS1vYmpjb3B5IHRlc3QgdG8gZmFpbAotCWZvciB2YXJpb3VzIG90aGVyIHRhcmdldHMgZm9yIHdoaWNoIGdhcyBkb2Vzbid0IHVzZSBiZmQ6IHNoLWhtcywKLQltNjhrLWhwdXgsIG02OGstc3Vub3MsIG02OGstY29mZiwgaTM4Ni1saW51eCwgYTI5ay11ZGksIGEyOWstY29mZiwKLQlpOTYwLXZ4d29ya3M1LjEsIGk5NjAtY29mZiwgaDgzMDAtaG1zLCBoODMwMC1jb2ZmLgotCi1XZWQgRGVjIDE0IDE1OjU0OjQ2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogU2tpcCB0ZXN0cyByZXF1aXJpbmcgYmludGVzdC5vIG9uIGhwcGEsCi0Jc2luY2UgaXQgKGNvcnJlY3RseSkgZ2VuZXJhdGVzIHN5bnRheCBlcnJvcnMgb24gdGhhdCBwbGF0Zm9ybS4KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRGl0dG8uICBBbHNvLCBtb3ZlIHNldHVwX3hmYWlsIGZvcgotCXNoLWNvZmYgdG8gYnJhbmNoIHdoZXJlIG9iamNvcHkgZXhlY3V0aW9uIHByb2R1Y2VkIG5vIGVycm9yCi0JbWVzc2FnZXMuICBFeHBlY3QgZmFpbHVyZSBmb3IgaHAzMDAgYWxzby4KLQotVGh1IERlYyAgOCAxNDozNjoxNSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHAgKGNwdXNfZXhwZWN0ZWQpOiBOZXcgdmFyaWFibGUsIHRha2VuCi0JZnJvbSBvYmpkdW1wIC1pIHRlc3QsIGFkZGVkIG5zMzJrIGFuZCBwb3dlcnBjLCBzb3J0ZWQuCi0JKG9iamR1bXAgLWksIC1mIHRlc3RzKTogVXNlICRjcHVzX2V4cGVjdGVkLgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEZvciBzaW1wbGUtY29weSB0ZXN0LCBleHBlY3QgZmFpbHVyZQotCWZvciBzaC1jb2ZmLgotCi1UdWUgT2N0IDI1IDE2OjAwOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGp1c3QgLS1hZGp1c3Qtc2VjdGlvbi12bWEgdGVzdHMgZm9yCi0JbmV3IFMtcmVjb3JkIHNlY3Rpb24gaGFuZGxpbmcuCi0KLVR1ZSBPY3QgMTggMTE6MTg6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBubSB3aXRoIG5vIGFyZ3VtZW50cyBhbmQgbm0gLVAgZG8gbm90IHdvcmsKLQlhcyBleHBlY3RlZCBvbiBFQ09GRiB0YXJnZXRzOyBhZGQgY2FsbHMgdG8gc2V0dXBfeGZhaWwuCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogTmV3IGZpbGUuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IEluaXRpYWxpemUgT0JKQ09QWSBhbmQgT0JKQ09QWUZMQUdTLgotCi1GcmkgT2N0IDE0IDE0OjQ2OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCVJld3JpdGUgdGVzdHN1aXRlLgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogUmVtb3ZlLgotCSogYmludXRpbHMtYWxsL2NvbmZpZ3VyZS5pbiwgYmludXRpbHMtYWxsL01ha2VmaWxlLmluOiBSZW1vdmUuCi0JKiBiaW51dGlscy1hbGwvYmludGVzdC5jOiBSZW1vdmUuCi0JKiBiaW51dGlscy1hbGwvYmludGVzdC5zOiBOZXcgZmlsZS4KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHAsIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogUmV3cml0ZS4KLQkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogUmV3cml0ZS4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogTG9hZCB1dGlscy1saWIuZXhwLiAgU2V0IEFTIGFuZCBBU0ZMQUdTLgotCURvbid0IGdvIHVwIG9uZSBkaXJlY3RvcnkgZnJvbSAkYmFzZV9kaXIuICBDcmVhdGUgdG1wZGlyLgotCShiaW51dGlsc19ydW4sIGJpbnV0aWxzLWFzc2VtYmxlKTogTmV3IHByb2NlZHVyZXMuCi0JKiBjb25maWcvdW5peC5leHA6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1hMjlrLXVkaSwgY29uZmlnL210LWkzODYtYW91dDogUmVtb3ZlLgotCSogY29uZmlnL210LWk5NjAtbmluZHksIGNvbmZpZy9tdC1seW54LCBjb25maWcvbXQtbTY4azogUmVtb3ZlLgotCSogY29uZmlnL210LW1pcHMtZWNvZmYsIGNvbmZpZy9tdC1zbGl0ZTogUmVtb3ZlLgotCSogY29uZmlnL210LXNwYXJjLWFvdXQsIGNvbmZpZy9tdC12eHdvcmtzOiBSZW1vdmUuCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoYmludXRpbF92ZXJzaW9uKTogRG9uJ3QgcmVkaXJlY3Qgc3RhbmRhcmQKLQlpbnB1dCB3aGVuIGdldHRpbmcgdmVyc2lvbi4gIERvbid0IHVuc2V0IGVycm9ySW5mby4KLQkoZGVmYXVsdF9iaW51dGlsc19ydW4pOiBOZXcgcHJvY2VkdXJlLgotCShkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogTmV3IHByb2NlZHVyZS4KLQotVGh1IFNlcCAyOSAxMjo0NTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIFZNUyBkb2VzIG5vdCBwZXJtaXQgYC4nIGluIGRpcmVjdG9yeSBuYW1lczogcmVuYW1lZCBiaW51dGlscy5hbGwKLQl0byBiaW51dGlscy1hbGwuCi0JKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBDaGFuZ2UgYmludXRpbHMuYWxsIHRvIGJpbnV0aWxzLWFsbC4KLQotRnJpIFNlcCAyMyAxNjowMToxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG10LW02OGsgZm9yIG02OGsqLSotYW91dCogYW5kIG02OGsqLSotY29mZiosCi0Jbm90IGZvciBtNjhrLSotKi4KLQotRnJpIFNlcCAyMyAxMzo1NDo1MCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IEFkZGVkIEFSTSB0byBsaXN0IG9mIENQVSB0eXBlcy4KLQotVGh1IFNlcCAyMiAxMTowNDo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogVXBkYXRlIGZvciBuZXcgdXNhZ2UgbWVzc2FnZS4KLQkqIGJpbnV0aWxzLmFsbC9zaXplLmV4cDogVXNlIGEgZG91YmxlIGJhY2tzbGFzaCBpbiB0aGUgc3RyaW5nIHRvCi0JZ2V0IGEgc2luZ2xlIGJhY2tzbGFzaCB0byB0aGUgcmVnZXhwIG1hdGNoZXIuICBBY2NlcHQgJFRFWFQkLAotCSREQVRBJCBhbmQgJEJTUyQgYXMgd2VsbCBhcyAudGV4dCwgLmRhdGEgYW5kIC5ic3MsIGZvciBIUC9VWC4KLQotRnJpIFNlcCAgMiAxMjo1MzoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy91bml4LmV4cDogSWYgbm0ubmV3IGRvZXMgbm90IGV4aXN0LCB1c2UgW3RyYW5zZm9ybSBubV0uCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IExpa2V3aXNlLgotCi1XZWQgQXVnIDI0IDEyOjQxOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBiaW51dGlscy5hbGwvY29uZmlndXJlLmluOiBDaGFuZ2UgaTM4NiB0bwotCWlbMzQ1XTg2LgotCi1UdWUgSnVsIDE5IDE1OjIzOjUzIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LW1pcHMtZWNvZmY6IEFkZCAtVGlkcC5sZCBvcHRpb24uCi0KLVRodSBKdW4gMzAgMTI6NDE6NTUgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFVzZSBubS5uZXcsIG5vdCBubSwgZnJvbSBuZXdseSBidWlsdCB0cmVlLgotCi1UdWUgTWF5IDE3IDE0OjA0OjA1IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlZmF1bHQuZXhwLCBjb25maWcvdW5peC5leHA6IFJlcGxhY2UgZXJyb3IKLQkgIHByb2MgY2FsbHMgd2l0aCBwZXJyb3IuCi0KLVR1ZSBNYXkgMTAgMTE6MjA6NTQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGl0ZSk6IE1hdGNoIG9uIHNwYXJjbGl0ZSotKi0qLgotCi1XZWQgQXByIDEzIDE4OjI1OjE5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy91bml4LmV4cDogVXNlIG5tLm5ldywgbm90IG5tLCBmcm9tIG5ld2x5IGJ1aWx0IHRyZWUuCi0KLQkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogQWRkIG1vcmUgd2lsZGNhcmRzIHRvIGxpc3Qgb2YKLQlzaW5nbGUtbGV0dGVyIG9wdGlvbnMgaW4gcGF0dGVybiBmb3IgdXNhZ2UgbWVzc2FnZS4KLQotCSogYmludXRpbHMuYWxsL25tLmV4cDogRGVsZXRlZCBkZWJ1Zy1zeW1ib2xzIHRlc3QsIHNpbmNlIGl0IG9ubHkKLQl3b3JrcyBmb3IgYS5vdXQvc3RhYnMgc3lzdGVtcy4gIEZpeGVkIHJlZ2V4cHMgdG8gbWFrZSB1bmRlcnNjb3JlcwotCW9wdGlvbmFsLCBzaW5jZSBzb21lIEMgY29tcGlsZXJzIGRvbid0IHByZXBlbmQgdGhlbS4gIERlbGV0ZWQKLQljaGVjayBmb3IgZm9vLm8gc3ltYm9sLCBzaW5jZSBhZ2FpbiBzb21lIHN5c3RlbXMgZG9uJ3QgZ2VuZXJhdGUKLQlpdC4KLQotTW9uIEFwciAxMSAxMDozMTowMCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFNldCBUQ0xfTElCUkFSWSBmb3IgcnVudGVzdC4KLQotTW9uIEZlYiAxNCAxOTozNDowMyAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVc2UgbmV3IGNvbmZpZyBmZWF0dXJlcyBvZiBEZWphR251IGluIHNpdGUuZXhwCi0JZmlsZS4gIk1ha2UgY2hlY2siIHNob3VsZCBub3cgd29yayBmb3IgYWxsIGNyb3NzZXMuCi0KLUZyaSBKYW4gMjggMTg6MDA6MjkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMuYWxsL29iamR1bXAuZXhwOiBJbiB1c2FnZSBtZXNzYWdlLCBhY2NlcHQKLQkic2VjdGlvbi1uYW1lIiBhcyB3ZWxsIGFzICJzZWN0aW9uX25hbWUiLgotCi1Nb24gSmFuIDE3IDE2OjU3OjAyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogVHJpbSBsaXN0IG9mIGZvcm1hdCBuYW1lcyBleHBlY3RlZCwKLQlhbmQgYWNjZXB0IGFueSBrbm93biBDUFUgdHlwZS4KLQotVGh1IERlYyAgMiAyMDo1MDoyNCAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgc29tZSBzdHVmZiBmcm9tIHRoZSBzaXRlLmV4cCBmaWxlLgotCSogY29uZmlnL3VuaXguZXhwOiBBZGQgZ2xvYmFsIGJlZm9yZSBzZWVpbmcgaWYgdGhlIHZhcmlhYmxlcyBmb3IKLQlubSwgb2JqZHVtcCwgYW5kIHNpemUgZXhpc3QuCi0KLVdlZCBOb3YgIDMgMTE6MTI6MzIgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdWRpLmV4cCx1bml4LmV4cDogVHJhbnNmb3JtIHRvb2wgbmFtZS4KLQkqIGJpbnV0aWxzLmFsbC8qLmV4cDogQ2xlYXIgZXJyb3JJbmZvIGFmdGVyIGV4ZWMuCi0KLUZyaSBKdWwgIDIgMTI6NDE6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy5hbGwvKi5leHA6IFVzZSAtLSBmb3IgbG9uZyBhcmd1bWVudHMgcmF0aGVyIHRoYW4gKy4KLQotRnJpIEp1biAgNCAxMDo1MjoyOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIHNyY3RyaWdnZXIgdG8gTWFrZWZpbGUuaW4gCi0KLVdlZCBNYXkgMjYgMTc6Mjc6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBDQyBhbmQgQ0ZMQUdTLgotCi1GcmkgTWF5ICA3IDEzOjU4OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMuYWxsL29iamR1bXAuZXhwOiBVcGRhdGUgZm9yIG5ldyB1c2FnZSBtZXNzYWdlLgotCi1Nb24gQXByIDE5IDE0OjA4OjUyIDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMuYWxsLyouZXhwOiBVc2UgdGhlIG5ldyB1dGlsX3Rlc3QgcHJvYy4KLQkqIE1ha2VmaWxlLmluOiBDcmVhdGUgYSBsb2NhbCBzaXRlLmV4cCBmaWxlIHdpdGggY29uZmlnIGluZm8uCi0KLVRodSBNYXIgMjUgMDU6Mzg6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIG5tLmFsbC9jb25maWd1cmUuaW4gKHNyY25hbWUpOiBEZWxldGUgZXh0cmEgcXVvdGUuCi0KLU1vbiBGZWIgMjIgMDc6NTQ6MDMgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogbWFkZSBtb2RpZmljYXRpb25zIHRvIHRlc3RjYXNlcywgZXRjLiwgdG8gYWxsb3cKLSAgICAgICAgdGhlbSB0byB3b3JrIHByb3Blcmx5ICBnaXZlbiB0aGUgcmVvcmdhbml6YXRpb24gb2YgZGVqYS1nbnUgYW5kIHRoZQotICAgICAgICByZWxvY2F0aW9uIG9mIHRoZSB0ZXN0Y2FzZXMgZnJvbSBkZWphLWdudSB0byBhICJ0b29sIiBzdWJkaXJlY3RvcnkuCi0KLVN1biBGZWIgMjEgMTA6NTU6NTUgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMvdGVzdHN1aXRlOiBJbml0aWFsIGNyZWF0aW9uIG9mIGJpbnV0aWxzL3Rlc3RzdWl0ZS4KLQlNaWdyYXRlZCBkZWphZ251IHRlc3RjYXNlcyBhbmQgc3VwcG9ydCBmaWxlcyBmb3IgdGVzdGluZyBubSB0bwotCWJpbnV0aWxzL3Rlc3RzdWl0ZSBmcm9tIGRlamEtZ251LiAgVGhlc2UgZmlsZXMgd2VyZSBtb3ZlZCAiYXMgaXMiCi0Jd2l0aCBubyBtb2RpZmljYXRpb25zLiAgVGhpcyBtaWdyYXRpb24gaXMgcGFydCBvZiBhIG1ham9yIG92ZXJoYXVsCi0Jb2YgZGVqYWdudS4gIFRoZSBtb2RpZmljYXRpb25zIHRvIHRoZXNlIHRlc3RjYXNlcywgZXRjLiwgd2hpY2gKLQl3aWxsIGFsbG93IHRoZW0gdG8gd29yayB3aXRoIHRoZSBuZXcgdmVyc2lvbiBvZiBkZWphZ251IHdpbGwgYmUKLQltYWRlIGluIGEgZnV0dXJlIHVwZGF0ZS4KLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9hci5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2FyLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzOGM2Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2FyLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJEFSXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkQVIgZG9lcyBub3QgZXhpc3QiCi0gICAgICAgIHJldHVybgotICAgIH0KLX0KLQotIyBzZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkQVJdIgotCi0jIFRlc3QgbG9uZyBmaWxlIG5hbWUgc3VwcG9ydAotCi1wcm9jIGxvbmdfZmlsZW5hbWVzIHsgfSB7Ci0gICAgZ2xvYmFsIEFSCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgc2V0IHRlc3RuYW1lICJhciBsb25nIGZpbGUgbmFtZXMiCi0KLSAgICBzZXQgbjEgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MSIKLSAgICBzZXQgbjIgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MiIKLSAgICBzZXQgZmlsZTEgdG1wZGlyLyRuMQotICAgIHNldCBmaWxlMiB0bXBkaXIvJG4yCi0KLSAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgJGZpbGUxCi0KLSAgICAjIFNvbWUgZmlsZSBzeXN0ZW1zIHRydW5jYXRlIGZpbGUgbmFtZXMgYXQgMTQgY2hhcmFjdGVycywgd2hpY2gKLSAgICAjIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcnVuIHRoaXMgdGVzdC4gIENoZWNrIGZvciB0aGF0IG5vdy4KLSAgICBzZXQgc3RhdHVzIFtjYXRjaCAic2V0IGYgW29wZW4gdG1wZGlyLyRuMSB3XSIgZXJyc10KLSAgICBpZiB7ICRzdGF0dXMgIT0gMCB9IHsKLQl2ZXJib3NlIC1sb2cgIm9wZW4gdG1wZGlyLyRuMSByZXR1cm5lZCAkZXJycyIKLQl1bnN1cHBvcnRlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgcHV0cyAkZiAiZmlyc3QiCi0gICAgY2xvc2UgJGYKLQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlICRmaWxlMgotCi0gICAgc2V0IHN0YXR1cyBbY2F0Y2ggInNldCBmIFtvcGVuIHRtcGRpci8kbjIgd10iIGVycnNdCi0gICAgaWYgeyAkc3RhdHVzICE9IDAgfSB7Ci0JdmVyYm9zZSAtbG9nICJvcGVuIHRtcGRpci8kbjIgcmV0dXJuZWQgJGVycnMiCi0JdW5zdXBwb3J0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIHB1dHMgJGYgInNlY29uZCIKLSAgICBjbG9zZSAkZgotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IGZpbGUxIFtyZW1vdGVfZG93bmxvYWQgaG9zdCAkZmlsZTFdOwotCXNldCBmaWxlMiBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJGZpbGUyXTsKLQlzZXQgZGVzdCBhcnRlc3QuYQotICAgIH0gZWxzZSB7Ci0Jc2V0IGRlc3QgdG1wZGlyL2FydGVzdC5hCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGRlc3Q7Ci0KLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJEFSICJyYyAkZGVzdCAkZmlsZTEgJGZpbGUyIl0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJGZpbGUxIHRtcGRpci8kbjEKLSAgICB9Ci0KLSAgICBzZXQgZiBbb3BlbiB0bXBkaXIvJG4xIHJdCi0gICAgZ2V0cyAkZiBzdHJpbmcKLSAgICBjbG9zZSAkZgotICAgIGlmICFbc3RyaW5nIG1hdGNoICJmaXJzdCIgJHN0cmluZ10gewotCXZlcmJvc2UgLWxvZyAicmVhZGluZyB0bXBkaXIvJG4xIHJldHVybmVkICRzdHJpbmciCi0JdW5zdXBwb3J0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGRlc3Q7Ci0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGRlc3QgJGZpbGUxICRmaWxlMiJdCi0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgdG1wZGlyLyRuMQotICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSB0bXBkaXIvJG4yCi0KLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJEFSICJ0ICRkZXN0Il0KLSAgICByZWdzdWIgIlxbXHJcbiBcdFxdKiQiICIkZ290IiAiIiBnb3Q7Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiRuMSokbjIiICRnb3RdIHsKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICAKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkZmlsZTE7Ci0JcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGZpbGUyOwotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJEFSIHggJGRlc3QiCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJEFSICJ4ICRkZXN0Il0KLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQl2ZXJib3NlIC1sb2cgJGV4ZWNfb3V0cHV0Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJG4xIHRtcGRpci8kbjE7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRuMiB0bXBkaXIvJG4yOwotCXNldCBmaWxlMSB0bXBkaXIvJG4xCi0Jc2V0IGZpbGUyIHRtcGRpci8kbjIKLSAgICB9IGVsc2UgewotCXNldCBmaWxlMSAkbjEKLQlzZXQgZmlsZTIgJG4yCi0gICAgfQotCi0gICAgaWYgIVtmaWxlIGV4aXN0cyAkZmlsZTFdIHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMSBkb2VzIG5vdCBleGlzdCIKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICBpZiAhW2ZpbGUgZXhpc3RzICRmaWxlMl0gewotCXZlcmJvc2UgLWxvZyAiJGZpbGUyIGRvZXMgbm90IGV4aXN0IgotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGYgW29wZW4gJGZpbGUxIHJdCi0gICAgaWYgeyBbZ2V0cyAkZiBsaW5lXSA9PSAtMSB8fCAkbGluZSAhPSAiZmlyc3QiIH0gewotCXZlcmJvc2UgLWxvZyAiJGZpbGUxIGNvbnRlbnRzOiIKLQl2ZXJib3NlIC1sb2cgIiRsaW5lIgotCWNsb3NlICRmCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgY2xvc2UgJGYKLQotICAgIHNldCBmIFtvcGVuICRmaWxlMiByXQotICAgIGlmIHsgW2dldHMgJGYgbGluZV0gPT0gLTEgfHwgJGxpbmUgIT0gInNlY29uZCIgfSB7Ci0JdmVyYm9zZSAtbG9nICIkZmlsZTIgY29udGVudHM6IgotCXZlcmJvc2UgLWxvZyAiJGxpbmUiCi0JY2xvc2UgJGYKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICBjbG9zZSAkZgotCi0gICAgcGFzcyAkdGVzdG5hbWUKLX0KLQotIyBUZXN0IGJ1aWxkaW5nIHRoZSBzeW1ib2wgdGFibGUuCi0KLXByb2Mgc3ltYm9sX3RhYmxlIHsgfSB7Ci0gICAgZ2xvYmFsIEFSCi0gICAgZ2xvYmFsIEFTCi0gICAgZ2xvYmFsIE5NCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLQotICAgIHNldCB0ZXN0bmFtZSAiYXIgc3ltYm9sIHRhYmxlIgotCi0gICAgaWYgIVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBhcmNoaXZlIGFydGVzdC5hCi0Jc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi0JcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGFyY2hpdmUKLSAgICB9IGVsc2UgewotCXNldCBhcmNoaXZlIHRtcGRpci9hcnRlc3QuYQotCXNldCBvYmpmaWxlIHRtcGRpci9iaW50ZXN0Lm8KLSAgICB9Ci0KLSAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgdG1wZGlyL2FydGVzdC5hCi0KLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJEFSICJyYyAkYXJjaGl2ZSAke29iamZpbGV9Il0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICItLXByaW50LWFybWFwICRhcmNoaXZlIl0KLSAgICBpZiB7ICFbc3RyaW5nIG1hdGNoICIqdGV4dF9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAotCSB8fCAhW3N0cmluZyBtYXRjaCAiKmRhdGFfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgIVtzdHJpbmcgbWF0Y2ggIipjb21tb25fc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKnN0YXRpY190ZXh0X3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipzdGF0aWNfZGF0YV9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqZXh0ZXJuYWxfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIH0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAkdGVzdG5hbWUKLX0KLQotIyBSdW4gdGhlIHRlc3RzLgotCi1sb25nX2ZpbGVuYW1lcwotc3ltYm9sX3RhYmxlCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYmludGVzdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTAwNjUwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYmludGVzdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5nbG9ibCB0ZXh0X3N5bWJvbAotCS50ZXh0Ci10ZXh0X3N5bWJvbDoJCi1zdGF0aWNfdGV4dF9zeW1ib2w6Ci0JLmxvbmcJMQotCS5sb25nCWV4dGVybmFsX3N5bWJvbAotCS5nbG9ibCBkYXRhX3N5bWJvbAotCS5kYXRhCi1kYXRhX3N5bWJvbDoKLXN0YXRpY19kYXRhX3N5bWJvbDoKLQkubG9uZwkyCi0JLmNvbW0gY29tbW9uX3N5bWJvbCw0CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvYWRkZW5kYnVnLnMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvYWRkZW5kYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTMwNmYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgaW5pdGlhbGl6ZV9jaGFyX3N5bnRheCxDT0RFCi0JLkVYUE9SVCBpbml0aWFsaXplX2NoYXJfc3ludGF4LEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1pbml0aWFsaXplX2NoYXJfc3ludGF4Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsTk9fQ0FMTFMsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JYWRkaWwgTCdpc19pZGNoYXItJGdsb2JhbCQtMzIsJXIyNwotCS5FWElUCi0JLlBST0NFTkQKLWlzX2lkY2hhcgkuY29tbSAyNTYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9mcmVnLnMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvZnJlZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFlMTBmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9mcmVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5OU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCWZtcHlmYWRkLHNnbCAlZnI0TCwlZnI0UiwlZnI1UiwlZnI1TAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9vYmpkdW1wLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9vYmpkdW1wLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyMTU1ZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgcmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1pZiAhW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gIHJldHVybgotfQotCi0jIFRoZXNlIHRlc3RzIGFyZSBub3Qgc3VpdGFibGUgZm9yIHdpZGUgbW9kZS4KLWlmIFtpc3RhcmdldCBocHBhKnctKi0qXSB0aGVuIHsKLSAgcmV0dXJuCi19Ci0KLWlmIHtbd2hpY2ggJE9CSkRVTVBdID09IDB9IHRoZW4gewotICAgIHBlcnJvciAiJE9CSkRVTVAgZG9lcyBub3QgZXhpc3QiCi0gICAgcmV0dXJuCi19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRPQkpEVU1QXSIKLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2FkZGVuZGJ1Zy5zIHRtcGRpci9hZGRlbmRidWcub119IHRoZW4gewotICAgIHJldHVybgotfQotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgb2JqZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2FkZGVuZGJ1Zy5vXQotfSBlbHNlIHsKLSAgICBzZXQgb2JqZmlsZSB0bXBkaXIvYWRkZW5kYnVnLm8KLX0KLQotIyBNYWtlIHN1cmUgdGhlIFNPTSBCRkQgY29kZSBzaWduIGV4dGVuZHMgY29uc3RhbnRzIGluIFJfREFUQV9PVkVSUklERSBmaXh1cHMuCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtciAkb2JqZmlsZSJdCi0KLWlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLSAgc2V0IHdhbnQgIjAwMDAwMDAwIFJfUEFSSVNDX0RQUkVMMjFMXFsgCVxdK2lzX2lkY2hhclxcKzB4ZmZmZmZmZTAuKiIKLX0gZWxzZSB7Ci0gIHNldCB3YW50ICIwMDAwMDAwMCBSX0RQX1JFTEFUSVZFXFsgCVxdK2lzX2lkY2hhclxcKzB4ZmZmZmZmZTAuKiIKLX0KLQotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgImFkZGVuZGJ1ZyB0ZXN0IgotfSBlbHNlIHsKLSAgICBmYWlsICJhZGRlbmRidWcgdGVzdCIKLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNldCB1cCB0aGUgdGVzdCBvZiBmcmVnLnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvZnJlZy5zIHRtcGRpci9mcmVnLm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9mcmVnLm9dCi19IGVsc2UgewotICAgIHNldCBvYmpmaWxlIHRtcGRpci9mcmVnLm8KLX0KLQotIyBNYWtlIHN1cmUgdGhhdCB3ZSBnZXQgUiBmbG9hdCByZWdzIGxpa2Ugd2UncmUgc3VwcG9zZWQgdG8KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC0tZGlzYXNzZW1ibGUgJG9iamZpbGUiXQotCi1zZXQgd2FudCAiZm1weWZhZGQsc2dsIGZyNCxmcjRSLGZyNVIsZnI1IgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgImZyZWcgdGVzdCIKLX0gZWxzZSB7Ci0gICAgZmFpbCAiZnJlZyB0ZXN0IgotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL25tLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjN2M1Zi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL25tLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgcmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkTk1dID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiROTSBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkTk1dIgotCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHJldHVybgotfQotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi19IGVsc2UgewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vCi19Ci0KLSMgVGVzdCBubSB3aXRoIG5vIGFyZ3VtZW50cy4KLQotIyBUaGlzIHRlc3QgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgb24gRUNPRkYgdGFyZ2V0cywgYmVjYXVzZSBFQ09GRgotIyBzdG9yZXMgbW9zdCBzeW1ib2xzIHR3aWNlLCB3aGljaCBtZXNzZXMgdXAgdGhlIG5tIG91dHB1dC4KLXNldHVwX3hmYWlsICJhbHBoYSotKi1vc2YqIiAiYWxwaGEqLSotbmV0d2FyZSoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi11bHRyaXgqIiAibWlwcyotKi1lY29mZioiICJtaXBzKi0qLWlyaXg0KiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLXJpc2NvcyoiICJtaXBzKi0qLXN5c3YzKiIgIm1pcHMqLXNvbnktYnNkKiIKLQotIyBUaGlzIHRlc3QgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgb24gWENPRkYgdGFyZ2V0cywgYmVjYXVzZSBYQ09GRgotIyBkb2VzIG5vdCBlbnRlciBzdGF0aWMgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlLgotc2V0dXBfeGZhaWwgIiotKi1haXgqIgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAkdGVtcGZpbGUiXQotCi1pZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQotd2hpbGUge1tyZWdleHAgIihcW2EtekEtWlxdKSAoXFthLXpfXF0qX3N5bWJvbCkoLiopIiAkZ290IGFsbCB0eXBlIHN5bWJvbCByZXN0XX0gewotICAgIHNldCB2YXJzKCRzeW1ib2wpICR0eXBlCi0gICAgc2V0IGdvdCAkcmVzdAotfQotCi1pZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRleHRfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyh0ZXh0X3N5bWJvbCkgIT0gIlQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGRhdGFfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhkYXRhX3N5bWJvbCkgIT0gIkQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKGNvbW1vbl9zeW1ib2wpICE9ICJDIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKGV4dGVybmFsX3N5bWJvbCkgIT0gIlUiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoc3RhdGljX3RleHRfc3ltYm9sKSAhPSAidCIgXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhzdGF0aWNfZGF0YV9zeW1ib2wpICE9ICJkIn0gewotICAgIGZhaWwgIm5tIChubyBhcmd1bWVudHMpIgotfSBlbHNlIHsKLSAgICBwYXNzICJubSAobm8gYXJndW1lbnRzKSIKLX0KLQotIyBUZXN0IG5tIC1nCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTIC1nICR0ZW1wZmlsZSJdCi0KLWlmIFtpbmZvIGV4aXN0cyB2YXJzXSB0aGVuIHsgdW5zZXQgdmFycyB9Ci13aGlsZSB7W3JlZ2V4cCAiKFxbYS16X1xdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgc3ltYm9sIHJlc3RdfSB7Ci0gICAgc2V0IHZhcnMoJHN5bWJvbCkgMQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGRhdGFfc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoY29tbW9uX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGV4dGVybmFsX3N5bWJvbCldIFwKLSAgICAgfHwgW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX3RleHRfc3ltYm9sKV0gXAotICAgICB8fCBbaW5mbyBleGlzdHMgdmFycyhzdGF0aWNfZGF0YV9zeW1ib2wpXX0gewotICAgIGZhaWwgIm5tIC1nIgotfSBlbHNlIHsKLSAgICBwYXNzICJubSAtZyIKLX0KLQotIyBUZXN0IG5tIC1QCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIEVDT0ZGIHRhcmdldHMsIGJlY2F1c2UgRUNPRkYKLSMgc3RvcmVzIG1vc3Qgc3ltYm9scyB0d2ljZSwgd2hpY2ggbWVzc2VzIHVwIHRoZSBubSBvdXRwdXQuCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIgImFscGhhKi0qLW5ldHdhcmUqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotdWx0cml4KiIgIm1pcHMqLSotZWNvZmYqIiAibWlwcyotKi1pcml4NCoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi1yaXNjb3MqIiAibWlwcyotKi1zeXN2MyoiICJtaXBzKi1zb255LWJzZCoiCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIFhDT0ZGIHRhcmdldHMsIGJlY2F1c2UgWENPRkYKLSMgZG9lcyBub3QgZW50ZXIgc3RhdGljIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLXNldHVwX3hmYWlsICIqLSotYWl4KiIKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgLVAgJHRlbXBmaWxlIl0KLQotc2V0IHdhbnQgImNvbW1vbl9zeW1ib2wgQyBcWzBcXSo0LipkYXRhX3N5bWJvbCBEIFxbMC05YS1mQS1GXF0qLipleHRlcm5hbF9zeW1ib2wgVS4qc3RhdGljX2RhdGFfc3ltYm9sIGQgXFswLTlhLWZBLUZcXSouKnN0YXRpY190ZXh0X3N5bWJvbCB0IFxbMC05YS1mQS1GXF0qLip0ZXh0X3N5bWJvbCBUIFxbMC05YS1mQS1GXF0qIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm5tIC1QIgotfSBlbHNlIHsKLSAgICBmYWlsICJubSAtUCIKLX0KLQotIyBUaGVyZSBhcmUgY2VydGFpbmx5IG90aGVyIHRlc3RzIHRoYXQgY291bGQgYmUgcnVuLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDBlMGEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJE9CSkNPUFldID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiRPQkpDT1BZIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRPQkpDT1BZXSIKLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcGVycm9yICJ1bnJlc29sdmVkIDEiCi0gICAgdW5yZXNvbHZlZCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotICAgIHJldHVybgotfQotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIHRtcGRpci9iaW50ZXN0Lm87Ci0gICAgc2V0IGNvcHlmaWxlIHRtcGRpci9jb3B5OwotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi0gICAgc2V0IGNvcHlmaWxlIGNvcHkKLX0KLQotIyBUZXN0IHRoYXQgb2JqY29weSBkb2VzIG5vdCBtb2RpZnkgYSBmaWxlIHdoZW4gY29weWluZyBpdC4KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vIl0KLQotaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0gICAgZmFpbCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotfSBlbHNlIHsKLSAgICBzZW5kX2xvZyAiY21wICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vXG4iCi0gICAgdmVyYm9zZSAiY21wICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vIgotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBzcmMxIHRtcGRpci9iaW50ZXN0Lm8KLQlzZXQgc3JjMiB0bXBkaXIvY29weS5vCi0JcmVtb3RlX3VwbG9hZCBob3N0ICR0ZW1wZmlsZSAkc3JjMTsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHtjb3B5ZmlsZX0ubyAkc3JjMjsKLSAgICB9IGVsc2UgewotCXNldCBzcmMxICR7dGVtcGZpbGV9Ci0Jc2V0IHNyYzIgJHtjb3B5ZmlsZX0ubwotICAgIH0KLSAgICBzZXQgc3RhdHVzIFtyZW1vdGVfZXhlYyBidWlsZCBjbXAgIiR7c3JjMX0gJHtzcmMyfSJdOwotICAgIHNldCBleGVjX291dHB1dCBbbGluZGV4ICRzdGF0dXMgMV07Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICAjIE9uIHNvbWUgc3lzdGVtcyB0aGUgcmVzdWx0IG9mIG9iamNvcHkgd2lsbCBub3QgYmUgaWRlbnRpY2FsLgotICAgICMgVXN1YWxseSB0aGlzIGlzIGp1c3QgYmVjYXVzZSBnYXMgaXNuJ3QgdXNpbmcgYmZkIHRvIHdyaXRlIHRoZSBmaWxlcwotICAgICMgaW4gdGhlIGZpcnN0IHBsYWNlLCBhbmQgbWF5IG9yZGVyIHRoaW5ncyBhIGxpdHRsZSBkaWZmZXJlbnRseS4KLSAgICAjIFRob3NlIHN5c3RlbXMgc2hvdWxkIHVzZSBzZXR1cF94ZmFpbCBoZXJlLgotCi0gICAgc2V0dXBfeGZhaWwgInNoLSotY29mZiIgInNoLSotaG1zIiAKLSAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLWhwdXgqIiAibTY4Ki0qLXN1bm9zKiIgIm02OCotKi1jb2ZmIiAibTY4Ki0qLXZ4d29ya3MqIgotICAgIHNldHVwX3hmYWlsICJtNjgqLWVyaWNzc29uLW9zZSIgIm02OGsqLW1vdG9yb2xhLXN5c3YqIgotICAgIHNldHVwX3hmYWlsICJpKjg2LSotbGludXhhb3V0KiIgImkqODYtKi1hb3V0KiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLXN5c3YzIiAiaSo4Ni0qLWlzYyoiICJpKjg2LSotc2NvKiIgImkqODYtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJpKjg2LSotYWl4KiIgImkqODYtKi1nbzMyKiIgImkqODYtKi1tc2RvcyoiCi0gICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiICJhMjlrLSotY29mZiIgImEyOWstKi12eHdvcmtzKiIKLSAgICBzZXR1cF94ZmFpbCAiaTk2MC0qLWNvZmYiCi0gICAgc2V0dXBfeGZhaWwgImg4MzAwLSotaG1zIiAiaDgzMDAtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJoODUwMC0qLWhtcyIgImg4NTAwLSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaHBwYSotKi0qIgotICAgIGNsZWFyX3hmYWlsICJocHBhKi0qLSplbGYqIgotICAgIHNldHVwX3hmYWlsICJtODgqLSotY29mZiIgIm04OCotbW90b3JvbGEtc3lzdioiCi0gICAgc2V0dXBfeGZhaWwgIno4Ki0qLWNvZmYiCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCi0JIyBPbiBPU0YvMSwgdGhpcyBzdWNjZWVkcyB3aXRoIGdhcyBhbmQgZmFpbHMgd2l0aCAvYmluL2FzLgotCXNldHVwX3hmYWlsICJhbHBoYSotKi1vc2YqIgotCi0JIyBUaGlzIGZhaWxzIGZvciBDT0ZGIGk5NjAtdnh3b3JrcyB0YXJnZXRzLgotCXNldHVwX3hmYWlsICJpOTYwLSotdnh3b3JrcyoiCi0KLQlmYWlsICJvYmpjb3B5IChzaW1wbGUgY29weSkiCi0gICAgfQotfQotCi0jIFRlc3QgZ2VuZXJhdGluZyBTIHJlY29yZHMuCi0KLSMgV2UgbWFrZSB0aGUgc3JlYyBmaWxlbmFtZSA4LjMgY29tcGF0aWJsZS4gTm90ZSB0aGF0IHRoZSBoZWFkZXIgc3RyaW5nCi0jIG1hdGNoZWQgYWdhaW5zdCBkZXBlbmRzIG9uIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiBVZ2guCi0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCBzcmVjZmlsZSBjb3B5LnNyZQotICAgIHNldCBoZWFkZXJfc3RyaW5nIFMwMEIwMDAwNjM2RjcwNzkyRTczNzI2NUMxCi19IGVsc2UgewotICAgIHNldCBzcmVjZmlsZSAke2NvcHlmaWxlfS5zcmVjCi0gICAgc2V0IGhlYWRlcl9zdHJpbmcgUzAxMzAwMDA3NDZENzA2NDY5NzIyRjYzNkY3MDc5MkU3MzcyNjU2Mzk3Ci19Ci0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke3NyZWNmaWxlfSJdCi0KLWlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotICAgIGZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLX0gZWxzZSB7Ci0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR7c3JlY2ZpbGV9IHRtcGRpci9jb3B5LnNyZWM7Ci0Jc2V0IHNyZWNmaWxlIHRtcGRpci9jb3B5LnNyZWM7Ci0gICAgfQotICAgIHNldCBmaWxlIFtvcGVuICR7c3JlY2ZpbGV9IHJdCi0KLSAgICAjIFRoZSBmaXJzdCBTIHJlY29yZCBpcyBmaXhlZCBieSB0aGUgZmlsZSBuYW1lIHdlIGFyZSB1c2luZy4KLSAgICBnZXRzICRmaWxlIGxpbmUKLSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLSAgICB2ZXJib3NlICRsaW5lCi0gICAgaWYgIVtyZWdleHAgIiRoZWFkZXJfc3RyaW5nLioiICRsaW5lXSB7Ci0Jc2VuZF9sb2cgImJhZCBoZWFkZXJcbiIKLQlmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi0gICAgfSBlbHNlIHsKLQl3aGlsZSB7W2dldHMgJGZpbGUgbGluZV0gIT0gLTEgXAotCSAgICAgICAmJiBbcmVnZXhwICJeU1xbMTIzXF1cWzAtOWEtZkEtRlxdK1xbXHJcblxdKiQiICRsaW5lXX0gewotCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkgICAgdmVyYm9zZSAkbGluZQotCSAgICBzZXQgbGluZSAiKipFT0YqKiIKLQl9Ci0Jc2VuZF9sb2cgIiRsaW5lXG4iCi0JdmVyYm9zZSAkbGluZQotCWlmICFbcmVnZXhwICJeU1xbNzg5XF1cWzAtOWEtZkEtRlxdK1xbXHJcblxdKiQiICRsaW5lXSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgImJhZCB0cmFpbGVyXG4iCi0JICAgIGZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLQl9IGVsc2UgewotCSAgICBpZiB7W2dldHMgJGZpbGUgbGluZV0gIT0gLTF9IHRoZW4gewotCQlzZW5kX2xvZyAiZ2FyYmFnZSBhdCBlbmRcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCXZlcmJvc2UgJGxpbmUKLQkJZmFpbCAib2JqY29weSAtTyBzcmVjIgotCSAgICB9IGVsc2UgewotCQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHtjb3B5ZmlsZX0uc3JlYyJdCi0JCWlmICFbcmVnZXhwICJmaWxlIGZvcm1hdCBzcmVjIiAkZ290XSB0aGVuIHsKLQkJICAgIHNlbmRfbG9nICJvYmpkdW1wIGZhaWxlZFxuIgotCQkgICAgZmFpbCAib2JqY29weSAtTyBzcmVjIgotCQl9IGVsc2UgewotCQkgICAgcGFzcyAib2JqY29weSAtTyBzcmVjIgotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgY2xvc2UgJGZpbGUKLX0KLQotIyBUZXN0IHNldHRpbmcgYW5kIGFkanVzdGluZyB0aGUgc3RhcnQgYWRkcmVzcy4gIFdlIG9ubHkgdGVzdCB0aGlzCi0jIHdoaWxlIGdlbmVyYXRpbmcgUyByZWNvcmRzLCBiZWNhdXNlIHdlIG1heSBub3QgYmUgYWJsZSB0byBzZXQgdGhlCi0jIHN0YXJ0IGFkZHJlc3MgZm9yIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMsIGFuZCB0aGUgUyByZWNvcmQgY2FzZQotIyBpcyB0aGUgb25seSB1c2VmdWwgb25lIGFueWhvdy4KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR0ZW1wZmlsZSJdCi1pZiAhW3JlZ2V4cCAic3RhcnQgYWRkcmVzcyAoXFswLTlhLWZBLUZ4WFxdKykiICRnb3QgYWxsIG9yaWdzdGFydF0gdGhlbiB7Ci0gICAgcGVycm9yICJvYmpkdW1wIGNhbiBub3QgcmVjb2duaXplIGJpbnRlc3QubyIKLSAgICBzZXQgb3JpZ3N0YXJ0ICIiCi19IGVsc2UgewotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjIC0tc2V0LXN0YXJ0IDB4NzY1NCJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0JZmFpbCAib2JqY29weSAtLXNldC1zdGFydCIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAke2NvcHlmaWxlfS5zcmVjIl0KLQlpZiAhW3JlZ2V4cCAiZmlsZSBmb3JtYXQgc3JlYy4qc3RhcnQgYWRkcmVzcyAoXFswLTlhLWZBLUZ4WFxdKykiICRnb3QgYWxsIHNyZWNzdGFydF0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1zZXQtc3RhcnQiCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRzcmVjc3RhcnQgIT0gMHg3NjU0fSB0aGVuIHsKLQkJc2VuZF9sb2cgIiRzcmVjc3RhcnQgIT0gMHg3NjU0XG4iCi0JCWZhaWwgIm9iamNvcHkgLS1zZXQtc3RhcnQiCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgIm9iamNvcHkgLS1zZXQtc3RhcnQiCi0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgLS1hZGp1c3Qtc3RhcnQgMHgxMjMiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHtjb3B5ZmlsZX0uc3JlYyJdCi0JaWYgIVtyZWdleHAgImZpbGUgZm9ybWF0IHNyZWMuKnN0YXJ0IGFkZHJlc3MgKFxbMC05YS1mQS1GeFhcXSspIiAkZ290IGFsbCBzcmVjc3RhcnRdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXN0YXJ0IgotCX0gZWxzZSB7Ci0JICAgIGlmIHskc3JlY3N0YXJ0ICE9ICRvcmlnc3RhcnQgKyAweDEyM30gdGhlbiB7Ci0JCXNlbmRfbG9nICIkc3JlY3N0YXJ0ICE9ICRvcmlnc3RhcnQgKyAweDEyM1xuIgotCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXN0YXJ0IgotCSAgICB9IGVsc2UgewotCQlwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXN0YXJ0IgotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotIyBUZXN0IGFkanVzdGluZyB0aGUgb3ZlcmFsbCBWTUEsIGFuZCBhZGp1c3RpbmcgdGhlIFZNQSBvZiBhCi0jIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFdlIGFnYWluIG9ubHkgdGVzdCB0aGlzIHdoZW4gZ2VuZXJhdGluZyBTCi0jIHJlY29yZHMuCi0KLXNldCBsb3cgIiIKLXNldCBsb3duYW1lICIiCi0KLXNldCBoZWFkZXJzIFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHRlbXBmaWxlIl0KLQotc2V0IGhlYWRlcnNfcmVnZXhwICJcWyAJMC05XF0rKFxbXiAJXF0rKVxbIAlcXSooXFswLTlhLWZBLUZcXSspXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKylcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rMlxbKlxdXFsqXF1cWzAtOVxdKyguKikiCi0KLXNldCBnb3QgJGhlYWRlcnMKLXdoaWxlIHtbcmVnZXhwICRoZWFkZXJzX3JlZ2V4cCAkZ290IGFsbCBuYW1lIHNpemUgdm1hIHJlc3RdfSB7Ci0gICAgc2V0IHZtYSAweCR2bWEKLSAgICBzZXQgc2l6ZSAweCRzaXplCi0gICAgaWYgeyRzaXplICE9IDB9IHsKLQlpZiB7JGxvdyA9PSAiIiB8fCAkdm1hIDwgJGxvd30gewotICAgICAgICAgICAgc2V0IGxvdyAkdm1hCi0JICAgIHNldCBsb3duYW1lICRuYW1lCi0JfQotICAgIH0KLSAgICBzZXQgZ290ICRyZXN0Ci19Ci0KLWlmIHskbG93ID09ICIiIHx8ICRvcmlnc3RhcnQgPT0gIiJ9IHRoZW4gewotICAgIHBlcnJvciAib2JqZHVtcCBjYW4gbm90IHJlY29nbml6ZSBiaW50ZXN0Lm8iCi19IGVsc2UgewotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjIC0tYWRqdXN0LXZtYSAweDEyMyJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0gICAgICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1maCAke2NvcHlmaWxlfS5zcmVjIl0KLQlzZXQgd2FudCAiZmlsZSBmb3JtYXQgc3JlYy4qc3RhcnQgYWRkcmVzc1xbIAlcXSooXFswLTlhLWZBLUZ4WFxdKykuKnNlYzFcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKSIKLQlpZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCBzdGFydCB2bWFdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLQl9IGVsc2UgewotCSAgICBzZXQgdm1hIDB4JHZtYQotCSAgICBpZiB7JHZtYSAhPSAkbG93ICsgMHgxMjN9IHRoZW4gewotCQlzZW5kX2xvZyAiJHZtYSAhPSAkbG93ICsgMHgxMjNcbiIKLQkJZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCi0JICAgIH0gZWxzZSB7Ci0JCWlmIHskc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzfSB0aGVuIHsKLQkJICAgIHNlbmRfbG9nICIkc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzXG4iCi0JCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLQkJfSBlbHNlIHsKLQkJICAgIHBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgc2V0IGFyZyAiIgotICAgIHNldCBnb3QgJGhlYWRlcnMKLSAgICB3aGlsZSB7W3JlZ2V4cCAkaGVhZGVyc19yZWdleHAgJGdvdCBhbGwgbmFtZSBzaXplIHZtYSByZXN0XX0gewotCXNldCB2bWEgMHgkdm1hCi0JaWYgeyR2bWEgPT0gJGxvd30gdGhlbiB7Ci0JICAgIHNldCBhcmcgIiRhcmcgLS1hZGp1c3Qtc2VjdGlvbi12bWEgJG5hbWUrNCIKLQl9Ci0Jc2V0IGdvdCAkcmVzdAotICAgIH0KLQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjICRhcmciXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgKyIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAke2NvcHlmaWxlfS5zcmVjIl0KLQlzZXQgd2FudCAiZmlsZSBmb3JtYXQgc3JlYy4qc2VjMVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspIgotCWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHZtYV0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgKyIKLQl9IGVsc2UgewotCSAgICBzZXQgdm1hIDB4JHZtYQotCSAgICBpZiB7JHZtYSAhPSAkbG93ICsgNH0gdGhlbiB7Ci0JCXNlbmRfbG9nICIkdm1hICE9ICRsb3cgKyA0XG4iCi0JCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgKyIKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHJlZ3N1YiAtYWxsICJcXCs0IiAkYXJnICI9W2V4cHIgJGxvdyArIDRdIiBhcmdlcQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjICRhcmdlcSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0JZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSA9IgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR7Y29weWZpbGV9LnNyZWMiXQotCXNldCB3YW50ICJmaWxlIGZvcm1hdCBzcmVjLipzZWMxXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKykiCi0JaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdm1hXSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSA9IgotCX0gZWxzZSB7Ci0JICAgIHNldCB2bWEgMHgkdm1hCi0JICAgIGlmIHskdm1hICE9ICRsb3cgKyA0fSB0aGVuIHsKLQkJc2VuZF9sb2cgIiR2bWEgIT0gJGxvdyArIDRcbiIKLQkJZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSA9IgotCSAgICB9IGVsc2UgewotCQlwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCi0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0jIFRlc3Qgc3RyaXBwaW5nIGFuIG9iamVjdC4KLQotcHJvYyBzdHJpcF90ZXN0IHsgfSB7Ci0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIFNUUklQCi0gICAgZ2xvYmFsIFNUUklQRkxBR1MKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdCAic3RyaXAiCi0KLSAgICBpZiB7IFt0YXJnZXRfY29tcGlsZSAkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyB0bXBkaXIvdGVzdHByb2cubyBvYmplY3QgZGVidWddICE9ICIiIH0gewotCXVudGVzdGVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZy5vXTsKLSAgICB9IGVsc2UgewotCXNldCBvYmpmaWxlIHRtcGRpci90ZXN0cHJvZy5vCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJFNUUklQICIkU1RSSVBGTEFHUyAkb2JqZmlsZSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICROTSAiLWEgJE5NRkxBR1MgJG9iamZpbGUiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIqOiBubyBzeW1ib2xzKiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3QKLX0KLQotc3RyaXBfdGVzdAotCi0jIFRlc3Qgc3RyaXBwaW5nIGFuIG9iamVjdCBmaWxlIHdpdGggc2F2aW5nIGEgc3ltYm9sCi0KLXByb2Mgc3RyaXBfdGVzdF93aXRoX3NhdmluZ19hX3N5bWJvbCB7IH0gewotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBTVFJJUAotICAgIGdsb2JhbCBTVFJJUEZMQUdTCi0gICAgZ2xvYmFsIE5NCi0gICAgZ2xvYmFsIE5NRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotCi0gICAgc2V0IHRlc3QgInN0cmlwIHdpdGggc2F2aW5nIGEgc3ltYm9sIgotCi0gICAgaWYgeyBbdGFyZ2V0X2NvbXBpbGUgJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgdG1wZGlyL3Rlc3Rwcm9nLm8gb2JqZWN0IGRlYnVnXSAhPSAiIiB9IHsKLQl1bnRlc3RlZCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2cub107Ci0gICAgfSBlbHNlIHsKLQlzZXQgb2JqZmlsZSB0bXBkaXIvdGVzdHByb2cubwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRTVFJJUCAiJFNUUklQRkxBR1MgLUsgbWFpbiAtSyBfbWFpbiAkb2JqZmlsZSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgJG9iamZpbGUiXQotICAgIGlmIHshW3JlZ2V4cCB7XihbMC05YS1mQS1GXSspP1sgXStUIG1haW59ICRleGVjX291dHB1dF0gXAotICAgICAgICAgJiYgIVtyZWdleHAge14oWzAtOWEtZkEtRl0rKT9bIF0rVCBfbWFpbn0gJGV4ZWNfb3V0cHV0XX0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLXN0cmlwX3Rlc3Rfd2l0aF9zYXZpbmdfYV9zeW1ib2wKLQotIyBCdWlsZCBhIGZpbmFsIGV4ZWN1dGFibGUuCi0KLXByb2MgY29weV9zZXR1cCB7IH0gewotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgCi0gICAgc2V0IHJlcyBbYnVpbGRfd3JhcHBlciB0ZXN0Z2x1ZS5vXTsKLSAgICBzZXQgZmxhZ3MgeyBkZWJ1ZyB9OwotICAgIAotICAgIGlmIHsgJHJlcyAhPSAiIiB9IHsKLQlsYXBwZW5kIGZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPVtsaW5kZXggJHJlcyAxXSI7Ci0Jc2V0IGFkZF9saWJzICJ0ZXN0Z2x1ZS5vIjsKLSAgICB9IGVsc2UgewotCXNldCBhZGRfbGlicyAiIjsKLSAgICB9Ci0KLSAgICBpZiB7IFt0YXJnZXRfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgJGFkZF9saWJzIiB0bXBkaXIvdGVzdHByb2cgZXhlY3V0YWJsZSAkZmxhZ3NdICAhPSAiIiB9IHsKLQlyZXR1cm4gMgotICAgIH0KLQotICAgIHNldCByZXN1bHQgW3JlbW90ZV9sb2FkIHRhcmdldCB0bXBkaXIvdGVzdHByb2ddOwotICAgIHNldCBzdGF0dXMgW2xpbmRleCAkcmVzdWx0IDBdOwotCi0gICAgaWYgeyAkc3RhdHVzICE9ICJwYXNzIiAgfSB7Ci0JcGVycm9yICJ1bnJlc29sdmVkIHNldHVwLCBzdGF0dXMgPSAkc3RhdHVzIgotCXJldHVybiAzCi0gICAgfQotCi0gICAgcmV0dXJuIDAKLX0KLQotIyBUZXN0IGNvcHlpbmcgYW4gZXhlY3V0YWJsZS4KLQotcHJvYyBjb3B5X2V4ZWN1dGFibGUgeyBwcm9nIGZsYWdzIHRlc3QxIHRlc3QyIH0gewotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IHRlc3RmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2ddOwotCXNldCB0ZXN0Y29weSBjb3B5cHJvZwotICAgIH0gZWxzZSB7Ci0Jc2V0IHRlc3RmaWxlIHRtcGRpci90ZXN0cHJvZwotCXNldCB0ZXN0Y29weSB0bXBkaXIvY29weXByb2cKLSAgICB9Ci0gICAgcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJHRlc3Rjb3B5OwotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAkdGVzdGZpbGUgJHRlc3Rjb3B5Il0KLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QxCi0JZmFpbCAkdGVzdDIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHRlc3Rjb3B5IHRtcGRpci9jb3B5cHJvZwotICAgIH0KLQotICAgIHNldCBzdGF0dXMgW3JlbW90ZV9leGVjIGJ1aWxkICJjbXAiICJ0bXBkaXIvdGVzdHByb2cgdG1wZGlyL2NvcHlwcm9nIl0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2xpbmRleCAkc3RhdHVzIDFdOwotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXBhc3MgJHRlc3QxCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCi0JIyBUaGlzIHdpbGwgZmFpbCBmb3IgbWFueSByZWFzb25zLiAgRm9yIGV4YW1wbGUsIGl0IHdpbGwgbW9zdAotCSMgbGlrZWx5IGZhaWwgaWYgYSBub24tR05VIGxpbmtlciBpcyB1c2VkLiAgVGhlcmVmb3JlLCB3ZSBkbwotCSMgbm90IGluc2lzdCB0aGF0IGl0IHBhc3MuICBJZiB5b3UgYXJlIHVzaW5nIGFuIGFzc2VtYmxlciBhbmQKLQkjIGxpbmtlciBiYXNlZCBvbiB0aGUgc2FtZSBCRkQgYXMgb2JqY29weSwgaXQgaXMgd29ydGgKLQkjIGludmVzdGlnYXRpbmcgdG8gc2VlIHdoeSB0aGlzIGZhaWx1cmUgb2NjdXJzLiAgSWYgd2UgYXJlCi0JIyBjcm9zcyBjb21waWxpbmcsIHdlIGFzc3VtZSB0aGF0IGEgR05VIGxpbmtlciBpcyBiZWluZyB1c2VkLAotCSMgYW5kIGV4cGVjdCBpdCB0byBzdWNjZWVkLgotCWlmIHtbaXNuYXRpdmVdfSB0aGVuIHsKLQkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgotCX0KLQotCSMgVGhpcyBhbHNvIGZhaWxzIGZvciBtaXBzKi0qLWVsZiB0YXJnZXRzLiAgU2VlIGVsZjMyLW1pcHMuYwotCSMgbWlwc19lbGZfc3ltX2lzX2dsb2JhbC4KLQlzZXR1cF94ZmFpbCAibWlwcyotKi1lbGYiCi0KLQlzZXR1cF94ZmFpbCAiYXJtKi0qLWNvZmYiCi0Jc2V0dXBfeGZhaWwgImFybSotKi1wZSIKLQlzZXR1cF94ZmFpbCAidGh1bWIqLSotY29mZiIKLQlzZXR1cF94ZmFpbCAidGh1bWIqLSotcGUiCi0gICAgCi0JZmFpbCAkdGVzdDEKLSAgICB9Ci0KLSAgICBzZXQgb3V0cHV0IFtyZW1vdGVfbG9hZCB0YXJnZXQgdG1wZGlyL2NvcHlwcm9nXQotICAgIHNldCBzdGF0dXMgW2xpbmRleCAkb3V0cHV0IDBdOwotICAgIGlmIHsgJHN0YXR1cyAhPSAicGFzcyIgfSB7Ci0JZmFpbCAkdGVzdDIKLSAgICB9IGVsc2UgewotCXBhc3MgJHRlc3QyCi0gICAgfQotfQotCi0jIFRlc3Qgc3RyaXBwaW5nIGFuIGV4ZWN1dGFibGUKLQotcHJvYyBzdHJpcF9leGVjdXRhYmxlIHsgcHJvZyBmbGFncyB0ZXN0IH0gewotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBOTUZMQUdTCi0KLSAgICByZW1vdGVfZG93bmxvYWQgYnVpbGQgdG1wZGlyL2NvcHlwcm9nIHRtcGRpci9zdHJpcHJvZwotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBjb3B5ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3N0cmlwcm9nXTsKLSAgICB9IGVsc2UgewotCXNldCBjb3B5ZmlsZSB0bXBkaXIvc3RyaXByb2cKLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkcHJvZyAiJGZsYWdzICR7Y29weWZpbGV9Il0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR7Y29weWZpbGV9IHRtcGRpci9zdHJpcHJvZzsKLSAgICB9Ci0KLSAgICBzZXQgcmVzdWx0IFtyZW1vdGVfbG9hZCB0YXJnZXQgdG1wZGlyL3N0cmlwcm9nXQotICAgIHNldCBzdGF0dXMgW2xpbmRleCAkcmVzdWx0IDBdOwotICAgIGlmIHsgJHN0YXR1cyAhPSAicGFzcyIgfSB7Ci0JZmFpbCAkdGVzdAotICAgICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTICR7Y29weWZpbGV9Il0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiKjogbm8gc3ltYm9scyoiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0gICAgcGFzcyAkdGVzdAotfQotCi0jIFRlc3Qgc3RyaXBwaW5nIGFuIGV4ZWN1dGFibGUgd2l0aCBzYXZpbmcgYSBzeW1ib2wKLQotcHJvYyBzdHJpcF9leGVjdXRhYmxlX3dpdGhfc2F2aW5nX2Ffc3ltYm9sIHsgcHJvZyBmbGFncyB0ZXN0IH0gewotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBOTUZMQUdTCi0KLSAgICByZW1vdGVfZG93bmxvYWQgYnVpbGQgdG1wZGlyL2NvcHlwcm9nIHRtcGRpci9zdHJpcHJvZwotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBjb3B5ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3N0cmlwcm9nXTsKLSAgICB9IGVsc2UgewotCXNldCBjb3B5ZmlsZSB0bXBkaXIvc3RyaXByb2cKLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkcHJvZyAiJGZsYWdzICR7Y29weWZpbGV9Il0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR7Y29weWZpbGV9IHRtcGRpci9zdHJpcHJvZzsKLSAgICB9Ci0KLSAgICBzZXQgcmVzdWx0IFtyZW1vdGVfbG9hZCB0YXJnZXQgdG1wZGlyL3N0cmlwcm9nXQotICAgIHNldCBzdGF0dXMgW2xpbmRleCAkcmVzdWx0IDBdOwotICAgIGlmIHsgJHN0YXR1cyAhPSAicGFzcyIgfSB7Ci0JZmFpbCAkdGVzdAotICAgICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTICR7Y29weWZpbGV9Il0KLSAgICBpZiB7IVtyZWdleHAge15bMC05YS1mQS1GXSsgVCBtYWlufSAkZXhlY19vdXRwdXRdIFwKLSAgICAgICAgICYmICFbcmVnZXhwIHteWzAtOWEtZkEtRl0rIFQgX21haW59ICRleGVjX291dHB1dF19IHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3QKLX0KLQotc2V0IHRlc3QxICJzaW1wbGUgb2JqY29weSBvZiBleGVjdXRhYmxlIgotc2V0IHRlc3QyICJydW4gb2JqY29weSBvZiBleGVjdXRhYmxlIgotc2V0IHRlc3QzICJydW4gc3RyaXBwZWQgZXhlY3V0YWJsZSIKLXNldCB0ZXN0NCAicnVuIHN0cmlwcGVkIGV4ZWN1dGFibGUgd2l0aCBzYXZpbmcgYSBzeW1ib2wiCi0KLXN3aXRjaCBbY29weV9zZXR1cF0gewotICAgICIxIiB7Ci0JIyBkbyBub3RoaW5nCi0gICAgfQotICAgICIyIiB7Ci0JdW50ZXN0ZWQgJHRlc3QxCi0JdW50ZXN0ZWQgJHRlc3QyCi0JdW50ZXN0ZWQgJHRlc3QzCi0JdW50ZXN0ZWQgJHRlc3Q0Ci0gICAgfQotICAgICIzIiB7Ci0JdW5yZXNvbHZlZCAkdGVzdDEKLQl1bnJlc29sdmVkICR0ZXN0MgotCXVucmVzb2x2ZWQgJHRlc3QzCi0JdW5yZXNvbHZlZCAkdGVzdDQKLSAgICB9Ci0gICAgIjAiIHsKLQljb3B5X2V4ZWN1dGFibGUgIiRPQkpDT1BZIiAiJE9CSkNPUFlGTEFHUyIgIiR0ZXN0MSIgIiR0ZXN0MiIKLQlzdHJpcF9leGVjdXRhYmxlICIkU1RSSVAiICIkU1RSSVBGTEFHUyIgIiR0ZXN0MyIKLQlzdHJpcF9leGVjdXRhYmxlX3dpdGhfc2F2aW5nX2Ffc3ltYm9sICIkU1RSSVAiICItSyBtYWluIC1LIF9tYWluICRTVFJJUEZMQUdTIiAiJHRlc3Q0IgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqZHVtcC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTA0MGZjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqZHVtcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJE9CSkRVTVBdID09IDB9IHRoZW4gewotCXBlcnJvciAiJE9CSkRVTVAgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkT0JKRFVNUF0iCi0KLSMgU2ltcGxlIHRlc3Qgb2Ygb2JqZHVtcCAtaQotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWkiXQotCi1zZXQgY3B1c19leHBlY3RlZCAiKGEyOWt8YWxsaWFudHxhbHBoYXxhcmN8YXJtfGNvbnZleHxkMTB2fGQzMHZ8ZnIzMHxoOHxocHBhfGkzODZ8aTg2MHxpOTYwfG0zMnJ8bTY4a3xtODhrfE1Db3JlfG1pcHN8bW4xMDIwMHxtbjEwMzAwfG5zMzJrfHBqfHBvd2VycGN8cHlyYW1pZHxyb21wfHJzNjAwMHxzaHxzcGFyY3x0YWhvZXx2ODUwfHZheHx3ZTMya3x6OGt8ejgwMDF8ejgwMDIpIgotCi0jIE1ha2Ugc3VyZSB0aGUgdGFyZ2V0IENQVSBzaG93cyB1cCBpbiB0aGUgbGlzdC4KLWlmICFbcmVnZXhwICRjcHVzX2V4cGVjdGVkICR0YXJnZXRfY3B1XSB7Ci0gICAgcmVnc3ViICJeXFsoXF0iICIkY3B1c19leHBlY3RlZCIgIigke3RhcmdldF9jcHV9fCIgY3B1c19leHBlY3RlZDsKLX0KLQotc2V0IHdhbnQgIkJGRCBoZWFkZXIgZmlsZSB2ZXJzaW9uLipzcmVjXFteXG5cXSpcblxbXlxuXF0qaGVhZGVyIFxbXlxuXF0qZW5kaWFuXFteXG5cXSosIGRhdGEgXFteXG5cXSplbmRpYW4uKiRjcHVzX2V4cGVjdGVkIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm9iamR1bXAgLWkiCi19IGVsc2UgewotICAgIGZhaWwgIm9iamR1bXAgLWkiCi19Ci0KLSMgVGhlIHJlbWFpbmluZyB0ZXN0cyByZXF1aXJlIGEgdGVzdCBmaWxlLgotCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHJldHVybgotfQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlc3RmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfSBlbHNlIHsKLSAgICBzZXQgdGVzdGZpbGUgdG1wZGlyL2JpbnRlc3QubwotfQotCi0jIFRlc3Qgb2JqZHVtcCAtZgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKmFyY2hpdGVjdHVyZTpcWyAJXF0qJHtjcHVzX2V4cGVjdGVkfS4qSEFTX1JFTE9DLipIQVNfU1lNUyIKLQotaWYgIVtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgZmFpbCAib2JqZHVtcCAtZiIKLX0gZWxzZSB7Ci0gICAgcGFzcyAib2JqZHVtcCAtZiIKLX0KLQotIyBUZXN0IG9iamR1bXAgLWgKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIkdGVzdGZpbGU6XFsgCVxdKmZpbGUgZm9ybWF0LipTZWN0aW9ucy4qXFswLTlcXStcWyAJXF0rXFteIAlcXSoodGV4dHxURVhUfFxcXCRDT0RFXFxcJClcW14gCVxdKlxbIAlcXSooXFswLTlhLWZBLUZcXSspLipcWzAtOVxdK1xbIAlcXStcW14gCVxdKihcXC5kYXRhfERBVEEpXFteIAlcXSpcWyAJXF0qKFxbMC05YS1mQS1GXF0rKSIKLQotaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdGV4dF9uYW1lIHRleHRfc2l6ZSBkYXRhX25hbWUgZGF0YV9zaXplXSB0aGVuIHsKLSAgICBmYWlsICJvYmpkdW1wIC1oIgotfSBlbHNlIHsKLSAgICB2ZXJib3NlICJ0ZXh0IG5hbWUgaXMgJHRleHRfbmFtZSBzaXplIGlzICR0ZXh0X3NpemUiCi0gICAgdmVyYm9zZSAiZGF0YSBuYW1lIGlzICRkYXRhX25hbWUgc2l6ZSBpcyAkZGF0YV9zaXplIgotICAgIGlmIHtbZXhwciAiMHgkdGV4dF9zaXplIl0gPCA4IHx8IFtleHByICIweCRkYXRhX3NpemUiXSA8IDR9IHRoZW4gewotCXNlbmRfbG9nICJzaXplcyB0b28gc21hbGxcbiIKLQlmYWlsICJvYmpkdW1wIC1oIgotICAgIH0gZWxzZSB7Ci0JcGFzcyAib2JqZHVtcCAtaCIKLSAgICB9Ci19Ci0KLSMgVGVzdCBvYmpkdW1wIC10Ci0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtdCAkdGVzdGZpbGUiXQotCi1pZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQotd2hpbGUge1tyZWdleHAgIihcW2EtelxdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgc3ltYm9sIHJlc3RdfSB7Ci0gICAgc2V0IHZhcnMoJHN5bWJvbCkgMQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGRhdGFfc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoY29tbW9uX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGV4dGVybmFsX3N5bWJvbCldfSB0aGVuIHsKLSAgICBmYWlsICJvYmpkdW1wIC10IgotfSBlbHNlIHsKLSAgICBwYXNzICJvYmpkdW1wIC10IgotfQotCi0jIFRlc3Qgb2JqZHVtcCAtcgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXIgJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKlJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFxcW1xbXlxdXF0qKHRleHR8VEVYVHxcXFwkQ09ERVxcXCQpXFteXF1cXSpcXFxdLipleHRlcm5hbF9zeW1ib2wiCi0KLWlmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgcGFzcyAib2JqZHVtcCAtciIKLX0gZWxzZSB7Ci0gICAgZmFpbCAib2JqZHVtcCAtciIKLX0KLQotIyBUZXN0IG9iamR1bXAgLXMKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1zICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIkdGVzdGZpbGU6XFsgCVxdKmZpbGUgZm9ybWF0LipDb250ZW50cy4qKHRleHR8VEVYVHxcXFwkQ09ERVxcXCQpXFteMC05XF0qXFsgCVxdKlxbMC05YS1mQS1GXF0qXFsgCVxdKigwMDAwMDAwMXwwMTAwMDAwMCkuKkNvbnRlbnRzLiooZGF0YXxEQVRBKVxbXjAtOVxdKlxbIAlcXSpcWzAtOWEtZkEtRlxdKlxbIAlcXSooMDAwMDAwMDJ8MDIwMDAwMDApIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm9iamR1bXAgLXMiCi19IGVsc2UgewotICAgIGZhaWwgIm9iamR1bXAgLXMiCi19Ci0KLSMgT3B0aW9ucyB3aGljaCBhcmUgbm90IHRlc3RlZDogLWEgLWQgLUQgLVIgLVQgLXggLWwgLS1zdGFicwotIyBJIGRvbid0IHNlZSBhbnkgZ2VuZXJpYyB3YXkgdG8gdGVzdCBhbnkgb2YgdGhlc2Ugb3RoZXIgdGhhbiAtYS4KLSMgVGVzdHMgY291bGQgYmUgd3JpdHRlbiBmb3Igc3BlY2lmaWMgdGFyZ2V0cywgYW5kIHRoYXQgc2hvdWxkIGJlIGRvbmUKLSMgaWYgc3BlY2lmaWMgcHJvYmxlbXMgYXJlIGZvdW5kLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjc0NGMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgV3JpdHRlbiBieSBOaWNrIENsaWZ0byAgPG5pY2tjQGN5Z251cy5jb20+Ci0jIEJhc2VkIG9uIHNjcmlwdHMgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLSMgYW5kIEtlbiBSYWVidXJuIDxyYWVidXJuQGN5Z251cy5jb20+LgotCi0jIEZpcnN0IHNvbWUgaGVscGZ1bCBwcm9jZWR1cmVzLCB0aGVuIHRoZSB0ZXN0cyB0aGVtc2VsdmVzCi0KLSMgUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZW5hbWUgZ2l2ZW4KLXByb2MgZmlsZV9jb250ZW50cyB7IGZpbGVuYW1lIH0gewotICAgIHNldCBmaWxlIFtvcGVuICRmaWxlbmFtZSByXQotICAgIHNldCBjb250ZW50cyBbcmVhZCAkZmlsZV0KLSAgICBjbG9zZSAkZmlsZQotICAgIHJldHVybiAkY29udGVudHMKLX0KLQotIyByZWdleHBfZGlmZiwgYmFzZWQgb24gc2ltcGxlX2RpZmYgdGFrZW4gZnJvbSBsZCB0ZXN0IHN1aXRlCi0jCWNvbXBhcmVzIHR3byBmaWxlcyBsaW5lLWJ5LWxpbmUKLSMJZmlsZTEgY29udGFpbnMgc3RyaW5ncywgZmlsZTIgY29udGFpbnMgcmVnZXhwcyBhbmQgIy1jb21tZW50cwotIwlibGFuayBsaW5lcyBhcmUgaWdub3JlZCBpbiBlaXRoZXIgZmlsZQotIwlyZXR1cm5zIG5vbi16ZXJvIGlmIGRpZmZlcmVuY2VzIGV4aXN0Ci0jCi1wcm9jIHJlZ2V4cF9kaWZmIHsgZmlsZV8xIGZpbGVfMiB9IHsKLQotICAgIHNldCBlb2YgLTEKLSAgICBzZXQgZW5kXzEgMAotICAgIHNldCBlbmRfMiAwCi0gICAgc2V0IGRpZmZlcmVuY2VzIDAKLSAgICBzZXQgZGlmZl9wYXNzIDAKLQotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8xXSB0aGVuIHsKLQlzZXQgZmlsZV9hIFtvcGVuICRmaWxlXzEgcl0KLSAgICB9IGVsc2UgewotCXdhcm5pbmcgIiRmaWxlXzEgZG9lc24ndCBleGlzdCIKLQlyZXR1cm4gMQotICAgIH0KLQotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8yXSB0aGVuIHsKLQlzZXQgZmlsZV9iIFtvcGVuICRmaWxlXzIgcl0KLSAgICB9IGVsc2UgewotCWZhaWwgIiRmaWxlXzIgZG9lc24ndCBleGlzdCIKLQljbG9zZSAkZmlsZV9hCi0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICB2ZXJib3NlICIgUmVnZXhwLWRpZmYnaW5nOiAkZmlsZV8xICRmaWxlXzIiIDIKLQotICAgIHdoaWxlIHsgMSB9IHsKLQlzZXQgbGluZV9hICIiCi0Jc2V0IGxpbmVfYiAiIgotCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYV0gPT0gMCB9IHsKLQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9hIGxpbmVfYV0gPT0gJGVvZiB9IHsKLQkJc2V0IGVuZF8xIDEKLQkJYnJlYWsKLQkgICAgfQotCX0KLQl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2JdID09IDAgfHwgW3N0cmluZyBtYXRjaCAiIyoiICRsaW5lX2JdIH0gewotCSAgICBpZiBbIHN0cmluZyBtYXRjaCAiI3Bhc3MiICRsaW5lX2IgXSB7Ci0JCXNldCBlbmRfMiAxCi0JCXNldCBkaWZmX3Bhc3MgMQotCQlicmVhawotCSAgICB9Ci0JICAgIGlmIHsgW2dldHMgJGZpbGVfYiBsaW5lX2JdID09ICRlb2YgfSB7Ci0JCXNldCBlbmRfMiAxCi0JCWJyZWFrCi0JICAgIH0KLQl9Ci0KLSAgICAgICAgaWYgeyAkZGlmZl9wYXNzIH0geyAKLSAgICAgICAgICAgIGJyZWFrIAotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSAmJiAkZW5kXzIgfSB7IAotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgcmVnZXhwcyBpbiAkZmlsZV8yIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYiRcIlxuRU9GIGZyb20gJGZpbGVfMVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgcmVnZXhwcyBpbiAkZmlsZV8yIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYiRcIlxuRU9GIGZyb20gJGZpbGVfMSIgMwotICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8yIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIiAzCi0gICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZlcmJvc2UgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCIiIDMKLSAgICAgICAgICAgIGlmICFbcmVnZXhwICJeJGxpbmVfYiQiICIkbGluZV9hIl0gewotCQlzZW5kX2xvZyAicmVnZXhwX2RpZmYgbWF0Y2ggZmFpbHVyZVxuIgotCQlzZW5kX2xvZyAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIlxuIgotCQlzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiB7ICRkaWZmZXJlbmNlcyA9PSAwICYmICEkZGlmZl9wYXNzICYmIFtlb2YgJGZpbGVfYV0gIT0gW2VvZiAkZmlsZV9iXSB9IHsKLQlzZW5kX2xvZyAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHNcbiIKLQl2ZXJib3NlICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3RocyIgMwotCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgfQotCi0gICAgY2xvc2UgJGZpbGVfYQotICAgIGNsb3NlICRmaWxlX2IKLQotICAgIHJldHVybiAkZGlmZmVyZW5jZXMKLX0KLQotIyBSdW4gYW4gaW5kaXZpZHVhbCByZWFkZWxmIHRlc3QuCi0jIEJhc2ljYWxseSByZWFkZWxmIGlzIHJ1biBvbiB0aGUgYmluYXJ5X2ZpbGUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy4KLSMgUmVhZGVsZidzIG91dHB1dCBpcyBjYXB0dXJlZCBhbmQgdGhlbiBjb21wYXJlZCBhZ2FpbnN0IHRoZSBjb250ZW50cwotIyBvZiB0aGUgcmVnZXhwX2ZpbGUuCi0KLXByb2MgcmVhZGVsZl90ZXN0IHsgb3B0aW9ucyBiaW5hcnlfZmlsZSByZWdleHBfZmlsZSB4ZmFpbHMgfSB7Ci0KLSAgICBnbG9iYWwgUkVBREVMRgotICAgIGdsb2JhbCBSRUFERUxGRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIAotICAgIHNlbmRfbG9nICJleGVjICRSRUFERUxGICRSRUFERUxGRkxBR1MgJG9wdGlvbnMgJGJpbmFyeV9maWxlID4gcmVhZGVsZi5vdXQiCi0gICAgY2F0Y2ggImV4ZWMgJFJFQURFTEYgJFJFQURFTEZGTEFHUyAkb3B0aW9ucyAkYmluYXJ5X2ZpbGUgPiByZWFkZWxmLm91dCIgZ290Ci0KLSAgICBpZiB7IFtsbGVuZ3RoICR4ZmFpbHNdICE9IDAgfSB0aGVuIHsKLQlzZXR1cF94ZmFpbCAkeGZhaWxzCi0gICAgfQotICAgIAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCXNlbmRfbG9nICRnb3QKLQlmYWlsICJyZWFkZWxmICRvcHRpb25zIgotCXJldHVybgotICAgIH0KLQotICAgIGlmIHsgW3JlZ2V4cF9kaWZmIHJlYWRlbGYub3V0ICRzcmNkaXIvJHN1YmRpci8kcmVnZXhwX2ZpbGVdIH0gdGhlbiB7Ci0JZmFpbCAicmVhZGVsZiAkb3B0aW9ucyIKLQl2ZXJib3NlICJvdXRwdXQgaXMgXG5bZmlsZV9jb250ZW50cyByZWFkZWxmLm91dF0iIDIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICJyZWFkZWxmICRvcHRpb25zIgotfQotCi0KLQotIyBPbmx5IEVMRiBiYXNlZCB0b29sY2hhaW5zIG5lZWQgcmVhZGVsZi4KLSMgRm9yIG5vdyBiZSBwYXJhbm9pZCBhbmQgYXNzdW1lIHRoYXQgaWYgRUxGIGlzIG5vdCBtZW50aW9uZWQKLSMgaW4gdGhlIHRhcmdldCBzdHJpbmcsIHRoZW4gdGhlIHRhcmdldCBpcyBub3QgYW4gRUxGIGJhc2VkIHBvcnQuCi0KLWlmICFbaXN0YXJnZXQgIiotKmVsZiJdIHRoZW4gewotICAgIHZlcmJvc2UgIiRSRUFERUxGIGlzIG9ubHkgaW50ZW50ZWRlZCBmb3IgRUxGIHRhcmdldHMiIDIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJFJFQURFTEZdID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiRSRUFERUxGIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRSRUFERUxGXSIKLQotIyBBc3NlbWxlIHRoZSB0ZXN0IGZpbGUuCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICBwZXJyb3IgInVucmVzb2x2ZWQgMSIKLSAgICB1bnJlc29sdmVkICJyZWFkZWxmIC0gZmFpbGVkIHRvIGFzc2VtYmxlIgotICAgIHJldHVybgotfQotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIHRtcGRpci9iaW50ZXN0Lm87Ci19IGVsc2UgewotICAgIHNldCB0ZW1wZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2JpbnRlc3Qub10KLX0KLQotIyBSdW4gdGhlIHRlc3RzCi1yZWFkZWxmX3Rlc3QgLWggJHRlbXBmaWxlIHJlYWRlbGYuaCAge30KLQotIyBUaGUgdjg1MCBmYWlscyB0aGUgbmV4dCB0d28gdGVzdHMgYmVjYXVzZSBpdCBjcmVhdGVzIHR3byBzcGVjaWFsCi0jIHNlY3Rpb25zIG9mIGl0cyBvd246IC5jYWxsX3RhYmxlX2RhdGEgYW5kIC5jYWxsX3RhYmxlX3RleHQKLSMgVGhlIHJlZ2V4cCBzY3JpcHRzIGFyZSBub3QgZXhwZWN0aW5nIHRoZXNlIHNlY3Rpb25zLi4uCi0KLXJlYWRlbGZfdGVzdCAtUyAkdGVtcGZpbGUgcmVhZGVsZi5zICB7djg1MCotKi0qfQotcmVhZGVsZl90ZXN0IC1zICR0ZW1wZmlsZSByZWFkZWxmLnNzIHt2ODUwKi0qLSp9Ci1yZWFkZWxmX3Rlc3QgLXIgJHRlbXBmaWxlIHJlYWRlbGYuciAge30KLQotCi0jIENvbXBpbGUgdGhlIHNlY29uZCB0ZXN0IGZpbGUuCi1pZiB7IFt0YXJnZXRfY29tcGlsZSAkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyB0bXBkaXIvdGVzdHByb2cubyBvYmplY3QgZGVidWddICE9ICIiIH0gewotICAgIHVudGVzdGVkICJyZWFkZWxmIC13IgotICAgIHJldHVybgotfQotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZy5vXTsKLX0gZWxzZSB7Ci0gICAgc2V0IHRlbXBmaWxlIHRtcGRpci90ZXN0cHJvZy5vCi19Ci0KLSMgVGhlIHhmYWlsIHRhcmdldHMgaGVyZSBkbyBub3QgZGVmYXVsdCB0byBEV0FSRjIgZm9ybWF0IGRlYnVnIGluZm9ybWF0aW9uCi0jIFRoZSBzeW1wdG9tIGlzIHRoYXQgdGhlIG91dHB1dCBvZiAncmVhZGVsZiAtd2knIGlzIGVtcHR5LgotCi1yZWFkZWxmX3Rlc3QgLXdpICR0ZW1wZmlsZSByZWFkZWxmLndpIHt2ODUwKi0qLSp9CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuaCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBlYWI1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotRUxGIEhlYWRlcjoKLSAgTWFnaWM6ICAgN2YgNDUgNGMgNDYgMFsxMl0gMFsxMl0gMDEgLi4gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgCi0gIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxGWzM2XVsyNF0KLSAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyJ3MgY29tcGxlbWVudCwuKiBlbmRpYW4KLSAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAxIFwoY3VycmVudFwpCi0gIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAuKgotICBUeXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTCBcKFJlbG9jYXRhYmxlIGZpbGVcKQotICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4qCi0gIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCi0gIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgMHgwCi0gIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgMCBcKGJ5dGVzIGludG8gZmlsZVwpCi0gIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgLiogXChieXRlcyBpbnRvIGZpbGVcKQotICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4qCi0gIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgLiogXChieXRlc1wpCi0gIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgMCBcKGJ5dGVzXCkKLSAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAwCi0gIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAgLiogXChieXRlc1wpCi0gIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgLioKLSAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAuKgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnIgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0OTY1OS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1SZWxvY2F0aW9uIHNlY3Rpb24gJy5yZWwuKnRleHQnIGF0IG9mZnNldCAweC4qIGNvbnRhaW5zIDEgZW50cmllczoKLSAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZS4qCi0gIDAwMDAwMDA0ICAwMC4qIFJfLiowMDAwMDAwMCAgZXh0ZXJuYWxfc3ltYm9sLioKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjEyNDUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1UaGVyZSBhcmUgLiogc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgLio6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLSAgXFtOclxdIE5hbWUgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsZyBMayBJbmYgQWwKLSAgXFsgMFxdICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAgICAwMDAwMDAwMCAwMDAwMDAgMDAwMDAwIDAwICAgICAgMCAgIDAgMAotICBcWyAxXF0gLnRleHQgICAgICAgICAgICAgUFJPR0JJVFMgICAgICAgIDAwMDAwMDAwIDAwMDAzNCAwMDAwMDggMDAgIEFYICAwICAgMCAuCi0gIFxbIDJcXSAucmVsLit0ZXh0ICtSRUwuICswKyAwKy4qIDAwMDAwLiAwLiAgICAgIC4gICAxIDQKLSAgXFsgM1xdIC5kYXRhICAgICAgICAgICAgIFBST0dCSVRTICAgICAgICAwMDAwMDAwMCAwMDAwM2MgMDAwMDA0IDAwIFdBICAgMCAgIDAgLgotICBcWyA0XF0gLmJzcyAgICAgICAgICAgICAgTk9CSVRTICAgICAgICAgIDAwMDAwMDAwIDAwMDA0MCAwMDAwMDAgMDAgV0EgICAwICAgMCAuCi0gIFxbIDVcXSAuc2hzdHJ0YWIgICAgICAgICBTVFJUQUIgICAgICAgICAgMDAwMDAwMDAgMDAwMDQwIDAwMDAuKiAwMCAgICAgIDAgICAwIC4KLSAgXFsgNlxdIC5zeW10YWIgICAgICAgICAgIFNZTVRBQiAgICAgICAgICAwMDAwMDAwMCAwKy4qIDArLiogMTAgICAgICA3ICAgNiA0Ci0gIFxbIDdcXSAuc3RydGFiICAgICAgICAgICBTVFJUQUIgICAgICAgICAgMDAwMDAwMDAgMCsuKiAwKy4qIDAwICAgICAgMCAgIDAgMQotCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuc3MgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NjBiMzguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnNzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi1TeW1ib2wgdGFibGUgJy5zeW10YWInIGNvbnRhaW5zIC4qIGVudHJpZXM6Ci0gIE51bTogICAgVmFsdWUgIFNpemUgVHlwZSAgICBCaW5kICAgT3QgIE5keCBOYW1lCi0gICAgMDogICAgICAgIDAgICAgIDAgTk9UWVBFICBMT0NBTCAgIDAgIFVORCAKLSAgICAxOiAgICAgICAgMCAgICAgMCBTRUNUSU9OIExPQ0FMICAgMCAgICAxIAotICAgIDI6ICAgICAgICAwICAgICAwIFNFQ1RJT04gTE9DQUwgICAwICAgIDMgCi0gICAgMzogICAgICAgIDAgICAgIDAgU0VDVElPTiBMT0NBTCAgIDAgICAgNCAKLSAgICA0OiAgICAgICAgMCAgICAgMCBOT1RZUEUgIExPQ0FMICAgMCAgICAxIHN0YXRpY190ZXh0X3N5bWJvbAotICAgIDU6ICAgICAgICAwICAgICAwIE5PVFlQRSAgTE9DQUwgICAwICAgIDMgc3RhdGljX2RhdGFfc3ltYm9sCi0gICAgLjogICAgICAgIDAgICAgIDAgTk9UWVBFICBHTE9CQUwgIDAgICAgMSB0ZXh0X3N5bWJvbAotICAgIC46ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICBVTkQgZXh0ZXJuYWxfc3ltYm9sCi0gICAuKjogICAgICAgIDAgICAgIDAgTk9UWVBFICBHTE9CQUwgIDAgICAgMyBkYXRhX3N5bWJvbAotICAgLio6ICAgICAgICA0ICAgICA0IE9CSkVDVCAgR0xPQkFMICAwICBDT00gY29tbW9uX3N5bWJvbApkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLndpIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLndpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDIyZmZmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLVRoZSBzZWN0aW9uIC5kZWJ1Z19pbmZvIGNvbnRhaW5zOgotCi0gIENvbXBpbGF0aW9uIFVuaXQ6Ci0gICBMZW5ndGg6ICAgICAgICAuKgotICAgVmVyc2lvbjogICAgICAgMgotICAgQWJicmV2IE9mZnNldDogMAotICAgUG9pbnRlciBTaXplOiAgNAotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDEgXChEV19UQUdfY29tcGlsZV91bml0XCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiAuKi90ZXN0cHJvZy5jCQotICAgICBEV19BVF9jb21wX2RpciAgICA6IC4qL2JpbnV0aWxzCQotICAgICBEV19BVF9wcm9kdWNlciAgICA6IEdOVSBDIC4qCQotICAgICBEV19BVF9sYW5ndWFnZSAgICA6IDEJXChBTlNJIENcKQotICAgICBEV19BVF9sb3dfcGMgICAgICA6IDAJCi0gICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCi0gICAgIERXX0FUX3N0bXRfbGlzdCAgIDogMAkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiAyIFwoRFdfVEFHX3N1YnByb2dyYW1cKQotICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogZm4JCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiAxMAkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiAuKgkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAwCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotICAgICBEV19BVF9mcmFtZV9iYXNlICA6IDEgYnl0ZSBibG9jazogLioKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiAzIFwoRFdfVEFHX2Jhc2VfdHlwZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogaW50CQotICAgICBEV19BVF9ieXRlX3NpemUgICA6IDQJCi0gICAgIERXX0FUX2VuY29kaW5nICAgIDogNQlcKHNpZ25lZFwpCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNCBcKERXX1RBR19zdWJwcm9ncmFtXCkKLSAgICAgRFdfQVRfc2libGluZyAgICAgOiAuKgkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9uYW1lICAgICAgICA6IG1haW4JCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiAxNgkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiAuKgkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAuKgkKLSAgICAgRFdfQVRfaGlnaF9wYyAgICAgOiAuKgkKLSAgICAgRFdfQVRfZnJhbWVfYmFzZSAgOiAxIGJ5dGUgYmxvY2s6IC4qCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNSBcKERXX1RBR19sZXhpY2FsX2Jsb2NrXCkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAuKgkKLSAgICAgRFdfQVRfaGlnaF9wYyAgICAgOiAuKgkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA2IFwoRFdfVEFHX3ZhcmlhYmxlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBjb21tb24JCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiAzCQotICAgICBEV19BVF90eXBlICAgICAgICA6IDwuKj4JCi0gICAgIERXX0FUX2V4dGVybmFsICAgIDogMQkKLSAgICAgRFdfQVRfbG9jYXRpb24gICAgOiA1IGJ5dGUgYmxvY2s6IDMgMCAwIDAgMCAJXChEV19PUF9hZGRyOiAwXCkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA2IFwoRFdfVEFHX3ZhcmlhYmxlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBnbG9iYWwJCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiA0CQotICAgICBEV19BVF90eXBlICAgICAgICA6IDwuKj4JCi0gICAgIERXX0FUX2V4dGVybmFsICAgIDogMQkKLSAgICAgRFdfQVRfbG9jYXRpb24gICAgOiA1IGJ5dGUgYmxvY2s6IDMgMCAwIDAgMCAJXChEV19PUF9hZGRyOiAwXCkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA3IFwoRFdfVEFHX3ZhcmlhYmxlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBsb2NhbAkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDUJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfbG9jYXRpb24gICAgOiA1IGJ5dGUgYmxvY2s6IDMgLiAwIDAgLiAJXChEV19PUF9hZGRyOiAuXCkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA4IFwoRFdfVEFHX2FycmF5X3R5cGVcKQotICAgICBEV19BVF9zaWJsaW5nICAgICA6IDwuKj4JCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogPC4qPgkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA5IFwoRFdfVEFHX3N1YnJhbmdlX3R5cGVcKQotICAgICBEV19BVF91cHBlcl9ib3VuZCA6IDYJCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogMyBcKERXX1RBR19iYXNlX3R5cGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGNoYXIJCi0gICAgIERXX0FUX2J5dGVfc2l6ZSAgIDogMQkKLSAgICAgRFdfQVRfZW5jb2RpbmcgICAgOiA4CVwodW5zaWduZWQgY2hhclwpCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNyBcKERXX1RBR192YXJpYWJsZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogc3RyaW5nCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogNgkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAuIDAgMCAuIAlcKERXX09QX2FkZHI6IC5cKQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9zaXplLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvc2l6ZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDhjOTEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9zaXplLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+Ci0jIGFuZCByZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRTSVpFXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRTSVpFIGRvZXMgbm90IGV4aXN0IgotCXJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJFNJWkVdIgotCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHJldHVybgotfQotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVzdGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi19IGVsc2UgewotICAgIHNldCB0ZXN0ZmlsZSB0bXBkaXIvYmludGVzdC5vCi19Ci0KLXNldCBkZWMgIlxbMC05XF0rIgotc2V0IGhleCAiXFswLTlhLWZBLUZcXSsiCi0KLSMgVGVzdCBzaXplIHdpdGggbm8gYXJndW1lbnRzCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkU0laRSAiJFNJWkVGTEFHUyAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiKCRkZWMpXFsgCVxdKygkZGVjKVxbIAlcXSsoJGRlYylcWyAJXF0rKCRkZWMpXFsgCVxdKygkaGV4KVxbIAlcXSske3Rlc3RmaWxlfSIKLQotaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdGV4dCBkYXRhIGJzcyBkdG90IGhleHRvdF0gdGhlbiB7Ci0gICAgZmFpbCAic2l6ZSAobm8gYXJndW1lbnRzKSIKLX0gZWxzZSB7Ci0gICAgaWYgeyR0ZXh0IDwgOCB8fCAkZGF0YSA8IDR9IHRoZW4gewotCWZhaWwgInNpemUgKG5vIGFyZ3VtZW50cykiCi0gICAgfSBlbHNlIHsKLQlwYXNzICJzaXplIChubyBhcmd1bWVudHMpIgotICAgIH0KLX0KLQotIyBUZXN0IHNpemUgLUEKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRTSVpFICIkU0laRUZMQUdTIC1BICR7dGVzdGZpbGV9Il0KLQotc2V0IHdhbnQgIiR7dGVzdGZpbGV9LioodGV4dHxURVhUKVxbXlxuXHJcXSpcWyAJXF0oJGRlYylcWyAJXF0rJGRlYy4qKFxcLmRhdGF8REFUQSlcW15cblxyXF0qXFsgCVxdKCRkZWMpXFsgCVxdKyRkZWMiCi0KLWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHRleHRuYW1lIHRleHRzaXplIGRhdGFuYW1lIGRhdGFzaXplXSB0aGVuIHsKLSAgICBmYWlsICJzaXplIC1BIgotfSBlbHNlIHsKLSAgICB2ZXJib3NlICJ0ZXh0IHNpemU6ICR0ZXh0c2l6ZSIKLSAgICB2ZXJib3NlICJkYXRhIHNpemU6ICRkYXRhc2l6ZSIKLSAgICBpZiB7JHRleHRzaXplIDwgOCB8fCAkZGF0YXNpemUgPCA0fSB0aGVuIHsKLQlmYWlsICJzaXplIC1BIgotICAgIH0gZWxzZSB7Ci0JcGFzcyAic2l6ZSAtQSIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjE4NTYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC90ZXN0cHJvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gdGVzdCBvYmpjb3B5IGFuZCBzdHJpcC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgY29tbW9uOwotaW50IGdsb2JhbCA9IDE7Ci1zdGF0aWMgaW50IGxvY2FsID0gMjsKLXN0YXRpYyBjaGFyIHN0cmluZ1tdID0gInN0cmluZyI7Ci0KLWludAotZm4gKCkKLXsKLSAgcmV0dXJuIDM7Ci19Ci0KLWludAotbWFpbiAoKQotewotICBpZiAoY29tbW9uICE9IDAKLSAgICAgIHx8IGdsb2JhbCAhPSAxCi0gICAgICB8fCBsb2NhbCAhPSAyCi0gICAgICB8fCBzdHJjbXAgKHN0cmluZywgInN0cmluZyIpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbGVkXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBwcmludGYgKCJva1xuIik7Ci0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjgwMmUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZS4gKHJvYkBjeWdudXMuY29tKQotCi1sb2FkX2xpYiB1dGlsLWRlZnMuZXhwCi1sb2FkX2xpYiB1dGlscy1saWIuZXhwCi0KLWlmICFbaW5mbyBleGlzdHMgTk1dIHRoZW4gewotICAgIHNldCBOTSBbZmluZGZpbGUgJGJhc2VfZGlyL25tLW5ldyAkYmFzZV9kaXIvbm0tbmV3IFt0cmFuc2Zvcm0gbm1dXQotfQotaWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgTk1GTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIFNJWkVdIHRoZW4gewotICAgIHNldCBTSVpFIFtmaW5kZmlsZSAkYmFzZV9kaXIvc2l6ZV0KLX0KLWlmICFbaW5mbyBleGlzdHMgU0laRUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgU0laRUZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUF0gdGhlbiB7Ci0gICAgc2V0IE9CSkRVTVAgW2ZpbmRmaWxlICRiYXNlX2Rpci9vYmpkdW1wXQotfQotaWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpEVU1QRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWSBbZmluZGZpbGUgJGJhc2VfZGlyL29iamNvcHldCi19Ci1pZiAhW2luZm8gZXhpc3RzIE9CSkNPUFlGTEFHU10gdGhlbiB7Ci0gICAgc2V0IE9CSkNPUFlGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIEFSXSB0aGVuIHsKLSAgICBzZXQgQVIgW2ZpbmRmaWxlICRiYXNlX2Rpci9hcl0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBTVFJJUF0gdGhlbiB7Ci0gICAgc2V0IFNUUklQIFtmaW5kZmlsZSAkYmFzZV9kaXIvc3RyaXAtbmV3ICRiYXNlX2Rpci9zdHJpcC1uZXcgW3RyYW5zZm9ybSBzdHJpcF1dCi19Ci1pZiAhW2luZm8gZXhpc3RzIFNUUklQRkxBR1NdIHRoZW4gewotICAgIHNldCBTVFJJUEZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgUkVBREVMRl0gdGhlbiB7Ci0gICAgc2V0IFJFQURFTEYgW2ZpbmRmaWxlICRiYXNlX2Rpci9yZWFkZWxmXQotfQotaWYgIVtpbmZvIGV4aXN0cyBSRUFERUxGRkxBR1NdIHRoZW4gewotICAgIHNldCBSRUFERUxGRkxBR1MgIiIKLX0KLQotaWYgIVtmaWxlIGlzZGlyZWN0b3J5IHRtcGRpcl0ge2NhdGNoICJleGVjIG1rZGlyIHRtcGRpciIgc3RhdHVzfQotCi0jCi0jIGJpbnV0aWxzX3J1bgotIwlydW4gYSBwcm9ncmFtLCByZXR1cm5pbmcgdGhlIG91dHB1dAotIwlzZXRzIGJpbnV0aWxzX3J1bl9mYWlsZWQgaWYgdGhlIHByb2dyYW0gZG9lcyBub3QgZXhpc3QKLSMKLXByb2MgYmludXRpbHNfcnVuIHsgcHJvZyBwcm9nYXJncyB9IHsKLSAgICBkZWZhdWx0X2JpbnV0aWxzX3J1biAkcHJvZyAkcHJvZ2FyZ3MKLX0KLQotIwotIyBiaW51dGlsc19hc3NlbWJsZQotIwlhc3NlbWJsZSBhIGZpbGUKLSMKLXByb2MgYmludXRpbHNfYXNzZW1ibGUgeyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUgJHNvdXJjZSAkb2JqZWN0Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2hwcGEuc2VkIGIvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2MDdkOC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2hwcGEuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zLyMgT2xkIE9TRiBzZWQgYmxvd3MgdXAgaWYgeW91IGhhdmUgYSBzZWQgY29tbWFuZCBzdGFydGluZyB3aXRoICIjIi8vCi1zLyMgQXZvaWQgaXQgYnkgcHV0dGluZyB0aGUgY29tbWVudHMgd2l0aGluIHJlYWwgc2VkIGNvbW1hbmRzLi8vCi1zLyMgRml4IHRoZSBkZWZpbml0aW9uIG9mIGNvbW1vbl9zeW1ib2wgdG8gYmUgY29ycmVjdCBmb3IgdGhlIFBBIGFzc2VibWxlcnMuLy8KLXMvCVwuY29tbSBjb21tb25fc3ltYm9sLDQvY29tbW9uX3N5bWJvbAkuY29tbSA0LwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2xpYi91dGlscy1saWIuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2xpYi91dGlscy1saWIuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjdmMjE3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgZXh0ZW5kZWQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLXByb2MgYmludXRpbF92ZXJzaW9uIHsgcHJvZyB9IHsKLSAgICBpZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IHBhdGggW3doaWNoICRwcm9nXTsKLQlpZiB7JHBhdGggPT0gMH0gdGhlbiB7Ci0JICAgIHBlcnJvciAiJHByb2cgY2FuJ3QgYmUgcnVuLCBmaWxlIG5vdCBmb3VuZC4iCi0JICAgIHJldHVybiAiIgotCX0KLSAgICB9IGVsc2UgewotCXNldCBwYXRoICRwcm9nCi0gICAgfQotICAgIHNldCBzdGF0ZSBbcmVtb3RlX2V4ZWMgaG9zdCAkcHJvZyAtLXZlcnNpb25dOwotICAgIHNldCB0bXAgIltsaW5kZXggJHN0YXRlIDFdXG4iOwotICAgICMgU2hvdWxkIGZpbmQgYSB3YXkgdG8gZGlzY2FyZCBjb25zdGFudCBwYXJ0cywga2VlcCB3aGF0ZXZlcidzCi0gICAgIyBsZWZ0LCBzbyB0aGUgdmVyc2lvbiBzdHJpbmcgY291bGQgYmUgYWxtb3N0IGFueXRoaW5nIGF0IGFsbC4uLgotICAgIHJlZ2V4cCAiXFteXG5cXSogKGN5Z251cy18KShcWy0wLTkuYS16QS1aLVxdKylcW1xyXG5cXS4qIiAiJHRtcCIgdmVyc2lvbiBjeWcgbnVtYmVyCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBudW1iZXJdIHRoZW4gewotICAgICAgICByZXR1cm4gIiRwYXRoIChubyB2ZXJzaW9uIG51bWJlcilcbiIKLSAgICB9Ci0gICAgcmV0dXJuICIkcGF0aCAkbnVtYmVyXG4iCi19Ci0KLSMKLSMgZGVmYXVsdF9iaW51dGlsc19ydW4KLSMJcnVuIGEgcHJvZ3JhbSwgcmV0dXJuaW5nIHRoZSBvdXRwdXQKLSMJc2V0cyBiaW51dGlsc19ydW5fZmFpbGVkIGlmIHRoZSBwcm9ncmFtIGRvZXMgbm90IGV4aXN0Ci0jCi1wcm9jIGRlZmF1bHRfYmludXRpbHNfcnVuIHsgcHJvZyBwcm9nYXJncyB9IHsKLSAgICBnbG9iYWwgYmludXRpbHNfcnVuX2ZhaWxlZAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCBiaW51dGlsc19ydW5fZmFpbGVkIDAKLQotICAgIGlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLQlpZiB7W3doaWNoICRwcm9nXSA9PSAwfSB0aGVuIHsKLQkgICAgcGVycm9yICIkcHJvZyBkb2VzIG5vdCBleGlzdCIKLQkgICAgc2V0IGJpbnV0aWxzX3J1bl9mYWlsZWQgMQotCSAgICByZXR1cm4gIiIKLQl9Ci0gICAgfQotCi0gICAgc2VuZF9sb2cgIiRwcm9nICRwcm9nYXJnc1xuIgotICAgIHZlcmJvc2UgIiRwcm9nICRwcm9nYXJncyIKLQotICAgICMgR290dGEgcXVvdGUgZG9sbGFyLXNpZ25zIGJlY2F1c2UgdGhleSBnZXQgbWFuZ2xlZCBieSB0aGUKLSAgICAjIHNoZWxsIG90aGVyd2lzZS4KLSAgICByZWdzdWIgLWFsbCAiXFwkIiAiJHByb2dhcmdzIiAiXFwkIiBwcm9nYXJncwotCi0gICAgc2V0IHN0YXRlIFtyZW1vdGVfZXhlYyBob3N0ICRwcm9nICRwcm9nYXJnc10KLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzIFtsaW5kZXggJHN0YXRlIDFdXTsKLSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLSAgICB9Ci0gICAgcmV0dXJuICRleGVjX291dHB1dAotfQotCi0jCi0jIGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUgeyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICAjIFRoZSBIUFBBIGFzc2VtYmxlciBzeW50YXggaXMgYSBsaXR0bGUgZGlmZmVyZW50IHRoYW4gbW9zdCwgdG8gbWFrZQotICAgICMgdGhlIHRlc3Qgc291cmNlIGZpbGUgYXNzZW1ibGUgd2UgbmVlZCB0byBydW4gaXQgdGhyb3VnaCBzZWQuCi0gICAgIwotICAgICMgVGhpcyBpcyBhIGhhY2sgaW4gdGhhdCBpdCB3b24ndCBzY2FsZSB3ZWxsIGlmIG90aGVyIHRhcmdldHMgbmVlZAotICAgICMgc2ltaWxhciB0cmFuc2Zvcm1hdGlvbnMgdG8gYXNzZW1ibGUuICBXZSdsbCBnZW5lcmFsaXplIHRoZSBoYWNrCi0gICAgIyBpZi93aGVuIG90aGVyIHRhcmdldHMgbmVlZCBzaW1pbGFyIGhhbmRsaW5nLgotICAgIGlmIFtpc3RhcmdldCAiaHBwYSotKi0qIiBdIHRoZW4gewotCXNlbmRfbG9nICJzZWQgLWYgJHNyY2Rpci9jb25maWcvaHBwYS5zZWQgPCAkc291cmNlID4gYXNtLnNcbiIKLQl2ZXJib3NlICJzZWQgLWYgJHNyY2Rpci9jb25maWcvaHBwYS5zZWQgPCAkc291cmNlID4gYXNtLnMiCi0JY2F0Y2ggImV4ZWMgc2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zIjsKLQlzZXQgc291cmNlIGFzbS5zCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFt0YXJnZXRfYXNzZW1ibGUgJHNvdXJjZSAkb2JqZWN0ICIiXTsKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkc291cmNlOiBhc3NlbWJseSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLWlmICFbaW5mbyBleGlzdHMgdGFyZ2V0X2Fzc2VtYmxlXSB7Ci0jCi0jIFN0b2xlbiBmcm9tIGRlamFnbnUvbGliL3RhcmdldC5leHAtLXBsZWFzZSByZW1vdmUgYWZ0ZXIgMS8xLzk4LgotIwotdXBsZXZlbCAjMCB7Ci0gICAgcHJvYyB0YXJnZXRfYXNzZW1ibGUgeyBzb3VyY2UgZGVzdGZpbGUgZmxhZ3MgfSB7Ci0JcmV0dXJuIFtkZWZhdWx0X3RhcmdldF9hc3NlbWJsZSAkc291cmNlICRkZXN0ZmlsZSAkZmxhZ3NdOwotICAgIH0KLQotICAgIHByb2MgZGVmYXVsdF90YXJnZXRfYXNzZW1ibGUgeyBzb3VyY2UgZGVzdGZpbGUgZmxhZ3MgfSB7Ci0JZ2xvYmFsIEFTX0ZPUl9UQVJHRVQ7Ci0JZ2xvYmFsIEFTRkxBR1NfRk9SX1RBUkdFVDsKLQotCWlmIFtpbmZvIGV4aXN0cyBBU19GT1JfVEFSR0VUXSB7Ci0JICAgIHNldCBBUyAiJEFTX0ZPUl9UQVJHRVQiOwotCX0gZWxzZSB7Ci0JICAgIGlmICFbYm9hcmRfaW5mbyB0YXJnZXQgZXhpc3RzIGFzc2VtYmxlcl0gewotCQlzZXQgQVMgW2ZpbmRfZ2FzXTsKLQkgICAgfSBlbHNlIHsKLQkJc2V0IEFTIFtib2FyZF9pbmZvIHRhcmdldCBhc3NlbWJsZXJdOwotCSAgICB9Ci0JfQotCi0JaWYgW2luZm8gZXhpc3RzIEFTRkxBR1NfRk9SX1RBUkdFVF0gewotCSAgICBhcHBlbmQgZmxhZ3MgIiAkQVNGTEFHU19GT1JfVEFSR0VUIjsKLQl9Ci0KLQlpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQkgICAgc2V0IHNvdXJjZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHNvdXJjZV07Ci0JICAgIHNldCBkZXN0ICJhLm91dCIKLQl9IGVsc2UgewotCSAgICBzZXQgZGVzdCAkZGVzdGZpbGUKLQl9Ci0Jc2V0IHN0YXR1cyBbcmVtb3RlX2V4ZWMgaG9zdCAiJEFTICRzb3VyY2UgJGZsYWdzIC1vICRkZXN0Il0KLQlpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQkgICAgcmVtb3RlX3VwbG9hZCBob3N0ICRkZXN0ICRkZXN0ZmlsZQotCX0KLQotCXNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgW2xpbmRleCAkc3RhdHVzIDFdXTsKLQlpZiB7IFtsaW5kZXggJHN0YXR1cyAwXSAhPSAwIH0gewotCSAgICB2ZXJib3NlIC1sb2cgImFzc2VtYmxlciBleGl0ZWQgd2l0aCBzdGF0dXMgW2xpbmRleCAkc3RhdHVzIDBdIjsKLQl9Ci0JaWYgeyBbbGluZGV4ICRzdGF0dXMgMV0gIT0gIiIgfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiYXNzZW1ibGVyIG91dHB1dCBpczpcbltsaW5kZXggJHN0YXR1cyAxXSIgMjsKLQl9Ci0JcmV0dXJuICR7Y29tcF9vdXRwdXR9OwotfQotfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdmVyc2lvbi5jIGIvYmludXRpbHMvdmVyc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDU1OTM5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIHZlcnNpb24uYyAtLSBiaW51dGlscyB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotLyogVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXJzIGZvciB0aGUgYmludXRpbHMuICBUaGV5IGFsbCBjaGFuZ2UgaW4KLSAgIGxvY2tzdGVwIC0tIGl0J3MgZWFzaWVyIHRoYXQgd2F5LiAqLwotCi1jb25zdCBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSBWRVJTSU9OOwotCi0vKiBQcmludCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIGNvcHlyaWdodCBpbmZvcm1hdGlvbiwgYW5kIGV4aXQuICBUaGlzCi0gICBpbXBsZW1lbnRzIHRoZSAtLXZlcnNpb24gb3B0aW9uIGZvciB0aGUgdmFyaW91cyBwcm9ncmFtcy4gICovCi0KLXZvaWQKLXByaW50X3ZlcnNpb24gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoIkdOVSAlcyAlc1xuIiwgbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKLSAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKLSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHJlcy5jIGIvYmludXRpbHMvd2luZHJlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2NkOTA5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dpbmRyZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk5MiArMCwwIEBACi0vKiB3aW5kcmVzLmMgLS0gYSBwcm9ncmFtIHRvIG1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBwcm9ncmFtIGNhbiByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJlc291cmNlcyBpbiB2YXJpb3VzCi0gICBmb3JtYXRzLiAgSW4gcGFydGljdWxhciwgaXQgY2FuIGFjdCBsaWtlIHRoZSByYyByZXNvdXJjZSBjb21waWxlcgotICAgcHJvZ3JhbSwgYW5kIGl0IGNhbiBhY3QgbGlrZSB0aGUgY3Z0cmVzIHJlcyB0byBDT0ZGIGNvbnZlcnNpb24KLSAgIHByb2dyYW0uCi0KLSAgIEl0IGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIHRha2VuIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzOgotCi0gICAqIE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uLgotCi0gICAqIFRoZSByY2wgcHJvZ3JhbSwgd3JpdHRlbiBieSBHdW50aGVyIEViZXJ0Ci0gICAgIDxndW50aGVyLmViZXJ0QGl4b3MtbGVpcHppZy5kZT4uCi0KLSAgICogVGhlIHJlczJjb2ZmIHByb2dyYW0sIHdyaXR0ZW4gYnkgUGVkcm8gQS4gQXJhbmRhIDxwYWFnQHRpZC5lcz4uCi0KLSAgICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qIHVzZWQgYnkgcmVzcmMuYyBhdCBsZWFzdCAqLwotCi1pbnQgdmVyYm9zZSA9IDA7Ci0KLS8qIEFuIGVudW1lcmF0aW9uIG9mIGZvcm1hdCB0eXBlcy4gICovCi0KLWVudW0gcmVzX2Zvcm1hdAotewotICAvKiBVbmtub3duIGZvcm1hdC4gICovCi0gIFJFU19GT1JNQVRfVU5LTk9XTiwKLSAgLyogVGV4dHVhbCBSQyBmaWxlLiAgKi8KLSAgUkVTX0ZPUk1BVF9SQywKLSAgLyogQmluYXJ5IFJFUyBmaWxlLiAgKi8KLSAgUkVTX0ZPUk1BVF9SRVMsCi0gIC8qIENPRkYgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfQ09GRgotfTsKLQotLyogQSBzdHJ1Y3R1cmUgdXNlZCB0byBtYXAgYmV0d2VlbiBmb3JtYXQgdHlwZXMgYW5kIHN0cmluZ3MuICAqLwotCi1zdHJ1Y3QgZm9ybWF0X21hcAotewotICBjb25zdCBjaGFyICpuYW1lOwotICBlbnVtIHJlc19mb3JtYXQgZm9ybWF0OwotfTsKLQotLyogQSBtYXBwaW5nIGJldHdlZW4gbmFtZXMgYW5kIGZvcm1hdCB0eXBlcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZm9ybWF0X21hcCBmb3JtYXRfbmFtZXNbXSA9Ci17Ci0gIHsgInJjIiwgUkVTX0ZPUk1BVF9SQyB9LAotICB7ICJyZXMiLCBSRVNfRk9STUFUX1JFUyB9LAotICB7ICJjb2ZmIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgTlVMTCwgUkVTX0ZPUk1BVF9VTktOT1dOIH0KLX07Ci0KLS8qIEEgbWFwcGluZyBmcm9tIGZpbGUgZXh0ZW5zaW9ucyB0byBmb3JtYXQgdHlwZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgZm9ybWF0X2ZpbGVleHRzW10gPQotewotICB7ICJyYyIsIFJFU19GT1JNQVRfUkMgfSwKLSAgeyAicmVzIiwgUkVTX0ZPUk1BVF9SRVMgfSwKLSAgeyAiZXhlIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgIm9iaiIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7ICJvIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgTlVMTCwgUkVTX0ZPUk1BVF9VTktOT1dOIH0KLX07Ci0KLS8qIEEgbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzLiAgKi8KLQotc3RydWN0IGluY2x1ZGVfZGlyCi17Ci0gIHN0cnVjdCBpbmNsdWRlX2RpciAqbmV4dDsKLSAgY2hhciAqZGlyOwotfTsKLQotc3RhdGljIHN0cnVjdCBpbmNsdWRlX2RpciAqaW5jbHVkZV9kaXJzOwotCi0vKiBMb25nIG9wdGlvbnMuICAqLwotCi0vKiAxNTAgaXNuJ3Qgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0RFRklORSAxNTAKLSNkZWZpbmUgT1BUSU9OX0hFTFAgKE9QVElPTl9ERUZJTkUgKyAxKQotI2RlZmluZSBPUFRJT05fSU5DTFVERV9ESVIgKE9QVElPTl9IRUxQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0xBTkdVQUdFIChPUFRJT05fSU5DTFVERV9ESVIgKyAxKQotI2RlZmluZSBPUFRJT05fUFJFUFJPQ0VTU09SIChPUFRJT05fTEFOR1VBR0UgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTiAoT1BUSU9OX1BSRVBST0NFU1NPUiArIDEpCi0jZGVmaW5lIE9QVElPTl9ZWURFQlVHIChPUFRJT05fVkVSU0lPTiArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJkZWZpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0RFRklORX0sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fSEVMUH0sCi0gIHsiaW5jbHVkZS1kaXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0lOQ0xVREVfRElSfSwKLSAgeyJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJsYW5ndWFnZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fTEFOR1VBR0V9LAotICB7Im91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJwcmVwcm9jZXNzb3IiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1BSRVBST0NFU1NPUn0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1ZFUlNJT059LAotICB7Inl5ZGVidWciLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1lZREVCVUd9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBTdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgcmVzX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBleHRlbmRlZF9tZW51aXRlbXMgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnVpdGVtICopKTsKLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQgZm9ybWF0X2Zyb21fbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQgZm9ybWF0X2Zyb21fZmlsZW5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGNtcF9yZXNfZW50cnkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqc29ydF9yZXNvdXJjZXMgUEFSQU1TICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotDAotLyogV2hlbiB3ZSBhcmUgYnVpbGRpbmcgYSByZXNvdXJjZSB0cmVlLCB3ZSBhbGxvY2F0ZSBldmVyeXRoaW5nIG9udG8KLSAgIGFuIG9ic3RhY2ssIHNvIHRoYXQgd2UgY2FuIGZyZWUgaXQgYWxsIGF0IG9uY2UgaWYgd2Ugd2FudC4gICovCi0KLSNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCi0KLS8qIFRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvYnN0YWNrIHJlc19vYnN0YWNrOwotCi0vKiBJbml0aWFsaXplIHRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlc19pbml0ICgpCi17Ci0gIG9ic3RhY2tfaW5pdCAoJnJlc19vYnN0YWNrKTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2Ugb24gdGhlIHJlc291cmNlIGJ1aWxkaW5nIG9ic3RhY2suICAqLwotCi1QVFIKLXJlc19hbGxvYyAoYnl0ZXMpCi0gICAgIHNpemVfdCBieXRlczsKLXsKLSAgcmV0dXJuIChQVFIpIG9ic3RhY2tfYWxsb2MgKCZyZXNfb2JzdGFjaywgYnl0ZXMpOwotfQotCi0vKiBXZSBhbHNvIHVzZSBhbiBvYnN0YWNrIHRvIHNhdmUgbWVtb3J5IHVzZWQgd2hpbGUgd3JpdGluZyBvdXQgYSBzZXQKLSAgIG9mIHJlc291cmNlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayByZXN3cl9vYnN0YWNrOwotCi0vKiBJbml0aWFsaXplIHRoZSByZXNvdXJjZSB3cml0aW5nIG9ic3RhY2suICAqLwotCi1zdGF0aWMgdm9pZAotcmVzd3JfaW5pdCAoKQotewotICBvYnN0YWNrX2luaXQgKCZyZXN3cl9vYnN0YWNrKTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2Ugb24gdGhlIHJlc291cmNlIHdyaXRpbmcgb2JzdGFjay4gICovCi0KLVBUUgotcmVzd3JfYWxsb2MgKGJ5dGVzKQotICAgICBzaXplX3QgYnl0ZXM7Ci17Ci0gIHJldHVybiAoUFRSKSBvYnN0YWNrX2FsbG9jICgmcmVzd3Jfb2JzdGFjaywgYnl0ZXMpOwotfQotDAotLyogT3BlbiBhIGZpbGUgdXNpbmcgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IHNlYXJjaCBsaXN0LiAgKi8KLQotRklMRSAqCi1vcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgbW9kZSwgZXJybXNnLCByZWFsX2ZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbW9kZTsKLSAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICBjaGFyICoqcmVhbF9maWxlbmFtZTsKLXsKLSAgRklMRSAqZTsKLSAgc3RydWN0IGluY2x1ZGVfZGlyICpkOwotCi0gIGUgPSBmb3BlbiAoZmlsZW5hbWUsIG1vZGUpOwotICBpZiAoZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICpyZWFsX2ZpbGVuYW1lID0geHN0cmR1cCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gIGlmIChlcnJubyA9PSBFTk9FTlQpCi0gICAgewotICAgICAgZm9yIChkID0gaW5jbHVkZV9kaXJzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCXsKLQkgIGNoYXIgKm47Ci0KLQkgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGQtPmRpcikgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDIpOwotCSAgc3ByaW50ZiAobiwgIiVzLyVzIiwgZC0+ZGlyLCBmaWxlbmFtZSk7Ci0JICBlID0gZm9wZW4gKG4sIG1vZGUpOwotCSAgaWYgKGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgICpyZWFsX2ZpbGVuYW1lID0gbjsKLQkgICAgICByZXR1cm4gZTsKLQkgICAgfQotCi0JICBpZiAoZXJybm8gIT0gRU5PRU5UKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZhdGFsIChfKCJjYW4ndCBvcGVuICVzIGAlcyc6ICVzIiksIGVycm1zZywgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIC8qIFJldHVybiBhIHZhbHVlIHRvIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZy4gICovCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogQ29tcGFyZSB0d28gcmVzb3VyY2UgSUQncy4gIFdlIGNvbnNpZGVyIG5hbWUgZW50cmllcyB0byBjb21lIGJlZm9yZQotICAgbnVtZXJpYyBlbnRyaWVzLCBiZWNhdXNlIHRoYXQgaXMgaG93IHRoZXkgYXBwZWFyIGluIHRoZSBDT0ZGIC5yc3JjCi0gICBzZWN0aW9uLiAgKi8KLQotaW50Ci1yZXNfaWRfY21wIChhLCBiKQotICAgICBzdHJ1Y3QgcmVzX2lkIGE7Ci0gICAgIHN0cnVjdCByZXNfaWQgYjsKLXsKLSAgaWYgKCEgYS5uYW1lZCkKLSAgICB7Ci0gICAgICBpZiAoYi5uYW1lZCkKLQlyZXR1cm4gMTsKLSAgICAgIGlmIChhLnUuaWQgPiBiLnUuaWQpCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmIChhLnUuaWQgPCBiLnUuaWQpCi0JcmV0dXJuIC0xOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuaWNoYXIgKmFzLCAqYXNlLCAqYnMsICpic2U7Ci0KLSAgICAgIGlmICghIGIubmFtZWQpCi0JcmV0dXJuIC0xOwotCi0gICAgICBhcyA9IGEudS5uLm5hbWU7Ci0gICAgICBhc2UgPSBhcyArIGEudS5uLmxlbmd0aDsKLSAgICAgIGJzID0gYi51Lm4ubmFtZTsKLSAgICAgIGJzZSA9IGJzICsgYi51Lm4ubGVuZ3RoOwotCi0gICAgICB3aGlsZSAoYXMgPCBhc2UpCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmIChicyA+PSBic2UpCi0JICAgIHJldHVybiAxOwotCSAgaSA9IChpbnQpICphcyAtIChpbnQpICpiczsKLQkgIGlmIChpICE9IDApCi0JICAgIHJldHVybiBpOwotCSAgKythczsKLQkgICsrYnM7Ci0JfQotCi0gICAgICBpZiAoYnMgPCBic2UpCi0JcmV0dXJuIC0xOwotCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgcmVzb3VyY2UgSUQuICAqLwotCi12b2lkCi1yZXNfaWRfcHJpbnQgKHN0cmVhbSwgaWQsIHF1b3RlKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGludCBxdW90ZTsKLXsKLSAgaWYgKCEgaWQubmFtZWQpCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiJWx1IiwgaWQudS5pZCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocXVvdGUpCi0JcHV0YyAoJyInLCBzdHJlYW0pOwotICAgICAgdW5pY29kZV9wcmludCAoc3RyZWFtLCBpZC51Lm4ubmFtZSwgaWQudS5uLmxlbmd0aCk7Ci0gICAgICBpZiAocXVvdGUpCi0JcHV0YyAoJyInLCBzdHJlYW0pOwotICAgIH0KLX0KLQotLyogUHJpbnQgYSBsaXN0IG9mIHJlc291cmNlIElEJ3MuICAqLwotCi12b2lkCi1yZXNfaWRzX3ByaW50IChzdHJlYW0sIGNpZHMsIGlkcykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2lkczsgaSsrKQotICAgIHsKLSAgICAgIHJlc19pZF9wcmludCAoc3RyZWFtLCBpZHNbaV0sIDEpOwotICAgICAgaWYgKGkgKyAxIDwgY2lkcykKLQlmcHJpbnRmIChzdHJlYW0sICI6ICIpOwotICAgIH0KLX0KLQotLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSByZXNvdXJjZSBJRC4gICovCi0KLXZvaWQKLXJlc19zdHJpbmdfdG9faWQgKHJlc19pZCwgc3RyaW5nKQotICAgICBzdHJ1Y3QgcmVzX2lkICpyZXNfaWQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgcmVzX2lkLT5uYW1lZCA9IDE7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoJnJlc19pZC0+dS5uLmxlbmd0aCwgJnJlc19pZC0+dS5uLm5hbWUsIHN0cmluZyk7Ci19Ci0KLS8qIERlZmluZSBhIHJlc291cmNlLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHJlc291cmNlIHRyZWUsIFJFU09VUkNFUywKLSAgIGFuZCB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdG8gcHV0IGl0IGluIHRoZSB0cmVlLCBDSURTIGFuZCBJRFMuCi0gICBUaGlzIHJldHVybnMgYSBuZXdseSBhbGxvY2F0ZWQgcmVzX3Jlc291cmNlIHN0cnVjdHVyZSwgd2hpY2ggdGhlCi0gICBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5pdGlhbGl6ZS4gIElmIERVUE9LIGlzIG5vbi16ZXJvLCB0aGVuIGlmIGEKLSAgIHJlc291cmNlIHdpdGggdGhpcyBJRCBleGlzdHMsIGl0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBhIHdhcm5pbmcKLSAgIGlzIGlzc3VlZCwgYW5kIGEgbmV3IHJlc291cmNlIGlzIGNyZWF0ZWQgcmVwbGFjaW5nIHRoZSBleGlzdGluZwotICAgb25lLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1kZWZpbmVfcmVzb3VyY2UgKHJlc291cmNlcywgY2lkcywgaWRzLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIGludCBjaWRzOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZHM7Ci0gICAgIGludCBkdXBvazsKLXsKLSAgc3RydWN0IHJlc19lbnRyeSAqcmUgPSBOVUxMOwotICBpbnQgaTsKLQotICBhc3NlcnQgKGNpZHMgPiAwKTsKLSAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICoqcHA7Ci0KLSAgICAgIGlmICgqcmVzb3VyY2VzID09IE5VTEwpCi0JewotCSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXZhbDsKLQotCSAgLyogVXNlIHRoZSBzYW1lIHRpbWVzdGFtcCBmb3IgZXZlcnkgcmVzb3VyY2UgY3JlYXRlZCBpbiBhCi0gICAgICAgICAgICAgc2luZ2xlIHJ1bi4gICovCi0JICBpZiAodGltZXZhbCA9PSAwKQotCSAgICB0aW1ldmFsID0gdGltZSAoTlVMTCk7Ci0KLQkgICpyZXNvdXJjZXMgPSAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopCi0JCQlyZXNfYWxsb2MgKHNpemVvZiAqKnJlc291cmNlcykpOwotCSAgKCpyZXNvdXJjZXMpLT5jaGFyYWN0ZXJpc3RpY3MgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT50aW1lID0gdGltZXZhbDsKLQkgICgqcmVzb3VyY2VzKS0+bWFqb3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5taW5vciA9IDA7Ci0JICAoKnJlc291cmNlcyktPmVudHJpZXMgPSBOVUxMOwotCX0KLQotICAgICAgZm9yIChwcCA9ICYoKnJlc291cmNlcyktPmVudHJpZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQlpZiAocmVzX2lkX2NtcCAoKCpwcCktPmlkLCBpZHNbaV0pID09IDApCi0JICBicmVhazsKLQotICAgICAgaWYgKCpwcCAhPSBOVUxMKQotCXJlID0gKnBwOwotICAgICAgZWxzZQotCXsKLQkgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKLQkgIHJlLT5uZXh0ID0gTlVMTDsKLQkgIHJlLT5pZCA9IGlkc1tpXTsKLQkgIGlmICgoaSArIDEpIDwgY2lkcykKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAxOwotCSAgICAgIHJlLT51LmRpciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAwOwotCSAgICAgIHJlLT51LnJlcyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnBwID0gcmU7Ci0JfQotCi0gICAgICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JewotCSAgaWYgKCEgcmUtPnN1YmRpcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgaSwgaWRzKTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIpKTsKLQkgICAgICB4ZXhpdCAoMSk7Ci0JICAgIH0KLQotCSAgcmVzb3VyY2VzID0gJnJlLT51LmRpcjsKLQl9Ci0gICAgfQotCi0gIGlmIChyZS0+c3ViZGlyKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGV4cGVjdGVkIHRvIGJlIGEgbGVhZlxuIikpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocmUtPnUucmVzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR1cG9rKQotCXJldHVybiByZS0+dS5yZXM7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6ICIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGR1cGxpY2F0ZSB2YWx1ZVxuIikpOwotICAgIH0KLQotICByZS0+dS5yZXMgPSAoKHN0cnVjdCByZXNfcmVzb3VyY2UgKikKLQkgICAgICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCByZXNfcmVzb3VyY2UpKSk7Ci0KLSAgcmUtPnUucmVzLT50eXBlID0gUkVTX1RZUEVfVU5JTklUSUFMSVpFRDsKLSAgbWVtc2V0ICgmcmUtPnUucmVzLT5yZXNfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0gIG1lbXNldCAoJnJlLT51LnJlcy0+Y29mZl9pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfY29mZl9pbmZvKSk7Ci0KLSAgcmV0dXJuIHJlLT51LnJlczsKLX0KLQotLyogRGVmaW5lIGEgc3RhbmRhcmQgcmVzb3VyY2UuICBUaGlzIGlzIGEgdmVyc2lvbiBvZiBkZWZpbmVfcmVzb3VyY2UKLSAgIHRoYXQganVzdCB0YWtlcyB0eXBlLCBuYW1lLCBhbmQgbGFuZ3VhZ2UgYXJndW1lbnRzLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1kZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKHJlc291cmNlcywgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGR1cG9rKQotICAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKnJlc291cmNlczsKLSAgICAgaW50IHR5cGU7Ci0gICAgIHN0cnVjdCByZXNfaWQgbmFtZTsKLSAgICAgaW50IGxhbmd1YWdlOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfaWQgYVszXTsKLQotICBhWzBdLm5hbWVkID0gMDsKLSAgYVswXS51LmlkID0gdHlwZTsKLSAgYVsxXSA9IG5hbWU7Ci0gIGFbMl0ubmFtZWQgPSAwOwotICBhWzJdLnUuaWQgPSBsYW5ndWFnZTsKLSAgcmV0dXJuIGRlZmluZV9yZXNvdXJjZSAocmVzb3VyY2VzLCAzLCBhLCBkdXBvayk7Ci19Ci0KLS8qIENvbXBhcmlzb24gcm91dGluZSBmb3IgcmVzb3VyY2Ugc29ydGluZy4gICovCi0KLXN0YXRpYyBpbnQKLWNtcF9yZXNfZW50cnkgKHAxLCBwMikKLSAgICAgY29uc3QgUFRSIHAxOwotICAgICBjb25zdCBQVFIgcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKipyZTEsICoqcmUyOwotCi0gIHJlMSA9IChjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqKSBwMTsKLSAgcmUyID0gKGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKiopIHAyOwotICByZXR1cm4gcmVzX2lkX2NtcCAoKCpyZTEpLT5pZCwgKCpyZTIpLT5pZCk7Ci19Ci0KLS8qIFNvcnQgdGhlIHJlc291cmNlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1zb3J0X3Jlc291cmNlcyAocmVzZGlyKQotICAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzZGlyOwotewotICBpbnQgYywgaTsKLSAgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0gIHN0cnVjdCByZXNfZW50cnkgKiphOwotCi0gIGlmIChyZXNkaXItPmVudHJpZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gcmVzZGlyOwotCi0gIGMgPSAwOwotICBmb3IgKHJlID0gcmVzZGlyLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgICsrYzsKLQotICAvKiBUaGlzIGlzIGEgcmVjdXJzaXZlIHJvdXRpbmUsIHNvIHVzaW5nIHhtYWxsb2MgaXMgcHJvYmFibHkgYmV0dGVyCi0gICAgIHRoYW4gYWxsb2NhLiAgKi8KLSAgYSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICoqKSB4bWFsbG9jIChjICogc2l6ZW9mIChzdHJ1Y3QgcmVzX2VudHJ5ICopKTsKLQotICBmb3IgKGkgPSAwLCByZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCwgaSsrKQotICAgIGFbaV0gPSByZTsKLQotICBxc29ydCAoYSwgYywgc2l6ZW9mIChzdHJ1Y3QgcmVzX2VudHJ5ICopLCBjbXBfcmVzX2VudHJ5KTsKLQotICByZXNkaXItPmVudHJpZXMgPSBhWzBdOwotICBmb3IgKGkgPSAwOyBpIDwgYyAtIDE7IGkrKykKLSAgICBhW2ldLT5uZXh0ID0gYVtpICsgMV07Ci0gIGFbaV0tPm5leHQgPSBOVUxMOwotCi0gIGZyZWUgKGEpOwotCi0gIC8qIE5vdyBzb3J0IHRoZSBzdWJkaXJlY3Rvcmllcy4gICovCi0KLSAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICBpZiAocmUtPnN1YmRpcikKLSAgICAgIHJlLT51LmRpciA9IHNvcnRfcmVzb3VyY2VzIChyZS0+dS5kaXIpOwotCi0gIHJldHVybiByZXNkaXI7Ci19Ci0MCi0vKiBSZXR1cm4gd2hldGhlciB0aGUgZGlhbG9nIHJlc291cmNlIERJQUxPRyBpcyBhIERJQUxPRyBvciBhCi0gICBESUFMT0dFWC4gICovCi0KLWludAotZXh0ZW5kZWRfZGlhbG9nIChkaWFsb2cpCi0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpYWxvZ19jb250cm9sICpjOwotCi0gIGlmIChkaWFsb2ctPmV4ICE9IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0KLSAgZm9yIChjID0gZGlhbG9nLT5jb250cm9sczsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dCkKLSAgICBpZiAoYy0+ZGF0YSAhPSBOVUxMIHx8IGMtPmhlbHAgIT0gMCkKLSAgICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBNRU5VSVRFTVMgYXJlIGEgTUVOVSBvciBhIE1FTlVFWC4gICovCi0KLWludAotZXh0ZW5kZWRfbWVudSAobWVudSkKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci17Ci0gIHJldHVybiBleHRlbmRlZF9tZW51aXRlbXMgKG1lbnUtPml0ZW1zKTsKLX0KLQotc3RhdGljIGludAotZXh0ZW5kZWRfbWVudWl0ZW1zIChtZW51aXRlbXMpCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWVudWl0ZW1zOwotewotICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gIGZvciAobWkgPSBtZW51aXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgaWYgKG1pLT5oZWxwICE9IDAgfHwgbWktPnN0YXRlICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwgJiYgbWktPmlkICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKG1pLT50eXBlCi0JICAgJiB+IChNRU5VSVRFTV9DSEVDS0VECi0JCXwgTUVOVUlURU1fR1JBWUVECi0JCXwgTUVOVUlURU1fSEVMUAotCQl8IE1FTlVJVEVNX0lOQUNUSVZFCi0JCXwgTUVOVUlURU1fTUVOVUJBUkJSRUFLCi0JCXwgTUVOVUlURU1fTUVOVUJSRUFLKSkKLQkgICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgaWYgKGV4dGVuZGVkX21lbnVpdGVtcyAobWktPnBvcHVwKSkKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQwKLS8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmb3JtYXQgdHlwZSwgb3IgZXhpdCBpZiBpdCBjYW4ndCBiZSBkb25lLiAgKi8KLQotc3RhdGljIGVudW0gcmVzX2Zvcm1hdAotZm9ybWF0X2Zyb21fbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgKm07Ci0KLSAgZm9yIChtID0gZm9ybWF0X25hbWVzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLSAgICBpZiAoc3RyY2FzZWNtcCAobS0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChtLT5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5rbm93biBmb3JtYXQgdHlwZSBgJXMnXG4iKSwgcHJvZ3JhbV9uYW1lLCBuYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHN1cHBvcnRlZCBmb3JtYXRzOiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgZm9yIChtID0gZm9ybWF0X25hbWVzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLQlmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBtLT5uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIHJldHVybiBtLT5mb3JtYXQ7Ci19Ci0KLS8qIFdvcmsgb3V0IGEgZm9ybWF0IHR5cGUgZ2l2ZW4gYSBmaWxlIG5hbWUuICBJZiBJTlBVVCBpcyBub24temVybywKLSAgIGl0J3MgT0sgdG8gbG9vayBhdCB0aGUgZmlsZSBpdHNlbGYuICAqLwotCi1zdGF0aWMgZW51bSByZXNfZm9ybWF0Ci1mb3JtYXRfZnJvbV9maWxlbmFtZSAoZmlsZW5hbWUsIGlucHV0KQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgaW50IGlucHV0OwotewotICBjb25zdCBjaGFyICpleHQ7Ci0gIEZJTEUgKmU7Ci0gIHVuc2lnbmVkIGNoYXIgYjEsIGIyLCBiMywgYjQsIGI1OwotICBpbnQgbWFnaWM7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbiBleHRlbnNpb24sIHNlZSBpZiB3ZSByZWNvZ25pemUgaXQgYXMgaW1wbHlpbmcgYQotICAgICBwYXJ0aWN1bGFyIGZvcm1hdC4gICovCi0gIGV4dCA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLicpOwotICBpZiAoZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgKm07Ci0KLSAgICAgICsrZXh0OwotICAgICAgZm9yIChtID0gZm9ybWF0X2ZpbGVleHRzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLQlpZiAoc3RyY2FzZWNtcCAobS0+bmFtZSwgZXh0KSA9PSAwKQotCSAgcmV0dXJuIG0tPmZvcm1hdDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgZG9uJ3QgcmVjb2duaXplIHRoZSBuYW1lIG9mIGFuIG91dHB1dCBmaWxlLCBhc3N1bWUgaXQncyBhCi0gICAgIENPRkYgZmlsZS4gICovCi0KLSAgaWYgKCEgaW5wdXQpCi0gICAgcmV0dXJuIFJFU19GT1JNQVRfQ09GRjsKLQotICAvKiBSZWFkIHRoZSBmaXJzdCBmZXcgYnl0ZXMgb2YgdGhlIGZpbGUgdG8gc2VlIGlmIHdlIGNhbiBndWVzcyB3aGF0Ci0gICAgIGl0IGlzLiAgKi8KLQotICBlID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gIGlmIChlID09IE5VTEwpCi0gICAgZmF0YWwgKCIlczogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgYjEgPSBnZXRjIChlKTsKLSAgYjIgPSBnZXRjIChlKTsKLSAgYjMgPSBnZXRjIChlKTsKLSAgYjQgPSBnZXRjIChlKTsKLSAgYjUgPSBnZXRjIChlKTsKLQotICBmY2xvc2UgKGUpOwotCi0gIC8qIEEgUEUgZXhlY3V0YWJsZSBzdGFydHMgd2l0aCAweDRkIDB4NWEuICAqLwotICBpZiAoYjEgPT0gMHg0ZCAmJiBiMiA9PSAweDVhKQotICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0KLSAgLyogQSBDT0ZGIC5vIGZpbGUgc3RhcnRzIHdpdGggYSBDT0ZGIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljID0gKGIyIDw8IDgpIHwgYjE7Ci0gIHN3aXRjaCAobWFnaWMpCi0gICAgewotICAgIGNhc2UgMHgxNGM6IC8qIGkzODYgKi8KLSAgICBjYXNlIDB4MTY2OiAvKiBNSVBTICovCi0gICAgY2FzZSAweDE4NDogLyogQWxwaGEgKi8KLSAgICBjYXNlIDB4MjY4OiAvKiA2OGsgKi8KLSAgICBjYXNlIDB4MWYwOiAvKiBQb3dlclBDICovCi0gICAgY2FzZSAweDI5MDogLyogUEEgKi8KLSAgICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0gICAgfQotCi0gIC8qIEEgUkVTIGZpbGUgc3RhcnRzIHdpdGggMHgwIDB4MCAweDAgMHgwIDB4MjAgMHgwIDB4MCAweDAuICAqLwotICBpZiAoYjEgPT0gMCAmJiBiMiA9PSAwICYmIGIzID09IDAgJiYgYjQgPT0gMCAmJiBiNSA9PSAweDIwKQotICAgIHJldHVybiBSRVNfRk9STUFUX1JFUzsKLQotICAvKiBJZiBldmVyeSBjaGFyYWN0ZXIgaXMgcHJpbnRhYmxlIG9yIHNwYWNlLCBhc3N1bWUgaXQncyBhbiBSQyBmaWxlLiAgKi8KLSAgaWYgKChpc3ByaW50IChiMSkgfHwgaXNzcGFjZSAoYjEpKQotICAgICAgJiYgKGlzcHJpbnQgKGIyKSB8fCBpc3NwYWNlIChiMikpCi0gICAgICAmJiAoaXNwcmludCAoYjMpIHx8IGlzc3BhY2UgKGIzKSkKLSAgICAgICYmIChpc3ByaW50IChiNCkgfHwgaXNzcGFjZSAoYjQpKQotICAgICAgJiYgKGlzcHJpbnQgKGI1KSB8fCBpc3NwYWNlIChiNSkpKQotICAgIHJldHVybiBSRVNfRk9STUFUX1JDOwotCi0gIC8qIE90aGVyd2lzZSwgd2UgZ2l2ZSB1cC4gICovCi0gIGZhdGFsIChfKCJjYW4gbm90IGRldGVybWluZSB0eXBlIG9mIGZpbGUgYCVzJzsgdXNlIHRoZSAtSSBvcHRpb24iKSwKLQkgZmlsZW5hbWUpOwotCi0gIC8qIFJldHVybiBzb21ldGhpbmcgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIgd2FybmluZy4gICovCi0gIHJldHVybiBSRVNfRk9STUFUX1VOS05PV047Ci19Ci0KLS8qIFByaW50IGEgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4gICovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgW29wdGlvbnNdIFtpbnB1dC1maWxlXSBbb3V0cHV0LWZpbGVdXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLU9wdGlvbnM6XG5cCi0gIC1pIEZJTEUsIC0taW5wdXQgRklMRSAgICAgICBOYW1lIGlucHV0IGZpbGVcblwKLSAgLW8gRklMRSwgLS1vdXRwdXQgRklMRSAgICAgIE5hbWUgb3V0cHV0IGZpbGVcblwKLSAgLUkgRk9STUFULCAtLWlucHV0LWZvcm1hdCBGT1JNQVRcblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgaW5wdXQgZm9ybWF0XG5cCi0gIC1PIEZPUk1BVCwgLS1vdXRwdXQtZm9ybWF0IEZPUk1BVFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBvdXRwdXQgZm9ybWF0XG5cCi0gIC1GIFRBUkdFVCwgLS10YXJnZXQgVEFSR0VUICBTcGVjaWZ5IENPRkYgdGFyZ2V0XG5cCi0gIC0tcHJlcHJvY2Vzc29yIFBST0dSQU0gICAgICBQcm9ncmFtIHRvIHVzZSB0byBwcmVwcm9jZXNzIHJjIGZpbGVcblwKLSAgLS1pbmNsdWRlLWRpciBESVIgICAgICAgICAgIEluY2x1ZGUgZGlyZWN0b3J5IHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG5cCi0gIC1EU1lNWz1WQUxdLCAtLWRlZmluZSBTWU1bPVZBTF1cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSBTWU0gd2hlbiBwcmVwcm9jZXNzaW5nIHJjIGZpbGVcblwKLSAgLXYgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcmJvc2UgLSB0ZWxscyB5b3Ugd2hhdCBpdCdzIGRvaW5nXG5cCi0gIC0tbGFuZ3VhZ2UgVkFMICAgICAgICAgICAgICBTZXQgbGFuZ3VhZ2Ugd2hlbiByZWFkaW5nIHJjIGZpbGVcbiIpKTsKLSNpZmRlZiBZWURFQlVHCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLXl5ZGVidWcgICAgICAgICAgICAgICAgICAgVHVybiBvbiBwYXJzZXIgZGVidWdnaW5nXG4iKSk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuXAotICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAgUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvblxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLUZPUk1BVCBpcyBvbmUgb2YgcmMsIHJlcywgb3IgY29mZiwgYW5kIGlzIGRlZHVjZWQgZnJvbSB0aGUgZmlsZSBuYW1lXG5cCi1leHRlbnNpb24gaWYgbm90IHNwZWNpZmllZC4gIEEgc2luZ2xlIGZpbGUgbmFtZSBpcyBhbiBpbnB1dCBmaWxlLlxuXAotTm8gaW5wdXQtZmlsZSBpcyBzdGRpbiwgZGVmYXVsdCByYy4gIE5vIG91dHB1dC1maWxlIGlzIHN0ZG91dCwgZGVmYXVsdCByYy5cbiIpKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogUXVvdGUgY2hhcmFjdGVycyB0aGF0IHdpbGwgY29uZnVzZSB0aGUgc2hlbGwgd2hlbiB3ZSBydW4gdGhlIHByZXByb2Nlc3NvciAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnF1b3QgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdGF0aWMgY2hhciAqYnVmID0gMDsKLSAgc3RhdGljIGludCBidWZsZW4gPSAwOwotICBpbnQgc2xlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgY29uc3QgY2hhciAqc3JjOwotICBjaGFyICpkZXN0OwotCi0gIGlmICgoYnVmbGVuIDwgc2xlbiAqIDIgKyAyKSB8fCAhYnVmKQotICAgIHsKLSAgICAgIGJ1ZmxlbiA9IHNsZW4gKiAyICsgMjsKLSAgICAgIGlmIChidWYpCi0JZnJlZSAoYnVmKTsKLSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGJ1Zmxlbik7Ci0gICAgfQotCi0gIGZvciAoc3JjPXN0cmluZywgZGVzdD1idWY7ICpzcmM7IHNyYysrLCBkZXN0KyspCi0gICAgewotICAgICAgaWYgKCpzcmMgPT0gJygnIHx8ICpzcmMgPT0gJyknIHx8ICpzcmMgPT0gJyAnKQotCSpkZXN0KysgPSAnXFwnOwotICAgICAgKmRlc3QgPSAqc3JjOwotICAgIH0KLSAgKmRlc3QgPSAwOwotICByZXR1cm4gYnVmOwotfQotCi0vKiBUaGUgbWFpbiBmdW5jdGlvbi4gICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgY2hhciAqaW5wdXRfZmlsZW5hbWU7Ci0gIGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLSAgZW51bSByZXNfZm9ybWF0IGlucHV0X2Zvcm1hdDsKLSAgZW51bSByZXNfZm9ybWF0IG91dHB1dF9mb3JtYXQ7Ci0gIGNoYXIgKnRhcmdldDsKLSAgY2hhciAqcHJlcHJvY2Vzc29yOwotICBjaGFyICpwcmVwcm9jYXJnczsKLSAgY29uc3QgY2hhciAqcXVvdGVkYXJnOwotICBpbnQgbGFuZ3VhZ2U7Ci0gIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgcmVzX2luaXQgKCk7Ci0KLSAgaW5wdXRfZmlsZW5hbWUgPSBOVUxMOwotICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotICBpbnB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1VOS05PV047Ci0gIG91dHB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1VOS05PV047Ci0gIHRhcmdldCA9IE5VTEw7Ci0gIHByZXByb2Nlc3NvciA9IE5VTEw7Ci0gIHByZXByb2NhcmdzID0gTlVMTDsKLSAgbGFuZ3VhZ2UgPSAtMTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImk6bzpJOk86RjpEOnYiLCBsb25nX29wdGlvbnMsCi0JCQkgICAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdpJzoKLQkgIGlucHV0X2ZpbGVuYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICdvJzoKLQkgIG91dHB1dF9maWxlbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6Ci0JICBpbnB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9uYW1lIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdPJzoKLQkgIG91dHB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9uYW1lIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIHRhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fUFJFUFJPQ0VTU09SOgotCSAgcHJlcHJvY2Vzc29yID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICdEJzoKLQljYXNlIE9QVElPTl9ERUZJTkU6Ci0JICBpZiAocHJlcHJvY2FyZ3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHF1b3RlZGFyZyA9IHF1b3QgKG9wdGFyZyk7Ci0JICAgICAgcHJlcHJvY2FyZ3MgPSB4bWFsbG9jIChzdHJsZW4gKHF1b3RlZGFyZykgKyAzKTsKLQkgICAgICBzcHJpbnRmIChwcmVwcm9jYXJncywgIi1EJXMiLCBxdW90ZWRhcmcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpuOwotCi0JICAgICAgcXVvdGVkYXJnID0gcXVvdCAob3B0YXJnKTsKLQkgICAgICBuID0geG1hbGxvYyAoc3RybGVuIChwcmVwcm9jYXJncykgKyBzdHJsZW4gKHF1b3RlZGFyZykgKyA0KTsKLQkgICAgICBzcHJpbnRmIChuLCAiJXMgLUQlcyIsIHByZXByb2NhcmdzLCBxdW90ZWRhcmcpOwotCSAgICAgIGZyZWUgKHByZXByb2NhcmdzKTsKLQkgICAgICBwcmVwcm9jYXJncyA9IG47Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAndic6Ci0JICB2ZXJib3NlICsrOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JTkNMVURFX0RJUjoKLQkgIGlmIChwcmVwcm9jYXJncyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcXVvdGVkYXJnID0gcXVvdCAob3B0YXJnKTsKLQkgICAgICBwcmVwcm9jYXJncyA9IHhtYWxsb2MgKHN0cmxlbiAocXVvdGVkYXJnKSArIDMpOwotCSAgICAgIHNwcmludGYgKHByZXByb2NhcmdzLCAiLUklcyIsIHF1b3RlZGFyZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBxdW90ZWRhcmcgPSBxdW90IChvcHRhcmcpOwotCSAgICAgIG4gPSB4bWFsbG9jIChzdHJsZW4gKHByZXByb2NhcmdzKSArIHN0cmxlbiAocXVvdGVkYXJnKSArIDQpOwotCSAgICAgIHNwcmludGYgKG4sICIlcyAtSSVzIiwgcHJlcHJvY2FyZ3MsIHF1b3RlZGFyZyk7Ci0JICAgICAgZnJlZSAocHJlcHJvY2FyZ3MpOwotCSAgICAgIHByZXByb2NhcmdzID0gbjsKLQkgICAgfQotCi0JICB7Ci0JICAgIHN0cnVjdCBpbmNsdWRlX2RpciAqbiwgKipwcDsKLQotCSAgICBuID0gKHN0cnVjdCBpbmNsdWRlX2RpciAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gTlVMTDsKLQkgICAgbi0+ZGlyID0gb3B0YXJnOwotCi0JICAgIGZvciAocHAgPSAmaW5jbHVkZV9kaXJzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgICAgOwotCSAgICAqcHAgPSBuOwotCSAgfQotCi0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0xBTkdVQUdFOgotCSAgbGFuZ3VhZ2UgPSBzdHJ0b2wgKG9wdGFyZywgKGNoYXIgKiopIE5VTEwsIDE2KTsKLQkgIGJyZWFrOwotCi0jaWZkZWYgWVlERUJVRwotCWNhc2UgT1BUSU9OX1lZREVCVUc6Ci0JICB5eWRlYnVnID0gMTsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlIE9QVElPTl9IRUxQOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1ZFUlNJT046Ci0JICBwcmludF92ZXJzaW9uICgid2luZHJlcyIpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpbnB1dF9maWxlbmFtZSA9PSBOVUxMICYmIG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgaW5wdXRfZmlsZW5hbWUgPSBhcmd2W29wdGluZF07Ci0gICAgICArK29wdGluZDsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9maWxlbmFtZSA9PSBOVUxMICYmIG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICAgICAgKytvcHRpbmQ7Ci0gICAgfQotCi0gIGlmIChhcmdjICE9IG9wdGluZCkKLSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQotICBpZiAoaW5wdXRfZm9ybWF0ID09IFJFU19GT1JNQVRfVU5LTk9XTikKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRfZmlsZW5hbWUgPT0gTlVMTCkKLQlpbnB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1JDOwotICAgICAgZWxzZQotCWlucHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIChpbnB1dF9maWxlbmFtZSwgMSk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfZm9ybWF0ID09IFJFU19GT1JNQVRfVU5LTk9XTikKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGVuYW1lID09IE5VTEwpCi0Jb3V0cHV0X2Zvcm1hdCA9IFJFU19GT1JNQVRfUkM7Ci0gICAgICBlbHNlCi0Jb3V0cHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIChvdXRwdXRfZmlsZW5hbWUsIDApOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBpbnB1dCBmaWxlLiAgKi8KLQotICBzd2l0Y2ggKGlucHV0X2Zvcm1hdCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SQzoKLSAgICAgIHJlc291cmNlcyA9IHJlYWRfcmNfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsCi0JCQkJbGFuZ3VhZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVNfRk9STUFUX1JFUzoKLSAgICAgIHJlc291cmNlcyA9IHJlYWRfcmVzX2ZpbGUgKGlucHV0X2ZpbGVuYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9DT0ZGOgotICAgICAgcmVzb3VyY2VzID0gcmVhZF9jb2ZmX3JzcmMgKGlucHV0X2ZpbGVuYW1lLCB0YXJnZXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChyZXNvdXJjZXMgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygibm8gcmVzb3VyY2VzIikpOwotCi0gIC8qIFNvcnQgdGhlIHJlc291cmNlcy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIENPRkYsIGNvbnZlbmllbnQgZm9yCi0gICAgIHJjLCBhbmQgdW5pbXBvcnRhbnQgZm9yIHJlcy4gICovCi0KLSAgcmVzb3VyY2VzID0gc29ydF9yZXNvdXJjZXMgKHJlc291cmNlcyk7Ci0KLSAgLyogV3JpdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICByZXN3cl9pbml0ICgpOwotCi0gIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SQzoKLSAgICAgIHdyaXRlX3JjX2ZpbGUgKG91dHB1dF9maWxlbmFtZSwgcmVzb3VyY2VzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SRVM6Ci0gICAgICB3cml0ZV9yZXNfZmlsZSAob3V0cHV0X2ZpbGVuYW1lLCByZXNvdXJjZXMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVNfRk9STUFUX0NPRkY6Ci0gICAgICB3cml0ZV9jb2ZmX2ZpbGUgKG91dHB1dF9maWxlbmFtZSwgdGFyZ2V0LCByZXNvdXJjZXMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHhleGl0ICgwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmRyZXMuaCBiL2JpbnV0aWxzL3dpbmRyZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0M2RkNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kcmVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NDkgKzAsMCBAQAotLyogd2luZHJlcy5oIC0tIGhlYWRlciBmaWxlIGZvciB3aW5kcmVzIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBUaGlzIGlzIHRoZSBoZWFkZXIgZmlsZSBmb3IgdGhlIHdpbmRyZXMgcHJvZ3JhbS4gIEl0IGRlZmluZXMKLSAgIHN0cnVjdHVyZXMgYW5kIGRlY2xhcmVzIGZ1bmN0aW9ucyB1c2VkIHdpdGhpbiB0aGUgcHJvZ3JhbS4gICovCi0KLSNpbmNsdWRlICJ3aW5kdW5pLmgiCi0KLS8qIFdlIHJlcHJlc2VudCByZXNvdXJjZXMgaW50ZXJuYWxseSBhcyBhIHRyZWUsIHNpbWlsYXIgdG8gdGhlIHRyZWUKLSAgIHVzZWQgaW4gdGhlIC5yc3JjIHNlY3Rpb24gb2YgYSBDT0ZGIGZpbGUuICBUaGUgcm9vdCBpcyBhCi0gICByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCByZXNfZGlyZWN0b3J5Ci17Ci0gIC8qIFJlc291cmNlIGZsYWdzLiAgQWNjb3JkaW5nIHRvIHRoZSBNUyBkb2NzLCB0aGlzIGlzIGN1cnJlbnRseQotICAgICBhbHdheXMgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgY2hhcmFjdGVyaXN0aWNzOwotICAvKiBUaW1lL2RhdGUgc3RhbXAuICAqLwotICB1bnNpZ25lZCBsb25nIHRpbWU7Ci0gIC8qIE1ham9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWFqb3I7Ci0gIC8qIE1pbm9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWlub3I7Ci0gIC8qIERpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLSAgc3RydWN0IHJlc19lbnRyeSAqZW50cmllczsKLX07Ci0KLS8qIEEgcmVzb3VyY2UgSUQgaXMgc3RvcmVkIGluIGEgcmVzX2lkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCByZXNfaWQKLXsKLSAgLyogTm9uLXplcm8gaWYgdGhpcyBlbnRyeSBoYXMgYSBuYW1lIHJhdGhlciB0aGFuIGFuIElELiAgKi8KLSAgdW5zaWduZWQgaW50IG5hbWVkIDogMTsKLSAgdW5pb24KLSAgewotICAgIC8qIElmIHRoZSBuYW1lZCBmaWVsZCBpcyBub24temVybywgdGhpcyBpcyB0aGUgbmFtZS4gICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogTGVuZ3RoIG9mIHRoZSBuYW1lLiAgKi8KLSAgICAgIGludCBsZW5ndGg7Ci0gICAgICAvKiBQb2ludGVyIHRvIHRoZSBuYW1lLCB3aGljaCBpcyBhIFVuaWNvZGUgc3RyaW5nLiAgKi8KLSAgICAgIHVuaWNoYXIgKm5hbWU7Ci0gICAgfSBuOwotICAgIC8qIElmIHRoZSBuYW1lZCBmaWVsZCBpcyB6ZXJvLCB0aGlzIGlzIHRoZSBJRC4gICovCi0gICAgdW5zaWduZWQgbG9uZyBpZDsKLSAgfSB1OwotfTsKLQotLyogRWFjaCBlbnRyeSBpbiB0aGUgdHJlZSBpcyBhIHJlc19lbnRyeSBzdHJ1Y3R1cmUuICBXZSBtaXgKLSAgIGRpcmVjdG9yaWVzIGFuZCByZXNvdXJjZXMgYmVjYXVzZSBpbiBhIENPRkYgZmlsZSBhbGwgZW50cmllcyBpbiBhCi0gICBkaXJlY3RvcnkgYXJlIHNvcnRlZCB0b2dldGhlciwgd2hldGhlciB0aGUgZW50cmllcyBhcmUKLSAgIHN1YmRpcmVjdG9yaWVzIG9yIHJlc291cmNlcy4gICovCi0KLXN0cnVjdCByZXNfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeS4gICovCi0gIHN0cnVjdCByZXNfZW50cnkgKm5leHQ7Ci0gIC8qIFJlc291cmNlIElELiAgKi8KLSAgc3RydWN0IHJlc19pZCBpZDsKLSAgLyogTm9uLXplcm8gaWYgdGhpcyBlbnRyeSBpcyBhIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBhIGxlYWYuICAqLwotICB1bnNpZ25lZCBpbnQgc3ViZGlyIDogMTsKLSAgdW5pb24KLSAgewotICAgIC8qIElmIHRoZSBzdWJkaXIgZmllbGQgaXMgbm9uLXplcm8sIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZQotICAgICAgIHN1YmRpcmVjdG9yeS4gICovCi0gICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKmRpcjsKLSAgICAvKiBJZiB0aGUgc3ViZGlyIGZpZWxkIGlzIHplcm8sIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZQotICAgICAgIGRhdGEuICAqLwotICAgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgfSB1OwotfTsKLQotLyogVHlwZXMgb2YgcmVzb3VyY2VzLiAgKi8KLQotZW51bSByZXNfdHlwZQotewotICBSRVNfVFlQRV9VTklOSVRJQUxJWkVELAotICBSRVNfVFlQRV9BQ0NFTEVSQVRPUiwKLSAgUkVTX1RZUEVfQklUTUFQLAotICBSRVNfVFlQRV9DVVJTT1IsCi0gIFJFU19UWVBFX0dST1VQX0NVUlNPUiwKLSAgUkVTX1RZUEVfRElBTE9HLAotICBSRVNfVFlQRV9GT05ULAotICBSRVNfVFlQRV9GT05URElSLAotICBSRVNfVFlQRV9JQ09OLAotICBSRVNfVFlQRV9HUk9VUF9JQ09OLAotICBSRVNfVFlQRV9NRU5VLAotICBSRVNfVFlQRV9NRVNTQUdFVEFCTEUsCi0gIFJFU19UWVBFX1JDREFUQSwKLSAgUkVTX1RZUEVfU1RSSU5HVEFCTEUsCi0gIFJFU19UWVBFX1VTRVJEQVRBLAotICBSRVNfVFlQRV9WRVJTSU9OSU5GTwotfTsKLQotLyogQSByZXMgZmlsZSBhbmQgYSBDT0ZGIGZpbGUgc3RvcmUgaW5mb3JtYXRpb24gZGlmZmVyZW50bHkuICBUaGUKLSAgIHJlc19pbmZvIHN0cnVjdHVyZXMgaG9sZHMgZGF0YSB3aGljaCBpbiBhIHJlcyBmaWxlIGlzIHN0b3JlZCB3aXRoCi0gICBlYWNoIHJlc291cmNlLCBidXQgaW4gYSBDT0ZGIGZpbGUgaXMgc3RvcmVkIGVsc2V3aGVyZS4gICovCi0KLXN0cnVjdCByZXNfcmVzX2luZm8KLXsKLSAgLyogTGFuZ3VhZ2UuICBJbiBhIENPRkYgZmlsZSwgdGhlIHRoaXJkIGxldmVsIG9mIHRoZSBkaXJlY3RvcnkgaXMKLSAgICAga2V5ZWQgYnkgdGhlIGxhbmd1YWdlLCBzbyB0aGUgbGFuZ3VhZ2Ugb2YgYSByZXNvdXJjZSBpcyBkZWZpbmVkCi0gICAgIGJ5IGl0cyBsb2NhdGlvbiBpbiB0aGUgcmVzb3VyY2UgdHJlZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IGxhbmd1YWdlOwotICAvKiBDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHJlc291cmNlLiAgRW50aXJlbHkgdXNlciBkZWZpbmVkLiAgSW4gYQotICAgICBDT0ZGIGZpbGUsIHRoZSByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZSBoYXMgYSBjaGFyYWN0ZXJpc3RpY3MKLSAgICAgZmllbGQsIGJ1dCBJIGRvbid0IGtub3cgaWYgaXQncyByZWxhdGVkIHRvIHRoZSBvbmUgaW4gdGhlIHJlcwotICAgICBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBjaGFyYWN0ZXJpc3RpY3M7Ci0gIC8qIFZlcnNpb24gb2YgdGhlIHJlc291cmNlLiAgRW50aXJlbHkgdXNlciBkZWZpbmVkLiAgSW4gYSBDT0ZGIGZpbGUsCi0gICAgIHRoZSByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZSBoYXMgYSBjaGFyYWN0ZXJpc3RpY3MgZmllbGQsIGJ1dCBJCi0gICAgIGRvbid0IGtub3cgaWYgaXQncyByZWxhdGVkIHRvIHRoZSBvbmUgaW4gdGhlIHJlcyBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB2ZXJzaW9uOwotICAvKiBNZW1vcnkgZmxhZ3MuICBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIE1FTUZMQUcgdmFsdWVzCi0gICAgIGRlZmluZWQgYmVsb3cuICBNb3N0IG9mIHRoZXNlIHZhbHVlcyBhcmUgaGlzdG9yaWNhbCwgYW5kIGFyZSBub3QKLSAgICAgbWVhbmluZ2Z1bCBmb3Igd2luMzIuICBJIGRvbid0IHRoaW5rIHRoZXJlIGlzIGFueSB3YXkgdG8gc3RvcmUKLSAgICAgdGhpcyBpbmZvcm1hdGlvbiBpbiBhIENPRkYgZmlsZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1lbWZsYWdzOwotfTsKLQotLyogRWFjaCByZXNvdXJjZSBpbiBhIENPRkYgZmlsZSBoYXMgc29tZSBpbmZvcm1hdGlvbiB3aGljaCBjYW4gZG9lcwotICAgbm90IGFwcGVhciBpbiBhIHJlcyBmaWxlLiAgKi8KLQotc3RydWN0IHJlc19jb2ZmX2luZm8KLXsKLSAgLyogVGhlIGNvZGUgcGFnZSB1c2VkIGZvciB0aGUgZGF0YS4gIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGlzCi0gICAgIHNob3VsZCBiZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgY29kZXBhZ2U7Ci0gIC8qIEEgcmVzb3VyY2UgZW50cnkgaW4gYSBDT0ZGIGZpbGUgaGFzIGEgcmVzZXJ2ZWQgZmllbGQsIHdoaWNoIHdlCi0gICAgIHJlY29yZCBoZXJlIHdoZW4gcmVhZGluZyBhIENPRkYgZmlsZS4gIFdoZW4gd3JpdGluZyBhIENPRkYgZmlsZSwKLSAgICAgd2Ugc2V0IHRoaXMgZmllbGQgdG8gemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQ7Ci19OwotCi0vKiBSZXNvdXJjZSBkYXRhIGlzIHN0b3JlZCBpbiBhIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlCi17Ci0gIC8qIFRoZSB0eXBlIG9mIHJlc291cmNlLiAgKi8KLSAgZW51bSByZXNfdHlwZSB0eXBlOwotICAvKiBUaGUgZGF0YSBmb3IgdGhlIHJlc291cmNlLiAgKi8KLSAgdW5pb24KLSAgewotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICB9IGRhdGE7Ci0gICAgc3RydWN0IGFjY2VsZXJhdG9yICphY2M7Ci0gICAgc3RydWN0IGN1cnNvciAqY3Vyc29yOwotICAgIHN0cnVjdCBncm91cF9jdXJzb3IgKmdyb3VwX2N1cnNvcjsKLSAgICBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci0gICAgc3RydWN0IGZvbnRkaXIgKmZvbnRkaXI7Ci0gICAgc3RydWN0IGdyb3VwX2ljb24gKmdyb3VwX2ljb247Ci0gICAgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgc3RydWN0IHJjZGF0YV9pdGVtICpyY2RhdGE7Ci0gICAgc3RydWN0IHN0cmluZ3RhYmxlICpzdHJpbmd0YWJsZTsKLSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnVzZXJkYXRhOwotICAgIHN0cnVjdCB2ZXJzaW9uaW5mbyAqdmVyc2lvbmluZm87Ci0gIH0gdTsKLSAgLyogSW5mb3JtYXRpb24gZnJvbSBhIHJlcyBmaWxlLiAgKi8KLSAgc3RydWN0IHJlc19yZXNfaW5mbyByZXNfaW5mbzsKLSAgLyogSW5mb3JtYXRpb24gZnJvbSBhIENPRkYgZmlsZS4gICovCi0gIHN0cnVjdCByZXNfY29mZl9pbmZvIGNvZmZfaW5mbzsKLX07Ci0KLS8qIE1lbW9yeSBmbGFncyBpbiB0aGUgbWVtZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcmVzX3Jlc291cmNlLiAgKi8KLQotI2RlZmluZSBNRU1GTEFHX01PVkVBQkxFCTB4MTAKLSNkZWZpbmUgTUVNRkxBR19QVVJFCQkweDIwCi0jZGVmaW5lIE1FTUZMQUdfUFJFTE9BRAkJMHg0MAotI2RlZmluZSBNRU1GTEFHX0RJU0NBUkRBQkxFCTB4MTAwMAotCi0vKiBTdGFuZGFyZCByZXNvdXJjZSB0eXBlIGNvZGVzLiAgVGhlc2UgYXJlIHVzZWQgaW4gdGhlIElEIGZpZWxkIG9mIGEKLSAgIHJlc19lbnRyeSBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFJUX0NVUlNPUgkJIDEKLSNkZWZpbmUgUlRfQklUTUFQCQkgMgotI2RlZmluZSBSVF9JQ09OCQkJIDMKLSNkZWZpbmUgUlRfTUVOVQkJCSA0Ci0jZGVmaW5lIFJUX0RJQUxPRwkJIDUKLSNkZWZpbmUgUlRfU1RSSU5HCQkgNgotI2RlZmluZSBSVF9GT05URElSCQkgNwotI2RlZmluZSBSVF9GT05UCQkJIDgKLSNkZWZpbmUgUlRfQUNDRUxFUkFUT1IJCSA5Ci0jZGVmaW5lIFJUX1JDREFUQQkJMTAKLSNkZWZpbmUgUlRfTUVTU0FHRVRBQkxFCQkxMQotI2RlZmluZSBSVF9HUk9VUF9DVVJTT1IJCTEyCi0jZGVmaW5lIFJUX0dST1VQX0lDT04JCTE0Ci0jZGVmaW5lIFJUX1ZFUlNJT04JCTE2Ci0jZGVmaW5lIFJUX0RMR0lOQ0xVREUJCTE3Ci0jZGVmaW5lIFJUX1BMVUdQTEFZCQkxOQotI2RlZmluZSBSVF9WWEQJCQkyMAotI2RlZmluZSBSVF9BTklDVVJTT1IJCTIxCi0jZGVmaW5lIFJUX0FOSUlDT04JCTIyCi0KLS8qIEFuIGFjY2VsZXJhdG9yIHJlc291cmNlIGlzIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBhY2NlbGVyYXRvcgotewotICAvKiBOZXh0IGFjY2VsZXJhdG9yLiAgKi8KLSAgc3RydWN0IGFjY2VsZXJhdG9yICpuZXh0OwotICAvKiBGbGFncy4gIEEgY29tYmluYXRpb24gb2YgdGhlIEFDQyB2YWx1ZXMgZGVmaW5lZCBiZWxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGZsYWdzOwotICAvKiBLZXkgdmFsdWUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBrZXk7Ci0gIC8qIFJlc291cmNlIElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci19OwotCi0vKiBBY2NlbGVyYXRvciBmbGFncyBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgYWNjZWxlcmF0b3IuCi0gICBUaGVzZSBhcmUgdGhlIHNhbWUgdmFsdWVzIHRoYXQgYXBwZWFyIGluIGEgcmVzIGZpbGUuICBJIGhvcGUuICAqLwotCi0jZGVmaW5lIEFDQ19WSVJUS0VZCTB4MDEKLSNkZWZpbmUgQUNDX05PSU5WRVJUCTB4MDIKLSNkZWZpbmUgQUNDX1NISUZUCTB4MDQKLSNkZWZpbmUgQUNDX0NPTlRST0wJMHgwOAotI2RlZmluZSBBQ0NfQUxUCQkweDEwCi0jZGVmaW5lIEFDQ19MQVNUCTB4ODAKLQotLyogQSBjdXJzb3IgcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgY3Vyc29yCi17Ci0gIC8qIFggY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgc2hvcnQgeGhvdHNwb3Q7Ci0gIC8qIFkgY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgc2hvcnQgeWhvdHNwb3Q7Ci0gIC8qIExlbmd0aCBvZiBiaXRtYXAgZGF0YS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAvKiBEYXRhLiAgKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLX07Ci0KLS8qIEEgZ3JvdXBfY3Vyc29yIHJlc291cmNlIGlzIGEgbGlzdCBvZiBncm91cF9jdXJzb3Igc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBncm91cF9jdXJzb3IKLXsKLSAgLyogTmV4dCBjdXJzb3IgaW4gZ3JvdXAuICAqLwotICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpuZXh0OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0gIC8qIFBsYW5lcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IHBsYW5lczsKLSAgLyogQml0cyBwZXIgcGl4ZWwuICAqLwotICB1bnNpZ25lZCBzaG9ydCBiaXRzOwotICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBieXRlczsKLSAgLyogSW5kZXggb2YgY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaW5kZXg7Ci19OwotCi0vKiBBIGRpYWxvZyByZXNvdXJjZS4gICovCi0KLXN0cnVjdCBkaWFsb2cKLXsKLSAgLyogQmFzaWMgd2luZG93IHN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzdHlsZTsKLSAgLyogRXh0ZW5kZWQgd2luZG93IHN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBleHN0eWxlOwotICAvKiBYIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB4OwotICAvKiBZIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB5OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0gIC8qIE1lbnUgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgbWVudTsKLSAgLyogQ2xhc3MgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgY2xhc3M7Ci0gIC8qIENhcHRpb24uICAqLwotICB1bmljaGFyICpjYXB0aW9uOwotICAvKiBGb250IHBvaW50IHNpemUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBwb2ludHNpemU7Ci0gIC8qIEZvbnQgbmFtZS4gICovCi0gIHVuaWNoYXIgKmZvbnQ7Ci0gIC8qIEV4dGVuZGVkIGluZm9ybWF0aW9uIGZvciBhIGRpYWxvZ2V4LiAgKi8KLSAgc3RydWN0IGRpYWxvZ19leCAqZXg7Ci0gIC8qIENvbnRyb2xzLiAgKi8KLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpjb250cm9sczsKLX07Ci0KLS8qIEFuIGV4dGVuZGVkIGRpYWxvZyBoYXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBkaWFsb2dfZXgKLXsKLSAgLyogSGVscCBJRC4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGVscDsKLSAgLyogRm9udCB3ZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCB3ZWlnaHQ7Ci0gIC8qIFdoZXRoZXIgdGhlIGZvbnQgaXMgaXRhbGljLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaXRhbGljOwotfTsKLQotLyogV2luZG93IHN0eWxlIGZsYWdzLCBmcm9tIHRoZSB3aW5zdXAgRGVmaW5lcy5oIGhlYWRlciBmaWxlLiAgVGhlc2UKLSAgIGNhbiBhcHBlYXIgaW4gdGhlIHN0eWxlIGZpZWxkIG9mIGEgc3RydWN0IGRpYWxvZyBvciBhIHN0cnVjdAotICAgZGlhbG9nX2NvbnRyb2wuICAqLwotCi0jZGVmaW5lIENXX1VTRURFRkFVTFQJKDB4ODAwMDAwMDApCi0jZGVmaW5lIFdTX0JPUkRFUgkoMHg4MDAwMDBMKQotI2RlZmluZSBXU19DQVBUSU9OCSgweGMwMDAwMEwpCi0jZGVmaW5lIFdTX0NISUxECSgweDQwMDAwMDAwTCkKLSNkZWZpbmUgV1NfQ0hJTERXSU5ET1cJKDB4NDAwMDAwMDBMKQotI2RlZmluZSBXU19DTElQQ0hJTERSRU4JKDB4MjAwMDAwMEwpCi0jZGVmaW5lIFdTX0NMSVBTSUJMSU5HUwkoMHg0MDAwMDAwTCkKLSNkZWZpbmUgV1NfRElTQUJMRUQJKDB4ODAwMDAwMEwpCi0jZGVmaW5lIFdTX0RMR0ZSQU1FCSgweDQwMDAwMEwpCi0jZGVmaW5lIFdTX0dST1VQCSgweDIwMDAwTCkKLSNkZWZpbmUgV1NfSFNDUk9MTAkoMHgxMDAwMDBMKQotI2RlZmluZSBXU19JQ09OSUMJKDB4MjAwMDAwMDBMKQotI2RlZmluZSBXU19NQVhJTUlaRQkoMHgxMDAwMDAwTCkKLSNkZWZpbmUgV1NfTUFYSU1JWkVCT1gJKDB4MTAwMDBMKQotI2RlZmluZSBXU19NSU5JTUlaRQkoMHgyMDAwMDAwMEwpCi0jZGVmaW5lIFdTX01JTklNSVpFQk9YCSgweDIwMDAwTCkKLSNkZWZpbmUgV1NfT1ZFUkxBUFBFRAkoMEwpCi0jZGVmaW5lIFdTX09WRVJMQVBQRURXSU5ET1cJKDB4Y2YwMDAwTCkKLSNkZWZpbmUgV1NfUE9QVVAJKDB4ODAwMDAwMDBMKQotI2RlZmluZSBXU19QT1BVUFdJTkRPVwkoMHg4MDg4MDAwMEwpCi0jZGVmaW5lIFdTX1NJWkVCT1gJKDB4NDAwMDBMKQotI2RlZmluZSBXU19TWVNNRU5VCSgweDgwMDAwTCkKLSNkZWZpbmUgV1NfVEFCU1RPUAkoMHgxMDAwMEwpCi0jZGVmaW5lIFdTX1RISUNLRlJBTUUJKDB4NDAwMDBMKQotI2RlZmluZSBXU19USUxFRAkoMEwpCi0jZGVmaW5lIFdTX1RJTEVEV0lORE9XCSgweGNmMDAwMEwpCi0jZGVmaW5lIFdTX1ZJU0lCTEUJKDB4MTAwMDAwMDBMKQotI2RlZmluZSBXU19WU0NST0xMCSgweDIwMDAwMEwpCi0jZGVmaW5lIE1ESVNfQUxMQ0hJTERTVFlMRVMJKDB4MSkKLSNkZWZpbmUgQlNfM1NUQVRFCSgweDVMKQotI2RlZmluZSBCU19BVVRPM1NUQVRFCSgweDZMKQotI2RlZmluZSBCU19BVVRPQ0hFQ0tCT1gJKDB4M0wpCi0jZGVmaW5lIEJTX0FVVE9SQURJT0JVVFRPTgkoMHg5TCkKLSNkZWZpbmUgQlNfQklUTUFQCSgweDgwTCkKLSNkZWZpbmUgQlNfQk9UVE9NCSgweDgwMEwpCi0jZGVmaW5lIEJTX0NFTlRFUgkoMHgzMDBMKQotI2RlZmluZSBCU19DSEVDS0JPWAkoMHgyTCkKLSNkZWZpbmUgQlNfREVGUFVTSEJVVFRPTgkoMHgxTCkKLSNkZWZpbmUgQlNfR1JPVVBCT1gJKDB4N0wpCi0jZGVmaW5lIEJTX0lDT04JKDB4NDBMKQotI2RlZmluZSBCU19MRUZUCSgweDEwMEwpCi0jZGVmaW5lIEJTX0xFRlRURVhUCSgweDIwTCkKLSNkZWZpbmUgQlNfTVVMVElMSU5FCSgweDIwMDBMKQotI2RlZmluZSBCU19OT1RJRlkJKDB4NDAwMEwpCi0jZGVmaW5lIEJTX09XTkVSRFJBVwkoMHhiTCkKLSNkZWZpbmUgQlNfUFVTSEJPWAkoMHhjTCkJCS8qIEZJWE1FISAgV2hhdCBzaG91bGQgdGhpcyBiZT8gICovCi0jZGVmaW5lIEJTX1BVU0hCVVRUT04JKDBMKQotI2RlZmluZSBCU19QVVNITElLRQkoMHgxMDAwTCkKLSNkZWZpbmUgQlNfUkFESU9CVVRUT04JKDB4NEwpCi0jZGVmaW5lIEJTX1JJR0hUCSgweDIwMEwpCi0jZGVmaW5lIEJTX1JJR0hUQlVUVE9OCSgweDIwTCkKLSNkZWZpbmUgQlNfVEVYVAkoMEwpCi0jZGVmaW5lIEJTX1RPUAkoMHg0MDBMKQotI2RlZmluZSBCU19VU0VSQlVUVE9OCSgweDhMKQotI2RlZmluZSBCU19WQ0VOVEVSCSgweGMwMEwpCi0jZGVmaW5lIENCU19BVVRPSFNDUk9MTAkoMHg0MEwpCi0jZGVmaW5lIENCU19ESVNBQkxFTk9TQ1JPTEwJKDB4ODAwTCkKLSNkZWZpbmUgQ0JTX0RST1BET1dOCSgweDJMKQotI2RlZmluZSBDQlNfRFJPUERPV05MSVNUCSgweDNMKQotI2RlZmluZSBDQlNfSEFTU1RSSU5HUwkoMHgyMDBMKQotI2RlZmluZSBDQlNfTE9XRVJDQVNFCSgweDQwMDBMKQotI2RlZmluZSBDQlNfTk9JTlRFR1JBTEhFSUdIVAkoMHg0MDBMKQotI2RlZmluZSBDQlNfT0VNQ09OVkVSVAkoMHg4MEwpCi0jZGVmaW5lIENCU19PV05FUkRSQVdGSVhFRAkoMHgxMEwpCi0jZGVmaW5lIENCU19PV05FUkRSQVdWQVJJQUJMRQkoMHgyMEwpCi0jZGVmaW5lIENCU19TSU1QTEUJKDB4MUwpCi0jZGVmaW5lIENCU19TT1JUCSgweDEwMEwpCi0jZGVmaW5lIENCU19VUFBFUkNBU0UJKDB4MjAwMEwpCi0jZGVmaW5lIEVTX0FVVE9IU0NST0xMCSgweDgwTCkKLSNkZWZpbmUgRVNfQVVUT1ZTQ1JPTEwJKDB4NDBMKQotI2RlZmluZSBFU19DRU5URVIJKDB4MUwpCi0jZGVmaW5lIEVTX0xFRlQJKDBMKQotI2RlZmluZSBFU19MT1dFUkNBU0UJKDB4MTBMKQotI2RlZmluZSBFU19NVUxUSUxJTkUJKDB4NEwpCi0jZGVmaW5lIEVTX05PSElERVNFTAkoMHgxMDBMKQotI2RlZmluZSBFU19OVU1CRVIJKDB4MjAwMEwpCi0jZGVmaW5lIEVTX09FTUNPTlZFUlQJKDB4NDAwTCkKLSNkZWZpbmUgRVNfUEFTU1dPUkQJKDB4MjBMKQotI2RlZmluZSBFU19SRUFET05MWQkoMHg4MDBMKQotI2RlZmluZSBFU19SSUdIVAkoMHgyTCkKLSNkZWZpbmUgRVNfVVBQRVJDQVNFCSgweDhMKQotI2RlZmluZSBFU19XQU5UUkVUVVJOCSgweDEwMDBMKQotI2RlZmluZSBMQlNfRElTQUJMRU5PU0NST0xMCSgweDEwMDBMKQotI2RlZmluZSBMQlNfRVhURU5ERURTRUwJKDB4ODAwTCkKLSNkZWZpbmUgTEJTX0hBU1NUUklOR1MJKDB4NDBMKQotI2RlZmluZSBMQlNfTVVMVElDT0xVTU4JKDB4MjAwTCkKLSNkZWZpbmUgTEJTX01VTFRJUExFU0VMCSgweDhMKQotI2RlZmluZSBMQlNfTk9EQVRBCSgweDIwMDBMKQotI2RlZmluZSBMQlNfTk9JTlRFR1JBTEhFSUdIVAkoMHgxMDBMKQotI2RlZmluZSBMQlNfTk9SRURSQVcJKDB4NEwpCi0jZGVmaW5lIExCU19OT1NFTAkoMHg0MDAwTCkKLSNkZWZpbmUgTEJTX05PVElGWQkoMHgxTCkKLSNkZWZpbmUgTEJTX09XTkVSRFJBV0ZJWEVECSgweDEwTCkKLSNkZWZpbmUgTEJTX09XTkVSRFJBV1ZBUklBQkxFCSgweDIwTCkKLSNkZWZpbmUgTEJTX1NPUlQJKDB4MkwpCi0jZGVmaW5lIExCU19TVEFOREFSRAkoMHhhMDAwMDNMKQotI2RlZmluZSBMQlNfVVNFVEFCU1RPUFMJKDB4ODBMKQotI2RlZmluZSBMQlNfV0FOVEtFWUJPQVJESU5QVVQJKDB4NDAwTCkKLSNkZWZpbmUgU0JTX0JPVFRPTUFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfSE9SWgkoMEwpCi0jZGVmaW5lIFNCU19MRUZUQUxJR04JKDB4MkwpCi0jZGVmaW5lIFNCU19SSUdIVEFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfU0laRUJPWAkoMHg4TCkKLSNkZWZpbmUgU0JTX1NJWkVCT1hCT1RUT01SSUdIVEFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfU0laRUJPWFRPUExFRlRBTElHTgkoMHgyTCkKLSNkZWZpbmUgU0JTX1NJWkVHUklQCSgweDEwTCkKLSNkZWZpbmUgU0JTX1RPUEFMSUdOCSgweDJMKQotI2RlZmluZSBTQlNfVkVSVAkoMHgxTCkKLSNkZWZpbmUgU1NfQklUTUFQCSgweGVMKQotI2RlZmluZSBTU19CTEFDS0ZSQU1FCSgweDdMKQotI2RlZmluZSBTU19CTEFDS1JFQ1QJKDB4NEwpCi0jZGVmaW5lIFNTX0NFTlRFUgkoMHgxTCkKLSNkZWZpbmUgU1NfQ0VOVEVSSU1BR0UJKDB4MjAwTCkKLSNkZWZpbmUgU1NfRU5ITUVUQUZJTEUJKDB4ZkwpCi0jZGVmaW5lIFNTX0VUQ0hFREZSQU1FCSgweDEyTCkKLSNkZWZpbmUgU1NfRVRDSEVESE9SWgkoMHgxMEwpCi0jZGVmaW5lIFNTX0VUQ0hFRFZFUlQJKDB4MTFMKQotI2RlZmluZSBTU19HUkFZRlJBTUUJKDB4OEwpCi0jZGVmaW5lIFNTX0dSQVlSRUNUCSgweDVMKQotI2RlZmluZSBTU19JQ09OCSgweDNMKQotI2RlZmluZSBTU19MRUZUCSgwTCkKLSNkZWZpbmUgU1NfTEVGVE5PV09SRFdSQVAJKDB4Y0wpCi0jZGVmaW5lIFNTX05PUFJFRklYCSgweDgwTCkKLSNkZWZpbmUgU1NfTk9USUZZCSgweDEwMEwpCi0jZGVmaW5lIFNTX09XTkVSRFJBVwkoMHhkTCkKLSNkZWZpbmUgU1NfUkVBTFNJWkVJTUFHRQkoMHg4MDBMKQotI2RlZmluZSBTU19SSUdIVAkoMHgyTCkKLSNkZWZpbmUgU1NfUklHSFRKVVNUCSgweDQwMEwpCi0jZGVmaW5lIFNTX1NJTVBMRQkoMHhiTCkKLSNkZWZpbmUgU1NfU1VOS0VOCSgweDEwMDBMKQotI2RlZmluZSBTU19VU0VSSVRFTSAgICAgKDB4YUwpCi0jZGVmaW5lIFNTX1dISVRFRlJBTUUJKDB4OUwpCi0jZGVmaW5lIFNTX1dISVRFUkVDVAkoMHg2TCkKLSNkZWZpbmUgRFNfM0RMT09LCSgweDRMKQotI2RlZmluZSBEU19BQlNBTElHTgkoMHgxTCkKLSNkZWZpbmUgRFNfQ0VOVEVSCSgweDgwMEwpCi0jZGVmaW5lIERTX0NFTlRFUk1PVVNFCSgweDEwMDBMKQotI2RlZmluZSBEU19DT05URVhUSEVMUAkoMHgyMDAwTCkKLSNkZWZpbmUgRFNfQ09OVFJPTAkoMHg0MDBMKQotI2RlZmluZSBEU19GSVhFRFNZUwkoMHg4TCkKLSNkZWZpbmUgRFNfTE9DQUxFRElUCSgweDIwTCkKLSNkZWZpbmUgRFNfTU9EQUxGUkFNRQkoMHg4MEwpCi0jZGVmaW5lIERTX05PRkFJTENSRUFURQkoMHgxMEwpCi0jZGVmaW5lIERTX05PSURMRU1TRwkoMHgxMDBMKQotI2RlZmluZSBEU19TRVRGT05UCSgweDQwTCkKLSNkZWZpbmUgRFNfU0VURk9SRUdST1VORAkoMHgyMDBMKQotI2RlZmluZSBEU19TWVNNT0RBTAkoMHgyTCkKLQotLyogQSBkaWFsb2cgY29udHJvbC4gICovCi0KLXN0cnVjdCBkaWFsb2dfY29udHJvbAotewotICAvKiBOZXh0IGNvbnRyb2wuICAqLwotICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKm5leHQ7Ci0gIC8qIElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci0gIC8qIFN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzdHlsZTsKLSAgLyogRXh0ZW5kZWQgc3R5bGUuICAqLwotICB1bnNpZ25lZCBsb25nIGV4c3R5bGU7Ci0gIC8qIFggY29vcmRpbmF0ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHg7Ci0gIC8qIFkgY29vcmRpbmF0ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHk7Ci0gIC8qIFdpZHRoLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgd2lkdGg7Ci0gIC8qIEhlaWdodC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGhlaWdodDsKLSAgLyogQ2xhc3MgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgY2xhc3M7Ci0gIC8qIEFzc29jaWF0ZWQgdGV4dC4gICovCi0gIHN0cnVjdCByZXNfaWQgdGV4dDsKLSAgLyogRXh0cmEgZGF0YSBmb3IgdGhlIHdpbmRvdyBwcm9jZWR1cmUuICAqLwotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRhdGE7Ci0gIC8qIEhlbHAgSUQuICBPbmx5IHVzZWQgaW4gYW4gZXh0ZW5kZWQgZGlhbG9nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoZWxwOwotfTsKLQotLyogQ29udHJvbCBjbGFzc2VzLiAgVGhlc2UgY2FuIGJlIHVzZWQgYXMgdGhlIElEIGZpZWxkIGluIGEgc3RydWN0Ci0gICBkaWFsb2dfY29udHJvbC4gICovCi0KLSNkZWZpbmUgQ1RMX0JVVFRPTgkweDgwCi0jZGVmaW5lIENUTF9FRElUCTB4ODEKLSNkZWZpbmUgQ1RMX1NUQVRJQwkweDgyCi0jZGVmaW5lIENUTF9MSVNUQk9YCTB4ODMKLSNkZWZpbmUgQ1RMX1NDUk9MTEJBUgkweDg0Ci0jZGVmaW5lIENUTF9DT01CT0JPWAkweDg1Ci0KLS8qIEEgZm9udGRpciByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZm9udGRpciBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGZvbnRkaXIKLXsKLSAgc3RydWN0IGZvbnRkaXIgKm5leHQ7Ci0gIC8qIEluZGV4IG9mIGZvbnQgZW50cnkuICAqLwotICBzaG9ydCBpbmRleDsKLSAgLyogTGVuZ3RoIG9mIGZvbnQgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgLyogRm9udCBpbmZvcm1hdGlvbi4gKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLX07Ci0KLS8qIEEgZ3JvdXBfaWNvbiByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZ3JvdXBfaWNvbiBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGdyb3VwX2ljb24KLXsKLSAgLyogTmV4dCBpY29uIGluIGdyb3VwLiAgKi8KLSAgc3RydWN0IGdyb3VwX2ljb24gKm5leHQ7Ci0gIC8qIFdpZHRoLiAgKi8KLSAgdW5zaWduZWQgY2hhciB3aWR0aDsKLSAgLyogSGVpZ2h0LiAgKi8KLSAgdW5zaWduZWQgY2hhciBoZWlnaHQ7Ci0gIC8qIENvbG9yIGNvdW50LiAgKi8KLSAgdW5zaWduZWQgY2hhciBjb2xvcnM7Ci0gIC8qIFBsYW5lcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IHBsYW5lczsKLSAgLyogQml0cyBwZXIgcGl4ZWwuICAqLwotICB1bnNpZ25lZCBzaG9ydCBiaXRzOwotICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBieXRlczsKLSAgLyogSW5kZXggb2YgY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaW5kZXg7Ci19OwotCi0vKiBBIG1lbnUgcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgbWVudQotewotICAvKiBMaXN0IG9mIG1lbnVpdGVtcy4gICovCi0gIHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gIC8qIEhlbHAgSUQuICBJIGRvbid0IHRoaW5rIHRoZXJlIGlzIGFueSB3YXkgdG8gc2V0IHRoaXMgaW4gYW4gcmMKLSAgICAgZmlsZSwgYnV0IGl0IGNhbiBhcHBlYXIgaW4gdGhlIGJpbmFyeSBmb3JtYXQuICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci19OwotCi0vKiBBIG1lbnUgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIG1lbnVpdGVtIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgbWVudWl0ZW0KLXsKLSAgLyogTmV4dCBtZW51aXRlbS4gICovCi0gIHN0cnVjdCBtZW51aXRlbSAqbmV4dDsKLSAgLyogVHlwZS4gIEluIGEgbm9ybWFsIG1lbnUsIHJhdGhlciB0aGFuIGEgbWVudWV4LCB0aGlzIGlzIHRoZSBmbGFncwotICAgICBmaWVsZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgdHlwZTsKLSAgLyogU3RhdGUuICBUaGlzIGlzIG9ubHkgdXNlZCBpbiBhIG1lbnVleC4gICovCi0gIHVuc2lnbmVkIGxvbmcgc3RhdGU7Ci0gIC8qIElkLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci0gIC8qIFVuaWNvZGUgdGV4dC4gICovCi0gIHVuaWNoYXIgKnRleHQ7Ci0gIC8qIFBvcHVwIG1lbnUgaXRlbXMgZm9yIGEgcG9wdXAuICAqLwotICBzdHJ1Y3QgbWVudWl0ZW0gKnBvcHVwOwotICAvKiBIZWxwIElELiAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gYSBtZW51ZXguICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci19OwotCi0vKiBNZW51IGl0ZW0gZmxhZ3MuICBUaGVzZSBjYW4gYXBwZWFyIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdAotICAgbWVudWl0ZW0uICAqLwotCi0jZGVmaW5lIE1FTlVJVEVNX0dSQVlFRAkJMHgwMDEKLSNkZWZpbmUgTUVOVUlURU1fSU5BQ1RJVkUJMHgwMDIKLSNkZWZpbmUgTUVOVUlURU1fQklUTUFQCQkweDAwNAotI2RlZmluZSBNRU5VSVRFTV9PV05FUkRSQVcJMHgxMDAKLSNkZWZpbmUgTUVOVUlURU1fQ0hFQ0tFRAkweDAwOAotI2RlZmluZSBNRU5VSVRFTV9QT1BVUAkJMHgwMTAKLSNkZWZpbmUgTUVOVUlURU1fTUVOVUJBUkJSRUFLCTB4MDIwCi0jZGVmaW5lIE1FTlVJVEVNX01FTlVCUkVBSwkweDA0MAotI2RlZmluZSBNRU5VSVRFTV9FTkRNRU5VCTB4MDgwCi0jZGVmaW5lIE1FTlVJVEVNX0hFTFAJICAgICAgIDB4NDAwMAotCi0vKiBBbiByY2RhdGEgcmVzb3VyY2UgaXMgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiByY2RhdGFfaXRlbQotICAgc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCByY2RhdGFfaXRlbQotewotICAvKiBOZXh0IGRhdGEgaXRlbS4gICovCi0gIHN0cnVjdCByY2RhdGFfaXRlbSAqbmV4dDsKLSAgLyogVHlwZSBvZiBkYXRhLiAgKi8KLSAgZW51bQotICB7Ci0gICAgUkNEQVRBX1dPUkQsCi0gICAgUkNEQVRBX0RXT1JELAotICAgIFJDREFUQV9TVFJJTkcsCi0gICAgUkNEQVRBX1dTVFJJTkcsCi0gICAgUkNEQVRBX0JVRkZFUgotICB9IHR5cGU7Ci0gIHVuaW9uCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgd29yZDsKLSAgICB1bnNpZ25lZCBsb25nIGR3b3JkOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgY2hhciAqczsKLSAgICB9IHN0cmluZzsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IHVuaWNoYXIgKnc7Ci0gICAgfSB3c3RyaW5nOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICB9IGJ1ZmZlcjsKLSAgfSB1OwotfTsKLQotLyogQSBzdHJpbmd0YWJsZSByZXNvdXJjZSBpcyBhIHBvaW50ZXIgdG8gYSBzdHJpbmd0YWJsZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3Qgc3RyaW5ndGFibGUKLXsKLSAgLyogRWFjaCBzdHJpbmd0YWJsZSByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgMTYgdW5pY29kZSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0Ci0gIHsKLSAgICAvKiBMZW5ndGggb2Ygc3RyaW5nLiAgKi8KLSAgICBpbnQgbGVuZ3RoOwotICAgIC8qIFN0cmluZyBkYXRhIGlmIGxlbmd0aCA+IDAuICAqLwotICAgIHVuaWNoYXIgKnN0cmluZzsKLSAgfSBzdHJpbmdzWzE2XTsKLX07Ci0KLS8qIEEgdmVyc2lvbmluZm8gcmVzb3VyY2UgcG9pbnRzIHRvIGEgdmVyc2lvbmluZm8gc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHZlcnNpb25pbmZvCi17Ci0gIC8qIEZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpeGVkOwotICAvKiBWYXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IHZlcl9pbmZvICp2YXI7Ci19OwotCi0vKiBUaGUgZml4ZWQgcG9ydGlvbiBvZiBhIHZlcnNpb25pbmZvIHJlc291cmNlLiAgKi8KLQotc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvCi17Ci0gIC8qIFRoZSBmaWxlIHZlcnNpb24sIHdoaWNoIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfdmVyc2lvbl9tczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX3ZlcnNpb25fbHM7Ci0gIC8qIFRoZSBwcm9kdWN0IHZlcnNpb24sIHdoaWNoIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLwotICB1bnNpZ25lZCBsb25nIHByb2R1Y3RfdmVyc2lvbl9tczsKLSAgdW5zaWduZWQgbG9uZyBwcm9kdWN0X3ZlcnNpb25fbHM7Ci0gIC8qIFRoZSBmaWxlIGZsYWdzIG1hc2suICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfZmxhZ3NfbWFzazsKLSAgLyogVGhlIGZpbGUgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfZmxhZ3M7Ci0gIC8qIFRoZSBPUyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX29zOwotICAvKiBUaGUgZmlsZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX3R5cGU7Ci0gIC8qIFRoZSBmaWxlIHN1YnR5cGUuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfc3VidHlwZTsKLSAgLyogVGhlIGRhdGUsIHdoaWNoIGluIFdpbmRvd3MgaXMgdHdvIDMyIGJpdCBpbnRlZ2Vycy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9kYXRlX21zOwotICB1bnNpZ25lZCBsb25nIGZpbGVfZGF0ZV9sczsKLX07Ci0KLS8qIEEgbGlzdCBvZiB2YXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl9pbmZvCi17Ci0gIC8qIE5leHQgaXRlbS4gICovCi0gIHN0cnVjdCB2ZXJfaW5mbyAqbmV4dDsKLSAgLyogVHlwZSBvZiBkYXRhLiAgKi8KLSAgZW51bSB7IFZFUklORk9fU1RSSU5HLCBWRVJJTkZPX1ZBUiB9IHR5cGU7Ci0gIHVuaW9uCi0gIHsKLSAgICAvKiBTdHJpbmdGaWxlSW5mbyBkYXRhLiAgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBMYW5ndWFnZS4gICovCi0gICAgICB1bmljaGFyICpsYW5ndWFnZTsKLSAgICAgIC8qIFN0cmluZ3MuICAqLwotICAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotICAgIH0gc3RyaW5nOwotICAgIC8qIFZhckZpbGVJbmZvIGRhdGEuICAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIEtleS4gICovCi0gICAgICB1bmljaGFyICprZXk7Ci0gICAgICAvKiBWYWx1ZXMuICAqLwotICAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2YXI7Ci0gICAgfSB2YXI7Ci0gIH0gdTsKLX07Ci0KLS8qIEEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfc3RyaW5naW5mbwotewotICAvKiBOZXh0IHN0cmluZy4gICovCi0gIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqbmV4dDsKLSAgLyogS2V5LiAgKi8KLSAgdW5pY2hhciAqa2V5OwotICAvKiBWYWx1ZS4gICovCi0gIHVuaWNoYXIgKnZhbHVlOwotfTsKLQotLyogQSBsaXN0IG9mIHZhcmlhYmxlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgdmVyX3ZhcmluZm8KLXsKLSAgLyogTmV4dCBpdGVtLiAgKi8KLSAgc3RydWN0IHZlcl92YXJpbmZvICpuZXh0OwotICAvKiBMYW5ndWFnZSBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGxhbmd1YWdlOwotICAvKiBDaGFyYWN0ZXIgc2V0IElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY2hhcnNldDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHJlc291cmNlIGluZm9ybWF0aW9uIHRvCi0gICBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgYmluZGF0YQotewotICAvKiBOZXh0IGRhdGEuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqbmV4dDsKLSAgLyogTGVuZ3RoIG9mIGRhdGEuICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgLyogRGF0YS4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci19OwotCi1leHRlcm4gaW50IHZlcmJvc2U7Ci0KLS8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gICovCi0KLWV4dGVybiBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVhZF9yY19maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZWFkX3Jlc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZWFkX2NvZmZfcnNyYwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgd3JpdGVfcmNfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLWV4dGVybiB2b2lkIHdyaXRlX3Jlc19maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotZXh0ZXJuIHZvaWQgd3JpdGVfY29mZl9maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1leHRlcm4gc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBpbnQpKTsKLQotZXh0ZXJuIEZJTEUgKm9wZW5fZmlsZV9zZWFyY2gKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKikpOwotCi1leHRlcm4gUFRSIHJlc19hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgcmVzd3JfYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLS8qIFJlc291cmNlIElEIGhhbmRsaW5nLiAgKi8KLQotZXh0ZXJuIGludCByZXNfaWRfY21wIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIHN0cnVjdCByZXNfaWQpKTsKLWV4dGVybiB2b2lkIHJlc19pZF9wcmludCBQQVJBTVMgKChGSUxFICosIHN0cnVjdCByZXNfaWQsIGludCkpOwotZXh0ZXJuIHZvaWQgcmVzX2lkc19wcmludCBQQVJBTVMgKChGSUxFICosIGludCwgY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7Ci1leHRlcm4gdm9pZCByZXNfc3RyaW5nX3RvX2lkIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIE1hbmlwdWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdHJlZS4gICovCi0KLWV4dGVybiBzdHJ1Y3QgcmVzX3Jlc291cmNlICpkZWZpbmVfcmVzb3VyY2UKLSAgUEFSQU1TICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKiosIGludCwgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQpKTsKLWV4dGVybiBzdHJ1Y3QgcmVzX3Jlc291cmNlICpkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UKLSAgUEFSQU1TICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKiosIGludCwgc3RydWN0IHJlc19pZCwgaW50LCBpbnQpKTsKLQotZXh0ZXJuIGludCBleHRlbmRlZF9kaWFsb2cgUEFSQU1TICgoY29uc3Qgc3RydWN0IGRpYWxvZyAqKSk7Ci1leHRlcm4gaW50IGV4dGVuZGVkX21lbnUgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnUgKikpOwotCi0vKiBDb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHJjIGZpbGUgc3VwcG9ydCBhbmQgdGhlIHBhcnNlciBhbmQgbGV4ZXIuICAqLwotCi1leHRlcm4gaW50IHl5ZGVidWc7Ci1leHRlcm4gRklMRSAqeXlpbjsKLWV4dGVybiBjaGFyICpyY19maWxlbmFtZTsKLWV4dGVybiBpbnQgcmNfbGluZW5vOwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHJjcGFyc2Vfd2FybmluZyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHJjcGFyc2Vfc2V0X2xhbmd1YWdlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV9kaXNjYXJkX3N0cmluZ3MgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV9yY2RhdGEgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV9ub3JtYWwgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBkZWZpbmVfYWNjZWxlcmF0b3IKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2JpdG1hcAotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2N1cnNvcgotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2RpYWxvZwotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IHN0cnVjdCBkaWFsb2cgKikpOwotZXh0ZXJuIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqZGVmaW5lX2NvbnRyb2wKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCSAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JICAgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2ZvbnQKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9pY29uCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfbWVudQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHN0cnVjdCBtZW51aXRlbSAqKSk7Ci1leHRlcm4gc3RydWN0IG1lbnVpdGVtICpkZWZpbmVfbWVudWl0ZW0KLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JICAgc3RydWN0IG1lbnVpdGVtICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9tZXNzYWdldGFibGUKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9yY2RhdGEKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikpOwotZXh0ZXJuIHN0cnVjdCByY2RhdGFfaXRlbSAqZGVmaW5lX3JjZGF0YV9zdHJpbmcKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gc3RydWN0IHJjZGF0YV9pdGVtICpkZWZpbmVfcmNkYXRhX251bWJlciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZmluZV9zdHJpbmd0YWJsZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3VzZXJfZGF0YQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosCi0JICAgc3RydWN0IHJjZGF0YV9pdGVtICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV91c2VyX2ZpbGUKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLAotCSAgIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3ZlcnNpb25pbmZvCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGludCwgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICosCi0JICAgc3RydWN0IHZlcl9pbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgdmVyX2luZm8gKmFwcGVuZF92ZXJfc3RyaW5nZmlsZWluZm8KLSAgUEFSQU1TICgoc3RydWN0IHZlcl9pbmZvICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IHZlcl9zdHJpbmdpbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgdmVyX2luZm8gKmFwcGVuZF92ZXJfdmFyZmlsZWluZm8KLSAgUEFSQU1TICgoc3RydWN0IHZlcl9pbmZvICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IHZlcl92YXJpbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKmFwcGVuZF92ZXJ2YWwKLSAgUEFSQU1TICgoc3RydWN0IHZlcl9zdHJpbmdpbmZvICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IHZlcl92YXJpbmZvICphcHBlbmRfdmVydHJhbnMKLSAgUEFSQU1TICgoc3RydWN0IHZlcl92YXJpbmZvICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmR1bmkuYyBiL2JpbnV0aWxzL3dpbmR1bmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5ZjQ3YS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kdW5pLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyogd2luZHVuaS5jIC0tIHVuaWNvZGUgc3VwcG9ydCBmb3IgdGhlIHdpbmRyZXMgcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHVuaWNvZGUgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIHdpbmRyZXMKLSAgIHByb2dyYW0uICBJZGVhbGx5LCB3ZSB3b3VsZCBoYXZlIGdlbmVyaWMgdW5pY29kZSBzdXBwb3J0IHdoaWNoCi0gICB3b3VsZCB3b3JrIG9uIGFsbCBzeXN0ZW1zLiAgSG93ZXZlciwgd2UgZG9uJ3QuICBJbnN0ZWFkLCBvbiBhCi0gICBXaW5kb3dzIGhvc3QsIHdlIGFyZSBwcmVwYXJlZCB0byBjYWxsIHNvbWUgV2luZG93cyByb3V0aW5lcy4gIFRoaXMKLSAgIG1lYW5zIHRoYXQgd2Ugd2lsbCBnZW5lcmF0ZSBkaWZmZXJlbnQgb3V0cHV0IG9uIFdpbmRvd3MgYW5kIFVuaXgKLSAgIGhvc3RzLCBidXQgdGhhdCBzZWVtcyBiZXR0ZXIgdGhhbiBub3QgcmVhbGx5IHN1cHBvcnRpbmcgdW5pY29kZSBhdAotICAgYWxsLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgIndpbmR1bmkuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIHN0cmluZy4gIFdlIGp1c3QgY29weSBpdCwKLSAgIGV4cGFuZGluZyBjaGFycyB0byBzaG9ydHMsIHJhdGhlciB0aGFuIGRvaW5nIHNvbWV0aGluZyBpbnRlbGxpZ2VudC4gICovCi0KLXZvaWQKLXVuaWNvZGVfZnJvbV9hc2NpaSAobGVuZ3RoLCB1bmljb2RlLCBhc2NpaSkKLSAgICAgaW50ICpsZW5ndGg7Ci0gICAgIHVuaWNoYXIgKip1bmljb2RlOwotICAgICBjb25zdCBjaGFyICphc2NpaTsKLXsKLSAgaW50IGxlbjsKLSAgY29uc3QgY2hhciAqczsKLSAgdW5zaWduZWQgc2hvcnQgKnc7Ci0KLSAgbGVuID0gc3RybGVuIChhc2NpaSk7Ci0KLSAgaWYgKGxlbmd0aCAhPSBOVUxMKQotICAgICpsZW5ndGggPSBsZW47Ci0KLSAgKnVuaWNvZGUgPSAoKHVuaWNoYXIgKikgcmVzX2FsbG9jICgobGVuICsgMSkgKiBzaXplb2YgKHVuaWNoYXIpKSk7Ci0KLSNpZmRlZiBfV0lOMzIKLSAgLyogRklYTUU6IE9uIFdpbmRvd3MsIHdlIHNob3VsZCBiZSB1c2luZyBNdWx0aUJ5dGVUb1dpZGVDaGFyIHRvIHNldAotICAgICB0aGUgbGVuZ3RoLiAgKi8KLSAgTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ1BfQUNQLCAwLCBhc2NpaSwgbGVuICsgMSwgKnVuaWNvZGUsIGxlbiArIDEpOwotI2Vsc2UKLSAgZm9yIChzID0gYXNjaWksIHcgPSAqdW5pY29kZTsgKnMgIT0gJ1wwJzsgcysrLCB3KyspCi0gICAgKncgPSAqcyAmIDB4ZmY7Ci0gICp3ID0gMDsKLSNlbmRpZgotfQotCi0vKiBQcmludCB0aGUgdW5pY29kZSBzdHJpbmcgVU5JQ09ERSB0byB0aGUgZmlsZSBFLiAgTEVOR1RIIGlzIHRoZQotICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJpbnQsIG9yIC0xIGlmIHdlIHNob3VsZCBwcmludCB1bnRpbCB0aGUKLSAgIGVuZCBvZiB0aGUgc3RyaW5nLiAgRklYTUU6IE9uIGEgV2luZG93cyBob3N0LCB3ZSBzaG91bGQgYmUgY2FsbGluZwotICAgc29tZSBXaW5kb3dzIGZ1bmN0aW9uLCBwcm9iYWJseSBXaWRlQ2hhclRvTXVsdGlCeXRlLiAgKi8KLQotdm9pZAotdW5pY29kZV9wcmludCAoZSwgdW5pY29kZSwgbGVuZ3RoKQotICAgICBGSUxFICplOwotICAgICBjb25zdCB1bmljaGFyICp1bmljb2RlOwotICAgICBpbnQgbGVuZ3RoOwotewotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB1bmljaGFyIGNoOwotCi0gICAgICBpZiAobGVuZ3RoID09IDApCi0JcmV0dXJuOwotICAgICAgaWYgKGxlbmd0aCA+IDApCi0JLS1sZW5ndGg7Ci0KLSAgICAgIGNoID0gKnVuaWNvZGU7Ci0KLSAgICAgIGlmIChjaCA9PSAwICYmIGxlbmd0aCA8IDApCi0JcmV0dXJuOwotCi0gICAgICArK3VuaWNvZGU7Ci0KLSAgICAgIGlmICgoY2ggJiAweDdmKSA9PSBjaCkKLQl7Ci0JICBpZiAoY2ggPT0gJ1xcJykKLQkgICAgZnB1dHMgKCJcXCIsIGUpOwotCSAgZWxzZSBpZiAoaXNwcmludCAoY2gpKQotCSAgICBwdXRjIChjaCwgZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNoKQotCQl7Ci0JCWNhc2UgRVNDQVBFX0E6Ci0JCSAgZnB1dHMgKCJcXGEiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9COgotCQkgIGZwdXRzICgiXFxiIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfRjoKLQkJICBmcHV0cyAoIlxcZiIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX046Ci0JCSAgZnB1dHMgKCJcXG4iLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9SOgotCQkgIGZwdXRzICgiXFxyIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfVDoKLQkJICBmcHV0cyAoIlxcdCIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX1Y6Ci0JCSAgZnB1dHMgKCJcXHYiLCBlKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGZwcmludGYgKGUsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjaCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChjaCAmIDB4ZmYpID09IGNoKQotCWZwcmludGYgKGUsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjaCk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZSwgIlxceCV4IiwgKHVuc2lnbmVkIGludCkgY2gpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmR1bmkuaCBiL2JpbnV0aWxzL3dpbmR1bmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWFmMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kdW5pLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiB3aW5kdW5pLmggLS0gaGVhZGVyIGZpbGUgZm9yIHVuaWNvZGUgc3VwcG9ydCBmb3Igd2luZHJlcyBwcm9ncmFtLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyB0aGUgdHlwZXMgYW5kIGZ1bmN0aW9ucyB3ZSB1c2UgZm9yCi0gICB1bmljb2RlIHN1cHBvcnQgaW4gd2luZHJlcy4gIE91ciB1bmljb2RlIHN1cHBvcnQgaXMgdmVyeSBsaW1pdGVkIGF0Ci0gICBwcmVzZW50LgotCi0gICBXZSBkb24ndCBwdXQgdGhpcyBzdHVmZiBpbiB3aW5kcmVzLmggc28gdGhhdCB3aW5kdW5pLmMgZG9lc24ndCBoYXZlCi0gICB0byBpbmNsdWRlIHdpbmRyZXMuaC4gIHdpbmR1bmkuYyBuZWVkcyB0byBpbmNsdWRlcyB3aW5kb3dzLmgsIGFuZAotICAgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIHRoZSBkZWZpbml0aW9ucyBvZiBXaW5kb3dzIG1hY3JvcyB3ZQotICAgYWxyZWFkeSBoYXZlIGluIHdpbmRyZXMuaC4gICovCi0KLS8qIFdlIHVzZSB0aGlzIHR5cGUgdG8gaG9sZCBhIHVuaWNvZGUgY2hhcmFjdGVyLiAgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bmljaGFyOwotCi0vKiBFc2NhcGUgY2hhcmFjdGVyIHRyYW5zbGF0aW9ucy4gICovCi0KLSNkZWZpbmUgRVNDQVBFX0EgKDAwNykKLSNkZWZpbmUgRVNDQVBFX0IgKDAxMCkKLSNkZWZpbmUgRVNDQVBFX0YgKDAxNCkKLSNkZWZpbmUgRVNDQVBFX04gKDAxMikKLSNkZWZpbmUgRVNDQVBFX1IgKDAxNSkKLSNkZWZpbmUgRVNDQVBFX1QgKDAxMSkKLSNkZWZpbmUgRVNDQVBFX1YgKDAxMykKLQotLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIHN0cmluZy4gICovCi0KLWV4dGVybiB2b2lkIHVuaWNvZGVfZnJvbV9hc2NpaQotICBQQVJBTVMgKChpbnQgKiwgdW5pY2hhciAqKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFByaW50IGEgdW5pY29kZSBzdHJpbmcgdG8gYSBmaWxlLiAgKi8KLQotZXh0ZXJuIHZvaWQgdW5pY29kZV9wcmludCBQQVJBTVMgKChGSUxFICosIGNvbnN0IHVuaWNoYXIgKiwgaW50KSk7Ci0KLS8qIFdpbmRyZXMgc3VwcG9ydCByb3V0aW5lIGNhbGxlZCBieSB1bmljb2RlX2Zyb21fYXNjaWkuICBUaGlzIGlzIGJvdGgKLSAgIGhlcmUgYW5kIGluIHdpbmRyZXMuaC4gIEl0IHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNlcGFyYXRlIGhlYWRlcgotICAgZmlsZSwgYnV0IGl0IGhhcmRseSBzZWVtcyB3b3J0aCBpdCBmb3Igb25lIGZ1bmN0aW9uLiAgKi8KLQotZXh0ZXJuIFBUUiByZXNfYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy93cnN0YWJzLmMgYi9iaW51dGlscy93cnN0YWJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTE1ODcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd3JzdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQxNiArMCwwIEBACi0vKiB3cnN0YWJzLmMgLS0gT3V0cHV0IHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIHdyaXRlcyBvdXQgc3RhYnMgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLS8qIE1lYW5pbmdsZXNzIGRlZmluaXRpb24gbmVlZHMgYnkgYW91dDY0LmguICBGSVhNRS4gICovCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIFRoZSBzaXplIG9mIGEgc3RhYnMgc3ltYm9sLiAgVGhpcyBwcmVzdW1lcyAzMiBiaXQgdmFsdWVzLiAgKi8KLQotI2RlZmluZSBTVEFCX1NZTUJPTF9TSVpFICgxMikKLQotLyogQW4gZW50cnkgaW4gYSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogTmV4dCBzdHJpbmcgaW4gdGhpcyB0YWJsZS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogSW5kZXggaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSAgbG9uZyBpbmRleDsKLSAgLyogU2l6ZSBvZiB0eXBlIGlmIHRoaXMgaXMgYSB0eXBlZGVmLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi0vKiBBIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLX07Ci0KLS8qIFRoZSB0eXBlIHN0YWNrLiAgRWFjaCBlbGVtZW50IG9uIHRoZSBzdGFjayBpcyBhIHN0cmluZy4gICovCi0KLXN0cnVjdCBzdGFiX3R5cGVfc3RhY2sKLXsKLSAgLyogVGhlIG5leHQgZWxlbWVudCBvbiB0aGUgc3RhY2suICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICpuZXh0OwotICAvKiBUaGlzIGVsZW1lbnQgYXMgYSBzdHJpbmcuICAqLwotICBjaGFyICpzdHJpbmc7Ci0gIC8qIFRoZSB0eXBlIGluZGV4IG9mIHRoaXMgZWxlbWVudC4gICovCi0gIGxvbmcgaW5kZXg7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIFdoZXRoZXIgdHlwZSBzdHJpbmcgZGVmaW5lcyBhIG5ldyB0eXBlLiAgKi8KLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICAvKiBTdHJpbmcgZGVmaW5pbmcgc3RydWN0IGZpZWxkcy4gICovCi0gIGNoYXIgKmZpZWxkczsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIHN0cmluZ3MgZGVmaW5pbmcgYmFzZSBjbGFzc2VzIGZvciBhCi0gICAgIGNsYXNzLiAgKi8KLSAgY2hhciAqKmJhc2VjbGFzc2VzOwotICAvKiBTdHJpbmcgZGVmaW5pbmcgY2xhc3MgbWV0aG9kcy4gICovCi0gIGNoYXIgKm1ldGhvZHM7Ci0gIC8qIFN0cmluZyBkZWZpbmluZyB2dGFibGUgcG9pbnRlciBmb3IgYSBjbGFzcy4gICovCi0gIGNoYXIgKnZ0YWJsZTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0eXBlIGluZGljZXMgZm9yIHRhZ2dlZAotICAgdHlwZXMuICAqLwotCi1zdHJ1Y3Qgc3RhYl90YWcKLXsKLSAgLyogVGhlIHR5cGUgaW5kZXguICAqLwotICBsb25nIGluZGV4OwotICAvKiBUaGUgdGFnIG5hbWUuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci0gIC8qIFRoZSBraW5kIG9mIHR5cGUuICBUaGlzIGlzIHNldCB0byBERUJVR19LSU5EX0lMTEVHQUwgd2hlbiB0aGUKLSAgICAgdHlwZSBpcyBkZWZpbmVkLiAgKi8KLSAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIHN0cnVjdC4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotfTsKLQotLyogV2UgcmVtZW1iZXIgdmFyaW91cyBzb3J0cyBvZiB0eXBlIGluZGljZXMuICBUaGV5IGFyZSBub3QgcmVsYXRlZCwKLSAgIGJ1dCwgZm9yIGNvbnZlbmllbmNlLCB3ZSBrZWVwIGFsbCB0aGUgaW5mb3JtYXRpb24gaW4gdGhpcwotICAgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHN0YWJfdHlwZV9jYWNoZQotewotICAvKiBUaGUgdm9pZCB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyB2b2lkX3R5cGU7Ci0gIC8qIFNpZ25lZCBpbnRlZ2VyIHR5cGUgaW5kaWNlcywgaW5kZXhlZCBieSBzaXplIC0gMS4gICovCi0gIGxvbmcgc2lnbmVkX2ludGVnZXJfdHlwZXNbOF07Ci0gIC8qIFVuc2lnbmVkIGludGVnZXIgdHlwZSBpbmRpY2VzLCBpbmRleGVkIGJ5IHNpemUgLSAxLiAgKi8KLSAgbG9uZyB1bnNpZ25lZF9pbnRlZ2VyX3R5cGVzWzhdOwotICAvKiBGbG9hdGluZyBwb2ludCB0eXBlcywgaW5kZXhlZCBieSBzaXplIC0gMS4gICovCi0gIGxvbmcgZmxvYXRfdHlwZXNbMTZdOwotICAvKiBQb2ludGVycyB0byB0eXBlcywgaW5kZXhlZCBieSB0aGUgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgKnBvaW50ZXJfdHlwZXM7Ci0gIHNpemVfdCBwb2ludGVyX3R5cGVzX2FsbG9jOwotICAvKiBGdW5jdGlvbnMgcmV0dXJuaW5nIHR5cGVzLCBpbmRleGVkIGJ5IHRoZSB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyAqZnVuY3Rpb25fdHlwZXM7Ci0gIHNpemVfdCBmdW5jdGlvbl90eXBlc19hbGxvYzsKLSAgLyogUmVmZXJlbmNlcyB0byB0eXBlcywgaW5kZXhlZCBieSB0aGUgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgKnJlZmVyZW5jZV90eXBlczsKLSAgc2l6ZV90IHJlZmVyZW5jZV90eXBlc19hbGxvYzsKLSAgLyogU3RydWN0L3VuaW9uL2NsYXNzIHR5cGUgaW5kaWNlcywgaW5kZXhlZCBieSB0aGUgc3RydWN0IGlkLiAgKi8KLSAgc3RydWN0IHN0YWJfdGFnICpzdHJ1Y3RfdHlwZXM7Ci0gIHNpemVfdCBzdHJ1Y3RfdHlwZXNfYWxsb2M7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSBoYW5kbGUgcGFzc2VkIHRocm91Z2ggZGVidWdfd3JpdGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUKLXsKLSAgLyogVGhlIEJGRC4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogVGhpcyBidWZmZXIgaG9sZHMgdGhlIHN5bWJvbHMuICAqLwotICBiZmRfYnl0ZSAqc3ltYm9sczsKLSAgc2l6ZV90IHN5bWJvbHNfc2l6ZTsKLSAgc2l6ZV90IHN5bWJvbHNfYWxsb2M7Ci0gIC8qIFRoaXMgaXMgYSBsaXN0IG9mIGhhc2ggdGFibGUgZW50cmllcyBmb3IgdGhlIHN0cmluZ3MuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnN0cmluZ3M7Ci0gIC8qIFRoZSBsYXN0IHN0cmluZyBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpsYXN0X3N0cmluZzsKLSAgLyogVGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLwotICBzaXplX3Qgc3RyaW5nc19zaXplOwotICAvKiBUaGlzIGhhc2ggdGFibGUgZWxpbWluYXRlcyBkdXBsaWNhdGUgc3RyaW5ncy4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZSBzdHJoYXNoOwotICAvKiBUaGUgdHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKnR5cGVfc3RhY2s7Ci0gIC8qIFRoZSBuZXh0IHR5cGUgaW5kZXguICAqLwotICBsb25nIHR5cGVfaW5kZXg7Ci0gIC8qIFRoZSB0eXBlIGNhY2hlLiAgKi8KLSAgc3RydWN0IHN0YWJfdHlwZV9jYWNoZSB0eXBlX2NhY2hlOwotICAvKiBBIG1hcHBpbmcgZnJvbSB0eXBlZGVmIG5hbWVzIHRvIHR5cGUgaW5kaWNlcy4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZSB0eXBlZGVmX2hhc2g7Ci0gIC8qIElmIHRoaXMgaXMgbm90IC0xLCBpdCBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBtb3N0IHJlY2VudCBOX1NPCi0gICAgIHN5bWJvbCwgYW5kIHRoZSB2YWx1ZSBvZiB0aGF0IHN5bWJvbCBuZWVkcyB0byBiZSBzZXQuICAqLwotICBsb25nIHNvX29mZnNldDsKLSAgLyogSWYgdGhpcyBpcyBub3QgLTEsIGl0IGlzIHRoZSBvZmZzZXQgdG8gdGhlIG1vc3QgcmVjZW50IE5fRlVOCi0gICAgIHN5bWJvbCwgYW5kIHRoZSB2YWx1ZSBvZiB0aGF0IHN5bWJvbCBuZWVkcyB0byBiZSBzZXQuICAqLwotICBsb25nIGZ1bl9vZmZzZXQ7Ci0gIC8qIFRoZSBsYXN0IHRleHQgc2VjdGlvbiBhZGRyZXNzIHNlZW4uICAqLwotICBiZmRfdm1hIGxhc3RfdGV4dF9hZGRyZXNzOwotICAvKiBUaGUgYmxvY2sgbmVzdGluZyBkZXB0aC4gICovCi0gIHVuc2lnbmVkIGludCBuZXN0aW5nOwotICAvKiBUaGUgZnVuY3Rpb24gYWRkcmVzcy4gICovCi0gIGJmZF92bWEgZm5hZGRyOwotICAvKiBBIHBlbmRpbmcgTEJSQUMgc3ltYm9sLiAgKi8KLSAgYmZkX3ZtYSBwZW5kaW5nX2xicmFjOwotICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlciBmaWxlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpsaW5lbm9fZmlsZW5hbWU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdHJpbmdfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3dyaXRlX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgaW50LCBpbnQsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9wdXNoX3N0cmluZwotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBsb25nLCBib29sZWFuLAotCSAgIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY2hhciAqc3RhYl9wb3BfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9tb2RpZnlfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgaW50LCB1bnNpZ25lZCBpbnQsIGxvbmcgKiosIHNpemVfdCAqKSk7Ci1zdGF0aWMgbG9uZyBzdGFiX2dldF9zdHJ1Y3RfaW5kZXgKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCSAgIGVudW0gZGVidWdfdHlwZV9raW5kLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19tZXRob2RfdmFyCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwKLQkgICBib29sZWFuLCBib29sZWFuLCBib29sZWFuLCBiZmRfdm1hLCBib29sZWFuKSk7Ci0KLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW1wdHlfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9mbG9hdF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW51bV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBiZmRfc2lnbmVkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcmFuZ2VfdHlwZSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3NldF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9vZmZzZXRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfbWV0aG9kX3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY29uc3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0cnVjdF9maWVsZAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VuZF9zdHJ1Y3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfY2xhc3NfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19zdGF0aWNfbWVtYmVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19iYXNlY2xhc3MKLSAgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3Nfc3RhcnRfbWV0aG9kIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgYmZkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19lbmRfbWV0aG9kIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbmRfY2xhc3NfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdHlwZWRlZl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3RhZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3R5cGRlZiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl90YWcgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfaW50X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2Zsb2F0X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkb3VibGUpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdHlwZWRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfZnVuY3Rpb24gUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZnVuY3Rpb25fcGFyYW1ldGVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW5kX2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2xpbmVubwotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyBzdGFiX2ZucyA9Ci17Ci0gIHN0YWJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCwKLSAgc3RhYl9zdGFydF9zb3VyY2UsCi0gIHN0YWJfZW1wdHlfdHlwZSwKLSAgc3RhYl92b2lkX3R5cGUsCi0gIHN0YWJfaW50X3R5cGUsCi0gIHN0YWJfZmxvYXRfdHlwZSwKLSAgc3RhYl9jb21wbGV4X3R5cGUsCi0gIHN0YWJfYm9vbF90eXBlLAotICBzdGFiX2VudW1fdHlwZSwKLSAgc3RhYl9wb2ludGVyX3R5cGUsCi0gIHN0YWJfZnVuY3Rpb25fdHlwZSwKLSAgc3RhYl9yZWZlcmVuY2VfdHlwZSwKLSAgc3RhYl9yYW5nZV90eXBlLAotICBzdGFiX2FycmF5X3R5cGUsCi0gIHN0YWJfc2V0X3R5cGUsCi0gIHN0YWJfb2Zmc2V0X3R5cGUsCi0gIHN0YWJfbWV0aG9kX3R5cGUsCi0gIHN0YWJfY29uc3RfdHlwZSwKLSAgc3RhYl92b2xhdGlsZV90eXBlLAotICBzdGFiX3N0YXJ0X3N0cnVjdF90eXBlLAotICBzdGFiX3N0cnVjdF9maWVsZCwKLSAgc3RhYl9lbmRfc3RydWN0X3R5cGUsCi0gIHN0YWJfc3RhcnRfY2xhc3NfdHlwZSwKLSAgc3RhYl9jbGFzc19zdGF0aWNfbWVtYmVyLAotICBzdGFiX2NsYXNzX2Jhc2VjbGFzcywKLSAgc3RhYl9jbGFzc19zdGFydF9tZXRob2QsCi0gIHN0YWJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gIHN0YWJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LAotICBzdGFiX2NsYXNzX2VuZF9tZXRob2QsCi0gIHN0YWJfZW5kX2NsYXNzX3R5cGUsCi0gIHN0YWJfdHlwZWRlZl90eXBlLAotICBzdGFiX3RhZ190eXBlLAotICBzdGFiX3R5cGRlZiwKLSAgc3RhYl90YWcsCi0gIHN0YWJfaW50X2NvbnN0YW50LAotICBzdGFiX2Zsb2F0X2NvbnN0YW50LAotICBzdGFiX3R5cGVkX2NvbnN0YW50LAotICBzdGFiX3ZhcmlhYmxlLAotICBzdGFiX3N0YXJ0X2Z1bmN0aW9uLAotICBzdGFiX2Z1bmN0aW9uX3BhcmFtZXRlciwKLSAgc3RhYl9zdGFydF9ibG9jaywKLSAgc3RhYl9lbmRfYmxvY2ssCi0gIHN0YWJfZW5kX2Z1bmN0aW9uLAotICBzdGFiX2xpbmVubwotfTsKLQwKLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0cmluZ19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICAgIHJldC0+aW5kZXggPSAtMTsKLSAgICAgIHJldC0+c2l6ZSA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBzdHJpbmdfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3ZSBhcmUgYnVpbGRpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIHR5cGUsIGRlc2MsIHZhbHVlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBkZXNjOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3RyeDsKLSAgYmZkX2J5dGUgc3ltW1NUQUJfU1lNQk9MX1NJWkVdOwotCi0gIGlmIChzdHJpbmcgPT0gTlVMTCkKLSAgICBzdHJ4ID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IHN0cmluZ19oYXNoX2xvb2t1cCAoJmluZm8tPnN0cmhhc2gsIHN0cmluZywgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygic3RyaW5nX2hhc2hfbG9va3VwIGZhaWxlZDogJXNcbiIpLAotCQkgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKGgtPmluZGV4ICE9IC0xKQotCXN0cnggPSBoLT5pbmRleDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ4ID0gaW5mby0+c3RyaW5nc19zaXplOwotCSAgaC0+aW5kZXggPSBzdHJ4OwotCSAgaWYgKGluZm8tPmxhc3Rfc3RyaW5nID09IE5VTEwpCi0JICAgIGluZm8tPnN0cmluZ3MgPSBoOwotCSAgZWxzZQotCSAgICBpbmZvLT5sYXN0X3N0cmluZy0+bmV4dCA9IGg7Ci0JICBpbmZvLT5sYXN0X3N0cmluZyA9IGg7Ci0JICBpbmZvLT5zdHJpbmdzX3NpemUgKz0gc3RybGVuIChzdHJpbmcpICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoaXMgcHJlc3VtZXMgMzIgYml0IHZhbHVlcy4gICovCi0gIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIHN0cngsIHN5bSk7Ci0gIGJmZF9wdXRfOCAoaW5mby0+YWJmZCwgdHlwZSwgc3ltICsgNCk7Ci0gIGJmZF9wdXRfOCAoaW5mby0+YWJmZCwgMCwgc3ltICsgNSk7Ci0gIGJmZF9wdXRfMTYgKGluZm8tPmFiZmQsIGRlc2MsIHN5bSArIDYpOwotICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCB2YWx1ZSwgc3ltICsgOCk7Ci0KLSAgaWYgKGluZm8tPnN5bWJvbHNfc2l6ZSArIFNUQUJfU1lNQk9MX1NJWkUgPiBpbmZvLT5zeW1ib2xzX2FsbG9jKQotICAgIHsKLSAgICAgIGluZm8tPnN5bWJvbHNfYWxsb2MgKj0gMjsKLSAgICAgIGluZm8tPnN5bWJvbHMgPSAoYmZkX2J5dGUgKikgeHJlYWxsb2MgKGluZm8tPnN5bWJvbHMsCi0JCQkJCSAgICAgaW5mby0+c3ltYm9sc19hbGxvYyk7Ci0gICAgfQotCi0gIG1lbWNweSAoaW5mby0+c3ltYm9scyArIGluZm8tPnN5bWJvbHNfc2l6ZSwgc3ltLCBTVEFCX1NZTUJPTF9TSVpFKTsKLQotICBpbmZvLT5zeW1ib2xzX3NpemUgKz0gU1RBQl9TWU1CT0xfU0laRTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHN0cmluZyBvbiB0byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBzdHJpbmcsIGluZGV4LCBkZWZpbml0aW9uLCBzaXplKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgbG9uZyBpbmRleDsKLSAgICAgYm9vbGVhbiBkZWZpbml0aW9uOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqczsKLQotICBzID0gKHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpzKTsKLSAgcy0+c3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLSAgcy0+aW5kZXggPSBpbmRleDsKLSAgcy0+ZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIHMtPnNpemUgPSBzaXplOwotCi0gIHMtPmZpZWxkcyA9IE5VTEw7Ci0gIHMtPmJhc2VjbGFzc2VzID0gTlVMTDsKLSAgcy0+bWV0aG9kcyA9IE5VTEw7Ci0gIHMtPnZ0YWJsZSA9IE5VTEw7Ci0KLSAgcy0+bmV4dCA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGluZm8tPnR5cGVfc3RhY2sgPSBzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgdHlwZSBpbmRleCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIHNpemUpCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgbG9uZyBpbmRleDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGNoYXIgYnVmWzIwXTsKLQotICBzcHJpbnRmIChidWYsICIlbGQiLCBpbmRleCk7Ci0gIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBmYWxzZSwgc2l6ZSk7Ci19Ci0KLS8qIFBvcCBhIHR5cGUgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAgIGZyZWVpbmcgdGhlIHN0cmluZy4gICovCi0KLXN0YXRpYyBjaGFyICoKLXN0YWJfcG9wX3R5cGUgKGluZm8pCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqczsKLSAgY2hhciAqcmV0OwotCi0gIHMgPSBpbmZvLT50eXBlX3N0YWNrOwotICBhc3NlcnQgKHMgIT0gTlVMTCk7Ci0KLSAgaW5mby0+dHlwZV9zdGFjayA9IHMtPm5leHQ7Ci0KLSAgcmV0ID0gcy0+c3RyaW5nOwotCi0gIGZyZWUgKHMpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBUaGUgZ2VuZXJhbCByb3V0aW5lIHRvIHdyaXRlIG91dCBzdGFicyBpbiBzZWN0aW9ucyBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgVGhpcyBhY2N1bXVsYXRlcyB0aGUgc3RhYnMgc3ltYm9scyBhbmQgdGhlIHN0cmluZ3MgaW4KLSAgIHR3byBvYnN0YWNrcy4gIFdlIGNhbid0IGVhc2lseSB3cml0ZSBvdXQgdGhlIGluZm9ybWF0aW9uIGFzIHdlIGdvCi0gICBhbG9uZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGtub3cgdGhlIHNlY3Rpb24gc2l6ZXMgYmVmb3JlIHdlIGNhbgotICAgd3JpdGUgb3V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgQUJGRCBpcyB0aGUgQkZEIGFuZCBESEFORExFIGlzIHRoZQotICAgaGFuZGxlIGZvciB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBzZXRzICpQU1lNUyB0byBwb2ludCB0bwotICAgdGhlIHN5bWJvbHMsICpQU1lNU0laRSB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9scywgKlBTVFJJTkdTIHRvIHRoZQotICAgc3RyaW5ncywgYW5kICpQU1RSSU5HU0laRSB0byB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5ncy4gICovCi0KLWJvb2xlYW4KLXdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBkaGFuZGxlLCBwc3ltcywgcHN5bXNpemUsCi0JCQkJCXBzdHJpbmdzLCBwc3RyaW5nc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKipwc3ltczsKLSAgICAgYmZkX3NpemVfdHlwZSAqcHN5bXNpemU7Ci0gICAgIGJmZF9ieXRlICoqcHN0cmluZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnBzdHJpbmdzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgaW5mbzsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpoOwotICBiZmRfYnl0ZSAqcDsKLQotICBpbmZvLmFiZmQgPSBhYmZkOwotCi0gIGluZm8uc3ltYm9sc19zaXplID0gMDsKLSAgaW5mby5zeW1ib2xzX2FsbG9jID0gNTAwOwotICBpbmZvLnN5bWJvbHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoaW5mby5zeW1ib2xzX2FsbG9jKTsKLQotICBpbmZvLnN0cmluZ3MgPSBOVUxMOwotICBpbmZvLmxhc3Rfc3RyaW5nID0gTlVMTDsKLSAgLyogUmVzZXJ2ZSAxIGJ5dGUgZm9yIGEgbnVsbCBieXRlLiAgKi8KLSAgaW5mby5zdHJpbmdzX3NpemUgPSAxOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZpbmZvLnN0cmhhc2gudGFibGUsIHN0cmluZ19oYXNoX25ld2Z1bmMpCi0gICAgICB8fCAhIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZpbmZvLnR5cGVkZWZfaGFzaC50YWJsZSwgc3RyaW5nX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiYmZkX2hhc2hfdGFibGVfaW5pdF9mYWlsZWQ6ICVzXG4iLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8udHlwZV9zdGFjayA9IE5VTEw7Ci0gIGluZm8udHlwZV9pbmRleCA9IDE7Ci0gIG1lbXNldCAoJmluZm8udHlwZV9jYWNoZSwgMCwgc2l6ZW9mIGluZm8udHlwZV9jYWNoZSk7Ci0gIGluZm8uc29fb2Zmc2V0ID0gLTE7Ci0gIGluZm8uZnVuX29mZnNldCA9IC0xOwotICBpbmZvLmxhc3RfdGV4dF9hZGRyZXNzID0gMDsKLSAgaW5mby5uZXN0aW5nID0gMDsKLSAgaW5mby5mbmFkZHIgPSAwOwotICBpbmZvLnBlbmRpbmdfbGJyYWMgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgLyogVGhlIGluaXRpYWwgc3ltYm9sIGhvbGRzIHRoZSBzdHJpbmcgc2l6ZS4gICovCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sICgmaW5mbywgMCwgMCwgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE91dHB1dCBhbiBpbml0aWFsIE5fU08gc3ltYm9sLiAgKi8KLSAgaW5mby5zb19vZmZzZXQgPSBpbmZvLnN5bWJvbHNfc2l6ZTsKLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKCZpbmZvLCBOX1NPLCAwLCAwLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGRlYnVnX3dyaXRlIChkaGFuZGxlLCAmc3RhYl9mbnMsIChQVFIpICZpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXNzZXJ0IChpbmZvLnBlbmRpbmdfbGJyYWMgPT0gKGJmZF92bWEpIC0xKTsKLQotICAvKiBPdXRwdXQgYSB0cmFpbGluZyBOX1NPLiAgKi8KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKCZpbmZvLCBOX1NPLCAwLCBpbmZvLmxhc3RfdGV4dF9hZGRyZXNzLAotCQkJICAgKGNvbnN0IGNoYXIgKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFB1dCB0aGUgc3RyaW5nIHNpemUgaW4gdGhlIGluaXRpYWwgc3ltYm9sLiAgKi8KLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5mby5zdHJpbmdzX3NpemUsIGluZm8uc3ltYm9scyArIDgpOwotCi0gICpwc3ltcyA9IGluZm8uc3ltYm9sczsKLSAgKnBzeW1zaXplID0gaW5mby5zeW1ib2xzX3NpemU7Ci0KLSAgKnBzdHJpbmdzaXplID0gaW5mby5zdHJpbmdzX3NpemU7Ci0gICpwc3RyaW5ncyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChpbmZvLnN0cmluZ3Nfc2l6ZSk7Ci0KLSAgcCA9ICpwc3RyaW5nczsKLSAgKnArKyA9ICdcMCc7Ci0gIGZvciAoaCA9IGluZm8uc3RyaW5nczsgaCAhPSBOVUxMOyBoID0gaC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJjcHkgKChjaGFyICopIHAsIGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIHAgKz0gc3RybGVuICgoY2hhciAqKSBwKSArIDE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCB3cml0aW5nIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCAocCwgZmlsZW5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIFdlIHdvdWxkIG5vcm1hbGx5IG91dHB1dCBhbiBOX1NPIHN5bWJvbCBoZXJlLiAgSG93ZXZlciwgdGhhdAotICAgICB3b3VsZCBmb3JjZSB1cyB0byByZXNldCBhbGwgb2Ygb3VyIHR5cGUgaW5mb3JtYXRpb24uICBJIHRoaW5rIHdlCi0gICAgIHdpbGwgYmUgYmV0dGVyIG9mZiBqdXN0IG91dHB1dHRpbmcgYW4gTl9TT0wgc3ltYm9sLCBhbmQgbm90Ci0gICAgIHdvcnJ5aW5nIGFib3V0IHNwbGl0dGluZyBpbmZvcm1hdGlvbiBiZXR3ZWVuIGZpbGVzLiAgKi8KLQotICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICByZXR1cm4gc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fU09MLCAwLCAwLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgc291cmNlIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdGFydF9zb3VyY2UgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIHN5bWJvbCdzIHZhbHVlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSB0ZXh0IHNlY3Rpb24KLSAgICAgYWRkcmVzcy4gIEhvd2V2ZXIsIHdlIHdvdWxkIGhhdmUgdG8gZmlsbCBpdCBpbiBsYXRlciwgYW5kIGdkYgotICAgICBkb2Vzbid0IGNhcmUsIHNvIHdlIGRvbid0IGJvdGhlciB3aXRoIGl0LiAgKi8KLQotICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICByZXR1cm4gc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fU09MLCAwLCAwLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFB1c2ggYW4gZW1wdHkgdHlwZS4gIFRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4gIFdlIGp1c3QgdXNlIGEKLSAgIHZvaWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VtcHR5X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogV2UgZG9uJ3QgY2FsbCBzdGFiX3ZvaWRfdHlwZSBpZiB0aGUgdHlwZSBpcyBub3QgeWV0IGRlZmluZWQsCi0gICAgIGJlY2F1c2UgdGhhdCBtaWdodCBzY3JldyB1cCB0aGUgdHlwZWRlZi4gICovCi0KLSAgaWYgKGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlICE9IDApCi0gICAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlLCAwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5kZXg7Ci0gICAgICBjaGFyIGJ1Zls0MF07Ci0KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPSVsZCIsIGluZGV4LCBpbmRleCk7Ci0KLSAgICAgIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBmYWxzZSwgMCk7Ci0gICAgfQotfQotCi0vKiBQdXNoIGEgdm9pZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdm9pZF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIGlmIChpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSAhPSAwKQotICAgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGluZGV4OwotICAgICAgY2hhciBidWZbNDBdOwotCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgICAgIGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlID0gaW5kZXg7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD0lbGQiLCBpbmRleCwgaW5kZXgpOwotCi0gICAgICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgMCk7Ci0gICAgfQotfQotCi0vKiBQdXNoIGFuIGludGVnZXIgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2ludF90eXBlIChwLCBzaXplLCB1bnNpZ25lZHApCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgbG9uZyAqY2FjaGU7Ci0KLSAgaWYgKHNpemUgPD0gMCB8fCAoc2l6ZSA+IHNpemVvZiAobG9uZykgJiYgc2l6ZSAhPSA4KSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInN0YWJfaW50X3R5cGU6IGJhZCBzaXplICV1XG4iKSwgc2l6ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh1bnNpZ25lZHApCi0gICAgY2FjaGUgPSBpbmZvLT50eXBlX2NhY2hlLnNpZ25lZF9pbnRlZ2VyX3R5cGVzOwotICBlbHNlCi0gICAgY2FjaGUgPSBpbmZvLT50eXBlX2NhY2hlLnVuc2lnbmVkX2ludGVnZXJfdHlwZXM7Ci0KLSAgaWYgKGNhY2hlW3NpemUgLSAxXSAhPSAwKQotICAgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBjYWNoZVtzaXplIC0gMV0sIHNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbmRleDsKLSAgICAgIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLQotICAgICAgY2FjaGVbc2l6ZSAtIDFdID0gaW5kZXg7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD1yJWxkOyIsIGluZGV4LCBpbmRleCk7Ci0gICAgICBpZiAodW5zaWduZWRwKQotCXsKLQkgIHN0cmNhdCAoYnVmLCAiMDsiKTsKLQkgIGlmIChzaXplIDwgc2l6ZW9mIChsb25nKSkKLQkgICAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiJWxkOyIsICgobG9uZykgMSA8PCAoc2l6ZSAqIDgpKSAtIDEpOwotCSAgZWxzZSBpZiAoc2l6ZSA9PSBzaXplb2YgKGxvbmcpKQotCSAgICBzdHJjYXQgKGJ1ZiwgIi0xOyIpOwotCSAgZWxzZSBpZiAoc2l6ZSA9PSA4KQotCSAgICBzdHJjYXQgKGJ1ZiwgIjAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIpOwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNpemUgPD0gc2l6ZW9mIChsb25nKSkKLQkgICAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiJWxkOyVsZDsiLAotCQkgICAgIChsb25nKSAtICgodW5zaWduZWQgbG9uZykgMSA8PCAoc2l6ZSAqIDggLSAxKSksCi0JCSAgICAgKGxvbmcpICgoKHVuc2lnbmVkIGxvbmcpIDEgPDwgKHNpemUgKiA4IC0gMSkpIC0gMSkpOwotCSAgZWxzZSBpZiAoc2l6ZSA9PSA4KQotCSAgICBzdHJjYXQgKGJ1ZiwgIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwOzA3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Iik7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIHNpemUpOwotICAgIH0KLX0KLQotLyogUHVzaCBhIGZsb2F0aW5nIHBvaW50IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9mbG9hdF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICBpZiAoc2l6ZSA+IDAKLSAgICAgICYmIHNpemUgLSAxIDwgKHNpemVvZiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzCi0JCSAgICAgLyBzaXplb2YgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1swXSkKLSAgICAgICYmIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbc2l6ZSAtIDFdICE9IDApCi0gICAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sCi0JCQkJICAgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1tzaXplIC0gMV0sCi0JCQkJICAgc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGluZGV4OwotICAgICAgY2hhciAqaW50X3R5cGU7Ci0gICAgICBjaGFyIGJ1Zls1MF07Ci0KLSAgICAgIC8qIEZsb2F0cyBhcmUgZGVmaW5lZCBhcyBhIHN1YnJhbmdlIG9mIGludC4gICovCi0gICAgICBpZiAoISBzdGFiX2ludF90eXBlIChpbmZvLCA0LCBmYWxzZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW50X3R5cGUgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotCi0gICAgICBpZiAoc2l6ZSA+IDAKLQkgICYmIHNpemUgLSAxIDwgKHNpemVvZiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzCi0JCQkgLyBzaXplb2YgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1swXSkpCi0JaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1tzaXplIC0gMV0gPSBpbmRleDsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPXIlczsldTswOyIsIGluZGV4LCBpbnRfdHlwZSwgc2l6ZSk7Ci0KLSAgICAgIGZyZWUgKGludF90eXBlKTsKLQotICAgICAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIHNpemUpOwotICAgIH0KLX0KLQotLyogUHVzaCBhIGNvbXBsZXggdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NvbXBsZXhfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgYnVmWzUwXTsKLSAgbG9uZyBpbmRleDsKLQotICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICsraW5mby0+dHlwZV9pbmRleDsKLQotICBzcHJpbnRmIChidWYsICIlbGQ9ciVsZDsldTswOyIsIGluZGV4LCBpbmRleCwgc2l6ZSk7Ci0KLSAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIHNpemUgKiAyKTsKLX0KLQotLyogUHVzaCBhIGJvb2xlYW4gdHlwZS4gIFdlIHVzZSBhbiBYQ09GRiBwcmVkZWZpbmVkIHR5cGUsIHNpbmNlIGdkYgotICAgYWx3YXlzIHJlY29nbml6ZXMgdGhlbS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2Jvb2xfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGxvbmcgaW5kZXg7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbmRleCA9IC0yMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgaW5kZXggPSAtMjI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSA0OgotICAgICAgaW5kZXggPSAtMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgODoKLSAgICAgIGluZGV4ID0gLTMzOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgc2l6ZSk7Ci19Ci0KLS8qIFB1c2ggYW4gZW51bSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW51bV90eXBlIChwLCB0YWcsIG5hbWVzLCB2YWxzKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWxzOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIHNpemVfdCBsZW47Ci0gIGNvbnN0IGNoYXIgKipwbjsKLSAgY2hhciAqYnVmOwotICBsb25nIGluZGV4ID0gMDsKLSAgYmZkX3NpZ25lZF92bWEgKnB2OwotCi0gIGlmIChuYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VydCAodGFnICE9IE5VTEwpOwotCi0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgxMCArIHN0cmxlbiAodGFnKSk7Ci0gICAgICBzcHJpbnRmIChidWYsICJ4ZSVzOiIsIHRhZyk7Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgaXMganVzdCBhIGd1ZXNzLiAgKi8KLSAgICAgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZmFsc2UsIDQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbGVuID0gMTA7Ci0gIGlmICh0YWcgIT0gTlVMTCkKLSAgICBsZW4gKz0gc3RybGVuICh0YWcpOwotICBmb3IgKHBuID0gbmFtZXM7ICpwbiAhPSBOVUxMOyBwbisrKQotICAgIGxlbiArPSBzdHJsZW4gKCpwbikgKyAyMDsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotCi0gIGlmICh0YWcgPT0gTlVMTCkKLSAgICBzdHJjcHkgKGJ1ZiwgImUiKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzOlQlbGQ9ZSIsIHRhZywgaW5kZXgpOwotICAgIH0KLQotICBmb3IgKHBuID0gbmFtZXMsIHB2ID0gdmFsczsgKnBuICE9IE5VTEw7IHBuKyssIHB2KyspCi0gICAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiJXM6JWxkLCIsICpwbiwgKGxvbmcpICpwdik7Ci0gIHN0cmNhdCAoYnVmLCAiOyIpOwotCi0gIGlmICh0YWcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgaXMganVzdCBhIGd1ZXNzLiAgKi8KLSAgICAgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZmFsc2UsIDQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgaXMganVzdCBhIGd1ZXNzLiAgKi8KLSAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikKLQkgIHx8ICEgc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIDQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrLiAgQ2FjaGUgdGhlCi0gICByZXN1bHRzIGluIENBQ0hFIGFuZCBDQUNIRV9BTExPQy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX21vZGlmeV90eXBlIChpbmZvLCBtb2QsIHNpemUsIGNhY2hlLCBjYWNoZV9hbGxvYykKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBpbnQgbW9kOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgbG9uZyAqKmNhY2hlOwotICAgICBzaXplX3QgKmNhY2hlX2FsbG9jOwotewotICBsb25nIHRhcmdpbmRleDsKLSAgbG9uZyBpbmRleDsKLSAgY2hhciAqcywgKmJ1ZjsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCk7Ci0gIHRhcmdpbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPmluZGV4OwotCi0gIGlmICh0YXJnaW5kZXggPD0gMAotICAgICAgfHwgY2FjaGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBib29sZWFuIGRlZmluaXRpb247Ci0KLSAgICAgIC8qIEVpdGhlciB0aGUgdGFyZ2V0IHR5cGUgaGFzIG5vIGluZGV4LCBvciB3ZSBhcmVuJ3QgY2FjaGluZwotICAgICAgICAgdGhpcyBtb2RpZmllci4gIEVpdGhlciB3YXkgd2UgaGF2ZSBubyB3YXkgb2YgcmVjb3JkaW5nIHRoZQotICAgICAgICAgbmV3IHR5cGUsIHNvIHdlIGRvbid0IGJvdGhlciB0byBkZWZpbmUgb25lLiAgKi8KLSAgICAgIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICAgICAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDIpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWMlcyIsIG1vZCwgcyk7Ci0gICAgICBmcmVlIChzKTsKLSAgICAgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZGVmaW5pdGlvbiwgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKHNpemVfdCkgdGFyZ2luZGV4ID49ICpjYWNoZV9hbGxvYykKLQl7Ci0JICBzaXplX3QgYWxsb2M7Ci0KLQkgIGFsbG9jID0gKmNhY2hlX2FsbG9jOwotCSAgaWYgKGFsbG9jID09IDApCi0JICAgIGFsbG9jID0gMTA7Ci0JICB3aGlsZSAoKHNpemVfdCkgdGFyZ2luZGV4ID49IGFsbG9jKQotCSAgICBhbGxvYyAqPSAyOwotCSAgKmNhY2hlID0gKGxvbmcgKikgeHJlYWxsb2MgKCpjYWNoZSwgYWxsb2MgKiBzaXplb2YgKGxvbmcpKTsKLQkgIG1lbXNldCAoKmNhY2hlICsgKmNhY2hlX2FsbG9jLCAwLAotCQkgIChhbGxvYyAtICpjYWNoZV9hbGxvYykgKiBzaXplb2YgKGxvbmcpKTsKLQkgICpjYWNoZV9hbGxvYyA9IGFsbG9jOwotCX0KLQotICAgICAgaW5kZXggPSAoKmNhY2hlKVt0YXJnaW5kZXhdOwotICAgICAgaWYgKGluZGV4ICE9IDAgJiYgISBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uKQotCXsKLQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBkZWZpbmVkIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgdHlwZSwgYW5kCi0gICAgICAgICAgICAgdGhlIGVudHJ5IG9uIHRoZSB0eXBlIHN0YWNrIGlzIG5vdCBhIGRlZmluaXRpb24sIHNvIHdlCi0gICAgICAgICAgICAgY2FuIHNhZmVseSBkaXNjYXJkIGl0ICh3ZSBtYXkgaGF2ZSBhIGRlZmluaXRpb24gb24gdGhlCi0gICAgICAgICAgICAgc3RhY2ssIGV2ZW4gaWYgd2UgYWxyZWFkeSBkZWZpbmVkIGEgbW9kaWZpY2F0aW9uLCBpZiBpdAotICAgICAgICAgICAgIGlzIGEgc3RydWN0IHdoaWNoIHdlIGRpZCBub3QgZGVmaW5lIGF0IHRoZSB0aW1lIGl0IHdhcwotICAgICAgICAgICAgIHJlZmVyZW5jZWQpLiAgKi8KLQkgIGZyZWUgKHN0YWJfcG9wX3R5cGUgKGluZm8pKTsKLQkgIGlmICghIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCBzaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0JICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLQkgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQkgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAyMCk7Ci0JICBzcHJpbnRmIChidWYsICIlbGQ9JWMlcyIsIGluZGV4LCBtb2QsIHMpOwotCSAgZnJlZSAocyk7Ci0KLQkgICgqY2FjaGUpW3RhcmdpbmRleF0gPSBpbmRleDsKLQotCSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfSAgCi0KLS8qIFB1c2ggYSBwb2ludGVyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9wb2ludGVyX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUU6IFRoZSBzaXplIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICcqJywgNCwgJmluZm8tPnR5cGVfY2FjaGUucG9pbnRlcl90eXBlcywKLQkJCSAgICZpbmZvLT50eXBlX2NhY2hlLnBvaW50ZXJfdHlwZXNfYWxsb2MpOwotfQotCi0vKiBQdXNoIGEgZnVuY3Rpb24gdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2Z1bmN0aW9uX3R5cGUgKHAsIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBpbnQgaTsKLQotICAvKiBXZSBoYXZlIG5vIHdheSB0byByZXByZXNlbnQgdGhlIGFyZ3VtZW50IHR5cGVzLCBzbyB3ZSBqdXN0Ci0gICAgIGRpc2NhcmQgdGhlbS4gIEhvd2V2ZXIsIGlmIHRoZXkgZGVmaW5lIG5ldyB0eXBlcywgd2UgbXVzdCBvdXRwdXQKLSAgICAgdGhlbS4gIFdlIGRvIHRoaXMgYnkgcHJvZHVjaW5nIGVtcHR5IHR5cGVkZWZzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKCEgaW5mby0+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+Zm5hZGRyLAotCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotfQotCi0vKiBFbmQgYSBmdW5jdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW5kX2Z1bmN0aW9uIChwKQotICAgICBQVFIgcCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgbGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9saW5lbm8gKHAsIGZpbGUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGluZW5vOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmxpbmVub19maWxlbmFtZSAhPSBOVUxMKTsKLQotICBpZiAoYWRkciA+IGluZm8tPmxhc3RfdGV4dF9hZGRyZXNzKQotICAgIGluZm8tPmxhc3RfdGV4dF9hZGRyZXNzID0gYWRkcjsKLQotICBpZiAoc3RyY21wIChmaWxlLCBpbmZvLT5saW5lbm9fZmlsZW5hbWUpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fU09MLCAwLCBhZGRyLCBmaWxlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBmaWxlOwotICAgIH0KLQotICByZXR1cm4gc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fU0xJTkUsIGxpbmVubywgYWRkciAtIGluZm8tPmZuYWRkciwKLQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL2NvbmZpZy1tbC5pbiBiL2NvbmZpZy1tbC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZjdjZi4uMDAwMDAwMAotLS0gYS9jb25maWctbWwuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2ODcgKzAsMCBAQAotIyBDb25maWd1cmUgZnJhZ21lbnQgaW52b2tlZCBpbiB0aGUgcG9zdC10YXJnZXQgc2VjdGlvbiBmb3Igc3ViZGlycwotIyB3YW50aW5nIG11bHRpbGliIHN1cHBvcnQuCi0jCi0jIEl0IGlzIGFkdmlzYWJsZSB0byBzdXBwb3J0IGEgZmV3IC0tZW5hYmxlLy0tZGlzYWJsZSBvcHRpb25zIHRvIGxldCB0aGUKLSMgdXNlciBzZWxlY3Qgd2hpY2ggbGlicmFyaWVzIHMvaGUgcmVhbGx5IHdhbnRzLgotIwotIyBTdWJkaXJlY3RvcmllcyB3aXNoaW5nIHRvIHVzZSBtdWx0aWxpYiBzaG91bGQgcHV0IHRoZSBmb2xsb3dpbmcgbGluZXMKLSMgaW4gdGhlICJwb3N0LXRhcmdldCIgc2VjdGlvbiBvZiBjb25maWd1cmUuaW4uCi0jCi0jIGlmIFsgIiR7c3JjZGlyfSIgPSAiLiIgXSA7IHRoZW4KLSMgICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdIDsgdGhlbgotIyAgICAgLiAke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4vY29uZmlnLW1sLmluCi0jICAgZWxzZQotIyAgICAgLiAke3dpdGhfbXVsdGlzcmN0b3B9Li4vY29uZmlnLW1sLmluCi0jICAgZmkKLSMgZWxzZQotIyAgIC4gJHtzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbgotIyBmaQotIwotIyBTZWUgbGlicngvY29uZmlndXJlLmluIGluIHRoZSBsaWJnKysgZGlzdHJpYnV0aW9uIGZvciBhbiBleGFtcGxlIG9mIGhvdwotIyB0byBoYW5kbGUgYXV0b2NvbmYnZCBsaWJyYXJpZXMuCi0jCi0jIFRoaW5ncyBhcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSA2IHNlcGFyYXRlIGNhc2VzIG11c3QgYmUgaGFuZGxlZDoKLSMgMiAobmF0aXZlLCBjcm9zcykgeCAzIChhYnNvbHV0ZS1wYXRoLCByZWxhdGl2ZS1ub3QtZG90LCBkb3QpID0gNi4KLSMKLSMgc3JjZGlyPS4gaXMgc3BlY2lhbC4gIEl0IG11c3QgaGFuZGxlIG1ha2UgcHJvZ3JhbXMgdGhhdCBkb24ndCBoYW5kbGUgVlBBVEguCi0jIFRvIGltcGxlbWVudCB0aGlzLCBhIHN5bWxpbmsgdHJlZSBpcyBidWlsdCBmb3IgZWFjaCBsaWJyYXJ5IGFuZCBmb3IgZWFjaAotIyBtdWx0aWxpYiBzdWJkaXIuCi0jCi0jIFRoZSBidWlsZCB0cmVlIGlzIGxheWVkIG91dCBhcwotIwotIyAuLwotIyAgIGxpYmcrKwotIyAgIG5ld2xpYgotIyAgIG02ODAyMC8KLSMgICAgICAgICAgbGliZysrCi0jICAgICAgICAgIG5ld2xpYgotIyAgICAgICAgICBtNjg4ODEvCi0jICAgICAgICAgICAgICAgICBsaWJnKysKLSMgICAgICAgICAgICAgICAgIG5ld2xpYgotIwotIyBUaGUgbmljZSBmZWF0dXJlIGFib3V0IHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCBpbnRlci1saWJyYXJ5IHJlZmVyZW5jZXMKLSMgaW4gdGhlIGJ1aWxkIHRyZWUgd29yayB3aXRob3V0IGhhdmluZyB0byBjYXJlIHdoZXJlIHlvdSBhcmUuICBOb3RlIHRoYXQKLSMgaW50ZXItbGlicmFyeSByZWZlcmVuY2VzIGFsc28gd29yayBpbiB0aGUgc291cmNlIHRyZWUgYmVjYXVzZSBzeW1saW5rIHRyZWVzCi0jIGFyZSBidWlsdCB3aGVuIHNyY2Rpcj0uCi0jCi0jIFVuZm9ydHVuYXRlbHksIHRyeWluZyB0byBhY2Nlc3MgdGhlIGxpYnJhcmllcyBpbiB0aGUgYnVpbGQgdHJlZSByZXF1aXJlcwotIyB0aGUgdXNlciB0byBtYW51YWxseSBjaG9vc2Ugd2hpY2ggbGlicmFyeSB0byB1c2UgYXMgR0NDIHdvbid0IGJlIGFibGUgdG8KLSMgZmluZCB0aGUgcmlnaHQgb25lLiAgVGhpcyBpcyB2aWV3ZWQgYXMgdGhlIGxlc3NlciBvZiB0d28gZXZpbHMuCi0jCi0jIENvbmZpZ3VyZSB2YXJpYWJsZXM6Ci0jICR7d2l0aF90YXJnZXRfc3ViZGlyfSA9ICIuIiBmb3IgbmF0aXZlLCBvciAke3RhcmdldF9hbGlhc30gZm9yIGNyb3NzLgotIyBTZXQgYnkgdG9wIGxldmVsIE1ha2VmaWxlLgotIyAke3dpdGhfbXVsdGlzcmN0b3B9ID0gaG93IG1hbnkgbGV2ZWxzIG9mIG11bHRpbGlicyB0aGVyZSBhcmUgaW4gdGhlIHNvdXJjZQotIyB0cmVlLiAgSXQgZXhpc3RzIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBjb25maWd1cmluZyBpbiB0aGUgc291cmNlIHRyZWU6Ci0jICR7c3JjZGlyfSBpcyBub3QgY29uc3RhbnQuCi0jICR7d2l0aF9tdWx0aXN1YmRpcn0gPSBuYW1lIG9mIG11bHRpbGliIHN1YmRpcmVjdG9yeSAoZWc6IG02ODAyMC9tNjg4ODEpLgotIwotIyBNYWtlZmlsZSB2YXJpYWJsZXM6Ci0jIE1VTFRJU1JDVE9QID0gbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiBzb3VyY2UgdHJlZSAoKzEgaWYgY3Jvc3MpCi0jIChGSVhNRTogbm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gJHt3aXRoX211bHRpc3JjdG9wfS4gIENoZWNrIG91dC4pLgotIyBNVUxUSUJVSUxEVE9QID0gbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiBidWlsZCB0cmVlCi0jIE1VTFRJRElSUyA9IGxpc3Qgb2YgbXVsdGlsaWIgc3ViZGlycyAoZWc6IG02ODAwMCBtNjgwMjAgLi4uKQotIyAob25seSBkZWZpbmVkIGluIGVhY2ggbGlicmFyeSdzIG1haW4gTWFrZWZpbGUpLgotIyBNVUxUSVNVQkRJUiA9IGluc3RhbGxlZCBzdWJkaXJlY3RvcnkgbmFtZSB3aXRoIGxlYWRpbmcgJy8nIChlZzogL202ODAwMCkKLSMgKG9ubHkgZGVmaW5lZCBpbiBlYWNoIG11bHRpbGliIHN1YmRpcikuCi0KLSMgRklYTUU6IE11bHRpbGliIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBieSBkZWZhdWx0IGZvciBldmVyeXRoaW5nIG90aGVyIHRoYW4KLSMgbmV3bGliLiAgSXQgaXMgdXAgdG8gZWFjaCB0YXJnZXQgdG8gdHVybiBvbiBtdWx0aWxpYiBzdXBwb3J0IGZvciB0aGUgb3RoZXIKLSMgbGlicmFyaWVzIGFzIGRlc2lyZWQuCi0KLSMgV2UgaGF2ZSB0byBoYW5kbGUgYmVpbmcgaW52b2tlZCBieSBib3RoIEN5Z251cyBjb25maWd1cmUgYW5kIEF1dG9jb25mLgotIwotIyBDeWdudXMgY29uZmlndXJlIGluY29taW5nIHZhcmlhYmxlczoKLSMgc3JjZGlyLCBzdWJkaXIsIGhvc3QsIGFyZ3VtZW50cwotIwotIyBBdXRvY29uZiBpbmNvbWluZyB2YXJpYWJsZXM6Ci0jIHNyY2RpciwgaG9zdCwgYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgV2UgKmNvdWxkKiBmaWd1cmUgc3JjZGlyIGFuZCBob3N0IG91dCwgYnV0IHdlJ2QgaGF2ZSB0byBkbyB3b3JrIHRoYXQKLSMgb3VyIGNhbGxlciBoYXMgYWxyZWFkeSBkb25lIHRvIGZpZ3VyZSB0aGVtIG91dCBhbmQgcmVxdWlyaW5nIHRoZXNlIHR3bwotIyBzZWVtcyByZWFzb25hYmxlLgotIyBOb3RlIHRoYXQgYGhvc3QnIGluIHRoaXMgY2FzZSBpcyBHQ0MncyBgdGFyZ2V0Jy4gIFRhcmdldCBsaWJyYXJpZXMgYXJlCi0jIGNvbmZpZ3VyZWQgZm9yIGEgcGFydGljdWxhciBob3N0LgotCi1pZiBbIC1uICIke2FjX2NvbmZpZ3VyZV9hcmdzfSIgXTsgdGhlbgotICBNYWtlZmlsZT0ke2FjX2ZpbGUtTWFrZWZpbGV9Ci0gIG1sX2NvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotICBtbF9hcmd1bWVudHM9IiR7YWNfY29uZmlndXJlX2FyZ3N9IgotICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfQotZWxzZQotICBNYWtlZmlsZT0ke01ha2VmaWxlLU1ha2VmaWxlfQotICBtbF9jb25maWdfc2hlbGw9JHtjb25maWdfc2hlbGwtL2Jpbi9zaH0KLSAgbWxfYXJndW1lbnRzPSIke2FyZ3VtZW50c30iCi0gIGlmIFsgLW4gIiR7c3ViZGlyfSIgLWEgIiR7c3ViZGlyfSIgIT0gIi4iIF0gOyB0aGVuCi0gICAgbWxfcmVhbHNyY2Rpcj0ke3NyY2Rpcn0vJHtzdWJkaXJ9Ci0gIGVsc2UKLSAgICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfQotICBmaQotZmkKLQotIyBTY2FuIGFsbCB0aGUgYXJndW1lbnRzIGFuZCBzZXQgYWxsIHRoZSBvbmVzIHdlIG5lZWQuCi0KLW1sX3ZlcmJvc2U9LS12ZXJib3NlCi1mb3Igb3B0aW9uIGluICR7bWxfYXJndW1lbnRzfQotZG8KLSAgY2FzZSAkb3B0aW9uIGluCi0gIC0tKikgOzsKLSAgLSopIG9wdGlvbj0tJG9wdGlvbiA7OwotICBlc2FjCi0KLSAgY2FzZSAkb3B0aW9uIGluCi0gIC0tKj0qKQotCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCi0JOzsKLSAgZXNhYwotCi0gIGNhc2UgJG9wdGlvbiBpbgotICAtLWRpc2FibGUtKikKLQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLWRpc2FibGUtOmVuYWJsZV86O3M6LTpfOmcnYAotCWV2YWwgJGVuYWJsZW9wdD1ubwotCTs7Ci0gIC0tZW5hYmxlLSopCi0JY2FzZSAiJG9wdGlvbiIgaW4KLQkqPSopCTs7Ci0JKikJb3B0YXJnPXllcyA7OwotCWVzYWMKLQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCWV2YWwgJGVuYWJsZW9wdD0iJG9wdGFyZyIKLQk7OwotICAtLW5vcmVjdXJzaW9uIHwgLS1ubyopCi0JbWxfbm9yZWN1cnNpb249eWVzCi0JOzsKLSAgLS1zaWxlbnQgfCAtLXNpbCogfCAtLXF1aWV0IHwgLS1xKikKLQltbF92ZXJib3NlPS0tc2lsZW50Ci0JOzsKLSAgLS12ZXJib3NlIHwgLS12IHwgLS12ZXJiKikKLQltbF92ZXJib3NlPS0tdmVyYm9zZQotCTs7Ci0gIC0td2l0aC0qKQotCWNhc2UgIiRvcHRpb24iIGluCi0JKj0qKQk7OwotCSopCW9wdGFyZz15ZXMgOzsKLQllc2FjCi0Jd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JZXZhbCAkd2l0aG9wdD0iJG9wdGFyZyIKLQk7OwotICAtLXdpdGhvdXQtKikKLQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOm91dDo6O3M6LTpfOmcnYAotCWV2YWwgJHdpdGhvcHQ9bm8KLQk7OwotICBlc2FjCi1kb25lCi0KLSMgT25seSBkbyB0aGlzIGlmIC0tZW5hYmxlLW11bHRpbGliLgotaWYgWyAiJHtlbmFibGVfbXVsdGlsaWJ9IiA9IHllcyBdOyB0aGVuCi0KLSMgQ29tcHV0ZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwgZGlyZWN0b3J5Ci0jIChpZTogbm90IGEgbXVsdGlsaWIgc3ViZGlyZWN0b3J5LCBhbmQgbm90IGEgc3ViZGlyZWN0b3J5IGxpa2UgbGliZysrL3NyYykuCi0jICR7d2l0aF9tdWx0aXN1YmRpcn0gdGVsbHMgdXMgd2UncmUgaW4gdGhlIHJpZ2h0IGJyYW5jaCwgYnV0IHdlIGNvdWxkIGJlCi0jIGluIGEgc3ViZGlyIG9mIHRoYXQuCi0jID8/PyBUaGUgcHJldmlvdXMgdmVyc2lvbiBjb3VsZCB2b2lkIHRoaXMgdGVzdCBieSBzZXBhcmF0aW5nIHRoZSBwcm9jZXNzIGludG8KLSMgdHdvIGZpbGVzOiBvbmUgdGhhdCBvbmx5IHRoZSBsaWJyYXJ5J3MgdG9wbGV2ZWwgY29uZmlndXJlLmluIHJhbiAodG8KLSMgY29uZmlndXJlIHRoZSBtdWx0aWxpYiBzdWJkaXJzKSwgYW5kIGFub3RoZXIgdGhhdCBhbGwgY29uZmlndXJlLmluJ3MgcmFuIHRvCi0jIHVwZGF0ZSB0aGUgTWFrZWZpbGUuICBJdCBzZWVtZWQgcmVhc29uYWJsZSB0byBjb2xsYXBzZSBhbGwgbXVsdGlsaWIgc3VwcG9ydAotIyBpbnRvIG9uZSBmaWxlLCBidXQgaXQgZG9lcyBsZWF2ZSB1cyB3aXRoIGhhdmluZyB0byBwZXJmb3JtIHRoaXMgdGVzdC4KLW1sX3RvcGxldmVsX3A9bm8KLWlmIFsgLXogIiR7d2l0aF9tdWx0aXN1YmRpcn0iIF07IHRoZW4KLSAgaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gICAgIyBVc2UgJHttbF9yZWFsc3JjZGlyfSBpbnN0ZWFkIG9mICR7c3JjZGlyfSBoZXJlIHRvIGFjY291bnQgZm9yICR7c3ViZGlyfS4KLSAgICAjICR7d2l0aF90YXJnZXRfc3ViZGlyfSA9ICIuIiBmb3IgbmF0aXZlLCBvdGhlcndpc2UgdGFyZ2V0IGFsaWFzLgotICAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgPSAiLiIgXTsgdGhlbgotICAgICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCi0JbWxfdG9wbGV2ZWxfcD15ZXMKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uLy4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCi0JbWxfdG9wbGV2ZWxfcD15ZXMKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgICMgVXNlICR7bWxfcmVhbHNyY2Rpcn0gaW5zdGVhZCBvZiAke3NyY2Rpcn0gaGVyZSB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0gICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCi0gICAgICBtbF90b3BsZXZlbF9wPXllcwotICAgIGZpCi0gIGZpCi1maQotCi0jIElmIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwgZGlyZWN0b3J5LCBzZXQgbXVsdGlkaXJzIHRvIHRoZQotIyBtdWx0aWxpYiBzdWJkaXJzIHRvIHN1cHBvcnQuICBUaGlzIGxpdmVzIGF0IHRoZSB0b3AgYmVjYXVzZSB3ZSBuZWVkCi0jIGBtdWx0aWRpcnMnIHNldCByaWdodCBhd2F5LgotCi1pZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0KLW11bHRpZGlycz0KLWZvciBpIGluIGAke0NDLWdjY30gLS1wcmludC1tdWx0aS1saWIgMj4vZGV2L251bGxgOyBkbwotICBkaXI9YGVjaG8gJGkgfCBzZWQgLWUgJ3MvOy4qJC8vJ2AKLSAgaWYgWyAiJHtkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gICAgdHJ1ZQotICBlbHNlCi0gICAgaWYgWyAteiAiJHttdWx0aWRpcnN9IiBdOyB0aGVuCi0gICAgICBtdWx0aWRpcnM9IiR7ZGlyfSIKLSAgICBlbHNlCi0gICAgICBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke2Rpcn0iCi0gICAgZmkKLSAgZmkKLWRvbmUKLQotIyBUYXJnZXQgbGlicmFyaWVzIGFyZSBjb25maWd1cmVkIGZvciB0aGUgaG9zdCB0aGV5IHJ1biBvbiwgc28gd2UgY2hlY2sKLSMgJGhvc3QgaGVyZSwgbm90ICR0YXJnZXQuCi0KLWNhc2UgIiR7aG9zdH0iIGluCi1hcmMtKi1lbGYqKQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gIT0geHllcyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqYmUqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLWFybS0qLSopCi0JaWYgWyB4IiRlbmFibGVfZnB1IiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqZnB1KikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCIkZW5hYmxlXzI2Yml0IiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqMjZiaXQqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4IiRlbmFibGVfdW5kZXJzY29yZSIgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKnVuZGVyKikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCIkZW5hYmxlX2ludGVyd29yayIgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKmludGVyd29yayopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpsZSogKSA6IDs7Ci0JICAgICAgKmJlKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotbTY4Ki0qLSopCi0JaWYgWyB4JGVuYWJsZV9zb2Z0ZmxvYXQgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnNvZnQtZmxvYXQqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfbTY4ODgxID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptNjg4ODEqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfbTY4MDAwID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptNjgwMDAqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfbTY4MDIwID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptNjgwMjAqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1taXBzKi0qLSopCi0JaWYgWyB4JGVuYWJsZV9zaW5nbGVfZmxvYXQgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnNpbmdsZSogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqZWwqICkgOiA7OwotCSAgICAgICplYiogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9zb2Z0ZmxvYXQgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnNvZnQtZmxvYXQqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1wb3dlcnBjKi0qLSogfCByczYwMDAqLSotKikKLQlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9wb3dlcmNwdSA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICBwb3dlciB8ICovcG93ZXIgfCAqL3Bvd2VyLyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9wb3dlcnBjY3B1ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpwb3dlcnBjKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3Bvd2VycGNvcyA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWNhbGwtbGludXgqIHwgKm1jYWxsLXNvbGFyaXMqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm1saXR0bGUqIHwgKm1iaWcqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfc3lzdiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWNhbGwtc3lzdiogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9haXggPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm1jYWxsLWFpeCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLWVzYWMKLQotIyBSZW1vdmUgZXh0cmFuZW91cyBibGFua3MgZnJvbSBtdWx0aWRpcnMuCi0jIFRlc3RzIGxpa2UgYGlmIFsgLW4gIiRtdWx0aWRpcnMiIF0nIHJlcXVpcmUgaXQuCi1tdWx0aWRpcnM9YGVjaG8gIiRtdWx0aWRpcnMiIHwgc2VkIC1lICdzL15bIF1bIF0qLy8nIC1lICdzL1sgXVsgXSokLy8nIC1lICdzL1sgXVsgXSovIC9nJ2AKLQotIyBBZGQgY29kZSB0byBsaWJyYXJ5J3MgdG9wIGxldmVsIG1ha2VmaWxlIHRvIGhhbmRsZSBidWlsZGluZyB0aGUgbXVsdGlsaWIKLSMgc3ViZGlycy4KLQotY2F0ID4gTXVsdGkudGVtIDw8XEVPRgotCi0jIEZJWE1FOiBUaGVyZSBzaG91bGQgYmUgYW4gQC1zaWduIGluIGZyb250IG9mIHRoZSBgaWYnLgotIyBMZWF2ZSBvdXQgdW50aWwgdGhpcyBpcyB0ZXN0ZWQgYSBiaXQgbW9yZS4KLW11bHRpLWRvOgotCWlmIFsgLXogIiQoTVVMVElESVJTKSIgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICByb290cHJlPWBwd2RgLzsgZXhwb3J0IHJvb3RwcmU7IFwKLQkgIHNyY3Jvb3RwcmU9YGNkICQoc3JjZGlyKTsgcHdkYC87IGV4cG9ydCBzcmNyb290cHJlOyBcCi0JICBsaWI9YGVjaG8gJCR7cm9vdHByZX0gfCBzZWQgLWUgJ3MsXi4qL1woW14vXVteL10qXCkvJCQsXDEsJ2A7IFwKLQkgIGNvbXBpbGVyPSIkKENDKSI7IFwKLQkgIGZvciBpIGluIGAkJHtjb21waWxlcn0gLS1wcmludC1tdWx0aS1saWIgMj4vZGV2L251bGxgOyBkbyBcCi0JICAgIGRpcj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvOy4qJCQvLydgOyBcCi0JICAgIGlmIFsgIiQke2Rpcn0iID0gIi4iIF07IHRoZW4gXAotCSAgICAgIHRydWU7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgaWYgWyAtZCAuLi8kJHtkaXJ9LyQke2xpYn0gXTsgdGhlbiBcCi0JCWZsYWdzPWBlY2hvICQkaSB8IHNlZCAtZSAncy9eW147XSo7Ly8nIC1lICdzL0AvIC0vZydgOyBcCi0JCWlmIChjZCAuLi8kJHtkaXJ9LyQke2xpYn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBcCi0JCQkJQ0ZMQUdTPSIkKENGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJQ1hYRkxBR1M9IiQoQ1hYRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUxJQkNGTEFHUz0iJChMSUJDRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUxJQkNYWEZMQUdTPSIkKExJQkNYWEZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlMREZMQUdTPSIkKExERkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCSQoRE8pKTsgdGhlbiBcCi0JCSAgdHJ1ZTsgXAotCQllbHNlIFwKLQkJICBleGl0IDE7IFwKLQkJZmk7IFwKLQkgICAgICBlbHNlIHRydWU7IFwKLQkgICAgICBmaTsgXAotCSAgICBmaTsgXAotCSAgZG9uZTsgXAotCWZpCi0KLSMgRklYTUU6IFRoZXJlIHNob3VsZCBiZSBhbiBALXNpZ24gaW4gZnJvbnQgb2YgdGhlIGBpZicuCi0jIExlYXZlIG91dCB1bnRpbCB0aGlzIGlzIHRlc3RlZCBhIGJpdCBtb3JlLgotbXVsdGktY2xlYW46Ci0JaWYgWyAteiAiJChNVUxUSURJUlMpIiBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbHNlIFwKLQkgIGxpYj1gcHdkIHwgc2VkIC1lICdzLF4uKi9cKFteL11bXi9dKlwpJCQsXDEsJ2A7IFwKLQkgIGZvciBkaXIgaW4gTWFrZWZpbGUgJChNVUxUSURJUlMpOyBkbyBcCi0JICAgIGlmIFsgLWYgLi4vJCR7ZGlyfS8kJHtsaWJ9L01ha2VmaWxlIF07IHRoZW4gXAotCSAgICAgIGlmIChjZCAuLi8kJHtkaXJ9LyQke2xpYn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkKERPKSk7IFwKLQkgICAgICB0aGVuIHRydWU7IFwKLQkgICAgICBlbHNlIGV4aXQgMTsgXAotCSAgICAgIGZpOyBcCi0JICAgIGVsc2UgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZG9uZTsgXAotCWZpCi1FT0YKLQotY2F0ICR7TWFrZWZpbGV9IE11bHRpLnRlbSA+IE1ha2VmaWxlLnRlbQotcm0gLWYgJHtNYWtlZmlsZX0gTXVsdGkudGVtCi1tdiBNYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KLQotZmkgIyAke21sX3RvcGxldmVsX3B9ID0geWVzCi0KLWlmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KLSAgZWNobyAiQWRkaW5nIG11bHRpbGliIHN1cHBvcnQgdG8gTWFrZWZpbGUgaW4gJHttbF9yZWFsc3JjZGlyfSIKLSAgaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotICAgIGVjaG8gIm11bHRpZGlycz0ke211bHRpZGlyc30iCi0gIGZpCi0gIGVjaG8gIndpdGhfbXVsdGlzdWJkaXI9JHt3aXRoX211bHRpc3ViZGlyfSIKLWZpCi0KLWlmIFsgIiR7c3JjZGlyfSIgPSAiLiIgXTsgdGhlbgotICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdOyB0aGVuCi0gICAgbWxfc3JjZG90ZG90PSIuLi8iCi0gIGVsc2UKLSAgICBtbF9zcmNkb3Rkb3Q9IiIKLSAgZmkKLWVsc2UKLSAgbWxfc3JjZG90ZG90PSIiCi1maQotCi1pZiBbIC16ICIke3dpdGhfbXVsdGlzdWJkaXJ9IiBdOyB0aGVuCi0gIG1sX3N1YmRpcj0KLSAgbWxfYnVpbGRkb3Rkb3Q9Ci0gIDogIyBtbF9zcmNkb3Rkb3Q9ICMgYWxyZWFkeSBzZXQKLWVsc2UKLSAgbWxfc3ViZGlyPSIvJHt3aXRoX211bHRpc3ViZGlyfSIKLSAgIyBUaGUgJ1teL11bXi9dKicgYXBwZWFycyB0aGF0IHdheSB0byB3b3JrIGFyb3VuZCBhIFN1bk9TIHNlZCBidWcuCi0gIG1sX2J1aWxkZG90ZG90PWBlY2hvICR7d2l0aF9tdWx0aXN1YmRpcn0gfCBzZWQgLWUgJ3M6W14vXVteL10qOi4uOmcnYC8KLSAgaWYgWyAiJHNyY2RpciIgPSAiLiIgXTsgdGhlbgotICAgIG1sX3NyY2RvdGRvdD0ke21sX3NyY2RvdGRvdH0ke21sX2J1aWxkZG90ZG90fQotICBlbHNlCi0gICAgOiAjIG1sX3NyY2RvdGRvdD0gIyBhbHJlYWR5IHNldAotICBmaQotZmkKLQotaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotICBtbF9kbz0nJChNQUtFKScKLSAgbWxfY2xlYW49JyQoTUFLRSknCi1lbHNlCi0gIG1sX2RvPXRydWUKLSAgbWxfY2xlYW49dHJ1ZQotZmkKLQotIyBUT1AgaXMgdXNlZCBieSBuZXdsaWIgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBlbHNld2hlcmUgZm9yIHRoaXMgcHVycG9zZS4KLSMgTVVMVEl7U1JDLEJVSUxEfVRPUCBhcmUgdGhlIHByb3BlciBvbmVzIHRvIHVzZS4gIE1VTFRJU1JDVE9QIGlzIGVtcHR5Ci0jIHdoZW4gc3JjZGlyICE9IGJ1aWxkZGlyLiAgTVVMVElCVUlMRFRPUCBpcyBhbHdheXMgc29tZSBudW1iZXIgb2YgLi4vJ3MuCi0jIEZJWE1FOiBuZXdsaWIgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byB1c2UgTVVMVEl7U1JDLEJVSUxEfVRPUCBzbyB3ZSBjYW4KLSMgZGVsZXRlIFRPUC4gIE5ld2xpYiBtYXkgd2lzaCB0byBjb250aW51ZSB0byB1c2UgVE9QIGZvciBpdHMgb3duIHB1cnBvc2VzCi0jIG9mIGNvdXJzZS4KLSMgTVVMVElESVJTIGlzIG5vbi1lbXB0eSBmb3IgdGhlIGNwdSB0b3AgbGV2ZWwgTWFrZWZpbGUgKGVnOiBuZXdsaWIvTWFrZWZpbGUpCi0jIGFuZCBsaXN0cyB0aGUgc3ViZGlyZWN0b3JpZXMgdG8gcmVjdXJzZSBpbnRvLgotIyBNVUxUSVNVQkRJUiBpcyBub24tZW1wdHkgaW4gZWFjaCBjcHUgc3ViZGlyZWN0b3J5J3MgTWFrZWZpbGUKLSMgKGVnOiBuZXdsaWIvaDgzMDBoL01ha2VmaWxlKSBhbmQgaXMgdGhlIGluc3RhbGxlZCBzdWJkaXJlY3RvcnkgbmFtZSB3aXRoCi0jIGEgbGVhZGluZyAnLycuCi0jIE1VTFRJRE8gaXMgdXNlZCBmb3IgdGFyZ2V0cyBsaWtlIGFsbCwgaW5zdGFsbCwgYW5kIGNoZWNrIHdoZXJlCi0jICQoRkxBR1NfVE9fUEFTUykgYXVnbWVudGVkIHdpdGggdGhlIHN1YmRpcidzIGNvbXBpbGVyIG9wdGlvbiBpcyBuZWVkZWQuCi0jIE1VTFRJQ0xFQU4gaXMgdXNlZCBmb3IgdGhlICpjbGVhbiB0YXJnZXRzLgotIwotIyA/Pz8gSXQgaXMgcG9zc2libGUgdG8gbWVyZ2UgTVVMVElETyBhbmQgTVVMVElDTEVBTiBpbnRvIG9uZS4gIFRoZXkgYXJlCi0jIGN1cnJlbnRseSBrZXB0IHNlcGFyYXRlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgKmNsZWFuIHRhcmdldHMgdG8gcmVxdWlyZQotIyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjb21waWxlciAod2hpY2ggTVVMVElETyBjdXJyZW50bHkgcmVxdWlyZXMpIGFuZAotIyB0aGVyZWZvcmUgd2UnZCBoYXZlIHRvIHJlY29yZCB0aGUgZGlyZWN0b3J5IG9wdGlvbnMgYXMgd2VsbCBhcyBuYW1lcwotIyAoY3VycmVudGx5IHdlIGp1c3QgcmVjb3JkIHRoZSBuYW1lcyBhbmQgdXNlIC0tcHJpbnQtbXVsdGktbGliIHRvIGdldCB0aGUKLSMgb3B0aW9ucykuCi0KLXNlZCAtZSAiczpeVE9QWyAJXSo9WyAJXSpcKFsuL10qXClbIAldKiQ6VE9QID0gJHttbF9idWlsZGRvdGRvdH1cMToiIFwKLSAgICAtZSAiczpeTVVMVElTUkNUT1BbIAldKj0uKiQ6TVVMVElTUkNUT1AgPSAke21sX3NyY2RvdGRvdH06IiBcCi0gICAgLWUgInM6Xk1VTFRJQlVJTERUT1BbIAldKj0uKiQ6TVVMVElCVUlMRFRPUCA9ICR7bWxfYnVpbGRkb3Rkb3R9OiIgXAotICAgIC1lICJzOl5NVUxUSURJUlNbIAldKj0uKiQ6TVVMVElESVJTID0gJHttdWx0aWRpcnN9OiIgXAotICAgIC1lICJzOl5NVUxUSVNVQkRJUlsgCV0qPS4qJDpNVUxUSVNVQkRJUiA9ICR7bWxfc3ViZGlyfToiIFwKLSAgICAtZSAiczpeTVVMVElET1sgCV0qPS4qJDpNVUxUSURPID0gJG1sX2RvOiIgXAotICAgIC1lICJzOl5NVUxUSUNMRUFOWyAJXSo9LiokOk1VTFRJQ0xFQU4gPSAkbWxfY2xlYW46IiBcCi0JJHtNYWtlZmlsZX0gPiBNYWtlZmlsZS50ZW0KLXJtIC1mICR7TWFrZWZpbGV9Ci1tdiBNYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KLQotIyBJZiB0aGlzIGlzIHRoZSBsaWJyYXJ5J3MgdG9wIGxldmVsLCBjb25maWd1cmUgZWFjaCBtdWx0aWxpYiBzdWJkaXIuCi0jIFRoaXMgaXMgZG9uZSBhdCB0aGUgZW5kIGJlY2F1c2UgdGhpcyBpcyB0aGUgbG9vcCB0aGF0IHJ1bnMgY29uZmlndXJlCi0jIGluIGVhY2ggbXVsdGlsaWIgc3ViZGlyIGFuZCBpdCBzZWVtZWQgcmVhc29uYWJsZSB0byBmaW5pc2ggdXBkYXRpbmcgdGhlCi0jIE1ha2VmaWxlIGJlZm9yZSBnb2luZyBvbiB0byBjb25maWd1cmUgdGhlIHN1YmRpcnMuCi0KLWlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLQotIyBXZSBtdXN0IGZyZXNobHkgY29uZmlndXJlIGVhY2ggc3ViZGlyZWN0b3J5LiAgVGhpcyBiaXQgb2YgY29kZSBpcwotIyBhY3R1YWxseSBwYXJ0aWFsbHkgc3RvbGVuIGZyb20gdGhlIG1haW4gY29uZmlndXJlIHNjcmlwdC4gIEZJWE1FLgotCi1pZiBbIC1uICIke211bHRpZGlyc30iIF0gJiYgWyAteiAiJHttbF9ub3JlY3Vyc2lvbn0iIF07IHRoZW4KLQotICBpZiBbICIke21sX3ZlcmJvc2V9IiA9IC0tdmVyYm9zZSBdOyB0aGVuCi0gICAgZWNobyAiUnVubmluZyBjb25maWd1cmUgaW4gbXVsdGlsaWIgc3ViZGlycyAke211bHRpZGlyc30iCi0gICAgZWNobyAicHdkOiBgcHdkYCIKLSAgZmkKLQotICBtbF9vcmlnZGlyPWBwd2RgCi0gIG1sX2xpYmRpcj1gZWNobyAkbWxfb3JpZ2RpciB8IHNlZCAtZSAncyxeLiovLCwnYAotICAjIGNkIHRvIHRvcC1sZXZlbC1idWlsZC1kaXIvJHt3aXRoX3RhcmdldF9zdWJkaXJ9Ci0gIGNkIC4uCi0KLSAgZm9yIG1sX2RpciBpbiAke211bHRpZGlyc307IGRvCi0KLSAgICBpZiBbICIke21sX3ZlcmJvc2V9IiA9IC0tdmVyYm9zZSBdOyB0aGVuCi0gICAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZSBpbiBtdWx0aWxpYiBzdWJkaXIgJHttbF9kaXJ9IgotICAgICAgZWNobyAicHdkOiBgcHdkYCIKLSAgICBmaQotCi0gICAgaWYgWyAtZCAke21sX2Rpcn0gXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyICR7bWxfZGlyfTsgZmkKLSAgICBpZiBbIC1kICR7bWxfZGlyfS8ke21sX2xpYmRpcn0gXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyICR7bWxfZGlyfS8ke21sX2xpYmRpcn07IGZpCi0KLSAgICAjIEVnOiBpZiAke21sX2Rpcn0gPSBtNjgwMDAvbTY4ODgxLCBkb3Rkb3QgPSAuLi8uLi8KLSAgICBkb3Rkb3Q9Li4vYGVjaG8gJHttbF9kaXJ9IHwgc2VkIC1lICdzfFteL118fGcnIC1lICdzfC98Li4vfGcnYAotCi0gICAgY2FzZSAke3NyY2Rpcn0gaW4KLSAgICAiLiIpCi0gICAgICBlY2hvIEJ1aWxkaW5nIHN5bWxpbmsgdHJlZSBpbiBgcHdkYC8ke21sX2Rpcn0vJHttbF9saWJkaXJ9Ci0gICAgICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdOyB0aGVuCi0JbWxfdW5zdWJkaXI9Ii4uLyIKLSAgICAgIGVsc2UKLQltbF91bnN1YmRpcj0iIgotICAgICAgZmkKLSAgICAgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OwotICAgICAgIC4uLyR7ZG90ZG90fSR7bWxfdW5zdWJkaXJ9c3ltbGluay10cmVlIC4uLyR7ZG90ZG90fSR7bWxfdW5zdWJkaXJ9JHttbF9saWJkaXJ9ICIiKQotICAgICAgaWYgWyAtZiAke21sX2Rpcn0vJHttbF9saWJkaXJ9L01ha2VmaWxlIF07IHRoZW4KLQlpZiBbIHgiJHtNQUtFfSIgPSB4IF07IHRoZW4KLQkgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyBtYWtlIGRpc3RjbGVhbikKLQllbHNlCi0JICAoY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgJHtNQUtFfSBkaXN0Y2xlYW4pCi0JZmkKLSAgICAgIGZpCi0gICAgICBtbF9uZXdzcmNkaXI9Ii4iCi0gICAgICBtbF9zcmNkaXJvcHRpb249Ci0gICAgICBtdWx0aXNyY3RvcD0ke2RvdGRvdH0KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgIC8qKSAjIGFic29sdXRlIHBhdGgKLSAgICAgICAgbWxfbmV3c3JjZGlyPSR7c3JjZGlyfQotICAgICAgICA7OwotICAgICAgKikgIyBvdGhlcndpc2UgcmVsYXRpdmUKLSAgICAgICAgbWxfbmV3c3JjZGlyPSR7ZG90ZG90fSR7c3JjZGlyfQotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgbWxfc3JjZGlyb3B0aW9uPSItc3JjZGlyPSR7bWxfbmV3c3JjZGlyfSIKLSAgICAgIG11bHRpc3JjdG9wPQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBjYXNlICIke3Byb2duYW1lfSIgaW4KLSAgICAvKikgICAgIG1sX3JlY3Byb2c9JHtwcm9nbmFtZX0gOzsKLSAgICAqKSAgICAgIG1sX3JlY3Byb2c9JHtkb3Rkb3R9JHtwcm9nbmFtZX0gOzsKLSAgICBlc2FjCi0KLSAgICAjIEZJWE1FOiBQT1BESVI9JHtQV0Q9YHB3ZGB9IGRvZXNuJ3Qgd29yayBoZXJlLgotICAgIE1MX1BPUERJUj1gcHdkYAotICAgIGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn0KLQotICAgIGlmIFsgLWYgJHttbF9uZXdzcmNkaXJ9L2NvbmZpZ3VyZSBdOyB0aGVuCi0gICAgICBtbF9yZWNwcm9nPSR7bWxfbmV3c3JjZGlyfS9jb25maWd1cmUKLSAgICBmaQotICAgIGlmIGV2YWwgJHttbF9jb25maWdfc2hlbGx9ICR7bWxfcmVjcHJvZ30gXAotCS0td2l0aC1tdWx0aXN1YmRpcj0ke21sX2Rpcn0gLS13aXRoLW11bHRpc3JjdG9wPSR7bXVsdGlzcmN0b3B9IFwKLQkke21sX2FyZ3VtZW50c30gJHttbF9zcmNkaXJvcHRpb259IDsgdGhlbgotICAgICAgdHJ1ZQotICAgIGVsc2UKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBjZCAke01MX1BPUERJUn0KLQotICBkb25lCi0KLSAgY2QgJHttbF9vcmlnZGlyfQotZmkKLQotZmkgIyAke21sX3RvcGxldmVsX3B9ID0geWVzCi1maSAjICR7ZW5hYmxlX211bHRpbGlifSA9IHllcwpkaWZmIC0tZ2l0IGEvY29uZmlnLmd1ZXNzIGIvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODVmNjYxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDEwMDggKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgV3JpdHRlbiBieSBQZXIgQm90aG5lciA8Ym90aG5lckBjeWdudXMuY29tPi4KLSMgVGhlIG1hc3RlciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpcyBhdCB0aGUgRlNGIGluIC9ob21lL2dkL2dudS9saWIuCi0jCi0jIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KLSMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCi0jIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgotIwotIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKLSMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBzeXN0ZW0gdHlwZSAoaG9zdC90YXJnZXQgbmFtZSkuCi0jCi0jIE9ubHkgYSBmZXcgc3lzdGVtcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBsaXN0OyBwbGVhc2UgYWRkIG90aGVycwotIyAoYnV0IHRyeSB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgY2xlYW4pLgotIwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDgvMjQvOTQuKQotaWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKLWZpCi0KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotdHJhcCAncm0gLWYgZHVtbXkuYyBkdW1teS5vIGR1bW15OyBleGl0IDEnIDEgMiAxNQotCi0jIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCi0KLWNhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KLSAgICBhbHBoYTpPU0YxOio6KikKLQlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JZmkKLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWNhdCA8PEVPRiA+ZHVtbXkucwotCS5nbG9ibCBtYWluCi0JLmVudCBtYWluCi1tYWluOgotCS5mcmFtZSBcJDMwLDAsXCQyNiwwCi0JLnByb2xvZ3VlIDAKLQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAotCWxkYSBcJDIsMjU5Ci0JLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0Jc3JsIFwkMSw4LFwkMgotCXNsbCBcJDIsMixcJDIKLQlzbGwgXCQwLDMsXCQwCi0JYWRkbCBcJDEsXCQwLFwkMAotCWFkZGwgXCQyLFwkMCxcJDAKLQlyZXQgXCQzMSwoXCQyNiksMQotCS5lbmQgbWFpbgotRU9GCi0JJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCS4vZHVtbXkKLQkJY2FzZSAiJD8iIGluCi0JCQk3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxNSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMTQpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkxNikKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQllc2FjCi0JZmkKLQlybSAtZiBkdW1teS5zIGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstY2JtLXN5c3Y0Ci0JZXhpdCAwOzsKLSAgICBhbWlnYTpOZXRCU0Q6KjoqKQotICAgICAgZWNobyBtNjhrLWNibS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0gICAgICBleGl0IDAgOzsKLSAgICBhbWlnYTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcwotCWV4aXQgMCA7OwotICAgIGFyYzY0Ok9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwczY0ZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaGttaXBzOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG1heDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc2dpOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgYXJtMzI6TmV0QlNEOio6KikKLQllY2hvIGFybS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqKQotCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDA7OwotICAgIFB5cmFtaWQqOk9TeCo6KjoqfE1JUyo6T1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIE5JTEU6KjoqOmRjb3N4KQotCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKLSAgICBzdW40SDpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKGhlYWQgLTEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCi0JdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MwotCWNhc2UgImAvYmluL2FyY2hgIiBpbgotCSAgICBzdW4zKQotCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCSAgICBzdW40KQotCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQllc2FjCi0JZXhpdCAwIDs7Ci0gICAgYXVzaHA6U3VuT1M6KjoqKQotCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXRhcmkqOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6TmV0QlNEOio6KikKLQllY2hvIG02OGstc3VuLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zKjpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqKQotCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+ZHVtbXkuYwotCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqKmFyZ3Y7IHsKLQkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2VuZGlmCi0JICBleGl0ICgtMSk7Ci0JfQotRU9GCi0JJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSBcCi0JICAmJiAuL2R1bW15IGBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgIFwKLQkgICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgZHVtbXkuYyBkdW1teQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azpDWC9VWDo3KjoqKQotCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDAgOzsKLSAgICBtODhrOio6NCo6UjQqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgMCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgQVZpaU9OOmRndXg6KjoqKQotICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAotICAgICAgICBpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIC1vICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0gOyB0aGVuCi0JaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXAotCSAgICAgLW8gJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdIDsgdGhlbgotCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGVsc2UgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGZpCi0gCWV4aXQgMCA7OwotICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCi0JZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKLQlleGl0IDAgOzsKLSAgICBNODgqOio6UjMqOiopCi0JIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMwotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgMCA7OwotICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQotCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQotCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgKjpJUklYKjoqOiopCi0JZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAotCWV4aXQgMCA7OwotICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KLQllY2hvIHJvbXAtaWJtLWFpeCAgICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKLQlleGl0IDAgOzsgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJwotICAgIGk/ODY6QUlYOio6KikKLQllY2hvIGkzODYtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgICo6QUlYOjI6MykKLQlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJc2VkICdzL14JCS8vJyA8PCBFT0YgPmR1bW15LmMKLQkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KLQotCQltYWluKCkKLQkJCXsKLQkJCWlmICghX19wb3dlcl9wYygpKQotCQkJCWV4aXQoMSk7Ci0JCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOwotCQkJZXhpdCgwKTsKLQkJCX0KLUVPRgotCQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQkJcm0gLWYgZHVtbXkuYyBkdW1teQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6NCkKLQlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FSGwgcHJvYzAgfCBncmVwIFBPV0VSID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj00LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIE5ldEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgICo5Pz8qOk1QRS9pWDoqOiopCi0JZWNobyBocHBhMS4wLWhwLW1wZWl4Ci0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQotCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OwotCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7Ci0JICAgIDkwMDAvWzY3OF1bMC05XVswLTldICkKLQotICAgICAgICAgICAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+ZHVtbXkuYwotICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYgCi0gICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KSAKLSAgICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOiAKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykgCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmIAotICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICBleGl0ICgwKTsKLSAgICAgICAgICAgICAgfQotRU9GCi0JKCR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgKSAmJiBIUF9BUkNIPWAuL2R1bW15YAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllc2FjCi0JSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIDMwNTAqOkhJLVVYOio6KikKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQlybSAtZiBkdW1teS5jIGR1bW15Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCi0JZWNobyBocHBhMS4xLWhwLW9zZgotCWV4aXQgMCA7OwotICAgIGhwOD8/Ok9TRjE6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBpPzg2Ok9TRjE6KjoqKQotCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCi0JZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCi0JZmkKLQlleGl0IDAgOzsKLSAgICBwYXJpc2MqOkxpdGVzKjoqOiopCi0JZWNobyBocHBhMS4xLWhwLWxpdGVzCi0JZXhpdCAwIDs7Ci0gICAgaHBwYSo6T3BlbkJTRDoqOiopCi0JZWNobyBocHBhLXVua25vd24tb3BlbmJzZAotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlgtTVA6KjoqOiopCi0JZWNobyB4bXAtY3JheS11bmljb3MKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpZLU1QOio6KjoqKQotCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIENSQVkqW0EtWl05MDoqOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKLQl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKLQkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LwotCWV4aXQgMCA7OwotICAgIENSQVkqVFM6KjoqOiopCi0JZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgQ1JBWS0yOio6KjoqKQotCWVjaG8gY3JheTItY3JheS11bmljb3MKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMDpVTklYX1N5c3RlbV9WOio6KikKLSAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICJmMzAwLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMTpVTklYX1N5c3RlbV9WOio6KikKLSAgICAgICBlY2hvIGYzMDEtZnVqaXRzdS11eHB2YGVjaG8gJFVOQU1FX1JFTEVBU0UgfCBzZWQgJ3MvIC4qLy8nYAotICAgICAgIGV4aXQgMCA7OwotICAgIGhwM1swLTldWzA1XTpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1ocC1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBpPzg2OkJTRC8zODY6KjoqIHwgKjpCU0QvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLQkgICAgaWYgdGVzdCAiZWxmIiA9ICJgL3Vzci9iaW4vb2JqZm9ybWF0YCI7IHRoZW4KLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGVsZmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi8vJ2AKLQkJZXhpdCAwCi0JICAgIGZpCi0JZmkKLSAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpOZXRCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgICo6T3BlbkJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3BlbmJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgIGkqOltDY11bWXldW0dnXVtXd11bSWldW05uXSo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luMzIKLQlleGl0IDAgOzsKLSAgICBpKjpNSU5HVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgotCWV4aXQgMCA7OwotICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQotICAgICAgICAjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiBnZW5lcmljIHBvc2l4IHN1YnN5c3RlbT8KLQkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQotCSMgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mCi0JIyBpMzg2PwotCWVjaG8gaTM4Ni1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgMCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbjMyCi0JZXhpdCAwIDs7Ci0gICAgcHJlcCo6U3VuT1M6NS4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgICo6R05VOio6KikKLQllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKLQlleGl0IDAgOzsKLSAgICAqOkxpbnV4Oio6KikKLQkjIHVuYW1lIG9uIHRoZSBBUk0gcHJvZHVjZXMgYWxsIHNvcnRzIG9mIHN0cmFuZ2VuZXNzLCBhbmQgd2UgbmVlZCB0bwotCSMgZmlsdGVyIGl0IG91dC4KLQljYXNlICIkVU5BTUVfTUFDSElORSIgaW4KLQkgIGFybXYqKQkJICAgICAgVU5BTUVfTUFDSElORT0kVU5BTUVfTUFDSElORSA7OwotCSAgYXJtKiB8IHNhMTEwKikJICAgICAgVU5BTUVfTUFDSElORT0iYXJtIiA7OwotCWVzYWMKLQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLgotCWxkX2hlbHBfc3RyaW5nPWBsZCAtLWhlbHAgMj4mMWAKLQlsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucz1gZWNobyAkbGRfaGVscF9zdHJpbmcgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCBlbXVsYXRpb25zOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCBlbXVsYXRpb25zOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF9lbXVsYXRpb25zIiBpbgotCSAgaT84NmxpbnV4KSAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IiAgICAgIDsgZXhpdCAwIDs7Ci0JICBpPzg2Y29mZikgICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiICAgICAgOyBleGl0IDAgOzsKLQkgIHNwYXJjbGludXgpIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OwotCSAgYXJtbGludXgpICAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7Ci0JICBtNjhrbGludXgpICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKLQkgIGVsZjMycHBjIHwgZWxmMzJwcGNsaW51eCkKLQkJIyBEZXRlcm1pbmUgTGliIFZlcnNpb24KLQkJY2F0ID5kdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykKLWV4dGVybiBjaGFyIF9fbGliY192ZXJzaW9uW107Ci1leHRlcm4gY2hhciBfX2xpYmNfcmVsZWFzZVtdOwotI2VuZGlmCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWYgZGVmaW5lZChfX0dMSUJDX18pCi0gIHByaW50ZigiJXMgJXNcbiIsIF9fbGliY192ZXJzaW9uLCBfX2xpYmNfcmVsZWFzZSk7Ci0jZWxzZQotICBwcmludGYoInVua293blxuIik7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLQkJTElCQz0iIgotCQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+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+ICAgICAgICAgICAgICAgICAgICAgIAotbWFpbihhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsgICAgICAgICAgCi0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgcHJpbnRmKCIlZFxuIiwgX19HTElCQ19NSU5PUl9fKTsKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLSAgICAgICR7Q0MtY2N9ICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbAotICAgICAgaWYgWyAiJD8iID0gMCBdCi0gICAgICB0aGVuCi0JbGliY19pbnRlcmZhY2U9LWxpYmM2LmAuLyRkdW1teWAtCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0gICAgICBlbHNlCi0JIyBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuLgotCWVjaG8gIkNhbm5vdCBmaW5kIHRoZSBHTlUgQyBsaWJyYXJ5IG1pbm9yIHZlcnNpb24gbnVtYmVyLiIgPiYyCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZXhpdCAxCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgQ3Jvc3MgY29tcGlsaW5nLiBBc3N1bWUgZ2xpYmMgMi4xLgotICAgICAgbGliY19pbnRlcmZhY2U9LWxpYmM2LjEtCi0gICAgZmkKLSAgICA7OwotICAqKQotICAgIGxpYmNfaW50ZXJmYWNlPS0KLSAgICA7OwotICBlc2FjCi1maQpkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZjJlOTkuLjAwMDAwMDAKLS0tIGEvY29uZmlnLnN1YgorKysgL2Rldi9udWxsCkBAIC0xLDEyMTMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQsIHZlcnNpb24gMS4xLgotIyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTItOTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KLSMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQotIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotaWYgWyB4JDEgPSB4IF0KLXRoZW4KLQllY2hvIENvbmZpZ3VyYXRpb24gbmFtZSBtaXNzaW5nLiAxPiYyCi0JZWNobyAiVXNhZ2U6ICQwIENQVS1NRlItT1BTWVMiIDE+JjIKLQllY2hvICJvciAgICAgJDAgQUxJQVMiIDE+JjIKLQllY2hvIHdoZXJlIEFMSUFTIGlzIGEgcmVjb2duaXplZCBjb25maWd1cmF0aW9uIHR5cGUuIDE+JjIKLQlleGl0IDEKLWZpCi0KLSMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotY2FzZSAkMSBpbgotCSpsb2NhbCopCi0JCWVjaG8gJDEKLQkJZXhpdCAwCi0JCTs7Ci0JKikKLQk7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBsaW51eC1nbnUqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gICopCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAotICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQotICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKLSAgICBlbHNlIG9zPTsgZmkKLSAgICA7OwotZXNhYwotCi0jIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KLSMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCi0jIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCi0jIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KLWNhc2UgJG9zIGluCi0JLXN1bipvcyopCi0JCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgotCQk7OwotCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCi0JLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCi0JLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKLQktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAotCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCi0JLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz12eHdvcmtzCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPS1zY28zLjJ2NQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzQpCi0JCW9zPS1zY28zLjJ2NAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMi5bNC05XSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjJ2WzQtOV0qKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQl0YWhvZSB8IGk4NjAgfCBtMzJyIHwgbTY4ayB8IG02ODAwMCB8IG04OGsgfCBuczMyayB8IGFyYyB8IGFybSBcCi0JCXwgYXJtZVtsYl0gfCBweXJhbWlkIHwgbW4xMDIwMCB8IG1uMTAzMDAgfCB0cm9uIHwgYTI5ayBcCi0JCXwgNTgwIHwgaTk2MCB8IGg4MzAwIFwKLQkJfCBocHBhIHwgaHBwYTEuMCB8IGhwcGExLjEgfCBocHBhMi4wIHwgaHBwYTIuMHcgfCBocHBhMi4wbiBcCi0JCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYXBjYTVbNjddIFwKLQkJfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciB8IGkzNzAgfCBzaCB8IHBvd2VycGMgfCBwb3dlcnBjbGUgXAotCQl8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIHwgbWlwczE2IHwgbWlwczY0IHwgbWlwc2VsIHwgbWlwczY0ZWwgXAotCQl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCB8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCi0JCXwgbWlwczY0dnI1MDAwIHwgbWlwcnM2NHZyNTAwMGVsIHwgbWNvcmUgXAotCSAgICAgICAgfCBtODgxMTAgfCBtNjgwWzAxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB6OGsgfCB2NzAgXAotCQl8IHNwYXJjIHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY3Y5IFwKLQkJfCB0aHVtYiB8IHY4NTAgfCBjNHggfCBkMTB2IHwgaDg1MDAgfCB3NjUgfCBmcjMwIHwgcGogfCBwamwpCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCi0JIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCi0JIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgotCWlbMzQ1NjddODYpCi0JICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCi0JICA7OwotCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCi0JKi0qLSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgotCXZheC0qIHwgdGFob2UtKiB8IGlbMzQ1NjddODYtKiB8IGk4NjAtKiB8IG0zMnItKiB8IG02OGstKiB8IG02ODAwMC0qIFwKLQkgICAgICB8IG04OGstKiB8IHNwYXJjLSogfCBuczMyay0qIHwgZng4MC0qIHwgYXJjLSogfCBhcm0tKiB8IGNbMTIzXSogXAotCSAgICAgIHwgbWlwcy0qIHwgcHlyYW1pZC0qIHwgdHJvbi0qIHwgYTI5ay0qIHwgcm9tcC0qIHwgcnM2MDAwLSogXAotCSAgICAgIHwgcG93ZXItKiB8IG5vbmUtKiB8IDU4MC0qIHwgY3JheTItKiB8IGg4MzAwLSogfCBoODUwMC0qIHwgaTk2MC0qIFwKLQkgICAgICB8IHhtcC0qIHwgeW1wLSogXAotCSAgICAgIHwgaHBwYS0qIHwgaHBwYTEuMC0qIHwgaHBwYTEuMS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMHctKiB8IGhwcGEyLjBuLSogXAotCSAgICAgIHwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYXBjYTVbNjddLSogXAotCSAgICAgIHwgd2UzMmstKiB8IGN5ZHJhLSogfCBuczE2ay0qIHwgcG4tKiB8IG5wMS0qIHwgeHBzMTAwLSogXAotCSAgICAgIHwgY2xpcHBlci0qIHwgb3Jpb24tKiBcCi0JICAgICAgfCBzcGFyY2xpdGUtKiB8IHBkcDExLSogfCBzaC0qIHwgcG93ZXJwYy0qIHwgcG93ZXJwY2xlLSogXAotCSAgICAgIHwgc3BhcmM2NC0qIHwgc3BhcmN2OS0qIHwgc3BhcmM4NngtKiB8IG1pcHMxNi0qIHwgbWlwczY0LSogfCBtaXBzZWwtKiBcCi0JICAgICAgfCBtaXBzNjRlbC0qIHwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCi0JICAgICAgfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAotCSAgICAgIHwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiB8IG1jb3JlLSogXAotCSAgICAgIHwgZjMwMS0qIHwgYXJtKi0qIHwgdDNlLSogXAotCSAgICAgIHwgbTg4MTEwLSogfCBtNjgwWzAxMjM0XTAtKiB8IG02ODM/Mi0qIHwgbTY4MzYwLSogfCB6OGstKiB8IGQxMHYtKiBcCi0JICAgICAgfCB0aHVtYi0qIHwgdjg1MC0qIHwgZDMwdi0qIHwgdGljMzAtKiB8IGMzMC0qIHwgZnIzMC0qICkKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCWFkb2JlNjhrKQotCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQotCQlvcz0tc2NvdXQKLQkJOzsKLQlhbGxpYW50IHwgZng4MCkKLQkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKLQkJOzsKLQlhbHRvcyB8IGFsdG9zMzA2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCi0JCTs7Ci0JYW0yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCi0JCW9zPS1ic2QKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQk7OwotCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljb252ZXgtYzEpCi0JCWJhc2ljX21hY2hpbmU9YzEtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzIpCi0JCWJhc2ljX21hY2hpbmU9YzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzMyKQotCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzQpCi0JCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzOCkKLQkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljcmF5IHwgeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmF5MikKLQkJYmFzaWNfbWFjaGluZT1jcmF5Mi1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQlbY3RqXTkwLWNyYXkpCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyZHMgfCB1bm9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRweDIwIHwgZHB4MjAtKikKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAotCQlvcz0tYm9zeAotCQk7OwotCWRweDIqIHwgZHB4MiotYnVsbCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZWJtb24yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LWVibW9uCi0JCTs7Ci0JZWx4c2kpCi0JCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKLQkJb3M9LWJzZAotCQk7OwotCWVuY29yZSB8IHVtYXggfCBtbWF4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQotCQk7OwotCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlmeDI4MDApCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50Ci0JCTs7Ci0JZ2VuaXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKLQkJOzsKLQlnbWljcm8pCi0JCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KLQkJb3M9LXN5c3YKLQkJOzsKLQloMzA1MHIqIHwgaGl1eCopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JaDgzMDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaDgzMDB4cmF5KQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LXhyYXkKLQkJOzsKLQloODUwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloYXJyaXMpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JaHAzMDAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHAzMDBic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0tYnNkCi0JCTs7Ci0JaHAzMDBocHV4KQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWhwdXgKLQkJOzsKLQlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKLQkJOzsKLQlocDlrM1syLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwcGEtbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCWhwcGFvc2YpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tb3NmCi0JCTs7Ci0JaHBwcm8pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JaTM3MC1pYm0qIHwgaWJtKikKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpWzM0NTY3XTg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWlbMzQ1NjddODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpWzM0NTY3XTg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaVszNDU2N104NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWkzODYtZ28zMiB8IGdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaTM4Ni1taW5ndzMyIHwgbWluZ3czMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1pbmd3MzIKLQkJOzsKLQlpcmlzIHwgaXJpczRkKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCi0JCWNhc2UgJG9zIGluCi0JCSAgICAtaXJpeCopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1pcml4NAotCQkJOzsKLQkJZXNhYwotCQk7OwotCWlzaTY4IHwgaXNpKQotCQliYXNpY19tYWNoaW5lPW02OGstaXNpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAqTWlOVCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci0JbWlwc2VsKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwc2VsLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMqLWxpbnV4KikKLQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXRic2QzODYpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1uZXRic2QKLQkJOzsKLQluZXR3aW5kZXIpCi0JCWJhc2ljX21hY2hpbmU9YXJtdjRsLWNvcmVsCi0JCW9zPS1saW51eAotCQk7OwotCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzMTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmVjdjcwKQotCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW1vbjk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1tb245NjAKLQkJOzsKLQlucDEpCi0JCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCi0JCTs7Ci0Jb3A1MG4tKiB8IG9wNjBjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJb3M9LXByb2VsZgotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBiZCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKLQkJOzsKLQlwYmIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKLQkJOzsKLSAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGVudGl1bSB8IHA1IHwgazUgfCBuZXhlbikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCTs7Ci0JcGVudGl1bXBybyB8IHA2IHwgazYgfCA2eDg2KQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtaWkgfCBwZW50aXVtMikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4ZW4tKikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qKQotCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwbikKLQkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAotCQk7OwotCXBvd2VyKQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JICAgICAgICA7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzYTI5MjAwKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNwYXJjbGl0ZS13cnMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3QyMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCi0JCTs7Ci0Jc3RyYXR1cykKLQkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXQzZSkKLQkJYmFzaWNfbWFjaGluZT10M2UtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdHgzOSkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCi0JCTs7Ci0JdHgzOWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLSAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0gICAgICAgICAgICAgICA7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JeG1wKQotCQliYXNpY19tYWNoaW5lPXhtcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLSAgICAgICAgeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl6OGstKi1jb2ZmKQotCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCi0JCW9zPS1zaW0KLQkJOzsKLQlub25lKQotCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQotCQlvcz0tbm9uZQotCQk7OwotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCi0jIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0Jdzg5aykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJOzsKLQlvcDUwbikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW9wNjBjKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0JbWlwcykKLQkJaWYgWyB4JG9zID0geC1saW51eC1nbnUgXTsgdGhlbgotCQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJZWxzZQotCQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJZmkKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNwYXJjIHwgc3BhcmN2OSkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLSAgICAgICAgY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JbWFjIHwgbXB3IHwgbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCTs7Ci0JcG1hYyB8IHBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKLQkJOzsKLQljNHgqKQotCQliYXNpY19tYWNoaW5lPWM0eC1ub25lCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcwotICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgotCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgotCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCi0JCTs7Ci0JLXNvbGFyaXMpCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCS1zdnI0KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXVuaXh3YXJlKikKLQkJb3M9LXN5c3Y0LjJ1dwotCQk7OwotCS1nbnUvbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCi0JIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KLQkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KLQktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCi0JICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAotCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAotCSAgICAgIHwgLWFvcyogXAotCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCi0JICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCi0JICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1uZXRic2QqIHwgLW9wZW5ic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogXAotCSAgICAgIHwgLWx5bnhvcyogfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAotCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKLQkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCi0JICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtcmhhcHNvZHkqIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKLQkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW9uOTYwKiB8IC1sbmV3cyopCi0JCTs7Ci0JLW1hYyopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vc2Zyb3NlKikKLQkJb3M9LW9zZnJvc2UKLQkJOzsKLQktb3NmKikKLQkJb3M9LW9zZgotCQk7OwotCS11dGVrKikKLQkJb3M9LWJzZAotCQk7OwotCS1keW5peCopCi0JCW9zPS1ic2QKLQkJOzsKLQktYWNpcyopCi0JCW9zPS1hb3MKLQkJOzsKLQktMzg2YnNkKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWN0aXgqIHwgLXV0cyopCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JLW5zMiApCi0JICAgICAgICBvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQktb3NlKikKLQkJb3M9LW9zZQotCQk7OwotCS1lczE4MDAqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLSAgICAgICAgLSptaW50IHwgLSpNaU5UKQotCSAgICAgICAgb3M9LW1pbnQKLQkJOzsKLQktbm9uZSkKLQkJOzsKLQkqKQotCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KLQkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotZWxzZQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCi0jIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgotIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCi0jICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCi0jIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKLSMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZwotIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KLQotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotYWNvcm4pCi0JCW9zPS1yaXNjaXgxLjIKLQkJOzsKLQlhcm0qLWNvcmVsKQotCQlvcz0tbGludXgKLQkJOzsKLQlhcm0qLXNlbWkpCi0JCW9zPS1hb3V0Ci0JCTs7Ci0gICAgICAgIHBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1pcHMqLWNpc2NvKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotKikKLQkJb3M9LWVsZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotICAgICAgICAqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotICAgICAgICAqLWhpZ2hsZXZlbCkKLQkJb3M9LWJzZAotCQk7OwotCSotZW5jb3JlKQotCQlvcz0tYnNkCi0JCTs7Ci0gICAgICAgICotc2dpKQotCQlvcz0taXJpeAotCQk7OwotICAgICAgICAqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzAxLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKi1yb202OGspCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi0qYnVnKQotCQlvcz0tY29mZgotCQk7OwotCSotYXBwbGUpCi0JCW9zPS1tYWNvcwotCQk7OwotCSotYXRhcmkqKQotCQlvcz0tbWludAotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1iZW9zKikKLQkJCQl2ZW5kb3I9YmUKLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktbXBlaXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLWhtcyopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLW1wdyogfCAtbWFjb3MqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktKm1pbnQgfCAtKk1pTlQpCi0JCQkJdmVuZG9yPWF0YXJpCi0JCQkJOzsKLQkJZXNhYwotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAotCQk7OwotZXNhYwotCi1lY2hvICRiYXNpY19tYWNoaW5lJG9zCmRpZmYgLS1naXQgYS9jb25maWcvQ2hhbmdlTG9nIGIvY29uZmlnL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2ZmM2MC4uMDAwMDAwMAotLS0gYS9jb25maWcvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLTE5OTktMDQtMDcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBtdC1kMzB2OiBOZXcgZmlsZSwgcGFzcyAtZyAtT3MgLVdhLC1DIGFzIGRlZmF1bHQgb3B0aW9ucy4KLQotMTk5OS0wMi0wOCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IEFkZGVkIG1hY3JvcyB0byBmaW5kIGl0Y2wgZmlsZXMuCi0JRXhwb3J0IFRDTF9DRkxBR1MgZnJvbSB0Y2xDb25maWcuc2guCi0JRXhwb3J0IFRDTF9MSUJfRlVMTF9QQVRILCBUS19MSUJfRlVMTF9QQVRILCBJVENMX0xJQl9GVUxMX1BBVEgsCi0JSVRLX0xJQl9GVUxMX1BBVEgsIGFuZCBUSVhfTElCX0ZVTExfUEFUSAotCVJlcGxhY2UgVElYIG1hY3JvcyB3aXRoIGJldHRlciBvbmVzIGZyb20gc25hdmlnYXRvci4KLQotVHVlIEZlYiAgMiAyMjo1MToyMSAxOTk5IFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+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+ICJ7MX0iCi1FbmQgSWYKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbXB3LXRydWUgYi9jb25maWcvbXB3L21wdy10cnVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTA2NTMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvbXB3LXRydWUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FeGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbnVsbC1jb21tYW5kIGIvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDRjOGUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIFRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcuCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L29wZW4tYnJhY2UgYi9jb25maWcvbXB3L29wZW4tYnJhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDY1ZGMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9vcGVuLWJyYWNlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIE1QVyBtYWtlZmlsZXMgc2VlbSBub3QgdG8gaGF2ZSBhbnkgd2F5IHRvIGdldCBhIGxpdGVyYWwgb3BlbgotIyBicmFjZSBpbnRvIGEgcnVsZSBhbnl3aGVyZSwgc28gdGhpcyBkb2VzIHRoZSBqb2IuCi0KLUVjaG8gJ3snCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjIGIvY29uZmlnL21wdy90ci03dG84LXNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwYjY0OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TdHJlYW1FZGl0IC1lIFxPcHRpb24tZAotICAnL1xPcHRpb24teC8gXE9wdGlvbi1kCi0gICAgUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi1kLyAiXE9wdGlvbi1kXE9wdGlvbi1kIiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLSAgICBSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLWYvICJcT3B0aW9uLWRcT3B0aW9uLWYiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tOC8gIlxPcHRpb24tZFxPcHRpb24tOCIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0JUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi01LyAiXE9wdGlvbi1kXE9wdGlvbi01IiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLQlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLXgvICJcT3B0aW9uLWRcT3B0aW9uLXgiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tci8gIlxPcHRpb24tZFxPcHRpb24tciIgLWMgXE9wdGlvbi01JyAgXE9wdGlvbi1kCi0gICJ7MX0iCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RydWUgYi9jb25maWcvbXB3L3RydWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDY1MzAuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy90cnVlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWcvbXQtYXJtcGljIGIvY29uZmlnL210LWFybXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtYXJtcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtZDMwdiBiL2NvbmZpZy9tdC1kMzB2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzRiNzc0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1kMzB2CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIEJ1aWxkIGxpYnJhcmllcyBvcHRpbWl6aW5nIGZvciBzcGFjZSwgbm90IHNwZWVkLgotIyBUdXJuIG9mZiB3YXJuaW5ncyBhYm91dCBzeW1ib2xzIG5hbWVkIHRoZSBzYW1lIGFzIHJlZ2lzdGVycwotIENGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zIC1XYSwtQwotIENYWEZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MgLVdhLC1DCmRpZmYgLS1naXQgYS9jb25maWcvbXQtZWxmYWxwaGFwaWMgYi9jb25maWcvbXQtZWxmYWxwaGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWVsZmFscGhhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtbGludXggYi9jb25maWcvbXQtbGludXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOWU2ZjEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWxpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFdoZW4gdXNpbmcgZ2xpYmMgMiBvbiBMaW51eCB3ZSBtdXN0IGFsd2F5cyB1c2UgdnRhYmxlIHRodW5rcy4KLUNYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTKSAtZnZ0YWJsZS10aHVua3MgLURfR05VX1NPVVJDRQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LW02OGtwaWMgYi9jb25maWcvbXQtbTY4a3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5ODcyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtbTY4a3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LW5ldHdhcmUgYi9jb25maWcvbXQtbmV0d2FyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4MmY5Yi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtbmV0d2FyZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUdEQl9OTE1fREVQUyA9IGFsbC1nY2MgYWxsLWxkCmRpZmYgLS1naXQgYS9jb25maWcvbXQtb3NwYWNlIGIvY29uZmlnL210LW9zcGFjZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwOTEwNC4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtb3NwYWNlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIEJ1aWxkIGxpYnJhcmllcyBvcHRpbWl6aW5nIGZvciBzcGFjZSwgbm90IHNwZWVkLgotIENGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zCi0gQ1hYRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXBhcGljIGIvY29uZmlnL210LXBhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1wYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXBwY3BpYyBiL2NvbmZpZy9tdC1wcGNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXBwY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXNwYXJjcGljIGIvY29uZmlnL210LXNwYXJjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBlYzI3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1zcGFyY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD1gY2FzZSAiJHtMSUJDRkxBR1N9ICR7TElCQ1hYRkxBR1N9IiBpbiAqLWZwaWMqICkgZWNobyAtZnBpYyA7OyAqICkgZWNobyAtZlBJQyA7OyBlc2FjYApkaWZmIC0tZ2l0IGEvY29uZmlnL210LXY4MTAgYi9jb25maWcvbXQtdjgxMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkYTZjMi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtdjgxMAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQ0NfRk9SX1RBUkdFVCA9IGNhNzMyIC1hbnNpCi1BU19GT1JfVEFSR0VUID0gYXM3MzIKLUFSX0ZPUl9UQVJHRVQgPSBhcjczMgotUkFOTElCX0ZPUl9UQVJHRVQgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbXQteDg2cGljIGIvY29uZmlnL210LXg4NnBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5ODcyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQteDg2cGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mcGljCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjN2I2NTAuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMTU5OCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyMjIFdBUk5JTkc6IHRoaXMgZmlsZSBjb250YWlucyBlbWJlZGRlZCB0YWJzLiAgRG8gbm90IHJ1biB1bnRhYmlmeSBvbiB0aGlzIGZpbGUuCi0KLSMgQ29uZmlndXJhdGlvbiBzY3JpcHQKLSMgQ29weXJpZ2h0IChDKSAxOTg4LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBLLiBSaWNoYXJkIFBpeGxleS4KLQotIwotIyBTaGVsbCBzY3JpcHQgdG8gY3JlYXRlIHByb3BlciBsaW5rcyB0byBtYWNoaW5lLWRlcGVuZGVudCBmaWxlcyBpbgotIyBwcmVwYXJhdGlvbiBmb3IgY29tcGlsYXRpb24uCi0jCi0jIElmIGNvbmZpZ3VyZSBzdWNjZWVkcywgaXQgbGVhdmVzIGl0cyBzdGF0dXMgaW4gY29uZmlnLnN0YXR1cy4KLSMgSWYgY29uZmlndXJlIGZhaWxzIGFmdGVyIGRpc3R1cmJpbmcgdGhlIHN0YXR1cyBxdW8sIAotIyAgICAgICBjb25maWcuc3RhdHVzIGlzIHJlbW92ZWQuCi0jCi0KLWV4cG9ydCBQQVRIIHx8IChlY2hvICJPT1BTLCB0aGlzIGlzbid0IHNoLiAgRGVzcGVyYXRpb24gdGltZS4gIEkgd2lsbCBmZWVkIG15c2VsZiB0byBzaC4iOyBzaCAkMCAkYXJndjsga2lsbCAkJCkKLQotcmVtb3ZlPXJtCi1oYXJkX2xpbms9bG4KLXN5bWJvbGljX2xpbms9J2xuIC1zJwotCi0jZm9yIFRlc3QKLSNyZW1vdmU9ImVjaG8gcm0iCi0jaGFyZF9saW5rPSJlY2hvIGxuIgotI3N5bWJvbGljX2xpbms9ImVjaG8gbG4gLXMiCi0KLSMgY2xlYXIgc29tZSB0aGluZ3MgcG90ZW50aWFsbHkgaW5oZXJpdGVkIGZyb20gZW52aXJvbm1lbnQuCi0KLU1ha2VmaWxlPU1ha2VmaWxlCi1NYWtlZmlsZV9pbj1NYWtlZmlsZS5pbgotYXJndW1lbnRzPQotYnVpbGRfYWxpYXM9Ci1jYWNoZV9maWxlPWNvbmZpZy5jYWNoZQotY2FjaGVfZmlsZV9vcHRpb249Ci1jb25maWdkaXJzPQotZXh0cmFjb25maWdkaXJzPQotZGlyb3B0aW9ucz0KLWV4ZWNfcHJlZml4PQotZXhlY19wcmVmaXhvcHRpb249Ci1mYXRhbD0KLWZsb2F0aW5nX3BvaW50PWRlZmF1bHQKLWdhcz1kZWZhdWx0Ci1nY2NfdmVyc2lvbj0KLWdjY192ZXJzaW9uX3RyaWdnZXI9Ci1ob3N0X2FsaWFzPU5PSE9TVAotaG9zdF9tYWtlZmlsZV9mcmFnPQotbW92ZWlmY2hhbmdlPQotbm9yZWN1cnNpb249Ci1vdGhlcl9vcHRpb25zPQotcGFja2FnZV9tYWtlZmlsZV9mcmFnPQotcGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnPQotcHJlZml4PS91c3IvbG9jYWwKLXByb2duYW1lPQotcHJvZ3JhbV9wcmVmaXg9Ci1wcm9ncmFtX3ByZWZpeG9wdGlvbj0KLXByb2dyYW1fc3VmZml4PQotcHJvZ3JhbV9zdWZmaXhvcHRpb249Ci1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbj0KLXJlZGlyZWN0PQotcmVtb3Zpbmc9Ci1zaXRlPQotc2l0ZV9tYWtlZmlsZV9mcmFnPQotc2l0ZV9vcHRpb249Ci1zcmNkaXI9Ci1zcmN0cmlnZ2VyPQotc3ViZGlycz0KLXRhcmdldF9hbGlhcz1OT1RBUkdFVAotdGFyZ2V0X21ha2VmaWxlX2ZyYWc9Ci11bmRlZnM9Tk9VTkRFRlMKLXZlcnNpb249IiRSZXZpc2lvbiQiCi14MTE9ZGVmYXVsdAotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMjIyB3ZSBtaWdodCBuZWVkIHRvIHVzZSBzb21lIG90aGVyIHNoZWxsIHRoYW4gL2Jpbi9zaCBmb3IgcnVubmluZyBzdWJzaGVsbHMKLQotIyMjIElmIHdlIGFyZSBvbiBXaW5kb3dzLCBzZWFyY2ggZm9yIHRoZSBzaGVsbC4gIFRoaXMgd2lsbCBwZXJtaXQgcGVvcGxlCi0jIyMgdG8gbm90IGhhdmUgL2Jpbi9zaCwgYnV0IHRvIGJlIGFibGUgdG8gc2VlIC9TT01FL1BBVEgvc2ggY29uZmlndXJlCi0jIyMgd2l0aG91dCBhbHNvIGhhdmluZyB0byBzZXQgQ09ORklHX1NIRUxMLiAgVGhpcyBjb2RlIHdpbGwgd29yayB3aGVuCi0jIyMgdXNpbmcgYmFzaCwgd2hpY2ggc2V0cyBPU1RZUEUuCi1jYXNlICIke09TVFlQRX0iIGluCi0qd2luMzIqKQotICBpZiBbIHgke0NPTkZJR19TSEVMTH0gPSB4IF07IHRoZW4KLSAgICBpZiBbICEgLWYgL2Jpbi9zaCBdOyB0aGVuCi0gICAgICBpZiBbIHgke1NIRUxMfSAhPSB4IF0gJiYgWyAtZiAke1NIRUxMfSBdOyB0aGVuCi0JQ09ORklHX1NIRUxMPSR7U0hFTEx9Ci0JZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZWxzZQotCWZvciBwcm9nIGluIHNoIHNoLmV4ZSBiYXNoIGJhc2guZXhlOyBkbwotCSAgSUZTPSIke0lGUz0JfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotCSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLQkgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLQkgICAgaWYgdGVzdCAtZiAkZGlyLyRwcm9nOyB0aGVuCi0JICAgICAgQ09ORklHX1NIRUxMPSRkaXIvJHByb2cKLQkgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0JICAgICAgYnJlYWsKLQkgICAgZmkKLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgdGVzdCAtbiAiJHtDT05GSUdfU0hFTEx9IiAmJiBicmVhawotCWRvbmUKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLSAgOzsKLWVzYWMKLQotY29uZmlnX3NoZWxsPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLU5PX0VESVQ9IlRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgRG8gbm90IGVkaXQuIgotCi0jIyB0aGlzIGlzIGEgbGl0dGxlIHRvdWNoeSBhbmQgd29uJ3QgYWx3YXlzIHdvcmssIGJ1dC4uLgotIyMKLSMjIGlmIHRoZSBhcmd2WzBdIHN0YXJ0cyB3aXRoIGEgc2xhc2ggdGhlbiBpdCBpcyBhbiBhYnNvbHV0ZSBuYW1lIHRoYXQgY2FuIChhbmQKLSMjIG11c3QpIGJlIHVzZWQgYXMgaXMuCi0jIwotIyMgb3RoZXJ3aXNlLCBpZiBhcmd2WzBdIGhhcyBubyBzbGFzaCBpbiBpdCwgd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGlzIG9uIHRoZQotIyMgcGF0aC4gIFNpbmNlIFBBVEggbWlnaHQgaW5jbHVkZSAiLiIgd2UgYWxzbyBhZGQgYHB3ZGAgdG8gdGhlIGVuZCBvZiBQQVRILgotIyMKLQotcHJvZ25hbWU9JDAKLSMgaWYgUFdEIGFscmVhZHkgaGFzIGEgdmFsdWUsIGl0IGlzIHByb2JhYmx5IHdyb25nLgotaWYgWyAtbiAiJFBXRCIgXTsgdGhlbiBQV0Q9YHB3ZGA7IGZpCi0KLWNhc2UgIiR7cHJvZ25hbWV9IiBpbgotLyopIDs7Ci0qLyopIDs7Ci0qKQotICAgICAgICBQQVRIPSRQQVRIOiR7UFdEPWBwd2RgfSA7IGV4cG9ydCBQQVRICi0gICAgICAgIDs7Ci1lc2FjCi0KLSMgTG9vcCBvdmVyIGFsbCBhcmdzCi0KLXdoaWxlIDoKLWRvCi0KLSMgQnJlYWsgb3V0IGlmIHRoZXJlIGFyZSBubyBtb3JlIGFyZ3MKLQljYXNlICQjIGluCi0JMCkKLQkJYnJlYWsKLQkJOzsKLQllc2FjCi0KLSMgR2V0IHRoZSBmaXJzdCBhcmcsIGFuZCBzaHVmZmxlCi0Jb3B0aW9uPSQxCi0Jc2hpZnQKLQotIyBNYWtlIGFsbCBvcHRpb25zIGhhdmUgdHdvIGh5cGhlbnMKLQlvcmlnX29wdGlvbj0kb3B0aW9uCSMgU2F2ZSBvcmlnaW5hbCBmb3IgZXJyb3IgbWVzc2FnZXMKLQljYXNlICRvcHRpb24gaW4KLQktLSopIDs7Ci0JLSopIG9wdGlvbj0tJG9wdGlvbiA7OwotCWVzYWMKLQkJCi0jIFNwbGl0IG91dCB0aGUgYXJndW1lbnQgZm9yIG9wdGlvbnMgdGhhdCB0YWtlIHRoZW0KLQljYXNlICRvcHRpb24gaW4KLQktLSo9KikKLQkJb3B0YXJnPWBlY2hvICRvcHRpb24gfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AKLQkJYXJndW1lbnRzPSIkYXJndW1lbnRzICRvcHRpb24iCi0JCTs7Ci0jIFRoZXNlIG9wdGlvbnMgaGF2ZSBtYW5kYXRvcnkgdmFsdWVzLiAgU2luY2Ugd2UgZGlkbid0IGZpbmQgYW4gPSBzaWduLAotIyB0aGUgdmFsdWUgbXVzdCBiZSBpbiB0aGUgbmV4dCBhcmd1bWVudAotCS0tYnUqIHwgLS1jYWNoZSogfCAtLWV4KiB8IC0taG8qIHwgLS1wcmUqIHwgLS1wcm9ncmFtLXAqIHwgLS1wcm9ncmFtLXMqIHwgLS1wcm9ncmFtLXQqIHwgLS1zaSogfCAtLXNyKiB8IC0tdGEqIHwgLS10bSogfCAtLXgtKiB8IC0tYmkqIHwgLS1zYiogfCAtLWxpKiB8IC0tZGEqIHwgLS1zeSogfCAtLXNoKiB8IC0tbG8qIHwgLS1pbiogfCAtLW9sKiB8IC0tbWEqKQotCQlvcHRhcmc9JDEKLQkJc2hpZnQKLQkJYXJndW1lbnRzPSIkYXJndW1lbnRzICRvcHRpb249JG9wdGFyZyIKLQkJOzsKLQktLXYpCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAtdiIKLQkJOzsKLQktLSopCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uIgotCQk7OwotCWVzYWMKLQotIyBOb3csIHByb2Nlc3MgdGhlIG9wdGlvbnMKLQljYXNlICRvcHRpb24gaW4KLQotCS0tYmkqKQotCQliaW5kaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWJpbmRpcj0kb3B0YXJnIgotCQk7OwotCS0tYnVpbGQqIHwgLS1idSopCi0JCWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLQkJIiIpIGJ1aWxkX2FsaWFzPSRvcHRhcmcgOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBidWlsZCBtYWNoaW5lIGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLWNhY2hlKikKLQkJY2FjaGVfZmlsZT0kb3B0YXJnCi0JCTs7Ci0JLS1kYSopCi0JCWRhdGFkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWRhdGFkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWRpc2FibGUtKikKLQkJZW5hYmxlb3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS1kaXNhYmxlLTplbmFibGVfOjtzOi06XzpnJ2AKLQkJZXZhbCAkZW5hYmxlb3B0PW5vCi0JCWRpc2FibGVvcHRpb25zPSIkZGlzYWJsZW9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLWVuYWJsZS0qKQotCQljYXNlICIkb3B0aW9uIiBpbgotCQkqPSopCTs7Ci0JCSopCW9wdGFyZz15ZXMgOzsKLQkJZXNhYwotCi0JCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JCWV2YWwgIiRlbmFibGVvcHQ9JyRvcHRhcmcnIgotCQllbmFibGVvcHRpb25zPSIkZW5hYmxlb3B0aW9ucyAnJG9wdGlvbiciCi0JCTs7Ci0JLS1leGVjLXByZWZpeCogfCAtLWV4KikKLQkJZXhlY19wcmVmaXg9JG9wdGFyZwotCQlleGVjX3ByZWZpeG9wdGlvbj0iLS1leGVjLXByZWZpeD0kb3B0YXJnIgotCQk7OwotCS0tZ2FzIHwgLS1nKikKLQkJZ2FzPXllcwotCQk7OwotCS0taGVscCB8IC0taGUqKQotCQlmYXRhbD15ZXMKLQkJOzsKLQktLWhvc3QqIHwgLS1obyopCi0JCWNhc2UgJGhvc3RfYWxpYXMgaW4KLQkJTk9IT1NUKSBob3N0X2FsaWFzPSRvcHRhcmcgOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLWluYyopCi0JCWluY2x1ZGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWluY2x1ZGVkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWluZiopCi0JCWluZm9kaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWluZm9kaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxpYmQqKQotCQlsaWJkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxpYmRpcj0kb3B0YXJnIgotCQk7OwotCS0tbGliZSopCi0JCWxpYmV4ZWNkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxpYmV4ZWNkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxvKikKLQkJbG9jYWxzdGF0ZWRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tbG9jYWxzdGF0ZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tbWEqKQotCQltYW5kaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLW1hbmRpcj0kb3B0YXJnIgotCQk7OwotCS0tbmZwIHwgLS1uZiopCi0JCWZsb2F0aW5nX3BvaW50PW5vCi0JCWZsb2F0aW5nX3BvaW50b3B0aW9uPSItLW5mcCIKLQkJOzsKLQktLW5vcmVjdXJzaW9uIHwgLS1ubyopCi0JCW5vcmVjdXJzaW9uPXllcwotCQk7OwotCS0tb2wqKQotCQlvbGRpbmNsdWRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1vbGRpbmNsdWRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1wcmVmaXgqIHwgLS1wcmUqKQotCQlwcmVmaXg9JG9wdGFyZwotCQlwcmVmaXhvcHRpb249Ii0tcHJlZml4PSRvcHRhcmciCi0JCTs7Ci0JLS1wcm9ncmFtLXByZWZpeCogfCAtLXByb2dyYW0tcCopCi0JCXByb2dyYW1fcHJlZml4PSRvcHRhcmcKLQkJcHJvZ3JhbV9wcmVmaXhvcHRpb249Ii0tcHJvZ3JhbS1wcmVmaXg9JG9wdGFyZyIKLQkJOzsKLQktLXByb2dyYW0tc3VmZml4KiB8IC0tcHJvZ3JhbS1zKikKLQkJcHJvZ3JhbV9zdWZmaXg9JG9wdGFyZwotCQlwcm9ncmFtX3N1ZmZpeG9wdGlvbj0iLS1wcm9ncmFtLXN1ZmZpeD0kb3B0YXJnIgotCQk7OwotCS0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSogfCAtLXByb2dyYW0tdCopCi0JCSMgRG91YmxlIGFueSBiYWNrc2xhc2hlcyBvciBkb2xsYXIgc2lnbnMgaW4gdGhlIGFyZ3VtZW50Ci0JCXByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0gLWUgYGVjaG8gJHtvcHRhcmd9IHwgc2VkIC1lICdzL1xcXFwvXFxcXFxcXFwvZycgLWUgJ3MvXFxcJC8kJC9nJ2AiCi0JCXByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb249IiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSckb3B0YXJnJyIKLQkJOzsKLQktLXJtKQotCQlyZW1vdmluZz0tLXJtCi0JCTs7Ci0JLS1zYiopCi0JCXNiaW5kaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLXNiaW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLXNoKikKLQkJc2hhcmVkc3RhdGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLXNoYXJlZHN0YXRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1zaWxlbnQgfCAtLXNpbCogfCAtLXF1aWV0IHwgLS1xKikKLQkJcmVkaXJlY3Q9Ij4vZGV2L251bGwiCi0JCXZlcmJvc2U9LS1zaWxlbnQKLQkJOzsKLQktLXNpdGUqIHwgLS1zaXQqKQotCQlzaXRlPSRvcHRhcmcKLQkJc2l0ZV9vcHRpb249Ii0tc2l0ZT0kb3B0YXJnIgotCQk7OwotCS0tc3JjZGlyKi8gfCAtLXNyKi8pCi0gICAgICAgICAgICAgICAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4gIE90aGVyd2lzZSwgd2hlbiB0aGUgZmlsZSBuYW1lIGdldHMKLSAgICAgICAgICAgICAgICAjIGJvbHRlZCBpbnRvIGFuIG9iamVjdCBmaWxlIGFzIGRlYnVnIGluZm8sIGl0IGhhcyB0d28gc2xhc2hlcwotICAgICAgICAgICAgICAgICMgaW4gaXQuICBPcmRpbmFyaWx5IHRoaXMgaXMgb2ssIGJ1dCBlbWFjcyB0YWtlcyBkb3VibGUgc2xhc2gKLSAgICAgICAgICAgICAgICAjIHRvIG1lYW4gImZvcmdldCB0aGUgZmlyc3QgcGFydCIuCi0JCXNyY2Rpcj1gZWNobyAkb3B0YXJnIHwgc2VkIC1lICdzOi8kOjonYAotCQk7OwotCS0tc3JjZGlyKiB8IC0tc3IqKQotCQlzcmNkaXI9JG9wdGFyZwotCQk7OwotCS0tc3kqKQotCQlzeXNjb25mZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zeXNjb25mZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS10YXJnZXQqIHwgLS10YSopCi0JCWNhc2UgJHRhcmdldF9hbGlhcyBpbgotCQlOT1RBUkdFVCkgdGFyZ2V0X2FsaWFzPSRvcHRhcmcgOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSB0YXJnZXQgYXQgYSB0aW1lLiAgMT4mMgotCQkgICBmYXRhbD15ZXMKLQkJICAgOzsKLQkJZXNhYwotCQk7OwotCS0tdG1wZGlyKiB8IC0tdG0qKQotCQlUTVBESVI9JG9wdGFyZwotCQl0bXBkaXJvcHRpb249Ii0tdG1wZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS12ZXJib3NlIHwgLS12IHwgLS12ZXJiKikKLQkJcmVkaXJlY3Q9Ci0JCXZlcmJvc2U9LS12ZXJib3NlCi0JCTs7Ci0JLS12ZXJzaW9uIHwgLS1WIHwgLS12ZXJzKikKLQkJZWNobyAiVGhpcyBpcyBDeWdudXMgQ29uZmlndXJlIHZlcnNpb24iIGBlY2hvICR7dmVyc2lvbn0gfCBzZWQgJ3MvWyAkOl0vL2cnYAotCQlleGl0IDAKLQkJOzsKLQktLXdpdGgtKikKLQkJY2FzZSAiJG9wdGlvbiIgaW4KLQkJKj0qKQk7OwotCQkqKQlvcHRhcmc9eWVzIDs7Ci0JCWVzYWMKLQotCQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOj0uKiQ6OjtzOi06XzpnJ2AKLQkJZXZhbCAkd2l0aG9wdD0iJG9wdGFyZyIKLQkJd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAkb3B0aW9uIgotCQk7OwotCS0td2l0aG91dC0qKQotCQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOm91dDo6O3M6LTpfOmcnYAotCQlldmFsICR3aXRob3B0PW5vCi0JCXdpdGhvdXRvcHRpb25zPSIkd2l0aG91dG9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLXgpCXdpdGhfeD15ZXMKLQkJd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAtLXdpdGgteCIKLQkJOzsKLQktLXgtaSogfCAtLXgtbCopIG90aGVyX29wdGlvbnM9IiRvdGhlcl9vcHRpb25zICRvcmlnX29wdGlvbiIKLQkJOzsKLQktLSopCi0JCWVjaG8gImNvbmZpZ3VyZTogVW5yZWNvZ25pemVkIG9wdGlvbjogXCIkb3JpZ19vcHRpb25cIjsgdXNlIC0taGVscCBmb3IgdXNhZ2UuIiA+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JKikKLQkJY2FzZSAkdW5kZWZzIGluCi0JCU5PVU5ERUZTKSB1bmRlZnM9JG9wdGlvbiA7OwotCQkqKSBlY2hvICcqKionIENhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lLiAgMT4mMgotCQkgICBmYXRhbD15ZXMKLQkJICAgOzsKLQkJZXNhYwotCQk7OwotCWVzYWMKLWRvbmUKLQotIyBwcm9jZXNzIGhvc3QgYW5kIHRhcmdldAotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgVU5ERUZTCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmVuJ3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCB1bmRlZnMgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byB1bmRlZnMuCi0jIDMuIElmIHVuZGVmcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBkZWZhdWx0cyB0byB1bmRlZnMuCi0jIDUuIElmIHVuZGVmcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBkZWZhdWx0cyB0byBob3N0LgotCi1jYXNlICIke2ZhdGFsfSIgaW4KLSIiKQotCSMgTWFrZSBzdXJlIHRoYXQgaG9zdCwgdGFyZ2V0ICYgdW5kZWZzIGFyZW4ndCBhbGwgc3BlY2lmaWVkIGF0IHRoZQotCSMgc2FtZSB0aW1lLgotCWNhc2UgJGhvc3RfYWxpYXMtLS0kdGFyZ2V0X2FsaWFzLS0tJHVuZGVmcyBpbgotCU5PSE9TVC0tLSotLS0qIHwgKi0tLU5PVEFSR0VULS0tKiB8ICotLS0qLS0tTk9VTkRFRlMpCi0JCTs7Ci0JKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkgICBmYXRhbD15ZXMKLQkgICBicmVhayAyCi0JCTs7Ci0JZXNhYwotCi0JIyBOb3csIGRvIGRlZmF1bHRpbmcgZm9yIGhvc3QuCi0JY2FzZSAkaG9zdF9hbGlhcyBpbgotCU5PSE9TVCkKLQkJY2FzZSAkdW5kZWZzIGluCi0JCU5PVU5ERUZTKQotCQkJIyBOZWl0aGVyIC0taG9zdCBvcHRpb24gbm9yIHVuZGVmcyB3ZXJlIHByZXNlbnQuCi0JCQkjIENhbGwgY29uZmlnLmd1ZXNzLgotCQkJZ3Vlc3NzeXM9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9jb25maWcuZ3Vlc3MvJ2AKLQkJCWlmIGhvc3RfYWxpYXM9YCR7Y29uZmlnX3NoZWxsfSAke2d1ZXNzc3lzfWAKLQkJCXRoZW4KLQkJCQkjIElmIHRoZSBzdHJpbmcgd2UgYXJlIGdvaW5nIHRvIHVzZSBmb3IKLQkJCQkjIHRoZSB0YXJnZXQgaXMgYSBwcmVmaXggb2YgdGhlIHN0cmluZwotCQkJCSMgd2UganVzdCBndWVzc2VkIGZvciB0aGUgaG9zdCwgdGhlbgotCQkJCSMgYXNzdW1lIHdlIGFyZSBydW5uaW5nIG5hdGl2ZSwgYW5kIGZvcmNlCi0JCQkJIyB0aGUgc2FtZSBzdHJpbmcgZm9yIGJvdGggdGFyZ2V0IGFuZCBob3N0LgotCQkJCWNhc2UgJHRhcmdldF9hbGlhcyBpbgotCQkJCU5PVEFSR0VUKSA7OwotCQkJCSopCi0JCQkJCWlmIGV4cHIgJGhvc3RfYWxpYXMgOiAkdGFyZ2V0X2FsaWFzID4vZGV2L251bGwKLQkJCQkJdGhlbgotCQkJCQkJaG9zdF9hbGlhcz0kdGFyZ2V0X2FsaWFzCi0JCQkJCWZpCi0JCQkJCTs7Ci0JCQkJZXNhYwotCQkJCWVjaG8gIkNvbmZpZ3VyaW5nIGZvciBhICR7aG9zdF9hbGlhc30gaG9zdC4iIDE+JjIKLQkJCQlhcmd1bWVudHM9Ii0taG9zdD0kaG9zdF9hbGlhcyAkYXJndW1lbnRzIgotCQkJZWxzZQotCQkJCWVjaG8gJ0NvbmZpZy5ndWVzcyBmYWlsZWQgdG8gZGV0ZXJtaW5lIHRoZSBob3N0IHR5cGUuICBZb3UgbmVlZCB0byBzcGVjaWZ5IG9uZS4nIDE+JjIKLQkJCQlmYXRhbD15ZXMKLQkJCWZpCi0JCQk7OwotCQkqKQotCQkJaG9zdF9hbGlhcz0kdW5kZWZzCi0JCQlhcmd1bWVudHM9Ii0taG9zdD0kaG9zdF9hbGlhcyAkYXJndW1lbnRzIgotCQkJdW5kZWZzPU5PVU5ERUZTCi0JCQk7OwotCQllc2FjCi0JZXNhYwotCi0JIyBEbyBkZWZhdWx0aW5nIGZvciB0YXJnZXQuICBJZiAtLXRhcmdldCBvcHRpb24gaXNuJ3QgcHJlc2VudCwgZGVmYXVsdAotCSMgdG8gdW5kZWZzLiAgSWYgdW5kZWZzIGlzbid0IHByZXNlbnQsIGRlZmF1bHQgdG8gaG9zdC4KLQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQlOT1RBUkdFVCkKLQkJY2FzZSAkdW5kZWZzIGluCi0JCU5PVU5ERUZTKQotCQkJdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzCi0JCQk7OwotCQkqKQotCQkJdGFyZ2V0X2FsaWFzPSR1bmRlZnMKLQkJCWFyZ3VtZW50cz0iLS10YXJnZXQ9JHRhcmdldF9hbGlhcyAkYXJndW1lbnRzIgotCQkJOzsKLQkJZXNhYwotCWVzYWMKLQk7OwotKikgOzsKLWVzYWMKLQotaWYgWyAtbiAiJHtmYXRhbH0iIC1vICIke2hvc3RfYWxpYXN9IiA9ICJoZWxwIiBdIDsgdGhlbgotCWV4ZWMgMT4mMgotCWVjaG8gVXNhZ2U6IGNvbmZpZ3VyZSBbT1BUSU9OU10gW0hPU1RdCi0JZWNobwotCWVjaG8gT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzXQotCWVjaG8gJyAtLXByZWZpeD1NWURJUgkJIGluc3RhbGwgaW50byBNWURJUiBbL3Vzci9sb2NhbF0nCi0JZWNobyAnIC0tZXhlYy1wcmVmaXg9TVlESVIJIGluc3RhbGwgaG9zdC1kZXBlbmRlbnQgZmlsZXMgaW50byBNWURJUiBbL3Vzci9sb2NhbF0nCi0JZWNobyAnIC0taGVscAkJCSBwcmludCB0aGlzIG1lc3NhZ2UgW25vcm1hbCBjb25maWddJwotCWVjaG8gJyAtLWJ1aWxkPUJVSUxECQkgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0nCi0JZWNobyAnIC0taG9zdD1IT1NUCQkgY29uZmlndXJlIGZvciBIT1NUIFtkZXRlcm1pbmVkIHZpYSBjb25maWcuZ3Vlc3NdJwotCWVjaG8gJyAtLW5vcmVjdXJzaW9uCQkgY29uZmlndXJlIHRoaXMgZGlyZWN0b3J5IG9ubHkgW3JlY3Vyc2VdJwotCWVjaG8gJyAtLXByb2dyYW0tcHJlZml4PUZPTwkgcHJlcGVuZCBGT08gdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMgWyIiXScKLQllY2hvICcgLS1wcm9ncmFtLXN1ZmZpeD1GT08JIGFwcGVuZCBGT08gdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMgWyIiXScKLQllY2hvICcgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVAgdHJhbnNmb3JtIGluc3RhbGxlZCBuYW1lcyBieSBzZWQgcGF0dGVybiBQIFsiIl0nCi0JZWNobyAnIC0tc2l0ZT1TSVRFCQkgY29uZmlndXJlIHdpdGggc2l0ZS1zcGVjaWZpYyBtYWtlZmlsZSBmb3IgU0lURScKLQllY2hvICcgLS1zcmNkaXI9RElSCQkgZmluZCB0aGUgc291cmNlcyBpbiBESVIgWy4gb3IgLi5dJwotCWVjaG8gJyAtLXRhcmdldD1UQVJHRVQJIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0nCi0JZWNobyAnIC0tdG1wZGlyPVRNUERJUgkgY3JlYXRlIHRlbXBvcmFyeSBmaWxlcyBpbiBUTVBESVIgWy90bXBdJwotCWVjaG8gJyAtLW5mcAkJCSBjb25maWd1cmUgZm9yIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IFtoYXJkIGZsb2F0XScKLQllY2hvICcgLS13aXRoLUZPTywgLS13aXRoLUZPTz1CQVIgcGFja2FnZSBGT08gaXMgYXZhaWxhYmxlIChwYXJhbWV0ZXIgQkFSKScKLQllY2hvICcgLS13aXRob3V0LUZPTwkJIHBhY2thZ2UgRk9PIGlzIE5PVCBhdmFpbGFibGUnCi0JZWNobyAnIC0tZW5hYmxlLUZPTywgLS1lbmFibGUtRk9PPUJBUiBpbmNsdWRlIGZlYXR1cmUgRk9PIChwYXJhbWV0ZXIgQkFSKScKLQllY2hvICcgLS1kaXNhYmxlLUZPTwkJIGRvIG5vdCBpbmNsdWRlIGZlYXR1cmUgRk9PJwotCWVjaG8KLQllY2hvICdXaGVyZSBIT1NUIGFuZCBUQVJHRVQgYXJlIHNvbWV0aGluZyBsaWtlICJzcGFyYy1zdW5vcyIsICJtaXBzLXNnaS1pcml4NSIsIGV0Yy4nCi0JZWNobwotCWlmIFsgLXIgY29uZmlnLnN0YXR1cyBdIDsgdGhlbgotCQljYXQgY29uZmlnLnN0YXR1cwotCWZpCi0KLQlleGl0IDEKLWZpCi0KLWNvbmZpZ3N1Yj1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAncy9jb25maWd1cmUkL2NvbmZpZy5zdWIvJ2AKLW1vdmVpZmNoYW5nZT1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAncy9jb25maWd1cmUkL21vdmUtaWYtY2hhbmdlLydgCi10b3BzcmNkaXI9YGNkIFxgZGlybmFtZSAke3Byb2duYW1lfVxgOyBwd2RgCi0KLQotIyB0aGlzIGlzIGEgaGFjay4gIHN1bjQgbXVzdCBhbHdheXMgYmUgYSB2YWxpZCBob3N0IGFsaWFzIG9yIHRoaXMgd2lsbCBmYWlsLgotaWYgJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSBzdW40ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLSAgICAgICAgdHJ1ZQotZWxzZQotICAgICAgICBlY2hvICcqKionIGNhbm5vdCBmaW5kIGNvbmZpZy5zdWIuICAxPiYyCi0gICAgICAgIGV4aXQgMQotZmkKLQotdG91Y2ggY29uZmlnLmp1bmsKLWlmICR7Y29uZmlnX3NoZWxsfSAke21vdmVpZmNoYW5nZX0gY29uZmlnLmp1bmsgY29uZmlnLnRyYXNoIDsgdGhlbgotICAgICAgICB0cnVlCi1lbHNlCi0gICAgICAgIGVjaG8gJyoqKicgY2Fubm90IGZpbmQgbW92ZS1pZi1jaGFuZ2UuICAxPiYyCi0gICAgICAgIGV4aXQgMQotZmkKLXJtIC1mIGNvbmZpZy5qdW5rIGNvbmZpZy50cmFzaAotCi1jYXNlICIke3NyY2Rpcn0iIGluCi0iIikKLSAgICAgICAgaWYgWyAtciBjb25maWd1cmUuaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBzcmNkaXI9LgotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWYgWyAtciAke3Byb2duYW1lfS5pbiBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyPWBlY2hvICR7cHJvZ25hbWV9IHwgc2VkICdzOi9jb25maWd1cmUkOjonYAotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgIkNhbid0IGZpbmQgY29uZmlndXJlLmluLiAgVHJ5IHVzaW5nIC0tc3JjZGlyPXNvbWVfZGlyIiAgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSopCi0JIyBTZXQgc3JjZGlyIHRvICIuIiBpZiB0aGF0J3Mgd2hhdCBpdCBpcy4KLQkjIFRoaXMgaXMgaW1wb3J0YW50IGZvciBtdWx0aWxpYiBzdXBwb3J0LgotCWlmIFsgISAtZCAke3NyY2Rpcn0gXSA7IHRoZW4KLQkJZWNobyAiSW52YWxpZCBzb3VyY2UgZGlyZWN0b3J5ICR7c3JjZGlyfSIgPiYyCi0JCWV4aXQgMQotCWZpCi0JcHdkPWBwd2RgCi0Jc3JjcHdkPWBjZCAke3NyY2Rpcn0gOyBwd2RgCi0JaWYgWyAiJHtwd2R9IiA9ICIke3NyY3B3ZH0iIF0gOyB0aGVuCi0JCXNyY2Rpcj0uCi0JZmkKLWVzYWMKLQotIyMjIHdhcm4gYWJvdXQgc29tZSBjb25mbGljdGluZyBjb25maWd1cmF0aW9ucy4KLQotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIi4iKSA7OwotKikKLSAgICAgICAgaWYgWyAtZiAke3NyY2Rpcn0vY29uZmlnLnN0YXR1cyBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgQ2Fubm90IGNvbmZpZ3VyZSBoZXJlIGluIFwiJHtQV0Q9YHB3ZGB9XCIgd2hlbiBcIiR7c3JjZGlyfVwiIGlzIGN1cnJlbnRseSBjb25maWd1cmVkLiAxPiYyCi0gICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi1lc2FjCi0KLQotIyBkZWZhdWx0IGV4ZWNfcHJlZml4Ci1jYXNlICIke2V4ZWNfcHJlZml4b3B0aW9ufSIgaW4KLSIiKSBleGVjX3ByZWZpeD0iXCQocHJlZml4KSIgOzsKLSopIDs7Ci1lc2FjCi0KLSMgRGVmaW5lIHRoZSB0cmlnZ2VyIGZpbGUgdG8gbWFrZSBzdXJlIGNvbmZpZ3VyZSB3aWxsIHJlLXJ1biB3aGVuZXZlcgotIyB0aGUgZ2NjIHZlcnNpb24gbnVtYmVyIGNoYW5nZXMuCi1pZiBbICIke3dpdGhfZ2NjX3ZlcnNpb25fdHJpZ2dlcitzZXR9IiA9IHNldCBdOyB0aGVuCi0gICAgZ2NjX3ZlcnNpb25fdHJpZ2dlcj0iJHdpdGhfZ2NjX3ZlcnNpb25fdHJpZ2dlciIKLSAgICBnY2NfdmVyc2lvbj1gc2VkIC1lICdzLy4qXCJcKFteIFwiXSpcKVsgXCJdLiovXDEvJyA8ICR7d2l0aF9nY2NfdmVyc2lvbl90cmlnZ2VyfWAKLWVsc2UKLSAgICAjIElmIGdjYydzIHNvdXJjZXMgYXJlIGF2YWlsYWJsZSwgZGVmaW5lIHRoZSB0cmlnZ2VyIGZpbGUuCi0gICAgaWYgWyAtZiAke3RvcHNyY2Rpcn0vZ2NjL3ZlcnNpb24uYyBdIDsgdGhlbgotCWdjY192ZXJzaW9uX3RyaWdnZXI9JHt0b3BzcmNkaXJ9L2djYy92ZXJzaW9uLmMKLQlnY2NfdmVyc2lvbj1gc2VkIC1lICdzLy4qXCJcKFteIFwiXSpcKVsgXCJdLiovXDEvJyA8ICR7Z2NjX3ZlcnNpb25fdHJpZ2dlcn1gCi0JY2FzZSAiJGFyZ3VtZW50cyIgaW4KLQkgICotLXdpdGgtZ2NjLXZlcnNpb24tdHJpZ2dlcj0kZ2NjX3ZlcnNpb25fdHJpZ2dlciogKQotCSAgICA7OwotCSAgKiApCi0JICAgICMgTWFrZSBzdXJlIGNvbmZpZ3VyZS5pbiBrbm93cyBhYm91dCB0aGlzLgotCSAgICBhcmd1bWVudHM9Ii0td2l0aC1nY2MtdmVyc2lvbi10cmlnZ2VyPSRnY2NfdmVyc2lvbl90cmlnZ2VyICRhcmd1bWVudHMiCi0JICAgIDs7Ci0JZXNhYwotCXdpdGhvcHRpb25zPSItLXdpdGgtZ2NjLXZlcnNpb24tdHJpZ2dlcj0kZ2NjX3ZlcnNpb25fdHJpZ2dlciAkd2l0aG9wdGlvbnMiCi0gICAgZmkKLWZpCi0KLSMjIyBicmVhayB1cCAke3NyY2Rpcn0vY29uZmlndXJlLmluLgotY2FzZSAiYGdyZXAgJ14jIHBlclwtaG9zdDonICR7c3JjZGlyfS9jb25maWd1cmUuaW5gIiBpbgotIiIpCi0gICAgICAgIGVjaG8gJyoqKicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBoYXMgbm8gXCJwZXItaG9zdDpcIiBsaW5lLiAxPiYyCi0JIyBDaGVjayBmb3IgYSBkaXJlY3RvcnkgdGhhdCdzIGJlZW4gY29udmVydGVkIHRvIHVzZSBhdXRvY29uZiBzaW5jZQotCSMgaXQgd2FzIGxhc3QgY29uZmlndXJlZC4KLQlpZiBncmVwIEFDX09VVFBVVCAke3NyY2Rpcn0vY29uZmlndXJlLmluID4vZGV2L251bGwgOyB0aGVuCi0JICBlY2hvICcqKionIEhtbSwgbG9va3MgbGlrZSB0aGlzIGRpcmVjdG9yeSBoYXMgYmVlbiBhdXRvY29uZmlzY2F0ZWQuIDE+JjIKLQkgIGlmIFsgLXIgJHtzcmNkaXJ9L2NvbmZpZ3VyZSBdIDsgdGhlbgotCSAgICBlY2hvICcqKionIFJ1bm5pbmcgdGhlIGxvY2FsIGNvbmZpZ3VyZSBzY3JpcHQuIDE+JjIKLQkgICAgY2FzZSAiJHtjYWNoZV9maWxlfSIgaW4KLQkgICAgIiIpIGNhY2hlX2ZpbGVfb3B0aW9uPSA7OwotCSAgICAqKSAgY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IiA7OwotCSAgICBlc2FjCi0JICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9JHtzcmNkaXJ9IgotCSAgICBjYXNlICIke2J1aWxkX2FsaWFzfSIgaW4KLQkgICAgIiIpIGJ1aWxkb3B0PSA7OwotCSAgICAqKSAgYnVpbGRvcHQ9Ii0tYnVpbGQ9JHtidWlsZF9hbGlhc30iIDs7Ci0JICAgIGVzYWMKLQkgICAgZXZhbCBleGVjICR7Y29uZmlnX3NoZWxsfSAke3NyY2Rpcn0vY29uZmlndXJlICR7dmVyYm9zZX0gXAotCQkke2J1aWxkb3B0fSAtLWhvc3Q9JHtob3N0X2FsaWFzfSAtLXRhcmdldD0ke3RhcmdldF9hbGlhc30gXAotCQkke3ByZWZpeG9wdGlvbn0gJHt0bXBkaXJvcHRpb259ICR7ZXhlY19wcmVmaXhvcHRpb259IFwKLQkJJHtzcmNkaXJvcHRpb259ICR7ZGlyb3B0aW9uc30gXAotCQkke3Byb2dyYW1fcHJlZml4b3B0aW9ufSAke3Byb2dyYW1fc3VmZml4b3B0aW9ufSBcCi0JCSR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gJHtzaXRlX29wdGlvbn0gXAotCQkke3dpdGhvcHRpb25zfSAke3dpdGhvdXRvcHRpb25zfSBcCi0JCSR7ZW5hYmxlb3B0aW9uc30gJHtkaXNhYmxlb3B0aW9uc30gJHtmbG9hdGluZ19wb2ludG9wdGlvbn0gXAotCQkke2NhY2hlX2ZpbGVfb3B0aW9ufSAke3JlbW92aW5nfSAke290aGVyX29wdGlvbnN9ICR7cmVkaXJlY3R9Ci0JICBlbHNlCi0JICAgIGVjaG8gJyoqKicgVGhlcmUgaXMgbm8gY29uZmlndXJlIHNjcmlwdCBwcmVzZW50IHRob3VnaC4gMT4mMgotCSAgZmkKLQlmaQotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWNhc2UgImBncmVwICdeIyBwZXJcLXRhcmdldDonICR7c3JjZGlyfS9jb25maWd1cmUuaW5gIiBpbgotIiIpCi0gICAgICAgIGVjaG8gJyoqKicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBoYXMgbm8gXCJwZXItdGFyZ2V0OlwiIGxpbmUuIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1jYXNlICIke1RNUERJUn0iIGluCi0iIikgVE1QRElSPS90bXAgOyBleHBvcnQgVE1QRElSIDs7Ci0qKSA7OwotZXNhYwotCi0jIGtlZXAgdGhpcyBmaWxlbmFtZSBzaG9ydCBmb3IgJiUqJSQqIyAxNCBjaGFyIGZpbGUgbmFtZXMgYW5kIDgrMyBmaWxlIG5hbWVzCi10bXBmaWxlPSR7VE1QRElSfS9jTmYkJAotIyBOb3RlIHRoYXQgdW5kZXIgbWFueSB2ZXJzaW9ucyBvZiBzaCBhIHRyYXAgaGFuZGxlciBmb3IgMCB3aWxsICpvdmVycmlkZSogYW55Ci0jIGV4aXQgc3RhdHVzIHlvdSBleHBsaWNpdGx5IHNwZWNpZnkhICBBdCB0aGlzIHBvaW50LCB0aGUgb25seSBub24tZXJyb3IgZXhpdAotIyBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzY3JpcHQ7IHRoZXNlIGFjdGlvbnMgYXJlIGR1cGxpY2F0ZWQgdGhlcmUsIG1pbnVzCi0jIHRoZSAiZXhpdCAxIi4gIERvbid0IHVzZSAiZXhpdCAwIiBhbnl3aGVyZSBhZnRlciB0aGlzIHdpdGhvdXQgcmVzZXR0aW5nIHRoZQotIyB0cmFwIGhhbmRsZXIsIG9yIHlvdSdsbCBsb3NlLgotdHJhcCAicm0gLWYgTWFrZWZpbGUudGVtICR7dG1wZmlsZX0uY29tICR7dG1wZmlsZX0udGd0ICR7dG1wZmlsZX0uaHN0ICR7dG1wZmlsZX0ucG9zOyBleGl0IDEiIDAgMSAyIDE1Ci0KLSMgc3BsaXQgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBpbnRvIGNvbW1vbiwgcGVyLWhvc3QsIHBlci10YXJnZXQsCi0jIGFuZCBwb3N0LXRhcmdldCBwYXJ0cy4gIFBvc3QtdGFyZ2V0IGlzIG9wdGlvbmFsLgotc2VkIC1lICcvXiMgcGVyXC1ob3N0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LmNvbQotc2VkIC1lICcxLC9eIyBwZXJcLWhvc3Q6L2QnIC1lICcvXiMgcGVyXC10YXJnZXQ6LywkZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0uaHN0Ci1pZiBncmVwICdeIyBwb3N0LXRhcmdldDonICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPi9kZXYvbnVsbCA7IHRoZW4KLSAgc2VkIC1lICcxLC9eIyBwZXJcLXRhcmdldDovZCcgLWUgJy9eIyBwb3N0XC10YXJnZXQ6LywkZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0udGd0Ci0gIHNlZCAtZSAnMSwvXiMgcG9zdFwtdGFyZ2V0Oi9kJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS5wb3MKLWVsc2UKLSAgc2VkIC1lICcxLC9eIyBwZXJcLXRhcmdldDovZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0udGd0Ci0gIGVjaG8gPiR7dG1wZmlsZX0ucG9zCi1maQotCi0jIyMgZG8gY29tbW9uIHBhcnQgb2YgY29uZmlndXJlLmluCi0KLSMgSWYgdGhlIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyIGRvZXMgbm90IGV4aXN0LCBidXQgdGhlICJnY2MiIGRpcmVjdG9yeSBkb2VzLAotIyB3ZSB3aWxsIHNraXAgdGhpcyBkaXJlY3Rvcnk7IGluIHRoaXMgY2FzZSB0aGUgc3ViLWRpcmVjdG9yeSdzIGNvbW1vbiBwYXJ0Ci0jIG9mIGNvbmZpZ3VyZS5pbiB3aWxsIGNyZWF0ZSBhIHNtYWxsIHNoZWxsIHNjcmlwdCAic2tpcC10aGlzLWRpciIgY29udGFpbmluZwotIyBjb21tYW5kcyB0byBjb21wbGV0ZWx5IGNsZWFuIHVwIGFueSB0ZW1wb3Jhcnkgb3IgY3JlYXRlZCBmaWxlcy4KLQotLiAke3RtcGZpbGV9LmNvbQotCi1pZiB0ZXN0IC1mIHNraXAtdGhpcy1kaXI7IHRoZW4KLQkjIFBlcmZvcm0gdGhlIHNhbWUgY2xlYW51cCBhcyB0aGUgdHJhcCBoYW5kbGVyLCBtaW51cyB0aGUgImV4aXQgMSIgb2YgY291cnNlLAotCSMgYW5kIHJlc2V0IHRoZSB0cmFwIGhhbmRsZXIuCi0JdHJhcCAwCi0Jcm0gLWYgTWFrZWZpbGUqICR7dG1wZmlsZX0uY29tICR7dG1wZmlsZX0udGd0ICR7dG1wZmlsZX0uaHN0ICR7dG1wZmlsZX0ucG9zCi0JIyBFeGVjdXRlIHRoZSBmaW5hbCBjbGVhbi11cCBhY3Rpb25zCi0JJHtjb25maWdfc2hlbGx9IHNraXAtdGhpcy1kaXIKLQkjIGFuZCBzdG9wIGNvbmZpZ3VyaW5nIHRoaXMgZGlyZWN0b3J5LgotCWV4aXQgMAotZmkKLQotIyBzb21lIHNhbml0eSBjaGVja3Mgb24gY29uZmlndXJlLmluCi1jYXNlICIke3NyY3RyaWdnZXJ9IiBpbgotIiIpCi0gICAgICAgIGVjaG8gJyoqKicgc3JjdHJpZ2dlciBub3Qgc2V0IGluICR7UFdEPWBwd2RgfS9jb25maWd1cmUuaW4uICAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotY2FzZSAiJHtidWlsZF9hbGlhc30iIGluCi0iIikKLQlpZiByZXN1bHQ9YCR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gJHtob3N0X2FsaWFzfWAgOyB0aGVuCi0JICAgIGJ1aWxkX2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLQkgICAgYnVpbGRfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotCSAgICBidWlsZF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLQkgICAgYnVpbGQ9JHtidWlsZF9jcHV9LSR7YnVpbGRfdmVuZG9yfS0ke2J1aWxkX29zfQotCSAgICBidWlsZF9hbGlhcz0ke2hvc3RfYWxpYXN9Ci0JZmkKLQk7OwotKikKLQlpZiByZXN1bHQ9YCR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gJHtidWlsZF9hbGlhc31gIDsgdGhlbgotCSAgICBidWlsZG9wdD0iLS1idWlsZD0ke2J1aWxkX2FsaWFzfSIKLQkgICAgYnVpbGRfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotCSAgICBidWlsZF92ZW5kb3I9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi0JICAgIGJ1aWxkX29zPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCSAgICBidWlsZD0ke2J1aWxkX2NwdX0tJHtidWlsZF92ZW5kb3J9LSR7YnVpbGRfb3N9Ci0JZWxzZQotCSAgICBlY2hvICJVbnJlY29nbml6ZWQgYnVpbGQgc3lzdGVtIG5hbWUgJHtidWlsZF9hbGlhc30uIiAxPiYyCi0JICAgIGV4aXQgMQotCWZpCi0JOzsKLWVzYWMKLQotaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7aG9zdF9hbGlhc31gIDsgdGhlbgotICAgIHRydWUKLWVsc2UKLSAgICBlY2hvICJVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gbmFtZSAke2hvc3RfYWxpYXN9LiIgMT4mMgotICAgIGV4aXQgMQotZmkKLWhvc3RfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotaG9zdD0ke2hvc3RfY3B1fS0ke2hvc3RfdmVuZG9yfS0ke2hvc3Rfb3N9Ci0KLS4gJHt0bXBmaWxlfS5oc3QKLQotaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7dGFyZ2V0X2FsaWFzfWAgOyB0aGVuCi0gICAgdHJ1ZQotZWxzZQotICAgIGVjaG8gIlVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIG5hbWUgJHt0YXJnZXRfYWxpYXN9LiIgMT4mMgotICAgIGV4aXQgMQotZmkKLXRhcmdldF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotdGFyZ2V0PSR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfS0ke3RhcmdldF9vc30KLQotLiAke3RtcGZpbGV9LnRndAotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1jYXNlICIke3NyY2Rpcn0iIGluCi0iIikKLSAgICAgICAgc3JjZGlyZGVmYXVsdGVkPTEKLSAgICAgICAgc3JjZGlyPS4KLSAgICAgICAgaWYgWyAhIC1yICR7c3JjdHJpZ2dlcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBzcmNkaXI9Li4KLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWlmIFsgISAtciAke3NyY2Rpcn0vJHtzcmN0cmlnZ2VyfSBdIDsgdGhlbgotICAgICAgICBjYXNlICIke3NyY2RpcmRlZmF1bHRlZH0iIGluCi0gICAgICAgICIiKSBlY2hvICcqKionICIke3Byb2duYW1lfTogQ2FuJ3QgZmluZCAke3NyY25hbWV9IHNvdXJjZXMgaW4gJHtQV0Q9YHB3ZGB9LyR7c3JjZGlyfSIgMT4mMiA7OwotICAgICAgICAqKSAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IENhbid0IGZpbmQgJHtzcmNuYW1lfSBzb3VyY2VzIGluICR7UFdEPWBwd2RgfS8uIG9yICR7UFdEPWBwd2RgfS8uLiIgMT4mMiA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgZWNobyAnKioqJyBcKEF0IGxlYXN0ICR7c3JjdHJpZ2dlcn0gaXMgbWlzc2luZy5cKSAxPiYyCi0gICAgICAgIGV4aXQgMQotZmkKLQotIyBTb21lIHN5c3RlbXMgKGUuZy4sIG9uZSBvZiB0aGUgaTM4Ni1haXggc3lzdGVtcyB0aGUgZ2FzIHRlc3RlcnMgYXJlCi0jIHVzaW5nKSBkb24ndCBoYW5kbGUgIlwkIiBjb3JyZWN0bHksIHNvIGRvbid0IHVzZSBpdCBoZXJlLgotdG9vbGRpcj0nJChleGVjX3ByZWZpeCknLyR7dGFyZ2V0X2FsaWFzfQotCi1pZiBbICIke2hvc3RfYWxpYXN9IiAhPSAiJHt0YXJnZXRfYWxpYXN9IiBdIDsgdGhlbgotICAgIGlmIFsgIiR7cHJvZ3JhbV9wcmVmaXhvcHRpb259IiA9ICIiIF0gOyB0aGVuCi0gICAgICAgIGlmIFsgIiR7cHJvZ3JhbV9zdWZmaXhvcHRpb259IiA9ICIiIF0gOyB0aGVuIAotICAgICAgICAgICAgaWYgWyAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9ufSIgPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgICAgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0gOwotICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICBmaQotZmkKLQotIyBNZXJnZSBwcm9ncmFtX3ByZWZpeCBhbmQgcHJvZ3JhbV9zdWZmaXggb250byBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLgotIyAocHJvZ3JhbV9zdWZmaXggdXNlZCB0byB1c2UgJCwgYnV0IGl0J3MgaGFyZCB0byBwcmVzZXJ2ZSAkIHRocm91Z2ggYm90aAotIyBtYWtlIGFuZCBzaC4pCi1pZiBbICIke3Byb2dyYW1fc3VmZml4fSIgIT0gIiIgXSA7IHRoZW4KLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSItZSBzLFxcXFwoLipcXFxcKSxcXFxcMSR7cHJvZ3JhbV9zdWZmaXh9LCAke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IgotZmkKLQotaWYgWyAiJHtwcm9ncmFtX3ByZWZpeH0iICE9ICIiIF0gOyB0aGVuCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iLWUgcyxeLCR7cHJvZ3JhbV9wcmVmaXh9LCAke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IgotZmkKLQotIyBJZiBDQyBhbmQgQ1hYIGFyZSBub3Qgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgYW5kIHRoZSBNYWtlZmlsZQotIyBleGlzdHMsIHRyeSB0byBleHRyYWN0IHRoZW0gZnJvbSBpdC4gIFRoaXMgaXMgdG8gaGFuZGxlIHJ1bm5pbmcKLSMgLi9jb25maWcuc3RhdHVzIGJ5IGhhbmQuCi1pZiBbIC16ICIke0NDfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ0NbIAldKj0vIHMvQ0NbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ0M9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi1pZiBbIC16ICIke0NGTEFHU30iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNGTEFHU1sgCV0qPS8gcy9DRkxBR1NbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ0ZMQUdTPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotaWYgWyAteiAiJHtDWFh9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DWFhbIAldKj0vIHMvQ1hYWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENYWD1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLWlmIFsgLXogIiR7Q1hYRkxBR1N9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DWFhGTEFHU1sgCV0qPS8gcy9DWFhGTEFHU1sgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDWFhGTEFHUz1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLSMgR2VuZXJhdGUgYSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIFlBQ0MuICBUaGlzIGlzIHVzZWQgaWYgdGhlIG1ha2VmaWxlIGNhbid0Ci0jIGxvY2F0ZSBiaXNvbiBvciBieWFjYyBpbiBvYmpkaXIuCi0KLWZvciBwcm9nIGluICdiaXNvbiAteScgYnlhY2MgeWFjYwotZG8KLSAgc2V0IGR1bW15ICRwcm9nOyB0bXA9JDIKLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci8kdG1wOyB0aGVuCi0gICAgICBERUZBVUxUX1lBQ0M9IiRwcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIHRlc3QgLW4gIiRERUZBVUxUX1lBQ0MiICYmIGJyZWFrCi1kb25lCi0KLSMgR2VuZXJhdGUgYSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIE00LiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAotIyBsb2NhdGUgbTQgaW4gb2JqZGlyLgotCi1mb3IgcHJvZyBpbiBnbTQgZ251bTQgbTQKLWRvCi0gIHNldCBkdW1teSAkcHJvZzsgdG1wPSQyCi0gIElGUz0iJHtJRlM9ICAgfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyLyR0bXA7IHRoZW4KLSAgICAgIERFRkFVTFRfTTQ9IiRwcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIHRlc3QgLW4gIiRERUZBVUxUX000IiAmJiBicmVhawotZG9uZQotCi0jIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBMRVguICBUaGlzIGlzIHVzZWQgaWYgdGhlIG1ha2VmaWxlIGNhbid0Ci0jIGxvY2F0ZSBmbGV4IGluIG9iamRpci4KLQotZm9yIHByb2cgaW4gZmxleCBsZXgKLWRvCi0gIHNldCBkdW1teSAkcHJvZzsgdG1wPSQyCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvJHRtcDsgdGhlbgotICAgICAgREVGQVVMVF9MRVg9IiRwcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIHRlc3QgLW4gIiRERUZBVUxUX0xFWCIgJiYgYnJlYWsKLWRvbmUKLQotIyBCSU5VVElMUyBMT0NBTDogVGhpcyBpcyBpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdCBDRkxBR1Mgd2hlbiB1c2luZyBnY2MuCi13YXJuX2NmbGFncz0iLVcgLVdhbGwiCi0KLWlmIFsgIiR7YnVpbGR9IiAhPSAiJHtob3N0fSIgXTsgdGhlbgotICAjIElmIHdlIGFyZSBkb2luZyBhIENhbmFkaWFuIENyb3NzLCBpbiB3aGljaCB0aGUgaG9zdCBhbmQgYnVpbGQgc3lzdGVtcwotICAjIGFyZSBub3QgdGhlIHNhbWUsIHdlIHNldCByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgdG9vbHMuCi0KLSAgdG9vbHM9IkFSIEFSX0ZPUl9UQVJHRVQgQVMgQVNfRk9SX1RBUkdFVCBCSVNPTiBDQ19GT1JfQlVJTEQiCi0gIHRvb2xzPSIke3Rvb2xzfSBDQ19GT1JfVEFSR0VUIENYWF9GT1JfVEFSR0VUIgotICB0b29scz0iJHt0b29sc30gRExMVE9PTCBETExUT09MX0ZPUl9UQVJHRVQgR0NDX0ZPUl9UQVJHRVQgSE9TVF9QUkVGSVgiCi0gIHRvb2xzPSIke3Rvb2xzfSBIT1NUX1BSRUZJWF8xIExEIExEX0ZPUl9UQVJHRVQgTEVYIE1BS0VJTkZPIE5NIgotICB0b29scz0iJHt0b29sc30gTk1fRk9SX1RBUkdFVCBSQU5MSUIgUkFOTElCX0ZPUl9UQVJHRVQiCi0gIHRvb2xzPSIke3Rvb2xzfSBXSU5EUkVTIFdJTkRSRVNfRk9SX1RBUkdFVCBZQUNDIgotCi0gIGZvciB2YXIgaW4gJHt0b29sc307IGRvCi0gICAgaWYgWyAteiAiYGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAiIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gICAgICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL14nIiR7dmFyfSInWyAJXSo9LyBzLyciJHt2YXJ9IidbIAldKj1bIAldKlwoLipcKS9cMS9wJyBcCi0JPCBNYWtlZmlsZSA+IE1ha2VmaWxlLnYKLSAgICAgIHQ9YHRhaWwgLTEgTWFrZWZpbGUudmAKLSAgICAgIGlmIFsgLW4gIiR7dH0iIF07IHRoZW4KLQlldmFsICIke3Zhcn09JyR7dH0nIgotICAgICAgZmkKLSAgICAgIHJtIC1mIE1ha2VmaWxlLnYKLSAgICBmaQotICBkb25lCi0KLSAgQVI9JHtBUi0ke2hvc3RfYWxpYXN9LWFyfQotICBBUl9GT1JfVEFSR0VUPSR7QVJfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYXJ9Ci0gIEFTPSR7QVMtJHtob3N0X2FsaWFzfS1hc30KLSAgQVNfRk9SX1RBUkdFVD0ke0FTX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWFzfQotICBCSVNPTj0ke0JJU09OLWJpc29ufQotICBDQz0ke0NDLSR7aG9zdF9hbGlhc30tZ2NjfQotICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiAke3dhcm5fY2ZsYWdzfSJ9Ci0gIENYWD0ke0NYWC0ke2hvc3RfYWxpYXN9LWMrK30KLSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLSAgQ0NfRk9SX0JVSUxEPSR7Q0NfRk9SX0JVSUxELWdjY30KLSAgQ0NfRk9SX1RBUkdFVD0ke0NDX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWdjY30KLSAgQ1hYX0ZPUl9UQVJHRVQ9JHtDWFhfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYysrfQotICBETExUT09MPSR7RExMVE9PTC0ke2hvc3RfYWxpYXN9LWRsbHRvb2x9Ci0gIERMTFRPT0xfRk9SX1RBUkdFVD0ke0RMTFRPT0xfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tZGxsdG9vbH0KLSAgR0NDX0ZPUl9UQVJHRVQ9JHtHQ0NfRk9SX1RBUkdFVC0ke0NDX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWdjY319Ci0gIEhPU1RfUFJFRklYPSR7YnVpbGRfYWxpYXN9LQotICBIT1NUX1BSRUZJWF8xPSR7YnVpbGRfYWxpYXN9LQotICBMRD0ke0xELSR7aG9zdF9hbGlhc30tbGR9Ci0gIExEX0ZPUl9UQVJHRVQ9JHtMRF9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1sZH0KLSAgTUFLRUlORk89JHtNQUtFSU5GTy1tYWtlaW5mb30KLSAgTk09JHtOTS0ke2hvc3RfYWxpYXN9LW5tfQotICBOTV9GT1JfVEFSR0VUPSR7Tk1fRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tbm19Ci0gIFJBTkxJQj0ke1JBTkxJQi0ke2hvc3RfYWxpYXN9LXJhbmxpYn0KLSAgUkFOTElCX0ZPUl9UQVJHRVQ9JHtSQU5MSUJfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tcmFubGlifQotICBXSU5EUkVTPSR7V0lORFJFUy0ke2hvc3RfYWxpYXN9LXdpbmRyZXN9Ci0gIFdJTkRSRVNfRk9SX1RBUkdFVD0ke1dJTkRSRVNfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30td2luZHJlc30KLQotICBpZiBbIC16ICIke1lBQ0N9IiBdOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9iaXNvbjsgdGhlbgotCVlBQ0M9ImJpc29uIC15IgotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL2J5YWNjOyB0aGVuCi0JWUFDQz1ieWFjYwotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL3lhY2M7IHRoZW4KLQlZQUNDPXlhY2MKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgaWYgWyAteiAiJHtZQUNDfSIgXTsgdGhlbgotICAgICAgWUFDQz0iYmlzb24gLXkiCi0gICAgZmkKLSAgZmkKLQotICBpZiBbIC16ICIke0xFWH0iIF07IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2ZsZXg7IHRoZW4KLQlMRVg9ZmxleAotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL2xleDsgdGhlbgotCUxFWD1sZXgKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgTEVYPSR7TEVYLWZsZXh9Ci0gIGZpCi0KLSAgIyBFeHBvcnQgdmFyaWFibGVzIHdoaWNoIGF1dG9jb25mIG1pZ2h0IHRyeSB0byBzZXQuCi0gIGV4cG9ydCBBUwotICBleHBvcnQgQVIKLSAgZXhwb3J0IENDX0ZPUl9CVUlMRAotICBleHBvcnQgRExMVE9PTAotICBleHBvcnQgTEQKLSAgZXhwb3J0IE5NCi0gIGV4cG9ydCBSQU5MSUIKLSAgZXhwb3J0IFdJTkRSRVMKLWVsc2UKLSAgIyBJZiBDQyBpcyBzdGlsbCBub3Qgc2V0LCB0cnkgdG8gZ2V0IGdjYy4KLSAgaWYgWyAteiAiJHtDQ30iIF07IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgotCUNDPSJnY2MiCi0JZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi0JaWYgdGVzdCAteiAiYCR7Q0N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiAke3dhcm5fY2ZsYWdzfSJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotCWVsc2UKLQkgIENGTEFHUz0ke0NGTEFHUy0iLU8yICR7d2Fybl9jZmxhZ3N9In0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1PMiJ9Ci0JZmkKLQlybSAtZiBjb25mdGVzdCoKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgQ0M9JHtDQy1jY30KLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiR7Q0ZMQUdTfSI7IHRoZW4KLSAgICAgICMgSGVyZSBDQyBpcyBzZXQgYnV0IENGTEFHUyBpcyBub3QuICBVc2UgYSBxdWljayBoYWNrIHRvIHVzZSAtTzIgaWYgQ0MKLSAgICAgICMgaXMgc2V0IHRvIGEgdmVyc2lvbiBvZiBnY2MuCi0gICAgICBjYXNlICIke0NDfSIgaW4KLSAgICAgICpnY2MpCi0JZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi0JaWYgdGVzdCAteiAiYCR7Q0N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiAke3dhcm5fY2ZsYWdzfSJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotCWVsc2UKLQkgIENGTEFHUz0ke0NGTEFHUy0iLU8yICR7d2Fybl9jZmxhZ3N9In0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1PMiJ9Ci0JZmkKLQlybSAtZiBjb25mdGVzdCoKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi0gIGZpCi0KLSAgQ1hYPSR7Q1hYLSJjKysifQotICBDRkxBR1M9JHtDRkxBR1MtIi1nIn0KLSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLWZpCi0KLWV4cG9ydCBDQwotZXhwb3J0IENYWAotZXhwb3J0IENGTEFHUwotZXhwb3J0IENYWEZMQUdTCi0KLQotZm9yIHN1YmRpciBpbiAuICR7c3ViZGlyc30gOyBkbwotCi0gICAgIyAke3N1YmRpcn0gaXMgcmVsYXRpdmUgcGF0aCBmcm9tIC4gdG8gdGhlIGRpcmVjdG9yeSB3ZSdyZSBjdXJyZW50bHkKLSAgICAjIGNvbmZpZ3VyaW5nLgotICAgICMgJHtpbnZzdWJkaXJ9IGlzIGludmVyc2Ugb2YgJHtzdWJkaXIpLCAqd2l0aCogdHJhaWxpbmcgLywgaWYgbmVlZGVkLgotICAgIGludnN1YmRpcj1gZWNobyAke3N1YmRpcn0vIHwgc2VkIC1lICdzfFwuL3x8ZycgLWUgJ3N8W14vXSovfC4uL3xnJ2AKLQotICAgICMjIyBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBzcmNkaXIKLSAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICIuIikgICMgbm8gLXNyY2RpciBvcHRpb24uICBXZSdyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICAgICAgICAgICAgICBtYWtlc3JjZGlyPS4gOzsKLSAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICAgICAgICAgIG1ha2VzcmNkaXI9YGVjaG8gJHtzcmNkaXJ9LyR7c3ViZGlyfSB8IHNlZCAtZSAnc3wvXC4kfHwnYAotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgY2FzZSAiJHtzdWJkaXJ9IiBpbgotICAgICAgICAgICAgICAgIC4pIG1ha2VzcmNkaXI9JHtzcmNkaXJ9IDs7Ci0gICAgICAgICAgICAgICAgKikgbWFrZXNyY2Rpcj0ke2ludnN1YmRpcn0ke3NyY2Rpcn0vJHtzdWJkaXJ9IDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgWyAiJHtzdWJkaXJ9LyIgIT0gIi4vIiBdIDsgdGhlbgotICAgICAgICBNYWtlZmlsZT0ke3N1YmRpcn0vTWFrZWZpbGUKLSAgICBmaQotCi0gICAgaWYgWyAhIC1kICR7c3ViZGlyfSBdIDsgdGhlbgotICAgICAgICBpZiBta2RpciAke3N1YmRpcn0gOyB0aGVuCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke3N1YmRpcn0iIDE+JjIKLSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLSAgICBmaQotCi0gICAgY2FzZSAiJHtyZW1vdmluZ30iIGluCi0gICAgIiIpCi0gICAgICAgIGNhc2UgIiR7c3ViZGlyfSIgaW4KLSAgICAgICAgLikgOzsKLSAgICAgICAgKikgZXZhbCBlY2hvIEJ1aWxkaW5nIGluICR7c3ViZGlyfSAke3JlZGlyZWN0fSA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgIyBGSVhNRSBTaG91bGQgdGhpcyBiZSBkb25lIHJlY3Vyc2l2ZWx5ID8/PyAoVXNlZnVsIGZvciBlLmcuIGdkYnRlc3QpCi0gICAgICAgICMgU2V0IHVwIHRoZSBsaXN0IG9mIGxpbmtzIHRvIGJlIG1hZGUuCi0gICAgICAgICMgJHtsaW5rc30gaXMgdGhlIGxpc3Qgb2YgbGluayBuYW1lcywgYW5kICR7ZmlsZXN9IGlzIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpbmsgdG8uCi0KLSAgICAgICAgIyBNYWtlIHRoZSBsaW5rcy4KLSAgICAgICAgY29uZmlnbGlua3M9IiR7bGlua3N9IgotICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuc3RhdHVzIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgbXYgLWYgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrCi0gICAgICAgIGZpCi0gICAgICAgIHdoaWxlIFsgLW4gIiR7ZmlsZXN9IiBdIDsgZG8KLSAgICAgICAgICAgICAgICAjIHNldCBmaWxlIHRvIGNhciBvZiBmaWxlcywgZmlsZXMgdG8gY2RyIG9mIGZpbGVzCi0gICAgICAgICAgICAgICAgc2V0ICR7ZmlsZXN9OyBmaWxlPSQxOyBzaGlmdDsgZmlsZXM9JCoKLSAgICAgICAgICAgICAgICBzZXQgJHtsaW5rc307IGxpbms9JDE7IHNoaWZ0OyBsaW5rcz0kKgotCi0gICAgICAgICAgICAgICAgaWYgWyAhIC1yICR7c3JjZGlyfS8ke2ZpbGV9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtmaWxlfSBdIDsgdGhlbgotCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY2Fubm90IGNyZWF0ZSBhIGxpbmsgXCIke2xpbmt9XCIsIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJzaW5jZSB0aGUgZmlsZSBcIiR7c3JjZGlyfS8ke2ZpbGV9XCIgZG9lcyBub3QgZXhpc3QuIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLQkJICBlbHNlCi0JCQlzcmNmaWxlPSR7ZmlsZX0KLQkJICBmaQotCQllbHNlCi0JCQlzcmNmaWxlPSR7c3JjZGlyfS8ke2ZpbGV9Ci0gICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgICR7cmVtb3ZlfSAtZiAke2xpbmt9Ci0JCSMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsKLQkJaWYgJHtzeW1ib2xpY19saW5rfSAke3NyY2ZpbGV9ICR7bGlua30gPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCQkJdHJ1ZQotCQllbHNlCi0JCQkjIFdlIG5lZWQgdG8gcmUtcmVtb3ZlIHRoZSBmaWxlIGJlY2F1c2UgTHlueCBsZWF2ZXMgYSAKLQkJCSMgdmVyeSBzdHJhbmdlIGRpcmVjdG9yeSB0aGVyZSB3aGVuIGl0IGZhaWxzIGFuIE5GUyBzeW1saW5rLgotCQkJJHtyZW1vdmV9IC1yIC1mICR7bGlua30KLQkJCSR7aGFyZF9saW5rfSAke3NyY2ZpbGV9ICR7bGlua30KLQkJZmkKLSAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtsaW5rfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IHVuYWJsZSB0byBsaW5rIFwiJHtsaW5rfVwiIHRvIFwiJHtzcmNmaWxlfVwiLiIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgIGVjaG8gIkxpbmtlZCBcIiR7bGlua31cIiB0byBcIiR7c3JjZmlsZX1cIi4iCi0gICAgICAgIGRvbmUKLQotICAgICAgICAjIENyZWF0ZSBhIC5nZGJpbml0IGZpbGUgd2hpY2ggcnVucyB0aGUgb25lIGluIHNyY2RpcgotICAgICAgICAjIGFuZCB0ZWxscyBHREIgdG8gbG9vayB0aGVyZSBmb3Igc291cmNlIGZpbGVzLgotCi0gICAgICAgIGlmIFsgLXIgJHtzcmNkaXJ9LyR7c3ViZGlyfS8uZ2RiaW5pdCBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGNhc2UgJHtzcmNkaXJ9IGluCi0gICAgICAgICAgICAgICAgLikgOzsKLSAgICAgICAgICAgICAgICAqKSBjYXQgPiAke3N1YmRpcn0vLmdkYmluaXQgPDxFT0YKLSMgJHtOT19FRElUfQotZGlyICR7bWFrZXNyY2Rpcn0KLWRpciAuCi1zb3VyY2UgJHttYWtlc3JjZGlyfS8uZ2RiaW5pdAotRU9GCi0gICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgZmkKLQotICAgICAgICAjIEluc3RhbGwgYSBtYWtlZmlsZSwgYW5kIG1ha2UgaXQgc2V0IFZQQVRICi0gICAgICAgICMgaWYgbmVjZXNzYXJ5IHNvIHRoYXQgdGhlIHNvdXJjZXMgYXJlIGZvdW5kLgotICAgICAgICAjIEFsc28gY2hhbmdlIGl0cyB2YWx1ZSBvZiBzcmNkaXIuCi0gICAgICAgICMgTk9URTogTWFrZWZpbGUgZ2VuZXJhdGlvbiBjb25zdGl0dXRlcyB0aGUgbWFqb3JpdHkgb2YgdGhlIHRpbWUgaW4gY29uZmlndXJlLiAgSGVuY2UsIHRoaXMgc2VjdGlvbiBoYXMKLSAgICAgICAgIyBiZWVuIHNvbWV3aGF0IG9wdGltaXplZCBhbmQgaXMgcGVyaGFwcyBhIGJpdCB0d2lzdHkuCi0KLSAgICAgICAgIyBjb2RlIGlzIG9yZGVyIHNvIGFzIHRvIHRyeSB0byBzZWQgdGhlIHNtYWxsZXN0IGlucHV0IGZpbGVzIHdlIGtub3cuCi0gICAgICAgICMgc28gZG8gdGhlc2Ugc2VwYXJhdGVseSBiZWNhdXNlIEkgZG9uJ3QgdHJ1c3QgdGhlIG9yZGVyIG9mIHNlZCAtZSBleHByZXNzaW9ucy4KLQotICAgICAgICAjIHRoZSBmaXZlIG1ha2VmaWxlIGZyYWdtZW50cyBNVVNUIGVuZCB1cCBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlIGluIHRoaXMgb3JkZXI6IAotICAgICAgICAjIHBhY2thZ2UgbWFjcm9zLCB0YXJnZXQsIGhvc3QsIHNpdGUsIGFuZCBwYWNrYWdlIHJ1bGVzLgotCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSBdIDsgdGhlbgotCi0gICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIHRoZSBtYWtlZmlsZSBmb3IgdGhpcyBwYWNrYWdlIGZyb20gIk1ha2VmaWxlLmluIiAob3Igd2hhdGV2ZXIgaXQncyBjYWxsZWQpIGludG8gTWFrZWZpbGUudGVtLgotICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9LyR7TWFrZWZpbGV9LnRlbQotICAgICAgICAgICAgY2FzZSAiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ID4gJHtNYWtlZmlsZX0udGVtCi0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBFeHBlY3RlZCBwYWNrYWdlIG1ha2VmaWxlIHJ1bGVzIGZyYWdtZW50IFwiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9XCIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBpcyBtaXNzaW5nIGluICR7UFdEPWBwd2RgfS4gMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke01ha2VmaWxlfS50ZW0KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSBmb3IgdGhpcyBzaXRlLgotICAgICAgICAgICAgcm0gLWYgJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgY2FzZSAiJHtzaXRlfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9L2NvbmZpZy9tcy0ke3NpdGV9Ci0KLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7TWFrZWZpbGV9Ci0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIGhvc3QuCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7aG9zdF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtob3N0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtob3N0X21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIGhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke3N1YmRpcikvTWFrZWZpbGUudGVtCi0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIHRhcmdldC4KLSAgICAgICAgICAgIHJtIC1mICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICBjYXNlICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3RhcmdldF9tYWtlZmlsZV9mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyBFbWl0IHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGlzIHBhY2thZ2UncyBtYWNyb3MuCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICBjYXNlICIke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIHBhY2thZ2UgbWFrZWZpbGUgZnJhZ21lbnQgXCIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgcmVhbCBjb3B5IG5vdyBpbiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0KLSAgICAgICAgICAgICMgcHJlcGVuZCB3YXJuaW5nIGFib3V0IGVkaXR0aW5nLCBhbmQgYSBidW5jaCBvZiB2YXJpYWJsZXMuCi0gICAgICAgICAgICBybSAtZiAke01ha2VmaWxlfQotICAgICAgICAgICAgY2F0ID4gJHtNYWtlZmlsZX0gPDxFT0YKLSMgJHtOT19FRElUfQotVlBBVEggPSAke21ha2VzcmNkaXJ9Ci1saW5rcyA9ICR7Y29uZmlnbGlua3N9Ci1ob3N0X2FsaWFzID0gJHtob3N0X2FsaWFzfQotaG9zdF9jcHUgPSAke2hvc3RfY3B1fQotaG9zdF92ZW5kb3IgPSAke2hvc3RfdmVuZG9yfQotaG9zdF9vcyA9ICR7aG9zdF9vc30KLWhvc3RfY2Fub25pY2FsID0gJHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQotdGFyZ2V0X2FsaWFzID0gJHt0YXJnZXRfYWxpYXN9Ci10YXJnZXRfY3B1ID0gJHt0YXJnZXRfY3B1fQotdGFyZ2V0X3ZlbmRvciA9ICR7dGFyZ2V0X3ZlbmRvcn0KLXRhcmdldF9vcyA9ICR7dGFyZ2V0X29zfQotdGFyZ2V0X2Nhbm9uaWNhbCA9ICR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfS0ke3RhcmdldF9vc30KLUVPRgotCSAgICBjYXNlICIke2J1aWxkfSIgaW4KLQkgICAgICAiIikgOzsKLQkgICAgICAqKSAgY2F0ID4+ICR7TWFrZWZpbGV9IDw8IEVPRgotYnVpbGRfYWxpYXMgPSAke2J1aWxkX2FsaWFzfQotYnVpbGRfY3B1ID0gJHtidWlsZF9jcHV9Ci1idWlsZF92ZW5kb3IgPSAke2J1aWxkX3ZlbmRvcn0KLWJ1aWxkX29zID0gJHtidWlsZF9vc30KLWJ1aWxkX2Nhbm9uaWNhbCA9ICR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLUVPRgotCSAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIDs7Ci0gICAgICAgICAgICAgIC8qKSBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgOzsKLSAgICAgICAgICAgICAgLyopIGVjaG8gdGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIHRhcmdldF9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSA7OwotICAgICAgICAgICAgICAvKikgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKSAgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBpZiBbICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iICE9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgZWNobyBzaXRlX21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke3NpdGVfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfQotICAgICAgICAgICAgZmkgCi0KLQkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBidWlsZCBzaGFyZWQgbGlicy4KLQkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfc2hhcmVkfSI7IHRoZW4KLQkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9IG5vID4+ICR7TWFrZWZpbGV9Ci0JICAgIGVsc2UKLQkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9ICR7ZW5hYmxlX3NoYXJlZH0gPj4gJHtNYWtlZmlsZX0KLQkgICAgZmkKLQkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBydW10aW1lIGxpYnJhcnkgc3R1ZmYgaW5zdGFsbGVkIGluIGxpYnN1YmRpci4KLQkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9IjsgdGhlbgotCSAgICAgICAgZWNobyBlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMgPSBubyA+PiAke01ha2VmaWxlfQotCSAgICBlbHNlCi0JICAgICAgICBlY2hvIGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyA9ICR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSA+PiAke01ha2VmaWxlfQotCSAgICBmaQotCi0JICAgICMgRW1pdCBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgZmlsZSBjb250YWluaW5nIGdjYydzCi0JICAgICMgdmVyc2lvbiBudW1iZXIuCi0JICAgIGVjaG8gZ2NjX3ZlcnNpb25fdHJpZ2dlciA9ICR7Z2NjX3ZlcnNpb25fdHJpZ2dlcn0gPj4gJHtNYWtlZmlsZX0KLQkgICAgIyBBbmQgZW1pdCBhIG1hY3JvIGRlZmluaW5nIGdjYydzIHZlcnNpb24gbnVtYmVyLgotCSAgICBlY2hvIGdjY192ZXJzaW9uID0gJHtnY2NfdmVyc2lvbn0gPj4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyByZXNldCBwcmVmaXgsIGV4ZWNfcHJlZml4LCBzcmNkaXIsIFNVQkRJUlMsIE5PTlNVQkRJUlMsCi0gICAgICAgICAgICAjIHJlbW92ZSBhbnkgZm9ybSBmZWVkcy4KLSAgICAgICAgICAgIGlmIFsgLXogIiR7c3ViZGlyc30iIF07IHRoZW4KLSAgICAgICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudG0yCi0gICAgICAgICAgICAgICAgc2VkIC1lICJzOl5TVUJESVJTWyAJXSo9LiokOlNVQkRJUlMgPSAke2NvbmZpZ2RpcnN9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpeTk9OU1VCRElSU1sgCV0qPS4qJDpOT05TVUJESVJTID0gJHtub2NvbmZpZ2RpcnN9OiIgXAotICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRtMgotICAgICAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudG0yICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLQkgICAgZmkKLQkgICAgc2VkICAgICAtZSAic3xecHJlZml4WyAJXSo9LiokfHByZWZpeCA9ICR7cHJlZml4fXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmV4ZWNfcHJlZml4WyAJXSo9LiokfGV4ZWNfcHJlZml4ID0gJHtleGVjX3ByZWZpeH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5iaW5kaXJbIAldKj0uKiR8YmluZGlyID0gJHtiaW5kaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec2JpbmRpclsgCV0qPS4qJHxzYmluZGlyID0gJHtzYmluZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmxpYmV4ZWNkaXJbIAldKj0uKiR8bGliZXhlY2RpciA9ICR7bGliZXhlY2Rpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5kYXRhZGlyWyAJXSo9LiokfGRhdGFkaXIgPSAke2RhdGFkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec3lzY29uZmRpclsgCV0qPS4qJHxzeXNjb25mZGlyID0gJHtzeXNjb25mZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnNoYXJlZHN0YXRlZGlyWyAJXSo9LiokfHNoYXJlZHN0YXRlZGlyID0gJHtzaGFyZWRzdGF0ZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5sb2NhbHN0YXRlZGlyWyAJXSo9LiokfGxvY2Fsc3RhdGVkaXIgPSAke2xvY2Fsc3RhdGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebGliZGlyWyAJXSo9LiokfGxpYmRpciA9ICR7bGliZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmluY2x1ZGVkaXJbIAldKj0uKiR8aW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5vbGRpbmNsdWRlZGlyWyAJXSo9LiokfG9sZGluY2x1ZGVkaXIgPSAke29sZGluY2x1ZGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeaW5mb2RpclsgCV0qPS4qJHxpbmZvZGlyID0gJHtpbmZvZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8Xm1hbmRpclsgCV0qPS4qJHxtYW5kaXIgPSAke21hbmRpcn18IiBcCi0JCSAgICAtZSAiL15DQ1sgCV0qPS97Ci0JCQk6bG9vcDEKLQkJCS9cXFxcJC8gTgotCQkJcy9cXFxcXFxuLy9nCi0JCQl0IGxvb3AxCi0JCQlzJV5DQ1sgCV0qPS4qJCVDQyA9ICR7Q0N9JQotCQkJfSIgXAotCQkgICAgLWUgIi9eQ1hYWyAJXSo9L3sKLQkJCTpsb29wMgotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDIKLQkJCXMlXkNYWFsgCV0qPS4qJCVDWFggPSAke0NYWH0lCi0JCQl9IiBcCi0JCSAgICAtZSAiL15DRkxBR1NbIAldKj0vewotCQkJOmxvb3AzCi0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wMwotCQkJcyVeQ0ZMQUdTWyAJXSo9LiokJUNGTEFHUyA9ICR7Q0ZMQUdTfSUKLQkJCX0iIFwKLQkJICAgIC1lICIvXkNYWEZMQUdTWyAJXSo9L3sKLQkJCTpsb29wNAotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDQKLQkJCXMlXkNYWEZMQUdTWyAJXSo9LiokJUNYWEZMQUdTID0gJHtDWFhGTEFHU30lCi0JCQl9IiBcCi0JCSAgICAtZSAic3xeU0hFTExbCSBdKj0uKiR8U0hFTEwgPSAke2NvbmZpZ19zaGVsbH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zcmNkaXJbIAldKj0uKiR8c3JjZGlyID0gJHttYWtlc3JjZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInMvDC8vIiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5wcm9ncmFtX3ByZWZpeFsgCV0qPS4qJDpwcm9ncmFtX3ByZWZpeCA9ICR7cHJvZ3JhbV9wcmVmaXh9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpecHJvZ3JhbV9zdWZmaXhbIAldKj0uKiQ6cHJvZ3JhbV9zdWZmaXggPSAke3Byb2dyYW1fc3VmZml4fToiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInM6XnByb2dyYW1fdHJhbnNmb3JtX25hbWVbIAldKj0uKiQ6cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX06IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF50b29sZGlyWyAJXSo9LiokfHRvb2xkaXIgPSAke3Rvb2xkaXJ9fCIgXAotCQkgICAgLWUgInM6XkRFRkFVTFRfWUFDQ1sJIF0qPS4qJDpERUZBVUxUX1lBQ0MgPSAke0RFRkFVTFRfWUFDQ306IiBcCi0JCSAgICAtZSAiczpeREVGQVVMVF9MRVhbCSBdKj0uKiQ6REVGQVVMVF9MRVggPSAke0RFRkFVTFRfTEVYfToiIFwKLQkJICAgIC1lICJzOl5ERUZBVUxUX000WyAgXSo9LiokOkRFRkFVTFRfTTQgPSAke0RFRkFVTFRfTTR9OiIgXAotICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4+ICR7TWFrZWZpbGV9Ci0gIAotCi0JICAgICMgSWYgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzLCBwcmVzZXQgdGhlIHZhbHVlcyBvZiBtYW55IG1vcmUKLQkgICAgIyB0b29scy4KLQkgICAgaWYgWyAiJHtidWlsZH0iICE9ICIke2hvc3R9IiBdOyB0aGVuCi0JCWZvciB2YXIgaW4gJHt0b29sc307IGRvCi0JCSAgICB2YWw9YGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAKLQkJICAgIHNlZCAtZSAiL14ke3Zhcn1bIAldKj0vewotCQkJICAgOmxvb3AxCi0JCQkgICAvXFxcXCQvIE4KLQkJCSAgIC9cXFxcJC8gYiBsb29wMQotCQkJICAgcy9cXFxcXFxuLy9nCi0JCQkgICBzJV4ke3Zhcn1bIAldKj0uKiQlJHt2YXJ9ID0gJHt2YWx9JQotCQkJICAgfSIgJHtNYWtlZmlsZX0gPiAke01ha2VmaWxlfS50ZW0KLQkJICAgIG12IC1mICR7TWFrZWZpbGV9LnRlbSAke01ha2VmaWxlfQotCQlkb25lCi0JICAgIGZpCi0KLSAgICAgICAgICAgICMgZmluYWwgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGVjaG8gIk5vIE1ha2VmaWxlLmluIGZvdW5kIGluICR7c3JjZGlyfS8ke3N1YmRpcn0sIHVuYWJsZSB0byBjb25maWd1cmUiIDE+JjIKLSAgICAgICAgZmkKLQotICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0KLSAgICAgICAgY2FzZSAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgdXNpbmc9IDs7Ci0gICAgICAgICopIHVzaW5nPSJhbmQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgOzsKLSAgICAgICAgKikgdXNpbmc9IiR7dXNpbmd9IGFuZCBcIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBjYXNlICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICIiKSA7OwotICAgICAgICAqKSB1c2luZz0iJHt1c2luZ30gYW5kIFwiJHtzaXRlX21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBuZXd1c2luZz1gZWNobyAiJHt1c2luZ30iIHwgc2VkICdzL2FuZC91c2luZy8nYAotICAgICAgICB1c2luZz0ke25ld3VzaW5nfQotICAgICAgICBlY2hvICJDcmVhdGVkIFwiJHtNYWtlZmlsZX1cIiBpbiIgJHtQV0Q9YHB3ZGB9ICR7dXNpbmd9Ci0KLSAgICAgICAgLiAke3RtcGZpbGV9LnBvcwotCi0gICAgICAgICMgZGVzY3JpYmUgdGhlIGNob3NlbiBjb25maWd1cmF0aW9uIGluIGNvbmZpZy5zdGF0dXMuCi0gICAgICAgICMgTWFrZSB0aGF0IGZpbGUgYSBzaGVsbHNjcmlwdCB3aGljaCB3aWxsIHJlZXN0YWJsaXNoCi0gICAgICAgICMgdGhlIHNhbWUgY29uZmlndXJhdGlvbi4gIFVzZWQgaW4gTWFrZWZpbGVzIHRvIHJlYnVpbGQKLSAgICAgICAgIyBNYWtlZmlsZXMuCi0KLSAgICAgICAgY2FzZSAiJHtub3JlY3Vyc2lvbn0iIGluCi0gICAgICAgICIiKSBhcmd1bWVudHM9IiR7YXJndW1lbnRzfSAtLW5vcmVjdXJzaW9uIiA7OwotICAgICAgICAqKSA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgaWYgWyAke3N1YmRpcn0gPSAuIF0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKLSMgJHtOT19FRElUfQotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotJHtwcm9nbmFtZX0iICR7YXJndW1lbnRzfSAgIgotIyAke3VzaW5nfSIgPiAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKLSMgJHtOT19FRElUfQotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotY2QgJHtpbnZzdWJkaXJ9Ci0ke3Byb2duYW1lfSIgJHthcmd1bWVudHN9ICAiCi0jICR7dXNpbmd9IiA+ICR7c3ViZGlyfS9jb25maWcubmV3Ci0gICAgICAgIGZpCi0gICAgICAgIGNobW9kIGEreCAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuYmFjayBdIDsgdGhlbgotICAgICAgICAgICAgICAgIG12IC1mICR7c3ViZGlyfS9jb25maWcuYmFjayAke3N1YmRpcn0vY29uZmlnLnN0YXR1cwotICAgICAgICBmaQotCSR7Y29uZmlnX3NoZWxsfSAke21vdmVpZmNoYW5nZX0gJHtzdWJkaXJ9L2NvbmZpZy5uZXcgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMKLSAgICAgICAgOzsKLQotICAgICopICBybSAtZiAke01ha2VmaWxlfSAke3N1YmRpcn0vY29uZmlnLnN0YXR1cyAke2xpbmtzfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBJZiB0aGVyZSBhcmUgc3ViZGlyZWN0b3JpZXMsIHRoZW4gcmVjdXIuCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke2NvbmZpZ2RpcnN9IiBdIDsgdGhlbiAKLSAgICAgICAgZm9yIGNvbmZpZ2RpciBpbiAke2NvbmZpZ2RpcnN9ICR7ZXh0cmFjb25maWdkaXJzfSA7IGRvCi0KLQkJIyBJZiBjb25maWdkaXIgY29udGFpbnMgJywnIGl0IGlzCi0JCSMgc3JjZGlyLGJ1aWxkZGlyLHRhcmdldF9hbGlhcwotCQkjIFRoZXNlIGNvbWUgZnJvbSBleHRyYWNvbmZpZ2RpcnMuCi0JCWNhc2UgJHtjb25maWdkaXJ9IGluCi0JCSosKikKLQkJICAgIGV2YWwgYGVjaG8gJHtjb25maWdkaXJ9IHwgc2VkIC1lICdzL1woW14sXSpcKSxcKFteLF0qXCksXCguKlwpL2NmZ19kaXI9XDEgYmxkX2Rpcj1cMiB0Z3RfYWxpYXM9XDMvJ2AKLQkJICAgIDs7Ci0JCSopCi0JCSAgICBjZmdfZGlyPSR7Y29uZmlnZGlyfQotCQkgICAgYmxkX2Rpcj0ke2NvbmZpZ2Rpcn0KLQkJICAgIHRndF9hbGlhcz0ke3RhcmdldF9hbGlhc30KLQkJICAgIDs7Ci0JCWVzYWMKLQotICAgICAgICAgICAgICAgIGlmIFsgLWQgJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwgZWNobyBDb25maWd1cmluZyAke2NvbmZpZ2Rpcn0uLi4gJHtyZWRpcmVjdH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICIuIikgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZCAuLyR7YmxkX2Rpcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBta2RpciAuLyR7YmxkX2Rpcn0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke2JsZF9kaXJ9IiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICAgICAgICAgICAgICBQT1BESVI9JHtQV0Q9YHB3ZGB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZCAke2JsZF9kaXJ9IAotCi0jIyMgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggc3JjZGlyCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAiLiIpIG5ld3NyY2Rpcj0ke3NyY2Rpcn0gOzsgIyBubyAtc3JjZGlyIG9wdGlvbi4gIFdlJ3JlIGJ1aWxkaW5nIGluIHBsYWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICA/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9Li4vJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0KLQkJCSMgSGFuZGxlIC0tY2FjaGUtZmlsZT0uLi9YWFgKLQkJCWNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCi0JCQkiIikgIyBlbXB0eQotCQkJCTs7Ci0JCQkvKikgIyBhYnNvbHV0ZSBwYXRoCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQk/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgotCQkJCWNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIKLQkJCQk7OwotCQkJKikgIyByZWxhdGl2ZSBwYXRoCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0uLi8ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQllc2FjCi0KLSMjIyBjaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUsIG90aGVyd2lzZSBmaXggcG9zc2libHkgcmVsYXRpdmUgcHJvZ25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNwcm9nPSR7bmV3c3JjZGlyfS9jb25maWd1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgWyAtZiAke25ld3NyY2Rpcn0vY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7cHJvZ25hbWV9IiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKikgICAgIHJlY3Byb2c9JHtwcm9nbmFtZX0gOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzoqKSAgICByZWNwcm9nPSR7cHJvZ25hbWV9IDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopICAgICAgcmVjcHJvZz0uLi8ke3Byb2duYW1lfSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0JCQllbHNlCi0JCQkJZXZhbCBlY2hvIE5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gJHtjZmdfZGlyfSAke3JlZGlyZWN0fQotCQkJCXJlY3Byb2c9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaQotCi0jIyMgVGhlIHJlY3Vyc2lvbiBsaW5lIGlzIGhlcmUuCi0JCQlpZiBbICEgLXogIiR7cmVjcHJvZ30iIF0gOyB0aGVuCi0JICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXZhbCAke2NvbmZpZ19zaGVsbH0gJHtyZWNwcm9nfSAke3ZlcmJvc2V9ICR7YnVpbGRvcHR9IC0taG9zdD0ke2hvc3RfYWxpYXN9IC0tdGFyZ2V0PSR7dGd0X2FsaWFzfSBcCi0gICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAke3ByZWZpeG9wdGlvbn0gJHt0bXBkaXJvcHRpb259ICR7ZXhlY19wcmVmaXhvcHRpb259IFwKLSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9ICR7cHJvZ3JhbV9wcmVmaXhvcHRpb259ICR7cHJvZ3JhbV9zdWZmaXhvcHRpb259ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gJHtzaXRlX29wdGlvbn0gJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gJHtlbmFibGVvcHRpb25zfSAke2Rpc2FibGVvcHRpb25zfSAke2Zsb2F0aW5nX3BvaW50b3B0aW9ufSAke2NhY2hlX2ZpbGVfb3B0aW9ufSAke3JlbW92aW5nfSAke290aGVyX29wdGlvbnN9ICR7cmVkaXJlY3R9IDsgdGhlbgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UKLQkJCQkJZWNobyBDb25maWd1cmUgaW4gYHB3ZGAgZmFpbGVkLCBleGl0aW5nLiAxPiYyCi0gICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIAlmaQotCQkJZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2QgJHtQT1BESVJ9Ci0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotZmkKLQotIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKLSMgYW5kIHJlc2V0IHRoZSB0cmFwIGhhbmRsZXIuCi1ybSAtZiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcwotdHJhcCAwCi0KLWV4aXQgMAotCi0jCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgZmlsbC1jb2x1bW46IDEzMQotIyBFbmQ6Ci0jCi0KLSMgZW5kIG9mIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTIyMWE2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExOTEgKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCi0jIyBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKLSMjIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKLSMjIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LiAgCi0KLSMjIEJlIHdhcm5lZCwgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjb25maWd1cmUuaW4gZmlsZXMuICBUaGVyZSBhcmUgdGhvc2UKLSMjIHVzZWQgYnkgQXV0b2NvbmYsIHdoaWNoIGFyZSBtYWNyb3Mgd2hpY2ggYXJlIGV4cGFuZGVkIGludG8gYSBjb25maWd1cmUKLSMjIHNjcmlwdCBieSBhdXRvY29uZi4gIFRoZSBvdGhlciBzb3J0LCBvZiB3aGljaCB0aGlzIGlzIG9uZSwgaXMgZXhlY3V0ZWQKLSMjIGJ5IEN5Z251cyBjb25maWd1cmUuICAKLQotIyMgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgdHdvIHN5c3RlbXMsIGNoZWNrIG91dCB0aGUgZG9jdW1lbnRhdGlvbgotIyMgZm9yICdBdXRvY29uZicgKGF1dG9jb25mLnRleGkpIGFuZCAnQ29uZmlndXJlJyAoY29uZmlndXJlLnRleGkpLiAgCi0KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyBUbyBhZGQgYSBuZXcgZGlyZWN0b3J5IHRvIHRoZSB0cmVlLCBmaXJzdCBjaG9vc2Ugd2hldGhlciBpdCBpcyBhIHRhcmdldAotIyMjIG9yIGEgaG9zdCBkZXBlbmRlbnQgdG9vbC4gIFRoZW4gcHV0IGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QKLSMjIyAobGlicmFyeSBvciB0b29scywgaG9zdCBvciB0YXJnZXQpLCBkb2luZyBhIGRlcGVuZGVuY3kgc29ydC4gIEZvcgotIyMjIGV4YW1wbGUsIGdkYiByZXF1aXJlcyB0aGF0IGJ5YWNjIChvciBiaXNvbikgYmUgYnVpbHQgZmlyc3QsIHNvIGl0IGlzIGluCi0jIyMgdGhlICR7aG9zdF90b29sc30gbGlzdCBhZnRlciBieWFjYyBhbmQgYmlzb24uICAKLQotCi0jIHRoZXNlIGxpYnJhcmllcyBhcmUgdXNlZCBieSB2YXJpb3VzIHByb2dyYW1zIGJ1aWx0IGZvciB0aGUgaG9zdCBlbnZpcm9ubWVudAotIwotaG9zdF9saWJzPSJpbnRsIG1tYWxsb2MgbGliaWJlcnR5IG9wY29kZXMgYmZkIHJlYWRsaW5lIGdhc2ggZGIgdGNsIHRrIHRjbDguMSB0azguMSB0Y2xYIGl0Y2wgdGl4IGxpYmd1aSIKLQotaWYgWyAiJHtlbmFibGVfZ2RiZ3VpfSIgPSAieWVzIiBdIDsgdGhlbgotCWhvc3RfbGlicz0iJHtob3N0X2xpYnN9IGxpYmd1aSIKLWZpCi0KLSMgdGhlc2UgdG9vbHMgYXJlIGJ1aWx0IGZvciB0aGUgaG9zdCBlbnZpcm9ubWVudAotIyBOb3RlLCB0aGUgcG93ZXJwYy1lYWJpIGJ1aWxkIGRlcGVuZHMgb24gc2ltIG9jY3VycmluZyBiZWZvcmUgZ2RiIGluIG9yZGVyIHRvCi0jIGtub3cgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgdGhlIHNpbXVsYXRvci4KLWhvc3RfdG9vbHM9InRleGluZm8gYnlhY2MgZmxleCBiaXNvbiBiaW51dGlscyBsZCBnYXMgZ2NjIHNpbSBnZGIgbWFrZSBwYXRjaCBwcm1zIHNlbmQtcHIgZ3Byb2YgZ2RidGVzdCB0Z2FzIGV0YyBleHBlY3QgZGVqYWdudSBhc2ggYmFzaCBiemlwMiBtNCBhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sIGlzcGVsbCBncmVwIGRpZmYgcmNzIGN2c3NyYyBmaWxldXRpbHMgc2hlbGx1dGlscyB0aW1lIHRleHR1dGlscyB3ZGlmZiBmaW5kIGVtYWNzIGVtYWNzMTkgdXVkZWNvZGUgaGVsbG8gdGFyIGd6aXAgaW5kZW50IHJlY29kZSByZWxlYXNlIHNlZCB1dGlscyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGdhd2sgZmluZHV0aWxzIHNuYXZpZ2F0b3IgbGlidG9vbCBnZXR0ZXh0IHppcCIKLQotIyB0aGVzZSBsaWJyYXJpZXMgYXJlIGJ1aWx0IGZvciB0aGUgdGFyZ2V0IGVudmlyb25tZW50LCBhbmQgYXJlIGJ1aWx0IGFmdGVyCi0jIHRoZSBob3N0IGxpYnJhcmllcyBhbmQgdGhlIGhvc3QgdG9vbHMgKHdoaWNoIG1heSBiZSBhIGNyb3NzIGNvbXBpbGVyKQotIwotdGFyZ2V0X2xpYnM9InRhcmdldC1saWJpYmVydHkgXAotCQl0YXJnZXQtbGliZ2xvc3MgXAotCQl0YXJnZXQtbmV3bGliIFwKLQkJdGFyZ2V0LWxpYmlvIFwKLQkJdGFyZ2V0LWxpYnJ4IFwKLQkJdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JCXRhcmdldC1saWJnKysiCi0KLSMgdGhlc2UgdG9vbHMgYXJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgbGlicywgYW5kIGFyZSBpbnRlbmRlZCB0byBydW4gb25seQotIyBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50Ci0jCi0jIG5vdGU6IGFueSBwcm9ncmFtIHRoYXQgKnVzZXMqIGxpYnJhcmllcyB0aGF0IGFyZSBpbiB0aGUgInRhcmdldF9saWJzIgotIyBsaXN0IGJlbG9uZ3MgaW4gdGhpcyBsaXN0LiAgdGhvc2UgcHJvZ3JhbXMgYXJlIGFsc28gdmVyeSBsaWtlbHkKLSMgY2FuZGlkYXRlcyBmb3IgdGhlICJuYXRpdmVfb25seSIgbGlzdCB3aGljaCBmb2xsb3dzCi0jCi10YXJnZXRfdG9vbHM9InRhcmdldC1leGFtcGxlcyB0YXJnZXQtZ3JvZmYgdGFyZ2V0LWdwZXJmIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyBUaGVzZSB0d28gbGlzdHMgYXJlIG9mIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSMjICR7Y29uZmlnZGlyc30gbGlzdCBmb3IgZWl0aGVyIGNyb3NzLWNvbXBpbGF0aW9ucyBvciBmb3IgbmF0aXZlLQotIyMgY29tcGlsYXRpb25zLiAgRm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgbWFrZSB0aGF0IG11Y2ggc2Vuc2UgdG8KLSMjIGNyb3NzLWNvbXBpbGUgRW1hY3MsIG5vciBpcyBpdCB0ZXJyaWJseSB1c2VmdWwgdG8gY29tcGlsZSB0YXJnZXQtbGliaWJlcnR5IGluCi0jIyBhIG5hdGl2ZSBlbnZpcm9ubWVudC4gIAotCi0jIGRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGluIHRoZSBuYXRpdmUgZW52aXJvbm1lbnQgb25seQotIwotIyBUaGlzIG11c3QgYmUgYSBzaW5nbGUgbGluZSBiZWNhdXNlIG9mIHRoZSB3YXkgaXQgaXMgc2VhcmNoZWQgYnkgZ3JlcCBpbgotIyB0aGUgY29kZSBiZWxvdy4KLW5hdGl2ZV9vbmx5PSJhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sIGN2c3NyYyBlbWFjcyBlbWFjczE5IGZpbGV1dGlscyBmaW5kIGdhd2sgZ2V0dGV4dCBncmVwIGd6aXAgaGVsbG8gaW5kZW50IGlzcGVsbCBtNCByY3MgcmVjb2RlIHNlZCBzaGVsbHV0aWxzIHRhciB0ZXh0dXRpbHMgZ2FzaCB1dWRlY29kZSB3ZGlmZiBncHJvZiB0YXJnZXQtZ3JvZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCB0aW1lIGFzaCBiYXNoIGJ6aXAyIHBybXMgc25hdmlnYXRvciBnbnVzZXJ2IHRhcmdldC1ncGVyZiIKLQotIyBkaXJlY3RvcmllcyB0byBiZSBidWlsdCBpbiBhIGNyb3NzIGVudmlyb25tZW50IG9ubHkKLSMKLWNyb3NzX29ubHk9InRhcmdldC1saWJnbG9zcyB0YXJnZXQtbmV3bGliIHRhcmdldC1jeWdtb24gdGFyZ2V0LW9wY29kZXMgdGFyZ2V0LWxpYnN0dWIiCi0KLSMjIEFsbCB0b29scyBiZWxvbmcgaW4gb25lIG9mIHRoZSBmb3VyIGNhdGVnb3JpZXMsIGFuZCBhcmUgYXNzaWduZWQgYWJvdmUKLSMjIFdlIGFzc2lnbiAke2NvbmZpZ2RpcnN9IHRoaXMgd2F5IHRvIHJlbW92ZSBhbGwgZW1iZWRkZWQgbmV3bGluZXMuICBUaGlzCi0jIyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBjb25maWd1cmUgd2lsbCBjaG9rZSBpZiB0aGV5IGV2ZXIgZ2V0IHRocm91Z2guCi0jIyAke2NvbmZpZ2RpcnN9IGlzIGRpcmVjdG9yaWVzIHdlIGJ1aWxkIHVzaW5nIHRoZSBob3N0IHRvb2xzLgotIyMgJHt0YXJnZXRfY29uZmlnZGlyc30gaXMgZGlyZWN0b3JpZXMgd2UgYnVpbGQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLSMKLWNvbmZpZ2RpcnM9YGVjaG8gJHtob3N0X2xpYnN9ICR7aG9zdF90b29sc31gCi10YXJnZXRfY29uZmlnZGlycz1gZWNobyAke3RhcmdldF9saWJzfSAke3RhcmdldF90b29sc31gCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXNyY3RyaWdnZXI9bW92ZS1pZi1jaGFuZ2UKLXNyY25hbWU9ImdudSBkZXZlbG9wbWVudCBwYWNrYWdlIgotCi0jIFRoaXMgZ2V0cyBzZXQgbm9uLWVtcHR5IGZvciBzb21lIG5ldCByZWxlYXNlcyBvZiBwYWNrYWdlcy4KLWFwcGRpcnM9IiIKLQotIyBwZXItaG9zdDoKLQotIyBXb3JrIGluIGRpc3RyaWJ1dGlvbnMgdGhhdCBjb250YWluIG5vIGNvbXBpbGVyIHRvb2xzLCBsaWtlIEF1dG9jb25mLgotaWYgWyAtZCAke3NyY2Rpcn0vY29uZmlnIF07IHRoZW4KLWNhc2UgIiR7aG9zdH0iIGluCi0gIG02OGstaHAtaHB1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwMzAwIgotICAgIDs7Ci0gIG02OGstYXBvbGxvLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hcG9sbG82OCIKLSAgICA7OwotICBtNjhrLWFwb2xsby1ic2QqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hNjhic2QiCi0gICAgOzsKLSAgbTg4ay1kZy1kZ3V4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGd1eCIKLSAgICA7OwotICBtODhrLWhhcnJpcy1jeHV4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtY3h1eCIKLSAgICA7OwotICBtODhrLW1vdG9yb2xhLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZWx0YTg4IgotICAgIDs7Ci0gIG1pcHMqLWRlYy11bHRyaXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZWNzdGF0aW9uIgotICAgIDs7Ci0gIG1pcHMqLW5lYy1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5lY3Y0IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg2IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg1IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg0IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4MyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gIG1pcHMqLSotc3lzdiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXJpc2NvcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y1IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWRndXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZ3V4Mzg2IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1uY3Itc3lzdjQuMyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5jcnN2cjQzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1uY3Itc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uY3IzMDAwIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zY28iCi0gICAgOzsKLSAgaVszNDU2XTg2LSotdWRrKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjUiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotaXNjKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zb2xhcmlzMiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFpeCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFpeDM4NiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGpncHAiCi0gICAgOzsKLSAgKi1jeWd3aW4qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1jeWd3aW4iCi0gICAgOzsKLSAgKi1taW5ndzMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbWluZ3czMiIKLSAgICA7OwotICAqLWludGVyaXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pbnRlcml4IgotICAgIDs7Ci0gICotd2luZG93cyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXdpbmRvd3MiCi0gICAgOzsKLSAgdmF4LSotdWx0cml4MiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXZheHVsdDIiCi0gICAgOzsKLSAgKi0qLXNvbGFyaXMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc29sYXJpcyIKLSAgICA7OwotICBtNjhrLXN1bi1zdW5vcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN1bjMiCi0gICAgOzsKLSAgKi1ocC1ocHV4Wzc4XSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXg4IgotICAgIDs7Ci0gICotaHAtaHB1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXgiCi0gICAgOzsKLSAgKi0qLWhpdXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4IgotICAgIDs7Ci0gIHJzNjAwMC0qLWx5bnhvcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWx5bnhyczZrIgotICAgIDs7Ci0gICotKi1seW54b3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1seW54b3MiCi0gICAgOzsKLSAgKi0qLWFpeDQuWzM0NTY3ODldKiB8ICotKi1haXhbNTY3ODldLiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFpeDQzIgotICAgIDs7Ci0gICotKi1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gICotKi1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotZXNhYwotZmkKLQotIyBJZiB3ZSBhcmVuJ3QgZ29pbmcgdG8gYmUgdXNpbmcgZ2NjLCBzZWUgaWYgd2UgY2FuIGV4dHJhY3QgYSBkZWZpbml0aW9uCi0jIG9mIENDIGZyb20gdGhlIGZyYWdtZW50LgotaWYgWyAteiAiJHtDQ30iIF0gJiYgWyAiJHtidWlsZH0iID0gIiR7aG9zdH0iIF07IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm91bmQ9Ci0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0gICAgICBmb3VuZD15ZXMKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLSAgaWYgWyAteiAiJHtmb3VuZH0iIF0gJiYgWyAtbiAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdICYmIFsgLWYgIiR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30iIF07IHRoZW4KLSAgICB4eD1gc2VkIC1uIC1lICdzL15bIAldKkNDWyAJXSo9WyAJXSpcKC4qXCkkL1wxL3AnIDwgJHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfWAKLSAgICBpZiBbIC1uICIke3h4fSIgXSA7IHRoZW4KLSAgICAgIENDPSR4eAotICAgIGZpCi0gIGZpCi1maQotCi0jIFdlIGRlZmF1bHQgdG8gLS13aXRoLXNoYXJlZCBvbiBwbGF0Zm9ybXMgd2hlcmUgLWZwaWMgaXMgbWVhbmluZ2xlc3MuCi0jIFdlbGwsIHdlIGRvbid0IHlldCwgYnV0IHdlIHdpbGwuCi1pZiBmYWxzZSAmJiBbICIke2hvc3R9IiA9ICIke3RhcmdldH0iIF0gJiYgWyB4JHtlbmFibGVfc2hhcmVkfSA9IHggXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gICAgYWxwaGEqLWRlYy1vc2YqKQllbmFibGVfc2hhcmVkPXllcyA7OwotICAgIGFscGhhKi0qLWxpbnV4KikJZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBtaXBzLXNnaS1pcml4NSopCWVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgKikJCQllbmFibGVfc2hhcmVkPW5vIDs7Ci0gIGVzYWMKLWZpCi0KLWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0gIHllcykgc2hhcmVkPXllcyA7OwotICBubykgc2hhcmVkPW5vIDs7Ci0gICIiKSBzaGFyZWQ9bm8gOzsKLSAgKikgc2hhcmVkPXllcyA7OwotZXNhYwotCi1pZiBbIHgke3NoYXJlZH0gPSB4eWVzIF07IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICBhbHBoYSotKi1saW51eCopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZWxmYWxwaGFwaWMiCi0gICAgICA7OwotICAgIGFybSotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFybXBpYyIKLSAgICAgIDs7Ci0gICAgaHBwYSotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXBhcGljIgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKi1jeWd3aW4qKQotICAgICAgIyBXZSBkb24ndCB3YW50IC1mUElDIG9uIEN5Z3dpbi4KLSAgICAgIDs7Ci0gICAgaVszNDU2XTg2LSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC14ODZwaWMiCi0gICAgICA7OwotICAgIHNwYXJjNjQtKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXNwYXJjcGljIgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLWFpeCopCi0gICAgICAjIFdlIGRvbid0IHdhbnQgLWZQSUMgb24gQUlYLgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtcHBjcGljIgotICAgICAgOzsKLSAgICAqLSotKikKLSAgICAgIGlmIHRlc3QgLWYgJHtzcmNkaXJ9L2NvbmZpZy9taC0ke2hvc3RfY3B1fXBpYzsgdGhlbgotICAgICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtJHtob3N0X2NwdX1waWMiCi0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotZmkKLQotcm0gLWYgbWgtZnJhZwotaWYgWyAtbiAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdIDsgdGhlbgotICBmb3IgZiBpbiAke2hvc3RfbWFrZWZpbGVfZnJhZ30KLSAgZG8KLSAgICBjYXQgJHtzcmNkaXJ9LyRmID4+IG1oLWZyYWcKLSAgZG9uZQotICBob3N0X21ha2VmaWxlX2ZyYWc9bWgtZnJhZwotZmkKLQotIyBwZXItdGFyZ2V0OgotCi1jYXNlICIke3RhcmdldH0iIGluCi0gIHY4MTAqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtdjgxMCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXR3YXJlKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW5ldHdhcmUiCi0gICAgOzsKLSAgcG93ZXJwYy0qLW5ldHdhcmUqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbmV0d2FyZSIKLSAgICA7OwotICAqLSotbGludXgtZ251KQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbGludXgiCi0gICAgOzsKLWVzYWMKLQotIyBJZiAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UgYWx3YXlzIHVzZSAtT3MgaW5zdGVhZCBvZiAtTzIgdG8gYnVpbGQKLSMgdGhlIHRhcmdldCBsaWJyYXJpZXMsIHNpbWlsYXJseSBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgLU9zCi0jIG9uIHNlbGVjdGVkIHBsYXRmb3Jtcy4KLWNhc2UgIiR7ZW5hYmxlX3RhcmdldF9vcHRzcGFjZX06JHt0YXJnZXR9IiBpbgotICB5ZXM6KikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW9zcGFjZSIKLSAgICA7OwotICAjIENZR05VUyBMT0NBTCBkMTB2LCBkMzB2LCBmcjMwCi0gIDpkMzB2LSopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1kMzB2IgotICAgIDs7Ci0gIDptMzJyLSogfCA6ZDEwdi0qIHwgOmZyMzAtKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW9zcGFjZSIKLSAgICA7OwotICBubzoqIHwgOiopCi0gICAgOzsKLSAgKikKLSAgICBlY2hvICIqKiogYmFkIHZhbHVlIFwiJHtlbmFibGVfdGFyZ2V0X29wdHNwYWNlfVwiIGZvciAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UgZmxhZzsgaWdub3JlZCIgMT4mMgotICAgIDs7Ci1lc2FjCi0KLXNraXBkaXJzPQotZ2FzZGlyPWdhcwotdXNlX2dudV9sZD0KLXVzZV9nbnVfYXM9Ci0KLSMgc29tZSB0b29scyBhcmUgc28gZGVwZW5kZW50IHVwb24gWDExIHRoYXQgaWYgd2UncmUgbm90IGJ1aWxkaW5nIHdpdGggWCwgCi0jIGl0J3Mgbm90IGV2ZW4gd29ydGggdHJ5aW5nIHRvIGNvbmZpZ3VyZSwgbXVjaCBsZXNzIGJ1aWxkLCB0aGF0IHRvb2wuCi0KLWNhc2UgJHt3aXRoX3h9IGluCi0gIHllcyB8ICIiKSAgIyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyB0cmVlIGlzIHRoYXQgWDExIGlzIGF2YWlsYWJsZQotCTs7Ci0gIG5vKQotCXNraXBkaXJzPSIke3NraXBkaXJzfSB0ayBsaWJndWkgZ2FzaCIKLQk7OwotICAqKQotICAgIAllY2hvICIqKiogYmFkIHZhbHVlIFwiJHt3aXRoX3h9XCIgZm9yIC13aXRoLXggZmxhZzsgaWdub3JlZCIgMT4mMgotICAgIAk7OwotZXNhYwotCi0jIFNvbWUgdG9vbHMgYXJlIG9ubHkgc3VpdGFibGUgZm9yIGJ1aWxkaW5nIGluIGEgIm5hdGl2ZSIgc2l0dWF0aW9uLgotIyBUaG9zZSBhcmUgYWRkZWQgd2hlbiB3ZSBoYXZlIGEgaG9zdD09dGFyZ2V0IGNvbmZpZ3VyYXRpb24uICBGb3IgY3Jvc3MKLSMgdG9vbGNoYWlucywgd2UgYWRkIHNvbWUgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgb25seSBiZSB1c2VmdWwgaW4gYQotIyBjcm9zcy1jb21waWxlci4KLQotaXNfY3Jvc3NfY29tcGlsZXI9Ci0KLWlmIFsgeCIke2hvc3R9IiA9IHgiJHt0YXJnZXR9IiBdIDsgdGhlbgotCSMgd2hlbiBkb2luZyBhIG5hdGl2ZSB0b29sY2hhaW4sIGRvbid0IGJ1aWxkIHRoZSB0YXJnZXRzCi0JIyB0aGF0IGFyZSBpbiB0aGUgJ2Nyb3NzIG9ubHknIGxpc3QKLQlza2lwZGlycz0iJHtza2lwZGlyc30gJHtjcm9zc19vbmx5fSIKLQlpc19jcm9zc19jb21waWxlcj1ubwotZWxzZQotCSMgc2ltaWxhcmx5LCBkb24ndCBidWlsZCB0aGUgdGFyZ2V0cyBpbiB0aGUgJ25hdGl2ZSBvbmx5JyAKLQkjIGxpc3Qgd2hlbiBidWlsZGluZyBhIGNyb3NzIGNvbXBpbGVyCi0Jc2tpcGRpcnM9IiR7c2tpcGRpcnN9ICR7bmF0aXZlX29ubHl9IgotCWlzX2Nyb3NzX2NvbXBpbGVyPXllcwotZmkJCi0KLSMgV2UgYWx3YXlzIHdhbnQgdG8gdXNlIHRoZSBzYW1lIG5hbWUgZm9yIHRoaXMgZGlyZWN0b3J5LCBzbyB0aGF0IGRlamFnbnUKLSMgY2FuIHJlbGlhYmx5IGZpbmQgaXQuCi10YXJnZXRfc3ViZGlyPSR7dGFyZ2V0X2FsaWFzfQotCi1pZiBbICEgLWQgJHt0YXJnZXRfc3ViZGlyfSBdIDsgdGhlbgotICBpZiBta2RpciAke3RhcmdldF9zdWJkaXJ9IDsgdGhlbiB0cnVlCi0gIGVsc2UKLSAgICBlY2hvICInKioqIGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke3RhcmdldF9zdWJkaXJ9IiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maQotCi1jb3B5X2RpcnM9Ci0KLSMgSGFuZGxlIC0td2l0aC1oZWFkZXJzPVhYWC4gIFRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgZGlyZWN0b3J5IGFyZQotIyBjb3BpZWQgdG8gJCh0b29sZGlyKS9zeXMtaW5jbHVkZS4KLWlmIFsgeCIke3dpdGhfaGVhZGVyc30iICE9IHggXTsgdGhlbgotICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSA9IHhubyBdOyB0aGVuCi0gICAgZWNobyAxPiYyICcqKionIC0td2l0aC1oZWFkZXJzIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gY3Jvc3MgY29tcGlsaW5nCi0gICAgZXhpdCAxCi0gIGZpCi0gIGNhc2UgIiR7ZXhlY19wcmVmaXhvcHRpb259IiBpbgotICAiIikgeD0ke3ByZWZpeH0gOzsKLSAgKikgeD0ke2V4ZWNfcHJlZml4fSA7OwotICBlc2FjCi0gIGNvcHlfZGlycz0iJHtjb3B5X2RpcnN9ICR7d2l0aF9oZWFkZXJzfSAkeC8ke3RhcmdldF9hbGlhc30vc3lzLWluY2x1ZGUiCi1maQotCi0jIEhhbmRsZSAtLXdpdGgtbGlicz1YWFguICBNdWx0aXBsZSBkaXJlY3RvcmllcyBhcmUgcGVybWl0dGVkLiAgVGhlCi0jIGNvbnRlbnRzIGFyZSBjb3BpZWQgdG8gJCh0b29sZGlyKS9saWIuCi1pZiBbIHgiJHt3aXRoX2xpYnN9IiAhPSB4IF07IHRoZW4KLSAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gPSB4bm8gXTsgdGhlbgotICAgIGVjaG8gMT4mMiAnKioqJyAtLXdpdGgtbGlicyBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIGNyb3NzIGNvbXBpbGluZwotICAgIGV4aXQgMQotICBmaQotICAjIENvcHkgdGhlIGxpYnJhcmllcyBpbiByZXZlcnNlIG9yZGVyLCBzbyB0aGF0IGZpbGVzIGluIHRoZSBmaXJzdCBuYW1lZAotICAjIGxpYnJhcnkgb3ZlcnJpZGUgZmlsZXMgaW4gc3Vic2VxdWVudCBsaWJyYXJpZXMuCi0gIGNhc2UgIiR7ZXhlY19wcmVmaXhvcHRpb259IiBpbgotICAiIikgeD0ke3ByZWZpeH0gOzsKLSAgKikgeD0ke2V4ZWNfcHJlZml4fSA7OwotICBlc2FjCi0gIGZvciBsIGluICR7d2l0aF9saWJzfTsgZG8KLSAgICBjb3B5X2RpcnM9IiRsICR4LyR7dGFyZ2V0X2FsaWFzfS9saWIgJHtjb3B5X2RpcnN9IgotICBkb25lCi1maQotCi0jIElmIGJvdGggLS13aXRoLWhlYWRlcnMgYW5kIC0td2l0aC1saWJzIGFyZSBzcGVjaWZpZWQsIGRlZmF1bHQgdG8KLSMgLS13aXRob3V0LW5ld2xpYi4KLWlmIFsgeCIke3dpdGhfaGVhZGVyc30iICE9IHggXSAmJiBbIHgiJHt3aXRoX2xpYnN9IiAhPSB4IF07IHRoZW4KLSAgaWYgWyB4IiR7d2l0aF9uZXdsaWJ9IiA9IHggXTsgdGhlbgotICAgIHdpdGhfbmV3bGliPW5vCi0gIGZpCi1maQotCi0jIFJlY29nbml6ZSAtLXdpdGgtbmV3bGliLy0td2l0aG91dC1uZXdsaWIuCi1pZiBbIHgke3dpdGhfbmV3bGlifSA9IHhubyBdOyB0aGVuCi0gIHNraXBkaXJzPSIke3NraXBkaXJzfSB0YXJnZXQtbmV3bGliIgotZWxpZiBbIHgke3dpdGhfbmV3bGlifSA9IHh5ZXMgXTsgdGhlbgotICBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIHRhcmdldC1uZXdsaWIgLyAvJ2AKLWZpCi0KLSMgRGVmYXVsdCB0byB1c2luZyAtLXdpdGgtc3RhYnMgZm9yIGNlcnRhaW4gdGFyZ2V0cy4KLWlmIFsgeCR7d2l0aF9zdGFic30gPSB4IF07IHRoZW4KLSAgY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzKi0qLWlyaXg2KikKLSAgICA7OwotICBtaXBzKi0qLSogfCBhbHBoYSotKi1vc2YqKQotICAgIHdpdGhfc3RhYnM9eWVzOwotICAgIHdpdGhvcHRpb25zPSIke3dpdGhvcHRpb25zfSAtLXdpdGgtc3RhYnMiCi0gICAgOzsKLSAgZXNhYwotZmkKLQotIyBIYW5kbGUgJHtjb3B5X2RpcnN9Ci1zZXQgZm5vcmQgJHtjb3B5X2RpcnN9Ci1zaGlmdAotd2hpbGUgWyAkIyAhPSAwIF07IGRvCi0gIGlmIFsgLWYgJDIvQ09QSUVEIF0gJiYgWyB4ImBjYXQgJDIvQ09QSUVEYCIgPSB4IiQxIiBdOyB0aGVuCi0gICAgOgotICBlbHNlCi0gICAgZWNobyBDb3B5aW5nICQxIHRvICQyCi0KLSAgICAjIFVzZSB0aGUgaW5zdGFsbCBzY3JpcHQgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkgYW5kIGFsbCByZXF1aXJlZAotICAgICMgcGFyZW50IGRpcmVjdG9yaWVzLgotICAgIGlmIFsgLWQgJDIgXTsgdGhlbgotICAgICAgOgotICAgIGVsc2UKLSAgICAgIGVjaG8gPmNvbmZpZy50ZW1wCi0gICAgICAke3NyY2Rpcn0vaW5zdGFsbC1zaCAtYyAtbSA2NDQgY29uZmlnLnRlbXAgJDIvQ09QSUVECi0gICAgZmkKLQotICAgICMgQ29weSB0aGUgZGlyZWN0b3J5LCBhc3N1bWluZyB3ZSBoYXZlIHRhci4KLSAgICAjIEZJWE1FOiBTaG91bGQgd2UgdXNlIEIgaW4gdGhlIHNlY29uZCB0YXI/ICBOb3QgYWxsIHN5c3RlbXMgc3VwcG9ydCBpdC4KLSAgICAoY2QgJDE7IHRhciAtY2YgLSAuKSB8IChjZCAkMjsgdGFyIC14cGYgLSkKLQotICAgICMgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGNvcnJlY3RseSBhZGp1c3QgYWxsCi0gICAgIyBzeW1saW5rcy4gIElmIHNvbWVib2R5IGNhbiBmaWd1cmUgb3V0IGhvdyB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkKLSAgICAjIGhlcmUsIGZlZWwgZnJlZSB0byBhZGQgdGhlIGNvZGUuCi0KLSAgICBlY2hvICQxID4gJDIvQ09QSUVECi0gIGZpCi0gIHNoaWZ0OyBzaGlmdAotZG9uZQotCi0jIENvbmZpZ3VyZSBleHRyYSBkaXJlY3RvcmllcyB3aGljaCBhcmUgaG9zdCBzcGVjaWZpYwotCi1jYXNlICIke2hvc3R9IiBpbgotCWlbMzQ1Nl04Ni0qLWdvMzIqKQotCSAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgZG9zcmVsIiA7OwotCWlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotCSAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgZG9zcmVsIiA7OwotCSotY3lnd2luKikKLQkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGxpYnRlcm1jYXAgZG9zcmVsIiA7OwotZXNhYwotCi0jIFJlbW92ZSBtb3JlIHByb2dyYW1zIGZyb20gY29uc2lkZXJhdGlvbiwgYmFzZWQgb24gdGhlIGhvc3Qgb3IgCi0jIHRhcmdldCB0aGlzIHVzdWFsbHkgbWVhbnMgdGhhdCBhIHBvcnQgb2YgdGhlIHByb2dyYW0gZG9lc24ndAotIyBleGlzdCB5ZXQuCi0KLW5vY29uZmlnZGlycz0iIgotCi1jYXNlICIke2hvc3R9IiBpbgotICBpWzM0NTZdODYtKi12c3RhKQotICAgIG5vY29uZmlnZGlycz0idGNsIGV4cGVjdCBkZWphZ251IG1ha2UgdGV4aW5mbyBiaXNvbiBwYXRjaCBmbGV4IGJ5YWNjIHNlbmQtcHIgZ3Byb2YgdXVkZWNvZGUgZGVqYWdudSBkaWZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IGdldHRleHQiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZ28zMiogfCBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikKLSAgICBub2NvbmZpZ2RpcnM9InRjbCB0ayBleHBlY3QgZGVqYWdudSBtYWtlIHRleGluZm8gYmlzb24gcGF0Y2ggZmxleCBieWFjYyBzZW5kLXByIHV1ZGVjb2RlIGRlamFnbnUgZGlmZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiBnZXR0ZXh0IgotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotICAgICMgbm9jb25maWdkaXJzPSJ0Y2wgdGsgZXhwZWN0IGRlamFnbnUgbWFrZSB0ZXhpbmZvIGJpc29uIHBhdGNoIGZsZXggYnlhY2Mgc2VuZC1wciB1dWRlY29kZSBkZWphZ251IGRpZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgIG5vY29uZmlnZGlycz0iZXhwZWN0IGRlamFnbnUgY3ZzIGF1dG9jb25mIGF1dG9tYWtlIHNlbmQtcHIgcmNzIGd1aWxlIHBlcmwgdGV4aW5mbyBhcGFjaGUgaW5ldCBsaWJ0b29sIgotCTs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGsgaXRjbCB0aXggbGliZ3VpIGdkYiIKLSAgICAgOzsKLSAgKi0qLWN5Z3dpbiopCi0gICAgIG5vY29uZmlnZGlycz0iYXV0b2NvbmYgYXV0b21ha2Ugc2VuZC1wciByY3MgZ3VpbGUgcGVybCB0ZXhpbmZvIGFwYWNoZSBpbmV0IgotICAgIDs7Ci0gICotKi1uZXRic2QqKQotICAgIG5vY29uZmlnZGlycz0icmNzIgotICAgIDs7Ci0gIHBwYyotKi1wZSkKLSAgICAgbm9jb25maWdkaXJzPSJwYXRjaCBkaWZmIG1ha2UgdGsgdGNsIGV4cGVjdCBkZWphZ251IGN2c3NyYyBhdXRvY29uZiBhdXRvbWFrZSB0ZXhpbmZvIGJpc29uIHNlbmQtcHIgZ3Byb2YgcmNzIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgIDs7Ci1lc2FjCi0KLQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICAqLSotbmV0d2FyZSkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJyeCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJpYmVydHkgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gICotKi1ydGVtcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICAqLSotdnh3b3JrcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFscGhhKi1kZWMtb3NmKikKLSAgICAjIGxkIHdvcmtzLCBidXQgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLiAgZW1hY3MgZG9lc24ndAotICAgICMgd29yay4gIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5LiAgSSdtIG5vdCBzdXJlIGFib3V0IGZpbGV1dGlscy4KLSAgICAjIGdhcyBkb2Vzbid0IGdlbmVyYXRlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2FzIGxkIGVtYWNzIGZpbGV1dGlscyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhbHBoYSotKi0qdm1zKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIGxkIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4KikKLSAgICAjIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5Ci0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgICMgbGludXggaGFzIHJ4IGluIGxpYmMKLSAgICBza2lwZGlycz0iJHNraXBkaXJzIHRhcmdldC1saWJyeCIKLSAgICA7OwotICBhbHBoYSotKi0qKQotICAgICMgbmV3bGliIGlzIG5vdCA2NCBiaXQgcmVhZHkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJjLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLXBlKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLWNvZmYqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIGFybS0qLWVsZiopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgYXJtLSotb2FiaSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBjNHgtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdGh1bWItKi1jb2ZmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSMgQ1lHTlVTIExPQ0FMIGNsbS9hcm0tZWxmCi0gIHRodW1iLSotZWxmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdGh1bWItKi1vYWJpKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotIyBDWUdOVVMgTE9DQUwgbmlja2Mvc3Ryb25nYXJtCi0gIHN0cm9uZ2FybS0qLWVsZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzdHJvbmdhcm0tKi1jb2ZmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0jIEVORCBDWUdOVVMgTE9DQUwKLSAgdGh1bWItKi1wZSkgIyBDWUdOVVMgTE9DQUwgbmlja2MvdGh1bWIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLXJpc2NpeCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBkMTB2LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8iCi0gICAgOzsKLSMgQ1lHTlVTIExPQ0FMIGQzMHYKLSAgZDMwdi0qLSopCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotIyBDWUdOVVMgTE9DQUwgZnIzMAotICBmcjMwLSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotICBoODMwMCotKi0qIHwgXAotICBoODUwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBocHBhKi0qLSplbGYqIHwgXAotICBocHBhKi0qLWxpbnV4LWdudSogfCBcCi0gIGhwcGEqLSotbGl0ZXMqKQotICAgICMgRG8gY29uZmlndXJlIGxkL2JpbnV0aWxzL2dhcyBmb3IgdGhlIGFib3ZlIGNhc2VzLgotICAgIDs7Ci0gIGhwcGEqLSotKikKLSAgICAjIEhQJ3MgQyBjb21waWxlciBkb2Vzbid0IGhhbmRsZSBFbWFjcyBjb3JyZWN0bHkgKGJ1dCBvbiBCU0QgYW5kIE1hY2gKLSAgICAjIGNjIGlzIGdjYywgYW5kIG9uIGFueSBzeXN0ZW0gYSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGxpbmsgY2MgdG8KLSAgICAjIHdoYXRldmVyIHRoZXkgd2FudC4gIEZJWE1FLCBlbWFjcyBlbWFjczE5KS4KLSAgICBjYXNlICIke0NDfSIgaW4KLQkiIiB8IGNjKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGVtYWNzIGVtYWNzMTkiIDs7Ci0gICAgICAgICopIDs7Ci0gICAgZXNhYwotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBzaGVsbHV0aWxzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWNvZmYgfCBpWzM0NTZdODYtKi1lbGYpCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0gICAgICAgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWdvMzIqIHwgaVszNDU2XS0qLW1zZG9zZGpncHAqKQotICAgICMgYnV0IGRvbid0IGJ1aWxkIGdkYgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyB0YXJnZXQtbGlicngiCi0gICAgOzsKLSAgKi0qLWxpbnV4KikKLSAgICAjIGxpbnV4IGhhcyByeCBpbiBsaWJjCi0gICAgc2tpcGRpcnM9IiRza2lwZGlycyB0YXJnZXQtbGlicngiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbWluZ3czMiopCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtbWluZ3ciCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGV4cGVjdCB0YXJnZXQtbGliZ2xvc3MiCi0KLSAgICAjIENhbid0IGJ1aWxkIGdkYiBmb3IgbWluZ3czMiBpZiBub3QgbmF0aXZlLgotICAgIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgICBpWzM0NTZdODYtKi1taW5ndzMyKSA7OyAjIGtlZXAgZ2RiIHRjbCB0ayBleHBlY3QgZXRjLgotICAgICAgKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0Y2wgdGsgZXhwZWN0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7ICAgIAotICAqLSotY3lnd2luKikKLSAgICB0YXJnZXRfY29uZmlnZGlycz0iJHRhcmdldF9jb25maWdkaXJzIHRhcmdldC1saWJ0ZXJtY2FwIHRhcmdldC13aW5zdXAiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICAjIGFsd2F5cyBidWlsZCBuZXdsaWIuCi0gICAgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyB0YXJnZXQtbmV3bGliIC8gLydgCi0KLSAgICAjIENhbid0IGJ1aWxkIGdkYiBmb3IgQ3lnd2luIGlmIG5vdCBuYXRpdmUuCi0gICAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAgICotKi1jeWd3aW4qKSA7OyAjIGtlZXAgZ2RiIHRjbCB0ayBleHBlY3QgZXRjLgotICAgICAgKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0Y2wgdGsgZXhwZWN0IGl0Y2wgdGl4IGxpYmd1aSBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgICAgICA7OwotICAgIGVzYWMKLSAgICA7OyAgICAKLSAgaVszNDU2XTg2LSotcGUpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28zLjJ2NSopCi0gICAgIyBUaGUgbGlua2VyIGRvZXMgbm90IHlldCBrbm93IGFib3V0IHdlYWsgc3ltYm9scyBpbiBDT0ZGLAotICAgICMgYW5kIGlzIG5vdCBjb25maWd1cmVkIHRvIGhhbmRsZSBtaXhlZCBFTEYgYW5kIENPRkYuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc29sYXJpczIqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc3lzdjQqKQotICAgICMgVGhlIFNZU1Y0IEMgY29tcGlsZXIgZG9lc24ndCBoYW5kbGUgRW1hY3MgY29ycmVjdGx5Ci0gICAgY2FzZSAiJHtDQ30iIGluCi0JIiIgfCBjYyopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IiA7OwotICAgICAgICAqKSA7OwotICAgIGVzYWMKLSAgICAjIGJ1dCB0aGF0J3Mgb2theSBzaW5jZSBlbWFjcyBkb2Vzbid0IHdvcmsgYW55d2F5Ci0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGVtYWNzIGVtYWNzMTkgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgICA7OwotICBtNjhrLSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbTY4ay0qLWNvZmYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBtbjEwMjAwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBtbjEwMzAwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHBvd2VycGMtKi1haXgqKQotICAgICMgY29waWVkIGZyb20gcnM2MDAwLSotKiBlbnRyeQotICAgICMgVGhlIGNvbmZpZ3VyZSBhbmQgYnVpbGQgb2YgbGQgYXJlIGN1cnJlbnRseSBkaXNhYmxlZCBiZWNhdXNlCi0gICAgIyBHTlUgbGQgaXMga25vd24gdG8gYmUgYnJva2VuIGZvciBBSVggNC4yIGFuZCA0LjMgKGF0IGxlYXN0KQotICAgICMgVGhlIHN5bXB0b20gaXMgdGhhdCBHREJ0ayA0LjE4IGZhaWxzIGF0IHN0YXJ0dXAgd2l0aCBhIHNlZ2ZhdWx0Ci0gICAgIyBpZiBsaW5rZWQgYnkgR05VIGxkLCBidXQgbm90IGlmIGxpbmtlZCBieSB0aGUgbmF0aXZlIGxkLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiBjdnNzcmMgdGFyZ2V0LWxpYmdsb3NzIGxkIgotICAgIHVzZV9nbnVfbGQ9bm8KLSAgICA7OwotICBwb3dlcnBjKi0qLXdpbm50KiB8IHBvd2VycGMqLSotcGUqIHwgcHBjKi0qLXBlKQotICAgIHRhcmdldF9jb25maWdkaXJzPSIkdGFyZ2V0X2NvbmZpZ2RpcnMgdGFyZ2V0LXdpbnN1cCIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRjbCB0ayBtYWtlIGV4cGVjdCB0YXJnZXQtbGliZ2xvc3MgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgICMgYWx3YXlzIGJ1aWxkIG5ld2xpYi4KLSAgICBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIHRhcmdldC1uZXdsaWIgLyAvJ2AKLSAgICA7OwotICAgICMgVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgY2FuIGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzCi0gIHBvd2VycGNsZS0qLXNvbGFyaXMqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgc2ltIG1ha2UgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgOzsKLSAgcG93ZXJwYy0qLWVhYmkpCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHJzNjAwMC0qLWx5bnhvcyopCi0gICAgIyBUaGUgQ1ZTIHNlcnZlciBjb2RlIGRvZXNuJ3Qgd29yayBvbiB0aGUgUlMvNjAwMAotICAgICMgTmV3bGliIG1ha2VzIHByb2JsZW1zIGZvciBsaWJnKysgaW4gY3Jvc3Nlcy4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiBncHJvZiBjdnNzcmMiCi0gICAgOzsKLSAgcnM2MDAwLSotYWl4KikKLSAgICAjIFRoZSBjb25maWd1cmUgYW5kIGJ1aWxkIG9mIGxkIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgYmVjYXVzZQotICAgICMgR05VIGxkIGlzIGtub3duIHRvIGJlIGJyb2tlbiBmb3IgQUlYIDQuMiBhbmQgNC4zIChhdCBsZWFzdCkKLSAgICAjIFRoZSBzeW1wdG9tIGlzIHRoYXQgR0RCdGsgNC4xOCBmYWlscyBhdCBzdGFydHVwIHdpdGggYSBzZWdmYXVsdAotICAgICMgaWYgbGlua2VkIGJ5IEdOVSBsZCwgYnV0IG5vdCBpZiBsaW5rZWQgYnkgdGhlIG5hdGl2ZSBsZC4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgbGQiCi0gICAgdXNlX2dudV9sZD1ubwotICAgIDs7Ci0gIHJzNjAwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgIDs7Ci0gIG02OGstYXBvbGxvLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIGJpbnV0aWxzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi0qLWlyaXg1KikKLSAgICAjIFRoZSBHTlUgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KLSAgICAjIGVtYWNzIGlzIGVtYWNzIDE4LCB3aGljaCBkb2VzIG5vdCB3b3JrIG9uIElyaXggNSAoZW1hY3MxOSBkb2VzIHdvcmspCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIGdwcm9mIGVtYWNzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi0qLWlyaXg2KikKLSAgICAjIFRoZSBHTlUgYXNzZW1ibGVyIGRvZXMgbm90IHN1cHBvcnQgSVJJWCA2LgotICAgICMgZW1hY3MgaXMgZW1hY3MgMTgsIHdoaWNoIGRvZXMgbm90IHdvcmsgb24gSXJpeCA1IChlbWFjczE5IGRvZXMgd29yaykKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2FzIGdwcm9mIGVtYWNzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi1kZWMtYnNkKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotYnNkKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHN0eDM5LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YiICAgIyBzYW1lIGFzIGdlbmVyaWMgbWlwcwotICAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICA7OwotICBtaXBzKi0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgIDs7Ci0gIHJvbXAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgbGQgZ2FzIG9wY29kZXMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHNoLSotKikKLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgaVszNDU2XTg2LSotdnN0YSkgOzsgIyBkb24ndCBhZGQgZ3Byb2YgYmFjayBpbgotICAgICAgaVszNDU2XTg2LSotZ28zMiopIDs7ICMgZG9uJ3QgYWRkIGdwcm9mIGJhY2sgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKSA7OyAjIGRvbid0IGFkZCBncHJvZiBiYWNrIGluCi0gICAgICAqKSBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIGdwcm9mIC8gLydgIDs7Ci0gICAgZXNhYwotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgc3BhcmMtKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3BhcmM2NC0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyY2xpdGUtKi0qKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyYy0qLXN1bm9zNCopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0gICAgICAgICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgZ2RidGVzdCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICBlbHNlCi0gICAgICAgICAgIHVzZV9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIHY4MTAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgZ2FzIGdjYyBnZGIgbGQgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2ODUwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTBlLSotKikgIyBDWUdOVVMgTE9DQUwgdjg1MGUKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTBlYS0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OyAgICAgICAjIEVORCBDWUdOVVMgTE9DQUwKLSAgdmF4LSotdm1zKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgZ2RiIGxkIHRhcmdldC1uZXdsaWIgb3Bjb2RlcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdmF4LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgKi0qLWx5bnhvcyopCi0gICAgIyBOZXdsaWIgbWFrZXMgcHJvYmxlbXMgZm9yIGxpYmcrKyBpbiBjcm9zc2VzLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OyAKLSAgKi0qLW1hY29zKiB8IFwKLSAgKi0qLW1wdyopCi0gICAgIyBNYWNzIHdhbnQgYSByZXNvdXJjZSBjb21waWxlci4KLSAgICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBncmV6IgotICAgIDs7ICAgIAotZXNhYwotCi0jIElmIHdlIGFyZW4ndCBidWlsZGluZyBuZXdsaWIsIHRoZW4gZG9uJ3QgYnVpbGQgbGliZ2xvc3MsIHNpbmNlIGxpYmdsb3NzCi0jIGRlcGVuZHMgdXBvbiBzb21lIG5ld2xpYiBoZWFkZXIgZmlsZXMuCi1jYXNlICIke25vY29uZmlnZGlyc30iIGluCi0gICp0YXJnZXQtbGliZ2xvc3MqKSA7OwotICAqdGFyZ2V0LW5ld2xpYiopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiIDs7Ci1lc2FjCi0KLSMgTWFrZSBzdXJlIHdlIGRvbid0IGxldCBHTlUgbGQgYmUgYWRkZWQgaWYgd2UgZGlkbid0IHdhbnQgaXQuCi1pZiBbIHgkd2l0aF9nbnVfbGQgPSB4bm8gXTsgdGhlbgotICB1c2VfZ251X2xkPW5vCi0gIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCIKLWZpCi0KLSMgTWFrZSBzdXJlIHdlIGRvbid0IGxldCBHTlUgYXMgYmUgYWRkZWQgaWYgd2UgZGlkbid0IHdhbnQgaXQuCi1pZiBbIHgkd2l0aF9nbnVfYXMgPSB4bm8gXTsgdGhlbgotICB1c2VfZ251X2FzPW5vCi0gIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnYXMiCi1maQotCi0jIFJlbW92ZSB0aGUgZW50cmllcyBpbiAkc2tpcGRpcnMgYW5kICRub2NvbmZpZ2RpcnMgZnJvbSAkY29uZmlnZGlycyBhbmQKLSMgJHRhcmdldF9jb25maWdkaXJzLgotIyBJZiB3ZSBoYXZlIHRoZSBzb3VyY2UgZm9yICRub2NvbmZpZ2RpcnMgZW50cmllcywgYWRkIHRoZW0gdG8gJG5vdHN1cHAuCi0KLW5vdHN1cHA9IiIKLWZvciBkaXIgaW4gLiAkc2tpcGRpcnMgJG5vY29uZmlnZGlycyA7IGRvCi0gIGRpcm5hbWU9YGVjaG8gJGRpciB8IHNlZCAtZSBzL3RhcmdldC0vL2dgCi0gIGlmIFsgJGRpciAhPSAuIF0gICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgY29uZmlnZGlycz1gZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IHNlZCAtZSAicy8gJHtkaXJ9IC8gLyJgCi0gICAgaWYgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZSBdIFwKLQl8fCBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlLmluIF07IHRoZW4KLSAgICAgIGlmIGVjaG8gIiAke3NraXBkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCXRydWUKLSAgICAgIGVsc2UKLQlub3RzdXBwPSIkbm90c3VwcCAkZGlyIgotICAgICAgZmkKLSAgICBmaQotICBmaQotICBpZiBbICRkaXIgIT0gLiBdICAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+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+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2dhcy9DaGFuZ2VMb2cgYi9nYXMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmY4ODQ0Li4wMDAwMDAwCi0tLSBhL2dhcy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQ2ICswLDAgQEAKLVR1ZSBOb3YgMzAgMjI6NTk6MDAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5hbTMzIiBwc2V1ZG8tb3AuCi0JKHJfcmVnaXN0ZXJzLCB4cl9yZWdpc3RlcnMpOiBEZWZpbmUuCi0JKHJfcmVnaXN0ZXJfbmFtZSwgeHJfcmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIG5ldyBhbTMzIG9wZXJhbmQgdHlwZXMgYW5kIGluc3RydWN0aW9uCi0JZm9ybWF0cy4KLQkobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCwgY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi0xOTk5LTExLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRodW1iX21vZGUpOiBUdXJuIGludG8gYSB0cmlzdGF0ZSB2YXJpYWJsZS4KLQkoc19mb3JjZV90aHVtYik6IFNldCB0aHVtYl9tb2RlIHRvIDIuCi0JKG1kX2Fzc2VtYmxlKTogRG8gbm90IGNvbXBsYWluIGFib3V0IHRodW1iIGluc3RydWN0aW9ucyBvbiBhCi0Jbm9uLXRodW1iIHRhcmdldCBpZiB0aHVtYl9tb2RlIGlzIHNldCB0byAyLgotCi0xOTk5LTExLTI4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHRvcGxldmVsKTogSW5jbHVkZSBzdHJ1Yy1zeW1ib2wuaC4KLQkoYWxwaGFfbWFjcm9fYXJnKTogQWRkIE1BQ1JPX3tMSVRFUkFMLEJBU0UsQllUT0ZGLEpTUn0gY2FzZXMuCi0JKE9fLi4uKTogQWRkIG5ldyBtYWNoaW5lIGRlcGVuZGVudCBleHByZXNzaW9ucyBpZiB3ZSBhcmUgaGFuZGxpbmcKLQlleHBsaWNpdCByZWxvY2F0aW9ucy4KLQkoYWxwaGFfcmVsb2Nfb3ApOiBOZXcgc3RhdGljIHRhYmxlIGhvbGRpbmcgdGhlIGV4cGxpY2l0IHJlbG9jYXRpb24KLQlpbmZvcm1hdGlvbi4KLQkoYWxwaGFfbGl0ZXJhbF9oYXNoKTogTmV3IHN0YXRpYyB0byBob2xkIHRoZSBoYXNoIHRhYmxlIGZvcgotCWV4cGxpY2l0IHJlbG9jYXRpb25zLgotCShhbHBoYV9tYWNyb3MpOiBBZGQgc3VwcG9ydCBmb3IgZXhwbGljaXQgcmVsb2NhdGlvbnMuCi0JKG1kX2JlZ2luKTogSWYgZXhwbGljaXQgcmVsb2NhdGlvbnMsIGluaXRpYWxpemUgaGFzaCB0YWJsZS4KLQkobWRfYXNzZW1ibGUpOiBEb24ndCBwcmludCBhIHNlY29uZCBlcnJvciBpZiB0b2tlbml6ZV9hcmd1bWVudHMKLQlhbHJlYWR5IHByaW50ZWQgYW4gZXJyb3IgbWVzc2FnZS4KLQkobWRfYXBwbHlfZml4KTogQWRkIHN1cHBvcnQgZm9yIGV4cGxpY2l0IHJlbG9jYXRpb25zLgotCShhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogRGl0dG8uCi0JKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogRGl0dG8uCi0JKGFscGhhX2FkanVzdF9zeW10YWIpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydCBleHBsaWNpdAotCXJlbG9jYXRpb25zLgotCShhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jcyk6IERpdHRvLgotCShkZWJ1Z19leHApOiBEZWJ1ZyBzdHViIGNvbXBpbGVkIGlmIERFQlVHX0FMUEhBIGlzIGRlZmluZWQuCi0JKHRva2VuaXplX2FyZ3VtZW50cyk6IEFkZCBkZWJ1ZyBjb2RlIGlmIERFQlVHX0FMUEhBIGlzIGRlZmluZWQuCi0JQWRkIHN1cHBvcnQgZm9yIGV4cGxpY2l0IHJlbG9jYXRpb25zLiAgUmV0dXJuIC0yIGlmIGFuIGVycm9yCi0JbWVzc2FnZSB3YXMgYWxyZWFkeSBwcmludGVkLgotCShmaW5kX21hY3JvX21hdGNoKTogQWRkIHN1cHBvcnQgZm9yIGV4cGxpY2l0IHJlbG9jYXRpb25zLiAgQ29tbWVudAotCWVhY2ggb2YgdGhlIGNhc2VzLgotCShlbWl0X2luc24pOiBBZGQgc3VwcG9ydCBmb3IgZXhwbGljaXQgcmVsb2NhdGlvbnMuCi0JKGFzc2VtYmxlX3Rva2Vucyk6IERpdHRvLgotCShlbWl0X2xkZ3ApOiBEaXR0by4KLQkobG9hZF9leHByZXNzaW9uKTogRGl0dG8uCi0JKGVtaXRfbGRhKTogRGl0dG8uCi0JKGVtaXRfbGRhaCk6IERpdHRvLgotCShlbWl0X2lyX2xvYWQpOiBEaXR0by4KLQkoZW1pdF9sb2Fkc3RvcmUpOiBEaXR0by4KLQkoZW1pdF9sZFh1KTogRGl0dG8uCi0JKGVtaXRfbGRpbCk6IERpdHRvLgotCShlbWl0X3NleHRYKTogRGl0dG8uCi0JKGVtaXRfZGl2aXNpb24pOiBEaXR0by4KLQkoZW1pdF9qc3JqbXApOiBEaXR0by4KLQkoZW1pdF9yZXRqY3IpOiBEaXR0by4KLQotCSogY29uZmlnL3RjLWFscGhhLmggKFJFTE9DX09QX1ApOiBFbmFibGUgZXhwbGljaXQgcmVsb2NhdGlvbnMgaWYKLQlFTEYgb2JqZWN0IGZvcm1hdC4KLQkodGNfYWRqdXN0X3N5bXRhYik6IElmIGV4cGxpY2l0IHJlbG9jYXRpb25zLCBjYWxsIHRoZSBmdW5jdGlvbgotCWFscGhhX2FkanVzdF9zeW10YWIuCi0JKFRDX0ZJWF9UWVBFKTogQWRkIGZpZWxkcyB0byBiZSBhYmxlIHRvIG1vdmUgZXhwbGljaXQgbGl0dXNlCi0JcmVsb2NhdGlvbnMgbmV4dCB0byB0aGUgbGl0ZXJhbCByZWxvY2F0aW9uIHRoZXkgcmVmZXJlbmNlLgotCShUQ19JTklUX0ZJWF9EQVRBKTogSW5pdGlhbGl6ZSB0aGUgbmV3IGZpZWxkcy4KLQkoVENfRklYX0RBVEFfUFJJTlQpOiBQcmludCB0aGUgbmV3IGZpZWxkcyBpZiBERUJVRzUgaXMgZGVmaW5lZC4KLQotV2VkIE5vdiAyNCAyMDoyNzo1OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlIFBBMi4wIHVuaXQgY29tcGxldGVycy4gIEhhbmRsZQotCSdCJyBvcGVyYW5kIGZvciBQQTIuMCBiYiBpbnN0cnVjdGlvbi4KLQkKLTE5OTktMTEtMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lIGZvciBNY29yZS1wZQotCXRhcmdldC4KLQkKLQkqIGNvbmZpZy90Yy1tY29yZS5jICh0Y19nZW5fcmVsb2MpOiBTdXBwb3J0IGdlbmVyYXRpb24gb2YgUlZBCi0JcmVsb2NzLgotCShtY29yZV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NhdGlvbnMgdG8gYmUgZ2VuZXJhdGVkIGZvcgotCVJWQSByZWxvY3MuCi0KLTE5OTktMTEtMTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbW1lZGlhdGUpOiBEaXNhbGxvdyBPX2JpZyBpbW1lZGlhdGVzLgotCShpMzg2X2Rpc3BsYWNlbWVudCk6IERpc2FsbG93IE9fYmlnIGRpc3BsYWNlbWVudHMuCi0KLU1vbiBOb3YgMTUgMjA6MTI6NDMgMTk5OSAgRG9uYWxkIExpbmRzYXkgIDxkbGluZHNheUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGRvX21pYSxkb19tYXIsZG9fbXJhLGRvX3BsZCxkb19sZHJsLGRvX2NvX3JlZyk6IFNtYWxsCi0JaW1wcm92ZW1lbnRzIGluIGVycm9yIGNoZWNraW5nLgotCShtZF9hc3NlbWJsZSk6IFN1cHBvcnQgZm9yIHVuY29uZGl0aW9uYWwgQVJNIGluc3RydWN0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU3VwcG9ydCBmb3IgLW1bYXJtXXY1ZSBmbGFnLgotCi0xOTk5LTExLTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtYWNyby5jIChidWZmZXJfYW5kX25lc3QpOiBEbyBub3QgY2hlY2sgYmV5b25kIHRoZSBlbmQgb2YgdGhlCi0JYnVmZmVyLiAKLQotMTk5OS0xMS0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAoYnVmZmVyX2FuZF9uZXN0KTogTG9vayBmb3Igc2VwZXJhdG9yIGFmdGVyIFRPIGFuZAotCUZST00gdG9rZW5zLgotCi0xOTk5LTExLTA4ICBBbmRyZXcgSGFsZXkgIDxhcGhAY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogV2hlbiBpbiBTdGF0ZSAxMCwgdHJlYXQgYmFja3NsYXNoCi0JY2hhcmFjdGVycyBpbiB0aGUgc2FtZSB3YXkgYXMgYXMgc3ltYm9sIGNoYXJhY3RlcnMuCi0KLTE5OTktMTEtMDcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9hbGlnbik6IENoZWNrLCBkb24ndCBhc3NlcnQsIHRoYXQKLQl0aGUgcHJldmlvdXMgbGFiZWwgd2FzIGluIHRoZSBjdXJyZW50IHNlY3Rpb24gYmVmb3JlIHBsYXlpbmcKLQl3aXRoIGF1dG8tYWxpZ25tZW50LgotCi0xOTk5LTExLTA2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9uCi0gICAgICAgIGZvciB3ZWFrIHN5bWJvbHMuCi0JKHY4NTBfcGNyZWxfZnJvbV9zZWxlY3Rpb24pOiBEbyBub3QgY29tcHV0ZSBhIHBjcmVsIG9mZnNldCBpZgotICAgICAgICB0aGUgc3ltYm9sIGlzIHdlYWsuCi0KLTE5OTktMTEtMDUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IEluY3JlYXNlIG1hY2hpbmUgZGVwZW5kZW50IG9wZXJhdG9ycyB0byAxNi4KLQkqIGV4cHIuYyAob3BfcmFuayk6IERpdHRvLgotCi0xOTk5LTExLTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogUmVqZWN0IGF0dGVtcHRzIHRvIHNldCB0aGUgdmFsdWUgb2YgYQotCXNlY3Rpb24gc3ltYm9sLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2lkZW50KTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotCWlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zZXRfaW5kZXgpOiBBZGQgQVRUUklCVVRFX1VOVVNFRC4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEb24ndCBwYXNzIE5VTEwKLQl0byBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMuCi0KLTE5OTktMTEtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IENoYW5nZSB0byBmYWxzZS4KLQotMTk5OS0xMS0wMSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogVXNlIE9QQ09ERV9JU19NRU1CRVIuCi0JKG1pcHNfaXApOiBVc2UgT1BDT0RFX0lTX01FTUJFUi4KLQotV2VkIE9jdCAyNyAxNjo1MDo0NCAxOTk5ICBEb24gTGluZHNheSAgPGRsaW5kc2F5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAocmVnX3JlcXVpcmVkX2hlcmUpOiBJbXByb3ZlIGNvbW1lbnRzLgotCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jICh0aHVtYl9vcGNvZGUpOiBBZGQgInZhcmlhbnRzIiBmaWVsZC4KLSAgICAgICAgKHRpbnNucyk6IEluaXRpYWxpemUgdmFyaWFudHMgZmllbGQuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYmFkX2FyZ3MsIGJhZF9wYyk6IFJlbmFtZWQgdG8gQkFEX0FSR1MgYW5kCi0JQkFEX1BDIHJlc3BlY3RpdmVseS4KLQotMTk5OS0xMC0yNyAgU2NvdHQgQmFtYnJvdWdoICA8c2NvdHRiQG5ldHdpbmRlci5vcmc+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAocmVsb2NfbWFwW10pOiBGaXggY29tcGlsZXIgd2FybmluZy4KLQkqIGNvbmZpZy90Yy1hcm0uaDogRml4IGNvbXBpbGUgdGltZSB3YXJuaW5ncy4KLQotTW9uIE9jdCAxOCAxODoxMToxMCBNRFQgMTk5OQlEaWVnbyBOb3ZpbGxvIDxkbm92aWxsb0BjeWdudXMuY29tPgotCi0JKiB0Y19kMTB2LmMgKGZpbmRfb3Bjb2RlKTogQWxsb3cgQVRTSUdOIHRvIG1hdGNoIGV4cHJlc3Npb25zIG9mIHRoZQotCWZvcm0gQGFiczE2LCBAKGFiczE2KSBhbmQgQChhYnMxNiArIGltbSkuCi0KLTE5OTktMTAtMjEgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChJU0FfSEFTX0NPUFJPQ19ERUxBWVMpIDogTmV3LgotCShJU0FfSEFTXzY0X0JJVF9SRUdTKSBOZXcuCi0JKGdwcl9pbnRlcmxvY2tzLG1kX2JlZ2luLHJlZ19uZWVkc19kZWxheSxhcHBlbmRfaW5zbiwKLQltaXBzX2VtaXRfZGVsYXlzLG1hY3JvX2J1aWxkLGxvYWRfcmVnaXN0ZXIsbG9hZF9hZGRyZXNzcywKLQltYWNybyxtYWNybzIsbWlwc19pcCxzX2NwcmVzdG9yZSxzX2NwYWRkKTogU2ltcGxpZnkKLQlhbmQvb3IgdXNlIG5ldyBJU0FfeHh4IG1hY3JvcyBpbiBleHByZXNzaW9ucyBpbnZvbHZpbmcKLQlJU0EsIHBhcnRpY3VsYXJseSBtaXBzX29wdHMuaXNhLgotCi0xOTk5LTEwLTE4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgbWFjaGluZSBkZXBlbmRlbnQgb3BlcmF0b3JzIG1kMS4ubWQ4LgotCShleHByZXNzaW9uUyk6IE1ha2UgWF9vcCA4IGJpdHMgaW5zdGVhZCBvZiA3LiAgQWRkIGEgWF9tZCBmaWVsZAotCWZvciB0aGUgbWFjaGluZSBkZXBlbmRlbnQgb3BlcmF0b3JzIHRvIHVzZS4KLQotCSogZXhwci5jIChvcF9yYW5rKTogQWRkIG1hY2hpbmUgZGVwZW5kZW50IG9wZXJhdG9ycy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKE9fcHJlZ2lzdGVyKTogRGVmaW5lIGFzIGEgbWFjaGluZSBkZXBlbmRlbnQKLQlvcGVyYXRvci4KLQkoT19jcHJlZ2lzdGVyKTogRGl0dG8uCi0JKG1kX2JlZ2luKTogQ2hhbmdlIFhfb3AgdGVzdCB0aGF0IGZpZWxkIGlzIHdpZGUgZW5vdWdoIHRvIHVzZQotCU9fbWF4IGluc3RlYWQgb2YgT19hbHBoYV9tYXguCi0JKGNwdV90eXBlcyk6IEZpbGwgaW4gbWlzc2luZyBpbml0aWFsaXplci4KLQkoYWxwaGFfbnVtX21hY3Jvcyk6IE1ha2UgdW5zaWduZWQuCi0JKG1kX2Fzc2VtYmxlKTogTWFrZSBvcG5hbWVsZW4gYmUgc2l6ZV90LgotCShtZF9hcHBseV9maXgpOiBDYXN0IGFscGhhX251bV9vcGVyYW5kcyB0byBpbnQgYmVmb3JlIHRlc3RpbmcuCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBEaXR0by4KLQkoYWxwaGFfZml4X2FkanVzdGFibGUpOiBEaXR0by4KLQkoYWxwaGFfZml4X2FkanVzdGFibGUpOiBNYXJrIHVudXNlZCBhcmd1bWVudHMgQVRUUklCVVRFX1VOVVNFRC4KLQkodGNfZ2VuX3JlbG9jKTogRGl0dG8uCi0JKHRjX2dldF9yZWdpc3Rlcik6IERpdHRvLgotCShlbWl0X2xkZ3ApOiBEaXR0by4KLQkoZW1pdF9sZGEpOiBEaXR0by4KLQkoZW1pdF9sZGFoKTogRGl0dG8uCi0JKGVtaXRfbGRpbCk6IERpdHRvLgotCShzX2FscGhhX2VudCk6IERpdHRvLgotCShzX2FscGhhX2VuZCk6IERpdHRvLgotCShzX2FscGhhX2ZyYW1lKTogRGl0dG8uCi0JKHNfYWxwaGFfcHJvbG9ndWUpOiBEaXR0by4KLQkoc19hbHBoYV9maWxlKTogRGl0dG8uCi0JKHNfYWxwaGFfZ3ByZWwzMik6IERpdHRvLgotCShzX2FscGhhX3Byb2MpOiBEaXR0by4KLQkoc19hbHBoYV9zZXQpOiBEaXR0by4KLQkoc19hbHBoYV9iYXNlKTogRGl0dG8uCi0JKHNfYWxwaGFfYWxpZ24pOiBEaXR0by4KLQkoc19hbHBoYV9hcmNoKTogRGl0dG8uCi0JKGFscGhhX2FsaWduKTogRGl0dG8uCi0JKGFzc2VtYmxlX2luc24pOiBTdXBwcmVzcyB1bnVzZWQgdmFyaWFibGUgd2FybmluZy4KLQkoZW1pdF9pbnNuKTogRGl0dG8uCi0JKGFzc2VtYmxlX2luc24pOiBEb24ndCBhc3N1bWUgWF9vcCBhbmQgWF91bnNpZ25lZCBhcmUgaW4gYSBnaXZlbgotCW9yZGVyIGluIHRoZSBzdHJ1Y3R1cmUuCi0JKHNfYWxwaGFfY29mZl93cmFwcGVyKTogQXZvaWQgaW50L3Vuc2lnbmVkIGNvbXBhcmlzb24uCi0KLVN1biBPY3QgMTcgMTc6MTU6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBNYWtlICJmbXQiIGFuIGludC4KLQotMTk5OS0xMC0xMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2luZGV4X2NoZWNrKTogQ29ycmVjdCAjZW5kaWYgbG9jYXRpb24uCi0KLU1vbiBPY3QgMTEgMTQ6MDI6NDAgMTk5OSAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0JKHBhcnNlX2FyZ3MpOiBBZGQgLS1uby13YXJuLCAtLXdhcm4sIC0tZmF0YWwtd2FybmluZ3MsCi0Jd2hpY2ggYmVjb21lICdXJywgT1BUSU9OX1dBUk4sIGFuZCBPUFRJT05fV0FSTl9GQVRBTC4KLQkocGFyc2VfYXJncyk6IFBhcnNlIHRoZSBuZXcgb3B0aW9ucy4KLQkobWFpbik6IElmIHRoZXJlIHdlcmUgd2FybmluZ3MsIGFuZCAtLWZhdGFsLXdhcm5pbmdzCi0Jd2FzIHNwZWNpZmllZCwgcHJpbnQgYW4gZXJyb3IuCi0JKiBhcy5oOiBOZXcgdmFyaWFibGUsIGZsYWdfZmF0YWxfd2FybmluZ3MsIGZvciBuZXcgb3B0aW9uLgotCi1TdW4gT2N0IDEwIDAxOjQ3OjIzIDE5OTkgIEplcnJ5IFF1aW5uIDxqZXJyeS5xdWlubi5hZHY5MUBhbHVtLmRhcnRtb3V0aC5vcmc+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIEFkZCBuZXcgY29kZXMgJ2NjJywgJ2NkJywgJ2NDJywgJ2NvJywKLQknQCcuICBDaGFuZ2UgYXV0b2luY3JlbWVudCBjb21wbGV0ZXJzIHRvIGZhbGwgdGhyb3VnaCB0byBjYWNoZSBjb250cm9sCi0JY29tcGxldGVycy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgUmVtb3ZlIHVudXNlZCBhcmdzLiAgQWRkIGNvZGUgdG8gJz9XJwotCWFyZy4gCi0JKHBhX3BhcnNlX2FkZGJfNjRfY21wbHRyKTogIE5ldyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQ2hhbmdlIGVycm9yIG1lc3NhZ2UuCi0JKHBhX2lwLHBhX3BhcnNlX2NtcGJfNjRfY21wbHRyLHBhX3BhcnNlX2NtcGliXzY0X2NtcGx0cikgIEZpeCAnP04nIGFuZAotCSc/UScgYXJncyB0byBhbGxvdyBmYWxsaW5nIHRocm91Z2guCi0KLQkqIGNvbmZpZ3RjLWhwcGEuYyAocGFfaXApOiAgSW1wbGVtZW50IGNvbmRpdGlvbmFsIGNvZGVzICI/TiIsICI/USIuCi0JUmVtb3ZlIHVudXNlZCBjb25kaXRpb25hbCBjb2Rlcy4KLQkocGFfcGFyc2VfY21wYl82NF9jbXBsdHIscGFfcGFyc2VfY21waWJfNjRfY21wbHRyKTogIE5ldy4KLQotVGh1IE9jdCAgNyAwMDoyMzo1MyBNRFQgMTk5OQlEaWVnbyBOb3ZpbGxvIDxkbm92aWxsb0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChDSEFSX0JJVCk6IERlZmluZS4KLQkoY2hlY2tfcmFuZ2UpOiBGaXggYml0IG9wZXJhdGlvbnMgdG8gc3VwcG9ydCBpbnRlZ2VycyBiaWdnZXIgdGhhbgotCTMyIGJpdHMuCi0KLVRodSBPY3QgIDcgMDA6MTE6NTAgTURUIDE5OTkJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoY2hlY2tfcmFuZ2UpOiBDaGVjayByYW5nZSBmb3IgUkVTVFJJQ1RFRF9OVU0zCi0Jb3BlcmFuZHMuCi0KLU1vbiBPY3QgIDQgMTc6MjQ6MjMgMTk5OSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQkJCSAgRG91ZyBFdmFucyAgPGRldmFuc0BjeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIG0zMnJ4LgotCSogY29uZmlnL3RjLW0zMnIuYyAoZW5hYmxlX20zMnJ4KTogTmV3IHN0YXRpYyBnbG9iYWwuCi0JKGVuYWJsZV9zcGVjaWFsLHdhcm5fZXhwbGljaXRfcGFyYWxsZWxfY29uZmxpY3RzLG9wdGltaXplKTogRGl0dG8uCi0JKGFsbG93X20zMnJ4KTogTmV3IGZ1bmN0aW9uLgotCShNMzJSX1NIT1JUT1BUUyk6IEFkZCBgTycuCi0JKG1kX2xvbmdvcHRzKTogQWRkIC0tbTMycnggcGx1cyBzZXZlcmFsIHdhcm5pbmcgb3B0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCShtZF9zaG93X3VzYWdlKTogUHJpbnQgdGhlbS4KLQkobWRfYmVnaW4pOiBFbmFibGUgbTMycnguCi0JKE9QRVJBTkRfSVNfQ09ORF9CSVQpOiBOZXcgbWFjcm8uCi0JKGZpcnN0X3dyaXRlc190b19zZWNvbmRzX29wZXJhbmRzKTogTmV3IGZ1bmN0aW9uLgotCSh3cml0ZXNfdG9fcGMsY2FuX21ha2VfcGFyYWxsZWwsbWFrZV9wYXJhbGxlbCk6IE5ldyBmdW5jdGlvbnMuCi0JKHRhcmdldF9tYWtlX3BhcmFsbGVsLGFzc2VtYmxlX3R3b19pbnNucyk6IE5ldyBmdW5jdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogUmVjb2duaXplICJpbnNuMSAtPiBpbnNuMiIgYW5kICJpbnNuMSB8fCBpbnNuMiIuCi0JSWYgb3B0aW1pemluZyBhbmQgbTMycngsIHRyeSB0byBtYWtlIGNvbnNlY3V0aXZlIGluc25zIHBhcmFsbGVsLgotCi1UdWUgU2VwIDI4IDE0OjA2OjQ0IDE5OTkgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IEFsbG93IGZvciB0aGUKLQkuc2RhdGEuZm9vIHNlY3Rpb25zIGdlbmVyYXRlZCBieSAtZmRhdGEtc2VjdGlvbnMsCi0JYW5kIGZvciB0aGUgLmdudS5saW5rb25jZS5zIHNlY3Rpb25zIGdlbmVyYXRlZCBieSBDKysuCi0KLVRodSBTZXAgMjMgMDc6MTM6NDUgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogUmVwbGFjZSAnQicsICdNJywgJ2wnIGFuZCAnZycgaGFuZGxpbmcKLQl3aXRoIGNsZWFuZXIgY29kZSB1c2luZyBjb21wbGV0ZXIgcHJlZml4ZXMuICAgQWRkICdZJy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQWRkIHBhcmVucyB0byBzaWxlbmNlIGNvbXBpbGVyLgotCi1XZWQgU2VwIDIyIDA5OjM3OjE5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogQXZvaWQgQU5TSSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KLQkocGFfaXAsIGNhc2UgJ20nKTogRmFpbHVyZSB0byBnZXQgYSBDQklUIHNwZWNpZmllciBqdXN0IG1lYW5zIHRoZQotCWluc24gZG9lcyBub3QgbWF0Y2ggYW5kIHdlIHNob3VsZCB0cnkgdGhlIG5leHQgaW5zbiBpbiB0aGUgdGFibGUuCi0KLTE5OTktMDktMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoTVVMVElfU0VUX1BTUik6IFJlbmFtZSB0byBMRE1fVFlQRV8yX09SXzMuCi0KLU1vbiBTZXAgMjAgMDQ6MDE6NDEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEZpeCB0aGlua29zIGluIHJlY2VudCBjbGVhbnVwCi0Jb2YgUEEyLjAgc3VwcG9ydC4KLQotMTk5OS0wOS0xOSAgQWxleGFuZHJlIE9saXZhICA8b2xpdmFAbHNkLmljLnVuaWNhbXAuYnI+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3Nob3J0b3B0cyk6IENoZWNrIE9CSl9NQVlCRV9FTEYgYXMgd2VsbCBhcwotCU9CSl9FTEYuICBJZiBFTEYsIGFkZCAic3EiLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiBFTEYsIGlnbm9yZSAtcyBhbmQgLXEuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIEVMRiBvcHRpb25zLgotCi1TdW4gU2VwIDE5IDEwOjQzOjMxIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgJ0onLCAnSycgYW5kICdjYycgCi0Jb3BlcmFuZHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTsgSGFuZGxlICJmZSIsIGFuZCAnY0onLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnZCcsICcjJyBhbmQgJ2NxJy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3RydWN0IHBhX2l0KTogTmV3IGZpZWxkICJ0cnVuYyIuCi0JKHBhX2lwKTogSGFkbmxlICdoJywgJ20nLCAnPScsICd7JywgYW5kICdfJyBvcGVyYW5kcy4KLQkocGFfcGFyc2VfZnRlc3RfZ2Z4X2NvbXBsZXRlcik6IE5ldyBmdW5jdGlvbgotCShwYV9wYXJzZV9mcF9jbnZfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnWCcgb3BlcmFuZC4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIDIyYml0IHBjLXJlbCBicmFuY2hlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgJ0InIG9wZXJhbmQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdMJyBhbmQgJ00nIG9wZXJhbmRzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnbCcgb3BlcmFuZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgJ2cnIG9wZXJhbmQuCi0KLWF0IFNlcCAxOCAxMjoxMzoyOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2Fzc2VtYmxlKTogRml4IGR3YXJmMiBsaW5lIGhhbmRsaW5nLgotCShwYV9pcCk6IEhhbmRsZSAnZlgnLgotCi1TYXQgU2VwIDE4IDEyOjEzOjI4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2Fzc2VtYmxlKTogRml4IGR3YXJmMiBsaW5lIGhhbmRsaW5nLgotICAgICAgICAocGFfaXApOiBIYW5kbGUgJ2ZYJy4KLQotRnJpIFNlcCAxNyAxMTo1NzozNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IERvIG5vdCBidWlsZAotCXVud2luZHMgdW5sZXNzIHRoZSBmdW5jdGlvbiBpcyBpbiB0aGUgdGV4dCBzcGFjZS4KLQkocGFfdHlwZV9hcmdzKTogU2V0IEJTRl9GVU5DVElPTiBmb3IgYW4gZXhwcm90ZWQgZGF0YSBzeW1ib2wuCi0KLVdlZCBTZXAgMTUgMDU6MTQ6MzIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IE1vdmUgZHdhcmYyIHN0dWZmIGZyb20gaGVyZS4KLQkobWRfYXNzZW1ibGUpOiBUbyBoZXJlLiAgVHdlYWsgYWRkcmVzcyBnZW5lcmF0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBJbmNsdWRlIGR3YXJmMmRiZy5oIGlmIE9CSl9FTEYuICBEZWNsYXJlCi0JZGVidWdfbGluZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIC5maWxlIGFuZCAubGluZSBwc2V1ZG8tb3BzIGZvciBPQkpfRUxGLgotCShtZF9hc3NlbWJsZSk6IENhbGwgZHdhcmYyX3doZXJlIGZvciBPQkpfRUxGLgotCShwYV9pcCk6IENhbGwgZHdhcmYyX2dlbl9saW5lX2luZm8gZm9yIE9CSl9FTEYuCi0JKHBhX2VuZF9vZl9zb3VyY2UpOiBOZXcgZnVuY3Rpb24uCi0JKiB0Yy1ocHBhLmggKG1kX2VuZCk6IERlZmluZSBmb3IgT0JKX0VMRi4KLQotMTk5OS0wOS0xNCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQ2Fub25pY2FsaXphdGlvbiBvZiB0YXJnZXQgbmFtZXMpOiBSZW1vdmUgYWRkaW5nCi0JJHtDT05GSUdfU0hFTEx9IGluIGZyb250IG9mICRhY19jb25maWdfc3ViLCBzaW5jZSBhdXRvY29uZmlnIDIuMTQKLQlnZW5lcmF0ZXMgJGFjX2NvbmZpZ19zdWIgd2l0aCBhICR7Q09ORklHX1NIRUxMfSBhbHJlYWR5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTA5LTE0ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogY29uZmlnL3RlLWludGVyaXguaCAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmaW5lLgotCi0xOTk5LTA5LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlICJqbXAvY2FsbCBjb25zdGFudCIgYXMgYQotCXBjLXJlbGF0aXZlIGptcC9jYWxsIHRvIGFuIGFic29sdXRlIHN5bWJvbC4KLQkobWRfYXBwbHlfZml4Myk6IFdoZW4gT0JKX0VMRiwgZG9uJ3QgYWRkIHRoZSB2YWx1ZXMgaW4gdHdpY2UgZm9yCi0JYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2xzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3QgZnJhZ192YXIgc2l6ZS4gIFRpZHkKLQlqdW1wIGhhbmRsaW5nIGNvZGUgYW5kIGNvbW1lbnRzLgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IEFkZCBob3JyaWJsZSBhZGp1c3RtZW50cyB0bwotCXRoZSB2YWx1ZSBpZiBURV9QRSBhbmQgYSBnbG9iYWwgZGVmaW5lZCBzeW1ib2wuCi0KLTE5OTktMDktMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiB3cml0ZS5jIChkdW1wX3NlY3Rpb25fcmVsb2NzKTogQ2FsbCBwcmludF9zeW1ib2xfdmFsdWVfMSB0bwotCXByaW50IHRoZSBzeW1ib2wsIHJhdGhlciB0aGFuIHByaW50aW5nIGl0IGhlcmUuCi0KLTE5OTktMDktMTEgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0Ci0JQkZEX1JFTE9DX1JWQSByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfdW5kZWZpbmVkX3N5bWJvbCk6IENvbXBhcmUgdGhlIG5hbWUgYWdhaW5zdAotCXRoZSBtYWNybyBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUsIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgaXQKLQlzdGFydHMgd2l0aCAiX0ciLgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBDYWxsIFNFVF9TRUNUSU9OX1JFTE9DUyBpZiBpdCBpcwotCWRlZmluZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0VUX1NFQ1RJT05fUkVMT0NTKTogRGVmaW5lLgotCSogZG9jL2ludGVybmFscy50ZXhpIChPYmplY3QgZm9ybWF0IGJhY2tlbmQpOiBEb2N1bWVudAotCVNFVF9TRUNUSU9OX1JFTE9DUy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdAotCXJlbG9jYXRpb25zIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMgaWYgVEVfUEUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9pZGVudCk6IEFkZCBCRkRfQVNTRU1CTEVSIHZlcnNpb24uCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBbHdheXMgaGFuZGxlICIuaWRlbnQiIHdpdGggb2JqLWNvZmZfaWRlbnQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogUHJvaGliaXQgd2VhayBjb21tb24KLQlzeW1ib2xzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZW5kZWYpOiBEb24ndCBtZXJnZSBsYWJlbHMsIG9yCi0Jc3ltYm9scyB3aGljaCBkbyBub3QgaGF2ZSBhIGNvbnN0YW50IHZhbHVlLCBvciB0YWdzIHdpdGgKLQlub24tdGFncy4gIFJlbW92ZSB0aGUgc3ltYm9sIGZyb20gdGhlIGxpc3QgYmVmb3JlIGFkZGluZyBpdCBhdCB0aGUKLQllbmQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9lbmRlZikgW0JGRF9BU1NFTUJMRVJdOiBIYW5kbGUgLmVmCi0JQ19GQ04gc3ltYm9sIGRpZmZlcmVudGx5IGlmIFRFX1BFLgotCShvYmpfY29mZl9saW5lKSBbQkZEX0FTU0VNQkxFUl06IEFsd2F5cyB1c2UgdGhlIGxpbmUgbnVtYmVyIHdoaWNoCi0JYXBwZWFycyBpbiB0aGUgcHNldWRvLW9wLCByYXRoZXIgY29mZl9saW5lX2Jhc2Ugd2hpY2ggaXMgb25seSBzZXQKLQlmb3IgYSAuYmYgc3ltYm9sLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCAibG9jIi4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGFkZF9saW5lbm8pOiBDaGVjayB0aGF0IHRoZSBsaW5lIG51bWJlciBpcwotCXBvc2l0aXZlLgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGF0b2ZfaWVlZSk6IENoYW5nZSB3aGF0X2tpbmQgdG8gaW50LgotCSogY29uZmlnL2F0b2YtdmF4LmMgKGZsb251bV9nZW4ydmF4KTogQ2hhbmdlIGZvcm1hdF9sZXR0ZXIgdG8KLQlpbnQuCi0JKG1kX2F0b2YpOiBSZXR1cm4gTlVMTCByYXRoZXIgdGhhbiAwLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXRvZik6IENoYW5nZSB0eXBlIHRvIGludC4KLQkqIGV4cHIuYyAoZXhwcik6IENoYW5nZSBmaXJzdCBwYXJhbWV0ZXIgdG8gaW50LgotCSogY29uZmlnL29iai1jb2ZmLmM6IEFkZCBkZWNsYXJhdGlvbnMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBVc2UgU1lNX0FVWEVOVC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGZsYWdfMTZiaXRfY29kZSk6IERvbid0IGRlY2xhcmUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogRGVmYXVsdCB0byBzZXR0aW5nCi0JU0VDX0xPQUQuICBEb24ndCBzZXQgU0VDX0RBVEEgZm9yICd3JyBtb2RpZmllci4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBQcmludCBhZGp1c3RlZCBmaXh1cC4KLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogQ29ycmVjdCB0b29fbWFueV9kaWdpdHMgY2FsY3VsYXRpb24KLQlpbiBiYXNlIDEwIGNhc2UuCi0KLTE5OTktMDktMDkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGRvYy9jLWFybS50ZXhpOiBGaXggYXJndW1lbnRzIG9mIEB2YXIgdG8gbm90IGNvbnRhaW4KLQlwdW5jdHVhdGlvbi4KLQotMTk5OS0wOS0wOCAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoc190aHVtYl9zZXQpOiBPbmx5IHN1cHBvcnQgaW50ZXJ3b3JraW5nIGZvciBFTEYgCi0JYW5kIENPRkYgdGFyZ2V0cy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogT25seSBzdXBwb3J0IC1rIGZsYWcgZm9yIEVMRiBhbmQgQ09GRiB0YXJnZXRzLgotCi1UdWUgU2VwICA3IDEzOjI4OjU5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBQdXQgc3RyaWN0IHJlZ2lzdGVyIGNoZWNrcyBiZWZvcmUKLQljYWxsIHRvIHBhX3BhcnNlX251bWJlci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBTdXBwb3J0ICdaJyBhcmd1bWVudC4KLQotMTk5OS0wOS0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBBZGQgQVRUUklCVVRFX1VOVVNFRCBhcyBuZWVkZWQgZm9yCi0JQkZEX0FTU0VNQkxFUiBjb2RlLgotCi0xOTk5LTA5LTA2ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogU2V0IFNFQ19EQVRBIGZvciBkYXRhX3NlY3Rpb24uCi0KLU1vbiBTZXAgIDYgMDQ6MjY6NTYgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEdldCBzdHJpY3Qvbm9uLXN0cmljdCBtb2RlIGZyb20gdGhlCi0JY2FuZGlkYXRlIGluc3RydWN0aW9uLiAgUmVxdWlyZSByZWdpc3RlcnMgZm9yIHJlZ2lzdGVyIGFyZ3VtZW50cwotCXdoZW4gaW4gc3RyaWN0IG1vZGUuICBSZXF1aXJlIGFzc2VtYmxlLXRpbWUgY29uc3RhbnRzIGZvcgotCWNvbnN0YW50cyB3aGVuIGluIHN0cmljdCBtb2RlLgotCShwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IFJlcXVpcmUgYSBjb25zdGFudCB3aGVuIGluIHN0cmljdAotCW1vZGUuCi0JCi0xOTk5LTA5LTA2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9sb25nb3B0cyk6IEZpeCB2YWx1ZSBmb3IgLVdudWguCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY29uZmlnL3RjLXBqLmM6IE5ldyBmaWxlLCBzdXBwb3J0cyBwaWNvSmF2YSBpbiBFTEYuCi0JKiBjb25maWcvdGMtcGouaDogRGl0dG8uCi0JKiBjb25maWd1cmUuaW4gKHBqbCosIHBqKik6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDUFVfVFlQRVMpOiBBZGQgcGouCi0JKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIGNvbmZpZy90Yy1wai5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCBjb25maWcvdGMtcGouaC4KLQkqIGRvYy9jLXBqLnRleGk6IE5ldyBmaWxlLgotCSogZG9jL2FzLnRleGluZm86IEFkZCBzb21lIFBKIHNwZWNpZmljcy4KLQkqIGRvYy9hbGwudGV4aTogQWRkIFBKIHRvIHRoZSBsaXN0IG9mIGFsbCBhcmNoaXRlY3R1cmVzLCBzb3J0IHRoZW0KLQlhbGwgYWxwaGFiZXRpY2FsbHkuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKENQVV9ET0NTKTogQWRkIGMtcGoudGV4aS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOS0wMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvb2JqLW11bHRpLmg6IEluY2x1ZGUgb2JqLWVsZi5oIGlmIE9CSl9NQVlCRV9FTEYuIFJlZm9ybWF0LgotCShvYmpfZnJvYl9maWxlKTogVGVzdCBmb3IgbnVsbCBwb2ludGVyLgotCShPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IEhlcmUgdG9vLgotCShPQkpfUFJPQ0VTU19TVEFCKTogQW5kIGhlcmUuCi0JKGVsZl9vYmpfc3kpOiBSZW1vdmUKLQotCSogY29uZmlnL29iai1lbGYuaDogI2lmbmRlZiBldmVyeXRoaW5nIGRlZmluZWQgaW4gb2JqLW11bHRpLmgsCi0JZXhjZXB0IE9CSl9QUk9DRVNTX1NUQUIsIHdoaWNoIHdlICN1bmRlZiBmb3IgZWNvZmYuCi0JKGVsZl9vYmpfc3kpOiBSZW1vdmUgI2lmbmRlZiBPQkpfU1lNRklFTERfVFlQRS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG5vX2Z1bmMpOiBSZW1vdmUuCi0JKGNvZmZfZm9ybWF0X29wcyk6IENoYW5nZSBvY2N1cnJlbmNlcyBvZiBub19mdW5jIHRvIDAsIGFzIHdlIHRlc3QKLQlmb3IgMCBpbiBvYmotbXVsdGkuaC4KLQotCSogY29uZmlndXJlLmluOiAgRW5hYmxlIGJmZCBmb3IgaTM4Ni1jb2ZmIHdoZW4gcHJpbWFyeSB0YXJnZXQgaXMKLQliZmQuICBFbmFibGUgaTM4NiBlbGYsY29mZiBlbXVsYXRpb24gc3VwcG9ydC4gIERvbid0IHNldAotCVVTRV9FTVVMQVRJT05TPTEgb3IgdGVfZmlsZT1tdWx0aSB1bmxlc3MgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQotCWVtdWxhdGlvbiB0byBzdXBwb3J0LgotCSpjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDktMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtY29yZV9zX3NlY3Rpb24pOiBEbyBub3QgZHVtcCBsaXRlcmFscyBpZiBhCi0JLnNlY3Rpb24gLmxpbmUgZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkLgotCi0xOTk5LTA5LTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEbyBub3QgYWxpZ24gc2VjdGlvbnMgaW4gRUxGCi0JZm9ybWF0LiAKLQotCSogYXMuYyAoc2hvd191c2FnZSk6IEFkZCAtLWdkd2FyZjIgdG8gbGlzdCBvZiBvcHRpb25zIGRpc3BsYXllZC4KLQkqIGFzLnRleGluZm86IERvY3VtZW50IC0tZ2R3YXJmMiBjb21tYW5kIGxpbmUgb3B0aW9uLgotCUFkZCBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gb2YgQVJNIGNvbW1hbmQgbGluZSBzd2l0Y2hlcy4KLQotMTk5OS0wOC0zMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogQ29tYmluZQotCWkzODZfaXNfcmVnIGFuZCBwYXJzZV9yZWdpc3RlciBjYWxscy4gIFJlbW92ZSBFTkRfU1RSSU5HX0FORF9TQVZFCi0JYW5kIFJFU1RPUkVfRU5EX1NUUklORyBhcm91bmQgcGFyc2VfcmVnaXN0ZXIgY2FsbHMuCi0JKGkzODZfb3BlcmFuZCk6IEhlcmUgdG9vLgotCShpMzg2X2lzX3JlZyk6IFJlbW92ZS4KLQkocGFyc2VfcmVnaXN0ZXIpOiBNb3ZlIGFzX2JhZCBjYWxscyBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHRvCi0JY2FsbGVycy4KLQotMTk5OS0wOC0yOSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHBhcnNlX3JlZ2lzdGVyKTogSGFuZGxlIEZQIHJlZ3Mgc3BlY2lhbGx5LgotCShtZF9iZWdpbik6IFJlbW92ZSAnKCcgYW5kICcpJyBmcm9tIHJlZ2lzdGVyX2NoYXJzLgotCi0xOTk5LTA4LTI5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX3BhcnNlX29wdGlvbik6IERlbGV0ZSB1bnJlY29nbml6ZWQgb3B0aW9uCi0JZXJyb3IgbWVzc2FnZSAoZG9uZSBlbHNld2hlcmUpLgotCi1TYXQgQXVnIDI4IDAxOjIzOjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBEbyBub3QgYWxsb3cgJyonIGluIDMyYml0IGNvbXBsZXRlcnMuCi0KLVNhdCBBdWcgMjggMDA6MjY6MjYgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFJlcGxhY2UgJ2YnIGJ5ICd2Jy4gIFByZWZpeCBmbG9hdCByZWdpc3RlcgotCWFyZ3MgYnkgJ2YnLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEFkZCBhcmdzIHEsICUsIGFuZCB8LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBBYnNvcmIgd2hpdGUgc3BhY2UgaW4gaW5zdHJ1Y3Rpb25zCi0JYmV0d2VlbiBhcmdzLgotCUFkZCBuZXcgY29tcGxldGVycy4gIEZpeCBidWcgaW4gNjQgYml0IGNvbmRpdGlvbiBoYW5kbGluZy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQWRkIGNvbXBsZXRlciBjb2RlcyAnYScsICdjaCcsICdjSCcsCi0JJ2NTJywgYW5kICdjKicuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogUGxhY2UgY29tcGxldGVycyBiZWhpbmQgcHJlZml4ICdjJy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQWRkIGNhc2VzIGZvciAnLicsICd+Jy4gJyQnLiBhbmQgJyEnCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIEFkZCBjYXNlIGZvciAnSScuICAKLQotMTk5OS0wOC0yNyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjJkYmcuYyAoTUFYX1NQRUNJQUxfQUREUl9ERUxUQSk6IENvcnJlY3QgdHlwbyBpbiBjb21tZW50LgotCShzdHJ1Y3QgbHMpOiBBZGQgZnJhZyBmaWVsZC4gIEluaXRpYWxpemUgaXQgdG8gemVyby4KLQkob3V0X2VuZF9zZXF1ZW5jZSk6IE5ldyBsb2NhbCB0ZXh0X2ZyYWcuICBTZXQgaXQgd2hpbGUgaW4gdGV4dCBzZWN0aW9uLgotCVJlcGxhY2UgYWRkcmVzcyBjaGVjayB3aXRoIGZyYWcgY2hlY2suICBTZXQgbHMuZnJhZyB0byB0ZXh0X2ZyYWcgaWYKLQlvdXRfc2V0X2FkZHIgY2FsbGVkLgotCShkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IEFkZCBleHBsYW5hdG9yeSBjb21tZW50LiAgTmV3IGxvY2FsIHNhdmVkX2ZyYWcuCi0JU2V0IGl0IGJlZm9yZSBzd2l0Y2hpbmcgc2VjdGlvbnMuICBSZXBsYWNlIGFkZHJlc3MgY2hlY2sgd2l0aCBmcmFnCi0JY2hlY2suICBTZXQgbHMuZnJhZyB0byBzYXZlZF9mcmFnIGlmIG91dF9zZXRfYWRkciBjYWxsZWQuCi0KLTE5OTktMDgtMjYgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0gICAgICAgICogZHdhcmYyZGJnLmMgKG91dF9lbmRfc2VxdWVuY2UpOiBJZiBhZGRyZXNzIGNoYW5nZWQsIGRpcmVjdGx5Ci0Jb3V0cHV0ICJhZHZhbmNlX3BjIiBvcGNvZGUgaW5zdGVhZCBvZiBjYWxsaW5nIGdlbl9hZGRyX2xpbmUoKS4KLQlUaGUgbGF0dGVyIGhhcyB0aGUgdW5kZXNpcmVkIHNpZGUtZWZmZWN0IG9mIGNyZWF0aW5nIGEgbmV3IHJvdwotCWluIHRoZSBkZWJ1ZyBsaW5lIGluZm8gbWF0cml4LiAKLQotMTk5OS0wOC0yNiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjJkYmcuYyAob3V0X2VuZF9zZXF1ZW5jZSk6IENvcnJlY3QgY29tbWVudHMuICBTZXQgbGFzdCB0bwotCWxzLmxhc3RfZmlsZW5hbWUgaWYgbGFzdCBpcyBsZXNzIHRoYW4gemVyby4gIFNldCBscy5sYXN0X2ZpbGVuYW1lCi0Jd2hlbiBhbGxvY2F0aW5nIG5ldyBlbnRyeS4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBTYXZlIHNlZyBhbmQgc3Vic2VnIGluZm8gYmVmb3JlIHN1YnNlZ19uZXcKLQljYWxsLgotCi0xOTk5LTA4LTIwICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW5kZXhfY2hlY2spOiBGaXggdGhlIGRpc3BsYWNlbWVudCBzaXplCi0Jd2hlbiBJTkZFUl9BRERSX1BSRUZJWC4KLQotMTk5OS0wOC0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogSWYgYW4gb2Zmc2V0IGlzIGludmFsaWQsCi0JZGlzcGxheSBpdHMgdmFsdWUuCi0KLTE5OTktMDgtMTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogVHJpbSBAaGEgY29uc3RhbnQgdG8gMTYgYml0cywgdG8KLQloYW5kbGUgMHhmZmZmTk5OTiBjb25zdGFudHMgY29ycmVjdGx5LgotCi0xOTk5LTA4LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGRvX2xkc3QpOiBMb29rIGZvciByZWdpc3RlciBjb25mbGljdHMgb24gc3RvcmVzCi0JYXMgd2VsbCBhcyBsb2Fkcy4KLQotMTk5OS0wOC0xMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jICh2YWxpZGF0ZV9vZmZzZXRfaW1tKTogV29yayBvbiB1bnNpZ25lZCB2YWx1ZXMuCi0JKG1kX2FwcGx5X2ZpeDMpOiBBbHdheXMgcGFzcyBwb3NpdGl2ZSB2YWx1ZXMgdG8KLQl2YWxpZGF0ZV9vZmZzZXRfaW1tLgotCi0xOTk5LTA4LTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHNraXBfd2hpdGVzcGFjZSk6IE5ldyBtYWNyby4KLQlGb3JtYXR0aW5nIHRpZHkgdXBzLgotCQotCShtZF9hcHBseV9maXgzKTogU3RvcmUgcmVsb2NhdGlvbiBvZmZzZXQgaW4gYWRkZW5kIGZvciBFTEYgYmFzZWQKLQlyZWxvY3MuCi0JKGFybV9mb3JjZV9yZWxvY2F0aW9uKTogQWx3YXlzIGdlbmVyYXRlIHJlbG9jcyBmb3IgVGh1bWIgZnVuY3Rpb24KLQljYWxscy4gCi0JCi0xOTk5LTA4LTExICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIGRlYWQgY29kZS4gIGludGVsX3N5bnRheAotCUxPTkdfRE9VQkxFX01ORU1fU1VGRklYIGZsb2F0aW5nIHBvaW50IGlzIGRvbmUgaW4gb3Bjb2RlL2kzODYuaAotCi1UdWUgQXVnIDEwIDEyOjU4OjMxIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogVXNlIHNhbmUgc2VjdGlvbgotCWZsYWdzIGZvciB0aGUgdW53aW5kIHN1YnNwYWNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChVTldJTkRfU0VDVElPTl9OQU1FKTogRGVmaW5lIGZvciBFTEYuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFJlbW92ZSAjaWYgMCB3cmFwcGVyLiAgU2VsZWN0IGEKLQlzdWl0YWJsZSByZWxvY2F0aW9uIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSB0YXJnZXQncyBwb2ludGVyLgotCUFsd2F5cyBVc2Ugc3Vic2VnbWVudCB6ZXJvIGZvciB0aGUgdW53aW5kZXJzLgotCShwYV9sZXZlbCk6IEhhbmRsZSAiMi4wdyIuCi0KLU1vbiBBdWcgIDkgMjA6MDI6MjIgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAod3JpdGVfMl9zaG9ydCk6IERvbid0IGdyb3VwIHJlcGVhdCBpbnN0cnVjdGlvbnMKLQl3aXRoIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gdW5sZXNzIHRoaXMgd2FzIHNwZWNpZmllZC4KLQotMTk5OS0wOC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFNVQl9TRUdNRU5UX0FMSUdOKTogSWYgVEVfR08zMiwgcmV0dXJuIDQgZm9yCi0JY2VydGFpbiBzZWN0aW9ucywgdG8gbWF0Y2ggQkZEIGNoYW5nZXMuCi0KLTE5OTktMDgtMDggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X1NDUklQVFMpOiBDaGFuZ2UgLmdkYmluaXQgdG8gJChHREJJTklUKS4KLQkoRVhUUkFfU0NSSVBUUyk6IERlZmluZSB0byBrZWVwIGF1dG9tYWtlIGhhcHB5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVuYW1lIC5kZXAqIGZpbGVzIHRvIERFUCouCi0JKE1LREVQKTogUmVuYW1lIGZyb20gREVQLiAgQ2hhbmdlIGFsbCB1c2VzLiAgVXNlICQke3NyY2Rpcn0gcmF0aGVyCi0JdGhhbiAkKHNyY2RpcikuICBSZW5hbWUgVENERVAgdGFyZ2V0cyB0byBERVBUQy4gIFJlbmFtZSBPQkpERVAKLQl0YXJnZXRzIHRvIERFUE9CSi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IGFzc2VtYmx5IG9mICVsbygpKyVyZWcuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQ2hhbmdlIGFsbCB1c2VzIG9mIGl0YmwtdGVzdC1vcHMgdG8gaXRibC10b3BzIHRvCi0JYXZvaWQgcHJvYmxlbXMgb24gRE9TIGZpbGVzeXN0ZW1zLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChTZWN0aW9uKTogRG9jdW1lbnQgJ3MnIGZsYWcgZm9yIENPRkYgdmVyc2lvbi4KLQotMTk5OS0wOC0wOCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogSGFuZGxlICdzJyAoc2hhcmVkKQotCXNlY3Rpb24gZmxhZy4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIEdEQklOSVQuICBDaGFuZ2UgQUNfT1VUUFVUCi0JbGluZSB0byBjcmVhdGUgJHtHREJJTklUfSByYXRoZXIgdGhhbiAuZ2RiaW5pdC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgNiAxMjoxMjo0NCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICc/Jyk6IEFkZCBtaXNzaW5nIGJyZWFrLgotCi1GcmkgQXVnICA2IDA5OjQ2OjM1IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBBZGQgNjQgYml0IGNvbmRpdGlvbiBjb21wbGV0ZXJzLgotCi0xOTk5LTA4LTA2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IEZpeCBjaGVjayBmb3IgUElDIGxvY2FsCi0Jbm9uLWFkanVzdGFibGUgc3ltYm9scy4KLQotVGh1IEF1ZyAgNSAxNjo1Mjo1MSAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBDaGFuZ2UgY29uZGl0aW9uIGFyZ3MgdG8gaGF2ZSAnPycgcHJlZml4LgotCi1UaHUgQXVnICA1IDIzOjA1OjU2IDE5OTkgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hc3NlbWJsZSk6ICBDYWxsIGFzX2JhZCB3aGVuIHRoZXJlIGFyZSBleGNlc3MKLQlvcGVyYW5kcy4KLQotMTk5OS0wOC0wNSAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGNvbmZpZy90ZS1pbnRlcml4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChpMzg2LSotaW50ZXJpeCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXVnICA0IDEzOjEyOjE3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY2hrX2ZpZWxkX3NlbGVjdG9yKTogQWxsb3cgMyBieXRlCi0Jc2VsZWN0b3JzIGZvciBFTEYgdG9vLgotCShzZWxlY3Rvcl90YWJsZSk6IEFkZCAibHRwIiBhbmQgInJ0cCIgc2VsZWN0b3JzLgotCi0xOTk5LTA4LTA0ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IE5vIG5lZWQgdG8gY2hhbmdlCi0Jb3BlcmFuZF9zdHJpbmcgcG9pbnRlciBpbiBzZWdtZW50IHJlZyBjYXNlIGJlZm9yZSBnb3RvCi0JZG9fbWVtb3J5X3JlZmVyZW5jZS4gIEluaXRpYWxpc2UgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCBhbmQKLQlkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCBhZnRlciBkb19tZW1vcnlfcmVmZXJlbmNlIGxhYmVsLgotCShpMzg2X2luZGV4X2NoZWNrKTogQWRkIG9wZXJhbmRfc3RyaW5nIHBhcmFtLCBhbmQgcHJpbnQgZXJyb3IKLQltZXNzYWdlIG9uIGZhaWx1cmUgaGVyZS4KLQkoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6IEluc3RlYWQgb2YgaGVyZS4KLQkoaTM4Nl9vcGVyYW5kKTogQW5kIGhlcmUuCi0JKElORkVSX0FERFJfUFJFRklYKTogRW5hYmxlLgotCi0JKiBkb2MvYy1pMzg2LnRleGkgKGkzODYtMTZiaXQpOiBEb2N1bWVudCAuY29kZTE2Z2NjLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChEZWZhdWx0U2l6ZSk6IERlZmluZS4gIFJlbnVtYmVyIGZvbGxvd2luZwotCW9wY29kZV9tb2RpZmllciBkZWZpbmVzLgotCi0JRnJvbSBFdGllbm5lIExvcnJhaW4gIDxldGllbm5lLmxvcnJhaW5AaWJtLm5ldD4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0YWNrb3Bfc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkoc2V0XzE2Yml0X2NvZGVfZmxhZyk6IENsZWFyIGl0IGhlcmUuCi0JKHNldF8xNmJpdF9nY2NfY29kZV9mbGFnKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImNvZGUxNmdjYyIgZW50cnkuCi0JKG1kX2Fzc2VtYmxlKTogU2V0IGkuc3VmZml4IGZvciBpbnNucyB3aXRoIERlZmF1bHRTaXplIG1vZGlmaWVyLgotCi0xOTk5LTA4LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBBbHdheXMgdXBkYXRlIHNldF9lbmQgd2l0aAotCW5leHRfc2V0X2VuZCBldmVuIGlmIHRoZSBlbmQgc3ltYm9sIGlzIGJlaW5nIGRpc2NhcmRlZC4KLQotCSogZ2FzcC5jOiBBZGQgQVRUUklCVVRFX1VOVVNFRCBhcyBuZWVkZWQgZm9yIG5vbi1CRkRfQVNTRU1CTEVSLgotCSogb3V0cHV0LWZpbGUuYywgc3ltYm9scy5jLCBjb25maWcvdGMtaTM4Ni5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBMaWtld2lzZS4KLQkoc2VnX2luZm9fdHlwZSk6IFJlbW92ZS4KLQkoc2VnX2luZm9fb2ZmX2J5XzQpOiBDaGFuZ2UgdG8gYXJyYXkgb2Ygc2VnVC4KLQkoc19nZXRfc2VnbWVudCk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQkob2JqX3BzZXVkb190YWJsZSk6IEZ1bGx5IGluaXRpYWxpemUgc2VudGluZWwgZW50cnkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogQ29ycmVjdCBJTlNOX1NZTkMgdGVzdC4gIEZyb20KLQlSYWxmIEJhZWNobGUgPHJhbGZAdW5pLWtvYmxlbnouZGU+LgotCi0xOTk5LTA4LTAzICBFdGllbm5lIExvcnJhaW4gIDxldGllbm5lLmxvcnJhaW5AaWJtLm5ldD4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoZjE2XzMpOiBOZXcuIEZpeGVzIDE2IGJpdCAzIGJ5dGUgbm9wLgotCi0xOTk5LTA4LTAzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IEluZGVudGF0aW9uIGFuZCB3aGl0ZSBzcGFjZSBjaGFuZ2VzLgotCShpMzg2X2luZGV4X2NoZWNrKTogTmV3IGZ1bmN0aW9uLiAgQWRkIElORkVSX0FERFJfUFJFRklYIGNvZGUsIGJ1dAotCWRvbid0IGVuYWJsZSBpdCBieSBkZWZhdWx0LgotCShpMzg2X2ludGVsX29wZXJhbmQpOiBSZW1vdmUgcmVkdW5kYW50IHByb3RvdHlwZS4KLQlNb3ZlIGNoZWNrIG9uIG51bWJlciBvZiBtZW1vcnkgb3BlcmFuZHMsIGFuZCBpLm1lbV9vcGVyYW5kcysrCi0JKGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQpOiBUbyBoZXJlLgotCVJlbW92ZSBpMzg2X2ltbWVkaWF0ZSBjb2RlIGZyb20gaGVyZS4gIFJlbW92ZSBzcGVjaWFsIGNhc2UgY29kZQotCWZvciBpbnB1dCBhbmQgb3V0cHV0IHVzaW5nICglZHgpLiAgUmVtb3ZlIGJhc2UvaW5kZXggY2hlY2tzIGFuZAotCWNhbGwgaTM4Nl9pbmRleF9jaGVjayBpbnN0ZWFkLiAgU2F2ZSBpbml0aWFsIG9wZXJhbmRfc3RyaW5nCi0JYXJndW1lbnQgZm9yIGVycm9yIG1lc3NhZ2UuCi0JKGkzODZfb3BlcmFuZCk6IFJlbW92ZSByZWR1bmRhbnQgcHJvdG90eXBlLiAgTW92ZSBiYXNlL2luZGV4Ci0JY2hlY2tzIHRvIGkzODZfaW5kZXhfY2hlY2suCi0JKGkzODZfZGlzcGxhY2VtZW50KTogTW92ZSBpbnRlbCBtb2RlIGNoZWNrIGZvciBub24temVybwotCWkuZGlzcF9vcGVyYW5kCi0JKGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQpOiBUbyBoZXJlLgotCi0xOTk5LTA3LTMwICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9sb25nb3B0cyk6IEFkZCAtLW5vLXVuZGVjbGFyZWQtcmVncyBvcHRpb24uCi0JKHNwYXJjX2lwKTogV2FybiBpZiAlZzIgb3IgJWczIHJlZ2lzdGVyIGlzIHVzZWQgYW5kIG5vdCBjb3ZlcmVkCi0JYnkgLnJlZ2lzdGVyIHBzZXVkby1vcCBpZiAtNjQgYW5kIC0tbm8tdW5kZWNsYXJlZC1yZWdzLgotCShzX3JlZ2lzdGVyLCBzcGFyY19hZGp1c3Rfc3ltdGFiKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19hZGp1c3Rfc3ltdGFiLCBzcGFyY19hZGp1c3Rfc3ltdGFiKToKLQlEZWNsYXJlIHNwYXJjX2FkanVzdF9zeW10YWIgYXMgdGNfYWRqdXN0X3N5bXRhYi4KLQkqIGRvYy9jLXNwYXJjLnRleGk6IEFkZCBkZXNjcmlwdGlvbiBvZiAjaWdub3JlIHNwZWNpYWwgbGl0ZXJhbAotCWZvciAucmVnaXN0ZXIgcHNldWRvLW9wLgotCi0xOTk5LTA3LTMwICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jICh0Y19nZW5fcmVsb2MpOiAgUmVjb3JkIHRoZSB2dGFibGUgZW50cnkgaW4KLQl0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LgotCi0xOTk5LTA3LTI5ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBGaXggZ2VuZXJpYyBlcnJvciBjaGVjayBvdmVyZmxvdyB0ZXN0LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwZSk6IENoYW5nZSAlZCB0byAlbGQsICV4IHRvICVseCwgYW5kIGNhc3QKLQlYX2FkZF9udW1iZXIgdG8gbG9uZy4KLQotV2VkIEp1bCAyOCAwMjowNDoyNCAxOTk5ICAiSmVycnkgUXVpbm4iIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBBZGQgJ0onIGFuZCAnSycgY29kZQotCXByb2Nlc3NpbmcuIAotCi0xOTk5LTA3LTI3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IEdPVCwgUExULCBvcgotCVZUQUJMRSByZWxvY2F0aW9ucy4KLQotMTk5OS0wNy0yMSAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0BiaWdmb290LmNvbT4KLQotCSogY29uZmlnL3RlLWdvMzIuaCAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBjb25maWcvZ28zMi5jZmc6IExpa2V3aXNlLgotCi0xOTk5LTA3LTIxICBCcmFkIE0uIEdhcmNpYSAgPGJnYXJjaWFAZm9yZS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXZ4d29ya3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBkb2MvYy1zcGFyYy50ZXhpOiBEb2N1bWVudCAucmVnaXN0ZXIgYW5kIC5ud29yZCBwc2V1ZG8tb3BzLgotCi0xOTk5LTA3LTE2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IE9MTzEwIHJlbG9jYXRpb25zCi0Jb24gLTY0IGFuZCBub3QgcGljLgotCShvdXRwdXRfaW5zbik6IFB1dCBPTE8xMCdzIHNlY29uZGFyeSBhZGRlbmQgaW50byB0Y19maXhfZGF0YS4KLQkobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfT0xPMTAuCi0JKHRjX2dlbl9yZWxvYyk6IFJldHVybiB0d28gcmVsb2NzIGZvciBPTE8xMCwgTE8xMCBhbmQgU1BBUkMxMy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUsCi0JTUFYX1JFTE9DX0VYUEFOU0lPTik6IERlZmluZS4KLQkoVENfRklYX1RZUEUsIFRDX0lOSVRfRklYX0RBVEEsIFRDX0ZJWF9EQVRBX1BSSU5UKTogTGlrZXdpc2UuCi0KLTE5OTktMDctMTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaW50ZWxfZmxvYXRfb3BlcmFuZCk6IEFkZCBwcm90b3R5cGUsIG1ha2Ugc3RhdGljLgotCShtZF9hc3NlbWJsZSk6IExvY2FsaXplICpleHAgdmFyaWFibGUgdG8gaWYgKGZha2VfemVyb19kaXNwbGFjZW1lbnQpCi0JYmxvY2suICBQcmludCBhIHdhcm5pbmcgaWYgYW4gOC1iaXQgb3IgMTYtYml0IGNvbnN0YW50Ci0JZGlzcGxhY2VtZW50IG9yIGltbWVkaWF0ZSBpcyB0cnVuY2F0ZWQgb24gb3V0cHV0LgotCShpMzg2X2ltbWVkaWF0ZSk6IEVuc3VyZSBJbW0xNiBpcyBhbHdheXMgbGVnYWwgZm9yIGEgMTYtYml0IG1vZGUKLQlpbW1lZGlhdGUuCi0JKGkzODZfb3BlcmFuZCk6IERpc2FsbG93IGltbWVkaWF0ZSBqdW1wIGFic29sdXRlIG9wZXJhbmQuCi0KLTE5OTktMDctMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi45LjUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGR3YXJmMmRiZy5jIChkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IERvbid0IGFzc3VtZSB0aGF0IGxvbmcgbG9uZwotCW9yICVsbHggd29yay4KLQotVGh1IEp1bCAxNSAwMjo0NTozMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiLmR3b3JkIiBwc2V1ZG8tb3AuCi0JKGNvbnNfZml4X25ld19ocHBhKTogRGVyaXZlIHNpemUgb2YgZml4dXAgZnJvbSBzaXplIG9mIHRoZSBvYmplY3QuCi0KLTE5OTktMDctMTQgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBzeW1ib2xzLmMgKGRvbGxhcl9sYWJlbF9uYW1lKTogUHJlcGVuZCBMT0NBTF9MQUJFTF9QUkVGSVggaWYgaXQKLQlpcyBkZWZpbmVkLgotCSogY29uZmlnL3RjLWFybS5oIChMT0NBTF9MQUJFTF9QUkVGSVgpOiBEZWZpbmUgdG8gJy4nIGZvciBFTEYuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBTZXQgRl9TT0ZURkxPQVQgaW4gdGhlIG91dHB1dCBmaWxlCi0JaWYgLW1uby1mcHUgd2FzIGdpdmVuLgotCSh0Y19nZW5fcmVsb2MpOiBGaXggdHlwby4gIERlbGV0ZSBib2d1cyBjb2RlIHJlbGF0ZWQgdG8gR09UUEMKLQlyZWxvY3MuCi0JKGNvbnNfZml4X25ld19hcm0pOiBSZW1vdmUgbWlzbGVhZGluZyBjb21tZW50cy4KLQotMTk5OS0wNy0xNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBVc2UgZnJhZyBmaWxlIGFuZCBsaW5lIGluIHJzX29yZwotCWVycm9yIG1lc3NhZ2UuCi0JKHJlbGF4X3NlZ21lbnQpOiBMaWtld2lzZS4gIEFmdGVyIGdpdmluZyBhIHJzX29yZyBlcnJvciwgY29udmVydAotCXRoZSBmcmFnIHRvIHJzX2FsaWduIHRvIGF2b2lkIGNhc2NhZGluZyBlcnJvcnMuCi0KLTE5OTktMDctMTIgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEFkZCBzb21lIEFUVFJJQlVURV9VTlVTRUQuCi0KLTE5OTktMDctMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYW55IGZpbGVzOiBDaGFuZ2VzIHRvIGF2b2lkIGdjYyB3YXJuaW5nczogQWRkIEFUVFJJQlVURV9VTlVTRUQKLQlhcyBhcHByb3ByaWF0ZS4gIEZpbGwgaW4gc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucy4gIEFkZCB2YXJpYWJsZQotCWluaXRpYWxpemF0aW9ucy4gIEFkZCBjYXN0cy4KLQkqIGR3YXJmMmRiZy5jIChwcmludF9zdGF0cyk6IENoYW5nZSBpIHRvIHNpemVfdC4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19saXN0aW5nKTogQ2hhbmdlIGxpc3RfbGluZSB0byB1bnNpZ25lZCBpbnQuCi0KLTE5OTktMDctMTAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0VMRl06IENhbGwgU19JU19MT0NBTAotCXJhdGhlciB0aGFuIGNoZWNraW5nIGZvciBcMDAxIGFuZCBcMDAyIGluIHN5bWJvbCBuYW1lLgotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0VMRl06IExpa2V3aXNlLgotCi1UaHUgSnVsICA4IDEyOjMyOjIzIDE5OTkgIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4KLQotCSogY29uZmlndXJlLmluIChocHBhKi1saW51eC1nbnUqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotMTk5OS0wNy0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBEaXJlY3RpdmVzKTogRG9jdW1lbnQgLnRodW1iX3NldCBkaXJlY3RpdmUuIAotCi0xOTk5LTA3LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2NvbW0pOiBVc2Ugc3ltYm9sX2dldF9vYmooKSByYXRoZXIgdGhhbgotCWFjY2Vzc2luZyBzeW1ib2xQIGRpcmVjdGx5LgotCi1UdWUgSnVsICA2IDEwOjQxOjQyIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZnJvYl9zeW1ib2wpOiBBbHdheXMgcHVudCAiJGdsb2JhbCQiIHN5bWJvbAotCWZvciBFTEYuCi0KLTE5OTktMDctMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoQVJNX0VYVF9WNSk6IERlZmluZS4KLQkoQVJNX0FSQ0hfVjUsIEFSTV9BUkNIX1Y1VCk6IERlZmluZS4KLQkobWRfYmVnaW4pOiBEZXRlY3QgQVJNIHY1IGFyY2hpdGVjdHVyZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCBhcm0gdjUgc3BlY2lmaWNhdGlvbi4KLQkobWRfc2hvd191c2FnZSk6IERvY3VtbWVudCAtbWFybXY1IHN3aXRjaC4KLQotCSogZG9jL2MtYXJtLnRleGk6IERvY3VtZW50IC1tYXJtdjUgY29tbWFuZCBsaW5lIG9wdGlvbi4KLQkKLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fYWRybCk6IE5ldyBmdW5jdGlvbi4gIEltcGxlbWVudCBBRFJMIHBzZXVkbwotCW9wLgotCSh2YWxpZGF0ZV9pbW1lZGlhdGVfdHdvcGFydCk6IE5ldyBmdW5jdGlvbi4gIERldGVybWluZSBpZiBhCi0JY29uc3RhbnQgY2FuIGJlIGNvbXB1dGVkIGJ5IHR3byBBREQgaW5zdHJ1Y3Rpb25zLgotCShvdXRwdXRfaW5zdCk6IFJlbW92ZSBpdHMgY29tbWFuZCBsaW5lIHBhcmFtZXRlciAtIGl0IHdhcyBuZXZlcgotCXVzZWQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBTdXBwb3J0IEJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEUsIHVzZWQgdG8KLQlpbXBsZW1lbXQgdGhlIEFEUkwgcHNldWRvIG9wLgotCSh0Y19nZW5fcmVsb2MpOiBHZW5lcmF0ZSBhIHN1aXRhYmxlIGVycm9yIG1lc3NhZ2UgaWYgYW4gQURSTAotCWluc3RydWN0aW9uIHRyaWVzIHRvIGdlbmVyYXRlIGEgcmVhbCByZWxvYy4KLQotCSogZG9jL2MtYXJtLnRleGk6IERvY3VtZW50IE5PUCwgQURSIGFuZCBBRFJMIHBzZXVkbyBvcHMuCi0KLVRodSBKdWwgIDEgMTU6MzM6MTAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IENvbnZlcnQgdGhlIG9wY29kZSBhbmQgYWxsIGNvbXBsZXRlcnMKLQlpbnRvIGxvd2VyIGNhc2UuCi0KLTE5OTktMDYtMjcgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfdGV4dF9wKTogVXNlIDEvMCBpbnN0ZWFkIG9mIHRydWUvZmFsc2UgZm9yCi0Jbm9uIEJGRF9BU1NFTUJMRVIgY2FzZS4KLQotMTk5OS0wNi0yNiAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogTWFyayB3cml0YWJsZSBzZWN0aW9ucyBhcwotCWRhdGEuCi0KLTE5OTktMDYtMjYgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBkd2FyZjJkYmcuYyAoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBEb24ndCBjYWxsCi0Jb3V0X2VuZF9zZXF1ZW5jZSgpIHdoZW4gdGhlIGFkZHJlc3MgZGVjcmVhc2VzIGR1ZSB0byBhIG5ldyBmcmFnLgotCShnZW5fZGlyX2xpc3QpOiBTZXQgbHMuZmlsZVtpXS5kaXIgdG8gaiArIDEgKG5vdCBqKSBiZWNhdXNlIGZpbGUKLQludW1iZXJpbmcgc3RhcnRzIHdpdGggMS4KLQotMTk5OS0wNi0yMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAuY29tbSBmb3IgRUxGIGFuZCBhbGxvdwotCS5zZWN0aW9uIGZvciBDT0ZGLgotCShtY29yZV9zX3RleHQpOiBDYWxsIG9ial9lbGZfdGV4dCBmb3IgRUxGIHRhcmdldC4KLQkobWNvcmVfc19kYXRhKTogQ2FsbCBvYmpfZWxmX2RhdGEgZm9yIEVMRiB0YXJnZXQuCi0JKG1jb3JlX3Nfc2VjdGlvbik6IE5vIGxvbmdlciBFTEYgc3BlY2lmaWMuICBDYWxsIG9ial9jb2ZmX3NlY3Rpb24KLQlmb3IgQ09GRiB0YXJnZXQuCi0JKG1jb3JlX3NfYnNzKTogTmV3IGZ1bmN0aW9uOiAgRHVtcCBsaXRlcmFsIHRhYmxlIGJlZm9yZSBjaGFuZ2luZwotCXNlY3Rpb25zLgotCShtY29yZV9zX2NvbW0pOiBOZXcgZnVuY3Rpb246ICBEdW1wIGxpdGVyYWwgdGFibGUgYmVmb3JlIGNoYW5naW5nCi0Jc2VjdGlvbnMuCi0JCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbiwgb2JqX2VsZl9kYXRhLCBvYmpfZWxmX3RleHQpOgotCU5vIGxvbmdlciBzdGF0aWMgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl9jb21tb24sIG9ial9lbGZfZGF0YSwgb2JqX2VsZl90ZXh0KToKLQlQcm92aWRlIHByb3RvdHlwZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KLQotMTk5OS0wNi0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3RleHRfcCk6IFJld3JpdGUgbm9uIEJGRF9BU1NFTUJMRVIgY2FzZSB0byB1c2UKLQlhIGxpc3Qgb2YgbmFtZXMsIHRvIHRyeSBvYmpfc2VnbWVudF9uYW1lLCBhbmQgdG8gdHJ5IGFiYnJldmlhdGVkCi0JbmFtZXMgd2hlbiB1c2luZyBDT0ZGIHdpdGhvdXQgbG9uZyBzZWN0aW9uIG5hbWVzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogTW9yZSB1c2Ugb2Ygc3ltYm9sIGFjY2Vzc29yIGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy90Yy1hcmMuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtZDMwdi5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk4NjAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tY29yZS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12ODUwLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYXJjLmMgKGdldF9hcmNfZXhwX3JlbG9jX3R5cGUpOiBDaGFuZ2UgdXNlcyBvZgotCXN5X3ZhbHVlIHdpdGggYXBwcm9wcmlhdGUgYWNjZXNzb3IgZnVuY3Rpb25zLgotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtZDEwdi5jIChBVF9XT1JEX1ApOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHJlZ19uYW1lX3NlYXJjaCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9lY29mZl9zZXRfZXh0KTogQ2hhbmdlIHVzZXMgb2YgYnN5bSB0bwotCXVzZSBzeW1ib2xfZ2V0X2JmZHN5bSBpbnN0ZWFkLgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMjIgIEpvbmF0aGFuIExhcm1vdXIgIDxqbGFybW91ckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1hcmMuYyAodGNfZ2VuX3JlbG9jKTogVXNlIHN5bWJvbF9nZXRfYmZkc3ltIHRvIGdldCBhdAotCXRoZSBzeW1ib2wsIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgYnN5bSBtZW1iZXIuCi0JKiBjb25maWcvdGMtZDEwdi5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1jb3JlLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy10aWMzMC5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDIxIDE2OjQ1OjE5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlKTogUmVuYW1lZCBmcm9tIGVsZjMyX2hwcGFfcmVsb2NfdHlwZS4KLQkoaHBwYV9nZW5fcmVsb2NfdHlwZSk6IENvbmRpdGlvbmFsaXplIG9uIEJGRDY0LgotCSh0Y19nZW5fcmVsb2MpOiBSZS1lbmFibGUgRUxGIHJlbG9jYXRpb25zLgotCSogdGMtaHBwYS5oIChUQVJHRVRfRk9STUFUKTogSGFuZGxlIGVsZjY0LWhwcGEgZm9ybWF0LgotCi0xOTk5LTA2LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChsZHN0X2V4dGVuZCk6IEFkZCBwYXJlbnRoZXNlcyB0byBhdm9pZAotCXdhcm5pbmcuCi0JKGRvX2xkc3QpOiBNb3ZlIGFzc2lnbm1lbnQgb3V0IG9mIGlmIGNvbmRpdGlvbi4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBjYXN0cyB0byBhdm9pZCBwcmludGYgZm9ybWF0IHdhcm5pbmdzLiAgQWRkCi0JcGFyZW50aGVzZXMgdG8gYXZvaWQgd2FybmluZy4KLQotMTk5OS0wNi0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChhcm1fYWRqdXN0X3N5bXRhYik6IFVzZSBzeW1ib2xfZ2V0X2JmZHN5bSgpCi0JbWFjcm8gdG8gZ2V0IGF0IHRoZSBCRkQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIEdBUyBzeW1ib2wuCi0KLTE5OTktMDYtMTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmM6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMTggMTQ6MzQ6MTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmM6IEdlbmVyYWwgY2xlYW51cHMgb2YgRUxGIHN1cHBvcnQuICBObyBtb3JlIHNwYWNlcwotCWFuZCBzdWJzcGFjZXMgZm9yIEVMRi4KLQkoR0RCX0RFQlVHX1NQQUNFX05BTUUpOiBEZWxldGUgZGVmaW5pdGlvbiBmb3IgRUxGLgotCShHREJfU1RSSU5HU19TVUJTUEFDRV9OQU1FKTogTGlrZXdpc2UuCi0JKEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUpOiBMaWtld2lzZQotCShVTldJTkRfU0VDVElPTl9OQU1FKTogTGlrZXdpc2UuCi0JKHNwYWNlL3N1YnNwYWNlIHJlbGF0ZWQgc3RydWN0dXJlcyk6IENvbmRpdGlvbmFsaXplIGRlZmluaXRpb25zCi0Jb24gT0JKX1NPTS4KLQkoc3BhY2Uvc3Vic3BhY2UgZGlyZWN0aXZlcyBhbmQgc3VwcG9ydCByb3V0aW5lcyk6IENvbmRpdGlvbmFsaXplCi0JZGVmaW5pdGlvbnMgYW5kIHJlZmVyZW5jZXMvdXNlcyBvbiBPQkpfU09NLgotCShsYWJlbF9zeW1ib2xfc3RydWN0KTogRm9yIEVMRiwgdHJhY2sgdGhlIHN5bWJvbCdzIHNlZ21lbnQuICBGb3IKLQlTT00gdHJhY2sgaXRzIHNwYWNlLgotCShwYV9kZWZpbmVfbGFiZWwsIHBhX3VuZGVmaW5lX2xhYmVsLCBwYV9nZXRfbGFiZWwpOiBDb3JyZXNwb25kaW5nCi0JY2hhbmdlcy4KLQkoVVNFX0FMSUFTRVMpOiBLaWxsIGZvciBib3RoIFNPTSAmIEVMRi4KLQkocGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3NwYWNlcyk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkocGFfc3BhY2UsIHBhX3N1YnNwYWNlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShwYV9zcGFjZXNfYmVnaW4pOiBDb3JyZXNwb25kaW5nIGNoYWduZXMuCi0JKG1kX2JlZ2luKTogRG8gbm90IG11Y2sgYXJvdW5kIHdpdGggc3BhY2Uvc3Vic3BhY2Ugc3R1ZmYgZm9yCi0JT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4KTogVGVtcG9yYXJpbHkgZGlzYWJsZSBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWZmCi0JZm9yIE9CSl9FTEYuCi0JKHRjX2dlbl9yZWxvYyk6IFRlbXBvcmFyaWx5IGRpc2FibGUgcmVsb2NhdGlvbiBnZW5lcmF0aW9uIGZvcgotCU9CSl9FTEYKLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogU2ltaWxhcmx5LgotCi0xOTk5LTA2LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRodW1iX3NldCk6IE5ldyBwc2V1ZG8gb3AuCi0JKHRleHQsIGRhdGEsIHNlY3Rpb24pOiBPdmVycmlkZSB0aGVzZSBwc2V1ZG8gb3BzIHdpdGggQVJNCi0Jc3BlY2lmaWMgdmVyc2lvbnMuCi0JKHNfdGh1bWJfc2V0KTogTmV3IGZ1bmN0aW9uOiBQZXJmb3JtIHRoZSBzYW1lIGFzIGEgLnNldCBwc2V1ZG8KLQlvcCwgYnV0IGFsc28gbWFyayB0aGUgYWxpYXMnZWQgc3ltYm9sIGFzIGJlaW5nIGEgVGh1bWIKLQlmdW5jdGlvbi4KLQkoYXJtX3NfdGV4dCk6IE5ldyBmdW5jdGlvbjogUGVyZm9ybSB0aGUgc2FtZSBhcyB0aGUgLnRleHQKLQlwc2V1ZG8gb3AsIGJ1dCBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVmb3JlIGNoYW5naW5nCi0Jc2VjdGlvbnMuIAotCShhcm1fc19kYXRhKTogTmV3IGZ1bmN0aW9uOiBQZXJmb3JtIHRoZSBzYW1lIGFzIHRoZSAuZGF0YQotCXBzZXVkbyBvcCwgYnV0IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUgY2hhbmdpbmcKLQlzZWN0aW9ucy4gCi0JKGFybV9zX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb246IFBlcmZvcm0gdGhlIHNhbWUgYXMgdGhlCi0JLnNlY3Rpb24gcHNldWRvIG9wLCBidXQgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGJlZm9yZSBjaGFuZ2luZyAKLQlzZWN0aW9ucy4gCi0JKGFybV9jbGVhbnVwKTogRG8gbm90IHJlc2V0IHRoZSBjdXJyZW50IHNlY3Rpb24gYmVmb3JlIGR1bXBpbmcKLQl0aGUgbGl0ZXJhbCBwb29sLgotCi0xOTk5LTA2LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9sb25nb3B0cyk6IEZpeCBPUFRJT05fV0FSTl9VTk1BVENIRUQgYW5kCi0JT1BUSU9OX05PX1dBUk5fVU5NQVRDSEVEIGVudHJpZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIGlmIGFuIHVucmVjb2duaXNlZAotCW9wdGlvbiBpcyBlbmNvdW50ZXJlZC4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZG9fbm90X2lnbm9yZV9oYXNoKTogTmV3IHZhcmlhYmxlLgotCShnZXRfb3BlcmFuZHMpOiBXaGVuIHBhcnNpbmcgYW4gZXhwcmVzc2lvbiBhZnRlciBhbiAnQCcgc3ltYm9sCi0JaGFzIGJlZW4gZGV0ZWN0ZWQsIGRvIG5vdCBpZ25vcmUgJyMnIHN5bWJvbHMuCi0JKG1kX29wZXJhbmQpOiBPbmx5IGlnbm9yZSAnIycgc3ltYm9scyBpZiBkb19ub3RfaWdub3JlX2hhc2ggaXMKLQlmYWxzZS4gCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBLLiBSaWNoYXJkIFBpeGxleSA8cmljaEBub2lyLmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKHBwYy0qLXZ4d29ya3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNi0xMiAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogY29uZmlnL3RjLWFybS5jICh0Y19nZW5fcmVsb2MpOiBGaXggaGFuZGxpbmcgb2YgR09UUEMgcmVsb2NzLgotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBSYXRoZXIgdGhhbiBuZXZlciByZWR1Y2luZyByZWxvYwotCXdoaWNoIHJlZmVyIHRvIHN5bWJvbHMgaW4gbGlua29uY2Ugc2VjdGlvbnMsIHBlcm1pdCByZWR1Y2luZyB0aGUKLQlyZWxvY3MgaWYgdGhlIHN5bWJvbCBpcyBsb2NhbC4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3RleHRfcCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKHN1YnNlZ190ZXh0X3ApOiBEZWNsYXJlLgotCSogcmVhZC5jIChkb19hbGlnbik6IFVzZSBzdWJzZWdfdGV4dF9wIHRvIHNldCB0aGUgZGVmYXVsdCBmaWxsLgotCSogd3JpdGUuYyAoc3Vic2Vnc19maW5pc2gpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfbWF5YmVfdGV4dCk6IERvbid0IGRlZmluZS4KLQkobWRfZG9fYWxpZ24pOiBVc2Ugc3Vic2VnX3RleHRfcCB0byBzZXQgdGhlIGRlZmF1bHQgZmlsbC4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMTIgIERhdmlkIE8nQnJpZW4gIDxvYnJpZW5AZnJlZWJzZC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogKGlbMzQ1Nl04Ni0qLWZyZWVic2QqKTogTm93IGRlZmF1bHRzIHRvIEVMRi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jOiBJbmNsdWRlIGVsZi9kd2FyZjIuaCB3aXRoICIiLCBub3QgPD4uCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbW1lZGlhdGUpOiBSZW1vdmUgdW51c2VkIGxhYmVsCi0Jc2VnX3VuaW1wbGVtZW50ZWQuCi0KLQkqIHN0cnVjLXN5bWJvbC5oOiBQdXQgbG9jYWxfc3ltYm9sIGNvZGUgaW4gaWZkZWYgQkZEX0FTU0VNQkxFUi4KLQkqIHN5bWJvbHMuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFJlZmVyIGRpcmVjdGx5IHRvCi0Jc3lfbmV4dCBmaWVsZCB3aGVuIHRha2luZyBhZGRyZXNzLCByYXRoZXIgdGhhbiBzeW1ib2xfbmV4dC4KLQotCSogZHdhcmYyZGJnLmM6IENoYW5nZSBiZmRfdm1hIHRvIGFkZHJlc3NUIGFuZCBiZmRfc2lnbmVkX3ZtYSB0bwotCW9mZnNldFQuCi0JKG91dF9zZXRfYWRkcik6IERvbid0IHVzZSBCWVRFU19QRVJfQUREUkVTUy4gIEluc3RlYWQsIGdldCB0aGUKLQl2YWx1ZSBmcm9tIHRoZSBvdXRwdXQgZmlsZSBhcmNoaXRlY3R1cmUuCi0JKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogSWZkZWYgQkZEX0FTU0VNQkxFUiBzcGVjaWZpYyBjb2RlLgotCSogZHdhcmYyZGJnLmg6IENoYW5nZSBiZmRfdm1hIHRvIGFkZHJlc3NULgotCi0xOTk5LTA2LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZHdhcmYyZGJnLmg6IFVzZSBQQVJBTVMgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCi0xOTk5LTA2LTExICBNYXJ0aW4gRG9yZXkgIDxtZG9yZXlAbWFkZ2UuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgYWRkIHN5bWJvbCB2YWx1ZSBmb3IgaTk2MCBFTEYuCi0JKiBjb25maWcvdGMtaTk2MC5jIChzX2xlYWZwcm9jKTogRG9uJ3QgY2FsbCB0Y19zZXRfYmFsX29mX2NhbCBpZgotCU9CSl9FTEYuCi0JKG1kX2FwcGx5X2ZpeCk6IFNpbXBsaWZ5IEJGRF9BU1NFTUJMRVIgaGFuZGxpbmcuCi0KLTE5OTktMDYtMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBSZW1vdmUgcHVzaHNlY3Rpb24gYW5kCi0JcG9wc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWRkIGRlZmF1bHQgY2FzZSB0byByZWxvYyBzd2l0Y2guCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogT25seSBkZWNsYXJlIGluZXNjYXBlIGlmCi0JUVVPVEVTX0lOX0lOU04uCi0KLQkqIGl0Ymwtb3BzLmMgKGl0YmxfZGlzYXNzZW1ibGUpOiBDaGFuZ2Ugc3ByaW50ZiBmb3JtYXQgc3RyaW5ncyB0bwotCW1hdGNoIHBhcmFtZXRlcnMuCi0JKGZpbmRfZW50cnlfYnl2YWwpOiBBZGQgcGFyZW5zIHRvIGF2b2lkIHdhcm5pbmcuCi0KLQkqIGFzLmM6IElmIEhBVkVfSVRCTF9DUFUsIGluY2x1ZGUgIml0Ymwtb3BzLmgiLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3QgcGVybWl0IHN1YnRyYWN0aW9uIG9mCi0JdW5kZWZpbmVkIHN5bWJvbHMuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IERvbid0IHVzZSBzaWRlLWVmZmVjdCBleHByZXNzaW9uCi0Jd2l0aCBpc29jdGFsLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3ludGhldGl6ZV9zZXR1dywgc3ludGhldGl6ZV9zZXRzdywKLQlzeW50aGV0aXplX3NldHgpOiBOZXcgZnVuY3Rpb25zLgotCShtZF9hc3NlbWJsZSk6IEJyb2tlbiB0aGUgc3BlY2lhbCBjYXNlcyBpbnRvIHRoZSBhYm92ZQotCWZ1bmN0aW9ucy4gTWFrZSBjb21waWxlciBoYXBweSBpZiBzaXplb2YoYmZkX3ZtYSk9PTQuCi0JRml4IHNldGhpIGdlbmVyYXRlZCBmcm9tIHNldC9zZXR1dy4gSWYgaW5zdHJ1Y3Rpb25zIGhhdmUgYSByZWxsb2MsCi0JYWx3YXlzIGNsZWFyIHRoZSBmaWVsZHMgdG8gYmUgcmVsb2NhdGVkIGluIHRoZSBvcGNvZGUuCi0JKHNwYXJjX2lwKTogUmVtb3ZlIHNwZWNpYWxfY2FzZSBnbG9iYWwgdmFyaWFibGUuCi0KLTE5OTktMDYtMTAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEpvaG4gVy4gV296bmFjayA8andvem5hY2tAY29uY2VudHJpYy5uZXQ+OgotCSogaXRibC1vcHMuYyAoaXRibF9nZXRfcmVnX3ZhbCk6IEFkZCBwdmFsIHBhcmFtZXRlci4gIFJldHVybgotCWluZGljYXRpb24gb2Ygc3VjY2VzcyByYXRoZXIgdGhhbiBhIHZhbHVlLgotCShpdGJsX2dldF92YWwpOiBMaWtld2lzZS4KLQkoaXRibF9nZXRfZmllbGQpOiBVc2Ugc3RyY3Nwbi4gIENoYW5nZSBkZWxpbWl0ZXJzIHRvIGluY2x1ZGUKLQlwYXJlbnMuCi0JKiBpdGJsLW9wcy5oIChpdGJsX2dldF9yZWdfdmFsKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShpdGJsX2dldF92YWwpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBVcGRhdGUgY2FsbCB0byBpdGJsX2dldF9yZWdfdmFsLgotCi0JKiBzeW1ib2xzLmMgKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBDb252ZXJ0IGxvY2FsIHN5bWJvbHMgdG8KLQlyZWd1bGFyIHN5bWJvbHMuCi0KLTE5OTktMDYtMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIEFSTTkyMCBhbmQKLQlBUk05MjB0LiAKLQotMTk5OS0wNi0wNyAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXNzZW1ibGUpOiBGaXggdXAgc2V0eCwgc3VwcG9ydCBzZXRzdy4KLQlPcHRpbWl6ZSBzZXQgaWYgc2l6ZW9mKGJmZF92bWEpID09IDY0LgotCShzcGFyY19pcCk6IEZpeCBzZXRoaSAtIHdpdGhvdXQgJWhpKCkgaXQgc2hvdWxkIGdlbmVyYXRlCi0JUl9TUEFSQ18yMiByZWxvYywgbm90IFJfU1BBUkNfSEkyMi4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQzIyLgotCi0xOTk5LTA2LTA3ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbik6IEhhbmRsZSBuYXRpdmUgd29yZHNpemUgYWxpYXNlcy4KLQkoc19uY29ucyk6IE5ldyBmdW5jdGlvbi4KLQkobmF0aXZlX29wX3RhYmxlKTogTmV3IHRhYmxlLgotCShzcGFyY19pcCk6IEJlIG1vcmUgc3RyaWN0IG9uICVoaSgpIGV0Yy47IHByZXBhcmUgYXNzZW1ibGVyIGZvcgotCVJfU1BBUkNfT0xPMTAgaGFuZGxpbmcuCi0KLU1vbiBKdW4gIDcgMTA6MjI6MTYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZXhwci5oIChzdHJ1Y3QgZXhwcmVzc2lvblMpOiBSZXZlcnQgbGFzdCBjaGFuZ2U7IHdpZGVuIFhfb3AuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYmVnaW4pOiBDaGVjayB0aGUgZmllbGQgaXMgd2lkZSBlbm91Z2guCi0KLU1vbiBKdW4gIDcgMTE6MjU6MTYgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoVEFSR0VUX0NQVV9DRklMRVMpOiBBZGQgY29uZmlnL3RjLWZyMzAuYy4KLQkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgY29uZmlnL3RjLWZyMzAuaC4KLQkoVEFSR19FTlZfSEZJTEVTKTogQWRkIGNvbmZpZy90ZS1lcG9jLXBlLmguCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogSW4gTVJJIG1vZGUgaWYgY2FsbGVkIGFzCi0JYGNvbW1vbicgcGFzcyBvbiB0byBzX21yaV9jb21tb24uCi0JKGVsZl9wc2V1ZG9fdGFibGUpOiBQYXNzIDEgdG8gb2JqX2VsZl9jb21tb24gZm9yIGBjb21tb24nLiAKLQotMTk5OS0wNi0wNiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogRG9uJ3QgZnJlZSB0aGUgcmV0dXJuCi0JdmFsdWUgb2YgZGVtYW5kX2NvcHlfQ19zdHJpbmcuCi0KLTE5OTktMDYtMDUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IE1pcnJvciB0aGUgc2VjdGlvbiBzeW1ib2wKLQljcmVhdGlvbiBsb2dpYyBmcm9tIG9ial9lbGZfY3JlYXRlX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9wc2V1ZG9fdGFiKTogQWRkIHB1c2hzZWN0aW9uL3BvcHNlY3Rpb24uCi0JKHNlY3Rpb25fc3RhY2spOiBOZXcuCi0JKHNwZWNpYWxfc2VjdGlvbnMpOiBNYWtlIGNvbnN0LgotCShvYmpfZWxmX3NlY3Rpb24pOiBHdXQgYW5kIHJld3JpdGUgcGFyc2luZy4KLQkob2JqX2VsZl9jaGFuZ2Vfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiBicm9rZW4gb3V0IG9mIG9ial9lbGZfc2VjdGlvbi4KLQkob2JqX2VsZl9wYXJzZV9zZWN0aW9uX2xldHRlcnMpOiBMaWtld2lzZS4KLQkob2JqX2VsZl9zZWN0aW9uX3dvcmQpOiBMaWtld2lzZS4KLQkob2JqX2VsZl9zZWN0aW9uX3R5cGUpOiBMaWtld2lzZS4KLQkob2JqX2VsZl9wcmV2aW91cyk6IFRyZWF0IGFzIGEgdG9nZ2xlLgotCShvYmpfZWxmX3BvcHNlY3Rpb24pOiBOZXcuCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19zZWN0aW9uX3dvcmQpOiBUYWtlIHN0citsZW4gbm90IHB0cl9zdHIuCi0JKHBwY19zZWN0aW9uX3R5cGUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1wcGMuaDogTGlrZXdpc2UuCi0KLQkqIGV4cHIuaCAoc3RydWN0IGV4cHJlc3Npb25TKTogRG9uJ3QgbWFrZSBYX29wIGEgYml0ZmllbGQuCi0JKiBjb25maWcvdGMtYWxwaGEuYzogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkobWRfYXBwbHlfZml4KSBbY2FzZSBHUFJFTF06IFVzZSBub3dfc2VnIGluc3RlYWQgb2YgYWJzb2x1dGVfc2VjdGlvbi4KLQkobG9hZF9leHByZXNzaW9uLCBlbWl0X2lyX2xvYWQsIGVtaXRfbG9hZHN0b3JlLCBlbWl0X2pzcmptcCk6IExpa2V3aXNlLgotCi0xOTk5LTA2LTA1ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkd2FyZjJkYmcuYyAoKik6IENvbnZlcnQgdG8gSyZSICsgcHJvdG90eXBlcy4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBLaWxsIHVudXNlZCB2YXJpYWJsZXMuCi0JKGR3YXJmMl9maW5pc2gpOiBMaWtld2lzZS4KLQkoZHdhcmYyX3doZXJlKTogTGlrZXdpc2UuCi0JKGR3YXJmMl9kaXJlY3RpdmVfZmlsZSk6IElmIHdlJ3ZlIG9ubHkgZ290IGEgc3RyaW5nLAotCWhhbmQgb2ZmIHRvIHNfYXBwX2ZpbGUuCi0JKiBlY29mZi5jOiBNb3ZlIHRoZSBpbmNsdWRlIG9mIGVjb2ZmLmguCi0JKiBzeW1ib2xzLmggKFNfSVNfRlVOQ1RJT04pOiBQcm90b3R5cGUuCi0KLQkqIHJlYWQuYyAoTEVYX0hBU0gpOiBTdXBwbHkgYSBkZWZhdWx0LgotCShsZXhfdHlwZSk6IFVzZSBpdC4KLQkoc19nbG9ibCk6IFVwZGF0ZSBgYycgYWZ0ZXIgc2tpcHBpbmcgd2hpdGVzcGFjZS4KLQkqIHJlYWQuaCAoTEVYX0VORF9OQU1FLCBpc19uYW1lX2VuZGVyKTogTmV3LgotCSogZXhwci5jIChnZXRfc3ltYm9sX2VuZCk6IFJlc3BlY3QgaXQuCi0KLTE5OTktMDYtMDQgIE1hcmsgS2xlaW4gPG1rbGVpbkBkaXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9iZWdpbik6IENvbnZlcnQgbG9jYWwgc3ltYm9sIGR1bW15X3N5bWJvbAotCXRvIHJlYWwgaWYgT0JKX1NPTQotCSh0Y19nZW5fcmVsb2MpOiBTdGlsbCBuZWVkIGJmZF9hYnNfc3ltYm9sIGluIHNvbWUgcmVsb2NzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBVcGRhdGUgZm9yIHN5bWJvbCBoYW5kbGluZyBjaGFuZ2VzLgotCi0xOTk5LTA2LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY2dlbi5jOiBVcGRhdGUgZm9yIHN5bWJvbCBoYW5kbGluZyBjaGFuZ2VzLgotCSogY29uZmlnL3RjLW0zMnIuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKiBjb25maWcvdGMtaHBwYS5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWFybS5oOiBVcGRhdGUgZm9yIHN5bWJvbCBoYW5kbGluZyBjaGFuZ2VzLgotCSogY29uZmlnL3RjLWFybS5jOiBMaWtld2lzZS4KLQkoc3ltYm9sX21ha2VfZW1wdHkpOiBSZW1vdmUuICBKdXN0IHVzZSBzeW1ib2xfY3JlYXRlLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9zZXRfdGMpOiBDb3JyZWN0IG5hbWUuCi0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoJChPQkpTKSk6IERvbid0IGRlcGVuZCB1cG9uIHN0cnVjLXN5bWJvbC5oLgotCSguZGVwMSwgLnRjZGVwLCAub2JqZGVwKTogQ3JlYXRlIGl0YmwtcGFyc2UuaC4KLQkqIGRlcC1pbi5zZWQ6IERvbid0IHJlbW92ZSBzdHJ1Yy1zeW1ib2wuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKFN5bWJvbHMpOiBEZXNjcmliZSBjaGFuZ2VzIGluIHN5bWJvbAotCWhhbmRsaW5nLgotCi0xOTk5LTA2LTAzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkd2FyZjJkYmcuYyAoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBVc2Ugc2VjdGlvbl9zeW1ib2wKLQlpbnN0ZWFkIG9mIGRvaW5nIHRoZSB3b3JrIGJ5IGhhbmQuCi0KLTE5OTktMDYtMDMgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBkd2FyZjJkYmcuYyAoSU5JVElBTF9TVEFURSk6IE5ldyBtYWNybyBlbmNhcHN1bGF0aW5nIGluaXRpYWwKLQlzdGF0ZSBvZiBsaW5lIHN0YXRlLW1hY2hpbmUuCi0JKHN0cnVjdCBscyk6IENvbGxlY3QgRFdBUkYyIGxpbmUgc3RhdGUtbWFjaGluZSBzdGF0ZSBpbiBuZXcgbWVtYmVyCi0JU00uICBBZGQgbWVtYmVyIEVNUFRZX1NFUVVFTkNFIHRvIGtlZXAgdHJhY2sgaWYgYSBjb2RlIHNlcXVlbmNlCi0JcmVzdWx0ZWQgaW4gYW55IERXQVJGMiBkaXJlY3RpdmVzLgotCShyZXNldF9zdGF0ZV9tYWNoaW5lKTogTmV3IGZ1bmN0aW9uLgotCShvdXRfZW5kX3NlcXVlbmNlKTogRGl0dG8uCi0JKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogV2hlbiBzd2l0Y2hpbmcgc2VjdGlvbnMgb3Igc3dpdGNoaW5nIHRvIGEKLQlsb3dlciB0ZXh0IGFkZHJlc3MsIGNhbGwgb3V0X2VuZF9zZXF1ZW5jZSgpIGZpcnN0IHRvIHRlcm1pbmF0ZSB0aGUKLQlwcmV2aW91cyBjb2RlIHNlcXVlbmNlIGFzIGNvZGUgc2VxdWVuY2VzIE1VU1QgaGF2ZSBtb25vdG9uaWNhbGx5Ci0JaW5jcmVhc2luZyBhZGRyZXNzZXMuCi0JKGR3YXJmMl9maW5pc2gpOiBDYWxsIG91dF9lbmRfc2VxdWVuY2UoKSBpbnN0ZWFkIG9mIG9wZW4gY29kaW5nIGl0LgotCi0xOTk5LTA2LTAzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IEFkZCBvcHRpb24gLWdkd2FyZjIgdG8gYWxsb3cgcmVxdWVzdGluZwotCURXQVJGMiBkZWJ1ZyBpbmZvIChsaW5lIGluZm9ybWF0aW9uIG9ubHksIGF0IHRoaXMgcG9pbnQpLgotCSogYXMuaDogVXBkYXRlIGNvbW1lbnQgYWJvdXQgc3VwcG9ydGVkIGRlYnVnIGZvcm1hdHMuCi0JKiBkd2FyZjJkYmcuYywgZHdhcmYyZGJnLmg6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmFtIChHQVNfQ0ZJTEVTLCBIRklMRVMsIEdFTkVSSUNfT0JKUyk6IEFkZCB0aGVtLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBEb24ndCB1c2UgWyBmb3IgcGFyZW5zIGlmIHdlIHdhbnQgYW4gaW5kZXggb3AuCi0JKG9wX2VuY29kaW5nKTogU3dpdGNoIFsgaW50byBPX2luZGV4LCBpZiBkZXNpcmVkLgotCShvcF9yYW5rKTogUmVudW1iZXIgd2l0aCBPX2luZGV4IG9uIGJvdHRvbS4KLQkoZXhwcik6IElmIE9faW5kZXgsIG1hdGNoIGNsb3NpbmcgYnJhY2tldC4KLQkqIGV4cHIuaCAoT19pbmRleCk6IE5ldy4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDb25kaXRpb25hbGx5IGFsbG93IG1hdGNoZWQgIgotCWluIGxpbmVzIHBhc3NlZCB0byBtZF9hc3NlbWJsZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCBgY29tbW9uJy4KLQotMTk5OS0wNi0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3Igc3RvcmluZyBsb2NhbCBzeW1ib2xzIGluIGEgc21hbGwgc3RydWN0dXJlIHRvIHNhdmUKLQltZW1vcnkgd2hlbiBhc3NlbWJsaW5nIGxhcmdlIGZpbGVzLgotCSogYXMuaDogRG9uJ3QgaW5jbHVkZSBzdHJ1Yy1zeW1ib2wuaC4KLQkoc3ltYm9sUyk6IEFkZCB0eXBlZGVmLgotCSogc3ltYm9scy5jOiBJbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShsb2NhbF9oYXNoKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc2F2ZV9zeW1ib2xfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGZyb20gc3ltYm9sX2NyZWF0ZS4KLQkoc3ltYm9sX2NyZWF0ZSk6IENhbGwgc2F2ZV9zeW1ib2xfbmFtZS4KLQkobG9jYWxfc3ltYm9sX2NvdW50KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobG9jYWxfc3ltYm9sX2NvbnZlcnNpb25fY291bnQpOiBMaWtld2lzZS4KLQkoTE9DQUxfU1lNQk9MX0NIRUNLKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfbWFrZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxvY2FsX3N5bWJvbF9jb252ZXJ0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29sb24pOiBIYW5kbGUgbG9jYWwgc3ltYm9scy4gIENyZWF0ZSBsb2NhbCBzeW1ib2wgZm9yIGxvY2FsCi0JbGFiZWwgbmFtZS4KLQkoc3ltYm9sX3RhYmxlX2luc2VydCk6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLgotCShzeW1ib2xfZmluZF9vcl9tYWtlKTogQ3JlYXRlIGxvY2FsIHN5bWJvbCBmb3IgbG9jYWwgbGFiZWwgbmFtZS4KLQkoc3ltYm9sX2ZpbmRfYmFzZSk6IENoZWNrIGZvciBsb2NhbCBzeW1ib2wuCi0JKHN5bWJvbF9hcHBlbmQsIHN5bWJvbF9pbnNlcnQpOiBDaGVjayBmb3IgbG9jYWwgc3ltYm9scy4KLQkoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMsIHN5bWJvbF9yZW1vdmUpOiBMaWtld2lzZS4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbik6IExpa2V3aXNlLgotCShjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKTogTGlrZXdpc2UuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuCi0JKHJlc29sdmVfbG9jYWxfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocmVzb2x2ZV9sb2NhbF9zeW1ib2xfdmFsdWVzKTogTmV3IGZ1bmN0aW9uLgotCShTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBIYW5kbGUgbG9jYWwgc3ltYm9scy4KLQkoU19JU19GVU5DVElPTiwgU19JU19FWFRFUk5BTCwgU19JU19XRUFLLCBTX0lTX0NPTU1PTik6IExpa2V3aXNlLgotCShTX0lTX0RFRklORUQsIFNfSVNfREVCVUcsIFNfSVNfTE9DQUwsIFNfR0VUX05BTUUpOiBMaWtld2lzZS4KLQkoU19HRVRfU0VHTUVOVCwgU19TRVRfU0VHTUVOVCwgU19TRVRfRVhURVJOQUwpOiBMaWtld2lzZS4KLQkoU19DTEVBUl9FWFRFUk5BTCwgU19TRVRfV0VBSywgU19TRVRfTkFNRSk6IExpa2V3aXNlLgotCShzeW1ib2xfcHJldmlvdXMsIHN5bWJvbF9uZXh0KTogTmV3IGZ1bmN0aW9ucy4KLQkoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCShzeW1ib2xfc2V0X2ZyYWcsIHN5bWJvbF9nZXRfZnJhZyk6IExpa2V3aXNlLgotCShzeW1ib2xfbWFya191c2VkLCBzeW1ib2xfY2xlYXJfdXNlZCwgc3ltYm9sX3VzZWRfcCk6IExpa2V3aXNlLgotCShzeW1ib2xfbWFya191c2VkX2luX3JlbG9jKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jLCBzeW1ib2xfdXNlZF9pbl9yZWxvY19wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX21yaV9jb21tb24sIHN5bWJvbF9jbGVhcl9tcmlfY29tbW9uKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tcmlfY29tbW9uX3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX21hcmtfd3JpdHRlbiwgc3ltYm9sX2NsZWFyX3dyaXR0ZW4pOiBMaWtld2lzZS4KLQkoc3ltYm9sX3dyaXR0ZW5fcCk6IExpa2V3aXNlLgotCShzeW1ib2xfbWFya19yZXNvbHZlZCwgc3ltYm9sX3Jlc29sdmVkX3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX3NlY3Rpb25fcCwgc3ltYm9sX2VxdWF0ZWRfcCk6IExpa2V3aXNlLgotCShzeW1ib2xfY29uc3RhbnRfcCk6IExpa2V3aXNlLgotCShzeW1ib2xfZ2V0X2JmZHN5bSwgc3ltYm9sX3NldF9iZmRzeW0pOiBMaWtld2lzZS4KLQkoc3ltYm9sX2dldF9vYmosIHN5bWJvbF9zZXRfb2JqKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9nZXRfdGMsIHN5bWJvbF9zZXRfdGMpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2JlZ2luKTogSW5pdGlhbGl6ZSBsb2NhbF9oYXNoLgotCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLgotCShzeW1ib2xfcHJpbnRfc3RhdGlzdGljcyk6IFByaW50IGxvY2FsIHN5bWJvbCBzdGF0aXN0aWNzLgotCSogc3ltYm9scy5oOiBJbmNsdWRlICJzdHJ1Yy1zeW1ib2wuaCIgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JRGVjbGFyZSBuZXcgc3ltYm9scy5jIGZ1bmN0aW9ucy4gIE1vdmUgbWFueSBkZWNsYXJhdGlvbnMgaGVyZSBmcm9tCi0Jc3RydWMtc3ltYm9sLmguCi0JKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMpOiBEZWZpbmUgaWYgbmVlZGVkLgotCSogc3RydWMtc3ltYm9sLmggKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMpOiBEb24ndCBzZXQuCi0JKHN0cnVjdCBzeW1ib2wpOiBNb3ZlIGJzeW0gdG8gbWFrZSBpdCBjbGVhcmx5IHRoZSBmaXJzdCBmaWVsZC4KLQlSZW1vdmUgVEFSR0VUX1NZTUJPTF9GSUVMRFMuCi0JKHN5bWJvbFMpOiBEb24ndCB0eXBlZGVmLgotCShzdHJ1Y3QgYnJva2VuX3dvcmQpOiBSZW1vdmUuCi0JKE5fVFlQRV9zZWcsIHNlZ19OX1RZUEUpOiBNb3ZlIHRvIHN5bWJvbC5oLgotCShTRUdNRU5UX1RPX1NZTUJPTF9UWVBFLCBOX1JFR0lTVEVSKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9pbnNlcnQsIHN5bWJvbF9yZW1vdmUpOiBMaWtld2lzZS4KLQkoc3ltYm9sX3ByZXZpb3VzLCBzeW1ib2xfYXBwZW5kKTogTGlrZXdpc2UuCi0JKHZlcmlmeV9zeW1ib2xfY2hhaW4sIHZlcmlmeV9zeW1ib2xfY2hhaW5fMik6IExpa2V3aXNlLgotCShzdHJ1Y3QgbG9jYWxfc3ltYm9sKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfY29udmVydGVkX3AsIGxvY2FsX3N5bWJvbF9tYXJrX2NvbnZlcnRlZCk6IERlZmluZS4KLQkobG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AsIGxvY2FsX3N5bWJvbF9tYXJrX3Jlc29sdmVkKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcsIGxvY2FsX3N5bWJvbF9zZXRfZnJhZyk6IERlZmluZS4KLQkobG9jYWxfc3ltYm9sX2dldF9yZWFsX3N5bWJvbCk6IERlZmluZS4KLQkobG9jYWxfc3ltYm9sX3NldF9yZWFsX3N5bWJvbCk6IERlZmluZS4KLQlEZWZpbmUuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgcmVzb2x2ZV9sb2NhbF9zeW1ib2xfdmFsdWVzLgotCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfU1lNRklFTERfVFlQRSk6IERlZmluZS4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfU1lNRklFTERfVFlQRSk6IEFkZCBsb2NhbCBmaWVsZC4gIElmCi0JRUNPRkZfREVCVUdHSU5HLCBhZGQgRUNPRkYgZmllbGRzLgotCShFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMsIFRBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL29iai1tdWx0aS5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IEFkZCBsb2NhbCBmaWVsZC4gIElmCi0JRUNPRkZfREVCVUdHSU5HLCBhZGQgRUNPRkYgZmllbGRzLgotCShFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMsIFRBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCShFQ09GRl9ERUJVR19UQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1tY29yZS5oOiBEb24ndCBpbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IG1jb3JlX3RjX3N5KTogRGVmaW5lLgotCShUQ19TWU1GSUVMRF9UWVBFKTogRGVmaW5lLgotCSogTWFueSBmaWxlczogVXNlIHN5bWJvbFMgaW5zdGVhZCBvZiBzdHJ1Y3Qgc3ltYm9sLiAgVXNlIG5ldwotCWFjY2Vzc29yIGZ1bmN0aW9ucyByYXRoZXIgdGhhbiByZWZlcnJpbmcgdG8gc3ltYm9sUyBmaWVsZHMKLQlkaXJlY3RseS4KLQotCSogcmVhZC5jIChzX21yaV9jb21tb24pOiBEb24ndCBhZGQgaW4gdmFsdWUgb2YgbGluZV9sYWJlbC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIHdoZW4KLQljaGVja2luZyBmb3IgU0VDX0xJTktfT05DRS4KLQotCSogY29uZmlnL3RjLXNoLmggKHNoX2ZpeF9hZGp1c3RhYmxlKTogRGVjbGFyZS4KLQotCSogYXBwLmMgKGlucHV0X2J1ZmZlcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFwcF9wdXNoKTogU2F2ZSBzYXZlZF9pbnB1dCBpbiBhbGxvY2F0ZWQgYnVmZmVyLgotCShhcHBfcG9wKTogUmVzdG9yZWQgc2F2ZWRfaW5wdXQuCi0JKGRvX3NjcnViX2NoYXJzKTogQ2hhbmdlIGdldCBwYXJhbWV0ZXIgdG8gdGFrZSBjaGFyICogYW5kIGludCBhcwotCWFyZ3VtZW50cy4gIENoYW5nZSBHRVQgbWFjcm8gdG8gcGFzcyBpbnB1dF9idWZmZXIgdG8gZ2V0Ci0JZnVuY3Rpb24uICBEb24ndCBzYXZlIGlucHV0IGludG8gYWxsb2NhdGVkIGJ1ZmZlci4KLQkqIGFzLmggKGRvX3NjcnViX2NoYXJzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX2dldCk6IENoYW5nZSB0byB0YWtlIGNoYXIgKiBhbmQgaW50LgotCVJlYWQgZGF0YSBpbnRvIHBhc3NlZCBpbiBidWZmZXIuICBSZW1vdmUgc3RhdGljIGJ1ZmZlci4KLQkqIHJlYWQuYyAoc2NydWJfZnJvbV9zdHJpbmcpOiBDaGFuZ2UgdG8gdGFrZSBjaGFyICogYW5kIGludC4gIENvcHkKLQlkYXRhIGludG8gcGFzc2VkIGluIGJ1ZmZlci4KLQotCSogaGFzaC5oOiBOZWF0ZW4uICBEZWNsYXJlIGhhc2hfdHJhdmVyc2UuCi0JKiBoYXNoLmM6IENvbXBsZXRlIHJld3JpdGUgYmFzZWQgb24gQkZEIGhhc2hpbmcgY29kZS4KLQkqIGdhc3AuYyAoY2h1bmtzaXplKTogTmV3IHZhcmlhYmxlLgotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBDYWxsIGhhc2hfamFtIHdpdGggTlVMTCByYXRoZXIgdGhhbgotCWhhc2hfZGVsZXRlLgotCi0xOTk5LTA1LTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgcGlwZWxpbmUgb2Zmc2V0IGludG8gcmVsb2MKLQlhZGRlbmQgdW5sZXNzIHRoZSB0YXJnZXQgdXNlcyBhbiBvbGQgQUJJLgotCi1Nb24gTWF5IDI0IDEzOjM2OjU1IDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQktV2NoYXItc3Vic2NyaXB0cyBjbGVhbnVwCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IFVzZSB1bnNpZ25lZCBjaGFyIHZhcmlhYmxlLCBzbwotIAljYWxscyB0byBpc2FzY2lpLGlzY250cmwgYXJlIGNvcnJlY3QuCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQ2FzdCBhcmcgdG8gaXNkaWdpdCwgZXQuIGFsLiB3aXRoCi0JKHVuc2lnbmVkIGNoYXIpLgotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2VudCxlY29mZl9zdGFiKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogRGl0dG8uCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLG1pcHMxNl9pcCk6IERpdHRvLgotCShteV9nZXRTbWFsbEV4cHJlc3Npb24sZ2V0X251bWJlcixzX21pcHNfZW50KTogRGl0dG8uCi0KLTE5OTktMDUtMjggIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBtYXRlbWF0aWsuc3Uuc2U+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDaGVjayBmb3IgZGlzYWxsb3dlZCBpbmRleCByZWdpc3RlcgotCXdpZHRoIGZvciBDb2xkZmlyZS4KLQkoYXJjaF9jb2xkZmlyZV9wKTogTmV3ICNkZWZpbmUuCi0JKG02OGtfaXAsIG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIGFyY2hfY29sZGZpcmVfcC4KLQotMTk5OS0wNS0yOCAgTGludXMgTm9yZGJlcmcgIDxsaW51cy5ub3JkYmVyZ0BjYW5pdC5zZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5zdGFsbF9vcGVyYW5kKTogQWRkIHBsYWNlcyBgbicsIGBvJy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEFkZCBmb3JtYXRzIGBFJywgYEcnLCBgSCcuCi0JKGluc3RhbGxfb3BlcmFuZCk6IEFkZCBwbGFjZSBgTicuCi0JKGluaXRfdGFibGUpOiBBZGQgcmVnaXN0ZXJzIEFDQywgTUFDU1IsIE1BU0suCi0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKG02OGtfcmVnaXN0ZXIpOiBBZGQgQUNDLCBNQUNTUiwgTUFTSy4KLQotCSogY29uZmlnL3RjLW02OGsuYzogQ2hhbmdlIG1jZjUyMDAgLS0+IG1jZi4KLQkoYXJjaHMpOiBBZGQgbWNmNTIwNmUsIG1jZjUzMDcuCi0JKG02OGtfaXApOiBBZGQgZm9ybWF0IGB1Jy4KLQkoaW5zdGFsbF9vcGVyYW5kKTogQWRkIHBsYWNlIGBtJywgYE0nLCBgaCcuCi0JKGluaXRfdGFibGUpOiBBZGQgdXBwZXIvbG93ZXIgcmVnaXN0ZXJzLgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChtNjhrX3JlZ2lzdGVyKTogQWRkIHVwcGVyL2xvd2VyIHJlZ2lzdGVycy4KLQotMTk5OS0wNS0yOCAgTWFydGluIERvcmV5ICA8bWRvcmV5QG1hZGdlLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYzogU2V2ZXJhbCBtaW5vciBjaGFuZ2VzIHRvIGFkZCBFTEYgYW5kCi0JQkZEX0FTU0VNQkxFUiBzdXBwb3J0LgotCSogY29uZmlnL3RjLWk5NjAuaDogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNS0yNSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogT25seSBkbyAxOTk5LTA1LTE3IGZ4X3BjcmVsCi0JcmVsb2MgY2hhbmdlcyB3aGVuIGRlZmluZWQoQkZEX0FTU0VNQkxFUikuCi0KLTE5OTktMDUtMTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogUmVtb3ZlIEYgYW5kIE1BUCBtYWNyb3MuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3ByaW50X3N0YXRpc3RpY3MpOiBPdXRwdXQgdG8gZmlsZSwgbm90IHN0ZGVyci4KLQotCSogZXhwci5jIChnZW5lcmljX2JpZ251bV90b19pbnQzMiw2NCk6IFByb3RvdHlwZS4KLQotCSogcmVhZC5jIChzX2xjb21tX2ludGVybmFsLCBzaXplb2Zfc2xlYjEyOCwgc2l6ZW9mX3VsZWIxMjgsCi0Jb3V0cHV0X3NsZWIxMjgsIG91dHB1dF91bGViMTI4LCBvdXRwdXRfYmlnX3NsZWIxMjgsCi0Jb3V0cHV0X2JpZ191bGViMTI4LCBvdXRwdXRfYmlnX2xlYjEyOCk6IFByb3RvdHlwZS4KLQkob3V0cHV0X2JpZ19zbGViMTI4LCBvdXRwdXRfYmlnX3VsZWIxMjgpOiBNYWtlIGlubGluZS4KLQkob3V0cHV0X2JpZ19sZWIxMjgpOiBSZW1vdmUgaW5saW5lCi0KLQlGcm9tIE1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IENvbnZlcnQgQkZEX1JFTE9DXzE2IHdpdGgKLQlmeF9wY3JlbCBzZXQgdG8gQkZEX1JFTE9DXzE2X1BDUkVMLiAgU2ltaWxhcmx5IGZvciBCRkRfUkVMT0NfOC4KLQlIYW5kbGUgQkZEX1JFTE9DXzE2X1BDUkVMIGFuZCBCRkRfUkVMT0NfOF9QQ1JFTC4gIFJldHVybiBjaGFuZ2VkCi0JdmFsdWUgZm9yIGNvcnJlY3Qgb3ZlcmZsb3cgY2hlY2sgaW4gd3JpdGUuYzpmaXh1cF9zZWdtZW50LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IE1vdmUgYml0ZmllbGQgb3ZlcmZsb3cgY2hlY2tzIHRvIGFmdGVyCi0JdGhlIG1kX2FwcGx5X2ZpeCBjYWxsLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBNZW50aW9uIG1kX2FwcGx5X2ZpeCBtb2RpZnlpbmcKLQl2YWx1ZVQgKnZhbCBhcmd1bWVudC4KLQotRnJpIE1heSAxNCAxMDo1MjoxMyAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoZ2VuX3RvX3dvcmRzKTogQ29ycmVjdGx5IHJvdW5kIGEKLQlkZW5vcm1hbGl6ZWQgbnVtYmVyLiAgRml4IG9mZi1ieS1vbmUgaW4gcmFuZ2UgY2hlY2tpbmcgZm9yCi0JZXhwb25lbnQgaW4gYSBkZW5vcm1hbC4gCi0KLTE5OTktMDUtMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChwYXJzZV9yZWcpOiBBY2NlcHQgJ3NwJyBhcyBhIHZhbGlkIHJlZ2lzdGVyCi0JbmFtZS4gCi0KLVRodSBNYXkgMTMgMDk6NDY6NTkgMTk5OSAgSm9lbCBTaGVycmlsbCAoam9lbEBPQVJjb3JwLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LSotcnRlbXNlbGYqLCBzaC0qLXJ0ZW1zZWxmKik6IE5ldyB0YXJnZXRzLgotCi0xOTk5LTA1LTEyICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEludk1lbSk6IE5ldyBmbGFnLiAgQWRkIHRvIEFueU1lbS4KLQkoUmV2ZXJzZVJlZ1JlZ21lbSk6IFJlbW92ZS4KLQkoSW1tRXh0KTogTmV3IGZsYWcuICBSZW51bWJlciBzb21lIG9mIHRoZSBvcGNvZGVfbW9kaWZpZXIgYml0cy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogVGVzdCBmb3IgUElJSSBTSU1EIGFuZCBBTUQKLQkzRE5vdyEgdmlhIEltbUV4dCBvcGNvZGVfbW9kaWZpZXIuICBSZW1vdmUgUmV2ZXJzZVJlZ1JlZ21lbQotCWtsdWRnZS4KLQotCUZyb20gIERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFJlZ1hNTSk6IE5ldyBmb3IgUC9JSUkuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBBZGQgc3VwcG9ydCBmb3IgUC9JSUkuCi0KLVNhdCBNYXkgIDggMjM6Mjg6NTAgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBSZWNvZ25pemUgLW1wcGM2NGJyaWRnZS4KLQkobWRfYmVnaW4pOiBBbGxvdyBwcGMzMiBpbnNucyBpbiBwcGM2NGJyaWRnZSBtb2RlLgotCShwcGNfaW5zZXJ0X29wZXJhbmQpOiBBY2NlcHQgU0lHTk9QVCBpbiBwcGM2NCBtb2RlLgotCi1UaHUgTWF5ICA2IDIzOjEzOjM5IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW1tZWRpYXRlKTogU2tpcCB3aGl0ZXNwYWNlIGJlZm9yZQotCWNvbXBsYWluaW5nIGFib3V0IGp1bmsgYWZ0ZXIgZXhwcmVzc2lvbi4KLQkoaTM4Nl9kaXNwbGFjZW1lbnQpOiBMaWtld2lzZS4KLQotVGh1IE1heSAgNiAxOTo1MDoxNCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9maW5kX2Jhc2UpOiBVc2UgbWVtY3B5IGluc3RlYWQgb2Ygc3RyY3B5LgotCURvbid0IGNvcHkgYmVmb3JlIGRvd25jYXNlaW5nLgotCi0xOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiB0Yy1tNjhrLmM6IEluY2x1ZGUgZWxmL202OGsuaC4KLSAgICAgICAgKG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBOZXcgcm91dGluZS4KLSAgICAgICAgKiB0Yy1tNjhrLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOgotICAgICAgICBEZWZpbmUuCi0gCi1Nb24gTWF5ICAzIDEwOjI2OjAzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIDIyIGJpdCBmbXQgaW5zbiBsaWtlIGEKLQkxNyBiaXQgZm10IGluc24uCi0KLTE5OTktMDQtMzAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtY29yZV9zX3NlY3Rpb24pOiBEdW1wIGxpdGVyYWxzIGJlZm9yZQotCWNoYW5naW5nIHNlY3Rpb24uCi0KLTE5OTktMDQtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtZF9hcHBseV9maXgzKTogSW5zZXJ0IHJlbG9jIGFkZGVuZCBpbnRvIGluc24KLQlmb3IgQ09GRi9QRSBwb3J0LgotCi1Nb24gQXByIDI2IDEyOjM0OjM3IDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmggKFRDX0ZJWF9UWVBFKTogRGVsZXRlLCBjZ2VuIGZpZWxkcyBtb3ZlZCB0byB3cml0ZS5oLgotCShUQ19JTklUX0ZJWF9EQVRBKTogRGVsZXRlLgotCSogY29uZmlnL3RjLW0zMnIuaCAoVENfRklYX1RZUEUpOiBEZWxldGUsIGNnZW4gZmllbGRzIG1vdmVkIHRvIHdyaXRlLmguCi0JKFRDX0lOSVRfRklYX0RBVEEpOiBEZWxldGUuCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogTmV3IG1lbWJlciBmeF9jZ2VuLCBpZmRlZiBVU0lOR19DR0VOLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IEluaXRpYWxpemUgZnhfY2dlbiBtZW1iZXIuCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX3JlY29yZF9maXh1cCxnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogVXBkYXRlLgotCShnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogVXBkYXRlLgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUuCi0JKG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IFVwZGF0ZS4KLQkoRlhfT1BJTkZPX1JfVFlQRSk6IFVwZGF0ZS4KLQotCSogZnJhZ3MuYyAoZnJhZ192YXIsZnJhZ192YXJpYW50KTogSW5pdGlhbGl6ZSBmcl9jZ2VuIGhlcmUuCi0JKiBjb25maWcvdGMtZnIzMC5oIChUQ19GUkFHX0lOSVQpOiBEZWxldGUuCi0JKiBjb25maWcvdGMtbTMyci5oIChUQ19GUkFHX0lOSVQpOiBEZWxldGUuCi0JKiBmcmFncy5oIChzdHJ1Y3QgZnJhZyk6IE1ha2Ugb3BpbmRleCwgb3BpbmZvIGludHMuCi0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKEZYX09QSU5GT19SX1RZUEUpOiBEZWxldGUsIHVudXNlZC4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtZF9hcHBseV9maXgzKTogUmVuYW1lZCBmdW5jdGlvbiBmcm9tCi0JbWRfYXBwbHlfZml4LiAKLQkobWRfYXBwbHlfZml4Myk6IERvIG5vdCBmaXggdXAgYWJzb2x1dGUgcmVsb2NhdGlvbnMgYWdhaW5zdAotCXN5bWJvbGljIHZhbHVlcy4KLQotCSogY29uZmlnL3RjLW1jb3JlLmggKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCi0KLTE5OTktMDQtMjAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgaW50ZXJjZXB0cyBmb3Igc2VjdGlvbgotCWNoYW5nZXMgYW5kIGRhdGEtaW4tdGV4dCBkaXJlY3RpdmVzLgotCShtY29yZV9jb25zKTogTmV3IGZ1bmN0aW9uOiBpbnRlcmNlcHQgY29ucygpIG9wZXJhdGlvbnMuCi0JKG1jb3JlX2Zsb2F0X2NvbnMpOiBOZXcgZnVuY3Rpb246IGludGVyY2VwdCBmbG9hdF9jb25zKCkKLQlvcGVyYXRpb25zLiAKLQkobWNvcmVfc3RyaW5nZXIpOiBOZXcgZnVuY3Rpb246IGludGVyY2VwdCBzdHJpbmdlcigpIG9wZXJhdGlvbnMuCi0KLTE5OTktMDQtMTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBDaGFuZ2UgZ2VuZXJhdGVfYXNtX2xpbmVubyBmaWVsZCB0bwotCXRha2Ugbm8gcGFyYW1ldGVycy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT0JKX0dFTkVSQVRFX0FTTV9MSU5FTk8pOiBEb24ndCBkZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChmaW5kX29wY29kZV9tYXRjaCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guCi0JKGZpbmRfbWFjcm9fbWF0Y2gpOiBMaWtld2lzZS4KLQkobG9hZF9leHByZXNzaW9uKTogUGFyZW50aGVzaXplICYmIHdpdGhpbiB8fC4KLQotCSogY29uZmlnL3RjLWFscGhhLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZS4KLQotMTk5OS0wNC0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBvdmVycmlkZXMgZm9yIC5ic3MKLQkudGV4dCAuZGF0YSAuc2VjdGlvbiBwc2V1ZG8gb3BzLgotCShtY29yZV9zX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uICBEdW1wIGxpdHMgYmVmb3JlIGNoYW5naW5nIHNlY3MuIAotCShtY29yZV9zX3RleHQpOiBOZXcgZnVuY3Rpb24uICBEdW1wIGxpdHMgYmVmb3JlIGNoYW5naW5nIHNlY3MuIAotCShtY29yZV9zX2RhdGEpOiBOZXcgZnVuY3Rpb24uICBEdW1wIGxpdHMgYmVmb3JlIGNoYW5naW5nIHNlY3MuIAotCi0xOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc18zMmJpdG1vZGUpOiBOZXcuCi0JKG1kX2JlZ2luKTogU2V0IG1pcHNfMzJiaXRtb2RlIGlmIG5lZWRlZC4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IERvbid0IHNldCBFRl9NSVBTX0FSQ0guCi0JU2V0IEVGX01JUFNfMzJCSVRNT0RFLgotCi1GcmkgQXByIDE2IDEyOjI2OjM5IDE5OTkgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zZWN0aW9uX3N5bWJvbCk6IEZpeCB0eXBvIGluIHByZXZpb3VzCi0JY2hhbmdlLgotCi0xOTk5LTA0LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lIHRvIDEuCi0KLVRodSBBcHIgMTUgMTY6NTI6MDkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX2dldF9hYnNvbHV0ZV9leHJlc3Npb24pOiBUcnkgdG8gaGFuZGxlICI1ICVyMyIgCi0JZXhwcmVzc2lvbnMgY29ycmVjdGx5LgotCi0KLTE5OTktMDQtMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogU2V0IEVGX01JUFNfQVJDSC4KLQotTW9uIEFwciAxMiAyMzo0NTowNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJzMnKTogTmV3IGNhc2UgZm9yIFBBMi4wIGZtcHlmYWRkCi0JYW5kIGZtcHluZmFkZCBpbnN0cnVjdGlvbnMuCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGVudmlyb24pOiBEZWNsYXJlIGl0LCBpZiBuZWVkZWQuCi0JKiBhcy5jIChkdW1wX3N0YXRpc3RpY3MpOiBEb24ndCBkZWNsYXJlIGVudmlyb24uCi0JKiBjb25maWd1cmUuaW4gKGVudmlyb24pOiBEZXRlY3QgZGVjbGFyYXRpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZAotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ltbWVkaWF0ZSk6IEFjY2VwdCBAR09UIHJlbG9jYXRpb25zLgotCShpMzg2X2Rpc3BsYWNlbWVudCk6IEFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgcmVwbGFjZW1lbnQgYnVmZmVyLgotCUNsZWFuIHVwIHJlcGxhY2VtZW50IGJ1ZmZlciBpbml0aWFsaXphdGlvbi4KLQotMTk5OS0wNC0xMSAgQm9iIE1hbnNvbiA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT46Ci0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBEb24ndCBjcmVhdGUgYSBuZXcgc3ltYm9sIGlmIG9uZQotCWFscmVhZHkgZXhpc3RzOyBpbnN0ZWFkLCB1c2UgdGhlIGV4aXN0aW5nIG9uZSwgYnV0IHNldCBpdHMgc2VnbWVudAotCWFuZCBmcmFnIGRhdGEgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBkZWZpbmVkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc2VjdGlvbl9zeW1ib2wpOiBMaWtld2lzZS4KLQotU2F0IEFwciAxMCAyMDoxMDowMiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBDYWxsIGFzX2JhZCBpbnN0ZWFkIG9mIGFib3J0LgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYzogTmV3IEZpbGU6IFN1cHBvcnQgcm91dGluZXMgZm9yIE1Db3JlCi0JYXNzZW1ibGVyLgotCSogY29uZmlnL3RjLW1jb3JlLmg6IE5ldyBGaWxlOiBEZWZpbml0aW9ucyBmb3IgTUNvcmUgYXNzZW1ibGVyLiAKLQkqIGNvbmZpZy9vYmotY29mZi5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUtcGUgdGFyZ2V0LgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIGRvYy9hbGwudGV4aTogU2V0IE1DT1JFLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IE1Db3JlIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCQotCSogd3JpdGUuaDogUHJldmVudCBtdWx0aXBsZSBpbmNsdXNpb24uCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhc2ludGwuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0JKiBhcy5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlIHN5c3RlbQotCWRvZXMgbm90IGRlZmluZSBpdC4KLQkqIGdhc3AuYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZSBzeXN0ZW0KLQlkb2VzIG5vdCBkZWZpbmUgaXQuCi0KLQkqIE1ha2VmaWxlLmFtIChtNjhrLXBhcnNlLmMpOiBJZiBjb25maWd1cmluZyBpbiB0aGUgc291cmNlCi0JZGlyZWN0b3J5LCBjb3B5IG02OGstcGFyc2UueSBpbnRvIHRoZSBsb2NhbCBkaXJlY3RvcnkgYmVmb3JlCi0JcnVubmluZyB5bHdyYXAsIHRvIHJlbW92ZSBzcHVyaW91cyBkaWZmZXJlbmNlcyB3aGVuIGdlbmVyYXRpbmcKLQlzbmFwc2hvdHMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2RvX2FsaWduKTogSnVzdCBhbGxvY2F0ZSB0aGUgbnVtYmVyIG9mCi0JYnl0ZXMgbmVjZXNzYXJ5LCByYXRoZXIgdGhhbiBhbHdheXMgYWxsb2NhdGluZyAxMDI0LgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSogcmVhZC5jIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBBZGQgY2FzZXMgdG8gc3dpdGNoLiAgUmVpbmRlbnQuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X3NjYWxlKTogQWRkIHJldHVybiB2YWx1ZS4KLQkoYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdGVtcF9kaXNwMi4KLQkoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6IEFkZCBwYXJlbnRoZXNlcyB0byBhdm9pZCB3YXJuaW5nLgotCShpMzg2X2ludGVsX29wZXJhbmQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGVuZF9vZl9vcGVyYW5kX3N0cmluZy4KLQkoaTM4Nl9vcGVyYW5kKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBvcGVyYW5kX21vZGlmaWVyLgotCShpMzg2X29wZXJhbmQpOiBBZGQgcGFyZW5zIHRvIGF2b2lkIHdhcm5pbmcuCi0KLTE5OTktMDQtMDQgIERvbiBCb3dtYW4gPGRvbkBwaXhzY2kuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtaXBzKi0qLXZ4d29ya3MqIHRhcmdldDsgaGF2ZSBpdCBkZWZpbmUKLQlNSVBTX1NUQUJTX0VMRi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAzLTMxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3IgYXJtLWVwb2MtcGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWcvdGUtZXBvYy1wZS5oOiBOZXcgZmlsZS4gIERlZmluZSBtYWNyb3Mgc3BlY2lmaWMgdG8KLQlhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb25maWcvdGMtYXJtLmg6IFNlbGVjdCBlcG9jLXBlLWFybSB0YXJnZXQgZm9ybWF0IGlmIGNvbmZpZ3VyZWQKLQlmb3IgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCi1Nb24gTWFyIDI5IDEwOjE1OjQwIENTVCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiAgQWRqdXN0IHZhbHVlIGZvciBsaW5rb25jZSBzZWN0aW9ucy4KLQotV2VkIE1hciAyNCAxNDoxMToxMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIpOiBDbGVhbiB1cCBjb2RlIHRvCi0JZGV0ZWN0ICIsbiIgd2l0aG91dCBhIGNvbmRpdGlvbi4KLQkocGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIpOiBMaWtld2lzZS4KLQotCi1UdWUgTWFyIDIzIDExOjI4OjIzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnficpOiBUaGUgY29uZGl0aW9uIGZvciBhIGJyYW5jaCBvbiBiaXQKLQlpbnN0cnVjdGlvbiBpcyBlbmNvZGVkIHdpdGggb25lIGJpdC4KLQotCi0xOTk5LTAzLTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IE1lbnRpb24gdGhhdAotCWxpbmVfc2VwYXJhdG9yX2NoYXJzIHNob3VsZCBub3QgaW5jbHVkZSBuZXdsaW5lLiAgRnJvbSB0aGkKLQk8dHRuQG1pbmdsZS5nbHVnLm9yZz4uCi0KLTE5OTktMDMtMjIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfYmVnaW4pOiBVcGRhdGUgY2FsbCB0byBmcjMwX2NnZW5fY3B1X29wZW4uCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIG0zMnJfY2dlbl9jcHVfb3Blbi4KLQotU3VuIE1hciAyMSAxODowODoxOCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1hbHBoYS5jIChtZF9hc3NlbWJsZSk6IEFsbG93ICc2JyBpbiBhbiBvcGNvZGUuCi0KLVRodSBNYXIgMTggMTA6NTU6MzAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICdhJyk6IERvIG5vdCBjYWxsIHBhX3BhcnNlXy4uLl9jbXBzdWJfY21wbHRyLgotCi0KLVRodSBNYXIgMTggMDI6MzA6MDcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICdkJyk6IERvIG5vdCBhbGxvdyAiLG4iLgotCQotMTk5OS0wMy0xNSAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IENoYW5nZSAnLScgYmFjayB0byBhIHN5bWJvbCBjaGFyCi0Jc28gd2UgY2FuIHVzZSBtdWx0aXBsZSBvcGNvZGVzIG9uIGEgbGluZSBhZ2Fpbi4KLQotCSogY29uZmlnL3RjLWQzMHYuYzogQnkgZGVmYXVsdCwgd2FybiBpZiBhIHN5bWJvbCBoYXMKLQl0aGUgc2FtZSBuYW1lIGFzIGEgcmVnaXN0ZXIuICBQbHVzIHNvbWUgbWlub3IKLQl1cGRhdGVzIGZyb20gdGhlIGJyYW5jaC4KLQotMTk5OS0wMy0xMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBCRkRfUkVMT0NfOCwKLQlCRkRfUkVMT0NfMTYgYW5kIEJGRF9SRUxPQ182NC4KLQotMTk5OS0wMy0xMiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBleHByLmMgKGV4cHIpOiBBZGQgbWlzc2luZyBlbHNlLgotCi0xOTk5LTAzLTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0KLTE5OTktMDMtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENQVV9UWVBFUyk6IEFkZCBmcjMwLgotCShjZ2VuLm8pOiBBZGQgJChDR0VOX0NQVV9QUkVGSVgpLWRlc2MuaCBkZXBlbmRlbmN5LgotCShmcjMwLG0zMnIgZGVwZW5kZW5jaWVzKTogVXBkYXRlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwKTogVXBkYXRlIHVzZSBvZiBvcGVyYW5kLT50eXBlLgotCShnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGl0dG8uCi0JKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogQ2FsbCBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bS4KLQkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IERpdHRvLiAgVXBkYXRlIGNhbGwgdG8gc2V0X3ZtYV9vcGVyYW5kLgotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfYmVnaW4pOiBVcGRhdGUgY2FsbCB0byBmcjMwX2NnZW5fY3B1X29wZW4uCi0JKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogVXBkYXRlIHVzZSBvZiBvcGVyYW5kLT50eXBlLgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYmVnaW4pOiBVcGRhdGUgY2FsbCB0byBmcjMwX2NnZW5fY3B1X29wZW4uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IENhbGwgY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0uCi0JKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogVXBkYXRlIHVzZSBvZiBvcGVyYW5kLT50eXBlLgotCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERpdHRvLgotCi0xOTk5LTAzLTA5ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3Nob3dfdXNhZ2UpOiBGaXggbWVzc2FnZS4KLQotMTk5OS0wMy0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBTeW50YXgpOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaGVzCi0JYW5kIExEUiByZWcsPTxleHByPiBpbnN0cnVjdGlvbi4KLQotCSogY29uZmlnL3RjLWFybS5jOiBBZGQgc3VwcG9ydCBmb3IgLW1jcHU9YXJtODEwLCAtbWNwdT1hcm05IGFuZAotCS1tY3B1PWFybTl0ZG1pLgotCi1GcmkgRmViIDE5IDA5OjM2OjMwIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTS1DaGFycyk6IEZpeCB0eXBvIGluIHVzZSBvZiAnQCcuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlUaGlzIHBhdGNoIHdhcyBjcmVhdGVkIGJ5OiBTY290dCBCYW1icm91Z2gKLQk8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCQotCSogYXBwLmM6IAotCSAgU3BlY2lhbCBjYXNlZCAnQCcgY2hhcmFjdGVyLiAgVGhlICdAJyBjaGFyYWN0ZXIgaXMgdXNlZCBhcyB0aGUKLQkgIEFSTSBhc3NlbWJsZXIgY29tbWVudCBjaGFyYWN0ZXIsIGFzIGEgc3BlY2lhbCBjaGFyYWN0ZXIgCi0JICBhbmQgaW4gRUxGIC5zeW12ZXIgcHNldWRvLW9wJ3MsIGFuZCBhcyBhIHNwZWNpYWwgY2hhcmFjdGVyIGluCi0JICAudHlwZSBhbmQgLnNlY3Rpb24gcHNldWRvLW9wcy4KLQkoc3ltdmVyX3BzZXVkbyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHN5bXZlcl9zdGF0ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHN0cnVjdCBhcHBfc2F2ZSk6IEFkZCBmaWVsZCAnc3ltdmVyX3N0YXRlJy4KLQkoYXBwX3B1c2gpOiBTYXZlIGdsb2JhbCBzeW12ZXJfc3RhdGUgaW50IHN0cnVjdCBhcHBfc2F2ZS4KLQkoYXBwX3BvcCk6IFJlc3RvcmUgZ2xvYmFsIHN5bXZlcl9zdGF0ZSBmcm9tIHN0cnVjdCBhcHBfc2F2ZS4KLSAgCShkb19zY3J1Yl9jaGFycyk6IFNwZWNpYWwgY2FzZSBoYW5kbGluZyBvZiAnQCcgY2hhcmFjdGVyIGluCi0JLnN5bXZlciBwc2V1ZG8tb3BzLiAKLQotCSogY29uZmlndXJlLmluOiBNb2RpZmllZCB0byByZWNvZ25pemUgYXJtdiogdW5hbWUgc3ludGF4IGZyb20gQVJNCi0JTGludXgga2VybmVsLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkKLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEFsbG93ICclJyBhcyB3ZWxsIGFzICdAJyBhcwotCWEgcHJlZml4IHRvIHRoZSBzZWN0aW9uJ3MgdHlwZS4KLQkob2JqX2VsZl90eXBlKTogQWxsb3cgJyUnIGFzIHdlbGwgYXMgJ0AnIGFuZCAnIycgYXMgcHJlZml4ZXMgdG8KLQl0aGUgdHlwZSdzIHR5cGVuYW1lLgotCi0JKiBjb25maWcvdGMtYXJtLmg6IEFkZCBzdXBwb3J0IGZvciBQSUMgZ2VuZXJhdGlvbjoKLQkocGljX2NvZGUpOiBOZXcgYm9vbGVhbi4KLQkob2JqX3JlbG9jYXRlX2V4dGVybik6IERlZmluZS4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lCi0JKFRDX0NPTlNfRklYX05FVyk6IERlZmluZS4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlZmluZS4KLQkKLQkqIGNvbmZpZy90Yy1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIFBJQyBnZW5lcmF0aW9uOgotCShsaW5lX3NlcGVyYXRvcl9jaGFycyk6IEFsbG93ICc7JyBhcyBhIHNlcGVyYXRvciBmb3IgTGludXguCi0JKGlzX2ltbWVkaWF0ZV9wcmVmaXgpOiBOZXcgbWFjcm8uCi0JKGFybV9wYXJzZV9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoc19hcm1fZWxmX2NvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKGRvX2JyYW5jaCk6IFNwZWNpYWwgY2FzZSBmb3IgQkZEX1JFTE9DX0FSTV9QTFQzMi4KLQkobWRfdW5kZWZpbmVkX3N5bWJvbCk6IFNwZWNpYWwgY2FzZSBoYW5kbGluZyBmb3IgdGhlIEdsb2JhbCBPZmZzZXQKLQkgIFRhYmxlJ3Mgc3ltYm9sLgotCShtZF9hcHBseV9maXgzKTogSGFuZGxlIFBJQyByZWxvY3MuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBQSUMgcmVsb2NzLgotCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgJy1rJyBjb21tYW5kIGxpbmUgc3dpdGNoIHRvCi0JICBlbmFibGUgUElDIGdlbmVyYXRpb24uCi0JKGNvbnNfZml4X25ld19hcm0pOiBOZXcgZnVuY3Rpb24uCi0JKHNfYXJtX2VsZl9jb25zKTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgRmViIDE2IDE2OjMxOjUzIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudHMgZm9yIHVzZXMgb2YgQUNfREVGSU5FLgotCSogYWNpbmNsdWRlLm00OiBMaWtld2lzZS4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wMi0xNSAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXA6IGNhc2UgJ28nKTogRml4IGFzc2VydGlvbiBmYWlsdXJlIGZvcgotCW5vbi1jb25zdGFudCBvZmZzZXQgZnJvbSBhIGJhc2UgcmVnaXN0ZXIuCi0KLTE5OTktMDItMTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkByYWVidXJuLm9yZz4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3Nob3dfdXNhZ2UpOiBQdXQgXCBiZWZvcmUgbmV3bGluZSBpbgotCXN0cmluZ3MgYWx3YXlzLgotCi1TYXQgRmViIDEzIDE0OjEwOjEwIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChjcHVfdHlwZXMpOiBFbmFibGUgRVY2IFBBTGNvZGUgd2l0aCAtbTIxMjY0LgotCShlbWl0X2luc24pOiBMb29rIGZvciBwYy1yZWxhdGl2ZSBhbmQgbm8tb3ZlcmZsb3cgc3BlY2lmaWVycyBvbgotCWludGVybmFsIHJlbG9jYXRpb24gdHlwZXMuCi0KLTE5OTktMDItMTMgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtbWlwcy50ZXhpIChNSVBTIE9wdHMpOiBVcGRhdGVkIGxpc3Qgb2YgLW1OTk5OIGFuZAotCS1tY3B1PU5OTk4gZmxhZ3MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlbW92ZSBhbGwgdGhlIG1pcHNfTk5OTiB2YXJpYWJsZXM7IGp1c3QgdXNlCi0JbWlwc19jcHUgaW5zdGVhZC4KLQkobWlwc180NjUwLCBtaXBzXzQwMTAsIG1pcHNfNDEwMCk6IFZhcmlhYmxlcyByZW1vdmVkLgotCShoaWxvX2ludGVybG9ja3MsIGdwcl9pbnRlcmxvY2tzLCBhcHBlbmRfaW5zbiwgbWFjcm9fYnVpbGQsIG1hY3JvLAotCW1hY3JvMiwgbWlwczE2X21hY3JvLCBtaXBzX2lwKTogVGVzdCBtaXBzX2NwdSwgbm90IHRoZSBtaXBzX05OTk4KLQl2YXJpYWJsZXMuCi0JKG1kX2JlZ2luKTogRG9uJ3QgYm90aGVyIGluaXRpYWxpemluZyB0aGUgbWlwc19OTk5OIHZhcmlhYmxlczsKLQltaXBzX2NwdSBpcyBzZXQsIGFuZCB0aGF0J3MgZ29vZCBlbm91Z2ggbm93LgotCShtZF9wYXJzZV9vcHRpb24pOiBIYXZlIHRoZSAtbU5OTk4gb3B0aW9ucyBzZXQgbWlwc19jcHUgaW5zdGVhZCBvZgotCXRoZSBtaXBzX05OTk4gdmFyaWFibGUuICBUaGUgLW5vLW1OTk5OIGZsYWdzIGFyZSBub3cgbm8tb3BzLgotCShzaG93KTogTmV3IGZ1bmN0aW9uLCB0byBoYW5kbGUgd3JhcHBpbmcgaW4gdGhlIENQVSBsaXN0cy4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZSBsaXN0cyBvZiAtbWNwdSBhbmQgLW1OTk5OIHN3aXRjaGVzLgotCi1TYXQgRmViIDEzIDAwOjE3OjI2IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW50ZWxfb3BlcmFuZCk6IElnbm9yZSBgU0hPUlQnIHJhdGhlcgotCXRoYW4gdHJlYXQgYXMgYW4gaW1tZWRpYXRlIHNwZWNpZmllci4KLQotVGh1IEZlYiAxMSAxNjoxODozMSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBQcm90b3R5cGUgbWFueSBmdW5jdGlvbnMuCi0JKHNldF9pbnRlbF9zeW50YXgpOiBBY2NlcHQgYHByZWZpeCcvYG5vcHJlZml4JyBzcGVjaWZpZXJzLgotCShpMzg2X2ltbWVkaWF0ZSk6IFJlbW92ZSB1bnVzZWQgc2Vjb25kIGFyZ3VtZW50LgotCShpMzg2X2ludGVsX29wZXJhbmQpOiBGaXggaTM4Nl9pc19yZWcgdHlwby4KLQkoaTM4Nl9vcGVyYW5kKTogVXNlIGFsbG93X25ha2VkX3JlZy4KLQkob3V0cHV0X2ludmFsaWQpOiBNYWtlIG9wZXJhbmQgaW50IGZvciBLJlIuCi0KLVRodSBGZWIgMTEgMTE6MjE6MDIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfYXNfbmV3X1NPVVJDRVMpOiBVbmNvbW1lbnQtLWZpeGVkIGJ5IGF1dG9tYWtlCi0JcGF0Y2guCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBDaGFuZ2UgY2dlbi1vcGMuaCB0byBjZ2VuLWRlc2MuaC4KLQkoY2dlbi5vKTogRGl0dG8uCi0JKEVYVFJBX2FzX25ld19TT1VSQ0VTKTogQ29tbWVudCBvdXQuCi0JKC50Y2RlcCk6IDxhcmNoPi1vcGMuaCByZW5hbWVkIHRvIDxhcmNoPi1kZXNjLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEzLiAgUmVkbyB1c2luZ19jZ2VuIGhhbmRsaW5nLgotCURlbGV0ZSBjYWxsIHRvIEFNX0NZR1dJTjMyLiAgUmVwbGFjZSBBTV9FWEVFWFQgd2l0aCBBQ19FWEVFWFQuCi0JKEFDX09VVFBVVCk6IDxhcmNoPi1vcGMuaCByZW5hbWVkIHRvIDxhcmNoPi1kZXNjLmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCSogY2dlbi5jOiBJbmNsdWRlIGNnZW4tZGVzYy5oLCBub3QgY2dlbi1vcGMuaC4KLQkoKik6IENHRU5fT1BDT0RFX0RFU0MgcmVuYW1lZCB0byBDR0VOX0NQVV9ERVNDLgotCShnYXNfY2dlbl9jcHVfZGVzYyk6IFJlbmFtZWQgZnJvbSBnYXNfY2dlbl9vcGNvZGVfZGVzYy4KLQlDR0VOX0lOU05fQVRUUiByZW5hbWVkIHRvIENHRU5fSU5TTl9BVFRSX1ZBTFVFLgotCUNHRU5fT1BFUkFORF9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUuCi0JKGdhc19jZ2VuX3JlY29yZF9maXh1cCk6IFJlbW92ZSB1bm5lY2Vzc2FyeSAhPSAwIHRlc3QuCi0JKGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEaXR0by4KLQkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBEaXR0by4gIFJlZmVyIHRvIG9wZXJhbmQgdGFibGUgdmlhIGNwdQotCWRlc2NyaXB0b3IsIG5vdCBnbG9iYWwgdmFyaWFibGUuCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBSZWZlciB0byBvcGVyYW5kX3RhYmxlIHZpYSBjcHUKLQlkZXNjcmlwdG9yLCBub3QgZ2xvYmFsIHZhcmlhYmxlLiAgUmVmZXIgdG8gaW5zZXJ0X29wZXJhbmQgaGFuZGxlcgotCXZpYSBjcHUgZGVzY3JpcHRvciwgbm90IGdsb2JhbCBmdW5jdGlvbi4KLQkqIGNnZW4uaCAoKik6IENHRU5fT1BDT0RFX0RFU0MgcmVuYW1lZCB0byBDR0VOX0NQVV9ERVNDLgotCSogY29uZmlnL3RjLWZyMzAuYzogSW5jbHVkZSBvcGNvZGVzL2ZyMzAtZGVzYy5oLgotCSgqKTogZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MgcmVuYW1lZCB0byBnYXNfY2dlbl9jcHVfZGVzYy4KLQlDR0VOX0lOU05fQVRUUiByZW5hbWVkIHRvIENHRU5fSU5TTl9BVFRSX1ZBTFVFLgotCVVwZGF0ZSBjYWxsIHRvIENHRU5fT1BFUkFORF9UWVBFLENHRU5fSU5TTl9PUEVSQU5EUy4KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IERpdHRvLgotCShhc3NlbWJsZV90d29faW5zbnMpOiBVcGRhdGUgY2FsbHMgdG8gY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMuCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IFVwZGF0ZSBjYWxsIHRvIENHRU5fT1BFUkFORF9FTlRSWS4KLQotMTk5OS0wMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogRml4IGhhbmRsaW5nIG9mIGxhYmVsMSAtIGxhYmVsMgotCXJlbG9jYXRpb25zIGZvciBFTEYgdGFyZ2V0cy4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgU3Ryb25nQVJNIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMi0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oOiBUaWR5IE9CSl9FTEYgYW5kIE9CSl9DT0ZGIGRlZmluaXRpb25zLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gKLQlmb3IgQ09GRiBwb3J0cy4KLQotV2VkIEZlYiAgMyAxMTozNTo0NyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvd191c2FnZSk6IERvY3VtZW50IHBjYTU2IGFuZCBldjYgb3B0aW9ucy4KLQotTW9uIEZlYiAgMSAyMDozNzozMCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1pMzg2LmggKExPTkdfRE9VQkxFX01ORU1fU1VGRklYKTogIERlZmluZS4KLSAgICAgICAgKElOVEVMX0RXT1JEX01ORU1fU1VGRklYKTogIERlZmluZS4KLSAgICAgICAgKEJZVEVfUFRSKTogIERlZmluZS4KLSAgICAgICAgKFdPUkRfUFRSKTogIERlZmluZS4KLSAgICAgICAgKERXT1JEX1BUUik6ICBEZWZpbmUuCi0gICAgICAgIChYV09SRF9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoU0hPUlQpOiAgRGVmaW5lLgotICAgICAgICAoT0ZGU0VUX0ZMQVQpOiAgRGVmaW5lLgotICAgICAgICAoRkxBVCk6ICBEZWZpbmUuCi0gICAgICAgIChOT05FX0ZPVU5EKTogIERlZmluZS4KLSAgICAgICAgKE5vX2RTdWYpOiAgRGVmaW5lLgotICAgICAgICAoTm9feFN1Zik6ICBEZWZpbmUuCi0gICAgICAgICogY29uZmlnL3RjLWkzODYuYyAgKHNldF9pbnRlbF9zeW50YXgpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpbnRlbF9zeW50YXgpOiAgRGVjbGFyZS4KLSAgICAgICAgKGFsbG93X25ha2VkX3JlZyk6ICBEZWNsYXJlLgotICAgICAgICAobWRfcHNldWRvX3RhYmxlKTogIFN1cHBvcnQgLmludGVsX3N5bnRheCBhbmQgLmF0dF9zeW50YXguCi0gICAgICAgIChpbnRlbF9mbG9hdF9vcGVyYW5kKTogIE5ldyByb3V0aW5lLgotICAgICAgICAobWRfYXNzZW1ibGUpOiAgSGFuZGxlIElOVEVMX0RXT1JEX01ORU1fU1VGRklYLgotICAgICAgICBIYW5kbGUgYnJhY2tldHMgYXMgd2VsbCBhcyBwYXJlbnMuICBDYWxsIGkzODZfaW50ZWxfb3BlcmFuZCBmb3IKLSAgICAgICAgaW50ZWwgc3ludGF4LiAgUmV2ZXJzZSBvcGVyYW5kcyBpZiBhcHByb3ByaWF0ZS4gIEhhbmRsZSBuZXcKLSAgICAgICAgc3VmZml4ZXMuICBIYW5kbGUgbW92enggYW5kIG1vdnN4LgotICAgICAgICAoaTM4Nl9pc19yZWcpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X2ltbWVkaWF0ZSk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfc2NhbGUpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X2Rpc3BsYWNlbWVudCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfb3BlcmFuZF9tb2RpZmllcik6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X3BhcnNlX3NlZyk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X2ludGVsX29wZXJhbmQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X29wZXJhbmQpOiAgQ2FsbCBpMzg2X2Rpc3BsYWNlbWVudCwgaTM4Nl9pbW1lZGlhdGUsCi0gICAgICAgIGkzODZfc2NhbGUsIGV0Yy4gIGluc3RlYWQgb2YgaGFuZGxpbmcgaW5saW5lLgotICAgICAgICAocGFyc2VfcmVnaXN0ZXIpOiAgSGFuZGxlIHJlZ2lzdGVycyB3aXRob3V0IHByZWZpeC4KLQotTW9uIEZlYiAgMSAxMjoyNDo1OCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLmluIChhcm0tKi1vYWJpKTogIE5ldy4KLSAgICAgICAgKHRodW1iLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jICh0YXJnZXRfb2FiaSk6ICBEZWNsYXJlLgotICAgICAgICAobWRfYXBwbHlfZml4Myk6IFN1cHBvcnQgUkVMIHJlbG9jcy4KLSAgICAgICAgKG1kX3BhcnNlX29wdGlvbik6ICBIYW5kbGUgLW9hYmkuCi0gICAgICAgIChlbGYzMl9hcm1fdGFyZ2V0X2Zvcm1hdCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKG1kX2xvbmdvcHRzKTogIEFkZCBPUFRJT05fT0FCSS4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmg6ICBSZWRlZmluZSBUQVJHRVRfRk9STUFULgotCi0KLTE5OTktMDEtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEhhbmRsZSBvdXQgb2YgcmFuZ2UgZXJyb3IuCi0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKGZyMzBfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBfZm9yY2VfcmVsb2NhdGlvbik6IERlZmF1bHQgdG8gMC4KLQotCSogY29uZmlnL3RjLWZyMzAuaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lLgotCShUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lLgotCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBEbyBub3QgYXBwbHkgZml4ZXMgdG8gVlRBQkxFCi0JcmVsb2NzLiAKLQotMTk5OS0wMS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAod3JpdGVfMl9zaG9ydCk6IERvIG5vdCBnZW5lcmF0ZSBhIHNlcXVlbnRpYWwKLQltZXJnZSBvZiB0d28gaW5zdHJ1Y3Rpb25zIGlmIHRoZSBsZWZ0IGluc3RydWNpdG9uIGtpbGxzIHRoZSByaWdodC4KLQotMTk5OS0wMS0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVkbyB0ZXN0IGZvciB1c2luZyBjZ2VuLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2FkanVzdF9zeW10YWIpOiBQcmV2ZW50IGFjY2lkZW50YWwKLQlyZWRlZmluaXRpb24gb2YgdGhpcyBtYWNyby4KLQotVHVlIEphbiAgNSAyMTo1ODowMyAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2Zyb2JfZmlsZSk6IERpc2FibGUgIlVubWF0Y2hlZCAlaGkgcmVsb2MiCi0Jd2FybmluZy4KLQotMTk5OC0xMi0yOSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRm9yIG1pcHMxNiwgaW5zZXJ0IGEgbm9wIGJldHdlZW4KLQlhIHJlYWQgb2YgSEkgb3IgTE8gYW5kIGFuIGltbWVkaWF0bHkgZm9sbG93aW5nIGJyYW5jaC4KLQotMTk5OC0xMi0yOSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQW5vdGhlciBjb3JyZWN0aW9uIHRvIHRoZSBzZXR0aW5nIG9mCi0JbWlwc19lYWJpNjQuCi0KLTE5OTgtMTItMjMgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IENvcnJlY3QgdHlwZS1vIGluIHNldHRpbmcgb2YgbWlwc19lYWJpNjQuCi0KLTE5OTgtMTItMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBhIE5PUCBhZnRlciBhIHJlbGF4YWJsZSAxNgotCWJpdCBpbnNuIHdoZW4gb3B0aW1pemluZywgc28gdGhhdCBwYXJhbGxlbGlzZWQgaW5zdHJ1Y3Rpb25zIHdpbGwKLQlzdGFydCBvbiBhIDMyIGJpdCBib3VuZGFyeS4KLQotMTk5OC0xMi0xOSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWFiaTY0KTogTmV3LgotCShtZF9iZWdpbik6IFNldCBtaXBzX2VhYmk2NC4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IFVzZSBpdC4KLQotMTk5OC0xMi0xOCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiAKLQlDb3JyZWN0IHNldHRpbmcgb2YgQUJJIGluIGVfZmxhZ3MuCi0KLVdlZCBEZWMgMTYgMTY6MTc6MjIgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9hc3NlbWJsZSk6IFdhcm4gYWJvdXQgaW52YWxpZCBpbnN0cnVjdGlvbnMgaW4gZGVsYXkgc2xvdHMuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbixtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgdnI0MTExLgotCQotMTk5OC0xMi0xNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBNYXJrIGFzIGFuIGVycm9yLCByYXRoZXIgdGhhbiBhCi0Jd2FybmluZywgdmFsdWVzIHRoYXQgZG9uJ3QgZml0IGluIHRoZSBmaWVsZC4KLQotMTk5OC0xMi0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYWJpX3N0cmluZyk6IE5ldy4KLQkobWRfcGFyc2Vfb3B0aW9uLG1kX2xvbmdvcHRzKTogQWRkIG1hYmkuCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTZXQgZV9mbGFncyBiYXNlZCBvbiBtYWJpIGZsYWcuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgdnI0MTExLiAKLQotOTgtMTItMTEgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoYnVpbGRfYnl0ZXMpOiBDaGFuZ2UgbWVzc2FnZSBnaXZlbiBpZiB0aGUKLQlpbnN0cnVjdGlvbiByZXF1aXJlcyBIOC8zMDBIIG1vZGUgYW5kIHdlJ3JlIG5vdCBpbiBIbW9kZSwgdG8KLQlzdWdnZXN0IHRoYXQgaXQgbWF5IGJlIHRoZSBvcGVyYW5kIG1vZGVzIHRoYXQgYXJlIHRoZSBwcm9ibGVtLCBub3QKLQluZWNlc3NhcmlseSB0aGUgb3Bjb2RlLgotCi0xOTk4LTEyLTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jOiBBZGQgbGluZSBzZXBhcmF0b3IgY2hhcmFjdGVyLgotCi1UdWUgRGVjICA4IDE5OjUxOjUwIDE5OTggIE1hcmsgS2xlaW4gIDxta2xlaW5AZGlzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChocHBhLSotbXBlaXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9zb21fY29tcGlsZXIpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1zb20uYyAoY29tcGlsZXJfc2Vlbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG9ial9zb21fY29tcGlsZXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaHBwYS5jOiBVcGRhdGUgdGNfZGF0YSB1c2VzIGZvciBjaGFuZ2UgdG8gYmZkL3NvbS5oLgotIAkobWRfcHNldWRvX3RhYmxlKTogQWRkICJjb21waWxlciIgaWYgT0JKX1NPTS4KLQkocGFfdHlwZV9hcmdzKTogU2V0IGhwcGFfcHJpdl9sZXZlbC4KLQkocGFfY29tcGlsZXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmIE9CSl9TT00uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTU6MDA6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKG91dHB1dF9sZWIxMjgpOiBEb24ndCBtYXJrIGFzIGlubGluZS4KLQotMTk5OC0xMi0wOCAgQW5kcmV3IE1hY0xlb2QgIDxhbWFjbGVvZEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY192Ynl0ZSk6IFByb3RvdHlwZSBhbmQgbmV3IGZ1bmN0aW9uIGZvciAKLQlBSVggLnZieXRlIHVuYWxpZ25lZCBkYXRhIHN1cHBvcnQuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCAndmJ5dGUnIHRvIGxpc3Qgb2YgdmFsaWQgcHNldWRvcy4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBZGQgZWhfZnJhbWUgdG8gbGlzdCBvZiBFTEYgcmVsb2NhdGFibGUgCi0Jc2VjdGlvbnMuCi0KLTE5OTgtMTItMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlLCBkb19hc3NlbWJsZSk6IEltcHJvdmUgZXJyb25lb3VzCi0JaW5wdXQgaGFuZGxpbmcuIAotCi1Nb24gRGVjICA3IDA5OjQ4OjM0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jIChlbGYzMl9hcm1fZm9yY2VfcmVsb2NhdGlvbik6ICBDaGVjayBmb3IKLSAgICAgICAgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0guCi0KLVN1biBEZWMgIDYgMTI6NDY6MzYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBUQVJHRVRfQllURVNfe0JJRyxMSVRUTEV9X0VORElBTiBhZnRlcgotCWNoZWNraW5nIHRoZSB0YXJnZXQgdHlwZS4KLQkobWlwcy1kZWMtYnNkKik6IFNldCBlbmRpYW4gdG8gbGl0dGxlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JQ09GRiB3ZWFrIHN5bWJvbCBzdXBwb3J0LCBiYXNlZCBvbiBwYXRjaGVzIGZyb20gTWFyayBFbGJyZWNodAotCTxzbm93YmFsbDNAdXNhLm5ldD46Ci0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19XRUFLKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3dlYWspOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvYmpfY29mZl9lbmRlZikgW2JvdGggdmVyc2lvbnNdOiBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogTGlrZXdpc2UuCi0JKHlhbmtfc3ltYm9scyk6IExpa2V3aXNlLgotCShvYmpfcHNldWRvX3RhYmxlKTogQWRkICJ3ZWFrIi4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotZ251Kik6IE5ldyB0YXJnZXQuICBGcm9tIEF5bWVyaWMgVmluY2VudAotCTxheW1lcmljLnZpbmNlbnRAZW1pLnUtYm9yZGVhdXguZnI+LgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGN1cnJlbnQgdG9vbHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChlbWl0X2xkZ3ApOiBHaXZlIGFuIGVycm9yIG1lc3NhZ2UgcmF0aGVyIHRoYW4KLQlhbiBhc3NlcnRpb24gZmFpbHVyZSBmb3IgYSBjYXNlIHdlIGNhbid0IGhhbmRsZSB3aGVuIE9CSl9FQ09GRi4KLQotCSogZXhwci5jIChvcGVyYXRvcik6IEFuZCB3aXRoIDB4ZmYgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBzaWduZWQKLQljaGFyLgotCi0xOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IEdlbmVyYXRlCi0JQkZEX1JFTE9DX0ZSMzBfNDggaW5zdGVhZCBvZiBCRkRfUkVMT0NfRlIzMF8zMi4KLQotMTk5OC0xMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBFbmFibGUgcmVsb2NzIGZvcgotCUxESToyMCBpbnNuLgotCi1UaHUgTm92IDI2IDExOjIzOjQ4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogUmVzdG9yZSBwcmV2aW91cyBjYWxjdWxhdGlvbgotCW9mIHBjcmVsIHBvaW50LgotCi1UdWUgTm92IDI0IDE3OjIxOjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IEZpeCBjYWxjdWxhdGlvbiBvZgotCXBjcmVsIHBvaW50LgotCi1UdWUgTm92IDI0IDE0OjU0OjM4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdGF0aWMgJ2V0eXBlJyBoYXZlIGZpbGUKLQlzY29wZS4KLQkoZDEwdl9jbGVhbnVwKTogT25seSBnZW5lcmF0ZSBwcmV2aW91cyBpbnNuIGlmIGEgbXVsdGlsaW5lIGluc24gaXMKLQlub3QgcGVuZGluZy4KLQotRnJpIE5vdiAyMCAxMTo0MToxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IEFkZCBzdXBwb3J0IGZvcgotCUZSMzBfT1BFUkFORF9JMzIuIAotCi1UaHUgTm92IDE5IDE1OjAxOjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tYXJtN3h4eCBhbmQKLQktbWFybTZ4eHggY29tbWFuZCBsaW5lIHN3aXRjaGVzLgotCi0xOTk4LTExLTE4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChERVApOiBVc2UgJChzcmNkaXIpLy4uL21rZGVwLgotCShpdGJsLW9wcy5vKTogRGVsZXRlIGR1cGxpY2F0ZSBkZXBlbmRlbmNpZXMuCi0JUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JQWRkIGZyMzAgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBOb3YgMTcgMTM6NDI6NDIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdAotCW9wY29kZSBsaXN0LgotCSogbGlzdGluZy5jOiBJZ25vcmUgbGluZSB0ZXJtaW5hdG9yIGNoYXJhY3RlcnMgZm91bmQgaW5zaWRlCi0Jc3RyaW5ncy4gCi0KLVRodSBOb3YgMTIgMTk6MjE6MjQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9nYXMucG90OiBSZWdlbmVyYXRlZC4KLQotVGh1IE5vdiAxMiAxMDo1NDoxNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChmcjMwX2lzX2NvbG9uX2luc24pOiBOZXcgbmFtZSBmb3IKLQlmcjMwX2lzX2xhYmVsX3N0YXJ0KCkuICBBbHNvIGNoZWNrcyBmb3IgZGVsYXkgc2xvdCBpbnNucy4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoZnIzMF9pc19sYWJlbF9zdGFydCk6IE5ldyBmdW5jdGlvbjogSGFuZGxlCi0JRlIzMCBpbnN0cnVjdGlvbnMgd2hpY2ggY29udGFpbiBhIGNvbG9uIGluIHRoZSBtbmVtb25pYy4KLQotCSogY29uZmlnL3RjLWZyMzAuaCAoVENfU1RBUlRfTEFCRUwpOiBEZWZpbmUgdGhpcyBtYWNyby4KLQotV2VkIE5vdiAxMSAwOTo1ODoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jOiBSZW1vdmVkIGN1cnJlbnRseSBzdXBlcmZsb3VzIGNvZGUuCi0KLVR1ZSBOb3YgMTAgMTM6MTM6MDUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtZnIzMC5jOiBUd2Vha2luZyBzbyB0aGF0IGl0IHdpbGwgY29tcGlsZS4KLQotVHVlIE5vdiAxMCAxNDo0MTozMyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1kMTB2LmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogIERlZmluZS4KLSAgICAgICAgKGQxMHZfZm9yY2VfcmVsb2NhdGlvbik6ICBEZWNsYXJlLgotICAgICAgICAqIGNvbmZpZy90Yy1kMTB2LmMgKHRjX2dlbl9yZWxvYyk6ICBIYW5kbGUgVnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeDMpOiAgSGFuZGxlIFZ0YWJsZSByZWxvY3MuCi0gICAgICAgIChkMTB2X2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KLSAgICAgICAgKGQxMHZfZm9yY2VfcmVsb2NhdGlvbik6ICBOZXcuCi0KLU1vbiBOb3YgIDkgMTQ6MjU6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYzogQ2hhbmdlIGRlZmF1bHQgYmVoYXZpb3VyIHRvIGlnbm9yZSBwb3RlbnRpYWwKLQljb25mbGljdHMgYmV0d2VlbiByZWdpc3RlciBuYW1lIGFuZCBzeW1ib2wgbmFtZXMuCi0KLVdlZCBOb3YgIDQgMTg6NDI6MDAgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBmcjMwLSotKi4KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCSogcG8vZ2FzLnBvdDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBOb3YgIDIgMjA6NTQ6MTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoYXNzZW1ibGVfdHdvX2luc25zKTogRW5zdXJlIGJvdGggaW5zbnMKLQlhcmUgMTYgYml0IGluc25zLgotCi1Nb24gTm92ICAyIDIwOjEwOjE4IDE5OTggIE1hcnRpbiB2b24gTG9ld2lzICA8bG9ld2lzQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBTZXQgY2hhcmFjdGVycyBhYm92ZSAxMjcgdG8gYmUgc3ltYm9sCi0JY2hhcmFjdGVycy4KLQkoZG9fc2NydWJfY2hhcnMpOiBBZGQgc29tZSBjYXN0cyB0byB1bnNpZ25lZCBjaGFyIHRvIGF2b2lkCi0JdW53YW50ZWQgc2lnbiBleHRlbnNpb24uCi0JKiByZWFkLmMgKGxleF90eXBlKTogU2V0IGNoYXJhY3RlcnMgYWJvdXQgMTI3IHRvIGJlIHN5bWJvbAotCWNoYXJhY3RlcnMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9iZWdpbik6IFNldCBpZGVudGlmaWVyX2NoYXJzIGFuZAotCW9wZXJhbmRfY2hhcnMgZm9yIHZhbHVlcyBhYm92ZSAxMjcuCi0KLU1vbiBOb3YgIDIgMTU6MDU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLSAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIE9jdCAyNyAxMzoxODo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmM6IEFkZCBzdXBwb3J0IGZvciBwcm9kdWNpbmcgYSBsaXN0aW5nIGZyb20gcGlwZWQKLQlpbnB1dC4gCi0KLVR1ZSBPY3QgMjcgMDg6NTY6NDQgMTk5OCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGhpbG9faW50ZXJsb2Nrcyk6IFJlbW92ZSBtaXBzXzM5MDAuCi0JKGFwcGVuZF9pbnNuKTogQWNjb3VudCBmb3IgdGhlIHR4MzkncyBtdWx0aXBseSBiZWhhdmlvci4KLQotMTk5OC0xMC0yNiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGFzc2VtYmxlX3R3b19pbnNucyk6IFJlbmFtZSBhc3NlbWJsZV90d29faW5zbnMKLQlmcm9tIGFzc2VtYmxlX3BhcmFsbGVsX2luc25zLiAgQWRkIHN1cHBvcnQgZm9yICctPicgdG8gaW5kaWNhdGUKLQlleHBsaWNpdGx5IHNlcmlhbGl6aW5nIHRoZSBpbnN0cnVjdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0KLVNhdCBPY3QgMjQgMTU6MTI6MTkgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtc2guYyAoc2hfZml4X2FkanVzdGFibGUpOiAgQWRqdXN0IEVYVEVSTiBhbmQKLSAgICAgICAgV0VBSyBoYW5kbGluZy4KLQotVGh1IE9jdCAyMiAxMjo0MTozMyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6ICBSZXZlcnQgbGFzdCBjaGFuZ2UuCi0KLVRodSBPY3QgMjIgMTA6MDM6MTUgMTk5OCAgUm9uIFVucmF1ICA8cnVucmF1QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgOiBzdXBwb3J0IGZyYW1lIGFuZCByZWdtYXNrL2ZyZWdtYXNrIHdoZW4KLQkgIE1JUFNfU1RBQlNfRUxGIGlzIHNwZWNpZmllZC4KLQotV2VkIE9jdCAyMSAxMTszNDo1MSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zaC5jIChzaF9maXhfYWRqdXN0YWJsZSk6ICBPbmx5IGluY2x1ZGUgaWYgT0JKX0VMRi4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeCk6ICBEb24ndCByZXR1cm4gMSBmb3IgVlRBQkxFIHJlbG9jcy4KLSAgICAgICAgKiBjb25maWcvdGMtc2guaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZSBvbmx5IGlmIE9CSl9FTEYuCi0KLVR1ZSBPY3QgMjAgMTE6MTg6MjggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBkb2MvYy1pMzg2LnRleGk6IFJlcGxhY2Ugb2NjdXJlbmNlcyBvZiAib3Bjb2RlIiB3aXRoCi0JImluc3RydWN0aW9uIG1uZW1vbmljIiwgImluc3RydWN0aW9uIiwgb3IgIm1uZW1vbmljIiB3aGVuCi0JcmVmZXJyaW5nIHRvIHRoZSBuYW1lIG9mIGFuIGluc3RydWN0aW9uLiAgVXNlICJvcGNvZGUiIHdoZW4KLQlyZWZlcnJpbmcgdG8gdGhlIHNlcXVlbmNlIG9mIG1hY2hpbmUgYnl0ZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG9wY29kZV9jaGFycyk6IFJlbmFtZSB0byBtbmVtb25pY19jaGFycy4KLQkoaXNfb3Bjb2RlX2NoYXIpOiBSZW5hbWUgdG8gaXNfbW5lbW9uaWNfY2hhci4KLQkobWRfYXNzZW1ibGUgYW5kIGkzODZfb3BlcmFuZCk6IENvcnJlY3QgZXJyb3IgbWVzc2FnZXMgZnJvbQotICAgICAgICAib3Bjb2RlIiB0byAiaW5zdHJ1Y3Rpb24gbW5lbW9uaWMiCi0JUmVuYW1lIHRocm91Z2hvdXQgb3Bjb2RlW10gLT4gbW5lbW9uaWNbXSwgb3BwIC0+IG1uZW1fcCwKLQlNQVhfT1BDT0RFX1NJWkUgLT4gTUFYX01ORU1fU0laRSwKLQlEV09SRF9PUENPREVfU1VGRklYIC0+IERXT1JEX01ORU1fU1VGRklYLAotCVdPUkRfT1BDT0RFX1NVRkZJWCAtPiBXT1JEX01ORU1fU1VGRklYLAotCUJZVEVfT1BDT0RFX1NVRkZJWCAtPiBCWVRFX01ORU1fU1VGRklYLAotCVNIT1JUX09QQ09ERV9TVUZGSVggLT4gU0hPUlRfTU5FTV9TVUZGSVgKLQlMT05HX09QQ09ERV9TVUZGSVggLT4gTE9OR19NTkVNX1NVRkZJWAotCi0JKiBjb25maWcvdGMtaTM4Ni5oICgqX01ORU1fU1VGRklYKTogUmVuYW1lIGZyb20gKl9PUENPREVfU1VGRklYLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBDaGVjayBmb3IgZ2FyYmFnZSBhZnRlcgotCXJlZ2lzdGVyIG5hbWUuCi0KLVR1ZSBPY3QgMjAgMTA6NDk6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogQ2hhbmdlIGhhbmRsaW5nIG9mIFBDUkVMIHJlbG9jCi0gCWZvciBCRkRfQVNTRU1CTEVSIHRvIG9ubHkgY2hhbmdlIHZhbHVlIHdoZW4gQ09GRiBpZiBURV9QRS4KLQotTW9uIE9jdCAxOSAyMDoyMDo0MiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zaC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1zaC5jIChzaF9mb3JjZV9yZWxvY2F0aW9uKTogIEhhbmRsZSBWVCByZWxvY3MuCi0gICAgICAgIChtZF9hcHBseV9maXgpOiAgTGlrZXdpc2UuCi0gICAgICAgICh0Y19nZW5fcmVsb2MpOiAgTGlrZXdpc2UuCi0gICAgICAgIChzaF9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0KLU1vbiBPY3QgMTkgMTI6MzU6NDMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBVcGRhdGUgaGFuZGxpbmcgb2YgQ0dFTl9JTlRfSU5TTl9QLgotCSogY2dlbi5oIChnYXNfY2dlbl9maW5pc2hfaW5zbik6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2luc24pOiBDR0VOX0lOVF9JTlNOIC0+IENHRU5fSU5UX0lOU05fUC4KLQljZ2VuX2luc25fdCAtPiBDR0VOX0lOU05fSU5ULgotCShtYWtlX3BhcmFsbGVsKTogVXBkYXRlIGhhbmRsaW5nIG9mIENHRU5fSU5UX0lOU05fUC4KLQkoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IERpdHRvLgotCSh0YXJnZXRfbWFrZV9wYXJhbGxlbCk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBVc2UgaXQuCi0KLU1vbiBPY3QgMTkgMTM6MTY6MTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2ZvcmNlX3JlbG9jYXRpb24pOiAgRml4IHR5cG8uCi0KLVN1biBPY3QgMTggMTg6NDg6NTcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN1cmUgdGhlIGVudGlyZSBvcGNvZGUgaXMKLQljb252ZXJ0ZWQgaW50byBsb3dlciBjYXNlLgotCi1GcmkgT2N0IDE2IDEzOjM2OjM0IENEVCBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgVlRBQkxFIHJlbG9jcy4KLSAgICAgICAgKGdhc19jZ2VuX3RjX2dlbl9yZWxvYyk6ICBMaWtld2lzZS4KLSAgICAgICAgKiBjb25maWcvdGMtbTMyci5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZml4X2FkanVzdGFibGUpOiAgTmV3LgotICAgICAgICAobTMycl9mb3JjZV9yZWxvY2F0aW9uKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgotCi1XZWQgT2N0IDE0IDExOjMzOjM4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0gRGlyZWN0aXZlcyk6IERvY3VtZW50IC5sdG9ybiBkaXJlY3RpdmUuCi0KLU1vbiBPY3QgMTIgMTE6MDc6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IENvbnZlcnQgc2Vjb25kIG9wY29kZQotCXRvIGxvd2VyIGNhc2UgYmVmb3JlIHBhcnNpbmcuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogSWdub3JlIGNvbmZsaWN0cyB3aGVuIGV4cGxpY2l0bHkKLQlwYXJhbGxlbCBpbnNucyBtb2RpZnQgYnV0cyBpbiB0aGUgUFNXIGFzIGEgc2lkZSBlZmZlY3QuCi0KLVRodSBPY3QgIDggMTA6MTg6MzMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZmluZF9mb3JtYXQpOiBUZXN0IGZvciBtaXNzaW5nIGZsYWcgYW5kCi0JY29udHJvbCByZWdpc3RlcnMuCi0JCi0JKG1kX2FwcGx5X2ZpeDMpOiBGaXggZXJyb3IgbWVzc2FnZXMgdG8gYXZvaWQKLQlhc3N1bXB0aW9uIGFib3V0IHByZXNlbmNlIG9mIGEgc3ltYm9sLgotCi0JKHBhcmFsbGVsX29rKTogRGlzYWxsb3cgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIHRoYXQgYm90aCBtb2RpZnkgdGhlCi0Jc2FtZSBmbGFnIHJlZ2lzdGVyLgotCi0JKGZpbmRfZm9ybWF0KTogR2VuZXJhdGUgYSB3YXJuaW5nIGlmIGFuIG9kZCBudW1iZXJlZCByZWdpc3RlciBpcwotCXVzZWQgYXMgdGhlIGZpcnN0IHJlZ2lzdGVyIGluIGEgbXV0bGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBPY3QgIDcgMTQ6MDk6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IERvIG5vdCBhc3N1bWUgdGhhdCBiYWQKLQlyZWxvY2F0aW9ucyBhcmUgYWx3YXlzIGFzc29jaWF0ZWQgd2l0aCBhIHN5bWJvbC4KLQotVHVlIE9jdCAgNiAwOTozMToxNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHRjLXNwYXJjLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiAgRGVmaW5lLgotICAgICAgICAoZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbik6ICBEZWNsYXJlLgotICAgICAgICAqIHRjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeDMpOiAgSGFuZGxlIHZ0YWJsZSByZWxvY3MuCi0gICAgICAgICh0Y19nZW5fcmVsb2MpOiAgSGFuZGxlIHZ0YWJsZSByZWxvY3MuCi0gICAgICAgIChlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uKTogIE5ldy4KLQotTW9uIE9jdCAgNSAwOToyNTozMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnN1LmNvbT4KLQotICAgICAgICAqIHN5bWJvbHMuYyAoU19JU19GVU5DVElPTik6ICBOZXcuCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KLSAgICAgICAgKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiAgRGVmaW5lLgotICAgICAgICAodjg1MF9mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAodGNfZ2VuX3JlbG9jKTogIFVzZSBvZmZzZXQgaW5zdGVhZAotICAgICAgICBvZiBmeF9hZGRudW1iZXIgZm9yIFZUQUJMRSByZWxvYyBhZGRlbmRzLgotICAgICAgICAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgVlRBQkxFIHJlbG9jcy4KLSAgICAgICAgKHY4NTBfZml4X2FkanVzdGFibGUpOiAgTmV3LgotICAgICAgICAodjg1MF9mb3JjZV9yZWxvY2F0aW9uKTogIE5ldy4KLQotTW9uIE9jdCAgNSAwMDo0ODo1MiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAoZnBfb3BlcmFuZF9mb3JtYXQpOiBBZGQgc29tZSBhZGRpdGlvbmFsIGZvcm1hdHMuCi0JKHBhX2lwKTogRG8gbm90IGF1dG9tYXRpY2FsbHkgcHJvbW90ZSBpbnRvIHBhMi4wIG1vZGUuCi0JKHBhX2xldmVsKTogSGFuZGxlICIubGV2ZWwgMi4wIi4KLQotU3VuIE9jdCAgNCAyMDo1Nzo0MyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIEFNRF8zRE5PV19PUENPREUuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0ZW1wbGF0ZS5leHRlbnNpb25fb3Bjb2RlKTogQ2hhbmdlIHRvCi0gICAgICAgIHVuc2lnbmVkIGludCB0byBhbGxvdyBmdWxsIHJhbmdlIG9mIDgtYml0IG9wY29kZSBzdWZmaXhlcy4KLQkoTm9uZSk6IFJlZGVmaW5lIGFzIDB4ZmZmZi4KLQotCUZyb20gSmVmZiBCIEVwbGVyIDxqZXBsZXJAdXNncy5nb3Y+Ci0JKiBkb2MvYy1pMzg2LnRleGkgKGkzODYtU0lNRCk6IE5ldyBzZWN0aW9uLgotCi1UaHUgT2N0ICAxIDE1OjM3OjU0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZGlzY2FyZF9yZXN0X29mX2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmg6IERlY2xhcmUgaXQuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9tYXNrLCBzX2FscGhhX2ZyYW1lKTogVXNlIGl0LgotCi1UaHUgT2N0ICAxIDEwOjMzOjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX29wY29kZSk6IENvcGUgd2l0aCB0aGUgY2FzZSB3aGVyZSBhIHJlZ2lzdGVyIG5hbWUgbWF0Y2hlcwotCWEgc3ltYm9sIG5hbWUuCi0KLVdlZCBTZXAgMzAgMTA6NTI6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGNyZWxfZnJvbSk6IFJlbmFtZSB0bwotCXY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uLgotCSh2ODUwX3BjcmVsX2Zyb21fc2VjdGlvbik6IERvIG5vdCByZXNvbHZlcyBzeW1ib2xzIGluIG90aGVyCi0Jc2VjdGlvbnMuIAotCi0JKiBjb25maWcvdGMtdjg1MC5oIChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBEZWZpbmUuCi0KLU1vbiBTZXAgMjggMTE6MDE6MjAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBHZW5lcmF0ZSBhbiBlcnJvciBpZiBhIHJlZ2lzdGVyCi0JaXMgc3VwcGxpZWQgZm9yIGFuIG9wZXJhbmQgdGhhdCBzaG91bGQgbm90IGJlIGEgcmVnaXN0ZXIuCi0KLUZyaSBTZXAgMjUgMTA6MDQ6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAod3JpdGVfMl9zaG9ydCk6IEJ1dCBkbyBhbGxvdyBkZWxheWVkIGJyYW5jaAotCWluc3RydWN0aW9ucyB0byBoYXZlIGFub3RoZXIgaW5zdHJ1Y3Rpb24gaW4gdGhlIHJpZ2h0IGJpbi4KLQotVGh1IFNlcCAyNCAwOToyODozNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRG8gbm90IGFsbG93IGluc3RydWN0aW9ucyBpbgotCXRoZSByaWdodCBjb250YWluZXIgaWYgdGhlIGxlZnQgY29udGFpbmVyIGhvbGRzIGEgYnJhbmNoCi0JaW5zdHJ1Y3Rpb24uIAotCi1XZWQgU2VwIDIzIDEwOjU0OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHJlZ19uYW1lX3NlYXJjaCk6IE9ubHkgd2FybiBpZiBhIG5hbWUgbWF0Y2hlcwotCWJvdGggYSByZWdpc3RlciBuYW1lIGFuZCBzeW1ib2wgbmFtZS4KLQkoZmluZF9mb3JtYXQpOiBBbGxvdyBjb3JyZWN0IHBhcnNpbmcgb2YgTVZUU1lTIGFuZCBNVkZTWVMgaW5zbnMuCi0KLVR1ZSBTZXAgMjIgMTc6NDk6MTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAod3JpdGVfMl9zaG9ydCk6IEltcGxlbWVudCBFSVRIRVJfQlVUX1BSRUZFUl9NVQotCWV4ZWN1dGlvbiB1bml0IGNsYXNzLgotCi0JKHJlZ19uYW1lX3NlYXJjaCk6IElmIGEgbmFtZSBtYXRjaGVzIGEgcmVnaXN0ZXIgYW5kIGEgc3ltYm9sLAotCXByZWZlciB0aGUgcmVnaXN0ZXIuCi0JKGZpbmRfZm9ybWF0KTogRGlzYWxsb3cgZmxhZyByZWdpc3RlcnMgd2hlbiBhIGdlbmVyYWwgcHVycG9zZQotCXJlZ2lzdGVyIGlzIHJlcXVpcmVkLgotCUlmIGEgbnVtYmVyIGlzIHJlcXVpcmVkLCBidXQgYSByZWdpc3RlciBoYXMgYmVlbiBnaXZlbiwgY2hlY2sgdG8KLQlzZWUgaWYgYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSByZWdpc3RlciBleGlzdHMsIGFuZCBpZgotCXNvLCB1c2UgdGhhdCBzeW1ib2wuCi0KLVR1ZSBTZXAgMjIgMTY6NDA6NTIgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpOiBBZGQgbWlzc2luZyBwYXJlbnMuCi0KLVR1ZSBTZXAgMjIgMTU6NDQ6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZmluZF9mb3JtYXQpOiBEbyBub3QgYWNjZXB0IGZsYWcgcmVnaXN0ZXJzIGFzCi0JZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KLQkoZmluZF9mb3JtYXQpOiBJZiBhbiBpbW1lZGlhdGUgdmFsdWUgaXMgZXhwZWN0ZWQgYXQgYSBnaXZlbiBwbGFjZQotCWluIGEgZm9ybWF0LCBidXQgYSByZWdpc3RlciBuYW1lIGhhcyBiZWVuIHByb3ZpZGVkIGluc3RlYWQsIGNoZWNrCi0JdG8gc2VlIGlmIHRoYXQgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzIHRoZSBuYW1lIG9mIGEgcHJlZGVmaW5lZAotCXN5bWJvbCBhbmQgaWYgaXQgZG9lcywgdGhlbiB1c2UgdGhlIHN5bWJvbCBpbnN0ZWFkLgotCShyZWdfbmFtZV9zZWFyY2gpOiBJZiBhIHJlZ2lzdGVyIG5hbWUgbWF0Y2hlcyBhIHN5bWJvbCBuYW1lLAotCXByZWZlciB0aGUgcmVnaXN0ZXIgbmFtZSB0byB0aGUgc3ltYm9sIG5hbWUuCi0KLU1vbiBTZXAgMjEgMTA6NDI6NTcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9kb19hbGlnbik6IEFmdGVyIGluc2VydGluZyBOT1BzLCByZXNldAotCXRoZSBwcmV2aW91cyBpbnNuIHRvIGVtcHR5LgotCi0xOTk4LTA5LTIwICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogRG8gbm90IGJyZWFrIHN0cmluZyBpbnRvIHR3bwotCXBpZWNlcywgZm9yY2luZyB0aGUgdXNlIG9mIGFuIEFOU0kgY29tcGlsZXIuCi0KLVN1biBTZXAgMjAgMDA6NTg6MTIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBOZXcgbWFjcm8uICBGb3JjZSB2dGFibGUKLQlyZWxvY3MuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IERvIG5vdGhpbmcgZm9yIHZ0YWJsZSByZWxvY3MuCi0KLVR1ZSBTZXAgMTUgMDg6NTE6MDcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92dGFibGVfaW5oZXJpdCk6ICBIYW5kbGUgYXJtCi0gICAgICAgIGFzc2VtYmxlciBzeW50YXguCi0gICAgICAgIChvYmpfZWxmX3Z0YWJsZV9lbnRyeSk6ICBMaWtld2lzZS4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmg6ICBEZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTiBmb3IgT0JKX0VMRi4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgVlRBQkxFIHJlbG9jYXRpb25zLgotICAgICAgICAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0gICAgICAgIChhcm1fZml4X2FkanVzdGFibGUpOiBMaWtld2lzZS4KLSAgICAgICAgKGVsZjMyX2FybV9mb3JjZV9yZWxvY2F0aW9uKTogTmV3LgotICAgICAgICAoYXJtZWxmX2Zyb2Jfc3ltYm9sKTogIFJlbW92ZSBjb2ZmLXN0eWxlIHN5bWJvbCBzdXBwb3J0LgotCi1XZWQgU2VwICA5IDExOjI3OjE2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IEZpeCB0eXBvIGluIGxhc3QgcGF0Y2guCi0KLVR1ZSBTZXAgIDggMTg6MTA6MDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jIChhcm1fYWRqdXN0X3N5bXRhYik6ICBNb3ZlICNpZmRlZgotICAgICAgICBPQkpfQ09GRiBzbyB0aGF0IHJvdXRpbmUgaXMgZGVmaW5lZCBmb3IgYS5vdXQgZm9ybWF0LgotCi1UdWUgU2VwICA4IDE1OjU2OjE5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IERldGVjdCBub24tc2VnbWVudCByZWdpc3RlcnMKLQl1c2VkIGFzIHNlZ21lbnQgcHJlZml4ZXMuCi0KLVNhdCBTZXAgIDUgMTk6MDA6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlaG9wdC5jIChjaGVja19laF9mcmFtZSk6IENoZWNrIHRoZSBzaXplIG9mIHRoZSBGREUsIGFuZCBkb24ndAotCW9wdGltaXplIGFjcm9zcyBGREUgYm91bmRhcmllcy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBQcmVzZXJ2ZSBhbnkgbGluayBvbmNlCi0JZmxhZ3Mgd2hlbiBzZXR0aW5nIHRoZSBzZWN0aW9uIGZsYWdzLgotCi1GcmkgU2VwICA0IDE3OjA3OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAob2JqX2FkanVzdF9zeW10YWIpOiBGaXhlZCB0eXBvLgotCSogY29uZmlnL3RjLWFybS5jIChhcm1lbGZfYWRqdXN0X3N5bXRhYik6IFJlZm9ybWF0dGVkLgotCi1GcmkgU2VwICA0IDEzOjU3OjQzIDE5OTggIEpha3ViIEplbGluZWsgPGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChpbl9zaWduZWRfcmFuZ2UpOiBTaWduIGV4dGVuZCAzMi1iaXQgd29yZHMKLQl0byB0aGUgaG9zdCB3aWR0aC4KLQotV2VkIFNlcCAgMiAxMTozMToxNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBmcmFncy5jIChmcmFnX2dyb3cpOiBJbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBmcmFnIHN0cnVjdCBpbiB0aGUKLQlvYnN0YWNrIGNodW5rIHNpemUuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQWRqdXN0IHRoZSBzZWdpbmZvIGZyY2hhaW4gc3RhcnQKLQlpZiB0aGUgbmV3IHN1YnNlZyBjb21lcyBiZWZvcmUgdGhlIG9sZC4KLQotVHVlIFNlcCAgMSAxNTowMTozMyAxOTk4ICBKYWt1YiBKZWxpbmVrIDxqakBzdW5zaXRlLm1zLm1mZi5jdW5pLmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBbGxvdyBhbGwgZGlnaXRzIGluIGFuIGluc3RydWN0aW9uCi0JdG8gaGFuZGxlIGVkZ2U4IGFuZCBlZGdlMTYuCi0KLU1vbiBBdWcgMzEgMDk6NTE6MTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92dGFibGVfaW5oZXJpdCk6IFByaW50IGVycm9yIG1lc3NhZ2UKLQliZWZvcmUgd2UgY2xvYmJlciB0aGUgc3ltYm9sIGludm9sdmVkLgotCi1Nb24gQXVnIDMxIDEwOjU4OjA2IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jOiAgUmVtb3ZlIE9CSl9FTEYgZGVmaW5pdGlvbnMgZm9yIAotICAgICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIGFuZCBTX1NFVF9TVE9SQUdFX0NMQVNTLiAgT25seQotICAgICAgICB1c2UgYXJtX2FkanVzdF9zeW10YWIgZm9yIE9CSl9DT0ZGLgotICAgICAgICAoYXJtZWxmX2FkanVzdF9zeW10YWIpOiAgTmV3IFJvdXRpbmUuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5oOiAgRGVmaW5lIG9ial9hZGp1c3Rfc3ltdGFiIHRvCi0gICAgICAgIGFybWVsZl9hZGp1c3Rfc3ltdGFiIGZvciBPQkpfRUxGLgotICAgICAgICAKLVNhdCBBdWcgMjkgMjI6MTg6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIGFsbCBpMzg2LWVsZiB0YXJnZXRzIHVzZSBiZmRfZ2FzLgotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uKTogTmV3LgotCSh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgZml4IHZ0YWJsZSByZWxvY3MuCi0JKG1kX2FwcGx5X2ZpeDMpOiBMaWtld2lzZS4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIHRoZW0uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogQWx3YXlzIGRlZmluZSwgY2FsbGluZwotCXRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbi4KLQotTW9uIEF1ZyAyNCAxMzo0MDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3Nob3dfdXNhZ2UpOiBJbXByb3ZlIGZvcm1hdHRpbmcgb2YgLS1oZWxwIG91dHB1dC4KLQotRnJpIEF1ZyAyMSAxODo0Mzo0OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hc3NlbWJsZSk6IENvcHkgcHJldmlvdXMgb3Bjb2RlIG92ZXIKLQljdXJyZW50IG9wY29kZSBhZnRlciB3cml0aW5nIHRoZSBmaXJzdCBpbnN0dXJjdGlvbiBvZiBhIHJldmVyc2UKLQlzZXF1ZW50aWFsIHBhaXIuIAotCQotRnJpIEF1ZyAyMSAwNzozMDozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWFkLmggKGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IEFkZCBwcm90b3R5cGUuCi0JKiByZWFkLmMgKGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IE1ha2Ugbm9uLXN0YXRpYy4KLQotVGh1IEF1ZyAyMCAyMzoxNzowNCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogT25seSB3YXJuIGZvciBhZGRyZXNzL2RhdGEgc2l6ZQotCXByZWZpeGVzLgotCi1UaHUgQXVnIDIwIDE0OjQ1OjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX2ZpeF9hZGp1c3RhYmxlKTogRG8gbm90IGFkanVzdCByZWxvY2F0aW9ucwotCWFnYWluc3QgVGh1bWIgZnVuY3Rpb24gbmFtZXMsIGFzIHRoZSBsaW5rZXIgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbi4KLQotMTk5OC0wOC0yMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IENoZWNrIGFsc28gdGhhdCB0aGVyZSBpcyBubyBhZHZhbmNlIGluIG9wZXJhbmQKLQlhZnRlciBhdG9mX2dlbmVyaWMgaW4gb3JkZXIgdG8gZGVjaWRlICJpcyBpdCBsYWJlbCAwZiBvciBmbG9hdGluZwotCXBvaW50IG51bWJlcj8iLgotCi1XZWQgQXVnIDE5IDA5OjMwOjE2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IFJlcGxhY2UgZG91YmxlIGRhc2ggcHJlZml4IHRvIE0zMlIgc3BlY2lmaWMKLQljb21tYW5kIGxpbmUgb3B0aW9ucyB3aXRoIGEgc2luZ2xlIGRhc2guCi0JKiBkb2MvYy1tMzJyLnRleGk6IFJlcGxhY2UgZG91YmxlIGRhc2ggcHJlZml4IHdpdGggYSBzaW5nbGUgZGFzaC4KLQotVHVlIEF1ZyAxOCAxMTo1OTo0MyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogdGMtYXJtLmg6IERlZmluZSBvYmpfZml4X2FkanVzdGFibGUgZm9yIE9CSl9FTEYuCi0gICAgICAgKiB0Yy1hcm0uYyAoYXJtX2ZpeF9hZGp1c3RhYmxlKTogTmV3IHJvdXRpbmUuCi0KLTE5OTgtMDgtMTMgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfYWxpZ24sIHNfY29tbSwgc19tcmlfY29tbW9uLCBzX2ZhaWwsIHNfZ2xvYmwsIHNfc3BhY2UsCi0Jc19mbG9hdF9zcGFjZSwgc19zdHJ1Y3QsIGNvbnNfd29ya2VyKTogTW92ZSBpZ25vcmVfcmVzdF9vZl9saW5lIG9yCi0JZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSBiZWZvcmUgbXJpX2NvbW1lbnRfZW5kLgotCShlcXVhbHMpOiBDaGVjayBnYXJiYWdlIGFmdGVyIGV4cHJlc3Npb24gYmVmb3JlCi0JbXJpX2NvbW1lbnRfZW5kIGluIE1SSSBtb2RlLgotCi1UaHUgQXVnIDEzIDE1OjA4OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBDb3JyZWN0IE1fU0dFX0kvTV9TR0VVSV9JIGNhc2UgZm9yIGEKLQlzbWFsbCBpbW1lZGlhdGUgY29uc3RhbnQgdG8gdXNlIHRoZSBjb25zdGFudCBpdHNlbGYgcmF0aGVyIHRoYW4KLQlhbHdheXMgdXNpbmcgMS4KLQotV2VkIEF1ZyAxMiAxODo0NzozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2VudGVyKTogQ2FsbCBhc19iYWQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKHBhX2xlYXZlKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTIgMTM6MjU6MDMgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEVtaXQgYSB3YXJuaW5nIGZvciBzdGFuZC1hbG9uZQotCXByZWZpeGVzLgotCShpMzg2X29wZXJhbmQpOiBGaXggYW4gZXJyb3IgbWVzc2FnZS4KLQotVHVlIEF1ZyAxMSAxNDo0NDozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIERpcmVjdGl2ZXMpOiBEb2N1bWVudCAucmVxIGRpcmVjdGl2ZS4KLQotCSogY29uZmlnL3RjLWFybS5jIChyZWdfcmVxdWlyZWRfaGVyZSk6IERpc3BsYXkgZXJyb25lb3VzIHN0cmluZyBpZgotCXRoZSByZWdpc3RlciBuYW1lIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgotCURvIG5vdCBzZXQgaW5zdC5pbnN0cnVjdGlvbiBpZiB0aGUgc2lmdCBpcyAtMS4KLQotTW9uIEF1ZyAxMCAxNTozOTo1NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAodGNfZ2VuX3JlbG9jKTogQmlhcyBXRUFLIHN5bWJvbHMganVzdCBhcwotCXdlIGRvIGZvciBFWFRFUk4uCi0KLU1vbiBBdWcgMTAgMTU6MDY6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZDMwdl9hbGlnbik6IEFsd2F5cyBwZXJmb3JtIGFsaWdubWVudCByZXF1ZXN0LAotCWV2ZW4gaWYgaXQgaXMgYmVsaXZlZCB0byBiZSB1bm5lY2Vzc2FyeS4KLQotTW9uIEF1ZyAxMCAxNzo0ODowOSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQljb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBTaXplIGltbWVkaWF0ZSBjb25zdGFudHMgYnkKLQlzdWZmaXggKGVycm9uZW91c2x5IHJlbW92ZWQgYXMgcGFydCBvZiBKdWx5IDcgY2hhbmdlKS4KLQotU3VuIEF1ZyAgOSAyMDo0NTozMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy9vYmotZWxmLmg6ICBDaGVjayBmb3IgcmVkZWZpbml0aW9uIG9mIG9ial9mcm9iX3N5bWJvbC4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmM6ICBEZWZpbmUgU19HRVRfU1RPUkFHRV9DTEFTUyBhbmQgU19TRVRfU1RPUkFHRV9DTEFTUy4KLSAgICAgICAgKGFybWVsZl9mcm9iX3N5bWJvbCk6ICBOZXcgUm91dGluZS4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmg6ICBEZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sIGlmIE9CSl9FTEYuCi0KLVNhdCBBdWcgIDggMTU6MjE6MjggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHdlYWsgc3ltcy4KLQotV2VkIEF1ZyAgNSAxNTo1NDoxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2JlZ2luKTogU2V0IEJGRCBwcml2YXRlIGZsYWdzIGRlcGVuZGluZyB1cG9uCi0JY29tbWFuZCBsaW5lIHN3aXRjaGVzIHBhc3NlZCB0byBhc3NlbWJsZXIuCi0KLU1vbiBBdWcgIDMgMTQ6MDI6NTIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoR0FTX0NHRU5fTUFYX0ZJWFVQUyk6IEdBU18gcHJlcGVuZGVkLCBhbGwgdXNlcyB1cGRhdGVkLgotCShnYXNfY2dlbl9vcGNvZGVfZGVzYyk6IERlY2xhcmUuCi0JKGdhc19jZ2VuX3BhcnNlX29wZXJhbmQpOiBEZWNsYXJlLgotCSgqKTogUHJlcGVuZCBnYXNfIHRvIGdhcyBzcGVjaWZpYyBmbnMgdG8gZGVub3RlIHRoZW0gYXMgc3VjaC4KLQlBbGwgdXNlcyB1cGRhdGVkLgotCSogY2dlbi5jIChnYXNfY2dlbl9vcGNvZGVfZGVzYyk6IE5ldyBnbG9iYWwKLQkoZ2FzX2NnZW5faW5pdF9wYXJzZSk6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9pbml0X3BhcnNlLgotCShxdWV1ZV9maXh1cCk6IFJlbmFtZWQgZnJvbSBjZ2VuX3F1ZXVlX2ZpeHVwLgotCSgqKTogUHJlcGVuZCBnYXNfIHRvIGdhcyBzcGVjaWZpYyBmbnMgdG8gZGVub3RlIHRoZW0gYXMgc3VjaC4KLQlBbGwgdXNlcyB1cGRhdGVkLgotCShnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogVXBkYXRlIGNhbGwgdG8gaW5zZXJ0X29wZXJhbmQuCi0JKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX2ZpbmlzaF9pbnNuLgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYmVnaW4pOiBSZW1vdmUgdXNlIG9mIENHRU5fU1lNLgotCU9wZW4gb3Bjb2RlIHRhYmxlIGFuZCBpbml0aWFsaXplIGl0LgotCShtYWtlX3BhcmFsbGVsKTogVXNlIGdhc19jZ2VuX29wY29kZV9kZXNjLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogRGl0dG8uICBSZW1vdmUgdXNlIG9mIENHRU5fU1lNLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCi1TYXQgQXVnICAxIDE5OjI3OjMwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGRlYnVnX2luZm9fdHlwZSk6IEFkZCBlbnRyaWVzIGZvciB1bnNwZWNpZmllZCBhbmQgZHdhcmYqLgotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IFRha2Ugbm8gYXJndW1lbnRzOyBjYWxsCi0JYXNfd2hlcmUgb3Vyc2VsdmVzLiAgUHJvdmlkZSBhIHN0dWIgZm9yICFFQ09GRl9ERUJVR0dJTkcuCi0JKiBlY29mZi5oOiBNb3ZlIEVDT0ZGX0RFQlVHR0lORyBwcm90ZWN0aW9uIGluc2lkZSBHQVNfRUNPRkZfSC4KLQlNb3ZlIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gb3V0c2lkZSBFQ09GRl9ERUJVR0dJTkcgcHJvdGVjdGlvbi4KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogVGlkeSBFQ09GRiBiaXRzLiAgVXNlCi0JREVCVUdfVU5TUEVDSUZJRUQgcmF0aGVyIHRoYW4gREVCVUdfTk9ORSBmb3IgaW5pdGlhbCB0ZXN0LgotCSogY29uZmlnL29iai1lbGYuaCAoRUNPRkZfREVCVUdHSU5HKSBbVENfQUxQSEFdOiBEZWZpbmUgdG8gYSB2YXJpYWJsZS4KLQkoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IENvbmRpdGlvbmFsaXplIG9uIHZhbHVlIG9mIEVDT0ZGX0RFQlVHR0lORy4KLQkoSU5JVF9TVEFCX1NFQ1RJT04pOiBMaWtld2lzZS4KLQkoT0JKX1BST0NFU1NfU1RBQik6IExpa2V3aXNlLgotCQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2xvbmdvcHRzKTogTmV3IG9wdGlvbnMgLW1kZWJ1Zy8tbm8tbWRlYnVnLgotCShtZF9wYXJzZV9vcHRpb24pOiBXYXRjaCBmb3IgdGhlbS4KLQkoYWxwaGFfY3VyX2VudF9zeW0sIGFscGhhX2ZsYWdfbWRlYnVnKTogTmV3IHZhcmlhYmxlcy4KLQkobWRfYmVnaW4pOiBLaWxsIG5ldmVyZGVmIGNvZGUuCi0JKHNfYWxwaGFfZW50LCBzX2FscGhhX2VuZCwgc19hbHBoYV9tYXNrLCBzX2FscGhhX2ZyYW1lKTogTmV3LgotCShzX2FscGhhX3Byb2xvZ3VlKTogV2F0Y2ggYWxwaGFfY3VyX2VudF9zeW0uCi0JKHNfYWxwaGFfY29mZl93cmFwcGVyKTogTmV3LgotCShtZF9wc2V1ZG9fdGFibGUpOiBUcmFwIGFsbCBFQ09GRiBwc2V1ZG9zLgotCQotRnJpIEp1bCAzMSAxNjo0NTo1NCAxOTk4ICBSb24gVW5yYXUgPHJ1bnJhdUBjeWdudXMuY29tPgotCi0JU3RhcnQgb2YgY2hhbmdlcyB0byByZW1vdmUgbWRlYnVnIHNlY3Rpb24gZnJvbSBtaXBzKi1lbGYKLQlCYXNlZCBvbiBNSVBTX1NUQUJfRUxGIGRlZmluaXRpb24KLQkqIGFjY29uZmlnLmg6IHVuZGVmIGlmIG5vdCBjb25maWd1cmVkCi0JKiBjb25maWcuaW46IHVuZGVmIGlmIG5vdCBjb25maWd1cmVkCi0JKiBjb25maWcvbWlwcy1lbGYuaDogb25seSBzZXQgRUNPRkYgZGVidWdnaW5nIGlmIG5vdCBzdGFicy1pbi1lbGYKLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZW50KTogc2V0IEJTRl9GVU5DVElPTgotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBmbHVzaCBmcmFnCi0KLUZyaSBKdWwgMzEgMTY6MTQ6NDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IChhcm0tKi1lbGYpOiAgSGFuZGxlLgotICAgICAgICAodGh1bWItKi1lbGYpOiBIYW5kbGUuCi0gICAgICAgICogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLSAgICAgICAgKiByZWFkLmMgKHN0cmluZ2VyKTogRml4IHR5cG8gaW4gY29tbWVudC4KLSAgICAgICAgKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgYWRkIHN5bWJvbCB2YWx1ZSB0byBhZGRlbmQgaWYKLSAgICAgICAgVENfQVJNIGFuZCBPQkpfRUxGLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAobWRfc2VjdGlvbl9hbGlnbik6ICBEb24ndCBhbGlnbiBkd2FyZiBkZWJ1ZwotICAgICAgICBzZWN0aW9ucy4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBBbHdheXMgc2V0IHRoZSByZWxvYyBhZGRlbmQgdG8gZml4cC0+Znhfb2Zmc2V0Ci0gICAgICAgIGZvciBPQkpfRUxGLgotCi1UaHUgSnVsIDMwIDIxOjM4OjQzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHtjdXIscHJldn1fbGVmdF9raWxsc19yaWdodF9wKTogTmV3IHZhcmlhYmxlcy4KLQkod3JpdGVfMl9zaG9ydCk6IEVtaXQgd2FybmluZyBpZiBuZXcgZmxhZyBpcyBzZXQuCi0JKGRvX2Fzc2VtYmxlKTogU2V0IGZsYWdzIGlmIGxlZnQgaW5zdHJ1Y3Rpb24gaXMgb25lIG9mIHNwZWNpYWwKLQkicmlnaHQtaW5zdHJ1Y3Rpb24ta2lsbGVyIiB0eXBlLgotCi1UdWUgSnVuIDI4IDE4OjEyOjI4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX251bWJlcl90b19jaGFycywgY29uc19maXhfbmV3X3NwYXJjKToKLQlBbHdheXMgb3V0cHV0IHdvcmRzIGluIGRlYnVnX2luZm8gc2VjdGlvbiBhcyBiaWcgZW5kaWFuLgotCShzcGFyY190YXJnZXRfZm9ybWF0KTogQ2hvb3NlIGNvcnJlY3QgYmZkIHRhcmdldC4KLQkobWRfYXBwbHlfZml4Myk6IFJlbmFtZSBCRkRfUkVMT0NfU1BBUkNfMzJMRSB0byBCRkRfUkVMT0NfU1BBUkNfUkVWMzIuCi0JCi1UdWUgSnVsIDI4IDExOjAxOjIxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBGaXggImVycm1zZyIgaW5pdGlhbGl6YXRpb24KLQl0byB3b3JrIHdpdGggaW50ZXJuYXRpb25hbGl6YXRpb24gY29kZS4gIElzc3VlIGFuIGVycm9yIHdoZW4gdHdvCi0Jb3BlcmFuZHMgbWF0Y2ggdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gbWF0Y2guCi0KLU1vbiBKdWwgMjcgMTY6MjU6NTggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpbnN0YWxsX3Rvb2xkaXIpOiBBbGxvdyB0YXJnZXQgdG8gc3BlY2lmeSB3aGV0aGVyCi0JaXQgd2FudHMgdG8gYmUgaW5zdGFsbGVkIGluICQodG9vbGRpcikvYmluLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IFNldCBpbnN0YWxsLWV4ZWMtdG9vbGRpcgotCWRlcGVuZGVuY3kgdmlhIGNvbmZpZ3VyZS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1GcmkgSnVsIDI0IDE5OjU4OjU5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBTcGxpdCBpbnRvIHR3byAuLi4KLQkoaW5zdGFsbC1leGVjLWJpbmRpcixpbnN0YWxsLWV4ZWMtdG9vbGRpcik6IE5ldyBydWxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1GcmkgSnVsIDI0IDE2OjMxOjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IHJlbW92ZSB0aGUgZmlsZSBiZWZvcmUKLQljaGVja2luZyB3aGV0aGVyICQoYmluZGlyKSA9PSAkKHRvb2xkaXIpL2Jpbi4gIEZyb20gTWFjaWVqCi0JVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEp1bCAyNCAwOToxMzo0NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGNnZW5fbWRfYXBwbHlfZml4Myk6IFVwZGF0ZSBjYWxsIHRvIG1kX2NnZW5fbG9va3VwX3JlbG9jLgotCShjZ2VuX3RjX2dlbl9yZWxvYyk6IFVzZSB4bWFsbG9jLCBub3QgYmZkX2FsbG9jLgotCSogY2dlbi5oIChjZ2VuX21kX2FwcGx5X2ZpeDMsY2dlbl90Y19nZW5fcmVsb2MpOiBEZWNsYXJlLgotCShtZF9jZ2VuX2xvb2t1cF9yZWxvYykpOiBEZWNsYXJlLgotCShtZF9jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW0zMnIuaCAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogRGVjbGFyZS4KLQkobTMycl9yZWxheF9mcmFnKTogRGVjbGFyZS4KLQkoY2dlbl9tZF9hcHBseV9maXgzKTogRGVjbHMgbW92ZWQgdG8gY2dlbi5oLgotCShjZ2VuX3JlY29yZF9maXh1cF9leHAsY2dlbl90Y19nZW5fcmVsb2MpOiBEaXR0by4KLQkobTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEZWxldGUgZGVjbC4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfY3B1X2Rlc2MpOiAjaWYgMCBvdXQuCi0JKGFzc2VtYmxlX25vcCk6IERlbGV0ZS4KLQkoZXhwYW5kX2RlYnVnX3N5bXMpOiBEZWxldGUgdW51c2VkIGBleHAnLgotCShtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFJlbmFtZWQgZnJvbSBDR0VOX1NZTSAobG9va3VwX3JlbG9jKS4KLQlBZGQgZGVmYXVsdCBjYXNlIGZvciAtV2FsbC4KLQkobTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHApOiBBZGQgZGVmYXVsdCBjYXNlIGZvciAtV2FsbC4KLQkobWRfYXRvZik6IERlbGV0ZSB1bnVzZWQgd29yZFAuCi0KLVRodSBKdWwgMjMgMTM6MTk6NTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3VyZSAiZXJybXNnIiBoYXMgYSBub24tTlVMTAotCXZhbHVlLgotCi1XZWQgSnVsIDIyIDE0OjM2OjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIGZvciAuZW5kLCAuZXhpdG0sIC5mYWlsLAotCS5pZmMsIC5pZmVxcywgLmlmZ2UsIC5pZmd0LCAuaWZsZSwgLmlmbHQsIC5pZm5jLCAuaWZuZSwgLmlmbmVzLAotCS5wcmludCwgLnB1cmdlbSwgYW5kIC5zdHJ1Y3QuICBSZW1vdmUgZG9jdW1lbnRhdGlvbiBmb3IKLQkuYXBwLWZpbGUuCi0KLVR1ZSBKdWwgMjEgMTY6NTA6NTIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9tZF9hcHBseV9maXgzKTogc2V0X29wZXJhbmQgcmVuYW1lZCB0byBzZXRfdm1hX29wZXJhbmQuCi0JVXBkYXRlIGNhbGwgdG8gaW5zZXJ0X29wZXJhbmQuCi0KLUZyaSBKdWwgMTcgMTE6NDI6MjAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobXNfc2hvd191c2FnZSk6IEZvcm1hdHRpbmcgY2hhbmdlcy4KLQotV2VkIEp1bCAxNSAxNTozODoyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IHRyYWlsaW5nCi0Jd2hpdGVzcGFjZSBhZnRlciBhIHByZWZpeCBvcGVyYXRvci4KLQotVHVlIEp1bCAxNCAxNTozMjo1NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1iZW9ze3BlLGVsZix9Kik6IFJlY29nbml6ZS4KLQotVHVlIEp1bCAxNCAxMjozMzo0NCAxOTk4ICBDaHJpcyBUb3JlayAgPHRvcmVrQGJzZGkuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobG9nMik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfcmVzZXJ2ZSk6IFVzZSBsb2cyIHRvIGNvbnZlcnQgYWxpZ25tZW50IGJlZm9yZSBjYWxsaW5nCi0JcmVjb3JkX2FsaWdubWVudC4KLQkoc19jb21tb24pOiBVc2UgbG9nMiB0byBjb252ZXJ0IGFsaWdubWVudCBiZWZvcmUgY2FsbGluZwotCXJlY29yZF9hbGlnbm1lbnQgYW5kIGZyYWdfYWxpZ24uCi0JKHNwYXJjX2NvbnNfYWxpZ24pOiBVc2UgbG9nMi4KLQotVHVlIEp1bCAxNCAxMTo1ODo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBTZXQgc3ltYm9sIHNpemUgaWYgT0JKX0VMRi4KLQkoc19jb21tb24pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2hhbmRsZV9hbGlnbik6IFJlaW5kZW50IGEgYml0LiAgQ29ycmVjdAotCWluaXRpYWxpemF0aW9uIG9mIHdhZGRyLgotCShzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCi1UdWUgSnVsIDE0IDExOjAwOjE2IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZG9jL2MtaTM4Ni50ZXhpOiBGaXggYSB0eXBvLiAgVXNlIHRoZSB0ZXJtIDgwLWJpdCByZWFsIHJhdGhlcgotCXRoYW4gdGVtcG9yYXJ5IHJlYWwuCi0KLU1vbiBKdWwgMTMgMTM6NTU6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChzdWJzZWdzX2ZpbmlzaCk6IERvbid0IGFsaWduIHRoZSBzZWdtZW50cyBpZiB0aGVyZSB3ZXJlCi0JYW55IGVycm9ycy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogQ29ycmVjdCBudW1iZXIgb2YgYnl0ZXMgd2hlbgotCWNvcHlpbmcgYXV4IGluZm9ybWF0aW9uLgotCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBDYXRjaCBhdHRlbXB0cyB0byB0dXJuIGFuIE9fYmlnCi0JZXhwcmVzc2lvbiBpbnRvIGEgc3ltYm9sLgotCi1Nb24gSnVsIDEzIDEzOjI5OjA0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobW9kZV9mcm9tX2Rpc3Bfc2l6ZSk6IENoYW5nZSBhcmcgYW5kIHJldHVybgotCXR5cGUgdG8gdW5zaWduZWQgaW50LgotCShtZF9hc3NlbWJsZSk6IENoYW5nZSB0eXBlIHVzZWQgdG8gc3RvcmUgb2Zmc2V0cyBmcm9tIHVuc2lnbmVkCi0JbG9uZyB0byBsb25nLgotCShpMzg2X29wZXJhbmQpOiBTd2l0Y2ggZXJyb3IgY2hlY2sgdG8gb25seSBjYWxsIFJFU1RPUkVfRU5EX1NUUklORwotCW9uY2UgYWZ0ZXIgcGFyc2VfcmVnaXN0ZXIuCi0KLUZyaSBKdWwgMTAgMTY6MDA6MDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfc2hvd191c2FnZSk6IENoYW5nZWQgZm9ybWF0IHRvIG1hdGNoIHRoYXQKLQlvZiBnY2MsIGxkLCBldGMuCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBDaGFuZ2VkIGZvcm1hdCB0byBtYXRjaCB0aGF0IG9mIGdjYywgbGQsIGV0Yy4KLQotVGh1IEp1bCAgOSAxMjowOTo1NyAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAodGNfbTY4a19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB2dGFibGUKLQlyZWxvY3MuCi0JKG1kX2FwcGx5X2ZpeF8yKTogRm9yY2UgdGhlIHN5bWJvbCBvZiB0aGUgdnRhYmxlIHJlbG9jIHRvIGJlCi0Jd2Vhay4KLQotVGh1IEp1bCAgOSAxMTozMTo1NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9NYWtlZmlsZS5hbSAoTUFJTlRBSU5FUkNMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBKdWwgIDggMTI6MTg6NTYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgY2FzZSAnaScgYW5kICdqJyk6IE1hc2sgb2ZmIGhpZ2ggYml0cwotICAgICAgICBmb3IgJWxvIGV4cHJlc3Npb25zLgotICAgICAgICAobWlwc19pcCwgY2FzZSAndScpOiBNb3ZlIHJhbmdlIGNoZWNrIGFmdGVyIGNvZGUgdG8gbWFzawotICAgICAgICBvZmYgYml0cyBpbiAlaGkvJWxvIGV4cHJlc3Npb25zLiAgTWFzayBvZmYgaGlnaCBiaXRzIGZvcgotICAgICAgICAlbG8gZXhwcmVzc2lvbnMuCi0KLVR1ZSBKdWwgIDcgMTc6NTc6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKGdhc3Zlci50ZXhpKTogTmV3IHRhcmdldC4KLQkoYXMuaW5mbywgYXMuZHZpKTogRGVwZW5kcyB1cG9uIGdhc3Zlci50ZXhpLgotCSogZG9jL2FzLnRleGluZm86IEluY2x1ZGUgZ2FzdmVyLnRleGkuICBNZW50aW9uIHZlcnNpb24gbnVtYmVyIG9uCi0JdGl0bGUgcGFnZSBhbmQgaW4gdG9wIG5vZGUuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdWwgIDcgMTE6NDI6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX2xpc3RpbmcpOiBGb3IgRURJQ1RfTElTVCwgc2tpcCBhbGwgbGluZXMgdXAgdG8KLQlidXQgbm90IGluY2x1ZGluZyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBlZGljdC4KLQkqIGxpc3RpbmcuaCAoTElTVElOR19FT0YpOiBOZXcuCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcik6IENhbGwgaXQuCi0KLVR1ZSBKdWwgIDcgMTM6MDA6MzcgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBEb24ndCBzZXQgdGhlIHNpemUgb2YgYW4KLSAJaW1tZWRpYXRlIGFkZHJlc3MgYmFzZWQgc29sZWx5IG9uIHRoZSBzdWZmaXggYW5kIHRoZSBtb2RlLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEFkZCBhc3NlcnRpb24gdG8gbWFrZSBzdXJlCi0Jb3ZlcmxhcDIgZG9lcyBub3Qgc2V0IEltbS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc3BhY2VfY2hhcnMpOiBSZW1vdmUuIFRoZSBzY3J1YmJlciBjb252ZXJ0cwotCXNlcXVlbmNlcyBvZiB3aGl0ZXNwYWNlIHRvIGEgc2luZ2xlIHNwYWNlLgotCShpc19zcGFjZV9jaGFycyk6IEp1c3QgY29tcGFyZSB3aXRoIHNwYWNlLgotCShtZF9iZWdpbik6IERvbid0IGluaXRpYWxpemUgc3BhY2VfY2hhcnMuCi0JKG1kX2Fzc2VtYmxlKTogSnVzdCBza2lwIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLgotCShpMzg2X29wZXJhbmQpOiBSZXdyaXRlIGJhc2UtaW5kZXggcGFyc2luZyB0byB1c2UgbmV3Ci0JcGFyc2VfcmVnaXN0ZXIsIGFuZCB0byBza2lwIHdoaXRlIHNwYWNlLiAgU2tpcCB3aGl0ZSBzcGFjZSBpbiBhCi0JbnVtYmVyIG9mIG90aGVyIHBsYWNlcyB0b28uICBEb24ndCBnaXZlIGVycm9yIG1lc3NhZ2UgaWYKLQlwYXJzZV9yZWdpc3RlciBmYWlscy4KLQkocGFyc2VfcmVnaXN0ZXIpOiBDaGFuZ2UgcmVnX3N0cmluZyBwYXJhbWV0ZXIgdG8gYmUgbm9uLWNvbnN0LgotCUFkZCBlbmRfb3AgcGFyYW1ldGVyLiAgU2tpcCB3aGl0ZSBzcGFjZSBhZnRlciB0aGUgYCUnLCBhbmQgcmV0dXJuCi0JZW5kIG9mIHJlZ2lzdGVyIHN0cmluZy4gIEdpdmUgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuCi0JY2FsbGVyLgotCi1GcmkgSnVsICAzIDE1OjM0OjM0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gTWF0dCBTZW1lcnNreSA8bWF0dHNAc2NkLmhwLmNvbT46Ci0JKiBleHByLmMgKG9wX2VuY29kaW5nKTogTWFrZSBjb25zdC4KLQkoZXhwcl9zZXRfcHJlY2VkZW5jZSk6IE5ldyBmdW5jdGlvbi4KLQkoZXhwcl9iZWdpbik6IERvbid0IHNldCBvcGVyYXRvciByYW5raW5ncywganVzdCBjYWxsCi0JZXhwcl9zZXRfcHJlY2VkZW5jZS4KLQkqIGV4cHIuaCAoZXhwcl9zZXRfcHJlY2VkZW5jZSk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHNfbXJpKTogQ2FsbCBleHByX3NldF9wcmVjZWRlbmNlLgotCi1UaHUgSnVsICAyIDE2OjI0OjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKFN0YXRlbWVudHMpOiBSZW1vdmUgcGFyYWdyYXBoIGRpc2N1c3NpbmcKLQljb250aW51aW5nIGxpbmVzIHdpdGggYSBiYWNrc2xhc2guICBUaGlzIGhhc24ndCB3b3JrZWQgZm9yIHllYXJzLAotCWlmIGl0IGV2ZXIgZGlkLgotCi1UaHUgSnVsICAyIDE0OjA2OjIyIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcm1pLmRlPgotCi0gICAgICAgICogb2JqLXZtcy5jOiBBZGQgQysrIHN1cHBvcnQgd2l0aCBjdG9ycy9kdG9ycyBzZWN0aW9ucy4gIEFkZCB3ZWFrCi0Jc3ltYm9sIGRlZmluaXRpb25zLgotCShDdG9yc19TeW1ib2xzLCBEdG9yc19TeW1ib2xzKTogTmV3IHN5bWJvbCBjaGFpbnMuCi0JKHBzX0NUT1JTLCBwc19EVE9SUyk6IE5ldyBzZWN0aW9uIHR5cGVzLgotCSh2bXNfZml4dXBfeHRvcnNfc2VjdGlvbik6IE5ldyBmdW5jdGlvbgotCShDdG9yc19Qc2VjdCwgRHRvcnNfUHNlY3QpOiBEZWZpbmUuCi0JKElTX0dYWF9YVE9SKTogRGVmaW5lCi0JKGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5KTogQ2hhbmdlIGNoZWNrIG9mIGd4eF9idWdfZml4ZWQgdG8gMC4KLQlGaWx0ZXIgc3RhdGljIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBhbmQgYWRkIHRvCi0JQ3RvcnNfU3ltYm9scy9EdG9yc19TeW1ib2xzIGNoYWluLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBXcml0ZSBDdG9yc19TeW1ib2xzL0R0b3JzX1N5bWJvbHMgdG8KLQlhcHByb3ByaWF0ZSBzZWN0aW9uLgotCi0gICAgICAgICogdGMtYWxwaGEuaCAoVEFSR0VUX0ZPUk1BVCk6IFJlbmFtZSAiZXZheC1hbHBoYSIgdG8gInZtcy1hbHBoYSIuCi0JKiBtYWtlZmlsZS52bXM6IE1lcmdlIHZheC92bXMgc3VwcG9ydC4KLQotV2VkIEp1bCAgMSAyMDowNjoyMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0LCBvYmpfZWxmX3Z0YWJsZV9lbnRyeSk6IE5ldy4KLQkoZWxmX3BzZXVkb190YWJsZSk6IEFkZCB0aGVtLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgdnRhYmxlIHJlbG9jcy4KLQkobWRfYXBwbHlfZml4KTogQWNjZXB0IHRoZW0uCi0JKG1pcHNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgdGhlbS4KLQkodGNfZ2VuX3JlbG9jKTogTXVuZyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZIGZvciBSZWwuCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBBY2NlcHQgdnRhYmxlIHJlbG9jcy4KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKTogRm9yY2UgdnRhYmxlIHJlbG9jcy4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgdGhlbS4KLQotV2VkIEp1bCAgMSAxNjozNTozMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENHRU5fQ1BVX1BSRUZJWCk6IE5ldyB2YXJpYWJsZS4KLQkoY2dlbi5vKTogVXNlIGl0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW46IEFDX1NVQlNUIGNnZW5fY3B1X3ByZWZpeC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotV2VkIEp1bCAgMSAyMTozODo1NiAxOTk4ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtc2ggKENPTkRfSlVNUF9ERUxBWSwgQ09ORDEyX0RFTEFZX0xFTkdUSCk6IERlZmluZS4KLQlDaGFuZ2VkIGFsbCB1c2VycyBvZiBDT05EMTJfREVMQVkuCi0KLUZyaSBKdW4gMjYgMTE6MjE6MTEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChzZXRfYXJjaF9tYWNoKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgcHNldWRvLW9wcyB0byBzZXQgdGhlIGN1cnJlbnQgbWFjaGluZSB0eXBlLgotCShtZF9iZWdpbik6IERlZmF1bHQgdG8gbW4xMDMwMCBtb2RlLgotCShtZF9hc3NlbWJsZSk6IE9ubHkgYWNjZXB0IGluc3RydWN0aW9ucyBmb3IgdGhlIGNvcmUgbW4xMDMwMAotCWNoaXAgYW5kIHRoZSBhY3RpdmUgbWFjaGluZSB0eXBlLgotCi1XZWQgSnVuIDI0IDE5OjA2OjA0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEdpdmUgdGhlIHN0cnVjdCBhIG5hbWUuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAodGNfcmVsb2NfbWFuZ2xlKTogQWRkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNoLmggKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogQWRkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy13NjUuaCAodGNfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAodGNfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KLQotV2VkIEp1biAyNCAxMzo0NTowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6ICBSZXN0b3JlIG9sZCBzZWN0aW9uCi0gICAgICAgIGFmdGVyIGNvbW1vbiBwcm9jZXNzaW5nLgotCi1XZWQgSnVuIDI0IDExOjUwOjU0IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDcmVhdGVfVk1TX09iamVjdF9GaWxlKTogRm9yY2UgYmluYXJ5IGZpbGUuCi0KLVR1ZSBKdW4gMjMgMTc6NDc6MzEgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZG9fYV9maXhfaW1tLCBidWlsZF9ieXRlcyk6IFJlcGxhY2UgY2FzdCB0bwotCWNoYXIgd2l0aCBjb2RlIHRoYXQgZXhwbGljaXRseSBzaWduLWV4dGVuZHMuCi0KLVR1ZSBKdW4gMjMgMTM6NTQ6NTcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQkKLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2JlZ2luKTogUmVzdG9yZSB0ZXh0IHNlY3Rpb24gYXMgdGhlIGN1cnJlbnQKLQlzZWN0aW9uIGFmdGVyIGNyZWF0aW5nIGNhbGwgdGFibGUgc2VjdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU1lNX0FVWElORk8pOiBOZXcgbWFjcm8gdG8gY29uY2VhbCB1Z2x5Ci0JY29kZS4gCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3N5bWJvbF9tZXJnZSk6IFJlcGxhY2UgY29tcGxleCBleHByZXNpb24KLQl3aXRoIGNhbGwgdG8gbWFjcm8gU1lNX0FVWElORk8uCi0KLVR1ZSBKdW4gMjMgMTU6MDk6MjcgMTk5OCAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgbGV0IEVYRUVYVCBpbnRlcmZlcmUKLQl3aXRoIHRoZSBwcm9ncmFtIHRyYW5zZm9ybSBuYW1lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBKdW4gMjIgMTk6NTI6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBGaXggY29weWluZyBvZiBhdXhpbGlhcnkKLQlpbmZvcm1hdGlvbi4KLQotTW9uIEp1biAyMiAxNToxODo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IEJlIHByZXBhcmVkIGZvciBhIHNwYWNlIGJldHdlZW4KLQl0aGUgb3BlbiBwYXJlbnRoZXNpcyBhbmQgdGhlIHN0YXJ0IG9mIHRoZSByZWdpc3RlciBvcGVyYW5kLAotCWJlY2F1c2Ugb2YgdGhlIEp1bmUgMTYgY2hhbmdlLgotCi1TdW4gSnVuIDIxIDIxOjI3OjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSB3ZWFrIHN5bWJvbHMgY29ycmVjdGx5IGlmCi0JQkZEX0FTU0VNQkxFUi4KLQotU3VuIEp1biAyMSAxMjoyNjozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQWx3YXlzIHBlcmZvcm0gYWxpZ25tZW50IHJlcXVlc3QsCi0JZXZlbiBpZiBpdCBpcyBiZWxpdmVkIHRvIGJlIHVubmVjZXNzYXJ5LgotCi1GcmkgSnVuIDE5IDEzOjU3OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBOZXZlciBhZGp1c3QgcmVsb2NzIGFnYWluc3Qgd2VhawotCXN5bWJvbHMuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLUZyaSBKdW4gMTkgMDk6NTA6MTcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogRG8gbm90IGhhcmRjb2RlIHRoZQotCXNoaWZ0IGFtb3VudCBmb3IgYSByZXBlYXRlZCBvcGVyYW5kLiAgVGhlIHNoaWZ0IGFtb3VudCBmb3IgdGhlCi0JcmVwZWF0ZWQgY29weSBjb21lcyBmcm9tIHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kLgotCi1GcmkgSnVuIDE5IDAwOjQ0OjE5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9vcGVyYW5kKTogRml4IHR5cG9zIGluIGxkbS9zdG0gc3VwcG9ydC4KLQotV2VkIEp1biAxNyAxMzowNzowNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3Nob3dfdXNhZ2UpOiBGaXggLW1pcHNOIHVzYWdlLgotCi1UdWUgSnVuIDE2IDEzOjA2OjIxIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogSWYgdGNfc3ltYm9sX2NoYXJzIGlzIGRlZmluZWQsIHRyZWF0IGFsbAotCWNoYXJhY3RlcnMgaW4gaXQgYXMgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0Y19zeW1ib2xfY2hhcnMpOiBEZWZpbmUuCi0JKGV4dHJhX3N5bWJvbF9jaGFycyk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChleHRyYV9zeW1ib2xfY2hhcnMpOiBEZWZpbmUuCi0JKGNvbW1lbnRfY2hhcnMpOiBEb24ndCB1c2UgJy8nIGFzIGNvbW1lbnQgc3RhcnQgaWYgVEVfTElOVVguCi0JKGxpbmVfY29tbWVudF9jaGFycyk6IFNldCB0byAnLycgaWYgVEVfTElOVVguCi0JKiBkb2MvYy1pMzg2LnRleGkgKGkzODYtcHJlZml4ZXMpOiBVcGRhdGUuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogRG9jdW1lbnQgdGNfc3ltYm9sX2NoYXJzLgotCi1GcmkgSnVuIDEyIDEzOjM2OjU0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KLQkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgotCi0xOTk4LTA2LTEyICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXBwbHlfZml4Myk6IENoZWNraW5nIGRpc3BsYWNlbWVudAotCWNvbnN0cmFpbnQgaW4gaW5zdHJ1Y3Rpb25zIFJFUCAmIFJFUEkuCi0KLVRodSBKdW4gMTEgMDg6NTY6NDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IENhdGNoIEJGRF9SRUxPQ184LAotCUJGRF9SRUxPQ18xNiwgQkZEX1JFTE9DXzY0IGFuZCBpc3N1ZSBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlcy4gIAotCi0JKGNoZWNrX3JhbmdlKTogSWYgdGhlIG9wZXJhbmQgaXMgc2hpZnRlZCwgdGhlbiBzaGlmdCB0aGUgbnVtYmVyCi0JYmVmb3JlIGNoZWNraW5nIGl0cyByYW5nZS4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBBZGQgbW9yZSBjaGVja3MgZm9yIE5VTEwgcG9pbnRlcnMuIAotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2NvbW0pOiBTZXQgU0VDX0NPTU1PTiBiaXQgb24gc3BlY2lhbAotCWNvbW1vbiBzZWN0aW9ucy4KLQotV2VkIEp1biAxMCAxNzoyNjozNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2NvbW0pOiBDcmVhdGUgc3BlY2lhbCBzZWN0aW9ucyBhcyBuZWVkZWQuCi0KLTE5OTgtMDYtMTAgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogQWRkaXRpb24gb2Ygc3dhcHBpbmcKLQlpbnN0cnVjdGlvbnMgZm9yIHNlcXVlbnRpYWwgYW5kIHJldmVyc2Ugc2VxdWVudGlhbCBvcmRlciB3aGVuCi0JZ2l2ZW4gb3JkZXIgaXMgbm90IHBvc3NpYmxlLgotCi1UdWUgSnVuICA5IDEzOjUyOjUzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoREVQX0lOQ0xVREVTKTogRml4IHJlZmVyZW5jZSB0byBpbnRsIGJ1aWxkIGRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVuICA5IDEyOjIwOjA1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZG9jL2MtaTM4Ni50ZXhpOiBVcGRhdGUgMTYgYml0IGRvY3VtZW50YXRpb24uCi0KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IENoYW5nZSBEYXRhMTYgdG8gU2l6ZTE2LCBEYXRhMzIgdG8gU2l6ZTMyLAotCUlnbm9yZURhdGFTaXplIHRvIElnbm9yZVNpemUgYXMgdGhleSBhcmUgdXNlZCBmb3IgYWRkcmVzcyBzaXplIGFzCi0Jd2VsbCBhcyBkYXRhIHNpemUuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBMaWtld2lzZS4gIEFkZCBjb2RlIHRvIHJlamVjdCBhZGRyMzIvZGF0YTMyIGluCi0JMzItYml0IG1vZGUsIHNpbWlsYXJseSBhZGRyMTYvZGF0YTE2IGFuZCB2YXJpYW50cy4KLQotTW9uIEp1biAgOCAxODozMjowMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hc3NlbWJsZSk6IEZpeCBoYW5kbGluZyBvZiByZXZlcnNlCi0Jc2VxdWVudGlhbCB3b3JkIG11bHRpcGx5IGluc3RydWN0aW9ucy4KLQkKLQkoZG9fYXNzZW1ibGUpOiBBZGQgZXh0cmEgY29tbWFuZCBsaW5lIGFyZ3VtZW50LCB0byBhbGxvdyBtdWwzMgotCWF0dHJpYnV0ZSB0byBiZSBwcmVzZXJ2ZWQgYWNyb3NzIHBhcmFsbGVsIGluc25zLgotCShtZF9hc3NlbWJsZSk6IEluc2VydCBOT1BzIGJldHdlZW4gZXhwbGljaXRseSBwYXJhbGxlbCBpbnNucyB3aGljaAotCWNvbnRhaW4gYW4gMzIgYml0IG11bHRpcGx5IGFuZCBhIDE2IG11bHRpcGx5LgotCi1Nb24gSnVuICA4IDEyOjIwOjMwIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYzogUkVQTkUgcmVuYW1lZCB0byBSRVBORV9QUkVGSVhfT1BDT0RFLCBhbmQKLQlsaWtld2lzZSBmb3IgUkVQRS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAocmVsb2MpOiBBZGQgYnJhY2VzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzdHJ1Y3QgX2kzODZfaW5zbik6IFJlbmFtZSBiaSB0byBzaWIgdG8gYmUKLQljb25zaXN0ZW50IHdpdGggSW50ZWwgbmFtaW5nLgotCSogY29uZmlnL3RjLWkzODYuaCAoYmFzZV9pbmRleF9ieXRlKTogUmVuYW1lIHRvIHNpYl9ieXRlLiAgRG9uJ3QKLQl1c2UgYml0ZmllbGRzIGluIHNpYl9ieXRlLgotCShtb2RybV9ieXRlKTogRG9uJ3QgdXNlIGJpdGZpZWxkcyBoZXJlIGVpdGhlci4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoY3VycmVudF90ZW1wbGF0ZXMpOiBBZGQgY29uc3QuCi0JKHBhcnNlX3JlZ2lzdGVyKTogQWRkIGNvbnN0IHRvIHJldHVybiwgcGFyYW0sIGFuZCBjaGFyICpzLgotCShpMzg2X29wZXJhbmQpOiBBZGQgY29uc3QgdG8gcmVnX2VudHJ5ICpyLgotCSogY29uZmlnL3RjLWkzODYuaCAodGVtcGxhdGVzKTogQWRkIGNvbnN0IHRvIHN0YXJ0LCBlbmQuCi0KLQlJbnNwaXJlZCBieSBjb2RlIGZvciAxNiBiaXQgZ2FzIHN1cHBvcnQgZnJvbSBNYXJ0eW5hcyBLdW5pZ2VsaXMKLQk8bWFydHluYXNAbm0zLmt0dS5sdD46Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEFkZCBmdWxsIHN1cHBvcnQgZm9yIDE2IGJpdAotCW1vZHJtLCBhbmQgSnVtcCwgSnVtcEJ5dGUsIEp1bXBEd29yZCwgSnVtcEludGVyU2VnbWVudCBpbnNucy4KLQkodXNlc19tZW1fYWRkcm1vZGUpOiBSZW1vdmUuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQWRkIHN1cHBvcnQgaGVyZSB0b28uCi0JKG1kX3JlbGF4X3RhYmxlKTogUmV3cml0ZSBpbnRlcmZhY2UgdG8gbWRfcmVsYXggZm9yIDE2IGJpdAotCXN1cHBvcnQuCi0JKEJZVEUsIFdPUkQsIERXT1JELCBVTktOT1dOX1NJWkUpOiBSZW1vdmUuCi0JKG9wY29kZV9zdWZmaXhfdG9fdHlwZSk6IFJlbW92ZS4KLQkoQ09ERTE2LCBTTUFMTCwgU01BTEwxNiwgQklHLCBCSUcxNik6IERlZmluZS4KLQkoU0laRV9GUk9NX1JFTEFYX1NUQVRFKTogTW9kaWZ5IHRvIHN1aXQgYWJvdmUuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCShpMzg2X29wZXJhbmQpOiBBZGQgc3VwcG9ydCBmb3IgMTYgYml0IGJhc2UvaW5kZXggcmVncywKLQlpbW1lZGlhdGVzLCBhbmQgZGlzcGxhY2VtZW50cy4gIFJlbW92ZSBzb21lIHVubmVjZXNzYXJ5IGNhc3RzLCBhbmQKLQlsb2NhbGlzZSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcsIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQsCi0JZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgdmFyaWFibGVzLiAgQWRkIEdDQ19BU01fT19IQUNLLgotCSogY29uZmlnL3RjLWkzODYuaCAoTk9fQkFTRV9SRUdJU1RFUl8xNik6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAocHJlZml4X2hhc2gpOiBSZW1vdmUuCi0JKG1kX2JlZ2luKTogUmV3cml0ZSB3aXRob3V0IG9ic3RhY2tzLiAgUmVtb3ZlIHByZWZpeCBoYXNoIHRhYmxlCi0JaGFuZGxpbmcuICBSZXdyaXRlIGxleGljYWwgdGFibGUgaGFuZGxpbmcuCi0JKGkzODZfcHJpbnRfc3RhdGlzdGljcyk6IERvbid0IHByaW50IHByZWZpeCBzdGF0aXN0aWNzLgotCShtZF9hc3NlbWJsZSk6IFJld3JpdGUgaW5zdHJ1Y3Rpb24gcGFyc2VyIHNvIHRoYXQgbGluZSBpcyBub3QKLQljb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4gIERvbid0IGRvIGEgaGFzaF9maW5kIGZvciBwcmVmaXhlcywKLQlpbnN0ZWFkIHJlY29nbmlzZSB0aGVtIHZpYSBvcGNvZGUgbW9kaWZpZXIuCi0JKGV4cGVjdGluZ19vcGVyYW5kLCBwYXJlbl9ub3RfYmFsYW5jZWQpOiBMb2NhbGlzZSB2YXJpYWJsZXMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChJc1ByZWZpeCk6IERlZmluZS4KLQkocHJlZml4X2VudHJ5KTogUmVtb3ZlLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChQUkVGSVhfU0VQRVJBVE9SKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAoUFJFRklYX1NFUEFSQVRPUik6IERlZmluZSBoZXJlIGluc3RlYWQsIHVzaW5nCi0JJ1xcJyBpbiBjYXNlIHdoZXJlIGNvbW1lbnRfY2hhcnMgY29udGFpbnMgJy8nLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChNQVRDSCk6IEVuc3VyZSBnaXZlbiBvcGVyYW5kIGFuZCB0ZW1wbGF0ZQotCW1hdGNoIGZvciBKdW1wQWJzb2x1dGUuICBNYWtlcyBlLmcuIGBsam1wIHRhYmxlKCVlYngpJyBpbnZhbGlkOwotCXlvdSBtdXN0IHdyaXRlIGBsam1wICp0YWJsZSglZWJ4KScuCi0KLQlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKEJGRF9SRUxPQ18xNiwgQkZEX1JFTE9DXzE2X1BDUkVMKTogRGVmaW5lCi0JYXMgMCBpZm5kZWYgQkZEX0FTU0VNQkxFUi4KLQkobWRfYXNzZW1ibGUpOiBBbGxvdyBpbW1lZGlhdGUgb3BlcmFuZHMgd2l0aG91dCBzdWZmaXggb3IKLQlvdGhlciByZWcgb3BlcmFuZCB0byBkZWZhdWx0IGluIHNpemUgdG8gdGhlIGN1cnJlbnQgY29kZSBzaXplLgotCi1Nb24gSnVuICA4IDA5OjQ1OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2JlZ2luKTogIFJlc3RvcmUgY3JlYXRpb24gb2YKLSAgICAgICAgLmNhbGxfdGFibGVfdGV4dCBhbmQgLmNhbGxfdGFibGVfZGF0YSBzZWN0aW9ucy4KLQotU2F0IEp1biAgNiAwMDowMjo0MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hc3NlbWJsZSk6IFNldCBleGVjdXRpb24gdHlwZSB0byB1bmtub3duCi0JYWZ0ZXIgZW1pdHRpbmcgYSB3b3JkIG9mIG5vb3BzLgotCi1GcmkgSnVuICA1IDIzOjI3OjA0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobW9kZV9mcm9tX2Rpc3Bfc2l6ZSk6IERpc3AxNiBpcyBtb2RlIDIuCi0JKGkzODZfb3BlcmFuZCk6IFNpbXBsaWZ5IGNoZWNrcyBmb3IgdmFsaWQgYmFzZS9pbmRleCBjb21iaW5hdGlvbnMuCi0JRGlzYWxsb3cgYGluIDQoJWR4KSwlYWwnLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzdHJ1Y3QgX2kzODZfaW5zbik6IE1ha2UgcmVncywgYmFzZV9yZWcsIGFuZAotCWluZGV4X3JlZyBjb25zdC4KLQkoYWRkX3ByZWZpeCk6IENoYW5nZSBwYXJhbWV0ZXIgZnJvbSBjaGFyIHRvIGludC4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoVWdoKTogRGVmaW5lIG9wY29kZSBtb2RpZmllci4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogUHJpbnQgd2FybmluZ3MgZm9yIFVnaCBpbnNucy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBSZXdyaXRlIE1BVENIIGFuZAotCUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggbWFjcm9zIHRvIGNoZWNrIHJlZ2lzdGVyIHR5cGVzIG1vcmUKLQl0aG9yb3VnaGx5LiAgQ2hlY2sgZm9yIGlsbGVnYWwgc3VmZml4L29wZXJhbmQgY29tYmluYXRpb25zCi0Jd2hlbiBtYXRjaGluZyBpbnNucyB3aXRoIG9wZXJhbmRzLiAgSGFuZGxlIG5ldyBgcycgc3VmZml4LCBhbmQKLQlhc3NvY2lhdGVkIEZsb2F0TUYgb3Bjb2RlIG1vZGlmaWVyIGZvciBmbG9hdCBpbnNucyB3aXRoIG1lbW9yeQotCW9wZXJhbmRzLgotCSogY29uZmlnL3RjLWkzODYuaCAoRmxvYXRNRik6IERlZmluZSBuZXcgb3Bjb2RlIG1vZGlmaWVyLgotCShOb19zU3VmLCBOb19iU3VmLCBOb193U3VmLCBOb19sU3VmKTogTGlrZXdpc2UuCi0JKFNIT1JUX09QQ09ERV9TVUZGSVgsIExPTkdfT1BDT0RFX1NVRkZJWCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJlbmFtZSBXT1JEX1BSRUZJWF9PUENPREUgdG8KLQlEQVRBX1BSRUZJWF9PUENPREUgdGhyb3VnaG91dC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoUkVHSVNURVJfV0FSTklOR1MpOiBEZWZpbmUuCi0JKG1kX2Fzc2VtYmxlKTogUmV3cml0ZSBzdWZmaXgvcmVnaXN0ZXIgb3BlcmFuZCBjaGVja2luZyBjb2RlIHRvIGJlCi0JbW9yZSB0aG9yb3VnaC4gIFJlbW92ZSBBYnM4LDE2LDMyLiAgQ2hhbmdlIG9jY3VycmVuY2VzIG9mIE1lbSB0bwotCUFueU1lbSwgdGhlIGJldHRlciB0byBncmVwLgotCShwaSk6IFJlbW92ZSBBYnMuCi0JKGkzODZfb3BlcmFuZCk6IERvbid0IHNldCBNZW0gYml0cyBpbiBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gd2hlbgotCWdpdmVuIGEgbWVtb3J5IG9wZXJhbmQuICBEb24ndCBzZXQgQWJzIGJpdHMgZWl0aGVyLgotCSh0eXBlX25hbWVzKTogUmVtb3ZlIE1lbSosIEFicyouCi0JKiBjb25maWcvdGMtaTM4Ni5oIChNZW04LCBNZW0xNiwgTWVtMzIsIEFiczgsIEFiczE2LCBBYnMzMik6IERvbid0Ci0JZGVmaW5lIG9wY29kZV9tb2RpZmllcnMgYXMgdGhlc2UgY2FzZXMgYXJlIGhhbmRsZWQgYnkgRGlzcDgsCi0JRGlzcDE2LCBEaXNwMzIgYW5kIHN1ZmZpeCBjaGVja3MuCi0JKENPTUVTX0lOX0JPVEhfRElSRUNUSU9OUyk6IFJlbW92ZS4KLQkoRmxvYXRSKTogRGVmaW5lLiBJdCdzIE9LIHRvIHNoYXJlIHRoZSBiaXQgd2l0aCBSZXZlcnNlUmVnUmVnbWVtLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IERvbid0IGVtaXQgb3BlcmFuZCBzaXplIHByZWZpeAotCWlmIElnbm9yZURhdGFTaXplIG1vZGlmaWVyIGdpdmVuLiAgUmVtb3ZlIFNob3J0Zm9ybVcgbW9kaWZpZXIKLQl0ZXN0LiAgQWRkIHRlc3QgZm9yIFNob3J0Rm9ybSBpbiBXIGJhc2Vfb3Bjb2RlIG1vZGlmaWNhdGlvbi4KLQlNZXJnZSBTZWcyU2hvcnRGb3JtIGFuZCBTZWczU2hvcnRGb3JtIGNvZGUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChTaG9ydEZvcm1XKTogUmVtb3ZlLgotCShJZ25vcmVEYXRhU2l6ZSk6IERlZmluZS4KLQotRnJpIEp1biAgNSAxMDo1MDo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hc3NlbWJsZSk6IFN0b3JlIHByZXZpb3VzIHNlZ21lbnQgc3RhdGUKLQl3aXRoIHByZXZpb3VzIGluc3RydWN0aW9uLgotCi1XZWQgSnVuCSAzIDE4OjIxOjU2IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoU0NBTEUxX1dIRU5fTk9fSU5ERVgpOiBEZWZpbmUuCi0JKGVicCwgZXNwKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZXMuCi0JKE1BVENIKTogUmVtb3ZlIHRlc3QgZm9yIEluT3V0UG9ydFJlZy4KLQkoaTM4Nl9vcGVyYW5kKTogUHJvcGVybHkgaGFuZGxlIEluT3V0UG9ydFJlZyBoZXJlIGluc3RlYWQuCi0JRGlzYWxsb3dzIGBpbmIgKCVkeCwyKScsIGBpbmIgJWVzOiglZHgpJyBhbmQgYG1vdiAoJWR4KSwlYXgnCi0JKG1kX2Fzc2VtYmxlKTogU2ltcGxpZnkgYW5kIGNvcnJlY3QgbW9kcm0gYW5kIHNpYiBnZW5lcmF0aW9uLgotCShpMzg2X29wZXJhbmQpOiBBZGQgd2FybmluZyBmb3Igc2NhbGUgd2l0aG91dCBpbmRleC4KLQlSZXdyaXRlIGNoZWNrcyBmb3IgdmFsaWQgYmFzZS9pbmRleCBjb21iaW5hdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKEVORF9TVFJJTkdfQU5EX1NBVkUpOiBQcm90ZWN0IGFyZ3VtZW50cyBvZgotCW1hY3JvcyBhbmQgZW5jbG9zZSBpbiBkbyB3aGlsZSgwKS4KLQkoUkVTVE9SRV9FTkRfU1RSSU5HKTogTGlrZXdpc2UuCi0JKG1kX2Fzc2VtYmxlKTogQWRkIG9uZSB0byBwcmludGVkIG9wZXJhbmQgbnVtYmVyIHNvIHdlIHN0YXJ0Ci0JZnJvbSAxIG5vdCAwLiAgQWRkIHNvbWUgbW9yZSBnZXR0ZXh0IGludm9jYXRpb25zLgotCShpMzg2X29wZXJhbmQpOiBGaXggYCUlcycgLT4gYCUlJXMnLiBJbmMgcHJpbnRlZCBvcGVyYW5kCi0JbnVtYmVyIGhlcmUgdG9vLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChXQUlUX1BSRUZJWCwgTE9DS1JFUF9QUkVGSVgsIEFERFJfUFJFRklYLAotCURBVEFfUFJFRklYLCBTRUdfUFJFRklYKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAoc3RydWN0IF9pMzg2X2luc24pOiBSZW1vdmUgd2FpdF9wcmVmaXggZmllbGQuCi0JKGNoZWNrX3ByZWZpeCk6IFJlbW92ZSBmdW5jdGlvbi4KLQkoYWRkX3ByZWZpeCk6IE5ldyBmdW5jdGlvbi4gIEFkZCBwcmVmaXggdG8gaS5wcmVmaXggYXMgd2VsbCBhcwotCWRvaW5nIGNoZWNrcy4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2VzIGZvciBhZGRfcHJlZml4LglSZW1vdmUgaGFjayBmb3Igd2FpdAotCXByZWZpeCwgaW5zdGVhZCBhbHdheXMgb3V0cHV0IHByZWZpeGVzIGluIGZpeGVkIG9yZGVyLglUZXN0Ci0JZm9yIGpjeHovbG9vcCB3aGVuIHNlbGVjdGluZyBiZXR3ZWVuIHdvcmQgJiBkd29yZCBvcGVyYXRpb25zLAotCWFuZCBhZGQgYWRkcmVzcyBzaXplIHByZWZpeCByYXRoZXIgdGhhbiBvcGVyYW5kIHNpemUgcHJlZml4LgotCVJlbW92ZSBvcGVyYW5kIC0+IGFkZHJlc3Mgc2l6ZSBoYWNrIHdoZW4gZW1pdHRpbmcgamN4ei9sb29wLgotCShpMzg2X29wZXJhbmQpOiBSZW1vdmUgT19BYnNlbnQgY2hlY2sgYXMgaXQncyBkb25lIGluIGV4cHIuCi0KLVdlZCBKdW4gIDMgMTU6MDk6MTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtNTIwMCBhcyBhIGNwdV90eXBlIG9mIG02OGsuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggY3VycmVudCBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSnVuICAzIDE0OjExOjU5IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEFkZCBtb3JlIGNhbGxzCi0JdG8gcmVsYXhhYmxlX3N5bWJvbCB0byBwcmV2ZW50IHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgc3ltYm9sIGZyb20KLQliZWluZyByZWxheGVkLgotCi1XZWQgSnVuICAzIDE0OjEwOjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAocmVsYXhhYmxlX3N5bWJvbCk6IElmIFRBUkdFVF9PUyBpcyAiZWxmIiwgYWxsCi0Jc3ltYm9scyBhcmUgcmVsYXhhYmxlLgotCi1XZWQgSnVuICAzIDA5OjE2OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2JlZ2luKTogIERvbid0IGNyZWF0ZSBzcGVjaWFsCi0gICAgICAgIHNlY3Rpb25zIGJ5IGRlZmF1bHQuCi0gCi1UdWUgSnVuICAyIDE0OjUyOjU2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBGb3IgZGl2IGFuZCB1ZGl2LCBjbG9zZSB0aGUKLQlyZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUuCi0KLVR1ZSBKdW4gIDIgMTU6MzY6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBNYXR0IFNlbWVyc2t5IDxtYXR0c0BzY2QuaHAuY29tPjoKLQkqIG1hY3JvLmMgKG1hY3JvX21yaV9tb2RlKTogTmV3IGZ1bmN0aW9uLgotCSogbWFjcm8uaCAobWFjcm9fbXJpX21vZGUpOiBEZWNsYXJlLgotCSogcmVhZC5jIChzX21yaSk6IENhbGwgbWFjcm9fbXJpX21vZGUgd2hlbiBzd2l0Y2hpbmcgaW4gYW5kIG91dCBvZgotCU1SSSBtb2RlLgotCi1UdWUgSnVuICAyIDEzOjMyOjIyIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9jb21tKTogQWxsb3cgYWxpZ25tZW50IHBhcmFtZXRlciBpbgotCU9CSl9FVkFYIGNhc2UuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBEZWZlciByZXN0b3JpbmcgY2hhcmFjdGVyCi0JdW50aWwgYWZ0ZXIgeHN0cmR1cCBpbiBPQkpfRVZBWCBjYXNlLgotCi1UdWUgSnVuICAyIDEzOjExOjEzIDE5OTggIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2NyZWF0ZV9zaG9ydF9qdW1wKTogRml4IG9mZiBieSB0d28gYnVnIGluCi0Jb2Zmc2V0IGNhbGN1bGF0aW9uLiAgQWxzbywgdXNlIFZBWF9CUlcgZnJvbSB2YXgtaW5zdC5oIGluc3RlYWQKLQlvZiBoYXJkY29kZWQgbWFnaWMgbnVtYmVyLgotCShtZF9jcmVhdGVfbG9uZ19qdW1wKTogVXNlIFZBWF9KTVAgYW5kIFZBWF9BQlNPTFVURV9NT0RFIG1hY3Jvcy4KLQotVHVlIEp1biAgMiAwOToyNTozNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGRvX3NfZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoc19mdW5jKTogQ2FsbCBpdC4KLQkqIHJlYWQuaCAoZG9fc19mdW5jKTogQWRkIHByb3RvdHlwZS4KLQotTW9uIEp1biAgMSAxMjo0NzozMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2RvX2FsaWduKTogT25seSBmaWxsIGNvZGUgc2VjdGlvbnMgd2l0aAotCW5vcHMgaWYgZmlsbCBwYXR0ZXJuIG5vdCBzcGVjaWZpZWQuCi0KLU1vbiBKdW4gIDEgMTQ6MDg6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBBbmRyZXcgQ3JhYnRyZWUgPGFuZHJld2NAdHlwaG9vbi5yb3NlLmhwLmNvbT46Ci0JKiBjb25maWcvdGUtZ28zMi5oIChURV9HTzMyKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuaCAoTE9DQUxfTEFCRUwpOiBEb24ndCBkZWZpbmUgaWYgVEVfR08zMi4KLQotU3VuIE1heSAzMSAxNTo0MzowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JSW1wbGVtZW50IC5mdW5jLy5lbmRmdW5jIHBzZXVkby1vcHMuCi0JKiByZWFkLmggKHN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jLHN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jKTogRGVjbGFyZS4KLQkoc19mdW5jKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAuZnVuYywuZW5kZnVuYy4KLQkoc19mdW5jKTogTmV3IGZ1bmN0aW9uLgotCSogc3RhYnMuYyAoc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMsc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKGluX2RvY19mdW5jX3AsY3VycmVudF9mdW5jdGlvbl9sYWJlbCk6IE5ldyBzdGF0aWMgZ2xvYmFscy4KLQkoc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IEVtaXQgZnVuY3Rpb24gcmVsYXRpdmUgc3RhYnMgaWYgaW4gLmZ1bmMuCi0KLUZyaSBNYXkgMjkgMTg6MTM6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYTI5ay5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFscGhhLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYXJtLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWhwcGEuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pODYwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTk2MC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXRpYzMwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdzY1LmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtejhrLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYTI5ay5jOiBEb24ndCBkZWZpbmUgbWRfc2hvcnRfanVtcF9zaXplLAotIAltZF9sb25nX2p1bXBfc2l6ZSwgbWRfY3JlYXRlX3Nob3J0X2p1bXAgb3IgbWRfY3JlYXRlX2xvbmdfanVtcC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1hcm0uYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaDgzMDAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaDg1MDAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaHBwYS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pODYwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk5NjAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtcHBjLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmg6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXRpYzMwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXc2NS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy16OGsuYzogTGlrZXdpc2UuCi0KLUZyaSBNYXkgMjkgMTY6MDM6MjYgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy12YXguYyAoXyk6IERlbGV0ZSB0aGlzIG1hY3JvIHVzZWQgZm9yIHBsYWNlaG9sZGVyCi0JdmFsdWVzIGluIHZheF9vcGVyYW5kX3dpZHRoX3NpemU7IGl0IGNvbmZsaWN0cyB3aXRoIHRoZSBfKCkgbWFjcm8KLQl1c2VkIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLQotRnJpIE1heSAyOSAxMzo0NjowNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2ZpbmRfYmFzZSk6IEZpeCBjYXNlIGluc2Vuc2l0aXZlIHN5bWJvbCBuYW1lCi0JY29kZS4gIEZyb20gQ2hyaXMgTW9sbGVyIDxtb2xsZXJAYm9wcy5jb20+LgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBLbGF1cyBLYWVtcGYgPGtrYWVtcGZAcHJvZ2lzLmRlPjoKLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3QgYnJva2VuX3dvcmQpOiBBZGQgc2VnIGFuZCBzdWJzZWcgZmllbGRzLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBJbml0aWFsaXplIHNlZyBhbmQgc3Vic2VnIGZpZWxkcyBvZiBhIG5ldwotCWJyb2tlbiB3b3JkLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTd2l0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIHNlZ21lbnQKLQlhbmQgc3Vic2VnbWVudCB3aGVuIHByb2Nlc3NpbmcgYSBicm9rZW4gd29yZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobXJpX2Fzc2VtYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IENhbGwgbXJpX2Fzc2VtYmxlIHJhdGhlciB0aGFuCi0JbWRfYXNzZW1ibGUuCi0JKHNfbXJpX2Vsc2UsIHNfbXJpX2JyZWFrLCBzX21yaV9uZXh0LCBzX21yaV9mb3IpOiBMaWtld2lzZS4KLQkoc19tcmlfZW5kZiwgc19tcmlfZW5kdyk6IExpa2V3aXNlLgotCi1XZWQgTWF5IDI3IDExOjE2OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX29yZyk6IENhbGwgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgaWYgaXQgaXMgZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgXG5cIHRvIG5ldyBzdHJpbmcuCi0KLVR1ZSBNYXkgMjYgMTk6Mjc6NTIgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKE9QVElPTl9MSVRUTEVfRU5ESUFOX0RBVEEpOiBOZXcuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBmb3Igc2FtZS4KLQkoc3BhcmNfbWRfZW5kKTogU2V0IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZS4KLQkobWRfYXBwbHlfZml4MywgdGNfZ2VuX3JlbG9jKTogQWxsb3cgQkZEX1JFTE9DX1NQQVJDXzMyTEUuCi0JKGNvbnNfZml4X25ld19zcGFyYyk6IEFkZGVkIHRvIGNyZWF0ZSBCRkRfUkVMT0NfU1BBUkNfMzJMRS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKGNvbnNfZml4X25ld19zcGFyYyk6IEFkZGVkLgotCQotVGh1IE1heSAyMSAxNTowMjo0MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGZpbmRfcmVhbF9zdGFydCk6IFJlbGF4IGRlZmluaXRpb24gb2YgbG9jYWwKLQlsYWJlbHMuCi0KLVR1ZSBNYXkgMTkgMTY6NTk6NDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZDMwdl9hbGlnbik6IEFwcGx5IGFkZHJlc3MgYWRqdXN0bWVudCB0byBhbGwKLQlzeW1ib2xzIGF0IHRoZSBnaXZlbiBhZGRyZXNzLCBub3QganVzdCB0aGUgbGFzdCBvbmUgc3BlY2lmaWVkLgotCi1UdWUgTWF5IDE5IDA4OjI1OjE5IDE5OTggIENhdGhlcmluZSBNb29yZSA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaGFuZGxlX2FsaWduKTogVXNlIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4KLSAgICAgICAgb3IgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiB0byB3cml0ZSBkYXRhLgotCi1Nb24gTWF5IDE4IDE3OjA5OjMwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIGFydGlmaWNpYWxseSBjcmVhdGVkCi0JcmVnaXN0ZXIgbmFtZSBzeW1ib2xzLgotCi1Nb24gTWF5IDE4IDEzOjQ3OjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2UgInNlZ21lbnQiIHRvICJzZWN0aW9uIiBpbgotCWVycm9yIG1lc3NhZ2UuCi0KLU1vbiBNYXkgMTggMTY6NTU6NDAgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2Ugc3ltMS1zeW0yIG1lc3NhZ2UgYWdhaW4uCi0KLU1vbiBNYXkgMTggMDk6MzE6NDMgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UgZm9yIHN5bTEtc3ltMgotCWVycm9ycyB3aGVuIHN5bTEgaXMgaW4gYSBkaWZmZXJlbnQgc2VnbWVudCBmcm9tIHN5bTIuCi0KLVdlZCBNYXkgMTMgMTA6MTY6MzcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAod2Fybl91bm1hdGNoZWRfaGlnaCk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKE9QVElPTl9XQVJOX1BBUkFMTEVMKTogUmVuYW1lIGZyb20gT1BUSU9OX1dBUk4uCi0JKE9QVElPTl9OT19XQVJOX1BBUkFMTEVMKTogUmVuYW1lIGZyb20gT1BUSU9OX05PX1dBUk4uCi0JKG1kX2xvbmdvcHRzKTogUmVjb2duaXplIC0te25vLSx9d2Fybi11bm1hdGNoZWQtaGlnaC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuCi0JKG1kX3Nob3dfdXNhZ2UpOiBMaWtld2lzZS4KLQkobTMycl9mcm9iX2ZpbGUpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChnZW5lcmF0ZV9maWxlX2RlYnVnLGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IE5ldyBmdW5jdGlvbnMuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhbGwgdGhlbS4KLQkqIHJlYWQuaCAoc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUpOiBEZWNsYXJlLgotCSogc3RhYnMuYyAoc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKGdlbmVyYXRlX2FzbV9maWxlKTogTmV3IGZ1bmN0aW9uLgotCShzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogTW92ZSBmaWxlIG5hbWUgaGFuZGxpbmcgaW50bwotCWdlbmVyYXRlX2FzbV9maWxlLgotCi1UdWUgTWF5IDEyIDEyOjAzOjQ0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGN1cl9tdWwzMl9wLCBwcmV2X211bDMyX3ApOiBNYWtlIHN0YXRpYy4KLSAgICAgICAgKGQzMHZfY3VycmVudF9hbGlnbiwgZDMwdl9jdXJyZW50X2FsaWduX3NlZyk6IE5ldyB2YXJpYWJsZXMuCi0gICAgICAgIChkMzB2X2xhc3RfbGFiZWwpOiBOZXcgdmFyaWFibGUuCi0gICAgICAgIChkMzB2X2FsaWduLCBzX2QzMHZfYWxpZ24sIHNfZDMwdl90ZXh0KTogTmV3IGZ1bmN0aW9ucy4KLSAgICAgICAgKHNfZDMwdl9kYXRhLCBzX2QzMHZfc2VjdGlvbik6IExpa2V3aXNlLgotICAgICAgICAobWRfcHNldWRvX3RhYmxlKTogQ2FsbCB0aGVtLgotICAgICAgICAobWRfYmVnaW4pOiBJbml0aWFsaXplIGQzMHZfY3VycmVudF9hbGlnbl9zZWcuCi0gICAgICAgIChtZF9hc3NlbWJsZSk6IENhbGwgZDMwdl9hbGlnbiB3aGVuIG5lZWRlZCBieSBrbm93biBjdXJyZW50IGFsaWdubWVudC4KLSAgICAgICAgKGQzMHZfZnJvYl9sYWJlbCwgZDMwdl9jb25zX2FsaWduKTogTmV3IGZ1bmN0aW9ucy4KLSAgICAgICAgKiBjb25maWcvdGMtZDMwdi5oIChtZF9kb19hbGlnbik6IFJlbW92ZS4KLSAgICAgICAgKHRjX2Zyb2JfbGFiZWwpOiBDYWxsIGQzMHZfZnJvYl9sYWJlbC4KLSAgICAgICAgKG1kX2NvbnNfYWxpZ24pOiBOZXcuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGZpbmRfZm9ybWF0KTogQ29udmVydCBjb21wbGV4IGV4cHJlc3Npb25zIHRvIAotCWV4cHJlc3Npb24gc3ltYm9scyBiZWZvcmUgcHJvY2Vzc2luZy4gIENsZWFuIHVwIGNvZGUgZm9ybWF0dGluZy4KLQotU3VuIE1heSAxMCAyMjozNTowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVRodSBNYXkgIDcgMTU6NDk6MDcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSAiYnJhIiBqdXN0IGxpa2UgImptcCIKLQlpbnN0cnVjdGlvbnMuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCi1UaHUgTWF5ICA3IDExOjQ3OjIyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVcGRhdGUgd2l0aCBgbWFrZSBkZXAtYW0nLgotCShIRklMRVMpOiBBZGQgY2dlbi5oLgotCShjZ2VuLm8pOiBEZXBlbmQgb24gY2dlbi5oLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLQkqIGNnZW4uYyAoY2dlbl9tZF9hcHBseV9maXgzKTogRG9uJ3QgcGFzcyBuZXdsaW5lIHRvIGFzX3dhcm5fd2hlcmUuCi0KLVRodSBNYXkgIDcgMTM6MjA6NTYgMTk5OCAgQW5kZXJzIEJsb21kZWxsICA8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPgotCi0JKiBnYXNwLmMgKGdyYWJfbGFiZWwpOiBQZXJtaXQgYSBsYWJlbCB0byBiZSBhIHByZXByb2Nlc3NvcgotCXZhcmlhYmxlIGJ5IHBlcm1pdHRpbmcgYSBsYWJlbCB0byBzdGFydCB3aXRoIGEgYmFja3NsYXNoLgotCi1UaHUgTWF5ICA3IDEyOjUwOjMzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHZhbGlkYXRlX21pcHNfaW5zbik6IFJlbW92ZWQgaGFjawotCWZvciBwcmV2aW91c2x5IGluYWNjZXNzaWJsZSBiaXRmaWVsZHMgaW4gc29tZSBJTlNOX1RSQVAKLQlpbnN0cnVjdGlvbnMuCi0KLVRodSBNYXkgIDcgMTE6MTM6MDAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBBYm9ydCB3aXRoIGVycm9yIG1lc3NhZ2UKLQlpZiBvcGNvZGUgb3BlcmFuZHMgZG8gbm90IG1hdGNoLgotCQotVGh1IE1heSAgNyAwOTozNjowNiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCwgdmFsaWRhdGVfbWlwc19pbnNuKTogSW1wbGVtZW50Ci0JJ3EnIG9wZXJhbmQgZm9ybWF0IGZvciAyMC1iaXQgImJyZWFrIi8ic2RiYnAiIGluc3RydWN0aW9ucy4KLQkobWlwc19pcCk6IFRydW5jYXRlIG92ZXJmbG93ZWQgImJyZWFrIiAnYycgb3BlcmFuZC4gIEltcGxlbWVudAotCXNpbWlsYXIgbmV3ICdxJyBvcGVyYW5kLgotCi1UaHUgTWF5ICA3IDA3OjQ3OjE0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogRml4IHR5cG8uCi0KLVRodSBNYXkgIDcgMDI6MTk6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogTmV3IGZpbGUuCi0JKiBjZ2VuLmM6IEluY2x1ZGUgaXQuCi0JKE1BWF9GSVhVUFMpOiBSZW5hbWVkIHRvIENHRU5fTUFYX0ZJWFVQUy4KLQkoY2dlbl9hc21fZmluaXNoX2luc24pOiBSZXN1bHQgaXMgbm93IHZvaWQuICBOZXcgYXJnIGByZXN1bHQnLgotCUFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKiBjb25maWcvdGMtbTMyci5jOiBJbmNsdWRlIGNnZW4uaC4KLQkobTIzcl9pbnNuKTogTmV3IG1lbWJlcnMgbnVtX2ZpeHVwcyxmaXh1cHMuCi0KLVdlZCBNYXkgIDYgMTY6Mjk6MTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBTbGlnaHRseSByZXdvcmsgc29tZSBjb2RlCi0JdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4KLQotV2VkIE1heSAgNiAxNToyNjozNCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSdW4gZGVjIGMgd2l0aCAvbm9kZWJ1Zy4gIFBhc3MgQ0MgdmFsdWUgd2hlbgotCWNhbGxpbmcgbWFrZS4KLQotICAgICAgICAqIG1ha2VmaWxlLnZtcyAoT0JKUyk6IEFkZCBlaG9wdC5vYmoKLQotV2VkIE1heSAgNiAxNToxMToxMiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZG9jL2MtdmF4LnRleGk6IENvcnJlY3QgYW5kIGV4dGVuZCB2YXgvdm1zIGRvY3VtZW50YXRpb24uCi0KLVdlZCBNYXkgIDYgMTE6NTE6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBBY2NlcHQgYSBuZXcgcGFyYW1ldGVyIHJlcXVlc3RpbmcKLQlhIHNob3J0IGZvcm1hdCBpbnNuLgotCShtZF9hc3NlbWJsZSk6IFNldCBpdCBmb3IgZXhwbGljaXRseSBwYWNrZWQgaW5zbnMuCi0JCi1UdWUgTWF5ICA1IDEzOjIzOjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3N5bWJvbF9tZXJnZSk6IERvIG5vdCB0YWtlIGFkZHJlc3Mgb2YKLQluYXRpdmUgZmllbGRzIHdoZW4gcGVyZm9ybWluZyB0aGUgbWVtY3B5LgotCi1UdWUgTWF5ICA1IDEzOjEwOjQxIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyxtYWNybzIpOiBJbXBsZW1lbnQgCi0JTV9ETVVMT19JLCBNX01VTE9fSSwgTV9ETVVMT1VfSSwgYW5kIE1fTVVMT1VfSS4KLQotTW9uIE1heSAgNCAxNzo0OToxNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogQ2hhbmdlZCB0byBrZWVwCi0JcmVsb2NhdGlvbnMgYWdhaW5zdCBnbG9iYWxseSB2aXNpYmxlIHN5bWJvbHMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChyZWxheGFibGVfc3ltYm9sKTogTmV3IG1hY3JvLgotCShtNjhrX2lwLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVzZSBpdC4KLQkodGNfbTY4a19maXhfYWRqdXN0YWJsZSk6IEFsc28gaGFuZGxlIHdlYWsgc3ltYm9scy4KLQotTW9uIE1heSAgNCAxNjoxMjoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IEtlZXAgcmVsb2NzIGZvciBhbGwKLQlyZWZlcmVuY2VzIHRvIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IFdoZW4gT0JKX0VMRiwgZG9uJ3QgYWRkIHRoZQotIAl2YWx1ZXMgaW4gdHdpY2UgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgdGhlIHN5bWJvbCBpcwotIAlleHRlcm5hbGx5IGRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSkgW09CSl9BT1VUXTogV2hlbiBQSUMsCi0JZG9uJ3QgYWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUKLQlzeW1ib2wuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4Myk6IFdoZW4gZ2VuZXJhdGluZyBhLm91dCBQSUMsCi0JZm9yIGEgUEMgcmVsYXRpdmUgZml4dXAgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgZGVmaW5lZAotCXN5bWJvbCwgYXJyYW5nZSB0byBzdG9yZSBvYmplY3QgZmlsZSBhbmQgYWRkZW5kIHZhbHVlcyBhcyB0aG91Z2gKLQl0aGUgc3ltYm9sIHdlcmUgbm90IGRlZmluZWQuCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1UaHUgQXByIDMwIDEzOjA5OjM5IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBuaW5lbW9vbnMuY29tPgotCi0JKiByZWFkLmMgKHNpemVvZl9sZWIxMjgpOiBSZWZlcmVuY2VkIGV4dGVybmFsbHkgYnkgd3JpdGUuYyBzbwotCWRvbid0IGlubGluZS4KLQotV2VkIEFwciAyOSAxNTo0NTo1NyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoeyxleHBhbmRffWRlYnVnX3N5bSk6IE5ldyBmdW5jdGlvbnMgdG8gcmVjb3JkCi0JYW5kIGV4cGFuZCBhICdkZWJ1Zycgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbgotCXRoYXQgZG9lcyBub3QgY2F1c2UgYSBzaG9ydCBpbnN0cnVjdGlvbiB0byBiZSBmaWxsZWQgd2l0aCBhIE5PUC4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIHN1cHBvcnQgZm9yIC5kZWJ1Z3N5bS4KLQkoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IEFkZCBjYWxscyB0byBleHBhbmRfZGVidWdfc3ltIGFzCi0JYXBwcm9wcmlhdGUuCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0KLVR1ZSBBcHIgMjggMTk6MTY6MjYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhcy5jIChtYWluKTogQ29uZGl0aW9uYWxseSBjYWxsIHNldGxvY2FsZS4KLQkqIGdhc3AuYyAobWFpbik6IExpa2V3aXNlLgotCSogYXNpbnRsLmg6IEluY2x1ZGUgPGxvY2FsZS5oPiBpZiBIQVZFX0xPQ0FMRV9ILgotCShMQ19NRVNTQUdFUyk6IE5vdyBjYW4gYmUgZGVmaW5lZCBldmVuIHdoZW4gRU5BQkxFX05MUy4KLQotVHVlIEFwciAyOCAxODozMzoyMyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9zaG93X3VzYWdlKTogQ29ycmVjdCBnZXR0ZXh0IHR5cG8uCi0JCi1UdWUgQXByIDI4IDEyOjE2OjMwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogQ2hhbmdlIGFsbCBjYWxscyB0byBiemVybyB0byB1c2UgbWVtc2V0LgotCShwYV9pcCk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKHRjX2dlbl9yZWxvYywgbWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKHBhX2ZpbmRfc3BhY2VfYnlfbnVtYmVyKTogTGlrZXdpc2UuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShwYV9ibG9jayk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9zb21fY29weXJpZ2h0KTogRGVjbGFyZS4KLQotVHVlIEFwciAyOCAxMTozNTo1NiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9saW5lbm8pOiBEbyBub3QgdXNlIGR1bW15IGZpcnN0X2xpbmVubwotCWZvciBsaW5lIG51bWJlcnMgZm9yIGFzc2VtYmx5IHNvdXJjZS4KLQotTW9uIEFwciAyNyAxNTo1ODo0NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOS40Ci0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBBcHIgMjcgMTI6MDc6MzMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9hc21fZmluaXNoX2luc24pOiBOZXcgYXJnIHJlbGF4X3AuICBBbGwgY2FsbGVycyB1cGRhdGVkLgotCi1Nb24gQXByIDI3IDE1OjE2OjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuaDogQ2hhbmdlIHN5bWJvbFMgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8gc3RydWN0Ci0Jc3ltYm9sLgotCi1TdW4gQXByIDI2IDEzOjQ0OjIyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHBhcnNlX3JlZyk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkobWRfY29udmVydF9mcmFnKTogRml4IGkxOG4gdHlwby4KLQotU2F0IEFwciAyNSAyMDoxMjowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9nZXRfY3VyX3Byb2Nfc3ltKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuaDogUHJvdG95cGUgaXQuCi0JKiBjb25maWcvdGMtYWxwaGEuYyBbRUxGXSAoc19hbHBoYV9wcm9sb2d1ZSk6IE5ldyBmdW5jdGlvbi4KLQlbRVZBWF0gKHNfYWxwaGFfcHJvbG9ndWUpOiBEZWxldGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IFVwZGF0ZS4KLQotU2F0IEFwciAyNSAxNDowMDo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIGJwX2Vycm9yX21zZyBmcm9tIHN0YXRpYwotCWFycmF5IHRvIGxvY2FsIHBvaW50ZXIuCi0JKGdldF9hcmdzLCBwYXJzZV9leHByKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1GcmkgQXByIDI0IDEyOjQ3OjQyIDE5OTggIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiByZWFkLmMgKHNfc2V0KTogQ2FzdCB4bWFsbG9jIHJldHVybiB2YWx1ZSB0byBmcmFnUyAqLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEZ1bmN0aW9uIG1hZGUgc3RhdGljIHRvIG1hdGNoCi0JcHJldmlvdXMgZm9yd2FyZCBkZWNsYXJhdGlvbi4KLQkoaW5zZXJ0X3JlZywgaW5pdF9yZWd0YWJsZSwgbWRfY29udmVydF9mcmFnXzEpOiBMaWtld2lzZS4KLQotRnJpIEFwciAyNCAwOToyNjo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBBZGQgaW50ZXJuYXRpb25hbGlzYXRpb24gbWFjcm9zIHRvIGVycm9yCi0Jc3RyaW5ncy4gIAotCi0JKiBjb25maWcvdGMtbTMyci5jIChjYW5fbWFrZV9wYXJhbGxlbCk6IEFkZCBpbnRlcm5hdGlvbmFsaXNhdGlvbgotCW1hY3JvcyB0byBlcnJvciBzdHJpbmdzLgotCi1UaHUgQXByIDIzIDE5OjIzOjIzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBDb3JyZWN0IHRlc3Qgb2Ygd2hldGhlciBhCi0JcmVsb2MgaXMgaW4gdGhlIFRPQyBjc2VjdC4KLQkobWRfYXBwbHlfZml4Myk6IENvcnJlY3QgZ2V0dGV4dCB0eXBvLgotCi1UaHUgQXByIDIzIDE0OjU4OjMxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZmluZF9yZWFsX3N0YXJ0KTogSWdub3JlIHN5bWJvbHMgc3RhcnRpbmcgd2l0aAotCS5MIC0gdGhleSBhcmUgbG9jYWwgbGFiZWxzIGFuZCB0aGUgYnJhbmNoZXMgYXJlIG5vdCByZWFsbHkKLQlmdW5jdGlvbiBjYWxscyBidXQgcmF0aGVyIGZhciBqdW1wcy4KLQotV2VkIEFwciAyMiAxNTo1NzoyMSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCi0KLVdlZCBBcHIgMjIgMTQ6NTI6MzYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFByaW50IG9wZXJhbmQgbnVtYmVyIHJhdGhlciB0aGFuCi0JdXNpbmcgb3JkaW5hbF9uYW1lcy4KLQkoaTM4Nl9vcGVyYW5kKTogTGlrZXdpc2UuCi0KLVR1ZSBBcHIgMjEgMjI6MzQ6MjUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBzY3JpYmJsZXMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKElOVExMSUJTKTogRGVmaW5lIHRvIHdvcmsgYXJvdW5kIGFwcGFyZW50IGF1dG9tYWtlCi0JYnVnLgotCUFsbCBNYWtlZmlsZXM6IFJlZ2VuZXJhdGVkLgotCi0JKiBNYW55IGZpbGVzOiBBZGRlZCBnZXR0ZXh0IGludm9jYXRpb25zIGFyb3VuZCB1c2VyLXZpc2libGUKLQlzdHJpbmdzLgotCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAotCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCi0JKiBkZXAtaW4uc2VkOiBBZGRlZCBhc2ludGwuaC4KLQkqIHBvL01ha2UtaW46IE5ldyBmaWxlLgotCSogZ2FzcC5jIChtYWluKTogQ2FsbCBzZXRsb2NhbGUsIGJpbmR0ZXh0ZG9tYWluLCBhbmQgdGV4dGRvbWFpbi4KLQlJbmNsdWRlICJhc2ludGwuaCIuCi0JKiByZWFkLmMgKFpfKTogUmVuYW1lZCBmcm9tIGBfJy4KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogQWRkZWQgcG8uCi0JKFBPVEZJTEVTKTogbmV3IG1hY3JvLgotCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCi0JKCQoT0JKUykpOiBBZGRlZCBhc2ludGwuaC4KLQkoSEZJTEVTKTogTGlrZXdpc2UuCi0JKElOQ0xVREVTKTogQWRkZWQgLURMT0NBTEVESVIsIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsLgotCShhc19uZXdfTERBREQpOiBBZGRlZCAkKElOVExMSUJTKS4KLQkoYXNfbmV3X0RFUEVOREVOQ0lFUyk6IEFkZGVkICQoSU5UTERFUFMpLgotCShnYXNwX25ld19MREFERCk6IEFkZGVkICQoSU5UTExJQlMpLgotCShnYXNwX25ld19ERVBFTkRFTkNJRVMpOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbHQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuICBHZW5lcmF0ZSBwby9NYWtlZmlsZS5pbiBhbmQKLQlwby9NYWtlZmlsZS4KLQkoQUxMX0xJTkdVQVMpOiBEZWZpbmUuCi0JKiBtYWNyby5jOiBJbmNsdWRlICJhc2ludGwuaCIuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBzZXRsb2NhbGUsIGJpbmR0ZXh0ZG9tYWluLCBhbmQgdGV4dGRvbWFpbi4KLQkqIGFzLmg6IEluY2x1ZGUgImFzaW50bC5oIi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG9yZGluYWxfbmFtZXMpOiBSZW1vdmVkLgotCShtZF9hc3NlbWJsZSk6IENoYW5nZWQgZXJyb3IgdGV4dCB0byBhdm9pZCBvcmRpbmFsX25hbWVzLgotCShpMzg2X29wZXJhbmQpOiBMaWtld2lzZS4KLQkocmVsb2MpOiBBZGRlZCBhc19iYWQgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtYXJtLmMgKGJhZF9hcmdzKTogTm93IGEgI2RlZmluZS4KLQkoYmFkX3BjKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfc3RhYl9wYXJzZSk6IENoYW5nZWQgdHlwZSBvZgotCWBsb25nX2NvbnN0X21zZycuCi0JKGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5KTogVW5pZmllZCBzdHJpbmdzIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGdldF9yZWxvY19jb2RlKTogQWRkZWQgc29tZSBhc19iYWQgY2FsbHMgdG8KLQlhdm9pZCBpMThuIHByb2JsZW1zLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKHJlbG9jKTogQWRkZWQgYXNfYmFkIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGRlZCBhc19iYWRfd2hlcmUgdG8gYXZvaWQKLQlpMThuIHByb2JsZW1zLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEFkZGVkIGFzX2JhZCB0byBhdm9pZCBpMThuCi0JcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENoYW5nZWQgQysrIGNvbW1lbnQgaW50byBDCi0JY29tbWVudC4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBBZGRlZCBhc193YXJuIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGFzLmMgKHByaW50X3ZlcnNpb25faWQpOiBBZGRlZCBhbiBmcHJpbnRmIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGNvbmQuYyAoY29uZF9maW5pc2hfY2hlY2spOiBBZGRlZCBhc19iYWQgY2FsbCB0byBhdm9pZCBpMThuCi0JcHJvYmxlbXMuCi0JKiBleHByLmMgKGV4cHIpOiBBZGRlZCBhc193YXJuIGNhbGwgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkqIG1lc3NhZ2VzLmMgKGFzX2Fzc2VydCk6IENoYW5nZWQgY29kZSB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCShhc19hYm9ydCk6IExpa2V3aXNlLgotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogQWRkZWQgYXNfYmFkIGNhbGwgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkoc19zcGFjZSk6IExpa2V3aXNlLgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2dhcy5wb3Q6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAyMSAxNzowMToyMiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGNoZWNrX3ByZWZpeCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHNwbGl0IG91dAotCWZyb20gbWRfYXNzZW1ibGUuCi0JKHN0cnVjdCBfaTM4Nl9pbnNuKTogQWRkIHdhaXRfcHJlZml4IGZpZWxkLgotCShtZF9hc3NlbWJsZSk6IFJlbW92ZSB3YWl0X3ByZWZpeCBsb2NhbCB2YXJpYWJsZS4gIFVzZQotCWNoZWNrX3ByZWZpeCB3aGVuIGFkZGluZyBhIHByZWZpeC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoY3VycmVudF90ZW1wbGF0ZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IFJlbW92ZSBjdXJyZW50X3RlbXBsYXRlcyBsb2NhbCB2YXJpYWJsZS4KLQkobWRfYXNzZW1ibGUsIGkzODZfb3BlcmFuZCk6IEltcHJvdmUgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgaW4KLQltYW55IHBsYWNlcy4gIEFkZCBSRVNUT1JFX0VORF9TVFJJTkcgaW4gbWFueSBwbGFjZXMgYmVmb3JlIGVycm9yCi0JcmV0dXJuLiAgQ2xhcmlmeSBzb21lIGNvbW1lbnRzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzdHJ1Y3QgX2kzODZfaW5zbik6IENoYW5nZSBzZWcgZmllbGQgdG8gYSB0d28KLQllbGVtZW50IGFycmF5LgotCShtZF9hc3NlbWJsZSk6IFBhcnNlIHN0cmluZyBpbnN0cnVjdGlvbiBvcGVyYW5kcywgbG9va2luZyBmb3IKLQlzZWdtZW50IG92ZXJyaWRlIHByZWZpeGVzLiAgQ2hlY2sgZm9yIGludmFsaWQgc2VnbWVudCBwcmVmaXhlcyBvbgotCXN0cmluZyBpbnN0cnVjdGlvbi4KLQkoaTM4Nl9vcGVyYW5kKTogaS5zZWdbXSBhbmQgbWF4IG1lbV9vcGVyYW5kIGNoYW5nZXMgZm9yIHN0cmluZwotCWluc25zLgotCSogY29uZmlnL3RjLWkzODYuaCAoRXNTZWcpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHJlZ0tsdWRnZSk6IERlZmluZS4KLQkoaWNscktsdWRnZSwgaW11bEtsdWRnZSk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogTWVyZ2UgaW11bEtsdWRnZSBhbmQgaWNscktsdWRnZQotCWNvZGUuICBNb3ZlIFJldmVyc2VSZWdSZWdtZW0gZnVkZ2VzIGludG8gTW9kcm0gY2FzZS4gIFJlb3JkZXIKLQlvcGNvZGVfbW9kaWZpZXIgY2hlY2tzIHRvIGxvb2sgZm9yIG1vcmUgY29tbW9uIGNhc2VzIGZpcnN0LiAgQWRkCi0JZGVmYXVsdF9zZWcgZm9yIElzU3RyaW5nIGNhc2UuCi0KLVR1ZSBBcHIgMjEgMTY6MTg6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fUFJPR19MRVggcmF0aGVyIHRoYW4gQUNfUFJPR19MRVggYW5kCi0JQUNfREVDTF9ZWVRFWFQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UgYW5kIGxpYnRvb2wuCi0JKiBhY2xvY2FsLm00LCBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLQkqIGRvYy9NYWtlZmlsZS5hbSAoYXMuZHZpKTogTmV3IHRhcmdldC4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU2F0IEFwciAxOCAwMToyMTowNCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBzcGFyYzg2eCBzdXBwb3J0LgotCQotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGxvb2t1cF9hcmNoKTogQWRkZWQgYXJjaF90eXBlIHRvIHN0cnVjdAotCXNwYXJjX2FyY2guCi0JKG1kX3BhcnNlX29wdGlvbik6IFdhcm4gaWYgLUVMIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoU1BBUkNfQklFTkRJQU4pIEFsd2F5cyBkZWZpbmUuCi0JCi1TYXQgQXByIDE4IDAxOjE5OjAxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBOb3RlIHdoZW4gd2UgdXNlIGdldCBtYXRjaCBvbgotICAgICAgICB0aGUgZnVsbCBpbnN0cnVjdGlvbiBuYW1lLgotCi1XZWQgQXByIDE1IDE1OjE3OjI3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpIFtPX3N5bWJvbF06IEFsc28gc3RvcmUgdGhlIHN5bWJvbAotCWJhY2sgaW50byB0aGUgZXhwcmVzc2lvbiB0byBoYW5kbGUgYWRkL3N1YiBzaW1wbGlmaWNhdGlvbiBjb3JyZWN0bHkuCi0KLVdlZCBBcHIgMTUgMDc6MDY6MDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChoaWxvX2ludGVybG9ja3MpOiBSZW1vdmUgNDMwMC4KLQotTW9uIEFwciAxMyAxNjo1MTowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGRvX21zcik6IFN1cHBvcnQgdW5kb2N1bWVudGVkICdtc3IgY3Bzcl9mbGcsCi0JIzxuPicgaW5zdHJ1Y3Rpb24uCi0KLVRodSBBcHIgIDkgMTA6Mjk6NDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChtYXhfaW5kZW50X2xldmVsKTogTmV3IGdsb2JhbC4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBVc2UgaXQuCi0JKiBleHByLmggKGV4cHJfYnVpbGRfZG90KTogRGVjbGFyZS4KLQkqIGV4cHIuYyAoZXhwcl9idWlsZF9kb3QpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBBcHIgIDggMTY6MTY6MTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChwcmludF9iaW5hcnkpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2V4cHJfMSk6IENhbGwgaXQuCi0KLU1vbiBBcHIgIDYgMTI6MDY6MzkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2UgIiNCIik6IEluc3RhbGwgdGhlIG9mZnNldCBvZiB0aGUKLQlvcGVyYW5kIGluIHRoZSBvcGNvZGUuCi0KLUZyaSBBcHIgIDMgMTE6NTg6MTkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBSZW9yZGVyIG9wZXJhbmQgZmxhZ3MgYW5kIG9wY29kZSBtb2RpZmllcgotCWZsYWdzIGZvciBjbGFyaXR5LiAgUmVtb3ZlIHVudXNlZCBkZWZpbml0aW9uczogVW5rbm93biwKLQlJbW1Vbmtub3duLCBEaXNwVW5rbm93biwgTm9Nb2RybS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHR5cGVfbmFtZXMpOiBBZGQgbWlzc2luZyBEZWJ1ZyB0eXBlLgotCShtZF9hc3NlbWJsZSk6IEJldHRlciBkdXBsaWNhdGUgcHJlZml4IGNoZWNraW5nLiAgUXVpY2tlciBzdHJpbmcKLQlpbnN0cnVjdGlvbiBjaGVjayB2aWEgbmV3IG9wY29kZV9tb2RpZmllciBmbGFnLgotCi1GcmkgQXByICAzIDExOjQ0OjM0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKEludm9raW5nKTogQ2xhcmlmeSAtV2EgZXhhbXBsZS4KLQotRnJpIEFwciAgMyAwOToxMjoyMyAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY2V0dXMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBBZGQgd2Vha2V4dCBlbnRyeS4gCi0JKHNfbWlwc193ZWFrZXh0KTogRGVmaW5lLgotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBEb24ndCBkZWZpbmUgaWYgZGVmaW5lZChUQ19NSVBTKS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3BzZXVkb190YWJsZSk6IERvbid0IGFkZCB3ZWFrZXh0IGlmIAotCWRlZmluZWQoVENfTUlQUykuCQotCQotVGh1IEFwciAgMiAyMjo0MjowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKHRjX2dlbl9yZWxvYyk6IFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzCi0JaXMgYW4gZXJyb3IgaWYgdGhlIHZhbHVlIGNhbiBub3QgYmUgY29tcHV0ZWQgYXQgYXNzZW1ibHkgdGltZS4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbi1yZWxvYyk6IExpa2V3aXNlLgotCi1UaHUgQXByICAyIDE2OjM2OjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChtYWluKTogU2V0IG5leHQgZmllbGQgb2YgbmV3IGluY2x1ZGVfcGF0aCBzdHJ1Y3R1cmUgdG8KLQlOVUxMLiAgRnJvbSBBdmVyeSBQZW5uYXJ1biA8YXZlcnlwQGdkYy5jYT4uCi0KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCk6IENhbGwgYXNfYmFkIHJhdGhlciB0aGFuIGFib3J0IGZvciBhbgotCXVuc3VwcG9ydGVkIE1SSSB0YXJnZXQuCi0KLVdlZCBBcHIgIDEgMTE6MDg6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChhcm1fdmFsaWRhdGVfZml4KTogTmV3IGZ1bmN0aW9uLiAgRGV0ZXJtaW5lIGlmCi0JdGhlIGRlc3RpbmF0aW9uIG9mIGEgYnJhbmNoIGluc3RydWN0aW9uIHNob3VsZCBiZSBhbHRlcmVkLgotCShmaW5kX3JlYWxfc3RhcnQpOiBOZXcgZnVuY3Rpb246ICBMb2NhdGUgdGhlIHJlYWwsIFRodW1iIGNvZGVkCi0Jc3RhcnQgb2YgYSBUaHVtYiBmdW5jdGlvbi4KLQkoZG9fdF9icmFuY2gyMyk6IEFsdGVyIHRoZSBkZXN0aW5hdGlvbiBvZiBicmFuY2hlcyB0byBUaHVtYgotCWZ1bmN0aW9ucy4gCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogRGVmaW5lIFRDX1ZBTElEQVRFX0ZJWC4KLQotVHVlIE1hciAzMSAxMzoyNzozMyAxOTk4ICBEZWFuIE0uIERlYXZlciAgPGRlYXZlckBhbXQudGF5MS5kZWMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGRlY29kZV9zaGlmdCk6IEhhbmRsZSBhZGRyZXNzaW5nIG1vZGUgMiB3L3JyeAotCWFsc28uCi0KLVdlZCBBcHIgIDEgMTM6MTM6MjAgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBVc2UgQGl0ZW14IGZvciBhIHNlY29uZGFyeSBpdGVtIGluIGEgdGFibGUuCi0JKiBkb2MvYy1ocHBhLnRleGk6IExpa2V3aXNlLgotCi1UdWUgTWFyIDMxIDE3OjUyOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtIChERVBfSU5DTFVERVMpOiBOZXcgdmFyaWFibGUuCi0JKC5kZXAxKTogQ2hhbmdlIHRvIHdvcmsgd2hlbiBzcmNkaXIgaXMgbm90IGFuIGFic29sdXRlIHBhdGguCi0JKC50Y2RlcCwgLm9iamRlcCwgLmRlcDIsIGRlcC5zZWQpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMwIDEyOjQ2OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCwgY29uZmlnL3RjLWkzODYuYzogUmV2ZXJ0IE1hcmNoIDI0Ci0JTGluZWFyQWRkcmVzcyBwYXRjaC4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi1Nb24gTWFyIDMwIDExOjIyOjA4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoRldhaXQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEVtaXQgZndhaXQgcHJlZml4IGJlZm9yZSBhbnkKLQlvdGhlciBwcmVmaXhlcy4gIENoZWNrIEZXYWl0IGZsYWcgaW4gb3Bjb2RlIHRhYmxlIHRvIHNlZSB3aGljaAotCWluc3RydWN0aW9ucyByZXF1aXJlIGFuIGZ3YWl0IHByZWZpeC4KLQotTW9uIE1hciAzMCAxMDoxMjowMCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogc3RhYnMuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IEFsd2F5cyBjcmVhdGUgYSBzdGFiIHN0cmluZwotCXNlY3Rpb24uCi0KLVNhdCBNYXIgMjggMjI6Mjg6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGVob3B0LmMgKGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50KTogTGlrZXdpc2UuCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQsIG9wZXJhbmQpOiBMaWtld2lzZS4KLQkqIGZyYWdzLmMgKGZyYWdfYWxpZ24pOiBMaWtld2lzZS4KLQkqIGdhc3AuYyAobGV2ZWxfMCwgY2hhbmdlX2Jhc2UsIGRvaW5zdHIpOiBMaWtld2lzZS4KLQkqIGhhc2guYyAoaGFzaF9hc2spOiBMaWtld2lzZS4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19wYWdlLCBjYWxjX2hleCwgcHJpbnRfbGluZXMpOiBMaWtld2lzZS4KLQkoZGVidWdnaW5nX3BzZXVkbyk6IExpa2V3aXNlLgotCSogbWFjcm8uYyAoZGVmaW5lX21hY3JvLCBjaGVja19tYWNybyk6IExpa2V3aXNlLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUsIHNfYWxpZ24sIHNfZmxvYXRfc3BhY2UpOiBMaWtld2lzZS4KLQkoaWdub3JlX3Jlc3Rfb2ZfbGluZSwgZmxvYXRfY29ucyk6IExpa2V3aXNlLgotCSogc3ltYm9scy5jIChkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSk6IExpa2V3aXNlLgotCSogd3JpdGUuYyAocmVjb3JkX2FsaWdubWVudCwgY3ZzX2ZyYWdfdG9fZmlsbCk6IExpa2V3aXNlLgotCShmaXh1cF9zZWdtZW50LCBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuKTogTGlrZXdpc2UuCi0JKG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoZ2VuX3RvX3dvcmRzKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYmVnaW4sIG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0JKHNwYXJjX2lwLCBwYXJzZV9rZXl3b3JkX2FyZywgc19jb21tb24pOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAob3V0cHV0X2JpZ19zbGViMTI4KTogSW5pdGlhbGl6ZSBsb2NhbHMgdG8gYXZvaWQKLQl3YXJuaW5ncy4KLQkob3V0cHV0X2JpZ191bGViMTI4LCBlcXVhbHMpOiBMaWtld2lzZS4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBDaGFuZ2UgbnVtYmVyX29mX2RpZ2l0c18qIGxvY2FscwotCXRvIHVuc2lnbmVkIGludC4gIENoYW5nZSB6ZXJvcyB0byB1bnNpZ25lZCBpbnQuCi0JKiBjb25kLmMgKHNfaWYpOiBBZGQgcmV0dXJuIHRvIGRlZmF1bHQgY2FzZS4KLQkqIGZyYWdzLmMgKGZyYWdfbm93X2ZpeCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBhZGRyZXNzVC4KLQkqIGZyYWdzLmggKGZyYWdfbm93X2ZpeCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxpc3RpbmcuYyAoZmlsZV9pbmZvX3N0cnVjdCk6IENoYW5nZSBsaW5lbnVtIHRvIHVuc2lnbmVkIGludC4KLQkoc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgaGxsX2xpbmUgdG8gdW5zaWduZWQgaW50LgotCShwcmludF9zb3VyY2UpOiBVcGRhdGUgZm9ybWF0IHN0cmluZy4KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogQ2hhbmdlIHNjYW4gdG8gdW5zaWduZWQgaW50LCBhbmQgZG9uJ3QKLQlib3RoZXIgdG8gaW5pdGlhbGl6ZSBpdC4KLQkqIHN5bWJvbHMuYyAoZG9sbGFyX2xhYmVsX2NvdW50KTogQ2hhbmdlIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFJlbW92ZSB1bnVzZWQgbGFiZWwgcmVkdWNlX2ZpeHVwLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX21lbW9yeV9tb2RlbCk6IE9ubHkgZGVmaW5lIGlmIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogQWRkIHJldHVybiB0byBkZWZhdWx0IGNhc2UuCi0KLUZyaSBNYXIgMjcgMTI6NDY6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQ2hlY2sgbGVnYWwgYWRkcmVzc2luZyBtb2RlcyBmb3IKLSAJbWNmNTIwMCBqdXN0IGFzIHdlIGRvIGZvciBtNjgwMDAuCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogTGlrZXdpc2UuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMjcgMTA6MzA6MDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogIFN0b3JlIHJlbG9jYXRpb24gYWRkZW5kIGluCi0JZml4dXAgaW5zdGVhZCBvZiBpbnN0cnVjdGlvbi4KLQotVGh1IE1hciAyNiAyMzowNzoxOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogU3dhcCB0ZW1wbGF0ZSBhcmd1bWVudHMgdG8KLQlDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIG1hY3JvIGluIHJldmVyc2UgZGlyZWN0aW9uIHRlc3QuCi0JVGhpcyBtYWNybyBpcyBjdXJyZW50bHkgc3ltbWV0cmljLCBzbyBwYXNzaW5nIHRoZW0gdGhlIHdyb25nCi0Jd2F5IGRpZG4ndCBjYXVzZSBhbnkgcHJvYmxlbSwgYnV0IG1heSBpZiB0aGUgbWFjcm8gaXMgY2hhbmdlZAotCWluIHRoZSBmdXR1cmUuCi0JQWZ0ZXIgY29weWluZyB0ZW1wbGF0ZSB0byBpLnRtLCB1c2UgaS50bS4gcmF0aGVyIHRoYW4gdC0+IHRvCi0JYWNjZXNzIGZpZWxkcywgYW5kIG1ha2UgdCBhIGNvbnN0KgotCU1vdmUgaS50bS5vcGVyYW5kX3R5cGVzW10gc3dhcCB0byBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29weS4KLQotV2VkIE1hciAyNSAxMzo0NDoxOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBleHByLmggKGV4cHJfYnVpbGRfdWNvbnN0YW50KTogQWRkIHByb3RvdHlwZS4KLQkoZXhwcl9idWlsZF91bmFyeSxleHByX2J1aWxkX2JpbmFyeSk6IEFkZCBwcm90b3R5cGVzLgotCSogZXhwci5jIChleHByX2J1aWxkX3Vjb25zdGFudCk6IE5ldyBmdW5jdGlvbi4KLQkoZXhwcl9idWlsZF91bmFyeSxleHByX2J1aWxkX2JpbmFyeSk6IE5ldyBmdW5jdGlvbnMuCi0KLVdlZCBNYXIgMjUgMTM6MTA6NDIgMTk5OCAgQnJ1bm8gSGFpYmxlICA8YnJ1bm9AbGludWl4Lm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KLQotICAgICAgICAqIGdhc3AuYyAoSVMqKTogQ2FzdCBhcmd1bWVudCB0byB1bnNpZ25lZCBjaGFyLCBub3QgdW5zaWduZWQgaW50LgotICAgICAgICAqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogSW5jcmVhc2UgYnVmZmVyIHNpemUuCi0gICAgICAgICogbWVzc2FnZXMuYyAoYXNfd2Fybik6IExpa2V3aXNlLgotCShhc193YXJuX3doZXJlLCBhc19iYWQsIGFzX2JhZF93aGVyZSk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDI1IDEyOjU5OjA3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSAgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUuCi0JKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIE1hciAyNCAxNjo1MToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5oIChtZF9jbGVhbnVwLCBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IENhbGwKLQltMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rLgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogTmV3IGZ1bmN0aW9uIHRvCi0JZW1pdCBhIG5vcCBpZiBhIHNlY3Rpb24gZW5kcyB3aXRoIGEgMTYgYml0IGluc3RydWN0aW9uLgotCi1UdWUgTWFyIDI0IDE5OjQ4OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2Jzcyk6IENvbXBpbGUgdW5jb25kaXRpb25hbGx5LiAgQ2FsbAotCXNfbGNvbW0gcmF0aGVyIHRoYW4gb2JqX2NvZmZfbGNvbW0uCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBDb21waWxlIC5ic3MgcHNldWRvLW9wIHVuY29uZGl0aW9uYWxseS4KLQotVHVlIE1hciAyNCAxODozMDo1OCAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKExpbmVhckFkZHJlc3MpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IElmIExpbmVhckFkZHJlc3MgaXMgc2V0IGZvciB0aGUKLQlpbnN0cnVjdGlvbiwgZG9uJ3QgdXNlIGEgZGVmYXVsdCBzZWdtZW50LgotCi1Nb24gTWFyIDIzIDE4OjUzOjQwIDE5OTggIEpvZWwgU2hlcnJpbGwgIDxqb2VsQE9BUmNvcnAuY29tPgotCi0JKiBjb25maWd1cmUuaW46IChzaCotKi1ydGVtcyopOiBTd2l0Y2hlZCBmcm9tIEVMRiB0byBDT0ZGLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDIwIDE5OjE1OjQ0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVRodSBNYXIgMTkgMTY6MDM6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogZml4IGNvZGUgdG8gdGVzdCB0aGUgcmFuZ2Ugb2YKLQlQQyByZWxhdGl2ZSBicmFuY2hlcy4gIFBhdGNoIGNvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbi4gCi0KLQkKLVdlZCBNYXIgMTggMDk6Mjk6NTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHRodW1iLXBlIHRhcmdldC4KLQotCSogY29uZmlndXJlIChlbXVsYXRpb25zKTogQWRkIHRodW1iLXBlIHRhcmdldC4KLQotMTk5OC0wMy0xNyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGl0YmwtbGV4LmwgKHl5d3JhcCk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQgYXMgYQotCW1hY3JvLgotCi1GcmkgTWFyIDEzIDE2OjMxOjM4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogZGVwZW5kLmMgKHF1b3RlX3N0cmluZ19mb3JfbWFrZSk6IE5ldyBmdW5jdGlvbi4KLQkod3JhcF9vdXRwdXQpOiBVc2UgaXQuCi0KLVRodSBNYXIgMTIgMTg6Mjg6MjIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogU2V0IGJzcyBmbGFnIGluIHNlZ19pbmZvCi0Jc3RydWN0dXJlIGlmIHR5cGUgaXMgU0hUX05PQklUUy4gIFtCdWcgZml4IGNvdXJ0ZXN5IG9mIHJ0aF0KLQotU2F0IEZlYiAyOCAxNzoyODo1NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvcnRvcHRzLCBtZF9sb25nb3B0cywgbWRfcGFyc2Vfb3B0aW9uKToKLQlSZWNvZ25pemUgLUdOIGFuZCAtcmVsYXguCi0JKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSBncCBzaXplIGZyb20gLUcgc3dpdGNoLgotCShhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogQWx3YXlzIGZvcmNlIGlmIC1yZWxheC4KLQkoYWxwaGFfYWxpZ24pOiBUYWtlIGEgbmV3IGFyZ3VtZW50IHRoYXQgd2lsbCBzcGVjaWZ5IHdoZW4gdG8gCi0JZW1pdCBhbiBSX0FMUEhBX0FMSUdOIHJlbG9jYXRpb24gKHRob3VnaCB3ZSBkb24ndCBkbyB0aGF0IG5vdykuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLiAgRW1pdCBub3AgYWxpZ25tZW50IHBhZGRpbmcgYXMgbm9wK3Vub3AgcGFpci4KLQotU2F0IEZlYiAyOCAxNzowNjoyMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIFtUQ19BTFBIQV06IEluY2x1ZGUgPGVsZi9hbHBoYS5oPi4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IE5ldy4KLQotVGh1IEZlYiAyNiAxNTo0OTowNCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAod3JpdGVfMl9zaG9ydCk6IERlbGF5ZWQganNyIGluc3RydWN0aW9ucyBkb24ndAotCXJlcXVpcmUgcGFkZGluZyB0byB0aGUgbmV4dCBsb25nIHdvcmQgYm91bmRhcnkuCi0KLU1vbiBGZWIgMjMgMTE6Mjk6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYzogI2luY2x1ZGUgc3ltY2F0LmguCi0JKiBjb25maWcvdGMtbTMyci5jOiBMaWtld2lzZS4KLQotTW9uIEZlYiAyMyAxMDoyNzo0MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIGNhc2UgJ1AnKTogTWFrZSAnUCcgYXJndW1lbnRzIGJlCi0JYWJzb2x1dGUgZXhwcmVzc2lvbnMgaW5zdGVhZCBvZiAnJCcgcHJlZml4ZWQgcmVnaXN0ZXIgbmFtZXMuCi0KLVNhdCBGZWIgMjEgMjI6MzY6NTIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX3NldCk6IFJlY29yZCBmaWxlIGFuZCBsaW5lIGluZm8gZm9yIHN5bWJvbHMgd2hlbiAtYXMuCi0JKHBzZXVkb19zZXQpOiBEb24ndCBvdmVyd3JpdGUgdGhhdCBkdW1teSBmcmFnbWVudC4KLQotRnJpIEZlYiAyMCAxNTowMzoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJzZWN0aW9uIi4KLQkocHBjX25hbWVkX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1UaHUgRmViIDE5IDIyOjI1OjQyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLXBwYy5jIChwcGNfYmllaSk6IENhY2hlIHRoZSBsYXN0IHN5bWJvbCB3ZSBpbnNlcnRlZAotCXNvIHdlIGRvbid0IGhhdmUgdG8gc2NhbiB0aGUgZW50aXJlIGxpc3QuCi0KLVR1ZSBGZWIgMTcgMTc6MDI6MTUgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogRm9yIHRoZSBleHBsaWNpdGx5IHBhcmFsbGVsCi0gCWNhc2UsIGFsbG93IHRoZSBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgdG8gbW9kaWZ5IHRoZSBzYW1lIGZsYWcKLSAJYml0cy4KLQotVGh1IEZlYiAxOSAxNjowODoxNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogQ2F0ZWdvcml6ZSBzeW1ib2xzIGJ5Ci0JdW5kZWZpbmVkX3NlY3Rpb24gcmF0aGVyIHRoYW4gc3lfZnJhZy0+bGluZSA9PSBOVUxMLgotCi1XZWQgRmViIDE4IDIzOjM5OjQ2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBJbnN0YWxsIHByb3Blcmx5IHdoZW4gbG4KLQlmYWlscyBvciB0b29sZGlyID09IHByZWZpeC4KLQotVHVlIEZlYiAxNyAxODo1ODo1MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEZWxldGUgY2FsbCB0byB2YWxpZGF0ZV9vcGVyYW5kLgotCVRlc3QgcmVzdWx0IG9mIGluc2VydF9vcGVyYW5kIGZvciBlcnJvci4KLQotRnJpIEZlYiAxMyAxNjo0MTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogQWRkIGN5Z251cy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCSogZG9jL01ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgRmViIDEzIDAwOjQ3OjQ0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBIYW5kbGUgb3BlcmFuZCB0eXBlICdDJy4KLQkobWFjcm8pOiBGaXggaGFuZGxpbmcgb2YgTV9DT1BbMC0zXS4KLQotVGh1IEZlYiAxMiAxNDowNjo1OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gUm9zcyBIYXJ2ZXkgPHJvc3NAdGVyYWZsb3AuY29tPjoKLQkqIG1hY3JvLmMgKElTU0VQKTogT25seSB0cmVhdCAnPCcgYW5kICc+JyBhcyBzZXBhcmF0b3IgY2hhcmFjdGVycwotCWlmIG1hY3JvX2FsdGVybmF0ZSBvciBtYWNyb19tcmkuCi0JKGdldHN0cmluZyk6IFJlbW92ZSBzdXBwb3J0IGZvciBieXRlIGNvbnN0YW50cyBiZXR3ZWVuIDwgYW5kID4uCi0JKGdldF9hbnlfc3RyaW5nKTogJzwnIG9ubHkgc3RhcnRzIGEgc3RyaW5nIGlmIG1hY3JvX2FsdGVybmF0ZSBvcgotCW1hY3JvX21yaS4KLQkobWFjcm9fZXhwYW5kX2JvZHkpOiBQZXJtaXQga2V5d29yZCBwYXJhbWV0ZXJzIGZvbGxvd2luZwotCXBvc2l0aW9uYWwgcGFyYW1ldGVycy4KLQotCU5ldEJTRCBwYXRjaGVzIGZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogY29uZmlndXJlLmluIChhbHBoYSotKi1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy90ZS1uYnNkLmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYXMuaCAoZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCk6IE1vdmUgZnJvbSBoZXJlLi4uCi0JKiBjb25maWcvdGMtZDEwdi5jIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogLi4udG8KLQloZXJlLCBhbmQgbWFrZSBzdGF0aWMuCi0KLQkqIGVob3B0LmMgKGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50KTogT25seSB1c2Ugc2VnX2luZm8gaWYKLQlCRkRfQVNTRU1CTEVSIG9yIE1BTllfU0VHTUVOVFMuCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBVcGRhdGUgYnVnLWdudS11dGlscyBhZGRyZXNzLgotCSogZ2FzcC5jIChzaG93X3VzYWdlKTogTGlrZXdpc2UuCi0JKiBkb2MvYXMudGV4aW5mbyAoQnVnIFJlcG9ydGluZyk6IExpa2V3aXNlLgotCi1XZWQgRmViIDExIDIzOjI2OjI4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfYWRkcmVzcyk6IERvbid0IHVzZSBtaXBzIElJSSBvciBtaXBzIElWCi0JaW5zbnMgcmVnYXJkbGVzcyBvZiB0aGUgc2l6ZSBvZiBhIHBvaW50ZXIgaWYgd2UncmUgaW4gbWlwcyBJIG9yCi0JTUlQUyBJSSBtb2RlLgotICAgICAgICAobWFjcm8sIG1hY3JvMiwgc19jcHJlc3RvcmUsIHNfY3BhZGQpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxMiAwMzo0MTowMCAxOTk4ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi1GaXggcmFjIHRvIGFjY2VwdCBvbmx5IGEwOgotCSogdGMtZDEwdi5jIChwYXJhbGxlbF9vaywgZmluZF9vcGNvZGUpOgotCVNwbGl0IE9QRVJBTkRfQUNDIGludG8gT1BFUkFORF9BQ0MwIGFuZCBPUEVSQU5EX0FDQzEuCi0JSW50cm9kdWNlIE9QRVJBTkRfR1BSLgotCi1XZWQgRmViIDExIDE2OjI4OjEzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19maWxsKTogSGFuZGxlIG5vbi1jb25zdGFudCByZXBlYXQgY291bnRzIGJ5IGNyZWF0aW5nCi0JYW4gcnNfc3BhY2UgZnJhZ21lbnQuCi0KLVR1ZSBGZWIgMTAgMTg6MzE6MzEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBDaGFuZ2UgZXJyb3IgYWRkZWQgSmFuIDIgMTk5OAotCWZyb20gYXNfYmFkIHRvIGFzX3dhcm4uCi0KLVR1ZSBGZWIgMTAgMTg6MDQ6MDAgMTk5OCAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGFzLmM6IChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBVc2UgW1RFWFR8REFUQXxCU1NdX1NFQ1RJT05fTkFNRQotCSogYXMuaDogRGVmaW5lIGRlZmF1bHQgdmFsdWVzIG9mIFtURVhUfERBVEF8QlNTXV9TRUNUSU9OX05BTUUKLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9iZWdpbik6IFVzZSBbVEVYVHxEQVRBfEJTU11fU0VDVElPTl9OQU1FCi0KLVR1ZSBGZWIgMTAgMTc6NTg6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlaG9wdC5jIChlaF9mcmFtZV9jb2RlX2FsaWdubWVudCk6IElmIG5vdCBCRkRfQVNTRU1CTEVSLCB1c2UKLQlzZWdfZml4X3JvdFAgcmF0aGVyIHRoYW4gZml4X3Jvb3QgZnJvbSBzZWdfaW5mby4KLQotVHVlIEZlYiAxMCAxNTozMjoyMiAxOTk4ICBJYW4gQ2FybWljaGFlbCAgPGlhbmNhcm1AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jOiBBZGQgc3VwcG9ydCBmb3IgMHgxXzJfM180IGJpZ251bXMuCi0KLVR1ZSBGZWIgMTAgMTQ6NDM6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtbGludXgqIHRvIC1saW51eC1nbnUqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBUcmVhdCBcciBhcyB3aGl0ZXNwYWNlLgotCi1Nb24gRmViICA5IDE0OjE2OjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU2F0IEZlYiAgNyAxNTozMzo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1GcmkgRmViICA2IDE2OjA4OjMwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogSWYgbWlwc19jcHUgaXMgc2V0LCB0aGVuIHVzZSBpdCBhcwotICAgICAgICB0aGUgYXJndW1lbnQgdG8gYmZkX3NldF9hcmNoX21hY2guCi0gICAgICAgIChsb2FkX2FkZHJlc3MpOiBVc2UgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyB0byBkZXRlcm1pbmUgdGhlCi0gICAgICAgIGJpdCBzaXplIG9mIGFuIGFkZHJlc3MgaW5zdGVhZCBvZiBsb29raW5nIGF0IHRoZSBpc2EgbGV2ZWwuCi0gICAgICAgIChtYWNybywgbWFjcm8yLCBzX2NwcmVzdG9yZSwgc19jcGFkZCk6IExpa2V3aXNlLgotCi1GcmkgRmViICA2IDE0OjQ0OjM0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCAtbXY4NTBhbnkgY29tbWFuZCBsaW5lIG9wdGlvbi4KLQotVGh1IEZlYiAgNSAxMjozOTowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVob3B0LmM6IE5ldyBmaWxlLgotCSogYXMuaCAoZW51bSBfcmVsYXhfc3RhdGUpOiBBZGQgcnNfY2ZhLgotCShjaGVja19laF9mcmFtZSwgZWhfZnJhbWVfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBEZWNsYXJlLgotCShlaF9mcmFtZV9yZWxheF9mcmFnLCBlaF9mcmFtZV9jb252ZXJ0X2ZyYWcpOiBEZWNsYXJlLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBDYWxsIGNoZWNrX2VoX2ZyYW1lLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IEhhbmRsZSByc19jZmEuCi0JKHJlbGF4X3NlZ21lbnQpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEdBU19DRklMRVMpOiBBZGQgZWhvcHQuYy4KLQkoR0VORVJJQ19PQkpTKTogQWRkIGVob3B0Lm8uCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKEZyYWdzKTogRG9jdW1lbnQgcnNfY2ZhLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiAtLXRyYWRpdGlvbmFsLWZvcm1hdC4KLQkocGFyc2VfYXJncyk6IEFjY2VwdCAtLXRyYWRpdGlvbmFsLWZvcm1hdC4KLQkqIGFzLmggKGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0KTogRGVjbGFyZS4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IElmIGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0LAotCXNldCBCRkRfVFJBRElUSU9OQUxfRk9STUFUIG9uIHN0ZG91dHB1dC4KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMuMTogRG9jdW1lbnQgLS10cmFkaXRpb25hbC1mb3JtYXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogTWFrZSBzdXJlIHRoYXQgaWYgd2UgaGF2ZSBhCi0JZml4dXAgZm9yIGFuIHVubWF0Y2hlZCAlaGkgcmVsb2MsIGl0IGRvZXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhCi0JdmFyaWFudCBmcmFnLgotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBkb2MvTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi1XZWQgRmViICA0IDE1OjQxOjU0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGNoZWNrX2Zvcl9zaWRlX2VmZmVjdHMpOiBOZXcgZnVuY3Rpb24uCi0JKGNhbl9tYWtlX3BhcmFsbGVsKTogQWRkIGNoZWNrcyBmb3IgaW5zdHJ1Y3Rpb24gc2lkZSBlZmZlY3RzCi0JY2xhc2hpbmcgd2l0aCB0aGUgb3RoZXIgaW5zdHJ1Y3Rpb24uCi0JKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBJbXByb3ZlIHdhcm5pbmcgbWVzc2FnZXMuICBSZXR1cm4gZXJyb3IKLQltZXNzYWdlIGZyb20gbm9uLXN3YXBwZWQgaW5zdHJ1Y3Rpb24gb3JkZXIuCi0KLVdlZCBGZWIgIDQgMjA6MDA6MjYgMTk5OCAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAdGVrbmVtYS5kZW1vbi5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jOiBSZW5hbWUgYXJtX2FmdGVyX3Bhc3NfaG9vaygpIHRvIGFybV9jbGVhbnVwKCkuCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogUmVwbGFjZSBtZF9hZnRlcl9wYXNzX2hvb2sgZGVmaW5pdGlvbiB3aXRoIGEKLSAJbWRfY2xlYW51cCBkZWZpbml0aW9uLiAgVGhpcyBtb3ZlcyB0aGUgZm9yY2VkIGxpdGVyYWwgb3V0cHV0IHRvCi0gCXRoZSBlbmQgb2YgdGhlIHNvdXJjZSBwYXNzLCBhbmQgYXZvaWRzIG1hY3JvJ3MgaW5zZXJ0aW5nIGxpdGVyYWxzCi0gCWludG8gdGhlIGNvZGUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1hY3JvIGV4cGFuc2lvbi4KLQotV2VkIEZlYiAgNCAxMzoxNzoxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSkgW09CSl9FTEZdOiBBIHJlbG9jIGFnYWluc3QKLQlhIGdhcyBpbnRlcm5hbCBzeW1ib2wgaXMgYWRqdXN0YWJsZS4KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBMaWtld2lzZS4KLQotCSogYXMuaDogSWYgZ2NjIHZlcnNpb24gZ3JlYXRlciB0aGFuIDIuNiwgdXNlIGBfX2Zvcm1hdF9fJyBhbmQKLQlgX19wcmludGZfXycgaW4gZnVuY3Rpb24gYXR0cmlidXRlcywgcmF0aGVyIHRoYW4gYGZvcm1hdCcgYW5kCi0JYHByaW50ZicuCi0KLU1vbiBGZWIgIDIgMTg6Mzg6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYzogT25seSBpbmNsdWRlIGVsZi9zcGFyYy5oIGlmIE9CSl9FTEYuCi0KLU1vbiBGZWIgIDIgMTg6MzA6MzQgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCUFkZCB0bXMzMjBjMzAgc3VwcG9ydDoKLQkqIGNvbmZpZy90Yy10aWMzMC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy10aWMzMC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBJZiBUQ19USUMzMCwgaW5jbHVkZSBjb2ZmL3RpYzMwLmggYW5kIGRlZmluZQotCVRBUkdFVF9GT1JNQVQgYXMgImNvZmYtdGljMzAiLgotCSogY29uZmlndXJlLmluICh0aWMzMC0qLSphb3V0KiwgdGljMzAtKi0qY29mZiopOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ1BVX1RZUEVTKTogQWRkIHRpYzMwLgotCShDUFVfT0JKX1ZBTElEKTogdGljMzAtYW91dCBpcyB2YWxpZC4KLQkoVEFSR0VUX0NQVV9DRklMRVMpOiBBZGQgY29uZmlnL3RjLXRpYzMwLmMuCi0JKFRBUkdFVF9DUFVfSEZJTEVTKTogQWRkIGNvbmZpZy90Yy10aWMzMC5oLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEZlYiAgMiAxMDoyMDozNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEltcHJvdmVtZW50cyB0byBlcnJvciBtZXNzYWdlcy4KLQotTW9uIEZlYiAgMiAxMjozOTowNSAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGFuZ2UgQkZEX1JFTE9DX0hJMTYgYW5kCi0gCUJGRF9SRUxPQ19ISTE2X1MgdG8gc3RvcmUgdGhlIGhpZ2ggYml0cyBvZiBhbnkgdmFsdWUuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBVbmRvIGNoYW5nZSBvZiBGcmkgSnVuIDI3LgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEb24ndCBsZXQgdGhlCi0JYXNzZW1ibGVyIGNhbGN1bGF0ZSByZWxvY2F0aW9ucyB0byBhbnkgZXh0ZXJuYWwgc3ltYm9sIGF0IGFsbC4KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4MykgW09CSl9FTEZdOiBDb3JyZWN0IGJ1Z3MKLQlpbnZvbHZpbmcgZ2VuZXJhdGlvbiBvZiBwYy1yZWxhdGl2ZSByZWxvY3MuCi0JKG1kX3BjcmVsX2Zyb21fc2VjdGlvbikgW09CSl9FTEZdOiBUaGUgam9iIHRoaXMgY29kZSB1c2VkIHRvIGRvCi0JaGFzIGJlZW4gbW92ZWQgdG8gbWRfYXBwbHlfZml4My4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogRml4IHRlc3QgZm9yIHRvby1mYXIgYnJhbmNoLgotCShwcGNfZWxmX3N1ZmZpeCk6IFdhcm4gYWJvdXQgJ2lkZW50aWZpZXIrY29uc3RhbnRAZ290JyBzeW50YXgsCi0Jd2hpY2ggYWN0dWFsbHkgbWVhbnMgKHRoZSBhZGRyZXNzIG9mIGlkZW50aWZpZXIncyBHT1QgZW50cnkpICsKLQljb25zdGFudCwgd2hpY2ggaXMgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwuCi0KLUZyaSBKYW4gMzAgMTE6MDI6MzUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChpbmNsdWRlX2RpcnMpOiBEZWNsYXJlLgotCShpbmNsdWRlX2Rpcl9jb3VudCxpbmNsdWRlX2Rpcl9tYXhsZW4pOiBEZWNsYXJlLgotCi1GcmkgSmFuIDMwIDExOjQ3OjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDb3JyZWN0IGNoZWNrIGZvciBzaGFyZWQgb3Bjb2RlcyBsaWJyYXJ5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBsaXN0aW5nLmMgKGJ1ZmZlcl9saW5lKTogSWYgd2UgY2FuJ3Qgb3BlbiB0aGUgZmlsZSwgc2V0IGF0X2VuZC4KLQkobGlzdGluZ19wcmludCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgZmkuCi0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKHJlZ2xpc3RwYWlyKTogSGFuZGxlIHJlZ2lzdGVyIGxpc3QgaW4KLQllaXRoZXIgb3JkZXIuCi0KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBEb24ndCB1bmRlZiBWRVJTSU9OLgotCi1UaHUgSmFuIDI5IDE0OjQyOjQ0IDE5OTggIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBNYWtlZmlsZS5hbSAoQ09ORklHX09CSlMpOiBOZXcgdmFyaWFibGUsIGNvbnRhaW5pbmcgcGFydCBvZiBvbGQKLQlPQkpTIHZhcmlhYmxlLgotCShHRU5FUklDX09CSlMpOiBOZXcgdmFyaWFibGUsIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG9sZCBPQkpTCi0JdmFyaWFibGUuCi0JKE9CSlMpOiBOb3cganVzdCAkKENPTkZJR19PQkpTKSBhbmQgJChHRU5FUklDX09CSlMpLgotCSgkKHNyY2RpcikvbWFrZS1nYXMuY29tKTogUmVuYW1lIGZyb20gbWFrZS1nYXMuY29tLgotCShzdGFtcC1tay5jb20pOiBSZXBsYWNlICQoT0JKUykgd2l0aCAkKEdFTkVSSUNfT0JKUykuCi0JKEVYVFJBX0RJU1QpOiBEZWZpbmUuCi0JKiB2bXNjb25mLnNoOiBIYW5kbGUge3RhcmctY3B1LCBvYmotZm9ybWF0LCBhdG9mLXRhcmd9IG1vZHVsZXMKLQlleHBsaWNpdGx5IHJhdGhlciB0aGFuIHZpYSB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMuCi0JKGdjYy1hcy5vcHQpOiBOZXcgZmlsZSBjcmVhdGVkIHdoZW4gbWFrZS1nYXMuY29tIGlzIHJ1bi4KLQkqIGNvbmZpZy1nYXMuY29tOiBDcmVhdGUge3RhcmctY3B1LmgsIG9iai1mb3JtYXQuaCwgdGFyZy1lbnYuaCwKLQlpdGJsLWNwdS5ofSB0byAjaW5jbHVkZSBhcHByb3ByaWF0ZSBmaWxlIHJhdGhlciB0aGFuIGNvcHlpbmcgdGhhdAotCWZpbGUuCi0JKiBjb25maWcvdm1zLWNvbmYuaDogU3luY2hyb25pemUgd2l0aCBjdXJyZW50IGNvbmZpZy5pbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgSmFuIDI5IDE4OjQ4OjE5IDE5OTggIEJpbGwgTW95ZXIgIDxiaWxsbUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFkZGVkIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbC4KLQkocGFyYWxsZWxfb2spOiBSZWxheGVkIHBhcmFsbGVsIHN1Ymluc3RydWN0aW9uIGRlcGVuZGVuY3kgY2hlY2suCi0KLVdlZCBKYW4gMjggMTQ6MzU6MDAgMTk5OCAgQmlsbCBNb3llciA8YmlsbG1AY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCk6IGFkZGVkIG5ldyBmbGFnLgotCSogdGMtZDEwdi5jIChtZF9wYXJzZV9vcHRpb24sbWRfbG9uZ29wdHMpOiBhZGRlZCAiLS1ub3dhcm5zd2FwIiAKLQljb21tYW5kIGxpbmUgYXJndW1lbnQuCi0JKiB0Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBlbWl0ICJTd2FwcGluZyBpbnN0cnVjdGlvbnMiCi0Jd2FybmluZyBvbmx5IGlmIGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXAgaXMgZmFsc2UuCi0KLVdlZCBKYW4gMjggMTY6NDE6MTkgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW1pbmd3MzIqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAyOCAxNDo1MToxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBEb24ndCBzZXQgdGhlIHNlZ21lbnQgaWYgaXQKLQloYXNuJ3QgY2hhbmdlZCwgYW5kIHRoaXMgaXMgT0JKX0FPVVQgd2l0aG91dCBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19MT0NBTCk6IENvcnJlY3QgdHlwby0tcGFzcyBhcmd1bWVudCB0bwotCVNfR0VUX1NFR01FTlQuCi0KLVdlZCBKYW4gMjggMTM6NTQ6NTAgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQlhcy5oICh1bmxpbmspOiBSZXZlcnNlIDEzLUZlYi05NyBjaGFuZ2U7IHVzZSBvZiB1bmxpbmsgdnMgcmVtb3ZlCi0JZGVwZW5kcyB1cG9uIEhBVkVfe1VOTElOSyxSRU1PVkV9IHZhbHVlcyByYXRoZXIgdGhhbiBob3N0Ci0JY29tcGlsZXIuCi0KLVdlZCBKYW4gMjggMTM6NDg6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKTogRGVmaW5lLgotCi1XZWQgSmFuIDI4IDA5OjUyOjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBEaXNwbGF5IGluc3RydWN0aW9uIHdoZW4KLQlhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KLQotVHVlIEphbiAyNyAxMzozMjowMSAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXNjbzMuMnY1Kik6IERlZmF1bHRzIHRvIEVMRiBub3cuCi0JKGkzODYtKi1zY28zLjJ2NSpjb2ZmKTogTmV3IHRhcmdldC4KLQkoaTM4Ni0qLXNjbzMuMiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgSmFuIDI3IDExOjA2OjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFRpZHkgZXJyb3IgbWVzc2FnZSBwcm9kdWN0aW9uLgotCi1UdWUgSmFuIDI3IDEyOjI0OjMyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogQWRkIG5ldyB2YXJpYWJsZSBuZXdpbW0gdG8gaG9sZAotCXZhbGlkYXRlX2ltbWVkaWF0ZSByZXR1cm4gdmFsdWUgaW4gdGhlIHJpZ2h0IHR5cGUgZm9yIGNvbXBhcmlzb25zCi0JdG8gRkFJTC4KLQotVHVlIEphbiAyNyAwNjo1MTo1OSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKE1BWF9CWVRFUyk6IFVzZSBsaXN0aW5nIHZhcmlhYmxlcyBub3QgY29uc3RhbnRzLgotCShkYXRhX2J1ZmZlcik6IE5vIGxvbmdlciBhbiBhcnJheSwgYnV0IGEgcG9pbnRlci4KLQkoY2FsY19oZXgpOiBzaXplb2YoZGF0YV9idWZmZXIpIC0+IE1BWF9CWVRFUy4KLQkobGlzdGluZ19saXN0aW5nKTogQWxsb2NhdGUgZGF0YV9idWZmZXIuCi0KLVR1ZSBKYW4gMjcgMDY6Mzg6MzUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IEFkZCAtLWxpc3RpbmctbGhzLXdpZHRoLCAtLWxpc3RpbmctbGhzLXdpZHRoMiwKLQktLWxpc3RpbmctcmhzLXdpZHRoLCAtLWxpc3RpbmctY29udC1saW5lcy4KLQkoc2hvd191c2FnZSk6IFVwZGF0ZS4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19saHNfd2lkdGgsIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCk6IE5ldyB2YXJzLgotCShsaXN0aW5nX2xoc19jb250X2xpbmVzLCBsaXN0aW5nX3Joc193aWR0aCk6IE5ldyB2YXJzLgotCShwcmludF9saW5lcyk6IFVzZSB0aGUgdmFyaWFibGVzIGluc3RlYWQgb2YgdGhlIGNvbnN0YW50cy4KLQkobGlzdGluZ19saXN0aW5nKTogTGlrZXdpc2UuCQotCSogbGlzdGluZy5oOiBEZWNsYXJlIHRoZSBuZXcgdmFycy4KLQkKLVR1ZSBKYW4gMjcgMDU6MzI6MDUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IEFkZCAtLWtlZXAtbG9jYWxzIGFsaWFzIGZvciAtTC4KLQlBZGQgLS1zdHJpcC1sb2NhbC1hYnNvbHV0ZS4KLQkoc2hvd191c2FnZSk6IFVwZGF0ZS4KLQkqIGFzLmggKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUpOiBOZXcgZmxhZy4KLQkqIHN5bWJvbHMuYyAoU19JU19MT0NBTCk6IFVzZSBpdC4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KLQotTW9uIEphbiAyNiAxMzowNzo0MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jOiBEZXRlY3QgaWYgZXhwbGljaXRseSBwYXJhbGxlbCBpbnN0cnVjdGlvbnMKLQltaWdodCBoYXZlIGFuIGlvIGNvbmZsaWN0IGFuZCBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZS4gCi0KLVRodSBKYW4gMjIgMTc6NTE6NDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX3NhdmVfZml4dXBzLCBjZ2VuX3Jlc3RvcmVfZml4dXBzLAotCWNnZW5fc3dhcF9maXh1cHMpOiBGdW5jdGlvbnMgdG8gc2F2ZSwgcmVzdG9yZSBhbmQgc3dhcCB0aGUgZml4dXAKLQljaGFpbiB3aXRoIGEgYmFja3VwIGNvcHkuCi0JKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogUmV0dXJucyBhZGRyZXNzIG9mIGNvbnN0cnVjdGVkIGluc24uCi0KLVdlZCBKYW4gMjEgMTY6NDk6MTAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChmaWxlX2luZm9fc3RydWN0KTogUmVtb3ZlIEZJTEUsIGFkZCBQT1MuCi0JKGxhc3Rfb3Blbl9maWxlX2luZm8sIGxhc3Rfb3Blbl9maWxlKTogTmV3OyBhIG9uZSBlbnRyeSBGSUxFKiBjYWNoZS4KLQkoZmlsZV9pbmZvKTogRG9uJ3Qgb3BlbiB0aGUgZmlsZS4KLQkoYnVmZmVyX2xpbmUpOiBDaGVjayBmb3IgdGhlIGZpbGUgaW4gdGhlIGxhc3Rfb3BlbiBjYWNoZSwgdXBkYXRpbmcKLQlhcyBuZWNlc3NhcnkuCi0JKHByaW50X3NvdXJjZSk6IERvbid0IHJlZmVyZW5jZSBmaWxlX2luZm8tPmZpbGUuCi0JKGxpc3RpbmdfbGlzdGluZyk6IExpa2V3aXNlLgotCShsaXN0aW5nX3ByaW50KTogQ2xvc2UgdGhlIGZpbGUgaW4gdGhlIGNhY2hlLCBpZiBhbnkuCi0KLUZyaSBKYW4gMTYgMTQ6NTE6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGR3YXJmX2ZpbGVfc3RyaW5nKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShlbWl0X2V4cHIpOiBMb29rIGZvciBjb25zdGFudCBzZXF1ZW5jZSB0aGF0IGxlYWRzIHVwIHRvIGEgZmlsZQotCW5hbWUgaW4gRFdBUkYgZGVidWdnaW5nIG91dHB1dC4KLQkoc3RyaW5nZXIpOiBVc2UgZHdhcmZfZmlsZV9zdHJpbmcgdG8gZGVjaWRlIHdoZXRoZXIgdG8gYWNjZXB0IGEKLQlzdHJpbmcgYXMgYSBmaWxlIG5hbWUuCi0KLUZyaSBKYW4gMTYgMTE6MzA6MzcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtbTY4ay5jIChtNjhrX2lwKTogUmVtb3ZlIGFic2wtPnJlZ2xzdCBNUkkgaGFjay4KLQkoY3JhY2tfb3BlcmFuZCk6IEFkZCByZWctPnJlZ2xzdCBNUkkgaGFjay4KLQkocl9zZWcpOiBQdXQgcmVnbHN0IHN5bWJvbHMgaW4gcmVnX3NlY3Rpb24uCi0JKG02OGtfZnJvYl9zeW1ib2wpOiBGcm9iIHJlZ2xzdCBzeW1ib2xzIGludG8gYWJzb2x1dGVfc2VjdGlvbi4KLQotVGh1IEphbiAxNSAxNDoxOTowMSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1zaC5jIChnZXRfc3BlY2lmaWMpOiBIYW5kbGUgU0dSICYgREJSLgotCi1UaHUgSmFuIDE1IDEzOjQ2OjQ4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWg4MzAwLmMgKHBhcnNlX3JlZyk6IFRha2UgdGhlIGxlbmd0aCBvZiB0aGUgc3ltYm9sIGludG8KLQlhY2NvdW50IHdoZW4gYXR0ZW1wdGluZyB0byBtYXRjaCBhIHJlZ2lzdGVyIG5hbWUuCi0JKiB0Yy1oODUwMC5jIChwYXJzZV9yZWcpOiBMaWtld2lzZS4KLQotV2VkIEphbiAxNCAxNzo1MjozMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmM6IEZvcm1hdHRpbmcgY2hhbmdlcyB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgotCi1XZWQgSmFuIDE0IDE1OjQxOjQxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBSZXdvcmsgZGl2aXNpb24gY29kZSB0byBhdm9pZCB1bmZpbGxlZAotCWRlbGF5IHNsb3QuCi0KLVdlZCBKYW4gMTQgMTg6MDQ6MjAgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSmltIFdpbHNvbgotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBSZW1vdmUgbm9uLWFuc2kgZGVmYXVsdCBjYXNlLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgY3Jvc3Mgc2VjdGlvbiBQQyByZWxhdGl2ZSByZWxvY3MKLQljb3JyZWN0bHkuCi0KLVdlZCBKYW4gMTQgMTU6MDI6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB0ZXN0IHBpbmZvIGZsYWdzIGlmIElOU05fTUFDUk8uCi0KLU1vbiBKYW4gMTIgMTM6MDQ6NTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYzogI2luY2x1ZGUgc2V0am1wLmguICBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgotCShleHByX2ptcF9idWYpOiBOZXcgc3RhdGljIGxvY2FsLgotCShjZ2VuX3BhcnNlX29wZXJhbmQpOiBBbGxvdyB1c2Ugb2YgbG9uZ2ptcCBpbiBwYXJzaW5nIHRvIGhhbmRsZSBlcnJvcnMuCi0JKGNnZW5fbWRfb3BlcmFuZCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRjLW0zMnIuYzogQ2xlYW4gdXAgcGFzcyBvdmVyIGBzdHJ1Y3QgZm9vJyB1c2FnZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBVc2UgQ0dFTl9JTlNOX01ORU1PTklDLgotCi1UdWUgSmFuICA2IDE1OjM2OjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoU19TRVRfU0VHTUVOVCk6IERvbid0IHNldCB0aGUgc2VnbWVudCBmb3Igc2VjdGlvbiBzeW1zLgotCShTX0lTX0VYVEVSTkFMLCBTX0lTX0xPQ0FMKTogQ29ycmVjdCBwYXJlbnRoZXRpY2F0aW9uLgotCi1GcmkgSmFuICAyIDE2OjA4OjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogR2l2ZSBhbiBlcnJvciBpZiB0aGVyZSBhcmUKLQl1bnJlY29nbml6ZWQgY2hhcmFjdGVycyBhZnRlciBhbiBleHByZXNzaW9uLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTk2OTcKZGlmZiAtLWdpdCBhL2dhcy9DaGFuZ2VMb2ctOTI5NSBiL2dhcy9DaGFuZ2VMb2ctOTI5NQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhNDhlNi4uMDAwMDAwMAotLS0gYS9nYXMvQ2hhbmdlTG9nLTkyOTUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzExMCArMCwwIEBACi1TYXQgRGVjIDMwIDIzOjQyOjUxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IFNpbXBsaWZ5LiAgQ29ycmVjdGx5IGhhbmRsZSBzeW0gKyBvZmZzZXQKLQlhZGRyZXNzZXMgZm9yIHN0YXRpYyB2YXJpYWJsZXMuCi0KLVRodSBEZWMgMjEgMTI6NTQ6MzIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1hcHBpbmcpOiBNYWtlIEBnb3QgZ2l2ZSBhIHJlYWwgR09UIHJlbG9jYXRpb24sCi0JYW5kIHhnb3QgZ2l2ZSB0aGUgb2xkIHRvYzE2IHJlbG9jYXRpb24uCi0JKG1kX2FwcGx5X2ZpeDMpOiBTdXBwb3J0IGFsbCBHT1QgcmVsb2NhdGlvbnMuCi0KLVdlZCBEZWMgMjAgMTQ6NTc6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBDb3JyZWN0bHkgaGFuZGxlIGEgY29uc3RhbnQgaW4KLQlTVlI0X1BJQyBjYXNlLiAgRnJvbSBSaWNoYXJkIEtlbm5lciA8a2VubmVyQHZsc2kxLnVsdHJhLm55dS5lZHU+LgotCi1GcmkgRGVjIDE1IDE0OjI1OjA3IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHBhcnNlX3JlZyk6IFJlY29nbml6ZSBTSDMgcmVnaXN0ZXJzLgotCShnZXRfc3BlY2lmaWMpOiBIYW5kbGUgQV9TU1IsIEFfU1BDIGFuZCBBX1JFR19CLgotCShidWlsZF9NYnl0ZXMpOiBIYW5kbGUgUkVHX0IuCi0KLUZyaSBEZWMgMTUgMTY6MDc6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9hdXgpOiBVc2UgbmV3IGJmZF9iaWdfZW5kaWFuIG1hY3JvLgotCi1GcmkgRGVjIDE1IDEyOjExOjQ4IDE5OTUgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogSWYgbGlua2luZywgZWRpdCBBTExfQ0ZMQUdTIHRvIENGTEFHUy4KLQotVGh1IERlYyAxNCAxNTowOTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFNldCB0aGUgc19hbGlnbiBmaWVsZCB0bwotCXRoZSBudW1iZXIgb2YgYnl0ZXMsIHJhdGhlciB0aGFuIHRvIHRoZSBwb3dlciBvZiAyLgotCi1UdWUgRGVjIDEyIDEyOjE5OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RDTEVBTl9IRVJFKTogTmV3IHZhcmlhYmxlLgotCShkaXN0Y2xlYW4pOiBVc2UgaXQuCi0JKG1haW50YWluZXItY2xlYW4pOiBEZXBlbmQgdXBvbiBjbGVhbi1oZXJlIHJhdGhlciB0aGFuIGNsZWFuLAotCWRpc3RjbGVhbiwgYW5kIGNsZWFuLWluZm8uICBSdW4gbWFrZSBtYWludGFpbmVyLWNsZWFuIGluIGRvYy4KLQlSZW1vdmUgZmlsZXMgbGlzdGVkIGluIERJU1RDTEVBTl9IRVJFLgotCSogZG9jL01ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6IFNwbGl0IG91dCBmcm9tCi0JZGlzdGNsZWFuLiAgRGVwZW5kIHVwb24gY2xlYW4taW5mbyBhbmQgZGlzdGNsZWFuLgotCi1Nb24gRGVjIDExIDE2OjIzOjUxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbWFjLWFzLnI6IEZpeCBjb3B5cmlnaHQgYW5kIHZlcnNpb24gc3RyaW5ncy4KLQkoY2ZyZyk6IFVzZSBQUk9HX05BTUUgaW5zdGVhZCBvZiBsaXRlcmFsIG5hbWUuCi0KLU1vbiBEZWMgMTEgMTQ6MTQ6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IElmIHRjX3VucmVjb2duaXplZF9saW5lIGlzIGRlZmluZWQsCi0JY2FsbCBpdC4KLQkqIGNvbmZpZy90Yy1hMjlrLmggKHRjX3VucmVjb2duaXplZF9saW5lKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWEyOWsuYyAoYTI5a191bnJlY29nbml6ZWRfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfb3BlcmFuZCk6IEhhbmRsZSBhMjlrIHN0eWxlIGxvY2FsIGRvbGxhciBsYWJlbHMuCi0KLVdlZCBEZWMgIDYgMTc6NTI6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLW11bHRpLmg6IElmIE9CSl9NQVlCRV9FTEYsIGRlZmluZSBPQkpfU1lNRklFTERfVFlQRS4KLQotVHVlIERlYyAgNSAxMzoyNjozNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2ZpbGwpOiBJZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpcyBkZWZpbmVkLCBjYWxsCi0JaXQuCi0KLU1vbiBEZWMgIDQgMTU6MTA6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzaXplX3NlY3Rpb24sIGZpbGxfc2VjdGlvbiwgZml4dXBfbWRlcHMpOgotCVRyZWF0IHJzX2FsaWduX2NvZGUgbGlrZSByc19hbGlnbi4KLQotU3VuIERlYyAgMyAxNjo0Njo1NCAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlKTogU2V0IHByZV9pbmMgd2hlbgotCWNvbnZlcnRpbmcgYW4gYWJzb2x1dGUgYWRkcmVzcyBpbnRvIGEgUEMtcmVsYXRpdmUgb25lLgotCi1GcmkgRGVjICAxIDExOjU3OjU2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogRG9uJ3QgYWx3YXlzIHVzZSB0ZS1nZW5lcmljLmggZm9yIGVtdWxhdGlvbi4KLQkocG93ZXJwYy1hcHBsZS1tYWNvcyk6IFVzZSBlbXVsYXRpb24gdGUtbWFjb3MuaC4KLQkqIG1wdy1tYWtlLnNlZCAoaW5zdGFsbCwgaW5zdGFsbC1vbmx5KTogRWRpdCBpbiBNYWMtc3BlY2lmaWMKLQlpbnN0YWxsIHByb2NlZHVyZS4KLQotRnJpIERlYyAgMSAxMDo1OToyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSW1wcm92ZSBtZXNzYWdlIGFib3V0IHVuc3VwcG9ydGVkIEVMRiB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogQ29ycmVjdCBjaGVjayBmb3Igd2hldGhlciBmaWxsCi0JcGF0dGVybiBpcyB6ZXJvLiAgRnJvbSBNYW5mcmVkIEhvbGxzdGVpbi4KLQotVGh1IE5vdiAzMCAxMzoyNTo0OSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcGVfc2VjdGlvbik6IFRvIGdldCB0aGUgYWxpZ25tZW50IHJpZ2h0IGZvcgotCXRoZSB2YXJpb3VzIGlkYXRhIHNlY3Rpb25zLCB3ZSBjaGVjayB0aGUgbmFtZSBvbiB0aGUgLnNlY3Rpb24gcHNldWRvLgotCi1UaHUgTm92IDMwIDExOjIzOjQyIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IElmIFRDX004OEsgaXMgZGVmaW5lZCwgZG8gbm90Ci0JYWRkIHNlY3Rpb24ncyBwYWRkciB0byBhZGRfbnVtYmVyOyBjb21wYXRpYmlsaXR5IHRvIG5hdGl2ZSBhcyBhbmQKLQlsZCBmb3JiaWRzLgotCi1XZWQgTm92IDI5IDIzOjE0OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFRyZWF0IG02OGstc3lzdjQgbGlrZSBtNjhrLWVsZiwgbm90IG02OGstc3lzdjMuCi0KLQkqIGhhc2guYyAoc3RydWN0IGhhc2hfZW50cnkpOiBNb3ZlZCBoZXJlLi4uCi0JKiBoYXNoLmggKHN0cnVjdCBoYXNoX2VudHJ5KTogLi4uZnJvbSBoZXJlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBEb24ndCBmcmVlIGFuZCBjbGVhciBzeV9vYmoKLQlpZiBpdCdzIGFscmVhZHkga25vd24gdG8gYmUgbnVsbC4KLQotV2VkIE5vdiAyOSAxMzowMDoyMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IERvbid0IGFkanVzdCB0aGUgdmFsdWUgZm9yIDMyCi0JYml0IHJlbG9jcyBjb252ZXJ0ZWQgdG8gUEMgcmVsYXRpdmUgcmVsb2NzLiAgVGhpcyB0dXJuZWQgb3V0IHRvCi0JYWRkIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIC50ZXh0IHR3aWNlLgotCi1UdWUgTm92IDI4IDEwOjQyOjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IEluICdzJyBjYXNlLCBmcmVlIHN0cmluZyBmcm9tCi0Jb2JzdGFjay4KLQotCSogY29uZmlnL29iai1lbGYuaCAoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTKTogUmVtb3ZlIHVudXNlZCBmaWVsZAotCXN5X25hbWVfb2Zmc2V0LgotCSogY29uZmlnL29iai1tdWx0aS5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpIFtPQkpfTUFZQkVfRUxGXToKLQlEaXR0by4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IE1ha2UgYml0ZmllbGRzIHVuc2lnbmVkLgotCi0JKiBleHByLmggKHN0cnVjdCBleHByZXNzaW9uUyk6IE1ha2UgWF9vcCBhbmQgWF91bnNpZ25lZCBiaXRmaWVsZHMsCi0JYW5kIG1vdmUgdGhlbSB0b2dldGhlci4gIE9uIG1vc3Qgc3lzdGVtcyB0aGlzIHdpbGwgcmVkdWNlIHRoZQotCXN0cnVjdHVyZSBzaXplIGJ5IG9uZSB3b3JkLgotCShvcGVyYXRvclQpOiBEZWZpbmUgT19tYXguCi0JKiBleHByLmMgKGV4cHJfYmVnaW4pOiBWZXJpZnkgdGhhdCBYX29wIGlzIHdpZGUgZW5vdWdoIHRvIGhvbGQKLQlPX21heC4KLQotCSogcmVhZC5jIChwb3BfaW5zZXJ0KTogUHJpbnQgZXJyb3IgcmV0dXJuZWQgYnkgaGFzaCB0YWJsZQotCWluc2VydGlvbiBjb2RlLgotCi0JKiBhcy5jIChkdW1wX3N0YXRpc3RpY3MpOiBTcGxpdCBvdXQgZnJvbSBtYWluOyBkdW1wIHNvbWUgaGFzaAotCXRhYmxlIHN0YXRzIGFuZCB0YXJnZXQtc3BlY2lmaWMgc3RhdHMuCi0JKHN0YXJ0X3RpbWUpOiBObyBsb25nZXIgYXV0b21hdGljIHRvIG1haW4uCi0JKG1haW4pOiBTZXQgZmlsZS1sZXZlbCBzdGFydF90aW1lIGFuZCBjYWxsIGR1bXBfc3RhdGlzdGljcyBhdAotCWV4aXQuICBFeGl0IGJ5IGNhbGxpbmcgeGV4aXQuCi0JKHNob3dfdXNhZ2UpOiBNYWtlIC0tc3RhdGlzdGljcyBkZXNjcmlwdGlvbiBsZXNzIHNwZWNpZmljLgotCSogc3Vic2Vncy5jIChzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiB3cml0ZS5jICh3cml0ZV9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCShuX2ZpeHVwcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGZpeF9uZXdfaW50ZXJuYWwpOiBJbmNyZW1lbnQgaXQuCi0JKiByZWFkLmMgKHJlYWRfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAocmVhZF9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIHN5bWJvbC5jIChzeW1ib2xfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkqIHN5bWJvbC5oIChzeW1ib2xfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBoYXNoLmMgKGhhc2hfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGhhc2guaCAoaGFzaF9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGkzODZfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKHRjX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgbWFjcm8uCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCwgYXNfYXNzZXJ0LCBhc19hYm9ydCk6IFVzZSB4ZXhpdCwgbm90Ci0JZXhpdC4KLQotCSogaGFzaC5jIChERUxFVEVEKTogUmV3cml0ZSB0byB1c2UgYSB2YWxpZCBidXQgdW5pcXVlIGFkZHJlc3MuCi0JKFNUQVJUX1BPV0VSKTogUmVkdWNlIHRvIDEwLgotCShlbnVtIHN0YXRfZW51bSk6IE5ldyBlbnVtZXJhdG9yLCByZXBsYWNpbmcgU1RBVF8qIGluZGV4IG1hY3Jvcy4KLQlBZGQgbmV3IHZhbHVlcyBmb3IgY291bnRpbmcgc3RyY21wIGNhbGxzLgotCShHUk9XX0ZBQ1RPUik6IE5ldyBtYWNyby4KLQkoaGFzaF9ncm93KTogVXNlIEdST1dfRkFDVE9SLiAgUmV3cml0ZSBmb3IgcXVpY2sgcmV0dXJucyBpbnN0ZWFkCi0Jb2YgbmVzdGluZyBibG9ja3MuCi0JKEZVTExfVkFMVUUpOiBOZXcgbWFjcm8uICBVc2UgMS80IG9mIHRhYmxlIHNpemUgaW5zdGVhZCBvZiAxLzIuCi0JKGhhc2hfbmV3KTogVXNlIEZVTExfVkFMVUUuCi0JKHN0cnVjdCBoYXNoX2NvbnRyb2wpOiBEZWZpbml0aW9uIG1vdmVkIGhlcmUuCi0JKGhhc2hfY29kZSk6IERvbid0IG1hc2sgdG8gbG93IGJpdHMuCi0JKGhhc2hfYXNrKTogTWFzayByZXR1cm5lZCBoYXNoIGNvZGUgaGVyZS4gIENoZWNrIGhhc2ggdmFsdWUgYmVmb3JlCi0JY2FsbGluZyBzdHJjbXA7IGNvdW50IHN0cmNtcCBjYWxscy4KLQkqIGhhc2guaCAoc3RydWN0IGhhc2hfY29udHJvbCk6IERlY2xhcmUsIGRvbid0IGRlZmluZSwgaGVyZS4KLQkoSEFTSF9TVEFUTEVOR1RIKTogRGVsZXRlZC4KLQkoc3RydWN0IGhhc2hfZW50cnkpOiBBZGQgZmllbGQgZm9yIGhhc2ggY29kZS4KLQkoaGFzaF9zYXksIGhhc2hfYXBwbHkpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBoYXNoLmMgKGRlc3Ryb3kpOiBSZXR1cm4gdm9pZC4KLQkoYXBwbGljYXRlZSk6IERpdHRvLgotCShtYWluKTogRml4IGRlY2xhcmF0aW9ucy4KLQkoaGFzaF9hcHBseSk6IFJldHVybiB2b2lkLiAgQXJndW1lbnQgYGZ1bmN0aW9uJyByZXR1cm5zIHZvaWQuICBQdXQKLQlpbnNpZGUgIiNpZmRlZiBURVNUIi4KLQkoaGFzaF9zYXkpOiBEZWZpbmUgb25seSBpZiBURVNUIGlzIGRlZmluZWQuCi0JKiBoYXNoLmggKGhhc2hfYXBwbHksIGhhc2hfc2F5KTogRGVjbGFyYXRpb25zIGRlbGV0ZWQuCi0KLU1vbiBOb3YgMjcgMTM6MTg6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjcuCi0KLVR1ZSBOb3YgMjEgMTg6Mzk6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChBQ19QUk9HX0NDKTogUmVtb3ZlIGxvY2FsIGRlZmluaXRpb24uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLU1vbiBOb3YgMjAgMTc6MjY6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19kZWJ1Z19uYW1lX3NlY3Rpb25fc2l6ZSk6IFJlbW92ZS4KLQkocHBjX3N0YWJ4KTogRG9uJ3QgaW5jcmVtZW50IHBwY19kZWJ1Z19uYW1lX3NlY3Rpb25fc2l6ZS4KLQkocHBjX2JjKTogTGlrZXdpc2UuCi0JKHBwY19mcm9iX2ZpbGUpOiBSZW1vdmUuCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2Zyb2JfZmlsZSk6IERvbid0IGRlZmluZS4KLQkocHBjX2Zyb2JfZmlsZSk6IERvbid0IGRlY2xhcmUuCi0KLU1vbiBOb3YgMjAgMTM6Mzc6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfYWxwaGEpOiBNZW50aW9uIGFscGhhLW9wY29kZS5oLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBJbmNsdWRlIG9uZS1vcGVyYW5kIHZhcmlhbnRzIG9mIGptcCBhbmQKLQlqc3IuCi0KLQkqIGNvbmZpZy90ZS1kZWx0ODguaDogUmVuYW1lZCBmcm9tIHRlLWRlbHRhODguaCwgdG8gYXZvaWQgY29uZmxpY3QKLQl3aXRoIHRlLWRlbHRhLmggaW4gOC4zIGZpbGUgc3lzdGVtcy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRqdXN0ZWQuCi0KLVRodSBOb3YgMTYgMTI6NDk6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2Vycik6IFJlbW92ZTsganVzdCB1c2UgdGhlIG9uZSBpbiByZWFkLmMuCi0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKHl5bGV4KTogSW4gTVJJIG1vZGUsICdAJyBjYW4gc3RhcnQgYW4gb2N0YWwKLQludW1iZXIuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBIYW5kbGUgTVJJIHN1ZmZpeGVzIGFmdGVyIHVuYWRvcm5lZCAwLgotCi1UaHUgTm92IDE2IDAwOjIxOjQ0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVmVyc2lvbiAyLjYgcmVsZWFzZWQuCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gMi42LgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDaGFuZ2UgdXNlIG9mIG1kX2RvX2FsaWduCi0JdG8gcGFzcyBhIHBvaW50ZXIgcmF0aGVyIHRoYW4gYSBmaWxsIHZhbHVlLCB0byBtYXRjaCBvdGhlciB1c2VzLgotCi1XZWQgTm92IDE1IDAzOjUyOjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoVENfRklYX1RZUEUpOiBBZGQgbWlzc2luZyBzZW1pY29sb24uCi0KLQkqIGFzLmMgKG1haW4pOiBNb3ZlIG1kX2VuZCBjYWxsIHRvIGp1c3QgYWZ0ZXIgY2FsbCB0bwotCXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcy4gIERlbGV0ZSBjcHUtc3BlY2lmaWMgY29kZSBoZXJlLgotCSogY29uZmlnL3RjLWk5NjAuaCAobWRfZW5kKTogTmV3IG1hY3JvLCBjYWxscyBicnRhYl9lbWl0LgotCSogY29uZmlnL3RjLWFybS5jIChtZF9lbmQpOiBVbnVzZWQgZnVuY3Rpb24gZGVsZXRlZC4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9lbmQpOiBEaXR0by4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9hbGlnbl9jb2RlKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBoZXJlCi0JZnJvbSBIQU5ETEVfQUxJR04gbWFjcm8uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChIQU5ETEVfQUxJR04pOiBDYWxsIGl0LgotCi0JTW9uIEp1bCAzMSAxNDo1MzoxOSAxOTk1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduKTogY2FzdCBmaWxsIGFuZCAweDkwIHRvIGNoYXIKLSAJYmVmb3JlIGNvbXBhcmluZwotCi0JTW9uIE1heSAgMSAxMDo5MTo0OSAxOTk1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduKTogIE1ha2UgIi5hbGlnbiBuLDB4OTAiIGdlbmVyYXRlCi0JbXVsdGktYnl0ZSBub3BzIHRvIGF2b2lkIGNoYW5naW5nIGdjYy4gIFRoZSBuZWNlc3NhcnkgZ2NjIGNoYW5nZQotCW1pZ2h0IGJyZWFrIG9sZCBhc3NlbWJsZXJzLgotCi0JU2F0IEFwciAyMiAyMDo1MzowNSAxOTk1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduLCBIQU5ETEVfQUxJR04pOiAgQWRkIG1hY3JvcyB0bwotCWdlbmVyYXRlIG9wdGltYWwgbXVsdGktYnl0ZSBub3AgaW5zdHJ1Y3Rpb25zIGZvciAiLmFsaWduIG4iCi0JIi5hbGlnbiBuLDB4OTAiLCBhbmQgYWxpZ25zIHJlcXVpcmluZyBtb3JlIHRoYW4gMTUgYnl0ZXMgb2YKLQlwYWRkaW5nIHN0aWxsIGdlbmVyYXRlIG11bHRpcGxlIDB4OTAncyBhcyBiZWZvcmUuCi0KLU1vbiBOb3YgMTMgMTc6NDA6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX21yaV91bnRpbCk6IENhbGwgcG9wX21yaV9jb250cm9sLgotCi1Nb24gTm92IDEzIDIwOjM5OjA2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChwcGMtKi1tYWNvcyosIHBwYy0qLW1wdyopOiBOZXcgY29uZmlndXJhdGlvbnMuCi0JKiBjb25maWd1cmU6IFVwZGF0ZS4KLQkqIG1wdy1tYWtlLnNlZDogUmVvcmRlciBjb21tYW5kcyB0byBtYWtlIHNlZCBoYXBwaWVyLgotCSogY29uZmlnL3RlLW1hY29zLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLXBwYy5oIChUQVJHRVRfRk9STUFUKTogU2V0IGNvcnJlY3RseSBmb3IgUG93ZXJNYWMuCi0KLVN1biBOb3YgMTIgMjE6MTQ6NTYgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEZpeCBvZmYtYnktMiBidWcgaW4gbGVuZ3RoIGNoZWNrIGZvcgotCWNvbmRpdGlvbmFsIGJyYW5jaGVzLgotCShtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQotVGh1IE5vdiAgOSAxNjoxNDowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2FwcGx5X2ZpeCk6IFdhcm4gaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvCi0JZ2VuZXJhdGUgYSByZWxvYyB3aGljaCB0aGUgbGlua2VyIHdpbGwgbm90IGhhbmRsZSBjb3JyZWN0bHkuICBGaXgKLQlvdmVyZmxvdyBjaGVja2luZy0tUl9JUkVMIGlzIDE4IGJpdHMsIG5vdCAxNy4KLQotV2VkIE5vdiAgOCAxOTo1OTozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3Qgc3VidHJhY3QgbWRfcGNyZWxfZnJvbQotCWZyb20gYSBQQyByZWxhdGl2ZSByZWxvYyBpZiBUQ19BMjlLLgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChsaW5lX3NlcGFyYXRvcl9jaGFycyk6IFJlc3RvcmUgJ0AnLiAgRXhpc3RpbmcKLQljb2RlIGRlcGVuZHMgdXBvbiBpdC4KLQotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfb3BlcmFuZCk6IEhhbmRsZSAkZmxvYXQsICRkb3VibGUsIGFuZAotCSRleHRlbmQuICBCYXNlZCBvbiBjb2RlIGZyb20gRXJpYyBGcmV1ZGVudGhhbAotCTxmcmV1ZGVudGhhbEBueXUuZWR1Pi4KLQkqIGNvbmZpZy90Yy1hMjlrLmggKExFWF9ET0xMQVIpOiBEZWZpbmUuCi0JKiByZWFkLmMgKExFWF9ET0xMQVIpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGxleF90eXBlKTogVXNlIExFWF9ET0xMQVIuCi0KLVdlZCBOb3YgIDggMTY6Mzg6MTQgMTk5NSAgRXJpYyBGcmV1ZGVudGhhbCA8ZnJldWRlbnRoYWxAbnl1LmVkdT4KLQotCSogY29uZmlndXJlLmluIChhMjlrLW55dS1zeW0xKTogTmV3IHRhcmdldCwganVzdCBsaWtlIG90aGVyIGEyOWsKLQl0YXJnZXRzLgotCi1XZWQgTm92ICA4IDExOjM4OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfZG90X2ZpbGVfc3ltYm9sKTogQ2FzdCB4bWFsbG9jIHJldHVybi4KLQotVHVlIE5vdiAgNyAwOToxNDozNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQWRkZWQgQkZEX1JFTE9DX1JWQS4gQ3VycmVudGx5Ci0JdXNlZCBvbmx5IGJ5ICJkbGx0b29sLmMiLgotCi1Nb24gTm92ICA2IDE4OjUxOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IFVuZGVmaW5lIGlubGluZSBpZiBub3QgX19HTlVDX18uCi0JKG1kX3BzZXVkb190YWJsZSk6IERvbid0IGRlZmluZSAiZXh0ZXJuIi4KLQotU2F0IE5vdiAgNCAwMDo1MToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2JpZWkpOiBGb3JjZSBzeW1ib2wgaW50byB0ZXh0X3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfc2hvd191c2FnZSk6IFB1dCBiYWNrc2xhc2ggYXQgZW5kIG9mIGxpbmUuCi0KLUZyaSBOb3YgIDMgMTM6MDI6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IERvbid0IHdhcm4gYWJvdXQgPT0gd2l0aCBhCi0Jbm9uZXhpc3RlbnQgcGFyYW1ldGVyLCBpbiBjYXNlIGl0IGlzIGluIGEgY29tbWVudCBmaWVsZC4KLQotCSogYXMuYyAobWFpbik6IE9uIFRDX0EyOUssIGNhbGwgbWFjcm9faW5pdCB3aXRoIG1hY3JvX2FsdGVybmF0ZQotCXNldCB0byAxLgotCSogbWFjcm8uYyAoZ2V0X2FueV9zdHJpbmcpOiBEb24ndCBrZWVwIHF1b3RlcyBpZiBtYWNyb19zdHJpcF9hdCBpcwotCXNldCwgZXZlbiBpZiBtYWNyb19hbHRlcm5hdGUgaXMgc2V0LgotCShnZXRfYXBvc3RfdG9rZW4pOiBJZiBtYWNyb19zdHJpcF9hdCwgb25seSBza2lwIGtpbmQgaWYgaXQgaXMgJ0AnLgotCShzdWJfYWN0dWFsKTogSWYgbWFjcm9fc3RyaXBfYXQsIGFuZCBraW5kIGlzICdAJywgZG9uJ3QgbG9vayB1cAotCXRoZSB0b2tlbiB1bmxlc3MgaXQgZW5kZWQgaW4gJ0AnLgotCSogY29uZmlnL3RjLWEyOWsuYyAobGluZV9zZXBhcmF0b3JfY2hhcnMpOiBSZW1vdmUgJ0AnLgotCSogZG9jL2MtYTI5ay50ZXhpOiBEb2N1bWVudCBtYWNybyB1c2FnZSBvbiBBMjlLLgotCi1UaHUgTm92ICAyIDIzOjA3OjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEhhbmRsZSBuZXcgJ1cnIHBsYWNlLCBtZWFuaW5nIGEKLQlzaWduZWQgd29yZC4KLQkoaW5zdGFsbF9vcGVyYW5kKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZSk6IEFkZCAiZXh0ZXJuIi4KLQotV2VkIE5vdiAgMSAxNToxNzowMiAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29uZmlndXJlLmluIChtODhrLW1vdG9yb2xhLXN5c3YqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1kZWx0YTg4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIG1kX2RvX2FsaWduIGlmIGl0IGlzCi0JZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1tODhrLmggKFNVQl9TRUdNRU5UX0FMSUdOKTogRGVmaW5lLgotCShtZF9kb19hbGlnbik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tODhrLmM6IEluY2x1ZGUgInN1YnNlZ3MuaCIuCi0JKG04OGtfZG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90ZS1kZWx0YS5oIChTVFJJUF9VTkRFUlNDT1JFKTogRG9uJ3QgZGVmaW5lLgotCShDT0ZGX05PTE9BRF9QUk9CTEVNKTogRGVmaW5lLgotCShMT0NBTF9MQUJFTFNfRE9MTEFSLCBMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUuCi0KLVdlZCBOb3YgIDEgMTY6MDc6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRm9yIGEganVtcCBpbnN0cnVjdGlvbiB3aXRoCi0Jbm9uLWNvbnN0YW50IHRhcmdldCwgcmVxdWlyZSA3IGF2YWlsYWJsZSBieXRlcyBpbiB0aGUgY3VycmVudAotCWZyYWcsIG5vdCA2LgotCi1UdWUgT2N0IDMxIDE1OjM3OjE2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuaDogSW5jbHVkZSBiZmQvZWxmLWJmZC5oIHJhdGhlciB0aGFuCi0JYmZkL2xpYmVsZi5oLgotCi1UdWUgT2N0IDMxIDE2OjM0OjI4IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1saW51eCopOiBVc2UgZWNvZmYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZXh0ZXJuKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGVjb2ZmX3NldHVwX2V4dCk6IExpa2V3aXNlLgotCShlY29mZl9mcm9iX3N5bWJvbCk6IFdhcm4gYWJvdXQgd2VhayBjb21tb24gc3ltYm9scy4KLQkqIGVjb2ZmLmggKGVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4pOiBEZWNsYXJlLgotCShlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKFNfSVNfV0VBSyk6IE5ldyBmdW5jdGlvbi4KLQkqIHN5bWJvbHMuaCAoU19JU19XRUFLKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3BzZXVkb190YWJsZSk6IEFkZCAiZXh0ZXJuIiBhbmQKLQkid2Vha2V4dCIuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IFJlbW92ZSAiZXh0ZXJuIi4KLQkoc19leHRlcm4pOiBSZW1vdmUuCi0KLVR1ZSBPY3QgMzEgMTM6Mjk6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19sZ2xvYmwpOiBEbyB0aGUgcmlnaHQgdGhpbmcuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2JiKTogQ2FsbCBTRl9TRVRfUFJPQ0VTUy4KLQkocHBjX2ViKTogTGlrZXdpc2UuICBTZXQgdGhlIHN0b3JhZ2UgY2xhc3MgdG8gQ19CTE9DSywgbm90IENfRkNOLgotCShwcGNfZnJvYl9zeW1ib2wpOiBEb24ndCBjaGFuZ2UgQ19CTE9DSyBzeW1ib2xzIHRvIENfSElERVhULgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBjYWxsCi0JU0FfU0VUX1NZTV9FTkRORFggd2l0aCB0aGUgY3VycmVudCBzeW1ib2w7IGNhbGwgaXQgd2l0aCB0aGUgbmV4dAotCW9uZS4gIElmIE9CSl9YQ09GRiwgdHJ5IHRvIGZpZ3VyZSBvdXQgd2hldGhlciB0aGUgc3ltYm9sIGlzIGdvaW5nCi0JdG8gYmUgZHJvcHBlZC4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImJjIiBhbmQgImVjIi4KLQkocHBjX3N0YWJfc3ltYm9sKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHBjX2NoYW5nZV9jc2VjdCk6IENoZWNrIHRoYXQgcHBjX3RvY19jc2VjdCBpcyBub3QgTlVMTC4KLQkocHBjX3N0YWJ4KTogU2V0IHBwY19zdGFiX3N5bWJvbCBhcm91bmQgY2FsbCB0byBzeW1ib2xfbWFrZS4gIFNldAotCXN5X3RjLnJlYWxfbmFtZSB0byB0aGUgc3RhYiBzdHJpbmcuCi0JKHBwY19iYywgcHBjX2VjKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUpOiBJZiBwcGNfc3RhYl9zeW1ib2wgaXMgc2V0LCBkb24ndAotCWRvIGFueXRoaW5nLgotCShwcGNfc3ltYm9sX25ld19ob29rKTogSWYgcHBjX3N0YWJfc3ltYm9sIGlzIHNldCwgZG9uJ3QgbG9vayBmb3IgYQotCXN1ZmZpeC4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogU2V0IEJTRl9OT1RfQVRfRU5EIGZvciBzeW1ib2xzIHdpdGggY3NlY3QgYXV4Ci0JZW50cmllcy4KLQotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfcHVzaCk6IFJlc2V0IHNiX2luZGV4LgotCi1Nb24gT2N0IDMwIDE3OjUyOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBEb24ndCBjcmVhdGUgYSBmcmFnIGluIHRoZSBhYnNvbHV0ZQotCXNlY3Rpb24uCi0KLVNhdCBPY3QgMjggMDE6MDI6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiZGF0YSIgYW5kICJ0ZXh0Ii4KLQkocHBjX2NzZWN0KTogTW92ZSBtb3N0IG9mIHRoZSBjb2RlIHRvIHBwY19jaGFuZ2VfY3NlY3QsIGFuZCBjYWxsCi0JaXQuCi0JKHBwY19jaGFuZ2VfY3NlY3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCB0YWtlbiBmcm9tIHBwY19jc2VjdC4KLQkocHBjX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcGNfc2F3X2Ficyk6IE5ldyBzdGF0aWMgdmFyYWJsZS4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogQ3JlYXRlIGF1eCBlbnRyeSBmb3IgYWJzb2x1dGUgc3ltYm9scy4gIFdhcm4gaWYKLQlhIHN5bWJvbCBoYXMgbm8gY3NlY3QuCi0JKHBwY19hZGp1c3Rfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXBwYy5oICh0Y19hZGp1c3Rfc3ltdGFiKTogRGVmaW5lIGlmIE9CSl9YQ09GRi4KLQkocHBjX2FkanVzdF9zeW10YWIpOiBEZWNsYXJlIGlmIE9CSl9YQ09GRi4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiB0Y19hZGp1c3Rfc3ltdGFiIGlzIGRlZmluZWQsCi0JY2FsbCBpdCBqdXN0IGJlZm9yZSB0aGUgY2FsbCB0byBvYmpfYWRqdXN0X3N5bXRhYi4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfZmluZF9vcl9tYWtlKTogQ2hhbmdlIG5hbWUgdG8gYmUgY29uc3QuCi0JKiBzeW1ib2xzLmggKHN5bWJvbF9maW5kX29yX21ha2UpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLVRodSBPY3QgMjYgMTk6MTg6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChBbGlnbik6IE1lbnRpb24gU0guCi0JKiBkb2MvYy1tNjhrLnRleGkgKE02OEstRGlyZWN0aXZlcywgLmV2ZW4pOiBEZXNjcmliZSBiZWhhdmlvciwgbm90Ci0JLmFsaWduIHZhbHVlLgotCSogZG9jL2MtejhrLnRleGkgKFo4MDAwIERpcmVjdGl2ZXMsIGdsb2JhbCk6IEZpeCBtaW5vciB0eXBvLgotCShaODAwMCBEaXJlY3RpdmVzLCBldmVuKTogRG9uJ3QgZ2l2ZSBudW1lcmljIGFsaWduIHZhbHVlLCBpbnN0ZWFkCi0JZXhwbGFpbiBiZWhhdmlvci4KLQotVGh1IE9jdCAyNiAxMTo0NTowMyAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIHRjLWFybS5jIChkb19sZHN0KTogQXNzZW1ibGUgbGRyL3N0ciByMCwgW3IxXSBhcyBhIHByZS1pbmNyZW1lbnQKLQlpbnN0cnVjdGlvbi4KLQotV2VkIE9jdCAyNSAxMTo1OToyNCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6ICBBbHNvIG1ha2UgaW5mby4KLQkobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiAgQWxzbyBtYWtlIGNsZWFuLWluZm8uCi0KLVR1ZSBPY3QgMjQgMTU6MjE6MzMgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgbmV3ICIubnN1YnNwYSIgb3Bjb2RlLgotCShwYV9zdWJzcGFjZSk6IEZvciAiLm5zdWJzcGEiLCBhbHdheXMgY3JlYXRlIGEgbmV3IHN1YnNwYWNlCi0Jd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcywgZXZlbiBpZiBvbmUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUKLQlzYW1lIG5hbWUuCi0KLVR1ZSBPY3QgMjQgMTQ6NTA6MzggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTik6IFJlbmFtZSBmcm9tCi0JVENfRk9SQ0VfUkVMT0NBVElPTiwgdGFraW5nIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBhcmd1bWVudC4gIElmCi0JdGhlIHNlY3Rpb24gb2YgdGhlIHRhcmdldCBzeW1ib2wgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50Ci0Jc2VjdGlvbiwgYWx3YXlzIGZvcmNlIHRoZSByZWxvY2F0aW9uIHRvIGJlIHVzZWQuCi0JKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IE5ldyBtYWNybyB0byBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBSZW5hbWUgZnJvbSB0aGUKLQltZF9wY3JlbF9mcm9tIGZ1bmN0aW9uLCB0YWtpbmcgYW4gYWRkaXRpb25hbCBzZWN0aW9uIGFyZ3VtZW50LgotCUludm9rZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04gaW5zdGVhZCBvZiBUQ19GT1JDRV9SRUxPQ0FUSU9OLgotCi0JKiB3cml0ZS5jIChUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04pOiBEZWZpbmUgaW4gdGVybXMgb2YgdGhlCi0Jb2xkZXIgVENfRk9SQ0VfUkVMT0NBVElPTiBpZiBub3QgZGVmaW5lZC4KLQkoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogSWYgbm90IGRlZmluZWQsIGludm9rZSBtZF9wY3JlbF9mcm9tLgotCShmaXh1cF9zZWdtZW50KTogVXNlIE1EX1BDUkVMX0ZST01fU0VDVElPTiBpbnN0ZWFkIG9mCi0JbWRfcGNyZWxfZnJvbSwgYW5kIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTiBpbnN0ZWFkIG9mCi0JVENfRk9SQ0VfUkVMT0NBVElPTi4KLQkKLU1vbiBPY3QgMjMgMTY6MjA6MDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGlucHV0LXNjcnViLmMgKGFzX3doZXJlKTogU2V0IG5hbWUgdG8gbnVsbCBwb2ludGVyIGlmIHdlIGRvbid0Ci0JaGF2ZSBhIGZpbGUgbmFtZS4KLQkqIG1lc3NhZ2VzLmMgKGlkZW50aWZ5KTogT25seSBwcmludCBmaWxlbmFtZSBpZiBub24tbnVsbC4KLQkoYXNfc2hvd193aGVyZSk6IERpdHRvLCBmb3IgbGluZSBudW1iZXIgdG9vLgotCShhc193YXJuX2ludGVybmFsLCBhc19iYWRfaW50ZXJuYWwpOiBEaXR0by4KLQotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX29wZW4pOiBJZiB0aGUgaW5wdXQgZmlsZSBjYW4ndCBiZQotCW9wZW5lZCwgY29uc2lkZXIgaXQgYW4gZXJyb3IuCi0KLU1vbiBPY3QgMjMgMTE6MTU6NDQgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFkZGVkIG1pcHNfNDEwMCBjb250cm9sLCBhbmQgc3VwcG9ydCBmb3IKLSAJYWNjZXB0aW5nIHRoZSA0MTAwIGFzIGEgTUlQUyBhcmNoaXRlY3R1cmUgdmFyaWFudCAobWRfYmVnaW4sCi0gCW1hY3JvX2J1aWxkLCBtaXBzX2lwLCBtZF9wYXJzZV9vcHRpb24pLiBBZGRpbmcgc3VpdGFibGUKLSAJY29tbWFuZC1saW5lIE9QVElPTnMsIGFuZCB1cGRhdGluZyB0aGUgaGVscCB0ZXh0IChtZF9zaG93X3VzYWdlKS4KLQkKLVdlZCBPY3QgMTggMTM6MjA6MzIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2JlZ2luKTogT25seSBzZXQgYWJzb2x1dGVfZnJjaGFpbi5maXhfKiB3aGVuCi0JQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLgotCi0JKiBVc2Ugb25lIGFjdGl2ZSBmcmFnIGFuZCBvbmUgb2JzdGFjayBwZXIgZnJhZyBjaGFpbjoKLQkqIGZyYWdzLmMgKGZyYWdzKTogVmFyaWFibGUgZGVsZXRlZC4KLQkoZnJhZ19hbGxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZnJhZ19ncm93LCBmcmFnX21vcmUsIGZyYWdfdmFyaWFudCwgZnJhZ19ub3dfZml4LAotCWZyYWdfYXBwZW5kXzFfY2hhcik6IFJlZmVyIHRvIGZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2sgaW5zdGVhZCBvZgotCWZyYWdzIHZhcmlhYmxlLgotCShmcmFnX25ldyk6IERpdHRvLiAgVmVyaWZ5IHRoYXQgZnJjaF9sYXN0IGFuZCBmcmFnX25vdyBtYXRjaCBvbgotCWVudHJ5IGFuZCBleGl0LCBhbmQgdGhhdCBvbGQgZnJhZ19ub3cgaGFzIG5vbi16ZXJvIHR5cGUuICBSZXBsYWNlCi0JImtub3ciIHVzZXMgd2l0aCAiYXNzZXJ0Ii4gIFVzZSBmcmFnX2FsbG9jIGluc3RlYWQgb2YgbXVja2luZyB3aXRoCi0Jb2JzdGFjayBhbGlnbm1lbnQuCi0JKiBmcmFncy5oIChmcmFncyk6IERlY2xhcmF0aW9uIGRlbGV0ZWQuCi0JKiBzdWJzZWdzLmggKHN0cnVjdCBmcmNoYWluKTogQWRkIG5ldyBmaWVsZCBmcmNoX2ZyYWdfbm93LgotCSogc3Vic2Vncy5jIChmcmNoYWlucywgZHVtbXlfZnJhZywgYWJzb2x1dGVfZnJjaGFpbik6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZXMuCi0JKHN1YnNlZ3NfYmVnaW4pOiBJbml0aWFsaXplIGZyY2hhaW5zIG9ic3RhY2suICBVbmRlciBnY2MsIGRvbid0Ci0JZ2l2ZSBpdCBhbnkgc3RyaWN0ZXIgYWxpZ25tZW50IHRoYW4gZnJjaGFpblMgc3RydWN0dXJlcyBuZWVkLiAgRG8KLQlub3QgaW5pdGlhbGl6ZSBmcmFncyBvYnN0YWNrLiAgU2V0IGZyYWdfbm93IHRvIHBvaW50IHRvCi0JZHVtbXlfb2JzdGFjay4gIEluaXRpYWxpemUgYWJzb2x1dGVfZnJjaGFpbi4KLQkoc3Vic2VnX3NldF9yZXN0KTogU2F2ZSBhbmQgcmVzdG9yZSBmcmFnX25vdyBpbiBmcmNoX2ZyYWdfbm93Ci0JZmllbGQgb2YgZnJjaGFpblMuICBEb24ndCBjcmVhdGUgbmV3IGZyYWdzIG9uIHNlY3Rpb24gc3dpdGNoLCBhbmQKLQl1c2UgZnJhZ19hbGxvYyB3aGVuIGNyZWF0aW5nIGEgbmV3IGZyYWcgY2hhaW4uICBGb3IgYWJzb2x1dGUKLQlzZWN0aW9uLCBzZXQgZnJjaGFpbl9ub3cgdG8gYWJzb2x1dGVfZnJjaGFpbi4gIFZlcmlmeSB0aGF0Ci0JZnJjaF9sYXN0IGFuZCBmcmFnX25vdyBtYXRjaCBvbiBlbnRyeSBhbmQgZXhpdC4gIEluaXRpYWxpemUKLQlwZXItY2hhaW4gb2JzdGFjaywgYW5kIHVuZGVyIGdjYywgc2V0IHJlcXVpcmVkIGFsaWdubWVudCB0byB0aGF0Ci0JbmVlZGVkIGJ5IGZyYWdTIHN0cnVjdHVyZS4KLQotCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IFZlcmlmeSBmcl90eXBlIGlzIG5vbnplcm8uCi0KLQkqIHN0YWJzLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBPbmx5IGNvcHkgaW5wdXQgc3RyaW5nIGlmIGEKLQlmcmVzaCBjb3B5IGlzIG5lZWRlZCwgbm90IGlmIHRoZSBzZWN0aW9uIGFscmVhZHkgZXhpc3RzLgotCShzX3N0YWJfZ2VuZXJpYyk6IENhY2hlIHN0YWIgc2VjdGlvbiBuYW1lIHRvIGJ5cGFzcyBsb29rdXBzLCBzaW5jZQotCXVzdWFsbHkgaXQgd2lsbCBtYXRjaC4gIENvdWxkIGJlIG1hZGUgZmFzdGVyIHN0aWxsIGJ5IGNoYW5naW5nIHRoZQotCW1lbW9yeSBhbGxvY2F0aW9uIHJ1bGVzLgotCShzX3hzdGFiKTogQ2FjaGUgc2VjdGlvbiBuYW1lIHRvIGJ5cGFzcyByZXBlYXRlZCBzdHJpbmcKLQlhbGxvY2F0aW9uLgotCi0JKiBmcmFncy5jIChmcmFnX25ldyk6IERlbGV0ZWQgcmVnaXN0ZXIgZGVjbGFyYXRpb25zLgotCi0JKiBsaXN0aW5nLmMgKGZyYWdfbm93KTogRG9uJ3QgZGVjbGFyZS4KLQotCSogYXMuYyAoY2h1bmtzaXplKTogTmV3IHZhcmlhYmxlLgotCShkZWJ1Z19tZW1vcnkpOiBOZXcgdmFyaWFibGUuCi0JKG1haW4pOiBJZiBkZWJ1Z19tZW1vcnkgaXMgc2V0LCByZWR1Y2UgY2h1bmtzaXplIGFuZAotCV9iZmRfY2h1bmtzaXplLgotCSogYXMuaCAoY2h1bmtzaXplKTogRGVjbGFyZSBpdC4KLQkqIHJlYWQuYyAocmVhZF9iZWdpbik6IFVzZSBpdC4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3Nob3J0b3B0cyk6IEluY2x1ZGUgJ2cnLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZ25vcmUgaXQuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgTWFrZWZpbGUgYW5kIGNvbmZpZy5zdGF0dXMgZnJvbQotCXRlc3RzdWl0ZSBkaXJlY3RvcnkuCi0JKGNsZWFuLWhlcmUpOiBEb24ndCBkZWxldGUgdGVzdHN1aXRlLiAgSW5zdGVhZCwgZGVsZXRlIG9ubHkgdGhlCi0JZmlsZXMgd2l0aGluIGl0IHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgdGVzdHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uKTogQ2FsbAotCWZyYWdfbm93X2ZpeCBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBvYnN0YWNrIGluZm8gZGlyZWN0bHkuCi0JKiBjb25maWcvdGMtYXJtLmMgKHNfbHRvcmcpOiBEaXR0by4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBDYWxsIGZyYWdfZ3JvdyBpbnN0ZWFkIG9mCi0Jb2JzdGFja19yb29tLgotCi1XZWQgT2N0IDE4IDEyOjIyOjU5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChhb3V0X3Byb2Nlc3Nfc3RhYik6IEluc2VydCBkZWJ1ZyBzeW1ib2wgaW50byBzeW1ib2wKLQljaGFpbiBhZnRlciBwYXJzaW5nIHZhbHVlIGV4cHJlc3Npb24sIGlmIGFueSwgdG8gYXZvaWQgc2VwYXJhdGluZwotCWNvbnRpbnVlZCAuc3RhYnMgbGluZXMuCi0KLU1vbiBPY3QgMTYgMTA6NTY6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VsZl9wc2V1ZG9fdGFibGUpOiBSZW1vdmUuCi0JKG1pcHNfcG9wX2luc2VydCk6IERvbid0IGNhbGwgcG9wX2luc2VydCBvbiBtaXBzX2VsZl9wc2V1ZG9fdGFibGUuCi0KLU1vbiBPY3QgMTYgMDc6MDc6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9iZWdpbik6IFVzZSBuZXcgZmxhZ3MgUFBDX09QQ09ERV9DT01NT04gZm9yCi0JLW1jb20gc3VwcG9ydCBhbmQgUFBDX09QQ09ERV9BTlkgZm9yIC1tYW55LgotCShtZF9wYXJzZV9vcHRpb24pOiBEaXR0by4KLQkocHBjX2FyY2gpOiBEaXR0by4KLQkobWRfYmVnaW4pOiBGb3IgZHVwbGljYXRlIGluc3RydWN0aW9ucywgcHJpbnQgYWxsIGR1cGxpY2F0ZXMKLQliZWZvcmUgYWJvcnRpbmcuCi0KLVN1biBPY3QgMTUgMjI6MDY6MTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogU3VwcG9ydCBmb3IgLW1jb20gdG8gdHVybiBvbgotCWNvbW1vbiBtb2RlIG9wZXJhdGlvbi4KLQkobWRfc2hvd191c2FnZSk6IEFkZCAtbWNvbSB0byB1c2FnZSBtZXNzYWdlLgotCi1GcmkgT2N0IDEzIDEzOjMyOjQ1IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BfcmFuayk6IEFkZCBPX3N5bWJvbF9ydmEuCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IEFkZCBPX3N5bWJvbF9ydmEuCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogU2V0IE9fc3ltYm9sX3J2YSB3aGVuIG5lY2Vzc2FyeS4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogVW5kZXJzdGFuZCBPX3N5bWJvbF9ydmEuCi0KLVR1ZSBPY3QgMTAgMTE6MzQ6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBDb3JyZWN0IHNfY29ucyBhcmd1bWVudHMuICBGcm9tIE1pY2hhZWwKLQlKb29zdGVuIDxqb29zdEBvcmkuY2FkbGFiLmRlPi4KLQotTW9uIE9jdCAgOSAxOTo1OTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX21hY3JvKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KLQkocHBjX2JpZWkpOiBTZXQgc2VnbWVudCB0byBub3dfc2VnIGFuZCB2YWx1ZSB0byBjb2ZmX25fbGluZV9ub3MuCi0JKHBwY19mcm9iX3N5bWJvbCk6IEhhbmRsZSBDX0JJTkNMIGFuZCBDX0VJTkNMIHN5bWJvbHMgYnkgc2V0dGluZwotCXRoZSBmaXhfbGluZSBmaWVsZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX25fbGluZV9ub3MpOiBSZW5hbWUgZnJvbSBuX2xpbmVfbm9zLCBhbmQKLQltYWtlIG5vbi1zdGF0aWMuICBDaGFuZ2UgYWxsIHVzZXJzLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfbl9saW5lX25vcyk6IERlY2xhcmUuCi0KLUZyaSBPY3QgIDYgMTY6MjQ6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaW4gKEFDX0FSR19XSVRIKGJmZC1hc3NlbWJsZXIpKTogRml4IGhlbHAgbWVzc2FnZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBDb252ZXJ0IHNwZWNpZmllZCBieXRlCi0JYWxpZ25tZW50IHRvIHBvd2VyIG9mIHR3by4gIFNldCBzaXplIG9mIGxvY2FsIGJzcyBzeW1ib2wuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCB0eXBvIGluIHZhcmlhYmxlIG5hbWUuCi0KLUZyaSBPY3QgIDYgMTU6MjI6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzYi5jLCBtYWNyby5jOiBEZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIDxzdHJpbmcuaD4gb3IKLQk8c3RyaW5ncy5oPiBqdXN0IGFzIGFzLmggZG9lcy4KLQotRnJpIE9jdCAgNiAwOTo1NTozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc2l0ZS5leHApOiBGaXggc2V0dGluZyBvZiAkc3JjZGlyLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2F0b2YpOiBGaXggbGl0dGxlLWVuZGlhbiBvdXRwdXQuCi0JKiBjb25maWcvdGMtYXJtLmggKEFSTV9CSV9FTkRJQU4pOiBNb3ZlIGRlZmluaXRpb24gc28gZGVmaW5lZCBmb3IKLQlhbGwgY29mZiB0YXJnZXRzLgotCi1UaHUgT2N0ICA1IDIwOjE3OjMwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogU3BsaXQgb3V0IHRoZSBOUzMyayBmYW1pbHkgZG9jdW1lbnRhdGlvbiwKLQlkZXNwaXRlIGl0cyBiZWluZyBjb21tZW50ZWQgb3V0IGZvciBub3cuCi0JKiBkb2MvYy1uczMyay50ZXhpOiBOZXcgZmlsZS4KLQotCSogc2IuYywgbWFjcm8uYzogSW5jbHVkZSBzdHJpbmcuaC4KLQotCSogTWFrZWZpbGUuaW4gKGNvbXBhcmlzb24pOiBPbmx5IGNoZWNrICoubzsgd2UgZG9uJ3QgY2FyZSBpZgotCXRpbWVzdGFtcHMgaW5zZXJ0ZWQgYnkgdGhlIG5hdGl2ZSBsaW5rZXIgZGlmZmVyLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfYWxpZ24pOiBPbmx5IGZpbGwgd2l0aCBhIG5vLW9wIHBhdHRlcm4KLQlpZiBhbGlnbm1lbnQgc3RyaWN0ZXIgdGhhbiA0IGJ5dGVzIGlzIHJlcXVlc3RlZDsgaW4gdGhhdCBjYXNlLAotCWFsaWduIHRvIGEgNC1ieXRlIGJvdW5kYXJ5IGZpcnN0LgotCi0JVGh1IFNlcCAyOCAxOTozNToyNyAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1JTWU1fUGFyc2UpOiBlbGltaW5hdGUgIm1pZ2h0IGJlIHVzZWQKLQl1bmluaXRpYWxpemVkIiB3YXJuaW5nIGZvciBgTWF4X1NvdXJjZV9PZmZzZXQnLgotCi1XZWQgT2N0ICA0IDE2OjE3OjAyIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBhcnNlX3RvY19lbnRyeSk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSBbdG9jXQotCXF1YWxpZmllcnMgYW5kIGRldGVjdCBlcnJvcnMgaWYgcHJlc2VudC4KLQkobWRfYXNzZW1ibGUpOiBBZGQgY2FsbCB0byBwYXJzZV90b2NfZW50cnkuIEFsc28gYWRkZWQgc29tZSBzdXBwb3J0Ci0JZm9yIHRoZSBbdG9jdl0gcXVhbGlmaWVyLgotCShwcGNfcGVfdG9jZCk6IE5ldyBmdW5jdGlvbiB0byBzdXBwb3J0IGRhdGEgaW4gdGhlIHRvYyBzZWN0aW9uLgotCi1XZWQgT2N0ICA0IDE0OjAzOjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZnJvYl9zeW1ib2wpOiBEb24ndCBjcmVhdGUgYW4gYXV4IGVudHJ5IGZvcgotCWFuIGFic29sdXRlIHN5bWJvbC4KLQotVHVlIE9jdCAgMyAxMjoxODoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGlzd29yZCk6IEFjY2VwdCBhbGwgdmFsdWVzIGZyb20gLTY1NTM2IHRvCi0JKzY1NTM1LAlzbyB+VkFMIHdpbGwgbm90IGJlIHJlamVjdGVkLgotCi0JKiBjb25kLmMgKHNfZW5kaWYpOiBDYWxsIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuICBJbiBNUkkgbW9kZSwKLQlza2lwIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIHBzZXVkby1vcC4KLQkoc19lbHNlKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKGdldF9saW5lX3NiKTogRG9uJ3QgbG9vayBwYXN0IGJ1ZmZlcl9saW1pdC4KLQkoc19pbmNsdWRlKTogSW4gTVJJIG1vZGUsIHNraXAgY2hhcmFjdGVycyBhZnRlciB0aGUgZmlsZSBuYW1lLgotCi1Nb24gT2N0ICAyIDE2OjE1OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAobTY4a19yZWdfcGFyc2UpOiBJbiBNUkkgbW9kZSwgcGVybWl0Ci0JcGVyaW9kcyBpbiByZWdpc3RlciBuYW1lcy4KLQotU2F0IFNlcCAzMCAyMzowMzozMSAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBEUCByZWxhdGl2ZSByZWxvY3MKLQlhcmUgbm90IGFkanVzdGFibGUgaW4gU09NIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgb3B0aW1pemluZwotCWxpbmtlci4KLQotRnJpIFNlcCAyOSAxNToxODowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgc29tZSBzdXBwb3J0IGZvciBpOTYwIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZW5kaWFuLgotCShnZXRfYXJncyk6IERvbid0IGRpc2NhcmQgYSBzcGFjZSBiZXR3ZWVuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLgotCShnZXRfY2Rpc3ApOiBDaGFuZ2UgdGV4dF9zZWN0aW9uIHRvIG5vd19zZWcuCi0JKHNfZW5kaWFuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKE1SSV9NT0RFX05FRURTX1BTRVVET19ET1QpOiBEZWZpbmUuCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IEFkZCBPX2xvZ2ljYWxfbm90LCBPX2xvZ2ljYWxfYW5kLCBhbmQKLQlPX2xvZ2ljYWxfb3IuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBUcmVhdCAnIScgYXMgbG9naWNhbCBub3Qgb3BlcmF0b3IuICBJZgotCVRDX0k5NjAsIGluIE1SSSBtb2RlIHBlcm1pdCBgc2l6ZW9mIHNlY25hbWUnIGFuZCBgc3RhcnRvZgotCXNlY25hbWUnLgotCShvcF9yYW5rKTogQnVtcCB2YWx1ZXMgYnkgMiB0byBtYWtlIHJvb20gZm9yICYmIGFuZCB8fC4gIEFkZAotCWVudHJpZXMgZm9yICEsICYmLCBhbmQgfHwuCi0JKGV4cHJfYmVnaW4pOiBPbmx5IGRvIE1SSSBjaGFuZ2VzIGlmIFRDX002OEsuCi0JKG9wZXJhdG9yKTogUmVjb2duaXplIHx8IGFuZCAmJi4KLQkoZXhwcik6IEhhbmRsZSBuZXcgb3BlcmF0b3JUIHZhbHVlcy4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgbmV3IG9wZXJhdG9yVCB2YWx1ZXMuCi0JKHByaW50X2V4cHJfMSk6IExpa2V3aXNlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGRlYnVnLCBlcnIsIGlyZXAsIGlyZXBjLCBwcmludCwgcHVyZ2VtLAotCWFuZCByZXAuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEhhbmRsZSBNUklfTU9ERV9ORUVEU19QU0VVRE9fRE9ULgotCShtcmlfY29tbWVudF9maWVsZCk6IE9ubHkgaGFuZGxlIHdlaXJkIGNvbW1lbnRzIGlmIFRDX002OEsuCi0JKHNfZXJyKTogTmV3IGZ1bmN0aW9uLgotCShzX29yZyk6IE9ubHkgcHVudCBpbiBNUkkgbW9kZSBpZiBUQ19NNjhLLgotCShzX21yaV9zZWN0KTogV3JpdGUgVENfSTk2MCB2ZXJzaW9uLgotCShzX3ByaW50LCBzX3B1cmdlbSk6IE5ldyBmdW5jdGlvbnMuCi0JKiByZWFkLmggKHNfZXJyLCBzX3ByaW50LCBzX3B1cmdlbSk6IERlY2xhcmUuCi0JKiBjb25kLmMgKHNfaWZlcXMpOiBJbXBsZW1lbnQuCi0JKGlnbm9yZV9pbnB1dCk6IEhhbmRsZSBNUklfTU9ERV9ORUVEU19QU0VVRE9fRE9ULgotCSogbWFjcm8uYyAobWFjcm9fc3RyaXBfYXQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtYWNyb19pbml0KTogQWRkIHN0cmlwX2F0IHBhcmFtZXRlci4KLQkoZG9fZm9ybWFscyk6IElmIG1hY3JvX3N0cmlwX2F0LCBjaGFuZ2UgTkFSRyB0byAkTkFSRy4KLQkoZGVmaW5lX21hY3JvKTogU2tpcCBhIGNvbW1hIGFmdGVyIHRoZSBtYWNybyBuYW1lLgotCShnZXRfYXBvc3RfdG9rZW4pOiBTa2lwIGNoYXJhY3RlciBpZiBtYWNyb19zdHJpcF9hdCwgZXZlbiBpZgotCW1hY3JvX21yaS4KLQkobWFjcm9fZXhwYW5kX2JvZHkpOiBJZiBtYWNyb19zdHJpcF9hdCwgZG9uJ3QgcmVjb2duaXplIHBhcmFtZXRlcnMKLQlpbiBzdHJpbmdzIHVubGVzcyB0aGV5IGFyZSBwcmVjZWRlZCBieSBhbiAnQCcuICBJZiBtYWNyb19zdHJpcF9hdCwKLQlwYXNzICdAJyBhcyBzdHJpcCBjaGFyYWN0ZXIgdG8gc3ViX2FjdHVhbC4gIElmIG1hY3JvX3N0cmlwX2F0LAotCXN0cmlwICdAJyBjaGFyYWN0ZXJzLgotCShtYWNyb19leHBhbmQpOiBJZiBtYWNyb19zdHJpcF9hdCwgY2hhbmdlIE5BUkcgdG8gJE5BUkcuCi0JKGRlbGV0ZV9tYWNybyk6IE5ldyBmdW5jdGlvbi4KLQkoZXhwYW5kX2lycCk6IFNraXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgJyInIGNoYXJhY3RlcnMgaWYgaXJwYy4KLQkqIG1hY3JvLmggKG1hY3JvX2luaXQpOiBNZW50aW9uIG5ldyBzdHJpcF9hdCBwYXJhbWV0ZXIuCi0JKGRlbGV0ZV9tYWNybyk6IERlY2xhcmUuCi0JKiBhcy5jIChtYWluKTogSWYgVENfSTk2MCwgcGFzcyBmbGFnX21yaSB0byBtYWNyb19pbml0IGFzCi0Jc3RyaXBfYXQ7IG90aGVyd2lzZSwgcGFzcyAwLgotCSogZ2FzcC5jIChwcm9jZXNzX3BzZXVkb19vcCk6IFBhc3MgMCB0byBtYWNyb19pbml0IGFzIHN0cmlwX2F0LgotCShtYWluKTogTGlrZXdpc2UuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgaTk2MCBNUkkgbW9kZS4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IE1lbnRpb24gLS1kZWZzeW0uCi0KLVRodSBTZXAgMjggMTk6MjU6MDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBUcmFuc2xhdGUgInBvd2VycGMiIGludG8gInBwYyIsIHJlbW92ZSBnZW4gb2YKLQlWRVJTSU9OLCBtb3ZlIGdlbiBvZiAiY29uZiIgaGVyZSBmcm9tIG1ha2VmaWxlLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4IG1ha2VmaWxlCi0JaW50byBNUFcgc3ludGF4LgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIG1hYy1hcy5yOiBOZXcgZmlsZSwgTWFjIHJlc291cmNlIGZpbGUuCi0JKiBhcy5oIChpbmxpbmUpOiBEb24ndCBkZWNpZGUgYWJvdXQgZGVmaW5pbmcgaWYgX19NV0VSS1NfXywKLQlyZW1vdmUgcmVkdW5kYW50IGNvbmRpdGlvbmFsIGFuZCBkZWZpbml0aW9uLgotCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IEZpeCBzeW50YXggZm9yIE9CSl9QUk9DRVNTX1NUQUIuCi0KLVRodSBTZXAgMjggMTU6NDM6MTUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogUmVtb3ZlZCBzb21lIFRFX1BFIHNwZWNpZmljIAotCW1hbmlwdWxhdGlvbnMsIHNpbmNlIEkgY2FuJ3QgcHJvdmUgdGhleSdyZSBuZWVkZWQuCi0JKG1kX2JlZ2luKTogUmVtb3ZlZCBpbml0X3JlZ3RhYmxlLCBpbnNlcnRfcmVnLCBhbmQgdGhlIGNhbGwgcG9pbnRzLgotCShyZWdpc3Rlcl9uYW1lKTogTmV3IGZ1bmN0aW9uLiBQYXJzZXMgYSByZWdpc3RlciBuYW1lLCBpZiBhcHByb3ByaWF0ZS4KLQkobWRfYXNzZW1ibGUpOiBBZGRlZCBjYWxsIHRvIHJlZ2lzdGVyX25hbWUgdG8gaGFuZGxlIHN5bWJvbGljIG5hbWVzLgotCShwcGNfcGVfc2VjdGlvbik6IFJlbW92ZWQgYWxsIGR1cGxpY2F0ZSBJTUFHRSBkZWZpbmVzLCBhbmQgaW5jbHVkZQotCWNvZmYvcGUuaCBpbnN0ZWFkLgotCi1UaHUgU2VwIDI4IDEyOjA5OjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KLQkocHBjX3BlX2ZpeF9hZGp1c3RhYmxlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3BlX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgU2VwIDI4IDAxOjExOjU4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGZvciBhcm0tY29mZi4KLQotV2VkIFNlcCAyNyAxMjo1Mzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoU19JU19MT0NBTCk6IEFsbCBzeW1ib2xzIGluIHJlZ19zZWN0aW9uIGFyZSBsb2NhbC4KLQotCSogY29uZmlnL3RjLXBwYy5oIChPQkpfWENPRkYpOiBEZWZpbmUgaWYgT0JKX0NPRkYgYW5kIG5vdCBURV9QRS4KLQlDaGFuZ2UgT0JKX0NPRkYgY2hlY2tzIHRvIGNoZWNrIE9CSl9YQ09GRiBpbnN0ZWFkLgotCShUQVJHRVRfRk9STUFUKTogRnVsbHkgcGFyZW50aGVzaXplLgotCShMRVhfUU0pOiBEZWZpbmUgaWYgVEVfUEUuCi0JKiBjb25maWcvdGMtcHBjLmM6IFJlcGxhY2UgT0JKX0NPRkYgYnkgT0JKX1hDT0ZGIHRocm91Z2hvdXQuCi0JUmVtb3ZlIGNoZWNrcyBvZiBURV9QRSB3aXRoaW4gI2lmZGVmIE9CSl9YQ09GRiBzZWN0aW9ucy4KLQkoaW5pdF9yZWd0YWJsZSk6IE1ha2UgaSB1bnNpZ25lZC4KLQkocHBjX3NldF9jdXJyZW50X3NlY3Rpb24pOiBSZW5hbWUgZnJvbSBzZXRDdXJyZW50U2VjdGlvbi4gIENoYW5nZQotCWFsbCBjYWxsZXJzLgotCShwcGNfYXJjaCk6IFJldHVybiBhZnRlciBhc19mYXRhbCB0byBhdm9pZCBnY2Mgd2FybmluZy4KLQkobWRfYXNzZW1ibGUpOiBPbmx5IGRlY2xhcmUgcmVsb2MgaWYgT0JKX0VMRi4gIEFkZCBkZWZhdWx0IHRvCi0Jc3dpdGNoIG9uIGZpeHVwc1tpXS5yZWxvYyB0byBhdm9pZCBnY2Mgd2FybmluZy4KLQkoSU1BR0VfU0dOX0xOS19PVEhFUik6IEZpeCBuZXN0ZWQgY29tbWVudC4KLQkocHBjX3BlX2Z1bmN0aW9uKTogRG9uJ3QgY2FsbCBwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lLgotCShwcGNfZnJvYl9zeW1ib2wpOiBSZW1vdmUgVEVfUEUgc2VjdGlvbiBjaGVja3MuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogUmV0dXJuIGFmdGVyIGFib3J0IHRvIGF2b2lkIGdjYwotCXdhcm5pbmcuCi0JKG1kX2FwcGx5X2ZpeDMpOiBBZGQgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCB0byBzd2l0Y2guCi0JKiByZWFkLmMgKExFWF9RTSk6IERlZmluZSBhcyAwIGlmIG5vdCBkZWZpbmVkLgotCShsZXhfdHlwZSk6IFVzZSBMRVhfUU0gZm9yICc/Jy4KLQotCSogY29uZmlndXJlLmluOiBObyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgJHtjcHVfdHlwZX0gaXMgcG93ZXJwYzsKLQlpdCBuZXZlciB3aWxsIGJlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwIDI3IDExOjMzOjM4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogUmVtb3ZlIFNlcCAyNiBjaGFuZ2VzIHRvIHRoaXMKLQlmdW5jdGlvbiwga2VlcGluZyBvdGhlciBTZXAuIDI2IGNoYW5nZXMuCi0KLVdlZCBTZXAgMjcgMTA6Mjk6MTMgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogY29uZmlndXJlIChlbXVsYXRpb25zKTogQWRkZWQgc3VwcG9ydCBmb3IgcHBjbGUtKi1bcGV8d2lubnRdCi0JKHRhcmdldF9mcmFnKTogUmVtb3ZlZCBhbiBleHRyYW5lb3VzIFBQQyBkZWZpbml0aW9uLgotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogU2FtZQotCSogY29uZmlnL3RjLXBwYy5oOgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBCYXNlIHN1cHBvcnQgZm9yIG5ldyBvciBhbHRlcmVkCi0JcHNldWRvIG9wcyAtIDxwcmV2aW91cywgcGRhdGEsIHlkYXRhLCByZWxkYXRhLCByZGF0YSwgdWFsb25nLCB6bm9wLAotCXNlY3Rpb24sIGNvbW0sIGZ1bmN0aW9uPiBUaGVyZSB3aWxsIGJlIG1vcmUuCi0JKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IFByZWRlZmluZWQgcmVnIHRhYmxlIHRvIG5hbWUgcmVnaXN0ZXJzLCBldGMKLQkobWRfYmVnaW4pOiBTZXR1cCByZWcgdGFibGUgaW5pdGlhbGl6YXRpb24KLQkobWRfYXNzZW1ibGUpOiBJbml0aWFsIFt0b2NdeChydG9jKSBzdXBwb3J0Ci0JKHBwY19mcm9iX2xhYmVsKTogUmVtb3ZlZCBzb21lIHhjb2ZmIHNwZWNpZmljIHByb2Nlc3NpbmcgZnJvbSBURV9QRQotCShwcGNfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIHNvbWUgeGNvZmYgc3BlY2lmaWMgcHJvY2Vzc2luZyBmcm9tIFRFX1BFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBtb3JlIHByZWRlZmluZWQgc2VjdGlvbnMKLSAgICAgICAgKHBwY19mcm9iX3NlY3Rpb24pOiBSZW1vdmVkIHNvbWUgeGNvZmYgc3BlY2lmaWMgcHJvY2Vzc2luZyBmcm9tIFRFX1BFCi0JKHBwY19maXhfYWRqdXN0YWJsZSk6IFJlbW92ZWQgZnJvbSBURV9QRSBtYWlubGluZQotCShtZF9hcHBseV9maXgzKTogRm9yIFRFX1BFIHRvYyBlbnRyaWVzLCB3ZSBkb24ndCBuZWVkIHRvIG1lc3MgCi0gICAgICAgIHdpdGggZnhfYWRkbnVtYmVyLiBSZW1vdmVkIGZvciB0aGUgdGltZSBiZWluZy4KLQkobG90cyk6IFB1dCBiYWNrIG1pc3NpbmcgYXNzaWdubWVudHMgdG8gcHBjX2N1cnJlbnRfY3NlY3QuCi0KLVR1ZSBTZXAgMjYgMTQ6NTc6NTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogU3VwcG9ydCBhbGwgb2YgdGhlIFYuNAotCXJlbG9jYXRpb25zLgotCShwcGNfZWxmX2NvbnMpOiBSZW1vdmUgcmVzdHJpY3Rpb24gdGhhdCBAIHN1ZmZpeGVzIG11c3QgYmUgZG9uZQotCXdpdGggLmxvbmcuICBBZGQgZXJyb3IgaWYgcmVsb2NhdGlvbiBkb2VzIG5vdCBmaXQgaW4gdGhlIG51bWJlciBvZgotCWJ5dGVzIHByb3ZpZGVkLgotCShtZF9hc3NlbWJsZSk6IEZvciBhYnNvbHV0ZSBicmFuY2hlcywgbWFwIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zCi0JYmFjayBpbnRvIGFuIGVxdWl2YWxlbnQgYWJzb2x1dGUgcmVsb2NhdGlvbi4KLQkobWRfcGNyZWxfZnJvbSk6IElmIFRDX0ZPUkNFX1JFTE9DQVRJT04gaXMgdHJ1ZSwgcmVsb2NhdGlvbiBvZmZzZXQKLQlpcyAwLCBub3Qgc2VnbWVudCBzdGFydC4KLQkobWRfYXBwbHlfZml4Myk6IERvbid0IGJvdGhlciB3cml0aW5nIGFkZGVuZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiwKLQlzaW5jZSBpdCBpcyBpZ25vcmVkLCBnaXZlbiB0aGF0IHdlIHVzZSBSRUxBIHJlbG9jYXRpb25zIGZvciBFTEYuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZSB0byBmb3JjZSBhbGwKLQlicmFuY2ggcHJlZGljdGlvbiByZWxvY2F0aW9ucyB0byBhbHdheXMgYmUgZW1pdHRlZC4KLQotTW9uIFNlcCAyNSAxNjowODo0MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBMb3dlciBjYXNlIHJlbG9jIGJlZm9yZQotCXRlc3RpbmcuCi0JKG1kX2Fzc2VtYmxlKTogQmUgbW9yZSByb2J1c3QgaW4gdGVybXMgb2YgcmVsb2NhdGlvbnMuCi0JKG1kX2FwcGx5X2ZpeDMpOiBBbGxvdyAxNCBiaXQgcmVsb2NzIHRvIGJlIGVtaXR0ZWQgZm9yIGV4dGVybmFsCi0Jc3ltYm9scyBpbiBhZGRpdGlvbiB0byAyNiBiaXQgcmVsb2NzLiAgUHJvcGVybHkgaW5zZXJ0IDI2LzE0IGJpdAotCXJlbG9jIHZhbHVlIGZpZWxkcyBpbnRvIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uCQotCi1Nb24gU2VwIDI1IDAwOjIzOjE2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hdG9mKTogT3V0cHV0IGxpdHRsZSBlbmRpYW4gY29uc3RhbnRzIGluCi0JbGl0dGxlIGVuZGlhbiBtb2RlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IFBhc3MgJnR5cGUsIG5vdCB0eXBlLAotCXNfbXJpX3NlY3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG86IGZtdC1lbGYgdG8gZm10PWVsZi4KLQotRnJpIFNlcCAyMiAxNjozNDo0NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBSZXdyaXRlIHRvIHVzZSBhIHRhYmxlIG9mCi0Jc3RyaW5ncyBhbmQgcmVsb2NhdGlvbnMgdGhleSByZXByZXNlbnQuICBBZGQgQGJyeyxufXRha2VuIGZvcgotCWJyYW5jaCB0YWtlbi9ub3QgdGFrZW4gc3VwcG9ydC4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBCRkRfUkVMT0NfUFBDX0IxNl9CUnssTn1UQUtFTiBzdXBwb3J0LgotCi1UaHUgU2VwIDIxIDIxOjEwOjE3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IC1tcmVsb2NhdGFibGUtbGliIG5vdyBvbmx5Ci0Jc2V0cyBFRl9QUENfUkVMT0NBVEFCTEVfTElCIGFuZCBub3QgYWxzbyBFRl9QUENfUkVMT0NBVEFCTEUuCi0KLVRodSBTZXAgMjEgMTY6MzA6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXQpOiBQZXJtaXQgU0VHX0FCU09MVVRFIGluIGtub3cgZXhwcmVzc2lvbi4KLQkqIGV4cHIuYyAoZXhwcik6IEFjY291bnQgZm9yIG5ldyBvcGVyYXRvclQgdmFsdWVzIGluIGtub3cKLQlleHByZXNzaW9uLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2xlYXIgZml4cC0+Znhfc3Vic3kgaWYgdGhlIHJlbG9jYXRpb24KLQlpcyBmdWxseSByZXNvbHZlZC4KLQotVGh1IFNlcCAyMSAxNDoxMTo0OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZmxhZ3MpOiBOZXcgdmFyaWFibGUgdG8gaG9sZCB0aGUgZmxhZyBiaXRzCi0JdG8gc2V0IGluIHRoZSBFTEYgaGVhZGVyLgotCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW1yZWxvY2F0YWJsZS1saWIuICBNYWtlIGJvdGgKLQktbXJlbG9jYXRhYmxlIGFuZCAtbXJlbG9jYXRhYmxlLWxpYiBzZXQgcHBjX2ZsYWdzLgotCShtZF9iZWdpbik6IFNldCBFTEYgZmxhZ3Mgd2l0aCBwcGNfZmxhZ3MuCi0KLVdlZCBTZXAgMjAgMTM6MDE6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQsIHN5bm9ueW0gZm9yCi0JcmVhbGNsZWFuLiAgQWRkIEdOVSBzdGFuZGFyZCBtYWludGFpbmVyLWNsZWFuIGVjaG9zLgotCSogZG9jL01ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uCi0KLVR1ZSBTZXAgMTkgMTE6MzE6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVqZWN0IGltbWVkaWF0ZSBvcGVyYW5kcyBmb3IgJyUnLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVqZWN0IGltbWVkaWF0ZSBvcGVyYW5kcyBmb3IgJ3wnLgotCVJlcGxhY2UgJ1AnIHdpdGggJzAnLCAnMScsIGFuZCAnMicuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQpOiBDaGFuZ2UgbGVmdHN0b3AKLQlhbmQgcmlnaHRzdG9wIHRvIG5vdCBiZSBjb25zdC4KLQkocGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogTGlrZXdpc2UuICBVc2UgbTY4a19pcF9vcCB0byBleGFtaW5lCi0JdGhlIG9wZXJhbmQsIG5vdCBtNjhrX3JlZ19wYXJzZS4KLQkoc19tcmlfaWYpOiBJbiBNUkkgbW9kZSwgc3RvcCBhdCB0aGUgZmlyc3QgJyonLgotCShzX21yaV93aGlsZSk6IExpa2V3aXNlLgotCShzX21yaV9lbHNlKTogSW4gTVJJIG1vZGUsIGlnbm9yZSB0cmFpbGluZyBjaGFyYWN0ZXJzLgotCShzX21yaV9lbmRpLCBzX21yaV9icmVhaywgc19tcmlfbmV4dCwgc19tcmlfZm9yKTogTGlrZXdpc2UuCi0JKHNfbXJpX2VuZGYsIHNfbXJpX3JlcGVhdCwgc19tcmlfdW50aWwsIHNfbXJpX2VuZHcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnk6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCi1Nb24gU2VwIDE4IDE1OjIyOjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAocGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IENoYW5nZSBsZWZ0c3RhcnQKLQlhbmQgcmlnaHRzdGFydCB0byBub3QgYmUgY29uc3QuCi0JKHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQkoYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IExpa2V3aXNlLiAgSWYgdGhlIGxlZnQgc2lkZSBvZiB0aGUKLQljb21wYXJpc29uIGlzIGEgcmVnaXN0ZXIsIGFuZCB0aGUgcmlnaHQgc2lkZSBpcyBub3QsIHN3YXAgdGhlIHR3bwotCXNpZGVzLgotCSogY29uZmlnL202OGstcGFyc2UueSAobTY4a19yZWdfcGFyc2UpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChtNjhrX3JlZ19wYXJzZSk6IERlY2xhcmUuCi0KLQkqIHJlYWQuYyAobXJpX2NvbW1lbnRfZmllbGQpOiBOZXcgZnVuY3Rpb24uCi0JKG1yaV9jb21tZW50X2VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc19hbGlnbl9ieXRlcyk6IFVzZSBtcmlfY29tbWVudF9maWVsZC4KLQkoc19hbGlnbl9wdHdvLCBzX2NvbW0sIHNfbXJpX2NvbW1vbiwgc19mYWlsLCBzX2dsb2JsKTogTGlrZXdpc2UuCi0JKHNfZmxvYXRfc3BhY2UsIHNfc3RydWN0KTogTGlrZXdpc2UuCi0JKHNfc3BhY2UpOiBVc2UgbXJpX2NvbW1lbnRfZmllbGQgcmF0aGVyIHRoYW4gZG9pbmcgaXQgYnkgaGFuZC4KLQkoY29uc193b3JrZXIsIGVxdWFscyk6IExpa2V3aXNlLgotCShzX2VuZCk6IElnbm9yZSBjb21tZW50cyBzdGFydGluZyB3aXRoICcqJyBvciAnIScuCi0JKiByZWFkLmggKG1yaV9jb21tZW50X2ZpZWxkKTogRGVjbGFyZS4KLQkobXJpX2NvbW1lbnRfZW5kKTogRGVjbGFyZS4KLQkqIGNvbmQuYyAoc19pZik6IFVzZSBtcmlfY29tbWVudF9maWVsZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfY2hpcCwgc19yZWcpOiBMaWtld2lzZS4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEhhbmRsZSBBQlMtc3ltIGluIC1zeW0gY2FzZSByYXRoZXIgdGhhbgotCXN5bS1zeW0gY2FzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuICBQZXJtaXQgbmVnYXRpdmUKLQlzeW1ib2xzIGlmIFRDX002OEsuCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19jb2ZmX2ZpeDJydHlwZSk6IElmIGZ4X3RjYml0IGlzIHNldCwgcmV0dXJuCi0JUl9SRUxMT05HX05FRy4KLQkodGNfZ2VuX3JlbG9jKTogSWYgZnhfdGNiaXQgaXMgc2V0LCBhYm9ydC4KLQkobWRfYXBwbHlfZml4XzIpOiBGb3IgYSBuZWdhdGl2ZSByZWxvYywgbW92ZSBmeF9zdWJzeSB0byBmeF9hZGRzeSwKLQlhbmQgc2V0IGZ4X3RjYml0LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX3JlZyk6IElnbm9yZSBjb21tZW50IGZpZWxkIGluIE1SSSBtb2RlLgotCi1Nb24gU2VwIDE4IDE0OjQ0OjA0IDE5OTUgIEFybmUgSC4gSnV1bCAgPGFybmVqQHB2di51bml0Lm5vPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TdW4gU2VwIDE3IDIyOjE3OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgZW5kaWFuIHRvIGxpdHRsZSBmb3IgbWlwcy0qLXVsdHJpeCouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBTZXAgMTUgMTM6MTY6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGN1cnJlbnRfbG9jYXRpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLiAgSGFuZGxlIG1hZ2ljCi0Jc3ltYm9sIGAuJzsgaW4gYWJzb2x1dGUgc2VjdGlvbiwgcmV0dXJuIGEgY29uc3RhbnQuCi0JKG9wZXJhbmQpOiBDYWxsIGN1cnJlbnRfbG9jYXRpb24gZm9yICcuJyBhbmQgJyQnLCBpbnN0ZWFkIG9mIGRvaW5nCi0JaXQgaW5saW5lLiAgSW4gTVJJIG1vZGUsIGNhbGwgY3VycmVudF9sb2NhdGlvbiBmb3IgJyonLgotCi1GcmkgU2VwIDE1IDIxOjM5OjI5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBDaGFuZ2Ugc29tZSAiQ09OU1QiIHJlZmVyZW5jZXMgdG8gImNvbnN0Ii4KLQotRnJpIFNlcCAxNSAxNzoyNzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVR1ZSBTZXAgMTIgMTc6MDg6MjMgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19zdGFiX3BhcnNlKTogc2ltcGxpZnkgZmlyc3QgbG9vcDsKLQl1c2UgU19HRVRfTkFNRS9tb2RpZnkvU19TRVRfTkFNRSBzZXF1ZW5jZSBpbnN0ZWFkIG9mIGFidXNpbmcKLQlTX0dFVF9OQU1FIHdoZW4gdXBkYXRpbmcgc3ltYm9sIG5hbWUuCi0JKGxvY2FsX3N5bWJvbHNfRFNUKTogZmlyc3QgcHJlZml4L3Bvc3RmaXggdHlwbyBmcm9tIEp1bHkgMjFzdC4KLQlbcGx1cyBjb21tZW50IHJlZm9ybWF0dGluZyAtLWtyXQotCi1XZWQgU2VwIDEzIDEyOjMzOjAzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYUEVDVCk6IE5ldyB2YXJpYWJsZS4KLQkoQ0hFQ0tGTEFHUyk6IFJlbW92ZS4KLQkoc2l0ZS5leHApOiBOZXcgdGFyZ2V0LgotCShjaGVjayk6IFJld3JpdGUgdG8gaW52b2tlIHJ1bnRlc3QgZGlyZWN0bHksIHJhdGhlciB0aGFuIHJlY3VycmluZwotCWRvd24gaW50byB0ZXN0c3VpdGUuCi0JKGNsZWFuLWhlcmUpOiBSZW1vdmUgdGVzdHN1aXRlIGRpcmVjdG9yeS4KLQkoY2xlYW4sIGRpc3RjbGVhbik6IERvbid0IHJlY3VyIGludG8gdGVzdHN1aXRlLgotCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIEFDX0NPTkZJR19TVUJESVJTKHRlc3RzdWl0ZSkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IENoYW5nZSB0byB0aGUgc2VnbWVudCB3ZSBhcmUKLQlyZWxheGluZywgaW4gY2FzZSBtZF9jb252ZXJ0X2ZyYWcsIGNhbGxlZCBieSBjdnRfZnJhZ190b19maWxsLAotCXdhbnRzIHRvIGNhbGwgZml4X25ldy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBQZXJtaXQgUEMgcmVsYXRpdmUgY29kZSBpZiB0aGUKLQlzZWdtZW50IG9mIHRoZSBzeW1ib2wgaXMgdGhlIGN1cnJlbnQgc2VnbWVudCwgbm90IGp1c3QgaW4KLQl0ZXh0X3NlY3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZ18xKTogRG9uJ3QgY2FsbCBzdWJzZWdfY2hhbmdlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IExpa2V3aXNlLgotCi1UdWUgU2VwIDEyIDEwOjM2OjQwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXRvZik6IEZpeCBkZWJ1Z2dpbmcgcHJpbnRmLCBhbmQgbGVhdmUgaXQKLQlvdXQgYnkgZGVmYXVsdC4KLQotTW9uIFNlcCAxMSAxMTozOToxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jb25maWd1cmUuaW46IFJlbW92ZSB1bnVzZWQgZmlsZS4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogR3JhYiBhbGwgYXZhaWxhYmxlIHNwYWNlcyBhdCBzdGFydCBvZgotCWxpbmUgYmVmb3JlIHByZXNlcnZpbmcgYSBzaW5nbGUgc3BhY2UuICBSZW1vdmUgc3RhdGUgPT0gMCB0ZXN0Ci0Jd2hpY2ggd2lsbCBuZXZlciBzdWNjZWVkLgotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBEZWxldGUgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlCi0JZm9ybWFsIGhhc2ggdGFibGUuCi0JKG1hY3JvX2V4cGFuZCk6IEluIE1SSSBtb2RlLCBzdG9wIHdoZW4gd2hpdGVzcGFjZSBpcyBzZWVuIGluIHRoZQotCWFyZ3VtZW50IGxpc3QuCi0KLQkqIHNiLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkqIG1hY3JvLmM6IExpa2V3aXNlLiAgQWxzbyBpbmNsdWRlIDxzdGRsaWIuaD4gaWYgaXQgZXhpc3RzLgotCi1GcmkgU2VwICA4IDAwOjI3OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSW4gTVJJIG1vZGUsIGtlZXAgYSBzcGFjZSBiZWZvcmUgYQotCXBvc3NpYmxlIGNvbW1lbnQgY2hhcmFjdGVyLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEluIE1SSSBtb2RlLCBpZ25vcmUgYW55dGhpbmcgYWZ0ZXIKLQlhbiBpbnN0cnVjdGlvbiB3aGljaCB0YWtlcyBubyBvcGVyYW5kcy4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIGdhc3AgaW4gJCh0b29sZGlyKS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBIYW5kbGUgYSBub24gemVybyBiYXNlIHJlZ2lzdGVyIGZvcgotCU1fVXtMLFN9e0QsVyxIfV9BLgotCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBQdXQgcHJvZ3JhbV9uYW1lIGFyZ3VtZW50IGluIGZpcnN0IGZwcmludGYsCi0Jbm90IHNlY29uZC4KLQotVGh1IFNlcCAgNyAxMjozMzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEhhbmRsZSAwOCBhbmQgMDkgaW4gTVJJIG1vZGUuCi0JKiBtYWNyby5jIChJU1NFUCk6IFJlbW92ZSBkdXBsaWNhdGVkIGAiJyBjaGFyYWN0ZXIuCi0gCShnZXRfYW55X3N0cmluZyk6IENvcHkgc29tZSBjaGFyYWN0ZXJzIGZvciB3aGljaCBJU1NFUCBpcyB0cnVlOgotCSc7JywgJz4nLCAnKCcsICcpJy4gIE90aGVyd2lzZSB3ZSBjYW4gZ2V0IGluIGFuIGluZmluaXRlIGxvb3AuCi0JKiByZWFkLmMgKHNfc3BhY2UpOiBJbiBNUkkgbW9kZSwgdGhlIGV4cHJlc3Npb25zIHN0b3AgYXQgdGhlIGZpcnN0Ci0JdW5xdW90ZWQgc3BhY2UuCi0JKGNvbnNfd29ya2VyKTogSW4gTVJJIG1vZGUsIHJlc3RvcmUgdGhlIHRlcm1pbmF0aW5nIGNoYXJhY3RlciBhdAotCXRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgotCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogRG9uJ3QgdXNlICNlbGlmOyBvbGQgY29tcGlsZXJzIGRvbid0Ci0Jc3VwcG9ydCBpdC4KLQotV2VkIFNlcCAgNiAyMToxMzowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEluIE1SSSBtb2RlLCBzaWxlbnRseSBlbmQgcXVvdGVkIHN0cmluZ3MKLQlhdCBuZXdsaW5lIGNoYXJhY3RlcnMuICBJbiBNUkkgbW9kZSwgYWx3YXlzIGtlZXAgc3BhY2VzIGluIHRoZQotCW9wZXJhbmRzIGZpZWxkLiAgSW4gTVJJIG1vZGUsIHRyZWF0IGEgbGluZSBjb21tZW50IGNoYXJhY3RlciBhcyBhCi0JcmVndWxhciBjb21tZW50IGNoYXJhY3RlciBmb2xsb3dpbmcgYSBzcGFjZS4KLQkqIGNvbmQuYyAoaWdub3JlX2lucHV0KTogVXNlIHN0cm5jYXNlY21wIHJhdGhlciB0aGFuIHN0cm5jbXAgd2hlbgotCWxvb2tpbmcgZm9yIHNwZWNpYWwgcHNldWRvLW9wcy4KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBJbiBNUkkgbW9kZSwgdGhlIGV4cHJlc3Npb25zIHN0b3AgYXQgdGhlCi0JZmlyc3QgdW5xdW90ZWQgc3BhY2UuCi0JKGVxdWFscyk6IExpa2V3aXNlLgotCi1XZWQgU2VwICA2IDE1OjAzOjUzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKGdldF9vcGVyYW5kcyk6IFJlYWQgdGhpcmQgYXJnIGlmIGl0IGV4aXN0cy4KLQlPdGhlcndpc2UsIGNsZWFyIGl0LgotCShnZXRfc3BlY2lmaWMsIGNhc2UgRl9GUjApOiBBZGQuCi0KLVdlZCBTZXAgIDYgMTU6MDM6NTMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoZ2V0X3NwZWNpZmljKTogRGVsZXRlIGFyZ190b190ZXN0LgotCShtZF9hc3NlbWJsZSk6IEluY3JlYXNlIG9wZXJhbmQgYXJyYXkgZnJvbSAyIHRvIDMuCi0KLVR1ZSBTZXAgIDUgMTY6NDc6MzYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBSZW1vdmUgQ1lHTlVTIExPQ0FMIGNvbW1lbnRzLgotCShtZF9iZWdpbik6IFVzZSAwLzEgaW5zdGVhZCBvZiBUUlVFL0ZBTFNFLgotCShtZF9zaG93X3VzYWdlKTogQnJlYWsgdXAgbG9uZyBmb3JtYXQgc3RyaW5nIGZvciB0aGUgYmVuZWZpdAotCW9mIGxhbWUgY29tcGlsZXJzLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfc2hvd191c2FnZSk6IERpdHRvLgotCSogZ2FzcC5jIChzaG93X3VzYWdlKTogRGl0dG8uCi0JKiBtYWNyby5jIChjaGVja19tYWNybyk6IENhc3QgcmVzdWx0IG9mIGhhc2hfZmluZC4KLQotVHVlIFNlcCAgNSAxNDo0NjozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBXaGVuIHRlc3RpbmcgZm9yIGEgZnJlZSgpIGRlY2xhcmF0aW9uIGluIHN5c3RlbQotCWhlYWRlciBmaWxlcywgY2FzdCB0aGUgYWRkcmVzcyB0byBhIGZ1bmN0aW9uIHBvaW50ZXIsIG5vdCB0byBhbgotCWludGVnZXIuCi0KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBDYWxsIFRDX0lOSVRfRklYX0RBVEEgaWYgVENfRklYX1RZUEUKLQlpcyBkZWZpbmVkLiAgRG9uJ3QgaW5pdGlhbGl6ZSBmeF9ic3IuICBWZXJpZnkgdGhhdCBmeF9zaXplIGZpZWxkCi0JaXMgd2lkZSBlbm91Z2ggdG8gaG9sZCBzdG9yZWQgdmFsdWUuCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQ2hhbmdlIHRjX2ZpeF9kYXRhIHRvIHR5cGUgVENfRklYX1RZUEUgaWYKLQl0aGF0IGlzIGRlZmluZWQsIG90aGVyd2lzZSBvbWl0IGl0LiAgRGVsZXRlIGZ4X2Jzci4gIENoYW5nZQotCWZ4X3NpemUgdG8gdW5zaWduZWQgY2hhci4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX0ZJWF9UWVBFLCBmeF9ic3IsIFRDX0lOSVRfRklYX0RBVEEpOiBOZXcKLQltYWNyb3MuCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoVENfRklYX1RZUEUsIGZ4X2JzciwgVENfSU5JVF9GSVhfREFUQSk6IE5ldwotCW1hY3Jvcy4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0ZJWF9UWVBFKTogRGVmaW5lIGFzIFBUUi4KLQotCSogY29uZmlnL3RjLWk4NjAuYyAobWRfYXBwbHlfZml4KTogRGVsZXRlIGNvZGUgZm9yIGNoZWNraW5nCi0JZnhfaW1fZGlzcCwgYW5kIGZvciBoYW5kbGluZyBub24temVybyB2YWx1ZXMsIHNpbmNlIGl0IG5ldmVyIGdldHMKLQlzZXQgYWZ0ZXIgYmVpbmcgaW5pdGlhbGl6ZWQgdG8gemVyby4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IE1ha2UgZnhfaW1fZGlzcCBhbHdheXMgMiBiaXRzLCBzaW5jZSB0aGUKLQlvbmx5IHRjLSogZmlsZXMgYWN0dWFsbHkgdXNpbmcgaXQgbmVlZCB0aGF0IG11Y2guCi0KLQlOUzMySyBjaGFuZ2VzIGZyb20gSWFuIERhbGw6Ci0JKiBjb25maWd1cmUuaW46IFRyZWF0IG5zMzJrLXBjNTMyLXV4KiBsaWtlIG5zMzJrLXBjNTMyLW1hY2gqLCBhbmQKLQluczMyay1wYzUzMi1saXRlcyogbGlrZSBuczMyay1wYzUzMi1uZXRic2QqLgotCSogY29uZmlnL3RjLW5zMzJrLmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZSB0byAxLgotCi1GcmkgU2VwICAxIDE3OjAyOjE1IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBHZXQgVENfRk9SQ0VfUkVMT0NBVElPTiB1cCB0aGUKLQlyaWdodCB3YXkhCi0KLUZyaSBTZXAgIDEgMDg6MjA6MTkgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAYmVhdXR5LmN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24sIG1kX2JlZ2luLCBtZF9zaG93X3VzYWdlKToKLQlBZGQgc3VwcG9ydCBmb3IgIi1tY3B1PXZyNDMwMCIgYXMgcHJvY2Vzc29yIGlkZW50aWZpZXIuCi0KLVRodSBBdWcgMzEgMTY6NDE6MDYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IFJlbW92ZSBjaGFuZ2Ugb2YgMjl0aC4KLQkqIGNvbmZpZy90Yy17aTM4Nixhcm19LmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBLZWVwIFJWQSByZWxvY3MuCi0KLVR1ZSBBdWcgMjkgMTk6NDI6NTggMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApIFtjYXNlIFBPU1QvUFJFL0JBU0VdOiBGaXggdHlwbyB3aGVuCi0gCWxvb2tpbmcgYXQgb3V0ZXIgZGlzcGxhY2VtZW50LiAgRG9uJ3Qgc2V0IHRoZSBwb3N0aW5kZXggYml0IGlmIHRoZQotIAlpbmRleCBzdXBwcmVzcyBiaXQgaXMgc2V0IChmb3IgbWVtb3J5IGluZGlyZWN0IGFkZHJlc3NpbmcgbW9kZSkuCi0KLVRodSBBdWcgMzEgMDY6NDk6MzcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jICh0Y19nZW5fcmVsb2MpOiBEZWxldGUgZHVwbGljYXRlZCBjb2RlLgotCi1XZWQgQXVnIDMwIDIzOjUxOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogRnJlZSBzYXZlZF9pbnB1dCB3aGVuIHRoZSBmcm9tIGJ1ZmZlcgotCWV4YWN0bHkgZmlsbHMgdGhlIHRvIGJ1ZmZlci4KLQotV2VkIEF1ZyAzMCAxMzo0NjozOSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAocGFyc2Vfa2V5d29yZF9hcmcsIHBhcnNlX2NvbnN0X2V4cHJfYXJnKTogTmV3IGZucy4KLQkoc3BhcmNfaXApOiBDYWxsIHRoZW0gZm9yIGFzaSwgbWVtYmFyLCBhbmQgcHJlZmV0Y2ggcGFyc2luZy4KLQotVHVlIEF1ZyAyOSAxNTo0NTozNyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWVtYmFyX21hc2tzKTogRGVsZXRlZC4KLQkoc3BhcmNfaXApOiBDbGVhbiB1cCBBU0kgYW5kIG1lbWJhciBzdXBwb3J0LgotCi1UdWUgQXVnIDI5IDEzOjIwOjI3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFJ2YSBpcyBuZXcgZW50cnkuCi0JKGNvbnNfd29ya2VyKTogTmV3LCBzcGxpdCBmcm9tIGNvbnMuICBIYW5kbGVzIHJ2YS4KLQkoY29ucywgc19ydmEpOiBDYWxsIGNvbnNfd29ya2VyLgotCSogcmVhZC5oIChzX3J2YSk6IE5ldyBkZWNsYXJhdGlvbi4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCB0aHJvdyBhd2F5IHJ2YSByZWxvY3MuCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeCwgdGNfZ2VuX3JlbG9jKTogSGFuZGxlIFJWQS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2NvZmZfZml4MnR5cGUpOiBIYW5kbGUgUlZBLgotCSogY29uZmlnL3RjLWkzODYuaCAoVENfQ09VTlRfUkVMT0MpOiBSZW1lbWJlciBSVkFzLgotCShUQ19SVkFfUkVMT0MpOiBOZXcgZGVmaW5pdGlvbi4KLQotU3VuIEF1ZyAyNyAxNzo0MTowNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGRvX3N3aSk6IEFsbG93IG9wdGlvbmFsIGxlYWRpbmcgJyMnLgotCi1TYXQgQXVnIDI2IDE3OjI0OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoY29tbWVudF9jaGFycyk6IElmIFRFX0RFTFRBIGlzIGRlZmluZWQsCi0JaW5jbHVkZSAnIycuCi0JKiBjb25maWcvdGMtbTY4ay5oIChOT19QU0VVRE9fRE9UKTogRGVmaW5lIGlmIFRFX0RFTFRBIGlzCi0JZGVmaW5lZC4KLQotCSogY29uZmlnL3RlLWRlbHRhLmg6IEluY2x1ZGUgb2JqLWZvcm1hdC5oLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90ZS1zeXN2MzIuaDogTGlrZXdpc2UuCi0KLQkqIGFwcC5jIChzY3J1Yl9maWxlKTogUmVtb3ZlLgotCShzY3J1Yl9mcm9tX2ZpbGUsIHNjcnViX3RvX2ZpbGUpOiBSZW1vdmUuCi0JKHNjcnViX3N0cmluZywgc2NydWJfbGFzdF9zdHJpbmcpOiBSZW1vdmUuCi0JKHNjcnViX2Zyb21fc3RyaW5nLCBzY3J1Yl90b19zdHJpbmcpOiBSZW1vdmUuCi0JKHNhdmVkX2lucHV0LCBzYXZlZF9pbnB1dF9sZW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IGFwcF9zYXZlZCk6IFJlbW92ZSBzY3J1Yl9zdHJpbmcsIHNjcnViX2xhc3Rfc3RyaW5nLCBhbmQKLQlzY3J1Yl9maWxlIGZpZWxkcy4gIEFkZCBzYXZlZF9pbnB1dCBhbmQgc2F2ZWRfaW5wdXRfbGVuIGZpZWxkcy4KLQkoYXBwX3B1c2gpOiBBZGp1c3Qgc2F2ZWQgZmllbGRzIGZvciBjaGFuZ2VzIGluIHN0cnVjdCBhcHBfc2F2ZS4KLQlJbml0aWFsaXplIHN0YXRlIGFuZCBzYXZlZF9pbnB1dC4KLQkoYXBwX3BvcCk6IEFkanVzdCBzYXZlZCBmaWVsZHMgZm9yIGNoYW5nZXMgaW4gc3RydWN0IGFwcF9zYXZlLgotCShkb19zY3J1Yl9jaGFycyk6IFJlbmFtZSBmcm9tIGRvX3NjcnViX25leHRfY2hhciBhbmQgcmV3cml0ZSB0bwotCXByb2Nlc3MgYSBidWZmZXIgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGEgY2hhcmFjdGVyIGF0IGEgdGltZS4KLQkobWFpbiwgYXNfd2Fybik6IFJlbW92ZSBvYnNvbGV0ZSB0ZXN0aW5nIGNvZGUuCi0JKiBhcy5oIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBEb24ndCBkZWNsYXJlLgotCShkb19zY3J1Yl9jaGFycyk6IERlY2xhcmUuCi0JKHNjcnViX2Zyb21fZmlsZSwgc2NydWJfZnJvbV9zdHJpbmcpOiBEb24ndCBkZWNsYXJlLgotCShzY3J1Yl90b19maWxlLCBzY3J1Yl90b19zdHJpbmcpOiBEb24ndCBkZWNsYXJlLgotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX2dldCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlcik6IENhbGwgZG9fc2NydWJfY2hhcnMgcmF0aGVyIHRoYW4KLQlkb19zY3J1Yl9uZXh0X2NoYXIuCi0JKiByZWFkLmMgKHNjcnViX3N0cmluZywgc2NydWJfc3RyaW5nX2VuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzY3J1Yl9mcm9tX3N0cmluZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhbGwgZG9fc2NydWJfY2hhcnMgcmF0aGVyIHRoYW4KLQlkb19zY3J1Yl9uZXh0X2NoYXIuCi0KLVRodSBBdWcgMjQgMTg6NTA6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKGFzX2Fib3J0KTogTmV3IGZ1bmN0aW9uLgotCSogc2IuYyAoc2JfYnVpbGQpOiBSZXZlcnQgeWVzdGVyZGF5J3MgcGF0Y2guCi0KLQkqIE1ha2VmaWxlLmluIChnYXNwLm5ldyk6IERlcGVuZCB1cG9uIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYS4KLQlKdXN0IGxpbmsgYWdhaW5zdCBsaWJpYmVydHksIG5vdCBhZ2FpbnN0ICQoTElCUykuCi0KLVdlZCBBdWcgMjMgMTU6MTg6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzYi5jIChzYl9idWlsZCk6IFVuZGVmaW5lIGFib3J0IGJlZm9yZSBjYWxsaW5nIGl0LCBzaW5jZSBnYXNwCi0JZG9lcyBub3QgcHJvdmlkZSBhc19hYm9ydC4KLQotV2VkIEF1ZyAyMyAxMDo0MDo0MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAoc2V0X3RhcmdldF9lbmRpYW4pOiBOZXcgc3RhdGljIHRvIHNheSB3aGV0aGVyCi0Jd2UndmUgaW5pdGlhbGl6ZWQgdGFyZ2V0X2JpZ19lbmRpYW4gb3Igbm90LgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgc2V0X3RhcmdldF9lbmRpYW4gaWYgd2Ugc2V0IHRoZSB2YXJpYWJsZQotCXRhcmdldF9iaWdfZW5kaWFuLgotCShtZF9iZWdpbik6IE9ubHkgc2V0IHRhcmdldF9iaWdfZW5kaWFuIGlmICFzZXRfdGFyZ2V0X2VuZGlhbi4KLQotVHVlIEF1ZyAyMiAwMzowMDozMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlTYXQgQXVnIDE5IDE4OjA4OjE2IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5oIChEU1RfU19DX1NSQ19TRVRSRUNfVywgRFNUX1NfQ19TUkNfREVGTElORVNfQik6Ci0JTmV3IG1hY3Jvcy4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiwKLQlWTVNfVEJUX1NvdXJjZV9MaW5lcyk6IE1ha2UgdHJhY2ViYWNrIGluZm8gYmUgcm9idXN0IGVub3VnaCB0bwotCWhhbmRsZSBodWdlIHNvdXJjZSBmaWxlcy4KLQkoVk1TX1RCVF9Tb3VyY2VfRmlsZSk6IFJlb3JnYW5pemUgdGhlIG5hdGl2ZS0gdnMgY3Jvc3MtYXNzZW1ibHkKLQlzdXBwb3J0IHNvIHRoYXQgYWN0dWFsIG9iamVjdCBmaWxlIG91dHB1dCBpcyBjbGVhcmVyLgotCShWTVNfVEJUX1NvdXJjZV9GaWxlOiBGYWIsIE5hbSwgRGF0ZV9YYWIsIEZpbGVfSGVhZGVyX1hhYik6Ci0JUmVwbGFjZSBzdGF0aWMgdmFyaWFibGVzIHdpdGggYXV0b21hdGljIG9uZXMuCi0KLQlTYXQgQXVnIDEyIDIwOjE4OjE1IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChNb2R1bGVfTmFtZSk6IG5ldyBmaWxlIHNjb3BlIHZhcmlhYmxlLgotCShWTVNfVEJUX01vZHVsZV9CZWdpbik6IHVzZSBpdCBpbnN0ZWFkIG9mIGxvY2FsIHZhcmlhYmxlLgotCShXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiBkaXR0bzsgYXNzaWduIGl0cyB2YWx1ZSBoZXJlLgotCShXcml0ZV9WTVNfRU9NX1JlY29yZCk6IHNlY29uZCBhcmd1bWVudCBoYXMgdHlwZSB2YWx1ZVQuCi0JKFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUpOiAgc2ltcGxpZnkgc2VhcmNoIGxvb3A7IHJldHVybgotCXR5cGUgaXMgb2Zmc2V0VDsgc2Vjb25kIGFyZ3VtZW50IGlzIHVuc2lnbmVkLgotCi0JU2F0IEp1biAxNyAxOTowNToyNSAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogbWVzc2FnZXMuYyAoYXNfcGVycm9yKTogVXNlIHhzdHJlcnJvciBpbnN0ZWFkIG9mIHN0cmVycm9yLgotCi1Nb24gQXVnIDIxIDEzOjU3OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IEFjY2VwdCAtLWRlZnN5bSBTWU09VkFMVUUuCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLjE6IERvY3VtZW50IC0tZGVmc3ltLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEluIE1SSSBtb2RlLCBkb24ndCBlbmQgdGhlCi0Jc3RhdGVtZW50IGluc2lkZSBhIHF1b3RhdGlvbi4KLQkoc19zcGFjZSk6IERvbid0IHdhcm4gYWJvdXQgYSB6ZXJvIHJlcGVhdCBjb3VudCBpbiBNUkkgbW9kZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNyYWNrX29wZXJhbmQpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgY291bnQKLQlwYXJlbnRoZXNlcyBpbnNpZGUgcXVvdGVzLgotCShtZF9hc3NlbWJsZSk6IEluIE1SSSBtb2RlLCBhbnl0aGluZyBhZnRlciB0aGUgb3BlcmFuZHMgZmllbGQgaXMgYQotCWNvbW1lbnQuCi0JKHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQpOiBBZGp1c3Qgc3RhcnQgYW5kIHN0b3AgdG8gcmVtb3ZlCi0Jc3BhY2VzLgotCShzX21yaV9mb3IpOiBMaWtld2lzZS4KLQotCSogY29uZC5jIChzX2lmZGVmKTogUmVzdG9yZSB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBzeW1ib2wgbmFtZSwKLQlpbiBjYXNlIGl0IGlzIGEgbmV3bGluZS4KLQkoc19pZik6IElmIGlnbm9yaW5nIHRoZSBjdXJyZW50IHRyZWUsIGRvbid0IHRyeSB0byBwYXJzZSB0aGUKLQlleHByZXNzaW9uLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSWYgTEVYX0lTX1NUUklOR1FVT1RFIG9yCi0JTEVYX0lTX09ORUNIQVJfUVVPVEUgaXMgc2VlbiBpbglzdGF0ZSAxMCwgcHJlc2VydmUgb25lIHNwYWNlLgotCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgaXJwLCBpcnBjLCBtYWNybywgYW5kIHJlcHQuIE1SSSBtb2RlCi0Jbm93IHN1cHBvcnRzIG1hY3JvcywgaWZjLCBpZm5jLCBpcnAsIGlycGMsIHJlcHQsIGFuZCBlbmRyLCB3aXRob3V0Ci0JdXNpbmcgZ2FzcC4KLQotCUFkZCBzdXBwb3J0IGZvciBtYWNyb3MuCi0JKiBhcy5jOiBJbmNsdWRlIHNiLmggYW5kIG1hY3JvLmguCi0JKG1heF9tYWNyb19uZXh0KTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkobWFpbik6IENhbGwgbWFjcm9faW5pdC4KLQkobWFjcm9fZXhwcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBhcy5oIChtYXhfbWFjcm9fbmVzdCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGxpbmVfbGFiZWwpOiBSZW5hbWUgZnJvbSBtcmlfbGluZV9sYWJlbC4gIENoYW5nZSBhbGwKLQl1c2VzLgotCShwb3RhYmxlKTogQWRkIGV4aXRtLCBpcnAsIGlycGMsIG1hY3JvLCBtZXhpdCwgcmVwdC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQWx3YXlzIGNsZWFyIGxpbmVfbGFiZWwgYXQgdGhlIHN0YXJ0IG9mIGEKLQlsaW5lLCBub3QganVzdCB3aGVuIGZsYWdfbXJpIG9yIExBQkVMU19XSVRIT1VUX0NPTE9OUy4gIEZpeAotCU1SSS9MQUJFTFNfV0lUSE9VVF9DT0xPTlMgaGFuZGxpbmcuICBJbiBNUkkgbW9kZSwgcGVybWl0IGxhYmVsOgotCWVxdSB2YWwuICBTZXQgbGluZV9sYWJlbCB3aGVuIGNhbGxpbmcgY29sb24uICBJbiBNUkkgbW9kZSwgYQotCWxlYWRpbmcgJy4nIGRvZXMgbm90IGltcGx5IGEgcHNldWRvLW9wLiAgQ2hlY2sgZm9yIG1hY3JvIGV4cGFuc2lvbgotCWJlZm9yZSBjYWxsaW5nIG1kX2Fzc2VtYmxlLgotCShzX2lycCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2V0X2xpbmVfc2IpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX21hY3JvKTogTmV3IGZ1bmN0aW9uLgotCShzX21leGl0KTogTmV3IGZ1bmN0aW9uLgotCShzX3JlcHQpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmggKGxpbmVfbGFiZWwpOiBSZW5hbWUgZnJvbSBtcmlfbGluZV9sYWJlbC4KLQkoc19pcnAsIHNfcmVwdCk6IERlY2xhcmUuCi0JKHNfbWFjcm8sIHNfbWV4aXQpOiBEZWNsYXJlLgotCSogaW5wdXQtc2NydWIuYzogSW5jbHVkZSBzYi5oLgotCShzYl9pbmRleCwgZnJvbV9zYik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtYWNyb19uZXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3RydWN0IGlucHV0X3NhdmUpOiBBZGQgc2JfaW5kZXggYW5kIGZyb21fc2IgZmllbGRzLiAgQ2hhbmdlCi0JbmV4dF9zYXZlZF9maWxlIGZpZWxkIHRvIGJlIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JKG5leHRfc2F2ZWRfZmlsZSk6IENoYW5nZWQgdG8gYmUgc3RydWN0IGlucHV0X3NhdmUgKi4KLQkoaW5wdXRfc2NydWJfcHVzaCk6IENoYW5nZSB0byByZXR1cm4gdHlwZSBzdHJ1Y3QgaW5wdXRfc2F2ZSAqLgotCVNhdmUgc2JfaW5kZXggYW5kIGZyb21fc2IuCi0JKGlucHV0X3NjcnViX3BvcCk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZSB0byBzdHJ1Y3QgaW5wdXRfc2F2ZSAqLgotCVJlc3RvcmUgc2JfaW5kZXggYW5kIGZyb21fc2IuCi0JKGlucHV0X3NjcnViX2luY2x1ZGVfc2IpOiBOZXcgZnVuY3Rpb24uCi0JKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogSGFuZGxlIHJlYWRpbmcgZnJvbSBmcm9tX3NiLgotCShidW1wX2xpbmVfY291bnRlcnMpOiBPbmx5IGluY3JlbWVudCBsaW5lcyBpZiBub3QgdXNpbmcgZnJvbV9zYi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG9wdF90YWJsZSk6IEFkZCBuZXN0LgotCShvcHRfbmVzdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBnYXNwLmM6IEluY2x1ZGUgc2IuaCBhbmQgbWFjcm8uaC4gIE1vdmUgYWxsIHNiIHJlbGF0ZWQgZnVuY3Rpb25zCi0JYW5kIGRlZmluaXRpb25zIHRvIHNiLmggYW5kIHNiLmMuICBNb3ZlIGFsbCBtYWNybyByZWxhdGVkCi0JZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucyB0byBtYWNyby5oIGFuZCBtYWNyby5jLgotCSogc2IuaCwgc2IuYzogTmV3IGZpbGVzLCBleHRyYWN0ZWQgZnJvbSBnYXNwLmMuCi0JKiBtYWNyby5oLCBtYWNyby5jOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChPQkpTKTogQWRkIHNiLm8gYW5kIG1hY3JvLm8KLQkoR0FTUE9CSlMpOiBEZWZpbmUuCi0JKGdhc3AubmV3KTogRGVwZW5kIHVwb24gJChHQVNQT0JKUykuICBVc2UgJChHQVNQT0JKUykgdG8gbGluay4KLQkoVEFSR19DUFVfREVQX202OGspOiBEZXBlbmQgdXBvbiBzdWJzZWdzLmguCi0JKGdhc3Aubyk6IERlcGVuZCB1cG9uIHNiLmggYW5kIG1hY3JvLmguCi0JKHNiLm8pOiBOZXcgdGFyZ2V0LgotCShtYWNyby5vKTogTmV3IHRhcmdldC4KLQkoYXMubyk6IERlcGVuZCB1cG9uIHNiLmggYW5kIG1hY3JvLmguCi0JKGlucHV0LXNjcnViLm8pOiBEZXBlbmQgdXBvbiBzYi5oLgotCShyZWFkLm8pOiBEZXBlbmQgdXBvbiBzYi5oIGFuZCBtYWNyby5oLgotCi0JKiBjb25kLmMgKGdldF9tcmlfc3RyaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19pZmMpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgaWZjIGFuZCBpZm5jLgotCSogcmVhZC5oIChzX2lmYyk6IERlY2xhcmUuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IEluIE1SSSBtb2RlLCBzZXQgbGV4IG9mICcgdG8KLQlMRVhfSVNfU1RSSU5HUVVPVEUuCi0KLU1vbiBBdWcgMjEgMTM6NDE6MzMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBBbGxvdyBASEEsIEBMLCBhbmQgQEggc3VmZml4ZXMgb24KLQljb25zdGFudCBleHByZXNzaW9ucy4KLQotU3VuIEF1ZyAyMCAxNTo1NDozNyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfcmVsb2Nfc2l6ZSk6IEFkZCBjb25zdCB0byBkZWNsYXJhdGlvbi4KLQotRnJpIEF1ZyAxOCAxMDo1ODowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19pbmNsdWRlKTogSW4gTVJJIG1vZGUsIGRvbid0IGV4cGVjdCBxdW90ZXMgYXJvdW5kIHRoZQotCWZpbGUgbmFtZS4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ190aXRsZSk6IERvbid0IHJlcXVpcmUgdGhlIHRpdGxlIHRvIGJlIHF1b3RlZC4KLQotCSogZ2FzcC5jIChpbmNsdWRlX3ByaW50X3doZXJlX2xpbmUpOiBBbHdheXMgc3VidHJhY3QgMSBmcm9tCi0JbGluZWNvdW50IGJlZm9yZSBwcmludGluZyBpdC4KLQkocHJvY2Vzc19maWxlKTogSW4gTVJJIG1vZGUsIGxpbmVzIGJlZ2lubmluZyB3aXRoICcqJyBvciAnIScgYXJlCi0JY29tbWVudHMuCi0JKGRvX3JlZyk6IEluIE1SSSBtb2RlLCBkb24ndCByZXF1aXJlIHBhcmVudGhlc2VzLgotCShkb19pbmNsdWRlKTogSW4gTVJJIG1vZGUsIGRvbid0IHJlcXVpcmVzIHF1b3Rlcy4gIElmIHRoZSBmaWxlIGNhbgotCW5vdCBiZSBmb3VuZCBpbiB0aGUgaW5jbHVkZSBwYXRoLCB0cnkgb3BlbmluZyBpdCBpbiB0aGUgY3VycmVudAotCWRpcmVjdG9yeS4gIFByaW50IHRoZSBmaWxlIG5hbWUgY29ycmVjdGx5IGluIHRoZSBlcnJvciBtZXNzYWdlLgotCShjaGFydHlwZV9pbml0KTogSW4gTVJJIG1vZGUsIHNldCBGSVJTVEJJVCBmb3IgJy4nLgotCShtYWluKTogU2V0IGNvbW1lbnRfY2hhciB0byAnOycgd2hlbiBlbnRlcmluZyBNUkkgbW9kZS4KLQotCSogY29uZmlnL3RjLW02OGsuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKG02OGtfaXApOiBQYXNzIDY0IHJhdGhlciB0aGFuIC0xIHRvIGFkZF9GaXggaW4gJ0InICdCJyBjYXNlLgotCShtZF9wY3JlbF9mcm9tKTogSWYgZnhfcGNyZWxfYWRqdXN0IGlzIDY0LCB1c2UgLTEgaW5zdGVhZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRm9yIE9CSl9BT1VUIGNhc2UsIGFkanVzdAotCUJGRF9SRUxPQ18xNiBhbmQgQkZEX1JFTE9DXzMyIHJlbG9jcy4KLQotV2VkIEF1ZyAxNiAxNDo0ODo0NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGFsbG9jYSk6IFVzZSB2b2lkKiBkZWNsYXJhdGlvbiBvbiBIUC9VWC4KLQotV2VkIEF1ZyAxNiAxMjo0OToxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBJZiBQSUMsIG9ubHkgY2hhbmdlIFBDUkVMX1MyCi0JdG8gV1BMVDMwIGZvciBhbiB1bmRlZmluZWQgb3IgZXh0ZXJuYWwgc3ltYm9sLiAgRG9uJ3QgY29uc2lkZXIKLQlQQzEwIG9yIFBDMjIgdG8gYmUgYSBQQyByZWxhdGl2ZSByZWxvYyB3aGVuIGNob29zaW5nIGJldHdlZW4KLQlmeF9hZGRudW1iZXIgYW5kIGZ4X29mZnNldC4KLQotCSogY29uZmlnL3RjLXo4ay5jIChtZF9udW1iZXJfdG9fY2hhcnMpOiBEb24ndCBkbyBpdCBoZXJlLCBjYWxsCi0JbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbi4KLQkqIGNvbmZpZy90Yy16OGsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEFkZCBzdXBwb3J0IGZvciAuc3RhcnRvZi4gYW5kIC5zaXplb2YuIGJ5Ci0JdXNpbmcgbWFnaWMgc3ltYm9sIG5hbWVzIHdoaWNoIHRoZSBsaW5rZXIgd2lsbCByZWNvZ25pemUKLQlzcGVjaWFsbHkuCi0JKiBkb2MvYXMudGV4aW5mbzogVGFrZSBvdXQgbm90ZSB0aGF0IC5zdGFydG9mLiBhbmQgLnNpemVvZi4gYXJlCi0Jbm90IHN1cHBvcnRlZC4KLQotVHVlIEF1ZyAxNSAxNTowODo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBNUkkgc3RydWN0dXJlZCBjb250cm9sCi0JZGlyZWN0aXZlczogaWYsIGlmLmIsIGlmLncsIGlmLmwsIGVsc2UsIGVsc2UucywgZWxzZS5sLCBlbmRpLAotCWJyZWFrLCBicmVhay5zLCBicmVhay5sLCBuZXh0LCBuZXh0LnMsIG5leHQubCwgZm9yLCBmb3IuYiwgZm9yLncsCi0JZm9yLmwsIGVuZGYsIHJlcGVhdCwgdW50aWwsIHVudGlsLmIsIHVudGlsLncsIHVudGlsLmwsIHdoaWxlLAotCXdoaWxlLmIsIHdoaWxlLncsIHdoaWxlLmwsIGVuZHcuCi0JKGVudW0gbXJpX2NvbnRyb2xfdHlwZSk6IERlZmluZS4KLQkoc3RydWN0IG1yaV9jb250cm9sX2luZm8pOiBEZWZpbmUuCi0JKG1yaV9jb250cm9sX3N0YWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobXJpX2NvbnRyb2xfaW5kZXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfY29udHJvbF9sYWJlbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHB1c2hfbXJpX2NvbnRyb2wsIHBvcF9tcmlfY29udHJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShwYXJzZV9tcmlfY29uZGl0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN3YXBfbXJpX2NvbmRpdGlvbiwgcmV2ZXJzZV9tcmlfY29uZGl0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19tcmlfaWYsIHNfbXJpX2Vsc2UsIHNfbXJpX2VuZGkpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19tcmlfYnJlYWssIHNfbXJpX25leHQpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19tcmlfZm9yLCBzX21yaV9lbmRmKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNfbXJpX3JlcGVhdCwgc19tcmlfdW50aWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19tcmlfd2hpbGUsIHNfbXJpX2VuZHcpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkqIGdhc3AuYyAobXJpa2luZm8pOiBSZW1vdmUgSUYuCi0JKiBleHByLmMgKGdldF9zeW1ib2xfZW5kKTogQWNjZXB0IFwwMDEgYXMgcGFydCBvZiBhIG5hbWUuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGFuZ2UgcGFyYW1ldGVyIHRvIGNvbnN0IGNoYXIgKi4KLQkqIHN5bWJvbHMuaCAoY29sb24pOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLU1vbiBBdWcgMTQgMjA6NTE6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IEFsd2F5cyBkbyBpdCB0aGUgQkZEX0ZBU1RfU0VDVElPTl9GSUxMCi0Jd2F5LiAgUmVmb3JtYXQgYW5kIHJlaW5kZW50IHRoYXQgY29kZSB0byBHTlUgc3RhbmRhcmRzLgotCShCRkRfRkFTVF9TRUNUSU9OX0ZJTEwpOiBEb24ndCBkZWZpbmUuCi0KLU1vbiBBdWcgMTQgMTQ6MDg6MDcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvbid0IHRyeSB0byBhcHBseSBCRUdJTl9CUlRBQgotCW9yIEVORF9CUlRBQiBmaXh1cHMuCi0KLU1vbiBBdWcgMTQgMTU6NDU6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKGRvX2FsaWduLCBnZXRfYW55X3N0cmluZyk6IE1hcmsgYXMgc3RhdGljLgotCShkb19hc3NpZ25hLCBkb19hc3NpZ25jLCBuZXdfZmlsZSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX3JlZyk6IFJlbmFtZSBsb2NhbCBvcCB0byByb3AgdG8gYXZvaWQKLQljb25mdXNpb24gd2l0aCBtYWNybyBvcC4KLQotCSogZ2FzcC5jIChzdHJpcF9jb21tZW50cyk6IENvbW1lbnQgb3V0OyBpdCdzIG5vdCB1c2VkLgotCShkb19lbmQpOiBBZGQgcGFyYW1ldGVyLiAgSW4gTVJJIG1vZGUsIHByaW50IGl0IG91dC4KLQkoZG9faXJwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3ViX2FjdHVhbCk6IENoYW5nZSBwYXJhbWV0ZXIgbSB0byBmb3JtYWxfaGFzaCwgY2hhbmdpbmcgdHlwZQotCWZyb20gbWFjcm9fZW50cnloICogdG8gaGFzaF90YWJsZSAqLgotCShtYWNyb19leHBhbmRfYm9keSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQltYWNyb19leHBhbmQuCi0JKG1hY3JvX2V4cGFuZCk6IENhbGwgbWFjcm9fZXhwYW5kX2JvZHkuCi0JKEtfKik6IEZ1bGx5IHBhcmVudGhlc2l6ZS4KLQkoS19JUlAsIEtfSVJQQyk6IERlZmluZS4KLQkobXJpa2luZm8pOiBBZGQgSVJQIGFuZCBJUlBDLgotCShwcm9jZXNzX3BzZXVkb19vcCk6IEluIE1SSSBtb2RlLCBwcmludCBvdXQgRU5EIHBzZXVkby1vcC4gIFBhc3MKLQlsaW5lIHRvIGRvX2VuZC4gIEhhbmRsZSBLX0lSUCBhbmQgS19JUlBDLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX29wdCk6IFJlc2V0ICppbnB1dF9saW5lX3BvaW50ZXIgZXZlbiBpZiB3ZQotCWRvbid0IGRvIGFueXRoaW5nIHdpdGggdGhlIG9wdGlvbi4KLQotU3VuIEF1ZyAxMyAxNzowMzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfYWxpZ24pOiBIYW5kbGUgYWJzb2x1dGVfc2VjdGlvbi4KLQkqIHdyaXRlLmMgKHJlY29yZF9hbGlnbm1lbnQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBTa2lwIGluc25zIHdpdGggYW4gaW5hcHByb3ByaWF0ZQotCUlTQSBsZXZlbC4KLQotU3VuIEF1ZyAxMyAwMDozNTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yCi0JImJlZ2luX2JydGFiIiBhbmQgImVuZF9icnRhYiIgcHNldWRvLW9wcy4KLQkocGFfYnJ0YWIpOiBOZXcgZnVuY3Rpb24uCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgUl9CRUdJTl9CUlRBQiBhbmQgUl9FTkRfQlJUQUIuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb25zIGZvciBCUlRBQiBmaXh1cHMKLQl3aGVuIE9CSl9TT00gaXMgZGVmaW5lZC4KLQotRnJpIEF1ZyAxMSAyMDozNDowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChURV9PQkpTKTogQWRkIGVtcHR5IGRlZmluaXRpb24uCi0KLUZyaSBBdWcgMTEgMTk6MTY6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKGNoYW5nZV9iYXNlKTogRG9uJ3QgdHJlYXQgJyBzcGVjaWFsbHkgaW4gTVJJIG1vZGUuCi0JKHByb2Nlc3NfZmlsZSk6IERvbid0IHdhcm4gYWJvdXQgbWlzc2luZyBFTkQgaW4gTVJJIG1vZGUuCi0JKGRvX2lmKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2V0X21yaV9zdHJpbmcsIGRvX2lmYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShidWZmZXJfYW5kX25lc3QpOiBUcmVhdCBNUkkgbW9kZSBsaWtlIGFsdGVybmF0ZSBzeW50YXggbW9kZS4KLQkoZG9fYWVuZHIpOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSBpbiBNUkkgbW9kZS4KLQkoZG9fYXJlcGVhdCk6IFVzZSBSRVBUL0VORFIgaW4gTVJJIG1vZGUuCi0JKGRvX2Zvcm1hbHMpOiBJbiBNUkkgbW9kZSwgYWRkIHNwZWNpYWwgTkFSRyBmb3JtYWwuCi0JKG1hY3JvX2V4cGFuZCk6IFZhcmlvdXMgY2hhbmdlcyBmb3IgTVJJIG1vZGU6IHBlcm1pdCBhIHF1YWxpZmllcgotCW9uIHRoZSBtYWNybyBuYW1lOyBzZXQgc3BlY2lhbCBOQVJHIGZvcm1hbDsgcGVybWl0IHVubmFtZWQKLQlwb3NpdGlvbmFsIGFyZ3VtZW50czsgdXNlICYmIHRvIGNvbmNhdGVuYXRlIG5hbWVkIHBhcmFtZXRlcnM7Ci0JcGVybWl0IFxkIHRvIHNwZWNpZnkgYW4gdW5uYW1lZCBwYXJhbWV0ZXI7IHBlcm1pdCBuYW1lZCBwYXJhbWV0ZXJzCi0JdG8gbm90IHN0YXJ0IHdpdGggXDsgdXNlID09IHRvIHNlZSBpZiBhIHBhcmFtZXRlciBleGlzdHMuCi0JKGdldHN0cmluZyk6IEluIE1SSSBtb2RlLCBhbGxvdyA8PiB0byBxdW90ZSBhIHN0cmluZy4KLQkoS19JRkVRLCBLX0lGTkUsIEtfSUZMVCwgS19JRkxFLCBLX0lGR0UsIEtfSUZHVCk6IERlZmluZS4KLQkoS19JRkMsIEtfSUZOQyk6IERlZmluZS4KLQkoc3RydWN0IGtleXdvcmQpOiBOYW1lIHN0cnVjdHVyZSB1c2VkIGluIGtpbmZvIGFycmF5LgotCShtcmlraW5mbyk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKHByb2Nlc3NfcHNldWRvX29wKTogRG9uJ3QgcmVxdWlyZSBsZWFkaW5nICcuJyBpbiBNUkkgbW9kZS4KLQlIYW5kbGUgbmV3IE1SSSBwc2V1ZG8tb3AgZGVmaW5pdGlvbnMuCi0JKGFkZF9rZXl3b3JkKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiBwcm9jZXNzX2luaXQuCi0JKHByb2Nlc3NfaW5pdCk6IFVzZSBhZGRfa2V5d29yZC4gIEluIE1SSSBtb2RlLCBhZGQgbXJpa2luZm8gdGFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAibXJpIi4KLQkoc2hvd191c2FnZSk6IE1lbnRpb24gLU0vLS1tcmkuCi0JKG1haW4pOiBDYWxsIHByb2Nlc3NfaW5pdCBhZnRlciBwcm9jZXNzaW5nIGFyZ3VtZW50cy4gIEhhbmRsZSAtTS4KLQkqIGRvYy9nYXNwLnRleGk6IERvY3VtZW50IC1NLy0tbXJpLgotCi0JKiBnYXNwLmM6IEluY2x1ZGUgYW5zaWRlY2wuaC4gIE1ha2UgYWxsIGxvY2FsIGZ1bmN0aW9ucyBzdGF0aWMuCi0gICAgICAgIEFkZCBwcm90b3R5cGVzIGZvciBhbGwgc3RhdGljIGZ1bmN0aW9ucy4KLQkobXJpKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoc2JfYWRkX2NoYXIpOiBDaGFuZ2UgcGFyYW1ldGVyIGMgZnJvbSBjaGFyIHRvIGludC4KLQkoc2JfYWRkX3N0cmluZyk6IE1ha2UgcGFyYW1ldGVyIHMgaW50byBhIGNvbnN0IHBvaW50ZXIuCi0JKHNiX2FkZF9idWZmZXIpOiBMaWtld2lzZS4KLQkoY2hlY2tjb25zdCk6IENoYW5nZSBwYXJhbWV0ZXIgb3AgZnJvbSBjaGFyIHRvIGludC4KLQkoZXhwX2dldF9hYnMpOiBNYWtlIHBhcmFtZXRlciBlbXNnIGludG8gYSBjb25zdCBwb2ludGVyLgotCShkb19yZXMpOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGUgZnJvbSBjaGFyIHRvIGludC4KLQkoYnVmZmVyX2FuZF9uZXN0KTogTWFrZSBwYXJhbWV0ZXJzIGZyb20gYW5kIHRvIGludG8gY29uc3QKLQlwb2ludGVycy4KLQkoZG9fc2RhdGEpOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGUgZnJvbSBjaGFyIHRvIGludC4KLQkobmV3X2ZpbGUpOiBNYWtlIHBhcmFtZXRlciBuYW1lIGludG8gYSBjb25zdCBwb2ludGVyLgotCShkb19kZWZpbmUpOiBNYWtlIHBhcmFtZXRlciBzdHJpbmcgaW50byBhIGNvbnN0IHBvaW50ZXIuCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9udW1iZXJfdG9fY2hhcnMpOiBEb24ndCBkbyBpdCBoZXJlLCBjYWxsCi0JbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbi4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQotRnJpIEF1ZyAxMSAxMzoyMzo1NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEFkZCBuZXcgZmllbGQgZnhfbm9fb3ZlcmZsb3cuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBmeF9ub19vdmVyZmxvdyBpcyBub24temVybywgZG9uJ3QKLQljb21wbGFpbiBpZiB0aGUgYWRkZW5kIGlzIHRvbyBsYXJnZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IFNldCBmeF9ub19vdmVyZmxvdyBpZiB0aGUgaGFsZgotCXdvcmQgcmVsb2NhdGlvbnMgQkZEX1JFTE9DX3tMTzE2LEhJMTYsSEkxNl9TfS4KLQotVGh1IEF1ZyAxMCAyMDo1NjozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX21yaV9zZWN0KSBbQkZEX0FTU0VNQkxFUl06IEZpeCB0eXBvcyBpbiBjaG9vc2luZyBhbmQKLQlzZXR0aW5nIHNlY3Rpb24gZmxhZ3MuCi0KLVRodSBBdWcgMTAgMDA6Mzg6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24gZm9yIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuCi0JKiBkb2MvYXMuMTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBXaGVuIHJlY29nbml6aW5nICcjJywgdXNlIGlzYnl0ZSBhbmQKLQlpd29yZCByYXRoZXIgdGhhbiBleHByOCBhbmQgZXhwcjE2LiAgV2hlbiByZWNvZ25pemluZyAnTScsIHVzZQotCWlzc2J5dGUgcmF0aGVyIHRoYW4gZXhwcjguICBXaGVuIHJlY29nbml6aW5nICdRJyBhbmQgJ3QnLCBqdXN0Ci0JY2hlY2sgZm9yIE9fY29uc3RhbnQgcmF0aGVyIHRoYW4gdXNpbmcgZXhwcjguCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChleHByOCwgZXhwcjE2KTogRG9uJ3QgZGVmaW5lLgotCSogTWFrZWZpbGUuaW4gKG02OGstcGFyc2Uubyk6IERlcGVuZCB1cG9uIG02OGstcGFyc2UuaCwgbm90Ci0JbTY4ay1wYXJzZS55LgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgc3BjLCB0dGwsIHhjb20sIHhyZWYuCi0JKHNfbXJpX3NlY3QpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmggKHNfbXJpX3NlY3QpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pIChib3RoIHZlcnNpb25zKTogSW4gTVJJCi0JbW9kZSwgY2FsbCBzX21yaV9zZWN0LgotCShvYmpfcHNldWRvX3RhYmxlKTogQWRkIHNlY3QucyBhbmQgc2VjdGlvbi5zLiAgTW92ZSBzZWN0IG91dHNpZGUKLQlvZiBpZm5kZWYgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9wc2V1ZG9fdGFibGUpOiBBZGQgc2VjdGlvbi5zLCBzZWN0LAotCXNlY3Qucy4KLQkob2JqX2VsZl9zZWN0aW9uKTogSW4gTVJJIG1vZGUsIGNhbGwgc19tcmlfc2VjdC4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCByZXN0b3JlLCBzYXZlLgotCShzdHJ1Y3Qgc2F2ZV9vcHRzKTogRGVmaW5lLgotCShzYXZlX3N0YWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19zYXZlLCBzX3Jlc3RvcmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQotCSogcmVhZC5jIChzX3NldCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcHRyLgotCShoZXhfZmxvYXQpOiBDaGVjayB0YXJnZXRfYmlnX2VuZGlhbi4KLQkoZXF1YWxzKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBwLgotCi0JKiBjb25maWcvdGMtYTI5ay5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWk4NjAuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tODhrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXRhaG9lLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKGxpdHRsZSk6IFNldCB0YXJnZXRfYmlnX2VuZGlhbi4KLQkobWRfYmVnaW4pOiBMaWtld2lzZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuCi0JKGJ1aWxkX3JlbGF4KTogQ2hlY2sgdGFyZ2V0X2JpZ19lbmRpYW4gcmF0aGVyIHRoYW4gc2hsLgotCShidWlsZF9NeXRlcywgbWRfYXRvZik6IExpa2V3aXNlLgotCShtZF9jb252ZXJ0X2ZyYWcsIG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBMaWtld2lzZS4KLQkKLVdlZCBBdWcgIDkgMTA6NTE6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2Fic3BjYWRkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobTY4a19xdWljayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG02OGtfcmVsMzIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgb3B0IGFuZCByZWcuCi0JKG02OGtfaXApOiBQZXJtaXQgYWJzb2x1dGUgc3ltYm9scyBpbiAnbCcvJ0wnIHJlY29nbml0aW9uLiAgQ2hlY2sKLQltNjhrX3F1aWNrIGluICdNJyBhbmQgJ1EnIHJlY29nbml0aW9uLiAgQ2hlY2sgbTY4a19hYnNwY2FkZCBpbgotCURJU1AgaGFuZGxpbmcuICBDaGVjayBtNjhrX3JlbDMyIGluIEJBU0UvUE9TVC9QUkUgaGFuZGxpbmcuCi0JKG1kX2JlZ2luKTogSW4gTVJJIG1vZGUsIGluaXRpYWxpemUgbTY4a19hYnNwY2FkZCBhbmQgbTY4a19yZWwzMi4KLQlJbiBNUkkgbW9kZSwgY2hhbmdlIHVuc2l6ZWQgYnJhbmNoIGFsaWFzZXMgdG8gYmUgdmFyaWFibGUgc2l6ZWQuCi0JKHN0cnVjdCBvcHRfYWN0aW9uKTogRGVmaW5lLgotCShvcHRfdGFibGUpOiBEZWZpbmUuCi0JKHNfb3B0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2tpcF90b19jb21tYSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9wdF9jaGlwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3B0X2xpc3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvcHRfbGlzdF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19yZWcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogYXMuaCAoZmxhZ19rZWVwX2xvY2Fscyk6IENoYW5nZSBmcm9tIHVuc2lnbmVkIGNoYXIgdG8gaW50LgotCShmbGFnX25vX3dhcm5pbmdzKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAobXJpX2xpbmVfbGFiZWwpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKHBvdGFibGUpOiBBZGQgbm9wYWdlLCBwYWdlLCBwbGVuLgotCShzX29yZyk6IEVycm9yIGlmIGluIE1SSSBtb2RlLgotCSogcmVhZC5oIChtcmlfbGluZV9sYWJlbCk6IERlY2xhcmUuCi0JKiBsaXN0aW5nLmMgKGxpc3Rpbmdfbm9wYWdlKTogTmV3IGZ1bmN0aW9uLgotCSogbGlzdGluZy5oIChsaXN0aW5nX25vcGFnZSk6IERlY2xhcmUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2JlZ2luKTogU2V0IHN5X2ZyYWcgb2YgYWJzX3N5bWJvbCB0bwotCSZ6ZXJvX2FkZHJlc3NfZnJhZy4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBDaGVjayB0aGF0IHN5bWJvbCBpcyBub3QgTlVMTAotCWJlZm9yZSBjaGVja2luZyBzeV9tcmlfY29tbW9uLgotCShmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKGFic19zZWN0aW9uX29mZnNldCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHBvdGFibGUpOiBBZGQgb2Zmc2V0LCBzdHJ1Y3QuCi0JKGRvX29yZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb247IGhhbmRsZSBjaGFuZ2luZyB0aGUgb3JpZ2luIGluIHRoZQotCWFic29sdXRlIHNlY3Rpb24uCi0JKHNfb3JnKTogVXNlIGRvX29yZy4KLQkoc19zZXQpOiBMaWtld2lzZS4KLQkoZXF1YWxzKTogTGlrZXdpc2UuCi0JKHNfc3BhY2UpOiBJbiBhYnNvbHV0ZV9zZWN0aW9uLCBqdXN0IGluY3JlYXNlIGFic19zZWN0aW9uX29mZnNldC4KLQkoc19zdHJ1Y3QpOiBOZXcgZnVuY3Rpb24uCi0JKGVtaXRfZXhwcik6IEhhbmRsZSBhYnNvbHV0ZV9zZWN0aW9uIHNwZWNpYWxseS4KLQkqIHJlYWQuaCAoYWJzX3NlY3Rpb25fb2Zmc2V0KTogRGVjbGFyZS4KLQkoc19zdHJ1Y3QpOiBEZWNsYXJlLgotCSogZnJhZ3MuYyAoZnJhZ19tb3JlKTogV2FybiBpZiBpbiBhYnNvbHV0ZV9zZWN0aW9uLgotCShmcmFnX25vd19maXgpOiBJbiBhYnNvbHV0ZV9zZWN0aW9uLCByZXR1cm4gYWJzX3NlY3Rpb25fb2Zmc2V0LgotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogSWYgc3dpdGNoaW5nIHRvIGFic29sdXRlX3NlY3Rpb24sCi0JanVzdCBzZXQgbm93X3NlZyBhbmQgbm93X3N1YnNlZy4KLQkoc3Vic2VnX3NldF9yZXN0KTogU3BlY2lhbCBoYW5kbGluZyB3aGVuIHN3aXRjaGluZyB0byBvciBmcm9tCi0JYWJzb2x1dGVfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19mbG9hdF9jb3BudW0pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZm9wdCBhbmQgbWFzazIuCi0JKG02OGtfaXApOiBVc2UgbTY4a19mbG9hdF9jb3BudW0sIG5vdCBDT1BOVU0sIHdoZW4gc2V0dGluZwotCWNvcHJvY2Vzc29yIHJlZ2lzdGVyIHRvIHVzZS4gIEluIGNhc2UgJ0knIHdoZW4gY2hlY2tpbmcgb3BlcmFuZHMsCi0JY29ycmVjdCBjb3Byb2Nlc3NvciByZWdpc3RlciBudW1iZXJzLiAgSW4gY2FzZSAnSScgd2hlbiBzZXR0aW5nCi0Jb3BlcmFuZHMsIGRvbid0IGFkZCAxLgotCShzX2ZvcHQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlnL202OGstcGFyc2UuaCAoQ09QTlVNKTogRG9uJ3QgZGVmaW5lLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgaWZlcSwgaWZnZSwgaWZndCwgaWZsZSwgaWZsdCwgaWZuZS4KLQlDaGFuZ2UgaWYgdG8gcGFzcyBPX25lIHRvIHNfaWYuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IERvbid0IGRlZmluZSBhbiBsYWJlbCB3aXRob3V0IGEgY29sb24gaWYKLQlpZ25vcmVfaW5wdXQgcmV0dXJucyB0cnVlLgotCSogY29uZC5jIChzX2lmKTogVHJlYXQgYXJndW1lbnQgYXMgYW4gb3BlcmF0b3JUIGRlc2NyaWJpbmcgaG93IHRvCi0JY29tcGFyZSB0aGUgYXJndW1lbnQgYWdhaW5zdCB6ZXJvLgotCShpZ25vcmVfaW5wdXQpOiBEb24ndCByZXF1aXJlIGFuIGluaXRpYWwgZG90IGluIE1SSSBtb2RlLCBvciBpZgotCU5PX1BTRVVET19ET1QgaXMgZGVmaW5lZC4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGRjYiwgZGNiLmIsIGRjYi5kLCBkY2IubCwgZGNiLnMsIGRjYi53LAotCWRjYi54LCBkcy5kLCBkcy5wLCBkcy5zLCBkcy54LCBlbHNlYywgZW5kYywgZmFpbCwgZm9ybWF0LCBsbGVuLAotCW5vZm9ybWF0LgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiBwc2V1ZG8tb3AgaGFuZGxlciBpcyBzX2VuZCwgcXVpdAotCWltbWVkaWF0ZWx5LgotCShzX2VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc19mYWlsKTogTmV3IGZ1bmN0aW9uLgotCShzX2Zsb2F0X3NwYWNlKTogTmV3IGZ1bmN0aW9uLgotCShoZXhfZmxvYXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmbG9hdF9jb25zKTogVXNlIGhleF9mbG9hdC4KLQkqIHJlYWQuaCAoc19mYWlsKTogRGVjbGFyZS4KLQkoc19mbG9hdF9zcGFjZSk6IERlY2xhcmUuCi0JKiBjb25kLmMgKHNfZW5kKTogUmVtb3ZlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX3BzaXplKTogVHJlYXQgYXJndW1lbnQgYXMgaW5kaWNhdGluZyB3aGV0aGVyCi0JYSBoZWlnaHQgaXMgZXhwZWN0ZWQuCi0KLQkqIHJlYWQuYyAobXJpX3BlbmRpbmdfYWxpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBIYW5kbGUgbXJpX3BlbmRpbmdfYWxpZ24uCi0JKGNvbnMpOiBTZXQgbXJpX3BlbmRpbmdfYWxpZ24gaWYgYXBwcm9wcmlhdGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogTW92ZSByYW5kb20gc3BlY2lhbCB0YXJnZXQgaGFuZGxpbmcgYmVmb3JlCi0JcG9zc2libGUgYnJlYWsuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBBdWcgIDggMjM6NDE6MjUgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWd1cmUuaW46IENvbnNpc3RlbnRseSB1c2UgJHt0YXJnZXRfY3B1X3R5cGV9IHJhdGhlciB0aGFuCi0JJHtjcHVfdHlwZX0gYWZ0ZXIgdGhlIGxvb3AuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAodGFyZy1jcHUubyk6IFVzZSBAdGFyZ2V0X2NwdV90eXBlQCByYXRoZXIgdGhhbgotCUBjcHVfdHlwZUAuCi0KLVR1ZSBBdWcgIDggMTc6Mjc6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogUmVtb3ZlIGNvbW1hIGFmdGVyIGxhc3QgZW51bWVyYXRvciB2YWx1ZS4KLQotCSogY29uZmlnL29iai12bXMuYzogU29tZSB3aGl0ZXNwYWNlIGNsZWFudXAgZnJvbSBQYXQgUmFua2luLgotCi0JKiBhcy5oIChhbGxvY2EpOiBJZiBfX1NURENfXywgZGVjbGFyZSB2b2lkKiBpbnN0ZWFkIG9mIGNoYXIqLgotCi0JV2VkIEF1ZyAgMiAxODo1NDozNyAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyLAotCUNsb3NlX1ZNU19PYmplY3RfRmlsZSk6IFJlb3JnYW5pemUgdGhlIGAjaWYgIVZNUycgY3Jvc3MtYXNzbWVibGVyCi0Jc3VwcG9ydCBjb2RlLgotCShDbG9zZV9WTVNfT2JqZWN0X0ZpbGUpOiBDYWxsIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIHRvIGZsdXNoCi0Jb3V0cHV0IGJ1ZmZlci0tanVzdCBpbiBjYXNlLS1iZWZvcmUgY2xvc2luZyB0aGUgZmlsZS4KLQotVHVlIEF1ZyAgOCAxMzowNzowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGFyY2hzKTogQWRkIDY4ZWMwMDAsIDY4aGMwMDAsIDY4aGMwMDEsCi0JNjhlYzAyMCwgNjhlYzAzMCwgNjhlYzA0MCwgYW5kIDY4MzMwLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgY2hpcCBhbmQgY29tbGluZS4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2Ugc3RyY2FzZWNtcCB3aGVuIGNvbXBhcmluZyBkZWZhdWx0X2NwdQotCWFnYWluc3QgYXJjaGl0ZWN0dXJlcy4KLQkobXJpX2NoaXAsIHNfY2hpcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IEFkZCBzeV9tcmlfY29tbW9uIGJpdC4KLQkqIHJlYWQuaCAobXJpX2NvbW9uX3N5bWJvbCk6IERlY2xhcmUuCi0JKHNfbXJpX2NvbW1vbik6IERlY2xhcmUuCi0JKiByZWFkLmMgKG1yaV9saW5lX2xhYmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobXJpX2NvbW1vbl9zeW1ib2wpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShwb3RhYmxlKTogQWRkICJjb21tb24iIGFuZCAiY29tbW9uLnMiLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBJbiBNUkkgbW9kZSwgc2V0IG1yaV9saW5lX2xhYmVsIGZvciBhIGxhYmVsCi0JYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KLQkoc19tcmlfY29tbW9uKTogTmV3IGZ1bmN0aW9uLgotCShzX3NwYWNlKTogSGFuZGxlIG1yaV9jb21tb25fc3ltYm9sLgotCSogc3ltYm9scy5jIChjb2xvbik6IENoYW5nZSByZXR1cm4gdmFsdWUgZnJvbSB2b2lkIHRvIHN5bWJvbFMgKiwKLQlhbmQgcmV0dXJuIG5ldyBzeW1ib2wuICBJZiBtcmlfY29tbW9uX3N5bWJvbCBpcyBzZXQsIGF0dGFjaCB0aGUKLQluZXcgc3ltYm9sIHRvIGl0LgotCShyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBhbiBzeV9tcmlfY29tbW9uIHN5bWJvbC4KLQkqIHN5bWJvbHMuaCAoY29sb24pOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGluIGRlY2xhcmF0aW9uLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBDbGVhciBtcmlfY29tbW9uX3N5bWJvbC4KLQkoc3Vic2VnX3NldCAoYm90aCB2ZXJzaW9ucykpOiBMaWtld2lzZS4KLQkqIGZyYWdzLmMgKGZyYWdfbW9yZSk6IFdhcm4gaWYgbXJpX2NvbW1vbl9zeW1ib2wgaXMgbm90IE5VTEwuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNraXAgc3lfbXJpX2NvbW1vbiBzeW1ib2xzLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERpc2NhcmQgc3lfbXJpX2NvbW1vbiBzeW1ib2xzLgotCShmaXh1cF9zZWdtZW50KTogQ2hhbmdlIHJlbG9jYXRpb25zIGFnYWluc3Qgc3lfbXJpX2NvbW1vbiBzeW1ib2xzCi0JdG8gYmUgYWdhaW5zdCB0aGUgY29tbW9uIHN5bWJvbCBpdHNlbGYuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoeWFua19zeW1ib2xzKTogRGlzY2FyZCBzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0JKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2UgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeV9tcmlfY29tbW9uIHN5bWJvbHMKLQl0byBiZSBhZ2FpbnN0IHRoZSBjb21tb24gc3ltYm9sIGl0c2VsZi4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogRGlzY2FyZAotCXN5X21yaV9jb21tb24gc3ltYm9scy4KLQotCSogZG9jL2MtbTY4ay50ZXhpOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgQ1BVIHNwZWNpZmljIG9wdGlvbnMsIGFuZAotCWZvciBNb3Rvcm9sYSBzeW50YXguCi0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG1vdG9yb2xhX29wZXJhbmQpOiBGb3IgKCVwYyksIHNldCBtb2RlIHRvCi0JRElTUCwgbm90IEJBU0UuCi0KLVR1ZSBBdWcgIDggMDI6MzE6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHJlbGF4X2FsaWduKTogQWRkIGV4dHJhIHBhZGRpbmcgZm9yIGxpbmtyZWxheCBvbmx5IGlmCi0JTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWSBpcyBkZWZpbmVkLgotCSogY29uZmlnL3RjLWk5NjAuaCAoTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWSk6IERlZmluZSBpdC4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoUmVsYXhhdGlvbik6IFdyaXRlIHVwIHNvbWUgc3R1ZmYgb24gbGlua2VyCi0JcmVsYXhpbmcgYW5kIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkuCi0KLU1vbiBBdWcgIDcgMTc6MTg6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55OiBOZXcgZmlsZTogYmlzb24gZ3JhbW1hciBmb3IgbTY4ayBvcGVyYW5kcywKLQlpbmNsdWRpbmcgc3VwcG9ydCBmb3IgTW90b3JvbGEgc3ludGF4LgotCSogY29uZmlnL202OGstcGFyc2UuaDogTmV3IGZpbGU7IGRlZmluaXRpb25zIHNoYXJlZCBiZXR3ZWVuCi0JbTY4ay1wYXJzZS55IGFuZCB0Yy1tNjhrLmMuCi0JKiBjb25maWcvdGMtbTY4ay5jOiBJbmNsdWRlIG02OGstcGFyc2UuaC4KLQkoZW51bSBvcGVyYW5kX3R5cGUpOiBNb3ZlIHRvIG02OGstcGFyc2UuaCwgd2hlcmUgaXQgaXMgbmFtZWQKLQltNjhrX29wZXJhbmRfdHlwZS4gIFJlbmFtZSBhbGwgdXNlcy4gIFJlYXJyYW5nZSBzb21ld2hhdC4gIEFkZAotCUZQUkVHLiAgUmVuYW1lIEFPRkYgdG8gRElTUC4gIFJlbmFtZSBBSU5EWCB0byBCQVNFLiAgUmVuYW1lIEFQT0RYCi0JdG8gUE9TVC4gIFJlbmFtZSBBUFJEWCB0byBQUkUuICBSZW1vdmUgQU1JTkQuICBSZW5hbWUgTVNDUiB0bwotCUNPTlRST0wuICBSZW1vdmUgRElORFIuCi0JKHN0cnVjdCBtNjhrX2V4cCk6IE1vdmUgdG8gbTY4ay1wYXJzZS5oLiAgUmVtb3ZlIGVfYmVnLCBlX2VuZCBhbmQKLQllX3NlZyBmaWVsZHMuICBSZW5hbWUgZV9leHAgdG8gZXhwLiAgUmVuYW1lIGVfc2l6IHRvIHNpemUsIGFuZAotCWNoYW5nZSB0eXBlIHRvIGVudW0gbTY4a19zaXplLiAgQ2hhbmdlIGFsbCB1c2VzLgotCShlbnVtIF9yZWdpc3Rlcik6IE1vdmUgdG8gbTY4ay1wYXJzZS5oLCB3aGVyZSBpdCBpcyBuYW1lZAotCW02OGtfcmVnaXN0ZXIuICBSZW5hbWUgYWxsIHVzZXMuICBBZGQgWkRBVEEwLTcgYW5kIFpBRERSMC03LgotCShzdHJ1Y3QgbTY4a19vcCk6IE1vdmUgdG8gbTY4ay1wYXJzZS5oLiAgQ2hhbmdlIGFsbCBmaWVsZHMuCi0JKHNlZyk6IERvbid0IGRlZmluZS4KLQkoYWRkX2V4cCk6IFJlbW92ZS4KLQkoRkFJTCwgT0spOiBSZW1vdmUuCi0JKG02OGtfcmVnX3BhcnNlKTogTW92ZSB0byBtNjhrLXBhcnNlLnksIGFuZCByZXdyaXRlLgotCShTS0lQX1dISVRFLCBTS0lQX1cpOiBSZW1vdmUuCi0JKHRyeV9tb3RvX2luZGV4LCB0cnlfaW5kZXgpOiBSZW1vdmUuCi0JKG02OGtfaXBfb3ApOiBNb3ZlIHRvIG02OGstcGFyc2UueSwgYW5kIHJld3JpdGUgdG8gdXNlIGdyYW1tYXIuCi0JKG1haW4pOiBSZW1vdmUgb2Jzb2xldGUgdGVzdCBmdW5jdGlvbi4KLQkobTY4a19pcCk6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHVzZSBuZXcgZ3JhbW1hci4KLQkoZ2V0X3JlZ3MpOiBSZW1vdmUuCi0JKGNyYWNrX29wZXJhbmQpOiBtNjhrX2lwX29wIG5vdyByZXR1cm5zIDAgb24gc3VjY2Vzcy4KLQkoaW5pdF90YWJsZSk6IEFkZCBzc3AsIHpkMC03IGFuZCB6YTAtNy4KLQkobWRfYXNzZW1ibGUpOiBNYWtlIGVyIGNvbnN0LiAgQ29ycmVjdCBsb29wIG92ZXIgb3BlcmFuZHMgd2hlbgotCWxvb2tpbmcgZm9yIGVycm9yIG1lc3NhZ2UuCi0JKG1kX2JlZ2luKTogU2V0IGFsdF9ub3RlbmRfdGFibGUgZm9yICcoJyBhbmQgJ0AnLgotCShnZXRfbnVtKTogRXhwcmVzc2lvbiBpcyBhbHJlYWR5IHBhcnNlZC4gIERvbid0IHNldCBzZWcuCi0JKiBjb25maWd1cmUuaW46IElmIGNwdV90eXBlIGlzIG02OGssIHB1dCBtNjhrLXBhcnNlLm8gaW4KLQlleHRyYS1vYmplY3RzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBtNjhrLXBhcnNlLmMuCi0JKEJJU09OKTogVXNlIC4uL2Jpc29uL2Jpc29uIGlmIGl0IGV4aXN0cy4KLQkoQklTT05GTEFHUyk6IERlZmluZSBhcyBlbXB0eS4KLQkoVEFSR19DUFVfREVQX202OGspOiBEZXBlbmQgdXBvbiAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaC4KLQkobTY4ay1wYXJzZS5jLCBtNjhrLXBhcnNlLm8pOiBOZXcgdGFyZ2V0cy4KLQotTW9uIEF1ZyAgNyAwMjo1NDoyMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLXNoLmMgKHBhcnNlX3JlZyk6IEhhbmRsZSBuZXcgRlAgcmVnaXN0ZXJzLgotCShnZXRfc3BlY2lmaWMpOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZXMuCi0KLUZyaSBBdWcgIDQgMTI6Mjk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wX2VuY29kaW5nKTogTWFrZSBub24tY29uc3QuICBEb24ndCBzZXQgJyInIHRvCi0gICAgICAgIE9fYml0X25vdC4KLQkoZXhwcl9iZWdpbik6IFNldCBvcF9lbmNvZGluZ1snIiddIGluIE1SSSBtb2RlLgotCi1XZWQgQXVnICAyIDE4OjM5OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYzogUmVtb3ZlIEJSRUFLX1VQX0JJR19ERUNMIHN0dWZmLgotCShzdHJ1Y3QgbTY4a19pbmNhbnQpOiBDaGFuZ2UgbV9vcGVyYW5kcyBmaWVsZCB0byBiZSBjb25zdC4KLQkoc3RydWN0IG02OGtfaXQpOiBDaGFuZ2UgYXJncyBmaWVsZCB0byBiZSBjb25zdC4KLQkobTY4a19pcCk6IENoYW5nZSBsb2NhbCB2YXJpYWJsZSBzIHRvIGJlIGNvbnN0LgotCShvcGNvZGVfcHRyKTogUmVtb3ZlLgotCShtZF9iZWdpbik6IFVzZSBtNjhrX251bW9wY29kZXMsIG5vdCBudW1vcGNvZGVzLiAgVXNlCi0JbTY4a19vcGNvZGVzLCBub3QgcmVtb3ZlZCBvcGNvZGVfcHRyLiAgVXNlIG02OGtfbnVtYWxpYXNlcywgbm90Ci0JbnVtYWxpYXNlcy4KLQotVHVlIEF1ZyAgMSAxNzozNToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBBZGQgImNvbnRyb2wiLCAic3RhdHVzIiwgImlhZGRyIiwKLQkic2ZjciIsIGFuZCAiZGZjciIgYXMgc3lub255bXMgZm9yIGV4aXN0aW5nIGVudHJpZXMuCi0JKG1kX2JlZ2luKTogSW4gTVJJIG1vZGUsIGZvcmNlIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCB0byAxLgotCShtZF9wYXJzZV9vcHRpb24pOiBSZW1vdmVkIHVudXNlZCBsb2NhbHMgaSBhbmQgYXJjaC4gIENoYW5nZSB0eXBlCi0Jb2YgYXJjaCAoYW5vdGhlciBvbmUpIHRvIHVuc2lnbmVkIGxvbmcuCi0JKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBBZGQgcmV0dXJuIGFmdGVyIGFib3J0IHRvIGF2b2lkIHdhcm5pbmcuCi0KLQlJbml0aWFsIHN1cHBvcnQgZm9yIE1SSSBzdHlsZSBsYWJlbHMgYW5kIGV4cHJlc3Npb25zLgotCSogYXMuaCAoZmxhZ19tcmkpOiBEZWNsYXJlL2RlZmluZS4KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIC1NIGFuZCBpdHMgc3lub255bSAtLW1yaS4KLQkocGFyc2VfYXJncyk6IEFkZCAnTScgdG8gc3RkX3Nob3J0b3B0cy4gIEFkZCAibXJpIiB0bwotCXN0ZF9sb25nb3B0cy4gIFNldCBmbGFnX21yaSBpZiAtTSBpcyBzZWVuLgotCShtYWluKTogQ2FsbCBwYXJzZV9hcmdzIGJlZm9yZSBpbnB1dF9zY3J1Yl9iZWdpbi4gIENhbGwKLQlleHByX2JlZ2luLgotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogRG9uJ3Qgc2V0IGxleCBmb3IgJyInIG9yICdcJycgaW4gTVJJCi0JbW9kZS4gIERvIHNldCBsZXggZm9yICc7JywgJyonLCBhbmQgJyEnIGluIE1SSSBtb2RlLgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBSZW1vdmUgTVJJIGlmZGVmIGluIExFWF9JU19XSElURVNQQUNFIGNhc2UuCi0JSW4gTVJJIG1vZGUsIGtlZXAgc3BhY2VzIGJldHdlZW4gbGFiZWxzIGFuZCBjb2xvbnMuICBSZW1vdmUgTVJJCi0JaWZuZGVmIGFyb3VuZCBMRVhfSVNfT05FQ0hBUl9RVU9URSBjYXNlLiAgSW4gTVJJIG1vZGUsIGRvbid0IHVzZQotCSchJyBvciAnKicgYXMgY29tbWVudCBjaGFyYWN0ZXJzIGV2ZW4gaWYgdGhleSBhcmUgaW4KLQljb21tZW50X2NoYXJzLgotCSogcmVhZC5oIChsZXhfdHlwZSk6IE5vIGxvbmdlciBjb25zdC4KLQkqIHJlYWQuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkobGV4X3R5cGUpOiBObyBsb25nZXIgY29uc3QuCi0JKHJlYWRfYmVnaW4pOiBJbiBNUkkgbW9kZSwgc2V0IGxleF90eXBlIG9mICc/JyB0byAzLgotCShwb3RhYmxlKTogQWRkIGRjLCBkYy5iLCBkYy5kLCBkYy5sLCBkYy5zLCBkYy53LCBkYy54LCBkcywgZHMuYiwKLQlkcy5sLCBkcy53LCBhbmQgeGRlZi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2hhbmdlIExBQkVMU19XSVRIT1VUX0NPTE9OIGlmZGVmIHRvIGNoZWNrCi0JZm9yIE1SSSBtb2RlIGF0IHJ1bnRpbWUgcmF0aGVyIHRoYW4gY29tcGlsZSB0aW1lLiAgSGFuZGxlIHRoZSBFUVUKLQlwc2V1ZG8tb3AgaW4gTVJJIG1vZGUuICBSZW1vdmUgYm9ndXMgTVJJIGlmZGVmIGFyb3VuZCBkb25lX3BzZXVkby4KLQlDaGFuZ2UgTk9fUFNFVURPX0RPVCBpZmRlZiB0byBhbHNvIHRha2UgZWZmZWN0IGZvciBNUkkgbW9kZSBhdAotCXJ1bnRpbWUuCi0JKGNvbnMpOiBJbiBNUkkgbW9kZSwgYWx3YXlzIGNhbGwgcGFyc2VfbXJpX2NvbnMgcmF0aGVyIHRoYW4KLQlUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04uCi0JKHBhcnNlX21yaV9jb25zKTogQWx3YXlzIGNvbXBpbGUsIG5vdCBqdXN0IHdoZW4gTVJJIGlzIGRlZmluZWQuCi0JQ2FsbCBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04sIG5vdCBleHByZXNzaW9uLCB3aGVuIHRoZSBpbnB1dCBpcwotCW5vdCBhIHN0cmluZyBjb25zdGFudC4gIEhhbmRsZSBBIGFuZCBFIG1vZGlmaWVycy4KLQkoZmxvYXRfY29ucyk6IEFjY2VwdCA6eHh4eCwgd2hlcmUgdGhlIHgncyBhcmUgaGV4IGRpZ2l0cy4KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogQWRkIE9fZXEsIE9fbmUsIE9fbHQsIE9fbGUsIE9fZ2UsIE9fZ3QuCi0JKGV4cHJfYmVnaW4pOiBEZWNsYXJlLgotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogSW4gTVJJIG1vZGUsIGlmIHRoZSBiYXNlIHdhcyBub3QKLQlzcGVjaWZpZWQsIGxvb2sgZm9yIGEgc3VmZml4IG9uIHRoZSBudW1iZXIgdG8gc2V0IHRoZSBiYXNlLgotCShtcmlfY2hhcl9jb25zdGFudCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9wZXJhbmQpOiBSZW1vdmUgTVJJIGlmZGVmLiAgSW4gTVJJIG1vZGUsIGRvIHZhcmlvdXMgdGhpbmdzOiBQYXNzCi0JMCBhcyB0aGUgYmFzZSB3aGVuIGNhbGxpbmcgaW50ZWdlcl9jb25zdGFudCBpZiB0aGVyZSB3YXMgbm8KLQlwcmVmaXguICBDaGVjayBmb3IgYSBoZXggY29uc3RhbnQgc3VmZml4IGlmIHdoZW4gYSBsZWFkaW5nICcwJyBpcwotCXNlZW4uICBEb24ndCBhY2NlcHQgMHggb3IgMGIgYXMgYSBwcmVmaXguICBDaGVjayBmb3IgRSdjaGFycycgYW5kCi0JQSdjaGFycycuICBIYW5kbGUgTVJJIGNoYXJhY3RlciBjb25zdGFudHMuICBUcmVhdCAnIicgYXMgdGhlCi0JdW5hcnkgYml0d2lzZSBub3Qgb3BlcmF0b3IuICBUcmVhdCAkIGFzIHRoZSBwcm9ncmFtIGNvdW50ZXIsIG9yIGFzCi0JdGhlIHByZWZpeCBmb3IgYSBoZXggY29uc3RhbnQuICBUcmVhdCAlIGFzIHRoZSBwcmVmaXggZm9yIGEgYmluYXJ5Ci0JY29uc3RhbnQgYW5kIEAgYXMgdGhlIHByZWZpeCBmb3IgYW4gb2N0YWwgY29uc3RhbnQuICBUcmVhdCA6IGFzCi0JdGhlIHByZWZpeCBmb3IgYSBoZXggY29uc3RhbnQuCi0JKG9wX2VuY29kaW5nKTogU2V0ICciJyB0byBPX2JpdF9ub3QsICc8JyB0byBPX2x0LCBhbmQgJz4nIHRvIE9fZ3QuCi0JKG9wX3JhbmspOiBObyBsb25nZXIgY29uc3QuICBDaGFuZ2UgcmFuayB2YWx1ZXMuCi0JKGV4cHJfYmVnaW4pOiBOZXcgZnVuY3Rpb24uCi0JKG9wZXJhdG9yKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZXhwcik6IFVzZSBvcGVyYXRvci4gIERvbid0IGJvdGhlciB0byBtZW50aW9uIHRoZSBvcGVyYXRvciBpbgotCXdhcm5pbmdzLiAgUmVtb3ZlIGJvZ3VzICNpZiAwIGNvZGUuICBIYW5kbGUgbmV3IG9wZXJhdG9yVCB2YWx1ZXMuCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogSW4gTVJJIG1vZGUsIGFjY2VwdCB1bmRlcnNjb3JlcwotCWFyb3VuZCB0aGUgZXhwb25lbnQgaW4gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KLQkqIHN5bWJvbHMuaCAoc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShzeW1ib2xfY3JlYXRlKTogQ2hlY2sgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZS4KLQkoc3ltYm9sX2ZpbmRfYmFzZSk6IExpa2V3aXNlLgotCShyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBuZXcgb3BlcmF0b3JUIHZhbHVlcy4KLQkocHJpbnRfZXhwcl8xKTogTGlrZXdpc2UuCi0JKFNfSVNfTE9DQUwpOiBJbiBNUkkgbW9kZSwgbmFtZXMgYmVnaW5uaW5nIHdpdGggdHdvICc/JyBjaGFyYWN0ZXJzCi0JYXJlIGxvY2FsLgotCi1UdWUgQXVnICAxIDExOjM1OjE4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHRjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IE1ha2Ugc29tZSBlcnJvciBtZXNzYWdlcyBtb3JlCi0JZXhwbGljdC4KLQotTW9uIEp1bCAzMSAyMTo0MDo0NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVNhdCBKdWwgMjkgMTg6NTU6MjMgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKENPUFlfU0hPUlQsIENPUFlfTE9ORywgUFVUX1NIT1JULCBQVVRfTE9ORyk6Ci0JTWFrZSBleHBhbnNpb24gYmUgc2FmZSBmb3IgdXNlIGluIGV4cHJlc3Npb25zLgotCShQVVRfQ09VTlRFRF9TVFJJTkcpOiBCcmFja2V0IGV4cGFuc2lvbiB3aXRoIGBkbyB7Li4ufSB3aGlsZSAoMCknCi0JcmF0aGVyIHRoYW4ganVzdCBgey4uLn0nLgotCi1Nb24gSnVsIDMxIDE4OjE5OjI2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAobWFpbik6IFBhcnNlIC1JIG9wdGlvbi4KLQkoZG9faW5jbHVkZSk6IExvb2sgdGhyb3VnaCBpbmNsdWRlIGxpc3QuCi0JKiBnYXNwLmMgKGNoYW5nZV9iYXNlKTogRG9uJ3QgbW9kaWZ5IG51bWJlcnMgaW4gc3RyaW5ncy4gCi0KLU1vbiBKdWwgMzEgMTI6MTY6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKFNVQl9TRUdNRU5UX0FMSUdOKTogRGVmaW5lLiAgRnJvbSBOaWNsYXMKLQlBbmRlcnNzb24gPG5pY2FuQGlkYS5saXUuc2U+LgotCi1UaHUgSnVsIDI3IDIwOjQ3OjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGRvIGZ1cnRoZXIgcGNyZWwKLQlwcm9jZXNzaW5nIGFmdGVyIGNvbnZlcnRpbmcgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUKLQlzYW1lIHNlZ21lbnQuICBGcm9tIEppbSBXaWxzb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWxpbnV4b2xkbGQpOiBBZGQgYXMgc3lub255bSBmb3IKLQlpMzg2LSotbGludXgqYW91dCouICBGcm9tIEZyZWQgRmlzaC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVRodSBKdWwgMjcgMTY6MTQ6NTYgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGVudW0gcHNfdHlwZSB7cHNfVEVYVCxwc19EQVRBLHBzX0NPTU1PTiwKLQlwc19DT05TVH0pOiBOZXcgY29uc3RhbnRzLgotCShWTVNfUHNlY3RfU3BlYyk6IFVzZSB0aGVtIGluc3RlYWQgb2YgbGl0ZXJhbCBzdHJpbmdzLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGUsIGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5KTogQWRqdXN0IGNhbGxlcnMuCi0KLVdlZCBKdWwgMjYgMTg6MzE6MzUgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGNvbnN0X2ZsYWcpOiBDaGFuZ2UgZnJvbSBjaGFyIHRvIHVuc2lnbmVkIGNoYXIuCi0JKiBjb25maWcvb2JqLXZtcy5oIChjb25zdF9mbGFnKTogRGl0dG8uCi0JKHN0cnVjdCBubGlzdCk6IFJlcGxhY2UgdW5pb24gbl91biBhbmQgbl91bi57bl9uYW1lLG5fbmV4dCxuX3N0cnh9Ci0JZmllbGRzIHdpdGgganVzdCBuX25hbWU7IGRlbGV0ZSBmaWVsZCBuX3ZhbHVlOyBjaGFuZ2Ugbl9vdGhlciBmcm9tCi0JY2hhciB0byB1bnNpZ25lZCBjaGFyIGFuZCBuX2Rlc2MgZnJvbSBzaG9ydCB0byBpbnQ7IGluc2VydCBleHBsaWNpdAotCXBhZGRpbmcgZm9yIGFsaWdubWVudC4KLQotTW9uIEp1bCAyNCAyMDowNjoxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5oIChzdHJ1Y3Qgc2VnX2luZm9fdHJhc2gpOiBNYWtlIGJpdGZpZWxkIHR5cGVzIHZhbGlkLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExvY2FsIGFkZF9udW1iZXIgc2hvdWxkIG5vdAotCWJlIGRlY2xhcmVkIHJlZ2lzdGVyIHNpbmNlIGl0cyBhZGRyZXNzIGlzIHRha2VuIGZvcgotCU1EX0FQUExZX0ZJWDMuCi0KLQlGcmkgSnVsIDIxIDE1OjI4OjE4IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JU3BsaXQgaHVnZSB2bXNfd3JpdGVfb2JqZWN0X2ZpbGUgcm91dGluZSBpbnRvIG1hbmFnYWJsZSBwaWVjZXMuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZtc19maXh1cF90ZXh0X3NlY3Rpb24sIHN5bnRoZXNpemVfZGF0YV9zZWdtZW50LAotCXZtc19maXh1cF9kYXRhX3NlY3Rpb24sIGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5LCBsb2NhbF9zeW1ib2xzX0RTVCwKLQl2bXNfYnVpbGRfRFNUKTogTmV3IHJvdXRpbmVzLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHRoZW0uCi0JKHN0cnVjdCB2bXNfb2JqX3N0YXRlKTogTmV3IGZpbGUgc2NvcGUgdmFyaWFibGUgdXNlZCBieSB0aGUgYWJvdmUuCi0KLU1vbiBKdWwgMjQgMTQ6MTA6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJ1c2VzIi4KLQkoc191c2VzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2hfY29mZl9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IENhbGwgc3Vic2VnX2NoYW5nZSBiZWZvcmUgY2FsbGluZyBmaXhfbmV3LgotCShzaF9oYW5kbGVfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKFNXSVRDSF9UQUJMRSk6IERlZmluZS4KLQkoc2hfZm9yY2VfcmVsb2NhdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIFJfU0hfVVNFUywgUl9TSF9DT1VOVCBhbmQgUl9TSF9BTElHTi4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBMaWtld2lzZS4gIEFsc28gaGFuZGxlIHN3aXRjaCB0YWJsZQotCWVudHJpZXMuCi0JKiBjb25maWcvdGMtc2guaCAoSEFORExFX0FMSUdOKTogRGVmaW5lLgotCShzaF9oYW5kbGVfYWxpZ24pOiBEZWNsYXJlLgotCShUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lLgotCShzaF9mb3JjZV9yZWxvY2F0aW9uKTogRGVjbGFyZS4KLQkoVENfQ09VTlRfUkVMT0MpOiBTaW1wbGlmeTsgcmVseSBvbiBUQ19GT1JDRV9SRUxPQ0FUSU9OIGluc3RlYWQuCi0JKHRjX2Zyb2JfZmlsZSk6IERlZmluZS4KLQkoc2hfY29mZl9mcm9iX2ZpbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCB0Y19mcm9iX2ZpbGUgaWYgaXQKLQlpcyBkZWZpbmVkLgotCShmaXh1cF9tZGVwcyk6IENhbGwgSEFORExFX0FMSUdOIGlmIGl0IGlzIGRlZmluZWQuCi0JKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgVENfRk9SQ0VfUkVMT0NBVElPTiB0byBkZWNpZGUgd2hldGhlciB0bwotCWNsZWFyIHRoZSBzeW1ib2wgZmllbGRzIG9mIGZpeFAuCi0KLUZyaSBKdWwgMjEgMjI6Mzg6MDAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBBZGQgc3VwcG9ydCBmb3IgUl9QUENfU0RBUkVMCi0JcmVsb2NhdGlvbi4KLQkobWRfYXBwbHlfZml4Myk6IERpdHRvLgotCi1UaHUgSnVsIDIwIDEzOjAwOjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBSZW5hbWUgYXJndW1lbnQgc2VnIHRvIHNlYywKLQlzaW5jZSBzZWcgaXMgYSBtYWNybyBuYW1lIGluIHRoaXMgZmlsZS4KLQotCSogY29uZmlndXJlLmluIChhcm0tKi1yaXNjaXgqKTogRG9uJ3Qgc2V0IGVtdWxhdGlvbi4KLQotV2VkIEp1bCAxOSAxNjowODoyOSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEVfUEUpOiBEZWxldGUuCi0JKiBjb25maWcvdGMtYXJtLmggKEJZVEVfT1JERVIpOiBEZWxldGUuCi0JKFRBUkdFVF9GT1JNQVQpOiBQcm92aWRlIHZhbHVlIGZvciBPQkpfQ09GRiBhbmQgVEVfUEUuCi0JKEFSTV9CSV9FTkRJQU4pOiBEZWZpbmUgaWYgT0JKX0NPRkYgYW5kIFRFX1BFLgotCSogY29uZmlnL3RjLWFybS5jIChieXRlX29yZGVyKTogRGVsZXRlLgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBSZWZlcmVuY2UgdGFyZ2V0X2JpZ19lbmRpYW4sIG5vdCBieXRlX29yZGVyLgotCShtZF9jaGFyc190b19udW1iZXIpOiBMaWtld2lzZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLUVCLy1FTCBpZiBBUk1fQklfRU5ESUFOLgotCShtZF9wYXJzZV9vcHRpb25zKTogUmVjb2duaXplIC1FQi8tRUwuCi0JKG1kX3Nob3dfdXNhZ2UpOiBMaXN0IC1FQi8tRUwuCi0KLVdlZCBKdWwgMTkgMTE6NDk6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKHByb2Nlc3NfYXNzaWducyk6IFVzZSB0b3VwcGVyIGJlZm9yZSBjb21wYXJpbmcgYWdhaW5zdAotCXVwcGVyIGNhc2UgbGV0dGVyLgotCSh3aGF0Y29uZCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfcmVsYXgpOiBSZW5hbWUgZnJvbSByZWxheCwgYW5kIG1ha2UgZ2xvYmFsLgotCVJlbmFtZWQgYWxsIHVzZXMuCi0JKGluc2VydCk6IFBhc3MgYSBzaXplIG9mIDIsIG5vdCA0LgotCShidWlsZF9yZWxheCk6IFJlbW92ZSB1bnVzZWQgbGVuIHZhcmlhYmxlLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtbGl0dGxlIG9wdGlvbi4KLQkobWRfY29udmVydF9mcmFnKTogQWRkIHNlZ1QgYXJndW1lbnQuICBSZXdyaXRlIHRvIGdlbmVyYXRlIHJlbG9jcwotCXJhdGhlciB0aGFuIHRvIGdlbmVyYXRlIGNvbXBsZXRlIGluc3RydWN0aW9ucyBoZXJlLgotCShtZF9hcHBseV9maXgpOiBBZGp1c3QgYW5kIGNsYXJpZnkgUl9TSF9QQ1JFTElNTThCWTQgY2FzZSBmb3IKLQljaGFuZ2VzIGluIGluc2VydCBhbmQgbWRfcGNyZWxfZnJvbS4gIEFkZCBjYXNlcyBmb3IgUl9TSF9QQ0RJU1AKLQlhbmQgUl9TSF9QQ0RJU1A4QlkyLgotCShtZF9wY3JlbF9mcm9tKTogRG9uJ3Qgc3VidHJhY3QgMSwgYWRkIDIuCi0JKHRjX2NvZmZfZml4MnJ0eXBlKTogUmVtb3ZlLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1zaC5oIChUQ19DT0ZGX0ZJWDJSVFlQRSk6IEp1c3QgcmV0dXJuIGZ4X3JfdHlwZS4KLQkoc2hfcmVsYXgpOiBEZWNsYXJlLgotCShUQ19DT1VOVF9SRUxPQyk6IElmIHJlbGF4aW5nLCBjb3VudCBQQyByZWxhdGl2ZSByZWxvY3MuCi0JKFRDX1JFTE9DX01BTkdMRSk6IERlZmluZS4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogRGVjbGFyZS4KLQkqIHRjLmggKG1kX2NvbnZlcnRfZnJhZyk6IEFkZCBzZWdUIHBhcmFtZXRlciB0byBub24gQkZEX0FTU0VNQkxFUgotCWRlY2xhcmF0aW9uLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IEFkZCBzZWMgYXJndW1lbnQgdG8gbm9uCi0JQkZEX0FTU0VNQkxFUiB2ZXJzaW9uLiAgUGFzcyBpdCB0byBtZF9jb252ZXJ0X2ZyYWcuCi0JKHdyaXRlX29iamVjdF9maWxlKTogUGFzcyBTRUdfVEVYVCB0byBjdnNfZnJhZ190b19maWxsLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBQYXNzIHNlZ21lbnQgaW5mbyB0bwotCVRDX1JFTE9DX01BTkdMRS4KLQkoZml4dXBfbWRlcHMpOiBQYXNzIHNlZ21lbnQgdHlwZSB0byBtZF9jb252ZXJ0X2ZyYWcuCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBBZGQgc2VnVCBhcmd1bWVudC4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk4NjAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW04OGsuaCAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdGFob2UuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXc2NS5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy16OGsuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoVENfUkVMT0NfTUFOR0xFKTogQWRkIHNlZ21lbnQgYXJndW1lbnQuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoVENfUkVMT0NfTUFOR0xFKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdzY1LmggKFRDX1JFTE9DX01BTkdMRSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXo4ay5oIChUQ19SRUxPQ19NQU5HTEUpOiBMaWtld2lzZS4KLQotTW9uIEp1bCAxNyAxNTowMjo1NCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTogRGVsZXRlIGFzIGZpbGUKLQlzY29wZSB2YXJpYWJsZXMuCi0JKERlZmluZV9Sb3V0aW5lLCBEZWZpbmVfTG9jYWxfU3ltYm9scyk6IFRha2UgQ3VycmVudF9Sb3V0aW5lIGFuZAotCVRleHRfUHNlY3QgYXMgYXJndW1lbnRzLgotCShWTVNfREJHX0RlZmluZV9Sb3V0aW5lKTogRGVsZXRlLgotCShWTVNfVEJUX0Jsb2NrX0VuZCk6IENoYW5nZSBgU2l6ZScgYXJndW1lbnQgZnJvbSBpbnQgdG8gdmFsdWVULgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IHRleHQgYW5kIGRhdGEgZml4dXAgbG9vcHMpOiBEaWZmZXJlbmNlCi0Jb2YgdHdvIHN5bWJvbHMgaGFzIHR5cGUgb2Zmc2V0VCByYXRoZXIgdGhhbiBpbnQ7IGNvbnZlcnQgd2l0aAotCW1kX251bWJlcl90b19jaGFycyBiZWZvcmUgcGFzc2luZyB0byBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogZGVidWcgc3ltYm9sIGxvb3ApOiBDYWxsIERlZmluZV9Sb3V0aW5lCi0JaW5zdGVhZCBvZiBWTVNfREJHX0RlZmluZV9Sb3V0aW5lLgotCi1TYXQgSnVsIDE1IDAwOjAxOjM1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogQWRkIEBmaXh1cCBzbyB0aGF0IHRoZQotCWNvbXBpbGVyIGNhbiBtYXJrIHdoaWNoIHJlbG9jcyBub3QgdG8gY29tcGxhaW4gYWJvdXQgd2l0aAotCS1tcmVsb2NhdGFibGUuCi0JKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWRkIC5maXh1cCB0byBzZWN0aW9ucyBub3QgdG8gY29tcGxhaW4KLQlhYm91dCwgYW5kIGFsc28gZG9uJ3QgY29tcGxhaW4gZm9yIEJGRF9SRUxPQ19DVE9SIHJlbG9jYXRpb25zIGluCi0Jd3JpdGFibGUgbm9uLWNvZGUgc2VnbWVudHMuCi0JKG1kX2FwcGx5X2ZpeCk6IFRyZWF0IEJGRF9SRUxPQ19DVE9SIGp1c3QgbGlrZSBCRkRfUkVMT0NfMzIuCi0KLUZyaSBKdWwgMTQgMTk6NTQ6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIFNQQVJDIFN1bk9TIFBJQzoKLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChzcGFyY19waWNfY29kZSk6IEFsd2F5cyBkZWNsYXJlLCBub3QganVzdAotCXdoZW4gT0JKX0VMRi4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lIHdoZW4gT0JKX0FPVVQuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGRlZmluaXRpb24gZm9yIE9CSl9BT1VULgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX3BpY19jb2RlKTogQWx3YXlzIGRlZmluZSwgbm90IGp1c3Qgd2hlbgotCU9CSl9FTEYuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkanVzdCByZWxvYyBhZGRlbmQgZm9yIE9CSl9BT1VUIGFuZCBQSUMuICBJbgotCUJGRF9SRUxPQ18zMl9QQ1JFTF9TMiBjYXNlLCBkb24ndCBpbmNyZW1lbnQgdmFsIGZvciBhbiBleHRlcm5hbAotCXN5bWJvbCB3aGVuIFBJQy4KLQkodGNfZ2VuX3JlbG9jKTogR2VuZXJhdGUgZGlmZmVyZW50IFBJQyByZWxvY3Mgd2hlbiBPQkpfQU9VVCwgYXMKLQl3ZWxsIGFzIHdoZW4gT0JKX0VMRi4KLQkobWRfc2hvcnRvcHRzKTogSWYgT0JKX0FPVVQsIGluY2x1ZGUgYGsnLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiBPQkpfQU9VVCwgaGFuZGxlICdrJy4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLWsgaWYgT0JKX0FPVVQsIGFuZCAtS1BJQyBpZiBPQkpfRUxGLgotCShtZF9wY3JlbF9mcm9tKTogRG9uJ3QgYWRkIGluIHNpemUgZm9yIGFuIGV4dGVybmFsIHN5bWJvbCB3aGVuCi0JUElDLgotCi1UaHUgSnVsIDEzIDIxOjE2OjQzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChVTkRFRklORURfRElGRkVSRU5DRV9PSyk6IERlZmluZSBmb3IgU09NLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBTZXQgc3lfdXNlZF9pbl9yZWxvYyBmb3IgYm90aAotCXN5bWJvbHMgaW4gYSBmaXh1cCB3aGVyZSBhIGRlZmluZWQgc3ltYm9sIGlzIHN1YnRyYWN0ZWQgZnJvbSBhbgotCXVuZGVmaW5lZCBzeW1ib2wgKHdoZW4gVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sgaXMgZGVmaW5lZCkuCi0JKGZpeHVwX3NlZ21lbnQpOiBEbyBub3RoaW5nIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpZgotCVVOREVGSU5FRF9ESUZGRVJFTkNFX09LIGlzIGRlZmluZWQuCi0KLVdlZCBKdWwgMTIgMjM6MzM6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFN1cHBvcnQgTURfQVBQTFlfRklYMy4KLQotV2VkIEp1bCAxMiAwMToxMjoxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4X25ldyk6IFVzZSBpbnQsIG5vdCBzaG9ydCBpbnQsIGZvciBhcmd1bWVudCB0eXBlLgotCShmaXhfbmV3X2V4cCk6IERpdHRvLgotCi0JKiBjb25maWd1cmUuaW4gKGFybS0qLXJpc2NpeCopOiBEb24ndCBzZXQgZW11bGF0aW9ucy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoTk9fRUNPRkZfREVCVUdHSU5HKTogRGVmaW5lIGlmIEVDT0ZGX0RFQlVHR0lORwotCXdhc24ndCBwcmV2aW91c2x5IGRlZmluZWQuCi0JKHNfZXh0ZXJuKTogRG9uJ3Qgc2V0IGVjb2ZmX2V4dGVybl9zaXplIGlmIE5PX0VDT0ZGX0RFQlVHR0lORy4KLQkobm9waWNfbmVlZF9yZWxheCk6IERvbid0IGNoZWNrIGl0IGlmIE5PX0VDT0ZGX0RFQlVHR0lORy4KLQkobWFjcm9fYnVpbGQpIFshVVNFX1NUREFSR106IERvbid0IHVzZSB2YXJpYWRpYyBwcm90b3R5cGUuCi0JKG1pcHNfbG9jYWxfbGFiZWwpIFtOT19FQ09GRl9ERUJVR0dJTkddOiBEb24ndCBwcmVzZXJ2ZSBwb3RlbnRpYWwKLQlFQ09GRiBkZWJ1Z2dpbmcgc3ltYm9scy4KLQotCSogZW11bC5oIChzdHJ1Y3QgZW11bGF0aW9uKTogVXNlIHVuc2lnbmVkLCBub3QgdW5zaWduZWQgY2hhciwgZm9yCi0JYml0ZmllbGRzLgotCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoc3ltYm9sX21ha2VfZW1wdHkpIFtCRkRfQVNTRU1CTEVSXTogU2V0Ci0JdWRhdGEucCwgbm90IHVkYXRhLgotCi1UdWUgSnVsIDExIDE0OjMwOjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtbWlwcy50ZXhpOiBEb2N1bWVudCAtbTQwMTAgYW5kIC1tbm8tNDAxMC4KLQotVHVlIEp1bCAxMSAxNDoyODo1NSAxOTk1ICBKZWZmIFNwaWVnZWwgIDxqZWZmc0Bsc2lsLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc180MDEwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoaW50ZXJsb2Nrcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogQ2hlY2sgZm9yIGEgY3B1IG9mICJyNDAxMCIuICBTZXQgbWlwc180MDEwIGNvcnJlY3RseS4KLQlJZiBtaXBzXzQ2NTAgb3IgbWlwc180MDEwLCBzZXQgaW50ZXJsb2Nrcy4KLQkoYXBwZW5kX2luc24pOiBDaGVjayBpbnRlcmxvY2tzLCBub3QgbWlwc180NjUwLgotCShtaXBzX2VtaXRfZGVsYXlzKTogTGlrZXdpc2UuCi0JKG1pcHNfaXApOiBPbmx5IHBlcm1pdCBJTlNOXzQwMTAgaW5zdHJ1Y3Rpb25zIGlmIG1pcHNfNDAxMC4KLQkobWRfbG9uZ29wdHMpOiBBZGQgIm00MDEwIiBhbmQgIm5vLW00MDEwIi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IC1tY3B1PXI0MDEwLiAgSGFuZGxlIC1tNDAxMCBhbmQKLQktbm8tbTQwMTAuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCAtbTQwMTAgYW5kIC1uby1tNDAxMC4KLQotVHVlIEp1bCAxMSAxMzoyMjo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKHN0cnVjdCBlZmRyKTogQWRkIG5ldyBmaWVsZCBmYWtlLgotCShpbml0X2ZpbGUpOiBJbml0aWFsaXplIGZha2UuCi0JKGFkZF9maWxlKTogQWRkIG5ldyBwYXJhbWV0ZXIgZmFrZS4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfYnVpbGRfZGVidWcpOiBEb24ndCB3YXJuIGFib3V0IGEgbWlzc2luZyAuZW5kIGZvciBhIGZha2UKLQlmaWxlLgotCi1Nb24gSnVsIDEwIDE2OjAxOjMxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogU3BsaXQgb3V0IG1vc3QgY3B1IGNoYXB0ZXJzLi4uCi0JKiBkb2MvYy0qLnRleGk6IC4uLnRvIGhlcmUuCi0KLQkqIHJlYWQuYyAocG9faGFzaCk6IE5vdyBzdGF0aWMuCi0KLU1vbiBKdWwgMTAgMTM6NDc6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEguSi4gTHUgPGhqbEBueW5leHN0LmNvbT46Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogUmVuYW1lIGZyb20gbWRfYXBwbHlfZml4MS4KLQlBY2NlcHQgcG9pbnRlciB0byB2YWx1ZSBhbmQgc2VnbWVudC4gIEZpeCBPQkpfRUxGIFBDUkVMIGNhc2UgdG8KLQloYW5kbGUgZ2xvYmFsIGRlZmluZWQgc3ltYm9scyBjb3JyZWN0bHkuCi0JKG1kX2FwcGx5X2ZpeCk6IFJlbW92ZSBib3RoIHZlcnNpb25zLgotCSogY29uZmlnL3RjLWkzODYuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotCSogY29uZmlndXJlLmluOiBXaGVuIHN3aXRjaGluZyBvbiAke2NwdX0sIHVzZSAke2NwdX0sIG5vdAotCSRbdGFyZ2V0X2NwdX0sIGluIGRlZmF1bHQgY2FzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU2F0IEp1bCAgOCAxMzoyNzo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDYWxsIHJlc29sdmVfc3ltYm9sX3ZhbHVlIG9uCi0Jc3ViX3N5bWJvbFAsIGluIGNhc2UgaXQgaXNuJ3QgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQotRnJpIEp1bCAgNyAxMToxNzoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19sY29tbSk6IEZvciAubGNvbW0gMSwgc2V0IGFsaWduIHRvIDAsIG5vdCAxLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IElmIFNGX0dFVF9GVU5DVElPTiwgc2V0Ci0JQlNGX0ZVTkNUSU9OLgotCShzeW1ib2xfZ2xvYmFsUCwgc3ltYm9sX2dsb2JhbF9sYXN0UCk6IE5ldyBnbG9iYWwgdmFyaWFibGVzLgotCSh5YW5rX3N5bWJvbHMpOiBTb3J0IGRlZmluZWQgZ2xvYmFsIHN5bWJvbHMgdG8gdGhlIGVuZCwganVzdAotCWJlZm9yZSB0aGUgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGdsdWVfc3ltYm9scyk6IEFkZCB0d28gYXJndW1lbnRzLCBhbmQgdXNlIHRoZW0gaW5zdGVhZCBvZgotCXJlZmVycmluZyBkaXJlY3RseSB0byBnbG9iYWwgdmFyaWFibGVzLgotCShjcmF3bF9zeW1ib2xzKTogQ2FsbCBnbHVlX3N5bWJvbHMgdHdpY2UsIG9uY2UgZm9yIGRlZmluZWQgZ2xvYmFscwotCWFuZCBvbmNlIGZvciB1bmRlZmluZWQuICBBZGQgY29ycmVzcG9uZGluZyBrbm93IGNhbGxzLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWx3YXlzIGFjY2VwdCBcdi4gIERvbid0IG1ha2UgaXQKLQljb25kaXRpb25hbCBvbiBCQUNLU0xBU0hfVi4KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1ib3V0LmggKEJBQ0tTTEFTSF9WKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLW1pcHMuaCAoQkFDS1NMQVNIX1YpOiBEb24ndCBkZWZpbmUuCi0KLQlBZGQgU1BBUkMgRUxGIFBJQyBzdXBwb3J0LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IFBhc3MgZml4UCB0byBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAsCi0Jbm90IGZpeFAtPmZ4X3JfdHlwZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19waWNfY29kZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuIAotCShtZF9hcHBseV9maXgpOiBJZiBnZW5lcmF0aW5nIFBJQywgYWRqdXN0IGZ4X2FkZG51bWJlciBmb3IgYW55IG5vbgotCVBDIHJlbGF0aXZlIHJlbG9jLgotCSh0Y19nZW5fcmVsb2MpOiBJZiBnZW5lcmF0aW5nIFBJQywgYWRqdXN0IHZhcmlvdXMgcmVsb2MgdHlwZXMuCi0JUmVtb3ZlIGZ4X3BjcmVsIGFzc2VydCwgc2luY2UgaXQgaXMgbm8gbG9uZ2VyIHRydWUuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtSyBQSUMuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoc3BhcmNfcGljX2NvZGUpOiBEZWNsYXJlIGlmIE9CSl9FTEYuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZSBpZiBPQkpfRUxGLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgUElDLgotCSogY29uZmlnL3RjLWkzODYuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogVGFrZSBhIGZpeHAsIG5vdCBhCi0JcmVsb2MgdHlwZS4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogQWRkIGRlcGVuZGVuY3kgb24gY29uZi5pbiwgc28gdGhhdCBjb25mCi0JaXMgcmVidWlsdCB3aGVuIGNvbmYuaW4gY2hhbmdlcy4KLQotVGh1IEp1bCAgNiAxNjo0OTozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogQWxsIGZpbGVzOiBVcGRhdGVkIEZTRiBhZGRyZXNzLgotCi1UaHUgSnVsICA2IDE2OjMwOjM0IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBEb24ndCBjb2xsYXBzZSBtdWx0aXBsZSAuZmlsZSBjb21tYW5kcyBpbnRvCi0JYSBzaW5nbGUgZmlsZSBzdHJ1Y3R1cmUuCi0JKGVjb2ZmX2J1aWxkX2xpbmVubyk6IFNldCBpbGluZUJhc2UgdG8gc3VtIG9mIHByZXZpb3VzIGZpbGUncwotCWlsaW5lQmFzZSBhbmQgY2xpbmUuCi0KLVRodSBKdWwgIDYgMTI6NTQ6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JUGF0Y2hlcyBmcm9tIEplcnJ5IEJsYWtlbHkgPGdlcnJ5X2JsYWtsZXlAd2VsbGZsZWV0LmNvbT46Ci0JKiBhcy5jIChsaXN0aW5nX2ZpbGVuYW1lKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc2hvd191c2FnZSk6IE1lbnRpb24gLWE9ZmlsZS4KLQkocGFyc2VfYXJncyk6IFN1cHBvcnQgPSBvcHRpb24gb2YgLWEgdG8gc2V0IG5hbWUgb2YgbGlzdGluZyBmaWxlLgotCShtYWluKTogUGFzcyBsaXN0aW5nX2ZpbGVuYW1lIHRvIGxpc3RpbmdfcHJpbnQuCi0JKiBsaXN0aW5nLmMgKGxpc3RfZmlsZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHZhcmlvdXMpOiBSZXBsYWNlIHByaW50ZiB3aXRoIGZwcmludGYgdG8gbGlzdF9maWxlLgotCShsaXN0aW5nX3ByaW50KTogSWYgbmFtZSBhcmd1bWVudCBpcyBub3QgTlVMTCwgb3BlbiBpdCBhcwotCWxpc3RfZmlsZS4KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMuMTogRG9jdW1lbnQgLWE9ZmlsZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IERvbid0IHBlcm1pdCByZWRlZmluaXRpb24sIGV2ZW4KLQlpZiB0aGUgc3ltYm9sIHdhcyBhbHJlYWR5IGluIGJzc19zZWN0aW9uLiAgRml4IHdhcm5pbmcgbWVzc2FnZS4KLQotCSogbGlzdGluZy5jIChzdHJ1Y3QgZmlsZV9pbmZvX3N0cnVjdCk6IFJlbmFtZSBlbmRfcGVuZGluZyBmaWVsZCB0bwotCWF0X2VuZC4KLQkoZmlsZV9pbmZvKTogSW5pdGlhbGl6ZSBhdF9lbmQsIG5vdCBlbmRfcGVuZGluZy4KLQkoYnVmZmVyX2xpbmUpOiBJZiBhdF9lbmQgc2V0LCBqdXN0IHJldHVybiBpbW1lZGlhdGVseS4gIERvbid0Ci0Jd29ycnkgYWJvdXQgZW5kX3BlbmRpbmcgY2FzZXMuICBTZXQgYXRfZW5kIHdoZW4gRU9GIGlzIHJlYWQuCi0JKHByaW50X3NvdXJjZSk6IENoZWNrIGF0X2VuZCwgbm90IGVuZF9wZW5kaW5nLgotCShsaXN0aW5nX2xpc3RpbmcpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmggKGFscGhhX2RvX2FsaWduKTogRG9uJ3QgZGVjbGFyZS4KLQkobWRfZG9fYWxpZ24pOiBEb24ndCBkZWZpbmUuCi0JKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0JKGFscGhhX2RlZmluZV9sYWJlbCk6IERlY2xhcmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVmaW5lLgotCShhbHBoYV9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoaW5zbl9sYWJlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGF1dG9fYWxpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgY2FzZXMgZm9yIC50ZXh0LCAuZGF0YSwgLmFsaWduLCAuYnl0ZSwKLQkuaHdvcmQsIC5pbnQsIC5sb25nLCAub2N0YSwgLnF1YWQsIC5zaG9ydCwgLndvcmQsIC5kb3VibGUsIC5mbG9hdCwKLQlhbmQgLnNpbmdsZS4gIENoYW5nZSAudF9mbG9hdGluZywgLnNfZmxvYXRpbmcsIC5mX2Zsb2F0aW5nLAotCS5nX2Zsb2F0aW5nLCBhbmQgLmRfZmxvYXRpbmcgdG8gdXNlIHNfYWxwaGFfZmxvYXRfY29ucyByYXRoZXIgdGhhbgotCWZsb2F0X2NvbnMuCi0JKHNfYWxwaGFfdGV4dCwgc19hbHBoYV9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNfcmRhdGEsIHNfc2RhdGEpOiBDbGVhciBpbnNuX2xhYmVsIGFuZCBzZXQgYXV0b19hbGlnbi4KLQkoc19ncHJlbDMyKTogSWYgYXV0b19hbGlnbiwgYWxpZ24uICBDbGVhciBpbnNuX2xhYmVsLgotCShlbWl0X2luc24pOiBDbGVhciBpbnNuX2xhYmVsLgotCShzX2FscGhhX2FsaWduKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfYWxpZ24pOiBNYWtlIHN0YXRpYy4gIFRha2UgbGFiZWwgYXJndW1lbnQuCi0JKGFscGhhX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19hbHBoYV9jb25zLCBzX2FscGhhX2Zsb2F0X2NvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoYWxwaGFfZGVmaW5lX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgSnVsICA1IDIyOjQ5OjMxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25mLmluOiBSZWdlbmVyYXRlIHdpdGggYXV0b3JlY29uZi4KLQotCU1vbiBKdWwgIDMgMTk6NDc6NTMgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZik6IFVzZSBmdWxsIHByb3RvdHlwZS4KLQkodm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsLCB0Y19mcm9iX2xhYmVsKTogTW92ZSB0aGVtIHRvIGdyb3VwCi0Jd2l0aCBvdGhlciBwcm90b3R5cGVzLgotCVtXQU5UX1ZNU19PQkpfREVGU106IE9ubHkgZGVmaW5lIHRoZSBtYW55IE9CSl94LCBEQkdfeCwgYW5kIERTVF94Ci0JbWFjcm9zIHdoZW4gdGhpcyBpcyBkZWZpbmVkLgotCSogY29uZmlnL29iai12bXMuYzogRnVsbHkgcHJvdG90eXBlIGFsbCBsb2NhbCBmdW5jdGlvbnMuCi0JW3N5bWJvbFMsIGZyYWdTXTogVXNlIGNvbnNpc3RlbnRseSBpbnN0ZWFkIG9mIHRoZWlyIHN0cnVjdCB0YWdzLgotCVtXQU5UX1ZNU19PQkpfREVGU106IERlZmluZSB0aGlzLgotCShzX2NvbnN0KTogTWFrZSBkZWZpbml0aW9uIGNvcnJlY3RseSBtYXRjaCBhY3R1YWwgdXNhZ2UuCi0JKFZNU19zdGFiX3BhcnNlKTogTWFrZSBgZXhwZWN0ZWRfdHlwZScgYXJnIGJlIGludCByYXRoZXIgdGhhbiBjaGFyLgotCShnZXRfVk1TX3RpbWVfb25fdW5peCk6IERlZmluZSBhcyBgc3RhdGljIHZvaWQnLgotCShoYXNoX3N0cmluZyk6IE1ha2UgZGVmaW5pdGlvbiBtYXRjaCBhY3R1YWwgdXNhZ2U7IGFyZ3VtZW50IGlzCi0JYGNoYXIgY29uc3QgKicgcmF0aGVyIHRoYW4gYHVuc2lnbmVkIGNoYXIgKicuCi0JKFZNU19DYXNlX0hhY2tfU3ltYm9sLCBWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMsIFZNU19Qc2VjdF9TcGVjLAotCVZNU19HbG9iYWxfU3ltYm9sX1NwZWMpOiBEZWNsYXJlIHN0cmluZyBhcmdzIGFzIGBjb25zdCBjaGFyIConLgotCVtJU19HWFhfVlRBQkxFXTogTmV3IG1hY3JvLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IEdTRCBsb29wKTogVXNlIGl0LgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IGRhdGEgc2VnbWVudCk6IFJlb3JnYW5pemUgYGZpbGwnIGxvb3AuCi0KLVdlZCBKdWwgIDUgMTI6MDE6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvcnRvcHRzKTogQWRkICJLOiIgaWYgT0JKX0VMRi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWYgT0JKX0VMRiwgY2hlY2sgZm9yIC1LLiAgRGllIGlmIC1LIFBJQywgc2luY2UKLQlQSUMgY29kZSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IENoYW5nZSBzdGRfc2hvcnRvcHRzIHRvIGJlIGFuIGFycmF5IHJhdGhlcgotCXRoYW4gYSBjb25zdGFudCBzdHJpbmcuICBPbmx5IGluY2x1ZGUgJ0snIGlmIFdPUktJTkdfRE9UX1dPUkQgaXMKLQlub3QgZGVmaW5lZC4gIE9ubHkgY2hlY2sgZm9yICdLJyBpbiB0aGF0IGNhc2UgYXMgd2VsbC4KLQkqIGFzLmggKGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQpOiBPbmx5IGRlY2xhcmUgaWYgV09SS0lOR19ET1RfV09SRAotCWlzIG5vdCBkZWZpbmVkLgotCi0JKiBjb25mLmluOiBBZGQgdW5kZWYgb2YgSEFWRV9TQlJLLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfbGluZSk6IENhbGwgbGlzdGluZ19zb3VyY2VfbGluZSwgaW4KLQlib3RoIEJGRF9BU1NFTUJMRVIgYW5kIG5vbiBCRkRfQVNTRU1CTEVSIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbi4KLQotCSogc3ltYm9scy5jIChTX1NFVF9FWFRFUk5BTCk6IFdhcm4gaWYgc3ltYm9sIGlzIHdlYWsuCi0JKFNfQ0xFQVJfRVhURVJOQUwpOiBMaWtld2lzZS4KLQkoU19TRVRfV0VBSyk6IFdhcm4gaWYgc3ltYm9sIGlzIGdsb2JhbC4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogV2FybiBhYm91dCBhbiBhdHRlbXB0Ci0JdG8gcHV0IGFuIHVuZGVmaW5lZCBzeW1ib2wgaW50byBhIHNldC4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBAY29uZmlndXJlX2lucHV0QDsgaXQncyBub3QgbmVlZGVkIGluCi0JZmlsZXMgbmFtZWQgTWFrZWZpbGUuCi0KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiLnNldCIgc28gdGhhdCB0aGUKLQlleHBsaWNpdCBwc2V1ZG8tb3Agd29ya3MsIHdoaWxlIGNvbnRpbnVpbmcgdG8gdHJlYXQgInNldCIgYXMgYW4KLQlpbnN0cnVjdGlvbi4KLQotCSogZWNvZmYuYyAoZWNvZmZfZGVidWdnaW5nX3NlZW4pOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShlY29mZl9kaXJlY3RpdmVfZGVmKTogU2V0IGVjb2ZmX2RlYnVnZ2luZ19zZWVuLgotCShlY29mZl9zdGFiKTogTGlrZXdpc2UuCi0JKiBlY29mZi5oOiBNYWtlIGlkZW1wb3RlbnQuCi0JKGVjb2ZmX2RlYnVnZ2luZ19zZWVuKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgZWNvZmYuaC4KLQkobWlwc19kZWJ1Zyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfc3RyaW5nZXIsIHNfbWlwc19zcGFjZSk6IFJlbW92ZSB1bm5lZWRlZCBkZWNsYXJhdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEluIGNhc2UgJ2cnLCBzZXQgbWlwc19kZWJ1ZyB0byBkZWJ1Z2dpbmcgbGV2ZWwuCi0JKG1pcHNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKiB0Yy1taXBzLmggKExPQ0FMX0xBQkVMKTogQ2FsbCBtaXBzX2xvY2FsX2xhYmVsLgotCShtaXBzX2xvY2FsX2xhYmVsKTogRGVjbGFyZS4KLQotV2VkIEp1bCAgNSAwMDo1OToyMiAxOTk1ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYXMuYyAobWFpbik6ICBPbmx5IHVzZSBzYnJrIHdoZW4gSEFWRV9TQlJLIGRlZmluZWQuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgdGVzdCBmb3Igc2Jyay4KLQkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgdXNpbmcgYXV0b2NvbmYgMi40LgotCi1Nb24gSnVsICAzIDE1OjU4OjE2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChNQVhfUkVMT0NfRVhQQU5TSU9OKTogQnVtcCB0byA2LgotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZQotCXJlbG9jYXRpb25zIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28gKHBvc3NpYmx5IGV4dGVybmFsKQotCXN5bWJvbHMuCi0JKGhwcGFfZml4X2FkanVzdGFibGUpOiBGb3IgU09NLCByZWplY3QgcmVkdWN0aW9ucyBpbnZvbHZpbmcKLQl0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NhdGlvbnMgZm9yIGV4cHJlc3Npb25zCi0JaW52b2x2aW5nIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLgotCi1Nb24gSnVsICAzIDE0OjIyOjU5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZVsuaW5dIChpMzg2LSotd2luMzIpOiBOZXcgaG9zdCBhbmQgdGFyZ2V0LgotCi1UaHUgSnVuIDI5IDE3OjI1OjQzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBsb25nIGZpbGVuYW1lcyBub24tYmZkIGNvZmYuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZmlsZW5hbWVfbGlzdF9oZWFkLCBmaWxlbmFtZV9saXN0X3RhaWwpOiBOZXcuCi0JKHlhbmtfc3ltYm9scyk6IE5vdGljZSBhbmQgcmVjb3JkIGZpbGVuYW1lcyB3aGljaCBhcmUgdG9vIGxvbmcuCi0JKHdfc3RyaW5ncyk6IFdyaXRlIG91dCBmaWxlbmFtZSBzdHJpbmdzLgotCShjX2RvdF9maWxlX3N5bWJvbHMpOiBQdXQgbG9uZyBmaWxlbmFtZXMgb250byBsaXN0LgotCi1XZWQgSnVuIDI4IDE3OjMzOjEzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogUEUgZG9lc24ndCB1c2UKLQl0aGUgc3RyYW5nZSBjb21tb24gc3ltYm9sIGZvcm1hdCB0aGF0IG90aGVyIDM4NnMgZm9ybWF0cwotCWRvLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYmVnaW4pOiBJZiBMRVhfQVQgZGVmaW5lZCB0aGVuCi0JJ0AnIGlzIGluIHRoZSBzZXQgb2YgaWRlbnRpZmllcnMuCi0JKGkzODZfb3BlcmFuZCk6IElmIExFWF9BVCwgdGhlbiBkb24ndCBsb29rIGZvciBAZ290byBzdHVmZi4KLQkqIGNvbmZpZy90ZS1wZS5oOiBEZWZpbmUgTEVYX0FULgotCi1XZWQgSnVuIDI4IDE3OjQ5OjU5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoSDgvNTAwIEZsb2F0aW5nIFBvaW50KTogSW5kaWNhdGUgdGhhdCBJRUVFIEZQCi0JbnVtYmVycyBhcmUgZm9yIHRoZSBzdGFuZGFyZCBlbXVsYXRpb24gY29kZS4KLQkoU0ggRmxvYXRpbmcgUG9pbnQpOiBEaXR0by4KLQkoT3ZlcnZpZXcpOiBEZXNjcmliZSBuZXcgLS1lbXVsYXRpb24gb3B0aW9uIGZvciBNSVBTLgotCSogZG9jLyoubTQ6IERlbGV0ZWQuCi0KLVRodSBKdW4gMjIgMTk6MjY6MjUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVN1biBNYXkgIDcgMTE6NTM6NDEgTURUIDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgaTM4Ni0qLW1vc3MqIHRhcmdldC4KLQotVGh1IEp1biAyMiAxNDo0MToyMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FzdCBkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZQotCWFyZ3VtZW50IHRvIGNoYXIgKiB0byBhdm9pZCB3YXJuaW5nLgotCi1XZWQgSnVuIDIxIDE4OjA3OjU5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gQW5kcmVhcyBTY2h3YWIgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46Ci0JKiBjb25maWcvdGMtbTY4ay5jIChpbnN3b3JkKTogSW5jcmVtZW50IHRoZSBmcmFnIG9mZnNldHMuCi0JKHN0cnVjdCBtNjhrX2l0KTogQWRkIHJlbG9jW10ucGNyZWxfZml4IGZpZWxkIHRvIGhvbGQgcGMtcmVsCi0JZml4dXAuCi0JKGFkZF9maXgpOiBBY2NlcHQgYWRkaXRpb25hbCBwYXJhbWV0ZXIsIHRoZSBwYy1yZWwgZml4dXAuIEFsbAotCWNhbGxlcnMgY2hhbmdlZC4gIEZpeCBvZmZzZXQgYWRkcmVzcyBpZiB3aWR0aCA9PSAnYicuCi0JKG02OGtfaXApIFtjYXNlIEFJTkRYXTogQWxsb3cgZXhwbGljaXQgc2l6ZSBzcGVjLiAgRG9uJ3QgbWFrZSB0aGUKLQlvdXRlciBkaXNwbGFjZW1lbnQgcGMtcmVsYXRpdmUuCi0JKG1kX3BjcmVsX2Zyb20pOiBNYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBleHRlbnNpb24gd29yZCBvZgotCXRoZSBvcGVyYW5kLgotCShvcGNvZGVfcHRyKTogTWFrZSBpdCBhIG1hY3JvIGlmIERPX0JSRUFLX1VQX0JJR19ERUNMIGlzCi0JdW5kZWZpbmVkLgotCShtZF9jb252ZXJ0X2ZyYWdfMSk6IERvbid0IHJlZmVyZW5jZSBmcmFnUC0+ZnJfb3Bjb2RlWzIuLl0uCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KSBbY2FzZSBUQUIgKEZCUkFOQ0gsIFNaX1VOREVGKV06Ci0JVHVybiBvbiBsb25nIGJpdC4KLQkobTY4a19pcCkgW2Nhc2UgJ0MnXTogRG9uJ3Qgc2V0IHNldCBsb25nIGJpdCwgc2V0IGl0IGluIHRoZSBvcGNvZGUKLSAJdGFibGUuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KSBbY2FzZSBUQUIgKFBDSU5ERVgsIFNaX1VOREVGKV06Ci0JVmFyaWFibGUgcGFydCBpbmNyZWFzZXMgYnkgZm91ciwgbm90IHNpeC4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpIFtUQ19NNjhLXTogRG9uJ3QgZG8gZnVydGhlciBwY3JlbAotCXByb2Nlc3NpbmcgYWZ0ZXIgY29udmVydGluZyBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZQotCXNhbWUgc2VnbWVudC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGNvbmRpdGlvbmFsaXplIHRoZSBwY3JlbCBmaXggb24KLQlUQ19NNjhLLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXAsIGNhc2UgJ0EnKTogSWYgQVNJIGlzIG5vdCBhICIjIgotCXZhbHVlLCBkb24ndCBzaGlmdCBpdCBhbiBleHRyYSB0aW1lLgotCi1XZWQgSnVuIDIxIDE0OjE4OjM3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAoZG9fcHJpbnQsIGRvX2Zvcm0sIGJ1ZmZlcl9hbmRfbmVzdCk6IFVzZSBjYXNlIGluc2Vuc2l0aXZlCi0Jc3RyaW5nIGNvbXBhcmVzLgotCi1UdWUgSnVuIDIwIDE0OjU1OjAyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhc3QgdGltZSgpIGFyZ3VtZW50IHRvCi0JdGltZV90ICouCi0KLVR1ZSBKdW4gMjAgMTI6MDA6NTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IEZpeCB0eXBvIGluIGxhc3QKLQljaGFuZ2UuCi0KLU1vbiBKdW4gMTkgMTU6Mjc6MTcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFplcm8gb3V0IG1lbW9yeQotCWZyb20gZnJhZ19tb3JlIGNhbGxzLgotCi1UaHUgSnVuIDE1IDE2OjUzOjM3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IERvbid0IHVzZSAiYmZkLyIgd2hlbiBpbmNsdWRpbmcgbGliYmZkLmgKLQlhbmQgbGliY29mZi5oLgotCShmaWxsX3NlY3Rpb24pOiBDYWxsIFBST0dSRVNTLgotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogQWRkIGJmZCBzcmNkaXIuCi0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBiZmRfZ2FzIGZsYWcgYW5kIHNldCBmb3IgZWFjaCBjb25maWcuCi0JKGkzODYtdW5rbm93bi1nbzMyLCBtNjhrLXVua25vd24tY29mZik6IFJlY29nbml6ZS4KLQkqIG1wdy1tYWtlLmluIChIQUNLX09fUkFNQSwgT0JKX0NPRkZfT01JVF9USU1FU1RBTVApOiBBZGQgdG8KLQljb25maWcuaC4KLQotVGh1IEp1biAxNSAxMDowNDoyNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKExPQ0FMX0xBQkVMKTogUHJlcGVuZCAnLicgaWYgbm90IE9CSl9BT1VULgotCShGQUtFX0xBQkVMX05BTUUpOiBMaWtld2lzZS4KLQotTW9uIEp1biAxMiAyMjoyNTozOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBDaGVjayBmb3IgaW52YWxpZCByZWdpc3RlciBpbiBzaW5nbGUKLQlwcmVjaXNpb24gZm1weWFkZCBhbmQgZm1weXN1YiBpbnN0cnVjdGlvbnMuCi0KLVRodSBKdW4gIDggMTk6MzM6MDIgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKG15bmFtZSk6IERlbGV0ZSBhbGwgcmVmZXJlbmNlcy4KLQkoVk1TX3N0YWJfcGFyc2UsIFdyaXRlX1ZNU19NSERfUmVjb3JkcywgVk1TX0Nhc2VfSGFja19TeW1ib2wpOgotCVJlcGxhY2UgcHJpbnRmIGNhbGxzIHdpdGggYXNfdHNrdHNrLgotCShQVVRfTE9ORywgUFVUX1NIT1JUKTogVXNlIENPUFlfTE9ORywgQ09QWV9TSE9SVC4KLQkoVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhKTogTW92ZSBzZWNvbmQgYnVmZmVyIGNhcGFjaXR5IGNoZWNrCi0JYmVsb3cgYm90dG9tIG9mIGxvb3A7IGZpcnN0IGNoZWNrIGF0IHRvcCBzdWZmaWNlcyBmb3IgbG9vcCBpdHNlbGYuCi0JKGZpbmRfZmlsZSk6IFJlbW92ZSByZWR1bmRhbnQgcG9pbnRlciBjaGVja3MgaW4gZmlyc3QgdHdvIGxvb3BzOwotCXJlcGxhY2UgdGhpcmQgbG9vcCB3aXRoIHBvaW50ZXIgdG8gbGFzdCBsaXN0IGVsZW1lbnQgZGV0ZXJtaW5lZAotCWluIGZpcnN0IGxvb3AuCi0KLVR1ZSBKdW4gIDYgMTM6NTM6MDYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSGFuZGxlIGRlZmluZWQgYWJzb2x1dGUgc3ltYm9scyBhcwotCUFTSSB2YWx1ZXMuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZtc193cml0ZV9vYmplY3RfZmlsZSwgY2FzZSBOX0RBVEEpOiBVc2UKLQlzdHJjbXAgYWdhaW5zdCBGQUtFX0xBQkVMX05BTUUgaW5zdGVhZCBvZiBjaGVja2luZyB0aGlyZAotCWNoYXJhY3Rlci4gIChTdWdnZXN0ZWQgYnkgUGF0IFJhbmtpbi4pCi0KLU1vbiBKdW4gIDUgMjA6MTA6NDYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQlBZGQgc3VwcG9ydCBmb3IgTl9BQlMgYW5kIE5fQUJTfE5fRVhUIHR5cGUgc3ltYm9scy4KLQotCSogY29uZmlnL29iai12bXMuaCAoTFNZX1NfTV97REVGLFJFTH0sIEVOVl9TX01fe0RFRixORVNURUR9KToKLQlOZXcgbWFjcm9zIGZvciBsb2NhbCBzeW1ib2xzIChmcm9tIDxsc3lkZWYuaD4gYW5kIDxlbnZkZWYuaD4pLgotCSogY29uZmlnL29iai12bXMuYyAoQ3VycmVudF9FbnZpcm9ubWVudCk6IE5ldyBmaWxlLXNjb3BlIHZhcmlhYmxlLgotCShWTVNfTG9jYWxfRW52aXJvbm1lbnRfU2V0dXApOiBOZXcgcm91dGluZS4KLQkoR0JMU1lNX0xDTCk6IE5ldyBtYWNyby4KLQkoVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyk6IEhhbmRsZSBsb2NhbCBzeW1ib2xzIHRvby4KLQkoVk1TX1BzZWN0X1NwZWMpOiBTZXQgR0xPQkFMVkFMVUVfQklUIGZvciBhYnNvbHV0ZSBzeW1ib2xzLgotCShWTVNfRW1pdF9HbG9iYWx2YWx1ZXMpOiBIYW5kbGUgbG9jYWwgYW5kIGdsb2JhbCBhYnNvbHV0ZSBzeW1ib2xzLgotCShWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UpOiBEaXR0by4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiBHU0Qgc3ltYm9sIGxvb3ApOiBEaXR0by4KLQotTW9uIEp1biAgNSAxNjoxMDo0MCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZS4KLQotTW9uIEp1biAgNSAwMjoxNzo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWdudSopOiBBbHdheXMgdXNlIEdOVSBFTEYgY29uZmlnLgotCi1XZWQgTWF5IDMxIDE3OjQ5OjE4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogVXBkYXRlICpzeW1ib2xQUAotCWluIGBlbHNlJyBjbGF1c2Ugd2hlbiByZW1vdmluZyBhIHN5bWJvbC4gIEFsc28sIHJldmlzZSBjb21tZW50cwotCXRvIG1hdGNoIHRoZSBjb2RlLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGUgKEdTRCBzeW1ib2wgbG9vcCwgY2FzZSBOX0RBVEEpKTogTmV2ZXIKLQlvdXRwdXQgc3ltYm9sIGRlZmluaXRpb25zIGZvciBsb2NhbCBudW1lcmljIGxhYmVscy4KLQotVHVlIE1heSAzMCAxODoyOToxMCAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJjaGl0ZWN0dXJlIHZhcmlhbnRzLCBjYXNlcyBhcm1lYiBhbmQgYXJtKik6IFJlbW92ZQotCXNwYWNlcyByb3VuZCBhc3NpZ25tZW50IHRvIGVuZGlhbi4KLQotVHVlIE1heSAzMCAxMjozMTozMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENoZWNrIGZvciB1bmRlZmluZWQgbG9jYWwgZG9sbGFyCi0JYW5kIGZiIGxhYmVscy4KLQotCSogc3ltYm9scy5jIChkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSk6IEV4dHJhY3QgaW5zdGFuY2UgbnVtYmVyCi0JZnJvbSB0aGUgY29ycmVjdCBsb2NhdGlvbi4KLQotU2F0IE1heSAyNyAyMToyODo0OSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1kcHgyLmg6IEluY2x1ZGUgb2JqLWZvcm1hdC5oLgotCShDT0ZGX01BR0lDKTogUmVuYW1lZCBmcm9tIEZJTEVfSEVBREVSX01BR0lDLgotCi1XZWQgTWF5IDI0IDEzOjQ1OjMyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluLCBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1jb2ZmLmg6Ci0JQWRkIHN1cHBvcnQgZm9yIEFSTSBwZQotCi1UdWUgTWF5IDIzIDE3OjAwOjMyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYKLQlhbmQgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTkuCi0KLVR1ZSBNYXkgMjMgMTk6MTg6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXMuYyAocGFyc2VfYXJncykgWyEgVVNFX0VNVUxBVElPTlNdOiBBbHdheXMgcHJpbnQgYW4gZXJyb3IKLQltZXNzYWdlLgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IERvY3VtZW50IG9ial9hcHBfZmlsZSBhbmQKLQlUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQotTW9uIE1heSAyMiAyMDowMzoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogQWRkIGV4dHJhIGxlYWRpbmcgYXJndW1lbnQsIGZvciA0IE1heQotCWNoYW5nZS4KLQkqIGVjb2ZmLmggKGVjb2ZmX3N0YWIpOiBGaXggZGVjbGFyYXRpb24uCi0JKiBvYmouaCAoZm9ybWF0X29wcy5wcm9jZXNzX3N0YWIpOiBJbmNsdWRlIHByb3RvdHlwZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9QUk9DRVNTX1NUQUIpOiBQYXNzIHRocm91Z2ggc2VnIGFyZ3VtZW50LgotCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfUFJPQ0VTU19TVEFCKTogRGl0dG8uCi0KLQkqIGNvbmZpZy9lLW1pcHNlbGYuYyAobWlwc2VsZik6IE5ldyBlbXVsYXRpb24gbW9kZSwgZG9lc24ndCBjaGFuZ2UKLQllbmRpYW5uZXNzIGZyb20gY29uZmlndXJlZCBkZWZhdWx0LgotCSogY29uZmlnL2UtbWlwc2Vjb2ZmLmMgKG1pcHNlY29mZik6IERpdHRvLgotCSogY29uZmlndXJlLmluIChtaXBzIGVjb2ZmL2VsZiB0YXJnZXRzKTogSW5jbHVkZSB0aGVtLgotCSogYXMuYyAobWlwc2VsZiwgbWlwc2Vjb2ZmKTogRGVjbGFyZS4KLQotCSogYXMuYyAoZW11bGF0aW9uX25hbWUpOiBOZXcgdmFyaWFibGUuCi0JKHNlbGVjdF9lbXVsYXRpb25fbW9kZSk6IFNldCBlbXVsYXRpb25fbmFtZS4gIERvbid0IGNoYW5nZSBhcmd2LgotCShwYXJzZV9hcmdzKTogSGFuZGxlIC0tZW11bGF0aW9uOyBjb21wbGFpbiBpZiB0aGUgc3VwcGxpZWQgbmFtZQotCWlzbid0IHdoYXQgc2VsZWN0X2VtdWxhdGlvbl9uYW1lIGNhbWUgdXAgd2l0aC4KLQotU3VuIE1heSAyMSAyMTozNjoxNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogUmV2ZXJzZSBjaGFuZ2VzIGZyb20gRGVjLiAxOXRoIHdoaWNoCi0JY2hhbmdlZCB0aGUgd2F5IHVud2luZHMgd2VyZSBidWlsdCBmb3IgRUxGLiAgUmVseSBvbiByZWxvY2F0aW9uCi0Jc3ltYm9sIHJlZHVjdGlvbnMgdG8gYXZvaWQgcGxhY2luZyB0aGUgZW5kIG9mIGZ1bmN0aW9uIG1hcmtlcgotCXN5bWJvbHMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuCi0KLVNhdCBNYXkgMjAgMTI6MzE6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JQWRkZWQgaW1wcm92ZWQgVk1TIHN1cHBvcnQgZnJvbSBQYXQgUmFua2luOgotCi0JRnJpIDE5IE1heSAxNjo1MTo0MCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAoQU9VVF9TVEFCUyk6IERlZmluZS4KLQotCSogY29uZmlnL29iai12bXMuYyAoZnB1c2gsIHJwdXNoKTogTmV3IHJvdXRpbmVzLgotCShwdXNoKTogUmVwbGFjZWQgYnkgdGhlIGFib3ZlLgotCShmaW5kX3N5bWJvbCk6IFNsaWdodCByZW9yZ2FuaXphdGlvbiB0byBleHBvc2UgdGFpbCByZWN1cnNpb24uCi0KLQlGcmkgTWFyIDE3IDE4OjQwOjM2IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoVk1TX09USEVSX09CSlMpOiAgZGVsZXRlIHRoaXMuCi0JKiB2bXNjb25mLnNoIChtYWtlLWdhcy5jb20pOiAgYnVpbGQgLi4vbGliaWJlcnR5L2xpYmVydHkub2xiCi0JZmlyc3QgaWYgbmVjZXNzYXJ5OyBsaW5rIGdhcyBhZ2FpbnN0IGl0LgotCi1GcmkgTWF5IDE5IDE2OjM3OjM5IDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogZ2FzcC5jIChpc3RydWUpOiBDb3JyZWN0bHkgdGVzdCBmb3Igc3RyaW5nIGluZXF1YWxpdHkuCi0KLVRodSBNYXkgMTggMDQ6MjU6MTEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogY29uZmlnL3RjLWFybS5jIChDUF9UX3tQcmUsVUQsV0J9KTogRGVmaW5lLCBiaXRzIGluIGNvLXByb2Nlc3NvcgotCWluc3RydWN0aW9ucy4KLQkoW2xzXWZtX2ZsYWdzKTogQ29ycmVjdCBlcnJvciBpbiBiaXRtYXNrcy4KLQkoY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlKTogRGVsZXRlIHNlY29uZCBwYXJhbWV0ZXIsIEZMQUdTLiAgQWxsCi0JY2FsbGVycyBjaGFuZ2VkLiAgUmVtb3ZlIGFsbCBkZWFkIGNvZGUgcmVmZXJyaW5nIHRvIEZMQUdTLiAgSWYKLQlhZGRyZXNzIGlzIGp1c3QgIltSZWddIiB0aGVuIGNvbnZlcnQgaW50byBhIFBSRS1JTkNSRU1FTlQgVVAgZm9ybWF0LgotCShkb19mcF9sZG1zdG0pOiBIYW5kbGUgZnVsbC1kZXNjZW5kaW5nIGFuZCBlbXB0eS1hc2NlbmRpbmcgc3RhY2sKLQlmb3JtYXRzIGV4cGxpY2l0bHkuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoaW50ZXJuYWxFcnJvcik6IERlZmluZS4KLQkoQVJNX3sxLDIsMjUwLDMsNiw3LDdETSxBTlksMlVQLEFMTCwzVVAsNlVQLExPTkdNVUx9KTogRGVmaW5lIHByb2Nlc3NvcgotCXZhcmlhbnRzLgotCShGUFVfe0NPUkUsRlBBMTAsRlBBMTEsTk9ORSxBTEwsTUVNTVVMVEl9KTogRGVmaW5lIGZsb2F0aW5nIHBvaW50Ci0JdmFyaWFudHMuCi0JKHtDUFUsRlBVfV9ERUZBVUxUKTogRGVmaW5lLgotCShjcHVfdmFyaWFudCk6IE5ldyB2YXJpYWJsZS4KLQkoYXNtX2ZsZyk6IENoYW5nZSBtb3JlX2ZsYWdzIHRvIGZsYWdfYml0cy4KLQlBZGQgcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4KLQkoRkxBR197UyxQLEIsVCxFRCxGRCxGQSxFQSxJQixJQSxEQixEQSxMfSk6IERlbGV0ZS4KLQkoc19mbGFnW10sIGxkc3RfZmxhZ3NbXSwgYnl0ZV9mbGFnW10sIGNtcF9mbGFnc1tdLCBsZG1fZmxhZ3NbXSwKLQkgc3RtX2ZsYWdzW10sIGxmbV9mbGFnc1tdLCBzZm1fZmxhZ3NbXSwgcm91bmRfZmxhZ3NbXSwgZXhjZXB0X2ZsYWdzW10sCi0JIGNwbG9uZ19mbGFnW10pOiBOZXcgdmFyaWFibGVzLgotCShhc21fb3Bjb2RlLCBpbnNuc1tdKTogTmV3IGZvcm1hdCwgYWRkIHZlcnNpb24gc3VwcG9ydC4KLQkoYXJtX2ZsZ19oc2gpOiBEZWxldGUuCi0JKGRvX211bCwgZG9fbWxhKTogUmVtb3ZlICJXYXJuaW5nIiBmcm9tIHdhcm5pbmcgbWVzc2FnZXMuCi0JKGRvX2FyaXQpOiBTaW1wbGlmeS4KLQkoZG9fc3dhcCk6IE1ha2UgZXJyb3IgbWVzc2FnZSBtb3JlIGFwcHJvcHJpYXRlLgotCShtZF9iZWdpbik6IEJ1aWxkIGhhc2ggdGFibGVzIHN0YXJ0aW5nIGF0IGZpcnN0IGVudHJ5IGluIHRhYmxlcy4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogQ29wZSB3aXRoIGJpZy9saXR0bGUtZW5kaWFuIHNlbGVjdGlvbi4KLQkobWRfY2hhcnNfdG9fbnVtYmVyKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXgpOiBSZXdyaXRlIHRvIG1ha2UgZW5kaWFuIGluZGVwZW5kZW50LgotCSh0Y19nZW5fcmVsb2MpOiBCZXR0ZXIgZXJyb3IgbWVzc2FnZXMuCi0JKG1kX2Fzc2VtYmxlKTogUmVqZWN0IG9wY29kZXMgZm9yYmlkZGVuIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY3B1Ci0JdmFyaWFudC4gIFJld3JpdGUgaGFuZGxpbmcgY29kZSBmb3IgaW5zdHJ1Y3Rpb24gZmxhZ3MuCi0JKG1kX3Nob3J0b3B0cyk6IEFkZCBvcHRpb24gIm06Ii4KLQkobWRfcGFyc2Vfb3B0aW9uKTogR2V0IHRoZSBkZXNpcmVkIGNwdS9mcHUgdmFyaWFudC4KLQotCUZyb206IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0JKiBjb25maWd1cmUuaW4gKGFyY2hpdGVjdHVyZSB2YXJpYW50cyk6IENoZWNrIGZvciAiYXJtZWIiIGFuZCAiYXJtKiIsCi0Jc2V0IGVuZGlhbm5lc3MgYWNjb3JkaW5nbHkuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE5ldyBob29rcyBtZF9zdGFydF9saW5lX2hvb2sgYW5kCi0JbWRfYWZ0ZXJfcGFzc19ob29rLgotCSogY29uZmlnL2FybS17YmlnLGxpdH0ubXQ6IE5ldyBmaWxlcwotCSogY29uZmlnL3RjLWFybS5oICh7TElUVExFLEJJR31fRU5ESUFOLCBCWVRFX09SREVSKTogRGVmaW5lLgotCShUQVJHRVRfRk9STUFUKTogU2VsZWN0IGRlcGVuZGluZyBvbiBlbmRpYW5uZXNzIGFuZCBlbXVsYXRpb24gYW5kCi0Jb2JqZWN0IGZvcm1hdC4KLQkobWRfYWZ0ZXJfcGFzc19ob29rLCBtZF9zdGFydF9saW5lX2hvb2spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYXJtLmM6IEluY2x1ZGUgc3Vic2Vncy5oLCBzeW1ib2xzLmggYW5kIGxpc3RpbmcuaC4KLQkoc2hpZnRbXSk6IEFkZCB1cHBwZXIgY2FzZSBlcXVpdmFsZW50cy4KLQkoQ1BfVF9bWFldLCBUUkFOU19CSVQpOiBEZWZpbmUuCi0JKGNvbmRzW10pOiBEZWxldGUgaW5pdGlhbCBOVUxMIGVudHJ5LCBhZGQgImxvIiBlbnRyeSBhcyBzeW5vbnltIGZvcgotCSJjYyIuCi0JKExPTkdFU1RfRkxBRywgZmxhZ3NbXSk6IERlbGV0ZS4KLQkoYXJtX3Bzcik6IE5ldyBzdHJ1Y3R1cmUuCi0JKHBzcnNbXSk6IE5ldyB2YXJpYWJsZS4KLQkoUFNSX0FMTCk6IERlZmluZS4KLQkoTE9OR0VTVF9JTlNUKTogQnVtcCB0byA1LgotCShMSVRFUkFMX01BU0ssIENPTkRfTUFTSywgT1BDT0RFX01BU0ssIERBVEFfT1BfU0hJRlQpOiBEZWZpbmUuCi0JKE9QQ09ERV97QU5ELEVPUixTVUIsUlNCLEFERCxBREMsU0JDLFJTQyxUU1QsVEVRLENNUCxDTU4sT1JSLE1PVixCSUMsCi0JIE1WTn0pOiBEZWZpbmUuCi0JKGluc25zW10pOiBBZGQgc211bGwsIHVtdWxsLCBzbWxhbCwgdW1sYWwsIGxkZm0sIHN0Zm0sIG1zciBhbmQgbXJzCi0JaW5zdHJ1Y3Rpb25zLiAgQWRkIG5vcCBhbmQgYWRyIHBzZXVkbyBvcHMuCi0JKHJlZ190YWJsZSk6IEFkZCBBUENTIHJlZ2lzdGVyIG5hbWUgdmFyaWFudHMuCi0JKGFybV9wc3JfaHNoKTogTmV3IGhhc2ggdGFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCAibHRvcmciLCAicG9vbCIsICJleHRlbmQiLCAibGRvdWJsZSIgYW5kCi0JInBhY2tlZCIuCi0JKE1BWF9MSVRFUkFMX1BPT0xfU0laRSk6IERlZmluZS4KLQkoc3RydWN0IGxpdGVyYWxTKTogTmV3IHN0cnVjdHVyZS4KLQkobGl0ZXJhbHMsIG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlLCBsaXRfcG9vbF9udW0sIGN1cnJlbnRfcG9vbFApOiBOZXcKLQl2YXJpYWJsZXMuCi0JKGFkZF90b19saXRfcG9vbCwgc3ltYm9sX2xvY2F0ZSwgc3ltYm9sX21ha2VfZW1wdHkpOiBOZXcgZnVuY3Rpb25zLgotCSh2YWxpZGF0ZV9pbW1lZGlhdGUpOiBSZXR1cm4gRkFJTCBvbiBmYWlsdXJlLgotCShzX2x0b3JnKTogTmV3IGZ1bmN0aW9uLgotCShwc3JfcmVxdWlyZWRfaGVyZSwgcHNyZl9yZXF1aXJlZF9oZXJlKTogTmV3IGZ1bmN0aW9ucy4KLQkoY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlKTogTmV3IHBhcmFtZXRlciwgZmxhZywgYWxsIGNhbGxlcnMgY2hhbmdlZC4KLQlJZiBmbGFnIGlzIG5vbi16ZXJvLCByZXN0cmljdCB0aGUgbGVnYWwgYWRkcmVzc2luZyBtb2Rlcy4KLQkoZG9fbm9wLCBkb19tcnMsIGRvX21zciwgZG9fbXVsbCk6IE5ldyBmdW5jdGlvbnMuCi0JKG5lZ2F0ZV9kYXRhX29wKTogTmV3IGZ1bmN0aW9uLgotCShkYXRhX29wMik6IGFjY2VwdCAjeCx5IG1lYW5pbmcgeCByb3RhdGVkIHJpZ2h0IGJ5IHksIGJ1dCBvbmx5IHdoZW4KLQlzdWl0YWJsZSBjb25zdGFudHMuICBJZiBpbW1lZGlhdGUgaXMgbm90IGxlZ2FsLCB0cnkgY2hhbmdpbmcgdGhlCi0Jb3Bjb2RlLgotCShkb19hZHIpOiBOZXcgZnVuY3Rpb24uCi0JKGRvX2xkc3QpOiBhY2NlcHQgImxkciByZWcsID1leHByIi4gIFB1dCBleHByIGluIHRoZSBwb29sIGlmIGl0IGNhbid0Ci0JYmUgZG9uZSBhcyBhbiBpbW1lZGlhdGUuCi0JKGRvX2ZwX2xkc3QpOiBVc2UgQ1BfVF9bWFldLCBub3QgaW1tZWRpYXRlIHZhbHVlcy4KLQkoZG9fZnBfbGRtc3RtKTogTmV3IGZ1bmN0aW9uLgotCShhcm1fcHNyX3BhcnNlKTogTmV3IGZ1bmN0aW9uLgotCShvdXRwdXRfaW5zdCk6IFVzZSBJTlNOX1NJWkUgaW4gY2FsbCB0byBtZF9udW1iZXJfdG9fY2hhcnMuCi0JKG1kX2Fzc2VtYmxlKTogQWRkIGhhY2sgc28gdGhhdCAiTGFiZWwgaW5zdHJ1Y3Rpb24iIGNhdXNlcyBhbGlnbm1lbnQgb2YKLQl0aGUgbGFiZWwuCi0JKGFybV9hZnRlcl9wYXNzX2hvb2ssIGFybV9zdGFydF9saW5lX2hvb2ssIGFybV9mcm9iX3N5bWJvbCk6IE5ldwotCWZ1bmN0aW9ucy4KLQotV2VkIE1heSAxNyAwNToyNToxNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfc2hvd191c2FnZSk6IEFkZCBcJ3MgYXQgZW5kIG9mIGxpbmVzIGluCi0Jc3RyaW5ncyBmb3Igbm9uLUdDQyBjb21waWxlcnMuCi0KLVR1ZSBNYXkgMTYgMTk6MzY6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9wb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9mb3JtYXRfb3BzKTogVXNlIGl0LgotCShvYmpfZWNvZmZfZnJvYl9zeW1ib2wpOiBOb3cgc3RhdGljLgotCi1XZWQgTWF5IDE3IDAwOjU5OjEyIDE5OTUgIEFuZHJldyBDYWduZXkgLSBha2EgTm9pZCAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYmVnaW4pOiBXYXMgYXNzdW1pbmcgdGhhdCBhbiBpbnN0cnVjdGlvbiB3YXMKLQliaWdlbmRpYW4gYW5kIGhlbmNlIDE2Yml0IHJlbG9jcyB3aXRoaW5nIGluc3RydWN0aW9ucyB3b3VsZAotCUFMV0FZUyBiZSBhdCBhZGRyZXNzZXMgaSsyLWkrMy4gIEluIExFIG1vZGUgaXQgaXMgaSswLWkrMS4KLQotVHVlIE1heSAxNiAxNjoyOTo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLW11bHRpLmggKG9ial9mcm9iX3N5bWJvbCwgb2JqX2Zyb2JfZmlsZSwgU19HRVRfU0laRSwKLQlTX1NFVF9TSVpFLCBTX0dFVF9BTElHTiwgU19TRVRfQUxJR04sIG9ial9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLAotCU9CSl9QUk9DRVNTX1NUQUIpOiBOZXcgbWFjcm9zLgotCSogY29uZmlnL3RjLW1pcHMuYzogUHJvdGVjdCBhZ2FpbnN0IHJlZGVmaW5pbmcgdGhlbSBhbHNvIHdoZW4KLQlpbmNsdWRpbmcgb2JqLWVsZi5oLiAgVGVzdCBvbmx5IE9CSl9FTEYgZm9yIGluY2x1ZGluZyBlbGYvbWlwcy5oLgotCShtaXBzX2luaXRfYWZ0ZXJfYXJncyk6IE5ldyBmdW5jdGlvbi4gIFNldCBieXRlX29yZGVyIGhlcmUuCi0JKG1kX3BhcnNlX29wdGlvbik6IE5vdCBoZXJlLgotCShieXRlX29yZGVyKTogRG9uJ3QgYm90aGVyIGluaXRpYWxpemluZy4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogRGVjbGFyZS4KLQkodGNfaW5pdF9hZnRlcl9hcmdzKTogTmV3IG1hY3JvLgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBEbyBFTEYvRUNPRkYgdGVzdCBhdCBydW4gdGltZSwgbm90IGNvbXBpbGUKLQl0aW1lLgotCi1GcmkgTWF5IDEyIDE0OjE3OjQ3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlJbml0aWFsIHN1cHBvcnQgZm9yIFBFIG9iamVjdCBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlIChpMzg2LSotcGUsIGkzODYtKi0qbnQpOiBBZGQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IENvcGUgd2l0aCBQRSB3aWVyZG5lc3MuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEVfUEUpOiBOZXcgdGFyZ2V0IGZvcm1hdC4KLQotVGh1IE1heSAxMSAxNDo1ODoyMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChORUVEX0VDT0ZGX0RFQlVHKTogRGVmaW5lIGlmIEVDT0ZGX0RFQlVHR0lORwotCXdhcyBkZWZpbmVkIGJ5IGhlYWRlciBmaWxlcy4gIFRlc3QgaW4gcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscwotCWluc3RlYWQgb2YgRUNPRkZfREVCVUdHSU5HLgotCShlY29mZl9kZWJ1Z19wc2V1ZG9fdGFibGUpOiBNYWtlIGVtcHR5IGlmIE5FRURfRUNPRkZfREVCVUcgaXMgbm90Ci0JZGVmaW5lZC4KLQkob2JqX3JlYWRfYmVnaW5faG9vaywgb2JqX3N5bWJvbF9uZXdfaG9vaywgZWxmX2Zyb2Jfc3ltYm9sLAotCWVsZl9mcm9iX2ZpbGUpOiBPbmx5IGNhbGwgZWNvZmYgcm91dGluZXMgaWYgTkVFRF9FQ09GRl9ERUJVRyBpcwotCWRlZmluZWQuCi0JKGVsZl9lY29mZl9zZXRfZXh0LCBlbGZfZ2V0X2V4dHIsIGVsZl9zZXRfaW5kZXgpOiBEZWZpbmUgb25seSBpZgotCU5FRURfRUNPRkZfREVCVUcgaXMgZGVmaW5lZC4KLQkoZWxmX2Zvcm1hdF9vcHMpOiBSZWZlcmVuY2UgZWxmX2Vjb2ZmX3NldF9leHQgb25seSBpZgotCU5FRURfRUNPRkZfREVCVUcuCi0KLVdlZCBNYXkgMTAgMTg6MDk6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBJbmNsdWRlIEBleHRyYV9vYmplY3RzQC4KLQkob2JqLWVsZi5vLCBvYmotZWNvZmYubywgZS1taXBzZWxmLm8sIGUtbWlwc2Vjb2ZmLm8pOiBOZXcgcnVsZXMKLQlmb3IgYnVpbGRpbmcgdGhlc2UgaW5kZXBlbmRlbnRseS4KLQkqIGVtdWwtdGFyZ2V0LmgsIGNvbmZpZy9lLW1pcHNlbGYuYywgY29uZmlnL2UtbWlwc2Vjb2ZmLmM6IE5ldwotCWZpbGVzLgotCi0JKiBhY2NvbmZpZy5oIChERUZBVUxUX0VNVUxBVElPTiwgRU1VTEFUSU9OUywgVVNFX0VNVUxBVElPTlMsCi0JT0JKX01BWUJFXyosIEkzODZDT0ZGLCBNNjhLQ09GRiwgTTg4S0NPRkYpOiBOZXcgbWFjcm9zLgotCSogYWNsb2NhbC5tNCAoR0FTX1VOSVEpOiBOZXcgbWFjcm8uCi0KLQkqIGFzLmMgKGVtdWxhdGlvbnMsIG5fZW11bGF0aW9ucykgW1VTRV9FTVVMQVRJT05TXTogTmV3IHZhcmlhYmxlLgotCShzZWxlY3RfZW11bGF0aW9uX21vZGUsIGRlZmF1bHRfZW11bF9iZmRfbmFtZSwgY29tbW9uX2VtdWxfaW5pdCkKLQlbVVNFX0VNVUxBVElPTlNdOiBOZXcgZnVuY3Rpb25zLgotCShtYWluKSBbVVNFX0VNVUxBVElPTlNdOiBDYWxsIHNlbGVjdF9lbXVsYXRpb25fbW9kZSBiZWZvcmUgb3RoZXIKLQlpbml0aWFsaXphdGlvbi4KLQkqIGVtdWwuaDogTmV3IGZpbGUuCi0JKiBhcy5oIFtVU0VfRU1VTEFUSU9OU106IEluY2x1ZGUgaXQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGVuYWJsZS10YXJnZXRzIG9wdGlvbi4gIEl0ZXJhdGUgb3ZlciB0YXJnZXQKLQlsaXN0LCBidWlsZGluZyB1cCBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGUgZm9ybWF0cyBhbmQgZW11bGF0aW9uCi0JY29uZmlndXJhdGlvbnMuICAoT25seSBzdXBwb3J0cyBlbXVsYXRpb25zIGZvciBNSVBTIENQVSBzbyBmYXIuKQotCUlmIG11bHRpcGxlIGZvcm1hdHMgYXJlIG5lZWRlZCwgc2V0IG9ial9mb3JtYXQgdG8gbXVsdGkgYW5kIGFkZAotCWZvcm1hdCBjb25maWcgZmlsZXMgdG8gZXh0cmFfZmlsZXMuICBJZiBlbXVsYXRpb24gbW9kZXMgYXJlCi0JbmVlZGVkLCBhZGQgdGhlIHJlbGV2YW50IGZpbGVzIHRvIGV4dHJhX2ZpbGVzLgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBJMzg2Q09GRiwgTTY4S0NPRkYsIE04OEtDT0ZGIGZvciB0aG9zZQotCWNvbmZpZ3VyYXRpb25zLgotCi0JKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogRmlsZW5hbWUgYXJndW1lbnQgbm93Ci0JcG9pbnRzIHRvIGNvbnN0LgotCSogZWNvZmYuaCAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IFVwZGF0ZWQgZGVjbGFyYXRpb24uCi0KLQkqIG9iai5oIChvYmpfcmVhZF9iZWdpbl9ob29rKTogRG9uJ3QgZGVjbGFyZSBmdW5jdGlvbiBpZiBpdCdzCi0JYWxyZWFkeSBhIG1hY3JvLgotCi0JKiByZWFkLmMgKHNfc3BhY2UsIGNvbnMsIHN0cmluZ2VyKTogSWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgaXMKLQlkZWZpbmVkLCBjYWxsIGl0IG9uIGVudHJ5LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogSWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLQlpcyBkZWZpbmVkLCBjYWxsIGl0IG9uIGVudHJ5LiAgSWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgaXMKLQlkZWZpbmVkLCBjYWxsIGl0IGJlZm9yZSByZXR1cm5pbmcgbm9ybWFsbHkuCi0KLQkqIHJlYWQuaCAodGFyZ2V0X2JpZ19lbmRpYW4pOiBEZWNsYXJlLgotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBBZGRlZCBuZXcgZnVuY3Rpb24gcG9pbnRlciBmaWVsZHMKLQllY29mZl9zZXRfZXh0LCByZWFkX2JlZ2luX2hvb2ssIHN5bWJvbF9uZXdfaG9vay4KLQkoZWNvZmZfZm9ybWF0X29wcywgZWxmX2Zvcm1hdF9vcHMpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3NfZ2V0X3NpemUsIGVsZl9zX3NldF9zaXplLAotCWVsZl9zX2dldF9hbGlnbiwgZWxmX3Nfc2V0X2FsaWduLCBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcywKLQllbGZfc2VjX3N5bV9va19mb3JfcmVsb2MpOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfZm9ybWF0X29wcyk6IE5ldyB2YXJpYWJsZS4KLQkoZWxmX2Zyb2Jfc3ltYm9sKTogTm93IHRha2VzIGFkZGl0aW9uYWwgaW50KiBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9mcm9iX3N5bWJvbCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoZWxmX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgotCShvYmpfcG9wX2luc2VydCk6IERlZmluZSB0byBjYWxsIGVsZl9wb3BfaW5zZXJ0LgotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYywKLQlvYmpfZWNvZmZfZnJvYl9zeW1ib2wpOiBOZXcgZnVuY3Rpb25zLgotCShlY29mZl9mb3JtYXRfb3BzKTogTmV3IHZhcmlhYmxlLgotCi0JKiBjb25maWcvdGUtZ2VuZXJpYy5oOiBJZiBPQkpfSEVBREVSIGlzIGRlZmluZWQsIHVzZSBpdCBhcyB0aGUKLQlmaWxlbmFtZSB0byBpbmNsdWRlIGluIHBsYWNlIG9mIG9iai1mb3JtYXQuaC4KLQkqIGNvbmZpZy90ZS1tdWx0aS5oOiBOZXcgZmlsZSwgY29waWVkIGZyb20gdGUtZ2VuZXJpYy5oLgotCSogY29uZmlnL29iai1lbGYuYyAoT0JKX0hFQURFUik6IERlZmluZSBpdCB0byAib2JqLWVsZi5oIi4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoT0JKX0hFQURFUik6IERlZmluZSBpdCB0byAib2JqLWVjb2ZmLmgiLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChFQ09GRl9ERUJVR0dJTkcpOiBEZWZhdWx0IHRvIDAuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2ssIG9ial9zeW1ib2xfbmV3X2hvb2ssIGVsZl9mcm9iX3N5bWJvbCwKLQllbGZfZnJvYl9maWxlKTogVGVzdCBpdCBhdCBydW4gdGltZS4KLQkob2JqX2Vjb2ZmX3NldF9leHQsIGVsZl9nZXRfZXh0ciwgZWxmX3NldF9pbmRleCk6IERlZmluZQotCXVuY29uZGl0aW9uYWxseS4KLQkoZWxmX3BzZXVkb190YWJsZSk6IFJlbmFtZWQgZnJvbSBvYmpfcHNldWRvX3RhYmxlLCBub3cgc3RhdGljLgotCShlY29mZl9kZWJ1Z19wc2V1ZG9fdGFibGUpOiBTcGxpdCBvZmYgaW50byBzZXBhcmF0ZSB0YWJsZS4gIERlZmluZQotCWl0IHVuY29uZGl0aW9uYWxseS4KLQkoZWxmX3BvcF9pbnNlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfcG9wX2luc2VydCk6IERlY2xhcmUuCi0JKG9ial9wb3BfaW5zZXJ0KTogTmV3IG1hY3JvLgotCShvYmpfZWNvZmZfc2V0X2V4dCkgWyFPQkpfTUFZQkVfRUxGXTogRGVmaW5lIHRvIGVsZl9lY29mZl9zZXRfZXh0LgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfZWNvZmZfc2V0X2V4dCk6IERlZmluZSB0byBlY29mZl9zZXRfZXh0LgotCi0JKiBjb25maWcvdGMtbWlwcy5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkobWlwc19wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkobWRfcG9wX2luc2VydCk6IENhbGwgaXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IElmIE9CSl9NQVlCRV9FTEYgaXMgZGVmaW5lZCwgaW5jbHVkZQotCW9iai1lbGYuaCwgYnV0IHByZXNlcnZlIE9VVFBVVF9GTEFWT1IgYW5kIHByb3RlY3Qgc29tZSBvdGhlcgotCW1hY3JvcyBmcm9tIHJlZGVmaW5pdGlvbi4KLQkoRUNPRkZfREVCVUdHSU5HKTogRGVmYXVsdCB0byAwLiAgQWxsIHJlZmVyZW5jZXMgY2hhbmdlZCB0bwotCXJ1bi10aW1lIHRlc3RzIG9yIG1hZGUgdW5jb25kaXRpb25hbC4KLQkoc19zdHJpbmdlciwgc19taXBzX3NwYWNlLCBzX2VsZl9zZWN0aW9uKTogRGVsZXRlZC4KLQkobWRfcHNldWRvX3RhYmxlKTogRG9uJ3QgcmVmZXIgdG8gdGhlbS4gIFNwbGl0IHRhYmxlIGludG8gdGhyZWUKLQlzZWN0aW9ucywgZm9yIE1JUFMsIG5vbi1FQ09GRl9ERUJVR0dJTkcsIGFuZCBFTEYuCi0JKG1pcHNfcG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbmFibGVfYXV0b19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1pcHNfcG9wX2luc2VydCk6IERlY2xhcmUuCi0JKG1kX3BvcF9pbnNlcnQpOiBOZXcgbWFjcm8uCi0JKG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWNsYXJlLgotCShtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBtYWNyby4KLQkobWlwc19lbmFibGVfYXV0b19hbGlnbik6IERlY2xhcmUuCi0JKG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogTmV3IG1hY3JvLCBjYWxscwotCW1pcHNfZW5hYmxlX2F1dG9fYWxpZ24uCi0KLVR1ZSBNYXkgIDkgMTc6MDc6NDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mLgotCSogY29uZmlnL3BwYy1iaWcubXQ6IE5ldyBmaWxlIGZvciBiaWcgZW5kaWFuIFBvd2VyUEMgc3lzdGVtcy4KLQkqIGNvbmZpZy9wcGMtbGl0Lm10OiBOZXcgZmlsZSBmb3IgbGl0dGxlIGVuZGlhbiBQb3dlclBDIHN5c3RlbXMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGFyZ2V0X2JpZ19lbmRpYW4pOiBEZWNsYXJlLgotCShUQVJHRVRfRk9STUFUKTogRGVhbCB3aXRoIGxpdHRsZSBhbmQgYmlnIGVuZGlhbiBFTEYgdmFyaWFudHMuCi0JKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lIGFzIDEsIG5vdCBlbXB0eS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmlnX2VuZGlhbik6IERlbGV0ZSB2YXJpYWJsZSwgdXNlCi0JdGFyZ2V0X2JpZ19lbmRpYW4gaW5zdGVhZC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUGFyc2UgLW1saXR0bGUgYW5kIC1tbGl0dGxlLWVuZGlhbiB0byB1c2UKLQlsaXR0bGUgZW5kaWFuIHN1cHBvcnQuICBQYXJzZSAtbWJpZyBhbmQgLW1iaWctZW5kaWFuIHRvIHVzZSBiaWcKLQllbmRpYW4gc3VwcG9ydC4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZSB0byByZWZsZWN0IGN1cnJlbnQgc3dpdGNoZXMuCi0JKHBwY19zZXRfY3B1KTogUmVjb2duaXplIHBvd2VycGNsZSBhcyBsaXR0bGUgZW5kaWFuIFBvd2VyUEMuICBVc2UKLQlhc19mYXRhbCwgbm90IGFib3J0IGlmIHVua25vd24gbWFjaGluZS4KLQotVHVlIE1heSAgOSAxMDo1ODo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogQ2FzdCAqdmFscCB0byBhbiBpbnRlZ2VyIHdoZW4KLQljb21wYXJpbmcgYWdhaW5zdCBzaWduZWQgdmFsdWVzLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBNYWtlICJkaXN0YW5jZSIgYW4gaW50ZWdlci4KLQotVHVlIE1heSAgOSAwMDo0NzowMyAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKSBbQkZEX0FTU0VNQkxFUl06IE5ldyB0eXBlLgotCSh0aGlzX2Zvcm1hdCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlIG5ldyB2YXJpYWJsZSwgaWYgbm90Ci0JYWxyZWFkeSBkZWZpbmVkIGFzIGEgbWFjcm8uCi0KLU1vbiBNYXkgIDggMjE6NDQ6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5oIChzZWdfaW5mbyk6IFByb3ZpZGUgZHVtbXkgdmVyc2lvbiBmb3IKLQlub24tQkZEX0FTU0VNQkxFUiwgbm9uLU1BTllfU0VHTUVOVFMgY29uZmlndXJhdGlvbi4gIEl0IHNob3VsZAotCW5ldmVyIGdldCBpbnZva2VkLCBidXQgdGhpcyBpcyBlYXNpZXIgdGhhbiBjb25kaXRpb25hbGl6aW5nIHNvbWUKLQlvZiB0aGUgdXNlcy4KLQkoc3RydWN0IHNlZ19pbmZvX3RyYXNoKTogRHVtbXkgdHlwZSB1c2VkIGJ5IGFib3ZlIHRvIG1ha2UgY29kZQotCWNvbXBpbGUuCi0KLUZyaSBNYXkgIDUgMTQ6NDc6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZpbmUgdG8gMSwgbm90Ci0JZW1wdHkuCi0JKiBjb25maWcvb2JqLWVsZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLXNvbS5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGl0dG8uCi0KLVRodSBNYXkgIDQgMTk6MjY6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IEFsd2F5cyBkZWZpbmUuICBJZgotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMgaXNuJ3Qgc2V0LCBhYm9ydC4KLQkoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERlZmF1bHQgdG8gemVyby4KLQkoYW91dF9wcm9jZXNzX3N0YWIpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBmcm9tIHNfc3RhYl9nZW5lcmljLgotCShPQkpfUFJPQ0VTU19TVEFCKSBbQU9VVF9TVEFCU106IERlZmluZSB0byBjYWxsIGFvdXRfcHJvY2Vzc19zdGFiLAotCWlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKHNfc3RhYl9nZW5lcmljKTogVGVzdCBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIGF0IHJ1biB0aW1lLiAgSWYKLQlpdCdzIG5vdCBzZXQsIGFuZCBPQkpfUFJPQ0VTU19TVEFCIGlzbid0IGRlZmluZWQsIGFib3J0LiAgQWx3YXlzCi0JcGFzcyBzaXggYXJndW1lbnRzIHRvIE9CSl9QUk9DRVNTX1NUQUIuCi0JKiByZWFkLmggKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBEZWNsYXJlIHVuY29uZGl0aW9uYWxseS4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChBT1VUX1NUQUJTKTogRGVmaW5lLgotCSogY29uZmlnL29iai1ib3V0LmggKEFPVVRfU1RBQlMpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9QUk9DRVNTX1NUQUIpOiBBZGQgbmV3IGZpcnN0IGFyZ3VtZW50LAotCWlnbm9yZWQuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfUFJPQ0VTU19TVEFCKSBbRUNPRkZfREVCVUdHSU5HXTogRGl0dG8uCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoRUNPRkZfREVCVUdHSU5HKTogRGVmaW5lIHRvIDEsIG5vdCBlbXB0eS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVDT0ZGX0RFQlVHR0lORyk6IERpdHRvLiAgVGVzdCB2YWx1ZSwgbm90Ci0Jd2hldGhlciBpdCdzIGRlZmluZWQuCi0KLVdlZCBNYXkgIDMgMjE6Mzg6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoTE9DQUxfTEFCRUxTX0RPTExBUiwgTE9DQUxfTEFCRUxTX0ZCKTogSWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLCBkZWZpbmUgdGhlbSB0byB6ZXJvLgotCSogY29uZmlnL3RjLSouaCwgY29uZmlnL3RlLSouaDogSWYgZGVmaW5pbmcgdGhlbSwgZGVmaW5lIHRoZW0gdG8KLQliZSAxIGluc3RlYWQgb2YgZW1wdHkuCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQsIG9wZXJhbmQpOiBUZXN0IHRoZW0gYXQgcnVuIHRpbWUKLQlpbnN0ZWFkIG9mIGNvbXBpbGUgdGltZS4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogRGl0dG8uCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogRGl0dG8uCi0JKGRvbGxhcl8qLCBkZWZpbmVfZG9sbGFyX2xhYmVsLCBmYl8qKTogRGVmaW5lIHVuY29uZGl0aW9uYWxseS4KLQkqIHN5bWJvbHMuaCAoZG9sbGFyXyosIGRlZmluZV9kb2xsYXJfbGFiZWwsIGZiXyopOiBEZWNsYXJlCi0JdW5jb25kaXRpb25hbGx5LgotCi1XZWQgTWF5ICAzIDEzOjA4OjUzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEbyBub3RoaW5nIGZvciBhbiBvdXQgb2YgcmFuZ2UKLQlQQyByZWxhdGl2ZSBjYWxsIHNpbmNlIHRob3NlIG9ubHkgb2NjdXIgaW4gY2FzZXMgd2hlcmUgdGhlIGxpbmtlcgotCWNhbiBmaXggdGhlbSB1cC4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NhdGlvbnMgZm9yIG91dCBvZiByYW5nZSBQQwotCXJlbGF0aXZlIGNhbGxzLgotCi1UdWUgTWF5ICAyIDE2OjM0OjQ3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUgKGhwcGEqLSotbGl0ZXMqKTogSGFuZGxlIGp1c3QgbGlrZSBocHBhKi0qLSplbGYqLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotVHVlIE1heSAgMiAxMToyMjowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvcF9pbnNlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKHBvcF9vdmVycmlkZV9vaywgcG9wX3RhYmxlX25hbWUpOiBOZXcgdmFyaWFibGVzLgotCShtZF9wb3BfaW5zZXJ0LCBvYmpfcG9wX2luc2VydCk6IE5ldyBtYWNyb3MuCi0JKHBvYmVnaW4pOiBVc2UgdGhlbS4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVXNlIFVTRV9TVERBUkcgYW5kIFVTRV9WQVJBUkdTIGluc3RlYWQgb2YKLQlOT19TVERBUkcgJmMuCi0KLQkqIHJlYWQuYyAodGFyZ2V0X2JpZ19lbmRpYW4pOiBJZiBUQVJHRVRfQllURVNfQklHX0VORElBTiBpcwotCWRlZmluZWQsIGluaXRpYWxpemUgdG8gMS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IENoYW5nZWQgdG8gYSBmdW5jdGlvbiwKLQljaGVja2luZyBmbGF2b3IgYW5kIGJ5dGUgb3JkZXIgYXQgcnVuIHRpbWUuCi0JKG1kX3BhcnNlX29wdGlvbiwgY2FzZXMgT1BUSU9OX0VCIGFuZCBPUFRJT05fRUwpOiBTZXQKLQl0YXJnZXRfYmlnX2VuZGlhbiBoZXJlLgotCShtZF9iZWdpbik6IE5vdCBoZXJlLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc190YXJnZXRfZm9ybWF0KTogQWRqdXN0IGRlY2xhcmF0aW9uLgotCShUQVJHRVRfRk9STUFUKTogQ2FsbCBtaXBzX3RhcmdldF9mb3JtYXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpOiBEZWZpbmUgaW4gdGVybXMgb2YKLQlPVVRQVVRfRkxBVk9SLgotCSogY29uZmlnL3RjLW1pcHMuYyAoZ19zd2l0Y2hfdmFsdWUsIGdfc3dpdGNoX3NlZW4pOiBEZWZpbmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0JKG1kX2JlZ2luLCBtaXBzX2lwLCBtZF9wYXJzZV9vcHRpb24sIHNfY2hhbmdlX3NlYywgc19vcHRpb24sCi0Jc19hYmljYWxscywgbm9waWNfbmVlZF9yZWxheCk6IENoZWNrIFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQgYXQgcnVuCi0JdGltZSwgaW5zdGVhZCBvZiBjb21waWxpbmcgY29uZGl0aW9uYWxseSBvbiBHUE9QVC4KLQkoR1BPUFQpOiBEb24ndCBkZWZpbmUuCi0JKG1kX3Nob3J0b3B0cyk6IEFsd2F5cyBpbmNsdWRlIC1HLgotCShSREFUQV9TRUNUSU9OX05BTUUpOiBTZWxlY3QgYXQgcnVuIHRpbWUuCi0JKG1kX2JlZ2luKTogVGVzdCBmb3IgRUxGIGZvcm1hdCBhdCBydW4gdGltZSBpbnN0ZWFkIG9mIGNvbXBpbGUgdGltZS4KLQkobWlwc19pcCwgc19jaGFuZ2Vfc2VjKTogRGl0dG8uCi0JKG1kX3BhcnNlX29wdGlvbiwgY2FzZXMgT1BUSU9OX0NBTExfU0hBUkVEIGFuZCBPUFRJT05fTk9OX1NIQVJFRCk6Ci0JRGl0dG8uCi0JKE9QVElPTl9DQUxMX1NIQVJFRCwgT1BUSU9OX05PTl9TSEFSRUQsIG1pcHNfcmVnbWFza19mcmFnKTogRGVmaW5lCi0JdW5jb25kaXRpb25hbGx5LgotCi1UdWUgTWF5ICAyIDAwOjE3OjA0IDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQXyopOiBOZXcgdmFyaWFibGVzLgotCSh0YXJnLWNwdS5vKTogRGVwZW5kIG9uIG9uZSwgc2VsZWN0ZWQgYnkgYXV0b2NvbmYgc3Vic3RpdHV0aW9uLAotCWluc3RlYWQgb2YgVEFSR19DUFVfREVQRU5ERU5UUy4KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSAkY3B1X3R5cGUsICRvYmpfZm9ybWF0LCAkYXRvZiwgYW5kCi0JJGVtdWxhdGlvbiBpbnRvIE1ha2VmaWxlLmluLgotCSogY29uZmlnL2g4MzAwLm10OiBEZWxldGVkLgotCSogY29uZmlnL2g4NTAwLm10OiBEZWxldGVkLgotCSogY29uZmlnL2kzODZjb2ZmLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9tNjhrLm10OiBEZWxldGVkLgotCSogY29uZmlnL202OGtjb2ZmLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9tODhrY29mZi5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbWlwcy1iaWcubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL21pcHMtbGl0Lm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9zaC5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy93NjUubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvejhrLm10OiBEZWxldGVkLgotCi0JKiBjb25maWcvdGUtZHB4Mi5oIChkcHgyKTogRGVsZXRlZCB1bnVzZWQgbWFjcm8uCi0JKiBjb25maWcvdGUtZ2VuZXJpYy5oIChURV9HRU5FUklDKTogRGl0dG8uCi0JKiBjb25maWcvdGUtZ28zMi5oIChURV9HTzMyKTogRGl0dG8uCi0JKiBjb25maWcvdGUtaHAzMDAuaCAoVEVfSFAzMDApOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1ocHBhLmggKFBBLCBfVEVfUEFfSCk6IERpdHRvLgotCSogY29uZmlnL3RlLWljOTYwLmggKFRFX0lDOTYwKTogRGl0dG8uCi0JKiBjb25maWcvdGUtbmJzZDUzMi5oIChURV9ORVRCU0Q1MzIpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1wYzUzMm1hY2guaCAoVEVfUEM1MzJNQUNIKTogRGl0dG8uCi0JKiBjb25maWcvdGUtcHBjbncuaCAoVEVfUFBDTlcpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1zY28zODYuaCAoc2NvdW5peCk6IERpdHRvLgotCi1Nb24gTWF5ICAxIDE1OjU5OjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IElmIG9ial9hcHBfZmlsZSBpcyBkZWZpbmVkLCBjYWxsIGl0IHdpdGgKLQlzdHJpbmcgYXMgYXJndW1lbnQuICBEb24ndCBjYWxsIGNfZG90X2ZpbGVfc3ltYm9sIG9yCi0JZWxmX2ZpbGVfc3ltYm9sLgotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9hcHBfZmlsZSk6IERlZmluZSBhcyBjX2RvdF9maWxlX3N5bWJvbC4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9hcHBfZmlsZSk6IERlZmluZSBhcyBlbGZfZmlsZV9zeW1ib2wuCi0KLQkqIGFzLmggKE9VVFBVVF9GTEFWT1IpOiBEb24ndCBkZWZpbmUgaGVyZS4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChPVVRQVVRfRkxBVk9SKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChPVVRQVVRfRkxBVk9SKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmLmggKE9VVFBVVF9GTEFWT1IpIFtCRkRfQVNTRU1CTEVSXTogRGVmaW5lLgotCSogY29uZmlnL29iai1lY29mZi5oIChPVVRQVVRfRkxBVk9SKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuaCAoT1VUUFVUX0ZMQVZPUik6IERlZmluZS4KLQotVGh1IEFwciAyNyAyMDowNzozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IFVzZSBvbmUgaW4gc3JjZGlyIGlmIHByZXNlbnQuCi0JKFJVTlRFU1RGTEFHUyk6IERlZmluZS4KLQotV2VkIEFwciAyNiAxNTo1NDoxMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgbW9yZSBwb3J0YWJsZSBhbGlnbm1lbnQgaGFuZGxpbmcgaW4gYXNzZW1ibHkgY29kZSwKLQliYXNlZCBvbiBwYXRjaGVzIGZyb20gQnJ5YW4gRm9yZCA8YmFmb3JkQHNjaGlyZi5jcy51dGFoLmVkdT46Ci0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGRlZCBiYWxpZ24gYW5kIHAyYWxpZ24sIGZvciBhbGlnbmluZyBieQotCWJ5dGVzIG9yIHBvd2VycyBvZiB0d28gaW5kZXBlbmRlbnQgb2Ygd2hhdCAiLmFsaWduIiBkb2VzIGZvciBhCi0JZ2l2ZW4gdGFyZ2V0LgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IHRoZW0uCi0KLVR1ZSBBcHIgMjUgMTE6MTI6MDQgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkB0aGVwdWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IExvb2sgZm9yIG02OGstKi12eHdvcmtzKiByYXRoZXIgdGhhbgotCWp1c3QgbTY4ay13cnMtdnh3b3JrcyBzbyBnYXMgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yCi0JbTY4ay12eHdvcmtzNS4xLgotCi1GcmkgQXByIDIxIDE1OjE5OjA2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBJZiBmeF9yX3R5cGUgaXMgemVybywgaGFuZGxlCi0JZnhfc2l6ZSBvZiAxLCBhbmQgYWJvcnQgb24gdW5yZWNvZ25pemVkIHNpemVzLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRml4IGJ1ZyBpbiBsYXN0IGNoYW5nZSByZWdhcmRpbmcKLQlub24taXN2YXIgY2FzZS4KLQotU3VuIEFwciAxNiAwMTo1Mjo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG1kX3JlbGF4X3RhYmxlLCBUQ19HRU5FUklDX1JFTEFYX1RBQkxFKToKLQlNaXNzZWQgdGhpcyBvbmUgaW4gMTEgQXByIGNoYW5nZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOiBGaXggdHlwby4KLQotVGh1IEFwciAxMyAxODoxODowOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogSW5zdGVhZCBvZiBhYm9ydGluZyBvbiBsYXJnZQotCWRpc3BsYWNlbWVudHMsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UuICBEb24ndCBpbnZva2UgdGhlIGNvZGUgdGhhdAotCWZvbGxvd2VkIHRoZSBhYm9ydCBjYWxsIHVudGlsIGl0J3MgYmVlbiB2ZXJpZmllZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfc2hvd191c2FnZSk6IEFkZCA2ODA2MCB0byBsaXN0LiAgU3BsaXQgY3B1Ci0JbGlzdCBpbnRvIHRocmVlIGxpbmVzLgotCi1UaHUgQXByIDEzIDE0OjM0OjM2IDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBhZGRlci5jeWdudXMuY29tPgotCi0JKiB0Yy1tNjhrLmMgKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVGVzdCBmb3IgbTY4MzYwLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gbTY4MzYwLgotCSogdGMtbTY4ay5oIChUQVJHRVRfV09SRF9TSVpFKTogRGVmaW5lLgotCShUQVJHRVRfQVJDSCk6IERlZmluZS4KLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogSWYgVEFSR0VUX1dPUkRfU0laRSBpcyBkZWZpbmVkLAotCXNpZ24tZXh0ZW5kIGFwcHJvcHJpYXRlbHkuCi0KLVRodSBBcHIgMTMgMTE6MjA6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogUHJvcGVybHkgdXNlIFBBUkFNUyB0bwotCWhpZGUgcHJvdG90eXBlIGZyb20gbm9uLUFOU0kgY29tcGlsZXJzLCBhbmQgZG9uJ3QgdXNlIEFOU0kgc3ludGF4Ci0JZm9yIGFyZ3VtZW50cy4KLQotV2VkIEFwciAxMiAxMjoyMDoxOSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW4gKFRERUZJTkVTKTogUHV0IGVtcHR5IGRlZmluaXRpb24gaW50bwotCW1ha2VmaWxlIGZyYWdtZW50LgotCSogbXB3LW1ha2UuaW4gKHhtYWxsb2MuYy5vKTogUmVtb3ZlLgotCShhcy5uZXcpOiBEZXBlbmQgb24gVmVyc2lvbi5yLgotCShWZXJzaW9uLnIpOiBHZW5lcmF0ZSBmcm9tIHZlcnNpb24gaW5mby4KLQotCSogbXB3LW1ha2UuaW46IERlbGV0ZSByZWZlcmVuY2VzIHRvIGhleC12YWx1ZS5jLgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgbWFwcGluZyBmcm9tIGNvbmZpZ3MgdG8gb2JqZWN0IGZpbGUgZm9ybWF0cywKLQlnZXQgVkVSU0lPTiBmcm9tIE1ha2VmaWxlLmluIGFuZCBhZGQgdG8gbWsudG1wLgotCShtaXBzLWlkdC1lY29mZikgW1RERUZJTkVTXTogQWRkIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCSogbXB3LW1ha2UuaW4gKFZFUlNJT04sIGdDKTogRG9uJ3QgZGVmaW5lLgotCShBTExfQ0ZMQUdTKTogUmVtb3ZlIC1kIGZsYWdzLgotCShjb25maWcuaCk6IFJlbW92ZSBkZWZpbml0aW9uIG9mIE1QVywgYWRkIEhBVkVfU1REQVJHX0gsCi0JQkZEX0FTU0VNQkxFUi4KLQotCSogbXB3LW1ha2UuaW4gKEFMTF9DRkxBR1MpOiBBZGQgZGVmaW5pdGlvbiBvZiBIQVZFX1NUREFSR19ILAotCWluY2x1ZGUgb2YgOjpsaWJpYmVydHk6LgotCShjb25maWcuaCk6IElmZGVmIGNvbnRlbnRzIG9uIEdBU19WRVJTSU9OLgotCi0JKiBtcHctbWFrZS5pbiAoYXMuYyk6IENvbXBpbGUgd2l0aCBDIG5vdCBnQy4KLQkoY29uZmlnLXN0YW1wKTogVG91Y2ggY29ycmVjdGx5LgotCShpbnN0YWxsLW9ubHkpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogRGVwZW5kIG9uIGFsbCBhbmQgaW5zdGFsbC1vbmx5LgotCi0JKiBtcHctY29uZmlnLmluOiBQYXJzZSB0YXJnZXQgYW5kIHVzZSB0byBnZW5lcmF0ZSBmb3J3YXJkIGluY2x1ZGVzCi0JdG8gdGMtLCBvYmotLCBhbmQgYXRvZi0gZmlsZXMsIHVzZSB0ZS1nZW5lcmljLmggZm9yIGVtdWxhdGlvbi4KLQkqIG1wdy1tYWtlLmluIChWRVJTSU9OKTogRGVmaW5lLgotCShhcy5jKTogQ29tcGlsZSB3aXRoIEdDQy4KLQkoVEFSR19PQkpFQ1RTLCBDTElCUyk6IERlZmluZS4KLQkoYXMubmV3KTogVXNlIExERkxBR1MsIFRBUkdfT0JKRUNUUywgQ0xJQlMgYW5kIEVYVFJBTElCUyBpbiBsaW5rCi0JY29tbWFuZC4KLQkoY29uZmlnLmgsIGNvbmZpZy1zdGFtcCk6IEJ1aWxkLgotCi0JKiBtcHctbWFrZS5pbiAoQywgQ0ZMQUdTKTogUmVtb3ZlZCBkZWZpbml0aW9ucy4KLQkoQUxMX0NGTEFHUyk6IERlZmluZS4KLQlTZXQgZGVmYXVsdCBydWxlIHRvIHVzZSB7Q0N9IGluc3RlYWQgb2Yge0N9LgotCi0JKiBtcHctbWFrZS5pbiAoaW5zdGFsbCk6IE1vdmVkIGhlcmUgZnJvbSBtcHctYnVpbGQuaW4uCi0JKiBtcHctYnVpbGQuaW46IFJlbW92ZWQsIGZ1bmN0aW9uYWxpdHkgaW4gbXB3LW1ha2UuaW4KLQotCSogbXB3LW1ha2UuaW4gKENGTEFHUyk6IEFkZCBtb3JlIGluY2x1ZGUgcGF0aHMuCi0KLQkqIG1wdy1jb25maWcuaW4gKHZhcmFyZ3MuaCwgc3lzLyouaCk6IERvbid0IGNyZWF0ZSB3aGVuCi0JY29uZmlndXJpbmcuCi0JKiBtcHctbWFrZS5pbiAoQ0ZMQUdTKTogQWRkIC13IGZsYWcuCi0KLQkqIG1wdy1tYWtlLmluOiBSZXBsYWNlIDgtYml0IGNoYXJzIHdpdGggdGhlaXIgbmFtZXMuCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBjb25maWd1cmUuaW4uCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIE1ha2VmaWxlLmluLgotCi1UdWUgQXByIDExIDAxOjQyOjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdCBsZWFzdCBhdXRvY29uZiAyLjMsIGJlY2F1c2UgZWFybGllcgotCXZlcnNpb25zIGxvc2Ugb24gc29tZSBBSVggdmVyc2lvbnMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtNjhrLSotZWxmLgotCSogY29uZmlnL3RjLW02OGsuYyAoY29tbWVudF9jaGFycykgW09CSl9FTEZdOiBJbmNsdWRlICcjJy4KLQkobWRfcHNldWRvX3RhYmxlKSBbT0JKX0VMRl06IElnbm9yZSAic3diZWciLgotCShtZF9iZWdpbik6IFNldCBhbHRfbm90ZW5kX3RhYmxlWycmJ10sIHNvIHN2cjQtc3R5bGUgaW1tZWRpYXRlCi0Jb3BlcmFuZHMgYXJlIGFjY2VwdGVkLgotCShtZF9hcHBseV9maXgpOiBBcmd1bWVudCBWQUxQIHNob3VsZCBwb2ludCB0byB2YWx1ZVQuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEFyZ3VtZW50IFNFQyBzaG91bGQgYmUgdHlwZSBzZWdULgotCShtZF9zaG9ydG9wdHMpIFtPQkpfRUxGXTogQWNjZXB0ICdRJyB3aXRoIGFuIGFyZ3VtZW50LgotCShtZF9wYXJzZV9vcHRpb24pOiBJZ25vcmUgaXQuCi0JKG1kX2NvbnZlcnRfZnJhZ18xKTogQWRkIGluIGZyYWcgYWRkcmVzcyBmb3IgdGhlIHN5bWJvbCBpbiB0aGUKLQlkaXNwbGFjZW1lbnQgY2FsY3VsYXRpb24uCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKSBbT0JKX0VMRl06IFVzZSAiZWxmMzItbTY4ayIuCi0JKFRBUkdFVF9BUkNIKTogRGVmaW5lLgotCShSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpIFtPQkpfRUxGXTogRGVmYXVsdCB0byAwLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FLCBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpOiBIYW5kbGUKLQl0aGVzZSB0aGUgc2FtZSB3YXkgZm9yIE9CSl9FTEYgYXMgZm9yIE02OEtDT0ZGLgotCi0JKiBnZGJpbml0LmluOiBBZGQgYnJlYWtwb2ludCBpbiBhc19hYm9ydC4KLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IElmIG9mZnNldCBpcyBsZXNzIHRoYW4gemVybywKLQljb21wbGFpbiBhYm91dCBpdCBzcGVjaWZpY2FsbHksIGluc3RlYWQgb2YgcmVwb3J0aW5nIGFuIGFzc2VydGlvbgotCWZhaWx1cmUuCi0JKHJlbGF4X3NlZ21lbnQpOiBDb21wbGFpbiBhYm91dCAub3JnIGJhY2t3YXJkcywgdGhlbiBpZ25vcmUgaXQuCi0JRG8gZ2VuZXJpYyByc19tYWNoaW5lX2RlcGVuZGVudCByZWxheGF0aW9uIG9ubHkgaWYKLQlUQ19HRU5FUklDX1JFTEFYX1RBQkxFIGlzIGRlZmluZWQsIGFuZCB1c2UgaXRzIHZhbHVlIGZvciB0aGUgYmFzZQotCW9mIHRoZSB0YWJsZS4KLQkqIHRjLmggKG1kX3JlbGF4X3RhYmxlKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCSogYXMuaCAoc3RydWN0IHJlbGF4X3R5cGUpOiBBZGQgZm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgdHlwZS4KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IERlbGV0ZWQgbWRfcmVsYXhfdGFibGUuCi0JKiBjb25maWcvdGMte2FscGhhLGFybSxoODMwMCxocHBhLGk4NjAsbTg4ayxtaXBzLHBwYyxzcGFyYyx6OGt9LmM6Ci0JRGl0dG8uCi0JKiBjb25maWcvdGMte2g4NTAwLGkzODYsaTk2MCxuczMyayxzaCx0YWhvZSx2YXgsdzY1fS5oOiBEZWNsYXJlCi0JbWRfcmVsYXhfdGFibGUgaGVyZSwgYW5kIGRlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIHRvIGV4cGFuZAotCXRvIG1kX3JlbGF4X3RhYmxlLgotCSogY29uZmlnL3RjLWg4NTAwLmMgKG1kX3JlbGF4X3RhYmxlKTogTm8gbG9uZ2VyIGNvbnN0LgotCSogY29uZmlnL3RjLXc2NS5jIChtZF9yZWxheF90YWJsZSk6IERpdHRvLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3Nob3J0X2p1bXBfc2l6ZSwgbWRfbG9uZ19qdW1wX3NpemUpOgotCURlbGV0ZWQuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IERlc2NyaWJlIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgYW5kCi0JV09SS0lOR19ET1RfV09SRC4gIE1lbnRpb24gbWRfKl9qdW1wX3NpemUgKGJ1dCBkZXNjcmlwdGlvbiBuZWVkcwotCXRvIGJlIGZsZXNoZWQgb3V0IGxhdGVyKS4gIE5vdGUgbTY4ayBQQ0lOREVYIG1vZGUgaGFzIGJlZW4gY2hlY2tlZAotCWluLgotCi1Nb24gQXByIDEwIDE1OjU3OjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG5vcGljX25lZWRfcmVsYXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBzcGxpdAotCW91dCBmcm9tIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IENhbGwgaXQuCi0JKGxvYWRfYWRkcmVzcywgbWFjcm8pOiBJbiBOT19QSUMgYnJhbmNoZXMsIGlmIG5vcGljX25lZWRfcmVsYXgKLQlyZXR1cm5zIG5vbnplcm8sIGRvbid0IGF0dGVtcHQgR1Agb3B0aW1pemF0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChQQ0lOREVYKTogTmV3IG1hY3JvLgotCShtZF9yZWxheF90YWJsZSk6IE5vIGxvbmdlciBjb25zdC4gIEFkZCBQQ0lOREVYIGVudHJpZXMuCi0JKG02OGtfaXApOiBGb3IgQUlORFggd2l0aCBzaW1wbGUgc3ltYm9sIG9wZXJhbmQsIGdlbmVyYXRlIGEKLQlQQ0lOREVYIGZyYWcgaWYgUEMgaXMgdXNlZCwgb3IgZG8gbm9ybWFsIG5vbi1BSU5EWCBwcm9jZXNzaW5nIGZvcgotCWFkZHJlc3MgcmVnaXN0ZXIuCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogSWYgY3B1IGlzIDY4MDAwIG9yIDY4MDEwLCBmaXgKLQltZF9yZWxheF90YWJsZSB0byBwcmV2ZW50IHJlbGF4YXRpb24gb2YgUENJTkRFWC9CWVRFIG1vZGUgdG8KLQlTSE9SVCwgc2luY2UgdGhleSBkb24ndCBzdXBwb3J0IHRoYXQgbW9kZS4KLQkobWRfY29udmVydF9mcmFnXzEsIGNhc2UgUENMRUEvTE9ORyk6IEFkZCA0IHRvIG9mZnNldCwgbm90IDIuICBBZGQKLQlzdXBwb3J0IGZvciBuZXcgUENJTkRFWCBtb2Rlcy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBQcm9jZXNzIFBDSU5ERVgvU1pfVU5ERUYgbW9kZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnXzEsIGNhc2UgUENMRUEvU0hPUlQpOiBBZGQgMiB0bwotCW9mZnNldC4KLQkobTY4a19pcCwgY2FzZSBtb3N0IHB1bmN0dWF0aW9uL0FPRkYpOiBJZiB1c2luZyBQQywgY2FsbCBhZGRfZnJhZwotCXVzaW5nIFBDTEVBLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBEb24ndCBleHBsaWNpdGx5IGluY2x1ZGUgY29uZmlnLmguICBEZWxldGVkIGEKLQlidW5jaCBvZiAiI2lmIDAiIGNvZGUgYW5kIHVzZWxlc3MgY29tbWVudHMuCi0JKHN0cnVjdCBtNjhrX2NwdSk6IE5ldyB0eXBlLgotCShhcmNocywgbl9hcmNocyk6IE5ldyB2YXJpYWJsZXMsIHdpdGggc2luZ2xlIGxpc3Qgb2YgbmFtZS9lbnVtCi0JbWFwcGluZyBhbmQgYWxpYXNlcy4KLQkobTY4a19pcCk6IERlbGV0ZSB0aGUgdGFibGUgaGVyZS4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgdGhlIG5ldyB0YWJsZSBoZXJlIGluc3RlYWQgb2YKLQlvcGVuLWNvZGluZyBpdC4KLQkobWRfcGFyc2Vfb3B0aW9uLCBjYXNlICdtJyk6IERpdHRvLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRml4IHJ1bGUgZm9yIHJ1bm5pbmcgY29uZmlnLnN0YXR1cy4KLQkoaW50ZXJuYWxzLmR2aSwgaW50ZXJuYWxzLnBzLCBpbnRlcm5hbHMucHM0KTogTmV3IHRhcmdldHMsIG5vdAotCWJ1aWx0IGJ5IGRlZmF1bHQuCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogQWRkIGxvdWQgZGlzY2xhaW1lci4gIFJlZmlsbCB0byA3OSBjb2x1bW5zLAotCXNwZWNpZnkgZmlsbC1jb2x1bW4gaW4gbG9jYWwtdmFyaWFibGVzIHNlY3Rpb24uICBDaGFuZ2UKLQlzdWJoZWFkaW5ncyB0byBzdWJzZWN0aW9ucyBzbyB0aGV5IGNhbiBiZSBjcm9zcy1yZWZlcmVuY2VkLgotCURlc2NyaWJlIGJyb2tlbiB3b3JkcywgZnJhZ3MsIGZyYWcgY2hhaW5zLCBnZW5lcmljIHJlbGF4YXRpb24sCi0JcmVsYXggdGFibGUsIG02OGsgcmVsYXhhdGlvbiwgbTY4ayBhZGRyZXNzaW5nIG1vZGVzLCB0ZXN0IHN1aXRlCi0JY29kZS4gIEFkZCBhIGZldyB3b3JkcyBhYm91dCB2YXJpb3VzIGZpbGUgZm9ybWF0cy4KLQotCSogZG9jL2FzLnRleGluZm8gKG02OGspOiBSZWNvbW1lbmQgdXNpbmcgYCUnIHdpdGggcmVnaXN0ZXJzIGFzIHRoZQotCW5vcm1hbCBjYXNlLCBpbnN0ZWFkIG9mIHRoZSBleGNlcHRpb25hbCBjYXNlLgotCi1UaHUgTWFyIDMwIDE0OjM4OjQ3IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgbGludXggdG8gZGVmYXVsdCB0byBlbGYuICBVc2luZwotCWlbMzQ1XTg2LSotbGludXhhb3V0IHdpbGwgZGVmYXVsdHMgdG8gYS5vdXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBNYXIgMjkgMTc6MTY6MzAgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQGFkZGVyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogQ2FzdCBuZWdhdGl2ZSBvZmZzZXRzIHRvIG9mZnNldFQKLQkoZm9yIGhvc3Rpbmcgb24gNjQgYml0IG1hY2hpbmVzKS4KLQotVHVlIE1hciAyMSAxNjo1MzoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1taXBzNCBhbmQgLW00NjUwLgotCi1GcmkgTWFyIDE3IDE2OjQ3OjEzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBBZGQgUFJPR1JFU1MgbWFjcm9zLgotCi1GcmkgTWFyIDE3IDEyOjQwOjM0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogTWFrZSBzdXJlIHRvIGFsd2F5cyByZXNldCB0aGUgZnJhZwotCWFuZCBzZWN0aW9uIGZvciBjb21tb24gc3ltYm9scy4KLQotVGh1IE1hciAxNiAxNzoyNjoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IG5vbiBQQyByZWxhdGl2ZQotCXBvaW50ZXJzIGluIHRoZSAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9uIGFsc28gd2hlbiB1c2luZyB0aGUKLQktbXJlbG9jYXRhYmxlIG9wdGlvbi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU3VwcG9ydCAtbTQwMyBhcyBhIFBvd2VyUEMgY29tcHV0ZXIuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEaXR0by4KLQotV2VkIE1hciAxNSAxNDo0NTo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKTogVGhlIGN1cl9zY29wZSBmaWVsZCBvZiBhIGZpbF9wdHIKLQltYXkgYmUgTlVMTCB3aGVuIGdpdmVuIHN0cmFuZ2UgaW5wdXQuICBEb24ndCBjb3JlIGR1bXAuCi0KLVR1ZSBNYXIgMTQgMjE6MzY6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogRG9uJ3QgdXNlIGFkZGl1IGZvciBkbGkgb2YgYW4KLQl1bnNpZ25lZCBzZWVtaW5nbHkgbmVnYXRpdmUgbnVtYmVyLiAgRG9uJ3QgYm90aGVyIHNoaWZ0aW5nIGEgemVybwotCXZhbHVlLgotCShtaXBzX2lwKTogRm9yIGNhc2UgJ2onLCBpZiB0aGVyZSBhcmUgbW9yZSBhbHRlcm5hdGl2ZXMsIGFuZCB0aGUKLQlJU0EgbGV2ZWwgaXMgYXQgbGVhc3QgMywgZG9uJ3QgYWNjZXB0IGFuIHVuc2lnbmVkIHNlZW1pbmdseQotCW5lZ2F0aXZlIG51bWJlci4KLQotVHVlIE1hciAxNCAxOToxNjo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfYXBwX2xpbmUpOiBGaXggbGFzdCBwYXRjaCB0byBkZWFsIHdpdGggYSBsaW5lIG51bWJlcgotCW9mIDEuCi0KLVR1ZSBNYXIgMTQgMTc6MDA6NTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogVXNlIGFzX3dhcm5fd2hlcmUsIG5vdAotCWFzX2JhZF93aGVyZSB0byBnaXZlIGEgd2FybmluZyBpbnN0ZWFkIG9mIGFuIGVycm9yLgotCi1Nb24gTWFyIDEzIDE3OjAzOjQ2IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogIGlzc3VlIGEgd2FybmluZyBpZiBhIGNvbnN0YW50Ci0JaXMgdXNlZCBhcyBhbiBvcGVyYW5kIHdoZXJlIGFuIGltbWVkaWF0ZSB2YWx1ZSBpcyBub3QgYWxsb3dlZC4KLQotRnJpIE1hciAxMCAxOToyMToxOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogUmVkbyBteSAxMCBKYW4gY2hhbmdlLCBidXQgZ2V0IGl0IHJpZ2h0IHRoaXMKLQl0aW1lLiA6LSkKLQkoZml4dXBfc2VnbWVudCk6IElmIGxpbmtyZWxheCBpcyBzZXQsIGp1c3QgcmV0dXJuLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IHRyZWF0IGg4MzAwIGFuZCB6OGsgc3BlY2lhbGx5IHdpdGgKLQlyZWdhcmQgdG8gZml4dXBzLgotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2JlZ2luKTogU2V0IGxpbmtyZWxheC4KLQkqIGNvbmZpZy90Yy16OGsuYyAobWRfYmVnaW4pOiBEaXR0by4KLQotVGh1IE1hciAgOSAxODowMTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2hlYWRlcl9hcHBlbmQpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQuCi0KLVRodSBNYXIgIDkgMTM6NTE6MzAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCURlbGV0ZSB0aGlzIHBhdGNoLCBpdCBicmVha3MgdGhlIGg4MzAwIGFzc2VtYmxlci4KLQlUdWUgSmFuIDEwIDEzOjM0OjE0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCB0cmVhdCBoODMwMCBhbmQgejhrCi0Jc3BlY2lhbGx5IHdpdGggcmVnYXJkIHRvIGZpeHVwcy4KLQotVGh1IE1hciAgOSAxMjoyODoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobXJlbG9jYXRhYmxlKTogQ2hhbmdlIHR5cGUgdG8gYm9vbGVhbi4KLQkobWRfYmVnaW4pOiBTZXQgdGhlIEVGX1BQQ19SRUxPQ0FUQUJMRSBpZiAtbXJlbG9jYXRhYmxlLgotCi1XZWQgTWFyICA4IDE1OjM5OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBDaGVjayBmb3IgYSBjcHUgc3RyaW5nIG9mIHI4MDAwIG9yCi0JcjEwMDAwLiAgSWYgbWlwc19pc2EgaXMgNCwgc2V0IHRoZSBtYWNoaW5lIG51bWJlciB0byA4MDAwLgotCShhcHBlbmRfaW5zbik6IElmIG1pcHNfaXNhIGlzIGF0IGxlYXN0IDQsIGRvbid0IGdlbmVyYXRlIG5vcHMgZm9yCi0JY29wcm9jZXNzb3IgZGVsYXlzLiAgQ2hlY2sgSU5TTl9SRUFEX0ZQUl9SIHdoZW4gc2V0dGluZwotCW1pcHNfY3BybWFza1sxXS4KLQkobWlwc19lbWl0X2RlbGF5cyk6IElmIG1pcHNfaXNhIGlzIGF0IGxlYXN0IDQsIGRvbid0IGdlbmVyYXRlIG5vcHMKLQlmb3IgY29wcm9jZXNzb3IgZGVsYXlzLgotCShtaXBzX2lwKTogQ2hlY2sgZm9yIElOU05fSVNBNCBpbnN0cnVjdGlvbnMuICBIYW5kbGUgbmV3IGFyZ3VtZW50Ci0JdHlwZXMgJ2gnLCAnUicsICdOJywgYW5kICdNJy4KLQkobWRfbG9uZ29wdHMpOiBBY2NlcHQgIm1pcHM0Ii4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1taXBzNCwgYW5kIC1tY3B1PTEwMDAwIGFuZCAtbWNwdT04MDAwLgotCShzX21pcHNzZXQpOiBQZXJtaXQgLnNldCBtaXBzNC4KLQotV2VkIE1hciAgOCAwOTozNjowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBbGxvdyAuc3RhYiBzZWN0aW9ucyB0bwotCWhhdmUgbm9uIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdpdGggLW1yZWxvY2F0YWJsZS4KLQotV2VkIE1hciAgOCAwMjo1Nzo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChvcGNvZGVfcHRyKTogUmV0dXJuIHBvaW50ZXIgdG8gY29uc3QuCi0JKG1kX2JlZ2luKTogTWFrZSBoYXNoIHRhYmxlIGVycm9ycyBmYXRhbC4gIFByb2Nlc3Mgb3Bjb2RlIGFsaWFzZXMKLQlhZnRlciBtYWluIG9wY29kZSB0YWJsZS4KLQkobWRfYXBwbHlfZml4XzIsIGNhc2UgNCk6IFJlY29kZSBzZXR0aW5nIG9mIGxvd2VyX2xpbWl0IHRvIGF2b2lkCi0JZ2NjIHdhcm5pbmcuCi0KLVR1ZSBNYXIgIDcgMTY6MDc6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24gZm9yIFNQQVJDIFY5LCBmcm9tIERvdWcgRXZhbnMKLQk8ZGplQGN5Z251cy5jb20+LgotCi1Nb24gTWFyICA2IDA5OjU4OjM0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBDaGFuZ2UgYWxsIG9jY3VyZW5jZXMgb2YgcGEtODkgd2l0aCBwYS0xMSB0bwotCWJlIGNvbnNpc3RlbnQgd2l0aCBjdXJyZW50IG5hbWluZyBjb252ZW50aW9ucy4KLQkobWRfYmVnaW4pOiBTZXQgYSBkZWZhdWx0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlLgotCShwYV9pcCk6IElmIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHNwZWNpZmllcyBhIG5ld2VyIG1hY2hpbmUgdHlwZQotCXRoYW4gdGhlIGN1cnJlbnQgbWFjaGluZSB0eXBlLCB0aGVuIHVwZGF0ZSB0aGUgY3VycmVudCBtYWNoaW5lCi0JdHlwZS4KLQkobmVlZF9wYTExX29wY29kZSk6IExpa2V3aXNlLgotCi1TdW4gTWFyICA1IDE5OjM4OjA5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAneicpOiBEb24ndCBsb3NlIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiBiaXRzIGZvciBhYnNvbHV0ZSBjYWxscy4KLQotRnJpIE1hciAgMyAxNzo0MTo1MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuKiAobWRfb3BlcmFuZCk6IENoYW5nZSBlbXB0eSBmdW5jdGlvbiB0byBlbXB0eQotCW1hY3JvLgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoYnVpbGRfYnl0ZXMpOiBNYWtlIEg4LzMwMC1IIHdhcm5pbmcgbWVzc2FnZQotCWNsZWFyZXIuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogSWYgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGZhaWxzLAotCXByaW50IGEgbWVzc2FnZSBhbmQgZXhpdCwgaW5zdGVhZCBvZiBhYm9ydGluZy4KLQotRnJpIE1hciAgMyAxNjoyNjoxOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHRjLmggKG1kX2FwcGx5X2ZpeDMpOiBJZiBNRF9BUFBMWV9GSVgzIGlzIGRlZmluZWQsIGRlY2xhcmUKLQltZF9hcHBseV9maXgzLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSWYgTURfQVBQTFlfRklYMyBpcyBkZWZpbmVkLCBjYWxsCi0JbWRfYXBwbHlfZml4MyB3aXRoIHRoZSBub3JtYWwgMiBhcmd1bWVudHMgYW5kIHRoZSBjdXJyZW50IHNlZ21lbnQKLQlwb2ludGVyIGluc3RlYWQgb2YgbWRfYXBwbHlfZml4LgotCi0JKiBjb25maWcvdGMtcHBjLmggKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBXYXJuIGlmIC1tcmVsb2NhdGFibGUKLQlhbmQgYSBub24gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB0aGF0IGlzbid0IGluIHRoZSAuZ290MiBzZWdtZW50Ci0Jd2FzIHBlcmZvcm1lZC4KLQkobWRfYXBwbHlfZml4Myk6IFJlbmFtZSBmcm9tIG1kX2FwcGx5X2ZpeCBhbmQgdGFrZSBzZWdtZW50IHBvaW50ZXIKLQlhcyB0aGlyZCBhcmd1bWVudC4gIElmIEVMRiBvYmplY3QgZm9ybWF0LCBjYWxsIHBwY19lbGZfdmFsaWRhdGVfZml4Ci0JZm9yIG5vcm1hbCByZWxvY2F0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWYgRUxGIG9iamVjdCBmb3JtYXQsIHJlY29nbml6ZSB0aGUKLQktbXJlbG9jYXRhYmxlIHN3aXRjaC4KLQotVGh1IE1hciAgMiAxNjozNDo0NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEFPVVRfTUFDSFRZUEUpOiBEZWZpbmUgYXMgMTAwLCBub3QgMC4KLQotVHVlIEZlYiAyOCAxODoyOToyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMsIGNvbmZpZy90Yy1hcm0uaCAobWRfb3BlcmFuZCk6IFJlcGxhY2VkIGVtcHR5Ci0JZnVuY3Rpb24gaW4gLmMgZmlsZSB3aXRoIGVtcHR5IG1hY3JvIGluIC5oIGZpbGUuCi0JKiBjb25maWcvdGMtaDg1MDAuKiwgY29uZmlnL3RjLWhwcGEuKiwgY29uZmlnL3RjLWkzODYuKiwKLQljb25maWcvdGMtaTg2MC4qLCBjb25maWcvdGMtaTk2MC4qLCBjb25maWcvdGMtbnMzMmsuKiwKLQljb25maWcvdGMtcHBjLiosIGNvbmZpZy90Yy1zaC4qLCBjb25maWcvdGMtc3BhcmMuKiwKLQljb25maWcvdGMtdGFob2UuKiwgY29uZmlnL3RjLXZheC4qLCBjb25maWcvdGMtdzY1LiosCi0JY29uZmlnL3RjLXo4ay4qOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1tNjhrLio6IERpdHRvLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtb3RlX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZG90cyBmcm9tIG9wY29kZQotCW5hbWVzLgotCi0JKiByZWFkLmMgKHNfYXBwX2xpbmUpOiBJZ25vcmUgbm9uLXBvc2l0aXZlIGxpbmUgbnVtYmVycy4KLQotVHVlIEZlYiAyOCAxNTozNDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgUExUIG9yCi0JR09UIHJlbG9jcyBlaXRoZXIuCi0KLU1vbiBGZWIgMjcgMTM6MDM6NDEgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgYTI5ay0qLXZ4d29ya3MgY29uZmlndXJhdGlvbi4KLQotRnJpIEZlYiAyNCAxNDo0MToxNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBUYWtlIGRibCBhcmd1bWVudCB0byBkZXRlcm1pbmUKLQloYW5kbGluZyBvZiBzaWduZWQgMzIgYml0IHZhbHVlcyBpbiA2NCBiaXQgbW9kZXMuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkobWFjcm8pOiBIYW5kbGUgTV9ETEkgYW5kIE1fRExBX0FCLgotCi1XZWQgRmViIDIyIDIzOjEwOjU2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEb24ndCBzdWJ0cmFjdCB0aGUgdmFsdWUgb2YgdGhlCi0JYWRkIHN5bWJvbCBpZiBpdCdzIGEgY29tbW9uIHN5bWJvbCAodGhlIHZhbHVlIG9mIGEgY29tbW9uIHN5bWJvbAotCWlzIGl0cyBzaXplLCBub3QgYSB2YWx1ZSBpbiB0aGUgdHJhZGl0aW9uYWwgc2Vuc2UpLgotCi1XZWQgRmViIDIyIDIxOjEyOjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBJZiBsaXN0aW5nX3ByZXZfbGluZSBpcyBjYWxsZWQsCi0JY2FsbCBmcmFnX2dyb3cgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIHN0aWxsIHJvb20gZm9yIGEgdmFyaWFudC4KLQotRnJpIEZlYiAxNyAxNDo1MDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAyYnl0ZSwgNGJ5dGUgYW5kIDhieXRlCi0JaWYgT0JKX0VMRi4gIEZyb20gZ2FyeUBJbnRyZXBpZC5DT00gKEdhcnkgRnVuY2spLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBXYXJuIGlmIGEgc3ltYm9sIGlzIGJvdGgKLQl3ZWFrIGFuZCBjb21tb24uCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBMaWtld2lzZS4KLQotRnJpIEZlYiAxNyAxMjo0Mzo0NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogRG9uJ3QgcmVkZWZpbmUgYnl0ZSB1bmRlcgotCUVMRi4KLQkocHBjX2VsZl9jb25zKTogRG9uJ3Qgc3VwcG9ydCBAcGNyZWwgYW55IG1vcmUsIHNpbmNlIERJRkZfRVhQUl9PSwotCWFsbG93cyB0aGUgbm9ybWFsIGV4cHJlc3Npb25zIHRvIGdlbmVyYXRlIGl0LgotCShtZF9hcHBseV9maXgpOiBDb252ZXJ0IEJGRF9SRUxPQ18zMiB3aXRoIHBjcmVsIGJpdCBzZXQgaW50bwotCUJGRF9SRUxPQ18zMl9QQ1JFTC4gIEFib3J0IGlmIGVpdGhlciBCRkRfUkVMT0NfMTYgb3IgQkZEX1JFTE9DXzgKLQluZWVkIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvdGMtcHBjLmggKERJRkZfRVhQUl9PSyk6IERlZmluZSB0byBhbGxvdyBQQyByZWxhdGl2ZQotCWV4cHJlc3Npb25zIHRvIGJlIGhhbmRsZWQuCi0KLVRodSBGZWIgMTYgMTQ6MzA6MTMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBNb3ZlIG1kX29wZXJhbmQgaGFuZGxpbmcgdG8gZGVmYXVsdCBjYXNlCi0JKHNvIGl0IHdvcmtzKS4KLQotV2VkIEZlYiAxNSAxNjowODo0NyAxOTk1ICBKYXNvbiBNb2xlbmRhICA8Y3Jhc2hAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4NTAwLmMgKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IEFkZCBpZ25vcmVkCi0JcGFyYW1ldGVyLCB0byBtYXRjaCBwcm90b3R5cGUuCi0KLVdlZCBGZWIgMTUgMTU6MDc6MDAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IElmIEVMRiwgZ28gdG8gcHBjX2VsZl9jb25zCi0JaW5zdGVhZCBvZiBjb25zLgotCShtZF9zaG93X3VzYWdlKTogU2hvdyBhbGwgb2YgdGhlIFBvd2VyUGMgb3B0aW9ucy4KLQkocHBjX2VsZl9zdWZmaXgpOiBOZXcgZnVuY3Rpb24gdG8gcmVjb2duaXplIEVMRiBzdWZmaXhlcyB0aGF0Ci0Jc3BlY2lmeSBhIHJlbG9jYXRpb24sIHN1Y2ggYXMgQEdPVC4KLQkocHBjX2VsZl9jb25zKTogUmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZCBjb25zIGZ1bmN0aW9uIHRoYXQKLQlrbm93cyBhYm91dCB0aGUgRUxGIHN1ZmZpeGVzLgotCShwcGNfZml4dXApOiBBZGQgcmVsb2MgZmllbGQgdG8gaG9sZCBub24tc3RhbmRhcmQgcmVsb2NhdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgRUxGIHN1ZmZpeGVzIGxpa2UgQEdPVC4KLQkobWRfY3JlYXRlX3Nob3J0X2p1bXApOiBEdW1teSBpbiBjYXNlIFdPUktJTkdfRE9UX1dPUkQgaXMgbm90Ci0JZGVmaW5lZC4KLQkobWRfY3JlYXRlX2xvbmdfanVtcCk6IERpdHRvLgotCShtZF9zaG9ydF9qdW1wX3NpemUpOiBEaXR0by4KLQkobWRfbG9uZ19qdW1wX3NpemUpOiBEaXR0by4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ18zMl9QQ1JFTCwgQkZEX1JFTE9DX0xPMTYsCi0JQkZEX1JFTE9DX0hJMTYsIEJGRF9SRUxPQ19ISTE2X1MsIEJGRF9SRUxPQ19QUENfVE9DMTYsIGFuZAotCUJGRF9SRUxPQ18xNiByZWxvY2F0aW9ucy4gIElmIHJlbG9jYXRpb24gY2FuIG5vdCBiZSBmb3VuZCwgcHJpbnQKLQl0aGUgZGVjaW1hbCB2YWx1ZSBvZiB0aGUgcmVsb2NhdGlvbi4KLQotV2VkIEZlYiAxNSAxMTo0NjowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IEFjY2VwdCBCRkRfUkVMT0NfMTYsIGZvcgotCURXQVJGLiAgRnJvbSBnYXJ5QEludHJlcGlkLkNPTSAoR2FyeSBGdW5jaykuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSGFuZGxlIE1fVXtMLFN9RFtfQV0gKHVuYWxpZ25lZCBkb3VibGUKLQlsb2FkcyBhbmQgc3RvcmVzKS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvIGFkanVzdCBnbG9iYWwKLQlzeW1ib2xzIGlmIE9CSl9BT1VULgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IERvbid0IHVzZSB0aGUgdGFyZ2V0IHJlZ2lzdGVyIGFzIGEKLQliYXNlIHJlZ2lzdGVyIHdoZW4gYnVpbGRpbmcgdGhlIGFkZHJlc3MgZm9yIE1fTHtXLER9e0wsUn1fQUIuCi0KLU1vbiBGZWIgMTMgMTQ6NDQ6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChLVDAsIEtUMSk6IERlZmluZS4KLQkobWlwc19pcCk6IFJlY29nbml6ZSAka3QwIGFuZCAka3QxIGFzIHJlZ2lzdGVyIG5hbWVzLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJZiBPQkpfRUxGLCBzdWJ0cmFjdCBvdXQgdGhlCi0JdmFsdWUgb2YgYSBkZWZpbmVkIHN5bWJvbDsgdGhlIHZhbHVlIHdhcyBhZGRlZCBpbiBieQotCWZpeHVwX3NlZ21lbnQuICBUaGlzIHdhcyBwcmV2aW91c2x5IGNvcnJlY3RlZCwgaWYgdGhlIHJlbG9jIHdhcwotCWNoYW5nZWQgdG8gYmUgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLCBpbiB0Y19nZW5fcmVsb2MuCi0KLUZyaSBGZWIgMTAgMTQ6MDQ6MDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogVXNlIFNfSVNfRVhURVJOCi0JcmF0aGVyIHRoYW4gIVNfSVNfTE9DQUwuCi0KLVRodSBGZWIgIDkgMTg6MTY6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEFkanVzdCBjb25kaXRpb25zIGZvciBjaGFuZ2luZwotCUJGRF9SRUxPQ18zMiB0byBCRkRfUkVMT0NfMzg2X0dPVFBDIHRvIGhhbmRsZSBhIHN3aXRjaCBpbiBmcmFncy4KLQlQYXRjaCBvcmlnaW5hbGx5IGZyb20gUm9iIFJ5YW4gPHJvYnJAY211LmVkdT4uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCSh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRGVjbGFyZSByZXR1cm4gdmFsdWUuCi0JKGkzODZfb3BlcmFuZCk6IERvbid0IHVzZSBhbiBhc3NpZ25tZW50IGRpcmVjdGx5IGFzIGEgY29uZGl0aW9uLgotCi1UaHUgRmViICA5IDEwOjM3OjEzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBJbiBzb21lIGNhc2VzIHN1YnRyYWN0IHRoZQotCXZhbHVlIG9mIHRoZSBhZGQgc3ltYm9sIGZyb20gdmFscC4gIE9mZnNldHMgYnJhaW5kYW1hZ2UgaW4gdGhlCi0JIm1hY2hpbmUgaW5kZXBlbmRlbnQiIGZpeHVwX3NlZ21lbnQuCi0KLVdlZCBGZWIgIDggMTg6NTE6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbWVzc2FnZXMuYyAoYXNfYWJvcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBhcy5oIChhc19hYm9ydCk6IERlY2xhcmUgaXQuCi0JKGFib3J0KTogTmV3IG1hY3JvLgotCi0JVGh1IEphbiAxOSAxODoxMDowNSAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL3Ztcy1jb25mLmggKEhBVkVfVU5JU1REX0gpOiAgZGVmaW5lIGl0IHVuY29uZGl0aW9uYWxseS4KLQkqIGNvbmZpZy1nYXMuY29tOiAgdGVzdCBmb3IgYXZhaWxhYmlsaXR5IG9mIDx1bmlzdGQuaD47IGNyZWF0ZSBhCi0JcnVkaW1lbnRhcnkgb25lIGlmIG5lY2Vzc2FyeS4KLQotVHVlIEZlYiAgNyAxMzozNDo0NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHBvd2VycGMtKi1lYWJpIHN1cHBvcnQsIHdoaWNoIGlzIHRoZSBzYW1lIGFzCi0JcG93ZXJwYy0qLWVsZi4KLQkoY29uZmlndXJlKTogUmVidWlsZCB3aXRoIGF1dG9jb25mLgotCi1Nb24gRmViICA2IDAzOjM3OjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gQnJ5YW4gRm9yZCA8YmFmb3JkQHNjaGlyZi5jcy51dGFoLmVkdT4gZm9yIGkzODYKLQkxNi1iaXQgYW5kIG1zZG9zIHN1cHBvcnQ6Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChmbGFnXzE2Yml0X2NvZGUpOiBOZXcgdmFyaWFibGUuCi0JKHNldF8xNmJpdF9jb2RlX2ZsYWcpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZGVkIGVudHJpZXMgImNvZGUxNiIgYW5kICJjb2RlMzIiLgotCShtZF9hc3NlbWJsZSk6IEVuc3VyZSB0aGF0IGNvcnJlY3QgZGF0YS1zaXplIHByZWZpeGVzIGdldCBlbWl0dGVkLAotCWJhc2VkIG9uIHRoZSBjdXJyZW50IG1vZGUuICBFbnN1cmUgdGhhdCAzMi1iaXQgYWRkcmVzc2luZyB3aWxsCi0JYWx3YXlzIGJlIGRvbmUuICBNb3ZlIHNlZ21lbnQtcHJlZml4IGhhbmRsaW5nIGNvZGUuICAoV2h5PykgIFVzZQotCTE2LWJpdCBqdW1wcyBmb3IgMTYtYml0IGNvZGUsIDMyLWJpdCBqdW1wcyBmb3IgMzItYml0IGNvZGUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChNQVhfUFJFRklYRVMpOiBCdW1wIHRvIDUuCi0JKERhdGExNiwgRGF0YTMyKTogRGVmaW5lLgotCSogZG9jL2FzLnRleGluZm8gKGkzODYtMTZiaXQpOiBOZXcgbm9kZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW1zZG9zKik6IE5ldyB0YXJnZXQsIHVzaW5nIGEub3V0IGZvcm1hdC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVRodSBGZWIgIDIgMTU6MjE6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoY3B1MzJfY29udHJvbF9yZWdzKTogTmV3IG1hY3JvLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSBpdCwgZm9yIGNwdTMyIHByb2Nlc3NvcnMuCi0KLQlUdWUgSmFuIDMxIDE3OjIwOjQ1IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jICh2bXNfdGlyX3N0YWNrX3BzZWN0KTogIG5ldyByb3V0aW5lOwotCShWTVNfU2V0X0RhdGEsIFZNU19TZXRfUHNlY3QsIFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSwKLQlWTVNfVEJUX1JvdXRpbmVfQmVnaW4sIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbik6ICB1c2UgaXQ7Ci0JKFZNU19HbG9iYWxfU3ltYm9sX1NwZWMsIFZNU19Qcm9jZWR1cmVfRW50cnlfUHQpOiAgdHJlYXQKLQlQc2VjdF9OdW1iZXIgYXMgYHVuc2lnbmVkJy4KLQotCVRodSBKYW4gMjYgMTc6MDY6MjggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6ICBwZXJmb3JtYW5jZSB0dW5pbmcuCi0JKFZNU19TeW1ib2xfdHlwZV9saXN0KTogIGNvbnZlcnQgZnJvbSBzaW5nbGUgbGlzdCBoZWFkIHRvIHNtYWxsCi0JYXJyYXkgb2YgbGlzdCBoZWFkczsKLQkoU1lNVFlQX0hBU0gpOiAgbmV3IG1hY3JvIGZvciBhY2Nlc3NpbmcgVk1TX1N5bWJvbF90eXBlX2xpc3RbXTsKLQkoZmluZF9zeW1ib2wsIHNldHVwX2Jhc2ljX3R5cGUsIFZNU190eXBlZGVmX3BhcnNlKTogIHVzZSBpdDsKLQkoVk1TX1JTWU1fUGFyc2UpOiAgbW92ZSBTX0dFVF9WQUxVRSgpIGluc2lkZSBzd2l0Y2ggdG8gYXZvaWQKLQljYWxsaW5nIGl0IGZvciB1bmludGVyZXN0aW5nIGNhc2VzLgotCi1XZWQgRmViICAxIDIzOjUyOjQ1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBHbyBhaGVhZCBhbmQgY2FsbAotCWhwcGFfZmllbGRfYWRqdXN0IHRvIGdldCBhIG5ldyB2YWx1ZSBmb3IgUl9EQVRBX09ORV9TWU1CT0wKLQlyZWxvY2F0aW9ucyBpbiBTT00uCi0JKGhwcGFfZml4X2FkanVzdGFibGUpOiBSZWZpbmUgc29tZXdoYXQuCi0KLUZyaSBKYW4gMjcgMjE6Mjk6NTMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKE5PX1NUUklOR19FU0NBUEVTKTogRG9uJ3QgZGVmaW5lIGlmIHdlIGFyZQotCXVzaW5nIEVMRi4KLQotVGh1IEphbiAyNiAxOTowMzo0MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X3NwZWNpZmljKTogQWRkIHBhcmVucyBhcm91bmQgfCBpbnNpZGUgJi4KLQkoc2tpcF9jb2xvbnRoaW5nKTogU2V0IExfOCBpZiAiOjgiIGlzIHNwZWNpZmllZC4KLQotVGh1IEphbiAyNiAxODozODowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYmVnaW4pOiBQZXJtaXQgbWZkZWMgdG8gYmUgZHVwbGljYXRlZCBvbiB0aGUKLQk2MDEuICBDaGVjayB0aGF0IHRoZSBlcnJvciByZXR1cm4gZnJvbSBoYXNoX2luc2VydCBpcyAiZXhpc3RzIi4KLQotVGh1IEphbiAyNiAxMTozNTozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBBZGQgc3VwcG9ydCBmb3IgY29uZmlndXJpbmcgcG93ZXJwYy0qLWVhYmkuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAoR09UX3N5bWJvbCk6IERlZmluZSBpZiBvYmplY3QgZm9ybWF0IGlzIEVMRi4KLQotCSogY29uZmlnL3RjLXBwYy5oIChHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOiBEZWZpbmUgaWYgb2JqZWN0Ci0JZm9ybWF0IGlzIEVMRiBhbmQgbm90IGRlZmluZWQgdG8gYmUgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIuCi0KLVdlZCBKYW4gMjUgMTY6MjM6MTMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiB0Yy1zaC5jIChsaXR0bGUpOiBBZGQgYXJndW1lbnQgSUdOT1JFIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgc3BhY2UgZm9yIGNvbnNpc3RlbnQgZm9ybWF0dGluZy4KLQkoQ09ORDhfUkFOR0UsIENPTkQxMl9SQU5HRSk6IERlbGV0ZSB1bnVzZWQgbWFjcm9zLgotCShDT05EOF9GLCBDT05EOF9NLCBDT05EMTJfRiwgQ09ORDEyX00sIFVOQ09ORDEyX0YsIFVOQ09ORDEyX00pOgotCUNvcnJlY3QgbWluaW11bSBhbmQgbWF4aW11bSBicmFuY2ggb2Zmc2V0cy4gIEFkZCBjb21tZW50cyBleHBsYWluaW5nCi0Jd2h5IHRoZXNlIG51bWJlcnMgYXJlIGNvcnJlY3QuCi0KLVdlZCBKYW4gMjUgMTU6MzI6MDkgMTk5NSAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IG1wd3IyIGFzIGEgc3lub255bSBmb3IKLQltcHdyeDsgbXBwYzMyLCBtNjAzLCBhbmQgbTYwNCBhcyBzeW5vbnltcyBmb3IgbXBwYzsgYW5kIG1wcGM2NCBhbmQKLQltNjIwIGZvciBQb3dlclBDNjQgbW9kZS4KLQkocHBjX3N5bWJvbF9uZXdfaG9vayk6IEFkZCBUMCBhcyBzeW5vbnltIGZvciBUQzAgc3VmZml4LgotCi1UdWUgSmFuIDI0IDE2OjQ0OjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12YXguYyAodmlwKTogSW50cm9kdWNlIG5ldyBwdHItdG8tY29uc3QgbG9jYWwgdmFyaWFibGUKLQlmb3Igc2Nhbm5pbmcgb3BlcmFuZCBzdHJpbmcuCi0KLQlTYXQgSmFuIDIxIDE3OjUwOjM4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvdmF4LWluc3QuaCAoc3RydWN0IHZvcCwgZmllbGRzIGB2b3Bfd2FybicsIGB2b3BfZXJyb3InKToKLQltYWtlIHRoZW0gcG9pbnRlcnMgdG8gY29uc3QgY2hhcjsKLQkoc3RydWN0IHZpdCwgZmllbGQgYHZpdF9lcnJvcicpOiAgZGl0dG8uCi0JKiBjb25maWcvYXRvZi12YXguYyAobWRfYXRvZik6ICByZW5hbWUgbG9jYWwgYGxpdHRsZW51bV9wb2ludGVyJwotCXRvIGBsaXR0bGVudW1QJyB0byBhdm9pZCBzaGFkb3dpbmcgZmlsZSBzY29wZSB2YXJpYWJsZS4KLQkqIGNvbmZpZy90Yy12YXguYyAodmlwX2JlZ2luLCB2aXBfb3BfZGVmYXVsdHMsIHZpcF9vcF8xKTogIG1ha2UKLQlzdHJpbmcgYXJndW1lbnRzIGJlIHBvaW50ZXJzIHRvIGNvbnN0IGNoYXI7Ci0JKHZpcCk6ICBtYWtlIGBhbGxvcGVycicgY29uc3QgY2hhciAqOwotCSh2aXBfb3ApOiBtYWtlIGBlcnInIGFuZCBgd3JuJyBjb25zdCBjaGFyICo7IHJlbmFtZSBgYWNjZXNzJyB0bwotCWBhY2Nlc3NfbW9kZScgdG8gYXZvaWQgc2hhZG93aW5nIGxpYnJhcnkgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLXZtcy5jIChgc3ltYm9sX25hbWUnKTogIG1ha2UgaXQgY29uc3QgY2hhciAqOwotCShnZXRfc3RydWN0X25hbWUpOiAgY2FzdCBvbmUgdXNlIG9mIGBzeW1ib2xfbmFtZScgdG8gY2hhciAqCi0JW2NhbGxlciBndWFyYW50ZWVzIHRoYXQgaXQgd29uJ3QgbW9kaWZ5IHRoZSBwb2ludGVyJ3MgdGFyZ2V0XTsKLQkoUFVUX0NPVU5URURfU1RSSU5HKTogIHVzZSBwb2ludGVyIHRvIGNvbnN0IGNoYXI7Ci0JKFZNU190eXBlZGVmX3BhcnNlKTogIG1ha2UgYHBudDInIGNvbnN0IGNoYXIgKjsKLQkoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogIG1ha2UgYGNwJyBjb25zdCBjaGFyICo7Ci0JKFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcywgYXJyYXkgYEF0dHJpYnV0ZXMnKTogIG1ha2UgY29uc3QsCi0JYW5kIG1ha2UgZmllbGQgYE5hbWUnIHBvaW50ZXIgdG8gY29uc3QgY2hhcjsKLQotCSogYXMuaCAoYHNlZ19uYW1lW10nIGRlY2xhcmF0aW9uKTogIHBvaW50ZXJzIHRvIGNvbnN0IGNoYXI7Ci0JKHN0cnVjdCBfcHNldWRvX3R5cGUsIGZpZWxkIGBwb2NfbmFtZScpOiAgcG9pbnRlciB0byBjb25zdCBjaGFyLgotCSogc3Vic2Vncy5jIChgc2VnX25hbWVbXScgZGVmaW5pdGlvbik6ICBkaXR0bzsKLQkqIGhhc2guYyAoaGFzaF9hc2spOiAgcmVuYW1lIGFyZ3VtZW50IGBhY2Nlc3MnIHRvIGBhY2Nlc3NfdHlwZScKLQl0byBhdm9pZCBzaGFkb3dpbmcgbGlicmFyeSBmdW5jdGlvbi4KLQkqIHdyaXRlLmMgKHZhcmlhYmxlIGB0aGVfb2JqZWN0X2ZpbGUnKTogIG1vdmUgZnJvbSBmaWxlIHNjb3BlCi0JdG8gYmxvY2sgc2NvcGUgd2l0aGluIHdyaXRlX29iamVjdF9maWxlKCk7IGZyZWUgaXQgYWZ0ZXIgdXNlOwotCShmaXh1cF9zZWdtZW50KTogIGNvbmRpdGlvbmFsbHkgZXhjbHVkZSBpdCBmb3IgT0JKX1ZNUy4KLQkoY3Z0X2ZyYWdfdG9fZmlsbCk6ICByZW5hbWUgYXJndW1lbnQgYGhlYWRlcnMnIHRvIGBoZWFkZXJzUCcKLQl0byBhdm9pZCBzaGFkb3dpbmcgZmlsZSBzY29wZSB2YXJpYWJsZS4KLQotTW9uIEphbiAyMyAyMTo0MjozOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ0QnKTogRml4IHR5cG8gd2hpY2ggY2F1c2VkCi0JbWlzY29tcGlsYXRpb24gb2YgImRpYWciIGluc3RydWN0aW9ucy4KLQotTW9uIEphbiAyMyAxNTo1MTo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCi1Nb24gSmFuIDIzIDE0OjA3OjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmggKHRjX2luaXRfYWZ0ZXJfYXJncyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9iZWdpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgdGFibGUuCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBwLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBDYXN0IGZyX2FkZHJlc3MgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgotCShtZF9hcHBseV9maXgpOiBVc2UgYXNfd2Fybl93aGVyZSByYXRoZXIgdGhhbiBhc193YXJuLgotCShzaF9pbml0X2FmdGVyX2FyZ3MpOiBSZW1vdmUgZW1wdHkgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWdudSplbGYqKTogTmV3IHRhcmdldC4KLQotU2F0IEphbiAyMSAxOTowMjoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIGhhc2guYyAoaGFzaF9hc2spOiBJZiB3ZSBmaW5kIHRoZSBzbG90IGFmdGVyIHdyYXBwaW5nIGFyb3VuZCwKLQlicmVhayBvdXQgb2YgdGhlIGxvb3AuICBGaXhlcyBidWcgaW4gSmFuIDE4IGNoYW5nZS4KLQotRnJpIEphbiAyMCAxNzowNzozMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBoYXNoLmMgKGhhc2hfY29kZSk6IFVuZG8gbGFzdCBjaGFuZ2UuCi0KLVRodSBKYW4gMTkgMTQ6NDk6NDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMgdG8ga2VlcAotCWdjYyBxdWlldC4KLQkoZ3BkaXNwX2hpMTZfaG93dG8pOiBEb24ndCB1c2UgImNvbnN0IiB3aXRoIHJlbG9jX2hvd3RvX3R5cGUuCi0JKGluX3JhbmdlX3NpZ25lZCk6IEFkZCBwYXJlbnMgYXJvdW5kIHN1YnRyYWN0aW9uIGluc2lkZSBzaGlmdC4KLQkqIGdhc3AuYyAoZG9fZGF0YSk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGUgIm9wbmFtZSIuCi0JKGlzdHJ1ZSk6IFByb3ZpZGUgYSBkZWZhdWx0IGNhc2UgdG8gc2V0ICJyZXMiIGFuZCBrZWVwICJnY2MgLVdhbGwiCi0JcXVpZXQuCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IERlbGV0ZWQgdW51c2VkIHZhcmlhYmxlLgotCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IERlY2xhcmUuCi0JKiBoYXNoLmMgKGhhc2hfYXNrKTogRGVsZXRlIGRpc2FibGVkIG5vbi1zdHJjbXAgdmVyc2lvbiBvZiB0aGUKLQljb2RlLCBhbmQgYXV0b21hdGljIHZhcmlhYmxlcyB1c2VkIG9ubHkgaW4gdGhvc2Ugc2VjdGlvbnMuCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlcl8xKTogT25seSBkZWZpbmUgbG9jYWwgdmFyaWFibGUKLQkicHJldl9maXgiIGlmIEJGRF9BU1NFTUJMRVIuCi0JKiBmbG9udW0ta29uc3QuYyAoZHVtbXkxKTogUmV0dXJuIHZvaWQuCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHR3byBjb21wYXJpc29ucyBvZgotCXVuc2lnbmVkIG51bWJlcnMgdmVyc3VzIHplcm8uCi0JKiBhcy5oIChiY29weSk6IElmIG5laXRoZXIgbWVtY3B5IG5vciBiY29weSBpcyBkZWZpbmVkIGFzIGEgbWFjcm8sCi0JZGVmaW5lIHRvIHVzZSBtZW1jcHkuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jLCBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IFJldmVydCAyIEp1bmUgY2hhbmdlcy4KLQlUdXJucyBvdXQgd2UgbmV2ZXIgZ290IHRoZSBhc3NpZ25tZW50IGRvbmUgYWZ0ZXIgYWxsLgotCi0JQ2xlYW51cCBvZiBWQVggYW5kIFZNUyBjb2RlLCBmcm9tIFBhdCBSYW5raW46Ci0JKiBjb25maWcvb2JqLXZtcy5jOiBDaGFuZ2VkIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzIHRvIGxvd2VyIGNhc2UuCi0JKENoYW5nZWQgY2FsbCBzaXRlcyBpbiB3cml0ZS5jLikgIERlY2xhcmUgVk1TIHN5c3RlbSBmdW5jdGlvbgotCW5hbWVzIHVzZWQsIGNvbmRpdGlvbmFsIG9uIGFjdHVhbGx5IGJlaW5nIG9uIFZNUy4gIENoYW5nZWQgbWFueQotCWZ1bmN0aW9ucyB0aGF0IHJldHVybmVkIG5vIHVzZWZ1bCB2YWx1ZSB0byBub3cgYmUgZGVjbGFyZWQgdG8KLQlyZXR1cm4gdm9pZC4gIFJlbW92ZWQgbWFueSB1bnVzZWQgdmFyaWFibGVzLiAgU3VwcGx5IG1pc3NpbmcKLQlyZXR1cm4gc3RhdGVtZW50cyBvciB2YWx1ZXMuICBTdXBwbHkgYGRlZmF1bHQnIGNhc2UgaW4gc3dpdGNoCi0Jc3RhdGVtZW50cy4gIEVuc3VyZSBsb2NhbCB2YXJpYWJsZXMgZ2V0IGluaXRpYWxpemVkLgotCSogY29uZmlnL3RjLXZheC5jOiBNaW5vciBjaGFuZ2VzIHRvIHNpbGVuY2UgImdjYyAtV2FsbCIuCi0JKiBjb25maWcvb2JqLXZtcy5oLCBjb25maWcvdGMtdmF4Lmg6IEFkZGVkIHNvbWUgbWlzc2luZwotCWRlY2xhcmF0aW9ucy4KLQotV2VkIEphbiAxOCAxMzo0OToyNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhdG9mLWdlbmVyaWMuYyAoZmxvbnVtX3ByaW50KSBbVFJBQ0VdOiBOZXcgZnVuY3Rpb24uCi0JKGF0b2ZfZ2VuZXJpYykgW1RSQUNFXTogUHJpbnQgbXVsdGlwbGllciBiZWZvcmUgbXVsdGlwbGljYXRpb24sCi0JYW5kIHByaW50IG11bHRpcGxpY2F0aW9uIHJlc3VsdCBiZWZvcmUgYW5kIGFmdGVyIGNvcHkuCi0KLQkqIGZsb251bS1tdWx0LmMgKGZsb251bV9tdWx0aXApOiBBdm9pZCBzaWduIGV4dGVuc2lvbiBwcm9ibGVtcwotCWFyb3VuZCBtdWx0aXBsaWNhdGlvbiBvcGVyYXRpb24uCi0KLQkqIGF0b2YtZ2VuZXJpYy5jIChBU1NVTUVfREVDSU1BTF9NQVJLX0lTX0RPVCk6IERlZmluZS4KLQkoYXRvZl9nZW5lcmljKSBbQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1RdOiBDaGVjayBmb3IgJy4nCi0JZXhwbGljaXRseSBpbnN0ZWFkIG9mIGNhbGxpbmcgc3RyY2hyLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBXaGVuIHNjYW5uaW5nIHN1Y2Nlc3NpdmUgb3Bjb2RlCi0JdGFibGUgZW50cmllcywgY2hlY2sgbmFtZXMgZm9yIHBvaW50ZXIgZXF1YWxpdHkgYmVmb3JlIGRvaW5nCi0Jc3RyaW5nIGNvbXBhcmlzb25zLgotCi0JKiBoYXNoLmMgKGhhc2hfYXNrKTogQ2FsbCBzdHJjbXAgaW5zdGVhZCBvZiBleHBhbmRpbmcgaXQgaW5saW5lLgotCShoYXNoX2NvZGUpOiBSZXBsYWNlZCB3aXRoIGEgdmVyc2lvbiBmcm9tIGJmZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgQ09GRl9GTEFHUyBpc24ndAotCWRlZmluZWQsIGRlZmF1bHQgaXQgdG8gemVyby4KLQotV2VkIEphbiAxOCAxMjoxNjowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBDbGVhciBmeF9ic3Igb24gdGhvc2UgdGFyZ2V0cyB3aGljaAotCXVzZSBpdC4KLQotCSogZXhwci5jIChvcGVyYW5kKTogUGFyZW50aGVzaXplICYmIHdpdGhpbiB8fC4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogTGlrZXdpc2UuCi0JKGxpc3Rfc3ltYm9sX3RhYmxlKTogVXNlICVsdSB0byBwcmludCBzaXplb2YuCi0JKiBzeW1ib2xzLmM6IENvbW1lbnQgb3V0IHVudXNlZCBmdW5jdGlvbiBpbmRlbnQuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogQ2FzdCBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogT25seSBkZWNsYXJlIHN5bWJvbF9wdHIgaWYgaXQKLQl3aWxsIGJlIHVzZWQuCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfYmVnaW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHJlZy4KLQkoZ2V0X29wZXJhbmQpOiBEZWNsYXJlIHR5cGUgb2YgcGFyYW1ldGVyIGRpcmVjdGlvbi4gIFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZSBzaXplLgotCShnZXRfc3BlY2lmaWMpOiBGaXggY29tbWVudCB0byBhdm9pZCBuZXN0ZWQgY29tbWVudHMuCi0JKGNoZWNrX29wZXJhbmQpOiBDYXN0IFhfYWRkX251bWJlciB0byB1bnNpZ25lZCBsb25nIGZvciBwcmludGYuCi0JKGJ1aWxkX2J5dGVzKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMgb3V0cHV0X3B0ciwgcGFydCwgYW5kCi0JaGlnaC4KLQkoYnVpbGRfYnl0ZXMpOiBDYXN0IFhfYWRkX251bWJlciB0byB1bnNpZ25lZCBsb25nIGZvciBwcmludGYuCi0JKGNsZXZlcl9tZXNzYWdlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzY2FuLgotCShtZF9hc3NlbWJsZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaS4KLQkodGNfY29mZl9zaXplbWFjaGRlcCk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKiB0Yy1oODMwMC5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCi1UdWUgSmFuIDE3IDEwOjU4OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc180NjUwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBIYW5kbGUgYSBjcHUgc3RyaW5nIG9mICI0NjUwIi4gIElmIG1pcHNfNDY1MCB3YXMgbm90Ci0JaW5pdGlhbGl6ZWQsIHNldCBpdCB0byAwLgotCShhcHBlbmRfaW5zbik6IERvbid0IGluc2VydCBub3BzIGFyb3VuZCBISSBhbmQgTE8gb24gYSA0NjUwLgotCShtaXBzX2VtaXRfZGVsYXlzKTogTGlrZXdpc2UuCi0JKG1pcHNfaXApOiBVc2UgSU5TTl9JU0EgbWFzayB0byBjaGVjayBJU0Egb2YgaW5zdHJ1Y3Rpb24uICBDaGVjawotCWZvciBJTlNOXzQ2NTAuCi0JKG1kX2xvbmdvcHRzKTogQWRkIG00NjUwIGFuZCBuby1tNDY1MC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG1pcHMtY3B1PTQ2NTAuICBIYW5kbGUgLW00NjUwIGFuZAotCS1uby1tNDY1MC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBuZXcgTUlQUyBvcHRpb25zLgotCi1TYXQgSmFuIDE0IDIzOjQ4OjEzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQGpvbm55PgotCi0JKiBjb25maWcvdGMtdzY1LmMsIGNvbmZpZy90Yy13NjUuaCwgY29uZmlnL3c2NS5tdDogTmV3ZmlsZXMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogQ29wZSB3aXRoIHc2NS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBSZWNvZ25pemUgdzY1LgotCi1UaHUgSmFuIDEyIDE3OjU2OjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpIFtfX0dOVUNfXyAmJiBfX09QVElNSVpFX19dOiBJZiBgZ2V0JwotCWZ1bmN0aW9uIGlzIHNjcnViX2Zyb21fZmlsZSwgY2FsbCBzY3J1Yl9mcm9tX2ZpbGUgZGlyZWN0bHksIGFuZAotCWdldCBnY2MncyBpbmxpbmluZyBjYXBhYmlsaXR5IGludG8gdGhlIGFjdC4KLQotCSogTWFrZWZpbGUuaW4gKFZNU19PVEhFUl9PQkpTKTogQWRkIC4uL2xpYmliZXJ0eS9oZXguby4KLQkoT0JKUyk6IERlbGV0ZSBoZXgtdmFsdWUuby4KLQkoUkVBTF9TT1VSQ0VTKTogRGVsZXRlIGhleC12YWx1ZS5jLgotCShoZXgtdmFsdWUubyk6IERlbGV0ZSBkZXBlbmRlbmNpZXMuCi0JKiBoZXgtdmFsdWUuYzogRGVsZXRlZC4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGhleF9pbml0LgotCSogZXhwci5jLCBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLiAgUmVwbGFjZQotCWhleF92YWx1ZSBhcnJheSByZWZlcmVuY2VzIHdpdGggaGV4XyogbWFjcm9zLgotCi1XZWQgSmFuIDExIDE3OjUxOjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChDT0ZGX0ZMQUdTKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKENPRkZfRkxBR1MpLCBjb25maWcvdGMtc2guaCAoQ09GRl9GTEFHUyksCi0JY29uZmlnL3RjLXo4ay5oIChDT0ZGX0ZMQUdTKTogRGl0dG8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChLRUVQX1JFTE9DX0lORk8pOiBNYWtlIHN1cmUgaXQncyBhbHdheXMKLQlkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwLCBjYXNlcyBBT0ZGIGFuZCBBSU5ERVgpOiBEb24ndAotCWdlbmVyYXRlIDY4MDIwIGFkZHJlc3NpbmcgbW9kZXMgZm9yIGEgNjgwMDAgcHJvY2Vzc29yLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgY2FzZXMgUENSRUwgYW5kIFBDTEVBKTogRGl0dG8uCi0KLVR1ZSBKYW4gMTAgMTM6MzQ6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgdHJlYXQgaDgzMDAgYW5kIHo4awotCXNwZWNpYWxseSB3aXRoIHJlZ2FyZCB0byBmaXh1cHMuCi0KLU1vbiBKYW4gIDkgMTY6MjI6MjggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoUkVMQVhfUkVMT0MxLCBSRUxBWF9SRUxPQzIpOiBDYXN0IHZhbHVlcyB0bwotCWJmZF92bWEgYmVmb3JlIHN1YnRyYWN0aW5nLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uKTogSGFuZGxlIHJzX3NwYWNlIGxpa2UgcnNfZmlsbCwKLQlidXQgbWFrZSBzdXJlIGZyX3N5bWJvbCBpcyBudWxsLgotCShmaWxsX3NlY3Rpb24pOiBEaXR0by4KLQotU3VuIEphbiAgOCAxNjoxNDoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBGaXggaGFuZGxpbmcgb2YgZmxvYXRpbmcgcG9pbnQKLQl2YWx1ZXMgd2hlbiBHUE9QVCBpcyBub3QgZGVmaW5lZC4KLQotRnJpIEphbiAgNiAxNjo1OTo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXNwLmM6IEluY2x1ZGUgc3RyaW5nLmguICBQdXQgY29uZmlnLmggYmVmb3JlIG90aGVyIGluY2x1ZGVzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBEZWxheSBjYWxscyB0byBlbWl0X2FkZDY0IHVudGlsCi0JYWZ0ZXIgYW55IHJlbWFpbmluZyBvcGVyYW5kcyBhcmUgYWxzbyBrbm93biB0byBtYXRjaC4KLQotRnJpIERlYyAzMCAxODoyMTo0MSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogQnVpbGQgYSBmb3JtYXQgc3RyaW5nIGJhc2VkIG9uCi0JdGhlIHNpemUgb2YgdGhlIHZhbHVlIHRvIGJlIHByaW50ZWQsIGFzIGxvbmcgYXMgInVuc2lnbmVkIGxvbmciIGlzCi0JYXQgbGVhc3QgYXMgd2lkZSwgYWZ0ZXIgaGFuZGxpbmcgdGhlIHNwZWNpYWwgY2FzZSBvZiA0LWJ5dGUKLQl2YWx1ZXMuCi0KLQkqIE1ha2VmaWxlLmluIChkZXBlbmRlbmNpZXMpOiBNYWtlICQoT0JKUykgZGVwZW5kIG9uIGFzLmggYW5kCi0JZXZlcnl0aGluZyBpdCBpbmNsdWRlcy4gIERlbGV0ZSB0aG9zZSBmaWxlcyBmcm9tIHBlci1maWxlCi0JZGVwZW5kZW5jaWVzLgotCi0JKiBhcy5oIChyZWxheF9zdWJzdGF0ZVQpOiBOb3cgZGVmaW5lZCB0byBiZSB1bnNpZ25lZCBpbnQuCi0JKHJlbGF4X3N0YXRlVCk6IFNlcGFyYXRlIHR5cGVkZWYgZnJvbSBlbnVtIGRlZmluaXRpb24uCi0JKGVudW0gX3JlbGF4X3N0YXRlKTogUmVvcmRlcmVkIGZvciBiZXR0ZXIgcHVuY3R1YXRpb24uICBBZGRlZCBuZXcKLQl2YWx1ZXMgcnNfYWxpZ25fY29kZSBhbmQgcnNfc3BhY2UuCi0JKGxpbmVubywgc3RydWN0IGxpbmVub19zdHJ1Y3QpOiBVbnVzZWQsIGRlbGV0ZWQuCi0KLQkqIGFzLmg6IE5vIGxvbmdlciBpbmNsdWRlIGFzc2VydC5oLgotCShhc19hc3NlcnQpOiBEZWNsYXJlLgotCShhc3NlcnQpOiBOZXcgZGVmaW5pdGlvbiwgY2FsbHMgYXNfYXNzZXJ0IGxvbmdlciBuZWVkZWQuCi0JKF9fUFJFVFRZX0ZVTkNUSU9OX18pOiBQcm92aWRlIGRlZmF1bHQgZm9yIG9sZGVyIHZlcnNpb25zIG9mIGdjYy4KLQkqIG1lc3NhZ2VzLmMgKGFzX2Fzc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGdkYmluaXQuaW46IFB1dCBhIGJyZWFrcG9pbnQgdGhlcmUuCi0KLQkqIHJlYWQuYyAoc19zcGFjZSk6IFJld3JpdGUgdG8gaGFuZGxlIGdlbmVyYWwgZXhwcmVzc2lvbnMuCi0JR2VuZXJhdGUgcnNfc3BhY2UgZnJhZ3MgZm9yIG5vbi1jb25zdGFudCB2YWx1ZXMuCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogVHJlYXQgcnNfYWxpZ25fY29kZSBhbmQgcnNfc3BhY2UKLQlsaWtlIHJzX2FsaWduIGFuZCByc19vcmcuICBWZXJpZnkgdGhhdCBmcl9vZmZzZXQgaXMgbm9uLW5lZ2F0aXZlLAotCWFuZCBmb3JjZSBmcmFnIHR5cGUgdG8gcnNfZmlsbCBvbmx5IGFmdGVyIGFzc2VydGlvbiBjaGVja3MuCi0JKHJlbGF4X3NlZ21lbnQpOiBUcmVhdCByc19hbGlnbl9jb2RlIGxpa2UgcnNfYWxpZ24uICBUcmVhdAotCXJzX3NwYWNlIGxpa2UgcnNfb3JnIGluIHRoZSBmaXJzdCBzd2l0Y2g7IGluIHRoZSBzZWNvbmQsIGZvcmNlIHRoZQotCW9wZXJhbmQgdG8gYSBjb25zdGFudCwgYW5kIHVzZSBpdCBmb3IgdGhlIGdyb3d0aCBzaXplLgotCi1XZWQgRGVjIDI4IDIwOjU3OjM3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdWJzcGFjZSk6IEZvciBzZWN0aW9ucyB3aXRoIHRoZSBaRVJPCi0JYXR0cmlidXRlLCBzZXQgdGhlICJic3MiIGZpZWxkIGluIHRoZSBhcHByb3ByaWF0ZSBzZWdpbmZvIHN0cnVjdHVyZS4KLQotV2VkIERlYyAyOCAxNTowMTowMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmg6IEluY2x1ZGUgb2JzdGFjay5oLgotCi1UdWUgRGVjIDI3IDE4OjE2OjA0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogRW5hYmxlIGFsaWduKiBjb21wb25lbnRzIG5vdy4KLQotVHVlIERlYyAyMCAxNDo1NjozMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBmcmFncy5jIChmcmFnX2luaXQpOiBDYWxsIG9ic3RhY2tfYmVnaW4gb24gYGZyYWdzJy4KLQkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19iZWdpbik6IERvbid0IGRvIGl0IGhlcmUuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBmcmFnX2luaXQgYmVmb3JlIHN1YnNlZ3NfYmVnaW4uCi0KLQkqIGZyYWdzLmMgKGZyYWdfYXBwZW5kXzFfY2hhcik6IE5ldyBmdW5jdGlvbi4KLQkqIGZyYWdzLmggKGZyYWdfYXBwZW5kXzFfY2hhcik6IERlY2xhcmUgaXQuCi0JKEZSQUdfQVBQRU5EXzFfQ0hBUik6IENhbGwgaXQuICBPbGQgZGVmaW5pdGlvbiBpcyBjb21tZW50ZWQgb3V0Ci0JZm9yIG5vdy4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBBZGRlZCAoYnV0IGNvbW1lbnRlZCBvdXQpIG5ldyBmaWVsZHMgZm9yCi0JdHJhY2tpbmcgY3VycmVudCBhbGlnbm1lbnQuCi0JKGZyYWdfbm93X2ZpeCk6IENoYW5nZWQgbWFjcm8gdG8gZnVuY3Rpb24gZGVjbGFyYXRpb24uCi0JKiBmcmFncy5jIChmcmFnX25vd19maXgpOiBEZWZpbmUgZnVuY3Rpb24gaGVyZS4KLQkoZnJhZ19uZXcpOiBVc2UgaXQgaW5zdGVhZCBvZiBhY2Nlc3NpbmcgYGZyYWdzJyBkaXJlY3RseS4KLQkqIGZyYWdzLmggKGZyYWdzKTogQ2hhbmdlIGNvbW1lbnQgdG8gaW5kaWNhdGUgaXQgc2hvdWxkbid0IGJlCi0JYWNjZXNzZWQgZGlyZWN0bHkuCi0JKiBzdWJzZWdzLmggKHN0cnVjdCBmcmNoYWluKTogTmV3IGZpZWxkIGZyY2hfb2JzdGFjaywgaW50ZW5kZWQgdG8KLQlldmVudHVhbGx5IHJlcGxhY2UgZ2xvYmFsIGBmcmFncycgb2JzdGFjay4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogVXNlIGZyYWdfbm93X2ZpeCBpbnN0ZWFkIG9mCi0JYWNjZXNzaW5nIGBmcmFncycgZGlyZWN0bHkuICBJbml0aWFsaXplIGZpZWxkcyBvZiBuZXcgZnJjaGFpblMKLQlleHBsaWNpdGx5IGluc3RlYWQgb2Ygd2l0aCBtZW1zZXQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfbG4pIFshQkZEX0FTU0VNQkxFUl06IFVzZQotCWZyYWdfbm93X2ZpeC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfbG9jKSwgY29uZmlnL29iai12bXMuYwotCSh2bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYpLCBzeW1ib2xzLmMgKGNvbG9uKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogVXNlIG9mZnNldFQgYW5kIGFkZHJlc3NUCi0JaW5zdGVhZCBvZiBsb25nIGFuZCB1bnNpZ25lZCBsb25nLgotCShtZF9hcHBseV9maXgpOiBDYXN0IHZhbHVlIGJlZm9yZSBwYXNzaW5nIGl0LgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotZWxmLmgsCi0JY29uZmlnL29iai1zb20uaCwgY29uZmlnL3RjLWg4NTAwLmMsIGNvbmZpZy90Yy1ocHBhLmMsCi0JY29uZmlnL3RjLWhwcGEuaCwgY29uZmlnL3RjLXNoLmMsIGNvbmZpZy90Yy16OGsuYzogRG9uJ3QgcmVseSBvbgotCXVzZSBvZiAiLi4iIHdoZW4gaW5jbHVkaW5nIGhlYWRlciBmaWxlcy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBSZWZvcm1hdCBjb25kaXRpb24gaW4gYW4gYGlmJwotCXN0YXRlbWVudC4KLQotCSogTWFrZWZpbGUuaW4gKFNVQkRJUl9JTkNMVURFUyk6IERlbGV0ZWQuCi0KLVR1ZSBEZWMgMjAgMTM6NDA6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogSW5jbHVkZSBiZmQvbGliY29mZi5oLCBub3QgbGliY29mZi5oLgotCi1Nb24gRGVjIDE5IDE2OjUzOjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFJld3JpdGUgdG8gaGFuZGxlIE9fYmlnIDY0IGJpdAotCWNvbnN0YW50cy4KLQkobWlwc19pcCk6IEFjY2VwdCBPX2JpZyBjb25zdGFudHMgaW4gY2FzZSAnSScuICBDaGFuZ2UgY2FzZQotCSdpJy8naicgdG8gdHJlYXQgYW4gT19iaWcgY29uc3RhbnQgYXMgYW4gb3V0IG9mIHJhbmdlIHZhbHVlLgotCi1Nb24gRGVjIDE5IDE0OjE1OjA3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdWJzcGFjZSk6IE1ha2Ugc3VyZSBTRUNfSEFTX0NPTlRFTlRTIGlzCi0JY2xlYXIgZm9yIGEgc2VjdGlvbiB3aXRoIHRoZSAiWkVSTyIgYXR0cmlidXRlLgotCi0JKiBSZWR1Y2UgdXNlbGVzcyBzeW1ib2xzIGZvciBFTEYgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHNtYWxsZXIKLQlvYmplY3RzIGFuZCBzcGVlZCB1cCB0aGUgbGlua2VyLgotCSogY29uZmlnL3RjLWhwcGEuYyAoc3RydWN0IGNhbGxfaW5mbyk6IFJlcGxhY2UgZW5kX3N5bWJvbCBmaWVsZAotCXdpdGggYSBzaXplIGZpZWxkLgotCShocHBhX2VsZl9tYXJrX2VuZF9mdW5jdGlvbik6IERlbGV0ZSB1bm5lZWRlZCBmdW5jdGlvbi4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogRm9yIHRoZSAybmQgdW53aW5kIHJlbG9jYXRpb24sIHVzZQotCXRoZSBmdW5jdGlvbiBzeW1ib2wgKyBmdW5jdGlvbiBzaXplIGluc3RlYWQgb2YgYSBzcGVjaWFsIHN5bWJvbAotCWZvciB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KLQkocHJvY2Vzc19leGl0KTogQ29tcHV0ZSB0aGUgZnVuY3Rpb24gc2l6ZSBoZXJlLiAgRG9uJ3QgY2FsbAotCWhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uIGFueW1vcmUuCi0JKHBhX3Byb2NlbmQpOiBMaWtld2lzZS4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IE9ubHkgcmVqZWN0IDMyYml0IHJlbG9jYXRpb25zIGZvciBTT00uCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTaW1wbGlmeS4KLQotTW9uIERlYyAxOSAxMzo0OTowNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtaXBzLXNvbnktYnNkIGFuZCBtaXBzLWRlYy1ic2QsIGJ1dAotCXJlamVjdCBvdGhlciB2ZW5kb3JzIHVudGlsIHdlIGNhbiBiZSBzdXJlIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aAotCWJmZC4KLQotCSogY29uZmlnL29iai12bXMuYyAoQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSk6IEluc3RlYWQgb2YgZm9ybWF0dGluZwotCWEgYnVmZmVyIHRvIHBhc3MgdG8gYGVycm9yJywganVzdCBjYWxsIGBhc19mYXRhbCcgZGlyZWN0bHkuCi0JKFZNU19Qc2VjdF9TcGVjKTogRGl0dG8uCi0JKFZNU19UQlRfTW9kdWxlX0JlZ2luLCBWTVNfVEJUX1NvdXJjZV9GaWxlLCBnZW4xLAotCVZNU190eXBlZGVmX3BhcnNlLCBWTVNfTFNZTV9QYXJzZSwgVk1TX0VtaXRfR2xvYmFsdmFsdWVzKTogQ2FsbAotCWFzX3Rza3RzayBpbnN0ZWFkIG9mIHByaW50Zi4KLQkoVk1TX1RCVF9Nb2R1bGVfQmVnaW4sIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiwKLQlWTVNfVEJUX1NvdXJjZV9GaWxlLCBWTVNfVEJUX1NvdXJjZV9MaW5lcywKLQlWTVNfU3RvcmVfUmVwZWF0ZWRfRGF0YSwgVk1TX0NoZWNrX0Zvcl9NYWluKTogVXNlIGV4cGxpY2l0Ci0JaW50ZWdlcnMgcmF0aGVyIHRoYW4gc2l6ZW9mIGV4cHJlc3Npb25zIHVzaW5nIGJhc2ljIGludGVnZXIgdHlwZXMsCi0JaW4gY2FzZSBob3N0IGFuZCB0YXJnZXQgYXJlbid0IHRoZSBzYW1lLiAgVXNlIG1lbWNweSBvciBDT1BZXyoKLQltYWNyb3MgaW5zdGVhZCBvZiBwb3NzaWJseSB1bmFsaWduZWQgd29yZCBvciBsb25nd29yZCBhc3NpZ25tZW50LgotCi0JKiBjb25maWcvb2JqLXZtcy5oIChPQkpfU1lNRklFTERfVFlQRSk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSwKLQlWTVNfQ2hlY2tfRm9yX01haW4sIFZNU193cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBzeV9vYmogaW5zdGVhZCBvZgotCWZvcmNpbmcgc3lfbnVtYmVyIHRvIGhvbGQgYSBwb2ludGVyLgotCi1GcmkgRGVjIDE2IDE0OjQwOjE2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9iZWdpbik6IERvbid0IGZpbGwgaW4gbWRfcmVsYXhfdGFibGUgaGVyZS4KLQkobWRfcmVsYXhfdGFibGUpOiBVc2Ugc3RhdGljIGluaXRpYWxpemF0aW9uLgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAocGFyc2VfZXhwLCBnZXRfb3BlcmFuZHMsIGNsZXZlcl9tZXNzYWdlLAotCW1kX2Fzc2VtYmxlLCB0Y19jcmF3bF9zeW1ib2xfY2hhaW4sIG1kX3VuZGVmaW5lZF9zeW1ib2wsCi0JdGNfaGVhZGVyc19ob29rLCBtZF9vcGVyYW5kLCBtZF9udW1iZXJfdG9fY2hhcnMpOiBEb24ndCB1c2UgREVGVU4uCi0KLQkqIE1ha2VmaWxlLmluIChDSEVDS0ZMQUdTKTogRG9uJ3QgcGFzcyBBU19GT1JfVEFSR0VULAotCUNDX0ZPUl9UQVJHRVQsIE9CSkRVTVBfRk9SX1RBUkdFVCwgTk1fRk9SX1RBUkdFVDsgdGhleSdyZSBub3QKLQl1c2VkLgotCShBU19GT1JfVEFSR0VULCBDQ19GT1JfVEFSR0VULCBPQkpEVU1QLCBPQkpEVU1QX0ZPUl9UQVJHRVQsIE5NLAotCU5NX0ZPUl9UQVJHRVQpOiBEb24ndCBkZWZpbmUuCi0JKFZNU19PVEhFUl9PQkpTKTogQWRkIHhtYWxsb2MubyBhbmQgeGV4aXQubyBmcm9tIGxpYmliZXJ0eS4KLQkodG9vbGRpcik6IFVzZSBleGVjX3ByZWZpeCwgbm90IGxpYmRpci4KLQotRnJpIERlYyAxNiAxMTowNzoxMCAxOTk0ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBJbmNsdWRlIGxpYmNvZmYuaCwgbm90IC4uL2JmZC9saWJjb2ZmLmguCi0KLQkqIGFzLmg6IEluY2x1ZGUgcHJvZ3Jlc3MuaC4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIFNUQVJUX1BST0dSRVNTIGFuZCBFTkRfUFJPR1JFU1MuCi0JKG1haW4sIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IENhbGwgUFJPR1JFU1MuCi0KLUZyaSBEZWMgMTYgMDA6NDY6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFVzZSBiZmRfaXNfdW5kX3NlY3Rpb24gYW5kCi0JYmZkX2lzX2Fic19zZWN0aW9uIHJhdGhlciB0aGFuIGNvbXBhcmluZyBhZ2FpbnN0ICZiZmRfdW5kX3NlY3Rpb24KLQlhbmQgJmJmZF9hYnNfc2VjdGlvbi4KLQotVGh1IERlYyAxNSAxNToyNzoxNCAxOTk0ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9iZWdpbik6IFVzZSBhIGxvY2FsIHZhcmlhYmxlIHdoZW4KLQlpbml0aWFsaXppbmcgbWRfcmVsYXhfdGFibGUgdG8gYXZvaWQgZXJyb3JzIGFib3V0IG1vZGlmeWluZyBhCi0JY29uc3QgZGF0YSBzdHJ1Y3R1cmUuCi0KLVR1ZSBEZWMgMTMgMTU6NDI6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHRjX2dlbl9yZWxvYyk6IFJlbW92ZSBPQkpfRUxGIGhhY2sgd2hpY2gKLQlhcHBlYXJzIHRvIG5vIGxvbmdlciBiZSBuZWVkZWQuCi0KLVR1ZSBEZWMgMTMgMDg6MDQ6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IEFjY2VwdCBCRkRfUkVMT0NfUENSRUwqIHdpdGhvdXQKLQlyZXF1aXJpbmcgdGhhdCB0aGUgWF9vcF9zeW1ib2wgYmUgaW4gdGhlIHRleHRfc2VjdGlvbi4KLQkobWFjcm8pOiBDaGFuZ2UgdGhlIHRlc3QgZm9yIGEgbGVnZWwgZXhwcmVzc2lvbiBkaWZmZXJlbmNlIHRvCi0JY29ycmVzcG9uZCB0byBjaGFuZ2VzIGluIHBzZXVkb19zZXQgaW4gcmVhZC5jLgotCi1GcmkgRGVjICA5IDIxOjA0OjE3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcykgW1JFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRV06IFVzZQotCWJmZF9pbnN0YWxsX3JlbG9jYXRpb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSk6IElmIHRoZXJlIGlzIG5vIGN1cnJlbnQKLQlyb3V0aW5lLCBqdXN0IHJldHVybi4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwLCBjYXNlICdCJywgc3ViY2FzZSAnYycpOiBVc2Ugb3Bjb2RlCi0JdmFsdWUgZnJvbSBwYXR0ZXJuIGluc3RlYWQgb2YgYXNzdW1pbmcganNyLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oIChqbXApOiBBZGQgYSAiMSxCYyIgZm9ybS4KLQotVGh1IERlYyAgOCAxNzo0ODoyNSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTk1fRk9SX1RBUkdFVCk6IFVzZSAuLi9iaW51dGlscy9ubS5uZXcsIG5vdCBqdXN0Ci0JcGxhaW4gbm0uCi0KLQkqIGNvbmZpZ3VyZS5pbiAobnMzMmstcGM1MzItbWFjaCopOiBTZWxlY3QgY29ycmVjdCBlbXVsYXRpb24uCi0JKG1pcHMtc29ueS1ic2QqKTogVXNlIGVjb2ZmLgotCShtaXBzLSotZ251Kik6IE5ldyB0YXJnZXQsIHVzaW5nIGFvdXQgZm9ybWF0LCBmcm9tIFJvbGFuZCBNY0dyYXRoLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAyOSAxMzo1ODoxMCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JVXNlIGxpYmliZXJ0eSB2ZXJzaW9uIG9mIHhtYWxsb2M6Ci0JKiBNYWtlZmlsZS5pbiAoUkVBTF9TT1VSQ0VTKTogRGVsZXRlIHhtYWxsb2MuYy4KLQkoT0JKUyk6IERlbGV0ZSB4bWFsbG9jLm8uCi0JKHhtYWxsb2Mubyk6IERlbGV0ZSBkZXBlbmRlbmNpZXMuCi0JKiBhcy5jIChtYWluKTogQ2FsbCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgb25jZSBwcm9ncmFtIG5hbWUgaXMKLQlrbm93bi4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGluX3JhbmdlX3NpZ25lZCwgaW5fcmFuZ2VfdW5zaWduZWQpOiBOZXcKLQlyb3V0aW5lcywgc3BsaXQgZnJvbSBpbl9yYW5nZS4KLQkoaW5fcmFuZ2UpOiBEZWxldGVkLiAgQWxsIGNhbGxzIGNoYW5nZWQgdG8gaW5fcmFuZ2VfKnNpZ25lZC4KLQkoY3JlYXRlX2xpdGFfc2VjdGlvbik6IE1hY3JvIGRlbGV0ZWQuICBTaW5nbGUgdXNlIGV4cGFuZGVkIGluCi0JcGxhY2UuCi0JKGFscGhhX2lwKTogSGFuZGxlIGB0JyBhbmQgYDgnIG9wZXJhbmQgdHlwZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfMTJfUENSRUwuICBQcmludCBuYW1lIG9mCi0JdW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZXMuCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IEFkZGVkIEhBTFQgYW5kIERSQUlOQS4gIERpc2FibGVkIE1PVkksCi0Jc2luY2UgaXQgZG9lc24ndCB3b3JrLCBhbmQgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBuYXRpdmUKLQlhc3NlbWJsZXIuCi0KLQkqIGlucHV0LXNjcnViLmM6IENoYW5nZSB3b3JkaW5nIG9mIGEgY29tbWVudCB0byBhdm9pZCBpbnRlcmZlcmVuY2UKLQl3aXRoIEN5Z251cyBzb3VyY2UtY29udHJvbCB0b29scy4KLQotCSogYXMuaCAoZXJybm8pIFtORUVEX0RFQ0xBUkFUSU9OX0VSUk5PXTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IExpc3QgYnVzY3IgYW5kIHBjciBjb250cm9sCi0JcmVnaXN0ZXJzLgotCShtNjhrX2lwLCBjYXNlICdKJyk6IEhhbmRsZSB0aGVtLgotCi0JRGVsZXRlIHNpZ25hbCBoYW5kbGVyIGNvZGUuICBJdCdzIGJlZW4gZGlzYWJsZWQgc2luY2UgTWFyY2ggMTk5MwotCXdpdGhvdXQgY29tcGxhaW50cy4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgc2lnbmFsLmguCi0JKGdvdF9zaWcpOiBVbnVzZWQgZnVuY3Rpb24gZGVsZXRlZCwgZGVjbGFyYXRpb24gZGVsZXRlZC4KLQkoU0lHVFkpOiBNYWNybyBkZWxldGVkLgotCShtYWluKTogRGVsZXRlZCBkaXNhYmxlZCBjb2RlIGZvciBlc3RhYmxpc2hpbmcgc2lnbmFsIGhhbmRsZXIuCi0KLU1vbiBOb3YgMjggMTE6Mzc6MzUgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEluc2VydCBtaXNzaW5nIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKLQlsaWtlIHdhcm5pbmcgc2F5cyB3ZSBkby4KLQotTW9uIE5vdiAyOCAwMDoxMToxNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAocGFfY2hlY2tfZW9mKTogRGVjbGFyZSBuZXcgZXh0ZXJuIGZ1bmN0aW9uLgotCSh0Y19mcm9iX2ZpbGUpOiBEZWZpbmUgdG8gY2FsbCBwYV9jaGVja19lb2YuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlKTogTmV3Ci0JZnVuY3Rpb24gdG8gdmVyaWZ5IHRoZSBjdXJyZW50IHNwYWNlIGFuZCBzdWJzcGFjZSBhcmUgcmVhc29uYWJsZS4KLQlDYWxsIGZvciB0aGUgYXBwcm9wcmlhdGUgcHNldWRvLW9wcyBhbmQgYmVmb3JlIGluc3RydWN0aW9uIHBhcnNpbmcuCi0JKHBhX2NoZWNrX2VvZik6IE5ldyBmdW5jdGlvbiB0byB2ZXJpZnkgZW50ZXIvZXhpdCBhbmQgcHJvYy9wcm9jZW5kCi0JcGFpcnMgbWF0Y2ggYXQgRU9GLgotCShwYV9jb2RlKTogU2ltcGxpZnkuCi0KLQkqIGNvbmZpZy9vYmotc29tLmM6IERlbGV0ZSAjaWYgMCBjb2RlLgotCi1XZWQgTm92IDIzIDE5OjM2OjA5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKTogU2VsZWN0IGJldHdlZW4gY29mZi1zaGwgYW5kCi0JY29mZi1zaC4KLQkqIGNvbmZpZy9zaC5taCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IEdldCBpdCByaWdodC4KLQkqIGNvbmZpZy90Yy1zaC5jICAobGl0dGxlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBOb3RpY2UgbmV3IG9wdGlvbi4KLQkoYnVpbGRfcmVsYXgsIGJ1aWxkX015dGVzLCBtZF9hdG9mLCBtZF9jb252ZXJ0X2ZyYWcsIG1kX2FwcGx5X2ZpeCk6Ci0JQ29wZSB3aXRoIGxpdHRsZSBlbmRpYW4gZGF0YS4KLQkqIGNvbmZpZy90Yy1zaC5oIChDT0ZGX01BR0lDLCBMSVNUSU5HX0hFQURFUik6IEVuZGlhbiBkZXBlbmRlbnQuCi0KLVdlZCBOb3YgMjMgMTA6NTQ6MzggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYywgRUxGIHZhcmlhbnQpOiBSZXZlcnQgbGFzdAotCWNoYW5nZS4gIFRoZSByZWFsIGJ1ZyB3YXMgaW4gYmZkL2VsZmNvZGUuaCBhbmQgaGFzIGJlZW4gZml4ZWQuCi0KLVR1ZSBOb3YgMjIgMjM6MzE6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYywgRUxGIHZhcmlhbnQpOiBBZGQgc2VjdGlvbi0+dm1hCi0JdG8gdGhlIHJlbG9jYXRpb24ncyBvZmZzZXQuCi0KLVR1ZSBOb3YgMjIgMTQ6Mzc6NTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfWEZPUk0pOiBGaXggdHlwby4KLQotVHVlIE5vdiAyMiAxMDoyMzoyNSAxOTk0ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX3NldCk6IElnbm9yZSB0aGUgLnNldCAobm8pbW92ZSBhbmQKLQkgIC5zZXQgKG5vKXZvbGF0aWxlIGRpcmVjdGl2ZXMuCi0KLVR1ZSBOb3YgMTUgMjE6NDQ6MTMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlKTogTWFrZSBzdXJlIHRvIGFsd2F5cyByZXNldAotCWN1cnJlbnRfc3Vic3BhY2UuCi0JKHBhX3RleHQsIHBhX2RhdGEpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYWxpZ24pOiBOZXcgZnVuY3Rpb24uICBBbGlnbnMgdGhlIGN1cnJlbnQKLQlvZmZzZXQgd2l0aGluIHRoZSBjdXJyZW50IHN1YnNwYWNlIGFsb25nIHdpdGggdXBkYXRpbmcgdGhlCi0JYWxpZ25tZW50IG9mIHRoZSBzdWJzcGFjZSBpdHNlbGYuCi0JKHBhX3N1YnNwYWNlKTogRGVmYXVsdCBhbGlnbm1lbnQgdG8gb25lIGJ5dGUgcmF0aGVybiB0aGFuIHplcm8KLQlieXRlcyB0byBhdm9pZCBzZXR0aW5nIGFsaWdubWVudCB0byBsb2cyKDApLgotCShtZF9wc2V1ZG9fdGFibGUpOiBVc2UgcGFfYWxpZ25tZW50IGZvciAuYWxpZ24uCi0KLVR1ZSBOb3YgMTUgMTU6MjQ6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwpOiBBbHdheXMgcHV0IGEgc3BhY2UgYWZ0ZXIgImZhdGFsIGVycm9yOiIKLQl3aGVuIHByaW50aW5nIG1lc3NhZ2UuCi0KLVR1ZSBOb3YgMTUgMTE6MTA6NDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKG9ial9mcm9iX3N5bWJvbCk6IERlbGV0ZS4KLQkodGNfZnJvYl9zeW1ib2wpOiBNYWtlIGRlZmluaXRpb24gY29uZGl0aW9uYWwgb24gT0JKX1NPTSBvcgotCU9CSl9FTEYuICBGb3IgRUxGIHN1YnRyYWN0IG91dCBzeW1ib2wtPnNlY3Rpb24tPnZtYSBmb3Igbm9uIGNvbW1vbgotCXN5bWJvbHMuCi0KLVdlZCBOb3YgIDkgMTQ6NTM6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RlLWRlbHRhLmg6IE5ldyBmaWxlLCBkZXJpdmVkIGZyb20gdGUtc3lzdjMyLmguCi0KLVdlZCBOb3YgIDkgMTE6NTI6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19iZik6IEFsd2F5cyBzZXQgY29mZl9saW5lX2Jhc2UuCi0KLU1vbiBOb3YgIDcgMDE6NTg6NDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBCdW1wIHRvIDIuNS4zLgotCi0JKiBjb25maWd1cmUuaW46IENvbXBhcmUgZ2VuZXJpYyBjcHUgbmFtZSBhZ2FpbnN0ICJzcGFyYyIsIG5vdAotCSJzcGFyYyoiLCBzaW5jZSBzcGFyYyB2YXJpYW50cyBzaG91bGQgYmUgY2hhbmdlZCB0byAic3BhcmMiLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMS4KLQotCSogY29uZmlnL3RjLWEyOWsuYyAob2N0YWwsIHRvSGV4KTogVmFyaWFibGVzIGRlbGV0ZWQuCi0JKGlzb2N0YWwpOiBNYWNybyBkZWxldGVkLgotCShtZF9iZWdpbik6IERvbid0IGluaXRpYWxpemUgdGhlbS4KLQkobWFjaGluZV9pcCwgY2FzZSAnUCcvJ0EnKTogRm9yIGFic29sdXRlIG9wZXJhbmQsIGdlbmVyYXRlIGFuCi0JZXJyb3IgbWVzc2FnZSBpZiBpdCdzIG91dCBvZiByYW5nZS4KLQkobWRfYXBwbHlfZml4LCBjYXNlIFJFTE9DX0pVTVBUQVJHKTogQ2hlY2sgcmFuZ2UgZm9yIFBDLXJlbGF0aXZlCi0JanVtcHMuCi0JKG1kX2FwcGx5X2ZpeCk6IERlbGV0ZSBjb2RlIGluc2lkZSAiI2lmIDAiLgotCi1UaHUgTm92ICAzIDIwOjIwOjQwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9nbzMyLm1oOiBVbnVzZWQgZmlsZSBkZWxldGVkLgotCi0JKiByZWFkLmMgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uKTogSW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IgbWF5Ci0JbWVyZWx5IGJlIHRoYXQgdGhlIGV4cHJlc3Npb24gY2FuJ3QgY3VycmVudGx5IGJlIHJlZHVjZWQuCi0KLVRodSBOb3YgIDMgMTY6MDk6NTkgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogSWYgVEVfTmV0QlNEIGRlZmluZSBhcwotCSAgImEub3V0LW02OGstbmV0YnNkIi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKTogSWYgVEVfTmV0QlNEIGRlZmluZSBhcwotCSAgImEub3V0LXNwYXJjLW5ldGJzZCIuCi0KLQkqIGNvbmZpZy90ZS1uYnNkLmg6IE5ldyBmaWxlLCBOZXRCU0QgdGFyZ2V0IGVtdWxhdGlvbgotCSogY29uZmlnL3RlLW5ldGJzZC5oOiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLW5ldGJzZCosbTY4Ki0qLW5ldGJzZCosc3BhcmMqLSotbmV0YnNkKik6Ci0JICBTZXQgYmZkX2dhcy4gIFVzZSBuYnNkIGVtdWxhdGlvbi4KLQotVGh1IE5vdiAgMyAxNzo0NDo0NyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIG5ldCAyLjUuMiByZWxlYXNlIGJyYW5jaDoKLQotCSogY29uZmlndXJlLmluOiBQdXQgQUNfREVGSU5FKHNwYXJjdjkpIG9uIGl0cyBvd24gbGluZSwgc28gdGhhdAotCXRoZSBzaGVsbCB2YXJpYWJsZSBzZXR0aW5ncyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIHBlcm1hbmVudC4gIEZvcgotCUNQVXMgcmVxdWlyaW5nIGJmZF9nYXM9eWVzLCBzZWxlY3QgaXQgYmFzZWQgb24gQ1BVIG9ubHksIG5vdAotCWluZGl2aWR1YWwgdGFyZ2V0IG5hbWVzLiAgSGFuZGxlIG02OGstaHAtaHB1eCosIG5vdCBqdXN0IC1ocHV4LgotCi0JKiBjb25maWcvdGMtejhrLmMgKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IEFkZCBkdW1teSBhcmd1bWVudAotCXRvIG1hdGNoIHByb3RvdHlwZSBpbiBvYmotY29mZi5oLgotCi0JKiBjb25maWd1cmUuaW46IFNraXAgdGVzdHMgZm9yIGRlZmluaW5nIFdBTlRfRk9QRU5fQklOIGFuZAotCUlCTV9DT01QSUxFUl9TVVguCi0JKiBhY2NvbmZpZy5oOiBEZWxldGVkIHRoZW0uCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjAuCi0JKiBjb25maWcvZ28zMi5jZmcsIGNvbmZpZy92bXMtY29uZi5oOiBVcGRhdGVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMiwgbWRfY29udmVydF9mcmFnXzEpOiBBbHdheXMgdXNlCi0JSUJNX0NPTVBJTEVSX1NVWCB2ZXJzaW9uIG9mIGNvZGUsIHdpdGggY29tbWVudHMgaW5kaWNhdGluZyB3aHkuCi0KLQkqIGxpc3RpbmcuYyAoZmlsZV9pbmZvKTogVXNlIHRleHQgbW9kZSB3aGVuIG9wZW5pbmcgZmlsZSBmb3IgcmVhZC4KLQlVc2UgInIiIGRpcmVjdGx5LCBubyBtYWNyby4KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9vcGVuKTogRG9uJ3QgdXNlIEZPUEVOX1JULCBqdXN0IHVzZQotCSJyIi4KLQkqIHJlYWQuYyAoc19pbmNsdWRlKTogRGl0dG8uCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBUcnkgYm90aCAid2IiIGFuZCAidyIsIGRvbid0Ci0JYm90aGVyIHdpdGggRk9QRU5fKiBtYWNyb3MuCi0JKiBhcy5oOiBEb24ndCBpbmNsdWRlIGZvcGVuLSouaC4KLQotCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBNYWtlICJyZXQiIHdpdGggbm8gb3BlcmFuZHMgZXF1aXZhbGVudCB0bwotCSJyZXQgemVybywocmEpIiwgdG8gbWF0Y2ggT1NGMSBhbmQgdG8gYmUgY29uc2lzdGVudCB3aXRoIGJvdGgKLQlvbmUtb3BlcmFuZCBmb3Jtcy4KLQotCVBhdGNoZXMgZnJvbSBESiBEZWxvcmllOgotCSogYXMuaCAoYWxsb2NhKTogdW5kZWYgYWxsb2NhIGJlZm9yZSBkZWZpbmluZyBpdCBqdXN0IGluIGNhc2UKLQkqIGNvbmZpZy9nbzMyLmNmZzogbmV3IGZpbGUgZm9yIGF1dG9jb25mIHZhbHVlcwotCSogY29uZmlnL3RlLWdvMzIuaDogbmV3IGZpbGUKLQkqIGNvbmZpZ3VyZS5iYXQ6IG5ldyBmb3IgYXV0b2NvbmYKLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBGaXggdHlwbyBpbiBHT1RQQyBjaGVjazsgaGFkID0KLQlmb3IgPT0uCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgdGFyZ2V0X2ZyYWcgZG9lc24ndCBleGlzdCwgdXNlIC9kZXYvbnVsbC4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IEZvciBub24tVk1TIHN5c3RlbXMsIHJlLWFkZCBgdicgdG8KLQlzdGRfc2hvcnRvcHRzLiAgQWRkICJ2ZXJib3NlIiB0byBsaXN0IG9mIGxvbmcgb3B0aW9ucy4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBXaGVuIGdlbmVyYXRpbmcgYW4gYWJzb2x1dGUgc2VjdGlvbgotCXN5bWJvbCBhcyBhIHBsYWNlaG9sZGVyLCBkb24ndCBtYXJrIGl0IGFzIHVzZWQgaW4gYSByZWxvY2F0aW9uCi0JZW50cnksIGhlcmUuCi0KLQkqIE1ha2VmaWxlLmluIChjb21wYXJpc29uKTogQ29tcGFyZSB1c2luZyBtYWtlZmlsZSBjb2RlIGZyb20gZ2NjLAotCXN0cmlwcGVkIGRvd24gdG8gZGlzY2FyZCBzdWJkaXIgc3R1ZmYgYW5kIGFkYXB0ZWQgdG8gZ2l2ZSBhCi0Jbm9uLXplcm8gZXhpdCBzdGF0dXMgaWYgZWl0aGVyIGZpbGUgZGlmZmVycy4KLQotVGh1IE5vdiAgMyAxNTo0MzowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfYWRkcmVzcyk6IEZpeCBSRUxBWF9FTkNPREUgYXJndW1lbnRzIGZvcgotCU5PX1BJQyBjYXNlLgotCi1UdWUgTm92ICAxIDE2OjEwOjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc19jaGFuZ2Vfc2VjKTogSWYgbm90IEdQT1BULCBkb24ndCBwZXJtaXQKLQlzd2l0Y2hpbmcgdG8gdGhlIHJlYWRvbmx5IGRhdGEgc2VjdGlvbi4KLQotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX3R5cGUpOiBGaXggd2FybmluZyBtZXNzYWdlLgotCi1TdW4gT2N0IDMwIDAwOjU3OjM1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jKTogRGVsZXRlIGRpc2FibGVkIGNvZGUgdG8gcHV0IGVhY2gKLQlwcm9jIGluIGl0cyBvd24gc3Vic3BhY2UsIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuCi0KLVR1ZSBPY3QgMjUgMTQ6NDQ6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEVuc3VyZSB0aGF0IG1pcHMyIGNhc2Ugb2YgTV9MSV9ERCBpbgotCS5yZGF0YSBkb2VzIG5vdCBiZWNvbWUgYSB2YXJpYW50IGZyYWcuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfY3B1KTogSW5pdGlhbGl6ZSB0byAtMS4KLQkobWRfYmVnaW4pOiBEb24ndCBtaXBzX2NwdSBpZiBpdCB3YXMgYWxyZWFkeSBzZXQuCi0JKG1kX3BhcnNlX29wdGlvbik6IEZvciAtbWlwc04sIGRvbid0IHNldCBtaXBzX2NwdSBpZiBpdCB3YXMKLQlhbHJlYWR5IHNldC4gIEZvciAtbWNwdT0sIGp1c3Qgc2V0IG1pcHNfY3B1LCBub3QgbWlwc19pc2EuCi0KLUZyaSBPY3QgMjEgMjA6NDI6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZiBPQkpfRUxGLCBoYW5kbGUgLnNlY3Rpb24uCi0JKHNfZWxmX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IERvbid0IGFib3J0IGlmIHdlIGRvbid0IHJlY29nbml6ZQotCXRoZSBzZWN0aW9uIHdoZW4gc2V0dGluZyB0aGUgc3RvcmFnZSBjbGFzczsgZGVmYXVsdCB0byBzY19EYXRhLgotCi1UaHUgT2N0IDIwIDAwOjQzOjM4IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBTZXQgbmV3X3ZhbCB0byA4IGZvciBhbGwKLQlmaXh1cHMgdG8gYnJhbmNoIGluc3RydWN0aW9ucyAobm90IGp1c3QgcGMtcmVsYXRpdmUgb25lcykgd2hpY2gKLQl3aWxsIGdlbmVyYXRlIFNPTSByZWxvY2F0aW9ucy4KLQotV2VkIE9jdCAxOSAxMzo0MTo1NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IEluY2x1ZGUgY3R5cGUuaCB3aXRoIGFuZ2xlIGJyYWNrZXRzLgotCShkZWZpbmVfc29tZV9yZWdzKTogQWRkIG5ldyBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzIGRlZmluZWQgb24gdGhlCi0JMjkwNDAuCi0JKHBhcnNlX29wZXJhbmQpOiBBZGQgYXJndW1lbnQgb3B0LiAgSWYgbm9uLXplcm8sIGRvbid0IHdhcm4gYWJvdXQKLQlhIG1pc3Npbmcgb3BlcmFuZC4KLQkobWFjaGluZV9pcCk6IElmIGhhbmRsaW5nIGFyZ3VtZW50IHR5cGUgJ0knLCBwYXNzIG9wdCBhcyBub24temVybwotCXRvIHBhcnNlX29wZXJhbmQuICBIYW5kbGUgbmV3IG9wdGlvbmFsIG9wZXJhbmQgdHlwZSAnSScuCi0JKG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBIYW5kbGUgc3BlY2lhbCByZWdpc3RlciBuYW1lcyAoc3JOTikuCi0KLVR1ZSBPY3QgMTggMDA6NDU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChyZW51bWJlcl9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgQkZEX0FTU0VNQkxFUiBmdW5jdGlvbi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIGl0IGFmdGVyIHJlbW92aW5nIGdhcyBjcmVhdGVkIHNlY3Rpb25zLgotCi1Nb24gT2N0IDE3IDE4OjA2OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfY3JlYXRlKTogVXNlIHVkYXRhLnAsIG5vdCBqdXN0IHVkYXRhLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2Vjb2ZmX3NldF9leHQpOiBMaWtld2lzZS4KLQkoZWxmX2dldF9leHRyKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogVGhlIHNlY29uZCBhcmd1bWVudCB0byBhc193aGVyZSBpcwotCXVuc2lnbmVkIGludCAqLCBub3QgaW50ICouCi0KLU1vbiBPY3QgMTcgMDI6MjY6MzIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IEVsaW1pbmF0ZSBhbGwgdXNlcyBvZiBmeF9hZGRudW1iZXIuCi0JKHRjX2dlbl9yZWxvYyk6IFNpbXBsaWZ5LiAgSXQncyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHNldCBhCi0JcmVsb2MncyBhZGRlbmQgZmllbGQgdG8gemVybyBmb3IgZnVuY3Rpb24gc3ltYm9scy4KLQkobWRfYXBwbHlfZml4KTogU2ltcGxpZnkuICBGb3IgZml4dXBzIHdoaWNoIHdpbGwgcmVxdWlyZSBhIFNPTQotCXJlbG9jLCBqdXN0IGNsZWFyIG91dCB0aGUgbmVjZXNzYXJ5IGJpdHMgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1GcmkgT2N0IDE0IDE5OjA2OjQ2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IFVzZSBiaXNvbiAteSwgbm90IGJpc29uLgotCi1UaHUgT2N0IDEzIDE5OjIyOjU0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byAyLjUuCi0JKGNsZWFuLWhlcmUpOiBEZWxldGUgc3RhbXAtbWsuY29tLgotCShkaXN0Y2xlYW4pOiBEZWxldGUgLmdkYmluaXQuCi0JKiBWZXJzaW9uIDIuNSByZWxlYXNlZC4KLQotV2VkIE9jdCAxMiAyMDozMDo1MSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGUtbmJzZDUzMi5oOiBSZW5hbWVkIGZyb20gdGUtbmV0YnNkNTMyLmguCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogQWRqdXN0ZWQuCi0KLVdlZCBPY3QgMTIgMTY6MzM6MzggMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvY3BsdXMtZGVtLmM6IFJlbW92ZWQuICBJdCBpc24ndCB1c2VkLiAgRXZlbiBpZiBpdCB3YXMsCi0JICBpdCdzIGJldHRlciB0byB1c2UgdGhlIG9uZSBpbiBsaWJpYmVydHkuCi0KLVdlZCBPY3QgMTIgMTg6NDg6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSwgY2FzZSBPX3N5bWJvbCk6IFVuZG8gbGFzdAotCWNoYW5nZTsgaXQgYnJlYWtzIHRoZSByczYwMDAgc3VwcG9ydCwgYW5kIGRvZXNuJ3Qgc2VlbSB0byBiZQotCW5lZWRlZC4KLQotV2VkIE9jdCAxMiAxMTo1Njo1MCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmgsdGUtbmV0YnNkNTMyLmggKFRBUkdFVF9GT1JNQVQpOiBDaGFuZ2VkIHRvCi0JICBhLm91dC08YXJjaD4tbmV0YnNkIHRvIG1hdGNoIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBpbiBCRkQuCi0KLVdlZCBPY3QgMTIgMTE6MDY6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IFJlc29sdmUgc3ltYm9sIHZhbHVlcwotCXJhdGhlciB0aGFuIGV4cGxpY2l0bHkgYWRkaW5nIHRoZSBmcmFnIGFkZHJlc3MuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IEFkZCBhIHplcm8gZW50cnkgdG8gbWFyawotCXRoZSBlbmQgb2YgdGhlIGxpbmUgbnVtYmVyczsgdGhpcyByZXBsYWNlcyB0aGUgemVybyBlbnRyeSB3aGljaAotCXVzZWQgdG8gYmUgYWRkZWQgYnkgY29mZl9hZGRfbGluZXN5bSwgcmVtb3ZlZCBPY3QgNy4KLQkoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zKTogSWdub3JlIHNlY3Rpb25zIHdpdGggbm8gc2VnaW5mby4KLQotV2VkIE9jdCAxMiAwMTo0MTozNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogQ3JlYXRlIGEKLQkic3RhZ2UiIHN5bWxpbmsgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YWdlKiBkaXJlY3RvcnksIGFuZCB1c2UgaXQKLQlpbnN0ZWFkIGluIHRoZSAtQiBvcHRpb25zLgotCShjb21wYXJpc29uKTogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQotVHVlIE9jdCAxMSAxNjo0ODoxMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogRm9yIG5vbi1hLm91dCByZWxvY2F0aW9ucywgaWYKLQlwYy1yZWxhdGl2ZSwgdXNlIGZ4X29mZnNldCBvbmx5LCBpZ25vcmUgYWRkcmVzcyBvZiByZWxvY2F0aW9uLgotCi1UdWUgT2N0IDExIDE1OjI0OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHVzZSBTX0lTX0xPQ0FMIHdoZW4gY2hlY2tpbmcKLQlmb3IgYW4gZW1iZWRkZWQgUElDIHN3aXRjaCBleHByZXNzaW9uLCBzaW5jZSB0aGUgZGVmaW5pdGlvbiBvZgotCVNfSVNfTE9DQUwgd2FzIGNoYW5nZWQuCi0KLVR1ZSBPY3QgMTEgMTU6MDU6MTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjb21wYXJpc29uKTogV2hlbiBjb21wYXJpbmcgYXMubmV3IG9yIGdhc3AubmV3LCB0cnkKLQlydW5uaW5nIHRoZSBiaW5hcnkgdGhyb3VnaCBzZWQgdG8gYXZvaWQgZGlmZmVyZW5jZXMgZHVlIHRvCi0JInN0YWdlMSIgb3IgInN0YWdlMiIgaGF2aW5nIGJlZW4gd3JpdHRlbiBpbnRvIHRoZSBiaW5hcnkuCi0KLVNhdCBPY3QgIDggMDE6NDg6MDQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQlFTEYgc3ltYm9sIHNpemUgaGFuZGxpbmcsIGJhc2VkIG9uIGNvZGUgZnJvbSBFcmljIFlvdW5nZGFsZToKLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogTmV3IG1hY3JvLiAgQWRkcyBhbgotCWV4cHJlc3Npb24gcG9pbnRlciB0byB0aGUgc3ltYm9sIHN0cnVjdHVyZSwgdXNlZCBmb3IgYHNpemUnCi0JZXhwcmVzc2lvbnMgdGhhdCBjb3VsZG4ndCBiZSByZWR1Y2VkIHRvIGNvbnN0YW50cyB3aGVuIGluaXRpYWxseQotCXByb2Nlc3NlZC4KLQkoZWxmX2Zyb2Jfc3ltYm9sKTogRGVjbGFyZS4KLQkob2JqX2Zyb2Jfc3ltYm9sKTogQ2FsbCBlbGZfZnJvYl9zeW1ib2wgYWx3YXlzLCByYXRoZXIgdGhhbgotCWVjb2ZmX2Zyb2Jfc3ltYm9sIG9ubHkgaWYgRUNPRkZfREVCVUdHSU5HIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogRGVsZXRlZCB1bnVzZWQgY29kZS4KLQlDbGVhciBzeV9vYmogZmllbGQuCi0JKG9ial9lbGZfc2l6ZSk6IERlbGV0ZWQgdW51c2VkIGNvZGUuICBJZiBzaXplIGlzIG5vbi1yZWR1Y2libGUKLQlleHByZXNzaW9uLCBhbGxvY2F0ZSBzb21lIHN0b3JhZ2UgZm9yIHRoZSBzeV9vYmogZmllbGQgYW5kIGNvcHkKLQl0aGUgZXhwcmVzc2lvbi4KLQkoZWxmX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLiAgQ29tcHV0ZXMgc2l6ZXMsIGNhbGxzCi0JZWNvZmZfZnJvYl9zeW1ib2wgaWYgYXBwcm9wcmlhdGUuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBGb3IgaTM4NiBlbGYgYW5kIGNvZmYgKGZvciBub3cpLCBkb24ndAotCWFkZCBpbiB2YWx1ZSBvZiBzeW1ib2wgZnJvbSBhbm90aGVyIGRlZmluZWQgc2VjdGlvbiBvZiB0aGUgZmlsZS4KLQotRnJpIE9jdCAgNyAxNzo1NDowMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTg4ay5oIChUQ19LRUVQX0ZYX09GRlNFVCk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogVGVzdCBvbmx5IFRDX0tFRVBfRlhfT0ZGU0VULAotCXJhdGhlciB0aGFuIGJvdGggaXQgYW5kIFRDX004OEsuCi0JKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9mcm9iX3NlY3Rpb24pOiBGb3Igbm9uLWVtcHR5IHNlY3Rpb25zLCBjcmVhdGUgYXV4IGVudHJ5IGZvcgotCXRoZSBzZWN0aW9uIHN5bWJvbCwgaW5kaWNhdGluZyB0aGUgc2l6ZS4KLQkobl9saW5lX25vcyk6IE5ldyB2YXJpYWJsZS4KLQkoYWRkX2xpbmVubyk6IEluY3JlbWVudCBpdC4KLQkoY29mZl9hZGRfbGluZXN5bSk6IEluY3JlbWVudCBuX2xpbmVfbm9zLCBkb24ndCBjYWxsIGFkZF9saW5lbm8uCi0JKGNvZmZfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uOyBtYXAgY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zIG92ZXIKLQlzZWN0aW9ucy4KLQkob2JqX2NvZmZfbGluZSk6IE9ubHkgcmVzZXQgbGluZV9iYXNlIGZvciAuYmYgc3ltYm9scy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMsIGNvZmZfZnJvYl9maWxlKToKLQlEZWNsYXJlLgotCShvYmpfZnJvYl9maWxlKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBSZW5hbWVkIGZyb20KLQlvYmpfZnJvYl9mb3J3YXJkX3N5bWJvbCwgYW5kIHJld3JpdHRlbiBmb3IgbmV3IHBhcmFtZXRlciBsaXN0LgotCi0JTW9uIE9jdCAgMyAyMTowMjozOCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAoU19JU19MT0NBTCk6IGZpeCBvYnNvbGV0ZSBmbGFnc2VlbltdIHJlZmVyZW5jZS4KLQotV2VkIE9jdCAgNSAxMTo0OToyNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3BzZXVkb190YWJsZSk6IEFjY2VwdCAuZXNpemUgYW5kIC5ldHlwZQotCWFzIHN5bm9ueW1zIGZvciAuc2l6ZSBhbmQgLnR5cGUuCi0KLVdlZCBPY3QgIDUgMDA6MDg6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3NlY3Rpb24pOiBSZW1vdmUgYXNzZXJ0IGFib3V0Ci0Jc2VjdGlvbiBhbGlnbm1lbnQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2VjdGlvbl9hbGlnbik6IFVzZSBzZWN0aW9uIGFsaWdubWVudCwgbm90Ci0JeHZlYyBhbGlnbl9wb3dlcl9taW4gZmllbGQuCi0KLUZyaSBTZXAgMzAgMTk6MDU6MjAgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHZtc2NvbmYuc2ggKG1ha2UtZ2FzLmNvbSk6IGhhbmRsZSBEQ0wgdmVyaWZpY2F0aW9uIHRvIGVuYWJsZQotCXNlbnNpYmxlIGZlZWRiYWNrIHRvIHRoZSB1c2VyIHdoaWxlIGdhcyBpcyBiZWluZyBidWlsdC4KLQotRnJpIFNlcCAzMCAxNjoyMzozMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogTmV3IHZhcmlhYmxlLCBsaXN0aW5nIG9ubHkgbWFrZS1nYXMuY29tCi0JZm9yIG5vdy4KLQkoZGlzdHN0dWZmKTogTmV3IHRhcmdldDsgYnVpbGRzIERJU1RTVFVGRi4KLQkocmVhbGNsZWFuKTogU2VwYXJhdGUgdGFyZ2V0LCBkZXBlbmQgb24gY2xlYW4gYW5kIGRpc3RjbGVhbiwgdGhlbgotCWRlbGV0ZSBESVNUU1RVRkYuCi0JKiBtYWtlLWdhcy5jb206IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfdmFsaWRhdGVfZml4KSBbQkZEX0FTU0VNQkxFUl06IE5ldwotCWZ1bmN0aW9uLiAgQ29udmVydHMgcmVsb2MgZm9yICJmb28tR09UIiB0byBCRkRfUkVMT0NfMzg2X0dPVE9GRgotCXJlbG9jIGZvciAiZm9vIi4KLQkoaTM4Nl9vcGVyYW5kKTogRG9uJ3QgbG9vayB1cCBzZWN0aW9uIHN5bWJvbCBmb3IKLQl1bmRlZmluZWRfc2VjdGlvbi4KLQkocmVsb2MpOiBBbHdheXMgcGVybWl0IHJldHVybiBvZiA4LSBhbmQgMTYtYml0IHJlbG9jYXRpb24gdHlwZXMuCi0JQWRkIGEgc3BhY2UgYWZ0ZXIgInBjLXJlbGF0aXZlIiBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSkgW0JGRF9BU1NFTUJMRVJdOiBSZWplY3QKLQlCRkRfUkVMT0NfMzg2X0dPVE9GRiByZWxvY3MuCi0JKGkzODZfb3BlcmFuZCk6IEZvciBhbnkgR09UT0ZGIHJlbG9jLCBjb252ZXJ0IGl0IHRvIGEgQkZEX1JFTE9DXzMyCi0Jd2l0aCBhICJmb28tR09UIiB2YWx1ZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGkzODZfdmFsaWRhdGVfZml4KTogRGVjbGFyZSBpdC4KLQkoVENfVkFMSURBVEVfRklYKTogTmV3IG1hY3JvIC0tIGNhbGwgaXQuCi0JKE5PUF9PUENPREUpOiBDYXN0IHRvIGBjaGFyJyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQotCSogYXMuaDogSWYgX19TVERDX18gaXMgbm90IGRlZmluZWQgYW5kIHZhcmFyZ3MuaCBpcyBhdmFpbGFibGUsIHVzZQotCWl0IHJhdGhlciB0aGFuIHN0ZGFyZy5oLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkZWQgbmV3IGJpdGZpZWxkIGZ4X3BsdCwgZm9yIGZpeHVwcwotCXJlZmVycmluZyB0byBQTFQgZW50cmllcy4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIGZ4X3BsdCB0byB6ZXJvLgotCShhZGp1c3RfcmVsb2Nfc3ltcyk6IFJlLWZldGNoIGBzeW0nIGFmdGVyIHRvcCBvZiByZWR1Y3Rpb24gbG9vcC4KLQlEb24ndCBhZGp1c3QgZnhfb2Zmc2V0IGJ5IGZyYWcgYWRkcmVzcywgc2luY2UgU19HRVRfVkFMVUUgbm93Ci0JaW5jbHVkZXMgdGhlIGZyYWcgYWRkcmVzcy4KLQkoZml4dXBfc2VnbWVudCk6IENoYW5nZWQgbG9jYWwgdmFyIFBDUkVMIHRvIHR5cGUgaW50LCBhZGRlZCBQTFQuCi0JSWYgUEMtcmVsYXRpdmUgZml4dXAgcmVmZXJzIHRvIGEgUExUIGVudHJ5IGZvciBhIHN5bWJvbCBpbiB0aGUKLQljdXJyZW50IHNlY3Rpb24sIGRvbid0IHJlZHVjZSBpdC4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiAgRXhpdCBsb29wIHRocm91Z2ggYSBsYWJlbC4gIElmCi0JREVCVUc1IGlzIGRlZmluZWQsIHByaW50IG91dCBlYWNoIGZpeHVwIGJlZm9yZSBhbmQgYWZ0ZXIKLQlwcm9jZXNzaW5nLgotCShmaXh1cF9zZWdtZW50KTogSWYgREVCVUc1IGlzIGRlZmluZWQsIHByaW50IG91dCBlYWNoIGZpeHVwIGJlZm9yZQotCWFuZCBhZnRlciBwcm9jZXNzaW5nLgotCShwcmludF9maXh1cCk6IEFkZGVkIHByb3RvdHlwZS4gIFNob3cgYWRkcmVzcyBvbiBmaXJzdCBsaW5lLiAgU2hvdwotCWZ4X29mZnNldCBhbmQgZnhfc3Vic3kuICBbIUJGRF9BU1NFTUJMRVJdOiBPbmx5IHNob3cgZnhfcl90eXBlIGlmCi0JTkVFRF9GWF9SX1RZUEUgaXMgZGVmaW5lZC4KLQotCSogc3ltYm9scy5jIChwcmludF9zeW1ib2xfdmFsdWVfMSk6IENoZWNrIFNfSVNfTE9DQUwsIFNfSVNfRVhURVJOLAotCVNfSVNfREVCVUcsIFNfSVNfREVGSU5FRCBhbHNvLgotCi1UaHUgU2VwIDI5IDE4OjU3OjA2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBEZXBlbmQgb24gLmdkYmluaXQuCi0JKC5nZGJpbml0KTogUmVidWlsZCBmcm9tIGdkYmluaXQuaW4gYnkgcnVubmluZyBjb25maWcuc3RhdHVzLgotCi0JKiBnZGJpbml0LmluOiBEZWZpbmUgbmV3IGZ1bmN0aW9uICJwZiIuICBGaXggZG9jIG9uICJwZSIgYW5kICJwcyIuCi0KLQkqIHdyaXRlLmMgKHByaW50X2ZpeHVwKTogUHJpbnQgc291cmNlIGxvY2F0aW9uIG9uIGZpcnN0IGxpbmUuCi0JU2hvdyBmeF9yX3R5cGUgYW5kIGZ4X2FkZHN5IGZpZWxkcy4KLQotV2VkIFNlcCAyOCAxNDo1NjozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBiZmRfZ2FzIGZvciBhbGwgc3BhcmMgdGFyZ2V0cyBpbiBvbmUgcGxhY2UsCi0JaW5zdGVhZCBvZiBzZXBhcmF0ZWx5IGZvciBlYWNoLiAgQ29ycmVjdGx5IGhhbmRsZSB1c2VyLXN1cHBsaWVkCi0JIi0tZW5hYmxlLWJmZC1nYXMiIG9wdGlvbi4KLQotCSogZ2RiaW5pdC5pbjogTW92ZSAiYnJlYWsgYWJvcnQiIHRvIGVuZCwgaW4gY2FzZSBnZGIgY29tcGxhaW5zLgotCi0JKiBhcy5oIChQUklOVEZfV0hFUkVfTElLRSwgUFJJTlRfTElLRSkgW1VTRV9TVERBUkcsICFfX0dOVUNfX106Ci0JVXNlIFBBUkFNUyBtYWNyby4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSwgY2FzZSBPX3N5bWJvbCk6IERvbid0IGRvIGFueQotCXByb2Nlc3NpbmcgaWYgYWRkX3N5bWJvbCBpcyB1bmRlZmluZWQgb3IgaW4gZXhwcl9zZWN0aW9uLgotCShyZXNvbHZlX3N5bWJvbF92YWx1ZSwgY2FzZSBPX2FkZCk6IEZvciBzeW1ib2wgcGx1cwotCWNvbnN0YW50LXZhbHVlZCBzeW1ib2wsIGNvbnZlcnQgdG8gT19zeW1ib2wgYW5kIHJlLXJlZHVjZS4KLQkoU19HRVRfVkFMVUUpOiBJZiBzeW1ib2wgbmVlZHMgcmVzb2x2aW5nLCByZXNvbHZlIGl0LgotCShpbmRlbnRfbGV2ZWwpOiBObyBsb25nZXIgc3RhdGljLgotCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IERvbid0IHByaW50IGZyYWcgYWRkcmVzcyBpZiBpdCBtYXRjaGVzCi0JemVyb19hZGRyZXNzX2ZyYWcuICBEb24ndCBwcmludCAicmVzb2x2aW5nIiBpZiBhbHJlYWR5IHJlc29sdmVkLgotCVByaW50IHNlZ21lbnQgbmFtZS4gIERvbid0IGNhbGwgcHJpbnRfZXhwcl8xIG9uIGFuIHVuZGVmaW5lZAotCXN5bWJvbC4KLQkocHJpbnRfZXhwcl8xKTogRml4IHdoaXRlc3BhY2UgYmVmb3JlIHByaW50aW5nIFhfYWRkX251bWJlci4KLQotCSogZXhwci5jIChtYWtlX2V4cHJfc3ltYm9sKTogTm8gbG9uZ2VyIHN0YXRpYy4gIFVzZSBzeW1ib2xfY3JlYXRlLAotCW5vdCBzeW1ib2xfbmV3LCBmb3Igc3ltYm9scyBob2xkaW5nIGV4cHJlc3Npb24gdmFsdWVzLgotCSogZXhwci5oIChtYWtlX2V4cHJfc3ltYm9sKTogTW92ZSBkZWNsYXJhdGlvbiBoZXJlLgotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBIYW5kbGUgT19hZGQgYnkgY3JlYXRpbmcgYW4KLQlleHByZXNzaW9uLXZhbHVlZCBzeW1ib2wsIGFuZCBjYWxsaW5nIGZpeF9uZXdfZXhwIHJlY3Vyc2l2ZWx5LgotCShhZGp1c3RfcmVsb2Nfc3ltcyk6IElmIGEgZml4dXAncyBzeW1ib2wgdmFsdWUgaXMgYSBzdW0gb2YgYW4KLQl1bmRlZmluZWQgc3ltYm9sIGFuZCBhIGNvbnN0YW50LCBmb2xkIHRoZSBjb25zdGFudCBpbnRvIHRoZSBmaXh1cCwKLQlhbmQgcmVmZXIgdG8gdGhlIHVuZGVmaW5lZCBzeW1ib2wgZGlyZWN0bHkuICBUaGVuIHByb2Nlc3MgdGhlCi0JZml4dXAgYWdhaW4gZnJvbSBzY3JhdGNoLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IEJlZm9yZSBjYWxsaW5nIGFkanVzdF9yZWxvY19zeW1zLCBtYWtlIGEgcGFzcwotCXRocm91Z2ggdGhlIHN5bWJvbCBsaXN0IHRyeWluZyB0byByZXNvbHZlIHZhbHVlcy4KLQotCSogd3JpdGUuYyAocHJpbnRfZml4dXApOiBOZXcgcm91dGluZSwgZm9yIGRlYnVnZ2luZy4KLQkod3JpdGVfcmVsb2NzKTogQ2FsbCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgRGVsZXRlZCB2YXJpb3VzCi0JaGFja3MgZm9yIHdvcmtpbmcgYXJvdW5kIHByb2JsZW1zIHdpdGggYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGUgdG8gMi40LjkwLgotCi1XZWQgU2VwIDI4IDExOjUwOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdhc3Aubyk6IERlcGVuZHMgdXBvbiBjb25maWcuaC4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKG1kX2FwcGx5X2ZpeCk6IElmIGFuIHVuY29uZGl0aW9uYWwgYiBvciBiYWwgb3ZlcmZsb3dzLCBhbmQgd2UgYXJlCi0Jbm90IGFzc2VtYmxpbmcgUElDIGNvZGUsIHJlcGxhY2UgaXQgd2l0aCBhIGogb3IgamFsLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBDb3JyZWN0IGJyYW5jaCBvdmVyZmxvdyB0ZXN0LgotCVVzZSBhc19iYWRfd2hlcmUgYW5kIGFzX3dhcm5fd2hlcmUgcmF0aGVyIHRoYW4gYXNfYmFkIGFuZCBhc193YXJuLgotCi1Nb24gU2VwIDI2IDE3OjE1OjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogQWRkIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgdG8KLQlhc19mYXRhbCBjYWxscy4gIEhhbmRsZSBiZmRfcmVsb2Nfb3ZlcmZsb3cgY2FzZSBzcGVjaWZpY2FsbHkgd2hlbgotCVJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRS4KLQotRnJpIFNlcCAyMyAxNjoxMToyOCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5oIChVU0VfU1REQVJHLCBVU0VfVkFSQVJHUyk6IERlZmluZSBvbmUgb3IgbmVpdGhlciBvZiB0aGVzZQotCWhlcmUuICBVc2UgdGhlbSBmb3IgZGVjaWRpbmcgd2hpY2ggUFJJTlRGKkxJS0UgbWFjcm8gZGVmaW5pdGlvbnMKLQl0byB1c2UuCi0JKiBtZXNzYWdlcy5jOiBVc2UgdGhlbSwgaW5zdGVhZCBvZiBOT19TVERBUkcsIE5PX1ZBUkFSR1MuCi0JWyFVU0VfU1REQVJHICYmICFVU0VfVkFSQVJHU10gKHZhX2FsaXN0LCB2YV9kY2wsIC4uLik6IFByb3ZpZGUKLQlkZWZhdWx0IGRlZmluaXRpb25zIG1hdGNoaW5nIHdoYXQgd2Ugd2VyZSBkb2luZyBiZWZvcmUuCi0JKGFzX3Rza3Rzayk6IFJlbW92ZSB0aGUgbm9uLXN0ZGFyZywgbm9uLXZhcmFyZ3MgdmVyc2lvbiwgYW5kCi0JYWx3YXlzIHVzZSB0aGUgdmFyYXJncyBmb3JtIGlmIG5vdCB1c2luZyBzdGRhcmcuICBJdCdzIHNhZmUgdG8KLQlhbHdheXMgdXNlIHZmcHJpbnRmLCBiZWNhdXNlIGxpYmliZXJ0eSB3aWxsIHByb3ZpZGUgaXQgaWYgdGhlCi0JbmF0aXZlIHN5c3RlbSBkb2Vzbid0LiAgQWxzbywgYWx3YXlzIG1ha2UgZm9ybWF0IGJlIGNvbnN0LgotCShhc193YXJuLCBhc193YXJuX3doZXJlLCBhc19iYWQsIGFzX2JhZF93aGVyZSwgYXNfZmF0YWwpOiBEaXR0by4KLQotRnJpIFNlcCAyMyAxNDo0MjozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBBbHdheXMgdXNlIGFkZGl1IHdoZW4gYWRkaW5nIGEKLQljb25zdGFudCB0byAkemVyby0tbm8gbmVlZCB0byB1c2UgZGFkZGl1LgotCShtYWNybyk6IEhhY2sgdGhlIC1taXBzMyBvdmVyZmxvdyB0ZXN0cyB0byBub3QgZmFpbCB3aGVuIG9mZnNldFQKLQlpcyBvbmx5IDMyIGJpdHMuCi0KLQkqIHN5bWJvbHMuaCAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IERlY2xhcmUuCi0KLVRodSBTZXAgMjIgMjE6NTg6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jOiBCdWdmaXhlcyBiYXNlZCBpbiBwYXJ0IG9uIHBhdGNoZXMgZnJvbSBQYXVsCi0JS3JhbmVuYnVyZy4KLQkobGlzdGluZ19uZXdsaW5lKTogQ2hlY2sgZmlsZW5hbWUgYXMgd2VsbCBhcyBsaW5lIG51bWJlciB3aGVuCi0JZGVjaWRpbmcgd2hldGhlciB0byByZWNvcmQgaXQuCi0JKGxpc3Rfc3ltYm9sX3RhYmxlKSBbU19JU19SRUdJU1RFUl06IENoZWNrIHRoYXQgU19JU19SRUdJU1RFUiBpcwotCWZhbHNlIChpZiBkZWZpbmVkKSBhcyB3ZWxsIGFzIGNoZWNraW5nIGZvciByZWdfc2VjdGlvbi4KLQkobGlzdGluZ19saXN0aW5nKTogSXRlcmF0ZSBmZXRjaGluZyBsaW5lcyB3aGlsZSBsaW5lIG51bWJlciBpcyB0b28KLQlsb3csIGFuZCB3ZSBoYXZlbid0IHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4KLQotCSogY29uZmlnL3Ztcy1jb25mLmg6IENoYW5nZWQgSEFWRV9ERUxFVEUgdG8gSEFWRV9SRU1PVkUuCi0KLVRodSBTZXAgMjIgMTM6Mzk6MTAgMTk5NCAgS3VuZyBIc3UgIChrdW5nQHgxLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBjaGVjayBpZgotCWN1cnJlbnRfc3RhYnNfZmlsZW5hbWUgaXMgTlVMTCBiZWZvcmUgc3RyY21wLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBmaXggYSBidWcgaW4gZ2VuZXJhdGVfYXNtX2xpbmVubwotCWNoZWNraW5nLgotCi1XZWQgU2VwIDIxIDE4OjE3OjM1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9oby0qLmg6IE5vdy11bnVzZWQgZmlsZXMgZGVsZXRlZC4KLQotCSogc3ltYm9scy5jIChjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKTogTmV3IGZ1bmN0aW9uLiAgQ29waWVzIEJGRAotCXN5bWJvbCBmbGFncyBhbmQgY2FsbHMgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fc3ltYm9sKTogQ2FsbCBpdCwgaWYgWF9hZGRfbnVtYmVyIGlzCi0JemVyby4gIERvbid0IGNhbGwgb2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wuCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBDYWxsIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsIGJ1dCBvbmx5IGlmCi0JWF9hZGRfbnVtYmVyIGlzIHplcm8uCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZnJvYl9mb3J3YXJkX3N5bWJvbCk6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IExvdHMgb2Ygd2hpdGVzcGFjZSwgY29tbWVudCByZWZvcm1hdHRpbmcsCi0JdXNpbmcgR05VIGluZGVudC4KLQkoc3RyY2hyKTogRG9uJ3QgZGVjbGFyZS4KLQlbQkZEX0FTU0VNQkxFUl06IERvbid0IGNvbXBpbGUgbWRfY29udmVydF9mcmFnLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9yaV90b19jaGFycywKLQltZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcC4KLQkoYnJ0YWJfZW1pdCk6IFVzZSBkYXRhX3NlY3Rpb24sIG5vdCBTRUdfREFUQS4KLQotCU1vbiBTZXAgMTkgMTc6MTQ6NDQgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBuZXcgZmlsZSwgbWFudWFsbHkgZGVyaXZlZCBmcm9tIGNvbmYuaW4uCi0JKiBjb25maWctZ2FzLmNvbTogdXNlIGl0LCBhbmQgZWxpbWluYXRlIG9ic29sZXRlICJob3N0LmgiLgotCi1XZWQgU2VwIDIxIDExOjExOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfY3VycmVudF9ibG9jayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHBwY19zdGFieCk6IFNldCBzeV90Yy53aXRoaW4gb2YgYSBDX1NUU1lNIHN5bWJvbCB0bwotCXBwY19jdXJyZW50X2Jsb2NrLiAgRG9uJ3QgbW92ZSBhcm91bmQgYW55IHN0YWIgc3ltYm9sLCBqdXN0IHRob3NlCi0JZm9yIGNvbW1vbiBzeW1ib2xzLgotCShwcGNfYnMpOiBTZXQgcHBjX2N1cnJlbnRfYmxvY2suCi0JKHBwY19lcyk6IENsZWFyIHBwY19jdXJyZW50X2Jsb2NrLgotCShwcGNfZnJvYl9zeW1ib2wpOiBTZXQgdGhlIHZhbHVlIG9mIGEgQ19TVFNZTSBzeW1ib2wgdG8gdGhlIG9mZnNldAotCWZyb20gdGhlIGNzZWN0IG9mIHRoZSBlbmNsb3NpbmcgYmxvY2suCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25zX3NpbmNlX2NhY2hlX2FjY2Vzcyk6IFJlbW92ZS4KLQkoYXBwZW5kX2luc24pOiBSZW1vdmUgc2V0dGluZyBvZiBpbnNuc19zaW5jZV9jYWNoZV9hY2Nlc3MsIGFuZAotCXNwZWNpYWwgNDYwMCBoYW5kbGluZzsgaXQgdHVybnMgb3V0IG5vdCB0byBiZSByZXF1aXJlZC4KLQotVHVlIFNlcCAyMCAxNjoxMzoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3Nob3J0b3B0cyk6IFJlbW92ZSBFLgotCShtZF9sb25nb3B0cyk6IEFkZCBFQiBhbmQgRUwuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtRUIgYW5kIC1FTCBhcyBzZXBhcmF0ZSBvcHRpb25zLCByYXRoZXIKLQl0aGFuIGFzIGEgc2luZ2xlIC1FIG9wdGlvbiB3aXRoIGFuIGFyZ3VtZW50LgotCi1Nb24gU2VwIDE5IDEyOjQyOjA1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogUmVqZWN0IHJlZHVjdGlvbnMKLQlpbnZvbHZpbmcgZ2xvYmFsIHN5bWJvbHMgdG9vLgotCi1Nb24gU2VwIDE5IDEyOjEyOjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IFRlc3QgTkVFRF9ERUNMQVJBVElPTl8qLCBub3QgTkVFRF8qX0RFQ0xBUkFUSU9OLgotCi0JKiBjb25maWd1cmUuaW46IFRlc3QgZm9yIHJlbW92ZSwgbm90IGRlbGV0ZS4gIEZpeCBjcm9zcy1hc3NlbWJsZXIKLQl0ZXN0LgotCSogYXMuaDogVGVzdCBIQVZFX1JFTU9WRSwgbm90IEhBVkVfREVMRVRFOyBkZWZpbmUgdW5saW5rIHRvCi0JcmVtb3ZlLCBub3QgZGVsZXRlLgotCi0JKiByZWFkLmMgKHBzZXVkb19zZXQsIGNhc2UgT19zeW1ib2wpOiBJZgotCU9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTIGlzIGRlZmluZWQsIGludm9rZSBpdC4KLQlbQkZEX0FTU0VNQkxFUl06IENvcHkgQlNGX0ZVTkNUSU9OIHNldHRpbmcgdG9vLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBEZWZpbmUuCi0KLQlXZWQgQXVnIDEwIDE5OjE1OjMwIDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChEU0dfU19DX1VCSVRVLCBEU1RfS19WRkxBR1NfRFNDLCBEU1RfS19UU19BVE9NLAotCW1hbnkgb3RoZXJzKTogbmV3IG1hY3JvczsgdmFsdWVzIG9idGFpbmVkIGZyb20gIkRTVFJFQ1JEUy5TREwiLgotCSogY29uZmlnL29iai12bXMuaCAodmFyaW91cyk6IHVzZSB0aGVtLgotCShVU0VfQklUU1RSSU5HX0RFU0NSSVBUT1IpOiBuZXcgbWFjcm8sIGZvciBzZWxlY3RpbmcgYml0ZmllbGQKLQlyZXByZXNlbnRhdGlvbiAob25seSBlbnVtIGJpdGZpZWxkcyBjYW4gYXZvaWQgYmVpbmcgYml0c3RyaW5ncykuCi0JKGJpdGZpZWxkX3N1ZmZpeCwgc2V0dXBfYmFzaWNfdHlwZSk6IG5ldyByb3V0aW5lcy4KLQkoVk1TX3R5cGVkZWZfcGFyc2UpOiB1c2UgdGhlbS4gIE5vdyByZWNvZ25pemUgYml0ZmllbGRzIG9mIGFsbAotCWludGVncmFsIHR5cGVzLCBub3QganVzdCB0eXBlIGBpbnQnLiAgQ2F2ZWF0OiAgdGhlIHJlcHJlc2VudGF0aW9uCi0JdXNlZCBmb3IgYml0ZmllbGRzIHN0aWxsIGRvZXMgbm90IHdvcmsgZm9yIG9iamVjdHMgcGxhY2VkIGluCi0JcmVnaXN0ZXJzLCBhbmQgZ2NjJ3Mgb3B0aW1pemVyIHNvbWV0aW1lcyBwdXRzIHNtYWxsIHN0cnVjdHMgdGhlcmUuCi0KLQlUdWUgSnVuIDE0IDE3OjMxOjQ0IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiByZWFkLmMgKHNfdGV4dCkgWyNpZiBPQkpfVk1TXTogY2xlYXIgdGhlIElOX0RFRkFVTFRfU0VDVElPTgotCWJpdCBmcm9tIGNvbnN0X2ZsYWcuCi0JKiBjb25maWcvb2JqLXZtcy5oIChJTl9ERUZBVUxUX1NFQ1RJT04pOiBkZWZpbmUgdGhpcyBtYWNyby4KLQkodGNfZnJvYl9sYWJlbCk6IGRlZmluZSB0aGlzIHRvIGNhbGwgdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsLAotCWFuZCBkZWNsYXJlIHRoZSBsYXR0ZXIuCi0JKiBjb25maWcvb2JqLXZtcy5jICh2YXhfZ19kb3VibGVzKTogZGVjbGFyZSB0aGlzIGZpbGUtc2NvcGUKLQl2YXJpYWJsZS4KLQkoY29uc3RfZmxhZyk6IGluaXRpYWxpemUgdG8gSU5fREVGQVVMVF9TRUNUSU9OIGluc3RlYWQgb2YgMC4KLQkodm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsKTogbmV3IHJvdXRpbmUgKHRjX2Zyb2JfbGFiZWwpLgotCShWTVNfVEJUX1JvdXRpbmVfRW5kKTogZG9uJ3QgYm90aGVyIGNoZWNraW5nIGZvciBgZ2NjX2NvbXBpbGVkLicKLQlhbmQgYGdjYzJfY29tcGlsZWQuJyBsYWJlbHM7IHRoZXkgd29uJ3QgcmVhY2ggaGVyZSBhbnkgbW9yZS4KLQkoVk1TX3R5cGVkZWZfcGFyc2UpIFtjYXNlICdyJ106IGZvciB0eXBlcyBgZG91YmxlJyBhbmQgYGNvbXBsZXgKLQlkb3VibGUnLCB1c2UgYHZheF9nX2RvdWJsZXMnIGZsYWcgdG8gc2VsZWN0IHR5cGUgb2YgZG91YmxlLgotCShWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpIFt0cmFjZWJhY2sgc2V0dXBdOiBkb24ndCBwYXNzIHN5bWJvbHMKLQl3aXRoIHRoZSBJTl9ERUZBVUxUX1NFQ1RJT04gYXR0cmlidXRlIHRvIHRoZSBUQlRfUm91dGluZV9CZWdpbgotCWFuZCBUQlRfUm91dGluZV9FbmQgZnVuY3Rpb25zLgotCi0JTW9uIEp1biAgNiAyMDo1MjoyMCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1RCVF9Sb3V0aW5lX0VuZCk6IGNhY2hlIHRoZSByZXN1bHQgb2YKLQlTX0dFVF9WQUxVRSgpIHRvIGF2b2lkIG1hbnkgcmVwZWF0ZWQgZnVuY3Rpb24gY2FsbHMuCi0JKFZNU19DaGVja19Gb3JfTWFpbikgWyNpZiBIQUNLX0RFQ19DX1NUQVJUVVBdOiBjYXBpdGFsaXplCi0JX0MkTUFJTl9BUkdTIGluIGFkdmFuY2UsIGluIGNhc2UgLWgzIChsZWF2ZSBzeW1ib2wgbmFtZSBhcy1pcykKLQlnZXRzIHJlcXVlc3RlZC4gIFtBbGwgdGhlIEhBQ0tfREVDX0NfU1RBUlRVUCBjb2RlIGFwcGVhcnMgdG8KLQliZSBvYnNvbGV0ZTsgZ2NjIGRvZXMgaXQgYXV0b21hdGljYWxseSBmb3Igdm1zIHRhcmdldC4gIEl0J3MKLQlhbHNvIG1pc25hbWVkLCBiZWNhdXNlIGl0IGlzIGZvciB0aGUgIlZBWCBDIiBydW4tdGltZSBsaWJyYXJ5LAotCW5vdCB0aGUgbmV3ZXIgIkRFQyBDIiBvbmUgd2hpY2ggaGFzIG11Y2ggZGlmZmVyZW50IHN0YXJ0dXAgY29kZS5dCi0Je3ZhcmlvdXN9OiB1c2UgYFNfU0VUX3h4eChzeW1ib2wsbmV3X3ZhbHVlKScgcmF0aGVyIHRoYW4KLQlgU19HRVRfeHh4KHN5bWJvbCkgPSBuZXdfdmFsdWUnLgotCi1Nb24gU2VwIDE5IDEyOjA1OjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfZG90X2ZpbGVfc3ltYm9sKTogVXNlIGJmZF9hYnNfc2VjdGlvbl9wdHIsCi0Jbm90ICZiZmRfYWJzX3NlY3Rpb24uCi0KLVRodSBTZXAgMTUgMTg6MzY6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKGNsZWFuX3VwX2V4cHJlc3Npb24pOiBVc2UgYWRkcmVzc1QsIG5vdCBiZmRfdm1hLgotCi1UdWUgU2VwIDEzIDIwOjA1OjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBleHByLmMgKGV4cHIpOiBEb24ndCByZWR1Y2UgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlCi0Jc2FtZSBmcmFnIGlmIHRoZSBzeW1ib2xzIGFyZSBub3QgaW4gbm9ybWFsIHNlY3Rpb25zLgotCi0JKiBjb25maWcvb2JqLXNvbS5oIChTX1NFVF9PVEhFUiwgU19TRVRfVFlQRSk6IERlbGV0ZSBhLm91dCBjcnVkLgotCShTX1NFVF9ERVNDLCBTX0dFVF9PVEhFUiwgU19HRVRfVFlQRSwgU19HRVRfREVTQyk6IExpa2V3aXNlLgotCShvYmpfYXR0YWNoX3Vud2luZF9pbmZvKTogRG8gbm90IGRlZmluZS4gIE5vdCBuZWVkZWQgYW55bW9yZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IERlbGV0ZSB3aGl0ZXNwYWNlIGF0IEVPTC4KLQkoc3RydWN0IGhwcGFfZml4X3N0cnVjdCk6IERlbGV0ZSBmeF91bndpbmQgZmllbGQgYW5kIGFsbCByZWZlcmVuY2VzLgotCShmaXhfbmV3X2hwcGEpOiBMYXN0IGFyZyBpcyBub3cgYSBwb2ludGVyIHRvIGFuIGludC4gIERvIG5vdAotCWNhbGwgb2JqX2F0dGFjaF91bndpbmRfaW5mbyBhbnltb3JlLiAgRm9yIFNPTSBSX0VOVFJZIGFuZCBSX0VYSVQKLQlmaXh1cHMsIHN0b3JlIDMyYml0cyBvZiB1bndpbmQgaW5mb3JtYXRpb24gaW4gdGhlIGZ4X2FkZG51bWJlcgotCWZpZWxkIG9mIHRoZSBmaXh1cC4KLQkobWRfYXNzZW1ibGUsIHBhX2VudHJ5LCBwcm9jZXNzX2V4aXQsIHBhX3Byb2NlbmQpOiBGb3IgU09NIFJfRU5UUlkKLQlhbmQgUl9FWElUIGZpeHVwcywgcGFzcyBhIE5VTEwgcG9pbnRlciB0byBmaXhfbmV3X2hwcGEsIGFuZCBhCi0JcG9pbnRlciB0byAzMiBiaXRzIG9mIHVud2luZCBpbmZvLgotCSh0Y19nZW5fcmVsb2MpOiBGb3IgU09NIFJfRU5UUlkgYW5kIFJfRVhJVCBmaXh1cHMsIHNldCB0aGUgc3ltYm9sCi0JcG9pbnRlciB0byB0aGUgZHVtbXkgc3ltYm9sOyBzZXQgdGhlIGFkZGVuZCBmaWVsZCB0byBmeF9hZGRudW1iZXIuCi0JKHBhX2NvbW0sIHBhX2VxdSwgcGFfdHlwZV9hcmdzLCBwYV9pbXBvcnQpOiBVc2UgYmZkX1hYWF9zZWN0aW9uX3B0cgotCXJhdGhlciB0aGFuICZiZmRfWFhYX3NlY3Rpb24uCi0KLVR1ZSBTZXAgMTMgMjE6MTU6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4XzEpOiBGb3IgR09UUEMgcmVsb2NzLCBkZWNyZW1lbnQKLQl2YWx1ZSBieSBvbmU7IGRpc2NhcmQgYWRqdXN0bWVudHMgcHJldmlvdXNseSBiZWluZyBtYWRlLiAgRnJvbQotCUVyaWMgWW91bmdkYWxlLgotCi0JVk1TLSBhbmQgVmF4LXJlbGF0ZWQgY2hhbmdlcyBmcm9tIFBhdCBSYW5raW46Ci0JKiBNYWtlZmlsZS5pbiAoVk1TX09USEVSX09CSlMpOiBhZGQgY29uY2F0LCBnZXRvcHQsIGFuZCBnZXRvcHQxLgotCSogdm1zY29uZi5zaDogbm8gbG9uZ2VyIGhhdmUgbWFrZS1nYXMuY29tIGVjaG8gdGV4dCBhYm91dCBuZWVkaW5nCi0JdG8gbW9kaWZ5IHRoZSBnY2Mtdm1zIGRyaXZlciB3aGVuIGludGVuZGluZyB0byB1c2Ugd2l0aCBnY2MgMS54LgotCSogYXMuYyAocGFyc2Vfb3B0aW9ucyk6IHN1cHByZXNzICd2JyBmcm9tIHN0ZF9zaG9ydF9vcHRpb25zIGFuZAotCWVsaW1pbmF0ZSBWTVMtc3BlY2lmaWMgY29uZGl0aW9uYWwgaW5pdGlhbGl6YXRpb247Ci0JW2RlZmF1bHQgY2FzZV06IGNoZWNrIGZvciAnLXYnIGlmIG1kX3BhcnNlX29wdGlvbnMgZG9lc24ndCByZWNvZ25pemUKLQlhbiBvcHRpb247Ci0JW2RlZmF1bHQgY2FzZSwgI2lmIFZNU106IGNoZWNrIGZvciBmaWxlbmFtZSBhcmd1bWVudCB3aGVuICctdicgc2VlbjsKLQlbY2FzZSAndiddOiBkZWxldGUuCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogZG9uJ3QgcmVseSBvbiBgdGhpc19hZGRfbnVtYmVyJwotCWZvciBPX2JpZyBsaXRlcmFsIG9wZXJhbmRzIChkb3VibGUgZmxvYXRzIGFuZCBsb25nIGxvbmcgaW50cyk7Ci0JW1ZNUywgbWRfc2hvcnRvcHRzXTogYWRkIHNlY29uZCBjb2xvbiBhZnRlciAndic7Ci0JKG1kX3BhcnNlX29wdGlvbnMpIFtWTVMsIGNhc2UgJ3YnXTogIGNoZWNrIGZvciBhcmd1bWVudCwgc28KLQljYWxsZXIgY2FuIGhhbmRsZSBgLXYnIHcvbyBhcmcuCi0KLVR1ZSBTZXAgMTMgMTY6NDU6MDggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiAgSWYgVENfS0VFUF9GWF9PRkZTRVQKLQlpcyBkZWZpbmVkLCBwdXQgdGhlIHR4X29mZnNldCBpbnRvIHRoZSByX29mZnNldC4KLQkqIGNvbmZpZy90Yy1zaC5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgIwotCSh0Y19yZWxvY19tYW5nbGUpOiBEZWxldGVkLgotCSogY29uZmlnL3RjLXNoLmggKFRDX0tFRVBfRlhfT0ZGU0VUKTogRGVmaW5lLgotCShUQ19SRUxPQ19NQU5HTEUpOiBEZWxldGUuCi0KLVR1ZSBTZXAgMTMgMTY6MjA6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZmxvbnVtLWtvbnN0LmM6IENoYW5nZSBwcmVwcm9jZXNzb3IgdGVzdHMgb2YgSE9fVk1TIHRvIGp1c3QgVk1TLgotCSogaGV4LXZhbHVlLmM6IERpdHRvLgotCSogY29uZmlnL29iai12bXMuYzogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlcGxhY2UgYXNfYmFkL2V4aXQgc2VxdWVuY2Ugd2l0aAotCWEgY2FsbCB0byBhc19mYXRhbC4KLQkqIGNvbmZpZy90Yy1pODYwLmMgKGk4NjBfaXApOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogRGl0dG8uCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBEaXR0by4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBEaXR0by4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFJlcGxhY2UgYXNfd2Fybi9leGl0IHNlcXVlbmNlIHdpdGggYQotCWNhbGwgdG8gYXNfZmF0YWwuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogVXNlIEVYSVRfRkFJTFVSRS4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSwgb3V0cHV0X2ZpbGVfY2xvc2UsCi0Jb3V0cHV0X2ZpbGVfY3JlYXRlLCBvdXRwdXRfZmlsZV9jbG9zZSk6IERpdHRvLgotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21fdmVyc2lvbiwgb2JqX3NvbV9jb3B5cmlnaHQpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotaWVlZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvdGMtdmF4LmMgKG1haW4pOiBVc2UgRVhJVF9TVUNDRVNTLgotCSogY29uZmlnL3RjLW02OGsuYyAobWFpbik6IERpdHRvLgotCi0JKiBoYXNoLmMgKG1haW4pOiBQYXNzIGEgdmFsdWUgdG8gZXhpdCgpLgotCi0JKiBhcy5oIChFWElUX1NVQ0NFU1MsIEVYSVRfRkFJTFVSRSk6IE1vdmVkIGhlcmUuCi0JKiBhcy5jOiAuLi5mcm9tIGhlcmUuCi0JKHBhcnNlX2FyZ3MpOiBVc2UgdGhlbSBhbHdheXMuCi0JKG1haW4pOiBVc2UgZXhpdCByYXRoZXIgdGhhbiByZXR1cm4uCi0KLQkqIE1ha2VmaWxlLmluICgqX0ZPUl9UQVJHRVQsIElOU1RBTExfWEZPUk0sIGluc3RhbGwsIHVuaW5zdGFsbCk6Ci0JUmV3cml0ZSBoYW5kbGluZyBvZiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLgotCi0JKiBjb25maWd1cmUuaW46IFRlc3QgZm9yIGZ1bmN0aW9ucyB1bmxpbmsgYW5kIGRlbGV0ZS4KLQkqIGFzLmg6IElmIHVubGluayBpc24ndCBhdmFpbGFibGUgYnV0IGRlbGV0ZSBpcywgZGVmaW5lIHVubGluayB0bwotCWJlIGRlbGV0ZS4KLQotCVVwZGF0ZSBmb3IgYXV0b2NvbmYgMS4xMTg6Ci0JKiBnZGJpbml0LmluOiBOZXcgZmlsZSwgY3JlYXRlZCBmcm9tIG9sZCAuZ2RiaW5pdC4KLQkqIC5nZGJpbml0OiBEZWxldGVkLgotCSogYWNsb2NhbC5tNCAoR0FTX0dEQklOSVQpOiBEZWxldGVkLgotCSogY29uZmlndXJlLmluOiBEb24ndCB1c2UgaXQuICBJbnN0ZWFkLCBnZW5lcmF0ZSAuZ2RiaW5pdCBmcm9tCi0JZ2RiaW5pdC5pbi4gIERvbid0IHN1YnN0aXR1dGUgY3B1X3R5cGUsIG9ial9mb3JtYXQsIGVtdWxhdGlvbiwKLQlhdG9mLiAgU3dpdGNoZWQgb3JkZXIgb2YgQUNfTElOS19GSUxFUyBhcmd1bWVudHMuICBVc2UgQUNfUFJFUkVRCi0JdG8gZW5zdXJlIHRoYXQgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYgYXJlbid0IHVzZWQuCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgQGNvbmZpZ3VyZV9pbnB1dEAgbGluZS4KLQkoY29uZmlndXJlKTogRGVsZXRlZCBydWxlLgotCi1UdWUgU2VwIDEzIDEyOjA4OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBBZnRlciBoYW5kbGluZyB0aGUgZGlmZmVyZW5jZQotCW9mIHR3byBzeW1ib2xzIGZyb20gdGhlIHNhbWUgc2VnbWVudCwgc2V0IGZ4X3N1YnN5IHRvIE5VTEwsIHRvCi0Jc2F0aXNmeSBleGlzdGluZyBUQ19DT1VOVF9SRUxPQyBtYWNyb3MuCi0KLVR1ZSBTZXAgMTMgMDE6NDc6MDggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYWNsb2NhbC5tNCAoR0FTX0dEQklOSVQpOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUuaW46IFVzZSBpdC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLU1vbiBTZXAgMTIgMjA6NTY6MzggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tKQotCi0JKiAuZ2RiaW5pdCAocGUsIHBzKTogRGVmaW5lIG5ldyBjb21tYW5kcy4KLQkqIHN5bWJvbHMuYyAoaW5kZW50X2xldmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoaW5kZW50LCBwcmludF9leHByXzEsIHByaW50X3N5bWJvbF92YWx1ZV8xLCBwcmludF9zeW1ib2xfdmFsdWUsCi0JcHJpbnRfZXhwcik6IE5ldyBmdW5jdGlvbnMuCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWctc3RhbXApOiBBZGQgYSAidGhpcyBmaWxlIGdlbmVyYXRlZCBieSBtYWtlIgotCW1lc3NhZ2UgdG8gY29uZmlnLmguCi0KLQlQSUMgaW1wbGVtZW50YXRpb24gZm9yIGkzODYtbGludXgsIGJhc2VkIG9uIGNvZGUgZnJvbSBFcmljCi0JWW91bmdkYWxlIGFuZCBQYXVsIEtyYW5lbmJ1cmcsIHdpdGggc29tZSB3b3JrIG9mIG15IG93bjoKLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IFRlc3QgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQIG9uIGZpeHVwCi0JYmVmb3JlIHByb2Nlc3Npbmcgc2FtZS1zZWN0aW9uIHBjcmVsIHJlbG9jYXRpb25zLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZhdWx0IHRvIDEuCi0KLQkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IElmIG9wZXJhdG9yIGlzIE9fc3ltYm9sIGFuZAotCVhfYWRkX251bWJlciBpcyB6ZXJvLCBqdXN0IHJldHVybiB0aGUgc3ltYm9sLiAgSWYgb3BlcmF0b3IgaXMKLQlPX2NvbnN0YW50LCByZXNvbHZlIHRoZSBzeW1ib2wncyB2YWx1ZSBiZWZvcmUgcmV0dXJuaW5nLgotCShvcGVyYW5kKTogUGVybWl0IHVzZSBvZiAiW10iIGZvciBncm91cGluZy4KLQkoY2xlYW5fdXBfZXhwcmVzc2lvbik6IEZvciBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZSBzYW1lCi0JZnJhZywgYWRkIHRoZSBkaWZmZXJlbmNlIG9mIHRoZWlyIG9mZnNldHMgaW50byBYX2FkZF9udW1iZXIuCi0JKGV4cHIpOiBSZWR1Y2UgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiBzYW1lIGZyYWcgdG8gdGhlaXIKLQlkaWZmZXJlbmNlLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChUQ19SRUxPQyk6IE5ldyBtYWNyby4KLQkoc3RydWN0IF9pMzg2X2luc24pOiBOZXcgZmllbGQgZGlzcF9yZWxvYy4KLQkoR09UX3N5bWJvbCk6IE5ldyB2YXJpYWJsZS4KLQkob3BlcmFuZF9zcGVjaWFsX2NoYXJzKTogQWRkZWQgc3F1YXJlLWJyYWNrZXRzIGFuZCBhdC1zaWduLgotCShyZWxvYykgW0JGRF9BU1NFTUJMRVJdOiBBZGRlZCBuZXcgYXJndW1lbnQgT1RIRVI7IGlmIGl0IGlzIG5vdAotCU5PX1JFTE9DLCBqdXN0IHJldHVybiBpdC4KLQkocmVsb2MpIFshIEJGRF9BU1NFTUJMRVJdOiBBZGQgdGhpcmQgYXJndW1lbnQgdG8gZHVtbXkgbWFjcm8uCi0JKEJGRF9SRUxPQ18zODZfUExUMzIsIF9HT1QzMiwgX0dPVE9GRikgWyEgQkZEX0FTU0VNQkxFUl06IE1vcmUKLQlkdW1teSBtYWNyb3MuCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uICBSZXR1cm5zIHplcm8gaWYgc3ltYm9sIGluCi0JZml4dXAgaXMgbm90IGxvY2FsLCB0byBwcmV2ZW50IHJlbG9jYXRpb25zIGFnYWluc3QgZXh0ZXJuYWxzIGZyb20KLQliZWluZyBkcm9wcGVkLgotCShtZF9hc3NlbWJsZSk6IEluaXRpYWxpemUgZGlzcF9yZWxvYyBmaWVsZCB0byBOT19SRUxPQy4gIFBhc3MKLQlkaXNwX3JlbG9jIGZpZWxkIHRvIHJlbG9jKCkgZnVuY3Rpb24sIGFuZCB1c2UgVENfUkVMT0MgdG8gZ2VuZXJhdGUKLQl2YWx1ZSB0byBwYXNzIHRvIGZpeF9uZXdfZXhwLgotCShtZF9hc3NlbWJsZSk6IENoYW5nZSAzMi1iaXQgcmVsb2MgYWdhaW5zdCBHT1Rfc3ltYm9sIGludG8gYSBHT1RQQwotCXJlbG9jLgotCShpMzg2X29wZXJhbmQpOiBJbml0aWFsaXplIGRpc3BfcmVsb2MgZmllbGQgdG8gTk9fUkVMT0MuICBIYW5kbGUKLQlAR09UT0ZGLCBAUExULCBAR09UIG9wZXJhbmRzLiAgRm9yIEdPVE9GRiByZWxvY2F0aW9ucyB3aXRoIGxvY2FsCi0Jc3ltYm9scywgZm9yY2UgZ2VuZXJhdGlvbiBvZiB0aGUgc2VjdGlvbiBzeW1ib2wuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogSWYgR09UX3N5bWJvbCBleGlzdHMsIGRlY2lkZQotCXdlJ3JlIGdlbmVyYXRpbmcgUElDIGNvZGUsIGFuZCBjb252ZXJ0IHJlbG9jYXRpb25zIGFnYWluc3QKLQl1bmRlZmluZWQgc3ltYm9scyBmcm9tIFBDUkVMIHRvIFBMVDMyLgotCShtZF9hcHBseV9maXhfMSkgW09CSl9FTEZdOiBGaXggdXAgdmFsdWVzIGZvciBkeW5hbWljLWxpbmtpbmcKLQlyZWxvY3MuCi0JKG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBOb3RpY2UgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FIGFuZCBzZXQKLQlhbmQgcmV0dXJuIEdPVF9zeW1ib2wgaWYgaXQgbWF0Y2hlcy4KLQkoRiwgTUFQKTogTW92ZSBtYWNybyBkZWZpbml0aW9ucyBvdXRzaWRlIGZ1bmN0aW9uLgotCSh0Y19nZW5fcmVsb2MpOiBPbmx5IHN3aXRjaCBvbiBzaXplIGFuZCBwY3JlbCBpZiBjb2RlIHdhc24ndAotCWFscmVhZHkgc3VwcGxpZWQgYXMgUExUMzIuIEdPVDMyLCBHT1RPRkYsIG9yIEdPVFBDLiAgQ29udmVydAotCUJGRF9SRUxPQ18zMiB1c2luZyBHT1Rfc3ltYm9sIGludG8gR09UUEMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19SRUxPQywgdGNfZml4X2FkanVzdGFibGUsCi0JVENfUkVMT0NfR0xPQkFMX09GRlNFVF9UQUJMRSwgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogTmV3Ci0JbWFjcm9zLgotCShORUVEX0ZYX1JfVFlQRSk6IERlZmluZS4KLQkoTE9DQUxfTEFCRUwpOiBBY2NlcHQgIi5YIiBwcmVmaXggdG9vLgotCShHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOiBEZWZhdWx0IHRvICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLgotCi1Nb24gU2VwIDEyIDE3OjUxOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl90eXBlKTogUmV3cml0ZSB0byBhY2NlcHQgc3ludGF4Ci0JcmVwb3J0ZWRseSB0byBiZSB1c2VkIG9uIElyaXggNi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogSGFuZGxlIC5nbG9ibCBhbmQgLmdsb2JhbC4KLQkoc19taXBzX2dsb2JsKTogTmV3IHN0YXRpYyBmdW5jdGlvbjsgbmVlZGVkIGZvciBJcml4IDUgc3VwcG9ydC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBJZiBCU0ZfRlVOQ1RJT04gaXMgc2V0IGZvciBhbgotCWV4dGVybmFsIHN5bWJvbCB3aXRoIG5vIHR5cGUsIHNldCB0aGUgdHlwZSB0byBzdF9Qcm9jIHJhdGhlciB0aGFuCi0Jc3RfR2xvYmFsLiAgRG9uJ3Qgc2V0IHRoZSBpbmRleCBvZiBhbiBleHRlcm5hbCBzdF9Qcm9jIG9yCi0Jc3RfU3RhdGljUHJvYyBzeW1ib2wgdW5sZXNzIGl0IGlzIGFsc28gYSBsb2NhbCBzeW1ib2wuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogVGhlIHNlY29uZCBhcmd1bWVudCB0byBhc193aGVyZSBpcwotCXVuc2lnbmVkIGludCAqLCBub3QgaW50ICouCi0KLVRodSBTZXAgIDggMTc6MTg6MjQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oIDogQ2hhbmdlIG5hbWVzIHRvICBPQkpfR0VORVJBVEVfQVNNX0xJTkVOTywKLQlhbmQgZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkqIGNvbmZpZy9vYmotZWxmLmggOiBkaXR0by4KLQkqIHJlYWQuaCA6IGRpdHRvLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBpZiBubyBmaWxlIHdoZW4gaW5zdCBpcyByZWFkLCBzZXQKLQlnZW5lcmF0ZV9hc21fbGluZW5vIHRvIHRydWUuCi0JKiBlY29mZi5oIDogY2hhbmdlIG5hbWUgdG8gZ2VuZXJhdGVfYXNtX2xpbmVubyBhbmQgYWRkIGZ1bmN0aW9uCi0JZWNvZmZfbm9fY3VycmVudF9maWxlLgotCSogZWNvZmYuYyA6IGNoYW5nZSBuYW1lIHRvIGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKSA6IG5ldyBmdW5jdGlvbiwgdG8gZ2VuZXJhdGUKLQllY29mZiBzdHlsZSBsaW5lIGZvciBhc20gZmlsZS4KLQotVGh1IFNlcCAgOCAxOTo0Mzo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzaXplX3NlY3Rpb24pOiBEbyBhbiBmcHJpbnRmIHRvIHN0ZGVyciByYXRoZXIKLQl0aGFuIGEgcHJpbnRmLgotCShmaXh1cF9zZWdtZW50KTogVXNlIGFzX2JhZF93aGVyZSByYXRoZXIgdGhhbiBhc19iYWQuCi0KLVdlZCBTZXAgIDcgMTc6MjE6MTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXtoODMwMCxzaH0uW2NoXSAodGNfY29mZl9zeW1ib2xfZW1pdCk6IEZ1bmN0aW9uIGRvaW5nCi0Jbm90aGluZyBiZWNvbWVzIG1hY3JvIGRvaW5nIG5vdGhpbmcuCi0KLVdlZCBTZXAgIDcgMTk6MTA6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMuCi0JKGNvbmZpZy5zdGF0dXMpOiBSdW4gY29uZmlnLnN0YXR1cyBmcm9tIC4gaW5zdGVhZCBvZiBzcmNkaXIuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2dlbl9yZWxvYyk6IFVzZSBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSB0bwotCWRpc3BsYXkgdGhlIG5hbWUgb2YgdGhlIHJlbG9jYXRpb24gdHlwZSB0aGF0IGNvdWxkbid0IGJlIGhhbmRsZWQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuICBEZWxldGVkIGFib3J0IGNhbGwKLQlhZnRlciBjYWxsIHRvIGFzX2ZhdGFsLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1saW51eCopOiBEb24ndCBzZXQgYmZkX2dhcy4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQsIE5NX0ZPUl9UQVJHRVQsIE9CSkRVTVBfRk9SX1RBUkdFVCwKLQlpbnN0YWxsLCB1bmluc3RhbGwpOiBEb24ndCB1c2UgImJyb2tlbnNlZCIgaGFjayBhbnkgbW9yZSwgdGhlIG5ldwotCWF1dG9jb25mIGNvZGUgc2hvdWxkIG5ldmVyIGxldCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJlIGVtcHR5LgotCi0JVXBkYXRlIGZvciBhdXRvY29uZiBiZXRhIDEuMTEyOgotCSogYWNsb2NhbC5tNCAoR0FTX0NIRUNLX0RFQ0xfTkVFREVELCBHQVNfV09SS0lOR19BU1NFUlQpOiBOZXcKLQltYWNyb3MuCi0JKiBjb25maWd1cmUuaW46IFVzZSB0aGVtLiAgVXNlIEFDX0FSR19QUk9HUkFNIChub3cgcHJvdmlkZWQgYnkKLQlhdXRvY29uZikgaW5zdGVhZCBvZiBteSBoYWNrZWQtdXAgQUNfUFJPR1JBTV9UUkFOU0ZPUk1fTkFNRS4gIE1vdmUKLQl0ZXN0IGZvciBDUk9TU19DT01QSUxFIGp1c3QgYmVmb3JlIEFDX0ZVTkNfQUxMT0NBLCBhbmQgZW1pdCBhCi0JbWVzc2FnZSB0byB0cnkgdG8gZWFzZSBjb25mdXNpb24gYWJvdXQgYXV0b2NvbmYncwotCSJjcm9zcy1jb21waWxpbmciIG1lc3NhZ2UuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX01BTExPQywgTkVFRF9ERUNMQVJBVElPTl9GUkVFLAotCU5FRURfREVDTEFSQVRJT05fRVJSTk8pOiBSZW5hbWVkIGZyb20gTkVFRF8qX0RFQ0xBUkFUSU9OLgotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWdlbmVyYXRlZC4KLQotV2VkIFNlcCAgNyAxMjo0OTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgJHtob3N0fSBhbmQgJHt0YXJnZXR9IHJhdGhlciB0aGFuCi0JJHtob3N0X2Nhbm9ufSBhbmQgJHt0YXJnZXRfY2Fub259LgotCSogY29uZmlndXJlOiBMaWtld2lzZS4KLQotVHVlIFNlcCAgNiAxMTo0MjozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfY3B1KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoaW5zbnNfc2luY2VfY2FjaGVfYWNjZXNzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBTZXQgbWlwc19jcHUgYXMgd2VsbCBhcyBtaXBzX2lzYS4KLQkoYXBwZW5kX2luc24pOiBJZiBtaXBzX2NwdSBpcyA0NjAwLCByZXF1aXJlIGZvdXIgbm9wIGluc3RydWN0aW9ucwotCWJldHdlZW4gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggYWNjZXNzZXMgdGhlIGNhY2hlIGFuZCBjZXJ0YWluIENBQ0hFCi0JaW5zdHJ1Y3Rpb25zLiAgS2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBzZWVuIHNpbmNlCi0JYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggYWNjZXNzZXMgdGhlIGNhY2hlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgbWlwc19jcHUgYXMgd2VsbCBhcyBtaXBzX2lzYS4KLQotTW9uIFNlcCAgNSAwNzowOTowMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluIChWUEFUSCk6IERlZmluZSB1c2luZyBAc3JjZGlyQC4KLQkocHJlZml4LCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLCBleGVjX3ByZWZpeCk6IFVzZSBhdXRvY29uZiBzdHlsZQotCUAtc3Vic3RpdHV0aW9ucy4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBjb25maWcvaG8tcmlzY2l4LmgsIGNvbmZpZy90Yy1hcm0uYywgY29uZmlnL3RjLWFybS5oOiBOZXcgZmlsZXMKLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIHRoZSBhcm0uCi0KLUZyaSBTZXAgIDIgMTY6MDU6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IERvbid0IHRyeSB0byBnZW5lcmF0ZSBsaW5lIG51bWJlcnMgaWYgdGhlCi0Jc3ltYm9sIHRhYmxlIGhhcyBiZWVuIGZyb3plbi4KLQotVGh1IFNlcCAgMSAxOTo0ODowMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhY2xvY2FsLm00IChBQ19QUk9HX0NDKTogVXNlIEFDX0RFRlVOLCBhbmQgb21pdCBBQ19QUk9WSURFLgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSB1c2VyLXNwZWNpZmllZCBiZmQtYXNzZW1ibGVyIG9wdGlvbiB3aXRoCi0Jc2VwYXJhdGUgdmFyaWFibGUgZnJvbSBwcmVmZXJyZWQgY29uZmlndXJhdGlvbiwgdW50aWwgdGhlIHR3byBhcmUKLQlyZXNvbHZlZC4gIEluZGljYXRlIGJmZF9nYXM9cHJlZmVycmVkIGZvciBsaW51eCBhLm91dC4gIFVzZQotCUFDX1BST0dSQU1fVFJBTlNGT1JNX05BTUUsIGZvciB3aGljaCBhIHBhdGNoIGhhcyBiZWVuIHNlbnQgdG8gZGptLgotCSogTWFrZWZpbGUuaW4gKHRhcmdldF9hbGlhcywgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSk6IERlZmluZSwKLQl1c2luZyBhdXRvY29uZiBALXN1YnN0aXR1dGlvbnMuCi0KLVdlZCBBdWcgMzEgMTc6NDM6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYXRvZi1nZW5lcmljLmM6IERlbGV0ZWQgYWxsb2NhIGhhbmRsaW5nIGhlcmUuCi0KLQkqIE1ha2VmaWxlLmluIChwcmVmaXgsIGV4ZWNfcHJlZml4KTogVXNlIEAtc3VidGl0dXRpb25zLgotCi0JKiBhY2xvY2FsLm00IChBQ19PVVRQVVRfTElOS1MpOiBEZWxldGVkIHJlZGVmaW5pdGlvbiwgc2luY2UKLQlhdXRvY29uZiAxLjEwOSBoYXMgdGhpcyBmaXhlZC4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2hhbmdlIHF1b3RlIGNoYXJhY3RlcnMgYXJvdW5kIEFDX01TR19FUlJPUgotCWludm9jYXRpb24uICBEb24ndCB1c2UgQUNfSEVBREVSX1NUREMsIHNpbmNlIGl0IHJlcXVpcmVzIHJ1bm5pbmcgYQotCXByb2dyYW0uICBDYWNoZSBORUVEXypfREVDTEFSQVRJT04gdmFsdWVzLgotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWdlbmVyYXRlZCB3aXRoIGEgbW9kaWZpZWQgYXV0b2NvbmYgMS4xMDkuCi0KLQkqIGFzLmggKHZvbGF0aWxlKTogRG9uJ3QgdGVzdCBvciBkZWZpbmUgaGVyZTsgbm90IG5lZWRlZC4KLQkoYWxsb2NhKTogUmVwbGFjZSBhbGxvY2EtY29uZi5oIGluY2x1c2lvbiB3aXRoIGNvZGUgcmVjb21tZW5kZWQgaW4KLQlhdXRvY29uZiBkb2N1bWVudGF0aW9uLiAgSW5jbHVkZSBjb25maWcuaCBmaXJzdC4KLQotV2VkIEF1ZyAzMSAxMToyMDo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0RFRklORUQpOiBBYnNvbHV0ZSBzeW1ib2xzIGFyZSBkZWZpbmVkCi0JYWxzby4KLQotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEluaXRpYWxpemUgYmZkX2dhcyB0byBuby4KLQotVHVlIEF1ZyAzMCAxOTozMToxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBJbmNsdWRlIGFsbG9jYS1jb25mLmggZnJvbSAibGliaWJlcnR5Iiwgbm90Ci0JIi4uL2xpYmliZXJ0eSIuCi0KLU1vbiBBdWcgMjkgMTY6MTE6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeCk6IERvbid0IGdlbmVyYXRlIGEgcmVsb2Mgd2hlbiBhCi0Jc3ltYm9sIGlzIHVzZWQgYXMgYW4gb2Zmc2V0IGludG8gYSBDU0VDVCB0aGF0IGlzIG5vdCBhIFRPQy4gIFRoZXNlCi0JdHlwZXMgb2YgbG9hZHMgYXJlIGdlbmVyYXRlZCBieSBnY2MgLW1taW5pbWFsLXRvYy4KLQotU3VuIEF1ZyAyOCAxMzoyMjo1MiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFzLmggKGZsYWdfKik6IEFkZGVkIGNvbW1lbnRzIGRlc2NyaWJpbmcgbWVhbmluZ3Mgb2Ygc29tZSBvZgotCXRoZXNlIHZhcmlhYmxlcy4KLQkoc3RydWN0IGZyYWcpOiBBZGQgc29tZSBjb21tZW50cyBhYm91dCB0aGUgbnMzMmstc3BlY2lmaWMgZmllbGRzCi0JYW5kIHdoeSB0aGV5J3JlIGhlcmUuCi0JKFNJWkVPRl9TVFJVQ1RfRlJBRyk6IENhc3QgYWRkcmVzc2VzIHRvIGNoYXIqLCBub3QgaW50LgotCShmbGFnX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogU2V0IGZsYWdfcHJpbnRfc3RhdGlzdGljcyBpbnN0ZWFkIG9mCi0Jc3RhdGlzdGljc19mbGFnLiAgT3B0aW9ucyBhcnJheSBpcyBub3cgY29uc3QuICBBZGRlZCBuZXcgb3B0aW9uCi0JImR1bXAtY29uZmlnIjsgaWYgc3BlY2lmaWVkLCBwcmludCBUQVJHRVRfQUxJQVMsIFRBUkdFVF9DQU5PTklDQUwsCi0JVEFSR0VUX0NQVSwgVEFSR0VUX09CSl9GT1JNQVQsIGFuZCBUQVJHRVRfRk9STUFULCBpZiBkZWZpbmVkLgotCShtYWluKTogQ2hhbmdlIHRlc3QgdG8gY2hlY2sgZmxhZ19wcmludF9zdGF0aXN0aWNzLgotCShzdGF0aXN0aWNzX2ZsYWcpOiBEZWxldGVkLgotCi0JKiBmcmFncy5jIChmcmFnX3ZhcmlhbnQpOiBSZW1vdmVkIFBDUkVMX0FESlVTVCBhbmQgQlNSIGFyZ3VtZW50cy4KLQlBbHdheXMgaW5pdGlhbGl6ZSB0aGVtIHRvIHplcm8uCi0JKiBmcmFncy5oIChmcmFnX3ZhcmlhbnQpOiBGaXhlZCBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtaTk2MC5jIChnZXRfY2Rpc3ApOiBEb24ndCBwYXNzIHRoZSBleHRyYSB6ZXJvIGFyZ3MuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoY29udmVydF9paWYpOiBEb24ndCBwYXNzIHRoZSBhcmd1bWVudHM7IGNhY2hlCi0JdGhlIHZhbHVlIG9mIGZyYWdfbm93IGFuZCBmaWxsIGluIHRoZSBmaWVsZHMgbGF0ZXIuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6IFJlbW92ZSBuZXcKLQljb25maWd1cmUtZ2VuZXJhdGVkIGZpbGVzLgotCi1TYXQgQXVnIDI3IDIwOjI2OjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCUNvbnZlcnNpb24gdG8gYXV0b2NvbmY6Ci0JKiBhY2NvbmZpZy5oLCBhY2xvY2FsLm00OiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFJld3JpdHRlbiAoZXhjZXB0IGZvciBzb21lIHRhcmdldC1zcGVjaWZpYyBjb2RlKQotCWZvciBhdXRvY29uZi4KLQkqIGNvbmYuaW4sIGNvbmZpZ3VyZTogTmV3IGZpbGVzLCBnZW5lcmF0ZWQgZnJvbSB0aGUgYWJvdmUuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBtYWdpYyBzZXF1ZW5jZSBpbmRpY2F0aW5nIGluc2VydGlvbiBvZgotCW1ha2VmaWxlIGZyYWdtZW50cy4KLQkoVlBBVEgsIHNyY2RpciwgQ0MsIExJQlMsIE9CSlMgZGVwZW5kZW5jaWVzKTogVXNlIEAtc3Vic3RpdHV0aW9ucwotCWZyb20gY29uZmlndXJlLgotCShMSU5LRURfSEVBREVSUyk6IERlbGV0ZWQgYS5vdXQuZ251LmgsIGEub3V0LmgsIGFuZCBob3N0LmguCi0JKGNvbmZpZy5zdGF0dXMsIGNvbmZpZ3VyZSk6IFJld3JpdGUgcnVsZXMuCi0JKGNvbmZpZy1zdGFtcCk6IERlcGVuZCBvbiBjb25mLiAgU2tpcCB2YXJpYWJsZXMgdGhhdCBjb25maWd1cmUgaXMKLQlub3cgc3Vic3RpdHV0aW5nIGl0c2VsZi4KLQkoKi5vIGRlcGVuZGVuY2llcyk6IERlbGV0ZWQgaG9zdC5oLgotCShkaXN0Y2xlYW4sIHJlYWxjbGVhbik6IERvbid0IGRlbGV0ZSBob3N0LmguCi0JKiBhcy5jOiBEb24ndCBpbmNsdWRlIHN0ZGlvLmgsIHN0cmluZy5oLCBzeXMvdHlwZXMuaC4gIEluY2x1ZGUKLQlzaWduYWwuaCBhZnRlciBhcy5oLgotCSogYXMuaDogSW5jbHVkZSBhbGxvY2EtY29uZi5oIGZpcnN0LiAgSW5jbHVkZSBjdHlwZS5oLCBzdHJpbmcuaCwKLQlzdHJpbmdzLmgsIHN0ZGxpYi5oLCB1bmlzdGQuaCwgc3lzL3R5cGVzLmgsIGZvcGVuLWJpbi5oLAotCWZvcGVuLXNhbWUuaCwgYXMgc3VnZ2VzdGVkIGJ5IGF1dG9jb25mIHRlc3QgcmVzdWx0cy4KLQlbQlJPS0VOX0FTU0VSVF06IERvbid0IGluY2x1ZGUgYXNzZXJ0LmguCi0JKHN0cmR1cCk6IERlY2xhcmUuCi0JKHZvbGF0aWxlLCBjb25zdCk6IERlZmluZSBpZiBub3QgX19TVERDX18gYW5kIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKG1hbGxvYywgcmVhbGxvYykgW05FRURfTUFMTE9DX0RFQ0xBUkFUSU9OXTogRGVjbGFyZS4KLQkoZnJlZSkgW05FRURfRlJFRV9ERUNMQVJBVElPTl06IERlY2xhcmUuCi0JKiBnYXNwLmM6IEluY2x1ZGUgY29uZmlnLmgsIHN0ZGxpYi5oIChpZiBIQVZFX1NURExJQl9IKS4gIERvbid0Ci0JaW5jbHVkZSBob3N0LmguCi0JKG1hbGxvYykgW05FRURfTUFMTE9DX0RFQ0xBUkFUSU9OXTogRGVjbGFyZS4KLQkqIG1lc3NhZ2VzLmM6IEluY2x1ZGUgYXMuaCBmaXJzdC4gIEluY2x1ZGUgZXJybm8uaCBvbmx5IGlmCi0JSEFWRV9FUlJOT19ILiAgSWYgSEFWRV9WQVJBUkdTX0ggYW5kIG5vdCBfX1NURENfXywgdW5kZWZpbmUKLQlIQVZFX1NUREFSR19ILiAgU2V0IE5PX1NUREFSRyBhbmQgTk9fVkFSQVJHUyBhcyBhcHByb3ByaWF0ZS4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoc3JjZGlyLCBJTlNUQUxMLCBJTlNUQUxMX1BST0dSQU0sCi0JSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mIEAtc3Vic3RpdHV0aW9ucy4KLQotCSogaW5wdXQtZmlsZS5jOiBEb24ndCBpbmNsdWRlIGFzc2VydC5oIGhlcmUsICdjYXVzZSBhcy5oIGFscmVhZHkKLQlpbmNsdWRlcyBpdC4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IEFkZGVkIHZhcmlvdXMgcHJvdG90eXBlcyBmb3Igc3RhdGljCi0JZnVuY3Rpb25zLgotCShpbl9yYW5nZSk6IE5ldyBmdW5jdGlvbiwgdGVzdHMgd2hldGhlciBhIHZhbHVlIGNhbiBmaXQgaW4gYW4KLQlOLWJpdCBmaWVsZC4KLQkoYnVpbGRfbWVtLCBidWlsZF9vcGVyYXRlX24pOiBOZXcgZnVuY3Rpb25zIGZvciBjb25zdHJ1Y3RpbmcKLQlvcGNvZGUgdmFsdWVzLgotCShlbWl0X3NsbF9uLCBlbWl0X2xkYWhfbnVtLCBlbWl0X2FkZHFfciwgZW1pdF9sZGFfbik6IE5ldwotCWZ1bmN0aW9ucyBmb3IgZW1pdHRpbmcgc2luZ2xlIGluc3RydWN0aW9ucywgbm8gbG9uZ2VyIHJlcXVpcmluZyBhCi0JcmVjdXJzaXZlIGNhbGwgdG8gbWRfYXNzZW1ibGUuCi0JKGVtaXRfYWRkNjQpOiBOZXcgZnVuY3Rpb24gZm9yIGV4cGFuZGluZyBhIFJFRzo9UkVHK0NPTlNUCi0Jb3BlcmF0aW9uIGludG8gb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zLCB0byBoYW5kbGUgd2lkZSBjb25zdGFudHMuCi0JKGNsZWFyX2luc24pOiBOZXcgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogRmlsbCBpdCBpbiB3aXRoIHplcm9zIGFuZCBCRkRfUkVMT0NfTk9ORSB2YWx1ZXMuCi0JKGFscGhhX2lwKTogVXNlIGl0IHRvIGluaXRpYWxpemUgbG9jYWwgdmFyaWFibGUgaW5zbnMuCi0JKGFscGhhX2lwLCBsYWJlbCAiaW1tZWRpYXRlIiBhbmQgY2FzZXMgJ1AnLCAnRycpOiBVc2UgZW1pdF9hZGQ2NAotCWZvciBjYWxjdWxhdGlvbnMuCi0KLUZyaSBBdWcgMjYgMTQ6NDY6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogUmV2ZXJzZSBzdGlsbC13cm9uZyB0ZXN0IG9mCi0JRU1JVF9TRUNUSU9OX1NZTUJPTFMuCi0KLQkqIHdyaXRlLmMgKEJGRF9GQVNUX1NFQ1RJT05fRklMTCk6IEFsd2F5cyBkZWZpbmUuCi0JKHdyaXRlX2NvbnRlbnRzKTogSWYgZmlsbF9zaXplIGlzIDEsIHVzZSBtZW1zZXQgaW5zdGVhZCBvZiBsb29waW5nCi0JY2FsbGluZyBtZW1jcHkuCi0KLVdlZCBBdWcgMjQgMTI6NDY6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTCk6IERlZmluZSBhcyAwLCBmb3IgY29tcGF0aWJpbGl0eQotCXdpdGggbmF0aXZlIE1JUFMgYXNzZW1ibGVyLgotCSogY29uZmlndXJlLmluIChtaXBzLSotaXJpeCopOiBEb24ndCBzZXQgZW11bGF0aW9uLgotCSogY29uZmlnL3RlLWlyaXguaDogUmVtb3ZlLgotCi0JKiBlY29mZi5jIChlY29mZl9zeW1ib2xfbmV3X2hvb2spOiBEb24ndCBhZGQgYSBuZXcgZmlsZSBpZiB3ZQotCWhhdmVuJ3Qgc2VlbiBhbnkgaW5wdXQgZmlsZXMgeWV0LgotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2JlZ2luKTogSnVzdCBjYWxsIHN5bWJvbF9jcmVhdGUsIHJhdGhlcgotCXRoYW4gY2FsbGluZyBzeW1ib2xfbmV3IGFuZCB0aGVuIHJlbW92aW5nIHRoZSBzeW1ib2wgZnJvbSB0aGUKLQlsaXN0LgotCi0JKiBhcy5jIChtYWluKTogTW92ZSBhIGluc2lkZSB0aGUgI2lmIDAgYmxvY2sgd2hpY2ggdXNlcyBpdC4KLQkqIGVjb2ZmLmMgKGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUpOiBNYWtlIGNvbnN0LgotCSogZnJhZ3MuaCAoZnJhZ19hbGlnbl9wYXR0ZXJuKTogRGVjbGFyZS4KLQkqIGdhc3AuYyAobmV3X2ZpbGUpOiBDYXN0IGlzcCB0byBsb25nLCBhbmQgdXNlICVsZCB0byBwcmludCBpdC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF9vcGVyYW5kKTogQWRkIGNhc3QgdG8gdm9pZC4KLQkoYWxwaGFfZG9fYWxpZ24pOiBEZWNsYXJlIGFyZ3VtZW50IHR5cGVzLgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBEZWNsYXJlLgotCShhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWFscGhhLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShzX21hc2spOiBEb24ndCBkZWNsYXJlOyBkb2VzIG5vdCBleGlzdC4KLQkobGluZV9jb21tZW50X2NoYXJzKTogUmVtb3ZlIC8qIGZyb20gZGVzY3JpcHRpdmUgY29tbWVudC4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogUmVtb3ZlIHVudXNlZCBsb2NhbCByZWcuCi0JKHRjX2dlbl9yZWxvYyk6IERvbid0IGJvdGhlciB0byBjb21wYXJlIHVuc2lnbmVkIHRvIHplcm8uCi0JKHNfYmFzZSk6IENvcnJlY3Qgd2FybmluZyB0byBhY3R1YWxseSBwcmludCByZWdpc3RlciBudW1iZXIuCi0JKG1kX2JlZ2luKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgcmV0dmFsLCBsb3NlLCBhbmQgaS4KLQkoYWxwaGFfZml4X2FkanVzdGFibGUpOiBNb3ZlIGRlZmF1bHQgY2FzZSBpbnNpZGUgc3dpdGNoIHRvIGF2b2lkCi0Jd2FybmluZy4KLQkobG9hZF9zeW1ib2xfYWRkcmVzcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIHJlbG9jX2FkZHIsIHAsIHN5bSwKLQlhbmQgYWRkZW5kLgotCShlbWl0X2J5dGVfbWFuaXBfcik6IERlY2xhcmUgdHlwZXMgZm9yIGFsbCBhcmd1bWVudHMuCi0JKGVtaXRfZXh0cmFjdF9yLCBlbWl0X2luc2VydF9yLCBlbWl0X21hc2tfcik6IExpa2V3aXNlLgotCShlbWl0X3NpZ25fZXh0ZW5kLCBlbWl0X2Jpc19yLCBzX3Byb2MpOiBMaWtld2lzZS4KLQkoYWxwaGFfaXApOiBVc2Ugc3ByaW50X3ZhbHVlIHRvIHByaW50IG9mZnNldFQgdmFsdWUuICBSZW1vdmUKLQl1bnVzZWQgbG9jYWwgc2l6ZS4gIFJlbW92ZSB1bnVzZWQgbGFiZWwgZ2V0X21hY3JvLgotCShhbHBoYV9kb19hbGlnbik6IE1ha2UgZmlsbCBjb25zdC4KLQkobWRfYXBwbHlfZml4KTogUmVtb3ZlIHVudXNlZCBsYWJlbCBjaGVja196b3YuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGk1ODYgYXMgYSBzeW5vbnltIGZvciBpWzM0XTg2LgotCi1UdWUgQXVnIDIzIDEyOjMyOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfbGluZV9uZXcpOiBDaGFuZ2UgbGluZV9udW1iZXIgYXJndW1lbnQgZnJvbQotCXVuc2lnbmVkIHNob3J0IHRvIGludCBzbyB0aGF0IHRoZSB0eXBlIGluIHRoZSBwcm90b3R5cGUgbWF0Y2hlcwotCXRoZSBwcm9tb3RlZCB0eXBlIGluIHRoZSBkZWZpbml0aW9uLgotCShzdGFja19kZWxldGUpOiBDb21tZW50IG91dDsgbm90IHVzZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogRGVjbGFyZSBpZiBub3QKLQlCRkRfQVNTRU1CTEVSLCBub3QgaWYgQkZEX0FTU0VNQkxFUi4gIERlY2xhcmUgYXJndW1lbnQgdHlwZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQWRkIGlnbm9yZWQKLQlhcmd1bWVudC4KLQotVHVlIEF1ZyAxNiAwMTo0ODoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2NvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBVbmRvIGxhc3QgY2hhbmdlLiAgU2V0IHN5X2ZyYWcgZm9yCi0JdGhlIGNvbW1vbiBzeW1ib2wgdG8gdGhlIHplcm8gYWRkcmVzcyBmcmFnICh0aGUgY29ycmVjdCBmaXgpLgotCi1UdWUgQXVnIDE2IDAxOjQ4OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFVuZG8gbGFzdCBjaGFuZ2UuICBTZXQgc3lfZnJhZyBmb3IKLQl0aGUgY29tbW9uIHN5bWJvbCB0byB0aGUgemVybyBhZGRyZXNzIGZyYWcgKHRoZSBjb3JyZWN0IGZpeCkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBTZXQgc3lfcmVzb2x2ZWQgZm9yIHRoZSBjb21tb24KLQlzeW1ib2wuCi0KLUZyaSBBdWcgMTIgMTc6NTE6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IERyb3AgImVsIiBmcm9tIHRoZSBlbmQgb2YKLQlUQVJHRVRfQ1BVLiAgQ2hlY2sgZm9yIG1pcHM2NG9yaW9uLgotCi1UdWUgQXVnICA5IDE5OjQzOjQ1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBwcGMtKi1uZXR3YXJlLgotCSogY29uZmlnL3RlLXBwY253Lmg6ICBOZXcgZmlsZSB0byBzdXBwb3J0IFBvd2VyLVBDL05ldHdhcmUKLQljb25maWd1cmF0aW9ucy4gIEN1cnJlbnRseSwgaXQganVzdCBlbmFibGVzIHRoZSB1c2Ugb2YgYmFja3NsYXNoCi0JZXNjYXBlcyBpbiBzdHJpbmcgZGlyZWN0aXZlcy4KLQotVHVlIEF1ZyAgOSAxMToxMjoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3N0YWJ4KTogQ2FsbCBleHByZXNzaW9uIGRpcmVjdGx5LCByYXRoZXIKLQl0aGFuIHZpYSBwc2V1ZG9fc2V0LiAgSWYgZXhwcmVzc2lvbiBpcyBhIHN5bWJvbCwgbW92ZSBzdGFiIHN5bWJvbAotCXRvIGp1c3QgYWZ0ZXIgc3ltYm9sIGZyb20gZXhwcmVzc2lvbi4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfcHJvY3MpOiBEb24ndCBmb3JjZSBhZHIgb2YgZmlyc3QgZmRyIHRvIGJlCi0JemVyby4gIFVuZG9lcyBjaGFuZ2Ugb2YgSnVuZSA0LCAxOTkzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgLW1jcHU9NDQwMCwgNDYwMCwgYW5kCi0Jb3Jpb24uCi0KLU1vbiBBdWcgIDggMTY6Mjg6MDggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogYXMuaDogUmVtb3ZlIEZPUEVOX1dCIHBhdGNoIG9mIEF1ZyA2LgotCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgZm9yIGhvLWdvMzIgY29ycmVjdGx5LgotCSogY29uZmlnL2hvLWdvMzIuaDogRml4IGNvcHlyaWdodC4KLQotTW9uIEF1ZyAgOCAxMTo1OTo1MSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2NvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IERlbGV0ZSByZWR1bmRhbnQKLQl1cHBlci1jYXNlIHZlcnNpb25zIG9mIHRoZSBwc2V1ZG8tb3BzLgotCi1Nb24gQXVnICA4IDEzOjQyOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IElmIHdlIGFyZSBnb2luZyB0byBnZW5lcmF0ZSBhCi0Jbm9uIFBDIHJlbGF0aXZlIHJlbG9jLCBkb24ndCBwdXQgdGhlIGFkZGVuZCBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLVNhdCBBdWcgIDYgMDE6MTU6MDIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogYXMuaDogSWYgRk9QRU5fV0IgaXMgbm90IGRlZmluZWQsIGRvIHRoZSByaWdodCB0aGluZyBpbiBhIGdvMzIKLQllbnZpcm9ubWVudC4KLQotTW9uIEp1bCAxMSAxMTozNDo1MiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAocGludCk6IE5ldyBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgdmFyeWluZwotCXNpemUgb2YgaW50IHBzZXVkbyBvcC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBGaXggdHlwbyBkZXNjcmliaW5nIC5oODMwMGggcHNlZHVvcC4KLQotTW9uIEF1ZyAgMSAwMjo0MDo0MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY3JlYXRlX25ld19zcGFjZSk6IEluaXRpYWxpemUgc2Rfc3Vic3BhY2VzCi0JZmllbGQgaW4gdGhlIHNwYWNlIGNoYWluLgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tCi0JaHBwYV9nZW5fcmVsb2NfdHlwZS4KLQotVGh1IEp1bCAyOCAxNTo0NTozNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBDaGVjayBtb3JlIGNhcmVmdWxseSBmb3IKLQljb25mbGljdGluZyBhcmNoaXRlY3R1cmVzLgotCShtZF9wYXJzZV9vcHRpb24pIFtOT19WOV06IENvbXBsYWluIGlmIHY5IHdhcyBzZWxlY3RlZC4KLQkobWRfc2hvd191c2FnZSk6IERlcml2ZSBhcmNoaXRlY3R1cmUgbGlzdCBpbiB1c2FnZSBtZXNzYWdlIGZyb20KLQlhcmNoaXRlY3R1cmVfcG5hbWUgYXJyYXkuCi0JKGN5cHJlc3MpOiBNYWNybyBkZWxldGVkLgotCShvcF9oYXNoKTogRG9uJ3QgaW5pdGlhbGl6ZS4KLQkoc19jb21tb24pOiBVc2UgYmZkX3VuZF9zZWN0aW9uX3B0ciBpbnN0ZWFkIG9mIGJmZF91bmRfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKEJTUik6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBVc2UgaXQgZm9yIHJpZ2h0LXNoaWZ0IG9wZXJhdGlvbnMgb2YgMzIgYml0cyBvciBtb3JlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBJbXBsZW1lbnQgbmV3IG9wZXJhbmQgdHlwZSAneCcuCi0KLVR1ZSBKdWwgMjYgMTg6MjE6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmg6IE1vdmVkIGNvbW1vbiBpbmNsdWRlcyBhbmQgVEFSR0VUX0ZPUk1BVAotCWRlZmluaXRpb25zIHRvZ2V0aGVyLgotCShXT1JLSU5HX0RPVF9XT1JELCBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELAotCU9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSLCBCRkRfSEVBREVSUywgQkZEKSBbIUJGRF9BU1NFTUJMRVJdOgotCU1vdmVkIHRoZXNlIGRlZmluaXRpb25zIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZSwgYmVmb3JlIHRoZQotCWluY2x1ZGVzLgotCShTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTLCBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyk6IEFsd2F5cwotCWRlZmluZSB0aGVzZS4KLQkoU19HRVRfWkVST0VTKTogRGVsZXRlZC4KLQkoU19TRVRfWkVST0VTKTogTW92ZWQgdG8gb2JqLWNvZmYuYy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmXyogcHN1ZWRvLW9wIGZucyk6IERlbGV0ZWQKLQlmb3J3YXJkIGRlY2xhcmF0aW9ucy4KLQkob2JqX3BzZXVkb190YWJsZSk6IE1vdmVkIHRvIG9uZSB2ZXJzaW9uIGVuZCBvZiBmaWxlLAotCWNvbmRpdGlvbmFsaXplZCBpbnRlcm5hbGx5LgotCShzdGFjayB0eXBlZGVmLCBzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCwKLQl0YWdfaGFzaCwgdGFnX2luaXQsIHRhZ19pbnNlcnQsIHRhZ19maW5kLCB0YWdfZmluZF9vcl9tYWtlKTogTW92ZWQKLQl0byBvbmUgY29tYmluZWQgdmVyc2lvbiBhdCB0b3Agb2YgZmlsZSwgdW5jb25kaXRpb25hbC4gIERlbGV0ZWQKLQlmb3J3YXJkIGRlY2xhcmF0aW9ucy4KLQkoc19nZXRfbmFtZSk6IE1vdmVkIG9uZSBjb3B5IG9mIGRlY2xhcmF0aW9ucyB0byBzdGFydCBvZiBmaWxlLgotCShkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTogRGl0dG8uICBEb24ndCBpbml0aWFsaXplLgotCShTX1NFVF9aRVJPRVMpOiBNb3ZlZCBoZXJlIGZyb20gb2JqLWNvZmYuaC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBUQ19DT0ZGX1NFVF9NQUNISU5FIGlzIGRlZmluZWQsIGNhbGwgaXQgb24KLQl0aGUgZmlsZSBoZWFkZXJzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2VnX2luZm9fb2ZmX2J5XzQpOiBOb3cgY29uc3QgYW5kIHN0YXRpYy4KLQkoU0VHX0lORk9fRlJPTV9TRUdfTlVNQkVSKTogVW51c2VkIG1hY3JvIGRlbGV0ZWQuCi0JKHByZXZpb3VzX2ZpbGVfc3ltYm9sLCBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfZXh0ZXJuUCwKLQlzeW1ib2xfZXh0ZXJuX2xhc3RQLCBsYXN0X2Z1bmN0aW9uUCkgWyFCRkRfQVNTRU1CTEVSXTogRG9uJ3QKLQlib3RoZXIgZXhwbGljaXRseSBpbml0aWFsaXppbmcgdG8gemVybyB2YWx1ZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpIFtUQ19JOTYwXTogVXNlIFNGX0dFVF9CQUxOQU1FCi0JYW5kIFNGX0dFVF9DQUxMTkFNRSBpbnN0ZWFkIG9mIHRoZSBUQ19TX0lTXyB2ZXJzaW9ucy4KLQotCSogY29uZmlnL3RjLWk5NjAuaCAoVENfQ09GRl9TRVRfTUFDSElORSk6IE5ldyBtYWNyby4gIENhbGxzCi0JdGNfaGVhZGVyc19ob29rLgotCi0JKiBjb25maWcvdGMtaTk2MC5jICh0YXJnX2hhc19pY2xhc3MpOiBVc2UgSV9DWCB8IElfQ1gyIHdoZXJlIElfQ1gKLQl3YXMgdXNlZCBwcmV2aW91c2x5LgotCSh0Y19oZWFkZXJzX2hvb2spOiBJZiBJX0NYMiBpcyBmb3VuZCwgc2V0IGZsYWdzIHRvIEZfSTk2MENBLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChwb19oYXNoKTogRGVjbGFyYXRpb24gZGVsZXRlZC4KLQkobmV4dF9vYmplY3RfZmlsZV9jaGFyUCk6IERpdHRvLgotCShyZWduYW1lcywgYXJlZ3MsIGNvaik6IE5vdyBjb25zdC4KLQkocGFyc2VfbWVtb3ApOiBTdGF0aWMgYXJyYXkgZGVmX3NjYWxlIG5vdyBjb25zdC4KLQkobWRfYmVnaW4pOiBDYXN0IGF3YXkgY29uc3Qgd2hlbiBwYXNzaW5nIGhhc2ggcm91dGluZXMgYWRkcmVzc2VzCi0Jb2YgdmFsdWVzIGluIHJlZ25hbWVzIG9yIGFyZWdzLgotCShtZF9sb25nb3B0cyk6IEFkZGVkICJsaW5rLXJlbGF4IiBhbmQgIm5vLXJlbGF4IiBoeXBoZW5hdGVkIGZvcm1zLgotCUNvbnRpbnVlIHRvIGFjY2VwdCBvbmUtd29yZCBmb3Jtcy4KLQkoc3RydWN0IHRhYmVudHJ5LCBhcmNoX3RhYik6IE1vdmVkIHRvIHRvcCBsZXZlbCBmcm9tIGluc2lkZQotCW1kX3BhcnNlX29wdGlvbi4gIE5vdyBjb25zdC4KLQkobWRfc2hvd191c2FnZSk6IFVzZSBhcmNoX3RhYiB0byBnZW5lcmF0ZSB1c2FnZSBtZXNzYWdlLiAgUHJpbnQKLQloeXBoZW5hdGVkIGZvcm1zIG9mIHJlbGF4IG9wdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmggKERFRklORV9JOTYwX0FPVVQsIFRDX1NfSVNfKiwgVENfU18qX1NZU1BST0MsCi0JVENfU19GT1JDRV9UT18qKTogTW92ZWQgZnJvbSBoZXJlLi4uCi0JKiBjb25maWcvdGMtaTk2MC5jOiAuLi4gdG8gaGVyZS4gIENoYW5nZWQgREVGSU5FX0k5NjBfQU9VVCBzdHVmZgotCXRvIHRlc3QgT0JKX0FPVVQgYW5kIE9CSl9CT1VUIGRpcmVjdGx5LgotCi0JKiBjb25maWcvdGMtaTk2MC5oIChDVFJMLCBDT0JSLCBDT0osIFJFRywgTUVNKiwgRkJSQSwgQ0FMTEosCi0JTTEtTTMsIFJFR19PUEMsIFJfKiwgU0ZSLCBMSVQsIEZQLCBPUCwgUiwgUlMsIFJMLCBSU0wsIEYsCi0Je1IsRn17LEx9ezIsNH0sIE0sIFNGUl9PSywgTElUX09LLCBGUF9PSywgUkVHX0FMSUdOLCBNRU1PUCwgSV8qKToKLQlNYWNyb3MgZGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAoQVJDSF9KWCk6IERlZmluZS4KLQkoYXJjaF90YWIpOiBJbmNsdWRlIEpYLgotCSh0YXJnX2hhc19zZnIsIHRhcmdfaGFzX2ljbGFzcyk6IEhhbmRsZSBKWC4KLQkodGNfaGVhZGVyc19ob29rKTogU2V0IGZsYWdzIHRvIEZfSTk2MEpYIGZvciBpOTYwSlguCi0KLUZyaSBKdWwgMTUgMTU6MzY6NTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IEhhZCBsYXN0IGNoYW5nZSBiYWNrd2FyZHMuCi0KLVRodSBKdWwgMTQgMTM6MjE6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2F0b2YtbnMzMmsuYzogRGVsZXRlZC4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogVXNlCi0JYmZkX2luZF9zZWN0aW9uX3B0ciBhbmQgYmZkX3VuZF9zZWN0aW9uX3B0ci4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBDb21wYXJlIHNlZ1QgdmFsdWVzIGRpcmVjdGx5LAotCXdpdGhvdXQgY2FzdGluZyB0byBpbnQgZmlyc3QuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9iZWdpbik6IFJldHVybiB2YWx1ZSBmcm9tIGhhc2hfaW5zZXJ0Ci0Jc2hvdWxkIGJlIHBvaW50ZXIgdG8gY29uc3QuICBEb24ndCBjYWxsIGV4aXQgZXhwbGljaXRseSBhZnRlcgotCWNhbGxpbmcgYXNfZmF0YWw7IGl0IHdvbid0IHJldHVybi4KLQkoY29udmVydF9paWYpOiBNYWtlIGxvY2FsIHZhcmlhYmxlIGogYmUgcG9pbnRlciB0byBiaXRfZml4Uywgc2luY2UKLQl0aGF0J3MgaG93IGl0J3MgdXNlZC4KLQkoZW5jb2RlX29wZXJhbmQsIGNhc2UgJ2InKTogSWdub3JlIHNwcmludGYgcmV0dXJuIHZhbHVlLiAgRG9uJ3QgdHJ5Ci0JY29udmVydGluZyBmcmVlcHRyIHRvIGludCBhbmQgYmFjay4KLQotCU1lcmdlZCBpbiBOUzMySyBzdXBwb3J0IHVwZGF0ZSBmcm9tIElhbiBEYWxsIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpOgotCi0JKiBjb25maWcvdGUtcGM1MzJtYWNoLmg6IE5ldyBmaWxlLiBwYzUzMi1tYWNoIHRhcmdldCBlbXVsYXRpb24uCi0KLQkqIGNvbmZpZy90ZS1uZXRic2Q1MzIuaDogTmV3IGZpbGUuIE5ldGJzZDUzMiB0YXJnZXQgZW11bGF0aW9uLgotCi0JKiBjb25maWcvdGMtbnMzMmsuaDogQWRkIGRlZmluaXRpb24gb2YgTk9QX09QQ09ERS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBwcm90b3R5cGUgZm9yIGZpeF9uZXdfbnMzMmtfZXhwLgotCi0JKiBjb25maWcvdGMtbnMzMmsuaDogQWRkIEJGRF9BU1NFTUJMRVIgc3VwcG9ydC4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKHRjX2dlbl9yZWxvYyk6IE5ldyBmdW5jdGlvbiBmb3IgQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGZpeF9uZXdfbnMzMmtfZXhwKTogR2V0IHJlbG9jIHR5cGUKLQlkaWZmZXJlbnRseSBmb3IgQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogR2V0IHJlbG9jCi0JdHlwZSBkaWZmZXJlbnRseSBmb3IgQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBTaXplIG9mIG9wY29kZSBpcyBvbmUKLQlub3QgMi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IENvZGUgZm9yIHRoZSBCRkRfQVNTRU1CTEVSCi0JY2FzZS4gQWxzbyB1c2Ugc21hcnQgbWRfcGNyZWxfYWRqdXN0IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfYXBwbHlfZml4KTogQ29kZSBmb3IgdGhlIEJGRF9BU1NFTUJMRVIKLQljYXNlLiBBbHNvIHVzZSBzbWFydCBtZF9maXhfcGNyZWxfYWRqdXN0IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfZml4X3BjcmVsX2FkanVzdCk6IE5ldyBmdW5jdGlvbiB3aGljaCBjYW4KLQlmaW5kIG9mZnNldCBmcm9tIG9wY29kZSB0byBvcGVyYW5kIGV2ZW4gaWYgaW4gYW5vdGhlciBmcmFnCi0JYW5kIGluIHRoZSBwcmVzZW5jZSBvZiByZWxheGluZy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX3BjcmVsX2FkanVzdCk6IE5ldyBmdW5jdGlvbiB3aGljaCBjYW4KLQlmaW5kIG9mZnNldCBmcm9tIG9wY29kZSB0byBvcGVyYW5kIGV2ZW4gaWYgaW4gYW5vdGhlciBmcmFnCi0JYW5kIGluIHRoZSBwcmVzZW5jZSBvZiByZWxheGluZy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX251bWJlcl90b19kaXNwKTogQ2hlY2sgcmFuZ2VzIHByb3Blcmx5LgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfYXRvZik6IHVzZSBhdG9mX2llZWUgaW5zdGVhZCBvZiBzcGVjaWFsCi0JYXRvZl9uczMyay4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKHJlbG9jKTogTmV3IChzdGF0aWMpIGZ1bmN0aW9uIGZvcgotCUJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChjb252ZXJ0X2lpZik6IE1vcmUgY29ycmVjdCBwYyByZWxhdGl2ZSBjb2RlLgotCW1kX3JlbGF4IG11c3QgYmUgYWJsZSB0byBmaW5kIG9wY29kZSBhZGRyZXNzIGV2ZW4gaWYgaW4gYW5vdGhlciBmcmFnLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYzogTW9yZSBleHRlbnNpdmUgY29tbWVudHMuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChlbmNvZGVfb3BlcmFuZCk6IFN1cHBvcnQgbmV3IG9wZXJhbmQgY2xhc3NlcyBJCi0JYW5kIFouIERyb3AgUS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGZpeF9uZXdfbnMzMmtfZXhwKTogbmV3IGZ1bmN0aW9uIGFuZAotCWNvcnJlc3BvbmRpbmcgcHJvdG90eXBlLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYzogbWFrZSAzMjUzMiBkZWZhdWx0IG1hY2hpbmUgaW5zdGVhZCBvZiAzMjAzMi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IGluY2x1ZGUgb3Bjb2RlL25zMzJrLmggYWZ0ZXIgYXMuaAotCi0JKiBhb3V0X2dudS5oOiByX2Rpc3AgbmVlZHMgdG8gYmUgMiBiaXRzIGZvciBUQ19OUzMySwotCi0JKiB3cml0ZS5oOiBmeF9pbV9kaXNwIG5lZWRzIHRvIGJlIDIgYml0cyBiaWcgZm9yIFRDX05TMzJLCi0KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBVc2UgVENfUENSRUxfQURKVVNUIG1hY3JvIChpZiBkZWZpbmVkKQotCWluc3RlYWQgb2YgYWRkaW5nIHBjcmVsX2FkanVzdC4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBBZGp1c3QgdG9fYWRkciBmb3IgdGhlCi0JQlJPS0VOX0RPVF9XT1JEIGZlYXR1cmUgZm9yIHRoZSBCRkRfQVNTRU1CTEVSIGNhc2UuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIFRDX0NPTlNfRklYX05FVyBpZiBpdCBpcyBkZWZpbmVkLgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IEFkZCBjb2RlIChjdXJyZW50bHkgaWYKLQlCRkRfRkFTVF9TRUNUSU9OX0ZJTEwgaXMgZGVmaW5lZCkgdG8gbWFrZSBsYXJnZSBmaWxscyBhIGxvdCBmYXN0ZXIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIG5zMzJrIGZyb20gc3BlY2lhbCBGUCBsaXN0LiBBbGwgdGhlIG5zMzJrCi0Jc2VyaWVzIHVzZSBpZWVlIGZsb2F0LgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBuczMyay1wYzUzMi1tYWNoIGFuZCBuczMyay1wYzUzMi1uZXRic2QgdGFyZ2V0cwotCi0JKiBhcy5oOiBpbmNsdWRlIGV4cHIuaCBiZWZvcmUgdGFyZy1lbnYuaC4gU29tZSB0YXJnZXQgZGVwZW5kZW50IGZpbGUKLQl3YW50IHRvIHVzZSBleHByIHN0cnVjdHVyZXMuCi0KLVdlZCBKdWwgMTMgMTQ6NDk6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQ2hhbmdlIHJwIHRvIGJlIGEgY29uc3QgcG9pbnRlci4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQ2xlYXIgY3B1IGZpZWxkIG9mIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIGJlZm9yZQotCXNldHRpbmcgYSBuZXcgY3B1IHR5cGUuICBDbGVhciBub182ODg4MSBmb3IgbTY4ODgxIG9yIG02ODg4Mi4KLQlDbGVhciBub182ODg1MSBmb3IgbTY4ODUxLgotCi1UdWUgSnVsIDEyIDIxOjI3OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1zeXN2LmggKHJlYWxsb2MpOiBEZWNsYXJlLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9jcmVhdGUpOiBOZXcgZnVuY3Rpb24sIG1vc3Qgb2YgdGhlIGd1dHMgb2YgdGhlCi0Jb2xkIHN5bWJvbF9uZXcgZnVuY3Rpb24uCi0JKHN5bWJvbF9uZXcpOiBOb3cganVzdCBjaGVja3Mgc3ltYm9sX3RhYmxlX2Zyb3plbiwgY2FsbHMKLQlzeW1ib2xfY3JlYXRlLCBhbmQgZW50ZXJzIHRoZSBzeW1ib2wgaW50byB0aGUgc3ltYm9sIHRhYmxlLgotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IElmIEVNSVRfU0VDVElPTl9TWU1CT0xTIGlzIG5vdCB0cnVlLAotCWFuZCB0aGUgc3ltYm9sIHRhYmxlIGlzIGZyb3plbiwgY2FsbCBzeW1ib2xfY3JlYXRlIGluc3RlYWQgb2YKLQlzeW1ib2xfbmV3LgotCSogc3ltYm9scy5oIChzeW1ib2xfY3JlYXRlLCBzeW1ib2xfdGFibGVfZnJvemVuKTogRGVjbGFyZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyk6IEFsd2F5cyBhIGZ1bmN0aW9uIG5vdy4KLQkqIHN0cnVjLXN5bWJvbC5oIChzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyk6IERlbGV0ZWQgbWFjcm8KLQl2ZXJzaW9uLgotCi0JKiBzeW1ib2xzLmMgKGRlYnVnX3ZlcmlmeV9zeW1jaGFpbik6IE5ldyBtYWNybywgZGVmaW5lZCB0byBiZQotCXZlcmlmeV9zeW1ib2xfY2hhaW4gb3IgYSBjYXN0IHRvIHZvaWQsIGRlcGVuZGluZyBvbiBERUJVR19TWU1TLgotCShtYW55IGZ1bmN0aW9ucyk6IEludm9rZSBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gdW5jb25kaXRpb25hbGx5LgotCi1UdWUgSnVsIDEyIDEyOjA2OjQyIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0B4MS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmg6IGNoYW5nZSBjYWxsaW5nIGludGVyZmFjZSBvZgotCU9CSl9HRU5FUkFURV9BU01fTElORV9TVEFCLgotCSogY29uZmlnL29iai1lbGYuaDogZGl0dG8uCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGRpdHRvLgotCSogZWNvZmYuaDogY2hhbmdlIGNhbGxpbmcgaW50ZXJmYWNlIG9mCi0JZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYi4KLQkqIGVjb2ZmLmMgKGFkZF9maWxlKTogcmVjb3JkIG9mIGZpbGVuYW1lIHRvIGhhbmRsZSBjYXNlIG9mIGluY2x1ZGUKLQlmaWxlcywgYWxzbyBjaGFuZ2UgZGVmYXVsdCBidWlsdC1pbiB0eXBlIGZyb20gaW50IHRvIHZvaWQgZm9yCi0JYXNtIGZpbGUuCi0JKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogaGFuZGxlIGNhc2Ugb2YgaW5jbHVkZQotCWZpbGVzLgotCi1Nb24gSnVsIDExIDE3OjIwOjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBJbiBjYXNlIE1fTEFfQUIsIFNWUjRfUElDLCBsYXJnZQotCWNvbnN0YW50LCBhbmQgY2FzZSBsZGRfc3RkLCBzZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRlbXBvcmFyaWx5IHRvCi0JYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZXhwZWN0ZWQgbm9wIGluc3RydWN0aW9uLgotCi1TYXQgSnVsICA5IDAwOjA1OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfbGluZW5vKTogSGFuZGxlIGNvdW50IGNvcnJlY3RseSBmb3IgbGFzdAotCWxpbmUgbnVtYmVyLgotCi1GcmkgSnVsICA4IDE1OjIyOjA3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAocHJvY2Vzc19wc2V1ZG9fb3ApOiBQYXNzIHJpZ2h0IGFyZ3MgdG8gZG8gZG9fYWlmLgotCShnZXRfYW55X3N0cmluZyk6IE5ldyBhcmcgJ3ByZXRlbmRfcXVvdGUnLgotCShnZXRfYW5kX3Byb2Nlc3MsIGRvX2Zvcm1hbHMsIG1hY3JvX2V4cGFuZCwgZG9fc2RhdGEsCi0JcHJvY2Vzc19wc2V1ZG9fb3ApOiBVc2UgbmV3IGFyZy4KLQotRnJpIEp1bCAgOCAxMjoyMzo0NCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmg6IGRlZmluZSBtYWNybyBPQkpfR0VORVJBVEVfQVNNX0xJTkVfU1RBQi4KLQkqIGNvbmZpZy9vYmotZWxmLmg6IGRpdHRvLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBnZW5lcmF0ZSBsaW5lIHN0YWJzIGZvciBhc20gZmlsZS4KLQkqIHJlYWQuaDogYWRkIGV4dGVybiBnZW5lcmF0ZV9hc21fbGluZV9zdGFiLgotCSogZWNvZmYuaCA6IGFkZCBwcm90b3R5cGUgZm9yIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIoKS4KLQkqIGVjb2ZmLmMgKGFkZF9maWxlKTogaWYgdGhlcmUncyBubyBmaWxlbmFtZSBwcm92aWRlZCwgc2V0IHN3aXRjaAotCXRvIGdlbmVyYXRlIGxpbmUgc3RhYnMgZm9yIC5zIGZpbGUuCi0JKiBlY29mZi5jIChhZGRfcHJvY2VkdXJlKTogYWRkIHN0YWJzIHN5bWJvbCBmb3IgLmVudCBkaXJlY3RpdmUuCi0JKiBlY29mZi5jIChnZW5lcmF0ZV9lY29mZl9zdGFiKTogY3JlYXRlcyBhbiBhcnRpZmljaWFsIHN0YWJzLgotCSogZWNvZmYuYyAoZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYik6IGdlbmVyYXRlIGEgYXJ0aWZpdGlhbCBsYWJlbAotCWZvciBlYWNoIGxpbmUgYW5kIGdlbmVyYXRlIGEgc3RhYm4gZm9yIHRoZSBsaW5lLgotCi1UaHUgSnVsICA3IDE3OjA0OjAzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAoZ2V0X2FueV9zdHJpbmcpOiBDb3BlIHdpdGggZ2V0dGluZyBhIHN0cmluZyB3aXRoIGFuCi0JYWx0ZXJuYXRlIGJhc2Ugc3BlY2lmaWVyLgotCShkb19haWYsIGRvX2FlbHNlKTogT25seSBlbmFibGUgb3V0cHV0IGlmIGV4cHJlc3Npb24gaXMgdHJ1ZSBhbmQgcHJldmlvdXMKLQlsZXZlbCB3YXMgb24uCi0JKGNoYXJ0eXBlX2luaXQpOiAgQWRkIEJBU0VCSVQgY2hhcnR5cGUuCi0JKHByb2Nlc3NfcHNldWRvX29wKTogIE5vdGljZSBuZXN0ZWVkIEFJRnMuCi0KLVRodSBKdWwgIDcgMTI6MzA6MjIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuYyAoZG9fYV9maXhfaW1tKTogQ29kZSBmb3IgMiBiaXQgcmVsb2MgdHlwZSB1c2luZyBpbiB0cmFwYQotCWluc24uICAoZml4IHByIDUxNjUsIDUxNzQpCi0KLVRodSBKdWwgIDcgMTE6MzE6MzIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKFJfRExUX1JFTCk6IElmIGl0IGlzbid0IGRlZmluZWQsIHRoZW4gZGVmaW5lCi0JdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUgdG8gYXZvaWQgbG9zaW5nIG9uIG9sZCBocHV4IHN5c3RlbXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBSZWplY3QgcmVkdWN0aW9ucyBmb3IKLQlzeW1ib2xzIGluIERMVCByZWxhdGl2ZSByZWxvY3MuCi0JKHRjX2dlbl9yZWxvYyk6IFplcm8gb3V0IHRoZSBhZGRlbmQgZmllbGQgZm9yIERMVCByZWxhdGl2ZSByZWxvY3MuCi0KLVdlZCBKdWwgIDYgMDE6MDc6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY190Yyk6IElmIG5vdCBPQkpfQ09GRiwgZm9yY2UgVE9DIGVudHJ5IHRvCi0JYWxpZ24gdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkuCi0KLVR1ZSBKdWwgIDUgMTU6NDI6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IEhhbmRsZSAzMi1iaXQgYWRkZW5kcy4KLQkoZ3BkaXNwX2hpMTZfaG93dG8pOiBOb3cgcG9pbnRzIHRvIGNvbnN0LgotCShsb2FkX2luc25fdGFibGUsIGFscGhhX2lwKTogRml4IHVzZXMgb2YgY29uc3QuCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogVXBkYXRlcyB0byBDT0ZGIGRlc2NyaXB0aW9uLiAgQWRkZWQgIkBlbmQKLQlkZWZtYWMiIGFzIG5lZWRlZCwgYW5kIHNvbWUgZXh0cmEgaGVhZGluZyBhbmQgIkBieWUiIHNvIGl0J2xsCi0JZm9ybWF0IGFzIGEgc2VwYXJhdGUgZG9jdW1lbnQuCi0KLVR1ZSBKdWwgIDUgMTM6NTQ6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX0dFVF9BTElHTiwgU19TRVRfQUxJR04pOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IFNldCBhbGlnbm1lbnQgb2YgY29tbW9uCi0Jc3ltYm9sLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogSWYgT0JKX0VMRiwgc2V0IGFsaWdubWVudCBvZgotCWNvbW1vbiBzeW1ib2wuCi0KLU1vbiBKdWwgIDQgMTg6Mjk6NDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGlzX2NvbXBsZXgpOiBOZXcgbWFjcm8uCi0JKGNvbnNfZml4X25ld19ocHBhKTogIkhhbmRsZSIgY29tcGxleCBleHByZXNzaW9ucy4KLQotRnJpIEp1bCAgMSAwMDo0ODoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFNldCBzX2FsaWduIGZpZWxkIGZyb20KLQlzZWN0aW9uX2FsaWdubWVudCBhcnJheS4KLQotVGh1IEp1biAzMCAxNTowNToyOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBiZmRfY29tX3NlY3Rpb25fcHRyLgotCSogYXMuaCAoYWJzb2x1dGVfc2VjdGlvbiwgdW5kZWZpbmVkX3NlY3Rpb24pOiBVc2UgbmV3IEJGRCBtYWNyb3MKLQliZmRfYWJzX3NlY3Rpb25fcHRyIGFuZCBiZmRfdW5kX3NlY3Rpb25fcHRyLgotCi1UaHUgSnVuIDMwIDE0OjM2OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBGb3IgTV9MSV9TUywgZGVjaWRlIGhvdyB0byBoYW5kbGUgaXQKLQliYXNlZCBvbiBjb250ZW50cyBvZiBpbW1fZXhwciBhbmQgb2Zmc2V0X2V4cHIsIHJhdGhlciB0aGFuCi0JbWlwc19waWMuICBGb3IgTV9MSV9ERCwgZGVjaWRlIGhvdyB0byBoYW5kbGUgaXQgYmFzZWQgb24gc2VnbWVudAotCW5hbWUgb2Ygb2Zmc2V0X2V4cHIsIHJhdGhlciB0aGFuIG1pcHNfcGljLgotCShtaXBzX2lwKTogSWYgZ19zd2l0Y2hfdmFsdWUgPCA0LCB1c2UgaW1tZWRpYXRlIHZhbHVlcyBmb3IgJ2wnLgotCUlmIGdfc3dpdGNoX3ZhbHVlIDwgOCwgdXNlIC5yZGF0YSByYXRoZXIgdGhhbiAubGl0IGZvciAnTCcuCi0KLVdlZCBKdW4gMjkgMTc6MzA6NDYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogQnJlYWsgbG9uZyBzdHJpbmcgaW50byBzaG9ydGVyIG9uZXMuCi0JKHBhcnNlX2FyZ3MpOiBBZGQgLXYsIHByaW50cyB2ZXJzaW9uIGlkIGFuZCBjb250aW51ZXMuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogQnJlYWsgbG9uZyBzdHJpbmcuCi0KLU1vbiBKdW4gMjcgMDk6NDc6MTYgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiAgY29uZmlnL3RjLWkzODYuYyAobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlICItViIgYW5kICItUSIgaWYKLQlPQkpfRUxGIGlzIGRlZmluZWQuCi0KLVN1biBKdW4gMjYgMTY6MzA6NDggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcy5jIChtYWluKSBbSE9TVF9TUEVDSUFMX0lOSVRdOiBOZXcgaG9vaywgZm9yIGhvc3Qtc3BlY2lmaWMKLQlpbml0aWFsaXphdGlvbi4KLQotV2VkIEp1biAyMiAwMDoyNDo1NSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAob2JqX2Zyb2Jfc3ltYm9sKTogRGVmaW5lIGZvciBPQkpfRUxGLgotCU1vcmUgZ2FzL2JmZCBsb3NzYWdlIGV4cG9zZWQgYnkgdGhlIG5ldyBsaW5rZXIgY29kZS4KLQotVHVlIEp1biAyMSAxMTozMjoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IENsZWFyIHNlZ2luZm8gYWZ0ZXIgYWxsb2NhdGluZyBpdC4KLQkoc3Vic2VnX2dldCk6IFBhc3MgYWN0dWFsIHNpemUgb2Ygc2VnaW5mbyB0byBtZW1zZXQuCi0KLQkqIHN1YnNlZ3MuYyAoYWJzX3NlZ19pbmZvLCB1bmRfc2VnX2luZm8pOiBEZWZpbmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkoc3Vic2VnX2NoYW5nZSk6IFN0b3JlIHNlZ19pbmZvIGZvciBiZmRfYWJzX3NlY3Rpb25fcHRyIGluCi0JYWJzX3NlZ19pbmZvLCBhbmQgc3RvcmUgc2VnX2luZm8gZm9yIGJmZF91bmRfc2VjdGlvbl9wdHIgaW4KLQl1bmRfc2VnX2luZm8uCi0JKHN1YnNlZ19nZXQpOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IHNldCBvdXRwdXRfc2VjdGlvbiBpZiBpdCBpcwotCWFscmVhZHkgc2V0LgotCShzZWdfaW5mbyk6IERlZmluZSBhcyBmdW5jdGlvbi4KLQkqIHN1YnNlZ3MuaCAoc2VnX2luZm8pOiBEZWNsYXJlIGFzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGRlZmluaW5nCi0JYXMgbWFjcm8uCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBDYWxsIHNlZ19pbmZvIHJhdGhlciB0aGFuCi0JYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhLgotCi1Nb24gSnVuIDIwIDE2OjMwOjU0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocHBjLSotZWxmKik6IE5ldyB0YXJnZXQsIGxpa2UgLXN5c3Y0Ki4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSWYgIjBmIiBpcyBmb2xsb3dlZCBieSAnXDAnLCBkb24ndCBkbyBlb2wKLQljaGVja3MuCi0KLU1vbiBKdW4gMjAgMTU6MTc6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9hdXgpOiBDYWxsIHN3YXBfdGlyX291dCBhbmQgc3dhcF9ybmR4X291dAotCXZpYSBiYWNrZW5kIHBvaW50ZXIsIG5vdCBkaXJlY3RseS4KLQotRnJpIEp1biAxNyAxODowNTowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWctc3RhbXApOiBNYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0JZWxlbWVudCBpbiB0aGUgZm9yIGxvb3AuCi0KLUZyaSBKdW4gMTcgMTE6MDE6MDQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IE1pc2MgdHJpdmlhbCBjaGFuZ2VzIHRvIG1ha2UgZ2NjIC1XYWxsIGhhcHB5LgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQotV2VkIEp1biAxNSAyMDo0NDo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQ2FzdCB4bWFsbG9jIHJldHVybiB2YWx1ZS4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IElmICQoZGVmcykgY29udGFpbnMgbXVsdGlwbGUgd29yZHMsCi0JZW1pdCBhICNkZWZpbmUgbGluZSBmb3IgZWFjaC4KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIHNwYXJjNjQgdGFyZ2V0LCB1c2Ugc3BhcmMgY3B1IGZpbGVzIGFuZCBhZGQKLQlzcGFyY3Y5IHRvIGV4dHJhX2RlZnMuICBObyBsb25nZXIgdHJlYXQgc3BhcmM2NC0qLWFvdXQqIHNwZWNpYWxseS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1lbWJhcl9tYXNrcyk6IE5vdyBzdGF0aWMgYW5kIGNvbnN0LgotCShtZF9zaG93X3VzYWdlKSBbIU5PX1Y5XTogQWRkIC1BdjkgdG8gdXNhZ2UgbWVzc2FnZS4KLQkoY3VycmVudF9hcmNoaXRlY3R1cmUpIFtzcGFyY3Y5XTogSW5pdGlhbGl6ZSB0byB2OS4KLQkobWRfYmVnaW4pIFtzcGFyY3Y5XTogRG9uJ3QgYm90aGVyIGNoYW5naW5nIGl0IHVuY29uZGl0aW9uYWxseQotCWhlcmUuCi0JKHNfcmVzZXJ2ZSk6IERvbid0IHBhc3MgdW5leHBlY3RlZCBhcmd1bWVudCB0byBhc19iYWQgd2l0aAotCWJhZC1zZWdtZW50IG1lc3NhZ2UuCi0KLQkqIGFzLmggKGJmZF9hbGxvY19ieV9zaXplX3QpIFtCRkRfQVNTRU1CTEVSXTogRGVjbGFyZS4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChpbnRfdG9fZ2VuKTogQ29tbWVudGVkIG91dCB1bnVzZWQgcm91dGluZS4KLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZWQgY2hlY2sgb2Ygb3BlcmFuZCBzZWN0aW9uLgotCi0JRnJpIEp1biAgMyAxNzoyNTowOCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAoREJHX1NfQ19DT01QTFg0LCBEQkdfU19DX0NPTVBMWDgpOiBkZWZpbmUKLQl0aGVzZSBuZXcgVk1TIHN5bWJvbC10eXBlIG1hY3JvcyBmb3IgYGNvbXBsZXggZmxvYXQnIGFuZAotCWBjb21wbGV4IGRvdWJsZScgc3VwcG9ydC4gIFRoZWlyIHZhbHVlcyBjb21lIGZyb20gdGhlIGV4aXN0aW5nCi0JRFNDJEtfRFRZUEVfRkMgYW5kIERTQyRLX0RUWVBFX0RDIG1hY3JvcyBpbiA8ZGVzY3JpcC5oPi4KLQkoREJHX1NfQ19SRUFMOF9HLCBEQkdfU19DX0NPTVBMWDhfRyk6IEdfZmxvYXQgdmVyc2lvbnMgb2YKLQlSRUFMOCBhbmQgQ09NUExYODsgbm90IHVzZWQgeWV0LCBiZWNhdXNlIGdjYyBvdXRwdXRzIHRoZSBzYW1lCi0JLnN0YWJzIGZvciBgZG91YmxlJyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYC1tZycgaXMgdXNlZC4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU190eXBlZGVmX3BhcnNlKSBbY2FzZSAnciddOiBhZGQgZW50cmllcwotCWZvciBnY2MyJ3MgcHJlZGVmaW5lZCB0eXBlcyAiY29tcGxleCBmbG9hdCIsICJjb21wbGV4IGRvdWJsZSIsCi0JYW5kICJjb21wbGV4IGxvbmcgZG91YmxlIiAoaWRlbnRpY2FsIHRvIGNvbXBsZXggZG91YmxlKS4KLQotV2VkIEp1biAxNSAxMjozMjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogVXNlIENfU1RBVCBmb3IgdGhlIC50ZXh0Ci0Jc2VjdGlvbiBzeW1ib2wsIG5vdCBDX0xBQkVMLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogUGVybWl0IGEgbW9kaWZpZXIgaW4gJ28nIGNhc2UsIGFuZAotCXBlcm1pdCBub24gY29uc3RhbnQgZXhwcmVzc2lvbnMgaW4gJ3UnIGNhc2UuICBMZXRzIGBgbHVpCi0JJDgsJWhpKGZvbyk7IGx3ICQ4LCVsbyhmb28pKCQ4KScnIHdvcmsgY29ycmVjdGx5LgotCi1Nb24gSnVuIDEzIDEyOjA4OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogV2FybiBhYm91dCBhbiBhdHRlbXB0Ci0JdG8gcHV0IGEgY29tbW9uIHN5bWJvbCBpbiBhIHNldC4KLQotU2F0IEp1biAxMSAxNjo0MToyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgd2VhayBzeW1ib2xzIGFzIGFuIGV4dGVuc2lvbiB0byBhLm91dC4KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IE9ubHkgcHJlc2VydmUgZXh0ZXJuYWwgYml0IGZvciBPQkpfQU9VVCBhbmQKLQlPQkpfQk9VVCBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9hb3V0X2dudS5oIChOX1dFQUtVLCBOX1dFQUtBLCBOX1dFQUtULCBOX1dFQUtELCBOX1dFQUtCKToKLQlEZWZpbmUgYXMgaW4gLi4vaW5jbHVkZS9hb3V0L2FvdXQ2NC5oLgotCSogY29uZmlnL29iai1hb3V0LmggKE9CSl9TWU1GSUVMRF9UWVBFKTogSWYgbm90IEJGRF9BU1NFTUJMRVIsCi0JZGVmaW5lIGFzIGNoYXIuCi0JKFNfR0VUX1dFQUssIFNfU0VUX1dFQUspOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3BzZXVkb190YWJsZSk6IEFkZCAid2VhayIuCi0JKG9ial9lbWl0X3N5bWJvbHMpOiBBZGp1c3QgdHlwZSBvZiB3ZWFrIHN5bWJvbHMuCi0JKG9ial9hb3V0X3dlYWspOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1GcmkgSnVuIDEwIDEzOjQ4OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogRG9uJ3Qgc2V0IGFueSBmbGFncyBiYXNlZCBvbgotCXRoZSB0eXBlIG9mIGEgc3BlY2lhbCBzZWN0aW9uLgotCi0JKiBjb25maWcvaG8tc3Vub3MuaDogSW5jbHVkZSA8c3RkbGliLmg+LiAgRG9uJ3QgZGVjbGFyZSBtYWxsb2MsCi0JcmVhbGxvYywgZnJlZSwgb3IgYXRvbC4KLQotV2VkIEp1biAgOCAwNjoyODozNyAxOTk0ICBCaWxsIENveCAgKGJpbGxAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogRGVsZXRlIGFzLm5ldyBkZXBlbmRlbmN5LCBzbyB0aGF0Ci0JcmVncmVzc2lvbiB0ZXN0IGRvZXNuJ3QgdHJpZ2dlciBhbiBhc3NlbWJsZXIgYnVpbGQuCi0KLVR1ZSBKdW4gIDcgMTM6MzM6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4sIHJlYWxjbGVhbik6IE5ldyB0YXJnZXRzLgotCSogZG9jL01ha2VmaWxlLmluLCB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi1Nb24gSnVuICA2IDEzOjEwOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoUkRBVEFfU0VDVElPTl9OQU1FKTogRGVmaW5lLgotCShtYWNybyk6IENvcnJlY3QgTV9MSV9TUyBTVlI0X1BJQy9FTUJFRERFRF9QSUMgY2FzZS4gIEFmdGVyIE1fTElfRAotCW9yIE1fTF9ET0Igb3IgbGFiZWwgZG9iLCBmb3JjZSBhIG5ldyBmcmFnIHRvIGF2b2lkIGdldHRpbmcKLQljb25mdXNlZCBpbiB0Y19nZW5fcmVsb2MuCi0JKG1pcHNfaXApOiBVc2UgUkRBVEFfU0VDVElPTl9OQU1FLCBub3QgLnJkYXRhLgotCShzX2NoYW5nZV9zZWMpOiBMaWtld2lzZS4KLQotRnJpIEp1biAgMyAyMzozNTozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogVXNlIG1lbXNldCB0byB6ZXJvIG91dCBtZW1vcnksIHJhdGhlciB0aGFuCi0JZ29pbmcgdGhyb3VnaCBtZF9udW1iZXJfdG9fY2hhcnMuICBUaGlzIHBlcm1pdHMgaGFuZGxpbmcgc3ltYm9saWMKLQlhcmd1bWVudHMgd2hlbiB0aGUgc2l6ZSBpcyBsYXJnZXIgdGhhbiBzaXplb2YgKHZhbHVlVCksIGlmCi0JVENfQ09OU19GSVhfTkVXIGlzIHByZXBhcmVkIHRvIGhhbmRsZSB0aGUgY2FzZSAoYXMgaXQgaXMgb24gTUlQUykuCi0KLUZyaSBKdW4gIDMgMTI6NTA6MTMgMTk5NCAgRGF2aWQgSi4gTWFjS2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcy5jIChzaG93X3VzYWdlKSwgY29uZmlnL3RjLWFscGhhLmMgKG1kX3Nob3dfdXNhZ2UpLAotCWNvbmZpZy90Yy1taXBzLmMgKG1kX3Nob3dfdXNhZ2UpOiBGaXggdXAgbWVzc2FnZXMuCi0KLQkqIGFzLmg6IFJlcGxhY2UgZmxhZ3NlZW4gd2l0aCBzZXBhcmF0ZSB2YXJpYWJsZXMuCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogU2V0IHRoZW0uICBEb24ndCBhY2NlcHQgLTEgb3B0aW9uLCBvciAtdgotCWV4cGxpY2l0bHkgKGl0J3MgYSBzeW5vbnltIGZvciAtLXZlcnNpb24pLgotCSogYXMuYywgaW5wdXQtc2NydWIuYywgbWVzc2FnZXMuYywgcmVhZC5jLCBzeW1ib2xzLmMsIHdyaXRlLmMsCi0JY29uZmlnL29iai1hb3V0LmMsIGNvbmZpZy9vYmotYW91dC5oLCBjb25maWcvb2JqLWJvdXQuYywKLQljb25maWcvb2JqLWJvdXQuaCwgY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZi5oLAotCWNvbmZpZy9vYmotdm1zLmMsIGNvbmZpZy90Yy1ocHBhLmMsIGNvbmZpZy90Yy1pMzg2LmMsCi0JY29uZmlnL3RjLWk5NjAuYywgY29uZmlnL3RjLW02OGsuYywgY29uZmlnL3RjLW1pcHMuYywKLQljb25maWcvdGMtdmF4LmM6IFVzZSB0aGUgbmV3IGZsYWcgdmFyaWFibGVzIGluc3RlYWQgb2YgZmxhZ3NlZW4uCi0JKiBjb25maWcvdGMtdmF4LmMgW09CSl9WTVNdOiBSZWNvZ25pemUgLSssIC0xLCAtdiwgYW5kIGRvY3VtZW50IGluCi0JdXNhZ2UuCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBSZW1vdmUgdGFyZ2V0IHNwZWNpZmljIG1lc3NhZ2VzOwotCWluc3RlYWQsIGNhbGwgbWRfc2hvd191c2FnZS4KLQkocGFyc2VfYXJncyk6IFVzZSBnZXRvcHRfbG9uZ19vbmx5LiAgVGFrZSBwb2ludGVycyB0byBhcmdjIGFuZAotCWFyZ3YuCi0JKG1haW4pOiBQYXNzIHBhcnNlX2FyZ3MgcG9pbnRlcnMuCi0JKiBhcy5oOiBSZW1vdmUgMyB2YXJpYWJsZXMgdGhhdCBhcmUgcmVkdW5kYW50IHdpdGggZmxhZ3NlZW4uCi0JKiBhcy5jLCBtZXNzYWdlcy5jOiBDaGFuZ2UgdGhlaXIgdXNlcnMgdG8gdXNlIGZsYWdzZWVuLgotCURlZmluZSBnZXRvcHQgc3R1ZmYuCi0JKiB0Yy5oOiBVcGRhdGUgbWRfcGFyc2Vfb3B0aW9uIGRlY2wuICBBZGQgbWRfc2hvd191c2FnZSBkZWNsLgotCSogY29uZmlnL3RjLSouYzogQWRkIG1kX3Nob3J0b3B0cywgbWRfbG9uZ29wdHMsCi0JbWRfbG9uZ29wdHNfc2l6ZSwgbWRfc2hvd191c2FnZS4gIENoYW5nZSBjYWxsaW5nIGNvbnZlbnRpb24gZm9yCi0JbWRfcGFyc2Vfb3B0aW9uLiAgUmVtb3ZlIG1kX3BhcnNlX2xvbmdfb3B0aW9uLgotCSogY29uZmlnL3RjLW5zMzJrLmM6IFJlbmFtZSBgc3RydWN0IG9wdGlvbicgdG8gYHN0cnVjdCBuczMya19vcHRpb24nLgotCSogY29uZmlnL3RjLWkzODYuaDogRG9uJ3QgZGVmaW5lIG1kX3BhcnNlX29wdGlvbi4KLQotVGh1IEp1biAgMiAxMzo1NDo0NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKHBhcnNlX2FyZ3MpOiBDb2RlIG1vdmVkIGZyb20gbWFpbi4KLQlSZWNvZ25pemUgLS1oZWxwIGFuZCAtLXZlcnNpb24uCi0JKiBjb25maWcvdGMtbnMzMmsuaDogRGVmaW5lIFRDX05TMzJLLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IGFsbCBvZiB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGNvbW1hbmQKLQlsaW5lIG9wdGlvbnMuCi0KLVRodSBKdW4gIDIgMTI6MDc6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChoYXNoX25ld190YWJsZSk6IENsZWFyIG5ld2x5IGFsbG9jYXRlZCB0YWJsZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoZW51bSBfcmVnaXN0ZXIpOiBBZGQgNjgwNjAgY29udHJvbCByZWdpc3RlcnMKLQlCVVNDUiBhbmQgUENSLgotCShsYXN0X21vdmVjX3JlZyk6IE5ldyBtYWNyby4KLQkobTY4MDAwX2NvbnRyb2xfcmVncywgbTY4MDEwX2NvbnRyb2xfcmVncywgbTY4MDIwX2NvbnRyb2xfcmVncywKLQltNjgwNDBfY29udHJvbF9yZWdzLCBtNjgwNjBfY29udHJvbF9yZWdzKTogTmV3IGFycmF5cy4KLQkoY29udHJvbF9yZWdzKTogTmV3IHBvaW50ZXIuCi0JKG02OGtfaXApOiBVc2UgY29udHJvbF9yZWdzIGluc3RlYWQgb2YgdGVzdGluZyBDUFUgZXZlcnkgdGltZS4KLQlVc2UgbGFzdF9tb3ZlY19yZWcgdG9vLiAgSW4gZXJyb3IgbWVzc2FnZXMsIGhhbmRsZSA2ODA2MCwgYW5kCi0JcHJpbnQgNjgwNjAgZm9yIG1mbG9hdCwgdG9vLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IEhhbmRsZSAiNjgwNjAiLiAgVXNlIG02ODA0MHVwIGZvciBtYWtpbmcKLQltNjg4NTEgY2hvaWNlLiAgU2V0IGNvbnRyb2xfcmVncy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlICI2ODA2MCIuCi0JKiBjb25maWd1cmUuaW46IFNldHRpbmcgY3B1X3R5cGUsIHJlY29nbml6ZSBtNjgwNjAgdG9vLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCkgWyFCRkRfQVNTRU1CTEVSXQotCVtESUZGX0VYUFJfT0tdOiBEbyBjb252ZXJzaW9uIHRvIHBjLXJlbGF0aXZlIGZvciBkaWZmZXJlbmNlLCBldmVuCi0JaWYgcGNyZWwgaXMgYWxyZWFkeSBzZXQuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCB0aGlzX2djY19yZXF1aXJlc190aGVfZ251X2Fzc2VtYmxlciBpbiBhbGwKLQlsb3dlci1jYXNlLCBpbiBjYXNlIHdlJ3JlIGlnbm9yaW5nIGNhc2Ugb2Ygb3Bjb2RlcyBpbiB0aGUgaW5wdXQKLQlmaWxlLgotCi0JKiBkb2MvYXMudGV4aW5mbyAoLnNlY3Rpb24pOiBEb2N1bWVudCBhcyB1bmF2YWlsYWJsZSBmb3IgYS5vdXQKLQl0eXBlIGZvcm1hdHMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtYWNoaW5lKTogTmV3IHZhcmlhYmxlLgotCShsb2FkX2luc24pOiBOZXcgbWFjcm8uCi0JKGxvYWRfaW5zbl90YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYmVnaW4pOiBDYWxsIGxvYWRfaW5zbl90YWJsZSwgb25jZSBmb3IgYmFzaWMgaW5zdHJ1Y3Rpb25zIGFuZAotCW9uY2UgZm9yIGFwcHJvcHJpYXRlIFBBTCBpbnN0cnVjdGlvbiB0YWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IGBtYWNoaW5lJyBiYXNlZCBvbiAtbSMjIyMjIGFyZ3VtZW50cy4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaCAoYWxwaGFfcGFsMjEwNjRfb3Bjb2Rlcyk6IFNwbGl0IG91dCBmcm9tCi0JYWxwaGFfb3Bjb2Rlcy4KLQkoYWxwaGFfcGFsMjExNjRfb3Bjb2Rlcyk6IE5ldyB0YWJsZS4KLQkoTlVNMjEwNjRPUENPREVTLCBOVU0yMTE2NE9QQ09ERVMpOiBOZXcgbWFjcm9zLgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldCBpMzg2LSotbmV0YnNkMC44KTogVXNlIDM4NmJzZCBlbXVsYXRpb24uCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvLWdhc3ApOiBVc2UgJCRkaXIgd2hlbiBpbnN0YWxsaW5nCi0JZmlsZS4KLQotV2VkIEp1biAgMSAxMDo0ODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBGb3JjZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgdG8gYmUKLQlhbGlnbmVkIGNvcnJlY3RseS4KLQotRnJpIE1heSAyNyAxMDowNTo1MyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCU1lcmdlZCBpbiBjaGFuZ2VzIGZyb20gZ2FzLTIuMyBuZXQgcmVsZWFzZToKLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIGN5Z251cy0yLjMuMS4KLQotCSogY29uZmlnL29iai12bXMuYzogUmVwbGFjZWQgdW5jaGVja2VkIHVzZXMgb2YgbWFsbG9jIHdpdGgKLQl4bWFsbG9jLgotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogT25seSB0ZXN0IEJGRDY0LCBub3QKLQlCRkRfQVNTRU1CTEVSIHRvby4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpIFtCRkRfQVNTRU1CTEVSXQotCVtESUZGX0VYUFJfT0tdOiBEb24ndCBjaGVjayBwY3JlbCwganVzdCBjb252ZXJ0IGl0LgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBSZW1vdmVkIGxvdHMgb2YgZXh0cmEgc2VtaWNvbG9ucyBhZnRlcgotCWNvbXBvdW5kIHN0YXRlbWVudHMuCi0JKHN0cmNocik6IERvbid0IGRlY2xhcmUgaGVyZS4KLQotCSogY29uZmlnL2hvLXZheC5oIChyZWFsbG9jKTogRGVjbGFyZS4KLQotCSogY29uZmlnL2hvLXZtcy5oIChzdHJjaHIsIHN0cmR1cCk6IERlY2xhcmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wYXJzZV9vcHRpb24pIFtPQkpfRUxGXTogQWNjZXB0IGFuZCBpZ25vcmUKLQlvcHRpb24gYC1xJy4KLQotCVdlZCBNYXkgMTggMjA6NTA6MzUgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERCR19TX0NfU1FVQUQsIERCR19TX0NfVVFVQUQpOiBkZWZpbmUgdGhlc2UKLQluZXcgVk1TIHN5bWJvbC10eXBlIG1hY3Jvczsgc2lnbmVkIGFuZCB1bnNpZ25lZCBxdWFkd29yZCBpbnRlZ2VycywKLQlmb3IgYGxvbmcgbG9uZycgc3VwcG9ydC4gIFRoZWlyIHZhbHVlcyBjb21lIGZyb20gdGhlIGV4aXN0aW5nCi0JRFNDJEtfRFRZUEVfUVUgYW5kIERTQyRLX0RUWVBFX1EgbWFjcm9zIGluIDxkZXNjcmlwLmg+LiAgVGhlCi0JVk1TIGRlYnVnZ2VyIG5vdyByZWNvZ25pemVzIGBsb25nIGxvbmcnIHZhcmlhYmxlcyBjb3JyZWN0bHkuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfdHlwZWRlZl9wYXJzZSkgW2Nhc2UgJ3InXTogYWRkIGVudHJpZXMKLQlmb3IgZ2NjMidzIHByZWRlZmluZWQgdHlwZXMgImxvbmcgZG91YmxlIiAoc2FtZSBhcyBkb3VibGUsIGFzCi0JcGVyIGdjYydzIGN1cnJlbnQgc3RhdGUpLCAibG9uZyBsb25nIGludCIsICJsb25nIGxvbmcgdW5zaWduZWQKLQlpbnQiLCBhbmQgZmluYWwgYG90aGVyd2lzZScgY2FzZSAodG8gYXZvaWQgdW5pbml0aWFsaXplZCB0eXBlCi0JYW5kIHNpemUgZmllbGRzKS4gIFtjYXZlYXQ6ICBwcmVkZWZpbmVkIHR5cGVzICJjb21wbGV4IGludCIsCi0JImNvbXBsZXggZmxvYXQiLCAiY29tcGxleCBkb3VibGUiLCBhbmQgImNvbXBsZXggbG9uZyBkb3VibGUiIGFyZQotCXN0aWxsIG1pc3NpbmcuXQotCi0JKiBjb25maWcvaG8tdm1zLmggKEVYSVRfRkFJTFVSRSk6IGRlZmluZSBhcyAweDEwMDAwMDAyIGluc3RlYWQKLQlvZiAwLCBiZWNhdXNlIHRoZSBsYXR0ZXIgaW5kaWNhdGVzIHN1Y2Nlc3MgcmF0aGVyIHRoYW4gZmFpbHVyZQotCXdoZW4gcGFzc2VkIHRvIGBleGl0JyBvciByZXR1cm4gZnJvbSBgbWFpbicgY29tcGlsZWQgYnkgZ2NjMi4KLQotCSogY29uZmlnL29iai12bXMuYyAoYXJyYXlfc3VmZml4LCBnZW5lcmF0ZV9zdWZmaXgpOiByZXBsYWNlIHR3bwotCWhhcmRjb2RlZCBgMHhhMydzIHdpdGggbWFjcm8gREJHX1NfQ19BRFZBTkNFRF9UWVBFIGZyb20gb2JqLXZtcy5oLgotCShWTVNfdHlwZWRlZl9wYXJzZSk6IGVsaW1pbmF0ZSByZWR1bmRhbnQgaWYtdGhlbi1lbHNlIHdoZW4KLQlhbGxvY2F0aW5nIG5ldyBzeW1ib2wgZW50cnkgYW5kIGxpbmtpbmcgaXQgdG8gVk1TX1N5bWJvbF90eXBlX2xpc3QuCi0KLQlUdWUgTWF5IDE3IDIwOjQ3OjMxIDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiBkb24ndCB0cnkgdG8gaW50ZXJwcmV0Ci0JdGhlIGNvbnRlbnRzIG9mIHRoZSBHQVNfVkVSU0lPTiBzdHJpbmcgd2hlbiBmYWxsaW5nIGJhY2sgdG8gaXQgZm9yCi0JbGFuZ3VhZ2UgcHJvY2Vzc29yIGlkZW50aWZpY2F0aW9uLgotCi0JKiBtYWtlLWdhcy5jb20sIHZtc2NvbmYuc2ggKEVOVklST04pOiBmaXggbWlzc3BlbGxpbmcgb2YKLQlgcHNlY3RfYXR0cicgaW4gbGlua2VyIG9wdGlvbnMuCi0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIHRvIGxhdGVzdCBtYWtlZmlsZS5pbgotCSogY29uZmlnL3RlLWdvMzIuaDogW25ld10gZ28zMidzIGVudmlyb25tZW50Ci0KLUZyaSBNYXkgMjAgMTc6NTk6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBEb24ndCBkZWNsYXJlIHBhcmFtZXRlcnMgZm9yIHN0cnN0ci4KLQotVGh1IE1heSAxOSAxNTo0MDoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zZWN0aW9uX2FsaWduKTogRG9uJ3QgY2hhbmdlIHRoZSBzaXplIGlmCi0JT0JKX0VMRi4KLQotV2VkIE1heSAxOCAxMzowODowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVkaXJlY3QgbG4gb3V0cHV0IHRvIC9kZXYvbnVsbC4gIElmIGxuCi0JZmFpbHMgb24gZ2FzcCwgaW5zdGFsbCBnYXNwLm5ldywgbm90IGdhc3AuCi0KLVdlZCBNYXkgMTggMDk6MTY6MzYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogVXNlIFJfSFBQQV9BQlNfQ0FMTCwgbm90IFJfSFBQQSBmb3IKLQlhYnNvbHV0ZSBjYWxscy4KLQotVHVlIE1heSAxNyAxMjo1MDo0NiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2VfZnBfY21wX2NvbmQpOiBSZXBvcnQgYW4gZXJyb3IKLQlvbiBhIHBhcnRpYWwgY29tcGxldGVyIG1hdGNoLgotCi1Nb24gTWF5IDE2IDEyOjAzOjQ5IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBDaGFuZ2UgLmhwcGFfdW53aW5kIHRvIC5QQVJJU0MudW53aW5kCi0JdGhyb3VnaG91dCBjb2RlLgotCShpc19jb21wbGV4KTogRGVsZXRlIGRlZmluaXRpb24gYW5kIHN1cHBvcnQgZm9yIGNvbXBsZXggcmVsb2NhdGlvbgotCXR5cGVzLgotCSh0Y19nZW5fcmVsb2MpOiBEZWxldGUgc3BlY2lhbCB1bndpbmQgY3J1ZCBmb3IgRUxGLiAgU2ltcGxpZnkgYW5kCi0JcmV3cml0ZSBFTEYgY29kZSBiYXNlZCBvbiA5NC0wMi0wMiBQQSBFTEYgZHJhZnQgc3BlYy4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogVXNlIHN0YW5kYXJkIFBBUklTQ19ESVIzMiByZWxvY3MgZm9yCi0JdGhlIHVud2luZCBkZXNjcmlwdG9ycy4KLQotRnJpIE1heSAgNiAxNDoxMzoxNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogTmV3IG1ha2VmaWxlIGZyYWdtZW50IGZvciBnbzMyIGNyb3NzaW5nLgotCSogY29uZmlndXJlLmluIChob3N0PT1nbzMyKTogVXNlIG5ldyBmcmFnbWVudC4KLQotRnJpIE1heSAgNiAxNDozNTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkobWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9iZWdpbik6IFdoZW4gdXNpbmcgLW1hbnksIHBlcm1pdCBjb21wYXJpc29uCi0JaW5zdHJ1Y3Rpb25zIHRvIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgb3Bjb2RlIHRhYmxlLgotCi1UaHUgTWF5ICA1IDE5OjE0OjQzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlIHRvIDIuMi45MC4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KSBbQkZEX0FTU0VNQkxFUl06IERvbid0IHBlcm1pdCBhZGRpdGlvbnMKLQl0byB0aGUgc3ltYm9sIHRhYmxlIGlmIGl0J3MgYWxyZWFkeSBiZWVuIHNldCBpbiB0aGUgb3V0cHV0IGJmZC4KLQkoc3ltYm9sX2JlZ2luKSBbISBFTUlUX1NFQ1RJT05fU1lNQk9MU10gW1JFTE9DX1JFUVVJUkVTX1NZTUJPTF06Ci0JRG9uJ3QgdXNlIGJmZF9hYnNfc2VjdGlvbi5zeW1ib2wgZm9yIGdhcyBhYnNvbHV0ZSBzeW1ib2wuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoZGlzdGNsZWFuLCBjbGVhbi1kdmksIGNsZWFuLWluZm8pOiBEZWxldGUgZ2FzcAotCWZpbGVzIHRvby4KLQotVGh1IE1heSAgNSAxODoxMjo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZW1pdF9kZWxheXMpOiBNYWtlIGNhbGwgdG8KLQltaXBzX25vX3ByZXZfaW5zbiB1bmNvbmRpdGlvbmFsLgotCi1UaHUgTWF5ICA1IDE3OjI1OjM4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZiouKjogTWVyZ2VkIGNvZmZiZmQgdmVyc2lvbnMgaW50byBjb2ZmIHZlcnNpb25zLAotCXdpdGggYSBzaW5nbGUgIiNpZmRlZiBCRkRfQVNTRU1CTEVSIiBjb250cm9sbGluZyBtb3N0IG9mIGl0IGZvcgotCW5vdy4gIERlbGV0ZWQgb2JqLWNvZmZiZmQuKiBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogQWx3YXlzIHVzZSBvYmotY29mZi4qIGZvciBDT0ZGIHRhcmdldHMuCi0KLVdlZCBNYXkgIDQgMTM6MzQ6MTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RlLWRweDIuaCAoVEFSR0VUX0ZPUk1BVCwgUkVHSVNURVJfUFJFRklYX09QVElPTkFMKToKLQlEZWZpbmUuCi0JKiBjb25maWd1cmUuaW4gKG02OGstYnVsbC1zeXN2MyopOiBFbmFibGUuCi0KLQkqIGNvbmZpZy9jb2ZmX2dudS5oOiBEZWxldGVkLgotCi1XZWQgTWF5ICA0IDExOjI5OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IElmIG5vdCBURV9TVU4zLCBkZWZpbmUgYXMKLQkiYS5vdXQtemVyby5iaWciLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCk6IE1ha2UgY29tbW9uIHN5bWJvbCBhbmQgUEMKLQlyZWxhdGl2ZSBhZGp1c3RtZW50cyB3aGVuIFRFX0xZTlggaXMgZGVmaW5lZCBhcyB3ZWxsIGFzIHdoZW4KLQlUQ19JMzg2IGlzIGRlZmluZWQuCi0KLVdlZCBNYXkgIDQgMDI6Mjk6MjEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFzLmggKHN0cnN0cik6IFJlc3RvcmUgZGVjbGFyYXRpb24uCi0JKHN1YnNlZ19nZXQpIFtCRkRfQVNTRU1CTEVSXTogRGVjbGFyZS4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBvYmpfYWRqdXN0X3N5bXRhYiBpcyBkZWZpbmVkLAotCWludm9rZSBpdC4gIFRoZW4gY2FsbCBzZXRfc3ltdGFiLCBhbmQgZmluYWxseSBpbnZva2UgKl9mcm9iX2ZpbGUKLQlob29rcy4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2FkanVzdF9zeW10YWIpOiBSZW5hbWVkIGZyb20KLQljb2ZmX2Zyb2JfZmlsZS4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX2FkanVzdF9zeW10YWIpOiBDaGFuZ2VkIGRlY2xhcmF0aW9uCi0JYWNjb3JkaW5nbHkuCi0JKG9ial9hZGp1c3Rfc3ltdGFiKTogTWFjcm8gYWxzbyBjaGFuZ2VkLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbnUqKTogTmV3IHRhcmdldCwgaGFuZGxlZCBsaWtlIGkzODYtbWFjaC4KLQotVHVlIE1heSAgMyAyMTowNDoxNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCkgW1RDX0k5NjBdOiBTZWxlY3QgbGl0dGxlCi0JZW5kaWFuIHZlcnNpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChUQVJHRVRfRk9STUFUKSBbVENfSTk2MF06IERpdHRvLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3NlY3Rpb24pOiBSb3VuZCB1cCB0aGUgc2l6ZSBvZgotCWV2ZXJ5IHNlY3Rpb24gdG8gYSBtdWx0aXBsZSBvZiB0aGUgYWxpZ25tZW50LCBzbyB0aGF0IEJGRCBkb2Vzbid0Ci0Jc3VycHJpc2UgdXMuCi0KLQlFbGltaW5hdGUgbWFueSBzaW1wbGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIENPRkYgYmFjayBlbmRzOgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYzogUmVtb3ZlZCBhbGwgdXNlcyBvZiBERUZVTiBhbmQgREVGVU5fVk9JRC4KLQlNYWRlIG1pbm9yIHN0eWxpc3RpYyBjaGFuZ2VzLCBkZWxldGVkIHNvbWUgcmVnaXN0ZXIgZGVjbGFyYXRpb25zLgotCShzdGFja190b3ApOiBEZWxldGVkLgotCShzeW1ib2xfdG9fY2hhcnMpOiBVc2UgYWJzb2x1dGVfc2VjdGlvbiBhbmQgcmVnX3NlY3Rpb24gaW5zdGVhZCBvZgotCXRoZSBjb3JyZXNwb25kaW5nIFNFR18qIHN5bWJvbHMuCi0JKG9ial9jb2ZmX2VuZGVmLCB0YWdfZmluZF9vcl9tYWtlLCBmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0JKHN0YWNrIHR5cGVkZWYsIHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wKToKLQlNb3ZlZCB0byBqdXN0IGFmdGVyIHBzZXVkby1vcCB0YWJsZS4gIEFsbCBmdW5jdGlvbnMgbm93IHN0YXRpYy4KLQkoc3RhY2tfZGVsZXRlKTogUmVtb3ZlZCBkZWNsYXJhdGlvbi4KLQkodGFnX2luaXQsIHRhZ19pbnNlcnQsIHRhZ19maW5kX29yX21ha2UsIHRhZ19maW5kKTogTW92ZWQgdG8ganVzdAotCWFmdGVyIHN0YWNrIGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBSZW9yZGVyZWQgc29tZSBkZWNsYXJhdGlvbnMgYW5kIG1hY3Jvcy4KLQkoc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3ApOiBEb24ndCBkZWNsYXJlLgotCShzdGFjayB0eXBlZGVmKTogRGVsZXRlZC4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IEFsd2F5cyB1bmRlZiB0aGVuIGRlZmluZTsgZG9uJ3QgdGVzdC4KLQkoU1lNX0FVWEVOVCk6IE5ldyBtYWNyby4KLQkoU0FfR0VUXyosIFNBX1NFVF8qKTogRGVmaW5lIGluIHRlcm1zIG9mIFNZTV9BVVhFTlQgd2hlbiBmZWFzaWJsZS4KLQkoU0ZfR0VUXyosIFNGX1NFVF8qKTogRGVmaW5lIGluIHRlcm1zIG9mIFNGX0dFVCB3aGVuIGZlYXNpYmxlLgotCShTQV9HRVRfU1lNX1RBR05EWCwgU0FfR0VUX1NZTV9FTkRORFgsIFNBX1NFVF9TWU1fVEFHTkRYLAotCVNBX1NFVF9TWU1fRU5ETkRYLCBvYmplY3RfaGVhZGVycyB0eXBlZGVmLCBkYXRhX3NlY3Rpb25faGVhZGVyLAotCXRleHRfc2VjdGlvbl9oZWFkZXIpOiBEZWxldGUgbm9uLUJGRF9IRUFERVJTIHZlcnNpb25zLCBzaW5jZSB3ZQotCWFsd2F5cyBkZWZpbmUgdGhhdCBzeW1ib2wgbm93LgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc3RhY2tfdG9wKTogRGVsZXRlZC4KLQkob2JqX2NvZmZfZW5kZWYsIG9ial9jb2ZmX2RpbSwgb2JqX2NvZmZfbGluZSwgb2JqX2NvZmZfc2l6ZSwKLQlvYmpfY29mZl9zY2wsIG9ial9jb2ZmX3RhZywgb2JqX2NvZmZfdHlwZSwgb2JqX2NvZmZfdmFsKTogQ2hhbmdlCi0JYXJndW1lbnQgbmFtZSBmcm9tICJpZ25vcmVkIiB0byAiaWdub3JlIi4KLQkob2JqX2NvZmZfdmFsKTogVXNlIGZyYWdfbm93X2ZpeC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgSUdOT1JFX0RFQlVHIHZlcnNpb24sIHNpbmNlIGl0IGRvZXNuJ3QKLQlnZXQgdXNlZC4KLQkoc3RhY2sgdHlwZWRlZiwgc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3ApOgotCU1vdmVkIHRvIGp1c3QgYWZ0ZXIgcHNldWRvLW9wIHRhYmxlLiAgQWxsIGZ1bmN0aW9ucyBub3cgc3RhdGljLgotCSh0YWdfaW5pdCwgdGFnX2luc2VydCwgdGFnX2ZpbmRfb3JfbWFrZSwgdGFnX2ZpbmQpOiBNb3ZlZCB0byBqdXN0Ci0JYWZ0ZXIgc3RhY2sgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1jb2ZmLmg6IFJlb3JkZXJlZCBzb21lIGRlY2xhcmF0aW9ucyBhbmQgbWFjcm9zLgotCVByb3RlY3RlZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JKHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wKTogRG9uJ3QgZGVjbGFyZS4KLQkoc3RhY2sgdHlwZWRlZik6IERlbGV0ZWQuCi0JKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMpOiBBbHdheXMgdW5kZWYgdGhlbiBkZWZpbmU7IGRvbid0IHRlc3QuCi0JKHN0ZG91dHB1dCk6IERlbGV0ZWQgZGVjbGFyYXRpb24uCi0JKFRBUkdFVF9GT1JNQVQpIFtUQ19JMzg2XTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQotTW9uIE1heSAgMiAxNzowOToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBVc2UgZml4X3RhaWwgZmllbGQgZXZlbiBpZgotCUJGRF9BU1NFTUJMRVIuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBJbml0aWFsaXplIGZpeF90YWlsIGZpZWxkLgotCShzdWJzZWdfZ2V0KTogTGlrZXdpc2UuCi0JKiB3cml0ZS5jIChmcmFnc19jaGFpbmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZml4X25ld19pbnRlcm5hbCk6IElmIGZyYWdzX2NoYWluZWQgaXMgc2V0LCB1c2UgZml4X3Jvb3QgYW5kCi0JZml4X3RhaWwgZnJvbSBzZWdfaW5mbyAobm93X3NlZyksIHJhdGhlciB0aGFuIGZyY2hhaW5fbm93LgotCShjaGFpbl9mcmNoYWluc190b2dldGhlcl8xKTogU2V0IGZpeF90YWlsIGZpZWxkLgotCShjaGFpbl9mcmNoYWluc190b2dldGhlcik6IFNldCBmcmFnc19jaGFpbmVkLgotCi1UaHUgQXByIDI4IDAxOjM5OjE1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX29wdGlvbik6IE9ubHkgcmVmZXIgdG8gZ19zd2l0Y2hfKiB2YXJpYWJsZXMKLQlpZiBHUE9QVCBpcyBkZWZpbmVkLgotCShzX2FiaWNhbGxzKTogRGl0dG8uCi0JKG1kX2FwcGx5X2ZpeCk6IENhc3QgY2hhciogdG8gdW5zaWduZWQgY2hhciogdG8gYXZvaWQgcG9pbnRlcgotCW1pc21hdGNoLgotCi1XZWQgQXByIDI3IDExOjA2OjMyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWdvMzIpOiBVc2VzIGNvZmYgbm93LgotCSogZ2FzcC5jIChtYWluKTogTm93IHRha2VzIC1EIG9uIGNvbW1hbmQgbGluZS4KLQkoc2hvd191c2FnZSk6IERlc2NyaWJlIG5ldyBvcHRpb25zLgotCi1UdWUgQXByIDI2IDE3OjEwOjMwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBQcmludCAiTk8gREVGSU5FRCBTWU1CT0xTIiBhbmQKLQkiTk8gVU5ERUZJTkVEIFNZTUJPTFMiIGlmIHRoZXJlIGFyZW4ndCBhbnksIGluc3RlYWQgb2YgZGlzcGxheWluZwotCXRoZSBoZWFkZXIgd2l0aCBhbiBlbXB0eSBsaXN0LgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogQ2hlY2sgQ09GRl9OT0xPQURfUFJPQkxFTQotCWFsc28gYmVmb3JlIHNldHRpbmcgU1RZUF9OT0xPQUQgZm9yIC5ic3Mgc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsKTogTmV3IHZhcmlhYmxlLgotCUluaXRpYWxpemVkIHRvIHZhbHVlIG9mIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCwgaWYgZGVmaW5lZCwgb3IKLQl6ZXJvLgotCShtNjhrX3JlZ19wYXJzZSk6IElmIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCBpcyBzZXQsIHBlcm1pdAotCXJlZ2lzdGVyIHByZWZpeCB0byBiZSBhYnNlbnQuCi0JKG02OGtfaXBfb3ApOiBBY2NlcHQgYCYnIGFsc28gZm9yIGltbWVkaWF0ZSBjb25zdGFudHMuCi0JKGluc2VydF9yZWcpOiBEb24ndCBib3RoZXIgd2l0aCAodHdvIT8pIHNhbml0eSBjaGVja3Mgb2YgdGhlCi0Jc3ltYm9sIHRhYmxlIHdoZW4gaW5zZXJ0aW5nIGVhY2ggcmVnaXN0ZXIuCi0JKG02OGtfcGFyc2VfbG9uZ19vcHRpb24pOiBOZXcgZnVuY3Rpb24uICBTZXQKLQlmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgaWYgInJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbCIgaXMgcGFzc2VkLgotCSogY29uZmlnL3RjLW02OGsuaCAoUkVHSVNURVJfUFJFRklYKTogQWx3YXlzIGRlZmluZSBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCk6IERvbid0IGRlZmluZS4KLQkoUkVHSVNURVJfUFJFRklYX09QVElPTkFMKTogSWYgbm90IGFscmVhZHkgZGVmaW5lZCwgZGVmaW5lIGFzIHplcm8KLQlvciBvbmUgZGVwZW5kaW5nIG9uIE02OEtDT0ZGLgotCi0JU29tZSBjaGFuZ2VzIHRvIGhlbHAgQXBvbGxvIHN1cHBvcnQsIGZyb20gdHJveUBjYm1lLnVuc3cuZWR1LmF1OgotCSogY29uZmlnL3RjLW02OGsuYyAoREFUQSwgQUREUiwgU1AsIEZQUkVHLCBDT1BOVU0sIEJBRCwgQkFDKToKLQlEZWZpbmUgYXMgbWFjcm9zIGluc3RlYWQgb2YgZW51bWVyYXRvcnMsIHNpbmNlIHRoZSBBcG9sbG8gY29tcGlsZXIKLQljYW4ndCBoYW5kbGUgImVudW1WYWwxLCBlbnVtVmFsMiA9IGVudW1WYWwxIiB3aGVuIGRlZmluaW5nIGFuIGVudW0KLQl0eXBlLgotCShtYWtlX3BjcmVsX2Fic29sdXRlKSBbTk9fUENSRUxfUkVMT0NTXTogTmV3IGZ1bmN0aW9uLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSkgW05PX1BDUkVMX1JFTE9DU106IEdlbmVyYXRlIG9ubHkgUl9SRUxCWVRFLAotCVJfRElSMTYsIGFuZCBSX0RJUjMyIHJlbG9jcy4KLQkqIGNvbmZpZy90Yy1tNjhrLmggW1RFX0FQT0xMT10gKENPRkZfTUFHSUMsIENPRkZfQU9VVEhEUl9NQUdJQyk6Ci0JVXNlIEFwb2xsbyB2ZXJzaW9ucy4KLQlbVEVfQVBPTExPXSAoT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIpOiBVbmRlZmluZS4gIFRoYXQgaXMsCi0JZG8gaW5jbHVkZSB0aGUgb3B0aW9uYWwgaGVhZGVyIGZvciBBcG9sbG8gdGFyZ2V0LgotCShDT0ZGX01BR0lDKTogRG9uJ3QgZGVmaW5lIGFzIE1DNjhNQUdJQyBpZiBpdCdzIGFscmVhZHkgZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLW02OGsuaCBbVEVfREVMVEFdIChMRVhfUENUKTogRGVmaW5lIGFzIDEsIHNvIHRoYXQgYCUnCi0JY2FuIGJlIHVzZWQgd2l0aGluIGEgbGFiZWwgbmFtZS4KLQotCSogY29uZmlnL3RjLW02OGsuaCAobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBEZWNsYXJlLgotCSh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEZWZpbmUgYXMgbTY4a19pbml0X2FmdGVyX2FyZ3MuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IE5ldyBmdW5jdGlvbiwKLQljb250YWluaW5nIG9uZS1zaG90IGNvZGUgZnJvbSBtZF9hc3NlbWJsZS4gIEFkZGVkIHdhcm5pbmcgZm9yCi0JY29tYmluYXRpb24gb2YgNjgwNDAgYW5kIDY4ODUxLgotCShtZF9hc3NlbWJsZSk6IFN0YXJ0dXAtdGltZSBjb2RlIGRlbGV0ZWQuCi0KLU1vbiBBcHIgMjUgMTY6MTk6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGNsZWFuLCBkaXN0Y2xlYW4pOiBSZW1vdmUgYXNjb25maWcudGV4aS4KLQotU3VuIEFwciAyNCAwMDoxMzowOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAxMyBiaXQgaW1tZWRpYXRlIGNvbnN0YW50IChmb3IgYnJlYWsKLQlpbnN0cnVjdGlvbikgaXMgdW5zaWduZWQuCi0KLUZyaSBBcHIgMjIgMTc6NTg6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IFVzZSBiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlCi0JYW5kIGJmZF9lY29mZl9zZXRfcmVnbWFza3MgdG8gc2V0IHRoZSBHUCB2YWx1ZSBhbmQgdGhlIHJlZ2lzdGVyCi0JbWFza3MsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBub3cgb2Jzb2xldGUgZmFrZSAucmVnaW5mbyBzZWN0aW9uLgotCi1GcmkgQXByIDIyIDE1OjE3OjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBEb24ndCBwcmludCByZWdpc3RlciBzeW1ib2xzIGFzCi0JdW5kZWZpbmVkLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IERvbid0IG5lZWQgdG8gc3RyaXAKLQl1bmRlcnNjb3Jlcywgc2luY2Ugc3ltYm9sX25ldyB3aWxsIGFscmVhZHkgaGF2ZSBkb25lIGl0LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEaXR0by4KLQotCSogYXMuYyAobWFpbik6IElmIHRjX2luaXRfYWZ0ZXJfYXJncyBpcyBkZWZpbmVkLCBpbnZva2UgaXQgYWZ0ZXIKLQlhbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCi0KLQlTb21lIGNoYW5nZXMgdG8gaGVscCBBcG9sbG8gc3VwcG9ydCwgZnJvbSB0cm95QGNibWUudW5zdy5lZHUuYXU6Ci0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpIFtURV9BUE9MTE9dOiBDcmVhdGUgLnd0ZXh0Ci0Jc2VjdGlvbiBpbnN0ZWFkIG9mIC50ZXh0LiAgQ2FsbCBjcmVhdGVfdGFyZ2V0X3NlZ21lbnRzLgotCSogcmVhZC5jIChkZW1hbmRfY29weV9zdHJpbmcpOiBObyBsb25nZXIgc3RhdGljLgotCi1UaHUgQXByIDIxIDE1OjUwOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBQZXJtaXQgYnJhbmNoZXMgdG8gYmUgc3dpdGNoZWQKLQl3aXRoIHRoZSBwcmVjZWRpbmcgaW5zdHJ1Y3Rpb24gZXZlbiBpZiAuc2V0IG5vYm9wdCBoYXMgYmVlbiBzZWVuLgotCS5zZXQgbm9ib3B0IGFjdHVhbGx5IGNvbnRyb2xzIHdoZXRoZXIgdG8gYnJpbmcgdXAgYW4gaW5zdHJ1Y3Rpb24KLQlmcm9tIHRoZSBicmFuY2ggdGFyZ2V0LCB3aGljaCBnYXMgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQuCi0KLVdlZCBBcHIgMjAgMTg6NDY6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmgsIGNvbmZpZy9vYmotY29mZi5jOiBEZWxldGVkIGFsbCBjb2RlIHVzZWQgb25seQotCXdoZW4gQkZEX0FTU0VNQkxFUiBpcyBub3QgZGVmaW5lZCwgYW5kIGFsbCBjb25kaXRpb25hbHMgcmVsYXRpbmcKLQl0byBzdWNoIGNvZGUuICBObyBzdWNoIHRhcmdldHMgcmVtYWluLgotCi0JRml4ZXMgZm9yIHN0YWJzLWluLWNvZmY6Ci0JKiBjb25maWcvb2JqLWNvZmYuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKGNvZmZfZnJvYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiwKLQljb2ZmX2Zyb2Jfc2VjdGlvbik6IERlY2xhcmUuCi0JKG9ial9mcm9iX3NlY3Rpb24pOiBOZXcgbWFjcm87IHVzZXMgY29mZl9mcm9iX3NlY3Rpb24uCi0JKElOSVRfU1RBQl9TRUNUSU9OKTogTmV3IG1hY3JvOyB1c2VzIG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2VjdGlvbl9hbGlnbik6IEFsd2F5cyByb3VuZCB1cCB0bwotCW11bHRpcGxlIG9mIGFsaWdubWVudCBwb3dlciBzcGVjaWZpZWQgaW4gYmZkIHRhcmdldCB2ZWN0b3IuCi0KLQkqIGdhc3AuYzogSW5jbHVkZSBjdHlwZS5oLgotCi1Nb24gQXByIDE4IDIxOjA4OjAxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiwgZG9jL2FzLnRleGluZm86IFJlbmFtZWQgYXNkb2MtY29uZmlnLnRleGkgdG8KLQlhc2NvbmZpZy50ZXhpLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mby1hcywgaW5zdGFsbC1pbmZvLWdhc3ApOiBHZXQgZmlsZQotCW5hbWVzIGZyb20gc291cmNlIGRpcmVjdG9yeSB3aXRob3V0IHBhdGhuYW1lLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBXaGlsZSBsb29raW5nIGZvcgotCXJlZ2lzdGVyIG1hc2ssIHNraXAgZW1wdHkgZmlsbCBmcmFncyBjYXVzZWQgYnkgZW5hYmxpbmcgbGlzdGluZwotCW91dHB1dC4KLQotCSogY29uZmlnL2hvLXN5c3YuaDogSW5jbHVkZSBzdHJpbmcuaC4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBOZXcgKHdlbGwsIHJlY2VudGx5IGFkZGVkKSBmaWxlLiAgSnVzdCBhZGRlZAotCWluZm8gb24gYXNfd2FybiBhbmQgZnJpZW5kcy4KLQotTW9uIEFwciAxOCAxNDoyODoyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IFVzZSB0aGUgYnVpbHQtaW4KLQlkZWZhdWx0cyBmb3IgZGVmaW5lZCwgcHJpdmF0ZSwgYW5kIHNwbnVtIGZpZWxkcyBmb3IgdGhlCi0JJFRFWFQkIGFuZCAkUFJJVkFURSQgc3BhY2VzLiAgRG8gbm90IGNsb2JiZXIgc3BudW0uICBEbwotCW5vdCByZXNldCB0aGUgc2VnbWVudCBpZiBqdXN0IHVwZGF0aW5nIGEgc3BhY2UuCi0JKHBhX3NwYWNlc19iZWdpbik6IFNldCBCRkQgc2VjdGlvbiBmbGFncyBmb3IgYWxsIGJ1aWx0LWluCi0Jc3Vic3BhY2VzLgotCi1GcmkgQXByIDE1IDEwOjUxOjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZmlyc3RfcHJvY19wdHIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhZGRfcHJvY2VkdXJlKTogU2V0IGZpcnN0X3Byb2NfcHRyIGlmIGl0IGhhc24ndCBiZWVuIHNldC4KLQkoZWNvZmZfYnVpbGRfbGluZW5vKTogSWYgdGhlIGZpcnN0IHByb2NlZHVyZSBkb2VzIG5vdCBzdGFydCBhdAotCWFkZHJlc3MgemVybywgaW5zZXJ0IGEgZHVtbXkgbGluZSB0byBjb21wZW5zYXRlLgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogTWFrZSBnYXNwLm5ldwotCWFzIHdlbGwgYXMgYXMubmV3LgotCi1UaHUgQXByIDE0IDE1OjEyOjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFRyeSB0byBwYXJzZSAiMGYiIGFuZCAiMGIiIHNlcXVlbmNlcyBhcwotCWZsb2F0aW5nIHBvaW50IGFuZCBiaW5hcnkgbnVtYmVycyByZXNwZWN0aXZlbHk7IGlmIGl0IGRvZXNuJ3QKLQl3b3JrLCB0cmVhdCB0aGVtIGFzIGxvY2FsIGxhYmVscy4KLQotCSogTWFrZWZpbGUuaW46IE1ha2UgJChPQkpTKSBkZXBlbmQgb24gJChBTExfT0JKX0RFUFMpLgotCSogY29uZmlndXJlLmluOiBTZXQgQUxMX09CSl9ERVBTIGluIG91dHB1dCBNYWtlZmlsZS4KLQotCUJhc2VkIG9uIHN1Z2dlc3Rpb25zIGZyb20gPEJBSUxFWUBobWl2YXguaHVtZ2VuLnVwZW5uLmVkdT4KLQkoQ2hhcmxlcyBCYWlsZXkpOgotCSogdm1zY29uZi5zaDogSW4gZ2VuZXJhdGVkIGZpbGUsIGdldCAiLm9iaiIgc3VmZml4IHJpZ2h0LCBidWlsZAotCXNvdXJjZSBmaWxlcyBmcm9tIG90aGVyIGRpcmVjdG9yaWVzIGludG8gb2JqZWN0cyBpbiB0aGUgY3VycmVudAotCWRpcmVjdG9yeSwgYW5kIHNwZWNpZnkgUFNFQ1QgYXR0cmlidXRlcyBleHBsaWNpdGx5IHRvIGxpbmtlci4KLQlBbHNvIGFkZGVkIG1pc3NpbmcgbGFiZWwuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtbWsuY29tKTogUmVmZXJlbmNlIG5ldyB2YXJpYWJsZQotCVZNU19PVEhFUl9PQkpTIGZvciBsaXN0IG9mIG5vbi1sb2NhbCBvYmplY3QgZmlsZXMsIGluc3RlYWQgb2YKLQlsaXN0aW5nIHRoZW0gaGVyZS4KLQkoVk1TX09USEVSX09CSlMpOiBOZXcgdmFyaWFibGUsIGFkZGVkIG1vcmUgbGliaWJlcnR5IGZpbGVzLgotCSogbWFrZS1nYXMuY29tOiBSZWdlbmVyYXRlZC4KLQotCSogY29uZmlnL2hvLXZtcy5oICh1bmxpbmspOiBEZWZpbmUgYXMgZGVsZXRlLgotCi0JKiBjb25maWctZ2FzLmNvbTogRml4IHF1b3Rpbmcgb24gVEFSR0VUX0NBTk9OSUNBTCBkZWZpbml0aW9uLgotCURlbGV0ZSBmaWxlcyBiZWZvcmUgY3JlYXRpbmcgdGhlbS4KLQotVGh1IEFwciAxNCAxMzozNDoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkZS1zdGFnZTEsIGRlLXN0YWdlMiwgZGUtc3RhZ2UzKTogVXNlIHJtIC1mLgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFBlcm1pdCBCRkRfUkVMT0NfUENSRUxfTE8xNiBmb3IKLQljZXJ0YWluIGNhc2VzIG9mICdpJywgJ2onIGFuZCAnbycuICBDaGFuZ2UgJ3UnIHRvIHRha2UgYW4KLQlhcmd1bWVudCwgdGhlIHJlbG9jIHR5cGUuCi0JKGxvYWRfcmVnaXN0ZXIpOiBQYXNzIHJlbG9jIHR5cGUgdG8gbWFjcm9fYnVpbGQgZm9yICd1Jy4KLQkobWFjcm8pOiBMaWtld2lzZS4gIEZvciBNX0xBX0FCIHBlcm1pdCBhIGRpZmZlcmVuY2UgZXhwcmVzc2lvbgotCXdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSBiZXR3ZWVuIGFuIGFyYml0cmFyeSBzeW1ib2wgYW5kCi0JYSBzeW1ib2wgaW4gdGhlIC50ZXh0IHNlY3Rpb24uCi0JKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgYW5kCi0JQkZEX1JFTE9DX1BDUkVMX0xPMTYgdG8gYmUgZW1pdHRlZC4KLQkobWRfYXBwbHlfZml4KTogQ2hlY2sgdGhhdCBtb3N0IHJlbG9jcyBhcmUgbm90IFBDIHJlbGF0aXZlLgotCUhhbmRsZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGFuZCBCRkRfUkVMT0NfUENSRUxfTE8xNi4KLQkodGNfZ2VuX3JlbG9jKTogQ2hhbmdlICNlcnJvciB0byBhc19mYXRhbC4gIEhhbmRsZQotCUJGRF9SRUxPQ19QQ1JFTF9MTzE2IGFuZCBCRkRfUkVMT0NfUENSRUxfSEkxNl9TLgotCi1UdWUgQXByIDEyIDE4OjI1OjEzIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzdWJzZWdzX2JlZ2luKTogQ2FsbCBtZW1zZXQgd2l0aCBhcmdzIGluIHRoZSBjb3JyZWN0Ci0Jb3JkZXIuCi0JKHN1YnNlZ19nZXQpOiBDbGVhciBuZXdseSBhbGxvY2F0ZWQgc2VnaW5mbywgc2V0IGl0cyBwb2ludGVyIHNsb3RzCi0JdG8gTlVMTCBpbnN0ZWFkIG9mIDAuCi0KLU1vbiBBcHIgMTEgMDk6MDA6NTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3Byb2NlbmQpOiBIYW5kbGUgY2FzZSB3aGVyZSBsYWJlbCB3YXMKLQlkZWZpbmVkIGFmdGVyIHRoZSAucHJvYyBkaXJlY3RpdmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3Byb2NlbmQpOiBHaXZlIGFuIGVycm9yIGlmIHdlIGVuY291bnRlciBhCi0JcHJvY2VuZCBmb3IgYSBwcm9jZWR1cmUgd2l0aG91dCBhIG5hbWUuCi0KLVRodSBBcHIgIDcgMTQ6Mjg6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFBhc3MgTlVMTCBmb3IgZXhwcmVzc2lvbiBhcmd1bWVudCB0bwotCW1hY3JvX2J1aWxkIGZvciBub3JpIGNhc2UuCi0JKFNXSVRDSF9UQUJMRSk6IERlZmluZS4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgYSByZWxvY2F0aW9uIGZvciBhIHN3aXRjaCB0YWJsZQotCWVudHJ5LgotCShtZF9hcHBseV9maXgpOiBXcml0ZSBzd2l0Y2ggdGFibGUgZW50cnkgdmFsdWUgaW50byBmaWxlLgotCSh0Y19nZW5fcmVsb2MpOiBVc2UgQkZEX1JFTE9DX0dQUkVMMzIgZm9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5LAotCWFuZCBzZXQgdGhlIGFkZGVuZCB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZAotCXRoZSBzdWJ0cmFoZW5kLgotCi1UaHUgQXByICA3IDEwOjM4OjE4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChlbGZfdGNfc3ltYm9sKTogRGVsZXRlLiAgTm8gbG9uZ2VyIHVzZWQuCi0JKGVsZl90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGhwcGFfdGNfbWFrZV9zZWN0aW9ucywgaHBwYV90Y19zeW1ib2wpOiBEZWxldGUgZXh0ZXJuIGRlY2xzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBEZWxldGUgZnVuY3Rpb24uCi0JKGhwcGFfdGNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBEZWxldGUgZWxmX3RjX3N5bWJvbCBhbmQKLQllbGZfdGNfbWFrZV9zZWN0aW9ucyBzdHVmZi4gIEl0IHdhcyB0aGVyZSB0byBzdXBwb3J0IFBBIGJyYWluZGFtYWdlCi0Jd2hpY2ggaGFzIGJlZW4gZml4ZWQsIGFuZCBpbiB0aGUgY2FzZSBvZiBlbGZfdGNfbWFrZV9zZWN0aW9ucyBpcwotCXJlZHVuZGFudCB3aXRoIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nLgotCi1XZWQgQXByICA2IDIwOjQ4OjMwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotKmVsZiopOiBEb24ndCByZXF1aXJlICItaHAtIiBmb3IgdGhlCi0JbWFudWZhY3R1cmVyLgotCi1UdWUgQXByICA1IDE1OjQ4OjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZvciBjYXNlICdvJywgd2hlbiBnZW5lcmF0aW5nCi0JZW1iZWRkZWQgUElDIGNvZGUsIGFjY2VwdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsb2NhbCBzeW1ib2xzCi0JYXMgYmVpbmcgY29uc3RhbnQuCi0JKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IE9ubHkgZm9yY2UgYSByZWxvYyB0byBiZSBnZW5lcmF0ZWQgZm9yIGEKLQlQQyByZWxhdGl2ZSBmaXh1cC4KLQkobWRfYXBwbHlfZml4KTogRm9yIEJGRF9SRUxPQ18zMiBhbmQgQkZEX1JFTE9DX0xPMTYsIHB1dCB0aGUgZml4dXAKLQl2YWx1ZSBpbnRvIHRoZSBmaWxlIGlmIHRoZSBmaXh1cCB3aWxsIG5vdCBnZW5lcmF0ZSBhIHJlbG9jLgotCi1UdWUgQXByICA1IDExOjE0OjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IElmIHNlY3Rpb24gcGFzc2VkIGlzbid0IGJzcywKLQlkb24ndCBzcGV3IHJlbWFpbmRlciBvZiBpbnB1dCBmaWxlIGluIGVycm9yIG1lc3NhZ2UuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGJmZF9yZWxvY190eXBlX2xvb2t1cCByZXR1cm5zIG51bGwsIHByaW50IGVycm9yCi0JbWVzc2FnZSB3aXRoIHJlbG9jIHR5cGUgYW5kIHRyeSB0byBwcm9jZXNzIHJlbWFpbmRlciBvZiBmaWxlLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mby1hcywgaW5zdGFsbC1pbmZvLWdhc3ApOiBOZXcKLQl0YXJnZXRzLCBub3cgZXhwbGljaXRseSBjaGVja2luZyAkKHNyY2RpcikgZm9yIGluZm8gZmlsZXMuCi0JKGluc3RhbGwtaW5mbyk6IERlcGVuZCBvbiBib3RoIG9mIHRoZW07IGRvIG5vdGhpbmcgbW9yZS4KLQotTW9uIEFwciAgNCAxNzowNjowNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBGaXggdGhpbmtvIGluIEVMRiB2ZXJzaW9uLgotCi1Nb24gQXByICA0IDEyOjM5OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfaW5zZXJ0X29wZXJhbmQpOiBDaGVjayBQUENfT1BFUkFORF9TSUdORUQKLQlmbGFnIHJhdGhlciB0aGFuIHNpZ25lZHAgZmllbGQuICBPbmx5IHBlcm1pdCBleHRlbmRlZCByYW5nZSBpZgotCVBQQ19PUEVSQU5EX1NJR05PUFQgZmxhZyBpcyBzZXQgYW5kIGFzc2VtYmxpbmcgaW4gMzIgYml0IG1vZGUuCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBEYXZpZCBFZGVsc29obiAoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc2l6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHBwY19hcmNoKTogQ2hlY2sgZm9yIFBQQ19PUENPREVfUFBDIGJlZm9yZSBQUENfT1BDT0RFX1BPV0VSLgotCShtZF9iZWdpbik6IElmIGFuIGluc3RydWN0aW9uIGhhcyBhIHNpemUgc3BlY2lmaWMgZmxhZyBzZXQsIG9ubHkKLQlhZGQgaXQgaWYgd2UgYXJlIGFzc2VtYmxpbmcgdGhhdCBzaXplLgotCi1UaHUgTWFyIDMxIDE2OjUxOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEFkZCBhIGdydWVzb21lIGhhY2sgdG8gZ2V0Ci0JY3Jvc3Mgc2VjdGlvbiBQQyByZWxhdGl2ZSByZWxvY3MgcmlnaHQgZm9yIENPRkYgYW5kIEVMRi4KLQotTW9uIE1hciAyOCAxNDozODoyMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IEFsd2F5cyBkZWZpbmUuCi0JKE9CSl9QUk9DRVNTX1NUQUIpOiBEb24ndCBkZWZpbmUuCi0KLU1vbiBNYXIgMjggMTI6NDA6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2xzKTogRG9uJ3QgbGV0IEJGRCBjbG9iYmVyCi0JdGhlIHR5cGUgb2Ygc3ltYm9sIHNldCBzeW1ib2xzIHdoaWNoIGhhcHBlbiB0byBiZSBpbiB0aGUgYWJzb2x1dGUKLQlvciB1bmRlZmluZWQgc2VjdGlvbi4KLQotTW9uIE1hciAyOCAxMjozNTowMCAxOTk0ICBEYXZpZCBFZGVsc29obiAgKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgLW1wd3J4IChQT1dFUi8yIGFrYQotCVJJT1MyKSwgLW1wd3IgKFBPV0VSIGFrYSBSSU9TMSksIC1tcHBjIChQb3dlclBDIGFrYSBNUEM2MDMvNjA0KSwKLQlhbmQgLW1hbnkgKGFsbCBhcmNoaXRlY3R1cmVzKS4KLQotU3VuIE1hciAyNyAxNDowNDoxOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogU2V0IGFkZGVuZCBmb3IgcmVsb2NhdGlvbgotCWludm9sdmluZyBhIGZ1bmN0aW9uIHN5bWJvbCB3aGljaCBpcyBub3QgYSBwbGFiZWwgdG8gemVyby4KLQkobWRfYXBwbHlfZml4KTogTmV2ZXIgcGFzcyBhIGZ1bmN0aW9uIHN5bWJvbCB0byBmaWVsZF9hZGp1c3QuCi0KLUZyaSBNYXIgMjUgMTc6MzU6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBJZiBOX0VYVCBpcyBzZXQgZm9yIGFuCi0JTl9JTkRSIHN5bWJvbCwgc2V0IEJTRl9FWFBPUlQgYW5kIGNsZWFyIEJTRl9MT0NBTC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBJZiBFTUJFRERFRF9QSUMsIGRvbid0IHN3YXAgYQotCWJyYW5jaCB3aXRoIGFuIGluc3RydWN0aW9uIHRoYXQgdXNlcyAkYXQsIGluIGNhc2UgdGhlIGJyYW5jaCBpcwotCWxhdGVyIGV4cGFuZGVkLgotCShtYWNybyk6IElmIEVNQkVEREVEX1BJQywgY2FzZSBNX0pBTF9BIG1heSB1c2UgJGF0LgotCShtZF9wY3JlbF9mcm9tKTogSWYgbm90IE9CSl9BT1VULCByZXR1cm4gNCBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbAotCXRvIG1ha2UgaXQgcGNyZWxfb2Zmc2V0LgotCSh0Y19nZW5fcmVsb2MpOiBJZiBub3QgT0JKX0FPVVQsIHNldCB0aGUgcmVsb2MgYWRkZW5kIHRvCi0JcmVsb2MtPmFkZHJlc3M7IGFub3RoZXIgZ3J1ZXNvbWUgaGFjayB0byBnZXQgZ2FzIHJlbG9jIGhhbmRsaW5nIHRvCi0JZG8gdGhlIHJpZ2h0IHRoaW5nLgotCi1UaHUgTWFyIDI0IDIxOjI5OjI5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IE9ubHkgc2V0IEdQIHByb2xvZyBzaXplIGlmIHVzaW5nCi0JUFYgcmVnaXN0ZXIuCi0JKFQxMik6IE5ldyBtYWNyby4KLQkoZW1pdF9pbnNuKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IENhbGwgaXQuCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBIYW5kbGUgQkZEX1JFTE9DXzI2LCBmb3IgY2FsbF9wYWwKLQlpbnN0cnVjdGlvbnMuCi0JKGxpdHVzZV9wZW5kaW5nKTogTmV3IHZhcmlhYmxlLiAgU2V0IGJ5IGFueXRoaW5nIHRoYXQgZ2VuZXJhdGVzIGEKLQlMSVRFUkFMIHJlbG9jLCBjbGVhcmVkIGJ5IGFueXRoaW5nIHRoYXQgZ2VuZXJhdGVzIGEgTElUVVNFIHJlbG9jLAotCXRlc3RlZCBieSBjb2RlIHRoYXQgbWlnaHQgd2FudCB0byBlbWl0IGEgTElUVVNFIHJlbG9jLgotCShlbWl0X3VuYWxpZ25lZF9pbyk6IE5ldyBmdW5jdGlvbi4gIEN1cnJlbnRseSBjYWxscyBtZF9hc3NlbWJsZSwKLQlidXQgaXQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgY29udmVydGVkIHRvIGdlbmVyYXRlIHRoZSBpbnNuIGl0c2VsZgotCWFuZCBjYWxsIGVtaXRfaW5zbiBkaXJlY3RseS4KLQkoZW1pdF9sb2FkX3VuYWwsIGVtaXRfc3RvcmVfdW5hbCwgZW1pdF9ieXRlX21hbmlwX3IsCi0JZW1pdF9leHRyYWN0X3IsIGVtaXRfaW5zZXJ0X3IsIGVtaXRfbWFza19yLCBlbWl0X3NpZ25fZXh0ZW5kLAotCWVtaXRfYmlzX3IpOiBMaWtld2lzZS4KLQkoYWxwaGFfaXAsIGNhc2UgJ0knKTogSGFuZGxlIHdpdGggQkZEX1JFTE9DXzIzLgotCShhbHBoYV9pcCwgbGFiZWwgZ2V0X21hY3JvKTogRG9uJ3QgZW1pdCB0aGUgZmluYWwgaW5zdHJ1Y3Rpb24gaWYKLQl0aGUgb3Bjb2RlIGlzIHplcm8uCi0JKGFscGhhX2lwLCBjYXNlICdCJywgc3ViY2FzZSAnZCcpOiBOZXcgY2FzZSwgZm9yIHN1YndvcmQgYW5kCi0JdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgbWFjcm9zLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzI2LiAgR2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSBpZgotCXRoZSB2YWx1ZSBjYW4ndCBiZSByZXNvbHZlZC4KLQotV2VkIE1hciAyMyAxNjowNjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IEZvciAtbWVtYmVkZGVkLXBpYywgZm9yY2UKLQl0aGUgLUcgdmFsdWUgdG8gMHg3ZmZmZmZmZi4gIEZvciBTVlI0IFBJQyBvcHRpb25zLCBkb24ndCBjYWxsCi0JYmZkX3NldF9ncF9zaXplIGhlcmUsIGl0J3MgZG9uZSBpbiBtZF9iZWdpbi4gIERvbid0IHBlcm1pdCAtRyB3aXRoCi0JLW1lbWJlZGRlZC1waWMuCi0JKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXBwbHlfZml4KTogU2V0IGZpeFAtPmZ4X2RvbmUgYXBwcm9wcmlhdGVseS4KLQkoc19jaGFuZ2Vfc2VjKTogRm9yIEVNQkVEREVEX1BJQywgY2hhbmdlIC5kYXRhIGFuZCAucmRhdGEgdG8KLQkuc2RhdGEuCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lLgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBEZWNsYXJlLgotCShUQ19IQU5ETEVfRlhfRE9ORSk6IERlZmluZS4KLQotVHVlIE1hciAyMiAxMzo1ODozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGVudW0gbWlwc19waWNfbGV2ZWwpOiBOZXcgZW51bS4KLQkobWlwc19waWMpOiBDaGFuZ2UgZnJvbSBpbnQgdG8gZW51bSBtaXBzX3BpY19sZXZlbC4gIENoYW5nZSBhbGwKLQl1c2VzICgwIGJlY29tZXMgTk9fUElDLCAyIGJlY29tZXMgU1ZSNF9QSUMpLgotCShsb2FkX2FkZHJlc3MpOiBIYW5kbGUgRU1CRURERURfUElDLgotCShtYWNybyk6IEhhbmRsZSBFTUJFRERFRF9QSUMgaW4gYWxsIFBJQyBjYXNlcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IC1tZW1iZWRkZWQtcGljIHRvIHVzZSBFTUJFRERFRF9QSUMuICBJZgotCU9CSl9FTEYsIGFjY2VwdCAtS1BJQyBhbmQgLWNhbGxfc2hhcmVkIHRvIHVzZSBTVlI0X1BJQyBhbmQgYWNjZXB0Ci0JLW5vbl9zaGFyZWQgdG8gdXNlIE5PX1BJQyAodGhpcyBpcyBob3cgdGhlIElyaXggNSBhc3NlbWJsZXIKLQl3b3JrcykuICBEbyBub3QgcGVybWl0IC1HIHdpdGggU1ZSNF9QSUMuCi0JKHNfYWJpY2FsbHMpOiBXYXJuIGlmIC1HIHdhcyB1c2VkLCBhbmQgZm9yY2UgLUcgMC4KLQkodGNfZ2VuX3JlbG9jKTogU2V0IHJlbG9jLT5hZGRlbmQgdG8gMCBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBmb3IKLQlhbnl0aGluZyBidXQgYS5vdXQsIG5vdCBqdXN0IGZvciBFTEYuICBGb3IgRUNPRkYsIGRvbid0IGdlbmVyYXRlIGEKLQlCRkRfUkVMT0NfMTZfUENSRUxfUzIgcmVsb2MgdW5sZXNzIHVzaW5nIEVNQkVEREVEX1BJQy4KLQotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MpOiBEZWZpbmUgdG8gYmUgMS4KLQotU3VuIE1hciAyMCAxNjozMTo1NSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY3JlYXRlX25ld19zcGFjZSk6IFVzZSBpbnRzLCBub3QgY2hhcnMgYXMKLQlwYXJhbWV0ZXJzIHRvIGF2b2lkIGxvc2luZyB3aGVuIGNvbXBpbGluZyB3aXRoIEhQIENDLgotCShjcmVhdGVfbmV3X3N1YnNwYWNlLCB1cGRhdGVfc3Vic3BhY2UsIGZpeF9uZXdfaHBwYSk6IExpa2V3aXNlLgotCi1TdW4gTWFyIDIwIDE0OjQzOjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWctc3RhbXApOiBJZiBgZGVmcycgaXMgZGVmaW5lZCwgZW1pdCBhCi0JcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSB0byBjcmVhdGUgYSBtYWNybyBuYW1lZCBieSB0aGlzIHZhbHVlIGludG8KLQljb25maWcubmV3OyBkb24ndCBleHBsaWNpdGx5IGdvIGZvciBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYGRlZnMnLCBub3QgYEJGRERFRicuICBTZXQgaXQgdG8KLQlNQU5ZX1NFR01FTlRTIGZvciBhbnkgb2JqLWNvZmZiZmQgdGFyZ2V0LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKEJGRF9IRUFERVJTLCBCRkQpOiBEZWZpbmUuCi0JKiBjb25maWcvaTM4NmNvZmYubXQgKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIEJGRCwgTUFOWV9TRUdNRU5UUywKLQlvciBCRkRfSEVBREVSUy4KLQkoTE9DQUxfTE9BRExJQkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9tNjhrY29mZi5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgdGhvc2UgbWFjcm9zLgotCSogY29uZmlnL204OGtjb2ZmLm10IChUREVGSU5FUyk6IERpdHRvLgotCSogY29uZmlnL2VibW9uMjlrLm10OiBEZWxldGVkLgotCSogY29uZmlnL2g4MzAwaGRzLm10OiBEZWxldGVkLgotCSogY29uZmlnL2ljOTYwY29mZi5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9zcGFyYy5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9oODMwMC5tdCAoTE9DQUxfTE9BRExJQkVTLCBUREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvaDg1MDAubXQgKExPQ0FMX0xPQURMSUJFUywgVERFRklORVMpOiBEZWxldGVkLgotCSogY29uZmlnL3NoLm10IChMT0NBTF9MT0FETElCRVMsIFRERUZJTkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy96OGsubXQgKExPQ0FMX0xPQURMSUJFUyk6IERlbGV0ZWQuCi0JKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIHRoZSBjb2ZmYmZkIG1hY3Jvcy4KLQotCSogTWFrZWZpbGUuaW46IEluc2VydCBtYWtlZmlsZSBmcmFnbWVudHMgYmVmb3JlIE9CSlMgZGVmaW5pdGlvbi4KLQkoT0JKUyk6IEFkZCAkKFRFX09CSlMpLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX3BzZXVkb190YWJsZSk6IFN1cHBseSAic2VjdGlvbiIKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLQkqIHdyaXRlLmMgKHNldF9zeW10YWIpOiBEZWZpbmUgb25seSBpZiBCRkRfQVNTRU1CTEVSLgotCi1TdW4gTWFyIDIwIDEyOjA2OjA1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoU1RBR0VTVFVGRik6IEFkZCBnYXNwLm5ldy4KLQotRnJpIE1hciAxOCAyMDowOToxNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChzeW1ib2xfdGFibGVfZnJvemVuKTogTmV3IHZhcmlhYmxlLCB0byBiZSBzZXQgYWZ0ZXIKLQliZmRfc2V0X3N5bXRhYiBpcyBjYWxsZWQuCi0JKGR1bXBfc2VjdGlvbl9yZWxvY3MpOiBOb3RlIHdoZXRoZXIgYSBzeW1ib2wgaXMgYSBzZWN0aW9uIHN5bWJvbAotCW9yIG5vdC4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBGb3Igbm93LCBhbHdheXMgc3VwcGx5IGFuIGFic29sdXRlIHN5bWJvbCBmb3IKLQlmaXh1cHMgd2l0aG91dCBzeW1ib2xzIGJ1dCBub3QgeWV0IGBkb25lJy4gIFVzZSBzZWN0aW9uX3N5bWJvbCB0bwotCWdldCB0aGUgc3ltYm9sLCBpbnN0ZWFkIG9mIGdvaW5nIGRpcmVjdGx5IGZvciBhYnNfc3ltYm9sLgotCSh3cml0ZV9yZWxvY3MpIFtERUJVRzRdOiBBYm9ydCBpZiBhbnkgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IGEKLQlyZWxvYyBpcyBub3QgYSBzZWN0aW9uIHN5bWJvbCBhbmQgaXMgbm90IGluIHRoZSBzeW1ib2wgdGFibGUuCi0JKHNldF9zeW10YWIpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgZnJvbSB3cml0ZV9vYmplY3RfZmlsZS4KLQlDb3VudHMgc3ltYm9sIHRhYmxlIGluc3RlYWQgb2YgcmVseWluZyBvbiBhbiBlYXJsaWVyIGNvdW50LgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgc2V0X3N5bXRhYiwgYnV0IGRvIGl0IGFmdGVyIHBvdGVudGlhbGx5Ci0JaW52b2tpbmcgdGhlICpfZnJvYl9maWxlIG1hY3Jvcy4gIERvbid0IGJvdGhlciBjb3VudGluZyBzeW1ib2xzLgotCUNhbGwgc3ltYm9sX3JlbW92ZSwgaW5zdGVhZCBvZiBleHBhbmRpbmcgaXQgaW4gcGxhY2UuICBNb3ZlZCB0aGUKLQljb25kaXRpb25hbGl6ZWQgYG9iamVjdF9maWxlX3NpemUnIGRlY2xhcmF0aW9uIGRvd24gdG8KLQljb25kaXRpb25hbGl6ZWQgYmxvY2sgd2hlcmUgaXQncyB1c2VkLiAgV2hlbiB1c2luZyB0aGUgYWJzb2x1dGUKLQlzeW1ib2wgZm9yIGEgZml4dXAgd2l0aG91dCBhIHN5bWJvbCwgc2V0IHN5X3VzZWRfaW5fcmVsb2MuCi0JKHdyaXRlX29iamVjdF9maWxlKSBbQkZEX0FTU0VNQkxFUl06IENhbGwgc2VjdGlvbl9zeW1ib2wgdG8gZ2V0Ci0JdGhlIGNvcnJlY3Qgc3ltYm9sIGZvciB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IFVzZSBzeW1ib2xfbmV3IGluc3RlYWQgb2YKLQlzeW1ib2xfbWFrZSwgc2luY2Ugd2UgbWF5IHdhbnQgaXQgdG8gZ28gaW50byB0aGUgc3ltYm9sIHRhYmxlLgotCU1ha2UgdGhlIG5ldyBzeW1ib2wgaGF2ZSBpbnRlcm5hbCBsaW5rYWdlLiAgSWYKLQlvYmpfc2VjX3N5bV9va19mb3JfcmVsb2Mgc2F5cyBpdCdzIG9rYXksIHVzZSB0aGUgQkZEIHNlY3Rpb24KLQlzeW1ib2wgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBHQVMgc3ltYm9sLgotCShvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MpOiBEZWZhdWx0IHRvIGFsd2F5cyByZXR1cm5pbmcgMC4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MpIFtCRkRfQVNTRU1CTEVSXToKLQlOZXcgbWFjcm8uCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkoaW5fc2lnbmVkX3JhbmdlKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IFVzZSBpdC4KLQkoc3BhcmNfaXAsIGNhc2UgJ2knKTogVXNlIEJGRF9SRUxPQ19TUEFSQzEzLCBub3QgX0JBU0UxMy4KLQkoc3BhcmNfaXAsIGxhYmVsICJpbW1lZGlhdGUiKTogUmVqZWN0IGNvbnN0YW50cyBmb3IgcGNyZWwKLQlpbnN0cnVjdGlvbnMgb25seSBpZiB0aGUgcmVsb2NhdGlvbiB0eXBlIGluZGljYXRlcyBhICJjYWxsIgotCWluc3RydWN0aW9uIGFuZCB0aGUgb2Zmc2V0IGlzIHdpdGhpbiByYW5nZSBvZiBhICJqbXBsICVnMCIuICBJZgotCWl0J3Mgbm90IGluIHJhbmdlLCB1c2UgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sIHBsdXMgYW4gb2Zmc2V0LgotCShtZF9hcHBseV9maXgpOiBVc2UgaW5fc2lnbmVkX3JhbmdlLiAgQ29tYmluZWQgX1NQQVJDMTMgYW5kCi0JX0JBU0UxMyBjYXNlcy4KLQkodGNfZ2VuX3JlbG9jKTogUGVybWl0IEJGRF9SRUxPQ19TUEFSQzEzLgotCi0JKiBjb25maWcvaWM5NjBjb2ZmLm10IChUREVGSU5FUyk6IEZpeGVkIHR5cG8gKE1BTllfU0VDVElPTlMsIG5vdAotCU1BTllfU0VHTUVOVFMpLgotCi0JKiBjb25maWd1cmUuaW46IEVsaW1pbmF0ZWQgYWxsIHRhcmdldHMgdXNpbmcgb2JqLWNvZmYgYnV0IG5vdAotCWRlZmluaW5nIEJGRF9BU1NFTUJMRVI7IEkgdGhpbmsgYWxsIHN1Y2ggdGFyZ2V0cyB0aGF0IGFyZQotCXN1cHBvcnRlZCB3aWxsIGJlIG1hdGNoZWQgYnkgcmVhbCBDUFUtT1MgY29tYmluYXRpb25zIGVhcmxpZXIgaW4KLQl0aGUgY2FzZSBzdGF0ZW1lbnQuCi0JKHRhcmdldHMgKi0qLWNvZmYqLCAqLXN5c3YqLCAqLSotc2NvKiwgKi0qLXN5c3YzMik6IERlbGV0ZWQuICBNYWRlCi0Jc29tZSBjb21tZW50cyBhYm91dCB0aGUgZHB4MiBjb25maWd1cmF0aW9uLCBidXQgbGVmdCBpdCBkaXNhYmxlZCwKLQlzaW5jZSBpdCBjb3VsZG4ndCBiZSByZWFjaGVkIGJlZm9yZS4KLQkodGFyZ2V0IGEyOWstYW1kLWVibW9ub2xkKTogRGVsZXRlZC4KLQotVGh1IE1hciAxNyAxMzozNjowOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaW1wb3J0KTogQ29ycmVjdGx5IGhhbmRsZSBpbXBvcnRpbmcgb2YgYW4KLQlhbHJlYWR5IGRlZmluZWQgc3ltYm9sLgotCi1XZWQgTWFyIDE2IDE3OjExOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE9ubHkgYWNjZXB0IG92ZXJseSBsYXJnZSB2YWx1ZXMgZm9yCi0JdGhlICdqJyBvcGVyYW5kIGlmIHRoZXJlIGFyZSBubyBmdXJ0aGVyIGFsdGVybmF0aXZlcyBmb3IgdGhpcwotCWluc3RydWN0aW9uLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoYWRqdXN0X3N0YWJfc2VjdGlvbik6IEluaXRpYWxpemUKLQlzdGFic3Ryc2VnIHRvIFNFR19VTktOT1dOLCBub3QgLTEuICBBZnRlciBsb29wLCBjaGVjayB3aGV0aGVyIGl0Ci0JaXMgbm90IFNFR19VTktOT1dOIHJhdGhlciB0aGFuIGNoZWNraW5nIHdoZXRoZXIgaXQgaXMgPj0gMC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19hbGlnbik6IFRha2UgbmV3IGFyZ3VtZW50LCBsYWJlbCwgYW5kIHVzZQotCWl0IGluc3RlYWQgb2YgZ2xvYmFsIGluc25fbGFiZWwuCi0JKHNfYWxpZ24sIHNfY29ucywgc19mbG9hdF9jb25zLCBzX2dwd29yZCk6IFNhdmUgaW5zbl9sYWJlbCBiZWZvcmUKLQljYWxsIHRvIG1pcHNfZW1pdF9kZWxheSBhbmQgcGFzcyBpdCB0byBtaXBzX2FsaWduLgotCi1XZWQgTWFyIDE2IDExOjU0OjEyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9lcXUpOiBIYW5kbGUgYm90aCAucmVnIGFuZCAuZXF1IGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY2FsbGluZm8pOiBBY2NlcHQgIm1pbGxpY29kZSIgYXMgYW4KLQlhcmd1bWVudCB0byBhIC5jYWxsaW5mbyBkaXJlY3RpdmUuICBEb24ndCBsb29wIGZvcmV2ZXIgb24gZXJyb3JzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9lcXUpOiBVc2UgcGFfcGFyc2VfbnVtYmVyIHNvIHRoYXQgd2UgY2FuCi0JdXNlIHByZS1kZWZpbmVkIHJlZ2lzdGVycyBhcyBhcmd1bWVudHMuCi0KLU1vbiBNYXIgMTQgMTQ6Mjk6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDaGVjayBib3RoIFNfSVNfTE9DQUwgYW5kCi0JU19JU19FWFRFUk5BTCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gZGlzY2FyZCBhIHN5bWJvbC4KLQotCSogY29uZmlnLWdhcy5jb206IFNjYW4gTWFrZWZpbGUuaW4sIG5vdCB2ZXJzaW9uLmMsIGZvciBjdXJyZW50Ci0JdmVyc2lvbiBudW1iZXIuICBEZWxldGUgYWxsIHZlcnNpb25zIG9mIHRlbXAgZmlsZXMgd2hlbiBmaW5pc2hlZAotCXdpdGggdGhlbS4gIENyZWF0ZSBjb25maWcuaC4KLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSk6IENhY2hlIHN5bWJvbAotCXZhbHVlcyB0byByZWR1Y2UgbnVtYmVyIG9mIGxvb2t1cHMgd2l0aCBTX0dFVF9WQUxVRS4gIFNraXAgZGVidWcKLQlzeW1ib2xzIHRvIGF2b2lkICJhIHJlYWxseSBuYXN0eSBidWciLiAgKEZyb20gSG9sZ2VyIFRldXRzY2gsCi0JaG9sZ2VyQGJvdGJzby5yaGVpbi1tYWluLmRlLikKLQkoVk1TX3dyaXRlX29iamVjdF9maWxlKTogRm9yICJfX3Z0LioiIHN5bWJvbHMsIHNldCBTX0dFVF9PVEhFUgotCWZpZWxkLiAgKEFsc28gZnJvbSBIb2xnZXIgVGV1dHNjaC4pICBXYXRjaCBmb3IgYSB3b3VsZC1iZSByZWdpc3RlcgotCW1hc2sgdGhhdCBzcGFucyBmcmFncy4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2xpbmUpOiBTZXQgc3ltYm9sIGxubm8gZmllbGQgd2l0aAotCXRoaXNfYmFzZSwgbm90IGxpbmVfYmFzZS4gIChQYXRjaCBmcm9tIEFuZHJlYXMgQXJlbnMsCi0JYXJpQG9iZWxpeC5hdi5yd3RoLWFhY2hlbi5kZS4pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogUmV0YWluIHN5bWJvbHMgdGhhdAotCWxvb2sgbG9jYWwgaWYgdGhleSdyZSBleHBvcnRlZCBvciB1bmRlZmluZWQuICBVc2VkIHRvIGJlIGRvbmUgZm9yCi0JaTk2MCBvbmx5LgotCi0JKiByZWFkLmMgKHNfbGNvbW0sIHNfY29tbSk6IFByaW50IHN5bWJvbCBuYW1lIGJlaW5nIHJlZGVmaW5lZC4KLQlHZXQgaXQgZnJvbSB0aGUgbG9va2VkLXVwIHN5bWJvbCwgaW5zdGVhZCBvZiB1c2luZyB0aGUgc3RyaW5nIGZyb20KLQl0aGUgaW5wdXQgc3RyZWFtLCB3aGljaCBpcyBubyBsb25nZXIgbnVsbC10ZXJtaW5hdGVkLgotCShMRVhfUENUKTogTmV3IG1hY3JvLCBkZWZhdWx0cyB0byAwLgotCShsZXhfdHlwZSk6IFVzZSBpdCBmb3IgYCUnLgotCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBgLWgjJyBvcHRpb24gZm9yIFZNUy4KLQkodmlwX29wKTogTm93IHN0YXRpYywgYW5kIHJldHVybnMgdm9pZC4gIENhbGxlcnMgY2hhbmdlZC4gIEFkZGVkCi0JZm9yd2FyZCBkZWNsLgotCSh2aXApOiBEaXR0by4gIENhbGwgYXNfZmF0YWwgZGlyZWN0bHkgaWYgYSBwcm9ncmFtIGJ1ZyBpcwotCWRldGVjdGVkLgotCShvcF9oYXNoKTogTGV0IGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gc3VmZmljZS4KLQotCSogTWFrZWZpbGUuaW4gKGxpdGVyYWwubyk6IFByb3ZpZGUgZGVwZW5kZW5jaWVzLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBuZXcgbWFrZWZpbGUgdmFyaWFibGUgT1BDT0RFU19MSUIuCi0JKiBNYWtlZmlsZS5pbiAoTElCUyk6IFVzZSBpdC4KLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2FzLmNvbSwgc3RhbXAtbWsuY29tKTogTmV3IHRhcmdldHMuCi0JKiB2bXNjb25mLnNoOiBOZXcgZmlsZS4KLQkqIG1ha2UtZ2FzLmNvbTogUmVnZW5lcmF0ZWQgZnJvbSBuZXcgc2NyaXB0LgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLWx5bnhvcyopOiBIYW5kbGUgYW55IHZlcnNpb24gbnVtYmVyCi0Jc3VmZml4IGFmdGVyICJseW54b3MiLiAgU2V0IGVtdWxhdGlvbiB0byBseW54LgotCi1Nb24gTWFyIDE0IDExOjMwOjQ5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQotRnJpIE1hciAxMSAyMjoyNTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGNyZWxfZnJvbSk6IFJldHVybiAwIGZvciB1bmRlZmluZWQgRUxGCi0Jc3ltYm9scy4KLQkocHBjX2lzX3RvY19zeW0pOiBDaGFuZ2UgLnRvYyB0byAuZ290LgotCShtZF9hcHBseV9maXgpOiBDaGFuZ2UgaGFuZGxpbmcgb2YgRUxGIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMTEgMTc6NDI6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai12bXMuYyAoQ2xvc2VfVk1TX09iamVjdF9GaWxlKTogQWRkIGNvbW1lbnQgcG9pbnRpbmcKLQlvdXQgc29tZSBjb2RlIHRoYXQgZG9lc24ndCBiZWxvbmcgaW4gdGhpcyBmaWxlLgotCi0JKiBjb25maWcvb2JqLXZtcy5oOiBJbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkoTl9HU1lNLCAuLi4sIE5fTEVORyk6IERlbGV0ZWQuCi0JKE5PX1JFTE9DKTogVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nIGFzIHBhcnQgb2YgZW51bSByZWxvY190eXBlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogQWRkIGNvbW1lbnQgcXVlc3Rpb25pbmcgbmVlZCBmb3IgYWxsIHRoZQotCWNoYXJhY3RlcnMgaW4gRkxUX0NIQVJTLgotCi0JKiBhcy5jIChtYWluKSBbT0JKX1ZNU106IERvbid0IGNhbGwgb3V0cHV0X2ZpbGVfY2xvc2UuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogU2V0IHN0cmljdCBvcmRlciBmb3IKLQlzZWN0aW9ucyB3aXRoIHJlY29nbml6ZWQgbmFtZXMsIGJlZm9yZSBjb21wdXRpbmcgVk1BIHZhbHVlcy4KLQotRnJpIE1hciAxMSAxNzo1NjoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBBY2NlcHQgbnVtYmVycyBiZXR3ZWVuIDB4ODAwMCBhbmQKLQkweGZmZmYgZm9yICdqJyB0byBiZSBjb21wYXRpYmxlIHdpdGggTUlQUyBhc3NlbWJsZXIuICBUaGVzZQotCW51bWJlcnMgYXJlIGFjdHVhbGx5IHRyZWF0ZWQgYXMgbmVnYXRpdmUuCi0KLVRodSBNYXIgMTAgMTM6MzY6MjkgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmggKExPQ0FMX0xBQkVMKTogTG9jYWwgbGFiZWxzIGFyZSAuTGZvby4KLQotVHVlIE1hciAgOCAyMToxNzoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogTWlub3IgZm9ybWF0dGluZy9zdHlsaXN0aWMgY2hhbmdlcywgcGx1czoKLQkob2JqX2NvZmZfc2VjdGlvbik6IERlY2xhcmUuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBNYWtlIGl0IGF2YWlsYWJsZSBvbmx5IGlmIE1BTllfU0VDVElPTlMuCi0JKG9ial9zeW1ib2xfdG9fY2hhcnMpIFtDUk9TU19DT01QSUxFXTogU29tZSBhdHRlbXBzIHRvIG1ha2UgdGhpcwotCXdvcmsuICBJdCBzdGlsbCBkb2Vzbid0LiAgSXQgbm93IGZhaWxzIHRvIGNvbXBpbGUsIGluc3RlYWQgb2YKLQlzaWxlbnRseSBjb21waWxpbmcgdG8gZG8gbm90aGluZy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmaW5lIG9ubHkgaWYKLQlNQU5ZX1NFQ1RJT05TLgotCShPQkpfUFJPQ0VTU19TVEFCKSBbISBNQU5ZX1NFQ1RJT05TXTogTmV3IG1hY3JvLCBqdXN0IGVtaXRzCi0Jd2FybmluZy4KLQotCUhhbmRsZSBBbHBoYSBsb2FkLWltbWVkaWF0ZS1GUCBwc2V1ZG8taW5zdHJ1Y3Rpb25zOgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oIChsZGlmLCBsZGlnLCBsZGlzLCBsZGl0KTogTmV3IHBhdHRlcm5zLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGxpdDhfc2VjLCBsaXQ0X3NlYywgbGl0OF9zeW0sIGxpdDRfc3ltKTogTmV3Ci0JdmFyaWFibGVzLgotCShjcmVhdGVfbGl0ZXJhbF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShjcmVhdGVfbGl0YV9zZWN0aW9uKTogTm93IGEgbWFjcm8uCi0JKGdldF9saXQ4X29mZnNldCwgZ2V0X2xpdDRfb2Zmc2V0KTogTmV3IGZ1bmN0aW9ucy4KLQkobWF5YmVfc2V0X2dwKTogTmV3IGZ1bmN0aW9uLgotCShzZWxlY3RfZ3BfdmFsdWUpOiBDYWxsIGl0LgotCShsb2FkX2V4cHJlc3Npb24pOiBQcmVzZXJ2ZSBhZGRlbmQgaWYgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wuCi0JKGFscGhhX2lwKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgYEYnIGZvciBmbG9hdGluZy1wb2ludAotCWNvbnN0YW50czsgc3RvcmUgdGhlbSBpbiAubGl0ezQsOH0gc2VjdGlvbnMuCi0JKGFscGhhX2lwLCBjYXNlICdHJyk6IEVtaXQgTElUVVNFIHJlbG9jYXRpb25zIGZvciBzeW1ib2wgZXhwcnMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNtYWxsZXN0X2ltbV90eXBlKTogTmV2ZXIgcmV0dXJuIEltbTEuCi0KLVR1ZSBNYXIgIDggMTQ6MTg6MTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHdfc3RyaW5ncyk6IE9ubHkgY29weSBzdHJpbmdzIG91dCBpZgotCXRoZWlyIHN5bWJvbHMgYXJlIGdvaW5nIHRvIGJlIHdyaXR0ZW4uCi0KLVR1ZSBNYXIgIDggMTE6NDk6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc19wZXJyb3IpOiBEZWNsYXJlIGFyZ3VtZW50cyBjb25zdC4KLQkqIGFzLmggKGFzX3BlcnJvcik6IENoYW5nZSBkZWNsYXJhdGlvbi4KLQotTW9uIE1hciAgNyAxNjowODoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfYWRkcmVzcyk6IFdoZW4gY2FsbGluZyBmcmFnX2dyb3csIGFsbG93Ci0JZm9yIHRoZSAodXAgdG8pIHR3byBub3BzIHdoaWNoIG1heSBiZSBpbnNlcnRlZCBieSBhcHBlbmRfaW5zbiBpZgotCW1pcHNfb3B0aW1pemUgaXMgMC4KLQkobWFjcm8pOiBMaWtld2lzZS4KLQotVGh1IE1hciAgMyAxMTozNzo1NSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIpOgotCUFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcgZnJvbSBnY2MuCi0KLVdlZCBNYXIgIDIgMTA6MzE6MDEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IEFkZCBhIGZldyBjYXN0cyB0byBtYWtlIEhQIEMgY29tcGlsZXIgaGFwcHkuCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21fdmVyc2lvbiwgb2JqX3NvbV9jb3B5cmlnaHQpOiBCZQotCXByZXBhcmVkCi0JdG8gaGFuZGxlIGFuIGVycm9yIGZyb20gYmZkX3NvbV9hdHRhY2hfYXV4X2hkci4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogV3JhcCBFTEYgc3BlY2lmaWMgZGVjbHMgaW5zaWRlIGFuIGlmZGVmLgotCi1Nb24gRmViIDI4IDE1OjAzOjI2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9hdG9mKTogT21pdCB3YXJuaW5nIGFib3V0IEZQIHZhbHVlcy4KLQkobGluZV9jb21tZW50X2NoYXJzKTogQWRkICEgdG8gbGlzdC4KLQkobWRfYXBwbHlfZml4KTogRG8gcHJvY2VzcyAzMi0gYW5kIDY0LWJpdCByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2xjb21tKTogUHV0ICIjaWYgMCIgYXJvdW5kIHRoZQotCXVudXNlZCBwYXJ0cyAobW9zdCBvZiB0aGUgZnVuY3Rpb24pLgotCShvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IENhc3QgYWxsb2NhIHJlc3VsdC4KLQotCSogY29uZmlndXJlLmluIChpOTYwLSotY29mZiwgaTk2MC0qLXZ4d29ya3M1LiopOiBVc2UgY29mZmJmZCwgYW5kCi0JZ2FzX3RhcmdldCBpYzk2MGNvZmYuCi0JKiBjb25maWcvaWM5NjBjb2ZmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIFtUQ19JOTYwXTogSW5jbHVkZSBjb2ZmL2k5NjAuaC4KLQkoVEFSR0VUX0ZPUk1BVCkgW1RDX0k5NjBdOiBVc2UgY29mZi1JbnRlbC1saXR0bGUuCi0JKiBjb25maWcvdGUtaWM5NjAuaCAoQ1JPU1NfQ09NUElMRSk6IERvbid0IHVuZGVmIHRoaXMuICBXZSdsbAotCWFsd2F5cyBidWlsZCBsaXR0bGUtZW5kaWFuIG9iamVjdCBmaWxlcy4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX3JlbG9jX3NpemUpOiBEb24ndCBkZWZpbmUgYXQgYWxsIGlmIEJGRCBvcgotCUJGRF9BU1NFTUJMRVIgaXMgZGVmaW5lZC4KLQkobWVtX2ZtdCk6IFNpbmNlIENPRkYgZG9lc24ndCBoYW5kbGUgY2FsbHggcmVsb2NhdGlvbnMgeWV0LCB0cmVhdAotCXRoZW0gbGlrZSBub3JtYWwgMzItYml0IHJlbG9jYXRpb25zLgotCShtZF9hcHBseV9maXgpOiBGb3IgY2FsbHggcmVsb2NhdGlvbnMsIHN0b3JlIHplcm8uCi0JKHRjX2JvdXRfZml4X3RvX2NoYXJzKTogU3RvcmUgc3ltYm9sIGluZGV4IGZvciBhbGwgY2FsbHgKLQlyZWxvY2F0aW9ucywgcmVnYXJkbGVzcyBvZiBsaW5rLXJlbGF4IHNldHRpbmcuCi0JKHRjX2NvZmZfZml4MnJ0eXBlLCB0Y19jb2ZmX3NpemVtYWNoZGVwKTogTmV3IGZ1bmN0aW9ucy4KLQkoaTk2MF9oYW5kbGVfYWxpZ24pIFshIE9CSl9CT1VUXTogSWYgbGluay1yZWxheCBvcHRpb24gaXMKLQlzZWxlY3RlZCwgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgY2xlYXIgaXQuCi0JKiBjb25maWcvdGMtaTk2MC5oIChCRkRfQVJDSCwgQ09GRl9GTEFHUywgQ09GRl9NQUdJQywKLQlUQ19DT1VOVF9SRUxPQywgVENfQ09GRl9GSVgyUlRZUEUsIFRDX0NPRkZfU0laRU1BQ0hERVAsCi0JdGNfZml4X2FkanVzdGFibGUpOiBOZXcgbWFjcm9zLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSwgdGNfY29mZl9zaXplbWFjaGRlcCk6IERlY2xhcmUuCi0KLUZyaSBGZWIgMjUgMjA6NTY6NTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfc3ltYm9sKTogQ2FsbCBQQSBFTEYgQkZEIHZlcnNpb24uCi0JKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShwYV9idWlsZF9zeW1leHRuX3NlY3Rpb24pOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCShocHBhX3RjX21ha2Vfc3ltZXh0bl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHBhX2V4cG9ydCk6IERlbGV0ZSBjYWxsIHRvIHBhX2J1aWxkX3N5bWV4dG5fc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoaHBwYV90Y19zeW1ib2wpOiBBZGQgZXh0ZXJuIGRlY2wuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBEZWxldGUgZXh0ZXJuIGRlY2wuCi0JKGhwcGFfdGNfc3ltYm9sKTogRGVsZXRlIGV4dGVybiBkZWNsLgotCi1GcmkgRmViIDI1IDEzOjE1OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IENvcnJlY3QgdGVzdCBmb3Igd2hldGhlciB0bwotCWZpbGwgYSBzZWN0aW9uIChmcm9tIE1pbmggVHJhbi1MZSA8VFJBTkxFQGludGVsbGljb3JwLmNvbT4pLgotCi1UaHUgRmViIDI0IDExOjMwOjI2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcmVxdWlyZSB2ZXJzaW9uIG51bWJlciBmb3IgaTM4Ni0qLW1hY2guCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZGVkICIudGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLAotCXdoaWNoIGlzIGlnbm9yZWQgYnkgZ2FzLCBidXQgd2lsbCBjYXVzZSBvdGhlciBhc3NlbWJsZXJzIHRvIGNob2tlLgotCUludGVuZGVkIGZvciB1c2UgYnkgZ2NjIHBvcnRzIHRoYXQgcmVxdWlyZSBnYXMgaW5zdGVhZCBvZiBuYXRpdmUKLQlhc3NlbWJsZXJzLgotCi1UaHUgRmViIDI0IDA3OjEwOjMxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvaG8taHBwYW9zZi5oOiBGaXggYnJhaW5vIGluIHRlc3QgZm9yIEFOU0ktQy4KLQotV2VkIEZlYiAyMyAxNjo1MTo0MyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBHaXZlIHRoZSB1c2VyIGEgcmVhc29uYWJsZSBlcnJvcgotCW1lc3NhZ2UgcmF0aGVyIHRoYW4gImFzc2VydGlvbiBmYWlsZWQiIGlmIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotCWZhaWxzLgotCi1UdWUgRmViIDIyIDEwOjA3OjMyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLW1hY2gzLmg6IE5ldyBmaWxlLgotCi1Nb24gRmViIDIxIDExOjQxOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpOiBEb24ndCBzZXQgaGRyLT5tYWdpYyBoZXJlLiAgSXQgaXMKLQlub3cgc2V0IGluIGJmZC9lY29mZmxpbmsuYzplY29mZl93cml0ZV9zeW1oZHIuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jICh3cml0ZV9vYmplY3RfZmlsZSk6IHVzZSBiZmRfZ2V0X2Vycm9yICgpLAotCW5vdCBiZmRfZXJyb3IuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAoc19sY29tbSk6IFVzZSBhbiBhbGlnbm1lbnQgcG93ZXIgb2YgMyBmb3IgOCBieXRlIC5sY29tbQotCXZhcmlhYmxlcy4KLQotCSogY29uZmlnL2hvLWhwdXguaCAoQlJPS0VOX0FTU0VSVCk6IERlZmluZSBpZiBub3QgX19HTlVDX18uCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogVXNlIGNvcnJlY3QgYXJndW1lbnRzIHRvIG1lbWNweQotCShicm9rZW4gMTkgSnVsIDE5OTMpLiAgRnJvbSBramRAcGVzY2FkZXJvLnN0YW5mb3JkLmVkdSAoS2VubmV0aAotCUR1ZGEpLgotCi1TdW4gRmViIDIwIDE4OjAxOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2NvZmZfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX3BzZXVkb190YWJsZSk6IEZvciAic2VjdGlvbiIsIHVzZQotCW9ial9jb2ZmX3NlY3Rpb24uCi0JKG9ial9jb2ZmX3NlY3Rpb24pOiBSZXdyaXRlLgotCi1GcmkgRmViIDE4IDE0OjE2OjMyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW1hY2gzKik6IE5ldyB0YXJnZXQ7IHVzZXMgQkZELgotCSogY29uZmlnL3RlLW1hY2guaDogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1hb3V0LmggKG9ial9hb3V0X2Zyb2JfZmlsZSk6IERlY2xhcmUgaXQuCi0JKGZyb2JfZmlsZSk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeF8xKSBbVEVfTWFjaF06IERvbid0IGFkanVzdAotCXBjcmVsMzIgcmVsb2NhdGlvbnMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQVJHRVRfRk9STUFUKSBbVEVfTWFjaF06IFVzZSBhLm91dC1tYWNoMy4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBSZW1vdmVkIHJlZ2lzdGVyIGRlY2xhcmF0aW9ucy4KLQotVGh1IEZlYiAxNyAxNjoyNToxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlTb21lIHN1cHBvcnQgZm9yIFBvd2VyUEMgRUxGLgotCSogY29uZmlndXJlLmluOiBJZiBjcHUgaXMgcG93ZXJwYyosIHVzZSBwcGMuCi0JKHBwYy0qLXN5c3Y0Kik6IFVzZSBvYmplY3QgZm9ybWF0IGVsZi4KLQkqIGNvbmZpZy90Yy1wcGMuaDogT25seSBkZWNsYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyBpZiBPQkpfQ09GRiBpcwotCWRlZmluZWQuCi0JKFRBUkdFVF9BUkNIKTogTWFrZSBpdCBjYWxsIHBwY19hcmNoLgotCShwcGNfYXJjaCk6IERlY2xhcmUuCi0JKFRBUkdFVF9GT1JNQVQpOiBTZXQgYmFzZWQgb24gT0JKX0NPRkYgb3IgT0JKX0VMRi4KLQkoTk9fU1RSSU5HX0VTQ0FQRVMpOiBEZWZpbmUuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgZm9yIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtcHBjLmM6IE9ubHkgZGVmaW5lIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBvZiBPQkpfQ09GRgotCWlzIGRlZmluZWQuCi0JKG1kX3BzZXVkb190YWJsZSk6IE1vc3QgcHNldWRvLW9wcyBhcmUgT0JKX0NPRkYgc3BlY2lmaWMuICBBZGRlZAotCU9CSl9DT0ZGIHNwZWNpZmljICJiaSIgYW5kICJlaSIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEZpeCBoYW5kbGluZyBvZiAtdS4gIE1ha2UgLW02MDEgc2V0Ci0JUFBDX09QQ09ERV82MDEuICBJZiBPQkpfRUxGLCBhY2NlcHQgLVYgYW5kIC1RLgotCShwcGNfc2V0X2NwdSk6IE5ldyBmdW5jdGlvbi4KLQkocHBjX2FyY2gpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2JlZ2luKTogQ2FsbCBwcGNfc2V0X2NwdS4KLQkocHBjX2luc2VydF9vcGVyYW5kKTogRm9yIGEgc2lnbmVkIG9wZXJhbmQgYWNjZXB0IGFuIHVuc2lnbmVkCi0JdmFsdWUsIGZvciBJQk0gY29tcGF0aWJpbGl0eS4KLQkocHBjX2J5dGUpOiBEb24ndCBjYWxsIHN0cmluZ2VyIGZvciBzdHJpbmdzOyBpbnN0ZWFkLCB0cmVhdCB0d28KLQlkb3VibGUgcXVvdGVzIGFzIGEgc2luZ2xlIGRvdWJsZSBxdW90ZS4KLQkocHBjX2NvbW0pOiBTZXQgc3lfdGMub3V0cHV0IGZvciBhIC5sY29tbSBzeW1ib2wuCi0JKHBwY19iaWVpKTogTmV3IGZ1bmN0aW9uLgotCShwcGNfdGMpOiBJZiBub3QgT0JKX0NPRkYsIGlnbm9yZSBmaXJzdCBhcmd1bWVudC4KLQkocHBjX2ZpeF9hZGp1c3RhYmxlKTogQ2FsbCBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0JKHBwY19pc190b2Nfc3ltKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXgpOiBVc2UgcHBjX2lzX3RvY19zeW0uICBIYW5kbGUgQkZEX1JFTE9DXzE2IGFuZAotCUJGRF9SRUxPQ184LgotCi1UaHUgRmViIDE3IDA5OjI5OjM3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfcGVycm9yKSBbQkZEX0FTU0VNQkxFUl06IFVzZSBiZmRfZ2V0X2Vycm9yIGFuZAotCWJmZF9zZXRfZXJyb3IgYW5kIG5ldyBlcnJvciBuYW1lcy4KLQotVHVlIEZlYiAxNSAyMDoyMzoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFN1cHBvcnQgaTk2MC12eHdvcmtzIHZlcnNpb25zID4gNS4wIGFzIGNvZmYuCi0JRGVmYXVsdCBpcyBzdGlsbCBib3V0IGlmIG5vIHZlcnNpb24gaXMgc3BlY2lmaWVkLgotCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogVXNlIHN3aXRjaCBhbmQgc3RyY2FzZWNtcCBpbnN0ZWFkCi0Jb2YgbGFyZ2UgbnVtYmVyIG9mIGNvbXBhcmVzIHdoZW4gbG9va2luZyBmb3IgaW5mL25hbiB2YWx1ZXMuCi0KLUZyaSBGZWIgMTEgMTM6MTM6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IERvIHVuYWxpZ25lZCBsb2FkcyBhbmQgc3RvcmVzCi0JY29ycmVjdGx5IHdoZW4gYmlnIGVuZGlhbiwgYW5kIGdpdmUgZXJyb3JzIG9uIG92ZXJmbG93IHJhdGhlciB0aGFuCi0JZ2VuZXJhdGluZyBpbmNvcnJlY3QgY29kZS4KLQotVGh1IEZlYiAxMCAxMToyNDoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0KLQkqIHJlYWQuYyAoZG9fYWxpZ24pOiBEb24ndCBkZWZpbmUgbGFiZWwganVzdF9yZWNvcmRfYWxpZ25tZW50Ci0JdW5sZXNzIGl0IG1pZ2h0IGJlIHVzZWQuCi0KLQkqIGFzLmMgKG1haW4pOiBJZiBtZF9wYXJzZV9sb25nX29wdGlvbiBpcyBkZWZpbmVkLCBjYWxsIGl0IHdpdGggYQotCWxvbmcgb3B0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWRfcGFyc2VfbG9uZ19vcHRpb24pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3RyYXApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IFJlcG9ydCBhbiBlcnJvciBpZiBtaXBzX3RyYXAgaXMgc2V0IGF0IElTQSBsZXZlbCAxLgotCShtYWNybyk6IElmIG1pcHNfdHJhcCwgdXNlIHRyYXAgaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2YgYnJlYWsKLQlpbnN0cnVjdGlvbnMgZm9yIG92ZXJmbG93IGFuZCBkaXZpZGUgYnkgemVybyBkZXRlY3Rpb24uCi0JKG1pcHNfcGFyc2VfbG9uZ19vcHRpb24pOiBOZXcgZnVuY3Rpb24uICBTdXBwb3J0IC0tdHJhcCwKLQktLW5vLWJyZWFrLCAtLWJyZWFrIGFuZCAtLW5vLXRyYXAuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAiemVybyIuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wc2V1ZG9fdGFibGUpOiBSZW1vdmUgInplcm8iLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcHNldWRvX3RhYmxlKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTAgMDE6MjQ6MjcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUmVqZWN0IGludGVnZXIgdmFsdWVzIGZvcgotCXBjLXJlbGF0aXZlIG9wZXJhbmQgZmllbGRzLiAgVGhpcyBmb3JjZXMgImNhbGwgMCIgdG8gYmVjb21lICJqbXBsCi0JJWcwLCVvNyIgd2l0aCBubyByZWxvY2F0aW9ucyBuZWVkZWQuCi0KLVdlZCBGZWIgIDkgMTM6MDg6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcy5oICh4bWFsbG9jLCB4cmVhbGxvYyk6IERlY2xhcmUgdXNpbmcgUFRSIHJhdGhlciB0aGFuIGNoYXIgKi4KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBVc2UgUFRSIHJhdGhlciB0aGFuIGNoYXIgKi4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IElmIE5PX1NUUklOR19FU0NBUEVTIGlzIGRlZmluZWQsCi0JZG9uJ3QgdHJlYXQgYmFja3NsYXNoIHNwZWNpYWxseSBpbnNpZGUgc3RyaW5ncy4KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IExpa2V3aXNlLgotCi1XZWQgRmViICA5IDA5OjQyOjQ1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIG1lbXNldAotCWluc3RlYWQgb2YgbWVtY3B5IHRvIHplcm8gdGhlIGluaXRpYWwgc3RhYiBzeW1ib2wsIGR1aC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24pOiBEaXR0by4KLQotVHVlIEZlYiAgOCAxNzoyNTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBVc2UgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENhbGwgbWVtc2V0IHdpdGggdGhlIGFyZ3VtZW50cyBpbgotCXRoZSByaWdodCBvcmRlci4gIEV4cGxpY2l0bHkgY2xlYXIgZml4X3Jvb3QgYW5kIGZpeF90YWlsIGZpZWxkcy4KLQotVHVlIEZlYiAgOCAxNjowMDoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IEZvciBhYnNfc3ltYm9sLCBzZXQgKnB1bnQKLQlhbmQgZG8gbm90aGluZyBlbHNlLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9iZWdpbik6IEluaXRpYWxpemUgdmFsdWUgb2YgYWJzX3N5bWJvbAotCXByb3Blcmx5LgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFVzZSBhYnNfc3ltYm9sIGluc3RlYWQgb2YgY2FsbGluZwotCXNlY3Rpb25fc3ltYm9sLgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9kZWJ1Zyk6IEZpeCAiLyoiIGluIGNvbW1lbnQgdG8gc2lsZW5jZQotCWNvbXBsYWludCBmcm9tICJnY2MgLVdhbGwiLgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotbmV0d2FyZSopOiBOZXcgdGFyZ2V0LCBsaWtlIGFscGhhLSotb3NmKi4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKEdQX0FESlVTVE1FTlQpOiBNb3ZlIGRlZmluaXRpb24gdG8gc3RhcnQgb2YKLQlmaWxlLgotCSh0Y19nZW5fcmVsb2MpOiBSZW1vdmUgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBgY29kZScsIGFuZCBjb2RlCi0JdGhhdCB0cmllZCB0byB1c2UgaXQgKGluY29ycmVjdGx5KS4gIEZvciBMSVRFUkFMIHJlbG9jLCBzZXQgYWRkZW5kCi0JdG8gbmVnYXRpdmUgb2YgR1AgdmFsdWUuCi0JKGxvYWRfc3ltYm9sX2FkZHJlc3MpOiBEb24ndCBhZGp1c3QgcmV0dXJuIHZhbHVlIGJ5IEdQX0FESlVTVE1FTlQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IFByaW50IHNvbWUgc2Vuc2libGUgZXJyb3IgbWVzc2FnZSBpZgotCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gcmV0dXJucyBiZmRfcmVsb2Nfb3ZlcmZsb3cuCi0KLU1vbiBGZWIgIDcgMTU6NDk6MjQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKmVsZiopOiBOZXcgY29uZmlndXJhdGlvbiBmb3IgUEEgRUxGLgotCShocHBhKi0qLW9zZiopOiBEZWZhdWx0IG9iamVjdCBmb3JtYXQgaXMgU09NLgotCi1Nb24gRmViICA3IDE2OjA3OjM1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9hdG9mKTogV2FybiB0aGF0IGZsb2F0aW5nLXBvaW50IHZhbHVlcwotCW1pZ2h0IG5vdCBhc3NlbWJsZSBwcm9wZXJseS4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXQgYWxwaGEtKi1vc2YqKTogRG9uJ3Qgc2V0ICJkZXY9eWVzIiBhbnkKLQltb3JlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogUGFyZW50aGVzaXplIG9wZXJhdGlvbnMgaW4KLQlyYW5nZSBjaGVja2luZywgdG8gYXZvaWQgcHJlY2VkZW5jZSBxdWVzdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhZGRyMzIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgaXQgZm9yICItMzJhZGRyIi4KLQkobG9hZF9zeW1ib2xfYWRkcmVzcyk6IElmIGFkZHIzMiBpcyBzZXQsIHVzZSBsZGwgaW5zdGVhZCBvZiBsZHEuCi0KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBDYWxjdWxhdGUgbWF4aW11bV91c2VmdWxfZGlnaXRzCi0JYW5kIG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzIGluIGludGVnZXIgYXJpdGhtZXRpYywgdG8KLQllbGltaW5hdGUgdGhlIG9ubHkgc291cmNlcyBvZiBkZXBlbmRlbmNlIG9uIGZsb2F0aW5nIHBvaW50Ci0Jc3VwcG9ydCwgd2hpY2ggZG9lc24ndCB3b3JrIHlldCBvbiB0aGUgQWxwaGEuCi0KLU1vbiBGZWIgIDcgMDM6NTY6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9kZWJ1ZykgW1RDX0FMUEhBXTogU3BlY2lmeSB2ZXJzaW9uIHN0YW1wIGFzCi0JMHgzMGIgZm9yIEFscGhhIGZvciBub3csIHVudGlsICIudmVyc3RhbXAiIGlzIGhhbmRsZWQuCi0KLQkqIGxpdGVyYWwuYyAoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IFVzZSBzZWdpbmZvLT5mcmNoYWluUCwgd2hpY2gKLQlhY3R1YWxseSByZWZlcnMgdG8gdGhlIGxpdGVyYWwgcG9vbCBzZWN0aW9uLCByYXRoZXIgdGhhbgotCWZyY2hhaW5fbm93LCB3aGljaCByZWZlcnMgdG8gd2hhdGV2ZXIgc2VjdGlvbiB0aGUgYXNzZW1ibGVyIHdhcwotCWluLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogT25seSBkbyByYW5nZSBjaGVja2luZyBpZiBzaXplIG9mIGZpeHVwCi0JaXMgc21hbGxlciB0aGFuIHdvcmQgc2l6ZS4gIE90aGVyd2lzZSwgd2UgYWx3YXlzIHdpbmQgdXAgd2l0aAotCXplcm9zLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2VjdGlvbl9hbGlnbik6IENoYW5nZSBzZWNvbmQgYXJndW1lbnQgYW5kCi0JcmV0dXJuIHR5cGUgdG8gdmFsdWVULCB0byBhZ3JlZSB3aXRoIHRjLmguCi0JKGFscGhhX2RvX2FsaWduKTogTG9jYWwgc3RhdGljIGFycmF5IG5vcF9wYXR0ZXJuIGlzIG5vdyB1bnNpZ25lZAotCWNoYXIsIHRvIGF2b2lkIG92ZXJmbG93IHdhcm5pbmdzLgotCSogY29uZmlnL3RjLWFscGhhLmggKG1kX3NlY3Rpb25fYWxpZ24pOiBEZWxldGUgZGVjbGFyYXRpb24uCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRW5zdXJlIHRoYXQgZWNvZmZfZGF0YSBmb3IKLQlvdXRwdXQgYmZkIGlzIG5vbi1udWxsIGJlZm9yZSBpbmRpcmVjdGluZyB0aHJvdWdoIGl0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZnJvYl9lY29mZl9kYXRhKTogUmVuYW1lZCBmcm9tCi0JYWxwaGFfZnJvYl9maWxlLgotCSogY29uZmlnL3RjLWFscGhhLmggKHRjX2Zyb2JfZmlsZSk6IE1hY3JvIGRlbGV0ZWQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSkgW1RDX0FMUEhBXTogQ2FsbAotCWFscGhhX2Zyb2JfZWNvZmZfZGF0YSwgdGhlbiBmaWxsIGluIG9wdGlvbmFsLWhlYWRlciBpbmZvIHdpdGggZ3AKLQl2YWx1ZSBhbmQgcmVnaXN0ZXIgbWFza3MuCi0KLVN1biBGZWIgIDYgMTY6MTM6NDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaGl1eCk6IEZpeGVzIGZyb20gbS1rYXNhaHJAc3JhbWhjLnNyYS5jby5KUC4KLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IFNhbWUgY2hhbmdlCi0JYXMgY29mZmJmZCBhbmQgZWxmIGJlbG93LiAgWmVybyB0aGUgaW5pdGlhbCBzdGFiIHN5bWJvbCBhZnRlcgotCWFsbG9jYXRpbmcgaXQuCi0KLVNhdCBGZWIgIDUgMTI6MzA6MzIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBaZXJvIHRoZQotCWluaXRpYWwgc3RhYiBzeW1ib2wgYWZ0ZXIgYWxsb2NhdGluZyBpdC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBEaXR0by4KLQotU2F0IEZlYiAgNSAxMTo1MzozMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBhZGRiW3RmXSBzaG91bGQgb25seSBhY2NlcHQKLQlub24tbmVnYXRlZCBjb25kaXRpb24gY29tcGxldGVycy4gIEFkZCBzdXBwb3J0IGZvciBhZGRiIHBzZXVkby1vcAotCXdoaWNoIGFjY2VwdHMgYm90aCBuZWdhdGVkIGFuZCBub24tbmVnYXRlZCBjb21wbGV0ZXJzLgotCi1TYXQgRmViICA1IDAwOjE1OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChyczYwMDAqKTogVXNlIGNwdV90eXBlIHBwYy4KLQkocHBjLSotYWl4Kik6IE5ldyB0YXJnZXQ7IHVzZSBjb2ZmIGFuZCBmb3JjZSBiZmRfZ2FzLgotCSogY29uZmlnL3RjLXBwYy5oLCBjb25maWcvdGMtcHBjLmM6IE5ldyBmaWxlcyBmb3IgUG93ZXJQQy9QT1dFUgotCShSUy82MDAwKSBzdXBwb3J0LiAgQXQgdGhlIG1vbWVudCwgb25seSBYQ09GRiBpcyBzdXBwb3J0ZWQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChTQV9TRVRfU1lNX0VORE5EWCk6IE1hZGUgbm9uLXN0YXRpYy4KLQkoU19TRVRfREFUQV9UWVBFKTogTGlrZXdpc2UuCi0JKGNvZmZfbGFzdF9mdW5jdGlvbik6IFJlbmFtZWQgZnJvbSBsb2NhbCBzdGF0aWMgbGFzdF9mdW5jdGlvblAgaW4KLQljb2ZmX2Zyb2Jfc3ltYm9sIGFuZCBtYWRlIGV4dGVybmFsbHkgdmlzaWJsZS4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IE5ldyBsb2NhbCBzdGF0aWMgc2V0X2VuZDsgdXNlIGl0IHRvIHRyeSB0bwotCWF2b2lkIGNhbGxpbmcgU0FfU0VUX1NZTV9FTkRORFggb24gYSBzeW1ib2wgdGhhdCB3aWxsIGJlIHB1bnRlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX1NFVF9EQVRBX1RZUEUpOiBEZWNsYXJlLgotCShTQV9TRVRfU1lNX0VORE5EWCk6IERlY2xhcmUuCi0JKGNvZmZfbGFzdF9mdW5jdGlvbik6IERlY2xhcmUuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIERPTExBUl9ET1QgaXMgZGVmaW5lZCwgYWNjZXB0IGAkJyBhcwotCWVxdWl2YWxlbnQgdG8gYC4nIHRvIG1lYW4gdGhlIGN1cnJlbnQgbG9jYXRpb24uCi0KLQkqIHJlYWQuYyAoTEVYX0JSKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgotCShsZXhfdHlwZSk6IFVzZSBMRVhfQlIgYXMgdGhlIHR5cGUgb2YgYHsnLGB9JyxgWycsYF0nLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBJZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgaXMKLQlkZWZpbmVkLCBjYWxsIGl0IHdpdGggcHJlc2VydmVkX2NvcHlfb2ZfbmFtZS4gIElmCi0JdGNfc3ltYm9sX25ld19ob29rIGlzIGRlZmluZWQsIGNhbGwgaXQgb24gdGhlIG5ldyBzeW1ib2wuCi0JKHN5bWJvbF9maW5kX2Jhc2UpOiBJZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgaXMgZGVmaW5lZCwKLQljYWxsIGl0IG9uIGEgY29weSBvZiB0aGUgbmFtZSBhcmd1bWVudC4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTaW1wbGlmaWVkIHVzYWdlIG9mIG9ial9mcm9iX3N5bWJvbAotCWFuZCB0Y19mcm9iX3N5bWJvbC4gIEFsd2F5cyBjYWxsIGJvdGggaWYgdGhlIHN5bWJvbCBpcyBnb2luZyB0byBiZQotCW91dHB1dC4KLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IFVzZSAlbGQgcmF0aGVyIHRoYW4gJWQgd2hlbiBwcmludGluZwotCWZyYWdQLT5mcl92YXIsIGFuZCBjYXN0IGl0IHRvIGxvbmcuCi0KLQlDaGFuZ2VkIHJlbG9jcyB0byBiZSBiYXNlZCBvbiBzdWJzZWdtZW50cyAod2hlbiBCRkRfQVNTRU1CTEVSKS4KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IGZyY2hhaW4pOiBJZiBCRkRfQVNTRU1CTEVSLCBhZGRlZCBuZXcgZmllbGRzCi0JZml4X3Jvb3QgYW5kIGZpeF90YWlsLgotCShzZWdtZW50X2luZm9fdHlwZSk6IElmIEJGRF9BU1NFTUJMRVIsIGRvbid0IGRlZmluZSBmaXhfdGFpbAotCWZpZWxkLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IElmIEJGRF9BU1NFTUJMRVIsIHNldCBmaXhfcm9vdFAgYW5kCi0JZml4X3RhaWxQIGJhc2VkIG9uIGZyY2hhaW5fbm93LCBub3Qgc2VnX2luZm8gKG5vd19zZWcpLgotCShjaGFpbl9mcmNoYWluc190b2dldGhlcl8xKTogQ2hhaW4gdGhlIHN1YnNlZ21lbnQgcmVsb2NzIHRvZ2V0aGVyLgotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogRG9uJ3QgY2xlYXIgZml4X3RhaWwgZmllbGQuCi0JKHN1YnNlZ19nZXQpOiBMaWtld2lzZS4KLQkqIGxpdGVyYWwuYyAoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIHZpYQotCWZyY2hhaW5fbm93LCBub3Qgc2VnaW5mby4KLQotVGh1IEZlYiAgMyAyMzowNzozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBDaGFuZ2VkCi0JZWNvZmZfdW5kZWZpbmVkIHRvIGVjb2ZmX2V4dGVybl9zaXplLgotCSogY29uZmlnL29iai1lbGYuaCAoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2V4dGVybik6IFNldCBlY29mZl9leHRlcm5fc2l6ZSB0byB0aGUKLQlleHRlcm5hbCBzeW1ib2wgc2l6ZSwgcmF0aGVybiB0aGFuIHNldHRpbmcgdGhlIHN5bWJvbCB2YWx1ZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBDaGVjayBib3RoIGVjb2ZmX2V4dGVybl9zaXplIGFuZAotCXN5bWJvbCB2YWx1ZSB0byBzZWUgaWYgR1AgcmVmZXJlbmNpbmcgY2FuIGJlIHVzZWQuCi0JKiBlY29mZi5jIChlY29mZl9zeW1ib2xfbmV3X2hvb2spOiBDbGVhciBlY29mZl9leHRlcm5fc2l6ZSwgbm90Ci0JZWNvZmZfdW5kZWZpbmVkLgotCShlY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IGNoZWNrIGVjb2ZmX3VuZGVmaW5lZC4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEdldCBzaXplIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wgZnJvbQotCXN5bS0+ZWNvZmZfZXh0ZXJuX3NpemUsIG5vdCBTX0dFVF9WQUxVRSAoc3ltKS4KLQotV2VkIEZlYiAgMiAxMzo1NTowOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCBidWcgaW4gbG9zaW5nIGhwdXggc2VkLgotCi1XZWQgRmViICAyIDExOjQwOjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoZmlsZV9taXBzX2lzYSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogU2V0IGl0LgotCShzX21pcHNzZXQpOiBBZGQgc3VwcG9ydCBmb3IgLnNldCBtaXBOIHRvIHNldCB0aGUgSVNBIGxldmVsLgotCi0JKiBnYXNwLmMgKGtpbmZvKTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXplci4KLQotVHVlIEZlYiAgMSAxOToyODoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKG1hbGxvYyk6IERvbid0IGRlY2xhcmUsIHNpbmNlIGhvc3QuaCBvciBzeXN0ZW0gaGVhZGVyCi0JZmlsZXMgbWF5IGRlY2xhcmUgaXQgZGlmZmVyZW50bHkuCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoaW50X3RvX2dlbik6IE5vdyBzdGF0aWMuCi0KLQkqIGNvbmZpZy9oby1pMzg2YWl4Lmg6IEluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN0ZGxpYi5oLCBub3QKLQloby1zeXN2LmguICBCYXNlZCBsb29zZWx5IG9uIGEgcGF0Y2ggZnJvbSBNaW5oIFRyYW4tTGUuCi0KLVR1ZSBGZWIgIDEgMTA6NTA6MTcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jOiBJbmNsdWRlIGhvc3QuaC4KLQotVHVlIEZlYiAgMSAxMjoxMzowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBNYWtlIGFuIHVuc3VwcG9ydGVkIGluc3RydWN0aW9uIGEKLQl3YXJuaW5nLCBub3QgYW4gZXJyb3IuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb3RfdGV4dF9zeW1ib2wsIGRvdF9kYXRhX3N5bWJvbCwKLQlkb3RfYnNzX3N5bWJvbCk6IERvbid0IGRlZmluZSBpZiBCRkRfQVNTRU1CTEVSLgotCShvYmpfc3ltYm9sX3RvX2NoYXJzKTogYmZkX2NvZmZfc3dhcF9hdXhfb3V0IG5vdyB0YWtlcyBtb3JlCi0JYXJndW1lbnRzLgotCShjb2ZmX2xpbmVfYmFzZSk6IFJlbmFtZWQgZnJvbSBsaW5lX2Jhc2UuICBDaGFuZ2VkIGFsbCB1c2VzLgotCShjb2ZmX2FkZF9saW5lc3ltKTogUmVuYW1lZCBmcm9tIGFkZF9saW5lX3N5bS4gIE1hZGUgbm9uLXN0YXRpYy4KLQlDaGFuZ2VkIGFsbCB1c2VzLgotCSogY29uZmlnL29iai1jb2ZmLmg6IElmIFRDX1BQQywgaW5jbHVkZSBjb2ZmL3JzNjAwMC5oLgotCShTX1NFVF9TVE9SQUdFX0NMQVNTLCBTX0dFVF9TVE9SQUdFX0NMQVNTKTogRGVjbGFyZSBpZgotCUJGRF9BU1NFTUJMRVIuCi0JKGNvZmZfbGluZV9iYXNlKTogRGVjbGFyZS4KLQkoY29mZl9hZGRfbGluZXN5bSk6IERlY2xhcmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChzeW1ib2xfdG9fY2hhcnMpOiBiZmRfY29mZl9zd2FwX2F1eF9vdXQKLQlub3cgdGFrZXMgbW9yZSBhcmd1bWVudHMuCi0KLU1vbiBKYW4gMzEgMTc6NTU6MTQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcy5jIChzdGF0aXN0aWNzX2ZsYWcpOiBSZW5hbWVkIGZyb20gcXVpZXRfZmxhZy4KLQkobWFpbik6IEdldCBzdGF0aXN0aWNzIHdpdGggLS1zdGF0aXN0aWNzIGluc3RlYWQgb2YgLW5vcXVpZXQuCi0KLU1vbiBKYW4gMzEgMDc6MTk6MzAgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFN1cHBvcnQgZm9yIEdudSBBU3NlbWJsZXIgUHJlcHJvY2Vzc29yLgotCSogZ2FzcC5jOiBOZXcgZmlsZS4KLQkqIHJlYWQuYyAoc19sY29tbSk6IEFsaWduIGxjb21tIGRhdGEuCi0JKiBjb25maWcvdGMtejhrLmMgKHRjX3JlbG9jX21hbmdsZSk6IERvbid0IGFsbG93IHN1YnRyYWN0aW9uCi0JZnJvbSBkaWZmZXJlbnQgc2VjdGlvbnMuCi0KLVN1biBKYW4gMzAgMTQ6NTg6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiB0Y19mcm9iX2ZpbGUgaXMgZGVmaW5lZCwgY2FsbCBpdAotCWp1c3QgYmVmb3JlIGNhbGxpbmcgb2JqX2Zyb2JfZmlsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9ncF92YWx1ZSk6IFJlbmFtZWQgZnJvbSBncF92YWx1ZQotCShyZWZlcmVuY2VzIGNoYW5nZWQpLCBhbmQgbWFkZSBub24tc3RhdGljLgotCShnZXRFeHByZXNzaW9uKTogUmV0dXJuIHZvaWQuCi0JKHNlbGVjdF9ncF92YWx1ZSk6IEFib3J0IGlmIGdwX3ZhbHVlIGlzIG5vbi16ZXJvLiAgRGVsZXRlIGNhbGwgdG8KLQlub24tZXhpc3RlbnQgYmZkX3NldF9ncF92YWx1ZS4KLQkoYWxwaGFfdmFsaWRhdGVfZml4KTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoYWxwaGFfZnJvYl9zeW1ib2wpOiBGdW5jdGlvbiBkZWxldGVkLgotCShhbHBoYV9sb2NhbF9sYWJlbCk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGFscGhhX2Zyb2JfZmlsZSk6IFJlbmFtZWQgZnJvbSBhbHBoYV9lbmQuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoYWxwaGFfZnJvYl9zeW1ib2wsIGFscGhhX3ZhbGlkYXRlX2ZpeCwKLQlhbHBoYV9sb2NhbF9sYWJlbCwgYWxwaGFfZW5kKTogRGVjbGFyYXRpb25zIGRlbGV0ZWQuCi0JKGFscGhhX2dwX3ZhbHVlLCBhbHBoYV9mcm9iX2ZpbGUpOiBEZWNsYXJlLgotCSh0Y19mcm9iX3N5bWJvbCwgVENfVkFMSURBVEVfRklYLCBtZF9lbmQpOiBNYWNyb3MgZGVsZXRlZC4KLQkoTE9DQUxfTEFCRUwpOiBNb3ZlIGNvZGUgaGVyZSBmcm9tIHRjLWFscGhhLmM6YWxwaGFfbG9jYWxfbGFiZWwuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IFNpbXBsaWZpZWQgc2xpZ2h0bHkuCi0JKHRjX2Zyb2JfZmlsZSk6IE5ldyBtYWNyby4KLQotCSogcmVhZC5jIChkb19hbGlnbik6IE5ldyBmdW5jdGlvbiwgbW9zdCBvZiBndXRzIG9mIHNfYWxpZ25fKgotCWZ1bmN0aW9ucy4gIExvb2sgZm9yIG1kX2RvX2FsaWduIG1hY3JvLCBnaXZlIGl0IGEgY2hhbmNlIHRvIGJ5cGFzcwotCWFsbCBidXQgcmVjb3JkaW5nIG9mIHNlY3Rpb24gYWxpZ25tZW50LgotCShzX2FsaWduX2J5dGVzLCBzX2FsaWduX3B0d28pOiBDYWxsIGRvX2FsaWduLgotCShzX2xjb21tKSBbVENfQUxQSEFdOiBBbGlnbiBvYmplY3QgdG8gbGFyZ2VzdCBwb3dlciBvZiB0d28gdGhhdAotCWRpdmlkZXMgb2JqZWN0IHNpemUuCi0KLQkqIGZyYWdzLmMgKGZyYWdfYWxpZ25fcGF0dGVybik6IE5ldyBmdW5jdGlvbi4KLQkoZnJhZ19hbGlnbik6IFJld3JpdGUgZm9yIGNsYXJpdHkuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgT19jb25zdGFudCBleHByZXNzaW9uLgotCSh2aXBfYmVnaW4pOiBSZXR1cm5zIHBvaW50ZXIgdG8gY29uc3QgY2hhci4gIENhc3QgaGFzaF9pbnNlcnQgYXJnCi0JdG8gUFRSIHRvIGF2b2lkIGNvbXBpbGVyIGNvbXBsYWludHMgYWJvdXQgY29uc3QuCi0JKG1kX2JlZ2luKTogTG9jYWwgdmFyaWFibGUgZXJydHh0IG11c3QgcG9pbnQgdG8gY29uc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGhvc3QgdmF4LSotdWx0cml4KiBsaWtlIHZheC0qLWJzZCouICBEb24ndAotCWJvdGhlciB3aXRoICotKi11bHRyaXggb3IgKi0qLXN5c3YqLCBleGNlcHQgKi0qLXN5c3YsIHNpbmNlIG9ubHkKLQl0aGUgbGFzdCBoYXMgYW4gZXhpc3RpbmcgaG9zdCBzdXBwb3J0IGZpbGUuICBEbyBoYW5kbGUgdmF4LWJzZCBhbmQKLQl2YXgtdWx0cml4IHRhcmdldHMuCi0KLUZyaSBKYW4gMjggMTE6MjY6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbl9oZWFkZXJfYXBwZW5kKTogRG8gbm90Ci0JZGVjbGFyZSBpZiBCRkRfQVNTRU1CTEVSLgotCShzdGFja19wb3ApOiBDb3JyZWN0IHRlc3QgZm9yIHN0YWNrIHVuZGVyZmxvdy4KLQkob2JqX2NvZmZfZW5kZWYsIG9ial9jb2ZmX2RpbSwgb2JqX2NvZmZfbGluZSwgb2JqX2NvZmZfc2l6ZSwKLQlvYmpfY29mZl9zY2wsIG9ial9jb2ZmX3RhZywgb2JqX2NvZmZfdHlwZSwgb2JqX2NvZmZfdmFsKTogRGVjbGFyZQotCXR5cGUgb2YgaWdub3JlZCBhcmd1bWVudCB0byBhdm9pZCBnY2Mgd2FybmluZy4KLQkoYWxpZ24pOiBSZW1vdmVkIHVudXNlZCBmdW5jdGlvbi4KLQotVGh1IEphbiAyNyAxODoxNDoxOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYywgY29uZmlnL3RjLWFscGhhLmgsIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogTmV3Ci0JZmlsZXMsIGJhc2VkIG9uIHBvcnQgb2YgZ2FzLTEuMzggY29udHJpYnV0ZWQgYnkgQ01VLCB1c2luZyBhLm91dAotCXZhcmlhbnQuICBVcGRhdGVkIGZvciBnYXMtMi54IGFuZCBFQ09GRi4gIEZsb2F0aW5nLXBvaW50IGNvbnN0YW50cwotCWFyZSBzdGlsbCBicm9rZW4sIGJvb3RzdHJhcCB0ZXN0aW5nIGluY29tcGxldGUuCi0KLQkqIGxpdGVyYWwuYzogQ29tbWVudCBjaGFuZ2VzLgotCi0JKiBsaXN0aW5nLmMgKGxpc3Rpbmdfc291cmNlX2ZpbGUpOiBDaGVjayBmb3IgbnVsbCBsaXN0aW5nX3RhaWwKLQliZWZvcmUgaW5kaXJlY3RpbmcgdGhyb3VnaCBpdC4KLQotCSogZXhwci5oIChzdHJ1Y3QgZXhwcmVzc2lvblMpOiBBZGRlZCBzdHJ1Y3QgdGFnLgotCi0JKiBhcy5oOiBJZiBfX0dOVUNfXyBhbmQgaW5saW5lIGFyZSBib3RoIHVuZGVmaW5lZCwgZGVmaW5lIGlubGluZQotCWF3YXkuCi0KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBEb24ndCBhc3N1bWUgdGhhdCBmcl92YXIgZm9yCi0JcnNfYWxpZ24gb3IgcnNfb3JnIGZyYWdzIHdpbGwgYmUgMS4KLQkocmVsYXhfc2VnbWVudCk6IEZvciByc19hbGlnbiwgaWYgZnJfdmFyIGlzIG5vdCAxLCBjb21wbGFpbiBpZgotCXJlcXVpcmVkIHBhZGRpbmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIHNpemUgb2YgdGhlIHBhZCBwYXR0ZXJuLgotCShmaXh1cF9zZWdtZW50KTogTGVhdmUgZ3AtcmVsYXRpdmUgcmVsb2NhdGlvbnMgYWxvbmUuICBGb3IgcGNyZWwKLQlyZWxvY2F0aW9ucyByZWZlcnJpbmcgdG8gdGhlIHNhbWUgc2VnbWVudCwgY2xlYXIgZnhfcGNyZWwgd2hlbgotCWNsZWFyaW5nIGZ4X2FkZHN5LgotCSogYXMuaDogQWRqdXN0IGNvbW1lbnRzIG9uIHJzX2FsaWduLgotCi0JKiBhdG9mLWdlbmVyaWMuYzogU29tZSByZWZvcm1hdHRpbmcuCi0JKGF0b2ZfZ2VuZXJpYyk6IEJlIGNhcmVmdWwgd2hlbiBtaXhpbmcgc2lnbmVkL3Vuc2lnbmVkIHZhbHVlcyBvZgotCWRpZmZlcmVudCBzaXplcy4KLQotCSogd3JpdGUuYywgY29uZmlnL29iai17YW91dCxib3V0LGNvZmYqfS5jLCBjb25maWcvdGMtc3BhcmMuYzoKLQlRdWVyeSB0aGUgZnhfZG9uZSBmaWVsZCBpbnN0ZWFkIG9mIGZ4X2FkZHN5IHRvIHNlZSBpZiB0aGUgZml4dXAKLQlzdGlsbCBuZWVkcyB0byBiZSBhcHBsaWVkLiAgU2V0IGZ4X2RvbmUgYW5kIGNsZWFyIGZ4X2FkZHN5IGJvdGgsCi0JZm9yIG5vdy4gIElmIFRDX0hBTkRMRVNfRlhfRE9ORSBpc24ndCBkZWZpbmVkLCBhc3N1bWUgbWRfYXBwbHlfZml4Ci0Jd2lsbCBvbmx5IGNsZWFyIGZ4X2FkZHN5LCBhbmQgc2V0IGZ4X2RvbmUgYWNjb3JkaW5nbHkgYWZ0ZXIKLQlyZXR1cm5pbmcuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVENfSEFORExFU19GWF9ET05FKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IFNldCBmeF9kb25lIGZvciBub24tcGNyZWwgZml4Ci0Jd2l0aCBubyBmeF9hZGRzeS4KLQotCSogc3ltYm9scy5jIChkb3RfdGV4dF9zeW1ib2wsIGRvdF9kYXRhX3N5bWJvbCwgZG90X2Jzc19zeW1ib2wpOgotCURlbGV0ZWQuCi0JKHN5bWJvbF9iZWdpbik6IE1vdmVkIHRvIGVuZCBvZiBmaWxlLCBzbyBmdW5jdGlvbiBpbmxpbmluZyBjYW4KLQl3b3JrIGJldHRlci4KLQkoZmJfbGFiZWxfY291bnQsIGZiX2xhYmVsX21heCk6IERlZmF1bHQgQyBzdGF0aWMgaW5pdGlhbGl6ZXJzIGFyZQotCXN1ZmZpY2llbnQuCi0JKiBzeW1ib2xzLmggKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLCBkb3RfYnNzX3N5bWJvbCk6Ci0JRGVjbGFyYXRpb25zIGRlbGV0ZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsCi0JZG90X2Jzc19zeW1ib2wpOiBEZWZpbmVkIGhlcmUsIHN0YXRpYy4KLQotCSogY29uZmlnL29iai1hb3V0LmMgW0JGRF9BU1NFTUJMRVJdOiBVbmRlZiBOT19SRUxPQyBiZWZvcmUKLQlpbmNsdWRpbmcgYW91dC9hb3V0NjQuaC4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBFTUlUX1NFQ1RJT05fU1lNQk9MUyBpcyBmYWxzZSwKLQlkb24ndCB3cml0ZSBvdXQgYSBzZWN0aW9uIHN5bWJvbCBldmVuIGlmIGl0J3MgdXNlZCBpbiBhCi0JcmVsb2NhdGlvbjsgYXNzdW1lIHJlbG9jYXRpb25zIHdpbGwgaGFuZGxlIHNlY3Rpb24gbnVtYmVycwotCXNvbWVob3cuICBSZW5hbWUgInB1bnRfaXQiIGxhYmVsIHRvICJwdW50X2l0X2lmX3VudXNlZCIgdG8gcmVmbGVjdAotCWl0J3MgdHJ1ZSB1c2UuCi0JKEVNSVRfU0VDVElPTl9TWU1CT0xTKTogRGVmYXVsdCB0byAxLgotCShhZGp1c3RfcmVsb2Nfc3ltcyk6IERvbid0IGNyZWF0ZSBhIG5ldyBzeW1ib2wgZm9yIGFuIGFic29sdXRlCi0JcmVmZXJlbmNlOyBqdXN0IHVzZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuCi0JKHdyaXRlX3JlbG9jcyk6IE1ha2UgcHJpbnRvdXQgb2YgcmVsb2MgdmFsdWVzIGRlcGVuZGVudCBvbiBmbGFnCi0JREVCVUczLCBub3QgREVCVUcyLgotCSogY29uZmlnL29iai1hb3V0LmggKEVNSVRfU0VDVElPTl9TWU1CT0xTKTogRGVmaW5lIGFzIDAuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKEVNSVRfU0VDVElPTl9TWU1CT0xTKTogRGl0dG8uCi0KLVRodSBKYW4gMjcgMTY6NDM6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGxleF90eXBlKTogTm8gbG9uZ2VyIG1ha2UgJ3snIGEgdmFsaWQgY2hhcmFjdGVyIGZvcgotCXN5bWJvbCBuYW1lcy4KLQotCSogYXMuYyAobWFpbik6IFByaW50IGxvbmcgdmFsdWVzIHVzaW5nICVsZC4KLQotCSogbWVzc2FnZXMuYyAoYXNfd2Fybl9pbnRlcm5hbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFzX3dhcm4sIDMgdmVyc2lvbnMpOiBVc2UgYXNfd2Fybl9pbnRlcm5hbC4KLQkoYXNfd2Fybl93aGVyZSwgMyB2ZXJzaW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGFzX3dhcm5fd2hlcmUpOiBEZWNsYXJlLgotCi1UdWUgSmFuIDI1IDE4OjMwOjM0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAocXVpZXRfZmxhZyk6IE5ldyBmbGFnLgotCShtYWluKTogSWYgLW5vcXVpZXQgZ2l2ZW4sIGRpc3BsYXkgZXhlY3V0aW9uIHRpbWUgYW5kIG1lbW9yeSB1c2VkLgotCi1UdWUgSmFuIDI1IDE1OjUzOjExIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBkb2Mve2FsbC50ZXhpLGFzLnRleGluZm99OiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgSFBQQSBwb3J0LgotCi1Nb24gSmFuIDI0IDE5OjE4OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZnJvYl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uICBQdXQgdW5kZWZpbmVkCi0Jc3ltYm9scyBvZiBrbm93biBzaXplIGluIHRoZSB1bmRlZmluZWQgc2VjdGlvbi4gIFB1dCBzbWFsbCBjb21tb24KLQlzeW1ib2xzIGluIGEgLnNjb21tb24gc2VjdGlvbi4KLQkqIGVjb2ZmLmggKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2Zyb2Jfc3ltYm9sKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl93cml0ZV9zeW1ib2xfcCwgb2JqX2VsZl93cml0ZV9zeW1ib2wsCi0Jb2JqX2VsZl9mcm9iX3N5bWJvbCk6IFJlbW92ZWQgdW51c2VkIGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9iX3N5bWJvbCwgb2JqX3dyaXRlX3N5bWJvbCk6IFJlbW92ZWQKLQl1bnVzZWQgbWFjcm9zLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sLCBvYmpfZWxmX3dyaXRlX3N5bWJvbCk6IFJlbW92ZWQgZGVjbGFyYXRpb25zCi0Jb2YgdW51c2VkIGZ1bmN0aW9ucy4KLQkob2JqX2Zyb2Jfc3ltYm9sKTogRGVmaW5lIGlmIEVDT0ZGX0RFQlVHR0lORy4KLQotCSogdGMtbWlwcy5jIChnX3N3aXRjaF9zZWVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IGdfc3dpdGNoX3NlZW4gZm9yIC1HIG9wdGlvbi4KLQkoc19vcHRpb24pOiBJZiBjcmVhdGluZyBQSUMgY29kZSwgZm9yY2UgdGhlIEdQIHNpemUgdG8gYmUgMC4gIFdhcm4KLQlpZiAtRyBzd2l0Y2ggdXNlZCB3aXRoIGEgbm9uLXplcm8gdmFsdWUuCi0KLQkqIHN5bWJvbHMuYyAoU19JU19DT01NT04pOiBVc2UgYmZkX2lzX2NvbV9zZWN0aW9uIHJhdGhlciB0aGFuCi0JY29tcGFyaW5nIGFnYWluc3QgYmZkX2NvbV9zZWN0aW9uLgotCi1Nb24gSmFuIDI0IDE0OjEyOjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19sY29tbSk6IFRyZWF0IEFscGhhIGxpa2UgTUlQUyBpbiBoYW5kbGluZyBvZiAuc2JzcwotCXNlY3Rpb24uCi0KLVRodSBKYW4gMjAgMTM6MTc6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogRm9yIGZsb2F0aW5nIHBvaW50IG9wZXJhbmQgd2l0aCB1bnVzdWFsIGZwCi0JY2hhciBmcm9tIEZMVF9DSEFSUywgcHJlc2VydmUgdGhlIGNoYXJhY3Rlci4gIFBhdGNoIGZyb20gTGlzYQotCVJlcGthLgotCi1XZWQgSmFuIDE5IDIzOjE1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGFsbCBkYXRhIGFsbG9jYXRpb24KLQlwc2V1ZG8tb3BzOiAuaHdvcmQsIC5pbnQsIC5sb25nLCAub2N0YSwgLnF1YWQsIC5zaG9ydCwgLnNpbmdsZS4KLQotVHVlIEphbiAxOCAxNTo1MTo1OSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZW5kZWYpOiBGb3IgQ19FRkNOLCBDX0JMT0NLIGFuZAotCUNfRkNOIGFzc3VtZSAudmFsIGhhcyBiZWVuIHNldCB0byAuCi0KLVR1ZSBKYW4gMTggMTY6MTk6NTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IERpc2FibGUgbXVsdGlwbGUgJENPREUkIHN1YnNwYWNlIGNvZGUuICBJdAotCWNvbmZ1c2VzIEdEQiBmb3Igc29tZSB1bmtub3duIHJlYXNvbi4KLQkqIGNvZm5pZy9vYmotc29tLmM6IExpa2V3aXNlLgotCi1UdWUgSmFuIDE4IDE5OjA1OjMyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpdGVyYWwuYyAoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IEhhbmRsZSBkdXBsaWNhdGVzIG9mIHZhbHVlcwotCWFscmVhZHkgd3JpdHRlbiB0byBsaXRlcmFsIHBvb2wuCi0KLVR1ZSBKYW4gMTggMTc6MjM6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBUcnkgdG8gZ2V0IHN5bWJvbHMKLQl3aXRoIGV4cGxpY2l0bHkgbWFya2VkIHN0YWJzIHRocm91Z2ggQkZEOiBpZiBhIHN5bWJvbCBtYXJrZWQKLQlOX1VOREYgfCBOX0VYVCBpcyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiwgbW92ZSBpdCB0byB0aGUKLQl1bmRlZmluZWQgc2VjdGlvbjsgbW92ZSBhIHN5bWJvbCBtYXJrZWQgTl9JTkRSIGludG8KLQliZmRfaW5kX3NlY3Rpb24gYW5kIHNldCB0aGUgQlNGX0lORElSRUNUIGZsYWc7IHNldCB0aGUKLQlCU0ZfV0FSTklORyBmbGFnIGZvciBhIHN5bWJvbCBtYWtyZWQgTl9XQVJOSU5HLgotCi1Nb24gSmFuIDE3IDE1OjQwOjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogRGVjbGFyZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSk6IFJldHVybiB0eXBlIGlzIHZvaWQuCi0KLU1vbiBKYW4gMTcgMDA6MTg6NTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogRXhwbGljaXRseSBjaGVjayBmb3IgY29tbWEgYmVmb3JlICd1JwotCWFuZCAnZicgdGVtcGxhdGUgb3BlcmFuZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgJ04nLCAnTycsICdvJywgJzAnLCAnMScsICd1JywKLQlhbmQgJzInIGluIGNvcHIgYW5kIHNmdSBpbnN0cnVjdGlvbiB0ZW1wbGF0ZXMuCi0KLVN1biBKYW4gMTYgMTY6NDQ6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGFzLmggKHN1YnNlZ19mb3JjZV9uZXcpOiBBZGQgcHJvdG90eXBlLgotCi1TYXQgSmFuIDE1IDA5OjIwOjU1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBbGxvdyBsaW5lcyBsaWtlICIgZm9vbGFiIDoiLgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IEZpeCBjb21wdXRhdGlvbiBvZiBtYXNrLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogRml4IGxvb3AgdGVybWluYXRpb24gdGVzdC4KLQotVGh1IEphbiAxMyAxNjoxNToxNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBOZXcgZnVuY3Rpb24uCi0JKGN1cnJlbnRfZmlsZV9pZHgpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhZGRfZmlsZSk6IFVzZSBhbmQgaW5jcmVtZW50IGN1cnJlbnRfZmlsZV9pZHggaW5zdGVhZCBvZiBpbmR4Ci0JcGFyYW1ldGVyLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IE1ha2UgYWxsIGJpdGZpZWxkcyB1bnNpZ25lZC4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAoaTk2MF92YWxpZGF0ZV9maXgpOiBBZGRlZCBhcmd1bWVudAotCWFkZF9zeW1ib2xQUC4gIEluZGlyZWN0IHRocm91Z2ggaXQgdG8gZ2V0ICJhZGRfc3ltYm9sUCIuCi0JKiBjb25maWcvdGMtaTk2MC5oIChpOTYwX3ZhbGlkYXRlX2ZpeCk6IFN1cHBseSBwcm90b3R5cGUuCi0JKFRDX1ZBTElEQVRFX0ZJWCk6IFBhc3MgYWRkcmVzcyBvZiBhZGRfc3ltYm9sUC4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbmV0YnNkKik6IE5ldyB0YXJnZXQsIHVzaW5nIHRlLW5ldGJzZC5oLgotCShpMzg2LSotbmV0YnNkMC44KTogTmV3IHRhcmdldCwgbGlrZSAzODZic2QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRERFRiBpbiBNYWtlZmlsZSB0byAiZGVmaW5lIiBvciAidW5kZWYiLgotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5oKTogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JRGVmaW5lIG9yIHVuZGVmIEJGRF9BU1NFTUJMRVIgYXMgc3BlY2lmaWVkIGJ5ICQoQkZEREVGKS4KLQkoQUxMX0NGTEFHUyk6IE9taXQgJChCRkRERUYpLgotCSogYXMuaDogSW5jbHVkZSBjb25maWcuaC4KLQkoc3RydWN0IHN5bWJvbCk6IEFkZGVkIGZvcndhcmQgZGVjbGFyYXRpb24uCi0JKGFkZF90b19saXRlcmFsX3Bvb2wpOiBGaXggZGVjbGFyYXRpb24uCi0JKiBhcy5jOiBEb24ndCBpbmNsdWRlIGNvbmZpZy5oLgotCi0JKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBUYWtlIHN5bWJvbCBhbmQgYWRkZW5kIGFzCi0JYXJndW1lbnRzLCBpbnN0ZWFkIG9mIGV4cHJlc3Npb24sIGZvciBub3cuICBGaXggY2FsY3VsYXRpb24gb2YKLQlvZmZzZXQgdG8gcmV0dXJuLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKSBbTkVFRF9MSVRFUkFMX1BPT0xdOiBBZGQgZmllbGQKLQlsaXRlcmFsX3Bvb2xfc2l6ZS4KLQotVGh1IEphbiAxMyAxMjoxNDoyMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19nZXQpOiBBY2NlcHQgbmV3IGFyZ3VtZW50ICJmb3JjZV9uZXciLiAgSWYKLQlzZXQgdGhlbiBhIG5ldyBzZWdtZW50IGlzIGFsd2F5cyBjcmVhdGVkLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoc3Vic2VnX2ZvcmNlX25ldyk6IE5ldyBmdW5jdGlvbi4gIFNpbWlsYXIgdG8gc3Vic2VnX25ldywgYnV0Ci0JYWx3YXlzIGZvcmNlIGEgbmV3IHNlZ21lbnQgdG8gYmUgY3JlYXRlZC4KLQotCSogY29uZmlnL29iai1zb20uYyAoc29tX2Zyb2JfZmlsZSk6IENhbGwgYWRqdXN0X2NvZGVfc2VjdGlvbnMKLQlmb3IgZWFjaCBzZWN0aW9uLgotCShhZGp1c3RfY29kZV9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4gIEFkanVzdHMgdGhlIFZNQSBmb3IgYWxsIHRoZQotCSRDT0RFJCBzdWJzcGFjZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2Fzc2VtYmxlKTogQWxzbyBoYW5kbGUgY3JlYXRpbmcgYSBmaXh1cAotCWZvciB0aGUgdW53aW5kIGRlc2NyaXB0b3JzIGlmIGEgZnVuY3Rpb24ncyBsYWJlbCBmb2xsb3dzIHRoZQotCS5QUk9DIGFuZCAuRU5UUlkgZGlyZWN0aXZlcy4KLQkocGFfZW50cnkpOiBEb24ndCBzZXQgQlNGX0ZVTkNUSU9OIGZvciB0aGUgbGFiZWwgc3ltYm9sIGhlcmU7IGl0Ci0JaXMgZG9uZSBlbHNld2hlcmUuICBEb24ndCBjcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHVud2luZAotCWRlc2NyaXB0b3JzIGlmIHRoZSBmdW5jdGlvbidzIGxhYmVsIGhhcyBub3QgYmVlbiBkZWZpbmVkIHlldC4KLQkocGFfcHJvYyk6IEZvciBTT00sIHBsYWNlIGVhY2ggcHJvY2VkdXJlIHdpdGhpbiBhIG5ldyAkQ09ERSQKLQlzdWJzcGFjZS4gIEFkanVzdCB0aGUgc2VnbWVudCBhbmQgZnJhZyBmb3IgdGhlIGFzc29jaWF0ZWQKLQlmdW5jdGlvbiBsYWJlbCBpZiBpdCBleGlzdHMuCi0KLVdlZCBKYW4gMTIgMjI6MDU6MzMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X3N0cnVjdCk6IEFkZCBuZXcgInNlZ21lbnQiIGZpZWxkLgotCShocHBhX2ZpeF9uZXcpOiBJbml0aWFsaXplIHNlZ21lbnQgZmllbGQuCi0JKG1kX2FwcGx5X2ZpeCk6IERvIG5vdGhpbmcgZm9yIHBjLXJlbGF0aXZlIGZpeHVwIHdoaWNoIGludm9sdmVzCi0JY3Jvc3NpbmcgYSBzZWdtZW50IGJvdW5kYXJ5LgotCShwYV9wcm9jZW5kKTogVW5kZWZpbmUgdGhlIGN1cnJlbnQgbGFiZWwgYWZ0ZXIgaGFuZGxpbmcgLlBST0MKLQlhbmQgLlBST0NFTkQgZGlyZWN0aXZlcy4KLQkoZHVtbXlfc3ltYm9sKTogTWFrZSB0eXBlICJzeW1ib2xTICoiLiAgQ2hhbmdlIHJlZmVyZW5jZXMgYXMKLQlhcHByb3ByaWF0ZS4KLQotV2VkIEphbiAxMiAxMzoyOTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FzdCBhcnJheSBhcmd1bWVudCB0byB1bnNpZ25lZAotCWNoYXIuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc3ltc2VnaW5mby4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCBkZWZpbmUgcHVudF9pdCBpZiBpdCB3b24ndCBiZSB1c2VkLgotCShmaXh1cF9zZWdtZW50KTogRG9uJ3QgZGVmaW5lIHNraXAgaWYgaXQgd29uJ3QgYmUgdXNlZC4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBhcyBtaXBzX3RhcmdldF9mb3JtYXQuCi0JKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3RhcmdldF9mb3JtYXQpOiBEZWZpbmUgd2l0aCBhcHByb3ByaWF0ZQotCWRlZmF1bHQgZGVmaW5pdGlvbi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWYgLUVMIG9yIC1FQiBpcyB1c2VkLCBjaGFuZ2UgYnl0ZV9vcmRlciBhbmQKLQltaXBzX3RhcmdldF9mb3JtYXQgYXMgYXBwcm9wcmlhdGUuCi0KLVR1ZSBKYW4gMTEgMjE6NTI6MzYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBbm90aGVyIGF0dGVtcHQgdG8gZml4IGJ1Z3MKLQlkZWFsaW5nIHdpdGggbGFiZWxzIHdpdGhvdXQgY29sb25zIChmb3IgSFBQQSBhbmQgTVJJKS4KLQotVHVlIEphbiAxMSAxNzowMTowNiAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBUcnVuY2F0ZSBhcmdzIHRvICVoaS8lbG8gdG8gMzIgYml0cy4KLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogRml4IGNvbXB1dGF0aW9uIG9mIHRvb19tYW55X2RpZ2l0cy4KLQlWYXJpYWJsZSBkaWdpdF8yIHJlbmFtZWQgdG8gc3RhcnQuICBGaXggY2hlY2sgZm9yIHdoZXRoZXIgbnVtYmVyCi0Jd2lsbCBmaXQgaW4gMzIgYml0cy4KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogVXNlIHZhbHVlVCBpbnN0ZWFkIG9mIGxvbmcuCi0KLVR1ZSBKYW4gMTEgMTM6MDE6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jOiBJZiBUQ19NSVBTLCBpbmNsdWRlIGVsZi9taXBzLmguCi0JKHNwZWNpYWxfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKG9ial9lbGZfc3BlY2lhbF9zZWN0aW9uKTogR2V0IGRlZmF1bHQgdHlwZXMgYW5kIGF0dHJpYnV0ZXMgZnJvbQotCWxpc3Qgb2Ygc3BlY2lhbCBzZWN0aW9ucy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogRGVmaW5lLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IEZvcmNlIC5zZGF0YSBhbmQgLnNic3MKLQlzZWN0aW9ucyB0byBiZSBjbG9zZSB0b2dldGhlci4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBDb3JyZWN0ZWQgJGF0IHdhcm5pbmdzIGluIGEgY291cGxlIG9mCi0Jc3BvdHMuCi0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19wcmV2X2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaXN0aW5nLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShsaXN0aW5nX3ByZXZfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkoY2FsY19oZXgpOiBSZXNldCBieXRlX2luX2ZyYWcgdG8gemVybyBmb3IgZWFjaCBuZXcgZnJhZy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogQ2FsbCBsaXN0aW5nX3ByZXZfbGluZSBhZnRlcgotCWVtaXR0aW5nIG5vcCBpbnN0cnVjdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAobGlzdGluZy5vKTogRGVwZW5kcyB1cG9uIHN1YnNlZ3MuaC4KLQotTW9uIEphbiAxMCAwOTo1MjoyMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBQdXQgY2hlY2sgZm9yIG1pc3NpbmcgbGFiZWwgb24gLlBST0MKLQloZXJlLiAgSGFuZGxlIGNhc2Ugd2hlcmUgbGFiZWwgbWF5IGJlIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DLgotCShwYV9wcm9jKTogSXQgaXMgbm90IGFuIGVycm9yIGlmIHRoZSBwcm9jZWR1cmUncyBsYWJlbCBpc24ndAotCWRlZmluZWQgYmVmb3JlIHRoZSAuUFJPQyBkaXJlY3RpdmUuCi0KLVN1biBKYW4gIDkgMDQ6NDM6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90ZS1uZXRic2QuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQVJHRVRfRk9STUFUKSBbVEVfTmV0QlNEXTogVXNlIGJmZCB0YXJnZXQKLQlhLm91dC1uZXRic2QtMzg2IGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBKYW4gIDcgMTc6Mzg6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogRG9uJ3QgY2xvYmJlciB0aGUgRUNPRkYgc3ltYm9sIGluZm9ybWF0aW9uCi0Jd2l0aCB0aGUgYXNzb2NpYXRlZCBzdGFicyBpbmZvcm1hdGlvbi4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IE5ldmVyIHNldCB0aGUgdHlwZSBvZiBzdGFicyBzeW1ib2xzIHRvCi0Jc3RfR2xvYmFsLiAgRG9uJ3QgdXBkYXRlIHRoZSBzeW1ib2wgaW5kZXggb3IgaWZkIGlmIHRoZSBnYXMgc3ltYm9sCi0JaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBFQ09GRiBzeW1ib2wgKHdoaWNoIGlzIG5vdyB0aGUgY2FzZSBmb3IKLQlzdGFicyBzeW1ib2xzKS4KLQotRnJpIEphbiAgNyAxMToxNDowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQWRkIGEgTE9TSU5HX0NPTVBJTEVSIGlmZGVmIHRoYXQKLQlzcGxpdHMgdGhlIGZ1bmN0aW9uLgotCShtYWNybzIpOiBOZXcgZnVuY3Rpb24sIGlmIExPU0lOR19DT01QSUxFUiBkZWZpbmVkLgotCi1GcmkgSmFuICA3IDA5OjM4OjI1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiAgRG9uJ3QgZXZlciBmaWxsIHBhc3QgdGhlCi0JZW5kIG9mIGEgc2VjdGlvbi4gKHdyaXRlX29iamVjdF9maWxlKTogVGVtcG9yYXJ5IGZpeCAtIHNldHVwCi0Jc3Rkb3V0cHV0LgotCi1UaHUgSmFuICA2IDE4OjA1OjIxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBGaXggaGFuZGxpbmcgb2YgYWRkZW5kcyBpbgotCW5vbi1wY3JlbF9vZmZzZXQgcmVsb2NhdGlvbnMuCi0KLVRodSBKYW4gIDYgMDE6MDY6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogV2FybiBhYm91dCB1c2luZyAkMSBhcyB3ZWxsIGFzICRhdAotCXdpdGhvdXQgLnNldCBub2F0LgotCi1XZWQgSmFuICA1IDE0OjIyOjIyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpdGVyYWwuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoUkVBTF9TT1VSQ0VTLCBPQkpTKTogTGlzdCBpdC4KLQotCSogYXMuaCAoREVCVUcpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBleHByZXNzaW9uUywgc3RydWN0IGZpeCk6IERlY2xhcmUgaW4gY2FzZSB0aGV5J3JlIHVzZWQgaW4KLQlwcm90b3R5cGVzLgotCShhZGRfdG9fbGl0ZXJhbF9wb29sKSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRBUkdFVF9GT1JNQVQpIFtPQkpfQU9VVF06IEZpeCBmb3IgbmV3IG5hbWVzCi0JaW4gYmZkLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19nZXQpOiBOZXcgZnVuY3Rpb24uICBDcmVhdGVzIHNlZ21lbnQgaWYKLQluZWVkZWQsIHJldHVybnMgcG9pbnRlciwgYnV0IGRvZXNuJ3QgY2hhbmdlIGN1cnJlbnQgc2VnbWVudC4KLQkoc3Vic2VnX25ldyk6IFVzZSBpdC4KLQotVHVlIEphbiAgNCAxNToxMjo0MyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IEFkZCAkKHNyY2RpcikvLi4gdG8gcGxhY2VzIHRvIHNlYXJjaC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogSW5jbHVkZSBmaWxlcyBhcyAiYmZkLyIgaW5zdGVhZCBvZiAiLi4vYmZkLyIuCi0JKiBhcHAuYywgZmxvbnVtLmgsIGhleC12YWx1ZS5jIChjb25zdCk6IENoYW5nZSAjaWYgdG8gYmUgbW9yZQotCXBvcnRhYmxlLgotCi1UdWUgSmFuICA0IDIyOjExOjM0IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXZzdGEuaCwgY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgVlNUYQotCW1pY3JvLWtlcm5lbC4KLQotVGh1IERlYyAzMCAxNToyNzoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gbm93IHRha2VzIGFuCi0JYWRkaXRpb25hbCBhcmd1bWVudCwgdG8gcmV0dXJuIGFuIGVycm9yIHN0cmluZyAod2hpY2ggd2UgaWdub3JlKS4KLQotV2VkIERlYyAyOSAxNDozNzoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogRmllbGQgdGNfZml4X2RhdGEgc2hvdWxkIGJlIHR5cGUgUFRSLCBub3QKLQl2b2lkKiwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24tQU5TSSBjb21waWxlcnMuICBBZGRlZAotCXNpbmdsZS1iaXQgZmllbGQgImZ4X2RvbmUiLgotCi1TdW4gRGVjIDI2IDE0OjMxOjQ3IDE5OTMgIFRvcmJqb3JuIEdyYW5sdW5kICAodGVnZUBhZGRlci5jeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IENvbnZlcnQgdG8gbG93ZXIgY2FzZS4KLQlEZWxldGUgc3B1cmlvdXMgcmVnaXN0ZXIgbmFtZXMgIiVyNEwiLCBldGMuCi0JKHNlbGVjdG9yX3RhYmxlKTogU29ydCBhbmQgY29udmVydCB0byBsb3dlciBjYXNlLgotCShjb25zX2ZpeF9uZXdfaHBwYSk6IGByZWxvY190eXBlJyA9PiBgcmVsX3R5cGUnLgotCShwYV9pcCk6IEFsd2F5cyB1c2Ugc3RyY21wIGZvciBub24tdGV4dCBhbmQgc3RyY2FzZWNtcCBmb3IgdGV4dC4KLQkocmVnX25hbWVfc2VhcmNoKTogUmV3cml0ZSB0byBjYWxsIHN0cmNhc2VjbXAgb25seSBvbmNlIHBlcgotCWl0ZXJhdGlvbi4KLQkocGFfY2hrX2ZpZWxkX3NlbGVjdG9yKTogUmV3cml0ZSB0byB1c2UgYmluYXJ5IHNlYXJjaC4KLQkocGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIpOiBVc2Ugc3RyY2FzZWNtcCBmb3IgY29tcGxldGVyIGNvbXBhcmlzb25zLgotCShwYV9wYXJzZV9zcGFjZV9zdG10KTogJFRFWFQkIGFuZCAkUFJJVkFURSQgYXJlIHN5bWJvbHM7IHVzZSBjYXNlCi0Jc2Vuc2l0aXZlIGNvbXBhcmlzb25zLgotCShwYV9wYXJzZV9zcGFjZV9zdG10KTogQ2Fub25pY2FsaXplIHN0cm5jYXNlY21wIGFyZyB0byBsb3dlciBjYXNlLgotCShwYV9zcGFjZSk6ICIkdGV4dCQiID0+ICIkVEVYVCQiOyAiJHByaXZhdGUkIiA9PiAiJFBSSVZBVEUkIi4gIFVzZQotCWNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24gZm9yIGFsbCBzeW1ib2xpYyBuYW1lcy4KLQkocGFfc3Vic3BhY2UpOiBDYW5vbmljYWxpemUgc3RybmNhc2VjbXAgYXJnIHRvIGxvd2VyIGNhc2UuCi0JKHBhX3N1YnNwYWNlX3N0YXJ0KTogVXNlIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24gZm9yIHN5bWJvbGljIG5hbWVzLgotCi1Nb24gRGVjIDIwIDEwOjM3OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKSBbUkVMT0NfUkVRVUlSRVNfU1lNQk9MXTogSWYgbm8KLQlzeW1ib2wgaXMgcHJlc2VudCAoaS5lLiwgcmVsb2NhdGlvbiBhZ2FpbnN0IGFic29sdXRlKSwgY3JlYXRlIGEKLQlwaG9ueSBsb2NhbCBzeW1ib2wsIGFuZCB1c2UgaXQgaW4gdGhlIHJlbG9jLgotCShmaXh1cF9zZWdtZW50KTogV2hlbiBhZGp1c3RpbmcgYSByZWxvYyB3aXRoIGFuIGFic29sdXRlIHN5bWJvbCwKLQloYXZlIFRDX0ZPUkNFX1JFTE9DQVRJT04gY29udHJvbCBjbGVhcmluZyBhZGRfc3ltYm9sUCB0b28uCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoUkVMT0NfUkVRVUlSRVNfU1lNQk9MKTogRGVmaW5lLCBmb3IgT0JKX0NPRkYuCi0KLQkqIHN5bWJvbHMuYyAoU19JU19FWFRFUk5BTCwgU19JU19MT0NBTCk6IERvbid0IHVzZSBib3RoIEJTRl9FWFBPUlQKLQlhbmQgQlNGX0dMT0JBTCwgc2luY2UgdGhleSdyZSB0aGUgc2FtZS4KLQotCSogYXMuYyAobWFpbik6IE9ubHkgaW52b2tlIG1kX2VuZCBpZiBpdCdzIGRlZmluZWQgYXMgYSBtYWNyby4KLQkqIHRjLmggKG1kX2VuZCk6IERvbid0IGRlY2xhcmUgaXQuCi0JKiBjb25maWcvdGMtKi5bY2hdIChtZF9lbmQpOiBEZWxldGVkLCBpbiBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IGRvCi0JYW55dGhpbmcuCi0JKiBjb25maWcvdGMtdmF4LmMgKHZpcF9lbmQpOiBEZWxldGVkIG51bGwgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9taXBzX2VuZCk6IFJlbmFtZWQgZnJvbSBtZF9lbmQuCi0JKiBjb25maWcvdGMtbWlwcy5oIChtZF9taXBzX2VuZCk6IERlY2xhcmUuCi0JKG1kX2VuZCk6IE5ldyBtYWNybywgY2FsbHMgbWRfbWlwc19lbmQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgY2xvc2Ugb3V0cHV0IGZpbGUuCi0JKiBhcy5jIChtYWluKTogQ2xvc2Ugb3V0cHV0IGZpbGUgKGlmIG5lZWRlZCkgYWZ0ZXIgY2FsbGluZwotCWxpc3RpbmdfcHJpbnQsIHdoaWNoIHNob3VsZCBiZSBhZnRlciBjYWxsaW5nIHdyaXRlX29iamVjdF9maWxlLAotCXdoaWNoIHNldHMgdGhlIGZyYWcgYWRkcmVzc2VzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGltLCBvYmpfY29mZl9lbmRlZiwgb2JqX2NvZmZfbGluZSwKLQlvYmpfY29mZl9zY2wsIG9ial9jb2ZmX3NpemUsIG9ial9jb2ZmX3RhZywgb2JqX2NvZmZfdHlwZSwKLQlvYmpfY29mZl92YWwpOiBBZGQgdW51c2VkIGludCBhcmd1bWVudCB0byBzYXRpc2Z5IHByb3RvdHlwZXM7IGdvZXMKLQl3aXRoIElhbidzIDEwIFNlcCBjaGFuZ2VzLgotCShTX0dFVF9EQVRBX1RZUEUsIFNfU0VUX0RBVEFfVFlQRSwgU19HRVRfU1RPUkFHRV9DTEFTUywKLQlTX1NFVF9TVE9SQUdFX0NMQVNTKTogTm93IGZ1bmN0aW9uIGluc3RlYWQgb2YgbWFjcm9zLgotCShvYmpfZW1pdF9saW5lbm8pIFtCRkRfQVNTRU1CTEVSXTogRGVsZXRlZC4KLQkodGFnX2luc2VydCk6IExvY2FsIHZhciBFUlJPUl9TVFJJTkcgaXMgY29uc3QuICBVc2UgImNvbnN0IiBub3QKLQkiQ09OU1QiIGZvciBhcmd1bWVudCBOQU1FLiAgRml4ZWQgcHJvdG90eXBlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCBleHBsaWNpdCAiI2lmIDEiIGRpcmVjdGl2ZS4gIElmCi0JU19JU19FWFRFUk5BTCwgc2V0IHN0b3JhZ2UgY2xhc3MgdG8gQ19FWFQuCi0JKHNfZ2V0X25hbWUpOiBVc2UgImNvbnN0IiBub3QgIkNPTlNUIi4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0dFVF9EQVRBX1RZUEUsIFNfU0VUX0RBVEFfVFlQRSwKLQlTX0dFVF9TVE9SQUdFX0NMQVNTLCBTX1NFVF9TVE9SQUdFX0NMQVNTKTogRGVsZXRlZC4KLQkob2JqX2VtaXRfbGluZW5vKTogRGVjbGFyZSBvbmx5IGZvciBub24tQkZEX0FTU0VNQkxFUi4gIEZvcgotCUJGRF9BU1NFTUJMRVIsIGRlZmluZSBhcyBtYWNybyB0aGF0IGFib3J0cy4KLQkob2JqX2V4dHJhX3N0dWZmLCB0Y19oZWFkZXJzX2hvb2spOiBEZWNsYXJlIG9ubHkgZm9yCi0Jbm9uLUJGRF9BU1NFTUJMRVIuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBGaXggcHJvdG90eXBlLgotCi1TdW4gRGVjIDE5IDAwOjM3OjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IFRlc3Qgb2YgcGNyZWxfb2Zmc2V0IGhhZCBzZW5zZQotCXJldmVyc2VkLgotCi1UaHUgRGVjIDE2IDIxOjEzOjExIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9iZWdpbik6IEluaXRpYWxpemUgImR1bW15X2xhYmVsIi4KLQkodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEZvciByZWxvY2F0aW9ucyB3aGljaCBoYXZlIG5vIHN5bWJvbCwKLQlzZXQgc3ltX3B0cl9wdHIgdG8gZHVtbXlfbGFiZWwuICBBdm9pZHMgbG9zc2FnZSBpbiBnZW5lcmljIEJGRCBjb2RlLgotCi1UaHUgRGVjIDE2IDE2OjA3OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBObyBsb25nZXIgbWFrZSAnWycgYSB2YWxpZCBjaGFyYWN0ZXIgZm9yCi0Jc3ltYm9sIG5hbWVzLgotCi0JKiBjb25maWcvdGMtdmF4LmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogTG9jYWwgdmFyaWFibGUKLQlOQllURVNfUl9MRU5HVEggbm93IGNvbnN0LgotCi0JKiBjb25maWcvb2JqLSouYywgY29uZmlnL3RjLSouYzogT21pdCBzdXBlcmZsdW91cyAicmV0dXJuIgotCXN0YXRlbWVudHMgYXQgZW5kcyBvZiBmdW5jdGlvbnMuICBEb24ndCBjaGVjayBmb3IgbnVsbCByZXR1cm4gZnJvbQotCWhhc2hfbmV3LCBzaW5jZSBpdCB3b24ndCByZXR1cm4gYXQgYWxsIGlmIHRoZXJlJ3Mgbm8gbWVtb3J5Ci0JYXZhaWxhYmxlLiAgQWxzbywgY2hlY2sgZm9yIG51bGwgcmV0dXJuIGZyb20gaGFzaF9pbnNlcnQsIHJhdGhlcgotCXRoYW4gemVyby1sZW5ndGggc3RyaW5nLCBhcyBzdWNjZXNzIGluZGljYXRvci4KLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIHN1YnNlZ3MuaCAoc2VjdGlvbl9zeW1ib2wpOiBEZWNsYXJlLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBVc2UgaXQuCi0KLVdlZCBEZWMgMTUgMTU6Mzk6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBOZXcgdmFyaWFibGUuCi0JKENIRUNLRkxBR1MpOiBQYXNzIGl0IGRvd24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSk6IFBlcm1pdCBleHRyYSB0cmFpbGluZyBvcGVyYW5kczsKLQl1bnVzZWQgZm9yIG5vdywgYnV0IHN1cHBsaWVkIGJ5IEFscGhhIE9TRjEgY29tcGlsZXIuCi0KLQkqIGFzLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCShpbnRfdG9fZ2VuKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogY29uZmlnL2F0b2YtdmF4LmMgKGF0b2ZfdmF4KTogTlVMTCBpcyBub3QgYSB2YWxpZCBjaGFyYWN0ZXIKLQljb25zdGFudC4KLQotVHVlIERlYyAxNCAyMTozODoyNSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLW9zZiopOiBEbyBub3QgY29uc2lkZXIgdGhpcyBhIGRldmVsb3BtZW50YWwKLQljb25maWd1cmF0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgY2FzZXMgd2hlcmUgbm8KLQlyZWxvY2F0aW9uIHdpbGwgYmUgZW1pdHRlZCBmb3IgMzJiaXQgZm9ybWF0cy4KLQotTW9uIERlYyAxMyAyMzozMzo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG8gbm90IGNhbGwgaHBwYV9maWVsZF9hZGp1c3QKLQlmb3IgYW55IG9mIHRoZSAnVCcgZmllbGQgc2VsZWN0b3JzLgotCi1TYXQgRGVjIDExIDExOjIzOjEyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDg1MDAuYyAoYnVpbGRfYnl0ZXMpOiBHZXQgcmVsb2MgdHlwZSByaWdodCBmb3IgYQotCSVwYWdlIG9wZXJhdGlvbi4gKG1kX2Fzc2VtYmxlKTogRG9uJ3QgbW9kaWZ5IGlucHV0X2xpbmVfcG9pbnRlci4KLQkobWRjb2ZmX3NpemVtYWNoZGVwKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWg4NTAwLmggKFRDX0NPRkZfU0laRU1BQ0hERVApOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtejhrLmMgKGdldF9vcGVyYW5kKTogRGVsZXRlIGJvZ3VzIGNoZWNrLgotCi1XZWQgRGVjICA4IDE2OjMxOjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAobnVtYmVyX3RvX2NoYXJzXyopOiBEZWxldGUgYm9ndXMgcmFuZ2UgY2hlY2suCi0KLQkqIG91dHB1dC1maWxlLmMgKFRBUkdFVF9BUkNIKTogTm8gZGVmYXVsdC4KLQotVHVlIERlYyAgNyAxNjowMjo1MyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogVHJ1bmNhdGUgZGlzcHMgYmVmb3JlIGNhbGxpbmcKLQltZF9udW1iZXJfdG9fY2hhcnMuICAobWRfYXNzZW1ibGUpOiBEb24ndCBtb2RpZnkKLQlpbnB1dF9saW5lX3BvaW50ZXIuCi0KLU1vbiBEZWMgIDYgMTE6NDk6MDMgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgdXBkYXRlIGlucHV0X2xpbmVfcG9pbnRlci4KLQotTW9uIERlYyAgNiAxMToyMDowMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL29iai1zb20uW2NoXSAob2JqX3JlYWRfYmVnaW5faG9vayk6IFJlbW92ZSBsYXN0IGNoYW5nZS4KLQlCcmVha3Mgd2l0aCB0aGUgSFAgY29tcGlsZXJzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdHJ1Y3QgY2FsbF9pbmZvKTogUmVtb3ZlIGZpZWxkcyB3aGljaCB3ZXJlCi0Jc2V0IGJ1dCBuZXZlciB1c2VkLiAgUmVtb3ZlIGFsbCBjb2RlIHdoaWNoIHNldHMgdGhvc2UgZmllbGRzLgotCShzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbik6IExpa2V3aXNlLgotCShzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9jaGFpbik6IExpa2V3aXNlLgotCShwYV9kZXNjKTogRGVsZXRlIHVzZWxlc3MgZnVuY3Rpb24uICBEZWxldGUgYWxsIHJlZmVyZW5jZXMuCi0JKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IE5vIG5lZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIGZvcgotCXRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uCi0KLVN1biBEZWMgIDUgMTc6MDU6MjkgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21fdmVyc2lvbik6IFBhc3MgdmVyc2lvbiBzdHJpbmcgdG8KLQlTT00gQkZEIGJhY2tlbmQuCi0JKG9ial9zb21fY29weXJpZ2h0KTogTmV3IGZ1bmN0aW9uLiAgTXVjaCBsaWtlIG9ial9zb21fdmVyc2lvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAob2JqX2NvcHlyaWdodCk6IERlZmluZSBhcyBhcHByb3ByaWF0ZSBmb3IKLQlTT00gYW5kIEVMRi4KLQkocGFfY29weXJpZ2h0KTogSnVzdCBhIHN0dWIgbm93LgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfcmVhZF9iZWdpbl9ob29rKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9yZWFkX2JlZ2luX2hvb2spOiBQcm92aWRlIGR1bW15IGRlZmluaXRpb24uCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogRGVsZXRlLiAgU09NIGlzbid0IG1ha2luZyB1c2Ugb2YgdGhlbS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZSByZWxvY2F0aW9uCi0JZXhwYW5zaW9uIGR1ZSB0byByb3VuZGluZyBtb2RlIHNlbGVjdG9ycy4gIEhhbmRsZSBSX1tSRFNOXV9NT0RFCi0JcmVsb2NhdGlvbnMgZm9yIHNlbGVjdGluZyB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChldmFsdWF0ZV9hYnNvbHV0ZSk6IFN1cHBvcnQgZV9ycnNlbCBhbmQKLQllX3Jsc2VsIGZpZWxkIHNlbGVjdG9ycy4KLQotRnJpIERlYyAgMyAxODozMzoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmg6IElmIEVDT0ZGX0RFQlVHR0lORywgdW5kZWYKLQlTRVBBUkFURV9TVEFCX1NFQ1RJT05TIGFuZCBJTklUX1NUQUJfU0VDVElPTiwgYW5kIGRlZmluZQotCU9CSl9QUk9DRVNTX1NUQUIgdG8gY2FsbCBlY29mZl9zdGFiLgotCSogY29uZmlnL29iai1lbGYuYzogRG9uJ3QgY29tcGlsZSBvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIGlmCi0JSU5JVF9TVEFCX1NFQ1RJT04gaXMgbm90IGRlZmluZWQuCi0KLUZyaSBEZWMgIDMgMTA6NTY6NDAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERlbGV0ZSBvbGQgd3JhcHBlciBmdW5jdGlvbi4KLQkobWRfYXBwbHlfZml4XzEpOiBSZW5hbWUgdG8gbWRfYXBwbHlfZml4LiAgRml4IGFyZ3VtZW50IGRlY2xzLgotCUZpeCBjb21tZW50cyBpbiB2YXJpb3VzIHBsYWNlcy4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQlBdm9pZCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBmeF9hZGRzeS4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogQXZvaWQgZGVyZWZlcmVuY2luZyBhIE5VTEwgZnhfYWRkc3kuCi0KLQlGcmkgRGVjICAzIDA5OjQ3OjMwIDE5OTMgIFBldGUgSG9vZ2VuYm9vbSAgKGhvb2dlbkBjcy51dGFoLmVkdSkKLQotCSogdGMtaHBwYS5jOiAodGNfZ2VuX3JlbG9jKTogQWRkZW5kIGZvciBhIHBsYWJlbCByZWxvY2F0aW9uIHNob3VsZAotCWJlIGVpdGhlciAwIG9yIDIgKG5vIHN0YXRpYyBsaW5rIG9yIHN0YXRpYyBsaW5rIHJlcXVpcmVkKS4gIEFsd2F5cwotCWFzc3VtZSBubyBzdGF0aWMgbGluay4KLQotVGh1IERlYyAgMiAxMTo1MjoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IE1ha2UgYWRqdXN0bWVudCB0byBhZGRlbmQgYmUKLQlkZXBlbmRlbnQgb24gaG93dG8gZmllbGRzLCBub3Qgb24gZm9ybWF0IGZsYXZvdXIuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogTmV3IGZpZWxkcyBzeV9vYmogYW5kIHN5X3RjLAotCWRlZmluZWQgYXMgdHlwZXMgT0JKX1NZTUZJRUxEX1RZUEUgYW5kIFRDX1NZTUZJRUxEX1RZUEUsIGlmIHRob3NlCi0JbWFjcm9zIGFyZSBkZWZpbmVkLgotCSogY29uZmlnL29iai1jb2ZmLmggKFRDX1NZTUZJRUxEX1RZUEUsIE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUywgSTk2MF9TWU1fRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCShzeV90Yywgc3lfb2JqKTogRGVmaW5lIHNvIHRoYXQgdGhlIGZpZWxkcyBsb29rIGxpa2UgdGhleSB1c2VkIHRvLAotCXVudGlsIGFsbCByZWZlcmVuY2VzIGdldCBjaGFuZ2VkLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogTG90cyBvZiB2YXJpYWJsZXMgbm8gbG9uZ2VyIHJlZ2lzdGVyLgotCVJlb3JkZXJlZCBzb21lIGNvZGUgZm9yIGVhc2llciByZWFkaW5nLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2RpbSk6IGRpbV9pbmRleCBubyBsb25nZXIgcmVnaXN0ZXIuCi0JRGVsZXRlZCBzdXBlcmZsdW91cyByZXR1cm4gc3RhdGVtZW50LgotCShvYmpfY29mZl9saW5lLCBvYmpfY29mZl9zaXplLCBvYmpfY29mZl9zY2wsIG9ial9jb2ZmX3R5cGUsCi0Jb2JqX2NvZmZfdmFsLCB0YWdfaW5pdCwgdGFnX2luc2VydCk6IERlbGV0ZWQgc3VwZXJmbHVvdXMgcmV0dXJuCi0Jc3RhdGVtZW50LgotCShhbGlnbiwgb2JqX2NvZmZfc2VjdGlvbik6IERlbGV0ZWQgZGVidWdnaW5nIHByaW50ZnMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IERpc2NhcmQgc29tZSByZWdpc3RlciBkZWNscy4KLQlVc2UgYXNzaWdubWVudCByYXRoZXIgdGhhbiBtZW1jcHkgdG8gY29weSB0ZW1wbGF0ZS4KLQkob3BfaGFzaCwgcmVnX2hhc2gsIHByZWZpeF9oYXNoKTogRGVmYXVsdCBDIGluaXRpYWxpemF0aW9uIG9mCi0Jc3RhdGljcyBpcyBzdWZmaWNpZW50LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHByaW50X2luc24pOiBBcnJheSBSZWxvYyBpcyBub3cgY29uc3QsIGFuZAotCXBvaW50cyB0byBjb25zdC4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpOiBPbmx5IHVzZSBjb2ZmLXNwYXJjLWx5bnggaWYKLQlURV9MWU5YOyB1c2UgY29mZi1zcGFyYyBvdGhlcndpc2UuCi0JW1VTRV9OQVRJVkVfSEVBREVSU106IERlbGV0ZSB0aGlzIGNvZGU7IGl0IGlzbid0IHVzZWQuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDYWxsIFRDX1ZBTElEQVRFX0ZJWCwgaWYgZGVmaW5lZCwKLQliZWZvcmUgcHJvY2Vzc2luZyBhIGZpeHVwLiAgQ2FsbCBUQ19BREpVU1RfUkVMT0NfQ09VTlQganVzdCBiZWZvcmUKLQlyZXR1cm5pbmcuICBSZW1vdmUgc29tZSBpOTYwLWNvZmYtc3BlY2lmaWMgY29kZS4KLQkoVENfQURKVVNUX1JFTE9DX0NPVU5UKTogRGVmYXVsdCB0byBkb2luZyBub3RoaW5nLgotCSogY29uZmlnL3RjLWk5NjAuaCAoVENfQURKVVNUX1JFTE9DX0NPVU5UKSBbT0JKX0NPRkZdOiBEZWZpbmUuCi0JKGk5NjBfdmFsaWRhdGVfZml4KTogRGVjbGFyZS4KLQkoVENfVkFMSURBVEVfRklYKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWk5NjAuYyAoaTk2MF92YWxpZGF0ZV9maXgpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHdyaXRlLmMgKG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4pOiBOZXcgZnVuY3Rpb24uICBXcml0ZSBvdXQKLQlieXRlcyBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLCBkb2luZyBzaXplIGFuZCByYW5nZSBjaGVja2luZy4KLQkobnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbik6IE5ldyBmdW5jdGlvbiwgc2ltaWxhci4KLQkqIHdyaXRlLmg6IERlY2xhcmUgdGhlbS4KLQkqIGNvbmZpZy90Yy0qLmMgKG1kX251bWJlcl90b19jaGFycyk6IFVzZSB0aGVtLgotCSogY29uZmlnL3RjLXZheC5jIChtZF9hcHBseV9maXgpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeCk6IERpdHRvLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogUmVhcnJhbmdlZCBjb2RlIGZvciBoYW5kbGluZyBsaW5lIG51bWJlcgotCWRhdGEuCi0JKGxpbmVfZnN5bSk6IFJlbmFtZWQgZnJvbSBmdW5jdGlvbl9saW5lb2ZmIGluIEJGRF9BU1NFTUJMRVIgY2FzZSwKLQlzaW5jZSB0aGUgdXNhZ2UgaXMgZGlmZmVyZW50IGZyb20gbm9uLUJGRF9BU1NFTUJMRVIgY2FzZS4KLQkoaW5fZnVuY3Rpb24sIGNsZWFyX2Z1bmN0aW9uLCBzZXRfZnVuY3Rpb24pOiBOZXcgbWFjcm9zLCB0bwotCWNvbWJpbmUgc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZCBpbiBkaWZmZXJuZXQgd2F5cyBpbgotCUJGRF9BU1NFTUJMRVIgYW5kIG5vbi0uLi4gY29kZS4gIFVzZWQgaW4gb3RoZXIgZnVuY3Rpb25zIHRoYXQgdXNlZAotCXRvIGNoZWNrIGZ1bmN0aW9uX2xpbmVvZmYgJmMuCi0JKG9ial9lbWl0X2xpbmVubyk6IFNwbGl0IGludG8gdHdvIGNvcGllcywgb25lIGZvciBCRkRfQVNTRU1CTEVSLAotCW9uZSBmb3Igbm90LiAgTm9uLUJGRF9BU1NFTUJMRVIgdmVyc2lvbiBub3cgaGFzIHRlbXBvcmFyeSB2YXJpYWJsZQotCXRvIGNvbnRhaW4gY2hhciogcG9pbnRlciBwb2ludGVkIHRvIGJ5IGNoYXIqKiBhcmd1bWVudC4gIEFsd2F5cwotCWZvbGxvdyBDUk9TU19DT01QSUxFIGNvZGU7IGVhc2llciB0byByZWFkIHRoYXQgd2F5LgotCShvYmpfY29mZl9sbik6IERvbid0IGNhbGwgYWRkX2xpbmVubyBvciBjX2xpbmVfbmV3IGlmIGFwcGxpbmUgaXMKLQlzZXQuCi0JKG9ial9jb2ZmX2VuZGVmKSBbQkZEX0FTU0VNQkxFUl06IERvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yCi0JIi5iZiIsIGl0J3MgYmVlbiBkb25lIGVsc2V3aGVyZS4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IElmIGlsbmUgbnVtYmVyIGRhdGEgaXMgcGVuZGluZywgY2FsbAotCWFkZF9saW5lc3ltIHRvIGZsdXNoIGl0LgotCShjb2ZmX2Zyb2JfZmlsZSk6IERvbid0IGRvIHRoYXQgaGVyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKG9ial9mcm9iX2ZpbGUpOiBEZWZpbmUsIHRvIGNhbGwgaXQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheDogRGVmaW5lIHRoZW0gYXMgbWFjcm9zIGNhbGxpbmcKLQlhc19mYXRhbC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBEb24ndCBkZWZpbmUgdGhlbSBhcyBmdW5jdGlvbnMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHRhcmdldCBhbHBoYS0qLW9zZiouICAoTm8gY3B1IGZpbGVzIHlldC4pCi0KLVdlZCBEZWMgIDEgMjM6Mzc6MTQgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlIChjbGVhbik6IERlcGVuZCBvbiBjbGVhbi1oZXJlLgotCi1XZWQgRGVjICAxIDExOjM1OjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1nbzMyLmg6IEluY2x1ZGUgZm9wZW4tYmluLmguCi0JKiBhcy5oOiBJZiBGT1BFTl9XQiBpc24ndCBkZWZpbmVkLCBpbmNsdWRlIGZvcGVuLXNhbWUuaC4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IFVzZSBGT1BFTl9XQiBpbnN0ZWFkIG9mICJ3Ii4KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9vcGVuKTogVXNlIEZPUEVOX1JUIGluc3RlYWQgb2YgInIiLgotCSogbGlzdGluZy5jIChmaWxlX2luZm8pOiBVc2UgRk9QRU5fUkIgaW5zdGVhZCBvZiAicmIiLgotCSogcmVhZC5jIChzX2luY2x1ZGUpOiBVc2UgRk9QRU5fUlQgaW5zdGVhZCBvZiAiciIuCi0KLQkqIHN0YWJzLmM6IEluY2x1ZGUgb2JzdGFjay5oLgotCi0JKiB0Yy5oIChtZF9jcmVhdGVfbG9uZ19qdW1wKTogRG9uJ3QgZGVjbGFyZSBpZiBpdCdzIGFscmVhZHkKLQlkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IERpdHRvLgotCi0JKiBtZXNzYWdlcy5jIChhc19wZXJyb3IpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9lcnJtc2cgaW5zdGVhZAotCW9mIHN0cmVycm9yLiAgQ2xlYXIgYmZkX2Vycm9yLgotCi0JKiBjb25maWcvdGUtbHlueC5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUsIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQotV2VkIERlYyAgMSAxMDo0MTo1NiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKHBhX3Byb2Nlc3NfZXhpdCwgcGFfcHJvY2VuZCk6IENhbGwgaXQgZm9yIEVMRiBvYmplY3RzLgotCi1XZWQgRGVjICAxIDEyOjEwOjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBTdWJ0cmFjdCA4IGZyb20gb2Zmc2V0IGluIG5vbiBQSUMgbC5kCi0JY2FzZS4gIFNlZSBjb21tZW50LiAgRnJvbSB3aWxzb25AY3lnbnVzLmNvbTogZm9yIE1fTF9EQUIsIHNldAotCWNvcHJvYyBiZWZvcmUgZG9pbmcgZ290byBsZC4KLQotVHVlIE5vdiAzMCAxMzo0MDozMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogd3JpdGUuYyAoVENfRk9SQ0VfUkVMT0NBVElPTik6IFByb3ZpZGUgYSBkZWZhdWx0IGRlZmluaXRpb24uCi0JKGZpeHVwX3NlZ21lbnQpOiBBbGxvdyB0aGUgdGFyZ2V0IG1hY2hpbmUgdG8gc3BlY2lmeSB0aGF0IGEKLQlyZWxvY2F0aW9uIG11c3QgYmUgZ2VuZXJhdGVkIGZvciBhIHBhcnRpY3VsYXIgZml4dXAuICBSZW1vdmUKLQkjaWZuZGVmIFRDX0hQUEEgaGFjay4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4XzEpOiBOZXZlciBjaGFuZ2UgZnhfYWRkc3kgdG8KLQliZSBOVUxMLiAgT25seSBmaXh1cF9zZWdtZW50IGlzIHN1cHBvc2VkIHRvIGRvIHRoYXQuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IE5ldyBmdW5jdGlvbi4KLQotVHVlIE5vdiAzMCAxMToyMTo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzdGFicy5vKTogQWRkZWQgZGVwZW5kZW5jaWVzLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IERvbid0IGNhbGwgYmZkX3NldF9zeW10YWIuCi0KLVN1biBOb3YgMjggMTI6MTE6NDAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBPdXRwdXQgYSBUQUIgYmVmb3JlIGFueQotCS5hcHAqIGRpcmVjdGl2ZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogTWFrZSBzdXJlIGEgc3ViX3N5bWJvbAotCWV4aXN0cyBiZWZvcmUgdHJ5aW5nIHRvIHBlZWsgYXQgaXRzIG5hbWUuCi0JKHBhX3NwYWNlKTogRG8gbm90IGNhbGwgcGFfYWxpZ25fc3Vic2VnLiAgU2VlIGhwcGEvdW5zb3J0ZWQvYWxpZ24zLnMKLQlmb3IgdGVzdGNhc2UuCi0JKHBhX2FsaWduX3N1YnNlZyk6IERlbGV0ZSB1bnVzZWQvdW53YW50ZWQgZnVuY3Rpb24uCi0KLVNhdCBOb3YgMjcgMjI6NDk6MDcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogRml4IHRlc3QgZm9yIHdoZW4gdG8gc3RpY2sgYSBjb2xvbgotCW9uIHRoZSBlbmQgb2YgYSBsYWJlbC4gIE1ha2UgY29kZSBjb25kaXRpb25hbCBvbiBlaXRoZXIgTVJJIG9yCi0JTEFCRUxTX1dJVEhPVVRfQ09MT05TLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSWYgYSBsaW5lIGJlZ2lucyB3aXRoIHdoaXRlc3BhY2UsIGxlYXZlCi0JdGhlIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhbG9uZS4gIEVhdCBhbGwgb3RoZXJzLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChMQUJFTFNfV0lUSE9VVF9DT0xPTlMpOiBEZWZpbmUuCi0KLVdlZCBOb3YgMjQgMDE6MjI6NTQgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3Byb2NlbmQpOiBEbyBub3QgY2FsbCBwcm9jZXNzX2V4aXQuCi0JKGV4aXRfcHJvY2Vzc2luZ19jb21wbGV0ZSk6IERlbGV0ZSB1bndhbnRlZCB2YXJpYWJsZSBhbmQgYWxsCi0JcmVmZXJlbmNlcy4KLQotV2VkIE5vdiAyNCAwMjozMTozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldHVwX2V4dCk6IFJlbmFtZWQgZnJvbSBlY29mZl9idWlsZF9leHQuCi0JQ2hhbmdlZCB0byBub3QgYWN0dWFsbHkgYnVpbGQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiwgYXMKLQl0aGF0IGlzIG5vdyBkb25lIGJ5IHRoZSBFQ09GRiBiYWNrIGVuZC4KLQkoZWNvZmZfYnVpbGRfZGVidWcpOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCSogZWNvZmYuaCAob2JqX2Vjb2ZmX3NldF9leHQpOiBEZWNsYXJlLiAgIG9iai1mb3JtYXQuYyBmdW5jdGlvbgotCWNhbGxlZCBieSBlY29mZl9zZXR1cF9leHQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IElmIGRlYnVnX2luZm8gY291bnQgaXMgMCwKLQlzZXQgY29ycmVzcG9uZGluZyBwb2ludGVyIHRvIE5VTEwuICBEb24ndCBzZXQgcmF3X3NpemUgYW5kCi0JcmF3X3N5bWVudHMuCi0JKG9ial9lY29mZl9zZXRfc3ltX2luZGV4KTogUmVtb3ZlZC4KLQkob2JqX2Vjb2ZmX3NldF9leHQpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9zZXRfc3ltX2luZGV4KTogRG9uJ3QgZGVmaW5lLgotCShvYmpfZWNvZmZfc2V0X3N5bV9pbmRleCk6IERvbid0IGRlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWNvZmZfc2V0X2V4dCwgZWxmX2dldF9leHRyLAotCWVsZl9zZXRfaW5kZXgpOiBOZXcgZnVuY3Rpb25zIHVzZWQgZm9yIEVDT0ZGX0RFQlVHR0lORy4KLQkoZWxmX2Zyb2JfZmlsZSk6IFJld29ya2VkIEVDT0ZGIGRlYnVnIGdlbmVyYXRpb24gdG8gdXNlCi0JbmV3IGZ1bmN0aW9ucyBpbiBiZmQvZWNvZmZsaW5rLmMuCi0KLVN1biBOb3YgMjEgMjM6NTQ6NTIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMpOiBPbmx5IGNyZWF0ZSB0aGUgdW53aW5kCi0Jc3Vic3BhY2UgZm9yIEVMRi4gIEluIHRoZSBTT00gd29ybGQsIHRoZSBsaW5rZXIgaXMgcmVzcG9uc2libGUKLQlmb3IgY3JlYXRpbmcgdGhlIHVud2luZCBzdWJzcGFjZXMuCi0KLUZyaSBOb3YgMTkgMTY6MjU6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYzogVXNlIFBBUkFNUyByYXRoZXIgdGhhbiBFWEZVTi4KLQkoeWFua19zeW1ib2xzKTogRG9uJ3QgY2FsbCBTX1NFVF9FWFRFUk5BTCBpZiB0aGUgc3RvcmFnZSBjbGFzcyBpcwotCWFscmVhZHkgc2V0LiAgRml4ZXMgLmRlZiB2YXI7IC52YWwgZXh0ZXJuYWxfdmFyOyAuc2NsIDM7IC5lbmRlZi4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbik6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZSByZXR1cm4gdHlwZS4gIFJlbW92ZQotCXVudXNlZCB2YXJpYWJsZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IERlY2xhcmUgdGNfY29mZl9maXgycnR5cGUgYW5kCi0JdGNfY29mZl9zaXplbWFjaGRlcC4KLQotRnJpIE5vdiAxOSAwNDozMzo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGlzYWJsZSBvYmpfY2hlY2tfZmlsZV9zeW1ib2xzCi0JaG9vazsgb25seSBiYWNrIGVuZCB1c2luZyBpdCB3YXNuJ3QgdXNpbmcgaXQgY29ycmVjdGx5LgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IEFsd2F5cyBjYWxsIG9ial9mcm9iX3N5bWJvbCBhbmQKLQl0Y19mcm9iX3N5bWJvbDsgYWx3YXlzIHJldGFpbiBzeW1ib2wgaWYgaXQncyB1c2VkIGJ5IGEgcmVsb2NhdGlvbiwKLQlyZWdhcmRsZXNzIG9mIHdoYXQgdGhlc2Ugcm91dGluZXMgaW5kaWNhdGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IFJlbmFtZWQgZnJvbQotCWNvZmZfY2hlY2tfZmlsZV9zeW1ib2xzLgotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9jaGVja19maWxlX3N5bWJvbHMpOiBEZWxldGVkLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogRGVjbGFyZS4KLQkob2JqX2Zyb2Jfc3ltYm9sKTogQ2FsbCBpdC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4sIG9ial9lbWl0X3N0cmluZ3MsCi0Jb2JqX3ByZV93cml0ZV9ob29rKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShjX3NlY3Rpb25faGVhZGVyKTogRGl0dG8uICBEZWxldGUgc3VwZXJmbHVvdXMgcmV0dXJuIGF0IGVuZCBvZgotCWZ1bmN0aW9uLgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCBbVENfU1BBUkNdOiBJbmNsdWRlIGNvZmYvc3BhcmMuaCwgYW5kIHNwZWNpZnkKLQljb2ZmLXNwYXJjLWx5bnguCi0JKFNBX0dFVF9TWU1fVEFHTkRYKTogVXNlIEJGRF9IRUFERVJTIHZlcnNpb24gZm9yIEJGRF9BU1NFTUJMRVIKLQl0b28uCi0JKGNfc2VjdGlvbl9oZWFkZXIpOiBSZXdyaXRlIHByb3RvdHlwZSBzbyB0aGF0IGl0IGNvbnRhaW5zIG5vCi0JcHJlcHJvY2Vzc2luZyBkaXJlY3RpdmVzLiAgRG9uJ3QgZGVjbGFyZSBpdCBhdCBhbGwgaWYKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLWx5bnhvcyk6IE5ldyB0YXJnZXQsIHVzaW5nIGNvZmYgYW5kCi0JQkZEX0FTU0VNQkxFUi4KLQotCSogc3RhYnMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoUkVBTF9TT1VSQ0VTLCBPQkpTKTogTGlzdCBpdC4KLQkqIHJlYWQuYyAoU1RBQl9TRUNUSU9OX05BTUUsIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSwKLQlnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LCBzX3N0YWJfZ2VuZXJpYywgc19zdGFiLCBzX3hzdGFiLCBzX2Rlc2MpOgotCU1vdmVkIHRvIG5ldyBmaWxlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIGNvZmYgZmlsZXMgbGlrZSBlbGYKLQlmaWxlcy4KLQotV2VkIE5vdiAxNyAxNzoyMzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWlyaXg1Kik6IE5ldyB0YXJnZXQuICBVc2UgZWxmIGFuZCBtaXBzLWJpZy4KLQkqIGNvbmZpZy9vYmotZWxmLmM6IElmIEVDT0ZGX0RFQlVHR0lORywgaW5jbHVkZSBlY29mZi5oLgotCShvYmpfcHNldWRvX3RhYmxlKTogSWYgRUNPRkZfREVCVUdHSU5HLCBkZWZpbmUgRUNPRkYKLQlwc2V1ZG8tb3BzLgotCShvYmpfcmVhZF9iZWdpbl9ob29rKTogSWYgRUNPRkZfREVCVUdHSU5HLCBjYWxsCi0JZWNvZmZfcmVhZF9iZWdpbl9ob29rLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogSWYgRUNPRkZfREVCVUdHSU5HLCBjYWxsCi0JZWNvZmZfc3ltYm9sX25ld19ob29rLgotCShvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogQ2FzdCBhbGxvY2EgcmVzdWx0LgotCShlbGZfZnJvYl9maWxlKTogSWYgRUNPRkZfREVCVUdHSU5HLCBmaW5pc2ggdXAgRUNPRkYgZGVidWdnaW5nCi0JaW5mb3JtYXRpb24gYW5kIHdyaXRlIGl0IG91dCBpbnRvIC5tZGVidWcgc2VjdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IE5ldyBtYWNyby4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBVc2UgRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTLgotCShFQ09GRl9ERUJVR0dJTkcpOiBEZWZpbmUgaWYgVENfTUlQUy4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBJZiBFQ09GRl9ERUJVR0dJTkcsIG92ZXJyaWRlIHRvIGFkZAotCWZpZWxkcyByZXF1aXJlZCBieSBFQ09GRi4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IENoZWNrIEVDT0ZGX0RFQlVHR0lORyByYXRoZXIgdGhhbgotCU9CSl9FQ09GRiBpbiBtYW55IGNhc2VzLgotCShtaXBzX2FueV9ub3Jlb3JkZXIpOiBOZXcgdmFyaWFibGUuCi0JKG1pcHNfY3ByZXN0b3JlX29mZnNldCk6IEluaXRpYWxpemUgdG8gLTEuCi0JKG1pcHNfZnJhbWVfcmVnKTogTmV3IHZhcmlhYmxlLgotCShSRUxBWF9FTkNPREUsIFJFTEFYX09MRCwgUkVMQVhfTkVXLCBSRUxBWF9SRUxPQzEsCi0JUkVMQVhfUkVMT0MyLCBSRUxBWF9SRUxPQzMsIFJFTEFYX1dBUk4pOiBOZXcgbWFjcm9zLgotCShtZF9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgImdwd29yZCIgYW5kICJjcGFkZCIuCi0JKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSBvayB0byBmYWxzZS4gIElmIE9CSl9FTEYsIHNldCBhbGlnbm1lbnQKLQlvZiB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdG8gNC4gIFNldCBhbGlnbm1lbnQgb2YKLQkucmVnaW5mbyBzZWN0aW9uIHRvIDIuICBJZiBFQ09GRl9ERUJVR0dJTkcsIGNyZWF0ZSAubWRlYnVnCi0Jc2VjdGlvbi4KLQkoQUxJR05fRVJSLCBBTElHTl9FUlIyKTogUmVtb3ZlZCB1bnVzZWQgYW5kIHVzZWxlc3MgYWxpZ25tZW50Ci0JY2hlY2suCi0JKGFwcGVuZF9pbnNuLCBtYWNyb19idWlsZCwgbWFjcm9fYnVpbGRfbHVpKTogVGFrZSBwbGFjZQotCWFyZ3VtZW50LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoYXBwZW5kX2luc24pOiBJZiBhcHBlbmRpbmcgYSBub3AsIGRvbid0IGVtaXQgb25lLgotCShtYWNyb19idWlsZCk6IENoYW5nZWQgYXNzZXJ0aW9uIGZvciAnaScsICdqJywgJ28nIGNhc2UuCi0JKGdwX3JlZmVyZW5jZSk6IFJlbW92ZWQuCi0JKGxvYWRfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KLQkobWFjcm8pOiBJZiBtaXBzX25vcmVvcmRlciBpcyB1c2VkLCBzZXQgbWlwc19hbnlfbm9yZW9yZGVyLgotCUV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGhhbmRsZSBHUCBhbmQgUElDIHN5bWJvbHMgZGlmZmVyZW50bHkuCi0JQnVpbGQgYm90aCBwb3NzaWJsZSBjb2RlIGNob2ljZXMgdXNpbmcgYSB2YXJpYW50IGZyYWcsIGFuZAotCW1ha2UgYSBmaW5hbCBkZWNpc2lvbiBhdCB0aGUgZW5kIG9mIGFzc2VtYmx5IHdoZW4gYWxsCi0JaW5mb3JtYXRpb24gaXMga25vd24uICBBZGRlZCBQSUMgc3VwcG9ydCBmb3IgYWxsIHN5bWJvbAotCXJlZmVyZW5jZXMuCi0JKG1pcHNfaXApOiBEb24ndCBwZXJtaXQgYW55dGhpbmcgYnV0IGEgbnVtYmVyIGFmdGVyICQgZm9yIGEKLQljb3Byb2Nlc3NvciByZWdpc3Rlci4gIERvbid0IHVzZSAubGl0NCBvciAubGl0OCBzZWN0aW9ucyB3aGVuCi0JZ2VuZXJhdGluZyBQSUMgY29kZS4gIElmIE9CSl9FTEYsIHNldCBhbGlnbm1lbnQgb2YgLmxpdDQgb3IKLQkubGl0OCBzZWN0aW9uIHRvIDQuCi0JKG1kX2FwcGx5X2ZpeCk6IEFjY2VwdCBhbmQgaWdub3JlIEdPVDE2IGFuZCBHUFJFTDMyIHJlbG9jcy4KLQkoc19jaGFuZ2Vfc2VjKTogU2V0IGFsaWdubWVudCBvZiBFTEYgLnJvZGF0YSBvciAuc2RhdGEgc2VjdGlvbgotCXRvIDQuCi0JKHNfbWlwc3NldCk6IElmIC5zZXQgbm9yZW9yZGVyLCBzZXQgbWlwc19hbnlfbm9yZW9yZGVyLgotCShzX2NwbG9hZCk6IElnbm9yZSAuY3Bsb2FkIGlmIG5vdCBnZW5lcmF0aW5nIFBJQyBjb2RlLiAgV2FybgotCWlmIC5jcGxvYWQgaXMgbm90IGluIG5vcmVvcmRlciBzZWN0aW9uLgotCShzX2NwcmVzdG9yZSk6IElnbm9yZSAuY3ByZXN0b3JlIGlmIG5vdCBnZW5lcmF0aW5nIFBJQyBjb2RlLgotCShzX2dwd29yZCwgc19jcGFkZCk6IE5ldyBmdW5jdGlvbnMuCi0JKHRjX2dldF9yZWdpc3Rlcik6IEFkZGVkIGZyYW1lIGFyZ3VtZW50OyBpZiB0cnVlLCBzZXQKLQltaXBzX2ZyYW1lX3JlZyB0byByZXR1cm4gdmFsdWUuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IERvbid0IGVycm9yIG91dCwgYnV0IGluc3RlYWQKLQlkZXRlcm1pbmUgaG93IG11Y2ggYSBmcmFnIHNob3VsZCBncm93LgotCSh0Y19nZW5fcmVsb2MpOiBSZXR1cm4gbXVsdGlwbGUgcmVsb2NzIGlmIGFwcHJvcHJpYXRlLCBhcwotCWRldGVybWluZWQgYnkgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXguCi0JKG1kX2NvbnZlcnRfZnJhZyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IFNldCBFTEYgaGVhZGVyIGZsYWdzIGJhc2VkIG9uCi0JbWlwc19hbnlfbm9yZW9yZGVyIGFuZCBtaXBzX3BpYy4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRSk6IERlZmluZS4KLQkoTUFYX1JFTE9DX0VYUEFOU0lPTik6IERlZmluZSB0byBiZSAzLgotCShtZF9yZWxheF9mcmFnKTogRGVmaW5lIHRvIGJlIDAuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IERvbid0IGRlZmluZS4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogQ2hhbmdlZCBkZWNsYXJhdGlvbi4KLQotCSogZWNvZmYuaCwgZWNvZmYuYzogTmV3IGZpbGVzIHB1bGxlZCBvdXQgb2YgY29uZmlnL29iai1lY29mZi5jIHRvCi0Jc3VwcG9ydCBnZW5lcmF0aW5nIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgTUlQUyBFTEYKLQl0YXJnZXRzLiAgQ29tcGlsZWQgb25seSBpZiBFQ09GRl9ERUJVR0dJTkcgaXMgZGVmaW5lZC4gIENoYW5nZWQKLQloYW5kbGluZyBvZiBleHRlcm5hbCBzeW1ib2xzOiBpdCBub3cgYWx3YXlzIGdlbmVyYXRlcyBleGFjdGx5Ci0JdGhvc2UgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgc3ltYm9sIGxpc3QuCi0JKiBNYWtlZmlsZS5pbiAoUkVBTF9TT1VSQ0VTKTogQWRkZWQgZWNvZmYuYy4KLQkoUkVBTF9IRUFERVJTKTogQWRkZWQgZWNvZmYuaC4KLQkoT0JKUyk6IEFkZGVkIGVjb2ZmLm8uCi0JKGVjb2ZmLm8pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL29iai1lY29mZi5jOiBBbG1vc3QgZW50aXJlbHkgbW92ZWQgaW50byBlY29mZi5jLgotCVJlbWFpbmluZyBjb2RlIG1vc3RseSBqdXN0IGNhbGxzIGVjb2ZmLmMgY29kZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogRGVmaW5lIEVDT0ZGX0RFQlVHR0lORy4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBNYWtlIGVjb2ZmX3N5bWJvbCBhIHBvaW50ZXIgdG8gYQotCXN0cnVjdCBsb2NhbHN5bS4KLQkob2JqX3JlYWRfYmVnaW5faG9vaywgb2JqX3N5bWJvbF9uZXdfaG9vayk6IERlZmluZSB0byBjYWxsCi0JZnVuY3Rpb25zIGluIGVjb2ZmLmMuCi0JKGVjb2ZmX3N0YWIpOiBEb24ndCBkZWNsYXJlIChub3cgZGVjbGFyZWQgaW4gZWNvZmYuaCkuCi0JKG9ial9zZXRfc3ltX2luZGV4KTogRGVmaW5lLgotCShvYmpfZWNvZmZfc2V0X3N5bV9pbmRleCk6IERlY2xhcmUuCi0KLQkqIGZyYWdzLmggKGZyYWdfZ3Jvdyk6IERlY2xhcmUuCi0JKiBmcmFncy5jIChmcmFnX2dyb3cpOiBNYWRlIG5vbi1zdGF0aWMuCi0KLQkqIHdyaXRlLmMgKGlzX2RucmFuZ2UpOiBEbyBub3QgZGVmaW5lIGlmIG1kX3JlbGF4X2ZyYWcgaXMgZGVmaW5lZC4KLQkocmVsYXhfc2VnbWVudCk6IElmIG1kX3JlbGF4X2ZyYWcgaXMgZGVmaW5lZCwgdXNlIGl0IHRvIGhhbmRsZSBhCi0JZnJhZyBvZiB0eXBlIHJzX21hY2hpbmVfZGVwZW5kZW50IHJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaAotCW1kX3JlbGF4X3RhYmxlLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IElmIHdlIGZpbmQgYSBiYWQgcHNldWRvLW9wLAotCWRvIGEgY29udGludWUgdG8gZ28gb24gdG8gdGhlIG5leHQgbGluZSByYXRoZXIgdGhhbiBhIGJyZWFrLgotCVJlbW92ZWQgZHVwbGljYXRlIGJhZCBwc2V1ZG8tb3AgY29kZSB3aGljaCB3YXMgbmV2ZXIgZXhlY3V0ZWQuCi0KLQkqIHJlYWQuYyAoc19sY29tbSk6IERvIG5vdCByZXF1aXJlIGEgY29tbWEgYWZ0ZXIgdGhlIG5hbWUuCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBDaGFuZ2VkIGhhZG9uZSBmaWVsZCB0byBiaXRmaWVsZC4KLQlBZGRlZCBic3MgYml0ZmllbGQuCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBTZXQgYnNzIGZsYWcgZm9yIGJzc19zZWN0aW9uLgotCSogcmVhZC5jIChzX2xjb21tKTogU2V0IGJzcyBmbGFnIGZvciAuc2JzcyBzZWN0aW9uIGlmIHVzZWQuCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBEb24ndCBzZXQgU0VDX0hBU19DT05URU5UUyBmb3IgYQotCWJzcyBzZWN0aW9uLiAgU2V0IFNFQ19SRUxPQyBpZiB0aGVyZSBhcmUgYW55IHJlbG9jYXRpb25zLCBldmVuIGZvcgotCWEgemVybyBzaXplIHNlY3Rpb24uCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEluIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRSBjYXNlLCBiYXNlCi0JZGF0YSBvZmZzZXQgb24gcmVsb2NbMF0tPmFkZHJlc3MgcmF0aGVyIHRoYW4gcmVsb2Nbal0tPmFkZHJlc3MsIHNvCi0JdGhhdCBtdWx0aXBsZSByZWxvY3MgY2FuIGFmZmVjdCBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9ucy4KLQotCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIsIHJlbGF4X2FuZF9zaXplX3NlZywKLQlhZGp1c3RfcmVsb2Nfc3ltcywgd3JpdGVfcmVsb2NzKTogTWFrZSB0aGlyZCBhcmd1bWVudCBQVFIsIG5vdAotCWNoYXIgKiwgdG8gbWF0Y2ggZGVmaW5pdGlvbiBvZiBiZmRfbWFwX292ZXJfc2VjdGlvbnMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBEb24ndCBpbnRlcnByZXQgYSBjb21tZW50IGNoYXJhY3RlcgotCWFzIHN0YXJ0aW5nIGEgQ1BQIGxpbmUgZGlyZWN0aXZlIHVubGVzcyBpdCBpcyBhICcjJyBhbmQgaXMgdGhlCi0JdmVyeSBmaXJzdCBjaGFyYWN0ZXJzIG9uIHRoZSBsaW5lIChpLmUuLCBkbyBub3QgcGVybWl0IGxlYWRpbmcKLQl3aGl0ZXNwYWNlKS4KLQotCSogbWVzc2FnZXMuYyAoaWRlbnRpZnkpOiBNYWtlIGZpbGUgYXJndW1lbnQgbm9uLWNvbnN0LCB0byBtYXRjaAotCWNhbGxlcnMuCi0KLVR1ZSBOb3YgMTYgMjA6Mzg6MjEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogRml4IHRoaW5rbyBpbiAyMWJpdCByYW5nZSBjaGVjay4KLQotU2F0IE5vdiAxMyAxODoyMjo0OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogQ29wZSB3aXRoIElNTTE2IHR5cGUgdG9vLgotCSogY29uZmlnL3RjLXo4ay5jIChidWlsZF9ieXRlcywgbWRfYXBwbHlfZml4KTogVW5kZXJzdGFuZCBuRElTUDcKLQlyZWxvY3MuCi0KLUZyaSBOb3YgMTIgMTY6NTE6NDcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLltjaF06IEZpeCBhc3NvcnRlZCB0cml2aWFsIGluZGVudGlvbiBwcm9ibGVtcy4KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21fdmVyc2lvbik6IEFkZCBtaXNzaW5nICc7Jy4KLQkoc29tX2Zyb2JfZmlsZSk6IERlbGV0ZSB3aGl0ZXNwYWNlIGF0IEVPTC4KLQotRnJpIE5vdiAxMiAxNToyNjoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIGZvbGxvd2luZyAyLjIgcmVsZWFzZS4KLQotRnJpIE5vdiAxMiAxNDo1MjoxNyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfc3RydWN0KTogVXNlIGEgcmVhbCB0eXBlIGZvciB0aGUKLQlmaWVsZCBzZWxlY3RvciwgcmF0aGVyIHRoYW4gYW4gaW50LiAgQWxsIHVzZXMgb2YgZmllbGQgc2VsZWN0b3JzCi0JZml4ZWQuCi0JKHRjX2dlbl9yZWxvYyk6IEZvciBTT00gUExBQkVMcywgYWx3YXlzIHNldCBhZGRlbmQgdG8gemVybyBmb3Igbm93LgotCShtZF9hcHBseV9maXhfMSk6IERvIG5vdCBjYWxsIGhwcGFfZmllbGRfYWRqdXN0IGZvciBhbnkgUExBQkVMCi0JZmllbGQuCi0KLQlUaHUgTm92IDExIDE1OjQ5OjA4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV90eXBlX2FyZ3MpOiBGb3IgLmltcG9ydCBzdGF0ZW1lbnRzLAotCXNpbGVudGx5IGlnbm9yZSBhdHRlbXB0IHRvIGNoYW5nZSB0aGUgc3ltYm9sIHR5cGUgZm9yIGEgZnVuY3Rpb24KLQlmcm9tIFNUX0VOVFJZIHRvIFNUX0NPREUgb24gLmltcG9ydC4KLQotV2VkIE5vdiAxMCAxNjoxOToxMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmggKGZpeFMpOiBSZW5hbWUgZnhfY2FsbGogZmllbGQgdG8gZnhfdGNiaXQuCi0JKiB3cml0ZS5jLCBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1jb2ZmYmZkLmMsCi0JY29uZmlnL3RjLWk5NjAuYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UdWUgTm92ICA5IDAwOjQ5OjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRGVsZXRlIGNvbmZpZy1zdGFtcCBhbmQgY29uZmlnLmgKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoZXZhbHVhdGVfYWJzb2x1dGUpOiBBdm9pZCByZWx5aW5nIG9uCi0JQU5TSS1DIGZlYXR1cmVzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV90eXBlX2FyZ3MpOiBSZW5hbWVkIGZyb20gcGFfZXhwb3J0X2FyZ3MuCi0JQWNjZXB0IG5ldyBhcmd1bWVudCAiaXNfZXhwb3J0Ii4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuICBXaGVuCi0JcHJvY2Vzc2luZyBhIC5leHBvcnQgZGlyZWN0aXZlIGZvciBhIGZ1bmN0aW9uLCBkbyBub3QgYWxsb3cKLQl0aGUgdXNlciB0byBzZXQgdGhlIHR5cGUgdG8gIkNPREUiLCBpbnN0ZWFkIHdhcm4gYW5kIHNldCB0aGUKLQl0eXBlIHRvICJFTlRSWSIuCi0KLU1vbiBOb3YgIDggMTI6MDU6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLCBwcmludEluc24pOiBIYW5kbGUgJ2snIChmcm9tIFRlZAotCUxlbW9uIDxtZWxsb25AcGVwcGVyLm5jZC5jb20+KS4KLQkobWlwc19pcCk6IFBlcm1pdCBvZGQgbnVtYmVyZWQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGlmIC1taXBzMy4KLQkobWFjcm8pOiBVc2UgQkZEX1JFTE9DX01JUFNfTElURVJBTCByZWxvY2F0aW9uIGZvciBNX0xJX1NTLgotCi1Nb24gTm92ICA4IDA3OjQ1OjAxIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGg4MzAwaCwgd2UgaGF2ZSBtdWx0aWxpYiBub3cuCi0KLU1vbiBOb3YgIDggMDY6MDk6MTggMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTdXBwb3J0IGdlbmVyaWMgbmV0d2FyZSBhcyBiZWluZyBFTEYgZm9ybWF0LgotCQkJUmVjb2duaXNlIHVuaXh3YXJlIGlmIHRoZSB1c2VyIHN1cHBsaWVzIGl0LgotCi1TdW4gTm92ICA3IDAxOjAyOjA4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBGaXJzdCBjdXQgYXQgY2xlYW5pbmcgdXAgUEEgaW5zdHJ1Y3Rpb24gcGFyc2luZy4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uKTogQWNjZXB0IHBvaW50ZXIgdG8KLQlpbnNuIHN0cnVjdHVyZSBhcyBhbiBhcmd1bWVudCwgYW5kIGEgcG9pbnRlciB0byBhIHN0cmluZy4gIEFsbAotCWNhbGxlcnMgY2hhbmdlZC4gIEFsd2F5cyByZWFkIGFueSBmaWVsZCBzZWxlY3RvciBoZXJlLiAgQ2FsbAotCWV2YWx1YXRlIGFic29sdXRlIHRvIGdldCBhIHJldHVybiB2YWx1ZS4KLQkoZXZhbHVhdGVfYWJzb2x1dGUpOiBBZGRlcHQgcG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSBhcyBpdHMKLQlhcmd1bWVudC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUpOiBOZXcgbWFjcm8gZm9yIGluc2VydGluZyBhIGJpdGZpZWxkCi0JaW50byBhbiBpbnN0cnVjdGlvbiBhbmQgY29udGludWluZyB0aGUgbWFpbiBwYV9pcCBsb29wLgotCShDSEVDS19GSUVMRCk6IE5ldyBtYWNybyBmb3Igc2ltcGxlIHJhbmdlIGNoZWNraW5nIG9mIGZpZWxkcy4KLQkocGFfaXApOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcy4gIFVzZSBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFCi0JYW5kIENIRUNLX0ZJRUxELiAgQWxsIGltbWVkaWF0ZSBmaWVsZHMgbm93IHBhc3MgdGhyb3VnaAotCXBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uIHdoaWNoIHdpbGwgYWxzbyBoYW5kbGUgZmllbGQgc2VsZWN0b3JzLgotCURlbGV0ZSBkZWFkIGNvZGUuICBTaW1wbGlmeS4KLQkobWRfYXBwbHlfZml4XzEpOiBVc2UgQ0hFQ0tfRklFTEQgdG8gdmVyaWZ5IGFueSBmaXhlcyB0aGF0IGFyZQotCWFwcGxpZWQgYXJlIGluIHJhbmdlLiAgVXNlIGJmZF9wdXRfMzIgcmF0aGVyIHRoYW4gaW5zZXJ0aW5nIGVhY2gKLQlieXRlIG9mIHRoZSBmaXhlZCBpbnN0cnV0aW9uIGludG8gdGhlIGJ1ZmZlciBvdXJzZWx2ZXMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEZWxldGUge1NFRyxHTE9CQUx9X0RJRkZfQUxMT1dFRCBjb2RlLAotCWl0IHdhcyBQQSBzcGVjaWZpYyBhbmQgaXMgbm8gbG9uZ2VyIG5lZWRlZCAoaXQncyBub3cgaGFuZGxlZAotCXdpdGhpbiB0aGUgUEEgYmFja2VuZCkuCi0JKiBjb25maWcvdGMtaHBwYS5oIChTRUdfRElGRl9BTExPV0VEKTogRGVsZXRlIGRlZmluaXRpb24uCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBJZiB0aGUgc3VidHJhY3Qgc3ltYm9sIGZvcgotCWEgZml4dXAgaXMgJGdsb2JhbCQgY2hhbmdlIGl0IHRvIE5VTEwgYXMgJGdsb2JhbCQgaXMgcmVhbGx5IG9ubHkKLQluZWVkZWQgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHRoZSBiYXNlIHR5cGUgb2YgcmVsb2NhdGlvbiB0byB1c2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGNyZWF0ZV9uZXdfc3Vic3BhY2UpOiBJbml0aWFsaXplIHN1YnNwYWNlX2RlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhLWlwLCBjYXNlICd6Jyk6IE1ha2UgZmllbGQgc2VsZWN0b3JzIHdvcmsKLQlmb3IgJ3onIG9wZXJhbmRzICh0YXJnZXQgb2YgYmxlIGJyYW5jaCkuCi0KLVNhdCBOb3YgIDYgMjI6NDE6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6ICh1cGRhdGVfc3Vic3BhY2UpOiBGaXggdHlwZSBhbmQgbmFtZSBvZiBsYXN0Ci0JcGFyYW1ldGVyLiAgQWxsIGNhbGxlcnMgZml4ZWQuCi0JKG1kX2JlZ2luLCBwYV9jaGtfZmllbGRfc2VsZWN0b3IsIHBhX2VudHJ5KTogTGludC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY29uc19maXhfbmV3X2hwcGEpOiBSZXNldCBmaWVsZCBzZWxlY3RvcgotCXRvIGRlZmF1bHQgc3RhdGUgYWZ0ZXIgaXQncyBiZWVuIHVzZWQuCi0KLUZyaSBOb3YgIDUgMTI6MDg6MjEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24pOiBDaGFuZ2UKLQlzcGFjZS9zdWJzcGFjZSBzb3J0IGtleXMgZm9yIHRoZSBzdGFiIHNlY3Rpb25zIHNvIGFzIHRvIGF2b2lkCi0JYnVncyBpbiB0aGUgaHAgbGlua2VyIGFuZCBweGRiLgotCi1UaHUgTm92ICA0IDE3OjAwOjA1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlcik6IFVwZGF0ZSBwb2ludGVyIHRvIGxhc3QKLQlmcmFnIGZvciBhIHNlZ21lbnQgaW4gdGhlIHNlZ2luZm8gc3RydWN0dXJlLgotCi1UaHUgTm92IDA0IDA5OjA5OjM1IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqICBNYWtlZmlsZS5pbjogQ2hhbmdlZCBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUwotCi1XZWQgTm92ICAzIDEyOjE2OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSGFuZGxlIGNvbnZlcnNpb24gb2Ygc3VidHJhY3Rpb24gdG8KLQlwYy1yZWxhdGl2ZSBhZGRyZXNzaW5nIGV2ZW4gaWYgcGMtcmVsYXRpdmUgZmxhZyBpcyBhbHJlYWR5IHNldC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcF9vcCk6IFVzZSBzdHJjaHIsIG5vdCBpbmRleC4gIERvbid0Ci0JZGVjbGFyZSBlaXRoZXIuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRGVsZXRlIGludGVybWVkaWF0ZSBmaWxlcyBmcm9tIGR2aQotCWJ1aWxkLCBidXQgbm90IHRoZSBkdmkgb3IgaW5mbyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChjbGVhbi1oZXJlKTogTmV3IHRhcmdldDsgY2xlYW5zIHVwIGN1cnJlbnQKLQlkaXJlY3Rvcnkgb25seS4KLQkoZGlzdGNsZWFuKTogVXNlIGl0IGluc3RlYWQgb2YgY2xlYW4uCi0KLQkqIHJlYWQuYyAoc194c3RhYik6IERvbid0IHVzZSBhbGxvY2EuCi0KLQkqIG1lc3NhZ2VzLmMgKGlkZW50aWZ5KTogTmV3IHJvdXRpbmU7IHByaW50IG1lc3NhZ2UgaWRlbnRpZnlpbmcKLQlmb2xsb3dpbmcgbWVzc2FnZXMgYXMgY29taW5nIGZyb20gYXNzZW1ibGVyLgotCShhc19zaG93X3doZXJlLCBhc19iYWRfaW50ZXJuYWwsIGFzX2JhZF93aGVyZSk6IENhbGwgaXQuCi0JKGFzX2ZhdGFsKTogRG9uJ3QgbmVlZCB0byBpZGVudGlmeSBwcm9ncmFtIGFueSBtb3JlLgotCi1UdWUgTm92ICAyIDE4OjA0OjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWRkIGRlZmF1bHQgY2FzZSB0byByZWxvYyBzd2l0Y2guCi0KLQkqIHJlYWQuYyAoc19sY29tbSk6IFB1dCBzbWFsbCBvYmplY3RzIGluIC5zYnNzIGZvciBNSVBTIEVMRiBhcwotCXdlbGwgYXMgTUlQUyBFQ09GRi4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYWxpZ25lZC4KLQotVHVlIE5vdiAgMiAxNTowNzowNyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogdGMtaHBwYS5jOiBBZGQgJWRwIGFuZCAlcnAgYXMgc3lub255bXMgZm9yICVyMjcgYW5kICVyMiBpbiB0aGUKLQlwcmVkZWZpbmVkIHJlZ2lzdGVyIHRhYmxlLgotCShwYV9wYXJzZV9udW1iZXIpOiBIYW5kbGUgJXJwIGluIGNvbW1vbiByZWdpc3RlciBzaG9ydGN1dCBjb2RlLgotCUNvbnNpc3RlbnRseSBzZXQgcmV0dXJuIHZhbHVlIHRvIC0xIGZvciBhbiBlcnJvci4gIENsZWFuIHVwIGVycm9yCi0JbWVzc2FnZXMgYW5kIG9ubHkgcHJpbnQgdGhlbSB3aGVuICJwcmludF9lcnJvcnMiIGlzIHRydWUuICBIYW5kbGUKLQllbXB0eSBzdHJpbmcgY2FzZSBsaWtlIHRoZSBIUCBhc3NlbWJsZXIgLS0gYXNzdW1lIGEgdmFsdWUgb2YKLQl6ZXJvLgotCi0JKiBjb25maWcvaG8taHB1eC5oOiBEbyBub3QgaW5jbHVkZSBoby1zeXN2LmguICBJbnN0ZWFkIGluY2x1ZGUKLQlzdGFuZGFyZCBocHV4IGluY2x1ZGUgZmlsZXMgdG8gcGljayB1cCB2YXJpb3VzIGZ1bmN0aW9uIGRlY2xzLgotCi0JKiBjb25maWcvaG8taHBwYW9zZi5oOiBEZWxldGUgX0lPKiBtYWNyb3MuICBUaGV5IGFyZSBkZWZpbmVkIGluCi0Jc3RkaW8uaC4gIERlbGV0ZSBib2d1cyBkZWNsYXJhdGlvbiBvZiBmcmVlLiAgR2V0IHBhdGggdG8KLQlhbGxvY2EtY29uZi5oIHJpZ2h0LgotCi1UdWUgTm92ICAyIDEzOjU3OjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBGaXggY2hlY2tzIGZvciBjaGFyYWN0ZXJzIGZvbGxvd2luZyAiMGIiIG9yCi0JIjBmIi4KLQotTW9uIE5vdiAgMSAyMTozNzowNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL29iai1zb20uaCAob2JqX2F0dGFjaF91bndpbmRfaW5mbyk6IERlZmluZSBhcyBhIGhvb2sKLQlzbyBHQVMgY2FuIGF0dGFjaCB1bndpbmQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiB0byBhIEJGRCBzeW1ib2wuCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBJZiBuZWNlc3NhcnkgYXR0YWNoIHVud2luZAotCWRlc2NyaXB0b3IgaW5mb3JtYXRpb24gdG8gdGhlIEJGRCBzeW1ib2wuCi0JKG1kX2FwcGx5X2ZpeCk6IFJfSFBQQV9FTlRSWSBhbmQgUl9IUFBBX0VYSVQgY2FuIG5ldmVyIGJlICJhcHBsaWVkIiwKLQl0aGV5IGFyZSBzaW1wbHkgbWFya2Vycy4gIE1ha2UgUl9IUFBBX1VOV0lORF8qIGhhbmRsaW5nIE9CSl9FTEYKLQlkZXBlbmRlbnQuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFdob2xlIGZ1bmN0aW9uIGlzIE9CSl9FTEYgZGVwZW5kZW50LgotCShwYV9lbnRyeSk6IEJ1aWxkIGEgUl9IUFBBX0VOVFJZIHJlbG9jYXRpb24gd2hlbiBjb25maWd1cmVkIGZvciBTT00uCi0JKHBhX2V4aXQpOiBMaWtld2lzZSwgYnV0IGJ1aWx0IGEgUl9IUFBBX0VYSVQgcmVsb2NhdGlvbi4gIERvIG5vdAotCWJ1aWxkICJlbmQtb2YtZnVuY3Rpb24iIHN5bWJvbHMgZm9yIFNPTSwgdGhleSBhcmUgbm90IG5lZWRlZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocHJvY2Vzc19leGl0KTogQ3JlYXRlIHRlbXBvcmFyeSBzeW1ib2xzIHdpdGgKLQljb3JyZWN0IHByZWZpeGVzIHNvIHRoZXkgY2FuIGJlIGVsaW1pbmF0ZWQgbGF0ZXIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGNhbGxfaW5mbyBzdHJ1Y3QpOiBEZWxldGUgdW51c2VkICJmcmFtZSIgZmllbGQuCi0JKHBhX2NhbGxpbmZvKTogSW5zZXJ0IGZyYW1lc2l6ZSBpbnRvIHRoZSB1bndpbmQgaW5mb3JtYXRpb24gYXMKLQlzb29uIGFzIGl0J3MgYXZhaWxhYmxlLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBEbyBub3QgaW5zZXJ0IGZyYW1lc2l6ZSBpbnRvIHRoZSB1bndpbmQKLQlpbmZvcm1hdGlvbiBoZXJlLgotCi0JKiBBZGQgc3VwcG9ydCBmb3IgbWFya2VyIHR5cGUgcmVsb2NhdGlvbnMuICBUaGVzZSBtYXJrIGFyZWFzCi0Jb2YgaW50ZXJlc3QgdG8gdGhlIGxpbmtlci4gIEVOVFJZL0VYSVQgcmVsb2NhdGlvbnMgZm9yIFNPTSBhcmUKLQlhbiBleGFtcGxlIG9mIG1hcmtlciByZWxvY2F0aW9ucy4KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEluc3RlYWQgb2YgYXNzdW1pbmcgc2l6ZSBvZiBhIHJlbG9jYXRpb24KLQlpcyA0IGJ5dGVzLCBwaWNrIHVwIHRoZSBzaXplIGZyb20gcmVsb2NhdGlvbiBpdHNlbGYuCi0JKGZpeHVwX3NlZ21lbnQpOiBEbyBub3QgY29tcGxhaW4gdGhhdCBhIHZhbHVlIGlzIHRvbyBzbWFsbCBmb3IKLQltYXJrZXIgcmVsb2NhdGlvbnMuCi0KLQkqIHN0cnVjLXN5bWJvbC5oOiBBZGQgbmV3ICJzeV91c2VkIiBmaWVsZCB0byB0aGUgc3ltYm9sIHN0cnVjdHVyZS4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFNldCBzeV91c2VkIGZvciBhbnkgc3ltYm9sIHVzZWQgYXMgYW4gb3BlcmFuZC4KLQkoZXhwcik6IExpa2V3aXNlIGZvciBhbnkgc3ltYm9sIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2Zyb2Jfc3ltYm9sKTogRGVmaW5lLiAgUHVudCBpbXBvcnRlZAotCXN5bWJvbHMgd2hpY2ggYXJlIG5ldmVyIHVzZWQgYW5kIGFic29sdXRlIHN5bWJvbHMgd2hpY2ggbG9jYWwgc2NvcGUuCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9mcm9iX2ZpbGUpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogU2V0IGFsaWdubWVudAotCW9mIHN0YWIgc2VjdGlvbnMuICBNYWtlIHNwYWNlIGZvciB0aGUgc3BlY2lhbCBzdGFiIGVudHJ5LgotCShhZGp1c3Rfc3RhYl9zZWN0aW9ucyk6IEFkanVzdCB0aGUgc3BlY2lhbCBlbnRyeSBpbiB0aGUKLQlzdGFicyBzZWN0aW9uLgotCShzb21fZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uLiAgU2ltcGx5IGNhbGxzIGFkanVzdF9zdGFiX3NlY3Rpb25zCi0JZm9yIGVhY2ggc2VjdGlvbi4KLQotTW9uIE5vdiAgMSAxNzo1NDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKFBJQ19DQUxMX1JFRywgU1AsIEZQKTogRGVmaW5lLgotCShtaXBzX3BpYywgbWlwc19jcHJlc3RvcmVfb2Zmc2V0KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1kX3BzZXVkb190YWJsZSk6IEhhbmRsZSAuYWJpY2FsbHMsIC5jcGxvYWQsIGFuZCAuY3ByZXN0b3JlLgotCUlnbm9yZSAuYmduYiBhbmQgLmVuZGIuCi0JKGdwX3JlZmVyZW5jZSk6IF9ncF9kaXNwIGlzIG5ldmVyIGFkZHJlc3NlZCBvZmYgR1AuCi0JKG1hY3JvX2J1aWxkKTogSWdub3JlIG1hY3JvcyB3aGlsZSBzZWFyY2hpbmcgZm9yIGluc24uICBGb3IgY2FzZXMKLQlpLCBqLCBhbmQgbywgYWNjZXB0IHRoZSByZWxvYyB0eXBlIGFzIGFuIGFyZ3VtZW50IHJhdGhlciB0aGFuCi0JYXNzdW1pbmcgQkZEX1JFTE9DX0xPMTYuICBEb24ndCB0cnkgdG8gY29udmVydCBCRkRfUkVMT0NfTE8xNiB0bwotCUJGRF9SRUxPQ19NSVBTX0dQUkVMLiAgQWRkZWQgbmV3IGNhc2UgYS4KLQkoc2V0X2F0LCBsb2FkX3JlZ2lzdGVyLCBtYWNybyk6IENoYW5nZWQgY2FsbHMgdG8gbWFjcm9fYnVpbGQgdG8KLQlwYXNzIG5ldyBhcmd1bWVudCBmb3IgaSwgaiBhbmQgbyBjYXNlcy4KLQkobWFjcm8pOiBIYW5kbGUgTV9KQUxfMSwgTV9KQUxfMiBhbmQgTV9KQUxfQS4gIFRoZXNlIHJlcXVpcmUKLQlzcGVjaWFsIGhhbmRsaW5nIHdoZW4gZ2VuZXJhdGluZyBTVlI0IFBJQyBjb2RlLgotCShtaXBzX2lwLCB0Y19nZXRfcmVnaXN0ZXIsIHNfZnJhbWUpOiBVc2UgbWFjcm9zIEZQLCBTUCwgR1AgYW5kIEFUCi0JcmF0aGVyIHRoYW4gaGFyZCBjb2RlZCBjb25zdGFudHMuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMIGFuZAotCUJGRF9SRUxPQ19NSVBTX0NBTEwxNi4KLQkoc19vcHRpb24pOiBTZXQgbWlwc19waWMgYmFzZWQgb24gLm9wdGlvbiBwaWNOLgotCShzX2FiaWNhbGxzKTogTmV3IGZ1bmN0aW9uOyBzZXQgbWlwc19waWMgdG8gMi4KLQkoc19jcGxvYWQpOiBOZXcgZnVuY3Rpb247IGhhbmRsZSAuY3Bsb2FkLgotCShzX2NwcmVzdG9yZSk6IE5ldyBmdW5jdGlvbjsgaGFuZGxlIC5jcHJlc3RvcmUuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3BzZXVkb190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciAuYmduYiwKLQkuZW5kYiBhbmQgLnZlcnN0YW1wLCBzZXR0aW5nIHRoZW0gdG8gc19pZ25vcmUuCi0KLVN1biBPY3QgMzEgMDA6MzY6NDAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBBZGQgbmV3IHNzZF9kZWZpbmVkCi0JZmllbGQuICBEZWZpbmUgU1VCU1BBQ0VfREVGSU5FRCBhY2Nlc3NvciBtYWNyby4KLQkocGFfc3Vic3BhY2UpOiBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIHN1YnNwYWNlIGF0dHJpYnV0ZXMgZm9yCi0JYnVpbHQtaW4gc3Vic3BhY2VzLiAgU2V0IHNzZF9kZWZpbmVkIGF0IHRoZSBlbmQgb2YgZmNuIC0tIHRoYXQKLQl3YXkgdGhlIGF0dHJpYnV0ZXMgY2FuIG9ubHkgYmUgY2hhbmdlZCBvbmNlLiAgUGFzcyBuZXdseSBhbGxvY2F0ZWQKLQluYW1lIHRvIGlzX2RlZmluZWRfc3Vic3BhY2UsIG5vdCBhIHBvaW50ZXIgdG8gdGhlIGlucHV0IGxpbmUuCi0JRml4IHR5cG8gaW4gc3BhY2Uvc3Vic3BhY2UgcmV3b3JrLgotCShpc19kZWZpbmVkX3N1YnNwYWNlKTogRGVsZXRlIHVudXNlZCAybmQgYXJnLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaW1wb3J0KTogSWYgY3VycmVudGx5IGluIHRoZSB0ZXh0IHNlZ21lbnQKLQlhbmQgYSBzeW1ib2wgaXMgaW1wb3J0ZWQgd2l0aG91dCB0eXBlIGluZm9ybWF0aW9uLCBzZXQgQlNGX0ZVTkNUSU9OCi0JZm9yIHRoZSBzeW1ib2wuCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBDb3JyZWN0IHRlc3QgdG8gZGV0ZXJtaW5lIGlmCi0JdGhlIHNlY3Rpb24ncyBzaXplIHdhcyByb3VuZGVkIHVwLgotCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfc2V0X3N5bWJvbF90eXBlKTogRGVmaW5lIGEgaG9vayBzbyBHQVMKLQljYW4gcHJvcGVybHkgc2V0IGFsbCB0aGUgU09NIHN5bWJvbCB0eXBlcy4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N5bWJvbF90eXBlKTogTmV3IGVudW0gdG8gcmVwcmVzZW50IHRoZQotCXN5bWJvbCB0eXBlcyB3aGljaCBjYW4gYmUgc2V0IGZyb20gYW4gSU1QT1JUL0VYUE9SVCBzdGF0ZW1lbnQuCi0JKHBhX2V4cG9ydF9hcmdzKTogU2V0IHRoZSBwYV9zeW1ib2xfdHlwZSB0eXBlIGJhc2VkIG9uIGFyZ3VtZW50cy4KLQlJZiBkZWZpbmVkLCBjYWxsIG9ial9zZXRfc3ltYm9sX3R5cGUgdG8gcGFzcyB0aGlzIGluZm9ybWF0aW9uIG9uCi0JdG8gdGhlIEJGRCBiYWNrZW5kLgotCi0JKiByZWFkLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBTZXQgU0VDX0RFQlVHR0lORyBmb3IgYW55Ci0Jc3RhYiBzZWN0aW9uIHdlIG1ha2UuCi0JKHNfc3RhYl9nZW5lcmljKTogTGlrZXdpc2UuCi0KLVNhdCBPY3QgMzAgMTQ6MjY6MjAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEFsbG93IGJhY2tlbmRzIHRvIG92ZXJyaWRlIHRoZSB2YWx1ZSBvZiB0aGUgZmFrZSBsYWJlbC4KLQkqIHdyaXRlLmggKExPQ0FMX0xBQkVMKTogRGVsZXRlIERPVF9MQUJFTF9QUkVGSVggY29kZS4gIEluc3RlYWQKLQlhc3N1bWUgYmFja2VuZHMgd2lsbCBkZWZpbmUgTE9DQUxfTEFCRUwgaWYgYW55dGhpbmcgb3RoZXIgdGhhbgotCSdMJyBpcyB1c2VkIHRvIGRlbm90ZSBhIGxvY2FsIGxhYmVsLgotCShGQUtFX0xBQkVMX05BTUUpOiBOZXcgbWFjcm8uICBEZWZpbmVzIHRoZSBkZWZhdWx0IG5hbWUgdXNlZCBmb3IKLQl0aGUgImZha2UiIGxhYmVsLgotCSogZXhwci5jIChtYWtlX2V4cHJfc3ltYm9sKTogRGVsZXRlIERPVF9MQUJFTF9QUkVGSVggY29kZQotCWFuZCBpbnN0ZWFkIHNpbXBseSB1c2UgdGhlIHN0cmluZyBkZWZpbmVkIGJ5IEZBS0VfTEFCRUxfTkFNRS4KLQkob3BlcmFuZCk6IExpa2V3aXNlLgotCSogcmVhZC5jIChzX3N0YWJfZ2VuZXJpYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWhwcGEuaCAoRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lIGFzIEwkMFwwMDEgc28gaXQncwotCWtub3duIHRvIGJlIGEgbG9jYWwgbGFiZWwuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChET1RfTEFCRUxfUFJFRklYKTogRGVsZXRlLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuaCAoRE9UX0xBQkVMX1BSRUZJWCk6IERlbGV0ZS4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZS4KLQkqIGNvbmZpZy90ZS1zY28zODYuaCAoRE9UX0xBQkVMX1BSRUZJWCk6IERlbGV0ZS4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZS4KLQotCVJld29yayBzcGFjZS9zdWJzcGFjZSBoYW5kbGluZyBpbiBQQSBjb2RlIHRvIGZ1bGx5IHN1cHBvcnQKLQlTT00gc3BhY2VzL3N1YnNwYWNlcy4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKFVTRV9BTElBU0VTKTogTmV3IG9iamVjdC1mb3JtYXQgZGVwZW5kZW50IGRlZmluZQotCXRvIGNvbnRyb2wgdGhlIHVzZSBvZiBzcGFjZS9zdWJzcGFjZSBuYW1lIGFsaWFzZXMuCi0JKHVwZGF0ZV9zdWJzcGFjZSk6IEFjY2VwdCBzcGFjZSBjaGFpbiBlbnRyeSBmb3IgY29udGFpbmluZyBzcGFjZQotCWFzIGEgbmV3IHBhcmFtZXRlci4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKHBhX2dldF9sYWJlbCk6IFVzZSBjdXJyZW50X3NwYWNlIHJhdGhlciB0aGFuIHBhX3NlZ21lbnRfdG9fc3BhY2UuCi0JKHBhX2RlZmluZV9sYWJlbCk6IExpa2V3aXNlLgotCShwYV91bmRlZmluZV9sYWJlbCk6IExpa2V3aXNlLgotCShtZF9iZWdpbik6IENoYW5nZSBpbnRvIHRoZSAocG9zc2libHkgbW9kaWZpZWQpIHRleHRfc2VjdGlvbi4KLQkocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IENyZWF0ZSBhIG5ldyBzZWdtZW50L3NwYWNlIGlmIGNyZWF0ZV9mbGFnCi0JaXMgdHJ1ZSwgYW5kIHRoZSBzcGFjZSBuYW1lIGlzIG5vdCBvbmUgb2YgdGhlIHR3byBwcmVkZWZpbmVkIHNwYWNlcy4KLQkocGFfc3Vic3BhY2UpOiBVc2UgY3VycmVudF9zcGFjZSByYXRoZXIgdGhhbiBhIGxvb2t1cCB2aWEKLQlwYV9zZWdtZW50X3RvX3NwYWNlLiAgUmVzZXQgQkZEIHNlY3Rpb24gZmxhZ3MgYXMgcmVxdWlyZWQgYnkKLQl0aGUgLnN1YnNwYWNlIGRpcmVjdGl2ZS4gIExpa2V3aXNlIGZvciB0aGUgc2VjdGlvbiBhbGlnbm1lbnQuCi0JUGFzcyB0aGUgY3VycmVudCBzcGFjZSB0byB1cGRhdGVfc3Vic3BhY2UgYW5kIGNyZWF0ZV9uZXdfc3Vic3BhY2UuCi0JKHBhX3NwYWNlc19iZWdpbik6IE9ubHkgdXNlIHNwYWNlL3N1YnNwYWNlIGFsaWFzZXMgaWYgVVNFX0FMSUFTRVMKLQlpcyB0cnVlLiAgV2hlbiBub3QgdXNpbmcgYWxpYXNlcywgY3JlYXRlIGEgQkZEIHNlY3Rpb24gZm9yIGVhY2gKLQlzdWJzcGFjZSBlbmNvdW50ZXJlZC4gIFdoZW4gbm90IHVzaW5nIGFsaWFzZXMgcmVwbGFjZSB0aGUgZGVmYXVsdAotCXRleHQsIGRhdGEsIGFuZCBic3Mgc2VnbWVudHMgd2l0aCBuZXcgb25lcy4KLQkoY3JlYXRlX25ld19zdWJzcGFjZSk6IFdoZW4gbm90IHVzaW5nIGFsaWFzZXMgZWFjaCBzdWJzcGFjZSBoYXMgYQotCXNlY3Rpb24vc2VnbWVudCBhbmQgc3Vic2VnbWVudHMgYXJlIG5vdCBuZWVkZWQsIHNvIHNldCB0aGUgc3Vic2VnbWVudAotCXRvIHplcm8uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBJZiBuZWVkZWQsIGNhbGwKLQlvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcyB0byBwYXNzIHNwYWNlIGF0dHJpYnV0ZXMgdG8gdGhlCi0JQkZEIGJhY2tlbmQuCi0JKGNyZWF0ZV9uZXdfc3BhY2UpOiBMaWtld2lzZS4KLQkoY3JlYXRlX25ld19zdWJzcGFjZSk6IExpa2V3aXNlIGZvciBzdWJzcGFjZSBhdHRyaWJ1dGVzIHVzaW5nCi0Jb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMuCi0JKHVwZGF0ZV9zdWJzcGFjZSk6IExpa2V3aXNlIGZvciBzdWJzcGFjZSBhdHRyaWJ1dGVzIHVzaW5nCi0Jb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBHZXQgc2VnbWVudCBhbmQgc29ydCBrZXkKLQlmb3IgJFRFWFQkIGFuZCAkUFJJVkFURSQgZnJvbSB0aGUgZGVmYXVsdCBzcGFjZSBzdHJ1Y3R1cmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2V4cG9ydF9hcmdzKTogQWx3YXlzIHNldCBCU0ZfRlVOQ1RJT04KLQlhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIHR5cGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IFByZWxpbWluYXJ5IHN0YWIgYXQgaGFuZGxpbmcKLQlTT00gcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBEZWxldGUgaW5jb3JyZWN0IGNoZWNrIGZvciBzeW1ib2wKLQlyZWRlZmluaXRpb24uCi0KLQkqIGNvbmZpZy9vYmotc29tLltjaF06IE5ldyBmaWxlcyBmb3IgU09NIHN1cHBvcnQuICBOb3RlIFNPTQotCXN1cHBvcnQgaXMgbm90IHlldCBjb21wbGV0ZSBpbiBHQVMgb3IgQkZELgotCi0JKiBjb25maWcvaG8taHBwYWJzZC5oOiAgRGVsZXRlIElPKiBtYWNyb3MsIHRoZXkgYXJlIGRlZmluZWQgaW4KLQlzdGRpby5oLiAgRGVsZXRlIGRlY2xhcmF0aW9uIG9mIGZyZWUuICBJbmNsdWRlIHN0ZGxpYi5oLCB1bmlzdGQuaCwKLQlhbmQgc3RyaW5nLmguCi0KLUZyaSBPY3QgMjkgMTM6MjY6MTIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEFsbG93IGJhY2tlbmRzIHRvIG92ZXJyaWRlIHRoZSBzZWN0aW9uIG5hbWVzIHVzZWQgZm9yIGVtYmVkZGVkCi0Jc3RhYnMgc3VwcG9ydC4gIE5lZWRlZCBmb3IgU09NLgotCSogcmVhZC5jIChTVEFCX1NFQ1RJT05fTkFNRSk6IERlZmF1bHQgdGhlIG5hbWUgb2YgdGhlIHN0YWIgc2VjdGlvbgotCXRvICIuc3RhYiIuCi0JKFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSk6IExpa2V3aXNlIGZvciB0aGUgc3RhYiBzdHJpbmdzIHNlY3Rpb24uCi0JKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBJcyBub3cgcGFzc2VkIHRoZSBmdWxsIG5hbWUgZm9yIHRoZQotCXN0YWIgc3RyaW5nIHNlY3Rpb24gcmF0aGVyIHRoYW4gYSBuYW1lIHByZWZpeC4gIEFsbCByZWZlcmVuY2VzCi0JY2hhbmdlZC4KLQkoc19zdGFiX2dlbmVyaWMpOiBOZXcgYXJndW1lbnQgZm9yIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uIG5hbWUuCi0JYWxsIHJlZmVyZW5jZXMgY2hhbmdlZC4KLQkoc194c3RhYik6IEFwcGVuZCAic3RyIiB0byB0aGUgc3RhYiBzZWN0aW9uIG5hbWUgdG8gZ2V0IHRoZQotCXN0YWIgc3RyaW5nIHNlY3Rpb24gbmFtZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IEFwcGVuZCAic3RyIgotCXRvIHN0YWIgc2VjdGlvbiBuYW1lIHRvIGdldCB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiBuYW1lLiAgUGFzcwotCXRoZSBmdWxsIG5hbWUgb2YgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24gdG8gZ2V0X3N0YWJfc3RyaW5nX29mZnNldC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYmVnaW4pOiBEaXNhYmxlICItUiIgb3B0aW9uIHRvIGZvbGQKLQl0ZXh0YW5kIGRhdGEgc2VnbWVudHMuICBXYXJuIHVzZXIgIi1SIiBpcyB1bnN1cHBvcnRlZCBvbiB0aGUKLQlQQS4KLQotVGh1IE9jdCAyOCAxMjozNjoxMyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogRGVmYXVsdCBhbGlnbm1lbnQgaXMgOCBmb3IKLQkuYWxpZ24gYW5kIC5BTElHTiBkaXJlY3RpdmVzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zcGFjZSk6IERvIG5vdCByZXBvcnQgYW4gZXJyb3IgZm9yIGEgLnNwYWNlCi0JZGlyZWN0aXZlIHdoaWNoIGRvZXMgbm90IGRlZmluZSBhICJ3ZWxsLWtub3duIiBzcGFjZSBhbmQgZG9lcwotCW5vdCBpbmNsdWRlIGEgc3BhY2UgbnVtYmVyIGFzIGFuIGFyZ3VtZW50LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9kZWZfc3Vic3BhY2VzKTogQ29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkiZGVmaW5lZCIsICJsb2FkYWJsZSIsICJjb2RlX29ubHkiIGFuZCAic3BhY2VfaW5kZXgiIGZpZWxkcy4KLQkocGFfZGVmX3NwYWNlcyk6IENvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgdGhlICJzcG51bSIsICJkZWZpbmVkIiwKLQlhbmQgInByaXZhdGUiIGZpZWxkcy4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEFkZCBuZXcgdGNfZml4X2RhdGEgZmllbGQgZm9yIHRoZSB2YXJpb3VzCi0JYmFja2VuZHMgdG8gYXR0YWNoIG1hY2hpbmUgZGVwZW5kZW50IGZpeHVwIGluZm9ybWF0aW9uIHRvLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IEluaXRpYWxpemUgbmV3IHRjX2ZpeF9kYXRhIGZpZWxkLgotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfc3RydWN0KTogRGVsZXRlIHVubmVjZXNzYXJ5IGZpeF9maXhQIGFuZAotCWZ4X25leHQgZmllbGRzLgotCShocHBhX2ZpbmRfaHBwYV9maXgpOiBEZWxldGUgdW5uZWNlc3NhcnkgZnVuY3Rpb24uICBGaXggYWxsCi0JY2FsbGVycyB0byBnZXQgSFBQQSBmaXh1cCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0Y19maXhfZGF0YSBmaWVsZAotCWluIHRoZSBHQVMgZml4dXAuCi0JKGhwcGFfZml4X3Jvb3QpOiBEZWxldGUgdW5uZWNlc3NhcnkgdmFyaWFibGUuCi0JKGZpeF9uZXdfaHBwYSk6IEF0dGFjaCBIUFBBIGZpeHVwIGRhdGEgdG8gdGhlIEdBUyBmaXh1cC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc2V0X3N0YXJ0X3N5bWJvbCk7IERlbGV0ZSB1bndhbnRlZAotCWZ1bmN0aW9uLiAgRml4IGFsbCBjYWxsZXJzLgotCShzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogRGVsZXRlIHVudXNlZCBzc2Rfc3RhcnRfc3ltIGZpZWxkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uIHRvIGRldGVybWluZQotCWlmIGEgcGFydGljdWxhciBmaXh1cCBpcyBhZGp1c3RhYmxlLgotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZml4X2FkanVzdGFibGUpOiBDYWxsIGhwcGFfZml4X2FkanVzdGFibGUgdG8KLQlwZXJmb3JtIHRoZSByZWFsIHdvcmsuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRSk6IE1vdmUgZGVmaW5pdGlvbiBvdXQKLQlvZiBPQkpfWFhYIGNvbmRpdGlvbmFscy4KLQkoTUFYX1JFTE9DX0VYUEFOU0lPTik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChsb2cyKTogUmVuYW1lZCBmcm9tIGlzX3Bvd2VyX29mXzIuICBGaXggYWxsCi0JY2FsbGVycy4gTm93IHJldHVybnMgbG9nMiAoTikgZm9yIHBvc2l0aXZlIE4gd2hpY2ggYXJlIGFuIGV4YWN0Ci0JcG93ZXIgb2YgdHdvIG9yIC0xIGZvciBhbiBlcnJvci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY2FsbGluZm8pOiBSYW5nZSBjaGVjayB2YWx1ZXMgcHJvdmlkZWQgZm9yCi0JRU5UUllfR1IsIEVOVFJZX0ZSIGFuZCBFTlRSWV9TUi4gIFByb3Blcmx5IGFkanVzdCB2YXVlcyBiZWZvcmUKLQlpbnNlcnRpbmcgdGhlbSBpbnRvIHRoZSB1bndpbmQgdGFibGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKE5FRURTX0ZJWFVQKTogRGVsZXRlIGRlZmluaXRpb24gYW5kIGFsbCByZWZlcmVuY2VzLgotCShocHBhX2dlbl9yZWxvY190eXBlKTogTmV3IG9iamVjdCBmb3JtYXQgZGVwZW5kZW50IG1hY3JvLgotCShwYV9pcCk6IERlbGV0ZSB0b25zIG9mIGNvZGUgd2hpY2ggd2FzIGVpdGhlciBPQkpfU09NIG9yIE9CSl9FTEYKLQljb25kaXRpb25hbC4gIFRoZSBjb2RlIGNhbiAoYW5kIHdpbGwpIGJlIHNoYXJlZCBiZXR3ZWVuIFNPTSAmIEVMRgotCWZvcm1hdHMgaW4gdGhlIG5lYXIgZnV0dXJlLgotCShjb25zX2ZpeF9uZXdfaHBwYSwgbWRfYXBwbHlfZml4XzEpOiBMaWtld2lzZS4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlLCBwcm9jZXNzX2V4aXQsIHBhX2V4aXQpOiBMaWtld2lzZS4KLQkodGNfZ2VuX3JlbG9jKTogVXNlIGhwcGFfZ2VuX3JlbG9jIHJhdGhlciB0aGFuIGFuIG9iamVjdCBmb3JtYXQKLQlzcGVjaWZpYyBjYWxsLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogU2V0IHRoZSBzZWdtZW50IGZvciBhIGNvbW1vbiBzeW1ib2wKLQl0byBiZmRfdW5kX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfdmVyc2lvbik6IEFkZCBleHRlcm4gcHJvdG90eXBlLgotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEtKi1ic2QqKTogTmV3IGNvbmZpZ3VyYXRpb24uCi0JQkZEIGlzIGFsd2F5cyB1c2VkIGZvciBHQVMgZ2VuZXJhdGluZyBTT00gb2JqZWN0cy4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBTZXQgc3lfdXNlZF9pbl9yZWxvYyBpZiBhbgotCWFkanVzdG1lbnQgaXMgcmVqZWN0ZWQgYnkgdGhlIHRhcmdldCBtYWNoaW5lLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9iaWdfY29ucyk6IERlbGV0ZSBmdW5jdGlvbiBhbmQgaXRzCi0JZGVjbGFyYXRpb24uICBBbGwgY2FsbGVycyBjaGFuZ2VkIHRvIHVzZSBwYV9jb25zLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRml4IGluZGVudGlvbiBhbmQgb3Blbi9jbG9zZSBicmFjZQotCXByb2JsZW0uCi0KLQlGcm9tIFBldGUgSG9vZ2VuYm9vbToKLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2F0b2YpOiBSZXR1cm4gYSBOVUxMIG9uIHN1Y2Nlc3MgcmF0aGVyIHRoYW4KLQlhbiBlbXB0eSBzdHJpbmcuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBBZHZhbmNlCi0JaW5wdXRfbGluZV9wb2l0bmVyIHdoZW4gYW4gaW52YWxpZCBhcmd1bWVudCBpcyBlbmNvdW50ZXJlZC4KLQotVGh1IE9jdCAyOCAxMzowOToyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2JlZ2luKTogV2hlbiBvcGNvZGVzIGFyZSBtYXNoZWQgdG9nZXRoZXIgaW4KLQl0aGUgdGFibGUsIHJlcXVpcmUgdGhhdCB0aGUgb25lIHdpdGhvdXQgYml0IDB4MTAwMDAwMCBzZXQgY29tZQotCWZpcnN0LiAgUmVxdWlyZSBmdXJ0aGVyIHRoYXQgaXQgYmUgY2FzZSAnYicgb3IgJ1AnLiAgVGhlIGEyOWsKLQlvcGNvZGUgdGFibGUgYWxyZWFkeSBtZWV0cyB0aGVzZSBjb25zdHJhaW50cy4KLQkobWFjaGluZV9pcCk6IFdoZW4gaGFuZGxpbmcgY2FzZSAnaScgb3IgJ0EnLCBtYWtlIHN1cmUgdGhhdCB0aGUKLQlhcHByb3ByaWF0ZSBvcGNvZGUgcmVhbGx5IGV4aXN0cyBieSBsb29raW5nIGF0IHRoZSBuZXh0IGVudHJ5IGluCi0JdGhlIG9wY29kZSB0YWJsZS4KLQotV2VkIE9jdCAyNyAxMTo0ODo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBBZGp1c3Qgb2Zmc2V0cyBmb3IgUEMgcmVsYXRpdmUKLQlmaXh1cHMuICBBZGQgNiBmb3IgbG9uZyA3LjMgY2FzZSwgMiBmb3Igc2hvcnQgNy4yIGNhc2UuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX2Vjb2ZmX2VudCk6IElnbm9yZSBhbiBvcHRpb25hbCBudW1iZXIKLQlhZnRlciBhIC5lbnQgZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogSGFuZGxlICc+JyBjYXNlIChzaGlmdCBhbW91bnQKLQliZXR3ZWVuIDMyIGFuZCA2MyBmb3IgZG91YmxlIHNoaWZ0IGluc3RydWN0aW9uKS4gIERvICYgMHgxZiByYXRoZXIKLQl0aGFuICUgMzIuCi0JKHByaW50SW5zbik6IEhhbmRsZSAnPicuCi0KLVR1ZSBPY3QgMjYgMTY6NTg6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBPdXRwdXQgdGhlIHN5bWJvbAotCW51bWJlciBpbiB0aGUgcmlnaHQgcGxhY2UuICBVbnRlc3RlZC4gIFByb2JhYmx5IGRvZXMgbm90IHdvcmsgZm9yCi0JY3Jvc3MgYXNzZW1ibHkuICBGcm9tIGNhZ25leUBjcy5hZGVsYWlkZS5lZHUuYXUgKEFuZHJldyBDYWduZXkpLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IEVycm9yIGlmIGEgc2hvcnQgYnJhbmNoIHVzZXMKLQlhbiBpbGxlZ2FsIG9mZnNldCBvZiAwIG9yIC0xLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogQWxpZ24gLnN0YWIKLQlzZWN0aW9uIHRvIGEgbG9uZ3dvcmQgYm91bmRhcnkuCi0KLVR1ZSBPY3QgMjYgMTA6MjQ6MzEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDSEVDS0ZMQUdTKTogUGFzcyBkb3duIFJVTlRFU1RGTEFHUy4KLQotCUZyb20gSmVmZiBMYXc6Ci0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBFTEYzMl9IUFBBX1JfQURERU5EIC0+Ci0JSFBQQV9SX0FEREVORC4KLQotTW9uIE9jdCAyNSAxNDowNjoxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEZpeCB1cCBtZW1iYXIgYXJndW1lbnQgaGFuZGxpbmcuCi0KLU1vbiBPY3QgMjUgMTE6MTc6NTggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmMgKGJ1aWxkX01ieXRlcyk6IFdyaXRlIHRoZSByZWxvY3MgdG8gdGhlIGNvcnJlY3QKLQlhZGRyZXNzLiAobWRfYXNzZW1ibGUpOiBNYWtlIGVycm9yIGhhbmRsaW5nIGEgYml0IG1vcmUgZ3JhY2VmdWwuCi0JKG1kX2FwcGx5X2ZpeCk6ICBEb24ndCB3YXJuIG9uIG5vbiBhbGlnbmVkIGRpc3BsYWNlbWVudC4KLQotCSogY29uZmlnL3RjLXo4ay5jIChnZXRfc3BlY2lmaWMsIGJ1aWx0X2J5dGVzKTogIFVuZGVyc3RhbmQgYWxsIHRoZQotCWFzcGVjdHMgb2YgbGRhLgotCi1Nb24gT2N0IDI1IDEwOjIwOjMxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFVzZSAiJDwqIiBzbyBWUEFUSCB3aWxsIGZpbmQKLQlhcy5pbmZvKiBldmVuIGlmIHRoZXkncmUgaW4gJChzcmNkaXIpIChlLmcuLCBmb3IgRlNGCi0JZGlzdHJpYnV0aW9ucykuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEZvciByZWxvY3MgdGhhdCBhcmUgcGNfcmVsYXRpdmUgYW5kCi0JcGNyZWxfb2Zmc2V0IGFuZCBub3QgcGFydGlhbF9pbnBsYWNlLCBhZGp1c3QgcmVsb2MtPmFkZGVuZCB0bwotCWNvbXBlbnNhdGUgZm9yIGEgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBidWcuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oOiBSZW1vdmVkIHJlbWFpbmluZyBub24tQkZEX0FTU0VNQkxFUiBjb2RlLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IERpdHRvLgotCSh0Y19nZW5fcmVsb2MpOiBJbmNsdWRlIGZ4X29mZnNldCBmb3IgcGNyZWwgZml4dXBzLgotCi1TdW4gT2N0IDI0IDE2OjQ5OjAwIDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25AeDEuY3lnbnVzLmNvbSkKLQotCSogdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZHdvcmQgcHNldWRvIG9wLgotCi1GcmkgT2N0IDIyIDIwOjQwOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYzogcmVwbGFjZWQgYWxsIHZhcmlhYmxlcyBjYWxsZWQgRm9ybWF0IHdpdGggJ2Zvcm1hdCcsCi0JICBmb3IgY29uc2lzdGVuY3kgdGhyb3VnaG91dAotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSBtaXBzKi0gaW5zdGVhZCBvZiBtaXBzLCBtaXBzKmVsIGZvciBsaXR0bGUKLQllbmRpYW4gY29uZmlndXJhdGlvbnMKLQotRnJpIE9jdCAyMiAxNDo0NTo0OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGlucHV0LXNjcnViLmMgKHBoeXNpY2FsX2lucHV0X2ZpbGUsIGxvZ2ljYWxfaW5wdXRfZmlsZSwKLQlwaHlzaWNhbF9pbnB1dF9saW5lLCBsb2dpY2FsX2lucHV0X2xpbmUpOiBNYWRlIHN0YXRpYy4KLQkoYXNfd2hlcmUpOiBSZXR1cm4gY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLCBkb24ndCBwcmludAotCXRoZW0gb3V0LgotCSogbWVzc2FnZXMuYyAoYXNfc2hvd193aGVyZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uICBPdGhlcgotCWZ1bmN0aW9ucyB1c2UgaXQgaW5zdGVhZCBvZiBhc193aGVyZS4KLQkoYXNfYmFkX2ludGVybmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXNfYmFkKTogVXNlIGFzX2JhZF9pbnRlcm5hbC4KLQkoYXNfYmFkX3doZXJlKTogTmV3IGZ1bmN0aW9uLCBsaWtlIGFzX2JhZCBidXQgdGFraW5nIGEgZmlsZSBuYW1lCi0JYW5kIGxpbmUgbnVtYmVyLgotCSogYXMuaCAoYXNfYmFkX3doZXJlKTogRGVjbGFyZS4KLQkoYXNfd2hlcmUpOiBDaGFuZ2UgcHJvdG90eXBlIGZvciBuZXcgYXJndW1lbnRzLgotCSogd3JpdGUuaCAoZml4Uyk6IEFkZGVkIGZpZWxkcyBmeF9maWxlIGFuZCBmeF9saW5lLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IFNhdmUgZmlsZSBhbmQgbGluZSBudW1iZXIgaW4gZml4LgotCShmaXh1cF9zZWdtZW50KTogVXNlIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KLQkqIGlucHV0LWZpbGUuYyAoZl9pbiwgZmlsZV9uYW1lKTogTWFkZSBzdGF0aWMuCi0JKiBjb25kLmMgKHN0cnVjdCBmaWxlX2xpbmUpOiBKdXN0IHVzZSBmaWxlIGFuZCBsaW5lIGZpZWxkcy4KLQkoc19lbHNlKTogVXNlIGFzX3doZXJlIGFuZCBhc19iYWRfd2hlcmUsIG5vdCBnZXRfZmlsZV9saW5lIGFuZAotCXNldF9maWxlX2xpbmUuCi0JKGdldF9maWxlX2xpbmUsIHNldF9maWxlX2xpbmUpOiBSZW1vdmVkLgotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBVc2UgYXNfd2hlcmUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgYXNfd2hlcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGFkZF9maWxlKTogVXNlIGFzX3doZXJlLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogVXNlIGFzX2JhZF93aGVyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IFVzZSBhc19iYWRfd2hlcmUsIG5vdCBhc3NlcnQuCi0KLVRodSBPY3QgMjEgMTI6NTI6MDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmg6IERvbid0IGRlZmluZSBSRUdJU1RFUl9QUkVGSVggb3IKLQlPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVggaWYgZWl0aGVyIGlzIGFscmVhZHkgZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IERlbGV0ZSBzb21lIGNvZGUgaW4gIiNpZiAwIi4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYmZkX2dhcyBmb3IgYWxsIHNwYXJjIHRhcmdldHMuICBBZGRlZCBmYWNpbGl0eQotCWZvciBrZWVwaW5nIG9yIHJlamVjdGluZyBjb25maWd1cmF0aW9ucyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudDsKLQlkZWZhdWx0IGlzIHRvIGFzc3VtZSBwcm9kdWN0aW9uIGVudmlyb25tZW50LCBhbmQgcmVqZWN0IGNvbmZpZ3MKLQlzdGlsbCBiZWluZyB3b3JrZWQgb24uICBNYXJrIEVsZiBjb25maWd1cmF0aW9ucyAoZXhjZXB0IHNwYXJjIGFuZAotCWkzODYpIGFzIGRldmVsb3BtZW50YWwuICBEZWxldGVkIGNhc2VzIG1hdGNoaW5nIHNvbWUgZ2VuZXJpYyBuYW1lcwotCWluIGZhdm9yIG9mIG1vcmUgc3BlY2lmaWMgbmFtZXMuICAoRS5nLiwgd2hlbiB3ZSBnZXQgQWxwaGEKLQlzdXBwb3J0LCB3ZSdsbCBzdGlsbCBvbmx5IHN1cHBvcnQgVk1TIGZvciBWYXguKQotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZW5kKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2VuZCk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKEJGRF9SRUxPQ18qKTogRGVsZXRlIG1hY3JvcyB0aGF0IHVzZWQgdG8gaGVscCBrZWVwIHRoZSBub24tYmZkCi0JdmVyc2lvbiBjb21waWxpbmcuICBBbGwgc3BhcmMgdGFyZ2V0cyB3aWxsIHVzZSBiZmQgbm93LgotCSogdGMuaCAobWRfZW5kKTogRG9uJ3QgZGVjbGFyZSBpZiBpdCdzIGRlZmluZWQgYXMgYSBtYWNyby4KLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdyBhbmQgUGV0ZXIgSG9vZ2VuYm9vbToKLQotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogTGltaXQgb2N0YWwgY2hhcmFjdGVyIGNvbnN0YW50cyB0bwotCXRocmVlIGRpZ2l0cy4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogTWFqb3IgY2xlYW51cC4gIFVzZSBHTlUtc3R5bGUgY29tbWVudHMuICBXYXJuCi0JYWdhaW5zdCBwbGFjaW5nIGFkZGl0aW9uYWwgb2JqZWN0LWZpbGUgZGVwZW5kZW50IGNvZGUgaGVyZS4gIFdhcm4KLQlhZ2FpbnN0IGNvbnRhbWluYXRpbmcgYWxsIG9mIEdBUyB3aXRoIHRoZSBpbnRlcm5hbHMgb2YgdGMtaHBwYS5jCi0JdGhyb3VnaCBpbmNsdXNpb24gb2YgdGMtaHBwYS5oLiAgRGVsZXRlIGFsbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwotCWZvciBmdW5jdGlvbnMgb25seSB1c2VkIHdpdGhpbiB0Yy1ocHBhLmMsIGxpa2V3aXNlIGZvciBzdHJ1Y3R1cmVzLAotCXZhcmlhYmxlcywgYW5kICNkZWZpbmVzLiAgVHJ5IHRvIGdyb3VwIE9CSl9FTEYgYW5kIE9CSl9TT00KLQljb25kaXRpb25hbCBjb2RlIGluIGEgZmV3IHNtYWxsIHBsYWNlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogTWFqb3IgY2xlYW51cC4gIFVzZSBHTlUtc3R5bGUgY29tbWVudHMuICBHcm91cAotCXN0cnVjdHVyZXMsIGdsb2JhbCB2YXJpYWJsZXMsIGZvcndhcmQgZGVjbGFyYXRpb25zIHRvZ2V0aGVyLgotCVJlZHVjZSAob3IgaW4gc29tZSBjYXNlcyBlbGltaW5hdGUpIE9CSl9FTEYgYW5kIE9CSl9TT00KLQljb25kaXRpb25hbCBjb2RlIC0tIHRyeSB0byBncm91cCBjb25kaXRpb25hbCBjb2RlIHRvZ2V0aGVyCi0JaW50byBhIGZldyBwbGFjZXMuICAgTWFrZSBhbGwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgd2hpY2gKLQlhcmUgb25seSB1c2VkIHdpdGhpbiB0Yy1ocHBhLmMgc3RhdGljLiAgUEFSQU1pemUgYWxsIGZ1bmN0aW9ucy4KLQlBZGQgY29tbWVudHMgdG8gZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZCBmdW5jdGlvbnMsIHZhcmlhYmxlcywKLQkjZGVmaW5lcywgZXRjLiAgRGVsZXRlIHVudXNlZCBtZW1iZXJzIHdpdGhpbiBzdHJ1Y3R1cmVzLiAgRGVsZXRlCi0JbGRpbDtibGUgaGFja3MgLS0gaXQgaXMgYmVsaWV2ZWQgdGhleSB3ZXJlIGluc3RhbGxlZCB0byB3b3JrCi0JYXJvdW5kIG9sZCBnYXMgYnVncy4gICBBdm9pZCB1c2luZyBtaXhlZCBjYXNlIGZvciBsb2NhbAotCWZ1bmN0aW9ucywgdmFyaWFibGVzLCBhbmQgc3RydWN0dXJlcy4gIEZpeCBmb3JtYXR0aW5nIHByb2JsZW1zCi0Jbm90IGZvdW5kIGJ5IEdOVS1pbmRlbnQuICBBZGQgRklYTUUgbm90aWNlcyBmb3IgdGhpbmdzIHdoaWNoCi0Jc2hvdWxkIGJlIHdvcmtlZCBvbiB0aGUgbmVhciBmdXR1cmUuICBEZWxldGUgbG90cyBvZiBvbGQKLQl1c2VsZXNzICgxLjM2IFBBLVNPTSkgY29kZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogKGZpeF9uZXdfaHBwYSk6IEluaXRpYWxpemUgdGhlIGZ4X3JfdHlwZQotCWZpZWxkIG9mIHRoZSBmaXhTIHN0cnVjdHVyZS4gIE5lZWRlZCB0byBidWlsZCB1bndpbmQKLQlkZXNjcmlwdG9ycyBjb3JyZWN0bHkuCi0KLQkqIHdyaXRlLmM6IChmaXh1cF9zZWdtZW50KTogQWxsb3cgZXhwcmVzc2lvbnMgc3VjaCBhcwotCXN5bTEtc3ltMitjb25zdCBhcyBsb25nIGFzIHN5bTIgaXMgJGdsb2JhbCQuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUHJvdmlkZSBhIGhvb2sgc28gdGhhdCBhIHRhcmdldAotCWNwdSBjb25maWd1cmF0aW9uIGNhbiByZWplY3QgY2VydGFpbiByZWxvY2F0aW9uIHJlZHVjdGlvbnMuCi0JKiB0Yy1ocHBhLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogTmV3IG1hY3JvLiAgT25seSBhY2NlcHQgcmVsb2NhdGlvbnMKLQl3aGljaCBkbyBub3QgaW52b2x2ZSBmdW5jdGlvbiBzeW1ib2xzLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBSZWluZGVudCB3aXRoIEdOVS1pbmRlbnQuICBEZWxldGUgcmVmZXJlbmNlcwotCXRvIE9CSl9PU0ZST1NFLiAgRml4IHR5cG9zIChPQkpfU09NRSAtPiBPQkpfU09NKS4gIERlbGV0ZSB1bnVzZWQKLQlTVEFCX0ZJWFVQIG1hY3JvLgotCSogY29uZmlnL3RjLWhwcGEuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeF8xKTogVXNlIGVsZl9zeW1ib2xfdHlwZSwgaW5zdGVhZAotCW9mIGVsZjMyX3N5bWJvbF90eXBlLgotCShwYV9leHBvcnRfYXJncyk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKHBhX2Rlc2MpOiBEbyBub3QgY2FsbCBvYmpfZWxmX2Rlc2MuICAoSXMgcGFfZGVzYyBldmVuIG5lZWRlZAotCWFueW1vcmU/KQotCShocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBEbyBub3QgZGVjbGFyZSBlbGZfZ2V0X3N5bXRhYl9tYXAgYW55Ci0Jb3JlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiAobWRfc2VjdGlvbl9hbGlnbik6IEFsaWduIGFsbCBzZWN0aW9ucyB0bwotCWEgbXVsdGlwbGUgb2YgdGhlIHNlY3Rpb24gYWxpZ25tZW50IHJhdGhlciB0aGFuIGFsd2F5cyBhCi0JbXVsdGlwbGUgb2YgOC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19zeW1ib2wpOiBJZiB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbgotCWJpdHMgYXJlIHplcm8gKGVnIHRoZXkgc3BlY2lmeSBubyByZWxvY2F0aW9ucyksIHRoZW4gZG8gbm90IGV2ZW4KLQlib3RoZXIgYWRkaW5nIHRoZWlyIGVudHJpZXMgdG8gdGhlc3ltZXh0biBzZWN0aW9uLgotCi1UaHUgT2N0IDIxIDE1OjQ0OjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCBhbmQgaWdub3JlIC1zcGFyYwotCW9wdGlvbiwgd2hpY2ggaXMgdXNlZCBieSB0aGUgU3VuT1MgbWFrZSBkZWZhdWx0IC5zLm8gcnVsZS4KLQotV2VkIE9jdCAyMCAxMjoyNjozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwLCBsYWJlbCAiaW1tZWRpYXRlIik6IENvbnZlcnQgcmVsb2NzCi0Jb3BlcmF0aW5nIG9uIHVwcGVyIDMyIGJpdHMgb2YgaW1tZWRpYXRlIGNvbnN0YW50cyB0byBsb3dlci1oYWxmCi0JcmVsb2NzIHdpdGggYWRqdXN0ZWQgY29uc3RhbnRzLgotCi1UdWUgT2N0IDE5IDE4OjEzOjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuaCAoQU9VVF9NQUNIVFlQRSk6IERlZmluZSB0byBiZSBleHRlcm5hbCB2YXJpYWJsZQotCW02OGtfYW91dF9tYWNodHlwZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG9tYWdpYyk6IFJlbW92ZSBvYnNvbGV0ZSBhbmQgdW51c2VkIHZhcmlhYmxlLgotCShtNjhrX2FvdXRfbWFjaHR5cGUpOiBOZXcgdmFyaWFibGUsIGlmIE9CSl9BT1VULgotCShtZF9hc3NlbWJsZSk6IEluaXRpYWxpemUgbTY4a19hb3V0X21hY2h0eXBlIGJhc2VkIG9uCi0JY3VycmVudF9hcmNoaXRlY3R1cmUsIGlmIE9CSl9BT1VULgotCShtZF9wYXJzZV9vcHRpb24pOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlIHRvIG9tYWdpYy4KLQotVGh1IE9jdCAxNCAxNjo1MTowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IElnbm9yZSAubGl2ZXJlZyBwc2V1ZG8tb3AuCi0JKHNfb3B0aW9uKTogSWdub3JlIC5vcHRpb24gTyogYW5kIC5vcHRpb24gcGljKi4KLQkoc19lbnQpOiBTa2lwIHdoaXRlc3BhY2UgYmV0d2VlbiBzeW1ib2wgYW5kIG9wdGlvbmFsIGRpZ2l0LgotCShteV9nZXRTbWFsbEV4cHJlc3Npb24pOiBIYW5kbGUgKCR4eCkgY29ycmVjdGx5OiBhc3N1bWUgMCgkeHgpLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWx3YXlzIGFjY2VwdCAneCcgYW5kICdYJyBhcyBlc2NhcGUKLQljaGFyYWN0ZXJzIGluIHN0YXRlIDYuCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBBY2NlcHQgXFhoKiBhbmQgXHhoKiB3aGVyZSBoKiBhcmUKLQloZXhpZGVjaW1hbCBkaWdpdHMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeF8xKTogTWFrZSBjcm9zcyBzZWdtZW50IGNhbGxzIHdvcmsKLQlmb3IgRUxGIGJ5IGhhY2tpbmcgYXJvdW5kIGJpemFycmUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBiZWhhdmlvdXIKLQl0aGF0IEkgZG9uJ3QgZGFyZSBjaGFuZ2UuCi0KLVRodSBPY3QgMTQgMTE6MzM6MjUgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IChtZF9iZWdpbik6IERvIG5vdCB6ZXJvIHN0YXRpYyBhcnJheXMuICBEb24ndAotCWNhbGwgc3RyY2hyIGZvciBlYWNoIGNoYXJhY3RlciB0byBzZWUgaWYgaXQgaXMgYSBzcGVjaWFsIGNoYXIsCi0JaW5zdGVhZCBhZGQgYSBzZWNvbmQgbG9vcCBvdmVyIHNwZWNpYWxfY2hhcnMuICBTZXQgYWxpZ25tZW50Ci0Jb2YgdGV4dCwgZGF0YSBhbmQgYnNzIHNlY3Rpb25zIHRvIDQuCi0JKHBpLCB0ZSwgcHQsIHBlLCBwcyk6IEFkZCBkZWNsYXJhdGlvbnMgc28gdGhhdCBERUJVRzM4NiBjYW4gYmUKLQl1c2VkIGFnYWluLgotCShyZWxvYyk6IERvbid0IHJldHVybiA4IGFuZCAxNiBiaXQgbm9uLVBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIG9uCi0JRUxGLCBzaW5jZSB0aGUgRUxGIG9iamVjdCBmb3JtYXQgZG9lcyBub3QgaGF2ZSB0aGVzZSB0eXBlIG9mCi0JcmVsb2NhdGlvbnMuICBDaGFuZ2UgdGhlIGFib3J0IGludG8gYXMgYXNfYmFkIGFuZCByZXR1cm4KLQlCRkRfUkVMT0NfTk9ORSB0byBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLgotCShtZF9hc3NlbWJsZSk6IEtlZXAgdHJhY2sgb2YgdGhlIGluc3RydWN0aW9uIHNpemUuICBBbGxvdyB3aGl0ZQotCXNwYWNlIGJldHdlZW4gdGhlICQgYW5kIHRoZSBjb25zdGFudCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCi0JZ2FzZXMgYW5kIG90aGVyIGFzc2VtYmxlcnMuCi0JKGkzODZfb3BlcmFuZCk6IFNraXAgc3BhY2VzIGJldHdlZW4gJCBhbmQgZXhwcmVzc2lvbi4KLQkodGNfZ2VuX3JlbG9jKTogRG9uJ3QgYWxsb3cgYW55dGhpbmcgYnV0IDMyIGJpdCByZWxvY2F0aW9ucyBvbgotCUVMRi4gIENvbnZlcnQgYWJvcnQgaW50byBhbiBhc19iYWQgYW5kIGFzc2VydCBpbnRvIGFzX2ZhdGFsLgotCi1XZWQgT2N0IDEzIDE2OjUwOjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpIFtESUZGX0VYUFJfT0tdOiBJZgotCXN1Yl9zeW1ib2xQIGlzIGluIHRoZSBjdXJyZW50IHNlZ21lbnQsIGNvbnZlcnQgdG8gYSBQQy1yZWxhdGl2ZQotCWZpeHVwIGFuZCBkaXNjYXJkIHRoZSBzeW1ib2wuCi0KLVdlZCBPY3QgMTMgMTQ6MDA6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBIYW5kbGUgc3RfRW5kIHN5bWJvbAotCWZvciBzdF9TdGF0aWNQcm9jIGp1c3QgbGlrZSBzdF9Qcm9jLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMpOiBNb3ZlZCAjZW5kaWYgZm9yIE9CSl9CT1VUCi0Jc28gdGhhdCBPQkpfQk9VVCBkb2Vzbid0IGZvcmdldCB0byBhZGp1c3QgYWxsIHRoZSBmcmFnbWVudHMgaW4gdGhlCi0JLmJzcyBzZWN0aW9uLgotCi1UdWUgT2N0IDEyIDE3OjI2OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYzogSWYgT0JKX0VMRiwgaW5jbHVkZSBlbGYvbWlwcy5oLgotCShtaXBzX3JlZ21hc2tfZnJhZyk6IE5ldyBzdGF0aWMgdmFyaWFibGUsIGlmIE9CSl9FTEYuCi0JKG1kX2JlZ2luKTogSWYgT0JKX0VMRiwgY3JlYXRlIC5yZWdpbmZvIHNlY3Rpb24gYW5kIHNldAotCW1pcHNfcmVnbWFza19mcmFnIHRvIGEgZnJhZy4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbiwgaWYgT0JKX0VMRi4gIFNldAotCW1pcHNfcmVnbWFza19mcmFnIHRvIHJlZ2lzdGVyIG1hc2sgaW5mb3JtYXRpb24uCi0JKiBjb25maWcvdGMtbWlwcy5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyk6IE5ldyBtYWNybywgZGVmaW5lZAotCWlmIE9CSl9FTEYuCi0KLVR1ZSBPY3QgMTIgMDM6MzM6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IFVzZSBteW5hbWUgd2hlbiBwcmludGluZyBtZXNzYWdlcy4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfYmVnaW4pOiBVc2UgbnVsbCBwb2ludGVyLCBub3QgZW1wdHkgc3RyaW5nLAotCWFzIGluaXRpYWwgInJldHVybiIgdmFsdWUgaW4gY2FzZSBoYXNoaW5nIGlzbid0IG5lZWRlZC4KLQotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYXRvZik6IFJldHVybiBudWxsLCBub3QgZW1wdHkgc3RyaW5nLCBvbgotCXN1Y2Nlc3MuCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfYXRvZiksIGNvbmZpZy90Yy1oODUwMC5jIChtZF9hdG9mKSwKLQljb25maWcvdGMtaHBwYS5jIChtZF9hdG9mKSwgY29uZmlnL3RjLWk4NjAuYyAobWRfYXRvZiksCi0JY29uZmlnL3RjLWk5NjAuYyAobWRfYXRvZiksIGNvbmZpZy90Yy1tODhrLmMgKG1kX2F0b2YpLAotCWNvbmZpZy90Yy1uczMyay5jIChtZF9hdG9mKSwgY29uZmlnL3RjLXNoLmMgKG1kX2F0b2YpOiBEaXR0by4KLQotTW9uIE9jdCAxMSAxNjo0NjozMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JZml4IGZvciBwciAzNTcxCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X3NwZWNpZmljKTogU3BlY2lhbCBhY3Rpb24gaWYgOCBiaXQKLQlhZGRyZXNzIHNlZW4uIChjaGVja19vcGVyYW5kKTogRG9uJ3QgY29tcGxhaW4gaWYgdHJ1bmNhdGluZyB0b3AKLQliaXRzIG9mIGFuIDggYml0IGFkZHJlc3MuICAoYnVpbGRfYnl0ZXMpOiBBbGxvdyBhbiBpbW1lZGlhdGUgYW5kCi0JYW4gYWJzb2x1dGUgaW4gdGhlIHNhbWUgaW5zbi4KLQotTW9uIE9jdCAxMSAxNzoxODo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogRG9uJ3QgY3Jhc2ggaWYgc2VnaW5mbyBpcyBOVUxMLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IFdyaXRlIG91dCByZWdpc3RlciBtYXNrcwotCWJ5IG1vZGlmeWluZyAucmVnaW5mbyBzZWN0aW9uLCBub3QgYnkgZGlyZWN0bHkgbW9kaWZ5aW5nIEJGRAotCWJhY2tlbmQgZGF0YS4KLQotTW9uIE9jdCAxMSAxNDoxMTozMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiByZW1vdmUgZXh0ZXJuIHRpbWUgZGVjbGFyYXRpb24KLQotTW9uIE9jdCAxMSAxNjoxNDo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogRG8gbWVudGlvbiB0aGF0IGl0J3MgdGhlIGFzc2VtYmxlciB0aGF0Ci0JZ290IHRoZSBmYXRhbCBlcnJvci4KLQotRnJpIE9jdCAgOCAxNDowOTozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZ3BybWFzaywgbWlwc19jcHJtYXNrKTogTmV3IHZhcmlhYmxlcyB0bwotCWhvbGQgcmVnaXN0ZXIgbWFza3MuCi0JKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSB0aGVtIHRvIHplcm8uCi0JKGFwcGVuZF9pbnNuKTogVXBkYXRlIG1pcHNfZ3BybWFzayBhbmQgbWlwc19jcHJtYXNrLiAgQWxzbyBhZGQKLQlyZWdpc3RlciB2YXJpYWJsZXMgcGluZm8gYW5kIHByZXZfcGluZm8uCi0JKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX2dwcm1hc2ssIG1pcHNfY3BybWFzayk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IElmIFRDX01JUFMsIHNldCBncHJtYXNrCi0JYW5kIGNwcm1hc2sgZnJvbSBtaXBzX2dwcm1hc2sgYW5kIG1pcHNfY3BybWFzay4KLQotCSogY29uZmlnL3RjLW1pcHMuaDogRGVmaW5lIFRBUkdFVF9GT1JNQVQgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKEdQT1BUKTogRGVmaW5lIGlmIE9CSl9FQ09GRiBvciBPQkpfRUxGLgotCSh2YXJpb3VzKTogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvIEdQIHJlZmVyZW5jZXMgdG8gYXBwbHkgaWYKLQlHUE9QVCwgbm90IGlmIE9CSl9FQ09GRi4KLQkoc19jaGFuZ2Vfc2VjKTogUmVhcnJhbmdlIHNvbWV3aGF0LiAgSWYgT0JKX0VMRiwgdXNlIC5yb2RhdGEKLQlpbnN0ZWFkIG9mIC5yZGF0YS4gIElmIE9CSl9FTEYsIHNldCBzZWN0aW9uIGZsYWdzIGZvciAucm9kYXRhIGFuZAotCS5zZGF0YSBzZWN0aW9ucy4KLQkoc19mcmFtZSwgc19sb2MsIHNfbWFzayk6IENvbW1lbnQgb3V0IGVudGlyZSBmdW5jdGlvbnMsIHJhdGhlcgotCXRoYW4ganVzdCBib2R5LiAgVGhleSdyZSBub3QgdXNlZCBhbnlob3cuCi0JKiBjb25maWd1cmUuaW46IFNldCBjcHVfdHlwZSB0byBtaXBzIGZvciBtaXBzKi4gIEFjY2VwdAotCW1pcHMtKi1lbGZsKiBhbmQgbWlwcy0qLWVsZiouCi0KLVRodSBPY3QgIDcgMTg6MzY6MjkgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogQWxsb3cgdGhlIGFsaWdubWVudCBmaWVsZCB0bwotCW5vdCBiZSBzcGVjaWZpZWQuCi0KLVdlZCBPY3QgIDYgMTM6MDE6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChjb25zX2ZpeF9uZXdfbWlwcyk6IE5ldyBmdW5jdGlvbi4gIFR1cm4KLQlCRkRfUkVMT0NfNjQgaW50byBCRkRfUkVMT0NfMzIuCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQ19DT05TX0ZJWF9ORVcpOiBEZWZpbmUuCi0JKGNvbnNfZml4X25ld19taXBzKTogRGVjbGFyZS4KLQotCUNoYW5nZXMgdG8gbGV0IGNvbnMgaGFuZGxlIGJpZ251bXMgbGlrZSBnZW5lcmFsIGV4cHJlc3Npb25zLgotCSogZXhwci5oIChleHByZXNzaW9uUyk6IE5ldyBmaWVsZCBYX3Vuc2lnbmVkLgotCSogZXhwci5jIChvcGVyYW5kKTogSW5pdGlhbGl6ZSBYX3Vuc2lnbmVkIHRvIDEuICBTZXQgaXQgdG8gMCBmb3IKLQl1bmFyeSBtaW51cyBjYXNlLgotCShleHByKSBGaXggdHlwbyByZXN1bHRQIHRvIHJpZ2h0IGlmIG1pc3Npbmcgb3BlcmFuZC4gIFNldAotCVhfdW5zaWduZWQgdG8gMSB3aGVuIGJ1aWxkaW5nIG5ldyBleHByZXNzaW9uLgotCSogcmVhZC5jIChwb3RhYmxlKTogTWFrZSAib2N0YSIgYW5kICJxdWFkIiBjYWxsIGNvbnMsIG5vdAotCWJpZ19jb25zLgotCShjb25zKTogSGFuZGxlIGJpZ251bXMuICBJZiBnaXZlbiBhbiBPX2NvbnN0YW50IChzbWFsbCBpbnRlZ2VyKSB0bwotCWZpbGwgYSBiaWcgc3BhY2UsIHR1cm4gaXQgaW50byBhIGJpZ251bS4KLQkocGFyc2VfYml0ZmllbGRfY29ucyk6IFNldCBYX3Vuc2lnbmVkIGZpZWxkLgotCShiaWdudW1fbG93LCBiaWdudW1fbGltaXQsIGJpZ251bV9oaWdoLCBncm93X2JpZ251bSwgYmlnX2NvbnMpOgotCVJlbW92ZWQuCi0JKiByZWFkLmggKGJpZ19jb25zKTogUmVtb3ZlIHByb3RvdHlwZS4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBEb24ndCBnaXZlIGEgd2FybmluZyBpZiBhCi0Jc3ltYm9sIGluIGV4cHJfc2VjdGlvbiBjYW4gbm90IGJlIHJlc29sdmVkLgotCShTX1NFVF9WQUxVRSk6IENsZWFyIFhfdW5zaWduZWQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIHJlc29sdmVfc3ltYm9sX3ZhbHVlIGZhaWxlZCBvbiBhCi0Jc3ltYm9sIHdlIGFyZSB3cml0aW5nIG91dCwgZ2l2ZSBhIHdhcm5pbmcuCi0JKiBjb25maWcvdGMtaDg1MDAuYyAocGFyc2VfcmVnbGlzdCk6IFNldCBYX3Vuc2lnbmVkLgotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlICJvY3RhIiBhbmQgInF1YWQiIHRvCi0JY2FsbCBwYV9jb25zLCBub3QgcGFfYmlnX2NvbnMuCi0JKHBhX2JpZ19jb25zKTogUmVtb3ZlLgotCSogY29uZmlnL3RjLWhwcGEuaCAocGFfYmlnX2NvbnMpOiBSZW1vdmUgZGVjbGFyYXRpb24uCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBDaGFuZ2UgInF1YWQiIHRvIGNhbGwgY29ucywKLQlub3QgYmlnX2NvbnMuCi0KLVR1ZSBPY3QgIDUgMTA6NTM6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMudGV4aW5mbyAoQ29weWluZyk6IG5ldyBub2RlLCB0byBoYW5kbGUgdGhlIHJlY2VudCBjaGFuZ2VzCi0JaW4gdGhlIHRleGluZm8vZ3BsLnRleGluZm8gZmlsZQotCi1Nb24gT2N0ICA0IDE3OjEwOjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChiaWdfY29ucyk6IEhhbmRsZSAiMCIgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IFNldCB0YXJnZXRfYmlnX2VuZGlhbiBjb3JyZWN0bHkuCi0KLU1vbiBPY3QgIDQgMTU6Mzc6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogTW9kZSA3LjMgb3BlcmFuZCB1c2luZyBQQyBzaG91bGQKLQloYXZlIHBjLXJlbGF0aXZlIGZpeHVwLgotCShtZF9wYXJzZV9vcHRpb24pOiBNb3ZlICItayIgY2FzZSBkb3duIG5lYXIgIi1waWMiIGNhc2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWxwaGFiZXRpemUgbGlzdCBvZiBjcHUgdHlwZSBhbHRlcm5hdGl2ZXMuICBFbmFibGUKLQlPUyB2YWx1ZXMgb2YgImxpbnV4KmVsZioiIGFuZCAibGludXgqY29mZioiIHRvIHNlbGVjdCB0aG9zZQotCWZvcm1hdHMsIHdpdGggbGludXggZW11bGF0aW9uLiAgRG9uJ3QgYm90aGVyIGNoZWNraW5nIGZvciB1cHBlci0KLQlvciBtaXhlZC1jYXNlIHZlcnNpb25zIG9mICJvc2UiLgotCi1UaHUgU2VwIDMwIDExOjA1OjM1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy96OGsuYyAobWRfcHNldWRvX3RhYmxlKTogYWRkICJ1bnNlZyIuCi0KLVdlZCBTZXAgMjkgMTY6MTU6MTEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogY29ycmVjdCBhIGZldyBtaXN0YWtlcwotCSAgZm91bmQgd2hpbGUgZXh0ZW5kaW5nIHRoZSBkaXNzYXNzZW1ibGVyLgotCi1UdWUgU2VwIDI4IDEyOjAyOjA0IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTcGxpdCBpMzg2IEx5bnhPUyBvdXQgZnJvbSBvdGhlciBjb2ZmIHRhcmdldHMsCi0JYWRkIGEgc3BlY2lmaWMgTHlueCBlbXVsYXRpb24uCi0JQWRkIG02OGsgTHlueE9TIHRhcmdldC4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IERlZmluZSBzcGVjaWZpYyBMeW54IHRhcmdldCBmb3JtYXQuCi0JKiBjb25maWcvdGMtbTY4ay5jOiBEZWZpbmUgc3BlY2lmaWMgTHlueCB0YXJnZXQgZm9ybWF0LgotCSogY29uZmlnL3RlLWx5bnguaDogTmV3IGZpbGUuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBEb24ndCBzZXQgVEFSR0VUX0ZPUk1BVCB0byBiZQotCSJjb2ZmLXtpMzg2LG02OGt9IiBpZiBUQVJHRVRfRk9STUFUIGFscmVhZHkgZGVmaW5lZC4KLQkoSU5JVF9TVEFCX1NFQ1RJT04pOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYzogSW5jbHVkZSA8dGltZS5oPi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBMb29rIGZvciAuc3RhYiBzZWN0aW9ucyBhbmQgY2FsbAotCWFkanVzdF9zdGFiX3NlY3Rpb24uCi0JKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sIGZpbGxzIGluIHRoZSBmaXJzdCBzeW1ib2wKLQlvZiBhIHN0YWIgc2VjdGlvbiB3aXRoIG51bWJlciBvZiBzeW1ib2xzIGFuZCBzdHJpbmcgdGFibGUgc2l6ZS4KLQkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sIGNyZWF0ZXMgdGhlIGluaXRpYWwKLQlzeW1ib2wgZm9yIGEgc3RhYiBzZWN0aW9uLgotCi1Nb24gU2VwIDI3IDE1OjIxOjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2F0b2YtdmF4LmMgKG1kX2F0b2YpOiBSZXR1cm4gbnVsbCBvbiBzdWNjZXNzIGluc3RlYWQgb2YKLQllbXB0eSBzdHJpbmcuCi0JKiBjb25maWcvYXRvZi10YWhvZS5jIChtZF9hdG9mKTogRGl0dG8uCi0JKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBFeHBlY3QgYSBudWxsIHBvaW50ZXIgZm9yIHN1Y2Nlc3MsIG5vdCBhbgotCWVtcHR5IHN0cmluZy4KLQotCSogaGFzaC5jIChoYXNoX2luc2VydCwgaGFzaF9qYW0sIGhhc2hfZ3Jvdyk6IFJldHVybiBudWxsIHBvaW50ZXIKLQlvbiBzdWNjZXNzLCBpbnN0ZWFkIG9mIGVtcHR5IHN0cmluZy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0KLQkqIGNvbmZpZy90Yy12YXguYzogVXNlIFBBUkFNUyBpbiBkZWNsYXJhdGlvbnMuCi0JKHZpcF9vcCk6IFVzZSBOVUxMIGluc3RlYWQgb2YgZW1wdHkgc3RyaW5nIGZvciBzdWNjZXNzIGluIGVycm9yCi0JYW5kIHdhcm5pbmcgZmllbGRzLgotCi1TdW4gU2VwIDI2IDIzOjQ1OjI5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChleHByKSBbRElGRl9FWFBSX09LXTogUGVybWl0IHN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzCi0JaW4gZGlmZmVyZW50IGRlZmluZWQgc2VnbWVudHMuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBMb2NhbGl6ZSAiYWltIiB2YXJpYWJsZS4gIElmCi0JRElGRl9FWFBSX09LLCBkb24ndCBpbXBvc2UgY2hlY2tzIG9uIHN5bWJvbCBzZWdtZW50IHR5cGVzLgotCShmaXh1cF9zZWdtZW50KSBbRElGRl9FWFBSX09LXTogSWYgc3ViX3N5bWJvbFAgaXMgaW4gdGhlIGN1cnJlbnQKLQlzZWdtZW50LCBjb252ZXJ0IHRvIGEgUEMtcmVsYXRpdmUgZml4dXAgYW5kIGRpc2NhcmQgdGhlIHN5bWJvbC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoZmxhZ193YW50X3BpYyk6IE5ldyB2YXJpYWJsZSwgbW9zdGx5IGlnbm9yZWQuCi0JKG1kX3BhcnNlX29wdGlvbikgW1RFX1NVTjNdOiBTZXQgaXQgZm9yICItayIuCi0JKG02OGtfaXApOiBHZW5lcmF0ZSBwcm9wZXIgZml4dXAgZm9yIG1vZGUgNy4zLgotCSogY29uZmlnL3RjLW02OGsuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCi1TYXQgU2VwIDI1IDA1OjA4OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IG02OGtfaW5jYW50LCBnZXRvbmUsIGdldHR3byk6IE1vdmVkCi0JZWFybGllciBpbiB0aGUgZmlsZS4KLQkoaW5zb3AsIGFkZF9leHApOiBOb3cgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIGZvciByZWFkYWJpbGl0eS4KLQkoaW5zb3ApOiBOb3cgdGFrZXMgdHdvIGFyZ3VtZW50czsgY2FsbGVycyBjaGFuZ2VkLgotCi1GcmkgU2VwIDI0IDEyOjM3OjU5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW04OGsuYyAoZ2V0X282KTogbmV3IGZ1bmN0aW9uLgotCSAgKGdldF9iZiwgZ2V0X2NtcCwgZ2V0X2NuZCwgZ2V0X2NyLCBnZXRfZmNyLCBnZXRfaW1tMTYsIGdldF9yZWcsCi0JICBnZXRfdmVjOSwgZ2V0dmFsLCBnZXRfcGNyLCBjYWxjb3AsIG1hdGNoX25hbWUpOiBtYWtlIHN0YXRpYyBhbmQKLQkgIHByb3RvdHlwZS4KLQkgIChzX2ZpbGUpOiByZW1vdmUgZXh0cmFuZW91cyBmb3J3YXJkIGRlY2wuCi0JICAobWRfYmVnaW4pOiBhZGQgY29uc3QgdG8gcmV0dmFsIGRlY2wuCi0JICAoY2FsY29wKTogY29wZSB3aXRoIGluc3RydWN0aW9ucyB3aXRob3V0IGFyZ3VtZW50cy4gIEhhbmRsZSAnbycKLQkgIHR5cGUgYXJndW1lbnQsIHRoZSBvNiBmaWVsZCBvZiB0aGUgcHJvdCBpbnNuLgotCSAgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogcmV0dXJuIGEgZHVtbXkgdmFsdWUuCi0KLQkqIGNvbmZpZy9tODhrLW9wY29kZS5oIChtODhrX29wY29kZXMpOiBjb21tZW50IGNoYW5nZTsgbzYgZmllbGQgaXMKLQkgIGluIGJpdHMgMTAgdGhyb3VnaCA3LiAgZmx0LltkeHNdcyByZXF1aXJlcyBhbiByIHJlZ2lzdGVyIGluIHRoZQotCSAgc2Vjb25kIGFyZ3VtZW50LiAgTmV3IGluc3RydWN0aW9uIGxkYS54LiAgTmV3IGluc3RydWN0aW9uIG11bHMKLQkgIChhbGlhcyBmb3IgbXVsKS4KLQotRnJpIFNlcCAyNCAxMzo0MzozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZWN1cnNlIGxpa2UgY2xlYW4uCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogU2V0IEJGRCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUKLQliYXNlZCBvbiBNSVBTIElTQSBsZXZlbC4KLQotVGh1IFNlcCAyMyAxNzo1ODo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKG1haW4pOiAiZXhoYXVzdGVkIiwgbm90ICJleGh1YXN0ZWQiLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IEFkZCBzeV91c2VkX2luX3JlbG9jIGZpZWxkLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBTZXQgc3lfdXNlZF9pbl9yZWxvYy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBOZXZlciBzdHJpcCBzeW1ib2xzIHdpdGggc3lfdXNlZF9pbl9yZWxvYwotCXNldC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogUmV3cm90ZSB0byBoYW5kbGUgYm90aAotCVNvbGFyaXMgYW5kIFNWUjQgc3R5bGUgLnNlY3Rpb24gcHNldWRvLW9wcy4KLQkob2JqX2VsZl9pZGVudCk6IFNldCBTRUNfUkVBRE9OTFkgZm9yIC5jb21tZW50IHNlY3Rpb24uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSWYgdGhpcyBpcyBFTEYsIGFuZCB3ZSdyZQotCWdlbmVyYXRpbmcgYSByZWxvYywgZG9uJ3QgYXBwbHkgYSBmaXguCi0KLVRodSBTZXAgMjMgMTM6MTY6NTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAocmVsYXhfYWxpZ24pOiBOb3cgc3RhdGljLgotCi1Nb24gU2VwIDIwIDE5OjIzOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogTWFrZSBub24tc3RhdGljLiAgTWFrZQotCWFyZ3VtZW50cyBjb25zdC4gIERvbid0IGFsaWduIHN0cmluZ3MgdG8gNCBieXRlIGJvdW5kYXJpZXMuCi0JKiByZWFkLmg6IERlY2xhcmUgZ2V0X3N0YWJfc3RyaW5nX29mZnNldC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFNldCBTRUNfQUxMT0MgYXMgd2VsbCBhcwotCVNFQ19MT0FEIGZvciBwcm9nYml0cyBzZWN0aW9uLgotCShvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9ucyk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKElOSVRfU1RBQl9TRUNUSU9OKTogQ2FsbAotCW9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24uCi0JKE9CSl9QUk9DRVNTX1NUQUIpOiBSZW1vdmVkIGRlZmluaXRpb24uCi0KLUZyaSBTZXAgMTcgMTg6MTI6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX0dFVF9TSVpFKTogRGVmaW5lLgotCShvYmpfZnJvYl9mb3J3YXJkX3N5bWJvbCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGxpbmVfY29tbWVudF9jaGFycyk6IEluaXRpYWxpemUgaW4gYWxsIGNhc2VzLgotCi1UaHUgU2VwIDE2IDE0OjIzOjA4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogdGMuaDogRGVjbGFyZSB0Y19nZW5fcmVsb2MgZGlmZmVyZW50bHkgZGVwZW5kaW5nIHVwb24KLQlSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBPbmx5IHNldCBmbGFncyB3aGVuIGZpcnN0Ci0JY3JlYXRpbmcgdGhlIHNlY3Rpb24uCi0KLVdlZCBTZXAgMTUgMTI6MTU6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgYSB0cmFwIGluc3RydWN0aW9uCi0Jd2l0aCBhIGJyYW5jaC4KLQotVHVlIFNlcCAxNCAxMzozMTowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfZGF0YSwgb2JqX2VsZl90ZXh0KTogTmV3IGZ1bmN0aW9uczsKLQlzZXQgcHJldmlvdXNfc2VjdGlvbiBhbmQgcHJldmlvdXNfc3Vic2VjdGlvbiBhbmQgdGhlbiBjYWxsIHNfZGF0YQotCWFuZCBzX3RleHQsIHJlc3BlY3RpdmVseS4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCBkYXRhIGFuZCB0ZXh0LgotCShvYmpfZWxmX3NlY3Rpb24pOiBBZGQgU0VDX0xPQUQgdG8gZGVmYXVsdCBpbml0aWFsaXphdGlvbiBvZgotCWZsYWdzLiAgVHJlYXQgLnJvZGF0YTEgbGlrZSAucm9kYXRhLiAgU2V0IFNFQ19MT0FEIGFzIHdlbGwgYXMKLQlTRUNfQUxMT0MgZm9yICJhbGxvYyIgc3RyaW5nLiAgRG9uJ3QgYm90aGVyIHRyeWluZyB0byBmaW5kIHRoZQotCXNlY3Rpb247IGp1c3QgdXNlIHN1YnNlZ19uZXcuCi0KLQkqIHJlYWQuYyAoY2hhbmdlX3RvX3NlY3Rpb24pOiBSZW1vdmVkLiAgVGhpcyBpcyBub3cgZG9uZSBieQotCXN1YnNlZ19uZXcuCi0JKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBSZWFycmFuZ2VkIHNvbWV3aGF0LiAgQ3JlYXRlIHRoZSBzZWN0aW9uCi0JdXNpbmcgc3Vic2VnX25ldy4gIFN0b3JlIHRoZSBzdHJpbmcgaW5kZXggaW4gc2VnX2luZm8sIHJhdGhlciB0aGFuCi0JaW4gYSBzdGF0aWMgdmFyaWFibGUuICBGb3JjZSB0aGUgZmlyc3Qgc3RyaW5nIHRvIGJlIGVtcHR5LiAgVXNlCi0JZnJhZ19tb3JlIHJhdGhlciB0aGFuIEZSQUdfQVBQRU5EXzFfQ0hBUi4KLQkoc19zdGFiX2dlbmVyaWMpOiBSZXdyb3RlLgotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEFkZGVkIHN0YWJ1IHVuaW9uLgotCSogc3Vic2Vncy5jIChzdWJzZWdfbmV3KTogSW5pdGlhbGl6ZSBzdGFiX3N0cmluZ19zaXplIHRvIDAuCi0JKiBjb25maWcvb2JqLWFvdXQuYzogRG9uJ3QgaW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCi0JKG9ial9hb3V0X3N0YWIsIG9ial9hb3V0X2Rlc2MpOiBSZW1vdmVkLgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBkZXNjIGFuZCBzdGFiWCBlbnRyaWVzLgotCSogY29uZmlnL29iai1ib3V0LmM6IFNhbWUgY2hhbmdlcyBhcyBjb25maWcvb2JqLWFvdXQuYy4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX1NFVF9UWVBFKTogRGVmaW5lLgotCSh0Y19ib3V0X2ZpeF90b19jaGFycyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc3RhYik6IFJlbW92ZWQuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRlc2MgYW5kIHN0YWJYIGVudHJpZXMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChjdXJyZW50X3N0YWJfc3ltYm9sKTogUmVtb3ZlZC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChvYmpfc3ltYm9sX3R5cGUpOiBSZW1vdmVkIG5fc3RyeCwgbl90eXBlLAotCW5fb3RoZXIsIG5fZGVzYyBhbmQgbl92YWx1ZSBmaWVsZHMuCi0JKFNfe1MsR31FVF97T0ZGU0VULE9USEVSLFRZUEUsREVTQ30pOiBSZW1vdmVkLgotCShNQUtFX1NUQUJfU1lNQk9MKTogUmVtb3ZlZC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX2Vjb2ZmX3N0YWIpOiBSZW5hbWVkIHRvIGVjb2ZmX3N0YWIuCi0JQ2hhbmdlZCBhcmd1bWVudHMgYW5kIHJlbW92ZWQgcGFyc2luZyBjb2RlLgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBzdGFiWCBlbnRyaWVzLgotCSogY29uZmlnL29iai1lY29mZi5oIChlY29mZl9zdGFiKTogRGVjbGFyZS4KLQkoT0JKX1BST0NFU1NfU1RBQik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmM6IERvbid0IGluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgotCShvYmpfZWxmX3N0YWIsIG9ial9lbGZfeHN0YWIsIG9ial9lbGZfZGVzYywKLQllbGZfc3RhYl9zeW1ib2xfc3RyaW5nLCBlbGZfc3RhYl9zeW1ib2wsIG9ial9lbGZfc3RhYl9nZW5lcmljKToKLQlSZW1vdmVkLgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBkZXNjLCBzdGFiWCBhbmQgeHN0YWJzIGVudHJpZXMuCi0JKG9ial9lbGZfdmVyc2lvbik6IFVzZSBzdWJzZWdfbmV3LCBub3QgYmZkX21ha2Vfc2VjdGlvbi4gIERvbid0Ci0Jc2V0IFNFQ19MT0FEIGZvciAubm90ZSBzZWN0aW9uLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9ucyk6IEdldCBmcmFnIHBvaW50ZXIgZnJvbSBzZWdfaW5mbywgcmF0aGVyCi0JdGhhbiBsb29raW5nIHRocm91Z2ggZnJhZ3MuCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX3tTLEd9RVRfe09USEVSLFRZUEUsREVTQ30pOiBSZW1vdmVkLgotCShTRVBBUkFURV9TVEFCX1NFQ1RJT05TLCBJTklUX1NUQUJfU0VDVElPTiwgT0JKX1BST0NFU1NfU1RBQik6Ci0JRGVmaW5lLgotCSogY29uZmlnL29iai12bXMuYyAob2JqX2FvdXRfc3RhYik6IFJlbW92ZWQuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIHN0YWJYIGVudHJpZXMuCi0JKiBjb25maWcvb2JqLXZtcy5oIChTX1NFVF9UWVBFKTogRGVmaW5lLgotCi0JKiBhcy5oOiBEZWNsYXJlIGxpc3RpbmcuCi0JKiByZWFkLmM6IERvbid0IGRlY2xhcmUgbGlzdGluZy4KLQkoZW1pdF9leHByKTogQ2FzdCBmaXhfbmV3X2V4cCBhcmd1bWVudC4KLQkocGFyc2VfYml0ZmllbGRfY29ucyk6IENvcnJlY3QgcHJpbnRmIGZvcm1hdC4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKiB3cml0ZS5oOiBEZWNsYXJlIHRleHRfbGFzdF9mcmFnIGFuZCBkYXRhX2xhc3RfZnJhZy4KLQkqIGNvbmZpZy9vYmotYm91dC5jIChvYmpfYm91dF9saW5lKTogQWRkZWQgZHVtbXkgYXJndW1lbnQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYzogQWRkIHNvbWUgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBjb25maWcvdGMtYTI5ay5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IExpa2V3aXNlLiAgQWxzbyBmdWxseSBicmFja2V0IHN0cnVjdHVyZQotCWluaXRpYWxpemF0aW9ucywgZml4IHByaW50ZiBmb3JtYXRzLCBhbmQgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLU1vbiBTZXAgMTMgMTY6NDg6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfZGVzYyk6IE9ubHkgY29tcGlsZSBhbmQgdXNlIGlmIFNfU0VUX0RFU0MgaXMgZGVmaW5lZC4KLQkqIHN0cnVjLXN5bWJvbC5oOiBEZWNsYXJlIHZlcmlmeV9zeW1ib2xfY2hhaW4gYW5kCi0JdmVyaWZ5X3N5bWJvbF9jaGFpbl8yIGV2ZW4gaWYgbm90IFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMuCi0JKiBzeW1ib2xzLmMgKHZlcmlmeV9zeW1ib2xfY2hhaW4pOiBSZW1vdmVkIHVzZWxlc3MgZXhwcmVzc2lvbi4KLQkqIHdyaXRlLmMgKGhlYWRlcnMsIHRoZV9vYmplY3RfZmlsZSk6IE9ubHkgdXNlIGlmIG5vdAotCUJGRF9BU1NFTUJMRVIgYW5kIG5vdCBCRkQuCi0JKGZpeHVwX3NlZ21lbnQsIGN2c19mcmFnX3RvX2ZpbGwpOiBPbmx5IHVzZSBpZiBCRkRfQVNTRU1CTEVSIG9yCi0Jbm90IEJGRC4KLQkobWVyZ2VfZGF0YV9pbnRvX3RleHQpOiBPbmx5IHVzZSBpZiBCRkRfQVNTRU1CTEVSIG9yIChub3QgQkZEIGFuZAotCW5vdCBPQkpfQU9VVCkuCi0JKiB3cml0ZS5oOiBEZWNsYXJlIHJlbGF4X3NlZ21lbnQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoc3RhY2tfcG9wLCBzdGFja19wdXNoLCBzdGFja19pbml0KTogTWFkZQotCXN0YXRpYy4KLQkoc3RhY2tfdG9wKTogQ29tbWVudGVkIG91dCwgc2luY2UgaXQncyBub3QgdXNlZC4KLQlGaXhlZCB1cCBwc2V1ZG8tb3AgZnVuY3Rpb25zIHRvIHRha2UgYW4gaWdub3JlZCBpbnQgYXJndW1lbnQuCi0JKHNpemVfc2VjdGlvbik6IEFkZGVkIGRlZmF1bHQgQkFEX0NBU0UgdG8gc3dpdGNoLgotCUNoYW5nZWQgYnplcm8gY2FsbHMgdG8gbWVtc2V0LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKFNfSVNfTE9DQUwpOiBDYWxsIHN0cmNociBvbiBTX0dFVF9OQU1FCi0JKHMpLCBub3Qgb24gcyBpdHNlbGYuCi0JKiBjb25maWcvdGMtYTI5ay5jIChzX3VzZSk6IFRha2UgaWdub3JlZCBpbnQgYXJndW1lbnQuICBPbmx5Ci0JZGVmaW5lIGlmIE9CSl9DT0ZGIGlzIG5vdCBkZWZpbmVkLgotCSogY29uZmlnL3RjLWkzODYuYzogKGZpdHNfaW5fc2lnbmVkX2J5dGUsIHNtYWxsZXN0X2ltbV90eXBlKTogTWFrZQotCWFyZ3VtZW50IHNpZ25lZCBhZ2Fpbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfYnNzLCBzX2V2ZW4sIHNfcHJvYyk6IFRha2UgaWdub3JlZCBpbnQKLQlhcmd1bWVudC4KLQkobTY4a19pcCk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6YXRpb24gb2YgYXJjaHMuCi0JQ29ycmVjdCBzZXZlcmFsIGZvcm1hdHMgZm9yIF9fTElORV9fIHRvIGJlICVkIHJhdGhlciB0aGFuICVzLgotCShpbml0X3RhYmxlKTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXphdGlvbi4KLQlDYXN0IHZhbHVlcyBsYXJnZXIgdGhhbiAweDdmIGFzc2lnbmVkIHRvIGZyX29wY29kZSB0byBjaGFyLgotCi0JKiBzdWJzZWdzLmM6IFJlbmFtZWQgbm9uLUJGRF9BU1NFTUJMRVIgc3Vic2VnX25ldyB0byBzdWJzZWdfc2V0LgotCVdyb3RlIG5vbi1CRkRfQVNTRU1CTEVSIHN1YnNlZ19uZXcuICBOb3cgc3Vic2VnX25ldyBhbHdheXMgdGFrZXMgYQotCXNlY3Rpb24gbmFtZSwgYW5kIHN1YnNlZ19zZXQgYWx3YXlzIHRha2VzIGEgc2VnVC4gIENoYW5nZWQgYWxsCi0JY2FsbGVycyBhcyBhcHByb3ByaWF0ZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jICAoY2hhbmdlX3RvX3NlY3Rpb24pOiBSZW5hbWVkIHRvCi0Jb2JqX2NvZmZfYWRkX3NlZ21lbnQuICBDb3JyZWN0ZWQuICBNYWRlIGNhbGxlcnMgdXNlIHN1YnNlZ19uZXcuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAob2JqX3NlZ21lbnRfbmFtZSwgb2JqX2FkZF9zZWdtZW50KToKLQlEZWZpbmUuCi0KLU1vbiBTZXAgMTMgMTM6MTU6MDMgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmggKExPQ0FMX0xBQkVMKTogUmVtb3ZlIHRlc3QgZm9yIG5hbWVbMF0gPT0gJ0wnLgotCi1GcmkgU2VwIDEwIDExOjIyOjA4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAoU19TRVRfU0laRSk6IEFjdHVhbGx5IHNldCB0aGUgc2l6ZS4KLQotCUdjYyBsaW50LgotCSogQWRkZWQgYSBudW1iZXIgb2YgY2FzdHMgdG8gZnVuY3Rpb24gY2FsbHMuCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pLCBhcy5jIChtYWluKSwgZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50LAotCW9wZXJhbmQsIGV4cHIpLCByZWFkLmMgKHJlYWRfYmVnaW4sIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSwKLQlyZWFkX2Ffc291cmNlX2ZpbGUsIHNfYWxpZ25fYnl0ZXMsIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUsCi0JaWdub3JlX3Jlc3Rfb2ZfbGluZSwgYmlnX2NvbnMsIGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQsIHNfaWdub3JlKSwKLQlyZWFkLmggKGlzX25hbWVfYmVnaW5uZXIsIGlzX3BhcnRfb2ZfbmFtZSksIGNvbmZpZy9vYmotZWxmLmMKLQkob2JqX2VsZl9zZWN0aW9uKSwgY29uZmlnL3RjLWkzODYuYyAocGFyc2VfcmVnaXN0ZXIpLAotCWNvbmZpZy90Yy1zcGFyYy5jIChpc29jdGFsLCBzX3Byb2MpOiBDYXN0IGNoYXIKLQlhcnJheSBpbmRpY2VzIHRvIHVuc2lnbmVkIGNoYXIuCi0JKiBhcHAuYyAocHJvY2Vzc19lc2NhcGUpOiBNYWtlIHN0YXRpYy4gIEFkZCBwcm90b3R5cGUuICBDaGFuZ2UKLQlhcmd1bWVudCBmcm9tIGNoYXIgdG8gaW50LgotCSogYXMuYzogSW5jbHVkZSBvdXRwdXQtZmlsZS5oIGZvciBwcm90b3R5cGVzLiAgQ29tbWVudCBvdXQgdW51c2VkCi0JZnVuY3Rpb24gZ290X3NpZy4KLQkqIE1ha2VmaWxlLmluIChhcy5vKTogRGVwZW5kIG9uIG91dHB1dC1maWxlLmguCi0JKiBhcy5oIChCQURfQ0FTRSk6IENhc3QgdmFsIGFyZ3VtZW50IHRvIGxvbmcsIGFuZCB1c2UgJWxkLgotCShwc2V1ZG9fdHlwZVMpOiBBZGQgcHJvdG90eXBlIHRvIHBvY19oYW5kbGVyIGZpZWxkLgotCShwcmludF92ZXJzaW9uX2lkKTogQWRkIHByb3RvdHlwZS4KLQkoeG1hbGxvYywgeHJlYWxsb2MpOiBDaGFuZ2Ugc2l6ZSBhcmd1bWVudHMgdG8gdW5zaWduZWQgbG9uZy4KLQkoZG9fc2NydWJfbmV4dF9jaGFyKTogQWRkIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cy4KLQkoaGFkX2Vycm9ycywgaGFkX3dhcm5pbmdzLCBzY3J1Yl9mcm9tX2ZpbGUpOiBSZW1vdmUgZHVwbGljYXRlCi0JZGVjbGFyYXRpb25zLgotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IE1ha2Ugc2l6ZSB2YXJpYWJsZXMgdW5zaWduZWQuCi0JKiBjb25kLmMgKGlnbm9yZV9pbnB1dCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIHZhcmlhYmxlIHB0ci4KLQkqIGV4cHIuYyAoZmxvYXRpbmdfY29uc3RhbnQsIGludGVnZXJfY29uc3RhbnQpOiBNYWtlIHN0YXRpYy4gIEFkZAotCXByb3RvdHlwZXMuCi0JKiBmbG9udW0tY29weS5jIChmbG9udW1fY29weSk6IE1ha2Ugc2l6ZSB2YXJpYWJsZXMgdW5zaWduZWQuCi0JKiBmcmFncy5oOiBBZGQgcHJvdG90eXBlIGZvciBmcmFnX2luaXQuCi0JKiBoYXNoLmgsIGhhc2guYzogQ2hhbmdlIGhhc2ggdmFsdWVzIGZyb20gY2hhciAqIHRvIFBUUiwgbWFrZSBoYXNoCi0Jc3RyaW5ncyBjb25zdCwgbWFrZSByZXR1cm5lZCBlcnJvciBzdHJpbmdzIGNvbnN0IGNoYXIgKi4gIEFkZGVkCi0JcHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zLgotCSogaW5wdXQtZmlsZS5oLCBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfYnVmZmVyX3NpemUpOiBSZXR1cm4KLQl1bnNpZ25lZCBpbnQuCi0JKiBpbnB1dC1zY3J1Yi5jIChidWZmZXJfbGVuZ3RoKTogTWFrZSB1bnNpZ25lZC4KLQkoaW5wdXRfc2NydWJfcHVzaCwgaW5wdXRfc2NydWJfcG9wKTogTWFrZSBzdGF0aWMuCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogQ2FzdCBzcHJpbnRmIGFyZ3VtZW50IHRvIHVuc2lnbmVkCi0JbG9uZyBhbmQgdXNlICVseC4gIFByaW50IG5hbWUgb2Ygc2VnbWVudCByYXRoZXIgdGhhbiBhZGRyZXNzIG9mCi0Jc3RydWN0dXJlLgotCShsaXN0aW5nX2xpc3QsIGxpc3RpbmdfdGl0bGUpOiBDaGFuZ2UgYXJndW1lbnQgdG8gaW50LgotCShsaXN0aW5nX2VqZWN0LCBsaXN0aW5nX2ZsYWdzLCBsaXN0aW5nX3BzaXplKTogQWRkIGludCBhcmd1bWVudC4KLQkqIGxpc3RpbmcuaDogQ29ycmVzcG9uZGluZyBkZWNsYXJhdGlvbiBjaGFuZ2VzLgotCSogb2JqLmggKG9ial9lbWl0X3N5bWJvbHMpOiBSZW5hbWUgcHJvdG90eXBlIGFyZ3VtZW50IHRvIGF2b2lkCi0Jc2hhZG93aW5nLgotCSogcmVhZC5oOiBDaGFuZ2UgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gcHJvdG90eXBlIHRvIHJldHVybgotCW9mZnNldFQuICBBZGQgcHJvdG90eXBlIGZvciBuZXh0X2NoYXJfb2Zfc3RyaW5nLiAgVmFyaW91cwotCXByb3RvdHlwZSBjaGFuZ2VzLgotCSogcmVhZC5jOiBSZW1vdmUgcHJvdG90eXBlIGZvciBuZXh0X2NoYXJfb2Zfc3RyaW5nLgotCShwb2JlZ2luKTogTWFrZSBlcnJ0eHQgY29uc3QuICBNYWtlIG5ld19sZW5ndGgsIHRtcF9sZW4gYW5kIG51bQotCXVuc2lnbmVkLgotCShzX2Fib3J0LCBzX2FsaWduX3B0d28sIHNfY29tbSwgc19kYXRhLCBzX2FwcF9saW5lLCBzX2ZpbGwsCi0Jc19nbG9ibCwgc19sc3ltLCBzX29yZywgc19zZXQsIHNfdGV4dCwgc19kZXNjKTogQWRkIGludCBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKHNfY29tbSk6IENoYW5nZSB0ZW1wIGZyb20gdmFsdWVUIHRvIG9mZnNldFQuICBDYXN0IHRvIGxvbmcgd2hlbgotCXByaW50aW5nIGFuZCB1c2UgJWxkIChvbmx5IGZvciBlcnJvciBtZXNzYWdlcyBhbnlob3cpLgotCShzX2xvbmcsIHNfaW50KTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbnMuCi0JKGNvbnMpOiBDaGFuZ2UgYXJndW1lbnQgdG8gaW50LgotCShlbWl0X2V4cHIpOiBVc2UgJWx4IHdoZW4gcHJpbnRpbmcgbG9uZ3MuCi0JKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uKTogUmV0dXJuIG9mZnNldFQsIG5vdCBsb25nLgotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogQ29tbWVudCBvdXQgdW5sZXNzCi0JU0VQQVJBVEVfU1RBQl9TRUNUSU9OUy4KLQkoc19zdGFiX2dlbmVyaWMpOiBSZW1vdmUgdW51c2VkIG9mZnNldC4gIERlZmluZSBzZWdfaXNfbmV3IG9ubHkKLQlpZiBTRVBBUkFURV9TVEFCX1NFQ1RJT05TLiAgVXNlIHRvUCBvbmx5IGluIGxvY2FsIGJsb2NrLgotCSogc3RydWMtc3ltYm9sLmggKHZlcmlmeV9zeW1ib2xfY2hhaW5fMik6IEFkZCBwcm90b3R5cGUuCi0JKiBzeW1ib2xzLmM6IFJlbW92ZSBuZXN0ZWQgY29tbWVudC4KLQkoc3ltYm9sX25ldyk6IFJlbmFtZSB2YWx1ZSB0byB2YWx1LgotCShjb2xvbik6IFVzZSAlbGQgYW5kIGNhc3QgdG8gbG9uZyBpbiBlcnJvciBtZXNzYWdlLgotCSogc3ltYm9scy5oOiBSZW1vdmUgZHVwbGljYXRlIHZlcmlmeV9zeW1ib2xfY2hhaW4gZGVjbGFyYXRpb24uCi0JKiB0Yy5oOiBSZW1vdmUgdW51c2VkIG1kX2VtaXRfcmVsb2NhdGlvbnMgZGVjbGFyYXRpb24uCi0JKHRjX2dlbl9yZWxvYyk6IEFkZCBkZWNsYXJhdGlvbi4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBDaGFuZ2UgZmlyc3QgYXJndW1lbnQgbmFtZSBkZXBlbmRpbmcKLQlvbiBCRkRfQVNTRU1CTEVSLgotCSh3cml0ZV9yZWxvY3MpOiBSZW1vdmUgdW51c2VkIG9mZnNldCwgZnJhZ3MuICBSZW1vdmUgdGNfZ2VuX3JlbG9jCi0JZGVjbGFyYXRpb25zLiAgTWFrZSBuIHVuc2lnbmVkLgotCSh3cml0ZV9jb250ZW50cyk6IFJlbW92ZSB1bnVzZWQgaSwgbiwgcmVsb2NzLCBmaXhwLiAgUmVuYW1lIGZyYWdzCi0JdG8gZiB0byBhdm9pZCBzaGFkb3dpbmcuCi0JKHdyaXRlX29iamVjdF9maWxlKTogRGVmaW5lIGZyYWdQIG9ubHkgaWYgbm90IEJGRF9BU1NFTUJMRVIgb3Igbm90Ci0JV09SS0lOR19ET1RfV09SRC4gIFJlbW92ZSB1bnVzZWQga2VlcC4gIE9ubHkgZGVjbGFyZSBwdW50IGFuZAotCXB1bnRfaXQgaWYgdGhleSB3aWxsIGJlIHVzZWQuICBNYWtlIGkgYW5kIG4gdW5zaWduZWQuCi0JKGZpeHVwX3NlZ21lbnQpOiBDYXN0IHRvIGxvbmcgYW5kIHVzZSAlbGQgaW4gZXJyb3IgbWVzc2FnZS4KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBNYWtlIHNpemUgYXJndW1lbnQgdW5zaWduZWQuCi0JKiBjb25maWcvb2JqLWFvdXQuaDogUmVtb3ZlIG5lc3RlZCBjb21tZW50LiAgQWRkIHByb3RvdHlwZSBmb3IKLQlvYmpfYW91dF9mcm9iX3N5bWJvbC4KLQkob2JqX2FvdXRfbGluZSwgb2JqX2FvdXRfZGVzYyk6IEFkZCBpbnQgYXJndW1lbnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IENoYW5nZWQgYnVpbGQgcm91dGluZXMgdG8gdXNlIGFuIHVuc2lnbmVkCi0Jb2Zmc2V0LgotCShhZGRfc3RyaW5nKTogTWFrZSBsZW4gdW5zaWduZWQgbG9uZy4KLQkob2JqX2Vjb2ZmX3N0YWIpOiBVc2UgJWx1IGluIGVycm9yIG1lc3NhZ2UuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IENvbW1lbnQgb3V0IHVudXNlZCBsYWJlbAotCWFsbG9jYXRlX2Jzcy4KLQkob2JqX2VsZl9mcm9iX3N5bWJvbCk6IFJldHVybiAwIChjdXJyZW50bHkgYnJva2VuKS4KLQkob2JqX2VsZl9kZXNjLCBvYmpfZWxmX3ZlcnNpb24sIG9ial9lbGZfc2l6ZSwgb2JqX2VsZl90eXBlLAotCW9ial9lbGZfaWRlbnQsIG9ial9lbGZfd2Vhaywgb2JqX2VsZl9sb2NhbCwgb2JqX2VsZl9jb21tb24sCi0Jb2JqX2VsZl9saW5lLCBvYmpfZWxmX3ByZXZpb3VzKTogQWRkIGludCBhcmd1bWVudC4KLQkob2JqX2VsZl93cml0ZV9zeW1ib2xfcCk6IE1ha2Ugc3RhdGljLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl93cml0ZV9zeW1ib2wpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLWhwcGEuaDogUmVtb3ZlIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgZGVjbGFyZWQgaW4KLQlyZWFkLmguCi0JKiBjb25maWcvdGMtaTM4Ni5jIChFTkNPREVfUkVMQVhfU1RBVEUpOiBDYXN0IHRvIHJlbGF4X3N1YnN0YXRlVC4KLQkoc19ic3MpOiBBZGQgaW50IGFyZ3VtZW50LgotCShmaXRzX2luX3NpZ25lZF9ieXRlLCBzbWFsbGVzdF9pbW1fdHlwZSk6IE1ha2UgYXJndW1lbnQgdW5zaWduZWQuCi0JKGR1bW15KTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBSZW5hbWUgbG9jYWwgbyB0byBvcCB0byBhdm9pZCBzaGFkb3dpbmcuCi0JKHRjX2dlbl9yZWxvYyk6IFJlbmFtZSBsb2NhbCByZWxvYyB0byByZWwgdG8gYXZvaWQgc2hhZG93aW5nLgotCSogY29uZmlnL3RjLW02OGsuYyAoc19kYXRhMSwgc19kYXRhMik6IEFkZCBpbnQgYXJndW1lbnQuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLCBtZF9hcHBseV9maXgpOiBDYXN0IHRvIGxvbmcgYW5kIHVzZQotCSVsZCBpbiBlcnJvciBtZXNzYWdlcy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBSZW1vdmUgZHVwbGljYXRlIGRlY2xhcmF0aW9ucy4KLQkoZ2V0RXhwcmVzc2lvbik6IFJld3JpdGUgY29uZGl0aW9uIHRvIGF2b2lkIGVtcHR5IGNvbmRpdGlvbmFsCi0JYm9keS4KLQkoc19yZWcsIHNfcHJvYywgc19yZXNlcnZlLCBzX2NvbW1vbiwgc19zZWcsIHNfeHdvcmQpOiBBZGQgaW50Ci0JYXJndW1lbnQuCi0KLVRodSBTZXAgIDkgMTc6MTA6MDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3OgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hc3NlbWJsZSk6IEZpeCB0eXBvLgotCShwYV9pcCk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGVzIGFuZCBsYWJlbHMuICBEbyBub3QgY2hlY2sgZm9yCi0JdW5zaWduZWQgdmFsdWVzIGJlaW5nIDwgMCwgaXQgY2FuJ3QgaGFwcGVuLgotCShpc19zYW1lX2ZyYWcpOiBSZXR1cm4gYSB2YWx1ZSBpbiByZWN1cnNpdmUgY2FsbCBjYXNlLgotCShwYV9jYWxsaW5mbyk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGVzIGFuZCBsYWJlbHMuCi0JKHBhX2NvbW0pOiBMaWtld2lzZS4KLQkocGFfY29weXJpZ2h0KTogTGlrZXdpc2UuCi0JKHBhX2V4cG9ydCk6IExpa2V3aXNlLgotCShwYV9pbXBvcnQpOiBMaWtld2lzZS4KLQkocGFfcGFyYW0pOiBMaWtld2lzZS4KLQkocGFfc3BhY2UpOiBMaWtld2lzZS4KLQkocGFfc3Vic3BhY2UpOiBMaWtld2lzZS4KLQotVGh1IFNlcCAgOSAxNTowNTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCwgc19zdGFiX2dlbmVyaWMpOiBJZgotCUJGRF9BU1NFTUJMRVIsIGNhbGwgc3Vic2VnX3NldCByYXRoZXIgdGhhbiBzdWJzZWdfbmV3LgotCi1XZWQgU2VwICA4IDE1OjA5OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogU2V0IFNFQ19MT0FEIHdoZW4gdXNpbmcKLQlkZWZhdWx0IGZsYWcgdmFsdWVzLgotCi1UdWUgU2VwICA3IDEwOjIyOjUyIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiAoY2hhbmdlX3RvX3NlY3Rpb24pOiBEb24ndCBpbmNsdWRlIGJvZHkgaWYgbm90IE1BTllfU0VDVElPTlMuCi0KLQkqIHJlYWQuYzogKHNfc3RhYiwgc194c3RhYiwgc19kZXNjKTogTmV3IGZ1bmN0aW9ucyB0byBwYXJzZQotCXZhcmlvdXMgc3RhYi1yZWxhdGVkIGRpcmVjdGl2ZXMuCi0JKiByZWFkLmg6IChzX3N0YWIsIHNfeHN0YWIsIHNfZGVzYyk6IE5ldyBmdW5jdGlvbiBwcm90b3R5cGVzLgotCSogd3JpdGUuYzogKG1lcmdlX2RhdGFfaW50b190ZXh0KTogRml4IGlmZGVmIHRhbmdsZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChjdXJyZW50X3N0YWJfc3ltYm9sKTogRmFrZSBzeW1ib2wKLQlmb3Igc3RhYiByZWFkZXIgdG8gdXNlLgotCSogY29uZmlnL29iai1jb2ZmYmZkaC5oIChvYmpfc3ltYm9sX3R5cGUpOiBBZGRlZCBmaWVsZHMgZm9yCi0Jc3RhYiByZWFkZXIsIG1hY3JvcyB0byBhY2Nlc3MuCi0KLUZyaSBTZXAgIDMgMTY6NDQ6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfc3ltYm9sKTogTm8gbG9uZ2VyIHNwZWNpYWwtY2FzZWQgb24KLQlzcGFyY3Y5LCBzaW5jZSBlbGZfc3ltYm9sX3R5cGUgaXMgbm93IGluZGVwZW5kZW50IG9mIHNpemUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9zeW1ib2wpOiBGaXhlZCBuYW1lIG9mIGVsZl9zeW1ib2xfdHlwZS4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoc3RydWN0IGRlZmF1bHRfc3Vic3BhY2VfZGljdCwgc3RydWN0Ci0JZGVmYXVsdF9zcGFjZV9kaWN0KTogRmllbGQgInNvcnQiIGlzIG5vdyB1bnNpZ25lZCBjaGFyLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9kZWZfc3Vic3BhY2VzLCBwYV9kZWZfc3BhY2VzKTogQWxpZ24KLQljb2x1bW5zIGZvciBlYXNpZXIgcmVhZGluZy4KLQkoYmNtcCwgaW5kZXgpOiBEZWxldGVkIFVTRy1zcGVjaWZpYyBkZWZpbml0aW9ucy4gIFNob3VsZCBiZSBkZWFsdAotCXdpdGggaW4gaG8tKi5oLCBvciBpbiBsaWJpYmVydHkuICBDaGFuZ2VkIG1lbnRpb24gb2YgaW5kZXggdG8KLQlzdHJjaHIuCi0JKGxhYmVsX3N5bWJvbFAsIGxhYmVsX3N5bWJvbF9kZWZpbmVkLCBjYWxsaW5mb19mb3VuZCwKLQl3aXRoaW5fZW50cnlfZXhpdCwgZXhpdF9wcm9jZXNzaW5nX2NvbXBsZXRlLCB3aXRoaW5fcHJvY2VkdXJlLAotCXBhX2RlZl9zdWJzcGFjZXMsIHBhX2RlZl9zcGFjZXMsIHBhX3BzZXVkb19vcF9tb3Zlc19wYywKLQlsYWJlbF9zeW1ib2xzX3Jvb3RQLCBwYV9nZXRfbGFiZWwsIHBhX2xhYmVsX2lzX2RlZmluZWQsCi0JcGFfdW5kZWZpbmVfbGFiZWwpOiBOb3cgc3RhdGljLgotCShtb3ZlcnMpOiBOb3cgY29uc3QsIGluIGFkZGl0aW9uIHRvIHBvaW50aW5nIHRvIGNvbnN0IGRhdGEuCi0JKiBjb25maWcvdGMtaHBwYS5oIChsYWJlbF9zeW1ib2xTX3Jvb3RQLCBwYV9nZXRfbGFiZWwsCi0JcGFfbGFiZWxfaXNfZGVmaW5lZCwgcGFfdW5kZWZpbmVfbGFiZWwsIHBhX3BzZXVkb19vcF9tb3Zlc19wYyk6Ci0JRGVsZXRlIGRlY2xhcmF0aW9ucy4KLQotCU1lcmdlZCBtb3JlIGNoYW5nZXMgZnJvbSBKZWZmIExhdyBhbmQgUGV0ZSBIb29nZW5ib29tOgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9kZWZfc3Vic3BhY2VzLCBwYV9kZWZfc3Vic3BhY2VzKTogUmVtb3ZlCi0JZW50cmllcyBmb3IgLnN0YWIgYW5kIC5zdGFic3RyLgotCi0JKiBjb25maWcvb2JqLWVsZi5jOiAoZWxmX3N0YWJfc3ltYm9sX3N0cmluZyk6ICBTZXQgdGhlCi0JU0VDX0xPQUQgYXR0cmlidXRlIGZvciB0aGUgLnN0YWJzdHIgc2VjdGlvbi4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiAgU2V0IHRoZSBTRUNfTE9BRCBhdHRyaWJ1dGUgZm9yIHRoZQotCS5zdGFiIHNlY3Rpb24uCi0JKG9ial9lbGZfc3RhYl9nZW5lcmljKTogIENoYW5nZSAnI2lmIDEnIHRvICcjaWYgMCcuCi0JKG9ial9lbGZfc3RhYl9nZW5lcmljKTogIEluY29ycmVjdCBieXRlIGNvdW50IG9uIGNhbGwgdG8KLQltZF9udW1iZXJfdG9fY2hhcnMgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfc3ltYm9sKTogU3RhdGljIGZ1bmN0aW9ucyBuZWVkCi0JYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIHRvby4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3RyaW5nZXIpOiBDb3JyZWN0bHkgaGFuZGxlIGVzY2FwaW5nCi0JY2hhcmFjdGVycyB3aGljaCBzaG91bGQgYXBwZWFyIHVuYWx0ZXJlZCBpbiB0aGUgb3V0cHV0IHN0cmluZyAoZm9yCi0JZXhhbXBsZSBhbiBlc2NhcGVkIGRvdWJsZS1xdW90ZSkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyKTogQWx3YXlzCi0JaW5pdGlhbGl6ZSBuYW1lLgotCShwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0cik6IExpa2V3aXNlLgotCShwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0cik6IExpa2V3aXNlLgotCShwYV9wYXJzZV9uZWdfYWRkX2NtcGx0cik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSk6IFJlbW92ZSBwcm90b3R5cGUKLQlmb3Igbm93LgotCShjb25zX2ZpeF9uZXdfaHBwYSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRml4IHR5cGUgb2YgdmFscCB0byBtYXRjaAotCXByb3RvdHlwZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogSW5jbHVkZSBsaWJocHBhLmguCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IERlbGV0ZSBleHRlcm4gZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucwotCWZvdW5kIGluIGxpYmhwcGEuaC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3BhY2UpOiBSZXdvcmsgdG8gYXZvaWQgdW53YW50ZWQgI2lmZGVmCi0JT0JKX0VMRiBjb25kaXRpb25hbHMuCi0JKiBjb25maWcvdGMtaHBwYS5oIChMT0NBTF9MQUJFTCk6IENvcnJlY3RseSBpZGVudGlmeSBsb2NhbCBsYWJlbHMKLQlvbiB0aGUgUEEuCi0KLVRodSBTZXAgIDIgMTA6NDM6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IEFjY2VwdCAneicsIGFuZCBpZ25vcmUgaXQuCi0JKG1hY3JvKTogVXNlICJ6LHMsdCIgZm9yIGRpdiBpbnN0cnVjdGlvbnMgdG8gbWF0Y2ggY29ycmVzcG9uZGluZwotCWNoYW5nZSBpbiBvcGNvZGUgdGFibGUuCi0JKG1pcHNfaXApOiBBZGRlZCAneictLW11c3QgYmUgemVybyByZWdpc3Rlci4KLQotV2VkIFNlcCAgMSAxNTo1Njo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcykgW1JFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRV06IERlY2xhcmUKLQl0Y19nZW5fcmVsb2MgY29ycmVjdGx5LgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAiY2FzZSIgaW5zdGVhZCBvZiAiaWYiIHdoZW4gcG9zc2libGUuICBSZXdyb3RlCi0JTWFrZWZpbGUgZWRpdGluZyB0byByZWR1Y2Ugd29yayBkb25lLiAgVHJlYXQgImhwcGEqIiBhcyAiaHBwYSIuCi0KLVdlZCBTZXAgIDEgMTI6MTk6MDcgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfc2VjdGlvbik6IGFkZCAnZCcgYXMgYW4gYWxpYXMgZm9yCi0JICBzZWN0aW9uIHR5cGUgb2YgZGF0YS4gICdkJyBzZWVtcyB0byBiZSB1c2VkIGZvciBtODhrLgotCi1XZWQgQXVnIDI1IDIyOjMzOjIyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19hbGlnbiwgc19zdHJpbmdlciwgc19jb25zLCBzX2Zsb2F0X2NvbnMsCi0Jc19taXBzX3NwYWNlKTogU2V0IGluc25fbGFiZWwgdG8gTlVMTCB0byBhdm9pZCBjaGFuZ2luZyBpdCBhdCB0aGUKLQluZXh0IC5hbGlnbiBzdGF0ZW1lbnQuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBqYWwgd2l0aCBpbnN0cnVjdGlvbiB0aGF0IHNldHMgdGhlCi0JcmVnaXN0ZXIgdGhhdCBqYWwgc2V0cy4KLQotV2VkIEF1ZyAyNSAxNjoxNTo1NyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG04ODExMC4KLQotV2VkIEF1ZyAyNSAxMzozNzo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIFBldGUgSG9vZ2VuYm9vbSBhbmQgSmVmZiBMYXcgYXQgVXRhaDoKLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFNFQ19BTExPQyBzaG91bGQKLQlub3QgYmUgb24gZm9yIC5ocHBhX3Vud2luZC4KLQkobWRfcHNldWRvX3RhYmxlKTogLlBBUkFNIGFuZCAucGFyYW0gYXJlIHZhbGlkIHBzZXVkby1vcHMgZm9yIEdBUy4KLQkocGFfcGFyYW0pOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIC5QQVJBTSBkaXJlY3RpdmVzLgotCShwYV9pcCk6IFBhc3MgImlzYnJhbmNoIiBhcmd1bWVudCBkb3duIHRvIHBhX3BhcnNlXypfY29tcGx0cgotCWZ1bmN0aW9ucy4gIEhhbmRsZSAnfCcgZm9yIG1vdmI7IGFsbG93IG1vdmIsbi4KLQkocGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIpOiBEZWxldGUgb2xkIHVzZWxlc3MKLQl2ZXJzaW9uLiAgSGFuZGxlIGNhc2VzIHdoZXJlIG5vIGNvbXBsZXRlciBleGlzdHMgZm9yCi0JY29tYixuIG9yIGFkZGIsbi4KLQkocGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIpOiBIYW5kbGUgY2FzZXMgd2hlcmUgbm8KLQljb21wbGV0ZXIgZXhpc3RzIGZvciBjb21iLG4gb3IgYWRkYixuLiAgTWFrZSBsb2dpYwotCW1pcnJvciB0aGF0IG9mIHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyLgotCShwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0cik6IExpa2V3aXNlLgotCShwYV9wYXJzZV9uZWdfYWRkX2NtcGx0cik6IExpa2V3aXNlLgotCSogdGMtaHBwYS5oIChwYV9wYXJhbSk6IERlY2xhcmUuCi0KLVR1ZSBBdWcgMjQgMTU6NDE6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX21ha2Vfc3ltZXh0bl9zZWN0aW9uKTogTm93IHN0YXRpYy4KLQlBZGRlZCBmb3J3YXJkIGRlY2xhcmF0aW9uLgotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBQZXRlIEhvb2dlbmJvb20gYW5kIEplZmYgTGF3IGF0IFV0YWg6Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBBcmd1bWVudHMgd2VyZSBpbmNvcnJlY3Qgb24KLQljYWxsIHRvIGVsZl90Y19tYWtlX3NlY3Rpb25zLgotCShvYmpfZWxmX3ZlcnNpb24pOiBBIC5ub3RlIHNlY3Rpb24gc2hvdWxkbid0IGhhdmUgdGhlIFNFQ19BTExPQwotCWF0dHJpYnV0ZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogQWRkIHNvbWUgcHJvY2Vzc2luZyB0bwotCWhhbmRsZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF9zeW1leHRuX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8KLQljcmVhdGUgYSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uCi0JKHBhX2V4cG9ydF9hcmdzKTogTWFrZSBjYWxsIHRvIHBhX2J1aWxkX3N5bWV4dG5fc2VjdGlvbi4KLQkoaHBwYV90Y19zeW1ib2wsIGhwcGFfdGNfbWFrZV9zZWN0aW9ucywKLQlocHBhX3RjX21ha2Vfc3ltZXh0bl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFVwZGF0ZSBlbGZfdGNfc3ltYm9sIGFuZCBlbGZfdGNfbWFrZV9zZWN0aW9ucwotCW1hY3Jvcy4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBQbGFjZSBjaGVjayBmb3IgVENfQ09OU19GSVhfTkVXIGluIHRoZQotCUJGRF9BU1NFTUJMRVIgYnJhbmNoIGFzIHdlbGwuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IElmIEVMRiBpcyB0aGUgdGFyZ2V0IG9iamVjdCBmb3JtYXQsIGRlZmluZQotCXNvbWUgRUxGLSBhbmQgaHBwYS1zcGVjaWZpYyB0eXBlcyBhbmQgY29uc3RhbnRzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChnZXRFeHByZXNzaW9uKTogRml4IGEgdHlwby4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBVc2UgVENfRVFVQUxfSU5fSU5TTiB0byBkZXRlcm1pbmUKLQlpZiBhIGA9JyBpcyBwYXJ0IG9mIGFuIGluc3RydWN0aW9uLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBIYW5kbGUgY2FzZSB3aGVyZSBlbmQtb2YtbGluZSBtYXJrZXJzIGFyZQotCWFsc28gdXNlZCB3aXRoaW4gaW5zdHJ1Y3Rpb25zLgotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfRVFVQUxfSU5fSU5TTiwgVENfRU9MX0lOX0lOU04pOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeF8xKTogS2VlcCByZWxvY2F0aW9ucyBmb3IKLQlvdXQtb2YtcmFuZ2UgYnJhbmNoZXMvJ2NhbGxzIHVzaW5nICJibCIgb3IgY2FsbHMgd2hpY2ggbWF5IG5lZWQKLQlhcmd1bWVudCByZWxvY2F0aW9uIHN0dWJzLiAgRG8gbm90IG5lZWQva2VlcCByZWxvY2F0aW9ucyBmb3IKLQljb25kaXRpb25hbCBicmFuY2hlcy4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IEZpeCBjYWxjdWxhdGlvbiBvZiBmdW5jdGlvbiBzaXplLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3ZlcnNpb24pOiBNYXJrIC5ub3RlIHNlY3Rpb24gYXMKLQlSRUFET05MWS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEpOiBQYXNzIGV4cCwgbm90IHRoZQotCWFkZHJlc3Mgb2YgZXhwLCB0byBleHByZXNzaW9uLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBUdXJuIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBvbi4KLQkobWRfYXBwbHlfZml4XzEpOiBEZWxldGUgdW53YW50ZWQgY29tbWVudHMuCi0JKHByb2Nlc3NfZXhpdCk6IFN5bWJvbHMgbWFya2luZyB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gYXJlIGFsd2F5cwotCUJTRl9MT0NBTC4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogSW5jbHVkZSBlbGYzMi1ocHBhLmggZnJvbSBCRkQgdHJlZS4KLQkocGFfc3BhY2UpOiBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGdkYl9zZWN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogQ2hhbmdlCi0JZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vayB0byBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogRml4IGFyZ3VtZW50IGxpc3QgdG8gbWF0Y2gKLQlhcmd1bWVudCB0eXBlIGRlY2xhcmF0aW9ucy4KLQkoZ2V0RXhwcmVzc2lvbik6IEZpeCB0eXBvLgotCShwYV9leHBvcnRfYXJncyk6IENoYW5nZSBlbGZfc3ltYm9sX3R5cGUgdG8gZWxmMzJfc3ltYm9sX3R5cGUuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4gIE5hbWUgY2hhbmdlZCBmcm9tCi0JZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZ19ob29rLgotCShzdGFydF9zeW1ib2xfcm9vdCwgc3RhcnRfc3ltYm9sX2xhc3QpOiBEZWxldGVkLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04pOiBGaXggdHlwby4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogUmVwbGFjZSAic3ltYm9sUyIgd2l0aCAic3RydWN0IHN5bWJvbCIgdG8KLQlhdm9pZCBjaGFuZ2luZyBpbmNsdWRlIG9yZGVyaW5nLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAneScpOiBIYW5kbGUganVzdCBsaWtlICd0Jy4KLQotTW9uIEF1ZyAyMyAxMjo0Nzo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNldF9hdCk6IEFkZGVkIHVuc2lnbmVkcCBhcmd1bWVudC4gIFVzZQotCWxvYWRfcmVnaXN0ZXIuCi0JKHNldF9hdF91bnNpZ25lZCk6IFJlbW92ZWQ7IGNoYW5nZWQgY2FsbGVycyB0byB1c2Ugc2V0X2F0LgotCShsb2FkX3JlZ2lzdGVyKTogUmVtb3ZlZCB1bnVzZWQgaXAgYXJndW1lbnQuICBDaGFuZ2VkIGNhbGxlcnMuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBicmFuY2ggYW5kIGJyYW5jaCBsaWtlbHkuCi0JKG1hY3JvX2J1aWxkKTogSGFuZGxlICd1Jy4KLQkobG9hZF9yZWdpc3Rlcik6IEhhbmRsZSA2NCBiaXQgY29uc3RhbnRzLgotCShtYWNybyk6IEFkZGVkIE1fREFCUywgcmVtb3ZlZCBNX0FCU1UuICBOdW1lcm91cyBjaGFuZ2VzIHRvCi0Jc3VwcG9ydCA2NCBiaXQgY29uc3RhbnRzLgotCShtaXBzX2lwKTogVXNlIGhleCBjb25zdGFudHMgaW4gcmFuZ2UgY2hlY2tzIGZvciBjbGFyaXR5LgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBTdXBwb3J0IDggYnl0ZSB2YWx1ZXMuCi0KLUZyaSBBdWcgMjAgMTY6NTA6NTkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTg4ay5oOiB1cGRhdGVkIGNvcHlyaWdodHMuCi0JICAoVENfQ09OU19SRUxPQyk6IGRlY2xhcmUgdG8gYmUgUkVMT0NfMzIuCi0KLUZyaSBBdWcgMjAgMTE6MTY6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lzYSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSBtaXBzX2lzYSBiYXNlZCBvbiBUQVJHRVRfQ1BVLiAgRG9uJ3Qgc2FuaXR5Ci0JY2hlY2sgbWFjcm9zLiAgU2V0IHRleHQgYWxpZ25tZW50IGFuZCBHUCBzaXplIGhlcmUuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3Qgc2V0IHRleHQgYWxpZ25tZW50IGFuZCBHUCBzaXplIGhlcmUuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3QgaW5zZXJ0IE5PUHMgZm9yIGxvYWQgZGVsYXlzIGlmIG1pcHNfaXNhID49IDIuCi0JVXNlIHRoZSByaWdodCBtYXNrIGFuZCBzaGlmdCBmb3IgV1JJVEVfRlBSX1QgYW5kIFdSSVRFX0ZQUl9TLiAgQWRkCi0JYSBOT1AgYWZ0ZXIgYSBicmFuY2ggbGlrZWx5LgotCShtaXBzX2VtaXRfZGVsYXlzKTogRG9uJ3QgaW5zZXJ0IE5PUFMgZm9yIGxvYWQgZGVsYXlzIGlmIG1pcHNfaXNhCi0JPj0gMi4KLQkobWFjcm8pOiBTdXBwb3J0IHI2MDAwIGFuZCByNDAwMCBtYWNyb3MuCi0JKG1pcHNfaXApOiBDaGVjayBpbnNuIElTQSBsZXZlbCBhZ2FpbnN0IG1pcHNfaXNhIGJlZm9yZSB1c2luZyBpdC4KLQlBZGRlZCAneCcgY2FzZSBmb3IgaWdub3JlZCByZWdpc3Rlci4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1taXBzTiBhbmQgLW1jcHU9WFguCi0KLUZyaSBBdWcgMjAgMDE6MjY6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wc2V1ZG9fdGFibGUpIFtPQkpfRUxGXTogSGFuZGxlICIuemVybyIuCi0KLVRodSBBdWcgMTkgMTI6MTU6MTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19sb2NhbCk6IEZ1bmN0aW9uIG1vdmVkIGFuZCByZW5hbWVkLi4uCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2xvY2FsKTogLi4udG8gaGVyZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpLCBjb25maWcvb2JqLWVsZi5jCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBNb3ZlIGhhbmRsaW5nIG9mICIubG9jYWwiLgotCi0JKiB0Yy5oIChtZF9wYXJzZV9vcHRpb24pOiBEb24ndCBkZWNsYXJlIGlmIGRlZmluZWQgYXMgYSBtYWNyby4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoTk9fUkVMT0MpIFtCRkRfQVNTRU1CTEVSXTogRGVmaW5lIGFzCi0JQkZEX1JFTE9DX05PTkUuCi0JKG1kX3BhcnNlX29wdGlvbik6IE5ldyBtYWNybywgY29udmVydGVkIGZyb20gZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wYXJzZV9vcHRpb24pOiBGdW5jdGlvbiBkZWxldGVkLgotCShjb21tZW50X2NoYXJzKSBbT0JKX0VMRl06IEluY2x1ZGUgIi8iLgotCShsaW5lX2NvbW1lbnRfY2hhcnMpIFtPQkpfRUxGIHx8IFRFX0kzODZBSVhdOiBEb24ndCBpbmNsdWRlICIvIi4KLQkobWRfYXNzZW1ibGUpOiBDYXN0IDB4ZTkgdG8gY2hhciBleHBsaWNpdGx5LCB0byBhdm9pZCBjb21waWxlcgotCXdhcm5pbmcuCi0JKG1kX2Fzc2VtYmxlLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfY3JlYXRlX2xvbmdfanVtcCk6Ci0JQ2FsbCByZWxvYyBmb3IgZml4X25ldyB0eXBlLCBvciB1c2UgY29ycmVjdCBlbnVtZXJhdG9yLCBpbnN0ZWFkIG9mCi0JYWx3YXlzIHVzaW5nIE5PX1JFTE9DLgotCShpMzg2X29wZXJhbmQpOiBDaGFuZ2UgImlmbmRlZiBJMzg2Q09GRiIgdG8gImlmZGVmIE9CSl9BT1VUIiBmb3IKLQl0ZXN0cyBmb3IgdmFsaWQgc2VjdGlvbi4KLQkobWRfY29udmVydF9mcmFnKSBbQkZEX0FTU0VNQkxFUl06IENvbXBlbnNhdGUgZm9yIGZyYWcgc3RhcnQKLQlhZGRyZXNzLgotCShtZF9hcHBseV9maXhfMSkgW0JGRF9BU1NFTUJMRVJdOiBGb3IgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aAotCXN5bWJvbCwgY29tcGVuc2F0ZSBmb3IgbG9jYXRpb24gb2YgcmVsb2MuCi0JKHJlbG9jLCBCRkRfUkVMT0NfMzIsIEJGRF9SRUxPQ18zMl9QQ1JFTCkgWyFCRkRfQVNTRU1CTEVSXTogRGVmaW5lCi0JdG8gcmV0dXJuIHplcm8uCi0KLVdlZCBBdWcgMTggMTY6NTE6MjkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jOiBVbmRlZiBOT19SRUxPQyBiZWZvcmUgaW5jbHVkaW5nIGFvdXQvYW91dDY0LmguCi0JKG9ial9lbGZfd2Vhayk6IE5ldyBmdW5jdGlvbi4KLQkob2JqX3BzZXVkb190YWJsZSk6IEhhbmRsZSAiLndlYWsiLgotCShvYmpfZWxmX3NlY3Rpb24pOiBJZiBzZWN0aW9uIGRpcmVjdGl2ZSBpbmNsdWRlcyBhIHN0cmluZywgaWdub3JlCi0JaXQgZm9yIG5vdy4gIEFjY2VwdCAicHJvZ2JpdHMiIGZsYWcuCi0JKG9ial9lbGZfdHlwZSk6IEFjY2VwdCBgQCcgYmVmb3JlIGZsYWcgbmFtZS4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKSBbQkZEX0FTU0VNQkxFUl06IEdldCByaWQgb2YgYGlmKDEpJwotCWNvbmRpdGlvbi4KLQkoZml4dXBfc2VnbWVudCkgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX2lzX2NvbV9zZWN0aW9uLCByYXRoZXIKLQl0aGFuIGNoZWNraW5nIGZvciBiZmRfY29tX3NlY3Rpb24gZGlyZWN0bHkuCi0JKGZpeHVwX3NlZ21lbnQpOiBTaW1wbGlmeSByYW5nZSBjaGVjay4KLQkoZml4dXBfc2VnbWVudCkgW09CSl9DT0ZGICYmIFRDX0k5NjBdOiBTaW1wbGlmeSBjcHAgY29uZGl0aW9uCi0JdGVzdC4KLQotCSogc3ltYm9scy5oIChTX1NFVF9XRUFLKTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoU19TRVRfV0VBSyk6IE5ldyBmdW5jdGlvbi4KLQkoU19TRVRfRVhURVJOQUwsIFNfQ0xFQVJfRVhURVJOQUwpOiBEb24ndCBib3RoZXIgd2l0aCBCU0ZfRVhQT1JULAotCWl0J3Mgbm90IGEgc2VwYXJhdGUgZmxhZyBhbnkgbW9yZS4gIENsZWFyIEJTRl9XRUFLLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBUcmVhdCAic3RyaW5nIiBsaWtlICJhc2NpeiIuCi0KLVdlZCBBdWcgMTggMTU6MzA6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgYnJhbmNoIGluc3RydWN0aW9ucwotCWlmIC5zZXQgbm9ib3B0IG9yIC5zZXQgdm9sYXRpbGUuCi0JKGdwX3JlZmVyZW5jZSk6IC5saXQ4IGFuZCAubGl0NCBhcmUgYWNjZXNzZWQgdmlhIHRoZSBHUCByZWdpc3Rlci4KLQkobWFjcm8pOiBBZGRlZCBjYXNlcyBNX0xJX1MsIE1fTElfU1MuICBGaXhlZCBNX0xJX0QgYW5kIE1fTElfREQuCi0JKG1pcHNfaXApOiBBZGRlZCBjYXNlcyAnRicsICdMJywgJ2YnLCAnbCcgZm9yIGZsb2F0aW5nIHBvaW50LgotCSogY29uZmlnL29iai1lY29mZi5jOiBSZW5hbWVkIHNvbWUgdmFyaWFibGVzIHRvIGF2b2lkIHNoYWRvdwotCXdhcm5pbmdzLgotCi1Nb24gQXVnIDE2IDE0OjE2OjAyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfQ09NTU9OKTogYWRkIG1pc3NpbmcgYmFja3NsYXNoCi0KLQkqIGNvbmZpZ3VyZS5pbiAoejhrLSote2NvZmYsc2ltfSk6IHVzZSBjb2ZmYmZkIGZvciB0aGlzIHRhcmdldAotCi1UaHUgQXVnIDEyIDExOjQ3OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFN1Z2dlc3RlZCBieQotCWRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6IERvbid0IGFjY2VwdCBzeW1ib2xpYwotCW5hbWVzIGZvciAnRScgYW5kICdHJyBhcmd1bWVudCB0eXBlcyAoY29wcm9jZXNzb3IgcmVnaXN0ZXJzKSBhbmQKLQlkb24ndCB3YXJuIGlmICQxIGlzIHVzZWQgb24gdGhlIGNvcHJvY2Vzc29yLgotCShtYWNybyk6IEhhbmRsZSBNX3tMLFN9V0N7MCwyLDN9X0FCIGNvcnJlY3RseS4KLQotTW9uIEF1ZyAgOSAxMjowOToxNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSBCRkRfUkVMT0NfMTYgZm9yIDItYnl0ZSB2YWx1ZXMuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4LCB0Y19nZW5fcmVsb2MpOiBIYW5kbGUKLQlCRkRfUkVMT0NfMTYuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQotTW9uIEF1ZyAgOSAxMzozNjoyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKG1lcmdlX2RhdGFfaW50b190ZXh0KTogRGVmaW5lIG9ubHkgaWYgQkZEX0FTU0VNQkxFUiBpcwotCWRlZmluZWQgb3IgQkZEIGlzIG5vdC4KLQkocmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzKTogRGVjbGFyZSBsb2NhbCB2YXJpYWJsZSBmcmFnUC4KLQotRnJpIEF1ZyAgNiAxNToyMjo1MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIGNhc2UgQkZEX1JFTE9DXzMyKTogRmlsbCBpbgotCWJ5dGVzIHdpdGggcmVhbCB2YWx1ZXMsIG5vdCB6ZXJvcy4KLQotRnJpIEF1ZyAgNiAxMDo1Nzo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLXJpc2NvcyosIG1pcHMtKi1zeXN2Kik6IE5ldyAodW50ZXN0ZWQpCi0JdGFyZ2V0cywgdXNpbmcgZWNvZmYgYW5kIG1pcHMtYmlnLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkCi0JSm9obnNvbik6IEFkZGVkIGNhc2UgZm9yICdDJyBmb3IgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gY29kZXMuCi0KLVRodSBBdWcgIDUgMTM6MDg6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4LCBjYXNlIEJGRF9SRUxPQ182NCk6IEZpbGwgaW4KLQlieXRlcyB3aXRoIHJlYWwgdmFsdWVzLCBub3QgemVyb3MuCi0JKG1kX3BzZXVkb190YWJsZSk6IENhbGwgY29ucyBmb3IgLnVheHdvcmQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgIi44Ynl0ZSIuCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogVXNlIEJGRF9SRUxPQ182NCBmb3IgOC1ieXRlIGV4cHJlc3Npb25zLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFRlc3QgREVCVUdfU1lNUyBpbnN0ZWFkIG9mIERFQlVHCi0JZm9yIHZlcmlmeWluZyBzeW1ib2wgY2hhaW4uCi0JKG1lcmdlX2RhdGFfaW50b190ZXh0LCByZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMpOiBOZXcKLQlmdW5jdGlvbnMsIHNwbGl0IG91dCBmcm9tIHdyaXRlX29iamVjdF9maWxlLgotCi1UdWUgQXVnICAzIDE1OjQzOjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zdGFiX2dlbmVyaWMsIGluIGRpc2FibGVkIGNvZGUpOiBJZgotCWRlYnVnIHNlY3Rpb24gaXMgbmV3LCBhbGxvY2F0ZSBhbiBleHRyYSAxMiBieXRlcyBhdCBpdHMgc3RhcnQuICBJZgotCSIuc3RhYnMiIHR5cGUgaXMgTl9TTywgZmlsbCBpbiBmaWxlbmFtZSBzeW1ib2wgZmllbGQgb2YgdGhhdCBmaXJzdAotCWVudHJ5LiAgUmV0dXJuIGVhcmx5IGlmICJnb29mIiwgdG8gc2ltcGxpZnkgbGF0ZXIgY29kZSBzbGlnaHRseS4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9mcm9iX2ZpbGUpOiBBcHBseSBhZGp1c3Rfc3RhYl9zZWN0aW9ucyB0byBlYWNoIHNlY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbiwgb2JqX2VsZl9wcmV2aW91cyk6IE5vIGxvbmdlcgotCXN0YXRpYy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfc2VjdGlvbiwgb2JqX2VsZl9wcmV2aW91cyk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogQ2FsbCB0aGVtIGZvciAicHVzaHNlY3Rpb24iCi0JYW5kICJwb3BzZWN0aW9uIiwgYW5kIGNhbGwgY29ucyBmb3IgInVhd29yZCIgYW5kICJ1YWhhbGYiLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3ZlcnNpb24pOiBVc2UgRW5nbGlzaCBpbiBlcnJvcgotCW1lc3NhZ2VzLgotCi1UdWUgQXVnICAzIDExOjI5OjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jOiBVcGRhdGVkIGZvciBCRkQgRUNPRkYgY2hhbmdlcy4gIE5vdyBnZXRzIHRoZQotCXN3YXBwaW5nIHJvdXRpbmVzIGFuZCBleHRlcm5hbCBzdHJ1Y3R1cmUgc2l6ZXMgdmlhIHRoZQotCWVjb2ZmX2JhY2tlbmQgaW5mb3JtYXRpb24uICBObyBsb25nZXIgaW5jbHVkZXMgY29mZi9taXBzLmguCi0KLU1vbiBBdWcgIDIgMTc6MzU6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGdldF90YWcpOiBTYXZlIHRhZyBuYW1lIGluIHBlcm1hbmVudCBtZW1vcnkKLQlhbmQgaW4gaGFzaF9wdHItPnN0cmluZy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IFJlc2V0IHN0YXRlIHRvIDAgYWZ0ZXIgLmFwcGxpbmUgaWYKLQlmaWxlIG5hbWUgaXMgbm90IHNlZW4uCi0KLU1vbiBBdWcgIDIgMTE6NTE6NDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4LCBjYXNlIEJGRF9SRUxPQ182NCk6IE5ldyBjYXNlLAotCXBhcmFsbGVsIHRvIEJGRF9SRUxPQ18zMi4KLQkodGNfZ2VuX3JlbG9jKTogQWNjZXB0IEJGRF9SRUxPQ182NC4KLQotVGh1IEp1bCAyOSAyMjoyMToyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmM6IERvbid0IHVzZSBzaG9ydCBpbnQgaW4gYSBwcm90b3R5cGUuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IE1ha2UgcmV0dXJuIHZhbHVlIHNpbXBseSBkZXBlbmQgb24gY29udGVudHMgb2YKLQlyZXR1cm5lZCBleHByZXNzaW9uLgotCi1UaHUgSnVsIDI5IDE4OjM4OjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBzcGFyYyotYW91dCBhbmQgc3BhcmMqLXZ4d29ya3MgYXJlIEJGRCBhc3NlbWJsZXJzCi0KLVRodSBKdWwgMjkgMTg6Mzg6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tc3Vub3MuaDogcmVtb3ZlIHNvbWUgb2xkIGZ1bmN0aW9uIGRlY2xzIHRoYXQgY29uZmxpY3QKLQl3LyBBTlNJLCBhbmQgd2hpY2ggd2VyZW4ndCBuZWVkZWQgYW55d2F5Ci0KLVdlZCBKdWwgMjggMTY6MzQ6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZnJvYl9zeW1ib2wpOiBSZW5hbWVkIGZyb20gdGNfZnJvYl9zeW1ib2wsCi0JYW5kIGRpc2FibGVkIHNpbmNlIGl0IGJyZWFrcyBJYW4ncyBuZXcgc3ltYm9sLXZhbHVlIGNvZGUuCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IEFjY2VwdCBtb3JlIGRpZ2l0cyBpZiBCRkQ2NC4KLQotV2VkIEp1bCAyOCAxMTozMDowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBJZiB3ZSBoYXZlIGEgbm9ybWFsIGNvbnN0YW50IHdoZW4gd2UKLQlleHBlY3QgYSBiaWdudW0sIHR1cm4gaXQgaW50byBhIGJpZ251bS4gIE91dHB1dCBleHRyYSB6ZXJvZXMKLQliZWZvcmUgYSBzaG9ydCBiaWdudW0sIHJhdGhlciB0aGFuIGFmdGVyLgotCi1UdWUgSnVsIDI3IDE1OjU0OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogQ29uZGl0aW9uYWxpemUgdmVyaWZ5X3N5bWJvbF9jaGFpbiBjYWxsCi0Jb24gREVCVUdfU1lNUywgbm90IERFQlVHLgotCShzeW1ib2xfcmVtb3ZlKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9pbnNlcnQpOiBMaWtld2lzZS4KLQotVHVlIEp1bCAyNyAwODo0NTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfb3B0aW1pemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhcHBlbmRfaW5zbik6IElmIG1pcHNfb3B0aW1pemUgPT0gMCwgYWx3YXlzIGluc2VydCBOT1AKLQlpbnN0cnVjdGlvbnMuICBJZiBtaXBzX29wdGltaXplIDwgMiwgZG9uJ3Qgc3dhcCBicmFuY2hlcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWYgLU94IG9yIC1neCwgc2V0IG1pcHNfb3B0aW1pemUgYWNjb3JkaW5nbHkuCi0KLU1vbiBKdWwgMjYgMTg6MDI6NDMgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBpZiB0ZXN0c3VpdGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gc2tpcCBpdC4KLQotRnJpIEp1bCAyMyAxNDoxMzoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHByZXZfaW5zbl91bnJlb3JkZXJlZCwKLQlwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgYnJhbmNoIGluc3RydWN0aW9uIGlmCi0JcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQgKHNlZSBjb21tZW50KS4KLQkobWlwc19ub19wcmV2X2luc24pOiBDbGVhciB0aGUgdW5yZW9yZGVyZWQgdmFyaWFibGVzLgotCShzX21pcHNzZXQpOiBXaGVuIHR1cm5pbmcgb24gcmVvcmRlcmluZywgc2V0IHRoZSB1bnJlb3JkZXJlZAotCXZhcmlhYmxlcy4KLQotRnJpIEp1bCAyMyAxMzowOTo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFNlY3Rpb25zICIuaW5pdCIgYW5kICIuZmluaSIKLQlhcmUgYWxzbyBtYWdpYywgYW5kIGhhdmUgc3BlY2lhbCBkZWZhdWx0IGZsYWcgc2V0dGluZ3MuCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wpOiBTaW5jZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBmdW5jdGlvbgotCWlzbid0IHVzZWQsIGRvbid0IGJvdGhlciBjYWxsaW5nIG9ial9lbGZfd3JpdGVfc3ltYm9sX3AsIHNpbmNlIGl0Ci0JZG9lc24ndCBhY2NvbXBsaXNoIGFueXRoaW5nIGVsc2UuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zZWN0aW9uX2FsaWduKTogUm91bmQgdXAgc2VjdGlvbiBzaXplIG9ubHkKLQlmb3IgYS5vdXQgZm9ybWF0LgotCi0JKiBzeW1ib2xzLmM6IERvbid0IGRlZmluZSBERUJVRyBieSBkZWZhdWx0LgotCi1UaHUgSnVsIDIyIDEyOjA5OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBIYW5kbGUgYSBPX3VtaW51cyBleHByZXNzaW9uLgotCi0JKiBleHByLmMgKGV4cHIpOiBEb24ndCBsZXQgYWJzb2x1dGVfc2VjdGlvbiBvdmVycmlkZQotCXVuZGVmaW5lZF9zZWN0aW9uIGZvciB0aGUgcmV0dXJuIHZhbHVlLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEluIE5PX1BTRVVET19ET1QgY2FzZSwgaWYgd2UgZmluZCBhCi0JcHNldWRvLW9wIHdpdGggYSBwb2NfaGFuZGxlciBmaWVsZCBvZiBOVUxMLCBpZ25vcmUgaXQgYW5kIHRyZWF0IGl0Ci0JYXMgYW4gaW5zdHJ1Y3Rpb24gaW5zdGVhZC4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAic2V0IiB3aXRoIGEgTlVMTAotCXBvY19oYW5kbGVyIGZpZWxkLgotCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobWRfYmVnaW4pOiBVc2UgYSBsb2NhbCB2YXJpYWJsZSB3aGVuCi0JaW5pdGlhbGl6aW5nIG1kX3JlbGF4X3RhYmxlIHRvIGF2b2lkIHdhcm5pbmdzIGFib3V0IG1vZGlmeWluZyBhCi0Jc3VwcG9zZWRseSBjb25zdCBkYXRhIHN0cnVjdHVyZS4KLQotVGh1IEp1bCAyMiAxMDo1ODo1MSAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBPbmx5IGluY2x1ZGUgYW91dC9hb3V0NjQuaCBpZiBCRkRfQVNTRU1CTEVSCi0JaXMgZGVmaW5lZC4KLQotV2VkIEp1bCAyMSAxNzozMjowMiAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChjYXNlICR7aG9zdH0pOiAgTWFwICotKi1zeXN2NCogdG8gZ2FzX2hvc3Q9c3lzdi4KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSk6ICBBZGQgaVszNF04Ni0qLXN5c3Y0KgotCWNhc2UgdG8gc2V0IG9ial9mb3JtYXQ9ZWxmLiAgTXVzdCBnbyBiZWZvcmUgaTM4Ni0qLXN5c3YqIGNhc2UgdGhhdAotCXNldHMgb2JqX2Zvcm1hdD1jb2ZmYnNkLiAgQWRkICotKi1zeXN2NCogdG8gKi0qLWVsZiBhbmQKLQkqLSotc29sYXJpcyBjYXNlLCBhbmQgbW92ZSB0byBiZWZvcmUgKi1zeXN2KiBjYXNlIHRoYXQgd2FudHMgdG8KLQlzZXQgb2JqX2Zvcm1hdCB0byBjb2ZmLgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQ2hhbmdlIGFsbCAnZXhwLlhfb3AnIHRvCi0JJ2V4cC0+WF9vcCcuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgpOiAgRml4IHZhbHAgdG8gYmUgJ3ZhbHVlVCAqJyBmb3IKLQlCRkRfQVNTRU1CTEVSIGNhc2UuCi0KLVdlZCBKdWwgMjEgMTI6NDc6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYzogSW5jbHVkZSBhb3V0L2FvdXQ2NC5oLgotCShvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFNldCBCU0ZfREVCVUdHSU5HIGZvciBhIGNvbnN0cnVjdG9yCi0Jc3ltYm9sLCBzbyB0aGF0IEJGRCBkb2Vzbid0IHRhbXBlciB3aXRoIHRoZSB0eXBlLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IElmIE5PX1BTRVVET19ET1QgaXMgZGVmaW5lZCwgbG9vawotCXVwIG9wY29kZXMgYXMgcHNldWRvLW9wcyBldmVuIGlmIHRoZXkgZG9uJ3Qgc3RhcnQgd2l0aCAnLicuCi0JKiBjb25maWcvdGMtbTg4ay5oIChOT19QU0VVRE9fRE9UKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfYXNzZW1ibGUpOiBSZW1vdmVkIHNwZWNpYWwgcHNldWRvLW9wCi0JaGFuZGxpbmcuCi0JKG1kX2FwcGx5X2ZpeCk6IFNldCBmeF9vZmZzZXQgdG8gdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIHJlbG9jLgotCU91dHB1dCB0aGUgbG93IDE2IGJpdHMgZm9yIFJFTE9DX0hJMTYsIG5vdCB0aGUgaGlnaCAxNiBiaXRzLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBJZiBUQ19NODhLLCBzZXQgdGhlCi0Jcl9vZmZzZXQgZmllbGQgb2YgdGhlIHJlbG9jIHRvIHRoZSBmaXh1cCBvZmZzZXQuCi0JKGZpeHVwX3NlZ21lbnRzKTogSWYgVENfTTg4SywgZG9uJ3Qgd2FybiBhYm91dCBmaXh1cCBvdmVyZmxvd3MuCi0JKiBkb2MvYXMudGV4aW5mbzogTWlub3IgdXBkYXRlcy4KLQotVHVlIEp1bCAyMCAxOToyODo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHBlcm1pdCBzeW1ib2xzIHRvIGNvbnRhaW4gYW55IGV4cHJlc3Npb24KLQl0eXBlIGFuZCB0byBkZWxheSB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGV4cHJlc3Npb24gdW50aWwgdGhlCi0JdmFsdWUgaXMgYWN0dWFsbHkgbmVlZGVkLiAgVGhpcyBwZXJtaXRzIHNldHRpbmcgc3ltYm9scyB0byB2YWx1ZXMKLQljYWxjdWxhdGVkIGJhc2VkIG9uIG9iamVjdCBjb2RlIHNpemUuICBFeHByZXNzaW9ucyB3ZXJlIGNoYW5nZWQgdG8KLQlubyBsb25nZXIgYmUgaW4gYSBzZWN0aW9uLCB0byBzdG9wIHRoZSBvdmVybG9hZGluZyBvZiBzZWdtZW50IGFuZAotCWV4cHJlc3Npb24gdHlwZSB0aGF0IHByZXZpb3VzbHkgb2NjdXJyZWQuCi0KLQkqIGFzLmMgKGJpZ19zZWN0aW9uLCBwYXNzMV9zZWN0aW9uLCBkaWZmX3NlY3Rpb24sIGFic2VudF9zZWN0aW9uKToKLQlSZW1vdmVkLgotCShleHByX3NlY3Rpb24pOiBBZGRlZCAodXNlZCBmb3IgZHVtbXkgc3ltYm9scyB3aGljaCBob2xkCi0JaW50ZXJtZWRpYXRlIGV4cHJlc3Npb24gdmFsdWVzKS4KLQkocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ3JlYXRlIGV4cHJfc2VjdGlvbiwgZG8gbm90IGNyZWF0ZSB0aGUKLQlzZWN0aW9ucyBub3cgcmVtb3ZlZC4KLQkqIGFzLmggKHNlZ1QpOiBSZW1vdmVkIFNFR19BQlNFTlQsIFNFR19QQVNTMSwgU0VHX0JJRywgYW5kCi0JU0VHX0RJRkZFUkVOQ0UuICBBZGRlZCBTRUdfRVhQUi4KLQkoU0VHX05PUk1BTCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIHN1YnNlZ3MuYyAoc2VnX25hbWUsIHN1YnNlZ3NfYmVnaW4pOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChzZWdfTl9UWVBFKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWJvdXQuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChzZWdfTl9UWVBFKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLXZtcy5jIChzZWdfTl9UWVBFKTogRGl0dG8uCi0KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogTW92ZWQgaW4gZnJvbSBleHByLmMsIGFkZGVkIHNvbWUgdmFsdWVzLgotCShleHByZXNzaW9uUyk6IEFkZGVkIFhfb3AgZmllbGQsIHJlbW92ZWQgWF9zZWcgZmllbGQ7IHJlbmFtZWQKLQlYX3N1YnRyYWN0X3N5bWJvbCB0byBYX29wX3N5bWJvbC4KLQkqIGV4cHIuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gYXNzaWduIGV4cHJlc3Npb24gdHlwZXMgcmF0aGVyIHRoYW4KLQlzZWN0aW9ucyBhbmQgdG8gc2ltcGxpZnkgdGhlIHBhcnNpbmcuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZml4X25ldyk6IFJlbW92ZWQgc3ViX3N5bWJvbCBhcmd1bWVudC4KLQkoZml4X25ld19leHApOiBOZXcgZnVuY3Rpb24sIHRha2VzIGV4cHJlc3Npb24gYXJndW1lbnQuCi0JKiB3cml0ZS5oOiBQcm90b3R5cGUgY2hhbmdlcyBmb3IgZml4X25ldyBhbmQgZml4X25ld19leHAuCi0JKiBjb25kLmMgKHNfaWYpOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCSogcmVhZC5jIChzX2xzeW0sIHBzZXVkb19zZXQsIGVtaXRfZXhwciwgcGFyc2VfYml0ZmllbGRfY29ucywKLQlwYXJzZV9yZXBlYXRfY29ucywgZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uLAotCWdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBEaXR0by4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6Ci0JRGl0dG8uCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2RlZiwgb2JqX2NvZmZfdmFsKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZGVmLCBvYmpfY29mZl92YWwsCi0Jb2JqX2NvZmZfZW5kZWYsIHlhbmtfc3ltYm9scyk6IERpdHRvLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zdGFiX2dlbmVyaWMsIG9ial9lbGZfc2l6ZSk6IERpdHRvLgotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYXNzZW1ibGUsIHBhcnNlX29wZXJhbmQsIG1hY2hpbmVfaXAsCi0JcHJpbnRfaW5zbiwgbWRfb3BlcmFuZCk6IERpdHRvLgotCSogY29uZmlnL3RjLWg4MzAwLmMgKHBhcnNlX2V4cCwgY29sb25tb2QyNCwgY2hlY2tfb3BlcmFuZCwKLQlkb19hX2ZpeF9pbW0sIGJ1aWxkX2J5dGVzKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaDg1MDAuYyAocGFyc2VfZXhwLCBza2lwX2NvbG9udGhpbmcsIHBhcnNlX3JlZ2xpc3QsCi0JZ2V0X3NwZWNpZmljLCBjaGVjaywgaW5zZXJ0LCBtZF9jb252ZXJ0X2ZyYWcpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRoZV9pbnNuLCBmaXhfbmV3X2hwcGEsIGNvbnNfZml4X25ld19ocHBhLAotCW1kX2Fzc2VtYmxlLCBwYV9pcCwgZ2V0RXhwcmVzc2lvbiwgZ2V0QWJzb2x1dGVFeHByZXNzaW9uLAotCWV2YWx1YXRlQWJzb2x1dGUsIHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSwgcGFfZW50cnksCi0JcHJvY2Vzc19leGl0KTogRGl0dG8uCi0JKiBjb25maWcvdGMtaHBwYS5oIChTVEFCX0ZJWFVQLCBpc19EUF9yZWxhdGl2ZSwgaXNfUENfcmVsYXRpdmUsCi0JaXNfY29tcGxleCk6IERpdHRvLgotCSogY29uZmlnL3RjLWkzODYuYyAocGUsIG1kX2Fzc2VtYmxlLCBpMzg2X29wZXJhbmQsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1pODYwLmMgKG1kX2Fzc2VtYmxlLCBnZXRFeHByZXNzaW9uLCBwcmludF9pbnNuKToKLQlEaXR0by4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHBhcnNlX2V4cHIsIHN1YnMsIHNlZ3MsIG1kX2NvbnZlcnRfZnJhZywKLQlnZXRfY2Rpc3AsIG1lbV9mbXQsIHBhcnNlX2xkY29uc3QsIHJlbGF4X2NvYnIsIHNfc3lzcHJvYywKLQlpOTYwX2hhbmRsZV9hbGlnbik6IERpdHRvLgotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IG02OGtfZXhwLCBzdHJ1Y3QgbTY4a19pdCwgc2VnLCBvcCwKLQlzdWJzLCBhZGRfZml4LCBpc3ZhciwgbTY4a19pcCwgbWRfYXNzZW1ibGUsIG1kX2NvbnZlcnRfZnJhZ18xLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wLCBnZXRfbnVtKToKLQlEaXR0by4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX2Fzc2VtYmxlLCBnZXRfaW1tMTYsIGdldF9wY3IsCi0JbWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2Fzc2VtYmxlLCBhcHBlbmRfaW5zbiwgZ3BfcmVmZXJlbmNlLAotCW1hY3JvX2J1aWxkLCBtYWNybywgbXlfZ2V0RXhwcmVzc2lvbik6IERpdHRvLiAgQWxzbyByZW1vdmVkCi0JZ2V0X29wdGlvbmFsX2Fic29sdXRlX2V4cHJlc3Npb247IGp1c3QgdXNlIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uCi0JaW5zdGVhZC4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChnZXRfYWRkcl9tb2RlLCBldmFsdWF0ZV9leHByLCBjb252ZXJ0X2lpZiwKLQlmaXhfbmV3X25zMzJrLCBmaXhfbmV3X25zMzJrX2V4cCwgY29uc19maXhfbmV3X25zMzJrKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoZml4X25ld19uczMyayBwcm90b3R5cGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9leHAsIGNoZWNrLCBpbnNlcnQsIG1kX2NvbnZlcnRfZnJhZyk6Ci0JRGl0dG8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXNzZW1ibGUsIHNwYXJjX2lwLCBnZXRFeHByZXNzaW9uLAotCXByaW50X2luc24pOiBEaXR0by4KLQkqIGNvbmZpZy90Yy10YWhvZS5jIChzdHJ1Y3QgdG9wLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwKLQl0aXBfb3AsIG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0JKiBjb25maWcvdGMtdmF4LmMgKHNlZ19vZl9vcGVyYW5kLCBtZF9hc3NlbWJsZSwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfY3JlYXRlX2xvbmdfanVtcCk6IERpdHRvLgotCSogY29uZmlnL3RjLXo4ay5jIChwYXJzZV9leHAsIGNoZWNrX29wZXJhbmQsIG5ld2ZpeCk6IERpdHRvLgotCi1UdWUgSnVsIDIwIDEyOjE3OjE2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBpMzg2LWx5bnggaXMgdGhlIHNhbWUgYXMgaTM4Ni1jb2ZmCi0KLU1vbiBKdWwgMTkgMTU6MjE6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3ByZXZpb3VzKTogTmV3IGZ1bmN0aW9uLgotCShwcmV2aW91c19zZWN0aW9uLCBwcmV2aW91c19zdWJzZWN0aW9uKTogTmV3IHZhcnMuCi0JKG9ial9lbGZfc2VjdGlvbik6IFNhdmUgY3VycmVudCBwbGFjZSBpbiBjYXNlIERXQVJGIGNvZGUgd2FudHMgdXMKLQl0byBwb3AgYmFjayB0byBpdC4gIEhhbmRsZSB1bnF1b3RlZCBzZWN0aW9uIG5hbWUgYXMgd2VsbCBhcyBxdW90ZWQKLQlzZWN0aW9uIG5hbWUuICBEb24ndCBjcmFzaCBvbiBpbnZhbGlkIHN0cmluZ3MuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgbmV3IHBzZXVkb3MgInByZXZpb3VzIiwgIjJieXRlIiwgYW5kCi0JIjRieXRlIi4KLQotCSogY29uZmlnL29iai1lbGYuaDogRG9uJ3QgaW5jbHVkZSBzdHJ1Yy1zeW1ib2wuaC4KLQkob2JqX2VsZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUgYXJnIGFzIHN0cnVjdCBzeW1ib2wgKi4KLQotCSogdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpIFtPQkpfRUxGXTogTG9jYWwgbGFiZWxzIGNhbiBzdGFydCB3aXRoCi0JIkwiIG9yICJfLkxfIi4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvZmYgZnJvbQotCXdyaXRlX2NvbnRlbnRzLiAgVXNlIG1lbXNldCBpbnN0ZWFkIG9mIGJ6ZXJvLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IEFwcGx5IHdyaXRlX3JlbG9jcyB0byBlYWNoIHNlY3Rpb24gYmVmb3JlCi0JYXBwbHlpbmcgd3JpdGVfY29udGVudHMuCi0KLQkqIHJlYWQuYyAocmVhZF9iZWdpbik6IENhbGwgb2JzdGFja19iZWdpbiB3aXRoIHZhbHVlcyBjbG9zZXIgdG8gMUsKLQltdWx0aXBsZXMuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSwgYmlnX2NvbnMsIGZsb2F0X2NvbnMpOiBVc2UgbWVtY3B5IGluc3RlYWQgb2YKLQliY29weS4KLQotTW9uIEp1bCAxOSAxNDozMDowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXBfb3ApOiBEb24ndCBkZWNyZW1lbnQgc3RyZW5kIHdoZW4KLQljYWxjdWxhdGluZyBvcFAtPmlzaXo7IHRoaXMgcGVybWl0cyB0aGUgZXhwcmVzc2lvbiBzaXplIHRvIGJlCi0JZGV0ZXJtaW5lZCBhcyB3ZWxsLCBsYXRlciBvbi4KLQotCSogZXhwci5jIChjbGVhbl91cF9leHByZXNzaW9uKTogRG9uJ3QgY2FuY2VsIHRoZSBzdWJ0cmFjdGlvbiBvZgotCXVuZGVmaW5lZCBzeW1ib2xzLgotCi0JKiByZWFkLmMgKHNfZGF0YSksIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9kYXRhKTogSWYgLVIsCi0Jc3dpdGNoIHRvIHRleHQgc2VjdGlvbiByYXRoZXIgdGhhbiBkYXRhIHNlY3Rpb24uCi0KLU1vbiBKdWwgMTkgMTI6MzU6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwLCBjYXNlIEFJTkRYKTogQWRkIDYgdG8gb3BlcmFuZAotCWV4cHJlc3Npb24gKHRvIHRha2UgdGhlIHBjLXJlbCBpbnN0cnVjdGlvbiBpdHNlbGYgaW50byBhY2NvdW50KQotCWJlZm9yZSB1c2luZyB0aGUgZXhwcmVzc2lvbiwgaW5zdGVhZCBvZiBhZnRlci4KLQotRnJpIEp1bCAxNiAwODo1NjowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZmxvYXRfY29ucyk6IFNpbXBsaWZpZWQgcGFyc2luZyBsb2dpYy4gIElmCi0JUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMgaXMgZGVmaW5lZCwgYWNjZXB0IGEgcmVwZWF0IGNvdW50LgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogUmF0aGVyIHRoYW4gYSBzcGVjaWFsIGNhc2UgZm9yIFRDX0hQUEEsCi0JdXNlIG5ldyBtYWNybyB0Y19mcm9iX2xhYmVsLgotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogTWFueSBjaGFuZ2VzIHRvIHN1cHBvcnQgc2ltcGxlIGFzc2VtYmxlcgotCW9wdGltaXphdGlvbi4KLQkoaW5zbl9sYWJlbCwgcHJldl9pbnNuLCBwcmV2X3ByZXZfaW5zbiwgZHVtbXlfb3Bjb2RlLAotCXByZXZfaW5zbl92YWxpZCwgcHJldl9pbnNuX2ZyYWcsIHByZXZfaW5zbl93aGVyZSwKLQlwcmV2X2luc25fZml4cCwgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QpOiBOZXcgc3RhdGljCi0JdmFyaWFibGVzLgotCShpbnNuX3VzZXNfcmVnLCBtaXBzX25vX3ByZXZfaW5zbiwgbWlwc19lbWl0X2RlbGF5cywKLQltaXBzX2FsaWduLCBzX3N0cmluZ2VyLCBzX21pcHNfc3BhY2UpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkobWlwc19kZWZpbmVfbGFiZWwpOiBOZXcgZ2xvYmFsIGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpOiBGb3IgImFzY2lpIiwgImFzY2l6IiwgImFzY2lpeiIsIGNhbGwKLQlzX3N0cmluZ2VyLiAgQ2hhbmdlZCBhcmd1bWVudCB0byBmbG9hdF9jb25zIGZyb20gMCBvciAxIHRvICdmJwotCW9yICdkJy4gIEZvciAic3BhY2UiIGNhbGwgc19taXBzX3NwYWNlLgotCShtZF9iZWdpbik6IENhbGwgbWlwc19ub19wcmV2X2luc24uCi0JKGFwcGVuZF9pbnNuKTogT25seSBpbnNlcnQgbmVjZXNzYXJ5IE5PUCBpbnN0cnVjdGlvbnMuCi0JKG1hY3JvKTogQ2FsbCBtaXBzX2VtaXRfZGVsYXlzIGJlZm9yZSBzZXR0aW5nIG1pcHNfbm9yZW9yZGVyLgotCUluY3JlbWVudCBhbmQgZGVjcmVtZW50IG1pcHNfbm9yZW9yZGVyIHJhdGhlciB0aGFuIHVzaW5nCi0Jc2F2ZV9yZW9yZGVyX2NvbmRpdGlvbi4gIERvbid0IGJvdGhlciB0byB1c2Ugbm9yZW9yZGVyIGluCi0JTV9MX0RPQiBhbmQgTV9MX0RBQiwgc2luY2UgYXBwZW5kX2luc24gd2lsbCBub3QgaW5zZXJ0IGEgTk9QLgotCShtZF9hdG9mKTogSGFuZGxlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgY29ycmVjdGx5IGZvciBib3RoCi0JYmlnIGFuZCBsaXR0bGUgZW5kaWFuIHRhcmdldHMuCi0JKHNfYWxpZ24sIHNfY29ucyk6IENhbGwgbWlwc19hbGlnbiByYXRoZXIgdGhhbiBmcmFnX2FsaWduLgotCShzX2NoYW5nZV9zZWcsIHNfY29ucyk6IENhbGwgbWlwc19lbWl0X2RlbGF5cy4KLQkoc19mbG9hdF9jb25zKTogTGV0IGZsb2F0X2NvbnMgZG8gdGhlIHdvcmsuCi0JKHNfbWlwc3NldCk6IENhbGwgbWlwc19lbWl0X2RlbGF5cyB3aGVuIHNldHRpbmcgbm9yZW9yZGVyLgotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9sYWJlbCk6IERlZmluZSB0byBiZQotCW1pcHNfZGVmaW5lX2xhYmVsLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMsIGVjb2ZmX2J1aWxkX3Byb2NzLAotCWVjb2ZmX2Zyb2JfZmlsZXMpOiBDb25zaXN0ZW50bHkgdXNlIFNfR0VUX1ZBTFVFIHJhdGhlciB0aGFuCi0JYmZkX2FzeW1ib2xfdmFsdWUuICBXYXJuIGlmIHRha2luZyBkaWZmZXJlbmNlIG9mIHN5bWJvbHMgaW4KLQlkaWZmZXJlbnQgc2VnbWVudHMuCi0KLVRodSBKdWwgMTUgMTE6NTE6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IERpc2NhcmQgYWxsIG9wZW4gc2NvcGVzLAotCXdpdGggYSB3YXJuaW5nLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCk6IElmIFRDX004OEssIGRvbid0IGFkanVzdAotCWJ5IG1kX3BjcmVsX2Zyb20gaWYgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCBhIHN5bWJvbCAod2Ugc3RpbGwKLQluZWVkIG1kX3BjcmVsX2Zyb20gZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aXRoaW4gdGhlIHNhbWUKLQlmaWxlKS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX3BjcmVsX2Zyb20pOiBDb3JyZWN0ZWQgcmV0dXJuIHZhbHVlLgotCShvbWFnaWMpOiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZS4KLQotCSogUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgbTg4ay1jb2ZmLgotCSogY29uZmlndXJlLmluIChtODhrLSotY29mZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGNvZmZiZmQgYW5kCi0JbTg4a2NvZmYuCi0JKiBjb25maWcvbTg4a2NvZmYubXQ6IE5ldyBmaWxlLgotCSogcmVhZC5jIChsZXhfdHlwZSk6IE5ldyBtYWNybyBMRVhfQVQgdG8gc2V0IGxleCB0eXBlIG9mICdAJy4KLQkocHNldWRvX3NldCk6IEhhbmRsZSBkaWZmZXJlbmNlIG9mIHN5bWJvbHMgaW4gZGlmZmVyZW50IGZyYWdtZW50cwotCWJ5IHNhdmluZyB0aGUgZW50aXJlIGV4cHJlc3Npb24gYXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogUmVzb2x2ZSBkaWZmZXJlbmNlCi0JZXhwcmVzc2lvbnMuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX3BzZXVkb190YWJsZSk6IElmIFRDX004OEssIGFjY2VwdAotCSJzZGVmIiBhcyBhIHN5bm9ueW0gZm9yICJkZWYiLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IElmIFRDX004OEssIGluY2x1ZGUgY29mZi9tODhrLmggYW5kIHNldAotCVRBUkdFVF9GT1JNQVQuCi0JKFNfSVNfTE9DQUwpOiBBbnkgc3ltYm9sIHdoaWNoIGluY2x1ZGVzIFwwMDEgaW4gdGhlIG5hbWUgaXMgbG9jYWwuCi0JKiBjb25maWcvdGMtbTg4ay5jLCBjb25maWcvdGMtbTg4ay5oOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGJyaW5nCi0JbTg4ayBwb3J0IHVwIHRvIGRhdGUsIGFuZCB0byBhZGQgQ09GRiBzdXBwb3J0LgotCi1XZWQgSnVsIDE0IDE1OjA5OjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogUmVtb3ZlZCBzeV9mb3J3YXJkIGFuZCByZXBsYWNlZCBpdCB3aXRoIGFuIHVuZGVmaW5lZCBleHByZXNzaW9uCi0JYXMgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLgotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBSZW1vdmVkIHN5X2ZvcndhcmQgZmllbGQuICBBZGRlZAotCXN5X3Jlc29sdmVkIGFuZCBzeV9yZXNvbHZpbmcgc2luZ2xlIGJpdCBmaWVsZHMuCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBEb24ndCBpbml0aWFsaXplIHN5X2ZvcndhcmQgZmllbGQuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogTmV3IGZ1bmN0aW9uIHRvIGFkanVzdCBzeW1ib2wgdmFsdWUgYnkKLQlmcmFnbWVudCBhZGRyZXNzLCB1c2luZyByZWN1cnNpb24gdG8gcmVzb2x2ZSBmb3J3YXJkIHN5bWJvbHMuCi0JKiBzeW1ib2xzLmg6IEFkZGVkIHByb3RvdHlwZSBmb3IgbmV3IGZ1bmN0aW9uLgotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogU2V0IHN5bWJvbFAtPnN5X3ZhbHVlIHRvIGFuIHVuZGVmaW5lZAotCWV4cHJlc3Npb24gcmF0aGVyIHRoYW4gc2V0dGluZyBzeW1ib2xQLT5zeV9mb3J3YXJkLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgb24KLQlzeW1ib2xzLCBrZWVwaW5nIHRoZSBjb21tb24gY2FzZSAodGhlIG9sZCBiZWhhdmlvdXIpIGlubGluZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFJlbW92ZWQgc3lfZm9yd2FyZAotCWhhbmRsaW5nIChzdWJzdW1lZCBieSB3cml0ZS5jIGNoYW5nZSkuCi0JKiBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX3ZhbCk6IFNldAotCXN5X3ZhbHVlIHJhdGhlciB0aGFuIHN5X2ZvcndhcmQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZW5kZWYsIHlhbmtfc3ltYm9scyk6IENoZWNrCi0JZXhwcmVzc2lvbiBzZWdtZW50IHJhdGhlciB0aGFuIHN5X2ZvcndhcmQuCi0JKHlhbmtfc3ltYm9scyk6IFVzZSByZXNvbHZlX3N5bWJvbF92YWx1ZS4KLQkoY3Jhd2xfc3ltYm9scyk6IFJlbW92ZWQgZXh0cmEgcGFzcyBvdmVyIHN5bWJvbHMuCi0JKiBjb25maWcvb2JqLWFvdXQuYywgY29uZmlnL29iai1ib3V0LmMsIGNvbmZpZy9vYmotY29mZi5jLAotCWNvbmZpZy9vYmotdm1zLmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBSZW1vdmVkIGV4dHJhIHBhc3Mgb3ZlcgotCXN5bWJvbHMgd2hpY2ggaGFuZGxlZCBzeV9mb3J3YXJkOyB1c2UgcmVzb2x2ZV9zeW1ib2xfdmFsdWUKLQlpbnN0ZWFkLgotCSogY29uZmlnL29iai1jb2ZmLmgsIGNvbmZpZy9vYmotY29mZmJmZC5oIChvYmpfZnJvYl9mb3J3YXJkX3N5bWJvbCk6Ci0JRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiBDaGVjayBleHByZXNzaW9uCi0Jc2VnbWVudCByYXRoZXIgdGhhbiBzeV9mb3J3YXJkLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX0NoZWNrX0Zvcl9NYWluKTogRG9uJ3QgaW5pdGlhbGl6ZQotCXN5X2ZvcndhcmQ7IGRvIGluaXRpYWxpemUgc3lfcmVzb2x2ZWQgYW5kIHN5X3Jlc29sdmluZy4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFNUQUJfRklYVVApOiBVc2Ugc3lfdmFsdWUsIG5vdCBzeV9mb3J3YXJkLgotCi0JKiBDaGFuZ2VzIHRvIGtlZXAgYSBmdWxsIGV4cHJlc3Npb24gYXMgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLCBub3QKLQlqdXN0IGEgbG9uZ3dvcmQ6Ci0JKiBzdHJ1Yy1zeW1ib2wuaDogTmV3IGZpZWxkIHN5X3ZhbHVlLgotCSogYXMuaDogSW5jbHVkZSBleHByLmggYmVmb3JlIHN0cnVjLXN5bWJvbC5oLgotCSogZXhwci5oOiBVc2Ugc3RydWN0IHN5bWJvbCByYXRoZXIgdGhhbiBzeW1ib2xTLgotCSogc3ltYm9scy5jIChTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBSZXdyb3RlIHRvIHJldHJpZXZlIHZhbHVlCi0Jb2Ygc3lfdmFsdWUgZmllbGQ7IGNvbXBpbGUgdW5jb25kaXRpb25hbGx5LCBub3QganVzdCBpZgotCUJGRF9BU1NFTUJMRVIuCi0JKiBzeW1ib2xzLmg6IENvbXBpbGUgU197U0d9RVRfVkFMVUUgcHJvdG90eXBlcyB1bmNvbmRpdGlvbmFsbHkuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFNldCBCRkQgc3ltYm9sIHZhbHVlIHRvIGdhcyBzeW1ib2wKLQl2YWx1ZS4KLQkqIGNvbmZpZy9vYmotYW91dC5oLCBjb25maWcvb2JqLWJvdXQuaCwgY29uZmlnL29iai1jb2ZmLmgsCi0JY29uZmlnL29iai1jb2ZmYmZkLmgsIGNvbmZpZy9vYmotZ2VuZXJpYy5oLCBjb25maWcvb2JqLXZtcy5oCi0JKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IFJlbW92ZWQgbWFjcm8gZGVmaW5pdGlvbnMuCi0JKiBjb25maWcvb2JqLWllZWUuYyAoU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogUmVtb3ZlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oLCBvYmotY29mZmJmZC5oOiBSZXdyb3RlIHNldmVyYWwgbWFjcm9zIHRvIHVzZQotCVNfR0VUX1ZBTFVFIHJhdGhlciB0aGFuIG9zdF9lbnRyeS5uX3ZhbHVlLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9zeW1ib2xfdG9fY2hhcnMpLCBjb25maWcvb2JqLWJvdXQuYwotCShvYmpfc3ltYm9sX3RvX2NoYXJzKSwgY29uZmlnL29iai1jb2ZmLmMgKG9ial9zeW1ib2xfdG9fY2hhcnMpLAotCWNvbmZpZy9vYmotY29mZmJmZC5jIChzeW1ib2xfdG9fY2hhcnMpOiBHZXQgdmFsdWUgdG8gd3JpdGUgb3V0Ci0JdXNpbmcgU19HRVRfVkFMVUUtLWRvbid0IGFzc3VtZSBpdCBpcyBhbHJlYWR5IHNldC4KLQkqIGNvbmZpZy9vYmotaWVlZS5jIChkb19zeW1ib2xzKTogU2V0IEJGRCBzeW1ib2wgdmFsdWUgdG8gZ2FzCi0Jc3ltYm9sIHZhbHVlLgotCSogY29uZmlnL29iai12bXMuYyAodmFyaW91cyk6IERvbid0IGFzc2lnbiBkaXJlY3RseSB0bwotCVNfR0VUX1ZBTFVFOyB1c2UgU19TRVRfVkFMVUUgaW5zdGVhZC4KLQotV2VkIEp1bCAxNCAwOTozNToyMyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1ha2Ugc3BhcmM2NC0qLWFvdXQqIHVzZSBiZmQgZ2FzLgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBoODMwMGguCi0KLVR1ZSBKdWwgMTMgMTI6MDk6NDQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4NTAwLmMgKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCBoYXNoLgotCShwYXJzZV9leHAsIHNraXBfY29sb250aGluZywgYnVpbGRfYnl0ZXMpOiBBZGQgc3VwcG9ydCBmb3IKLQlSX0g4NTAwX0hJR0gxNiByZWxvY2F0aW9uIHR5cGUuCi0KLU1vbiBKdWwgMTIgMTE6MTU6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEFsbG93IGBAJyB0byBpbnRyb2R1Y2UgYW4KLQlhdHRyaWJ1dGUgbmFtZS4gIEhhbmRsZSBgZXhlY2luc3RyJyBhdHRyaWJ1dGUuCi0KLU1vbiBKdWwgMTIgMDc6MjI6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3Qgd2FybiBvbiAnaScgb3IgJ2onIG1pc21hdGNoIGlmCi0JdGhlcmUgaXMgYW5vdGhlciBhbHRlcm5hdGl2ZSBmb3IgdGhlIGluc3RydWN0aW9uLgotCi1GcmkgSnVsICA5IDE3OjMxOjM0IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiB1cGRhdGVzIGZvciBIOC8zMDBICi0KLVRodSBKdWwgIDggMTQ6NDE6NDMgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAsCi0JbWRfbnVtYmVyX3RvX2NoYXJzLCBtZF9zZWN0aW9uX2FsaWduKTogQWRqdXN0ZWQgdG8gdXNlIHZhbHVlVCwKLQlhZGRyZXNzVCwgdG8gbWF0Y2ggdGMuaC4KLQotVGh1IEp1bCAgOCAxNDoxNTowNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IFJldmFtcCB0byBoYW5kbGUgYm90aCBzeW50YXhlcywKLQlpbmRlcGVuZGVudCBvZiBmb3JtYXQuCi0KLVRodSBKdWwgIDggMDc6MjU6MjUgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmggKFRDX0NPTlNfUkVMT0MpOiBVc2UgUl9SRUxMT05HIGlmIGg4LzMwMGguCi0KLVdlZCBKdWwgIDcgMTg6MTE6MDcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRlZmluZSBDUk9TUz0tRENST1NTX0NPTVBJTEUgaWYgaXQgaXMgYSBjcm9zcwotCWJ1aWxkOyBhbHNvIHJlY29nbml6ZSBoODMwMC0qLWNvZmYKLQotV2VkIEp1bCAgNyAxMDoyMToyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHN5bWJvbHMuYyAoZmJfbGFiZWxfaW5zdGFuY2UsIGZiX2xhYmVsX2luc3RhbmNlX2luYyk6IERvbid0IGR1bXAKLQljb3JlIGp1c3QgYmVjYXVzZSBzb21lYm9keSB1c2VzIGEgbGFiZWwgYmVmb3JlIGl0IGlzIGRlZmluZWQuCi0KLQkqIGNvbmZpZy9taXBzLW9wY29kZS5oOiBNb3ZlZCB0byBvcGNvZGUvbWlwcy5oLgotCSogY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBvcGNvZGUvbWlwcy5oIHJhdGhlciB0aGFuCi0JbWlwcy1vcGNvZGUuaC4KLQkoYXBwZW5kX2luc24pOiBBbiBleHRyYSBOT1AgaXMgb25seSBuZWVkZWQgYWZ0ZXIgaW5zdHJ1Y3Rpb25zCi0Jd2hpY2ggc2V0IEhJIG9yIExPLCBub3QgYWZ0ZXIgaW5zdHJ1Y3Rpb25zIHdoaWNoIHJlYWQgaXQuCi0JKG1hY3JvX2J1aWxkLCBtaXBzX2lwKTogU3VwcG9ydCBuZXcgJ0UnLCAnRycgYW5kICdCJyBhcmd1bWVudHMuCi0JKG1hY3JvKTogY2ZjMSBhbmQgY3RjMSBub3cgdGFrZSAidCxHIiByYXRoZXIgdGhhbiAidCxkIi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHN0cnVjdCBtaXBzX29wY29kZSk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCwgY29uZmlnL21pcHMtbGl0Lm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKToKLQlTZXQgdG8gJChzcmNkaXIpLy4uL2luY2x1ZGUvb3Bjb2RlL21pcHMuaC4KLQotCUdldCB0aGUgTUlQUyBhc3NlbWJsZXIgdXAgdG8gc3BlZWQgd2l0aCBvdGhlciBnYXMgY2hhbmdlczoKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9zZXRfdm1hLCBlY29mZl9mcm9iX3N5bWJvbCk6Ci0JUmVtb3ZlZDsgZG9uJ3QgY2hhbmdlIHRoZSBzeW1ib2wgdmFsdWUuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMsIGVjb2ZmX2J1aWxkX3Byb2NzLCBlY29mZl9mcm9iX2ZpbGUpOiBVc2UKLQliZmRfYXN5bWJvbF92YWx1ZSByYXRoZXIgdGhhbiBTX0dFVF9WQUxVRSB0byBpbmNsdWRlIHNlY3Rpb24KLQl2bWEgaW4gc3ltYm9sIHZhbHVlLgotCShlY29mZl9mcm9iX2ZpbGUpOiBJZ25vcmUgQlNGX1NFQ1RJT05fU1lNIHN5bWJvbHMsIHNpbmNlIEVDT0ZGCi0JZG9lc24ndCBvdXRwdXQgdGhlbS4gIFNldCB0aGUgdm1hIG9mIHNlY3Rpb25zLgotCSogY29uZmlnL29iai1lY29mZi5oOiBEb24ndCBkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sLgotCSogY29uZmlnL3RjLW1pcHMuYyAodGNfZ2VuX3JlbG9jKTogQWRqdXN0bWVudCBieSBzZWN0aW9uIHZtYSBpcyBubwotCWxvbmdlciBuZWNlc3NhcnkuCi0JKHZhcmlvdXMpOiB1c2UgdmFsdWVUIHJhdGhlciB0aGFuIGxvbmcuCi0KLVdlZCBKdWwgIDcgMDg6MzM6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoRU5WNjQpOiBEZWZpbmUgZm9yIHY5LgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc194d29yZCk6IEZvciBudW1iZXJzLCBjYWxsIGJpZ19jb25zLgotCShzcGFyY19pcCwgbWRfYXBwbHlfZml4LCB0Y19nZW5fcmVsb2MpOiBIYW5kbGUgc29tZSBzcGFyYzY0Ci0JcmVsb2NhdGlvbiB0eXBlcy4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogSGFuZGxlIDgtYnl0ZSB2YWx1ZS4KLQotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3N5bWJvbCk6IEZvciB2OSwgdXNlIDY0LWJpdCBzeW1ib2wgdHlwZS4KLQotCSogYXMuaCAodmFsdWVUKTogVHlwZWRlZiBtb3ZlZCBoZXJlLgotCSogc3RydWMtc3ltYm9sLmggKHZhbHVlVCk6IC4uLmZyb20gaGVyZS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogTG9jYWxzIGZyb21fYWRkciwgdG9fYWRkciwKLQl0YWJsZV9hZGRyIGFyZSBub3cgYWRkcmVzc1QuICBTdXBwbHkgcHJvdG90eXBlIGZvciBiZmRfYWxsb2MgZm9yCi0Jbm93LgotCShmaXh1cF9zZWdtZW50KTogTG9jYWwgYWRkX251bWJlciBpcyBub3cgdmFsdWVULiAgQ29ycmVjdCBzb21lCi0JcmFuZ2UtY2hlY2tpbmcgYnVncy4KLQkocmVsYXhfYWxpZ24pOiBUeXBlIGBpbnQnIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciB0aGUgZXhwb25lbnQuCi0JKGZpeF9uZXcpOiBBcmd1bWVudCBvZmZzZXQgaXMgdHlwZSBvZmZzZXRULiAgTG9jYWxzIHNpemUgYW5kCi0JbmV3c2l6ZSBhcmUgdHlwZSB2YWx1ZVQuCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogRmllbGRzIGZ4X29mZnNldCBhbmQgZnhfYWRkbnVtYmVyIGFyZSBub3cKLQl0eXBlIHZhbHVlVC4KLQkoZml4X25ldyk6IEZpeCBwcm90b3R5cGUuCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBTeW1ib2wgdmFsdWUgaXMgdHlwZSB2YWx1ZVQuCi0JKFNfU0VUX1ZBTFVFLCBTX0dFVF9WQUxVRSk6IExpa2V3aXNlLgotCShTX0lTXyopOiBTcGVjaWZ5IGludCByZXR1cm4gdHlwZSBleHBsaWNpdGx5LgotCSogc3ltYm9scy5oIChzeW1ib2xfbmV3LCBTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBGaXhlZAotCXByb3RvdHlwZXMuCi0JKiByZWFkLmMgKHNfY29tbSk6IFZhbHVlcyByZWFkIGFyZSB0eXBlIHZhbHVlVC4KLQkqIGV4cHIuaCAoZXhwcmVzc2lvblMpOiBGaWVsZCBYX2FkZF9udW1iZXIgaXMgYW4gb2Zmc2V0VC4KLQkqIHRjLmggKG1kX2NyZWF0ZV9sb25nX2p1bXAsIG1kX2NyZWF0ZV9zaG9ydF9qdW1wLAotCW1kX3NlY3Rpb25fYWxpZ24pOiBBZGRyZXNzZXMgYXJlIG5vdyB0eXBlIGFkZHJlc3NULgotCShtZF9udW1iZXJfdG9fY2hhcnMsIG1kX2FwcGx5X2ZpeCk6IFBhc3MgdmFsdWUgYXMgdmFsdWVULgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAsCi0JbWRfbnVtYmVyX3RvX2NoYXJzLCBtZF9zZWN0aW9uX2FsaWduKTogQWRqdXN0ZWQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBJbml0aWFsaXplIGBsZW4nIHZhcmlhYmxlIHRvIG1ha2UKLQlnY2Mgc2h1dCB1cC4KLQkobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAsIG1kX251bWJlcl90b19jaGFycywKLQltZF9zZWN0aW9uX2FsaWduKTogQWRqdXN0ZWQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBQZXJtaXQgdXNlIGZvciBvdGhlciB0aGFuIGEub3V0Ci0JZm9ybWF0LgotCShzX2NvbW1vbik6IEhhbmRsZSBTb2xhcmlzLTIgdmVyc2lvbi4KLQotCSogY29uZmlnL2hvLWdlbmVyaWMuaCAoZnJlZSk6IFJldHVybnMgdm9pZCBpZiBfX1NURENfXy4KLQotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl9mcm9iX3N5bWJvbCwgZWxmX2Zyb2JfZmlsZSwKLQllbGZfZmlsZV9zeW1ib2wpOiBEZWNsYXJlLgotCi0JKiBleHByLmMgKGZsb2F0aW5nX2NvbnN0YW50LCBpbnRlZ2VyX2NvbnN0YW50KTogTm93IHJldHVybiB2b2lkLgotCi1UaHUgSnVsICAxIDEyOjEzOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNYXRjaCBvbiBzcGFyYyotZnVqaXRzdS1ub25lIHJhdGhlciB0aGFuCi0Jc3BhcmNsaXRlKi1mdWppdHN1LW5vbmUuCi0KLVdlZCBKdW4gMzAgMTE6MTI6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGNvbnMpOiBDb25kaXRpb25hbGl6ZSBwYXJzaW5nIG9mIGV4cHJlc3Npb24uICBNb3ZlCi0JcHV0dGluZyB2YWx1ZSBpbnRvIG9iamVjdCBmaWxlIGludG8gc2VwYXJhdGUgZnVuY3Rpb24uICBTZXBhcmF0ZQotCW91dCBNUkkgYW5kIFdBTlRfQklURklFTERTIGNhc2VzIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zLgotCShlbWl0X2V4cHIpOiBOZXcgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSBpbnRvIG9iamVjdCBmaWxlLgotCUNvbmRpdGlvbmFsaXplIG9uIFRDX0NPTlNfRklYX05FVyBhbmQgVENfQ09OU19SRUxPQyByYXRoZXIgdGhhbiBvbgotCXByb2Nlc3NvciB0eXBlcy4KLQkocGFyc2VfYml0ZmllbGRfY29ucyk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSBiaXRmaWVsZCBleHByZXNzaW9ucwotCWFzIHVzZWQgYnkgaTk2MCBhc3NlbWJsZXJzLiAgT25seSBjb21waWxlZCBpZgotCUJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMgaXMgZGVmaW5lZC4KLQkocGFyc2VfbXJpX2NvbnMpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgTVJJIHN0eWxlIHN0cmluZ3MuICBPbmx5Ci0JY29tcGlsZWQgaWYgTVJJIGlzIGRlZmluZWQuCi0JKHBhcnNlX3JlcGVhdF9jb25zKTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIHJlcGVhdCBjb3VudHMuICBPbmx5Ci0JY29tcGlsZWQgaWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMgaXMgZGVmaW5lZC4KLQkqIHJlYWQuaCAoZW1pdF9leHByKTogQWRkZWQgZGVjbGFyYXRpb24gb2YgbmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWEyOWsuaCAoVENfQ09OU19SRUxPQyk6IERlZmluZSB0byBiZSBSRUxPQ18zMi4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChUQ19DT05TX1JFTE9DKTogRGVmaW5lIHRvIGJlIFJfUkVMV09SRC4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhKTogTmV3IGZ1bmN0aW9uIHRvCi0JcGFyc2UgYSBIUFBBIGV4cHJlc3Npb24sIHJhdGhlciB0aGFuIHNwZWNpYWwgY2FzZSBpbiBjb25zCi0JZnVuY3Rpb24uCi0JKGNvbnNfZml4X25ld19ocHBhKTogTmV3IGZ1bmN0aW9uIHRvIGVtaXQgYW4gSFBQQSBmaXh1cCwgcmF0aGVyCi0JdGhhbiBzcGVjaWFsIGNhc2UgaW4gZW1pdF9leHByIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OLCBUQ19DT05TX0ZJWF9ORVcpOgotCURlZmluZSB0byB1c2UgbmV3IGZ1bmN0aW9ucyBmcm9tIHRjLWhwcGEuYy4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMpOiBEZWZpbmUuCi0JKFdBTlRfQklURklFTERTKTogUmVtb3ZlZDsgbm93IG9ic29sZXRlLgotCSogY29uZmlnL3RjLW1pcHMuaCAoUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoY29uc19maXhfbmV3X25zMzJrKTogTmV3IGZ1bmN0aW9uIHRvIGVtaXQgYW4KLQlOUzMySyBmaXh1cCwgcmF0aGVyIHRoYW4gc3BlY2lhbCBjYXNlIGluIGVtaXRfZXhwciBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19DT05TX0ZJWF9ORVcpOiBEZWZpbmUgdG8gYmUKLQljb25zX2ZpeF9uZXdfbnMzMmsuICBBbHNvIHVzZSBQQVJBTVMgcmF0aGVyIHRoYW4gY2hlY2tpbmcKLQlfX1NURENfXy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQ19DT05TX1JFTE9DKTogRGVmaW5lIHRvIFJFTE9DXzMyLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcsIGFkanVzdF9yZWxvY19zeW1zLCB3cml0ZV9jb250ZW50cyk6Ci0JRG9uJ3QgY29yZSBkdW1wIGlmIGdhcyBoYXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgYSBzZWN0aW9uLgotCi1XZWQgSnVuIDMwIDA2OjIxOjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2JlZ2luKTogSWYgc3BhcmN2OSBpcyBkZWZpbmVkLCByZXNldAotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHRvIHY5IGF1dG9tYXRpY2FsbHkuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKTogVXNlIGVsZjY0LXNwYXJjIGZvciB2OS4KLQotCSogY29uZmlnL3RjLXNwYXJjNjQuaCwgY29uZmlnL3RjLXNwYXJjNjQuYzogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluOiBVc2Ugc3BhcmM2NCBjcHUgZmlsZXMgZm9yIHY5LCBhbmQgZGVmYXVsdCB0byBlbGYKLQlmb3JtYXQuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IEFsd2F5cyBmdWxseSBwcm9jZXNzIGEgc2VjdGlvbi4KLQlTZWN0aW9uIHNpemUgaXMgbGFzdCBmcmFnJ3MgKHZtKWFkZHJlc3MgcGx1cyBpdHMgc2l6ZS4gIElmIG5vCi0JcmVsb2NhdGlvbnMgYXJlIHByZXNlbnQsIGZvcmNlIFNFQ19SRUxPQyBmbGFnIGNsZWFyLgotCShkdW1wX3NlY3Rpb25fcmVsb2NzKTogTmV3IGRlYnVnZ2luZyByb3V0aW5lLgotCShhZGp1c3RfcmVsb2Nfc3ltcyk6IE5ldyByb3V0aW5lLCBicm9rZW4gb3V0IGZyb20gd3JpdGVfY29udGVudHMuCi0JRG9uJ3QgYWRqdXN0IHJlbG9jcyB0aGF0IGFyZSBhbHJlYWR5IHJlbGF0aXZlIHRvIHNlY3Rpb24gc3ltYm9sLgotCUxvb2sgZm9yIG9ial9maXhfYWRqdXN0YWJsZSBtYWNybyB0byBrbm93IHdoYXQgZWxzZSB0byBza2lwLAotCWluc3RlYWQgb2Ygb2JqX3dyaXRlX3N5bWJvbC4gIExvb2sgZm9yIHNlY3Rpb24gc3ltYm9sIHN0b3JlZCBpbgotCXNlY3Rpb24gaW5mb3JtYXRpb24uCi0JKHdyaXRlX29iamVjdF9maWxlKTogTWFwIGFkanVzdF9yZWxvY19zeW1zIG92ZXIgYWxsIHNlY3Rpb25zLgotCSh3cml0ZV9jb250ZW50cyk6IENsZWFyIFNFQ19SRUxPQyBmbGFnIGlmIG5vIHJlbG9jYXRpb25zIGFyZQotCWZvdW5kLgotCi0JKiBhcy5oIChfX1BUUl9UT19JTlQsIF9fSU5UX1RPX1BUUik6IE5ldyB2ZXJzaW9ucyBmb3IgU2FiZXIsIHRvCi0Ja2VlcCBpdCBxdWlldC4KLQotCSogd3JpdGUuYyAocmVtb3ZlX3N1YnNlZ3MpOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0KLUZyaSBKdW4gMjUgMTQ6NDI6NTMgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLCBkdmksIGluZm8sIGluc3RhbGwtaW5mbywgY2xlYW4taW5mbyk6IGRvIG5vdAotCSAgZWNobyByZWN1cnNpb24gbGluZXMuCi0JICAoaW5zdGFsbC1pbmZvLCBjbGVhbi1pbmZvKTogY29sbGFwc2UgaW50byB0aGUgZHZpIGFuZCBpbmZvIHJ1bGUuCi0KLUZyaSBKdW4gMjUgMTA6NDc6MjQgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUmVtb3ZlIHN1cHBvcnQgZm9yICVkLyVxIGZwIHJlZ3MuCi0JQWxsIGZwIHJlZ3MgYXJlIG5vdyBzcGVjaWZpZWQgYXMgJWYuCi0JKHByaXZfcmVnX3RhYmxlKTogZnBxIC0+IGZxLgotCi1GcmkgSnVuIDI1IDAzOjQzOjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBhcy5oIChzdHJzdHIpOiBEaXNhYmxlIGRlY2xhcmF0aW9uIGZvciBub3cuCi0JKGZwcmludF92YWx1ZSwgc3ByaW50X3ZhbHVlKTogRGVjbGFyZS4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfbmV3X3Jlc3QpOiBVc2UgbWVtc2V0IHRvIGNsZWFyIG5ldyBmcmFnLgotCShzdWJzZWdfbmV3KSBbQkZEX0FTU0VNQkxFUl06IEluaXRpYWxpemUgYWxsIHNlZ2luZm8gZmllbGRzLgotCi0JKiBleHByLmMgKGV4cHJfcGFydCk6IE1hZGUgc2FuaXR5IGNoZWNrcyBhLm91dC1zcGVjaWZpYy4KLQkoZXhwcik6IERpc2FibGVkIHNhbml0eSBjaGVja3MuCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpIFtCRkRfQVNTRU1CTEVSXTogQWRkIGZpZWxkIGZvcgotCXNlY3Rpb24gc3ltYm9sLgotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogSW5pdGlhbGl6ZSBzZWN0aW9uIHN5bWJvbCBwb2ludGVyCi0Jd2hlbiBzZXR0aW5nIHVwIGEgbmV3IHNlY3Rpb24uCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldykgW0JGRF9BU1NFTUJMRVJdOiBQb2ludCBCRkQgc3ltYm9sJ3MgdWRhdGEKLQlmaWVsZCBiYWNrIGF0IGdhcyBzeW1ib2wgc3RydWN0dXJlLgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2FzdCBvYnN0YWNrX25leHRfZnJlZSB2YWx1ZSB0byBjaGFyKiBiZWZvcmUKLQlkb2luZyBhcml0aG1ldGljIG9uIGl0LgotCSogc3Vic2Vncy5jIChzdWJzZWdfbmV3X3Jlc3QpOiBMaWtld2lzZS4KLQkqIGFzLmggKGZyYWdfbm93X2ZpeCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZmlsZV9zeW1ib2wpOiBVc2Ugc3Vic2VnX25ldyBpbnN0ZWFkIG9mCi0JY2FsbGluZyBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgZGlyZWN0bHksIGFuZCBjYWxsIHN1YnNlZ19zZXQKLQlpbnN0ZWFkIG9mIHN1YnNlZ19jaGFuZ2UuICBOb3cgcmV0dXJucyB2b2lkLgotCShvYmpfZWxmX3dyaXRlX3N5bWJvbCk6IE9ubHkgY2hlY2sgbG9jYWwgc3ltYm9scyBmb3Igbm93LgotCShlbGZfc3RhYl9zeW1ib2wpOiBOb3cgc3RhdGljIGFuZCB2b2lkLCBhbmQgZGlzYWJsZWQgdW50aWwgaXQKLQl3b3JrcyBjb21wbGV0ZWx5LgotCShvYmpfZWxmX3NpemUpOiBGb3IgZXhwcmVzc2lvbiB2YWx1ZXMsIGZhaWwgc2lsZW50bHkgZm9yIG5vdy4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IERvIG5vdGhpbmcuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIKLQlyZWxvY2F0aW9uLgotCShzX2xvY2FsKSBbT0JKX0VMRl06IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKSBbT0JKX0VMRl06IENhbGwgaXQgZm9yICJsb2NhbCIuCi0JKHNfY29tbW9uKTogUmVhcnJhbmdlIHRvIGhhbmRsZSBTb2xhcmlzIC5jb21tb24gcHNldWRvLCB3aGljaCBtYXkKLQlzb21ldGltZXMgdXNlIGJzcyBzcGFjZSBpbnN0ZWFkIG9mIGNvbW1vbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFRBUkdFVF9TWU1CT0xfRklFTERTKTogQWRkIG5ldyBgbG9jYWwnIGZpZWxkLgotCi1UaHUgSnVuIDI0IDE2OjMzOjUzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBzZXQgaG9zdCBjb25maWcgdG8gaHB1eCBmb3IgaHBwYSotaHAtaHB1eAotCi1UaHUgSnVuIDI0IDEzOjM1OjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBhcHAuYyAoYXBwX3BvcCwgYXBwX3B1c2gpOiBGaXggYnVnIHJlcG9ydGVkIGJ5IENocmlzIEFydGh1ci4KLQotVHVlIEp1biAyMiAwMTowNDoyMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzdWJzZWdfbmV3KTogRG9uJ3Qgc3BlY2lhbC1jYXNlIGEub3V0IC1SIGZsYWcgaGVyZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChzX3NlY3QpOiBEbyBpdCBoZXJlLgotCi0JKiBhcy5oIChCQURfQ0FTRSk6IERvbid0IG1ha2Ugc29tZSBsYW1lIGNvbXBpbGVycyB0aGluayB3ZSB3YW50Ci0Jc3Vic3RpdHV0aW9uIGluc2lkZSBzdHJpbmdzLgotCi0JKiBhcy5jIChwcmludF92ZXJzaW9uX2lkKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvZmYgZnJvbSBtYWluLgotCShtYWluKTogQ2FsbCBpdC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wYXJzZV9vcHRpb24pIFtPQkpfRUxGXTogUHJpbnQgdmVyc2lvbiBpZAotCWZvciAtVi4gIElnbm9yZSAtUSBhbmQgLXMgb3B0aW9ucyBmb3Igbm93LgotCi1Nb24gSnVuIDIxIDE3OjM3OjU5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1ha2UgaW5zdGFsbGF0aW9uICYgYnVpbGRzIHdvcmsgYWdhaW4gZm9yIGNyb3NzZXMKLQotU3VuIEp1biAyMCAxODoxODoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IFJld3JpdGUgdG8gcHJpbnQgd2lkZSAoPjMyIGJpdHMpCi0Jc3ltYm9sIHZhbHVlcyBjb3JyZWN0bHkuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGVsZXRlZCB1bnVzZWQgdmFyaWFibGVzLgotCShmaXh1cF9zZWdtZW50KTogVXNlIHNwcmludF92YWx1ZS4KLQotCSogbWVzc2FnZXMuYyAoc3ByaW50X3ZhbHVlLCBmcHJpbnRfdmFsdWUpOiBOZXcgcm91dGluZXMuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zdGFiX3N5bWJvbCk6IE5vdyByZXR1cm5zIHZvaWQuCi0JKG9ial9lbGZfc3RhYl9nZW5lcmljKTogRml4IHR5cG8gaW4gbG9naWMuCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IExvb2sgaW4gLi4vYmZkIGZvciBiZmQuaC4KLQotCSogYXMuaCAoYWRkcmVzc1QsIG9mZnNldFQpOiBOZXcgdHlwZXMsIHVzaW5nIEJGRCB0eXBlcyBpZgotCWF2YWlsYWJsZS4KLQkocmVsYXhfYWRkcmVzc1QsIHN0cnVjdCBmcmFnKTogVXNlIHRoZW0uCi0JKiBzdHJ1Yy1zeW1ib2wuaCAodmFsdWVULCBzdHJ1Y3QgYnJva2VuX3dvcmQpOiBMaWtld2lzZS4KLQotCSogYXMuaCAoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBOYW1lIGFyZ3VtZW50IGlzIGNvbnN0LgotCSogc3Vic2Vncy5jIChzdWJzZWdfbmV3KSBbQkZEX0FTU0VNQkxFUl06IE5hbWUgYXJndW1lbnQgaXMgY29uc3QuCi0KLVRodSBKdW4gMTcgMTY6NTM6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNhbm9uaWNhbGl6ZSBpbnN0YWxsLnNoOyBmb3IgdXNlIHdpdGhpbgotCXRoaXMgZGlyZWN0b3J5IChhbmQgc3ViZGlycykKLQotU3VuIEp1biAyMCAwMjozNDowNCAxOTkzICBBc2hsZXkgU2F1bHNidXJ5IChhbnNAc2ljcy5zZSkKLQotCSogbTg4ay1vcGNvZGUuaCA6IGZpeGVkIHRpbnkgdGlueSBtaXN0YWtlIC0geGNyIHdhcyBpbmNvcnJlY3RseQotCXNwZWNpZmllZCwgc2hvdWxkIGhhdmUgYm90aCBTMSBhbmQgUzIgZmllbGRzIGlkZW50aWNhbAotCUlmIG9ubHkgZmluZGluZyB0aGUgcHJvYmxlbSB3YXMgYXMgZmFzdCBhcyBmaXhpbmcgdGhlIGJ1ZyAhISEhCi0KLVR1ZSBKdW4gMTUgMTY6MDE6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IERvIHdyaXRlIG91dCBub24tbG9hZGFibGUgc2VjdGlvbnMuCi0JRGVidWcgc2VjdGlvbnMgY2FuIGZhbGwgaW4gdGhpcyBjYXRlZ29yeS4KLQotCSogcmVhZC5jIChzX2FwcF9maWxlKTogQ2FsbCBlbGZfZmlsZV9zeW1ib2wgZm9yIEVMRiBmaWxlcy4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9maWxlX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3N0YWJfc3ltYm9sX3N0cmluZyk6IFJlbmFtZWQgZnJvbSBwYV8uLi4sCi0JYWRkZWQgYXJndW1lbnQgdG8gc3BlY2lmeSBzZWN0aW9uIGJhc2UgbmFtZS4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiBSZW5hbWVkIGZyb20gLi4uX3N0YWIuICBOZXcgYXJndW1lbnQKLQlzcGVjaWZpZXMgc2VjdGlvbiBiYXNlIG5hbWUuCi0JKG9ial9lbGZfc3RhYik6IE5ldyBmdW5jdGlvbiwgY2FsbHMgb2JqX2VsZl9zdGFiX2dlbmVyaWMgd2l0aAotCSIuc3RhYiIgYXMgc2VjdGlvbiBiYXNlIG5hbWUuCi0JKG9ial9lbGZfeHN0YWIpOiBOZXcgZnVuY3Rpb24sIGNhbGxzIG9ial9lbGZfc3RhYl9nZW5lcmljLgotCShvYmpfZWxmX3R5cGUpOiBIYW5kbGUgIm9iamVjdCIuICBVc2UgYml0d2lzZS1vciB0byBtZXJnZSBpbgotCXN5bWJvbCBmbGFncyByYXRoZXIgdGhhbiBzaW1wbHkgcmVwbGFjaW5nLCBzbyBnbG9iYWwvbG9jYWwgZmxhZ3MKLQlhcmUgcHJlc2VydmVkLgotCShvYmpfZWxmX2lkZW50KTogUmV3cml0ZS4KLQotVHVlIEp1biAxNSAxNzowMzoyNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQ7IHVzZSBJTlNUQUxMX1hGT1JNCi0KLVdlZCBKdW4gIDkgMTE6MjY6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wc2V1ZG9fdGFibGUpOiAuYWxpZ24gdXNlcyBhIHBvd2VyIG9mIHR3bwotCWZvciBhbnkgYS5vdXQgdGFyZ2V0LCBub3QganVzdCBMaW51eCBhbmQgMzg2QlNELgotCSogY29uZmlnL3RjLWkzODYuaCAoRE9UX0xBQkVMX1BSRUZJWCk6IERvIG5vdCBkZWZpbmUgZm9yIGFueSBhLm91dAotCXRhcmdldC4KLQotTW9uIEp1biAgNyAxMzozMzoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tODhrLmM6IERvbid0IGluY2x1ZGUgZmxvbnVtLmgsIG1kLmgsIG04OGsuaC4gIFRoZXkKLQlkb24ndCBleGlzdCBvciBkdXBsaWNhdGUgb3RoZXIgaW5jbHVzaW9ucy4KLQotCSogY29uZmlnL3RjLXZheC5oIChOT19SRUxPQyk6IERlZmluZS4KLQotTW9uIEp1biAgNyAwOTo1NTowMyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBGaXggcGFyc2luZyBvZiBhc2kgbnVtYmVyLgotCUZpeCBlcnJvciBtZXNzYWdlLgotCi1TYXQgSnVuICA1IDE5OjMyOjUyIDE5OTMgIFRvcmJqb3JuIEdyYW5sdW5kICAodGVnZUBuYWRhLmt0aC5zZSkKLQotCSogZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oIChtODhrX29wY29kZXMpOiBBZGQgODgxMTAgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL2NvbmZpZy90Yy1tODhrLmMgKGdldF9yZWcpOiBOZXcgYXJnIHJlZ19wcmVmaXguICBDb21wYXJlIGZpcnN0Ci0JY2hhciB0byByZWdfcHJlZml4IGluc3RlYWQgb2YgdG8gJ3InLgotCShjYWxjb3ApOiBDaGFuZ2UgY2FsbHMgdG8gZ2V0X3JlZy4KLQkoY2FsY29wKTogSGFuZGxlIG5ldyBjYXNlICd4JyB0byBzZXQgcmVnX3ByZWZpeC4KLQkoY2FsY29wKTogU2V0IHJlZ19wcmVmaXggdG8gJ3InIGFmdGVyIGVhY2ggY2FsbCB0byBnZXRfcmVnLgotCShjbXBzbG90KTogQWRkIDg4MTEwIGNvbmRpdGlvbnMuCi0KLQkqIGdhcy9jb25maWcvbTg4ay1vcGNvZGUuaDogU3dhcCBjYXNlcyBmb3IgInJvdCIgZm9yIGNvbnNpc3RlbmN5LgotCi0JKiBnYXMvY29uZmlnL3RjLW04OGsuYyAoZ2V0X2JmKTogQWx3YXlzIHJlc3RvcmUgaW5wdXRfbGluZV9wb2ludGVyCi0JYmVmb3JlIHJldHVybmluZy4KLQotCSogZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oIChtODhrX29wY29kZXMpOiBNYWtlIGVxdWFsIG1uZW1vbmljcwotCWFkamFjZW50OyBtb3YucyBhbmQgbW92LmQgc3dhcHBlZC4KLQkobTg4a19vcGNvZGVzKTogRml4IHR5cG8gYHIyJyAtPiBgMicuCi0KLUZyaSBKdW4gIDQgMTU6NTk6MzEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2g4MzAwLmM6IFN1cHBvcnQgZm9yIEg4LzMwMC1IIG9wY29kZXMuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jICh3X3N0cmluZ3MpOiBTdHJpbmcgdGFibGUgbGVuZ3RoIGlzIDQKLQlieXRlcywgbm8gbWF0dGVyIHdoYXQgdGhlIGhvc3QgaW50IHNpemUgaXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1vc2YqKTogTmV3LgotCi1GcmkgSnVuICA0IDA3OjUxOjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotZWNvZmZsKik6IE5ldyB0YXJnZXQ7IHVzZSBlY29mZiBhbmQKLQltaXBzLWxpdC4KLQkobWlwcy0qLWVjb2ZmKik6IEFkZGVkIHRyYWlsaW5nICcqJy4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9wcm9jcyk6IEZvcmNlIHRoZSBhZHIgb2YgdGhlCi0JZmlyc3QgRkRSIGluIGEgZmlsZSB0byBiZSB6ZXJvLgotCi1UaHUgSnVuICAzIDE0OjA5OjU5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBKdW1wIHRvIDIuMS40LgotCi0JKiBjb25maWcvaG8taHBwYWJzZC5oOiBOZXcgZmlsZSwgZnJvbSBQZXRlciBIb29nZW5ib29tLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hc3NlbWJsZSk6IENhbGwgYmZkX3NldF9ncF9zaXplIG9ubHkgZm9yCi0JRUNPRkYgZm9ybWF0LgotCi1UdWUgSnVuICAxIDE1OjIxOjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXNzZW1ibGUpOiBUaGUgNjgwNDAgY3B1IGRvZXNuJ3Qgd2FudCBhCi0Jc2VwYXJhdGUgJzg1MSBtbXUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMsIGNvbmZpZy9vYmotZWxmLmg6IFVwZGF0ZSBmb3IgbmV3IHR5cGUsIG1hY3JvLAotCWFuZCByb3V0aW5lIG5hbWVzLiAgQXNzdW1pbmcgMzIgYml0cyBmb3Igbm93LgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogTG9vayBmb3IgbWFjcm8KLQllbGZfdGNfZmluYWxfcHJvY2Vzc2luZ19ob29rLCBpbnN0ZWFkIG9mIGFzc3VtaW5nIGEgZnVuY3Rpb24KLQlhbHdheXMgZXhpc3RzLgotCSogY29uZmlnL3RjLWhwcGEuYyAoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZ19ob29rKTogUmVuYW1lZCBmcm9tCi0JdGNfZmluYWxfcHJvY2Vzc2luZ19ob29rLgotCSogY29uZmlnL3RjLWhwcGEuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vayk6IFVzZSBpdC4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoZWxmX3RjX3N5bWJvbCwgZWxmX3RjX21ha2Vfc2VjdGlvbnMpOiBNYWNyb3MKLQltb3ZlZCBoZXJlIGZyb20gb2JqLWVsZi5oLgotCSogY29uZmlnL29iai1lbGYuaDogRG9uJ3QgaW5jbHVkZSBDUFUtc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCi1TdW4gTWF5IDMwIDE2OjQ5OjM3IDE5OTMgIFBldGVyIEhvb2dlbmJvb20gIChob29nZW5AZmFzdC5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmF0aW9ucyBzaG91bGQgbWF0Y2ggb24gJ2hwcGEqJyBub3QgJ2hwcGEnLgotCi0JKiByZWFkLmM6IEFkZCBzdXBwb3J0IGZvciBIUFBBIGFzc2VtYmx5IGxhbmd1YWdlIHN5bnRheCAoZGVub3RlZAotCXdpdGggJyNpZmRlZiBUQ19IUFBBJykuCi0KLQkqIHN5bWJvbHMuYzogQWRkIHN1cHBvcnQgZm9yIEhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4IChkZW5vdGVkCi0Jd2l0aCAnI2lmZGVmIFRDX0hQUEEnKS4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiAgQWRkIHN1cHBvcnQgZm9yIEhQUEEtc3R5bGUKLQlyZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL29iai1lbGYuYzogU3RhYiBzeW1ib2xzIHdlcmVuJ3Qgd3JpdHRlbiBwcm9wZXJseS4KLQkob2JqX2VsZl92ZXJzaW9uKToKLQkob2JqX2VsZl9kZXNjKToKLQkob2JqX2VsZl93cml0ZV9zeW1ib2wpOgotCShvYmpfZWxmX3dyaXRlX3N5bWJvbF9wKToKLQkob2JqX2VsZl9mcm9iX3N5bWJvbCk6Ci0JKGVsZl9zdGFiX3N5bWJvbCk6Ci0JKGVsZl9mcm9iX2ZpbGUpOgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBTdXBwb3J0IGZvciBIUFBBIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMuCi0JUmVtb3ZlIHNvbWUgdW51c2VkIGNvZGUuICBTdXBwb3J0IGZvciBIUFBBIGFzc2VtYmx5IGxhbmd1YWdlCi0Jc3ludGF4LgotCi0JKiBhcHAuYzoKLQotCSogc3ltYm9scy5jOgotCi0JKiBjb25maWcvb2JqLWVsZi5oOgotCShvYmpfd3JpdGVfc3ltYm9sKToKLQkob2JqX2Zyb2JfZmlsZSk6Ci0JKGVsZl90Y19zeW1ib2wpOgotCShlbGZfdGNfbWFrZV9zZWN0aW9ucyk6Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6Ci0KLVN1biBNYXkgMzAgMjE6NDQ6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3JlYWRfYmVnaW5faG9vaywgYWRkX2ZpbGUpOiBBc3N1bWUKLQloYXNoX25ldyB3aWxsIGhhdmUgc3VjY2VlZGVkIGlmIGl0IHJldHVybnMuCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9iZWdpbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19hb3V0X2ZpeF90b19jaGFycyk6IE5vdyBuYnl0ZXNfcl9sZW5ndGggaXMKLQljb25zdC4KLQkobW9kZV9mcm9tX2Rpc3Bfc2l6ZSwgb3Bjb2RlX3N1ZmZpY190b190eXBlKTogTm93IGlubGluZSB1bmRlcgotCWdjYy4KLQkoZml0c19pbl97c2lnbmVkLHVuc2lnbmVkfV97Ynl0ZSx3b3JkfSk6IExpa2V3aXNlLgotCi0JKiBleHByLmM6IERlbGV0ZSByZWdpc3RlciBkZWNsYXJhdGlvbnM7IGdjYyBpZ25vcmVzIHRoZW0gYW55d2F5cy4KLQotRnJpIE1heSAyOCAxOTowMzozMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhhc2guYyAoaGFzaF9uZXcpOiBVc2UgeG1hbGxvYywgc2luY2UgbWFueSBjYWxsZXJzIGRvbid0IGNoZWNrCi0JZm9yIGZhaWx1cmUuCi0KLVRodSBNYXkgMjcgMTM6MDI6MTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBmcmFncy5jICh6ZXJvX2FkZHJlc3NfZnJhZywgYnNzX2FkZHJlc3NfZnJhZyk6IFRoZXNlIGFyZQotCWV4dGVybmFsLgotCi0JKiB0Yy5oIChtZF9yZWxvY19zaXplKTogVGhpcyBpcyBjb25zdC4KLQkqIGNvbmZpZy90Yy17YTI5ayxoODMwMCxoODUwMCxpMzg2LGk4NjAsaTk2MCxtNjhrLG5zMzJrLHo4a30uYwotCShtZF9yZWxvY19zaXplKTogTm93IGNvbnN0LgotCi0JKiBjb25maWcvYW91dF9nbnUuaCAoZW51bSBtYWNoaW5lX3R5cGUsIGVudW0gcmVsb2NfdHlwZSk6IERlbGV0ZQotCXRyYWlsaW5nIGNvbW1hcy4KLQkqIGFzLmggKGVudW0gX3NlZ1QpOiBEaXR0by4KLQotCSogc3RydWMtc3ltYm9sLmggKE5fVFlQRV9zZWcpOiBUaGlzIHNob3VsZCBiZSBjb25zdC4KLQotVGh1IE1heSAyNyAxMTo0Mzo1OSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogY29uZmlnL29iai1lY29mZi5jIChhZGRfZmlsZSk6IENhc3QgZmlsZV9uYW1lIHRvIGNoYXIgKiBpbgotCWxpc3Rpbmdfc291cmNlX2ZpbGUgY2FsbC4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3N0YWJfc3ltYm9sX3N0cmluZyk6IENhc3QgZmlyc3QgYXJndW1lbnQKLQlvZiBzdWJzZWdfbmV3IGNhbGwgdG8gZWxpbWluYXRlIGNvbnN0IGF0dHJpYnV0ZS4KLQkob2JqX2VsZl9zdGFiKTogRGl0dG8uCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBDYXN0IGZpcnN0IGFyZ3VtZW50IG9mIGJ6ZXJvIGNhbGwgdG8gY2hhciAqLgotCi0JKiByZWFkLmMgKHNfYWxpZ25fYnl0ZXMpOiBQcm9wZXJseSByZWNvcmQgYWxpZ25tZW50LgotCi0JKiBleHByLmMgKF9fKTogVW5kZWZpbmUgX18gbWFjcm8gYmVmb3JlIHVzZSwgc2luY2UgT1NGLzEgdXNlcyBpdAotCWZvciB0aGUgcHJvdG90eXBlL25vIHByb3RvdHlwZSBtYWNyby4KLQotCSogYXMuYyAoZ290X3NpZyk6IERvbid0IGRvIHJldHVybiAoKFNJR1RZKSAwKSwgU0lHVFkgbWlnaHQgd2VsbCBiZQotCXZvaWQuCi0KLQkqIGFzLmggKHJlbGF4X3N0YXRlVCBlbnVtKTogRGVsZXRlIHRyYWlsaW5nIGNvbW1hLgotCi1UaHUgTWF5IDI3IDExOjA3OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogTGV0IGxpbmVfY29tbWVudF9jaGFycyBvdmVycmlkZQotCWNvbW1lbnRfY2hhcnMuCi0JKGRvX3NjcnViX25leHRfY2hhcik6IElmIGEgbGluZSBjb21tZW50IGNoYXJhY3RlciBpcyBub3QgYXQgdGhlCi0Jc3RhcnQgb2YgYSBsaW5lLCB0cmVhdCBpdCBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyIGlmIGl0IGlzIG9uZS4KLQlGb3IgYSBDUFAgbGluZSBjb21tZW50IHVzZSBwc2V1ZG8tb3AgLmFwcGxpbmUgcmF0aGVyIHRoYW4gLmxpbmUuCi0JKiBpbnB1dC1zY3J1Yi5jIChsb2dpY2FsX2lucHV0X2xpbmUpOiBNYWtlIGludCByYXRoZXIgdGhhbgotCXVuc2lnbmVkLgotCShpbnB1dF9zY3J1Yl9wdXNoLCBpbnB1dF9zY3J1Yl9iZWdpbik6IEluaXRpYWxpemUKLQlsb2dpY2FsX2lucHV0X2xpbmUgdG8gLTEgcmF0aGVyIHRoYW4gMC4KLQkoYnVtcF9saW5lX2NvdW50ZXJzKTogSW5jcmVtZW50IGxvZ2ljYWxfaW5wdXRfbGluZS4KLQkobmV3X2xvZ2ljYWxfbGluZSk6IElmIGxpbmVfbnVtYmVyIGlzIC0yLCBkZWNyZW1lbnQKLQlsb2dpY2FsX2lucHV0X2xpbmUuCi0JKGFzX3doZXJlKTogVXNlIGxvZ2ljYWxfaW5wdXRfbGluZSBldmVuIGlmIGl0IGlzIDAuCi0JKiByZWFkLmggKHNfYXBwX2ZpbGUgcHJvdG90eXBlKTogTm93IHRha2VzIGFuIGludCBhcmd1bWVudC4KLQkqIHJlYWQuYyAocG90YWJsZSk6IE1ha2UgLmFwcGZpbGUgY2FsbCBzX2FwcF9maWxlIHdpdGggMS4gIE5ldwotCS5hcHBsaW5lIHBzZXVkby1vcCBjYWxscyBzX2FwcF9saW5lLgotCShzX2FwcF9maWxlKTogSWYgLmFwcGZpbGUsIGNhbGwgbmV3X2xvZ2ljYWxfbGluZSB3aXRoIC0yIHRvCi0JYWNjb3VudCBmb3IgbmV3bGluZSBpbnNlcnRlZCBieSBkb19zY3J1Yl9uZXh0X2NoYXIuICBJZiBsaXN0aW5nLAotCWNhbGwgbGlzdGluZ19zb3VyY2VfZmlsZS4KLQkoc19hcHBfbGluZSk6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgZmFrZSBwc2V1ZG8tb3AgLmFwcGxpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX3BzZXVkb190YWJsZSk6IE1ha2UgLmFwcGxpbmUgY2FsbAotCW9ial9jb2ZmX2xuLgotCShvYmpfY29mZl9sbik6IEFkZGVkIGFyZ3VtZW50IHRvIGluZGljYXRlIHdoZXRoZXIgLmFwcGxpbmUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX3BzZXVkb190YWJsZSk6IE1ha2UgLmFwcGxpbmUgY2FsbAotCW9ial9jb2ZmX2xuLgotCShvYmpfY29mZl9sbik6IEFkZGVkIGFyZ3VtZW50IHRvIGluZGljYXRlIHdoZXRoZXIgLmFwcGxpbmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2ZpbGUpOiBQYXNzIGFyZ3VtZW50IHRvIHNfYXBwX2ZpbGUuCi0KLVR1ZSBNYXkgMjUgMTE6NTk6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoU19HRVRfVkFMVUUpOiBSZW1vdmVkIHVubmVjZXNzYXJ5IGNhc3QuCi0KLVRodSBNYXkgMjAgMTk6MTQ6MjQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IFN0cmFpZ2h0ZW4gb3V0IGNoZWNrIGZvcgotCWludmFsaWQgdmFsdWVzLgotCi1XZWQgTWF5IDE5IDA3OjMzOjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oNTAwMC5jIChidWlsZF9ieXRlcyk6IFVuZGVyc3RhbmQgQHJkIG1vZGUgYW5kIGJ1aWxkCi0JcmVsb2NhdGlvbnMgY29ycmVjdGx5LgotCi1Nb24gTWF5IDE3IDE1OjA2OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IExlYXZlIG91dCBURVhJMkRWSSBmb3Igbm93LCBiZWNhdXNlCi0JaXQncyB3cm9uZy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBBcHBseSByYW5nZSBjaGVja3MgYW5kIHdhcm4KLQlpZiB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuCi0KLQlQYXRjaCBmcm9tIE1pbmggVHJhbi1MZToKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IEZvciBpbi9vdXQgcG9ydCByZWdpc3RlciB1c2VkCi0JYXMgYmFzZSByZWcsIGluY2x1ZGUgSW5PdXRQb3J0UmVnIGluIG9wZXJhbmQgdHlwZS4KLQkoTUFUQ0gpOiBBY2NlcHQgb3ZlcmxhcCB2YWx1ZSBvZiBJbk91dFBvcnRSZWcuCi0KLU1vbiBNYXkgMTcgMDk6Mjk6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGFkZF9maWxlLCBvYmpfZWNvZmZfbG9jLCBvYmpfZWNvZmZfc3RhYik6Ci0JQWRkIGNhbGxzIHRvIGxpc3Rpbmcgcm91dGluZXMgdG8gcHJvZHVjZSBjb21iaW5lZCBzb3VyY2UvYXNzZW1ibGVyCi0JbGlzdGluZ3MuCi0JKG9ial9lY29mZl9zdGFiKTogQ3JlYXRlIGEgZmlsZSBwb2ludGVyIGlmIG5vbmUgdXNlZCB5ZXQuCi0JKGVjb2ZmX2Zyb2JfZmlsZSk6IFNldCBzeW1jb3VudCB0byBjb3JyZWN0IHZhbHVlLgotCi1GcmkgTWF5IDE0IDA2OjUzOjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdG8gdmVyc2lvbiAyLjEsIGluIHByZXBhcmF0aW9uIGZvcgotCXJlbGVhc2UuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChIX0dFVF9IRUFERVJfU0laRSwgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUpOgotCURlZmluZSBpbiB0ZXJtcyBvZiBjb25zdGFudHMsIG5vdCBDIHN0cnVjdHVyZSBzaXplcy4KLQotCSogY29uZmlnL3RjLXJzNjAwMC5jLCBjb25maWcvdGMtcnM2MDAwLmg6IERlbGV0ZSBlbXB0eSBmaWxlcy4KLQotVGh1IE1heSAxMyAxNzowMTo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfaGVhZGVyX2FwcGVuZCk6IERvbid0IGRlZmluZSBpZiBpdCdzCi0JZGVmaW5lZCBhcyBhIG1hY3JvLgotCSogY29uZmlnL29iai1ocDMwMC5oIChvYmpfaGVhZGVyX2FwcGVuZCk6IERlZmluZSBpdCBhcyBhIG1hY3JvLgotCSogY29uZmlnL29iai1ocDMwMC5jIChocDMwMF9oZWFkZXJfYXBwZW5kKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG9uJ3QgYm90aGVyIGNsZWFuaW5nIHVwIGRvYyBmaWxlczsKLQl0aGV5IGFyZW4ndCBnb2luZyB0byBiZSBpbiB0aGlzIGRpcmVjdG9yeS4KLQotVGh1IE1heSAxMyAwNzo1MTozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEhhbmRsZSBhYnNvbHV0ZQotCXN5bWJvbHMuCi0KLQkqIHRjLmggKFRDX0NPRkZfU0laRU1BQ0hERVApOiBEb24ndCBkZWZpbmUgaGVyZS4KLQkqIGNvbmZpZy90Yy1zaC5oIChUQ19DT0ZGX1NJWkVNQUNIREVQKTogRGVmaW5lIGhlcmUgaW5zdGVhZC4KLQotTW9uIE1heSAxMCAwNjowMToxMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1N5bWJvbF90eXBlX2xpc3QpOiBEb24ndCBib3RoZXIgd2l0aAotCWluaXRpYWxpemF0aW9uLgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldHMpOiBUcmVhdCBtNjgqLSotc3lzdiogbGlrZSBtNjhrLSotY29mZi4KLQotV2VkIE1heSAgNSAxNDowMDo0OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQ29ycmVjdCBmbG9hdGluZyBwb2ludCBkb3VibGUgd29yZAotCWxvYWRzIGFuZCBzdG9yZXMgZm9yIGJpZyBlbmRpYW4gdGFyZ2V0LgotCi1XZWQgTWF5ICA1IDA4OjM5OjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSZXBsYWNlIFNFR18qIHdpdGggKl9zZWN0aW9uLCBmaXggdXAgc3Vic2VnXyoKLQljYWxscy4gIERlbGV0ZWQgc29tZSB1bnVzZWQgY29kZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBMaWtld2lzZS4KLQotCUVMRiBzdXBwb3J0LCBtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXRhaDoKLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbiwgb2JqX2VsZl9zdGFiLCBvYmpfZWxmX2xpbmUsCi0Jb2JqX2VsZl90eXBlKTogUmV3cml0ZS4KLQkob2JqX2VsZl9mcm9iX3N5bWJvbCwgZWxmX3N0YWJfc3ltYm9sX3N0cmluZywgZWxmX3N0YWJfc3ltYm9sLAotCW9ial9lbGZfZGVzYywgb2JqX2VsZl92ZXJzaW9uLCBvYmpfc3ltYm9sX25ld19ob29rLCBvYmpfZWxmX3NpemUpOgotCU5ldyBmdW5jdGlvbnMuCi0JKG9ial9lbGZfaWRlbnQpOiBEdW1teS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKEZBTFNFLCBUUlVFLCBTXyosIHRjX2Zyb2Jfc3ltYm9sLAotCVRBUkdFVF9TWU1CT0xfRklFTERTKTogTmV3IG1hY3Jvcy4KLQkoZ2RiX3NlY3Rpb24pOiBOZXcgdmFyaWFibGUgZGVjbC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXRvZik6IFJldHVybiB6ZXJvLCBub3QgZW1wdHkgc3RyaW5nLCBvbgotCXN1Y2Nlc3MuCi0KLQlCRkRfQVNTRU1CTEVSIGNvbmRpdGlvbmFsIGNoYW5nZXM6Ci0JKiBjb25maWcvb2JqLWNvZmYuYyAobGluZW5vX3Jvb3RQLCBzZWdfTl9UWVBFLCAqX3NlY3Rpb25faGVhZGVyKToKLQlEb24ndCBkZWZpbmUgdGhlc2UuCi0JKFNBX1NFVF9TWU1fRU5ETkRYLCBTQV9TRVRfU1lNX1RBR05EWCk6IE5ldyBmdW5jdGlvbnMuCi0JKGZldGNoX2NvZmZfZGVidWdfc2VjdGlvbik6IERpdHRvLgotCShvYmpfY29mZl9lbmRlZik6IENhbGwgZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uLgotCShzdHJ1Y3QgbGluZV9ubyk6IE5ldyB0eXBlLgotCShjX3N5bWJvbF9tZXJnZSk6IE5ldyB3YXkgZm9yIGNvcHlpbmcgYXV4IGZpZWxkcy4KLQkoY19kb3RfZmlsZV9zeW1ib2wpOiBQdXQgc3ltYm9sIGluIGFic29sdXRlIHNlY3Rpb24sIGFuZCBzZXQgZmxhZwotCUJTRl9ERUJVR0dJTkcuCi0JKGZ1bmN0aW9uX2xpbmVvZmYpOiBOZXcgc3ltYm9sLgotCShmdW5jdGlvbl9saW5lb2ZmLCB0ZXh0X2xpbmVub19udW1iZXIsIG91cl9saW5lbm9fbnVtYmVyLAotCWxpbmVub19sYXN0UCk6IERvbid0IGRlZmluZS4KLQkoY19saW5lX25ldyk6IERvbid0IGRlZmluZS4KLQkob2JqX2VtaXRfbGluZW5vLCBvYmpfY29mZl9lbmRlZik6IFVzZSBhYm9ydCBjYWxscyBhcywgdWgsCi0JcGxhY2Vob2xkZXJzLCB1bnRpbAotCWxpbmUtbnVtYmVyIHJlY29yZGluZyBnZXRzIGltcGxlbWVudGVkLgotCShvYmpfbmV3X3N5bWJvbF9ob29rKTogTmV3IGNvZGUgZm9yIGhhbmRsaW5nIGF1eCBmaWVsZHMuCi0JKGFkZF9saW5lbm8sIGFkZF9saW5lc3ltKTogTmV3IGZ1bmN0aW9ucy4KLQkob2JqX2NvZmZfbG4pOiBDYWxsIGFkZF9saW5lbm8sIG5vdCBjX2xpbmVfbmV3LgotCShvYmpfY29mZl9lbmRlZik6IE5ldyBjb2RlIGZvciBoYW5kbGluZyBzeW1ib2wgbmFtZXMuICBOZXcgbGluZW5vCi0JY29kZS4gIExvb2sgZm9yIHNlY3Rpb24gbmFtZSAiKkRFQlVHKiIgZm9yIGRlYnVnZ2luZyBzZWN0aW9uLgotCShhbGlnbiwgY29mZl9jaGVja19maWxlX3N5bWJvbHMsIG9ial9jb2ZmX3NlY3Rpb24sCi0JY29mZl9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1jb2ZmLmg6IFJlb3JkZXJlZCBzb21lIGluY2x1ZGVzLgotCShCWVRFX09SREVSSU5HLCBGSUxFX0hFQURFUl9NQUdJQywgc2VnX05fVFlQRSwgTl9UWVBFX3NlZywKLQlERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUsIEFPVVRIRFIsIEFPVVRIRFJTSVpFKTogRG9uJ3QKLQlkZWZpbmUgdGhlc2UuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTLCBJOTYwX1NZTV9GSUVMRFMpOiBOZXcgbWFjcm9zLgotCShTWU1fQVVYRU5UKTogTmV3IG1hY3JvIChmb3Igbm9uLUJGRF9BU1NFTUJMRVIgdG9vKSBmb3IgYWNjZXNzaW5nCi0JYXV4IGVudHJpZXMuICBNb3N0IFNBXyogbWFjcm9zIG5vdyB1c2UgaXQgdW5jb25kaXRpb25hbGx5LgotCShTXyopOiBVc2UgYGJzeW0nIGZpZWxkLCBhbmQgYWNjZXNzIEJGRCBwcml2YXRlIGRhdGEuCi0JKFNGXyopOiBVc2UgYHN5X2ZsYWdzJyBzeW1ib2wgZmllbGQgZm9yIG1vc3Qgb2YgdGhlc2UuCi0JKEhfKiwgb2JqZWN0X2hlYWRlcnMsIGxpbmVubywgbGluZW5vXypQLCBPQkpfRU1JVF9MSU5FTk8pOiBEb24ndAotCWRlZmluZS4KLQkoKl9zZWN0aW9uX2hlYWRlcik6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2NvbnZlcnRfZnJhZywgbWRfYXBwbHlfZml4KTogQ2hhbmdlZAotCWludGVyZmFjZS4KLQkodGNfZ2VuX3JlbG9jKSBbSTM4NkNPRkZdOiBOZXcgZnVuY3Rpb24uCi0JKHRjX2FvdXRfZml4X3RvX2NoYXJzLCB0Y19jb2ZmX2ZpeDJydHlwZSk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRBUkdFVF9BUkNILCBUQVJHRVRfQllURVNfQklHX0VORElBTik6IE5ldwotCW1hY3Jvcy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHN0YWNrX2luaXQpOiBEb24ndCBkbyBhc3NpZ25tZW50cyBpbnNpZGUKLQljb25kaXRpb25zLgotCShvYmpfY29mZl9kZWYpOiBTaW1wbGlmaWVkIGhhbmRsaW5nIG9mIHN5bWJvbCBuYW1lIGEgYml0LgotCSh0YWdfaW5zZXJ0KTogTmFtZSBhcmd1bWVudCBpcyBub3cgcG9pbnRlciB0byBDT05TVC4KLQkob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IENvbW1lbnRlZCBvdXQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBVc2UgUEFSQU1TIG1hY3JvIGluIHByb3RvdHlwZXMuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZykgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBpbmRpcmVjdAotCXRocm91Z2ggZnJjaGFpblAgcG9pbnRlciBpZiBpdCBpcyBudWxsLgotCi0JKiBjb25maWd1cmUuaW46IFdhcm4gaWYgQkZEIG1vZGUgaXMgZXhwbGljaXRseSB0dXJuZWQgb2ZmIGJ1dCBpcwotCXJlcXVpcmVkIGJ5IHNwZWNpZmllZCB0YXJnZXQuCi0JKG1pcHMgZWNvZmYgdGFyZ2V0cyk6IERvbid0IG5lZWQgdG8gc2V0IGJmZF9nYXMgaGVyZTsgaXQgZ2V0cwotCXRha2VuIGNhcmUgb2YgbGF0ZXIuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChjcmF3bF9zeW1ib2xzKTogRG9uJ3QgY2xlYXIgc3lfZm9yd2FyZAotCWZpZWxkLgotCSh5YW5rX3N5bWJvbHMpOiBNZXJnZSBzeW1ib2xzIG9ubHkgaWYgc3lfZm9yd2FyZCBpcyBudWxsLgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChBT1VUX01BQ0hUWVBFKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkKLQlkZWZpbmVkLgotCi0JKiB0Yy5oIChtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogU2VjdGlvbiBhcmcgaXMgbm90Ci0JcG9pbnRlci4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBEaXR0by4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKExPQ0FMX0xBQkVMKSBbT0JKX0VMRl06IEFueXRoaW5nIHN0YXJ0aW5nCi0Jd2l0aCAiLiIgaXMgYSBsb2NhbCBsYWJlbC4KLQotCSogY29uZmlnL3RlLWhwcGEuaCwgY29uZmlnL3RjLWhwcGEuaCwgY29uZmlnL3RjLWhwcGEuYzogTmV3IGNvbmZpZwotCWZpbGVzLgotCi0JKiBjb25maWcvdGUtbGludXguaCwgY29uZmlnL3RlLTM4NmJzZC5oOiBOZXcgY29uZmlnIGZpbGVzLgotCSogY29uZmlndXJlLmluIChpMzg2LSotbGludXgsIGkzODYtKi1ic2QpOiBVc2UgdGhlbS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRBUkdFVF9GT1JNQVQpOiBTZWxlY3QgZm9ybWF0IGJhc2VkIG9uIHRhcmdldAotCWVudmlyb25tZW50LgotCShET1RfTEFCRUxfUFJFRklYKTogRG9uJ3QgZGVmaW5lIGZvciAzODZic2Qgb3IgTGludXguCi0KLVdlZCBNYXkgIDUgMTM6MTQ6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGluaXRfZmlsZSk6IFNldCBmTWVyZ2UgdG8gMCBzaW5jZSBkYnggc2VlbXMKLQl0byB3YW50IGl0IHRoYXQgd2F5LgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogVHVybiBsb2NhbCBzdF9Qcm9jIHN5bWJvbHMgaW50bwotCXN0X1N0YXRpY1Byb2Mgc3ltYm9scy4gIFNldCBpbmRleCBmaWVsZCBvZiBleHRlcm5hbCBzdF9Qcm9jIGFuZAotCXN0X3N0YXRpY1Byb2Mgc3ltYm9scyBjb3JyZWN0bHkuCi0JKiBjb25maWcvdGMtbWlwcy5oIChOT19MSVNUSU5HKTogRG9uJ3QgZGVmaW5lLiAgUGVvcGxlIG1pZ2h0IHdhbnQKLQlsaXN0aW5ncy4KLQotVHVlIE1heSAgNCAyMToyMjo1NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotaHAzMDAuaCwgY29uZmlnL29iai1ocDMwMC5jLCBjb25maWcvdGUtaHAzMDAuaDogTmV3Ci0JZmlsZXMuCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1ocHV4KTogVXNlIHRoZW0uCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfcHJlX3dyaXRlX2hvb2spOiBVc2UgQU9VVF9WRVJTSU9OIGlmCi0JZGVmaW5lZCwgb3RoZXJ3aXNlIHplcm8uCi0KLQkqIGNvbmZpZy9hb3V0X2dudS5oIChPTUFHSUMpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCi1Nb24gTWF5ICAzIDE1OjU5OjMyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBbGxvdyBhbnkgYWJzIGV4cHJlc3Npb24gYXMgYW4KLQlhZGRyZXNzIHNwYWNlIG51bWJlci4KLQotV2VkIEFwciAyOCAxOToxMToyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmggKFRBUkdFVF9ERUZBVUxUKTogRG9uJ3QgZGVmYXVsdCB0aGlzIGF0IGFsbC4KLQotCSogY29uZmlnL3RjLWEyOWsuYzogSW5jbHVkZSBjdHlwZS5oLgotCShkZWZpbmVfc29tZV9yZWdzKTogQWRkZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVycyBmb3IgMjkwNTAuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGNvbW1lbnRfY2hhcnMpIFtURV9JMzg2QUlYXTogSW5jbHVkZSAiLyIuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBEb24ndCBzZXQgU1RZUF9SRUcgaGVyZS4KLQkoY2hhbmdlX3RvX3NlY3Rpb24pOiBTZXQgaXQgaGVyZSBpbnN0ZWFkLgotCi1XZWQgQXByIDI4IDEzOjQwOjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IE1ha2UgdXAgYSAuZmlsZSBpZiBvbmUKLQloYXNuJ3QgYmVlbiBzZWVuIHlldC4KLQkoYWRkX2Vjb2ZmX3N5bWJvbCk6IERvbid0IHJlZmVyIHRvIGN1cl9maWxlX3B0ciBpZiBpdCBpcyBOVUxMLgotCi1Nb24gQXByIDI2IDE4OjI5OjA1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc2guY2gsIGNvbmZpZy90Yy1zaC5oOiBOZXcgZmlsZXMgc3VwcG9ydGluZyBIaXRhY2hpCi0JU0guCi0KLU1vbiBBcHIgMjYgMTI6Mjg6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBGaXggdW5hcnkgcGx1cyBvcGVyYXRvciAocHJldmlvdXNseSB3YXMgdGhlCi0Jc2FtZSBhcyAnficgb3BlcmF0b3IhKS4KLQotV2VkIEFwciAyMSAwMDoyMDoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBEZWZpbmUgZXZlbiBpZiBCRkQgaXMgZGVmaW5lZC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEbyBkZWZpbmUgaWYgQkZEX0FTU0VNQkxFUi4gIEludm9rZQotCW9ial9jaGVja19maWxlX3N5bWJvbHMgaWYgZGVmaW5lZC4gIENhbGwgdmVyaWZ5X3N5bWJvbF9jaGFpbl8yCi0JaW5zdGVhZCBvZiBvcGVuLWNvZGluZyBpdC4gIEZpeCBzb21lIGJ1Z3MgaW4gcGF0Y2hpbmcgdXAgc3ltYm9sCi0JY2hhaW4uCi0JKHJlbGF4X3NlZ21lbnQpOiBNYWtlIHNvbWUgY29kZSB3ZSAib3VnaHQgdG8gYmUgYWJsZSB0byIgdXNlIGZvcgotCWFsbCB0YXJnZXRzIG5vIGxvbmdlciBjb25kaXRpb25hbGl6ZWQgb24gbnMzMmsgdGFyZ2V0OyBpbnN0ZWFkLCBkbwotCWl0IGFsd2F5cywgYW5kIGlmIHRoZSBhcHByb3ByaWF0ZSBjb25kaXRpb25zIGZhaWwsIGFib3J0LgotCi0JKiBzeW1ib2xzLmMgKERFQlVHKTogRW5hYmxlZC4KLQkoc3ltYm9sX25ldyk6IE1ha2Ugc3VyZSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgd29ya3MuCi0JKHZlcmlmeV9zeW1ib2xfY2hhaW5fMik6IE5ldyBmdW5jdGlvbjsgdGFrZXMgb25lIHN5bWJvbCBhcwotCWFyZ3VtZW50LCBhbnl3aGVyZSBpbiB0aGUgY2hhaW4uCi0JKGRvbGxhcl9sYWJlbCopOiBVc2UgZGVmYXVsdCBpbml0aWFsaXplcnMuCi0KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IENhbGwgbWRfYmVnaW4gaGVyZS4uLgotCShtYWluKTogLi4uYW5kIG5vdCBoZXJlLgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogVXNlIGEub3V0LXN1bm9zLWJpZyBmb3IgYS5vdXQuCi0JKHRjX2Zyb2Jfc3ltYm9sKTogTmV3IG1hY3JvOiBHZXQgcmlkIG9mIHN5bWJvbHMgaW4gcmVnX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG9tYWdpYyk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQkoYWRkX2ZpeCwgYWRkX2ZyYWcpOiBOb3cgZnVuY3Rpb25zIGluc3RlYWQgb2YgbWFjcm9zLgotCShtNjhrX3JlZ19wYXJzZSwgbTY4a19pcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIGdldF9udW0sCi0Jc19kYXRhMSwgc19kYXRhMiwgc19ic3MpOiBVc2UgbmV3ICpfc2VjdGlvbiBuYW1lcywgZm9yCi0JY29tcGF0aWJpbGl0eSB3aXRoIEJGRF9BU1NFTUJMRVIgbW9kZTsgcmV3cml0ZSBzd2l0Y2ggc3RhdGVtZW50cwotCXRvIGhhbmRsZSBub24taW50ZWdyYWwgc2VnVC4KLQkodGNfY29mZl9maXgycnR5cGUsIHRjX2FvdXRfZml4X3RvX2NoYXJzLAotCXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQkodGNfZ2VuX3JlbG9jKTogTmV3IHJvdXRpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKG1kX2FwcGx5X2ZpeCwgbWRfYXBwbHlfZml4XzIpOiBSZW5hbWVkIG9sZCBtZF9hcHBseV9maXggdG8KLQltZF9hcHBseV9maXhfMjsgbmV3IG1kX2FwcGx5X2ZpeCBkZWZpbml0aW9uIHZhcmllcyBpbnRlcmZhY2UKLQlkZXBlbmRpbmcgb24gQkZEX0FTU0VNQkxFUi4KLQkobWRfY29udmVydF9mcmFnLCBtZF9jb252ZXJ0X2ZyYWdfMSk6IExpa2V3aXNlLiAgVXNlIG5ldyAqX3NlY3Rpb24KLQluYW1lcy4KLQotCSogY29uZmlnL29iai12bXMuYzogSW5jbHVkZSBjb25maWcuaC4KLQkodmVyc2lvbl9zdHJpbmcpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IFVzZSBHQVNfVkVSU0lPTiBpbnN0ZWFkLgotCSh2bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYpOiBOZXcgZnVuY3Rpb24sIHRha2VuIGZyb20gVk1TIGNvZGUgaW4KLQlzeW1ib2xzLmMuCi0JKF9kb3BybnQpOiBEZWxldGVkLgotCShWTVNfU3RvcmVfU3RydWN0LCBWTVNfRGVmX1N0cnVjdCwgVk1TX1NldF9TdHJ1Y3QsCi0JVk1TX1RCVF9CbG9ja19FbmQsIGdldF9WTVNfdGltZV9vbl91bml4LCBnZW5lcmF0ZV9zdWZmaXgsCi0JVk1TX1BzZWN0X1NwZWMpOiBGaXhlZCB0byBjb21waWxlIHVuZGVyIHRyYWRpdGlvbmFsIEMuCi0JKiBjb25maWcvb2JqLXZtcy5oOiBVc2UgUEFSQU1TIG1hY3JvLgotCSh2bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYpOiBEZWNsYXJlLgotCShSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04pOiBOZXcgbWFjcm8uCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogUmVtb3ZlIHNvbWUgVk1TLXNwZWNpZmljIGNvZGUsIGxvb2sgZm9yCi0JUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OIG1hY3JvIGluc3RlYWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBEb24ndCB0cnkgZXhwYW5kaW5nIERCY2MKLQlpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJlb3JkZXJlZCBzb21lIGZ1bmN0aW9ucyBzbyBpbmxpbmluZyBtaWdodAotCXdvcmsuICBVc2UgUEFSQU1TIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQkocmVsb2MpOiBOZXcgcm91dGluZS4KLQkobWRfYXNzZW1ibGUpOiBSZWFycmFuZ2Ugc3dpdGNoIHN0YXRlbWVudHMgdG8gd29yayB3aXRoCi0Jbm9uLWludGVncmFsIHNlZ1QuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIFtCRkRfQVNTRU1CTEVSXTogVW5kZWZpbmUKLQlTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTIGJlZm9yZSBkZWZpbmluZyBpdC4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfbmV3X3Jlc3QpOiBOb3cgc3RhdGljLgotCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBCZXR0ZXIgZXJyb3IgbWVzc2FnZSBmb3IgZGlmZmVyZW5jZSBvZgotCXN5bWJvbHMgaW4gZGlmZmVyZW50IGZyYWdzLgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBQYXNzIGRvd24gc29tZSBuZXcgdmFyaWFibGVzLCBpbmRpY2F0aW5nCi0JcGF0aG5hbWUgb3IgcHJvZ3JhbSBuYW1lIGZvciBjYywgbm0sIG9iamR1bXAuCi0KLQkqIGFzLmggKE9VVFBVVF9GTEFWT1IpOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogVXNlIE9VVFBVVF9GTEFWT1IuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5pdGlhbGl6ZSBiZmRfZ2FzIHByb3Blcmx5LiAgV2FybiB0aGF0IEVMRgotCXN1cHBvcnQgaXMgaW5jb21wbGV0ZS4KLQotVGh1IEFwciAxNSAyMjozOTowNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZmxvYXRfY29ucyk6IEFjY2VwdCBudWxsIHBvaW50ZXIgcmV0dXJuIGZyb20gbWRfYXRvZi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2F0b2YpOiBSZXR1cm4gbnVsbCBmb3Igc3VjY2Vzcy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hdG9mKTogRGl0dG8uCi0KLVRodSBBcHIgMTUgMTY6MDQ6MzkgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm86IGZvcm1hdHRpbmcgYW5kIGNvbW1lbnQgY2xlYW51cHM7IHNob3cgU1BBUkMKLQlhbHRlcm5hdGl2ZSBvcHRpb25zIGluIHNhbWUgc3R5bGUgYXMgb3RoZXIgbWFjaGluZXM7IHNpbXBsaWZ5IHNvbWUKLQljb25kaXRpb25hbCB1c2U7IGluY2x1ZGUgR1BMIGFzIHNlcGFyYXRlIGZpbGUgKGZyb20gdGV4aW5mbyBkaXIpCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogKGFzLmluZm8pIGluY2x1ZGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgR1BMIGluCi0JbWFrZWluZm8gc2VhcmNoIHBhdGgKLQotCSogZG9jL2g4LnRleGk6IG5ldyBmaWxlOyBjb25kaXRpb25hbCBzZXR0aW5ncyBmb3IgR0FTIG1hbnVhbAotCW9uIEhpdGFjaGkgY2hpcHMKLQotVHVlIEFwciAxMyAxNTozMTo0MCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMudGV4aW5mbzogbWVudGlvbiBTUEFSQyBhcmNoaXRlY3R1cmUgb3B0aW9ucy4KLQotRnJpIEFwciAgOSAxNzo0MzoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWFycmFuZ2VkIHdoaXRlc3BhY2UgaW4gcGVyLWhvc3QvcGVyLXRhcmdldAotCXNlY3Rpb25zLiAgQWRkZWQgaG9va3MgZm9yIGRyb3BwaW5nIGluIEhQUEEgc3VwcG9ydCAobm90IGluY2x1ZGVkCi0JeWV0KS4gIFNlcGFyYXRlIG91dCBvdmVycmlkZXMgb2YgdmFyaWFibGVzIGJhc2VkIG9uIHRhcmdldCBmb3JtYXQKLQlhbmQgYmZkLWdhcyBzZWxlY3Rpb24gZnJvbSBhY3R1YWwgdGFyZ2V0LXNwZWNpZmljIGNvbW1hbmRzLiAgQWRkCi0JZXJyb3IgbWVzc2FnZSBmb3IgcmVjb2duaXplZCBidXQgdW5zdXBwb3J0ZWQgZm9ybWF0IG5hbWUuCi0KLUZyaSBBcHIgIDkgMDk6MDU6NDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKGVjb2ZmX2J1aWxkX2xpbmVubyk6IE1ha2UgaWxpbmVNYXggaW4KLQlzeW1ib2xpYyBoZWFkZXIgbWF0Y2ggY2xpbmUgaW4gRkRSOyB0aGUgbmF0aXZlIGxpbmtlciBzZWVtcyB0bwotCXdhbnQgdGhhdC4KLQotVGh1IEFwciAgOCAxNTo1MToyOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogYXMudGV4aW5mbyBpcyBpbiAkKHNyY2RpcikuICBVc2UKLQkkKHNyY2RpcikvYXMudGV4aW5mbyBleHBsaWNpdGx5IGluIHNldmVyYWwgcGxhY2VzCi0KLVRodSBBcHIgIDggMTU6MTU6MDIgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluOiB1cGRhdGUgZHZpLCBjbGVhbiB0YXJnZXRzIGZvciBuZXcgc291cmNlCi0JCQkgICBmaWxlIHN0cnVjdHVyZQotCi1UaHUgQXByICA4IDEyOjUyOjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLWRlY3N0YXRuLmg6IERlZmluZSBCUk9LRU5fQVNTRVJUIGlmIG5vdCBfX0dOVUNfXywKLQlyYXRoZXIgdGhhbiB1bmRlZmluaW5nIGtub3cuCi0JKiBjb25maWd1cmUuaW46IE1hdGNoIHVsdHJpeCosIG5vdCBqdXN0IHVsdHJpeC4KLQotV2VkIEFwciAgNyAyMDoxODoxMCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMudGV4aW5mbzogY29udmVydGVkIGNvbmRpdGlvbmFsIG1hcmt1cCB0byB1c2UgbmV3Ci0JVGV4aW5mbyBmYWNpbGl0aWVzLCBhdm9pZGluZyBtNC4KLQotCSogZG9jL2FzLWFsbC50ZXhpbmZvLCBhbGwubTQsIHByZXRleC5tNDogZGVsZXRlZC4KLQotCSogZG9jL01ha2VmaWxlLmluOiByZWNhc3QgZG9jIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGEgbGluayB0byBhbgotCWluY2x1ZGVkIHRleGluZm8gZmlsZS4KLQotCSogZG9jL2FsbC50ZXhpOiBzZXR0aW5ncyBmb3IgZ2VuZXJpYyBmb3JtIG9mIGRvY3VtZW50YXRpb24uCi0KLVR1ZSBBcHIgIDYgMTE6NTY6MjEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGNvbnMpOiBaZXJvIG91dCBmcmFnIHdoZW4gY3JlYXRpbmcgcmVsb2MuCi0KLU1vbiBBcHIgIDUgMDk6NDE6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChncF9yZWZlcmVuY2UpOiBDZXJ0YWluIG1hZ2ljIHN5bWJvbHMgY2FuIG5ldmVyCi0JYmUgcmVmZXJlbmNlZCBvZmYgdGhlIEdQIHJlZ2lzdGVyLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSGFuZGxlIHN0YXRlcyA5IGFuZCAxMCBjb3JyZWN0bHkKLQl3aGVuIGRlYWxpbmcgd2l0aCBjaGFyYWN0ZXJzIG9mIHR5cGUgTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1QsCi0JTEVYX0lTX1NUUklOR1FVT1RFLCBhbmQgTEVYX0lTX09ORUNIQVJfUVVPVEUuCi0KLQkqIGNvbmZpZy90ZS1pcml4Lmg6IE5ldyBmaWxlOyBpcml4IG5lZWRzIGEgZGlmZmVyZW50IExPQ0FMX0xBQkVMCi0JZGVmaW5pdGlvbiBmcm9tIG90aGVyIE1JUFMgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWlyaXgpOiBVc2UgZW11bGF0aW9uIGlyaXguCi0KLVN1biBBcHIgIDQgMTU6MjE6MDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jOiBHZXQgcmVsYXggc2l6ZSBvZiBicmFuY2ggaW5zdHJ1Y3Rpb25zIHJpZ2h0LAotCShnZXRfb3BlcmFuZCk6IFBhcnNlIEBzcCsgY29ycmVjdGx5LgotCi1GcmkgQXByICAyIDE1OjU5OjQ5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSkgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBpbmNsdWRlCi0JQ09GRiBzZWN0aW9uIGhlYWRlciBmaWVsZC4KLQotCSogY29uZmlndXJlLmluOiBQcmludCBlcnJvciBtZXNzYWdlIGlmIGhvc3Qgb3IgdGFyZ2V0IGlzIG5vdAotCXN1cHBvcnRlZC4KLQotCSogY29uZmlndXJlLmluOiBJZiB3aXRoLWJmZC1hc3NlbWJsZXIsIHVzZSBvYmotY29mZiBpbnN0ZWFkIG9mCi0Jb2JqLWNvZmZiZmQuCi0KLQkqIGNvbmZpZy9oby1nZW5lcmljLmg6IEluY2x1ZGUgc3RyaW5nLmguCi0KLUZyaSBBcHIgIDIgMDg6NTQ6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTCk6IFRyZWF0IGFueSBsYWJlbCBzdGFydGluZyB3aXRoCi0JJyQnIGFzIGxvY2FsLCBmb3IgYW55IG9iamVjdCBmaWxlIGZvcm1hdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBPcHRpbWl6YXRpb25zIHRvIGJyYW5jaGluZyBjb2RlIGFuZCBhCi0JY291cGxlIG9mIGJ1ZyBmaXhlcyBmcm9tIHJhbHBoY0BweXJwczUuZW5nLnB5cmFtaWQuY29tIChSYWxwaAotCUNhbXBiZWxsKS4KLQotCSogY29uZmlnL2hvLWlyaXguaDogTmV3IGZpbGU7IGlmIG5vdCBnY2MsIGRlZmluZSBCUk9LRU5fQVNTRVJULgotCSogY29uZmlndXJlLmluIChtaXBzLXNnaS1pcml4Kik6IFNldCBnYXNfaG9zdCB0byBpcml4LgotCi1XZWQgTWFyIDMxIDE3OjUzOjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzdWJzZWdfbmV3KTogU2V0IG91dHB1dF9zZWN0aW9uIG9mIG5ldyBzZWN0aW9uLgotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWx5X3Bhc3MpOiBEb24ndCBzZXQgb3V0cHV0X3NlY3Rpb24gaGVyZS4KLQkqIGV4cHIuYyAoZXhwcl9wYXJ0LCBleHByKTogVHVybiBvZmYgc2VjdGlvbiBhc3NlcnRpb25zIGZvciBFQ09GRiwKLQlzaW5jZSBpdCBoYXMgYWRkaXRpb25hbCBzZWN0aW9ucy4KLQkqIHJlYWQuYyAoc19sY29tbSk6IEZvciBNSVBTIEVDT0ZGLCBwdXQgc21hbGwgb2JqZWN0cyBpbiAuc2JzcywKLQlub3QgYnNzX3NlY3Rpb24uCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKFRBUkdFVF9TWU1CT0xfRklFTERTKTogQWRkZWQKLQllY29mZl91bmRlZmluZWQgZmllbGQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBJbml0aWFsaXplCi0JZWNvZmZfdW5kZWZpbmVkIGZpZWxkLgotCShhZGRfZmlsZSk6IElmIHVzaW5nIHN0YWJzLCBqdXN0IG91dHB1dCBhIHN0YWJzIHN5bWJvbCByYXRoZXIgdGhhbgotCWNyZWF0aW5nIGEgbmV3IGZkci4KLQkob2JqX2Vjb2ZmX2JlZ2luLCBvYmpfZWNvZmZfYmVuZCk6IElnbm9yZSBsaW5lIG51bWJlciBieSByZWFkaW5nCi0JaXQgd2l0aCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiwgcmF0aGVyIHRoYW4gc2tpcHBpbmcgaXQgYnkgaGFuZC4KLQkob2JqX2Vjb2ZmX2xvYyk6IElmIHVzaW5nIHN0YWJzLCBqdXN0IG91dHB1dCBhIHN0YWJzIHN5bWJvbCByYXRoZXIKLQl0aGFuIEVDT0ZGIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgotCShvYmpfZWNvZmZfc3RhYik6IEFjY2VwdCBub24temVybyB2YWx1ZXMgZm9yIHN0YWJzIGxpbmUgbnVtYmVyLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogU2V0IGlmaWxlc3ltIGNvcnJlY3RseS4gIFNldCBzdG9yYWdlIGNsYXNzCi0JdG8gc21hbGwsIHVuZGVmaW5lZCBhbmQvb3IgcmVhZG9ubHkgc2VjdGlvbnMgaWYgYXBwcm9wcmlhdGUuCi0JRG9uJ3Qgb3V0cHV0IHN5bWJvbCBuYW1lcyBjb250YWluaW5nIFwwMDEgY2hhcmFjdGVycy4KLQkoZWNvZmZfZnJvYl9maWxlKTogTWFrZSBzdXJlIGF0IGxlYXN0IG9uZSBmZHIgaXMgb3V0cHV0LgotCSogY29uZmlnL3RjLW1pcHMuaDogRGVmaW5lIFRDX01JUFMuCi0JKiBjb25maWcvdGMtbWlwcy5jIChnX3N3aXRjaF92YWx1ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlKTogU2V0IGdwIHNpemUgb2Ygb3V0cHV0IEJGRC4KLQkoZ3BfcmVmZXJlbmNlKTogTmV3IGZ1bmN0aW9uOyByZXR1cm5zIDEgaWYgZXhwcmVzc2lvbiBjYW4gYmUKLQlhY2Nlc3NzZWQgdmlhIGdwLiAgQWx3YXlzIHJldHVybnMgMCBpZiBub3QgdXNpbmcgRUNPRkYuCi0JKG1hY3JvX2J1aWxkKTogQ29udmVydCBCRkRfUkVMT0NfTE8xNiB0byBCRkRfUkVMT0NfTUlQU19HUFJFTCBpZgotCXBvc3NpYmxlLgotCShtYWNybyk6IEdlbmVyYXRlIHNlcXVlbmNlcyB1c2luZyBncCBpZiBwb3NzaWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWdub3JlIC1FTCBhbmQgLUVCLiAgUGFyc2UgLUcuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkZGVkIEJGRF9SRUxPQ19NSVBTX0dQUkVMIHRvIGlnbm9yZWQgY2FzZS4KLQkoc19jaGFuZ2Vfc2VjKTogSGFuZGxlIC5yZGF0YSBhbmQgLnNkYXRhIGZvciBFQ09GRi4KLQkoc19leHRlcm4pOiBNYXJrIHN5bWJvbCBhcyBleHRlcm5hbC4gIFNldCBlY29mZl91bmRlZmluZWQgZmllbGQuCi0KLVR1ZSBNYXIgMzAgMTA6MTE6NDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBEb24ndCBjYWxsIGFzX3BlcnJvciBmb3IKLQlmaWxlbmFtZSByZWplY3RlZCBieSBhcHBsaWNhdGlvbi4KLQotCSogYXMuYyAobWFpbikgW0JGRF9BU1NFTUJMRVJdOiBJZiBlcnJvcnMgb2NjdXIsIGNsb3NlIGFuZCB1bmxpbmsKLQl0aGUgb3V0cHV0IGZpbGUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb24ndCB1c2UgQHZhbHVlIGluIG5vZGUgbmFtZXMgZm9yIHRoZSBtb21lbnQ7Ci0JcmVmZXJlbmNlcyBkb24ndCBhcHBlYXIgdG8gd29yayByaWdodC4KLQotCSogYXMuaCAoY29uc3QsIHZvbGF0aWxlKTogUHV0IHRoZXNlIGRlZmluaXRpb25zIGJhY2ssIGFuZCB1c2UKLQl0aGVtLgotCi0JKiBkb2MvYXMudGV4aW5mbzogRmlyc3QgcGFzcyBhdCB1c2luZyBuZXcgdGV4aW5mbyBmZWF0dXJlcyAtLQotCXZhcmlhYmxlcywgY29uZGl0aW9uYWwgdGVzdHMuICBGYXIgZnJvbSBjb21wbGV0ZS4KLQotTW9uIE1hciAyOSAxNjowNTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogVGVtcG9yYXJ5IGhhY2sgdG8gaGFuZGxlIHNvbWUgNjQtYml0IGNvbnN0YW50cy4gIFRoaXMKLQlzaG91bGQgYmUgcmVkb25lIGxhdGVyLgotCSh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUuCi0JKGJpZ19jb25zKTogSWYgaXQncyBzZXQsIHJldmVyc2Ugb3JkZXIgb2YgYnl0ZXMgYmVpbmcgY29waWVkLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2JlZ2luKTogU2V0IHRhcmdldF9iaWdfZW5kaWFuLgotCi0JKiByZWFkLmMgKHNfaWdub3JlKTogRGVsZXRlIGRlY2xhcmF0aW9uIG9mIGlzX2VuZF9vZl9saW5lLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoeWFua19zeW1ib2xzKTogQnVpbGQgbGlzdCBvZiBmaWxlIHN5bWJvbAotCWZvcndhcmQgcG9pbnRlcnMgcHJvcGVybHkuCi0KLU1vbiBNYXIgMjkgMTM6NDc6MzMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogRml4IGJ1ZyB3aGVyZSBucmVsb2NzCi0Jd2Fzbid0IGJlaW5nIHN0b3JlZCBpbnRvIHNjbmhkci4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBBZGQgcHJvdG90eXBlIG9mIHNfZ2V0X3NlZ21lbnQuCi0JKiByZWFkLmMgKFRDX1NUQVJUX0xBQkVMKTogRGVmYXVsdCBkZWZpbml0aW9uLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBVc2UgVENfU1RBUlRfTEFCRUwgbWFjcm8gdG8gd29yayBvdXQKLQlpZiBhIGxhYmVsIGhhcyBiZWVuIHNlZW4uCi0KLU1vbiBNYXIgMjkgMTI6NTY6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFNldCBCRkRERUYgYW5kIEJGRExJQiBhdCB0aGUgdG9wIG9mIE1ha2VmaWxlLCBub3QKLQl0aGUgYm90dG9tIChtYWtlIGV4cGFuZHMgdmFyaWFibGVzIGluIGRlcGVuZGVuY2llcyB3aGVuIHRoZQotCWRlcGVuZGVuY2llcyBhcmUgcmVhZCwgbm90IHdoZW4gdGhleSBhcmUgdXNlZCkuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBEb24ndCBzZXQgTk9MT0FEIGJpdCBmb3IKLQlhMjlrIC5ic3Mgc2VjdGlvbjsgdGhlIG1vbmRmZSBwcm9ncmFtIGRvZXNuJ3QgbGlrZSBpdC4KLQotU3VuIE1hciAyOCAwODoxMjo1MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYzogVXNlIFBBUkFNUyBtYWNybywgYW5kIHVzZSBDT05TVCBpbnN0ZWFkIG9mCi0JY29uc3QuCi0JKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKTogRG9uJ3QgbmVlZCBpbml0aWFsaXplci4KLQotRnJpIE1hciAyNiAwODoxMjo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGRvYy9ub25lLm00OiBEZWZpbmUgWjgwMDAuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGFzLSoudGV4aW5mbyk6IFJlZmVyIHRvICQoc3JjZGlyKS4gIFJlbW92ZSB0aGUKLQl0ZXhpbmZvIGZpbGUgYmVmb3JlIHJlY3JlYXRpbmcgaXQuCi0JKFRFWEkyRFZJKTogTmVlZCB0byBzZXQgVEVYSU5QVVRTIGlmICJtYWtlIGFzLmR2aSIgaXMgdG8gd29yayBpbgotCXRoaXMgZGlyZWN0b3J5LgotCShzcmNkaXIpOiBEZWxldGUgc2Vjb25kLCBib2d1cyBkZWZpbml0aW9uLgotCShhcy5pbmZvKTogTG9vayBmb3IgYXMtKi50ZXhpbmZvIGluIGN1cnJlbnQgZGlyZWN0b3J5IHJhdGhlciB0aGFuCi0JaW4gJChzcmNkaXIpLgotCShhcy5kdmkpOiBEaXR0by4KLQkoZHZpKTogTmV3IHJ1bGUuCi0JKiBkb2MvY29uZmlndXJlLmluOiBDcmVhdGUgbGlua3MgdG8gYWxsIGFzLSoudGV4aW5mbyBmaWxlcyBpbiB0aGUKLQlzb3VyY2UgZGlyZWN0b3J5LCBpZiB0aGF0J3Mgbm90IHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLQotCSogY29uZmlndXJlLmluIChwZXItaG9zdCk6ICBBY2NlcHQgTUlQUyBob3N0IHdpdGggQlNEIHZlcnNpb24KLQludW1iZXIuCi0JKHBlci10YXJnZXQpOiBDbGFzc2lmeSBpNDg2IGFzIGkzODYuICBVc2UgZ2VuZXJpYyBjcHVfdHlwZSBpbnN0ZWFkCi0Jb2YgdGFyZ2V0X2NwdSBpbiBzZWxlY3RpbmcgZm9ybWF0IGV0Yy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IFVzZSAuYXBwZmlsZSwgbm90IC5hcHAtZmlsZS4KLQkqIHJlYWQuYyAocG90YWJsZSk6IENoYW5nZSAuYXBwLWZpbGUgdG8gLmFwcGZpbGUuCi0KLQkqIGNvbmZpZy9oby1kZWNzdGF0bi5oOiBSZW5hbWVkIGZyb20gaG8tZGVjc3RhdGlvbi5oLgotCSogY29uZmlndXJlLmluOiBBZGp1c3RlZC4KLQotCSogY29uZmlnL29iai1iZmQtc3Vub3MuKjogVW51c2VkOyBkZWxldGVkLgotCi0JKiBNYWtlZmlsZS5pbiAodmVyc2lvbi5jLCB2ZXJzLXN0YW1wKTogRGVsZXRlZC4KLQkoY29uZmlnLmgpOiBEZWZpbmUgR0FTX1ZFUlNJT04uCi0JKiBhcy5jICh2ZXJzaW9uX3N0cmluZyk6IERlbGV0ZWQgZGVjbGFyYXRpb24uCi0JKG1haW4pOiBMb29rIGZvciBHQVNfVkVSU0lPTiBpbnN0ZWFkLgotCi0JKiBkb2MvYXMudGV4aW5mbzogVXBkYXRlZCBkZXNjcmlwdGlvbiBvZiAtYSogKGxpc3RpbmcpIG9wdGlvbnMsCi0JYW5kIGRlc2NyaWJlIGhvdyB0byBwYXNzIHRoZW0gdGhyb3VnaCBmcm9tIGdjYy4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBEb24ndCBhbGxvY2F0ZSBzdG9yYWdlIG9yCi0JcHJvY2VzcyByZWxvY3MgaWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MgdG8gcHJvY2Vzcy4gIEF2b2lkcwotCW1hbGxvYy9mcmVlIGJ1ZyBvbiBTQ08gdG9vLgotCi0JKiBhcy5oOiBNb3ZlIGxvY2FsIGluY2x1ZGUgZmlsZXMgYmVsb3cgc3lzdGVtIGluY2x1ZGUgZmlsZXMsIHRvCi0JYXZvaWQgc29tZSByZWRlZmluaXRpb24gY29tcGxhaW50cyBvbiBzb21lIHN5c3RlbXMuCi0JKGNvbnN0LCB2b2xhdGlsZSk6IERvbid0IG5lZWQgdGhlc2UgY29uZGl0aW9uYWxseSBkZWZpbmVkIGlmIHdlCi0JdXNlIENPTlNUIGFuZCBWT0xBVElMRSBmcm9tIGFuc2lkZWNsLmguCi0JKHNlZ19uYW1lKTogVXNlIENPTlNULCBub3QgY29uc3QuCi0KLUZyaSBNYXIgMjYgMTA6MjI6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBSZWluZGVudGVkIHRvIEdOVSBzdGFuZGFyZHMuCi0KLVRodSBNYXIgMjUgMDg6NTk6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IFJlbW92ZSBhMjlrIHNwZWNpYWwgY2FzZS4KLQkoZml4dXBfc2VnbWVudCk6IEFkZCBhMjlrIHNwZWNpYWwgY2FzZTsgdGhlIGxpbmtlciBpcyBub3QgcHJlcGFyZWQKLQl0byBzZWUgYSBzZWdtZW50IG9mZnNldCBoZXJlLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWRkZWQgbmV3IHN0YXRlLCAxMCwgbW9kaWZ5aW5nIHN0YXRlCi0JOSB0byBvbmx5IGtlZXAgYSBzcGFjZSBpbiBiZXR3ZWVuIGlkZW50aWZpZXIgY2hhcmFjdGVycy4KLQotV2VkIE1hciAyNCAwMjoxNjoyMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBkdmkgdGFyZ2V0OyBhcy0kKGNvbmZpZykudGV4aW5mbyBtaWdodCBsaXZlIGluCi0Jc3JjZGlyLCBtaWdodCBiZSBpbiBvYmpkaXIuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogZHZpIGRlcGVuZHMgb24gYXMuZHZpCi0KLU1vbiBNYXIgMjIgMjM6NTk6MTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayB0YXJnZXQKLQotTW9uIE1hciAyMiAxNjoyNTo1NyAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFkZCBzdXBwb3J0IGZvciBtZW1iYXIgbWFzayBuYW1lcy4KLQlBZGQgbWlzc2luZyBjb2xvbnMgaW4gcHJlZmV0Y2ggZXJyb3IgbWVzc2FnZXMuICBBZGQgc3VwcG9ydCBmb3IKLQlBU0kgbmFtZXMuCi0KLU1vbiBNYXIgMjIgMTA6MTk6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFVzZSAkQVQgZm9yIGFueSBmbG9hdGluZyBwb2ludCBsb2FkLgotCi1TYXQgTWFyIDIwIDEyOjUwOjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkB1cnRoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGb3Igb3BlcmFuZCB0eXBlICdNJywgcmVqZWN0Ci0JYmlnbnVtcywgYnV0IGRvbid0IGVtaXQgZXJyb3IgbWVzc2FnZS4KLQotRnJpIE1hciAxOSAyMTowMjoxOSAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXJnLWNwdS5vKTogRGVwZW5kIG9uIGNvbmZpZy5oLgotCi1XZWQgTWFyIDE3IDE2OjQ0OjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFkZGVkIG5ldyBzdGF0ZSwgOSwgdG8gYXZvaWQKLQlkcm9wcGluZyBhIHNwYWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbiBpZGVudGlmaWVyLgotCSogZXhwci5jLCB3cml0ZS5jOiBSZXdyb3RlIGFzc2VydCBleHByZXNzaW9ucyB0byBub3QgdXNlIG11bHRpcGxlCi0JbGluZXM7IEkgZG9uJ3QgdGhpbmsgdGhhdCBjYW4gYmUgZG9uZSBwb3J0YWJseS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogVXNlICRBVCBpZiB0YXJnZXQgcmVnaXN0ZXIgaXMgemVybyBpbgotCWxvYWQgaW5zdHJ1Y3Rpb24sIHdoaWNoIGl0IGNhbiBiZSBmb3IgYSBmbG9hdGluZyBwb2ludCBsb2FkLgotCi1Nb24gTWFyIDE1IDEyOjE3OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBDb21wdXRlIHRoZSByZWxvY3MgYmVmb3JlIHdyaXRpbmcgb3V0Ci0JdGhlIHNlY3Rpb24gY29udGVudHMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmgsIGNvbmZpZy9vYmotZWNvZmYuYzogTnVtZXJvdXMgY2hhbmdlcyB0byBnZXQKLQlzeW1ib2wgdGFibGUgYW5kIHZhbHVlcyByaWdodC4KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMKTogSWYgT0JKX0VDT0ZGLCBhbnkgbGFiZWwgc3RhcnRpbmcKLQl3aXRoICRMIGlzIGxvY2FsLgotCSogY29uZmlnL3RjLW1pcHMuYyAodGNfZ2VuX3JlbG9jKTogSWYgT0JKX0VDT0ZGLCBhZGp1c3QgdGhlIGFkZGVuZAotCWJ5IHRoZSBzZWN0aW9uIHZtYS4KLQotCSogY29uZmlnL3o4ay5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IFRoZSByZWxldmFudCBmaWxlIGlzCi0JejhrLW9wYy5oLCBub3QgejhrLmguCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9lbmRlZik6IENvcnJlY3QgdGVzdCBmb3IgLmJmCi0Jc3ltYm9sLgotCi1GcmkgTWFyIDEyIDE4OjMzOjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgc3BhcmMtc3VuLXNvbGFyaXMyKiBpbnN0ZWFkIG9mIC1zb2xhcmlzMgotCi1GcmkgTWFyIDEyIDEyOjAwOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZXhwci5jLCB3cml0ZS5jOiBVbHRyaXggbmF0aXZlIDQuMiBjYyByZXF1aXJlcyBhc3NlcnQgY29uZGl0aW9uCi0JdG8gYmUgb24gYSBzaW5nbGUgbGluZS4KLQotVGh1IE1hciAxMSAxNzo1NjoyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuaCk6IENyZWF0ZSBmaWxlLCB3cml0aW5nIG91dCBkZWZpbml0aW9ucyBvZgotCXRhcmdldCBjcHUsIGFsaWFzLCBhbmQgY2Fub25pY2FsIG5hbWUuCi0JKEFMTF9DRkxBR1MpOiBObyBsb25nZXIgZGVmaW5lIFRBUkdFVF9DUFUuCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFByaW50IGEgbWVzc2FnZSwgaW5zdGVhZCBvZiBxdWl0dGluZwotCXNpbGVudGx5LgotCi0JKiBhcy5jIChtYWluKTogRG9uJ3QgY2F0Y2ggYW55IHNpZ25hbHMsIGZvciBub3cuCi0KLQkqIHZlcnNpb24uYzogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluOiBHZW5lcmF0ZSBpdCwgcHV0dGluZyBpbiBvbmx5IHRoZSB2ZXJzaW9uIG51bWJlcgotCWl0c2VsZi4KLQkoVkVSU0lPTik6IE5ldyB2YXJpYWJsZS4KLQkqIGFzLmM6IEluY2x1ZGUgY29uZmlnLmguCi0JKG1haW4pOiBSZWZvcm1hdHRlZCB2ZXJzaW9uIHN0cmluZy4gIEluY2x1ZGUgdGFyZ2V0IGFsaWFzLiAgRG9uJ3QKLQlwcmludCBpZiBub3QgcmVxdWVzdGVkIChpLmUuLCB1bmtub3duIC12IGFyZ3VtZW50KS4KLQotCSogYXMuYyAoc3RyYWxsb2MpOiBEZWxldGVkLgotCShtYWluKTogQ2FsbCBzdHJkdXAgaW5zdGVhZC4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgYWxsIDY4MzAwIHNlcmllcyBjaGlwcy4KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEluY2x1ZGUgY29uZmlnLmguCi0JKG1kX2Fzc2VtYmxlKTogQXNzdW1lIFRBUkdFVF9DUFUgaXMgZGVmaW5lZC4gIEFjY2VwdCBzb21lIDY4MzAwCi0Jc2VyaWVzIGNwdXMgYXMgZGVmYXVsdHMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCBzb21lIG02ODMwMCBzZXJpZXMgQ1BVcyBhcyBkZWZhdWx0cy4KLQotV2VkIE1hciAxMCAxNzo0MToxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKEVYSVRfU1VDQ0VTUywgRVhJVF9GQUlMVVJFKTogRGVmaW5lIHRvIG5vcm1hbCB2YWx1ZXMgaWYKLQlub3QgYWxyZWFkeSBkZWZpbmVkLgotCShtYWluLCBnb3Rfc2lnKTogVXNlIHRoZW0uCi0JKiBjb25maWcvaG8tdm1zLmggKEVYSVRfU1VDQ0VTUywgRVhJVF9GQUlMVVJFKTogUmV2ZXJzZSBkZWZhdWx0Ci0JdmFsdWVzLgotCi1UdWUgTWFyICA5IDA3OjQwOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jLCBjb25maWcvb2JqLWVjb2ZmLmg6IFByZWxpbWluYXJ5IEVDT0ZGCi0Jc3VwcG9ydC4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBiYXNlZCBvbiBPQkpfQU9VVCB2cy4KLQlPQkpfRUNPRkYgYXMgd2VsbCBhcyBUQVJHRVRfQllURVNfKl9FTkRJQU4uCi0JKHN0cnVjdCBsb2MsIHN0cnVjdCBwcm9jLCBzdHJ1Y3QgZmlsZSk6IE1vdmVkIHRvIHRjLW1pcHMuYyB3aXRoaW4KLQkjaWZuZGVmIE9CSl9FQ09GRiBibG9jaywgc2luY2UgRUNPRkYgdXNlcyBkaWZmZXJlbnQgdmVyc2lvbnMuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBSZWFycmFuZ2VkIGZvciBFQ09GRiBzdXBwb3J0LiAgQWRkZWQKLQlwcm90b3R5cGVzIGZvciBhbGwgc3RhdGljIGZ1bmN0aW9ucy4gIE1vdmVkIGV4aXN0aW5nIG1pbmltYWwKLQlkZWJ1Z2dpbmcgZm9ybWF0IHN1cHBvcnQgaW5mbyAjaWZuZGVmIE9CSl9FQ09GRiBibG9ja3MuCi0JKG1hY3JvX2J1aWxkX2x1aSk6IEVsaW1pbmF0ZWQgc2lnbl9leHRlbmQgYXJndW1lbnQsIGJlY2F1c2UgRUNPRkYKLQlkb2VzIG5vdCBzdXBwb3J0IGEgbm9uIHNpZ24gZXh0ZW5kZWQgaGlnaCAxNiBiaXRzIHJlbG9jLiAgQWRqdXN0ZWQKLQlhbGwgY2FsbGVycyBhY2NvcmRpbmdseS4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogUmVuYW1lZCBmcm9tIGdldF9yZWdpc3RlciwgYW5kIG1hZGUgbm9uLXN0YXRpYy4KLQotCSogY29uZmlnL21pcHMtYmlnLm10LCBjb25maWcvbWlwcy1saXQubXQ6IE5ldyBmaWxlcy4gIERlZmluZQotCVRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGFuZCBUQVJHRVRfQllURVNfTElUVExFX0VORElBTiwKLQlyZXNwZWN0aXZlbHkuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1ic2QqKTogVXNlIGdhc190YXJnZXQgbWlwcy1saXQuCi0JKG1pcHMtKi11bHRyaXgqLCBtaXBzLSotaXJpeCosIG1pcHMtKi1lY29mZik6IE5ldyB0YXJnZXRzLCB1c2luZwotCW9ial9mb3JtYXQgZWNvZmYgYW5kIGdhc190YXJnZXQgbWlwcy1saXQgb3IgbWlwcy1iaWcuCi0KLVR1ZSBNYXIgIDkgMDc6NDM6MDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHZlcnNpb24uYzogQnVtcCB0byB2ZXJzaW9uIDIuMC4xLgotCi1UdWUgTWFyICA5IDA3OjQwOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIpOiBDaGVjayB0aGF0IHNlZ19pbmZvIChzZWN0aW9uKQotCWlzIG5vdCBOVUxMLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgb2JqX2Zyb2JfZmlsZSBhZnRlciBzZXR0aW5nIHRoZSBzeW1ib2xzLAotCW5vdCBiZWZvcmUuCi0KLVR1ZSBNYXIgIDkgMDA6MDA6MDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIFZlcnNpb24gMi4wIHJlbGVhc2VkLgotCi1Nb24gTWFyICA4IDE0OjU3OjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuaCAoVENfQ09VTlRfUkVMT0MpOiBMb29rIGZvciBmeF9hZGRzeSBvbmx5LgotCi1GcmkgTWFyICA1IDA5OjA1OjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5oOiBEZWZpbmUgc3RyaW5nZXIgaGVyZS4KLQlyZWFkLmMsIGNvbmZpZy9vYmotaWVlZS5jLCBjb25maWcvb2JqLXRjbTg4ay5jOiBOb3QgYW55IG9mIHRoZXNlCi0JcGxhY2VzLgotCi1UaHUgTWFyICA0IDExOjUyOjIzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfc3BhY2UpOiBNdWx0aXBseSByZXBlYXQgY291bnQgYnkgbXVsdCwgbm90IGZpbGwuCi0KLVRodSBNYXIgIDQgMDU6MjA6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogSW5jbHVkZSBjdHlwZS5oLgotCi1XZWQgTWFyICAzIDEwOjQxOjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCVBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZToKLQkqIG1ha2UtZ2FzLmNvbTogRmluZCBvYnN0YWNrLm9iaiBpZiBpdCdzIG5vdCBpbiB0aGUgY3VycmVudAotCWRpcmVjdG9yeS4KLQkqIHJlYWQuYyAoc19pZ25vcmUpOiBEb24ndCBkZWNsYXJlIGlzX2VuZF9vZl9saW5lLiAgSXQncwotCXJlZHVuZGFudCwgYW5kIHRyaWdnZXJzIGEgVk1TIGdjYyBjb21waWxlciBidWcuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogTWFjcm8gU1VCX1NFR01FTlRfQUxJR04gbm93IHRha2VzCi0JY3VycmVudCBzZWdtZW50IGFzIGFuIGFyZ3VtZW50LiAgKElnbm9yZWQgaW4gYWxsIGNhc2VzIGJ1dCBWTVMuKQotCUFsbCBjYWxsZXJzIGFuZCBkZWZpbml0aW9ucyBjaGFuZ2VkLgotCi1UdWUgTWFyICAyIDExOjU2OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jOiBDbGVhbmVkIHVwIGEgYml0LCBhZGRlZCBwcm90b3R5cGVzLCBtYWRlIE5PX0xJU1RJTkcKLQljYXNlIGNvbXBpbGUgYWdhaW4uCi0KLVR1ZSBNYXIgIDIgMDg6NTM6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGlzYnl0ZSk6IEFjY2VwdCBhbGwgdmFsdWVzIGZyb20gLTI1NSB0byArMjU1LAotCXNvICJ+MHg4MCIgd29uJ3QgYmUgcmVqZWN0ZWQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IE5vIGxvbmdlciBpbmNsdWRlIGVsZi9yZWxvYy5oLgotCShvYmpfZWxmX3NlY3Rpb24pOiBTZXQgU0VDX1JFQURPTkxZIGFuZCBTRUNfQ09ERSBmb3IgdGV4dCBzZWN0aW9uLgotCShvYmpfZWxmX3N0YWIsIG9ial9lbGZfZGVzYyk6IERlbGV0ZWQgZG8tbm90aGluZyBhbmQgY29tbWVudGVkLW91dAotCXJvdXRpbmVzLgotCShvYmpfZWxmX3hzdGFiKTogTmV3IHJvdXRpbmUuCi0JKG9ial9lbGZfc2V0X3NpemUpOiBDYWxsIGFzX3dhcm4sIG5vdCBmcHJpbnRmLiAgUGFzcyBkZXNpcmVkCi0JYXJndW1lbnQgdG8gc19pZ25vcmUuICBQdXQgIiNpZiAwIiBhcm91bmQgdW51c2VkIGNvZGUuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBVc2Ugc19pZ25vcmUgaW5zdGVhZCBvZiBkby1ub3RoaW5nIHJvdXRpbmVzLgotCUNhbGwgZWxmX3hzdGFicyBmb3IgLnN0YWJzIGFuZCAueHN0YWJzIG9wZXJhdG9ycy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpIFtPQkpfRUxGXTogTm93ICJlbGYzMi1zcGFyYyIuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IFNldCBTRUNfUkVMT0Mgb25seSBpZiBmaXh1cHMgYXJlCi0JcHJlc2VudC4KLQotCSogY29uZmlndXJlLmluOiBtaXBzLWJzZCBjb25maWd1cmF0aW9uIHdhcyBtaXNzaW5nIGZvcm1hdCBzcGVjLgotCVNob3VsZCB1c2UgYW91dC4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRGVwZW5kcyBvbiBjb25maWd1cmUuaW4uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3QgY2hlY2sgZm9yIGFsaWdubWVudCBvZgotCWZyYWcgaW4gbWVtb3J5OyBhbGlnbm1lbnQgb2YgaW5zdHJ1Y3Rpb25zIGluIHNlY3Rpb24gaXMgYSBzZXBhcmF0ZQotCW1hdHRlci4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGRfbHVpKTogRml4IHNvbWUgYXNzdW1wdGlvbnMgb2YgQU5TSQotCUMgYXZhaWxhYmlsaXR5LgotCi0JKiBsaXN0aW5nLmg6IEFsd2F5cyBwcm92aWRlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgbm90IG1hY3Jvcywgc28KLQlwY2Mgd29uJ3QgbG9zZS4KLQotVHVlIE1hciAgMiAwMDo1MDo0MyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogQ09OVFJJQlVUT1JTOiAgVXBkYXRlIEdpbG1vcmUgZW50cnkuCi0KLU1vbiBNYXIgIDEgMTI6MDM6MTYgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiAgQ29ycmVjdGx5IGFzc2VtYmxlIHByZWZldGNoCi0JaW5zdHJ1Y3Rpb25zLiAgQWNjZXB0IGludGVnZXIgcHJlZmV0Y2ggZnVuY3Rpb24gbnVtYmVycy4KLQotV2VkIEZlYiAyNCAxNDo1ODoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3h3b3JkKTogTm93IGNhbGwgYmlnX2NvbnMsIHNvIGxhcmdlCi0JY29uc3RhbnRzIGFyZSBhY2NlcHRlZCwgYnV0IHN5bWJvbGljIHZhbHVlcyBhcmUgbm90LiAgR0NDIHdpbGwgbm90Ci0JZ2VuZXJhdGUgdGhlIGxhdHRlciBjdXJyZW50bHkuCi0KLQkqIGZyYWdzLmMgKGZyYWdfaW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoemVyb19hZGRyZXNzX2ZyYWcsIGJzc19hZGRyZXNzX2ZyYWcpOiBOb3cgaW5pdGlhbGl6ZWQgYXQgcnVuCi0JdGltZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGZyYWdfaW5pdC4KLQotV2VkIEZlYiAyNCAxMDozMjo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJbiBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUIGNhc2U6Ci0JRG9uJ3QgdW5nZXQgY2gyIGlmIHdlIGRpZG4ndCBnZXQgaXQuCi0KLVdlZCBGZWIgMjQgMDQ6MTQ6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoVEVYSURJUik6IFVwZGF0ZWQgZm9yIG5ldyBsYXlvdXQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IEFkZCBzdXBwb3J0IGZvciBFTEYgdmVyc2lvbi4KLQkodGNfZ2VuX3JlbG9jKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfQVJDSCwgVEFSR0VUX0ZPUk1BVCkgW0JGRF9BU1NFTUJMRVJdOgotCU5ldyBtYWNyb3MuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEZvciBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nIG9mIGEKLQlzeW1ib2wsIGZpeCB0aGUgb2Zmc2V0IHNvICIrMiIgaXNuJ3QgcmVxdWlyZWQuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGxpbmVfY29tbWVudF9jaGFycywgbGluZV9zZXBhcmF0b3JfY2hhcnMpOgotCURlZmluZSBhcyBjb21tb24vYnNzLgotCShvcF9oYXNoLCByZWdfaGFzaCwgYXJlZ19oYXNoLCBpY2xhc3Nlc19zZWVuLCBicl9jbnQpOiBEZWZhdWx0IEMKLQlpbml0aWFsaXplcnMgYXJlIHN1ZmZpY2llbnQuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIFtCRkRfQVNTRU1CTEVSXTogSW5jbHVkZSBsaWJhb3V0LmggZnJvbSBiZmQuCi0JKFRBUkdFVF9GT1JNQVQpIFtCRkRfQVNTRU1CTEVSXTogRGVmYXVsdCB0byAiYS5vdXQiLgotCShTX1NFVF8qLCBTX0dFVF8qLCBvYmpfZnJvYl9zeW1ib2wpIFtCRkRfQVNTRU1CTEVSXTogTmV3IG1hY3Jvcy4KLQkoU19TRVRfVFlQRSkgWyFCRkRfQVNTRU1CTEVSXTogTmV3IG1hY3JvLgotCSogY29uZmlnL29iai1hb3V0LmM6IFVzZSBQQVJBTVMgbWFjcm8gZm9yIGRlY2xhcmF0aW9ucy4gIFJlbW92ZQotCSJJR05PUkVfREVCVUciIGNvbmRpdGlvbmFsLCBzaW5jZSBib3RoIGJyYW5jaGVzIGFyZSBpZGVudGljYWwuCi0JVXNlIFNfU0VUX1RZUEUsIFNfR0VUX1RZUEUsIGFuZCBTX0dFVF9ERVNDIGluc3RlYWQgb2YgZGlyZWN0bHkKLQlyZWZlcmVuY2luZyBzeW1ib2wgc3RydWN0dXJlIG1lbWJlcnMuCi0JKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbi4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBSZW9yZGVyZWQgYSBjb3VwbGUgb2YgZmllbGRzIGZvciBiZXR0ZXIKLQlwYWNraW5nLgotCi0JKiB3cml0ZS5jIChyZWNvcmRfYWxpZ25tZW50KSBbQkZEX0FTU0VNQkxFUl06IFJlY29yZCBpdCBpbiB0aGUKLQlzZWN0aW9uIGluZm8uCi0JKHdyaXRlX2NvbnRlbnRzKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpIFtCRkRfQVNTRU1CTEVSXTogQWx3YXlzIGhhbmRsZSAtUiBoZXJlLiAgQ2FsbAotCWZpeF9uZXcgd2l0aCBCRkRfUkVMT0NfTk9ORSBpbnN0ZWFkIG9mIDAgb3IgTk9fUkVMT0MuICBDYWxsCi0Jb2JqX2Zyb2JfZmlsZSwgb2JqX2Zyb2Jfc3ltYm9sLCB0Y19mcm9iX3N5bWJvbCBpZiBkZWZpbmVkLgotCShmaXh1cF9zZWdtZW50KTogTWFrZSBzdXJlIGNvbW1vbi1zZWN0aW9uIHN5bWJvbHMgZ2V0IHRyZWF0ZWQgdGhlCi0Jc2FtZSBhcyB1bmRlZmluZWQgc3ltYm9scy4KLQkoZml4X25ldykgW0JGRF9BU1NFTUJMRVJdOiBBcmd1bWVudCByX3R5cGUgaXMgb2YgdHlwZQotCWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZS4gIFVzZSBzZWdfZml4X3tyb290LHRhaWx9UCBkZXJpdmVkIGZyb20KLQlzZWN0aW9uIGluZm8uCi0JKiB3cml0ZS5oIChmaXhfbmV3KTogVXBkYXRlIHByb3RvdHlwZS4KLQotCSogdGMuaCAobWRfb3BlcmFuZCwgbWRfY29udmVydF9mcmFnLCB0Y19oZWFkZXJzX2hvb2ssCi0JbWRfc2VjdGlvbl9hbGlnbiwgbWRfdW5kZWZpbmVkX3N5bWJvbCk6IERvbid0IHByb3ZpZGUgcHJvdG90eXBlcwotCWlmIHRoZXNlIGFyZSBkZWZpbmVkIGFzIG1hY3Jvcy4KLQkobWRfY29udmVydF9mcmFnKSBbQkZEX0FTU0VNQkxFUl06IEJGRCB2ZXJzaW9uIG5lZWRzIGJmZCBhbmQKLQlzZWN0aW9uIHBhc3NlZC4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogQXJndW1lbnQgTkFNRSBpcyBub3cgcG9pbnRlciB0byBjb25zdC4KLQlTaW1wbGlmaWVkIFNUUklQX1VOREVSU0NPUkUgY29kZS4gIFJlbW92ZSBhc3N1bXB0aW9ucyBhYm91dCBudWxsCi0JcG9pbnRlcnMgaW4gZnJlc2hseSBhbGxvY2F0ZWQgc3RvcmFnZS4gIFtCRkRfQVNTRU1CTEVSXTogR2V0IG5ldwotCUJGRCBzeW1ib2wuCi0JKGNvbG9uKTogRGlzcGxheSBvdGhlci9kZXNjIGZpZWxkcyBvZiByZWRlZmluZWQgc3ltYm9sIG9ubHkgaWYKLQlTX0dFVF9PVEhFUiBhbmQgU19HRVRfREVTQyBhcmUgZGVmaW5lZC4KLQkoc3ltYm9sX21ha2UpOiBBcmd1bWVudCBOQU1FIGlzIG5vdyBwb2ludGVyIHRvIGNvbnN0LgotCShzeW1ib2xfZmluZCwgc3ltYm9sX2ZpbmRfYmFzZSk6IExpa2V3aXNlLgotCShTX0lTXyosIFNfR0VUXyosIFNfU0VUXyopIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9ucy4KLQkqIHN5bWJvbHMuaDogRml4IHByb3RvdHlwZXMgZm9yIG5ldyBjb25zdCBhcmd1bWVudHMuICBBZGQKLQlwcm90b3R5cGVzIGZvciBCRkRfQVNTRU1CTEVSIFNfKiBmdW5jdGlvbnMuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSkgW0JGRF9BU1NFTUJMRVJdOiBCRkQgdmVyc2lvbiBvZiBjb2RlCi0JZm9yIGNoYW5naW5nIHRvIGFuIGV4aXN0aW5nIHNlY3Rpb24uCi0JKHN1YnNlZ19uZXdfcmVzdCkgW0JGRF9BU1NFTUJMRVJdOiBTcGxpdCBvZmYgZnJvbSBzdWJzZWdfbmV3LAotCWNhbGxlZCBieSBzdWJzZWdfbmV3IGFuZCBzdWJzZWdfc2V0LgotCShzdWJzZWdfbmV3KSBbQkZEX0FTU0VNQkxFUl06IFJld3JpdHRlbiB0byBjaGFuZ2UgdG8gbmV3IHNlY3Rpb24sCi0JZ2l2ZW4gc2VjdGlvbiBuYW1lIGFuZCBzdWJzZWcgbnVtYmVyLgotCShzdWJzZWdfc2V0KSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbjsgY2hhbmdlIHRvIGEgcG9zc2libHkKLQluZXcgc2VjdGlvbi9zdWJzZWN0aW9uLgotCi0JKiByZWFkLmM6IERvbid0IGluY2x1ZGUgY3R5cGUuaC4KLQkoY29ucykgW0JGRF9BU1NFTUJMRVJdOiBGb3IgdW5kZWZpbmVkIHN5bWJvbHMsIHVzZSBCRkRfUkVMT0NfMzIKLQlmb3Igbm93OyBzaG91bGQgYmUgbWFjaGluZS1kZXBlbmRlbnQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0ICotKi1lbGYgYW5kICotKi1zb2xhcmlzKiBhcyBFTEYgZm9ybWF0Ci0JdGFyZ2V0cywgZm9yY2luZyBCRkQgdXNlLgotCi1XZWQgRmViIDE3IDE4OjU5OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmM6IFVzZSBQQVJBTVMgbWFjcm8gZm9yIHN0YXRpYyBmdW5jdGlvbgotCWRlY2xhcmF0aW9ucy4gIFVzZSBCRkRfUkVMT0NfIG1hY3JvcyBldmVyeXdoZXJlLCB3aXRoCi0JY29tcGF0aWJpbGl0eSBtYWNyb3MgZGVjbGFyZWQgZm9yIG5vbi1CRkQgbW9kZS4KLQkoc3RydWN0IHNwYXJjX2l0KSBbQkZEX0FTU0VNQkxFUl06IFVzZSBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLQlpbnN0ZWFkIG9mIGVudW0gcmVsb2NfdHlwZS4KLQkoZW1pdF9zcGFyY19yZWxvYyk6IENvbW1lbnRlZC1vdXQgZnVuY3Rpb24gZGVsZXRlZC4KLQkobWRfY29udmVydF9mcmFnKTogRGVsZXRlZC4KLQkodGNfYW91dF9wcmVfd3JpdGVfaG9vayk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQkobWRfYXBwbHlfZml4KTogQ2hhbmdlZCBjYWxsaW5nIHNlcXVlbmNlIChjb25kaXRpb25hbGx5KSBmb3IgQkZECi0JdmVyc2lvbi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9jb252ZXJ0X2ZyYWcpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9zdGFiKTogUmVmZXIgdG8gdW5kZWZpbmVkX3NlY3Rpb24sCi0Jbm90IFNFR19VTktOT1dOLiAgVXNlIFNfU0VUX1RZUEUsIFNfR0VUX1RZUEUsIFNfR0VUX0RFU0MgaW5zdGVhZAotCW9mIHJlZmVyZW5jaW5nIGZpZWxkcyBkaXJlY3RseS4KLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IE5ldyBmdW5jdGlvbjsgZXh0cmFjdGVkIGZyb20KLQl3cml0ZV9vYmplY3RfZmlsZS4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpIFshIEJGRF9BU1NFTUJMRVJdOiBDYWxsIGl0LgotCShyZWxheF9hbmRfc2l6ZV9zZWcpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uOyByZWxheCBzZWN0aW9uCi0JYW5kIHNldCBpdHMgc2l6ZSBhbmQgZmxhZ3MuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKSBbQkZEX0FTU0VNQkxFUl06IFJlcGxhY2Ugc29tZQotCWZpZWxkcyB3aXRoIEJGRCBlcXVpdmFsZW50cy4gIFR1cm4gb24gYmFjay1wb2ludGVycywgYW5kIGFkZAotCXRhcmdldC1zcGVjaWZpYyBmaWVsZHMgYXQgZW5kLgotCi1UaHUgRmViIDExIDA5OjIwOjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCB2YWRkciBoZXJlLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IFNldCBpdCBoZXJlIGluc3RlYWQsIHNvIHRoYXQgZml4dXBfc2VnbWVudAotCWNhbiBzZWUgdGhlIGNvcnJlY3QgdmFsdWUuCi0KLU1vbiBGZWIgIDggMTM6NTY6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENoZWNrIGZvciBlcnJvcnMgYW5kIHdhcm5pbmdzIGFuZAotCWJhaWwgb3V0IGJlZm9yZSBwcm9jZXNzaW5nIGNvbnRlbnRzLgotCShjaGFpbl9mcmNoYWluc190b2dldGhlcl8xKTogTmV3IGZ1bmN0aW9uLCBkb2VzIG1vc3Qgb2YgdGhlIHdvcmsKLQlvZiByZW1vdmVfc3Vic2Vncy4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCShyZW1vdmVfc3Vic2VncykgWyEgQkZEXTogQ2FsbCBpdC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpIFtCRkRfQVNTRU1CTEVSXTogQ29udmVydGVkIHRvIHVzZSBCRkQKLQlzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcy4KLQotCSogY29uZmlnL29iai1lbGYuKjogTmV3IGZpbGVzLgotCi0JKiBjb25maWcvbWlwcy5tdCwgY29uZmlnL3JzNjAwMC5tdDogRGVsZXRlZC4KLQotCSogY29uZmlnL2g4MzAwLm10OiBEb24ndCBzcGVjaWZ5IGNvbXBpbGVyIGhlcmUuCi0KLQkqIGNvbmZpZy96OGsubXQ6IFRoZSB6OGsgY29kZSBkZXBlbmRzIG9uIHRoZSB6OGsgb3Bjb2RlIHRhYmxlLAotCW5vdCB0aGUgaDgzMDAgb25lLgotCSogY29uZmlnL3RjLXo4ay5oOiBDb21tZW50IGZpeC4KLQotCSogd3JpdGUuYzogUmVvcmRlcmVkIHNvbWUgZnVuY3Rpb25zIGZvciBiZXR0ZXIgaW5saW5pbmcuCi0JKGZpeHVwX3NlZ21lbnQpOiBMaW5rcmVsYXggY29kZSBpcyBubyBsb25nZXIgY29uZGl0aW9uYWwgb24KLQlUQ19JOTYwLgotCi1UaHUgRmViICA0IDEyOjQ1OjE2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcve2g4NTAwLm10LCB0Yy1oODUwMC5jLCB0Yy1oODUwMC5oLCBvYmotY29mZmJmZC5jLAotCW9iai1jb2ZmYmZkLmh9OiBzdXBwb3J0IGZvciB0aGUgSDgvNTAwCi0KLVdlZCBGZWIgIDMgMTk6Mjg6MTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZSBWTVMgdmVyc2lvbiBoZXJlLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBOb3QgaGVyZS4KLQkoZml4X25ldyk6IEluaXRpYWxpemUgZnhfYWRkbnVtYmVyLgotCi0JKiBsaXN0aW5nLmM6IERvbid0IGluY2x1ZGUgdGFyZ2V0LWNwdS5oIGV4cGxpY2l0bHksIHNpbmNlIGFzLmgKLQlpbmNsdWRlcyBpdC4KLQotVGh1IEphbiAyOCAwMDozNTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuaCBbQkZEX0FTU0VNQkxFUl06IERvbid0IGRlY2xhcmUgbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwKLQkqX2ZpeF9yb290LCAqX2ZpeF90YWlsLCBzZWdfZml4X3Jvb3RQLCBzZWdfZml4X3RhaWxQLgotCShzdHJ1Y3QgZml4KTogUmVvcmRlcmVkIGZpZWxkcyBmb3IgY29tcGFjdG5lc3MgYW5kIGVmZmljaWVuY3kuCi0JQ29udmVydGVkIHNvbWUgbG9naWNhbCBmaWVsZHMgdG8gMS1iaXQgZmllbGRzLgotCi0JKiBjb25maWcvb2JqLWFvdXQuaDogVXNlIFBBUkFNUy4KLQlbQkZEX0FTU0VNQkxFUl06IERvbid0IGRlZmluZS9kZWNsYXJlIEFPVVRfTUFDSFRZUEUsIHNlZ19OX1RZUEUsCi0JTl9UWVBFX3NlZywgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFLgotCi0JKiByZWFkLmM6IERvbid0IGluY2x1ZGUgbGlzdGluZy5oOyBhcy5oIGluY2x1ZGVzIGl0LiAgUmVtb3ZlZAotCURPTlRERUYgY29kZS4KLQlbQkZEX0FTU0VNQkxFUl06IEluY2x1ZGUgc3Vic2Vncy5oLgotCShvbGRfYnVmZmVyLCBuZXdfYnJva2VuX3dvcmRzKTogRGVmYXVsdCBpbml0aWFsaXphdGlvbiBpcwotCXN1ZmZpY2llbnQuCi0KLQkqIG91dHB1dC1maWxlLmMgW0JGRF9BU1NFTUJMRVJdOiBJbmNsdWRlIGJmZC5oLCBkZWZhdWx0IFRBUkdFVF9NQUNICi0JdG8gMCwgZGVmaW5lIHN0ZG91dHB1dC4KLQkob3V0cHV0X2ZpbGVfY3JlYXRlKSBbQkZEX0FTU0VNQkxFUl06IENhbGwgYmZkX3BlcnJvciBvbiBmYWlsdXJlLgotCUNhbGwgYmZkX3NldF9hcmNoX21hY2guCi0JKG91dHB1dF9maWxlX2Nsb3NlKSBbQkZEX0FTU0VNQkxFUl06IENhbGwgYmZkX2Nsb3NlLCBub3QKLQliZmRfY2xvc2VfYWxsX2RvbmUuICBDYWxsIGJmZF9wZXJyb3Igb24gZmFpbHVyZS4KLQkob3V0cHV0X2ZpbGVfYXBwZW5kKSBbQkZEX0FTU0VNQkxFUl06IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnL202OGtjb2ZmLm10IChMT0NBTF9MT0FETElCRVMpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEFsd2F5cyBkZWZpbmUuICBPbWl0IGZpZWxkIHNjbmhkcgotCWlmIG5vdCBNQU5ZX1NFR01FTlRTLiAgRGVmaW5lIG5ldyBmaWVsZCBiZmRfc2VjdGlvbiBpZgotCUJGRF9BU1NFTUJMRVIuCi0JKHNlZ19pbmZvKTogTmV3IG1hY3JvLgotCi0JKiBleHByLmMsIGlucHV0LXNjcnViLmM6IFVzZSBQQVJBTVMgbWFjcm8uICBEZWxldGVkIHVudXNlZAotCXZhcmlhYmxlcywgYW5kIHNvbWUgaXJyZWxldmFudCBjb21tZW50cy4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBJbmNsdWRlICQoQkZEREVGKS4KLQkoTElCUyk6IEluY2x1ZGUgJChCRkRMSUIpLiAgRG9uJ3QgYm90aGVyIHdpdGggJChDTElCKS4KLQkqIGNvbmZpZ3VyZS5pbjogIFBlcm1pdCAtLXdpdGgtYmZkLWFzc2VtYmxlciBub3csIHdpdGggYSB3YXJuaW5nLgotCVZhcmlhYmxlIG5lZWRfYmZkIGlzIG5vdyBhIGJvb2xlYW4sIGFzIGlzIG5ldyB2YXJpYWJsZSBiZmRfZ2FzLgotCVNldCBCRkRERUYgYW5kIEJGRExJQiBpbiBNYWtlZmlsZSB3aGVuIGFwcHJvcHJpYXRlLgotCi0JKiBhcy5jOiBSZW1vdmVkICIjaWZkZWYgRE9OVERFRiIgYW5kICIjaWZkZWYgY29tbWVudCIgY29kZS4KLQkobWFpbik6IFJlZmVyIHRvIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCBpbnN0ZWFkIG9mCi0JZmxhZ3NlZW5bJ1onXS4KLQotCSogYXMuYyAobWFpbikgW0JGRF9BU1NFTUJMRVJdOiBPcGVuIG91dHB1dCBiZmQuCi0JKCpfc2VjdGlvbikgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUgdGhlbS4KLQkocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKSBbQkZEX0FTU0VNQkxFUl06IEluaXRpYWxpemUgdGhlbSwgYW5kCi0Jc2V0IHNlY3Rpb24gZmxhZ3Mgd2hlbiBhcHByb3ByaWF0ZS4KLQkqIGFzLmggKFNFR19OT1JNQUwpIFtCRkRfQVNTRU1CTEVSXTogUmVxdWlyZSB0aGF0IHRoZSBzcGVjaWZpZWQKLQlzZWN0aW9uIGlzIG5vdCBhYnNvbHV0ZSwgdW5kZWZpbmVkLCBvciBhbiBhc3NlbWJsZXIgaW50ZXJuYWwgb25lLgotCShhYnNvbHV0ZV9zZWN0aW9uLCB1bmRlZmluZWRfc2VjdGlvbik6IEFsd2F5cyBkZWZpbmUuCi0JKiBleHByLmMsIHJlYWQuYywgc3ltYm9scy5jOiBSZWZlciB0byAqX3NlY3Rpb24sIG5vdCBTRUdfKjsgYnJlYWsKLQlzd2l0Y2ggc3RhdGVtZW50cyBpbnRvIGlmLWVsc2UgdHJlZXMuCi0JKiBzeW1ib2xzLmMgW01BTllfU0VHTUVOVFNdOiBEZWxldGVkIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZgotCVNFR19CU1MgYW5kIFNFR19EQVRBLgotCi0JKiBhcy5oIChmcmFnX25vd19maXgpOiBOZXcgbWFjcm8uCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogVXNlIGl0LgotCi1XZWQgSmFuIDI3IDIxOjQzOjUzIFBTVCAxOTkzICBSYWxwaCBDYW1wYmVsbCAgKHJhbHBoY0BweXJhbWlkLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYzogIEFkZGVkIG1pcHMgc3VwcG9ydCBmb3IgbWlwcy1kZWMtYnNkLgotCSogY29uZmlnL3RjLW1pcHMuaDogIEFkZGVkIG1pcHMgc3VwcG9ydCBmb3IgbWlwcy1kZWMtYnNkLgotCSogY29uZmlnL2hvLW1pcHNic2QuaDogIEFkZGVkIG1pcHMgc3VwcG9ydCBmb3IgbWlwcy1kZWMtYnNkLgotCSogY29uZmlnL21pcHMtb3Bjb2RlLmg6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZGVkIG1pcHMgc3VwcG9ydCBmb3IgbWlwcy1kZWMtYnNkLgotCSogYXRvZi1nZW5lcmljLmM6ICBEZWZpbmUgVFJVRSBhbmQgRkFMU0UgaWYgbm90IGRlZmluZWQuCi0KLVRodSBKYW4gMjEgMTI6NDg6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB2ZXJzaW9uLmM6IEJ1bXBlZCB2ZXJzaW9uIG51bWJlciB0byAxLjkzLjA1LgotCi1XZWQgSmFuIDIwIDE3OjExOjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogRG9uJ3QgdXNlICNlbGlmLgotCShvYmpfZW1pdF9saW5lbm8pOiBEb24ndCBuZWVkIHJldHVybiBhdCBlbmQgb2Ygdm9pZCBmdW5jdGlvbi4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCi0JKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogQXJyYXkgbmJ5dGVzX3JfbGVuZ3RoIGlzIG5vdyBjb25zdC4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVENfQ09VTlRfUkVMT0MpOiBEb24ndCBlbWl0IHJlbG9jIGlmIG9ubHkKLQlvZmZzZXQgZmllbGQgaXMgc2V0LgotCi1GcmkgSmFuICA4IDA1OjQ0OjQ5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRm9yICV1aGkgYW5kICV1bG8sIGlmIG5vdAotCUVOVjY0LCBlbWl0IG5vIHJlbG9jLgotCShtZF9wc2V1ZG9fdGFibGUpOiBGb3IgIi54d29yZCIsIGNhbGwgc194d29yZC4KLQkoc194d29yZCk6IE5ldyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGFyY2hpdGVjdHVyZV9yZXF1ZXN0ZWQsIHdhcm5fb25fYnVtcCwKLQltZF9yZWxheF90YWJsZSk6IFVzZSBkZWZhdWx0IHplcm8gaW5pdGlhbGl6YXRpb24uCi0JKHNfcmVzZXJ2ZSk6IFNpbmNlIFNFR19FMiBpcyBlcXVpdmFsZW50IHRvIFNFR19CU1MsIGp1c3QgdXNlIHRoZQotCWxhdHRlciwgaW5zdGVhZCBvZiBzZWxlY3Rpbmcgd2l0aCBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzLgotCi1UaHUgSmFuICA3IDA4OjU4OjIxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pc2UgYWxsIHNwYXJjbGl0ZSB2YXJpYW50cwotCi1UaHUgSmFuICA3IDA1OjI1OjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2RhdGEpIFshQkZEX0FTU0VNQkxFUl06IEZpeCB0eXBvIGluIDQgSmFuIGNoYW5nZSAtLQotCWFjY2lkZW50YWxseSBjaGFuZ2VkIHRvIHVzZSBzdWJzZWdfY2hhbmdlIHdoZXJlIGl0IHNob3VsZCBoYXZlCi0JYmVlbiBzdWJzZWdfbmV3LgotCi1UdWUgSmFuICA1IDA4OjQyOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogSWYgY2hhcmFjdGVyIG90aGVyIHRoYW4gY29tbWEgb3IgbmV3bGluZSBpcyBhCi0JbG9naWNhbCBlbmQtb2YtbGluZSBjaGFyYWN0ZXIsIHVzZSB0aGUgbmV3bGluZSBjYXNlLgotCUZyb20gRXJpYyBZb3VuZ2RhbGU6Ci0JKG9wZXJhbmQpOiBTZXQgWF9hZGRfbnVtYmVyIGZpZWxkIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCShvcGVyYW5kKTogVHJlYXQgemVybyBieXRlIGFzIGVuZC1vZi1vcGVyYW5kLgotCi0JKiBjb25maWd1cmUuaW4gKHBlci10YXJnZXQpOiBMb29rIGZvciB3aXRoX2JmZF9hc3NlbWJsZXIgb3B0aW9uLgotCUZvciBub3csIG9ubHkgYWNjZXB0ICJubyIsIHVudGlsIHRoZSBtZXJnZSBpcyBkb25lLgotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBFcmljIFlvdW5nZGFsZSAoeW91bmdkYWxlQHY2NTUwYy5ucmwubmF2eS5taWwpOgotCSogYXMuYywgZmxvbnVtLWtvbnN0LmMsIGhleC12YWx1ZS5jLCBpbnB1dC1maWxlLmMsIHZlcnNpb24uYywKLQkgIGNvbmZpZy9vYmotYW91dC5oLCBjb25maWcvb2JqLXZtcy5jOiBWTVMgLT4gSE9fVk1TLgotCSogcmVhZC5jOiBGaW5pc2ggY29udmVyc2lvbiB0byBTXyogbWFjcm9zIGluIHRoZSBWTVMgb25seQotCSAgcGFydHMgb2YgdGhlIHByb2dyYW0uIEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvIGhleF92YWx1ZS4KLQkqIGFzLmMsIHJlYWQuYywgc3ltYm9scy5jLCB3cml0ZS5jOiBDaGFuZ2UgImlmZGVmIFZNUyIgdG8KLQkgICJpZmRlZiBPQkpfVk1TIi4KLQkqIGV4cHIuYzogQWRkICJjb25zdCIgbW9kaWZpZXIgdG8gaGV4X3ZhbHVlLgotCSogc3ltYm9scy5jOiBGaW5pc2ggY29udmVyc2lvbiB0byBTXyogbWFjcm9zIGluIHRoZSBWTVMgb25seQotCSAgcGFydHMgb2YgdGhlIHByb2dyYW0uICBBZGQgImNvbnN0IiBtb2RpZmllciB0bwotCSAgbWRfW2xvbmcsc2hvcnRdX2p1bXBfc2l6ZS4gUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIGNvbnN0X2ZsYWcKLQkgICh3aGljaCB3aWxsIGJlIGRlY2xhcmVkIGluIG9iai12bXMuaCkuCi0JKiB3cml0ZS5jOiBBZGQgImNvbnN0IiBtb2RpZmllciB0byBtZF9bbG9uZyxzaG9ydF1fanVtcF9zaXplLgotCSAgRml4IGFyZ3VtZW50cyB0byBWTVNfd3JpdGVfb2JqZWN0X2ZpbGUuCi0JKiBjb25maWctZ2FzLmNvbTogTmV3IGZpbGUuICBTY3JpcHQgZm9yIFZNUyBzeXN0ZW1zIHRvIHNldCB1cCB0aGUKLQkgIGNvbmZpZ3VyYXRpb24gdG8gYnVpbGQgZ2FzIGZvciBWTVMsIGFuZCBjcmVhdGUgY29uZmlnLnN0YXR1cy4KLQkqIG1ha2UtZ2FzLmNvbTogUmVkb25lIHRvIHdvcmsgd2l0aCBuZXcgc2NoZW1lLgotCSogb2JqLXZtcy5jOiBQYXRjaCB0byBmaXggYnVnIHdoZXJlIHdlIHdlcmUgbm90IGNvcnJlY3RseSBwYXJzaW5nIHRoZQotCSAgc3RhYnMgZGlyZWN0aXZlcy4KLQkqIG9iai12bXMuYzogIERlZmluZSBtYWNyb3MgQ09QWV9MT05HIGFuZCBDT1BZX1NIT1JUIHdoaWNoCi0JICB3aWxsIHN3YXAgYnl0ZXMgaWYgbmVlZGVkIG9uIGEgYmlnIGVuZGlhbiBzeXN0ZW0uICBVc2UgdGhyb3VnaG91dAotCSAgYXMgbmVlZGVkLgotCSogb2JqLXZtcy5jIChvYmpfYW91dF9zdGFiKTogIEFkZCBjb2RlIHRvIGdlbmVyYXRlIGxpc3RpbmcgZmlsZS4KLQkqIG9iai12bXMuYyAoVk1TX3R5cGVkZWZfcGFyc2UpOiBBZGQgYWxpYXMgdG8gY29ycmVjdGx5IGhhbmRsZSBjZXJ0YWluCi0JICB0eXBlcyBvZiBtYWxmb3JtZWQgc3RhYnMuICBDaGFuZ2UgcGFyc2luZyBhbGdvcml0aG0gc28gdGhhdCB3ZSBhcmUKLQkgIG1vcmUgY2VydGFpbiBvZiBoYXZpbmcgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdlIG5lZWQgb24gaGFuZC4KLQkqIG9iai12bXMuYyAoZmluYWxfZm9yd2FyZF9yZWZlcmVuY2UpOiAgTmV3IGZ1bmN0aW9uLCB1c2VkIHRvIGhlbHAKLQkgIHJlc29sdmUgdGhlIGRhdGEgdHlwZXMgb2YgYXMgbWFueSBzdHJ1Y3QgZWxlbWVudHMgYXMgcG9zc2libGUKLQkgIHdoZW4gc29tZSBwYXJ0IG9mIHRoZSBzdHJ1Y3QgaXMgbm90IGZ1bGx5IGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyLgotCSogb2JqLXZtcy5jIChWTVNfTFNZTV9QYXJzZSk6ICBDb3JyZWN0bHkgaGFuZGxlIGNhc2Ugb2YgY29udGludWF0aW9uCi0JICBzdGFicyBkaXJlY3RpdmVzLgotCSogb2JqLXZtcy5jIChWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBEZWZpbmUgYWxsIHZ0YWJsZSBwc2VjdHMKLQkgIGFzIHN5bWJvbHMgYXMgd2VsbCBpbiB0aGUgb2JqZWN0IGZpbGUuICBMb29rIGZvciBleHRlcm5hbCBmdW5jdGlvbnMKLQkgIHRoYXQgc3RhcnQgd2l0aCAiX192dC4iLCBhbmQgdHVybiB0aGVtIGludG8gdmFyaWFibGVzLCBzaW5jZSB0aGUKLQkgIGcrKyBjb21waWxlciBpcyBpbmNhcGFibGUgb2YgZG9pbmcgdGhpcy4KLQkqIHRjLXZheC5jOiBBZGQgJzEnIG9wdGlvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIEdDQwotCSAgdmVyc2lvbnMuCi0JKiBiaWdudW0tY29weS5jIChiaWdudW1fY29weSk6IEZpeCBidWcgd2hlcmUgd2UgcGFkIHdpdGggemVyb2VzLgotCSogaW5wdXQtc2NydWIuYyAoYXNfd2hlcmUpOiBGaXggYnVnIHdoZXJlIGFzIHdvdWxkIGNyYXNoIGlmIHdlIGRpZCBub3QKLQkgIGhhdmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHlldC4KLQkqIGNvbmZpZy9oby12bXMuaDogZGVmaW5lIEhPX1ZNUywgbm90IEhPX1ZBWC4KLQotTW9uIEphbiAgNCAwNToxNzoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2RhdGEpOiBBbHdheXMgdXNlICJkYXRhX3NlY3Rpb24iLCBzaW5jZSBpdCdsbCBtYXAgdG8KLQlTRUdfREFUQSBvciBTRUdfRTEgaWYgbmVlZGVkLgotCShzX2xjb21tKTogTGlrZXdpc2Ugd2l0aCBic3Nfc2VjdGlvbi4KLQkoc19maWxsKTogVXNlIG1lbXNldCwgbm90IGJ6ZXJvLgotCi1UaHUgRGVjIDMxIDA0OjI5OjI3IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiByZWFkLmM6IERlbGV0ZWQgc29tZSBjb2RlIHVuZGVyICIjaWZkZWYgRE9OVERFRiIgdGhhdCB3YXMgZm9yCi0JaGFuZGxpbmcgR0RCIHN5bWJvbCB0YWJsZSBkYXRhLgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoc2VnbWVudF9uYW1lKTogRGVsZXRlIGRlZmluaXRpb24uCi0JKHNlZ19uYW1lKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCSogY29uZmlnL29iai1ib3V0LmggKHNlZ21lbnRfbmFtZSwgc2VnX25hbWUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotdm1zLmggKHNlZ21lbnRfbmFtZSwgc2VnX25hbWUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChzZWdtZW50X25hbWUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChzZWdtZW50X25hbWUpOiBEaXR0by4KLQotCSogQ2hhbmdlcyBmb3IgQkZEX0FTU0VNQkxFUjoKLQkqIG9iai5oIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogRGVjbGFyZSBvbmx5IGlmIG5vdAotCUJGRF9BU1NFTUJMRVIuCi0JKG9ial9oZWFkZXJfYXBwZW5kLCBvYmpfcHJlX3dyaXRlX2hvb2spOiBEaXR0by4KLQkqIGFzLmggKHN0ZG91dHB1dCk6IE5ldyB2YXIsIGRlZmluZWQgb25seSBpZiBCRkRfQVNTRU1CTEVSLgotCShzZWdUKSBbQkZEX0FTU0VNQkxFUl06IE5ldyB0eXBlZGVmIGZvciAiYXNlY3Rpb24gKiIuCi0JKHNlZ21lbnRfbmFtZSkgSWYgQkZEX0FTU0VNQkxFUiwgbG9vayB1cCBCRkQgc2VjdGlvbiBuYW1lOwotCW90aGVyd2lzZSwgdXNlIHNlZ19uYW1lIGFycmF5LgotCShzZWdfbmFtZSk6IERlY2xhcmUgb25seSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkoc2VjdGlvbl9hbGlnbm1lbnQpOiBEZWNsYXJlIG9ubHkgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKGJpZ19zZWN0aW9uLCByZWdfc2VjdGlvbiwgcGFzczFfc2VjdGlvbiwgZGlmZl9zZWN0aW9uLAotCWFic2VudF9zZWN0aW9uLCB0ZXh0X3NlY3Rpb24sIGRhdGFfc2VjdGlvbiwgYnNzX3NlY3Rpb24pOiBJZgotCUJGRF9BU1NFTUJMRVIsIGRlY2xhcmUgYXMgdmFyaWFibGVzOyBvdGhlcndpc2UsIGRlY2xhcmUgYXMgbWFjcm9zLAotCW1hcHBpbmcgdG8gc2VnVCBlbnVtIHZhbHVlcy4KLQkodGNfYW91dF9maXhfdG9fY2hhcnMsIG5leHRfb2JqZWN0X2ZpbGVfY2hhclApOiBGb3JjZSBwYXJzZSBlcnJvcnMKLQlpZiB0aGVzZSBhcmUgdXNlZCBvciBkZWZpbmVkLCBpZiBCRkRfQVNTRU1CTEVSLgotCShzdWJzZWdfc2V0LCBzdWJzZWdfbmV3KSBbQkZEX0FTU0VNQkxFUl06IEZ1bmN0aW9uYWxpdHkgb2Ygb2xkCi0Jc3Vic2VnX25ldyBzcGxpdCBpbnRvIHR3byBmdW5jdGlvbnMuCi0JKFNFR19OT1JNQUwpOiBGb3IgQkZEX0FTU0VNQkxFUiwgYWx3YXlzIHJldHVybiB0cnVlLCBmb3Igbm93LgotCi0JKiBhcy5oICh2b2xhdGlsZSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0JKGhhZF9lcnJvcnMsIGhhZF93YXJuaW5ncyk6IFByb3ZpZGUgcHJvdG90eXBlcyBmb3IgQU5TSSBDIGV2ZW4gaWYKLQlOT19TVERBUkcuCi0JKGFzX2JhZCwgYXNfZmF0YWwsIGFzX3Rza3RzaywgYXNfd2Fybik6IEZvciBHTlUgQyB2ZXJzaW9uIDIsCi0JZGVjbGFyZSB3aXRoIGZvcm1hdCBhdHRyaWJ1dGUgZm9yIC1XZm9ybWF0IGNoZWNraW5nLgotCi1XZWQgRGVjIDMwIDEwOjE4OjU3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMsIGNvbmZpZy90Yy0qLmM6IERvbid0IGluY2x1ZGUgcmVhZC5oLCBzaW5jZSBpdCBpcyBhbHJlYWR5Ci0JaW5jbHVkZWQgYnkgYXMuaC4KLQotCSogVGhlc2UgYXJlIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNaW5oIFRyYW4tbGUKLQk8bXRyYW5sZUBwYXJpcy5pbnRlbGxpY29ycC5jb20+LgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LWlibS1haXgqKTogQWNjZXB0IGk0ODYgZm9yIGhvc3QuICBVc2UKLQlvYmpfZm9ybWF0IGNvZmZiZmQgYW5kIGdhc190YXJnZXQgaTM4NmNvZmYgZm9yIHRhcmdldC4KLQkoaVszNF04Ni0qLWlzYyopOiBOZXcgaG9zdCAodXNlcyBzeXN2KS4KLQkqIGNvbmZpZy9pMzg2YWl4Lm10OiBSZW1vdmVkIChubyBsb25nZXIgdXNlZCkuCi0JKiBjb25maWcvbWgtaTM4NmFpeCAoUkFOTElCKTogVXNlIHRydWUgcmF0aGVyIHRoYW4gL2Jpbi90cnVlLgotCShNSU5VU19HKTogUmVtb3ZlZC4KLQkoTERGTEFHUyk6IEFkZGVkLCBkZWZpbmVkIGFzIC1zaGxpYi4KLQkqIGNvbmZpZy90ZS1pMzg2YWl4LmggKFJFVkVSU0VfU09SVF9SRUxPQ1MpOiBVbmRlZmluZS4KLQkqIGNvbmZpZy90ZS1zY28zODYuaCAoTE9DQUxfTEFCRUwpOiBEb24ndCBkZWZpbmUuCi0JKERPVF9MQUJFTF9QUkVGSVgpOiBEZWZpbmUuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBET1RfTEFCRUxfUFJFRklYLCB1c2UgLkwwXDAwMSBhcyBhIGxhYmVsCi0JbmFtZSByYXRoZXIgdGhhbiBMMFwwMDEuCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBNYWtlIGEgZnJhZyBpbiBTRUdfQlNTIHJhdGhlciB0aGFuIHVzaW5nCi0JbG9jYWxfYnNzX2NvdW50ZXIuCi0JKiBzeW1ib2xzLmMsIHN5bWJvbHMuaCAobG9jYWxfYnNzX2NvdW50ZXIpOiBSZW1vdmVkLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBic3Mgbm8gbG9uZ2VyIHVzZXMKLQlsb2NhbF9ic3NfY291bnRlci4gIFBhc3MgY29ycmVjdCBkYXRhIGFuZCBic3Mgc2l6ZSB0bwotCVZNU193cml0ZV9vYmplY3RfZmlsZS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IEFjY2VwdCBic3Mgc2l6ZSBhcwotCWFyZ3VtZW50LCByYXRoZXIgdGhhbiB1c2luZyBsb2NhbF9ic3NfY291bnRlci4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKHNfYnNzKTogRG9uJ3QgdXNlIGxvY2FsX2Jzc19jb3VudGVyLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IERvbid0IHVzZSBsb2NhbF9ic3NfY291bnRlci4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChoYWRfbGluZW5vLCBoYWRfcmVsb2MpOiBSZW1vdmVkLgotCShzaXplX3NlY3Rpb24pOiBSZXN0b3JlZCBzYW5pdHkgY2hlY2suCi0JKGRvX3JlbG9jc19mb3IpOiBCYXNlIHNlY3Rpb24gYWRkcmVzcyBvbiBzX3BhZGRyIHJhdGhlciB0aGFuCi0JY29tcHV0aW5nIGl0LiAgQWRqdXN0IGEyOWsgUl9JSElIQUxGIHNwZWNpYWwgY2FzZSB0byBhY2NvdW50IGZvcgotCXNlY3Rpb24gcGFkZHIgKHVzZWQgdG8gcmVxdWlyZSBwYWRkciB0byBiZSB6ZXJvKS4gIElmIHRoZXJlIGFyZSBubwotCXJlY2xvcywgc2V0IHNfcmVscHRyIHRvIDAuICBTZXQgcmVsb2NhdGlvbiBzaXplIGluIG9iamVjdF9oZWFkZXJzLgotCShmaWxsX3NlY3Rpb24pOiBBbHdheXMgc2V0IHNfdmFkZHIgaGVyZSwgcmVtb3ZpbmcKLQlaRVJPX0JBU0VEX1NFR01FTlRTIGNhc2UuICBGb3JjZSBzX3NjbnB0ciBmb3IgYnNzIHRvIDAuICBEb24ndCBzZXQKLQlOT0xPQUQgZm9yIGkzODYgLmJzcywgYmVjYXVzZSBpdCBjb25mdXNlcyB0aGUgU1ZSMyBuYXRpdmUgbGlua2VyLgotCVNldCBTVFlQX0lORk8gZm9yIC5jb21tZW50LgotCShjb2ZmX2hlYWRlcl9hcHBlbmQpOiBVc2Ugb2JqZWN0IGhlYWRlcnMgYW5kIEhfe1NFVCxHRVR9XyogbWFjcm9zLgotCU1ha2UgYW91dGhkciB3cml0aW5nIGRlcGVuZCBvbiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUi4KLQkoY3Jhd2xfc3ltYm9scyk6IEhhbmRsZSA4IGNoYXJhY3RlciBzZWN0aW9uIG5hbWUgY29ycmVjdGx5LiAgVXNlCi0JSF97U0VULEdFVH1fKiBtYWNyb3MuCi0JKGRvX2xpbmVub3NfZm9yKTogU2V0IGxpbmVubyBzaXplIGluIG9iamVjdF9oZWFkZXJzLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBIX3tTRVQsR0VUfV8qIG1hY3Jvcy4gIERvbid0IGJvdGhlciB0bwotCXNldCBzX3ZhZGRyIGhlcmUuICBJZiBzdHJpbmdfYnl0ZV9jb3VudCByZW1haW5zIDQsIHNldCBpdCBiYWNrIHRvCi0JMCwgYW5kIG9ubHkgd3JpdGUgc3RyaW5ncyBvdXQgaWYgdGhlcmUgYXJlIHNvbWUuICBDYWxsCi0JZmlsbF9zZWN0aW9uIGJlZm9yZSBkb19yZWxvY3NfZm9yIGFuZCBkb19saW5lbm9zX2Zvci4KLQkob2JqX2NvZmZfc2VjdGlvbik6IEhhbmRsZSBvcHRpb25hbCBxdW90ZWQgc2Vjb25kIGFyZ3VtZW50IGdpdmluZwotCXNlY3Rpb24gY2hhcmFjdGVyaXN0aWNzLgotCShvYmpfY29mZl9ic3MpOiBBZGRlZCB0byBoYW5kbGUgLmJzcy4KLQkob2JqX2NvZmZfaWRlbnQpOiBBZGRlZCB0byBoYW5kbGUgLmlkZW50IChwdXRzIHN0cmluZyBpbiAuY29tbWVudAotCXNlY3Rpb24pLgotCShvYmpfY29mZl9sY29tbSk6IFB1dCBjb21tb24gc3ltYm9scyBpbiAuYnNzLCBub3QgLmRhdGEuCi0JKGZpeHVwX21kZXBzKTogQ2hhbmdlIHRvIHNlZ21lbnQuICBDYWxsIGZyYWdfd2FuZSBhZnRlcgotCW1kX2NvbnZlcnRfZnJhZy4KLQkoZml4dXBfc2VnbWVudCk6IEV4cGxpY2l0bHkgY2hlY2sgU19JU19DT01NT04gYmVmb3JlIG1ha2luZyAzODYKLQlhZGp1c3RtZW50IChhbHJlYWR5IGhhcHBlbmVkIG9ubHkgZm9yIGNvbW1vbiBzeW1ib2xzLCBidXQgdGhpcyBpcwotCWNsZWFyZXIpLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAoc19ic3MpOiBEb24ndCB1c2UgaWYgSTM4NkNPRkYuCi0JKG1kX3BzZXVkb190YWJsZSk6IElnbm9yZSAub3B0aW0gYW5kIC5ub29wdC4KLQkodGNfY29mZl9zaXplbWFjaGRlcCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFJFVkVSU0VfU09SVF9SRUxPQ1MpOiBVbmRlZiwgZm9yIFNWUjMKLQljb21wYXRpYmlsaXR5LgotCShMT0NBTF9MQUJFTCk6IFJlbW92ZWQgZGVmaW5pdGlvbi4KLQkoRE9UX0xBQkVMX1BSRUZJWCk6IERlZmluZWQuCi0KLU1vbiBEZWMgMjggMTA6MzI6MDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChhcHBfcHVzaCk6IFVzZSBtZW1jcHksIG5vdCBiY29weS4KLQkoZG9fc2NydWJfbmV4dF9jaGFyKTogRm9yIFwiLCByZXR1cm4gIiBub3QgJy4KLQkoc3ltYm9sX2NoYXJzKTogTm93IGNvbnN0LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBub3QgTE9DQUxfTEFCRUxTX0ZCLCBkb24ndCBsb29rIGZvciAiMGYiCi0JYW5kICIwYiIuICBJZiBMT0NBTF9MQUJFTFNfRE9MTEFSLCBjaGVjayBmb3IgIjAkIi4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IERvbid0IHVzZSAjZWxpZi4KLQotCSogY29uZmlnL2hvLXN1bm9zLmg6IERvbid0IGluY2x1ZGUgc3lzL3N0ZHR5cGVzLmg7IDQuMC4zIGRvZXNuJ3QKLQloYXZlIGl0LiAgKFJlcG9ydGVkIGJ5IE5vYWggRnJpZWRtYW4sIGZyaWVkbWFuQGdudS5haS5taXQuZWR1LikKLQotV2VkIERlYyAxNiAxMjoxMjozMyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMsIG9iai1pZWVlLmM6IGRvbid0IGRlZmluZSBTVUJfU0VHTUVOVF9BTElHTiBpZiBpdCBpcwotCWFscmVhZHkgZGVmaW5lZC4KLQotVHVlIERlYyAxNSAxMjo0MDoxMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogYWxsb3cgc2luZ2xlIHF1b3RlIHN0cmluZ3MgaWYgc28KLQljb25maWd1cmVkLgotCi0JKiBjb25maWcvKno4ayo6IGNoZWNrcG9pbnQKLQotU3VuIERlYyAxMyAwMDowNDozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogYXZvaWQgY2FsbGluZyB4bWFsbG9jICgwKS4KLQotU2F0IERlYyAxMiAxNToyNjozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYzogQ2FsbCB4bWFsbG9jLCBub3QgbWFsbG9jOyBkb24ndCBkZWNsYXJlIG1hbGxvYy4KLQotCSogQ2hhbmdlcyB0byBzdXBwb3J0IFNDTyAzLjJ2NDoKLQkqIHJlYWQuYyAoc19hbGlnbl9ieXRlcywgc19hbGlnbl9wdHdvKTogSWYgbm90IFNFR19EQVRBIG9yCi0JU0VHX0JTUywgZmlsbCB3aXRoIE5PUF9PUENPREUuCi0JKiBjb25maWcvaTM4NmNvZmYubXQ6IEFkZCBvcGNvZGUvaTM4Ni5oIHRvIFRBUkdfQ1BVX0RFUEVOREVOVFMuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IEluY3JlbWVudCBhZGRyIGV2ZW4gaWYgbm90Ci0JdXNpbmcgWkVST19CQVNFRF9TRUdNRU5UUy4KLQkoZmlsbF9zZWN0aW9uKTogSWYgWkVST19CQVNFRF9TRUdNRU5UUywgc2V0IHNlZ21lbnQgYWRkcmVzc2VzLCBidXQKLQluZXZlciBzZXQgc2VnbWVudCBhZGRyZXNzIGZvciBTRUdfRTIgKC5ic3MpIGFuZCBkb24ndCB3cml0ZSBvdXQKLQlTRUdfRTIgY29udGVudHMuICBTZXQgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHRvIFNUWVBfVEVYVC4KLQkob2JqX2NvZmZfZW5kZWYpOiBEb24ndCBtZXJnZSBsYWJlbHMgb3Igc3ltYm9scyBhd2FpdGluZyBmb3J3YXJkCi0JZGVmaW5pdGlvbnMsIGFuZCBkb24ndCBtZXJnZSB0YWdzIHdpdGggbm9uLXRhZ3MuICBDaGVjayBmb3IgLmJmCi0JcmF0aGVyIHRoYW4ganVzdCBjaGVja2luZyB3aGV0aGVyIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGlzIGIgYW5kCi0JdGhlIHRoaXJkIGNoYXJhY3RlciBpcyBmLgotCShvYmpfY29mZl92YWwpOiBnY2MgY2FuIGdlbmVyYXRlIHZhbHVlcyB3aGljaCB3ZSBkb24ndCBoYW5kbGUKLQljb3JyZWN0bHk7IGRpc2NhcmQgaW5mb3JtYXRpb24gZm9yIG5vdywgc2luY2UgaXQgb25seSBhZmZlY3RzIHRoZQotCWRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkodGFnX2ZpbmRfb3JfbmFtZSk6IERvbid0IGluc2VydCB0YWdzIGluIHRoZSBzeW1ib2wgdGFibGUuCi0JKHlhbmtfc3ltYm9scyk6IERvbid0IG1lcmdlIGxhYmVscy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCBkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04gaWYgaXQgaXMKLQlhbHJlYWR5IGRlZmluZWQuICBGaWxsIHN1YnNlZ21lbnRzIHdpdGggTk9QX09QQ09ERSwgbm90IDAuICBEb24ndAotCXNldCBzZWdtZW50IGFkZHJlc3MgaWYgWkVST19CQVNFRF9TRUdNRU5UUy4KLQkob2JqX2NvZmZfc2VjdGlvbik6IEFjY2VwdCBhbmQgaWdub3JlIGEgdHJhaWxpbmcgcXVvdGVkIHN0cmluZywgYXMKLQl1c2VkIGluIEFUJlQgaTM4NiBzeW50YXguCi0JKGZpeHVwX3NlZ21lbnQpOiBUYWtlIHNlZ21lbnQgYXMgYXJndW1lbnQuICBPbiB0aGUgaTM4NiwgYWRqdXN0IFBDCi0JcmVsYXRpdmUgYWRkZW5kcyBieSB0aGUgc2VnbWVudCB2YWRkci4KLQkqIHRjLWkzODYuaDogRGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOLgotCSogdGMtYTI5ay5oOiBEZWZpbmUgWkVST19CQVNFRF9TRUdNRU5UUy4KLQkqIHRjLWkzODYuYzogKGkzODZfb3BlcmFuZCk6IElmIEkzODZDT0ZGLCBhY2NlcHQgYW55IHNlZ21lbnQgdHlwZS4KLQotVHVlIERlYyAgOCAwMDowNjo0OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBJbmNsdWRlIGxpYmNvZmYuaC4KLQotCSogdmVyc2lvbi5jOiBOb3cgdmVyc2lvbiAxLjkzLgotCi1Nb24gRGVjICA3IDAwOjM5OjA5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wc2V1ZG9fdGFibGUpOiBGb3IgMzg2YnNkIGFuZCBsaW51eCwgZG8KLQlwb3dlci1vZi10d28gYWxpZ25tZW50IGZvciAuYWxpZ24uCi0KLQkqIGFzLmg6IElmIEJST0tFTl9BU1NFUlQsIGp1c3QgcmVkZWZpbmUgYGFzc2VydCcgdG8gYmUgdHJpdmlhbCwKLQlhbmQgbGVhdmUgZXZlcnl0aGluZyBlbHNlIGFsb25lLgotCi1GcmkgRGVjICA0IDE2OjU4OjQyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFzLm5ldyk6IERvbid0IGJvdGhlciBzYXZpbmcgYXMub2xkLgotCi0JKiB3cml0ZS5jOiBDb25kaXRpb25hbGl6ZSBvbiBPQkpfVk1TLCBub3QgVk1TLgotCShtYWdpY19udW1iZXJfZm9yX29iamVjdF9maWxlKTogRG9uJ3QgZGVmaW5lIGlmIE9CSl9WTVMuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IENoYW5nZXMgZm9yIHRyYWRpdGlvbmFsIEMuCi0KLVRodSBEZWMgIDMgMDE6MjQ6MDcgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1nZW5lcmljLmggKG1hbGxvYywgcmVhbGxvYyk6IERlY2xhcmUuCi0KLQkqIExvdHMgb2YgY29tbWVudC93aGl0ZXNwYWNlIGNoYW5nZXMuCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBTb21lIGZpZWxkcyByZW9yZGVyZWQsIG5hcnJvd2VkLgotCi0JKiByZWFkLmMgKE1BU0tfQ0hBUik6IERlZmluZSB1c2luZyBDIHR5cGVzLCBub3QgbWFnaWMgbnVtYmVyLgotCi0JKiBhcy5jLCBpbnB1dC1maWxlLmM6IERlbGV0ZWQgc29tZSB1bnVzZWQgY29kZS4KLQotCSogYXBwLmMsIGFzLmg6IERvYyBmaXguCi0KLQkqIGZsb251bS1rb25zdC5jLCBmbG9udW0tbXVsdC5jOiBJbmNsdWRlIGFuc2lkZWNsLmguCi0KLQkqIGFzLmggKHhtYWxsb2MpOiBBcmd1bWVudCBpcyBsb25nLgotCi0JKiB4bWFsbG9jLmMgKGVycm9yKTogUmVtb3ZlIGRlY2xhcmF0aW9uOyBhcy5oIHRha2VzIGNhcmUgb2YgaXQuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBSZWdyb3VwZWQgZG9jdW1lbnRhdGlvbiBvZiBzb21lIGNvbW1hbmQtbGluZQotCW9wdGlvbnMuICBVcGRhdGVkIG9wdGlvbnMgZG9jdW1lbnRhdGlvbiBmb3IgbTY4ay4gIFNvbWUgbWlub3IKLQl3b3JkaW5nL3B1bmN0dWF0aW9uIGNoYW5nZXMuCi0KLU1vbiBOb3YgMzAgMTE6NDI6MTEgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCB0YXJnZXQgT1MgInZtcyIuCi0KLQkqIHN5bWJvbHMuYzogIE1lcmdlZCBBTlNJIGFuZCBub24tQU5TSSBmdW5jdGlvbiBkZWNscywgdXNpbmcKLQlQQVJBTVMgbWFjcm8uCi0KLQkqIHhtYWxsb2MuYzogSnVzdCBpbmNsdWRlIGFzLmgsIGRvbid0IGJvdGhlciB0cnlpbmcgdG8gZmlndXJlIG91dAotCW90aGVyIGhlYWRlciBmaWxlcy4KLQotCSogc3Ryc3RyLmMsIHN0cmVycm9yLmM6IERlbGV0ZWQuCi0JKiBNYWtlZmlsZS5pbjogRGVsZXRlZCByZWZlcmVuY2VzLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYzogRG9uJ3QgaW5jbHVkZSBoZWFkZXIgZmlsZSBmb3Igc3RyaW5nCi0JZGVjbGFyYXRpb25zOyBsZWF2ZSB0aGF0IHRvIGhvLSouaC4KLQotRnJpIE5vdiAyNyAwNDoxMTozNiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm4gYXQgY2FtYnJpZGdlLWxhcHRvcC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvY29mZl9nbnUuaCBbVENfSTg2MF06IEd1ZXNzZXMgZm9yIHJlbG9jIHR5cGUgdmFsdWVzLAotCWltcG9ydGVkIGZyb20gRlNGIHNvdXJjZXMuCi0KLQkqIG1lc3NhZ2VzLmMgKHN0cmVycm9yKTogRGVjbGFyZSB1bmNvbmRpdGlvbmFsbHkuCi0KLQkqIGFzLmg6IERlbGV0ZSBhbGxvY2EgYW5kIHJlZ2lzdGVyIGRlZmluaXRpb25zLgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKG1hc2spOiBOb3cgY29uc3QuCi0KLQkqIG9ic3RhY2suYywgb2JzdGFjay5oOiBEZWxldGVkLgotCi0JKiBhcy5oIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCk6IE5ldyBmbGFnLgotCSogYXMuYyAobWFpbik6IFNldCBpdCBmb3IgLVIuCi0KLQkqIGFzLmggKGZsYWdfc3VwcHJlc3Nfd2FybmluZ3MpOiBOZXcgZmxhZy4KLQkqIGFzLmMgKG1haW4pOiBTZXQgaXQgZm9yIC1XLgotCSogbWVzc2FnZXMuYyAoYXNfd2Fybik6IENoZWNrIGl0IGluc3RlYWQgb2YgZmxhZ3NlZW5bJ1cnXS4KLQotCSogYXMuaCAoZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0KTogTmV3IGZsYWcuCi0JKiBhcy5jIChtYWluKTogU2V0IGl0IGZvciAtWi4KLQotCSogY29uZmlnL3RjLXNwYXJjLmg6IERlZmluZSBORUVEX0ZYX1JfVFlQRS4KLQkqIGNvbmZpZy90Yy1hMjlrLmg6IERpdHRvLgotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IERvbid0IGNvbmRpdGlvbmFsaXplIGZ4X3JfdHlwZSBmaWVsZCBvbiBUQwotCW1hY3Jvcy4KLQotCSogYXMuaDogTWVyZ2VkIEFOU0kgYW5kIG5vbi1BTlNJIGZ1bmN0aW9uIGRlY2xzLCB1c2luZyBQQVJBTVMKLQltYWNyby4KLQkqIGJpZ251bS5oLCBleHByLmgsIGZsb251bS5oLCBmcmFncy5oLCBpbnB1dC1maWxlLmgsIGxpc3RpbmcuaCwKLQlvYmouaCwgb3V0cHV0LWZpbGUuaCwgcmVhZC5oLCBzdHJ1Yy1zeW1ib2wuaCwgc3ltYm9scy5oLCB0Yy5oLAotCXdyaXRlLmg6IExpa2V3aXNlLgotCSogcmVhZC5jOiBMaWtld2lzZS4KLQotCSogeG1hbGxvYy5jOiBDb25kaXRpb25hbGl6ZSBvbiBIQVZFX01BTExPQ19ILCBub3QgVVNHLiAgRm9sZCBpbgotCXhyZWFsbG9jIGZyb20geHJlYWxsb2MuYy4KLQkqIHhyZWFsbG9jLmM6IERlbGV0ZWQuCi0JKiBNYWtlZmlsZS5pbiAoUkVBTF9TT1VSQ0VTLCBPQkpTKTogQWRqdXN0ZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGhvc3QgQ1BVIGEyOWssIHJzNjAwMCwgdmF4LCBjb25zaWRlciB1c2luZyBic2QKLQlvciB2bXMgaG8tIGZpbGVzLgotCi0JKiBjb25maWcvaG8tc3lzdi5oIChzZXRidWZmZXIsIEhPX1VTRyk6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoYXRvZl9pZWVlKTogRXhwb25lbnQgZmllbGQgaXNuJ3QgYSBwb2ludGVyOwotCWRvbid0IGluaXRpYWxpemUgaXQgd2l0aCBOVUxMLgotCi0JKiBjb25maWcvaG8tdmF4LmggKE1fVkFYKTogRGVsZXRlZDsgd2FzIHVudXNlZC4KLQotCSogUkVBRE1FLXZtcywgY29uZmlnL2hvLXZtcy5oLCBjb25maWcvb2JqLXZtcy5jLCBjb25maWcvb2JqLXZtcy5oOgotCU5ldyBmaWxlcyBpbXBvcnRlZCBmcm9tIEZTRiB2ZXJzaW9uLCBjb250cmlidXRlZCBieSBFcmljIFlvdW5nZGFsZS4KLQkqIFJFQURNRS12bXMtZGJnLCBjb25maWcvdm1zOiBEZWxldGVkLgotCi0JKiBDaGFuZ2VMb2csIGNvbmZpZy9DaGFuZ2VMb2c6IE1lcmdlZC4KLQotCSogY29uZmlnLyp0YWhvZSosIGNvbmZpZ3VyZS5pbjogVGFob2Ugc3VwcG9ydCBicm91Z2h0IGluIGZyb20gRlNGCi0JdmVyc2lvbi4KLQotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX29wZW4pOiBFbGltaW5hdGUgY2FsbCB0byBzZXR2YnVmLgotCVtVU0ddIChzZXRidWZmZXIpOiBEZWxldGVkIG1hY3JvLgotCi1Nb24gTm92IDIzIDExOjAwOjE2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhbGwgZmlsZXM6IFdoaXRlc3BhY2UgY2hhbmdlcyBmb3IgR05VIGluZGVudGF0aW9uIHN0eWxlLCBkb25lIGJ5Ci0JR05VIGBpbmRlbnQnLiAgU29tZSBjbGVhbnVwIHN0aWxsIG5lZWRlZCwgZXNwZWNpYWxseSBvZiBjb21tZW50cy4KLQotCSogY29uZmlndXJlLmluOiBObyB0ZS0zODZic2QuaCBmaWxlIGV4aXN0czsgZG9uJ3QgdHJ5IHRvIHVzZSBpdC4KLQotCSogb2JqLWNvZmYuYyAob2JqX2NvZmZfZW5kZWYpOiBVc2UgYXNfd2Fybiwgbm90IGZwcmludGYuCi0KLQkqIHRjLW02OGsuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBjb21wbGFpbiBhYm91dCA2ODAwMCB3aXRoIDY4ODgxOwotCWNvdWxkIGJlIGRvaW5nIGVtdWxhdGlvbi4KLQotVGh1IE5vdiAxOSAxMTo0NzoxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCXo4MDAwIGRvY3VtZW50YXRpb24KLQkqIGRvYy9NYWtlZmlsZS5pbiwgZG9jL2FsbC5tNCwgZG9jL2FzLWFsbC50ZXhpbmZvLCBkb2MvYXMudGV4aW5mbzoKLQlhbGwgbW9kaWZpZWQuCi0KLVR1ZSBOb3YgMTAgMDk6NDk6MjQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXMubywgb2JqLWZvcm1hdC5vKTogYWRkZWQgZGVwZW5kZW5jeSBvbiBzdWJzZWdzLmguCi0KLQkqIHN1YnNlZ3MuaDogYWRkIGV4dGVybiB0byBzZWdtZW50X2luZm8gZGVjbGFyYXRpb24uCi0KLQkqIHJlYWQuaDogYWRkZWQgZXh0ZXJuIGRlY2xhcmF0aW9ucyBmb3IgY29tbWVudF9jaGFycywKLQlsaW5lX2NvbW1lbnRfY2hhcnMsIGFuZCBsaW5lX3NlcGFyYXRvcl9jaGFycy4KLQlyZWFkLmMsIGFwcC5jOiByZW1vdmVkIGRlZmluaXRpb25zIG9mIGNvbW1lbnRfY2hhcnMsCi0JbGluZV9jb21tZW50X2NoYXJzLCBhbmQgbGluZV9zZXBhcmF0b3JfY2hhcnMuCi0KLQkqIHRjLW02OGsuYyAobTY4a19yZWdfcGFyc2UpOiBJZiBSRUdJU1RFUl9QUkVGSVggaXNuJ3QgZGVmaW5lZCwKLQlzdGlsbCBhY2NlcHQgKGJ1dCBkb24ndCByZXF1aXJlKSBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVggYmVmb3JlCi0JdGhlIHJlZ2lzdGVyIG5hbWUuCi0JKGluc2VydF9yZWcpOiBwdXQgUkVHSVNURVJfUFJFRklYIGJlZm9yZSByZWdpc3RlciBuYW1lcyBiZWZvcmUKLQlwdXR0aW5nIHRoZW0gaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQkqIHRjLW02OGsuaCAoT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYKTogRGVmaW5lIHRvIGJlICIlIiwgaWYgbm90Ci0JTTY4S0NPRkYuCi0KLQkqIG9iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IHNldCBTVFlQX05PTE9BRCBiaXQgZm9yIC5ic3MKLQlzZWN0aW9uLgotCi0JKiBhdG9mLWllZWUuYywgYXRvZi1uczMyay5jLCB0Yy0qLmM6IG1hZGUgRVhQX0NIQVJTLCBGTFRfQ0hBUlMsCi0JY29tbWVudF9jaGFycywgbGluZV9jb21tZW50X2NoYXJzIGFuZCBsaW5lX3NlcGVyYXRvcl9jaGFycwotCWNvbnNpc3RlbnRseSBjb25zdCwgYW5kIGFsd2F5cyBpbml0aWFsaXplZCB0aGVtLiAgSW5jbHVkZWQgcmVhZC5oLgotCi1UaHUgTm92ICA1IDE3OjU1OjQxIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgY29kZSB0byBmbGFnIGVycm9yIGlmIGFuIGFic29sdXRlCi0JY29uc3RhbnQgd2lsbCBub3QgZml0IGluIGFuIGltbWVkaWF0ZSBmaWVsZC4KLQkobWRfYXBwbHlfZml4LCBSRUxPQ19CQVNFMTMgY2FzZSk6IENoZWNrIGZvciByZWxvY2F0aW9uIG92ZXJmbG93LgotCi1XZWQgTm92ICA0IDA3OjUwOjQ2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBvYmotY29mZi5jIChjYWxsal90YWJsZSk6IERlbGV0ZSBnbG9iYWwgdmFyaWFibGUuCi0JKG9ial9lbWl0X3JlbG9jYXRpb25zKTogRGVmaW5lIGl0IGxvY2FsbHkgaGVyZSwgYW5kIG9ubHkgaWYKLQlUQ19JOTYwIGlzIGRlZmluZWQuCi0KLQkqIHRjLW02OGsuYyAobTY4a19yZWdfcGFyc2UpOiBVbmRlcnNjb3JlIGlzIHBhcnQgb2YgYSBzeW1ib2wgbmFtZS4KLQkobTY4a19pcCk6IERvbid0IHdhcm4gYWJvdXQgYmlnbnVtIHVzZWQgYXMgZmxvYXQgYml0LXBhdHRlcm4uCi0KLQkqIG9iai1jb2ZmLmM6IFJlcGxhY2VkIEFOU0kgYW5kIG5vbi1BTlNJIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotCXdpdGggYSBzaW5nbGUgc2V0IHVzaW5nIFBBUkFNUyBtYWNyby4KLQotCSogdGMtaTk2MC5jICh0Y19ib3V0X2ZpeF90b19jaGFycyk6IEJpdC1maWVsZCBmaXh1cHMgd2FudCBhIGxlbmd0aAotCW9mIDIuCi0KLQkqIHRjLWk5NjAuYzogTWlzc2VkIGEgY291cGxlIG9mIDAtPk5PX1JFTE9DIGNvbnZlcnNpb25zLgotCi0JKiB0Yy1pOTYwLmggKE5fQkFMTkFNRSwgTl9DQUxMTkFNRSk6IERlZmluZSBhcyBjaGFyLXR5cGUgdmFsdWVzLAotCXNvIHdpZGVuaW5nIHdvcmtzIGNvbnNpc3RlbnRseS4KLQotV2VkIE9jdCAyOCAwODo1MjozNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jOiBQdXQgY29uZGl0aW9uYWwgImNvbnN0IiBiZWZvcmUgdmVyc2lvbl9zdHJpbmcsIG5vdAotCWJlZm9yZSBkdW1teSBmdW5jdGlvbiBmb3IgVk1TLiAgTm93IHZlcnNpb24gMS45MS4wMy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IE5lZWQgZG91YmxlLVwgYmVmb3JlIGAwMDAnIHRvIHNob3cKLQlwcmludGVkIHJlcCBvZiBudWxsIGNoYXJhY3Rlci4KLQotRnJpIE9jdCAyMyAxNDo0MDozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmMgKHdyaXRlX29iamVjdF9maWxlKTogY2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2Nsb3NlX2FsbF9kb25lLgotCi1UdWUgT2N0IDIwIDEyOjE4OjA4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogU3VwcG9ydCBmb3IgaTM4Ni1zeXN2LgotCW9iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IsIHdyaXRlX29iamVjdF9maWxlKTogc2V0IHNlZ21lbnQKLQlhZGRyZXNzZXMgdG8gcmVhc29uYWJsZSBzaXplcy4gIE5ldyBkZWZpbmUgWkVST19CQVNFRF9TRUdNRU5UUyBjYW4KLQliZSB1c2VkIHRvIHNldCB0aGVtIGFsbCB0byB6ZXJvIGFzIHdhcyBkb25lIGJlZm9yZS4KLQkoZmlsbF9zZWN0aW9uKTogc2VnbWVudCBhZGRyZXNzZXMgbm93IHNldCBpbiB3cml0ZV9vYmplY3RfZmlsZS4KLQkoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IFNUWVBfTk9MT0FEIGZvciAuYnNzIHNlY3Rpb24uCi0JKGZpeHVwX3NlZ21lbnQpOiAzODYgdXNlcyBzdHJhbmdlIGNvbW1vbiBzeW1ib2wgZm9ybWF0LgotCXRjLWkzODYuYyAodGNfY29mZl9maXgycnR5cGUpOiB1c2UgUl9ESVIzMiwgbm90IFJfUkVMTE9ORywgZm9yCi0JY29tcGF0aWJpbGl0eSB3aXRoIFNWUjMuMiBsaW5rZXIuCi0JKiBjb25maWd1cmUuaW46IGkzODYtc3lzdiBhbmQgaTM4Ni1zY28gdXNlIGNvZmZiZmQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBkaXNjYXJkIHdoaXRlc3BhY2UgYWZ0ZXIgYSBsYWJlbC4KLQotU2F0IE9jdCAxMCAxMjozMzo0NSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIFN1bk9TIDQgYW5kIFNvbGFyaXMyIGZvciBTdW40Ci0JaG9zdHMsIHVzZSB0aGUgc3lzdiBjb25maWd1cmF0aW9uIGZvciBzb2xhcmlzMgotCi1Nb24gT2N0ICA1IDA5OjI4OjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JIGZpeCBpOTYwK25vbi1iZmQgY29mZiBiaXQgcm90LgotCSogb2JqLWNvZmYuYyAoY19kb3RfZmlsZV9zeW1ib2wsIG9ial9jb2ZmX2xuLCBvYmpfY29mZl9saW5lKToKLQlzdXBwb3J0IGZvciBDIHNvdXJjZSBsaXN0aW5ncy4gKG9ial9jb2ZmX2VuZGVmKTogbG9vayBpbiB0aGUgcmlnaHQKLQlwYXJ0IG9mIHRoZSBzeW1ib2wgZm9yIHRoZSBzeW1ib2wgbmFtZQotCi0JKiB0Yy1tNjhrLmMgKGdldF9udW0pOiBtYWtlIGl0IHdvcmsgZm9yIGFsbCBzZWdtZW50cywgbm90IGp1c3QgdGhlCi0JZmlyc3QgdGhyZWUuCi0KLU1vbiBPY3QgIDUgMDM6MzA6MzYgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBpMzg2LSotYnNkIGVtdWxhdGlvbi4KLQotVGh1IE9jdCAgMSAyMzowNToxMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIHRoZSBjcHUtdmVuZG9yLW9zIHRyaXBsZSBmb3IgaG9zdCBhbmQgdGFyZ2V0Ci0KLVR1ZSBTZXAgMjkgMTI6MjI6NTIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmMgKHdyaXRlX29iamVjdF9maWxlKTogZG9uJ3QgZml4dXAgZm9yIHRoZSB6OGsKLQkqIHRjLXo4ay5jOiBsb3RzIG9mIGJ1ZyBmaXhlcwotCi1UdWUgU2VwIDI5IDEwOjUxOjU1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGMtaTk2MC5oLCB0Yy1pOTYwLmM6IGF2b2lkIHRoZSBBTlNJIHByZXByb2Nlc3NvciBhZGRpdGlvbgotCSNlbGlmLCBzaW5jZSBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IG9sZCBjb21waWxlcnMuCi0JaG8tcnM2MDAwLmgsIHRjLW02OGsuYzogdGhlIG5hdGl2ZSBSUy82MDAwIGNvbXBpbGVyIG1pc2NvbXBpbGVzIGEKLQljb3VwbGUgb2YgZXhwcmVzc2lvbnMgaW4gdGMtbTY4ay5jLgotCi1Nb24gU2VwIDI4IDIxOjE4OjI0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChjb25zKTogSWYgTk9fUkVMT0MgaXMgZGVmaW5lZCwgdXNlIGl0LgotCi0JKiB0Yy1pOTYwLmMgKGdldF9jZGlzcCk6IFVzZSBOT19SRUxPQywgbm90IDAsIGluIGNhbGwgdG8gZml4X25ldy4KLQotRnJpIFNlcCAyNSAxODoxODo1MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuaDogaWYgTTY4S0NPRkYsIGRlZmluZSBET1RfTEFCRUxfUFJFRklYICh0byByZXF1aXJlCi0JbG9jYWwgbGFiZWxzIHRvIHN0YXJ0IHdpdGggYSAuKSBhbmQgc2V0IFJFR0lTVEVSX1BSRUZJWCB0byAlLgotCXRjLW02OGsuYyAobTY4a19yZWdfcGFyc2UpOiBhY2NlcHQgUkVHSVNURVJfUFJFRklYIGlmIGRlZmluZWQuCi0KLUZyaSBTZXAgMjUgMTc6NTM6NDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmM6ICBDb21tZW50IGNoYW5nZXMuCi0KLUZyaSBTZXAgMjUgMTQ6MTI6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGt5cmlhdGguY3lnbnVzLmNvbSkKLQotCSogYXMuaDogVGVzdCBpZiBfX1NURENfXyBpcyBkZWZpbmVkIG9ubHksIGRvbid0IHRlc3QgaXRzIHZhbHVlLgotCSogbWVzc2FnZXMuYzogSWYgX19TVERDX18gaXMgbm90IGRlZmluZWQsIGRlZmluZSBOT19TVERBUkcuCi0KLVRodSBTZXAgMjQgMTI6NDI6MzIgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYyAoZGVidWdnaW5nX3BzZXVkbyk6IEFkZCBzdGFicyBhbmQgc3RhYm4gYXMgdGhpbmdzIHRvCi0JaWdub3JlLgotCi1UdWUgU2VwIDIyIDEzOjAyOjA3IDE5OTIgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBvYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yLGZpbGxfc2VjdGlvbik6IG5vdyBhbGxvY2F0ZSBhbGwKLQlzZWN0aW9ucyBzdGFydGluZyBmcm9tIHplcm8sIHJhdGhlciB0aGFuIG1ha2luZyB0aGVtIGNvbnNlY3V0aXZlLgotCVRoaXMgbWFrZXMgc3Vic2VxdWVudCByZWxvYyBjYWxjdWxhdGlvbnMgZWFzaWVyLCBlc3AgaWYgdGhlIG9iamVjdAotCWZvcm1hdCBkb2Vzbid0IHVuZGVyc3RhbmQgYWRkZW5kcy4gKG9ial9jb2ZmX2xjb21tKTogKG1heWJlIHRlbXBvcmFyaWx5KQotCWFsbG9jYXRlIGxjb21tIGluIC5kYXRhIHJhdGhlciB0aGFuIGluIC5ic3MuICBJdCBzZWVtcyB0aGF0IHNvbWUKLQl0b29scyBjYW4ndCBjb3BlIHdpdGggYSBub24temVybyBzaXplZCBic3MgYmVmb3JlIGxpbmthZ2UuCi0KLVR1ZSBTZXAgMjIgMTU6MTA6NTEgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmM6IFJlcGxhY2UgImVudW0gbTY4a19hcmNoaXRlY3R1cmUiIHdpdGggImludCIKLQl0aHJvdWdob3V0LiAgVGhhdCBlbnVtIG5vIGxvbmdlciBtZWFucyB3aGF0IHdlIHRob3VnaHQgaXQgbWVhbnQuCi0KLQkqIHRjLW02OGsuYyAobWRfYXNzZW1ibGUsIG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBuZXcKLQkiLW1uby02ODhbNThdMSIgb3B0aW9ucy4KLQotCSogdGMtbTY4ay5jOiBBZGRlZCBDUFUzMiBzdXBwb3J0LgotCi1GcmkgU2VwIDE4IDA4OjAyOjE4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmMgKG02OGtfaXApOiBBbihkaXNwKSBpcyBub3QgcGMgcmVsYXRpdmUuCi0KLVR1ZSBTZXAgMTUgMTc6MjU6MDUgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXMubmV3KTogUmVtb3ZlIGRlcGVuZGVuY2Ugb24gTE9DQUxfTE9BRExJQkVTLgotCUNoYW5nZSBMSUJERVBTIGRlcGVuZGVuY2UgdG8gTElCUy4KLQotVHVlIFNlcCAxNSAxNTozMjowMiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaWYgJCh0b29sZGlyKSBleGlzdHMsIGluc3RhbGwgYXMgaW4KLQkkKHRvb2xkaXIpL2Jpbi4KLQotU3VuIFNlcCAxMyAyMDozMDoxMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIEFkZGVkIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQgZGVmaW5lIHRvIGdpdmUgYW4gZXJyb3IgaWYgYW55Ci0JLndvcmQgaXMgPCAtMzI3Njggb3IgPiAzMjc2Ny4gIFRoZSAtSiBmbGFnIGNhdXNlcyB0aGUgZXJyb3IgdG8gYmUKLQlpZ25vcmVkLiAgVGhpcyBpcyB0byBjYXRjaCBvdmVyLXNpemVkIHN3aXRjaGVzIGdlbmVyYXRlZCBieSBnY2Mgb24KLQlzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIGJyb2tlbiAud29yZCBoYWNrLgotCWFzLmMgKG1haW4pOiBwZXJtaXQgLUogaWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQl3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogY2hlY2sgZm9yIHNpZ25lZCAud29yZCBvdmVyZmxvdyBpZgotCVdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBmaXhlZCBtaXNzaW5nIHBhcmVucyBpbiBleHByZXNzaW9uCi0JY2hlY2tpbmcgZm9yIGJ5dGUgb3Igd29yZCBvdmVyZmxvdy4KLQotCSogb2JqLWNvZmZiZmQuaDogZGVmaW5lIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQuCi0Jb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCk6IGNoZWNrIGZvciBzaWduZWQgLndvcmQgb3ZlcmZsb3cgaWYKLQlXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgotCi0JKiBvYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogZml4ZWQgbWlzc2luZyBwYXJlbnMgaW4KLQlleHByZXNzaW9uIGNoZWNraW5nIGZvciBieXRlIG9yIHdvcmQgb3ZlcmZsb3cuCi0KLUZyaSBTZXAgMTEgMTA6MjE6MDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlTdXBwb3J0IGZvciBpMzg2IGNvZmYKLQkqIG9iai1jb2ZmYmZkLmggOiBhZGRlZCBzdHVmZgotCSogdGMtaTM4Ni5jICh0Y19jb2ZmX2ZpeDJydHlwZSk6IG5ldyBmdW5jdGlvbgotCSogdGMtaTM4Ni5oIDogbmV3IGNvZmYgZGVmaW5lcwotCi1UaHUgU2VwIDEwIDA5OjIzOjE1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfcHVzaCk6IGNhbGwgaW5wdXRfZmlsZV9iZWdpbiwgbm90Ci0JaW5wdXRfc2NydWJfYmVnaW4uCi0JbWVzc2FnZXMuYyAoYXNfcGVycm9yKTogcHJpbnQgIjogIiBiZXR3ZWVuIHRoZSBwYXNzZWQgaW4gZXJyb3IgYW5kCi0JdGhlIHN0cmVycm9yLCBsaWtlIHBlcnJvciBkb2VzLgotCi1XZWQgU2VwICA5IDExOjA2OjI1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSBnYXNfdGFyZ2V0IGluc3RlYWQgb2YgbW9kaWZ5aW5nIHRhcmdldF9jcHUuCi0JRnJvbSBTdGV2ZSBDaGFtYmVybGFpbjoKLQlNYWtlZmlsZS5pbjogSGFuZGxlIG02OCotKi1jb2ZmKi4KLQlyZWFkLmMsIHJlYWQuaDogYWRkIG11bHQgYXJndW1lbnQgdG8gc19zcGFjZQotCi0JKiB0Yy1tNjhrLmMgKG02OGtfaXAsIG02OGtfaXBfb3AsIGdldF9udW0sIHRyeV9tb3RvX2luZGV4KTogbWVyZ2UKLQkgTW90b3JvbGEgYW5kIE1JVCBzeW50YXg7IGdhcyBjYW4gbm93IGFzc2VtYmxlIGVpdGhlciB0eXBlIG9mCi0JIGZpbGUuCi0JdGMtbTY4a21vdGUuYywgdGMtbTY4a21vdGUuaDogcmVtb3ZlZCBub3cgc3VwZXJmbHVvdXMgZmlsZXMuCi0JRnJvbSBTdGV2ZSBDaGFtYmVybGFpbjoKLQltNjhrY29mZi5tdDogZm9yIG02OGsgQ09GRi4KLQlvYmotY29mZmJmZC5jOiAoZml4dXBfbWRlcHMpIGFkZGVkCi0JIChzaXplX3NlY3Rpb24pIHJlbW92ZWQgYmFkIHNhbml0eSBjaGVjawotCSAoZmlsbF9zZWN0aW9uKSBhZGRlZCByc19tYWNoaW5lX2RlcGVuZGVudCBjYXNlCi0JICh3cml0ZV9vYmplY3RfZmlsZSkgY2FsbCBmaXh1cF9tZGVwcwotCSAoZml4dXBfc2VnbWVudCkgc2V0IGZ4X3N1YnN5IHRvIDAuCi0Jb2JqLWNvZmZiZmQuaDogZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQgKHRvbyBoYXJkIHRvIHN1cHBvcnQpIGFuZAotCSBoYW5kbGUgbTY4ay4KLQl0Yy1tNjhrLmMsIGNvbmZpZy90Yy1tNjhrLmg6IGFkZGVkIG02OGsgQ09GRiBzdXBwb3J0IGFuZCBNb3RvcmFsYQotCSBwc2V1ZG8gb3BzLgotCi1UdWUgU2VwICA4IDE3OjEwOjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExJQlMpOiBJbmNsdWRlIG9wY29kZSBsaWJyYXJ5LgotCi1GcmkgU2VwICA0IDE4OjIwOjU2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChnZXRfbnVtLCBjYXNlIFNFR19CSUcpOiBJZiBvbmx5IHNtYWxsIGludGVnZXJzCi0JaW5jbHVkaW5nIHplcm8gYXJlIGFjY2VwdGVkLCBwYXNzICswLjAuCi0KLVN1biBBdWcgMzAgMjE6MjQ6NDYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFwICJhcyIgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHdoZW4KLQlpbnN0YWxsaW5nLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IG1hcCAiYXMiIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB3aGVuCi0JaW5zdGFsbGluZy4KLQotU2F0IEF1ZyAyOSAxMjoxMToxMiAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5uZXcpOiBEZXBlbmQgb24gTE9DQUxfTE9BRExJQkVTLgotCi1GcmkgQXVnIDI4IDE2OjI1OjIyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogb2JqLWJvdXQuaCwgb2JqLWJvdXQuYyAob2JqX2hlYWRlcl9hcHBlbmQsIG9ial9zeW1ib2xfdG9fY2hhcnMpLAotCXRjLWk5NjAuYyAobWRfcmlfdG9fY2hhcnMpOiBBbHdheXMgb3V0cHV0IGJvdXQgb2JqZWN0IGZpbGUgaW4KLQlsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgKHVzZWQgdG8gdXNlIGVuZGlhbm5lc3Mgb2YgaG9zdCkuCi0KLVR1ZSBBdWcgMjUgMTU6NTA6NDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogTm93IGNvbnN0LiAgQWx3YXlzIGluY2x1ZGUgNjg4NTEKLQlkYXRhLCBzbyB0aGF0ICJiYyIgaXMgYXZhaWxhYmxlIHRvIDY4MDQwIGNhY2hlIGluc3RydWN0aW9ucy4KLQlBZGRlZCAidHQwIiwgInR0MSIsIGFuZCA2OGVjMDMwIHZhcmlhbnRzLgotCShtZF9hc3NlbWJsZSk6IENvbXBsYWluIGlmIDY4MDAwIChvbmx5KSBhbmQgNjg4ODEgYXJlIHNwZWNpZmllZC4KLQkoZW51bSBfcmVnaXN0ZXIpOiBBZGRlZCBUVDAsIFRUMS4KLQkobTY4a19pcCwgY2FzZXMgJzMnIGFuZCAndCcpOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSBjb2Rlcy4gIFBhc3MKLQlsaW5lIG51bWJlciBjb3JyZWN0bHkgaW4gImludGVybmFsIGVycm9yIiBtZXNzYWdlcy4gIERvbid0IHByaW50Ci0JYXJjaGl0ZWN0dXJlLW1pc21hdGNoIG1lc3NhZ2UgZm9yIG9wZXJhbmQgZXJyb3JzLgotCi0JRnJvbSBDb2xpbiBTbWl0aCAoY29saW5Ad3JzLmNvbSk6Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwLCBjYXNlICdfJyk6IFVzZSBhZGR3b3JkIHR3aWNlIHJhdGhlcgotCXRoYW4gaW5zdGFsbF9vcGVyYW5kLgotCi1UdWUgQXVnIDI1IDE1OjEzOjQ4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGJ1ZmZlcl9saW5lKTogcmV3aW5kIHRvIHRoZSBzdGFydCBvZiBpbmNsdWRlCi0JZmlsZXMsIHRoZXkgbWlnaHQgYmUgaW5jbHVkZWQgdHdpY2UuCi0KLQkqIHo4ay5jLCB6OGsuaCwgejhrLm10OiB6ODAwMCBzdXBwb3J0IHN0dWZmCi0KLU1vbiBBdWcgMjQgMTI6NDU6NDMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lZCBUQVJHRVRfQ1BVIGZvciBDIGNvZGUgc28gdGhhdCBpdCBjYW4gY2hvb3NlCi0Jb25lIGVsZW1lbnQgb2YgYSBmYW1pbHkuCi0KLQkqIHRjLW02OGsuYzogdXNlIFRBUkdFVF9DUFUgdG8gY2hvb3NlIGRlZmF1bHQgY3B1IHR5cGUuCi0KLQkqIHRlLWdlbmVyaWMuaDogZGVmYXVsdCB0byBMT0NBTF9MQUJFTFNfRE9MTEFSIGFuZCBMT0NBTF9MQUJFTFNfRkIKLQlzbyB0aGF0IHdlIGNhbiBhc3NlbWJsZSBoYW5kLXdyaXR0ZW4gbGliZ2NjIGNvZGUuCi0KLUZyaSBBdWcgMjEgMTQ6Mzg6NDQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc193YXJuKTogVXNlIGZwdXRzLCBub3QgZnByaW50Ziwgd2l0aCBhIGJ1ZmZlciB0aGF0Ci0JaGFzIGFscmVhZHkgYmVlbiBmb3JtYXR0ZWQgKGJ1dCBtYXkgc3RpbGwgY29udGFpbiAlLWNoYXJhY3RlcnMpLgotCShhc19iYWQpOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxOSAxMToyMDo1OSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYywgdGMtbTY4a21vdGUuYzogdGhlIGNhczIgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUKLQl3cml0dGVuIHdpdGggaW5kaXJlY3Rpb24gb24gdGhlIGxhc3QgdHdvIG9wZXJhbmRzLCB3aGljaCBjYW4gYmUKLQllaXRoZXIgZGF0YSBvciBhZGRyZXNzIHJlZ2lzdGVycy4gIEFkZGVkIGEgbmV3IG9wZXJhbmQgdHlwZSAncicKLQl3aGljaCBhY2NlcHRzIGVpdGhlciByZWdpc3RlciB0eXBlLiAgQWRkZWQgJygnIHRvIG5vdGVuZCBzdHVmZiBpbgotCXRjLW02OGttb3RlLmMgdG8gYWNjZXB0IChhMCk6KGEyKSBpbiBjYXMyIGluc3RydWN0aW9uLgotCi1XZWQgQXVnIDE5IDA5OjI1OjA5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhcy5oIChlbnVtIF9yZWxheF9zdGF0ZSk6IFN0YXJ0IG9mZiBhdCBvbmUsIG5vdCB6ZXJvLCB0byBiZXR0ZXIKLQljYXRjaCB1bmluaXRpYWxpemVkLXZhcmlhYmxlIGVycm9ycy4KLQkobGlua3JlbGF4KTogRGVjbGFyZSBuZXcgdmFyaWFibGUuCi0KLQkqIG1lc3NhZ2VzLmMgKHdhcm5pbmdfY291bnQsIGVycm9yX2NvdW50KTogRGVmYXVsdCBpbml0aWFsaXplciBpcwotCXN1ZmZpY2llbnQuCi0KLQkqIHdyaXRlLmM6IE1lcmdlZCBzb21lIGRlY2xhcmF0aW9ucywgdXNpbmcgUEFSTVMgbWFjcm8uCi0JKHRleHRfZnJhZ19yb290LCBkYXRhX2ZyYWdfcm9vdCwgYnNzX2ZyYWdfcm9vdCwgdGV4dF9sYXN0X2ZyYWcsCi0JZGF0YV9sYXN0X2ZyYWcpOiBObyBsb25nZXIgc3RhdGljLgotCSh3cml0ZV9vYmplY3RfZmlsZSwgY2FzZSByc19hbGlnbiBvciByc19vcmcpOiBJZiBIQU5ETEVfQUxJR04gaXMKLQlkZWZpbmVkLCBjYWxsIGl0LiAgQ2hhbmdlIHNlZ21lbnRzIGJlZm9yZSBjYWxsaW5nIGZpeHVwX3NlZ21lbnQuCi0JKHJlbGF4X2FsaWduKTogSWYgbGlua3JlbGF4LCBwcm92aWRlIGV4dHJhIHBhZGRpbmcuCi0KLQkqIG9iai1ib3V0LmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogRW1pdCBhbGlnbm1lbnQgcmVsb2NzIGRlc3BpdGUKLQl0aGVpciBub3QgaGF2aW5nIHN5bWJvbHMgYXNzb2NpYXRlZC4KLQotCSogdGMtaTk2MC5jIChub3JlbGF4LCBpbnN0cnVtZW50X2JyYW5jaGVzKTogRGVmYXVsdCBpbml0aWFsaXplciBpcwotCXN1ZmZpY2llbnQuCi0JKGxpbmtyZWxheCk6IERlbGV0ZSB2YXJpYWJsZSBkZWZpbml0aW9uLgotCShtZW1fZm10KTogQ2FsbCBmaXhfbmV3IHdpdGggTk9fUkVMT0MuCi0JKHRjX2JvdXRfZml4X3RvX2NoYXJzKTogSGFuZGxlIGFsaWdubWVudCByZWxvY3MuCi0JKGk5NjBfaGFuZGxlX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCSogdGMtaTk2MC5oIChsaW5rcmVsYXgpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKEhBTkRMRV9BTElHTik6IE5ldyBtYWNybzsgY2FsbHMgaTk2MF9oYW5kbGVfYWxpZ24uCi0JKE5FRURfRlhfUl9UWVBFLCBOT19SRUxPQyk6IE5ldyBtYWNyb3MuCi0KLVR1ZSBBdWcgMTggMTQ6NTk6MjEgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zcGFyYy5tdDogTmV3IGZpbGUuICBHcmFiIHNwYXJjIG9wY29kZSB0YWJsZSBmcm9tIGJmZAotCWxpYnJhcnkuCi0KLVR1ZSBBdWcgMTggMTQ6MTY6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuICBSZW1vdmVkCi0JTUlOVVNfRywgc2V0IENGTEFHUyB0byBkZWZhdWx0IHRvIC1nLCBhZGRlZCBGTEFHU19UT19QQVNTLCBwYXNzZWQKLQlGTEFHU19UT19QQVNTIHRvIHJlY3Vyc2l2ZSBtYWtlcy4KLQotCSogZG9jL01ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotTW9uIEF1ZyAxNyAxNTowOTo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfcG9wLCBpbnB1dF9zY3J1Yl9wdXNoKTogbWVtY3B5IHdhcwotCWJlaW5nIHVzZWQgd2l0aCBhcmdzIHN3YXBwZWQsIGNhdXNpbmcgb2NjYXNpb25hbCBsb3NzYWdlIHdoZW4KLQlyZWZpbGxpbmcgYnVmZmVycyBhZnRlciBhbiBpbmNsdWRlIGZpbGUuCi0KLU1vbiBBdWcgMTcgMTM6MTg6NTEgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3Rza3Rzayk6IFVzZSBjb3JyZWN0IEFOU0kgZm9ybSBmb3Igc3RkYXJnCi0JdmVyc2lvbi4gIERpc2NhcmQgYm9ndXMgRE9OVERFRiB2ZXJzaW9uLgotCShhc193YXJuLCBhc19iYWQsIGFzX2ZhdGFsKTogTGlrZXdpc2UuCi0KLUZyaSBBdWcgMTQgMTg6MzE6MTQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBJZiBpbnN0cnVjdGlvbiBpcyBpbnZhbGlkIGZvciB0aGUKLQlzZWxlY3RlZCBhcmNoaXRlY3R1cmUsIHByaW50IGEgbWVzc2FnZSBzYXlpbmcgc28gYW5kIGxpc3Rpbmcgd2hhdAotCXByb2Nlc3NvcnMgc3VwcG9ydCBpdCwgcmF0aGVyIHRoYW4gc2F5aW5nICJvcGVyYW5kcyBtaXNtYXRjaCIuCi0KLVRodSBBdWcgMTMgMTM6NTM6MTkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFzLmggW0JST0tFTl9BU1NFUlRdOiBJZiBkZWZpbmVkLCB0dXJuIG9mZiBhbGwgYXNzZXJ0aW9uIGNoZWNrcy4KLQotCSogY29uZmlnL2hvLXJzNjAwMC5oIChNX1JTNjAwMCk6IERvbid0IGRlZmluZSBpdC4KLQkoZnJlZSk6IERlY2xhcmUgaXQuCi0JKEJST0tFTl9BU1NFUlQpOiBEZWZpbmUgaXQgaWYgbm90IF9fU1REQ19fLgotCi1UdWUgQXVnIDExIDEyOjU4OjE0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5tdDogTmV3IGZpbGUuCi0KLU1vbiBBdWcgMTAgMTQ6Mzc6MDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYzogIi5hbGlnbiBOIiBtZWFucyBhbGlnbiB0byBOLWJ5dGUgYm91bmRhcnkgKm9ubHkqCi0JaWYgVE5fU1VOMzsgb3RoZXJ3aXNlIGFsaWduIHRvIDIqKk4tYnl0ZSBib3VuYXJ5LgotCi1UaHUgQXVnICA2IDEyOjEwOjM5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfZmlsbCk6IG1ha2UgdGhlIC5maWxsIHNpemUgY2xhbXBlZCBlcnJvciBhIHdhcm4gYW5kCi0JZml4IGJ1ZyB3aGVyZSAwJ3Mgd2VyZSBhbHdheXMgcGxhY2VkLgotCi0JKiBjb25maWcvdGMtaDgzMDAuYzogaWYgYSA6OCBpcyBzZWVuIGFmdGVyIGFuIG9wZXJhbmQsIGZpbGwgdG9wCi0JdHdvIGJ5dGVzIG9mIGFueSBjb25zdGFudCB3aXRoIDB4ZmY6Ci0KLVdlZCBBdWcgIDUgMTI6MDI6NDAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3BzZXVkb190YWJsZSk6IGZpeCB0aGUgLmFsaWduIHRoaW5nCi0JdGhlIHJpZ2h0IHdheTsgZm9yIGp1c3QgdGhlIDY4ay4gU3VuIDMgLmFsaWduIGlzIG5ieXRlcywgbm90IHB0d28uCi0KLVdlZCBBdWcgIDUgMDE6NTQ6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYyAodHJ5X2luZGV4KTogIEVycm9yIGlmIGluZGV4IHNjYWxpbmcgc3BlY2lmaWVkIGFuZAotCWFzc2VtYmxpbmcgZm9yIGFuIG9sZGVyIENQVSB0aGFuIGEgNjgwMjAuCi0KLVNhdCBBdWcgIDEgMTk6MTA6MTMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19hb3V0X2ZpeF90b19jaGFycyk6IElmIHBjLXJlbGF0aXZlLCB0YWtlCi0JZnhfb2Zmc2V0IGludG8gYWNjb3VudC4KLQotRnJpIEp1bCAzMSAyMTo1MzoyOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzIGhvc3QpOiBBY2NlcHQgInVsdHJpeCIgd2l0aCB2ZXJzaW9uIG51bWJlci4KLQotCSogZXhwci5jIChmbG9hdGluZ19jb25zdGFudCk6IFNlcGFyYXRlICI9LSIgdG8gYXZvaWQgY29uZnVzaW5nCi0JYW5jaWVudCBvciBicm9rZW4gY29tcGlsZXJzLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogTWlzbWF0Y2ggZXJyb3IgY291bGQgYWxzbyBpbmRpY2F0ZQotCXByb2Nlc3Nvci9vcGNvZGUgbWlzbWF0Y2gsIHNvIHJld29yZCB0aGUgZXJyb3IgbWVzc2FnZS4KLQkobWRfYXNzZW1ibGUpOiBJZiBubyBDUFUgaGFzIGJlZW4gc2V0IChldmVuIGlmIEZQVS9QTU1VCi0JY2hhcmFjdGVyaXN0aWNzIGhhdmUgYmVlbiksIGRlZmF1bHQgdG8gNjgwMjAuICBEb24ndCBuZWVkIGV4dHJhCi0JcXVvdGVzIGFyb3VuZCBlcnJvciBzdHJpbmcuCi0KLUZyaSBKdWwgMzEgMTI6MjY6MzQgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBSZXZlcnQgc2FjJ3MgaW5jb3JyZWN0IGNoYW5nZSBtYWRlIEp1bCAxMy4KLQlBbGlnbiByZWFsbHkgaXMgc3VwcG9zZWQgdG8gYmUgcHR3byBub3QgbmJ5dGVzLgotCi1Nb24gSnVsIDIwIDAyOjUxOjU5IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IF9Eb18gaW5jbHVkZSBsaWJpYmVydHkuICAoZnJvbSBzZWYpCi0KLUZyaSBKdWwgMTcgMTU6MTU6MjggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IEhhbmRsZSAiMGYiIGFuZCAiMGIiIGxhYmVsIHJlZmVyZW5jZXMKLQlwcm9wZXJseS4KLQotVGh1IEp1bCAxNiAwODoyMDoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IGlmIHJlbGF4aW5nLCBkb24ndCBkbyBhbnl0aGluZy4KLQkqIGNvbmZpZy9vYmotYm91dC5bY2hdIDogbWFpbnRhaW4gdGhlIGFfcmVsYXhhYmxlIGZpbGUgaGVhZGVyIGluZm8KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IG5ldyBvcHRpb24gLWxpbmtyZWxheAotCi1Nb24gSnVsIDEzIDE0OjExOjM2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKGV4cHIpOiBhbGxvdyBTRUdfQlNTIGluIGV4cHJlc3Npb25zCi0JKiByZWFkLmMgKHBvdGFibGUpOiBhbGlnbiBzaG91bGQgYmUgbmJ5dGVzLCBub3QgcHR3byEKLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogZXh0cmEgZ2x1ZSBmb3IgbmV3IGJzcyBhdHRyaWJ1dGVzCi0JKHJlbGF4X3NlZ21lbnQpOiBTRUdfQlNTIGlzIG9rIG5vdwotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcF9vcCk6IGNhbiBub3cgcGFyc2UgbW9yZSBAKCBtb2RlcwotCi1Nb24gSnVsICA2IDE3OjA5OjMyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IG1hcmsgLmxpdCBzZWN0aW9ucyBhcyBTVFlQX0xJVAotCi1Nb24gSnVuICAxIDE2OjIwOjIyIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTY4MHgwIGFzIGhhdmluZyBzdW4zIGVtdWxhdGlvbiBtb2RlIGZvcgotCXZ4d29ya3MgZW52aXJvbm1lbnQuCi0KLQotVHVlIEp1biAzMCAyMDoyNTo1NCAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgcHJvZ3JhbV9zdWZmaXggKHBhcmFsbGVsIHRvIHByb2dyYW1fcHJlZml4KQotCi1XZWQgSnVuIDI0IDEwOjU3OjU0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcHAuYyAocHJvY2Vzc19lc2NhcGUpOiBuZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGVzY2FwZXMgdGhlIHJpZ2h0Ci0Jd2F5LCAoZG9fc2NydWJfbmV4dF9jaGFyKTogdXNlIG5ldyBmdW5jdGlvbgotCSogY29uZC5jIChzX2lmZGVmKTogZG8gaWZkZWYvaWZuZGVmIHJpZ2h0Ci0JKiByZWFkLmMgKHNfZmlsbCk6IG1ha2UgdGhlICwgZXhwcmVzc2lvbnMgb3B0aW9uYWwgbGlrZSB0aGUgZG9jCi0Jc2F5cwotCSogY29uZmlnL3RjLWg4MzAwLltjaF06IGJldHRlciB3YXJuaW5ncwotCi1UdWUgSnVuICA5IDA3OjU0OjU0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfYmVnaW4pOiBjcmVhdGUgYnNzMF9mcmNoYWluUCBpbiB0aGUgc2FtZSB3YXMKLQlhcyBkYXRhMF9mcmNoYWluUAotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IHZhcmlvdXMgY2hhbmdlcyB0byBoYW5kbGUgZGF0YSBpbgotCXRoZSBCU1Mgc2VnbWVudCBpbiBtdWNoIHRoZSBzYW1lIHdhcyBhcyBzdHVmZiBpbiB0aGUgREFUQSBzZWdtZW50LgotCi0JKiB0Yy1tNjhrLmMgKG02OGtpcCk6IEZpeCB0eXBvIHNvIHRoYXQgb25seSBhcmNoJ3MgPj02ODAyMCBkbwotCXBjcmVsIGRhdGEgc3R1ZmYuIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IHdoZW4gcmVsYXhpbmcgYQotCTY4MDEwIGJ4eCBpbnRvIGEgYnJhKzYgam1weHgsIHB1dCB0aGUgYnl0ZXMgb2YgdGhlIGptcCBvcGNvZGUgaW50bwotCXRoZSByaWdodCBwbGFjZS4gKHNfYnNzKTogRG9uJ3QgcHV0IC5ic3Mgc3R1ZmYgaW50byBTRUdfREFUQSwgcHV0Ci0JaXQgaW50byBTRUdfQlNTCi0KLVRodSBKdW4gIDQgMTE6NTk6MTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyhleHByKTogYWxsb3cgU0VHX1JFR0lTVEVSIGluIGV4cHJlc3Npb25zLgotCSogcmVhZC5jKHBzZXVkb19zZXQpOiByZWdpc3RlciBleHByZXNzaW9ucyBjYW4gYmUgdGhlIHNvdXJjZSBvZiBhCi0Jc2V0LgotCSogc3Vic2Vncy5jIChzdWJzZWdfbmV3KTogTm93IC1SIGZvcmNlcyBhbGwgY2hhbmdlcyB0byBTRUdfREFUQSB0bwotCWdvdG8gU0VHX1RFWFQgKGlmIGEub3V0KQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBhLm91dCBkb24ndCB1c2UgdGhlIG9sZCB3YXkgZm9yCi0JLVIuCi0JKiBjb25maWcvb2JqLWEub3V0IChzX3NlY3QpOiBjb21wbGFpbiBpZiB0aGUgdXNlciB0cmllcyB0byB1c2UgYQotCXN1YnNlZ21lbnQgd2l0aCBhIHZhbHVlIHdoaWNoIG1pZ2h0IGludGVyZmVyZSB3aXRoIG91dCAtUiBoYWNrZXJ5LgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19yZWdfcGFyc2UpOiBsb29rdXAgbmFtZXMgaW4gc3ltYm9sIHRhYmxlCi0JcmF0aGVyIHRoYW4gdXNlIHVnbHkgaWYgdHJlZS4gKGluaXRfcmVndGFibGUpOiBpbnNlcnQgcmVnaXN0ZXIKLQluYW1lcyBpbnRvIHN5bWJvbCB0YWJsZS4KLQotVHVlIEp1biAgMiAxNjo0NzowOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKToga2VlcCB0aGUgZml4X3RhaWwgY2xlYW4sIHdoaWNoCi0JZml4ZXMgYSBidWcgaW4gLVIgd2hlcmUgcmVsb2NhdGlvbnMgd2VyZSBiZWluZyBsb3N0LgotCi1Nb24gSnVuICAxIDE2OjIwOjIyIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTY4MHgwIGFzIGhhdmluZyBzdW4zIGVtdWxhdGlvbiBtb2RlIGZvcgotCXZ4d29ya3MgZW52aXJvbm1lbnQuCi0KLVN1biBNYXkgMzEgMDU6MzM6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTY4MHgwIGFzIGFuIG02OGsKLQotVGh1IE1heSAyOCAxMToyMjowMiAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIHNwYXJjbGl0ZSBhcyBhIHNwYXJjIHZhcmlhbnQuCi0KLQkqIHRjLXNwYXJjLmM6IFVzZSBuZXcgQVJDSElURUNUVVJFU19DT05GTElDVF9QIG1hY3JvLiAgTWVudGlvbiBuZXcKLQktQXNwYXJjbGl0ZSBmbGFnLgotCi1UdWUgTWF5IDI2IDE2OjQ3OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYTI5ay5jOiBsaW50Ci0JKiBsaXN0aW5nLmMsIGV4cHIuYzogcGF0Y2hlcyBmcm9tIEFuZHJldyBTbWl0aAotCi1UaHUgTWF5IDE0IDE3OjIyOjQ4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluOiB1c2UgbTQgcmF0aGVyIHRoYW4gZ200LgotCi1Nb24gTWF5ICA0IDE4OjU2OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmotY29mZmJmZC5jOiB1c2UgaXMgYSBzeW5vbnltIGZvciBzZWN0aW9uLCAoZG9fcmVsb2NzX2Zvcik6Ci0JY2FsYyB0aGUgYmFzZSBvZiByZWxvY3MgY29ycmVjdGx5LgotCSogdGMtYTI5ay5jIChwYXJzZV9vcGVyYW5kKTogYWxsb3cgZXhwcmVzc2lvbnMgdG8gYmUgaW4gYW55IHNlY3Rpb24uCi0KLU1vbiBBcHIgMjcgMTM6MTM6MzEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGFzLmMsIHdyaXRlLmM6IHVzZSAtSyByYXRoZXIgdGhhbiAtayBmb3IgdGhlIGJyb2tlbiB3b3JkIHdhcm5pbmcKLQkgIG9wdGlvbi4KLQotVHVlIEFwciAyMSAxMzozNTozMCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRvIG5vdCBwcmludCByZWN1cnNpb24gbGluZXMuCi0KLVdlZCBBcHIgMTUgMjE6MTk6MzEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdGhlIHRvb2xkaXIgY29weSBvZiBnYXMgZ29lcyBkaXJlY3RseSBpbiB0b29sZGlyLgotCi1UdWUgQXByIDE0IDE0OjUwOjIyIDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEZvciBiLm91dCBmb3JtYXQsIHJvdW5kIHVwIHNlY3Rpb24KLQlzdGFydCBhZGRyZXNzZXMgdG8gbWF0Y2ggcmVxdWlyZWQgYWxpZ25tZW50LgotCi1UaHUgQXByICA5IDA1OjQ1OjI5IDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEluc3RhbGwgaW50byAkKHRvb2xkaXIpL2Jpbiwgc2luY2UgdGhhdCdzCi0Jd2hlcmUgZ2NjIGxvb2tzIGZvciBpdC4KLQotVHVlIEFwciAgNyAxNToxMjoxNSAxOTkyICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2VkIHNvbWUgbGluZXMgdG8gYmUgbGVzcyBjb25mdXNpbmcgZm9yIHNvbWUKLQltYWtlcy4KLQotCSogaW5wdXQtZmlsZS5jOiAgQ29uZGl0aW9uYWxpemUgb24gX0lPRkJGLCBub3QgVk1TLgotCi0JKiByZWFkLmMsIHdyaXRlLmM6ICBDaGFuZ2UgYSBzZXJpZXMgb2YgaWZkZWYvZWxpZiB0bwotCWlmZGVmL2Vsc2UvaWZkZWYgZXRjLgotCi1GcmkgTWFyIDI3IDEyOjIxOjE2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBzeW1ib2xzLmMgKGZiX2xhYmVsX2luaXQpOiBmaXggc2l6ZW9mIHRvIG1lbXNldC4KLQotRnJpIE1hciAxMyAxNTo0NTo0NCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluc3RhbGwgdGhlIG1hbiBwYWdlLgotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIE1BS0VJTkZPIGV4cGxpY2l0bHkgb24gaW5mby4KLQotCSogZG9jL01ha2VmaWxlLmluOiB1c2UgJChNQUtFSU5GTykgbm90IG1ha2VpbmZvLgotCi1GcmkgTWFyIDEzIDA4OjAzOjAzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBmbG9udW0tY29uc3QuYzogcmVuYW1lZCBmbG9udW0ta29uc3QuYyB0byBzdG9wIGRvcyBuYW1lCi0JY29uZmxpY3QuCi0KLVRodSBNYXIgMTIgMDQ6NDI6MzggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuaCwgdGUtc3VuMy5oOiBtb3ZlZCBMT0NBTF9MQUJFTFNfRkIgZGVmaW5pdGlvbiBmcm9tCi0JICB0Yy1tNjhrLmggdG8gdGUtc3VuMy5oLgotCi1XZWQgTWFyIDExIDIzOjMyOjQyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHZ4d29ya3M2OCBnZXRzIHRlLXN1bjMuaC4KLQotCSogZXhwci5jOiByZW1vdmUgbGltaXRhdGlvbiB0aGF0IGxvY2FsX2xhYmVsc19kb2xsYXIgb3IKLQkgIGxvY2FsX2xhYmVsc19mYiBtdXN0IGJlIDwgMTAuCi0KLQkqIHN5bWJvbHMuYzogcmVtb3ZlIGxvY2FsX2xhYmVsc19kb2xsYXIsIHJlcGxhY2Ugd2l0aCBhIGZ1bmN0aW9uCi0JICBpbnRlcmZhY2UgZm9yIGEgc3BhcnNlIGFycmF5LiAgQWxsIHVzZXJzIGFkanVzdGVkLgotCi0JKiB0ZS1zdW4zLmg6IGFkZCBMT0NBTF9MQUJFTFNfRE9MTEFSLgotCi1TYXQgTWFyICA3IDAwOjA2OjI1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluOiBjb21tZW50ZWQgb3V0IGxpbmUgZm9yIGJ1aWxkaW5nIGFzLWFsbC50ZXhpbmZvLgotCSAgVGhpcyBpcyB0ZW1wb3JhcnkuCi0KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMtYWxsLnRleGluZm86IGFkZGVkIG1lbnUgaXRlbSBob29rcy4KLQotRnJpIE1hciAgNiAyMTo1NzoxOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KLQotVHVlIE1hciAgMyAxNTo0NTo1NiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0b29sZGlyIGFuZCBwcm9ncmFtX3ByZWZpeC4KLQotU3VuIE1hciAgMSAwNDo0MzoxOSAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLntjLGh9IChmaXhfbmV3KTogTWFrZSB0aGVzZSBkZWNsYXJhdGlvbnMgY29uc2lzdGVudC4KLQotU2F0IEZlYiAyOSAxMzo1OToxMCAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzdHJlcnJvci5vKTogQWRkIHJ1bGUgc28gdGhhdCBicm9rZW4gU3VuIG1ha2UgY2FuCi0Jd29yayBpbiBzdWJkaXJzLgotCi1XZWQgRmViIDI2IDE5OjI2OjI4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMsIG9iai1jb2ZmYmZkLmMgOiBmaXggaDgzMDAgc3BlY2lmaWMgYml0IHJvdAotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBpZiBjYW4ndCB3b3JrIG91dCB3aGF0IHNvcnQgb2Ygb3BlcmFuZCBpdCBpcywKLQl0aGVuIGxvb2sgdGhyb3VnaCBGTFRfQ0hBUlMgZm9yIGEgaGludC4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiwgZG9jL2NvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLVR1ZSBGZWIgMjUgMTQ6MTc6MTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYzogSWYgYW4gZXhwcmVzc2lvbiBpcyBzaW5nbGUgY29tbWEsIHRoZW4gcmV0dXJuIHdpdGgKLQlTRUdfQUJTRU5UIHJhdGhlciB0aGFuIGFuIGVycm9yIC0gc2luY2UgdGhlIHNwYXJjIGZyb250IGVuZCBkb2VzCi0JcmVhbGx5IHN0cmFuZ2UgdGhpbmdzIHdpdGggdGhpbmdzIGxpa2UgZmJnZSxhCi0KLQkqIGFzLmg6IGluY2x1ZGUgYmZkLmggaWYgdXNpbmcgbWFueSBzZWN0aW9ucwotCSogZXhwci5jOiBMT0NBTF9MQUJFTFNfRkIgaGFkIGJlZW4gY2hhbmdlZCB0byBsb3dlciBjYXNlIC0gc28KLQlsb2NhbCBsYWJlbHMgZGlkbid0IHdvcmsuCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogZG9uJ3QgY29yZSBkdW1wIHdoZW4gdGhlcmUncyBubwotCXN5bWJvbCB0aGVyZS4KLQkqIHdyaXRlLmMsIHdyaXRlLmg6IGNhbGwgZml4X25ldyB3aXRoIHRoZSByaWdodCBudW1iZXIgb2YgYXJncyBvbgotCXRoZSBIOC4KLQkqIGNvbmZpZy90Yy1oODMwMC5bY2hdIDogZml4IGJ1Z3MgcmVwb3J0ZWQgYnkgSE1TSSwgYW5kIG1ha2UKLQllcnJvcnMgbmljZXMKLQotU2F0IEZlYiAyMiAxMjoyNjoyOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYXBwLmM6IE1SSSBjb21wYXRpYmlsaXR5IC0gYWxsb3cgc2luZ2xlIHF1b3RlIHRvIHN0YXJ0IGEgc3RyaW5nLgotCSogYXMuYzogZml4IHR5cG8gcmVjZW50bHkgaW50cm9kdWNlZC4KLQkqIGFzLmggOiBEb24ndCBpbmNsdWRlIGFvdXQvcmVsb2MuaCAtIGl0J3Mgbm90IHJpZ2h0IGZvciBDT0ZGIQotCSogZXhwci5jOiBNdWNoIHJld3JpdGluZywgdG8gYWNjb21vZGF0ZSBNUkkgc3ludGF4IGZvcgotCWV4cHJlc3Npb25zLiBBbHNvIGVhc2llciB0byByZWFkIG5vdy4KLQkqIGxpc3RpbmcuYzogUHV0IGJhY2sgZGVmdW5zCi0JKiByZWFkLmM6IG1vZGlmaWVkIHRvIGFjY2VwdCBNUkkgc3ludGF4LCBwdXQgYmFjayBsaXN0aW5nIHBzZXVkbwotCW9wcyBzbyB0aGF0IGFuIGFzc2VtYmxlciBidWlsdCB3aXRoIE5PX0xJU1RJTkcgaWdub3JlcyBsaXN0IG9wcwotCXJhdGhlciB0aGFuIHB1a2VzLgotCSogd3JpdGUuYywgd3JpdGUuaDogZml4cyAtIG9ubHkga2VlcCBhIHJlbG9jIHR5cGUgaW4gYSBmaXggaWYgdGhlIHRhcmdldAotCW1hY2hpbmUgaXMgYSBTUEFSQyBvciBhIDI5Sy4KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBhZGRlZCBzX3NlY3QgcHNldWRvIG9wCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYzogbGludHMsIHNldCB0aGUgZmlsZWhkciBmbGFncyByaWdodCBhbmQKLQlmaWxsIGluIHRoZSB0aW1lc3RhbXAuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogU2luY2Ugd2UgZG9uJ3QgaW5jbHVkZSBhb3V0L3JlbG9jLmgKLQlhbnltb3JlLCBkZWZpbmUgYWxsIHRoZSByZWxvY3Mgd2hpY2ggdGhlIHRjLTx4PiBiaXQgd2lsbCB1c2Ugc28gd2UKLQljYW4gdHJhbnNsYXRlIGZyb20gdGhlbSB0byB0aGUgY29mZiB0eXBlcy4KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IHJlbG9jX3R5cGUgaXNuJ3QgYW5lIGVudW0gYW55IG1vcmUKLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEFkZGVkIE5PX1JFTE9DIGRlZmluaXRpb24uCi0KLUZyaSBGZWIgMjEgMDY6MjE6MDcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcHV0IGhlYWRlciBmaWxlcyBiZWZvcmUgQyBzb3VyY2UgZm9yIFRBR1M7IHJlbW92ZQotCSAgcmVmZXJlbmNlcyB0byBub24tZXhpc3RlbnQgc3lzY2FsbHMuaC4KLQotCSogcmVhZC5jLCB3cml0ZS5jIHN1YnNlZ3MuYzogYmFjayBvdXQgdGhlIC5ic3MgY2hhbmdlcy4KLQotCSogb2JqLWFvdXQuYzogZG8gbm90IGluY2x1ZGUgc3RhYi5nbnUuaCBpZiBOT19MSVNUSU5HLgotCi0JKiB0Yy1pODYwLmMsIGEub3V0LmdudS5oOiBtb3ZlIGk4NjAgcmVsb2NzIHRvIGEgcHJvcGVyIHBsYWNlLgotCi0JKiBhLm91dC5oOiByZW1vdmVkLgotCi1GcmkgRmViIDIxIDAxOjA4OjQ4IDE5OTIgIE1pbmggVHJhbi1MZSAoVFJBTkxFQElOVEVMTElDT1JQLkNPTSkKLQotCSogc3ltYm9scy5jIChsb2NhbF9sYWJlbF9uYW1lKTogc3ltYm9scyBub3cgc3RhcnQgd2l0aCBeQS4KLQotCSogcmVhZC5jLCBzdWJzZWdzLmMsIHdyaXRlLmMgb2JqLWNvZmYuYzogYWRkZWQgaGFuZGxpbmcgb2YKLQkgIGAuYnNzYCBwc2V1ZG8gb3AgZm9yIHVuaXRpYWxpemVkIGRhdGEuIFRoZSBuZXcgZ2NjICgxLjM3Ljl4KQotCSAgZ2VuZXJhdGUgdGhlc2Ugc2VjdGlvbnMuICAuYWxpZ246IHdpbGwgdXNlIE5PUF9PUENPREUgb3IgMAotCSAgZm9yIHBhZGRpbmcuIFRoaXMgaXMganVzdCBmb3IgYmVpbmcgbmljZSB0byB0aGUKLQkgIGRpc2Fzc2VtYmxlci4KLQotCSogZXhwci5jIChvcGVyYW5kKTogY2hhbmdlZCB0byBnZW5lcmF0ZSBsb2NhbCBsYWJlbCAiXDAwMUwwIgotCSAgc3RhcnRpbmcgd2l0aCBhIF5BIHNvIHRoYXQgaXQgaXMgcmVjb2duaXplZCBhcyBhIGxvY2FsIGxhYmVsLgotCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiB6ZXJvIGJzc19maXhfcm9vdCwgdG9vLgotCi0JKiB0Yy1pMzg2LmM6IHRjLWkzODYuYzogYWRkZWQgaGFuZGxpbmcgb2YgdGhlIGZvbGxvd2luZyBvcGNvZGVzOgotCSAgaS9vIG9wY29kZXMgLSBpbmIsIGludywgb3V0YiBhbmQgb3V0dy4gIHN0cmluZyBtYW5pcHVsYXRpb24gd2l0aAotCSAgYXR0IHN5bnRheCAtIHNjbXAsIHNsb2QsIHNtb3YsIHNzY2EsIHNzdG8uCi0KLQkqIG9iai1jb2ZmLmM6IChmb3IgYWl4Mzg2KSBNb3ZlZCB0aGUgc3ltYm9scyAudGV4dCwgLmRhdGEgYW5kIC5ic3MKLQkgIHRvIGp1c3QgYWZ0ZXIgLmZpbGUgLgotCi0JICBJbiBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKCkgd2hlcmUgaXQgdHJpZXMgdG8gcHV0IHRoZSBleHRlcm5hbAotCSAgc3ltYm9scyBhcGFydCwgd2l0aCB0aGUgY29uZGl0aW9uOgotCSAgICAoIVNfSVNfREVGSU5FRChzeW1ib2xQKSAmJgotCSAgICAgIVNfSVNfREVCVUcoc3ltYm9sUCkgJiYKLQkgICAgICFTRl9HRVRfU1RBVElDUyhzeW1ib2xQKSkKLQkgIGl0IHdhcyBtb3ZpbmcgdG9vIG1hbnkgc3ltYm9scyBvdXQuIFNvIEkgc3dpdGNoIGl0IGJhY2sgdG8gdGhlCi0JICBjb25kaXRpb246Ci0JICAgIChTX0dFVF9TVE9SQUdFX0NMQVNTKHN5bWJvbFApID09IENfRVhUICYmICFTRl9HRVRfRlVOQ1RJT04oc3ltYm9sUCkpCi0KLQkgIEluIG9ial9lbWl0X3JlbG9jYXRpb25zKCkgYWRkZWQgdGhlIGNvbmRpdGlvbmFsIG9uIEtFRVBfUkVMT0NfSU5GTwotCSAgc28gdGhhdCB3ZSBkb24ndCB1c2UgdGhlIEZfUkVMRkxHIHdoaWNoIG1ha2UgdGhlIGxpbmtlciBjb21wbGFpbgotCSAgdGhhdCBzb21lYm9keSBoYXMgc3RyaXBwZWQgdGhlIHJlbG9jYXRpb24gaW5mby4KLQotCSAgQWxzbywgdGhlIEFJWCBsZCBwcm9ncmFtIHJlcXVpcmUgdGhhdCB0aGUgcmVsb2NhdGlvbiB0YWJsZQotCSAgaXMgc29ydGVkIGJ5IHJfdmFkZHIgbGlrZSB0aGUgc3RhbmRhcmQgQVRUIGFzc2VtYmxlciBkb2VzLgotCi0JICBbaGUgYWxzbyBjaGFuZ2VkIHRoZSBzaXplb2Yoc3RydWN0IC4uLikncyBpbnRvIHRoZSBjb2ZmCi0JICBzdHlsZSBGT09TWiBtYWNyb3MuICBJJ20gbm90IHN1cmUgdGhpcyBpcyByaWdodCwgYnV0IEkgY2FuJ3QKLQkgIHJlbWVtYmVyIHdoeS4gIHhveG9yaWNoLl0KLQotRnJpIEZlYiAyMSAwMTowODo0OCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgZG9jOiB1c2UgdGhlIGRvYy4gIEJ1aWxkIGl0LCBpbnN0YWxsCi0JICBpdCwgY2xlYW4gaXQsIGV0Yy4KLQotVHVlIEZlYiAxOCAwMjoyMToyNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiB3aGl0ZSBzcGFjZSBhbmQgY29tbWVudHMgb25seS4KLQotCSogY29uZmlndXJlLmluOiB1c2UgdGhlIG5ldyBhdG9mLW5zMzIuYyBmb3IgbnMzMmsuCi0KLQkqIHdyaXRlLmM6IGNvbW1lbnQgY2hhbmdlIG9ubHkuCi0KLQkqIHRjLW04OGsuW2hjXTogcHVsbGVkIGluIGZyb20gaGFjaydzIHVuZmluaXNoZWQgd29yay4gIFRoZXNlCi0JICBhcmVuJ3QgeWV0IGludGVncmF0ZWQuCi0KLQkqIHRjLWk4NjAuW2hjXTogYmxldyBvZmYgdGhlIGR1c3QuICBTb21ldGhpbmcgbXVzdCBzdGlsbCBiZSBkb25lCi0JICBhYm91dCBjb25mbGljdGluZyByZWxvY2F0aW9uIHR5cGVzLgotCi0JKiB0Yy1uczMyay5jOiBSZXBsYWNlZCBwcmV2aW91cyB0Y19hb3V0X2ZpeF90b19jaGFycyBzdHViIHdpdGggdGhlCi0JICByZWFsIHRoaW5nLgotCi0JKiB0Yy1pOTYwLmMsIHRjLXNwYXJjLmM6IHdoaXRlIHNwYWNlIGFuZCBjb21tZW50cyBvbmx5LgotCi0JKiB0Yy1hMjlrLmg6IGRlbGV0ZSBkdXBsaWNhdGUgbWFjcm8gZGVmaW5pdGlvbi4KLQotCSogbmV3IGZpbGUgYXRvZi1uczMyay5jIGNvcGllZCBmcm9tIGhhY2sncyBsYXN0IHVucmVsZWFzZWQgZ2FzLgotCi1Nb24gRmViIDE3IDA3OjUxOjA2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbnMzMmsuYzogYWN0dWFsbHkgbWFrZSB0Y19hb3V0X2ZpeF90b19jaGFycyB3b3JrCi0JICByYXRoZXIgdGhhbiBhYm9ydC4KLQotCSogbmVhcmx5IGV2ZXJ5dGhpbmcuICBmbHVzaCBDaGFuZ2VMb2csIHBhY2thZ2UgYXMgZ2FzLTEuOTIuMS4KLQkgIENoYW5nZUxvZydzIHByaW9yIHRvIHRoaXMgYXJlIHNrZXRjaHkgYXQgYmVzdC4gIEkgaGF2ZSBsb2dzLgotCSAgVGhleSBqdXN0IGFyZW4ndCBDaGFuZ2VMb2dzLgpkaWZmIC0tZ2l0IGEvZ2FzL0NoYW5nZUxvZy05Njk3IGIvZ2FzL0NoYW5nZUxvZy05Njk3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDJhZjgyLi4wMDAwMDAwCi0tLSBhL2dhcy9DaGFuZ2VMb2ctOTY5NworKysgL2Rldi9udWxsCkBAIC0xLDU5NjAgKzAsMCBAQAotV2VkIERlYyAzMSAxMjoyOTo0NyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX3JlbGF4X3RhYmxlKTogQ29ycmVjdCBicmFuY2ggcmFuZ2VzLgotCi1Nb24gRGVjIDIyIDEzOjA2OjA1IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluIChpMzg2Ki1nbzMyLXJ0ZW1zKik6IEZpeCB0byBiZSB0aGUgc2FtZSBhcwotCWlbMzQ1Nl04Ni1nbzMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gRGVjIDIyIDEyOjU0OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBUaGUgNDY1MCBkb2Vzbid0IHBlcm1pdCBNX0xEQzFfQUIsCi0JTV9TREMxX0FCLCBNX0xfRE9CLCBNX0xfREFCLCBNX1NfREFCLCBvciBNX1NfRE9CLgotCShtaXBzX2lwKTogQWx3YXlzIGNoZWNrIGZvciBGUF9ELCBub3QganVzdCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQKLQlhcmUgbm90IHBhcnQgb2YgdGhlIHJlZ3VsYXIgSVNBLgotCi1UaHUgRGVjIDE4IDE2OjQ5OjI4IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGJ1aWxkX2luc24pOiBNYWtlIGBudW1iZXInIGEgbG9uZyBmb3IgNjQtYml0IGhvc3RzLgotCi1UaHUgRGVjIDE4IDE2OjQyOjU3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChjcHVfdHlwZXMpOiAyMTE2NHBjL3BjYTU2IGRvZXMgbm90IGhhdmUgQ0lYLgotCi1XZWQgRGVjIDE3IDIxOjIzOjA3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50IDMyYml0IGJpZ251bSk6IE1hc2sgb2ZmIGJpdHMgb3V0c2lkZQotCXRoZSByYW5nZSB3ZSBjYXJlIGFib3V0LgotCi1XZWQgRGVjIDE3IDE1OjI5OjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9zaG9ydG9wdHMpOiBBZGQgJ24nIGFuZCAnTicgb3B0aW9ucy4KLQkoZXhlY190eXBlX2VudW0pOiBFbnVtZXJhdGlvbiBnaXZpbmcgYWxsIG9mIHRoZSBleGVjIHR5cGVzLgotCSh3YXJuX25vcHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlIHRvIGdpdmUgbm9wIHdhcm5pbmcgbGV2ZWwuCi0JKHtjdXIscHJldn1fbXVsMzJfcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyCi0JdGhlIGN1cnJlbnQvcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSAzMi1iaXQgbXVsdGlwbHkuCi0JKE9wdGltaXppbmcpOiBNYWtlIHN0YXRpYy4KLQkoTk9QezIsX0xFRlQsX1JJR0hUfSk6IE1hY3JvcyBmb3Igd29yZCBvZiBub3BzIGFuZCBsZWZ0L3JpZ2h0Ci0Jbm9wcy4KLQkoZDMwdl9pbnNlcnRfb3BlcmFuZCk6IERlbGV0ZSBkZWNsYXJhdGlvbiBvZiB1bnVzZWQgZnVuY3Rpb24uCi0JKHdyaXRlXzJfc2hvcnQpOiBNYWtlIGV4ZWNfdHlwZSBhcmd1bWVudCBlbnVtLCBub3QgaW50LgotCShwYXJhbGxlbF9vayk6IERpdHRvLgotCShjaGVja19yYW5nZSk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUocykuCi0JKGJ1aWxkX2luc24pOiBEaXR0by4KLQkoZmluZF9mb3JtYXQpOiBEaXR0by4KLQkobWRfYXBwbHlfZml4Myk6IERpdHRvLgotCShtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgLW4gYW5kIC1OLgotCShtZF9wYXJzZV9vcHRpb24pOiBQYXJzZSAtbiBhbmQgLU4uCi0JKHdyaXRlXzFfc2hvcnQpOiBJZiAtbiwgd2FybiBhYm91dCBhZGRpbmcgYSBub3AuICBVc2UKLQlOT1Bfe0xFRlQsUklHSFR9LgotCSh3cml0ZV8yX3Nob3J0KTogVXNlIGVudW1lcmF0aW9uIHZhbHVlcyBpbnN0ZWFkIG9mIGhhcmQgY29kZWQKLQlpbnRlZ2Vycy4gIFJlc2V0IGV4ZWNfdHlwZSBmb3IgZGVmYXVsdCBvcGVyYXRpb25zLiAgRm9yIGV4cGxpY2l0Ci0JcGFyYWxsZWwgb3BlcmF0aW9ucywgY2FsbCBwYXJhbGxlbF9vayB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcwotCW9rLiAgSWYgd3JpdGluZyBvdXQgYSBwYXJhbGxlbCBvcGVyYXRpb24sIGFuZCB0aGUgcHJldmlvdXMKLQlpbnN0cnVjdGlvbiB3YXMgYSAzMi1iaXQgbXVsdGlwbHksIGluZGljYXRlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KLQlpcy4KLQkocGFyYWxsZWxfb2spOiBBbGxvdyBhZGQvdHggLi4uIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwgd2l0aAotCWFub3RoZXIgYWRkL3R4IC4uLiBhc3N1bWluZyB0aGUgZ3ByIHJlZ2lzdGVycyBkb24ndCBvdmVybGFwLgotCShtZF9hc3NlbWJsZSk6IFVzZSBleGVjIHR5cGUgZW51bWVyYXRpb24gdmFsdWVzLCBub3QgaGFyZCBjb2RlZAotCWludHMuICBDaGVjayBmb3IgbG9hZHMgb3IgMTYtYml0IG11bHRpcGxpZXMgZm9sbG93aW5nIGluIHRoZSBuZXh0Ci0JY3ljbGUgYWZ0ZXIgYSAzMi1iaXQgbXVsdGlwbHkuICBBZGQgbm9wcyBpZiB0aGF0IGlzIHRoZSBjYXNlLgotCShkb19hc3NlbWJsZSk6IENvcHkgcHJldl9tdWwzMl9wIHRvIGN1cl9tdWwzMl9wLCBhbmQgc2V0Ci0JY3VyX211bDMyX3AgaWYgY3VycmVudCBpbnN0cnVjdGlvbiBpcyBhIDMyLWJpdCBtdWx0aXBseS4KLQkoZmluZF9mb3JtYXQpOiBDaGFuZ2Ugc3BhY2luZyBhbmQgbGF5b3V0LgotCi1UdWUgRGVjIDE2IDE2OjU1OjQ1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAodGljODBfcmVsYXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9sb25nb3B0cyk6IEFkZCBuZXcgT1BUSU9OX1JFTEFYIGFuZCBPUFRJT05fTk9fUkVMQVggb3B0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyByZWxheCBvcHRpb25zLgotCShtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgbmV3IHJlbGF4IG9wdGlvbnMuCi0JKGZpbmRfb3Bjb2RlKTogRG9uJ3QgdXNlIHNob3J0IGZvcm1zIG9mIFBDIHJlbGF0aXZlIGJyYW5jaGVzIGlmCi0JdGljODBfcmVsYXggaXMgc2V0LgotCi1UdWUgRGVjIDE2IDE1OjI2OjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IFJlbW92ZSBub24tcmVnaXN0ZXIgYml0cyBmcm9tCi0JdXNlZC9zZXQgZmxhZyBmaWVsZHMuICBNYWtlIGZsYWcgdmFycyB1bnNpZ25lZCBsb25nLiAgVXNlCi0JRkxBR19BezAsMX0gZm9yIGFjY3VtdWxhdG9ycy4gIEFsbG93IGFueSAyIGluc25zIHRvIGJlIGRvbmUgaW4KLQlwYXJhbGxlbCBpZiB0aGV5IHVzZSB0aGUgc2FtZSBjb25kaXRpb25hbCBmbGFnIHdpdGggcmV2ZXJzZWQKLQltZWFuaW5nLiAgQWxsb3cgMiBhZGQvc3ViIGluc25zIHRoYXQgc2V0IHRoZSBjYXJyeSBvciBvdmVyZmxvdwotCWZsYWdzIGJ1dCBkbyBub3QgcXVlcnkgdGhlbSB0byBiZSBkb25lIGluIHBhcmFsbGVsLiAgRG9uJ3QgYWxsb3cgMgotCXdvcmQgc3RvcmUgb3BlcmF0aW9ucyB0byBiZSBkb25lIGluIHBhcmFsbGVsIHdpdGggQUREcHBwIG9yCi0JU1VCcHBwLiAgRG9uJ3QgYWxsb3cgbG9hZHMgdG8gYmUgZG9uZSBpbiBwYXJhbGxlbCB3aXRoIDE2IGJpdAotCW11bHRpcGxpZXMuCi0KLVR1ZSBEZWMgMTYgMDk6MjA6NDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jOiBQcmV2ZW50IHVzZSBvZiBpbnRlcndvcmtpbmcgc3VwcG9ydCBmb3IKLQlub24tQ09GRiB0YXJnZXRzLgotCi1Nb24gRGVjIDE1IDE1OjIwOjMyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hbGwudGV4aTogQWRkIE0zMlIgY3B1LgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24gb2YgbTMyciBwcm9jZXNzb3IuCi0KLQkqIGRvYy9jLW0zMnIudGV4aTogTmV3IGZpbGUsIGRvY3VtZW50aW5nIG0zMnIgc3BlY2lmaWMgZmVhdHVyZXMuICAKLQotCi1Nb24gRGVjIDE1IDEwOjMyOjI4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IENvcnJlY3RseSBpbnNlcnQgJ1AnIG9wZXJhbmRzIGludG8KLQl0aGUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBEZWMgMTIgMTE6NDQ6MjAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChidWlsZF9pbnNuKTogSGFuZGxlIGluc3RydWN0aW9ucyB0aGF0IGhhdmUKLQlsb25nICgzMiBiaXQpIFBDIHJlbGF0aXZlIG9mZnNldHMuICBGaXggcGxhY2VzIHRoYXQgcHJldmlvdXNseQotCW1pc3VzZWQgUl9NUFBDUiBmb3IgMTUgYml0IG9mZnNldHMgdG8gdXNlIHRoZSBuZXcgUl9NUFBDUjE1VyB0eXBlLgotCShtZF9hcHBseV9maXgpOiBBZGQgY2FzZSB0byBoYW5kbGUgbG9uZyBQQyByZWxhdGl2ZSBvZmZzZXRzLgotCi1GcmkgRGVjIDEyIDEwOjM1OjAxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0gT3B0aW9ucyk6IERvY3VtZW50IHN1cHBvcnQgZm9yIG5ldyBBUk0KLQlwcm9jZXNzb3IgbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIG5ldyBBUk0KLQlwcm9jZXNzb3IgbmFtZXMuCi0KLVRodSBEZWMgMTEgMTc6NDY6NTAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IERvbid0IG92ZXJ3cml0ZSBvcGNvZGUgdGFibGUgZGF0YS4KLQkoaW5zb3AsIG02OGtfaXApOiBNYWtlIGBvcGNvZGUnIGNvbnN0IHNvIGl0IGRvZXNuJ3QgaGFwcGVuIGFnYWluLgotCi1GcmkgRGVjICA1IDExOjIzOjU5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogRml4IEJGRF9SRUxPQ18zMiBhZ2FpbnN0IGEKLQlzeW1ib2wgKyBvZmZzZXQuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogVXNlCi0JU0hUX1Y4NTBfe1N8VHxafUNPTU1PTiB0byBtYXJrIHNwZWNpYWwgY29tbW9uIHNlY3Rpb25zLgotCi1UdWUgRGVjICAyIDE3OjA1OjEzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEJyb3VnaHQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBicmFuY2guCi0KLU1vbiBEZWMgIDEgMjA6MjQ6MTggMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtc2guYyAoU1dJVENIX1RBQkxFX0NPTlMpOiBIYW5kbGUgKGZpeCktPmZ4X3NpemUgPT0gMS4KLQkoU1dJVENIX1RBQkxFKTogSGFuZGxlIEJGRF9SRUxPQ184LgotCShtZF9hcHBseV9maXgpOiAjaWZuZGVmIEJGRF9BU1NFTUJMRVIgY29kZTogSGFuZGxlIGZpeFAtPmZ4X3NpemUgPT0gMS4KLQkoY29mZl9yZWxvY19tYXApOiBBZGQgQkZEX1JFTE9DXzhfUENSRUwgZW50cnkuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogU1dJVENIX1RBQkxFIGNhc2U6IEhhbmRsZSBCRkRfUkVMT0NfOC4KLQotU2F0IE5vdiAyMiAxNjoxOToyMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1hbHBoYS5jIChyYW5nZV9zaWduZWRfMTYsIHJhbmdlX3NpZ25lZF8zMik6IFdvcmsgYXJvdW5kIGFuCi0JYXBwYXJlbnQgYnVnIGluIGdjYydzIGxvbmcgbG9uZyBzdXBwb3J0IGNyb3NzaW5nIGZyb20geDg2LgotCi1TYXQgTm92IDIyIDE0OjI2OjA5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYzogQnJvdWdodCB1cCB0byBkYXRlIHdpdGggbGF0ZXN0IGNoYW5nZXMgb24gYXJtCi0JYnJhbmNoLiAKLQotU2F0IE5vdiAyMiAxNTo1MDowOSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnLWdhcy5jb206IEdldCB2ZXJzaW9uIGluZm8gZnJvbSBjb25maWd1cmUuaW4uCi0KLQkqIG1ha2VmaWxlLnZtczogaW5jbHVkZSBkZXBlbmQub2JqIGluIE9CSlMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX3NlY3Rpb24pOiBSZW1vdmUgIi5sY29tbSIgaGFuZGxpbmcuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9iYXNlcmVnX2Nsb2JiZXJlZCk6IFJlbW92ZSB2YXJpYWJsZSBhbmQKLQlhbGwgY29ycmVzcG9uZGluZyBjb2RlLgotCi1UaHUgTm92IDIwIDE1OjA2OjA4IDE5OTcgIFJpY2hhcmQgRWFybnNoYXcgPHJlYXJuc2hhQGFybS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoVEFSR0VUX0ZPUk1BVCBmb3IgZ2VuZXJpYyBhLm91dCB0YXJnZXRzKTogQWxsb3cKLQlydW4tdGltZSBlbmRpYW4gc2VsZWN0aW9uLgotCi1XZWQgTm92IDE5IDE3OjQ0OjQyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiB0Yy1zaC5jIChwYXJzZV9yZWcpOiBQcm9wZXJseSBxdW90ZSBmb3IgZnY0LgotCi1XZWQgTm92IDE5IDIzOjQ2OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEFkZCBtaXNzaW5nIGJyZWFrcyBpbiBjYXNlIG9uCi0Jc3ltYm9sIHZhbHVlIG9wZXJhdG9yLgotCi1UdWUgTm92IDE4IDE4OjQ1OjE0IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rLCBmaW5kX29wY29kZSk6IAotCVNwbGl0IE9QRVJBTkRfRkxBRyBpbnRvIE9QRVJBTkRfRkZMQUcgYW5kIE9QRVJBTkRfQ0ZMQUcuCi0KLVN1biBOb3YgMTYgMTA6MDU6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ2FzdCBzZWNvbmQgYXJnIG9mCi0JbWRfYXBwbHlfZml4MyBjYWxsIHRvIHR5cGUgInZhbHVlVCAqIi4KLQotVGh1IE5vdiAxMyAxMzo1MzoxMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IE1ha2UgRnJlZUJTRCBhbiBhb3V0IC8gaTM4NmJzZAotIAl2YXJpYW50LgotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQkKLVRodSBOb3YgMTMgMTE6MDc6MTQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogVXNlIHRoZSBtZW1iZXJzaGlwIGZpZWxkCi0JZm9yIElOU05fTUFDUk8ncy4KLQkobWlwc19pcCk6IFNhbWUuCi0KLVRodSBOb3YgMTMgMDI6MDQ6NTUgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBGb3IgT1BDT0RFX0ZBS0UsIGFkZCBjaGVjayBmb3IKLQlmaXJzdCBhcmd1bWVudCBpZiBpdCdzIHN1cHBvc2VkIHRvIGJlIGEgcmVnaXN0ZXIuCi0KLVR1ZSBOb3YgMTEgMTk6MjU6MDUgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogIElmIGQxMHYsIHJlLWluc2VydCBhIHNwYWNlIGJlZm9yZQotCWEgJyMnIHdoZW4gaW4gc3RhdGUgMTAuCi0KLVR1ZSBOb3YgMTEgMTM6MzM6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuYzogSW5jbHVkZSAic3Vic2Vncy5oIi4KLQkodGNfcmVsb2NfbWFuZ2xlKTogSGFuZGxlIHJlZmVyZW5jZXMgdG8gc3ltYm9scyB3aGljaCBhcmUgbm90Ci0JYmVpbmcgb3V0cHV0LCBzbyB0aGF0IHJlZmVyZW5jZXMgdG8gYC4nIHdvcmsuCi0KLU1vbiBOb3YgMTAgMTM6NDM6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQ2FsbCBhZGRfZml4IHdoZW4gbmVlZGVkIGZvciAnXycKLQljYXNlLgotCi0JKiBtYWNyby5jIChzdWJfYWN0dWFsKTogSWYgd2UgZG9uJ3QgZmluZCBhIHBhcmFtZXRlciBmb3IgYW4gJiwKLQlqdXN0IHN1YnN0aXR1dGUgJi4KLQotRnJpIE5vdiAgNyAyMToyOTozMiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEluIGRlZmF1bHQgY2FzZSwgY2FsbCBhc19iYWQKLQlpbnN0ZWFkIG9mIGZwcmludGYsIHRvIGdldCAiYXNzZW1ibGVyIG1lc3NhZ2VzOiIgbWVzc2FnZSBvdXRwdXQKLQliZWZvcmUgaW5zdGVhZCBvZiBhZnRlci4KLQotRnJpIE5vdiAgNyAxMDozNjoyMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBmcmFncy5oOiBIYW5kbGUgbXVsdGlwbGUgaW5jbHVzaW9uLgotCi1XZWQgTm92ICA1IDEwOjUxOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdS4KLQkqIGFzLmggKHN0cnVjdCBmcmFnLCBmcmFnIHN1cHBvcnQpOiBNb3ZlZCBmcm9tIGhlcmUuCi0JKiBmcmFncy5oOiBUbyBoZXJlLgotCShzdHJ1Y3QgZnJhZywgbWVtYmVyIHRjX2ZyYWdfZGF0YSk6IE5ldyBtZW1iZXIgaWYgVENfRlJBR19UWVBFCi0JaXMgZGVmaW5lZC4KLQkoc3RydWN0IGZyYWcsIG1lbWJlciBmcl9jZ2VuKTogUmVuYW1lZCBmcm9tIGZyX3RhcmcuY2dlbi4KLQkqIGNnZW4uYyAoY2dlbl9hc21fZmluaXNoX2luc24pOiBVcGRhdGUuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVwZGF0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKFRDX0ZSQUdfSU5JVCk6IFJlbmFtZWQgZnJvbSBtZF9pbml0X2ZyYWcuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IERpdHRvLgotCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0ZSQUdfVFlQRSk6IERlZmluZS4KLQkoZnJhZ19vcGNvZGVfZnJhZyxmcmFnX29wY29kZV9vZmZzZXQsZnJhZ19ic3IpOiBVcGRhdGUuCi0JKFRDX0ZSQUdfSU5JVCk6IFVwZGF0ZS4KLQotVHVlIE5vdiAgNCAxNjozNTo1NyAxOTk3ICBJYW4gRGFsbCAgPElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXU+Ci0KLQkqIHdyaXRlLmMgKHByaW50X2ZpeHVwKTogVXNlIFRDX0ZJWF9EQVRBX1BSSU5UIChpZiBkZWZpbmVkKSB0bwotCXByaW50IG91dCBNRCBmaWVsZHMgb2YgZml4LgotCSogZnJhZ3MuYyAoZnJhZ192YXIsIGZyYWdfdmFyaWFudCk6IFVzZSBUQ19GUkFHX0lOSVQgbWFjcm8gKGlmCi0gCWRlZmluZWQpIHRvIGluaXRpYWxpemUgTUQgZmllbGRzIGluIGZyYWcuCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZywgbnMzMmsgc3VwcG9ydCk6IFJlbmFtZSBuczMyayB0byBmcl9uczMyay4KLQlEZWxldGUgcGNyZWxfYWRqdXN0LiAgQWRkIGZyX29wY29kZV9mcmFnUCwgZnJfb3Bjb2RlX29mZnNldC4KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgY29tbWVudHMuIFJlbW92ZSBvYnNvbGV0ZQotIAlCRkRfRkFTVF9TRUNUSU9OX0ZJTEwgZGVmaW5pdGlvbiwgY2hhbmdlIHByb3RvdHlwZXMgZm9yCi0gCWZpeF9uZXdfbnMzMmsgYW5kIGZpeF9uZXdfbnMzMmtfZXhwIHRvIGFkZCBuZXcgYXJndW1lbnRzCi0gCW9wY29kZV9mcmFnIGFuZCBvcGNvZGVfb2Zmc2V0IGFuZCByZW1vdmUgcGNyZWxfYWRqdXN0LgotCShUQ19GSVhfVFlQRSk6IGFkZCBvcGNvZGVfZnJhZ1AgYW5kIG9wY29kZV9vZmZzZXQgZmllbGRzLgotCShUQ19GSVhfREFUQV9QUklOVCk6IG5ldyBtYWNybyB0byBwcmludCBvdXQgVENfRklYX1RZUEUuCi0JKFRDX0ZSQUdfSU5JVCk6IG5ldyBtYWNybyB0byBpbml0aWFsaXplIG1hY2hpbmUgZGVwZW5kZW50IGZpZWxkIGluCi0gCWZyYWdzLgotCShmcmFnX29wY29kZV9mcmFnLCBmcmFnX29wY29kZV9vZmZzZXQsIGZyYWdfYnNyKTogbWFjcm9zIHRvIGFjY2VzcwotIAlNRCBmaWVsZHMgaW4gZnJhZyBzdHJ1Y3R1cmUuCi0JKGZpeF9pbV9kaXNwLCBmaXhfYml0X2ZpeFAsIGZpeF9vcGNvZGVfZnJhZywgZml4X29wY29kZV9vZmZzZXQsCi0gCWZpeF9ic3IpOiBtYWNyb3MgdG8gYWNjZXNzIE1EIGZpZWxkcyBpbiBmaXggc3RydWN0dXJlLgotCSogY29uZmlnL3RjLW5zMzJrLmM6IEF2b2lkIG92ZXJsZW5ndGggbGluZXMuIEFsaWduIGNvbW1lbnRzLiAgRG9uJ3QKLSAJdXNlIHN0cnVjdCBvcGNvZGVfbG9jYXRpb24gYXMgdGhlc2UgZmllbGRzIGFyZSBub3cgaW4gdGhlIGZyYWcKLQlzdHJ1Y3R1cmUuCi0JKGNvbnZlcnRfaWlmKTogQ2FsbCBmcmFnX21vcmUgYXMgaXQgaXMgbmVlZGVkIGluc3RlYWQKLSAJb2YgdHJ5aW5nIHRvIGFsbG9jYXRlIGZvciB0aGUgd2hvbGUgaW5zbi4gQXZvaWQgY2FsbCBvZiBmcmFnX21vcmUKLSAJd2l0aCBuZWdhdGl2ZSBhcmd1bWVudC4KLQkobWRfcGNyZWxfYWRqdXN0LCBtZF9maXhfcGNyZWxfYWRqdXN0LCBtZF9hcHBseV9maXgsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX3BjcmVsX2Zyb20sCi0JdGNfYW91dF9maXhfdG9fY2hhcnMpOiB1c2UgYWNjZXNzb3IgbWFjcm9zIHRvIGdldCBtZCBmaWVsZHMgaW4gZml4Ci0gCWFuZCBmcmFnIHN0cnVjdHVyZXMuCi0JKGZpeF9uZXdfbnMzMmssIGZpeF9uZXdfbnMzMmtfZXhwKTogYWRkIG5ldyBhcmd1bWVudHMgb3Bjb2RlX2ZyYWcgYW5kCi0Jb3Bjb2RlX29mZnNldCBhbmQgcmVtb3ZlIHBjcmVsX2FkanVzdC4KLQkoY29udmVydF9paWYsIGNvbnNfZml4X25ld19uczMyayk6IGNhbGwgZml4X25ld19uczMyaywKLSAJZml4X25ld19uczMya19leHAgd2l0aCBjaGFuZ2VkIGFyZ3VtZW50cy4KLQotTW9uIE5vdiAgMyAxMzozMDoxNyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogdGMtbWlwcy5jIChtZF9iZWdpbik6IFJlb3JnYW5pemUgc2V0dGluZyBvZiBkZWZhdWx0IHZhbHVlcyBzbwotCXRoYXQgbWlwc19jcHUgZGVwZW5kcyBvbiBUQVJHRVRfQ1BVLCBhbmQgbWlwc19vcHRzLmlzYSBkZXBlbmRzIG9uCi0JbWlwc19jcHUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlbW92ZSBhbGwgY29kZSB0aGF0IHNldHMgZGVmYXVsdHM7IG1kX2JlZ2luCi0JaGFuZGxlcyBhbGwgb2YgdGhpcyBub3cuCi0KLVN1biBOb3YgIDIgMTQ6NDY6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoU1RBR0VTVFVGRik6IENoYW5nZSBiaW5fUFJPR1JBTVMgdG8KLQlub2luc3RfUFJPR1JBTVMuCi0JKGJvb3RzdHJhcCwgYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcyBpbiB0aGUKLQlUT0Mgc2VjdGlvbiB0byBiZSBhZ2FpbnN0IHRoZSBjc2VjdC4KLQotRnJpIE9jdCAzMSAxODoxOTo1NSAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAodmFsaWRhdGVfbWlwc19pbnNuKTogTmV3IGZ1bmN0aW9uLCBjaGVja3MKLQltYXRjaCB2ZXJzdXMgbWFzayBiaXRzLCBhbmQgYWxzbyB2ZXJpZmllcyB0aGF0IGFsbCBiaXRzIHRvIGJlCi0Jb3V0cHV0IGFyZSBhY3R1YWxseSBzcGVjaWZpZWQgc29tZXdoZXJlLgotCShtZF9iZWdpbik6IENhbGwgaXQgZm9yIDMyLWJpdCBpbnN0cnVjdGlvbnMsIGluc3RlYWQgb2YgZG9pbmcKLQltYXRjaC9tYXNrIGNoZWNrIGhlcmUuICBJbiBjYXNlIG9mIGZhaWx1cmUsIHByaW50IGEgbWVzc2FnZSwgYnV0Ci0JY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIG9wY29kZSB0YWJsZSBiZWZvcmUgZXhpdGluZy4KLQotVGh1IE9jdCAzMCAxMzo0NjoyMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggdGh1bWIgQURSIHBzZXVkbyBvcC4gIFBhdGNoCi0JZnJvbSBUb255IFRob21wc29uIGF0IEFSTTogYXRob21wc29AYXJtLmNvbQotCi1UaHUgT2N0IDMwIDExOjExOjI2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogQWxsb3cgb2RkIHJlZ2lzdGVycyBmb3IgbGQydyBhbmQKLQlmcmllbmRzLgotCi1GcmkgT2N0IDI0IDE1OjU2OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IFdoZW4gaGFuZGxpbmcgQGwsIGFsd2F5cyBzaWduCi0JZXh0ZW5kIGlmIHRoZSBvcGVyYW5kIGV4cGVjdHMgYSBzaWduZWQgdmFsdWUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMU19ET0xMQVIpOiBEb24ndCBkZWZpbmU7IHVzZQotCWRlZmF1bHQgd2hpY2ggaXMgdG8gcGVybWl0IGRvbGxhciBsYWJlbHMuCi0KLUZyaSBPY3QgMjQgMTE6MTk6MjIgMTk5NyAgSmFrdWIgSmVsaW5layAgPGpqQHN1bnNpdGUubWZmLmN1bmkuY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19tZW1vcnlfbW9kZWwpOiBOZXcgdmFyaWFibGUuCi0JKG1kX2xvbmdvcHRzKTogQWRkIC1UU08vLVBTTy8tUk1PIG9wdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbnMpOiBIYW5kbGUgdGhlbS4KLQkoc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBGb3IgNjQgRUxGLCBzZXQgcmVxdWlyZWQKLQltZW1vcnkgb3JkZXJpbmcgaW4gZV9mbGFncy4gRGVmYXVsdCB0byBSTU8gYW5kIGxldCB0aGUgdXNlcgotCW92ZXJyaWRlIGl0IHRocm91Z2ggY29tbWFuZCBsaW5lLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcpOiBBZGQuCi0KLVdlZCBPY3QgMjIgMTc6NDI6MTIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHY5YV9hc3JfdGFibGUpOiBOZXcgdmFyaWFibGUuCi0JKHNwYXJjX2lwKTogSGFuZGxlIHY5YSBhc3Incy4KLQlQYXRjaCBmcm9tIERhdmlkIE1pbGxlciA8ZGF2ZW1Admdlci5ydXRnZXJzLmVkdT4uCi0KLVdlZCBPY3QgMjIgMTc6MjI6NTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2RvX2FsaWduKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2hhbmRsZV9hbGlnbik6IEhhbmRsZSByc19hbGlnbl9jb2RlLgotCVBhdGNoIGZyb20gSmFrdWIgSmVsaW5layA8ampAc3Vuc2l0ZS5tZmYuY3VuaS5jej4uCi0KLVdlZCBPY3QgMjIgMTI6NTE6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfc21hbGwpOiBOZXcgdmFyaWFibGUuCi0JKE9QVElPTl9TTUFMTCk6IERlZmluZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgInNtYWxsIi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIE9QVElPTl9TTUFMTC4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLXNtYWxsLgotCSogY29uZmlnL3RjLXNoLmggKHNoX3NtYWxsKTogRGVjbGFyZS4KLQkoU1VCX1NFR01FTlRfQUxJR04pOiBIYW5kbGUgc2hfc21hbGwuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCk6IENoZWNrIHNoX3NtYWxsIGluIFRDX1NICi0JY2FzZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGNvbnN0YW50IGluIE1fTElfRAotCWNhc2UgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgotCi1UdWUgT2N0IDIxIDEwOjIwOjExIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzLCBjYXNlcyAuLi5fSDQ0LCAuLi5fSElYMjIpOiBMZWF2ZQotCW92ZXJmbG93IHNpZ25hbGxpbmcgdG8gbGlua2VyLgotCi1Nb24gT2N0IDIwIDE0OjU0OjA2IDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IEZpeCBmb3IgZGVjIGMuCi0KLQkqIGNvbmZpZy1nYXMuY29tOiBHaXZlIGV4cGxhbmF0aW9uIGZvciBkZWMgYyBzZXR1cCBpbiBlcnJvcgotCW1lc3NhZ2UuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBNYWtlIC5jb21tIHN5bWJvbHMgc2VwYXJhdGUKLQlzZWN0aW9ucyBvbiBvcGVudm1zL2FscGhhLgotCi0JKiBjb25maWcvb2JqLWV2YXguYzogc3VwcG9ydCAud2VhayBwc2V1ZG8tb3AKLQotTW9uIE9jdCAyMCAxMDoxMzozMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoZGVmYXVsdF9hcmNoX3NpemUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShzdHJ1Y3Qgc3BhcmNfYXJjaCk6IFJlbmFtZSBhcmNoX3NpemUgdG8gZGVmYXVsdF9hcmNoX3NpemUuCi0JTmV3IG1lbWJlciB1c2VyX29wdGlvbl9wLgotCShzcGFyY19hcmNoX3RhYmxlKTogQWx3YXlzIGluY2x1ZGUgdjksIHY5YS4gIE5ldyBlbnRyeSB2OS02NC4KLQkoaW5pdF9kZWZhdWx0X2FyY2gpOiBDaGVjayB3aGV0aGVyIGRlZmF1bHQgYXJjaCBpcyB2YWxpZC4KLQlTZXQgZGVmYXVsdF9hcmNoX3NpemUgaW4gYWRkaXRpb24gdG8gc3BhcmNfYXJjaF9zaXplLgotCShPUFRJT05fMzIsT1BUSU9OXzY0KTogRGVmaW5lLgotCShtZF9sb25nb3B0cyk6IE5ldyBlbnRyaWVzIGZvciAtMzIsIC02NC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIHRoZW0uCi0JKG1kX3Nob3dfdXNhZ2UpOiBQcmludCB0aGVtLiAgRW5zdXJlIGluaXRfZGVmYXVsdF9hcmNoIGNhbGxlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmM2NCk6IFNldCBhcmNoIHRvIHY5LTY0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotU3VuIE9jdCAxOSAxMzo1MDo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jd3JpdGVfb2JqZWN0X2ZpbGUuCi0JKHdyaXRlX29iamVjdF9maWxlKTogU29tZSBjb2RlIG1vdmVzIGludG8gc3Vic2Vnc19maW5pc2guCi0JKiB3cml0ZS5jIChzdWJzZWdzX2ZpbmlzaCk6IERlY2xhcmUuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBzdWJzZWdzX2ZpbmlzaC4KLQotCSogcmVhZC5jIChzX2luY2x1ZGUpOiBDaGVjayBmb3IgZXJyb3IgcmV0dXJuIGZyb20KLQlkZW1hbmRfY29weV9zdHJpbmcuCi0KLVR1ZSBPY3QgMTQgMjA6NTA6NTggMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChnZXRfbGluZV9zYik6IEFjY2VwdCBhbnkgZW9sIG1hcmtlciB3aGlsZSBzY2FubmluZyBtYWNyb3MuCi0KLVR1ZSBPY3QgMTQgMTk6MTI6NDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9hcHBseV9maXgpOiBOb3RpY2UgZnhfcGNyZWwgYW5kIHN1YnN0aXR1dGUKLQl0aGUgY29ycmVjdCByZWxvY2F0aW9uIHdoZW4gaXQgZXhpc3RzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtcHBjLmg6IENvcnJlY3QgdHlwbyBpbiBjb21tZW50LgotCSogY29uZmlnL3RjLXY4NTAuaDogTGlrZXdpc2UuCi0KLUZyaSBPY3QgMTAgMTY6MDk6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IEFsbG93IHBhcmFsbGVsIGluc3RydWN0aW9uIGlzc3VlCi0gCXdoZW4gc2Vjb25kIGluc3RydWN0aW9uIGlzIHdyaXRpbmcgdG8gZmlyc3QgaW5zdHJ1Y3Rpb25zIGlucHV0cy4KLQkKLU1vbiBPY3QgMTMgMTU6Mjc6MTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoUEFHRV9TSVpFKTogRG91YmxlIHRvIDhrIGFzIGEgaGFjayB0byBhbGxvdyBzb21lIEMrKwotCXRlbXBsYXRlZCBwcm9ncmFtcyB0byBidWlsZCB3aXRoIC1nLgotCi1GcmkgT2N0IDEwIDE3OjQ4OjI5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3JlbGF4X3RhYmxlKTogQWRkIHN1cHBvcnQgZm9yIHJlbGF4aW5nCi0JdW5jb25kaXRpb25hbCBicmFuY2hlcy4gIFRoaXMgcGF0Y2ggaXMgY291cnRlc3kgb2YgSmltIFdpbHNvbi4gCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEZpeCByZWxheGluZyBvZiBicmFuY2hlcy4gIFRoaXMgcGF0Y2ggaXMKLQljb3VydGVzeSBvZiBKaW0gV2lsc29uLgotCShtZF9hc3NlbWJsZSk6IENyZWF0ZSBkaWZmZXJlbnQgZml4dXBzIGZvciBjb25kaXRpb25hbCBhbmQKLQl1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgVGhpcyBwYXRjaCBpcyBjb3VydGVzeSBvZiBKaW0gV2lsc29uLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEVzdGltYXRlIHNpemUgb2YgdmFyaWFibGUgcGFydCBvZgotCWZpeHVwIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgZm9yIGEgY29uZGl0aW9uYWwgb3IgYW4gdW5jb25kaXRpb25hbAotCWJyYW5jaC4gIFRoaXMgcGF0Y2ggaXMgY291cnRlc3kgb2YgSmltIFdpbHNvbi4KLQkodjg1MF9zZGF0YSwgdjg1MF90ZGF0YSwgdjg1MF96ZGF0YSwgdjg1MF9zYnNzLCB2ODUwX3Ric3MsCi0Jdjg1MF96YnNzLCB2ODUwX3Jvc2RhdGEsIHY4NTBfcm96ZGF0YSwgdjg1MF9ic3MpOiBBZGQgY2FsbCB0bwotCW9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpLiAKLQkodjg1MF9jb21tKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgbmV3IHBzZXVkbyBvcHMgLnpjb21tLCAuc2NvbW0gYW5kIC50Y29tbS4KLQkobWRfYmVnaW4pOiBBZGQgYnNzIGZsYWcgdG8gc2VnX2luZm8gb2YgYnNzIHNlY3Rpb25zLgotCi0JQWRkIHN1cHBvcnQgZm9yIC5zY29tbW9uLCAudGNvbW1vbiBhbmQgLnpjb21tb24gc2VjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogQWRkIC5zY29tbW9uLAotCS56Y29tbW9uLCAudGJzcywgLmNhbGxfdGFibGVfZGF0YSBhbmQgLmNhbGxfdGFibGVfdGV4dC4KLQotRnJpIE9jdCAxMCAxNTowMToxNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjKTogU2V0IERFRkFVTFRfQVJDSCBmcm9tIGNvcnJlY3QgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotRnJpIE9jdCAxMCAxMToyMjo0NSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4ZXMgdG8gbWFrZSBzdXJlIHRoZSBBVF9XT1JECi0JZXhwcmVzc2lvbiBpcyBub3QgY29uZnVzZWQgd2l0aCAtMS4KLQotRnJpIE9jdCAxMCAxMTo1NDo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogRmxhZyBTUCBhcyBtb2RpZmllZCBmb3IgQC1zcAotIAlvcGVyYW5kIC0gT1BFUkFORF9BVE1JTlVTLgotCi1GcmkgT2N0IDEwIDAwOjQ3OjQ0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IE5vdGUgdGhhdCBhdXRvIGluY3JlbWVudCBhbmQKLQlkZWNyZW1lbnQgbW9kaWZ5IHRoZSBpbmRleCByZWdpc3Rlci4KLQotVGh1IE9jdCAgOSAxNToxNzo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFJvYmluIEtpcmtoYW0gPFJvYmluLktpcmtoYW1AbWxiLmRtdC5jc2lyby5hdT46Ci0JKiBjb25maWcvdGMtbTY4ay5jIChhcmNocyk6IEFkZCA2ODMwNiwgNjgzMDcsIDY4MzIyLCA2ODM1NiwgNjgzMzQsCi0JNjgzMzYsIDY4MzQxLCA2ODM0OS4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1PcHRzKTogQWRkIC1tNjhlYzAwMCAtbTY4aGMwMDAgLW02OGhjMDAxCi0JLW02ODMwNiwgLW02ODMwNywgLW02ODMyMiwgLW02ODM1NiwgLW02OGVjMDIwLCAtbTY4ZWMwMzAsCi0JLW02OGVjMDQwLCAtbTY4ZWMwNjAsIC1tNjgzMzAsIC1tNjgzMzQsIC1tNjgzMzYsIC1tNjgzNDEsCi0JLW02ODM0OS4KLQotCSogZG9jL01ha2VmaWxlLmFtIChDUFVfRE9DUyk6IERlZmluZS4KLQkoYXMuaW5mbyk6IERlcGVuZCB1cG9uICQoQ1BVX0RPQ1MpLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBBTV9QUk9HX0lOU1RBTEw7IGl0J3MgY2FsbGVkIGJ5Ci0JQU1fSU5JVF9BVVRPTUFLRS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE9jdCAgOSAwMTo0NDozNiAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiB0Yy1kMTB2LmggKFRDX1NUQVJUX0xBQkVMKTogRG9uJ3QgZGVmaW5lLgotCSh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCi1UaHUgT2N0ICA5IDAwOjA3OjIzIDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBGaXggYnVnIHRoYXQgd291bGRuJ3QgYWxsb3cKLQl0byBwYWlyIGEgYnJhbmNoIGFuZCBsaW5rIHdpdGggYW55dGhpbmcgYnV0IGFuIGV4ZSBpbnN0cnVjdGlvbi4KLQotV2VkIE9jdCAgOCAxNjoyODo1MyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogRGlzYWJsZSB0aGUgc3ltK2NvbnN0IC5nb3QKLQlvcHRpbWl6YXRpb24gdG8gcmVkdWNlIHRoZSBhbGlnbm1lbnQgc3VycHJpc2VzIGZvciBnY2MuCi0KLVdlZCBPY3QgIDggMTY6MTE6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRDX1NQQVJDKTogRG9uJ3QgZGVmaW5lIFRBUkdFVF9GT1JNQVQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfdGFyZ2V0X2Zvcm1hdCk6IEhhbmRsZSBjb2ZmIGhlcmUuCi0JKHNwYXJjX2lwKTogQWRkICVoaXgsJWxveC4KLQkobWRfYXBwbHlfZml4Myk6IENhbGwgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgotCUFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfU1BBUkNfe0hJWDIyLExPWDEwfS4KLQkodGNfZ2VuX3JlbG9jKTogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19TUEFSQ197SElYMjIsTE9YMTB9LgotCi1XZWQgT2N0ICA4IDEyOjMzOjMyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGFscGhhLSotKiB0byBhbHBoYSotKi0qOyBjb25maWcuZ3Vlc3Mgbm93Ci0JcmVjb2duaXplcyBhbHBoYWV2NSBldGMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBPY3QgIDggMDA6MDQ6MDUgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogUmVwbGFjZSB0aGUgVEFSR0VUX0NQVSB2YWx1ZQotCW9mIG1pcHNyMzkwMCB3aXRoIG1pcHN0eDM5LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgcHJpbnQgdGhlICdvcGNvZGUgcmVxdWlyZXMgCi0JLW1pcHNYWCBtZXNzYWdlJyBpZiB0aGUgaW5zbiBpc24ndCBhbiBJU0EgaW5zbi4KLQotVHVlIE9jdCAgNyAxMjo0ODozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCBzdXBwb3J0KTogTW92ZWQgdG8gdGMtc3BhcmMuYy4KLQlSZWRlZmluZSBUQVJHRVRfRk9STUFUIHRvIGNhbGwgc3BhcmNfdGFyZ2V0X2Zvcm1hdC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChpbl91bnNpZ25lZF9yYW5nZSk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfYXJjaF9zaXplKTogTWFrZSBzdGF0aWMuCi0JKHNwYXJjX3RhcmdldF9mb3JtYXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogRGVsZXRlIHZhcmlhYmxlIGltbWVkaWF0ZV9tYXguICBSZXdyaXRlICVoaS9ldGMgcmVsb2MKLQloYW5kbGluZy4gIEFkZCBzdXBwb3J0IGZvciAlaGgsJWhtLCVsbSwlaDQ0LCVtNDQsJWw0NC4KLQkob3V0cHV0X2luc24pOiBTZXQgYGZ4X25vX292ZXJmbG93Jy4KLQkobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfezcsSDQ0LE00NCxMNDR9LgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotTW9uIE9jdCAgNiAxNDowNDo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3NlY3Rpb24pOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEVuaGFuY2UgZXJyb3IgbWVzc2FnZS4KLQotRnJpIE9jdCAgMyAxNTo0MDozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFVuZGVmIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTIGJlZm9yZQotCWluY2x1ZGluZyBvYmotZWxmLmggaW4gT0JKX01BWUJFX0VMRiBjYXNlLgotCShtaXBzX3RhcmdldF9mb3JtYXQpOiBSZXR1cm4gTlVMTCBhZnRlciBhYm9ydCB0byBhdm9pZCB3YXJuaW5nLgotCi0JKiBlY29mZi5jIChnZW5lcmF0ZV9lY29mZl9zdGFiKTogUmVtb3ZlIHVudXNlZCBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGV4cHIuYyAob3BlcmF0b3IpOiBBY2NlcHQgPT0uICBGcm9tIEFuZGVycyBCbG9tZGVsbAotCTxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+LgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IFdoZW4gZ2VuZXJhdGluZyBhIGRlbm9ybWFsCi0JbnVtYmVyLCBoYW5kbGUgYW4gb3ZlcmZsb3cgaW50byB0aGUgc21hbGxlc3Qgbm9ybWFsaXplZCBudW1iZXIuCi0KLU1vbiBTZXAgMjkgMTU6MjQ6NTIgMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBhcy5oLCBpbnB1dC1zY3J1Yi5jIChuZXdfbG9naWNhbF9saW5lKTogTmV3IHJldHVybiB2YWx1ZS4KLQkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IERvbid0IG5vdGUgdGhlIHNhbWUgZmlsZSBzZXZlcmFsIHRpbWVzCi0JaW4gYSByb3cuCi0KLVRodSBTZXAgMjUgMTM6MDg6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVtb3ZlIGAgb3BlcmFuZCBzcGVjaWZpZXIuCi0KLVdlZCBTZXAgMjQgMTY6NTQ6NDAgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKHNoKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2Ugc2gtKi1lbGYqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwIDI0IDExOjMwOjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEhhbmRsZSBxIGFuZCB2IG9wZXJhbmQgc3BlY2lmaWVycy4KLQotCSogZG9jL2MtaTM4Ni50ZXhpIChpMzg2LUZsb2F0KTogUmVtb3ZlIGluY29ycmVjdCBhc3NlcnRpb24gdGhhdAotCWZuKiBpbnN0cnVjdGlvbnMgZG8gbm90IGluc2VydCBpbXBsaWNpdCBmd2FpdC4gIFRoaXMgd2FzIGNoYW5nZWQKLQlKYW4gMjksIDE5OTYuCi0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKHl5bGV4KTogUGVybWl0IGFuIGV4cHJlc3Npb24gdG8gYmUgdXNlZCBmb3IKLQl0aGUgc2NhbGUgZmFjdG9yLgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfYXNfbmV3X1NPVVJDRVMpOiBTZXQgdG8gY29uZmlnL202OGstcGFyc2UueSwKLQlub3QgbTY4ay1wYXJzZS55LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAyMyAxNzo0ODowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IENsZWFyIG1yaV9zdGF0ZSBhdCBlbmQgb2YgLm1yaQotCXBzZXVkby1vcC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaGlsb19pbnRlcmxvY2tzKTogQ2hhbmdlIGZyb20gYSBzdGF0aWMKLQl2YXJpYWJsZSB0byBhIG1hY3JvLCBzbyB0aGF0IGl0IHZhcmllcyB3aXRoIHRoZSB2YXJpYWJsZXMgdXBvbgotCXdoaWNoIGl0IGRlcGVuZHMuCi0JKGdwcl9pbnRlcmxvY2tzLCBjb3BfaW50ZXJsb2Nrcyk6IExpa2V3aXNlLgotCShtZF9iZWdpbik6IERvbid0IGluaXRpYWxpemUgdGhlbS4KLQotRnJpIFNlcCAxOSAxNzowODo0MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVXNlIHN0cmNhc2Vjb21wIGluc3RlYWQKLQlvZiBzdHJjbXAgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLVRodSBTZXAgMTggMTQ6MTE6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3BlIHdpdGggYSB6ZXJvIGRhdGEgYXJlYQotCXJlbG9jYXRpb24gd2l0aCBhIGNvbnN0YW50IG9mZnNldC4KLQkobWRfYXNzZW1ibGUpOiBQcm9kdWNlIGVycm9yIG1lc3NhZ2Ugd2hlbiBzcGVjaWFsIGRhdGEgYXJlYQotCXJlbG9jYXRpb25zIGFyZSB1c2VkIG9uIGluc3RydWN0aW9ucyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGVtLgotCShtZF9hc3NlbWJsZSk6IFJlc2V0IHByb2Nlc3NvciBtYXNrIGlmIGRlZmluZWQgYnkgY29tbWFuZCBsaW5lCi0Jc3dpdGNoLiAKLQotVGh1IFNlcCAxOCAxMToyNDowMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYzogUmVvcmdhbml6ZSBmaWxlLgotCShwYXJzZV9rZXl3b3JkX2FyZyk6IEFsbG93IG51bWJlcnMgaW4gcmVnIG5hbWVzLgotCShTUEVDSUFMX0NBU0VfTk9ORSk6IE5ldyBtYWNyby4KLQkobWRfYXNzZW1ibGUpOiBVc2UgaXQuCi0JKGxvb2t1cF9hcmNoLGluaXRfZGVmYXVsdF9hcmNoKTogTmV3IGZ1bmN0aW9ucy4KLQkoZGVmYXVsdF9hcmNoLGRlZmF1bHRfaW5pdF9wLHNwYXJjX2FyY2hfdGFibGUpOiBOZXcgc3RhdGljIGxvY2Fscy4KLQkoc3BhcmNfYXJjaF9zaXplKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkobWF4X2FyY2hpdGVjdHVyZSk6IEluaXRpYWxpemUgaW4gaW5pdF9kZWZhdWx0X2FyY2guCi0JKG1kX3BhcnNlX29wdGlvbnMpOiBDYWxsIGluaXRfZGVmYXVsdF9hcmNoIGlmIG5lY2Vzc2FyeS4KLQlSZXdyaXRlIC14YXJjaC8tQSBwcm9jZXNzaW5nLgotCShtZF9zaG93X3VzYWdlKTogUHJpbnQgLUEgdmFsdWVzIGZyb20gc3BhcmNfYXJjaF90YWJsZS4KLQkobWRfYmVnaW4pOiBDYWxsIGluaXRfZGVmYXVsdF9hcmNoIGlmIG5lY2Vzc2FyeS4KLQkoc3BhcmNfbWRfZW5kKTogSGFuZGxlIGJvdGggMzIgYW5kIDY0IGJpdCBlbnZpcm9ubWVudHMuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IExpa2V3aXNlLgotCSogYWNjb25maWcuaCAoU1BBUkNfVjksU1BBUkNfQVJDSDY0KTogRGVsZXRlLgotCShERUZBVUxUX0FSQ0gpOiBBZGQuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjKTogRGVmYXVsdCBERUZBVUxUX0FSQ0ggYmFzZWQgb24gdGFyZ2V0IGNwdS4KLQkoU1BBUkNfVjksU1BBUkNfQVJDSDY0KTogRGVsZXRlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY29uZmlnL3Ztcy1jb25mLmggKFNQQVJDX1Y5LFNQQVJDX0FSQ0g2NCk6IERlbGV0ZS4KLQotV2VkIFNlcCAxNyAxNjo1NDoyMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IFJlY29kZWQgdG8gdXNlIENIRUNLXyAoKQotCW1hY3JvLiAKLQkoaGFuZGxlX3RkYW9mZiwgaGFuZGxlX3pkYW9mZiwgaGFuZGxlX3NkYW9mZik6IE5ldyBmdW5jdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdGVkIHR5cG8uCi0JKiBjb25maWcvdGMtdjg1MC5jIEFkZCBuZXcgc2VjdGlvbnM6IGNhbGxfdGFibGVfZGF0YSBhbmQKLQljYWxsX3RhYmxlX3RleHQuCi0JKHY4NTBfcmVsb2NfcHJlZml4KTogQWRkIHN1cHBvcnQgZm9yIGN0b2ZmKCkgcmVsb2NhdGlvbiBwcmVmaXguIAotCShoYW5kbGVfY3RvZmYpOiBOZXcgRnVuY3Rpb24uCi0KLQkqIGRvYy9jLXY4NTAudGV4aSAoVjg1MCBPcGNvZGVzKTogRG9jdW1lbnQgY2FsbCB0YWJsZSByZWxvY2F0aW9ucy4KLQotVHVlIFNlcCAxNiAxNDoxODoyMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IEFkZCBzdXBwb3J0IGZvciBhIDE2IGJpdAotCWRpc3BsYWNlbWVudCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotCi1Nb24gU2VwIDE1IDIxOjI4OjA5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogTWFrZSBkZWNsYXJhdGlvbiBtYXRjaAotCWRlZmluaXRpb24uCi0KLU1vbiBTZXAgMTUgMTg6MzM6MDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAocHJvY2Vzc29yX21hc2spOiBOZXcgdmFyaWFibGUuCi0JKHNldF9tYWNoaW5lLCBtZF9wYXJzZV9vcHRpb24pOiBTZXQgcHJvY2Vzc29yX21hc2suCi0JKG1kX2Fzc2VtYmxlKTogQ2hlY2sgdGhhdCBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgdG8gdGFyZ2V0Ci0JcHJvY2Vzc29yLiAKLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVEFSR0VUX1BST0NFU1NPUik6IE5ldyBjb25zdGFudC4KLQotTW9uIFNlcCAxNSAxMToyODowNCAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHdvcmsgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEZvciBtdmZzeXMgYW5kIG12dHN5cywKLQlDUiBpcyAwIGZvciBQU1dMIGFuZCBQU1dILgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IERvbid0IGFjY2VwdAotCWlsbGVnYWwgY29uZGl0aW9uIGNvZGVzIGZvciBjbXB1IGluc3RydWN0aW9uLgotCi0JKiBjb25maWcvdGMtZDMwdi5jOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTAotCXVzZWQgaW4gZCppIGluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoY2hlY2tfc2l6ZSk6IE5ldyBmdW5jdGlvbi4gIENoZWNrCi0JcmVsb2NhdGlvbnMgZm9yIG92ZXJmbG93cy4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogRml4IHJlbG9jYXRpb25zIGJldHdlZW4gc2VjdGlvbnMuCi0JKG1kX2FwcGx5X2ZpeDMpOiBVc2UgbmV3IHJlbG9jYXRpb24gdHlwZXMgZm9yIDE1IGFuZCAyMQotCWJpdCByZWxvY2F0aW9ucyBpbiB0aGUgcmlnaHQgY29udGFpbmVyLiBOZWVkZWQgYmVjYXVzZQotCXRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgZWlnaHQtYnl0ZSBhbGlnbmVkCi0JYnV0IHRoZSByZWxvY2F0aW9ucyBtdXN0IGJlLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogQ2hlY2sgZm9yIG92ZXJmbG93LgotCShmaW5kX2Zvcm1hdCk6IElmICIucyIgb3IgIi5sIiBhcmUgdXNlZCwgZG9uJ3QgdHJ5Ci0JdG8gY29tcHV0ZSBicmFuY2ggc2l6ZXMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQ2hlY2sgZm9yICIucyIgb3IKLQkiLmwiIGV4dGVuc2lvbnMgdG8gb3Bjb2RlIG5hbWVzLgotCShmaW5kX2Zvcm1hdCk6IEdlbmVyYXRlIHRoZSBjb3JyZWN0IGluc3RydWN0aW9ucyB3aGVuCi0JIi5zIiBvciAiLmwiIGFyZSB1c2VkLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogQ2hlY2sgZm9yIG9kZCByZWdpc3RlcnMKLQlvbiBpbnN0cnVjdGlvbnMgdGhhdCByZXF1aXJlIGV2ZW4gcmVnaXN0ZXJzLgotCi0JKiBjb25maWcvdGMtZDMwdi5oIChtZF9zdGFydF9saW5lX2hvb2spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9zdGFydF9saW5lX2hvb2spOiBOZXcgaG9vay4KLQlDaGVja3MgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgZm9yIGEgIi4iLiAgSWYgaXQKLQlmaW5kcyBvbmUsIGFzc3VtZSBhIHBzZXVkby1vcCBhbmQgZmx1c2ggYW55IHVud3JpdHRlbgotCWluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IEZpeCBwcm9ibGVtCi0Jd2l0aCBkZXRlcm1pbmluZyB3aGVuIGZpeHVwcyB3ZXJlIGRvbmUuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBGaXggYnVnIHdoZXJlIHRoZSBudW1lcmljCi0JcGFydCBvZiBhIHN5bWJvbCAoZm9yIGV4YW1wbGUsICJmb28rOCIpIHdhcyBiZWluZyB3cml0dGVuCi0JaW50byB0aGUgaW5zdHJ1Y3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSAud29yZCB0byBiZSAzMiBiaXRzIGFuZCBhZGQKLQkuaHdvcmQgYXMgMTYgYml0cy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBDaGVjayB0byBzZWUgaWYgZmlyc3QKLQlpbnN0cnVjdGlvbiBpcyBhIGp1bXAuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogTWFqb3IgY29kZSByZW9yZ2FuaXphdGlvbi4KLQotV2VkIFNlcCAxMCAxMDowNzowOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3RlZCBzcGVsbGluZyBtaXN0YWtlLgotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHY4NTAgZW11bGF0aW9uLgotCi1UdWUgU2VwICA5IDE3OjE0OjMzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDUFVfVFlQRVMpOiBBZGQgYXJjLgotCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCB0Yy1hcmMuYy4KLQkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgdGMtYXJjLmguCi0JKGRlcGVuZGVuY2llcyk6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGFyYy0qLWVsZiouCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnL3RjLWFyYy5bY2hdOiBOZXcgZmlsZXMuCi0KLVR1ZSBTZXAgIDkgMTA6MTk6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBEb2N1bWVudCBoaTAoKSByZWxvYyBwcmVmaXguCi0JQ29ycmVjdCBkZXNjcmlwdGlvbiBvZiBoaSgpIHJlbG9jIHByZWZpeC4KLQotCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBEb2N1bWVudCBuZXcgcmVsb2MgcHJlZml4LgotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBBZGQgaGlsbygpIHJlbG9jIHByZWZpeC4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ18zMi4KLQotCSogZG9jL2Mtdjg1MC50ZXhpOiBEb2N1bWVudCBuZXcgcHNldWRvIG9wcyBhbmQgY29tbWFuZCBsaW5lCi0Jb3B0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAoc2V0X21hY2hpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtdjg1MC5jICgudjg1MCk6IE5ldyBwc2V1ZG8gb3AuCi0JKiBjb25maWcvdGMtdjg1MC5jICgudjg1MGUpOiBOZXcgcHNldWRvIG9wLgotCSogY29uZmlnL3RjLXY4NTAuYyAoLnY4NTBlYSk6IE5ldyBwc2V1ZG8gb3AuCi0JCi0KLU1vbiBTZXAgIDggMjM6MDg6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU3VwcG9ydCAtYWxoIGFuZCAtYWxkIGZvciBEV0FSRiAxOgotCSogbGlzdGluZy5jIChzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCk6IEFkZCBkZWJ1Z2dpbmcgZmllbGQuCi0JKGxpc3RpbmdfbmV3bGluZSk6IEluaXRpYWxpemUgdGhlIGRlYnVnZ2luZyBmaWVsZC4gIElmIEVMRiwgaWYgdGhlCi0Jc2VjdGlvbiBzdGFydHMgd2l0aCAuZGVidWcgb3IgLmxpbmUsIHNldCB0aGUgZGVidWdnaW5nIGZpZWxkIGluCi0JdGhlIGxpc3Rpbmcgc3RydWN0dXJlLgotCShkZWJ1Z2dpbmdfcHNldWRvKTogQWRkIGxpc3QgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYKLQl0aGUgZGVidWdnaW5nIGZpZWxkIGlzIHNldCwgY29uc2lkZXIgaXQgdG8gYmUgYSBkZWJ1Z2dpbmcgcHNldWRvLgotCUlmIEVMRiwgc2tpcCBibGFuayBsaW5lcyBiZXR3ZWVuIGRlYnVnZ2luZyBsaW5lcy4KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogSWYgRUxGLCBsb29rIGZvciBsaW5lIG51bWJlcnMuCi0JKHN0cmluZ2VyKTogSWYgRUxGLCBsb29rIGZvciBmaWxlIG5hbWVzLgotCi1Nb24gU2VwICA4IDEyOjMzOjQwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBPbmx5IHRlc3QgZm9yIG92ZXJmbG93Ci0JaWYgdGhlcmUgaXMgbm8gaW5zZXJ0IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChUQVJHRVRfTUFDSElORSk6IE5ldyBjb25zdGFudC4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IEFkZAotCS1td2Fybl91bnNpZ25lZF9vdmVyZmxvdy4gCi0JKG1kX2JlZ2luKTogU2V0IEJGRCBtYWNoaW5lIG51bWJlciBiYXNlZCBvbiBtYWNoaW5lIHZhcmlhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgLW12ODUwLCAtbXY4NTBlIGFuZCAtbXY4NTBlYSBvcHRpb25zLgotCi1Nb24gU2VwICA4IDExOjIwOjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaDogRG9uJ3QgZGVjbGFyZSBhbGxvY2EgaWYgaXQgaXMgYSBtYWNyby4KLQkqIG1hY3JvLmM6IExpa2V3aXNlLgotCi1TdW4gU2VwICA3IDAwOjMwOjE5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtYWxwaGEuYyAobWRfcGFyc2Vfb3B0aW9uKTogTW92ZSBtW10gb3V0IHRvIHRvcCBsZXZlbCBhbmQKLSAgICAgICAgcmVuYW1lIHRvIGNwdV90eXBlc1tdLgotICAgICAgICAoc19hbHBoYV9hcmNoKTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAobWRfcHNldWRvX3RhYmxlKTogQWRkICJhcmNoIi4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9iZWdpbik6IE1lcmdlIHRoZSB0d28gbG9vcHMgdGhyb3VnaCB0aGUKLSAgICAgICAgb3Bjb2RlIHRhYmxlLgotICAgICAgICAoc19hbHBoYV9wcm9jKTogQWRkIGluaXRpYWwgU0tJUF9XSElURVNQQUNFLgotICAgICAgICAoc19hbHBoYV9zZXQpOiBMaWtld2lzZS4gIFVzZSBnZXRfc3ltYm9sX2VuZCBpbnN0ZWFkIGxvY2FsIHdoaWxlIGxvb3AuCi0KLVNhdCBTZXAgIDYgMTk6Mzg6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoc19sY29tbV9ieXRlcyk6IEFkZCBwcm90b3R5cGUgKGZvciByZWFsIHRoaXMgdGltZSkuCi0KLVRodSBTZXAgIDQgMTI6MTA6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBPbmx5IHNldCBCU0ZfT0JKRUNUIGZvcgotCXN5bWJvbHMgb24gSXJpeC4KLQotV2VkIFNlcCAgMyAxMToyMTozMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBSZW1vdmUgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwuCi0KLVR1ZSBTZXAgIDIgMTg6MzI6MzAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfY29udmVydF9mcmFnKTogUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIGFyZXgKLQlyZWxhdGl2ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgbm90IHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFNpbWlsYXJseS4KLQotVHVlIFNlcCAgMiAxNTo1ODo1MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGk6IEV4cGxhbmF0aW9ucyBvZiBvZmZzZXRzIGluIFNEQS9aREEgYXJlYXMKLQljb3JyZWNldGQuIAotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBBZGQgc3VwcG9ydCBmb3IgU0RBL1REQS9aREEgc2VjdGlvbnMuCi0JKHY4NTBfcmVsb2NfcHJlZml4KTogRHVwbGljYXRlIGNvZGUgZWxpbWluYXRlZC4gIEFkZCBjb2RlIHRvCi0JcmVjb2duaXNlIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zLgotCShtZF9hc3NlbWJsZSk6IENhbGN1bGF0aW9uIG9mIHRoZSBzaXplIG9mIGEgZml4dXBzIGNvcnJlY3RlZC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBBZGQgU0RBL1REQS9aREEKLQlzZWN0aW9ucy4gCQotCi1UdWUgU2VwICAyIDE1OjQwOjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBVc2Ugb3Bjb2RlLT5uYW1lIGluc3RlYWQgb2YKLSAJb3Bjb2RlLT5vcGNvZGUgYXMgdGhlIHNlbnRpbmFsLiBaZXJvIGlzIGEgdmFsaWQgb3Bjb2RlLgotCi1UdWUgQXVnIDI2IDE2OjUxOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKE1hY2hpbmUgRGVwZW5kZW5jaWVzKTogQWRkIHY4NTAgdG8gbWVudS4KLQkqIGRvYy9jLXY4NTAudGV4aTogQ2hhbmdlIG5vZGUgbmFtZSB0byBtYXRjaCBvdGhlciBjaGFwdGVyIG5vZGVzLgotCi1UdWUgQXVnIDI2IDA5OjQ2OjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLXY4NTAudGV4aSAoVjg1MCBPcGNvZGVzKTogQ29ycmVjdCBuYW1lIGZvciB0aW55IGRhdGEgYXJlYQotCXBvaW50ZXIuIAotCi1UdWUgQXVnIDI2IDEyOjIzOjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogSWYgQkZENjQsIGRvbid0IG1ha2UgYSBiaWdudW0gaWYgdGhlCi0JbnVtYmVyIHdpbGwgZml0IGluIDY0IGJpdHMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBDaGVjayBleHBsaWNpdGx5IGZvciBPX2JpZywKLQlyYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgotCi0JKiBhcy5oOiBEb24ndCBkZWZpbmUgYWxsb2NhIGlmIF9fR05VQ19fLiAgSnVzdCBkZWNsYXJlIGl0LgotCSogbWFjcm8uYzogQ29weSBhbGxvY2EgaGFuZGxpbmcgZnJvbSBhcy5oLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBDb3JyZWN0IDE2IGJpdCBub29wcy4gIEZyb20KLQlHYWJyaWVsIFBhdWJlcnQgPHBhdWJlcnRAaXJhbS5lcz4uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSW4gSnVtcEJ5dGUgY2FzZSwgd2hlbiBsb29raW5nCi0JZm9yIGEgV09SRF9QUkVGSVhfT1BDT0RFLCBjaGFuZ2UgaXQgdG8gQUREUl9QUkVGSVhfT1BDT0RFIGlmIHRoaXMKLQlpcyBqY3h6IG9yIGEgbG9vcCBpbnN0cnVjdGlvbi4KLQotTW9uIEF1ZyAyNSAxNjowNDoxNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGQgJ2hwJyBhcyBhbGlhcyBmb3IKLQlyMi4KLQkobWRfYmVnaW4pOiBTZXQgdXAgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIHR5cGUuCi0KLU1vbiBBdWcgMjUgMTQ6MjU6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogU3RvcmUgdGhlIHZhbHVlIGJhY2sgaW50byB0aGUKLQlzeW1ib2wgZXhwcmVzc2lvbiwgdG8gaGFuZGxlIGFkZCBvciBzdWJ0cmFjdCBzaW1wbGlmaWNhdGlvbgotCWNvcnJlY3RseS4gIEhhbmRsZSBPX3N5bWJvbF9ydmEuICBBZGQgZGVmYXVsdCBjYXNlLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19jaGFuZ2VfY3NlY3QpOiBUZW1wb3JhcmlseSBsb3dlciB0aGUKLQljaHVua3NpemUgd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBzdWJzZWN0aW9uLgotCSogYXMuYyAoY2h1bmtzaXplKTogSW5pdGlhbGl6ZSB0byB6ZXJvLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBDaGFuZ2UgNTAwMCB0byBjaHVua3NpemUgd2hlbgotCWNhbGxpbmcgb2JzdGFja19iZWdpbi4KLQotTW9uIEF1ZyAyNSAxMToyMTo0OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFJlc3RvcmUgaW5wdXRfbGluZV9wb2ludGVyIHVwb24KLQlleGl0LiAKLQkKLQkqIGNvbmZpZy90Yy12ODUwLmMgKHBhcnNlX3JlZ2lzdGVyX2xpc3QpOiBTdXBwb3J0IGNvbnN0YW50Ci0JZXhwcmVzc2lvbnMgYXMgcmVnaXN0ZXIgbGlzdHMuCi0KLU1vbiBBdWcgMjUgMTA6MTk6MzQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2Mtdjg1MC50ZXhpOiBDaGFuZ2UgdGhlIG1ham9yIG5vZGUgdG8gdjg1MCBNYWNoaW5lCi0JRGVwZW5kZW5jaWVzLiAKLQotRnJpIEF1ZyAyMiAxMToxNjoxNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIGluY2x1c2lvbiBvZiBjLXY4NTAudGV4aQotCi0JKiBkb2MvYy12ODUwLnRleGk6IE5ldyBmaWxlLgotCi0JKiByZWFkLmMgKGlzX2VuZF9vZl9saW5lKTogTWFrZSBOVUwgY2hhcmFjdGVyIGJlIGNvbnNpZGVyZWQgdG8gYmUKLQlhIGxpbmUgdGVybWluYXRvci4KLQotRnJpIEF1ZyAyMiAxMDo0NTozMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChwYXJzZV9yZWdpc3Rlcl9saXN0KTogQWRkIHN1cHBvcnQgZm9yIGN1cmx5Ci0JYnJhY2Ugc3ludGF4LgotCShjY19uYW1lcyk6IEFkZCAiZSIgYW5kICJuZSIgY29uZGl0aW9ucy4KLQotVGh1IEF1ZyAyMSAxMTowMDozNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBTdXBwb3J0IGEgZG91YmxlIGRhc2ggYXMgc3RhcnRpbmcgYQotCWNvbW1lbnQgdGhhdCBleHRlbmRzIHRvIGVuZCBvZiBsaW5lLgotCi1UaHUgQXVnIDIxIDEwOjU0OjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfc2VjdGlvbiwgdjg1MF9ic3MsIHY4NTBfb2Zmc2V0KTogTmV3Ci0JZnVuY3Rpb25zLgotCShtZF9wc2V1ZG9fdGFibGUpOiBOZXcgcHNldWRvIG9wczogLmJzcywgLm9mZnNldCwgLnNlY3Rpb24KLQotVGh1IEF1ZyAyMSAwMDo1OTo1MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVwZGF0ZSByZWNvcmRlZAotCWluc24gd2hlbiBjaGFuZ2luZyB0byBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbi4KLQotV2VkIEF1ZyAyMCAwMDo0NToyMCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHRjLXNoLmMgKHBhcnNlX3JlZywgZ2V0X3NwZWNpZmljLCBidWlsZF9NeXRlcyk6IEFkZCBTSDQKLQlmbG9hdGluZyBwb2ludCBleHRlbnNpb25zLgotCShwYXJzZV9yZWcpOiBwYXJzZSBzZ3IgYW5kIGRici4KLQotVHVlIEF1ZyAxOSAxNzowNzozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChzeXN0ZW1fcmVnaXN0ZXJfbmFtZSk6IFN1cHBvcnQgbnVtYmVycyBmb3IKLQlzeXN0ZW0gcmVnaXN0ZXIgSURzLgotCi1UdWUgQXVnIDE5IDA4OjU5OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbGNvbW1faW50ZXJuYWwpOiBSZW5hbWVkIGZyb20gc19sY29tbSwgYWRkZWQgYXJnIHRvCi0JZmxhZyB3aGVuIGFsaWdubWVudCBpcyBpbiBieXRlcyBpbnN0ZWFkIG9mIHBvd2VyIG9mIDIsIGFuZCBjb2RlIHRvCi0JdXNlIHRoYXQgZmxhZyB0byBjb252ZXJ0IGFsaWdubWVudCB0byBieXRlcy4KLQkoc19sY29tbSwgc19sY29tbV9ieXRlcyk6ICBOZXcgaGVscGVycyB0aGF0IGNhbGwgc19sY29tbV9pbnRlcm5hbC4KLQkqIHJlYWQuaCAoc19sY29tbV9ieXRlcyk6IEFkZCBwcm90b3R5cGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBBTElHTk1FTlRfSU5fU19GTEFHUyBpcwotCWRlZmluZWQsIHdyaXRlIGFsaWdubWVudCB0byBhbGlnbm1lbnQgYml0cyBpbiBzZWN0aW9uIGhlYWRlciBzX2ZsYWdzCi0JcmF0aGVyIHRoYW4gdGhlIHNfYWxpZ24gZmllbGQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoQUxJR05NRU5UX0lOX1NfRkxBR1MpOiBEZWZpbmUgZm9yIFRDX1RJQzgwLgotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX3BzZXVkb190YWJsZSk6IFVzZSBzX2xjb21tX2J5dGVzIGZvciBic3MKLQlwc2V1ZG8sIGluc3RlYWQgb2Ygc19sY29tbSB3aGljaCB3YW50cyBhIHBvd2VyIG9mIHR3byBmb3IgYWxpZ25tZW50LgotCi1Nb24gQXVnIDE4IDIwOjQyOjIzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKGNoZWNrX21hY3JvKTogdXNlIGFsbG9jYSBpbnN0ZWFkIG9mIHhtYWxsb2MgdG8gcGx1ZyBsZWFrLgotCi1Nb24gQXVnIDE4IDIwOjMzOjA2IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBBZGQgLWFtLgotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfaW5jbHVkZV9zYik6IERvbid0IGFkZCBsZWFkaW5nIFxuCi0JaWYgd2UndmUgYWxyZWFkeSBnb3Qgb25lLgotCSogbGlzdGluZy5jIChzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCk6IEFkZCBsaW5lX2NvbnRlbnRzLgotCShsaXN0aW5nX25ld2xpbmUpOiBQdXQgdW51c2VkIGFyZ3VtZW50IHRvIHdvcms6IGlmIG5vbi1udWxsLCBzYXZlIGl0Li4uCi0JKGxpc3RpbmdfbGlzdGluZyk6IC4uLiBhbmQgcmVndXJnaXRhdGUgZHVyaW5nIGxpc3RpbmcgaW5zdGVhZCBvZiBsaW5lCi0JZnJvbSBmaWxlLgotCSogbGlzdGluZy5oIChMSVNUSU5HX01BQ0VYUCk6IE5ldyBkZWZpbmUuCi0JKExJU1RJTkdfTkVXTElORSk6IEFyZ3VtZW50IGlzIE5VTEwuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IElmIGV4cGFuZGluZyBtYWNyb3MsIGJyZWFrIHVwIGlucHV0Ci0JbGluZXMgYW5kIHBhc3MgdGhlbSB0byBsaXN0aW5nX25ld2xpbmUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLWFjIGFuZCAtYW0uCi0KLQkqIGNvbmQuYyAoc19pZmMpOiBBZGQgbWlzc2luZyBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLgotCi1Nb24gQXVnIDE4IDExOjI2OjM2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgc3VwcG9ydCBmb3IgbmV3IDE2IGJpdCBQQwotCXJlbGF0aXZlIHJlbG9jLgotCi1Nb24gQXVnIDE4IDExOjI0OjIxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBzdXBwb3J0X3Y4NTBlIGZsYWcgYW5kIGNvbW1hbmQgbGluZQotCW9wdGlvbi4gCi0JCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0Ci0KLQkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQKLQotTW9uIEF1ZyAxOCAxMToyNDoyMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBSZW1vdmUgc3VwcG9ydF92ODUwZWEgZmxhZyBhbmQgY29tbWFuZCBsaW5lCi0Jb3B0aW9uLiAKLQkKLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0Ci0KLQkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0Ci0KLUZyaSBBdWcgMTUgMTQ6MDA6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IERvbid0IGNkIGludG8gdGVzdHN1aXRlIHVudGlsIGFmdGVyCi0Jc2V0dGluZyBFWFBFQ1QgYW5kIFRDTF9MSUJSQVJZLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGFzLmggKGVudW0gZGVidWdfaW5mb190eXBlKTogRGVmaW5lLgotCShkZWJ1Z190eXBlKTogRGVjbGFyZS4KLQkqIGFzLmMgKGRlYnVnX3R5cGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShzaG93X3VzYWdlKTogQWRkIC0tZ3N0YWJzLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIC0tZ3N0YWJzLgotCSogcmVhZC5jIChnZW5lcmF0ZV9hc21fbGluZW5vKTogUmVtb3ZlLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBPdXRwdXQgc3RhYnMgZGVidWdnaW5nIGlmIGFwcHJvcHJpYXRlLgotCUNoYW5nZSBjaGVja3Mgb2YgZ2VuZXJhdGVfYXNtX2xpbmVubyB0byBjaGVjayBkZWJ1Z190eXBlLiAgT25seQotCWdlbmVyYXRlIEVDT0ZGIGRlYnVnZ2luZyBpZiBFQ09GRl9ERUJVR0dJTkcgaXMgZGVmaW5lZC4KLQkqIHJlYWQuaCAoZ2VuZXJhdGVfYXNtX2xpbmVubyk6IERvbid0IGRlY2xhcmUuCi0JKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBEZWNsYXJlLgotCSogc3RhYnMuYyAoc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmMgKGFkZF9maWxlKTogVXNlIGRlYnVnX3R5cGUsIG5vdCBnZW5lcmF0ZV9hc21fbGluZW5vLgotCURvbid0IHR1cm4gb2ZmIGRlYnVnZ2luZy4KLQkoYWRkX2ZpbGUpOiBSZW1vdmUgb2xkICNpZiAwIGNvZGUuCi0JKGVjb2ZmX25ld19maWxlKTogU2V0IGRlYnVnX3R5cGUsIG5vdCBnZW5lcmF0ZV9hc21fbGluZW5vLgotCShlY29mZl9kaXJlY3RpdmVfZW5kKTogRG9uJ3QgZ2VuZXJhdGUgc3RhYnMgbGluZSBzeW1ib2xzLgotCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogRG9uJ3QgY2hlY2sgc3RhYnNfc2Vlbi4gIERvbid0IHNldAotCWdlbmVyYXRlX2FzbV9saW5lbm8uCi0JKGxpbmVfbGFiZWxfY250KTogUmVtb3ZlLgotCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogUmVtb3ZlLgotCSogZWNvZmYuaCAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYik6IERvbid0IGRlY2xhcmUuCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLjE6IERvY3VtZW50IC0tZ3N0YWJzLgotCi1XZWQgQXVnIDEzIDE4OjU4OjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlLCBtZF9zaG93X3VzYWdlLCBtZF9wYXJzZV9vcHRpb24pOgotCUFkZCBzdXBwb3J0IGZvciB2ODUwZWEgaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSwgbWRfc2hvd191c2FnZSwgbWRfcGFyc2Vfb3B0aW9uKToKLQlBZGQgc3VwcG9ydCBmb3Igdjg1MGUgaW5zdHJ1Y3Rpb25zLgotCQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBGaXggZXJyb3IgcmVjb3ZlcnkgdG8gcmVsb2FkCi0JdGV4dCBvZiBlbnRpcmUgb3Bjb2RlLiAKLQotVHVlIEF1ZyAxMiAxMDoyNzozNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IERvY3VtZW50IHJzX2xlYjEyOC4KLQotVHVlIEF1ZyAxMiAxMjoxNzowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIFNJWkVfQllURQotCWluIEFCU0wgY2FzZSwgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KLQotTW9uIEF1ZyAxMSAyMTo0ODowMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5oIChlbnVtIF9yZWxheF9zdGF0ZSk6IEFkZCByc19sZWIxMjguCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgc2xlYjEyOCBhbmQgdWxlYjEyOC4KLQkoc2l6ZW9mXypsZWIxMjgsIG91dHB1dF8qbGViMTI4LCBlbWl0X2xlYjEyOF9leHByLCBzX2xlYjEyOCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkqIHJlYWQuaDogVXBkYXRlIHByb3RvdHlwZXMuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogU3RyZWFtbGluZSBxdWl0ZSBhIGJpdC4gIFJldHVybgotCXRoZSBzeW1ib2wgdmFsdWUsIGFkZCBhIHNlY29uZCBGSU5BTElaRSBhcmd1bWVudCB0aGF0IHByZXZlbnRzIAotCWNoYW5nZXMgZnJvbSBiZWluZyBjb21pdHRlZC4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwsIHJlbGF4X3NlZ21lbnQpOiBIYW5kbGUgcnNfbGViMTI4LgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IHRoZSBuZXcgcHNldWRvcy4KLQotU3VuIEF1ZyAxMCAxNDo1MTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogQWRkIHNpdGUuYmFrLCBzaXRlLmV4cCwgc3RhZ2UsCi0Jc3RhZ2UxLCBhbmQgc3RhZ2UyLgotCShESVNUQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIGRvYy9NYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgQXVnICA2IDAwOjMwOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gaWYgZW5kaWFuIGlzIHNldC4KLQlEb24ndCBzZXQgdGFyZyBvciBnYXNfdGFyZ2V0LiAgRGVmaW5lIFNDT19FTEYgYW5kCi0JVEFSR0VUX1NPTEFSSVNfQ09NTUVOVCB3aGVuIGFwcHJvcHJpYXRlLiAgRG9uJ3Qgc3Vic3RpdHV0ZSBmb3IKLQl0YXJnZXRfZnJhZy4KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgQHRhcmdldF9mcmFnQC4KLQkoSU5DTFVERVMpOiBSZW1vdmUgJChJTlRFUk5BTF9DRkxBR1MpLCAkKENST1NTKSwgJChIREVGSU5FUyksIGFuZAotCSQoVERFRklORVMpLgotCShkZXAtYW0pOiBNYXJrIGFzIHBob255LgotCSogYWNjb25maWcuaDogQWRkIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCBUQVJHRVRfU09MQVJJU19DT01NRU5ULAotCWFuZCBTQ09fRUxGLgotCSogY29uZmlnL2FybS1iaWcubXQsIGNvbmZpZy9hcm0tbGl0Lm10OiBSZW1vdmUuCi0JKiBjb25maWcvbWlwcy1iaWcubXQsIGNvbmZpZy9taXBzLWxpdC5tdDogUmVtb3ZlLgotCSogY29uZmlnL3BwYy1iaWcubXQsIGNvbmZpZy9wcGMtbGl0Lm10OiBSZW1vdmUuCi0JKiBjb25maWcvcHBjLXNvbC5tdDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZjb2ZmLm10LCBjb25maWcvbTY4a2NvZmYubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9tODhrY29mZi5tdDogUmVtb3ZlLgotCSogY29uZmlnL3NjbzUubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKCQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oKTogTmV3IHRhcmdldCwgdG8KLQlmdXJ0aGVyIHRyeSB0byBjaXJjdW12ZW50IHRoZSAueS5oIHJ1bGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEF1ZyAgNSAxMjozMjowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZSwgZnJvbSBvbGQgYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9JTklUX0FVVE9NQUtFIGFuZCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUKLQlzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UKLQlBQ19DT05GSUdfSEVBREVSIHdpdGggQU1fQ09ORklHX0hFQURFUi4gIENhbGwgQUNfUFJPR19ZQUNDLAotCUFDX1BST0dfTEVYLCBhbmQgQUNfREVDTF9ZWVRFWFQuICBDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwKLQlBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIERvbid0IGNhbGwgQ1lfQ1lHV0lOMzIgb3IgQ1lfRVhFRVhULgotCSogY29uZmlnLmluOiBOZXcgZmlsZSwgY3JlYXRlZCBieSBhdXRvaGVhZGVyLgotCSogY29uZi5pbjogUmVtb3ZlLgotCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFLCBWRVJTSU9OLCBhbmQgVVNJTkdfQ0dFTi4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IENoYW5nZSBHQVNfVkVSU0lPTiB0byBWRVJTSU9OLgotCShwYXJzZV9hcmdzKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLXZtcy5jOiAoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogTGlrZXdpc2UuCi0JKiBkb2MvTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgZG9jL01ha2VmaWxlLmluLgotCSogTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25kLmMgKHNfZWxzZSk6IElmIG5vdCBsaXN0aW5nIGZhbHNlIGNvbmRpdGlvbmFscywgdHVybiBsaXN0aW5nCi0Jb2ZmIGluIHRoZSBmYWxzZSBicmFuY2ggb2YgdGhlIGVsc2UuCi0KLU1vbiBBdWcgIDQgMTE6Mjg6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZpeCBoYW5kbGluZyBvZiBhIGRvdWJsZSBsb2FkIGZyb20gYQotCXN5bWJvbCBwbHVzIGFuIG9mZnNldC4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IFNldCBmTWVyZ2UgdG8gMCBmb3IgYW4gRkRSIHdoaWNoCi0JaGFzIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgc3ltYm9sLgotCi1TdW4gQXVnICAzIDIzOjIzOjU5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfdWNvbnMpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgdW5hbGlnbmVkIGRhdGEgcHNldWRvcyBmb3IgRFdBUkYuCi0KLVRodSBKdWwgMzEgMTU6MTM6NDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IElnbm9yZSB0aGUgcmVzdCBvZiB0aGUgY3VycmVudAotCWxpbmUgaWYgd2UgZW5jb3VudGVyIGFuIGVycm9yLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFNpZ24gZXh0ZW5kIGNvbnN0YW50cyB2YWx1ZQotCWZvciBoaSBhbmQgaGkwIGV4cHJlc3Npb25zLgotCSh2ODUwX2luc2VydF9vcGVyYW5kKTogRW5hYmxlIHJhbmdlIGNoZWNraW5nIGZvciBnZW5lcmljIDE2Yml0Ci0Jb3BlcmFuZHMuCi0KLVR1ZSBKdWwgMjkgMTQ6MjA6NDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFR1cm4gb24gZnhfbm9fb3ZlcmZsb3cgZm9yCi0JTE8xNiwgSEkxNiBhbmQgSEkxNl9TIHJlbG9jcy4KLQotTW9uIEp1bCAyOCAxODo0MTo0MSAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBVc2UgQ1lHV0lOIGFuZCBFWEVFWFQgYXV0b2NvbmYgbWFjcm8gdG8gbG9vayBmb3IKLSAgICAgICAgd2luMzIgZGVwZW5kZW5jaWVzLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEyLgotICAgICAgICAqIE1ha2VmaWxlLmluOiBBZGQgJChFWEVFWFQpIHRvIGFsbCBleGVjdXRhYmxlcy4KLQotRnJpIEp1bCAyNSAxMDo1NDo0MyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSW1wcm92ZSB3YXJuaW5ncyBmb3Igb3V0IG9mIHJhbmdlCi0JdW5jb25kaXRpb25hbCBicmFuY2hlcy4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBhbnl0aGluZyB3aXRoIGEgUlIlIG9yIExSJQotCWZpZWxkIHNlbGVjdG9yLgotCi1UaHUgSnVsIDI0IDE1OjIxOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHRjLXNwYXJjLmMgKG1kX2JlZ2luKTogQ2FzdCBzcGFyY19vcGNvZGVzIHRvIFBUUiBmb3IgaGFzaF9pbnNlcnQuCi0KLVRodSBKdWwgMjQgMTc6NTE6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtYWNyby5jIChkZWZpbmVfbWFjcm8pOiBNYWtlIHN1cmUgdGhlIGluZGV4IGlzIGluIHJhbmdlIGJlZm9yZQotCWNoZWNraW5nIGZvciAnKCcuCi0KLVRodSBKdWwgMjQgMTI6MTM6MTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChidWlsZF9pbnNuKTogUmVtb3ZlICJleHRlbmRlZCIgYW5kIHJlcGxhY2Ugd2l0aAotIAkiZngiIGFuZCAiZnhmcmFnIi4gIEFkZCAiZmZyYWciLiAgQ2hhbmdlIGNvZGUgdG8gaW5pdGlhbGl6ZSBhbmQgdXNlCi0JdGhlIHJpZ2h0IGYvZmZyYWcgYW5kIGZ4L2Z4ZnJhZyBwYWlycyBzaW5jZSBpbnN0cnVjdGlvbiBtYXkgYmUgc3BsaXQKLSAJYWNyb3NzIGZyYWdzLgotCi1UdWUgSnVsIDIyIDE4OjM4OjU2IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogY29uZmlnL3RlLWdvMzIuaCAoVVNFX0FMSUdOX1BUV08pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZiBVU0VfQUxJR05fUFRXTyBpcwotCWRlZmluZWQsIHVzZSBzX2FsaWduX3B0d28gZm9yIC5hbGlnbi4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW1zZG9zZGpncHAqKTogTmV3IHRhcmdldC4KLQkoaTM4Ni0qLWdvMzIqKTogU2V0IGVtIHRvIGdvMzIgYW5kIHRhcmcgdG8gY29mZmdvMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBKdWwgMjIgMTI6NDE6NDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGxhc3Rfb3Bjb2RlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkobWRfYXNzZW1ibGUpOiBEb24ndCBpc3N1ZSAiRlAgYnJhbmNoIGluIGRlbGF5IHNsb3QiIHdhcm5pbmcgaWYKLQl0aGUgZGVsYXkgc2xvdCBoYXMgYmVlbiBhbm51bGxlZC4KLQotVHVlIEp1bCAyMiAxMzoyNToxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogQ2hlY2sgZm9yIFBDIHJlbGF0aXZlIHJlbG9jCi0JY29kZSBpZiBCRkRfQVNTRU1CTEVSLgotCi1Nb24gSnVsIDIxIDA4OjU3OjE3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAoc3lzdGVtX3JlZ2lzdGVycyk6IEZpeCBvcmRlcmluZyBvZiByZWdpc3RlcnMuCi0KLVR1ZSBKdWwgMTUgMTY6Mjk6NTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChidWlsZF9pbnNuKTogSW5pdGlhbGl6ZSBleHRlbmRlZCB3b3JkIHRvIHplcm8KLQl3aGVuIGl0IHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyIGJ5IHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi0KLU1vbiBKdWwgMTQgMjM6MTA6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFJlc3RvcmUgY2hlY2sgb2YgZm10IGFyZ3VtZW50LgotCShtaXBzX2lwKTogRml4IElTQSBjaGVja3MuCi0KLU1vbiBKdWwgMTQgMTk6MzA6NTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChidWlsZF9pbnNuKTogRml4IGVuZGlhbm5lc3MgcHJvYmxlbSB3aXRoCi0JT19iaWcgb3BlcmFuZHMuCi0KLVN1biBKdWwgMTMgMjA6NDM6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChjaGVja19hYnNvbHV0ZV9leHByKTogQ2hhbmdlIHdhcm5pbmcgdG8KLQllcnJvci4KLQotRnJpIEp1bCAxMSAxMDoxODo0NyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogUmVmaW5lIGNvZGUgdG8gY2hlY2sgaWYgYW4KLQlpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgb24gYSBwYXJ0aWN1bGFyIGNwdSB2YXJpYW50LgotCShtaXBzX2lwKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgIDcgMjI6NTM6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogQ2hhbmdlIGlmbmRlZgotCU9CSl9BT1VUIHRvIGlmZGVmIE9CSl9FTEYuCi0JKG1kX2FwcGx5X2ZpeDMpOiBXaGVuIG1hbmdsaW5nIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvYyBmb3IKLQlCRkRfQVNTRU1CTEVSLCBoYW5kbGUgb25lIEVMRiBjYXNlIGZvciBDT0ZGIGFzIHdlbGwsIGFuZCBhZGQgYSBQRQotCWNhc2UuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2hhbmdlIHNwZWNpYWwgY2FzZSBmb3IgaTM4Ni1jb2ZmIHRvCi0gCW5vdCBhcHBseSBmb3IgaTM4Ni1wZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBPbmx5IGNvdW50IGZpeHVwcwotCXdoaWNoIHdlcmUgbm90IGRvbmUuCi0JKGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IFJlbmFtZSBmcm9tIGNvZmZfZnJvYl9maWxlLgotCShjb2ZmX2Zvcm1hdF9vcHMpOiBJbml0aWFsaXplIGZyb2JfZmlsZV9hZnRlcl9yZWxvY3MgZmllbGQgcmF0aGVyCi0JdGhhbiBmcm9iX2ZpbGUgZmllbGQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgotCShjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9maWxlKTogRG9uJ3QgZGVmaW5lLgotCShvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGJmZF9nYXMgdG8geWVzIGZvciBpMzg2LSotY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKdWwgIDIgMTI6MDU6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IE5ldmVyIHN1YnRyYWN0IHNlY3Rpb24KLQlhZGRyZXNzIGZyb20gUEMgcmVsYXRpdmUgcmVsb2Mgd2hpY2ggd2lsbCBiZSBmdWxseSByZXNvbHZlZC4KLQotVHVlIEp1bCAgMSAxNToyMzowNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKHBhZ2VfdHlwZSk6IFJlbmFtZWQgZnJvbSBwYWdlX3QgdG8gYXZvaWQgY29uZmxpY3QKLQl3aXRoIGhwdXgxMCBoZWFkZXIgZmlsZXMuCi0KLU1vbiBKdW4gMzAgMTI6Mjc6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBKYXNvbiBNZXJyaWxsIDxqYXNvbkBjeWdudXMuY29tPjoKLQkqIHJlYWQuYyAoZG9fYWxpZ24pOiBJZiBCRkRfQVNTRU1CTEVSLCBvbmx5IHVzZSBOT1BfT1BDT0RFIGlmCi0JU0VDX0NPREUgaXMgc2V0LgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfbWF5YmVfdGV4dCk6IERlZmluZS4KLQkobWRfZG9fYWxpZ24pOiBVc2UgbWRfbWF5YmVfdGV4dC4KLQotRnJpIEp1biAyNyAxOToxNToyNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IE9ubHkgY2hlY2sgZm9yIEdPVCB0eXBlCi0JcmVsb2NhdGlvbnMsIGRvbid0IGNoZWNrIGZvciBzeW1ib2wgYmVpbmcgZXh0ZXJuYWwsIHdlYWssIGV0Yy4KLQotTW9uIEp1biAxNiAxOToxMjo1MSAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgbGV0IHRoZSBhc3NlbWJsZXIKLQljYWxjdWxhdGUgcmVsb2NhdGlvbnMgdG8gYW55IGV4dGVybmFsIHN5bWJvbCwgYmVjYXVzZSB3ZSBtaWdodCBiZQotCWxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0IGFuZCB0aGUgc3ltYm9sIG1pZ2h0IGJlIG92ZXJyaWRlbiBvciBtb3ZlZAotCShmb3IgaW5zdGFuY2UsIG1vdmVkIGludG8gYSBzdGF0aWMgZXhlY3V0YWJsZSdzIC5ic3Mgc2VjdGlvbikuCi0JKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlbGV0ZS4gVGhpcyBpcyBhbiBpMzg2IHdpZXJkbmVzcy4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IEdPVC1iYXNlZCByZWxvY2F0aW9ucyBjYW4ndAotCWJlIGNhbGN1bGF0ZWQgYnkgdGhlIGFzc2VtYmxlci4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogSGFuZGxlIEBwbHQgb3IgQGxvY2FsIGJyYW5jaAotCXdob3NlIGRlc3RpbmF0aW9uIGxpZXMgaW4gdGhlIHNhbWUgZmlsZSwgYnkgaWdub3JpbmcgdGhlIEBwbHQgb3IKLQlAbG9jYWwgYW5kIGFpbWluZyB0aGUgYnJhbmNoIGF0IGl0cyBkZXN0aW5hdGlvbi4KLQotTW9uIEp1biAxNiAxMzo1OToxOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBzeW1ib2xzLmMgKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBDb3B5IEJTRl9PQkpFQ1QgZmxhZy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogQ29weSBzaXplCi0JZXhwcmVzc2lvbi4KLQotCSogY29uZmlnL29iai1tdWx0aS5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IERlZmluZSBpbnN0ZWFkCi0Jb2Ygb2JqX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMuCi0KLU1vbiBKdW4gMTYgMTI6NDU6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19pbnNlcnRfb3BlcmFuZCk6IEluIDMyIGJpdCBtb2RlLCB3aXRoIGEKLQlzaWduZWQgb3BlcmFuZCwgc2lnbiBleHRlbmQgYSAzMiBiaXQgdmFsdWUgdG8gdGhlIGhvc3Qgc2l6ZS4KLQotCSogTWFrZWZpbGUuaW4gKENGTEFHUyk6IFN1YnNpdHV0ZSBmcm9tIGNvbmZpZ3VyZSBzY3JpcHQuICBGcm9tCi0JSmVmZiBNYWtleSA8amVmZkBjdHMuY29tPi4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogVXNlIGFsbG9jYSByYXRoZXIgdGhhbiBhIGZpeGVkCi0JYnVmZmVyIHNpemUgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIHN5bWJvbC4KLQotCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBQdXQgQGV4dHJhX29iamVjdHNAIG9uIHRoZSBzYW1lIGxpbmUgYXMKLQltYWNyby5vLgotCi1UaHUgSnVuIDEyIDEyOjE2OjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJbiBub24gQkZEX0FTU0VNQkxFUiBjb2RlLCBhcyB3ZQotCXN0ZXAgdGhyb3VnaCB0aGUgZnJhZ3MgY2FsbGluZyBjdnRfZnJhZ190b19maWxsLCBzd2l0Y2ggdG8KLQlTRUdfREFUQSB3aGVuIHdlIHJlYWNoIGRhdGFfZnJhZ19yb290LgotCi1UdWUgSnVuIDEwIDE3OjA4OjM0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBBbGxvdyBhbiBlbXB0eSByZWdpc3RlcgotCWxpc3QgZm9yIGluc3RydWN0aW9ucyB3aGljaCB1c2UgcmVnaXN0ZXIgbGlzdHMuCi0KLVR1ZSBKdW4gMTAgMTE6MTg6MDkgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogTWFrZSB0ZW1wIHVuc2lnbmVkIGxvbmcuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX2FkanVzdF9zeW10YWIpOiBPbmx5IHNldCBzdG9yYWdlIGNsYXNzZXMgaWYKLQlPQkpfQ09GRi4KLQotCSogY29uZmlnL3RjLWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IgbWFueSBzdGF0aWMgZnVuY3Rpb25zLgotCShzdHJ1Y3QgYXNtX29wY29kZSApOiBBZGQgcHJvdG90eXBlcyBmb3IgcGFybXMgZmllbGQuCi0JKHN0cnVjdCB0aHVtYl9vcGNvZGUgKTogTGlrZXdpc2UuCi0JKGZwX29wMik6IFJlbW92ZSB1bnVzZWQgZmxhZ3MgcGFyYW1ldGVyLgotCShvdXRwdXRfaW5zdCk6IE1ha2Ugc3RhdGljLgotCShhcm1fYWZ0ZXJfcGFzc19ob29rKTogUmVtb3ZlIHVudXNlZCBpZ25vcmUgcGFyYW1ldGVyLgotCSogY29uZmlnL3RjLWFybS5oIChhcm1fYWZ0ZXJfcGFzc19ob29rKTogRGVjbGFyZS4KLQkoYXJtX3N0YXJ0X2xpbmVfaG9vayk6IERlY2xhcmUuCi0JKGFybV9mcm9iX2xhYmVsKTogRGVjbGFyZS4KLQotTW9uIEp1biAgOSAxMjo1NTo0NSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBkZXBlbmQuYyAod3JhcF9vdXRwdXQpOiBuZXcgcHJvdG90eXBlLgotCi1Nb24gSnVuICA5IDEyOjUyOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IENoZWNrIGZvciBvdmVyZmxvdy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfc2VjdGlvbl9hbGlnbik6IElmIGEub3V0IGFuZCBCRkQsIGZvcmNlCi0Jc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuCi0KLUZyaSBKdW4gIDYgMTc6MTU6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guaCAobWRfY29uc19hbGlnbik6IERlZmluZS4KLQkoc2hfY29uc19hbGlnbik6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtc2guYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIC51YXdvcmQgYW5kIC51YWxvbmcuCi0JKHNoX25vX2FsaWduX2NvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3VhY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKHNoX2hhbmRsZV9hbGlnbik6IFdhcm4gYWJvdXQgbWlzYWxpZ25lZCBkYXRhLgotCSogZG9jL2Mtc2gudGV4aTogRG9jdW1lbnQgLnVhd29yZCBhbmQgLnVhbG9uZy4KLQotVGh1IEp1biAgNSAxNTozODoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZCk6IEluIE1SSSBtb2RlLCB0cmVhdCBzaW5nbGUgcXVvdGUgYXMgYQotCXNlcGFyYXRvciBjaGFyYWN0ZXIgd2hlbiBjaGVja2luZyBmb3IgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LgotCi1UdWUgSnVuICAzIDE2OjE1OjEzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfcGFyc2Vfb3B0aW9uKTogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tCi0JYXJtVC05NzAzMjgtYnJhbmNoLgotCi0JKiBjb25maWcvdGMtYXJtLmg6IE1lcmdlIGluIGNoYW5nZXMgZnJvbSBhcm1ULTk3MDMyOC1icmFuY2guCi0KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBUaHVtYiBhcmNoaXRlY3R1cmUgc3VwcG9ydCBmcm9tCi0JYXJtVC05NzAzLTI4LWJyYW5jaC4KLQotTW9uIEp1biAgMiAxNjoyNTowNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYWxsLnRleGk6IEFkZCBlbmFibGluZyBvZiBBUk0gZG9jdW1lbnRhdGlvbi4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBBUk0gZG9jdW1lbnRhdGlvbiBmcm9tIGFybVQtOTcwMzI4LWJyYW5jaC4KLQotTW9uIEp1biAgMiAxMTo1NToxMiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQWRkZWQgcjM5MDAgc3VwcG9ydC4KLQotVGh1IE1heSAyOSAxMjo1ODoyNiAxOTk3ICBCZW4gUGZhZmYgIDxwZmFmZmJlbkBwaWxvdC5tc3UuZWR1PgotCi0JKiBhcy5jOiAocGFyc2VfYXJncykgYC10JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQuCi0KLVdlZCBNYXkgMjggMTU6NDU6MDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9iZWdpbik6IENoYW5nZSBjYWxsIHRvCi0JY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKCkgdG8gYSBjYWxsIHRvCi0JYmZkX3NldF9wcml2YXRlX2ZsYWdzKCkuIAotCi1XZWQgTWF5IDI4IDE2OjE3OjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBEb24ndCB0cnkgdG8gY29udmVydCB0aGUgdHlwZQotIAlvZiBhIEJGRF9SRUxPQ19SVkEgcmVsb2MuCi0KLVdlZCBNYXkgMjggMTA6NDg6MTQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19maXhfYWRqdXN0YWJsZSk6IFJlamVjdCBhYnNvbHV0ZSBjYWxscy9qdW1wcy4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgYSByZWxvY2F0aW9uIGZvciBhbiBhYnNvbHV0ZQotCWNhbGwvanVtcC4KLQotTW9uIE1heSAyNiAxMzoyNDoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb24ndCB1c2UgQHZhbHVlIGluIHNlY3Rpb24gbmFtZXMgb3IgaW5kZXgKLQllbnRyaWVzOyBpdCBjb25mdXNlcyB0ZXhpbmZvLnRleC4KLQotRnJpIE1heSAyMyAwMDowOTozNSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBVcGRhdGVkIGZvciAtTUQgb3B0aW9uLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZGVkIGRlcGVuZC5jLgotCShPQkpTKTogQWRkZWQgZGVwZW5kLm8uCi0JKiBhcy5oIChzdGFydF9kZXBlbmRlbmNpZXMsIHJlZ2lzdGVyX2RlcGVuZGVuY3ksCi0JcHJpbnRfZGVwZW5kZW5jaWVzKTogTmV3IGRlY2xhcmF0aW9ucy4KLQkqIGRlcGVuZC5jOiBOZXcgZmlsZS4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBZGRlZCAtTUQgb3B0aW9uLgotCShtYWluKTogQ2FsbCBwcmludF9kZXBlbmRlbmNpZXMuCi0JKHNob3dfdXNhZ2UpOiBBZGRlZCBoZWxwIGZvciAtTUQuCi0JKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBDYWxsIHJlZ2lzdGVyX2RlcGVuZGVuY3kuCi0JKHNfaW5jbHVkZSk6IENhbGwgcmVnaXN0ZXJfZGVwZW5kZW5jeSB3aGVuIGZpbGUgaXMgZm91bmQuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhbGwgcmVnaXN0ZXJfZGVwZW5kZW5jeS4KLQotV2VkIE1heSAyMSAxNzozOToyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzeW1ib2xfdG9fY2hhcnMpOiBJZiBURV9QRSwgZG9uJ3QgYWRkIHRoZQotCXNlY3Rpb24gYWRkcmVzcyB0byB0aGUgc3ltYm9sIHZhbHVlLgotCi1UdWUgTWF5IDIwIDExOjIzOjMxIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCxtaXBzX2lwKTogTW92ZSB0aGUgSU5TTl9JU0EgZmllbGQKLQlpbnRvIHRoZSBuZXcgbWVtYmVyc2hpcCBmaWVsZC4KLQotVGh1IE1heSAxNSAxMDowMDo1MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2JlZ2luKTogSWYgbm8gY3B1IHR5cGUgaXMgc3BlY2lmaWVkIG9uIHRoZQotCWNvbW1hbmQgbGluZSB0aGVuIHRoZSBBUk03IGlzIG5vdyBjaG9zZW4gYnkgZGVmYXVsdCB3aGVuIHNldHRpbmcKLQl0aGUgQkZEIG1hY2hpbmUgYW5kIGFyY2hpdGVjdHVyZS4KLQotV2VkIE1heSAxNCAwOTo1NDo1MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGdsb2JhbCB2YXJpYWJsZXMpOiBBZGRlZCAndXNlc19hcGNzXzI2JyBmbGFnIHRvCi0JaG9sZCBBUENTIHNlbGVjdGlvbi4KLSAgCShtZF9iZWdpbik6IEFkZGVkIGNvZGUgdG8gZ2VuZXJhdGUgZmxhZ3MgdG8gYmUgc2V0IGludG8gdGhlIENPRkYKLQloZWFkZXIgYW5kIHRoZSBjYWxscyB0byB0aGUgQkZEIGZ1bmN0aW9ucyB0byBkbyB0aGlzLgotICAJKG1kX3BhcnNlX29wdGlvbiwgbWRfc2hvd191c2FnZSk6IEFkZGVkIG5ldyBjb21tYW5kIGxpbmUKLQlvcHRpb25zIC1tYXBjcy0zMiwgLW1hcGNzLTI2LCAtbWFybXYyLCAtbWFybXYyYSwgLW1hcm12MywKLQktbWFybXYzbSwgLW1hcm12NCwgLW1hcm12NHQuIAotCi0JKiB0Yy1hcm0uaCAoTE9DQUxfTEFCRUwpOiBSZW1vdmVkIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgbWFjcm8KLQlhcyBpdCBpcyBuZXZlciB1c2VkLgotCi1UdWUgTWF5IDEzIDIyOjI2OjE0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfY29udmVydF9mcmFnKTogUHJlZml4IHRlbXBvcmFyeQotCWxhYmVsIG5hbWUgd2l0aCAiLiIuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQotVHVlIE1heSAxMyAxNDo0NDozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNldF9hdCk6IENoZWNrIGZvciBiaWdudW0uCi0JKGNoZWNrX2Fic29sdXRlX2V4cHIsIG1hY3JvLCBtaXBzMTZfbWFjcm8pOiBMaWtld2lzZS4KLQotVHVlIE1heSAxMyAxMDo0NTo1NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX2FwcGx5X2ZpeCk6IENoZWNrIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zCi0JZm9yIG92ZXJmbG93L3VuZGVyZmxvdywgb25seSBpbnNlcnQgbG93ZXIgMTUgYml0cyBpbnRvIGluc3RydWN0aW9uLgotCi1Nb24gTWF5IDEyIDEzOjMzOjA4IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHBpKTogQ2hlY2sgZm9yIFJlZ01NWC4KLQotVGh1IE1heSAgOCAxMToxMDoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoZXhwcik6IFdoZW4gc3VidHJhY3RpbmcgdmFsdWVzIGluIHRoZSBzYW1lIGZyYWcsCi0Jc3VidHJhY3QgWF9hZGRfbnVtYmVyIHJhdGhlciB0aGFuIGFkZGluZyBpdC4KLQotV2VkIE1heSAgNyAxNTozOTo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEp1c3QgcGFzcyBOVUxMIHRvCi0gCW1kX2RvX2FsaWduLCBub3QgdGhlIGFkZHJlc3Mgb2YgYSBjaGFyIGhvbGRpbmcgTk9QX09QQ09ERS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBIYW5kbGUgY29uc3RhbnRzIGZvciBNX0xJX0QgYW5kCi0JTV9MSV9ERC4KLQkobWlwc19pcCk6IEZvciAnRicsICdMJywgJ2YnLCBhbmQgJ2wnLCBnZW5lcmF0ZSBhIGNvbnN0YW50IHJhdGhlcgotCXRoYW4gYW4gYWRkcmVzcyBpZiB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgbG9va3Mgc3VmZmljaWVudGx5Ci0Jc2ltcGxlLgotCi1UdWUgTWF5ICA2IDEyOjE4OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfc2VjdGlvbl9hbGlnbik6IElmIGEub3V0IGFuZCBCRkQsIGZvcmNlCi0Jc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuCi0KLU1vbiBNYXkgIDUgMTc6MTY6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25kLmM6IEluY2x1ZGUgIm1hY3JvLmgiLgotCShzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUpOiBBZGQgbWFjcm9fbmVzdCBmaWVsZC4KLQkoaW5pdGlhbGl6ZV9jZnJhbWUpOiBJbml0aWFsaXplIG1hY3JvX25lc3QuCi0JKGNvbmRfZmluaXNoX2NoZWNrKTogQWRkIG5lc3QgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShjb25kX2V4aXRfbWFjcm8pOiBOZXcgZnVuY3Rpb24uCi0JKiBhcy5oIChjb25kX2ZpbmlzaF9jaGVjayk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoY29uZF9leGl0X21hY3JvKTogRGVjbGFyZS4KLQkqIGlucHV0LXNjcnViLmMgKG1hY3JvX25lc3QpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogQ2FsbCBjb25kX2ZpbmlzaF9jaGVjay4KLQkqIG1hY3JvLmggKG1hY3JvX25lc3QpOiBEZWNsYXJlLgotCSogcmVhZC5jIChzX21leGl0KTogQ2FsbCBjb25kX2V4aXRfbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFJlZ01NWCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHBpKTogQ2hlY2sgZm9yIGFsbCByZWdpc3RlciB0eXBlcy4KLQkodHlwZV9uYW1lcyk6IEFkZCBSZWdNTVguCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIFJlZ01NWC4KLQotV2VkIEFwciAzMCAxMjo0NzowMCAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3NlY3Rpb25fc3ltYm9sKTogQ2xlYXIgdGhlIExPQ0FMIGJpdCAjaWZkZWYKLQlURV9ERUxUQS4KLQotVHVlIEFwciAyOSAyMDoyMzoxMCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG5vcGljX25lZWRfcmVsYXgpOiBBZGQgbmV3IHBhcmFtZXRlcgotCWJlZm9yZV9yZWxheGluZy4gIFVzZSBpdCB3aGVuIHRlc3RpbmcgZWNvZmZfZXh0ZXJuX3NpemUuCi0JKGxvYWRfYWRkcmVzcywgbWFjcm8sIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRml4IGFsbAotCWNhbGxlcnMuCi0KLVR1ZSBBcHIgMjkgMTk6NTQ6MzYgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9wc2V1ZG9fdGFibGUpOiBBZGQgInN1YnNlY3Rpb24iLgotIAkob2JqX2VsZl9zdWJzZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotVHVlIEFwciAyOSAxOTo1Mjo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2hlYWRlcl9hcHBlbmQpOiBEb24ndCByZXNldCBzdHJpbmdfc2l6ZQotCWVhY2ggdGltZSB0aHJvdWdoIHRoZSBsb29wLgotCi1GcmkgQXByIDI1IDE0OjE3OjQ2IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgaXRibC1wYXJzZS5oLgotCi1GcmkgQXByIDI1IDEyOjAzOjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2ludGVybmFscy50ZXhpIChQb3J0aW5nIEdBUyk6IENvcnJlY3QgZG9jdW1lbnRhdGlvbiBmb3IKLQljdXJyZW50IGNvbmZpZ3VyZSBoYW5kbGluZyBvZiB0YXJnLWNwdS5oLCBldC4gYWwuCi0JKENQVSBiYWNrZW5kKTogRG9jdW1lbnQgbGlzdGluZyBtYWNyb3MuCi0KLQkqIGxpc3RpbmcuYyAoZGF0YV9idWZmZXIpOiBTZXQgc2l6ZSBiYXNlZCBvbiBvdGhlciBsaXN0aW5nIG1hY3JvcywKLQlyYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcgMTAwLgotCShkYXRhX2J1ZmZlcl9zaXplKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoY2FsY19oZXgpOiBNYWtlIGRhdGFfYnVmZmVyX3NpemUgYSBsb2NhbCB2YXJpYWJsZS4gIERvbid0IGxlYXZlCi0JYW55IHNsb3Agd2hlbiBmaWxsaW5nIGRhdGFfYnVmZmVyLgotCi1Nb24gQXByIDIxIDE1OjMzOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtbWlwcy50ZXhpOiBEb2N1bWVudCAuc2V0IGF1dG9leHRlbmQuCi0KLVNhdCBBcHIgMTkgMjM6MDk6MjUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BwZXRyYS5hcHBsaS5zZT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotb3BlbmJzZCosIG02OGstKi1vcGVuYnNkKiwKLQltaXBzLWRlYy1vcGVuYnNkKiwgcHBjLSotKmJzZCosIG5zMzJrLXBjNTMyLW9wZW5ic2QqLAotCXNwYXJjLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU2F0IEFwciAxOSAyMjo1MjowMyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IElmIFRDX01JUFMsIHNldCBCU0ZfT0JKRUNUCi0JZm9yIGFsbCB1bmRlZmluZWQgc3ltYm9scy4KLQotRnJpIEFwciAxOCAxMzozNzozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogSGFuZGxlIHplcm8gbGVuZ3RoIGNzZWN0cwotCWNvcnJlY3RseS4KLQotRnJpIEFwciAxOCAxMTo1MTozNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLW9wZW5ic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEFwciAxNyAxMzo1OTo0NyAxOTk3ICBQZXIgRm9nZWxzdHJvbSAgPHBlZm9Ab3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEFwciAxNiAxMjozMToyNCAxOTk3ICBNYXJ0aW4gSHVudCA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IEZpeCBwYXJhbGxlbCBjaGVja2luZwotCWZvciBpbnN0cnVjdGlvbnMgdXNpbmcgY29uZGl0aW9uYWwgZXhlY3V0aW9uLgotCi1UdWUgQXByIDE1IDE4OjExOjQ0IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChpbnNuX3VzZXNfcmVnKTogQ29ycmVjdCB0ZXN0IGZvciBmcHIgcGFpcnMuCi0KLVR1ZSBBcHIgMTUgMTM6MDQ6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc3Jjcm9vdCk6IFJlbW92ZS4KLSAJKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1hGT1JNLCBJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoYWxsLCBkdmkpOiBEb24ndCBzZXQgc3Jjcm9vdC4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGFzLm5ldywgZ2FzcC5uZXcsIGFuZCBpbnN0YWxsZGlycy4gIFVzZQotCSQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkgZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nCi0JJChJTlNUQUxMX1hGT1JNKSBhbmQgJChJTlNUQUxMX1hGT1JNMSkuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCi0JKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4gIFVzZSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi0JZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nICQoSU5TVEFMTF9YRk9STSkgYW5kCi0JJChJTlNUQUxMX1hGT1JNMSkuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbC1pbmZvLWFzKTogUnVuIG1raW5zdGFsbGRpcnMuCi0JKGluc3RhbGwtaW5mby1nYXNwKTogTGlrZXdpc2UuCi0KLU1vbiBBcHIgMTQgMTE6NTk6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBDaGVjayBmb3IgZGl2aXNpb24gYnkgemVyby4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIE1ha2VmaWxlLmluOiBBbHdheXMgdXNlICQoU0hFTEwpIHdoZW4gcnVubmluZyBtb3ZlLWlmLWNoYW5nZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBBcHIgMTAgMTQ6NDA6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX3BhcnNlX29wZXJhbmQpOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fcGFyc2Vfb3BlcmFuZC4KLQlOZXcgYXJndW1lbnQgYHdhbnQnLiAgVXBkYXRlIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCB2YWx1ZXMuCi0JSW5pdGlhbGl6ZSBpZiBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVC4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogU2V0IGNnZW5fcGFyc2Vfb3BlcmFuZF9mbi4KLQkobWRfYXNzZW1ibGUpOiBDYWxsIGNnZW5fYXNtX2luaXRfcGFyc2UuCi0JVXBkYXRlIGNhbGwgdG8gbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24sIGNhbGwgYXNfYmFkIGlmIGFzc2VtYmx5IGZhaWxlZC4KLQotV2VkIEFwciAgOSAxMTo0OTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBIYW5kbGUgI2ouCi0KLVR1ZSBBcHIgIDggMTY6Mzc6NTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBDcmVhdGUgZml4dXAgYXQgdGhlCi0JcmlnaHQgYWRkcmVzcyBmb3IgY2FsbCBsYWJlbDozMixyZWdzLGltbS4KLQotTW9uIEFwciAgNyAxNDo1ODoyMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlX3N0YXJ0KTogSWYgT0JKX0VMRiwgdGhlbiBhbHdheXMgcmV0dXJuCi0JemVyby4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgcmVzZXQgdGhlIHZhbHVlIG9mIHRoZQotCXN5bWJvbCBmb3IgT0JKX0VMRiBhbnltb3JlLgotCi1Nb24gQXByICA3IDEwOjU0OjU5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlIGRlcGVuZGVuY2llcy4KLSAJKFRBUkdfQ1BVKTogTmV3IHZhcmlhYmxlLgotCShjZ2VuLm8pOiBEZXBlbmQgb24gY2dlbi5oLCAkKFRBUkdfQ1BVKS1vcGMuaC4KLQkoLmRlcDEpOiBEZWxldGUgY3JlYXRpbmcgb2YgY2dlbi1vcGMuaC4KLQkoLnRjZGVwKTogUHV0IHByb3BlciBjb250ZW50cyBpbiBjZ2VuLW9wYy5oLgotCSogY29uZmlndXJlLmluIChtMzJyKTogRGVsZXRlIHNldHRpbmcgb2YgZXh0cmFfZmlsZXMsIGV4dHJhX2xpbmtzLgotCShBQ19PVVRQVVQpOiBDcmVhdGUgY2dlbi1vcGMuaC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVNhdCBBcHIgIDUgMTM6MTk6MTIgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIHRvIGJ1aWxkIGdhc3AuZXhlLgotCi1GcmkgQXByICA0IDE2OjEwOjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHJlbGF4X2ZyYWcpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKiB3cml0ZS5oIChyZWxheF9mcmFnKTogQWRkIHByb3RvdHlwZSBmb3IuCi0JKiBjb25maWcvdGMtbTMyci5oIChtZF9kb19hbGlnbik6IE5ldyBhcmcgYG1heCcuCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JVXBkYXRlIGNhbGxzIHRvIGZyYWdfYWxpZ24sIGZyYWdfYWxpZ25fcGF0dGVybi4KLQkoZmlsbF9pbnNuKTogVXBkYXRlIGNhbGwgdG8gbTMycl9kb19hbGlnbi4KLQkobTMycl9zY29tbSk6IFVwZGF0ZSBjYWxsIHRvIGZyYWdfYWxpZ24uCi0KLQkqIGNvbmZpZy90Yy1tMzJyLltjaF06IE5ldyBmaWxlcy4KLQkqIGNnZW4uYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ1BVX1RZUEVTKTogQWRkIG0zMnIuCi0JKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIHRjLW0zMnIuYy4KLQkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgdGMtbTMyci5oLgotCShESVNUQ0xFQU5fSEVSRSk6IEFkZCBjZ2VuLW9wYy5oLgotCSguZGVwMSwudGNkZXApOiBDcmVhdGUgZW1wdHkgY2dlbi1vcGMuaC4KLQkoY2dlbi5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQkoZGVwZW5kZW5jaWVzKTogUmVnZW5lcmF0ZS4KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogTmV3IG1lbWJlciBmcl90YXJnLgotCShmcl9wY3JlbF9hZGp1c3QsZnJfYnNyKTogTW92ZSBpbnRvIHVuaW9uIGZyX3RhcmcubnMzMmsuCi0JKiBjb25mLmluIChVU0lOR19DR0VOKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLmluIChtMzJyLSotKik6IEFkZCBlbnRyeSBmb3IuCi0JQWRkIGNnZW4ubyB0byBleHRyYV9vYmplY3RzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogZnJhZ3MuYyAoZnJhZ192YXIpOiBmcl9wY3JlbF9hZGp1c3QgcmVuYW1lZCB0bwotCWZyX3RhcmcubnMzMmsucGNyZWxfYWRqdXN0LiAgZnJfYnNyIHJlbmFtZWQgdG8gZnJfdGFyZy5uczMyay5ic3IuCi0JKGZyYWdfdmFyaWFudCk6IExpa2V3aXNlLgotCSogd3JpdGUuYyAocmVsYXhfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKCopOiBMaWtld2lzZS4KLQotRnJpIEFwciAgNCAxMzoyNjoxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0VPTF9JTl9JTlNOKTogQ2hlY2sgZXhwbGljaXRseSBmb3IgJyEnLAotCXJhdGhlciB0aGFuIGZvciBhbnkgZW5kIG9mIGxpbmUgY2hhcmFjdGVyLgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBJZiBocHBhX3Jlbl9yZWxvY190eXBlIGZhaWxzLAotCWNhbGwgYWJvcnQgKGkuZS4sIGFzX2Fib3J0KSByYXRoZXIgdGhhbiBjcmFzaGluZy4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogUHJvdGVjdCB1c2VzIG9mIFNUT19NSVBTMTYgd2l0aCBhbiBpZmRlZiBvZgotCU9CSl9FTEYsIHJhdGhlciB0aGFuIG9mIFNfR0VUX09USEVSLgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVENMRUFOX0hFUkUpOiBBZGQgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLgotCi1UaHUgQXByICAzIDEzOjE2OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBTZXQgdG8gMi44LjEuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotV2VkIEFwciAgMiAxMjoyNDoxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIENPUFlJTkc6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X21hY3JvKTogSGFuZGxlIE1fRE1VTCBhbmQgTV9NVUwuCi0KLVR1ZSBBcHIgIDEgMTg6Mjk6NDcgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IERvbid0IHNldCBpbnRlcmxvY2tzIGZvciA0MTAwLgotCi1UdWUgQXByICAxIDE2OjI0OjI4IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWctZ2FzLmNvbTogVXBkYXRlIHRvIGhhbmRsZSBib3RoIHZheCBhbmQgYWxwaGEuCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSB0byB1c2UgY29uZmlnLWdhcy4KLQkqIGNvbmYtYS1nYXMuY29tOiBSZW1vdmUgZmlsZS4KLQotVHVlIEFwciAgMSAxNjowODoyMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgdW5uZWNlc3NhcnkgaXRibC1wYXJzZS5oLCBpYnRsLXBhcnNlLmMsIGFuZAotCWl0YmwtbGV4LmMgZGVwZW5kZW5jaWVzLiAgUmVtb3ZlIHJ1bGVzIGZvciBpdGJsLWxleC5vLAotCWl0YmwtcGFyc2UubywgYW5kIGl0Ymwtb3BzLm87IGp1c3QgdXNlIHRoZSBub3JtYWwgLmMubyBydWxlLgotCi1UdWUgQXByICAxIDExOjI1OjU2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAobGluZV9jb21tZW50X2NoYXIpOiBNYWtlICcjJyBzdGFydCBjb21tZW50cwotCWF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGZvciBjb21wYXRpYmlsaXR5IHdpdGggLlMgZmlsZXMgd2hlcmUKLQljcHAgbGVhdmVzIHRoZSBmaWxlbmFtZSB0cmFuc2l0aW9ucyBiZWdpbm5pbmcgd2l0aCAnIycuCi0KLVR1ZSBBcHIgIDEgMDA6MDc6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBPbmx5IGNvbXBpbGUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIGFuZAotCXRjX2NvZmZfc2l6ZW1hY2hkZXAgaWYgT0JKX0NPRkYuCi0KLU1vbiBNYXIgMzEgMjM6NTM6NDQgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChyZWdpc3Rlcl9uYW1lKTogRGVjbGFyZS4KLQotTW9uIE1hciAzMSAxNjozMTowNCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIE1hciAzMSAxNDoxNToxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogQWRkICJzdGFibiIuCi0JKG1pcHMxNl9tYXJrX2xhYmVscyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFwcGVuZF9pbnNuKTogQ2FsbCBtaXBzMTZfbWFya19sYWJlbHMuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBMaWtld2lzZS4KLQkoc19pbnNuKTogTGlrZXdpc2UuICBEb24ndCBjYWxsIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMuCi0JKHNfbWlwc19zdGFiKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBVc2UgRUxGIGZvciBtaXBzLSotZ251Ki4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIE1hciAzMSAxNDowMTo0MCAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogU2V0IHRvICJjb2ZmLW02OGstc3lzdiIgaWYKLQlURV9ERUxUQS4KLQotRnJpIE1hciAyOCAxODowMzoxOSAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIGNvbW1vbmJmZGxpYi4gIElmIGl0IGlzIHNldCwKLQlzZXQgT1BDT0RFU19MSUIgdG8gZW1wdHkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjggMTU6MjU6MjQgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYy0qLWxpbnV4KmFvdXQqLCBzcGFyYy0qLWxpbnV4Kik6IE5ldwotCXRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjggMTM6MDg6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpdGJsLXBhcnNlLnkgKHl5ZXJyb3IpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUuCi0KLQlGcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT46Ci0JKiBjb25maWd1cmUuaW46IFNldCBlbXVsYXRpb25zIGZvciBtaXBzLSotbGludXgqLSouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHN0cnVjdCBtaXBzX3NldF9vcHRpb25zKTogRGVmaW5lLgotCShtaXBzX29wdHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzX2lzYSk6IFJlbW92ZS4gIE5vdyBhIGZpZWxkIGluIG1pcHNfb3B0cy4gIENoYW5nZSBhbGwKLQlyZWZlcmVuY2VzLgotCShtaXBzMTYsIG1pcHMxNl9hdXRvZXh0ZW5kLCBtaXBzX3dhcm5fYWJvdXRfbWFjcm9zKTogTGlrZXdpc2UuCi0JKG1pcHNfbm9yZW9yZGVyLCBtaXBzX25vbW92ZSwgbWlwc19ub2F0LCBtaXBzX25vYm9wdCk6IExpa2V3aXNlLgotCShzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2spOiBEZWZpbmUuCi0JKG1pcHNfb3B0c19zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfbWlwc3NldCk6IEFkZCBzdXBwb3J0IGZvciAuc2V0IHB1c2ggYW5kIC5zZXQgcG9wLgotCSogZG9jL2MtbWlwcy50ZXhpOiBEb2N1bWVudCAuc2V0IHB1c2ggYW5kIC5zZXQgcG9wLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBEZWNsYXJlIGl0LgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19jaGFuZ2Vfc2VjKTogQ2FsbCBpdCBpZiBPQkpfRUxGLgotCi1UaHUgTWFyIDI3IDEyOjIzOjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IFVwZGF0ZSBjb3B5cmlnaHQgZGF0ZSBpbiB2ZXJzaW9uIG1lc3NhZ2UuCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbi1oZXJlKTogUmVtb3ZlIGRlcGVuZGVuY3kgZmlsZXMuCi0KLQkqIHJlYWQuYyAoc19jb21tKTogQ2hlY2sgU19JU19DT01NT04gYXMgd2VsbCBhcyBTX0lTX0RFRklORUQuCi0JKHNfbXJpX2NvbW1vbik6IENoZWNrIFNfSVNfQ09NTU9OIHVuY29uZGl0aW9uYWxseS4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGVjayBTX0lTX0NPTU1PTiBhcyB3ZWxsIGFzIFNfSVNfREVGSU5FRC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG5vcGljX25lZWRfcmVsYXgpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IExpa2V3aXNlLgotCShwcGNfcGVfY29tbSk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBMaWtld2lzZS4gIFNldCBzZWdtZW50IG9mCi0JY29tbW9uIHN5bWJvbCB0byBiZmRfY29tX3NlY3Rpb25fcHRyLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogTGlrZXdpc2UuCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDI3IDAwOjI5OjQ2IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogR2V0IHRoZSByZWxvY3MgcmlnaHQuCi0KLVdlZCBNYXIgMjYgMTM6MzU6MTUgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBPbmx5IGRlZmluZSBpZgotCUJGRF9BU1NFTUJMRVIuCi0KLVdlZCBNYXIgMjYgMTE6MzI6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcik6IEhhbmRsZSB2ZXJ5IGxvbmcgaW5wdXQKLQlsaW5lcyBjb3JyZWN0bHkuCi0KLQkqIGxpc3RpbmcuYyAocHJpbnRfbGluZXMpOiBBZGQgbGluZW5vIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShsaXN0aW5nX2xpc3RpbmcpOiBPbmx5IGNhbGwgY2FsY19oZXggZm9yIHRoZSByaWdodCBsaW5lLgotCShsaXN0aW5nX2xpc3QpOiBTZXQgdGhlIG5ldyBlZGljdCBiYXNlZCBvbiB0aGUgY3VycmVudCBlZGljdCwgaW4KLQlvcmRlciB0byBoYW5kbGUgbGlzdGluZyBjb21tYW5kcyBpbiBtYWNyb3MgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChpbnNuX3VzZXNfcmVnKTogTWFwIHJlZ2lzdGVyIG51bWJlcnMgaW4gbWlwczE2Ci0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25kLmMgKGNvbmRfZmluaXNoX2NoZWNrKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoY29uZF9maW5pc2hfY2hlY2spOiBEZWNsYXJlLgotCSogYXMuYyAobWFpbik6IENhbGwgY29uZF9maW5pc2hfY2hlY2suCi0KLVR1ZSBNYXIgMjUgMTQ6NDU6NTQgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogSWYgdHdvIGluc3RydWN0aW9ucwotCWFyZSBzdXBwb3NlZCB0byBiZSBhc3NlbWJsZWQgaW4gcGFyYWxsZWwgYW5kIHRoZSBmaXJzdCBvbmUgaXMKLQlsb25nLCBwcmludCBhbiBlcnJvciBhbmQgc3RvcC4KLQkobWRfYXBwbHlfZml4Myk6IERvbid0IGNhbGN1bGF0ZSBhYnNvbHV0ZSByZWxvY3MuICBKdXN0IHdyaXRlCi0JdGhlbSBvdXQuCi0KLU1vbiBNYXIgMjQgMTI6MTE6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChpY2xyS2x1ZGdlKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgaWNscktsdWRnZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmggKHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVmaW5lIGlmCi0JT0JKX0VDT0ZGLgotCShhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlY2xhcmUgaWYgT0JKX0VDT0ZGLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2RlYnVnKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IGFscGhhX2RlYnVnIGlmIC1nIGlzIHNlZW4uCi0gCShhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IE5ldyBmdW5jdGlvbiBpZiBPQkpfRUNPRkYuCi0KLVN1biBNYXIgMjMgMTg6MDM6MzEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBFbmFibGUgcmFuZ2UtY2hlY2tpbmcgY29kZS4KLQkocG9zdGZpeCk6IFN0b3AgYXQgc3BhY2Ugb3IgY29tbWEuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UuCi0KLVNhdCBNYXIgMjIgMTM6NDQ6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgYXV0b21hdGljIGRlcGVuZGVuY3kgYnVpbGRpbmcuCi0JKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KLQotRnJpIE1hciAyMSAxNTo0MjozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotaWVlZS5jIChzZWdtZW50X25hbWUpOiBEb24ndCBkZWZpbmUgZnVuY3Rpb24gaWYgdGhpcwotCWlzIGEgbWFjcm8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy13NjUuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtejhrLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2FsbCBvYmpfZnJvYl9sYWJlbCBpZiBpdCBpcyBkZWZpbmVkLgotCSogY29uZmlnL29iai12bXMuaCAob2JqX2Zyb2JfbGFiZWwpOiBSZW5hbWUgZnJvbSB0Y19mcm9iX2xhYmVsLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBmaWxlcyBhbmQgbGlua3MuICBEb24ndCBjYWxsCi0JQUNfTElOS19GSUxFUy4gIFN1YnN0aXR1dGUgdGVfZmlsZS4gIENyZWF0ZSB0YXJnLWNwdS5oLAotCW9iai1mb3JtYXQuaCwgdGFyZy1lbnYuaCwgYW5kIGl0YmwtY3B1LmggaW4gQUNfT1VUUFVULgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0MpOiBOZXcgdmFyaWFibGUuCi0JKFRBUkdfQ1BVX08sIFRBUkdfQ1BVX0gpOiBOZXcgdmFyaWFibGVzLgotCShPQkpfRk9STUFUX0MsIE9CSl9GT1JNQVRfTywgT0JKX0ZPUk1BVF9IKTogTmV3IHZhcmlhYmxlcy4KLQkoVEFSR19FTlZfSCwgQVRPRl9UQVJHX0MsIEFUT0ZfVEFSR19PKTogTmV3IHZhcmlhYmxlcy4KLQkoU09VUkNFUyk6IFJlbmFtZSBmcm9tIFJFQUxfU09VUkNFUy4gIERlbGV0ZSBvbGQgZGVmaW5pdGlvbi4KLQkoTElOS0VEX1NPVVJDRVMpOiBSZW1vdmUuCi0JKEhFQURFUlMpOiBSZW5hbWUgZnJvbSBSRUFMX0hFQURFUlMuICBEZWxldGUgb2xkIGRlZmluaXRpb24uCi0JKExJTktFRF9IRUFERVJTKTogUmVtb3ZlLgotCShPQkpTKTogVXNlICQoVEFSR19DUFVfTyksIGV0Yy4sIHJhdGhlciB0aGFuIHRhcmctY3B1Lm8sIGV0Yy4KLQkoJChPQkpTKSk6IERlcGVuZCB1cG9uICQoVEFSR19FTlZfSCksIGV0Yy4sIHJhdGhlciB0aGFuCi0JdGFyZy1jcHUuaCwgZXRjLgotCSgkKFRBUkdfQ1BVX08pLCAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykpOiBOZXcgdGFyZ2V0cy4KLQkodGFyZy1jcHUubywgb2JqLWZvcm1hdC5vLCBhdG9mLXRhcmcubyk6IFJlbW92ZSB0YXJnZXRzLgotCShpdGJsLWNwdS5oKTogUmVtb3ZlIHRhcmdldC4KLQkoRElTVENMRUFOX0hFUkUpOiBSZW1vdmUgdGFyZy1jcHUuYywgb2JqLWZvcm1hdC5jLCBhdG9mLXRhcmcuYywKLQlhdG9mLXRhcmcuaC4KLQotVGh1IE1hciAyMCAxOToxODo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChTeW1ib2wgTmFtZXMpOiBEb24ndCB1c2Ugb2Jzb2xldGUgQGN0cmwgbWFjcm8uCi0KLVRodSBNYXIgMjAgMTY6NDk6MTQgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1yaV9jaGlwKTogUmVwbGFjZSBjYWxscyB0byBnZXRfc3ltYm9sX2VuZCBieQotCW9wZW4gY29kZWQgbG9vcCB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG5hbWUgdG8gc3RhcnQgd2l0aCBhCi0JbmFtZSBiZWdpbm5lci4KLQotVGh1IE1hciAyMCAxMzo0MjowMSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogZnJhZ3MuYyAoZnJhZ192YXIpOiBDaGFuZ2Ugb2Zmc2V0IHBhcmFtZXRlciB0byBvZmZzZXRULgotCShmcmFnX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQkqIGZyYWdzLmggKGZyYWdfdmFyaWFudCwgZnJhZ192YXIpOiBVcGRhdGUgZGVjbGFyYXRpb25zLgotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IG02OGtfaXQpOiBDaGFuZ2UgZm9mZiBmaWVsZCB0bwotCW9mZnNldFQuCi0JKGFkZF9mcmFnKTogQ2hhbmdlIG9mZiBwYXJhbWV0ZXIgdG8gb2Zmc2V0VC4KLQkqIFNldmVyYWwgZmlsZXM6IEFkZCBjYXN0cyB0byBjYWxscyB0byBmcmFnX3Zhci4KLQotCSogTWFrZWZpbGUuaW4gKG02OGstcGFyc2UuYyk6IERlcGVuZCB1cG9uIGl0YmwtcGFyc2UuYywgdG8KLQlzZXJpYWxpemUgYSBwYXJhbGxlbCBtYWtlLgotCShpdGJsLXBhcnNlLmgpOiBTcGxpdCB0YXJnZXQgb3V0IGZyb20gaXRibC1wYXJzZS5jLgotCi1UaHUgTWFyIDIwIDEyOjQ4OjQ1IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG1vdG9yb2xhX29wZXJhbmQpOiBBbGxvdyAoemRpcmVnLEVYUFIpLgotCi0JKiBjb25maWcvdGUtZGVsdGEuaCAoQ09GRl9DT01NT05fQURERU5EKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGVjayBDT0ZGX0NPTU1PTl9BRERFTkQgd2hlbgotCXN0b3JpbmcgdGhlIHZhbHVlIG9mIGEgY29tbW9uIHN5bWJvbC4KLQotV2VkIE1hciAxOSAxMTozNzo1NyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZ2x1ZV9zeW1ib2xzKTogVW51c2VkIHZhcmlhYmxlIHN5bWJvbFAKLQlyZW1vdmVkLgotCShjcmF3bF9zeW1ib2xzKTogRG8gbm90IG1vZGlmeSBzeW1ib2xfcm9vdFAgYW5kIHN5bWJvbF9sYXN0UCBoZXJlOwotCXRoYXQgaXMgZG9uZSBieSBzeW1ib2xfcmVtb3ZlIGFuZCBzeW1ib2xfaW5zZXJ0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19MT0NBTCk6IFJldHVybiAwIGZvciBhIGRlYnVnZ2luZwotCXN5bWJvbC4KLQotV2VkIE1hciAxOSAxMTowNjoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBJbiAzMiBiaXQgbW9kZSwgd2hlbiBub3QKLQlkZWFsaW5nIHdpdGggYSA2NCBiaXQgbnVtYmVyLCBwZXJtaXQgdGhlIHVwcGVyIDMyIGJpdHMgdG8gYmUgc2V0Ci0JZXZlbiBpZiBiaXQgMzEgaXMgbm90IHNldC4KLQotVHVlIE1hciAxOCAyMzozMDoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAiZXF1aXYiLgotCShzX3NldCk6IEhhbmRsZSAuZXF1aXYgYmFzZWQgb24gYXJndW1lbnQuCi0JKiBkb2MvYXMudGV4aW5mbyAoRXF1aXYpOiBOZXcgbm9kZSB0byBkb2N1bWVudCAuZXF1aXYuCi0JKEVycik6IE5ldyBub2RlIHRvIGRvY3VtZW50IC5lcnIuCi0KLVR1ZSBNYXIgMTggMTU6NTA6MTMgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZCBmdW5jdGlvbiBwcm90b3R5cGVzLgotCSogYXMuYyAoc2hvd191c2FnZSwgcGFyc2VfYXJncyk6IE1ha2Ugc3RhdGljLgotCSogZnJhZ3MuaCAoZnJhZ19hbGxvYyk6IERlY2xhcmUuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IERvbid0IGRlY2xhcmUgZnJhZ19hbGxvYy4KLQkqIHN5bWJvbHMuYyAoZG9sbGFyX2xhYmVsX2luc3RhbmNlKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGxvbmcuCi0JKiBzeW1ib2xzLmggKHByaW50X3N5bWJvbF92YWx1ZSk6IERlY2xhcmUuCi0JKHByaW50X2V4cHIsIHByaW50X2V4cHJfMSwgcHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBEZWNsYXJlLgotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBEb24ndCBkZWNsYXJlIG1ha2VfZXhwcl9zeW1ib2wuCi0JKHJlbW92ZV9zdWJzZWdzLCByZWxheF9mcmFnKTogTWFrZSBzdGF0aWMuCi0JKiBjb25maWcvYXRvZi12YXguYyAoYXRvZl92YXhfc2l6ZW9mKTogQ2hhbmdlIGxldHRlciB0byBpbnQuCi0JKHdoYXRfa2luZF9vZl9mbG9hdCk6IExpa2V3aXNlLgotCShhdG9mX3ZheCk6IE1ha2Ugc3RhdGljLiAgQ2hhbmdlIHdoYXRfa2luZCB0byBpbnQuCi0JKG1kX2F0b2YpOiBDaGFuZ2Ugd2hhdF9zdGF0ZW1lbnRfdHlwZSB0byBpbnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9lY29mZl9zZXRfZXh0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh2YXhfbWRfYXRvZik6IERlY2xhcmUuCi0JKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZSBhbmQgdmF4X21kX2F0b2YuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzZXRfMTZiaXRfY29kZV9mbGFnKTogTWFrZSBzdGF0aWMuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGFkZF9maXgpOiBDaGFuZ2Ugd2lkdGggdG8gaW50LgotCShpbnNlcnRfcmVnKTogQ2hhbmdlIHJlZ25hbWUgdG8gY29uc3QuCi0JKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZS4KLQkoZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSk6IERvbid0IGRlY2xhcmUuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9hdG9mKTogRG9uJ3QgZGVjbGFyZSBhdG9mX2llZWUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoY21wX3JlZ19lbnRyeSk6IENoYW5nZSBhcmdzIHRvIGNvbnN0IFBUUi4KLQkocGFyc2Vfa2V5d29yZF9hcmcpOiBDaGFuZ2UgbG9va3VwX2ZuIHRvIHRha2UgY29uc3QgYXJnLgotCShtZF9hdG9mKTogRG9uJ3QgZGVjbGFyZSBhdG9mX2llZWUuCi0JKiBjb25maWcvdGMtc3BhcmMuaDogQWRkIGlmZGVmIGZvciBtdWx0aXBsZSBpbmNsdXNpb24uCi0JKHRjX2FvdXRfcHJlX3dyaXRlX2hvb2spOiBEb24ndCBkZWNsYXJlLgotCi1Nb24gTWFyIDE3IDExOjIxOjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoYmZkX2FsbG9jX2J5X3NpemVfdCk6IERvbid0IGRlY2xhcmUuCi0JKiBNYW55IGZpbGVzOiBVc2UgeG1hbGxvYyByYXRoZXIgdGhhbiBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCi1TdW4gTWFyIDE2IDEzOjQ5OjIxIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogRG9uJ3QgY2FsbCBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4uCi0JKHN5bWJvbF9hcHBlbmQpOiBTZXQgc3lfbmV4dCBhbmQgc3lfcHJldmlvdXMgd2hlbiBhZGRpbmcgYSBzaW5nbGUKLQlzeW1ib2wgdG8gYW4gZW1wdHkgbGlzdC4gIENhbGwgZGVidWdfdmVyaWZ5X3N5bWNoYWluLgotCSh2ZXJpZnlfc3ltYm9sX2NoYWluKTogVXNlIGFzc2VydCwgbm90IGtub3cuCi0KLVNhdCBNYXIgMTUgMjA6Mjc6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE5FV1M6IE5vdGUgQmVPUyBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiAocHBjLSotYmVvcyk6IE5ldyB0YXJnZXQsIHVzZSBjb2ZmIGFzIG9iamVjdCBmb3JtYXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQkKLVNhdCBNYXIgMTUgMTk6MTQ6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UgZm9yIG91dAotCW9mIHJhbmdlIGJyYW5jaC4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmNpZXMgb24gb2JzdGFjay5oIHdoZXJlIG5lZWRlZC4KLQotRnJpIE1hciAxNCAxNTozMzozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogSGFuZGxlIHRoZQotCWNhc2Ugb2YgYSBzeW1ib2wgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbCB3aGVuIHVzaW5nIFNWUjRfUElDLgotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQX3NwYXJjKTogQWRkIG9wY29kZS9zcGFyYy5oLgotCi1UaHUgTWFyIDEzIDExOjIwOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIExJU1RJTkdfTkVXTElORSBiZWZvcmUKLQlIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgd2hlbiBoYW5kbGluZyBhbiBNUkkgbGluZSBsYWJlbC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9kYXRhKTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotCWFuZCBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShvYmpfZWxmX3RleHQsIG9ial9lbGZfcHJldmlvdXMpOiBMaWtld2lzZS4KLQotV2VkIE1hciAxMiAxMTo0MDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAoc3RydWN0IGVsZl9vYmpfc3kpOiBEZWZpbmUgaWYKLQlPQkpfTUFZQkVfRUxGLgotCShPQkpfU1lNRklFTERfVFlQRSk6IERlZmluZSBhcyBzdHJ1Y3QgZWxmX29ial9zeSBpZgotCU9CSl9NQVlCRV9FTEYuCi0JKiBjb25maWcvb2JqLWVsZi5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IERvbid0IGRlZmluZSBpZgotCU9CSl9TWU1GSUVMRF9UWVBFIGlzIGRlZmluZWQuCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChic3MpOiBJbXByb3ZlIGRlc2NyaXB0aW9uIG9mIC5ic3Mgc2VjdGlvbi4gIEluCi0JRUxGIG9yIENPRkYsIHlvdSBhcmUgcGVybWl0dGVkIHRvIHN3aXRjaCBpbnRvIHRoZSBzZWN0aW9uLgotCShDb21tKTogUmV3cml0ZSBkZXNjcmlwdGlvbiBvZiBjb21tb24gc3ltYm9scy4KLQkoTGNvbW0pOiBNZW50aW9uIHRoYXQgc29tZSB0YXJnZXRzIHBlcm1pdCBhIHRoaXJkIGFyZ3VtZW50LgotCi1UdWUgTWFyIDExIDAxOjEzOjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogRG9uJ3QgY2FsbCBTX0NMRUFSX0VYVEVSTkFMLgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hhbmdlIHR5cGUgb2YgbG9jYWwgdG8gaW50LiAgRnJvbSBBbGFuIE1vZHJhCi0JPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1Pi4KLQotCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IERvbid0IHVzZSBhIHNwZWNpYWwgbm9wCi0JYWxpZ25tZW50IGlmIGEgemVybyBmaWxsIHBhdHRlcm4gd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAoZXF1YWxzKTogQWx3YXlzIHBlcm1pdCByZWdpc3RlciBuYW1lcyB0byBiZSByZWRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZml4X2FkanVzdGFibGUpOiBQZXJtaXQgYSByZWxvYyBhZ2FpbnN0IGEKLQltaXBzMTYgc3ltYm9sIHRvIGJlIGFkanVzdGVkIGlmIGEgc3ltYm9sIGlzIGJlaW5nIHN1YnRyYWN0ZWQgZnJvbQotCWl0LgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zeW12ZXIpOiBDaGVjayBmb3IgZHVwbGljYXRlIG9yCi0JaWxsZWdhbCBzeW1ib2wgdmVyc2lvbiBuYW1lcy4KLQkoZWxmX2Zyb2Jfc3ltYm9sKTogQ2hlY2sgZm9yIGV4dGVybmFsIGRlZmF1bHQgdmVyc2lvbnMuCi0KLVN1biBNYXIgIDkgMjM6NDk6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogY29uZmlnL29iai1lbGYuaCAoc3RydWN0IGVsZl9vYmpfc3kpOiBEZWZpbmUuCi0JKE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lIHRvIGVsZl9vYmpfc3kgc3RydWN0LiAgQ2hhbmdlIGFsbAotCXVzZXJzLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zeW12ZXIpOiBKdXN0IHJlY29yZCB0aGUgbmFtZS4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IEluaXRpYWxpemVkIHZlcnNpb25lZF9uYW1lIGZpZWxkLgotCShlbGZfZnJvYl9zeW1ib2wpOiBJZiB0aGVyZSBpcyBhIHZlcnNpb25lZF9uYW1lLCBlaXRoZXIgcmVuYW1lIHRoZQotCXN5bWJvbCwgb3IgYWRkIGFuIGFsaWFzIHdpdGggdGhhdCBuYW1lLgotCi1UaHUgTWFyICA2IDEzOjU1OjMyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfcmVsYXhfdGFibGUpOiBEZWZpbmUuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEltcGxlbWVudC4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgcmVsYXhhYmxlIG9wZXJhbmRzL2luc3RydWN0aW9ucyBjb3JyZWN0bHkuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogSW1wbGVtZW50LgotCSogY29uZmlnL3RjLW1uMTAzMDAuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBGaXggdHlwb3MuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgdXNlIGFueSBNTjEwMzAwIHNwZWNpZmljCi0JcmVsb2NzIGFueW1vcmUuICBUd2VhayBmeF9vZmZzZXQgZm9yIHBjLXJlbGF0aXZlIHJlbG9jcy4KLQotV2VkIE1hciAgNSAxNTo0NjoxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmQuYyAoc19pZmMpOiBDYWxsIG1yaV9jb21tZW50X2ZpZWxkIGFuZCBtcmlfY29tbWVudF9lbmQgd2hlbgotCWluIE1SSSBtb2RlLgotCi1UdWUgTWFyICA0IDE5OjM0OjIxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJzZWN0IiBhbmQgInNlY3Rpb24iCi0JcHNldWRvLW9wcy4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9iZWdpbik6IERlY2xhcmUgZXh0ZXJuYWwgdmFyaWFibGUKLQljb2ZmX2ZsYWdzIGFuZCBpbnNlcnQgYW4gRl9BUjMyV1IgYml0IGludG8gaXQuCi0KLVR1ZSBNYXIgIDQgMTA6MDE6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGVxdWFscyk6IEFkZCByZWFzc2lnbiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKiByZWFkLmggKGVxdWFscyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotU2F0IE1hciAgMSAwMTowNDowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogRG9uJ3QgYXNzdW1lIHRoYXQgd2UKLQljYW4gcmVseSBvbiB0aGUgZnJhZyBhZGRyZXNzIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZnJhZyBpcwotCWVhcmxpZXIgb3IgbGF0ZXIuCi0KLUZyaSBGZWIgMjggMTQ6NDA6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5oIChMT0NBTF9MQUJFTCk6IE9ubHkgZGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShTX0xPQ0FMX05BTUUpOiBMaWtld2lzZS4KLQkoRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lIHVuY29uZGl0aW9uYWxseS4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDYWxsIGJmZF9pc19sb2NhbF9sYWJlbCwgbm90IExPQ0FMX0xBQkVMLCBpZgotCUJGRF9BU1NFTUJMRVIuCi0JKFNfSVNfTE9DQUwpOiBDYWxsIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCBub3QgTE9DQUxfTEFCRUwuCi0JKiBjb25maWcvdGMtKi5oOiBPbmx5IGRlZmluZSBMT0NBTF9MQUJFTCBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQlEb24ndCBkZWZpbmUgRkFLRV9MQUJFTF9OQU1FLgotCSogY29uZmlnL3RlLWljOTYwLmg6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWZpbmUuCi0JKG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19sb2NhbF9sYWJlbCk6IFJlbW92ZS4KLQotCSogY29uZmlnL3RlLXNjbzM4Ni5oOiBSZW1vdmU7IG5vdCB1c2VkLgotCi1UaHUgRmViIDI3IDE1OjM5OjE2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBhbGlnbiBwc2V1ZG8gb3AgdG8gZG8KLQlieXRlIGFsaWdubWVudCByYXRoZXIgdGhhbiBwb3dlci1vZi10d28gYWxpZ25tZW50IHRoYXQgaXMgdGhlCi0JR0FTIGRlZmF1bHQuCi0KLVRodSBGZWIgMjcgMTM6Mjk6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBhIHJlbG9jIHdpZHRoIG9mICdXJy4KLQotCSogZ2FzcC5jIChoYXNoX2FkZF90b19zdHJpbmdfdGFibGUpOiBDb3JyZWN0IG1pc3NwZWxsaW5nIGluIGVycm9yCi0JbWVzc2FnZSwgYW5kIGFkZCBuZXdsaW5lLgotCShwcm9jZXNzX2ZpbGUpOiBEb24ndCBwcm9jZXNzIGFzc2lnbm1lbnRzIGluIHRoZSBsYWJlbCBpZiB0aGlzIGlzCi0JYSBlcXUgb3IgYXNzaWduIHBzZXVkby1vcC4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiBTd2FwIGZpcnN0IGFyZ3VtZW50IHRvIGRvX2Fzc2lnbiBmb3IgS19BU1NJR04KLQlhbmQgS19FUVUsIHRvIG1hdGNoIGRvY3VtZW50YXRpb24uCi0KLVRodSBGZWIgMjcgMTI6MDA6MDMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogQWRkICdyJyBzZWN0aW9uIGF0dHJpYnV0ZQotCXRvIGRlbm90ZSByZWFkLW9ubHkgZGF0YSBzZWN0aW9ucy4KLQotVGh1IEZlYiAyNyAwMDoyNjozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogU2V0IEJTRl9PQkpFQ1QgaW4gZmxhZ3MuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBMaWtld2lzZSwgaWYgQkZEX0FTU0VNQkxFUi4KLQotCSogZXhwci5jIChvcGVyYW5kKTogU2ltcGxpZnkgMGIgaGFuZGxpbmcuICBEb24ndCB0cmVhdCAwYiBhcyBhCi0JYmluYXJ5IG51bWJlciBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgJysnIG9yICctJy4KLQotV2VkIEZlYiAyNiAyMDo0NzoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKEZMVF9DSEFSUyk6IENoYW5nZSBmcm9tICJkRCIgdG8gImZGIi4KLQkoZmluZF9vcGNvZGUpOiBNYXRjaCBvcGVyYW5kcyB0aGF0IGNhbiBiZSBmbG9hdHMuCi0JKGJ1aWxkX2luc24pOiBIYW5kbGUgT19iaWcgKGZsb2F0KSBleHByZXNzaW9ucyBhbmQgYnVpbGQKLQljb3JyZWN0IG9wY29kZS4KLQotV2VkIEZlYiAyNiAxODoxOTowMCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotKi1sbmV3cyopOiBOZXcgdGFyZ2V0LCBhbHNvIG1ha2UgZW1wdHkKLQllbXVsYXRpb24gbGlzdCBmb3IgdGhpcyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFVwZGF0ZS4KLQkqIHRjLW1pcHMuYyAoRUNPRkZfTElUVExFX0ZPUk1BVCk6IERlZmluZS4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogVXNlLgotCSogdGUtbG5ld3MuaDogTmV3IGZpbGUuCi0KLVdlZCBGZWIgMjYgMTU6MzM6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChmaW5kX29wY29kZSwgYnVpbGRfaW5zbik6IENoYW5nZXMgdG8gbWF0Y2gKLQlvcGVyYW5kcyB3aXRoIDptIG9yIDpzIG1vZGlmaWVycyBhbmQgZ2VuZXJhdGUgdGhlIHJpZ2h0IG9wY29kZXMKLQlmb3IgdGhlbS4KLQotV2VkIEZlYiAyNiAxMTo1NjoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oKTogVXNlICQoQklTT04pIGFuZAotCSQoQklTT05GTEFHUyksIG5vdCAkKFlBQ0MpIGFuZCAkKFlBQ0NGTEFHUykuCi0KLVR1ZSBGZWIgMjUgMjI6MDI6MjMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5zdHJpbmcpOiBVc2VsZXNzIGxvY2FsIGRlY2xhcmF0aW9uIG9mCi0JY3JhY2tfb3BlcmFuZCByZW1vdmVkLgotCSogZXhwci5oIChleHByZXNzaW9uUyk6IENoYW5nZWQgdHlwZSBvZiBYX29wIGZpZWxkIHRvIG9wZXJhdG9yVCBpZgotCV9fR05VQ19fLgotCi1UdWUgRmViIDI1IDEzOjE3OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT46Ci0JKiBjb25maWd1cmUuaW46IEFkZCBpMzg2Y29mZiBhbmQgaTM4NmVsZiB0byBlbXVsYXRpb24gbGlzdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGFzLmMgKGkzODZjb2ZmLCBpMzg2ZWxmKTogRGVjbGFyZS4KLQkqIG9iai5oIChjb2ZmX2Zvcm1hdF9vcHMpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKE9CSl9IRUFERVIpOiBEZWZpbmUuCi0JKGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayk6IFJlbmFtZSBmcm9tIG9ial9zeW1ib2xfbmV3X2hvb2suCi0JKGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayk6IFJlbmFtZSBmcm9tIG9ial9yZWFkX2JlZ2luX2hvb2suCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgInZlcnNpb24iLgotCShjb2ZmX3BvcF9pbnNlcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobm9fZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfZm9ybWF0X29wcyk6IE5ldyB2YXJpYWJsZS4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX29ial9zeW1ib2xfbmV3X2hvb2spOiBEZWNsYXJlLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogRGVmaW5lLgotCShjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2spOiBEZWNsYXJlLgotCShvYmpfcmVhZF9iZWdpbl9ob29rKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuaCAoaTM4Nl90YXJnZXRfZm9ybWF0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IENoZWNrIE9CSl9NQVlCRV9FTEYgYXMgd2VsbCBhcyBPQkpfRUxGOyBjaGVjawotCU9VVFBVVF9GTEFWT1Igd2hlbiBhcHByb3ByaWF0ZS4KLQkoaTM4Nl90YXJnZXRfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLgotCSogTWFrZWZpbGUuaW4gKG9iai1jb2ZmLm8pOiBOZXcgdGFyZ2V0LgotCShlLWkzODZjb2ZmLm8sIGUtaTM4NmVsZi5vKTogTmV3IHRhcmdldHMuCi0KLQlGcm9tIFN0ZXBoZW4gV2lsbGlhbXMgPHN0ZXZlQGljYXJ1cy5pY2FydXMuY29tPjoKLQkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUgaWYgT0JKX0NPRkYuCi0JKF90Y19nZXRfYmFsX29mX2NhbGwpOiBEb24ndCBkZWNsYXJlLgotCSh0Y19nZXRfYmFsX29mX2NhbGwpOiBEZWNsYXJlIGFzIGZ1bmN0aW9uLCBkb24ndCBkZWZpbmUgYXMgbWFjcm8uCi0JKiBjb25maWcvdGMtaTk2MC5jICh0Y19zZXRfYmFsX29mX2NhbGwpOiBJZiBPQkpfQ09GRiwgc3RvcmUgYmFsUAotCWluIHN5X3RjIGZpZWxkLCBub3QgeF9iYWxudHJ5IGZpZWxkLgotCSh0Y19nZXRfYmFsX29mX2NhbGwpOiBSZW5hbWUgZnJvbSBfdGNfZ2V0X2JhbF9vZl9jYWxsLiAgQ2hhbmdlCi0JcmV0dXJuIHR5cGUgdG8gc3ltYm9sUyAqLiAgSWYgT0JKX0NPRkYsIHJldHJpZXZlIHZhbHVlIGZyb20gc3lfdGMKLQlmaWVsZCwgbm90IHhfYmFsbnRyeSBmaWVsZC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogUGVybWl0IGEgLm5vdGUgc2VjdGlvbiB0bwotCWhhdmUgdGhlIFNIRl9BTExPQyBhdHRyaWJ1dGUuCi0KLQkqIE1ha2VmaWxlLmluICgkKE9CSlMpKTogRG9uJ3QgZGVwZW5kIHVwb24gJChJVF9IRFJTKS4KLQkoVEFSR19DUFVfREVQX21pcHMpOiBEZXBlbmQgdXBvbiAkKHNyY2RpcikvaXRibC1vcHMuaC4KLQkoaXRibC1sZXgubyk6IERlcGVuZCB1cG9uIGl0YmwtcGFyc2UuaC4KLQotCSogaXRibC1wYXJzZS55ICh5eWVycm9yKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGludC4gIENoYW5nZSB0bwotCXVzZSBvbGQgc3R5bGUgZnVuY3Rpb24gZGVjbGFyYXRpb24uCi0KLQkqIE1ha2VmaWxlLmluIChpdGJsLWxleC5vKTogUmVtb3ZlIC1XYWxsLgotCShpdGJsLXBhcnNlLm8pOiBMaWtld2lzZS4KLQotCSogY29uZC5jIChzX2lmZGVmKTogSWYgd2Ugc2hvdWxkIG9taXQgY29uZGl0aW9uYWxzIGZyb20gbGlzdGluZ3MsCi0JY2FsbCBsaXN0aW5nX2xpc3QuCi0JKHNfaWYsIHNfaWZjLCBzX2VuZGlmLCBzX2Vsc2UsIHNfaWZlcXMpOiBMaWtld2lzZS4KLQkqIGxpc3RpbmcuYyAobGlzdF9pbmZvX3N0cnVjdCk6IEFkZCBFRElDVF9OT0xJU1RfTkVYVC4KLQkobGlzdGluZ19saXN0aW5nKTogSGFuZGxlIEVESUNUX05PTElTVF9ORVhULgotCShsaXN0aW5nX2xpc3QpOiBBbiBhcmd1bWVudCBvZiAyIG1lYW5zIEVESUNUX05PTElTVF9ORVhULgotCSogbGlzdGluZy5oIChMSVNUSU5HX05PQ09ORCk6IERlZmluZS4KLQkoTElTVElOR19TS0lQX0NPTkQpOiBEZWZpbmUuCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiBjIGFzIGEgc3Vib3B0aW9uIG9mIC1hLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIGMgYXMgYSBzdWJvcHRpb24gb2YgLWEuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLWFsYy4KLQotTW9uIEZlYiAyNCAyMzozNDoxNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBSX0FCUyB0eXBlIGZpeHVwcy4KLQotTW9uIEZlYiAyNCAxODoyNzo0MyAxOTk3ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLnN5bXZlci4KLQotTW9uIEZlYiAyNCAxNToxOTo1NyAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQ2hhbmdlIHByZV9kZWZpbmVkX3JlZ2lzdGVycyB0byAKLQlkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIGFuZCByZWdfbmFtZV9jbnQgdG8gZDEwdl9yZWdfbmFtZV9jbnQuCi0KLU1vbiBGZWIgMjQgMTA6NDA6NDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBGaXggdHlwbyBpbiBjb21tZW50IHNlY3Rpb24uCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGVudHJ5IGZvciBic3MsIHdoaWNoIHRha2VzCi0gCWFuIGFkZGl0aW9uYWwgYWxpZ25tZW50IGFyZ3VtZW50LgotCShmaW5kX29wY29kZSk6IEFsbG93IE9fc3ltYm9sIHJlbG9jcyBmb3IgYW55IDMyIGJpdCBmaWVsZCwgbm90IGp1c3QKLSAJYmFzZSByZWxhdGl2ZSBvbmVzLgotCShidWlsZF9pbnNuKTogSGFuZGxlIE9fc3ltYm9sIHJlbG9jcyBmb3IgYW55IDMyIGJpdCBmaWVsZCwgbm90IGp1c3QKLSAJYmFzZSByZWxhdGl2ZSBvbmVzLgotCi1Nb24gRmViIDI0IDAyOjIzOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBkZXBlbmRhbmNpZXMgb24gaXRibC1jcHUuaC4KLQkqIGFzLmM6IERlZmluZSBzdHVicyBmb3IgaXRibF9wYXJzZSBhbmQgaXRibF9pbml0IGlmIEhBVkVfSVRCTF9DUFUgCi0JaXMgbm90IGRlZmluZWQuCi0KLU1vbiBGZWIgMjQgMDI6MDM6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBpdGJsLW9wcy5oOiBJbmNsdWRlIGFzLmguCi0KLU1vbiBGZWIgMjQgMDE6MDQ6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBhcy5jOiBSZW1vdmUgLXQgb3B0aW9uLgotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IE1vdmUgaXRibC1jcHUuaCB0byBtaXBzIHNwZWNpZmljIGNvbmZpZ3VyZS4KLQkqIGl0Ymwtb3BzLmg6IEluY2x1ZGUgaXRibC1jcHUuaCBvbmx5IGlmIEhBVkVfSVRCTF9DUFUgaXMgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSBIQVZFX0lUQkxfQ1BVLgotCi1TdW4gRmViIDIzIDE4OjAxOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaXRibC1vcHMuYzogRG9uJ3QgZGVmaW5lIERFQlVHLgotCi1TdW4gRmViIDIzIDE3OjQ5OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBpdGJsLXRlc3QuYyB0byByZWZsZWN0IGl0cyBuZXcgbG9jYXRpb24uCi0KLVN1biBGZWIgMjMgMTU6NTA6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBpdGJsLW9wcy5jOiBBZGQgdGVzdCBmb3IgaXRibF9oYXZlX2VudHJpZXMuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBSZW1vdmUgdGVzdCBmb3IgaXRibF9oYXZlX2VudHJpZXMuCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzIHRvIG1pcHNfaW5pdF9hZnRlcl9hcmdzLgotCi1TdW4gRmViIDIzIDE4OjEzOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IFJlbW92ZSBpdGJsLXBhcnNlLnksIGl0YmwtbGV4LmwsIGFuZAotCWl0Ymwtb3BzLmMuICBBZGQgaXRibC1wYXJzZS5jIGFuZCBpdGJsLWxleC5jLgotCShMRVgsIExFWEZMQUdTKTogRGVmaW5lLgotCSogaXRibC1vcHMuYyAoYXBwZW5kX2luc25zX2FzX21hY3Jvcyk6IFJlbW92ZSBib2d1cyBBU1NFUlQuCi0KLVNhdCBGZWIgMjIgMjE6MjU6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBpdGJsLXBhcnNlLnk6IEZpeCBpbmRlbnRhdGlvbiBtaXN0YWtlcyBmcm9tIGluZGVudCBwcm9ncmFtLgotCSogaXRibC1sZXgubDogRml4IGluZGVudGF0aW9uIG1pc3Rha2VzIGZyb20gaW5kZW50IHByb2dyYW0uCi0JKiBpdGJsLW9wcy5oOiBBZGQgaW5jbHVkZSBmb3IgYW5zaWRlY2wuaC4KLQlBZGQgUEFSQU1TIGFyb3VuZCBmdW5jdGlvbiBhcmd1bWVudHMuCi0JQWRkIGRlY2xhcmF0aW9uIGZvciBpdGJsX2hhdmVfZW50cmllcy4KLQkqIGl0Ymwtb3BzLmM6IEFkZCBQQVJBTVMgYXJvdW5kIGZ1bmN0aW9uIGFyZ3VtZW50cy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgaXRibCBidWlsZCBydWxlcy4KLQlBZGQgZGVwZW5kYW5jaWVzIGZvciBpdGJsIGZpbGVzIHRvIG1pcHMgdGFyZ2V0LgotCSogYXMuYzogQWRkIGl0Ymwgc3VwcG9ydC4KLQlBZGQgbmV3IG9wdGlvbiAiLS1pbnN0dGJsIiBmb3IgZHluYW1pY2FsbHkgZXh0ZW5kaW5nIGluc3RydWN0aW9uIHNldC4KLQkqIGFzLmg6IERlY2xhcmUgaW5zdHRibF9maWxlX25hbWU7Ci0JdGhlIG5hbWUgb2YgZmlsZSBkZWZpbmluZyBleHRlbnNpb25zIHRvIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzZXQgCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogQWRkIGl0YmwtcGFyc2UubywgaXRibC1sZXgubywgYW5kIAotCWl0Ymwtb3BzLm8gdG8gZXh0cmFfb2JqZWN0cyBmb3IgbWlwcyBjb25maWd1cmF0aW9uLgotCUFkZCBpbmNsdWRlIGZpbGUgbGluayBmcm9tIGl0YmwtY3B1LmggdG8gCi0JY29uZmlnL2l0YmwtJHt0YXJnZXRfY3B1X3R5cGV9LmguCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBbGxvdyBjb3B6IGluc3RydWN0aW9ucy4KLQlBZGQgbm90ZXMgZm9yIGZ1dHVyZSBhZGRpdGlvbnMgdG8gdGhlIGl0Ymwgc3VwcG9ydC4KLQlBZGQgZGVidWcgbWFjcm9zLgotCShtYWNybyk6IENhbGwgaXRibF9hc3NlbWJsZSB0byBhc3NlbWJsZSBpdGJsIGluc3RydWN0aW9ucy4KLQlTZWUgaWYgYW4gdW5rbm93biByZWdpc3RlciBpcyBzcGVjaWZpZWQgaW4gYW4gaXRibCBlbnRyeS4KLQotU2F0IEZlYiAyMiAyMDo1MzowMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBGaXggdHlwbyBpbiBtZF9zZWN0aW9uX2FsaWduCi0JZGVzY3JpcHRpb24uCi0JKiBjb25maWcvdGMtdGljODAuaCAoTkVFRF9GWF9SX1RZUEUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdGljODAuYyAoZmluZF9vcGNvZGUpOiBBZGQgY29kZSB0byBzdXBwb3J0IE9fc3ltYm9sCi0Jb3BlcmFuZHMuCi0JKGJ1aWxkX2luc24pOiBHcmFiIGEgZnJhZyBlYXJseSBzbyB3ZSBjYW4gdXNlIHRoZSBhZGRyZXNzIGluCi0gCWZpeHVwcy4gIFRha2Ugb25lJ3MgY29tcGxlbWVudCBvZiBCSVROVU0gdmFsdWVzIGJlZm9yZSBpbnNlcnRpb24KLSAJaW4gb3Bjb2RlLiAgQWRkIGNvZGUgdG8gc3VwcG9ydCBPX3N5bWJvbCBvcGVyYW5kcy4KLQkobWRfYXBwbHlfZml4KTogUmVwbGFjZSB1bmltcGxlbWVudGVkIHdhcm5pbmcgd2l0aCBpbXBsZW1lbnRhdGlvbi4KLQkobWRfcGNyZWxfZnJvbSk6IERpdHRvLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSk6IERpdHRvLgotCi1GcmkgRmViIDIxIDE0OjM0OjMxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IE5ldyBmdW5jdGlvbi4gCi0JKiBjb25maWcvdGMtZDMwdi5oOiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBSZXR1cm4gMCBpZgotICAgICAgICByZWxvY2F0aW9uIGlzIGluIGRpZmZlcmVudCBzZWN0aW9uLgotCi1GcmkgRmViIDIxIDEwOjA4OjI1IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogdGMtbWlwcy5jIChtaXBzX2lwKTogSWYgY29uZmlndXJlZCBmb3IgYW4gZW1iZWRkZWQgRUxGIHN5c3RlbSwKLQlkb24ndCBzZXQgdGhlIHNlY3Rpb24gYWxpZ25tZW50IHRvIDIqKjQuCi0KLUZyaSBGZWIgMjEgMTE6NTU6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgJyonLgotCi0JKiBhcHAuYyAoTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8yTkQpOiBEb24ndCBkZWZpbmUuCi0JKGRvX3NjcnViX2JlZ2luKTogRG9uJ3Qgc2V0IGxleFsnKiddLgotCShkb19zY3J1Yl9jaGFycyk6IFdoZW4gaGFuZGxpbmcgTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1QsIGRvbid0Ci0gCWNoZWNrIGZvciBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzJORC4gIEluc3RlYWQsIGp1c3QgY2hlY2sgZm9yCi0JYSBsaXRlcmFsICcqJy4KLQotCSogY29uZmlndXJlLmluOiBTZXQgZW09c3ZyNCBmb3IgbTY4ay0qLXN5c3Y0Ki4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1zdnI0Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19jb21tZW50X2NoYXJzKTogT25seSBpbmNsdWRlIGAjJyBpZgotCVRFX1NWUjQgb3IgVEVfREVMVEEuCi0KLVRodSBGZWIgMjAgMjI6MjQ6MzkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlCi0Jc2hvcnQgY29uZGl0aW9uYWwgYnJhbmNoIGFyb3VuZCBhIGxvbmcgdW5jb25kaXRpb25hbCBicmFuY2guCi0KLVRodSBGZWIgMjAgMTM6NTY6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfbG4gW2JvdGggdmVyc2lvbnNdKTogQ2FsbAotCW5ld19sb2dpY2FsX2xpbmUuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZml4X25ld19hcm0pOiBVc2UgbWFrZV9leHByX3N5bWJvbCB0byBoYW5kbGUgYQotCWNvbXBsZXggZXhwcmVzc2lvbi4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IElmIGJvdGggbGVmdCBhbmQgcmlnaHQKLQlvcGVyYW5kcyBhcmUgdW5kZWZpbmVkLCB3YXJuIGFib3V0IGJvdGggb2YgdGhlbS4KLQotV2VkIEZlYiAxOSAwMDo1MzoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9wc2V1ZG9fdGFibGUpOiBBZGQgInN5bXZlciIuCi0JKG9ial9lbGZfc3ltdmVyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogQ29weSB0aGUgc3Rfb3RoZXIKLQlmaWVsZC4KLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IE1ha2UgdHlwZSBhbmQgcHJpbnRmIGZvcm1hdCBhZ3JlZS4KLQotCSogcmVhZC5jIChnZXRfbGluZV9zYik6IERvbid0IGVuZCB0aGUgbGluZSBvbiBhIHNlbWljb2xvbiBpbnNpZGUgYQotCXN0cmluZy4KLQotVHVlIEZlYiAxOCAxODo0Mjo1MSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYywgY29uZmlnL3RjLWQzMHYuaDogTmV3IGZpbGVzLgotCi0gCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCQotCSogY29uZmlndXJlLmluOiBBZGQgY2FzZSBmb3IgZDMwdi4KLQotU3VuIEZlYiAxNiAxNzo0NzoyOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmggKG1kX29wZXJhbmQpOiBEZWZpbmUgd2l0aCBhIG51bGwgZXhwYW5zaW9uLAotCWxpa2UgYWxsIHRoZSBvdGhlciB0YXJnZXRzLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IEFkZCBtaXNzaW5nIHdvcmQgaW4gCi0JbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgZGVzY3JpcHRpb24uICBGaXggdHlwbyBpbiBtZF9jb252ZXJ0X2ZyYWcKLQlkZXNjcmlwdGlvbi4KLQkqIGNvbmZpZy90Yy10aWM4MDogTWlub3IgY29tbWVudCBhZGRpdGlvbnMvY2hhbmdlcy4KLQkKLUZyaSBGZWIgMTQgMTg6MDk6NTkgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoTE9DQUxfTEFCRUwpOiBNYWNybyByZWRlZmluZWQgaWYgVEVfREVMVEEuCi0JKHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSk6IE1hY3JvIGRlZmluZWQgaWYgVEVfREVMVEEuCi0gCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2RlZik6IFVzZQotCXRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBpZiBkZWZpbmVkLgotCShvYmpfY29mZl90YWcsIG9ial9jb2ZmX3ZhbCk6IExpa2V3aXNlLgotCSogZXhwci5jIChvcGVyYW5kKTogUmVqZWN0ICd+JyBhcyBvcGVyYXRvciBpZiBpc19uYW1lX2JlZ2lubmVyLgotCi1GcmkgRmViIDE0IDE3OjI0OjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIG5vdGVzIGZyb20gUGV0ZXIgRXJpa3Nzb24gPHBldGVyQGlmbS5saXUuc2U+LiAgVGhlIHRhcmdldAotCWRvZXMgbm90IGFjdHVhbGx5IHdvcmssIHRob3VnaDoKLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni1zZXF1ZW50LWJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RjLWR5bml4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWkzODYuaDogRGVmaW5lIFRBUkdFVF9GT1JNQVQgaWYgVEVfRFlOSVguCi0KLQkqIHJlYWQuYyAoZG9fYWxpZ24pOiBBZGQgbWF4IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQlSZW1vdmUgdXNlbGVzcyBzdGF0aWMgdmFyaWFibGVzLgotCShzX2FsaWduKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4gIERvIGNvbW1vbiBwb3J0aW9uIG9mCi0Jc19hbGlnbl9ieXRlcyBhbmQgc19hbGlnbl9wdHdvLgotCShzX2FsaWduX2J5dGVzLCBzX2FsaWduX3B0d28pOiBKdXN0IGNhbGwgc19hbGlnbi4KLQkqIGZyYWdzLmMgKGZyYWdfYWxpZ24pOiBBZGQgbWF4IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZnJhZ19hbGlnbl9wYXR0ZXJuKTogTGlrZXdpc2UuCi0JKiBmcmFncy5oIChmcmFnX2FsaWduLCBmcmFnX2FsaWduX3BhdHRlcm4pOiBVcGRhdGUgZGVjbGFyYXRpb25zLgotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IExpbWl0IGFsaWdubWVudCBjaGFuZ2UgdG8gZnJfc3VidHlwZS4KLQlGaXggc29tZSB0eXBlcyB0byBiZSBhZGRyZXNzVC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzaXplX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotaWVlZS5jIChzaXplX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX2RvX2FsaWduKTogQWRkIG1heCBwYXJhbWV0ZXIuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW04OGsuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBhcy5oOiBJbXByb3ZlIGNvbW1lbnRzIG9uIHJzX2FsaWduIGFuZCByc19hbGlnbl9jb2RlLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBhbGlnbm1lbnQgYXJndW1lbnRzLgotCSogZG9jL2ludGVybmFscy50ZXhpIChGcmFncyk6IERvY3VtZW50IHVzZSBvZiBmcl9zdWJ0eXBlIGZpZWxkIGZvcgotCXJzX2FsaWduIGFuZCByc19hbGlnbl9jb2RlLgotCi1GcmkgRmViIDE0IDE1OjU2OjA2IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBDaGFuZ2VkIG9wY29kZSBwYXJzaW5nLgotCi1UaHUgRmViIDEzIDIwOjAyOjE2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcve3RjLWFscGhhLmgsIHRjLWQxMHYuaCwgdGMtZ2VuZXJpYy5oLCB0Yy1pOTYwLmgsCi0JdGMtbW4xMDIwMC5oLCB0Yy1tbjEwMzAwLmgsIHRjLXNoLmgsIHRjLXZheC5oLCB0Yy13NjUuaH06Ci0JQWRkIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiB6ZXJvIGZvciBUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQkqIGNvbmZpZy97dGMtYXJtLmgsIHRjLWhwcGEuaCwgdGMtaTM4Ni5oLCB0Yy1taXBzLmgsIHRjLW5zMzJrLmgsCi0gCXRjLXBwYy5oLCB0Yy1zcGFyYy5ofTogTW92ZSBkZWZpbml0aW9uIG9mIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0JdG8gYSBsb2NhdGlvbiBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBpbmNsdWRlIGZpbGVzLgotCSogY29uZmlnL3RjLWkzODYuYzogUmVtb3ZlIG1pc2xlYWRpbmcgY29tbWVudC4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBBZGQgZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24KLQltZF91bmRlZmluZWRfc3ltYm9sLgotCSogY29uZmlnL3RjLXRpYzgwLmM6IEFkZCBjb2RlIHRvIGluc2VydCBwcmVkZWZpbmVkIHN5bWJvbHMgaW50byB0aGUKLQlzeW1ib2wgdGFibGUgc28gdGhleSBjYW4gYmUgcGFyc2VkIGJ5IHRoZSBzdGFuZGFyZCBleHByZXNzaW9uIHBhcnNlci4KLQlSZW1vdmUgY3VzdG9tIGNvZGUgdGhhdCB1c2UgdG8gcGFyc2UgdGhlbS4KLQkqIGNvbmZpZy90Yy10aWM4MC5oOiBNb3ZlIGRlZmluaXRpb24gb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLQl0byBhIGxvY2F0aW9uIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGluY2x1ZGUgZmlsZXMuCi0JCi1UaHUgRmViIDEzIDIxOjQ0OjE4IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBhcy5oOiBHTlUgYyBwcm92aWRlcyB1bmxpbmsoKSBmdW5jdGlvbi4KLQotCVVuaWZ5IHNlY3Rpb24gaGFuZGxpbmcgb24gb3BlblZNUy9BbHBoYToKLQkqIGNvbmZpZy90Yy1hbHBoYS5jKHNfYWxwaGFfbGluayk6IFJlbW92ZS4KLQkoc19hbHBoYV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCVJlbW92ZSBjYXNlLWhhY2tpbmcgb2Ygc3ltYm9scwotCUFkZCAuY29kZV9hZGRyZXNzIHBzZXVkby1vcC4KLQkoQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSKTogTmV3IHJlbG9jYXRpb24uCi0JKHNfYWxwaGFfY29kZV9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgotCShhbHBoYV9jdG9yc19zZWN0aW9uLCBhbHBoYV9kdG9yc19zZWN0aW9uKTogTmV3IHNlY3Rpb25zIGZvciBDKysKLQlzdGF0aWMgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzLgotCUFkZCBkZWJ1ZyBjb2RlIGZvciBjcmFzaCBkZWJ1Z3MsIHRvIGJlIHJlbW92ZWQgd2hlbiB0cmFjZWJhY2sgY29kZQotCWlzIGFkZGVkIHRvIG9iamVjdCBjb2RlLgotCShzX2FscGhhX25hbWUpOiBOZXcgZnVuY3Rpb24gZm9yIC5uYW1lIHBzZXVkby1vcC4KLQkoYWxwaGFfcHJpbnRfdG9rZW4pOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQgdG9rZW4gZXhwcmVzc2lvbnMgd2l0aAotCWFscGhhIHNwZWNpZmljIGV4dGVuc2lvbnMuCi0KLQkqIG1ha2VmaWxlLnZtczogQWxsb3cgY29tcGlsYXRpb24gd2l0aCBjdXJyZW50IGdjYyBzbmFwc2hvdC4KLQotVGh1IEZlYiAxMyAxNjoyOTowNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZG9jL01ha2VmaWxlLmluIChURVhJMkRWSSk6IFNldCB0byBqdXN0IG5hbWUgb2YgcHJvZ3JhbS4KLQkoRFZJUFMpOiBTZXQgdG8gZHZpcHMuCi0JKHBzLCBhcy5wcywgZ2FzcC5wcyk6IE5ldyB0YXJnZXRzLgotCShpbnRlcm5hbHMuaW5mbywgZ2FzcC5kdmksIGludGVybmFscy5kdmkpOiBTZXQgYm90aCBURVhJTlBVVFMKLSAJYW5kIE1BS0VJTkZPIGVudiB2YXJpYWJsZXMuCi0JKGludGVybmFscy5wcyk6IFVzZSBEVklQUyBtYWNyby4KLQkoY2xlYW4pOiBSZW1vdmUgY29yZSBhbmQgYmFja3VwIGZpbGVzLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIGZyb20gYnVpbGRpbmcgaW50ZXJuYWxzLgotCShjbGVhbi1kdmkpOiBEaXR0by4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoRnJhZ3MpOiBGaXggdHlwby4KLQkoR0FTIHByb2Nlc3NpbmcpOiBEaXR0by4KLQkoQ1BVIGJhY2tlbmQpOiBEaXR0by4KLQkqIGVjb2ZmLmMgKGluaXRfZmlsZSk6IFVzZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB2YWx1ZSBkaXJlY3RseS4KLQkqIG1wdy1jb25maWcuaW46IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiBhcyAxLgotCSogcmVhZC5jOiBSZW1vdmUgdWdseSBoYWNrIHRoYXQgZGVhbHQgd2l0aCBjb25maWcgZmlsZXMgbm90Ci0JY29ycmVjdGx5IGRlZmluaW5nIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCSh0YXJnZXRfYmlnX2VuZGlhbik6IFVzZSBUQVJHRVRfQllURVNfQklHX0VORElBTiBkaXJlY3RseS4KLQkqIGNvbmZpZy9hcm0tYmlnLm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMS4KLQkqIGNvbmZpZy9hcm0tbGl0Lm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMC4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDEuCi0JKiBjb25maWcvbWlwcy1saXQubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAwLgotCSogY29uZmlnL3BwYy1saXQubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAxLgotCSogY29uZmlnL3BwYy1zb2wubXQ6IFJlcGxhY2UgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4KLQl3aXRoIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGRlZmluZWQgdG8gMC4KLQkqIGNvbmZpZy90Yy1hcm0uaDogUmVtb3ZlIHVzZSBvZiBUQVJHRVRfQllURVNfTElUVExFX0VORElBTgotCWFuZCBzaW1wbGlmeS4gIFRlc3QgdmFsdWUgb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sIG5vdCBqdXN0Ci0Jd2hldGhlciBpdCBpcyBkZWZpbmVkIG9yIG5vdC4KLQkqIGNvbmZpZy90Yy1taXBzLmg6IFJlbW92ZSB1c2Ugb2YgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4uCi0JKiBjb25maWcvdGMtcHBjLmg6IFJlbW92ZSB1c2Ugb2YgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4KLQlhbmQgc2ltcGxpZnkuIFRlc3QgdmFsdWUgb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sIG5vdCBqdXN0Ci0Jd2hldGhlciBpdCBpcyBkZWZpbmVkIG9yIG5vdC4KLQkqIGNvbmZpZy90aWM4MC5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIHRvIGNvZmYtdGljODAuCi0JKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lIHRvIDAuCi0KLVRodSBGZWIgMTMgMTQ6NDA6MTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogQ29ycmVjdCB0ZXh0IGluIGFzX2ZhdGFsIGVycm9yIG1lc3NhZ2UsCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAtPiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLgotCi1UaHUgRmViIDEzIDE0OjQ4OjAzIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKExFWF9USUxERSk6IERlZmluZSBpZiBURV9ERUxUQS4KLQkqIHJlYWQuYyAoTEVYX1RJTERFKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShsZXhfdHlwZSk6IFVzZSBMRVhfVElMREUuCi0JKiBleHByLmMgKGdldF9zeW1ib2xfZW5kKTogQ2hlY2sgZmlyc3QgY2hhciB3aXRoIGlzX25hbWVfYmVnaW5uZXIsCi0Jbm90IGlzX3BhcnRfb2ZfbmFtZS4KLQotVGh1IEZlYiAxMyAxMTo0MDo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG93X3VzYWdlKTogQWRkIG1pc3NpbmcgYmFja3NsYXNoIGF0IGVuZAotCW9mIGNvbnRpbnVlZCBsaW5lLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IENvcnJlY3QgYmFzZSBhZGRyZXNzCi0JZm9yIGFuIGV4dGVuZGVkIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAocHJldl9ub3BfZnJhZyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHByZXZfbm9wX2ZyYWdfaG9sZHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcmV2X25vcF9mcmFnX3JlcXVpcmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJldl9ub3BfZnJhZ19zaW5jZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFwcGVuZF9pbnNuKTogSWYgd2UgYXJlbid0IHJlb3JkZXJpbmcsIGFuZCBwcmV2X25vcF9mcmFnIGlzIG5vdAotCU5VTEwsIGFuZCB3ZSBkb24ndCBuZWVkIGFueSBub3BzLCB0aGVuIGRlY3JlYXNlIHRoZSBzaXplIG9mCi0JcHJldl9ub3BfZnJhZy4gIERvbid0IGluc2VydCBub3BzIGJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb25zIGluCi0Jbm9yZW9yZGVyIHNlY3Rpb25zLiAgUmVtZW1iZXIgd2hldGhlciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb25zCi0Jd2hlcmUgaW4gbm9yZW9yZGVyIHNlY3Rpb25zIGV2ZW4gd2hlbiBub3QgcmVvcmRlcmluZy4KLQkobWlwc19ub19wcmV2X2luc24pOiBBZGQgcHJlc2VydmVyIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgUmVmZXIgcHJldl9ub3BfZnJhZyB2YXJpYWJsZXMgd2hlbiBhcHByb3ByaWF0ZS4KLQkobWlwc19lbWl0X2RlbGF5cyk6IFNldCB1cCBwcmV2X25vcF9mcmFnLgotCShzX21pcHNzZXQpOiBDbGVhciBwcmV2X25vcF9mcmFnIGlmIHJlb3JkZXJpbmcuCi0KLVdlZCBGZWIgMTIgMTQ6MzY6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFJlbW92ZSB1c2VsZXNzIGNvZGUgd2hpY2gKLQloYW5kbGVkIHN3YXBwaW5nIGEgbWlwczE2IGp1bXAgd2l0aCBhIG1pcHMxNiBpbnN0cnVjdGlvbiB3aXRoIGEKLQlyZWxvYy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogV2hlbiBkZWJ1Z2dpbmcsIHNldAotCW1pcHNfb3B0aW1pemUgdG8gMSwgbm90IDAuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEhhbmRsZSBhbiBleHRlbmQgb3BlcmFuZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobXlfZ2V0RXhwcmVzc2lvbik6IEluIG1pcHMxNiBtb2RlLCBpZiBpdCBsb29rcwotCWxpa2UgdGhlIGV4cHJlc3Npb24gd2FzIGJhc2VkIG9uIGAuJywgYWRqdXN0IHRoZSB2YWx1ZSBvZiB0aGUKLQlzeW1ib2wuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogV2FybiBhYm91dCBhbiBhdHRlbXB0IHRvIHB1dCBhbgotIAlleHRlbmRlZCBpbnN0cnVjdGlvbiBpbiBhIGRlbGF5IHNsb3Qgd2hlbiBub3QgcmVvcmRlcmluZy4KLQkobWRfY29udmVydF9mcmFnKTogV2FybiBpZiBhbiBleHRlbmRlZCBpbnN0cnVjdGlvbiBhcHBlYXJzIGluIGEKLQlkZWxheSBzbG90LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IEFkZCAiaW5zbiIuCi0JKHNfaW5zbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC5pbnNuLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IEFkZCB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgdG8gdGhlCi0Jc3ltYm9sIHRhYmxlLgotCShtaXBzMTZfaXApOiBGaXJzdCBwYXJzZSB0aGUgZXhwcmVzc2lvbiwgYW5kIHRoZW4gc2VlIHdoZXRoZXIgaXQKLQljYW1lIHVwIHdpdGggYSByZWdpc3RlciwgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGZpcnN0IHNlZSB3aGV0aGVyCi0Jd2UgYXJlIGxvb2tpbmcgYXQgYSByZWdpc3Rlci4KLQotVHVlIEZlYiAxMSAxNToxMzozOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmM6IE51bWVyb3VzIGNoYW5nZXMgYW5kIGFkZGl0aW9ucyB0byBmbGVzaAotCW91dCBmdW5jdGlvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkganVzdCBzdHVicywgYW5kIGZpeCBzb21lCi0JcHJvYmxlbXMgZm91bmQgdXNpbmcgdGhlIG5ldyBUSWM4MCB0ZXN0c3VpdGUgY2FzZXMuCi0KLVR1ZSBGZWIgMTEgMTU6NTI6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBIYW5kbGUgJWdwcmVsIG1vZGlmaWVyLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DX01JUFMxNl9HUFJFTC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBPdXRwdXQganVtcCBpbnN0cnVjdGlvbiBhcyBhCi0JcGFpciBvZiAyIGJ5dGUgaW5zdHJ1Y3Rpb25zLCByYXRoZXIgdGhhbiBhcyBhIHNpbmdsZSA0IGJ5dGUKLQlpbnN0cnVjdGlvbi4KLQotTW9uIEZlYiAxMCAyMjowNjowMCAxOTk3ICBEYXduIFBlcmNoaWsgIChkYXduQGN5Z251cy5jb20pCi0KLQkqIGl0Ymwtb3BzLmMsIGl0YmwtbGV4LmwsIGl0YmwtcGFyc2UueSwgaXRibC1vcHMuaCwKLQljb25maWcvaXRibC1taXBzLmg6IEFkZCBjb3B5cmlnaHQgbWVzc2FnZSBhbmQgZml4IGluZGVudGF0aW9uLgotCi1Nb24gRmViIDEwIDE4OjA5OjAwIDE5OTcgIERhd24gUGVyY2hpayAgKGRhd25AY3lnbnVzLmNvbSkKLQotCSogaXRibC1vcHMuYzogTmV3IGZpbGUuICBBZGQgc3VwcG9ydCBmb3IgZHluYW1pY2FsbHkgcmVhZCAKLQlpbnN0cnVjdGlvbiByZWdpc3RlcnMsIG9wY29kZXMgYW5kIGZvcm1hdHMuICBCdWlsZCBpbnRlcm5hbCB0YWJsZSAKLQlmb3IgbmV3IGluc3RydWN0aW9ucyBhbmQgcHJvdmlkZSBjYWxsYmFja3MgZm9yIGFzc2VtYmxlciBhbmQgCi0JZGlzYXNzZW1ibGVyLgotCSogaXRibC1sZXgubCwgaXRibC1wYXJzZS55OiBMZXggYW5kIHlhY2MgcGFyc2VycyBmb3IgaW5zdHJ1Y3Rpb24gCi0Jc3BlYyB0YWJsZS4KLQkqIGl0Ymwtb3BzLmg6IE5ldyBmaWxlLiAgSGVhZGVyIGZpbGUgZm9yIGl0Ymwgc3VwcG9ydC4KLQkqIGNvbmZpZy9pdGJsLW1pcHMuaDogTmV3IGZpbGUuICBNaXBzIHNwZWNpZmljIGRlZmluaXRpb25zIGZvcgotCWl0Ymwgc3VwcG9ydC4KLQotRnJpIEZlYiAgNyAwOTo1MjozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogSWYgYSBjb25zdGFudCBvcGVyYW5kIHdvbid0Ci0JZml0IGludG8gdGhlIGNvbnN0YW50IGZpZWxkIG9mIGEgcmVsYXhhYmxlIG9wZXJhbmQsIHRoZW4gaXQgZG9lcwotCW5vdCBtYXRjaC4KLQotVGh1IEZlYiAgNiAyMDowODoxMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVHJlYXQKLQlhIGpzciB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiBqdXN0IGxpa2UgYSBqc3IgdG8KLQlhbiB1bmRlZmluZWQgdGFyZ2V0LgotCi1UaHUgRmViICA2IDE2OjUyOjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY2F0aW9ucwotCWFnYWluc3QgYW55IG1pcHMxNiBzeW1ib2xzLCBub3QganVzdCBleHRlcm5hbGx5IHZpc2libGUgb25lcy4KLQkobWRfYXBwbHlfZml4KTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVdlZCBGZWIgIDUgMTE6MTE6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBBY2NlcHQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGluCi0JdGhlIG9wZXJhbmQgb2YgdGhlIGV4aXQgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBGZWIgIDQgMTQ6MTI6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSWYgd2UgbGVhdmUgYW4gZXF1YXRlZCBzeW1ib2wKLQlhcyBPX3N5bWJvbCwgY29weSBvdmVyIHRoZSBzZWdtZW50LgotCi1Nb24gRmViICAzIDEyOjM1OjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogSWYgd2UgYXJlbid0IGFkanVzdGluZyB0aGlzCi0JZml4dXAgdG8gYmUgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wsIGFkanVzdCB0aGUgdmFsdWUKLQlhY2NvcmRpbmdseS4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IGNoYW5nZSBYX2FkZF9udW1iZXIgZm9yCi0JYW4gZXF1YXRlZCBzeW1ib2wuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBBdm9pZCBsb29waW5nIG9uIGVxdWF0ZWQgc3ltYm9scy4KLQlBZGp1c3QgZnhfb2Zmc2V0IGJ5IFhfYWRkX251bWJlciBmb3IgZWFjaCBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IEF2b2lkIGxvb3Bpbmcgb24gZXF1YXRlZAotCXN5bWJvbHMuCi0JKGZpeHVwX3NlZ21lbnQpOiBBZGQgYSBsb29wIHRvIHRyYWNrIGRvd24gZXF1YXRlZCBzeW1ib2xzIGFuZAotCWFkanVzdCBmeF9vZmZzZXQgYXBwcm9wcmlhdGVseS4KLQotRnJpIEphbiAzMSAxNToyMTowMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX3JlbGF4X3RhYmxlKTogQWRkIGVudHJpZXMgdG8gYWxsb3cKLQlqbXAgLT4gYnJhIHJlbGF4aW5nLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBIYW5kbGUgam1wLT5icmEgcmVsYXhpbmcuCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGptcC0+YnJhIHJlbGF4aW5nLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IExpa2V3aXNlLgotCi1GcmkgSmFuIDMxIDEzOjE1OjA1IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9hbGlnbl9jb2RlKTogQWRkIGNvbW1lbnRzIGV4cGxhaW5pbmcgdGhlCi0Jbm9wIGluc3RydWN0aW9ucy4KLQotRnJpIEphbiAzMSAxMDo0NjoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChlbmZvcmNlX2FsaWduZWRfZGF0YSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNwYXJjX2NvbnNfYWxpZ24pOiBEb24ndCBkbyBhbnl0aGluZyB1bmxlc3MgZW5mb3JjZV9hbGlnbmVkX2RhdGEKLQlpcyBzZXQuCi0JKG1kX2xvbmdvcHRzKTogQWRkICJlbmZvcmNlLWFsaWduZWQtZGF0YSIuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC0tZW5mb3JjZS1hbGlnbmVkLWRhdGEuCi0JKiBkb2MvYy1zcGFyYy50ZXhpIChTcGFyYy1BbGlnbmVkLURhdGEpOiBOZXcgbm9kZTsgZG9jdW1lbnQKLQllbmZvcmNlLWFsaWduZWQtZGF0YS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZiBPQkpfWENPRkYsIGFkZCAibG9uZyIsCi0gCSJ3b3JkIiwgYW5kICJzaG9ydCIuCi0JKHBwY194Y29mZl9jb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IEdpdmUgYW4gZXJyb3IgaWYgYSAuc3BhY2Ugc3ltYm9sIGlzCi0JY29tbW9uIG9yIHVuZGVmaW5lZC4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBEb24ndCBoYW5kbGUgbXJpX3BlbmRpbmdfYWxpZ24gaWYKLQl0aGUgaGFuZGxlciBpcyBzX2dsb2JsIG9yIHNfaWdub3JlLgotCi1UaHUgSmFuIDMwIDExOjQ2OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgIm51bW9wcyIuCi0JKiBjb25maWcvdGMtdGljODAuYzogTWFueSBhZGRpdGlvbnMgdG8gcHJldmlvdXMgcGxhY2Vob2xkZXIgZmlsZS4KLQkqIGNvbmZpZy90Yy10aWM4MC5oOiBEaXR0by4KLQotVGh1IEphbiAzMCAxMjoyODoxOCAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IEltcHJvdmUgdGhlIG5vcCBwYXR0ZXJucy4KLQotVGh1IEphbiAzMCAxMjowODo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IENhbGwgbWlwc19maXhfYWRqdXN0YWJsZS4KLQkobWlwc19maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUuCi0KLQlJZGVhcyBmcm9tIFNyaW5pdmFzIEFkZGFnYXJsYSA8c3Jpbml2YXNAY2RvdGQuZXJuZXQuaW4+OgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBBZnRlciBkb2luZyBhbiBtcmlfcGVuZGluZ19hbGlnbiwKLQlhZGp1c3QgdGhlIGxpbmVfbGFiZWwgaWYgdGhlcmUgaXMgb25lLgotCShzX3NwYWNlKTogU2V0IG1yaV9wZW5kaW5nX2FsaWduIGlmIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMgd2VyZQotCW91dHB1dC4KLQotV2VkIEphbiAyOSAxNTozMToxMiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuaCAobWRfZG9fYWxpZ24pOiBBZGQgdGhpcyBob29rIHRvIGNhbGwKLQlkMTB2X2NsZWFudXAoKSB3aGVuIGEgIi5hbGlnbiIgaXMgZGV0ZWN0ZWQuCi0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogQ29ycmVjdGx5IGNhbGN1bGF0ZQotCWJyYW5jaCBkaXNwbGFjZW1lbnQgd2hlbiAuYWxpZ25zIGFyZSBwcmVzZW50LgotCi1XZWQgSmFuIDI5IDA5OjQyOjExIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBEZWZpbmUuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEltcGxlbWVudC4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgcmVsYXhhYmxlIG9wZXJhbmRzL2luc3RydWN0aW9ucyBjb3JyZWN0bHkuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogSW1wbGVtZW50LgotCSogY29uZmlnL3RjLW1uMTAyMDAuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IERlZmluZS4KLQotVHVlIEphbiAyOCAxNToyNzoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogR2l2ZSBhbiBlcnJvciBmb3IganVtcHMgdG8gYQotCW1pc2FsaWduZWQgYWRkcmVzcy4KLQkobWRfYXBwbHlfZml4KTogTWFrZSBhIGJyYW5jaCB0byBhbiBvZGQgYWRkcmVzcyBhbiBlcnJvciByYXRoZXIKLQl0aGFuIGEgd2FybmluZy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfY29udmVydF9mcmFnKTogSWYgdGhlIHVzZXIgZXhwbGljaXRseQotCXJlcXVlc3RlZCBhbiBleHRlbmRlZCBvcGNvZGUsIHBhc3Mgd2FybiBhcyB0cnVlIHRvIG1pcHMxNl9pbW1lZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogSGFuZGxlIGEgbWlzc2luZyBleHByZXNzaW9uIGxpa2UKLQlhbiBleHBsaWNpdCAwLCBzbyB0aGF0IGV4cGxpY2l0bHkgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb25zIHdvcmsKLQljb3JyZWN0bHkuCi0KLU1vbiBKYW4gMjcgMTc6NDE6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogRG9uJ3QgZ2VuZXJhdGUgYSBsb2NhbCBFQ09GRgotCXN5bWJvbCBmb3IgYSBjb21tb24gc3ltYm9sLgotCi1XZWQgSmFuIDIyIDEwOjM5OjM5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlQYXRjaCBwcmVzdW1lZCB0byBoYXZlIGJlZW4gY2hlY2tlZCBpbiBhd2hpbGUgYWdvIGJ1dCB3YXNuJ3QuCi0JTW9uIE5vdiAyNSAxMDo0NToxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQkqIHdyaXRlLmM6IERlbGV0ZSAiaWZuZGVmIG1kX3JlbGF4X2ZyYWciIGFyb3VuZCBpc19kbnJhbmdlLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX29yZyk6IE1vdmUgY29kZSBpbnNpZGUgYnJhY2VzLiAgTW92ZSBsb2NhbHMKLQl0YXJnZXQsYWZ0ZXIgaW5zaWRlIHRvby4KLQkocmVsYXhfc2VnbWVudCwgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudCk6IEd1dHMgbW92ZWQgdG8gLi4uCi0JKHJlbGF4X2ZyYWcpOiBOZXcgZnVuY3Rpb24uCi0JQ2FsbCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gaWYgZGVmaW5lZC4KLQotTW9uIEphbiAyMCAxMDo1Njo0NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBwYy1yZWxhdGl2ZSBhZGRyZXNzZXMgZm9yIHRoZQotIAkncCcgb3BlcmFuZCBzcGVjaWZpZXIuCi0KLU1vbiBKYW4gMjAgMTA6Mzk6MzYgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKEhBVkVfTE9OR19CUkFOQ0gpOiBOZXcgbWFjcm8sIHJldHVybnMgdHJ1ZSBmb3IKLSAJbTY4ayBmYW1pbHkgY3B1cyB3aGljaCBzdXBwb3J0IGxvbmcgYnJhbmNoIGFkZHJlc3NpbmcgbW9kZXMuCi0JKG02OGtfaXAsIG1kX2NvbnZlcnRfZnJhZ18xLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwKLSAJbWRfY3JlYXRlX2xvbmdfanVtcCk6IFVzZSBpdC4KLQotTW9uIEphbiAyMCAxMjo0MjowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRG9uJ3Qgc2V0IFNFQ19BTExPQyBvciBTRUNfTE9BRCBmb3IKLQl0aGUgLnJlZ2luZm8gb3IgLk1JUFMub3B0aW9ucyBzZWN0aW9uIGlmIGNvbmZpZ3VyZWQgZm9yIGFuCi0JZW1iZWRkZWQgdGFyZ2V0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IERvbid0IHNldCBpbnRlcmxvY2tzIGZvcgotCW1pcHNfNDY1MC4KLQotV2VkIEphbiAxNSAxMzo1MTo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogTWFrZSBzdXJlIHRoZSBzeW1ib2wgZW5kcyB3aXRoCi0Jd2hpdGVzcGFjZSBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgJz0nLgotCi1UdWUgSmFuIDE0IDE1OjA3OjI3IDE5OTcgIFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzY29faWQpOiBNb3ZlZCBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKHNjb19pZCk6IC4uLnRvIGhlcmUuICBBZGRpbmcgdGhlIGlkZW50aWZpZXIKLQlyZWFsbHkgaXMgYW4gU0NPIEVMRiBzcGVjaWZpYyB0aGluZywgbm90IGp1c3QgYSBTQ08geDg2IHNwZWNpZmljCi0JdGhpbmcuCi0KLU1vbiBKYW4gMTMgMjI6NDM6MDEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IERvbid0IHJlcXVpcmUgJ2NvZmYnLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgSmFuICA5IDA5OjA4OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBDaGVjayBmb3Igb3ZlcmZsb3cgb2YgYSBuZWdhdGl2ZSB2YWx1ZQotCWNvcnJlY3RseS4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBsYWJlbF9saW5lKTogRGVmaW5lLgotCShsYWJlbHMsIGN1cnJlbnRfbGFiZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWRfYXNzZW1ibGUpOiBNYXJrIGN1cnJlbnRfbGFiZWwgYXMgdGV4dCwgYW5kIGNsZWFyIGl0LgotCShtNjhrX2Zyb2JfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKG02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG02OGtfZnJvYl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtbTY4ay5oICh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCShtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlZmluZS4KLQkodGNfZnJvYl9zeW1ib2wpOiBEb24ndCB3YXJuLCBqdXN0IGNhbGwgbTY4a19mcm9iX3N5bWJvbC4KLQkodGNfZnJvYl9jb2ZmX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFdoZW4gZGVmaW5pbmcgYSBtYWNybyBpbiBNUkkgbW9kZSwKLQlkb24ndCBhZGQgdGhlIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlLgotCi1UdWUgSmFuICA3IDExOjIxOjQyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIHN5bTEtc3ltMiBmaXh1cHMKLQloZXJlIHNpbmNlIGZpeHVwX3NlZ21lbnQgZG9lc24ndCAobGlua3JlbGF4IGlzIHNldCkuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotTW9uIEphbiAgNiAxNToxOTozMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogVHdlYWsgZnhfb2Zmc2V0IGZvciBwYy1yZWxhdGl2ZQotCXJlbG9jcy4KLQotRnJpIEphbiAgMyAxNjo0NzowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QpOiBUd2VhayBmeF9yX2ZpZWxkJ3MgdHlwZQotCXRvIGF2b2lkIHdhcm5pbmdzIHdpdGggdGhlIG5hdGl2ZSBIUCBjb21waWxlci4KLQkoZml4X25ld19ocHBhKTogU2ltaWxhcmx5IGZvciB0aGUgcl90eXBlIGFyZ3VtZW50LgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UsIGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uKTogRW5jbG9zZQotCWluIGFuICNpZiBPQkpfRUxGIHRvIGtlZXAgZ2NjIC1XYWxsIHF1aWV0LgotCShtZF9hcHBseV9maXgpOiBBbHdheXMgaW5pdGlhbGl6ZSAicmVzdWx0Ii4KLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBHZW5lcmF0ZSByZWxvY2F0aW9ucy4KLQotRnJpIEphbiAgMyAxODoxNzoyMyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19ldmVuKTogQWRqdXN0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGN1cnJlbnQKLQlzZWN0aW9uLgotCi1GcmkgSmFuICAzIDE3OjEwOjMzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZmlsZV9zeW1ib2wpOiBXaGVuIHVzaW5nIEVDT0ZGIGRlYnVnZ2luZywKLQlwYXNzIG9uIHRoZSBuZXcgZmlsZSBob29rLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZml4X2FkanVzdGFibGUpOiBOb3QgcXVpdGUgdGhlIHNhbWUgYXMKLQkhYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiwgYXMgbG9jYWwgTElURVJBTHMgY2FuIGJlIGFkanVzdGVkIHRvIGJlCi0JcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24uCi0KLUZyaSBKYW4gIDMgMTI6MDk6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoeWFua19zeW1ib2xzKTogSWYgdGNfZnJvYl9jb2ZmX3N5bWJvbCBpcwotCWRlZmluZWQsIGNhbGwgaXQuCi0JKiBjb25maWcvdGMtbTY4ay5oICh0Y19mcm9iX3N5bWJvbCk6IENoZWNrIHdoZXRoZXIgdGV4dCBsYWJlbCBpcwotCWFsaWduZWQgdG8gb2RkIGJvdW5kYXJ5LgotCSh0Y19mcm9iX2NvZmZfc3ltYm9sKTogRGVmaW5lLgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU2V0KTogQ2hhbmdlIHBhcmVudGhlc2l6ZWQgQHhyZWYgdG8gQHB4cmVmLgotCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IEluIE1SSSBtb2RlLCBqdXN0IGNvcHkgYSBzaW5nbGUgJi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENhbGwgZnJhZ19ncm93IGJlZm9yZSBhZGRpbmcgYQotCVBDSU5ERVggZnJhZy4gIEZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEFjY2VwdCAnQicgYXMgYSBzaXplIGZvciBhbgotCWltbWVkaWF0ZSB2YWx1ZS4KLQkobWRfYXNzZW1ibGUpOiBJZiB0aGUgc2l6ZSBpcyAnQicsIHNldCBmeF9zaWduZWQuCi0JKG1kX2FwcGx5X2ZpeF8yKTogVXNlIGZ4X3NpZ25lZCB3aGVuIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEFkZCBmeF9zaWduZWQgZmllbGQuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9ub19vdmVyZmxvdyBhbmQKLQlmeF9zaWduZWQgZmllbGRzLgotCShmaXh1cF9zZWdtZW50KTogVXNlIGZ4X3NpZ25lZCB3aGVuIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ2hlY2sgZnhfbm9fb3ZlcmZsb3cgYW5kCi0JZnhfc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotCi1UaHUgSmFuICAyIDEzOjM3OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTk9URVMsIE5PVEVTLmNvbmZpZzogUmVtb3ZlZC4gIFRoZXNlIGFyZSByYXJlbHksIGlmIGV2ZXIsCi0JdXBkYXRlZCwgYW5kIGFsbCB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIGlzIGluIGRvYy9pbnRlcm5hbHMudGV4aS4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQ2hlY2sgZm9yIGNvbmRpdGlvbmFsIG9wZXJhdG9ycwotCWJlZm9yZSBkb2luZyBhbiBNUkkgcGVuZGluZyBhbGlnbm1lbnQuCi0JKiBjb25maWcvdGMtbTY4ay5oIChtNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wKTogRGVjbGFyZS4KLQkodGNfY29uZGl0aW9uYWxfcHNldWRvcCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfY29uZGl0aW9uYWxfcHNldWRvcCk6IE5ldyBmdW5jdGlvbi4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBEZXNjcmliZQotCXRjX2NvbmRpdGlvbmFsX3BzZXVkb29wLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpOiBOZXcgc3RhdGljCi0JdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogQ2hlY2sgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgYmVmb3JlIHNldHRpbmcKLQltNjhrX3JlbDMyLgotCShtNjhrX21yaV9tb2RlX2NoYW5nZSk6IExpa2V3aXNlLgotCShtZF9sb25nb3B0cyk6IEFkZCAtLWRpc3Atc2l6ZS1kZWZhdWx0LTE2IGFuZAotCS0tZGlzcC1zaXplLWRlZmF1bHQtMzIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gbmV3IG9wdGlvbnMuCi0JKiBkb2MvYy1tNjhrLnRleGkgKE02OEstT3B0cyk6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pbmRleF93aWR0aF9kZWZhdWx0KTogTmV3IHN0YXRpYwotCXZhcmlhYmxlLgotCShtNjhrX2lwKTogVXNlIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCB0byBzZXQgdGhlIHNpemUgb2YgYSBiYXNlCi0JcmVnaXN0ZXIgd2hvc2Ugc2l6ZSB3YXMgbm90IGdpdmVuLgotCShtZF9sb25nb3B0cyk6IEFkZCAtLWJhc2Utc2l6ZS1kZWZhdWx0LTE2IGFuZAotCS0tYmFzZS1zaXplLWRlZmF1bHQtMzIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gbmV3IG9wdGlvbnMuCi0JKiBkb2MvYy1tNjhrLnRleGkgKE02OEstT3B0cyk6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi0JKiBkb2MvYy1taXBzLnRleGk6IE1lbnRpb24gSVNBIGxldmVsIDQsIGFuZCB0aGUgLW1pcHMxNiBvcHRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG1pcHMtKi1saW51eCogdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmV3cml0ZSA2NCBiaXQgaGFuZGxpbmcgdG8KLQl3b3JrIGlmIHZhbHVlVCBpcyBvbmx5IDMyIGJpdHMuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFRocm91Z2hvdXQsIGNoZWNrIHRhcmdldF9iaWdfZW5kaWFuIHJhdGhlcgotIAl0aGFuIGJ5dGVfb3JkZXIuCi0gCShieXRlX29yZGVyKTogUmVtb3ZlLgotCShtaXBzX2luaXRfYWZ0ZXJfYXJncyk6IFJlbW92ZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKExJVFRMRV9FTkRJQU4sIEJJR19FTkRJQU4pOiBEb24ndCBkZWZpbmUuCi0JKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogRG9uJ3QgZGVjbGFyZS4KLQkodGNfaW5pdF9hZnRlcl9hcmdzKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2FmdGVyX3JlbG9jcyk6IERlZmluZSBpZgotCU9CSl9NQVlCRV9FTEYuCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBMaWtld2lzZS4KLQotVHVlIERlYyAzMSAxNToxMjozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSWYgdGhpcyBpcyBzc3Que2gsd30gb3IKLQlzbGQue2gsd30gYW5kIHRoZSBvcGVyYW5kIGlzIHJlbG9jYXRhYmxlLCBhZGp1c3QgdGhlIGFkZW5kIGJ5Ci0Jc2hpZnRpbmcgaXQgcmlnaHQgb25lIGJpdC4KLQotVHVlIERlYyAzMSAxMjo1Njo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQ2hlY2sgbXJpX3BlbmRpbmdfYWxpZ24gYWZ0ZXIKLQljaGVja2luZyBmb3IgYSBtYWNyby4gIEZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZQotCTxyZmdAbW9ua2V5cy5jb20+LgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4Myk6IFJlbmFtZSBmcm9tIG1kX2FwcGx5X2ZpeCwgYW5kCi0gCWFkZCBzZWdtZW50IGFyZ3VtZW50LiAgSWYgT0JKX0VMRiwgdHJlYXQgYSByZWxvY2F0aW9uIGFnYWluc3QgYQotIAlzeW1ib2wgaW4gYSBsaW5rb25jZSBzZWN0aW9uIGxpa2UgYSByZWxvY2F0aW9uIGFnYWluc3QgYW4gZXh0ZXJuYWwKLSAJc3ltYm9sLgotCSogY29uZmlnL3RjLXNwYXJjLmggKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCi0KLU1vbiBEZWMgMzAgMTE6MzU6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfbWFjcm8pOiBBZGQgY2FzZSBmb3IgTV9BQlMuCi0KLUZyaSBEZWMgMjcgMjI6NTE6NTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE5PVEVTLmNvbmZpZyAoSW1wbGVtZW50YXRpb24pOiBhcy5oICNkZWZpbmUncyAiR0FTIiBub3QgImdhcyIsCi0JaW5jbHVkZXMgY29uZmlnLmggaW5zdGVhZCBvZiBob3N0LmgsIHRjLmggaW5zdGVhZCBvZiB0cC5oLCBhbmQKLQl0YXJnLWVudi5oIGluc3RlYWQgb2YgdGFyZ2V0LWVudmlyb25tZW50LmguCi0JQWxzbywgb2JqLWZvcm1hdC5oIGluY2x1ZGVzIHRhcmctY3B1LmggaW5zdGVhZCBvZgotIAl0YXJnZXQtcHJvY2Vzc29yLmguCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHtnZW5lcmljX3RhcmdldH0pOiBBZGQgdGljODAtKi1jb2ZmIGVudHJ5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZi90aWM4MC5oKTogSW5jbHVkZSBpZiBUQ19USUM4MCBkZWZpbmVkLgotCShUQVJHRVRfRk9STUFUKTogRGVmaW5lIHRvICJjb2ZmLXRpYzgwIi4KLQkqIGNvbmZpZy90Yy10aWM4MC5jOiBOZXcgZmlsZSBmb3IgVEljODAgc3VwcG9ydC4KLQkqIGNvbmZpZy90Yy10aWM4MC5oOiBOZXcgZmlsZSBmb3IgVEljODAgc3VwcG9ydC4KLQkKLUZyaSBEZWMgMjcgMTE6NDI6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoTSk6IE1lbnRpb24gZXhwbGljaXRseSB0aGF0IC1NIGNoYW5nZXMgbWFjcm8KLQloYW5kbGluZy4KLQotVGh1IERlYyAxOSAxMjowNjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogSWYgdGhlIGZpeHVwIHN5bWJvbCBoYXMgYmVlbgotCWVxdWF0ZWQgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCwgY29udmVydCB0aGUgZml4dXAgdG8gYmVpbmcgYWdhaW5zdAotCXRoZSB0YXJnZXQgc3ltYm9sLiAgUmVtb3ZlIG9ic29sZXRlIGNvZGUgaGFuZGxpbmcgYSBzcGVjaWFsIGNhc2UKLQlmb3IgaTM4NiBQSUMuCi0KLVdlZCBEZWMgMTggMjI6NTQ6MzkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVzZSBOZXdGb2xkZXJSZWN1cnNpdmUgZm9yIGluc3RhbGxhdGlvbi4KLQotV2VkIERlYyAxOCAxNjowMDo0MiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZG9fYXNzZW1ibGUpOiBDb3JyZWN0IHByZXZpb3VzIGJ1ZyBmaXguCi0KLVdlZCBEZWMgMTggMTU6Mjc6NDAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlKTogRml4IGJ1ZyB3aGljaCBjYXVzZWQKLQlzZWNvbmQgaW5zdHJ1Y3Rpb24gaW4gYSBsaW5lIHRvIGJlIGNhc2Ugc2Vuc2l0aXplLgotCi1XZWQgRGVjIDE4IDEwOjA4OjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobW4xMDIwMF9pbnNlcnRfb3BlcmFuZCk6IERvbid0Ci0JcmFuZ2UgY2hlY2sgb3BlcmFuZHMgd2l0aCBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSyBzZXQuCi0JKGNoZWNrX29wZXJhbmQpOiBMaWtld2lzZS4KLQotVHVlIERlYyAxNyAxMDo1OTozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFVuZG8gcGFydCBvZiBsYXN0IEZyaWRheSdzIGFsaWdubWVudCBjaGFuZ2VzLgotIAkobWRfYmVnaW4pOiBBbHdheXMgYWxpZ24gdGhlIHRleHQgc2VjdGlvbiB0byBhIGZvdXIgYnl0ZQotCWJvdW5kYXJ5LgotCShhcHBlbmRfaW5zbik6IFJlbW92ZSBjYWxsIHRvIHJlY29yZF9hbGlnbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbl9sYWJlbCk6IFJlbW92ZS4KLQkoc3RydWN0IGluc25fbGFiZWxfbGlzdCk6IERlZmluZS4KLQkoaW5zbl9sYWJlbHMsIGZyZWVfaW5zbl9sYWJlbHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWlwc19jbGVhcl9pbnNuX2xhYmVscyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFwcGVuZF9pbnNuKTogTWFyayBhbGwgbWlwczE2IHRleHQgbGFiZWxzLCBhbmQgbWFrZSB0aGVtIG9kZC4KLQlIYW5kbGUgYWxsIGxhYmVscyBhZnRlciBlbWl0dGluZyBhIG5vcCwgbm90IGp1c3Qgb25lLiAgQ2FsbAotCW1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgcmF0aGVyIHRoYW4ganVzdCBjbGVhcmluZyBpbnNuX2xhYmVsLgotCShtaXBzX2VtaXRfZGVsYXlzKTogQWRkIGluc25zIHBhcmFtZXRlciwgYW5kIHVzZSBpdCB0byBkZWNpZGUKLQl3aGV0aGVyIHRvIG1hcmsgbWlwczE2IGxhYmVscy4gIEhhbmRsZSBhbGwgbGFiZWxzLCBub3QganVzdCBvbmUuCi0JRm9yY2UgbWlwczE2IGxhYmVscyB0byBiZSBvZGQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG1pcHMxNl9pbW1lZCk6IERvbid0IGNoZWNrIGZvciBhbiBvZGQgYnJhbmNoIHRhcmdldC4KLQkobWRfYXBwbHlfZml4KTogRG9uJ3QgY2hlY2sgbWlwczE2IG1vZGUgZm9yIGEgYnJhbmNoIHJlbG9jLgotCShtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IElnbm9yZSB0aGUgbG93IGJpdCBpbiBhIGJyYW5jaCB0YXJnZXQuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCShtaXBzX25vX3ByZXZfaW5zbik6IENhbGwgbWlwc19jbGVhcl9pbnNuX2xhYmVscyByYXRoZXIgdGhhbiBqdXN0Ci0JY2xlYXJpbmcgaW5zbl9sYWJlbC4KLQkobWlwc19hbGlnbiwgbWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCwgc19jb25zKTogTGlrZXdpc2UuCi0JKHNfZmxvYXRfY29ucywgc19ncHdvcmQpOiBMaWtld2lzZS4KLQkoc19hbGlnbik6IFVzZSBpbnNuX2xhYmVscyByYXRoZXIgdGhhbiBpbnNuX2xhYmVsLgotCShzX2NvbnMsIHNfZmxvYXRfY29ucywgc19ncHdvcmQpOiBMaWtld2lzZS4KLQkobWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2RlZmluZV9sYWJlbCk6IFJld3JpdGUgdG8gYWRkIHRvIGluc25fbGFiZWxzIGxpc3QuCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lLgotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IElmIHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gY29tZXMKLQlvdXQgb2RkLCBpbmNyZW1lbnQgaXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogT25seSB1cGRhdGUgcHJldl9pbnNuIHdoZW4gbm90Ci0JcmVvcmRlcmluZyBpZiBwbGFjZSBpcyBOVUxMLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBDaGVjayBmb3IgYSBtaXNzaW5nIGV4cHJlc3Npb24KLQl3aGVuIHVzaW5nIHRoZSByZWdpc3RlciBpbmRpcmVjdCBhZGRyZXNzaW5nIG1vZGUuCi0KLU1vbiBEZWMgMTYgMTA6MDg6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtbjEwMjAwX2luc2VydF9vcGVyYW5kKTogRG9uJ3QKLQljaGVjayAyNGJpdCBvcGVyYW5kcyBmb3Igb3ZlcmZsb3cuCi0JKGNoZWNrX29wZXJhbmQpOiBMaWtld2lzZS4KLQotTW9uIERlYyAxNiAxMTo1MDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChTZWN0aW9uKTogRG9jdW1lbnQgaG93IHRvIHVzZSB0aGUgLnNlY3Rpb24KLQlwc2V1ZG8tb3AgZm9yIENPRkYgYW5kIEVMRi4KLQotU3VuIERlYyAxNSAxNToyNjozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogRml4IGxpbmtvbmNlIGNoZWNrIGZvciBFTEYuCi0KLVNhdCBEZWMgMTQgMjI6Mzc6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChwcmV2X2luc25fcmVsb2NfdHlwZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKFJFTEFYX01JUFMxNl9FTkNPREUpOiBBZGQgZHNsb3QgYW5kIGphbF9kc2xvdCBhcmd1bWVudHMsIGFuZAotCXN0b3JlIHRoZW0uICBBZGp1c3Qgb3RoZXIgUkVMQVhfTUlQUzE2IG1hY3Jvcy4KLQkoUkVMQVhfTUlQUzE2X0RTTE9UKTogRGVmaW5lLgotCShSRUxBWF9NSVBTMTZfSkFMX0RTTE9UKTogRGVmaW5lLgotCShhcHBlbmRfaW5zbik6IFBhc3MgbmV3IGFyZ3VtZW50cyB0byBSRUxBWF9NSVBTMTZfRU5DT0RFLiAgQ29ycmVjdAotCWhhbmRsaW5nIG9mIHdoZXRoZXIgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaGFzIGEgZml4dXAuICBTZXQKLQlwcmV2X2luc25fcmVsb2NfdHlwZS4KLQkobWlwc19ub19wcmV2X2luc24pOiBDbGVhciBwcmV2X2luc25fcmVsb2NfdHlwZS4KLQkobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBVc2UgdGhlIHJpZ2h0IGJhc2UgYWRkcmVzcyBmb3IgYSBQQwotCXJlbGF0aXZlIGFkZCBvciBsb2FkLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4gIElmIGEgUEMgcmVsYXRpdmUgYWRkIG9yIGxvYWQgaXMKLQl1c2VkLCByZWNvcmQgdGhlIGFsaWdubWVudCBmb3IgdGhlIHNlY3Rpb24uCi0KLUZyaSBEZWMgMTMgMTM6MDA6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IERvbid0IHJlZHVjZSBhIHJlbG9jIGFnYWluc3QgYQotCWxpbmtvbmNlIHNlY3Rpb24gaW50byBhIHJlbG9jIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfbWFjcm8pOiBSZW1vdmUgbm9wIGluc3RydWN0aW9ucyBhZnRlcgotCWJyYW5jaCBpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogSWYgY29uZmlndXJlZCBmb3IgYW4gZW1iZWRkZWQgRUxGCi0Jc3lzdGVtLCBkb24ndCBzZXQgdGhlIHNlY3Rpb24gYWxpZ25tZW50IHRvIDIqKjQuCi0JKHNfY2hhbmdlX3NlYyk6IExpa2V3aXNlLgotCShhcHBlbmRfaW5zbik6IENhbGwgcmVjb3JkX2FsaWdubWVudCBmb3IgdGhlIHNlY3Rpb24uCi0JKG1kX3NlY3Rpb25fYWxpZ24pOiBEb24ndCBhbGlnbiB0aGUgc2VjdGlvbiBzaXplIGZvciBhbiBlbWJlZGRlZAotCUVMRiBzeXN0ZW0uCi0KLVRodSBEZWMgMTIgMTY6NDA6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IE1ha2Ugc3VyZSB0aGF0IHN5bWJvbHMgYXJlCi0JcmVzb2x2ZWQ7IGV4cHJlc3Npb24gc3ltYm9scyBtYXkgaGF2ZSBiZWVuIHNraXBwZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCi1UaHUgRGVjIDEyIDE1OjE4OjIxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IE1vdmUgQHBsdCB0bwotCUJGRF9SRUxPQ18yNF9QTFRfUENSRUwgcmVsb2NhdGlvbi4KLQkobWRfYXBwbHlfZml4Myk6IFN1cHBvcnQgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTC4KLQotVHVlIERlYyAxMCAxMzo1MTo1NSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IFJlbW92ZSBjb2RlIHRoYXQgY2FsbGVkCi0JcGFyYWxsZWxfb2soKSB3aGVuIHRoZSBwcm9ncmFtbWVyIHNwZWNpZmllZCBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBEZWMgMTAgMTI6MjM6MTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFVwZGF0ZSB0byBoYW5kbGUgZW5kaWFubmVzcwotCWlzc3VlcyBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogT3Bjb2RlIDB4MCBpcyB2YWxpZCEKLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMTAgMTE6Mzc6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbQotCWluIGEgZnJhZyBhZnRlciBhIG1pcHMxNiBpbnN0cnVjdGlvbiB0byBzd2l0Y2ggaXQgd2l0aCBhIGp1bXAKLQlpbnN0cnVjdGlvbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBHaXZlIGFuIGVycm9yIGZvciBhbgotCWF0dGVtcHQgdG8gdXNlIGEgbm9uIGFic29sdXRlIHN5bWJvbCBpbiBhbiBleHRlbmRpbmcgZnJhZy4KLQotTW9uIERlYyAgOSAxNjo0ODoyMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmM6IEZsZXNoIG91dCBhc3NlbWJsZXIgc3VwcG9ydCBmb3IgTU4xMDIwMC4KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmg6IExpa2V3aXNlLgotCi1Nb24gRGVjICA5IDE3OjA5OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogQXQgdGhlIGVuZCBvZiBhIEMgY29tbWVudCwgcGFzcyBzcGFjZSB0bwotCVVOR0VUIHJhdGhlciB0aGFuIFBVVC4gIFNldCBvbGRfc3RhdGUgYmVmb3JlIHNldHRpbmcgc3RhdGUgdG8gLTIuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogQXZvaWQgYW4gaW5maW5pdGUgbG9vcAotCXdoZW4gZXh0ZW5kaW5nIGJlY2F1c2UgdGhlIHZhbHVlIGlzIGV4YWN0bHkgbWF4dGlueSArIDEuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKFJFTEFYX01JUFMxNl9FTkNPREUpOiBBZGQgc21hbGwgYW5kIGV4dAotCWFyZ3VtZW50cywgYW5kIHN0b3JlIHRoZW0uICBBZGp1c3Qgb3RoZXIgUkVMQVhfTUlQUzE2IG1hY3Jvcy4KLQkoUkVMQVhfTUlQUzE2X1VTRVJfU01BTEwpOiBEZWZpbmUuCi0JKFJFTEFYX01JUFMxNl9VU0VSX0VYVCk6IERlZmluZS4KLQkobWlwczE2X3NtYWxsLCBtaXBzMTZfZXh0KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGFwcGVuZF9pbnNuKTogUGFzcyBtaXBzMTZfc21hbGwgYW5kIG1pcHMxNl9leHQgdG8KLQlSRUxBWF9NSVBTMTZfRU5DT0RFLgotCShtaXBzMTZfaXApOiBTZXQgbWlwczE2X3NtYWxsIGFuZCBtaXBzMTZfZXh0LgotCShtaXBzMTZfaW1tZWQpOiBEb24ndCBjaGVjayBtaXBzMTZfYXV0b2V4dGVuZC4KLQkobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBDaGVjayBVU0VSX1NNQUxMIGFuZCBVU0VSX0VYVC4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogUHJpbnQgYW4gZXJyb3IgZm9yIGFuIG91dCBvZiByYW5nZQotCWZpeHVwLCByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgotCi0JKiBhcy5jIChtYWluKTogVW5saW5rIHRoZSBvdXRwdXQgZmlsZSBpZiB0aGVyZSBhcmUgZXJyb3JzIHdoaWxlCi0JZ2VuZXJhdGluZyB0aGUgZml4dXBzLgotCi1GcmkgRGVjICA2IDE4OjQ4OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBEb24ndCBjYWxsCi0JU19HRVRfVkFMVUUuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IENhbGwgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgYmVmb3JlIGNhbGxpbmcKLQlTX0dFVF9WQUxVRSwgYW5kIGRvbid0IGFkZCBpbiB0aGUgZnJhZyBhZGRyZXNzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaW1tZWQpOiBBZGQgZmlsZSBhbmQgbGluZSBwYXJhbWV0ZXJzLAotCWFuZCB1c2UgdGhlbSB3aGVuIHJlcG9ydGluZyBlcnJvcnMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0KLUZyaSBEZWMgIDYgMTU6MzY6MzIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jOiBGaXggdmFyaW91cyBnY2MgLVdhbGwgd2FybmluZ3MuCi0JUmVtb3ZlICckJyBwcmVmaXhpbmcgZm9yIHJlZ2lzdGVycy4KLQotRnJpIERlYyAgNiAwMDo1NTo0OCAxOTk2ICBNYXJ0aW4gIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlKTogQ2hlY2sgdG8gc2VlIGlmIHByZXZfc2VnCi0JaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzaW5nIGl0LgotCShkMTB2X2NsZWFudXApOiBObyBsb25nZXIgdXNlcyBpdHMgYXJndW1lbnQsIHNvIG1ha2UgaXQgdm9pZC4KLQotCSogY29uZmlnL3RjLWQxMHYuaCAoZDEwdl9jbGVhbnVwKTogQ2hhbmdlIHByb3RvdHlwZS4KLQkKLVRodSBEZWMgIDUgMTE6MDM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgZGlzY2FyZCB0aGUgc3ltYm9sIGZvciBhIFBDCi0JcmVsYXRpdmUgZml4dXAgdG8gYW4gYWJzb2x1dGUgc3ltYm9sLgotCi1XZWQgRGVjICA0IDE1OjQyOjQxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSwgZDEwdl9jbGVhbnVwKTogRml4IGJ1ZwotCXdpdGggbXVsdGlwbGUgc2VjdGlvbnMuCi0KLVdlZCBEZWMgIDQgMTM6MDA6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9sb25nb3B0cyk6IFJlbmFtZSBtaXBzLTE2IHRvIG1pcHMxNiwgYW5kCi0Jbm8tbWlwcy0xNiB0byBuby1taXBzMTYuCi0JKHNfbWlwc3NldCk6IEFjY2VwdCAuc2V0IG1pcHMxNiBhbmQgLnNldCBub21pcHMxNi4KLQotV2VkIERlYyAgNCAxMDozNTozMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBUYWtlIGV4cHJlc3Npb25TIHBvaW50ZXIKLQlhcmd1bWVudCwgYW5kIGNoZWNrIGZvciArLy0gY29uc3RhbnQgZm9sbG93aW5nIHRoZSBzdWZmaXgsIGZvbGRpbmcKLQlpdCBpbnRvIHRoZSBleHByZXNzaW9uLgotCShwcGNfZWxmX2NvbnMpOiBDaGFuZ2UgcHBjX2VsZl9zdWZmaXggY2FsbHMuCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0JKHNobGliKTogUmVwbGFjZSBib29sZWFuIG1yZWxvY2F0YWJsZSB3aXRoIGVudW1lcmF0aW9uIHNobGliLgotCShtZF9wYXJzZV9vcHRpb24pOiBEaXNjcmltaW5hdGUgYmV0d2VlbiBQSUMgc3R5bGUgc2hhcmVkIGxpYnJhcmllcwotCWFuZCAtbXJlbG9jYXRhYmxlLgotCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IERvbid0IHJlcG9ydCB3YXJuaW5ncyBmb3IgUElDIHN0eWxlIHNoYXJlZAotCWxpYnJhcmllcy4KLQotVHVlIERlYyAgMyAyMzoxODoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoe3RjLHBwY31fY29tbWVudF9jaGFycyk6IERlZmluZSwgc28gdGhhdCB3ZSBjYW4KLQljaGFuZ2UgdGhlIGNvbW1lbnQgY2hhcmFjdGVycy4KLQotCSogY29uZmlnL3RjLXBwYy5jIChjb21tZW50X2NoYXJzKTogRGVsZXRlIGluIGZhdm9yIG9mCi0JdGNfY29tbWVudF9jaGFycy4KLQkocHBjX3tlYWJpLHNvbGFyaXN9X2NvbW1lbnRfY2hhcnMpOiBFYWJpIGFuZCBTb2xhcmlzIHZlcnNpb25zIG9mCi0JY29tbWVudCBjaGFycy4KLQkocHBjX2NvbW1lbnRfY2hhcnMpOiBTZWxlY3QgYXBwcm9wcmlhdGUgY29tbWVudCBjaGFycyBieSBkZWZhdWx0LgotCShtc29sYXJpcyk6IE5ldyBmbGFnIGZvciAtbXssbm8tfXNvbGFyaXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtSyBwaWMuICBBZGQgc3VwcG9ydCBmb3IKLQktbXssbm8tfXNvbGFyaXMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUuCi0JKG1kX2JlZ2luKTogRG8gbm90IHNldCBFTEYgZmxhZ3MgaWYgU29sYXJpcy4KLQkocHBjX2VsZl9zdWZmaXgpOiBAbG9jYWwgc2V0cyBSX1BQQ19MT0NBTDI0UEMgcmVsb2NhdGlvbi4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19MT0NBTDI0UEMuCi0KLU1vbiBEZWMgIDIgMTM6NDg6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5jIChtYWluKTogQ29ycmVjdCBoYW5kbGluZyBvZiBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQuCi0KLVN1biBEZWMgIDEgMjE6NDY6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jICh0Y19nZW5fcmVsb2MpOiBHZXQgdGhlIGFkZGVuZCBmcm9tCi0JZnhfb2Zmc2V0LCBub3QgZnhfYWRkbnVtYmVyLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGRvIGFueQotCXJlbG9jIGFkanVzdG1lbnRzLgotCi1TYXQgTm92IDMwIDE3OjM0OjQ4IDE5OTYgIEVsaW90IERyZXNzZWxoYXVzICA8ZWxpb3RAd2FsbHkuZWRjLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYzogQ29ycmVjdCBtaXNzcGVsbGluZzogYmFsZW5jZWQgdG8gYmFsYW5jZWQuCi0KLVdlZCBOb3YgMjcgMTM6MjU6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zZWN0aW9uX2FsaWduKTogQ2hlY2sgZm9yIGFuIGFsaWdubWVudCBvZgotCTQsIG5vdCBhbiBhbGlnbm1lbnQgb2YgMTYuICBDb3JyZWN0cyBBdWd1c3QgNyBwYXRjaC4KLQotVHVlIE5vdiAyNiAxMDozMzoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IERvbid0IGdpdmUgYW4gZXJyb3IgaWYgbm8KLQlhbGlnbm1lbnQgaXMgc3BlY2lmaWVkLgotCi0JQWRkIHN1cHBvcnQgZm9yIG1pcHMxNiAoMTYgYml0IE1JUFMgaW1wbGVtZW50YXRpb24pOgotCSogY29uZmlnL3RjLW1pcHMuYzogRXh0ZW5zaXZlIGFkZGl0aW9ucyBmb3IgbWlwczE2IHN1cHBvcnQsIG5vdAotCWxpc3RlZCBoZXJlLgotCShSRUxBWF9PTEQsIFJFTEFYX05FVyk6IFVzZSBvbmx5IDcgYml0cyBlYWNoLgotCShpbnNuX3VzZXNfcmVnKTogQ2hhbmdlIGxhc3QgcGFyYW1ldGVyIHRvIGFuIGVudW0uCi0JKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTFNfRE9MTEFSKTogRGVmaW5lIGFzIDAuCi0JKG1kX3JlbGF4X2ZyYWcpOiBEZWZpbmUgYXMgbWlwc19yZWxheF9mcmFnLgotCShtaXBzX3JlbGF4X2ZyYWcpOiBEZWNsYXJlLgotCShzdHJ1Y3QgbWlwc19jbF9pbnNuKTogQWRkIHVzZV9leHRlbmQgYW5kIGV4dGVuZCBmaWVsZHMuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuaCAoU19HRVRfT1RIRVIpOiBEZWZpbmUuCi0JKFNfU0VUX09USEVSKTogRGVmaW5lLgotCi1Nb24gTm92IDI1IDE4OjAyOjI5IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEltcGxlbWVudCBjYXNlcyBmb3IgbmV3IDwsID4sIG0sIG4sCi0gCW8gYW5kIHAgb3BlcmFuZCBzcGVjaWZpZXJzLgotCi1Nb24gTm92IDI1IDEwOjQ1OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jOiBEZWxldGUgImlmbmRlZiBtZF9yZWxheF9mcmFnIiBhcm91bmQgaXNfZG5yYW5nZS4KLQkocmVsYXhfc2VnbWVudCwgY2FzZSByc19vcmcpOiBNb3ZlIGNvZGUgaW5zaWRlIGJyYWNlcy4gIE1vdmUgbG9jYWxzCi0JdGFyZ2V0LGFmdGVyIGluc2lkZSB0b28uCi0JKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQpOiBHdXRzIG1vdmVkIHRvIC4uLgotCShyZWxheF9mcmFnKTogTmV3IGZ1bmN0aW9uLgotCUNhbGwgbWRfcHJlcGFyZV9yZWxheF9zY2FuIGlmIGRlZmluZWQuCi0JKiBjb25maWcvdGMtbTY4ay5oIChtZF9wcmVwYXJlX3JlbGF4X3NjYW4pOiBSZW5hbWVkIGZyb20KLQlNNjhLX0FJTV9LTFVER0UuCi0KLU1vbiBOb3YgMjUgMDg6NDk6MzYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChhZGRyZXNzX3JlZ2lzdGVycyk6IFVzZSAnJCcgYXMgcmVnaXN0ZXIKLQlwcmVmaXggaW5zdGVhZCBvZiAnJScuCi0JKGRhdGFfcmVnaXN0ZXJzLCBvdGhlcl9yZWdpc3RlcnMsIG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKGFkZHJlc3NfcmVnaXN0ZXJzKTogVXNlICclJyBwcmVmaXggZm9yIHJlZ3MuCi0JKGRhdGFfcmVnaXN0ZXJzLCBvdGhlcl9yZWdpc3RlcnMsIG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdGx5IGRldGVybWluZSB0aGUKLQljb3JyZWN0IGxvY2F0aW9uIGFuZCB0eXBlIGZvciBlYWNoIHJlbG9jYXRpb24uCi0JKG1kX3BjcmVsX2Zyb20pOiBTaW1wbGlmeS4KLQotRnJpIE5vdiAyMiAxNTo0MjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBJbXByb3ZlIHdhcm5pbmcgd2hlbiBicmFuY2ggaXMKLQljb252ZXJ0ZWQgaW50byBicmFuY2ggYXJvdW5kIGJyYW5jaC4KLQotVGh1IE5vdiAyMSAxMTo1NjoxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKERJRkZfRVhQUl9PSyk6IERvbid0IGRlZmluZSB0aGlzLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY3MgYWdhaW5zdCB3ZWFrIHN5bWJvbHMgb3IgCi0JcGMtcmVsYXRpdmUgcmVsb2NzLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYmVnaW4pOiBTZXQgbGlua3JlbGF4LgotCShtZF9hc3NlbWJsZSk6IENyZWF0ZSBmaXh1cHMgYXMgbmVlZGVkLgotCShtZF9hcHBseV9maXgzKTogR3V0LiAgSXQgc2hvdWxkbid0IGV2ZXIgZ2V0IGNhbGxlZCBhbnltb3JlLgotCi1UdWUgTm92IDE5IDE3OjQ4OjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBXaGVuIGF1dG9tYXRpY2FsbHkgY29udmVydGluZwotCXNlcmlhbCBvcHMgdG8gcGFyYWxsZWwsIGRvIG5vdCBjb25zaWRlciBhIGJyYW5jaCBhcyB0aGUgZmlyc3QKLQlpbnN0cnVjdGlvbi4KLQotVHVlIE5vdiAxOSAxMzozNToyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVC4KLQotTW9uIE5vdiAxOCAxNToyNjo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBQcm92aWRlIHByb3RvdHlwZQotCXZpYSBQQVJBTVMuCi0JKGNoZWNrX29wZXJhbmQpOiBMaWtld2lzZS4KLQotTW9uIE5vdiAxOCAxNToyMjoyOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogQnJhbmNoIGFuZCBsaW5rIGluc3RydWN0aW9ucwotCW1vZGlmeSByMTMuCi0JKHdyaXRlXzJfc2hvcnQpOiBDYWxsIHBhcmFsbGVsX29rIHRvIGNoZWNrIHdoZXRoZXIgdHdvIHNob3J0Ci0JaW5zdHJ1Y3Rpb25zIHRoZSB1c2VyIHJlcXVlc3RlZCBleGVjdXRlIGluIHBhcmFsbGVsLCBjYW4gYmUKLQlleGVjdXRlZCB0aGF0IHdheS4KLQotVGh1IE5vdiAxNCAxMToxNzo0OSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IEZpeCBidWcgdGhhdCB3b3VsZG4ndAotCWFsbG93IGEgYnJhbmNoIGFuZCBsaW5rIGluIHBhcmFsbGVsIHdpdGggYW4gZXhlIGluc3RydWN0aW9uLgotCi1GcmkgTm92ICA4IDEzOjU1OjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkb2MvYy1kMTB2LnRleGk6IEFkZCBpbmZvIG9uIEB3b3JkIG1vZGlmaWVyLgotCi1XZWQgTm92ICA2IDEzOjQ2OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQkKLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBNTjEwMzAwX09QRVJBTkRfU1BMSVQKLQlvcGVyYW5kcyBhcmUgYXNzdW1lZCB0byBiZSAzMmJpdHMuICBVc2UgImJpdHMiIGZpZWxkIHRvIGhvbGQgdGhlCi0JbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElULgotCShtbjEwMzAwX2NoZWNrX29wZXJhbmQpOiBNTjEwMzAwX09QRVJBTkRfU1BMSVQgb3BlcmFuZHMgYXJlIGFzc3VtZWQKLQl0byBiZSAzMmJpdHMuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBTaGlmdCBsb3cgcGFydAotCW9mIGEgTU4xMDMwMF9PUEVSQU5EX1NQTElUIG9wZXJhbmQgYnkgb3BlcmFuZC0+c2hpZnQuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBIYW5kbGUKLQlNTjEwMzAwX09QRVJBTkRfU1BMSVQuCi0KLVR1ZSBOb3YgIDUgMTM6MzA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEluc2VydCBvcGVyYW5kcyBpbnRvCi0JdGhlIGV4dGVuc2lvbiBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiBpZiBuZWNlc3NhcnkuCi0JKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBBY2NlcHQgcG9pbnRlciB0byBleHRlbnNpb24gd29yZAotCWFyZ3VtZW50LiAgTWFrZSBpbnNuIGEgcG9pbnRlciBhcmd1bWVudCB0b28uICBSZXR1cm4gdHlwZQotCWlzIG5vdyB2b2lkLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQotTW9uIE5vdiAgNCAxMjo1Mzo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBIYW5kbGUKLQlyZXBlYXRlZCByZWdpc3RlciBvcGVyYW5kcy4KLQotRnJpIE5vdiAgMSAxMDo0Mjo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGRlZCBzZWN0aW9uIG9uIHJlcG9ydGluZyBidWdzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogQ2hhbmdlIHVzZXMgb2Ygdm9pZCAqIHRvIFBUUi4gIENoYW5nZSB0aGUKLQlhbHBoYV9tYWNybyBlbWl0IGZpZWxkIHRvIGV4cGVjdCBhIGNvbnN0IGFyZ3VtZW50LCBhbmQgY2hhbmdlIHRoZQotCWFyZyBmaWVsZCB0byBiZSBjb25zdC4gIEZpeCBzb21lIHNwYWNpbmcgdG8gZm9sbG93IHRoZSBHTlUKLQlzdGFuZGFyZC4KLQotRnJpIE5vdiAgMSAxMDozMjowMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBrbm93bGVkZ2Ugb2YgMjExNjRwYwotCShwY2E1NikgYW5kIDIxMjY0IChldjYpIGNwdXMuCi0JKG1kX2FwcGx5X2ZpeCk6IFByaXZhdGUgcmVsb2NhdGlvbiB0eXBlcyBhcmUgbm93IG5lZ2F0aXZlLgotCShhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCShlbWl0X2luc24pOiBMaWtld2lzZS4KLQkoZW1pdF9sZFh1KTogRG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gdGhlIGhhcmR3YXJlIGNhbiBkbyBieXRlIGluc25zLgotCShlbWl0X3N0WCk6IExpa2V3aXNlLgotCShlbWl0X3NleHRYKTogTGlrZXdpc2UuCi0KLVRodSBPY3QgMzEgMTY6MzM6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IENhbGwgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgb24KLQlhIHN5bWJvbCBmb3VuZCBpbiBhIHJlbG9jLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSW1wcm92ZSB0aGUgZXJyb3IgbWVzc2FnZSBpZgotCWFuIHVuZGVmaW5lZCBzeW1ib2wgaXMgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCi1XZWQgT2N0IDMwIDIwOjE1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBSZXdyaXRlLCBhbmQgYWRkIGEgbG90IG9mIGRvY3VtZW50YXRpb24uCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGludGVybmFscy5pbmZvKTogTmV3IHRhcmdldC4KLQotV2VkIE9jdCAzMCAxNDo1NTo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcwotCWFnYWluc3Qgd2VhayBzeW1ib2xzLgotCi1UdWUgT2N0IDI5IDEyOjI4OjE2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBsb3NlIGZvciByZWxheGFibGUKLQlhZGRyZXNzZXMgbGlrZSAuKzYuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IE1ha2Ugc3VyZSB3ZSBpbnNlcnQgdGhlCi0JZml4dXAgYXQgdGhlIHJpZ2h0IGFkZHJlc3Mgd2l0aGluIHRoZSBmcmFnLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBEb24ndCBzZXQgZnJhZ1AtPmZyX2ZpeAotCXRvIGFuIGFic29sdXRlIHZhbHVlLCBpbnN0ZWFkIGluY3JlbWVudCBpdCBhcyBuZWVkZWQuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdjg1MC5jOiBGaXggc29tZSBpbmRlbnRpb24gcHJvYmxlbXMuCi0JKG1kX3JlbGF4X3RhYmxlKTogRGVmaW5lIGZvciBEOS0+RDk5IGJyYW5jaCBkaXNwbGFjZW1lbnQKLQlyZWxheGluZy4KLQkobWRfY29udmVydF9mcmFnKTogRG8gc29tZXRoaW5nIHVzZWZ1bCBpbnN0ZWFkIG9mIGFib3J0aW5nLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IExpa2V3aXNlLgotCShtZF9hc3NlbWJsZSk6IE5vdGUgaWYgdGhlIG1hdGNoaW5nIGluc3RydWN0aW9uIGhhcyBhIHJlbGF4YWJsZQotCW9wZXJhbmQuICBJZiBpdCBkb2VzLCBhbGxvY2F0ZSBmcmFnIHdpdGggZnJhZ192YXIgYW5kIGRvbid0Ci0JZG8gYW55IGZpeHVwcy4KLQotTW9uIE9jdCAyOCAxMDo0ODo0MCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuaCAobWRfY2xlYW51cCk6IE5ldyBmdW5jdGlvbi4gIFRoaXMgaXMgbmVlZGVkIHRvCi0Jd3JpdGUgb3V0IGFueSBidWZmZXJlZCBpbnN0cnVjdGlvbnMgd2hlbiBhICIuZW5kIiBpcyBmb3VuZC4KLQotTW9uIE9jdCAyOCAxMDo0Mzo0NSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBOZXcgaG9vayBtZF9jbGVhbnVwKCkuCi0KLUZyaSBPY3QgMjUgMDA6MDE6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IFVzZSBtYWtlX2V4cHJfc3ltYm9sIHRvIGJ1aWxkIGFuCi0JZXhwcmVzc2lvbiBzeW1ib2wgZm9yIGEgY29tcGxleCBmaXh1cC4KLQotVGh1IE9jdCAyNCAxNDozMTowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogU2V2ZXJhbCBkaXNndXN0aW5nCi0JaGFja3MgdG8gaW1wcm92ZSBwYXJzaW5nIG9mIGNvbXBsZXggaGksIGxvLCB6ZGEsIGV0YwotCWV4cHJlc3Npb25zLgotCShtZF9hc3NlbWJsZSk6IERvbid0IGRlbWFuZCBhbmQgZWF0IGEgdHJhaWxpbmcgJyknIGFmdGVyIGZpbmRpbmcKLQlhIHY4NTAgcmVsb2NhdGlvbiBwcmVmaXguICBTaWduIGV4dGVuZCB0aGUgY29uc3RhbnQgaW4gYQotCUJGRF9SRUxPQ19MTzE2IGV4cHJlc3Npb24uICBEbyBlYXQgYSB0cmFpbGluZyAnKScgYWZ0ZXIgYSBjb21wbGV0ZQotCW9wZXJhbmQuCi0JKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwKTogRG9uJ3QgZWF0IGEgdHJhaWxpbmcgJyknIGFmdGVyCi0JZmluZGluZyBhIHY4NTAgcmVsb2NhdGlvbiBwcmVmaXguCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTik6IERlZmluZS4KLQkoVENfQ09OU19GSVhfTkVXKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5jIChwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MCk6IE5ldyBmdW5jdGlvbi4KLQkoY29uc19maXhfbmV3X3Y4NTApOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgVERBIHJlbG9jcy4KLQotV2VkIE9jdCAyMyAxODoyMDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEdpdmUgYSBiZXR0ZXIgd2FybmluZyBtZXNzYWdlCi0JZm9yIGFuIHVua25vd24gcmVsb2NhdGlvbiB0eXBlLgotCi1XZWQgT2N0IDIzIDE2OjIxOjI4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIC53b3JkOyBhbGxvY2F0ZXMKLQk0IGJ5dGVzIG9mIHNwYWNlLgotCi1UdWUgT2N0IDIyIDIyOjAxOjI1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgVERBT0ZGIHJlbG9jcwotCWRpZmZlcmVudGx5IGZvciBtb3ZlYSAmIHNzdC9zbGQgaW5zbnMuCi0KLVR1ZSBPY3QgMjIgMTc6MDk6MzIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IERvbid0IGFsbG93IGlsbGVnYWwgY29tYmluYXRpb25zCi0Jb2YgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgT2N0IDIyIDExOjI4OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKTogQWRkIGZyb2JfZmlsZV9hZnRlcl9yZWxvY3MgZmllbGQuCi0JKiBjb25maWcvb2JqLW11bHRpLmggKG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mb3JtYXRfb3BzKTogSW5pdGlhbGl6ZSBuZXcKLQlmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIGZpZWxkLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zvcm1hdF9vcHMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFVuZGVmaW5lIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIGJlZm9yZQotCWluY2x1ZGluZyBvYmotZWxmLmguCi0KLU1vbiBPY3QgMjEgMTE6Mzg6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChjb25zX2ZpeF9uZXdfbWlwcyk6IE9ubHkgdHJlYXQgOCBieXRlIHJlbG9jCi0Jc3BlY2lhbGx5IGlmIG5vdCBFTEYuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfNjQuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfNjQuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBpbmNyZW1lbnQgdmFsdWUgZm9yIGEgUEMKLSAJcmVsYXRpdmUgcmVsb2Mgd2hlbiBCRkRfQVNTRU1CTEVSIGFuZCBPQkpfQU9VVCAobW9yZSB1Z2x5IGdhcwotIAlyZWxvYyBoYWNraW5nKS4KLQotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfREVGSU5FKTogbm9uIEJGRF9BU1NFTUJMRVIgdmVyc2lvbjoKLQlEb24ndCBjaGVjayBTX0dFVF9PVEhFUi4KLQotRnJpIE9jdCAxOCAxNDowNjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBBY2NlcHQgYW4gb2RkIGZsb2F0aW5nIHBvaW50Ci0JcmVnaXN0ZXIgd2l0aCBsLnMgb3Igcy5zLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3BzZXVkb190YWJsZSk6IFVzZSBvYmpfYW91dF90eXBlIGZvcgotCS50eXBlIHBzZXVkby1vcC4KLQkob2JqX2FvdXRfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVRodSBPY3QgMTcgMTc6NTU6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpTKSk6IERlcGVuZCB1cG9uIGxpYmliZXJ0eS5oLgotCi1XZWQgT2N0IDE2IDExOjI4OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBSZWNvZ25pemUgemRhb2ZmLCB0ZGFvZmYKLQlhbmQgc2Rhb2ZmIGV4cHJlc3Npb25zLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgYWRkIHN5bWJvbCB2YWx1ZSB0byBhZGRlbmQgaWYKLQlUQ19WODUwIGFuZCBPQkpfRUxGLgotCSogY29uZmlnL3RjLXY4NTAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgYW55Ci0JcGMtcmVsYXRpdmUgZml4dXBzLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogVW5kbyB5ZXN0ZXJkYXkncyBjaGFuZ2VzLgotCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IExpa2V3aXNlLgotCi1UdWUgT2N0IDE1IDIzOjE5OjAwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGNyZWxfZnJvbSk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IERlZmluZS4KLQotTW9uIE9jdCAxNCAxMzo1OToxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBBZGQgY2FzdCB0byBvZmZzZXRUIHdoZW4gdXNpbmcKLQlhIGNvbnN0YW50IHdpdGggJn4uCi0KLU1vbiBPY3QgMTQgMTE6MjQ6MjggMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBNb3ZlIEVDT0ZGIGRlYnVnIHByb2Nlc3NpbmcgdG8gLi4uCi0JKGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogLi4uIGhlcmUuICBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZnJvbV9maWxlX2FmdGVyX3JlbG9jcyk6IE5ldyBtYWNyby4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCAqZnJvYl9hZnRlcl9yZWxvY3MgYWZ0ZXIgdGhlCi0JY2FsbCB0byB3cml0ZV9yZWxvY3MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBVc2UgbmV3IEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTCByZWxvYy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IERvbid0IFNFVF9WQUxVRSBvbiB0aGUgc2VjdGlvbgotCXN5bWJvbCwgYXMgdGhpcyBtZXNzZXMgdXAgbGlua2luZy4gIEluc3RlYWQsIGV4cGFuZCB0aGUgcmVjdXJzaXZlIGNhbGwKLQlpbmxpbmUgYW5kIGNoYW5nZSB1cCB0aGUgYXBwcm9wcmlhdGUgYml0cyB0byBnZXQgdGhlIDB4ODAwMCBvZmZzZXQKLQlpbiB0aGUgcmVsb2MgYWRkZW5kLgotCi1UaHUgT2N0IDEwIDE3OjMwOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogUGVybWl0IHRoZSBkaWZmZXJlbmNlIG9mCi0JdHdvIHN5bWJvbHMgaW4gdGhlIHNhbWUgc2VnbWVudCB0byBiZSBhZGp1c3RlZC4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgQ1BVLVZFTkRPUi1saW51eC1nbnUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBPY3QgMTAgMTc6MjI6MTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19pbnNlcnRfb3BlcmFuZCk6IENoYW5nZSBtb3N0IHdhcm5pbmdzIGludG8KLQllcnJvcnMuCi0JKHBwY19lbGZfdmFsaWRhdGVfZml4KTogRGl0dG8uCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0JKHBwY190Yyk6IERpdHRvLgotCShwcGNfcGVfc2VjdGlvbik6IERpdHRvLgotCShwcGNfZnJvYl9zeW1ib2wpOiBEaXR0by4KLQotVGh1IE9jdCAxMCAxMjowNTo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogUGFzcyBhbiBleHRyYSBzaGlmdCBjb3VudAotCXRvIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgYmFzZWQgb24gdGhlIG9wY29kZSBmb3JtYXQuCi0JKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBBY2NlcHQgYW5kIHVzZSBleHRyYSBzaGlmdCBjb3VudAotCXBhcmFtZXRlci4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBVc2UgRk1UXyogbWFjcm9zIGZvcgotCWZvcm1hdHMgcmF0aGVyIHRoYW4gaGFyZC1jb2RlZCBjb25zdGFudHMuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogRm9ybWF0IEQ1IGluc3RydWN0aW9ucwotCWFyZSA3IGJ5dGVzIGxvbmcuICBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb25zIGluIGJpZy1lbmRpYW4gZm9ybWF0LgotCi1UdWUgT2N0ICA4IDE0OjU2OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBUd2VhayBmdXJ0aGVyIHNvCi0JdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSBwYXJzZWQgY29ycmVjdGx5LgotCi1UdWUgT2N0ICA4IDEzOjAyOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaDogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoeG1hbGxvYywgeHJlYWxsb2MpOiBEb24ndCBkZWNsYXJlLgotCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBsaWJpYmVydHkuaC4KLQkqIGV4cHIuYywgcmVhZC5jLCBzdGFicy5jLCBjb25maWcvb2JqLWNvZmYuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBMaWtld2lzZS4KLQkqIG1lc3NhZ2VzLmM6IExpa2V3aXNlLgotCSh4c3RyZXJyb3IpOiBEb24ndCBkZWNsYXJlLgotCSogeG1hbGxvYy5jOiBSZW1vdmUuCi0KLU1vbiBPY3QgIDcgMTY6NTM6MjMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5oIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIFJlbW92ZS4KLQkoc3lzdGVtX3JlZ2lzdGVycywgY2NfbmFtZXMpOiBMaWtld2lzZS4KLQkoYWRkcmVzc19yZWdpc3RlcnMsIGRhdGFfcmVnaXN0ZXJzLCBvdGhlcl9yZWdpc3RlcnMpOiBOZXcgcmVnaXN0ZXIKLQlhcnJheXMuCi0JKHJlZ2lzdGVyX25hbWUsIHN5c3RlbV9yZWdpc3Rlcl9uYW1lLCBjY19uYW1lKTogUmVtb3ZlLgotCShtbjEwMzAwX3JlbG9jX3ByZWZpeCk6IExpa2V3aXNlLgotCShkYXRhX3JlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSwgb3RoZXJfcmVnaXN0ZXJfbmFtZSk6IExpa2V3aXNlLgotCShtZF9hc3NlbWJsZSk6IFJvdWdoIGN1dCBhdCBwYXJzaW5nIG9wZXJhbmRzLiAgUmVtb3ZlIGxvdHMgb2YKLQl1bndhbnRlZCBjb2RlLgotCShtZF9hcHBseV9maXgzKTogRGlzYWJsZSBmb3Igbm93LgotCi1Nb24gT2N0ICA3IDExOjM4OjM0IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzZWxlY3RfY29udHJvbF9yZWdzKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQKLQlvdXQgb2YgbTY4a19pbml0X2FmdGVyX2FyZ3MuCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIGl0LgotCShtcmlfY2hpcCk6IFVzZSBpdCBoZXJlIGFzIHdlbGwgdG8gdXBkYXRlIHNldCBvZiBhbGxvd2VkIGNvbnRyb2wKLQlyZWdzIGZvciBtb3ZlYy4KLQotTW9uIE9jdCAgNyAxMToyNDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9iZWdpbik6IE5ldyBmdW5jdGlvbi4KLQkob2JqX2VsZl9zZWN0aW9uKTogQWRkIHRoZSBzZWN0aW9uIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2JlZ2luKTogRGVmaW5lLgotCShlbGZfYmVnaW4pOiBEZWNsYXJlLgotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ2FsbCBvYmpfYmVnaW4gaWYgaXQgaXMKLQlkZWZpbmVkLgotCi1GcmkgT2N0ICA0IDE4OjM3OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBTdWJ0cmFjdCB0aGUgc2VjdGlvbiBhZGRyZXNzCi0JZnJvbSBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIFRDX002OEsuCi0KLVRodSBPY3QgIDMgMTU6MTU6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogTWFrZSAudWFoYWxmLCAudWF3b3JkLCBhbmQKLQkudWF4d29yZCBhdmFpbGFibGUgZXZlbiBpZiBub3QgT0JKX0VMRi4KLQkobWRfYXRvZik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgd29yZFAuCi0KLVRodSBPY3QgIDMgMDA6MTY6NTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMHgwMC5jLCBjb25maWcvdGMtbW4xMHgwMC5oOiBOZXcgZmlsZXMKLQlmb3IgTWF0c3VzaGl0YSBNTjEweDAwIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtbjEweDAwLSotKgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1XZWQgT2N0ICAyIDE1OjU0OjAzIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBvYmotZXZheC5oOiBtb3ZlIG9wZW52bXMgZGVmaW5pdGlvbnMgZnJvbSBoZXJlIHRvIHRjLWFscGhhLmMuCi0JKiB0Yy1hbHBoYS5jOiBhZGQgc3VwcG9ydCBmb3Igdm1zX2Nhc2VfaGFjayBsaWtlIGluIHZheC92bXMuCi0JKGxvYWRfZXhwcmVzc2lvbik6IHRyYWNrIGNsb2JiZXJpbmcgb2YgYmFzZSByZWcgYmVmb3JlIGptcC9qc3IuCi0JKHNfYWxwaGFfZmlsZSk6IHBhc3MgY2FzZV9oYWNrIGZsYWdzIGFuZCBzb3VyY2UgZmlsZW5hbWUgdmlhCi0Jc3ltYm9sIHRhYmxlIHRvIGJmZC4KLQkqIHRjLWFscGhhLmggKFRDX0NPTlNfRklYX05FVyk6IGRlZmluZQotCi1UdWUgT2N0ICAxIDE2OjE2OjAxIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIG1pcHMtKi1lbGYqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgT2N0ICAxIDEyOjM3OjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX21hY3JvKTogV2FybiBpZiBhIG1hY3JvIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEKLQlwc2V1ZG8tb3AuCi0JKHNfc3BhY2UpOiBJbiBtNjhrIE1SSSBtb2RlLCBhbGlnbiB0byBhIHdvcmQgYm91bmRhcnkuCi0JKiBtYWNyby5jIChkZWZpbmVfbWFjcm8pOiBBZGQgbmFtZXAgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKiBtYWNyby5oIChkZWZpbmVfbWFjcm8pOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKHBhcnNlX2FyZ3MpOiBDaGFuZ2UgdmVyc2lvbiBwcmludGluZyB0byBtYXRjaCBjdXJyZW50IEdOVQotCXN0YW5kYXJkcy4KLQkqIGdhc3AuYyAoc2hvd191c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENoYW5nZSB2ZXJzaW9uIHByaW50aW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VIHN0YW5kYXJkcy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IENvcnJlY3QgYWNjZXNzIGNvbnRyb2wgdW5pdAotCXJlZ2lzdGVyIG51bWJlcnMuICBGcm9tIEtlbiBSb3NlIDxyb3NlQG5ldGNvbS5jb20+LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogQWRkIHNvbWUgc3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0gCShhbHBoYV9tYWNyb3MpOiBNb3ZlIHRvIHRvcCBvZiBmaWxlLiAgTWFrZSBzdGF0aWMuCi0JKGFscGhhX251bV9tYWNyb3MpOiBNb3ZlIHRvIHRvcCBvZiBmaWxlLgotCi1UdWUgT2N0ICAxIDA5OjM2OjE5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHRjLXY4NTAuaDogIERlZmluZSBMT0NBTF9MQUJFTCB0byByZWNvZ25pc2UgXy5MXyogc3ltYm9scwotCWdlbmVyYXRlZCBieSBEV0FSRi4KLQotU2F0IFNlcCAyOCAwMzozODowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBSZW1vdmUgYm9ndXMgY29kZSBpbiBCRkQ2NCBjYXNlLAotCWFuZCBqdXN0IGNhbGwgc3ByaW50Zl92bWEuCi0KLVRodSBTZXAgMjYgMTY6MDQ6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGV4cHIpOiBDaGFuZ2UgPj49IHRvID4+IChmaXggdHlwbykuICAoRnJvbSBtZWlzc25lcikuCi0KLVR1ZSBTZXAgMjQgMTk6MDU6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBDYWxsIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlmIGl0IGlzCi0JZGVmaW5lZC4KLQotVHVlIFNlcCAyNCAxMjoyMjoxOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfb3BlcmFuZCk6IENyZWF0ZWQuICBBbGxvd3Mgb3BlcmFuZHMgdG8gCi0Jc3RhcnQgd2l0aCAnIycuCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9vcGVyYW5kKTogVW5kZWZpbmVkLgotCi1Nb24gU2VwIDIzIDEyOjEzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoYWRkX2ZpeCk6IFRyZWF0IGEgd2lkdGggb2YgJzMnIGxpa2UgJ0InLgotCShtZF9hc3NlbWJsZSk6IEEgZml4dXAgd2lkdGggb2YgJzMnIG1lYW5zIGEgMSBieXRlIHJlbG9jLgotCi1UaHUgU2VwIDE5IDEyOjIxOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGp1c3QgUEMgcmVsYXRpdmUKLQlyZWxvYyBmb3IgdGhlIGk5NjAgZm9yIGEgcmVsb2MgaW4gdGhlIHNhbWUgc2VjdGlvbi4gIFRoaXMgdW5kb2VzCi0Jb25lIG9mIHRoZSB0d28gY2hhbmdlcyBtYWRlIEF1ZyAxOS4KLQotV2VkIFNlcCAxOCAxMjoxMTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9lbmRlZik6IEJvdGggdmVyc2lvbnM6IE1vdmUgQ19TVEFUCi0Jc3ltYm9scyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotTW9uIFNlcCAxNiAxMTo0MTo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoZXhwcik6IEFsd2F5cyB1c2UgdW5zaWduZWQgcmlnaHQgc2hpZnRzIGZvciA+Pi4KLQotVGh1IFNlcCAxMiAxMDoyNTo0NSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IFVwZGF0ZSB0d28gdGh1bWIgaW5zdHJ1Y3Rpb24KLSAJc2xvdHMgd2hlbiBwcm9jZXNzaW5nIEJMIGZpeHVwcy4KLQotCSogY29uZmlnL3RjLWFybS5jIChvdXRwdXRfaW5zdCk6IEVuc3VyZSBUaHVtYiBCTCBmaXh1cCBpcyBtYXJrZWQKLSAJb24gdGhlIGZpcnN0IGhhbGYgb2YgdGhlIGluc3RydWN0aW9uLgotCi1XZWQgU2VwIDExIDAwOjA5OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IENyZWF0ZSBhbiBleHByZXNzaW9uIHN5bWJvbCBmb3IgYSBjb21wbGV4Ci0Jc3RhYnMgZXhwcmVzc2lvbiwgcmF0aGVyIHRoYW4gZ2l2aW5nIGFuIGVycm9yLgotCi0JKiBlY29mZi5jIChlY29mZl9uZXdfZmlsZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIHdlIGFyZSBzdGlsbCBpbgotCXRoZSBzYW1lIGZpbGUuCi0KLVR1ZSBTZXAgMTAgMTE6NDU6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IEZpbGwgaW4gdGhlIHZhbHVlIGZvciBhIGNvbnN0YW50Ci0JanVtcCwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSByZWxvYy4KLQotTW9uIFNlcCAgOSAxMDo1Nzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBhbiBpbnN0cnVjdGlvbiB3aGljaAotCXNldHMgYSBjb25kaXRpb24gY29kZSB3aXRoIGFuIGluc3RydWN0aW9uIHdoaWNoIHVzZXMgYSBjb25kaXRpb24KLQljb2RlLgotCShtaXBzX2lwKTogSW4gY2FzZXMgJ04nIGFuZCAnTScsIGxvb2sgZm9yICRmY2NOIHJhdGhlciB0aGFuIGFuCi0JaW1tZWRpYXRlIHZhbHVlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IFJlY29nbml6ZSByNTAwMCBmb3IgY3B1LgotCShtaXBzX2lwKTogR2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIGlmIHRoZSBJU0EgbGV2ZWwgaXMgd3JvbmcuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtbWNwdT1bdl1bcl01MDAwLgotCi1TYXQgU2VwICA3IDEzOjI1OjU1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoQ09VTlRfVE9QX1pFUk9FUyk6IEFkZGVkIG1hY3JvIHRvIGNvdW50Ci0gCWxlYWRpbmcgemVyb2VzLgotCShsb2FkX3JlZ2lzdGVyKTogRW5zdXJlIGhpMzIgYml0cyBhcmUgbm90IGxvc3QgZHVyaW5nIGxvMzJiaXQKLSAJcHJvY2Vzc2luZy4gRml4IHNoaWZ0IG9mZnNldCB0aGF0IHdhcyBvdmVyZmxvd2luZyBpbnRvIHRoZSBuZXh0Ci0gCWluc3RydWN0aW9uIGZpZWxkLiBBZGQgY29kZSB0byBnZW5lcmF0ZSBzaG9ydGVyIHNlcXVlbmNlcyBmb3IKLSAJY29uc3RhbnRzIHdpdGggYSBzaW5nbGUgY29udGlndW91cyBzZXFldWVuY2Ugb2Ygb25lcy4KLQotRnJpIFNlcCAgNiAxNzowNzoxMiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZDEwdl9kb3Rfd29yZCk6IE5ldyBmdW5jdGlvbiB0byBzdXBwb3J0Ci0JIkB3b3JkIiB3aXRoIHRoZSB3b3JkIHBzZXVkby1vcC4KLQkobWRfYXBwbHlfZml4Myk6IENsZWFudXAgYW5kIGNoYW5nZXMgdG8gc3VwcG9ydCBjb3JyZWN0IHNpemVzCi0JZm9yIDE2IGFuZCAxOC1iaXQgcmVsb2NzLgotCi1GcmkgU2VwICA2IDE2OjAwOjI5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1hb3V0KTogU2V0IGBlbScuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnL3RlLXNwYXJjYW91dC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQlJZmRlZiBURV9TUEFSQ09VVCBkZWZpbmUgVEFSR0VUX0ZPUk1BVCBhbmQgU1BBUkNfQklFTkRJQU4uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoSU5TTl9CSUdfRU5ESUFOKTogTmV3IG1hY3JvLgotCShTUEVDSUFMX0NBU0Vfe1NFVFNXLFNFVFh9KTogRGVmaW5lLgotCSh7Tk9QLE9SLEZNT1ZTLFNFVEhJLFNMTFgsU1JBfV9JTlNOKTogRGVmaW5lLgotCShtZF9iZWdpbik6IERlbGV0ZSBzZXR0aW5nIG9mIGB0YXJnZXRfYmlnX2VuZGlhbicuCi0JKG91dHB1dF9pbnNuKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFJld3JpdGUuICBBZGQgYHNldHgnIHN1cHBvcnQuCi0JKHNwYXJjX2lwKTogSGFuZGxlIGAwJyBvcGVyYW5kIGNoYXIuICBSZWNvZ25pemUgc2V0dXcsIHNldHN3LCBzZXR4Ci0Jc3BlY2lhbCBjYXNlcy4KLQkobWRfYXRvZik6IEFkZCBsaXR0bGUgZW5kaWFuIHN1cHBvcnQuCi0JKG1kX251bWJlcl90b19jaGFycyk6IExpa2V3aXNlLgotCShtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQkobWRfbG9uZ29wdHMpOiBSZWNvZ25pemUgLUVMLC1FQiBpZmRlZiBTUEFSQ19CSUVORElBTi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuCi0JKG1kX3Nob3dfdXNhZ2UpOiBQcmludCAtRUwsIC1FQiBpZmRlZiBTUEFSQ19CSUVORElBTi4KLQotVGh1IFNlcCAgNSAxMzo0MDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX25ld19maWxlKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuaCAoZWNvZmZfbmV3X2ZpbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfYXBwX2ZpbGUpOiBEZWZpbmUuCi0KLVRodSBTZXAgIDUgMTM6Mzk6MjUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBCaWFzIHRoZSAubGl0OCBzZWN0aW9uCi0Jc3ltYm9sIGJ5IDMyayBzbyB0aGF0IG91ciAxNi1iaXQgc2lnbmVkIG9mZnNldCBjYW4gYWRkcmVzcyB0aGUKLQllbnRpcmUgY2h1bmsuICBSZXBvcnRlZCBieSA8bWF0dEBsa2cuZGVjLmNvbT4uCi0KLVdlZCBTZXAgIDQgMTA6MjM6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB0bXAuCi0KLVdlZCBTZXAgIDQgMTE6MjQ6MjkgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmVtb3ZlIHVubmVjZXNzYXJ5IGNvZGUgdGhhdAotIAl3YXMgY2F1c2luZyB0aGUgaGlnaCAzMmJpdHMgb2YgNjRiaXQgY29uc3RhbnRzIHRvIGJlIGxvc3QuCi0JCi1UdWUgU2VwICAzIDEzOjUyOjU2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBZGRlZCBjaGFuZ2VzIHRvIHN1cHBvcnQgZnVuY3Rpb24KLQlwb2ludGVycyBhbmQgIkB3b3JkIiBzeW50YXguCi0KLVR1ZSBTZXAgIDMgMTE6NTc6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBSZW1vdmUgY29tbWVudGVkIG91dCBhbmQgI2lmIDAnZCBjb2RlLgotCSh2ODUwX3JlbG9jX3ByZWZpeCk6IFByb3ZpZGUgcHJvdG90eXBlLgotCShwb3N0Zml4LCBnZXRfcmVsb2MsIGJ1aWxkX2luc24pOiBSZW1vdmUgcHJvdG90eXBlcyBmb3Igbm9uZXhpc3RhbnQKLQlmdW5jdGlvbnMuCi0JKG1kX2JlZ2luLCBtZF9hc3NlbWJsZSwgbWRfYXBwbHlfZml4Myk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCShtZF9hc3NlbWJsZSk6IEFkZCBkZWZhdWx0IHRvIGNhc2Ugc3RhdGVtZW50LgotCi1TYXQgQXVnIDMxIDE2OjAzOjAwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb21wdXRlIHNpemUgb2YgdGhlIGluc3RyY3Rpb24KLQlmcm9tIHRoZSBvcGNvZGUuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2FwcGx5X2ZpeDMpOiBEbyBzaW1wbGUgYnl0ZSwgc2hvcnQgYW5kCi0Jd29yZCBmaXh1cHMgdG9vLgotCi1GcmkgQXVnIDMwIDIzOjUwOjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXBwbHlfZml4Myk6IFVzZSBsaXR0bGUgZW5kaWFuIGdldC9wdXQKLQlyb3V0aW5lcyB0byBmZXRjaC9zdG9yZSB0aGUgdXBkYXRlZCBpbnN0cnVjdGlvbiBmcm9tL3RvIG1lbW9yeS4KLQkodjg1MF9pbnNlcnRfb3BlcmFuZCk6IElmIHRoZSBvcGVyYW5kIGhhcyBhIHNwZWNpYWxpemVkIGluc2VydAotCXJvdXRpbmUsIGNhbGwgaXQuCi0KLUZyaSBBdWcgMzAgMTg6MzU6MjYgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHJlZ19uYW1lX3NlYXJjaCk6IEFsaWduIGNhbGxpbmcgY29udmVudGlvbiB0bwotIAliZSBsaWtlIGlkZW50aWNhbCBmdW5jdGlvbiBmb3VuZCBpbiB0Yy1wcGMuYy4KLQkoZ2V0X3JlbG9jKTogUmVtb3ZlZC4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBOZXcgZnVuY3Rpb24sIHBhcnNlIGxvKCksIGhpKCkgYW5kIGhpMCgpLgotCShtZF9hc3NlbWJsZSk6IGVtaXQgZml4dXBzLgotCShtZF9wY3JlbF9mcm9tKTogcmVuYW1lZCBmcm9tIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgZW1pdCBwcm9wZXIKLSAJZGlzcGxhY2VtZW50LgotCShtZF9hcHBseV9maXgzKTogaGFuZGxlIGZpeHVwcy9yZWxvY3MuCi0JKiBjb25maWcvdGMtdjg1MC5oIChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBSZW1vdmVkIGRlZmluaXRpb24uCi0JCi1GcmkgQXVnIDMwIDE4OjEyOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBTSCBFTEYgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbiAoc2gtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy90Yy1zaC5oIChUQVJHRVRfQVJDSCk6IERlZmluZS4KLQkoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLSAJKFRDX0NPRkZfRklYMlJUWVBFKTogT25seSBkZWZpbmUgaWYgT0JKX0NPRkYuCi0JKEJGRF9BUkNILCBDT0ZGX01BR0lDLCBUQ19DT1VOVF9SRUxPQyk6IExpa2V3aXNlLgotCShUQ19SRUxPQ19NQU5HTEUsIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IExpa2V3aXNlLgotCShET19OT1RfU1RSSVAsIE5FRURfRlhfUl9UWVBFLCBUQ19LRUVQX0ZYX09GRlNFVCk6IExpa2V3aXNlLgotCShUQ19DT0ZGX1NJWkVNQUNIREVQLCB0Y19mcm9iX2ZpbGUpOiBMaWtld2lzZS4KLQkoU1VCX1NFR01FTlRfQUxJR04pOiBMaWtld2lzZS4KLQkoUkVMT0NfMzIpOiBEb24ndCBkZWZpbmUuCi0JKHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZSBpZiBPQkpfRUxGLgotCShUQVJHRVRfRk9STUFUKTogRGVmaW5lIGlmIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtc2guYzogVXNlIEJGRCByZWxvYyBjb2RlcyBpbnN0ZWFkIG9mIFNIIENPRkYgcmVsb2MKLQludW1iZXJzIHRocm91Z2hvdXQuCi0JKHRjX2NyYXdsX3N5bWJvbF9jaGFpbik6IE9ubHkgZGVmaW5lIGlmIE9CSl9DT0ZGLgotCSh0Y19oZWFkZXJzX2hvb2ssIHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBMaWtld2lzZS4KLQkoc3RydWN0IHNoX2NvdW50X3JlbG9jcyk6IERlZmluZS4KLQkoc2hfY291bnRfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCXNoX2Zyb2JfZmlsZS4gIEFkZCBCRkRfQVNTRU1CTEVSIGNvZGUuCi0JKHNoX2Zyb2Jfc2VjdGlvbik6IExpa2V3aXNlLgotCShzaF9mcm9iX2ZpbGUpOiBDYWxsIHNoX2Zyb2Jfc2VjdGlvbi4KLQkobWRfY29udmVydF9mcmFnKTogSWYgQkZEX0FTU0VNQkxFUiwgY2hhbmdlIHR5cGUgb2YgaGVhZGVycywgYW5kCi0JY2FsbCBzZWN0aW9uX3N5bWJvbCByYXRoZXIgdGhhbiBzZWdfaW5mbyAoc2VnKS0+ZG90LgotCShtZF9zZWN0aW9uX2FsaWduKTogQWRkIE9CSl9FTEYgdmVyc2lvbi4KLQkoU1dJVENIX1RBQkxFX0NPTlMpOiBEZWZpbmUuCi0JKFNXSVRDSF9UQUJMRSk6IFVzZSBTV0lUQ0hfVEFCTEVfQ09OUy4KLQkobWRfYXBwbHlfZml4KTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlcyBpZiBCRkRfQVNTRU1CTEVSLiAgT25seQotCWhhbmRsZSBmeF9yX3R5cGUgPT0gMCBpZiBub3QgQkZEX0FTU0VNQkxFUi4gIFJldHVybiAwIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoc3RydWN0IHJlbG9jX21hcCk6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkoY29mZl9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBVc2UgY29mZl9yZWxvY19tYXAgdG8gY29udmVydCBmeF9yX3R5cGUuCi0JKHRjX2dlbl9yZWxvYyk6IE5ldyBmdW5jdGlvbiBpZiBCRkRfQVNTRU1CTEVSLgotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSWZkZWYgb3V0IGZ4X3doZXJlIHRlc3Qgd2hpY2ggdHJpZ2dlcnMKLQlpbmFwcHJvcHJpYXRlbHkgZm9yIFNIIEVMRi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IGFuZAotCW9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBCRkRfUkVMT0NfMTYsIG5vdAotCUJGRF9SRUxPQ19OT05FLCB3aGVuIGNhbGxpbmcgZml4X25ld19leHAgZm9yIGEgYnJva2VuIHdvcmQuCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogRml4IGNvbnZlcnNpb24gb2YgYnl0ZSBjb3VudCB0byBCRkQgcmVsb2MKLQljb2RlLgotCi1GcmkgQXVnIDMwIDE0OjQ3OjM4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEZpeCBwcm9ibGVtIHdpdGggY2FsY3VsYXRpbmcgCi0JYnJhbmNoIHNpemVzIGluIGFjcm9zcyBzZWN0aW9ucy4KLQotRnJpIEF1ZyAzMCAwMDo0NDoxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy04NTAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgaGkoKSBjb3JyZWN0bHkuICBIYW5kbGUKLQloaTAoKSB0b28uCi0KLVdlZCBBdWcgMjggMjM6MTE6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9iZWdpbik6IERlYWwgd2l0aCBlbmQgb2Ygb3Bjb2RlCi0JdGFibGUgbWFya2VyLgotCi1XZWQgQXVnIDI4IDE5OjIwOjA0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEZpeCBhIGJ1ZyB3aGljaCBjb3VsZCBnZW5lcmF0ZQotCXRoZSB3cm9uZyBvcGNvZGUgZm9yIGNhc2VzIGxpa2Ugc3QydyB3aGVyZSB0aGVyZSBhcmUgbWFueSBmb3JtcwotCW9mIHRoZSBzYW1lIGluc3RydWN0aW9uLgotCi1UdWUgQXVnIDI3IDEzOjUzOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSWYgbWRfcGFyc2VfbmFtZSBpcyBkZWZpbmVkLCBjYWxsIGl0IGJlZm9yZQotCWNhbGxpbmcgc3ltYm9sX2ZpbmRfb3JfbWFrZS4KLQkqIGNvbmZpZy90Yy1wcGMuaCAobWRfcGFyc2VfbmFtZSk6IERlZmluZS4KLQkocHBjX3BhcnNlX25hbWUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXBwYy5jIChyZWdfbmFtZV9zZWFyY2gpOiBBZGQgcmVncyBhbmQgcmVnY291bnQKLQlwYXJhbWV0ZXJzLgotCShyZWdpc3Rlcl9uYW1lKTogVXBkYXRlIGNhbGwgdG8gcmVnX25hbWVfc2VhcmNoLgotCShjcl9vcGVyYW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY3JfbmFtZXMpOiBOZXcgc3RhdGljIGNvbnN0IGFycmF5LgotCShwcGNfcGFyc2VfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBJZiBQUENfT1BFUkFORF9DUiBpcyBzZXQgaW4gdGhlIG9wZXJhbmQgZmxhZ3MsIHNldAotCWNyX29wZXJhbmQgYmVmb3JlIGNhbGxpbmcgZXhwcmVzc2lvbi4KLQotVHVlIEF1ZyAyNyAwOTowNTo1MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEFkZCBuZXcgYXJndW1lbnQgdG8KLQlocHBhX2dlbl9yZWxvY190eXBlIGNhbGwuCi0KLU1vbiBBdWcgMjYgMTg6MjQ6NTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeGVkICIud29yZCIuICBGaXhlZCBwcm9ibGVtIHdpdGggcmFuZ2UgY2hlY2tpbmcKLQlvbiBhZGRyZXNzZXMuICBJbXByb3ZlZCBlcnJvciBtZXNzYWdlcy4KLQkqIGRvYy9jLWQxMHYudGV4aTogQWRkZWQgZG9jcyBmb3IgcmVnaXN0ZXIgcGFpcnMuCi0KLU1vbiBBdWcgMjYgMTM6Mzk6MjcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogRml4IGJ1ZyBpbiBwYXJhbGxlbCAKLQljaGVja2luZyBjb2RlLgotCi1Nb24gQXVnIDI2IDE0OjM4OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoaW5pdF9maWxlKTogSW5pdGlhbGl6ZSBmTWVyZ2UgdG8gMS4KLQkoYWRkX2ZpbGUpOiBSZXN0b3JlIG9sZCBmaWxlIG1lcmdpbmcgY29kZSwgYnV0IG9ubHkgbWVyZ2UgZmlsZXMgaWYKLQlmTWVyZ2UgaXMgc2V0LgotCShlY29mZl9kaXJlY3RpdmVfbG9jKTogQ2xlYXIgZk1lcmdlIGZpZWxkIG9mIGN1cnJlbnQgZmlsZS4KLQkoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IExpa2V3aXNlLgotCi1GcmkgQXVnIDIzIDExOjQwOjQ3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkb2MvYy1kMTB2LnRleGk6IEZpeCB0eXBvLiAKLQotRnJpIEF1ZyAyMyAxMDo0MTozMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdCBiaXQgbWFza2luZyBmb3IKLQloaSBhbmQgbG8gZXhwcmVzc2lvbnMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogUm91Z2ggY3V0IGF0IGRlbWFuZGluZwotCSJlcCIgb3IgInIzMCIgaW4gc3N0IGFuZCBzbGQgaW5zdHJ1Y3Rpb25zLgotCShtZF9hcHBseV9maXgzKTogRG9uJ3QgYWJvcnQuICBKdXN0IHdhcm4gdGhhdCB3ZSBkb24ndAotCWhhdmUgcmVsb2NzIHlldC4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAoQ0NfTkFNRV9DTlQpOiBEZWZpbmUuCi0JKGNjX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIFY4NTBfT1BFUkFORF9DQyBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZm9yZ2V0IHRvIGluaXRpYWxpemUKLQkiaW5zbiIhCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHJlZ19uYW1lX3NlYXJjaCk6IEdlbmVyYWxpemUgdG8gc2VhcmNoCi0JYW55IGdpdmVuIHJlZ2lzdGVyIHRhYmxlLgotCShyZWdpc3Rlcl9uYW1lKTogUGFzcyBhcHByb3ByaWF0ZSB0YWJsZSBhbmQgc2l6ZSB0byByZWdfbmFtZV9zZWFyY2guCi0JKHN5c3RlbV9yZWdpc3Rlcl9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShTWVNSRUdfTkFNRV9DTlQpOiBEZWZpbmUuCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIG9wZXJhbmRzIHdoaWNoIGFyZSBzeXN0ZW0gcmVnaXN0ZXJzLgotCQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJZiB3ZSBmaW5kIGEgcmVnaXN0ZXIsIGJ1dCB0aGUKLQlvcGNvZGUgZG9lc24ndCB3YW50IGEgcmVnaXN0ZXIsIHRoZW4gd2UgZG9uJ3QgaGF2ZSBhIG1hdGNoLgotCShtZF9hc3NlbWJsZSk6IEdldCBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiBmcm9tIHRoZSBvcGNvZGUgdGFibGUuCi0KLVRodSBBdWcgMjIgMTA6MjA6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBhbmQgc3Vic3RpdHV0ZSBITERFTlYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERU5WKTogTmV3IHZhcmlhYmxlLgotCShhcy5uZXcpOiBVc2UgJChITERFTlYpLgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZW5kZWYpOiBBdm9pZCBhIGRpdmlzaW9uIGJ5IHplcm8gZXJyb3IKLQlpZiBhbiBhcnJheSBkaW1lbnNpb24gaXMgbm90IGtub3duLgotCi1UaHUgQXVnIDIyIDEwOjUwOjAwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXggYSByZWxvYyBidWcgY2F1c2VkIGJ5IG15IGxhc3QgY2hhbmdlLiAKLQkqIGRvYy9jLWQxMHYudGV4aTogQ2xlYW51cC4KLQkKLVR1ZSBBdWcgMjAgMTU6MTU6MTYgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLXY4NTAuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUgKHY4NTAtKi1lbGYpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluICh2ODUwLSotZWxmKTogTmV3IHRhcmdldC4KLQkKLVdlZCBBdWcgMjEgMTU6NTA6NTQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWQxMHYudGV4aTogTmV3IGZpbGUuCi0JKiBkb2MvYWxsLnRleGk6IEFkZGVkIEQxMFYgc3R1ZmYuCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkZWQgRDEwViBzdHVmZi4KLQotVHVlIEF1ZyAyMCAxNDoxMDowMiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWxsIHJlZmVyZW5jZXMgdG8gZGVmaW5lZCBzeW1ib2xzIHNob3VsZAotIAlub3cgdXNlIHRoZSBvcHRpbWFsIGluc3RydWN0aW9uLiAgLmZsb2F0IGFuZCAuZG91YmxlIG5vdyB3b3JrLiAKLQotTW9uIEF1ZyAxOSAxNDo0MTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQWRqdXN0IFBDIHJlbGF0aXZlIHJlbG9jIGJ5Ci0Jc2VjdGlvbiBhZGRyZXNzIGZvciB0aGUgaTk2MCBhcyBpcyBkb25lIGZvciB0aGUgaTM4Ni4KLQotVGh1IEF1ZyAxNSAxNjozNzo1OSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IEFkZCB3aWxkY2FyZHMgZm9yIGNvbmZpZyBtYXRjaGluZywgYWRkIG1pcHMtKi0qCi0JY2FzZSwgZm9yd2FyZC1pbmNsdWRlIGJmZC9lbGYtYmZkLmguCi0KLVRodSBBdWcgMTUgMTM6MjQ6MzAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBvcGNvZGUKLSAgICAgICAgdGFibGUgdG8gaGVscCBkZXRlcm1pbmluZSB3aGljaCBpbnN0cnVjdGlvbnMgY2FuIGJlIGRvbmUKLSAgICAgICAgaW4gcGFyYWxsZWwuIAotCi1UaHUgQXVnIDE1IDE3OjAxOjMxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jOiBNYWpvciBjaGFuZ2VzIHRvIGFkZCBUaHVtYiBzdXBwb3J0LCB3aXRoIGxvdHMKLSAJb2YgY2hhbmdlIGlucHV0IGZyb20gPHJlYXJuc2hhQGFybWx0ZC5jby51az4uCi0JUmV2ZXJ0ZWQgdG8gSU5TTl9TSVpFIG1hY3JvLCByYXRoZXIgdGhhbiBpbnNuX3NpemUgdmFyaWFibGUuCi0JKGluc25zKTogQWRkZWQgQVJNICJieCIgaW5zdHJ1Y3Rpb24gc3VwcG9ydC4KLQkodGluc25zKTogQWRkZWQgVGh1bWIgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbiBzdHJ1Y3R1cmUuCi0JKGFybV90b3BzX2hzaCk6IEFkZGVkIGhhc2ggc3RydWN0dXJlIGZvciBUaHVtYiBvcGNvZGVzLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGRlZCAiLmFybSIsICIudGh1bWIiIGFuZCAiLmNvZGUiIHBzZXVkby1vcHMuCi0JKG9wY29kZV9zZWxlY3Qsc19hcm0sc190aHVtYixzX2NvZGUpOiBBZGRlZC4KLQkoZGVjb2RlX3NoaWZ0KTogQWxsb3cgdXBwZXItY2FzZSBSUlguCi0JKGRvX2xkc3QpOiBTaW1wbGVyIGhhbGZ3b3JkIHN1cHBvcnQuCi0JKGRvX2xkbXN0bSk6IEltcHJvdmVkLgotCShyZWdfbGlzdCwgZG9fYngsIHRodW1iX3JlZywgdGh1bWJfYWRkX3N1YiwgdGh1bWJfc2hpZnQsCi0gCXRodW1iX21vdl9jb21wYXJlLCB0aHVtYl9sb2FkX3N0b3JlLCBkb190X2FyaXQsIGRvX3RfYWRkLAotIAlkb190X2FzciwgZG9fdF9icmFuY2gsIGRvX3RfYngsIGRvX3RfY29tcGFyZSwgZG9fdF9sZG1zdG0sCi0gCWRvX3RfbGRyYiwgZG9fdF9sZHJoLCBkb190X2xkcywgZG9fdF9sc2wsIGRvX3RfbHNyLCBkb190X21vdiwKLSAJZG9fdF9wdXNoX3BvcCwgZG9fdF9zdHIsIGRvX3Rfc3RyYiwgZG9fdF9zdHJoLCBkb190X3N1YiwgZG9fdF9zd2ksCi0gCWRvX3RfYWRyKTogQWRkZWQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX0FSTV9USFVNQl8qIHJlbG9jYXRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW10aHVtYi4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZWQgdG8gcmVmbGVjdCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbi4KLQkoYXJtX2RhdGFfaW5fY29kZSwgYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSk6IEFkZGVkLgotCSogY29uZmlnL3RjLWFybS5oOiBQcm92aWRlIFRDX0ZJWF9UWVBFIHRvIGFsbG93IHByaXZhdGUgQVJNCi0gCWZyYWdtZW50IGluZm9ybWF0aW9uIHRvIGJlIGhlbGQuCi0KLVRodSBBdWcgMTUgMTY6MTI6MDAgMTk5NiAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiB0Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEFsc28gc2V0IGZpeFAtPmZ4X2RvbmUgaWYgZnhfYWRkc3kgaXMgCi0Jbm9uLW51bGwsIGJ1dCBpcyBhIGNvbnN0YW50LgotCShmaXhfbmV3X2FybSk6IENhbGwgbWFrZV9leHByX3N5bWJvbCB0byBtYWtlIHRoZSBleHByZXNzaW9uIHN5bWJvbAotCXNvIHRoYXQgZXJyb3IgcmVwb3J0aW5nIHdpbGwgd29yayBjb3JyZWN0bHkuCi0KLVdlZCBBdWcgMTQgMTA6Mzc6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcwotCWFnYWluc3Qgd2VhayBzeW1ib2xzLgotCi1UdWUgQXVnIDEzIDE3OjM5OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ1RJT04pOiBEZWZpbmUgaWYgT0JKX1hDT0ZGLgotCShwcGNfZm9yY2VfcmVsb2NhdGlvbik6IERlY2xhcmUgaWYgT0JKX1hDT0ZGLgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZm9yY2VfcmVsb2NhdGlvbik6IE5ldyBmdW5jdGlvbiBpZgotCU9CSl9YQ09GRi4KLQotTW9uIEF1ZyAxMiAxNjo0OTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmggKEJZVEVfT1JERVIpOiBEb24ndCBkZWZpbmUuICBObyBsb25nZXIgdXNlZC4KLQotRnJpIEF1ZyAgOSAxNzo0ODoyOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4IHByb2JsZW0gd2l0aCByZWxvY3MuIAotCi1GcmkgQXVnICA5IDE0OjE2OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogSWYgbm90IEJGRF9BU1NFTUJMRVIsIGFsd2F5cyBhbGlnbgotCXdpdGggbm9wcyBpZiBub3QgaW4gZGF0YV9zZWN0aW9uIG9yIGJzc19zZWN0aW9uLgotCi1UaHUgQXVnICA4IDEyOjMyOjU2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JQWRkIHN1cHBvcnQgZm9yIG9wZW5WTVMvQWxwaGEuCi0JKiBhcy5oIChQUklOVEZfTElLRSk6IERvbid0IGRlZmluZSBpZiBWTVMsIGZvciBub3cuCi0JKiBjb25maWcvb2JqLWV2YXguYzogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWV2YXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtYWxwaGEuYzogQWRkIHN1cHBvcnQgZm9yIEVWQVggZm9ybWF0IGlmIE9CSl9FVkFYIGlzCi0JZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oOiBBZGQgc3VwcG9ydCBmb3IgRVZBWCBmb3JtYXQgaWYgT0JKX0VWQVggaXMKLQlkZWZpbmVkLiAgQWRkIGNhc2UgZm9yIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyLgotCSogY29uZmlnL3Ztcy1hLWNvbmYuaDogTmV3IGZpbGUuCi0JKiBjb25mLWEtZ2FzLmNvbTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IEFkZCB0YXJnZXQgYWxwaGEtKi0qdm1zKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBBbGlnbiBic3Nfc2VnIG9uIDggYnl0ZSBib3VuZGFyeSBpZiBPQkpfRVZBWC4KLQlEb24ndCBjYWxsIGZmcyBvbiBvcGVuVk1TL0FscGhhLgotCi1XZWQgQXVnICA3IDE0OjE5OjAzIDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBHQVNfQ0hFQ0tfREVDTF9ORUVERUQgaW5jbHVkZSA8c3RyaW5nLmg+IG9yCi0JPHN0cmluZ3MuaD4gaWYgdGhleSBleGlzdC4gIENhbGwgR0FTX0NIRUNLX0RFQ0xfTkVFREVEIG9uIHN0cnN0cgotCWFuZCBzYnJrLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCi0JKE5FRURfREVDTEFSQVRJT05fU0JSSyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVidWlsZC4KLQkqIGFzLmg6IE9ubHkgaW5jbHVkZSA8c3RyaW5ncy5oPiBpZiBIQVZFX1NUUklOR1NfSC4KLQkoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KLQkqIGFzLmM6IElmIEhBVkVfU0JSSyBhbmQgTkVFRF9ERUNMQVJBVElPTl9TQlJLLCBkZWNsYXJlIHNicmsuCi0KLVdlZCBBdWcgIDcgMTE6NTA6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi0JYnkgYSBjb25zdGFudCBiZWZvcmUgZW50ZXJpbmcgdGhlIG1haW4gc3dpdGNoLiAgUmVqZWN0IGF0dGVtcHRzIHRvCi0JYXBwbHkgYW4gYXJpdGhtZXRpYyBmdW5jdGlvbiB0byBub24tYWJzb2x1dGUgc3ltYm9scywgZXhjZXB0IGZvcgotCXRoZSBzcGVjaWFsIGNhc2Ugb2Ygc3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMgaW4gdGhlIHNhbWUKLQlzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zZWN0aW9uX2FsaWduKTogRG8gYWxpZ24gaWYgT0JKX0VMRiwgYnV0Ci0Jbm90IHRvIG1vcmUgdGhhbiBhIDE2IGJ5dGUgYm91bmRhcnkuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2dlbl9yZWxvYyk6IEFjY2VwdCBhbGwgcmVsb2NzOyByZW1vdmUKLQkjaWZuZGVmIE9CSl9FTEYgbGluZXMuICBGcm9tIEVyaWMgVmFsZXR0ZSA8dmFsZXR0ZUBjcmYuY2Fub24uZnI+LgotCSh0Y19nZW5fcmVsb2MpOiBJZiBvdXQgb2YgbWVtb3J5IGNhbGwgYXNfZmF0YWwgcmF0aGVyIHRoYW4KLQlhc3NlcnQuICBJZiBubyBob3d0byBmb3VuZCwgY2FsbCBhc19iYWRfd2hlcmUgcmF0aGVyIHRoYW4KLQlhc19mYXRhbC4gIENoYW5nZSB0aGUgZXJyb3IgbWVzc2FnZSBzbGlnaHRseS4gIFNldCBob3d0byB0byBhCi0Jbm9uLU5VTEwgdmFsdWUgaW4gb3JkZXIgdG8ga2VlcCBnb2luZy4KLQotVHVlIEF1ZyAgNiAxMjo1ODowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkZWQgY29kZSB0byBzdXBwb3J0IDMyLWJpdCBmaXh1cHMgZm9yIHN0YWJzLgotCi1UdWUgQXVnICA2IDExOjE1OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IE5ldyBvcGVyYW5kICJzaXplIiBkZXJpdmVkCi0JZnJvbSAiLmIiLCAiLnciIGFuZCAiLmwiIGV4dGVuc2lvbnMuICBBbGwgY2FsbGVycyBjaGFuZ2VkLiAgSWYKLQl0aGUgYmFzZSBpbnN0cnVjdGlvbiBoYXMgbm8gb3BlcmFuZHMsIHRoZW4gdXNlIHRoZSBzaXplIHRvCi0JZGV0ZXJtaW5lIHdoaWNoIHNwZWNpZmljIGluc3RydWN0aW9uIHRvIHVzZS4KLQotTW9uIEF1ZyAgNSAxNDoyMToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1lbV9mbXQpOiBDYWxsIHBhcnNlX2V4cHIgYmVmb3JlIGVtaXQuCi0KLUZyaSBBdWcgIDIgMTE6MjM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zZWN0aW9uX2FsaWduKTogRG9uJ3QgY2hhbmdlIGFkZHIgaWYKLQlPQkpfRUxGLgotCi1UaHUgQXVnICAxIDIzOjUxOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZXMuCi0JCi1XZWQgSnVsIDMxIDE0OjQ2OjExIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBEaXNhYmxlIHJhbmdlIGNoZWNraW5nIG9uIDE2LWJpdCB2YWx1ZXMuCi0KLVdlZCBKdWwgMzEgMTY6Mjc6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogU2V0IG9rX2FyY2ggZm9yIGV2ZXJ5IGluc3RydWN0aW9uLAotCW5vdCBqdXN0IHRoZSBvbmVzIHRoYXQgZG9uJ3QgbWF0Y2guCi0KLVdlZCBKdWwgMzEgMTE6NDU6MTUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeGVkIGJ1Z3MgaW4gc2hvcnQgcmVsb2NzIGFuZCByYW5nZSBjaGVja2luZy4KLQotV2VkIEp1bCAzMSAxNTo0MTo0MiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYzogQ2hhbmdlZCBJTlNOX1NJWkUgdG8gdmFyaWFibGUgaW5zbl9zaXplLCBhcwotIAlwcmUtY3Vyc29yIHRvIGFkZGluZyBUaHVtYiBzdXBwb3J0LiBBbHNvIGFkZGVkIGNwdV92YXJpYW50IGZsYWcKLSAJaW5mb3JtYXRpb24gdG8gZWFjaCBvZiB0aGUgYXNtX2ZsZyBzdHJ1Y3R1cmVzLgotCShtZF9wYXJzZV9vcHRpb24pOiBVcGRhdGVkIEFSTTcgcGFyc2luZyB0byBhbGxvdyAndCcgZm9yCi0gCXRodW1iL2hhbGZ3b3JkIHN1cHBvcnQsIGFzd2VsbCBhcyAnbScgZm9yIGxvbmcgbXVsdGlwbHkuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGVkIGhlbHAgbWVzc2FnZS4KLQkobWRfYXNzZW1ibGUpOiBDaGVjayB0aGF0IGluc3RydWN0aW9uIGZsYWdzIGFyZSBhcHBsaWNhdGVkIHRvIHRoZQotIAljdXJyZW50IGNwdSB2YXJpYW50LgotCShtZF9hcHBseV9maXgzLCB0Y19nZW5fcmVsb2MpOiBBZGQgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOCBhbmQKLSAJQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwgcmVsb2NhdGlvbiBzdXBwb3J0IGZvciBuZXcgaGFsZndvcmQgYW5kCi0gCXNpZ25leHRlbnNpb24gaW5zdHJ1Y3Rpb25zLgotCShkb19sZHN0KTogR2VuZXJhdGUgaGFsZndvcmQgYW5kIHNpZ25leHRlbnNpb24gdmFyaWFudHMgaWYKLSAJbW5lbW9uaWMgZmxhZ3MgbWF0Y2guCi0JKGxkc3RfZXh0ZW5kKTogRG8gbm90IGFsbG93IHNoaWZ0cyBpbiB0aGUgb2Zmc2V0IGZpZWxkIG9mIGhhbGZ3b3JkCi0gCW9yIHNpZ25leHRlbnNpb24gaW5zdHJ1Y3Rpb25zLgotCSh2YWxpZGF0ZV9vZmZzZXRfaW1tKTogUHJvdmlkZSBjaGVjayBvbiBoYWxmd29yZCBhbmQgc2lnbmV4dGVuc2lvbgotIAlpbW1lZGlhdGUgcmFuZ2UuCi0JKGFkZF90b19saXRfcG9vbCk6IE1lcmdlIGlkZW50aWNhbCBsaXRlcmFsIHBvb2wgdmFsdWVzLgotCi1UdWUgSnVsIDMwIDE0OjI4OjIzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc2VsZWN0b3JfdGFibGUpOiBBZGQgJ0UnIHNlbGVjdG9yLgotCShjb25zX2ZpeF9uZXdfaHBwYSk6IERvbid0IGNva2Ugb24gZV9lc2VsLgotCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIFJfQ09NUDIgd2hlbiB1c2VkCi0JdG8gaGVscCBnZW5lcmF0ZSBleGNlcHRpb24gaGFuZGxpbmcgdGFibGVzLgotCShtZF9hcHBseV9maXgpOiBEb24ndCB0cnkgdG8gYXBwbHkgZml4dXBzIHdpdGggYW4gZV9lc2VsCi0Jc2VsZWN0b3IuCi0JKGhwcGFfZml4X2FkanVzdGFibGUpOiBGaXh1cHMgd2l0aCBlX2VzZWwgc2VsZWN0b3JzCi0JYXJlIG5vdCBhZGp1c3RhYmxlLgotCi1UdWUgSnVsIDMwIDE1OjUxOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAyYnl0ZSwgNGJ5dGUsIGFuZCA4Ynl0ZQotCXBzZXVkby1vcHMuCi0KLUZyaSBKdWwgMjYgMTE6NDM6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZGVkIGxvdHMgb2YgZXJyb3IgY2hlY2tpbmcuICBBZGRlZCBoYWNrcwotCXRvIHN1cHBvcnQgYWNjdW11bGF0b3Igc2hpZnRzLgotCQotRnJpIEp1bCAyNiAxMTo1NjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoU19TRVRfRVhURVJOQUwpOiBMZXQgLndlYWsgb3ZlcnJpZGUuCi0JKFNfQ0xFQVJfRVhURVJOQUwpOiBMaWtld2lzZS4KLQkoU19TRVRfV0VBSyk6IFJlbW92ZSBlcnJvcjsganVzdCBsZXQgLndlYWsgb3ZlcnJpZGUuCi0KLVRodSBKdWwgMjUgMTU6MjI6NTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlKTogTm93IGhhbmRsZXMgbXVsdGlsaW5lCi0JaW5zdHJ1Y3Rpb25zLgotCi1UaHUgSnVsIDI1IDEyOjAzOjMzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXggcGFja2FnaW5nIGJ1Zy4gQWRkZWQgcmFuZ2UgY2hlY2tpbmcuCi0JQWRkZWQga2x1ZGdlIGZvciBkaXZzIGluc3RydWN0aW9uLiAgRml4ZWQgbWlub3IgcHJvYmxlbSB3aXRoCi0JbXVsdGlwbGUgdGV4dCBzZWN0aW9ucy4KLQkqIGNvbmZpZy90Yy1kMTB2LmggKGQxMHZfY2xlYW51cCk6IENoYW5nZSBwcm90b3R5cGUuIAotCQotVHVlIEp1bCAyMyAxMDo0OTozNiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXBwbHlfZml4Myk6IEZpeCBhbGwgaW5zdHJ1Y3Rpb24KLQlhZGRyZXNzZXMgdG8gYmUgcmlnaHQtc2hpZnRlZCBieSAyLgotCi1Nb24gSnVsIDIyIDExOjMyOjM2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBNYW55IGNoYW5nZXMgdG8gZ2V0IHJlbG9jcyB3b3JraW5nLgotIAkocmVnaXN0ZXJfbmFtZSk6IE5vIGxvbmdlciBjcmVhdGVzIGEgc3ltYm9sIGZvciByZWdpc3RlciBuYW1lcy4KLSAJKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IG1vdmVkIHRvIG9wY29kZXMvZDEwdi1vcGMuYy4KLQkoZDEwdl9pbnNlcnRfb3BlcmFuZCk6IE5vdyB3b3JrcyBjb3JyZWN0bHkgZm9yIGVpdGhlciBjb250YWluZXIuCi0JKiBjb25maWcvdGMtZDEwdi5oIChkMTB2X2NsZWFudXApOiBEZWNsYXJlLiAKLQkKLU1vbiBKdWwgMjIgMTQ6MDE6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGFuZAotCUJGRF9SRUxPQ19QQ1JFTF9MTzE2IGFyZSBleHBlY3RlZCB0byBiZSBQQyByZWxhdGl2ZS4KLQotTW9uIEp1bCAyMiAxMjo0Njo1NSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogdGMtYWxwaGEuYzogUGF0Y2hlcyB0byB0cmFjayBjdXJyZW50IG1pbmltdW0gYWxpZ25tZW50IHRvIHJlZHVjZQotCXRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIGNyZWF0ZWQgd2l0aCBmcmFnX2FsaWduLgotCShhbHBoYV9jdXJyZW50X2FsaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19hbHBoYV90ZXh0KTogUmVzZXQgYWxpZ25tZW50IHRvIDAuCi0JKHNfYWxwaGFfZGF0YSwgc19hbHBoYV9yZGF0YSwgc19hbHBoYV9zZGF0YSk6IExpa2V3aXNlLgotCShzX2FscGhhX3N0cmluZ2VyLCBzX2FscGhhX3NwYWNlKTogTmV3IGZ1bmN0aW9ucy4KLQkoc19hbHBoYV9jb25zLCBhbHBoYV9mbHVzaF9wZW5kaW5nX291dHB1dCk6IFJlbW92ZSBmdW5jdGlvbnMuCi0JKGFscGhhX2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb24gdG8gcmVwbGFjZSBib3RoIG9mIHRoZW0uCi0JKGVtaXRfaW5zbik6IE9ubHkgYWxpZ24gaWYgYWxwaGFfY3VycmVudF9hbGlnbiBpcyBsZXNzIHRoYW4gMjsKLQlyZXNldCBhbHBoYV9jdXJyZW50X2FsaWduIHRvIDIuCi0JKHNfYWxwaGFfZ3ByZWwzMik6IExpa2V3aXNlLgotCShzX2FscGhhX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uICBCYXNpY2FsbHkgZHVwbGljYXRlIHRoZSBvdGhlcgotCWFscGhhIHNlY3Rpb24gY2hhbmdlIGhvb2tzLiAgT25seSBkZWZpbmUgZm9yIEVMRi4KLQkoc19hbHBoYV9mbG9hdF9jb25zKTogU2ltcGxpZnkgYWxpZ25tZW50IGhhbmRsaW5nLgotCShtZF9wc2V1ZG9fdGFibGUpOiBPbmx5IGRlZmluZSAicmRhdGEiIGFuZCAic2RhdGEiIGlmIE9CSl9FQ09GRi4KLQlJZiBPQkpfRUxGLCBkZWZpbmUgInNlY3Rpb24iLCAic2VjdGlvbi5zIiwgInNlY3QiLCBhbmQgInNlY3QucyIuCi0JRG9uJ3QgZGVmaW5lIHRoZSBzX2FscGhhX2NvbnMgcHNldWRvLW9wcy4gIERvIGRlZmluZQotCXNfYWxwaGFfc3RyaW5nZXIgYW5kIHNfYWxwaGFfc3BhY2UgcHNldWRvLW9wcy4KLQkoYWxwaGFfYWxpZ24pOiBTa2lwIGlmIGxlc3MgdGhhbiBjdXJyZW50IGRlZmF1bHQgYWxpZ25tZW50LiAgU2V0Ci0JZGVmYXVsdCBhbGlnbm1lbnQuCi0JKiB0Yy1hbHBoYS5oIChtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IFJlbW92ZS4KLQkobWRfY29uc19hbGlnbik6IEFkZC4KLQotCSogdGMtYWxwaGEuYzogQWRkIG9vZGxlcyBvZiBmdW5jdGlvbiBkZXNjcmlwdGlvbiBjb21tZW50cy4KLQkobWRfYmlnbnVtX3RvX2NoYXJzKTogUmVtb3ZlOyB0aGVyZSBhcmUgbm8gY2FsbGVycy4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gc29tZSBtb3JlIHZhcmlhbnRzLgotCi1UaHUgSnVsIDE4IDE1OjU0OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQW5kcmV3IEdpZXJ0aCA8QU5EUkVXR0BtaWNyb2xpc2UuY28udWs+OgotCSogY29uZmlndXJlLmluIChzcGFyYy0qLXN5c3Y0Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBDaGFuZ2UgdWFoYWxmLCB1YXdvcmQsIGFuZAotCXVheHdvcmQgdG8gdXNlIHNfdWFjb25zLgotCShzcGFyY19ub19hbGlnbl9jb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc191YWNvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzcGFyY19jb25zX2FsaWduKTogSWYgc3BhcmNfbm9fYWxpZ25fY29ucyBpcyBzZXQsIGp1c3QgY2xlYXIgaXQKLQlhbmQgcmV0dXJuLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBSZW1vdmUgdW51c2VkIGxhYmVsIGFsbG9jYXRlX2Jzcy4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbWlwcy0qLWlyaXg2KiB0YXJnZXQuICBIYW5kbGUgSXJpeCA2IGxpa2UgSXJpeAotCTUgd2l0aCByZWdhcmQgdG8gc2hhcmVkIGxpYnJhcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFVzZSB0aGUgY29ycmVjdCBsZW5ndGggd2hlbgotCWFsbG9jYXRpbmcgc3BhY2UgZm9yIHRoZSB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgZXJyb3IgbWVzc2FnZS4KLQotVGh1IEp1bCAxOCAxMjo1NzoxMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLSopOiBBbGxvdyBkMTB2LSotKiwgZG9uJ3QgcmVxdWlyZSBkMTB2LSotZWxmKi4KLQotV2VkIEp1bCAxNyAxNDoyNToxMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtZDEwdi5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZSAoZDEwdi0qLWVsZik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi1lbGYpOiBOZXcgdGFyZ2V0LgotCQotRnJpIEp1bCAxMiAyMDo1NDoxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1LIFBJQy4KLQotV2VkIEp1bCAxMCAxMjozOTowOCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2FsaWduKTogQ2hhbmdlIGZpbGwgcGFyYW1ldGVyCi0JdG8gYSBwb2ludGVyLiAgVGFrZSBOVUxMIGFzIDAgb3Igbm9wIGRlcGVuZGluZyBvbiBzZWN0aW9uLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuCi0JKHNfYWxwaGFfYWxpZ24pOiBSZW5hbWUgbG9jYWwgdmFyaWFibGVzLgotCi0JKiBkb2MvYXMudGV4aW5mbyAoLmFsaWduKTogRG9jdW1lbnQgYWN0aW9uIG9mIG9taXR0ZWQKLQlmaWxsIHBhcmFtZXRlci4KLQotV2VkIEp1bCAxMCAwMDoyMzozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEdpdmUgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZQotCXdoZW4gYW4gdW5zdXBwb3J0ZWQgUEMgcmVsYXRpdmUgcmVsb2MgaXMgc2VlbiwgcmF0aGVyIHRoYW4gY2FsbGluZwotCWFib3J0LgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBSZW1vdmUgbm90X2NwcF9saW5lIGxvY2FsIHZhcmlhYmxlLgotCUluc3RlYWQsIGNoZWNrIHN0YXRlIHdoZW4gJyMnIGNvbW1lbnQgaXMgc2Vlbi4KLQotTW9uIEp1bCAgOCAxNDoxMTo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcmVnbWFza19mcmFnKTogT25seSBkZWZpbmUgaWYgT0JKX0VMRiBvcgotIAlPQkpfTUFZQkVfRUxGLgotCSh0Y19nZW5fcmVsb2MpOiBJZiBmaXh1cCB3YXMgY2hhbmdlZCB0byBiZSBQQyByZWxhdGl2ZSwgY2hhbmdlCi0gCXJlbG9jIHR5cGUgYWNjb3JkaW5nbHkuICBVc2UgbmFtZSBvZiByZWxvYyBpbiBlcnJvciBtZXNzYWdlLgotCi0JKiBhcy5oOiBEb24ndCBkZWZpbmUgY29uc3Qgb3Igdm9sYXRpbGUuCi0JKiBmbG9udW0uaDogRG9uJ3QgZGVmaW5lIGNvbnN0LgotCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19nZW5fcmVsb2MpOiBDaGFuZ2UgdGhlIGNvZGUgYXBwcm9wcmlhdGVseQotCWlmIGZ4X3BjcmVsIGlzIHNldC4gIENvcnJlY3Qgc2V0dGluZyB0aGUgYWRkZW5kIGNhc2UgaW4gdGhlCi0JT0JKX0VMRiBjYXNlIChmcm9tIEFuZHJlYXMgU2Nod2FiCi0JPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4pLgotCShtZF9zaG93X3VzYWdlKTogQ29ycmVjdCAtbWZjNTIwMCB0byAtbTUyMDAuCi0KLUZyaSBKdWwgIDUgMTA6MzI6NTggMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBkb2MvYy1tNjhrLnRleGk6IERvY3VtZW50IC1tNTIwMCBmbGFnLgotCSogZG9jL2FzLnRleGluZm86IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogVGhlIGNvbGRmaXJlIGRvZXMgbm90IHN1cHBvcnQgOHgKLSAJc2NhbGUgZmFjdG9yLgotCi1GcmkgSnVsICA1IDExOjA3OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX1NFVF9FWFRFUk5BTCk6IENoYW5nZSBhc193YXJuIHRvIGFzX2JhZC4KLQkoU19DTEVBUl9FWFRFUk5BTCwgU19TRVRfV0VBSyk6IExpa2V3aXNlLgotCi1UaHUgSnVsICA0IDExOjU5OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBTZXQgdG8gY3lnbnVzLTIuNy4xLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLVRodSBKdWwgIDQgMTA6MTE6MzMgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogT25seSBwZXJmb3JtIHJhbmdlIGNoZWNrIHdoZW4KLSAJZGVhbGluZyB3aXRoIE9fY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0KLVdlZCBKdWwgIDMgMTU6MDI6MjEgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLXBhcnNlLmggKG02OGtfcmVnaXN0ZXIpOiBBZGQgbmV3IGNvbGRmaWxlIGNvbnRyb2wKLQlyZWdpc3RlcnMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1jZjUyMDBfY29udHJvbF9yZWdzKTogTmV3IHZhcmlhYmxlLCAKLQlhcnJheSBvZiBjb250cm9sIHJlZ2lzdGVycyBmb3IgdGhlIGNvbGRmaXJlLgotCShjcHVfb2ZfYXJjaCk6IEFkZGVkIG1jZjUyMDAuCi0JKGFyY2hzKTogQWRkZWQgbWNmNTIwMC4KLQkoaW5pdF90YWJsZSk6IEFkZCBuZXcgY29udHJvbCByZWdpc3RlcnMuCi0JKG02OGtfaXApOiBBZGRlZCBzdXBwb3J0IGZvciBuZXcgY29udHJvbCByZWdpc3RlcnMuCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgLW01MjAwIHRvIHVzYWdlIHRleHQuCi0KLVdlZCBKdWwgIDMgMTY6MDU6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmggKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQpOiBEZWNsYXJlLgotCSogcmVhZC5jIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50KTogUmVtb3ZlIGRlY2xhcmF0aW9uLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIG9mIHx8Ci0Jd2l0aGluICYmLgotCShtZF9hc3NlbWJsZSk6IEZpeCBoYW5kbGluZyBvZiBAbCB3aXRoIGFuIHVuc2lnbmVkIGNvbnN0YW50LiAgQWRkCi0JZGVmYXVsdCBjYXNlIHRvIHJlbG9jIHN3aXRjaC4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoQU9VVF9NQUNIVFlQRSk6IERlZmluZSBhcyAwIGlmIFRFXzM4NkJTRC4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBUb20gUXVpZ2dsZSA8cXVpZ2dsZUBzZ2kuY29tPjoKLQkqIGVjb2ZmLmMgKGxhc3RfbGluZW5vKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYWRkX3Byb2NlZHVyZSk6IFNldCBsYXN0X2xpbmVuby4KLQkoZWNvZmZfZGlyZWN0aXZlX2xvYyk6IExpa2V3aXNlLgotCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2ZpeF9sb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5oIChlY29mZl9maXhfbG9jKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogV2hlbiBpbnNlcnRpbmcgbm9wcywgYW5kIHVzaW5nCi0JRUNPRkYgZGVidWdnaW5nLCBjYWxsIGVjb2ZmX2ZpeF9sb2MuCi0KLVR1ZSBKdWwgIDIgMjM6MDI6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoYnVpbGRfYnl0ZXMpOiBJZiBhbiBvcGVyYW5kIHR5cGUgaXMgCi0JbWFya2VkIGFzIFNSQ19JTl9EU1QgcmV0cmlldmUgaXQgZnJvbSB0aGUgImRlc3RpbmF0aW9uIiBvcC4KLQotU2F0IEp1biAyOSAxMzozODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotcmlzY2l4Kik6IFNldCBlbXVsYXRpb24gdG8gcmlzY2l4LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLXJpc2NpeC5oOiBOZXcgZmlsZSB0byBkZWZpbmUgVEVfUklTQ0lYLgotCi0JKiBjb25maWcvdGMtc2guaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUuCi0KLUZyaSBKdW4gMjggMTU6MTQ6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IEp1c3QgcnVuIGNvbmZpZy5zdGF0dXMgYXMgb3RoZXIKLQl0b29scyBkby4KLQotRnJpIEp1biAyOCAxMTowOTozOCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW4gKFRBUkdFVF9PUyk6IEFkZCBkZWZpbml0aW9uIHRvIGNvbmYuCi0KLVRodSBKdW4gMjcgMjA6Mzk6NDAgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFBhcmVudGhlc2l6ZQotCWNvcF9pbnRlcmxvY2tzIGV4cHJlc3Npb25zLgotCi1UaHUgSnVuIDI3IDEyOjE4OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX3ByaW50KTogQ2xvc2UgdGhlIGxpc3RpbmcgZmlsZSBpZiBpdCBpcyBub3QKLQlzdGRvdXQuICBDbG9zZSB0aGUgb3RoZXIgZmlsZXMgb3BlbmVkIGZvciB0aGUgbGlzdGluZy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2NvbnNfYWxpZ24pOiBEZWZpbmUuCi0JKHNwYXJjX2NvbnNfYWxpZ24pOiBEZWNsYXJlLgotCShIQU5ETEVfQUxJR04pOiBEZWZpbmUuCi0JKHNwYXJjX2hhbmRsZV9hbGlnbik6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaGFuZGxlX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IENhbGwgbWRfY29uc19hbGlnbiBpZiBpdCBpcyBkZWZpbmVkLgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IEFkZCBmcl9maWxlIGFuZCBmcl9saW5lIGZpZWxkcy4KLQkqIGZyYWdzLmMgKGZyYWdfbmV3KTogU2V0IGZyX2ZpbGUgYW5kIGZyX2xpbmUuCi0JKGZyYWdfdmFyKTogTGlrZXdpc2UuCi0JKGZyYWdfdmFyaWFudCk6IExpa2V3aXNlLgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IFJlbW92ZSB1bnVzZWQgYWxpZ25fbWFzayBhbmQgYWxpZ25fb2Zmc2V0Ci0JZmllbGRzLgotCi0JKiBsaXN0aW5nLmMgKGNhbGNfaGV4KTogT2Zmc2V0IGJ5IGZyX2ZpeCB3aGVuIGV4YW1pbmluZyBmcl92YXIuCi0JRnJvbSA8dWRkZWJvcmdAY2FybWVuLnNlPi4KLQotV2VkIEp1biAyNiAxMzoyMTozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLW9zZiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBBZGQgNjhlYzA2MCBhcyBhIHN5bm9ueW0gZm9yIDY4MDYwLgotCi1XZWQgSnVuIDI2IDE2OjIzOjA4IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQWRkZWQgY29wX2ludGVybG9ja3MsIHRvIGF2b2lkIE5PUCBpbnNlcnRpb24KLSAJYmV0d2VlbiBjby1wcm9jZXNzb3IgY29tcGFyaXNvbnMgYW5kIGJyYW5jaGVzIGZvciB0aGUgVlI0MzAwLgotCi1Nb24gSnVuIDI0IDE4OjAyOjUwIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAotCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsCi0JaW5jbHVkZWRpcik6IFVzZSBhdXRvY29uZiBzZXQgdmFsdWVzLgotCShkb2NkaXIpOiBSZW1vdmVkLgotCi1Nb24gSnVuIDI0IDExOjU4OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX2VqZWN0KTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgbGlzdGluZyBpcyAwLgotCShsaXN0aW5nX2xpc3QpOiBMaWtld2lzZS4KLQkobGlzdGluZ19zb3VyY2VfbGluZSk6IExpa2V3aXNlLgotCShsaXN0aW5nX3RpdGxlKTogRG9uJ3Qgc2F2ZSB0aXRsZSBpZiBsaXN0aW5nIGlzIDAuCi0JKGxpc3Rpbmdfc291cmNlX2ZpbGUpOiBDaGVjayBsaXN0aW5nIHJhdGhlciB0aGFuIGxpc3RpbmdfdGFpbC4KLQotCSogY29uZmlndXJlLmluOiBPbiBhbHBoYSotKi1vc2YqLCBsaW5rIGFnYWluc3QgbGliYmZkLmEgaWYgbm90Ci0JdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEp1biAyMSAxODoyMjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBJbiBjYXNlICdpJy8naicsIGRvbid0IHJlcXVpcmUgYW4KLQlhYnNvbHV0ZSBleHByZXNzaW9uIGlmIGEgcmVsb2NhdGlvbiB0eXBlIHdhcyBzcGVjaWZpZWQuCi0KLUZyaSBKdW4gMjEgMTc6NDA6MTYgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAbWVybGluLmdjcy5yZWRzdG9uZS5hcm15Lm1pbD4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgKi0qLXJ0ZW1zKiBjb25maWd1cmF0aW9ucy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEp1biAyMSAxNjowMToxOCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgYWxwaGEtKi1saW51eGVjb2ZmKiB0YXJnZXQuICBVc2UgZWxmIGZvcgotCWFscGhhLSotbGludXgqIHRhcmdldC4gIEZvcmNlIGJmZF9nYXMgZm9yIGFscGhhLSouICBSZXF1aXJlCi0Jb3Bjb2RlcyBsaWJyYXJ5IGZvciBhbHBoYS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0JKiBjb25maWcvdGMtYWxwaGEuYzogU3Vic3RhbnRpYWwgcmV3cml0ZSB0byBhZGQgRUxGIHN1cHBvcnQgYW5kCi0JdXNlIG5ldyBvcGNvZGUgdGFibGUuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfdW5kZWZpbmVkX3N5bWJvbCk6IERvbid0IGRlZmluZS4KLQkoTE9DQUxfTEFCRUwpOiBEZWZpbmUgZGlmZmVyZW50bHkgaWYgT0JKX0VMRi4KLQkoRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lIGlmIE9CSl9FTEYuCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IFJlbW92ZS4KLQkqIGNvbmZpZy9vYmotZWxmLmg6IElmIFRDX0FMUEhBLCBkZWZpbmUgRUNPRkZfREVCVUdHSU5HLgotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF9hbHBoYSk6IERlcGVuZCB1cG9uCi0JaW5jbHVkZS9vcGNvZGUvYWxwaGEuaCByYXRoZXIgdGhhbiBjb25maWcvYWxwaGEtb3Bjb2RlLmguCi0KLVRodSBKdW4gMjAgMTk6MTA6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBHaXZlIGFuIGVycm9yIGlmIHRoZQotCXJlbG9jYXRpb24gc3ltYm9sIHdhcyBub3QgcmVzb2x2ZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IExpa2V3aXNlLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFJlZmV0Y2ggdGhlIHN5bWJvbCBzZWN0aW9uIGFmdGVyCi0JY2FsbGluZyBTX0dFVF9WQUxVRSwgc2luY2UgaXQgbWF5IGhhdmUgY2hhbmdlZC4KLQotCSogZXhwci5jIChzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSk6IERlZmluZS4KLQkoZXhwcl9zeW1ib2xfbGluZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtYWtlX2V4cHJfc3ltYm9sKTogQWRkIGVudHJ5IHRvIGV4cHJfc3ltYm9sX2xpbmVzLgotCShleHByX3N5bWJvbF93aGVyZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGV4cHIuaDogVXNlIGV4dGVybiBvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JKGV4cHJfc3ltYm9sX3doZXJlKTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBUcnkgdG8gdXNlIGV4cHJfc3ltYm9sX3doZXJlCi0JcmF0aGVyIHRoYW4gcHJpbnRpbmcgdGhlIG1lYW5pbmdsZXNzIG5hbWUgb2YgYW4gZXhwcmVzc2lvbgotCXN5bWJvbC4KLQotVGh1IEp1biAyMCAxNTo1Nzo0MSAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogRGVsZXRlZC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX251bWJlcl90b19jaGFycyk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGJ1aWxkX29wZXJhdGVfbiwgYnVpbGRfbWVtKTogTW92ZWQgZWFybGllciBpbgotCXRoZSBmaWxlLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzLCBsb2FkX2V4cHJlc3Npb24pOiBVc2UgYnVpbGRfbWVtLgotCShidWlsZF9vcGVyYXRlKTogTmV3IGZ1bmN0aW9uLgotCShlbWl0X2FkZHFfcik6IFVzZSBpdC4KLQotCVdlZCBNYXIgMTMgMjI6MTQ6MTQgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiAgI2lmIFZNUywgdXNlIFNfU0VUX09USEVSIHRvIHN0b3JlIGBjb25zdF9mbGFnJy4KLQotCVR1ZSBNYXIgIDUgMTQ6MzE6NDUgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy12YXguaCAoTk9QX09QQ09ERSk6IERlZmluZS4KLQotCVN1biBGZWIgIDQgMjE6MDE6MDMgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNfSVNfQ09NTU9OKTogRGVmaW5lLgotCShTX0lTX0xPQ0FMKTogQ2hlY2sgZm9yIFwwMDIgYXMgd2VsbCBhcyBcMDAxLgotCShMT05HV09SRF9BTElHTk1FTlQpOiBOZXcgbWFjcm8uCi0JKFNVQl9TRUdNRU5UX0FMSUdOKTogVXNlIGl0LgotCi0JRnJpIEphbiAyNiAxNzo0NDowOSAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3Ztcy1jb25mLmg6IFJlY29uY2lsZSB3aXRoIGNvbmYuaW4uCi0KLVdlZCBKdW4gMTkgMTE6MzE6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChpc19kbnJhbmdlKTogT25seSBkZWZpbmUgaWYgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBpcwotCWRlZmluZWQuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCB0aGF0IGFueSBudW1iZXIgb2YgaGV4IGRpZ2l0cyBjYW4KLQlmb2xsb3cgXHguCi0KLQkqIGFzLmMgKHN0cnVjdCBkZWZzeW1fbGlzdCk6IERlZmluZS4KLQkoZGVmc3ltcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHBhcnNlX2FyZ3MpOiBKdXN0IHB1dCAtLWRlZnN5bSBhcmd1bWVudHMgb24gZGVmc3ltcyBsaXN0LCByYXRoZXIKLQl0aGFuIGRlZmluaW5nIHRoZW0uCi0JKG1haW4pOiBEZWZpbmUgZGVmc3ltcyBhZnRlciBvdXRwdXQgZmlsZSBpcyBjcmVhdGVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVqZWN0IFBSRSBhbmQgUE9TVCBpbmRleGluZyBtb2RlIG9uCi0JY3B1MzIuICBGcm9tIEVyaWMgTm9ydW0gPEVyaWMuTm9ydW1AdXNhc2suY2E+LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogSW4gY2FzZXMgJ0knLCAnaScsIGFuZCAnaicsIHNldAotCWluc25fZXJyb3IgcmF0aGVyIHRoYW4gY2FsbGluZyBjaGVja19hYnNvbHV0ZV9leHByLgotCi0JKiBhcy5jIChlbXVsYXRpb25fbmFtZSk6IFJlbW92ZSB1bnVzZWQgc3RhdGljIHZhcmlhYmxlLgotCShkZWZhdWx0X2VtdWxfYmZkX25hbWUpOiBBZGQgcmV0dXJuIE5VTEwgdG8gYXZvaWQgd2FybmluZy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBuYW1lIGFuZAotCW5hbWVfZW5kLgotCSogZnJhZ3MuYyAoZnJhZ19uZXcpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRtcC4KLQkqIGhhc2guYyAoaGFzaF9ncm93KTogUGFyZW50aGVzaXplICsgd2l0aGluIDw8LgotCShoYXNoX3ByaW50X3N0YXRpc3RpY3MpOiBVc2UgJWx1LCBub3QgJWQsIHRvIHByaW50IHVuc2lnbmVkCi0JbG9uZyB2YXJpYWJsZXMuCi0JKiBtZXNzYWdlcy5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKGZwcmludF92YWx1ZSk6IEFkZCBjYXN0IHRvIGF2b2lkIHByaW50ZiB3YXJuaW5nLgotCShzcHJpbnRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIHJlYWQuYzogSW5jbHVkZSAiZWNvZmYuaCIuCi0JKGVtaXRfZXhwcik6IEFkZCBjYXN0cyB0byBhdm9pZCBwcmludGYgd2FybmluZ3MuCi0JKiByZWFkLmg6IFVzZSBleHRlcm4gZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQkocG9wX2luc2VydCk6IERlY2xhcmUuCi0JKiBzdGFicy5jOiBJbmNsdWRlICJlY29mZi5oIi4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgdG1wLAotCWZvcm1lcl9sYXN0X2ZyYWdQLCBhbmQgbmV3X2ZyYWdQLgotCSogc3Vic2Vncy5oIChzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChkZWJ1Z192ZXJpZnlfc3ltY2hhaW4pOiBDaGFuZ2UgbWFjcm8gdG8gZGlzY2FyZAotCWFyZ3VtZW50cy4KLQkqIHdyaXRlLmMgKGR1bXBfc2VjdGlvbl9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIHdyaXRlLmg6IFVzZSBleHRlcm4gZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQkod3JpdGVfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBjb25maWcvZS1taXBzZWNvZmYuYyAobWlwc2Vjb2ZmX2JmZF9uYW1lKTogUmV0dXJuIE5VTEwgdG8gYXZvaWQKLQl3YXJuaW5nLgotCSogY29uZmlnL2UtbWlwc2VsZi5jIChtaXBzZWxmX2JmZF9uYW1lKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfZWNvZmZfc2V0X2V4dCk6IERlY2xhcmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBJZiBPQkpfRUxGLCBhbHdheXMKLQllbWl0IHJlbG9jYXRpb25zIGFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHRjX2dlbl9yZWxvYyk6IE91dHB1dCBhIHNlbnNpYmxlIGVycm9yCi0gCW1lc3NhZ2UgaWYgYmZkX3JlbG9jX3R5cGVfbG9va3VwIGZhaWxzLCByYXRoZXIgdGhhbiBjYWxsaW5nCi0gCWFzc2VydC4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBBZGQKLQlCRkRfUkVMT0NfMTJfUENSRUwgdG8gc3dpdGNoLgotCi1UdWUgSnVuIDE4IDIwOjI5OjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKExPQ0FMX0xBQkVMLEZBS0VfTEFCRUxfTkFNRSk6IFVzZSBkZWZhdWx0cyBmb3IKLQlURV9QRSAoTGZvbywgbm90IC5MZm9vKS4KLQotVHVlIEp1biAxOCAxNzoxMzozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19maWxsKTogRG9uJ3Qgd2FybiBhYm91dCBhIHplcm8gcmVwZWF0IGNvdW50LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3Qgd2FybiBhYm91dCB1c2luZyBBVCBhcyBhCi0JY29wcm9jZXNzb3IgcmVnaXN0ZXIuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogV2hlbiBjaGVja2luZyB0aGUgc2l6ZSBvZiBhCi0JcmVnaXN0ZXIgdG8gc2V0IHRoZSBzaXplIG9mIGFuIGluc3RydWN0aW9uLCBkbyBhIGJpdHdpc2UgYW5kIHdpdGgKLQlSZWc4IGFuZCBSZWcxNiByYXRoZXIgdGhhbiByZXF1aXJpbmcgdGhlIHR5cGUgdG8gYmUgZXhhY3RseSBSZWc4Ci0Jb3IgUmVnMTYuCi0KLVR1ZSBKdW4gMTggMTM6MTk6NTEgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwYXJzZV9yZWcpOiBUd2VhayBlcnJvciBtZXNzYWdlcy4KLQkoYnVpbGRfYnl0ZXMpOiBMaWtld2lzZS4KLQkoc2tpcF9jb2xvbnRoaW5nKTogSGFuZGxlIDozMiBzdWZmaXguCi0JKGdldF9zcGVjaWZpYyk6IFByb21vdGUgTF8yNCB0byBMXzMyIGlmIGl0IG1ha2VzIGEgbWF0Y2guCi0JRG9uJ3QgYWx3YXlzIHByb21vdGUgTF84IHRvIExfMTYuCi0JKGRvX2FfZml4X2ltbSk6IENsZWFuIHVwIExfMzIgYW5kIExfMjQgaGFuZGxpbmcuCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChTbW9kZSk6IE5ldyB2YXJpYWJsZS4KLQkoaDgzMDBobW9kZSk6IFR1cm4gb2ZmIEhtb2RlLgotCShoODMwMHNtb2RlKTogTmV3IGZ1bmN0aW9uLiAgVHVybiBvbiBTbW9kZSBhbmQgSG1vZGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IE5ldyAiLmg4MzAwcyIgcHNldWRvLW9wLgotCShwYXJzZV9yZWcpOiBIYW5kbGUgImV4ciIgcmVnaXN0ZXIuCi0JKGdldF9vcGVyYW5kKTogSGFuZGxlIGJpemFycmUgc3ludGF4IGZvciAic3RtLmwiIGFuZCAibGRtLmwiLgotCUhhbmRsZSAibWFjaCIgYW5kICJtYWNobCIgb3BlcmFuZHMgZm9yIGxkbWFjLgotCShnZXRfc3BlY2lmaWMpOiBIYW5kbGUgInN0bS5sIiBhbmQgImxkbS5sIi4KLQkoYnVpbGRfYnl0ZXMpOiBIYW5kbGUgInN0bS5sIiBhbmQgImxkbS5sIjsgaGFuZGxlIE1BQ1JFRyBvcGVyYW5kcy4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChDT0ZGX01BR0lDKTogSGFuZGxlIEg4L1MgbWFnaWMgbnVtYmVyLgotCShTbW9kZSk6IERlY2xhcmUuCi0KLU1vbiBKdW4gMTcgMTU6NTA6NTMgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogUmVvcmRlciBjaGFwdGVyIG9mIG1hY2hpbmUgZGVwZW5kZW50IG9wdGlvbnMgc28KLSAJdGhhdCBpdCBpcyBzb3J0ZWQgYnkgY2hpcCBuYW1lLiAgCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBVc2UgY29uc2lzdGFudCBzcGVsbGluZyBvZiBWYXguCi0JKiBkb2MvYy12YXgudGV4aTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMTcgMTE6MjY6NTYgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiLmJlZ2luX3RyeSIgYW5kICIuZW5kX3RyeSIKLQlwc2V1ZG8gb3BzLgotCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIFJfQkVHSU5fVFJZIGFuZCBSX0VORF9UUlkuCi0JKG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCShwYV90cnkpOiBOZXcgZnVuY3Rpb24uCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jcyBmb3IgQkVHSU5fVFJZIGFuZCBFTkRfVFJZLgotCi1TdW4gSnVuIDE2IDIyOjU3OjQ3IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5sZXZlbCIgcHNldWRvIG9wLgotCShwYV9sZXZlbCk6IE5ldyBmdW5jdGlvbi4KLQotRnJpIEp1biAxNCAyMDowNjo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgbGlzdGluZyBpcyAwLgotCi1UaHUgSnVuIDEzIDE3OjUwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IElmIHN5bWJvbF90YWJsZV9mcm96ZW4gaXMgc2V0LCBjYWxsCi0Jc3ltYm9sX2NyZWF0ZSwgbm90IHN5bWJvbF9uZXcuCi0KLVdlZCBKdW4gMTIgMTQ6MTA6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IERvbid0IHNldCBzeV91c2VkX2luX3JlbG9jIGZvciBhbgotCWFic29sdXRlIHN5bWJvbCB1bmxlc3MgVENfRk9SQ0VfUkVMT0NBVElPTiByZXR1cm5zIHRydWUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChwcmV2aW91c19maWxlX3N5bWJvbCk6IFJlbW92ZSBCRkRfQVNTRU1CTEVSCi0JdmVyc2lvbi4KLQkoY19kb3RfZmlsZV9zeW1ib2wpOiBCRkRfQVNTRU1CTEVSIHZlcnNpb246IERvbid0IHNldCB0aGUgdmFsdWUgb2YKLQl0aGUgc3ltYm9sIHRvIGEgcG9pbnRlci4gIERvbid0IHNldCBwcmV2aW91c19maWxlX3N5bWJvbC4KLQlTaW1wbGlmeSBzeW1ib2wgbGlzdCByZWFycmFuZ2VtZW50LgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBDX0ZJTEUgc3ltYm9scy4KLQkoY29mZl9hZGp1c3Rfc3ltdGFiKTogRG9uJ3QgY2hlY2sgcHJldmlvdXNfZmlsZV9zeW1ib2wuCi0KLU1vbiBKdW4gMTAgMTQ6NTI6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBOZXcgZnVuY3Rpb24gZm9yIC5sY29tbQotCWRpcmVjdGl2ZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIHBwY19lbGZfbGNvbW0uCi0KLU1vbiBKdW4gMTAgMTE6NDU6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWNjZXB0IEFCU0wgZm9yICdPJywgc28gdGhhdCBgYmZleHR1Ci0JZDB7MjQ6MX0sZDAnIHdvcmtzIHdpdGhvdXQgYW4gaW1tZWRpYXRlIHByZWZpeCBvbiB0aGUgYml0IG51bWJlcnMuCi0JKG1kX2JlZ2luKTogQWRkIGRpZ2l0cyB0byBhbHRfbm90ZW5kX3RhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBNYWtlIHMgYSBjb25zdCBwb2ludGVyLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJlbXB0eSIuCi0JKHNfZW1wdHkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc3RydWN0IGZpbGVuYW1lX2xpc3QpOiBPbmx5IGRlZmluZSBpZiBub3QKLQlCRkRfQVNTRU1CTEVSLgotCShmaWxlbmFtZV9saXN0X2hlYWQsIGZpbGVuYW1lX2xpc3RfdGFpbCk6IExpa2V3aXNlLgotCShjX3NlY3Rpb25fc3ltYm9sKTogUmVtb3ZlIHVudXNlZCBCRkRfQVNTRU1CTEVSIHZlcnNpb24uCi0JKG9ial9jb2ZmX2VuZGVmLCBCRkRfQVNTRU1CTEVSIHZlcnNpb24pOiBEb24ndCBzZXQgdGhlIGRlYnVnZ2luZwotCWZsYWcgZm9yIENfTU9TLCBDX01PRSwgQ19NT1UsIG9yIENfRU9TIHN5bWJvbHMsIHNpbmNlIHRoZXkgc2hvdWxkCi0JaGF2ZSBhIHNlY3Rpb24gb2YgTl9BQlMgcmF0aGVyIHRoYW4gTl9ERUJVRy4gIElmIHdlIGRvIGEgbWVyZ2UsCi0JcmVtb3ZlIHRoZSBuZXcgc3ltYm9sIGZyb20gdGhlIGxpc3QuCi0gCShvYmpfY29mZl9lbmRlZiwgYm90aCB2ZXJzaW9ucyk6IENhbGwgdGFnX2luc2VydCBldmVuIGlmIHRoZXJlIGlzCi0JYW4gb2xkIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUsIGlmIHRoZSBvbGQgc3ltYm9sIGRvZXMgbm90Ci0JaGFwcGVuIHRvIGJlIGEgdGFnLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogQ2hlY2sgU0ZfR0VUX1RBRywgQ19FT0YsIGFuZCBDX0ZJTEUgb3V0c2lkZSBvZgotCXRoZSBTRl9HRVRfREVCVUcgY29uZGl0aW9uLiAgRG9uJ3QgY2FsbCBTQV9TRVRfU1lNX0VORE5EWCB3aXRoIGEKLQlzeW1ib2wgdGhhdCB3aWxsIGJlIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LgotCShjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBBbHdheXMgY2FsbCBzZWN0aW9uX3N5bWJvbCBmb3IgLnRleHQsCi0JLmRhdGEsIGFuZCAuYnNzLgotCShjb2ZmX2Zyb2Jfc2VjdGlvbik6IExpa2V3aXNlLiAgQWxzbywgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQotCXN0cm5hbWUuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChjb252ZXJ0X2lpZik6IENhbGwgZnJhZ19ncm93IHJhdGhlciB0aGFuCi0JbWFuaXB1bGF0aW5nIGZyYWdzIGRpcmVjdGx5LgotCShtZF9udW1iZXJfdG9fZmllbGQpOiBBZGp1c3QgbWVtX3B0ciBjb3JyZWN0bHkgaWYgRU5ESUFOIGlzCi0JZGVmaW5lZC4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSWYgJy8nIGlzIExJTkVfQ09NTUVOVF9TVEFSVCwgY2hlY2sKLSAJd2hldGhlciB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgJyonIGJlZm9yZSBjaGVja2luZyB3aGV0aGVyIHdlIGFyZQotCWF0IHRoZSBzdGFydCBvZiBhIGxpbmUuICBQZXJtaXQgTElORV9DT01NRU5UX1NUQVJUIHRvIHN0YXJ0IGEKLQljb21tZW50IGluIHN0YXRlIDEgKHNlZW4gc29tZSB3aGl0ZXNwYWNlKSBhcyB3ZWxsLCB0byBtYXRjaCB0aGUKLQlkb2N1bWVudGF0aW9uLgotCi0JKiBnYXNwLmMgKGRvX2FsaWduKTogUGVybWl0IGEgZmlsbCB2YWx1ZSBmb3IgLmFsaWduLgotCi1XZWQgSnVuICA1IDE3OjA5OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogV2FybiBpZiBhIG5ld2xpbmUgaXMgc2VlbiBpbiB0aGUKLQltaWRkbGUgb2YgYSBzdHJpbmcuICBDYWxsIGJ1bXBfbGluZV9jb3VudGVycyB3aGVuIGFwcHJvcHJpYXRlLgotCi1XZWQgSnVuICA1IDE3OjA4OjM2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogVXNlIExPQ0FMX0xBQkVMLgotCi1UdWUgSnVuICA0IDEwOjU1OjE2IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGNoZWNrIHRvIHNlZSBpZiB0b29sZGlyIGV4aXN0cy4KLQlNYWtlICQodG9vbGRpcikgYW5kICQodG9vbGRpcikvYmluLgotCi1UdWUgSnVuICA0IDEwOjE0OjUzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3BwYy1zb2wubXQgKFRERUZJTkVTKTogRG9uJ3QgdHVybiBvbiAtbXJlZ25hbWVzIGJ5Ci0JZGVmYXVsdC4KLQotTW9uIEp1biAgMyAxMTozNDo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCBjYWxsIGFzX3dhcm4gaWYgd2UgYXJlIHNldHRpbmcKLQlpbnNuX2Vycm9yLiAgRG9uJ3QgcHV0IHRoZSBzdHJpbmcgIkVSUk9SIiBpbiBpbnNuX2Vycm9yLiAgU2V0Ci0JaW5zbl9lcnJvciByYXRoZXIgdGhhbiBjYWxsaW5nIGFzX3dhcm4gZm9yIGFuIHVuc3VwcG9ydGVkIG9wY29kZS4KLQotU2F0IEp1biAgMSAyMTo1MTo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IENoZWNrIGZvciBhIDY0IGJpdCBmb3JtYXQKLQliZWZvcmUgcGVybWl0dGluZyAtNjQuCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBSZW1vdmUgZHVwbGljYXRlCi0JYmZkX3BlcnJvci4KLQotRnJpIE1heSAzMSAwMTowODowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogSWYgLTY0LCBjcmVhdGUgYSAuTUlQUy5vcHRpb25zCi0Jc2VjdGlvbiByYXRoZXIgdGhhbiBhIC5yZWdpbmZvIHNlY3Rpb24uCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBJZiAtNjQsIHdyaXRlIG91dCA2NCBiaXQgUmVnSW5mbwotCWluZm9ybWF0aW9uLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogSWYgbWlwc19pc2EgPCAzLCBwZXJtaXQgYSAzMgotCWJpdCB2YWx1ZSB3aXRoIHRoZSBoaWdoIGJpdCBzZXQuCi0KLVRodSBNYXkgMzAgMTk6MDA6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBTZXQgc2VjdGlvbiBmbGFncyBmb3IgLnNic3Mgc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc182NCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IElmIG1pcHNfNjQsIHJldHVybiBlbGY2NCB0YXJnZXRzIHJhdGhlciB0aGFuCi0JZWxmMzIgb25lcy4KLQkobWRfbG9uZ29wdHMpOiBBZGQgIjMyIiBhbmQgIjY0Ii4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC0zMiBhbmQgLTY0LgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtMzIgYW5kIC02NC4KLQkoY29uc19maXhfbmV3X21pcHMpOiBJZiBtaXBzXzY0LCBkb24ndCBjb252ZXJ0IGFuIDggYnl0ZSByZWxvYyB0bwotCWEgNCBieXRlIG9uZS4KLQotVGh1IE1heSAzMCAxMDozNjoxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAoY29tbWVudF9jaGFycyk6IE1ha2UgJyEnIGEgY29tbWVudCBjaGFyYWN0ZXIKLQlmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IFVuZGVyIFBvd2VyUEMgU29sYXJpcywgY29udmVydCBhCi0JLnN0YWJkIHdpdGggNCBhcmd1bWVudHMgaW50byBhIC5zdGFibi4KLQotV2VkIE1heSAyOSAxNjo0MzoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogV2hlbiBwYXNzaW5nIFhfYWRkX251bWJlciB0bwotCW1hY3JvX2J1aWxkLCBjYXN0IGl0IHRvIGludCBmaXJzdC4KLQotVHVlIE1heSAyOCAxMzoyOTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy16OGsuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIGZ4X3JfdHlwZSBvZiAwLCBhcwotCWNyZWF0ZWQgYnkgZW1pdF9leHByLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9jcmVhdGUpOiBJZiBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgZmFpbHMsIGNhbGwKLQlhc19wZXJyb3IgcmF0aGVyIHRoYW4gYXNzZXJ0LgotCi1GcmkgTWF5IDI0IDE4OjI0OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE1hcmsgc2VjdGlvbnMgY3JlYXRlZCB0byBob2xkCi0JZmxvYXRpbmcgcG9pbnQgaW5mb3JtYXRpb24gYXMgcmVhZCBvbmx5LgotCi1GcmkgTWF5IDI0IDEyOjA3OjU0IDE5OTYgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19zZXRfY3B1KTogQ2hhbmdlIGRlZmF1bHRzIHRvIG1hdGNoIEFJWC4KLQotVGh1IE1heSAyMyAxNzozNDoyNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAuc2tpcCBhcyBhIHN5bm9ueW0gZm9yIC5zcGFjZS4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBGb3IgUG93ZXJQQyBFTEYsIGFsbG93IC5zdGFiZCB0byB0YWtlCi0JNCBhcmd1bWVudHMsIHByb3ZpZGluZyB0aGUgNHRoIGFyZ3VtZW50IGlzIDAsIHRvIGFsbG93Ci0JY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIGFzc2VtYmxlci4KLQotVGh1IE1heSAxNiAxNTo1MTo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5oIChzdHJ1Y3Qgc2hfc2VnbWVudF9pbmZvX3R5cGUpOiBEZWZpbmUuCi0JKFRDX1NFR01FTlRfSU5GT19UWVBFKTogRGVmaW5lLgotCShzaF9mcm9iX2xhYmVsKTogRGVjbGFyZS4KLQkodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQkoc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWNsYXJlLgotCShtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hc3NlbWJsZSk6IElmIHJlbGF4aW5nLCBlbWl0IGEgUl9TSF9DT0RFCi0gCXJlbG9jIGJlZm9yZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgbmVjZXNzYXJ5LgotCShzaF9mcm9iX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCShzaF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KLQkoc2hfY29mZl9mcm9iX2ZpbGUpOiBJZ25vcmUgQUxJR04sIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MKLQl3aGVuIGxvb2tpbmcgZm9yIHRoZSByZWxvYyBmb3IgdGhlIHRhcmdldCBvZiAudXNlcy4KLQkobWRfY29udmVydF9mcmFnKTogRml4IHByaW50ZiBmb3JtYXQgKCUweGx4IHRvIDB4JWx4KS4KLQkoc2hfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MgdG8gYmUKLQllbWl0dGVkLgotCShtZF9hcHBseV9maXgpOiBJZ25vcmUgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcy4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBGb3JjZSBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzIHRvIHVzZQotCXRoZSBhYnNvbHV0ZSBzeW1ib2wuCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBZGQgdGNfc2VnbWVudF9pbmZvX2RhdGEgZmllbGQgaWYKLQlUQ19TRUdNRU5UX0lORk9fVFlQRSBpcyBkZWZpbmVkLgotCi1XZWQgTWF5IDE1IDEyOjIzOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN1cmUgdGhlIG9wY29kZSBzdWZmaXgKLQltYXRjaGVzIHRoZSByZWdpc3RlciBzaXplLgotCi1XZWQgTWF5IDE1IDA4OjMzOjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvdW50X2VudHJpZXNfaW5fY2hhaW4pOiBJZ25vcmUgRml4dXBzIHdpdGgKLQlmeF9kb25lIHNldC4gCi0JKGRvX3JlbG9jc19mb3IpOiBMaWtld2lzZS4KLQkoZml4dXBfc2VnbWVudCk6IERvbid0IGp1c3QgcXVpdCBpZiBsaW5rcmVsYXggaXMgc2V0LiAgVHJ5IHRvCi0JYXBwbHkgbm9uIHBjLXJlbGF0aXZlIHN5bTEtc3ltMiBmaXh1cHMsIGV2ZW4gaWYgbGlua3JlbGF4IGlzCi0Jbm9uemVyby4KLQotRnJpIE1heSAxMCAxNDoxNjo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBbGxvdyBHT1QgYW5kIHNlY3Rpb24KLQlyZWxhdGl2ZSByZWxvY2F0aW9ucyB3aXRoIC1tcmVsb2NhdGFibGUuICBBbHNvIGFsbG93IHVuZml4ZWQKLQlyZWxvY3MgaW4gLmV4X3NoYXJlZC4KLQotVHVlIE1heSAgNyAxMToyNDoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh5YW5rX3N5bWJvbHMpOiBDaGVjayB0aGF0IEZOQU1FX09GRlNFVCBpcwotCW5vbi16ZXJvIGJlZm9yZSBhc3N1bWluZyB0aGlzIGlzIGEgbG9uZyBmaWxlIG5hbWUuCi0JKHdfc3RyaW5ncyk6IExpa2V3aXNlLgotCShjX2RvdF9maWxlX3N5bWJvbCk6IFNldCBGTkFNRV9PRkZTRVQgdG8gMSBmb3IgYSBsb25nIGZpbGUgbmFtZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdfc3RyaW5ncyk6IE1vdmUgZGVjbGFyYXRpb24gb2YgaSBpbnNpZGUKLQkjaWZkZWYgYmxvY2sgd2hpY2ggdXNlcyBpdC4KLQotVHVlIE1heSAgNyAwMDo0OTo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChkb19hX2ZpeF9pbW0pOiBSZW5hbWUgbGFzdCBhcmd1bWVudCB0bwotCSJyZWxheG1vZGUiLiAgT3V0cHV0IHJlbG9jcyB3aGljaCBpZGVudGlmeSB2YXJpb3VzIHJlbGF4aW5nCi0JcG9zc2liaWxpdGllcyBmb3IgbW92Lltid2xdIGluc3RydWN0aW9ucy4KLQkoYnVpbGRfYnl0ZXMpOiBQYXNzIGluIGEgcmVsYXhpbmcgbW9kZSB0byBkb19hX2ZpeF9pbW0uCi0KLU1vbiBNYXkgIDYgMTU6MjY6MjggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChUQ19IQU5ETEVTX0ZYX0RPTkUpOiBEZWZpbmUuCi0JKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYXJtLmMgKG15X2dldF9leHByZXNzaW9uKTogT25seSB3YXRjaCBmb3IgYmFkIHNlZ21lbnRzCi0JaWYgT0JKX0FPVVQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWVkIGZyb20gbWRfYXBwbHlfZml4LgotCUlmIHBjcmVsIHJlbG9jIGFuZCBzeW1ib2wgaXMgaW4gZGlmZmVyZW50IHNlY3Rpb24sIHVuZG8gZWZmZWN0cwotCW9mIG1kX3BjcmVsX2Zyb20uCi0KLVNhdCBNYXkgIDQgMTI6NDk6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0Ci0JYW55IHJlbG9jIHdpdGggYW4gTFIlIG9yIFJSJSBmaWVsZCBzZWxlY3RvciBmb3IgU09NLgotCi1TYXQgTWF5ICA0IDExOjI2OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBzdWJzZWdzLmggdG8gYXBwcm9wcmlhdGUgVEFSR19DUFVfREVQXyoKLSAJdmFyaWFibGVzLgotCi1GcmkgTWF5ICAzIDE3OjU4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBtZXJnZSBhIHN5bWJvbCB3aXRoCi0JU0ZfR0VUX1NUQVRJQ1Mgc2V0LgotCSh5YW5rX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotV2VkIE1heSAgMSAxMzozODoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBJZiBNQU5ZX1NFR01FTlRTIGFuZCBub3QKLQlCRkRfQVNTRU1CTEVSLCBhZGQgbmFtZSBmaWVsZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKGNvZmZfaGVhZGVyX2FwcGVuZCk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKGNyYXdsX3N5bWJvbHMpOiBKdXN0IHVzZSB0aGUgbmFtZSBmaWVsZCBmb3IgdGhlIHN5bWJvbCBuYW1lLAotCXdpdGhvdXQgd29ycnlpbmcgYWJvdXQgbnVsbCBieXRlIHRlcm1pbmF0aW9uLgotCSh3X3N0cmluZ3MpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IExpa2V3aXNlLiAgQWxzbywgdXNlIHRoZSBuYW1lIGZpZWxkLCByYXRoZXIKLQl0aGFuIHNjbmhkci5zX25hbWUuCi0JKG9ial9jb2ZmX2FkZF9zZWdtZW50KTogUGVybWl0IGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgdGhlIG5hbWUgZmllbGQsIHJhdGhlciB0aGFuCi0Jc2NuaGRyLnNfbmFtZS4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RlLXBlLmggKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChicnRhYl9lbWl0KTogRG9uJ3Qgc2V0IGZ4X2ltX2Rpc3AgZmllbGQuCi0JKG1lbV9mbXQpOiBMaWtld2lzZS4KLQkobWRfYXBwbHlfZml4KTogRG9uJ3QgY2hlY2sgZnhfaW1fZGlzcCBmaWVsZC4KLQotVGh1IEFwciAyNSAxMTozOTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkICogYWZ0ZXIgc3BhcmMqLSotdnh3b3Jrcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogSWYgdGNfY29tbWVudF9jaGFycyBpcyBub3QgZGVmaW5lZCwKLQlkZWZpbmUgaXQgdG8gY29tbWVudF9jaGFycy4gIFVzZSB0Y19jb21tZW50X2NoYXJzIHJhdGhlciB0aGFuCi0JY29tbWVudF9jaGFycy4KLQkoZG9fc2NydWJfY2hhcnMpOiBVc2UgdGNfY29tbWVudF9jaGFycyByYXRoZXIgdGhhbiBjb21tZW50X2NoYXJzLgotCSogY29uZmlnL3RjLW02OGsuaCAodGNfY29tbWVudF9jaGFycyk6IERlZmluZS4KLQkobTY4a19jb21tZW50X2NoYXJzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfY29tbWVudF9jaGFycyk6IFJlbmFtZSBmcm9tCi0JY29tbWVudF9jaGFycy4gIENoYW5nZSBpbnRvIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhbiBhcnJheS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgImJpdHdpc2Utb3IiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgT1BUSU9OX0JJVFdJU0VfT1IuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC0tYml0d2lzZS1vci4KLQkqIGRvYy9jLW02OGsudGV4aTogRG9jdW1lbnQgLS1iaXR3aXNlLW9yLgotCi1XZWQgQXByIDI0IDExOjI4OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFByZXZlbnQgYXR0ZW1wdHMgdG8gdXNlIGxvbmcgb2Zmc2V0cwotIAlpbiA2ODAwMCBtb2RlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IEJGRF9BU1NFTUJMRVIgdmVyc2lvbjoKLQljYWxsIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuICBOb24gQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOgotCWNvcnJlY3QgaGFuZGxpbmcgb2YgaW5wdXQgbGluZSBwb2ludGVyLCBhbmQgY2FsbAotCWRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuCi0KLU1vbiBBcHIgMjIgMTg6MDI6MzcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBibHVlcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoaW5fYml0ZmllbGRfcmFuZ2UpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IE5ldyBjYXNlcyBYLFkuICBVc2UgU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUC4KLQkobWRfYXBwbHlfZml4LCBjYXNlcyBCRkRfUkVMT0NfMzJfUENSRUxfUzIsCi0JQkZEX1JFTE9DX1NQQVJDX3tXRElTUDE2LFdESVNQMTl9KTogRml4IHVuZGVmaW5lZCBjb2RlLgotCShtZF9hcHBseV9maXgpOiBOZXcgY2FzZXMgQkZEX1JFTE9DX1NQQVJDX1s1Nl0uCi0JKHRjX2dlbl9yZWxvYyk6IE5ldyBjYXNlcyBCRkRfUkVMT0NfU1BBUkNfWzU2XS4KLQotVGh1IEFwciAxOCAxODo1ODozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBCRkRfQVNTRU1CTEVSOgotIAkoY29mZl9sYXN0X2JmKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IFNldCBlbmRuZHggb2YgYSAuYmYgc3ltYm9sLgotCU5vbiBCRkRfQVNTRU1CTEVSOgotCShvYmpfY29mZl9lbmRlZik6IENhbGwgU0ZfU0VUX1BST0NFU1Mgb24gYSAuYmYgc3ltYm9sLgotCShsYXN0X2JmUCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHlhbmtfc3ltYm9scyk6IFNldCBlbmRuZHggb2YgYSAuYmYgc3ltYm9sLgotCi1UaHUgQXByIDE4IDExOjUzOjU4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgU29sYXJpcydzIC1sZQotCWFuZCAtcyBvcHRpb25zLiAgQWRkIC1iZSBmb3IgZ29vZCBtZWFzdXJlLgotCi1XZWQgQXByIDE3IDEyOjMxOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX3NwYWNlKTogU3VwcG9ydCBub24tY29uc3RhbnQgZmlsbCB2YWx1ZS4gIEhhbmRsZSBmaWxsCi0JdmFsdWUgY29ycmVjdGx5IGZvciBhIHNpemUgb3RoZXIgdGhhbiAxLgotCi1UdWUgQXByIDE2IDE1OjE3OjQwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobXlfZ2V0X2Zsb2F0X2V4cHJlc3Npb24pOiBVcGRhdGUgY2FsbCB0bwotCWdlbl90b193b3JkcywgWF9QUkVDSVNJT04gY2hhbmdlZCBmcm9tIDYgdG8gNS4KLQotVHVlIEFwciAxNiAxMDoyNTo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocmVnaXN0ZXJfbmFtZSxyZWdfbmFtZV9zZWFyY2gpOiBNb3ZlIHJlZ2lzdGVyCi0JbmFtZSBsb29rdXAgZnJvbSBQRSBzcGVjaWZpYyBjb2RlIHRvIGFsbCB0YXJnZXRzLiAgQWRkIHN1cHBvcnQgZm9yCi0JLW1yZWduYW1lcy8tbW5vLXJlZ25hbWVzIHRvIGNvbnRyb2wgd2hldGhlciByZWdpc3RlciBuYW1lcyBhcmUKLQlleHBhbmRlZCBvciBub3QuCi0JKG1kX2Fzc2VtYmxlKTogQ2FsbCByZWdpc3Rlcl9uYW1lIGZvciBhbGwgcGxhdGZvcm1zLgotCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW1yZWduYW1lcy8tbW5vLXJlZ25hbWVzLgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGNsZSotKi1zb2xhcmlzKTogQWRkIHN1cHBvcnQuCi0JKHBvd2VycGMqLSotbGludXgpOiBEaXR0by4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogY29uZmlnL3BwYy1zb2wubXQ6IE5ldyBjb25maWcgZmlsZSBmb3IgUG93ZXJQQyBTb2xhcmlzLgotCi1Nb24gQXByIDE1IDEyOjI2OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19mcm9iX2ZpbGUpOiBQZXJtaXQgbXVsdGlwbGUgJWhpIHJlbG9jcyB0bwotCWJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSAlbG8gcmVsb2MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfYWRkcmVzcyk6IENhc3QgWF9hZGRfbnVtYmVyIHRvIHZhbHVlVAotCWJlZm9yZSBjb21wYXJpbmcgYWdhaW5zdCBNQVhfR1BSRUxfT0ZGU0VULCBzbyB0aGF0IG5lZ2F0aXZlCi0JbnVtYmVycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JKG1hY3JvKTogTGlrZXdpc2UuCi0KLVRodSBBcHIgMTEgMTI6Mzk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobGFzdF9pbnNuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYXNzZW1ibGUpOiBXYXJuIGFib3V0IHB1dHRpbmcgZmxvYXRpbmcgcG9pbnQgYnJhbmNoZXMgaW4gYQotCWRlbGF5IHNsb3QuICBJZiBhcmNoaXRlY3R1cmUgaXMgbGVzcyB0aGFuIHY5LCBpbnNlcnQgTk9QCi0JaW5zdHJ1Y3Rpb25zIGJldHdlZW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGFuZCBmbG9hdGluZwotCXBvaW50IGJyYW5jaGVzLiAgKFRoZSBTdW5PUyBhc3NlbWJsZXIgZG9lcyBib3RoIHRoZXNlIG9wZXJhdGlvbnMuKQotCVNhdmUgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotCShzcGFyY19pcCk6IEFkZCBwaW5zbiBwYXJhbWV0ZXIuICBDaGFuZ2UgY2FsbGVyLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IENvcnJlY3QgY2hlY2sKLQlmb3IgYnl0ZSBqdW1wIHRvIG5leHQgaW5zdHJ1Y3Rpb24gdG8gc2tpcCBlbXB0eSBmcmFncy4KLQotV2VkIEFwciAxMCAxNjo0ODoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IElmIHdlIGFyZSBnb2luZyB0byBjYWxsIGVtaXRfYWRkNjQKLQlmb3IgYWRkcSB3aXRoIGEgMTYgYml0IHNpZ25lZCB2YWx1ZSwganVzdCBlbWl0IGEgbGRhIGluc3RydWN0aW9uCi0JaW5zdGVhZC4KLQotV2VkIEFwciAxMCAxNDozNDo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChkb19hX2ZpeF9pbW0pOiBEb24ndCBjdXQgb2ZmIGhpZ2ggYml0cwotCW9mIGEgMzJiaXQgb3BlcmFuZC4KLQotTW9uIEFwciAgOCAxNDo0Mjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByICA1IDE3OjAxOjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IFJlbW92ZSBzb21lICNpZiAwIGNvZGUuCi0JKGJ1aWxkX2J5dGVzKTogUmVtb3ZlIGFsbCBBQlNNT1YgcmVsYXRlZCBjb2RlOyBpdCdzIHVubmVjZXNzYXJ5LgotCi1GcmkgQXByICA1IDE1OjEzOjEwIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmM6IEZpeCBoYW5kbGluZyBvZiBkZW5vcm1hbGl6ZWQgZXh0ZW5kZWQKLQlwcmVjaXNpb24gbnVtYmVycyBhbmQgb3ZlcmZsb3cvdW5kZXJmbG93IGRldGVjdGlvbi4KLQkoTUFYX1BSRUNJU0lPTiwgWF9QUkVDSVNJT04sIFBfUFJFQ0lTSU9OKTogQ2hhbmdlZCBmcm9tIDYgdG8gNSwgdG8KLQlub3QgaW5jbHVkZSB0aGUgMTYgYml0IGdhcCBpbiB0aGUgbTY4ayBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LgotCi1GcmkgQXByICA1IDE0OjI5OjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgaTM4Ni0qLWZyZWVic2RlbGYqIHRhcmdldDsgZnJvbSBKb2huIFBvbHN0cmEKLQk8amRwQHBvbHN0cmEuY29tPi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAgNSAxODozOToyOCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFsbG93IG5vbi16ZXJvIG9mZnNldHMgZnJvbSAuc2RhdGEgc3ltYm9scyB0bwotIAliZSBhY2Nlc3NlZCB1c2luZyB0aGUgJGdwIHJlZ2lzdGVyLgotCSogY29uZmlnL3RjLW1pcHMuaCAoTUFYX0dQUkVMX09GRlNFVCk6IEFkZGVkLgotCi1XZWQgQXByICAzIDEwOjU2OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19tZF9lbmQpOiBTZXQgYmZkIG1hY2hpbmUgbnVtYmVyIHRvCi0JYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQgaWYgY3VycmVudF9hcmNoaXRlY3R1cmUgaXMgc3BhcmNsZXQuCi0KLU1vbiBBcHIgIDEgMTY6NTU6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGdldF9saW5lX3NiKTogQnVtcCBsaW5lIGNvdW50ZXJzIGJhc2VkIG9uCi0JaW5wdXRfbGluZV9wb2ludGVyWy0xXSwgbm90ICppbnB1dF9saW5lX3BvaW50ZXIuICBEb24ndCBib3RoZXIgdG8KLQljYWxsIExJU1RJTkdfTkVXTElORS4KLQkoc19tYWNybyk6IERvbid0IGNhbGwgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFdoZW4gaGFuZGxpbmcgQyBzdHlsZSBjb21tZW50cywgdW5nZXQKLQljaDIgcmF0aGVyIHRoYW4gY2guCi0KLUZyaSBNYXIgMjkgMTY6MTU6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmggKGVudW0gbGlua29uY2VfdHlwZSk6IERlZmluZS4KLQkoc19saW5rb25jZSk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgImxpbmtvbmNlIi4KLQkoc19saW5rb25jZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBZGQgbGlua29uY2UgZmllbGQgdG8KLQlNQU5ZX1NFR01FTlRTICYmICEgQkZEX0FTU0VNQkxFUiBzZWN0aW9uLgotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9oYW5kbGVfbGlua19vbmNlKTogRGVmaW5lIGlmIFRFX1BFLgotCShvYmpfY29mZl9wZV9oYW5kbGVfbGlua19vbmNlKTogRGVjbGFyZSBpZiBURV9QRS4KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBJZiBURV9QRSBhbmQgbm90IEJGRF9BU1NFTUJMRVIsICNpbmNsdWRlCi0JImNvZmYvcGUuaCIuCi0JKG9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UpOiBOZXcgZnVuY3Rpb24sIGRlZmluZWQgaWYgVEVfUEUuCi0JKGNfc2VjdGlvbl9zeW1ib2wpOiBJZiBURV9QRSwgc2V0IHRoZSB4X2NvbWRhdCBmaWVsZCBpbiB0aGUgYXV4Ci0JZW50cnkgYmFzZWQgb24gdGhlIGxpbmtvbmNlIGZpZWxkIGluIHNlZ21lbnRfaW5mby4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAubGlua29uY2UuCi0KLUZyaSBNYXIgMjkgMTE6MzE6MjcgMTk5NiAgSi5ULiBDb25rbGluICAoanRjQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLjE6IENoYW5nZWQgdG8gYmUgcmVjb2duaXplZCBieSBjYXRtYW4gLXcgb24gU29sYXJpcy4KLQotVGh1IE1hciAyOCAxNToyNzo0NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogQ2FsbCB0aGUgbGlzdGluZyBmdW5jdGlvbnMgYmVmb3JlCi0JZG9pbmcgdGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3NpbmcsIHdoaWNoIG1heSBpbnZvbHZlIGZyZWVpbmcgdGhlCi0Jc3RyaW5nLiAgUGFzcyBzdHJpbmcsIG5vdCBzdHJpbmcgKyBzdHJvZmYsIHRvIE9CSl9QUk9DRVNTX1NUQUIgaW4KLQlTRVBBUkFURV9TVEFCX1NFQ1RJT05TIGNhc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFJlbW92ZSBuZXN0ZWQgY29tbWVudC4KLQkodGNfZ2VuX3JlbG9jKTogTW92ZSBsYWJlbCBkb25lIGluc2lkZSB0aGUgaWZkZWYgaW4gd2hpY2ggaXQgaXMKLQl1c2VkLgotCShtZF9hcHBseV9maXgpOiBQYXNzIHBvaW50ZXJzIHRvIGNvcnJlY3QgdHlwZXMgdG8gbGliaHBwYS5oCi0JZnVuY3Rpb25zLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2ZpbGUpOiBEZWZpbmUuCi0JKG1pcHNfZnJvYl9maWxlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHN0cnVjdCBtaXBzX2hpX2ZpeHVwKTogRGVmaW5lLgotCShtaXBzX2hpX2ZpeHVwX2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbW1fdW5tYXRjaGVkX2hpKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYXNzZW1ibGUpOiBDbGVhciBpbW1fcmVsb2MsIGltbV91bm1hdGNoZWRfaGksIGFuZAotCW9mZnNldF9yZWxvYy4gIFBhc3MgaW1tX3VubWF0Y2hlZF9oaSB0byBhcHBlbmRfaW5zbi4KLQkoYXBwZW5kX2luc24pOiBBZGQgdW5tYXRjaGVkX2hpIHBhcmFtZXRlci4gIElmIGl0IGlzIHNldCwgYWRkIHRoZQotCW5ldyBmaXh1cCB0byBtaXBzX2hpX2ZpeHVwX2xpc3QuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG1pcHNfaXApOiBTZXQgaW1tX3VubWF0Y2hlZF9oaSB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IE1hciAyOCAxMTo0Nzo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotc29sYXJpczIqKTogUmVuYW1lZCBmcm9tIHNwYXJjKi0qLXNvbGFyaXMyKi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBNYXIgMjYgMTg6MTk6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5jIChtYWluKTogQ2FsbCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZS4KLQotRnJpIE1hciAyMiAxMToxMzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKHN0cmR1cCk6IERvbid0IGRlY2xhcmUuCi0JKiBzdGFicy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oCi0JKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKHNfc3RhYl9nZW5lcmljKTogTGlrZXdpc2UuCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHNfbXJpX3NlY3QpOiBMaWtld2lzZS4KLQotCSogZ2FzcC5jIChjaGFuZ2VfYmFzZSk6IFJlY29nbml6ZSBcKC4uLikgY29uc3RydWN0IGRvY3VtZW50ZWQgdG8KLQlwYXNzIHRocm91Z2ggZW5jbG9zZWQgY2hhcmFjdGVycyBsaXRlcmFsbHkgdGhyb3VnaCB0byB0aGUgb3V0cHV0LgotCShwcm9jZXNzX2Fzc2lnbnMpOiBMaWtld2lzZS4gIEFsc28sIGJlIG1vcmUgY2FyZWZ1bCB0byBhdm9pZAotCWxvb2tpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0KLVRodSBNYXIgMjEgMTM6MTg6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wYXJzZV9vcHRpb24pOiBJZiBPQkpfRUxGLCBpZ25vcmUgLWsgZm9yCi0JRnJlZUJTRCBjb21wYXRpYmlsaXR5LiAgRnJvbSBKb2huIFBvbHN0cmEgPGpkcEBwb2xzdHJhLmNvbT4uCi0KLVdlZCBNYXIgMjAgMTg6MTM6MzIgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYy1pOTYwLnRleGk6IEZpeCB0eXBvcy4KLQotV2VkIE1hciAyMCAxNzowNToxNiAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IEFkZGVkIGN2dHN0IGluc3RydWN0aW9uLgotCi1Nb24gTWFyIDE4IDEzOjEyOjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IERvbid0IHRyeSB0byBtYWtlIGEgc3ltYm9sIG91dCBvZiB0aGUgc3RhYgotCXN0cmluZy4gIEV4dHJhY3QgdGhlIGFkZGVuZCBmcm9tIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbi4KLQotRnJpIE1hciAxNSAxNzoxMDo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IElmIHdoaXRlc3BhY2UgaXMgc2VlbiBpbiBzdGF0ZSAxMSwgYW5kCi0JTEFCRUxTX1dJVEhPVVRfQ09MT05TIGlzIG5vdCBkZWZpbmVkLCBhbmQgd2UgYXJlIG5vdCBpbiBtNjhrIE1SSQotCW1vZGUsIGNoYW5nZSB0aGUgc3RhdGUgdG8gMyByYXRoZXIgdGhhbiAxLgotCi1UaHUgTWFyIDE0IDE4OjE4OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKENfUkVHSVNURVJfU0VDVElPTik6IENoYW5nZSBmcm9tIDIwIHRvIDUwLCB0bwotCWNvcnJlc3BvbmQgdG8gMTEgTWFyY2ggY2hhbmdlLgotCi1UaHUgTWFyIDE0IDE1OjI3OjEwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzLCBNRU1JTkQgY2FzZSk6IEdlbmVyYXRlCi0JYW4gUl9NRU1fSU5ESVJFQ1QgcmVsb2MgcmF0aGVyIHRoYW4gUl9SRUxCWVRFLgotCi1UdWUgTWFyIDEyIDEyOjIxOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi1Nb24gTWFyIDExIDE4OjU3OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBJbXByb3ZlIGhhbmRsaW5nIG9mCi0JWF9QUkVDSVNJT04gbnVtYmVycy4gIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+LgotCi1Nb24gTWFyIDExIDA5OjU5OjUzIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGFzLmggKFNFR19OT1JNQUwsIFNFR19MSVNUKTogQnVtcCBzZWdtZW50IGxpbWl0IGZyb20gMTAgdG8gNDAuCi0JKFNFR19MQVNUKTogTmV3LgotCSogc3Vic2Vncy5jIChNQU5ZX1NFR01FTlRTKTogSW5jcmVhc2Ugc2VnbWVudCBsaW1pdC4KLQkqIG9iai1jb2ZmLmMgKHNlZ19OX1RZUEUsIHNlZ19pbmZvX29mZl9ieV80KTogTGlrZXdpc2UuCi0JKGRvX3JlbG9jc19mb3IsIHdfc3ltYm9scywgb2JqX2NvZmZfYWRkX3NlZ21lbnQsIGRvX2xpbmVub3NfZm9yLAotCWNyYXdsX3N5bWJvbHMsIGNvZmZfaGVhZGVyX2FwcGVuZCk6IExvb3AgdG8gU0VHX0xBU1QgcmF0aGVyIHRoYW4KLQlTRUdfRTkuCi0JCi1UaHUgTWFyICA3IDE1OjE3OjM5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBIYW5kbGUgb3BlcmFuZCBjaGFyICdPJyAobmVnIHJlZykuCi0KLVRodSBNYXIgIDcgMDk6MTk6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChTVUJTRUdfTUlMTEkpOiBEZWZpbmUuCi0JKHBhX2RlZl9zdWJzcGFjZXMpOiBBZGQgJE1JTExJQ09ERSQuCi0JKHBhX3NwYWNlc19iZWdpbik6IFNldCBzZWN0aW9uIGZsYWdzIGZvciAkTUlMTElDT0RFJC4KLQotV2VkIE1hciAgNiAxNDoxMTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IE9ubHkgU0VDX0xPQUQgaWYgdGhlIHR5cGUgaXMKLQlub3QgU0hUX05PQklUUy4gIERvbid0IHRhbXBlciB3aXRoIGZsYWdzIGJhc2VkIG9uIHR5cGUgaWYgYQotCXNwZWNpYWwgc2VjdGlvbiB3YXMgZm91bmQgKHJldmVydCBGZWIgMjkgY2hhbmdlKS4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogT25seSBhbGlnbiB1c2luZyB0aGUgbm9wIHBhdHRlcm4KLQlpZiBhbGlnbmluZyB0byBhIGxvbmd3b3JkIGJvdW5kYXJ5IG9yIGdyZWF0ZXIuCi0KLVR1ZSBNYXIgIDUgMTU6MTA6NDMgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBQYXNzIDEgbm90IDIgdG8gZnJhZ19hbGlnbi4KLQotTW9uIE1hciAgNCAyMDo1MDo1NyAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1jeWd3aW4zMik6IERvbid0IHVzZSBiZmRfZ2FzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIE1hciAgNCAxMDoxMzowNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IEFkZCBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBSX04wU0VMIGFuZAotCVJfTjFTRUwgc2luY2UgdGhleSdyZSBub3QgZGVmaW5lZCBmb3Igb2xkIHZlcnNpb25zIG9mIGhwdXguCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCB0eXBvIGluIFJfQ09NUDIgY29kZS4KLQlTZXQgInN5bV9wdHJfcHRyIiBhbmQgImFkZGVuZCIgZmllbGRzIHRvIGR1bW15IHZhbHVlcyBmb3IKLQlSX04wU0VMIGFuZCBSX04xU0VMLgotCi1GcmkgTWFyICAxIDEwOjIwOjUyIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBmbG9udW0ta29uc3QuYzogQWRkIHR3byBtb3JlIGNvbnN0YW50cyBmb3IgMWUrLTIwNDggYW5kCi0JMWUrLTQwOTYsIGFuZCBjb3JyZWN0IHRoZSBvdGhlciBjb25zdGFudHMuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgT19sb2dpY2FsX25vdC4KLQotVGh1IEZlYiAyOSAxMzo1ODozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEFsbG93IHByZWRlZmluZWQgc2VjdGlvbgotCXR5cGVzIHRvIHNldCB0aGUgbm9iaXRzIHR5cGUuICBBdm9pZCBhIHNoYWRvd2VkIGRlY2xhcmF0aW9uLgotCi1XZWQgRmViIDI4IDE1OjM4OjU2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IEZvciBTT00sIGRvbid0Ci0JcmVkdWNlIHJlbG9jcyB1c2luZyBlX25scnNlbCBmaWVsZCBzZWxlY3RvcnMuCi0KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogRG9uJ3QgdXNlICNlbGlmLiAgU29tZSBjb21waWxlcnMKLQlkb24ndCBoYW5kbGUgaXQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHNlbGVjdG9yX3RhYmxlKTogQWRkICJuIiwgIm5sIiwgYW5kICJubHIiIHRvCi0JdGhlIHNlbGVjdG9yIHRhYmxlLgotCShwYV9jaGtfZmllbGRfc2VsZWN0b3IpOiBIYW5kbGUgbmV3IGZpZWxkIHNlbGVjdG9ycyBmb3IgU09NLgotCi1UdWUgRmViIDI3IDE0OjQyOjI3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1saW51eCphb3V0KiwgbTY4ay0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLWxpbnV4LmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpIFtURV9MSU5VWF06IERlZmluZSB0bwotCSJhLm91dC1tNjhrLWxpbnV4Ii4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpOiBEb24ndCBpbmNsdWRlICcjJyBpZiBURV9MSU5VWAotCWlzIGRlZmluZWQuCi0KLU1vbiBGZWIgMjYgMTg6NTg6NTggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSB0byBoYW5kbGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQotTW9uIEZlYiAyNiAxMDozNDoxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUHJpbnQgYWxsIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0Ci0JdGhlIGluc24gb24gbWlzbWF0Y2guCi0KLUZyaSBGZWIgMjMgMjE6NDQ6MzkgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgYTI5LWNvZmYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBGZWIgMjIgMTY6Mzk6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBjb25zaWRlciB0aGUgYWRkcmVzcwotCW9mIHRoZSBzZWN0aW9uIHdoZW4gbG9va2luZyBmb3IgdGhlIFJfU0hfVVNFUyBmaXh1cCwgYmVjYXVzZSB0aGUKLQlmcmFnIGFkZHJlc3NlcyBoYXZlIG5vdCB5ZXQgYmVlbiBhZGp1c3RlZC4KLQotCSogZ2RiaW5pdC5pbjogU2V0IGEgYnJlYWtwb2ludCBvbiBhc193YXJuX3doZXJlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEFkZCBtaXNzaW5nIGFyZ3VtZW50cyB0byBtYWNyb19idWlsZAotCW9taXR0ZWQgaW4gbGFzdCBjaGFuZ2UuICBGcm9tIEppbSBXaWxzb24gPHdpbHNvbkBjeWdudXMuY29tPi4KLQotV2VkIEZlYiAyMSAxNzowMDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jICh0Y19yZWxvY19tYW5nbGUpOiBDaGFuZ2UgcmVsb2MgYmFzZWQgb24gc2l6ZQotCWlmIGl0IGlzIFRDX0NPTlNfUkVMT0MuICBTZXQgYSBzaXplIG9mIDQgdG8gUl9SRUxMT05HLgotCi1XZWQgRmViIDIxIDA5OjI1OjM5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZWNvZ25pemUgJWFzcjAgZm9yIHY4LgotCi1UdWUgRmViIDIwIDIxOjQ4OjAzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAocGFyc2Vfa2V5d29yZF9hcmcpOiBBY2NlcHQgbGVhZGluZyAnJScuCi0JKHNwYXJjX2lwKTogQWNjZXB0ICVhc3JbMS4uMzFdIGZvciB2OCBhbmQgJWFzclslMTYuLjMxXSBmb3IgdjkuCi0JUmVjb2duaXplIFt1VV0gZm9ybWF0IGFyZ3MgYXMgc3BhcmNsZXQgY3ByZWdzLgotCi1UdWUgRmViIDIwIDIyOjI1OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX2hhbmRsZV9hbGlnbik6IERvbid0IGVtaXQgUl9TSF9BTElHTiByZWxvY3MKLQlpbiBic3Nfc2VjdGlvbi4KLQotTW9uIEZlYiAxOSAxNDoxNjoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBDaGVjayBTX0lTX1dFQUsgYXMKLQl3ZWxsIGFzIFNfSVNfRVhURVJOQUwuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSW4gT0JKX0VMRiBjYXNlLCBjaGVjayBmb3IKLQlTX0lTX1dFQUsgYXMgd2VsbCBhcyBTX0lTX0VYVEVSTkFMIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byByZXR1cm4KLQllYXJseS4KLQkodGNfZ2VuX3JlbG9jKTogQ2hlY2sgU19JU19XRUFLIGFzIHdlbCBhcyBTX0lTX0VYVEVSTkFMIHdoZW4KLQlkZWNpZGluZyB3aGV0aGVyIHRvIGNvbnZlcnQgQkZEX1JFTE9DXzMyX1BDUkVMX1MyIGlmIFBJQy4KLQotTW9uIEZlYiAxOSAwMjoxNTo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1heF9hcmNoaXRlY3R1cmUpOiBDaGFuZ2UgdG8gc3BhcmNsaXRlIGZvcgotCTMyIGJpdCBhcmNoLgotCShkZWZhdWx0X2NvbXBhdGlibGUpOiBEZWxldGUuCi0JKHNwYXJjX2Zmcyk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYmVnaW4pOiBPbmx5IGNhbGwgU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1Agb25jZS4KLQkoc3BhcmNfaXApOiBSZXdyaXRlIGFyY2hpdGVjdHVyZSBtYXRjaCBhbmQgYnVtcCBsb2dpYy4KLQotU3VuIEZlYiAxOCAxNTowMzo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yICdkbyBub3QgbWl4JyBmcm9tIG5hdGl2ZSBsaW5rZXIgYmVmb3JlCi0gCXRyeWluZyB0byB1c2UgLXJwYXRoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgRmViIDE2IDE2OjUzOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNGX0FESl9MTk5PUFRSKTogRGVmaW5lIChub24gQkZEX0FTU0VNQkxFUikuCi0JKFNGX0dFVF9BREpfTE5OT1BUUik6IERlZmluZSAobm9uIEJGRF9BU1NFTUJMRVIpLgotCShTRl9TRVRfQURKX0xOTk9QVFIpOiBEZWZpbmUgKG5vbiBCRkRfQVNTRU1CTEVSKS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9lbmRlZik6IFNldCBBREpfTE5OT1BUUiB3aGVuIExOTk9QVFIKLQlpcyBzZXQuCi0JKHdfc3ltYm9scyk6IElmIEFESl9MTk5PUFRSIGlzIHNldCwgYWRkIHRoZSBzZWN0aW9uIGxubm9wdHIgZmllbGQKLQl0byB0aGUgc3ltYm9sIGxubm9wdHIgZmllbGQsIHRvIGdldCB0aGUgY29ycmVjdCBmaWxlIG9mZnNldC4KLQotVGh1IEZlYiAxNSAxNDo0ODozOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IE9uIHRoZSBQb3dlclBDLCBmb3JjZSBhbGwKLQlzeW1ib2xzIHRoYXQgYXJlIG5vdCBmdW5jdGlvbiwgZmlsZSwgb3Igc2VjdGlvbiBzeW1ib2xzIHRvIGJlCi0Jb2JqZWN0IHR5cGVzLgotCi1UaHUgRmViIDE1IDExOjIwOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBTZXQgYW5kIHN1YnN0aXR1dGUgUlBBVEhfRU5WVkFSLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFJQQVRIX0VOVlZBUik6IE5ldyB2YXJpYWJsZS4KLQkoY2hlY2spOiBVc2UgJChSUEFUSF9FTlZWQVIpIHJhdGhlciB0aGFuIExEX0xJQlJBUllfUEFUSC4KLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgaTY4Ni4gIEZyb20gSC5KLiBMdSA8aGpsQHpvb20uY29tPjogaTM4NgotCWRvZXNuJ3QgbmVlZCBvcGNvZGVzLiAgSWYgY29uZmlndXJpbmcgc2hhcmVkLCBvcGNvZGVzIG5lZWRzIGJmZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEZlYiAxNCAxNjozMzoxMiAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiByZWFkLmMgKHNfbXJpX3NlY3QpOiBEb24ndCByZXR1cm4gJ1wwJyBpbiB0eXBlLiAgU2V0IGFsbAotCWFwcHJvcHJpYXRlIGZsYWdzIGluIEJGRCBzZWN0aW9uLgotCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1wc29zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtcHNvcy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpOiBEb24ndCBpbmNsdWRlICcjJyBpZiBURV9QU09TCi0JaXMgZGVmaW5lZC4KLQotV2VkIEZlYiAxNCAxMzo0MzoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGR1cGxpY2F0ZSBzZXR0aW5nIG9mIGNwdV90eXBlLiAgQ2hlY2sKLQl3aGV0aGVyIG9wY29kZXMgbGlicmFyeSBpcyByZXF1aXJlZCBmb3Igb24gYWxsIHRhcmdldHMsIG5vdCBqdXN0Ci0JcHJpbWFyeSBvbmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYmlnX2dvdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfZXh0ZXJuKTogRG9uJ3QgZGVjbGFyZS4KLQkocmVnX25lZWRzX2RlbGF5KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFjcm9fYnVpbGQpOiBQZXJtaXQgR09UL0NBTExfSEkvTE8gcmVsb2NzLgotCShtYWNyb19idWlsZF9sdWkpOiBJZiBwbGFjZSBpcyBub3QgTlVMTCwgdXNlIHRoZSBudW1iZXIgaW4gdGhlCi0JZXhwcmVzc2lvbi4KLQkobG9hZF9hZGRyZXNzKTogSGFuZGxlIG1pcHNfYmlnX2dvdCBjYXNlLgotCShtYWNybyk6IEhhbmRsZSBtaXBzX2JpZ19nb3QgZm9yIE1fTEFfQUIsIE1fSkFMX0EsIGFuZCBsb2FkIGFuZAotCXN0b3JlIG1hY3Jvcy4KLQkoT1BUSU9OX1hHT1QpOiBEZWZpbmUuCi0JKG1kX2xvbmdvcHRzKTogQWRkICJ4Z290IiBpZiBPQkpfRUxGLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLXhnb3QuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC14Z290LgotCShtZF9hcHBseV9maXgpOiBQZXJtaXQgR09UL0NBTExfSEkvTE8gcmVsb2NzLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgR09UL0NBTExfSEkvTE8gcmVsb2NzLgotCi1XZWQgRmViIDE0IDExOjIyOjI3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKSBbb3BlcmFuZCBraW5kICcjJ106IFdoZW4gZml4aW5nCi0JdGhlIGJ5dGUgcmVsb2NhdGlvbiwgcG9pbnQgaXQgdG8gdGhlIGxvdyBieXRlIG9mIHRoZSB3b3JkLgotCi1UdWUgRmViIDEzIDE1OjMxOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgSERMRkxBR1MgZm9yICotKi1ocHV4IHdpdGggLS1lbmFibGUtc2hhcmVkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gRmViIDEyIDE1OjUzOjQ2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhbnkgc3BhcmMqIGNwdS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLU1vbiBGZWIgMTIgMTU6NDE6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgIm1yaSIgYW5kICIubXJpIi4KLQkoc19tcmkpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmggKHNfbXJpKTogRGVjbGFyZS4KLQkqIGFwcC5jIChzY3J1Yl9tNjhrX21yaSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1yaV9wc2V1ZG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShkb19zY3J1Yl9iZWdpbik6IEFkZCBtNjhrX21yaSBwYXJhbWV0ZXIuICBVc2UgaXQgcmF0aGVyIHRoYW4KLQlmbGFnX202OGtfbXJpLiAgSW5pdGlhbGl6ZSBzY3J1Yl9tNjhrX21yaS4KLQkobXJpX3N0YXRlLCBtcmlfbGFzdF9jaCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3QgYXBwX3NhdmUpOiBBZGQgc2NydWJfbTY4a19tcmksIG1yaV9zdGF0ZSwgYW5kIG1yaV9sYXN0X2NoCi0JZmllbGRzLgotCShhcHBfcHVzaCk6IFNhdmUgbmV3IGZpZWxkcy4KLQkoYXBwX3BvcCk6IFJlc3RvcmUgbmV3IGZpZWxkcy4KLQkoZG9fc2NydWJfY2hhcnMpOiBDaGVjayBzY3J1Yl9tNjhrX21yaSByYXRoZXIgdGhhbiBmbGFnX21yaV9tcmkuCi0JSWYgVENfTTY4SywgdXNlIGEgdHJpdmlhbCBzdGF0ZSBtYWNoaW5lIHRvIGxvb2sgZm9yIG9jY3VycmVuY2VzIG9mCi0JdGhlIC5tcmkgcHNldWRvLW9wLCBhbmQgY2hhbmdlIHRoZSBtb2RlIGFwcHJvcHJpYXRlbHkuCi0JKiBhcy5oIChkb19zY3J1Yl9iZWdpbik6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9iZWdpbik6IFBhc3MgZmxhZ19tNjhrX21yaSB0bwotCWRvX3NjcnViX2JlZ2luLgotCSogY29uZmlnL3RjLW02OGsuYyAocmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuKTogTmV3IHN0YXRpYwotCXZhcmlhYmxlLgotCShtNjhrX21yaV9tb2RlX2NoYW5nZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IHJlZ19wcmVmaXhfb3B0aW9uYWxfc2Vlbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG02OGtfbXJpX21vZGVfY2hhbmdlKTogRGVjbGFyZS4KLQkoTVJJX01PREVfQ0hBTkdFKTogRGVmaW5lLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC5tcmkgcHNldWRvLW9wLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgdHJlYXQgJyMnIGFzIGEKLQljb21tZW50IGNoYXJhY3Rlci4KLQotTW9uIEZlYiAxMiAxNToxNjoyOSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCVN1cHBvcnQgZm9yIE9CSl9FTEYgb24gbTY4aywgbW9zdGx5IGluc2lkZSAjaWZkZWYgT0JKX0VMRjoKLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKGVudW0gcGljX3JlbG9jYXRpb24pOiBEZWZpbmUuCi0JKHN0cnVjdCBtNjhrX2V4cCk6IEFkZCBwaWNfcmVsb2MgZmllbGQuCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lIHRvIGNhbGwgdGNfbTY4a19maXhfYWRqdXN0YWJsZS4KLQkoTk9fUkVMT0MpOiBEZWZpbmUgdG8gQkZEX1JFTE9DX05PTkUgaWYgQkZEX0FTU0VNQkxFUiwgdG8gemVybwotCW90aGVyd2lzZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IERlbGV0ZSBkZWZpbml0aW9uIG9mIE5PX1JFTE9DLgotIAkoc3RydWN0IG02OGtfaXQpOiBBZGQgcGljX3JlbG9jIGZpZWxkLgotCShhZGRfZml4KTogQ29weSBvdmVyIHBpY19yZWxvYyBmaWVsZC4KLQkobWRfcHNldWRvX3RhYmxlKTogSW50ZXJwcmV0IC5hbGlnbiBwYXJhbWV0ZXIgYXMgYnl0ZSBjb3VudC4KLQkobW90ZV9wc2V1ZG9fdGFibGUpOiBMaWtld2lzZS4KLQkodGNfbTY4a19maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkoZ2V0X3JlbG9jX2NvZGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogVXNlIGl0IGFzIGxhc3QgYXJndW1lbnQgdG8gZml4X25ld19leHAuCi0JKG1kX2FwcGx5X2ZpeF8yKTogRm9yIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGRvbid0IHB1dCB0aGUKLQlhZGRlbmQgaW50byB0aGUgZGF0YS4KLQkodGNfZ2VuX3JlbG9jKTogRGlmZmVyZW50IGFkZGVuZCBjb21wdXRhdGlvbiBmb3IgT0JKX0VMRi4KLQkobTY4a19pcCk6IERvbid0IHJlbGF4IGFuIG9wZXJhbmQgdGhhdCByZXF1aXJlcyBwaWMgcmVsb2NhdGlvbi4KLQkobWRfYmVnaW4pOiBBbGlnbiAudGV4dCwgLmRhdGEgYW5kIC5ic3Mgb24gNCBieXRlIGJvdW5kYXJ5IGJ5Ci0JZGVmYXVsdC4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgotIAlUQ19NNjhLIGFuZCBPQkpfRUxGLgotCSogY29uZmlnL202OGstcGFyc2UueSAoeXlsZXgpOiBIYW5kbGUgQFBMVFBDLCBldGMuCi0JKG1vdG9yb2xhX29wZXJhbmQpOiBBZGQgcnVsZSBmb3IgYCh6YXBjLCBFWFBSKScuCi0KLU1vbiBGZWIgMTIgMTA6MDc6MzMgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBGaXhlZCBzbyB0aGF0IHdoaXRlc3BhY2UKLQkqcmVhbGx5KiBpcyBwZXJtaXNzaWJsZSBiZWZvcmUgdGhlIGNvbW1hLgotCi1Nb24gRmViIDEyIDAwOjEyOjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogQWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnkgYmVmb3JlCi0JaW5zZXJ0aW5nIG5vcCBpbnN0cnVjdGlvbnMuCi0KLUZyaSBGZWIgIDkgMTA6NTQ6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGUtYXV4Lmg6IENoYW5nZSBpbmNsdWRlIG9mIGF1eC5oIHRvIGF1eC1jb2ZmLmguCi0KLVRodSBGZWIgIDggMjA6MDI6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBDb3JyZWN0IHN0b3JhZ2UKLQljbGFzcyBzZXR0aW5nIGZvciBhIENBTExOQU1FIHN5bWJvbCBpbiBDT0ZGLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBQYXNzIG5lZ2F0aXZlIG51bWJlcnMgZm9yIG5ldyAuYmFsaWduW3dsXSBhbmQKLQkucDJhbGlnblt3bF0gcHNldWRvLW9wcy4KLQkoc19hbGlnbl9ieXRlcyk6IFRyZWF0IGEgbmVnYXRpdmUgYXJndW1lbnQgYXMgc3BlY2lmeWluZyB0aGUgZmlsbAotCWxlbmd0aC4KLQkoc19hbGlnbl9wdHdvKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDcgMTQ6MTI6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgYmFsaWdudywgYmFsaWdubCwgcDJhbGlnbncsIGFuZCBwMmFsaWdubC4KLQkoZG9fYWxpZ24pOiBUYWtlIG5ldyBsZW4gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgUGFzcyBpdAotCXRvIG1kX2RvX2FsaWduLgotCShzX2FsaWduX2J5dGVzKTogQXJnIG5vdyBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsbCBwYXR0ZXJuLgotCShzX2FsaWduX3B0d28pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFBhc3MgbGVuZ3RoIHRvCi0JbWRfZG9fYWxpZ24uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6IFRha2UgbmV3IGxlbiBwYXJhbWV0ZXIuCi0JKiBjb25maWcvdGMtbTg4ay5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBuZXcgcHNldWRvLW9wcy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX21kZXBzKTogRGl2aWRlIG9mZnNldCBieSBmcl92YXIsIGFzIGlzCi0JZG9uZSBpbiBjdnRfZnJhZ190b19maWxsLgotCi0JKiBjb25maWcvdGMtc2guaCAoc2hfZG9fYWxpZ24pOiBEZWNsYXJlLgotCShtZF9kb19hbGlnbik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfbGluZW5vKTogRG9uJ3QgdHJ5IHRvIHN0b3JlIHRoZSBhZGRyZXNzCi0JZGlmZmVyZW5jZSBpZiB0aGUgbmV4dCBhZGRyZXNzIGlzIGJlZm9yZSB0aGUgY3VycmVudCBvbmUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2NwdSk6IEFkZCBhbGlhcyBmaWVsZC4KLQkoYXJjaHMpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkobTY4a19pcCk6IERvbid0IGxpc3QgYWxpYXMgbmFtZXMgd2hlbiBsaXN0aW5nIENQVXMgd2hpY2ggc3VwcG9ydAotCWFuIGluc3RydWN0aW9uLgotCi0JKiBhcy5jIChtYWluKTogQ2FsbCBwYXJzZV9hcmdzIGJlZm9yZSByZWFkX2JlZ2luLgotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSWYgZmxhZ19tNjhrX21yaSwgZG9uJ3QgcHV0IGEgZG90IGluCi0JZnJvbnQgb2YgZ2VuZXJhdGVkIHBzZXVkby1vcHMuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBJZ25vcmUgIm5hbWUiLgotCShzX2FwcF9maWxlKTogUGVybWl0IGEgc2luZ2xlIHF1b3RlIGFmdGVyIHRoZSBzdHJpbmcsIHNpbmNlIG9uZQotCW1heSBhcHBlYXIgaW4gbTY4ayBNUkkgbW9kZS4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgSWYgbGlua2luZyBhZ2FpbnN0Ci0Jc2hhcmVkIEJGRCBhbmQgb3Bjb2RlcywgZml4IGxpYnJhcnkgbmFtZSBvbiBTdW5PUywgYW5kIHRyeSB0byBzZXQKLQktcnBhdGggcmVhc29uYWJseS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEZlYiAgNiAxNToxNjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGZsYWdfbTY4a19tcmkpOiBEZWNsYXJlLgotCSogYXMuYyAocGFyc2VfYXJncyk6IElmIFRDX002OEssIHNldCBmbGFnX202OGtfbXJpIGZvciAtTS4KLQkqIE1hbnkgZmlsZXM6IEZvciBNUkkgc3ludGF4IHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIG02OGsgTVJJCi0JYXNzZW1ibGVyLCBjaGVjayBmbGFnX202OGtfbXJpIHJhdGhlciB0aGFuIGZsYWdfbXJpIG9yCi0JTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVC4KLQotTW9uIEZlYiAgNSAxNjoyOToxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKEFSQ0hfSFgpOiBEZWZpbmUuCi0JKGFyY2hfdGFiKTogQWRkIEhYLgotCSh0YXJnX2hhc19zZnIpOiBIYW5kbGUgQVJDSF9IWC4KLQkodGFyZ19oYXNfaWNsYXNzKTogSGFuZGxlIEFSQ0hfSFguCi0JKHRjX2NvZmZfZml4MnJ0eXBlKTogQWRkIHJldHVybiAwIHRvIGF2b2lkIHdhcm5pbmcuCi0JKHRjX2hlYWRlcnNfaG9vayk6IElmIHRoZSBhcmNoaXRlY3R1cmUgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5LAotCXVzZSBpdCB3aGVuIHNldHRpbmcgdGhlIGZsYWdzLiAgU2V0IHRoZSBleHRlcm4gdmFyaWFibGUgY29mZl9mbGFncwotCXJhdGhlciB0aGFuIGhlYWRlcnMtPmZpbGVoZHIuZl9mbGFncywgc2luY2UgdGhlIGxhdHRlciBpcyBzZXQKLQl1bmNvbmRpdGlvbmFsbHkgaW4gb2JqLWNvZmYuYy4KLQkoaTk2MF9oYW5kbGVfYWxpZ24pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGZpeHAuCi0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KLQlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluOiBTZXQgT1BDT0RFUyBhbmQgQkZEIHRvIHNlYXJjaCBkaXJlY3Rvcmllcy4KLQlTdWJzdGl0dXRlIE9QQ09ERVNfREVQIGFuZCBCRkRERVAuICBPbiBTdW5PUywgc2V0IEhMREZMQUdTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKExERkxBR1MsIEhMREZMQUdTKTogTmV3IHZhcmlhYmxlcy4KLQkoTElCREVQUyk6IE5ldyB2YXJpYWJsZS4KLQkoYXMubmV3MDogRGVwZW5kIHVwb24gJChMSUJERVBTKSByYXRoZXIgdGhhbiAkKExJQlMpLiAgVXNlCi0JJChITERGTEFHUykgaW4gbGluay4KLQkoY2hlY2spOiBTZXQgTERfTElCUkFSWV9QQVRIIGluIHRoZSBlbnZpcm9ubWVudC4KLQotRnJpIEZlYiAgMiAxNzo0MTo1MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBjb25maWcvdGMtcHBjLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogTWFrZSAuc2RhdGEyLCAuc2JzczIsCi0JLlBQQy5FTUIuc2RhdGEwLCBhbmQgLlBQQy5FTUIuc2JzczAgc2VjdGlvbnMgYWxsIGRlZmF1bHQgdG8KLQlyZWFkLW9ubHksIG5vdCByZWFkL3dyaXRlLgotCi1GcmkgRmViICAyIDE0OjA5OjI1IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfWEZPUk0pOiBSZW1vdmUgLWUuCi0KLUZyaSBGZWIgIDIgMTI6MzI6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBVc2UgU19JU19ERUZJTkVEIGFuZCBTX0lTX0NPTU1PTiByYXRoZXIKLQl0aGFuIGNvbXBhcmluZyBTX0dFVF9TRUdNRU5UIHRvIHVuZGVmaW5lZF9zZWN0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4KLQl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBVc2UgU19JU19ERUZJTkVEIGFuZAotCVNfSVNfQ09NTU9OIHJhdGhlciB0aGFuIGNvbXBhcmluZyBTX0dFVF9TRUdNRU5UIHRvCi0JdW5kZWZpbmVkX3NlY3Rpb24uCi0JKFNfR0VUX1ZBTFVFKTogTGlrZXdpc2UuICBBdm9pZCByZWN1cnNpb24gcHJvYmxlbXMgaWYgU19JU19ERUZJTkVECi0Jb3IgU19JU19DT01NT04gY2FsbCBTX0dFVF9WQUxVRS4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0NPTU1PTik6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IElmIGEgcmVsb2MgaXMgZXF1YXRlZAotCXRvIGFuIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLCBjb252ZXJ0IHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0Ci0JdGhlIHRhcmdldCBzeW1ib2wuCi0JKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoU19JU19DT01NT04pOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWJvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBJZiBhIHJlbG9jIGlzIGVxdWF0ZWQKLQl0byBhbiB1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbCwgY29udmVydCB0aGUgcmVsb2MgdG8gYmUgYWdhaW5zdAotCXRoZSB0YXJnZXQgc3ltYm9sLgotCShvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbgotCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBVc2UgU19JU19ERUZJTkVEIGFuZAotCVNfSVNfQ09NTU9OIHJhdGhlciB0aGFuIGNvbXBhcmluZyBTX0dFVF9TRUdNRU5UIHRvCi0JdW5kZWZpbmVkX3NlY3Rpb24uCi0JKHlhbmtfc3ltYm9scyk6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4gdW5kZWZpbmVkIG9yCi0JY29tbW9uIHN5bWJvbC4KLQotVGh1IEZlYiAgMSAxNTozNDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0xPQ0FMKTogQ2hlY2sgZm9yIFwwMDIgYXMgd2VsbCBhcyBcMDAxLgotCSogY29uZmlnL29iai1ib3V0LmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgd2Ugb25seSBhZGQgbTY4ay1wYXJzZS5vIHRvCi0JJHtleHRyYV9vYmplY3RzfSBvbmNlLCBubyBtYXR0ZXIgaG93IG1hbnkgbTY4ayB0YXJnZXRzIGhhdmUgYmVlbgotCWVuYWJsZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMzEgMTg6MzE6NDYgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotY3lnd2luMzIsIHBwYy0qLWN5Z3dpbjMyKTogTmV3LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDMxIDE0OjAzOjE3IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImV4dGVuZCIgYW5kICJsZG91YmxlIi4KLQkqIGRvYy9jLW02OGsudGV4aTogRG9jdW1lbnQgLmV4dGVuZCBhbmQgLmxkb3VibGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki1hcHBsZS1hdXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy90ZS1hdXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29tcGFyZV9leHRlcm5hbF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uCi0JaWYgVEVfQVVYLgotCShkb19yZWxvY3NfZm9yKTogU29ydCByZWxvY3MgaWYgVEVfQVVYLgotCShmaXh1cF9zZWdtZW50KTogSWYgVEVfQVVYLCBzdG9yZSBjb21tb24gc3ltYm9sIHZhbHVlIGluIHNlZ21lbnQuCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGlmIFRFX0FVWC4KLQotV2VkIEphbiAzMSAxMjoyNDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0xPQ0FMKTogQ2hlY2sgZm9yIFwwMDIgYXMgd2VsbCBhcyBcMDAxLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX21pcHNfZ2xvYmwpOiBTZXQgQlNGX09CSkVDVCBpZiBpdCBpcyBub3QKLQlCU0ZfRlVOQ1RJT04uCi0JKHNfY3Bsb2FkKTogU2V0IEJTRl9PQkpFQ1QgZm9yIF9ncF9kaXNwIHN5bWJvbC4KLQkqIHJlYWQuYyAoc19sY29tbSk6IElmIFNfU0VUX1NJWkUgaXMgZGVmaW5lZCwgc2V0IHRoZSBzaXplIG9mIHRoZQotCXN5bWJvbC4KLQkqIGVjb2ZmLmMgKGFkZF9wcm9jZWR1cmUpOiBTZXQgdGhlIEJTRl9GVU5DVElPTiBmbGFnLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogSWYgU19TRVRfU0laRSBpcyBkZWZpbmVkLCBzZXQgdGhlIHNpemUgb2YKLQlhbiB1bmRlZmluZWQgc3ltYm9sIGFuZCB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IElmIFRDX01JUFMsIHNldCBCU0ZfT0JKRUNUCi0JZm9yIGFsbCBjb21tb24gc3ltYm9scy4KLQotVHVlIEphbiAzMCAxMjozNToyNCAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAocGFyc2VfbWVtb3ApOiBJbiBNUkkgbW9kZSwgZG9uJ3QgdXNlIGltcGxpY2l0Ci0Jc2NhbGluZyBvZiBpbmRleC4KLQotCSogZXhwci5jIChvcGVyYW5kKTogQWNjZXB0IDB4IGhleCBjb25zdGFudHMgaW4gTVJJIG1vZGUgaWYgbm90IG9uCi0JbTY4ay4KLQotTW9uIEphbiAyOSAxMjoyMTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdHlwZSk6IFNldCBCU0ZfT0JKRUNUIGZsYWcgZm9yIGEgdHlwZQotCW9mIG9iamVjdC4gIEZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotCSogZWNvZmYuYyAobG9jYWxzeW1fdCk6IEFkZCBhZGRlbmQgZmllbGQuCi0JKGFkZF9lY29mZl9zeW1ib2wpOiBBZGQgYWRkZW5kIGFyZ3VtZW50LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShjb2ZmX3N5bV92YWx1ZSk6IE1ha2Ugc3RhdGljLgotCShjb2ZmX3N5bV9hZGRlbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShlY29mZl9kaXJlY3RpdmVfZGVmKTogSW5pdGlhbGl6ZSBjb2ZmX3N5bV9hZGRlbmQuCi0JKGVjb2ZmX2RpcmVjdGl2ZV92YWwpOiBBY2NlcHQgc3ltYm9sICsgY29uc3RhbnQuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZik6IFBhc3MgY29mZl9zeW1fYWRkZW5kIHRvIGFkZF9lY29mZl9zeW1ib2wuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBJbmNsdWRlIHRoZSBhZGRlbmQgaW4gdGhlIHN5bWJvbCB2YWx1ZS4KLQotRnJpIEphbiAyNiAxOToyODo1MiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IElnbm9yZSBvdmVyZmxvdyBvbiAKLQlCRkRfUkVMT0NfMTZfR09UT0ZGIGFuZCBCRkRfUkVMT0NfUFBDX1RPQzE2LgotCi1GcmkgSmFuIDI2IDE2OjE0OjE3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogU0RBMjEgcmVsb2NhdGlvbnMgYXJlIG5vdyA0Ci0JYnl0ZXMgaW4gc2l6ZSwgc28gb2Zmc2V0IGFwcHJvcHJpYXRlbHkgaW4gYmlnIGVuZGlhbiBtb2RlIHdoZW4KLQl3cml0aW5nIHRoZSBib3R0b20gMiBieXRlcy4KLQotVGh1IEphbiAyNSAyMDoyNjoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGRlZmF1bHRfY29tcGF0aWJsZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSBpdC4gIFJld3JpdGUgd2Fybl9vbl9idW1wIGhhbmRsaW5nLgotCShzcGFyY19pcCk6IElmIG5vIGFyY2hpdGVjdHVyZSBvciAtYnVtcCBzcGVjaWZpZWQsIGRvbid0IG1hcmsgYXMKLQltaXNtYXRjaGVkIHRob3NlIGluIGRlZmF1bHRfY29tcGF0aWJsZS4KLQotVGh1IEphbiAyNSAxMjoyMTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTQ08gRUxGIHN1cHBvcnQgZnJvbSBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+OgotCSogY29uZmlndXJlLmluIChpMzg2LSotc2NvKmVsZiopOiBVc2UgZm10IGVsZiwgdGFyZyBzY281LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3NjbzUubXQ6IE5ldyBmaWxlOyBzZXQgVERFRklORVMgdG8gLURTQ09fRUxGLgotCSogY29uZmlnL3RjLWkzODYuYyAoc2NvX2lkKTogTmV3IGZ1bmN0aW9uLCBpZiBTQ09fRUxGLgotCSogY29uZmlnL3RjLWkzODYuaCAodGNfaW5pdF9hZnRlcl9hcmdzKTogRGVmaW5lIGlmIFNDT19FTEYuCi0JKHNjb19pZCk6IERlY2xhcmUgaWYgU0NPX0VMRi4KLQotVGh1IEphbiAyNSAwMzoxMDo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluaXRpYWxfYXJjaGl0ZWN0dXJlLGNhbl9idW1wX3Y5X3ApOiBEZWxldGVkLgotCSh7bWF4LHdhcm5fYWZ0ZXJ9X2FyY2hpdGVjdHVyZSk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShtZF9iZWdpbik6IFJlcGxhY2UgTlVNT1BDT0RFUyB3aXRoIHNwYXJjX251bV9vcGNvZGVzLgotCUlmIGJvdGggYXJjaGl0ZWN0dXJlIGFuZCAtYnVtcCByZXF1ZXN0ZWQsIHNldCBtYXhfYXJjaGl0ZWN0dXJlIHRvIG1heC4KLQkoc3BhcmNfbWRfZW5kKTogU2ltcGxpZnkuCi0JKHNwYXJjX2lwKTogUmVwbGFjZSByZWZlcmVuY2VzIHRvIGNhbl9idW1wX3Y5X3Agd2l0aCBtYXhfYXJjaGl0ZWN0dXJlLgotCVJld3JpdGUgY29kZSB0byBidW1wIGFyY2hpdGVjdHVyZSBhbmQgY2hlY2sgZm9yIGNvbmZsaWN0cy4KLQkobWRfbG9uZ29wdHMpOiBSZWNvZ25pemUgLXhhcmNoPXt2OHBsdXMsdjhwbHVzYX0gZm9yIGNvbXBhdGliaWxpdHkKLQl3aXRoIFNvbGFyaXMgYXNzZW1ibGVyLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4gIENhbGwgc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlLgotCi1XZWQgSmFuIDI0IDIyOjExOjAzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IEZpeCByZWZlcmVuY2UgdG8gJCR7c3JjZGlyfS4KLQotTW9uIEphbiAyMiAwOToyMTozNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBVc2UgI2lmZGVmIFNQQVJDX0FSQ0g2NCBpbnN0ZWFkIG9mCi0JI2lmZGVmIHNwYXJjdjkgd2hlbiBjaG9vc2luZyB2YWx1ZS4KLQkoRU5WNjQpOiBEZWxldGUuCi0JKG1kX2VuZCk6IERlZmluZS4KLQkoc3BhcmNfbWRfZW5kKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChTUEFSQ19WOSk6IFJlbmFtZWQgZnJvbSBzcGFyY3Y5LgotCShpbml0aWFsX2FyY2hpdGVjdHVyZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKGNhbl9idW1wX3Y5X3ApOiBMaWtld2lzZS4KLQkoTk9fVjkpOiBEZWxldGUgYWxsIG9jY3VycmVuY2VzLgotCShzcGFyY19tZF9lbmQpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogTmV3IGxvY2FsIHY5X2FyZ19wLiAgUmV3b3JrIGZwIHJlZyBudW1iZXIgdGVzdC4KLQlEb24ndCBidW1wIGFyY2hpdGVjdHVyZSB0byB2OSB1bmxlc3MgY2FuX2J1bXBfdjlfcCBzZXQuCi0JKG1kX3BhcnNlX29wdGlvbik6IC1BPGFyY2g+IHBhc3NlZCwgc2V0IGNhbl9idW1wX3Y5X3AgYWNjb3JkaW5nbHkuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjNjQgdGFyZ2V0IGNwdSk6IERvbid0IHNldCBvYmpfZm9ybWF0IGhlcmUuCi0JKFNQQVJDX1Y5KTogUmVuYW1lZCBmcm9tIHNwYXJjdjkuCi0JKHNwYXJjNjQtKi1lbGYqKTogRGVmaW5lIFNQQVJDX0FSQ0g2NC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBhY2NvbmZpZy5oIChTUEFSQ19WOSk6IFJlbmFtZWQgZnJvbSBzcGFyY3Y5LgotCShTUEFSQ19BUkNINjQpOiBBZGQuCi0JKiBjb25mLmluOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy92bXNjb25mLmg6IFVwZGF0ZS4KLQotTW9uIEphbiAyMiAxNzoyNDo0NyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBPcHRpbWlzZSAiZGxpIiBsb2Fkcy4KLQkobWRfc2hvd191c2FnZSk6IGFkZCAiLW1jcHU9dnI0MTAwIiB0byBoZWxwIHRleHQuCi0KLU1vbiBKYW4gMjIgMTE6NTM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSWYgYSBzeW1ib2wgaXMgZXF1YXRlZCB0byBhbgotCXVuZGVmaW5lZCBzeW1ib2wsIHByZXNlcnZlIHRoZSBYX29wIG9mIE9fc3ltYm9sLgotCShTX0dFVF9WQUxVRSk6IEZpeCBjaGVjayB0byBwZXJtaXQgdGhpcyBjYXNlLgotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSWYgYSByZWxvYyBpcyBhZ2FpbnN0IGFuIHVuZGVmaW5lZAotCXN5bWJvbCBlcXVhdGVkIHRvIGFub3RoZXIgc3ltYm9sLCBjaGFuZ2UgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QKLQl0aGUgbGF0dGVyIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2NzZWN0KTogQW4gdW5uYW1lZCBjc2VjdCBpcyBzdG9yYWdlIGNsYXNzCi0JWE1DX1BSLgotCi1Nb24gSmFuIDIyIDEwOjU5OjQ4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmL3BwYy5oKTogSW5jbHVkZSBlbGYvcHBjLmggaWYgdGFyZ2V0Ci0JY29tcHV0ZXIgaXMgUG93ZXJQQy4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQWRkIG1vcmUgZW1iZWRkZWQgcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBBZGQgc2VjdGlvbnMKLQltZW50aW9uZWQgaW4gdGhlIGVhYmkuCi0KLVRodSBKYW4gMTggMTc6NTg6MTkgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3JlbGRhdGEpOiBDaGFuZ2VkIGFsaWduZW1lbnQgb24gcmVsZGF0YV9zZWN0aW9uCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19wZGF0YSk6IENoYW5nZWQgdGhlIGFsaWdubWVudCBvbiBwZGF0YV9zZWN0aW9uCi0KLU1vbiBKYW4gMTUgMTc6NDM6NDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1hcHBpbmcpOiBBZGQgbW9yZSByZWxvY2F0aW9uIHN1ZmZpeGVzLgotCi1TdW4gSmFuIDE0IDIxOjI5OjM2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IC5nY2NfZXhjZXB0X3RhYmxlCi0JYXMgYSBzZWN0aW9uIGl0IGlzIG9rIHRvIGhhdmUgdW5hZG9ybmVkIC1tcmVsb2NhdGFibGUgcG9pbnRlcnMgaW4uCi0KLVNhdCBKYW4gMTMgMTE6MDk6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19zZWN0aW9uKik6IFdyYXAgdGhlc2UgZnVuY3Rpb25zIGluc2lkZQotCSNpZmRlZiBPQkpfRUxGLgotCi1GcmkgSmFuIDEyIDE1OjMyOjA3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWRkIGhvb2tzIHNvIG1hY2hpbmUKLQlkZXBlbmRlbnQgc2VjdGlvbiBhdHRyaWJ1dGVzIGNhbiBiZSBoYW5kbGVkLgotCi0JKiBjb25maWcvdGMtcHBjLmg6IChtZF9lbGZfc2VjdGlvbl97bGV0dGVyLHR5cGUsd29yZCxmbGFnc30pOiBOZXcKLQltYWNyb3MgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGUgc2VjdGlvbiBmbGFnIGFuZCBvcmRlcmVkIHNlY3Rpb24KLQl0eXBlLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc2VjdGlvbl97bGV0dGVyLHR5cGUsd29yZCxmbGFnc30pOiBOZXcKLQlmdW5jdGlvbnMgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGUgc2VjdGlvbiBmbGFnIGFuZCBvcmRlcmVkCi0Jc2VjdGlvbiB0eXBlLgotCi1GcmkgSmFuIDEyIDEyOjA0OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IERvbid0IHRyeSB0byBsb29rIHVwIHRoZSBzZWN0aW9uCi0Jc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGhhdmUgYSBzeW1ib2wKLQl3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBzZWN0aW9uLCBidXQgbm8gY29ubmVjdGlvbiB0byBpdC4KLQotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IE9ubHkgY2FsbCBtcmlfY29tbWVudF9lbmQgZnJvbSBmbGFnX21yaS4KLQlGcm9tIEphbWVzIENhcmxzb24gPGNhcmxzb25AeHlsb2dpY3MuY29tPi4KLQotCSogZXhwci5jIChvcGVyYW5kKTogU2tpcCB3aGl0ZXNwYWNlIGFmdGVyIGEgY2xvc2UgcGFyZW50aGVzaXMuCi0JRnJvbSBKYW1lcyBDYXJsc29uIDxjYXJsc29uQHh5bG9naWNzLmNvbT4uCi0KLVR1ZSBKYW4gIDIgMTI6NDM6MjMgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogQ2FsbCBhc19iYWRfd2hlcmUgaW5zdGVhZCBvZgotCWFzX3dhcm5fd2hlcmUgZm9yIHJlbG9jYXRpb24gb3ZlcmZsb3cuCi0JKHBhcnNlX3JlZyk6IEFjY2VwdCByZWdpc3RlciBuYW1lIG9ubHkgaWYgbmV4dCBjaGFyYWN0ZXIgaXMKLQlub3QgYWxwaGFudW1lcmljLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTkyOTUKZGlmZiAtLWdpdCBhL2dhcy9NYWtlZmlsZS5hbSBiL2dhcy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwNTUyNC4uMDAwMDAwMAotLS0gYS9nYXMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzMxICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotIyMgV29yayBhcm91bmQgYXBwYXJlbnQgYXV0b21ha2UgYnVnLgotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gZG9jIHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwuLi9iaXNvbi9iaXNvbiA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgIGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLU1LREVQID0gJCR7c3JjZGlyfS8uLi9ta2RlcAotCi1UQVJHX0NQVSA9IEB0YXJnZXRfY3B1X3R5cGVACi1UQVJHX0NQVV9DID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5jCi1UQVJHX0NQVV9PID0gdGMtQHRhcmdldF9jcHVfdHlwZUAubwotVEFSR19DUFVfSCA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuaAotT0JKX0ZPUk1BVF9DID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmMKLU9CSl9GT1JNQVRfTyA9IG9iai1Ab2JqX2Zvcm1hdEAubwotT0JKX0ZPUk1BVF9IID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmgKLVRBUkdfRU5WX0ggPSAkKHNyY2RpcikvY29uZmlnL3RlLUB0ZV9maWxlQC5oCi1BVE9GX1RBUkdfQyA9ICQoc3JjZGlyKS9jb25maWcvYXRvZi1AYXRvZkAuYwotQVRPRl9UQVJHX08gPSBhdG9mLUBhdG9mQC5vCi0KLSMgdXNlIEB0YXJnZXRfY3B1X3R5cGVAIGZvciByZWZlcmluZyB0byBjb25maWd1cmVkIHRhcmdldCBuYW1lCi1JVF9IRFJTPWl0YmwtcGFyc2UuaCAkKHNyY2RpcikvaXRibC1vcHMuaCAKLUlUX1NSQ1M9aXRibC1wYXJzZS5jIGl0YmwtbGV4LmMgJChzcmNkaXIpL2l0Ymwtb3BzLmMKLUlUX0RFUFM9JChzcmNkaXIpL2l0YmwtcGFyc2UueSAkKHNyY2RpcikvaXRibC1sZXgubCAkKHNyY2RpcikvY29uZmlnL2l0YmwtQHRhcmdldF9jcHVfdHlwZUAuaAotSVRfT0JKUz1pdGJsLXBhcnNlLm8gaXRibC1sZXgubyBpdGJsLW9wcy5vCi0KLSMgQ1BVIHR5cGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCi0KLUNQVV9UWVBFUyA9IFwKLQlhMjlrIFwKLQlhbHBoYSBcCi0JYXJjIFwKLQlhcm0gXAotCWQxMHYgXAotCWQzMHYgXAotCWZyMzAgXAotCWg4MzAwIFwKLQloODUwMCBcCi0JaHBwYSBcCi0JaTM4NiBcCi0JaTg2MCBcCi0JaTk2MCBcCi0JbTMyciBcCi0JbTY4ayBcCi0JbTg4ayBcCi0JbWNvcmUgXAotCW1pcHMgXAotCW1uMTAyMDAgXAotCW1uMTAzMDAgXAotCW5zMzJrIFwKLQlwaiBcCi0JcHBjIFwKLQlzaCBcCi0Jc3BhcmMgXAotCXRhaG9lIFwKLQl0aWMzMCBcCi0JdGljODAgXAotCXZheCBcCi0JdzY1IFwKLQl2ODUwIFwKLQl6OGsKLQotIyBPYmplY3QgZm9ybWF0IHR5cGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCi0jIFdlIGRlbGliZXJhdGVseSBvbWl0IHNvbSwgc2luY2UgaXQgZG9lcyBub3Qgd29yayBhcyBhIGNyb3NzIGFzc2VtYmxlci4KLQotT0JKX0ZPUk1BVFMgPSBcCi0JYW91dCBcCi0JYm91dCBcCi0JY29mZiBcCi0JZWNvZmYgXAotCWVsZiBcCi0JZXZheCBcCi0JaHAzMDAgXAotCWllZWUgXAotCXZtcwotCi0jIFRoaXMgaXMgYW4gc2ggY2FzZSB3aGljaCBzZXRzIHZhbGlkIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBDUFUKLSMgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgYyBhbmQgdGhlIE9TIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIG8KLSMgYXJlIHN1cHBvcnRlZC4gIFRoaXMgaGVscHMgY3V0cyBkb3duIG9uIHRoZSBhbW91bnQgb2YgZGVwZW5kZW5jeQotIyBpbmZvcm1hdGlvbi4KLQotQ1BVX09CSl9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJG8gaW4gXAotCWFvdXQpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGEyOWsgfCBhcm0gfCBpMzg2IHwgaTg2MCB8IG02OGsgfCBtaXBzIHwgbnMzMmsgfCBzcGFyYyB8IHRhaG9lIHwgdGljMzAgfCB2YXgpIFwKLQkgICAgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWJvdXQpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGk5NjApIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQljb2ZmKSB2YWxpZD15ZXMgOzsgXAotCWVjb2ZmKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBtaXBzIHwgYWxwaGEpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQllbGYpIHZhbGlkPXllcyA7OyBcCi0JZXZheCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgYWxwaGEpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQlocDMwMCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgbTY4aykgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCXZtcykgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgdmF4KSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JZXNhYzsKLQotIyBUaGlzIGlzIGxpa2UgQ1BVX09CSl9WQUxJRCwgZm9yIHRoZSBvYmo9bXVsdGkgY2FzZS4KLQotQ1BVX01VTFRJX1ZBTElEID0gXAotCXZhbGlkPSA7IFwKLQljYXNlICQkYyBpbiBcCi0JaTM4NiB8IG1pcHMpIHZhbGlkPXllcyA7OyBcCi0JZXNhYzsKLQotIyBSZWd1bGFyIHNvdXJjZSBmaWxlcy4KLQotR0FTX0NGSUxFUyA9IFwKLQlhcHAuYyBcCi0JYXMuYyBcCi0JYXRvZi1nZW5lcmljLmMgXAotCWJpZ251bS1jb3B5LmMgXAotCWNvbmQuYyBcCi0JZGVwZW5kLmMgXAotCWR3YXJmMmRiZy5jIFwKLQllY29mZi5jIFwKLQllaG9wdC5jIFwKLQlleHByLmMgXAotCWZsb251bS1jb3B5LmMgXAotCWZsb251bS1rb25zdC5jIFwKLQlmbG9udW0tbXVsdC5jIFwKLQlmcmFncy5jIFwKLQloYXNoLmMgXAotCWlucHV0LWZpbGUuYyBcCi0JaW5wdXQtc2NydWIuYyBcCi0JbGlzdGluZy5jIFwKLQlsaXRlcmFsLmMgXAotCW1hY3JvLmMgXAotCW1lc3NhZ2VzLmMgXAotCW91dHB1dC1maWxlLmMgXAotCXJlYWQuYyBcCi0Jc2IuYyBcCi0Jc3RhYnMuYyBcCi0Jc3Vic2Vncy5jIFwKLQlzeW1ib2xzLmMgXAotCXdyaXRlLmMKLQotQ0ZJTEVTID0gJChHQVNfQ0ZJTEVTKSBnYXNwLmMgaXRibC1vcHMuYwotCi1IRklMRVMgPSBcCi0JYXMuaCBcCi0JYXNpbnRsLmggXAotCWJpZ251bS5oIFwKLQliaXRfZml4LmggXAotCWNnZW4uaCBcCi0JZHdhcmYyZGJnLmggXAotCWVjb2ZmLmggXAotCWVtdWwtdGFyZ2V0LmggXAotCWVtdWwuaCBcCi0JZXhwci5oIFwKLQlmbG9udW0uaCBcCi0JZnJhZ3MuaCBcCi0JaGFzaC5oIFwKLQlpbnB1dC1maWxlLmggXAotCWl0Ymwtb3BzLmggXAotCWxpc3RpbmcuaCBcCi0JbWFjcm8uaCBcCi0Jb2JqLmggXAotCW91dHB1dC1maWxlLmggXAotCXJlYWQuaCBcCi0Jc2IuaCBcCi0Jc3RydWMtc3ltYm9sLmggXAotCXN1YnNlZ3MuaCBcCi0Jc3ltYm9scy5oIFwKLQl0Yy5oIFwKLQl3cml0ZS5oCi0KLSMgQ1BVIGZpbGVzIGluIGNvbmZpZy4KLQotVEFSR0VUX0NQVV9DRklMRVMgPSBcCi0JY29uZmlnL3RjLWEyOWsuYyBcCi0JY29uZmlnL3RjLWFscGhhLmMgXAotCWNvbmZpZy90Yy1hcmMuYyBcCi0JY29uZmlnL3RjLWFybS5jIFwKLQljb25maWcvdGMtZDEwdi5jIFwKLQljb25maWcvdGMtZDMwdi5jIFwKLQljb25maWcvdGMtZnIzMC5jIFwKLQljb25maWcvdGMtaDgzMDAuYyBcCi0JY29uZmlnL3RjLWg4NTAwLmMgXAotCWNvbmZpZy90Yy1ocHBhLmMgXAotCWNvbmZpZy90Yy1pMzg2LmMgXAotCWNvbmZpZy90Yy1pODYwLmMgXAotCWNvbmZpZy90Yy1pOTYwLmMgXAotCWNvbmZpZy90Yy1tMzJyLmMgXAotCWNvbmZpZy90Yy1tNjhrLmMgXAotCWNvbmZpZy90Yy1tODhrLmMgXAotCWNvbmZpZy90Yy1tY29yZS5jIFwKLQljb25maWcvdGMtbWlwcy5jIFwKLQljb25maWcvdGMtbW4xMDIwMC5jIFwKLQljb25maWcvdGMtbW4xMDMwMC5jIFwKLQljb25maWcvdGMtbnMzMmsuYyBcCi0JY29uZmlnL3RjLXBqLmMgXAotCWNvbmZpZy90Yy1wcGMuYyBcCi0JY29uZmlnL3RjLXNoLmMgXAotCWNvbmZpZy90Yy1zcGFyYy5jIFwKLQljb25maWcvdGMtdGFob2UuYyBcCi0JY29uZmlnL3RjLXRpYzMwLmMgXAotCWNvbmZpZy90Yy10aWM4MC5jIFwKLQljb25maWcvdGMtdmF4LmMgXAotCWNvbmZpZy90Yy13NjUuYyBcCi0JY29uZmlnL3RjLXY4NTAuYyBcCi0JY29uZmlnL3RjLXo4ay5jCi0KLVRBUkdFVF9DUFVfSEZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmggXAotCWNvbmZpZy90Yy1hbHBoYS5oIFwKLQljb25maWcvdGMtYXJjLmggXAotCWNvbmZpZy90Yy1hcm0uaCBcCi0JY29uZmlnL3RjLWQxMHYuaCBcCi0JY29uZmlnL3RjLWQzMHYuaCBcCi0JY29uZmlnL3RjLWZyMzAuaCBcCi0JY29uZmlnL3RjLWg4MzAwLmggXAotCWNvbmZpZy90Yy1oODUwMC5oIFwKLQljb25maWcvdGMtaHBwYS5oIFwKLQljb25maWcvdGMtaTM4Ni5oIFwKLQljb25maWcvdGMtaTg2MC5oIFwKLQljb25maWcvdGMtaTk2MC5oIFwKLQljb25maWcvdGMtbTMyci5oIFwKLQljb25maWcvdGMtbTY4ay5oIFwKLQljb25maWcvdGMtbTg4ay5oIFwKLQljb25maWcvdGMtbWNvcmUuaCBcCi0JY29uZmlnL3RjLW1pcHMuaCBcCi0JY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0JY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0JY29uZmlnL3RjLW5zMzJrLmggXAotCWNvbmZpZy90Yy1wai5oIFwKLQljb25maWcvdGMtcHBjLmggXAotCWNvbmZpZy90Yy1zaC5oIFwKLQljb25maWcvdGMtc3BhcmMuaCBcCi0JY29uZmlnL3RjLXRhaG9lLmggXAotCWNvbmZpZy90Yy10aWMzMC5oIFwKLQljb25maWcvdGMtdGljODAuaCBcCi0JY29uZmlnL3RjLXZheC5oIFwKLQljb25maWcvdGMtdzY1LmggXAotCWNvbmZpZy90Yy12ODUwLmggXAotCWNvbmZpZy90Yy16OGsuaAotCi0jIE9CSiBmaWxlcyBpbiBjb25maWcKLQotT0JKX0ZPUk1BVF9DRklMRVMgPSBcCi0JY29uZmlnL29iai1hb3V0LmMgXAotCWNvbmZpZy9vYmotYm91dC5jIFwKLQljb25maWcvb2JqLWNvZmYuYyBcCi0JY29uZmlnL29iai1lY29mZi5jIFwKLQljb25maWcvb2JqLWVsZi5jIFwKLQljb25maWcvb2JqLWV2YXguYyBcCi0JY29uZmlnL29iai1ocDMwMC5jIFwKLQljb25maWcvb2JqLWllZWUuYyBcCi0JY29uZmlnL29iai1zb20uYyBcCi0JY29uZmlnL29iai12bXMuYwotCi1PQkpfRk9STUFUX0hGSUxFUyA9IFwKLQljb25maWcvb2JqLWFvdXQuaCBcCi0JY29uZmlnL29iai1ib3V0LmggXAotCWNvbmZpZy9vYmotY29mZi5oIFwKLQljb25maWcvb2JqLWVjb2ZmLmggXAotCWNvbmZpZy9vYmotZWxmLmggXAotCWNvbmZpZy9vYmotZXZheC5oIFwKLQljb25maWcvb2JqLWhwMzAwLmggXAotCWNvbmZpZy9vYmotaWVlZS5oIFwKLQljb25maWcvb2JqLXNvbS5oIFwKLQljb25maWcvb2JqLXZtcy5oCi0KLSMgRW11bGF0aW9uIGhlYWRlciBmaWxlcyBpbiBjb25maWcKLQotVEFSR19FTlZfSEZJTEVTID0gXAotCWNvbmZpZy90ZS0zODZic2QuaCBcCi0JY29uZmlnL3RlLWF1eC5oIFwKLQljb25maWcvdGUtZGVsdGEuaCBcCi0JY29uZmlnL3RlLWRlbHQ4OC5oIFwKLQljb25maWcvdGUtZHB4Mi5oIFwKLQljb25maWcvdGUtZHluaXguaCBcCi0JY29uZmlnL3RlLWVwb2MtcGUuaCBcCi0JY29uZmlnL3RlLWdlbmVyaWMuaCBcCi0JY29uZmlnL3RlLWdvMzIuaCBcCi0JY29uZmlnL3RlLWhwMzAwLmggXAotCWNvbmZpZy90ZS1ocHBhLmggXAotCWNvbmZpZy90ZS1pMzg2YWl4LmggXAotCWNvbmZpZy90ZS1pYzk2MC5oIFwKLQljb25maWcvdGUtbGludXguaCBcCi0JY29uZmlnL3RlLWxuZXdzLmggXAotCWNvbmZpZy90ZS1seW54LmggXAotCWNvbmZpZy90ZS1tYWNoLmggXAotCWNvbmZpZy90ZS1tYWNvcy5oIFwKLQljb25maWcvdGUtbXVsdGkuaCBcCi0JY29uZmlnL3RlLW5ic2QuaCBcCi0JY29uZmlnL3RlLW5ic2Q1MzIuaCBcCi0JY29uZmlnL3RlLXBjNTMybWFjaC5oIFwKLQljb25maWcvdGUtcGUuaCBcCi0JY29uZmlnL3RlLXBwY253LmggXAotCWNvbmZpZy90ZS1wc29zLmggXAotCWNvbmZpZy90ZS1yaXNjaXguaCBcCi0JY29uZmlnL3RlLXNwYXJjYW91dC5oIFwKLQljb25maWcvdGUtc3VuMy5oIFwKLQljb25maWcvdGUtc3ZyNC5oIFwKLQljb25maWcvdGUtc3lzdjMyLmgKLQotIyBNdWx0aSBmaWxlcyBpbiBjb25maWcKLQotTVVMVElfQ0ZJTEVTID0gXAotCWNvbmZpZy9lLWkzODZjb2ZmLmMgXAotCWNvbmZpZy9lLWkzODZlbGYuYyBcCi0JY29uZmlnL2UtbWlwc2Vjb2ZmLmMgXAotCWNvbmZpZy9lLW1pcHNlbGYuYwotCi1DT05GSUdfT0JKUyA9IFwKLQkkKFRBUkdfQ1BVX08pIFwKLQkkKE9CSl9GT1JNQVRfTykgXAotCSQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpCi0KLUdFTkVSSUNfT0JKUyA9IFwKLQlhcHAubyBcCi0JYXMubyBcCi0JYXRvZi1nZW5lcmljLm8gXAotCWJpZ251bS1jb3B5Lm8gXAotCWNvbmQubyBcCi0JZGVwZW5kLm8gXAotCWR3YXJmMmRiZy5vIFwKLQllaG9wdC5vIFwKLQlleHByLm8gXAotCWZsb251bS1rb25zdC5vIFwKLQlmbG9udW0tY29weS5vIFwKLQlmbG9udW0tbXVsdC5vIFwKLQlmcmFncy5vIFwKLQloYXNoLm8gXAotCWlucHV0LWZpbGUubyBcCi0JaW5wdXQtc2NydWIubyBcCi0JbGl0ZXJhbC5vIFwKLQltZXNzYWdlcy5vIFwKLQlvdXRwdXQtZmlsZS5vIFwKLQlyZWFkLm8gXAotCXN1YnNlZ3MubyBcCi0Jc3ltYm9scy5vIFwKLQl3cml0ZS5vIFwKLQlsaXN0aW5nLm8gXAotCWVjb2ZmLm8gXAotCXN0YWJzLm8gXAotCXNiLm8gXAotCW1hY3JvLm8KLQotT0JKUyA9ICQoQ09ORklHX09CSlMpICQoR0VORVJJQ19PQkpTKQotCi1QT1RGSUxFUyA9ICQoTVVMVElfQ0ZJTEVTKSAkKFRBUkdFVF9FTlZfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKSBcCi0JJChPQkpfRk9STUFUX0NGSUxFUykgJChUQVJHRVRfQ1BVX0hGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAotCSQoSEZJTEVTKSAkKENGSUxFUykgJChHQVNfQ0ZJTEVTKQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotbm9pbnN0X1BST0dSQU1TID0gYXMtbmV3IGdhc3AtbmV3Ci1ub2luc3RfU0NSSVBUUyA9ICQoR0RCSU5JVCkKLUVYVFJBX1NDUklQVFMgPSAuZ2RiaW5pdAotCi0kKHNyY2RpcikvbWFrZS1nYXMuY29tOiBzdGFtcC1tay5jb20KLXN0YW1wLW1rLmNvbTogdm1zY29uZi5zaCBNYWtlZmlsZQotCXNoICQoc3JjZGlyKS92bXNjb25mLnNoICQoR0VORVJJQ19PQkpTKSA+IG5ldy1tYWtlLmNvbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBuZXctbWFrZS5jb20gJChzcmNkaXIpL21ha2UtZ2FzLmNvbQotCXRvdWNoIHN0YW1wLW1rLmNvbQotCi1FWFRSQV9ESVNUID0gbWFrZS1nYXMuY29tCi0KLURJU1RTVFVGRiA9IG1ha2UtZ2FzLmNvbSBtNjhrLXBhcnNlLmMgaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCBpdGJsLWxleC5jCi1kaXN0c3R1ZmY6ICQoRElTVFNUVUZGKSBpbmZvCi0KLURJU1RDTEVBTkZJTEVTID0gdGFyZy1jcHUuaCBvYmotZm9ybWF0LmggdGFyZy1lbnYuaCBpdGJsLWNwdS5oIGNnZW4tZGVzYy5oCi0KLSMgTm93IGZpZ3VyZSBvdXQgZnJvbSB0aG9zZSB2YXJpYWJsZXMgaG93IHRvIGNvbXBpbGUgYW5kIGxpbmsuCi0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIgPSAkKEJBU0VESVIpL2luY2x1ZGUKLQotIyBUaGlzIGlzIHRoZSB2YXJpYWJsZSBhY3R1YWxseSB1c2VkIHdoZW4gd2UgY29tcGlsZS4KLSMgU3BlY2lmeSB0aGUgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgZm9yIGhlYWRlciBmaWxlcy4KLSMgQm90aCAuIGFuZCBzcmNkaXIgYXJlIHVzZWQsIGluIHRoYXQgb3JkZXIsCi0jIHNvIHRoYXQgdG0uaCBhbmQgY29uZmlnLmggd2lsbCBiZSBmb3VuZCBpbiB0aGUgY29tcGlsYXRpb24KLSMgc3ViZGlyZWN0b3J5IHJhdGhlciB0aGFuIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoc3JjZGlyKS9jb25maWcgLUkkKElOQ0RJUikgLUkkKHNyY2RpcikvLi4gLUkkKEJGRERJUikgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi0jIFRoaXMgc2hvdWxkIGJlIHBhcmFsbGVsIHRvIElOQ0xVREVTLCBidXQgc2hvdWxkIHJlcGxhY2UgJChzcmNkaXIpCi0jIHdpdGggJCR7c3JjZGlyfSwgYW5kIHNob3VsZCB3b3JrIGluIGEgc3ViZGlyZWN0b3J5LiAgVGhpcyBpcyB1c2VkCi0jIHdoZW4gYnVpbGRpbmcgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHRoZSBkZXBlbmRlbmN5IGJ1aWxkaW5nIGlzIGRvbmUKLSMgaW4gYSBzdWJkaXJlY3RvcnkuCi1ERVBfSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkIC1JJCR7c3JjZGlyfS9jb25maWcgLUkkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUgLUkkJHtzcmNkaXJ9Ly4uIC1JJCR7c3JjZGlyfS8uLi9iZmQgLUkkJHtzcmNkaXJ9Ly4uL2ludGwgLUkuLi8uLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBIb3cgdG8gbGluayB3aXRoIGJvdGggb3VyIHNwZWNpYWwgbGlicmFyeSBmYWNpbGl0aWVzCi0jIGFuZCB0aGUgc3lzdGVtJ3MgaW5zdGFsbGVkIGxpYnJhcmllcy4KLQotR0FTTElCUyA9IEBPUENPREVTX0xJQkAgQEJGRExJQkAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLSMgRmlsZXMgdG8gYmUgY29waWVkIGF3YXkgYWZ0ZXIgZWFjaCBzdGFnZSBpbiBidWlsZGluZy4KLVNUQUdFU1RVRkYgPSAqLm8gJChub2luc3RfUFJPR1JBTVMpCi0KLSQoT0JKUyk6IEBBTExfT0JKX0RFUFNACi0KLWFzX25ld19TT1VSQ0VTID0gJChHQVNfQ0ZJTEVTKQotYXNfbmV3X0xEQUREID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExMSUJTKQotYXNfbmV3X0RFUEVOREVOQ0lFUyA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMREVQUykKLQotIyBTdHVmZiB0aGF0IGV2ZXJ5IG9iamVjdCBmaWxlIGRlcGVuZHMgdXBvbi4gIElmIGFueXRoaW5nIGlzIHJlbW92ZWQKLSMgZnJvbSB0aGlzIGxpc3QsIHJlbW92ZSBpdCBmcm9tIGRlcC1pbi5zZWQgYXMgd2VsbC4KLSQoT0JKUyk6IGNvbmZpZy5oIGFzLmggJChUQVJHX0VOVl9IKSAkKE9CSl9GT1JNQVRfSCkgJChUQVJHX0NQVV9IKSBmbG9udW0uaCBcCi0JZXhwci5oIHdyaXRlLmggZnJhZ3MuaCBoYXNoLmggcmVhZC5oIHN5bWJvbHMuaCB0Yy5oIFwKLQlvYmouaCBsaXN0aW5nLmggYmlnbnVtLmggYml0X2ZpeC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBhc2ludGwuaAotCi1nYXNwX25ld19TT1VSQ0VTID0gZ2FzcC5jIG1hY3JvLmMgc2IuYyBoYXNoLmMKLWdhc3BfbmV3X0xEQUREID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi1nYXNwX25ld19ERVBFTkRFTkNJRVMgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLQotRVhQRUNUID0gYGlmIFsgLWYgJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCi0JCWVjaG8gJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgOyBlbHNlIGVjaG8gcnVudGVzdDsgXAotCSAgIGZpYAotUlVOVEVTVEZMQUdTPQotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCWlmIFsgLWQgdGVzdHN1aXRlIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgbWtkaXIgdGVzdHN1aXRlOyBcCi0JZmkKLQlybSAtZiB0ZXN0c3VpdGUvc2l0ZS5leHAKLQljcCBzaXRlLmV4cCB0ZXN0c3VpdGUvc2l0ZS5leHAKLQlyb290bWU9YHB3ZGA7IGV4cG9ydCByb290bWU7IFwKLQlzcmNkaXI9YGNkICR7c3JjZGlyfTsgcHdkYCA7IGV4cG9ydCBzcmNkaXIgOyBcCi0JRVhQRUNUPSR7RVhQRUNUfSA7IGV4cG9ydCBFWFBFQ1QgOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JY2QgdGVzdHN1aXRlOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBUaGUgaW1wbGljaXQgLmMubyBydWxlIGRvZXNuJ3Qgd29yayBmb3IgdGhlc2UsIHBlcmhhcHMgYmVjYXVzZSBvZgotIyB0aGUgdmFyaWFibGVzLCBvciBwZXJoYXBzIGJlY2F1c2UgdGhlIHNvdXJjZXMgYXJlIG5vdCBvbiB2cGF0aC4KLSQoVEFSR19DUFVfTyk6ICQoVEFSR19DUFVfQykgJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApCi0JJChDT01QSUxFKSAtYyAkKFRBUkdfQ1BVX0MpCi0kKEFUT0ZfVEFSR19PKTogJChBVE9GX1RBUkdfQykKLQkkKENPTVBJTEUpIC1jICQoQVRPRl9UQVJHX0MpCi0KLSMgZWNvZmYuYyBvbmx5IGhhcyBmdWxsIGRlcGVuZGVuY2llcyB3aGVuIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLAotIyBzbyB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kgc3R1ZmYgZG9lc24ndCB3b3JrLgotZWNvZmYubyA6IGVjb2ZmLmMgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLQkkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotCSQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmgKLQotIyBXZSBuZWVkIGFsbCB0aGVzZSBleHBsaWNpdCBydWxlcyBmb3IgdGhlIG11bHRpIHN0dWZmLiAgQmVjYXVzZSBvZgotIyB0aGVzZSBydWxlcywgd2UgZG9uJ3QgbmVlZCBvbmUgZm9yIE9CSl9GT1JNQVRfTy4KLQotb2JqLWFvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi1vYmotYm91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLW9iai1jb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi1vYmotZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKLW9iai1lbGYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYwotb2JqLWV2YXgubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi1vYmotaHAzMDAubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKLW9iai1pZWVlLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotb2JqLW11bHRpLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCi1vYmotc29tLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKLW9iai12bXMubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYwotCi1lLW1pcHNlbGYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKLWUtbWlwc2Vjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0KLSMgVGhlIG02OGsgb3BlcmFuZCBwYXJzZXIuCi0KLUVYVFJBX2FzX25ld19TT1VSQ0VTID0gY29uZmlnL202OGstcGFyc2UueQotCi0jIElmIG02OGstcGFyc2UueSBpcyBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnksIHRoZW4geWx3cmFwIHdpbGwgdXNlIGFuCi0jIGFic29sdXRlIHBhdGggd2hlbiBpdCBpbnZva2VzIHlhY2MsIHdoaWNoIHdpbGwgY2F1c2UgeWFjYyB0byBwdXQgdGhlCi0jIGFic29sdXRlIHBhdGggaW50byB0aGUgZ2VuZXJhdGVkIGZpbGUuICBUaGF0J3MgYSBwYWluIHdoZW4gaXQgY29tZXMKLSMgdG8gZ2VuZXJhdGluZyBzbmFwc2hvdHMsIGJlY2F1c2UgaXQgaW50cm9kdWNlcyBzcHVyaW91cyBkaWZmcy4KLSMgU2luY2Ugd2hlbiB3ZSBtYWtlIHRoZSBzbmFwc2hvdHMgJChzcmNkaXIpID0gIi4iLCB3ZSBjaGVjayBmb3IgdGhhdAotIyBjYXNlIGFuZCBoYW5kbGUgaXQgZGlmZmVyZW50bHkuICBUaGlzIG1lYW5zIHRoYXQgYW55Ym9keSB3aG8KLSMgY29uZmlndXJlcyB3aXRoICQoc3JjZGlyKSA9ICIuIiB3aWxsIGhhdmUgdG8gc2V0IHRoZWlyIHBhdGggaW4gdGhlCi0jIGRlYnVnZ2VyIGlmIHRoZXkgd2FudCB0byBkZWJ1ZyBtNjhrLXBhcnNlLnkuICBUaGlzIGlzIGJhZCwgYnV0IG9uCi0jIHRoZSBvdGhlciBoYW5kIGl0J3MgZ29vZCB0aGF0IHBlb3BsZSB3aG8gdXNlIHRoZSBwcmVidWlsdAotIyBtNjhrLXBhcnNlLmMgZG9uJ3QgZ2V0IGEgc3B1cmlvdXMgYWJzb2x1dGUgcGF0aC4KLW02OGstcGFyc2UuYzogJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLnkKLQlmPSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55OyBcCi0JaWYgWyAkJGYgPSAiLi9jb25maWcvbTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIGxuIC1zIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgbG4gY29uZmlnL202OGstcGFyc2UueSAuID4gL2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IFwKLQkgICBjcCBjb25maWcvbTY4ay1wYXJzZS55IC4gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgXAotCSAgZj1tNjhrLXBhcnNlLnk7IFwKLQllbHNlIHRydWU7IGZpOyBcCi0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkJGYgeS50YWIuYyBtNjhrLXBhcnNlLmMgLS07IFwKLQlpZiBbICQkZiA9ICJtNjhrLXBhcnNlLnkiIF07IHRoZW4gXAotCSAgcm0gLWYgbTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaQotbTY4ay1wYXJzZS5vOiBtNjhrLXBhcnNlLmMgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLQotIyBEb24ndCBsZXQgdGhlIC55LmggcnVsZSBjbG9iYmVyIG02OGstcGFyc2UuaC4KLW02OGstcGFyc2UuaDogOyBAdHJ1ZQotJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmg6IDsgQHRydWUKLQotIyBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUgc3BlY2lmaWNhdGlvbiBsZXhpY2FsIGFuYWx5emVyIGFuZCBwYXJzZXIuCi0KLWl0YmwtbGV4LmM6ICQoc3JjZGlyKS9pdGJsLWxleC5sCi1pdGJsLWxleC5vOiBpdGJsLWxleC5jIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLm86IGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggJChzcmNkaXIpL2l0Ymwtb3BzLmgKLQotaXRibC1vcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0KLWl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmg6ICQoc3JjZGlyKS9pdGJsLXBhcnNlLnkKLQkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQoc3JjZGlyKS9pdGJsLXBhcnNlLnkgeS50YWIuYyBpdGJsLXBhcnNlLmMgeS50YWIuaCBpdGJsLXBhcnNlLmggLS0gLWQKLQotIyBzdGFuZC1hbG9uZSBpdGJsIGFzc2VtYmxlciAmIGRpc2Fzc2VtYmxlcgotCi1FWFRSQV9QUk9HUkFNUyA9IGl0YmwtdGVzdAotaXRibF90ZXN0X1NPVVJDRVMgPSBpdGJsLXBhcnNlLnkgaXRibC1sZXgubAotaXRibF90ZXN0X0xEQUREID0gaXRibC10b3BzLm8gaXRibC10ZXN0Lm8gJChHQVNMSUJTKSBATEVYTElCQAotCi1pdGJsLXRvcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0JJChDT01QSUxFKSAtbyBpdGJsLXRvcHMubyAtRFNUQU5EX0FMT05FIC1jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi0KLWl0YmwtdGVzdC5vOiAkKHNyY2RpcikvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMgJChzcmNkaXIpL2l0Ymwtb3BzLmgKLQkkKENPTVBJTEUpIC1jIC1EU1RBTkRfQUxPTkUgJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCi0KLSMgQ0dFTiBpbnRlcmZhY2UuCi0KLUNHRU5fQ1BVX1BSRUZJWCA9IEBjZ2VuX2NwdV9wcmVmaXhACi0KLWNnZW4ubzogY2dlbi5jIGNnZW4uaCBjZ2VuLWRlc2MuaCBzdWJzZWdzLmggXAotCSQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1kZXNjLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1vcGMuaAotCi0jIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAotCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKLQl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCBERVBUQyBERVBPQkogREVQMiBERVAxIERFUEEgREVQIERFUERJUgotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKLS5QSE9OWTogaW5zdGFsbC1leGVjLWJpbmRpciBpbnN0YWxsLWV4ZWMtdG9vbGRpcgotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGluc3RhbGwtZXhlYy1iaW5kaXIgQGluc3RhbGxfdG9vbGRpckAKLQotaW5zdGFsbC1leGVjLWJpbmRpcjogJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKGJpbmRpcikKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotaW5zdGFsbC1leGVjLXRvb2xkaXI6ICQobm9pbnN0X1BST0dSQU1TKQotCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KLQluPWBlY2hvIGFzIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCWlmIFsgIiQoYmluZGlyKS8kJG4kKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKSIgXTsgdGhlbiBcCi0JICBybSAtZiAkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKTsgXAotCSAgbG4gJChiaW5kaXIpLyQkbiQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKLQkgICAgfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgYXMtbmV3JChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCi0JZWxzZSBcCi0JICB0cnVlIDsgXAotCWZpCi0KLSMgVGhlc2UgZXhpc3QgZm9yIG1haW50ZW5hbmNlIHB1cnBvc2VzLgotCi0uUEhPTlk6IGJvb3RzdHJhcCBib290c3RyYXAyIGJvb3RzdHJhcDMgc3RhZ2UxIHN0YWdlMiBzdGFnZTMgY29tcGFyaXNvbgotCi1ib290c3RyYXA6IGFzLW5ldwotCSQoTUFLRSkgc3RhZ2UxCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UxIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBzdGFnZTIKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotYm9vdHN0cmFwMjoKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIHN0YWdlMgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi1ib290c3RyYXAzOgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi0jIENvcHkgdGhlIG9iamVjdCBmaWxlcyBmcm9tIGEgcGFydGljdWxhciBzdGFnZSBpbnRvIGEgc3ViZGlyZWN0b3J5Lgotc3RhZ2UxOgotCS1ta2RpciBzdGFnZTEKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTEKLQlpZiBbIC1mIHN0YWdlMS9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTEvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMSA7IGxuIC1zIGFzLW5ldyQoRVhFRVhUKSBhcyQoRVhFRVhUKSkgOyBmaQotCi1zdGFnZTI6Ci0JLW1rZGlyIHN0YWdlMgotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMgotCWlmIFsgLWYgc3RhZ2UyL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMi9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UyIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCi0KLXN0YWdlMzoKLQktbWtkaXIgc3RhZ2UzCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UzCi0JaWYgWyAtZiBzdGFnZTMvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UzL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTMgOyBsbiAtcyBhcy1uZXcgYXMkKEVYRUVYVCkpIDsgZmkKLQotYWdhaW5zdD1zdGFnZTIKLQotIyBUaGlzIHJ1bGUgaXMgZGVyaXZlZCBmcm9tIGNvcnJlc3BvbmRpbmcgY29kZSBpbiB0aGUgTWFrZWZpbGUuaW4gZm9yIGdjYy4KLSMgVGhlICJ0YWlsICsxNmMiIGlzIHRvIGJ5cGFzcyBoZWFkZXJzIHdoaWNoIG1heSBpbmNsdWRlIHRpbWVzdGFtcHMgb3IKLSMgdGVtcG9yYXJ5IGFzc2VtYmx5IGZpbGUgbmFtZXMuCi1jb21wYXJpc29uOgotCXg9MCA7IFwKLQlmb3IgZmlsZSBpbiAqLm8gOyBkbyBcCi0JICB0YWlsICsxNmMgLi8kJGZpbGUgPiB0bXAtZm9vMTsgXAotCSAgaWYgdGFpbCArMTZjICR7YWdhaW5zdH0vJCRmaWxlID4gdG1wLWZvbzIgMj4vZGV2L251bGwgOyB0aGVuIFwKLQkgICAgaWYgY21wIHRtcC1mb28xIHRtcC1mb28yIDsgdGhlbiBcCi0JICAgICAgdHJ1ZSA7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgZWNobyAkJGZpbGUgZGlmZmVycyA7IFwKLQkgICAgICB4PTEgOyBcCi0JICAgIGZpIDsgXAotCSAgZWxzZSB0cnVlOyBmaSA7IFwKLQlkb25lIDsgXAotCWV4aXQgJCR4Ci0JLXJtIC1mIHRtcC1mb28qCi0KLS5QSE9OWTogZGUtc3RhZ2UxIGRlLXN0YWdlMiBkZS1zdGFnZTMKLQotZGUtc3RhZ2UxOgotCS0gKGNkIHN0YWdlMSA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMQotCi1kZS1zdGFnZTI6Ci0JLSAoY2Qgc3RhZ2UyIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UyCi0KLWRlLXN0YWdlMzoKLQktIChjZCBzdGFnZTMgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTMKLQotIyBBdXRvbWF0aWMgZGVwZW5kZW5jeSBjb21wdXRhdGlvbi4gIFRoaXMgaXMgYSByZWFsIHBhaW4sIGJlY2F1c2UgdGhlCi0jIGRlcGVuZGVuY2llcyBjaGFuZ2UgYmFzZWQgb24gdGFyZ2V0X2NwdV90eXBlIGFuZCBvYmpfZm9ybWF0LiAgV2UKLSMgY3VycmVudGx5IGlnbm9yZSBhbnkgZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBlbXVsYXRpb24gZmlsZXMuCi0KLURFUF9GSUxFX0RFUFMgPSAgJChDRklMRVMpICQoSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCi0JJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0NGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQotREVQOiBkZXAuc2VkICQoREVQX0ZJTEVfREVQUykgREVQVEMgREVQT0JKIERFUDIKLQlybSAtZiBERVAxCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIHNyY2Rpcj0kJHtzcmNkaXJ9IFZQQVRIPSQke3NyY2Rpcn0gREVQMQotCXJtIC1yZiBERVBESVIKLQlzZWQgLWYgZGVwLnNlZCA8IERFUDEgPiBERVBBCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVBUQyA+PiBERVBBCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVBPQkogPj4gREVQQQotCXNlZCAtZiBkZXAuc2VkIDwgREVQMiA+PiBERVBBCi0JZWNobyAnJCQoT0JKUyk6ICQkKERFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gREVQQQotCWVjaG8gJyQkKFRBUkdfQ1BVX08pOiAkJChERVBUQ19AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gREVQQQotCWVjaG8gJyQkKE9CSl9GT1JNQVRfTyk6ICQkKERFUE9CSl9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gREVQQQotCWVjaG8gJyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWScgPj4gREVQQQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVBBIERFUAotCi0jIFRoaXMgcnVsZSBuZWVkcyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi1ERVAxOiAkKENGSUxFUykgJChNVUxUSV9DRklMRVMpCi0JaWYgWyAtZCBERVBESVIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIERFUERJUjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIERFUERJUjsgXAotCWVjaG8gJycgPiB0YXJnLWNwdS5oOyBcCi0JZWNobyAnJyA+IG9iai1mb3JtYXQuaDsgXAotCWVjaG8gJycgPiB0YXJnLWVudi5oOyBcCi0JZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQllY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVA7IFwKLQkkKE1LREVQKSAtZiBERVAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgJD8KLQlzZWQgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIDwgREVQRElSL0RFUCA+IERFUDEKLQlybSAtZiBERVBESVIvREVQCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgdGMtKi5jIGZpbGVzLgotREVQVEM6ICQoVEFSR0VUX0NQVV9DRklMRVMpCi0Jcm0gLWYgREVQVENBCi0JaWYgWyAtZCBERVBESVIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIERFUERJUjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIERFUERJUjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gb2JqLWZvcm1hdC5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRlLWdlbmVyaWMuaCInID4gdGFyZy1lbnYuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtcGFyc2UuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvcGNvZGVzLyciJCR7Y30iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL3RjLSQke2N9LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQOyBcCi0JICAgICAgJChNS0RFUCkgLWYgREVQIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9ERVBUQ18kJHtjfV8kJHtvfSA9LyIgXAotCQkgIC1lICcxLC9ETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSL2QnIFwKLQkJICAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgXAotCQkgIC1lICcvXiQkL2QnIDwgREVQID4+IC4uL0RFUFRDQTsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBUQ19ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXCcgPj4gREVQVENBCi0JZWNobyAnICAkJChJTkNESVIpL29ic3RhY2suaCAkJChCRkRESVIpL2xpYmhwcGEuaCBcJyA+PiBERVBUQ0EKLQllY2hvICcgICQkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaCAkJChCRkRESVIpL3NvbS5oJyA+PiBERVBUQ0EKLQkjIFdlIGRvbid0IHRyeSB0byBoYW5kbGUgYWxsIG11bHRpIGNhc2VzLgotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgJChDUFVfTVVMVElfVkFMSUQpIFwKLQkgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgIG89ZWNvZmY7IFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGVjaG8gJ0RFUFRDXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IERFUFRDQTsgXAotCSAgICBlY2hvICckJChERVBUQ18nIiQke2N9IidfY29mZikgXCcgPj4gREVQVENBOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoREVQVENfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVBUQ0E7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgICBlY2hvICckJChERVBUQ18nIiQke2N9IidfZWxmKScgPj4gREVQVENBOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIERFUFRDQSBERVBUQwotCi0jIFdvcmsgb3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyBmb3IgdGhlIG9iai0qLmMgZmlsZXMuCi1ERVBPQko6ICQoT0JKX0ZPUk1BVF9DRklMRVMpCi0Jcm0gLWYgREVQT0JKQQotCWlmIFsgLWQgREVQRElSIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciBERVBESVI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCBERVBESVI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IG9iai1mb3JtYXQuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0ZS1nZW5lcmljLmgiJyA+IHRhcmctZW52Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1jcHUuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvb2JqLSQke299LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQOyBcCi0JICAgICAgJChNS0RFUCkgLWYgREVQIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9ERVBPQkpfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IERFUCA+PiAuLi9ERVBPQkpBOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUE9CSl9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXCcgPj4gREVQT0JKQQotCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gREVQT0JKQQotCWVjaG8gJyAgJCQoQkZERElSKS9zb20uaCAgJCQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXCcgPj4gREVQT0JKQQotCWVjaG8gJyAgJCQoSU5DRElSKS9hb3V0L3N0YWIuZGVmJyA+PiBERVBPQkpBCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBPQkpfJyIkJHtjfSInX211bHRpID0gXCcgPj4gREVQT0JKQTsgXAotCSAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2NvZmYpIFwnID4+IERFUE9CSkE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVBPQkpBOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQT0JKXyciJCR7Y30iJ19lbGYpJyA+PiBERVBPQkpBOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIERFUE9CSkEgREVQT0JKCi0KLSMgV29yayBvdXQgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBDUFUvT0JKIGNvbWJpbmF0aW9uLgotIyBOb3RlIHRoYXQgU09NIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlIGl0IG9ubHkgd29ya3MgbmF0aXZlLgotREVQMjogJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQlybSAtZiBERVAyYQotCWlmIFsgLWQgREVQRElSIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciBERVBESVI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCBERVBESVI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSAgICAgICQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQMmE7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBfaHBwYV9zb20gPSAkJChCRkRESVIpL3NvbS5oJyA+PiBERVAyYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IERFUDJhOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfY29mZikgXCcgPj4gREVQMmE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gREVQMmE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgREVQMmEgREVQMgotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAotCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCi0JCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAotCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hcHAubzogYXBwLmMKLWFzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCi0gIHNiLmggbWFjcm8uaAotYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCi1iaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCi1jb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAotZGVwZW5kLm86IGRlcGVuZC5jCi1kd2FyZjJkYmcubzogZHdhcmYyZGJnLmMgZHdhcmYyZGJnLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5vOiBlY29mZi5jIGVjb2ZmLmgKLWVob3B0Lm86IGVob3B0LmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZXhwci5vOiBleHByLmMgJChJTkNESVIpL29ic3RhY2suaAotZmxvbnVtLWNvcHkubzogZmxvbnVtLWNvcHkuYwotZmxvbnVtLWtvbnN0Lm86IGZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5vOiBmbG9udW0tbXVsdC5jCi1mcmFncy5vOiBmcmFncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1oYXNoLm86IGhhc2guYyAkKElOQ0RJUikvb2JzdGFjay5oCi1pbnB1dC1maWxlLm86IGlucHV0LWZpbGUuYyBpbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLm86IGlucHV0LXNjcnViLmMgaW5wdXQtZmlsZS5oIHNiLmgKLWxpc3RpbmcubzogbGlzdGluZy5jIGlucHV0LWZpbGUuaCBzdWJzZWdzLmgKLWxpdGVyYWwubzogbGl0ZXJhbC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1tYWNyby5vOiBtYWNyby5jIHNiLmggbWFjcm8uaAotbWVzc2FnZXMubzogbWVzc2FnZXMuYwotb3V0cHV0LWZpbGUubzogb3V0cHV0LWZpbGUuYyBvdXRwdXQtZmlsZS5oCi1yZWFkLm86IHJlYWQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBzYi5oIG1hY3JvLmggXAotICBlY29mZi5oCi1zYi5vOiBzYi5jIHNiLmgKLXN0YWJzLm86IHN0YWJzLmMgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggZWNvZmYuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN1YnNlZ3Mubzogc3Vic2Vncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1zeW1ib2xzLm86IHN5bWJvbHMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBcCi0gIHN0cnVjLXN5bWJvbC5oCi13cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKLWdhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAotaXRibC1vcHMubzogaXRibC1vcHMuYyBpdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYyBlbXVsLmggXAotICBlbXVsLXRhcmdldC5oCi1lLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYyBlbXVsLmggZW11bC10YXJnZXQuaAotZS1taXBzZWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtbWlwc2VsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi0KLURFUFRDX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotREVQVENfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLURFUFRDX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLURFUFRDX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotREVQVENfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotREVQVENfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL29wY29kZS9hbHBoYS5oICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1ERVBUQ19hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1ERVBUQ19hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ19hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUFRDX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBUQ19hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ19kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1ERVBUQ19kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLURFUFRDX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotREVQVENfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9zeW1jYXQuaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLWRlc2MuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtb3BjLmggXAotICBjZ2VuLmgKLURFUFRDX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaAotREVQVENfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi1ERVBUQ19oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9oODUwMC1vcGMuaAotREVQVENfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKLURFUFRDX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotREVQVENfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKLSAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmJmZC5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1ERVBUQ19pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotREVQVENfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLURFUFRDX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotREVQVENfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1ERVBUQ19pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1ERVBUQ19pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1ERVBUQ19pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi1ERVBUQ19pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi1ERVBUQ19pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotREVQVENfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi1ERVBUQ19tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotREVQVENfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLURFUFRDX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLURFUFRDX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLURFUFRDX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotREVQVENfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotREVQVENfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvbWNvcmUtb3BjLmgKLURFUFRDX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLURFUFRDX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggXAotICBpdGJsLW9wcy5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQVENfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmgKLURFUFRDX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBpdGJsLW9wcy5oIFwKLSAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQVENfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotREVQVENfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1ERVBUQ19tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1ERVBUQ19tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLURFUFRDX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUFRDX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggJChJTkNESVIpL29ic3RhY2suaAotREVQVENfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUFRDX3BqX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3BqLmgKLURFUFRDX3BqX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCAkKElOQ0RJUikvb3Bjb2RlL3BqLmgKLURFUFRDX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLURFUFRDX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaCAkKElOQ0RJUikvZWxmL3BwYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmgKLURFUFRDX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCi1ERVBUQ19zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotREVQVENfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi1ERVBUQ19zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2VsZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotREVQVENfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS90YWhvZS5oCi1ERVBUQ190YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotREVQVENfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi1ERVBUQ190aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLURFUFRDX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLURFUFRDX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotREVQVENfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotREVQVENfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLURFUFRDX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLURFUFRDX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotREVQVENfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotREVQVENfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi1ERVBUQ193NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3c2NS1vcGMuaAotREVQVENfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaAotREVQVENfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi1ERVBUQ196OGtfY29mZiA9ICQoc3JjZGlyKS8uLi9vcGNvZGVzL3o4ay1vcGMuaCAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUFRDX3o4a19lbGYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggXAotICAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaAotREVQVENfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmggXAotICAkKEJGRERJUikvc29tLmgKLURFUFRDX2kzODZfbXVsdGkgPSAkKERFUFRDX2kzODZfY29mZikgJChERVBUQ19pMzg2X2VsZikKLURFUFRDX21pcHNfbXVsdGkgPSAkKERFUFRDX21pcHNfY29mZikgJChERVBUQ19taXBzX2Vjb2ZmKSBcCi0gICQoREVQVENfbWlwc19lbGYpCi1ERVBPQkpfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLURFUE9CSl9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLURFUE9CSl9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoQkZERElSKS9saWJlY29mZi5oCi1ERVBPQkpfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfcGpfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfcGpfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfc3BhcmNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3RhaG9lX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3Y4NTBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3o4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2hwcGFfc29tID0gJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoQkZERElSKS9zb20uaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLURFUE9CSl9pMzg2X211bHRpID0gJChERVBPQkpfaTM4Nl9jb2ZmKSAkKERFUE9CSl9pMzg2X2VsZikKLURFUE9CSl9taXBzX211bHRpID0gJChERVBPQkpfbWlwc19jb2ZmKSAkKERFUE9CSl9taXBzX2Vjb2ZmKSBcCi0gICQoREVQT0JKX21pcHNfZWxmKQotREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaAotREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi1ERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1ERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLURFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaAotREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oCi1ERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oCi1ERVBfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oCi1ERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oCi1ERVBfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmgKLURFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaAotREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKLSAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oCi1ERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oCi1ERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCi1ERVBfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCi1ERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oCi1ERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tNjhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oCi1ERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oCi1ERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmgKLURFUF9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi1ERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaAotREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaAotREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaAotREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaAotREVQX3BqX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9wal9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmgKLURFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oCi1ERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmgKLURFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oCi1ERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oCi1ERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaAotREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oCi1ERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oCi1ERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1ERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaAotREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaAotREVQX3o4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLURFUF9ocHBhX3NvbSA9ICQoQkZERElSKS9zb20uaAotREVQX2kzODZfbXVsdGkgPSAkKERFUF9pMzg2X2NvZmYpICQoREVQX2kzODZfZWxmKQotREVQX21pcHNfbXVsdGkgPSAkKERFUF9taXBzX2NvZmYpICQoREVQX21pcHNfZWNvZmYpIFwKLSAgJChERVBfbWlwc19lbGYpCi0kKE9CSlMpOiAkKERFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0kKFRBUkdfQ1BVX08pOiAkKERFUFRDX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoT0JKX0ZPUk1BVF9PKTogJChERVBPQkpfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9nYXMvTWFrZWZpbGUuaW4gYi9nYXMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTUzNzYuLjAwMDAwMDAKLS0tIGEvZ2FzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjUzMiArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BTExfT0JKX0RFUFMgPSBAQUxMX09CSl9ERVBTQAotQVMgPSBAQVNACi1CRkRMSUIgPSBAQkZETElCQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HREJJTklUID0gQEdEQklOSVRACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTk0gPSBATk1ACi1PUENPREVTX0xJQiA9IEBPUENPREVTX0xJQkAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWF0b2YgPSBAYXRvZkAKLWNnZW5fY3B1X3ByZWZpeCA9IEBjZ2VuX2NwdV9wcmVmaXhACi1leHRyYV9vYmplY3RzID0gQGV4dHJhX29iamVjdHNACi1pbnN0YWxsX3Rvb2xkaXIgPSBAaW5zdGFsbF90b29sZGlyQAotbCA9IEBsQAotb2JqX2Zvcm1hdCA9IEBvYmpfZm9ybWF0QAotdGFyZ2V0X2NwdV90eXBlID0gQHRhcmdldF9jcHVfdHlwZUAKLXRlX2ZpbGUgPSBAdGVfZmlsZUAKLQotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gZG9jIHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwuLi9iaXNvbi9iaXNvbiA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgIGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLU1LREVQID0gJCR7c3JjZGlyfS8uLi9ta2RlcAotCi1UQVJHX0NQVSA9IEB0YXJnZXRfY3B1X3R5cGVACi1UQVJHX0NQVV9DID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5jCi1UQVJHX0NQVV9PID0gdGMtQHRhcmdldF9jcHVfdHlwZUAubwotVEFSR19DUFVfSCA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuaAotT0JKX0ZPUk1BVF9DID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmMKLU9CSl9GT1JNQVRfTyA9IG9iai1Ab2JqX2Zvcm1hdEAubwotT0JKX0ZPUk1BVF9IID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmgKLVRBUkdfRU5WX0ggPSAkKHNyY2RpcikvY29uZmlnL3RlLUB0ZV9maWxlQC5oCi1BVE9GX1RBUkdfQyA9ICQoc3JjZGlyKS9jb25maWcvYXRvZi1AYXRvZkAuYwotQVRPRl9UQVJHX08gPSBhdG9mLUBhdG9mQC5vCi0KLSMgdXNlIEB0YXJnZXRfY3B1X3R5cGVAIGZvciByZWZlcmluZyB0byBjb25maWd1cmVkIHRhcmdldCBuYW1lCi1JVF9IRFJTID0gaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAotSVRfU1JDUyA9IGl0YmwtcGFyc2UuYyBpdGJsLWxleC5jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi1JVF9ERVBTID0gJChzcmNkaXIpL2l0YmwtcGFyc2UueSAkKHNyY2RpcikvaXRibC1sZXgubCAkKHNyY2RpcikvY29uZmlnL2l0YmwtQHRhcmdldF9jcHVfdHlwZUAuaAotSVRfT0JKUyA9IGl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KLQotIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQotQ1BVX1RZUEVTID0gXAotCWEyOWsgXAotCWFscGhhIFwKLQlhcmMgXAotCWFybSBcCi0JZDEwdiBcCi0JZDMwdiBcCi0JZnIzMCBcCi0JaDgzMDAgXAotCWg4NTAwIFwKLQlocHBhIFwKLQlpMzg2IFwKLQlpODYwIFwKLQlpOTYwIFwKLQltMzJyIFwKLQltNjhrIFwKLQltODhrIFwKLQltY29yZSBcCi0JbWlwcyBcCi0JbW4xMDIwMCBcCi0JbW4xMDMwMCBcCi0JbnMzMmsgXAotCXBqIFwKLQlwcGMgXAotCXNoIFwKLQlzcGFyYyBcCi0JdGFob2UgXAotCXRpYzMwIFwKLQl0aWM4MCBcCi0JdmF4IFwKLQl3NjUgXAotCXY4NTAgXAotCXo4awotCi0KLSMgT2JqZWN0IGZvcm1hdCB0eXBlcy4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgotIyBXZSBkZWxpYmVyYXRlbHkgb21pdCBzb20sIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgYXMgYSBjcm9zcyBhc3NlbWJsZXIuCi0KLU9CSl9GT1JNQVRTID0gXAotCWFvdXQgXAotCWJvdXQgXAotCWNvZmYgXAotCWVjb2ZmIFwKLQllbGYgXAotCWV2YXggXAotCWhwMzAwIFwKLQlpZWVlIFwKLQl2bXMKLQotCi0jIFRoaXMgaXMgYW4gc2ggY2FzZSB3aGljaCBzZXRzIHZhbGlkIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBDUFUKLSMgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgYyBhbmQgdGhlIE9TIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIG8KLSMgYXJlIHN1cHBvcnRlZC4gIFRoaXMgaGVscHMgY3V0cyBkb3duIG9uIHRoZSBhbW91bnQgb2YgZGVwZW5kZW5jeQotIyBpbmZvcm1hdGlvbi4KLQotQ1BVX09CSl9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJG8gaW4gXAotCWFvdXQpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGEyOWsgfCBhcm0gfCBpMzg2IHwgaTg2MCB8IG02OGsgfCBtaXBzIHwgbnMzMmsgfCBzcGFyYyB8IHRhaG9lIHwgdGljMzAgfCB2YXgpIFwKLQkgICAgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWJvdXQpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGk5NjApIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQljb2ZmKSB2YWxpZD15ZXMgOzsgXAotCWVjb2ZmKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBtaXBzIHwgYWxwaGEpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQllbGYpIHZhbGlkPXllcyA7OyBcCi0JZXZheCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgYWxwaGEpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQlocDMwMCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgbTY4aykgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCXZtcykgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgdmF4KSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JZXNhYzsKLQotCi0jIFRoaXMgaXMgbGlrZSBDUFVfT0JKX1ZBTElELCBmb3IgdGhlIG9iaj1tdWx0aSBjYXNlLgotCi1DUFVfTVVMVElfVkFMSUQgPSBcCi0JdmFsaWQ9IDsgXAotCWNhc2UgJCRjIGluIFwKLQlpMzg2IHwgbWlwcykgdmFsaWQ9eWVzIDs7IFwKLQllc2FjOwotCi0KLSMgUmVndWxhciBzb3VyY2UgZmlsZXMuCi0KLUdBU19DRklMRVMgPSBcCi0JYXBwLmMgXAotCWFzLmMgXAotCWF0b2YtZ2VuZXJpYy5jIFwKLQliaWdudW0tY29weS5jIFwKLQljb25kLmMgXAotCWRlcGVuZC5jIFwKLQlkd2FyZjJkYmcuYyBcCi0JZWNvZmYuYyBcCi0JZWhvcHQuYyBcCi0JZXhwci5jIFwKLQlmbG9udW0tY29weS5jIFwKLQlmbG9udW0ta29uc3QuYyBcCi0JZmxvbnVtLW11bHQuYyBcCi0JZnJhZ3MuYyBcCi0JaGFzaC5jIFwKLQlpbnB1dC1maWxlLmMgXAotCWlucHV0LXNjcnViLmMgXAotCWxpc3RpbmcuYyBcCi0JbGl0ZXJhbC5jIFwKLQltYWNyby5jIFwKLQltZXNzYWdlcy5jIFwKLQlvdXRwdXQtZmlsZS5jIFwKLQlyZWFkLmMgXAotCXNiLmMgXAotCXN0YWJzLmMgXAotCXN1YnNlZ3MuYyBcCi0Jc3ltYm9scy5jIFwKLQl3cml0ZS5jCi0KLQotQ0ZJTEVTID0gJChHQVNfQ0ZJTEVTKSBnYXNwLmMgaXRibC1vcHMuYwotCi1IRklMRVMgPSBcCi0JYXMuaCBcCi0JYXNpbnRsLmggXAotCWJpZ251bS5oIFwKLQliaXRfZml4LmggXAotCWNnZW4uaCBcCi0JZHdhcmYyZGJnLmggXAotCWVjb2ZmLmggXAotCWVtdWwtdGFyZ2V0LmggXAotCWVtdWwuaCBcCi0JZXhwci5oIFwKLQlmbG9udW0uaCBcCi0JZnJhZ3MuaCBcCi0JaGFzaC5oIFwKLQlpbnB1dC1maWxlLmggXAotCWl0Ymwtb3BzLmggXAotCWxpc3RpbmcuaCBcCi0JbWFjcm8uaCBcCi0Jb2JqLmggXAotCW91dHB1dC1maWxlLmggXAotCXJlYWQuaCBcCi0Jc2IuaCBcCi0Jc3RydWMtc3ltYm9sLmggXAotCXN1YnNlZ3MuaCBcCi0Jc3ltYm9scy5oIFwKLQl0Yy5oIFwKLQl3cml0ZS5oCi0KLQotIyBDUFUgZmlsZXMgaW4gY29uZmlnLgotCi1UQVJHRVRfQ1BVX0NGSUxFUyA9IFwKLQljb25maWcvdGMtYTI5ay5jIFwKLQljb25maWcvdGMtYWxwaGEuYyBcCi0JY29uZmlnL3RjLWFyYy5jIFwKLQljb25maWcvdGMtYXJtLmMgXAotCWNvbmZpZy90Yy1kMTB2LmMgXAotCWNvbmZpZy90Yy1kMzB2LmMgXAotCWNvbmZpZy90Yy1mcjMwLmMgXAotCWNvbmZpZy90Yy1oODMwMC5jIFwKLQljb25maWcvdGMtaDg1MDAuYyBcCi0JY29uZmlnL3RjLWhwcGEuYyBcCi0JY29uZmlnL3RjLWkzODYuYyBcCi0JY29uZmlnL3RjLWk4NjAuYyBcCi0JY29uZmlnL3RjLWk5NjAuYyBcCi0JY29uZmlnL3RjLW0zMnIuYyBcCi0JY29uZmlnL3RjLW02OGsuYyBcCi0JY29uZmlnL3RjLW04OGsuYyBcCi0JY29uZmlnL3RjLW1jb3JlLmMgXAotCWNvbmZpZy90Yy1taXBzLmMgXAotCWNvbmZpZy90Yy1tbjEwMjAwLmMgXAotCWNvbmZpZy90Yy1tbjEwMzAwLmMgXAotCWNvbmZpZy90Yy1uczMyay5jIFwKLQljb25maWcvdGMtcGouYyBcCi0JY29uZmlnL3RjLXBwYy5jIFwKLQljb25maWcvdGMtc2guYyBcCi0JY29uZmlnL3RjLXNwYXJjLmMgXAotCWNvbmZpZy90Yy10YWhvZS5jIFwKLQljb25maWcvdGMtdGljMzAuYyBcCi0JY29uZmlnL3RjLXRpYzgwLmMgXAotCWNvbmZpZy90Yy12YXguYyBcCi0JY29uZmlnL3RjLXc2NS5jIFwKLQljb25maWcvdGMtdjg1MC5jIFwKLQljb25maWcvdGMtejhrLmMKLQotCi1UQVJHRVRfQ1BVX0hGSUxFUyA9IFwKLQljb25maWcvdGMtYTI5ay5oIFwKLQljb25maWcvdGMtYWxwaGEuaCBcCi0JY29uZmlnL3RjLWFyYy5oIFwKLQljb25maWcvdGMtYXJtLmggXAotCWNvbmZpZy90Yy1kMTB2LmggXAotCWNvbmZpZy90Yy1kMzB2LmggXAotCWNvbmZpZy90Yy1mcjMwLmggXAotCWNvbmZpZy90Yy1oODMwMC5oIFwKLQljb25maWcvdGMtaDg1MDAuaCBcCi0JY29uZmlnL3RjLWhwcGEuaCBcCi0JY29uZmlnL3RjLWkzODYuaCBcCi0JY29uZmlnL3RjLWk4NjAuaCBcCi0JY29uZmlnL3RjLWk5NjAuaCBcCi0JY29uZmlnL3RjLW0zMnIuaCBcCi0JY29uZmlnL3RjLW02OGsuaCBcCi0JY29uZmlnL3RjLW04OGsuaCBcCi0JY29uZmlnL3RjLW1jb3JlLmggXAotCWNvbmZpZy90Yy1taXBzLmggXAotCWNvbmZpZy90Yy1tbjEwMjAwLmggXAotCWNvbmZpZy90Yy1tbjEwMzAwLmggXAotCWNvbmZpZy90Yy1uczMyay5oIFwKLQljb25maWcvdGMtcGouaCBcCi0JY29uZmlnL3RjLXBwYy5oIFwKLQljb25maWcvdGMtc2guaCBcCi0JY29uZmlnL3RjLXNwYXJjLmggXAotCWNvbmZpZy90Yy10YWhvZS5oIFwKLQljb25maWcvdGMtdGljMzAuaCBcCi0JY29uZmlnL3RjLXRpYzgwLmggXAotCWNvbmZpZy90Yy12YXguaCBcCi0JY29uZmlnL3RjLXc2NS5oIFwKLQljb25maWcvdGMtdjg1MC5oIFwKLQljb25maWcvdGMtejhrLmgKLQotCi0jIE9CSiBmaWxlcyBpbiBjb25maWcKLQotT0JKX0ZPUk1BVF9DRklMRVMgPSBcCi0JY29uZmlnL29iai1hb3V0LmMgXAotCWNvbmZpZy9vYmotYm91dC5jIFwKLQljb25maWcvb2JqLWNvZmYuYyBcCi0JY29uZmlnL29iai1lY29mZi5jIFwKLQljb25maWcvb2JqLWVsZi5jIFwKLQljb25maWcvb2JqLWV2YXguYyBcCi0JY29uZmlnL29iai1ocDMwMC5jIFwKLQljb25maWcvb2JqLWllZWUuYyBcCi0JY29uZmlnL29iai1zb20uYyBcCi0JY29uZmlnL29iai12bXMuYwotCi0KLU9CSl9GT1JNQVRfSEZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5oIFwKLQljb25maWcvb2JqLWJvdXQuaCBcCi0JY29uZmlnL29iai1jb2ZmLmggXAotCWNvbmZpZy9vYmotZWNvZmYuaCBcCi0JY29uZmlnL29iai1lbGYuaCBcCi0JY29uZmlnL29iai1ldmF4LmggXAotCWNvbmZpZy9vYmotaHAzMDAuaCBcCi0JY29uZmlnL29iai1pZWVlLmggXAotCWNvbmZpZy9vYmotc29tLmggXAotCWNvbmZpZy9vYmotdm1zLmgKLQotCi0jIEVtdWxhdGlvbiBoZWFkZXIgZmlsZXMgaW4gY29uZmlnCi0KLVRBUkdfRU5WX0hGSUxFUyA9IFwKLQljb25maWcvdGUtMzg2YnNkLmggXAotCWNvbmZpZy90ZS1hdXguaCBcCi0JY29uZmlnL3RlLWRlbHRhLmggXAotCWNvbmZpZy90ZS1kZWx0ODguaCBcCi0JY29uZmlnL3RlLWRweDIuaCBcCi0JY29uZmlnL3RlLWR5bml4LmggXAotCWNvbmZpZy90ZS1lcG9jLXBlLmggXAotCWNvbmZpZy90ZS1nZW5lcmljLmggXAotCWNvbmZpZy90ZS1nbzMyLmggXAotCWNvbmZpZy90ZS1ocDMwMC5oIFwKLQljb25maWcvdGUtaHBwYS5oIFwKLQljb25maWcvdGUtaTM4NmFpeC5oIFwKLQljb25maWcvdGUtaWM5NjAuaCBcCi0JY29uZmlnL3RlLWxpbnV4LmggXAotCWNvbmZpZy90ZS1sbmV3cy5oIFwKLQljb25maWcvdGUtbHlueC5oIFwKLQljb25maWcvdGUtbWFjaC5oIFwKLQljb25maWcvdGUtbWFjb3MuaCBcCi0JY29uZmlnL3RlLW11bHRpLmggXAotCWNvbmZpZy90ZS1uYnNkLmggXAotCWNvbmZpZy90ZS1uYnNkNTMyLmggXAotCWNvbmZpZy90ZS1wYzUzMm1hY2guaCBcCi0JY29uZmlnL3RlLXBlLmggXAotCWNvbmZpZy90ZS1wcGNudy5oIFwKLQljb25maWcvdGUtcHNvcy5oIFwKLQljb25maWcvdGUtcmlzY2l4LmggXAotCWNvbmZpZy90ZS1zcGFyY2FvdXQuaCBcCi0JY29uZmlnL3RlLXN1bjMuaCBcCi0JY29uZmlnL3RlLXN2cjQuaCBcCi0JY29uZmlnL3RlLXN5c3YzMi5oCi0KLQotIyBNdWx0aSBmaWxlcyBpbiBjb25maWcKLQotTVVMVElfQ0ZJTEVTID0gXAotCWNvbmZpZy9lLWkzODZjb2ZmLmMgXAotCWNvbmZpZy9lLWkzODZlbGYuYyBcCi0JY29uZmlnL2UtbWlwc2Vjb2ZmLmMgXAotCWNvbmZpZy9lLW1pcHNlbGYuYwotCi0KLUNPTkZJR19PQkpTID0gXAotCSQoVEFSR19DUFVfTykgXAotCSQoT0JKX0ZPUk1BVF9PKSBcCi0JJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykKLQotCi1HRU5FUklDX09CSlMgPSBcCi0JYXBwLm8gXAotCWFzLm8gXAotCWF0b2YtZ2VuZXJpYy5vIFwKLQliaWdudW0tY29weS5vIFwKLQljb25kLm8gXAotCWRlcGVuZC5vIFwKLQlkd2FyZjJkYmcubyBcCi0JZWhvcHQubyBcCi0JZXhwci5vIFwKLQlmbG9udW0ta29uc3QubyBcCi0JZmxvbnVtLWNvcHkubyBcCi0JZmxvbnVtLW11bHQubyBcCi0JZnJhZ3MubyBcCi0JaGFzaC5vIFwKLQlpbnB1dC1maWxlLm8gXAotCWlucHV0LXNjcnViLm8gXAotCWxpdGVyYWwubyBcCi0JbWVzc2FnZXMubyBcCi0Jb3V0cHV0LWZpbGUubyBcCi0JcmVhZC5vIFwKLQlzdWJzZWdzLm8gXAotCXN5bWJvbHMubyBcCi0Jd3JpdGUubyBcCi0JbGlzdGluZy5vIFwKLQllY29mZi5vIFwKLQlzdGFicy5vIFwKLQlzYi5vIFwKLQltYWNyby5vCi0KLQotT0JKUyA9ICQoQ09ORklHX09CSlMpICQoR0VORVJJQ19PQkpTKQotCi1QT1RGSUxFUyA9ICQoTVVMVElfQ0ZJTEVTKSAkKFRBUkdFVF9FTlZfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKSBcCi0JJChPQkpfRk9STUFUX0NGSUxFUykgJChUQVJHRVRfQ1BVX0hGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAotCSQoSEZJTEVTKSAkKENGSUxFUykgJChHQVNfQ0ZJTEVTKQotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGFzLW5ldyBnYXNwLW5ldwotbm9pbnN0X1NDUklQVFMgPSAkKEdEQklOSVQpCi1FWFRSQV9TQ1JJUFRTID0gLmdkYmluaXQKLQotRVhUUkFfRElTVCA9IG1ha2UtZ2FzLmNvbQotCi1ESVNUU1RVRkYgPSBtYWtlLWdhcy5jb20gbTY4ay1wYXJzZS5jIGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggaXRibC1sZXguYwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIHRhcmctZW52LmggaXRibC1jcHUuaCBjZ2VuLWRlc2MuaAotCi0jIE5vdyBmaWd1cmUgb3V0IGZyb20gdGhvc2UgdmFyaWFibGVzIGhvdyB0byBjb21waWxlIGFuZCBsaW5rLgotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLSMgVGhpcyBpcyB0aGUgdmFyaWFibGUgYWN0dWFsbHkgdXNlZCB3aGVuIHdlIGNvbXBpbGUuCi0jIFNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkIGZvciBoZWFkZXIgZmlsZXMuCi0jIEJvdGggLiBhbmQgc3JjZGlyIGFyZSB1c2VkLCBpbiB0aGF0IG9yZGVyLAotIyBzbyB0aGF0IHRtLmggYW5kIGNvbmZpZy5oIHdpbGwgYmUgZm91bmQgaW4gdGhlIGNvbXBpbGF0aW9uCi0jIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKHNyY2RpcikvY29uZmlnIC1JJChJTkNESVIpIC1JJChzcmNkaXIpLy4uIC1JJChCRkRESVIpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBUaGlzIHNob3VsZCBiZSBwYXJhbGxlbCB0byBJTkNMVURFUywgYnV0IHNob3VsZCByZXBsYWNlICQoc3JjZGlyKQotIyB3aXRoICQke3NyY2Rpcn0sIGFuZCBzaG91bGQgd29yayBpbiBhIHN1YmRpcmVjdG9yeS4gIFRoaXMgaXMgdXNlZAotIyB3aGVuIGJ1aWxkaW5nIGRlcGVuZGVuY2llcywgYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBidWlsZGluZyBpcyBkb25lCi0jIGluIGEgc3ViZGlyZWN0b3J5LgotREVQX0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAtSSQke3NyY2Rpcn0vY29uZmlnIC1JJCR7c3JjZGlyfS8uLi9pbmNsdWRlIC1JJCR7c3JjZGlyfS8uLiAtSSQke3NyY2Rpcn0vLi4vYmZkIC1JJCR7c3JjZGlyfS8uLi9pbnRsIC1JLi4vLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLSMgSG93IHRvIGxpbmsgd2l0aCBib3RoIG91ciBzcGVjaWFsIGxpYnJhcnkgZmFjaWxpdGllcwotIyBhbmQgdGhlIHN5c3RlbSdzIGluc3RhbGxlZCBsaWJyYXJpZXMuCi0KLUdBU0xJQlMgPSBAT1BDT0RFU19MSUJAIEBCRkRMSUJAIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi0jIEZpbGVzIHRvIGJlIGNvcGllZCBhd2F5IGFmdGVyIGVhY2ggc3RhZ2UgaW4gYnVpbGRpbmcuCi1TVEFHRVNUVUZGID0gKi5vICQobm9pbnN0X1BST0dSQU1TKQotCi1hc19uZXdfU09VUkNFUyA9ICQoR0FTX0NGSUxFUykKLWFzX25ld19MREFERCA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMTElCUykKLQotYXNfbmV3X0RFUEVOREVOQ0lFUyA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMREVQUykKLQotCi1nYXNwX25ld19TT1VSQ0VTID0gZ2FzcC5jIG1hY3JvLmMgc2IuYyBoYXNoLmMKLWdhc3BfbmV3X0xEQUREID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi1nYXNwX25ld19ERVBFTkRFTkNJRVMgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLQotRVhQRUNUID0gYGlmIFsgLWYgJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLQotUlVOVEVTVCA9IGBpZiBbIC1mICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKLQkJZWNobyAkJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IGVsc2UgZWNobyBydW50ZXN0OyBcCi0JICAgZmlgCi0KLVJVTlRFU1RGTEFHUyA9IAotCi0jIFRoZSBtNjhrIG9wZXJhbmQgcGFyc2VyLgotCi1FWFRSQV9hc19uZXdfU09VUkNFUyA9IGNvbmZpZy9tNjhrLXBhcnNlLnkKLQotIyBzdGFuZC1hbG9uZSBpdGJsIGFzc2VtYmxlciAmIGRpc2Fzc2VtYmxlcgotCi1FWFRSQV9QUk9HUkFNUyA9IGl0YmwtdGVzdAotaXRibF90ZXN0X1NPVVJDRVMgPSBpdGJsLXBhcnNlLnkgaXRibC1sZXgubAotaXRibF90ZXN0X0xEQUREID0gaXRibC10b3BzLm8gaXRibC10ZXN0Lm8gJChHQVNMSUJTKSBATEVYTElCQAotCi0jIENHRU4gaW50ZXJmYWNlLgotCi1DR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAotCi0jIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAotCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKLQl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgotCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIERFUFRDIERFUE9CSiBERVAyIERFUDEgREVQQSBERVAgREVQRElSCi0KLWFnYWluc3QgPSBzdGFnZTIKLQotIyBBdXRvbWF0aWMgZGVwZW5kZW5jeSBjb21wdXRhdGlvbi4gIFRoaXMgaXMgYSByZWFsIHBhaW4sIGJlY2F1c2UgdGhlCi0jIGRlcGVuZGVuY2llcyBjaGFuZ2UgYmFzZWQgb24gdGFyZ2V0X2NwdV90eXBlIGFuZCBvYmpfZm9ybWF0LiAgV2UKLSMgY3VycmVudGx5IGlnbm9yZSBhbnkgZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBlbXVsYXRpb24gZmlsZXMuCi0KLURFUF9GSUxFX0RFUFMgPSAkKENGSUxFUykgJChIRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKLQkkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCi0KLURFUFRDX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotCi1ERVBUQ19hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotCi1ERVBUQ19hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi0KLURFUFRDX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1ERVBUQ19hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi0KLURFUFRDX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1ERVBUQ19hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi0KLURFUFRDX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oICQoSU5DRElSKS9lbGYvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLURFUFRDX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQVENfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQVENfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1ERVBUQ19kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggJChJTkNESVIpL2VsZi9wcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotCi1ERVBUQ19kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLQotREVQVENfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLW9wYy5oIFwKLSAgY2dlbi5oCi0KLURFUFRDX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLW9wYy5oIFwKLSAgY2dlbi5oCi0KLURFUFRDX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaAotCi1ERVBUQ19oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLQotREVQVENfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKLQotREVQVENfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKLQotREVQVENfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoQkZERElSKS9saWJiZmQuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi0KLURFUFRDX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJiZmQuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotCi1ERVBUQ19pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotCi1ERVBUQ19pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotCi1ERVBUQ19pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotREVQVENfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi0KLURFUFRDX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pODYwLmgKLQotREVQVENfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotCi1ERVBUQ19pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLURFUFRDX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pOTYwLmgKLQotREVQVENfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pOTYwLmgKLQotREVQVENfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi0KLURFUFRDX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi0KLURFUFRDX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLURFUFRDX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLQotREVQVENfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oIFwKLSAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1ERVBUQ19tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLURFUFRDX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotCi1ERVBUQ19tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpL2NvbmZpZy9tODhrLW9wY29kZS5oCi0KLURFUFRDX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oCi0KLURFUFRDX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9taXBzLmggaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCi1ERVBUQ19taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIFwKLSAgaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQVENfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmgKLQotREVQVENfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0KLURFUFRDX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLQotREVQVENfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi0KLURFUFRDX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLQotREVQVENfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi0KLURFUFRDX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQVENfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUFRDX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUFRDX3BqX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3BqLmgKLQotREVQVENfcGpfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oICQoSU5DRElSKS9vcGNvZGUvcGouaAotCi1ERVBUQ19wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi0KLURFUFRDX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaCAkKElOQ0RJUikvZWxmL3BwYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1ERVBUQ19zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotCi1ERVBUQ19zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotCi1ERVBUQ19zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotCi1ERVBUQ19zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLQotREVQVENfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9lbGYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotCi1ERVBUQ190YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotREVQVENfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotREVQVENfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLURFUFRDX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotCi1ERVBUQ190aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLURFUFRDX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotCi1ERVBUQ190aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi0KLURFUFRDX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLURFUFRDX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotREVQVENfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLURFUFRDX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotREVQVENfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi0KLURFUFRDX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi0KLURFUFRDX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKLQotREVQVENfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi0KLURFUFRDX3o4a19jb2ZmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBUQ196OGtfZWxmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oIFwKLSAgJChCRkRESVIpL2VsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLQotREVQVENfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmggXAotICAkKEJGRERJUikvc29tLmgKLQotREVQVENfaTM4Nl9tdWx0aSA9ICQoREVQVENfaTM4Nl9jb2ZmKSAkKERFUFRDX2kzODZfZWxmKQotREVQVENfbWlwc19tdWx0aSA9ICQoREVQVENfbWlwc19jb2ZmKSAkKERFUFRDX21pcHNfZWNvZmYpIFwKLSAgJChERVBUQ19taXBzX2VsZikKLQotREVQT0JKX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLQotREVQT0JKX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1ERVBPQkpfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLQotREVQT0JKX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9wal9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3BqX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChCRkRESVIpL3NvbS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotCi1ERVBPQkpfaTM4Nl9tdWx0aSA9ICQoREVQT0JKX2kzODZfY29mZikgJChERVBPQkpfaTM4Nl9lbGYpCi1ERVBPQkpfbWlwc19tdWx0aSA9ICQoREVQT0JKX21pcHNfY29mZikgJChERVBPQkpfbWlwc19lY29mZikgXAotICAkKERFUE9CSl9taXBzX2VsZikKLQotREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmgKLQotREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotCi1ERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLURFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oCi0KLURFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmgKLQotREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oCi0KLURFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaAotCi1ERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmgKLQotREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmgKLQotREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmgKLQotREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmgKLQotREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmgKLQotREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCi0KLURFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaAotCi1ERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaAotCi1ERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaAotCi1ERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaAotCi1ERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmgKLQotREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oCi0KLURFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaAotCi1ERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaAotCi1ERVBfcGpfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfcGpfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oCi0KLURFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmgKLQotREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmgKLQotREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oCi0KLURFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oCi0KLURFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaAotCi1ERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaAotCi1ERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaAotCi1ERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi0KLURFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmgKLQotREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oCi0KLURFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLQotREVQX2hwcGFfc29tID0gJChCRkRESVIpL3NvbS5oCi1ERVBfaTM4Nl9tdWx0aSA9ICQoREVQX2kzODZfY29mZikgJChERVBfaTM4Nl9lbGYpCi1ERVBfbWlwc19tdWx0aSA9ICQoREVQX21pcHNfY29mZikgJChERVBfbWlwc19lY29mZikgXAotICAkKERFUF9taXBzX2VsZikKLQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAgJHtHREJJTklUfQotbm9pbnN0X1BST0dSQU1TID0gIGFzLW5ldyQoRVhFRVhUKSBnYXNwLW5ldyQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChub2luc3RfUFJPR1JBTVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLWl0YmxfdGVzdF9PQkpFQ1RTID0gIGl0YmwtcGFyc2UubyBpdGJsLWxleC5vCi1pdGJsX3Rlc3RfREVQRU5ERU5DSUVTID0gIGl0YmwtdG9wcy5vIGl0YmwtdGVzdC5vIFwKLS4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotaXRibF90ZXN0X0xERkxBR1MgPSAKLWFzX25ld19PQkpFQ1RTID0gIGFwcC5vIGFzLm8gYXRvZi1nZW5lcmljLm8gYmlnbnVtLWNvcHkubyBjb25kLm8gXAotZGVwZW5kLm8gZHdhcmYyZGJnLm8gZWNvZmYubyBlaG9wdC5vIGV4cHIubyBmbG9udW0tY29weS5vIFwKLWZsb251bS1rb25zdC5vIGZsb251bS1tdWx0Lm8gZnJhZ3MubyBoYXNoLm8gaW5wdXQtZmlsZS5vIGlucHV0LXNjcnViLm8gXAotbGlzdGluZy5vIGxpdGVyYWwubyBtYWNyby5vIG1lc3NhZ2VzLm8gb3V0cHV0LWZpbGUubyByZWFkLm8gc2IubyBcCi1zdGFicy5vIHN1YnNlZ3MubyBzeW1ib2xzLm8gd3JpdGUubwotYXNfbmV3X0xERkxBR1MgPSAKLWdhc3BfbmV3X09CSkVDVFMgPSAgZ2FzcC5vIG1hY3JvLm8gc2IubyBoYXNoLm8KLWdhc3BfbmV3X0xERkxBR1MgPSAKLVNDUklQVFMgPSAgJChub2luc3RfU0NSSVBUUykKLQotTEVYX09VVFBVVF9ST09UID0gQExFWF9PVVRQVVRfUk9PVEAKLUxFWExJQiA9IEBMRVhMSUJACi1ZTFdSQVAgPSAkKHRvcF9zcmNkaXIpLy4uL3lsd3JhcAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENPUFlJTkcgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIFwKLU1ha2VmaWxlLmluIE5FV1MgYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZy9tNjhrLXBhcnNlLmMgXAotY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBnZGJpbml0LmluIGl0YmwtbGV4LmMgaXRibC1wYXJzZS5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGl0YmxfdGVzdF9TT1VSQ0VTKSAkKGFzX25ld19TT1VSQ0VTKSAkKEVYVFJBX2FzX25ld19TT1VSQ0VTKSAkKGdhc3BfbmV3X1NPVVJDRVMpCi1PQkpFQ1RTID0gJChpdGJsX3Rlc3RfT0JKRUNUUykgJChhc19uZXdfT0JKRUNUUykgJChnYXNwX25ld19PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubCAubG8gLm8gLnMgLnkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0ke0dEQklOSVR9OiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyBnZGJpbml0LmluCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kQDpnZGJpbml0LmluIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLWl0YmwtdGVzdCQoRVhFRVhUKTogJChpdGJsX3Rlc3RfT0JKRUNUUykgJChpdGJsX3Rlc3RfREVQRU5ERU5DSUVTKQotCUBybSAtZiBpdGJsLXRlc3QkKEVYRUVYVCkKLQkkKExJTkspICQoaXRibF90ZXN0X0xERkxBR1MpICQoaXRibF90ZXN0X09CSkVDVFMpICQoaXRibF90ZXN0X0xEQUREKSAkKExJQlMpCi0KLWFzLW5ldyQoRVhFRVhUKTogJChhc19uZXdfT0JKRUNUUykgJChhc19uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBhcy1uZXckKEVYRUVYVCkKLQkkKExJTkspICQoYXNfbmV3X0xERkxBR1MpICQoYXNfbmV3X09CSkVDVFMpICQoYXNfbmV3X0xEQUREKSAkKExJQlMpCi0KLWdhc3AtbmV3JChFWEVFWFQpOiAkKGdhc3BfbmV3X09CSkVDVFMpICQoZ2FzcF9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBnYXNwLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChnYXNwX25ld19MREZMQUdTKSAkKGdhc3BfbmV3X09CSkVDVFMpICQoZ2FzcF9uZXdfTERBREQpICQoTElCUykKLS5sLmM6Ci0JJChMRVgpICQoQU1fTEZMQUdTKSAkKExGTEFHUykgJDwgJiYgbXYgJChMRVhfT1VUUFVUX1JPT1QpLmMgJEAKLS55LmM6Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkPCB5LnRhYi5jICQqLmMgeS50YWIuaCAkKi5oIC0tICQoQU1fWUZMQUdTKSAkKFlGTEFHUykKLWNvbmZpZy9tNjhrLXBhcnNlLmg6IGNvbmZpZy9tNjhrLXBhcnNlLmMKLWl0YmwtcGFyc2UuaDogaXRibC1wYXJzZS5jCi0KLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1ERUpBVE9PTCA9ICQoUEFDS0FHRSkKLQotUlVOVEVTVERFRkFVTFRGTEFHUyA9IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHNyY2Rpcgotc2l0ZS5leHA6IE1ha2VmaWxlCi0JQGVjaG8gJ01ha2luZyBhIG5ldyBzaXRlLmV4cCBmaWxlLi4uJwotCUB0ZXN0ICEgLWYgc2l0ZS5iYWsgfHwgcm0gLWYgc2l0ZS5iYWsKLQlAZWNobyAnIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjJyA+ICRALXQKLQlAZWNobyAnIyBEbyBub3QgZWRpdCBoZXJlLiAgSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzJyA+PiAkQC10Ci0JQGVjaG8gJyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0b29sICQoREVKQVRPT0wpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBzcmNkaXIgJChzcmNkaXIpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBvYmpkaXInIGBwd2RgID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfYWxpYXMgJChob3N0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF90cmlwbGV0ICQoaG9zdF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X2FsaWFzICQodGFyZ2V0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X3RyaXBsZXQgJCh0YXJnZXRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX2FsaWFzICQoYnVpbGRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gTm90IEVkaXQgIyMnID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IHNlZCAnMSwvXiMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlLiojIy8gZCcgc2l0ZS5leHAgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgbXYgc2l0ZS5leHAgc2l0ZS5iYWsKLQlAbXYgJEAtdCBzaXRlLmV4cAotaW5mby1hbToKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06Ci1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLURFSkFHTlUKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoU0NSSVBUUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIml0YmwtbGV4bGNvbmZpZy9tNjhrLXBhcnNlaGNvbmZpZy9tNjhrLXBhcnNlY2l0YmwtcGFyc2VoaXRibC1wYXJzZWMiIHx8IHJtIC1mIGl0YmwtbGV4bCBjb25maWcvbTY4ay1wYXJzZWggY29uZmlnL202OGstcGFyc2VjIGl0YmwtcGFyc2VoIGl0YmwtcGFyc2VjCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdFBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgXAotCQljbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCi0JCW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1jbGVhbi1ub2luc3RQUk9HUkFNUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBcCi1kdmktcmVjdXJzaXZlIG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCi1pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0kKHNyY2RpcikvbWFrZS1nYXMuY29tOiBzdGFtcC1tay5jb20KLXN0YW1wLW1rLmNvbTogdm1zY29uZi5zaCBNYWtlZmlsZQotCXNoICQoc3JjZGlyKS92bXNjb25mLnNoICQoR0VORVJJQ19PQkpTKSA+IG5ldy1tYWtlLmNvbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBuZXctbWFrZS5jb20gJChzcmNkaXIpL21ha2UtZ2FzLmNvbQotCXRvdWNoIHN0YW1wLW1rLmNvbQotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi0kKE9CSlMpOiBAQUxMX09CSl9ERVBTQAotCi0jIFN0dWZmIHRoYXQgZXZlcnkgb2JqZWN0IGZpbGUgZGVwZW5kcyB1cG9uLiAgSWYgYW55dGhpbmcgaXMgcmVtb3ZlZAotIyBmcm9tIHRoaXMgbGlzdCwgcmVtb3ZlIGl0IGZyb20gZGVwLWluLnNlZCBhcyB3ZWxsLgotJChPQkpTKTogY29uZmlnLmggYXMuaCAkKFRBUkdfRU5WX0gpICQoT0JKX0ZPUk1BVF9IKSAkKFRBUkdfQ1BVX0gpIGZsb251bS5oIFwKLQlleHByLmggd3JpdGUuaCBmcmFncy5oIGhhc2guaCByZWFkLmggc3ltYm9scy5oIHRjLmggXAotCW9iai5oIGxpc3RpbmcuaCBiaWdudW0uaCBiaXRfZml4LmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGFzaW50bC5oCi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0JaWYgWyAtZCB0ZXN0c3VpdGUgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICBta2RpciB0ZXN0c3VpdGU7IFwKLQlmaQotCXJtIC1mIHRlc3RzdWl0ZS9zaXRlLmV4cAotCWNwIHNpdGUuZXhwIHRlc3RzdWl0ZS9zaXRlLmV4cAotCXJvb3RtZT1gcHdkYDsgZXhwb3J0IHJvb3RtZTsgXAotCXNyY2Rpcj1gY2QgJHtzcmNkaXJ9OyBwd2RgIDsgZXhwb3J0IHNyY2RpciA7IFwKLQlFWFBFQ1Q9JHtFWFBFQ1R9IDsgZXhwb3J0IEVYUEVDVCA7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQljZCB0ZXN0c3VpdGU7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFRoZSBpbXBsaWNpdCAuYy5vIHJ1bGUgZG9lc24ndCB3b3JrIGZvciB0aGVzZSwgcGVyaGFwcyBiZWNhdXNlIG9mCi0jIHRoZSB2YXJpYWJsZXMsIG9yIHBlcmhhcHMgYmVjYXVzZSB0aGUgc291cmNlcyBhcmUgbm90IG9uIHZwYXRoLgotJChUQVJHX0NQVV9PKTogJChUQVJHX0NQVV9DKSAkKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkKLQkkKENPTVBJTEUpIC1jICQoVEFSR19DUFVfQykKLSQoQVRPRl9UQVJHX08pOiAkKEFUT0ZfVEFSR19DKQotCSQoQ09NUElMRSkgLWMgJChBVE9GX1RBUkdfQykKLQotIyBlY29mZi5jIG9ubHkgaGFzIGZ1bGwgZGVwZW5kZW5jaWVzIHdoZW4gRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQsCi0jIHNvIHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeSBzdHVmZiBkb2Vzbid0IHdvcmsuCi1lY29mZi5vIDogZWNvZmYuYyBlY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotCSQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0JJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaAotCi0jIFdlIG5lZWQgYWxsIHRoZXNlIGV4cGxpY2l0IHJ1bGVzIGZvciB0aGUgbXVsdGkgc3R1ZmYuICBCZWNhdXNlIG9mCi0jIHRoZXNlIHJ1bGVzLCB3ZSBkb24ndCBuZWVkIG9uZSBmb3IgT0JKX0ZPUk1BVF9PLgotCi1vYmotYW91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKLW9iai1ib3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYwotb2JqLWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKLW9iai1lY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotb2JqLWVsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi1vYmotZXZheC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKLW9iai1ocDMwMC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotb2JqLWllZWUubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCi1vYmotbXVsdGkubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLW9iai1zb20ubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotb2JqLXZtcy5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0KLWUtbWlwc2VsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotZS1taXBzZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotZS1pMzg2ZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2ZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1pMzg2ZWxmLmMKLQotIyBJZiBtNjhrLXBhcnNlLnkgaXMgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LCB0aGVuIHlsd3JhcCB3aWxsIHVzZSBhbgotIyBhYnNvbHV0ZSBwYXRoIHdoZW4gaXQgaW52b2tlcyB5YWNjLCB3aGljaCB3aWxsIGNhdXNlIHlhY2MgdG8gcHV0IHRoZQotIyBhYnNvbHV0ZSBwYXRoIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiAgVGhhdCdzIGEgcGFpbiB3aGVuIGl0IGNvbWVzCi0jIHRvIGdlbmVyYXRpbmcgc25hcHNob3RzLCBiZWNhdXNlIGl0IGludHJvZHVjZXMgc3B1cmlvdXMgZGlmZnMuCi0jIFNpbmNlIHdoZW4gd2UgbWFrZSB0aGUgc25hcHNob3RzICQoc3JjZGlyKSA9ICIuIiwgd2UgY2hlY2sgZm9yIHRoYXQKLSMgY2FzZSBhbmQgaGFuZGxlIGl0IGRpZmZlcmVudGx5LiAgVGhpcyBtZWFucyB0aGF0IGFueWJvZHkgd2hvCi0jIGNvbmZpZ3VyZXMgd2l0aCAkKHNyY2RpcikgPSAiLiIgd2lsbCBoYXZlIHRvIHNldCB0aGVpciBwYXRoIGluIHRoZQotIyBkZWJ1Z2dlciBpZiB0aGV5IHdhbnQgdG8gZGVidWcgbTY4ay1wYXJzZS55LiAgVGhpcyBpcyBiYWQsIGJ1dCBvbgotIyB0aGUgb3RoZXIgaGFuZCBpdCdzIGdvb2QgdGhhdCBwZW9wbGUgd2hvIHVzZSB0aGUgcHJlYnVpbHQKLSMgbTY4ay1wYXJzZS5jIGRvbid0IGdldCBhIHNwdXJpb3VzIGFic29sdXRlIHBhdGguCi1tNjhrLXBhcnNlLmM6ICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55Ci0JZj0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueTsgXAotCWlmIFsgJCRmID0gIi4vY29uZmlnL202OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBsbiAtcyBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGxuIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgY3AgY29uZmlnL202OGstcGFyc2UueSAuID4vZGV2L251bGwgMj4vZGV2L251bGw7IFwKLQkgIGY9bTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaTsgXAotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJCRmIHkudGFiLmMgbTY4ay1wYXJzZS5jIC0tOyBcCi0JaWYgWyAkJGYgPSAibTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIHJtIC1mIG02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmkKLW02OGstcGFyc2UubzogbTY4ay1wYXJzZS5jICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLSMgRG9uJ3QgbGV0IHRoZSAueS5oIHJ1bGUgY2xvYmJlciBtNjhrLXBhcnNlLmguCi1tNjhrLXBhcnNlLmg6IDsgQHRydWUKLSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0KLSMgVGhlIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gbGV4aWNhbCBhbmFseXplciBhbmQgcGFyc2VyLgotCi1pdGJsLWxleC5jOiAkKHNyY2RpcikvaXRibC1sZXgubAotaXRibC1sZXgubzogaXRibC1sZXguYyBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5vOiBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0KLWl0Ymwtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oOiAkKHNyY2RpcikvaXRibC1wYXJzZS55Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvaXRibC1wYXJzZS55IHkudGFiLmMgaXRibC1wYXJzZS5jIHkudGFiLmggaXRibC1wYXJzZS5oIC0tIC1kCi0KLWl0YmwtdG9wcy5vOiAkKHNyY2RpcikvaXRibC1vcHMuYyAkKHNyY2RpcikvaXRibC1vcHMuaCBpdGJsLXBhcnNlLmgKLQkkKENPTVBJTEUpIC1vIGl0YmwtdG9wcy5vIC1EU1RBTkRfQUxPTkUgLWMgJChzcmNkaXIpL2l0Ymwtb3BzLmMKLQotaXRibC10ZXN0Lm86ICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYyAkKHNyY2RpcikvaXRibC1vcHMuaAotCSQoQ09NUElMRSkgLWMgLURTVEFORF9BTE9ORSAkKHNyY2RpcikvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMKLQotY2dlbi5vOiBjZ2VuLmMgY2dlbi5oIGNnZW4tZGVzYy5oIHN1YnNlZ3MuaCBcCi0JJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0JJChzcmNkaXIpLy4uL29wY29kZXMvJChDR0VOX0NQVV9QUkVGSVgpLWRlc2MuaCBcCi0JJChzcmNkaXIpLy4uL29wY29kZXMvJChDR0VOX0NQVV9QUkVGSVgpLW9wYy5oCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtYmluZGlyIGluc3RhbGwtZXhlYy10b29sZGlyCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogaW5zdGFsbC1leGVjLWJpbmRpciBAaW5zdGFsbF90b29sZGlyQAotCi1pbnN0YWxsLWV4ZWMtYmluZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKQotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi1pbnN0YWxsLWV4ZWMtdG9vbGRpcjogJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgotCW49YGVjaG8gYXMgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBhcy1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQllbHNlIFwKLQkgIHRydWUgOyBcCi0JZmkKLQotIyBUaGVzZSBleGlzdCBmb3IgbWFpbnRlbmFuY2UgcHVycG9zZXMuCi0KLS5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcDIgYm9vdHN0cmFwMyBzdGFnZTEgc3RhZ2UyIHN0YWdlMyBjb21wYXJpc29uCi0KLWJvb3RzdHJhcDogYXMtbmV3Ci0JJChNQUtFKSBzdGFnZTEKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIHN0YWdlMgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi1ib290c3RyYXAyOgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDM6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLSMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCi1zdGFnZTE6Ci0JLW1rZGlyIHN0YWdlMQotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMQotCWlmIFsgLWYgc3RhZ2UxL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMS9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UxIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCi0KLXN0YWdlMjoKLQktbWtkaXIgc3RhZ2UyCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCi0JaWYgWyAtZiBzdGFnZTIvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UyL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTIgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UzOgotCS1ta2RpciBzdGFnZTMKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTMKLQlpZiBbIC1mIHN0YWdlMy9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTMvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMyA7IGxuIC1zIGFzLW5ldyBhcyQoRVhFRVhUKSkgOyBmaQotCi0jIFRoaXMgcnVsZSBpcyBkZXJpdmVkIGZyb20gY29ycmVzcG9uZGluZyBjb2RlIGluIHRoZSBNYWtlZmlsZS5pbiBmb3IgZ2NjLgotIyBUaGUgInRhaWwgKzE2YyIgaXMgdG8gYnlwYXNzIGhlYWRlcnMgd2hpY2ggbWF5IGluY2x1ZGUgdGltZXN0YW1wcyBvcgotIyB0ZW1wb3JhcnkgYXNzZW1ibHkgZmlsZSBuYW1lcy4KLWNvbXBhcmlzb246Ci0JeD0wIDsgXAotCWZvciBmaWxlIGluICoubyA7IGRvIFwKLQkgIHRhaWwgKzE2YyAuLyQkZmlsZSA+IHRtcC1mb28xOyBcCi0JICBpZiB0YWlsICsxNmMgJHthZ2FpbnN0fS8kJGZpbGUgPiB0bXAtZm9vMiAyPi9kZXYvbnVsbCA7IHRoZW4gXAotCSAgICBpZiBjbXAgdG1wLWZvbzEgdG1wLWZvbzIgOyB0aGVuIFwKLQkgICAgICB0cnVlIDsgXAotCSAgICBlbHNlIFwKLQkgICAgICBlY2hvICQkZmlsZSBkaWZmZXJzIDsgXAotCSAgICAgIHg9MSA7IFwKLQkgICAgZmkgOyBcCi0JICBlbHNlIHRydWU7IGZpIDsgXAotCWRvbmUgOyBcCi0JZXhpdCAkJHgKLQktcm0gLWYgdG1wLWZvbyoKLQotLlBIT05ZOiBkZS1zdGFnZTEgZGUtc3RhZ2UyIGRlLXN0YWdlMwotCi1kZS1zdGFnZTE6Ci0JLSAoY2Qgc3RhZ2UxIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UxCi0KLWRlLXN0YWdlMjoKLQktIChjZCBzdGFnZTIgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTIKLQotZGUtc3RhZ2UzOgotCS0gKGNkIHN0YWdlMyA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMwotCi1ERVA6IGRlcC5zZWQgJChERVBfRklMRV9ERVBTKSBERVBUQyBERVBPQkogREVQMgotCXJtIC1mIERFUDEKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgc3JjZGlyPSQke3NyY2Rpcn0gVlBBVEg9JCR7c3JjZGlyfSBERVAxCi0Jcm0gLXJmIERFUERJUgotCXNlZCAtZiBkZXAuc2VkIDwgREVQMSA+IERFUEEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUFRDID4+IERFUEEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUE9CSiA+PiBERVBBCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVAyID4+IERFUEEKLQllY2hvICckJChPQkpTKTogJCQoREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnJCQoVEFSR19DUFVfTyk6ICQkKERFUFRDX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnJCQoT0JKX0ZPUk1BVF9PKTogJCQoREVQT0JKX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZJyA+PiBERVBBCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUEEgREVQCi0KLSMgVGhpcyBydWxlIG5lZWRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLURFUDE6ICQoQ0ZJTEVTKSAkKE1VTFRJX0NGSUxFUykKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZWNobyAnJyA+IHRhcmctY3B1Lmg7IFwKLQllY2hvICcnID4gb2JqLWZvcm1hdC5oOyBcCi0JZWNobyAnJyA+IHRhcmctZW52Lmg7IFwKLQllY2hvICcnID4gaXRibC1jcHUuaDsgXAotCWVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSAkPwotCXNlZCAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgPCBERVBESVIvREVQID4gREVQMQotCXJtIC1mIERFUERJUi9ERVAKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSB0Yy0qLmMgZmlsZXMuCi1ERVBUQzogJChUQVJHRVRfQ1BVX0NGSUxFUykKLQlybSAtZiBERVBUQ0EKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIkJHtjfSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvdGMtJCR7Y30uYyBkdW1teS5jOyBcCi0JICAgICAgZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVA7IFwKLQkgICAgICAkKE1LREVQKSAtZiBERVAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgZHVtbXkuYzsgXAotCSAgICAgIHNlZCAtZSAicy9kdW1teS5vOiBkdW1teS5jL0RFUFRDXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQVENBOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUFRDX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcJyA+PiBERVBUQ0EKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IERFUFRDQQotCWVjaG8gJyAgJCQoSU5DRElSKS9vcGNvZGUvaHBwYS5oICQkKEJGRERJUikvc29tLmgnID4+IERFUFRDQQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQVENfJyIkJHtjfSInX211bHRpID0gXCcgPj4gREVQVENBOyBcCi0JICAgIGVjaG8gJyQkKERFUFRDXyciJCR7Y30iJ19jb2ZmKSBcJyA+PiBERVBUQ0E7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBUQ18nIiQke2N9IidfZWNvZmYpIFwnID4+IERFUFRDQTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUFRDXyciJCR7Y30iJ19lbGYpJyA+PiBERVBUQ0E7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgREVQVENBIERFUFRDCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgb2JqLSouYyBmaWxlcy4KLURFUE9CSjogJChPQkpfRk9STUFUX0NGSUxFUykKLQlybSAtZiBERVBPQkpBCi0JaWYgWyAtZCBERVBESVIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIERFUERJUjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIERFUERJUjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gb2JqLWZvcm1hdC5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRlLWdlbmVyaWMuaCInID4gdGFyZy1lbnYuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtcGFyc2UuaDsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgICBjcCAkJHtzcmNkaXJ9L2NvbmZpZy9vYmotJCR7b30uYyBkdW1teS5jOyBcCi0JICAgICAgZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVA7IFwKLQkgICAgICAkKE1LREVQKSAtZiBERVAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgZHVtbXkuYzsgXAotCSAgICAgIHNlZCAtZSAicy9kdW1teS5vOiBkdW1teS5jL0RFUE9CSl8kJHtjfV8kJHtvfSA9LyIgXAotCQkgIC1lICcxLC9ETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSL2QnIFwKLQkJICAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgXAotCQkgIC1lICcvXiQkL2QnIDwgREVQID4+IC4uL0RFUE9CSkE7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnREVQT0JKX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcJyA+PiBERVBPQkpBCi0JZWNobyAnICAkJChJTkNESVIpL29ic3RhY2suaCAkJChCRkRESVIpL2xpYmhwcGEuaCBcJyA+PiBERVBPQkpBCi0JZWNobyAnICAkJChCRkRESVIpL3NvbS5oICAkJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcJyA+PiBERVBPQkpBCi0JZWNobyAnICAkJChJTkNESVIpL2FvdXQvc3RhYi5kZWYnID4+IERFUE9CSkEKLQkjIFdlIGRvbid0IHRyeSB0byBoYW5kbGUgYWxsIG11bHRpIGNhc2VzLgotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgJChDUFVfTVVMVElfVkFMSUQpIFwKLQkgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgIG89ZWNvZmY7IFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGVjaG8gJ0RFUE9CSl8nIiQke2N9IidfbXVsdGkgPSBcJyA+PiBERVBPQkpBOyBcCi0JICAgIGVjaG8gJyQkKERFUE9CSl8nIiQke2N9IidfY29mZikgXCcgPj4gREVQT0JKQTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKERFUE9CSl8nIiQke2N9IidfZWNvZmYpIFwnID4+IERFUE9CSkE7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2VsZiknID4+IERFUE9CSkE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgREVQT0JKQSBERVBPQkoKLQotIyBXb3JrIG91dCB0aGUgZGVwZW5kZW5jaWVzIGZvciBlYWNoIENQVS9PQkogY29tYmluYXRpb24uCi0jIE5vdGUgdGhhdCBTT00gaXMgYSBzcGVjaWFsIGNhc2UsIGJlY2F1c2UgaXQgb25seSB3b3JrcyBuYXRpdmUuCi1ERVAyOiAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCXJtIC1mIERFUDJhCi0JaWYgWyAtZCBERVBESVIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIERFUERJUjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIERFUERJUjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQOyBcCi0JICAgICAgJChNS0RFUCkgLWYgREVQIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9ERVBfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IERFUCA+PiAuLi9ERVAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUF9ocHBhX3NvbSA9ICQkKEJGRERJUikvc29tLmgnID4+IERFUDJhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gREVQMmE7IFwKLQkgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19jb2ZmKSBcJyA+PiBERVAyYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IERFUDJhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19lbGYpJyA+PiBERVAyYTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiBERVAyYSBERVAyCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZCBcCi0JCS1lICJzIUBJTkNESVJAISQke3NyY2Rpcn0vLi4vaW5jbHVkZSEiIFwKLQkJLWUgInMhQEJGRERJUkAhJCR7c3JjZGlyfS8uLi9iZmQhIiBcCi0JCS1lICJzIUBTUkNESVJAISQke3NyY2Rpcn0hIgotCi1kZXA6IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWFwcC5vOiBhcHAuYwotYXMubzogYXMuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBvdXRwdXQtZmlsZS5oIFwKLSAgc2IuaCBtYWNyby5oCi1hdG9mLWdlbmVyaWMubzogYXRvZi1nZW5lcmljLmMKLWJpZ251bS1jb3B5Lm86IGJpZ251bS1jb3B5LmMKLWNvbmQubzogY29uZC5jIG1hY3JvLmggc2IuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1kZXBlbmQubzogZGVwZW5kLmMKLWR3YXJmMmRiZy5vOiBkd2FyZjJkYmcuYyBkd2FyZjJkYmcuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKLWVjb2ZmLm86IGVjb2ZmLmMgZWNvZmYuaAotZWhvcHQubzogZWhvcHQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1leHByLm86IGV4cHIuYyAkKElOQ0RJUikvb2JzdGFjay5oCi1mbG9udW0tY29weS5vOiBmbG9udW0tY29weS5jCi1mbG9udW0ta29uc3QubzogZmxvbnVtLWtvbnN0LmMKLWZsb251bS1tdWx0Lm86IGZsb251bS1tdWx0LmMKLWZyYWdzLm86IGZyYWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLWhhc2gubzogaGFzaC5jICQoSU5DRElSKS9vYnN0YWNrLmgKLWlucHV0LWZpbGUubzogaW5wdXQtZmlsZS5jIGlucHV0LWZpbGUuaAotaW5wdXQtc2NydWIubzogaW5wdXQtc2NydWIuYyBpbnB1dC1maWxlLmggc2IuaAotbGlzdGluZy5vOiBsaXN0aW5nLmMgaW5wdXQtZmlsZS5oIHN1YnNlZ3MuaAotbGl0ZXJhbC5vOiBsaXRlcmFsLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLW1hY3JvLm86IG1hY3JvLmMgc2IuaCBtYWNyby5oCi1tZXNzYWdlcy5vOiBtZXNzYWdlcy5jCi1vdXRwdXQtZmlsZS5vOiBvdXRwdXQtZmlsZS5jIG91dHB1dC1maWxlLmgKLXJlYWQubzogcmVhZC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIHNiLmggbWFjcm8uaCBcCi0gIGVjb2ZmLmgKLXNiLm86IHNiLmMgc2IuaAotc3RhYnMubzogc3RhYnMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3Vic2Vncy5vOiBzdWJzZWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLXN5bWJvbHMubzogc3ltYm9scy5jICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oIFwKLSAgc3RydWMtc3ltYm9sLmgKLXdyaXRlLm86IHdyaXRlLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaAotZ2FzcC5vOiBnYXNwLmMgc2IuaCBtYWNyby5oCi1pdGJsLW9wcy5vOiBpdGJsLW9wcy5jIGl0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi1lLW1pcHNlY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMgZW11bC5oIFwKLSAgZW11bC10YXJnZXQuaAotZS1taXBzZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMgZW11bC5oIGVtdWwtdGFyZ2V0LmgKLSQoT0JKUyk6ICQoREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoVEFSR19DUFVfTyk6ICQoREVQVENfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotJChPQkpfRk9STUFUX08pOiAkKERFUE9CSl9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ2FzL05FV1MgYi9nYXMvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNzM0YS4uMDAwMDAwMAotLS0gYS9nYXMvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0tKi0gdGV4dCAtKi0KLQotQ2hhbmdlcyBpbiAyLjEwOgotCi1OZXcgLS1mYXRhbC13YXJuaW5ncyBvcHRpb24uCi0KLXBpY29KYXZhIGFyY2hpdGVjdHVyZSBzdXBwb3J0IGFkZGVkLgotCi1Nb3Rvcm9sYSBNQ29yZSAyMTAgcHJvY2Vzc29yIHN1cHBvcnQgYWRkZWQuCi0KLUEgbmV3IHBzZXVkby1vcCAuaW50ZWxfc3ludGF4IGhhcyBiZWVuIGltcGxlbWVudGVkIHRvIGFsbG93IGdhcyB0byBwYXJzZSBpMzg2Ci1hc3NlbWJseSBwcm9ncmFtcyB3aXRoIGludGVsIHN5bnRheC4KLQotTmV3IHBzZXVkby1vcHMgLmZ1bmMsLmVuZGZ1bmMgdG8gYWlkIGluIGRlYnVnZ2luZyB1c2VyLXdyaXR0ZW4gYXNzZW1ibGVyIGNvZGUuCi0KLUFkZGVkIC1nZHdhcmYyIG9wdGlvbiB0byBnZW5lcmF0ZSBEV0FSRiAyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotRnVsbCAxNi1iaXQgbW9kZSBzdXBwb3J0IGZvciBpMzg2LgotCi1HcmVhdGx5IGltcHJvdmVkIGluc3RydWN0aW9uIG9wZXJhbmQgY2hlY2tpbmcgZm9yIGkzODYuICBUaGlzIGNoYW5nZSB3aWxsCi1wcm9kdWNlIGVycm9ycyBvciB3YXJuaW5ncyBvbiBpbmNvcnJlY3QgYXNzZW1ibHkgY29kZSB0aGF0IHByZXZpb3VzIHZlcnNpb25zIG9mCi1nYXMgYWNjZXB0ZWQuICBJZiB5b3UgZ2V0IHVuZXhwZWN0ZWQgbWVzc2FnZXMgZnJvbSBjb2RlIHRoYXQgd29ya2VkIHdpdGggb2xkZXIKLXZlcnNpb25zIG9mIGdhcywgcGxlYXNlIGRvdWJsZSBjaGVjayB0aGUgY29kZSBiZWZvcmUgcmVwb3J0aW5nIGEgYnVnLgotCi1XZWFrIHN5bWJvbCBzdXBwb3J0IGFkZGVkIGZvciBDT0ZGIHRhcmdldHMuCi0KLU1pdHN1YmlzaGkgRDMwViBzdXBwb3J0IGFkZGVkLgotCi1UZXhhcyBJbnN0cnVtZW50cyBjODAgKHRtczMyMGM4MCkgc3VwcG9ydCBhZGRlZC4KLQotaTk2MCBFTEYgc3VwcG9ydCBhZGRlZC4KLQotQ2hhbmdlcyBpbiAyLjk6Ci0KLVRleGFzIEluc3RydW1lbnRzIGMzMCAodG1zMzIwYzMwKSBzdXBwb3J0IGFkZGVkLgotCi1UaGUgYXNzZW1ibGVyIG5vdyBvcHRpbWl6ZXMgdGhlIGV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgYnkgZWdjcwotYW5kIGdjYyAyLjguICBUaGUgbmV3IC0tdHJhZGl0aW9uYWwtZm9ybWF0IG9wdGlvbiBkaXNhYmxlcyB0aGlzIG9wdGltaXphdGlvbi4KLQotQWRkZWQgLS1nc3RhYnMgb3B0aW9uIHRvIGdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotVGhlIC1hIG9wdGlvbiB0YWtlcyBhIG5ldyBzdWJvcHRpb24sIG0gKGUuZy4sIC1hbG0pIHRvIGV4cGFuZCBtYWNyb3MgaW4gYQotbGlzdGluZy4KLQotQWRkZWQgLU1EIG9wdGlvbiB0byBwcmludCBkZXBlbmRlbmNpZXMuCi0KLUNoYW5nZXMgaW4gMi44OgotCi1CZU9TIHN1cHBvcnQgYWRkZWQuCi0KLU1JUFMxNiBzdXBwb3J0IGFkZGVkLgotCi1Nb3Rvcm9sYSBDb2xkRmlyZSA1MjAwIHN1cHBvcnQgYWRkZWQgKGNvbmZpZ3VyZSBmb3IgbTY4ayBhbmQgdXNlIC1tNTIwMCkuCi0KLUFscGhhL1ZNUyBzdXBwb3J0IGFkZGVkLgotCi1tNjhrIG9wdGlvbnMgLS1iYXNlLXNpemUtZGVmYXVsdC0xNiwgLS1iYXNlLXNpemUtZGVmYXVsdC0zMiwKLS0tZGlzcC1zaXplLWRlZmF1bHQtMTYsIGFuZCAtLWRpc3Atc2l6ZS1kZWZhdWx0LTMyIGFkZGVkLgotCi1UaGUgYWxpZ25tZW50IGRpcmVjdGl2ZXMgbm93IHRha2UgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQsIHdoaWNoIGlzIHRoZQotbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZwotbW9yZSB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMsIHRoZSBhbGlnbm1lbnQgaXMgbm90IGRvbmUgYXQgYWxsLgotCi1UaGUgRUxGIGFzc2VtYmxlciBoYXMgYSBuZXcgcHNldWRvLW9wLCAuc3ltdmVyLCB1c2VkIGZvciBzeW1ib2wgdmVyc2lvbmluZy4KLQotVGhlIC1hIG9wdGlvbiB0YWtlcyBhIG5ldyBzdWJvcHRpb24sIGMgKGUuZy4sIC1hbGMpLCB0byBza2lwIGZhbHNlIGNvbmRpdGlvbmFscwotaW4gbGlzdGluZ3MuCi0KLUFkZGVkIG5ldyBwc2V1ZG8tb3AsIC5lcXVpdjsgaXQncyBsaWtlIC5lcXUsIGV4Y2VwdCB0aGF0IGl0IGlzIGFuIGVycm9yIGlmIHRoZQotc3ltYm9sIGlzIGFscmVhZHkgZGVmaW5lZC4KLQotQ2hhbmdlcyBpbiAyLjc6Ci0KLVRoZSBQb3dlclBDIGFzc2VtYmxlciBub3cgYWxsb3dzIHRoZSB1c2Ugb2Ygc3ltYm9saWMgcmVnaXN0ZXIgbmFtZXMgKHIwLCBldGMuKQotaWYgLW1yZWduYW1lcyBpcyB1c2VkLiAgU3ltYm9saWMgbmFtZXMgcHJlY2VkZWQgYnkgYSAnJScgKCVyMCwgZXRjLikgY2FuIGJlCi11c2VkIGFueSB0aW1lLiAgUG93ZXJQQyA4NjAgbW92ZSB0by9mcm9tIFNQUiBpbnN0cnVjdGlvbnMgaGF2ZSBiZWVuIGFkZGVkLgotCi1BbHBoYSBMaW51eCAoRUxGKSBzdXBwb3J0IGFkZGVkLgotCi1Qb3dlclBDIEVMRiBzdXBwb3J0IGFkZGVkLgotCi1tNjhrIExpbnV4IChFTEYpIHN1cHBvcnQgYWRkZWQuCi0KLWk5NjAgSHgvSnggc3VwcG9ydCBhZGRlZC4KLQotaTM4Ni9Qb3dlclBDIGdudS13aW4zMiBzdXBwb3J0IGFkZGVkLgotCi1TQ08gRUxGIHN1cHBvcnQgYWRkZWQuICBGb3IgT3BlblNlcnZlciA1IHRhcmdldHMgKGkzODYtdW5rbm93bi1zY28zLjJ2NSkgdGhlCi1kZWZhdWx0IGlzIHRvIGJ1aWxkIENPRkYtb25seSBzdXBwb3J0LiAgVG8gZ2V0IGEgc2V0IG9mIHRvb2xzIHRoYXQgZ2VuZXJhdGUgRUxGCi0odGhleSdsbCB1bmRlcnN0YW5kIGJvdGggQ09GRiBhbmQgRUxGKSwgeW91IG11c3QgY29uZmlndXJlIHdpdGgKLXRhcmdldD1pMzg2LXVua25vd24tc2NvMy4ydjVlbGYuCi0KLW04OGstbW90b3JvbGEtc3lzdjMqIHN1cHBvcnQgYWRkZWQuCi0KLUNoYW5nZXMgaW4gMi42OgotCi1HYXMgbm93IGRpcmVjdGx5IHN1cHBvcnRzIG1hY3Jvcywgd2l0aG91dCByZXF1aXJpbmcgR0FTUC4KLQotR2FzIG5vdyBoYXMgYW4gTVJJIGFzc2VtYmxlciBjb21wYXRpYmlsaXR5IG1vZGUuICBVc2UgLU0gb3IgLS1tcmkgdG8gc2VsZWN0IE1SSQotbW9kZS4gIFRoZSBwc2V1ZG8tb3AgYGAubXJpIDEnJyB3aWxsIHN3aXRjaCBpbnRvIHRoZSBNUkkgbW9kZSB1bnRpbCB0aGUgYGAubXJpCi0wJycgaXMgc2VlbjsgdGhpcyBjYW4gYmUgY29udmVuaWVudCBmb3IgaW5saW5lIGFzc2VtYmxlciBjb2RlLgotCi1BZGRlZCAtLWRlZnN5bSBTWU09VkFMVUUgb3B0aW9uLgotCi1BZGRlZCAtbWlwczQgc3VwcG9ydCB0byBNSVBTIGFzc2VtYmxlci4KLQotQWRkZWQgUElDIHN1cHBvcnQgdG8gU29sYXJpcyBhbmQgU1BBUkMgU3VuT1MgNCBhc3NlbWJsZXIuCi0KLUNoYW5nZXMgaW4gMi40OgotCi1Db252ZXJ0ZWQgdGhpcyBkaXJlY3RvcnkgdG8gdXNlIGFuIGF1dG9jb25mLWdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LgotCi1BUk0gc3VwcG9ydCwgZnJvbSBSaWNoYXJkIEVhcm5zaGF3LgotCi1VcGRhdGVkIFZNUyBzdXBwb3J0LCBmcm9tIFBhdCBSYW5raW4sIGluY2x1ZGluZyBjb25zaWRlcmFibHkgaW1wcm92ZWQgZGVidWdnaW5nCi1zdXBwb3J0LgotCi1TdXBwb3J0IGZvciB0aGUgY29udHJvbCByZWdpc3RlcnMgaW4gdGhlIDY4MDYwLgotCi1IYW5kbGVzIChpZ25vcmVzKSBhIG5ldyBkaXJlY3RpdmUgIi50aGlzX0dDQ19yZXF1aXJlc190aGVfR05VX2Fzc2VtYmxlciIsIHRvCi1wcm92aWRlIGZvciBwb3NzaWJsZSBmdXR1cmUgZ2NjIGNoYW5nZXMsIGZvciB0YXJnZXRzIHdoZXJlIGdhcyBwcm92aWRlcyBzb21lCi1mZWF0dXJlcyBub3QgYXZhaWxhYmxlIGluIHRoZSBuYXRpdmUgYXNzZW1ibGVyLiAgSWYgdGhlIG5hdGl2ZSBhc3NlbWJsZXIgaXMKLXVzZWQsIGl0IHNob3VsZCBiZWNvbWUgb2J2aW91cyBwcmV0dHkgcXVpY2tseSB3aGF0IHRoZSBwcm9ibGVtIGlzLgotCi1Vc2FnZSBtZXNzYWdlIGlzIGF2YWlsYWJsZSB3aXRoICItLWhlbHAiLgotCi1UaGUgR05VIEFzc2VtYmxlciBQcmVwcm9jZXNzb3IgKGdhc3ApIGlzIGluY2x1ZGVkLiAgKEFjdHVhbGx5LCBpdCB3YXMgaW4gMi4zCi1hbHNvLCBidXQgZGlkbid0IGdldCBpbnRvIHRoZSBORVdTIGZpbGUuKQotCi1XZWFrIHN5bWJvbCBzdXBwb3J0IGZvciBhLm91dC4KLQotQSBidWcgaW4gdGhlIGxpc3RpbmcgY29kZSB3aGljaCBjb3VsZCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wIGhhcyBiZWVuIGZpeGVkLgotQnVncyBpbiBsaXN0aW5ncyB3aGVuIGdlbmVyYXRpbmcgYSBDT0ZGIG9iamVjdCBmaWxlIGhhdmUgYWxzbyBiZWVuIGZpeGVkLgotCi1Jbml0aWFsIGkzODYtc3ZyNCBQSUMgaW1wbGVtZW50YXRpb24gZnJvbSBFcmljIFlvdW5nZGFsZSwgYmFzZWQgb24gY29kZSBieSBQYXVsCi1LcmFuZW5idXJnLgotCi1JbXByb3ZlZCBBbHBoYSBzdXBwb3J0LiAgSW1tZWRpYXRlIGNvbnN0YW50cyBjYW4gaGF2ZSBhIG11Y2ggbGFyZ2VyIHJhbmdlIG5vdy4KLVN1cHBvcnQgZm9yIHRoZSAyMTE2NCBoYXMgYmVlbiBjb250cmlidXRlZCBieSBEaWdpdGFsLgotCi1VcGRhdGVkIG5zMzJrIChwYzUzMi1tYWNoLCBuZXRic2Q1MzIpIHN1cHBvcnQgZnJvbSBJYW4gRGFsbC4KLQotQ2hhbmdlcyBpbiAyLjM6Ci0KLU1hY2ggaTM4NiBzdXBwb3J0LCBieSBEYXZpZCBNYWNrZW56aWUgYW5kIEtlbiBSYWVidXJuLgotCi1SUy82MDAwIGFuZCBQb3dlclBDIHN1cHBvcnQgYnkgSWFuIFRheWxvci4KLQotVk1TIGNvbW1hbmQgc2NyaXB0cyAobWFrZS1nYXMuY29tLCBjb25maWctZ2FzLmNvbSkgaGF2ZSBiZWVuIHdvcmtlZCBvbiBhIGJpdCwKLWJhc2VkIG9uIG1haWwgcmVjZWl2ZWQgZnJvbSB2YXJpb3VzIHBlb3BsZS4gIFRoZSBgLWgjJyBvcHRpb24gc2hvdWxkIHdvcmsgYWdhaW4KLXRvby4KLQotSFAtUEEgd29yaywgYnkgSmVmZiBMYXcuICBOb3RlLCBmb3IgdGhlIFBBLCBnYXMtMi4zIGhhcyBiZWVuIGRlc2lnbmVkIHRvIHdvcmsKLXdpdGggZ2RiLTQuMTIgYW5kIGdjYy0yLjYuICBBcyBnY2MtMi42IGhhcyBub3QgYmVlbiByZWxlYXNlZCB5ZXQsIGEgc3BlY2lhbAotdmVyc2lvbiBvZiBnY2MtMi41LjggaGFzIGJlZW4gcGF0Y2hlZCB0byB3b3JrIHdpdGggZ2FzLTIuMy4gIFlvdSBjYW4gcmV0cmlldmUKLXRoaXMgc3BlY2lhbCB2ZXJzaW9uIG9mIGdjYy0yLjUuOCB2aWEgYW5vbnltb3VzIGZ0cCBmcm9tIGphZ3Vhci5jcy51dGFoLmVkdQotaW4gdGhlICJkaXN0IiBkaXJlY3RvcnkuCi0KLVZheCBzdXBwb3J0IGluIGdhcyBmaXhlZCBmb3IgQlNELCBzbyBpdCBidWlsZHMgYW5kIHNlZW1zIHRvIHJ1biBhIGNvdXBsZSBzaW1wbGUKLXRlc3RzIG9rYXkuICBJIGhhdmVuJ3QgcHV0IGl0IHRocm91Z2ggZXh0ZW5zaXZlIHRlc3RpbmcuICAoR05VIG1ha2UgaXMKLWN1cnJlbnRseSByZXF1aXJlZCBmb3IgQlNEIDQuMyBidWlsZHMuKQotCi1TdXBwb3J0IGZvciB0aGUgREVDIEFscGhhLCBydW5uaW5nIE9TRi8xIChFQ09GRiBmb3JtYXQpLiAgVGhlIGdhcyBzdXBwb3J0IGlzCi1iYXNlZCBvbiBjb2RlIGRvbmF0ZWQgYnkgQ01VLCB3aGljaCB1c2VkIGFuIGEub3V0LWJhc2VkIGZvcm1hdC4gIEknbSBhZnJhaWQgdGhlCi1hbHBoYS1hLm91dCBzdXBwb3J0IGlzIHByZXR0eSBiYWRseSBtYW5nbGVkLCBhbmQgbXVjaCBvZiBpdCByZW1vdmVkOyBtYWtpbmcgaXQKLXdvcmsgd2lsbCByZXF1aXJlIHJld3JpdGluZyBpdCBhcyBCRkQgc3VwcG9ydCBmb3IgdGhlIGZvcm1hdCBhbnl3YXlzLgotCi1Jcml4IDUgc3VwcG9ydC4KLQotVGhlIHRlc3Qgc3VpdGVzIGhhdmUgYmVlbiBmaXhlZCB1cCBhIGJpdCwgc28gdGhhdCB0aGV5IHNob3VsZCB3b3JrIHdpdGggYQotY291cGxlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBleHBlY3QgYW5kIGRlamFnbnUuCi0KLVN5bWJvbHMnIHZhbHVlcyBhcmUgbm93IGhhbmRsZWQgaW50ZXJuYWxseSBhcyBleHByZXNzaW9ucywgcGVybWl0dGluZyBtb3JlCi1mbGV4aWJpbGl0eSBpbiBldmFsdWF0aW5nIHRoZW0gaW4gc29tZSBjYXNlcy4gIFNvbWUgZGV0YWlscyBvZiByZWxvY2F0aW9uCi1oYW5kbGluZyBoYXZlIGFsc28gY2hhbmdlZCwgYW5kIHNpbXBsZSBjb25zdGFudCBwb29sIG1hbmFnZW1lbnQgaGFzIGJlZW4gYWRkZWQsCi10byBtYWtlIHRoZSBBbHBoYSBwb3J0IGVhc2llci4KLQotTmV3IG9wdGlvbiAiLS1zdGF0aXN0aWNzIiBmb3IgcHJpbnRpbmcgb3V0IHByb2dyYW0gcnVuIHRpbWVzLiAgVGhpcyBpcyBpbnRlbmRlZAotdG8gYmUgdXNlZCB3aXRoIHRoZSBnY2MgIi1RIiBvcHRpb24sIHdoaWNoIHByaW50cyBvdXQgdGltZXMgc3BlbnQgaW4gdmFyaW91cwotcGhhc2VzIG9mIGNvbXBpbGF0aW9uLiAgKFlvdSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYWxsIG9mIHRoZW0gcHJpbnRlZCBvdXQgd2l0aAotImdjYyAtUSAtV2EsLS1zdGF0aXN0aWNzIiwgSSB0aGluay4pCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjI6Ci0KLVJTLzYwMDAgQUlYIGFuZCBNSVBTIFNHSSBJcml4IDUgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4KLQotQ29uZmlndXJhdGlvbnMgdGhhdCBhcmUgc3RpbGwgaW4gZGV2ZWxvcG1lbnQgKGFuZCB0aGVyZWZvcmUgYXJlIGNvbnZlbmllbnQgdG8KLWhhdmUgbGlzdGVkIGluIGNvbmZpZ3VyZS5pbikgc3RpbGwgZ2V0IHJlamVjdGVkIHdpdGhvdXQgYSBtaW5vciBjaGFuZ2UgdG8KLWdhcy9NYWtlZmlsZS5pbiwgc28gcGVvcGxlIG5vdCBkb2luZyBkZXZlbG9wbWVudCB3b3JrIHNob3VsZG4ndCBnZXQgdGhlCi1pbXByZXNzaW9uIHRoYXQgc3VwcG9ydCBmb3Igc3VjaCBjb25maWd1cmF0aW9ucyBpcyBhY3R1YWxseSBiZWxpZXZlZCB0byBiZQotcmVsaWFibGUuCi0KLVRoZSBwcm9ncmFtIG5hbWUgKHVzdWFsbHkgImFzIikgaXMgcHJpbnRlZCB3aGVuIGEgZmF0YWwgZXJyb3IgbWVzc2FnZSBpcwotZGlzcGxheWVkLiAgVGhpcyBzaG91bGQgcHJldmVudCBzb21lIGNvbmZ1c2lvbiBhYm91dCB0aGUgc291cmNlIG9mIG9jY2FzaW9uYWwKLW1lc3NhZ2VzIGFib3V0ICJpbnRlcm5hbCBlcnJvcnMiLgotCi1FTEYgc3VwcG9ydCBpcyBmYWxsaW5nIGludG8gcGxhY2UuICBTdXBwb3J0IGZvciB0aGUgMzg2IHNob3VsZCBiZSB3b3JraW5nLgotU3VwcG9ydCBmb3IgU1BBUkMgU29sYXJpcyBpcyBpbi4gIEhQUEEgc3VwcG9ydCBmcm9tIFV0YWggaXMgYmVpbmcgaW50ZWdyYXRlZC4KLQotU3ltYm9sIHZhbHVlcyBhcmUgbWFpbnRhaW5lZCBhcyBleHByZXNzaW9ucyBpbnN0ZWFkIG9mIGJlaW5nIGltbWVkaWF0ZWx5IGJvaWxlZAotZG93biB0byBhZGQtc3ltYm9sLCBzdWItc3ltYm9sLCBhbmQgY29uc3RhbnQuICBUaGlzIHBlcm1pdHMgc2xpZ2h0bHkgbW9yZQotY29tcGxleCBjYWxjdWxhdGlvbnMgaW52b2x2aW5nIHN5bWJvbHMgd2hvc2UgdmFsdWVzIGFyZSBub3QgYWxyZWFkZXkga25vd24uCi0KLURCWC1zdHlsZSBkZWJ1Z2dpbmcgaW5mbyAoInN0YWJzIikgaXMgbm93IHN1cHBvcnRlZCBmb3IgQ09GRiBmb3JtYXRzLgotSWYgYW55IHN0YWJzIGRpcmVjdGl2ZXMgYXJlIHNlZW4gaW4gdGhlIHNvdXJjZSwgR0FTIHdpbGwgY3JlYXRlIHR3byBuZXcKLXNlY3Rpb25zOiBhICIuc3RhYiIgYW5kIGEgIi5zdGFic3RyIiBzZWN0aW9uLiAgVGhlIGZvcm1hdCBvZiB0aGUgLnN0YWIKLXNlY3Rpb24gaXMgbmVhcmx5IGlkZW50aWNhbCB0byB0aGUgYS5vdXQgc3ltYm9sIGZvcm1hdCwgYW5kIC5zdGFic3RyIGlzCi1pdHMgc3RyaW5nIHRhYmxlLiAgRm9yIHRoaXMgdG8gYmUgdXNlZnVsLCB5b3UgbXVzdCBoYXZlIGNvbmZpZ3VyZWQgR0NDCi10byBnZW5lcmF0ZSBzdGFicyAoYnkgZGVmaW5pbmcgREJYX0RFQlVHR0lOR19JTkZPKSwgYW5kIG11c3QgaGF2ZSBhIEdEQgotdGhhdCBjYW4gdXNlIHRoZSBzdGFiIHNlY3Rpb25zICg0LjExIG9yIGxhdGVyKS4KLQotTHlueE9TLCBvbiBpMzg2IGFuZCBtNjhrIHBsYXRmb3JtcywgaXMgbm93IHN1cHBvcnRlZC4gIFNQQVJDIEx5bnhPUwotc3VwcG9ydCBpcyBpbiBwcm9ncmVzcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DaGFuZ2VzIGluIDIuMToKLQotU2V2ZXJhbCBzbWFsbCBmaXhlcyBmb3IgaTM4Ni1haXggKFBTLzIpIHN1cHBvcnQgZnJvbSBNaW5oIFRyYW4tTGUgaGF2ZSBiZWVuCi1pbmNvcnBvcmF0ZWQsIGJ1dCBub3Qgd2VsbCB0ZXN0ZWQgeWV0LgotCi1BbHRlcmVkIHRoZSBvcGNvZGUgdGFibGUgc3BsaXQgZm9yIG02OGs7IGl0IHNob3VsZCByZXF1aXJlIGxlc3MgVk0gdG8gY29tcGlsZQotd2l0aCBnY2Mgbm93LgotCi1Tb21lIG1pbm9yIGFkanVzdG1lbnRzIHRvIGFkZCAoQ29udmVyZ2VudCBUZWNobm9sb2dpZXMnKSBNaW5pZnJhbWUgc3VwcG9ydCwKLXN1Z2dlc3RlZCBieSBSb25hbGQgQ29sZS4KLQotSFBQQSBzdXBwb3J0IChydW5uaW5nIE9TRiBvbmx5LCBub3QgSFBVWCkgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgVXRhaC4gIFRoaXMKLWluY2x1ZGVzIGltcHJvdmVkIEVMRiBzdXBwb3J0LCB3aGljaCBJJ3ZlIHN0YXJ0ZWQgYWRhcHRpbmcgZm9yIFNQQVJDIFNvbGFyaXMKLTIueC4gIEludGVncmF0aW9uIGlzbid0IGNvbXBsZXRlbHksIHNvIGl0IHByb2JhYmx5IHdvbid0IHdvcmsuCi0KLUhQOTAwMC8zMDAgc3VwcG9ydCwgZG9uYXRlZCBieSBIUCwgaGFzIGJlZW4gbWVyZ2VkIGluLgotCi1JYW4gVGF5bG9yIGhhcyBmaW5pc2hlZCB0aGUgTUlQUyBFQ09GRiAoVWx0cml4LCBJcml4KSBzdXBwb3J0LgotCi1CZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zIChlLmcuLCBocHBhLWhwdXgpLgotCi1UZXN0IHN1aXRlIGZyYW1ld29yayBpcyBzdGFydGluZyB0byBiZWNvbWUgcmVhc29uYWJsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DaGFuZ2VzIGluIDIuMDoKLQotTW9zdGx5IGJ1ZyBmaXhlcy4KLQotU29tZSBtb3JlIG1lcmdpbmcgb2YgQkZEIGFuZCBFTEYgY29kZSwgYnV0IEVMRiBzdGlsbCBkb2Vzbid0IHdvcmsuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAxLjk0OgotCi1CRkQgbWVyZ2UgaXMgcGFydGx5IGRvbmUuICBBZHZlbnR1cm91cyBzb3VscyBtYXkgdHJ5IGdpdmluZyBjb25maWd1cmUgdGhlCi0iLS13aXRoLWJmZC1hc3NlbWJsZXIiIG9wdGlvbi4gIEN1cnJlbnRseSwgRUxGIGZvcm1hdCByZXF1aXJlcyBpdCwgYS5vdXQgZm9ybWF0Ci1hY2NlcHRzIGl0OyBTUEFSQyBDUFUgYWNjZXB0cyBpdC4gIEl0J3MgdGhlIGRlZmF1bHQgb25seSBmb3IgT1MgImVsZiIgb3IKLSJzb2xhcmlzIi4gIChFTEYgaXNuJ3QgcmVhbGx5IHN1cHBvcnRlZCB5ZXQuICBJdCBuZWVkcyB3b3JrLiAgSSd2ZSBnb3Qgc29tZQotY29kZSBmcm9tIFV0YWggZm9yIEhQLVBBIEVMRiwgYW5kIGZyb20gREcgZm9yIG04OGsgRUxGLCBidXQgdGhleSdyZSBub3QgZnVsbHkKLW1lcmdlZCB5ZXQuKQotCi1UaGUgNjhLIG9wY29kZSB0YWJsZSBoYXMgYmVlbiBzcGxpdCBpbiBoYWxmLiAgSXQgc2hvdWxkIG5vdyBjb21waWxlIHVuZGVyIGdjYwotd2l0aG91dCBjb25zdW1pbmcgcmlkaWN1bG91cyBhbW91bnRzIG9mIG1lbW9yeS4KLQotQSBjb3VwbGUgZGF0YSBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiByZWR1Y2VkIGluIHNpemUuICBUaGlzIHNob3VsZCByZXN1bHQgaW4KLXNhdmluZyBhIGxpdHRsZSBiaXQgb2Ygc3BhY2UgYXQgcnVudGltZS4KLQotU3VwcG9ydCBmb3IgTUlQUywgZnJvbSBPU0YgYW5kIFJhbHBoIENhbXBiZWxsLCBoYXMgYmVlbiBtZXJnZWQgaW4uICBUaGUgT1NGCi1jb2RlIHByb3ZpZGVkIFJPU0UgZm9ybWF0IHN1cHBvcnQsIHdoaWNoIEkgaGF2ZW4ndCBtZXJnZWQgaW4geWV0LiAgKEkgY2FuIG1ha2UKLWl0IGF2YWlsYWJsZSwgaWYgYW55b25lIHdhbnRzIHRvIHRyeSBpdCBvdXQuKSAgUmFscGgncyBjb2RlLCBmb3IgQlNEIDQuNCwKLXN1cHBvcnRzIGEub3V0IGZvcm1hdC4gIFdlIGRvbid0IGhhdmUgRUNPRkYgc3VwcG9ydCBpbiBqdXN0IHlldDsgaXQncyBjb21pbmcuCi0KLVN1cHBvcnQgZm9yIHRoZSBIaXRhY2hpIEg4LzUwMCBoYXMgYmVlbiBhZGRlZC4KLQotVk1TIGhvc3QgYW5kIHRhcmdldCBzdXBwb3J0IHNob3VsZCBiZSB3b3JraW5nIG5vdywgdGhhbmtzIGNoaWVmbHkgdG8gRXJpYwotWW91bmdkYWxlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMS45My4wMToKLQotRm9yIG02OGssIHN1cHBvcnQgZm9yIG1vcmUgcHJvY2Vzc29ycyBoYXMgYmVlbiBhZGRlZDogNjgwNDAsIENQVTMyLCA2ODg1MS4KLQotRm9yIGkzODYsIC5hbGlnbiBpcyBub3cgcG93ZXItb2YtdHdvOyB3YXMgbnVtYmVyLW9mLWJ5dGVzLgotCi1Gb3IgbTY4aywgIiUiIGlzIG5vdyBhY2NlcHRlZCBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMuICBGb3IgQ09GRiBmb3JtYXQsIHdoaWNoCi1kb2Vzbid0IHVzZSB1bmRlcnNjb3JlIHByZWZpeGVzIGZvciBDIGxhYmVscywgaXQgaXMgcmVxdWlyZWQsIHNvIHZhcmlhYmxlICJhMCIKLWNhbiBiZSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIHJlZ2lzdGVyLgotCi1MYXN0IHB1YmxpYyByZWxlYXNlIHdhcyAxLjM4LiAgTG90cyBvZiBjb25maWd1cmF0aW9uIGNoYW5nZXMgc2luY2UgdGhlbiwgbG90cwotb2YgbmV3IENQVXMgYW5kIGZvcm1hdHMsIGxvdHMgb2YgYnVncyBmaXhlZC4KLQotDAotTG9jYWwgdmFyaWFibGVzOgotZmlsbC1jb2x1bW46IDc5Ci1FbmQ6CmRpZmYgLS1naXQgYS9nYXMvUkVBRE1FIGIvZ2FzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjMjdkYi4uMDAwMDAwMAotLS0gYS9nYXMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLQkJUkVBRE1FIGZvciBHQVMKLQotQSBudW1iZXIgb2YgdGhpbmdzIGhhdmUgY2hhbmdlZCBzaW5jZSB2ZXJzaW9uIDEgYW5kIHRoZSB3b25kZXJmdWwgd29ybGQgb2YgZ2FzCi1sb29rcyB2ZXJ5IGRpZmZlcmVudC4gIFRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2YgaXJyZWxldmFudCBnYXJiYWdlIGx5aW5nIGFyb3VuZAotdGhhdCB3aWxsIGJlIGNsZWFuZWQgdXAgaW4gdGltZS4gIERvY3VtZW50YXRpb24gaXMgc2NhcmNlLCBhcyBhcmUgbG9ncyBvZiB0aGUKLWNoYW5nZXMgbWFkZSBzaW5jZSB0aGUgbGFzdCBnYXMgcmVsZWFzZS4gIE15IGFwb2xvZ2llcywgYW5kIEknbGwgdHJ5IHRvIGdldAotc29tZXRoaW5nIHVzZWZ1bC4KLQotVW5wYWNraW5nIGFuZCBJbnN0YWxsYXRpb24gLSBTdW1tYXJ5Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU2VlIC4uL2JpbnV0aWxzL1JFQURNRS4KLQotVG8gYnVpbGQganVzdCB0aGUgYXNzZW1ibGVyLCBtYWtlIHRoZSB0YXJnZXQgYWxsLWdhcy4KLQotRG9jdW1lbnRhdGlvbgotPT09PT09PT09PT09PQotCi1UaGUgR0FTIHJlbGVhc2UgaW5jbHVkZXMgdGV4aW5mbyBzb3VyY2UgZm9yIGl0cyBtYW51YWwsIHdoaWNoIGNhbiBiZSBwcm9jZXNzZWQKLWludG8gYGluZm8nIG9yIGBkdmknIGZvcm1zLgotCi1UaGUgRFZJIGZvcm0gaXMgc3VpdGFibGUgZm9yIHByaW50aW5nIG9yIGRpc3BsYXlpbmc7IHRoZSBjb21tYW5kcyBmb3IgZG9pbmcKLXRoaXMgdmFyeSBmcm9tIHN5c3RlbSB0byBzeXN0ZW0uICBPbiBtYW55IHN5c3RlbXMsIGBscHIgLWQnIHdpbGwgcHJpbnQgYSBEVkkKLWZpbGUuICBPbiBvdGhlcnMsIHlvdSBtYXkgbmVlZCB0byBydW4gYSBwcm9ncmFtIHN1Y2ggYXMgYGR2aXBzJyB0byBjb252ZXJ0IHRoZQotRFZJIGZpbGUgaW50byBhIGZvcm0geW91ciBzeXN0ZW0gY2FuIHByaW50LgotCi1JZiB5b3Ugd2lzaCB0byBidWlsZCB0aGUgRFZJIGZpbGUsIHlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBUZVggaW5zdGFsbGVkIG9uIHlvdXIKLXN5c3RlbS4gIFlvdSBjYW4gcmVidWlsZCBpdCBieSB0eXBpbmc6Ci0KLQljZCBnYXMvZG9jCi0JbWFrZSBhcy5kdmkKLQotVGhlIEluZm8gZm9ybSBpcyB2aWV3YWJsZSB3aXRoIHRoZSBHTlUgRW1hY3MgYGluZm8nIHN1YnN5c3RlbSwgb3IgdGhlCi1zdGFuZGFsb25lIGBpbmZvJyBwcm9ncmFtLCBhdmFpbGFibGUgYXMgcGFydCBvZiB0aGUgR05VIFRleGluZm8gZGlzdHJpYnV0aW9uLgotVG8gYnVpbGQgdGhlIGluZm8gZmlsZXMsIHlvdSB3aWxsIG5lZWQgdGhlIGBtYWtlaW5mbycgcHJvZ3JhbS4gIFR5cGU6Ci0KLQljZCBnYXMvZG9jCi0JbWFrZSBpbmZvCi0KLVNwZWNpZnlpbmcgbmFtZXMgZm9yIGhvc3RzIGFuZCB0YXJnZXRzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBUaGUgc3BlY2lmaWNhdGlvbnMgdXNlZCBmb3IgaG9zdHMgYW5kIHRhcmdldHMgaW4gdGhlIGBjb25maWd1cmUnCi1zY3JpcHQgYXJlIGJhc2VkIG9uIGEgdGhyZWUtcGFydCBuYW1pbmcgc2NoZW1lLCBidXQgc29tZSBzaG9ydAotcHJlZGVmaW5lZCBhbGlhc2VzIGFyZSBhbHNvIHN1cHBvcnRlZC4gIFRoZSBmdWxsIG5hbWluZyBzY2hlbWUgZW5jb2RlcwotdGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9uIGluIHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKLQotICAgICBBUkNISVRFQ1RVUkUtVkVORE9SLU9TCi0KLSAgIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSB0aGUgYWxpYXMgYHN1bjQnIGFzIGEgSE9TVCBhcmd1bWVudCBvciBpbiBhCi1gLS10YXJnZXQ9VEFSR0VUJyBvcHRpb24uICBUaGUgZXF1aXZhbGVudCBmdWxsIG5hbWUgaXMKLWBzcGFyYy1zdW4tc3Vub3M0Jy4KLQotICAgVGhlIGBjb25maWd1cmUnIHNjcmlwdCBhY2NvbXBhbnlpbmcgR0FTIGRvZXMgbm90IHByb3ZpZGUgYW55IHF1ZXJ5Ci1mYWNpbGl0eSB0byBsaXN0IGFsbCBzdXBwb3J0ZWQgaG9zdCBhbmQgdGFyZ2V0IG5hbWVzIG9yIGFsaWFzZXMuIAotYGNvbmZpZ3VyZScgY2FsbHMgdGhlIEJvdXJuZSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdWInIHRvIG1hcAotYWJicmV2aWF0aW9ucyB0byBmdWxsIG5hbWVzOyB5b3UgY2FuIHJlYWQgdGhlIHNjcmlwdCwgaWYgeW91IHdpc2gsIG9yCi15b3UgY2FuIHVzZSBpdCB0byB0ZXN0IHlvdXIgZ3Vlc3NlcyBvbiBhYmJyZXZpYXRpb25zLS1mb3IgZXhhbXBsZToKLQotICAgICAlIHNoIGNvbmZpZy5zdWIgc3VuNAotICAgICBzcGFyYy1zdW4tc3Vub3M0MTEKLSAgICAgJSBzaCBjb25maWcuc3ViIHN1bjMKLSAgICAgbTY4ay1zdW4tc3Vub3M0MTEKLSAgICAgJSBzaCBjb25maWcuc3ViIGRlY3N0YXRpb24KLSAgICAgbWlwcy1kZWMtdWx0cml4NDIKLSAgICAgJSBzaCBjb25maWcuc3ViIGhwMzAwYnNkCi0gICAgIG02OGstaHAtYnNkCi0gICAgICUgc2ggY29uZmlnLnN1YiBpMzg2dgotICAgICBpMzg2LXVua25vd24tc3lzdgotICAgICAlIHNoIGNvbmZpZy5zdWIgaTc4NnYKLSAgICAgSW52YWxpZCBjb25maWd1cmF0aW9uIGBpNzg2dic6IG1hY2hpbmUgYGk3ODZ2JyBub3QgcmVjb2duaXplZAotCi0KLWBjb25maWd1cmUnIG9wdGlvbnMKLT09PT09PT09PT09PT09PT09PT0KLQotICAgSGVyZSBpcyBhIHN1bW1hcnkgb2YgdGhlIGBjb25maWd1cmUnIG9wdGlvbnMgYW5kIGFyZ3VtZW50cyB0aGF0IGFyZQotbW9zdCBvZnRlbiB1c2VmdWwgZm9yIGJ1aWxkaW5nIEdBUy4gIGBjb25maWd1cmUnIGFsc28gaGFzIHNldmVyYWwgb3RoZXIKLW9wdGlvbnMgbm90IGxpc3RlZCBoZXJlLgotCi0gICAgIGNvbmZpZ3VyZSBbLS1oZWxwXQotICAgICAgICAgICAgICAgWy0tcHJlZml4PURJUl0KLSAgICAgICAgICAgICAgIFstLXNyY2Rpcj1QQVRIXQotICAgICAgICAgICAgICAgWy0taG9zdD1IT1NUXQotICAgICAgICAgICAgICAgWy0tdGFyZ2V0PVRBUkdFVF0KLSAgICAgICAgICAgICAgIFstLXdpdGgtT1BUSU9OXQotICAgICAgICAgICAgICAgWy0tZW5hYmxlLU9QVElPTl0KLQotWW91IG1heSBpbnRyb2R1Y2Ugb3B0aW9ucyB3aXRoIGEgc2luZ2xlIGAtJyByYXRoZXIgdGhhbiBgLS0nIGlmIHlvdQotcHJlZmVyOyBidXQgeW91IG1heSBhYmJyZXZpYXRlIG9wdGlvbiBuYW1lcyBpZiB5b3UgdXNlIGAtLScuCi0KLWAtLWhlbHAnCi0gICAgIFByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBgY29uZmlndXJlJywgYW5kIGV4aXQuCi0KLWAtcHJlZml4PURJUicKLSAgICAgQ29uZmlndXJlIHRoZSBzb3VyY2UgdG8gaW5zdGFsbCBwcm9ncmFtcyBhbmQgZmlsZXMgdW5kZXIgZGlyZWN0b3J5Ci0gICAgIGBESVInLgotCi1gLS1zcmNkaXI9UEFUSCcKLSAgICAgTG9vayBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBpbiBkaXJlY3RvcnkgRElSLiAgVXN1YWxseQotICAgICBgY29uZmlndXJlJyBjYW4gZGV0ZXJtaW5lIHRoYXQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkuCi0KLWAtLWhvc3Q9SE9TVCcKLSAgICAgQ29uZmlndXJlIEdBUyB0byBydW4gb24gdGhlIHNwZWNpZmllZCBIT1NULiAgTm9ybWFsbHkgdGhlCi0gICAgIGNvbmZpZ3VyZSBzY3JpcHQgY2FuIGZpZ3VyZSB0aGlzIG91dCBhdXRvbWF0aWNhbGx5LgotCi0gICAgIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlCi0gICAgIGhvc3RzLgotCi1gLS10YXJnZXQ9VEFSR0VUJwotICAgICBDb25maWd1cmUgR0FTIGZvciBjcm9zcy1hc3NlbWJsaW5nIHByb2dyYW1zIGZvciB0aGUgc3BlY2lmaWVkCi0gICAgIFRBUkdFVC4gIFdpdGhvdXQgdGhpcyBvcHRpb24sIEdBUyBpcyBjb25maWd1cmVkIHRvIGFzc2VtYmxlIC5vIGZpbGVzCi0gICAgIHRoYXQgcnVuIG9uIHRoZSBzYW1lIG1hY2hpbmUgKEhPU1QpIGFzIEdBUyBpdHNlbGYuCi0KLSAgICAgVGhlcmUgaXMgbm8gY29udmVuaWVudCB3YXkgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUKLSAgICAgdGFyZ2V0cy4KLQotYC0tZW5hYmxlLU9QVElPTicKLSAgICAgVGhlc2UgZmxhZ3MgdGVsbCB0aGUgcHJvZ3JhbSBvciBsaWJyYXJ5IGJlaW5nIGNvbmZpZ3VyZWQgdG8gCi0gICAgIGNvbmZpZ3VyZSBpdHNlbGYgZGlmZmVyZW50bHkgZnJvbSB0aGUgZGVmYXVsdCBmb3IgdGhlIHNwZWNpZmllZAotICAgICBob3N0L3RhcmdldCBjb21iaW5hdGlvbi4gIFNlZSBiZWxvdyBmb3IgYSBsaXN0IG9mIGAtLWVuYWJsZScKLSAgICAgb3B0aW9ucyByZWNvZ25pemVkIGluIHRoZSBnYXMgZGlzdHJpYnV0aW9uLgotCi1gY29uZmlndXJlJyBhY2NlcHRzIG90aGVyIG9wdGlvbnMsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29uZmlndXJpbmcKLW90aGVyIEdOVSB0b29scyByZWN1cnNpdmVseTsgYnV0IHRoZXNlIGFyZSB0aGUgb25seSBvcHRpb25zIHRoYXQgYWZmZWN0Ci1HQVMgb3IgaXRzIHN1cHBvcnRpbmcgbGlicmFyaWVzLgotCi1UaGUgYC0tZW5hYmxlJyBvcHRpb25zIHJlY29nbml6ZWQgYnkgc29mdHdhcmUgaW4gdGhlIGdhcyBkaXN0cmlidXRpb24gYXJlOgotCi1gLS1lbmFibGUtdGFyZ2V0cz0uLi4nCi0gICAgIFRoaXMgY2F1c2VzIG9uZSBvciBtb3JlIHNwZWNpZmllZCBjb25maWd1cmF0aW9ucyB0byBiZSBhZGRlZCB0byB0aG9zZSBmb3IKLSAgICAgd2hpY2ggQkZEIHN1cHBvcnQgaXMgY29tcGlsZWQuICBDdXJyZW50bHkgZ2FzIGNhbm5vdCB1c2UgYW55IGZvcm1hdCBvdGhlcgotICAgICB0aGFuIGl0cyBjb21waWxlZC1pbiBkZWZhdWx0LCBzbyB0aGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwuCi0KLWAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyJwotICAgICBUaGlzIGNhdXNlcyB0aGUgYXNzZW1ibGVyIHRvIHVzZSB0aGUgbmV3IGNvZGUgYmVpbmcgbWVyZ2VkIGludG8gaXQgdG8gdXNlCi0gICAgIEJGRCBkYXRhIHN0cnVjdHVyZXMgaW50ZXJuYWxseSwgYW5kIHVzZSBCRkQgZm9yIHdyaXRpbmcgb2JqZWN0IGZpbGVzLgotICAgICBGb3IgbW9zdCB0YXJnZXRzLCB0aGlzIGlzbid0IHN1cHBvcnRlZCB5ZXQuICBGb3IgbW9zdCB0YXJnZXRzIHdoZXJlIGl0IGhhcwotICAgICBiZWVuIGRvbmUsIGl0J3MgYWxyZWFkeSB0aGUgZGVmYXVsdC4gIFNvIGdlbmVyYWxseSB5b3Ugd29uJ3QgbmVlZCB0byB1c2UKLSAgICAgdGhpcyBvcHRpb24uCi0KLVN1cHBvcnRlZCBwbGF0Zm9ybXMKLT09PT09PT09PT09PT09PT09PT0KLQotQXQgdGhpcyBwb2ludCBJIGJlbGlldmUgZ2FzIHRvIGJlIGFuc2kgb25seSBjb2RlIGZvciBtb3N0IHRhcmdldCBjcHUncy4gIFRoYXQKLWlzLCB0aGVyZSBzaG91bGQgYmUgcmVsYXRpdmVseSBmZXcsIGlmIGFueSBob3N0IHN5c3RlbSBkZXBlbmRlbmNpZXMuICBTbwotcG9ydGluZyAoYXMgYSBjcm9zcy1hc3NlbWJsZXIpIHRvIGhvc3RzIG5vdCB5ZXQgc3VwcG9ydGVkIHNob3VsZCBiZSBmYWlybHkKLWVhc3kuICBQb3J0aW5nIHRvIGEgbmV3IHRhcmdldCBzaG91bGRuJ3QgYmUgdG9vIHRvdWdoIGlmIGl0J3MgYSB2YXJpYW50IG9mIG9uZQotYWxyZWFkeSBzdXBwb3J0ZWQuCi0KLU5hdGl2ZSBhc3NlbWJsaW5nIHNob3VsZCB3b3JrIG9uOgotCi0Jc3VuMwotCXN1bjQKLQkzODZic2QKLQlic2QvMzg2Ci0JZGVsdGEgKG02OGstc3lzdiBmcm9tIE1vdG9yb2xhKQotCWRlbHRhODggKG04OGstc3lzdiBmcm9tIE1vdG9yb2xhKQotCUdOVS9saW51eAotCW02OGsgaHB1eCA4LjAgKGhwdXggNy4wIG1heSBiZSBhIHByb2JsZW0pCi0JdmF4IGJzZCwgdWx0cml4LCB2bXMKLQlocDkwMDBzMzAwCi0JZGVjc3RhdGlvbgotCWlyaXggNAotCWlyaXggNQotCW1pbmlmcmFtZSAobTY4ay1zeXN2IGZyb20gQ29udmVyZ2VudCBUZWNobm9sb2dpZXMpCi0JaTM4Ni1haXggKHBzLzIpCi0JaHBwYSAoaHB1eCA0LjNic2QsIG9zZjEpCi0JQUlYCi0JdW5peHdhcmUKLQlzY28gMy4ydjQuMgotCXNjbyBvcGVuc2VydmVyIDUuMCAoYS5rLmEuIDMuMnY1LjAgKQotCXNwYXJjIHNvbGFyaXMKLQluczMyayAobmV0YnNkLCBsaXRlcykKLQotSSBiZWxpZXZlIHRoYXQgZ2FzIGFzIGEgY3Jvc3MtYXNzZW1ibGVyIGNhbiBjdXJyZW50bHkgYmUgdGFyZ2V0dGVkIGZvcgotbW9zdCBvZiB0aGUgYWJvdmUgaG9zdHMsIHBsdXMKLQotCWRlY3N0YXRpb24tYnNkIChhLm91dCBmb3JtYXQsIHRvIGJlIHVzZWQgaW4gQlNEIDQuNCkKLQllYm1vbjI5awotCWdvMzIgKERPUyBvbiBpMzg2LCB3aXRoIERKR1BQIC0tIG9sZCBhLm91dCB2ZXJzaW9uKQotCWg4LzMwMCwgaDgvNTAwIChIaXRhY2hpKQotCWkzODYtYWl4IChwcy8yKQotCWk5NjAtY29mZgotCW1pcHMgZWNvZmYgKGRlY3N0YXRpb24tdWx0cml4LCBpcmlzLCBtaXBzIG1hZ251bSwgbWlwcy1pZHQtZWNvZmYpCi0JTWl0c3ViaXNoaSBkMTB2IGFuZCBkMzB2Ci0JbmluZHk5NjAKLQlwb3dlcnBjIEVBQkkKLQlTSCAoSGl0YWNoaSkKLQlzY28zODYKLQlUSSB0aWMzMCBhbmQgdGljODAKLQl2YXggYnNkIG9yIHVsdHJpeD8KLQl2bXMKLQl2eHdvcmtzNjhrCi0Jdnh3b3Jrczk2MAotCXo4MDAwIChaaWxvZykKLQotTUlQUyBFQ09GRiBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLCBidXQgR0FTIHdpbGwgbm90IHJ1biBhIEMtc3R5bGUKLXByZXByb2Nlc3Nvci4gIElmIHlvdSB3YW50IHRoYXQsIHJlbmFtZSB5b3VyIGZpbGUgdG8gaGF2ZSBhICIuUyIgc3VmZml4LCBhbmQKLXJ1biBnY2Mgb24gaXQuICBPciBydW4gImdjYyAteGFzc2VtYmxlci13aXRoLWNwcCBmb28ucyIuCi0KLVN1cHBvcnQgZm9yIEVMRiBzaG91bGQgd29yayBub3cgZm9yIHNwYXJjLCBocHBhLCBpMzg2LCBhbHBoYSwgbTY4aywKLU1JUFMsIHBvd2VycGMuCi0KLVN1cHBvcnQgZm9yIHNlcXVlbnQgKG5zMzJrKSwgdGFob2UsIGk4NjAsIG04OGsgbWF5IGJlIHN1ZmZlcmluZyBmcm9tIGJpdHJvdC4KLQotSWYgeW91IHRyeSBvdXQgZ2FzIG9uIHNvbWUgaG9zdCBvciB0YXJnZXQgbm90IGxpc3RlZCBhYm92ZSwgcGxlYXNlIGxldCBtZSBrbm93Ci10aGUgcmVzdWx0cywgc28gSSBjYW4gdXBkYXRlIHRoZSBsaXN0LgotCi1Db21waWxlciBTdXBwb3J0IEhhY2tzCi09PT09PT09PT09PT09PT09PT09PT09Ci0KLU9uIGEgZmV3IHRhcmdldHMsIHRoZSBhc3NlbWJsZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8gc3VwcG9ydCBhIGZlYXR1cmUKLXRoYXQgaXMgcG90ZW50aWFsbHkgdXNlZnVsIHdoZW4gYXNzZW1ibGluZyBjb21waWxlciBvdXRwdXQsIGJ1dCB3aGljaAotbWF5IGNvbmZ1c2UgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMuICBJZiBhc3NlbWJsZXIgZW5jb3VudGVycyBhCi0ud29yZCBwc2V1ZG8tb3Agb2YgdGhlIGZvcm0gc3ltYm9sMS1zeW1ib2wyICh0aGUgZGlmZmVyZW5jZSBvZiB0d28KLXN5bWJvbHMpLCBhbmQgdGhlIGRpZmZlcmVuY2Ugb2YgdGhvc2UgdHdvIHN5bWJvbHMgd2lsbCBub3QgZml0IGluIDE2Ci1iaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgY3JlYXRlIGEgYnJhbmNoIGFyb3VuZCBhIGxvbmcganVtcCB0bwotc3ltYm9sMSwgYW5kIGluc2VydCB0aGlzIGludG8gdGhlIG91dHB1dCBkaXJlY3RseSBiZWZvcmUgdGhlIG5leHQKLWxhYmVsOiBUaGUgLndvcmQgd2lsbCAoaW5zdGVhZCBvZiBjb250YWluaW5nIGdhcmJhZ2UsIG9yIGdpdmluZyBhbgotZXJyb3IgbWVzc2FnZSkgY29udGFpbiAodGhlIGFkZHJlc3Mgb2YgdGhlIGxvbmcganVtcCktc3ltYm9sMi4gIFRoaXMKLWFsbG93cyB0aGUgYXNzZW1ibGVyIHRvIGFzc2VtYmxlIGp1bXAgdGFibGVzIHRoYXQganVtcCB0byBsb2NhdGlvbnMKLXZlcnkgZmFyIGF3YXkgaW50byBjb2RlIHRoYXQgd29ya3MgcHJvcGVybHkuICBJZiB0aGUgbmV4dCBsYWJlbCBpcwotbW9yZSB0aGFuIDMySyBhd2F5IGZyb20gdGhlIC53b3JkLCB5b3UgbG9zZSAoc2lsZW50bHkpOyBSTVMgY2xhaW1zCi10aGlzIHdpbGwgbmV2ZXIgaGFwcGVuLiAgSWYgdGhlIC1LIG9wdGlvbiBpcyBnaXZlbiwgeW91IHdpbGwgZ2V0IGEKLXdhcm5pbmcgbWVzc2FnZSB3aGVuIHRoaXMgaGFwcGVucy4KLQotCi1SRVBPUlRJTkcgQlVHUyBJTiBHQVMKLT09PT09PT09PT09PT09PT09PT09PQotCi1CdWdzIGluIGdhcyBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnLiAgVGhleSBtYXkgYmUKLWNyb3NzLXBvc3RlZCB0byBidWctZ2NjIGlmIHRoZXkgYWZmZWN0IHRoZSB1c2Ugb2YgZ2FzIHdpdGggZ2NjLiAgVGhleQotc2hvdWxkIG5vdCBiZSByZXBvcnRlZCBqdXN0IHRvIGJ1Zy1nY2MsIHNpbmNlIEkgZG9uJ3QgcmVhZCB0aGF0IGxpc3QsCi1hbmQgdGhlcmVmb3JlIHdvdWxkbid0IHNlZSB0aGVtLgotCi1JZiB5b3UgcmVwb3J0IGEgYnVnIGluIEdBUywgcGxlYXNlIHJlbWVtYmVyIHRvIGluY2x1ZGU6Ci0KLUEgZGVzY3JpcHRpb24gb2YgZXhhY3RseSB3aGF0IHdlbnQgd3JvbmcsIGFuZCBleGFjdGx5IHdoYXQgc2hvdWxkIGhhdmUKLWhhcHBlbmVkIGluc3RlYWQuCi0KLVRoZSB0eXBlIG9mIG1hY2hpbmUgKFZBWCwgNjgwMjAsIGV0YykgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKEJTRCwgU3VuT1MsIERZTklYLAotVk1TLCBldGMpIEdBUyB3YXMgcnVubmluZyBvbi4KLQotVGhlIGNvbmZpZ3VyYXRpb24gbmFtZShzKSBnaXZlbiB0byB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0LiAgVGhlCi0iY29uZmlnLnN0YXR1cyIgZmlsZSBzaG91bGQgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLgotCi1UaGUgb3B0aW9ucyBnaXZlbiB0byBHQVMgYXQgcnVuIHRpbWUuCi0KLVRoZSBhY3R1YWwgaW5wdXQgZmlsZSB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbS4KLQotSXQgaXMgc2lsbHkgdG8gcmVwb3J0IGEgYnVnIGluIEdBUyB3aXRob3V0IGluY2x1ZGluZyBhbiBpbnB1dCBmaWxlIGZvciBHQVMuCi1Eb24ndCBhc2sgdXMgdG8gZ2VuZXJhdGUgdGhlIGZpbGUganVzdCBiZWNhdXNlIHlvdSBtYWRlIGl0IGZyb20gZmlsZXMgeW91Ci10aGluayB3ZSBoYXZlIGFjY2VzcyB0by4KLQotMS4gWW91IG1pZ2h0IGJlIG1pc3Rha2VuLgotMi4gSXQgbWlnaHQgdGFrZSB1cyBhIGxvdCBvZiB0aW1lIHRvIGluc3RhbGwgdGhpbmdzIHRvIHJlZ2VuZXJhdGUgdGhhdCBmaWxlLgotMy4gV2UgbWlnaHQgZ2V0IGEgZGlmZmVyZW50IGZpbGUgZnJvbSB0aGUgb25lIHlvdSBnb3QsIGFuZCBtaWdodCBub3Qgc2VlIGFueQotICAgYnVnLgotCi1UbyBzYXZlIHVzIHRoZXNlIGRlbGF5cyBhbmQgdW5jZXJ0YWludGllcywgYWx3YXlzIHNlbmQgdGhlIGlucHV0IGZpbGUgZm9yIHRoZQotcHJvZ3JhbSB0aGF0IGZhaWxlZC4gIEEgc21hbGxlciB0ZXN0IGNhc2UgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHByb2JsZW0gaXMgb2YKLWNvdXJzZSBwcmVmZXJhYmxlLCBidXQgYmUgc3VyZSBpdCBpcyBhIGNvbXBsZXRlIGlucHV0IGZpbGUsIGFuZCB0aGF0IGl0IHJlYWxseQotZG9lcyBkZW1vbnN0cmF0ZSB0aGUgcHJvYmxlbTsgYnV0IGlmIHBhcmluZyBpdCBkb3duIHdvdWxkIGNhdXNlIGxhcmdlIGRlbGF5cwotaW4gZmlsaW5nIHRoZSBidWcgcmVwb3J0LCBkb24ndCBib3RoZXIuCi0KLUlmIHRoZSBpbnB1dCBmaWxlIGlzIHZlcnkgbGFyZ2UsIGFuZCB5b3UgYXJlIG9uIHRoZSBpbnRlcm5ldCwgeW91IG1heSB3YW50IHRvCi1tYWtlIGl0IGF2YWxpYWJsZSBmb3IgYW5vbnltb3VzIEZUUCBpbnN0ZWFkIG9mIG1haWxpbmcgaXQuICBJZiB5b3UgZG8sIGluY2x1ZGUKLWluc3RydWN0aW9ucyBmb3IgRlRQJ2luZyBpdCBpbiB5b3VyIGJ1ZyByZXBvcnQuCi0KLUlmIHlvdSBleHBlY3QgdG8gYmUgY29udHJpYnV0aW5nIGEgbGFyZ2UgbnVtYmVyIG9mIHRlc3QgY2FzZXMsIGl0IHdvdWxkIGJlCi1oZWxwZnVsIGlmIHlvdSB3b3VsZCBsb29rIGF0IHRoZSB0ZXN0IHN1aXRlIGluY2x1ZGVkIGluIHRoZSByZWxlYXNlIChiYXNlZCBvbgotdGhlIERlamEgR251IHRlc3RpbmcgZnJhbWV3b3JrLCBhdmFpbGFibGUgZnJvbSB0aGUgdXN1YWwgZnRwIHNpdGVzKSBhbmQgd3JpdGUKLXRlc3QgY2FzZXMgdG8gZml0IGludG8gdGhhdCBmcmFtZXdvcmsuICBUaGlzIGlzIGNlcnRhaW5seSBub3QgcmVxdWlyZWQuCmRpZmYgLS1naXQgYS9nYXMvUkVBRE1FLXZtcyBiL2dhcy9SRUFETUUtdm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTZjNjAzLi4wMDAwMDAwCi0tLSBhL2dhcy9SRUFETUUtdm1zCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLQlUaGlzIGRvY3VtZW50IGV4cGxhaW5zIGEgY291cGxlIG9mIHRoaW5ncyB0aGF0IGFyZSBzcGVjaWZpYyB0byBWTVMuCi1UaGVyZSBhcmUgY3VycmVudGx5IHR3byAiY2hhcHRlcnMiLCB0aGUgZmlyc3QgZGVhbHMgd2l0aCBjcm9zcy1hc3NlbWJseSAKLWlzc3VlcywgYW5kIHRoZSBzZWNvbmQgZGVhbHMgd2l0aCB0aGUgVk1TIGRlYnVnZ2VyIGFuZCBHTlUtQ0MuCi0KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKiBOb3RlcyBmb3IgQ3Jvc3MgQXNzZW1ibHkgd2l0aCBWTVMgKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JSWYgeW91IHdpc2ggdG8gYnVpbGQgZ2FzIG9uIGEgbm9uLVZNUyBzeXN0ZW0gdG8gY3Jvc3MtYXNzZW1ibGUsIAoteW91IHNob3VsZCB1c2U6Ci0KLWNvbmZpZ3VyZSAke2hvc3R0eXBlfSAtdGFyZ2V0PXZtcwotCi1hbmQgdGhlbiBmb2xsb3cgdGhlIHVzdWFsIHByb2NlZHVyZS4gIFRoZSBvYmplY3QgZmlsZXMgZ2VuZXJhdGVkIG9uCi1Vbml4IHdpbGwgYmUgY29ycmVjdCBmcm9tIGEgYmluYXJ5IHBvaW50IG9mIHZpZXcsIGJ1dCB0aGUgcmVhbCB0cmljayBpcwotZ2V0dGluZyB0aGVtIHRvIHRoZSBWTVMgbWFjaGluZS4gIFRoZSBmb3JtYXQgb2YgdGhlIG9iamVjdCBmaWxlIGlzCi1hIHZhcmlhYmxlLWxlbmd0aCByZWNvcmQsIGJ1dCBlYWNoIHJlY29yZCBjb250YWlucyBiaW5hcnkgZGF0YS4gIGdhcwotd3JpdGVzIHRoZSByZWNvcmRzIGluIHRoZSBzYW1lIGZvcm1hdCB0aGF0IFZNUyB3b3VsZCBleHBlY3QsCi1uYW1lbHkgYSB0d28tYnl0ZSBjb3VudCBmb2xsb3dlZCBieSB0aGF0IG51bWJlciBvZiBieXRlcy4KLQotCUlmIHlvdSB0cnkgdG8gY29weSB0aGUgZmlsZSB0byBhIFZNUyBzeXN0ZW0gdXNpbmcgZnRwLCB0aGUgZnRwCi1wcm90b2NvbCB3aWxsIHNjcmV3IHVwIHRoZSBmaWxlIGJ5IGxvb2tpbmcgZm9yIG51bGxzIChyZWNvcmQgdGVybWluYXRvciBmb3IKLXVuaXgpIGFuZCBpdCB3aWxsIGluc2VydCBpdCdzIG93biByZWNvcmQgdGVybWluYXRvcnMgYXQgdGhhdCBwb2ludC4gIFRoaXMKLXdpbGwgb2J2aW91c2x5IGNvcnJ1cHQgdGhlIGZpbGUuIAotCi0JSWYgeW91IHRyeSB0byB0cmFuc2ZlciB0aGUgZmlsZSB3aXRoIGZ0cCBpbiBiaW5hcnkgbW9kZSwgdGhlCi1maWxlIGl0c2VsZiB3aWxsIG5vdCBiZSBjb3JydXB0LCBidXQgVk1TIHdpbGwgdGhpbmsgdGhhdCB0aGUgZmlsZSBjb250YWlucwotZml4ZWQtbGVuZ3RoIHJlY29yZHMgb2YgNTEyIGJ5dGVzLiAgWW91IGNhbiB1c2UgdGhlIHB1YmxpYy1kb21haW4gRklMRSAKLXV0aWxpdHkgdG8gY2hhbmdlIHRoaXMgd2l0aCBhIGNvbW1hbmQgbGlrZToKLQotJEZJTEUgZm9vLm8vdHlwZT12YXJpYWJsZQotCi1JZiB5b3UgZG8gbm90IGhhdmUgdGhpcyB1dGlsaXR5IGF2YWlsYWJsZSwgdGhlIGZvbGxvd2luZyBwcm9ncmFtIGNhbiBiZSAKLXVzZWQgdG8gcGVyZm9ybSB0aGlzIHRhc2s6Ci0KLQkjaW5jbHVkZSA8ZmFiLmg+Ci0JCi0JI2RlZmluZSBSTUUkQ19TRVRSRk0gMQotCSAKLQlzdHJ1Y3QgRkFCICogZmFiOwotCQotCW1haW4oaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pewotCQlpbnQgaSwgc3RhdHVzOwotCQlmYWIgPSAoc3RydWN0IEZBQiopIG1hbGxvYyhzaXplb2Yoc3RydWN0IEZBQikpOwotCQkqZmFiID0gY2Mkcm1zX2ZhYjsJLyogaW5pdGlhbGl6ZSBGQUIqLwotCQlmYWItPmZhYiRiX2ZhYyA9IEZBQiRNX1BVVDsKLQkJZmFiLT5mYWIkbF9mb3AgfD0gRkFCJE1fRVNDOwotCQlmYWItPmZhYiRsX2N0eCA9IFJNRSRDX1NFVFJGTTsKLQkJZmFiLT5mYWIkd19pZmkgPSAwOwotCQlmb3IoaT0xO2k8YXJnYztpKyspewotCQkgIHByaW50ZigiU2V0dGluZyAlcyB0byB2YXJpYWJsZSBsZW5ndGggcmVjb3Jkcy5cbiIsYXJndltpXSk7Ci0JCSAgZmFiLT5mYWIkbF9mbmEgPSBhcmd2W2ldOwotCSAgICAgICAJICBmYWItPmZhYiRiX2ZucyA9IHN0cmxlbihhcmd2W2ldKTsKLQkJICBzdGF0dXMgPSBzeXMkb3BlbihmYWIsMCwwKTsKLQkJICBpZigoc3RhdHVzICYgNykgIT0gMSkgbGliJHNpZ25hbChzdGF0dXMpOwotCQkgIGZhYi0+ZmFiJGJfcmZtID0gRkFCJENfVkFSOwotCQkgIHN0YXR1cyA9IHN5cyRtb2RpZnkoZmFiLDAsMCk7Ci0JCSAgaWYoKHN0YXR1cyAmIDcpICE9IDEpIGxpYiRzaWduYWwoc3RhdHVzKTsKLQkJICBzdGF0dXMgPSBzeXMkY2xvc2UoZmFiLDAsMCk7Ci0JCSAgaWYoKHN0YXR1cyAmIDcpICE9IDEpIGxpYiRzaWduYWwoc3RhdHVzKTsKLQkJfTsKLQl9Ci0KLQlJZiB5b3UgaGF2ZSBORlMgcnVubmluZyBvbiB0aGUgVk1TIHN5c3RlbSwgd2hhdCB5b3UgbmVlZCB0byBkbwotZGVwZW5kcyB1cG9uIHdoaWNoIE5GUyBzb2Z0d2FyZSB5b3UgYXJlIHJ1bm5pbmcgb24gdGhlIFZNUyBzeXN0ZW0uICBUaGVyZQotYXJlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBUQ1AvSVAgcGFja2FnZXMgZm9yIFZNUyBhdmFpbGFibGUsIGFuZCBvbmx5IHZlcnkKLWxpbWl0ZWQgdGVzdGluZyBoYXMgYmVlbiBwZXJmb3JtZWQuICAgSW4gdGhlIHRlc3RzIHRoYXQgaGFzIGJlZW4gZG9uZSBzbwotZmFyLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgd2lsbCBhbHdheXMgYmUgY29ycmVjdCB3aGVuIHRyYW5zZmVycmluZyB0aGUKLWZpbGUgdmlhIE5GUywgYnV0IHRoZSByZWNvcmQgYXR0cmlidXRlcyBtYXkgb3IgbWF5IG5vdCBiZSBjb3JyZWN0LiAKLQotCU9uZSBwcm9wcmlldGFyeSBUQ1AvSVAvTkZTIHBhY2thZ2UgZm9yIFZNUyBpcyBrbm93biB0byAKLWF1dG9tYXRpY2FsbHkgZml4IHRoZSByZWNvcmQgYXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0IGZpbGUgaWYgeW91IE5GUyBtb3VudAotYSB1bml4IGRpc2sgZnJvbSB0aGUgVk1TIHN5c3RlbSwgYW5kIGlmIHRoZSBmaWxlIGhhcyBhICIub2JqIiBleHRlbnNpb24gb24KLXRoZSB1bml4IHN5c3RlbS4gIE90aGVyIFRDUC9JUCBwYWNrYWdlcyBtaWdodCBkbyB0aGlzIGZvciB5b3UgYXMgd2VsbCwgYnV0Ci10aGV5IGhhdmUgbm90IGJlZW4gY2hlY2tlZC4KLQotTm8gbWF0dGVyIHdoYXQgbWV0aG9kIHlvdSB1c2UgdG8gZ2V0IHRoZSBmaWxlIHRvIHRoZSBWTVMgc3lzdGVtLCBpdCBpcwotYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHRoZSBjb3JyZWN0IHR5cGUgYnkKLWRvaW5nIGEgIiRkaXIvZnVsbCIgb24gdGhlIG9iamVjdCBmaWxlLiBUaGUgZGVzaXJlZCByZWNvcmQgYXR0cmlidXRlcyB3aWxsCi1iZSAiTm9uZSIuICBVbmRlc2lyYWJsZSByZWNvcmQgYXR0cmlidXRlcyB3aWxsIGJlICJTdHJlYW0tTEYiIG9yIGFueXRoaW5nCi1lbHNlLiAKLQotT25jZSB5b3UgZ2V0IHRoZSBmaWxlcyBvbiB0aGUgVk1TIHN5c3RlbSwgeW91IGNhbiBjaGVjayB0aGVpciBpbnRlZ3JpdHkgCi13aXRoIHRoZSAiJGFuYWwvb2JqIiBjb21tYW5kLiAgKE5hdHVyYWxseSBhdCBzb21lIHBvaW50IHlvdSBzaG91bGQgcmVuYW1lCi10aGUgLm8gZmlsZXMgdG8gLm9iaikuICBBcyBmYXIgYXMgdGhlIGRlYnVnZ2VyIGlzIGNvbmNlcm5lZCwgdGhlIHJlY29yZHMgCi13aWxsIGJlIGNvcnJlY3QsIGJ1dCB0aGUgZGVidWdnZXIgd2lsbCBub3QgYmUgYWJsZSB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZXMsCi1zaW5jZSBpdCBvbmx5IGhhcyB0aGUgZmlsZSBuYW1lLCBhbmQgbm90IHRoZSBmdWxsIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLgotWW91IG11c3QgZ2l2ZSB0aGUgZGVidWdnZXIgc29tZSBoZWxwIGJ5IHRlbGxpbmcgaXQgd2hpY2ggZGlyZWN0b3JpZXMgdG8gCi1zZWFyY2ggZm9yIHRoZSBpbmRpdmlkdWFsIGZpbGVzIC0gb25jZSB5b3UgaGF2ZSBkb25lIHRoaXMgeW91IHNob3VsZCBiZSAKLWFibGUgdG8gcHJvY2VlZCBub3JtYWxseS4KLQotCUl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZSBuYW1lcyBmb3IgeW91ciBmaWxlcyB3aGljaCB3aWxsIGJlIHZhbGlkCi11bmRlciBWTVMsIHNpbmNlIG90aGVyd2lzZSB5b3Ugd2lsbCBoYXZlIG5vIHdheSBvZiBnZXR0aW5nIHRoZSBkZWJ1Z2dlciB0bwotZmluZCB0aGUgc291cmNlIGZpbGUgd2hlbiBkZXVnZ2luZy4KLQotVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBvYmplY3QgZmlsZSBub3JtYWxseSBjb250aW5zIHNwZWNpZmljCi1pbmZvcm1hdGlvbiB0aGF0IHRoZSBkZWJ1Z2dlciBjYW4gdXNlIHRvIHBvc2l0aXZlbHkgaWRlbnRpZnkgYSBmaWxlLCBhbmQgaWYKLXlvdSBhcmUgYXNzZW1ibGluZyBvbiBhIHVuaXggc3lzdGVtIHRoaXMgaW5mb3JtYXRpb24gc2ltcGx5IGRvZXMgbm90IGV4aXN0Ci1pbiBhIG1lYW5pbmdmdWwgd2F5LiAgWW91IG11c3QgaGVscCB0aGUgZGVidWdnZXIgYnkgdXNpbmcgdGhlICJTRVQgRklMRT0iCi1jb21tYW5kIHRvIHRlbGwgdGhlIGRlYnVnZ2VyIHdoZXJlIHRvIGxvb2sgZm9yIHNvdXJjZSBmaWxlcy4gVGhlIGRlYnVnZ2VyCi1yZWNvcmRzIHdpbGwgYmUgY29ycmVjdCwgZXhjZXB0IHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgbm90IGJlIGluaXRpYWxseQotYWJsZSB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZXMuICBZb3UgY2FuIHVzZSB0aGUgIlNFVCBGSUxFIiBjb21tYW5kIHRvIHRlbGwKLXRoZSBkZWJ1Z2dlciB3aGVyZSB0byBsb29rIGZvciB0aGUgc291cmNlIGZpbGVzLiAKLQotSSBoYXZlIG9ubHkgdGVzdGVkIHRoaXMgd2l0aCBhIFNWcjQgaTQ4NiBtYWNoaW5lLCBhbmQgZXZlcnl0aGluZyBzZWVtcyB0bwotd29yayBPSywgd2l0aCB0aGUgbGltaXRlZCB0ZXN0aW5nIHRoYXQgSSBoYXZlIGRvbmUuICBPdGhlciBtYWNoaW5lcyBtYXkKLW9yIG1heSBub3Qgd29yay4gIFlvdSBzaG91bGQgcmVhZCB0aGUgY2hhcHRlcnMgb24gY3Jvc3MtY29tcGlsZXJzIGluIHRoZSBnY2MKLW1hbnVhbCBiZWZvcmUgZm9vbGluZyB3aXRoIHRoaXMuICBTaW5jZSBnYXMgZG9lcyBub3QgbmVlZCB0byBkbyBhbnkgZmxvYXRpbmcKLXBvaW50IGFyaXRobWV0aWMsIHRoZSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGhlcmUgc2hvdWxkCi1iZSBjb3JyZWN0IC0gdGhlIG9ubHkgY29uY2VybiBpcyB3aXRoIGNvbnN0YW50IGZvbGRpbmcgaW4gdGhlIG1haW4gY29tcGlsZXIuCi1UaGUgcmFuZ2UgYW5kIHByZWNpc2lvbiBvZiBmbG9hdHMgYW5kIGRvdWJsZXMgYXJlIHNpbWlsYXIgb24gdGhlIDQ4NiAod2l0aCAKLWEgYnVpbHRpbiA4MDM4NykgYW5kIHRoZSBWQVgsIGFsdGhvdWdoIHRoZXJlIGlzIGEgZmFjdG9yIG9mIDIgdG8gNAotZGlmZmVyZW5jZSBpbiB0aGUgcmFuZ2UuICBUaGUgZG91YmxlLCBhcyBpbXBsZW1lbnRlZCBvbiB0aGUgNDg2LCBpcyBxdWl0ZQotc2ltaWxhciB0byB0aGUgR19GTE9BVCBvbiB0aGUgVkFYLiAKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKiBOb3RlcyBmb3IgdXNpbmcgR05VIENDIHdpdGggdGhlIFZNUyBkZWJ1Z2dlcioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLQkxKSBZb3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgR05VLUMsIGFzIHdpdGggYW55IG90aGVyIGRlY2VudCBjb21waWxlciwKLXdpbGwgZG8gdGhpbmdzIHdoZW4gb3B0aW1pemF0aW9uIGlzIHR1cm5lZCBvbiB0aGF0IHlvdSBtYXkgbm90IGV4cGVjdC4gCi1Tb21ldGltZXMgaW50ZXJtZWRpYXRlIHJlc3VsdHMgYXJlIG5vdCB3cml0dGVuIHRvIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgb25seQotdXNlZCBpbiBvbmUgcGxhY2UsIGFuZCBzb21ldGltZXMgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCB1c2VkIGF0IGFsbCB3aWxsIG5vdCBiZQotd3JpdHRlbiB0byB0aGUgc3ltYm9sIHRhYmxlLiAgQWxzbywgcGFyYW1ldGVycyB0byBpbmxpbmUgZnVuY3Rpb25zIGFyZSBvZnRlbgotaW5hY2Nlc3NpYmxlLiBZb3UgY2FuIHNlZSB0aGUgYXNzZW1ibHkgY29kZSBlcXVpdmFsZW50IGJ5IHVzaW5nIEtQNyBpbiB0aGUKLWRlYnVnZ2VyLCBhbmQgZnJvbSB0aGlzIHlvdSBjYW4gdGVsbCBpZiBpbiBmYWN0IGEgdmFyaWFibGUgc2hvdWxkIGhhdmUgdGhlCi12YWx1ZSB0aGF0IHlvdSBleHBlY3QuICBZb3UgY2FuIGZpbmQgb3V0IGlmIGEgdmFyaWFibGUgbGl2ZXMgd2l0aGluZyBhIHJlZ2lzdGVyCi1ieSBkb2luZyBhICdzaG93IHN5bWJvbC9hZGRyJy4KLQotCTIpIE92ZXJseSBjb21wbGV4IGRhdGEgdHlwZXMsIHN1Y2ggYXM6Ci0KLWludCAoKigqKCooKigqKCogc2FycjYpWzFdKVsxXSlbMl0pWzNdKVs0XSlbNV07Ci0KLXdpbGwgbm90IGJlIGRlYnVnZ2VkIHByb3Blcmx5LCBzaW5jZSB0aGUgZGVidWdnaW5nIHJlY29yZCBvdmVyZmxvd3MgYW4gaW50ZXJuYWwKLWRlYnVnZ2VyIGJ1ZmZlci4gIGdjYy1hcyB3aWxsIGNvbnZlcnQgdGhlc2UgdG8gKnZvaWQgYXMgZmFyIGFzIHRoZSBkZWJ1Z2dlcgotc3ltYm9sIHRhYmxlIGlzIGNvbmNlcm5lZCwgd2hpY2ggd2lsbCBhdm9pZCBhbnkgcHJvYmxlbXMsIGFuZCB0aGUgYXNzZW1ibGVyCi13aWxsIGdpdmUgeW91IGEgbWVzc2FnZSBpbmZvcm1pbmcgeW91IHRoYXQgdGhpcyBoYXMgaGFwcGVuZWQuCi0KLQkzKSBZb3UgbXVzdCwgb2YgY291cnNlLCBjb21waWxlIGFuZCBsaW5rIHdpdGggL2RlYnVnLiAgSWYgeW91IGxpbmsKLXdpdGhvdXQgZGVidWcsIHlvdSBzdGlsbCBnZXQgdHJhY2ViYWNrIHRhYmxlIGluIHRoZSBleGVjdXRhYmxlLCBidXQgdGhlcmUgaXMgbm8KLXN5bWJvbCB0YWJsZSBmb3IgdmFyaWFibGVzLgotCi0JNCkgSW5jbHVkZWQgaW4gdGhlIHBhdGNoZXMgdG8gVk1TLkMgYXJlIGZpeGVzIHRvIHR3byBidWdzIHRoYXQgYXJlCi11bnJlbGF0ZWQgdG8gdGhlIGNoYW5nZXMgdGhhdCBJIGhhdmUgbWFkZS4gIE9uZSBvZiB0aGVzZSBtYWRlIGl0IGltcG9zc2libGUgdG8KLWRlYnVnIHNtYWxsIHByb2dyYW1zIHNvbWV0aW1lcywgYW5kIHRoZSBvdGhlciBjYXVzZWQgdGhlIGRlYnVnZ2VyIHRvIGJlY29tZQotY29uZnVzZWQgYWJvdXQgd2hpY2ggcm91dGluZSBpdCB3YXMgaW4sIGFuZCBnaXZlIHRoaXMgaW5jb3JyZWN0IGluZm8gaW4KLXRyYWNlYmFja3MuCi0KLQk1KSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBHTlUtQysrIGNvbXBpbGVyLCB5b3Ugc2hvdWxkIG1vZGlmeSB0aGUKLWNvbXBpbGVyIGRyaXZlciBmaWxlIEdOVV9DQzpbMDAwMDAwXUdDQy5DT00gKG9yIEdYWC5DT00pLiAgSWYgeW91IGhhdmUgYQotc2VwZXJhdGUgR1hYLkNPTSwgdGhlbiB5b3UgbmVlZCB0byBjaGFuZ2Ugb25lIGxpbmUgaW4gR1hYLkNPTSB0bzoKLSQgaWYgZiRsb2NhdGUoIkQiLHAyKSAubmUuIFAyX0xlbmd0aCB0aGVuIERlYnVnID0gIiAiIi1HMCIiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWNlIHplcm8tLS0+ICBeCi1JZiB5b3UgYXJlIHVzaW5nIGEgR0NDLkNPTSB0aGF0IGRvZXMgYm90aCBDIGFuZCBDKyssIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvCi1HQ0MuQ09NOgotCi0kIQotJCEgVXNlIG9sZCBzdHlsZSBkZWJ1Z2dpbmcgcmVjb3JkcyBmb3IgVk1TCi0kIQotJCBpZiAoRGVidWcubmVzLiIiICkuYW5kLiBQbHVzIHRoZW4gRGVidWcgPSAiICIiLUcwIiIiCi0KLWFmdGVyIHRoZSB2YXJpYWJsZXMgUGx1cyBhbmQgRGVidWcgYXJlIHNldC4gIFRoZSByZWFzb24gZm9yIHRoaXMsIGlzIHRoYXQgQysrCi1jb21waWxlciBieSBkZWZhdWx0IGdlbmVyYXRlcyBkZWJ1Z2dpbmcgcmVjb3JkcyB0aGF0IGFyZSBtb3JlIGNvbXBsZXgsCi13aXRoIG1hbnkgbmV3IHN5bnRhY3RpY2FsIGVsZW1lbnRzIHRoYXQgYWxsb3cgZm9yIHRoZSBuZXcgZmVhdHVyZXMgb2YgdGhlCi1sYW5ndWFnZS4gIFRoZSAtRzAgc3dpdGNoIHRlbGxzIHRoZSBDKysgY29tcGlsZXIgdG8gdXNlIHRoZSBvbGQgc3R5bGUgZGVidWdnaW5nCi1yZWNvcmRzLiAgVW50aWwgdGhlIGRlYnVnZ2VyIHVuZGVyc3RhbmRzIEMrKyB0aGVyZSBpcyBub3QgYW55IHBvaW50IHRvIHRyeSBhbmQKLXVzZSB0aGUgZXhwYW5kZWQgc3ludGF4LgotCi0JNikgV2hlbiB5b3UgaGF2ZSBuZXN0ZWQgc2NvcGVzLCBpLmUuOgotbWFpbigpewotCWludCBpOwotCXtpbnQgaTsKLQkJe2ludCBpOwotfTt9O30KLWFuZCB5b3Ugc2F5ICJFWEFNIGkiIHRoZSBkZWJ1Z2dlciBuZWVkcyB0byBmaWd1cmUgb3V0IHdoaWNoIHZhcmlhYmxlIHlvdQotYWN0dWFsbHkgd2FudCB0byByZWZlcmVuY2UuICBJIGhhdmUgYXJyYW5nZWQgdGhpbmdzIHRvIGRlZmluZSBhIGJsb2NrIHRvIHRoZQotZGVidWdnZXIgd2hlbiB5b3UgdXNlIGJyYWNrZXRzIHRvIGVudGVyIGEgbmV3IHNjb3BlLCBzbyBpbiB0aGUgZXhhbXBsZSBhYm92ZSwKLXRoZSB2YXJpYWJsZXMgd291bGQgYmUgZGVzY3JpYmVkIGFzOgotVEVTVFxtYWluXGkKLVRFU1RcbWFpblwkMFxpCi1URVNUXG1haW5cJDBcJDBcaQotQXQgZWFjaCBsZXZlbCwgdGhlIGJsb2NrIG5hbWUgaXMgYSBudW1iZXIgd2l0aCBhIGRvbGxhciBzaWduIHByZWZpeCwgdGhlCi1udW1iZXJzIHN0YXJ0IHdpdGggMCBhbmQgY291bnQgdXB3YXJkLiAgV2hlbiB5b3Ugc2F5IEVYQU0gaSwgdGhlIGRlYnVnZ2VyIGxvb2tzCi1hdCB0aGUgY3VycmVudCBQQywgYW5kIGRlY2lkZXMgd2hpY2ggYmxvY2sgaXQgaXMgY3VycmVudGx5IGluLiAgSXQgd29ya3MgZnJvbQotdGhlIGlubmVybW9zdCBsZXZlbCBvdXR3YXJkIHVudGlsIGl0IGZpbmRzIGEgYmxvY2sgdGhhdCBoYXMgdGhlIHZhcmlhYmxlICJpIgotZGVmaW5lZC4gIFlvdSBjYW4gYWx3YXlzIHNwZWNpZnkgdGhlIHNjb3BlIGV4cGxpY2l0bHkuCi0KLQk3KSAgV2l0aCBDKyssIHRoZXJlIGNhbiBiZSBhIGxvdCBvZiBpbmxpbmUgZnVuY3Rpb25zLCBhbmQgaXQgd291bGQgYmUKLXJhdGhlciByZXN0cmljdGl2ZSB0byBmb3JjZSB0aGUgdXNlciB0byBkZWJ1ZyB0aGUgcHJvZ3JhbSBieSBjb252ZXJ0aW5nIGFsbCBvZgotdGhlIGlubGluZSBmdW5jdGlvbnMgdG8gbm9ybWFsIGZ1bmN0aW9ucy4gIFdoYXQgSSBoYXZlIGRvbmUgaXMgdG8gZXNzZW50aWFsbHkKLSJhZGQiICh3aXRoIHRoZSBkZWJ1Z2dlcikgc291cmNlIGxpbmVzIGZyb20gdGhlIGluY2x1ZGUgZmlsZXMgdGhhdCBjb250YWluIHRoZQotaW5saW5lIGZ1bmN0aW9ucy4gIFRodXMgd2hlbiB5b3Ugc3RlcCBpbnRvIGFuIGlubGluZSBmdW5jdGlvbiBpdCBhcHBlYXJzIGFzIGlmCi15b3UgaGF2ZSBjYWxsZWQgdGhlIGZ1bmN0aW9uLCBhbmQgeW91IGNhbiBleGFtaW5lIHZhcmlhYmxlcyBhbmQgc28gZm9ydGguIAotVGhlcmUgYXJlIHNldmVyYWwgKnZlcnkqIGltcG9ydGFudCBkaWZmZXJlbmNlcywgaG93ZXZlci4gIEZpcnN0IG9mIGFsbCwgc2luY2UKLXRoZXJlIGlzIG5vIGZ1bmN0aW9uIGNhbGwgaW52b2x2ZWQsIHlvdSBjYW5ub3Qgc3RlcCBvdmVyIHRoZSBpbmxpbmUgZnVuY3Rpb24KLWNhbGwgLSB5b3UgYWx3YXlzIHN0ZXAgaW50byBpdC4gU2Vjb25kbHksIHNpbmNlIHRoZSBzYW1lIHNvdXJjZSBsaW5lcyBhcmUgdXNlZAotaW4gbWFueSBsb2NhdGlvbnMsIHRoZXJlIGlzIGEgc2VwZXJhdGUgY29weSBvZiB0aGUgc291cmNlIGZvciAqZWFjaCogdXNhZ2UuIAotV2l0aG91dCB0aGlzLCBicmVha3BvaW50cyBkbyBub3Qgd29yaywgc2luY2Ugd2UgbXVzdCBoYXZlIGEgMS10by0xIG1hcHBpbmcKLWJldHdlZW4gc291cmNlIGxpbmVzIGFuZCBQQy4KLQlTaW5jZSB5b3UgY2Fubm90IHN0ZXAgb3ZlciBpbmxpbmUgZnVuY3Rpb24gY2FsbHMsIGl0IGNhbiBiZSBhIHJlYWwgcGFpbgotaWYgeW91IGFyZSBub3QgcmVhbGx5IGludGVyZXN0ZWQgaW4gd2hhdCBpcyBnb2luZyBvbiBmb3IgdGhhdCBmdW5jdGlvbiBjYWxsLgotV2hhdCBJIGhhdmUgZG9uZSBpcyB0byB1c2UgdGhlICItRCIgc3dpdGNoIGZvciB0aGUgYXNzZW1ibGVyIHRvIHRvZ2dsZSB0aGUKLWZvbGxvd2luZyBiZWhhdmlvci4gIFdpdGggdGhlICItRCIgc3dpdGNoLCBhbGwgaW5saW5lIGZ1bmN0aW9ucyBhcmUgaW5jbHVkZWQgaW4KLXRoZSBvYmplY3QgZmlsZSwgYW5kIHlvdSBjYW4gZGVidWcgZXZlcnl0aGluZy4gIFdpdGhvdXQgdGhlICItRCIgc3dpdGNoCi0oZGVmYXVsdCBjYXNlIHdpdGggVk1TIGltcGxlbWVudGF0aW9uKSwgaW5saW5lIGZ1bmN0aW9ucyBhcmUgaW5jbHVkZWQgKm9ubHkqIGlmCi10aGV5IGRpZCBub3QgY29tZSBmcm9tIHN5c3RlbSBoZWFkZXIgZmlsZXMgKGkuZS4gZnJvbSBHTlVfQ0NfSU5DTFVERTogb3IKLUdOVV9HWFhfSU5DTFVERTopLiAgVGh1cywgd2l0aG91dCB0aGUgc3dpdGNoIHRoZSB1c2VyIG9ubHkgZGVidWdzIGhpcy9oZXIgb3duCi1pbmxpbmUgZnVuY3Rpb25zLCBhbmQgbm90IHRoZSBzeXN0ZW0gb25lcy4gKFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91IGRvCi1hIGxvdCBvZiBzdHJlYW0gSS9PIGluIEMrKykuICBUaGlzIHByb2JhYmx5IHdpbGwgbm90IHByb3ZpZGUgZW5vdWdoIGdyYW51bGFyaXR5Ci1mb3IgbWFueSB1c2VycywgYnV0IGZvciBub3cgdGhpcyBpcyBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwsIGFuZCBJIHdvdWxkCi1saWtlIHRvIHJlZmxlY3QgdXBvbiBpdCBhbmQgZ2V0IHNvbWUgZmVlZGJhY2sgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIuIAotUG9zc2libGUgc29sdXRpb25zIGluY2x1ZGUgYW4gaW50ZXJhY3RpdmUgcHJvbXB0aW5nLCBhIGxvZ2ljYWwgbmFtZSwgb3IgYSBuZXcKLWNvbW1hbmQgbGluZSBvcHRpb24gaW4gZ2NjLmMgKHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRocm91Z2ggc29tZWhvdyB0byB0aGUgZ3V0cwotb2YgdGhlIGFzc2VtYmxlcikuCi0JVGhlIGlubGluZSBmdW5jdGlvbnMgZnJvbSBoZWFkZXIgZmlsZXMgYXBwZWFyIGFmdGVyIHRoZSBzb3VyY2UgY29kZQotZm9yIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCB0aGUgc291cmNlIGZpbGUgaXRzZWxmIGlzCi1udW1iZXJlZCB3aXRoIHRoZSBzYW1lIGxpbmUgbnVtYmVycyB0aGF0IHlvdSBnZXQgd2l0aCBhbiBlZGl0b3IuICBJbiBhZGRpdGlvbiwKLXRoZSBlbnRpcmUgaGVhZGVyIGZpbGUgaXMgbm90IGluY2x1ZGVkLCBzaW5jZSB0aGUgYXNzZW1ibGVyIG1ha2VzIGEgbGlzdCBvZgotdGhlIG1pbiBhbmQgbWF4IHNvdXJjZSBsaW5lcyB0aGF0IGFyZSB1c2VkLCBhbmQgb25seSBpbmNsdWRlcyB0aG9zZSBsaW5lcyBmcm9tCi10aGUgZmlyc3QgdG8gdGhlIGxhc3QgYWN0dWFsbHkgdXNlZC4gKEl0IGlzIGVhc3kgdG8gY2hhbmdlIGl0IHRvIGluY2x1ZGUgdGhlCi13aG9sZSBmaWxlKS4KLQotCTgpIFdoZW4geW91IGFyZSBkZWJ1Z2dpbmcgQysrIG9iamVjdHMsIHRoZSBvYmplY3QgInRoaXMiIGlzIHJlZmVyZWQgdG8KLWFzICIkdGhpcyIuICBBY3R1YWxseSwgdGhlIGNvbXBpbGVyIHdyaXRlcyBpdCBhcyAiLnRoaXMiLCBidXQgdGhlIHBlcmlvZCBpcwotbm90IGdvb2QgZm9yIHRoZSBkZWJ1Z2dlciwgc28gSSBoYXZlIGEgcm91dGluZSB0byBjb252ZXJ0IGl0IHRvIGEgJC4gIChJdAotYWN0dWFsbHkgY29udmVydHMgYWxsIHBlcmlvZHMgdG8gJCwgYnV0IG9ubHkgZm9yIHZhcmlhYmxlcywgc2luY2UgdGhpcyB3YXMKLWludGVuZGVkIHRvIGFsbG93IHVzIHRvIGFjY2VzcyAidGhpcyIuCi0KLQk5KSBJZiB5b3UgdXNlIHRoZSBhc20oIi4uLiIpIGtleXdvcmQgZm9yIGdsb2JhbCBzeW1ib2xzLCB5b3Ugd2lsbCBub3QKLWJlIGFibGUgdG8gc2VlIHRoYXQgc3ltYm9sIHdpdGggdGhlIGRlYnVnZ2VyLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHRoZXJlIGFyZSB0d28KLXJlY29yZHMgZm9yIHRoZSBzeW1ib2wgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZXMgb2YgdGhlIGFzc2VtYmxlci4gIE9uZQotY29udGFpbnMgdGhlIGluZm8gc3VjaCBhcyBwc2VjdCBudW1iZXIgYW5kIG9mZnNldCwgYW5kIHRoZSBvdGhlciBvbmUgY29udGFpbnMKLXRoZSBpbmZvcm1hdGlvbiBoYXZpbmcgdG8gZG8gd2l0aCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4gIEluIG9yZGVyIHRvCi1kZWJ1ZyBhcyBzeW1ib2wsIHlvdSBuZWVkIHRvIGJlIGFibGUgdG8gY29vcmVsYXRlIHRoZXNlIHJlY29yZHMsIGFuZCB0aGUgb25seQotd2F5IHRvIGRvIHRoaXMgaXMgYnkgbmFtZS4gIFRoZSByZWNvcmQgd2l0aCB0aGUgc3RvcmFnZSBhdHRyaWJ1dGVzIHdpbGwgdGFrZQotdGhlIG5hbWUgdXNlZCBpbiB0aGUgYXNtIGRpcmVjdGl2ZSwgYW5kIHRoZSByZWNvcmQgdGhhdCBzcGVjaWZpZXMgdGhlIGRhdGEgdHlwZQotaGFzIHRoZSBhY3R1YWwgdmFyaWFibGUgbmFtZSwgYW5kIHRodXMgd2hlbiB5b3UgdXNlIHRoZSBhc20gZGlyZWN0aXZlIHRvIGNoYW5nZQotYSB2YXJpYWJsZSBuYW1lLCB0aGUgc3ltYm9sIGJlY29tZXMgaW52aXNpYmxlLgotCi0JMTApIE9sZGVyIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciAoIEdOVS1DIDEuMzcuOTIgYW5kIGVhcmxpZXIpIHBsYWNlCi1nbG9iYWwgY29uc3RhbnRzIGluIHRoZSB0ZXh0IHBzZWN0LiAgVGhpcyBpcyB1bmZvcnR1bmF0ZSwgc2luY2UgdG8gdGhlIGxpbmtlcgotdGhpcyBhcHBlYXJzIHRvIGJlIGFuIGVudHJ5IHBvaW50LiAgSSBzZW50IGEgcGF0Y2ggdG8gdGhlIGNvbXBpbGVyIHRvIFJNUywKLXdoaWNoIHdpbGwgZ2VuZXJhdGUgYSAuY29uc3Qgc2VjdGlvbiBmb3IgdGhlc2UgdmFyaWFibGVzLCBhbmQgcGF0Y2hlZCB0aGUKLWFzc2VtYmxlciB0byBwdXQgdGhlc2UgdmFyaWFibGVzIGludG8gYSBwc2VjdCBqdXN0IGxpa2UgdGhhdCBmb3Igbm9ybWFsCi12YXJpYWJsZXMsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIG1hcmtlZCBOT1dSVC4gIHN0YXRpYyBjb25zdGFudHMgYXJlIHN0aWxsCi1wbGFjZWQgaW4gdGhlIHRleHQgcHNlY3QsIHNpbmNlIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFueSBleHRlcm5hbCBhY2Nlc3MuCmRpZmYgLS1naXQgYS9nYXMvYWNpbmNsdWRlLm00IGIvZ2FzL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhMmMxNi4uMDAwMDAwMAotLS0gYS9nYXMvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotZG5sIEdBU19DSEVDS19ERUNMX05FRURFRChuYW1lLCB0eXBlZGVmbmFtZSwgdHlwZWRlZiwgaGVhZGVycykKLUFDX0RFRlVOKEdBU19DSEVDS19ERUNMX05FRURFRCxbCi1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgJDEpCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2RlY2xfbmVlZGVkXyQxLAotQUNfVFJZX0xJTksoWyQ0XSwKLVsKLXR5cGVkZWYgJDM7Ci0kMiB4OwoteCA9ICgkMikgJDE7Ci1dLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9bm8sIGdhc19jdl9kZWNsX25lZWRlZF8kMT15ZXMpKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2RlY2xfbmVlZGVkXyQxKQotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkXyQxID0geWVzOyB0aGVuCi0gQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICBbRGVmaW5lIGlmICQxIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLl0pCi1maQotXSlkbmwKLWRubAotZG5sIFNvbWUgbm9uLUFOU0kgcHJlcHJvY2Vzc29ycyBib3RjaCByZXF1b3RpbmcgaW5zaWRlIHN0cmluZ3MuICBUaGF0J3MgYmFkCi1kbmwgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLWRubCB3b3JraW5nIHByb3Blcmx5IQotZG5sIEdBU19XT1JLSU5HX0FTU0VSVAotQUNfREVGVU4oR0FTX1dPUktJTkdfQVNTRVJULAotW0FDX01TR19DSEVDS0lORyhbZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvXSkKLUFDX0NBQ0hFX1ZBTChnYXNfY3ZfYXNzZXJ0X29rLAotQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPl0sIFsKLS8qIGNoZWNrIGZvciByZXF1b3RpbmcgcHJvYmxlbXMgKi8KLXN0YXRpYyBpbnQgYSwgYiwgYywgZDsKLXN0YXRpYyBjaGFyICpzOwotYXNzZXJ0ICghc3RyY21wKHMsICJmb28gYmFyIGJheiBxdXV4IikpOwotLyogY2hlY2sgZm9yIG5ld2xpbmUgaGFuZGxpbmcgKi8KLWFzc2VydCAoYSA9PSBiCi0gICAgICAgIHx8IGMgPT0gZCk7Ci1dLCBnYXNfY3ZfYXNzZXJ0X29rPXllcywgZ2FzX2N2X2Fzc2VydF9vaz1ubykpZG5sCi1BQ19NU0dfUkVTVUxUKCRnYXNfY3ZfYXNzZXJ0X29rKQotdGVzdCAkZ2FzX2N2X2Fzc2VydF9vayA9IHllcyB8fCBBQ19ERUZJTkUoQlJPS0VOX0FTU0VSVCwgMSwgW2Fzc2VydCBicm9rZW4/XSkKLV0pZG5sCi1kbmwKLWRubCBTaW5jZSBtYW55IEJvdXJuZSBzaGVsbCBpbXBsZW1lbnRhdGlvbnMgbGFjayBzdWJyb3V0aW5lcywgdXNlIHRoaXMKLWRubCBoYWNrIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIGluIGNvbmZpZ3VyZS5pbi4KLWRubCBHQVNfVU5JUShsaXN0dmFyKQotQUNfREVGVU4oR0FTX1VOSVEsCi1bX2dhc191bmlxX2xpc3Q9IlskXSQxIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWRubCBQcm90ZWN0IGFnYWluc3QgZW1wdHkgaW5wdXQgbGlzdC4KLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgWyRdX2dhc191bmlxX2xpc3QgOyBkbwotICBjYXNlIFskXV9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiIFskXV9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiBbJF1fZ2FzX3VuaXFfaSAiKikgOzsKLSAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iWyRdX2dhc191bmlxX25ld2xpc3QgWyRdX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotJDE9WyRdX2dhc191bmlxX25ld2xpc3QKLV0pZG5sCmRpZmYgLS1naXQgYS9nYXMvYWNsb2NhbC5tNCBiL2dhcy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmJlNDY4Li4wMDAwMDAwCi0tLSBhL2dhcy9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTE3NSArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotZG5sIEdBU19DSEVDS19ERUNMX05FRURFRChuYW1lLCB0eXBlZGVmbmFtZSwgdHlwZWRlZiwgaGVhZGVycykKLUFDX0RFRlVOKEdBU19DSEVDS19ERUNMX05FRURFRCxbCi1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgJDEpCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2RlY2xfbmVlZGVkXyQxLAotQUNfVFJZX0xJTksoWyQ0XSwKLVsKLXR5cGVkZWYgJDM7Ci0kMiB4OwoteCA9ICgkMikgJDE7Ci1dLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9bm8sIGdhc19jdl9kZWNsX25lZWRlZF8kMT15ZXMpKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2RlY2xfbmVlZGVkXyQxKQotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkXyQxID0geWVzOyB0aGVuCi0gQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICBbRGVmaW5lIGlmICQxIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLl0pCi1maQotXSlkbmwKLWRubAotZG5sIFNvbWUgbm9uLUFOU0kgcHJlcHJvY2Vzc29ycyBib3RjaCByZXF1b3RpbmcgaW5zaWRlIHN0cmluZ3MuICBUaGF0J3MgYmFkCi1kbmwgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLWRubCB3b3JraW5nIHByb3Blcmx5IQotZG5sIEdBU19XT1JLSU5HX0FTU0VSVAotQUNfREVGVU4oR0FTX1dPUktJTkdfQVNTRVJULAotW0FDX01TR19DSEVDS0lORyhbZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvXSkKLUFDX0NBQ0hFX1ZBTChnYXNfY3ZfYXNzZXJ0X29rLAotQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPl0sIFsKLS8qIGNoZWNrIGZvciByZXF1b3RpbmcgcHJvYmxlbXMgKi8KLXN0YXRpYyBpbnQgYSwgYiwgYywgZDsKLXN0YXRpYyBjaGFyICpzOwotYXNzZXJ0ICghc3RyY21wKHMsICJmb28gYmFyIGJheiBxdXV4IikpOwotLyogY2hlY2sgZm9yIG5ld2xpbmUgaGFuZGxpbmcgKi8KLWFzc2VydCAoYSA9PSBiCi0gICAgICAgIHx8IGMgPT0gZCk7Ci1dLCBnYXNfY3ZfYXNzZXJ0X29rPXllcywgZ2FzX2N2X2Fzc2VydF9vaz1ubykpZG5sCi1BQ19NU0dfUkVTVUxUKCRnYXNfY3ZfYXNzZXJ0X29rKQotdGVzdCAkZ2FzX2N2X2Fzc2VydF9vayA9IHllcyB8fCBBQ19ERUZJTkUoQlJPS0VOX0FTU0VSVCwgMSwgW2Fzc2VydCBicm9rZW4/XSkKLV0pZG5sCi1kbmwKLWRubCBTaW5jZSBtYW55IEJvdXJuZSBzaGVsbCBpbXBsZW1lbnRhdGlvbnMgbGFjayBzdWJyb3V0aW5lcywgdXNlIHRoaXMKLWRubCBoYWNrIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIGluIGNvbmZpZ3VyZS5pbi4KLWRubCBHQVNfVU5JUShsaXN0dmFyKQotQUNfREVGVU4oR0FTX1VOSVEsCi1bX2dhc191bmlxX2xpc3Q9IlskXSQxIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWRubCBQcm90ZWN0IGFnYWluc3QgZW1wdHkgaW5wdXQgbGlzdC4KLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgWyRdX2dhc191bmlxX2xpc3QgOyBkbwotICBjYXNlIFskXV9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiIFskXV9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiBbJF1fZ2FzX3VuaXFfaSAiKikgOzsKLSAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iWyRdX2dhc191bmlxX25ld2xpc3QgWyRdX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotJDE9WyRdX2dhc191bmlxX25ld2xpc3QKLV0pZG5sCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+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+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLQotZG5sIEFNX1BST0dfTEVYCi1kbmwgTG9vayBmb3IgZmxleCwgbGV4IG9yIG1pc3NpbmcsIHRoZW4gcnVuIEFDX1BST0dfTEVYIGFuZCBBQ19ERUNMX1lZVEVYVAotQUNfREVGVU4oQU1fUFJPR19MRVgsCi1bbWlzc2luZ19kaXI9aWZlbHNlKFskMV0sLGBjZCAkYWNfYXV4X2RpciAmJiBwd2RgLCQxKQotQUNfQ0hFQ0tfUFJPR1MoTEVYLCBmbGV4IGxleCwgIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiKQotQUNfUFJPR19MRVgKLUFDX0RFQ0xfWVlURVhUXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCmRpZmYgLS1naXQgYS9nYXMvYXBwLmMgYi9nYXMvYXBwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDU3OWQuLjAwMDAwMDAKLS0tIGEvZ2FzL2FwcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI3NCArMCwwIEBACi0vKiBUaGlzIGlzIHRoZSBBc3NlbWJsZXIgUHJlLVByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTW9kaWZpZWQgYnkgQWxsZW4gV2lyZnMtQnJvY2ssIEluc3RhbnRpYXRpb25zIEluYyAyLzkwICovCi0vKiBBcHAsIHRoZSBhc3NlbWJsZXIgcHJlLXByb2Nlc3Nvci4gIFRoaXMgcHJlLXByb2Nlc3NvciBzdHJpcHMgb3V0IGV4Y2VzcwotICAgc3BhY2VzLCB0dXJucyBzaW5nbGUtcXVvdGVkIGNoYXJhY3RlcnMgaW50byBhIGRlY2ltYWwgY29uc3RhbnQsIGFuZCB0dXJucwotICAgIyA8bnVtYmVyPiA8ZmlsZW5hbWU+IDxnYXJiYWdlPiBpbnRvIGEgLmxpbmUgPG51bWJlcj5cbi5maWxlIDxmaWxlbmFtZT4KLSAgIHBhaXIuICBUaGlzIG5lZWRzIGJldHRlciBlcnJvci1oYW5kbGluZy4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCQkJLyogRm9yIEJBRF9DQVNFKCkgb25seSAqLwotCi0jaWYgKF9fU1REQ19fICE9IDEpCi0jaWZuZGVmIGNvbnN0Ci0jZGVmaW5lIGNvbnN0ICAvKiBlbXB0eSAqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogV2hldGhlciB3ZSBhcmUgc2NydWJiaW5nIGluIG02OGsgTVJJIG1vZGUuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tCi0gICBmbGFnX202OGtfbXJpLCBiZWNhdXNlIHRoZSB0d28gZmxhZ3Mgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGUgLm1yaQotICAgcHNldWRvLW9wIGF0IGRpZmZlcmVudCB0aW1lcy4gICovCi1zdGF0aWMgaW50IHNjcnViX202OGtfbXJpOwotCi0vKiBUaGUgcHNldWRvLW9wIHdoaWNoIHN3aXRjaGVzIGluIGFuZCBvdXQgb2YgTVJJIG1vZGUuICBTZWUgdGhlCi0gICBjb21tZW50IGluIGRvX3NjcnViX2NoYXJzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIG1yaV9wc2V1ZG9bXSA9ICIubXJpIDAiOwotCi0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0vKiBUaGUgcHNldWRvLW9wIGZvciB3aGljaCB3ZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSBgQCcgY2hhcmFjdGVycy4gCi0gICBTZWUgdGhlIGNvbW1lbnQgaW4gZG9fc2NydWJfY2hhcnMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgICBzeW12ZXJfcHNldWRvW10gPSAiLnN5bXZlciI7Ci1zdGF0aWMgY29uc3QgY2hhciAqIHN5bXZlcl9zdGF0ZTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciBsZXhbMjU2XTsKLXN0YXRpYyBjb25zdCBjaGFyIHN5bWJvbF9jaGFyc1tdID0KLSIkLl9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSI7Ci0KLSNkZWZpbmUgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQJCTEKLSNkZWZpbmUgTEVYX0lTX1dISVRFU1BBQ0UJCTIKLSNkZWZpbmUgTEVYX0lTX0xJTkVfU0VQQVJBVE9SCQkzCi0jZGVmaW5lIExFWF9JU19DT01NRU5UX1NUQVJUCQk0Ci0jZGVmaW5lIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQJNQotI2RlZmluZQlMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVAk2Ci0jZGVmaW5lCUxFWF9JU19TVFJJTkdRVU9URQkJOAotI2RlZmluZQlMRVhfSVNfQ09MT04JCQk5Ci0jZGVmaW5lCUxFWF9JU19ORVdMSU5FCQkJMTAKLSNkZWZpbmUJTEVYX0lTX09ORUNIQVJfUVVPVEUJCTExCi0jaWZkZWYgVENfVjg1MAotI2RlZmluZSBMRVhfSVNfRE9VQkxFREFTSF8xU1QJCTEyCi0jZW5kaWYKLSNpZmRlZiBUQ19NMzJSCi0jZGVmaW5lIExFWF9JU19ET1VCTEVCQVJfMVNUCQkxMwotI2VuZGlmCi0jZGVmaW5lIElTX1NZTUJPTF9DT01QT05FTlQoYykJCShsZXhbY10gPT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCi0jZGVmaW5lIElTX1dISVRFU1BBQ0UoYykJCShsZXhbY10gPT0gTEVYX0lTX1dISVRFU1BBQ0UpCi0jZGVmaW5lIElTX0xJTkVfU0VQQVJBVE9SKGMpCQkobGV4W2NdID09IExFWF9JU19MSU5FX1NFUEFSQVRPUikKLSNkZWZpbmUgSVNfQ09NTUVOVChjKQkJCShsZXhbY10gPT0gTEVYX0lTX0NPTU1FTlRfU1RBUlQpCi0jZGVmaW5lIElTX0xJTkVfQ09NTUVOVChjKQkJKGxleFtjXSA9PSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUKQotI2RlZmluZQlJU19ORVdMSU5FKGMpCQkJKGxleFtjXSA9PSBMRVhfSVNfTkVXTElORSkKLQotc3RhdGljIGludCBwcm9jZXNzX2VzY2FwZSBQQVJBTVMgKChpbnQpKTsKLQotLyogRklYTUUtc29vbjogVGhlIGVudGlyZSBsZXhlci9wYXJzZXIgdGhpbmd5IHNob3VsZCBiZQotICAgYnVpbHQgc3RhdGljYWxseSBhdCBjb21waWxlIHRpbWUgcmF0aGVyIHRoYW4gZHluYW1pY2FsbHkKLSAgIGVhY2ggYW5kIGV2ZXJ5IHRpbWUgdGhlIGFzc2VtYmxlciBpcyBydW4uICB4b3hvcmljaC4gKi8KLQotdm9pZCAKLWRvX3NjcnViX2JlZ2luIChtNjhrX21yaSkKLSAgICAgaW50IG02OGtfbXJpOwotewotICBjb25zdCBjaGFyICpwOwotICBpbnQgYzsKLQotICBzY3J1Yl9tNjhrX21yaSA9IG02OGtfbXJpOwotCi0gIGxleFsnICddID0gTEVYX0lTX1dISVRFU1BBQ0U7Ci0gIGxleFsnXHQnXSA9IExFWF9JU19XSElURVNQQUNFOwotICBsZXhbJ1xyJ10gPSBMRVhfSVNfV0hJVEVTUEFDRTsKLSAgbGV4WydcbiddID0gTEVYX0lTX05FV0xJTkU7Ci0gIGxleFsnOyddID0gTEVYX0lTX0xJTkVfU0VQQVJBVE9SOwotICBsZXhbJzonXSA9IExFWF9JU19DT0xPTjsKLQotICBpZiAoISBtNjhrX21yaSkKLSAgICB7Ci0gICAgICBsZXhbJyInXSA9IExFWF9JU19TVFJJTkdRVU9URTsKLQotI2lmbmRlZiBUQ19IUFBBCi0gICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfT05FQ0hBUl9RVU9URTsKLSNlbmRpZgotCi0jaWZkZWYgU0lOR0xFX1FVT1RFX1NUUklOR1MKLSAgICAgIGxleFsnXCcnXSA9IExFWF9JU19TVFJJTkdRVU9URTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBOb3RlOiBpZiBhbnkgb3RoZXIgY2hhcmFjdGVyIGNhbiBiZSBMRVhfSVNfU1RSSU5HUVVPVEUsIHRoZSBsb29wCi0gICAgIGluIHN0YXRlIDUgb2YgZG9fc2NydWJfY2hhcnMgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KLQotICAvKiBOb3RlIHRoYXQgdGhlc2Ugb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGRlZmF1bHRzLCBlLmcuIGlmICc7JyBpcyBhCi0gICAgIGNvbW1lbnQgY2hhciwgdGhlbiBpdCBpc24ndCBhIGxpbmUgc2VwYXJhdG9yLiAgKi8KLSAgZm9yIChwID0gc3ltYm9sX2NoYXJzOyAqcDsgKytwKQotICAgIHsKLSAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7Ci0gICAgfQkJCQkvKiBkZWNsYXJlIHN5bWJvbCBjaGFyYWN0ZXJzICovCi0KLSAgZm9yIChjID0gMTI4OyBjIDwgMjU2OyArK2MpCi0gICAgbGV4W2NdID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7Ci0KLSNpZmRlZiB0Y19zeW1ib2xfY2hhcnMKLSAgLyogVGhpcyBtYWNybyBwZXJtaXRzIHRoZSBwcm9jZXNzb3IgdG8gc3BlY2lmeSBhbGwgY2hhcmFjdGVycyB3aGljaAotICAgICBtYXkgYXBwZWFycyBpbiBhbiBvcGVyYW5kLiAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHNjcnViYmVyIGZyb20KLSAgICAgZGlzY2FyZGluZyBtZWFuaW5nZnVsIHdoaXRlc3BhY2UgaW4gY2VydGFpbiBjYXNlcy4gIFRoZSBpMzg2Ci0gICAgIGJhY2tlbmQgdXNlcyB0aGlzIHRvIHN1cHBvcnQgcHJlZml4ZXMsIHdoaWNoIGNhbiBjb25mdXNlIHRoZQotICAgICBzY3J1YmJlciBhcyB0byB3aGV0aGVyIGl0IGlzIHBhcnNpbmcgb3BlcmFuZHMgb3Igb3Bjb2Rlcy4gICovCi0gIGZvciAocCA9IHRjX3N5bWJvbF9jaGFyczsgKnA7ICsrcCkKLSAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotI2VuZGlmCi0KLSAgLyogVGhlIG02OGsgYmFja2VuZCB3YW50cyB0byBiZSBhYmxlIHRvIGNoYW5nZSBjb21tZW50X2NoYXJzLiAgKi8KLSNpZm5kZWYgdGNfY29tbWVudF9jaGFycwotI2RlZmluZSB0Y19jb21tZW50X2NoYXJzIGNvbW1lbnRfY2hhcnMKLSNlbmRpZgotICBmb3IgKHAgPSB0Y19jb21tZW50X2NoYXJzOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX0NPTU1FTlRfU1RBUlQ7Ci0gICAgfQkJCQkvKiBkZWNsYXJlIGNvbW1lbnQgY2hhcnMgKi8KLQotICBmb3IgKHAgPSBsaW5lX2NvbW1lbnRfY2hhcnM7ICpwOyBwKyspCi0gICAgewotICAgICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOwotICAgIH0JCQkJLyogZGVjbGFyZSBsaW5lIGNvbW1lbnQgY2hhcnMgKi8KLQotICBmb3IgKHAgPSBsaW5lX3NlcGFyYXRvcl9jaGFyczsgKnA7IHArKykKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19MSU5FX1NFUEFSQVRPUjsKLSAgICB9CQkJCS8qIGRlY2xhcmUgbGluZSBzZXBhcmF0b3JzICovCi0KLSAgLyogT25seSBhbGxvdyBzbGFzaC1zdGFyIGNvbW1lbnRzIGlmIHNsYXNoIGlzIG5vdCBpbiB1c2UuCi0gICAgIEZJWE1FOiBUaGlzIGlzbid0IHJpZ2h0LiAgV2Ugc2hvdWxkIGFsd2F5cyBwZXJtaXQgdGhlbS4gICovCi0gIGlmIChsZXhbJy8nXSA9PSAwKQotICAgIHsKLSAgICAgIGxleFsnLyddID0gTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1Q7Ci0gICAgfQotCi0gIGlmIChtNjhrX21yaSkKLSAgICB7Ci0gICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0gICAgICBsZXhbJzsnXSA9IExFWF9JU19DT01NRU5UX1NUQVJUOwotICAgICAgbGV4WycqJ10gPSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOwotICAgICAgLyogVGhlIE1SSSBkb2N1bWVudGF0aW9uIHNheXMgJyEnIGlzIExFWF9JU19DT01NRU5UX1NUQVJULCBidXQKLSAgICAgICAgIHRoZW4gaXQgY2FuJ3QgYmUgdXNlZCBpbiBhbiBleHByZXNzaW9uLiAgKi8KLSAgICAgIGxleFsnISddID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICB9Ci0KLSNpZmRlZiBUQ19WODUwCi0gIGxleFsnLSddID0gTEVYX0lTX0RPVUJMRURBU0hfMVNUOwotI2VuZGlmCi0jaWZkZWYgVENfTTMyUgotICBsZXhbJ3wnXSA9IExFWF9JU19ET1VCTEVCQVJfMVNUOwotI2VuZGlmCi0jaWZkZWYgVENfRDMwVgotICAvKiBtdXN0IGRvIHRoaXMgaXMgd2Ugd2FudCBWTElXIGluc3RydWN0aW9uIHdpdGggIi0+IiBvciAiPC0iICovCi0gIGxleFsnLSddID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7Ci0jZW5kaWYKLX0JCQkJLyogZG9fc2NydWJfYmVnaW4oKSAqLwotCi0vKiBTYXZlZCBzdGF0ZSBvZiB0aGUgc2NydWJiZXIgKi8KLXN0YXRpYyBpbnQgc3RhdGU7Ci1zdGF0aWMgaW50IG9sZF9zdGF0ZTsKLXN0YXRpYyBjaGFyICpvdXRfc3RyaW5nOwotc3RhdGljIGNoYXIgb3V0X2J1ZlsyMF07Ci1zdGF0aWMgaW50IGFkZF9uZXdsaW5lczsKLXN0YXRpYyBjaGFyICpzYXZlZF9pbnB1dDsKLXN0YXRpYyBpbnQgc2F2ZWRfaW5wdXRfbGVuOwotc3RhdGljIGNoYXIgaW5wdXRfYnVmZmVyWzMyICogMTAyNF07Ci1zdGF0aWMgY29uc3QgY2hhciAqbXJpX3N0YXRlOwotc3RhdGljIGNoYXIgbXJpX2xhc3RfY2g7Ci0KLS8qIERhdGEgc3RydWN0dXJlIGZvciBzYXZpbmcgdGhlIHN0YXRlIG9mIGFwcCBhY3Jvc3MgI2luY2x1ZGUncy4gIE5vdGUgdGhhdAotICAgYXBwIGlzIGNhbGxlZCBhc3luY2hyb25vdXNseSB0byB0aGUgcGFyc2luZyBvZiB0aGUgLmluY2x1ZGUncywgc28gb3VyCi0gICBzdGF0ZSBhdCB0aGUgdGltZSAuaW5jbHVkZSBpcyBpbnRlcnByZXRlZCBpcyBjb21wbGV0ZWx5IHVucmVsYXRlZC4KLSAgIFRoYXQncyB3aHkgd2UgaGF2ZSB0byBzYXZlIGl0IGFsbC4gICovCi0KLXN0cnVjdCBhcHBfc2F2ZQotICB7Ci0gICAgaW50ICAgICAgICAgIHN0YXRlOwotICAgIGludCAgICAgICAgICBvbGRfc3RhdGU7Ci0gICAgY2hhciAqICAgICAgIG91dF9zdHJpbmc7Ci0gICAgY2hhciAgICAgICAgIG91dF9idWZbc2l6ZW9mIChvdXRfYnVmKV07Ci0gICAgaW50ICAgICAgICAgIGFkZF9uZXdsaW5lczsKLSAgICBjaGFyICogICAgICAgc2F2ZWRfaW5wdXQ7Ci0gICAgaW50ICAgICAgICAgIHNhdmVkX2lucHV0X2xlbjsKLSAgICBpbnQgICAgICAgICAgc2NydWJfbTY4a19tcmk7Ci0gICAgY29uc3QgY2hhciAqIG1yaV9zdGF0ZTsKLSAgICBjaGFyICAgICAgICAgbXJpX2xhc3RfY2g7Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0gICAgY29uc3QgY2hhciAqIHN5bXZlcl9zdGF0ZTsKLSNlbmRpZgotICB9OwotCi1jaGFyICoKLWFwcF9wdXNoICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBhcHBfc2F2ZSAqc2F2ZWQ7Ci0KLSAgc2F2ZWQgPSAoc3RydWN0IGFwcF9zYXZlICopIHhtYWxsb2MgKHNpemVvZiAoKnNhdmVkKSk7Ci0gIHNhdmVkLT5zdGF0ZSA9IHN0YXRlOwotICBzYXZlZC0+b2xkX3N0YXRlID0gb2xkX3N0YXRlOwotICBzYXZlZC0+b3V0X3N0cmluZyA9IG91dF9zdHJpbmc7Ci0gIG1lbWNweSAoc2F2ZWQtPm91dF9idWYsIG91dF9idWYsIHNpemVvZiAob3V0X2J1ZikpOwotICBzYXZlZC0+YWRkX25ld2xpbmVzID0gYWRkX25ld2xpbmVzOwotICBpZiAoc2F2ZWRfaW5wdXQgPT0gTlVMTCkKLSAgICBzYXZlZC0+c2F2ZWRfaW5wdXQgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgc2F2ZWQtPnNhdmVkX2lucHV0ID0geG1hbGxvYyAoc2F2ZWRfaW5wdXRfbGVuKTsKLSAgICAgIG1lbWNweSAoc2F2ZWQtPnNhdmVkX2lucHV0LCBzYXZlZF9pbnB1dCwgc2F2ZWRfaW5wdXRfbGVuKTsKLSAgICAgIHNhdmVkLT5zYXZlZF9pbnB1dF9sZW4gPSBzYXZlZF9pbnB1dF9sZW47Ci0gICAgfQotICBzYXZlZC0+c2NydWJfbTY4a19tcmkgPSBzY3J1Yl9tNjhrX21yaTsKLSAgc2F2ZWQtPm1yaV9zdGF0ZSA9IG1yaV9zdGF0ZTsKLSAgc2F2ZWQtPm1yaV9sYXN0X2NoID0gbXJpX2xhc3RfY2g7Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0gIHNhdmVkLT5zeW12ZXJfc3RhdGUgPSBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLQotICAvKiBkb19zY3J1Yl9iZWdpbigpIGlzIG5vdCB1c2VmdWwsIGp1c3Qgd2FzdGVzIHRpbWUuICovCi0KLSAgc3RhdGUgPSAwOwotICBzYXZlZF9pbnB1dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIChjaGFyICopIHNhdmVkOwotfQotCi12b2lkIAotYXBwX3BvcCAoYXJnKQotICAgICBjaGFyICphcmc7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBhcHBfc2F2ZSAqc2F2ZWQgPSAoc3RydWN0IGFwcF9zYXZlICopIGFyZzsKLQotICAvKiBUaGVyZSBpcyBubyBkb19zY3J1Yl9lbmQgKCkuICovCi0gIHN0YXRlID0gc2F2ZWQtPnN0YXRlOwotICBvbGRfc3RhdGUgPSBzYXZlZC0+b2xkX3N0YXRlOwotICBvdXRfc3RyaW5nID0gc2F2ZWQtPm91dF9zdHJpbmc7Ci0gIG1lbWNweSAob3V0X2J1Ziwgc2F2ZWQtPm91dF9idWYsIHNpemVvZiAob3V0X2J1ZikpOwotICBhZGRfbmV3bGluZXMgPSBzYXZlZC0+YWRkX25ld2xpbmVzOwotICBpZiAoc2F2ZWQtPnNhdmVkX2lucHV0ID09IE5VTEwpCi0gICAgc2F2ZWRfaW5wdXQgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgYXNzZXJ0IChzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuIDw9IChpbnQpIChzaXplb2YgaW5wdXRfYnVmZmVyKSk7Ci0gICAgICBtZW1jcHkgKGlucHV0X2J1ZmZlciwgc2F2ZWQtPnNhdmVkX2lucHV0LCBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuKTsKLSAgICAgIHNhdmVkX2lucHV0ID0gaW5wdXRfYnVmZmVyOwotICAgICAgc2F2ZWRfaW5wdXRfbGVuID0gc2F2ZWQtPnNhdmVkX2lucHV0X2xlbjsKLSAgICAgIGZyZWUgKHNhdmVkLT5zYXZlZF9pbnB1dCk7Ci0gICAgfQotICBzY3J1Yl9tNjhrX21yaSA9IHNhdmVkLT5zY3J1Yl9tNjhrX21yaTsKLSAgbXJpX3N0YXRlID0gc2F2ZWQtPm1yaV9zdGF0ZTsKLSAgbXJpX2xhc3RfY2ggPSBzYXZlZC0+bXJpX2xhc3RfY2g7Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0gIHN5bXZlcl9zdGF0ZSA9IHNhdmVkLT5zeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLQotICBmcmVlIChhcmcpOwotfQkJCQkvKiBhcHBfcG9wKCkgKi8KLQotLyogQEAgVGhpcyBhc3N1bWVzIHRoYXQgXG4gJmMgYXJlIHRoZSBzYW1lIG9uIGhvc3QgYW5kIHRhcmdldC4gIFRoaXMgaXMgbm90Ci0gICBuZWNlc3NhcmlseSB0cnVlLiAgKi8KLXN0YXRpYyBpbnQgCi1wcm9jZXNzX2VzY2FwZSAoY2gpCi0gICAgIGludCBjaDsKLXsKLSAgc3dpdGNoIChjaCkKLSAgICB7Ci0gICAgY2FzZSAnYic6Ci0gICAgICByZXR1cm4gJ1xiJzsKLSAgICBjYXNlICdmJzoKLSAgICAgIHJldHVybiAnXGYnOwotICAgIGNhc2UgJ24nOgotICAgICAgcmV0dXJuICdcbic7Ci0gICAgY2FzZSAncic6Ci0gICAgICByZXR1cm4gJ1xyJzsKLSAgICBjYXNlICd0JzoKLSAgICAgIHJldHVybiAnXHQnOwotICAgIGNhc2UgJ1wnJzoKLSAgICAgIHJldHVybiAnXCcnOwotICAgIGNhc2UgJyInOgotICAgICAgcmV0dXJuICdcIic7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBjaDsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgaW5wdXQgY2hhcmFjdGVycy4gIFRoZSBHRVQKLSAgIHBhcmFtZXRlciBpcyB1c2VkIHRvIHJldHJpZXZlIG1vcmUgaW5wdXQgY2hhcmFjdGVycy4gIEdFVCBzaG91bGQKLSAgIHNldCBpdHMgcGFyYW1ldGVyIHRvIHBvaW50IHRvIGEgYnVmZmVyLCBhbmQgcmV0dXJuIHRoZSBsZW5ndGggb2YKLSAgIHRoZSBidWZmZXI7IGl0IHNob3VsZCByZXR1cm4gMCBhdCBlbmQgb2YgZmlsZS4gIFRoZSBzY3J1YmJlZCBvdXRwdXQKLSAgIGNoYXJhY3RlcnMgYXJlIHB1dCBpbnRvIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgVE9TVEFSVDsgdGhlIFRPU1RBUlQKLSAgIGJ1ZmZlciBpcyBUT0xFTiBieXRlcyBpbiBsZW5ndGguICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyCi0gICBvZiBzY3J1YmJlZCBjaGFyYWN0ZXJzIHB1dCBpbnRvIFRPU1RBUlQuICBUaGlzIHdpbGwgYmUgVE9MRU4gdW5sZXNzCi0gICBlbmQgb2YgZmlsZSB3YXMgc2Vlbi4gIFRoaXMgZnVuY3Rpb24gaXMgYXJyYW5nZWQgYXMgYSBzdGF0ZQotICAgbWFjaGluZSwgYW5kIHNhdmVzIGl0cyBzdGF0ZSBzbyB0aGF0IGl0IG1heSByZXR1cm4gYXQgYW55IHBvaW50LgotICAgVGhpcyBpcyB0aGUgd2F5IHRoZSBvbGQgY29kZSB1c2VkIHRvIHdvcmsuICAqLwotCi1pbnQKLWRvX3NjcnViX2NoYXJzIChnZXQsIHRvc3RhcnQsIHRvbGVuKQotICAgICBpbnQgKCpnZXQpIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0gICAgIGNoYXIgKnRvc3RhcnQ7Ci0gICAgIGludCB0b2xlbjsKLXsKLSAgY2hhciAqdG8gPSB0b3N0YXJ0OwotICBjaGFyICp0b2VuZCA9IHRvc3RhcnQgKyB0b2xlbjsKLSAgY2hhciAqZnJvbTsKLSAgY2hhciAqZnJvbWVuZDsKLSAgaW50IGZyb21sZW47Ci0gIHJlZ2lzdGVyIGludCBjaCwgY2gyID0gMDsKLQotICAvKlN0YXRlIDA6IGJlZ2lubmluZyBvZiBub3JtYWwgbGluZQotCSAgMTogQWZ0ZXIgZmlyc3Qgd2hpdGVzcGFjZSBvbiBsaW5lIChmbHVzaCBtb3JlIHdoaXRlKQotCSAgMjogQWZ0ZXIgZmlyc3Qgbm9uLXdoaXRlIChvcGNvZGUpIG9uIGxpbmUgKGtlZXAgMXdoaXRlKQotCSAgMzogYWZ0ZXIgc2Vjb25kIHdoaXRlIG9uIGxpbmUgKGludG8gb3BlcmFuZHMpIChmbHVzaCB3aGl0ZSkKLQkgIDQ6IGFmdGVyIHB1dHRpbmcgb3V0IGEgLmxpbmUsIHB1dCBvdXQgZGlnaXRzCi0JICA1OiBwYXJzaW5nIGEgc3RyaW5nLCB0aGVuIGdvIHRvIG9sZC1zdGF0ZQotCSAgNjogcHV0dGluZyBvdXQgXCBlc2NhcGUgaW4gYSAiZCBzdHJpbmcuCi0JICA3OiBBZnRlciBwdXR0aW5nIG91dCBhIC5hcHBmaWxlLCBwdXQgb3V0IHN0cmluZy4KLQkgIDg6IEFmdGVyIHB1dHRpbmcgb3V0IGEgLmFwcGZpbGUgc3RyaW5nLCBmbHVzaCB1bnRpbCBuZXdsaW5lLgotCSAgOTogQWZ0ZXIgc2VlaW5nIHN5bWJvbCBjaGFyIGluIHN0YXRlIDMgKGtlZXAgMXdoaXRlIGFmdGVyIHN5bWNoYXIpCi0JIDEwOiBBZnRlciBzZWVpbmcgd2hpdGVzcGFjZSBpbiBzdGF0ZSA5IChrZWVwIHdoaXRlIGJlZm9yZSBzeW1jaGFyKQotCSAxMTogQWZ0ZXIgc2VlaW5nIGEgc3ltYm9sIGNoYXJhY3RlciBpbiBzdGF0ZSAwIChlZyBhIGxhYmVsIGRlZmluaXRpb24pCi0JIC0xOiBvdXRwdXQgc3RyaW5nIGluIG91dF9zdHJpbmcgYW5kIGdvIHRvIHRoZSBzdGF0ZSBpbiBvbGRfc3RhdGUKLQkgLTI6IGZsdXNoIHRleHQgdW50aWwgYSAnKicgJy8nIGlzIHNlZW4sIHRoZW4gZ28gdG8gc3RhdGUgb2xkX3N0YXRlCi0jaWZkZWYgVENfVjg1MAotICAgICAgICAgMTI6IEFmdGVyIHNlZWluZyBhIGRhc2gsIGxvb2tpbmcgZm9yIGEgc2Vjb25kIGRhc2ggYXMgYSBzdGFydCBvZiBjb21tZW50LgotI2VuZGlmCi0jaWZkZWYgVENfTTMyUgotCSAxMzogQWZ0ZXIgc2VlaW5nIGEgdmVydGljYWwgYmFyLCBsb29raW5nIGZvciBhIHNlY29uZCB2ZXJ0aWNhbCBiYXIgYXMgYSBwYXJhbGxlbCBleHByZXNzaW9uIHNlcGVyYXRvci4KLSNlbmRpZgotCSAgKi8KLQotICAvKiBJIGFkZGVkIHN0YXRlcyA5IGFuZCAxMCBiZWNhdXNlIHRoZSBNSVBTIEVDT0ZGIGFzc2VtYmxlciB1c2VzCi0gICAgIGNvbnN0cnVjdHMgbGlrZSBgYC5sb2MgMSAyMCcnLiAgVGhpcyB3YXMgdHVybmluZyBpbnRvIGBgLmxvYwotICAgICAxMjAnJy4gIFN0YXRlcyA5IGFuZCAxMCBlbnN1cmUgdGhhdCBhIHNwYWNlIGlzIG5ldmVyIGRyb3BwZWQgaW4KLSAgICAgYmV0d2VlbiBjaGFyYWN0ZXJzIHdoaWNoIGNvdWxkIGFwcGVhciBpbiBhIGlkZW50aWZpZXIuICBJYW4KLSAgICAgVGF5bG9yLCBpYW5AY3lnbnVzLmNvbS4KLQotICAgICBJIGFkZGVkIHN0YXRlIDExIHNvIHRoYXQgc29tZXRoaW5nIGxpa2UgIkxmb28gYWRkICVyMjUsJXIyNiwlcjI3IiB3b3JrcwotICAgICBjb3JyZWN0bHkgb24gdGhlIFBBIChhbmQgYW55IG90aGVyIHRhcmdldCB3aGVyZSBjb2xvbnMgYXJlIG9wdGlvbmFsKS4KLSAgICAgSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdS4KLQotICAgICBJIGFkZGVkIHN0YXRlIDEzIHNvIHRoYXQgc29tZXRoaW5nIGxpa2UgImNtcCByMSwgcjIgfHwgdHJhcCAjMSIgZG9lcyBub3QKLSAgICAgZ2V0IHNxdWFzaGVkIGludG8gImNtcCByMSxyMnx8dHJhcCMxIiwgd2l0aCB0aGUgYWxsIGltcG9ydGFudCBzcGFjZQotICAgICBiZXR3ZWVuIHRoZSAndHJhcCcgYW5kIHRoZSAnIzEnIGJlaW5nIGVsaW1pbmF0ZWQuICBuaWNrY0BjeWdudXMuY29tICAqLwotCi0gIC8qIFRoaXMgbWFjcm8gZ2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuICAqLwotCi0jZGVmaW5lIEdFVCgpCQkJCQkJCVwKLSAgKGZyb20gPCBmcm9tZW5kCQkJCQkJXAotICAgPyAqICh1bnNpZ25lZCBjaGFyICopIChmcm9tKyspCQkJCVwKLSAgIDogKHNhdmVkX2lucHV0ID0gTlVMTCwJCQkJCVwKLSAgICAgIGZyb21sZW4gPSAoKmdldCkgKGlucHV0X2J1ZmZlciwgc2l6ZW9mIGlucHV0X2J1ZmZlciksCVwKLSAgICAgIGZyb20gPSBpbnB1dF9idWZmZXIsCQkJCQlcCi0gICAgICBmcm9tZW5kID0gZnJvbSArIGZyb21sZW4sCQkJCQlcCi0gICAgICAoZnJvbWxlbiA9PSAwCQkJCQkJXAotICAgICAgID8gRU9GCQkJCQkJCVwKLSAgICAgICA6ICogKHVuc2lnbmVkIGNoYXIgKikgKGZyb20rKykpKSkKLQotICAvKiBUaGlzIG1hY3JvIHB1c2hlcyBhIGNoYXJhY3RlciBiYWNrIG9uIHRoZSBpbnB1dCBzdHJlYW0uICAqLwotCi0jZGVmaW5lIFVOR0VUKHVjaCkgKCotLWZyb20gPSAodWNoKSkKLQotICAvKiBUaGlzIG1hY3JvIHB1dHMgYSBjaGFyYWN0ZXIgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4gIElmIHRoaXMKLSAgICAgY2hhcmFjdGVyIGZpbGxzIHRoZSBvdXRwdXQgYnVmZmVyLCB0aGlzIG1hY3JvIGp1bXBzIHRvIHRoZSBsYWJlbAotICAgICBUT0ZVTEwuICBXZSB1c2UgdGhpcyByYXRoZXIgdWdseSBhcHByb2FjaCBiZWNhdXNlIHdlIG5lZWQgdG8KLSAgICAgaGFuZGxlIHR3byBkaWZmZXJlbnQgdGVybWluYXRpb24gY29uZGl0aW9uczogRU9GIG9uIHRoZSBpbnB1dAotICAgICBzdHJlYW0sIGFuZCBhIGZ1bGwgb3V0cHV0IGJ1ZmZlci4gIEl0IHdvdWxkIGJlIHNpbXBsZXIgaWYgd2UKLSAgICAgYWx3YXlzIHJlYWQgaW4gdGhlIGVudGlyZSBpbnB1dCBzdHJlYW0gYmVmb3JlIHByb2Nlc3NpbmcgaXQsIGJ1dAotICAgICBJIGRvbid0IHdhbnQgdG8gbWFrZSBzdWNoIGEgc2lnbmlmaWNhbnQgY2hhbmdlIHRvIHRoZSBhc3NlbWJsZXIncwotICAgICBtZW1vcnkgdXNhZ2UuICAqLwotCi0jZGVmaW5lIFBVVChwY2gpCQkJXAotICBkbwkJCQkJXAotICAgIHsJCQkJCVwKLSAgICAgICp0bysrID0gKHBjaCk7CQkJXAotICAgICAgaWYgKHRvID49IHRvZW5kKQkJCVwKLSAgICAgICAgZ290byB0b2Z1bGw7CQkJXAotICAgIH0JCQkJCVwKLSAgd2hpbGUgKDApCi0KLSAgaWYgKHNhdmVkX2lucHV0ICE9IE5VTEwpCi0gICAgewotICAgICAgZnJvbSA9IHNhdmVkX2lucHV0OwotICAgICAgZnJvbWVuZCA9IGZyb20gKyBzYXZlZF9pbnB1dF9sZW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnJvbWxlbiA9ICgqZ2V0KSAoaW5wdXRfYnVmZmVyLCBzaXplb2YgaW5wdXRfYnVmZmVyKTsKLSAgICAgIGlmIChmcm9tbGVuID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBmcm9tID0gaW5wdXRfYnVmZmVyOwotICAgICAgZnJvbWVuZCA9IGZyb20gKyBmcm9tbGVuOwotICAgIH0KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBUaGUgY2FzZXMgaW4gdGhpcyBzd2l0Y2ggZW5kIHdpdGggY29udGludWUsIGluIG9yZGVyIHRvCi0gICAgICAgICBicmFuY2ggYmFjayB0byB0aGUgdG9wIG9mIHRoaXMgd2hpbGUgbG9vcCBhbmQgZ2VuZXJhdGUgdGhlCi0gICAgICAgICBuZXh0IG91dHB1dCBjaGFyYWN0ZXIgaW4gdGhlIGFwcHJvcHJpYXRlIHN0YXRlLiAgKi8KLSAgICAgIHN3aXRjaCAoc3RhdGUpCi0JewotCWNhc2UgLTE6Ci0JICBjaCA9ICpvdXRfc3RyaW5nKys7Ci0JICBpZiAoKm91dF9zdHJpbmcgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgICAgIG9sZF9zdGF0ZSA9IDM7Ci0JICAgIH0KLQkgIFBVVCAoY2gpOwotCSAgY29udGludWU7Ci0KLQljYXNlIC0yOgotCSAgZm9yICg7OykKLQkgICAgewotCSAgICAgIGRvCi0JCXsKLQkJICBjaCA9IEdFVCAoKTsKLQotCQkgIGlmIChjaCA9PSBFT0YpCi0JCSAgICB7Ci0JCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGNvbW1lbnQiKSk7Ci0JCSAgICAgIGdvdG8gZnJvbWVvZjsKLQkJICAgIH0KLQotCQkgIGlmIChjaCA9PSAnXG4nKQotCQkgICAgUFVUICgnXG4nKTsKLQkJfQotCSAgICAgIHdoaWxlIChjaCAhPSAnKicpOwotCi0JICAgICAgd2hpbGUgKChjaCA9IEdFVCAoKSkgPT0gJyonKQotCQk7Ci0KLQkgICAgICBpZiAoY2ggPT0gRU9GKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIpKTsKLQkJICBnb3RvIGZyb21lb2Y7Ci0JCX0KLQotCSAgICAgIGlmIChjaCA9PSAnLycpCi0JCWJyZWFrOwotCi0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgfQotCi0JICBzdGF0ZSA9IG9sZF9zdGF0ZTsKLQkgIFVOR0VUICgnICcpOwotCSAgY29udGludWU7Ci0KLQljYXNlIDQ6Ci0JICBjaCA9IEdFVCAoKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQkgIGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCi0JICAgIFBVVCAoY2gpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGNoICE9IEVPRiAmJiBJU19XSElURVNQQUNFIChjaCkpCi0JCWNoID0gR0VUICgpOwotCSAgICAgIGlmIChjaCA9PSAnIicpCi0JCXsKLQkJICBVTkdFVCAoY2gpOwotCQkgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJICAgIG91dF9zdHJpbmcgPSAiXG5cdGFwcGZpbGUgIjsKLQkJICBlbHNlCi0JCSAgICBvdXRfc3RyaW5nID0gIlxuXHQuYXBwZmlsZSAiOwotCQkgIG9sZF9zdGF0ZSA9IDc7Ci0JCSAgc3RhdGUgPSAtMTsKLQkJICBQVVQgKCpvdXRfc3RyaW5nKyspOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgd2hpbGUgKGNoICE9IEVPRiAmJiBjaCAhPSAnXG4nKQotCQkgICAgY2ggPSBHRVQgKCk7Ci0JCSAgc3RhdGUgPSAwOwotCQkgIFBVVCAoY2gpOwotCQl9Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSA1OgotCSAgLyogV2UgYXJlIGdvaW5nIHRvIGNvcHkgZXZlcnl0aGluZyB1cCB0byBhIHF1b3RlIGNoYXJhY3RlciwKLSAgICAgICAgICAgICB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGEgYmFja3NsYXNoLiAgV2UgdHJ5IHRvCi0gICAgICAgICAgICAgb3B0aW1pemUgdGhlIGNvcHlpbmcgaW4gdGhlIHNpbXBsZSBjYXNlIHdpdGhvdXQgdXNpbmcgdGhlCi0gICAgICAgICAgICAgR0VUIGFuZCBQVVQgbWFjcm9zLiAgKi8KLQkgIHsKLQkgICAgY2hhciAqczsKLQkgICAgaW50IGxlbjsKLQotCSAgICBmb3IgKHMgPSBmcm9tOyBzIDwgZnJvbWVuZDsgcysrKQotCSAgICAgIHsKLQkJY2ggPSAqczsKLQkJLyogVGhpcyBjb25kaXRpb24gbXVzdCBiZSBjaGFuZ2VkIGlmIHRoZSB0eXBlIG9mIGFueQotICAgICAgICAgICAgICAgICAgIG90aGVyIGNoYXJhY3RlciBjYW4gYmUgTEVYX0lTX1NUUklOR1FVT1RFLiAgKi8KLQkJaWYgKGNoID09ICdcXCcKLQkJICAgIHx8IGNoID09ICciJwotCQkgICAgfHwgY2ggPT0gJ1wnJwotCQkgICAgfHwgY2ggPT0gJ1xuJykKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIGxlbiA9IHMgLSBmcm9tOwotCSAgICBpZiAobGVuID4gdG9lbmQgLSB0bykKLQkgICAgICBsZW4gPSB0b2VuZCAtIHRvOwotCSAgICBpZiAobGVuID4gMCkKLQkgICAgICB7Ci0JCW1lbWNweSAodG8sIGZyb20sIGxlbik7Ci0JCXRvICs9IGxlbjsKLQkJZnJvbSArPSBsZW47Ci0JICAgICAgfQotCSAgfQotCi0JICBjaCA9IEdFVCAoKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBzdHJpbmc6IGluc2VydGVkICdcIiciKSk7Ci0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgVU5HRVQgKCdcbicpOwotCSAgICAgIFBVVCAoJyInKTsKLQkgICAgfQotCSAgZWxzZSBpZiAobGV4W2NoXSA9PSBMRVhfSVNfU1RSSU5HUVVPVEUpCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IG9sZF9zdGF0ZTsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotI2lmbmRlZiBOT19TVFJJTkdfRVNDQVBFUwotCSAgZWxzZSBpZiAoY2ggPT0gJ1xcJykKLQkgICAgewotCSAgICAgIHN0YXRlID0gNjsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotI2VuZGlmCi0JICBlbHNlIGlmIChzY3J1Yl9tNjhrX21yaSAmJiBjaCA9PSAnXG4nKQotCSAgICB7Ci0JICAgICAgLyogSnVzdCBxdWlldGx5IHRlcm1pbmF0ZSB0aGUgc3RyaW5nLiAgVGhpcyBwZXJtaXRzIGxpbmVzIGxpa2UKLQkJICAgYm5lCWxhYmVsCWxvb3AgaWYgd2UgaGF2ZW4ndCByZWFjaCBlbmQgeWV0Ci0JCSAqLwotCSAgICAgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgUFVUICgnXCcnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgUFVUIChjaCk7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSA2OgotCSAgc3RhdGUgPSA1OwotCSAgY2ggPSBHRVQgKCk7Ci0JICBzd2l0Y2ggKGNoKQotCSAgICB7Ci0JICAgICAgLyogSGFuZGxlIHN0cmluZ3MgYnJva2VuIGFjcm9zcyBsaW5lcywgYnkgdHVybmluZyAnXG4nIGludG8KLQkJICdcXCcgYW5kICduJy4gICovCi0JICAgIGNhc2UgJ1xuJzoKLQkgICAgICBVTkdFVCAoJ24nKTsKLQkgICAgICBhZGRfbmV3bGluZXMrKzsKLQkgICAgICBQVVQgKCdcXCcpOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJyInOgotCSAgICBjYXNlICdcXCc6Ci0JICAgIGNhc2UgJ2InOgotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnbic6Ci0JICAgIGNhc2UgJ3InOgotCSAgICBjYXNlICd0JzoKLQkgICAgY2FzZSAndic6Ci0JICAgIGNhc2UgJ3gnOgotCSAgICBjYXNlICdYJzoKLQkgICAgY2FzZSAnMCc6Ci0JICAgIGNhc2UgJzEnOgotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOgotCSAgICBjYXNlICc1JzoKLQkgICAgY2FzZSAnNic6Ci0JICAgIGNhc2UgJzcnOgotCSAgICAgIGJyZWFrOwotI2lmIGRlZmluZWQoSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMpIHwgZGVmaW5lZChPTkxZX1NUQU5EQVJEX0VTQ0FQRVMpCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfd2FybiAoXygiVW5rbm93biBlc2NhcGUgJ1xcJWMnIGluIHN0cmluZzogSWdub3JlZCIpLCBjaCk7Ci0JICAgICAgYnJlYWs7Ci0jZWxzZSAgLyogT05MWV9TVEFOREFSRF9FU0NBUEVTICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogQWNjZXB0IFx4IGFzIHggZm9yIGFueSB4ICovCi0JICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogT05MWV9TVEFOREFSRF9FU0NBUEVTICovCi0KLQkgICAgY2FzZSBFT0Y6Ci0JICAgICAgYXNfd2FybiAoXygiRW5kIG9mIGZpbGUgaW4gc3RyaW5nOiAnXCInIGluc2VydGVkIikpOwotCSAgICAgIFBVVCAoJyInKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgNzoKLQkgIGNoID0gR0VUICgpOwotCSAgc3RhdGUgPSA1OwotCSAgb2xkX3N0YXRlID0gODsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQkgIFBVVCAoY2gpOwotCSAgY29udGludWU7Ci0KLQljYXNlIDg6Ci0JICBkbwotCSAgICBjaCA9IEdFVCAoKTsKLQkgIHdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9IEVPRik7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICBnb3RvIGZyb21lb2Y7Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKGNoKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogT0ssIHdlIGFyZSBzb21ld2hlcmUgaW4gc3RhdGVzIDAgdGhyb3VnaCA0IG9yIDkgdGhyb3VnaCAxMSAqLwotCi0gICAgICAvKiBmbHVzaGNoYXI6ICovCi0gICAgICBjaCA9IEdFVCAoKTsKLQotICAgIHJlY3ljbGU6Ci0KLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLSAgICAgIC8qIFdlIG5lZWQgdG8gd2F0Y2ggb3V0IGZvciAuc3ltdmVyIGRpcmVjdGl2ZXMuICBTZWUgdGhlIGNvbW1lbnQgbGF0ZXIKLQkgaW4gdGhpcyBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoc3ltdmVyX3N0YXRlID09IE5VTEwpCi0JewotCSAgaWYgKChzdGF0ZSA9PSAwIHx8IHN0YXRlID09IDEpICYmIGNoID09IHN5bXZlcl9wc2V1ZG9bMF0pCi0JICAgIHN5bXZlcl9zdGF0ZSA9IHN5bXZlcl9wc2V1ZG8gKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhZHZhbmNlIHRvIHRoZSBuZXh0IHN0YXRlIGlmIHdlIGZpbmQgdGhlIHJpZ2h0Ci0JICAgICBjaGFyYWN0ZXIuICAqLwotCSAgaWYgKGNoICE9ICdcMCcgJiYgKCpzeW12ZXJfc3RhdGUgPT0gY2gpKQotCSAgICArK3N5bXZlcl9zdGF0ZTsKLQkgIGVsc2UgaWYgKCpzeW12ZXJfc3RhdGUgIT0gJ1wwJykKLQkgICAgLyogV2UgZGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIGNoYXJhY3Rlciwgb3Igd2UgZGlkbid0Ci0JICAgICAgIGdldCBhIHZhbGlkIHRlcm1pbmF0aW5nIGNoYXJhY3RlciBhZnRlciBzZWVpbmcgdGhlCi0JICAgICAgIGVudGlyZSBwc2V1ZG8tb3AsIHNvIHdlIG11c3QgZ28gYmFjayB0byB0aGUgYmVnaW5uaW5nLiAgKi8KLQkgICAgc3ltdmVyX3N0YXRlID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlJ3ZlIHJlYWQgdGhlIGVudGlyZSBwc2V1ZG8tb3AuICBJZiB0aGlzIGlzIHRoZSBlbmQKLQkJIG9mIHRoZSBsaW5lLCBnbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLwotCSAgICAgIGlmIChJU19ORVdMSU5FIChjaCkpCi0JCXN5bXZlcl9zdGF0ZSA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0jZW5kaWYgLyogVENfQVJNICYmIE9CSl9FTEYgKi8KLQotI2lmZGVmIFRDX002OEsKLSAgICAgIC8qIFdlIHdhbnQgdG8gaGF2ZSBwc2V1ZG8tb3BzIHdoaWNoIGNvbnRyb2wgd2hldGhlciB3ZSBhcmUgaW4KLSAgICAgICAgIE1SSSBtb2RlIG9yIG5vdC4gIFVuZm9ydHVuYXRlbHksIHNpbmNlIG02OGsgTVJJIG1vZGUgYWZmZWN0cwotICAgICAgICAgdGhlIHNjcnViYmVyLCB0aGF0IG1lYW5zIHRoYXQgd2UgbmVlZCBhIHNwZWNpYWwgcHVycG9zZQotICAgICAgICAgcmVjb2duaXplciBoZXJlLiAgKi8KLSAgICAgIGlmIChtcmlfc3RhdGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkKLQkgICAgICAmJiBjaCA9PSBtcmlfcHNldWRvWzBdKQotCSAgICBtcmlfc3RhdGUgPSBtcmlfcHNldWRvICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgYWR2YW5jZSB0byB0aGUgbmV4dCBzdGF0ZSBpZiB3ZSBmaW5kIHRoZSByaWdodAotCSAgICAgY2hhcmFjdGVyLCBvciBpZiB3ZSBuZWVkIGEgc3BhY2UgY2hhcmFjdGVyIGFuZCB3ZSBnZXQgYW55Ci0JICAgICB3aGl0ZXNwYWNlIGNoYXJhY3Rlciwgb3IgaWYgd2UgbmVlZCBhICcwJyBhbmQgd2UgZ2V0IGEKLQkgICAgICcxJyAodGhpcyBpcyBzbyB0aGF0IHdlIG9ubHkgbmVlZCBvbmUgc3RhdGUgdG8gaGFuZGxlCi0JICAgICBgYC5tcmkgMCcnIGFuZCBgYC5tcmkgMScnKS4gICovCi0JICBpZiAoY2ggIT0gJ1wwJwotCSAgICAgICYmICgqbXJpX3N0YXRlID09IGNoCi0JCSAgfHwgKCptcmlfc3RhdGUgPT0gJyAnCi0JCSAgICAgICYmIGxleFtjaF0gPT0gTEVYX0lTX1dISVRFU1BBQ0UpCi0JCSAgfHwgKCptcmlfc3RhdGUgPT0gJzAnCi0JCSAgICAgICYmIGNoID09ICcxJykpKQotCSAgICB7Ci0JICAgICAgbXJpX2xhc3RfY2ggPSBjaDsKLQkgICAgICArK21yaV9zdGF0ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKm1yaV9zdGF0ZSAhPSAnXDAnCi0JCSAgIHx8IChsZXhbY2hdICE9IExFWF9JU19XSElURVNQQUNFCi0JCSAgICAgICAmJiBsZXhbY2hdICE9IExFWF9JU19ORVdMSU5FKSkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZCBub3QgZ2V0IHRoZSBleHBlY3RlZCBjaGFyYWN0ZXIsIG9yIHdlIGRpZG4ndAotCQkgZ2V0IGEgdmFsaWQgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFmdGVyIHNlZWluZyB0aGUKLQkJIGVudGlyZSBwc2V1ZG8tb3AsIHNvIHdlIG11c3QgZ28gYmFjayB0byB0aGUKLQkJIGJlZ2lubmluZy4gICovCi0JICAgICAgbXJpX3N0YXRlID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgcmVhZCB0aGUgZW50aXJlIHBzZXVkby1vcC4gIG1pcHNfbGFzdF9jaCBpcwotICAgICAgICAgICAgICAgICBlaXRoZXIgJzAnIG9yICcxJyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gZW50ZXIgb3IKLSAgICAgICAgICAgICAgICAgbGVhdmUgTVJJIG1vZGUuICAqLwotCSAgICAgIGRvX3NjcnViX2JlZ2luIChtcmlfbGFzdF9jaCA9PSAnMScpOwotCSAgICAgIG1yaV9zdGF0ZSA9IE5VTEw7Ci0KLQkgICAgICAvKiBXZSBjb250aW51ZSBoYW5kbGluZyB0aGUgY2hhcmFjdGVyIGFzIHVzdWFsLiAgVGhlCi0gICAgICAgICAgICAgICAgIG1haW4gZ2FzIHJlYWRlciBtdXN0IGFsc28gaGFuZGxlIHRoZSAubXJpIHBzZXVkby1vcAotICAgICAgICAgICAgICAgICB0byBjb250cm9sIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgdGhlIGxpa2UuICAqLwotCSAgICB9Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmIChjaCA9PSBFT0YpCi0JewotCSAgaWYgKHN0YXRlICE9IDApCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBub3QgYXQgZW5kIG9mIGEgbGluZTsgbmV3bGluZSBpbnNlcnRlZCIpKTsKLQkgICAgICBzdGF0ZSA9IDA7Ci0JICAgICAgUFVUICgnXG4nKTsKLQkgICAgfQotCSAgZ290byBmcm9tZW9mOwotCX0KLQotICAgICAgc3dpdGNoIChsZXhbY2hdKQotCXsKLQljYXNlIExFWF9JU19XSElURVNQQUNFOgotCSAgZG8KLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICB9Ci0JICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICBnb3RvIGZyb21lb2Y7Ci0KLQkgIGlmIChzdGF0ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogUHJlc2VydmUgYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgYXQgdGhlCi0JCSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLQkgICAgICBzdGF0ZSA9IDE7Ci0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBQVVQgKCcgJyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKElTX0NPTU1FTlQgKGNoKQotCSAgICAgIHx8IGNoID09ICcvJwotCSAgICAgIHx8IElTX0xJTkVfU0VQQVJBVE9SIChjaCkpCi0JICAgIHsKLQkgICAgICBpZiAoc2NydWJfbTY4a19tcmkpCi0JCXsKLQkJICAvKiBJbiBNUkkgbW9kZSwgd2Uga2VlcCB0aGVzZSBzcGFjZXMuICAqLwotCQkgIFVOR0VUIChjaCk7Ci0JCSAgUFVUICgnICcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlJ3JlIGluIHN0YXRlIDIgb3IgMTEsIHdlJ3ZlIHNlZW4gYSBub24td2hpdGUKLQkgICAgIGNoYXJhY3RlciBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLiAgSWYgdGhlIG5leHQgY2hhcmFjdGVyCi0JICAgICBpcyAnOicsIHRoaXMgaXMgd2hpdGVzcGFjZSBhZnRlciBhIGxhYmVsIG5hbWUgd2hpY2ggd2UKLQkgICAgIG5vcm1hbGx5IG11c3QgaWdub3JlLiAgSW4gTVJJIG1vZGUsIHRob3VnaCwgc3BhY2VzIGFyZQotCSAgICAgbm90IHBlcm1pdHRlZCBiZXR3ZWVuIHRoZSBsYWJlbCBhbmQgdGhlIGNvbG9uLiAgKi8KLQkgIGlmICgoc3RhdGUgPT0gMiB8fCBzdGF0ZSA9PSAxMSkKLQkgICAgICAmJiBsZXhbY2hdID09IExFWF9JU19DT0xPTgotCSAgICAgICYmICEgc2NydWJfbTY4a19tcmkpCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IDE7Ci0JICAgICAgUFVUIChjaCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChzdGF0ZSkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgc3RhdGUrKzsKLQkgICAgICBnb3RvIHJlY3ljbGU7CS8qIFB1bnRlZCBsZWFkaW5nIHNwICovCi0JICAgIGNhc2UgMToKLQkgICAgICAvKiBXZSBjYW4gYXJyaXZlIGhlcmUgaWYgd2UgbGVhdmUgYSBsZWFkaW5nIHdoaXRlc3BhY2UKLQkJIGNoYXJhY3RlciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICBjYXNlIDI6Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIGlmICh0byArIDEgPCB0b2VuZCkKLQkJewotCQkgIC8qIE9wdGltaXplIGNvbW1vbiBjYXNlIGJ5IHNraXBwaW5nIFVOR0VUL0dFVC4gICovCi0JCSAgUFVUICgnICcpOwkvKiBTcCBhZnRlciBvcGNvICovCi0JCSAgZ290byByZWN5Y2xlOwotCQl9Ci0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBQVVQgKCcgJyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBpZiAoc2NydWJfbTY4a19tcmkpCi0JCXsKLQkJICAvKiBJbiBNUkkgbW9kZSwgd2Uga2VlcCB0aGVzZSBzcGFjZXMuICAqLwotCQkgIFVOR0VUIChjaCk7Ci0JCSAgUFVUICgnICcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZ290byByZWN5Y2xlOwkvKiBTcCBpbiBvcGVyYW5kcyAqLwotCSAgICBjYXNlIDk6Ci0JICAgIGNhc2UgMTA6Ci0JICAgICAgaWYgKHNjcnViX202OGtfbXJpKQotCQl7Ci0JCSAgLyogSW4gTVJJIG1vZGUsIHdlIGtlZXAgdGhlc2Ugc3BhY2VzLiAgKi8KLQkJICBzdGF0ZSA9IDM7Ci0JCSAgVU5HRVQgKGNoKTsKLQkJICBQVVQgKCcgJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBzdGF0ZSA9IDEwOwkvKiBTcCBhZnRlciBzeW1ib2wgY2hhciAqLwotCSAgICAgIGdvdG8gcmVjeWNsZTsKLQkgICAgY2FzZSAxMToKLQkgICAgICBpZiAoZmxhZ19tNjhrX21yaQotI2lmZGVmIExBQkVMU19XSVRIT1VUX0NPTE9OUwotCQkgIHx8IDEKLSNlbmRpZgotCQkgICkKLQkJc3RhdGUgPSAxOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIGtub3cgdGhhdCBjaCBpcyBub3QgJzonLCBzaW5jZSB3ZSB0ZXN0ZWQgdGhhdAotICAgICAgICAgICAgICAgICAgICAgY2FzZSBhYm92ZS4gIFRoZXJlZm9yZSB0aGlzIGlzIG5vdCBhIGxhYmVsLCBzbyBpdAotICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSB0aGUgb3Bjb2RlLCBhbmQgd2UndmUganVzdCBzZWVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZSBhZnRlciBpdC4gICovCi0JCSAgc3RhdGUgPSAzOwotCQl9Ci0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBQVVQgKCcgJyk7CS8qIFNwIGFmdGVyIGxhYmVsIGRlZmluaXRpb24uICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIEJBRF9DQVNFIChzdGF0ZSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVDoKLQkgIGNoMiA9IEdFVCAoKTsKLQkgIGlmIChjaDIgPT0gJyonKQotCSAgICB7Ci0JICAgICAgZm9yICg7OykKLQkJewotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIGNoMiA9IEdFVCAoKTsKLQkJICAgICAgaWYgKGNoMiAhPSBFT0YgJiYgSVNfTkVXTElORSAoY2gyKSkKLQkJCWFkZF9uZXdsaW5lcysrOwotCQkgICAgfQotCQkgIHdoaWxlIChjaDIgIT0gRU9GICYmIGNoMiAhPSAnKicpOwotCi0JCSAgd2hpbGUgKGNoMiA9PSAnKicpCi0JCSAgICBjaDIgPSBHRVQgKCk7Ci0KLQkJICBpZiAoY2gyID09IEVPRiB8fCBjaDIgPT0gJy8nKQotCQkgICAgYnJlYWs7Ci0KLQkJICAvKiBUaGlzIFVOR0VUIHdpbGwgZW5zdXJlIHRoYXQgd2UgY291bnQgbmV3bGluZXMKLSAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RseS4gICovCi0JCSAgVU5HRVQgKGNoMik7Ci0JCX0KLQotCSAgICAgIGlmIChjaDIgPT0gRU9GKQotCQlhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBtdWx0aWxpbmUgY29tbWVudCIpKTsKLQotCSAgICAgIGNoID0gJyAnOwotCSAgICAgIGdvdG8gcmVjeWNsZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGNoMiAhPSBFT0YpCi0JCVVOR0VUIChjaDIpOwotCSAgICAgIGlmIChzdGF0ZSA9PSA5IHx8IHN0YXRlID09IDEwKQotCQlzdGF0ZSA9IDM7Ci0JICAgICAgUFVUIChjaCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBMRVhfSVNfU1RSSU5HUVVPVEU6Ci0JICBpZiAoc3RhdGUgPT0gMTApCi0JICAgIHsKLQkgICAgICAvKiBQcmVzZXJ2ZSB0aGUgd2hpdGVzcGFjZSBpbiBmb28gImJhciIgKi8KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgICBQVVQgKCcgJyk7Ci0KLQkgICAgICAvKiBQVVQgZGlkbid0IGp1bXAgb3V0LiAgV2UgY291bGQganVzdCBicmVhaywgYnV0IHdlCi0gICAgICAgICAgICAgICAgIGtub3cgd2hhdCB3aWxsIGhhcHBlbiwgc28gb3B0aW1pemUgYSBiaXQuICAqLwotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICAgIG9sZF9zdGF0ZSA9IDM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDkpCi0JICAgIG9sZF9zdGF0ZSA9IDM7Ci0JICBlbHNlCi0JICAgIG9sZF9zdGF0ZSA9IHN0YXRlOwotCSAgc3RhdGUgPSA1OwotCSAgUFVUIChjaCk7Ci0JICBicmVhazsKLQotI2lmbmRlZiBJRUVFX1NUWUxFCi0JY2FzZSBMRVhfSVNfT05FQ0hBUl9RVU9URToKLQkgIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIC8qIFByZXNlcnZlIHRoZSB3aGl0ZXNwYWNlIGluIGZvbyAnYicgKi8KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgICBQVVQgKCcgJyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGFmdGVyIGEgb25lLWNoYXJhY3RlciBxdW90ZTsgXFwwIGluc2VydGVkIikpOwotCSAgICAgIGNoID0gMDsKLQkgICAgfQotCSAgaWYgKGNoID09ICdcXCcpCi0JICAgIHsKLQkgICAgICBjaCA9IEdFVCAoKTsKLQkgICAgICBpZiAoY2ggPT0gRU9GKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gZXNjYXBlIGNoYXJhY3RlciIpKTsKLQkJICBjaCA9ICdcXCc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWNoID0gcHJvY2Vzc19lc2NhcGUgKGNoKTsKLQkgICAgfQotCSAgc3ByaW50ZiAob3V0X2J1ZiwgIiVkIiwgKGludCkgKHVuc2lnbmVkIGNoYXIpIGNoKTsKLQotCSAgLyogTm9uZSBvZiB0aGVzZSAneCBjb25zdGFudHMgZm9yIHVzLiAgV2Ugd2FudCAneCcuICAqLwotCSAgaWYgKChjaCA9IEdFVCAoKSkgIT0gJ1wnJykKLQkgICAgewotI2lmZGVmIFJFUVVJUkVfQ0hBUl9DTE9TRV9RVU9URQotCSAgICAgIGFzX3dhcm4gKF8oIk1pc3NpbmcgY2xvc2UgcXVvdGU6IChhc3N1bWVkKSIpKTsKLSNlbHNlCi0JICAgICAgaWYgKGNoICE9IEVPRikKLQkJVU5HRVQgKGNoKTsKLSNlbmRpZgotCSAgICB9Ci0JICBpZiAoc3RybGVuIChvdXRfYnVmKSA9PSAxKQotCSAgICB7Ci0JICAgICAgUFVUIChvdXRfYnVmWzBdKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKHN0YXRlID09IDkpCi0JICAgIG9sZF9zdGF0ZSA9IDM7Ci0JICBlbHNlCi0JICAgIG9sZF9zdGF0ZSA9IHN0YXRlOwotCSAgc3RhdGUgPSAtMTsKLQkgIG91dF9zdHJpbmcgPSBvdXRfYnVmOwotCSAgUFVUICgqb3V0X3N0cmluZysrKTsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlIExFWF9JU19DT0xPTjoKLQkgIGlmIChzdGF0ZSA9PSA5IHx8IHN0YXRlID09IDEwKQotCSAgICBzdGF0ZSA9IDM7Ci0JICBlbHNlIGlmIChzdGF0ZSAhPSAzKQotCSAgICBzdGF0ZSA9IDE7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBMRVhfSVNfTkVXTElORToKLQkgIC8qIFJvbGwgb3V0IGEgYnVuY2ggb2YgbmV3bGluZXMgZnJvbSBpbnNpZGUgY29tbWVudHMsIGV0Yy4gICovCi0JICBpZiAoYWRkX25ld2xpbmVzKQotCSAgICB7Ci0JICAgICAgLS1hZGRfbmV3bGluZXM7Ci0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgfQotCSAgLyogZmFsbCB0aHJ1IGludG8uLi4gKi8KLQotCWNhc2UgTEVYX0lTX0xJTkVfU0VQQVJBVE9SOgotCSAgc3RhdGUgPSAwOwotCSAgUFVUIChjaCk7Ci0JICBicmVhazsKLQotI2lmZGVmIFRDX1Y4NTAKLQljYXNlIExFWF9JU19ET1VCTEVEQVNIXzFTVDoKLQkgIGNoMiA9IEdFVCgpOwotCSAgaWYgKGNoMiAhPSAnLScpCi0JICAgIHsKLQkgICAgICBVTkdFVCAoY2gyKTsKLQkgICAgICBnb3RvIGRlX2ZhdWx0OwotCSAgICB9Ci0JICAvKiByZWFkIGFuZCBza2lwIHRvIGVuZCBvZiBsaW5lICovCi0JICBkbwotCSAgICB7Ci0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgIH0KLQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgY2ggIT0gJ1xuJyk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIpKTsKLQkgICAgfQotCSAgc3RhdGUgPSAwOwotCSAgUFVUICgnXG4nKTsKLQkgIGJyZWFrOwotI2VuZGlmCSAgICAKLSNpZmRlZiBUQ19NMzJSCi0JY2FzZSBMRVhfSVNfRE9VQkxFQkFSXzFTVDoKLQkgIGNoMiA9IEdFVCgpOwotCSAgaWYgKGNoMiAhPSAnfCcpCi0JICAgIHsKLQkgICAgICBVTkdFVCAoY2gyKTsKLQkgICAgICBnb3RvIGRlX2ZhdWx0OwotCSAgICB9Ci0JICAvKiBSZXNldCBiYWNrIHRvIHN0YXRlIDEgYW5kIHByZXRlbmQgdGhhdCB3ZSBhcmUgcGFyc2luZyBhIGxpbmUgZnJvbQotCSAgICAganVzdCBhZnRlciB0aGUgZmlyc3Qgd2hpdGUgc3BhY2UuICAqLwotCSAgc3RhdGUgPSAxOwotCSAgUFVUICgnfCcpOwotCSAgUFVUICgnfCcpOwotCSAgYnJlYWs7Ci0jZW5kaWYJICAgIAotCWNhc2UgTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDoKLQkgIC8qIEZJWE1FLXNvbWVkYXk6IFRoZSB0d28gY2hhcmFjdGVyIGNvbW1lbnQgc3R1ZmYgd2FzIGJhZGx5Ci0JICAgICB0aG91Z2h0IG91dC4gIE9uIGkzODYsIHdlIHdhbnQgJy8nIGFzIGxpbmUgY29tbWVudCBzdGFydAotCSAgICAgQU5EIHdlIHdhbnQgQyBzdHlsZSBjb21tZW50cy4gIGhlbmNlIHRoaXMgaGFjay4gIFRoZQotCSAgICAgd2hvbGUgbGV4aWNhbCBwcm9jZXNzIHNob3VsZCBiZSByZXdvcmtlZC4gIHhveG9yaWNoLiAgKi8KLQkgIGlmIChjaCA9PSAnLycpCi0JICAgIHsKLQkgICAgICBjaDIgPSBHRVQgKCk7Ci0JICAgICAgaWYgKGNoMiA9PSAnKicpCi0JCXsKLQkJICBvbGRfc3RhdGUgPSAzOwotCQkgIHN0YXRlID0gLTI7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBVTkdFVCAoY2gyKTsKLQkJfQotCSAgICB9IC8qIGJhZCBoYWNrICovCi0KLQkgIGlmIChzdGF0ZSA9PSAwIHx8IHN0YXRlID09IDEpCS8qIE9ubHkgY29tbWVudCBhdCBzdGFydCBvZiBsaW5lLiAgKi8KLQkgICAgewotCSAgICAgIGludCBzdGFydGNoOwotCi0JICAgICAgc3RhcnRjaCA9IGNoOwotCi0JICAgICAgZG8KLQkJewotCQkgIGNoID0gR0VUICgpOwotCQl9Ci0JICAgICAgd2hpbGUgKGNoICE9IEVPRiAmJiBJU19XSElURVNQQUNFIChjaCkpOwotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIikpOwotCQkgIFBVVCAoJ1xuJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScgfHwgc3RhdGUgIT0gMCB8fCBzdGFydGNoICE9ICcjJykKLQkJewotCQkgIC8qIE5vdCBhIGNwcCBsaW5lLiAgKi8KLQkJICB3aGlsZSAoY2ggIT0gRU9GICYmICFJU19ORVdMSU5FIChjaCkpCi0JCSAgICBjaCA9IEdFVCAoKTsKLQkJICBpZiAoY2ggPT0gRU9GKQotCQkgICAgYXNfd2FybiAoXygiRU9GIGluIENvbW1lbnQ6IE5ld2xpbmUgaW5zZXJ0ZWQiKSk7Ci0JCSAgc3RhdGUgPSAwOwotCQkgIFBVVCAoJ1xuJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAvKiBMb2tzIGxpa2UgYCMgMTIzICJmaWxlbmFtZSInIGZyb20gY3BwLiAgKi8KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIG9sZF9zdGF0ZSA9IDQ7Ci0JICAgICAgc3RhdGUgPSAtMTsKLQkgICAgICBpZiAoc2NydWJfbTY4a19tcmkpCi0JCW91dF9zdHJpbmcgPSAiXHRhcHBsaW5lICI7Ci0JICAgICAgZWxzZQotCQlvdXRfc3RyaW5nID0gIlx0LmFwcGxpbmUgIjsKLQkgICAgICBQVVQgKCpvdXRfc3RyaW5nKyspOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLSNpZmRlZiBUQ19EMTBWCi0JICAvKiBBbGwgaW5zbnMgZW5kIGluIGEgY2hhciBmb3Igd2hpY2ggTEVYX0lTX1NZTUJPTF9DT01QT05FTlQgaXMgdHJ1ZS4KLQkgICAgIFRyYXAgaXMgdGhlIG9ubHkgc2hvcnQgaW5zbiB0aGF0IGhhcyBhIGZpcnN0IG9wZXJhbmQgdGhhdCBpcwotCSAgICAgbmVpdGhlciByZWdpc3RlciBub3IgbGFiZWwuCi0JICAgICBXZSBtdXN0IHByZXZlbnQgZXhlZjBmIHx8dHJhcCAjMSB0byBkZWdlbmVyYXRlIHRvIGV4ZWYwZiB8fHRyYXAjMSAuCi0JICAgICBXZSBjYW4ndCBtYWtlICcjJyBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCBiZWNhdXNlIGl0IGlzIGFscmVhZHkKLQkgICAgIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQuICBIb3dldmVyLCBpdCBpcyB0aGUgb25seSBjaGFyYWN0ZXIgaW4KLQkgICAgIGxpbmVfY29tbWVudF9jaGFycyBmb3IgZDEwdiwgaGVuY2Ugd2UgY2FuIHJlY29nbml6ZSBpdCBhcyBzdWNoLiAgKi8KLQkgIC8qIEFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHdvdWxkIGJlIHRvIHJlc2V0IHRoZSBzdGF0ZSB0byAxIHdoZW4KLQkgICAgIHdlIHNlZSAnfHwnLCAnPCctIG9yICctPicsIGJ1dCB0aGF0IHNlZW1zIHRvIGJlIG92ZXJraWxsLiAgKi8KLQkgIGlmIChzdGF0ZSA9PSAxMCkgUFVUICgnICcpOwotI2VuZGlmCi0JICAvKiBXZSBoYXZlIGEgbGluZSBjb21tZW50IGNoYXJhY3RlciB3aGljaCBpcyBub3QgYXQgdGhlCi0JICAgICBzdGFydCBvZiBhIGxpbmUuICBJZiB0aGlzIGlzIGFsc28gYSBub3JtYWwgY29tbWVudAotCSAgICAgY2hhcmFjdGVyLCBmYWxsIHRocm91Z2guICBPdGhlcndpc2UgdHJlYXQgaXQgYXMgYSBkZWZhdWx0Ci0JICAgICBjaGFyYWN0ZXIuICAqLwotCSAgaWYgKHN0cmNociAodGNfY29tbWVudF9jaGFycywgY2gpID09IE5VTEwKLQkgICAgICAmJiAoISBzY3J1Yl9tNjhrX21yaQotCQkgIHx8IChjaCAhPSAnIScgJiYgY2ggIT0gJyonKSkpCi0JICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICBpZiAoc2NydWJfbTY4a19tcmkKLQkgICAgICAmJiAoY2ggPT0gJyEnIHx8IGNoID09ICcqJyB8fCBjaCA9PSAnIycpCi0JICAgICAgJiYgc3RhdGUgIT0gMQotCSAgICAgICYmIHN0YXRlICE9IDEwKQotCSAgICBnb3RvIGRlX2ZhdWx0OwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIExFWF9JU19DT01NRU5UX1NUQVJUOgotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotCSAgLyogT24gdGhlIEFSTSwgYEAnIGlzIHRoZSBjb21tZW50IGNoYXJhY3Rlci4KLQkgICAgIFVuZm9ydHVuYXRlbHkgdGhpcyBpcyBhbHNvIGEgc3BlY2lhbCBjaGFyYWN0ZXIgaW4gRUxGIC5zeW12ZXIKLQkgICAgIGRpcmVjdGl2ZXMgKGFuZCAudHlwZSwgdGhvdWdoIHdlIGRlYWwgd2l0aCB0aG9zZSBhbm90aGVyIHdheSkuICBTbwotCSAgICAgd2UgY2hlY2sgaWYgdGhpcyBsaW5lIGlzIHN1Y2ggYSBkaXJlY3RpdmUsIGFuZCB0cmVhdCB0aGUgY2hhcmFjdGVyCi0JICAgICBhcyBkZWZhdWx0IGlmIHNvLiAgVGhpcyBpcyBhIGhhY2suICAqLwotCSAgaWYgKChzeW12ZXJfc3RhdGUgIT0gTlVMTCkgJiYgKCpzeW12ZXJfc3RhdGUgPT0gMCkpCi0JICAgIGdvdG8gZGVfZmF1bHQ7Ci0jZW5kaWYKLQkgIGRvCi0JICAgIHsKLQkgICAgICBjaCA9IEdFVCAoKTsKLQkgICAgfQotCSAgd2hpbGUgKGNoICE9IEVPRiAmJiAhSVNfTkVXTElORSAoY2gpKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGNvbW1lbnQ7IG5ld2xpbmUgaW5zZXJ0ZWQiKSk7Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKCdcbicpOwotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOgotCSAgaWYgKHN0YXRlID09IDEwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHN5bWJvbCBjaGFyYWN0ZXIgZm9sbG93aW5nIGFub3RoZXIgc3ltYm9sCi0JCSBjaGFyYWN0ZXIsIHdpdGggd2hpdGVzcGFjZSBpbiBiZXR3ZWVuLiAgV2Ugc2tpcHBlZAotCQkgdGhlIHdoaXRlc3BhY2UgZWFybGllciwgc28gb3V0cHV0IGl0IG5vdy4gICovCi0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBzdGF0ZSA9IDM7Ci0JICAgICAgUFVUICgnICcpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzdGF0ZSA9PSAzKQotCSAgICBzdGF0ZSA9IDk7Ci0KLQkgIC8qIFRoaXMgaXMgYSBjb21tb24gY2FzZS4gIFF1aWNrbHkgY29weSBDSCBhbmQgYWxsIHRoZQotICAgICAgICAgICAgIGZvbGxvd2luZyBzeW1ib2wgY29tcG9uZW50IG9yIG5vcm1hbCBjaGFyYWN0ZXJzLiAgKi8KLQkgIGlmICh0byArIDEgPCB0b2VuZAotCSAgICAgICYmIG1yaV9zdGF0ZSA9PSBOVUxMCi0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0JICAgICAgJiYgc3ltdmVyX3N0YXRlID09IE5VTEwKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGNoYXIgKnM7Ci0JICAgICAgaW50IGxlbjsKLQotCSAgICAgIGZvciAocyA9IGZyb207IHMgPCBmcm9tZW5kOyBzKyspCi0JCXsKLQkJICBpbnQgdHlwZTsKLQotCQkgIGNoMiA9ICogKHVuc2lnbmVkIGNoYXIgKikgczsKLQkJICB0eXBlID0gbGV4W2NoMl07Ci0JCSAgaWYgKHR5cGUgIT0gMAotCQkgICAgICAmJiB0eXBlICE9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgICBpZiAocyA+IGZyb20pCi0JCXsKLQkJICAvKiBIYW5kbGUgdGhlIGxhc3QgY2hhcmFjdGVyIG5vcm1hbGx5LCBmb3IKLSAgICAgICAgICAgICAgICAgICAgIHNpbXBsaWNpdHkuICAqLwotCQkgIC0tczsKLQkJfQotCSAgICAgIGxlbiA9IHMgLSBmcm9tOwotCSAgICAgIGlmIChsZW4gPiAodG9lbmQgLSB0bykgLSAxKQotCQlsZW4gPSAodG9lbmQgLSB0bykgLSAxOwotCSAgICAgIGlmIChsZW4gPiAwKQotCQl7Ci0JCSAgUFVUIChjaCk7Ci0JCSAgaWYgKGxlbiA+IDgpCi0JCSAgICB7Ci0JCSAgICAgIG1lbWNweSAodG8sIGZyb20sIGxlbik7Ci0JCSAgICAgIHRvICs9IGxlbjsKLQkJICAgICAgZnJvbSArPSBsZW47Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzd2l0Y2ggKGxlbikKLQkJCXsKLQkJCWNhc2UgODogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSA3OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDY6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgNTogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSA0OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDM6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgMjogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSAxOiAqdG8rKyA9ICpmcm9tKys7Ci0JCQl9Ci0JCSAgICB9IAotCQkgIGNoID0gR0VUICgpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQlkZWZhdWx0OgotCWRlX2ZhdWx0OgotCSAgLyogU29tZSByZWxhdGl2ZWx5IGBub3JtYWwnIGNoYXJhY3Rlci4gICovCi0JICBpZiAoc3RhdGUgPT0gMCkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMTE7CS8qIE5vdyBzZWVpbmcgbGFiZWwgZGVmaW5pdGlvbiAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChzdGF0ZSA9PSAxKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSAyOwkvKiBEaXR0byAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChzdGF0ZSA9PSA5KQotCSAgICB7Ci0JICAgICAgaWYgKGxleFtjaF0gIT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCi0JCXN0YXRlID0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gMTApCi0JICAgIHsKLQkgICAgICBpZiAoY2ggPT0gJ1xcJykKLQkJewotCQkgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGJhY2tzbGFzaDogYSBiYWNrc2xhc2ggbWF5Ci0JCSAgICAgYmUgdGhlIGJlZ2lubmluZyBvZiBhIGZvcm1hbCBwYXJhbWV0ZXIgKG9mIGEKLQkJICAgICBtYWNybykgZm9sbG93aW5nIGFub3RoZXIgc3ltYm9sIGNoYXJhY3Rlciwgd2l0aAotCQkgICAgIHdoaXRlc3BhY2UgaW4gYmV0d2Vlbi4gIElmIHRoYXQgaXMgdGhlIGNhc2UsIHdlCi0JCSAgICAgb3V0cHV0IGEgc3BhY2UgYmVmb3JlIHRoZSBwYXJhbWV0ZXIuICBTdHJpY3RseQotCQkgICAgIHNwZWFraW5nLCBjb3JyZWN0IGhhbmRsaW5nIGRlcGVuZHMgdXBvbiB3aGF0IHRoZQotCQkgICAgIG1hY3JvIHBhcmFtZXRlciBleHBhbmRzIGludG87IGlmIHRoZSBwYXJhbWV0ZXIKLQkJICAgICBleHBhbmRzIGludG8gc29tZXRoaW5nIHdoaWNoIGRvZXMgbm90IHN0YXJ0IHdpdGgKLQkJICAgICBhbiBvcGVyYW5kIGNoYXJhY3RlciwgdGhlbiB3ZSBkb24ndCB3YW50IHRvIGtlZXAKLQkJICAgICB0aGUgc3BhY2UuICBXZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0bwotCQkgICAgIG1ha2UgdGhlIHJpZ2h0IGNob2ljZSwgc28gaGVyZSB3ZSBhcmUgbWFraW5nIHRoZQotCQkgICAgIGNob2ljZSB3aGljaCBpcyBtb3JlIGxpa2VseSB0byBiZSBjb3JyZWN0LiAgKi8KLQkJICBQVVQgKCcgJyk7Ci0JCX0KLQotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qTk9UUkVBQ0hFRCovCi0KLSBmcm9tZW9mOgotICAvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICAqLwotICByZXR1cm4gdG8gLSB0b3N0YXJ0OwotCi0gdG9mdWxsOgotICAvKiBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLiAgU2F2ZSBhbnkgaW5wdXQgd2UgaGF2ZSBub3QgeWV0Ci0gICAgIHByb2Nlc3NlZC4gICovCi0gIGlmIChmcm9tZW5kID4gZnJvbSkKLSAgICB7Ci0gICAgICBzYXZlZF9pbnB1dCA9IGZyb207Ci0gICAgICBzYXZlZF9pbnB1dF9sZW4gPSBmcm9tZW5kIC0gZnJvbTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzYXZlZF9pbnB1dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRvIC0gdG9zdGFydDsKLX0KLQotLyogZW5kIG9mIGFwcC5jICovCmRpZmYgLS1naXQgYS9nYXMvYXMuYyBiL2dhcy9hcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE3N2NhLi4wMDAwMDAwCi0tLSBhL2dhcy9hcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0MCArMCwwIEBACi0vKiBhcy5jIC0gR0FTIG1haW4gcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoKLSAqIE1haW4gcHJvZ3JhbSBmb3IgQVM7IGEgMzItYml0IGFzc2VtYmxlciBvZiBHTlUuCi0gKiBVbmRlcnN0YW5kcyBjb21tYW5kIGFyZ3VtZW50cy4KLSAqIEhhcyBhIGZldyByb3V0aW5lcyB0aGF0IGRvbid0IGZpdCBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgdGhleQotICogYXJlIHNoYXJlZC4KLSAqCi0gKgotICoJCQlidWdzCi0gKgotICogOiBpbml0aWFsaXNlcnMKLSAqCVNpbmNlIG5vLW9uZSBlbHNlIHNheXMgdGhleSB3aWxsIHN1cHBvcnQgdGhlbSBpbiBmdXR1cmU6IEkKLSAqIGRvbid0IHN1cHBvcnQgdGhlbSBub3cuCi0gKgotICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jZGVmaW5lIENPTU1PTgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0KLSNpZmRlZiBIQVZFX0lUQkxfQ1BVCi0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLSNlbHNlCi0jZGVmaW5lIGl0YmxfcGFyc2UoaXRibF9maWxlKSAxCi0jZGVmaW5lIGl0YmxfaW5pdCgpCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU0JSSwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotZXh0ZXJuIFBUUiBzYnJrICgpOwotI2VuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIHBhcnNlX2FyZ3MgUEFSQU1TICgoaW50ICosIGNoYXIgKioqKSk7Ci1zdGF0aWMgdm9pZCBkdW1wX3N0YXRpc3RpY3MgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzIFBBUkFNUyAoKGludCBhcmdjLCBjaGFyICoqYXJndikpOwotc3RhdGljIGludCBtYWNyb19leHByIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotCi1pbnQgbGlzdGluZzsJCQkvKiB0cnVlIGlmIGEgbGlzdGluZyBpcyB3YW50ZWQgKi8KLQotc3RhdGljIGNoYXIgKmxpc3RpbmdfZmlsZW5hbWUgPSBOVUxMOwkvKiBOYW1lIG9mIGxpc3RpbmcgZmlsZS4gICovCi0KLS8qIFR5cGUgb2YgZGVidWdnaW5nIHRvIGdlbmVyYXRlLiAgKi8KLQotZW51bSBkZWJ1Z19pbmZvX3R5cGUgZGVidWdfdHlwZSA9IERFQlVHX05PTkU7Ci0KLS8qIE1heGltdW0gbGV2ZWwgb2YgbWFjcm8gbmVzdGluZy4gICovCi0KLWludCBtYXhfbWFjcm9fbmVzdCA9IDEwMDsKLQotY2hhciAqbXluYW1lOwkJCS8qIGFyZ3ZbMF0gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zZWdUIHJlZ19zZWN0aW9uLCBleHByX3NlY3Rpb247Ci1zZWdUIHRleHRfc2VjdGlvbiwgZGF0YV9zZWN0aW9uLCBic3Nfc2VjdGlvbjsKLSNlbmRpZgotCi0vKiBUaGUgZGVmYXVsdCBvYnN0YWNrIGNodW5rIHNpemUuICBJZiB3ZSBzZXQgdGhpcyB0byB6ZXJvLCB0aGUKLSAgIG9ic3RhY2sgY29kZSB3aWxsIHVzZSB3aGF0ZXZlciB3aWxsIGZpdCBpbiBhIDQwOTYgYnl0ZSBibG9jay4gICovCi1pbnQgY2h1bmtzaXplID0gMDsKLQotLyogVG8gbW9uaXRvciBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmVjdGl2ZWx5LCBtYWtlIHRoaXMgbm9uLXplcm8uCi0gICBUaGVuIHRoZSBjaHVuayBzaXplcyBmb3IgZ2FzIGFuZCBiZmQgd2lsbCBiZSByZWR1Y2VkLiAgKi8KLWludCBkZWJ1Z19tZW1vcnkgPSAwOwotCi0vKiBXZSBidWlsZCBhIGxpc3Qgb2YgZGVmc3ltcyBhcyB3ZSByZWFkIHRoZSBvcHRpb25zLCBhbmQgdGhlbiBkZWZpbmUKLSAgIHRoZW0gYWZ0ZXIgd2UgaGF2ZSBpbml0aWFsaXplZCBldmVyeXRoaW5nLiAgKi8KLQotc3RydWN0IGRlZnN5bV9saXN0Ci17Ci0gIHN0cnVjdCBkZWZzeW1fbGlzdCAqbmV4dDsKLSAgY2hhciAqbmFtZTsKLSAgdmFsdWVUIHZhbHVlOwotfTsKLQotc3RhdGljIHN0cnVjdCBkZWZzeW1fbGlzdCAqZGVmc3ltczsKLQotLyogS2VlcCBhIHJlY29yZCBvZiB0aGUgaXRibCBmaWxlcyB3ZSByZWFkIGluLiAqLwotCi1zdHJ1Y3QgaXRibF9maWxlX2xpc3QKLXsKLSAgc3RydWN0IGl0YmxfZmlsZV9saXN0ICpuZXh0OwotICBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqaXRibF9maWxlczsKLQwKLXZvaWQKLXByaW50X3ZlcnNpb25faWQgKCkKLXsKLSAgc3RhdGljIGludCBwcmludGVkOwotICBpZiAocHJpbnRlZCkKLSAgICByZXR1cm47Ci0gIHByaW50ZWQgPSAxOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmcHJpbnRmIChzdGRlcnIsIF8oIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIHVzaW5nIEJGRCB2ZXJzaW9uICVzIiksCi0JICAgVkVSU0lPTiwgVEFSR0VUX0FMSUFTLCBCRkRfVkVSU0lPTik7Ci0jZWxzZQotICBmcHJpbnRmIChzdGRlcnIsIF8oIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIiksIFZFUlNJT04sIFRBUkdFVF9BTElBUyk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlVzYWdlOiAlcyBbb3B0aW9uLi4uXSBbYXNtZmlsZS4uLl1cbiIpLCBteW5hbWUpOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotT3B0aW9uczpcblwKLSAgLWFbc3ViLW9wdGlvbi4uLl0JdHVybiBvbiBsaXN0aW5nc1xuXAotICAgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG5cCi0gICAgYyAgIG9taXQgZmFsc2UgY29uZGl0aW9uYWxzXG5cCi0gICAgZCAgIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXNcblwKLSAgICBoICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuXAotICAgIGwgICBpbmNsdWRlIGFzc2VtYmx5XG5cCi0gICAgbSAgIGluY2x1ZGUgbWFjcm8gZXhwYW5zaW9uc1xuXAotICAgIG4gICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcblwKLSAgICBzICAgaW5jbHVkZSBzeW1ib2xzXG5cCi0gICAgTCAgIGluY2x1ZGUgbGluZSBkZWJ1ZyBzdGF0aXN0aWNzIChpZiBhcHBsaWNhYmxlKVxuXAotICAgID1maWxlIHNldCBsaXN0aW5nIGZpbGUgbmFtZSAobXVzdCBiZSBsYXN0IHN1Yi1vcHRpb24pXG4iKSk7Ci0gIAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLUQJCSAgICAgICAgICBwcm9kdWNlIGFzc2VtYmxlciBkZWJ1Z2dpbmcgbWVzc2FnZXNcblwKLSAgLS1kZWZzeW0gU1lNPVZBTCAgICAgICAgZGVmaW5lIHN5bWJvbCBTWU0gdG8gZ2l2ZW4gdmFsdWVcblwKLSAgLWYJCSAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuXAotICAtLWdzdGFicwkgICAgICAgICAgZ2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uXG5cCi0gIC0tZ2R3YXJmMgkgICAgICAgICAgZ2VuZXJhdGUgRFdBUkYyIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuXAotICAtLWhlbHAJCSAgc2hvdyB0aGlzIG1lc3NhZ2UgYW5kIGV4aXRcblwKLSAgLUkgRElSCQkgIGFkZCBESVIgdG8gc2VhcmNoIGxpc3QgZm9yIC5pbmNsdWRlIGRpcmVjdGl2ZXNcblwKLSAgLUoJCSAgICAgICAgICBkb24ndCB3YXJuIGFib3V0IHNpZ25lZCBvdmVyZmxvd1xuXAotICAtSwkJICAgICAgICAgIHdhcm4gd2hlbiBkaWZmZXJlbmNlcyBhbHRlcmVkIGZvciBsb25nIGRpc3BsYWNlbWVudHNcblwKLSAgLUwsLS1rZWVwLWxvY2FscyAgICAgICAga2VlcCBsb2NhbCBzeW1ib2xzIChlLmcuIHN0YXJ0aW5nIHdpdGggYEwnKVxuIikpOwotICAKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1NLC0tbXJpCSAgICAgICAgICBhc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlXG5cCi0gIC0tTUQgRklMRQkgICAgICAgICAgd3JpdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpbiBGSUxFIChkZWZhdWx0IG5vbmUpXG5cCi0gIC1ub2NwcAkJICBpZ25vcmVkXG5cCi0gIC1vIE9CSkZJTEUJICAgICAgICAgIG5hbWUgdGhlIG9iamVjdC1maWxlIG91dHB1dCBPQkpGSUxFIChkZWZhdWx0IGEub3V0KVxuXAotICAtUgkJICAgICAgICAgIGZvbGQgZGF0YSBzZWN0aW9uIGludG8gdGV4dCBzZWN0aW9uXG5cCi0gIC0tc3RhdGlzdGljcwkgICAgICAgICAgcHJpbnQgdmFyaW91cyBtZWFzdXJlZCBzdGF0aXN0aWNzIGZyb20gZXhlY3V0aW9uXG5cCi0gIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUgIHN0cmlwIGxvY2FsIGFic29sdXRlIHN5bWJvbHNcblwKLSAgLS10cmFkaXRpb25hbC1mb3JtYXQJICBVc2Ugc2FtZSBmb3JtYXQgYXMgbmF0aXZlIGFzc2VtYmxlciB3aGVuIHBvc3NpYmxlXG5cCi0gIC0tdmVyc2lvbgkJICBwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcblwKLSAgLVcgIC0tbm8td2FybgkJICBzdXBwcmVzcyB3YXJuaW5nc1xuXAotICAtLXdhcm4JCSAgZG9uJ3Qgc3VwcHJlc3Mgd2FybmluZ3NcblwKLSAgLS1mYXRhbC13YXJuaW5ncwkgIHRyZWF0IHdhcm5pbmdzIGFzIGVycm9yc1xuXAotICAtLWl0YmwgSU5TVFRCTAkgIGV4dGVuZCBpbnN0cnVjdGlvbiBzZXQgdG8gaW5jbHVkZSBpbnN0cnVjdGlvbnNcblwKLQkJCSAgbWF0Y2hpbmcgdGhlIHNwZWNpZmljYXRpb25zIGRlZmluZWQgaW4gZmlsZSBJTlNUVEJMXG5cCi0gIC13CQkJICBpZ25vcmVkXG5cCi0gIC1YCQkJICBpZ25vcmVkXG5cCi0gIC1aCQkJICBnZW5lcmF0ZSBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9yc1xuIikpOwotICAKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0tbGlzdGluZy1saHMtd2lkdGgJICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW4gb2ZcblwKLQkJCSAgdGhlIGxpc3RpbmdcblwKLSAgLS1saXN0aW5nLWxocy13aWR0aDIJICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBjb250aW51YXRpb24gbGluZXNcblwKLQkJCSAgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbjsgaWdub3JlZCBpZiBzbWFsbGVyIHRoYW5cblwKLQkJCSAgdGhlIHdpZHRoIG9mIHRoZSBmaXJzdCBsaW5lXG5cCi0gIC0tbGlzdGluZy1yaHMtd2lkdGgJICBzZXQgdGhlIG1heCB3aWR0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lcyBmcm9tXG5cCi0JCQkgIHRoZSBzb3VyY2UgZmlsZVxuXAotICAtLWxpc3RpbmctY29udC1saW5lcwkgIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29udGludWF0aW9uIGxpbmVzIHVzZWRcblwKLQkJCSAgZm9yIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW4gb2YgdGhlIGxpc3RpbmdcbiIpKTsKLQotICBtZF9zaG93X3VzYWdlIChzdHJlYW0pOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLX0KLQotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0jZGVmaW5lIEVNVUxBVElPTl9FTlZJUk9OICJBU19FTVVMQVRJT04iCi0KLWV4dGVybiBzdHJ1Y3QgZW11bGF0aW9uIG1pcHNiZWxmLCBtaXBzbGVsZiwgbWlwc2VsZjsKLWV4dGVybiBzdHJ1Y3QgZW11bGF0aW9uIG1pcHNiZWNvZmYsIG1pcHNsZWNvZmYsIG1pcHNlY29mZjsKLWV4dGVybiBzdHJ1Y3QgZW11bGF0aW9uIGkzODZjb2ZmLCBpMzg2ZWxmOwotCi1zdGF0aWMgc3RydWN0IGVtdWxhdGlvbiAqY29uc3QgZW11bGF0aW9uc1tdID0geyBFTVVMQVRJT05TIH07Ci1zdGF0aWMgY29uc3QgaW50IG5fZW11bGF0aW9ucyA9IHNpemVvZiAoZW11bGF0aW9ucykgLyBzaXplb2YgKGVtdWxhdGlvbnNbMF0pOwotCi1zdGF0aWMgdm9pZCBzZWxlY3RfZW11bGF0aW9uX21vZGUgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zZWxlY3RfZW11bGF0aW9uX21vZGUgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKnAsICplbSA9IDA7Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICBpZiAoIXN0cm5jbXAgKCItLWVtIiwgYXJndltpXSwgNCkpCi0gICAgICBicmVhazsKLQotICBpZiAoaSA9PSBhcmdjKQotICAgIGdvdG8gZG9fZGVmYXVsdDsKLQotICBwID0gc3RyY2hyIChhcmd2W2ldLCAnPScpOwotICBpZiAocCkKLSAgICBwKys7Ci0gIGVsc2UKLSAgICBwID0gYXJndltpKzFdOwotCi0gIGlmICghcCB8fCAhKnApCi0gICAgYXNfZmF0YWwgKF8oIm1pc3NpbmcgZW11bGF0aW9uIG1vZGUgbmFtZSIpKTsKLSAgZW0gPSBwOwotCi0gZG9fZGVmYXVsdDoKLSAgaWYgKGVtID09IDApCi0gICAgZW0gPSBnZXRlbnYgKEVNVUxBVElPTl9FTlZJUk9OKTsKLSAgaWYgKGVtID09IDApCi0gICAgZW0gPSBERUZBVUxUX0VNVUxBVElPTjsKLQotICBpZiAoZW0pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG5fZW11bGF0aW9uczsgaSsrKQotCWlmICghc3RyY21wIChlbXVsYXRpb25zW2ldLT5uYW1lLCBlbSkpCi0JICBicmVhazsKLSAgICAgIGlmIChpID09IG5fZW11bGF0aW9ucykKLQlhc19mYXRhbCAoXygidW5yZWNvZ25pemVkIGVtdWxhdGlvbiBuYW1lIGAlcyciKSwgZW0pOwotICAgICAgdGhpc19lbXVsYXRpb24gPSBlbXVsYXRpb25zW2ldOwotICAgIH0KLSAgZWxzZQotICAgIHRoaXNfZW11bGF0aW9uID0gZW11bGF0aW9uc1swXTsKLQotICB0aGlzX2VtdWxhdGlvbi0+aW5pdCAoKTsKLX0KLQotY29uc3QgY2hhciAqCi1kZWZhdWx0X2VtdWxfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1jb21tb25fZW11bF9pbml0ICgpCi17Ci0gIHRoaXNfZm9ybWF0ID0gdGhpc19lbXVsYXRpb24tPmZvcm1hdDsKLQotICBpZiAodGhpc19lbXVsYXRpb24tPmxlYWRpbmdfdW5kZXJzY29yZSA9PSAyKQotICAgIHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUgPSB0aGlzX2Zvcm1hdC0+ZGZsX2xlYWRpbmdfdW5kZXJzY29yZTsKLQotICBpZiAodGhpc19lbXVsYXRpb24tPmRlZmF1bHRfZW5kaWFuICE9IDIpCi0gICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSB0aGlzX2VtdWxhdGlvbi0+ZGVmYXVsdF9lbmRpYW47Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5mYWtlX2xhYmVsX25hbWUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAodGhpc19lbXVsYXRpb24tPmxlYWRpbmdfdW5kZXJzY29yZSkKLQl0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID0gIkwwXDAwMSI7Ci0gICAgICBlbHNlCi0JLyogV2hhdCBvdGhlciBwYXJhbWV0ZXJzIHNob3VsZCB3ZSB0ZXN0PyAgKi8KLQl0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID0gIi5MMFwwMDEiOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKgotICogU2luY2UgaXQgaXMgZWFzeSB0byBkbyBoZXJlIHdlIGludGVycHJldCB0aGUgc3BlY2lhbCBhcmcgIi0iCi0gKiB0byBtZWFuICJ1c2Ugc3RkaW4iIGFuZCB3ZSBzZXQgdGhhdCBhcmd2W10gcG9pbnRpbmcgdG8gIiIuCi0gKiBBZnRlciB3ZSBoYXZlIG11bmdlZCBhcmd2W10sIHRoZSBvbmx5IHRoaW5ncyBsZWZ0IGFyZSBzb3VyY2UgZmlsZQotICogbmFtZShzKSBhbmQgIiIocykgZGVub3Rpbmcgc3RkaW4uIFRoZXNlIGZpbGUgbmFtZXMgYXJlIHVzZWQKLSAqIChwZXJoYXBzIG1vcmUgdGhhbiBvbmNlKSBsYXRlci4KLSAqCi0gKiBjaGVjayBmb3IgbmV3IG1hY2hpbmUtZGVwIGNtZGxpbmUgb3B0aW9ucyBpbgotICogbWRfcGFyc2Vfb3B0aW9uIGRlZmluaXRpb25zIGluIGNvbmZpZy90Yy0qLmMKLSAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfYXJncyAocGFyZ2MsIHBhcmd2KQotICAgICBpbnQgKnBhcmdjOwotICAgICBjaGFyICoqKnBhcmd2OwotewotICBpbnQgb2xkX2FyZ2MsIG5ld19hcmdjOwotICBjaGFyICoqb2xkX2FyZ3YsICoqbmV3X2FyZ3Y7Ci0KLSAgLyogU3RhcnRpbmcgdGhlIHNob3J0IG9wdGlvbiBzdHJpbmcgd2l0aCAnLScgaXMgZm9yIHByb2dyYW1zIHRoYXQKLSAgICAgZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKLSAgICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50Ci0gICAgIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbiB3aXRoIGNoYXJhY3RlciBjb2RlIDEuICAqLwotCi0gIGNoYXIgKnNob3J0b3B0czsKLSAgZXh0ZXJuIENPTlNUIGNoYXIgKm1kX3Nob3J0b3B0czsKLSAgc3RhdGljIGNvbnN0IGNoYXIgc3RkX3Nob3J0b3B0c1tdID0KLSAgICB7Ci0gICAgICAnLScsICdKJywKLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICAgICAgLyogLUsgaXMgbm90IG1lYW5pbmdmdWwgaWYgLndvcmQgaXMgbm90IGJlaW5nIGhhY2tlZC4gICovCi0gICAgICAnSycsCi0jZW5kaWYKLSAgICAgICdMJywgJ00nLCAnUicsICdXJywgJ1onLCAnZicsICdhJywgJzonLCAnOicsICdEJywgJ0knLCAnOicsICdvJywgJzonLAotI2lmbmRlZiBWTVMKLSAgICAgIC8qIC12IHRha2VzIGFuIGFyZ3VtZW50IG9uIFZNUywgc28gd2UgZG9uJ3QgbWFrZSBpdCBhIGdlbmVyaWMKLSAgICAgICAgIG9wdGlvbi4gICovCi0gICAgICAndicsCi0jZW5kaWYKLSAgICAgICd3JywgJ1gnLAotICAgICAgLyogTmV3IG9wdGlvbiBmb3IgZXh0ZW5kaW5nIGluc3RydWN0aW9uIHNldCAoc2VlIGFsc28gLS1pdGJsIGJlbG93KSAqLwotICAgICAgJ3QnLCAnOicsCi0gICAgICAnXDAnCi0gICAgfTsKLSAgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHM7Ci0gIGV4dGVybiBzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW107Ci0gIGV4dGVybiBzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZTsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gc3RkX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl9IRUxQIChPUFRJT05fU1REX0JBU0UpCi0gICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUxQfSwKLSAgICB7ImtlZXAtbG9jYWxzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdMJ30sCi0gICAgeyJtcmkiLCBub19hcmd1bWVudCwgTlVMTCwgJ00nfSwKLSNkZWZpbmUgT1BUSU9OX05PQ1BQIChPUFRJT05fU1REX0JBU0UgKyAxKQotICAgIHsibm9jcHAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQ1BQfSwKLSNkZWZpbmUgT1BUSU9OX1NUQVRJU1RJQ1MgKE9QVElPTl9TVERfQkFTRSArIDIpCi0gICAgeyJzdGF0aXN0aWNzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFUSVNUSUNTfSwKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04gKE9QVElPTl9TVERfQkFTRSArIDMpCi0gICAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJTSU9OfSwKLSNkZWZpbmUgT1BUSU9OX0RVTVBDT05GSUcgKE9QVElPTl9TVERfQkFTRSArIDQpCi0gICAgeyJkdW1wLWNvbmZpZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFVNUENPTkZJR30sCi0jZGVmaW5lIE9QVElPTl9WRVJCT1NFIChPUFRJT05fU1REX0JBU0UgKyA1KQotICAgIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSQk9TRX0sCi0jZGVmaW5lIE9QVElPTl9FTVVMQVRJT04gKE9QVElPTl9TVERfQkFTRSArIDYpCi0gICAgeyJlbXVsYXRpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VNVUxBVElPTn0sCi0jZGVmaW5lIE9QVElPTl9ERUZTWU0gKE9QVElPTl9TVERfQkFTRSArIDcpCi0gICAgeyJkZWZzeW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRlNZTX0sCi0jZGVmaW5lIE9QVElPTl9JTlNUVEJMIChPUFRJT05fU1REX0JBU0UgKyA4KQotICAgIC8qIE5ldyBvcHRpb24gZm9yIGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQgKHNlZSBhbHNvIC10IGFib3ZlKS4KLSAgICAgICBUaGUgIi10IGZpbGUiIG9yICItLWl0YmwgZmlsZSIgb3B0aW9uIGV4dGVuZHMgdGhlIGJhc2ljIHNldCBvZgotICAgICAgIHZhbGlkIGluc3RydWN0aW9ucyBieSByZWFkaW5nICJmaWxlIiwgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBhCi0gICAgICAgbGlzdCBvZiBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgVGhlIGFkZGl0aW9uYWwgb3Bjb2RlcyBhbmQgdGhlaXIKLSAgICAgICBmb3JtYXRzIGFyZSBhZGRlZCB0byB0aGUgYnVpbHQtaW4gc2V0IG9mIGluc3RydWN0aW9ucywgYW5kCi0gICAgICAgbW5lbW9uaWNzIGZvciBuZXcgcmVnaXN0ZXJzIG1heSBhbHNvIGJlIGRlZmluZWQuICAqLwotICAgIHsiaXRibCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU5TVFRCTH0sCi0jZGVmaW5lIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSCAoT1BUSU9OX1NURF9CQVNFICsgOSkKLSAgICB7Imxpc3RpbmctbGhzLXdpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSH0sCi0jZGVmaW5lIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDIgKE9QVElPTl9TVERfQkFTRSArIDEwKQotICAgIHsibGlzdGluZy1saHMtd2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfTEhTX1dJRFRIMn0sCi0jZGVmaW5lIE9QVElPTl9MSVNUSU5HX1JIU19XSURUSCAoT1BUSU9OX1NURF9CQVNFICsgMTEpCi0gICAgeyJsaXN0aW5nLXJocy13aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19SSFNfV0lEVEh9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19DT05UX0xJTkVTIChPUFRJT05fU1REX0JBU0UgKyAxMikKLSAgICB7Imxpc3RpbmctY29udC1saW5lcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19DT05UX0xJTkVTfSwKLSNkZWZpbmUgT1BUSU9OX0RFUEZJTEUgKE9QVElPTl9TVERfQkFTRSArIDEzKQotICAgIHsiTUQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFUEZJTEV9LAotI2RlZmluZSBPUFRJT05fR1NUQUJTIChPUFRJT05fU1REX0JBU0UgKyAxNCkKLSAgICB7ImdzdGFicyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fR1NUQUJTfSwKLSNkZWZpbmUgT1BUSU9OX1NUUklQX0xPQ0FMX0FCU09MVVRFIChPUFRJT05fU1REX0JBU0UgKyAxNSkKLSAgICB7InN0cmlwLWxvY2FsLWFic29sdXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVFJJUF9MT0NBTF9BQlNPTFVURX0sCi0jZGVmaW5lIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQgKE9QVElPTl9TVERfQkFTRSArIDE2KQotICAgIHsidHJhZGl0aW9uYWwtZm9ybWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVR9LAotI2RlZmluZSBPUFRJT05fR0RXQVJGMiAoT1BUSU9OX1NURF9CQVNFICsgMTcpCi0gICAgeyJnZHdhcmYyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9HRFdBUkYyfSwKLSAgICB7Im5vLXdhcm4iLCBub19hcmd1bWVudCwgTlVMTCwgJ1cnfSwKLSNkZWZpbmUgT1BUSU9OX1dBUk4gKE9QVElPTl9TVERfQkFTRSArIDE4KQotICAgIHsid2FybiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTn0sCi0jZGVmaW5lIE9QVElPTl9XQVJOX0ZBVEFMIChPUFRJT05fU1REX0JBU0UgKyAxOSkKLSAgICB7ImZhdGFsLXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX0ZBVEFMfQotICB9OwotCi0gIC8qIENvbnN0cnVjdCB0aGUgb3B0aW9uIGxpc3RzIGZyb20gdGhlIHN0YW5kYXJkIGxpc3QgYW5kIHRoZQotICAgICB0YXJnZXQgZGVwZW5kZW50IGxpc3QuICAqLwotICBzaG9ydG9wdHMgPSBjb25jYXQgKHN0ZF9zaG9ydG9wdHMsIG1kX3Nob3J0b3B0cywgKGNoYXIgKikgTlVMTCk7Ci0gIGxvbmdvcHRzID0gKHN0cnVjdCBvcHRpb24gKikgeG1hbGxvYyAoc2l6ZW9mIChzdGRfbG9uZ29wdHMpICsgbWRfbG9uZ29wdHNfc2l6ZSk7Ci0gIG1lbWNweSAobG9uZ29wdHMsIHN0ZF9sb25nb3B0cywgc2l6ZW9mIChzdGRfbG9uZ29wdHMpKTsKLSAgbWVtY3B5ICgoY2hhciAqKSBsb25nb3B0cyArIHNpemVvZiAoc3RkX2xvbmdvcHRzKSwKLQkgIG1kX2xvbmdvcHRzLCBtZF9sb25nb3B0c19zaXplKTsKLQotICAvKiBNYWtlIGEgbG9jYWwgY29weSBvZiB0aGUgb2xkIGFyZ3YuICAqLwotICBvbGRfYXJnYyA9ICpwYXJnYzsKLSAgb2xkX2FyZ3YgPSAqcGFyZ3Y7Ci0KLSAgLyogSW5pdGlhbGl6ZSBhIG5ldyBhcmd2IHRoYXQgY29udGFpbnMgbm8gb3B0aW9ucy4gICovCi0gIG5ld19hcmd2ID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIChvbGRfYXJnYyArIDEpKTsKLSAgbmV3X2FyZ3ZbMF0gPSBvbGRfYXJndlswXTsKLSAgbmV3X2FyZ2MgPSAxOwotICBuZXdfYXJndltuZXdfYXJnY10gPSBOVUxMOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIGdldG9wdF9sb25nX29ubHkgaXMgbGlrZSBnZXRvcHRfbG9uZywgYnV0ICctJyBhcyB3ZWxsIGFzICctLScgY2FuCi0JIGluZGljYXRlIGEgbG9uZyBvcHRpb24uICAqLwotICAgICAgaW50IGxvbmdpbmQ7Ci0gICAgICBpbnQgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKG9sZF9hcmdjLCBvbGRfYXJndiwgc2hvcnRvcHRzLCBsb25nb3B0cywKLQkJCQkgICAmbG9uZ2luZCk7Ci0KLSAgICAgIGlmIChvcHRjID09IC0xKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKG9wdGMpCi0JewotCWRlZmF1bHQ6Ci0JICAvKiBtZF9wYXJzZV9vcHRpb24gc2hvdWxkIHJldHVybiAxIGlmIGl0IHJlY29nbml6ZXMgb3B0YywKLQkgICAgIDAgaWYgbm90LiAgKi8KLQkgIGlmIChtZF9wYXJzZV9vcHRpb24gKG9wdGMsIG9wdGFyZykgIT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBgLXYnIGlzbid0IGluY2x1ZGVkIGluIHRoZSBnZW5lcmFsIHNob3J0X29wdHMgbGlzdCwgc28gY2hlY2sgZm9yCi0JICAgICBpdCBleHBsaWNpdHkgaGVyZSBiZWZvcmUgZGVjaWRpbmcgd2UndmUgZ290dGVuIGEgYmFkIGFyZ3VtZW50LiAgKi8KLQkgIGlmIChvcHRjID09ICd2JykKLQkgICAgewotI2lmZGVmIFZNUwotCSAgICAgIC8qIFRlbGxpbmcgZ2V0b3B0IHRvIHRyZWF0IC12J3MgdmFsdWUgYXMgb3B0aW9uYWwgY2FuIHJlc3VsdAotCQkgaW4gaXQgcGlja2luZyB1cCBhIGZvbGxvd2luZyBmaWxlbmFtZSBhcmd1bWVudCBoZXJlLiAgVGhlCi0JCSBWTVMgY29kZSBpbiBtZF9wYXJzZV9vcHRpb24gY2FuIHJldHVybiAwIGluIHRoYXQgY2FzZSwKLQkJIGJ1dCBpdCBoYXMgbm8gd2F5IG9mIHB1c2hpbmcgdGhlIGZpbGVuYW1lIGFyZ3VtZW50IGJhY2suICAqLwotCSAgICAgIGlmIChvcHRhcmcgJiYgKm9wdGFyZykKLQkJbmV3X2FyZ3ZbbmV3X2FyZ2MrK10gPSBvcHRhcmcsICBuZXdfYXJndltuZXdfYXJnY10gPSBOVUxMOwotCSAgICAgIGVsc2UKLSNlbHNlCi0JICAgICAgY2FzZSAndic6Ci0jZW5kaWYKLQkgICAgICBjYXNlIE9QVElPTl9WRVJCT1NFOgotCQlwcmludF92ZXJzaW9uX2lkICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKkZBTExUSFJVKi8KLQotCWNhc2UgJz8nOgotCSAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQotCWNhc2UgMToJCQkvKiBGaWxlIG5hbWUuICAqLwotCSAgaWYgKCFzdHJjbXAgKG9wdGFyZywgIi0iKSkKLQkgICAgb3B0YXJnID0gIiI7Ci0JICBuZXdfYXJndltuZXdfYXJnYysrXSA9IG9wdGFyZzsKLQkgIG5ld19hcmd2W25ld19hcmdjXSA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0hFTFA6Ci0JICBzaG93X3VzYWdlIChzdGRvdXQpOwotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX05PQ1BQOgotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9TVEFUSVNUSUNTOgotCSAgZmxhZ19wcmludF9zdGF0aXN0aWNzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fU1RSSVBfTE9DQUxfQUJTT0xVVEU6Ci0JICBmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUOgotCSAgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9WRVJTSU9OOgotCSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KLQkgIHByaW50ZiAoXygiR05VIGFzc2VtYmxlciAlc1xuIiksIFZFUlNJT04pOwotCSAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKLQkgIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotCSAgcHJpbnRmIChfKCJUaGlzIGFzc2VtYmxlciB3YXMgY29uZmlndXJlZCBmb3IgYSB0YXJnZXQgb2YgYCVzJy5cbiIpLAotCQkgIFRBUkdFVF9BTElBUyk7Ci0JICBleGl0IChFWElUX1NVQ0NFU1MpOwotCi0JY2FzZSBPUFRJT05fRU1VTEFUSU9OOgotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0JICBpZiAoc3RyY21wIChvcHRhcmcsIHRoaXNfZW11bGF0aW9uLT5uYW1lKSkKLQkgICAgYXNfZmF0YWwgKF8oIm11bHRpcGxlIGVtdWxhdGlvbiBuYW1lcyBzcGVjaWZpZWQiKSk7Ci0jZWxzZQotCSAgYXNfZmF0YWwgKF8oImVtdWxhdGlvbnMgbm90IGhhbmRsZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIikpOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0RVTVBDT05GSUc6Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oImFsaWFzID0gJXNcbiIpLCBUQVJHRVRfQUxJQVMpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJjYW5vbmljYWwgPSAlc1xuIiksIFRBUkdFVF9DQU5PTklDQUwpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJjcHUtdHlwZSA9ICVzXG4iKSwgVEFSR0VUX0NQVSk7Ci0jaWZkZWYgVEFSR0VUX09CSl9GT1JNQVQKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiZm9ybWF0ID0gJXNcbiIpLCBUQVJHRVRfT0JKX0ZPUk1BVCk7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHRVRfRk9STUFUCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oImJmZC10YXJnZXQgPSAlc1xuIiksIFRBUkdFVF9GT1JNQVQpOwotI2VuZGlmCi0JICBleGl0IChFWElUX1NVQ0NFU1MpOwotCi0JY2FzZSBPUFRJT05fREVGU1lNOgotCSAgewotCSAgICBjaGFyICpzOwotCSAgICBsb25nIGk7Ci0JICAgIHN0cnVjdCBkZWZzeW1fbGlzdCAqbjsKLQotCSAgICBmb3IgKHMgPSBvcHRhcmc7ICpzICE9ICdcMCcgJiYgKnMgIT0gJz0nOyBzKyspCi0JICAgICAgOwotCSAgICBpZiAoKnMgPT0gJ1wwJykKLQkgICAgICBhc19mYXRhbCAoXygiYmFkIGRlZnN5bTsgZm9ybWF0IGlzIC0tZGVmc3ltIG5hbWU9dmFsdWUiKSk7Ci0JICAgICpzKysgPSAnXDAnOwotCSAgICBpID0gc3RydG9sIChzLCAoY2hhciAqKikgTlVMTCwgMCk7Ci0JICAgIG4gPSAoc3RydWN0IGRlZnN5bV9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0JICAgIG4tPm5leHQgPSBkZWZzeW1zOwotCSAgICBuLT5uYW1lID0gb3B0YXJnOwotCSAgICBuLT52YWx1ZSA9IGk7Ci0JICAgIGRlZnN5bXMgPSBuOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JTlNUVEJMOgotCWNhc2UgJ3QnOgotCSAgewotCSAgICAvKiBvcHRhcmcgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW5zdHJ1Y3Rpb24gCi0JICAgICAgIGZvcm1hdHMsIG9wY29kZXMsIHJlZ2lzdGVyIG5hbWVzLCBldGMuICovCi0JICAgIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqbjsKLQotCSAgICBpZiAob3B0YXJnID09IE5VTEwpCi0JICAgICAgewotCQlhc193YXJuICggXygiTm8gZmlsZSBuYW1lIGZvbGxvd2luZyAtdCBvcHRpb25cbiIpICk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgCi0JICAgIG4gPSAoc3RydWN0IGl0YmxfZmlsZV9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0JICAgIG4tPm5leHQgPSBpdGJsX2ZpbGVzOwotCSAgICBuLT5uYW1lID0gb3B0YXJnOwotCSAgICBpdGJsX2ZpbGVzID0gbjsKLQotCSAgICAvKiBQYXJzZSB0aGUgZmlsZSBhbmQgYWRkIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIHRvIG91ciBpbnRlcm5hbAotCSAgICAgICB0YWJsZS4gIElmIG11bHRpcGxlIGluc3RydWN0aW9uIHRhYmxlcyBhcmUgc3BlY2lmaWVkLCB0aGUgCi0JICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhpcyB0YWJsZSBnZXRzIGFwcGVuZGVkIG9udG8gdGhlIGV4aXN0aW5nIAotCSAgICAgICBpbnRlcm5hbCB0YWJsZS4gKi8KLQkgICAgaXRibF9maWxlcy0+bmFtZSA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0JICAgIGlmIChpdGJsX3BhcnNlIChpdGJsX2ZpbGVzLT5uYW1lKSAhPSAwKQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RkZXJyLCBfKCJGYWlsZWQgdG8gcmVhZCBpbnN0cnVjdGlvbiB0YWJsZSAlc1xuIiksIAotCQkJIGl0YmxfZmlsZXMtPm5hbWUpOwotCQlleGl0IChFWElUX1NVQ0NFU1MpOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fREVQRklMRToKLQkgIHN0YXJ0X2RlcGVuZGVuY2llcyAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fR1NUQUJTOgotCSAgZGVidWdfdHlwZSA9IERFQlVHX1NUQUJTOwotCSAgYnJlYWs7Ci0gCi0JY2FzZSBPUFRJT05fR0RXQVJGMjoKLQkgIGRlYnVnX3R5cGUgPSBERUJVR19EV0FSRjI7Ci0JICBicmVhazsKLQotCWNhc2UgJ0onOgotCSAgZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2sgPSAxOwotCSAgYnJlYWs7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotCWNhc2UgJ0snOgotCSAgZmxhZ193YXJuX2Rpc3BsYWNlbWVudCA9IDE7Ci0JICBicmVhazsKLSNlbmRpZgotCi0JY2FzZSAnTCc6Ci0JICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEg6Ci0JICBsaXN0aW5nX2xoc193aWR0aCA9IGF0b2kob3B0YXJnKTsKLQkgIGlmIChsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQgPCBsaXN0aW5nX2xoc193aWR0aCkKLQkgICAgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kID0gbGlzdGluZ19saHNfd2lkdGg7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDI6Ci0JICB7Ci0JICAgIGludCB0bXAgPSBhdG9pKG9wdGFyZyk7Ci0JICAgIGlmICh0bXAgPiBsaXN0aW5nX2xoc193aWR0aCkKLQkgICAgICBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQgPSB0bXA7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9MSVNUSU5HX1JIU19XSURUSDoKLQkgIGxpc3RpbmdfcmhzX3dpZHRoID0gYXRvaShvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19DT05UX0xJTkVTOgotCSAgbGlzdGluZ19saHNfY29udF9saW5lcyA9IGF0b2kob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTSc6Ci0JICBmbGFnX21yaSA9IDE7Ci0jaWZkZWYgVENfTTY4SwotCSAgZmxhZ19tNjhrX21yaSA9IDE7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JY2FzZSAnUic6Ci0JICBmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ1cnOgotCSAgZmxhZ19ub193YXJuaW5ncyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1dBUk46Ci0JICBmbGFnX25vX3dhcm5pbmdzID0gMDsKLQkgIGZsYWdfZmF0YWxfd2FybmluZ3MgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9XQVJOX0ZBVEFMOgotCSAgZmxhZ19ub193YXJuaW5ncyA9IDA7Ci0JICBmbGFnX2ZhdGFsX3dhcm5pbmdzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnWic6Ci0JICBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoKm9wdGFyZykKLQkJewotCQkgIHN3aXRjaCAoKm9wdGFyZykKLQkJICAgIHsKLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTk9DT05EOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTk9ERUJVRzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdoJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX0hMTDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX0xJU1RJTkc7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbSc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19NQUNFWFA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbic6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19OT0ZPUk07Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncyc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19TWU1CT0xTOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJz0nOgotCQkgICAgICBsaXN0aW5nX2ZpbGVuYW1lID0geHN0cmR1cCAob3B0YXJnICsgMSk7Ci0JCSAgICAgIG9wdGFyZyArPSBzdHJsZW4gKGxpc3RpbmdfZmlsZW5hbWUpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFzX2ZhdGFsIChfKCJpbnZhbGlkIGxpc3Rpbmcgb3B0aW9uIGAlYyciKSwgKm9wdGFyZyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIG9wdGFyZysrOwotCQl9Ci0JICAgIH0KLQkgIGlmICghbGlzdGluZykKLQkgICAgbGlzdGluZyA9IExJU1RJTkdfREVGQVVMVDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRCc6Ci0JICAvKiBERUJVRyBpcyBpbXBsZW1lbnRlZDogaXQgZGVidWdzIGRpZmZlcmVudCAqLwotCSAgLyogdGhpbmdzIGZyb20gb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4gKi8KLQkgIGZsYWdfZGVidWcgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdmJzoKLQkgIGZsYWdfbm9fY29tbWVudHMgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoKLQkgIHsJCQkvKiBJbmNsdWRlIGZpbGUgZGlyZWN0b3J5ICovCi0JICAgIGNoYXIgKnRlbXAgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgICBhZGRfaW5jbHVkZV9kaXIgKHRlbXApOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgJ28nOgotCSAgb3V0X2ZpbGVfbmFtZSA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3cnOgotCSAgYnJlYWs7Ci0KLQljYXNlICdYJzoKLQkgIC8qIC1YIG1lYW5zIHRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycyAqLwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmcmVlIChzaG9ydG9wdHMpOwotICBmcmVlIChsb25nb3B0cyk7Ci0KLSAgKnBhcmdjID0gbmV3X2FyZ2M7Ci0gICpwYXJndiA9IG5ld19hcmd2OwotfQotCi1zdGF0aWMgbG9uZyBzdGFydF90aW1lOwotCi1pbnQgCi1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBtYWNyb19hbHRlcm5hdGU7Ci0gIGludCBtYWNyb19zdHJpcF9hdDsKLSAgaW50IGtlZXBfaXQ7Ci0KLSAgc3RhcnRfdGltZSA9IGdldF9ydW5fdGltZSAoKTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIGlmIChkZWJ1Z19tZW1vcnkpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGV4dGVybiBsb25nIF9iZmRfY2h1bmtzaXplOwotICAgICAgX2JmZF9jaHVua3NpemUgPSA2NDsKLSNlbmRpZgotICAgICAgY2h1bmtzaXplID0gNjQ7Ci0gICAgfQotCi0jaWZkZWYgSE9TVF9TUEVDSUFMX0lOSVQKLSAgSE9TVF9TUEVDSUFMX0lOSVQgKGFyZ2MsIGFyZ3YpOwotI2VuZGlmCi0KLSAgbXluYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChteW5hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChteW5hbWUsIDApOwotCi0jaWZuZGVmIE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUUKLSNkZWZpbmUgT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRSAiYS5vdXQiCi0jZW5kaWYKLQotICBvdXRfZmlsZV9uYW1lID0gT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRTsKLQotICBoZXhfaW5pdCAoKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9pbml0ICgpOwotICBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAobXluYW1lKTsKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0VNVUxBVElPTlMKLSAgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIChhcmdjLCBhcmd2KTsKLSNlbmRpZgotCi0gIFBST0dSRVNTICgxKTsKLSAgc3ltYm9sX2JlZ2luICgpOwotICBmcmFnX2luaXQgKCk7Ci0gIHN1YnNlZ3NfYmVnaW4gKCk7Ci0gIHBhcnNlX2FyZ3MgKCZhcmdjLCAmYXJndik7IAotICByZWFkX2JlZ2luICgpOwotICBpbnB1dF9zY3J1Yl9iZWdpbiAoKTsKLSAgZXhwcl9iZWdpbiAoKTsKLQotICBpZiAoZmxhZ19wcmludF9zdGF0aXN0aWNzKQotICAgIHhhdGV4aXQgKGR1bXBfc3RhdGlzdGljcyk7Ci0KLSAgbWFjcm9fYWx0ZXJuYXRlID0gMDsKLSAgbWFjcm9fc3RyaXBfYXQgPSAwOwotI2lmZGVmIFRDX0k5NjAKLSAgbWFjcm9fc3RyaXBfYXQgPSBmbGFnX21yaTsKLSNlbmRpZgotI2lmZGVmIFRDX0EyOUsKLSAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQU1EIDI5SyBmYW1pbHkgbWFjcm8gYXNzZW1ibGVyCi0gICAgIHNwZWNpZmljYXRpb24uICAqLwotICBtYWNyb19hbHRlcm5hdGUgPSAxOwotICBtYWNyb19zdHJpcF9hdCA9IDE7Ci0jZW5kaWYKLQotICBtYWNyb19pbml0IChtYWNyb19hbHRlcm5hdGUsIGZsYWdfbXJpLCBtYWNyb19zdHJpcF9hdCwgbWFjcm9fZXhwcik7Ci0KLSAgUFJPR1JFU1MgKDEpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBvdXRwdXRfZmlsZV9jcmVhdGUgKG91dF9maWxlX25hbWUpOwotICBhc3NlcnQgKHN0ZG91dHB1dCAhPSAwKTsKLSNlbmRpZgotCi0jaWZkZWYgdGNfaW5pdF9hZnRlcl9hcmdzCi0gIHRjX2luaXRfYWZ0ZXJfYXJncyAoKTsKLSNlbmRpZgotCi0gIGl0YmxfaW5pdCAoKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGZ1bGx5IGluaXRpYWxpemVkLCBhbmQgaGF2ZSBjcmVhdGVkIHRoZSBvdXRwdXQKLSAgICAgZmlsZSwgZGVmaW5lIGFueSBzeW1ib2xzIHJlcXVlc3RlZCBieSAtLWRlZnN5bSBjb21tYW5kIGxpbmUKLSAgICAgYXJndW1lbnRzLiAgKi8KLSAgd2hpbGUgKGRlZnN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm5leHQ7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbF9uZXcgKGRlZnN5bXMtPm5hbWUsIGFic29sdXRlX3NlY3Rpb24sIGRlZnN5bXMtPnZhbHVlLAotCQkJJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bSk7Ci0gICAgICBuZXh0ID0gZGVmc3ltcy0+bmV4dDsKLSAgICAgIGZyZWUgKGRlZnN5bXMpOwotICAgICAgZGVmc3ltcyA9IG5leHQ7Ci0gICAgfQotCi0gIFBST0dSRVNTICgxKTsKLQotICBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MgKGFyZ2MsIGFyZ3YpOwkvKiBBc3NlbWJsZSBpdC4gKi8KLQotICBjb25kX2ZpbmlzaF9jaGVjayAoLTEpOwotCi0jaWZkZWYgbWRfZW5kCi0gIG1kX2VuZCAoKTsKLSNlbmRpZgotCi0gIGlmIChzZWVuX2F0X2xlYXN0XzFfZmlsZSAoKQotICAgICAgJiYgKGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCB8fCBoYWRfZXJyb3JzICgpID09IDApKQotICAgIGtlZXBfaXQgPSAxOwotICBlbHNlCi0gICAga2VlcF9pdCA9IDA7Ci0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhZGVmaW5lZCAoQkZEKQotICAvKiBUaGlzIHVzZWQgdG8gYmUgZG9uZSBhdCB0aGUgc3RhcnQgb2Ygd3JpdGVfb2JqZWN0X2ZpbGUgaW4KLSAgICAgd3JpdGUuYywgYnV0IHRoYXQgY2F1c2VkIHByb2JsZW1zIHdoZW4gZG9pbmcgbGlzdGluZ3Mgd2hlbgotICAgICBrZWVwX2l0IHdhcyB6ZXJvLiAgVGhpcyBjb3VsZCBwcm9iYWJseSBiZSBtb3ZlZCBhYm92ZSBtZF9lbmQsIGJ1dAotICAgICBJIGRpZG4ndCB3YW50IHRvIHJpc2sgdGhlIGNoYW5nZS4gICovCi0gIHN1YnNlZ3NfZmluaXNoICgpOwotI2VuZGlmCi0KLSAgaWYgKGtlZXBfaXQpCi0gICAgd3JpdGVfb2JqZWN0X2ZpbGUgKCk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBsaXN0aW5nX3ByaW50IChsaXN0aW5nX2ZpbGVuYW1lKTsKLSNlbmRpZgotCi0jaWZuZGVmIE9CSl9WTVMgLyogZG9lcyBpdHMgb3duIGZpbGUgaGFuZGxpbmcgKi8KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoa2VlcF9pdCkKLSNlbmRpZgotICAgIG91dHB1dF9maWxlX2Nsb3NlIChvdXRfZmlsZV9uYW1lKTsKLSNlbmRpZgotCi0gIGlmIChmbGFnX2ZhdGFsX3dhcm5pbmdzICYmIGhhZF93YXJuaW5ncygpID4gMCAmJiBoYWRfZXJyb3JzICgpID09IDApCi0gICAgYXNfYmFkIChfKCIlZCB3YXJuaW5ncywgdHJlYXRpbmcgd2FybmluZ3MgYXMgZXJyb3JzIiksIGhhZF93YXJuaW5ncygpKTsKLQotICBpZiAoaGFkX2Vycm9ycyAoKSA+IDAgJiYgISBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQpCi0gICAga2VlcF9pdCA9IDA7Ci0KLSAgaWYgKCFrZWVwX2l0KQotICAgIHVubGluayAob3V0X2ZpbGVfbmFtZSk7Ci0KLSAgaW5wdXRfc2NydWJfZW5kICgpOwotCi0gIEVORF9QUk9HUkVTUyAobXluYW1lKTsKLQotICAvKiBVc2UgeGV4aXQgaW5zdGVhZCBvZiByZXR1cm4sIGJlY2F1c2UgdW5kZXIgVk1TIGVudmlyb25tZW50cyB0aGV5Ci0gICAgIG1heSBub3QgcGxhY2UgdGhlIHNhbWUgaW50ZXJwcmV0YXRpb24gb24gdGhlIHZhbHVlIGdpdmVuLiAgKi8KLSAgaWYgKGhhZF9lcnJvcnMgKCkgPiAwKQotICAgIHhleGl0IChFWElUX0ZBSUxVUkUpOwotCi0gIC8qIE9ubHkgZ2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlIGlmIGFzc2VtYmxlciB3YXMgc3VjY2Vzc2Z1bC4gICovCi0gIHByaW50X2RlcGVuZGVuY2llcyAoKTsKLQotICB4ZXhpdCAoRVhJVF9TVUNDRVNTKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfc3RhdGlzdGljcyAoKQotewotI2lmZGVmIEhBVkVfU0JSSwotICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKLSNlbmRpZgotICBsb25nIHJ1bl90aW1lID0gZ2V0X3J1bl90aW1lICgpIC0gc3RhcnRfdGltZTsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB0b3RhbCB0aW1lIGluIGFzc2VtYmx5OiAlbGQuJTA2bGRcbiIpLAotCSAgIG15bmFtZSwgcnVuX3RpbWUgLyAxMDAwMDAwLCBydW5fdGltZSAlIDEwMDAwMDApOwotI2lmZGVmIEhBVkVfU0JSSwotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkYXRhIHNpemUgJWxkXG4iKSwKLQkgICBteW5hbWUsIChsb25nKSAobGltIC0gKGNoYXIgKikgJmVudmlyb24pKTsKLSNlbmRpZgotCi0gIHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLSAgd3JpdGVfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLSAgc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHJlYWRfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLQotI2lmZGVmIHRjX3ByaW50X3N0YXRpc3RpY3MKLSAgdGNfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLSNlbmRpZgotI2lmZGVmIG9ial9wcmludF9zdGF0aXN0aWNzCi0gIG9ial9wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotI2VuZGlmCi19Ci0MCi0KLS8qCQkJcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKCkKLSAqCi0gKiBIZXJlIHRvIGF0dGVtcHQgMSBwYXNzIG92ZXIgZWFjaCBpbnB1dCBmaWxlLgotICogV2Ugc2NhbiBhcmd2WypdIGxvb2tpbmcgZm9yIGZpbGVuYW1lcyBvciBleGFjdGx5ICIiIHdoaWNoIGlzCi0gKiBzaG9ydGhhbmQgZm9yIHN0ZGluLiBBbnkgYXJndiB0aGF0IGlzIE5VTEwgaXMgbm90IGEgZmlsZS1uYW1lLgotICogV2Ugc2V0IG5lZWRfcGFzc18yIFRSVUUgaWYsIGFmdGVyIHRoaXMsIHdlIHN0aWxsIGhhdmUgdW5yZXNvbHZlZAotICogZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0gKHVua25vd24gdmFsdWUpKy0odW5rbm93biB2YWx1ZSkuCi0gKgotICogTm90ZSB0aGUgdW4qeCBzZW1hbnRpY3M6IHRoZXJlIGlzIG9ubHkgMSBsb2dpY2FsIGlucHV0IGZpbGUsIGJ1dCBpdAotICogbWF5IGJlIGEgY2F0ZW5hdGlvbiBvZiBtYW55ICdwaHlzaWNhbCcgaW5wdXQgZmlsZXMuCi0gKi8KLXN0YXRpYyB2b2lkIAotcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBzYXdfYV9maWxlID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGZsYWd3b3JkIGFwcGxpY2FibGU7Ci0jZW5kaWYKLQotICBuZWVkX3Bhc3NfMiA9IDA7Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE1BTllfU0VHTUVOVFMKLSAgewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgICBzZWdtZW50X2luZm9baV0uZml4X3Jvb3QgPSAwOwotICB9Ci0gIC8qIENyZWF0ZSB0aGUgdGhyZWUgZml4ZWQgb25lcyAqLwotICB7Ci0gICAgc2VnVCBzZWc7Ci0KLSNpZmRlZiBURV9BUE9MTE8KLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLnd0ZXh0IiwgMCk7Ci0jZWxzZQotICAgIHNlZyA9IHN1YnNlZ19uZXcgKCIudGV4dCIsIDApOwotI2VuZGlmCi0gICAgYXNzZXJ0IChzZWcgPT0gU0VHX0UwKTsKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLmRhdGEiLCAwKTsKLSAgICBhc3NlcnQgKHNlZyA9PSBTRUdfRTEpOwotICAgIHNlZyA9IHN1YnNlZ19uZXcgKCIuYnNzIiwgMCk7Ci0gICAgYXNzZXJ0IChzZWcgPT0gU0VHX0UyKTsKLSNpZmRlZiBURV9BUE9MTE8KLSAgICBjcmVhdGVfdGFyZ2V0X3NlZ21lbnRzICgpOwotI2VuZGlmCi0gIH0KLQotI2Vsc2UgLyogbm90IE1BTllfU0VHTUVOVFMgKi8KLSAgdGV4dF9maXhfcm9vdCA9IE5VTEw7Ci0gIGRhdGFfZml4X3Jvb3QgPSBOVUxMOwotICBic3NfZml4X3Jvb3QgPSBOVUxMOwotI2VuZGlmIC8qIG5vdCBNQU5ZX1NFR01FTlRTICovCi0jZWxzZSAvKiBCRkRfQVNTRU1CTEVSICovCi0gIC8qIENyZWF0ZSB0aGUgc3RhbmRhcmQgc2VjdGlvbnMsIGFuZCB0aG9zZSB0aGUgYXNzZW1ibGVyIHVzZXMKLSAgICAgaW50ZXJuYWxseS4gICovCi0gIHRleHRfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKFRFWFRfU0VDVElPTl9OQU1FLCAwKTsKLSAgZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoREFUQV9TRUNUSU9OX05BTUUsIDApOwotICBic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKEJTU19TRUNUSU9OX05BTUUsIDApOwotICAvKiBAQCBGSVhNRSAtLSB3ZSdyZSBzZXR0aW5nIHRoZSBSRUxPQyBmbGFnIHNvIHRoYXQgc2VjdGlvbnMgYXJlIGFzc3VtZWQKLSAgICAgdG8gaGF2ZSByZWxvY3MsIG90aGVyd2lzZSB3ZSBkb24ndCBmaW5kIG91dCBpbiB0aW1lLiAqLwotICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHRleHRfc2VjdGlvbiwKLQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgIHwgU0VDX0NPREUgfCBTRUNfUkVBRE9OTFkpKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGRhdGFfc2VjdGlvbiwKLQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgIHwgU0VDX0RBVEEpKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGJzc19zZWN0aW9uLCBhcHBsaWNhYmxlICYgU0VDX0FMTE9DKTsKLSAgc2VnX2luZm8gKGJzc19zZWN0aW9uKS0+YnNzID0gMTsKLSAgc3Vic2VnX25ldyAoQkZEX0FCU19TRUNUSU9OX05BTUUsIDApOwotICBzdWJzZWdfbmV3IChCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIHJlZ19zZWN0aW9uID0gc3Vic2VnX25ldyAoIipHQVMgYHJlZycgc2VjdGlvbioiLCAwKTsKLSAgZXhwcl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIipHQVMgYGV4cHInIHNlY3Rpb24qIiwgMCk7Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLQotICAvKiBUaGlzIG1heSBhZGQgc3ltYm9sIHRhYmxlIGVudHJpZXMsIHdoaWNoIHJlcXVpcmVzIGhhdmluZyBhbiBvcGVuIEJGRCwKLSAgICAgYW5kIHNlY3Rpb25zIGFscmVhZHkgY3JlYXRlZCwgaW4gQkZEX0FTU0VNQkxFUiBtb2RlLiAgKi8KLSAgbWRfYmVnaW4gKCk7Ci0KLSNpZmRlZiBvYmpfYmVnaW4KLSAgb2JqX2JlZ2luICgpOwotI2VuZGlmCi0KLSAgYXJndisrOwkJCS8qIHNraXAgYXJndlswXSAqLwotICBhcmdjLS07CQkJLyogc2tpcCBhcmd2WzBdICovCi0gIHdoaWxlIChhcmdjLS0pCi0gICAgewotICAgICAgaWYgKCphcmd2KQotCXsJCQkvKiBJcyBpdCBhIGZpbGUtbmFtZSBhcmd1bWVudD8gKi8KLQkgIFBST0dSRVNTICgxKTsKLQkgIHNhd19hX2ZpbGUrKzsKLQkgIC8qIGFyZ3YtPiIiIGlmIHN0ZGluIGRlc2lyZWQsIGVsc2UtPmZpbGVuYW1lICovCi0JICByZWFkX2Ffc291cmNlX2ZpbGUgKCphcmd2KTsKLQl9Ci0gICAgICBhcmd2Kys7CQkJLyogY29tcGxldGVkIHRoYXQgYXJndiAqLwotICAgIH0KLSAgaWYgKCFzYXdfYV9maWxlKQotICAgIHJlYWRfYV9zb3VyY2VfZmlsZSAoIiIpOwotfQkJCQkvKiBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MoKSAqLwotCi0vKiBUaGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIG1hY3JvIGNvZGUgYW5kIGdhcyBleHByZXNzaW9uIGhhbmRsaW5nLiAgKi8KLQotc3RhdGljIGludAotbWFjcm9fZXhwciAoZW1zZywgaWR4LCBpbiwgdmFsKQotICAgICBjb25zdCBjaGFyICplbXNnOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCAqdmFsOwotewotICBjaGFyICpob2xkOwotICBleHByZXNzaW9uUyBleDsKLQotICBzYl90ZXJtaW5hdGUgKGluKTsKLQotICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbi0+cHRyICsgaWR4OwotICBleHByZXNzaW9uICgmZXgpOwotICBpZHggPSBpbnB1dF9saW5lX3BvaW50ZXIgLSBpbi0+cHRyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0gIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgYXNfYmFkICgiJXMiLCBlbXNnKTsKLQotICAqdmFsID0gKGludCkgZXguWF9hZGRfbnVtYmVyOwotCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIGVuZCBvZiBhcy5jICovCmRpZmYgLS1naXQgYS9nYXMvYXMuaCBiL2dhcy9hcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmVmMzc2Li4wMDAwMDAwCi0tLSBhL2dhcy9hcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLS8qIGFzLmggLSBnbG9iYWwgaGVhZGVyIGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgR0FTCi0jZGVmaW5lIEdBUyAxCi0vKgotICogSSB0aGluayB0aGlzIHN0dWZmIGlzIGxhcmdlbHkgb3V0IG9mIGRhdGUuICB4b3hvcmljaC4KLSAqCi0gKiBDQVBJVEFMSVNFRCBuYW1lcyBhcmUgI2RlZmluZWQuCi0gKiAibG93ZXJjYXNlSCIgaXMgI2RlZmluZWQgaWYgImxvd2VyY2FzZS5oIiBoYXMgYmVlbiAjaW5jbHVkZS1kLgotICogImxvd2VyY2FzZVQiIGlzIGEgdHlwZWRlZiBvZiAibG93ZXJjYXNlIiBvYmplY3RzLgotICogImxvd2VyY2FzZVAiIGlzIHR5cGUgInBvaW50ZXIgdG8gb2JqZWN0IG9mIHR5cGUgJ2xvd2VyY2FzZSciLgotICogImxvd2VyY2FzZVMiIGlzIHR5cGVkZWYgc3RydWN0IC4uLiBsb3dlcmNhc2VTLgotICoKLSAqICNkZWZpbmUgREVCVUcgdG8gZW5hYmxlIGFsbCB0aGUgImtub3ciIGFzc2VydGlvbiB0ZXN0cy4KLSAqICNkZWZpbmUgU1VTUEVDVCB3aGVuIGRlYnVnZ2luZyBoYXNoIGNvZGUuCi0gKiAjZGVmaW5lIENPTU1PTiBhcyAiZXh0ZXJuIiBmb3IgYWxsIG1vZHVsZXMgZXhjZXB0IG9uZSwgd2hlcmUgeW91ICNkZWZpbmUKLSAqCUNPTU1PTiBhcyAiIi4KLSAqIElmIFRFU1QgaXMgI2RlZmluZWQsIHRoZW4gd2UgYXJlIHRlc3RpbmcgYSBtb2R1bGU6ICNkZWZpbmUgQ09NTU9OIGFzICIiLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgY29kZSByZWNvbW1lbmRlZCBpbiB0aGUgYXV0b2NvbmYgZG9jdW1lbnRhdGlvbiwgYWxtb3N0Ci0gICB2ZXJiYXRpbS4gIElmIGl0IGRvZXNuJ3Qgd29yayBmb3IgeW91LCBsZXQgbWUga25vdywgYW5kIG5vdGlmeQotICAgZGptQGdudS5haS5taXQuZWR1IGFzIHdlbGwuICAqLwotLyogQWRkZWQgI3VuZGVmIGZvciBESiBEZWxvcmllLiAgVGhlIHJpZ2h0IGZpeCBpcyB0byBlbnN1cmUgdGhhdCBhcy5oCi0gICBpcyBpbmNsdWRlZCBmaXJzdCwgYmVmb3JlIGV2ZW4gYW55IHN5c3RlbSBoZWFkZXIgZmlsZXMsIGluIGFsbCBmaWxlcwotICAgdGhhdCB1c2UgaXQuICBLUiAxOTk0LjExLjAzICovCi0vKiBBZGRlZCB2b2lkKiB2ZXJzaW9uIGZvciBTVERDIGNhc2UuICBUaGlzIGlzIHRvIGJlIGNvbXBhdGlibGUgd2l0aAotICAgdGhlIGRlY2xhcmF0aW9uIGluIGJpc29uLnNpbXBsZSwgdXNlZCBmb3IgbTY4ayBvcGVyYW5kIHBhcnNpbmcuCi0gICAtLUtSIDE5OTUuMDguMDggKi8KLS8qIEZvcmNlIHZvaWQqIGRlY2wgZm9yIGhwdXguICBUaGlzIGlzIHdoYXQgQmlzb24gdXNlcy4gIC0tS1IgMTk5NS4wOC4xNiAqLwotCi0vKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jIGlmbmRlZiBhbGxvY2EKLSMgIGlmZGVmIF9fU1REQ19fCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgZWxzZQotZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZWxzZQotIyBpZiBIQVZFX0FMTE9DQV9ICi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLSMgICAgaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX19ocHV4KQotZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZWxzZQotZXh0ZXJuIHZvaWQgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYgLyogX19TVERDX18sIF9faHB1eCAqLwotIyAgIGVuZGlmIC8qIGFsbG9jYSAqLwotIyAgZW5kaWYgLyogX0FJWCAqLwotIyBlbmRpZiAvKiBIQVZFX0FMTE9DQV9IICovCi0jZW5kaWYKLQotLyogTm93LCB0ZW5kIHRvIHRoZSByZXN0IG9mIHRoZSBjb25maWd1cmF0aW9uLiAgKi8KLQotLyogU3lzdGVtIGluY2x1ZGUgZmlsZXMgZmlyc3QuLi4gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotLyogZm9yIHNpemVfdCwgcGlkX3QgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0vKiBUaGUgZmlyc3QgZ2V0b3B0IHZhbHVlIGZvciBtYWNoaW5lLWluZGVwZW5kZW50IGxvbmcgb3B0aW9ucy4KLSAgIDE1MCBpc24ndCBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KLSNkZWZpbmUgT1BUSU9OX1NURF9CQVNFIDE1MAotLyogVGhlIGZpcnN0IGdldG9wdCB2YWx1ZSBmb3IgbWFjaGluZS1kZXBlbmRlbnQgbG9uZyBvcHRpb25zLgotICAgMTcwIGdpdmVzIHRoZSBzdGFuZGFyZCBvcHRpb25zIHJvb20gdG8gZ3Jvdy4gICovCi0jZGVmaW5lIE9QVElPTl9NRF9CQVNFIDE3MAotCi0jaWZkZWYgREVCVUcKLSN1bmRlZiBOREVCVUcKLSNlbmRpZgotI2lmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX01JTk9SX18gPD0gNQotI2RlZmluZSBfX1BSRVRUWV9GVU5DVElPTl9fICAoKGNoYXIqKTApCi0jZW5kaWYKLSNpZiAwCi0KLS8qIEhhbmRsZSBsb3NzYWdlIHdpdGggYXNzZXJ0LmguICAqLwotI2lmbmRlZiBCUk9LRU5fQVNTRVJUCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZWxzZSAvKiBCUk9LRU5fQVNTRVJUICovCi0jaWZuZGVmIE5ERUJVRwotI2RlZmluZSBhc3NlcnQocCkgKChwKSA/IDAgOiAoYXNfYXNzZXJ0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pLCAwKSkKLSNlbHNlCi0jZGVmaW5lIGFzc2VydChwKSAoKHApLCAwKQotI2VuZGlmCi0jZW5kaWYgLyogQlJPS0VOX0FTU0VSVCAqLwotCi0jZWxzZQotCi0jZGVmaW5lIGFzc2VydChQKSAoKFApID8gMCA6IChhc19hc3NlcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXyksIDApKQotI3VuZGVmIGFib3J0Ci0jZGVmaW5lIGFib3J0KCkJCWFzX2Fib3J0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pCi0KLSNlbmRpZgotCi0KLS8qIE5vdyBHTlUgaGVhZGVyIGZpbGVzLi4uICovCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaW5jbHVkZSA8YmZkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLQotLyogRGVmaW5lIHRoZSBzdGFuZGFyZCBwcm9ncmVzcyBtYWNyb3MuICAqLwotI2luY2x1ZGUgPHByb2dyZXNzLmg+Ci0KLS8qIFRoaXMgZG9lc24ndCBnZXQgdGFrZW4gY2FyZSBvZiBhbnl3aGVyZS4gICovCi0jaWZuZGVmIF9fTVdFUktTX18gIC8qIE1ldHJvd2Vya3MgQyBjaG9rZXMgb24gdGhlICJkZWZpbmVkIChpbmxpbmUpIiAqLwotI2lmICFkZWZpbmVkIChfX0dOVUNfXykgJiYgIWRlZmluZWQgKGlubGluZSkKLSNkZWZpbmUgaW5saW5lCi0jZW5kaWYKLSNlbmRpZiAvKiAhX19NV0VSS1NfXyAqLwotCi0vKiBPdGhlciBzdHVmZiBmcm9tIGNvbmZpZy5oLiAgKi8KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi1leHRlcm4gUFRSIG1hbGxvYyAoKTsKLWV4dGVybiBQVFIgcmVhbGxvYyAoKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotZXh0ZXJuIHZvaWQgZnJlZSAoKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRVJSTk8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLSNlbmRpZgotCi0vKiBUaGlzIGlzIG5lZWRlZCBmb3IgVk1TLiAgKi8KLSNpZiAhIGRlZmluZWQgKEhBVkVfVU5MSU5LKSAmJiBkZWZpbmVkIChIQVZFX1JFTU9WRSkKLSNkZWZpbmUgdW5saW5rIHJlbW92ZQotI2VuZGlmCi0KLS8qIEhhY2sgdG8gbWFrZSAiZ2NjIC1XYWxsIiBub3QgY29tcGxhaW4gYWJvdXQgb2JzdGFjayBtYWNyb3MuICAqLwotI2lmICFkZWZpbmVkIChtZW1jcHkpICYmICFkZWZpbmVkIChiY29weSkKLSNkZWZpbmUgYmNvcHkoc3JjLGRlc3Qsc2l6ZSkJbWVtY3B5KGRlc3Qsc3JjLHNpemUpCi0jZW5kaWYKLQotLyogTWFrZSBTYWJlciBoYXBwaWVyIG9uIG9ic3RhY2suaC4gICovCi0jaWZkZWYgU0FCRVIKLSN1bmRlZiAgX19QVFJfVE9fSU5UCi0jZGVmaW5lIF9fUFRSX1RPX0lOVChQKSAoKGludCkoUCkpCi0jdW5kZWYgIF9fSU5UX1RPX1BUUgotI2RlZmluZSBfX0lOVF9UT19QVFIoUCkgKChjaGFyICopKFApKQotI2VuZGlmCi0KLSNpZm5kZWYgX19MSU5FX18KLSNkZWZpbmUgX19MSU5FX18gInVua25vd24iCi0jZW5kaWYgLyogX19MSU5FX18gKi8KLQotI2lmbmRlZiBfX0ZJTEVfXwotI2RlZmluZSBfX0ZJTEVfXyAidW5rbm93biIKLSNlbmRpZiAvKiBfX0ZJTEVfXyAqLwotCi0jaWZuZGVmIEZPUEVOX1dCCi0jaWZkZWYgR08zMgotI2luY2x1ZGUgImZvcGVuLWJpbi5oIgotI2Vsc2UKLSNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVYSVRfU1VDQ0VTUwotI2RlZmluZSBFWElUX1NVQ0NFU1MgMAotI2RlZmluZSBFWElUX0ZBSUxVUkUgMQotI2VuZGlmCi0KLSNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSB4ZnJlZQotCi0jZGVmaW5lIHhmcmVlIGZyZWUKLQotI2luY2x1ZGUgImFzaW50bC5oIgotCi0jZGVmaW5lIEJBRF9DQVNFKHZhbCkgXAoteyBcCi0gICAgICBhc19mYXRhbChfKCJDYXNlIHZhbHVlICVsZCB1bmV4cGVjdGVkIGF0IGxpbmUgJWQgb2YgZmlsZSBcIiVzXCJcbiIpLCBcCi0JICAgICAgIChsb25nKSB2YWwsIF9fTElORV9fLCBfX0ZJTEVfXyk7IFwKLQkgICB9Ci0MCi0jaW5jbHVkZSAiZmxvbnVtLmgiCi0KLS8qIFRoZXNlIGFyZSBhc3NlbWJsZXItd2lkZSBjb25jZXB0cyAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGJmZCAqc3Rkb3V0cHV0OwotdHlwZWRlZiBiZmRfdm1hIGFkZHJlc3NUOwotdHlwZWRlZiBiZmRfc2lnbmVkX3ZtYSBvZmZzZXRUOwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBhZGRyZXNzVDsKLXR5cGVkZWYgbG9uZyBvZmZzZXRUOwotI2VuZGlmCi0KLS8qIFR5cGUgb2Ygc3ltYm9sIHZhbHVlLCBldGMuICBGb3IgdXNlIGluIHByb3RvdHlwZXMuICAqLwotdHlwZWRlZiBhZGRyZXNzVCB2YWx1ZVQ7Ci0KLSNpZm5kZWYgQ09NTU9OCi0jaWZkZWYgVEVTVAotI2RlZmluZSBDT01NT04JCQkvKiBkZWNsYXJlIG91ciBDT01NT05zIHN0b3JhZ2UgaGVyZS4gKi8KLSNlbHNlCi0jZGVmaW5lIENPTU1PTiBleHRlcm4JCS8qIG91ciBjb21tb25zIGxpdmUgZWxzd2hlcmUgKi8KLSNlbmRpZgotI2VuZGlmCi0vKiBDT01NT04gbm93IGRlZmluZWQgKi8KLQotI2lmZGVmIERFQlVHCi0jaWZuZGVmIGtub3cKLSNkZWZpbmUga25vdyhwKSBhc3NlcnQocCkJLyogVmVyaWZ5IG91ciBhc3N1bXB0aW9ucyEgKi8KLSNlbmRpZiAvKiBub3QgeWV0IGRlZmluZWQgKi8KLSNlbHNlCi0jZGVmaW5lIGtub3cocCkJCQkvKiBrbm93KCkgY2hlY2tzIGFyZSBuby1vcC5lZCAqLwotI2VuZGlmCi0MCi0vKiBpbnB1dF9zY3J1Yi5jICovCi0KLS8qCi0gKiBTdXBwbGllcyBzYW5pdGlzZWQgYnVmZmVycyB0byByZWFkLmMuCi0gKiBBbHNvIHVuZGVyc3RhbmRzIHByaW50aW5nIGxpbmUtbnVtYmVyIHBhcnQgb2YgZXJyb3IgbWVzc2FnZXMuCi0gKi8KLQwKLQotLyogc3Vic2Vncy5jICAgICBTdWItc2VnbWVudHMuIEFsc28sIHNlZ21lbnQoPWV4cHJlc3Npb24gdHlwZSlzLiovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotI2luY2x1ZGUgImJmZC5oIgotI2RlZmluZSBOX1NFR01FTlRTIDQwCi0jZGVmaW5lIFNFR19OT1JNQUwoeCkgKCh4KSA+PSBTRUdfRTAgJiYgKHgpIDw9IFNFR19FMzkpCi0jZGVmaW5lIFNFR19MSVNUIFNFR19FMCxTRUdfRTEsU0VHX0UyLFNFR19FMyxTRUdfRTQsU0VHX0U1LFNFR19FNixTRUdfRTcsU0VHX0U4LFNFR19FOSxcCi0JCSBTRUdfRTEwLFNFR19FMTEsU0VHX0UxMixTRUdfRTEzLFNFR19FMTQsU0VHX0UxNSxTRUdfRTE2LFNFR19FMTcsU0VHX0UxOCxTRUdfRTE5LFwKLQkJIFNFR19FMjAsU0VHX0UyMSxTRUdfRTIyLFNFR19FMjMsU0VHX0UyNCxTRUdfRTI1LFNFR19FMjYsU0VHX0UyNyxTRUdfRTI4LFNFR19FMjksXAotCQkgU0VHX0UzMCxTRUdfRTMxLFNFR19FMzIsU0VHX0UzMyxTRUdfRTM0LFNFR19FMzUsU0VHX0UzNixTRUdfRTM3LFNFR19FMzgsU0VHX0UzOQotI2RlZmluZSBTRUdfVEVYVCBTRUdfRTAKLSNkZWZpbmUgU0VHX0RBVEEgU0VHX0UxCi0jZGVmaW5lIFNFR19CU1MgU0VHX0UyCi0jZGVmaW5lIFNFR19MQVNUIFNFR19FMzkKLSNlbHNlCi0jZGVmaW5lIE5fU0VHTUVOVFMgMwotI2RlZmluZSBTRUdfTk9STUFMKHgpICgoeCkgPT0gU0VHX1RFWFQgfHwgKHgpID09IFNFR19EQVRBIHx8ICh4KSA9PSBTRUdfQlNTKQotI2RlZmluZSBTRUdfTElTVCBTRUdfVEVYVCxTRUdfREFUQSxTRUdfQlNTCi0jZW5kaWYKLQotdHlwZWRlZiBlbnVtIF9zZWdUCi0gIHsKLSAgICBTRUdfQUJTT0xVVEUgPSAwLAotICAgIFNFR19MSVNULAotICAgIFNFR19VTktOT1dOLAotICAgIFNFR19HT09GLAkJCS8qIE9ubHkgaGFwcGVucyBpZiBBUyBoYXMgYSBsb2dpYyBlcnJvci4gKi8KLSAgICAvKiBJbnZlbnRlZCBzbyB3ZSBkb24ndCBjcmFzaCBwcmludGluZyAqLwotICAgIC8qIGVycm9yIG1lc3NhZ2UgaW52b2x2aW5nIHdlaXJkIHNlZ21lbnQuICovCi0gICAgU0VHX0VYUFIsCQkJLyogSW50ZXJtZWRpYXRlIGV4cHJlc3Npb24gdmFsdWVzLiAqLwotICAgIFNFR19ERUJVRywJCQkvKiBEZWJ1ZyBzZWdtZW50ICovCi0gICAgU0VHX05UViwJCQkvKiBUcmFuc2ZlcnQgdmVjdG9yIHByZWxvYWQgc2VnbWVudCAqLwotICAgIFNFR19QVFYsCQkJLyogVHJhbnNmZXJ0IHZlY3RvciBwb3N0bG9hZCBzZWdtZW50ICovCi0gICAgU0VHX1JFR0lTVEVSCQkvKiBNeXRoaWNhbDogYSByZWdpc3Rlci12YWx1ZWQgZXhwcmVzc2lvbiAqLwotICB9IHNlZ1Q7Ci0KLSNkZWZpbmUgU0VHX01BWElNVU1fT1JESU5BTCAoU0VHX1JFR0lTVEVSKQotI2Vsc2UKLXR5cGVkZWYgYXNlY3Rpb24gKnNlZ1Q7Ci0jZGVmaW5lIFNFR19OT1JNQUwoU0VHKQkJKChTRUcpICE9IGFic29sdXRlX3NlY3Rpb24JXAotCQkJCSAmJiAoU0VHKSAhPSB1bmRlZmluZWRfc2VjdGlvbglcCi0JCQkJICYmIChTRUcpICE9IHJlZ19zZWN0aW9uCVwKLQkJCQkgJiYgKFNFRykgIT0gZXhwcl9zZWN0aW9uKQotI2VuZGlmCi10eXBlZGVmIGludCBzdWJzZWdUOwotCi0vKiBXaGF0IHN1YnNlZyB3ZSBhcmUgYWNjcmV0aW5nIG5vdz8gKi8KLUNPTU1PTiBzdWJzZWdUIG5vd19zdWJzZWc7Ci0KLS8qIFNlZ21lbnQgb3VyIGluc3RydWN0aW9ucyBlbWl0IHRvLiAqLwotQ09NTU9OIHNlZ1Qgbm93X3NlZzsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgc2VnbWVudF9uYW1lKFNFRykJYmZkX2dldF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgU0VHKQotI2Vsc2UKLWV4dGVybiBjaGFyIGNvbnN0ICpjb25zdCBzZWdfbmFtZVtdOwotI2RlZmluZSBzZWdtZW50X25hbWUoU0VHKQlzZWdfbmFtZVsoaW50KSAoU0VHKV0KLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBpbnQgc2VjdGlvbl9hbGlnbm1lbnRbXTsKLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIHNlZ1QgcmVnX3NlY3Rpb24sIGV4cHJfc2VjdGlvbjsKLS8qIFNob3VsZG4ndCB0aGVzZSBiZSBlbGltaW5hdGVkIHNvbWVkYXk/ICAqLwotZXh0ZXJuIHNlZ1QgdGV4dF9zZWN0aW9uLCBkYXRhX3NlY3Rpb24sIGJzc19zZWN0aW9uOwotI2RlZmluZSBhYnNvbHV0ZV9zZWN0aW9uCWJmZF9hYnNfc2VjdGlvbl9wdHIKLSNkZWZpbmUgdW5kZWZpbmVkX3NlY3Rpb24JYmZkX3VuZF9zZWN0aW9uX3B0cgotI2Vsc2UKLSNkZWZpbmUgcmVnX3NlY3Rpb24JCVNFR19SRUdJU1RFUgotI2RlZmluZSBleHByX3NlY3Rpb24JCVNFR19FWFBSCi0jZGVmaW5lIHRleHRfc2VjdGlvbgkJU0VHX1RFWFQKLSNkZWZpbmUgZGF0YV9zZWN0aW9uCQlTRUdfREFUQQotI2RlZmluZSBic3Nfc2VjdGlvbgkJU0VHX0JTUwotI2RlZmluZSBhYnNvbHV0ZV9zZWN0aW9uCVNFR19BQlNPTFVURQotI2RlZmluZSB1bmRlZmluZWRfc2VjdGlvbglTRUdfVU5LTk9XTgotI2VuZGlmCi0KLS8qIHJlbGF4KCkgKi8KLQotZW51bSBfcmVsYXhfc3RhdGUKLSAgewotICAgIC8qIFZhcmlhYmxlIGNoYXJzIHRvIGJlIHJlcGVhdGVkIGZyX29mZnNldCB0aW1lcy4KLSAgICAgICBGcl9zeW1ib2wgdW51c2VkLiBVc2VkIHdpdGggZnJfb2Zmc2V0ID09IDAgZm9yIGEKLSAgICAgICBjb25zdGFudCBsZW5ndGggZnJhZy4gKi8KLSAgICByc19maWxsID0gMSwKLQotICAgIC8qIEFsaWduLiAgVGhlIGZyX29mZnNldCBmaWVsZCBob2xkcyB0aGUgcG93ZXIgb2YgMiB0byB3aGljaCB0bwotICAgICAgIGFsaWduLiAgVGhlIGZyX3ZhciBmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlCi0gICAgICAgZmlsbCBwYXR0ZXJuLiAgVGhlIGZyX3N1YnR5cGUgZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gICAgICAgYnl0ZXMgdG8gc2tpcCB3aGVuIGFsaWduaW5nLCBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotICAgIHJzX2FsaWduLAotCi0gICAgLyogQWxpZ24gY29kZS4gIFRoZSBmcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIHBvd2VyIG9mIDIgdG8gd2hpY2gKLSAgICAgICB0byBhbGlnbi4gIFRoaXMgdHlwZSBpcyBvbmx5IGdlbmVyYXRlZCBieSBtYWNoaW5lIHNwZWNpZmljCi0gICAgICAgY29kZSwgd2hpY2ggaXMgbm9ybWFsbHkgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHRoZSBmaWxsCi0gICAgICAgcGF0dGVybi4gIFRoZSBmcl9zdWJ0eXBlIGZpZWxkIGhvbGRzIHRoZSBtYXhpbXVtIG51bWJlciBvZgotICAgICAgIGJ5dGVzIHRvIHNraXAgd2hlbiBhbGlnbmluZywgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLSAgICByc19hbGlnbl9jb2RlLAotCi0gICAgLyogT3JnOiBGcl9vZmZzZXQsIGZyX3N5bWJvbDogYWRkcmVzcy4gMSB2YXJpYWJsZSBjaGFyOiBmaWxsCi0gICAgICAgY2hhcmFjdGVyLiAqLwotICAgIHJzX29yZywKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0gICAgLyogSkY6IGd1bnBvaW50ICovCi0gICAgcnNfYnJva2VuX3dvcmQsCi0jZW5kaWYKLQotICAgIC8qIG1hY2hpbmUtc3BlY2lmaWMgcmVsYXhhYmxlIChvciBzaW1pbGFybHkgYWx0ZXJhYmxlKSBpbnN0cnVjdGlvbiAqLwotICAgIHJzX21hY2hpbmVfZGVwZW5kZW50LAotCi0gICAgLyogLnNwYWNlIGRpcmVjdGl2ZSB3aXRoIGV4cHJlc3Npb24gb3BlcmFuZCB0aGF0IG5lZWRzIHRvIGJlIGNvbXB1dGVkCi0gICAgICAgbGF0ZXIuICBTaW1pbGFyIHRvIHJzX29yZywgYnV0IGRpZmZlcmVudC4KLSAgICAgICBmcl9zeW1ib2w6IG9wZXJhbmQKLSAgICAgICAxIHZhcmlhYmxlIGNoYXI6IGZpbGwgY2hhcmFjdGVyICAqLwotICAgIHJzX3NwYWNlLAotCi0gICAgLyogQSBEV0FSRiBsZWIxMjggdmFsdWU7IG9ubHkgRUxGIHVzZXMgdGhpcy4gIFRoZSBzdWJ0eXBlIGlzIDAgZm9yCi0gICAgICAgdW5zaWduZWQsIDEgZm9yIHNpZ25lZC4gICovCi0gICAgcnNfbGViMTI4LAotCi0gICAgLyogRXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uIHdoaWNoIHdlIG1heSBiZSBhYmxlIHRvIG9wdGltaXplLiAgKi8KLSAgICByc19jZmEKLSAgfTsKLQotdHlwZWRlZiBlbnVtIF9yZWxheF9zdGF0ZSByZWxheF9zdGF0ZVQ7Ci0KLS8qIFRoaXMgdHlwZSBpcyB1c2VkIGluIHByb3RvdHlwZXMsIHNvIGl0IGNhbid0IGJlIGEgdHlwZSB0aGF0IHdpbGwgYmUKLSAgIHdpZGVuZWQgZm9yIGFyZ3VtZW50IHBhc3NpbmcuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVsYXhfc3Vic3RhdGVUOwotCi0vKiBFbm91Z2ggYml0cyBmb3IgYWRkcmVzcywgYnV0IHN0aWxsIGFuIGludGVnZXIgdHlwZS4KLSAgIENvdWxkIGJlIGEgcHJvYmxlbSwgY3Jvc3MtYXNzZW1ibGluZyBmb3IgNjQtYml0IG1hY2hpbmVzLiAgKi8KLXR5cGVkZWYgYWRkcmVzc1QgcmVsYXhfYWRkcmVzc1Q7Ci0MCi0vKiBtYWluIHByb2dyYW0gImFzLmMiIChjb21tYW5kIGFyZ3VtZW50cyBldGMpICovCi0KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfbm9fY29tbWVudHM7IC8qIC1mICovCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX2RlYnVnOyAvKiAtRCAqLwotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2s7IC8qIC1KICovCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQ7IC8qIC1LICovCi0jZW5kaWYKLQotLyogVHJ1ZSBpZiBsb2NhbCBzeW1ib2xzIHNob3VsZCBiZSByZXRhaW5lZC4gICovCi1DT01NT04gaW50IGZsYWdfa2VlcF9sb2NhbHM7IC8qIC1MICovCi0KLS8qIFRydWUgaWYgd2UgYXJlIGFzc2VtYmxpbmcgaW4gTVJJIG1vZGUuICAqLwotQ09NTU9OIGludCBmbGFnX21yaTsKLQotLyogVHJ1ZSBpZiB3ZSBhcmUgYXNzZW1ibGluZyBpbiBtNjhrIE1SSSBtb2RlLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19tNjhrX21yaTsKLQotLyogU2hvdWxkIHRoZSBkYXRhIHNlY3Rpb24gYmUgbWFkZSByZWFkLW9ubHkgYW5kIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0gICBzZWN0aW9uPyAgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0OyAvKiAtUiAqLwotCi0vKiBUcnVlIGlmIHdhcm5pbmdzIHNob3VsZCBiZSBpbmhpYml0ZWQuICAqLwotQ09NTU9OIGludCBmbGFnX25vX3dhcm5pbmdzOyAvKiAtVyAqLwotCi0vKiBUcnVlIGlmIHdhcm5pbmdzIGNvdW50IGFzIGVycm9ycy4gICovCi1DT01NT04gaW50IGZsYWdfZmF0YWxfd2FybmluZ3M7IC8qIC0tZmF0YWwtd2FybmluZ3MgKi8KLQotLyogVHJ1ZSBpZiB3ZSBzaG91bGQgYXR0ZW1wdCB0byBnZW5lcmF0ZSBvdXRwdXQgZXZlbiBpZiBub24tZmF0YWwgZXJyb3JzCi0gICBhcmUgZGV0ZWN0ZWQuICAqLwotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0OyAvKiAtWiAqLwotCi0vKiBUaGlzIGlzIHRydWUgaWYgdGhlIGFzc2VtYmxlciBzaG91bGQgb3V0cHV0IHRpbWUgYW5kIHNwYWNlIHVzYWdlLiAqLwotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19wcmludF9zdGF0aXN0aWNzOwotCi0vKiBUcnVlIGlmIGxvY2FsIGFic29sdXRlIHN5bWJvbHMgYXJlIHRvIGJlIHN0cmlwcGVkLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZTsKLQotLyogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgYSB0cmFkaXRpb25hbCBmb3JtYXQgb2JqZWN0IGZpbGUuICAqLwotQ09NTU9OIGludCBmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdDsKLQotLyogbmFtZSBvZiBlbWl0dGVkIG9iamVjdCBmaWxlICovCi1DT01NT04gY2hhciAqb3V0X2ZpbGVfbmFtZTsKLQotLyogbmFtZSBvZiBmaWxlIGRlZmluaW5nIGV4dGVuc2lvbnMgdG8gdGhlIGJhc2ljIGluc3RydWN0aW9uIHNldCAqLwotQ09NTU9OIGNoYXIgKmluc3R0YmxfZmlsZV9uYW1lOwotCi0vKiBUUlVFIGlmIHdlIG5lZWQgYSBzZWNvbmQgcGFzcy4gKi8KLUNPTU1PTiBpbnQgbmVlZF9wYXNzXzI7Ci0KLS8qIFRSVUUgaWYgd2Ugc2hvdWxkIGRvIG5vIHJlbGF4aW5nLCBhbmQKLSAgIGxlYXZlIGxvdHMgb2YgcGFkZGluZy4gICovCi1DT01NT04gaW50IGxpbmtyZWxheDsKLQotLyogVFJVRSBpZiB3ZSBzaG91bGQgcHJvZHVjZSBhIGxpc3RpbmcuICAqLwotZXh0ZXJuIGludCBsaXN0aW5nOwotCi0vKiBUeXBlIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3ZSBzaG91bGQgZ2VuZXJhdGUuICBXZSBjdXJyZW50bHkKLSAgIHN1cHBvcnQgc3RhYnMsIEVDT0ZGLCBhbmQgRFdBUkYyLiAgKi8KLQotZW51bSBkZWJ1Z19pbmZvX3R5cGUKLSAgewotICAgIERFQlVHX1VOU1BFQ0lGSUVELAotICAgIERFQlVHX05PTkUsCi0gICAgREVCVUdfU1RBQlMsCi0gICAgREVCVUdfRUNPRkYsCi0gICAgREVCVUdfRFdBUkYsCi0gICAgREVCVUdfRFdBUkYyCi0gIH07Ci0KLWV4dGVybiBlbnVtIGRlYnVnX2luZm9fdHlwZSBkZWJ1Z190eXBlOwotDAotLyogTWF4aW11bSBsZXZlbCBvZiBtYWNybyBuZXN0aW5nLiAgKi8KLWV4dGVybiBpbnQgbWF4X21hY3JvX25lc3Q7Ci0KLS8qIE9ic3RhY2sgY2h1bmsgc2l6ZS4gIEtlZXAgbGFyZ2UgZm9yIGVmZmljaWVudCBzcGFjZSB1c2UsIG1ha2Ugc21hbGwgdG8KLSAgIGluY3JlYXNlIG1hbGxvYyBjYWxscyBmb3IgbW9uaXRvcmluZyBtZW1vcnkgYWxsb2NhdGlvbi4gICovCi1leHRlcm4gaW50IGNodW5rc2l6ZTsKLQotc3RydWN0IF9wc2V1ZG9fdHlwZQotICB7Ci0gICAgLyogYXNzZW1ibGVyIG1uZW1vbmljLCBsb3dlciBjYXNlLCBubyAnLicgKi8KLSAgICBjb25zdCBjaGFyICpwb2NfbmFtZTsKLSAgICAvKiBEbyB0aGUgd29yayAqLwotICAgIHZvaWQgKCpwb2NfaGFuZGxlcikgUEFSQU1TICgoaW50KSk7Ci0gICAgLyogVmFsdWUgdG8gcGFzcyB0byBoYW5kbGVyICovCi0gICAgaW50IHBvY192YWw7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IF9wc2V1ZG9fdHlwZSBwc2V1ZG9fdHlwZVM7Ci0KLS8qIFByZWZlciB2YXJhcmdzIGZvciBub24tQU5TSSBjb21waWxlciwgc2luY2Ugc29tZSB3aWxsIGJhcmYgaWYgdGhlCi0gICBlbGxpcHNpcyBkZWZpbml0aW9uIGlzIHVzZWQgd2l0aCBhIG5vLWFyZ3VtZW50cyBkZWNsYXJhdGlvbi4gICovCi0jaWYgZGVmaW5lZCAoSEFWRV9WQVJBUkdTX0gpICYmICFkZWZpbmVkIChfX1NURENfXykKLSN1bmRlZiBIQVZFX1NUREFSR19ICi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfU1REQVJHX0gpCi0jZGVmaW5lIFVTRV9TVERBUkcKLSNlbmRpZgotI2lmICFkZWZpbmVkIChVU0VfU1REQVJHKSAmJiBkZWZpbmVkIChIQVZFX1ZBUkFSR1NfSCkKLSNkZWZpbmUgVVNFX1ZBUkFSR1MKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2lmIChfX0dOVUNfXyA+PSAyKSAmJiAhZGVmaW5lZChWTVMpCi0vKiBmb3IgdXNlIHdpdGggLVdmb3JtYXQgKi8KLQotI2lmIF9fR05VQ19NSU5PUl9fIDwgNgotLyogU3VwcG9ydCBmb3IgZG91YmxlIHVuZGVyc2NvcmVzIGluIGF0dHJpYnV0ZSBuYW1lcyB3YXMgYWRkZWQgaW4gZ2NjCi0gICAyLjYsIHNvIGF2b2lkIHRoZW0gaWYgd2UgYXJlIHVzaW5nIGFuIGVhcmxpZXIgdmVyc2lvbi4gICovCi0jZGVmaW5lIF9fcHJpbnRmX18gcHJpbnRmCi0jZGVmaW5lIF9fZm9ybWF0X18gZm9ybWF0Ci0jZW5kaWYKLQotI2RlZmluZSBQUklOVEZfTElLRShGQ04pIFwKLSAgdm9pZCBGQ04gKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBcCi0gICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDEsIDIpKSkKLSNkZWZpbmUgUFJJTlRGX1dIRVJFX0xJS0UoRkNOKSBcCi0gIHZvaWQgRkNOIChjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIFwKLSAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKQotCi0jZWxzZSAvKiBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZChWTVMpICovCi0KLSNkZWZpbmUgUFJJTlRGX0xJS0UoRkNOKQl2b2lkIEZDTiBQQVJBTVMgKChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpCi0jZGVmaW5lIFBSSU5URl9XSEVSRV9MSUtFKEZDTikJdm9pZCBGQ04gUEFSQU1TICgoY2hhciAqZmlsZSwgXAotCQkJCQkJICB1bnNpZ25lZCBpbnQgbGluZSwgXAotCQkJCQkgIAkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSkKLQotI2VuZGlmIC8qIF9fR05VQ19fIDwgMiB8fCBkZWZpbmVkKFZNUykgKi8KLQotI2Vsc2UgLyogISBVU0VfU1REQVJHICovCi0KLSNkZWZpbmUgUFJJTlRGX0xJS0UoRkNOKQl2b2lkIEZDTiAoKQotI2RlZmluZSBQUklOVEZfV0hFUkVfTElLRShGQ04pCXZvaWQgRkNOICgpCi0KLSNlbmRpZiAvKiAhIFVTRV9TVERBUkcgKi8KLQotUFJJTlRGX0xJS0UgKGFzX2JhZCk7Ci1QUklOVEZfTElLRSAoYXNfZmF0YWwpOwotUFJJTlRGX0xJS0UgKGFzX3Rza3Rzayk7Ci1QUklOVEZfTElLRSAoYXNfd2Fybik7Ci1QUklOVEZfV0hFUkVfTElLRSAoYXNfYmFkX3doZXJlKTsKLVBSSU5URl9XSEVSRV9MSUtFIChhc193YXJuX3doZXJlKTsKLQotdm9pZCBhc19hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotdm9pZCBhc19hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSk7Ci0KLXZvaWQgZnByaW50X3ZhbHVlIFBBUkFNUyAoKEZJTEUgKmZpbGUsIGFkZHJlc3NUIHZhbHVlKSk7Ci12b2lkIHNwcmludF92YWx1ZSBQQVJBTVMgKChjaGFyICpidWYsIGFkZHJlc3NUIHZhbHVlKSk7Ci0KLWludCBoYWRfZXJyb3JzIFBBUkFNUyAoKHZvaWQpKTsKLWludCBoYWRfd2FybmluZ3MgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIHByaW50X3ZlcnNpb25faWQgUEFSQU1TICgodm9pZCkpOwotY2hhciAqYXBwX3B1c2ggUEFSQU1TICgodm9pZCkpOwotY2hhciAqYXRvZl9pZWVlIFBBUkFNUyAoKGNoYXIgKnN0ciwgaW50IHdoYXRfa2luZCwgTElUVExFTlVNX1RZUEUgKiB3b3JkcykpOwotY2hhciAqaW5wdXRfc2NydWJfaW5jbHVkZV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpwb3NpdGlvbikpOwotY2hhciAqaW5wdXRfc2NydWJfbmV3X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLWNoYXIgKmlucHV0X3NjcnViX25leHRfYnVmZmVyIFBBUkFNUyAoKGNoYXIgKipidWZwKSk7Ci1pbnQgZG9fc2NydWJfY2hhcnMgUEFSQU1TICgoaW50ICgqZ2V0KSAoY2hhciAqLCBpbnQpLCBjaGFyICp0bywgaW50IHRvbGVuKSk7Ci1pbnQgZ2VuX3RvX3dvcmRzIFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICogd29yZHMsIGludCBwcmVjaXNpb24sCi0JCQkgIGxvbmcgZXhwb25lbnRfYml0cykpOwotaW50IGhhZF9lcnIgUEFSQU1TICgodm9pZCkpOwotaW50IGlnbm9yZV9pbnB1dCBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGNvbmRfZmluaXNoX2NoZWNrIFBBUkFNUyAoKGludCkpOwotdm9pZCBjb25kX2V4aXRfbWFjcm8gUEFSQU1TICgoaW50KSk7Ci1pbnQgc2Vlbl9hdF9sZWFzdF8xX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotdm9pZCBhcHBfcG9wIFBBUkFNUyAoKGNoYXIgKmFyZykpOwotdm9pZCBhc19ob3dtdWNoIFBBUkFNUyAoKEZJTEUgKiBzdHJlYW0pKTsKLXZvaWQgYXNfcGVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmdyaXBlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotdm9pZCBhc193aGVyZSBQQVJBTVMgKChjaGFyICoqbmFtZXAsIHVuc2lnbmVkIGludCAqbGluZXApKTsKLXZvaWQgYnVtcF9saW5lX2NvdW50ZXJzIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgZG9fc2NydWJfYmVnaW4gUEFSQU1TICgoaW50KSk7Ci12b2lkIGlucHV0X3NjcnViX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfc2NydWJfY2xvc2UgUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9zY3J1Yl9lbmQgUEFSQU1TICgodm9pZCkpOwotaW50IG5ld19sb2dpY2FsX2xpbmUgUEFSQU1TICgoY2hhciAqZm5hbWUsIGludCBsaW5lX251bWJlcikpOwotdm9pZCBzdWJzZWdzX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgc3Vic2VnX2NoYW5nZSBQQVJBTVMgKChzZWdUIHNlZywgaW50IHN1YnNlZykpOwotc2VnVCBzdWJzZWdfbmV3IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN1YnNlZ1Qgc3Vic2VnKSk7Ci1zZWdUIHN1YnNlZ19mb3JjZV9uZXcgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgc3Vic2VnVCBzdWJzZWcpKTsKLXZvaWQgc3Vic2VnX3NldCBQQVJBTVMgKChzZWdUIHNlZywgc3Vic2VnVCBzdWJzZWcpKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zZWdUIHN1YnNlZ19nZXQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLSNlbmRpZgotaW50IHN1YnNlZ190ZXh0X3AgUEFSQU1TICgoc2VnVCkpOwotCi12b2lkIHN0YXJ0X2RlcGVuZGVuY2llcyBQQVJBTVMgKChjaGFyICopKTsKLXZvaWQgcmVnaXN0ZXJfZGVwZW5kZW5jeSBQQVJBTVMgKChjaGFyICopKTsKLXZvaWQgcHJpbnRfZGVwZW5kZW5jaWVzIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RydWN0IGV4cHJlc3Npb25TOwotc3RydWN0IGZpeDsKLXR5cGVkZWYgc3RydWN0IHN5bWJvbCBzeW1ib2xTOwotc3RydWN0IHJlbGF4X3R5cGU7Ci10eXBlZGVmIHN0cnVjdCBmcmFnIGZyYWdTOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotLyogbGl0ZXJhbC5jICovCi12YWx1ZVQgYWRkX3RvX2xpdGVyYWxfcG9vbCBQQVJBTVMgKChzeW1ib2xTICosIHZhbHVlVCwgc2VnVCwgaW50KSk7Ci0jZW5kaWYKLQotaW50IGNoZWNrX2VoX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBleHByZXNzaW9uUyAqLCB1bnNpZ25lZCBpbnQgKikpOwotaW50IGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFBBUkFNUyAoKGZyYWdTICopKTsKLWludCBlaF9mcmFtZV9yZWxheF9mcmFnIFBBUkFNUyAoKGZyYWdTICopKTsKLXZvaWQgZWhfZnJhbWVfY29udmVydF9mcmFnIFBBUkFNUyAoKGZyYWdTICopKTsKLQotI2luY2x1ZGUgImV4cHIuaCIJCS8qIEJlZm9yZSB0YXJnLSouaCAqLwotCi0vKiB0aGlzIG9uZSBzdGFydHMgdGhlIGNoYWluIG9mIHRhcmdldCBkZXBlbmRhbnQgaGVhZGVycyAqLwotI2luY2x1ZGUgInRhcmctZW52LmgiCi0KLSNpbmNsdWRlICJ3cml0ZS5oIgotI2luY2x1ZGUgImZyYWdzLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgInJlYWQuaCIKLSNpbmNsdWRlICJzeW1ib2xzLmgiCi0KLSNpbmNsdWRlICJ0Yy5oIgotI2luY2x1ZGUgIm9iai5oIgotCi0jaWZkZWYgVVNFX0VNVUxBVElPTlMKLSNpbmNsdWRlICJlbXVsLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJsaXN0aW5nLmgiCi0KLSNpZm5kZWYgTE9DQUxfTEFCRUxTX0RPTExBUgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDAKLSNlbmRpZgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMAotI2VuZGlmCi0KLSNpZm5kZWYgVEVYVF9TRUNUSU9OX05BTUUKLSNkZWZpbmUgVEVYVF9TRUNUSU9OX05BTUUJIi50ZXh0IgotI2RlZmluZSBEQVRBX1NFQ1RJT05fTkFNRQkiLmRhdGEiCi0jZGVmaW5lIEJTU19TRUNUSU9OX05BTUUJIi5ic3MiCi0jZW5kaWYKLQotI2VuZGlmIC8qIEdBUyAqLwotCi0vKiBlbmQgb2YgYXMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2FzaW50bC5oIGIvZ2FzL2FzaW50bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzMzYzg1Li4wMDAwMDAwCi0tLSBhL2dhcy9hc2ludGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIGFzaW50bC5oIC0gZ2FzLXNwZWNpZmljIGhlYWRlciBmb3IgZ2V0dGV4dCBjb2RlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZmRlZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9hdG9mLWdlbmVyaWMuYyBiL2dhcy9hdG9mLWdlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyOWYyMS4uMDAwMDAwMAotLS0gYS9nYXMvYXRvZi1nZW5lcmljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyogYXRvZl9nZW5lcmljLmMgLSB0dXJuIGEgc3RyaW5nIG9mIGRpZ2l0cyBpbnRvIGEgRmxvbnVtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgKDApCi0jZW5kaWYKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAoMSkKLSNlbmRpZgotCi0jaWZkZWYgVFJBQ0UKLXN0YXRpYyB2b2lkIGZsb251bV9wcmludCBQQVJBTVMgKChjb25zdCBGTE9OVU1fVFlQRSAqKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBBU1NVTUVfREVDSU1BTF9NQVJLX0lTX0RPVAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCUdpdmVuIGEgc3RyaW5nIG9mIGRlY2ltYWwgZGlnaXRzICwgd2l0aCBvcHRpb25hbCBkZWNpbWFsCSoKLSAqCW1hcmsgYW5kIG9wdGlvbmFsIGRlY2ltYWwgZXhwb25lbnQgKHBsYWNlIHZhbHVlKSBvZiB0aGUJCSoKLSAqCWxvd2VzdF9vcmRlciBkZWNpbWFsIGRpZ2l0OiBwcm9kdWNlIGEgZmxvYXRpbmcgcG9pbnQJCSoKLSAqCW51bWJlci4gVGhlIG51bWJlciBpcyAnZ2VuZXJpYycgZmxvYXRpbmcgcG9pbnQ6IG91cgkJKgotICoJY2FsbGVyIHdpbGwgZW5jb2RlIGl0IGZvciBhIHNwZWNpZmljIG1hY2hpbmUgYXJjaGl0ZWN0dXJlLgkqCi0gKgkJCQkJCQkJCSoKLSAqCUFzc3VtcHRpb25zCQkJCQkJCSoKLSAqCQl1c2VzIGJhc2UgKHJhZGl4KSAyCQkJCQkqCi0gKgkJdGhpcyBtYWNoaW5lIHVzZXMgMidzIGNvbXBsZW1lbnQgYmluYXJ5IGludGVnZXJzCSoKLSAqCQl0YXJnZXQgZmxvbnVtcyB1c2UgIiAgICAgICIgICAgICAgICAiICAgICAgICIJCSoKLSAqCQl0YXJnZXQgZmxvbnVtcyBleHBvbmVudHMgZml0IGluIGEgbG9uZwkJCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLQotICBTeW50YXg6Ci0KLSAgPGZsb251bT4gOjo9IDxvcHRpb25hbC1zaWduPiA8ZGVjaW1hbC1udW1iZXI+IDxvcHRpb25hbC1leHBvbmVudD4KLSAgPG9wdGlvbmFsLXNpZ24+IDo6PSAnKycgfCAnLScgfCB7ZW1wdHl9Ci0gIDxkZWNpbWFsLW51bWJlcj4gOjo9IDxpbnRlZ2VyPgotICB8IDxpbnRlZ2VyPiA8cmFkaXgtY2hhcmFjdGVyPgotICB8IDxpbnRlZ2VyPiA8cmFkaXgtY2hhcmFjdGVyPiA8aW50ZWdlcj4KLSAgfCA8cmFkaXgtY2hhcmFjdGVyPiA8aW50ZWdlcj4KLQotICA8b3B0aW9uYWwtZXhwb25lbnQ+IDo6PSB7ZW1wdHl9Ci0gIHwgPGV4cG9uZW50LWNoYXJhY3Rlcj4gPG9wdGlvbmFsLXNpZ24+IDxpbnRlZ2VyPgotCi0gIDxpbnRlZ2VyPiA6Oj0gPGRpZ2l0PiB8IDxkaWdpdD4gPGludGVnZXI+Ci0gIDxkaWdpdD4gOjo9ICcwJyB8ICcxJyB8ICcyJyB8ICczJyB8ICc0JyB8ICc1JyB8ICc2JyB8ICc3JyB8ICc4JyB8ICc5JwotICA8ZXhwb25lbnQtY2hhcmFjdGVyPiA6Oj0ge29uZSBjaGFyYWN0ZXIgZnJvbSAic3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3MifQotICA8cmFkaXgtY2hhcmFjdGVyPiA6Oj0ge29uZSBjaGFyYWN0ZXIgZnJvbSAic3RyaW5nX29mX2RlY2ltYWxfbWFya3MifQotCi0gICovCi0KLWludAotYXRvZl9nZW5lcmljIChhZGRyZXNzX29mX3N0cmluZ19wb2ludGVyLAotCSAgICAgIHN0cmluZ19vZl9kZWNpbWFsX21hcmtzLAotCSAgICAgIHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLAotCSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpCi0gICAgIC8qIHJldHVybiBwb2ludGVyIHRvIGp1c3QgQUZURVIgbnVtYmVyIHdlIHJlYWQuICovCi0gICAgIGNoYXIgKiphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyOwotICAgICAvKiBBdCBtb3N0IG9uZSBwZXIgbnVtYmVyLiAqLwotICAgICBjb25zdCBjaGFyICpzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrczsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3M7Ci0gICAgIEZMT05VTV9UWVBFICphZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwkJLyogMCBtZWFucyBPSy4gKi8KLSAgY2hhciAqZmlyc3RfZGlnaXQ7Ci0gIHVuc2lnbmVkIGludCBudW1iZXJfb2ZfZGlnaXRzX2JlZm9yZV9kZWNpbWFsOwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsOwotICBsb25nIGRlY2ltYWxfZXhwb25lbnQ7Ci0gIHVuc2lnbmVkIGludCBudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZTsKLSAgY2hhciBkaWdpdHNfc2lnbl9jaGFyOwotCi0gIC8qCi0gICAqIFNjYW4gdGhlIGlucHV0IHN0cmluZywgYWJzdHJhY3RpbmcgKDEpZGlnaXRzICgyKWRlY2ltYWwgbWFyayAoMykgZXhwb25lbnQuCi0gICAqIEl0IHdvdWxkIGJlIHNpbXBsZXIgdG8gbW9kaWZ5IHRoZSBzdHJpbmcsIGJ1dCB3ZSBkb24ndDsganVzdCB0byBiZSBuaWNlCi0gICAqIHRvIGNhbGxlci4KLSAgICogV2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGRpZ2l0cyB3ZSBoYXZlLCBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgZm9yCi0gICAqIHRoZSBkaWdpdHMnIHZhbHVlLgotICAgKi8KLQotICBjaGFyICpwOwotICBjaGFyIGM7Ci0gIGludCBzZWVuX3NpZ25pZmljYW50X2RpZ2l0OwotCi0jaWZkZWYgQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QKLSAgYXNzZXJ0IChzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrc1swXSA9PSAnLicKLQkgICYmIHN0cmluZ19vZl9kZWNpbWFsX21hcmtzWzFdID09IDApOwotI2RlZmluZSBJU19ERUNJTUFMX01BUksoYykJKChjKSA9PSAnLicpCi0jZWxzZQotI2RlZmluZSBJU19ERUNJTUFMX01BUksoYykJKDAgIT0gc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrcywgKGMpKSkKLSNlbmRpZgotCi0gIGZpcnN0X2RpZ2l0ID0gKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXI7Ci0gIGMgPSAqZmlyc3RfZGlnaXQ7Ci0KLSAgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKQotICAgIHsKLSAgICAgIGRpZ2l0c19zaWduX2NoYXIgPSBjOwotICAgICAgZmlyc3RfZGlnaXQrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICBkaWdpdHNfc2lnbl9jaGFyID0gJysnOwotCi0gIHN3aXRjaCAoZmlyc3RfZGlnaXRbMF0pCi0gICAgewotICAgIGNhc2UgJ24nOgotICAgIGNhc2UgJ04nOgotICAgICAgaWYgKCFzdHJuY2FzZWNtcCAoIm5hbiIsIGZpcnN0X2RpZ2l0LCAzKSkKLQl7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5zaWduID0gMDsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxlYWRlciA9Ci0JICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKLQkgICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyID0gZmlyc3RfZGlnaXQgKyAzOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdpJzoKLSAgICBjYXNlICdJJzoKLSAgICAgIGlmICghc3RybmNhc2VjbXAgKCJpbmYiLCBmaXJzdF9kaWdpdCwgMykpCi0JewotCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9Ci0JICAgIGRpZ2l0c19zaWduX2NoYXIgPT0gJysnID8gJ1AnIDogJ04nOwotCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+ZXhwb25lbnQgPSAwOwotCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bGVhZGVyID0KLQkgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bG93OwotCi0JICBmaXJzdF9kaWdpdCArPSAzOwotCSAgaWYgKCFzdHJuY2FzZWNtcCAoImluaXR5IiwgZmlyc3RfZGlnaXQsIDUpKQotCSAgICBmaXJzdF9kaWdpdCArPSA1OwotCi0JICAqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciA9IGZpcnN0X2RpZ2l0OwotCi0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbCA9IDA7Ci0gIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbCA9IDA7Ci0gIGRlY2ltYWxfZXhwb25lbnQgPSAwOwotICBzZWVuX3NpZ25pZmljYW50X2RpZ2l0ID0gMDsKLSAgZm9yIChwID0gZmlyc3RfZGlnaXQ7Ci0gICAgICAgKCgoYyA9ICpwKSAhPSAnXDAnKQotCSYmICghYyB8fCAhSVNfREVDSU1BTF9NQVJLIChjKSkKLQkmJiAoIWMgfHwgIXN0cmNociAoc3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3MsIGMpKSk7Ci0gICAgICAgcCsrKQotICAgIHsKLSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykpCi0JewotCSAgaWYgKHNlZW5fc2lnbmlmaWNhbnRfZGlnaXQgfHwgYyA+ICcwJykKLQkgICAgewotCSAgICAgICsrbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbDsKLQkgICAgICBzZWVuX3NpZ25pZmljYW50X2RpZ2l0ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZmlyc3RfZGlnaXQrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBicmVhazsJCS8qIHAgLT4gY2hhciBhZnRlciBwcmUtZGVjaW1hbCBkaWdpdHMuICovCi0JfQotICAgIH0JCQkJLyogRm9yIGVhY2ggZGlnaXQgYmVmb3JlIGRlY2ltYWwgbWFyay4gKi8KLQotI2lmbmRlZiBPTERfRkxPQVRfUkVBRFMKLSAgLyogSWdub3JlIHRyYWlsaW5nIDAncyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gIFRoZSBvcmlnaW5hbCBjb2RlIGhlcmUKLSAgICogKGlmZGVmJ2Qgb3V0KSBkb2VzIG5vdCBkbyB0aGlzLCBhbmQgbnVtYmVycyBsaWtlCi0gICAqCTQuMjk0OTY3Mjk2MDAwMDAwMDAwMDBlKzA5CSgyKiozMSkKLSAgICogY29tZSBvdXQgaW5leGFjdCBmb3Igc29tZSByZWFzb24gcmVsYXRlZCB0byBsZW5ndGggb2YgdGhlIGRpZ2l0Ci0gICAqIHN0cmluZy4KLSAgICovCi0gIGlmIChjICYmIElTX0RFQ0lNQUxfTUFSSyAoYykpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHplcm9zID0gMDsJLyogTGVuZ3RoIG9mIGN1cnJlbnQgc3RyaW5nIG9mIHplcm9zICovCi0KLSAgICAgIGZvciAocCsrOyAoYyA9ICpwKSAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYyk7IHArKykKLQl7Ci0JICBpZiAoYyA9PSAnMCcpCi0JICAgIHsKLQkgICAgICB6ZXJvcysrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwgKz0gMSArIHplcm9zOwotCSAgICAgIHplcm9zID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0jZWxzZQotICBpZiAoYyAmJiBJU19ERUNJTUFMX01BUksgKGMpKQotICAgIHsKLSAgICAgIGZvciAocCsrOwotCSAgICgoKGMgPSAqcCkgIT0gJ1wwJykKLQkgICAgJiYgKCFjIHx8ICFzdHJjaHIgKHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLCBjKSkpOwotCSAgIHArKykKLQl7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtYXkgYmUgcmV0cmFjdGVkIGJlbG93LiAqLwotCSAgICAgIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbCsrOwotCi0JICAgICAgaWYgKCAvKiBzZWVuX3NpZ25pZmljYW50X2RpZ2l0IHx8ICovIGMgPiAnMCcpCi0JCXsKLQkJICBzZWVuX3NpZ25pZmljYW50X2RpZ2l0ID0gVFJVRTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoIXNlZW5fc2lnbmlmaWNhbnRfZGlnaXQpCi0JCXsKLQkJICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwgPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9CQkJLyogRm9yIGVhY2ggZGlnaXQgYWZ0ZXIgZGVjaW1hbCBtYXJrLiAqLwotICAgIH0KLQotICB3aGlsZSAobnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsCi0JICYmIGZpcnN0X2RpZ2l0W251bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwKLQkJCSsgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsXSA9PSAnMCcpCi0gICAgLS1udW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWw7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19tNjhrX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoYyA9PSAnXycpCi0JYyA9ICorK3A7Ci0gICAgfQotICBpZiAoYyAmJiBzdHJjaHIgKHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLCBjKSkKLSAgICB7Ci0gICAgICBjaGFyIGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXI7Ci0KLSAgICAgIGMgPSAqKytwOwotICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JewotCSAgd2hpbGUgKGMgPT0gJ18nKQotCSAgICBjID0gKisrcDsKLQl9Ci0gICAgICBpZiAoYyAmJiBzdHJjaHIgKCIrLSIsIGMpKQotCXsKLQkgIGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXIgPSBjOwotCSAgYyA9ICorK3A7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXIgPSAnKyc7Ci0JfQotCi0gICAgICBmb3IgKDsgKGMpOyBjID0gKisrcCkKLQl7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICB7Ci0JICAgICAgZGVjaW1hbF9leHBvbmVudCA9IGRlY2ltYWxfZXhwb25lbnQgKiAxMCArIGMgLSAnMCc7Ci0JICAgICAgLyoKLQkgICAgICAgKiBCVUchIElmIHdlIG92ZXJmbG93IGhlcmUsIHdlIGxvc2UhCi0JICAgICAgICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZGlnaXRzX2V4cG9uZW50X3NpZ25fY2hhciA9PSAnLScpCi0JewotCSAgZGVjaW1hbF9leHBvbmVudCA9IC1kZWNpbWFsX2V4cG9uZW50OwotCX0KLSAgICB9Ci0KLSAgKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIgPSBwOwotCi0KLQotICBudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZSA9Ci0gICAgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbCArIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbDsKLSAgcmV0dXJuX3ZhbHVlID0gMDsKLSAgaWYgKG51bWJlcl9vZl9kaWdpdHNfYXZhaWxhYmxlID09IDApCi0gICAgewotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+ZXhwb25lbnQgPSAwOwkvKiBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5ICovCi0gICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sZWFkZXIKLQk9IC0xICsgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bG93OwotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9IGRpZ2l0c19zaWduX2NoYXI7Ci0gICAgICAvKiBXZSBoYXZlIGp1c3QgY29uY29jdGVkICgrLy0pMC4wRTAgKi8KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBjb3VudDsJCS8qIE51bWJlciBvZiB1c2VmdWwgZGlnaXRzIGxlZnQgdG8gc2Nhbi4gKi8KLQotICAgICAgTElUVExFTlVNX1RZUEUgKmRpZ2l0c19iaW5hcnlfbG93OwotICAgICAgdW5zaWduZWQgaW50IHByZWNpc2lvbjsKLSAgICAgIHVuc2lnbmVkIGludCBtYXhpbXVtX3VzZWZ1bF9kaWdpdHM7Ci0gICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c190b191c2U7Ci0gICAgICB1bnNpZ25lZCBpbnQgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHM7Ci0gICAgICB1bnNpZ25lZCBpbnQgbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHM7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtczsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplX29mX2RpZ2l0c19pbl9jaGFyczsKLSAgICAgIEZMT05VTV9UWVBFIHBvd2VyX29mXzEwX2Zsb251bTsKLSAgICAgIEZMT05VTV9UWVBFIGRpZ2l0c19mbG9udW07Ci0KLSAgICAgIHByZWNpc2lvbiA9IChhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5oaWdoCi0JCSAgIC0gYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bG93Ci0JCSAgICsgMSk7CS8qIE51bWJlciBvZiBkZXN0aW5hdGlvbiBsaXR0bGVudW1zLiAqLwotCi0gICAgICAvKiBJbmNsdWRlcyBndWFyZCBiaXRzICh0d28gbGl0dGxlbnVtcyB3b3J0aCkgKi8KLSNpZiAwIC8qIFRoZSBpbnRlZ2VyIHZlcnNpb24gYmVsb3cgaXMgdmVyeSBjbG9zZSwgYW5kIGl0IGRvZXNuJ3QKLQkgcmVxdWlyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0ICh3aGljaCBpcyBjdXJyZW50bHkgYnVnZ3kgb24KLQkgdGhlIEFscGhhKS4gICovCi0gICAgICBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMgPSAoKChkb3VibGUpIChwcmVjaXNpb24gLSAyKSkKLQkJCSAgICAgICAqICgoZG91YmxlKSAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKSkKLQkJCSAgICAgICAvIChMT0dfVE9fQkFTRV8yX09GXzEwKSkKLQkrIDI7CQkJLyogMiA6OiBndWFyZCBkaWdpdHMuICovCi0jZWxzZQotICAgICAgbWF4aW11bV91c2VmdWxfZGlnaXRzID0gKCgocHJlY2lzaW9uIC0gMikpCi0JCQkgICAgICAgKiAoIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpKQotCQkJICAgICAgICogMTAwMDAwMCAvIDMzMjE5MjgpCi0JKyAyOwkJCS8qIDIgOjogZ3VhcmQgZGlnaXRzLiAqLwotI2VuZGlmCi0KLSAgICAgIGlmIChudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZSA+IG1heGltdW1fdXNlZnVsX2RpZ2l0cykKLQl7Ci0JICBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSA9IG1heGltdW1fdXNlZnVsX2RpZ2l0czsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbnVtYmVyX29mX2RpZ2l0c190b191c2UgPSBudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZTsKLQl9Ci0KLSAgICAgIC8qIENhc3QgdGhlc2UgdG8gU0lHTkVEIExPTkcgZmlyc3QsIG90aGVyd2lzZSwgb24gc3lzdGVtcyB3aXRoCi0JIExPTkcgd2lkZXIgdGhhbiBJTlQgKHN1Y2ggYXMgQWxwaGEgT1NGLzEpLCB1bnNpZ25lZG5lc3MgbWF5Ci0JIGNhdXNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4gICovCi0gICAgICBkZWNpbWFsX2V4cG9uZW50ICs9ICgobG9uZykgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbAotCQkJICAgLSAobG9uZykgbnVtYmVyX29mX2RpZ2l0c190b191c2UpOwotCi0jaWYgMAotICAgICAgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMKLQk9ICgoKChkb3VibGUpIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlKSAqIExPR19UT19CQVNFXzJfT0ZfMTApICsgMSk7Ci0jZWxzZQotICAgICAgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMKLQk9IChudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSAqIDMzMjE5MjggLyAxMDAwMDAwICsgMSk7Ci0jZW5kaWYKLQotICAgICAgbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHMKLQk9IChtb3JlX3RoYW5fZW5vdWdoX2JpdHNfZm9yX2RpZ2l0cwotCSAgIC8gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSsgMjsKLQotICAgICAgLyogQ29tcHV0ZSAoZGlnaXRzKSBwYXJ0LiBJbiAiMTIuMzRFNTYiIHRoaXMgaXMgdGhlICIxMjM0IiBwYXJ0LgotCSBBcml0aG1ldGljIGlzIGV4YWN0IGhlcmUuIElmIG5vIGRpZ2l0cyBhcmUgc3VwcGxpZWQgdGhlbiB0aGlzCi0JIHBhcnQgaXMgYSAwIHZhbHVlZCBiaW5hcnkgaW50ZWdlci4gIEFsbG9jYXRlIHJvb20gdG8gYnVpbGQgdXAKLQkgdGhlIGJpbmFyeSBudW1iZXIgYXMgbGl0dGxlbnVtcy4gIFdlIHdhbnQgdGhpcyBtZW1vcnkgdG8KLQkgZGlzYXBwZWFyIHdoZW4gd2UgbGVhdmUgdGhpcyBmdW5jdGlvbi4gIEFzc3VtZSBubyBhbGlnbm1lbnQKLQkgcHJvYmxlbXMgPT4gKHJvb20gZm9yIG4gb2JqZWN0cykgPT0gbiAqIChyb29tIGZvciAxCi0JIG9iamVjdCkuICAqLwotCi0gICAgICBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zID0gbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHM7Ci0gICAgICBzaXplX29mX2RpZ2l0c19pbl9jaGFycyA9IHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMKLQkqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCi0gICAgICBkaWdpdHNfYmluYXJ5X2xvdyA9IChMSVRUTEVOVU1fVFlQRSAqKQotCWFsbG9jYSAoc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnMpOwotCi0gICAgICBtZW1zZXQgKChjaGFyICopIGRpZ2l0c19iaW5hcnlfbG93LCAnXDAnLCBzaXplX29mX2RpZ2l0c19pbl9jaGFycyk7Ci0KLSAgICAgIC8qIERpZ2l0c19iaW5hcnlfbG93W10gaXMgYWxsb2NhdGVkIGFuZCB6ZXJvZWQuICovCi0KLSAgICAgIC8qCi0gICAgICAgKiBQYXJzZSB0aGUgZGVjaW1hbCBkaWdpdHMgYXMgaWYgKiBkaWdpdHNfbG93IHdhcyBpbiB0aGUgdW5pdHMgcG9zaXRpb24uCi0gICAgICAgKiBFbWl0IGEgYmluYXJ5IG51bWJlciBpbnRvIGRpZ2l0c19iaW5hcnlfbG93W10uCi0gICAgICAgKgotICAgICAgICogVXNlIGEgbGFyZ2UtcHJlY2lzaW9uIHZlcnNpb24gb2Y6Ci0gICAgICAgKiAoKCgxc3QtZGlnaXQpICogMTAgKyAybmQtZGlnaXQpICogMTAgKyAzcmQtZGlnaXQgLi4uKSAqIDEwICsgbGFzdC1kaWdpdAotICAgICAgICovCi0KLSAgICAgIGZvciAocCA9IGZpcnN0X2RpZ2l0LCBjb3VudCA9IG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlOyBjb3VudDsgcCsrLCAtLWNvdW50KQotCXsKLQkgIGMgPSAqcDsKLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIE11bHRpcGx5IGJ5IDEwLiBBc3N1bWUgY2FuIG5ldmVyIG92ZXJmbG93LgotCSAgICAgICAqIEFkZCB0aGlzIGRpZ2l0IHRvIGRpZ2l0c19iaW5hcnlfbG93W10uCi0JICAgICAgICovCi0KLQkgICAgICBsb25nIGNhcnJ5OwotCSAgICAgIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLQkgICAgICBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX2xpbWl0OwotCi0JICAgICAgbGl0dGxlbnVtX2xpbWl0ID0gZGlnaXRzX2JpbmFyeV9sb3cKLQkJKyBtb3JlX3RoYW5fZW5vdWdoX2xpdHRsZW51bXNfZm9yX2RpZ2l0cwotCQktIDE7Ci0KLQkgICAgICBjYXJyeSA9IGMgLSAnMCc7CS8qIGNoYXIgLT4gYmluYXJ5ICovCi0KLQkgICAgICBmb3IgKGxpdHRsZW51bV9wb2ludGVyID0gZGlnaXRzX2JpbmFyeV9sb3c7Ci0JCSAgIGxpdHRsZW51bV9wb2ludGVyIDw9IGxpdHRsZW51bV9saW1pdDsKLQkJICAgbGl0dGxlbnVtX3BvaW50ZXIrKykKLQkJewotCQkgIGxvbmcgd29yazsKLQotCQkgIHdvcmsgPSBjYXJyeSArIDEwICogKGxvbmcpICgqbGl0dGxlbnVtX3BvaW50ZXIpOwotCQkgICpsaXR0bGVudW1fcG9pbnRlciA9IHdvcmsgJiBMSVRUTEVOVU1fTUFTSzsKLQkJICBjYXJyeSA9IHdvcmsgPj4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQl9Ci0KLQkgICAgICBpZiAoY2FycnkgIT0gMCkKLQkJewotCQkgIC8qCi0JCSAgICogV2UgaGF2ZSBhIEdST1NTIGludGVybmFsIGVycm9yLgotCQkgICAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQkJICAgKi8KLQkJICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKytjb3VudDsJCS8qICcuJyBkb2Vzbid0IGFsdGVyIGRpZ2l0cyB1c2VkIGNvdW50LiAqLwotCSAgICB9Ci0JfQotCi0KLSAgICAgIC8qCi0gICAgICAgKiBEaWdpdHNfYmluYXJ5X2xvd1tdIHByb3Blcmx5IGVuY29kZXMgdGhlIHZhbHVlIG9mIHRoZSBkaWdpdHMuCi0gICAgICAgKiBGb3JnZXQgYWJvdXQgYW55IGhpZ2gtb3JkZXIgbGl0dGxlbnVtcyB0aGF0IGFyZSAwLgotICAgICAgICovCi0gICAgICB3aGlsZSAoZGlnaXRzX2JpbmFyeV9sb3dbc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcyAtIDFdID09IDAKLQkgICAgICYmIHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMgPj0gMikKLQlzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zLS07Ci0KLSAgICAgIGRpZ2l0c19mbG9udW0ubG93ID0gZGlnaXRzX2JpbmFyeV9sb3c7Ci0gICAgICBkaWdpdHNfZmxvbnVtLmhpZ2ggPSBkaWdpdHNfYmluYXJ5X2xvdyArIHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMgLSAxOwotICAgICAgZGlnaXRzX2Zsb251bS5sZWFkZXIgPSBkaWdpdHNfZmxvbnVtLmhpZ2g7Ci0gICAgICBkaWdpdHNfZmxvbnVtLmV4cG9uZW50ID0gMDsKLSAgICAgIC8qCi0gICAgICAgKiBUaGUgdmFsdWUgb2YgZGlnaXRzX2Zsb251bSAuIHNpZ24gc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQuCi0gICAgICAgKiBXZSBoYXZlIGFscmVhZHkgZGVjaWRlZCB0aGUgb3V0cHV0J3Mgc2lnbi4KLSAgICAgICAqIFdlIHRydXN0IHRoYXQgdGhlIHNpZ24gd29uJ3QgaW5mbHVlbmNlIHRoZSBvdGhlciBwYXJ0cyBvZiB0aGUgbnVtYmVyIQotICAgICAgICogU28gd2UgZ2l2ZSBpdCBhIHZhbHVlIGZvciB0aGVzZSByZWFzb25zOgotICAgICAgICogKDEpIGNvdXJ0ZXN5IHRvIGh1bWFucyByZWFkaW5nL2RlYnVnZ2luZwotICAgICAgICogICAgIHRoZXNlIG51bWJlcnMgc28gdGhleSBkb24ndCBnZXQgZXhjaXRlZCBhYm91dCBzdHJhbmdlIHZhbHVlcwotICAgICAgICogKDIpIGluIGZ1dHVyZSB0aGVyZSBtYXkgYmUgbW9yZSBtZWFuaW5nIGF0dGFjaGVkIHRvIHNpZ24sCi0gICAgICAgKiAgICAgYW5kIHdoYXQgd2FzCi0gICAgICAgKiAgICAgaGFybWxlc3Mgbm9pc2UgbWF5IGJlY29tZSBkaXNydXB0aXZlLCBpbGwtY29uZGl0aW9uZWQgKG9yIHdvcnNlKQotICAgICAgICogICAgIGlucHV0LgotICAgICAgICovCi0gICAgICBkaWdpdHNfZmxvbnVtLnNpZ24gPSAnKyc7Ci0KLSAgICAgIHsKLQkvKgotCSAqIENvbXB1dGUgdGhlIG1hbnRzc2EgKCYgZXhwb25lbnQpIG9mIHRoZSBwb3dlciBvZiAxMC4KLQkgKiBJZiBzdWNlc3NmdWwsIHRoZW4gbXVsdGlwbHkgdGhlIHBvd2VyIG9mIDEwIGJ5IHRoZSBkaWdpdHMKLQkgKiBnaXZpbmcgcmV0dXJuX2JpbmFyeV9tYW50aXNzYSBhbmQgcmV0dXJuX2JpbmFyeV9leHBvbmVudC4KLQkgKi8KLQotCUxJVFRMRU5VTV9UWVBFICpwb3dlcl9iaW5hcnlfbG93OwotCWludCBkZWNpbWFsX2V4cG9uZW50X2lzX25lZ2F0aXZlOwotCS8qIFRoaXMgcmVmZXJzIHRvIHRoZSAiLTU2IiBpbiAiMTIuMzRFLTU2Ii4gKi8KLQkvKiBGQUxTRTogZGVjaW1hbF9leHBvbmVudCBpcyBwb3NpdGl2ZSAob3IgMCkgKi8KLQkvKiBUUlVFOiAgZGVjaW1hbF9leHBvbmVudCBpcyBuZWdhdGl2ZSAqLwotCUZMT05VTV9UWVBFIHRlbXBvcmFyeV9mbG9udW07Ci0JTElUVExFTlVNX1RZUEUgKnRlbXBvcmFyeV9iaW5hcnlfbG93OwotCXVuc2lnbmVkIGludCBzaXplX29mX3Bvd2VyX2luX2xpdHRsZW51bXM7Ci0JdW5zaWduZWQgaW50IHNpemVfb2ZfcG93ZXJfaW5fY2hhcnM7Ci0KLQlzaXplX29mX3Bvd2VyX2luX2xpdHRsZW51bXMgPSBwcmVjaXNpb247Ci0JLyogUHJlY2lzaW9uIGhhcyBhIGJ1aWx0LWluIGZ1ZGdlIGZhY3RvciBzbyB3ZSBnZXQgYSBmZXcgZ3VhcmQgYml0cy4gKi8KLQotCWRlY2ltYWxfZXhwb25lbnRfaXNfbmVnYXRpdmUgPSBkZWNpbWFsX2V4cG9uZW50IDwgMDsKLQlpZiAoZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZSkKLQkgIHsKLQkgICAgZGVjaW1hbF9leHBvbmVudCA9IC1kZWNpbWFsX2V4cG9uZW50OwotCSAgfQotCi0JLyogRnJvbSBub3cgb246IHRoZSBkZWNpbWFsIGV4cG9uZW50IGlzID4gMC4gSXRzIHNpZ24gaXMgc2VwYXJhdGUuICovCi0KLQlzaXplX29mX3Bvd2VyX2luX2NoYXJzID0gc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zCi0JICAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICsgMjsKLQotCXBvd2VyX2JpbmFyeV9sb3cgPSAoTElUVExFTlVNX1RZUEUgKikgYWxsb2NhIChzaXplX29mX3Bvd2VyX2luX2NoYXJzKTsKLQl0ZW1wb3JhcnlfYmluYXJ5X2xvdyA9IChMSVRUTEVOVU1fVFlQRSAqKSBhbGxvY2EgKHNpemVfb2ZfcG93ZXJfaW5fY2hhcnMpOwotCW1lbXNldCAoKGNoYXIgKikgcG93ZXJfYmluYXJ5X2xvdywgJ1wwJywgc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyk7Ci0JKnBvd2VyX2JpbmFyeV9sb3cgPSAxOwotCXBvd2VyX29mXzEwX2Zsb251bS5leHBvbmVudCA9IDA7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLmxvdyA9IHBvd2VyX2JpbmFyeV9sb3c7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLmxlYWRlciA9IHBvd2VyX2JpbmFyeV9sb3c7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLmhpZ2ggPSBwb3dlcl9iaW5hcnlfbG93ICsgc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zIC0gMTsKLQlwb3dlcl9vZl8xMF9mbG9udW0uc2lnbiA9ICcrJzsKLQl0ZW1wb3JhcnlfZmxvbnVtLmxvdyA9IHRlbXBvcmFyeV9iaW5hcnlfbG93OwotCXRlbXBvcmFyeV9mbG9udW0uaGlnaCA9IHRlbXBvcmFyeV9iaW5hcnlfbG93ICsgc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zIC0gMTsKLQkvKgotCSAqIChwb3dlcikgPT0gMS4KLQkgKiBTcGFjZSBmb3IgdGVtcG9yYXJ5X2Zsb251bSBhbGxvY2F0ZWQuCi0JICovCi0KLQkvKgotCSAqIC4uLgotCSAqCi0JICogV0hJTEUJbW9yZSBiaXRzCi0JICogRE8JZmluZCBuZXh0IGJpdCAod2l0aCBwbGFjZSB2YWx1ZSkKLQkgKgltdWx0aXBseSBpbnRvIHBvd2VyIG1hbnRpc3NhCi0JICogT0QKLQkgKi8KLQl7Ci0JICBpbnQgcGxhY2VfbnVtYmVyX2xpbWl0OwotCSAgLyogQW55IDEwXigyXm4pIHdob3NlICJuIiBleGNlZWRzIHRoaXMgKi8KLQkgIC8qIHZhbHVlIHdpbGwgZmFsbCBvZmYgdGhlIGVuZCBvZiAqLwotCSAgLyogZmxvbnVtX1hYWFhfcG93ZXJzX29mX3RlbltdLiAqLwotCSAgaW50IHBsYWNlX251bWJlcjsKLQkgIGNvbnN0IEZMT05VTV9UWVBFICptdWx0aXBsaWNhbmQ7CS8qIC0+IDEwXigyXm4pICovCi0KLQkgIHBsYWNlX251bWJlcl9saW1pdCA9IHRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW47Ci0KLQkgIG11bHRpcGxpY2FuZCA9IChkZWNpbWFsX2V4cG9uZW50X2lzX25lZ2F0aXZlCi0JCQkgID8gZmxvbnVtX25lZ2F0aXZlX3Bvd2Vyc19vZl90ZW4KLQkJCSAgOiBmbG9udW1fcG9zaXRpdmVfcG93ZXJzX29mX3Rlbik7Ci0KLQkgIGZvciAocGxhY2VfbnVtYmVyID0gMTsvKiBQbGFjZSB2YWx1ZSBvZiB0aGlzIGJpdCBvZiBleHBvbmVudC4gKi8KLQkgICAgICAgZGVjaW1hbF9leHBvbmVudDsvKiBRdWl0IHdoZW4gbm8gbW9yZSAxIGJpdHMgaW4gZXhwb25lbnQuICovCi0JICAgICAgIGRlY2ltYWxfZXhwb25lbnQgPj49IDEsIHBsYWNlX251bWJlcisrKQotCSAgICB7Ci0JICAgICAgaWYgKGRlY2ltYWxfZXhwb25lbnQgJiAxKQotCQl7Ci0JCSAgaWYgKHBsYWNlX251bWJlciA+IHBsYWNlX251bWJlcl9saW1pdCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGRlY2ltYWwgZXhwb25lbnQgaGFzIGEgbWFnbml0dWRlIHNvIGdyZWF0Ci0JCQkgdGhhdCBvdXIgdGFibGVzIGNhbid0IGhlbHAgdXMgZnJhZ21lbnQgaXQuCi0JCQkgQWx0aG91Z2ggdGhpcyByb3V0aW5lIGlzIGluIGVycm9yIGJlY2F1c2UgaXQKLQkJCSBjYW4ndCBpbWFnaW5lIGEgbnVtYmVyIHRoYXQgYmlnLCBzaWduYWwgYW4KLQkJCSBlcnJvciBhcyBpZiBpdCBpcyB0aGUgdXNlcidzIGZhdWx0IGZvcgotCQkJIHByZXNlbnRpbmcgc3VjaCBhIGJpZyBudW1iZXIuICAqLwotCQkgICAgICByZXR1cm5fdmFsdWUgPSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVzsKLQkJICAgICAgLyogcXVpdCBvdXQgb2YgbG9vcCBncmFjZWZ1bGx5ICovCi0JCSAgICAgIGRlY2ltYWxfZXhwb25lbnQgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLSNpZmRlZiBUUkFDRQotCQkgICAgICBwcmludGYgKCJiZWZvcmUgbXVsdGlwbHksIHBsYWNlX251bWJlciA9ICVkLiwgcG93ZXJfb2ZfMTBfZmxvbnVtOlxuIiwKLQkJCSAgICAgIHBsYWNlX251bWJlcik7Ci0KLQkJICAgICAgZmxvbnVtX3ByaW50ICgmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLQkJICAgICAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotI2VuZGlmCi0jaWZkZWYgVFJBQ0UKLQkJICAgICAgcHJpbnRmICgibXVsdGlwbGllcjpcbiIpOwotCQkgICAgICBmbG9udW1fcHJpbnQgKG11bHRpcGxpY2FuZCArIHBsYWNlX251bWJlcik7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCQkgICAgICBmbG9udW1fbXVsdGlwIChtdWx0aXBsaWNhbmQgKyBwbGFjZV9udW1iZXIsCi0JCQkJICAgICAmcG93ZXJfb2ZfMTBfZmxvbnVtLCAmdGVtcG9yYXJ5X2Zsb251bSk7Ci0jaWZkZWYgVFJBQ0UKLQkJICAgICAgcHJpbnRmICgiYWZ0ZXIgbXVsdGlwbHk6XG4iKTsKLQkJICAgICAgZmxvbnVtX3ByaW50ICgmdGVtcG9yYXJ5X2Zsb251bSk7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCQkgICAgICBmbG9udW1fY29weSAoJnRlbXBvcmFyeV9mbG9udW0sICZwb3dlcl9vZl8xMF9mbG9udW0pOwotI2lmZGVmIFRSQUNFCi0JCSAgICAgIHByaW50ZiAoImFmdGVyIGNvcHk6XG4iKTsKLQkJICAgICAgZmxvbnVtX3ByaW50ICgmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLQkJICAgICAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotI2VuZGlmCi0JCSAgICB9IC8qIElmIHRoaXMgYml0IG9mIGRlY2ltYWxfZXhwb25lbnQgd2FzIGNvbXB1dGFibGUuKi8KLQkJfSAvKiBJZiB0aGlzIGJpdCBvZiBkZWNpbWFsX2V4cG9uZW50IHdhcyBzZXQuICovCi0JICAgIH0gLyogRm9yIGVhY2ggYml0IG9mIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBleHBvbmVudCAqLwotI2lmZGVmIFRSQUNFCi0JICBwcmludGYgKCJhZnRlciBjb21wdXRpbmcgcG93ZXJfb2ZfMTBfZmxvbnVtOlxuIik7Ci0JICBmbG9udW1fcHJpbnQgKCZwb3dlcl9vZl8xMF9mbG9udW0pOwotCSAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotI2VuZGlmCi0JfQotCi0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBwb3dlcl9vZl8xMF9mbG9udW0gaXMgcG93ZXIgb2YgdGVuIGluIGJpbmFyeSAobWFudGlzc2EpICwgKGV4cG9uZW50KS4KLSAgICAgICAqIEl0IG1heSBiZSB0aGUgbnVtYmVyIDEsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgTkVFRCB0byBtdWx0aXBseS4KLSAgICAgICAqCi0gICAgICAgKiBNdWx0aXBseSAoZGVjaW1hbCBkaWdpdHMpIGJ5IHBvd2VyX29mXzEwX2Zsb251bS4KLSAgICAgICAqLwotCi0gICAgICBmbG9udW1fbXVsdGlwICgmcG93ZXJfb2ZfMTBfZmxvbnVtLCAmZGlnaXRzX2Zsb251bSwgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcik7Ci0gICAgICAvKiBBc3NlcnQgc2lnbiBvZiB0aGUgbnVtYmVyIHdlIG1hZGUgaXMgJysnLiAqLwotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9IGRpZ2l0c19zaWduX2NoYXI7Ci0KLSAgICB9Ci0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19Ci0KLSNpZmRlZiBUUkFDRQotc3RhdGljIHZvaWQKLWZsb251bV9wcmludCAoZikKLSAgICAgY29uc3QgRkxPTlVNX1RZUEUgKmY7Ci17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgY2hhciBsaXR0bGVudW1fZm9ybWF0WzEwXTsKLSAgc3ByaW50ZiAobGl0dGxlbnVtX2Zvcm1hdCwgIiAlJTAlZHgiLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIDIpOwotI2RlZmluZSBwcmludF9saXR0bGVudW0oTFApCShwcmludGYgKGxpdHRsZW51bV9mb3JtYXQsIExQKSkKLSAgcHJpbnRmICgiZmxvbnVtIEAlcCAlYyBlJWxkIiwgZiwgZi0+c2lnbiwgZi0+ZXhwb25lbnQpOwotICBpZiAoZi0+bG93IDwgZi0+aGlnaCkKLSAgICBmb3IgKGxwID0gZi0+aGlnaDsgbHAgPj0gZi0+bG93OyBscC0tKQotICAgICAgcHJpbnRfbGl0dGxlbnVtICgqbHApOwotICBlbHNlCi0gICAgZm9yIChscCA9IGYtPmxvdzsgbHAgPD0gZi0+aGlnaDsgbHArKykKLSAgICAgIHByaW50X2xpdHRsZW51bSAoKmxwKTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgZmZsdXNoIChzdGRvdXQpOwotfQotI2VuZGlmCi0KLS8qIGVuZCBvZiBhdG9mX2dlbmVyaWMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpZ251bS1jb3B5LmMgYi9nYXMvYmlnbnVtLWNvcHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmZmNiZi4uMDAwMDAwMAotLS0gYS9nYXMvYmlnbnVtLWNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIGJpZ251bV9jb3B5LmMgLSBjb3B5IGEgYmlnbnVtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyoKLSAqCQkJYmlnbnVtX2NvcHkgKCkKLSAqCi0gKiBDb3B5IGEgYmlnbnVtIGZyb20gaW4gdG8gb3V0LgotICogSWYgdGhlIG91dHB1dCBpcyBzaG9ydGVyIHRoYW4gdGhlIGlucHV0LCBjb3B5IGxvd2VyLW9yZGVyIGxpdHRsZW51bXMuCi0gKiBSZXR1cm4gMCBvciB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGxpdHRsZW51bXMgZHJvcHBlZC4KLSAqIEFzc3VtZXMgbGl0dGxlbnVtIGFycmF5cyBhcmUgZGVuc2VseSBwYWNrZWQ6IG5vIHVudXNlZCBjaGFycyBiZXR3ZWVuCi0gKiB0aGUgbGl0dGxlbnVtcy4gVXNlcyBtZW1jcHkoKSB0byBtb3ZlIGxpdHRsZW51bXMsIGFuZCB3YW50cyB0bwotICoga25vdyBsZW5ndGggKGluIGNoYXJzKSBvZiB0aGUgaW5wdXQgYmlnbnVtLgotICovCi0KLS8qIHZvaWQgKi8KLWludAotYmlnbnVtX2NvcHkgKGluLCBpbl9sZW5ndGgsIG91dCwgb3V0X2xlbmd0aCkKLSAgICAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKmluOwotICAgICByZWdpc3RlciBpbnQgaW5fbGVuZ3RoOwkvKiBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KLSAgICAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKm91dDsKLSAgICAgcmVnaXN0ZXIgaW50IG91dF9sZW5ndGg7CS8qIGluIHNpemVvZihsaXR0bGVudW0pcyAqLwotewotICBpbnQgc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkOwotCi0gIGlmIChvdXRfbGVuZ3RoIDwgaW5fbGVuZ3RoKQotICAgIHsKLSAgICAgIExJVFRMRU5VTV9UWVBFICpwOwkvKiAtPiBtb3N0IHNpZ25pZmljYW50IChub24temVybykgaW5wdXQKLQkJCQkgICAgICBsaXR0bGVudW0uICovCi0KLSAgICAgIG1lbWNweSAoKHZvaWQgKikgb3V0LCAodm9pZCAqKSBpbiwKLQkgICAgICAodW5zaWduZWQgaW50KSBvdXRfbGVuZ3RoIDw8IExJVFRMRU5VTV9TSElGVCk7Ci0gICAgICBmb3IgKHAgPSBpbiArIGluX2xlbmd0aCAtIDE7IHAgPj0gaW47IC0tcCkKLQl7Ci0JICBpZiAoKnApCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZCA9IHAgLSBpbiAtIGluX2xlbmd0aCArIDE7Ci0KLSAgICAgIGlmIChzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPCAwKQotCXsKLQkgIHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1lbWNweSAoKGNoYXIgKikgb3V0LCAoY2hhciAqKSBpbiwKLQkgICAgICAodW5zaWduZWQgaW50KSBpbl9sZW5ndGggPDwgTElUVExFTlVNX1NISUZUKTsKLQotICAgICAgaWYgKG91dF9sZW5ndGggPiBpbl9sZW5ndGgpCi0JewotCSAgbWVtc2V0ICgoY2hhciAqKSAob3V0ICsgaW5fbGVuZ3RoKSwKLQkJICAnXDAnLAotCQkgICh1bnNpZ25lZCBpbnQpIChvdXRfbGVuZ3RoIC0gaW5fbGVuZ3RoKSA8PCBMSVRUTEVOVU1fU0hJRlQpOwotCX0KLQotICAgICAgc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQpOwotfQkJCQkvKiBiaWdudW1fY29weSgpICovCi0KLS8qIGVuZCBvZiBiaWdudW0tY29weS5jICovCmRpZmYgLS1naXQgYS9nYXMvYmlnbnVtLmggYi9nYXMvYmlnbnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjJmMTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2JpZ251bS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogYmlnbnVtLmgtYXJiaXRyYXJ5IHByZWNpc2lvbiBpbnRlZ2VycwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJQXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuCQkJCSoKLSAqCUZvciBzcGVlZCwgd2Ugd29yayBpbiBncm91cHMgb2YgYml0cywgZXZlbiB0aG91Z2ggdGhpcwkJKgotICoJY29tcGxpY2F0ZXMgYWxnb3JpdGhtcy4JCQkJCQkqCi0gKglFYWNoIGdyb3VwIG9mIGJpdHMgaXMgY2FsbGVkIGEgJ2xpdHRsZW51bScuCQkJKgotICoJQSBidW5jaCBvZiBsaXR0bGVudW1zIHJlcHJlc2VudGluZyBhIChwb3NzaWJseSBsYXJnZSkJCSoKLSAqCWludGVnZXIgaXMgY2FsbGVkIGEgJ2JpZ251bScuCQkJCQkqCi0gKglCaWdudW1zIGFyZSA+PSAwLgkJCQkJCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZQlMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMJKDE2KQotI2RlZmluZQlMSVRUTEVOVU1fUkFESVgJCQkoMSA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0jZGVmaW5lCUxJVFRMRU5VTV9NQVNLCQkJKDB4RkZGRikKLSNkZWZpbmUgTElUVExFTlVNX1NISUZUCQkJKDEpCi0jZGVmaW5lIENIQVJTX1BFUl9MSVRUTEVOVU0JCSgxIDw8IExJVFRMRU5VTV9TSElGVCkKLSNpZm5kZWYgQklUU19QRVJfQ0hBUgotI2RlZmluZSBCSVRTX1BFUl9DSEFSCQkJKDgpCi0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBMSVRUTEVOVU1fVFlQRTsKLQotLyogSkYgdHJ1bmNhdGVkIHRoaXMgdG8gZ2V0IGFyb3VuZCBhIHByb2JsZW0gd2l0aCBHQ0MgKi8KLSNkZWZpbmUJTE9HX1RPX0JBU0VfMl9PRl8xMCAoMy4zMjE5MjgwOTQ4ODczNjIzNDc4NzAzMTk0Mjk0ODkzOTAxNzU4NjUxKQotLyogV0FSTklORzogSSBoYXZlbid0IGNoZWNrZWQgdGhhdCB0aGUgdHJhaWxpbmcgZGlnaXRzIGFyZSBjb3JyZWN0ISAqLwotCi0vKiBsZW5ndGhzIGFyZSBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KLQotaW50IGJpZ251bV9jb3B5IFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICogaW4sIGludCBpbl9sZW5ndGgsCi0JCQkgTElUVExFTlVNX1RZUEUgKiBvdXQsIGludCBvdXRfbGVuZ3RoKSk7Ci0KLS8qIGVuZCBvZiBiaWdudW0uaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpdF9maXguaCBiL2dhcy9iaXRfZml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzI5YTcuLjAwMDAwMDAKLS0tIGEvZ2FzL2JpdF9maXguaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIHdyaXRlLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBiaXRfZml4IHdhcyBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IG1hY2hpbmVzIHRoYXQgbmVlZCB2YXJpYWJsZXMKLSAgIHRvIGJlIGluc2VydGVkIGluIGJpdGZpZWxkcyBvdGhlciB0aGFuIDEsIDIgYW5kIDQgYnl0ZXMuCi0gICBGdXJ0aGVybW9yZSBpdCBnaXZlcyB1cyBhIHBvc3NpYmlsbGl0eSB0byBtYXNrIGluIGJpdHMgaW4gdGhlIHN5bWJvbAotICAgd2hlbiBpdCdzIGZpeGVkIGluIHRoZSBvYmplY3Rjb2RlIGFuZCBjaGVjayB0aGUgc3ltYm9scyBsaW1pdHMuCi0KLSAgIFRoZSBvci1tYXNrIGlzIHVzZWQgdG8gc2V0IHRoZSBodWZmbWFuIGJpdHMgaW4gZGlzcGxhY2VtZW50cyBmb3IgdGhlCi0gICBuczMyayBwb3J0LgotICAgVGhlIGFjYmksIGFkZHFpLCBtb3ZxaSwgY21wcWkgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgYW4gYXNzZW1ibGVyIHRoYXQKLSAgIGNhbiBoYW5kbGUgYml0ZmllbGRzLiBJZSBoYW5kbGUgYW4gZXhwcmVzc2lvbiwgZXZhbHVhdGUgaXQgYW5kIGluc2VydAotICAgdGhlIHJlc3VsdCBpbiBhbiBzb21lIGJpdGZpZWxkLiAoIGV4OiA1IGJpdHMgaW4gYSBzaG9ydCBmaWVsZCBvZiBhIG9wY29kZSkKLSAgICovCi0KLSNpZm5kZWYgX19iaXRfZml4X2hfXwotI2RlZmluZSBfX2JpdF9maXhfaF9fCi0KLXN0cnVjdCBiaXRfZml4Ci0gIHsKLSAgICBpbnQgZnhfYml0X3NpemU7CQkvKiBMZW5ndGggb2YgYml0ZmllbGQgKi8KLSAgICBpbnQgZnhfYml0X29mZnNldDsJCS8qIEJpdCBvZmZzZXQgdG8gYml0ZmllbGQgKi8KLSAgICBsb25nIGZ4X2JpdF9iYXNlOwkJLyogV2hlcmUgZG8gd2UgYXBwbHkgdGhlIGJpdGZpeC4KLQkJCQkgICAgICBJZiB0aGlzIGlzIHplcm8sIGRlZmF1bHQgaXMgYXNzdW1lZC4gKi8KLSAgICBsb25nIGZ4X2JpdF9iYXNlX2FkajsJLyogQWRqdXN0bWVudCBvZiBiYXNlICovCi0gICAgbG9uZyBmeF9iaXRfbWF4OwkJLyogU2lnbmV4dGVuZGVkIG1heCBmb3IgYml0ZmllbGQgKi8KLSAgICBsb25nIGZ4X2JpdF9taW47CQkvKiBTaWduZXh0ZW5kZWQgbWluIGZvciBiaXRmaWVsZCAqLwotICAgIGxvbmcgZnhfYml0X2FkZDsJCS8qIE9yIG1hc2ssIHVzZWQgZm9yIGh1ZmZtYW4gcHJlZml4ICovCi0gIH07Ci10eXBlZGVmIHN0cnVjdCBiaXRfZml4IGJpdF9maXhTOwotCi0jZW5kaWYgLyogX19iaXRfZml4X2hfXyAqLwotCi0vKiBlbmQgb2YgYml0X2ZpeC5oICovCmRpZmYgLS1naXQgYS9nYXMvY2dlbi5jIGIvZ2FzL2NnZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1ZTFiNi4uMDAwMDAwMAotLS0gYS9nYXMvY2dlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY0ICswLDAgQEAKLS8qIEdBUyBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImNnZW4tZGVzYy5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImNnZW4uaCIKLQotLyogT3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IsIG11c3QgYmUgc2V0IGJ5IG1kX2JlZ2luLiAgKi8KLQotQ0dFTl9DUFVfREVTQyBnYXNfY2dlbl9jcHVfZGVzYzsKLQotLyogQ2FsbGJhY2sgdG8gaW5zZXJ0IGEgcmVnaXN0ZXIgaW50byB0aGUgc3ltYm9sIHRhYmxlLgotICAgQSB0YXJnZXQgbWF5IGNob29zZSB0byBsZXQgR0FTIHBhcnNlIHRoZSByZWdpc3RlcnMuCi0gICA/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+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSk7Ci0KLSAgLyogVXNlIGZ4X29mZnNldCBmb3IgdGhlc2UgY2FzZXMgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUKQotICAgIHJlbG9jLT5hZGRlbmQgID0gZml4UC0+Znhfb2Zmc2V0OwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCAgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0KLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gIHJldHVybiByZWxvYzsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jZ2VuLmggYi9nYXMvY2dlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmMxNzMyLi4wMDAwMDAwCi0tLSBhL2dhcy9jZ2VuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiBHQVMgY2dlbiBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEdBU19DR0VOX0gKLSNkZWZpbmUgR0FTX0NHRU5fSAotCi0vKiBPcGNvZGUgdGFibGUgaGFuZGxlLiAgKi8KLWV4dGVybiBDR0VOX0NQVV9ERVNDIGdhc19jZ2VuX2NwdV9kZXNjOwotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBmaXh1cHMgaW4gYW4gaW5zbi4KLSAgIElmIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGlzLCBhbGxvdyB0YXJnZXQgdG8gb3ZlcnJpZGUgYW5kIGRvIHNvIHRoZXJlLiAgKi8KLSNkZWZpbmUgR0FTX0NHRU5fTUFYX0ZJWFVQUyAzCi0KLS8qIFN0cnVjdCBkZWZpbmluZyByZXN1bHQgb2YgZ2FzX2NnZW5fZmluaXNoX2luc24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBmcmFnIGNvbnRhaW5pbmcgdGhlIGluc24gKi8KLSAgZnJhZ1MgKiBmcmFnOwotICAvKiBBZGRyZXNzIG9mIGluc24gaW4gZnJhZy4gICovCi0gIGNoYXIgKiBhZGRyOwotICAvKiBOdW1iZXIgb2YgZml4dXBzIHRoaXMgaW5zbiBoYXMuICAqLwotICBpbnQgbnVtX2ZpeHVwczsKLSAgLyogQXJyYXkgb2YgZml4dXBzLiAgKi8KLSAgZml4UyAqIGZpeHVwc1tHQVNfQ0dFTl9NQVhfRklYVVBTXTsKLX0gZmluaXNoZWRfaW5zblM7Ci0KLS8qIENhbGxiYWNrIGZvciBvcGVyYW5kIHBhcnNpbmcuCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBmb3Igc3VjY2Vzcy4KLSAgIFRoZSBwYXJzZWQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBiZmRfdm1hICouICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKiBnYXNfY2dlbl9wYXJzZV9vcGVyYW5kCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUsCi0JICAgICAgY29uc3QgY2hhciAqKiwgaW50LCBpbnQsIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqLAotCSAgICAgIGJmZF92bWEgKikpOwotCi0vKiBDYWxsIHRoaXMgZnJvbSBtZF9hc3NlbWJsZSB0byBpbml0aWFsaXplIHRoZSBhc3NlbWJsZXIgY2FsbGJhY2suICAqLwotZXh0ZXJuIHZvaWQgZ2FzX2NnZW5faW5pdF9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIGdhc19jZ2VuX3NhdmVfZml4dXBzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGdhc19jZ2VuX3Jlc3RvcmVfZml4dXBzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGdhc19jZ2VuX3N3YXBfZml4dXBzIFBBUkFNUyAoKHZvaWQpKTsKLSAgICAgCi0vKiBBZGQgYSByZWdpc3RlciB0byB0aGUgYXNzZW1ibGVyJ3MgaGFzaCB0YWJsZS4KLSAgIFRoaXMgbWFrZXMgbGV0cyBHQVMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4KLSAgID8/PyBUaGlzIGlzbid0IGN1cnJlbnRseSB1c2VkLCBidXQgaXQgY291bGQgYmUgaW4gdGhlIGZ1dHVyZS4gICovCi1leHRlcm4gdm9pZCBjZ2VuX2FzbV9yZWNvcmRfcmVnaXN0ZXIgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLQotLyogQWZ0ZXIgQ0dFTl9TWU0gKGFzc2VtYmxlX2luc24pIGlzIGRvbmUsIHRoaXMgaXMgY2FsbGVkIHRvCi0gICBvdXRwdXQgdGhlIGluc24gYW5kIHJlY29yZCBhbnkgZml4dXBzLiAgKi8KLWV4dGVybiB2b2lkIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqLAotCQkJCQkgIENHRU5fSU5TTl9CWVRFU19QVFIsIHVuc2lnbmVkIGludCwKLQkJCQkJICBpbnQsIGZpbmlzaGVkX2luc25TICopKTsKLQotLyogUmVjb3JkIGEgZml4dXAuICAqLwotZXh0ZXJuIGZpeFMgKiBnYXNfY2dlbl9yZWNvcmRfZml4dXAgUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBjb25zdCBDR0VOX0lOU04gKiwKLQkJCQkJICAgICBpbnQsIGNvbnN0IENHRU5fT1BFUkFORCAqLCBpbnQsCi0JCQkJCSAgICAgc3ltYm9sUyAqLCBvZmZzZXRUKSk7Ci1leHRlcm4gZml4UyAqIGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHAgUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBjb25zdCBDR0VOX0lOU04gKiwKLQkJCQkJCSBpbnQsIGNvbnN0IENHRU5fT1BFUkFORCAqLCBpbnQsCi0JCQkJCQkgZXhwcmVzc2lvblMgKikpOwotCi0vKiBtZF9hcHBseV9maXgzIGhhbmRsZXIgKi8KLWV4dGVybiBpbnQgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyBQQVJBTVMgKChmaXhTICosIHZhbHVlVCAqLCBzZWdUKSk7Ci0KLS8qIHRjX2dlbl9yZWxvYyBoYW5kbGVyICovCi1leHRlcm4gYXJlbGVudCAqZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jIFBBUkFNUyAoKGFzZWN0aW9uICosIGZpeFMgKikpOwotCi0vKiBUYXJnZXQgc3VwcGxpZWQgcm91dGluZSB0byBsb29rdXAgYSByZWxvYy4gICovCi1leHRlcm4gYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1tZF9jZ2VuX2xvb2t1cF9yZWxvYyBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKiwgY29uc3QgQ0dFTl9PUEVSQU5EICosCi0JCQkgICAgICBmaXhTICopKTsKLQotLyogT3B0aW9uYWwgdGFyZ2V0IHN1cHBsaWVkIHJvdXRpbmUgdG8gcmVjb3JkIGEgZml4dXAgZm9yIGFuIGV4cHJlc3Npb24uICAqLwotZXh0ZXJuIGZpeFMgKgotbWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosIGludCwKLQkJCQkgIGNvbnN0IENHRU5fT1BFUkFORCAqLCBpbnQsCi0JCQkJICBleHByZXNzaW9uUyAqKSk7Ci0KLSNlbmRpZiAvKiBHQVNfQ0dFTl9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZC5jIGIvZ2FzL2NvbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzYzlmNi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qIGNvbmQuYyAtIGNvbmRpdGlvbmFsIGFzc2VtYmx5IHBzZXVkby1vcHMsIGFuZCAuaW5jbHVkZQotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIFRoaXMgaXMgYWxsb2NhdGVkIHRvIGdyb3cgYW5kIHNocmluayBhcyAuaWZkZWYvLmVuZGlmIHBhaXJzIGFyZSBzY2FubmVkLiAqLwotc3RydWN0IG9ic3RhY2sgY29uZF9vYnN0YWNrOwotCi1zdHJ1Y3QgZmlsZV9saW5lCi17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotfTsKLQotLyogV2UgcHVzaCBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBmb3IgZWFjaCAuaWYsIGFuZCBwb3AgaXQgYXQgdGhlCi0gICAuZW5kaWYuICAqLwotCi1zdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUKLXsKLSAgLyogVGhlIHNvdXJjZSBmaWxlICYgbGluZSBudW1iZXIgb2YgdGhlICJpZiIuICAqLwotICBzdHJ1Y3QgZmlsZV9saW5lIGlmX2ZpbGVfbGluZTsKLSAgLyogVGhlIHNvdXJjZSBmaWxlICYgbGluZSBvZiB0aGUgImVsc2UiLiAgKi8KLSAgc3RydWN0IGZpbGVfbGluZSBlbHNlX2ZpbGVfbGluZTsKLSAgLyogVGhlIHByZXZpb3VzIGNvbmRpdGlvbmFsLiAgKi8KLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpwcmV2aW91c19jZnJhbWU7Ci0gIC8qIEhhdmUgd2Ugc2VlbiBhbiBlbHNlIHlldD8gICovCi0gIGludCBlbHNlX3NlZW47Ci0gIC8qIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBpZ25vcmluZyBpbnB1dC4gICovCi0gIGludCBpZ25vcmluZzsKLSAgLyogV2hldGhlciBhIGNvbmRpdGlvbmFsIGF0IGEgaGlnaGVyIGxldmVsIGlzIGlnbm9yaW5nIGlucHV0LiAgKi8KLSAgaW50IGRlYWRfdHJlZTsKLSAgLyogTWFjcm8gbmVzdGluZyBsZXZlbCBhdCB3aGljaCB0aGlzIGNvbmRpdGlvbmFsIHdhcyBjcmVhdGVkLiAgKi8KLSAgaW50IG1hY3JvX25lc3Q7Ci19OwotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplX2NmcmFtZSBQQVJBTVMgKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmNmcmFtZSkpOwotc3RhdGljIGNoYXIgKmdldF9tcmlfc3RyaW5nIFBBUkFNUyAoKGludCwgaW50ICopKTsKLQotc3RhdGljIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqY3VycmVudF9jZnJhbWUgPSBOVUxMOwotCi12b2lkIAotc19pZmRlZiAoYXJnKQotICAgICBpbnQgYXJnOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwkJLyogcG9pbnRzIHRvIG5hbWUgb2Ygc3ltYm9sICovCi0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CS8qIFBvaW50cyB0byBzeW1ib2wgKi8KLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lIGNmcmFtZTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7CQkvKiBMZWFkaW5nIHdoaXRlc3BhY2UgaXMgcGFydCBvZiBvcGVyYW5kLiAqLwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmICghaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBpZGVudGlmaWVyIGZvciBcIi5pZmRlZlwiIikpOwotICAgICAgb2JzdGFja18xZ3JvdyAoJmNvbmRfb2JzdGFjaywgMCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYzsKLQotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICBpbml0aWFsaXplX2NmcmFtZSAoJmNmcmFtZSk7Ci0gICAgICBjZnJhbWUuaWdub3JpbmcgPSBjZnJhbWUuZGVhZF90cmVlIHx8ICEoKHN5bWJvbFAgIT0gMCkgXiBhcmcpOwotICAgICAgY3VycmVudF9jZnJhbWUgPSAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqKQotCQkJb2JzdGFja19jb3B5ICgmY29uZF9vYnN0YWNrLCAmY2ZyYW1lLAotCQkJCSAgICAgIHNpemVvZiAoY2ZyYW1lKSkpOwotCi0gICAgICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLQkgICYmIGNmcmFtZS5pZ25vcmluZwotCSAgJiYgKGNmcmFtZS5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgICAgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotCWxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQkJCQkvKiBpZiBhIHZhbGlkIGlkZW50aWZ5ZXIgbmFtZSAqLwotfQkJCQkvKiBzX2lmZGVmKCkgKi8KLQotdm9pZCAKLXNfaWYgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgZXhwcmVzc2lvblMgb3BlcmFuZDsKLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lIGNmcmFtZTsKLSAgaW50IHQ7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogTGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLQotICBpZiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpCi0gICAgewotICAgICAgb3BlcmFuZC5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4cHJlc3Npb24gKCZvcGVyYW5kKTsKLSAgICAgIGlmIChvcGVyYW5kLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIm5vbi1jb25zdGFudCBleHByZXNzaW9uIGluIFwiLmlmXCIgc3RhdGVtZW50IikpOwotICAgIH0KLQotICBzd2l0Y2ggKChvcGVyYXRvclQpIGFyZykKLSAgICB7Ci0gICAgY2FzZSBPX2VxOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX25lOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgIT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2x0OiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPCAwOyBicmVhazsKLSAgICBjYXNlIE9fbGU6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA8PSAwOyBicmVhazsKLSAgICBjYXNlIE9fZ2U6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA+PSAwOyBicmVhazsKLSAgICBjYXNlIE9fZ3Q6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA+IDA7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGFib3ZlIGVycm9yIGlzIHNpZ25hbGVkLCB0aGlzIHdpbGwgZGlzcGF0Y2gKLSAgICAgdXNpbmcgYW4gdW5kZWZpbmVkIHJlc3VsdC4gIE5vIGJpZyBkZWFsLiAgKi8KLSAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICBjZnJhbWUuaWdub3JpbmcgPSBjZnJhbWUuZGVhZF90cmVlIHx8ICEgdDsKLSAgY3VycmVudF9jZnJhbWUgPSAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqKQotCQkgICAgb2JzdGFja19jb3B5ICgmY29uZF9vYnN0YWNrLCAmY2ZyYW1lLCBzaXplb2YgKGNmcmFtZSkpKTsKLQotICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLSAgICAgICYmIGNmcmFtZS5pZ25vcmluZwotICAgICAgJiYgKGNmcmFtZS5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgfHwgISBjZnJhbWUucHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCi0gICAgbGlzdGluZ19saXN0ICgyKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19pZigpICovCi0KLS8qIEdldCBhIHN0cmluZyBmb3IgdGhlIE1SSSBJRkMgb3IgSUZOQyBwc2V1ZG8tb3BzLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X21yaV9zdHJpbmcgKHRlcm1pbmF0b3IsIGxlbikKLSAgICAgaW50IHRlcm1pbmF0b3I7Ci0gICAgIGludCAqbGVuOwotewotICBjaGFyICpyZXQ7Ci0gIGNoYXIgKnM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBzID0gcmV0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQotICAgIHsKLSAgICAgICsrczsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCXsKLQkgICpzKysgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBpZiAoc1stMV0gPT0gJ1wnJykKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycpCi0JCWJyZWFrOwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JfQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9IHRlcm1pbmF0b3IKLQkgICAgICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlIChzID4gcmV0ICYmIChzWy0xXSA9PSAnICcgfHwgc1stMV0gPT0gJ1x0JykpCi0JLS1zOwotICAgIH0KLQotICAqbGVuID0gcyAtIHJldDsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIE1SSSBJRkMgYW5kIElGTkMgcHNldWRvLW9wcy4gICovCi0KLXZvaWQKLXNfaWZjIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotICBjaGFyICpzMSwgKnMyOwotICBpbnQgbGVuMSwgbGVuMjsKLSAgaW50IHJlczsKLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lIGNmcmFtZTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIHMxID0gZ2V0X21yaV9zdHJpbmcgKCcsJywgJmxlbjEpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhc19iYWQgKF8oImJhZCBmb3JtYXQgZm9yIGlmYyBvciBpZm5jIikpOwotICBlbHNlCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgczIgPSBnZXRfbXJpX3N0cmluZyAoJzsnLCAmbGVuMik7Ci0KLSAgcmVzID0gbGVuMSA9PSBsZW4yICYmIHN0cm5jbXAgKHMxLCBzMiwgbGVuMSkgPT0gMDsKLQotICBpbml0aWFsaXplX2NmcmFtZSAoJmNmcmFtZSk7Ci0gIGNmcmFtZS5pZ25vcmluZyA9IGNmcmFtZS5kZWFkX3RyZWUgfHwgISAocmVzIF4gYXJnKTsKLSAgY3VycmVudF9jZnJhbWUgPSAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqKQotCQkgICAgb2JzdGFja19jb3B5ICgmY29uZF9vYnN0YWNrLCAmY2ZyYW1lLCBzaXplb2YgKGNmcmFtZSkpKTsKLQotICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLSAgICAgICYmIGNmcmFtZS5pZ25vcmluZwotICAgICAgJiYgKGNmcmFtZS5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgfHwgISBjZnJhbWUucHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCi0gICAgbGlzdGluZ19saXN0ICgyKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZCAKLXNfZW5kaWYgKGFyZykKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmhvbGQ7Ci0KLSAgaWYgKGN1cnJlbnRfY2ZyYW1lID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJcIi5lbmRpZlwiIHdpdGhvdXQgXCIuaWZcIiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLQkgICYmIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZwotCSAgJiYgKGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgICAgIHx8ICEgY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotCWxpc3RpbmdfbGlzdCAoMSk7Ci0KLSAgICAgIGhvbGQgPSBjdXJyZW50X2NmcmFtZTsKLSAgICAgIGN1cnJlbnRfY2ZyYW1lID0gY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZTsKLSAgICAgIG9ic3RhY2tfZnJlZSAoJmNvbmRfb2JzdGFjaywgaG9sZCk7Ci0gICAgfQkJCQkvKiBpZiBvbmUgcG9wIHRvbyBtYW55ICovCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19lbmRpZigpICovCi0KLXZvaWQgCi1zX2Vsc2UgKGFyZykKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoY3VycmVudF9jZnJhbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5lbHNlIHdpdGhvdXQgbWF0Y2hpbmcgLmlmIC0gaWdub3JlZCIpKTsKLQotICAgIH0KLSAgZWxzZSBpZiAoY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiKSk7Ci0gICAgICBhc19iYWRfd2hlcmUgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImVsc2VcIiIpKTsKLSAgICAgIGFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5saW5lLAotCQkgICAgXygiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJpZlwiIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3doZXJlICgmY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmZpbGUsCi0JCSZjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUubGluZSk7Ci0KLSAgICAgIGlmICghY3VycmVudF9jZnJhbWUtPmRlYWRfdHJlZSkKLQl7Ci0JICBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcgPSAhY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nOwotCSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKQotCQlsaXN0aW5nX2xpc3QgKDEpOwotCSAgICAgIGVsc2UKLQkJbGlzdGluZ19saXN0ICgyKTsKLQkgICAgfQotCX0JCQkvKiBpZiBub3QgYSBkZWFkIHRyZWUgKi8KLQotICAgICAgY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbiA9IDE7Ci0gICAgfQkJCQkvKiBpZiBlcnJvciBlbHNlIGRvIGl0ICovCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19lbHNlKCkgKi8KLQotdm9pZCAKLXNfaWZlcXMgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgY2hhciAqczEsICpzMjsKLSAgaW50IGxlbjEsIGxlbjI7Ci0gIGludCByZXM7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgczEgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbjEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLmlmZXFzIHN5bnRheCBlcnJvciIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHMyID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4yKTsKLQotICByZXMgPSBsZW4xID09IGxlbjIgJiYgc3RybmNtcCAoczEsIHMyLCBsZW4xKSA9PSAwOwotCi0gIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIChyZXMgXiBhcmcpOwotICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCi0JCSAgICBvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsIHNpemVvZiAoY2ZyYW1lKSkpOwotCi0gIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotICAgICAgJiYgY2ZyYW1lLmlnbm9yaW5nCi0gICAgICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLSAgICBsaXN0aW5nX2xpc3QgKDIpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfaWZlcXMoKSAqLwotCi1pbnQgCi1pZ25vcmVfaW5wdXQgKCkKLXsKLSAgY2hhciAqczsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTk9fUFNFVURPX0RPVAotICAgICAgfHwgMQotI2VuZGlmCi0gICAgICApCi0gICAgewotICAgICAgaWYgKHNbLTFdICE9ICcuJykKLQktLXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNbLTFdICE9ICcuJykKLQlyZXR1cm4gKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwpICYmIChjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpOwotICAgIH0KLQotICAvKiBXZSBjYW5ub3QgaWdub3JlIGNlcnRhaW4gcHNldWRvIG9wcy4gICovCi0gIGlmICgoKHNbMF0gPT0gJ2knCi0JfHwgc1swXSA9PSAnSScpCi0gICAgICAgJiYgKCFzdHJuY2FzZWNtcCAocywgImlmIiwgMikKLQkgICB8fCAhc3RybmNhc2VjbXAgKHMsICJpZmRlZiIsIDUpCi0JICAgfHwgIXN0cm5jYXNlY21wIChzLCAiaWZuZGVmIiwgNikpKQotICAgICAgfHwgKChzWzBdID09ICdlJwotCSAgIHx8IHNbMF0gPT0gJ0UnKQotCSAgJiYgKCFzdHJuY2FzZWNtcCAocywgImVsc2UiLCA0KQotCSAgICAgIHx8ICFzdHJuY2FzZWNtcCAocywgImVuZGlmIiwgNSkKLQkgICAgICB8fCAhc3RybmNhc2VjbXAgKHMsICJlbmRjIiwgNCkpKSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwpICYmIChjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpOwotfQkJCQkvKiBpZ25vcmVfaW5wdXQoKSAqLwotCi1zdGF0aWMgdm9pZCAKLWluaXRpYWxpemVfY2ZyYW1lIChjZnJhbWUpCi0gICAgIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqY2ZyYW1lOwotewotICBtZW1zZXQgKGNmcmFtZSwgMCwgc2l6ZW9mICgqY2ZyYW1lKSk7Ci0gIGFzX3doZXJlICgmY2ZyYW1lLT5pZl9maWxlX2xpbmUuZmlsZSwKLQkgICAgJmNmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUpOwotICBjZnJhbWUtPnByZXZpb3VzX2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lOwotICBjZnJhbWUtPmRlYWRfdHJlZSA9IGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nOwotICBjZnJhbWUtPm1hY3JvX25lc3QgPSBtYWNyb19uZXN0OwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGlmIGEgY29uZGl0aW9uYWwgaXMgdW50ZXJtaW5hdGVkIGluc2lkZSBhIG1hY3JvIG9yCi0gICB0aGUgYXNzZW1ibHkgYXMgYSB3aG9sZS4gIElmIE5FU1QgaXMgbm9uIG5lZ2F0aXZlLCB3ZSBhcmUgYmVpbmcKLSAgIGNhbGxlZCBiZWNhdXNlIG9mIHRoZSBlbmQgb2YgYSBtYWNybyBleHBhbnNpb24uICBJZiBORVNUIGlzCi0gICBuZWdhdGl2ZSwgd2UgYXJlIGJlaW5nIGNhbGxlZCBhdCB0aGUgb2YgdGhlIGlucHV0IGZpbGVzLiAgKi8KLQotdm9pZAotY29uZF9maW5pc2hfY2hlY2sgKG5lc3QpCi0gICAgIGludCBuZXN0OwotewotICBpZiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+bWFjcm9fbmVzdCA+PSBuZXN0KQotICAgIHsKLSAgICAgIGlmIChuZXN0ID49IDApCi0JYXNfYmFkIChfKCJlbmQgb2YgbWFjcm8gaW5zaWRlIGNvbmRpdGlvbmFsIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiZW5kIG9mIGZpbGUgaW5zaWRlIGNvbmRpdGlvbmFsIikpOwotICAgICAgYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmZpbGUsCi0JCSAgICBjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBzdGFydCBvZiB0aGUgdW50ZXJtaW5hdGVkIGNvbmRpdGlvbmFsIikpOwotICAgICAgaWYgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX3NlZW4pCi0JYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUuZmlsZSwKLQkJICAgICAgY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUsCi0JCSAgICAgIF8oImhlcmUgaXMgdGhlIFwiZWxzZVwiIG9mIHRoZSB1bnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwiKSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIGV4aXQgb3V0IG9mIGEgbWFjcm8uICBXZSBhc3N1bWUKLSAgIHRoYXQgYW55IGNvbmRpdGlvbmFscyB3aGljaCBiZWdhbiB3aXRoaW4gdGhlIG1hY3JvIGFyZSBjb3JyZWN0bHkKLSAgIG5lc3RlZCwgYW5kIGp1c3QgcG9wIHRoZW0gb2ZmIHRoZSBzdGFjay4gICovCi0KLXZvaWQKLWNvbmRfZXhpdF9tYWNybyAobmVzdCkKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIHdoaWxlIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5tYWNyb19uZXN0ID49IG5lc3QpCi0gICAgewotICAgICAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpob2xkOwotCi0gICAgICBob2xkID0gY3VycmVudF9jZnJhbWU7Ci0gICAgICBjdXJyZW50X2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWU7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKCZjb25kX29ic3RhY2ssIGhvbGQpOwotICAgIH0KLX0KLQotLyogZW5kIG9mIGNvbmQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy1nYXMuY29tIGIvZ2FzL2NvbmZpZy1nYXMuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUyNDhhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWctZ2FzLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0kIWNvbmZpZy1nYXMuY29tCi0kISBUaGlzIGZpbGUgc2V0cyB0aGluZ3MgdXAgdG8gYnVpbGQgZ2FzIG9uIGEgVk1TIHN5c3RlbSB0byBnZW5lcmF0ZSBvYmplY3QKLSQhIGZpbGVzIGZvciBhIFZNUyBzeXN0ZW0uICBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZQotJCEgZG8gbm90IGhhdmUgL2Jpbi9zaCB0byBleGVjdXRlIGl0LgotJCEKLSQhCi0kIGdhc19ob3N0PSJ2bXMiCi0kIGFyY2hfaW5keCA9IDEgKyAoKGYkZ2V0c3lpKCJDUFUiKS5nZS4xMjgpLmFuZC4xKQkhIHZheD09MSwgYWxwaGE9PTIKLSQgYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIGlmIGFyY2guZXFzLiJWQVgiCi0kIHRoZW4KLSQgIGNwdV90eXBlPSJ2YXgiCi0kICBvYmpfZm9ybWF0PSJ2bXMiCi0kICBhdG9mPSJ2YXgiCi0kIGVsc2UKLSQgIGNwdV90eXBlPSJhbHBoYSIKLSQgIG9ial9mb3JtYXQ9ImV2YXgiCi0kICBhdG9mPSJpZWVlIgotJCBlbmRpZgotJCBlbXVsYXRpb249ImdlbmVyaWMiCi0kIQotJAlERUxFVEUJPSAiZGVsZXRlL25vQ29uZmlybSIKLSQJRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgotJCEKLSQhIFRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbgotJCBjYWxsIG1ha2UgInRhcmctY3B1LmgiICJbLmNvbmZpZ110Yy0nJ2NwdV90eXBlJy5oIgotJCBjYWxsIG1ha2UgInRhcmctZW52LmgiICJbLmNvbmZpZ110ZS0nJ2VtdWxhdGlvbicuaCIKLSQhCi0kISBDb2RlIHRvIGhhbmRsZSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgotJCBjYWxsIG1ha2UgIm9iai1mb3JtYXQuaCIgIlsuY29uZmlnXW9iai0nJ29ial9mb3JtYXQnLmgiCi0kIQotJCEgKG5vdCBjdXJyZW50bHkgdXNlZCBmb3IgdmF4IG9yIGFscGhhKQotJCBjYWxsIG1ha2UgIml0YmwtY3B1LmgiICJbLmNvbmZpZ11pdGJsLScnY3B1X3R5cGUnLmgiCi0kIQotJCEKLSQhIENyZWF0ZSB0aGUgZmlsZSB2ZXJzaW9uLm9wdCwgd2hpY2ggaGVscHMgaWRlbnRpZnkgdGhlIGV4ZWN1dGFibGUuCi0kIQotJGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kc2VhcmNoIENPTkZJR1VSRS5JTiAiQU1fSU5JVF9BVVRPTUFLRSIvRXhhY3QvT3V0cHV0PWNvbmZpZy1nYXMtdG1wLnRtcAotJG9wZW4gaWZpbGUkIGNvbmZpZy1nYXMtdG1wLnRtcAotJHJlYWQgaWZpbGUkIGxpbmUKLSRjbG9zZSBpZmlsZSQKLSRERUxFVEUgY29uZmlnLWdhcy10bXAudG1wOyoKLSQhIERpc2NhcmQgIkFNX0lOSVRfQVVUT01BS0UoZ2FzLCAiIGFuZCAiKSIgcGFydHMuCi0kaWprPWYkbG9jYXRlKCIsIixsaW5lKSsyCi0kbGluZT1mJGV4dHJhY3QoaWprLGYkbGVuZ3RoKGxpbmUpLWlqayxsaW5lKQotJGlqaz1mJGxvY2F0ZSgiKSIsbGluZSkKLSRsaW5lPWYkZXh0cmFjdCgwLGlqayxsaW5lKQotJCEKLSQgaWYgZiRzZWFyY2goInZlcnNpb24ub3B0IikubmVzLiIiIHRoZW4gREVMRVRFIHZlcnNpb24ub3B0OyoKLSRjb3B5IF9OTDogdmVyc2lvbi5vcHQKLSRvcGVuL0FwcGVuZCBpZmlsZSQgdmVyc2lvbi5vcHQKLSR3cml0ZSBpZmlsZSQgImlkZW50aWZpY2F0aW9uPSIrIiIiIitsaW5lKyIiIiIKLSRjbG9zZSBpZmlsZSQKLSQhCi0kISBOb3cgd3JpdGUgY29uZmlnLmguCi0kIQotJCBpZiBmJHNlYXJjaCgiY29uZmlnLmgiKS5uZXMuIiIgdGhlbiBERUxFVEUgY29uZmlnLmg7KgotJGNvcHkgX05MOiBjb25maWcuaAotJG9wZW4vQXBwZW5kIGlmaWxlJCBjb25maWcuaAotJHdyaXRlIGlmaWxlJCAiLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLWdhcy5jb20uICovCi0kd3JpdGUgaWZpbGUkICIjaWZuZGVmIFZFUlNJT04iCi0kd3JpdGUgaWZpbGUkICIjZGVmaW5lIFZFUlNJT04gICAgICAiIiIsbGluZSwiIiIiCi0kd3JpdGUgaWZpbGUkICIjZW5kaWYiCi0kd3JpdGUgaWZpbGUkICIvKi0tKi8iCi0kaWYgYXJjaCAuZXFzLiAiVkFYIgotJHRoZW4KLSRhcHBlbmQgWy5jb25maWdddm1zLWNvbmYuaCBpZmlsZSQ6Ci0kZWxzZQotJCBhcHBlbmQgWy5jb25maWdddm1zLWEtY29uZi5oIGlmaWxlJDoKLSRlbmRpZgotJGNsb3NlIGlmaWxlJAotJEVDSE8gIkNyZWF0ZWQgY29uZmlnLmguIgotJCEKLSQhIENoZWNrIGZvciwgYW5kIHBvc3NpYmx5IG1ha2UsIGhlYWRlciBmaWxlIDx1bmlzdGQuaD4uCi0kIQotJCBpZiBmJHNlYXJjaCgidG1wLWNoay1oLioiKS5uZXMuIiIgdGhlbiAgREVMRVRFIHRtcC1jaGstaC4qOyoKLSQhY2FuJ3QgdXNlIHNpbXBsZSBgI2luY2x1ZGUgSERSJyB3aXRoIGBnY2MgL0RlZmluZT0iSERSPTxmb28uaD4iJwotJCFiZWNhdXNlIHRoZSAyLjYuWzAtM10gcHJlcHJvY2Vzc29yIGhhbmRsZXMgaXQgd3JvbmcgKFZNUy1zcGVjaWZpYyBnY2MgYnVnKQotJCBjcmVhdGUgdG1wLWNoay1oLmMKLWludCB0bXBfY2hrX2g7CS8qIGd1YXJhbnRlZSBub24tZW1wdHkgb3V0cHV0ICovCi0jaWZkZWYgSEFWRV9TVERJT19ICi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JWElPX0gKLSNpbmNsdWRlIDx1bml4aW8uaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JWExJQl9ICi0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2VuZGlmCi0kIG9uIHdhcm5pbmcgdGhlbiAgY29udGludWUKLSQgQ0hFQ0sgPSAiY2FsbCB0bXBfY2hrX2giCi0kIENIRUNLICJIQVZFX1NURElPX0giCi0kIGlmIC5ub3QuJHN0YXR1cwotJCB0aGVuCXR5cGUgc3lzJGlucHV0OgotCi0/IGNvdWxkIG5vdCBjb21waWxlIDxzdGRpby5oPi4KLQotICBJZiB5b3UncmUgY29tcGlsaW5nIHdpdGggREVDIEMgb3IgVkFYIEMsIGNyZWF0ZSBjb25maWcuc3RhdHVzIGFzIGFuCi0gIGVtcHR5IGZpbGUgYW5kIHN0YXJ0IGdudSBtYWtlIGFnYWluLgotCi0gIElmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBHTlUgQywgdGhlcmUgaXMgc29tZSBzZXR1cCBwcm9ibGVtIGFuZAotICBnYXMgY29uZmlndXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLQotJAlERUxFVEUgdG1wLWNoay1oLmM7KgotJAlleGl0ICV4MDAyQwotJCBlbmRpZgotJCEKLSQgQ0hFQ0sgIkhBVkVfVU5JU1REX0giCi0kIGlmIC5ub3QuJHN0YXR1cwotJCB0aGVuCi0kICBpZiBmJHRybmxubSgiSEZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGhmaWxlJAotJCAgQ0hFQ0sgIkhBVkVfVU5JWElPX0giCi0kICBnb3RfdW5peGlvID0gKCRzdGF0dXMgLmFuZC4gMSkKLSQgIENIRUNLICJIQVZFX1VOSVhMSUJfSCIKLSQgIGdvdF91bml4bGliID0gKCRzdGF0dXMgLmFuZC4gMSkKLSQgIGNyZWF0ZSBbXXVuaXN0ZC5oCSF3aXRoIHJ1ZGltZW50YXJ5IGNvbnRlbnRzCi0vKiA8dW5pc3RkLmg+IHN1YnN0aXR1dGUgZm9yIGJ1aWxkaW5nIGdhcyAqLwotI2lmbmRlZiBVTklTVERfSAotI2RlZmluZSBVTklTVERfSAotCi0kICBvcGVuL0FwcGVuZCBoZmlsZSQgW111bmlzdGQuaAotJCAgaWYgZ290X3VuaXhpbwotJCAgdGhlbiAgd3JpdGUgaGZpbGUkICIjaW5jbHVkZSA8dW5peGlvLmg+IgotJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGlvLmg+ICovCi1leHRlcm4gaW50IGNyZWF0KCksIG9wZW4oKSwgY2xvc2UoKSwgcmVhZCgpLCB3cml0ZSgpOwotZXh0ZXJuIGludCBhY2Nlc3MoKSwgZHVwKCksIGR1cDIoKSwgZnN0YXQoKSwgc3RhdCgpOwotZXh0ZXJuIGxvbmcgbHNlZWsoKTsKLSQgIGVuZGlmCi0kICB3cml0ZSBoZmlsZSQgIiIKLSQgIGlmIGdvdF91bml4bGliCi0kICB0aGVuICB3cml0ZSBoZmlsZSQgIiNpbmNsdWRlIDx1bml4bGliLmg+IgotJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGxpYi5oPiAqLwotZXh0ZXJuIGNoYXIgKnNicmsoKSwgKmdldGN3ZCgpLCAqY3VzZXJpZCgpOwotZXh0ZXJuIGludCBicmsoKSwgY2hkaXIoKSwgY2htb2QoKSwgY2hvd24oKSwgbWtkaXIoKTsKLWV4dGVybiB1bnNpZ25lZCBnZXR1aWQoKSwgdW1hc2soKTsKLSQgIGVuZGlmCi0kICBhcHBlbmQgc3lzJGlucHV0OiBoZmlsZSQ6Ci0KLSNlbmRpZiAvKlVOSVNURF9IKi8KLSQgIGNsb3NlIGhmaWxlJAotJCAgRUNITyAiQ3JlYXRlZCAiIltddW5pc3RkLmgiIi4iCi0kIGVuZGlmICFnY2MgJyNpbmNsdWRlIDx1bmlzdGQuaD4nIGZhaWxlZAotJCBERUxFVEUgdG1wLWNoay1oLmM7KgotJAotJHRtcF9jaGtfaDogc3Vicm91dGluZQotJCAgc2V0IG5vT24KLSQgIGhuYW1lID0gZiRlZGl0KCI8IiArIChwMSAtICJIQVZFXyIgLSAiX0giKSArICIuaD4iLCJMT1dFUkNBU0UiKQotJCAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnaG5hbWUnLiIKLSQgIGlmIGYkc2VhcmNoKCJ0bXAtY2hrLWgub2JqIikubmVzLiIiIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKLSQgIGRlZmluZS9ub0xvZyBzeXMkZXJyb3IgX05MOgkhY2FuJ3QgdXNlIC9Vc2VyX01vZGUgaGVyZSBkdWUgdG8gZ2NjCi0kICBkZWZpbmUvbm9Mb2cgc3lzJG91dHB1dCBfTkw6CSEgZHJpdmVyJ3MgdXNlIG9mIG11bHRpcGxlIGltYWdlIGFjdGl2YXRpb24KLSQgIGdjYyAvSW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pIC9EZWZpbmU9KCInJ3AxJyIpIHRtcC1jaGstaC5jCi0kIWNhbid0IGp1c3QgY2hlY2sgJHN0YXR1czsgZ2NjIDIuNi5bMC0zXSBwcmVwcm9jZXNzb3IgZG9lc24ndCBzZXQgaXQgY29ycmVjdGx5Ci0kICBvayA9ICgoJHN0YXR1cy5hbmQuMSkuYW5kLihmJHNlYXJjaCgidG1wLWNoay1oLm9iaiIpLm5lcy4iIikpIC5vci4gJXgxMDAwMDAwMAotJCAgZGVhc3NpZ24gc3lzJGVycm9yCSFyZXN0b3JlLCBtb3JlIG9yIGxlc3MKLSQgIGRlYXNzaWduIHN5cyRvdXRwdXQKLSQgIGlmIG9rIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKLSQgIGV4aXQgb2sKLSQgZW5kc3Vicm91dGluZSAhdG1wX2Noa19oCi0kCi0kIQotJCEgRG9uZQotJCEKLSQgaWYgZiRzZWFyY2goImNvbmZpZy5zdGF0dXMiKSAubmVzLiAiIiB0aGVuIERFTEVURSBjb25maWcuc3RhdHVzOyoKLSQgb3Blbi93cml0ZSBjZmlsZSBbXWNvbmZpZy5zdGF0dXMKLSQgd3JpdGUgY2ZpbGUgIkxpbmtzIGFyZSBub3cgc2V0IHVwIGZvciB1c2Ugd2l0aCBhICIrYXJjaCsiIHJ1bm5pbmcgVk1TLiIKLSQgY2xvc2UgY2ZpbGUKLSQgdHlwZSBbXWNvbmZpZy5zdGF0dXMKLSRleGl0Ci0kIQotJCEKLSRtYWtlOiBzdWJyb3V0aW5lCi0kICBpZiBmJHNlYXJjaChwMSkubmVzLiIiIHRoZW4gREVMRVRFICdwMSc7KgotJCAgY3JlYXRlICdwMScKLSQgIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kICBvcGVuL0FwcGVuZCBpZmlsZSQgJ3AxJwotJCAgd3JpdGUgaWZpbGUkICIjaW5jbHVkZSAiIicnZiRzdHJpbmcocDIgLSAiWy5jb25maWddIiknIiIiCi0kICBjbG9zZSBpZmlsZSQKLSQgIEVDSE8gIkNyZWF0ZWQgJydwMScgZm9yICcncDInLiIKLSRlbmRzdWJyb3V0aW5lICFtYWtlCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnLmluIGIvZ2FzL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmMmFkYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SRU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiBkZWZhdWx0aW5nIHRvIEVMRiBvbiBTQ08gNS4gKi8KLSN1bmRlZiBTQ09fRUxGCi0KLS8qIFVzZSBFTEYgc3RhYnMgZm9yIE1JUFMsIG5vdCBFQ09GRiBzdGFicyAqLwotI3VuZGVmIE1JUFNfU1RBQlNfRUxGCi0KLS8qIERlZmluZSBpZiBkZWZhdWx0IHRhcmdldCBpcyBQb3dlclBDIFNvbGFyaXMuICovCi0jdW5kZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotCi0vKiBEZWZpbmUgYXMgMSBpZiBiaWcgZW5kaWFuLiAqLwotI3VuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0KLS8qIERlZmF1bHQgYXJjaGl0ZWN0dXJlLiAqLwotI3VuZGVmIERFRkFVTFRfQVJDSAotCi0vKiBVc2luZyBjZ2VuIGNvZGU/ICovCi0jdW5kZWYgVVNJTkdfQ0dFTgotCi0vKiBVc2luZyBpMzg2IENPRkY/ICovCi0jdW5kZWYgSTM4NkNPRkYKLQotLyogVXNpbmcgbTY4ayBDT0ZGPyAqLwotI3VuZGVmIE02OEtDT0ZGCi0KLS8qIFVzaW5nIG04OGsgQ09GRj8gKi8KLSN1bmRlZiBNODhLQ09GRgotCi0vKiBhLm91dCBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9BT1VUCi0KLS8qIGIub3V0IHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0JPVVQKLQotLyogQ09GRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9DT0ZGCi0KLS8qIEVDT0ZGIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0VDT0ZGCi0KLS8qIEVMRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9FTEYKLQotLyogZ2VuZXJpYyBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9HRU5FUklDCi0KLS8qIEhQMzAwIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0hQMzAwCi0KLS8qIElFRUUgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfSUVFRQotCi0vKiBTT00gc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfU09NCi0KLS8qIFZNUyBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9WTVMKLQotLyogVXNlIGVtdWxhdGlvbiBzdXBwb3J0PyAqLwotI3VuZGVmIFVTRV9FTVVMQVRJT05TCi0KLS8qIFN1cHBvcnRlZCBlbXVsYXRpb25zLiAqLwotI3VuZGVmIEVNVUxBVElPTlMKLQotLyogRGVmYXVsdCBlbXVsYXRpb24uICovCi0jdW5kZWYgREVGQVVMVF9FTVVMQVRJT04KLQotLyogb2xkIENPRkYgc3VwcG9ydD8gKi8KLSN1bmRlZiBNQU5ZX1NFR01FTlRTCi0KLS8qIFVzZSBCRkQgaW50ZXJmYWNlPyAqLwotI3VuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogVGFyZ2V0IGFsaWFzLiAqLwotI3VuZGVmIFRBUkdFVF9BTElBUwotCi0vKiBDYW5vbmljYWwgdGFyZ2V0LiAqLwotI3VuZGVmIFRBUkdFVF9DQU5PTklDQUwKLQotLyogVGFyZ2V0IENQVS4gKi8KLSN1bmRlZiBUQVJHRVRfQ1BVCi0KLS8qIFRhcmdldCB2ZW5kb3IuICovCi0jdW5kZWYgVEFSR0VUX1ZFTkRPUgotCi0vKiBUYXJnZXQgT1MuICovCi0jdW5kZWYgVEFSR0VUX09TCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBDb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVyPyAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogYXNzZXJ0IGJyb2tlbj8gKi8KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIG1hbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBEZWZpbmUgaWYgZnJlZSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0KLS8qIERlZmluZSBpZiBlbnZpcm9uIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotCi0vKiBEZWZpbmUgaWYgZXJybm8gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2FvdXRfZ251LmggYi9nYXMvY29uZmlnL2FvdXRfZ251LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGY5Y2IuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hb3V0X2dudS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBhb3V0X2dudS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX19BX09VVF9HTlVfSF9fCi0jZGVmaW5lIF9fQV9PVVRfR05VX0hfXwotCi0vKiBUaGVyZSBhcmUgdHdvIG1haW4gZmxhdm91cnMgb2YgYS5vdXQsIG9uZSB3aGljaCB1c2VzIHRoZSBzdGFuZGFyZAotICAgcmVsb2NhdGlvbnMsIGFuZCBvbmUgd2hpY2ggdXNlcyBleHRlbmRlZCByZWxvY2F0aW9ucy4KLQotICAgVG9kYXksIHRoZSBleHRlbmRlZCByZWxvYyB1c2VzIGFyZQotICAgVENfU1BBUkMsIFRDX0EyOUsKLQotICAgZWFjaCBtdXN0IGRlZmluZSB0aGUgZW51bSByZWxvY190eXBlCi0KLSovCi0KLSNkZWZpbmUgVVNFX0VYVEVOREVEX1JFTE9DIChkZWZpbmVkKFRDX1NQQVJDKSB8fCBkZWZpbmVkKFRDX0EyOUspKQotCi0jaWYgZGVmaW5lZChUQ19TUEFSQykgfHwgZGVmaW5lZChUQ19BMjlLKQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSRUxPQ184LCBSRUxPQ18xNiwgUkVMT0NfMzIsLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gICAgUkVMT0NfRElTUDgsIFJFTE9DX0RJU1AxNiwgUkVMT0NfRElTUDMyLAkvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gICAgUkVMT0NfV0RJU1AzMCwgUkVMT0NfV0RJU1AyMiwKLSAgICBSRUxPQ19ISTIyLCBSRUxPQ18yMiwKLSAgICBSRUxPQ18xMywgUkVMT0NfTE8xMCwKLSAgICBSRUxPQ19TRkFfQkFTRSwgUkVMT0NfU0ZBX09GRjEzLAotICAgIFJFTE9DX0JBU0UxMCwgUkVMT0NfQkFTRTEzLCBSRUxPQ19CQVNFMjIsCS8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgICBSRUxPQ19QQzEwLCBSRUxPQ19QQzIyLAkvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gICAgUkVMT0NfSk1QX1RCTCwJCS8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gICAgUkVMT0NfU0VHT0ZGMTYsCQkvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICAgIFJFTE9DX0dMT0JfREFULCBSRUxPQ19KTVBfU0xPVCwgUkVMT0NfUkVMQVRJVkUsCi0gICAgUkVMT0NfMTAsIFJFTE9DXzExLAotICAgIFJFTE9DX1dESVNQMl8xNCwKLSAgICBSRUxPQ19XRElTUDE5LAotICAgIFJFTE9DX0hISTIyLAotICAgIFJFTE9DX0hMTzEwLAotCi0gICAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgICBSRUxPQ19KVU1QVEFSRywgUkVMT0NfQ09OU1QsIFJFTE9DX0NPTlNUSCwKLQotICAgIFJFTE9DX1dESVNQMTQsIFJFTE9DX1dESVNQMjEsCi0KLSAgICBOT19SRUxPQwotICB9OwotCi0jZW5kaWYgLyogVENfU1BBUkMgb3IgVENfQTI5SyAqLwotCi0KLSNkZWZpbmUgX19HTlVfRVhFQ19NQUNST1NfXwotCi0jaWZuZGVmIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiBhIFVuaXggVjcsIEJlcmtlbGV5LCBTdW5PUywgVmF4IFVsdHJpeAotICAgInN0cnVjdCBleGVjIi4gIERvbid0IGFzc3VtZSB0aGF0IG9uIHRoaXMgbWFjaGluZSwgdGhlICJzdHJ1Y3QgZXhlYyIKLSAgIHdpbGwgbGF5IG91dCB0aGUgc2FtZSBzaXplcyBvciBhbGlnbm1lbnRzLiAgKi8KLQotc3RydWN0IGV4ZWNfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgYV9pbmZvWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV90ZXh0WzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9kYXRhWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9ic3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX3N5bXNbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2VudHJ5WzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV90cnNpemVbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2Ryc2l6ZVs0XTsKLSAgfTsKLQotLyogSG93IGJpZyB0aGUgInN0cnVjdCBleGVjIiBpcyBvbiBkaXNrICovCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoOCAqIDQpCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBpbiBtZW1vcnkgb2YgYSAic3RydWN0IGV4ZWMiIHdoaWxlIHdlIHByb2Nlc3MgaXQuICAqLwotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBsb25nIGFfaW5mbzsJCS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MgKi8KLSAgdW5zaWduZWQgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZW50cnk7CQkvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9kcnNpemU7CQkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotfTsKLQotI2VuZGlmIC8qIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXyAqLwotCi0vKiB0aGVzZSBnbyBpbiB0aGUgTl9NQUNIVFlQRSBmaWVsZCAqLwotLyogVGhlc2Ugc3ltYm9scyBjb3VsZCBiZSBkZWZpbmVkIGJ5IGNvZGUgZnJvbSBTdW5zLi4ucHVudCAnZW0gKi8KLSN1bmRlZiBNX1VOS05PV04KLSN1bmRlZiBNXzY4MDEwCi0jdW5kZWYgTV82ODAyMAotI3VuZGVmIE1fU1BBUkMKLWVudW0gbWFjaGluZV90eXBlCi0gIHsKLSAgICBNX1VOS05PV04gPSAwLAotICAgIE1fNjgwMTAgPSAxLAotICAgIE1fNjgwMjAgPSAyLAotICAgIE1fU1BBUkMgPSAzLAotICAgIC8qIHNraXAgYSBidW5jaCBzbyB3ZSBkb24ndCBydW4gaW50byBhbnkgb2Ygc3VuJ3MgbnVtYmVycyAqLwotICAgIE1fMzg2ID0gMTAwLAotICAgIE1fMjlLID0gMTAxLAotICAgIE1fUlM2MDAwID0gMTAyLAkJLyogSUJNIFJTLzYwMDAgKi8KLSAgICAvKiBIUC9CU0QgZm9ybWF0cyAqLwotICAgIE1fSFAyMDAgPSAyMDAsCQkvKiBocDIwMCAoNjgwMTApIEJTRCBiaW5hcnkgKi8KLSAgICBNX0hQMzAwID0gMzAwLAkJLyogaHAzMDAgKDY4MDIwKzY4ODgxKSBCU0QgYmluYXJ5ICovCi0gICAgTV9IUFVYMjMgPSAweDAyMEMJCS8qIGhwMjAwLzMwMCBIUFVYIGJpbmFyeSAqLwotICB9OwotCi0jZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChlbnVtIG1hY2hpbmVfdHlwZSkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHhmZikpCi0jZGVmaW5lIE5fRkxBR1MoZXhlYykgKCgoZXhlYykuYV9pbmZvID4+IDI0KSAmIDB4ZmYpCi0jZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotICAgICB8ICgoKGludCkodHlwZSkgJiAweGZmKSA8PCAxNikgXAotICAgICB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpIFwKLSAgICAoKGV4ZWMpLmFfaW5mbyA9ICgoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZjAwMDApIHwgKChtYWdpYykgJiAweGZmZmYpKSkKLQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotICAgICgoZXhlYykuYV9pbmZvID0gXAotICAgICAoKGV4ZWMpLmFfaW5mbyYweGZmMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHhmZikgPDwgMTYpKQotCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSBcCi0gICAgICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotCi0vKiBDb2RlIGluZGljYXRpbmcgb2JqZWN0IGZpbGUgb3IgaW1wdXJlIGV4ZWN1dGFibGUuICAqLwotI2lmbmRlZiBPTUFHSUMKLSNkZWZpbmUgT01BR0lDIDA0MDcKLSNlbmRpZgotLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAwNDEwCi0vKiBDb2RlIGluZGljYXRpbmcgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBaTUFHSUMgMDQxMwotCi0vKiBWaXJ0dWFsIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGZyb20gdGhlIGEub3V0IGZpbGUuICBGb3IgT01BR0lDLAotICAgKGFsbW9zdCBhbHdheXMgInVubGlua2VkIC5vJ3MiIHRoZXNlIGRheXMpLCBzaG91bGQgYmUgemVyby4KLSAgIEZvciBsaW5rZWQgZmlsZXMsIHNob3VsZCByZWZsZWN0IHJlYWxpdHkgaWYgd2Uga25vdyBpdC4gICovCi0KLSNpZm5kZWYgTl9UWFRBRERSCi0jZGVmaW5lIE5fVFhUQUREUih4KQkoTl9NQUdJQyh4KT09T01BR0lDPyAwIDogVEVYVF9TVEFSVF9BRERSKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9CQURNQUcKLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSAgICYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0JCQkgICAmJiBOX01BR0lDKHgpICE9IFpNQUdJQykKLSNlbmRpZgotCi0vKiBCeSBkZWZhdWx0LCBzZWdtZW50IHNpemUgaXMgY29uc3RhbnQuICBCdXQgb24gc29tZSBtYWNoaW5lcywgaXQgY2FuCi0gICBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBhLm91dCBoZWFkZXIgKGUuZy4gbWFjaGluZSB0eXBlKS4gICovCi0jaWZuZGVmCU5fU0VHU0laRQotI2RlZmluZQlOX1NFR1NJWkUoeCkJU0VHTUVOVF9TSVpFCi0jZW5kaWYKLQotLyogVGhpcyBjb21wbGV4aXR5IGlzIGZvciBlbmNhcHN1bGF0ZWQgQ09GRiBzdXBwb3J0ICovCi0jaWZuZGVmIF9OX0hEUk9GRgotI2RlZmluZSBfTl9IRFJPRkYoeCkJKE5fU0VHU0laRSh4KSAtIHNpemVvZiAoc3RydWN0IGV4ZWMpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9UWFRPRkYKLSNkZWZpbmUgTl9UWFRPRkYoeCkJKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8JXAotCQkJIF9OX0hEUk9GRigoeCkpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOglcCi0JCQkgc2l6ZW9mIChzdHJ1Y3QgZXhlYykpCi0jZW5kaWYKLQotCi0jaWZuZGVmIE5fREFUT0ZGCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKLSNlbmRpZgotCi0jaWZuZGVmIE5fVFJFTE9GRgotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9EUkVMT0ZGCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NZTU9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NUUk9GRgotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZW5kaWYKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jaWZuZGVmIE5fVFhUQUREUgotI2RlZmluZQlOX1RYVEFERFIoeCkJMAotI2VuZGlmCi0KLSNpZm5kZWYgTl9EQVRBRERSCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0KSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0LTEpICYgfihOX1NFR1NJWkUoeCktMSkpKSkKLSNlbmRpZgotCi0vKiBBZGRyZXNzIG9mIGJzcyBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2RlZmluZSBOX0JTU0FERFIoeCkgKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCi0MCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqbl9uYW1lOwotCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCWxvbmcgbl9zdHJ4OwotICAgICAgfQotICAgIG5fdW47Ci0gICAgdW5zaWduZWQgY2hhciBuX3R5cGU7Ci0gICAgY2hhciBuX290aGVyOwotICAgIHNob3J0IG5fZGVzYzsKLSAgICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci0gIH07Ci0KLSNkZWZpbmUgTl9VTkRGIDAKLSNkZWZpbmUgTl9BQlMgMgotI2RlZmluZSBOX1RFWFQgNAotI2RlZmluZSBOX0RBVEEgNgotI2RlZmluZSBOX0JTUyA4Ci0jZGVmaW5lCU5fQ09NTQkweDEyCQkvKiBjb21tb24gKHZpc2libGUgaW4gc2hhcmVkIGxpYiBjb21tb25zKSAqLwotI2RlZmluZSBOX0ZOIDB4MUYJCS8qIEZpbGUgbmFtZSBvZiBhIC5vIGZpbGUgKi8KLQotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgdXNlZnVsbHkgYmUgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgMQotI2RlZmluZSBOX1RZUEUgMDM2Ci0jZGVmaW5lIE5fU1RBQiAwMzQwCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHlwZSBpbmRpY2F0ZXMgdGhlIGRlZmluaXRpb24gb2YgYSBzeW1ib2wgYXMgYmVpbmcKLSAgIGFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhbm90aGVyIHN5bWJvbC4gIFRoZSBvdGhlciBzeW1ib2wKLSAgIGFwcGVhcnMgYXMgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSwgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgc3ltYm9sLgotCi0gICBJbmRpcmVjdGlvbiBpcyBhc3ltbWV0cmljYWwuICBUaGUgb3RoZXIgc3ltYm9sJ3MgdmFsdWUgd2lsbCBiZSB1c2VkCi0gICB0byBzYXRpc2Z5IHJlcXVlc3RzIGZvciB0aGUgaW5kaXJlY3Qgc3ltYm9sLCBidXQgbm90IHZpY2UgdmVyc2EuCi0gICBJZiB0aGUgb3RoZXIgc3ltYm9sIGRvZXMgbm90IGhhdmUgYSBkZWZpbml0aW9uLCBsaWJyYXJpZXMgd2lsbAotICAgYmUgc2VhcmNoZWQgdG8gZmluZCBhIGRlZmluaXRpb24uICAqLwotCi0jZGVmaW5lIE5fSU5EUiAweGEKLQotLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KLSAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgotICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAotICAgZWxlbWVudCdzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KLSAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCi0KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKLSAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KLSAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCi0gICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLQotLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLwotI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLQotLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCi0jZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KLQotLyogV2FybmluZyBzeW1ib2wuIFRoZSB0ZXh0IGdpdmVzIGEgd2FybmluZyBtZXNzYWdlLCB0aGUgbmV4dCBzeW1ib2wKLSAgIGluIHRoZSB0YWJsZSB3aWxsIGJlIHVuZGVmaW5lZC4gV2hlbiB0aGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQsIHRoZQotICAgbWVzc2FnZSBpcyBwcmludGVkLiAgKi8KLQotI2RlZmluZQlOX1dBUk5JTkcgMHgxZQotCi0vKiBXZWFrIHN5bWJvbHMuICBUaGVzZSBhcmUgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBhLm91dCBmb3JtYXQuICBUaGUKLSAgIHNlbWFudGljcyBhcmUgdGhvc2Ugb2YgRUxGIHdlYWsgc3ltYm9scy4gIFdlYWsgc3ltYm9scyBhcmUgYWx3YXlzCi0gICBleHRlcm5hbGx5IHZpc2libGUuICBUaGUgTl9XRUFLPyB2YWx1ZXMgYXJlIHNxdWVlemVkIGludG8gdGhlCi0gICBhdmFpbGFibGUgc2xvdHMuICBUaGUgdmFsdWUgb2YgYSBOX1dFQUtVIHN5bWJvbCBpcyAwLiAgVGhlIHZhbHVlcwotICAgb2YgdGhlIG90aGVyIHR5cGVzIGFyZSB0aGUgZGVmaW5pdGlvbnMuICAqLwotI2RlZmluZSBOX1dFQUtVCTB4MGQJCS8qIFdlYWsgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0EgMHgwZQkJLyogV2VhayBhYnNvbHV0ZSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtUIDB4MGYJCS8qIFdlYWsgdGV4dCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtEIDB4MTAJCS8qIFdlYWsgZGF0YSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtCIDB4MTEJCS8qIFdlYWsgYnNzIHN5bWJvbC4gICovCi0MCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGVudW0gYW5kIHN0cnVjdCB3ZXJlIGJvcnJvd2VkIGZyb20gU3VuT1MncwotICAgL3Vzci9pbmNsdWRlL3N1bjQvYS5vdXQuaCAgYW5kIGV4dGVuZGVkIHRvIGhhbmRsZQotICAgb3RoZXIgbWFjaGluZXMuICBJdCBpcyBjdXJyZW50bHkgdXNlZCBvbiBTUEFSQyBhbmQgQU1EIDI5MDAwLgotCi0gICByZWxvY19leHRfYnl0ZXMgaXMgaG93IGl0IGxvb2tzIG9uIGRpc2suICByZWxvY19pbmZvX2V4dGVuZGVkIGlzCi0gICBob3cgd2UgbWlnaHQgcHJvY2VzcyBpdCBvbiBhIG5hdGl2ZSBob3N0LiAgKi8KLSNpZiBVU0VfRVhURU5ERURfUkVMT0MKLQotc3RydWN0IHJlbG9jX2V4dF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzNdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzFdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRlbmRbNF07Ci0gIH07Ci0KLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCTB4ODAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcJCTB4MUYKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcJMAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRQkweEY4Ci0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFCTMKLQotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkxMgkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgcmVsb2NfaW5mb19leHRlbmRlZAotewotICB1bnNpZ25lZCBsb25nIHJfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg6MjQ7Ci0jIGRlZmluZQlyX3N5bWJvbG51bSAgcl9pbmRleAotICB1bnNpZ25lZCByX2V4dGVybjoxOwotICB1bnNpZ25lZDoyOwotICAvKiAgUlMvNjAwMCBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGVudW0gYml0ZmllbGQKLQkgICAgZW51bSByZWxvY190eXBlIHJfdHlwZTo1OyAqLwotICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOwotICBsb25nIGludCByX2FkZGVuZDsKLX07Ci0KLSNlbHNlCi0KLS8qIFRoZSBzdGFuZGFyZCwgb2xkLWZhc2hpb25lZCwgQmVya2VsZXkgY29tcGF0aWJsZSByZWxvY2F0aW9uIHN0cnVjdCAqLwotCi0KLQotI2lmZGVmIFRDX0k4NjAKLS8qIE5PVEU6IHRocmVlIGJpdHMgbWF4LCBzZWUgc3RydWN0IHJlbG9jX2luZm9faTg2MC5yX3R5cGUgKi8KLWVudW0gaTg2MF9yZWxvY190eXBlCi0gIHsKLSAgICBOT19SRUxPQyA9IDAsIEJSQUREUiwgTE9XMCwgTE9XMSwgTE9XMiwgTE9XMywgTE9XNCwgU1BMSVQwLCBTUExJVDEsIFNQTElUMiwgUkVMT0NfMzIsCi0gIH07Ci0KLXR5cGVkZWYgZW51bSBpODYwX3JlbG9jX3R5cGUgcmVsb2NfdHlwZTsKLQotLyogTk9URTogdHdvIGJpdHMgbWF4LCBzZWUgcmVsb2NfaW5mb19pODYwLnJfdHlwZSAqLwotZW51bSBoaWdobG93X3R5cGUKLSAgewotICAgIE5PX1NQRUMgPSAwLCBQQUlSLCBISUdILCBISUdIQURKLAotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbmZvX2k4NjAKLXsKLSAgdW5zaWduZWQgbG9uZyByX2FkZHJlc3M7Ci0gIC8qCi0JICogVXNpbmcgYml0IGZpZWxkcyBoZXJlIGlzIGEgYmFkIGlkZWEgYmVjYXVzZSB0aGUgb3JkZXIgaXMgbm90IHBvcnRhYmxlLiA6LSgKLQkgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogY29tYmluaW5nIHRoZSB0d28gZmllbGQgc2ltcGxpZmllcyB0aGUgYXJndW1lbnQgcGFzc2luZyBpbiAibmV3X2ZpeCgpIiAqLwotICAvKiBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBleGlzdGluZyBTcGFyYyAjaWZkZWYncyAqLwotICAvKiByX3R5cGU6ICBoaWdobG93X3R5cGUgLSBiaXRzIDUsNDsgcmVsb2NfdHlwZSAtIGJpdHMgMy0wICovCi0gIHVuc2lnbmVkIGludCByX3R5cGU6NjsKLSAgbG9uZyByX2FkZGVuZDsKLX07Ci0KLSNlbmRpZiAvKiBUQ19JODYwICovCi0KLQotc3RydWN0IHJlbG9jX3N0ZF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzNdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzFdOwotICB9OwotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkweDYwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcJNQkvKiBUbyBzaGlmdCB0byB1bml0cyBwbGFjZSAqLwotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFCTB4MDYKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkweDEwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCTB4MDgKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkweDA0Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRQkweDA0Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCTB4MDIKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCTB4MDIKLQotI2RlZmluZQlSRUxPQ19TVERfU0laRQk4CS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLSNlbmRpZiAvKiBVU0VfRVhURU5ERURfUkVMT0MgKi8KLQotI2lmbmRlZiBDVVNUT01fUkVMT0NfRk9STUFUCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi17Ci0gIC8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLwotICBpbnQgcl9hZGRyZXNzOwotICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0Ci0JICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCi0JICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotCSAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCi0gIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOwotICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgotCSAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCi0JICAgaW4gZmlsZSdzIHRoZSBzeW1ib2wgdGFibGUuCi0JICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLQkgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKLQkgICAodGhlIE5fRVhUIGJpdCBtYXkgYmUgc2V0IGFsc28sIGJ1dCBzaWduaWZpZXMgbm90aGluZykuICAqLwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogVGhlIG5leHQgdGhyZWUgYml0cyBhcmUgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBzZWVtIHRvCi0JICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSNpZmRlZiBUQ19OUzMySwotICB1bnNpZ25lZCBpbnQgcl9ic3I6MTsKLSAgdW5zaWduZWQgaW50IHJfZGlzcDoyOwotI2Vsc2UKLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0jZW5kaWYgLyogVENfTlMzMksgKi8KLSAgLyogdW51c2VkICovCi0gIHVuc2lnbmVkIGludCByX3BhZDoxOwkJLyogUGFkZGluZyAtLSBzZXQgdG8gemVybyAqLwotfTsKLQotI2VuZGlmIC8qIENVU1RPTV9SRUxPQ19GT1JNQVQgKi8KLQotI2VuZGlmIC8qIF9fQV9PVVRfR05VX0hfXyAqLwotCi0vKiBlbmQgb2YgYW91dF9nbnUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYyBiL2dhcy9jb25maWcvYXRvZi1pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZGExYmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDcxNSArMCwwIEBACi0vKiBhdG9mX2llZWUuYyAtIHR1cm4gYSBGbG9udW0gaW50byBhbiBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0vKiBGbG9udW1zIHJldHVybmVkIGhlcmUuICAqLwotZXh0ZXJuIEZMT05VTV9UWVBFIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotCi1zdGF0aWMgaW50IG5leHRfYml0cyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHVuZ2V0X2JpdHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyIFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICopKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgRVhQX0NIQVJTW107Ci0vKiBQcmVjaXNpb24gaW4gTGl0dGxlTnVtcy4gKi8KLS8qIERvbid0IGNvdW50IHRoZSBnYXAgaW4gdGhlIG02OGsgZXh0ZW5kZWQgcHJlY2lzaW9uIGZvcm1hdC4gICovCi0jZGVmaW5lIE1BWF9QUkVDSVNJT04gKDUpCi0jZGVmaW5lIEZfUFJFQ0lTSU9OICgyKQotI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgWF9QUkVDSVNJT04gKDUpCi0jZGVmaW5lIFBfUFJFQ0lTSU9OICg1KQotCi0vKiBMZW5ndGggaW4gTGl0dGxlTnVtcyBvZiBndWFyZCBiaXRzLiAqLwotI2RlZmluZSBHVUFSRCAoMikKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWFza1tdID0KLXsKLSAgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwMSwKLSAgMHgwMDAwMDAwMywKLSAgMHgwMDAwMDAwNywKLSAgMHgwMDAwMDAwZiwKLSAgMHgwMDAwMDAxZiwKLSAgMHgwMDAwMDAzZiwKLSAgMHgwMDAwMDA3ZiwKLSAgMHgwMDAwMDBmZiwKLSAgMHgwMDAwMDFmZiwKLSAgMHgwMDAwMDNmZiwKLSAgMHgwMDAwMDdmZiwKLSAgMHgwMDAwMGZmZiwKLSAgMHgwMDAwMWZmZiwKLSAgMHgwMDAwM2ZmZiwKLSAgMHgwMDAwN2ZmZiwKLSAgMHgwMDAwZmZmZiwKLSAgMHgwMDAxZmZmZiwKLSAgMHgwMDAzZmZmZiwKLSAgMHgwMDA3ZmZmZiwKLSAgMHgwMDBmZmZmZiwKLSAgMHgwMDFmZmZmZiwKLSAgMHgwMDNmZmZmZiwKLSAgMHgwMDdmZmZmZiwKLSAgMHgwMGZmZmZmZiwKLSAgMHgwMWZmZmZmZiwKLSAgMHgwM2ZmZmZmZiwKLSAgMHgwN2ZmZmZmZiwKLSAgMHgwZmZmZmZmZiwKLSAgMHgxZmZmZmZmZiwKLSAgMHgzZmZmZmZmZiwKLSAgMHg3ZmZmZmZmZiwKLSAgMHhmZmZmZmZmZiwKLX07Ci0MCi0KLXN0YXRpYyBpbnQgYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLXN0YXRpYyBpbnQgbGl0dGxlbnVtc19sZWZ0Owotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLQotc3RhdGljIGludAotbmV4dF9iaXRzIChudW1iZXJfb2ZfYml0cykKLSAgICAgaW50IG51bWJlcl9vZl9iaXRzOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwotCi0gIGlmICghbGl0dGxlbnVtc19sZWZ0KQotICAgIHJldHVybiAoMCk7Ci0gIGlmIChudW1iZXJfb2ZfYml0cyA+PSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKQotICAgIHsKLSAgICAgIHJldHVybl92YWx1ZSA9IG1hc2tbYml0c19sZWZ0X2luX2xpdHRsZW51bV0gJiAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0gICAgICBudW1iZXJfb2ZfYml0cyAtPSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOwotICAgICAgcmV0dXJuX3ZhbHVlIDw8PSBudW1iZXJfb2ZfYml0czsKLQotICAgICAgaWYgKC0tbGl0dGxlbnVtc19sZWZ0KQotCXsKLQkgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBudW1iZXJfb2ZfYml0czsKLQkgIC0tbGl0dGxlbnVtX3BvaW50ZXI7Ci0JICByZXR1cm5fdmFsdWUgfD0gKCpsaXR0bGVudW1fcG9pbnRlciA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKSAmIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtIC09IG51bWJlcl9vZl9iaXRzOwotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tudW1iZXJfb2ZfYml0c10gJiAoKmxpdHRsZW51bV9wb2ludGVyID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi0vKiBOdW0gaGFkIGJldHRlciBiZSBsZXNzIHRoYW4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTICovCi1zdGF0aWMgdm9pZAotdW5nZXRfYml0cyAobnVtKQotICAgICBpbnQgbnVtOwotewotICBpZiAoIWxpdHRsZW51bXNfbGVmdCkKLSAgICB7Ci0gICAgICArK2xpdHRsZW51bV9wb2ludGVyOwotICAgICAgKytsaXR0bGVudW1zX2xlZnQ7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gbnVtOwotICAgIH0KLSAgZWxzZSBpZiAoYml0c19sZWZ0X2luX2xpdHRsZW51bSArIG51bSA+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLSAgICB7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gbnVtIC0gKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgICAgKytsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgICsrbGl0dGxlbnVtc19sZWZ0OwotICAgIH0KLSAgZWxzZQotICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gKz0gbnVtOwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsKLXsKLSAgYXNfYmFkIChfKCJjYW5ub3QgY3JlYXRlIGZsb2F0aW5nLXBvaW50IG51bWJlciIpKTsKLSAgd29yZHNbMF0gPSAoTElUVExFTlVNX1RZUEUpICgodW5zaWduZWQpIC0xKSA+PiAxOyAvKiBaZXJvIHRoZSBsZWZ0bW9zdCBiaXQgKi8KLSAgd29yZHNbMV0gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotICB3b3Jkc1syXSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci0gIHdvcmRzWzNdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLSAgd29yZHNbNF0gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotICB3b3Jkc1s1XSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci19Ci0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyCSoKLSAqCXRvIGZpZ3VyZSBvdXQgYW55IGFsaWdubWVudCBwcm9ibGVtcyBhbmQgdG8gY29uc3BpcmUgZm9yIHRoZQkqCi0gKglieXRlcy93b3JkIHRvIGJlIGVtaXR0ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyLiBCaWdlbmRpYW5zIGJld2FyZSEJKgotICoJCQkJCQkJCQkqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBOb3RlIHRoYXQgYXRvZi1pZWVlIGFsd2F5cyBoYXMgWCBhbmQgUCBwcmVjaXNpb25zIGVuYWJsZWQuICBpdCBpcyB1cAotICAgdG8gbWRfYXRvZiB0byBmaWx0ZXIgdGhlbSBvdXQgaWYgdGhlIHRhcmdldCBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQKLSAgIHRoZW0uICAqLwotCi0vKiBSZXR1cm5zIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotY2hhciAqCi1hdG9mX2llZWUgKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKLSAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCi0gICAgIGludCB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gIFRoZSAxc3QgTUFYX1BSRUNJU0lPTiBhcmUKLSAgICAgemVyb2VkLCB0aGUgbGFzdCBjb250YWluIGZsb251bSBiaXRzLiAqLwotICBzdGF0aWMgTElUVExFTlVNX1RZUEUgYml0c1tNQVhfUFJFQ0lTSU9OICsgTUFYX1BSRUNJU0lPTiArIEdVQVJEXTsKLSAgY2hhciAqcmV0dXJuX3ZhbHVlOwotICAvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmb3JtYXQuICovCi0gIGludCBwcmVjaXNpb247Ci0gIGxvbmcgZXhwb25lbnRfYml0czsKLSAgRkxPTlVNX1RZUEUgc2F2ZV9nZW5fZmxvbnVtOwotCi0gIC8qIFdlIGhhdmUgdG8gc2F2ZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgYmVjYXVzZSBpdAotICAgICBjb250YWlucyBzdG9yYWdlIGFsbG9jYXRpb24gYWJvdXQgdGhlIGFycmF5IG9mIExJVFRMRU5VTXMgd2hlcmUKLSAgICAgdGhlIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gIFdlIHdpbGwgYWxsb2NhdGUgb3VyIG93biBhcnJheSBvZgotICAgICBsaXR0bGVudW1zIGJlbG93LCBidXQgaGF2ZSB0byByZXN0b3JlIHRoZSBnbG9iYWwgb25lIG9uIGV4aXQuICAqLwotICBzYXZlX2dlbl9mbG9udW0gPSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyA9IGJpdHMgKyBNQVhfUFJFQ0lTSU9OOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5oaWdoID0gTlVMTDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyID0gTlVMTDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuZXhwb25lbnQgPSAwOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID0gJ1wwJzsKLQotICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgbmVjZXNzYXJ5OiB0aGUgaGlnaGVzdCBmbG9udW0gbWF5Ci0gICAgIGhhdmUgMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0KLSAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gIHN3aXRjaCAod2hhdF9raW5kKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWNpc2lvbiA9IEZfUFJFQ0lTSU9OOwotICAgICAgZXhwb25lbnRfYml0cyA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlY2lzaW9uID0gRF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ2UnOgotICAgIGNhc2UgJ0UnOgotICAgICAgcHJlY2lzaW9uID0gWF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gMTU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotCi0gICAgICBwcmVjaXNpb24gPSBQX1BSRUNJU0lPTjsKLSAgICAgIGV4cG9uZW50X2JpdHMgPSAtMTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgfQotCi0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmhpZ2gKLSAgICA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsIEVYUF9DSEFSUywKLQkJICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICB9Ci0gIGdlbl90b193b3JkcyAod29yZHMsIHByZWNpc2lvbiwgZXhwb25lbnRfYml0cyk7Ci0KLSAgLyogUmVzdG9yZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIncyBzdG9yYWdlIGFsbG9jIChhbmQKLSAgICAgZXZlcnl0aGluZyBlbHNlKS4gICovCi0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gc2F2ZV9nZW5fZmxvbnVtOwotCi0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19Ci0KLS8qIFR1cm4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgaW50byBhIHJlYWwgZmxvYXQvZG91YmxlL2V4dGVuZGVkLiAgKi8KLWludAotZ2VuX3RvX3dvcmRzICh3b3JkcywgcHJlY2lzaW9uLCBleHBvbmVudF9iaXRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci0gICAgIGludCBwcmVjaXNpb247Ci0gICAgIGxvbmcgZXhwb25lbnRfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZSA9IDA7Ci0KLSAgbG9uZyBleHBvbmVudF8xOwotICBsb25nIGV4cG9uZW50XzI7Ci0gIGxvbmcgZXhwb25lbnRfMzsKLSAgbG9uZyBleHBvbmVudF80OwotICBpbnQgZXhwb25lbnRfc2tpcHBhZ2U7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmQxOwotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIExJVFRMRU5VTV9UWVBFICp3b3Jkc19lbmQ7Ci0KLSAgd29yZHNfZW5kID0gd29yZHMgKyBwcmVjaXNpb247Ci0jaWZkZWYgVENfTTY4SwotICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotICAgIC8qIE9uIHRoZSBtNjhrIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0IGhhcyBhIGdhcCBvZiAxNiBiaXRzCi0gICAgICAgYmV0d2VlbiB0aGUgZXhwb25lbnQgYW5kIHRoZSBtYW50aXNzYS4gICovCi0gICAgd29yZHNfZW5kKys7Ci0jZW5kaWYKLQotICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93ID4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyKQotICAgIHsKLSAgICAgIC8qIDAuMGUwIHNlZW4uICovCi0gICAgICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0Jd29yZHNbMF0gPSAweDAwMDA7Ci0gICAgICBlbHNlCi0Jd29yZHNbMF0gPSAweDgwMDA7Ci0gICAgICBtZW1zZXQgKCZ3b3Jkc1sxXSwgJ1wwJywKLQkgICAgICAod29yZHNfZW5kIC0gd29yZHMgLSAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0KLSAgLyogTmFOOiAgRG8gdGhlIHJpZ2h0IHRoaW5nICovCi0gIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09IDApCi0gICAgewotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHhmZmZmOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzNdID0gMHhmZmZmOwotCSAgd29yZHNbNF0gPSAweGZmZmY7Ci0JICB3b3Jkc1s1XSA9IDB4ZmZmZjsKLSNlbHNlIC8qICEgVENfTTY4SyAqLwotI2lmZGVmIFRDX0kzODYKLQkgIHdvcmRzWzBdID0gMHhmZmZmOwotCSAgd29yZHNbMV0gPSAweGMwMDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX0kzODYgKi8KLQkgIGFib3J0ICgpOwotI2VuZGlmIC8qICEgVENfSTM4NiAqLwotI2VuZGlmIC8qICEgVENfTTY4SyAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHhmZmZmOwotCSAgd29yZHNbMl0gPSAweGZmZmY7Ci0JICB3b3Jkc1szXSA9IDB4ZmZmZjsKLQl9Ci0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnUCcpCi0gICAgewotICAgICAgLyogK0lORjogIERvIHRoZSByaWdodCB0aGluZyAqLwotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2Y4MDsKLQkgIHdvcmRzWzFdID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0JewotI2lmZGVmIFRDX002OEsKLQkgIHdvcmRzWzBdID0gMHg3ZmZmOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotCSAgd29yZHNbNV0gPSAwOwotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTM4NgotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDB4ODAwMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQkgIHdvcmRzWzRdID0gMDsKLSNlbHNlIC8qICEgVENfSTM4NiAqLwotCSAgYWJvcnQgKCk7Ci0jZW5kaWYgLyogISBUQ19JMzg2ICovCi0jZW5kaWYgLyogISBUQ19NNjhLICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmRzWzBdID0gMHg3ZmYwOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCX0KLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJ04nKQotICAgIHsKLSAgICAgIC8qIE5lZ2F0aXZlIElORiAqLwotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4ZmY4MDsKLQkgIHdvcmRzWzFdID0gMHgwOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweGZmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0JICB3b3Jkc1s1XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX002OEsgKi8KLSNpZmRlZiBUQ19JMzg2Ci0JICB3b3Jkc1swXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzFdID0gMHg4MDAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotI2Vsc2UgLyogISBUQ19JMzg2ICovCi0JICBhYm9ydCAoKTsKLSNlbmRpZiAvKiAhIFRDX0kzODYgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yZHNbMF0gPSAweGZmZjA7Ci0JICB3b3Jkc1sxXSA9IDB4MDsKLQkgIHdvcmRzWzJdID0gMHgwOwotCSAgd29yZHNbM10gPSAweDA7Ci0JfQotICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotICAgIH0KLSAgLyoKLSAgICogVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgd2Ugc3VwcG9ydCBoYXZlOgotICAgKiBCaXQgMTUgaXMgc2lnbiBiaXQuCi0gICAqIEJpdHMgMTQ6biBhcmUgZXhjZXNzLXdoYXRldmVyIGV4cG9uZW50LgotICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0gICAqIEJpdHMgMTU6MCBvZiB0aGUgbmV4dCB3b3JkKHMpIGFyZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdHMuCi0gICAqCi0gICAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotICAgKiBtYW50aXNzYS4KLSAgICovCi0gIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0gIGxpdHRsZW51bV9wb2ludGVyID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyOwotICBsaXR0bGVudW1zX2xlZnQgPSAoMQotCQkgICAgICsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCi0JCSAgICAgLSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cpOwotICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0gIGZvciAoZXhwb25lbnRfc2tpcHBhZ2UgPSAwOyAhbmV4dF9iaXRzICgxKTsgKytleHBvbmVudF9za2lwcGFnZSk7OwotICBleHBvbmVudF8xID0gKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50Ci0JCSsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCi0JCSsgMQotCQktIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyk7Ci0gIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbgotICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIuICovCi0gIGV4cG9uZW50XzIgPSBleHBvbmVudF8xICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotICAvKiBSYWRpeCAyLiAqLwotICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotICAvKiBGb3JnZXQgbGVhZGluZyB6ZXJvcywgZm9yZ2V0IDFzdCBiaXQuICovCi0gIGV4cG9uZW50XzQgPSBleHBvbmVudF8zICsgKCgxIDw8IChleHBvbmVudF9iaXRzIC0gMSkpIC0gMik7Ci0gIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotICBscCA9IHdvcmRzOwotCi0gIC8qIFdvcmQgMS4gU2lnbiwgZXhwb25lbnQgYW5kIHBlcmhhcHMgaGlnaCBiaXRzLiAqLwotICB3b3JkMSA9ICgoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0JICAgPyAwCi0JICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKLQotICAvKiBBc3N1bWUgMidzIGNvbXBsZW1lbnQgaW50ZWdlcnMuICovCi0gIGlmIChleHBvbmVudF80IDw9IDApCi0gICAgewotICAgICAgaW50IHByZWNfYml0czsKLSAgICAgIGludCBudW1fYml0czsKLQotICAgICAgdW5nZXRfYml0cyAoMSk7Ci0gICAgICBudW1fYml0cyA9IC1leHBvbmVudF80OwotICAgICAgcHJlY19iaXRzID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTICogcHJlY2lzaW9uIC0gKGV4cG9uZW50X2JpdHMgKyAxICsgbnVtX2JpdHMpOwotI2lmZGVmIFRDX0kzODYKLSAgICAgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKLQl7Ci0JICAvKiBPbiB0aGUgaTM4NiBhIGRlbm9ybWFsaXplZCBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQgaXMKLQkgICAgIHNoaWZ0ZWQgZG93biBieSBvbmUsIGVmZmVjdGl2ZWx5IGRlY3JlYXNpbmcgdGhlIGV4cG9uZW50Ci0JICAgICBiaWFzIGJ5IG9uZS4gICovCi0JICBwcmVjX2JpdHMgLT0gMTsKLQkgIG51bV9iaXRzICs9IDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmIChudW1fYml0cyA+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBleHBvbmVudF9iaXRzKQotCXsKLQkgIC8qIEJpZ2dlciB0aGFuIG9uZSBsaXR0bGVudW0gKi8KLQkgIG51bV9iaXRzIC09IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIGV4cG9uZW50X2JpdHM7Ci0JICAqbHArKyA9IHdvcmQxOwotCSAgaWYgKG51bV9iaXRzICsgZXhwb25lbnRfYml0cyArIDEgPiBwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHsKLQkgICAgICAvKiBFeHBvbmVudCBvdmVyZmxvdyAqLwotCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkgICAgICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci0JICAgIH0KLSNpZmRlZiBUQ19NNjhLCi0JICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JICAgICpscCsrID0gMDsKLSNlbmRpZgotCSAgd2hpbGUgKG51bV9iaXRzID49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgewotCSAgICAgIG51bV9iaXRzIC09IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgICAqbHArKyA9IDA7Ci0JICAgIH0KLQkgIGlmIChudW1fYml0cykKLQkgICAgKmxwKysgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIChudW1fYml0cykpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JICAgIHsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotI2lmZGVmIFRDX002OEsKLQkgICAgICAqbHArKyA9IDA7Ci0jZW5kaWYKLQkgICAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtX2JpdHMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3b3JkMSB8PSBuZXh0X2JpdHMgKChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIChleHBvbmVudF9iaXRzICsgbnVtX2JpdHMpKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKGxwIDwgd29yZHNfZW5kKQotCSpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCi0gICAgICAvKiBSb3VuZCB0aGUgbWFudGlzc2EgdXAsIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIG51bWJlciAqLwotICAgICAgaWYgKG5leHRfYml0cyAoMSkpCi0JewotCSAgLS1scDsKLQkgIGlmIChwcmVjX2JpdHMgPj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICB7Ci0JICAgICAgaW50IG4gPSAwOwotCSAgICAgIGludCB0bXBfYml0czsKLQotCSAgICAgIG4gPSAwOwotCSAgICAgIHRtcF9iaXRzID0gcHJlY19iaXRzOwotCSAgICAgIHdoaWxlICh0bXBfYml0cyA+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkJewotCQkgIGlmIChscFtuXSAhPSAoTElUVExFTlVNX1RZUEUpIC0gMSkKLQkJICAgIGJyZWFrOwotCQkgIC0tbjsKLQkJICB0bXBfYml0cyAtPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCX0KLQkgICAgICBpZiAodG1wX2JpdHMgPiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJICB8fCAobHBbbl0gJiBtYXNrW3RtcF9iaXRzXSkgIT0gbWFza1t0bXBfYml0c10KLQkJICB8fCAocHJlY19iaXRzICE9IChwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJCQkgICAgLSBleHBvbmVudF9iaXRzIC0gMSkKLSNpZmRlZiBUQ19JMzg2Ci0JCSAgICAgIC8qIEFuIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdCB3aXRoIG9ubHkgdGhlIGludGVnZXIKLQkJCSBiaXQgc2V0IHdvdWxkIGJlIGludmFsaWQuICBUaGF0IG11c3QgYmUgY29udmVydGVkCi0JCQkgdG8gdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KLQkJICAgICAgJiYgIShwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04KLQkJCSAgICYmIHByZWNfYml0cyA9PSAocHJlY2lzaW9uICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCi0JCQkJCSAgICAtIGV4cG9uZW50X2JpdHMgLSAyKSkKLSNlbmRpZgotCQkgICAgICApKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotCQkgIGZvciAoY2FycnkgPSAxOyBjYXJyeSAmJiAobHAgPj0gd29yZHMpOyBscC0tKQotCQkgICAgewotCQkgICAgICBjYXJyeSA9ICpscCArIGNhcnJ5OwotCQkgICAgICAqbHAgPSBjYXJyeTsKLQkJICAgICAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYW4gb3ZlcmZsb3cgb2YgdGhlIGRlbm9ybWFsIG51bWJlcnMuICBXZQotICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBmb3JnZXQgd2hhdCB3ZSBoYXZlIHByb2R1Y2VkLCBhbmQgaW5zdGVhZAotICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KLQkJICBscCA9IHdvcmRzOwotCQkgIHdvcmQxID0gKChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICcrJykKLQkJCSAgID8gMAotCQkJICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKLQkJICB3b3JkMSB8PSAoMQotCQkJICAgIDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKLQkJCQktIGV4cG9uZW50X2JpdHMpKTsKLQkJICAqbHArKyA9IHdvcmQxOwotI2lmZGVmIFRDX0kzODYKLQkJICAvKiBTZXQgdGhlIGludGVnZXIgYml0IGluIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LgotCQkgICAgIFRoaXMgY2Fubm90IGhhcHBlbiBvbiB0aGUgbTY4ayB3aGVyZSB0aGUgbWFudGlzc2EKLQkJICAgICBqdXN0IG92ZXJmbG93cyBpbnRvIHRoZSBpbnRlZ2VyIGJpdCBhYm92ZS4gICovCi0JCSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQkJICAgICpscCsrID0gMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSk7Ci0jZW5kaWYKLQkJICB3aGlsZSAobHAgPCB3b3Jkc19lbmQpCi0JCSAgICAqbHArKyA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICAqbHAgKz0gMTsKLQl9Ci0KLSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQgbG9uZykgZXhwb25lbnRfNCA+PSBtYXNrW2V4cG9uZW50X2JpdHNdKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBFeHBvbmVudCBvdmVyZmxvdy4gTG9zZSBpbW1lZGlhdGVseS4KLSAgICAgICAqLwotCi0gICAgICAvKgotICAgICAgICogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0gICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotICAgICAgICovCi0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdvcmQxIHw9IChleHBvbmVudF80IDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSBleHBvbmVudF9iaXRzKSkKLQl8IG5leHRfYml0cyAoKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpIC0gZXhwb25lbnRfYml0cyk7Ci0gICAgfQotCi0gICpscCsrID0gd29yZDE7Ci0KLSAgLyogWF9QUkVDSVNJT04gaXMgc3BlY2lhbDogb24gdGhlIDY4aywgaXQgaGFzIDE2IGJpdHMgb2YgemVybyBpbiB0aGUKLSAgICAgbWlkZGxlLiAgRWl0aGVyIHdheSwgaXQgaXMgdGhlbiBmb2xsb3dlZCBieSBhIDEgYml0LiAqLwotICBpZiAoZXhwb25lbnRfYml0cyA9PSAxNSAmJiBwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0gICAgewotI2lmZGVmIFRDX002OEsKLSAgICAgICpscCsrID0gMDsKLSNlbmRpZgotICAgICAgKmxwKysgPSAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKLQkgICAgICAgfCBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKTsKLSAgICB9Ci0KLSAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0gIHdoaWxlIChscCA8IHdvcmRzX2VuZCkKLSAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQotICBpZiAobmV4dF9iaXRzICgxKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotICAgICAgLyoKLSAgICAgICAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLSAgICAgICAqIFRoZSBjdW5uaW5nIGRlc2lnbiBvZiB0aGVzZSBoaWRkZW4tMSBmbG9hdHMgcGVybWl0cwotICAgICAgICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0gICAgICAgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotICAgICAgICogaGlnaGVzdC1vcmRlciBiaXQgb2YgdGhlIGxvd2VzdC1vcmRlciB3b3JkIGZsaXBzLgotICAgICAgICogSXMgdGhhdCBjbGVhcj8KLSAgICAgICAqLwotCi0gICAgICAvKiAjaWYgKHNpemVvZihjYXJyeSkpIDwgKChzaXplb2YoYml0c1swXSkgKiBCSVRTX1BFUl9DSEFSKSArIDIpCi0JIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JIFdlIG5lZWQgdGhhdCBleHRyYSBiaXQgdG8gaG9sZCBhIGNhcnJ5IGR1cmluZyBhIExJVFRMRU5VTSBjYXJyeQotCSBwcm9wYWdhdGlvbi4gQW5vdGhlciBleHRyYSBiaXQgKGtlcHQgMCkgd2lsbCBhc3N1cmUgdXMgdGhhdCB3ZQotCSBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JIHBlcm1pdHMgdXMgdG8gcHJvcGFnYXRlIHRoZSBjYXJyeSB3aXRob3V0IGFueSBtYXNraW5nIG9mIGJpdHMuCi0JICNlbmRpZiAqLwotICAgICAgZm9yIChjYXJyeSA9IDEsIGxwLS07IGNhcnJ5ICYmIChscCA+PSB3b3Jkcyk7IGxwLS0pCi0JewotCSAgY2FycnkgPSAqbHAgKyBjYXJyeTsKLQkgICpscCA9IGNhcnJ5OwotCSAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQl9Ci0gICAgICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JewotCSAgLyogRXh0ZW5kZWQgcHJlY2lzaW9uIG51bWJlcnMgaGF2ZSBhbiBleHBsaWNpdCBpbnRlZ2VyIGJpdAotCSAgICAgdGhhdCB3ZSBtYXkgaGF2ZSB0byByZXN0b3JlLiAgKi8KLQkgIGlmIChscCA9PSB3b3JkcykKLQkgICAgewotI2lmZGVmIFRDX002OEsKLQkgICAgICAvKiBPbiB0aGUgbTY4ayB0aGVyZSBpcyBhIGdhcCBvZiAxNiBiaXRzLiAgV2UgbXVzdAotCQkgZXhwbGljaXRseSBwcm9wYWdhdGUgdGhlIGNhcnJ5IGludG8gdGhlIGV4cG9uZW50LiAqLwotCSAgICAgIHdvcmRzWzBdICs9IHdvcmRzWzFdOwotCSAgICAgIHdvcmRzWzFdID0gMDsKLQkgICAgICBscCsrOwotI2VuZGlmCi0JICAgICAgLyogUHV0IGJhY2sgdGhlIGludGVnZXIgYml0LiAgKi8gCi0JICAgICAgbHBbMV0gfD0gMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSk7Ci0JICAgIH0KLSAJfQotICAgICAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCXsKLQkgIC8qIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkgICAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotCSAgICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLQkgICAqLwotCSAgKndvcmRzICY9IH4oMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpOwotCSAgLyogbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOyAqLwotCSAgLyogcmV0dXJuIHJldHVybl92YWx1ZTsgKi8KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLSNpZiAwIC8qIHVudXNlZCAqLwotLyogVGhpcyByb3V0aW5lIGlzIGEgcmVhbCBrbHVkZ2UuICBTb21lb25lIHJlYWxseSBzaG91bGQgZG8gaXQgYmV0dGVyLAotICAgYnV0IEknbSB0b28gbGF6eSwgYW5kIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIHN0dWZmIGFsbCB0b28gd2VsbAotICAgYW55d2F5LiAoSkYpICAqLwotc3RhdGljIHZvaWQKLWludF90b19nZW4gKHgpCi0gICAgIGxvbmcgeDsKLXsKLSAgY2hhciBidWZbMjBdOwotICBjaGFyICpidWZwOwotCi0gIHNwcmludGYgKGJ1ZiwgIiVsZCIsIHgpOwotICBidWZwID0gJmJ1ZlswXTsKLSAgaWYgKGF0b2ZfZ2VuZXJpYyAoJmJ1ZnAsICIuIiwgRVhQX0NIQVJTLCAmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpKQotICAgIGFzX2JhZCAoXygiRXJyb3IgY29udmVydGluZyBudW1iZXIgdG8gZmxvYXRpbmcgcG9pbnQgKEV4cG9uZW50IG92ZXJmbG93PykiKSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFRFU1QKLWNoYXIgKgotcHJpbnRfZ2VuIChnZW4pCi0gICAgIEZMT05VTV9UWVBFICpnZW47Ci17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGFyclsxMF07Ci0gIGRvdWJsZSBkdjsKLSAgZmxvYXQgZnY7Ci0gIHN0YXRpYyBjaGFyIHNidWZbNDBdOwotCi0gIGlmIChnZW4pCi0gICAgewotICAgICAgZiA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotICAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPSAqZ2VuOwotICAgIH0KLSAgZ2VuX3RvX3dvcmRzICgmYXJyWzBdLCA0LCAxMSk7Ci0gIG1lbWNweSAoJmR2LCAmYXJyWzBdLCBzaXplb2YgKGRvdWJsZSkpOwotICBzcHJpbnRmIChzYnVmLCAiJXggJXggJXggJXggJS4xNEcgICAiLCBhcnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sIGR2KTsKLSAgZ2VuX3RvX3dvcmRzICgmYXJyWzBdLCAyLCA4KTsKLSAgbWVtY3B5ICgmZnYsICZhcnJbMF0sIHNpemVvZiAoZmxvYXQpKTsKLSAgc3ByaW50ZiAoc2J1ZiArIHN0cmxlbiAoc2J1ZiksICIleCAleCAlLjEyZ1xuIiwgYXJyWzBdLCBhcnJbMV0sIGZ2KTsKLQotICBpZiAoZ2VuKQotICAgIHsKLSAgICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gZjsKLSAgICB9Ci0KLSAgcmV0dXJuIChzYnVmKTsKLX0KLQotI2VuZGlmCi0KLS8qIGVuZCBvZiBhdG9mLWllZWUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLXRhaG9lLmMgYi9nYXMvY29uZmlnL2F0b2YtdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwNDg1Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2F0b2YtdGFob2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0KLS8qIGF0b2ZfdGFob2UuYyAtIHR1cm4gYSBzdHJpbmcgaW50byBhIFRhaG9lIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgKi8KLQotLyogVGhpcyBpcyByZWFsbHkgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgYXRvZl92YXguYy4gSSBnbG9tbWVkIGl0IHdob2xlc2FsZQotICAgYW5kIHRoZW4gc2hhdmVkIGl0IGRvd24uIEkgZG9uJ3QgZXZlbiBrbm93IGhvdyBpdCB3b3Jrcy4gKERvbid0IHlvdSBmaW5kCi0gICBteSBob25lc3R5IHJlZnJlc2hpbmc/ICBib3dlbkBjcy5CdWZmYWxvLkVEVSAoRGV2b24gRSBCb3dlbikKLQotICAgSSBkb24ndCBhbGxvdyB1cHBlcmNhc2UgbGV0dGVycyBpbiB0aGUgcHJlY2lzaW9uIGRlc2NycGl0b3JzLiBJZSAnZicgYW5kCi0gICAnZCcgYXJlIGFsbG93ZWQgYnV0ICdGJyBhbmQgJ0QnIGFyZW4ndCAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogUHJlY2lzaW9uIGluIExpdHRsZU51bXMuICovCi0jZGVmaW5lIE1BWF9QUkVDSVNJT04gKDQpCi0jZGVmaW5lIERfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBGX1BSRUNJU0lPTiAoMikKLQotLyogUHJlY2lzaW9uIGluIGNoYXJzLiAqLwotI2RlZmluZSBEX1BSRUNJU0lPTl9DSEFSUyAoOCkKLSNkZWZpbmUgRl9QUkVDSVNJT05fQ0hBUlMgKDQpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1zdGF0aWMgY29uc3QgbG9uZyBpbnQgbWFza1tdID0KLXsKLSAgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwMSwKLSAgMHgwMDAwMDAwMywKLSAgMHgwMDAwMDAwNywKLSAgMHgwMDAwMDAwZiwKLSAgMHgwMDAwMDAxZiwKLSAgMHgwMDAwMDAzZiwKLSAgMHgwMDAwMDA3ZiwKLSAgMHgwMDAwMDBmZiwKLSAgMHgwMDAwMDFmZiwKLSAgMHgwMDAwMDNmZiwKLSAgMHgwMDAwMDdmZiwKLSAgMHgwMDAwMGZmZiwKLSAgMHgwMDAwMWZmZiwKLSAgMHgwMDAwM2ZmZiwKLSAgMHgwMDAwN2ZmZiwKLSAgMHgwMDAwZmZmZiwKLSAgMHgwMDAxZmZmZiwKLSAgMHgwMDAzZmZmZiwKLSAgMHgwMDA3ZmZmZiwKLSAgMHgwMDBmZmZmZiwKLSAgMHgwMDFmZmZmZiwKLSAgMHgwMDNmZmZmZiwKLSAgMHgwMDdmZmZmZiwKLSAgMHgwMGZmZmZmZiwKLSAgMHgwMWZmZmZmZiwKLSAgMHgwM2ZmZmZmZiwKLSAgMHgwN2ZmZmZmZiwKLSAgMHgwZmZmZmZmZiwKLSAgMHgxZmZmZmZmZiwKLSAgMHgzZmZmZmZmZiwKLSAgMHg3ZmZmZmZmZiwKLSAgMHhmZmZmZmZmZgotfTsKLQwKLQotLyogU2hhcmVkIGJldHdlZW4gZmxvbnVtX2dlbjJ0YWhvZSBhbmQgbmV4dF9iaXRzICovCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOwotCi0jaWYgX19TVERDX18gPT0gMQotCi1pbnQgZmxvbnVtX2dlbjJ0YWhvZSAoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwgTElUVExFTlVNX1RZUEUgKiB3b3Jkcyk7Ci0KLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotCi1pbnQgZmxvbnVtX2dlbjJ0YWhvZSAoKTsKLQotI2VuZGlmIC8qIG5vdCBfX1NURENfXyAqLwotCi0KLXN0YXRpYyBpbnQKLW5leHRfYml0cyAobnVtYmVyX29mX2JpdHMpCi0gICAgIGludCBudW1iZXJfb2ZfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsKLQotICBpZiAobGl0dGxlbnVtX3BvaW50ZXIgPCBsaXR0bGVudW1fZW5kKQotICAgIHJldHVybiAwOwotICBpZiAobnVtYmVyX29mX2JpdHMgPj0gYml0c19sZWZ0X2luX2xpdHRsZW51bSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW2JpdHNfbGVmdF9pbl9saXR0bGVudW1dICYgKmxpdHRsZW51bV9wb2ludGVyOwotICAgICAgbnVtYmVyX29mX2JpdHMgLT0gYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLSAgICAgIHJldHVybl92YWx1ZSA8PD0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBsaXR0bGVudW1fcG9pbnRlci0tOwotICAgICAgaWYgKGxpdHRsZW51bV9wb2ludGVyID49IGxpdHRsZW51bV9lbmQpCi0JcmV0dXJuX3ZhbHVlIHw9ICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiAoYml0c19sZWZ0X2luX2xpdHRsZW51bSkpICYKLQkgIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmCi0JKCgqbGl0dGxlbnVtX3BvaW50ZXIpID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsKLXsKLSAgKndvcmRzID0gMHg4MDAwOwkJLyogRmxvYXRpbmcgUmVzZXJ2ZWQgT3BlcmFuZCBDb2RlICovCi19Ci0MCi1zdGF0aWMgaW50CQkJLyogMCBtZWFucyBsZXR0ZXIgaXMgT0suICovCi13aGF0X2tpbmRfb2ZfZmxvYXQgKGxldHRlciwgcHJlY2lzaW9uUCwgZXhwb25lbnRfYml0c1ApCi0gICAgIGNoYXIgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KLSAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCi0gICAgIGxvbmcgaW50ICpleHBvbmVudF9iaXRzUDsJLyogTnVtYmVyIG9mIGV4cG9uZW50IGJpdHMuICovCi17Ci0gIGludCByZXR2YWw7CQkJLyogMDogT0suICovCi0KLSAgcmV0dmFsID0gMDsKLSAgc3dpdGNoIChsZXR0ZXIpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgKnByZWNpc2lvblAgPSBGX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgKnByZWNpc2lvblAgPSBEX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR2YWwgPSA2OTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKgkJCQkJCQkJCSoKLSoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgotKgl3aGF0IHRoZSBWQVggdGhpbmtzIGluLiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZpZ3VyZQkqCi0qCW91dCBhbnkgYWxpZ25tZW50IHByb2JsZW1zIGFuZCB0byBjb25zcGlyZSBmb3IgdGhlIGJ5dGVzL3dvcmQJKgotKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCi0qCQkJCQkJCQkJKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotYXRvZl90YWhvZSAoc3RyLCB3aGF0X2tpbmQsIHdvcmRzKQotICAgICBjaGFyICpzdHI7CQkJLyogVGV4dCB0byBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KLSAgICAgY2hhciB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KLSAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCi0gIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgbG9uZyBpbnQgZXhwb25lbnRfYml0czsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGYubG93ID0gYml0cyArIE1BWF9QUkVDSVNJT047Ci0gIGYuaGlnaCA9IE5VTEw7Ci0gIGYubGVhZGVyID0gTlVMTDsKLSAgZi5leHBvbmVudCA9IE5VTEw7Ci0gIGYuc2lnbiA9ICdcMCc7Ci0KLSAgaWYgKHdoYXRfa2luZF9vZl9mbG9hdCAod2hhdF9raW5kLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cykpCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogV2UgbG9zdC4gKi8KLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICB9Ci0gIGlmIChyZXR1cm5fdmFsdWUpCi0gICAgewotICAgICAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gICAgICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgKi8KLSAgICAgIC8qIG5lY2Vzc2FyeTogdGhlIGhpZ2hlc3QgZmxvbnVtIG1heSBoYXZlICovCi0gICAgICAvKiAxNSBsZWFkaW5nIDAgYml0cywgc28gY291bGQgYmUgdXNlbGVzcy4gKi8KLSAgICAgIGYuaGlnaCA9IGYubG93ICsgcHJlY2lzaW9uIC0gMSArIEdVQVJEOwotCi0gICAgICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsICJlRSIsICZmKSkKLQl7Ci0JICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiB3ZSBsb3N0ICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmbG9udW1fZ2VuMnRhaG9lICh3aGF0X2tpbmQsICZmLCB3b3JkcykpCi0JICAgIHsKLQkgICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotDAotLyoKLSAqIEluOiBhIGZsb251bSwgYSBUYWhvZSBmbG9hdGluZyBwb2ludCBmb3JtYXQuCi0gKiBPdXQ6IGEgVGFob2UgZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCi0gKi8KLQotaW50CQkJCS8qIDA6IE9LLiAqLwotZmxvbnVtX2dlbjJ0YWhvZSAoZm9ybWF0X2xldHRlciwgZiwgd29yZHMpCi0gICAgIGNoYXIgZm9ybWF0X2xldHRlcjsJLyogT25lIG9mICdkJyAnZicuICovCi0gICAgIEZMT05VTV9UWVBFICpmOwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCi17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBpbnQgZXhwb25lbnRfYml0czsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgPT0gT0suICovCi0KLSAgcmV0dXJuX3ZhbHVlID0gd2hhdF9raW5kX29mX2Zsb2F0IChmb3JtYXRfbGV0dGVyLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cyk7Ci0gIGlmIChyZXR1cm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGYtPmxvdyA+IGYtPmxlYWRlcikKLQl7Ci0JICAvKiAwLjBlMCBzZWVuLiAqLwotCSAgbWVtc2V0ICh3b3JkcywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBwcmVjaXNpb24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGludCBleHBvbmVudF8xOwotCSAgbG9uZyBpbnQgZXhwb25lbnRfMjsKLQkgIGxvbmcgaW50IGV4cG9uZW50XzM7Ci0JICBsb25nIGludCBleHBvbmVudF80OwotCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotCSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0KLQkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLwotCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQotCSAgICB7Ci0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBBbGwgdGFob2UgZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyBoYXZlOgotCSAgICogQml0IDE1IGlzIHNpZ24gYml0LgotCSAgICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0JICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0JICAgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotCSAgICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCi0JICAgKgotCSAgICogU28gd2UgbmVlZDogbnVtYmVyIG9mIGJpdHMgb2YgZXhwb25lbnQsIG51bWJlciBvZiBiaXRzIG9mCi0JICAgKiBtYW50aXNzYS4KLQkgICAqLwotCi0JICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgbGl0dGxlbnVtX3BvaW50ZXIgPSBmLT5sZWFkZXI7Ci0JICBsaXR0bGVudW1fZW5kID0gZi0+bG93OwotCSAgLyogU2VlayAoYW5kIGZvcmdldCkgMXN0IHNpZ25pZmljYW50IGJpdCAqLwotCSAgZm9yIChleHBvbmVudF9za2lwcGFnZSA9IDA7Ci0JICAgICAgICFuZXh0X2JpdHMgKDEpOwotCSAgICAgICBleHBvbmVudF9za2lwcGFnZSsrKQotCSAgICB7Ci0JICAgIH0KLQkgIGV4cG9uZW50XzEgPSBmLT5leHBvbmVudCArIGYtPmxlYWRlciArIDEgLSBmLT5sb3c7Ci0JICAvKiBSYWRpeCBMSVRUTEVOVU1fUkFESVgsIHBvaW50IGp1c3QgaGlnaGVyIHRoYW4gZiAtPiBsZWFkZXIuICovCi0JICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIC8qIFJhZGl4IDIuICovCi0JICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKLQkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0JICAgICAgICovCi0KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0KLQkgICAgICAvKgotCSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkgICAgICAgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkgICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCSAgICAgICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBscCA9IHdvcmRzOwotCi0JICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0JICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotCSAgICAgIHdvcmQxID0gKChleHBvbmVudF80ICYgbWFza1tleHBvbmVudF9iaXRzXSkgPDwgKDE1IC0gZXhwb25lbnRfYml0cykpCi0JCXwgKChmLT5zaWduID09ICcrJykgPyAwIDogMHg4MDAwKQotCQl8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCi0JICAgICAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0JICAgICAgZm9yICg7IGxwIDwgd29yZHMgKyBwcmVjaXNpb247IGxwKyspCi0JCXsKLQkJICAqbHAgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0JCX0KLQotCSAgICAgIGlmIChuZXh0X2JpdHMgKDEpKQotCQl7Ci0JCSAgLyoKLQkJICAgKiBTaW5jZSB0aGUgTkVYVCBiaXQgaXMgYSAxLCByb3VuZCBVUCB0aGUgbWFudGlzc2EuCi0JCSAgICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0JCSAgICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0JCSAgICogaXQgJ2RvZXMgdGhlIHJpZ2h0IHRoaW5nJy4gSG93ZXZlciwgd2UgbG9zZSBpZiB0aGUKLQkJICAgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0JCSAgICogSXMgdGhhdCBjbGVhcj8KLQkJICAgKi8KLQotCQkgIHVuc2lnbmVkIGxvbmcgaW50IGNhcnJ5OwotCi0JCSAgLyoKLQkJICAgICNpZiAoc2l6ZW9mKGNhcnJ5KSkgPCAoKHNpemVvZihiaXRzWzBdKSAqIEJJVFNfUEVSX0NIQVIpICsgMikKLQkJICAgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JCSAgICBXZSBuZWVkIHRoYXQgZXh0cmEgYml0IHRvIGhvbGQgYSBjYXJyeSBkdXJpbmcgYSBMSVRUTEVOVU0gY2FycnkKLQkJICAgIHByb3BhZ2F0aW9uLiBBbm90aGVyIGV4dHJhIGJpdCAoa2VwdCAwKSB3aWxsIGFzc3VyZSB1cyB0aGF0IHdlCi0JCSAgICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JCSAgICBwZXJtaXRzIHVzIHRvIHByb3BhZ2F0ZSB0aGUgY2Fycnkgd2l0aG91dCBhbnkgbWFza2luZyBvZiBiaXRzLgotCQkgICAgI2VuZGlmCi0JCSAgICAqLwotCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOwotCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKLQkJICAgICAgIGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCi0JCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCQkgICAgewotCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0JCSAgICAgICAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCSAgICAgICAqLwotCQkgICAgfQotCQl9CQkvKiBpZiAod2UgbmVlZGVkIHRvIHJvdW5kIHVwKSAqLwotCSAgICB9CQkJLyogaWYgKGV4cG9uZW50IG92ZXJmbG93KSAqLwotCX0JCQkvKiBpZiAoMC4wZTApICovCi0gICAgfQkJCQkvKiBpZiAoZmxvYXRfdHlwZSB3YXMgT0spICovCi0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQwKLS8qCi0gKgkJbWRfYXRvZigpCi0gKgotICogSW46CWlucHV0X2xpbmVfcG9pbnRlciAtPiB0aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50Ci0gKgkJbnVtYmVyLgotICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQotICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlciAtPiBvZiBuZXh0IGNoYXIgYWZ0ZXIgZmxvYXRpbmcgbnVtYmVyLgotICoJRXJyb3IgbWVzc2FnZSwgb3IgMC4KLSAqCUZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKglOdW1iZXIgb2YgY2hhcnMgd2UgdXNlZCBmb3IgdGhlIGxpdGVyYWwuCi0gKi8KLQotY2hhciAqCi1tZF9hdG9mICh3aGF0X3N0YXRlbWVudF90eXBlLCBsaXRlcmFsUCwgc2l6ZVApCi0gICAgIGNoYXIgd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgY2hhciAqbGl0ZXJhbFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9QUkVDSVNJT05dOwotICByZWdpc3RlciBjaGFyIGtpbmRfb2ZfZmxvYXQ7Ci0gIHJlZ2lzdGVyIGludCBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLQotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KLSAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfTsKLQotICBpZiAoa2luZF9vZl9mbG9hdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGltaXQ7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGF0b2ZfdGFob2UgKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCQkgICAgICAga2luZF9vZl9mbG9hdCwKLQkJCQkgICAgICAgd29yZHMpOwotICAgICAgLyoKLSAgICAgICAqIFRoZSBhdG9mX3RhaG9lKCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgotICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KLSAgICAgICAqIGEgZGlmZmVyZW50LWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKLSAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCi0gICAgICAgKi8KLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IChraW5kX29mX2Zsb2F0ID09ICdmJyA/IEZfUFJFQ0lTSU9OX0NIQVJTIDoKLQkJCSAoa2luZF9vZl9mbG9hdCA9PSAnZCcgPyBEX1BSRUNJU0lPTl9DSEFSUyA6IDApKTsKLSAgICAgIGtub3cgKG51bWJlcl9vZl9jaGFycyA8PSBNQVhfUFJFQ0lTSU9OICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGltaXQgPSB3b3JkcyArIChudW1iZXJfb2ZfY2hhcnMgLyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBmb3IgKGxpdHRsZW51bV9wb2ludGVyID0gd29yZHM7Ci0JICAgbGl0dGxlbnVtX3BvaW50ZXIgPCBsaW1pdDsKLQkgICBsaXR0bGVudW1fcG9pbnRlcisrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1fcG9pbnRlciwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdGVyYWxQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnVtYmVyX29mX2NoYXJzID0gMDsKLSAgICB9OwotCi0gICpzaXplUCA9IG51bWJlcl9vZl9jaGFyczsKLSAgcmV0dXJuIGtpbmRfb2ZfZmxvYXQgPyAwIDogXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci19Ci0KLS8qIGF0b2ZfdGFob2UuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLXZheC5jIGIvZ2FzL2NvbmZpZy9hdG9mLXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmZmMDc4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvYXRvZi12YXguYworKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKiBhdG9mX3ZheC5jIC0gdHVybiBhIEZsb251bSBpbnRvIGEgVkFYIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi1zdGF0aWMgaW50IGF0b2ZfdmF4X3NpemVvZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgbmV4dF9iaXRzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqKSk7Ci1zdGF0aWMgaW50IHdoYXRfa2luZF9vZl9mbG9hdCBQQVJBTVMgKChpbnQsIGludCAqLCBsb25nICopKTsKLXN0YXRpYyBjaGFyICphdG9mX3ZheCBQQVJBTVMgKChjaGFyICosIGludCwgTElUVExFTlVNX1RZUEUgKikpOwotCi0vKiBQcmVjaXNpb24gaW4gTGl0dGxlTnVtcy4gKi8KLSNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoOCkKLSNkZWZpbmUgSF9QUkVDSVNJT04gKDgpCi0jZGVmaW5lIEdfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1pbnQgZmxvbnVtX2dlbjJ2YXggUEFSQU1TICgoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKLQkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7Ci0KLS8qIE51bWJlciBvZiBjaGFycyBpbiBmbG9udW0gdHlwZSAnbGV0dGVyJy4gKi8KLXN0YXRpYyBpbnQKLWF0b2ZfdmF4X3NpemVvZiAobGV0dGVyKQotICAgICBpbnQgbGV0dGVyOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwotCi0gIC8qCi0gICAqIFBlcm1pdHRpbmcgdXBwZXJjYXNlIGxldHRlcnMgaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4KLSAgICogUGxlYXNlIHVzZSBvbmx5IGxvd2VyLWNhc2VkIGxldHRlcnMgaW4gY2FzZSB0aGUgdXBwZXItY2FzZWQKLSAgICogb25lcyBiZWNvbWUgdW5zdXBwb3J0ZWQhCi0gICAqLwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICByZXR1cm5fdmFsdWUgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdnJzoKLSAgICBjYXNlICdHJzoKLSAgICAgIHJldHVybl92YWx1ZSA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgIGNhc2UgJ0gnOgotICAgICAgcmV0dXJuX3ZhbHVlID0gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm5fdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGF0b2ZfdmF4X3NpemVvZiAqLwotCi1zdGF0aWMgY29uc3QgbG9uZyBtYXNrW10gPQotewotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDAxLAotICAweDAwMDAwMDAzLAotICAweDAwMDAwMDA3LAotICAweDAwMDAwMDBmLAotICAweDAwMDAwMDFmLAotICAweDAwMDAwMDNmLAotICAweDAwMDAwMDdmLAotICAweDAwMDAwMGZmLAotICAweDAwMDAwMWZmLAotICAweDAwMDAwM2ZmLAotICAweDAwMDAwN2ZmLAotICAweDAwMDAwZmZmLAotICAweDAwMDAxZmZmLAotICAweDAwMDAzZmZmLAotICAweDAwMDA3ZmZmLAotICAweDAwMDBmZmZmLAotICAweDAwMDFmZmZmLAotICAweDAwMDNmZmZmLAotICAweDAwMDdmZmZmLAotICAweDAwMGZmZmZmLAotICAweDAwMWZmZmZmLAotICAweDAwM2ZmZmZmLAotICAweDAwN2ZmZmZmLAotICAweDAwZmZmZmZmLAotICAweDAxZmZmZmZmLAotICAweDAzZmZmZmZmLAotICAweDA3ZmZmZmZmLAotICAweDBmZmZmZmZmLAotICAweDFmZmZmZmZmLAotICAweDNmZmZmZmZmLAotICAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmCi19OwotDAotCi0vKiBTaGFyZWQgYmV0d2VlbiBmbG9udW1fZ2VuMnZheCBhbmQgbmV4dF9iaXRzICovCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOwotCi1zdGF0aWMgaW50Ci1uZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQotICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Ci17Ci0gIGludCByZXR1cm5fdmFsdWU7Ci0KLSAgaWYgKGxpdHRsZW51bV9wb2ludGVyIDwgbGl0dGxlbnVtX2VuZCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci0gICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOwotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOwotICAgICAgbGl0dGxlbnVtX3BvaW50ZXItLTsKLSAgICAgIGlmIChsaXR0bGVudW1fcG9pbnRlciA+PSBsaXR0bGVudW1fZW5kKQotCXJldHVybl92YWx1ZSB8PSAoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gKGJpdHNfbGVmdF9pbl9saXR0bGVudW0pKSAmIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci17Ci0gICp3b3JkcyA9IDB4ODAwMDsJCS8qIEZsb2F0aW5nIFJlc2VydmVkIE9wZXJhbmQgQ29kZSAqLwotfQotDAotc3RhdGljIGludAkJCS8qIDAgbWVhbnMgbGV0dGVyIGlzIE9LLiAqLwotd2hhdF9raW5kX29mX2Zsb2F0IChsZXR0ZXIsIHByZWNpc2lvblAsIGV4cG9uZW50X2JpdHNQKQotICAgICBpbnQgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KLSAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCi0gICAgIGxvbmcgKmV4cG9uZW50X2JpdHNQOwkvKiBOdW1iZXIgb2YgZXhwb25lbnQgYml0cy4gKi8KLXsKLSAgaW50IHJldHZhbDsJCQkvKiAwOiBPSy4gKi8KLQotICByZXR2YWwgPSAwOwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEZfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IERfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEdfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgKnByZWNpc2lvblAgPSBIX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDE1OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dmFsID0gNjk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgotICoJd2hhdCB0aGUgVkFYIHRoaW5rcyBpbi4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmaWd1cmUJKgotICoJb3V0IGFueSBhbGlnbm1lbnQgcHJvYmxlbXMgYW5kIHRvIGNvbnNwaXJlIGZvciB0aGUgYnl0ZXMvd29yZAkqCi0gKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotYXRvZl92YXggKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKLSAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCi0gICAgIGludCB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KLSAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCi0gIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgbG9uZyBleHBvbmVudF9iaXRzOwotCi0gIHJldHVybl92YWx1ZSA9IHN0cjsKLSAgZi5sb3cgPSBiaXRzICsgTUFYX1BSRUNJU0lPTjsKLSAgZi5oaWdoID0gTlVMTDsKLSAgZi5sZWFkZXIgPSBOVUxMOwotICBmLmV4cG9uZW50ID0gMDsKLSAgZi5zaWduID0gJ1wwJzsKLQotICBpZiAod2hhdF9raW5kX29mX2Zsb2F0ICh3aGF0X2tpbmQsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiBXZSBsb3N0LiAqLwotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLQotICBpZiAocmV0dXJuX3ZhbHVlKQotICAgIHsKLSAgICAgIG1lbXNldCAoYml0cywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBNQVhfUFJFQ0lTSU9OKTsKLQotICAgICAgLyogVXNlIG1vcmUgTGl0dGxlTnVtcyB0aGFuIHNlZW1zICovCi0gICAgICAvKiBuZWNlc3Nhcnk6IHRoZSBoaWdoZXN0IGZsb251bSBtYXkgaGF2ZSAqLwotICAgICAgLyogMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0gICAgICBmLmhpZ2ggPSBmLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICAgICAgaWYgKGF0b2ZfZ2VuZXJpYyAoJnJldHVybl92YWx1ZSwgIi4iLCAiZUUiLCAmZikpCi0JewotCSAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogd2UgbG9zdCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZmxvbnVtX2dlbjJ2YXggKHdoYXRfa2luZCwgJmYsIHdvcmRzKSkKLQkgICAgewotCSAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGF0b2ZfdmF4KCkgKi8KLQwKLS8qCi0gKiBJbjogYSBmbG9udW0sIGEgdmF4IGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KLSAqIE91dDogYSB2YXggZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCi0gKi8KLQotaW50CQkJCS8qIDA6IE9LLiAqLwotZmxvbnVtX2dlbjJ2YXggKGZvcm1hdF9sZXR0ZXIsIGYsIHdvcmRzKQotICAgICBpbnQgZm9ybWF0X2xldHRlcjsJCS8qIE9uZSBvZiAnZCcgJ2YnICdnJyAnaCcuICovCi0gICAgIEZMT05VTV9UWVBFICpmOwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCi17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBleHBvbmVudF9iaXRzOwotICBpbnQgcmV0dXJuX3ZhbHVlOwkJLyogMCA9PSBPSy4gKi8KLQotICByZXR1cm5fdmFsdWUgPSB3aGF0X2tpbmRfb2ZfZmxvYXQgKGZvcm1hdF9sZXR0ZXIsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKTsKLQotICBpZiAocmV0dXJuX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmLT5sb3cgPiBmLT5sZWFkZXIpCi0JewotCSAgLyogMC4wZTAgc2Vlbi4gKi8KLQkgIG1lbXNldCAod29yZHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogcHJlY2lzaW9uKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBleHBvbmVudF8xOwotCSAgbG9uZyBleHBvbmVudF8yOwotCSAgbG9uZyBleHBvbmVudF8zOwotCSAgbG9uZyBleHBvbmVudF80OwotCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotCSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0KLQkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLwotCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQotCSAgICB7Ci0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0JICAgIH0KLQkgIC8qCi0JCQkgKiBBbGwgdmF4ZW4gZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyAoc28gZmFyKSBoYXZlOgotCQkJICogQml0IDE1IGlzIHNpZ24gYml0LgotCQkJICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0JCQkgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0JCQkgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotCQkJICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCi0JCQkgKgotCQkJICogQWxsIHRoaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGEgS0YxMT8/IChXaGljaCBpcyBzdGlsbCBmYXN0ZXIKLQkJCSAqIHRoYW4gbG90cyBvZiB2YXhlbiBJIGNhbiB0aGluayBvZiwgYnV0IGl0IGFsc28gaGFzIGhpZ2hlcgotCQkJICogbWFpbnRlbmFuY2UgY29zdHMgLi4uIHNpZ2gpLgotCQkJICoKLQkJCSAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotCQkJICogbWFudGlzc2EuCi0JCQkgKi8KLQotI2lmZGVmIE5FVkVSCQkJLyoqKioqKiogVGhpcyB6ZXJvaW5nIHNlZW1zIHJlZHVuZGFudCAtIERlYW4gM21heTg2ICoqKioqKioqKiovCi0JICAvKgotCQkJICogTm8gbWF0dGVyIGhvdyBmZXcgYml0cyB3ZSBnb3QgYmFjayBmcm9tIHRoZSBhdG9mKCkKLQkJCSAqIHJvdXRpbmUsIGFkZCBlbm91Z2ggemVybyBsaXR0bGVudW1zIHNvIHRoZSByZXN0IG9mIHRoZQotCQkJICogY29kZSB3b24ndCBydW4gb3V0IG9mICJzaWduaWZpY2FudCIgYml0cyBpbiB0aGUgbWFudGlzc2EuCi0JCQkgKi8KLQkgIHsKLQkgICAgTElUVExFTlVNX1RZUEUgKmx0cDsKLQkgICAgZm9yIChsdHAgPSBmLT5sZWFkZXIgKyAxOwotCQkgbHRwIDw9IGYtPmxvdyArIHByZWNpc2lvbjsKLQkJIGx0cCsrKQotCSAgICAgIHsKLQkJKmx0cCA9IDA7Ci0JICAgICAgfQotCSAgfQotI2VuZGlmCi0KLQkgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICBsaXR0bGVudW1fcG9pbnRlciA9IGYtPmxlYWRlcjsKLQkgIGxpdHRsZW51bV9lbmQgPSBmLT5sb3c7Ci0JICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0JICBmb3IgKGV4cG9uZW50X3NraXBwYWdlID0gMDsKLQkgICAgICAgIW5leHRfYml0cyAoMSk7Ci0JICAgICAgIGV4cG9uZW50X3NraXBwYWdlKyspOzsKLQotCSAgZXhwb25lbnRfMSA9IGYtPmV4cG9uZW50ICsgZi0+bGVhZGVyICsgMSAtIGYtPmxvdzsKLQkgIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbiBmLT5sZWFkZXIuICovCi0JICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIC8qIFJhZGl4IDIuICovCi0JICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKLQkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKLQkgICAgewotCSAgICAgIC8qCi0JCQkJICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0JCQkJICovCi0KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0KLQkgICAgICAvKgotCQkJCSAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJCQkgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCQkJCSAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBscCA9IHdvcmRzOwotCi0JICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0JICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotCSAgICAgIHdvcmQxID0gKCgoZXhwb25lbnRfNCAmIG1hc2tbZXhwb25lbnRfYml0c10pIDw8ICgxNSAtIGV4cG9uZW50X2JpdHMpKQotCQkgICAgICAgfCAoKGYtPnNpZ24gPT0gJysnKSA/IDAgOiAweDgwMDApCi0JCSAgICAgICB8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKSk7Ci0JICAgICAgKmxwKysgPSB3b3JkMTsKLQotCSAgICAgIC8qIFRoZSByZXN0IG9mIHRoZSB3b3JkcyBhcmUganVzdCBtYW50aXNzYSBiaXRzLiAqLwotCSAgICAgIGZvciAoOyBscCA8IHdvcmRzICsgcHJlY2lzaW9uOyBscCsrKQotCQl7Ci0JCSAgKmxwID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCQl9Ci0KLQkgICAgICBpZiAobmV4dF9iaXRzICgxKSkKLQkJewotCQkgIC8qCi0JCQkJCSAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLQkJCQkJICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0JCQkJCSAqIHVzIHRvIGxldCB0aGUgbWFudGlzc2Egb3ZlcmZsb3cgaW50byB0aGUgZXhwb25lbnQsIGFuZAotCQkJCQkgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotCQkJCQkgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0JCQkJCSAqIElzIHRoYXQgY2xlYXI/Ci0JCQkJCSAqLwotCi0JCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotCQkgIC8qCi0JCQkJCSAgI2lmIChzaXplb2YoY2FycnkpKSA8ICgoc2l6ZW9mKGJpdHNbMF0pICogQklUU19QRVJfQ0hBUikgKyAyKQotCQkJCQkgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JCQkJCSAgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5Ci0JCQkJCSAgcHJvcGFnYXRpb24uIEFub3RoZXIgZXh0cmEgYml0IChrZXB0IDApIHdpbGwgYXNzdXJlIHVzIHRoYXQgd2UKLQkJCQkJICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JCQkJCSAgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KLQkJCQkJICAjZW5kaWYKLQkJCQkJICAqLwotCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOwotCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKLQkJICAgICAgIGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCi0JCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCQkgICAgewotCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JCSAgICAgIC8qCi0JCQkJCQkgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0JCQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJCQkJCSAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCQkJCQkgKi8KLQkJICAgIH0KLQkJfQkJLyogaWYgKHdlIG5lZWRlZCB0byByb3VuZCB1cCkgKi8KLQkgICAgfQkJCS8qIGlmIChleHBvbmVudCBvdmVyZmxvdykgKi8KLQl9CQkJLyogaWYgKDAuMGUwKSAqLwotICAgIH0JCQkJLyogaWYgKGZsb2F0X3R5cGUgd2FzIE9LKSAqLwotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGZsb251bV9nZW4ydmF4KCkgKi8KLQotCi0vKiBKRiB0aGlzIHVzZWQgdG8gYmUgaW4gdmF4LmMgYnV0IHRoaXMgbG9va3MgbGlrZSBhIGJldHRlciBwbGFjZSBmb3IgaXQgKi8KLQotLyoKLSAqCQltZF9hdG9mKCkKLSAqCi0gKiBJbjoJaW5wdXRfbGluZV9wb2ludGVyLT50aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50Ci0gKgkJbnVtYmVyLgotICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQotICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+b2YgbmV4dCBjaGFyIGFmdGVyIGZsb2F0aW5nIG51bWJlci4KLSAqCUVycm9yIG1lc3NhZ2UsIG9yIDAuCi0gKglGbG9hdGluZyBwb2ludCBsaXRlcmFsLgotICoJTnVtYmVyIG9mIGNoYXJzIHdlIHVzZWQgZm9yIHRoZSBsaXRlcmFsLgotICovCi0KLSNkZWZpbmUgTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAoOCkJLyogRm9yIC5oZmxvYXRzLiAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHdoYXRfc3RhdGVtZW50X3R5cGUsIGxpdGVyYWxQLCBzaXplUCkKLSAgICAgaW50IHdoYXRfc3RhdGVtZW50X3R5cGU7Ci0gICAgIGNoYXIgKmxpdGVyYWxQOwotICAgICBpbnQgKnNpemVQOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhJTVVNX05VTUJFUl9PRl9MSVRUTEVOVU1TXTsKLSAgcmVnaXN0ZXIgY2hhciBraW5kX29mX2Zsb2F0OwotICByZWdpc3RlciBpbnQgbnVtYmVyX29mX2NoYXJzOwotICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtUDsKLQotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ0YnOgkJCS8qIC5mbG9hdCAqLwotICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAnZic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgkJCS8qIC5kb3VibGUgKi8KLSAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2QnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoJCQkvKiAuZ2Zsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2cnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoJCQkvKiAuaGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2gnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAga2luZF9vZl9mbG9hdCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9OwotCi0gIGlmIChraW5kX29mX2Zsb2F0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaW1pdDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYXRvZl92YXggKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCQkgICAgIGtpbmRfb2ZfZmxvYXQsCi0JCQkJICAgICB3b3Jkcyk7Ci0gICAgICAvKgotICAgICAgICogVGhlIGF0b2ZfdmF4KCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgotICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KLSAgICAgICAqIGEgbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKLSAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCi0gICAgICAgKi8KLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IGF0b2ZfdmF4X3NpemVvZiAoa2luZF9vZl9mbG9hdCk7Ci0gICAgICBrbm93IChudW1iZXJfb2ZfY2hhcnMgPD0gTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpbWl0ID0gd29yZHMgKyAobnVtYmVyX29mX2NoYXJzIC8gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgZm9yIChsaXR0bGVudW1QID0gd29yZHM7IGxpdHRsZW51bVAgPCBsaW1pdDsgbGl0dGxlbnVtUCsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1QLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRlcmFsUCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IDA7Ci0gICAgfTsKLQotICAqc2l6ZVAgPSBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJldHVybiBraW5kX29mX2Zsb2F0ID8gTlVMTCA6IF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotfQotCi0vKiBlbmQgb2YgYXRvZi12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMgYi9nYXMvY29uZmlnL2UtaTM4NmNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZDcyOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtaTM4NmNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaTM4NmNvZmZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJaTM4NmNvZmZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmNvZmZfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkiaTM4NmNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgaTM4NmNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMgYi9nYXMvY29uZmlnL2UtaTM4NmVsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTY3MDFlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWkzODZlbGZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJaTM4NmVsZl9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2Zvcm1hdAkmZWxmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJImkzODZlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgaTM4NmVsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLW1pcHNlY29mZi5jIGIvZ2FzL2NvbmZpZy9lLW1pcHNlY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJmNzFiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKm1pcHNlY29mZl9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1pcHNlY29mZl9iZmRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgZW11bF9iZmRfbmFtZQltaXBzZWNvZmZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmVjb2ZmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNiZWNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2JlY29mZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDEKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgIGVtdWxfbmFtZQotI3VuZGVmICBlbXVsX3N0cnVjdF9uYW1lCi0jdW5kZWYgIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNsZWNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2xlY29mZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgZW11bF9uYW1lCi0jdW5kZWYgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNlY29mZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzZWNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAyCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1taXBzZWxmLmMgYi9nYXMvY29uZmlnL2UtbWlwc2VsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWE3MmY1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1taXBzZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICptaXBzZWxmX2JmZF9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbWlwc2VsZl9iZmRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgZW11bF9iZmRfbmFtZQltaXBzZWxmX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfZm9ybWF0CSZlbGZfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2JlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2JlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAxCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmICBlbXVsX25hbWUKLSN1bmRlZiAgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmICBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzbGVsZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzbGVsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgZW11bF9uYW1lCi0jdW5kZWYgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2VsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDIKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9pdGJsLW1pcHMuaCBiL2dhcy9jb25maWcvaXRibC1taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDgyYmQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9pdGJsLW1pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQotLyogaXRibC1taXBzLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRGVmaW5lcyBmb3IgTWlwcyBpdGJsIGNvcCBzdXBwb3J0ICovCi0KLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotCi0vKiBWYWx1ZXMgZm9yIHByb2Nlc3NvcnMgd2lsbCBiZSBmcm9tIDAgdG8gTlVNQkVSX09GX1BST0NFU1NPUlMtMSAqLwotI2RlZmluZSBOVU1CRVJfT0ZfUFJPQ0VTU09SUyA0Ci0jZGVmaW5lIE1BWF9CSVRQT1MgMzEKLQotLyogTWlwcyBzcGVjaWZpY3MgKi8KLSNkZWZpbmUgTUlQU19PUENPREVfQ09QMCAoMHgyMSkJLyogQ09QeitDTywgYml0cyAzMS0yNTogMDEwMHp6MSAqLwotI2RlZmluZSBNSVBTX0VOQ09ERV9DT1BfTlVNKHopICgoTUlQU19PUENPREVfQ09QMHx6PDwxKTw8MjUpCi0jZGVmaW5lIE1JUFNfSVNfQ09QX0lOU04oaW5zbikgKChNSVBTX09QQ09ERV9DT1AwJihpbnNuPj4yNSkpIFwKLQk9PSBNSVBTX09QQ09ERV9DT1AwKQotI2RlZmluZSBNSVBTX0RFQ09ERV9DT1BfTlVNKGluc24pICgofk1JUFNfT1BDT0RFX0NPUDAmKGluc24+PjI1KSk+PjEpCi0jZGVmaW5lIE1JUFNfREVDT0RFX0NPUF9DT0ZVTihpbnNuKSAoKH5NSVBTX0VOQ09ERV9DT1BfTlVNKDMpKSYoaW5zbikpCi0KLS8qIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IGdlbmVyaWMgY29kZSAqLwotI2RlZmluZSBJVEJMX0lTX0lOU04oaW5zbikgTUlQU19JU19DT1BfSU5TTihpbnNuKQotI2RlZmluZSBJVEJMX0RFQ09ERV9QTlVNKGluc24pIE1JUFNfREVDT0RFX0NPUF9OVU0oaW5zbikKLSNkZWZpbmUgSVRCTF9FTkNPREVfUE5VTShwbnVtKSBNSVBTX0VOQ09ERV9DT1BfTlVNKHBudW0pCi0KLSNkZWZpbmUgSVRCTF9PUENPREVfU1RSVUNUIG1pcHNfb3Bjb2RlCi0jZGVmaW5lIElUQkxfT1BDT0RFUyBtaXBzX29wY29kZXMKLSNkZWZpbmUgSVRCTF9OVU1fT1BDT0RFUyBOVU1PUENPREVTCi0jZGVmaW5lIElUQkxfTlVNX01BQ1JPUyBNX05VTV9NQUNST1MKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oIGIvZ2FzL2NvbmZpZy9tNjhrLXBhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjVmNjAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9tNjhrLXBhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyogbTY4ay1wYXJzZS5oIC0tIGhlYWRlciBmaWxlIGZvciBtNjhrIGFzc2VtYmxlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNNjhLX1BBUlNFX0gKLSNkZWZpbmUgTTY4S19QQVJTRV9ICi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGluZ3Mgd2hpY2ggYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZQotICAgb3BlcmFuZCBwYXJzZXIgaW4gbTY4ay55IGFuZCB0aGUgbTY4ayBhc3NlbWJsZXIgcHJvcGVyIGluCi0gICB0Yy1tNjhrLmMuICAqLwotCi0vKiBUaGUgdmFyaW91cyBtNjhrIHJlZ2lzdGVycy4gICovCi0KLS8qIERBVEEgYW5kIEFERFIgaGF2ZSB0byBiZSBjb250aWd1b3VzLCBzbyB0aGF0IHJlZy1EQVRBIGdpdmVzCi0gICAwLTc9PWRhdGEgcmVnLCA4LTE1PT1hZGRyIHJlZyBmb3Igb3BlcmFuZHMgdGhhdCB0YWtlIGJvdGggdHlwZXMuCi0KLSAgIFdlIGRvbid0IHVzZSBmb3JtcyBsaWtlICJBRERSMCA9IEFERFIiIGhlcmUgYmVjYXVzZSB0aGlzIGZpbGUgaXMKLSAgIGxpa2VseSB0byBiZSB1c2VkIG9uIGFuIEFwb2xsbywgYW5kIHRoZSBicm9rZW4gQXBvbGxvIGNvbXBpbGVyCi0gICBnaXZlcyBhbiBgdW5kZWZpbmVkIHZhcmlhYmxlJyBlcnJvciBpZiB3ZSBkbyB0aGF0LCBhY2NvcmRpbmcgdG8KLSAgIHRyb3lAY2JtZS51bnN3LmVkdS5hdS4gICovCi0KLSNkZWZpbmUgREFUQSBEQVRBMAotI2RlZmluZSBBRERSIEFERFIwCi0jZGVmaW5lIFNQIEFERFI3Ci0jZGVmaW5lIEJBRCBCQUQwCi0jZGVmaW5lIEJBQyBCQUMwCi0KLWVudW0gbTY4a19yZWdpc3RlcgotewotICBEQVRBMCA9IDEsCQkJLyogICAxLSA4ID09IGRhdGEgcmVnaXN0ZXJzIDAtNyAqLwotICBEQVRBMSwKLSAgREFUQTIsCi0gIERBVEEzLAotICBEQVRBNCwKLSAgREFUQTUsCi0gIERBVEE2LAotICBEQVRBNywKLQotICBBRERSMCwKLSAgQUREUjEsCi0gIEFERFIyLAotICBBRERSMywKLSAgQUREUjQsCi0gIEFERFI1LAotICBBRERSNiwKLSAgQUREUjcsCi0KLSAgRlAwLAkJCQkvKiBFaWdodCBGUCByZWdpc3RlcnMgKi8KLSAgRlAxLAotICBGUDIsCi0gIEZQMywKLSAgRlA0LAotICBGUDUsCi0gIEZQNiwKLSAgRlA3LAotCi0gIENPUDAsCQkJCS8qIENvLXByb2Nlc3NvciAjMC0jNyAqLwotICBDT1AxLAotICBDT1AyLAotICBDT1AzLAotICBDT1A0LAotICBDT1A1LAotICBDT1A2LAotICBDT1A3LAotCi0gIFBDLAkJCQkvKiBQcm9ncmFtIGNvdW50ZXIgKi8KLSAgWlBDLAkJCQkvKiBIYWNrIGZvciBQcm9ncmFtIHNwYWNlLCBidXQgMCBhZGRyZXNzaW5nICovCi0gIFNSLAkJCQkvKiBTdGF0dXMgUmVnICovCi0gIENDUiwJCQkJLyogQ29uZGl0aW9uIGNvZGUgUmVnICovCi0gIEFDQywJCQkJLyogQWNjdW11bGF0b3IgUmVnICovCi0gIE1BQ1NSLAkJCS8qIE1BQyBTdGF0dXMgUmVnICovCi0gIE1BU0ssCQkJCS8qIE1vZHVsdXMgUmVnICovCi0KLSAgLyogVGhlc2UgaGF2ZSB0byBiZSBncm91cGVkIHRvZ2V0aGVyIGZvciB0aGUgbW92ZWMgaW5zdHJ1Y3Rpb24gdG8gd29yay4gKi8KLSAgVVNQLAkJCQkvKiAgVXNlciBTdGFjayBQb2ludGVyICovCi0gIElTUCwJCQkJLyogIEludGVycnVwdCBzdGFjayBwb2ludGVyICovCi0gIFNGQywKLSAgREZDLAotICBDQUNSLAotICBWQlIsCi0gIENBQVIsCi0gIE1TUCwKLSAgSVRUMCwKLSAgSVRUMSwKLSAgRFRUMCwKLSAgRFRUMSwKLSAgTU1VU1IsCi0gIFRDLAotICBTUlAsCi0gIFVSUCwKLSAgQlVTQ1IsCQkJLyogNjgwNjAgYWRkZWQgdGhlc2UgKi8KLSAgUENSLAotICBST01CQVIsCQkJLyogbWNmNTIwMCBhZGRlZCB0aGVzZSAqLwotICBSQU1CQVIwLAotICBSQU1CQVIxLAotICBNQkFSLAotI2RlZmluZSBsYXN0X21vdmVjX3JlZyBNQkFSCi0gIC8qIGVuZCBvZiBtb3ZlYyBvcmRlcmluZyBjb25zdHJhaW50cyAqLwotCi0gIEZQSSwKLSAgRlBTLAotICBGUEMsCi0KLSAgRFJQLAkJCQkvKiA2ODg1MSBvciA2ODAzMCBNTVUgcmVncyAqLwotICBDUlAsCi0gIENBTCwKLSAgVkFMLAotICBTQ0MsCi0gIEFDLAotICBCQUQwLAotICBCQUQxLAotICBCQUQyLAotICBCQUQzLAotICBCQUQ0LAotICBCQUQ1LAotICBCQUQ2LAotICBCQUQ3LAotICBCQUMwLAotICBCQUMxLAotICBCQUMyLAotICBCQUMzLAotICBCQUM0LAotICBCQUM1LAotICBCQUM2LAotICBCQUM3LAotICBQU1IsCQkJCS8qIGFrYSBNTVVTUiBvbiA2ODAzMCAoYnV0IG5vdCBNTVVTUiBvbiA2ODA0MCkKLQkJCQkgICBhbmQgQUNVU1Igb24gNjhlYzAzMCAqLwotICBQQ1NSLAotCi0gIElDLAkJCQkvKiBpbnN0cnVjdGlvbiBjYWNoZSB0b2tlbiAqLwotICBEQywJCQkJLyogZGF0YSBjYWNoZSB0b2tlbiAqLwotICBOQywJCQkJLyogbm8gY2FjaGUgdG9rZW4gKi8KLSAgQkMsCQkJCS8qIGJvdGggY2FjaGVzIHRva2VuICovCi0KLSAgVFQwLAkJCQkvKiA2ODAzMCBhY2Nlc3MgY29udHJvbCB1bml0IHJlZ3MgKi8KLSAgVFQxLAotCi0gIFpEQVRBMCwJCQkvKiBzdXBwcmVzc2VkIGRhdGEgcmVnaXN0ZXJzLiAgKi8KLSAgWkRBVEExLAotICBaREFUQTIsCi0gIFpEQVRBMywKLSAgWkRBVEE0LAotICBaREFUQTUsCi0gIFpEQVRBNiwKLSAgWkRBVEE3LAotCi0gIFpBRERSMCwJCQkvKiBzdXBwcmVzc2VkIGFkZHJlc3MgcmVnaXN0ZXJzLiAgKi8KLSAgWkFERFIxLAotICBaQUREUjIsCi0gIFpBRERSMywKLSAgWkFERFI0LAotICBaQUREUjUsCi0gIFpBRERSNiwKLSAgWkFERFI3LAotCi0gIC8qIFVwcGVyIGFuZCBsb3dlciBoYWxmIG9mIGRhdGEgYW5kIGFkZHJlc3MgcmVnaXN0ZXJzLiAgT3JkZXIgKm11c3QqCi0gICAgIGJlIERBVEF4TCwgQUREUnhMLCBEQVRBeFUsIEFERFJ4VS4gKi8KLSAgREFUQTBMLAkJCS8qIGxvd2VyIGhhbGYgb2YgZGF0YSByZWdpc3RlcnMgKi8KLSAgREFUQTFMLAotICBEQVRBMkwsCi0gIERBVEEzTCwKLSAgREFUQTRMLAotICBEQVRBNUwsCi0gIERBVEE2TCwKLSAgREFUQTdMLAotCi0gIEFERFIwTCwJCQkvKiBsb3dlciBoYWxmIG9mIGFkZHJlc3MgcmVnaXN0ZXJzICovCi0gIEFERFIxTCwKLSAgQUREUjJMLAotICBBRERSM0wsCi0gIEFERFI0TCwKLSAgQUREUjVMLAotICBBRERSNkwsCi0gIEFERFI3TCwKLQotICBEQVRBMFUsCQkJLyogdXBwZXIgaGFsZiBvZiBkYXRhIHJlZ2lzdGVycyAqLwotICBEQVRBMVUsCi0gIERBVEEyVSwKLSAgREFUQTNVLAotICBEQVRBNFUsCi0gIERBVEE1VSwKLSAgREFUQTZVLAotICBEQVRBN1UsCi0KLSAgQUREUjBVLAkJCS8qIHVwcGVyIGhhbGYgb2YgYWRkcmVzcyByZWdpc3RlcnMgKi8KLSAgQUREUjFVLAotICBBRERSMlUsCi0gIEFERFIzVSwKLSAgQUREUjRVLAotICBBRERSNVUsCi0gIEFERFI2VSwKLSAgQUREUjdVLAotfTsKLQotLyogU2l6ZSBpbmZvcm1hdGlvbi4gICovCi0KLWVudW0gbTY4a19zaXplCi17Ci0gIC8qIFVuc3BlY2lmaWVkLiAgKi8KLSAgU0laRV9VTlNQRUMsCi0KLSAgLyogQnl0ZS4gICovCi0gIFNJWkVfQllURSwKLQotICAvKiBXb3JkICgyIGJ5dGVzKS4gICovCi0gIFNJWkVfV09SRCwKLQotICAvKiBMb25nd29yZCAoNCBieXRlcykuICAqLwotICBTSVpFX0xPTkcKLX07Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGFuIGluZGV4IHJlZ2lzdGVyLiAgKi8KLQotc3RydWN0IG02OGtfaW5kZXhyZWcKLXsKLSAgLyogVGhlIGluZGV4IHJlZ2lzdGVyIGl0c2VsZi4gICovCi0gIGVudW0gbTY4a19yZWdpc3RlciByZWc7Ci0KLSAgLyogVGhlIHNpemUgdG8gdXNlLiAgKi8KLSAgZW51bSBtNjhrX3NpemUgc2l6ZTsKLQotICAvKiBUaGUgdmFsdWUgdG8gc2NhbGUgYnkuICAqLwotICBpbnQgc2NhbGU7Ci19OwotCi0jaWZkZWYgT0JKX0VMRgotLyogVGhlIHR5cGUgb2YgYSBQSUMgZXhwcmVzc2lvbi4gICovCi0KLWVudW0gcGljX3JlbG9jYXRpb24KLXsKLSAgcGljX25vbmUsCQkJLyogbm90IHBpYyAqLwotICBwaWNfcGx0X3BjcmVsLAkJLyogQFBMVFBDICovCi0gIHBpY19nb3RfcGNyZWwsCQkvKiBAR09UUEMgKi8KLSAgcGljX3BsdF9vZmYsCQkJLyogQFBMVCAqLwotICBwaWNfZ290X29mZgkJCS8qIEBHT1QgKi8KLX07Ci0jZW5kaWYKLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhwcmVzc2lvbi4gICovCi0KLXN0cnVjdCBtNjhrX2V4cAotewotICAvKiBUaGUgc2l6ZSB0byB1c2UuICAqLwotICBlbnVtIG02OGtfc2l6ZSBzaXplOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBUaGUgdHlwZSBvZiBwaWMgcmVsb2NhdGlvbiBpZiBhbnkuICAqLwotICBlbnVtIHBpY19yZWxvY2F0aW9uIHBpY19yZWxvYzsKLSNlbmRpZgotCi0gIC8qIFRoZSBleHByZXNzaW9uIGl0c2VsZi4gICovCi0gIGV4cHJlc3Npb25TIGV4cDsKLX07Ci0KLS8qIFRoZSBvcGVyYW5kIG1vZGVzLiAgKi8KLQotZW51bSBtNjhrX29wZXJhbmRfdHlwZQotewotICBJTU1FRCA9IDEsCi0gIEFCU0wsCi0gIERSRUcsCi0gIEFSRUcsCi0gIEZQUkVHLAotICBDT05UUk9MLAotICBBSU5EUiwKLSAgQUlOQywKLSAgQURFQywKLSAgRElTUCwKLSAgQkFTRSwKLSAgUE9TVCwKLSAgUFJFLAotICBSRUdMU1QKLX07Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgcGFyc2VkIG9wZXJhbmQuICAqLwotCi1zdHJ1Y3QgbTY4a19vcAotewotICAvKiBUaGUgdHlwZSBvZiBvcGVyYW5kLiAgKi8KLSAgZW51bSBtNjhrX29wZXJhbmRfdHlwZSBtb2RlOwotCi0gIC8qIFRoZSBtYWluIHJlZ2lzdGVyLiAgKi8KLSAgZW51bSBtNjhrX3JlZ2lzdGVyIHJlZzsKLQotICAvKiBUaGUgcmVnaXN0ZXIgbWFzayBmb3IgbW9kZSBSRUdMU1QuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogQW4gZXJyb3IgbWVzc2FnZS4gICovCi0gIGNvbnN0IGNoYXIgKmVycm9yOwotCi0gIC8qIFRoZSBpbmRleCByZWdpc3Rlci4gICovCi0gIHN0cnVjdCBtNjhrX2luZGV4cmVnIGluZGV4OwotCi0gIC8qIFRoZSBkaXNwbGFjZW1lbnQuICAqLwotICBzdHJ1Y3QgbTY4a19leHAgZGlzcDsKLQotICAvKiBUaGUgb3V0ZXIgZGlzcGxhY2VtZW50LiAgKi8KLSAgc3RydWN0IG02OGtfZXhwIG9kaXNwOwotfTsKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTTY4S19QQVJTRV9IKSAqLwotCi0vKiBUaGUgcGFyc2luZyBmdW5jdGlvbi4gICovCi0KLWV4dGVybiBpbnQgbTY4a19pcF9vcCBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBtNjhrX29wICopKTsKLQotLyogV2hldGhlciByZWdpc3RlciBwcmVmaXhlcyBhcmUgb3B0aW9uYWwuICAqLwotZXh0ZXJuIGludCBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWw7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL202OGstcGFyc2UueSBiL2dhcy9jb25maWcvbTY4ay1wYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE0ZTRmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvbTY4ay1wYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsMTA2MSArMCwwIEBACi0vKiBtNjhrLnkgLS0gYmlzb24gZ3JhbW1hciBmb3IgbTY4ayBvcGVyYW5kIHBhcnNpbmcKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtlbiBSYWVidXJuIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgYSBiaXNvbiBncmFtbWFyIHRvIHBhcnNlIG02OGsgb3BlcmFuZHMuICBUaGUgbTY4awotICAgaGFzIGEgY29tcGxpY2F0ZWQgb3BlcmFuZCBzeW50YXgsIGFuZCBnYXMgc3VwcG9ydHMgdHdvIG1haW4KLSAgIHZhcmlhdGlvbnMgb2YgaXQuICBVc2luZyBhIGdyYW1tYXIgaXMgcHJvYmFibHkgb3ZlcmtpbGwsIGJ1dCBhdAotICAgbGVhc3QgaXQgbWFrZXMgY2xlYXIgZXhhY3RseSB3aGF0IHdlIGRvIHN1cHBvcnQuICAqLwotCi0lewotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJ0Yy1tNjhrLmgiCi0jaW5jbHVkZSAibTY4ay1wYXJzZS5oIgotCi0vKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwKLSAgIGV0YyksIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzIElmIG90aGVyIHBhcnNlcgotICAgZ2VuZXJhdG9ycyAoYmlzb24sIGJ5YWNjLCBldGMpIHByb2R1Y2UgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdAotICAgY29uZmxpY3QgYXQgbGluayB0aW1lLCB0aGVuIHRob3NlIHBhcnNlciBnZW5lcmF0b3JzIG5lZWQgdG8gYmUKLSAgIGZpeGVkIGluc3RlYWQgb2YgYWRkaW5nIHRob3NlIG5hbWVzIHRvIHRoaXMgbGlzdC4gKi8KLQotI2RlZmluZQl5eW1heGRlcHRoIG02OGtfbWF4ZGVwdGgKLSNkZWZpbmUJeXlwYXJzZQltNjhrX3BhcnNlCi0jZGVmaW5lCXl5bGV4CW02OGtfbGV4Ci0jZGVmaW5lCXl5ZXJyb3IJbTY4a19lcnJvcgotI2RlZmluZQl5eWx2YWwJbTY4a19sdmFsCi0jZGVmaW5lCXl5Y2hhcgltNjhrX2NoYXIKLSNkZWZpbmUJeXlkZWJ1ZwltNjhrX2RlYnVnCi0jZGVmaW5lCXl5cGFjdAltNjhrX3BhY3QJCi0jZGVmaW5lCXl5cjEJbTY4a19yMQkJCQotI2RlZmluZQl5eXIyCW02OGtfcjIJCQkKLSNkZWZpbmUJeXlkZWYJbTY4a19kZWYJCQotI2RlZmluZQl5eWNoawltNjhrX2NoawkJCi0jZGVmaW5lCXl5cGdvCW02OGtfcGdvCQkKLSNkZWZpbmUJeXlhY3QJbTY4a19hY3QJCQotI2RlZmluZQl5eWV4Y2EJbTY4a19leGNhCi0jZGVmaW5lIHl5ZXJyZmxhZyBtNjhrX2VycmZsYWcKLSNkZWZpbmUgeXluZXJycwltNjhrX25lcnJzCi0jZGVmaW5lCXl5cHMJbTY4a19wcwotI2RlZmluZQl5eXB2CW02OGtfcHYKLSNkZWZpbmUJeXlzCW02OGtfcwotI2RlZmluZQl5eV95eXMJbTY4a195eXMKLSNkZWZpbmUJeXlzdGF0ZQltNjhrX3N0YXRlCi0jZGVmaW5lCXl5dG1wCW02OGtfdG1wCi0jZGVmaW5lCXl5dgltNjhrX3YKLSNkZWZpbmUJeXlfeXl2CW02OGtfeXl2Ci0jZGVmaW5lCXl5dmFsCW02OGtfdmFsCi0jZGVmaW5lCXl5bGxvYwltNjhrX2xsb2MKLSNkZWZpbmUgeXlyZWRzCW02OGtfcmVkcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXl0b2tzCW02OGtfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJbTY4a195eWxocwotI2RlZmluZSB5eWxlbgltNjhrX3l5bGVuCi0jZGVmaW5lIHl5ZGVmcmVkIG02OGtfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwltNjhrX3l5ZGdvdG8KLSNkZWZpbmUgeXlzaW5kZXggbTY4a195eXNpbmRleAotI2RlZmluZSB5eXJpbmRleCBtNjhrX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IG02OGtfeXlnaW5kZXgKLSNkZWZpbmUgeXl0YWJsZQkgbTY4a195eXRhYmxlCi0jZGVmaW5lIHl5Y2hlY2sJIG02OGtfeXljaGVjawotCi0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUgWVlERUJVRyAxCi0jZW5kaWYKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGVudW0gbTY4a19yZWdpc3RlciBtNjhrX3JlZ19wYXJzZSBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoZSBwYXJzZXIgc2V0cyBmaWVsZHMgcG9pbnRlZCB0byBieSB0aGlzIGdsb2JhbCB2YXJpYWJsZS4gICovCi1zdGF0aWMgc3RydWN0IG02OGtfb3AgKm9wOwotCi0lfQotCi0ldW5pb24KLXsKLSAgc3RydWN0IG02OGtfaW5kZXhyZWcgaW5kZXhyZWc7Ci0gIGVudW0gbTY4a19yZWdpc3RlciByZWc7Ci0gIHN0cnVjdCBtNjhrX2V4cCBleHA7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgaW50IG9uZXJlZzsKLX0KLQotJXRva2VuIDxyZWc+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/ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMDMwMCwgInhtZW0uYnUudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwMTAwLCAieG1lbS5idS51c3IiLAkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwMDAwMDEwMCwgInhtZW0uYnUudXNyIiwJIj9kLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNzAwLCAieG1lbS51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDA1MDAsICJ4bWVtLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4MTAwICgweDA0MDAwMTAwLCAieG1lbS51c3IiLAkiP2QsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDUwMDAsICJ4b3IiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NTAwMDAwMDAsICJ4b3IiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDU0MDAsICJ4b3IuYyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDU0MDAwMDAwLCAieG9yLnUiLAkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHgwMDAwMDAwMCwgIiIsCQkwKQotfTsKLQotI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIG04OGtfb3Bjb2RlcykvKHNpemVvZiBtODhrX29wY29kZXNbMF0pKQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYW91dC5jIGIvZ2FzL2NvbmZpZy9vYmotYW91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRmNGQ4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLW9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI3VuZGVmIE5PX1JFTE9DCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNlbmRpZgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KLWNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXSA9Ci17Ci0gIE5fQUJTLAotICBOX1RFWFQsCi0gIE5fREFUQSwKLSAgTl9CU1MsCi0gIE5fVU5ERiwJCQkvKiB1bmtub3duICovCi0gIE5fVU5ERiwJCQkvKiBlcnJvciAqLwotICBOX1VOREYsCQkJLyogZXhwcmVzc2lvbiAqLwotICBOX1VOREYsCQkJLyogZGVidWcgKi8KLSAgTl9VTkRGLAkJCS8qIG50diAqLwotICBOX1VOREYsCQkJLyogcHR2ICovCi0gIE5fUkVHSVNURVIsCQkJLyogcmVnaXN0ZXIgKi8KLX07Ci0KLWNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tOX1RZUEUgKyAyXSA9Ci17CQkJCS8qIE5fVFlQRSA9PSAweDFFID0gMzItMiAqLwotICBTRUdfVU5LTk9XTiwJCQkvKiBOX1VOREYgPT0gMCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0FCU09MVVRFLAkJCS8qIE5fQUJTID09IDIgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19URVhULAkJCS8qIE5fVEVYVCA9PSA0ICovCi0gIFNFR19HT09GLAotICBTRUdfREFUQSwJCQkvKiBOX0RBVEEgPT0gNiAqLwotICBTRUdfR09PRiwKLSAgU0VHX0JTUywJCQkvKiBOX0JTUyA9PSA4ICovCi0gIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19SRUdJU1RFUiwJCQkvKiBkdW1teSBOX1JFR0lTVEVSIGZvciByZWdzID0gMzAgKi8KLSAgU0VHX0dPT0YsCi19OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIG9ial9hb3V0X2xpbmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfYW91dF93ZWFrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2FvdXRfdHlwZSBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsibGluZSIsIG9ial9hb3V0X2xpbmUsIDB9LAkvKiBzb3VyY2UgY29kZSBsaW5lIG51bWJlciAqLwotICB7ImxuIiwgb2JqX2FvdXRfbGluZSwgMH0sCS8qIGNvZmYgbGluZSBudW1iZXIgdGhhdCB3ZSB1c2UgYW55d2F5ICovCi0KLSAgeyJ3ZWFrIiwgb2JqX2FvdXRfd2VhaywgMH0sCS8qIG1hcmsgc3ltYm9sIGFzIHdlYWsuICAqLwotCi0gIHsidHlwZSIsIG9ial9hb3V0X3R5cGUsIDB9LAotCi0gIC8qIGNvZmYgZGVidWcgcHNldWRvcyAoaWdub3JlZCkgKi8KLSAgeyJkZWYiLCBzX2lnbm9yZSwgMH0sCi0gIHsiZGltIiwgc19pZ25vcmUsIDB9LAotICB7ImVuZGVmIiwgc19pZ25vcmUsIDB9LAotICB7ImlkZW50Iiwgc19pZ25vcmUsIDB9LAotICB7ImxpbmUiLCBzX2lnbm9yZSwgMH0sCi0gIHsibG4iLCBzX2lnbm9yZSwgMH0sCi0gIHsic2NsIiwgc19pZ25vcmUsIDB9LAotICB7InNpemUiLCBzX2lnbm9yZSwgMH0sCi0gIHsidGFnIiwgc19pZ25vcmUsIDB9LAotICB7InZhbCIsIHNfaWdub3JlLCAwfSwKLSAgeyJ2ZXJzaW9uIiwgc19pZ25vcmUsIDB9LAotCi0gIHsib3B0aW0iLCBzX2lnbm9yZSwgMH0sCS8qIEZvciBzdW4zODZpIGNjICg/KSAqLwotCi0gIC8qIG90aGVyIHN0dWZmICovCi0gIHsiQUJPUlQiLCBzX2Fib3J0LCAwfSwKLQotICB7TlVMTH0JCQkvKiBlbmQgc2VudGluZWwgKi8KLX07CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KLQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi12b2lkCi1vYmpfYW91dF9mcm9iX3N5bWJvbCAoc3ltLCBwdW50KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCAqcHVudDsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGludCBkZXNjLCB0eXBlLCBvdGhlcjsKLQotICBmbGFncyA9IHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFnczsKLSAgZGVzYyA9IFNfR0VUX0RFU0MgKHN5bSk7Ci0gIHR5cGUgPSBTX0dFVF9UWVBFIChzeW0pOwotICBvdGhlciA9IFNfR0VUX09USEVSIChzeW0pOwotICBzZWMgPSBTX0dFVF9TRUdNRU5UIChzeW0pOwotCi0gIC8qIE9ubHkgZnJvYiBzaW1wbGUgc3ltYm9scyB0aGlzIHdheSByaWdodCBub3cuICAqLwotICBpZiAoISAodHlwZSAmIH4gKE5fVFlQRSB8IE5fRVhUKSkpCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gKE5fVU5ERiB8IE5fRVhUKQotCSAgJiYgc2VjID09ICZiZmRfYWJzX3NlY3Rpb24pCi0JewotCSAgc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bSwgc2VjKTsKLQl9Ci0KLSAgICAgIGlmICgodHlwZSAmIE5fVFlQRSkgIT0gTl9JTkRSCi0JICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRBCi0JICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRUCi0JICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRECi0JICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRCCi0JICAmJiB0eXBlICE9IE5fV0FSTklORwotCSAgJiYgKHNlYyA9PSAmYmZkX2Fic19zZWN0aW9uCi0JICAgICAgfHwgc2VjID09ICZiZmRfdW5kX3NlY3Rpb24pKQotCXJldHVybjsKLSAgICAgIGlmIChmbGFncyAmIEJTRl9FWFBPUlQpCi0JdHlwZSB8PSBOX0VYVDsKLQotICAgICAgc3dpdGNoICh0eXBlICYgTl9UWVBFKQotCXsKLQljYXNlIE5fU0VUQToKLQljYXNlIE5fU0VUVDoKLQljYXNlIE5fU0VURDoKLQljYXNlIE5fU0VUQjoKLQkgIC8qIFNldCB0aGUgZGVidWdnaW5nIGZsYWcgZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMgc28gdGhhdAotCSAgICAgQkZEIGxlYXZlcyB0aGVtIGFsb25lLiAgKi8KLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0JICAvKiBZb3UgY2FuJ3QgcHV0IGEgY29tbW9uIHN5bWJvbCBpbiBhIHNldC4gIFRoZSB3YXkgYSBzZXQKLQkgICAgIGVsZW1lbnQgd29ya3MgaXMgdGhhdCB0aGUgc3ltYm9sIGhhcyBhIGRlZmluaXRpb24gYW5kIGEKLQkgICAgIG5hbWUsIGFuZCB0aGUgbGlua2VyIGFkZHMgdGhlIGRlZmluaXRpb24gdG8gdGhlIHNldCBvZgotCSAgICAgdGhhdCBuYW1lLiAgVGhhdCBkb2VzIG5vdCB3b3JrIGZvciBhIGNvbW1vbiBzeW1ib2wsCi0JICAgICBiZWNhdXNlIHRoZSBsaW5rZXIgY2FuJ3QgdGVsbCB3aGljaCBjb21tb24gc3ltYm9sIHRoZQotCSAgICAgdXNlciBtZWFucy4gIEZJWE1FOiBVc2luZyBhc19iYWQgaGVyZSBtYXkgYmUKLQkgICAgIGluYXBwcm9wcmlhdGUsIHNpbmNlIHRoZSB1c2VyIG1heSB3YW50IHRvIGZvcmNlIGEKLQkgICAgIHBhcnRpY3VsYXIgdHlwZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgc2VtYW50aWNzIG9mIHNldHM7Ci0JICAgICBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgY2VydGFpbmx5IGRvbid0IHdhbnQgYW55Ym9keSB0byBiZQotCSAgICAgbWlzbGVhZCBpbnRvIHRoaW5raW5nIHRoYXQgdGhlaXIgY29kZSB3aWxsIHdvcmsuICAqLwotCSAgaWYgKFNfSVNfQ09NTU9OIChzeW0pKQotCSAgICBhc19iYWQgKF8oIkF0dGVtcHQgdG8gcHV0IGEgY29tbW9uIHN5bWJvbCBpbnRvIHNldCAlcyIpLAotCQkgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0JICAvKiBTaW1pbGFybHksIHlvdSBjYW4ndCBwdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiBhIHNldC4gICovCi0JICBlbHNlIGlmICghIFNfSVNfREVGSU5FRCAoc3ltKSkKLQkgICAgYXNfYmFkIChfKCJBdHRlbXB0IHRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gc2V0ICVzIiksCi0JCSAgICBTX0dFVF9OQU1FIChzeW0pKTsKLQotCSAgYnJlYWs7Ci0JY2FzZSBOX0lORFI6Ci0JICAvKiBQdXQgaW5kaXJlY3Qgc3ltYm9scyBpbiB0aGUgaW5kaXJlY3Qgc2VjdGlvbi4gICovCi0JICBTX1NFVF9TRUdNRU5UIChzeW0sIGJmZF9pbmRfc2VjdGlvbl9wdHIpOwotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9JTkRJUkVDVDsKLQkgIGlmICh0eXBlICYgTl9FWFQpCi0JICAgIHsKLQkgICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0VYUE9SVDsKLQkgICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgJj1+IEJTRl9MT0NBTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBOX1dBUk5JTkc6Ci0JICAvKiBNYXJrIHdhcm5pbmcgc3ltYm9scy4gICovCi0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX1dBUk5JTkc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gICAgfQotCi0gIFNfU0VUX1RZUEUgKHN5bSwgdHlwZSk7Ci0KLSAgLyogRG91YmxlIGNoZWNrIHdlYWsgc3ltYm9scy4gICovCi0gIGlmIChTX0lTX1dFQUsgKHN5bSkpCi0gICAgewotICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW0pKQotCWFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAotCQlTX0dFVF9OQU1FIChzeW0pKTsKLSAgICB9Ci19Ci0KLXZvaWQKLW9ial9hb3V0X2Zyb2JfZmlsZSAoKQotewotICAvKiBSZWxvY2F0aW9uIHByb2Nlc3NpbmcgbWF5IHJlcXVpcmUga25vd2luZyB0aGUgVk1BcyBvZiB0aGUgc2VjdGlvbnMuCi0gICAgIFNpbmNlIHdyaXRpbmcgdG8gYSBzZWN0aW9uIHdpbGwgY2F1c2UgdGhlIEJGRCBiYWNrIGVuZCB0byBjb21wdXRlIHRoZQotICAgICBWTUFzLCBmYWtlIGl0IG91dCBoZXJlLi4uLiAgKi8KLSAgYmZkX2J5dGUgYiA9IDA7Ci0gIGJvb2xlYW4geCA9IHRydWU7Ci0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHRleHRfc2VjdGlvbikgIT0gMCkKLSAgICB7Ci0gICAgICB4ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChzdGRvdXRwdXQsIHRleHRfc2VjdGlvbiwgJmIsIChmaWxlX3B0cikgMCwKLQkJCQkgICAgKGJmZF9zaXplX3R5cGUpIDEpOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24pICE9IDApCi0gICAgewotICAgICAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sICZiLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgIChiZmRfc2l6ZV90eXBlKSAxKTsKLSAgICB9Ci0gIGFzc2VydCAoeCA9PSB0cnVlKTsKLX0KLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFJlbG9jYXRpb24uICovCi0KLS8qCi0gKgkJZW1pdF9yZWxvY2F0aW9ucygpCi0gKgotICogQ3Jhd2wgYWxvbmcgYSBmaXhTIGNoYWluLiBFbWl0IHRoZSBzZWdtZW50J3MgcmVsb2NhdGlvbnMuCi0gKi8KLXZvaWQKLW9ial9lbWl0X3JlbG9jYXRpb25zICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgZml4UyAqZml4UDsJCS8qIEZpeHVwIGNoYWluIGZvciB0aGlzIHNlZ21lbnQuICovCi0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgaWYgKGZpeFAtPmZ4X2RvbmUgPT0gMCkKLSAgICAgIHsKLQlzeW1ib2xTICpzeW07Ci0KLQlzeW0gPSBmaXhQLT5meF9hZGRzeTsKLQl3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0JICBzeW0gPSBzeW0tPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQlmaXhQLT5meF9hZGRzeSA9IHN5bTsKLQotCWlmICghIHN5bS0+c3lfcmVzb2x2ZWQgJiYgISBTX0lTX0RFRklORUQgKHN5bSkpCi0JICB7Ci0JICAgIGNoYXIgKmZpbGU7Ci0JICAgIHVuc2lnbmVkIGludCBsaW5lOwotCi0JICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltLCAmZmlsZSwgJmxpbmUpKQotCSAgICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygidW5yZXNvbHZlZCByZWxvY2F0aW9uIikpOwotCSAgICBlbHNlCi0JICAgICAgYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbjogc3ltYm9sIGAlcycgbm90IGluIHN5bWJvbCB0YWJsZSIpLAotCQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLQkgIH0KLQotCXRjX2FvdXRfZml4X3RvX2NoYXJzICgqd2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKTsKLQkqd2hlcmUgKz0gbWRfcmVsb2Nfc2l6ZTsKLSAgICAgIH0KLX0KLQotI2lmbmRlZiBvYmpfaGVhZGVyX2FwcGVuZAotLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLXZvaWQKLW9ial9oZWFkZXJfYXBwZW5kICh3aGVyZSwgaGVhZGVycykKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgdGNfaGVhZGVyc19ob29rIChoZWFkZXJzKTsKLQotI2lmZGVmIENST1NTX0NPTVBJTEUKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2luZm8sIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfaW5mbykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9pbmZvKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RleHQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhdGEsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Jzcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3N5bXMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKTsKLQotI2Vsc2UgLyogQ1JPU1NfQ09NUElMRSAqLwotCi0gIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZoZWFkZXJzLT5oZWFkZXIsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyKSk7Ci0jZW5kaWYgLyogQ1JPU1NfQ09NUElMRSAqLwotCi19Ci0jZW5kaWYgLyogISBkZWZpbmVkIChvYmpfaGVhZGVyX2FwcGVuZCkgKi8KLQotdm9pZAotb2JqX3N5bWJvbF90b19jaGFycyAod2hlcmUsIHN5bWJvbFApCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpLCBTX0dFVF9PRkZTRVQgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX0RFU0MgKHN5bWJvbFApKSwgU19HRVRfREVTQyAoc3ltYm9sUCksIHNpemVvZiAoU19HRVRfREVTQyAoc3ltYm9sUCkpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSwgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplb2YgKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSk7Ci0KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbCwgc2l6ZW9mIChvYmpfc3ltYm9sX3R5cGUpKTsKLX0KLQotdm9pZAotb2JqX2VtaXRfc3ltYm9scyAod2hlcmUsIHN5bWJvbF9yb290UCkKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uICAqLwotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogVXNlZCB0byBzYXZlIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWUuIEl0IGlzIHVzZWQgdG8gcG9pbnQKLQkgdG8gdGhlIHN0cmluZyBpbiBtZW1vcnkgYnV0IG11c3QgYmUgYSBmaWxlIG9mZnNldC4gKi8KLSAgICAgIHJlZ2lzdGVyIGNoYXIgKnRlbXA7Ci0KLSAgICAgIHRlbXAgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLSAgICAgIFNfU0VUX09GRlNFVCAoc3ltYm9sUCwgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQpOwotCi0gICAgICAvKiBBbnkgc3ltYm9sIHN0aWxsIHVuZGVmaW5lZCBhbmQgaXMgbm90IGEgZGJnIHN5bWJvbCBpcyBtYWRlIE5fRVhULiAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQlTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgdHlwZSBvZiBhIHdlYWsgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChTX0dFVF9XRUFLIChzeW1ib2xQKSkKLQl7Ci0JICBzd2l0Y2ggKFNfR0VUX1RZUEUgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgIGNhc2UgTl9VTkRGOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtVKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9BQlM6CSBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtBKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9URVhUOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtUKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9EQVRBOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtEKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9CU1M6ICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtCKTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6IGFzX2JhZCAoXygiJXM6IGJhZCB0eXBlIGZvciB3ZWFrIHN5bWJvbCIpLCB0ZW1wKTsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKTsKLSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHRlbXApOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBBc3N1bWUgZGVsaW1pdGVyIGlzIHBhcnQgb2YgZXhwcmVzc2lvbi4KLSAgICAgQlNENC4yIGFzIGZhaWxzIHdpdGggZGVsaWdodGZ1bCBidWcsIHNvIHdlCi0gICAgIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBvYmpfYW91dF9saW5lKCkgKi8KLQotLyogSGFuZGxlIC53ZWFrLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIC50eXBlLiAgT24ge05ldCxPcGVufUJTRCwgdGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgbl9vdGhlciBmaWVsZCwKLSAgIHdoaWNoIGlzIHRoZW4gYXBwYXJlbnRseSB1c2VkIHdoZW4gZG9pbmcgZHluYW1pYyBsaW5raW5nLiAgT2xkZXIKLSAgIHZlcnNpb25zIG9nYXMgaWdub3JlZCB0aGUgLnR5cGUgcHNldWRvLW9wLCBzbyB3ZSBhbHNvIGlnbm9yZSBpdCBpZgotICAgd2UgY2FuJ3QgcGFyc2UgaXQuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgaWYgKHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdAJykKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvYmplY3QiLCA2KSA9PSAwKQotCQlTX1NFVF9PVEhFUiAoc3ltLCAxKTsKLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJmdW5jdGlvbiIsIDgpID09IDApCi0JCVNfU0VUX09USEVSIChzeW0sIDIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZ25vcmUgZXZlcnl0aGluZyBlbHNlIG9uIHRoZSBsaW5lLiAgKi8KLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci19Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi12b2lkCi1vYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3ltYm9sUyAqKnN5bWJvbFBQOwotICBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKTsKLQotICBzeW1ib2xQUCA9ICZzeW1ib2xfcm9vdFA7CS8qLT5sYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLwotICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN5bWJvbFAtPnN5X21yaV9jb21tb24pCi0JewotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bWJvbFApKQotCSAgICBhc19iYWQgKF8oIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIpLAotCQkgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgJiYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKSkKLQl7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfVEVYVCk7Ci0JfQkJCS8qIGlmIHB1c2luZyBkYXRhIGludG8gdGV4dCAqLwotCi0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLSAgICAgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgotCSBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkpCi0JewotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPSywgaGVyZSBpcyBob3cgd2UgZGVjaWRlIHdoaWNoIHN5bWJvbHMgZ28gb3V0IGludG8gdGhlIGJyYXZlCi0JIG5ldyBzeW10YWIuICBTeW1ib2xzIHRoYXQgZG8gYXJlOgotCi0JICogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQotCSAqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQotCi0JIFN5bWJvbHMgdGhhdCBkb24ndCBhcmU6Ci0JICogc3ltYm9scyB0aGF0IGFyZSByZWdpc3RlcnMKLQkgKiBzeW1ib2xzIHdpdGggXDEgYXMgdGhlaXIgM3JkIGNoYXJhY3RlciAobnVtZXJpYyBsYWJlbHMpCi0JICogImxvY2FsIGxhYmVscyIgYXMgZGVmaW5lZCBieSBTX0xPQ0FMX05BTUUobmFtZSkgaWYgdGhlIC1MCi0JIHN3aXRjaCB3YXMgcGFzc2VkIHRvIGdhcy4KLQotCSBBbGwgb3RoZXIgc3ltYm9scyBhcmUgb3V0cHV0LiAgV2UgY29tcGxhaW4gaWYgYSBkZWxldGVkCi0JIHN5bWJvbCB3YXMgbWFya2VkIGV4dGVybmFsLiAqLwotCi0KLSAgICAgIGlmICghU19JU19SRUdJU1RFUiAoc3ltYm9sUCkKLQkgICYmICghU19HRVRfTkFNRSAoc3ltYm9sUCkKLQkgICAgICB8fCBTX0lTX0RFQlVHIChzeW1ib2xQKQotCSAgICAgIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkKLQkgICAgICB8fCAoU19HRVRfTkFNRSAoc3ltYm9sUClbMF0gIT0gJ1wwMDEnCi0JCSAgJiYgKGZsYWdfa2VlcF9sb2NhbHMgfHwgIVNfTE9DQUxfTkFNRSAoc3ltYm9sUCkpKSkpCi0JewotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOwotCi0JICAvKiBUaGUgKyAxIGFmdGVyIHN0cmxlbiBhY2NvdW50IGZvciB0aGUgXDAgYXQgdGhlCi0JCQkgICBlbmQgb2YgZWFjaCBzdHJpbmcgKi8KLQkgIGlmICghU19JU19TVEFCRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICAvKiBPcmRpbmFyeSBjYXNlLiAqLwotCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gc3RyaW5nX2J5dGVfY291bnQ7Ci0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgICB9Ci0JICBlbHNlCQkJLyogLlN0YWJkIGNhc2UuICovCi0JICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkgIHN5bWJvbFBQID0gJnN5bWJvbFAtPnN5X25leHQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkgICAgLyogVGhpcyB3YXJuaW5nIHNob3VsZCBuZXZlciBnZXQgdHJpZ2dlcmVkIGFueSBtb3JlLgotCSAgICAgICBXZWxsLCBtYXliZSBpZiB5b3UncmUgZG9pbmcgdHdpc3RlZCB0aGluZ3Mgd2l0aAotCSAgICAgICByZWdpc3RlciBuYW1lcy4uLiAgKi8KLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQuIiksIGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lIChTX0dFVF9OQU1FIChzeW1ib2xQKSkpOwotCSAgICB9CQkJLyogb29wcy4gKi8KLQotCSAgLyogVW5ob29rIGl0IGZyb20gdGhlIGNoYWluICovCi0JICAqc3ltYm9sUFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCk7Ci0JfQkJCS8qIGlmIHRoaXMgc3ltYm9sIHNob3VsZCBiZSBpbiB0aGUgb3V0cHV0ICovCi0gICAgfQkJCQkvKiBmb3IgZWFjaCBzeW1ib2wgKi8KLQotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaGVhZGVycywgc3ltYm9sX251bWJlcik7Ci19Ci0KLS8qCi0gKiBGaW5kIHN0cmluZ3MgYnkgY3Jhd2xpbmcgYWxvbmcgc3ltYm9sIHRhYmxlIGNoYWluLgotICovCi0KLXZvaWQKLW9ial9lbWl0X3N0cmluZ3MgKHdoZXJlKQotICAgICBjaGFyICoqd2hlcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSNpZmRlZiBDUk9TU19DT01QSUxFCi0gIC8qIEdvdHRhIGRvIG1kXyBieXRlLW9yZGVyaW5nIHN0dWZmIGZvciBzdHJpbmdfYnl0ZV9jb3VudCBmaXJzdCAtIEtXSyAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgc3RyaW5nX2J5dGVfY291bnQsIHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpOwotI2Vsc2UgLyogQ1JPU1NfQ09NUElMRSAqLwotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmc3RyaW5nX2J5dGVfY291bnQsICh1bnNpZ25lZCBsb25nKSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0jZW5kaWYgLyogQ1JPU1NfQ09NUElMRSAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpCi0JYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCSh1bnNpZ25lZCBsb25nKSAoc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxKSk7Ci0gICAgfQkJCQkvKiB3YWxrIHN5bWJvbCBjaGFpbiAqLwotfQotCi0jaWZuZGVmIEFPVVRfVkVSU0lPTgotI2RlZmluZSBBT1VUX1ZFUlNJT04gMAotI2VuZGlmCi0KLXZvaWQKLW9ial9wcmVfd3JpdGVfaG9vayAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIEhfU0VUX0RZTkFNSUMgKGhlYWRlcnMsIDApOwotICBIX1NFVF9WRVJTSU9OIChoZWFkZXJzLCBBT1VUX1ZFUlNJT04pOwotICBIX1NFVF9NQUNIVFlQRSAoaGVhZGVycywgQU9VVF9NQUNIVFlQRSk7Ci0gIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2sgKGhlYWRlcnMpOwotfQotCi12b2lkCi1ERUZVTl9WT0lEIChzX3NlY3QpCi17Ci0gIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCi0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciAqc2VjdGlvbl9uYW1lX2VuZDsKLSAgY2hhciBjOwotCi0gIHVuc2lnbmVkIGludCBsZW47Ci0gIHVuc2lnbmVkIGludCBleHA7Ci0gIGNoYXIgKnNhdmU7Ci0KLSAgc2VjdGlvbl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHNlY3Rpb25fbmFtZV9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgbGVuID0gc2VjdGlvbl9uYW1lX2VuZCAtIHNlY3Rpb25fbmFtZTsKLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoYyA9PSAnLCcpCi0gICAgewotICAgICAgZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gICAgICBleHAgPSAwOwotICAgIH0KLSAgaWYgKGV4cCA+PSAxMDAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic3Vic2VnbWVudCBpbmRleCB0b28gaGlnaCIpKTsKLSAgICB9Ci0KLSAgaWYgKHN0cmNtcCAoc2VjdGlvbl9uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIHsKLSAgICAgIHN1YnNlZ19zZXQgKFNFR19URVhULCAoc3Vic2VnVCkgZXhwKTsKLSAgICB9Ci0KLSAgaWYgKHN0cmNtcCAoc2VjdGlvbl9uYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLQlzdWJzZWdfc2V0IChTRUdfVEVYVCwgKHN1YnNlZ1QpIGV4cCArIDEwMDApOwotICAgICAgZWxzZQotCXN1YnNlZ19zZXQgKFNFR19EQVRBLCAoc3Vic2VnVCkgZXhwKTsKLSAgICB9Ci0KLSAgKnNlY3Rpb25fbmFtZV9lbmQgPSBjOwotfQotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIGVuZCBvZiBvYmotYW91dC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1hb3V0LmggYi9nYXMvY29uZmlnL29iai1hb3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjMzZmQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotYW91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qIG9iai1hb3V0LmgsIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCBmb3IgZ2FzLCB0aGUgYXNzZW1ibGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFRhZyB0byB2YWxpZGF0ZSBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQgcHJvY2Vzc2luZyAqLwotI2RlZmluZSBPQkpfQU9VVCAxCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0jaW5jbHVkZSAiYmZkL2xpYmFvdXQuaCIKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIFZNUwotI2luY2x1ZGUgImFvdXRfZ251LmgiCQkvKiBOZWVkZWQgdG8gZGVmaW5lIHN0cnVjdCBubGlzdC4gU2lnaC4gKi8KLSNlbHNlCi0jaW5jbHVkZSAiYV9vdXQuaCIKLSNlbmRpZgotCi0jaWZuZGVmIEFPVVRfTUFDSFRZUEUKLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAwCi0jZW5kaWYgLyogQU9VVF9NQUNIVFlQRSAqLwotCi1leHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwotCi0jaWZuZGVmIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJKE9NQUdJQykKLSNlbmRpZiAvKiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKi8KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBTWU1CT0wgVEFCTEUgKi8KLS8qIFN5bWJvbCB0YWJsZSBlbnRyeSBkYXRhIHR5cGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgbmxpc3Qgb2JqX3N5bWJvbF90eXBlOwkvKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotLyogU3ltYm9sIHRhYmxlIG1hY3JvcyBhbmQgY29uc3RhbnRzICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKSBcCi0gIChhb3V0X3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+b3RoZXIgPSAoVikpCi0jZGVmaW5lIFNfU0VUX1RZUEUoUyxUKSBcCi0gIChhb3V0X3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+dHlwZSA9IChUKSkKLSNkZWZpbmUgU19TRVRfREVTQyhTLEQpCVwKLSAgKGFvdXRfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5kZXNjID0gKEQpKQotI2RlZmluZSBTX0dFVF9PVEhFUihTKSBcCi0gIChhb3V0X3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+b3RoZXIpCi0jZGVmaW5lIFNfR0VUX1RZUEUoUykgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPnR5cGUpCi0jZGVmaW5lIFNfR0VUX0RFU0MoUykgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPmRlc2MpCi0KLWFzZWN0aW9uICp0ZXh0X3NlY3Rpb24sICpkYXRhX3NlY3Rpb24sICpic3Nfc2VjdGlvbjsKLQotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woUyxQVU5UKQlvYmpfYW91dF9mcm9iX3N5bWJvbCAoUywgJlBVTlQpCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGUoKQkJb2JqX2FvdXRfZnJvYl9maWxlICgpCi1leHRlcm4gdm9pZCBvYmpfYW91dF9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBvYmpfYW91dF9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyhTRUMpCSgxKQotCi0jZWxzZQotCi0vKiBXZSB1c2UgdGhlIHN5X29iaiBmaWVsZCB0byByZWNvcmQgd2hldGhlciBhIHN5bWJvbCBpcyB3ZWFrLiAgKi8KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgY2hhcgotCi0vKgotICogIE1hY3JvcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKiAgVGhpcyBzeW50YXhpYyBpbmRpcmVjdGlvbiBhbGxvd3MgaW5kZXBlbmRlbmNlIHJlZ2FyZGluZyBhLm91dCBvciBjb2ZmLgotICogIFRoZSBhcmd1bWVudCAocykgb2YgYWxsIHRoZXNlIG1hY3JvcyBpcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKi8KLQotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfSVNfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotCi0vKiBUcnVlIGlmIHN5bWJvbCBoYXMgYmVlbiBkZWZpbmVkLCBpZSBpcyBpbiBOX3tURVhULERBVEEsQlNTLEFCU30gb3IgTl9FWFQgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpIFwKLSAgKFNfR0VUX1RZUEUgKHMpICE9IE5fVU5ERiB8fCBTX0dFVF9ERVNDIChzKSAhPSAwKQotCi0jZGVmaW5lIFNfSVNfQ09NTU9OKHMpIFwKLSAgKFNfR0VUX1RZUEUgKHMpID09IE5fVU5ERiAmJiBTX0dFVF9WQUxVRSAocykgIT0gMCkKLQotI2RlZmluZSBTX0lTX1JFR0lTVEVSKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPT0gTl9SRUdJU1RFUikKLQotLyogVHJ1ZSBpZiBhIGRlYnVnIHNwZWNpYWwgc3ltYm9sIGVudHJ5ICovCi0jZGVmaW5lIFNfSVNfREVCVUcocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1NUQUIpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGxvY2FsIHN5bWJvbCBuYW1lICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykgCQkJCQlcCi0gICgoU19HRVRfTkFNRSAocykgCQkJCQlcCi0gICAgJiYgIVNfSVNfREVCVUcgKHMpIAkJCQkJXAotICAgICYmIChzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMScpICE9IE5VTEwJCVwKLSAgICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDInKSAhPSBOVUxMCVwKLSAgICAgICAgfHwgKFNfTE9DQUxfTkFNRShzKSAmJiAhZmxhZ19rZWVwX2xvY2FscykpKQlcCi0gICB8fCAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZQkJCVwKLSAgICAgICAmJiAhIFNfSVNfRVhURVJOQUwocykJCQkJXAotICAgICAgICYmIFNfR0VUX1NFR01FTlQgKHMpID09IGFic29sdXRlX3NlY3Rpb24pKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KLSNkZWZpbmUgU19JU19FWFRFUk4ocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBoYXMgYmVlbiBnZW5lcmF0ZWQgYmVjYXVzZSBvZiBhIC5zdGFiZCBkaXJlY3RpdmUgKi8KLSNkZWZpbmUgU19JU19TVEFCRChzKQkJKFNfR0VUX05BTUUocykgPT0gKGNoYXIgKikwKQotCi0vKiBBY2Nlc3NvcnMgKi8KLS8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lKQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fc3RyeCkKLS8qIFRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fVFlQRSkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKE5fVFlQRV9zZWdbU19HRVRfVFlQRShzKV0pCi0vKiBUaGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX09USEVSKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlcikKLS8qIFRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9ERVNDKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjKQotLyogV2hldGhlciB0aGUgc3ltYm9sIGlzIHdlYWsuICAqLwotI2RlZmluZSBTX0dFVF9XRUFLKHMpCQkoKHMpLT5zeV9vYmopCi0KLS8qIE1vZGlmaWVycyAqLwotLyogQXNzdW1lIHRoYXQgYSBzeW1ib2wgY2Fubm90IGJlIHNpbXVsdGFuZW91c2x5IGluIG1vcmUgdGhhbiBvbiBzZWdtZW50ICovCi0vKiBzZXQgc2VnbWVudCAqLwotI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsc2VnKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX1RZUEUsKHMpLT5zeV9zeW1ib2wubl90eXBlfD1TRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHNlZykpCi0vKiBUaGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgfD0gTl9FWFQpCi0vKiBUaGUgc3ltYm9sIGlzIG5vdCBleHRlcm5hbCAqLwotI2RlZmluZSBTX0NMRUFSX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJj0gfk5fRVhUKQotLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX25hbWUgPSAodikpCi0vKiBTZXQgdGhlIG9mZnNldCBpbiB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfU0VUX09GRlNFVChzLHYpCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fc3RyeCA9ICh2KSkKLS8qIFNldCB0aGUgbl90eXBlIGZpZWxkICovCi0jZGVmaW5lIFNfU0VUX1RZUEUocyx0KQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9ICh0KSkKLS8qIFNldCB0aGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX09USEVSKHMsdikJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIgPSAodikpCi0vKiBTZXQgdGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX0RFU0Mocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYyA9ICh2KSkKLS8qIE1hcmsgdGhlIHN5bWJvbCBhcyB3ZWFrLiAgVGhpcyBjYXVzZXMgbl90eXBlIHRvIGJlIGFkanVzdGVkIHdoZW4KLSAgIHRoZSBzeW1ib2wgaXMgd3JpdHRlbiBvdXQuICAqLwotI2RlZmluZSBTX1NFVF9XRUFLKHMpCQkoKHMpLT5zeV9vYmogPSAxKQotCi0vKiBGaWxlIGhlYWRlciBtYWNybyBhbmQgdHlwZSBkZWZpbml0aW9uICovCi0KLSNkZWZpbmUgSF9HRVRfRklMRV9TSVpFKGgpCShIX0dFVF9IRUFERVJfU0laRShoKSBcCi0JCQkJICsgSF9HRVRfVEVYVF9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9EQVRBX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRShoKSBcCi0JCQkJICsgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX1NUUklOR19TSVpFKGgpKQotCi0jZGVmaW5lIEhfR0VUX0hFQURFUl9TSVpFKGgpCQkoRVhFQ19CWVRFU19TSVpFKQotI2RlZmluZSBIX0dFVF9URVhUX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX3RleHQpCi0jZGVmaW5lIEhfR0VUX0RBVEFfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfZGF0YSkKLSNkZWZpbmUgSF9HRVRfQlNTX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2JzcykKLSNkZWZpbmUgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfdHJzaXplKQotI2RlZmluZSBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoKQkoKGgpLT5oZWFkZXIuYV9kcnNpemUpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgpCSgoaCktPmhlYWRlci5hX3N5bXMpCi0jZGVmaW5lIEhfR0VUX0VOVFJZX1BPSU5UKGgpCQkoKGgpLT5oZWFkZXIuYV9lbnRyeSkKLSNkZWZpbmUgSF9HRVRfU1RSSU5HX1NJWkUoaCkJCSgoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9MSU5FTk9fU0laRShoKQkJKDApCi0KLSNkZWZpbmUgSF9HRVRfRFlOQU1JQyhoKQkJKChoKS0+aGVhZGVyLmFfaW5mbyA+PiAzMSkKLSNkZWZpbmUgSF9HRVRfVkVSU0lPTihoKQkJKCgoaCktPmhlYWRlci5hX2luZm8gPj4gMjQpICYgMHg3ZikKLSNkZWZpbmUgSF9HRVRfTUFDSFRZUEUoaCkJCSgoKGgpLT5oZWFkZXIuYV9pbmZvID4+IDE2KSAmIDB4ZmYpCi0jZGVmaW5lIEhfR0VUX01BR0lDX05VTUJFUihoKQkJKChoKS0+aGVhZGVyLmFfaW5mbyAmIDB4ZmZmZikKLQotI2RlZmluZSBIX1NFVF9EWU5BTUlDKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKCh2KSA8PCAzMSkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9WRVJTSU9OKGgpIDw8IDI0KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BQ0hUWVBFKGgpIDw8IDE2KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BR0lDX05VTUJFUihoKSkpKQotCi0jZGVmaW5lIEhfU0VUX1ZFUlNJT04oaCx2KQkJKChoKS0+aGVhZGVyLmFfaW5mbyA9ICgoSF9HRVRfRFlOQU1JQyhoKSA8PCAzMSkgXAotCQkJCQkJCSAgICAgICB8ICgodikgPDwgMjQpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFDSFRZUEUoaCkgPDwgMTYpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFHSUNfTlVNQkVSKGgpKSkpCi0KLSNkZWZpbmUgSF9TRVRfTUFDSFRZUEUoaCx2KQkJKChoKS0+aGVhZGVyLmFfaW5mbyA9ICgoSF9HRVRfRFlOQU1JQyhoKSA8PCAzMSkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9WRVJTSU9OKGgpIDw8IDI0KSBcCi0JCQkJCQkJICAgICAgIHwgKCh2KSA8PCAxNikgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUdJQ19OVU1CRVIoaCkpKSkKLQotI2RlZmluZSBIX1NFVF9NQUdJQ19OVU1CRVIoaCx2KQkJKChoKS0+aGVhZGVyLmFfaW5mbyA9ICgoSF9HRVRfRFlOQU1JQyhoKSA8PCAzMSkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9WRVJTSU9OKGgpIDw8IDI0KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BQ0hUWVBFKGgpIDw8IDE2KSBcCi0JCQkJCQkJICAgICAgIHwgKCh2KSkpKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV90ZXh0ID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfVEVYVCwgKHYpKSkKLSNkZWZpbmUgSF9TRVRfREFUQV9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX2RhdGEgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19EQVRBLCAodikpKQotI2RlZmluZSBIX1NFVF9CU1NfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9ic3MgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19CU1MsICh2KSkpCi0KLSNkZWZpbmUgSF9TRVRfUkVMT0NBVElPTl9TSVpFKGgsdCxkKQkoSF9TRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoKGgpLCh0KSksXAotCQkJCQkgSF9TRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoKGgpLChkKSkpCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV90cnNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfZHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRShoLHYpCSgoaCktPmhlYWRlci5hX3N5bXMgPSAodikgKiAxMikKLQotI2RlZmluZSBIX1NFVF9FTlRSWV9QT0lOVChoLHYpCQkoKGgpLT5oZWFkZXIuYV9lbnRyeSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1RSSU5HX1NJWkUoaCx2KQkJKChoKS0+c3RyaW5nX3RhYmxlX3NpemUgPSAodikpCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgZXhlYyBoZWFkZXI7CQkvKiBhLm91dCBoZWFkZXIgKi8KLSAgICBsb25nIHN0cmluZ190YWJsZV9zaXplOwkvKiBuYW1lcyArICdcMCcgKyBzaXplb2YoaW50KSAqLwotICB9Ci0KLW9iamVjdF9oZWFkZXJzOwotCi0vKiBsaW5lIG51bWJlcmluZyBzdHVmZi4gKi8KLSNkZWZpbmUgT0JKX0VNSVRfTElORU5PKGEsIGIsIGMpCXs7fQotCi1zdHJ1Y3QgZml4Owotdm9pZCB0Y19hb3V0X2ZpeF90b19jaGFycyBQQVJBTVMgKChjaGFyICp3aGVyZSwgc3RydWN0IGZpeCAqZml4UCwgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzKSk7Ci0KLSNlbmRpZgotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykJezt9Ci0KLSNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMJCTAKLQotI2RlZmluZSBBT1VUX1NUQUJTCi0KLS8qIGVuZCBvZiBvYmotYW91dC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ib3V0LmMgYi9nYXMvY29uZmlnL29iai1ib3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzk3MTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotYm91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qIGIub3V0IG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi1jb25zdCBzaG9ydAkJCS8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLwotICBzZWdfTl9UWVBFW10gPQotewotICBOX0FCUywKLSAgTl9URVhULAotICBOX0RBVEEsCi0gIE5fQlNTLAotICBOX1VOREYsCQkJLyogdW5rbm93biAqLwotICBOX1VOREYsCQkJLyogZXJyb3IgKi8KLSAgTl9VTkRGLAkJCS8qIGV4cHJlc3Npb24gKi8KLSAgTl9VTkRGLAkJCS8qIGRlYnVnICovCi0gIE5fVU5ERiwJCQkvKiBudHYgKi8KLSAgTl9VTkRGLAkJCS8qIHB0diAqLwotICBOX1JFR0lTVEVSLAkJCS8qIHJlZ2lzdGVyICovCi19OwotCi1jb25zdCBzZWdUIE5fVFlQRV9zZWdbTl9UWVBFICsgMl0gPQotewkJCQkvKiBOX1RZUEUgPT0gMHgxRSA9IDMyLTIgKi8KLSAgU0VHX1VOS05PV04sCQkJLyogTl9VTkRGID09IDAgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19BQlNPTFVURSwJCQkvKiBOX0FCUyA9PSAyICovCi0gIFNFR19HT09GLAotICBTRUdfVEVYVCwJCQkvKiBOX1RFWFQgPT0gNCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0RBVEEsCQkJLyogTl9EQVRBID09IDYgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19CU1MsCQkJLyogTl9CU1MgPT0gOCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfUkVHSVNURVIsCQkJLyogZHVtbXkgTl9SRUdJU1RFUiBmb3IgcmVncyA9IDMwICovCi0gIFNFR19HT09GLAotfTsKLQotc3RhdGljIHZvaWQgb2JqX2JvdXRfbGluZSBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsibGluZSIsIG9ial9ib3V0X2xpbmUsIDB9LAkvKiBzb3VyY2UgY29kZSBsaW5lIG51bWJlciAqLwotCi0vKiBjb2ZmIGRlYnVnZ2luZyBkaXJlY3RpdmVzLiAgQ3VycmVudGx5IGlnbm9yZWQgc2lsZW50bHkgKi8KLSAgeyJkZWYiLCBzX2lnbm9yZSwgMH0sCi0gIHsiZGltIiwgc19pZ25vcmUsIDB9LAotICB7ImVuZGVmIiwgc19pZ25vcmUsIDB9LAotICB7ImxuIiwgc19pZ25vcmUsIDB9LAotICB7InNjbCIsIHNfaWdub3JlLCAwfSwKLSAgeyJzaXplIiwgc19pZ25vcmUsIDB9LAotICB7InRhZyIsIHNfaWdub3JlLCAwfSwKLSAgeyJ0eXBlIiwgc19pZ25vcmUsIDB9LAotICB7InZhbCIsIHNfaWdub3JlLCAwfSwKLQotLyogb3RoZXIgc3R1ZmYgd2UgZG9uJ3QgaGFuZGxlICovCi0gIHsiQUJPUlQiLCBzX2lnbm9yZSwgMH0sCi0gIHsiaWRlbnQiLCBzX2lnbm9yZSwgMH0sCi0KLSAge05VTEx9CQkJLyogZW5kIHNlbnRpbmVsICovCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0KLS8qIFJlbG9jYXRpb24uICovCi0KLS8qCi0gKgkJZW1pdF9yZWxvY2F0aW9ucygpCi0gKgotICogQ3Jhd2wgYWxvbmcgYSBmaXhTIGNoYWluLiBFbWl0IHRoZSBzZWdtZW50J3MgcmVsb2NhdGlvbnMuCi0gKi8KLXZvaWQKLW9ial9lbWl0X3JlbG9jYXRpb25zICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgZml4UyAqZml4UDsJCS8qIEZpeHVwIGNoYWluIGZvciB0aGlzIHNlZ21lbnQuICovCi0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgPT0gMAotCSAgfHwgZml4UC0+Znhfcl90eXBlICE9IE5PX1JFTE9DKQotCXsKLQkgIHN5bWJvbFMgKnN5bTsKLQotCSAgc3ltID0gZml4UC0+ZnhfYWRkc3k7Ci0JICB3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JCSAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCSAgICBzeW0gPSBzeW0tPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQkgIGZpeFAtPmZ4X2FkZHN5ID0gc3ltOwotCi0JICB0Y19ib3V0X2ZpeF90b19jaGFycyAoKndoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSk7Ci0JICAqd2hlcmUgKz0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLQl9CQkJLyogaWYgdGhlcmUncyBhIHN5bWJvbCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggZml4dXAgKi8KLQotfQkJCQkvKiBlbWl0X3JlbG9jYXRpb25zKCkgKi8KLQotLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLQotLyogQ29udmVydCBhIGx2YWx1ZSB0byBtYWNoaW5lIGRlcGVuZGVudCBkYXRhICovCi12b2lkCi1vYmpfaGVhZGVyX2FwcGVuZCAod2hlcmUsIGhlYWRlcnMpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIC8qIEFsd2F5cyBsZWF2ZSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KLQotICBoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFtTRUdfVEVYVF07Ci0KLSAgaWYgKGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiA8IDIpCi0gICAgewotICAgICAgaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduID0gMjsKLSAgICB9CQkJCS8qIGZvcmNlIHRvIGF0IGxlYXN0IDIgKi8KLQotICBoZWFkZXJzLT5oZWFkZXIuYV9kYWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFtTRUdfREFUQV07Ci0gIGhlYWRlcnMtPmhlYWRlci5hX2JhbGlnbiA9IHNlY3Rpb25fYWxpZ25tZW50W1NFR19CU1NdOwotCi0gIGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkID0gMDsKLSAgaGVhZGVycy0+aGVhZGVyLmFfZGxvYWQgPSBtZF9zZWN0aW9uX2FsaWduIChTRUdfREFUQSwgSF9HRVRfVEVYVF9TSVpFIChoZWFkZXJzKSk7Ci0KLSAgaGVhZGVycy0+aGVhZGVyLmFfcmVsYXhhYmxlID0gbGlua3JlbGF4OwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfbWFnaWMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfbWFnaWMpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfbWFnaWMpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfdGV4dCwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3RleHQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZGF0YSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2RhdGEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfYnNzLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2JzcykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfc3ltcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3N5bXMpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZW50cnksIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZW50cnkpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZW50cnkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfdGxvYWQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGxvYWQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGxvYWQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZGxvYWQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGxvYWQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGxvYWQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbikpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24pOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2RhbGlnbikpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYWxpZ24pOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfYmFsaWduLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2JhbGlnbikpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24pOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfcmVsYXhhYmxlLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9yZWxheGFibGUpOwotI2Vsc2UgLyogISBDUk9TU19DT01QSUxFICovCi0gIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZoZWFkZXJzLT5oZWFkZXIsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyKSk7Ci0jZW5kaWYgLyogISBDUk9TU19DT01QSUxFICovCi19CQkJCS8qIGFfaGVhZGVyX2FwcGVuZCgpICovCi0KLXZvaWQKLW9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihTX0dFVF9PRkZTRVQgKHN5bWJvbFApKSwgU19HRVRfT0ZGU0VUIChzeW1ib2xQKSwgc2l6ZW9mIChTX0dFVF9PRkZTRVQgKHN5bWJvbFApKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihTX0dFVF9ERVNDIChzeW1ib2xQKSksIFNfR0VUX0RFU0MgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX0RFU0MgKHN5bWJvbFApKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlLCBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemVvZiAoc3ltYm9sUC0+c3lfc3ltYm9sLm5fdmFsdWUpKTsKLQotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmc3ltYm9sUC0+c3lfc3ltYm9sLCBzaXplb2YgKG9ial9zeW1ib2xfdHlwZSkpOwotfQkJCQkvKiBvYmpfc3ltYm9sX3RvX2NoYXJzKCkgKi8KLQotdm9pZAotb2JqX2VtaXRfc3ltYm9scyAod2hlcmUsIHN5bWJvbF9yb290UCkKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyoKLQkgKiBFbWl0IGFsbCBzeW1ib2xzIGxlZnQgaW4gdGhlIHN5bWJvbCBjaGFpbi4KLQkgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFVzZWQgdG8gc2F2ZSB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lLiBJdCBpcyB1c2VkIHRvIHBvaW50Ci0JCSAgIHRvIHRoZSBzdHJpbmcgaW4gbWVtb3J5IGJ1dCBtdXN0IGJlIGEgZmlsZSBvZmZzZXQuICovCi0gICAgICBjaGFyICp0ZW1wOwotCi0gICAgICB0ZW1wID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9PRkZTRVQgKHN5bWJvbFAsIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0KTsKLQotICAgICAgLyogQW55IHN5bWJvbCBzdGlsbCB1bmRlZmluZWQgYW5kIGlzIG5vdCBhIGRiZyBzeW1ib2wgaXMgbWFkZSBOX0VYVC4gKi8KLSAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkgJiYgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCi0gICAgICBvYmpfc3ltYm9sX3RvX2NoYXJzICh3aGVyZSwgc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9OQU1FIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci19CQkJCS8qIGVtaXRfc3ltYm9scygpICovCi0KLXZvaWQKLW9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIFNfU0VUX09USEVSIChzeW1ib2xQLCAwKTsKLSAgU19TRVRfREVTQyAoc3ltYm9sUCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfYm91dF9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIEFzc3VtZSBkZWxpbWl0ZXIgaXMgcGFydCBvZiBleHByZXNzaW9uLiAqLwotICAvKiBCU0Q0LjIgYXMgZmFpbHMgd2l0aCBkZWxpZ2h0ZnVsIGJ1Zywgc28gd2UgKi8KLSAgLyogYXJlIG5vdCBiZWluZyBpbmNvbXBhdGlibGUgaGVyZS4gKi8KLSAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgKGludCkgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIG9ial9ib3V0X2xpbmUoKSAqLwotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci19Ci0KLXZvaWQKLW9ial9jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBzeW1ib2xTICoqc3ltYm9sUFA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLQotICB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpOwotCi0gIHN5bWJvbFBQID0gJnN5bWJvbF9yb290UDsJLyotPmxhc3Qgc3ltYm9sIGNoYWluIGxpbmsuICovCi0gIHdoaWxlICgoc3ltYm9sUCA9ICpzeW1ib2xQUCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgJiYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKSkKLQl7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfVEVYVCk7Ci0JfQkJCS8qIGlmIHB1c2luZyBkYXRhIGludG8gdGV4dCAqLwotCi0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLSAgICAgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgotCSBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkpCi0JewotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPSywgaGVyZSBpcyBob3cgd2UgZGVjaWRlIHdoaWNoIHN5bWJvbHMgZ28gb3V0IGludG8gdGhlCi0JIGJyYXZlIG5ldyBzeW10YWIuICBTeW1ib2xzIHRoYXQgZG8gYXJlOgotCQkKLQkgKiBzeW1ib2xzIHdpdGggbm8gbmFtZSAoc3RhYmQncz8pCi0JICogc3ltYm9scyB3aXRoIGRlYnVnIGluZm8gaW4gdGhlaXIgTl9UWVBFCi0JCQotCSBTeW1ib2xzIHRoYXQgZG9uJ3QgYXJlOgotCSAqIHN5bWJvbHMgdGhhdCBhcmUgcmVnaXN0ZXJzCi0JICogc3ltYm9scyB3aXRoIFwxIGFzIHRoZWlyIDNyZCBjaGFyYWN0ZXIgKG51bWVyaWMgbGFiZWxzKQotCSAqICJsb2NhbCBsYWJlbHMiIGFzIGRlZmluZWQgYnkgU19MT0NBTF9OQU1FKG5hbWUpCi0JIGlmIHRoZSAtTCBzd2l0Y2ggd2FzIHBhc3NlZCB0byBnYXMuCi0JCQotCSBBbGwgb3RoZXIgc3ltYm9scyBhcmUgb3V0cHV0LiAgV2UgY29tcGxhaW4gaWYgYSBkZWxldGVkCi0JIHN5bWJvbCB3YXMgbWFya2VkIGV4dGVybmFsLiAqLwotCi0KLSAgICAgIGlmICgxCi0JICAmJiAhU19JU19SRUdJU1RFUiAoc3ltYm9sUCkKLQkgICYmICghU19HRVRfTkFNRSAoc3ltYm9sUCkKLQkgICAgICB8fCBTX0lTX0RFQlVHIChzeW1ib2xQKQotI2lmZGVmIFRDX0k5NjAKLSAgICAgIC8qIEZJWE1FLVNPT04gdGhpcyBpZmRlZiBzZWVtcyBoaWdobHkgZHViaW91cyB0byBtZS4gIHhveG9yaWNoLiAqLwotCSAgICAgIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JICAgICAgfHwgKFNfR0VUX05BTUUgKHN5bWJvbFApWzBdICE9ICdcMDAxJyAmJiAoZmxhZ19rZWVwX2xvY2FscyB8fCAhU19MT0NBTF9OQU1FIChzeW1ib2xQKSkpKSkKLQl7Ci0JICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyKys7Ci0KLQkgIC8qIFRoZSArIDEgYWZ0ZXIgc3RybGVuIGFjY291bnQgZm9yIHRoZSBcMCBhdCB0aGUKLQkJCSAgIGVuZCBvZiBlYWNoIHN0cmluZyAqLwotCSAgaWYgKCFTX0lTX1NUQUJEIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIC8qIE9yZGluYXJ5IGNhc2UuICovCi0JICAgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSBzdHJpbmdfYnl0ZV9jb3VudDsKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBzdHJsZW4gKFNfR0VUX05BTUUgKHN5bWJvbFApKSArIDE7Ci0JICAgIH0KLQkgIGVsc2UJCQkvKiAuU3RhYmQgY2FzZS4gKi8KLQkgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCSAgc3ltYm9sUFAgPSAmKHN5bWJvbF9uZXh0IChzeW1ib2xQKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgICB9CQkJLyogb29wcy4gKi8KLQotCSAgLyogVW5ob29rIGl0IGZyb20gdGhlIGNoYWluICovCi0JICAqc3ltYm9sUFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCk7Ci0JfQkJCS8qIGlmIHRoaXMgc3ltYm9sIHNob3VsZCBiZSBpbiB0aGUgb3V0cHV0ICovCi0gICAgfQkJCQkvKiBmb3IgZWFjaCBzeW1ib2wgKi8KLQotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaGVhZGVycywgc3ltYm9sX251bWJlcik7Ci19Ci0KLS8qCi0gKiBGaW5kIHN0cmluZ3MgYnkgY3Jhd2xpbmcgYWxvbmcgc3ltYm9sIHRhYmxlIGNoYWluLgotICovCi0KLXZvaWQKLW9ial9lbWl0X3N0cmluZ3MgKHdoZXJlKQotICAgICBjaGFyICoqd2hlcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSNpZmRlZiBDUk9TU19DT01QSUxFCi0gIC8qIEdvdHRhIGRvIG1kXyBieXRlLW9yZGVyaW5nIHN0dWZmIGZvciBzdHJpbmdfYnl0ZV9jb3VudCBmaXJzdCAtIEtXSyAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgc3RyaW5nX2J5dGVfY291bnQsIHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpOwotI2Vsc2UgLyogQ1JPU1NfQ09NUElMRSAqLwotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmc3RyaW5nX2J5dGVfY291bnQsICh1bnNpZ25lZCBsb25nKSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0jZW5kaWYgLyogQ1JPU1NfQ09NUElMRSAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpCi0JYXBwZW5kICh3aGVyZSwgU19HRVRfTkFNRSAoc3ltYm9sUCksICh1bnNpZ25lZCBsb25nKSAoc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxKSk7Ci0gICAgfQkJCQkvKiB3YWxrIHN5bWJvbCBjaGFpbiAqLwotfQotCi0vKiBlbmQgb2Ygb2JqLWJvdXQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYm91dC5oIGIvZ2FzL2NvbmZpZy9vYmotYm91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUzOWEwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWJvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKiBiLm91dCBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCi0gICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIENhbWJyaWRnZSwgTUEKLSAgIDAyMTM5LCBVU0EuICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mICdhLm91dC5oJy4gIEl0IGlzIHRvIGJlIHVzZWQgaW4gYWxsIEdOVQotICogdG9vbHMgbW9kaWZpZWQgdG8gc3VwcG9ydCB0aGUgaTgwOTYwIGIub3V0IGZvcm1hdCAob3IgdG9vbHMgdGhhdCBvcGVyYXRlIG9uCi0gKiBvYmplY3QgZmlsZXMgY3JlYXRlZCBieSBzdWNoIHRvb2xzKS4KLSAqCi0gKiBBbGwgaTgwOTYwIGRldmVsb3BtZW50IGlzIGRvbmUgaW4gYSBDUk9TUy1ERVZFTE9QTUVOVCBlbnZpcm9ubWVudC4gIEkuZS4sCi0gKiBvYmplY3QgY29kZSBpcyBnZW5lcmF0ZWQgb24sIGFuZCBleGVjdXRlZCB1bmRlciB0aGUgZGlyZWN0aW9uIG9mIGEgc3ltYm9saWMKLSAqIGRlYnVnZ2VyIHJ1bm5pbmcgb24sIGEgaG9zdCBzeXN0ZW0uICBXZSBkbyBub3Qgd2FudCB0byBiZSBzdWJqZWN0IHRvIHRoZQotICogdmFnYXJpZXMgb2Ygd2hpY2ggaG9zdCBpdCBpcyBvciB3aGV0aGVyIGl0IHN1cHBvcnRzIENPRkYgb3IgYS5vdXQgZm9ybWF0LCBvcgotICogYW55dGhpbmcgZWxzZS4gIFdlIERPIHdhbnQgdG86Ci0gKgotICoJbyBhbHdheXMgZ2VuZXJhdGUgdGhlIHNhbWUgZm9ybWF0IG9iamVjdCBmaWxlcywgcmVnYXJkbGVzcyBvZiBob3N0LgotICoKLSAqCW8gaGF2ZSBhbiAnYS5vdXQnIGhlYWRlciB0aGF0IHdlIGNhbiBtb2RpZnkgZm9yIG91ciBvd24gcHVycG9zZXMKLSAqCSAgKHRoZSA4MDk2MCBpcyB0eXBpY2FsbHkgYW4gZW1iZWRkZWQgcHJvY2Vzc29yIGFuZCBtYXkgcmVxdWlyZQotICoJICBlbmhhbmNlZCBsaW5rZXIgc3VwcG9ydCB0aGF0IHRoZSBub3JtYWwgYS5vdXQuaCBoZWFkZXIgY2FuJ3QKLSAqCSAgYWNjb21tb2RhdGUpLgotICoKLSAqIEFzIGZvciBieXRlLW9yZGVyaW5nLCB0aGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgotICoKLSAqCW8gVGV4dCBhbmQgZGF0YSB0aGF0IGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCBpcyBhbHdheXMKLSAqCSAgaW4gaTgwOTYwIChsaXR0bGUtZW5kaWFuKSBvcmRlci4KLSAqCi0gKglvIEFsbCBvdGhlciBudW1iZXJzIChpbiB0aGUgaGVhZGVyLCBzeW1ib2xzLCByZWxvY2F0aW9uIGRpcmVjdGl2ZXMpCi0gKgkgIGFyZSBpbiBob3N0IGJ5dGUtb3JkZXI6ICBvYmplY3QgZmlsZXMgQ0FOTk9UIGJlIGxpZnRlZCBmcm9tIGEKLSAqCSAgbGl0dGxlLWVuZCBob3N0IGFuZCB1c2VkIG9uIGEgYmlnLWVuZGlhbiAob3IgdmljZSB2ZXJzYSkgd2l0aG91dAotICoJICBtb2RpZmljYXRpb24uCi0gKiA9PT4gVEhJUyBJUyBOTyBMT05HRVIgVFJVRSBVU0lORyBCRkQuICBXRSBDQU4gR0VORVJBVEUgQU5ZIEJZVEUgT1JERVIKLSAqICAgICBGT1IgVEhFIEhFQURFUiwgQU5EIFJFQUQgQU5ZIEJZVEUgT1JERVIuICBQUkVGRVJFTkNFIFdPVUxEIEJFIFRPCi0gKiAgICAgVVNFIExJVFRMRS1FTkRJQU4gQllURSBPUkRFUiBUSFJPVUdIT1VULCBSRUdBUkRMRVNTIE9GIEhPU1QuICA8PT0KLSAqCi0gKglvIFRoZSBkb3dubG9hZGVyICgnY29tbTk2MCcpIHRha2VzIGNhcmUgdG8gZ2VuZXJhdGUgYSBwc2V1ZG8taGVhZGVyCi0gKgkgIHdpdGggY29ycmVjdCAoaTgwOTYwKSBieXRlLW9yZGVyaW5nIGJlZm9yZSBzaGlwcGluZyB0ZXh0IGFuZCBkYXRhCi0gKgkgIG9mZiB0byB0aGUgTklORFkgbW9uaXRvciBpbiB0aGUgdGFyZ2V0IHN5c3RlbXMuICBTeW1ib2xzIGFuZAotICoJICByZWxvY2F0aW9uIGluZm8gYXJlIG5ldmVyIHNlbnQgdG8gdGhlIHRhcmdldC4KLSAqLwotCi0KLSNkZWZpbmUgT0JKX0JPVVQgMQotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNkZWZpbmUgT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRQkiYi5vdXQiCi0KLWV4dGVybiBjb25zdCBzaG9ydCBzZWdfTl9UWVBFW107Ci1leHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107Ci0KLSNkZWZpbmUgQk1BR0lDCTA0MTUKLS8qIFdlIGRvbid0IGFjY2VwdCB0aGUgZm9sbG93aW5nIChzZWUgTl9CQURNQUcgbWFjcm8pLgotICogVGhleSdyZSBqdXN0IGhlcmUgc28gR05VIGNvZGUgd2lsbCBjb21waWxlLgotICovCi0jZGVmaW5lCU9NQUdJQwkwNDA3CQkvKiBvbGQgaW1wdXJlIGZvcm1hdCAqLwotI2RlZmluZQlOTUFHSUMJMDQxMAkJLyogcmVhZC1vbmx5IHRleHQgKi8KLSNkZWZpbmUJWk1BR0lDCTA0MTMJCS8qIGRlbWFuZCBsb2FkIGZvcm1hdCAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJKEJNQUdJQykKLSNlbmRpZiAvKiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKi8KLQotLyogRklMRSBIRUFERVIKLSAqCUFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICoJQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotICoJCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0gKgkJYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLgotICovCi1zdHJ1Y3QgZXhlYwotICB7Ci0gICAgLyogU3RhbmRhcmQgc3R1ZmYgKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfbWFnaWM7CS8qIElkZW50aWZpZXMgdGhpcyBhcyBhIGIub3V0IGZpbGUJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfdGV4dDsJLyogTGVuZ3RoIG9mIHRleHQJCQkqLwotICAgIHVuc2lnbmVkIGxvbmcgYV9kYXRhOwkvKiBMZW5ndGggb2YgZGF0YQkJCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX2JzczsJLyogTGVuZ3RoIG9mIHJ1bnRpbWUgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfc3ltczsJLyogTGVuZ3RoIG9mIHN5bWJvbCB0YWJsZQkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIFJ1bnRpbWUgc3RhcnQgYWRkcmVzcwkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOwkvKiBMZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBMZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8JKi8KLQotICAgIC8qIEFkZGVkIGZvciBpOTYwICovCi0gICAgdW5zaWduZWQgbG9uZyBhX3Rsb2FkOwkvKiBUZXh0IHJ1bnRpbWUgbG9hZCBhZGRyZXNzCQkqLwotICAgIHVuc2lnbmVkIGxvbmcgYV9kbG9hZDsJLyogRGF0YSBydW50aW1lIGxvYWQgYWRkcmVzcwkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50CQkqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9kYWxpZ247CS8qIEFsaWdubWVudCBvZiBkYXRhIHNlZ21lbnQJCSovCi0gICAgdW5zaWduZWQgY2hhciBhX2JhbGlnbjsJLyogQWxpZ25tZW50IG9mIGJzcyBzZWdtZW50CQkqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9yZWxheGFibGU7CS8qIENvbnRhaW5zIGVub3VnaCBpbmZvIHRvIHJlbGF4ICAgICAqLwotICB9OwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSgoKHgpLmFfbWFnaWMpIT1CTUFHSUMpCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCSggc2l6ZW9mKHN0cnVjdCBleGVjKSApCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKLSNkZWZpbmUgTl9UUk9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZGVmaW5lIE5fRFJPRkYoeCkJKCBOX1RST0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RST0ZGKHgpICsgKHgpLmFfZHJzaXplICkKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotCi0vKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gKi8KLXN0cnVjdCBubGlzdAotICB7Ci0gICAgdW5pb24KLSAgICAgIHsKLQljaGFyICpuX25hbWU7Ci0Jc3RydWN0IG5saXN0ICpuX25leHQ7Ci0JbG9uZyBuX3N0cng7CQkvKiBJbmRleCBpbnRvIHN0cmluZyB0YWJsZQkqLwotICAgICAgfQotICAgIG5fdW47Ci0gICAgdW5zaWduZWQgY2hhciBuX3R5cGU7CS8qIFNlZSBiZWxvdwkJCQkqLwotICAgIGNoYXIgbl9vdGhlcjsJCS8qIFVzZWQgaW4gaTgwOTYwIHN1cHBvcnQgLS0gc2VlIGJlbG93CSovCi0gICAgc2hvcnQgbl9kZXNjOwotICAgIHVuc2lnbmVkIGxvbmcgbl92YWx1ZTsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgbmxpc3Qgb2JqX3N5bWJvbF90eXBlOwotCi0vKiBMZWdhbCB2YWx1ZXMgb2Ygbl90eXBlCi0gKi8KLSNkZWZpbmUgTl9VTkRGCTAJCS8qIFVuZGVmaW5lZCBzeW1ib2wJKi8KLSNkZWZpbmUgTl9BQlMJMgkJLyogQWJzb2x1dGUgc3ltYm9sCSovCi0jZGVmaW5lIE5fVEVYVAk0CQkvKiBUZXh0IHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9EQVRBCTYJCS8qIERhdGEgc3ltYm9sCQkqLwotI2RlZmluZSBOX0JTUwk4CQkvKiBCU1Mgc3ltYm9sCQkqLwotI2RlZmluZSBOX0ZOCTMxCQkvKiBGaWxlbmFtZSBzeW1ib2wJKi8KLQotI2RlZmluZSBOX0VYVAkxCQkvKiBFeHRlcm5hbCBzeW1ib2wgKE9SJ2QgaW4gd2l0aCBvbmUgb2YgYWJvdmUpCSovCi0jZGVmaW5lIE5fVFlQRQkwMzYJCS8qIE1hc2sgZm9yIGFsbCB0aGUgdHlwZSBiaXRzCQkJKi8KLSNkZWZpbmUgTl9TVEFCCTAzNDAJCS8qIE1hc2sgZm9yIGFsbCBiaXRzIHVzZWQgZm9yIFNEQiBlbnRyaWVzIAkqLwotCi0jaWZuZGVmIENVU1RPTV9SRUxPQ19GT1JNQVQKLXN0cnVjdCByZWxvY2F0aW9uX2luZm8KLSAgewotICAgIGludCByX2FkZHJlc3M7CQkvKiBGaWxlIGFkZHJlc3Mgb2YgaXRlbSB0byBiZSByZWxvY2F0ZWQJKi8KLSAgICB1bnNpZ25lZAotICAgICAgcl9pbmRleDoyNCwJCS8qIEluZGV4IG9mIHN5bWJvbCBvbiB3aGljaCByZWxvY2F0aW9uIGlzIGJhc2VkKi8KLSAgICAgIHJfcGNyZWw6MSwJCS8qIDEgPT4gcmVsb2NhdGUgUEMtcmVsYXRpdmU7IGVsc2UgYWJzb2x1dGUKLQkJICoJT24gaTk2MCwgcGMtcmVsYXRpdmUgaW1wbGllcyAyNC1iaXQKLQkJICoJYWRkcmVzcywgYWJzb2x1dGUgaW1wbGllcyAzMi1iaXQuCi0JCSAqLwotICAgICAgcl9sZW5ndGg6MiwJCS8qIE51bWJlciBvZiBieXRlcyB0byByZWxvY2F0ZToKLQkJICoJMCA9PiAxIGJ5dGUKLQkJICoJMSA9PiAyIGJ5dGVzCi0JCSAqCTIgPT4gNCBieXRlcyAtLSBvbmx5IHZhbHVlIHVzZWQgZm9yIGk5NjAKLQkJICovCi0gICAgICByX2V4dGVybjoxLCByX2JzcjoxLAkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0gICAgICByX2Rpc3A6MSwJCQkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0gICAgICByX2NhbGxqOjEsCQkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLwotICAgICAgbnV0aGluOjE7CQkJLyogVW51c2VkCQkJCSovCi0gIH07Ci0KLSNlbmRpZiAvKiBDVVNUT01fUkVMT0NfRk9STUFUICovCi0KLS8qCi0gKiAgTWFjcm9zIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqICBUaGlzIHN5bnRheGljIGluZGlyZWN0aW9uIGFsbG93cyBpbmRlcGVuZGVuY2UgcmVnYXJkaW5nIGEub3V0IG9yIGNvZmYuCi0gKiAgVGhlIGFyZ3VtZW50IChzKSBvZiBhbGwgdGhlc2UgbWFjcm9zIGlzIGEgcG9pbnRlciB0byBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqLwotCi0vKiBQcmVkaWNhdGVzICovCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0KLS8qIFRydWUgaWYgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQsIGllIGlzIGluIE5fe1RFWFQsREFUQSxCU1MsQUJTfSBvciBOX0VYVCAqLwotI2RlZmluZSBTX0lTX0RFRklORUQocykJCSgoU19HRVRfVFlQRShzKSAhPSBOX1VOREYpIHx8IChTX0dFVF9ERVNDKHMpICE9IDApKQotCi0jZGVmaW5lIFNfSVNfQ09NTU9OKHMpIFwKLSAgKFNfR0VUX1RZUEUgKHMpID09IE5fVU5ERiAmJiBTX0dFVF9WQUxVRSAocykgIT0gMCkKLQotI2RlZmluZSBTX0lTX1JFR0lTVEVSKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPT0gTl9SRUdJU1RFUikKLQotLyogVHJ1ZSBpZiBhIGRlYnVnIHNwZWNpYWwgc3ltYm9sIGVudHJ5ICovCi0jZGVmaW5lIFNfSVNfREVCVUcocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1NUQUIpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGxvY2FsIHN5bWJvbCBuYW1lICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykgCQkJCQlcCi0gICgoU19HRVRfTkFNRSAocykgCQkJCQlcCi0gICAgJiYgIVNfSVNfREVCVUcgKHMpIAkJCQkJXAotICAgICYmIChzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMScpICE9IE5VTEwJCVwKLSAgICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDInKSAhPSBOVUxMCVwKLSAgICAgICAgfHwgKFNfTE9DQUxfTkFNRShzKSAmJiAhZmxhZ19rZWVwX2xvY2FscykpKQlcCi0gICB8fCAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZQkJCVwKLSAgICAgICAmJiAhU19JU19FWFRFUk5BTChzKQkJCQlcCi0gICAgICAgJiYgU19HRVRfU0VHTUVOVChzKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCi0jZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IE5VTEwpCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX25hbWUpCi0vKiBUaGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfR0VUX09GRlNFVChzKQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9zdHJ4KQotLyogVGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9UWVBFKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9UWVBFKQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKQkoTl9UWVBFX3NlZ1tTX0dFVF9UWVBFKHMpXSkKLS8qIFRoZSBuX290aGVyIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfT1RIRVIocykJCSgocyktPnN5X3N5bWJvbC5uX290aGVyKQotLyogVGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX0RFU0MocykJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MpCi0KLS8qIE1vZGlmaWVycyAqLwotLyogQXNzdW1lIHRoYXQgYSBzeW1ib2wgY2Fubm90IGJlIHNpbXVsdGFuZW91c2x5IGluIG1vcmUgdGhhbiBvbiBzZWdtZW50ICovCi0vKiBzZXQgc2VnbWVudCAqLwotI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsc2VnKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX1RZUEUsKHMpLT5zeV9zeW1ib2wubl90eXBlfD1TRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHNlZykpCi0vKiBUaGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgfD0gTl9FWFQpCi0vKiBUaGUgc3ltYm9sIGlzIG5vdCBleHRlcm5hbCAqLwotI2RlZmluZSBTX0NMRUFSX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJj0gfk5fRVhUKQotLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX25hbWUgPSAodikpCi0vKiBTZXQgdGhlIG9mZnNldCBpbiB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfU0VUX09GRlNFVChzLHYpCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fc3RyeCA9ICh2KSkKLS8qIFNldCB0aGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX09USEVSKHMsdikJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIgPSAodikpCi0vKiBTZXQgdGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX0RFU0Mocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYyA9ICh2KSkKLS8qIFNldCB0aGUgbl90eXBlIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX1RZUEUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9ICh2KSkKLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0jZGVmaW5lIEhfR0VUX0ZJTEVfU0laRShoKQkoc2l6ZW9mKHN0cnVjdCBleGVjKSArIFwKLQkJCQkgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpICsgXAotCQkJCSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSArIFwKLQkJCQkgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkgKyBcCi0JCQkJIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpICsgXAotCQkJCSAoaCktPnN0cmluZ190YWJsZV9zaXplKQotCi0jZGVmaW5lIEhfR0VUX0hFQURFUl9TSVpFKGgpCQkoc2l6ZW9mKHN0cnVjdCBleGVjKSkKLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCi0jZGVmaW5lIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX3Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfZHJzaXplKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoKGgpLT5oZWFkZXIuYV9zeW1zKQotI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkJCSgoaCktPmhlYWRlci5hX2luZm8pCi0jZGVmaW5lIEhfR0VUX0VOVFJZX1BPSU5UKGgpCQkoKGgpLT5oZWFkZXIuYV9lbnRyeSkKLSNkZWZpbmUgSF9HRVRfU1RSSU5HX1NJWkUoaCkJCSgoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9MSU5FTk9fU0laRShoKQkJKDApCi0KLSNpZmRlZiBFWEVDX01BQ0hJTkVfVFlQRQotI2RlZmluZSBIX0dFVF9NQUNISU5FX1RZUEUoaCkJCSgoaCktPmhlYWRlci5hX21hY2h0eXBlKQotI2VuZGlmIC8qIEVYRUNfTUFDSElORV9UWVBFICovCi0jaWZkZWYgRVhFQ19WRVJTSU9OCi0jZGVmaW5lIEhfR0VUX1ZFUlNJT04oaCkJCSgoaCktPmhlYWRlci5hX3ZlcnNpb24pCi0jZW5kaWYgLyogRVhFQ19WRVJTSU9OICovCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX3RleHQgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9kYXRhID0gKHYpKQotI2RlZmluZSBIX1NFVF9CU1NfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9ic3MgPSAodikpCi0KLSNkZWZpbmUgSF9TRVRfUkVMT0NBVElPTl9TSVpFKGgsdCxkKQkoSF9TRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoKGgpLCh0KSksXAotCQkJCQkgSF9TRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoKGgpLChkKSkpCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV90cnNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfZHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRShoLHYpCSgoaCktPmhlYWRlci5hX3N5bXMgPSAodikgKiBcCi0JCQkJCSBzaXplb2Yoc3RydWN0IG5saXN0KSkKLQotI2RlZmluZSBIX1NFVF9NQUdJQ19OVU1CRVIoaCx2KQkJKChoKS0+aGVhZGVyLmFfbWFnaWMgPSAodikpCi0KLSNkZWZpbmUgSF9TRVRfRU5UUllfUE9JTlQoaCx2KQkJKChoKS0+aGVhZGVyLmFfZW50cnkgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikJCSgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotI2lmZGVmIEVYRUNfTUFDSElORV9UWVBFCi0jZGVmaW5lIEhfU0VUX01BQ0hJTkVfVFlQRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9tYWNodHlwZSA9ICh2KSkKLSNlbmRpZiAvKiBFWEVDX01BQ0hJTkVfVFlQRSAqLwotI2lmZGVmIEVYRUNfVkVSU0lPTgotI2RlZmluZSBIX1NFVF9WRVJTSU9OKGgsdikJCSgoaCktPmhlYWRlci5hX3ZlcnNpb24gPSAodikpCi0jZW5kaWYgLyogRVhFQ19WRVJTSU9OICovCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgZXhlYyBoZWFkZXI7CQkvKiBhLm91dCBoZWFkZXIgKi8KLSAgICBsb25nIHN0cmluZ190YWJsZV9zaXplOwkvKiBuYW1lcyArICdcMCcgKyBzaXplb2YoaW50KSAqLwotICB9Ci0KLW9iamVjdF9oZWFkZXJzOwotCi0vKiB1bnVzZWQgaG9va3MuICovCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLCBiLCBjKQl7O30KLSNkZWZpbmUgb2JqX3ByZV93cml0ZV9ob29rKGEpCQl7O30KLQotI2lmIF9fU1REQ19fCi1zdHJ1Y3QgZml4OwotI2VuZGlmCi1leHRlcm4gdm9pZCB0Y19hb3V0X2ZpeF90b19jaGFycyBQQVJBTVMgKChjaGFyICp3aGVyZSwKLQkJCQkJICBzdHJ1Y3QgZml4ICpmaXhQLAotCQkJCQkgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzcykpOwotZXh0ZXJuIHZvaWQgdGNfYm91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsCi0JCQkJCSAgc3RydWN0IGZpeCAqZml4UCwKLQkJCQkJICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3MpKTsKLQotI2RlZmluZSBBT1VUX1NUQUJTCi0KLS8qIGVuZCBvZiBvYmotYm91dC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1jb2ZmLmMgYi9nYXMvY29uZmlnL29iai1jb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGM3M2MuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYyNSArMCwwIEBACi0vKiBjb2ZmIG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1jb2ZmLmgiCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLS8qIEkgdGhpbmsgdGhpcyBpcyBwcm9iYWJseSBhbHdheXMgY29ycmVjdC4gICovCi0jaWZuZGVmIEtFRVBfUkVMT0NfSU5GTwotI2RlZmluZSBLRUVQX1JFTE9DX0lORk8KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBvYmpfY29mZl9ic3MgUEFSQU1TICgoaW50KSk7Ci1jb25zdCBjaGFyICpzX2dldF9uYW1lIFBBUkFNUyAoKHN5bWJvbFMgKiBzKSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9sbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2RlZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2VuZGVmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfZGltIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfbGluZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX3NpemUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9zY2wgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl90YWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl92YWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl90eXBlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfaWRlbnQgUEFSQU1TICgoaW50KSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQgb2JqX2NvZmZfbG9jIFBBUkFNUygoaW50KSk7Ci0jZW5kaWYKLQotLyogVGhpcyBpcyB1c2VkIHRvIGhvbGQgdGhlIHN5bWJvbCBidWlsdCBieSBhIHNlcXVlbmNlIG9mIHBzZXVkby1vcHMKLSAgIGZyb20gLmRlZiBhbmQgLmVuZGVmLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpkZWZfc3ltYm9sX2luX3Byb2dyZXNzOwotDAotLyogc3RhY2sgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGNodW5rX3NpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBlbGVtZW50X3NpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgIGNoYXIgKmRhdGE7Ci0gICAgdW5zaWduZWQgbG9uZyBwb2ludGVyOwotICB9Ci1zdGFjazsKLQotc3RhdGljIHN0YWNrICoKLXN0YWNrX2luaXQgKGNodW5rX3NpemUsIGVsZW1lbnRfc2l6ZSkKLSAgICAgdW5zaWduZWQgbG9uZyBjaHVua19zaXplOwotICAgICB1bnNpZ25lZCBsb25nIGVsZW1lbnRfc2l6ZTsKLXsKLSAgc3RhY2sgKnN0OwotCi0gIHN0ID0gKHN0YWNrICopIG1hbGxvYyAoc2l6ZW9mIChzdGFjaykpOwotICBpZiAoIXN0KQotICAgIHJldHVybiAwOwotICBzdC0+ZGF0YSA9IG1hbGxvYyAoY2h1bmtfc2l6ZSk7Ci0gIGlmICghc3QtPmRhdGEpCi0gICAgewotICAgICAgZnJlZSAoc3QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBzdC0+cG9pbnRlciA9IDA7Ci0gIHN0LT5zaXplID0gY2h1bmtfc2l6ZTsKLSAgc3QtPmNodW5rX3NpemUgPSBjaHVua19zaXplOwotICBzdC0+ZWxlbWVudF9zaXplID0gZWxlbWVudF9zaXplOwotICByZXR1cm4gc3Q7Ci19Ci0KLSNpZiAwCi0vKiBOb3QgY3VycmVudGx5IHVzZWQuICAqLwotc3RhdGljIHZvaWQKLXN0YWNrX2RlbGV0ZSAoc3QpCi0gICAgIHN0YWNrICpzdDsKLXsKLSAgZnJlZSAoc3QtPmRhdGEpOwotICBmcmVlIChzdCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKgotc3RhY2tfcHVzaCAoc3QsIGVsZW1lbnQpCi0gICAgIHN0YWNrICpzdDsKLSAgICAgY2hhciAqZWxlbWVudDsKLXsKLSAgaWYgKHN0LT5wb2ludGVyICsgc3QtPmVsZW1lbnRfc2l6ZSA+PSBzdC0+c2l6ZSkKLSAgICB7Ci0gICAgICBzdC0+c2l6ZSArPSBzdC0+Y2h1bmtfc2l6ZTsKLSAgICAgIGlmICgoc3QtPmRhdGEgPSB4cmVhbGxvYyAoc3QtPmRhdGEsIHN0LT5zaXplKSkgPT0gKGNoYXIgKikgMCkKLQlyZXR1cm4gKGNoYXIgKikgMDsKLSAgICB9Ci0gIG1lbWNweSAoc3QtPmRhdGEgKyBzdC0+cG9pbnRlciwgZWxlbWVudCwgc3QtPmVsZW1lbnRfc2l6ZSk7Ci0gIHN0LT5wb2ludGVyICs9IHN0LT5lbGVtZW50X3NpemU7Ci0gIHJldHVybiBzdC0+ZGF0YSArIHN0LT5wb2ludGVyOwotfQotCi1zdGF0aWMgY2hhciAqCi1zdGFja19wb3AgKHN0KQotICAgICBzdGFjayAqc3Q7Ci17Ci0gIGlmIChzdC0+cG9pbnRlciA8IHN0LT5lbGVtZW50X3NpemUpCi0gICAgewotICAgICAgc3QtPnBvaW50ZXIgPSAwOwotICAgICAgcmV0dXJuIChjaGFyICopIDA7Ci0gICAgfQotICBzdC0+cG9pbnRlciAtPSBzdC0+ZWxlbWVudF9zaXplOwotICByZXR1cm4gc3QtPmRhdGEgKyBzdC0+cG9pbnRlcjsKLX0KLQwKLS8qCi0gKiBNYWludGFpbiBhIGxpc3Qgb2YgdGhlIHRhZ25hbWVzIG9mIHRoZSBzdHJ1Y3RyZXMuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhZ19oYXNoOwotCi1zdGF0aWMgdm9pZAotdGFnX2luaXQgKCkKLXsKLSAgdGFnX2hhc2ggPSBoYXNoX25ldyAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXRhZ19pbnNlcnQgKG5hbWUsIHN5bWJvbFApCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm9yX3N0cmluZzsKLQotICBpZiAoKGVycm9yX3N0cmluZyA9IGhhc2hfamFtICh0YWdfaGFzaCwgbmFtZSwgKGNoYXIgKikgc3ltYm9sUCkpKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RydWN0dXJlIHRhYmxlIGZhaWxlZDogJXMiKSwKLQkJbmFtZSwgZXJyb3Jfc3RyaW5nKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBzeW1ib2xTICoKLXRhZ19maW5kIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgaWYgKCpuYW1lID09ICdfJykKLSAgICBuYW1lKys7Ci0jZW5kaWYgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICByZXR1cm4gKHN5bWJvbFMgKikgaGFzaF9maW5kICh0YWdfaGFzaCwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBzeW1ib2xTICoKLXRhZ19maW5kX29yX21ha2UgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgaWYgKChzeW1ib2xQID0gdGFnX2ZpbmQgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwKLQkJCSAgICAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gICAgICB0YWdfaW5zZXJ0IChTX0dFVF9OQU1FIChzeW1ib2xQKSwgc3ltYm9sUCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0jZW5kaWYKLSAgICB9CQkJCS8qIG5vdCBmb3VuZCAqLwotCi0gIHJldHVybiBzeW1ib2xQOwotfQotCi0vKiBXZSBhY2NlcHQgdGhlIC5ic3MgZGlyZWN0aXZlIHRvIHNldCB0aGUgc2VjdGlvbiBmb3IgYmFja3dhcmQKLSAgIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIGdhcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotICAgIHN1YnNlZ19uZXcgKCIuYnNzIiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBlbHNlCi0gICAgc19sY29tbSAoMCk7Ci19Ci0KLS8qIEhhbmRsZSAud2Vhay4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3dlYWsgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAKLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1MRVIKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19OVF9XRUFLKTsKLSNlbHNlCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1dFQUtFWFQpOwotI2VuZGlmCi0KLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotc3RhdGljIHZvaWQgU0FfU0VUX1NZTV9UQUdORFggUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLQotI2RlZmluZSBHRVRfRklMRU5BTUVfU1RSSU5HKFgpIFwKLSgoY2hhciopKCYoKFgpLT5zeV9zeW1ib2wub3N0X2F1eGVudC0+eF9maWxlLnhfbi54X29mZnNldCkpWzFdKQotCi0vKiBAQCBJY2suICAqLwotc3RhdGljIHNlZ1QKLWZldGNoX2NvZmZfZGVidWdfc2VjdGlvbiAoKQotewotICBzdGF0aWMgc2VnVCBkZWJ1Z19zZWN0aW9uOwotICBpZiAoIWRlYnVnX3NlY3Rpb24pCi0gICAgewotICAgICAgQ09OU1QgYXN5bWJvbCAqczsKLSAgICAgIHMgPSBiZmRfbWFrZV9kZWJ1Z19zeW1ib2wgKHN0ZG91dHB1dCwgKGNoYXIgKikgMCwgMCk7Ci0gICAgICBhc3NlcnQgKHMgIT0gMCk7Ci0gICAgICBkZWJ1Z19zZWN0aW9uID0gcy0+c2VjdGlvbjsKLSAgICB9Ci0gIHJldHVybiBkZWJ1Z19zZWN0aW9uOwotfQotCi12b2lkCi1TQV9TRVRfU1lNX0VORE5EWCAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgc3ltYm9sUyAqdmFsOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICplbnRyeSwgKnA7Ci0KLSAgZW50cnkgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbMV07Ci0gIHAgPSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAodmFsKSktPm5hdGl2ZTsKLSAgZW50cnktPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAgPSBwOwotICBlbnRyeS0+Zml4X2VuZCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1TQV9TRVRfU1lNX1RBR05EWCAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgc3ltYm9sUyAqdmFsOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICplbnRyeSwgKnA7Ci0KLSAgZW50cnkgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbMV07Ci0gIHAgPSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAodmFsKSktPm5hdGl2ZTsKLSAgZW50cnktPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgPSBwOwotICBlbnRyeS0+Zml4X3RhZyA9IDE7Ci19Ci0KLXN0YXRpYyBpbnQKLVNfR0VUX0RBVEFfVFlQRSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlOwotfQotCi1pbnQKLVNfU0VUX0RBVEFfVFlQRSAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50IHZhbDsKLXsKLSAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSA9IHZhbDsKLSAgcmV0dXJuIHZhbDsKLX0KLQotaW50Ci1TX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgcmV0dXJuIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzczsKLX0KLQotaW50Ci1TX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIHZhbCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBpbnQgdmFsOwotewotICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSB2YWw7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIE1lcmdlIGEgZGVidWcgc3ltYm9sIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24gaW50byBhIG5vcm1hbCBzeW1ib2wuICovCi0KLXZvaWQKLWNfc3ltYm9sX21lcmdlIChkZWJ1Zywgbm9ybWFsKQotICAgICBzeW1ib2xTICpkZWJ1ZzsKLSAgICAgc3ltYm9sUyAqbm9ybWFsOwotewotICBTX1NFVF9EQVRBX1RZUEUgKG5vcm1hbCwgU19HRVRfREFUQV9UWVBFIChkZWJ1ZykpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChub3JtYWwsIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlYnVnKSk7Ci0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCkpCi0gICAgewotICAgICAgLyogdGFrZSB0aGUgbW9zdCB3ZSBoYXZlICovCi0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwsIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSk7Ci0gICAgfQotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiAwKQotICAgIHsKLSAgICAgIC8qIE1vdmUgYWxsIHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uICAqLwotICAgICAgbWVtY3B5IChTWU1fQVVYSU5GTyAobm9ybWFsKSwgU1lNX0FVWElORk8gKGRlYnVnKSwKLQkgICAgICAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpCi0JICAgICAgICogc2l6ZW9mICgqU1lNX0FVWElORk8gKGRlYnVnKSkpKTsKLSAgICB9Ci0KLSAgLyogTW92ZSB0aGUgZGVidWcgZmxhZ3MuICovCi0gIFNGX1NFVF9ERUJVR19GSUVMRCAobm9ybWFsLCBTRl9HRVRfREVCVUdfRklFTEQgKGRlYnVnKSk7Ci19Ci0KLXZvaWQKLWNfZG90X2ZpbGVfc3ltYm9sIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogQkZEIGNvbnZlcnRzIGZpbGVuYW1lIHRvIGEgLmZpbGUgc3ltYm9sIHdpdGggYW4gYXV4IGVudHJ5LiAgSXQKLSAgICAgYWxzbyBoYW5kbGVzIGNoYWluaW5nLiAgKi8KLSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKGZpbGVuYW1lLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfRklMRSk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlbmFtZSk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wgaXMgZmlyc3Qgb24gdGhlIHN5bWJvbCBjaGFpbiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQICE9IHN5bWJvbFApCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW1ib2xQLCBzeW1ib2xfcm9vdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0JCQkJLyogaWYgbm90IGZpcnN0IG9uIHRoZSBsaXN0ICovCi19Ci0KLS8qIExpbmUgbnVtYmVyIGhhbmRsaW5nICovCi0KLXN0cnVjdCBsaW5lX25vIHsKLSAgc3RydWN0IGxpbmVfbm8gKm5leHQ7Ci0gIGZyYWdTICpmcmFnOwotICBhbGVudCBsOwotfTsKLQotaW50IGNvZmZfbGluZV9iYXNlOwotCi0vKiBTeW1ib2wgb2YgbGFzdCBmdW5jdGlvbiwgd2hpY2ggd2Ugc2hvdWxkIGhhbmcgbGluZSNzIG9mZiBvZi4gICovCi1zdGF0aWMgc3ltYm9sUyAqbGluZV9mc3ltOwotCi0jZGVmaW5lIGluX2Z1bmN0aW9uKCkJCShsaW5lX2ZzeW0gIT0gMCkKLSNkZWZpbmUgY2xlYXJfZnVuY3Rpb24oKQkobGluZV9mc3ltID0gMCkKLSNkZWZpbmUgc2V0X2Z1bmN0aW9uKEYpCQkobGluZV9mc3ltID0gKEYpLCBjb2ZmX2FkZF9saW5lc3ltIChGKSkKLQotDAotdm9pZAotY29mZl9vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBsb25nICAgc3ogPSAoT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgKyAxKSAqIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSk7Ci0gIGNoYXIgKiBzICA9IChjaGFyICopIHhtYWxsb2MgKHN6KTsKLSAgCi0gIG1lbXNldCAocywgMCwgc3opOwotICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCkpLT5uYXRpdmUgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBzOwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoc3ltYm9sUCwgVF9OVUxMKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX1NUUklORyAoc3ltYm9sUCk7Ci0gIAotICBpZiAoU19JU19MT0NBTCAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLX0KLQotDAotLyoKLSAqIEhhbmRsZSAubG4gZGlyZWN0aXZlcy4KLSAqLwotCi1zdGF0aWMgc3ltYm9sUyAqY3VycmVudF9saW5lbm9fc3ltOwotc3RhdGljIHN0cnVjdCBsaW5lX25vICpsaW5lX25vczsKLS8qIEBAIEJsaW5kbHkgYXNzdW1lIGFsbCAubG4gZGlyZWN0aXZlcyB3aWxsIGJlIGluIHRoZSAudGV4dCBzZWN0aW9uLi4uICAqLwotaW50IGNvZmZfbl9saW5lX25vczsKLQotc3RhdGljIHZvaWQKLWFkZF9saW5lbm8gKGZyYWcsIG9mZnNldCwgbnVtKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IG51bTsKLXsKLSAgc3RydWN0IGxpbmVfbm8gKm5ld19saW5lID0KLSAgICAoc3RydWN0IGxpbmVfbm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGluZV9ubykpOwotICBpZiAoIWN1cnJlbnRfbGluZW5vX3N5bSkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChudW0gPD0gMCkgCi0gICAgewotICAgICAgLyogWmVybyBpcyB1c2VkIGFzIGFuIGVuZCBtYXJrZXIgaW4gdGhlIGZpbGUuICAqLwotICAgICAgYXNfYmFkIChfKCJMaW5lIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vyc1xuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgbmV3X2xpbmUtPm5leHQgPSBsaW5lX25vczsKLSAgbmV3X2xpbmUtPmZyYWcgPSBmcmFnOwotICBuZXdfbGluZS0+bC5saW5lX251bWJlciA9IG51bTsKLSAgbmV3X2xpbmUtPmwudS5vZmZzZXQgPSBvZmZzZXQ7Ci0gIGxpbmVfbm9zID0gbmV3X2xpbmU7Ci0gIGNvZmZfbl9saW5lX25vcysrOwotfQotCi12b2lkCi1jb2ZmX2FkZF9saW5lc3ltIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKGxpbmVfbm9zKQotICAgIHsKLSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChjdXJyZW50X2xpbmVub19zeW0pKS0+bGluZW5vID0KLQkoYWxlbnQgKikgbGluZV9ub3M7Ci0gICAgICBjb2ZmX25fbGluZV9ub3MrKzsKLSAgICAgIGxpbmVfbm9zID0gMDsKLSAgICB9Ci0gIGN1cnJlbnRfbGluZW5vX3N5bSA9IHN5bTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xuIChhcHBsaW5lKQotICAgICBpbnQgYXBwbGluZTsKLXsKLSAgaW50IGw7Ci0KLSAgaWYgKCEgYXBwbGluZSAmJiBkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoIWFwcGxpbmUpCi0gICAgewotICAgICAgYWRkX2xpbmVubyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgbCk7Ci0gICAgfQotCi0gIGlmIChhcHBsaW5lKQotICAgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIGwgLSAxKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlpZiAoISBhcHBsaW5lKQotCSAgbCArPSBjb2ZmX2xpbmVfYmFzZSAtIDE7Ci0JbGlzdGluZ19zb3VyY2VfbGluZSAobCk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIC5sb2MgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgLmxuOyBwYXJzZSBpdCBmb3IgYXNzZW1ibGVyCi0gICBjb21wYXRpYmlsaXR5LiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBsaW5lbm87Ci0KLSAgLyogRklYTUU6IFdoeSBkbyB3ZSBuZWVkIHRoaXMgY2hlY2s/ICBXZSBuZWVkIGl0IGZvciBFQ09GRiwgYnV0IHdoeQotICAgICBkbyB3ZSBuZWVkIGl0IGZvciBDT0ZGPyAgKi8KLSAgaWYgKG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2Mgb3V0c2lkZSBvZiAudGV4dCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxvYyBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGxpbmVubyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLQotICAgIGlmIChsaXN0aW5nKQotICAgICAgewotICAgICAgICBsaW5lbm8gKz0gY29mZl9saW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKGxpbmVubyk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgYWRkX2xpbmVubyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgbGluZW5vKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuaWRlbnQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2lkZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0gIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0jaWZkZWYgVEVfUEUKLSAgewotICAgIHNlZ1Qgc2VjOwotCi0gICAgLyogV2UgY291bGQgcHV0IGl0IGluIC5jb21tZW50LCBidXQgdGhhdCBjcmVhdGVzIGFuIGV4dHJhIHNlY3Rpb24KLSAgICAgICB0aGF0IHNob3VsZG4ndCBiZSBsb2FkZWQgaW50byBtZW1vcnksIHdoaWNoIHJlcXVpcmVzIGxpbmtlcgotICAgICAgIGNoYW5nZXMuLi4gIEZvciBub3csIHVudGlsIHByb3ZlbiBvdGhlcndpc2UsIHVzZSAucmRhdGEuICAqLwotICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIucmRhdGEkenp6IiwgMCk7Ci0gICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywKLQkJCSAgICgoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSkKLQkJCSAgICAmIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCkpKTsKLSAgfQotI2Vsc2UKLSAgc3Vic2VnX25ldyAoIi5jb21tZW50IiwgMCk7Ci0jZW5kaWYKLQotICBzdHJpbmdlciAoMSk7Ci0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci19Ci0KLS8qCi0gKgkJCWRlZigpCi0gKgotICogSGFuZGxlIC5kZWYgZGlyZWN0aXZlcy4KLSAqCi0gKiBPbmUgbWlnaHQgYXNrIDogd2h5IGNhbid0IHdlIHN5bWJvbF9uZXcgaWYgdGhlIHN5bWJvbCBkb2VzIG5vdAotICogYWxyZWFkeSBleGlzdCBhbmQgZmlsbCBpdCB3aXRoIGRlYnVnIGluZm9ybWF0aW9uLiAgQmVjYXVzZSBvZgotICogdGhlIENfRUZDTiBzcGVjaWFsIHN5bWJvbC4gSXQgd291bGQgY2xvYmJlciB0aGUgdmFsdWUgb2YgdGhlCi0gKiBmdW5jdGlvbiBzeW1ib2wgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gbm90aWNlIHRoYXQgaXQgaXMKLSAqIGEgQ19FRkNOLiBBbmQgYSBzZWNvbmQgcmVhc29uIGlzIHRoYXQgdGhlIGNvZGUgaXMgbW9yZSBjbGVhciB0aGlzCi0gKiB3YXkuIChhdCBsZWFzdCBJIHRoaW5rIGl0IGlzIDotKS4KLSAqCi0gKi8KLQotI2RlZmluZSBTS0lQX1NFTUlfQ09MT04oKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICc7JykKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFUygpCXdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJyB8fCBcCi0JCQkJICAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykgXAotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGVmICh3aGF0KQotICAgICBpbnQgd2hhdCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyIG5hbWVfZW5kOwkJLyogQ2hhciBhZnRlciB0aGUgZW5kIG9mIG5hbWUgKi8KLSAgY2hhciAqc3ltYm9sX25hbWU7CQkvKiBOYW1lIG9mIHRoZSBkZWJ1ZyBzeW1ib2wgKi8KLSAgY2hhciAqc3ltYm9sX25hbWVfY29weTsJLyogVGVtcG9yYXJ5IGNvcHkgb2YgdGhlIG5hbWUgKi8KLSAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2xlbmd0aDsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU0tJUF9XSElURVNQQUNFUyAoKTsKLQotICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmIChzeW1ib2xfbmFtZVswXSA9PSAnXycgJiYgc3ltYm9sX25hbWVbMV0gIT0gMCkKLSAgICBzeW1ib2xfbmFtZSsrOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLQotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xfbmFtZV9sZW5ndGggPSBzdHJsZW4gKHN5bWJvbF9uYW1lKTsKLSAgc3ltYm9sX25hbWVfY29weSA9IHhtYWxsb2MgKHN5bWJvbF9uYW1lX2xlbmd0aCArIDEpOwotICBzdHJjcHkgKHN5bWJvbF9uYW1lX2NvcHksIHN5bWJvbF9uYW1lKTsKLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWVfY29weSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWVfY29weSk7Ci0jZW5kaWYKLQotICAvKiBJbml0aWFsaXplIHRoZSBuZXcgc3ltYm9sICovCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xfbWFrZSAoc3ltYm9sX25hbWVfY29weSk7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgU0ZfU0VUX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXVuc2lnbmVkIGludCBkaW1faW5kZXg7Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9lbmRlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogRElNIEJVRyBGSVggc2FjQGN5Z251cy5jb20gKi8KLSAgZGltX2luZGV4ID0gMDsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBudW1iZXIgYWNjb3JkaW5nIHRvIHN0b3JhZ2UgY2xhc3MuICovCi0gIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIFNGX1NFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRklMRToKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uICgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VGQ046Ci0gICAgICBTRl9TRVRfTE9DQUwgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBEbyBub3QgZW1pdCB0aGlzIHN5bWJvbC4gKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0JMT0NLOgotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBXaWxsIG5lZWQgcHJvY2Vzc2luZyBiZWZvcmUgd3JpdGluZyAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRkNOOgotICAgICAgewotCUNPTlNUIGNoYXIgKm5hbWU7Ci0JU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGV4dF9zZWN0aW9uKTsKLQotCW5hbWUgPSBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQlpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnZicgJiYgbmFtZVszXSA9PSAnXDAnKQotICAJICB7Ci0JICAgIHN3aXRjaCAobmFtZVsxXSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnYic6ICAKLQkJLyogLmJmICovCi0JCWlmICghIGluX2Z1bmN0aW9uICgpKQotCQkgIGFzX3dhcm4gKF8oImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIiksIG5hbWUpOwotCQkvKiBXaWxsIG5lZWQgcmVsb2NhdGluZy4gICovCi0JCVNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQkJY2xlYXJfZnVuY3Rpb24gKCk7Ci0JCWJyZWFrOwotI2lmZGVmIFRFX1BFCi0JICAgICAgY2FzZSAnZSc6ICAKLQkJLyogLmVmICovCi0JCS8qIFRoZSBNUyBjb21waWxlcnMgb3V0cHV0IHRoZSBhY3R1YWwgZW5kbGluZSwgbm90IHRoZQotCQkgICBmdW5jdGlvbi1yZWxhdGl2ZSBvbmUuLi4gd2Ugd2FudCB0byBtYXRjaCB3aXRob3V0Ci0JCSAgIGNoYW5naW5nIHRoZSBhc3NlbWJsZXIgaW5wdXQuICAqLwotCQlTQV9TRVRfU1lNX0xOTk8gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIAotCQkJCSAoU0FfR0VUX1NZTV9MTk5PIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCQkJCSAgKyBjb2ZmX2xpbmVfYmFzZSkpOwotCQlicmVhazsKLSNlbmRpZgotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgQ19BVVRPQVJHCi0gICAgY2FzZSBDX0FVVE9BUkc6Ci0jZW5kaWYgLyogQ19BVVRPQVJHICovCi0gICAgY2FzZSBDX0FVVE86Ci0gICAgY2FzZSBDX1JFRzoKLSAgICBjYXNlIENfQVJHOgotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgIGNhc2UgQ19GSUVMRDoKLSAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX01PUzoKLSAgICBjYXNlIENfTU9FOgotICAgIGNhc2UgQ19NT1U6Ci0gICAgY2FzZSBDX0VPUzoKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfRVhUOgotICAgIGNhc2UgQ19XRUFLRVhUOgotI2lmZGVmIFRFX1BFCi0gICAgY2FzZSBDX05UX1dFQUs6Ci0jZW5kaWYKLSAgICBjYXNlIENfU1RBVDoKLSAgICBjYXNlIENfTEFCRUw6Ci0gICAgICAvKiBWYWxpZCBidXQgc2V0IHNvbWV3aGVyZSBlbHNlIChzX2NvbW0sIHNfbGNvbW0sIGNvbG9uKSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgIGNhc2UgQ19VU1RBVElDOgotICAgIGNhc2UgQ19FWFRERUY6Ci0gICAgY2FzZSBDX1VMQUJFTDoKLSAgICAgIGFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIpLAotCSAgICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7Ci0gICAgICBicmVhazsKLSAgICB9CQkJCS8qIHN3aXRjaCBvbiBzdG9yYWdlIGNsYXNzICovCi0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBidWlsdCBhIGRlYnVnIHN5bWJvbCwgdHJ5IHRvIGZpbmQgaWYgd2Ugc2hvdWxkCi0gICAgIG1lcmdlIHdpdGggYW4gZXhpc3Rpbmcgc3ltYm9sIG9yIG5vdC4gIElmIGEgc3ltYm9sIGlzIENfRUZDTiBvcgotICAgICBhYnNvbHV0ZV9zZWN0aW9uIG9yIHVudGFnZ2VkIFNFR19ERUJVRyBpdCBuZXZlciBtZXJnZXMuICBXZSBhbHNvCi0gICAgIGRvbid0IG1lcmdlIGxhYmVscywgd2hpY2ggYXJlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSwgbm9yCi0gICAgIHN5bWJvbHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gZGVmaW5lZCBzaW5jZSB0aGV5IGFyZSB0eXBpY2FsbHkKLSAgICAgdW5pcXVlLCBub3IgZG8gd2UgbWVyZ2UgdGFncyB3aXRoIG5vbi10YWdzLiAgKi8KLQotICAvKiBUd28gY2FzZXMgZm9yIGZ1bmN0aW9ucy4gIEVpdGhlciBkZWJ1ZyBmb2xsb3dlZCBieSBkZWZpbml0aW9uIG9yCi0gICAgIGRlZmluaXRpb24gZm9sbG93ZWQgYnkgZGVidWcuICBGb3IgZGVmaW5pdGlvbiBmaXJzdCwgd2Ugd2lsbAotICAgICBtZXJnZSB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIGRlZmluaXRpb24uICBGb3IgZGVidWcgZmlyc3QsIHRoZQotICAgICBsaW5lbm8gZW50cnkgTVVTVCBwb2ludCB0byB0aGUgZGVmaW5pdGlvbiBmdW5jdGlvbiBvciBlbHNlIGl0Ci0gICAgIHdpbGwgcG9pbnQgb2ZmIGludG8gc3BhY2Ugd2hlbiBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKCkgbWVyZ2VzCi0gICAgIHRoZSBkZWJ1ZyBzeW1ib2wgaW50byB0aGUgcmVhbCBzeW1ib2wuICBUaGVyZWZvciwgbGV0J3MgcHJlc3VtZQotICAgICB0aGUgZGVidWcgc3ltYm9sIGlzIGEgcmVhbCBmdW5jdGlvbiByZWZlcmVuY2UuICovCi0KLSAgLyogRklYTUUtU09PTiBJZiBmb3Igc29tZSByZWFzb24gdGhlIGRlZmluaXRpb24gbGFiZWwvc3ltYm9sIGlzCi0gICAgIG5ldmVyIHNlZW4sIHRoaXMgd2lsbCBwcm9iYWJseSBsZWF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIGF0IGxpbmsKLSAgICAgdGltZS4gKi8KLQotICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19FRkNOCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX0xBQkVMCi0gICAgICB8fCAoIXN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwKLQkJCQkJIFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSwKLQkJICAgIipERUJVRyoiKQotCSAgJiYgIVNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgICAgfHwgU19HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgfHwgISBzeW1ib2xfY29uc3RhbnRfcCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLSAgICAgIHx8IChzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPX05PVF9TVFJJUCkpID09IE5VTEwKLSAgICAgIHx8IFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpICE9IFNGX0dFVF9UQUcgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIElmIGl0IGFscmVhZHkgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QsIGRvIG5vdGhpbmcgKi8KLSAgICAgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IHN5bWJvbF9sYXN0UCkKLSAgICAgICAgewotCSAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsCi0JCQkgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCBhbHJlYWR5IGV4aXN0cywgbWVyZ2UgdGhlIG5ld2x5IGNyZWF0ZWQgc3ltYm9sCi0JIGludG8gdGhlIG9sZCBvbmUuICBUaGlzIGlzIG5vdCBtYW5kYXRvcnkuIFRoZSBsaW5rZXIgY2FuCi0JIGhhbmRsZSBkdXBsaWNhdGUgc3ltYm9scyBjb3JyZWN0bHkuIEJ1dCBJIGd1ZXNzIHRoYXQgaXQgc2F2ZQotCSBhICpsb3QqIG9mIHNwYWNlIGlmIHRoZSBhc3NlbWJseSBmaWxlIGRlZmluZXMgYSBsb3Qgb2YKLQkgc3ltYm9scy4gW2xvaWNdICovCi0KLSAgICAgIC8qIFRoZSBkZWJ1ZyBlbnRyeSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgaXMgbWVyZ2VkIGludG8gdGhlCi0JIHByZXZpb3VzIGRlZmluaXRpb24uICovCi0KLSAgICAgIGNfc3ltYm9sX21lcmdlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xQKTsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gICAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gc3ltYm9sUDsKLQotICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX1NUQVQpCi0JewotCSAgLyogRm9yIGZ1bmN0aW9ucywgYW5kIHRhZ3MsIGFuZCBzdGF0aWMgc3ltYm9scywgdGhlIHN5bWJvbAotCSAgICAgKm11c3QqIGJlIHdoZXJlIHRoZSBkZWJ1ZyBzeW1ib2wgYXBwZWFycy4gIE1vdmUgdGhlCi0JICAgICBleGlzdGluZyBzeW1ib2wgdG8gdGhlIGN1cnJlbnQgcGxhY2UuICovCi0JICAvKiBJZiBpdCBhbHJlYWR5IGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LCBkbyBub3RoaW5nICovCi0JICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBzeW1ib2xfbGFzdFApCi0JICAgIHsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgICAgc3ltYm9sUyAqb2xkdGFnOwotCi0gICAgICBvbGR0YWcgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJCQkgRE9fTk9UX1NUUklQKTsKLSAgICAgIGlmIChvbGR0YWcgPT0gTlVMTCB8fCAhIFNGX0dFVF9UQUcgKG9sZHRhZykpCi0JdGFnX2luc2VydCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0JCSAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICB9Ci0KLSAgaWYgKFNGX0dFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgICAga25vdyAoc2l6ZW9mIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA8PSBzaXplb2YgKGxvbmcpKTsKLSAgICAgIHNldF9mdW5jdGlvbiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgICAgIGlmIChzeW1ib2xQID09IE5VTEwpCi0JewotCSAgLyogVGhhdCBpcywgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZQotCSAgICAgZnVuY3Rpb24uLi4gKi8KLQkgIHN5bWJvbF90YWJsZV9pbnNlcnQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCX0gLyogZGVmaW5pdGlvbiBmb2xsb3dzIGRlYnVnICovCi0gICAgfSAvKiBDcmVhdGUgdGhlIGxpbmUgbnVtYmVyIGVudHJ5IHBvaW50aW5nIHRvIHRoZSBmdW5jdGlvbiBiZWluZyBkZWZpbmVkICovCi0KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IE5VTEw7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9kaW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgZGltX2luZGV4OwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0KLSAgZm9yIChkaW1faW5kZXggPSAwOyBkaW1faW5kZXggPCBESU1OVU07IGRpbV9pbmRleCsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0gICAgICBTQV9TRVRfU1lNX0RJTUVOIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBkaW1faW5kZXgsCi0JCQlnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX3dhcm4gKF8oImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIikpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQljYXNlICdcbic6Ci0JY2FzZSAnOyc6Ci0JICBkaW1faW5kZXggPSBESU1OVU07Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IHRoaXNfYmFzZTsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHN0YWJzLXN0eWxlIGxpbmU/ICAqLwotICAgICAgb2JqX2NvZmZfbG4gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0aGlzX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKCFzdHJjbXAgKCIuYmYiLCBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkpCi0gICAgY29mZl9saW5lX2Jhc2UgPSB0aGlzX2Jhc2U7Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGhpc19iYXNlKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKHN0cmNtcCAoIi5iZiIsIFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSA9PSAwKQotICAgIHsKLSAgICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLQotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgdGhpc19iYXNlKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NpemUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX1NJWkUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl90YWcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpzeW1ib2xfbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWUpOwotI2VuZGlmCi0KLSAgLyogQXNzdW1lIHRoYXQgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSAudGFnIGlzIGFsd2F5cyBkZWZpbmVkLgotICAgICBUaGlzIHdhcyBhIGJhZCBhc3N1bXB0aW9uLiAgSSd2ZSBhZGRlZCBmaW5kX29yX21ha2UuIHhveG9yaWNoLiAqLwotICBTQV9TRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywKLQkJICAgICB0YWdfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSkpOwotICBpZiAoU0FfR0VUX1NZTV9UQUdORFggKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IDBMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInRhZyBub3QgZm91bmQgZm9yIC50YWcgJXMiKSwgc3ltYm9sX25hbWUpOwotICAgIH0JCQkJLyogbm90IGRlZmluZWQgKi8KLQotICBTRl9TRVRfVEFHR0VEIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoSVNGQ04gKFNfR0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpICYmCi0gICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBDX1RQREVGKQotICAgIHsKLSAgICAgIFNGX1NFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQkJCQkvKiBpcyBhIGZ1bmN0aW9uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgY2hhciAqc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjaGFyIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKLSNlbmRpZgotICAgICAgaWYgKCFzdHJjbXAgKHN5bWJvbF9uYW1lLCAiLiIpKQotCXsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZnJhZ19ub3cpOwotCSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAvKiBJZiB0aGUgLnZhbCBpcyAhPSBmcm9tIHRoZSAuZGVmIChlLmcuIHN0YXRpY3MpICovCi0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgc3ltYm9sX25hbWUpKQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cC5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSk7Ci0JICBleHAuWF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0JICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZleHApOwotCi0JICAvKiBJZiB0aGUgc2VnbWVudCBpcyB1bmRlZmluZWQgd2hlbiB0aGUgZm9yd2FyZCByZWZlcmVuY2UgaXMKLQkgICAgIHJlc29sdmVkLCB0aGVuIGNvcHkgdGhlIHNlZ21lbnQgaWQgZnJvbSB0aGUgZm9yd2FyZAotCSAgICAgc3ltYm9sLiAgKi8KLQkgIFNGX1NFVF9HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLQkgIC8qIEZJWE1FOiBnY2MgY2FuIGdlbmVyYXRlIGFkZHJlc3MgZXhwcmVzc2lvbnMgaGVyZSBpbgotCSAgICAgdW51c3VhbCBjYXNlcyAoc2VhcmNoIGZvciAib2JzY3VyZSIgaW4gc2Rib3V0LmMpLiAgV2UKLQkgICAgIGp1c3QgaWdub3JlIHRoZSBvZmZzZXQgaGVyZSwgdGh1cyBnZW5lcmF0aW5nIGluY29ycmVjdAotCSAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2UgaWdub3JlIHRoZSByZXN0IG9mIHRoZSBsaW5lCi0JICAgICBqdXN0IGJlbG93LiAgKi8KLQl9Ci0gICAgICAvKiBPdGhlcndpc2UsIGl0IGlzIHRoZSBuYW1lIG9mIGEgbm9uIGRlYnVnIHN5bWJvbCBhbmQgaXRzIHZhbHVlCi0gICAgICAgICB3aWxsIGJlIGNhbGN1bGF0ZWQgbGF0ZXIuICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgICB9CQkJCS8qIGlmIHN5bWJvbCBiYXNlZCAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLWNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotICAvKiBUaGVzZSBoYWQgYmV0dGVyIGJlIHRoZSBzYW1lLiAgVXN1YWxseSAxOCBieXRlcy4gKi8KLSNpZm5kZWYgQkZEX0hFQURFUlMKLSAga25vdyAoc2l6ZW9mIChTWU1FTlQpID09IHNpemVvZiAoQVVYRU5UKSk7Ci0gIGtub3cgKFNZTUVTWiA9PSBBVVhFU1opOwotI2VuZGlmCi0gIHRhZ19pbml0ICgpOwotfQotCi0KLXN5bWJvbFMgKmNvZmZfbGFzdF9mdW5jdGlvbjsKLXN0YXRpYyBzeW1ib2xTICpjb2ZmX2xhc3RfYmY7Ci0KLXZvaWQKLWNvZmZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnQpCi0gICAgIHN5bWJvbFMgKnN5bXA7Ci0gICAgIGludCAqcHVudDsKLXsKLSAgc3RhdGljIHN5bWJvbFMgKmxhc3RfdGFnUDsKLSAgc3RhdGljIHN0YWNrICpibG9ja19zdGFjazsKLSAgc3RhdGljIHN5bWJvbFMgKnNldF9lbmQ7Ci0gIHN5bWJvbFMgKm5leHRfc2V0X2VuZCA9IE5VTEw7Ci0KLSAgaWYgKHN5bXAgPT0gJmFic19zeW1ib2wpCi0gICAgewotICAgICAgKnB1bnQgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY3VycmVudF9saW5lbm9fc3ltKQotICAgIGNvZmZfYWRkX2xpbmVzeW0gKChzeW1ib2xTICopIDApOwotCi0gIGlmICghYmxvY2tfc3RhY2spCi0gICAgYmxvY2tfc3RhY2sgPSBzdGFja19pbml0ICg1MTIsIHNpemVvZiAoc3ltYm9sUyopKTsKLQotICBpZiAoU19JU19XRUFLIChzeW1wKSkKLSAgICB7Ci0jaWZkZWYgVEVfUEUKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfTlRfV0VBSyk7Ci0jZWxzZQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19XRUFLRVhUKTsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltcCkKLSAgICAgICYmICFTX0lTX1dFQUsgKHN5bXApCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSAhPSBDX1NUQVQpCi0gICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19FWFQpOwotCi0gIGlmICghU0ZfR0VUX0RFQlVHIChzeW1wKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpyZWFsOwotICAgICAgaWYgKCFTRl9HRVRfTE9DQUwgKHN5bXApCi0JICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bXApCi0JICAmJiAocmVhbCA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKHN5bXApLCBET19OT1RfU1RSSVApKQotCSAgJiYgcmVhbCAhPSBzeW1wKQotCXsKLQkgIGNfc3ltYm9sX21lcmdlIChzeW1wLCByZWFsKTsKLQkgICpwdW50ID0gMTsKLQl9Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltcCkgJiYgIVNGX0dFVF9MT0NBTCAoc3ltcCkpCi0JewotCSAgYXNzZXJ0IChTX0dFVF9WQUxVRSAoc3ltcCkgPT0gMCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltcCk7Ci0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19OVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1wKSA9PSB0ZXh0X3NlY3Rpb24KLQkgICAgICAmJiBzeW1wICE9IHNlZ19pbmZvICh0ZXh0X3NlY3Rpb24pLT5zeW0pCi0JICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfTEFCRUwpOwotCSAgZWxzZQotCSAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX1NUQVQpOwotCX0KLSAgICAgIGlmIChTRl9HRVRfUFJPQ0VTUyAoc3ltcCkpCi0JewotCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfQkxPQ0spCi0JICAgIHsKLQkgICAgICBpZiAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ltcCksICIuYmIiKSkKLQkJc3RhY2tfcHVzaCAoYmxvY2tfc3RhY2ssIChjaGFyICopICZzeW1wKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW1ib2xTICpiZWdpbjsKLQkJICBiZWdpbiA9ICooc3ltYm9sUyAqKikgc3RhY2tfcG9wIChibG9ja19zdGFjayk7Ci0JCSAgaWYgKGJlZ2luID09IDApCi0JCSAgICBhc193YXJuIChfKCJtaXNtYXRjaGVkIC5lYiIpKTsKLQkJICBlbHNlCi0JCSAgICBuZXh0X3NldF9lbmQgPSBiZWdpbjsKLQkJfQotCSAgICB9Ci0JICBpZiAoY29mZl9sYXN0X2Z1bmN0aW9uID09IDAgJiYgU0ZfR0VUX0ZVTkNUSU9OIChzeW1wKSkKLQkgICAgewotCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4cDsKLQkgICAgICBjb2ZmX2xhc3RfZnVuY3Rpb24gPSBzeW1wOwotCSAgICAgIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1wKSA8IDEpCi0JCVNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bXAsIDEpOwotCSAgICAgIGF1eHAgPSBTWU1fQVVYRU5UIChzeW1wKTsKLQkgICAgICBtZW1zZXQgKGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4sIDAsCi0JCSAgICAgIHNpemVvZiAoYXV4cC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbikpOwotCSAgICB9Ci0JICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19FRkNOKQotCSAgICB7Ci0JICAgICAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwKQotCQlhc19mYXRhbCAoXygiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiKSk7Ci0JICAgICAgU0FfU0VUX1NZTV9GU0laRSAoY29mZl9sYXN0X2Z1bmN0aW9uLAotCQkJCShsb25nKSAoU19HRVRfVkFMVUUgKHN5bXApCi0JCQkJCS0gU19HRVRfVkFMVUUgKGNvZmZfbGFzdF9mdW5jdGlvbikpKTsKLQkgICAgICBuZXh0X3NldF9lbmQgPSBjb2ZmX2xhc3RfZnVuY3Rpb247Ci0JICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKLQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0VYVCk7Ci0gICAgICBlbHNlIGlmIChTRl9HRVRfTE9DQUwgKHN5bXApKQotCSpwdW50ID0gMTsKLQotICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCi0Jc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLSAgICAgIC8qIG1vcmUgLi4uICovCi0gICAgfQotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoU19JU19XRUFLIChzeW1wKSAmJiBTX0lTX0NPTU1PTiAoc3ltcCkpCi0gICAgYXNfYmFkIChfKCJTeW1ib2wgYCVzJyBjYW4gbm90IGJlIGJvdGggd2VhayBhbmQgY29tbW9uIiksCi0JICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQotICBpZiAoU0ZfR0VUX1RBRyAoc3ltcCkpCi0gICAgbGFzdF90YWdQID0gc3ltcDsKLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19FT1MpCi0gICAgbmV4dF9zZXRfZW5kID0gbGFzdF90YWdQOwotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gIC8qIFRoaXMgaXMgcHJldHR5IGhvcnJpYmxlLCBidXQgd2UgaGF2ZSB0byBzZXQgKnB1bnQgY29ycmVjdGx5IGluCi0gICAgIG9yZGVyIHRvIGNhbGwgU0FfU0VUX1NZTV9FTkRORFggY29ycmVjdGx5LiAgKi8KLSAgaWYgKCEgc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCAoc3ltcCkKLSAgICAgICYmICgoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotCSAgfHwgKCEgU19JU19FWFRFUk5BTCAoc3ltcCkKLQkgICAgICAmJiAhIHN5bWJvbF9nZXRfdGMgKHN5bXApLT5vdXRwdXQKLQkgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSAhPSBDX0ZJTEUpKSkKLSAgICAqcHVudCA9IDE7Ci0jZW5kaWYKLQotICBpZiAoc2V0X2VuZCAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAhICpwdW50Ci0gICAgICAmJiAoKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMAotCSAgfHwgKFNfSVNfREVGSU5FRCAoc3ltcCkKLQkgICAgICAmJiAhIFNfSVNfQ09NTU9OIChzeW1wKQotCSAgICAgICYmICghIFNfSVNfRVhURVJOQUwgKHN5bXApIHx8IFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpKSkpCi0gICAgewotICAgICAgU0FfU0VUX1NZTV9FTkRORFggKHNldF9lbmQsIHN5bXApOwotICAgICAgc2V0X2VuZCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChuZXh0X3NldF9lbmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2V0X2VuZCAhPSBOVUxMKQotCWFzX3dhcm4gKCJXYXJuaW5nOiBpbnRlcm5hbCBlcnJvcjogZm9yZ2V0dGluZyB0byBzZXQgZW5kbmR4IG9mICVzIiwKLQkJIFNfR0VUX05BTUUgKHNldF9lbmQpKTsKLSAgICAgIHNldF9lbmQgPSBuZXh0X3NldF9lbmQ7Ci0gICAgfQotCi0gIGlmICghICpwdW50Ci0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0ZDTgotICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChzeW1wKSwgIi5iZiIpID09IDApCi0gICAgewotICAgICAgaWYgKGNvZmZfbGFzdF9iZiAhPSBOVUxMKQotCVNBX1NFVF9TWU1fRU5ETkRYIChjb2ZmX2xhc3RfYmYsIHN5bXApOwotICAgICAgY29mZl9sYXN0X2JmID0gc3ltcDsKLSAgICB9Ci0KLSAgaWYgKGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPmxpbmVubykKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHN0cnVjdCBsaW5lX25vICpscHRyOwotICAgICAgYWxlbnQgKmw7Ci0KLSAgICAgIGxwdHIgPSAoc3RydWN0IGxpbmVfbm8gKikgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApKS0+bGluZW5vOwotICAgICAgZm9yIChpID0gMDsgbHB0cjsgbHB0ciA9IGxwdHItPm5leHQpCi0JaSsrOwotICAgICAgbHB0ciA9IChzdHJ1Y3QgbGluZV9ubyAqKSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCkpLT5saW5lbm87Ci0KLSAgICAgIC8qIFdlIG5lZWQgaSBlbnRyaWVzIGZvciBsaW5lIG51bWJlcnMsIHBsdXMgMSBmb3IgdGhlIGZpcnN0Ci0JIGVudHJ5IHdoaWNoIEJGRCB3aWxsIG92ZXJyaWRlLCBwbHVzIDEgZm9yIHRoZSBsYXN0IHplcm8KLQkgZW50cnkgKGEgbWFya2VyIGZvciBCRkQpLiAgKi8KLSAgICAgIGwgPSAoYWxlbnQgKikgeG1hbGxvYyAoKGkgKyAyKSAqIHNpemVvZiAoYWxlbnQpKTsKLSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPmxpbmVubyA9IGw7Ci0gICAgICBsW2kgKyAxXS5saW5lX251bWJlciA9IDA7Ci0gICAgICBsW2kgKyAxXS51LnN5bSA9IE5VTEw7Ci0gICAgICBmb3IgKDsgaSA+IDA7IGktLSkKLQl7Ci0JICBpZiAobHB0ci0+ZnJhZykKLQkgICAgbHB0ci0+bC51Lm9mZnNldCArPSBscHRyLT5mcmFnLT5mcl9hZGRyZXNzOwotCSAgbFtpXSA9IGxwdHItPmw7Ci0JICBscHRyID0gbHB0ci0+bmV4dDsKLQl9Ci0gICAgfQotfQotCi12b2lkCi1jb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMgKGFiZmQsIHNlYywgeCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bWJvbFMgKnNlY3N5bTsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaW50IG5sbm5vLCBucmVsb2NzID0gMDsKLQotICAvKiBSUy82MDAwIGdhcyBjcmVhdGVzIGEgLmRlYnVnIHNlY3Rpb24gbWFudWFsbHkgaW4gcHBjX2Zyb2JfZmlsZSBpbgotICAgICB0Yy1wcGMuYy4gIERvIG5vdCBnZXQgY29uZnVzZWQgYnkgaXQuICAqLwotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBpZiAoIXN0cmNtcCAoc2VjLT5uYW1lLCAiLnRleHQiKSkKLSAgICBubG5ubyA9IGNvZmZfbl9saW5lX25vczsKLSAgZWxzZQotICAgIG5sbm5vID0gMDsKLSAgewotICAgIC8qIEBAIEhvcGUgdGhhdCBub25lIG9mIHRoZSBmaXh1cHMgZXhwYW5kIHRvIG1vcmUgdGhhbiBvbmUgcmVsb2MKLSAgICAgICBlbnRyeS4uLiAgKi8KLSAgICBmaXhTICpmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7Ci0gICAgd2hpbGUgKGZpeHApCi0gICAgICB7Ci0JaWYgKCEgZml4cC0+ZnhfZG9uZSkKLQkgIG5yZWxvY3MrKzsKLQlmaXhwID0gZml4cC0+ZnhfbmV4dDsKLSAgICAgIH0KLSAgfQotICBpZiAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpID09IDAKLSAgICAgICYmIG5yZWxvY3MgPT0gMAotICAgICAgJiYgbmxubm8gPT0gMAotICAgICAgJiYgc2VjICE9IHRleHRfc2VjdGlvbgotICAgICAgJiYgc2VjICE9IGRhdGFfc2VjdGlvbgotICAgICAgJiYgc2VjICE9IGJzc19zZWN0aW9uKQotICAgIHJldHVybjsKLSAgc2Vjc3ltID0gc2VjdGlvbl9zeW1ib2wgKHNlYyk7Ci0gIC8qIFRoaXMgaXMgYW4gZXN0aW1hdGU7IHdlJ2xsIHBsdWcgaW4gdGhlIHJlYWwgdmFsdWUgdXNpbmcKLSAgICAgU0VUX1NFQ1RJT05fUkVMT0NTIGxhdGVyICovCi0gIFNBX1NFVF9TQ05fTlJFTE9DIChzZWNzeW0sIG5yZWxvY3MpOwotICBTQV9TRVRfU0NOX05MSU5OTyAoc2Vjc3ltLCBubG5ubyk7Ci19Ci0KLXZvaWQKLWNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQotewotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zLCAoY2hhciopIDApOwotfQotCi0vKgotICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6Ci0gKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9Ci0gKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCi0gKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQotICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0Ci0gKgkJCQkJCSAncicgZm9yIHJlYWQtb25seSBkYXRhCi0gKgkJCQkJCSAncycgZm9yIHNoYXJlZCBkYXRhIChQRSkKLSAqIEJ1dCBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGEgcXVvdGVkIHN0cmluZywgdHJlYXQgaXQgYXMgYQotICogc3Vic2VnbWVudCBudW1iZXIuCi0gKi8KLQotdm9pZAotb2JqX2NvZmZfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCi0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciB0eXBlOwotCi0gICAgICBzX21yaV9zZWN0ICgmdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBleHAgPSAwOwotICBmbGFncyA9IFNFQ19MT0FEOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQlleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJwotCQkgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JCXsKLQkJY2FzZSAnYic6IGZsYWdzIHw9IFNFQ19BTExPQzsgZmxhZ3MgJj1+IFNFQ19MT0FEOyBicmVhazsKLQkJY2FzZSAnbic6IGZsYWdzICY9fiBTRUNfTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ2QnOiBmbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEOyAvKiBmYWxsIHRocm91Z2ggKi8KLQkJY2FzZSAndyc6IGZsYWdzICY9fiBTRUNfUkVBRE9OTFk7IGJyZWFrOwotCQljYXNlICd4JzogZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ3InOiBmbGFncyB8PSBTRUNfUkVBRE9OTFk7IGJyZWFrOwotCQljYXNlICdzJzogZmxhZ3MgfD0gU0VDX1NIQVJFRDsgYnJlYWs7Ci0KLQkJY2FzZSAnaSc6IC8qIFNUWVBfSU5GTyAqLwotCQljYXNlICdsJzogLyogU1RZUF9MSUIgKi8KLQkJY2FzZSAnbyc6IC8qIFNUWVBfT1ZFUiAqLwotCQkgIGFzX3dhcm4gKF8oInVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAgICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfd2FybihfKCJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgfQotCi0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIChzdWJzZWdUKSBleHApOwotCi0gIGlmIChmbGFncyAhPSBTRUNfTk9fRkxBR1MpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb2xkZmxhZ3M7Ci0KLSAgICAgIG9sZGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYyk7Ci0gICAgICBvbGRmbGFncyAmPSBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUzsKLSAgICAgIGZsYWdzIHw9IG9sZGZsYWdzOwotCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncykpCi0JYXNfd2FybiAoXygiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIlc1wiOiAlcyIpLAotCQkgYmZkX3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBzZWMpLAotCQkgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1jb2ZmX2FkanVzdF9zeW10YWIgKCkKLXsKLSAgaWYgKHN5bWJvbF9yb290UCA9PSBOVUxMCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xfcm9vdFApICE9IENfRklMRSkKLSAgICBjX2RvdF9maWxlX3N5bWJvbCAoImZha2UiKTsKLX0KLQotdm9pZAotY29mZl9mcm9iX3NlY3Rpb24gKHNlYykKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIHNlZ1Qgc3Ryc2VjOwotICBjaGFyICpwOwotICBmcmFnUyAqZnJhZ3A7Ci0gIGJmZF92bWEgc2l6ZSwgbl9lbnRyaWVzLCBtYXNrOwotCi0gIC8qIFRoZSBDT0ZGIGJhY2sgZW5kIGluIEJGRCByZXF1aXJlcyB0aGF0IGFsbCBzZWN0aW9uIHNpemVzIGJlCi0gICAgIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlY3Rpb24gYWxpZ25tZW50cy4KLSAgICAgU2VlbXMga2luZGEgc2lsbHkgdG8gbWUsIGJ1dCB0aGF0J3MgdGhlIHdheSBpdCBpcy4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYyk7Ci0gIG1hc2sgPSAoKGJmZF92bWEpIDEgPDwgKGJmZF92bWEpIHNlYy0+YWxpZ25tZW50X3Bvd2VyKSAtIDE7Ci0gIGlmIChzaXplICYgbWFzaykKLSAgICB7Ci0gICAgICBzaXplID0gKHNpemUgKyBtYXNrKSAmIH5tYXNrOwotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjLCBzaXplKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gc2l6ZSBpcyBub24temVybywgdGhlIHNlY3Rpb24gc3ltYm9sIG5lZWRzIGFuIGF1eAotICAgICBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQsIGluZGljYXRpbmcgdGhlIHNpemUuICBXZSBkb24ndCBrbm93Ci0gICAgIGFsbCB0aGUgdmFsdWVzIHlldDsgY29mZl9mcm9iX3N5bWJvbCB3aWxsIGZpbGwgdGhlbSBpbiBsYXRlci4gICovCi0gIGlmIChzaXplICE9IDAKLSAgICAgIHx8IHNlYyA9PSB0ZXh0X3NlY3Rpb24KLSAgICAgIHx8IHNlYyA9PSBkYXRhX3NlY3Rpb24KLSAgICAgIHx8IHNlYyA9PSBic3Nfc2VjdGlvbikKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzZWNzeW0gPSBzZWN0aW9uX3N5bWJvbCAoc2VjKTsKLQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc2Vjc3ltLCBDX1NUQVQpOwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc2Vjc3ltLCAxKTsKLSAgICAgIFNGX1NFVF9TVEFUSUNTIChzZWNzeW0pOwotICAgICAgU0FfU0VUX1NDTl9TQ05MRU4gKHNlY3N5bSwgc2l6ZSk7Ci0gICAgfQotCi0gIC8qIEBAIHRoZXNlIHNob3VsZCBiZSBpbiBhICJzdGFicy5oIiBmaWxlLCBvciBtYXliZSBhcy5oICovCi0jaWZuZGVmIFNUQUJfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIuc3RhYiIKLSNlbmRpZgotI2lmbmRlZiBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FICIuc3RhYnN0ciIKLSNlbmRpZgotICBpZiAoc3RyY21wIChTVEFCX1NUUklOR19TRUNUSU9OX05BTUUsIHNlYy0+bmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnNlYyA9IHNlYzsKLSAgc2VjID0gc3Vic2VnX2dldCAoU1RBQl9TRUNUSU9OX05BTUUsIDApOwotICAvKiBzaXplIGlzIGFscmVhZHkgcm91bmRlZCB1cCwgc2luY2Ugb3RoZXIgc2VjdGlvbiB3aWxsIGJlIGxpc3RlZCBmaXJzdCAqLwotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzdHJzZWMpOwotCi0gIG5fZW50cmllcyA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSAvIDEyIC0gMTsKLQotICAvKiBGaW5kIGZpcnN0IG5vbi1lbXB0eSBmcmFnLiAgSXQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaC4gICovCi0gIGZyYWdwID0gc2VnX2luZm8gKHNlYyktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHdoaWxlIChmcmFncCAmJiBmcmFncC0+ZnJfZml4ID09IDApCi0gICAgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dDsKLSAgYXNzZXJ0IChmcmFncCAhPSAwICYmIGZyYWdwLT5mcl9maXggPj0gMTIpOwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZXMuICAqLwotICBwID0gZnJhZ3AtPmZyX2xpdGVyYWw7Ci0gIGJmZF9oX3B1dF8xNiAoc3Rkb3V0cHV0LCBuX2VudHJpZXMsIChiZmRfYnl0ZSAqKSBwICsgNik7Ci0gIGJmZF9oX3B1dF8zMiAoc3Rkb3V0cHV0LCBzaXplLCAoYmZkX2J5dGUgKikgcCArIDgpOwotfQotCi12b2lkCi1vYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3RhYnN0cl9uYW1lOwotICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoaXMgZmlyc3Qgc3ltYm9sLiAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIC8qIFplcm8gaXQgb3V0LiAqLwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdGFic3RyX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VnLT5uYW1lKSArIDQpOwotICBzdHJjcHkgKHN0YWJzdHJfbmFtZSwgc2VnLT5uYW1lKTsKLSAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKLSAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKLSAga25vdyAoc3Ryb2ZmID09IDEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotLyogZm9yIGRlYnVnZ2luZyAqLwotY29uc3QgY2hhciAqCi1zX2dldF9uYW1lIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gKChzID09IE5VTEwpID8gIihOVUxMKSIgOiBTX0dFVF9OQU1FIChzKSk7Ci19Ci0KLXZvaWQKLXN5bWJvbF9kdW1wICgpCi17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIHByaW50ZihfKCIweCVseDogXCIlc1wiIHR5cGUgPSAlbGQsIGNsYXNzID0gJWQsIHNlZ21lbnQgPSAlZFxuIiksCi0JICAgICAodW5zaWduZWQgbG9uZykgc3ltYm9sUCwKLQkgICAgIFNfR0VUX05BTUUoc3ltYm9sUCksCi0JICAgICAobG9uZykgU19HRVRfREFUQV9UWVBFKHN5bWJvbFApLAotCSAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQKSwKLQkgICAgIChpbnQpIFNfR0VUX1NFR01FTlQoc3ltYm9sUCkpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0KLSNlbHNlIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLSNpbmNsdWRlICJmcmFncy5oIgotLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBpbmNsdWRlIGludGVybmFsIGJmZCB0aGluZ3MuICovCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jaWZkZWYgVEVfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotLyogVGhlIE5PUF9PUENPREUgaXMgZm9yIHRoZSBhbGlnbm1lbnQgZmlsbCB2YWx1ZS4gIEZpbGwgd2l0aCBub3Agc28KLSAgIHRoYXQgd2UgY2FuIHN0aWNrIHNlY3Rpb25zIHRvZ2V0aGVyIHdpdGhvdXQgY2F1c2luZyB0cm91YmxlLiAgKi8KLSNpZm5kZWYgTk9QX09QQ09ERQotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDAKLSNlbmRpZgotCi0vKiBUaGUgemVyb2VzIGlmIHN5bWJvbCBuYW1lIGlzIGxvbmdlciB0aGFuIDggY2hhcnMgKi8KLSNkZWZpbmUgU19TRVRfWkVST0VTKHMsdikJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl96ZXJvZXMgPSAodikpCi0KLSNkZWZpbmUgTUlOKGEsYikgKChhKSA8IChiKT8gKGEpIDogKGIpKQotCi0vKiBUaGlzIHZlY3RvciBpcyB1c2VkIHRvIHR1cm4gYSBnYXMgaW50ZXJuYWwgc2VnbWVudCBudW1iZXIgaW50byBhCi0gICBzZWN0aW9uIG51bWJlciBzdWl0YWJsZSBmb3IgaW5zZXJ0aW9uIGludG8gYSBjb2ZmIHN5bWJvbCB0YWJsZS4KLSAgIFRoaXMgbXVzdCBjb3JyZXNwb25kIHRvIHNlZ19pbmZvX29mZl9ieV80LiAgKi8KLQotY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdID0KLXsJCQkJLyogaW46IHNlZ1QgICBvdXQ6IE5fVFlQRSBiaXRzICovCi0gIENfQUJTX1NFQ1RJT04sCi0gIDEsICAgIDIsICAzLCAgIDQsICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLAotICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwKLSAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsCi0gIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLAotICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfVU5LTk9XTiAqLwotICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfR09PRiAqLwotICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfRVhQUiAqLwotICBDX0RFQlVHX1NFQ1RJT04sCQkvKiBTRUdfREVCVUcgKi8KLSAgQ19OVFZfU0VDVElPTiwJCS8qIFNFR19OVFYgKi8KLSAgQ19QVFZfU0VDVElPTiwJCS8qIFNFR19QVFYgKi8KLSAgQ19SRUdJU1RFUl9TRUNUSU9OLAkJLyogU0VHX1JFR0lTVEVSICovCi19OwotCi1pbnQgZnVuY3Rpb25fbGluZW9mZiA9IC0xOwkvKiBPZmZzZXQgaW4gbGluZSNzIHdoZXJlIHRoZSBsYXN0IGZ1bmN0aW9uCi0JCQkJICAgc3RhcnRlZCAodGhlIG9kZCBlbnRyeSBmb3IgbGluZSAjMCkgKi8KLQotLyogc3RydWN0dXJlIHVzZWQgdG8ga2VlcCB0aGUgZmlsZW5hbWVzIHdoaWNoCi0gICBhcmUgdG9vIGxvbmcgYXJvdW5kIHNvIHRoYXQgd2UgY2FuIHN0aWNrIHRoZW0KLSAgIGludG8gdGhlIHN0cmluZyB0YWJsZSAqLwotc3RydWN0IGZpbGVuYW1lX2xpc3QgCi17Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqbmV4dDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9oZWFkOwotc3RhdGljIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmaWxlbmFtZV9saXN0X3RhaWw7Ci0KLXN0YXRpYyBzeW1ib2xTICpsYXN0X2xpbmVfc3ltYm9sOwotCi0vKiBBZGQgNCB0byB0aGUgcmVhbCB2YWx1ZSB0byBnZXQgdGhlIGluZGV4IGFuZCBjb21wZW5zYXRlIHRoZQotICAgbmVnYXRpdmVzLiBUaGlzIHZlY3RvciBpcyB1c2VkIGJ5IFNfR0VUX1NFR01FTlQgdG8gdHVybiBhIGNvZmYKLSAgIHNlY3Rpb24gbnVtYmVyIGludG8gYSBzZWdtZW50IG51bWJlcgotKi8KLXN0YXRpYyBzeW1ib2xTICpwcmV2aW91c19maWxlX3N5bWJvbDsKLXZvaWQgY19zeW1ib2xfbWVyZ2UgKCk7Ci1zdGF0aWMgaW50IGxpbmVfYmFzZTsKLQotc3ltYm9sUyAqY19zZWN0aW9uX3N5bWJvbCAoKTsKLWJmZCAqYWJmZDsKLQotc3RhdGljIHZvaWQgZml4dXBfc2VnbWVudCBQQVJBTVMgKChzZWdtZW50X2luZm9fdHlwZSAqc2VnUCwKLQkJCQkgICBzZWdUIHRoaXNfc2VnbWVudF90eXBlKSk7Ci0KLQotc3RhdGljIHZvaWQgZml4dXBfbWRlcHMgUEFSQU1TICgoZnJhZ1MgKiwKLQkJCQkgb2JqZWN0X2hlYWRlcnMgKiwKLQkJCQkgc2VnVCkpOwotCi0KLXN0YXRpYyB2b2lkIGZpbGxfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiBhYmZkLAotCQkJCSAgb2JqZWN0X2hlYWRlcnMgKiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgKikpOwotCi0KLXN0YXRpYyBpbnQgY19saW5lX25ldyBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sLCBsb25nIHBhZGRyLAotCQkJICAgICAgIGludCBsaW5lX251bWJlciwKLQkJCSAgICAgICBmcmFnUyAqIGZyYWcpKTsKLQotCi1zdGF0aWMgdm9pZCB3X3N5bWJvbHMgUEFSQU1TICgoYmZkICogYWJmZCwgY2hhciAqd2hlcmUsCi0JCQkgICAgICAgc3ltYm9sUyAqIHN5bWJvbF9yb290UCkpOwotCi1zdGF0aWMgdm9pZCBhZGp1c3Rfc3RhYl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VnVCBzZWcpKTsKLQotc3RhdGljIHZvaWQgb2JqX2NvZmZfbGNvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl90ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfZGF0YSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgb2JqX2NvZmZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotLyogV2hlbiBub3QgdXNpbmcgQkZEX0FTU0VNQkxFUiwgd2UgcGVybWl0IHVwIHRvIDQwIHNlY3Rpb25zLgotCi0gICBUaGlzIGFycmF5IG1hcHMgYSBDT0ZGIHNlY3Rpb24gbnVtYmVyIGludG8gYSBnYXMgc2VjdGlvbiBudW1iZXIuCi0gICBCZWNhdXNlIENPRkYgdXNlcyBuZWdhdGl2ZSBzZWN0aW9uIG51bWJlcnMsIHlvdSBtdXN0IGFkZCA0IHRvIHRoZQotICAgQ09GRiBzZWN0aW9uIG51bWJlciB3aGVuIGluZGV4aW5nIGludG8gdGhpcyBhcnJheTsgdGhpcyBpcyBkb25lIHZpYQotICAgdGhlIFNFR19JTkZPX0ZST01fU0VDVElPTl9OVU1CRVIgbWFjcm8uICBUaGlzIG11c3QgY29ycmVzcG9uZCB0bwotICAgc2VnX05fVFlQRS4gICovCi0KLXN0YXRpYyBjb25zdCBzZWdUIHNlZ19pbmZvX29mZl9ieV80W10gPQotewotIFNFR19QVFYsCi0gU0VHX05UViwKLSBTRUdfREVCVUcsCi0gU0VHX0FCU09MVVRFLAotIFNFR19VTktOT1dOLAotIFNFR19FMCwgIFNFR19FMSwgIFNFR19FMiwgIFNFR19FMywgIFNFR19FNCwKLSBTRUdfRTUsICBTRUdfRTYsICBTRUdfRTcsICBTRUdfRTgsICBTRUdfRTksCi0gU0VHX0UxMCwgU0VHX0UxMSwgU0VHX0UxMiwgU0VHX0UxMywgU0VHX0UxNCwKLSBTRUdfRTE1LCBTRUdfRTE2LCBTRUdfRTE3LCBTRUdfRTE4LCBTRUdfRTE5LAotIFNFR19FMjAsIFNFR19FMjEsIFNFR19FMjIsIFNFR19FMjMsIFNFR19FMjQsCi0gU0VHX0UyNSwgU0VHX0UyNiwgU0VHX0UyNywgU0VHX0UyOCwgU0VHX0UyOSwKLSBTRUdfRTMwLCBTRUdfRTMxLCBTRUdfRTMyLCBTRUdfRTMzLCBTRUdfRTM0LAotIFNFR19FMzUsIFNFR19FMzYsIFNFR19FMzcsIFNFR19FMzgsIFNFR19FMzksCi0gKHNlZ1QpIDQwLAotIChzZWdUKSA0MSwKLSAoc2VnVCkgNDIsCi0gKHNlZ1QpIDQzLAotIChzZWdUKSA0NCwKLSAoc2VnVCkgNDUsCi0gKHNlZ1QpIDAsCi0gKHNlZ1QpIDAsCi0gKHNlZ1QpIDAsCi0gU0VHX1JFR0lTVEVSCi19OwotCi0jZGVmaW5lIFNFR19JTkZPX0ZST01fU0VDVElPTl9OVU1CRVIoeCkgKHNlZ19pbmZvX29mZl9ieV80Wyh4KSs0XSkKLQotc3RhdGljIHJlbGF4X2FkZHJlc3NUCi1yZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQotICAgICByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwotICAgICBsb25nIGFsaWdubWVudDsKLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19Ci0KLQotc2VnVAotc19nZXRfc2VnbWVudCAoeCkKLSAgICAgc3ltYm9sUyAqIHg7Ci17Ci0gIHJldHVybiBTRUdfSU5GT19GUk9NX1NFQ1RJT05fTlVNQkVSICh4LT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0pOwotfQotCi0vKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgY2hhaW4gYW5kIGZpbGwgaW4gdGhlIHNlY3Rpb24gaGVhZGVyCi0gICB0byBjb250YWluIGFsbCBvZiBpdCwgYWxzbyBmaWxsIGluIHRoZSBhZGRyIG9mIHRoZSBzZWN0aW9ucyAqLwotc3RhdGljIHVuc2lnbmVkIGludAotc2l6ZV9zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgaWR4OwotewotCi0gIHVuc2lnbmVkIGludCBzaXplID0gMDsKLSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baWR4XS5mcmNoYWluUC0+ZnJjaF9yb290OwotICB3aGlsZSAoZnJhZykKLSAgICB7Ci0gICAgICBzaXplID0gZnJhZy0+ZnJfYWRkcmVzczsKLSAgICAgIGlmIChmcmFnLT5mcl9hZGRyZXNzICE9IHNpemUpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJPdXQgb2Ygc3RlcFxuIikpOwotCSAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JewotI2lmZGVmIFRDX0NPRkZfU0laRU1BQ0hERVAKLQljYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgc2l6ZSArPSBUQ19DT0ZGX1NJWkVNQUNIREVQIChmcmFnKTsKLQkgIGJyZWFrOwotI2VuZGlmCi0JY2FzZSByc19zcGFjZToKLQkgIGFzc2VydCAoZnJhZy0+ZnJfc3ltYm9sID09IDApOwotCWNhc2UgcnNfZmlsbDoKLQljYXNlIHJzX29yZzoKLQkgIHNpemUgKz0gZnJhZy0+ZnJfZml4OwotCSAgc2l6ZSArPSBmcmFnLT5mcl9vZmZzZXQgKiBmcmFnLT5mcl92YXI7Ci0JICBicmVhazsKLQljYXNlIHJzX2FsaWduOgotCWNhc2UgcnNfYWxpZ25fY29kZToKLQkgIHsKLQkgICAgYWRkcmVzc1Qgb2ZmOwotCi0JICAgIHNpemUgKz0gZnJhZy0+ZnJfZml4OwotCSAgICBvZmYgPSByZWxheF9hbGlnbiAoc2l6ZSwgZnJhZy0+ZnJfb2Zmc2V0KTsKLQkgICAgaWYgKGZyYWctPmZyX3N1YnR5cGUgIT0gMCAmJiBvZmYgPiBmcmFnLT5mcl9zdWJ0eXBlKQotCSAgICAgIG9mZiA9IDA7Ci0JICAgIHNpemUgKz0gb2ZmOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIEJBRF9DQVNFIChmcmFnLT5mcl90eXBlKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotICAgIH0KLSAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfc2l6ZSA9IHNpemU7Ci0gIHJldHVybiBzaXplOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvdW50X2VudHJpZXNfaW5fY2hhaW4gKGlkeCkKLSAgICAgdW5zaWduZWQgaW50IGlkeDsKLXsKLSAgdW5zaWduZWQgaW50IG5yZWxvY3M7Ci0gIGZpeFMgKmZpeHVwX3B0cjsKLQotICAvKiBDb3VudCB0aGUgcmVsb2NhdGlvbnMgKi8KLSAgZml4dXBfcHRyID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7Ci0gIG5yZWxvY3MgPSAwOwotICB3aGlsZSAoZml4dXBfcHRyICE9IChmaXhTICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGZpeHVwX3B0ci0+ZnhfZG9uZSA9PSAwICYmIFRDX0NPVU5UX1JFTE9DIChmaXh1cF9wdHIpKQotCXsKLSNpZmRlZiBUQ19BMjlLCi0JICBpZiAoZml4dXBfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfQ09OU1RIKQotCSAgICBucmVsb2NzICs9IDI7Ci0JICBlbHNlCi0JICAgIG5yZWxvY3MrKzsKLSNlbHNlCi0JICBucmVsb2NzKys7Ci0jZW5kaWYKLQl9Ci0KLSAgICAgIGZpeHVwX3B0ciA9IGZpeHVwX3B0ci0+ZnhfbmV4dDsKLSAgICB9Ci0gIHJldHVybiBucmVsb2NzOwotfQotCi0jaWZkZWYgVEVfQVVYCi0KLXN0YXRpYyBpbnQgY29tcGFyZV9leHRlcm5hbF9yZWxvY3MgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogQVVYJ3MgbGQgZXhwZWN0cyByZWxvY2F0aW9ucyB0byBiZSBzb3J0ZWQgKi8KLXN0YXRpYyBpbnQKLWNvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqYSA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgeDsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpiID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSB5OwotICBiZmRfdm1hIGFhZHIgPSBiZmRfZ2V0YjMyIChhLT5yX3ZhZGRyKTsKLSAgYmZkX3ZtYSBiYWRyID0gYmZkX2dldGIzMiAoYi0+cl92YWRkcik7Ci0gIHJldHVybiAoYWFkciA8IGJhZHIgPyAtMSA6IGJhZHIgPCBhYWRyID8gMSA6IDApOwotfQotCi0jZW5kaWYKLQotLyogb3V0cHV0IGFsbCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbiAqLwotdm9pZAotZG9fcmVsb2NzX2ZvciAoYWJmZCwgaCwgZmlsZV9jdXJzb3IpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIG9iamVjdF9oZWFkZXJzICogaDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Ci17Ci0gIHVuc2lnbmVkIGludCBucmVsb2NzOwotICB1bnNpZ25lZCBpbnQgaWR4OwotICB1bnNpZ25lZCBsb25nIHJlbG9jX3N0YXJ0ID0gKmZpbGVfY3Vyc29yOwotCi0gIGZvciAoaWR4ID0gU0VHX0UwOyBpZHggPCBTRUdfTEFTVDsgaWR4KyspCi0gICAgewotICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX25hbWVbMF0pCi0JewotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcHRyOwotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRlcm5hbF9yZWxvY192ZWM7Ci0JICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLQkgIHVuc2lnbmVkIGludCBiYXNlID0gc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfcGFkZHI7Ci0JICBmaXhTICpmaXhfcHRyID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7Ci0JICBucmVsb2NzID0gY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KTsKLQotCSAgaWYgKG5yZWxvY3MpCi0JICAgIC8qIEJ5cGFzcyB0aGlzIHN0dWZmIGlmIG5vIHJlbG9jcy4gIFRoaXMgYWxzbyBpbmNpZGVudGFsbHkKLQkgICAgICAgYXZvaWRzIGEgU0NPIGJ1Zywgd2hlcmUgZnJlZShtYWxsb2MoMCkpIHRlbmRzIHRvIGNyYXNoLiAgKi8KLQkgICAgewotCSAgICAgIGV4dGVybmFsX3JlbG9jX3NpemUgPSBucmVsb2NzICogUkVMU1o7Ci0JICAgICAgZXh0ZXJuYWxfcmVsb2NfdmVjID0KLQkJKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBtYWxsb2MgKGV4dGVybmFsX3JlbG9jX3NpemUpOwotCi0JICAgICAgZXh0X3B0ciA9IGV4dGVybmFsX3JlbG9jX3ZlYzsKLQotCSAgICAgIC8qIEZpbGwgaW4gdGhlIGludGVybmFsIGNvZmYgc3R5bGUgcmVsb2Mgc3RydWN0IGZyb20gdGhlCi0JCSBpbnRlcm5hbCBmaXggbGlzdC4gICovCi0JICAgICAgd2hpbGUgKGZpeF9wdHIpCi0JCXsKLQkJICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50cjsKLQotCQkgIC8qIE9ubHkgb3V0cHV0IHNvbWUgb2YgdGhlIHJlbG9jYXRpb25zICovCi0JCSAgaWYgKGZpeF9wdHItPmZ4X2RvbmUgPT0gMCAmJiBUQ19DT1VOVF9SRUxPQyAoZml4X3B0cikpCi0JCSAgICB7Ci0jaWZkZWYgVENfUkVMT0NfTUFOR0xFCi0JCSAgICAgIFRDX1JFTE9DX01BTkdMRSAoJnNlZ21lbnRfaW5mb1tpZHhdLCBmaXhfcHRyLCAmaW50ciwKLQkJCQkgICAgICAgYmFzZSk7Ci0KLSNlbHNlCi0JCSAgICAgIHN5bWJvbFMgKmRvdDsKLQkJICAgICAgc3ltYm9sUyAqc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0JCSAgICAgIGludHIucl90eXBlID0gVENfQ09GRl9GSVgyUlRZUEUgKGZpeF9wdHIpOwotCQkgICAgICBpbnRyLnJfdmFkZHIgPQotCQkJYmFzZSArIGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZTsKLQotI2lmZGVmIFRDX0tFRVBfRlhfT0ZGU0VUCi0JCSAgICAgIGludHIucl9vZmZzZXQgPSBmaXhfcHRyLT5meF9vZmZzZXQ7Ci0jZWxzZQotCQkgICAgICBpbnRyLnJfb2Zmc2V0ID0gMDsKLSNlbmRpZgotCi0JCSAgICAgIHdoaWxlIChzeW1ib2xfcHRyLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JCQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sX3B0cikKLQkJCQkgfHwgU19JU19DT01NT04gKHN5bWJvbF9wdHIpKSkKLQkJCXsKLQkJCSAgc3ltYm9sUyAqbjsKLQotCQkJICAvKiBXZSBtdXN0IGF2b2lkIGxvb3BpbmcsIGFzIHRoYXQgY2FuIG9jY3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBiYWRseSB3cml0dGVuIHByb2dyYW0uICAqLwotCQkJICBuID0gc3ltYm9sX3B0ci0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotCQkJICBpZiAobiA9PSBzeW1ib2xfcHRyKQotCQkJICAgIGJyZWFrOwotCQkJICBzeW1ib2xfcHRyID0gbjsKLQkJCX0KLQotCQkgICAgICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLwotCQkgICAgICBpZiAoc3ltYm9sX3B0cikKLQkJCXsKLQkJCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbF9wdHIsIDEpOwotCQkJICBpZiAoISBzeW1ib2xfcHRyLT5zeV9yZXNvbHZlZCkKLQkJCSAgICB7Ci0JCQkgICAgICBjaGFyICpmaWxlOwotCQkJICAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLQkJCSAgICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltYm9sX3B0ciwgJmZpbGUsICZsaW5lKSkKLQkJCQlhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsCi0JCQkJCSAgICAgIF8oInVucmVzb2x2ZWQgcmVsb2NhdGlvbiIpKTsKLQkJCSAgICAgIGVsc2UKLQkJCQlhc19iYWQgKF8oImJhZCByZWxvY2F0aW9uOiBzeW1ib2wgYCVzJyBub3QgaW4gc3ltYm9sIHRhYmxlIiksCi0JCQkJCVNfR0VUX05BTUUgKHN5bWJvbF9wdHIpKTsKLQkJCSAgICB9Ci0JCQkgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OwotCQkJICBpZiAoZG90KQotCQkJICAgIHsKLQkJCSAgICAgIGludHIucl9zeW1uZHggPSBkb3QtPnN5X251bWJlcjsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpbnRyLnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotCQkJICAgIH0KLQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGludHIucl9zeW1uZHggPSAtMTsKLQkJCX0KLSNlbmRpZgotCi0JCSAgICAgICh2b2lkKSBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmludHIsIGV4dF9wdHIpOwotCQkgICAgICBleHRfcHRyKys7Ci0KLSNpZiBkZWZpbmVkKFRDX0EyOUspCi0KLQkJICAgICAgLyogVGhlIDI5ayBoYXMgYSBzcGVjaWFsIGtsdWRnZSBmb3IgdGhlIGhpZ2ggMTYgYml0Ci0JCQkgcmVsb2MuICBUd28gcmVsb2NhdGlvbnMgYXJlIGVtaXRlZCwgUl9JSElIQUxGLAotCQkJIGFuZCBSX0lIQ09OU1QuIFRoZSBzZWNvbmQgb25lIGRvZXNuJ3QgY29udGFpbiBhCi0JCQkgc3ltYm9sLCBidXQgdXNlcyB0aGUgdmFsdWUgZm9yIG9mZnNldC4gICovCi0KLQkJICAgICAgaWYgKGludHIucl90eXBlID09IFJfSUhJSEFMRikKLQkJCXsKLQkJCSAgLyogbm93IGVtaXQgdGhlIHNlY29uZCBiaXQgKi8KLQkJCSAgaW50ci5yX3R5cGUgPSBSX0lIQ09OU1Q7Ci0JCQkgIGludHIucl9zeW1uZHggPSBmaXhfcHRyLT5meF9hZGRudW1iZXI7Ci0JCQkgICh2b2lkKSBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmludHIsIGV4dF9wdHIpOwotCQkJICBleHRfcHRyKys7Ci0JCQl9Ci0jZW5kaWYKLQkJICAgIH0KLQotCQkgIGZpeF9wdHIgPSBmaXhfcHRyLT5meF9uZXh0OwotCQl9Ci0KLSNpZmRlZiBURV9BVVgKLQkgICAgICAvKiBTb3J0IHRoZSByZWxvYyB0YWJsZSAqLwotCSAgICAgIHFzb3J0ICgoUFRSKSBleHRlcm5hbF9yZWxvY192ZWMsIG5yZWxvY3MsCi0JCSAgICAgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MpLCBjb21wYXJlX2V4dGVybmFsX3JlbG9jcyk7Ci0jZW5kaWYKLQotCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgcmVsb2MgdGFibGUgKi8KLQkgICAgICBiZmRfd3JpdGUgKChQVFIpIGV4dGVybmFsX3JlbG9jX3ZlYywgMSwgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKLQkJCSBhYmZkKTsKLQkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY192ZWMpOwotCi0JICAgICAgLyogRmlsbCBpbiBzZWN0aW9uIGhlYWRlciBpbmZvLiAgKi8KLQkgICAgICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19yZWxwdHIgPSAqZmlsZV9jdXJzb3I7Ci0JICAgICAgKmZpbGVfY3Vyc29yICs9IGV4dGVybmFsX3JlbG9jX3NpemU7Ci0JICAgICAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfbnJlbG9jID0gbnJlbG9jczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm8gcmVsb2NzICovCi0JICAgICAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfcmVscHRyID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIFNldCByZWxvY2F0aW9uX3NpemUgZmllbGQgaW4gZmlsZSBoZWFkZXJzICovCi0gIEhfU0VUX1JFTE9DQVRJT05fU0laRSAoaCwgKmZpbGVfY3Vyc29yIC0gcmVsb2Nfc3RhcnQsIDApOwotfQotCi0KLS8qIHJ1biB0aHJvdWdoIGEgZnJhZyBjaGFpbiBhbmQgd3JpdGUgb3V0IHRoZSBkYXRhIHRvIGdvIHdpdGggaXQsIGZpbGwKLSAgIGluIHRoZSBzY25oZHJzIHdpdGggdGhlIGluZm8gb24gdGhlIGZpbGUgcG9zdGlvbnMKLSovCi1zdGF0aWMgdm9pZAotZmlsbF9zZWN0aW9uIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Ci17Ci0KLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBwYWRkciA9IDA7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnMgPSAmKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIpOwotCi0gICAgICBQUk9HUkVTUyAoMSk7Ci0KLSAgICAgIGlmIChzLT5zX25hbWVbMF0pCi0JewotCSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgIGNoYXIgKmJ1ZmZlcjsKLQotCSAgaWYgKHMtPnNfc2l6ZSA9PSAwKQotCSAgICBzLT5zX3NjbnB0ciA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBidWZmZXIgPSB4bWFsbG9jIChzLT5zX3NpemUpOwotCSAgICAgIHMtPnNfc2NucHRyID0gKmZpbGVfY3Vyc29yOwotCSAgICB9Ci0JICBrbm93IChzLT5zX3BhZGRyID09IHBhZGRyKTsKLQotCSAgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLnRleHQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmRhdGEiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmJzcyIpID09IDApCi0JICAgIHsKLQkgICAgICBzLT5zX3NjbnB0ciA9IDA7Ci0JICAgICAgcy0+c19mbGFncyB8PSBTVFlQX0JTUzsKLQotCSAgICAgIC8qIEBAIFNob3VsZCBtYWtlIHRoZSBpMzg2IGFuZCBhMjlrIGNvZmYgdGFyZ2V0cyBkZWZpbmUKLQkJIENPRkZfTk9MT0FEX1BST0JMRU0sIGFuZCBoYXZlIG9ubHkgb25lIHRlc3QgaGVyZS4gICovCi0jaWZuZGVmIFRDX0kzODYKLSNpZm5kZWYgVENfQTI5SwotI2lmbmRlZiBDT0ZGX05PTE9BRF9QUk9CTEVNCi0JICAgICAgLyogQXBwYXJlbnRseSB0aGUgU1ZSMyBsaW5rZXIgKGFuZCBleGVjIHN5c2NhbGwpIGFuZCBVREkKLQkJIG1vbmRmZSBwcm9ncmVtIGFyZSBjb25mdXNlZCBieSBub2xvYWQgc2VjdGlvbnMuICAqLwotCSAgICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmxpdCIpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgPSBTVFlQX0xJVCB8IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmluaXQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmZpbmkiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cm5jbXAgKHMtPnNfbmFtZSwgIi5jb21tZW50IiwgOCkgPT0gMCkKLQkgICAgcy0+c19mbGFncyB8PSBTVFlQX0lORk87Ci0KLQkgIHdoaWxlIChmcmFnKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGZpbGxfc2l6ZTsKLQkgICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JCXsKLQkJY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkJICBpZiAoZnJhZy0+ZnJfZml4KQotCQkgICAgewotCQkgICAgICBtZW1jcHkgKGJ1ZmZlciArIGZyYWctPmZyX2FkZHJlc3MsCi0JCQkgICAgICBmcmFnLT5mcl9saXRlcmFsLAotCQkJICAgICAgKHVuc2lnbmVkIGludCkgZnJhZy0+ZnJfZml4KTsKLQkJICAgICAgb2Zmc2V0ICs9IGZyYWctPmZyX2ZpeDsKLQkJICAgIH0KLQotCQkgIGJyZWFrOwotCQljYXNlIHJzX3NwYWNlOgotCQkgIGFzc2VydCAoZnJhZy0+ZnJfc3ltYm9sID09IDApOwotCQljYXNlIHJzX2ZpbGw6Ci0JCWNhc2UgcnNfYWxpZ246Ci0JCWNhc2UgcnNfYWxpZ25fY29kZToKLQkJY2FzZSByc19vcmc6Ci0JCSAgaWYgKGZyYWctPmZyX2ZpeCkKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzLAotCQkJICAgICAgZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICh1bnNpZ25lZCBpbnQpIGZyYWctPmZyX2ZpeCk7Ci0JCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7Ci0JCSAgICB9Ci0KLQkJICBmaWxsX3NpemUgPSBmcmFnLT5mcl92YXI7Ci0JCSAgaWYgKGZpbGxfc2l6ZSAmJiBmcmFnLT5mcl9vZmZzZXQgPiAwKQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBvZmYgPSBmcmFnLT5mcl9maXg7Ci0JCSAgICAgIGZvciAoY291bnQgPSBmcmFnLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCQkJewotCQkJICBpZiAoZmlsbF9zaXplICsgZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiA8PSBzLT5zX3NpemUpCi0JCQkgICAgewotCQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzICsgb2ZmLAotCQkJCSAgICAgIGZyYWctPmZyX2xpdGVyYWwgKyBmcmFnLT5mcl9maXgsCi0JCQkJICAgICAgZmlsbF9zaXplKTsKLQkJCSAgICAgIG9mZiArPSBmaWxsX3NpemU7Ci0JCQkgICAgICBvZmZzZXQgKz0gZmlsbF9zaXplOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSByc19icm9rZW5fd29yZDoKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotCSAgICB9Ci0KLQkgIGlmIChzLT5zX3NpemUgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzLT5zX3NjbnB0ciAhPSAwKQotCQl7Ci0JCSAgYmZkX3dyaXRlIChidWZmZXIsIHMtPnNfc2l6ZSwgMSwgYWJmZCk7Ci0JCSAgKmZpbGVfY3Vyc29yICs9IHMtPnNfc2l6ZTsKLQkJfQotCSAgICAgIGZyZWUgKGJ1ZmZlcik7Ci0JICAgIH0KLQkgIHBhZGRyICs9IHMtPnNfc2l6ZTsKLQl9Ci0gICAgfQotfQotCi0vKiBDb2ZmIGZpbGUgZ2VuZXJhdGlvbiAmIHV0aWxpdGllcyAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9oZWFkZXJfYXBwZW5kIChhYmZkLCBoKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBjaGFyIGJ1ZmZlclsxMDAwXTsKLSAgY2hhciBidWZmZXJvWzEwMDBdOwotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIHVuc2lnbmVkIGxvbmcgc3RyaW5nX3NpemUgPSA0OwotI2VuZGlmCi0KLSAgYmZkX3NlZWsgKGFiZmQsIDAsIDApOwotCi0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0gIEhfU0VUX01BR0lDX05VTUJFUiAoaCwgQ09GRl9NQUdJQyk7Ci0gIEhfU0VUX1ZFUlNJT05fU1RBTVAgKGgsIDApOwotICBIX1NFVF9FTlRSWV9QT0lOVCAoaCwgMCk7Ci0gIEhfU0VUX1RFWFRfU1RBUlQgKGgsIHNlZ21lbnRfaW5mb1tTRUdfRTBdLmZyY2hhaW5QLT5mcmNoX3Jvb3QtPmZyX2FkZHJlc3MpOwotICBIX1NFVF9EQVRBX1NUQVJUIChoLCBzZWdtZW50X2luZm9bU0VHX0UxXS5mcmNoYWluUC0+ZnJjaF9yb290LT5mcl9hZGRyZXNzKTsKLSAgSF9TRVRfU0laRU9GX09QVElPTkFMX0hFQURFUiAoaCwgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCAmaC0+YW91dGhkciwKLQkJCQkJCQkgICAgIGJ1ZmZlcm8pKTsKLSNlbHNlIC8qIGRlZmluZWQgKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKSAqLwotICBIX1NFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSIChoLCAwKTsKLSNlbmRpZiAvKiBkZWZpbmVkIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUikgKi8KLQotICBpID0gYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgJmgtPmZpbGVoZHIsIGJ1ZmZlcik7Ci0KLSAgYmZkX3dyaXRlIChidWZmZXIsIGksIDEsIGFiZmQpOwotICBiZmRfd3JpdGUgKGJ1ZmZlcm8sIEhfR0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIgKGgpLCAxLCBhYmZkKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0JICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZQotICAgICAgICAgICAgIG11c3QgY29vcmRpbmF0ZSB3aXRoIHRoYXQgaW4gd3JpdGVfb2JqZWN0X2ZpbGUgYW5kCi0gICAgICAgICAgICAgd19zdHJpbmdzLiAgKi8KLQkgIGlmIChzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA+IFNDTk5NTEVOKQotCSAgICB7Ci0JICAgICAgbWVtc2V0IChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSwgMCwgU0NOTk1MRU4pOwotCSAgICAgIHNwcmludGYgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCAiLyVsdSIsIHN0cmluZ19zaXplKTsKLQkgICAgICBzdHJpbmdfc2l6ZSArPSBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSArIDE7Ci0JICAgIH0KLSNlbmRpZgotCi0JICBzaXplID0gYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLAotCQkJCQkgICAmKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIpLAotCQkJCQkgICBidWZmZXIpOwotCSAgaWYgKHNpemUgPT0gMCkKLQkgICAgYXNfYmFkIChfKCJiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgZmFpbGVkIikpOwotCSAgYmZkX3dyaXRlIChidWZmZXIsIHNpemUsIDEsIGFiZmQpOwotCX0KLSAgICB9Ci19Ci0KLQotY2hhciAqCi1zeW1ib2xfdG9fY2hhcnMgKGFiZmQsIHdoZXJlLCBzeW1ib2xQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3ltYm9sUyAqIHN5bWJvbFA7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1hdXggPSBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdmFsdWVUIHZhbDsKLQotICAvKiBUdXJuIGFueSBzeW1ib2xzIHdpdGggcmVnaXN0ZXIgYXR0cmlidXRlcyBpbnRvIGFicyBzeW1ib2xzICovCi0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSByZWdfc2VjdGlvbikKLSAgICB7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICB9Ci0gIC8qIEF0IHRoZSBzYW1lIHRpbWUsIHJlbG9jYXRlIGFsbCBzeW1ib2xzIHRvIHRoZWlyIG91dHB1dCB2YWx1ZSAqLwotCi0jaWZuZGVmIFRFX1BFCi0gIHZhbCA9IChzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sUCldLnNjbmhkci5zX3BhZGRyCi0JICsgU19HRVRfVkFMVUUgKHN5bWJvbFApKTsKLSNlbHNlCi0gIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWwpOwotCi0gIHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl92YWx1ZSA9IHZhbDsKLQotICB3aGVyZSArPSBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5LAotCQkJCSAgd2hlcmUpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1hdXg7IGkrKykKLSAgICB7Ci0gICAgICB3aGVyZSArPSBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKGFiZmQsCi0JCQkJICAgICAgJnN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50W2ldLAotCQkJCSAgICAgIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCksCi0JCQkJICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCksCi0JCQkJICAgICAgaSwgbnVtYXV4LCB3aGVyZSk7Ci0gICAgfQotICByZXR1cm4gd2hlcmU7Ci0KLX0KLQotdm9pZAotY29mZl9vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBjaGFyIHVuZGVyc2NvcmUgPSAwOwkJLyogU3ltYm9sIGhhcyBsZWFkaW5nIF8gKi8KLQotICAvKiBFZmZlY3RpdmUgc3ltYm9sICovCi0gIC8qIFN0b3JlIHRoZSBwb2ludGVyIGluIHRoZSBvZmZzZXQuICovCi0gIFNfU0VUX1pFUk9FUyAoc3ltYm9sUCwgMEwpOwotICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFRfTlVMTCk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIDApOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAwKTsKLSAgLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLwotICBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2ZsYWdzID0gMDsKLSAgLyogQXV4aWxpYXJ5IGVudHJpZXMgKi8KLSAgbWVtc2V0ICgoY2hhciAqKSAmc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0sIDAsIEFVWEVTWik7Ci0KLSAgaWYgKFNfSVNfU1RSSU5HIChzeW1ib2xQKSkKLSAgICBTRl9TRVRfU1RSSU5HIChzeW1ib2xQKTsKLSAgaWYgKCF1bmRlcnNjb3JlICYmIFNfSVNfTE9DQUwgKHN5bWJvbFApKQotICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgLmxuIGRpcmVjdGl2ZXMuCi0gKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xuIChhcHBsaW5lKQotICAgICBpbnQgYXBwbGluZTsKLXsKLSAgaW50IGw7Ci0KLSAgaWYgKCEgYXBwbGluZSAmJiBkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIHdyb25nIGNvbnRleHQgKi8KLQotICBsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGNfbGluZV9uZXcgKDAsIGZyYWdfbm93X2ZpeCAoKSwgbCwgZnJhZ19ub3cpOwotCi0gIGlmIChhcHBsaW5lKQotICAgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIGwgLSAxKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlpZiAoISBhcHBsaW5lKQotCSAgbCArPSBsaW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGwpOwotICAgICAgfQotCi0gIH0KLSNlbmRpZgotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICoJCQlkZWYoKQotICoKLSAqIEhhbmRsZSAuZGVmIGRpcmVjdGl2ZXMuCi0gKgotICogT25lIG1pZ2h0IGFzayA6IHdoeSBjYW4ndCB3ZSBzeW1ib2xfbmV3IGlmIHRoZSBzeW1ib2wgZG9lcyBub3QKLSAqIGFscmVhZHkgZXhpc3QgYW5kIGZpbGwgaXQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4gIEJlY2F1c2Ugb2YKLSAqIHRoZSBDX0VGQ04gc3BlY2lhbCBzeW1ib2wuIEl0IHdvdWxkIGNsb2JiZXIgdGhlIHZhbHVlIG9mIHRoZQotICogZnVuY3Rpb24gc3ltYm9sIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIG5vdGljZSB0aGF0IGl0IGlzCi0gKiBhIENfRUZDTi4gQW5kIGEgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG1vcmUgY2xlYXIgdGhpcwotICogd2F5LiAoYXQgbGVhc3QgSSB0aGluayBpdCBpcyA6LSkuCi0gKgotICovCi0KLSNkZWZpbmUgU0tJUF9TRU1JX0NPTE9OKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnOycpCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRVMoKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgXAotCQkJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RlZiAod2hhdCkKLSAgICAgaW50IHdoYXQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciBuYW1lX2VuZDsJCS8qIENoYXIgYWZ0ZXIgdGhlIGVuZCBvZiBuYW1lICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lOwkJLyogTmFtZSBvZiB0aGUgZGVidWcgc3ltYm9sICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lX2NvcHk7CS8qIFRlbXBvcmFyeSBjb3B5IG9mIHRoZSBuYW1lICovCi0gIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9sZW5ndGg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IChzeW1ib2xTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mICgqZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICBtZW1zZXQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDAsIHNpemVvZiAoKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKLQotICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9sX25hbWVfbGVuZ3RoID0gc3RybGVuIChzeW1ib2xfbmFtZSk7Ci0gIHN5bWJvbF9uYW1lX2NvcHkgPSB4bWFsbG9jIChzeW1ib2xfbmFtZV9sZW5ndGggKyAxKTsKLSAgc3RyY3B5IChzeW1ib2xfbmFtZV9jb3B5LCBzeW1ib2xfbmFtZSk7Ci0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lX2NvcHkgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lX2NvcHkpOwotI2VuZGlmCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV3IHN5bWJvbCAqLwotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgU19TRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgKCpzeW1ib2xfbmFtZV9jb3B5ID09ICdfJwotCQkJCSAgICAgICA/IHN5bWJvbF9uYW1lX2NvcHkgKyAxCi0JCQkJICAgICAgIDogc3ltYm9sX25hbWVfY29weSkpOwotI2Vsc2UgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICBTX1NFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbmFtZV9jb3B5KTsKLSNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi0gIC8qIGZyZWUoc3ltYm9sX25hbWVfY29weSk7ICovCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X25hbWVfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpIH4wOwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9udW1iZXIgPSB+MDsKLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgU0ZfU0VUX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXVuc2lnbmVkIGludCBkaW1faW5kZXg7Ci0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2VuZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IDA7Ci0gIC8qIERJTSBCVUcgRklYIHNhY0BjeWdudXMuY29tICovCi0gIGRpbV9pbmRleCA9IDA7Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZGVmIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICAvKiBTZXQgdGhlIHNlY3Rpb24gbnVtYmVyIGFjY29yZGluZyB0byBzdG9yYWdlIGNsYXNzLiAqLwotICBzd2l0Y2ggKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICBjYXNlIENfU1RSVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICBjYXNlIENfVU5UQUc6Ci0gICAgICBTRl9TRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0ZJTEU6Ci0gICAgY2FzZSBDX1RQREVGOgotICAgICAgU0ZfU0VUX0RFQlVHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIFNFR19ERUJVRyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19FRkNOOgotICAgICAgU0ZfU0VUX0xPQ0FMIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsJLyogRG8gbm90IGVtaXQgdGhpcyBzeW1ib2wuICovCi0gICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgQ19CTE9DSzoKLSAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsJLyogV2lsbCBuZWVkIHByb2Nlc3NpbmcgYmVmb3JlIHdyaXRpbmcgKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0ZDTjoKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIFNFR19FMCk7Ci0KLSAgICAgIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLCAiLmJmIikgPT0gMCkKLQl7CQkJLyogLmJmICovCi0JICBpZiAoZnVuY3Rpb25fbGluZW9mZiA8IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImAuYmYnIHN5bWJvbCB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIikpOwotCSAgICB9CQkJLyogbWlzc2luZyBmdW5jdGlvbiBzeW1ib2wgKi8KLQkgIFNBX0dFVF9TWU1fTE5OT1BUUiAobGFzdF9saW5lX3N5bWJvbCkgPSBmdW5jdGlvbl9saW5lb2ZmOwotCi0JICBTRl9TRVRfUFJPQ0VTUyAobGFzdF9saW5lX3N5bWJvbCk7Ci0JICBTRl9TRVRfQURKX0xOTk9QVFIgKGxhc3RfbGluZV9zeW1ib2wpOwotCSAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCSAgZnVuY3Rpb25fbGluZW9mZiA9IC0xOwotCX0KLSAgICAgIC8qIFZhbHVlIGlzIGFsd2F5cyBzZXQgdG8gLiAqLwotICAgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgICBicmVhazsKLQotI2lmZGVmIENfQVVUT0FSRwotICAgIGNhc2UgQ19BVVRPQVJHOgotI2VuZGlmIC8qIENfQVVUT0FSRyAqLwotICAgIGNhc2UgQ19BVVRPOgotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX01PUzoKLSAgICBjYXNlIENfTU9FOgotICAgIGNhc2UgQ19NT1U6Ci0gICAgY2FzZSBDX0FSRzoKLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgY2FzZSBDX0VPUzoKLSAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBURV9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgY2FzZSBDX1NUQVQ6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgLyogVmFsaWQgYnV0IHNldCBzb21ld2hlcmUgZWxzZSAoc19jb21tLCBzX2xjb21tLCBjb2xvbikgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1VTVEFUSUM6Ci0gICAgY2FzZSBDX0VYVERFRjoKLSAgICBjYXNlIENfVUxBQkVMOgotICAgICAgYXNfd2FybiAoXygidW5leHBlY3RlZCBzdG9yYWdlIGNsYXNzICVkIiksIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKLSAgICAgIGJyZWFrOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIHN0b3JhZ2UgY2xhc3MgKi8KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGJ1aWx0IGEgZGVidWcgc3ltYm9sLCB0cnkgdG8gZmluZCBpZiB3ZSBzaG91bGQKLSAgICAgbWVyZ2Ugd2l0aCBhbiBleGlzdGluZyBzeW1ib2wgb3Igbm90LiAgSWYgYSBzeW1ib2wgaXMgQ19FRkNOIG9yCi0gICAgIGFic29sdXRlX3NlY3Rpb24gb3IgdW50YWdnZWQgU0VHX0RFQlVHIGl0IG5ldmVyIG1lcmdlcy4gIFdlIGFsc28KLSAgICAgZG9uJ3QgbWVyZ2UgbGFiZWxzLCB3aGljaCBhcmUgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlLCBub3IKLSAgICAgc3ltYm9scyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbiBkZWZpbmVkIHNpbmNlIHRoZXkgYXJlIHR5cGljYWxseQotICAgICB1bmlxdWUsIG5vciBkbyB3ZSBtZXJnZSB0YWdzIHdpdGggbm9uLXRhZ3MuICAqLwotCi0gIC8qIFR3byBjYXNlcyBmb3IgZnVuY3Rpb25zLiAgRWl0aGVyIGRlYnVnIGZvbGxvd2VkIGJ5IGRlZmluaXRpb24gb3IKLSAgICAgZGVmaW5pdGlvbiBmb2xsb3dlZCBieSBkZWJ1Zy4gIEZvciBkZWZpbml0aW9uIGZpcnN0LCB3ZSB3aWxsCi0gICAgIG1lcmdlIHRoZSBkZWJ1ZyBzeW1ib2wgaW50byB0aGUgZGVmaW5pdGlvbi4gIEZvciBkZWJ1ZyBmaXJzdCwgdGhlCi0gICAgIGxpbmVubyBlbnRyeSBNVVNUIHBvaW50IHRvIHRoZSBkZWZpbml0aW9uIGZ1bmN0aW9uIG9yIGVsc2UgaXQKLSAgICAgd2lsbCBwb2ludCBvZmYgaW50byBzcGFjZSB3aGVuIGNyYXdsX3N5bWJvbHMoKSBtZXJnZXMgdGhlIGRlYnVnCi0gICAgIHN5bWJvbCBpbnRvIHRoZSByZWFsIHN5bWJvbC4gIFRoZXJlZm9yLCBsZXQncyBwcmVzdW1lIHRoZSBkZWJ1ZwotICAgICBzeW1ib2wgaXMgYSByZWFsIGZ1bmN0aW9uIHJlZmVyZW5jZS4gKi8KLQotICAvKiBGSVhNRS1TT09OIElmIGZvciBzb21lIHJlYXNvbiB0aGUgZGVmaW5pdGlvbiBsYWJlbC9zeW1ib2wgaXMKLSAgICAgbmV2ZXIgc2VlbiwgdGhpcyB3aWxsIHByb2JhYmx5IGxlYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgYXQgbGluawotICAgICB0aW1lLiAqLwotCi0gIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX0VGQ04KLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfTEFCRUwKLSAgICAgIHx8IChTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBTRUdfREVCVUcKLQkgICYmICFTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IGFic29sdXRlX3NlY3Rpb24KLSAgICAgIHx8IGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgKHN5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgRE9fTk9UX1NUUklQKSkgPT0gTlVMTAotICAgICAgfHwgKFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpICE9IFNGX0dFVF9UQUcgKHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsCi0JCSAgICAgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIG1lcmdlIHRoZSBuZXdseSBjcmVhdGVkIHN5bWJvbAotCSBpbnRvIHRoZSBvbGQgb25lLiAgVGhpcyBpcyBub3QgbWFuZGF0b3J5LiBUaGUgbGlua2VyIGNhbgotCSBoYW5kbGUgZHVwbGljYXRlIHN5bWJvbHMgY29ycmVjdGx5LiBCdXQgSSBndWVzcyB0aGF0IGl0IHNhdmUKLQkgYSAqbG90KiBvZiBzcGFjZSBpZiB0aGUgYXNzZW1ibHkgZmlsZSBkZWZpbmVzIGEgbG90IG9mCi0JIHN5bWJvbHMuIFtsb2ljXSAqLwotCi0gICAgICAvKiBUaGUgZGVidWcgZW50cnkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIGlzIG1lcmdlZCBpbnRvIHRoZQotCSBwcmV2aW91cyBkZWZpbml0aW9uLiAgKi8KLQotICAgICAgY19zeW1ib2xfbWVyZ2UgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbFApOwotICAgICAgLyogRklYTUUtU09PTiBTaG91bGQgKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgYmUgZnJlZSdkPyB4b3hvcmljaC4gKi8KLSAgICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xQOwotCi0gICAgICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCSAgfHwgU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfU1RBVCkKLQl7Ci0JICAvKiBGb3IgZnVuY3Rpb25zLCBhbmQgdGFncywgYW5kIHN0YXRpYyBzeW1ib2xzLCB0aGUgc3ltYm9sCi0JICAgICAqbXVzdCogYmUgd2hlcmUgdGhlIGRlYnVnIHN5bWJvbCBhcHBlYXJzLiAgTW92ZSB0aGUKLQkgICAgIGV4aXN0aW5nIHN5bWJvbCB0byB0aGUgY3VycmVudCBwbGFjZS4gKi8KLQkgIC8qIElmIGl0IGFscmVhZHkgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QsIGRvIG5vdGhpbmcgKi8KLQkgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IHN5bWJvbF9sYXN0UCkKLQkgICAgewotCSAgICAgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsCi0JCQkgICAgICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwKLQkJCSAgICAgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgIH0JCQkvKiBpZiBub3QgYWxyZWFkeSBpbiBwbGFjZSAqLwotCX0JCQkvKiBpZiBmdW5jdGlvbiAqLwotICAgIH0JCQkJLyogbm9ybWFsIG9yIG1lcmdhYmxlICovCi0KLSAgaWYgKFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKm9sZHRhZzsKLQotICAgICAgb2xkdGFnID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0JCQkJIERPX05PVF9TVFJJUCk7Ci0gICAgICBpZiAob2xkdGFnID09IE5VTEwgfHwgISBTRl9HRVRfVEFHIChvbGR0YWcpKQotCXRhZ19pbnNlcnQgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotCQkgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQotCi0gIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICAgIGtub3cgKHNpemVvZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPD0gc2l6ZW9mIChsb25nKSk7Ci0gICAgICBmdW5jdGlvbl9saW5lb2ZmCi0JPSBjX2xpbmVfbmV3IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gICAgICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgICAgIGlmIChzeW1ib2xQID09IE5VTEwpCi0JewotCSAgLyogVGhhdCBpcywgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZQotCSAgICAgZnVuY3Rpb24uLi4gKi8KLQkgIHN5bWJvbF90YWJsZV9pbnNlcnQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCX0JCQkvKiBkZWZpbml0aW9uIGZvbGxvd3MgZGVidWcgKi8KLSAgICB9CQkJCS8qIENyZWF0ZSB0aGUgbGluZSBudW1iZXIgZW50cnkgcG9pbnRpbmcgdG8gdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQgKi8KLQotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gTlVMTDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RpbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBkaW1faW5kZXg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLQotICBmb3IgKGRpbV9pbmRleCA9IDA7IGRpbV9pbmRleCA8IERJTU5VTTsgZGltX2luZGV4KyspCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFUyAoKTsKLSAgICAgIFNBX1NFVF9TWU1fRElNRU4gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGRpbV9pbmRleCwKLQkJCWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICcsJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfd2FybiAoXygiYmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIGlnbm9yZWQiKSk7Ci0JICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCWNhc2UgJ1xuJzoKLQljYXNlICc7JzoKLQkgIGRpbV9pbmRleCA9IERJTU5VTTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgdGhpc19iYXNlOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgb2JqX2NvZmZfbG4gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gIHRoaXNfYmFzZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIC8qIE9ubHkgLmJmIHN5bWJvbHMgaW5kaWNhdGUgdGhlIHVzZSBvZiBhIG5ldyBiYXNlIGxpbmUgbnVtYmVyOyB0aGUKLSAgICAgbGluZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCAuZWYsIC5iYiwgLmViIGFyZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgc3RhcnQgb2YgdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24uICAqLwotICBpZiAoIXN0cmNtcCAoIi5iZiIsIG5hbWUpKQotICAgIHsKLSNpZiAwIC8qIFhYWCBDYW4gd2UgZXZlciBoYXZlIGxpbmUgbnVtYmVycyBnb2luZyBiYWNrd2FyZHM/ICAqLwotICAgICAgaWYgKHRoaXNfYmFzZSA+IGxpbmVfYmFzZSkKLSNlbmRpZgotCXsKLQkgIGxpbmVfYmFzZSA9IHRoaXNfYmFzZTsKLQl9Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgewotCWV4dGVybiBpbnQgbGlzdGluZzsKLQlpZiAobGlzdGluZykKLQkgIHsKLQkgICAgbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgbGluZV9iYXNlKTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgU0FfU0VUX1NZTV9MTk5PIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCB0aGlzX2Jhc2UpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9zaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgU0FfU0VUX1NZTV9TSVpFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9zY2wgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqc3ltYm9sX25hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLQotICAvKiBBc3N1bWUgdGhhdCB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IC50YWcgaXMgYWx3YXlzIGRlZmluZWQuCi0gICAgIFRoaXMgd2FzIGEgYmFkIGFzc3VtcHRpb24uICBJJ3ZlIGFkZGVkIGZpbmRfb3JfbWFrZS4geG94b3JpY2guICovCi0gIFNBX1NFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLAotCQkgICAgIChsb25nKSB0YWdfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSkpOwotICBpZiAoU0FfR0VUX1NZTV9UQUdORFggKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IDBMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInRhZyBub3QgZm91bmQgZm9yIC50YWcgJXMiKSwgc3ltYm9sX25hbWUpOwotICAgIH0JCQkJLyogbm90IGRlZmluZWQgKi8KLQotICBTRl9TRVRfVEFHR0VEIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoSVNGQ04gKFNfR0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpICYmCi0gICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBDX1RQREVGKQotICAgIHsKLSAgICAgIFNGX1NFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQkJCQkvKiBpcyBhIGZ1bmN0aW9uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgY2hhciAqc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjaGFyIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKLSNlbmRpZgotCi0gICAgICBpZiAoIXN0cmNtcCAoc3ltYm9sX25hbWUsICIuIikpCi0JewotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAvKiBJZiB0aGUgLnZhbCBpcyAhPSBmcm9tIHRoZSAuZGVmIChlLmcuIHN0YXRpY3MpICovCi0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgc3ltYm9sX25hbWUpKQotCXsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3AgPSBPX3N5bWJvbDsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCA9Ci0JICAgIHN5bWJvbF9maW5kX29yX21ha2UgKHN5bWJvbF9uYW1lKTsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IDA7Ci0KLQkgIC8qIElmIHRoZSBzZWdtZW50IGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBmb3J3YXJkIHJlZmVyZW5jZSBpcwotCSAgICAgcmVzb2x2ZWQsIHRoZW4gY29weSB0aGUgc2VnbWVudCBpZCBmcm9tIHRoZSBmb3J3YXJkCi0JICAgICBzeW1ib2wuICAqLwotCSAgU0ZfU0VUX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotCSAgLyogRklYTUU6IGdjYyBjYW4gZ2VuZXJhdGUgYWRkcmVzcyBleHByZXNzaW9ucyBoZXJlIGluCi0JICAgICB1bnVzdWFsIGNhc2VzIChzZWFyY2ggZm9yICJvYnNjdXJlIiBpbiBzZGJvdXQuYykuICBXZQotCSAgICAganVzdCBpZ25vcmUgdGhlIG9mZnNldCBoZXJlLCB0aHVzIGdlbmVyYXRpbmcgaW5jb3JyZWN0Ci0JICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXZSBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUKLQkgICAgIGp1c3QgYmVsb3cuICAqLwotCX0KLSAgICAgIC8qIE90aGVyd2lzZSwgaXQgaXMgdGhlIG5hbWUgb2YgYSBub24gZGVidWcgc3ltYm9sIGFuZAotCSBpdHMgdmFsdWUgd2lsbCBiZSBjYWxjdWxhdGVkIGxhdGVyLiAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gICAgICAvKiBGSVhNRTogdGhpcyBpcyB0byBhdm9pZCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZQotCSBGSVhNRSBjYXNlIG1lbnRpb25lZCBqdXN0IGFib3ZlLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywKLQkJICAgKHZhbHVlVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAgIH0JCQkJLyogaWYgc3ltYm9sIGJhc2VkICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2lmZGVmIFRFX1BFCi0KLS8qIEhhbmRsZSB0aGUgLmxpbmtvbmNlIHBzZXVkby1vcC4gIFRoaXMgaXMgcGFyc2VkIGJ5IHNfbGlua29uY2UgaW4KLSAgIHJlYWQuYywgd2hpY2ggdGhlbiBjYWxscyB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYyByb3V0aW5lLiAgKi8KLQotdm9pZAotb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAodHlwZSkKLSAgICAgZW51bSBsaW5rb25jZV90eXBlIHR5cGU7Ci17Ci0gIHNlZ19pbmZvIChub3dfc2VnKS0+c2NuaGRyLnNfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19DT01EQVQ7Ci0KLSAgLyogV2Ugc3RvcmUgdGhlIHR5cGUgaW4gdGhlIHNlZ19pbmZvIHN0cnVjdHVyZSwgYW5kIHVzZSBpdCB0byBzZXQgdXAKLSAgICAgdGhlIGF1eGlsaWFyeSBlbnRyeSBmb3IgdGhlIHNlY3Rpb24gc3ltYm9sIGluIGNfc2VjdGlvbl9zeW1ib2wuICAqLwotICBzZWdfaW5mbyAobm93X3NlZyktPmxpbmtvbmNlID0gdHlwZTsKLX0KLQotI2VuZGlmIC8qIFRFX1BFICovCi0KLXZvaWQKLWNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotICAvKiBUaGVzZSBoYWQgYmV0dGVyIGJlIHRoZSBzYW1lLiAgVXN1YWxseSAxOCBieXRlcy4gKi8KLSNpZm5kZWYgQkZEX0hFQURFUlMKLSAga25vdyAoc2l6ZW9mIChTWU1FTlQpID09IHNpemVvZiAoQVVYRU5UKSk7Ci0gIGtub3cgKFNZTUVTWiA9PSBBVVhFU1opOwotI2VuZGlmCi0gIHRhZ19pbml0ICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFuZCBwdXRzIGFsbCB0aGUKLSAgIGV4dGVybmFscyBvbnRvIGFub3RoZXIgY2hhaW4gKi8KLQotLyogVGhlIGNoYWluIG9mIGdsb2JhbHMuICAqLwotc3ltYm9sUyAqc3ltYm9sX2dsb2JhbFA7Ci1zeW1ib2xTICpzeW1ib2xfZ2xvYmFsX2xhc3RQOwotCi0vKiBUaGUgY2hhaW4gb2YgZXh0ZXJuYWxzICovCi1zeW1ib2xTICpzeW1ib2xfZXh0ZXJuUDsKLXN5bWJvbFMgKnN5bWJvbF9leHRlcm5fbGFzdFA7Ci0KLXN0YWNrICpibG9ja19zdGFjazsKLXN5bWJvbFMgKmxhc3RfZnVuY3Rpb25QOwotc3RhdGljIHN5bWJvbFMgKmxhc3RfYmZQOwotc3ltYm9sUyAqbGFzdF90YWdQOwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci15YW5rX3N5bWJvbHMgKCkKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotICB1bnNpZ25lZCBpbnQgbGFzdF9maWxlX3N5bW5vID0gMDsKLQotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9oZWFkOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLSAgICAgICBzeW1ib2xQOwotICAgICAgIHN5bWJvbFAgPSBzeW1ib2xQID8gc3ltYm9sX25leHQgKHN5bWJvbFApIDogc3ltYm9sX3Jvb3RQKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkgICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX1dFQUtFWFQpCi0JICAgIGFzX2JhZCAoXygiJXM6IGdsb2JhbCBzeW1ib2xzIG5vdCBzdXBwb3J0ZWQgaW4gY29tbW9uIHNlY3Rpb25zIiksCi0JCSAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCFTRl9HRVRfREVCVUcgKHN5bWJvbFApKQotCXsKLQkgIC8qIERlYnVnIHN5bWJvbHMgZG8gbm90IG5lZWQgYWxsIHRoaXMgcnViYmlzaCAqLwotCSAgc3ltYm9sUyAqcmVhbF9zeW1ib2xQOwotCi0JICAvKiBMKiBhbmQgQ19FRkNOIHN5bWJvbHMgbmV2ZXIgbWVyZ2UuICovCi0JICBpZiAoIVNGX0dFVF9MT0NBTCAoc3ltYm9sUCkKLQkgICAgICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bWJvbFApCi0JICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgIT0gQ19MQUJFTAotCSAgICAgICYmIHN5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICYmIChyZWFsX3N5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChzeW1ib2xQKSwgRE9fTk9UX1NUUklQKSkKLQkgICAgICAmJiByZWFsX3N5bWJvbFAgIT0gc3ltYm9sUCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FLVNPT046IHdoZXJlIGRvIGR1cHMgY29tZSBmcm9tPwotCQkgTWF5YmUgdGFnIHJlZmVyZW5jZXMgYmVmb3JlIGRlZmluaXRpb25zPyB4b3hvcmljaC4gKi8KLQkgICAgICAvKiBNb3ZlIHRoZSBkZWJ1ZyBkYXRhIGZyb20gdGhlIGRlYnVnIHN5bWJvbCB0byB0aGUKLQkJIHJlYWwgc3ltYm9sLiBEbyBOT1QgZG8gdGhlIG9wb3NpdGUgKGkuZS4gbW92ZSBmcm9tCi0JCSByZWFsIHN5bWJvbCB0byBkZWJ1ZyBzeW1ib2wgYW5kIHJlbW92ZSByZWFsIHN5bWJvbCBmcm9tIHRoZQotCQkgbGlzdC4pIEJlY2F1c2Ugc29tZSBwb2ludGVycyByZWZlciB0byB0aGUgcmVhbCBzeW1ib2wKLQkJIHdoZXJlYXMgbm8gcG9pbnRlcnMgcmVmZXIgdG8gdGhlIGRlYnVnIHN5bWJvbC4gKi8KLQkgICAgICBjX3N5bWJvbF9tZXJnZSAoc3ltYm9sUCwgcmVhbF9zeW1ib2xQKTsKLQkgICAgICAvKiBSZXBsYWNlIHRoZSBjdXJyZW50IHN5bWJvbCBieSB0aGUgcmVhbCBvbmUgKi8KLQkgICAgICAvKiBUaGUgc3ltYm9scyB3aWxsIG5ldmVyIGJlIHRoZSBsYXN0IG9yIHRoZSBmaXJzdAotCQkgYmVjYXVzZSA6IDFzdCBzeW1ib2wgaXMgLmZpbGUgYW5kIDMgbGFzdCBzeW1ib2xzIGFyZQotCQkgLnRleHQsIC5kYXRhLCAuYnNzICovCi0JICAgICAgc3ltYm9sX3JlbW92ZSAocmVhbF9zeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfaW5zZXJ0IChyZWFsX3N5bWJvbFAsIHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbFAgPSByZWFsX3N5bWJvbFA7Ci0JICAgIH0JCQkvKiBpZiBub3QgbG9jYWwgYnV0IGR1cCdkICovCi0KLQkgIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCAmJiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0UxKSkKLQkgICAgewotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIFNFR19FMCk7Ci0JICAgIH0JCQkvKiBwdXNoIGRhdGEgaW50byB0ZXh0ICovCi0KLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xQLCAxKTsKLQotCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhU0ZfR0VUX0xPQ0FMIChzeW1ib2xQKSkKLQkJewotCQkgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19FMCkKLQkJewotCQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTEFCRUwpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19TVEFUKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIE1haW5seSB0byBzcGVlZCB1cCBpZiBub3QgLWcgKi8KLQkgIGlmIChTRl9HRVRfUFJPQ0VTUyAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgdGhlIG5lc3RlZCBibG9ja3MgYXV4aWxpYXJ5IGluZm8uICovCi0JICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfQkxPQ0spCi0JCXsKLQkJICBpZiAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ltYm9sUCksICIuYmIiKSkKLQkJICAgIHN0YWNrX3B1c2ggKGJsb2NrX3N0YWNrLCAoY2hhciAqKSAmc3ltYm9sUCk7Ci0JCSAgZWxzZQotCQkgICAgewkJLyogLmViICovCi0JCSAgICAgIHJlZ2lzdGVyIHN5bWJvbFMgKmJlZ2luX3N5bWJvbFA7Ci0JCSAgICAgIGJlZ2luX3N5bWJvbFAgPSAqKHN5bWJvbFMgKiopIHN0YWNrX3BvcCAoYmxvY2tfc3RhY2spOwotCQkgICAgICBpZiAoYmVnaW5fc3ltYm9sUCA9PSAoc3ltYm9sUyAqKSAwKQotCQkJYXNfd2FybiAoXygibWlzbWF0Y2hlZCAuZWIiKSk7Ci0JCSAgICAgIGVsc2UKLQkJCVNBX1NFVF9TWU1fRU5ETkRYIChiZWdpbl9zeW1ib2xQLCBzeW1ib2xfbnVtYmVyICsgMik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAvKiBJZiB3ZSBhcmUgYWJsZSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBhIGZ1bmN0aW9uLCBhbmQgd2UKLQkgICAgICAgYXJlIG91dCBvZiBhIGZ1bmN0aW9uIChsYXN0X2Z1bmN0aW9uUCA9PSAwKSB0aGVuLCB0aGUKLQkgICAgICAgZnVuY3Rpb24gc3ltYm9sIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGF1eGlsaWFyeQotCSAgICAgICBlbnRyeS4gKi8KLQkgICAgICBpZiAobGFzdF9mdW5jdGlvblAgPT0gKHN5bWJvbFMgKikgMCAmJgotCQkgIFNGX0dFVF9GVU5DVElPTiAoc3ltYm9sUCkpCi0JCXsKLQkJICBsYXN0X2Z1bmN0aW9uUCA9IHN5bWJvbFA7Ci0KLQkJICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCkgPCAxKQotCQkgICAgewotCQkgICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQkJICAgIH0JCS8qIG1ha2UgaXQgYXQgbGVhc3QgMSAqLwotCi0JCSAgLyogQ2xvYmJlciBwb3NzaWJsZSBzdGFsZSAuZGltIGluZm9ybWF0aW9uLiAqLwotI2lmIDAKLQkJICAvKiBJZmZlZCBvdXQgYnkgc3RldmUgLSB0aGlzIGZyaWVzIHRoZSBsbm5vcHRyIGluZm8gdG9vICovCi0JCSAgYnplcm8gKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4sCi0JCQkgc2l6ZW9mIChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXS54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuKSk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0ZDTikKLQkJewotCQkgIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAiLmJmIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGxhc3RfYmZQICE9IE5VTEwpCi0JCQlTQV9TRVRfU1lNX0VORE5EWCAobGFzdF9iZlAsIHN5bWJvbF9udW1iZXIpOwotCQkgICAgICBsYXN0X2JmUCA9IHN5bWJvbFA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VGQ04pCi0JCXsKLQkJICAvKiBJIGRvbid0IGV2ZW4ga25vdyBpZiB0aGlzIGlzIG5lZWRlZCBmb3Igc2RiLiBCdXQKLQkJICAgICB0aGUgc3RhbmRhcmQgYXNzZW1ibGVyIGdlbmVyYXRlcyBpdCwgc28uLi4gICovCi0JCSAgaWYgKGxhc3RfZnVuY3Rpb25QID09IChzeW1ib2xTICopIDApCi0JCSAgICBhc19mYXRhbCAoXygiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiKSk7Ci0JCSAgU0FfU0VUX1NZTV9GU0laRSAobGFzdF9mdW5jdGlvblAsCi0JCQkJICAgIChsb25nKSAoU19HRVRfVkFMVUUgKHN5bWJvbFApIC0KLQkJCQkJICAgIFNfR0VUX1ZBTFVFIChsYXN0X2Z1bmN0aW9uUCkpKTsKLQkJICBTQV9TRVRfU1lNX0VORE5EWCAobGFzdF9mdW5jdGlvblAsIHN5bWJvbF9udW1iZXIpOwotCQkgbGFzdF9mdW5jdGlvblAgPSAoc3ltYm9sUyAqKSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChTRl9HRVRfVEFHIChzeW1ib2xQKSkKLQl7Ci0JICAvKiBGaXJzdCBkZXNjcmlwdG9yIG9mIGEgc3RydWN0dXJlIG11c3QgcG9pbnQgdG8KLQkgICAgICAgdGhlIGZpcnN0IHNsb3QgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBkZXNjcmlwdGlvbi4gKi8KLQkgIGxhc3RfdGFnUCA9IHN5bWJvbFA7Ci0KLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VPUykKLQl7Ci0JICAvKiArMiB0YWtlIGluIGFjY291bnQgdGhlIGN1cnJlbnQgc3ltYm9sICovCi0JICBTQV9TRVRfU1lNX0VORE5EWCAobGFzdF90YWdQLCBzeW1ib2xfbnVtYmVyICsgMik7Ci0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GSUxFKQotCXsKLQkgIC8qIElmIHRoZSBmaWxlbmFtZSB3YXMgdG9vIGxvbmcgdG8gZml0IGluIHRoZQotCSAgICAgYXV4ZW50LCBwdXQgaXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotCSAgaWYgKFNBX0dFVF9GSUxFX0ZOQU1FX1pFUk9TIChzeW1ib2xQKSA9PSAwCi0JICAgICAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQKSAhPSAwKQotCSAgICB7Ci0JICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChmaWxlbmFtZV9saXN0X3NjYW4tPmZpbGVuYW1lKSArIDE7Ci0JICAgICAgZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9zY2FuLT5uZXh0OwotCSAgICB9Ci0JICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIGxhc3RfZmlsZV9zeW1ubyk7Ci0JICAgICAgbGFzdF9maWxlX3N5bW5vID0gc3ltYm9sX251bWJlcjsKLQkgICAgfQkJCS8qIG5vIG9uZSBwb2ludHMgYXQgdGhlIGZpcnN0IC5maWxlIHN5bWJvbCAqLwotCX0JCQkvKiBpZiBkZWJ1ZyBvciB0YWcgb3IgZW9zIG9yIGZpbGUgKi8KLQotI2lmZGVmIHRjX2Zyb2JfY29mZl9zeW1ib2wKLSAgICAgIHRjX2Zyb2JfY29mZl9zeW1ib2wgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgICAgIC8qIFdlIG11c3QgcHV0IHRoZSBleHRlcm5hbCBzeW1ib2xzIGFwYXJ0LiBUaGUgbG9hZGVyCi0JIGRvZXMgbm90IGJvbWIgaWYgd2UgZG8gbm90LiBCdXQgdGhlIHJlZmVyZW5jZXMgaW4KLQkgdGhlIGVuZG5keCBmaWVsZCBmb3IgYSAuYmIgc3ltYm9sIGFyZSBub3QgY29ycmVjdGVkCi0JIGlmIGFuIGV4dGVybmFsIHN5bWJvbCBpcyByZW1vdmVkIGJldHdlZW4gLmJiIGFuZCAuYmUuCi0JIEkuZSBpbiB0aGUgZm9sbG93aW5nIGNhc2UgOgotCSBbMjBdIC5iYiBlbmRuZHggPSAyMgotCSBbMjFdIGZvbyBleHRlcm5hbAotCSBbMjJdIC5iZQotCSBsZCB3aWxsIG1vdmUgdGhlIHN5bWJvbCAyMSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGJ1dAotCSBlbmRuZHggd2lsbCBzdGlsbCBiZSAyMiBpbnN0ZWFkIG9mIDIxLiAqLwotCi0KLSAgICAgIGlmIChTRl9HRVRfTE9DQUwgKHN5bWJvbFApKQotCXsKLQkgIC8qIHJlbW92ZSBDX0VGQ04gYW5kIExPQ0FMIChMLi4uKSBzeW1ib2xzICovCi0JICAvKiBuZXh0IHBvaW50ZXIgcmVtYWlucyB2YWxpZCAqLwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLQl9Ci0gICAgICBlbHNlIGlmIChzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgU19JU19DT01NT04gKHN5bWJvbFApKSkKLQl7Ci0JICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgICAgIHN5bWJvbHMuICAqLwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JfQotICAgICAgZWxzZSBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLQkgICAgICAgJiYgIVNfSVNfREVCVUcgKHN5bWJvbFApCi0JICAgICAgICYmICFTRl9HRVRfU1RBVElDUyAoc3ltYm9sUCkKLQkgICAgICAgJiYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUCi0jaWZkZWYgVEVfUEUKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19XRUFLRVhUKSkKLQl7Ci0JICAvKiBpZiBleHRlcm5hbCwgUmVtb3ZlIGZyb20gdGhlIGxpc3QgKi8KLQkgIHN5bWJvbFMgKmhvbGQgPSBzeW1ib2xfcHJldmlvdXMgKHN5bWJvbFApOwotCi0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKLQkgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9leHRlcm5fbGFzdFAsICZzeW1ib2xfZXh0ZXJuUCwgJnN5bWJvbF9leHRlcm5fbGFzdFApOwotCSAgc3ltYm9sUCA9IGhvbGQ7Ci0JfQotICAgICAgZWxzZSBpZiAoISBTX0lTX0RFQlVHIChzeW1ib2xQKQotCSAgICAgICAmJiAhIFNGX0dFVF9TVEFUSUNTIChzeW1ib2xQKQotCSAgICAgICAmJiAhIFNGX0dFVF9GVU5DVElPTiAoc3ltYm9sUCkKLQkgICAgICAgJiYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUCi0jaWZkZWYgVEVfUEUKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLKSkKLQl7Ci0JICBzeW1ib2xTICpob2xkID0gc3ltYm9sX3ByZXZpb3VzIChzeW1ib2xQKTsKLQotCSAgLyogVGhlIE8nUmVpbGx5IENPRkYgYm9vayBzYXlzIHRoYXQgZGVmaW5lZCBnbG9iYWwgc3ltYm9scwotICAgICAgICAgICAgIGNvbWUgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLCBqdXN0IGJlZm9yZQotICAgICAgICAgICAgIHVuZGVmaW5lZCBnbG9iYWwgc3ltYm9scy4gICovCi0KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgKHN5bWJvbFApOwotCSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2dsb2JhbF9sYXN0UCwgJnN5bWJvbF9nbG9iYWxQLAotCQkJICZzeW1ib2xfZ2xvYmFsX2xhc3RQKTsKLQkgIHN5bWJvbFAgPSBob2xkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU0ZfR0VUX1NUUklORyAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCSAgICB9CQkJLyogZml4ICJsb25nIiBuYW1lcyAqLwotCi0JICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyOwotCSAgc3ltYm9sX251bWJlciArPSAxICsgU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCk7Ci0JfQkJCS8qIGlmIGxvY2FsIHN5bWJvbCAqLwotICAgIH0JCQkJLyogdHJhdmVyc2UgdGhlIHN5bWJvbCBsaXN0ICovCi0gIHJldHVybiBzeW1ib2xfbnVtYmVyOwotCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZ2x1ZV9zeW1ib2xzIChoZWFkLCB0YWlsKQotICAgICBzeW1ib2xTICoqaGVhZDsKLSAgICAgc3ltYm9sUyAqKnRhaWw7Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLQotICB3aGlsZSAoKmhlYWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICp0bXAgPSAqaGVhZDsKLQotICAgICAgLyogYXBwZW5kICovCi0gICAgICBzeW1ib2xfcmVtb3ZlICh0bXAsIGhlYWQsIHRhaWwpOwotICAgICAgc3ltYm9sX2FwcGVuZCAodG1wLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gICAgICAvKiBhbmQgcHJvY2VzcyAqLwotICAgICAgaWYgKFNGX0dFVF9TVFJJTkcgKHRtcCkpCi0JewotCSAgdG1wLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FICh0bXApKSArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRtcC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCX0JCQkvKiBmaXggImxvbmciIG5hbWVzICovCi0KLSAgICAgIHRtcC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLSAgICAgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHRtcCk7Ci0gICAgfQkJCQkvKiBhcHBlbmQgdGhlIGVudGlyZSBleHRlcm4gY2hhaW4gKi8KLQotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdGllX3RhZ3MgKCkKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyOwotCi0gICAgICBpZiAoU0ZfR0VUX1RBR0dFRCAoc3ltYm9sUCkpCi0JewotCSAgU0FfU0VUX1NZTV9UQUdORFgKLQkgICAgKHN5bWJvbFAsCi0JICAgICAoKHN5bWJvbFMgKikgU0FfR0VUX1NZTV9UQUdORFggKHN5bWJvbFApKS0+c3lfbnVtYmVyKTsKLQl9Ci0KLSAgICAgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApOwotICAgIH0KLQotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLX0KLQotc3RhdGljIHZvaWQKLWNyYXdsX3N5bWJvbHMgKGgsIGFiZmQpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoOwotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhY2sgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBtYXRjaGluZyAuYmIgLmJlICovCi0KLSAgYmxvY2tfc3RhY2sgPSBzdGFja19pbml0ICg1MTIsIHNpemVvZiAoc3ltYm9sUyAqKSk7Ci0KLSAgLyogVGhlIHN5bWJvbCBsaXN0IHNob3VsZCBiZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHNlcXVlbmNlCi0gICAqIG9yZGVyIDoKLSAgICogLiAuZmlsZSBzeW1ib2wKLSAgICogLiBkZWJ1ZyBlbnRyaWVzIGZvciBmdW5jdGlvbnMKLSAgICogLiBmYWtlIHN5bWJvbHMgZm9yIHRoZSBzZWN0aW9ucywgaW5jbHVkaW5nIC50ZXh0IC5kYXRhIGFuZCAuYnNzCi0gICAqIC4gZGVmaW5lZCBzeW1ib2xzCi0gICAqIC4gdW5kZWZpbmVkIHN5bWJvbHMKLSAgICogQnV0IHRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIG9ubHkgaW1wb3J0YW50IHBvaW50IGlzIHRvIHB1dCB0aGUKLSAgICogdW5kZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICovCi0KLSAgLyogSXMgdGhlcmUgYSAuZmlsZSBzeW1ib2wgPyBJZiBub3QgaW5zZXJ0IG9uZSBhdCB0aGUgYmVnaW5uaW5nLiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQID09IE5VTEwKLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbF9yb290UCkgIT0gQ19GSUxFKQotICAgIHsKLSAgICAgIGNfZG90X2ZpbGVfc3ltYm9sICgiZmFrZSIpOwotICAgIH0KLQotICAvKgotICAgKiBCdWlsZCB1cCBzdGF0aWMgc3ltYm9scyBmb3IgdGhlIHNlY3Rpb25zLCB0aGV5IGFyZSBmaWxsZWQgaW4gbGF0ZXIKLSAgICovCi0KLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5kb3QgPSBjX3NlY3Rpb25fc3ltYm9sIChzZWdtZW50X2luZm9baV0ubmFtZSwKLQkJCQkJICAgICAgaSAtIFNFR19FMCArIDEpOwotCi0gIC8qIFRha2UgYWxsIHRoZSBleHRlcm5hbHMgb3V0IGFuZCBwdXQgdGhlbSBpbnRvIGFub3RoZXIgY2hhaW4gKi8KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGgsIHlhbmtfc3ltYm9scyAoKSk7Ci0gIC8qIFRha2UgdGhlIGV4dGVybmFscyBhbmQgZ2x1ZSB0aGVtIG9udG8gdGhlIGVuZC4qLwotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwKLQkJCSAgIChIX0dFVF9TWU1CT0xfQ09VTlQgKGgpCi0JCQkgICAgKyBnbHVlX3N5bWJvbHMgKCZzeW1ib2xfZ2xvYmFsUCwKLQkJCQkJICAgICZzeW1ib2xfZ2xvYmFsX2xhc3RQKQotCQkJICAgICsgZ2x1ZV9zeW1ib2xzICgmc3ltYm9sX2V4dGVyblAsCi0JCQkJCSAgICAmc3ltYm9sX2V4dGVybl9sYXN0UCkpKTsKLQotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwgdGllX3RhZ3MgKCkpOwotICBrbm93IChzeW1ib2xfZ2xvYmFsUCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2dsb2JhbF9sYXN0UCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2V4dGVyblAgPT0gTlVMTCk7Ci0gIGtub3cgKHN5bWJvbF9leHRlcm5fbGFzdFAgPT0gTlVMTCk7Ci19Ci0KLS8qCi0gKiBGaW5kIHN0cmluZ3MgYnkgY3Jhd2xpbmcgYWxvbmcgc3ltYm9sIHRhYmxlIGNoYWluLgotICovCi0KLXZvaWQKLXdfc3RyaW5ncyAod2hlcmUpCi0gICAgIGNoYXIgKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9oZWFkOwotCi0gIC8qIEdvdHRhIGRvIG1kXyBieXRlLW9yZGVyaW5nIHN0dWZmIGZvciBzdHJpbmdfYnl0ZV9jb3VudCBmaXJzdCAtIEtXSyAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCAodmFsdWVUKSBzdHJpbmdfYnl0ZV9jb3VudCwgNCk7Ci0gIHdoZXJlICs9IDQ7Ci0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZSBtdXN0Ci0gICAgIGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIGNvZmZfaGVhZGVyX2FwcGVuZCBhbmQgd3JpdGVfb2JqZWN0X2ZpbGUuICAqLwotICB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgICAgewotCWlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXQotCSAgICAmJiBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA+IFNDTk5NTEVOKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCSAgICBzaXplID0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgKyAxOwotCSAgICBtZW1jcHkgKHdoZXJlLCBzZWdtZW50X2luZm9baV0ubmFtZSwgc2l6ZSk7Ci0JICAgIHdoZXJlICs9IHNpemU7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZiAvKiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLSAgICAgICBzeW1ib2xQOwotICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HIChzeW1ib2xQKSkKLQl7Ci0JICBzaXplID0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgbWVtY3B5ICh3aGVyZSwgU19HRVRfTkFNRSAoc3ltYm9sUCksIHNpemUpOwotCSAgd2hlcmUgKz0gc2l6ZTsKLQl9Ci0gICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GSUxFCi0JICAmJiBTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyAoc3ltYm9sUCkgPT0gMAotCSAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQKSAhPSAwKQotCXsKLQkgIHNpemUgPSBzdHJsZW4gKGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUpICsgMTsKLQkgIG1lbWNweSAod2hlcmUsIGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUsIHNpemUpOwotCSAgZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9zY2FuIC0+bmV4dDsKLQkgIHdoZXJlICs9IHNpemU7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2xpbmVub3NfZm9yIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotICAgICB1bnNpZ25lZCBsb25nICpmaWxlX2N1cnNvcjsKLXsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgbG9uZyBzdGFydCA9ICpmaWxlX2N1cnNvcjsKLQotICBmb3IgKGlkeCA9IFNFR19FMDsgaWR4IDwgU0VHX0xBU1Q7IGlkeCsrKQotICAgIHsKLSAgICAgIHNlZ21lbnRfaW5mb190eXBlICpzID0gc2VnbWVudF9pbmZvICsgaWR4OwotCi0KLSAgICAgIGlmIChzLT5zY25oZHIuc19ubG5ubyAhPSAwKQotCXsKLQkgIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZV9wdHI7Ci0KLQkgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmJ1ZmZlciA9Ci0JICAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKSB4bWFsbG9jIChzLT5zY25oZHIuc19ubG5ubyAqIExJTkVTWik7Ci0KLQkgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmRzdCA9IGJ1ZmZlcjsKLQotCSAgLyogUnVuIHRocm91Z2ggdGhlIHRhYmxlIHdlJ3ZlIGJ1aWx0IGFuZCB0dXJuIGl0IGludG8gaXRzIGV4dGVybmFsCi0JIGZvcm0sIHRha2UgdGhpcyBjaGFuY2UgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgKi8KLQotCSAgZm9yIChsaW5lX3B0ciA9IHMtPmxpbmVub19saXN0X2hlYWQ7Ci0JICAgICAgIGxpbmVfcHRyICE9IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTDsKLQkgICAgICAgbGluZV9wdHIgPSBsaW5lX3B0ci0+bmV4dCkKLQkgICAgewotCi0JICAgICAgaWYgKGxpbmVfcHRyLT5saW5lLmxfbG5ubyA9PSAwKQotCQl7Ci0JCSAgLyogVHVybiBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgaW50byB0aGUgc3ltYm9scycgaW5kZXggKi8KLQkJICBsaW5lX3B0ci0+bGluZS5sX2FkZHIubF9zeW1uZHggPQotCQkgICAgKChzeW1ib2xTICopIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3N5bW5keCktPnN5X251bWJlcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3BhZGRyICs9ICgoc3RydWN0IGZyYWcgKikgKGxpbmVfcHRyLT5mcmFnKSktPmZyX2FkZHJlc3M7Ci0JCX0KLQotCi0JICAgICAgKHZvaWQpIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJihsaW5lX3B0ci0+bGluZSksIGRzdCk7Ci0JICAgICAgZHN0Kys7Ci0KLQkgICAgfQotCi0JICBzLT5zY25oZHIuc19sbm5vcHRyID0gKmZpbGVfY3Vyc29yOwotCi0JICBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgcy0+c2NuaGRyLnNfbmxubm8gKiBMSU5FU1osIGFiZmQpOwotCSAgZnJlZSAoYnVmZmVyKTsKLQotCSAgKmZpbGVfY3Vyc29yICs9IHMtPnNjbmhkci5zX25sbm5vICogTElORVNaOwotCX0KLSAgICB9Ci0gIEhfU0VUX0xJTkVOT19TSVpFIChoLCAqZmlsZV9jdXJzb3IgLSBzdGFydCk7Ci19Ci0KLQotLyogTm93IHdlIHJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIGZyYWcgY2hhaW5zIGluIGEgc2VnbWVudCBhbmQKLSAgIG1ha2UgYWxsIHRoZSBzdWJzZWdtZW50IGZyYWdzIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZQotICAgbGlzdCwgYXMgaWYgdGhlIHNlZyAwIHdhcyBleHRyYSBsb25nICovCi0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfc3Vic2VncyAoKQotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGZyY2hhaW5TICpoZWFkID0gc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QOwotICAgICAgZnJhZ1MgZHVtbXk7Ci0gICAgICBmcmFnUyAqcHJldl9mcmFnID0gJmR1bW15OwotCi0gICAgICB3aGlsZSAoaGVhZCAmJiBoZWFkLT5mcmNoX3NlZyA9PSBpKQotCXsKLQkgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IGhlYWQtPmZyY2hfcm9vdDsKLQkgIHByZXZfZnJhZyA9IGhlYWQtPmZyY2hfbGFzdDsKLQkgIGhlYWQgPSBoZWFkLT5mcmNoX25leHQ7Ci0JfQotICAgICAgcHJldl9mcmFnLT5mcl9uZXh0ID0gMDsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLWludCBjb2ZmX2ZsYWdzOwotZXh0ZXJuIHZvaWQKLXdyaXRlX29iamVjdF9maWxlICgpCi17Ci0gIGludCBpOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpbl9wdHI7Ci0KLSAgb2JqZWN0X2hlYWRlcnMgaGVhZGVyczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX2N1cnNvcjsKLSAgYmZkICphYmZkOwotICB1bnNpZ25lZCBpbnQgYWRkcjsKLSAgYWJmZCA9IGJmZF9vcGVudyAob3V0X2ZpbGVfbmFtZSwgVEFSR0VUX0ZPUk1BVCk7Ci0KLQotICBpZiAoYWJmZCA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBCRkRfQVJDSCwgbWFjaGluZSk7Ci0KLSAgc3RyaW5nX2J5dGVfY291bnQgPSA0OwotCi0gIGZvciAoZnJjaGFpbl9wdHIgPSBmcmNoYWluX3Jvb3Q7Ci0gICAgICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7Ci0gICAgICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ViLXNlZ21lbnRzIGFuZCBhbGlnbiB0aGVtIHVwLiAgQWxzbwotCSBjbG9zZSBhbnkgb3BlbiBmcmFncy4gIFdlIHRhY2sgYSAuZmlsbCBvbnRvIHRoZSBlbmQgb2YgdGhlCi0JIGZyYWcgY2hhaW4gc28gdGhhdCBhbnkgLmFsaWduJ3Mgc2l6ZSBjYW4gYmUgd29ya2VkIGJ5IGxvb2tpbmcKLQkgYXQgdGhlIG5leHQgZnJhZy4gICovCi0KLSAgICAgIHN1YnNlZ19zZXQgKGZyY2hhaW5fcHRyLT5mcmNoX3NlZywgZnJjaGFpbl9wdHItPmZyY2hfc3Vic2VnKTsKLQotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDEKLSNlbmRpZgotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgICBtZF9kb19hbGlnbiAoU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLCAoY2hhciAqKSBOVUxMLCAwLCAwLAotCQkgICBhbGlnbm1lbnRfZG9uZSk7Ci0jZW5kaWYKLSAgICAgIGZyYWdfYWxpZ24gKFNVQl9TRUdNRU5UX0FMSUdOIChub3dfc2VnKSwKLQkJICBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSA/IE5PUF9PUENPREUgOiAwLAotCQkgIDApOwotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgYWxpZ25tZW50X2RvbmU6Ci0jZW5kaWYKLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19ub3ctPmZyX2ZpeCA9IDA7Ci0gICAgICBrbm93IChmcmFnX25vdy0+ZnJfbmV4dCA9PSBOVUxMKTsKLSAgICB9Ci0KLQotICByZW1vdmVfc3Vic2VncyAoKTsKLQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgcmVsYXhfc2VnbWVudCAoc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3QsIGkpOwotICAgIH0KLQotICBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzLCAwKTsKLQotICAvKiBGaW5kIG91dCBob3cgYmlnIHRoZSBzZWN0aW9ucyBhcmUsIGFuZCBzZXQgdGhlIGFkZHJlc3Nlcy4gICovCi0gIGFkZHIgPSAwOwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGxvbmcgc2l6ZTsKLQotICAgICAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX3BhZGRyID0gYWRkcjsKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc192YWRkciA9IGFkZHI7Ci0KLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzLAotCQkJCSAgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzKSArIDEpOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQkgIC8qIFN1cHBvcnQgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGZvdW5kIGluIFBFLiAgVGhpcyBjb2RlCi0JICAgICBtdXN0IGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIGNvZmZfaGVhZGVyX2FwcGVuZCBhbmQKLQkgICAgIHdfc3RyaW5ncy4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSk7Ci0JICAgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBsZW4gKyAxOwotCSAgfQotI2VuZGlmIC8qIENPRkZfTE9OR19TRUNUSU9OX05BTUVTICovCi0JfQotCi0gICAgICBzaXplID0gc2l6ZV9zZWN0aW9uIChhYmZkLCAodW5zaWduZWQgaW50KSBpKTsKLSAgICAgIGFkZHIgKz0gc2l6ZTsKLQotICAgICAgLyogSSB0aGluayB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgaXMgb25seSB1c2VkIG9uIHRoZSBpOTYwOyB0aGUKLQkgaTk2MCBuZWVkcyBpdCwgYW5kIGl0IHNob3VsZCBkbyBubyBoYXJtIG9uIG90aGVyIHRhcmdldHMuICAqLwotI2lmZGVmIEFMSUdOTUVOVF9JTl9TX0ZMQUdTCi0gICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfZmxhZ3MgfD0gKHNlY3Rpb25fYWxpZ25tZW50W2ldICYgMHhGKSA8PCA4OwotI2Vsc2UKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19hbGlnbiA9IDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbaV07Ci0jZW5kaWYKLQotICAgICAgaWYgKGkgPT0gU0VHX0UwKQotCUhfU0VUX1RFWFRfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgICAgZWxzZSBpZiAoaSA9PSBTRUdfRTEpCi0JSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgc2l6ZSk7Ci0gICAgICBlbHNlIGlmIChpID09IFNFR19FMikKLQlIX1NFVF9CU1NfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgIH0KLQotICAvKiBUdXJuIHRoZSBnYXMgbmF0aXZlIHN5bWJvbCB0YWJsZSBzaGFwZSBpbnRvIGEgY29mZiBzeW1ib2wgdGFibGUgKi8KLSAgY3Jhd2xfc3ltYm9scyAoJmhlYWRlcnMsIGFiZmQpOwotCi0gIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA9PSA0KQotICAgIHN0cmluZ19ieXRlX2NvdW50ID0gMDsKLQotICBIX1NFVF9TVFJJTkdfU0laRSAoJmhlYWRlcnMsIHN0cmluZ19ieXRlX2NvdW50KTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZQotICB0Y19mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGZpeHVwX21kZXBzIChzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdCwgJmhlYWRlcnMsIGkpOwotICAgICAgZml4dXBfc2VnbWVudCAoJnNlZ21lbnRfaW5mb1tpXSwgaSk7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yICIuc3RhYiIgc2VnbWVudHMgYW5kIGZpbGwgaW4gdGhlaXIgaW5pdGlhbCBzeW1ib2xzCi0gICAgIGNvcnJlY3RseS4gKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBuYW1lID0gc2VnbWVudF9pbmZvW2ldLm5hbWU7Ci0KLSAgICAgIGlmIChuYW1lICE9IE5VTEwKLQkgICYmIHN0cm5jbXAgKCIuc3RhYiIsIG5hbWUsIDUpID09IDAKLQkgICYmIHN0cm5jbXAgKCIuc3RhYnN0ciIsIG5hbWUsIDgpICE9IDApCi0JYWRqdXN0X3N0YWJfc2VjdGlvbiAoYWJmZCwgaSk7Ci0gICAgfQotCi0gIGZpbGVfY3Vyc29yID0gSF9HRVRfVEVYVF9GSUxFX09GRlNFVCAoJmhlYWRlcnMpOwotCi0gIGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGZpbGVfY3Vyc29yLCAwKTsKLQotICAvKiBQbGFudCB0aGUgZGF0YSAqLwotCi0gIGZpbGxfc2VjdGlvbiAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgZG9fcmVsb2NzX2ZvciAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgZG9fbGluZW5vc19mb3IgKGFiZmQsICZoZWFkZXJzLCAmZmlsZV9jdXJzb3IpOwotCi0gIEhfU0VUX0ZJTEVfTUFHSUNfTlVNQkVSICgmaGVhZGVycywgQ09GRl9NQUdJQyk7Ci0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QCi0gIEhfU0VUX1RJTUVfU1RBTVAgKCZoZWFkZXJzLCAobG9uZyl0aW1lKCh0aW1lX3QgKikwKSk7Ci0jZWxzZQotICBIX1NFVF9USU1FX1NUQU1QICgmaGVhZGVycywgMCk7Ci0jZW5kaWYKLSNpZmRlZiBUQ19DT0ZGX1NFVF9NQUNISU5FCi0gIFRDX0NPRkZfU0VUX01BQ0hJTkUgKCZoZWFkZXJzKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfRkxBR1MKLSNkZWZpbmUgQ09GRl9GTEFHUyAwCi0jZW5kaWYKLQotI2lmZGVmIEtFRVBfUkVMT0NfSU5GTwotICBIX1NFVF9GTEFHUyAoJmhlYWRlcnMsICgoSF9HRVRfTElORU5PX1NJWkUoJmhlYWRlcnMpID8gMCA6IEZfTE5OTykgfAotCQkJICBDT0ZGX0ZMQUdTIHwgY29mZl9mbGFncykpOwotI2Vsc2UKLSAgSF9TRVRfRkxBR1MgKCZoZWFkZXJzLCAoKEhfR0VUX0xJTkVOT19TSVpFKCZoZWFkZXJzKSAgICAgPyAwIDogRl9MTk5PKSAgIHwKLQkJCSAgKEhfR0VUX1JFTE9DQVRJT05fU0laRSgmaGVhZGVycykgPyAwIDogRl9SRUxGTEcpIHwKLQkJCSAgQ09GRl9GTEFHUyB8IGNvZmZfZmxhZ3MpKTsKLSNlbmRpZgotCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc3ltdGFibGVfc2l6ZSA9IEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFICgmaGVhZGVycyk7Ci0gICAgY2hhciAqYnVmZmVyMSA9IHhtYWxsb2MgKHN5bXRhYmxlX3NpemUgKyBzdHJpbmdfYnl0ZV9jb3VudCArIDEpOwotCi0gICAgSF9TRVRfU1lNQk9MX1RBQkxFX1BPSU5URVIgKCZoZWFkZXJzLCBiZmRfdGVsbCAoYWJmZCkpOwotICAgIHdfc3ltYm9scyAoYWJmZCwgYnVmZmVyMSwgc3ltYm9sX3Jvb3RQKTsKLSAgICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPiAwKQotICAgICAgd19zdHJpbmdzIChidWZmZXIxICsgc3ltdGFibGVfc2l6ZSk7Ci0gICAgYmZkX3dyaXRlIChidWZmZXIxLCAxLCBzeW10YWJsZV9zaXplICsgc3RyaW5nX2J5dGVfY291bnQsIGFiZmQpOwotICAgIGZyZWUgKGJ1ZmZlcjEpOwotICB9Ci0KLSAgY29mZl9oZWFkZXJfYXBwZW5kIChhYmZkLCAmaGVhZGVycyk7Ci0jaWYgMAotICAvKiBSZWNlbnQgY2hhbmdlcyB0byB3cml0ZSBuZWVkIHRoaXMsIGJ1dCB3aGVyZSBpdCBzaG91bGQKLSAgICAgZ28gaXMgdXAgdG8gS2VuLi4gKi8KLSAgaWYgKGJmZF9jbG9zZV9hbGxfZG9uZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgYXNfZmF0YWwgKF8oIkNhbid0IGNsb3NlICVzOiAlcyIpLCBvdXRfZmlsZV9uYW1lLAotCSAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSNlbHNlCi0gIHsKLSAgICBleHRlcm4gYmZkICpzdGRvdXRwdXQ7Ci0gICAgc3Rkb3V0cHV0ID0gYWJmZDsKLSAgfQotI2VuZGlmCi0KLX0KLQotLyogQWRkIGEgbmV3IHNlZ21lbnQuICBUaGlzIGlzIGNhbGxlZCBmcm9tIHN1YnNlZ19uZXcgdmlhIHRoZQotICAgb2JqX25ld19zZWdtZW50IG1hY3JvLiAgKi8KLQotc2VnVAotb2JqX2NvZmZfYWRkX3NlZ21lbnQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZuZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIGNoYXIgYnVmW1NDTk5NTEVOICsgMV07Ci0KLSAgc3RybmNweSAoYnVmLCBuYW1lLCBTQ05OTUxFTik7Ci0gIGJ1ZltTQ05OTUxFTl0gPSAnXDAnOwotICBuYW1lID0gYnVmOwotI2VuZGlmCi0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1QgJiYgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF07IGkrKykKLSAgICBpZiAoc3RyY21wIChuYW1lLCBzZWdtZW50X2luZm9baV0ubmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiAoc2VnVCkgaTsKLQotICBpZiAoaSA9PSBTRUdfTEFTVCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlRvbyBtYW55IG5ldyBzZWN0aW9uczsgY2FuJ3QgYWRkIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgIHJldHVybiBub3dfc2VnOwotICAgIH0KLQotICAvKiBBZGQgYSBuZXcgc2VjdGlvbi4gICovCi0gIHN0cm5jcHkgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCBuYW1lLAotCSAgIHNpemVvZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWUpKTsKLSAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX2ZsYWdzID0gU1RZUF9SRUc7Ci0gIHNlZ21lbnRfaW5mb1tpXS5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgcmV0dXJuIChzZWdUKSBpOwotfQotCi0vKgotICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6Ci0gKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9Ci0gKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCi0gKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQotICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0Ci0gKgkJCQkJCSAncicgZm9yIHJlYWQtb25seSBkYXRhCi0gKiBCdXQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHF1b3RlZCBzdHJpbmcsIHRyZWF0IGl0IGFzIGEKLSAqIHN1YnNlZ21lbnQgbnVtYmVyLgotICovCi0KLXZvaWQKLW9ial9jb2ZmX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWUsICpuYW1lOwotICBjaGFyIGM7Ci0gIHVuc2lnbmVkIGludCBleHA7Ci0gIGxvbmcgZmxhZ3M7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgdHlwZTsKLQotICAgICAgc19tcmlfc2VjdCAoJnR5cGUpOwotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKHR5cGUgPT0gJ0MnKQotCWZsYWdzID0gU1RZUF9URVhUOwotICAgICAgZWxzZSBpZiAodHlwZSA9PSAnRCcpCi0JZmxhZ3MgPSBTVFlQX0RBVEE7Ci0gICAgICBzZWdtZW50X2luZm9bbm93X3NlZ10uc2NuaGRyLnNfZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2VjdGlvbl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHNlY3Rpb25fbmFtZSArIDEpOwotICBzdHJjcHkgKG5hbWUsIHNlY3Rpb25fbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgZXhwID0gMDsKLSAgZmxhZ3MgPSAwOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCWNhc2UgJ2InOiBmbGFncyB8PSBTVFlQX0JTUzsgICAgYnJlYWs7Ci0JCWNhc2UgJ2knOiBmbGFncyB8PSBTVFlQX0lORk87ICAgYnJlYWs7Ci0JCWNhc2UgJ2wnOiBmbGFncyB8PSBTVFlQX0xJQjsgICAgYnJlYWs7Ci0JCWNhc2UgJ24nOiBmbGFncyB8PSBTVFlQX05PTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ28nOiBmbGFncyB8PSBTVFlQX09WRVI7ICAgYnJlYWs7Ci0JCWNhc2UgJ2QnOgotCQljYXNlICd3JzogZmxhZ3MgfD0gU1RZUF9EQVRBOyAgIGJyZWFrOwotCQljYXNlICd4JzogZmxhZ3MgfD0gU1RZUF9URVhUOyAgIGJyZWFrOwotCQljYXNlICdyJzogZmxhZ3MgfD0gU1RZUF9MSVQ7CWJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFzX3dhcm4oXygidW5rbm93biBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIiksCi0JCQkgICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKLQkgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICBzdWJzZWdfbmV3IChuYW1lLCAoc3Vic2VnVCkgZXhwKTsKLQotICBzZWdtZW50X2luZm9bbm93X3NlZ10uc2NuaGRyLnNfZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGV4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN1YnNlZ19uZXcgKCIudGV4dCIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICBzdWJzZWdfbmV3ICgiLnRleHQiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSArIDEwMDApOwotICBlbHNlCi0gICAgc3Vic2VnX25ldyAoIi5kYXRhIiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfaWRlbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsJCS8qIHNhdmUgY3VycmVudCBzZWcJKi8KLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19uZXcgKCIuY29tbWVudCIsIDApOwkJLyogLmNvbW1lbnQgc2VnCQkqLwotICBzdHJpbmdlciAoMSk7CQkJCS8qIHJlYWQgc3RyaW5nCQkqLwotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwkvKiByZXN0b3JlIGN1cnJlbnQgc2VnCSovCi19Ci0KLXZvaWQKLWNfc3ltYm9sX21lcmdlIChkZWJ1Zywgbm9ybWFsKQotICAgICBzeW1ib2xTICpkZWJ1ZzsKLSAgICAgc3ltYm9sUyAqbm9ybWFsOwotewotICBTX1NFVF9EQVRBX1RZUEUgKG5vcm1hbCwgU19HRVRfREFUQV9UWVBFIChkZWJ1ZykpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChub3JtYWwsIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlYnVnKSk7Ci0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCkpCi0gICAgewotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAobm9ybWFsLCBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykpOwotICAgIH0JCQkJLyogdGFrZSB0aGUgbW9zdCB3ZSBoYXZlICovCi0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IDApCi0gICAgewotICAgICAgbWVtY3B5ICgoY2hhciAqKSAmbm9ybWFsLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSwKLQkgICAgICAoY2hhciAqKSAmZGVidWctPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLAotCSAgICAgICh1bnNpZ25lZCBpbnQpIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgKiBBVVhFU1opKTsKLSAgICB9CQkJCS8qIE1vdmUgYWxsIHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gKi8KLQotICAvKiBNb3ZlIHRoZSBkZWJ1ZyBmbGFncy4gKi8KLSAgU0ZfU0VUX0RFQlVHX0ZJRUxEIChub3JtYWwsIFNGX0dFVF9ERUJVR19GSUVMRCAoZGVidWcpKTsKLX0JCQkJLyogY19zeW1ib2xfbWVyZ2UoKSAqLwotCi1zdGF0aWMgaW50Ci1jX2xpbmVfbmV3IChzeW1ib2wsIHBhZGRyLCBsaW5lX251bWJlciwgZnJhZykKLSAgICAgc3ltYm9sUyAqIHN5bWJvbDsKLSAgICAgbG9uZyBwYWRkcjsKLSAgICAgaW50IGxpbmVfbnVtYmVyOwotICAgICBmcmFnUyAqIGZyYWc7Ci17Ci0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbmV3X2xpbmUgPQotICAoc3RydWN0IGxpbmVub19saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxpbmVub19saXN0KSk7Ci0KLSAgc2VnbWVudF9pbmZvX3R5cGUgKnMgPSBzZWdtZW50X2luZm8gKyBub3dfc2VnOwotICBuZXdfbGluZS0+bGluZS5sX2xubm8gPSBsaW5lX251bWJlcjsKLQotICBpZiAobGluZV9udW1iZXIgPT0gMCkKLSAgICB7Ci0gICAgICBsYXN0X2xpbmVfc3ltYm9sID0gc3ltYm9sOwotICAgICAgbmV3X2xpbmUtPmxpbmUubF9hZGRyLmxfc3ltbmR4ID0gKGxvbmcpIHN5bWJvbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdfbGluZS0+bGluZS5sX2FkZHIubF9wYWRkciA9IHBhZGRyOwotICAgIH0KLQotICBuZXdfbGluZS0+ZnJhZyA9IChjaGFyICopIGZyYWc7Ci0gIG5ld19saW5lLT5uZXh0ID0gKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSBOVUxMOwotCi0KLSAgaWYgKHMtPmxpbmVub19saXN0X2hlYWQgPT0gKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHMtPmxpbmVub19saXN0X2hlYWQgPSBuZXdfbGluZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzLT5saW5lbm9fbGlzdF90YWlsLT5uZXh0ID0gbmV3X2xpbmU7Ci0gICAgfQotICBzLT5saW5lbm9fbGlzdF90YWlsID0gbmV3X2xpbmU7Ci0gIHJldHVybiBMSU5FU1ogKiBzLT5zY25oZHIuc19ubG5ubysrOwotfQotCi12b2lkCi1jX2RvdF9maWxlX3N5bWJvbCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfbmV3ICgiLmZpbGUiLAotCQkJU0VHX0RFQlVHLAotCQkJMCwKLQkJCSZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19GSUxFKTsKLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMSk7Ci0KLSAgaWYgKHN0cmxlbiAoZmlsZW5hbWUpID4gRklMTk1MRU4pCi0gICAgewotICAgICAgLyogRmlsZW5hbWUgaXMgdG9vIGxvbmcgdG8gZml0IGludG8gYW4gYXV4ZW50LAotCSB3ZSBzdGljayBpdCBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaW5zdGVhZC4gIFdlIGtlZXAKLQkgYSBsaW5rZWQgbGlzdCBvZiB0aGUgZmlsZW5hbWVzIHdlIGZpbmQgc28gd2UgY2FuIGVtaXQKLQkgdGhlbSBsYXRlci4qLwotICAgICAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmYgPSAoKHN0cnVjdCBmaWxlbmFtZV9saXN0ICopCi0JCQkJIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVuYW1lX2xpc3QpKSk7Ci0KLSAgICAgIGYtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgICBmLT5uZXh0ID0gMDsKLQotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfWkVST1MgKHN5bWJvbFAsIDApOwotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQLCAxKTsKLQotICAgICAgaWYgKGZpbGVuYW1lX2xpc3RfdGFpbCkgCi0JZmlsZW5hbWVfbGlzdF90YWlsLT5uZXh0ID0gZjsKLSAgICAgIGVsc2UKLQlmaWxlbmFtZV9saXN0X2hlYWQgPSBmOwotICAgICAgZmlsZW5hbWVfbGlzdF90YWlsID0gZjsgICAgICAKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUUgKHN5bWJvbFAsIGZpbGVuYW1lKTsKLSAgICB9Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlbmFtZSk7Ci0gICAgICB9Ci0KLSAgfQotCi0jZW5kaWYKLSAgU0ZfU0VUX0RFQlVHIChzeW1ib2xQKTsKLSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHByZXZpb3VzX2ZpbGVfc3ltYm9sKTsKLQotICBwcmV2aW91c19maWxlX3N5bWJvbCA9IHN5bWJvbFA7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbCBpcyBmaXJzdCBvbiB0aGUgc3ltYm9sIGNoYWluICovCi0gIGlmIChzeW1ib2xfcm9vdFAgIT0gc3ltYm9sUCkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9pbnNlcnQgKHN5bWJvbFAsIHN5bWJvbF9yb290UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQotfQkJCQkvKiBjX2RvdF9maWxlX3N5bWJvbCgpICovCi0KLS8qCi0gKiBCdWlsZCBhICdzZWN0aW9uIHN0YXRpYycgc3ltYm9sLgotICovCi0KLXN5bWJvbFMgKgotY19zZWN0aW9uX3N5bWJvbCAobmFtZSwgaWR4KQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgaWR4OwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChuYW1lLCBET19OT1RfU1RSSVApOwotICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCBpZHgsIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBNbW1tLiAgSSBqdXN0IGxvdmUgdmlvbGF0aW5nIGludGVyZmFjZXMuICBNYWtlcyBtZSBmZWVsLi4uZGlydHkuICAqLwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgaWR4KTsKLSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgfQotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIFNGX1NFVF9TVEFUSUNTIChzeW1ib2xQKTsKLQotI2lmZGVmIFRFX0RFTFRBCi0gIC8qIG1hbmZyZWRAcy1kaXJla3RuZXQuZGU6IHNlY3Rpb24gc3ltYm9scyAqbXVzdCogaGF2ZSB0aGUgTE9DQUwgYml0IGNsZWFyZWQsCi0gICAgIHdoaWNoIGlzIHNldCBieSB0aGUgbmV3IGRlZmluaXRpb24gb2YgTE9DQUxfTEFCRUwgaW4gdGMtbTY4ay5oLiAgKi8KLSAgU0ZfQ0xFQVJfTE9DQUwgKHN5bWJvbFApOwotI2VuZGlmCi0jaWZkZWYgVEVfUEUKLSAgLyogSWYgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3Agd2FzIHVzZWQgZm9yIHRoaXMgc2VjdGlvbiwgd2UgbXVzdAotICAgICBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGF1eGlsaWFyeSBlbnRyeSBmb3IgdGhlIHNlY3Rpb24KLSAgICAgc3ltYm9sLiAgKi8KLSAgaWYgKHNlZ21lbnRfaW5mb1tpZHhdLmxpbmtvbmNlICE9IExJTktPTkNFX1VOU0VUKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICBzd2l0Y2ggKHNlZ21lbnRfaW5mb1tpZHhdLmxpbmtvbmNlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBMSU5LT05DRV9ESVNDQVJEOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOwotCSAgYnJlYWs7Ci0JY2FzZSBMSU5LT05DRV9PTkVfT05MWToKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfU0FNRV9TSVpFOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFOwotCSAgYnJlYWs7Ci0JY2FzZSBMSU5LT05DRV9TQU1FX0NPTlRFTlRTOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIFNZTV9BVVhFTlQgKHN5bWJvbFApLT54X3Njbi54X2NvbWRhdCA9IHR5cGU7Ci0gICAgfQotI2VuZGlmIC8qIFRFX1BFICovCi0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19CQkJCS8qIGNfc2VjdGlvbl9zeW1ib2woKSAqLwotCi1zdGF0aWMgdm9pZAotd19zeW1ib2xzIChhYmZkLCB3aGVyZSwgc3ltYm9sX3Jvb3RQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3ltYm9sUyAqIHN5bWJvbF9yb290UDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogRmlyc3QgZmlsbCBpbiB0aG9zZSB2YWx1ZXMgd2UgaGF2ZSBvbmx5IGp1c3Qgd29ya2VkIG91dCAqLwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzZWdtZW50X2luZm9baV0uZG90OwotICAgICAgaWYgKHN5bWJvbFApCi0JewotCSAgU0FfU0VUX1NDTl9TQ05MRU4gKHN5bWJvbFAsIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19zaXplKTsKLQkgIFNBX1NFVF9TQ05fTlJFTE9DIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbnJlbG9jKTsKLQkgIFNBX1NFVF9TQ05fTkxJTk5PIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmxubm8pOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICAgKiBFbWl0IGFsbCBzeW1ib2xzIGxlZnQgaW4gdGhlIHN5bWJvbCBjaGFpbi4KLSAgICAgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFVzZWQgdG8gc2F2ZSB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lLiBJdCBpcyB1c2VkIHRvIHBvaW50Ci0JICAgICAgIHRvIHRoZSBzdHJpbmcgaW4gbWVtb3J5IGJ1dCBtdXN0IGJlIGEgZmlsZSBvZmZzZXQuICovCi0gICAgICByZWdpc3RlciBjaGFyICp0ZW1wOwotCi0gICAgICAvKiBXZSBjYW4ndCBmaXggdGhlIGxubm9wdHIgZmllbGQgaW4geWFua19zeW1ib2xzIHdpdGggdGhlIG90aGVyCi0gICAgICAgICBhZGp1c3RtZW50cywgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgd2Uga25vdyB3aGVyZSB0aGV5Ci0gICAgICAgICBnbyBpbiB0aGUgZmlsZS4gICovCi0gICAgICBpZiAoU0ZfR0VUX0FESl9MTk5PUFRSIChzeW1ib2xQKSkKLQl7Ci0JICBTQV9HRVRfU1lNX0xOTk9QVFIgKHN5bWJvbFApICs9Ci0JICAgIHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xQKV0uc2NuaGRyLnNfbG5ub3B0cjsKLQl9Ci0KLSAgICAgIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoc3ltYm9sUCk7Ci0KLSAgICAgIHRlbXAgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HIChzeW1ib2xQKSkKLQl7Ci0JICBTX1NFVF9PRkZTRVQgKHN5bWJvbFAsIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0KTsKLQkgIFNfU0VUX1pFUk9FUyAoc3ltYm9sUCwgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbXNldCAoc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX25hbWUsIDAsIFNZTU5NTEVOKTsKLQkgIHN0cm5jcHkgKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl9uYW1lLCB0ZW1wLCBTWU1OTUxFTik7Ci0JfQotICAgICAgd2hlcmUgPSBzeW1ib2xfdG9fY2hhcnMgKGFiZmQsIHdoZXJlLCBzeW1ib2xQKTsKLSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHRlbXApOwotICAgIH0KLQotfQkJCQkvKiB3X3N5bWJvbHMoKSAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfbGNvbW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzX2xjb21tKDApOwotICByZXR1cm47Ci0jaWYgMAotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGludCB0ZW1wOwotICBjaGFyICpwOwotCi0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oImxjb21tIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAwOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlKG5hbWUpOwotCi0gIGlmIChTX0dFVF9TRUdNRU5UKHN5bWJvbFApID09IFNFR19VTktOT1dOICYmCi0gICAgICBTX0dFVF9WQUxVRShzeW1ib2xQKSA9PSAwKQotICAgIHsKLSAgICAgIGlmICghIG5lZWRfcGFzc18yKQotCXsKLQkgIGNoYXIgKnA7Ci0JICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsgCS8qIHNhdmUgY3VycmVudCBzZWcgICAgICovCi0JICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCSAgc3Vic2VnX3NldCAoU0VHX0UyLCAxKTsKLQkgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLQkgIHAgPSBmcmFnX3Zhcihyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKLQkJICAgICAgIChvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKSAwKTsKLQkgICpwID0gMDsKLQkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7IC8qIHJlc3RvcmUgY3VycmVudCBzZWcgKi8KLQkgIFNfU0VUX1NFR01FTlQoc3ltYm9sUCwgU0VHX0UyKTsKLQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1Moc3ltYm9sUCwgQ19TVEFUKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQiKSwgbmFtZSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1maXh1cF9tZGVwcyAoZnJhZ3MsIGgsIHRoaXNfc2VnbWVudCkKLSAgICAgZnJhZ1MgKiBmcmFnczsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotICAgICBzZWdUIHRoaXNfc2VnbWVudDsKLXsKLSAgc3Vic2VnX2NoYW5nZSAodGhpc19zZWdtZW50LCAwKTsKLSAgd2hpbGUgKGZyYWdzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZnJhZ3MtPmZyX3R5cGUpCi0JewotCWNhc2UgcnNfYWxpZ246Ci0JY2FzZSByc19hbGlnbl9jb2RlOgotCWNhc2UgcnNfb3JnOgotI2lmZGVmIEhBTkRMRV9BTElHTgotCSAgSEFORExFX0FMSUdOIChmcmFncyk7Ci0jZW5kaWYKLQkgIGZyYWdzLT5mcl90eXBlID0gcnNfZmlsbDsKLQkgIGZyYWdzLT5mcl9vZmZzZXQgPQotCSAgICAoKGZyYWdzLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ3MtPmZyX2FkZHJlc3MgLSBmcmFncy0+ZnJfZml4KQotCSAgICAgLyBmcmFncy0+ZnJfdmFyKTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBtZF9jb252ZXJ0X2ZyYWcgKGgsIHRoaXNfc2VnbWVudCwgZnJhZ3MpOwotCSAgZnJhZ193YW5lIChmcmFncyk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgOwotCX0KLSAgICAgIGZyYWdzID0gZnJhZ3MtPmZyX25leHQ7Ci0gICAgfQotfQotCi0jaWYgMQotCi0jaWZuZGVmIFRDX0ZPUkNFX1JFTE9DQVRJT04KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIDAKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotZml4dXBfc2VnbWVudCAoc2VnUCwgdGhpc19zZWdtZW50X3R5cGUpCi0gICAgIHNlZ21lbnRfaW5mb190eXBlICogc2VnUDsKLSAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsKLXsKLSAgcmVnaXN0ZXIgZml4UyAqIGZpeFA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKmFkZF9zeW1ib2xQOwotICByZWdpc3RlciBzeW1ib2xTICpzdWJfc3ltYm9sUDsKLSAgbG9uZyBhZGRfbnVtYmVyOwotICByZWdpc3RlciBpbnQgc2l6ZTsKLSAgcmVnaXN0ZXIgY2hhciAqcGxhY2U7Ci0gIHJlZ2lzdGVyIGxvbmcgd2hlcmU7Ci0gIHJlZ2lzdGVyIGNoYXIgcGNyZWw7Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgcmVnaXN0ZXIgc2VnVCBhZGRfc3ltYm9sX3NlZ21lbnQgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCi0gIGZvciAoZml4UCA9IHNlZ1AtPmZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7Ci0gICAgICBrbm93IChmcmFnUCk7Ci0gICAgICB3aGVyZSA9IGZpeFAtPmZ4X3doZXJlOwotICAgICAgcGxhY2UgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICAgICAgc2l6ZSA9IGZpeFAtPmZ4X3NpemU7Ci0gICAgICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OwotICAgICAgc3ViX3N5bWJvbFAgPSBmaXhQLT5meF9zdWJzeTsKLSAgICAgIGFkZF9udW1iZXIgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBwY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotCi0gICAgICAvKiBXZSB3YW50IGZ1bmN0aW9uLXJlbGF0aXZlIHN0YWJzIHRvIHdvcmsgb24gc3lzdGVtcyB3aGljaAotCSBtYXkgdXNlIGEgcmVsYXhpbmcgbGlua2VyOyB0aHVzIHdlIG11c3QgaGFuZGxlIHRoZSBzeW0xLXN5bTIKLQkgZml4dXBzIGZ1bmN0aW9uLXJlbGF0aXZlIHN0YWJzIGdlbmVyYXRlcy4KLQotCSBPZiBjb3Vyc2UsIGlmIHlvdSBhY3R1YWxseSBlbmFibGUgcmVsYXhpbmcgaW4gdGhlIGxpbmtlciwgdGhlCi0JIGxpbmUgYW5kIGJsb2NrIHNjb3BpbmcgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgaW5jb3JyZWN0Ci0JIGluIHNvbWUgY2FzZXMuICBUaGUgb25seSB3YXkgdG8gcmVhbGx5IGZpeCB0aGlzIGlzIHRvIHN1cHBvcnQKLQkgYSByZWxvYyBpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGxpbmtyZWxheAotCSAgJiYgKCFzdWJfc3ltYm9sUCB8fCBwY3JlbCkpCi0JY29udGludWU7Ci0KLSNpZmRlZiBUQ19JOTYwCi0gICAgICBpZiAoZml4UC0+ZnhfdGNiaXQgJiYgU0ZfR0VUX0NBTExOQU1FIChhZGRfc3ltYm9sUCkpCi0JewotCSAgLyogUmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIGFzc29jaWF0ZWQgJ2JhbCcgZW50cnkKLQkgICAgIHBvaW50IHN5bWJvbC4gKi8KLQotCSAgaWYgKCFTRl9HRVRfQkFMTkFNRSAodGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgIF8oIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKGFkZF9zeW1ib2xQKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZDsgdGhpcyBtYXkgbm90IGhhdmUKLSAgICAgICAgIGhhcHBlbmVkIGlmIHRoZXNlIGFyZSBleHByZXNzaW9uIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwgJiYgISBhZGRfc3ltYm9sUC0+c3lfcmVzb2x2ZWQpCi0JcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2xQLCAxKTsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwpCi0JewotCSAgLyogSWYgdGhpcyBmaXh1cCBpcyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGhhcyBiZWVuIGVxdWF0ZWQKLQkgICAgIHRvIGFub3RoZXIgc3ltYm9sLCBjb252ZXJ0IGl0IHRvIHRoZSBvdGhlciBzeW1ib2wuICAqLwotCSAgaWYgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChhZGRfc3ltYm9sUCkKLQkJICB8fCBTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKSkKLQkgICAgewotCSAgICAgIHdoaWxlIChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoYWRkX3N5bWJvbFApCi0JCQkgfHwgU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkpCi0JCXsKLQkJICBzeW1ib2xTICpuOwotCi0JCSAgLyogV2UgbXVzdCBhdm9pZCBsb29waW5nLCBhcyB0aGF0IGNhbiBvY2N1ciB3aXRoIGEKLQkJICAgICBiYWRseSB3cml0dGVuIHByb2dyYW0uICAqLwotCQkgIG4gPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotCQkgIGlmIChuID09IGFkZF9zeW1ib2xQKQotCQkgICAgYnJlYWs7Ci0JCSAgYWRkX251bWJlciArPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotCQkgIGFkZF9zeW1ib2xQID0gbjsKLQkJfQotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFA7Ci0JICAgICAgZml4UC0+Znhfb2Zmc2V0ID0gYWRkX251bWJlcjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHN1Yl9zeW1ib2xQICE9IE5VTEwgJiYgISBzdWJfc3ltYm9sUC0+c3lfcmVzb2x2ZWQpCi0JcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN1Yl9zeW1ib2xQLCAxKTsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwKLQkgICYmIGFkZF9zeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGtub3cgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sKTsKLQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgIGZpeFAtPmZ4X29mZnNldCA9IGFkZF9udW1iZXI7Ci0JICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQl9Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQl7Ci0JICBhZGRfc3ltYm9sX3NlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCk7Ci0JfQkJCS8qIGlmIHRoZXJlIGlzIGFuIGFkZGVuZCAqLwotCi0gICAgICBpZiAoc3ViX3N5bWJvbFApCi0JewotCSAgaWYgKGFkZF9zeW1ib2xQID09IE5VTEwgfHwgYWRkX3N5bWJvbF9zZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCkKLQkJewotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkJICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBJdCdzIGp1c3QgLXN5bS4gICovCi0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCQl7Ci0JCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLQkJICBmaXhQLT5meF9kb25lID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotI2lmbmRlZiBUQ19NNjhLCi0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIk5lZ2F0aXZlIG9mIG5vbi1hYnNvbHV0ZSBzeW1ib2wgJXMiKSwKLQkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCkpOwotI2VuZGlmCi0JCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCQl9CQkvKiBub3QgYWJzb2x1dGUgKi8KLQotCSAgICAgIC8qIGlmIHN1Yl9zeW1ib2wgaXMgaW4gdGhlIHNhbWUgc2VnbWVudCB0aGF0IGFkZF9zeW1ib2wKLQkJIGFuZCBhZGRfc3ltYm9sIGlzIGVpdGhlciBpbiBEQVRBLCBURVhULCBCU1Mgb3IgQUJTT0xVVEUgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFkZF9zeW1ib2xfc2VnbWVudAotCQkgICAmJiBTRUdfTk9STUFMIChhZGRfc3ltYm9sX3NlZ21lbnQpKQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMgZnJvbSBzYW1lIHNlZ21lbnQuICBDYW4ndAotCQkgbWFrZSBkaWZmZXJlbmNlIG9mIDIgdW5kZWZpbmVkczogJ3ZhbHVlJyBtZWFucwotCQkgc29tZXRoaW5nIGRpZmZlcmVudCBmb3IgTl9VTkRGLiAqLwotI2lmZGVmIFRDX0k5NjAKLQkgICAgICAvKiBNYWtlcyBubyBzZW5zZSB0byB1c2UgdGhlIGRpZmZlcmVuY2Ugb2YgMiBhcmJpdHJhcnkgc3ltYm9scwotCSAgICAgICAgIGFzIHRoZSB0YXJnZXQgb2YgYSBjYWxsIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCi0JCXsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiKSk7Ci0JCX0KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApIC0KLQkJU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkgICAgICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0KLQkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQl7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9kb25lID0gMTsKLSNpZmRlZiBUQ19NNjhLIC8qIGlzIHRoaXMgcmlnaHQ/ICovCi0JCSAgcGNyZWwgPSAwOwotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMDsKLSNlbmRpZgotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIERpZmZlcmVudCBzZWdtZW50cyBpbiBzdWJ0cmFjdGlvbi4gKi8KLQkgICAgICBrbm93ICghKFNfSVNfRVhURVJOQUwgKHN1Yl9zeW1ib2xQKSAmJiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKSk7Ci0KLQkgICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLQkJewotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJfQotI2lmZGVmIERJRkZfRVhQUl9PSwotCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSB0aGlzX3NlZ21lbnRfdHlwZQotI2lmIDAgLyogT2theSBmb3IgNjhrLCBhdCBsZWFzdC4uLiAqLwotCQkgICAgICAgJiYgIXBjcmVsCi0jZW5kaWYKLQkJICAgICAgICkKLQkJewotCQkgIC8qIE1ha2UgaXQgcGMtcmVsYXRpdmUuICAqLwotCQkgIGFkZF9udW1iZXIgKz0gKG1kX3BjcmVsX2Zyb20gKGZpeFApCi0JCQkJIC0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKSk7Ci0JCSAgcGNyZWwgPSAxOwotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMTsKLQkJICBzdWJfc3ltYm9sUCA9IDA7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSAwOwotCQl9Ci0jZW5kaWYKLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiQ2FuJ3QgZW1pdCByZWxvYyB7LSAlcy1zZWcgc3ltYm9sIFwiJXNcIn0gQCBmaWxlIGFkZHJlc3MgJWxkLiIpLAotCQkJCXNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApKSwKLQkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCksCi0JCQkJKGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7Ci0JCX0JCS8qIGlmIGFic29sdXRlICovCi0JICAgIH0KLQl9CQkJLyogaWYgc3ViX3N5bWJvbFAgKi8KLQotICAgICAgaWYgKGFkZF9zeW1ib2xQKQotCXsKLQkgIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gdGhpc19zZWdtZW50X3R5cGUgJiYgcGNyZWwpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFRoaXMgZml4dXAgd2FzIG1hZGUgd2hlbiB0aGUgc3ltYm9sJ3Mgc2VnbWVudCB3YXMKLQkgICAgICAgKiBTRUdfVU5LTk9XTiwgYnV0IGl0IGlzIG5vdyBpbiB0aGUgbG9jYWwgc2VnbWVudC4KLQkgICAgICAgKiBTbyB3ZSBrbm93IGhvdyB0byBkbyB0aGUgYWRkcmVzcyB3aXRob3V0IHJlbG9jYXRpb24uCi0JICAgICAgICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIHJlbG9jX2NhbGxqKCkgbWF5IHJlcGxhY2UgYSAnY2FsbCcgd2l0aCBhICdjYWxscycgb3IgYSAnYmFsJywKLQkgICAgICAgKiBpbiB3aGljaCBjYXNlcyBpdCBtb2RpZmllcyAqZml4UCBhcyBhcHByb3ByaWF0ZS4gIEluIHRoZSBjYXNlCi0JICAgICAgICogb2YgYSAnY2FsbHMnLCBubyBmdXJ0aGVyIHdvcmsgaXMgcmVxdWlyZWQsIGFuZCAqZml4UCBoYXMgYmVlbgotCSAgICAgICAqIHNldCB1cCB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBjb2RlIGJlbG93IGEgbm8tb3AuCi0JICAgICAgICovCi0JICAgICAgcmVsb2NfY2FsbGogKGZpeFApOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgICAgICBhZGRfbnVtYmVyIC09IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotCi0JICAgICAgLyogV2UgdXNlZCB0byBkbwotCQkgICBhZGRfbnVtYmVyIC09IHNlZ1AtPnNjbmhkci5zX3ZhZGRyOwotCQkgaWYgZGVmaW5lZCAoVENfSTM4NikgfHwgZGVmaW5lZCAoVEVfTFlOWCkuICBJIG5vdwotCQkgdGhpbmsgdGhhdCB3YXMgYW4gZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBjYXNlIHdoZW4KLQkJIHdlIGFyZSBnb2luZyB0byBlbWl0IHRoZSByZWxvY2F0aW9uLiAgSWYgd2UgYXJlIG5vdAotCQkgZ29pbmcgdG8gZW1pdCB0aGUgcmVsb2NhdGlvbiwgdGhlbiB3ZSBqdXN0IHdhbnQgdG8KLQkJIHNldCBhZGRfbnVtYmVyIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbHMuCi0JCSBUaGlzIGlzIGEgY2FzZSB0aGF0IHdvdWxkIG9ubHkgYXJpc2Ugd2hlbiB0aGVyZSBpcyBhCi0JCSBQQyByZWxhdGl2ZSByZWZlcmVuY2UgZnJvbSBhIHNlY3Rpb24gb3RoZXIgdGhhbiAudGV4dAotCQkgdG8gYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgc2FtZSBzZWN0aW9uLCBhbmQgdGhlCi0JCSByZWZlcmVuY2UgaXMgbm90IHJlbGF4ZWQuICBTaW5jZSBqdW1wIGluc3RydWN0aW9ucyBvbgotCQkgdGhlIGkzODYgYXJlIHJlbGF4ZWQsIHRoaXMgY291bGQgb25seSBhcmlzZSB3aXRoIGEKLQkJIGNhbGwgaW5zdHJ1Y3Rpb24uICAqLwotCi0JICAgICAgcGNyZWwgPSAwOwkvKiBMaWUuIERvbid0IHdhbnQgZnVydGhlciBwY3JlbCBwcm9jZXNzaW5nLiAqLwotCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCXsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChhZGRfc3ltYm9sX3NlZ21lbnQpCi0JCXsKLQkJY2FzZSBhYnNvbHV0ZV9zZWN0aW9uOgotI2lmZGVmIFRDX0k5NjAKLQkJICByZWxvY19jYWxsaiAoZml4UCk7CS8qIFNlZSBjb21tZW50IGFib3V0IHJlbG9jX2NhbGxqKCkgYWJvdmUqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JCSAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCi0JCSAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJICAgIHsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgICAgICBmaXhQLT5meF9kb25lID0gMTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQotCi0jaWYgZGVmaW5lZChUQ19BMjlLKSB8fCAoZGVmaW5lZChURV9QRSkgJiYgZGVmaW5lZChUQ19JMzg2KSkgfHwgZGVmaW5lZChUQ19NODhLKQotCQkgIC8qIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBoYW5kbGVkIGluIHRoZSBsaW5rZXIsIGJ1dAotCQkgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yYmlkcy4gICovCi0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotI2Vsc2UKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCkgKwotCQkgICAgc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKV0uc2NuaGRyLnNfcGFkZHI7Ci0jZW5kaWYKLQkJICBicmVhazsKLQotCQljYXNlIFNFR19VTktOT1dOOgotI2lmZGVmIFRDX0k5NjAKLQkJICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYQotCQkgICAgICAgKiAxMy1iaXQgZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkCi0JCSAgICAgICAqIGZvciBsb2NhbCBicmFuY2hlczogZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUKLQkJICAgICAgICogcmVsb2NhdGlvbi4KLQkJICAgICAgICovCi0JCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQkgICAgXygiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiKSk7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQkJLyogQ09CUiAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLSNpZiAoKGRlZmluZWQgKFRDX0kzODYpIHx8IGRlZmluZWQgKFRFX0xZTlgpIHx8IGRlZmluZWQgKFRFX0FVWCkpICYmICFkZWZpbmVkKFRFX1BFKSkgfHwgZGVmaW5lZCAoQ09GRl9DT01NT05fQURERU5EKQotCQkgIC8qIDM4NiBDT0ZGIHVzZXMgYSBwZWN1bGlhciBmb3JtYXQgaW4gd2hpY2ggdGhlCi0JCSAgICAgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sIGlzIHN0b3JlZCBpbiB0aGUgLnRleHQKLQkJICAgICBzZWdtZW50IChJJ3ZlIGNoZWNrZWQgdGhpcyBvbiBTVlIzLjIgYW5kIFNDTwotCQkgICAgIDMuMi4yKSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICAqLwotCQkgIC8qIFRoaXMgaXMgYWxzbyB0cnVlIGZvciA2OGsgQ09GRiBvbiBzeXN2IG1hY2hpbmVzCi0JCSAgICAgKENoZWNrZWQgb24gTW90b3JvbGEgc3lzdjY4IFIzVjYgYW5kIFIzVjcuMSwgYW5kIGFsc28gb24KLQkJICAgICBVTklYIFN5c3RlbSBWL002ODAwMCwgUmVsZWFzZSAxLjAgZnJvbSBBVFQvQmVsbCBMYWJzKQotCQkgICAgIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uICovCi0JCSAgaWYgKFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpCi0JCSAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0jZW5kaWYKLQkJICBicmVhazsKLQotCi0JCX0JCS8qIHN3aXRjaCBvbiBzeW1ib2wgc2VnICovCi0JICAgIH0JCQkvKiBpZiBub3QgaW4gbG9jYWwgc2VnICovCi0JfQkJCS8qIGlmIHRoZXJlIHdhcyBhICsgc3ltYm9sICovCi0KLSAgICAgIGlmIChwY3JlbCkKLQl7Ci0jaWYgIWRlZmluZWQoVENfTTg4SykgJiYgIShkZWZpbmVkKFRFX1BFKSAmJiBkZWZpbmVkKFRDX0kzODYpKSAmJiAhZGVmaW5lZChUQ19BMjlLKQotCSAgLyogVGhpcyBhZGp1c3RtZW50IGlzIG5vdCBjb3JyZWN0IG9uIHRoZSBtODhrLCBmb3Igd2hpY2ggdGhlCi0JICAgICBsaW5rZXIgZG9lcyBhbGwgdGhlIGNvbXB1dGF0aW9uLiAgKi8KLQkgIGFkZF9udW1iZXIgLT0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0jZW5kaWYKLQkgIGlmIChhZGRfc3ltYm9sUCA9PSAwKQotCSAgICB7Ci0JICAgICAgZml4UC0+ZnhfYWRkc3kgPSAmYWJzX3N5bWJvbDsKLQkgICAgfQkJCS8qIGlmIHRoZXJlJ3MgYW4gYWRkX3N5bWJvbCAqLwotI2lmIGRlZmluZWQgKFRDX0kzODYpIHx8IGRlZmluZWQgKFRFX0xZTlgpIHx8IGRlZmluZWQgKFRDX0k5NjApIHx8IGRlZmluZWQgKFRDX002OEspCi0JICAvKiBPbiB0aGUgMzg2IHdlIG11c3QgYWRqdXN0IGJ5IHRoZSBzZWdtZW50IHZhZGRyIGFzIHdlbGwuCi0JICAgICBJYW4gVGF5bG9yLgotCi0JICAgICBJIGNoYW5nZWQgdGhlIGk5NjAgdG8gd29yayB0aGlzIHdheSBhcyB3ZWxsLiAgVGhpcyBpcwotCSAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IEdOVSBsaW5rZXIgYmVoYXZpb3VyLiAgSSBkbwotCSAgICAgbm90IGtub3cgd2hhdCBvdGhlciBpOTYwIENPRkYgYXNzZW1ibGVycyBkby4gIFRoaXMgaXMgbm90Ci0JICAgICBhIGNvbW1vbiBjYXNlOiBub3JtYWxseSwgb25seSBhc3NlbWJsZXIgY29kZSB3aWxsIGNvbnRhaW4KLQkgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MsIGFuZCBvbmx5IGJyYW5jaGVzIHdoaWNoIGRvIG5vdAotCSAgICAgb3JpZ2luYXRlIGluIHRoZSAudGV4dCBzZWN0aW9uIHdpbGwgaGF2ZSBhIG5vbi16ZXJvCi0JICAgICBhZGRyZXNzLgotCi0JICAgICBJIGNoYW5nZWQgdGhlIG02OGsgdG8gd29yayB0aGlzIHdheSBhcyB3ZWxsLiAgVGhpcyB3aWxsCi0JICAgICBicmVhayBleGlzdGluZyBQQyByZWxhdGl2ZSByZWxvY3MgZnJvbSBzZWN0aW9ucyB3aGljaCBkbwotCSAgICAgbm90IHN0YXJ0IGF0IGFkZHJlc3MgMCwgYnV0IGl0IHdpbGwgbWFrZSBsZCAtciB3b3JrLgotCSAgICAgSWFuIFRheWxvciwgNCBPY3QgOTYuICAqLwotCi0JICBhZGRfbnVtYmVyIC09IHNlZ1AtPnNjbmhkci5zX3ZhZGRyOwotI2VuZGlmCi0JfQkJCS8qIGlmIHBjcmVsICovCi0KLSNpZmRlZiBNRF9BUFBMWV9GSVgzCi0gICAgICBtZF9hcHBseV9maXgzIChmaXhQLCAodmFsdWVUICopICZhZGRfbnVtYmVyLCB0aGlzX3NlZ21lbnRfdHlwZSk7Ci0jZWxzZQotICAgICAgbWRfYXBwbHlfZml4IChmaXhQLCBhZGRfbnVtYmVyKTsKLSNlbmRpZgotCi0gICAgICBpZiAoIWZpeFAtPmZ4X2JpdF9maXhQICYmICEgZml4UC0+Znhfbm9fb3ZlcmZsb3cpCi0JewotI2lmbmRlZiBUQ19NODhLCi0JICAvKiBUaGUgbTg4ayB1c2VzIHRoZSBvZmZzZXQgZmllbGQgb2YgdGhlIHJlbG9jIHRvIGdldCBhcm91bmQKLQkgICAgIHRoaXMgcHJvYmxlbS4gICovCi0JICBpZiAoKHNpemUgPT0gMQotCSAgICAgICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRikKLQkJICAgfHwgKGZpeFAtPmZ4X3NpZ25lZCAmJiAoYWRkX251bWJlciAmIDB4ODApKSkKLQkgICAgICAgJiYgKChhZGRfbnVtYmVyICYgfjB4RkYpICE9ICgtMSAmIH4weEZGKQotCQkgICB8fCAoYWRkX251bWJlciAmIDB4ODApID09IDApKQotCSAgICAgIHx8IChzaXplID09IDIKLQkJICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRkZGKQotCQkgICAgICB8fCAoZml4UC0+Znhfc2lnbmVkICYmIChhZGRfbnVtYmVyICYgMHg4MDAwKSkpCi0JCSAgJiYgKChhZGRfbnVtYmVyICYgfjB4RkZGRikgIT0gKC0xICYgfjB4RkZGRikKLQkJICAgICAgfHwgKGFkZF9udW1iZXIgJiAweDgwMDApID09IDApKSkKLQkgICAgewotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJWYWx1ZSBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAweCVseCIpLAotCQkJICAgIChsb25nKSBhZGRfbnVtYmVyLCBzaXplLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSkpOwotCSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0JICAvKiBXYXJuIGlmIGEgLndvcmQgdmFsdWUgaXMgdG9vIGxhcmdlIHdoZW4gdHJlYXRlZCBhcyBhCi0JICAgICBzaWduZWQgbnVtYmVyLiAgV2UgYWxyZWFkeSBrbm93IGl0IGlzIG5vdCB0b28gbmVnYXRpdmUuCi0JICAgICBUaGlzIGlzIHRvIGNhdGNoIG92ZXItbGFyZ2Ugc3dpdGNoZXMgZ2VuZXJhdGVkIGJ5IGdjYyBvbgotCSAgICAgdGhlIDY4ay4gICovCi0JICBpZiAoIWZsYWdfc2lnbmVkX292ZXJmbG93X29rCi0JICAgICAgJiYgc2l6ZSA9PSAyCi0JICAgICAgJiYgYWRkX251bWJlciA+IDB4N2ZmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJTaWduZWQgLndvcmQgb3ZlcmZsb3c7IHN3aXRjaCBtYXkgYmUgdG9vIGxhcmdlOyAlbGQgYXQgMHglbHgiKSwKLQkJCSAgKGxvbmcpIGFkZF9udW1iZXIsCi0JCQkgICh1bnNpZ25lZCBsb25nKSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSkpOwotI2VuZGlmCi0JfQkJCS8qIG5vdCBhIGJpdCBmaXggKi8KLSAgICB9CQkJCS8qIEZvciBlYWNoIGZpeFMgaW4gdGhpcyBzZWdtZW50LiAqLwotfQkJCQkvKiBmaXh1cF9zZWdtZW50KCkgKi8KLQotI2VuZGlmCi0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFiIHNlY3Rpb24gaXMgc3BlY2lhbC4gICovCi0KLXZvaWQKLW9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICpmaWxlOwotICBjaGFyICpwOwotICBjaGFyICpzdGFic3RyX25hbWU7Ci0gIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhpcyBmaXJzdCBzeW1ib2wuICovCi0gIHAgPSBmcmFnX21vcmUgKDEyKTsKLSAgLyogWmVybyBpdCBvdXQuICovCi0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0YWJzdHJfbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWdtZW50X2luZm9bc2VnXS5uYW1lKSArIDQpOwotICBzdHJjcHkgKHN0YWJzdHJfbmFtZSwgc2VnbWVudF9pbmZvW3NlZ10ubmFtZSk7Ci0gIHN0cmNhdCAoc3RhYnN0cl9uYW1lLCAic3RyIik7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsIHN0YWJzdHJfbmFtZSk7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotfQotCi0vKiBGaWxsIGluIHRoZSBjb3VudHMgaW4gdGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWIgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3RhYl9zZWN0aW9uKGFiZmQsIHNlZykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWdUIHNlZzsKLXsKLSAgc2VnVCBzdGFic3Ryc2VnID0gU0VHX1VOS05PV047Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWUsICpuYW1lMjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqcCA9IE5VTEw7Ci0gIGludCBpLCBzdHJzeiA9IDAsIG5zeW1zOwotICBmcmFnUyAqZnJhZyA9IHNlZ21lbnRfaW5mb1tzZWddLmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0KLSAgLyogTG9vayBmb3IgdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICovCi0KLSAgc2VjbmFtZSA9IHNlZ21lbnRfaW5mb1tzZWddLm5hbWU7Ci0gIG5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VjbmFtZSkgKyA0KTsKLSAgc3RyY3B5IChuYW1lLCBzZWNuYW1lKTsKLSAgc3RyY2F0IChuYW1lLCAic3RyIik7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBuYW1lMiA9IHNlZ21lbnRfaW5mb1tpXS5uYW1lOwotICAgICAgaWYgKG5hbWUyICE9IE5VTEwgJiYgc3RybmNtcChuYW1lMiwgbmFtZSwgOCkgPT0gMCkKLQl7Ci0JICBzdGFic3Ryc2VnID0gaTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZm91bmQgdGhlIHNlY3Rpb24sIGdldCBpdHMgc2l6ZS4gKi8KLSAgaWYgKHN0YWJzdHJzZWcgIT0gU0VHX1VOS05PV04pCi0gICAgc3Ryc3ogPSBzaXplX3NlY3Rpb24gKGFiZmQsIHN0YWJzdHJzZWcpOwotCi0gIG5zeW1zID0gc2l6ZV9zZWN0aW9uIChhYmZkLCBzZWcpIC8gMTIgLSAxOwotCi0gIC8qIExvb2sgZm9yIHRoZSBmaXJzdCBmcmFnIG9mIHN1ZmZpY2llbnQgc2l6ZSBmb3IgdGhlIGluaXRpYWwgc3RhYgotICAgICBzeW1ib2wsIGFuZCBjb2xsZWN0IGEgcG9pbnRlciB0byBpdC4gKi8KLSAgd2hpbGUgKGZyYWcgJiYgZnJhZy0+ZnJfZml4IDwgMTIpCi0gICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0gIGFzc2VydCAoZnJhZyAhPSAwKTsKLSAgcCA9IGZyYWctPmZyX2xpdGVyYWw7Ci0gIGFzc2VydCAocCAhPSAwKTsKLQotICAvKiBXcml0ZSBpbiB0aGUgbnVtYmVyIG9mIHN0YWIgc3ltYm9scyBhbmQgdGhlIHNpemUgb2YgdGhlIHN0cmluZwotICAgICB0YWJsZS4gKi8KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAoYmZkX3ZtYSkgbnN5bXMsIChiZmRfYnl0ZSAqKSBwICsgNik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHN0cnN6LCAoYmZkX2J5dGUgKikgcCArIDgpOwotfQotCi0jZW5kaWYgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiZGVmIiwgb2JqX2NvZmZfZGVmLCAwfSwKLSAgeyJkaW0iLCBvYmpfY29mZl9kaW0sIDB9LAotICB7ImVuZGVmIiwgb2JqX2NvZmZfZW5kZWYsIDB9LAotICB7ImxpbmUiLCBvYmpfY29mZl9saW5lLCAwfSwKLSAgeyJsbiIsIG9ial9jb2ZmX2xuLCAwfSwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHsibG9jIiwgb2JqX2NvZmZfbG9jLCAwfSwKLSNlbmRpZgotICB7ImFwcGxpbmUiLCBvYmpfY29mZl9sbiwgMX0sCi0gIHsic2NsIiwgb2JqX2NvZmZfc2NsLCAwfSwKLSAgeyJzaXplIiwgb2JqX2NvZmZfc2l6ZSwgMH0sCi0gIHsidGFnIiwgb2JqX2NvZmZfdGFnLCAwfSwKLSAgeyJ0eXBlIiwgb2JqX2NvZmZfdHlwZSwgMH0sCi0gIHsidmFsIiwgb2JqX2NvZmZfdmFsLCAwfSwKLSAgeyJzZWN0aW9uIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICAvKiBGSVhNRTogV2UgaWdub3JlIHRoZSBNUkkgc2hvcnQgYXR0cmlidXRlLiAgKi8KLSAgeyJzZWN0aW9uLnMiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0LnMiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgLyogV2UgYWNjZXB0IHRoZSAuYnNzIGRpcmVjdGl2ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0gICAgIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2FzLiAgKi8KLSAgeyJic3MiLCBvYmpfY29mZl9ic3MsIDB9LAotICB7IndlYWsiLCBvYmpfY29mZl93ZWFrLCAwfSwKLSAgeyJpZGVudCIsIG9ial9jb2ZmX2lkZW50LCAwfSwKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICB7InVzZSIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InRleHQiLCBvYmpfY29mZl90ZXh0LCAwfSwKLSAgeyJkYXRhIiwgb2JqX2NvZmZfZGF0YSwgMH0sCi0gIHsibGNvbW0iLCBvYmpfY29mZl9sY29tbSwgMH0sCi0jZWxzZQotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAkvKiBGb3Igc3VuMzg2aSBjYyAoPykgKi8KLSNlbmRpZgotICB7InZlcnNpb24iLCBzX2lnbm9yZSwgMH0sCi0gIHsiQUJPUlQiLCBzX2Fib3J0LCAwfSwKLSNpZmRlZiBUQ19NODhLCi0gIC8qIFRoZSBtODhrIHVzZXMgc2RlZiBpbnN0ZWFkIG9mIGRlZi4gICovCi0gIHsic2RlZiIsIG9ial9jb2ZmX2RlZiwgMH0sCi0jZW5kaWYKLSAge05VTEwsIE5VTEwsIDB9CQkvKiBlbmQgc2VudGluZWwgKi8KLX07CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KLQwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXN0YXRpYyB2b2lkIGNvZmZfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotCi0vKiBTdXBwb3J0IGZvciBhIENPRkYgZW11bGF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfcG9wX2luc2VydCAoKQotewotICBwb3BfaW5zZXJ0IChvYmpfcHNldWRvX3RhYmxlKTsKLX0KLQotc3RhdGljIGludAotY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBjb2ZmX2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgMCwKLSAgMSwKLSAgY29mZl9mcm9iX3N5bWJvbCwKLSAgMCwKLSAgY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzLAotICAwLCAwLAotICAwLCAwLAotICAwLAotI2lmIDAKLSAgb2JqX2dlbmVyYXRlX2FzbV9saW5lbm8sCi0jZWxzZQotICAwLAotI2VuZGlmCi0jaWYgMAotICBvYmpfc3RhYiwKLSNlbHNlCi0gIDAsCi0jZW5kaWYKLSAgY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYywKLSAgY29mZl9wb3BfaW5zZXJ0LAotI2lmIDAKLSAgb2JqX3NldF9leHQsCi0jZWxzZQotICAwLAotI2VuZGlmCi0gIGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vaywKLSAgY29mZl9vYmpfc3ltYm9sX25ld19ob29rLAotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1jb2ZmLmggYi9nYXMvY29uZmlnL29iai1jb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDc5ODYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsODQ4ICswLDAgQEAKLS8qIGNvZmYgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBPQkpfRk9STUFUX0gKLSNkZWZpbmUgT0JKX0ZPUk1BVF9ICi0KLSNkZWZpbmUgT0JKX0NPRkYgMQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0jZGVmaW5lIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKLSNkZWZpbmUgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLSNkZWZpbmUgQkZEX0hFQURFUlMKLSNkZWZpbmUgQkZECi0KLSNlbmRpZgotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2luY2x1ZGUgImJmZC5oIgotCi0vKiBUaGlzIGludGVybmFsX2xpbmVubyBjcmFwIGlzIHRvIHN0b3AgbmFtZXNwYWNlIHBvbGx1dGlvbiBmcm9tIHRoZQotICAgYmZkIGludGVybmFsIGNvZmYgaGVhZGVyZmlsZS4gKi8KLSNkZWZpbmUgaW50ZXJuYWxfbGluZW5vIGJmZF9pbnRlcm5hbF9saW5lbm8KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jdW5kZWYgaW50ZXJuYWxfbGluZW5vCi0KLS8qIENQVS1zcGVjaWZpYyBzZXR1cDogICovCi0KLSNpZmRlZiBUQ19BUk0KLSNpbmNsdWRlICJjb2ZmL2FybS5oIgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtYXJtIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX1BQQwotI2lmZGVmIFRFX1BFCi0jaW5jbHVkZSAiY29mZi9wb3dlcnBjLmgiCi0jZWxzZQotI2luY2x1ZGUgImNvZmYvcnM2MDAwLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVENfU1BBUkMKLSNpbmNsdWRlICJjb2ZmL3NwYXJjLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRDX0kzODYKLSNpbmNsdWRlICJjb2ZmL2kzODYuaCIKLQotI2lmZGVmIFRFX1BFCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInBlLWkzODYiCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtaTM4NiIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19NNjhLCi0jaW5jbHVkZSAiY29mZi9tNjhrLmgiCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1tNjhrIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX0EyOUsKLSNpbmNsdWRlICJjb2ZmL2EyOWsuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1hMjlrLWJpZyIKLSNlbmRpZgotCi0jaWZkZWYgVENfSTk2MAotI2luY2x1ZGUgImNvZmYvaTk2MC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLUludGVsLWxpdHRsZSIKLSNlbmRpZgotCi0jaWZkZWYgVENfWjhLCi0jaW5jbHVkZSAiY29mZi96OGsuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi16OGsiCi0jZW5kaWYKLQotI2lmZGVmIFRDX0g4MzAwCi0jaW5jbHVkZSAiY29mZi9oODMwMC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWg4MzAwIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19IODUwMAotI2luY2x1ZGUgImNvZmYvaDg1MDAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1oODUwMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfU0gKLSNpbmNsdWRlICJjb2ZmL3NoLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCQkJCVwKLSAgKHNobAkJCQkJCQlcCi0gICA/IChzaF9zbWFsbCA/ICJjb2ZmLXNobC1zbWFsbCIgOiAiY29mZi1zaGwiKQkJXAotICAgOiAoc2hfc21hbGwgPyAiY29mZi1zaC1zbWFsbCIgOiAiY29mZi1zaCIpKQotI2VuZGlmCi0KLSNpZmRlZiBUQ19NODhLCi0jaW5jbHVkZSAiY29mZi9tODhrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTg4a2JjcyIKLSNlbmRpZgotCi0jaWZkZWYgVENfVzY1Ci0jaW5jbHVkZSAiY29mZi93NjUuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi13NjUiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1RJQzMwCi0jaW5jbHVkZSAiY29mZi90aWMzMC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLXRpYzMwIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19USUM4MAotI2luY2x1ZGUgImNvZmYvdGljODAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi10aWM4MCIKLSNkZWZpbmUgQUxJR05NRU5UX0lOX1NfRkxBR1MgMQotI2VuZGlmCi0KLSNpZmRlZiBUQ19NQ09SRQotI2luY2x1ZGUgImNvZmYvbWNvcmUuaCIKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJwZS1tY29yZSIKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFRhcmdldHMgbWF5IGFsc28gc2V0IHRoaXMuICBBbHNvLCBpZiBCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQsIHRoaXMKLSAgIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZGVmaW5lZC4gICovCi0jdW5kZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotI2RlZmluZSBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTIDEKLQotI2lmbmRlZiBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUwotI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyAxCi0jZW5kaWYgLyogT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgKi8KLQotZXh0ZXJuIHZvaWQgY29mZl9vYmpfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vawotCi1leHRlcm4gdm9pZCBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBvYmpfcmVhZF9iZWdpbl9ob29rIGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vawotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBUaGlzIGZpbGUgcmVhbGx5IGNvbnRhaW5zIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIENPRkYgYmFjayBlbmQuCi0gICBUaGV5IGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtZXJnZWQsIGJ1dCB0aGlzIGlzIG9ubHkgYQotICAgcHJlbGltaW5hcnksIG1lY2hhbmljYWwgbWVyZ2luZy4gIE1hbnkgZGVmaW5pdGlvbnMgdGhhdCBhcmUKLSAgIGlkZW50aWNhbCBiZXR3ZWVuIHRoZSB0d28gYXJlIHN0aWxsIGZvdW5kIGluIGJvdGggdmVyc2lvbnMuCi0KLSAgIFRoZSBmaXJzdCB2ZXJzaW9uLCB3aXRoIEJGRF9BU1NFTUJMRVIgZGVmaW5lZCwgdXNlcyBoaWdoLWxldmVsIEJGRAotICAgaW50ZXJmYWNlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLiAgVGhlIHNlY29uZCB2ZXJzaW9uLCB3aXRoCi0gICBCRkRfQVNTRU1CTEVSIG5vdCBkZWZpbmVkLCBhbHNvIHVzZXMgQkZELCBidXQgbW9zdGx5IGZvciBzd2FwcGluZwotICAgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmb3IgZG9pbmcgdGhlIGFjdHVhbCBJL08uICBUaGUgbGF0dGVyIGRlZmluZXMKLSAgIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9scyBCRkQgYW5kIEJGRF9IRUFERVJTLiAgVHJ5IG5vdCB0byBsZXQgdGhpcwotICAgY29uZnVzZSB5b3UuCi0KLSAgIFRoZXNlIHR3byBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWVyZ2VkLCBhbmQgZXZlbnR1YWxseSB0aGUKLSAgIEJGRF9BU1NFTUJMRVIgdmVyc2lvbiBzaG91bGQgdGFrZSBvdmVyIGNvbXBsZXRlbHkuICBSZWxlYXNlIHRpbWluZwotICAgaXNzdWVzIGFuZCBuYW1lc3BhY2UgcHJvYmxlbXMgY29udmluY2VkIG1lIHRvIG1lcmdlIHRoZSB0d28KLSAgIHRvZ2V0aGVyIGluIHRoaXMgZmFzaGlvbiwgYSBsaXR0bGUgc29vbmVyIHRoYW4gSSB3b3VsZCBoYXZlIGxpa2VkLgotICAgVGhlIHJlYWwgbWVyZ2Ugc2hvdWxkIGJlIG11Y2ggYmV0dGVyIGRvbmUgYnkgdGhlIHRpbWUgdGhlIG5leHQKLSAgIHJlbGVhc2UgY29tZXMgb3V0LgotCi0gICBGb3Igbm93LCB0aGUgc3RydWN0dXJlIG9mIHRoaXMgZmlsZSBpczoKLQk8Y29tbW9uPgotCSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JPG9uZSB2ZXJzaW9uPgotCSNlbHNlCi0JPG90aGVyIHZlcnNpb24+Ci0JI2VuZGlmCi0JPGNvbW1vbj4KLSAgIFVuZm9ydHVuYXRlbHksIHRoZSBjb21tb24gcG9ydGlvbnMgYXJlIHZlcnkgc21hbGwgYXQgdGhlIG1vbWVudCwKLSAgIGFuZCBtYW55IGRlY2xhcmF0aW9ucyBvciBkZWZpbml0aW9ucyBhcmUgZHVwbGljYXRlZC4gIFRoZSBzdHJ1Y3R1cmUKLSAgIG9mIG9iai1jb2ZmLmMgaXMgc2ltaWxhci4KLQotICAgU2VlIGRvYy9pbnRlcm5hbHMudGV4aSBmb3IgYSBicmllZiBkaXNjdXNzaW9uIG9mIHRoZSBoaXN0b3J5LCBpZgotICAgeW91IGNhcmUuCi0KLSAgIEtlbiBSYWVidXJuLCA1IE1heSAxOTk0Ci0KLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpbmNsdWRlICJiZmQvbGliY29mZi5oIgotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQotLyogU1lNQk9MIFRBQkxFICovCi0KLS8qIEFsdGVyIHRoZSBmaWVsZCBuYW1lcywgZm9yIG5vdywgdW50aWwgd2UndmUgZml4ZWQgdXAgdGhlIG90aGVyCi0gICByZWZlcmVuY2VzIHRvIHVzZSB0aGUgbmV3IG5hbWUuICAqLwotI2lmZGVmIFRDX0k5NjAKLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRQlzeW1ib2xTICoKLSNkZWZpbmUgc3lfdGMJCQliYWwKLSNlbmRpZgotCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFCXVuc2lnbmVkIGxvbmcKLSNkZWZpbmUgc3lfb2JqCQkJc3lfZmxhZ3MKLQotI2RlZmluZSBTWU1fQVVYRU5UKFMpIFwKLSAgKCZjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5uYXRpdmVbMV0udS5hdXhlbnQpCi0jZGVmaW5lIFNZTV9BVVhJTkZPKFMpIFwKLSAgKCZjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5uYXRpdmVbMV0pCi0KLSNkZWZpbmUgRE9fTk9UX1NUUklQCTAKLQotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotLyogVGhlIG51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyAqLwotI2RlZmluZSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZKHMpIFwKLSAgKGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzKSktPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgpCi0vKiBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzICovCi0jZGVmaW5lIFNfU0VUX05VTUJFUl9BVVhJTElBUlkocyx2KQkoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAocykgPSAodikpCi0KLS8qIFRydWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBpbiB0aGUgc3RyaW5nIHRhYmxlLCBpLmUuIGl0cyBsZW5ndGggaXMgPiA4LiAqLwotI2RlZmluZSBTX0lTX1NUUklORyhzKQkJKHN0cmxlbihTX0dFVF9OQU1FKHMpKSA+IDggPyAxIDogMCkKLQotZXh0ZXJuIGludCBTX1NFVF9EQVRBX1RZUEUgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLWV4dGVybiBpbnQgU19TRVRfU1RPUkFHRV9DTEFTUyBQQVJBTVMgKChzeW1ib2xTICosIGludCkpOwotZXh0ZXJuIGludCBTX0dFVF9TVE9SQUdFX0NMQVNTIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgU0FfU0VUX1NZTV9FTkRORFggUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLQotLyogQXV4aWxpYXJ5IGVudHJ5IG1hY3Jvcy4gU0FfIHN0YW5kcyBmb3Igc3ltYm9sIGF1eGlsaWFyeSAqLwotLyogT21pdCB0aGUgdHYgcmVsYXRlZCBmaWVsZHMgKi8KLS8qIEFjY2Vzc29ycyAqLwotCi0jZGVmaW5lIFNBX0dFVF9TWU1fVEFHTkRYKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF90YWduZHgubCkKLSNkZWZpbmUgU0FfR0VUX1NZTV9MTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFNBX0dFVF9TWU1fU0laRShzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBTQV9HRVRfU1lNX0ZTSVpFKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfZnNpemUpCi0jZGVmaW5lIFNBX0dFVF9TWU1fTE5OT1BUUihzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgU0FfR0VUX1NZTV9FTkRORFgocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNkZWZpbmUgU0FfR0VUX1NZTV9ESU1FTihzLGkpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsoaSldKQotI2RlZmluZSBTQV9HRVRfRklMRV9GTkFNRShzKQkoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X2ZuYW1lKQotI2RlZmluZSBTQV9HRVRfU0NOX1NDTkxFTihzKQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfc2NubGVuKQotI2RlZmluZSBTQV9HRVRfU0NOX05SRUxPQyhzKQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbnJlbG9jKQotI2RlZmluZSBTQV9HRVRfU0NOX05MSU5OTyhzKQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbmxpbm5vKQotCi0jZGVmaW5lIFNBX1NFVF9TWU1fTE5OTyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm89KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX1NJWkUocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9GU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfZnNpemU9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0xOTk9QVFIocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cj0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fRElNRU4ocyxpLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsoaSldPSh2KSkKLSNkZWZpbmUgU0FfU0VUX0ZJTEVfRk5BTUUocyx2KQlzdHJuY3B5KFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9mbmFtZSwodiksRklMTk1MRU4pCi0jZGVmaW5lIFNBX1NFVF9TQ05fU0NOTEVOKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X3Njbmxlbj0odikpCi0jZGVmaW5lIFNBX1NFVF9TQ05fTlJFTE9DKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25yZWxvYz0odikpCi0jZGVmaW5lIFNBX1NFVF9TQ05fTkxJTk5PKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25saW5ubz0odikpCi0KLS8qCi0gKiBJbnRlcm5hbCB1c2Ugb25seSBkZWZpbml0aW9ucy4gU0ZfIHN0YW5kcyBmb3Igc3ltYm9sIGZsYWdzLgotICoKLSAqIFRoZXNlIHZhbHVlcyBjYW4gYmUgYXNzaWduZWQgdG8gc3lfc3ltYm9sLm9zdF9mbGFncyBmaWVsZCBvZiBhIHN5bWJvbFMuCi0gKgotICogWW91J2xsIGJyZWFrIGk5NjAgaWYgeW91IHNoaWZ0IHRoZSBTWVNQUk9DIGJpdHMgYW55d2hlcmUgZWxzZS4gIGZvcgotICogbW9yZSBvbiB0aGUgYmFsbmFtZS9jYWxsbmFtZSBoYWNrLCBzZWUgdGMtaTk2MC5oLiAgYi5vdXQgaXMgZG9uZQotICogZGlmZmVyZW50bHkuCi0gKi8KLQotI2RlZmluZSBTRl9JOTYwX01BU0sJKDB4MDAwMDAxZmYpCS8qIEJpdHMgMC04IGFyZSB1c2VkIGJ5IHRoZSBpOTYwIHBvcnQuICovCi0jZGVmaW5lIFNGX1NZU1BST0MJKDB4MDAwMDAwM2YpCS8qIGJpdHMgMC01IGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBzeXNwcm9jIG51bWJlciAqLwotI2RlZmluZSBTRl9JU19TWVNQUk9DCSgweDAwMDAwMDQwKQkvKiBiaXQgNiBtYXJrcyBzeW1ib2xzIHRoYXQgYXJlIHN5c3Byb2NzICovCi0jZGVmaW5lIFNGX0JBTE5BTUUJKDB4MDAwMDAwODApCS8qIGJpdCA3IG1hcmtzIEJBTE5BTUUgc3ltYm9scyAqLwotI2RlZmluZSBTRl9DQUxMTkFNRQkoMHgwMDAwMDEwMCkJLyogYml0IDggbWFya3MgQ0FMTE5BTUUgc3ltYm9scyAqLwotCi0jZGVmaW5lIFNGX05PUk1BTF9NQVNLCSgweDAwMDBmZmZmKQkvKiBiaXRzIDEyLTE1IGFyZSBnZW5lcmFsIHB1cnBvc2UuICovCi0KLSNkZWZpbmUgU0ZfU1RBVElDUwkoMHgwMDAwMTAwMCkJLyogTWFyayB0aGUgLnRleHQgJiBhbGwgc3ltYm9scyAqLwotI2RlZmluZSBTRl9ERUZJTkVECSgweDAwMDAyMDAwKQkvKiBTeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KLSNkZWZpbmUgU0ZfU1RSSU5HCSgweDAwMDA0MDAwKQkvKiBTeW1ib2wgbmFtZSBsZW5ndGggPiA4ICovCi0jZGVmaW5lIFNGX0xPQ0FMCSgweDAwMDA4MDAwKQkvKiBTeW1ib2wgbXVzdCBub3QgYmUgZW1pdHRlZCAqLwotCi0jZGVmaW5lIFNGX0RFQlVHX01BU0sJKDB4ZmZmZjAwMDApCS8qIGJpdHMgMTYtMzEgYXJlIGRlYnVnIGluZm8gKi8KLQotI2RlZmluZSBTRl9GVU5DVElPTgkoMHgwMDAxMDAwMCkJLyogVGhlIHN5bWJvbCBpcyBhIGZ1bmN0aW9uICovCi0jZGVmaW5lIFNGX1BST0NFU1MJKDB4MDAwMjAwMDApCS8qIFByb2Nlc3Mgc3ltYm9sIGJlZm9yZSB3cml0ZSAqLwotI2RlZmluZSBTRl9UQUdHRUQJKDB4MDAwNDAwMDApCS8qIElzIGFzc29jaWF0ZWQgd2l0aCBhIHRhZyAqLwotI2RlZmluZSBTRl9UQUcJCSgweDAwMDgwMDAwKQkvKiBJcyBhIHRhZyAqLwotI2RlZmluZSBTRl9ERUJVRwkoMHgwMDEwMDAwMCkJLyogSXMgaW4gZGVidWcgb3IgYWJzIHNlY3Rpb24gKi8KLSNkZWZpbmUgU0ZfR0VUX1NFR01FTlQJKDB4MDAyMDAwMDApCS8qIEdldCB0aGUgc2VjdGlvbiBvZiB0aGUgZm9yd2FyZCBzeW1ib2wuICovCi0vKiBBbGwgb3RoZXIgYml0cyBhcmUgdW51c2VkLiAqLwotCi0vKiBBY2Nlc3NvcnMgKi8KLSNkZWZpbmUgU0ZfR0VUKHMpCQkoKnN5bWJvbF9nZXRfb2JqIChzKSkKLSNkZWZpbmUgU0ZfR0VUX0RFQlVHKHMpCQkoc3ltYm9sX2dldF9iZmRzeW0gKHMpLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0jZGVmaW5lIFNGX1NFVF9ERUJVRyhzKQkJKHN5bWJvbF9nZXRfYmZkc3ltIChzKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORykKLSNkZWZpbmUgU0ZfR0VUX05PUk1BTF9GSUVMRChzKQkoU0ZfR0VUIChzKSAmIFNGX05PUk1BTF9NQVNLKQotI2RlZmluZSBTRl9HRVRfREVCVUdfRklFTEQocykJKFNGX0dFVCAocykgJiBTRl9ERUJVR19NQVNLKQotI2RlZmluZSBTRl9HRVRfRklMRShzKQkJKFNGX0dFVCAocykgJiBTRl9GSUxFKQotI2RlZmluZSBTRl9HRVRfU1RBVElDUyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NUQVRJQ1MpCi0jZGVmaW5lIFNGX0dFVF9ERUZJTkVEKHMpCShTRl9HRVQgKHMpICYgU0ZfREVGSU5FRCkKLSNkZWZpbmUgU0ZfR0VUX1NUUklORyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NUUklORykKLSNkZWZpbmUgU0ZfR0VUX0xPQ0FMKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0xPQ0FMKQotI2RlZmluZSBTRl9HRVRfRlVOQ1RJT04ocykgICAgICAoU0ZfR0VUIChzKSAmIFNGX0ZVTkNUSU9OKQotI2RlZmluZSBTRl9HRVRfUFJPQ0VTUyhzKQkoU0ZfR0VUIChzKSAmIFNGX1BST0NFU1MpCi0jZGVmaW5lIFNGX0dFVF9UQUdHRUQocykJKFNGX0dFVCAocykgJiBTRl9UQUdHRUQpCi0jZGVmaW5lIFNGX0dFVF9UQUcocykJCShTRl9HRVQgKHMpICYgU0ZfVEFHKQotI2RlZmluZSBTRl9HRVRfR0VUX1NFR01FTlQocykJKFNGX0dFVCAocykgJiBTRl9HRVRfU0VHTUVOVCkKLSNkZWZpbmUgU0ZfR0VUX0k5NjAocykJCShTRl9HRVQgKHMpICYgU0ZfSTk2MF9NQVNLKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0JBTE5BTUUocykJKFNGX0dFVCAocykgJiBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpICYgU0ZfQ0FMTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfSVNfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSAmIFNGX0lTX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotCi0vKiBNb2RpZmllcnMgKi8KLSNkZWZpbmUgU0ZfU0VUKHMsdikJCShTRl9HRVQgKHMpID0gKHYpKQotI2RlZmluZSBTRl9TRVRfTk9STUFMX0ZJRUxEKHMsdikoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfTk9STUFMX01BU0spKQotI2RlZmluZSBTRl9TRVRfREVCVUdfRklFTEQocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfREVCVUdfTUFTSykpCi0jZGVmaW5lIFNGX1NFVF9GSUxFKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9GSUxFKQotI2RlZmluZSBTRl9TRVRfU1RBVElDUyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9TVEFUSUNTKQotI2RlZmluZSBTRl9TRVRfREVGSU5FRChzKQkoU0ZfR0VUIChzKSB8PSBTRl9ERUZJTkVEKQotI2RlZmluZSBTRl9TRVRfU1RSSU5HKHMpCShTRl9HRVQgKHMpIHw9IFNGX1NUUklORykKLSNkZWZpbmUgU0ZfU0VUX0xPQ0FMKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9MT0NBTCkKLSNkZWZpbmUgU0ZfQ0xFQVJfTE9DQUwocykJKFNGX0dFVCAocykgJj0gflNGX0xPQ0FMKQotI2RlZmluZSBTRl9TRVRfRlVOQ1RJT04ocykgICAgICAoU0ZfR0VUIChzKSB8PSBTRl9GVU5DVElPTikKLSNkZWZpbmUgU0ZfU0VUX1BST0NFU1MocykJKFNGX0dFVCAocykgfD0gU0ZfUFJPQ0VTUykKLSNkZWZpbmUgU0ZfU0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSB8PSBTRl9UQUdHRUQpCi0jZGVmaW5lIFNGX1NFVF9UQUcocykJCShTRl9HRVQgKHMpIHw9IFNGX1RBRykKLSNkZWZpbmUgU0ZfU0VUX0dFVF9TRUdNRU5UKHMpCShTRl9HRVQgKHMpIHw9IFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9TRVRfSTk2MChzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9JOTYwX01BU0spKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0JBTE5BTUUocykJKFNGX0dFVCAocykgfD0gU0ZfQkFMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9DQUxMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9DQUxMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9JU19TWVNQUk9DKHMpCShTRl9HRVQgKHMpIHw9IFNGX0lTX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfU1lTUFJPQyhzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9TWVNQUk9DKSkJLyogdXNlZCBieSBpOTYwICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tICBMaW5lIG51bWJlciBoYW5kbGluZyAtLS0tLS0tICovCi1leHRlcm4gaW50IHRleHRfbGluZW5vX251bWJlcjsKLWV4dGVybiBpbnQgY29mZl9saW5lX2Jhc2U7Ci1leHRlcm4gaW50IGNvZmZfbl9saW5lX25vczsKLQotI2RlZmluZSBvYmpfZW1pdF9saW5lbm8oV0hFUkUsTElORSxGSUxFX1NUQVJUKQlhYm9ydCAoKQotZXh0ZXJuIHZvaWQgY29mZl9hZGRfbGluZXN5bSBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotCi12b2lkIGNfZG90X2ZpbGVfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0jZGVmaW5lIG9ial9hcHBfZmlsZSBjX2RvdF9maWxlX3N5bWJvbAotCi1leHRlcm4gdm9pZCBjb2ZmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50ICopKTsKLWV4dGVybiB2b2lkIGNvZmZfYWRqdXN0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX2Zyb2Jfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotZXh0ZXJuIHZvaWQgY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUCkgCWNvZmZfZnJvYl9zeW1ib2woUywmUCkKLSNpZm5kZWYgb2JqX2FkanVzdF9zeW10YWIKLSNkZWZpbmUgb2JqX2FkanVzdF9zeW10YWIoKQljb2ZmX2FkanVzdF9zeW10YWIoKQotI2VuZGlmCi0jZGVmaW5lIG9ial9mcm9iX3NlY3Rpb24oUykJY29mZl9mcm9iX3NlY3Rpb24gKFMpCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKCkgY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpCi0KLWV4dGVybiBzeW1ib2xTICpjb2ZmX2xhc3RfZnVuY3Rpb247Ci0KLS8qIEZvcndhcmQgdGhlIHNlZ21lbnQgb2YgYSBmb3J3YXJkZWQgc3ltYm9sLCBoYW5kbGUgYXNzaWdubWVudHMgdGhhdAotICAganVzdCBjb3B5IHN5bWJvbCB2YWx1ZXMsIGV0Yy4gICovCi0jaWZuZGVmIFRFX0kzODZBSVgKLSNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMoZGVzdCxzcmMpIFwKLSAgKFNGX0dFVF9HRVRfU0VHTUVOVCAoZGVzdCkgXAotICAgPyAoU19TRVRfU0VHTUVOVCAoZGVzdCwgU19HRVRfU0VHTUVOVCAoc3JjKSksIDApIFwKLSAgIDogMCkKLSNlbHNlCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKGRlc3Qsc3JjKSBcCi0gIChTRl9HRVRfR0VUX1NFR01FTlQgKGRlc3QpICYmIFNfR0VUX1NFR01FTlQgKGRlc3QpID09IFNFR19VTktOT1dOIFwKLSAgID8gKFNfU0VUX1NFR01FTlQgKGRlc3QsIFNfR0VUX1NFR01FTlQgKHNyYykpLCAwKSBcCi0gICA6IDApCi0jZW5kaWYKLQotLyogc2FuaXR5IGNoZWNrICovCi0KLSNpZmRlZiBUQ19JOTYwCi0jaWZuZGVmIENfTEVBRlNUQVQKLWhleSAhIFdoZXJlIGlzIHRoZSBDX0xFQUZTVEFUIGRlZmluaXRpb24gPyBpOTYwIC0gY29mZiBzdXBwb3J0IGlzIGRlcGVuZGluZyBvbiBpdC4KLSNlbmRpZiAvKiBubyBDX0xFQUZTVEFUICovCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0jZWxzZSAvKiBub3QgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgVENfQTI5SwotLyogQWxsb3cgdHJhbnNsYXRlIGZyb20gYW91dCByZWxvY3MgdG8gY29mZiByZWxvY3MgKi8KLSNkZWZpbmUgTk9fUkVMT0MgMjAKLSNkZWZpbmUgUkVMT0NfMzIgMQotI2RlZmluZSBSRUxPQ184IDIKLSNkZWZpbmUgUkVMT0NfQ09OU1QgMwotI2RlZmluZSBSRUxPQ19DT05TVEggNAotI2RlZmluZSBSRUxPQ19KVU1QVEFSRyA1Ci0jZGVmaW5lIFJFTE9DX0JBU0UyMiA2Ci0jZGVmaW5lIFJFTE9DX0hJMjIgNwotI2RlZmluZSBSRUxPQ19MTzEwIDgKLSNkZWZpbmUgUkVMT0NfQkFTRTEzIDkKLSNkZWZpbmUgUkVMT0NfV0RJU1AyMiAxMAotI2RlZmluZSBSRUxPQ19XRElTUDMwIDExCi0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwotCi0vKiBNYWdpYyBudW1iZXIgb2YgcGFnZWQgZXhlY3V0YWJsZS4gKi8KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCTB4ODMwMAotCi0KLS8qIFNZTUJPTCBUQUJMRSAqLwotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgZGF0YSB0eXBlICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEJhc2ljIHN5bWJvbCAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IG9zdF9lbnRyeTsKLSAgLyogQXV4aWxpYXJ5IGVudHJ5LiAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgb3N0X2F1eGVudFtPQkpfQ09GRl9NQVhfQVVYRU5UUklFU107Ci0gIC8qIG9ial9jb2ZmIGludGVybmFsIHVzZSBvbmx5IGZsYWdzICovCi0gIHVuc2lnbmVkIGludCBvc3RfZmxhZ3M7Ci19IG9ial9zeW1ib2xfdHlwZTsKLQotI2lmbmRlZiBET19OT1RfU1RSSVAKLSNkZWZpbmUgRE9fTk9UX1NUUklQCTAKLSNlbmRpZgotLyogU3ltYm9sIHRhYmxlIG1hY3JvcyBhbmQgY29uc3RhbnRzICovCi0KLS8qIFBvc3NpYmxlIGFuZCB1c2VmdWxsIHNlY3Rpb24gbnVtYmVyIGluIHN5bWJvbCB0YWJsZQotICogVGhlIHZhbHVlcyBvZiBURVhULCBEQVRBIGFuZCBCU1MgbWF5IG5vdCBiZSBwb3J0YWJsZS4KLSAqLwotCi0jZGVmaW5lIENfQUJTX1NFQ1RJT04JCU5fQUJTCi0jZGVmaW5lIENfVU5ERUZfU0VDVElPTgkJTl9VTkRFRgotI2RlZmluZSBDX0RFQlVHX1NFQ1RJT04JCU5fREVCVUcKLSNkZWZpbmUgQ19OVFZfU0VDVElPTgkJTl9UVgotI2RlZmluZSBDX1BUVl9TRUNUSU9OCQlQX1RWCi0jZGVmaW5lIENfUkVHSVNURVJfU0VDVElPTgk1MAotCi0vKgotICogIE1hY3JvcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKiAgVGhpcyBzeW50YXhpYyBpbmRpcmVjdGlvbiBhbGxvd3MgaW5kZXBlbmRlbmNlIHJlZ2FyZGluZyBhLm91dCBvciBjb2ZmLgotICogIFRoZSBhcmd1bWVudCAocykgb2YgYWxsIHRoZXNlIG1hY3JvcyBpcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKi8KLQotLyogUHJlZGljYXRlcyAqLwotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfSVNfRVhURVJOQUwocykgICAgICAgICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX1VOREVGX1NFQ1RJT04pCi0vKiBUcnVlIGlmIHN5bWJvbCBoYXMgYmVlbiBkZWZpbmVkLCBpZSA6Ci0gICBzZWN0aW9uID4gMCAoREFUQSwgVEVYVCBvciBCU1MpCi0gICBzZWN0aW9uID09IDAgYW5kIHZhbHVlID4gMCAoZXh0ZXJuYWwgYnNzIHN5bWJvbCkgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpIFwKLSAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID4gQ19VTkRFRl9TRUNUSU9OIFwKLSAgIHx8ICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX1VOREVGX1NFQ1RJT04gXAotICAgICAgICYmIFNfR0VUX1ZBTFVFIChzKSA+IDApIFwKLSAgIHx8ICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX0FCU19TRUNUSU9OKSkKLS8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLwotI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19ERUJVR19TRUNUSU9OKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLwotLyogQSBzeW1ib2wgbmFtZSB3aG9zZSBuYW1lIGluY2x1ZGVzIF5BIGlzIGEgZ2FzIGludGVybmFsIHBzZXVkbyBzeW1ib2wgKi8KLSNkZWZpbmUgU19JU19MT0NBTChzKSBcCi0gICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX1JFR0lTVEVSX1NFQ1RJT04gXAotICAgfHwgKFNfTE9DQUxfTkFNRShzKSAmJiAhIGZsYWdfa2VlcF9sb2NhbHMgJiYgISBTX0lTX0RFQlVHIChzKSkgXAotICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMIFwKLSAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTCBcCi0gICB8fCAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSBcCi0gICAgICAgJiYgIVNfSVNfRVhURVJOQUwocykgXAotICAgICAgICYmIChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfQUJTX1NFQ1RJT04pKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KLSNkZWZpbmUgU19JU19FWFRFUk4ocykJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSAwIFwKLQkJCQkgJiYgU19HRVRfVkFMVUUgKHMpID09IDApCi0vKgotICogVHJ1ZSBpZiBhIHN5bWJvbCBjYW4gYmUgbXVsdGlwbHkgZGVmaW5lZCAoYnNzIHN5bWJvbHMgaGF2ZSB0aGlzIGRlZgotICogdGhvdWdoIGl0IGlzIGJhZCBwcmFjdGljZSkKLSAqLwotI2RlZmluZSBTX0lTX0NPTU1PTihzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IDAgXAotCQkJCSAmJiBTX0dFVF9WQUxVRSAocykgIT0gMCkKLS8qIFRydWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBpbiB0aGUgc3RyaW5nIHRhYmxlLCBpLmUuIGl0cyBsZW5ndGggaXMgPiA4LiAqLwotI2RlZmluZSBTX0lTX1NUUklORyhzKQkJKHN0cmxlbihTX0dFVF9OQU1FKHMpKSA+IDggPyAxIDogMCkKLQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBkZWZpbmVkIGFzIHdlYWsuICAqLwotI2lmZGVmIFRFX1BFCi0jZGVmaW5lIFNfSVNfV0VBSyhzKSBcCi0gICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPT0gQ19OVF9XRUFLIFwKLSAgIHx8IChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQpCi0jZWxzZQotI2RlZmluZSBTX0lTX1dFQUsocykgXAotICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzID09IENfV0VBS0VYVCkKLSNlbmRpZgotCi0vKiBBY2Nlc3NvcnMgKi8KLS8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKChjaGFyKikocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9vZmZzZXQpCi0vKiBUaGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfR0VUX09GRlNFVChzKSAgICAgICAgICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9vZmZzZXQpCi0vKiBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgc2VnbWVudCAqLwotI2RlZmluZSBTX0dFVF9TRUdNRU5UKHMpICAgc19nZXRfc2VnbWVudChzKQotLyogVGhlIGRhdGEgdHlwZSAqLwotI2RlZmluZSBTX0dFVF9EQVRBX1RZUEUocykJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3R5cGUpCi0vKiBUaGUgc3RvcmFnZSBjbGFzcyAqLwotI2RlZmluZSBTX0dFVF9TVE9SQUdFX0NMQVNTKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MpCi0vKiBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzICovCi0jZGVmaW5lIFNfR0VUX05VTUJFUl9BVVhJTElBUlkocykJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX251bWF1eCkKLQotLyogTW9kaWZpZXJzICovCi0vKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX1NFVF9OQU1FKHMsdikJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9vZmZzZXQgPSAodW5zaWduZWQgbG9uZykodikpCi0vKiBTZXQgdGhlIG9mZnNldCBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX09GRlNFVChzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9vZmZzZXQgPSAodikpCi0vKiBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgc2VnbWVudCAqLwotI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsdikJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID0gU0VHTUVOVF9UT19TWU1CT0xfVFlQRSh2KSkKLS8qIFRoZSBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgU19TRVRfREFUQV9UWVBFKHMsdikJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3R5cGUgPSAodikpCi0vKiBUaGUgc3RvcmFnZSBjbGFzcyAqLwotI2RlZmluZSBTX1NFVF9TVE9SQUdFX0NMQVNTKHMsdikJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcyA9ICh2KSkKLS8qIFRoZSBudW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSNkZWZpbmUgU19TRVRfTlVNQkVSX0FVWElMSUFSWShzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9udW1hdXggPSAodikpCi0KLS8qIEFkZGl0aW9uYWwgbW9kaWZpZXJzICovCi0vKiBUaGUgc3ltYm9sIGlzIGV4dGVybmFsIChkb2VzIG5vdCBtZWFuIHVuZGVmaW5lZCkgKi8KLSNkZWZpbmUgU19TRVRfRVhURVJOQUwocykgICAgICAgeyBTX1NFVF9TVE9SQUdFX0NMQVNTKHMsIENfRVhUKSA7IFNGX0NMRUFSX0xPQ0FMKHMpOyB9Ci0KLS8qIEF1eGlsaWFyeSBlbnRyeSBtYWNyb3MuIFNBXyBzdGFuZHMgZm9yIHN5bWJvbCBhdXhpbGlhcnkgKi8KLS8qIE9taXQgdGhlIHR2IHJlbGF0ZWQgZmllbGRzICovCi0vKiBBY2Nlc3NvcnMgKi8KLSNkZWZpbmUgU1lNX0FVWEVOVChTKQkoJihTKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0pCi0KLSNkZWZpbmUgU0FfR0VUX1NZTV9UQUdORFgocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X3RhZ25keC5sKQotI2RlZmluZSBTQV9HRVRfU1lNX0xOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNkZWZpbmUgU0FfR0VUX1NZTV9TSVpFKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRlNJWkUocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZSkKLSNkZWZpbmUgU0FfR0VUX1NZTV9MTk5PUFRSKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2RlZmluZSBTQV9HRVRfU1lNX0VORE5EWChzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRElNRU4ocyxpKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bKGkpXSkKLSNkZWZpbmUgU0FfR0VUX0ZJTEVfRk5BTUUocykJKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9mbmFtZSkKLSNkZWZpbmUgU0FfR0VUX0ZJTEVfRk5BTUVfT0ZGU0VUKHMpICAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF9vZmZzZXQpCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FX1pFUk9TKHMpICAgKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9uLnhfemVyb2VzKQotI2RlZmluZSBTQV9HRVRfU0NOX1NDTkxFTihzKQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfc2NubGVuKQotI2RlZmluZSBTQV9HRVRfU0NOX05SRUxPQyhzKQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbnJlbG9jKQotI2RlZmluZSBTQV9HRVRfU0NOX05MSU5OTyhzKQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbmxpbm5vKQotCi0vKiBNb2RpZmllcnMgKi8KLSNkZWZpbmUgU0FfU0VUX1NZTV9UQUdORFgocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfdGFnbmR4Lmw9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0xOTk8ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9TSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZT0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fRlNJWkUocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2ZzaXplPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PUFRSKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHI9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0VORE5EWChzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubD0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fRElNRU4ocyxpLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsoaSldPSh2KSkKLSNkZWZpbmUgU0FfU0VUX0ZJTEVfRk5BTUUocyx2KQlzdHJuY3B5KFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9mbmFtZSwodiksRklMTk1MRU4pCi0jZGVmaW5lIFNBX1NFVF9GSUxFX0ZOQU1FX09GRlNFVChzLHYpIChTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfbi54X29mZnNldD0odikpCi0jZGVmaW5lIFNBX1NFVF9GSUxFX0ZOQU1FX1pFUk9TKHMsdikgIChTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfbi54X3plcm9lcz0odikpCi0jZGVmaW5lIFNBX1NFVF9TQ05fU0NOTEVOKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X3Njbmxlbj0odikpCi0jZGVmaW5lIFNBX1NFVF9TQ05fTlJFTE9DKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25yZWxvYz0odikpCi0jZGVmaW5lIFNBX1NFVF9TQ05fTkxJTk5PKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25saW5ubz0odikpCi0KLS8qCi0gKiBJbnRlcm5hbCB1c2Ugb25seSBkZWZpbml0aW9ucy4gU0ZfIHN0YW5kcyBmb3Igc3ltYm9sIGZsYWdzLgotICoKLSAqIFRoZXNlIHZhbHVlcyBjYW4gYmUgYXNzaWduZWQgdG8gc3lfc3ltYm9sLm9zdF9mbGFncyBmaWVsZCBvZiBhIHN5bWJvbFMuCi0gKgotICogWW91J2xsIGJyZWFrIGk5NjAgaWYgeW91IHNoaWZ0IHRoZSBTWVNQUk9DIGJpdHMgYW55d2hlcmUgZWxzZS4gIGZvcgotICogbW9yZSBvbiB0aGUgYmFsbmFtZS9jYWxsbmFtZSBoYWNrLCBzZWUgdGMtaTk2MC5oLiAgYi5vdXQgaXMgZG9uZQotICogZGlmZmVyZW50bHkuCi0gKi8KLQotI2RlZmluZSBTRl9JOTYwX01BU0sJKDB4MDAwMDAxZmYpCS8qIEJpdHMgMC04IGFyZSB1c2VkIGJ5IHRoZSBpOTYwIHBvcnQuICovCi0jZGVmaW5lIFNGX1NZU1BST0MJKDB4MDAwMDAwM2YpCS8qIGJpdHMgMC01IGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBzeXNwcm9jIG51bWJlciAqLwotI2RlZmluZSBTRl9JU19TWVNQUk9DCSgweDAwMDAwMDQwKQkvKiBiaXQgNiBtYXJrcyBzeW1ib2xzIHRoYXQgYXJlIHN5c3Byb2NzICovCi0jZGVmaW5lIFNGX0JBTE5BTUUJKDB4MDAwMDAwODApCS8qIGJpdCA3IG1hcmtzIEJBTE5BTUUgc3ltYm9scyAqLwotI2RlZmluZSBTRl9DQUxMTkFNRQkoMHgwMDAwMDEwMCkJLyogYml0IDggbWFya3MgQ0FMTE5BTUUgc3ltYm9scyAqLwotCi0jZGVmaW5lIFNGX05PUk1BTF9NQVNLCSgweDAwMDBmZmZmKQkvKiBiaXRzIDEyLTE1IGFyZSBnZW5lcmFsIHB1cnBvc2UuICovCi0KLSNkZWZpbmUgU0ZfU1RBVElDUwkoMHgwMDAwMTAwMCkJLyogTWFyayB0aGUgLnRleHQgJiBhbGwgc3ltYm9scyAqLwotI2RlZmluZSBTRl9ERUZJTkVECSgweDAwMDAyMDAwKQkvKiBTeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KLSNkZWZpbmUgU0ZfU1RSSU5HCSgweDAwMDA0MDAwKQkvKiBTeW1ib2wgbmFtZSBsZW5ndGggPiA4ICovCi0jZGVmaW5lIFNGX0xPQ0FMCSgweDAwMDA4MDAwKQkvKiBTeW1ib2wgbXVzdCBub3QgYmUgZW1pdHRlZCAqLwotCi0jZGVmaW5lIFNGX0RFQlVHX01BU0sJKDB4ZmZmZjAwMDApCS8qIGJpdHMgMTYtMzEgYXJlIGRlYnVnIGluZm8gKi8KLQotI2RlZmluZSBTRl9GVU5DVElPTgkoMHgwMDAxMDAwMCkJLyogVGhlIHN5bWJvbCBpcyBhIGZ1bmN0aW9uICovCi0jZGVmaW5lIFNGX1BST0NFU1MJKDB4MDAwMjAwMDApCS8qIFByb2Nlc3Mgc3ltYm9sIGJlZm9yZSB3cml0ZSAqLwotI2RlZmluZSBTRl9UQUdHRUQJKDB4MDAwNDAwMDApCS8qIElzIGFzc29jaWF0ZWQgd2l0aCBhIHRhZyAqLwotI2RlZmluZSBTRl9UQUcJCSgweDAwMDgwMDAwKQkvKiBJcyBhIHRhZyAqLwotI2RlZmluZSBTRl9ERUJVRwkoMHgwMDEwMDAwMCkJLyogSXMgaW4gZGVidWcgb3IgYWJzIHNlY3Rpb24gKi8KLSNkZWZpbmUgU0ZfR0VUX1NFR01FTlQJKDB4MDAyMDAwMDApCS8qIEdldCB0aGUgc2VjdGlvbiBvZiB0aGUgZm9yd2FyZCBzeW1ib2wuICovCi0jZGVmaW5lIFNGX0FESl9MTk5PUFRSCSgweDAwNDAwMDAwKQkvKiBIYXMgYSBsbm5vcHRyICovCi0vKiBBbGwgb3RoZXIgYml0cyBhcmUgdW51c2VkLiAqLwotCi0vKiBBY2Nlc3NvcnMgKi8KLSNkZWZpbmUgU0ZfR0VUKHMpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2ZsYWdzKQotI2RlZmluZSBTRl9HRVRfTk9STUFMX0ZJRUxEKHMpCShTRl9HRVQgKHMpICYgU0ZfTk9STUFMX01BU0spCi0jZGVmaW5lIFNGX0dFVF9ERUJVR19GSUVMRChzKQkoU0ZfR0VUIChzKSAmIFNGX0RFQlVHX01BU0spCi0jZGVmaW5lIFNGX0dFVF9GSUxFKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0ZJTEUpCi0jZGVmaW5lIFNGX0dFVF9TVEFUSUNTKHMpCShTRl9HRVQgKHMpICYgU0ZfU1RBVElDUykKLSNkZWZpbmUgU0ZfR0VUX0RFRklORUQocykJKFNGX0dFVCAocykgJiBTRl9ERUZJTkVEKQotI2RlZmluZSBTRl9HRVRfU1RSSU5HKHMpCShTRl9HRVQgKHMpICYgU0ZfU1RSSU5HKQotI2RlZmluZSBTRl9HRVRfTE9DQUwocykJCShTRl9HRVQgKHMpICYgU0ZfTE9DQUwpCi0jZGVmaW5lIFNGX0dFVF9GVU5DVElPTihzKSAgICAgIChTRl9HRVQgKHMpICYgU0ZfRlVOQ1RJT04pCi0jZGVmaW5lIFNGX0dFVF9QUk9DRVNTKHMpCShTRl9HRVQgKHMpICYgU0ZfUFJPQ0VTUykKLSNkZWZpbmUgU0ZfR0VUX0RFQlVHKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0RFQlVHKQotI2RlZmluZSBTRl9HRVRfVEFHR0VEKHMpCShTRl9HRVQgKHMpICYgU0ZfVEFHR0VEKQotI2RlZmluZSBTRl9HRVRfVEFHKHMpCQkoU0ZfR0VUIChzKSAmIFNGX1RBRykKLSNkZWZpbmUgU0ZfR0VUX0dFVF9TRUdNRU5UKHMpCShTRl9HRVQgKHMpICYgU0ZfR0VUX1NFR01FTlQpCi0jZGVmaW5lIFNGX0dFVF9BREpfTE5OT1BUUihzKQkoU0ZfR0VUIChzKSAmIFNGX0FESl9MTk5PUFRSKQotI2RlZmluZSBTRl9HRVRfSTk2MChzKQkJKFNGX0dFVCAocykgJiBTRl9JOTYwX01BU0spCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSAmIFNGX0JBTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfQ0FMTE5BTUUocykJKFNGX0dFVCAocykgJiBTRl9DQUxMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9JU19TWVNQUk9DKHMpCShTRl9HRVQgKHMpICYgU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9TWVNQUk9DKHMpCShTRl9HRVQgKHMpICYgU0ZfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0KLS8qIE1vZGlmaWVycyAqLwotI2RlZmluZSBTRl9TRVQocyx2KQkJKFNGX0dFVCAocykgPSAodikpCi0jZGVmaW5lIFNGX1NFVF9OT1JNQUxfRklFTEQocyx2KShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9OT1JNQUxfTUFTSykpCi0jZGVmaW5lIFNGX1NFVF9ERUJVR19GSUVMRChzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9ERUJVR19NQVNLKSkKLSNkZWZpbmUgU0ZfU0VUX0ZJTEUocykJCShTRl9HRVQgKHMpIHw9IFNGX0ZJTEUpCi0jZGVmaW5lIFNGX1NFVF9TVEFUSUNTKHMpCShTRl9HRVQgKHMpIHw9IFNGX1NUQVRJQ1MpCi0jZGVmaW5lIFNGX1NFVF9ERUZJTkVEKHMpCShTRl9HRVQgKHMpIHw9IFNGX0RFRklORUQpCi0jZGVmaW5lIFNGX1NFVF9TVFJJTkcocykJKFNGX0dFVCAocykgfD0gU0ZfU1RSSU5HKQotI2RlZmluZSBTRl9TRVRfTE9DQUwocykJCShTRl9HRVQgKHMpIHw9IFNGX0xPQ0FMKQotI2RlZmluZSBTRl9DTEVBUl9MT0NBTChzKQkoU0ZfR0VUIChzKSAmPSB+U0ZfTE9DQUwpCi0jZGVmaW5lIFNGX1NFVF9GVU5DVElPTihzKSAgICAgIChTRl9HRVQgKHMpIHw9IFNGX0ZVTkNUSU9OKQotI2RlZmluZSBTRl9TRVRfUFJPQ0VTUyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9QUk9DRVNTKQotI2RlZmluZSBTRl9TRVRfREVCVUcocykJCShTRl9HRVQgKHMpIHw9IFNGX0RFQlVHKQotI2RlZmluZSBTRl9TRVRfVEFHR0VEKHMpCShTRl9HRVQgKHMpIHw9IFNGX1RBR0dFRCkKLSNkZWZpbmUgU0ZfU0VUX1RBRyhzKQkJKFNGX0dFVCAocykgfD0gU0ZfVEFHKQotI2RlZmluZSBTRl9TRVRfR0VUX1NFR01FTlQocykJKFNGX0dFVCAocykgfD0gU0ZfR0VUX1NFR01FTlQpCi0jZGVmaW5lIFNGX1NFVF9BREpfTE5OT1BUUihzKQkoU0ZfR0VUIChzKSB8PSBTRl9BREpfTE5OT1BUUikKLSNkZWZpbmUgU0ZfU0VUX0k5NjAocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfSTk2MF9NQVNLKSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9CQUxOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0JBTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfQ0FMTE5BTUUocykJKFNGX0dFVCAocykgfD0gU0ZfQ0FMTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfSVNfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9JU19TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX1NZU1BST0Mocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfU1lTUFJPQykpCS8qIHVzZWQgYnkgaTk2MCAqLwotCi0vKiBGaWxlIGhlYWRlciBtYWNybyBhbmQgdHlwZSBkZWZpbml0aW9uICovCi0KLS8qCi0gKiBGaWxlIHBvc2l0aW9uIGNhbGN1bGF0b3JzLiBCZXdhcmUgdG8gdXNlIHRoZW0gd2hlbiBhbGwgdGhlCi0gKiBhcHByb3ByaWF0ZSBmaWVsZHMgYXJlIHNldCBpbiB0aGUgaGVhZGVyLgotICovCi0KLSNpZmRlZiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgotI2RlZmluZSBPQkpfQ09GRl9BT1VUSERSU1ogKDApCi0jZWxzZQotI2RlZmluZSBPQkpfQ09GRl9BT1VUSERSU1ogKEFPVVRIRFJTWikKLSNlbmRpZiAvKiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUiAqLwotCi0jZGVmaW5lIEhfR0VUX0ZJTEVfU0laRShoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpICsgXAotCSAgIEhfR0VUX1JFTE9DQVRJT05fU0laRShoKSArIEhfR0VUX0xJTkVOT19TSVpFKGgpICsgXAotCSAgIEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgpICsgXAotCSAgIChoKS0+c3RyaW5nX3RhYmxlX3NpemUpCi0jZGVmaW5lIEhfR0VUX1RFWFRfRklMRV9PRkZTRVQoaCkgXAotICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCi0JICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaKQotI2RlZmluZSBIX0dFVF9EQVRBX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkpCi0jZGVmaW5lIEhfR0VUX0JTU19GSUxFX09GRlNFVChoKSAwCi0jZGVmaW5lIEhfR0VUX1JFTE9DQVRJT05fRklMRV9PRkZTRVQoaCkgXAotICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCi0JICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAotCSAgIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSkKLSNkZWZpbmUgSF9HRVRfTElORU5PX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkgKyBcCi0JICAgSF9HRVRfUkVMT0NBVElPTl9TSVpFKGgpKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfRklMRV9PRkZTRVQoaCkgXAotICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCi0JICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAotCSAgIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKLQkgICBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkgKyBIX0dFVF9MSU5FTk9fU0laRShoKSkKLQotLyogQWNjZXNzb3JzICovCi0vKiBhb3V0aGRyICovCi0jZGVmaW5lIEhfR0VUX01BR0lDX05VTUJFUihoKSAgICAgICAgICAgKChoKS0+YW91dGhkci5tYWdpYykKLSNkZWZpbmUgSF9HRVRfVkVSU0lPTl9TVEFNUChoKQkJKChoKS0+YW91dGhkci52c3RhbXApCi0jZGVmaW5lIEhfR0VUX1RFWFRfU0laRShoKSAgICAgICAgICAgICAgKChoKS0+YW91dGhkci50c2l6ZSkKLSNkZWZpbmUgSF9HRVRfREFUQV9TSVpFKGgpICAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmRzaXplKQotI2RlZmluZSBIX0dFVF9CU1NfU0laRShoKSAgICAgICAgICAgICAgICgoaCktPmFvdXRoZHIuYnNpemUpCi0jZGVmaW5lIEhfR0VUX0VOVFJZX1BPSU5UKGgpICAgICAgICAgICAgKChoKS0+YW91dGhkci5lbnRyeSkKLSNkZWZpbmUgSF9HRVRfVEVYVF9TVEFSVChoKQkJKChoKS0+YW91dGhkci50ZXh0X3N0YXJ0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NUQVJUKGgpCQkoKGgpLT5hb3V0aGRyLmRhdGFfc3RhcnQpCi0vKiBmaWxlaGRyICovCi0jZGVmaW5lIEhfR0VUX0ZJTEVfTUFHSUNfTlVNQkVSKGgpCSgoaCktPmZpbGVoZHIuZl9tYWdpYykKLSNkZWZpbmUgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpCSgoaCktPmZpbGVoZHIuZl9uc2NucykKLSNkZWZpbmUgSF9HRVRfVElNRV9TVEFNUChoKQkJKChoKS0+ZmlsZWhkci5mX3RpbWRhdCkKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX1BPSU5URVIoaCkJKChoKS0+ZmlsZWhkci5mX3N5bXB0cikKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX0NPVU5UKGgpCQkoKGgpLT5maWxlaGRyLmZfbnN5bXMpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgpCShIX0dFVF9TWU1CT0xfQ09VTlQoaCkgKiBTWU1FU1opCi0jZGVmaW5lIEhfR0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIoaCkJKChoKS0+ZmlsZWhkci5mX29wdGhkcikKLSNkZWZpbmUgSF9HRVRfRkxBR1MoaCkJCQkoKGgpLT5maWxlaGRyLmZfZmxhZ3MpCi0vKiBFeHRyYSBmaWVsZHMgdG8gYWNoaWV2ZSBic2QgYS5vdXQgY29tcGF0aWJpbGl0eSBhbmQgZm9yIGNvbnZlbmllbmNlICovCi0jZGVmaW5lIEhfR0VUX1JFTE9DQVRJT05fU0laRShoKSAgIAkoKGgpLT5yZWxvY2F0aW9uX3NpemUpCi0jZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpICAgICAgICAgICAgKChoKS0+c3RyaW5nX3RhYmxlX3NpemUpCi0jZGVmaW5lIEhfR0VUX0xJTkVOT19TSVpFKGgpICAgICAgICAgICAgKChoKS0+bGluZW5vX3NpemUpCi0KLSNpZm5kZWYgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLSNkZWZpbmUgSF9HRVRfSEVBREVSX1NJWkUoaCkJCShzaXplb2YoRklMSERSKSBcCi0JCQkJCSArIHNpemVvZihBT1VUSERSKVwKLQkJCQkJICsgKEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWikpCi0jZWxzZSAvKiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUiAqLwotI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKHNpemVvZihGSUxIRFIpIFwKLQkJCQkJICsgKEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWikpCi0jZW5kaWYgLyogT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIgKi8KLQotI2RlZmluZSBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRShoKQkodGV4dF9zZWN0aW9uX2hlYWRlci5zX25yZWxvYyAqIFJFTFNaKQotI2RlZmluZSBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoKQkoZGF0YV9zZWN0aW9uX2hlYWRlci5zX25yZWxvYyAqIFJFTFNaKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIGFvdXRoZHIgKi8KLSNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikgICAgICAgICAoKGgpLT5hb3V0aGRyLm1hZ2ljID0gKHYpKQotI2RlZmluZSBIX1NFVF9WRVJTSU9OX1NUQU1QKGgsdikJKChoKS0+YW91dGhkci52c3RhbXAgPSAodikpCi0jZGVmaW5lIEhfU0VUX1RFWFRfU0laRShoLHYpICAgICAgICAgICAgKChoKS0+YW91dGhkci50c2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfREFUQV9TSVpFKGgsdikgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmRzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9CU1NfU0laRShoLHYpICAgICAgICAgICAgICgoaCktPmFvdXRoZHIuYnNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0VOVFJZX1BPSU5UKGgsdikgICAgICAgICAgKChoKS0+YW91dGhkci5lbnRyeSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfVEVYVF9TVEFSVChoLHYpCQkoKGgpLT5hb3V0aGRyLnRleHRfc3RhcnQgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU1RBUlQoaCx2KQkJKChoKS0+YW91dGhkci5kYXRhX3N0YXJ0ID0gKHYpKQotLyogZmlsZWhkciAqLwotI2RlZmluZSBIX1NFVF9GSUxFX01BR0lDX05VTUJFUihoLHYpCSgoaCktPmZpbGVoZHIuZl9tYWdpYyA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgsdikJKChoKS0+ZmlsZWhkci5mX25zY25zID0gKHYpKQotI2RlZmluZSBIX1NFVF9USU1FX1NUQU1QKGgsdikJCSgoaCktPmZpbGVoZHIuZl90aW1kYXQgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NZTUJPTF9UQUJMRV9QT0lOVEVSKGgsdikJKChoKS0+ZmlsZWhkci5mX3N5bXB0ciA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KSAgICAoKGgpLT5maWxlaGRyLmZfbnN5bXMgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIoaCx2KSAoKGgpLT5maWxlaGRyLmZfb3B0aGRyID0gKHYpKQotI2RlZmluZSBIX1NFVF9GTEFHUyhoLHYpCQkoKGgpLT5maWxlaGRyLmZfZmxhZ3MgPSAodikpCi0vKiBFeHRyYSBmaWVsZHMgdG8gYWNoaWV2ZSBic2QgYS5vdXQgY29tcGF0aWJpbGl0eSBhbmQgZm9yIGNvbnZpbmllbmNlICovCi0jZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkgCSgoaCktPnJlbG9jYXRpb25fc2l6ZSA9ICh0KSsoZCkpCi0jZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikgICAgICAgICAgKChoKS0+c3RyaW5nX3RhYmxlX3NpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0xJTkVOT19TSVpFKGgsdikgICAgICAgICAgKChoKS0+bGluZW5vX3NpemUgPSAodikpCi0KLS8qIFNlZ21lbnQgZmxpcHBpbmcgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgYW91dGhkcjsJLyogYS5vdXQgaGVhZGVyICovCi0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyIGZpbGVoZHI7CS8qIEZpbGUgaGVhZGVyLCBub3QgbWFjaGluZSBkZXAuICovCi0gIGxvbmcgc3RyaW5nX3RhYmxlX3NpemU7CS8qIG5hbWVzICsgJ1wwJyArIHNpemVvZihpbnQpICovCi0gIGxvbmcgcmVsb2NhdGlvbl9zaXplOwkvKiBDdW11bGF0ZWQgc2l6ZSBvZiByZWxvY2F0aW9uCi0JCQkgICBpbmZvcm1hdGlvbiBmb3IgYWxsIHNlY3Rpb25zIGluCi0JCQkgICBieXRlcy4gKi8KLSAgbG9uZyBsaW5lbm9fc2l6ZTsJCS8qIFNpemUgb2YgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCi0JCQkJICAgdGFibGUgaW4gYnl0ZXMgKi8KLX0gb2JqZWN0X2hlYWRlcnM7Ci0KLQotCi1zdHJ1Y3QgbGluZW5vX2xpc3QKLXsKLSAgc3RydWN0IGJmZF9pbnRlcm5hbF9saW5lbm8gbGluZTsKLSAgY2hhciAqZnJhZzsJCQkvKiBGcmFnIHRvIHdoaWNoIHRoZSBsaW5lIG51bWJlciBpcyByZWxhdGVkICovCi0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbmV4dDsJLyogRm9yd2FyZCBjaGFpbiBwb2ludGVyICovCi19OwotCi0KLQotCi0jZGVmaW5lIG9ial9zZWdtZW50X25hbWUoaSkgKHNlZ21lbnRfaW5mb1soaW50KSAoaSldLnNjbmhkci5zX25hbWUpCi0KLSNkZWZpbmUgb2JqX2FkZF9zZWdtZW50KHMpIG9ial9jb2ZmX2FkZF9zZWdtZW50IChzKQotCi1leHRlcm4gc2VnVCBvYmpfY29mZl9hZGRfc2VnbWVudCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotZXh0ZXJuIHZvaWQgY19kb3RfZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLSNkZWZpbmUgb2JqX2FwcF9maWxlIGNfZG90X2ZpbGVfc3ltYm9sCi1leHRlcm4gdm9pZCBvYmpfZXh0cmFfc3R1ZmYgUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7Ci0KLWV4dGVybiBzZWdUIHNfZ2V0X3NlZ21lbnQgUEFSQU1TICgoc3ltYm9sUyAqcHRyKSk7Ci0KLWV4dGVybiB2b2lkIGNfc2VjdGlvbl9oZWFkZXIgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3NjbmhkciAqIGhlYWRlciwKLQkJCQkgICAgICBjaGFyICpuYW1lLAotCQkJCSAgICAgIGxvbmcgY29yZV9hZGRyZXNzLAotCQkJCSAgICAgIGxvbmcgc2l6ZSwKLQkJCQkgICAgICBsb25nIGRhdGFfcHRyLAotCQkJCSAgICAgIGxvbmcgcmVsb2NfcHRyLAotCQkJCSAgICAgIGxvbmcgbGluZW5vX3B0ciwKLQkJCQkgICAgICBsb25nIHJlbG9jX251bWJlciwKLQkJCQkgICAgICBsb25nIGxpbmVub19udW1iZXIsCi0JCQkJICAgICAgbG9uZyBhbGlnbm1lbnQpKTsKLQotI2lmbmRlZiB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sKLXZvaWQgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2VuZGlmCi0KLS8qIHNhbml0eSBjaGVjayAqLwotCi0jaWZkZWYgVENfSTk2MAotI2lmbmRlZiBDX0xFQUZTVEFUCi1oZXkgISBXaGVyZSBpcyB0aGUgQ19MRUFGU1RBVCBkZWZpbml0aW9uID8gaTk2MCAtIGNvZmYgc3VwcG9ydCBpcyBkZXBlbmRpbmcgb24gaXQuCi0jZW5kaWYgLyogbm8gQ19MRUFGU1RBVCAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLWV4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIGRhdGFfc2VjdGlvbl9oZWFkZXI7Ci1leHRlcm4gc3RydWN0IGludGVybmFsX3NjbmhkciB0ZXh0X3NlY3Rpb25faGVhZGVyOwotCi0vKiBGb3J3YXJkIHRoZSBzZWdtZW50IG9mIGEgZm9yd2FyZGVkIHN5bWJvbC4gICovCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKGRlc3Qsc3JjKSBcCi0gIChTRl9HRVRfR0VUX1NFR01FTlQgKGRlc3QpIFwKLSAgID8gKFNfU0VUX1NFR01FTlQgKGRlc3QsIFNfR0VUX1NFR01FTlQgKHNyYykpLCAwKSBcCi0gICA6IDApCi0KLSNpZmRlZiBURV9QRQotI2RlZmluZSBvYmpfaGFuZGxlX2xpbmtfb25jZSh0KSBvYmpfY29mZl9wZV9oYW5kbGVfbGlua19vbmNlICh0KQotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAoKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLQotLyogSW4gQ09GRiwgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCB1c2luZyAuZGVmLy52YWwgU1lNLy5lbmRlZiwgaXQncyBPSwotICAgdG8gcmVkZWZpbmUgdGhlIHN5bWJvbCBsYXRlciBvbi4gIFRoaXMgY2FuIGhhcHBlbiBpZiBDIHN5bWJvbHMgdXNlCi0gICBhIHByZWZpeCwgYW5kIGEgc3ltYm9sIGlzIGRlZmluZWQgYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZSBwcmVmaXgsCi0gICBhcyBpbiBzdGFydC9fc3RhcnQvX19zdGFydCBpbiBnY2MvbGliZ2NjMS10ZXN0LmMuICAqLwotI2RlZmluZSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oc3ltKQkJXAotKFNGX0dFVF9HRVRfU0VHTUVOVCAoc3ltKQkJCQlcCi0gPyAoc3ltLT5zeV9mcmFnID0gZnJhZ19ub3csCQkJCVwKLSAgICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpLAkJCVwKLSAgICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpLAkJCVwKLSAgICAwKQkJCQkJCQlcCi0gOiAwKQotCi0vKiBTdGFicyBpbiBhIGNvZmYgZmlsZSBnbyBpbnRvIHRoZWlyIG93biBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAxCi0KLS8qIFdlIG5lZWQgMTIgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIHRvIGhvbGQgc29tZSBpbml0aWFsCi0gICBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gdm9pZCBvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7Ci0jZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLQotLyogU3RvcmUgdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyBpbiB0aGUgc2VjdGlvbiBhdXggZW50cnkuICAqLwotI2RlZmluZSBTRVRfU0VDVElPTl9SRUxPQ1Moc2VjLCByZWxvY3MsIG4pIFwKLSAgU0FfU0VUX1NDTl9OUkVMT0MgKHNlY3Rpb25fc3ltYm9sIChzZWMpLCBuKQotCi0jZW5kaWYgLyogT0JKX0ZPUk1BVF9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1lY29mZi5jIGIvZ2FzL2NvbmZpZy9vYmotZWNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4OTI0My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qIEVDT0ZGIG9iamVjdCBmaWxlIGZvcm1hdC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBUaGlzIGZpbGUgd2FzIHB1dCB0b2dldGhlciBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfSEVBREVSICJvYmotZWNvZmYuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJiZmQvbGliY29mZi5oIgotI2luY2x1ZGUgImJmZC9saWJlY29mZi5oIgotCi0vKiBBbG1vc3QgYWxsIG9mIHRoZSBFQ09GRiBzdXBwb3J0IGlzIGFjdHVhbGx5IGluIGVjb2ZmLmMgaW4gdGhlIG1haW4KLSAgIGdhcyBkaXJlY3RvcnkuICBUaGlzIGZpbGUgbW9zdGx5IGp1c3QgYXJyYW5nZXMgdG8gY2FsbCB0aGF0IG9uZSBhdAotICAgdGhlIHJpZ2h0IHRpbWVzLiAgKi8KLQotc3RhdGljIGludCBlY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWNvZmZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgcHNldWRvLW9wcyB3ZSBzdXBwb3J0IGluIHRoaXMgZmlsZS4gIE9ubHkgdGhvc2UKLSAgIHJlbGF0aW5nIHRvIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhcmUgc3VwcG9ydGVkIGhlcmUuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sKLSAgIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUsIGJ1dCBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkOiAuYWVudCwKLSAgIC5iZ25iLCAuZW5kYiwgLnZlcnN0YW1wLCAudnJlZy4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKLSAgIE1JUFMgQ1BVIHNwZWNpZmljLCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGMtbWlwcy5jOiAuYWxpYXMsCi0gICAuZXh0ZXJuLCAuZ2FsaXZlLCAuZ2phbGRlZiwgLmdqcmxpdmUsIC5saXZlcmVnLCAubm9hbGlhcywgLm9wdGlvbiwKLSAgIC5yZGF0YSwgLnNkYXRhLCAuc2V0LgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQotICAgbm90IE1JUFMgQ1BVIHNwZWNpZmljLCBidXQgYXJlIGFsc28gbm90IEVDT0ZGIHNwZWNpZmljLiAgSSBoYXZlCi0gICBvbmx5IGxpc3RlZCB0aGUgb25lcyB3aGljaCBhcmUgbm90IGFscmVhZHkgaW4gcmVhZC5jLiAgSXQncyBub3QKLSAgIGNvbXBsZXRlbHkgY2xlYXIgd2hlcmUgdGhlc2Ugc2hvdWxkIGJlIGRlZmluZWQsIGJ1dCB0Yy1taXBzLmMgaXMKLSAgIHByb2JhYmx5IHRoZSBtb3N0IHJlYXNvbmFibGUgcGxhY2U6IC5hc2NpaXosIC5hc20wLCAuZW5kciwgLmVyciwKLSAgIC5oYWxmLCAubGFiLCAucmVwZWF0LCAuc3RydWN0LCAud2Vha2V4dC4gICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICAvKiBDT0ZGIHN0eWxlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gLmxuIGlzIG5vdCB1c2VkOyAubG9jIGlzIHVzZWQKLSAgICAgaW5zdGVhZC4gICovCi0gIHsgImRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9kZWYsCTAgfSwKLSAgeyAiZGltIiwJZWNvZmZfZGlyZWN0aXZlX2RpbSwJMCB9LAotICB7ICJlbmRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwJMCB9LAotICB7ICJmaWxlIiwJZWNvZmZfZGlyZWN0aXZlX2ZpbGUsCTAgfSwKLSAgeyAic2NsIiwJZWNvZmZfZGlyZWN0aXZlX3NjbCwJMCB9LAotICB7ICJzaXplIiwJZWNvZmZfZGlyZWN0aXZlX3NpemUsCTAgfSwKLSAgeyAiZXNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAotICB7ICJ0YWciLAllY29mZl9kaXJlY3RpdmVfdGFnLAkwIH0sCi0gIHsgInR5cGUiLAllY29mZl9kaXJlY3RpdmVfdHlwZSwJMCB9LAotICB7ICJldHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCi0gIHsgInZhbCIsCWVjb2ZmX2RpcmVjdGl2ZV92YWwsCTAgfSwKLQotICAvKiBFQ09GRiBzcGVjaWZpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICB7ICJiZWdpbiIsCWVjb2ZmX2RpcmVjdGl2ZV9iZWdpbiwJMCB9LAotICB7ICJiZW5kIiwJZWNvZmZfZGlyZWN0aXZlX2JlbmQsCTAgfSwKLSAgeyAiZW5kIiwJZWNvZmZfZGlyZWN0aXZlX2VuZCwJMCB9LAotICB7ICJlbnQiLAllY29mZl9kaXJlY3RpdmVfZW50LAkwIH0sCi0gIHsgImZtYXNrIiwJZWNvZmZfZGlyZWN0aXZlX2ZtYXNrLAkwIH0sCi0gIHsgImZyYW1lIiwJZWNvZmZfZGlyZWN0aXZlX2ZyYW1lLAkwIH0sCi0gIHsgImxvYyIsCWVjb2ZmX2RpcmVjdGl2ZV9sb2MsCTAgfSwKLSAgeyAibWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9tYXNrLAkwIH0sCi0KLSAgLyogT3RoZXIgRUNPRkYgZGlyZWN0aXZlcy4gICovCi0gIHsgImV4dGVybiIsCWVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4sCTAgfSwKLQotI2lmbmRlZiBUQ19NSVBTCi0gIC8qIEZvciBUQ19NSVBTLCB0Yy1taXBzLmMgYWRkcyB0aGlzLiAqLwotICB7ICJ3ZWFrZXh0IiwJZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQsIDAgfSwKLSNlbmRpZgotCi0gIC8qIFRoZXNlIGFyZSB1c2VkIG9uIElyaXguICBJIGRvbid0IGtub3cgaG93IHRvIGltcGxlbWVudCB0aGVtLiAgKi8KLSAgeyAiYmduYiIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJlbmRiIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgInZlcnN0YW1wIiwJc19pZ25vcmUsCQkwIH0sCi0KLSAgLyogU2VudGluZWwuICAqLwotICB7IE5VTEwgfQotfTsKLQotLyogU3dhcCBvdXQgdGhlIHN5bWJvbHMgYW5kIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgQkZELiAgKi8KLQotdm9pZAotZWNvZmZfZnJvYl9maWxlICgpCi17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcAotICAgID0gJmVjb2ZmX2JhY2tlbmQgKHN0ZG91dHB1dCktPmRlYnVnX3N3YXA7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgSERSUiAqaGRyOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnNldDsKLQotICAvKiBTZXQgdGhlIHNlY3Rpb24gVk1BIHZhbHVlcy4gIFdlIGZvcmNlIHRoZSAuc2RhdGEgYW5kIC5zYnNzCi0gICAgIHNlY3Rpb25zIHRvIHRoZSBlbmQgdG8gZW5zdXJlIHRoYXQgdGhlaXIgVk1BIGFkZHJlc3NlcyBhcmUgY2xvc2UKLSAgICAgdG9nZXRoZXIgc28gdGhhdCB0aGUgR1AgcmVnaXN0ZXIgY2FuIGFkZHJlc3MgYm90aCBvZiB0aGVtLiAgV2UKLSAgICAgcHV0IHRoZSAuYnNzIHNlY3Rpb24gYWZ0ZXIgdGhlIC5zYnNzIHNlY3Rpb24uCi0KLSAgICAgQWxzbywgZm9yIHRoZSBBbHBoYSwgd2UgbXVzdCBzb3J0IHRoZSBzZWN0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkKLSAgICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgZmlsZSBpbiB0aGUgY29ycmVjdCBvcmRlci4gIChBY3R1YWxseSwgbWF5YmUKLSAgICAgdGhpcyBpcyBhIGpvYiBmb3IgQkZELiAgQnV0IHRoZSBWTUFzIGNvbXB1dGVkIHdvdWxkIGJlIG91dCBvZgotICAgICB3aGFjayBpZiB3ZSBjb21wdXRlZCB0aGVtIGdpdmVuIG91ciBpbml0aWFsLCByYW5kb20gb3JkZXJpbmcuCi0gICAgIEl0J3MgcG9zc2libGUgdGhhdCB0aGF0IHdvdWxkbid0IGJyZWFrIHRoaW5nczsgSSBjb3VsZCBkbyBzb21lCi0gICAgIGV4cGVyaW1lbnRpbmcgc29tZXRpbWUgYW5kIGZpbmQgb3V0LgotCi0gICAgIFRoaXMgb3V0cHV0IG9yZGVyaW5nIG9mIHNlY3Rpb25zIGlzIG1hZ2ljLCBvbiB0aGUgQWxwaGEsIGF0Ci0gICAgIGxlYXN0LiAgVGhlIC5saXRhIHNlY3Rpb24gbXVzdCBjb21lIGJlZm9yZSAubGl0OCBhbmQgLmxpdDQsCi0gICAgIG90aGVyd2lzZSB0aGUgT1NGLzEgbGlua2VyIG1heSBzaWxlbnRseSB0cmFzaCB0aGUgLmxpdHs0LDh9Ci0gICAgIHNlY3Rpb24gY29udGVudHMuICBBbHNvLCAudGV4dCBtdXN0IHByZWNlZWQgLnJkYXRhLiAgVGhlc2UgZGlmZmVyCi0gICAgIGZyb20gdGhlIG9yZGVyIGRlc2NyaWJlZCBpbiBzb21lIHBhcnRzIG9mIHRoZSBERUMgT1NGLzEgQXNzZW1ibHkKLSAgICAgTGFuZ3VhZ2UgUHJvZ3JhbW1lcidzIEd1aWRlLCBidXQgdGhhdCBvcmRlciBkb2Vzbid0IHNlZW0gdG8gd29yawotICAgICB3aXRoIHRoZWlyIGxpbmtlci4KLQotICAgICBJIGRvbid0IGtub3cgaWYgc2VjdGlvbiBvcmRlcmluZyBvbiB0aGUgTUlQUyBpcyBpbXBvcnRhbnQuICAqLwotCi0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1tdID0gewotICAgIC8qIHRleHQgc2VnbWVudCAqLwotICAgICIudGV4dCIsICIucmRhdGEiLCAiLmluaXQiLCAiLmZpbmkiLAotICAgIC8qIGRhdGEgc2VnbWVudCAqLwotICAgICIuZGF0YSIsICIubGl0YSIsICIubGl0OCIsICIubGl0NCIsICIuc2RhdGEiLCAiLmdvdCIsCi0gICAgLyogYnNzIHNlZ21lbnQgKi8KLSAgICAiLnNic3MiLCAiLmJzcyIsCi0gIH07Ci0jZGVmaW5lIG5fbmFtZXMgKHNpemVvZiAobmFtZXMpIC8gc2l6ZW9mIChuYW1lc1swXSkpCi0KLSAgYWRkciA9IDA7Ci0gIHsKLSAgICAvKiBTZWN0aW9ucyB0aGF0IG1hdGNoIG5hbWVzLCBvcmRlciB0byBiZSBzdHJhaWdodGVuZWQgb3V0IGxhdGVyLiAgKi8KLSAgICBhc2VjdGlvbiAqc2Vjc1tuX25hbWVzXTsKLSAgICAvKiBMaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyB3aXRoIG5vbi1tYXRjaGluZyBuYW1lcy4gIFJhbmRvbSBvcmRlcmluZy4gICovCi0gICAgYXNlY3Rpb24gKm90aGVyX3NlY3Rpb25zID0gMDsKLSAgICAvKiBQb2ludGVyIHRvIG5leHQgc2VjdGlvbiwgc2luY2Ugd2UncmUgZGVzdHJveWluZyB0aGUgb3JpZ2luYWwKLSAgICAgICBvcmRlcmluZy4gICovCi0gICAgYXNlY3Rpb24gKm5leHQ7Ci0KLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuX25hbWVzOyBpKyspCi0gICAgICBzZWNzW2ldID0gMDsKLSAgICBmb3IgKHNlYyA9IHN0ZG91dHB1dC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gbmV4dCkKLSAgICAgIHsKLQluZXh0ID0gc2VjLT5uZXh0OwotCWZvciAoaSA9IDA7IGkgPCBuX25hbWVzOyBpKyspCi0JICBpZiAoIXN0cmNtcCAoc2VjLT5uYW1lLCBuYW1lc1tpXSkpCi0JICAgIHsKLQkgICAgICBzZWNzW2ldID0gc2VjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JaWYgKGkgPT0gbl9uYW1lcykKLQkgIHsKLQkgICAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWMsIGFkZHIpOwotCSAgICBhZGRyICs9IGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjKTsKLQkgICAgc2VjLT5uZXh0ID0gb3RoZXJfc2VjdGlvbnM7Ci0JICAgIG90aGVyX3NlY3Rpb25zID0gc2VjOwotCSAgfQotICAgICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBuX25hbWVzOyBpKyspCi0gICAgICBpZiAoc2Vjc1tpXSkKLQl7Ci0JICBzZWMgPSBzZWNzW2ldOwotCSAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWMsIGFkZHIpOwotCSAgYWRkciArPSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYyk7Ci0JfQotICAgIGZvciAoaSA9IG5fbmFtZXMgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIGlmIChzZWNzW2ldKQotCXsKLQkgIHNlYyA9IHNlY3NbaV07Ci0JICBzZWMtPm5leHQgPSBvdGhlcl9zZWN0aW9uczsKLQkgIG90aGVyX3NlY3Rpb25zID0gc2VjOwotCX0KLSAgICBzdGRvdXRwdXQtPnNlY3Rpb25zID0gb3RoZXJfc2VjdGlvbnM7Ci0gIH0KLQotICAvKiBCdWlsZCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgYXNzZXJ0IChlY29mZl9kYXRhIChzdGRvdXRwdXQpICE9IDApOwotICBoZHIgPSAmZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0gIGVjb2ZmX2J1aWxkX2RlYnVnIChoZHIsICZidWYsIGRlYnVnX3N3YXApOwotCi0gIC8qIEZpbmlzaCB1cCB0aGUgZWNvZmZfdGRhdGEgc3RydWN0dXJlLiAgKi8KLSAgc2V0ID0gYnVmOwotI2RlZmluZSBTRVQocHRyLCBjb3VudCwgdHlwZSwgc2l6ZSkgXAotICBpZiAoaGRyLT5jb3VudCA9PSAwKSBcCi0gICAgZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KS0+ZGVidWdfaW5mby5wdHIgPSAodHlwZSkgTlVMTDsgXAotICBlbHNlIFwKLSAgICB7IFwKLSAgICAgIGVjb2ZmX2RhdGEgKHN0ZG91dHB1dCktPmRlYnVnX2luZm8ucHRyID0gKHR5cGUpIHNldDsgXAotICAgICAgc2V0ICs9IGhkci0+Y291bnQgKiBzaXplOyBcCi0gICAgfQotCi0gIFNFVCAobGluZSwgY2JMaW5lLCB1bnNpZ25lZCBjaGFyICosIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotICBTRVQgKGV4dGVybmFsX2RuciwgaWRuTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX2Rucl9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9wZHIsIGlwZE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfc3ltLCBpc3ltTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9vcHQsIGlvcHRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOwotICBTRVQgKGV4dGVybmFsX2F1eCwgaWF1eE1heCwgdW5pb24gYXV4X2V4dCAqLCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgU0VUIChzcywgaXNzTWF4LCBjaGFyICosIHNpemVvZiAoY2hhcikpOwotICBTRVQgKHNzZXh0LCBpc3NFeHRNYXgsIGNoYXIgKiwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoZXh0ZXJuYWxfcmZkLCBjcmZkLCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX3JmZF9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9mZHIsIGlmZE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfZXh0LCBpZXh0TWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQotI3VuZGVmIFNFVAotCi0gIC8qIEZpbGwgaW4gdGhlIHJlZ2lzdGVyIG1hc2tzLiAgKi8KLSAgewotICAgIHVuc2lnbmVkIGxvbmcgZ3BybWFzayA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBmcHJtYXNrID0gMDsKLSAgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrID0gTlVMTDsKLQotI2lmZGVmIFRDX01JUFMKLSAgICAvKiBGaWxsIGluIHRoZSBNSVBTIHJlZ2lzdGVyIG1hc2tzLiAgSXQncyBwcm9iYWJseSBub3Qgd29ydGgKLSAgICAgICBzZXR0aW5nIHVwIGEgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIHRoaXMuICAqLwotICAgIGdwcm1hc2sgPSBtaXBzX2dwcm1hc2s7Ci0gICAgY3BybWFzayA9IG1pcHNfY3BybWFzazsKLSNlbmRpZgotCi0jaWZkZWYgVENfQUxQSEEKLSAgICBhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEgKCk7Ci0KLSAgICBpZiAoISBiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlIChzdGRvdXRwdXQsIGFscGhhX2dwX3ZhbHVlKSkKLSAgICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBzZXQgR1AgdmFsdWUiKSk7Ci0KLSAgICBncHJtYXNrID0gYWxwaGFfZ3BybWFzazsKLSAgICBmcHJtYXNrID0gYWxwaGFfZnBybWFzazsKLSNlbmRpZgotCi0gICAgaWYgKCEgYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyAoc3Rkb3V0cHV0LCBncHJtYXNrLCBmcHJtYXNrLCBjcHJtYXNrKSkKLSAgICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBzZXQgcmVnaXN0ZXIgbWFza3MiKSk7Ci0gIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIEVDT0ZGIGNvZGUgdG8gc2V0IHRoZSBleHRlcm5hbCBpbmZvcm1hdGlvbgotICAgZm9yIGEgc3ltYm9sLiAgV2UganVzdCBwYXNzIGl0IG9uIHRvIEJGRCwgd2hpY2ggZXhwZWN0cyB0aGUgc3dhcHBlZAotICAgaW5mb3JtYXRpb24gdG8gYmUgc3RvcmVkIGluIHRoZSBuYXRpdmUgZmllbGQgb2YgdGhlIHN5bWJvbC4gICovCi0KLXZvaWQKLW9ial9lY29mZl9zZXRfZXh0IChzeW0sIGV4dCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBFWFRSICpleHQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcAotICAgID0gJmVjb2ZmX2JhY2tlbmQgKHN0ZG91dHB1dCktPmRlYnVnX3N3YXA7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICplc3ltOwotCi0gIGtub3cgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKQotCT09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cik7Ci0gIGVzeW0gPSBlY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpOwotICBlc3ltLT5sb2NhbCA9IGZhbHNlOwotICBlc3ltLT5uYXRpdmUgPSB4bWFsbG9jIChkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0gICgqZGVidWdfc3dhcC0+c3dhcF9leHRfb3V0KSAoc3Rkb3V0cHV0LCBleHQsIGVzeW0tPm5hdGl2ZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sIChzeW0sIHB1bnRwKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCAqcHVudHA7Ci17Ci0gIGVjb2ZmX2Zyb2Jfc3ltYm9sIChzeW0pOwotfQotCi1zdGF0aWMgdm9pZAotZWNvZmZfcG9wX2luc2VydCAoKQotewotICBwb3BfaW5zZXJ0IChvYmpfcHNldWRvX3RhYmxlKTsKLX0KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWNvZmZfZm9ybWF0X29wcyA9Ci17Ci0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgMCwKLSAgMSwKLSAgb2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sLAotICBlY29mZl9mcm9iX2ZpbGUsCi0gIDAsCi0gIDAsIDAsCi0gIDAsIDAsCi0gIDAsCi0gIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8sCi0gIGVjb2ZmX3N0YWIsCi0gIGVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jLAotICBlY29mZl9wb3BfaW5zZXJ0LAotICBlY29mZl9zZXRfZXh0LAotICBlY29mZl9yZWFkX2JlZ2luX2hvb2ssCi0gIGVjb2ZmX3N5bWJvbF9uZXdfaG9vaywKLX07CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1lY29mZi5oIGIvZ2FzL2NvbmZpZy9vYmotZWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjYTI1NC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogRUNPRkYgb2JqZWN0IGZpbGUgZm9ybWF0IGhlYWRlciBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfRUNPRkYgMQotCi0vKiBVc2UgdGhlIGdlbmVyaWMgRUNPRkYgZGVidWdnaW5nIGNvZGUuICAqLwotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotLyogRm9yIGVhY2ggZ2FzIHN5bWJvbCB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIGZpbGUgaXQgY2FtZSBmcm9tLCBvZgotICAgd2hldGhlciB3ZSBoYXZlIGdlbmVyYXRlZCBhbiBFQ09GRiBzeW1ib2wgZm9yIGl0LCBhbmQgd2hldGhlciB0aGUKLSAgIHN5bWJvbHMgaXMgdW5kZWZpbmVkICh0aGlzIGxhc3QgaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGEgLmV4dGVybgotICAgc3ltYm9scyBmcm9tIGEgLmNvbW0gc3ltYm9sKS4gICovCi0KLXN0cnVjdCBlY29mZl9zeV9vYmoKLXsKLSAgc3RydWN0IGVmZHIgKmVjb2ZmX2ZpbGU7Ci0gIHN0cnVjdCBsb2NhbHN5bSAqZWNvZmZfc3ltYm9sOwotICB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7Ci19OwotCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHN0cnVjdCBlY29mZl9zeV9vYmoKLQotLyogTW9kaWZ5IHRoZSBFQ09GRiBzeW1ib2wuICAqLwotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woc3ltcCwgcHVudCkgZWNvZmZfZnJvYl9zeW1ib2wgKHN5bXApCi0KLS8qIFRoaXMgaXMgdXNlZCB0byB3cml0ZSB0aGUgc3ltYm9saWMgZGF0YSBpbiB0aGUgZm9ybWF0IHRoYXQgQkZECi0gICBleHBlY3RzIGl0LiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG9ial9mcm9iX2ZpbGUoKSBlY29mZl9mcm9iX2ZpbGUgKCkKLQotLyogV2UgdXNlIHRoZSBFQ09GRiBmdW5jdGlvbnMgYXMgb3VyIGhvb2tzLiAgKi8KLSNkZWZpbmUgb2JqX3JlYWRfYmVnaW5faG9vayBlY29mZl9yZWFkX2JlZ2luX2hvb2sKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayBlY29mZl9zeW1ib2xfbmV3X2hvb2sKLQotLyogUmVjb3JkIGZpbGUgc3dpdGNoZXMgaW4gdGhlIEVDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0jZGVmaW5lIG9ial9hcHBfZmlsZShuYW1lKSBlY29mZl9uZXdfZmlsZSAobmFtZSkKLQotLyogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueSBzdGFicyBwcm9jZXNzaW5nIGluIHJlYWQuYy4gICovCi0jZGVmaW5lIE9CSl9QUk9DRVNTX1NUQUIoc2VnLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKSBcCi0gIGVjb2ZmX3N0YWIgKChzZWcpLCAod2hhdCksIChzdHJpbmcpLCAodHlwZSksIChvdGhlciksIChkZXNjKSkKLQotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUwkJMAotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkxCi0KLSNkZWZpbmUgb2JqX2Vjb2ZmX3NldF9leHQgZWNvZmZfc2V0X2V4dAotZXh0ZXJuIHZvaWQgb2JqX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3ltYm9sUyAqLCBFWFRSICopKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVsZi5jIGIvZ2FzL2NvbmZpZy9vYmotZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDAyZWIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODU2ICswLDAgQEAKLS8qIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMtOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBPQkpfSEVBREVSICJvYmotZWxmLmgiCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0jaWZuZGVmIEVDT0ZGX0RFQlVHR0lORwotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMAotI2Vsc2UKLSNkZWZpbmUgTkVFRF9FQ09GRl9ERUJVRwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0jaW5jbHVkZSAiZWNvZmYuaCIKLSNlbmRpZgotCi0jaWZkZWYgVENfQUxQSEEKLSNpbmNsdWRlICJlbGYvYWxwaGEuaCIKLSNlbmRpZgotCi0jaWZkZWYgVENfTUlQUwotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1BQQwotI2luY2x1ZGUgImVsZi9wcGMuaCIKLSNlbmRpZgotCi1zdGF0aWMgYmZkX3ZtYSBlbGZfc19nZXRfc2l6ZSBQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zX3NldF9zaXplIFBBUkFNUyAoKHN5bWJvbFMgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgZWxmX3NfZ2V0X2FsaWduIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgZWxmX3Nfc2V0X2FsaWduIFBBUkFNUyAoKHN5bWJvbFMgKiwgYmZkX3ZtYSkpOwotc3RhdGljIHZvaWQgZWxmX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLXN0YXRpYyBpbnQgZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGFkanVzdF9zdGFiX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLXN0YXRpYyBib29sZWFuIGVsZl9nZXRfZXh0ciBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWxmX3NldF9pbmRleCBQQVJBTVMgKChhc3ltYm9sICosIGJmZF9zaXplX3R5cGUpKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBvYmpfZWxmX2xpbmUgUEFSQU1TICgoaW50KSk7Ci12b2lkIG9ial9lbGZfdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfc2l6ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfdHlwZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfaWRlbnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3dlYWsgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX2xvY2FsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9zeW12ZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3Z0YWJsZV9pbmhlcml0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl92dGFibGVfZW50cnkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3N1YnNlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3BvcHNlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBjb25zdCBwc2V1ZG9fdHlwZVMgZWxmX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJjb21tIiwgb2JqX2VsZl9jb21tb24sIDB9LAotICB7ImNvbW1vbiIsIG9ial9lbGZfY29tbW9uLCAxfSwKLSAgeyJpZGVudCIsIG9ial9lbGZfaWRlbnQsIDB9LAotICB7ImxvY2FsIiwgb2JqX2VsZl9sb2NhbCwgMH0sCi0gIHsicHJldmlvdXMiLCBvYmpfZWxmX3ByZXZpb3VzLCAwfSwKLSAgeyJzZWN0aW9uIiwgb2JqX2VsZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0aW9uLnMiLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAotICB7InNlY3QucyIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsicHVzaHNlY3Rpb24iLCBvYmpfZWxmX3NlY3Rpb24sIDF9LAotICB7InBvcHNlY3Rpb24iLCBvYmpfZWxmX3BvcHNlY3Rpb24sIDB9LAotICB7InNpemUiLCBvYmpfZWxmX3NpemUsIDB9LAotICB7InR5cGUiLCBvYmpfZWxmX3R5cGUsIDB9LAotICB7InZlcnNpb24iLCBvYmpfZWxmX3ZlcnNpb24sIDB9LAotICB7IndlYWsiLCBvYmpfZWxmX3dlYWssIDB9LAotCi0gIC8qIFRoZXNlIGFyZSB1c2VkIGZvciBzdGFicy1pbi1lbGYgY29uZmlndXJhdGlvbnMuICAqLwotICB7ImxpbmUiLCBvYmpfZWxmX2xpbmUsIDB9LAotCi0gIC8qIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIGhhbmRsZSBzeW1ib2wgdmVyc2lvbnMuICAqLwotICB7InN5bXZlciIsIG9ial9lbGZfc3ltdmVyLCAwfSwKLQotICAvKiBBIEdOVSBleHRlbnNpb24gdG8gY2hhbmdlIHN1YnNlY3Rpb24gb25seS4gICovCi0gIHsic3Vic2VjdGlvbiIsIG9ial9lbGZfc3Vic2VjdGlvbiwgMH0sCi0KLSAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGFpZCBpbiBnYXJiYWdlIGNvbGxlY3RpbmcgQysrIHZ0YWJsZXMuICAqLwotICB7InZ0YWJsZV9pbmhlcml0Iiwgb2JqX2VsZl92dGFibGVfaW5oZXJpdCwgMH0sCi0gIHsidnRhYmxlX2VudHJ5Iiwgb2JqX2VsZl92dGFibGVfZW50cnksIDB9LAotCi0gIC8qIFRoZXNlIGFyZSB1c2VkIGZvciBkd2FyZi4gKi8KLSAgeyIyYnl0ZSIsIGNvbnMsIDJ9LAotICB7IjRieXRlIiwgY29ucywgNH0sCi0gIHsiOGJ5dGUiLCBjb25zLCA4fSwKLQotICAvKiBXZSBuZWVkIHRvIHRyYXAgdGhlIHNlY3Rpb24gY2hhbmdpbmcgY2FsbHMgdG8gaGFuZGxlIC5wcmV2aW91cy4gICovCi0gIHsiZGF0YSIsIG9ial9lbGZfZGF0YSwgMH0sCi0gIHsidGV4dCIsIG9ial9lbGZfdGV4dCwgMH0sCi0KLSAgLyogRW5kIHNlbnRpbmVsLiAgKi8KLSAge05VTEwsIE5VTEwsIDB9LAotfTsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBlY29mZl9kZWJ1Z19wc2V1ZG9fdGFibGVbXSA9Ci17Ci0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICAvKiBDT0ZGIHN0eWxlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgRUNPRkYuIC5sbiBpcyBub3QgdXNlZDsgLmxvYwotICAgICBpcyB1c2VkIGluc3RlYWQuICAqLwotICB7ICJkZWYiLAllY29mZl9kaXJlY3RpdmVfZGVmLAkwIH0sCi0gIHsgImRpbSIsCWVjb2ZmX2RpcmVjdGl2ZV9kaW0sCTAgfSwKLSAgeyAiZW5kZWYiLAllY29mZl9kaXJlY3RpdmVfZW5kZWYsCTAgfSwKLSAgeyAiZmlsZSIsCWVjb2ZmX2RpcmVjdGl2ZV9maWxlLAkwIH0sCi0gIHsgInNjbCIsCWVjb2ZmX2RpcmVjdGl2ZV9zY2wsCTAgfSwKLSAgeyAidGFnIiwJZWNvZmZfZGlyZWN0aXZlX3RhZywJMCB9LAotICB7ICJ2YWwiLAllY29mZl9kaXJlY3RpdmVfdmFsLAkwIH0sCi0KLSAgLyogQ09GRiBkZWJ1Z2dpbmcgcmVxdWlyZXMgcHNldWRvLW9wcyAuc2l6ZSBhbmQgLnR5cGUsIGJ1dCBFTEYKLSAgICAgYWxyZWFkeSBoYXMgbWVhbmluZ3MgZm9yIHRob3NlLiAgV2UgdXNlIC5lc2l6ZSBhbmQgLmV0eXBlCi0gICAgIGluc3RlYWQuICBUaGVzZSBhcmUgb25seSBnZW5lcmF0ZWQgYnkgZ2NjIGFueWhvdy4gICovCi0gIHsgImVzaXplIiwJZWNvZmZfZGlyZWN0aXZlX3NpemUsCTAgfSwKLSAgeyAiZXR5cGUiLAllY29mZl9kaXJlY3RpdmVfdHlwZSwJMCB9LAotCi0gIC8qIEVDT0ZGIHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHsgImJlZ2luIiwJZWNvZmZfZGlyZWN0aXZlX2JlZ2luLAkwIH0sCi0gIHsgImJlbmQiLAllY29mZl9kaXJlY3RpdmVfYmVuZCwJMCB9LAotICB7ICJlbmQiLAllY29mZl9kaXJlY3RpdmVfZW5kLAkwIH0sCi0gIHsgImVudCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbnQsCTAgfSwKLSAgeyAiZm1hc2siLAllY29mZl9kaXJlY3RpdmVfZm1hc2ssCTAgfSwKLSAgeyAiZnJhbWUiLAllY29mZl9kaXJlY3RpdmVfZnJhbWUsCTAgfSwKLSAgeyAibG9jIiwJZWNvZmZfZGlyZWN0aXZlX2xvYywJMCB9LAotICB7ICJtYXNrIiwJZWNvZmZfZGlyZWN0aXZlX21hc2ssCTAgfSwKLQotICAvKiBPdGhlciBFQ09GRiBkaXJlY3RpdmVzLiAgKi8KLSAgeyAiZXh0ZXJuIiwJZWNvZmZfZGlyZWN0aXZlX2V4dGVybiwJMCB9LAotCi0gIC8qIFRoZXNlIGFyZSB1c2VkIG9uIElyaXguICBJIGRvbid0IGtub3cgaG93IHRvIGltcGxlbWVudCB0aGVtLiAgKi8KLSAgeyAiYWxpYXMiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAiYmduYiIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJlbmRiIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImxhYiIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJub2FsaWFzIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgInZlcnN0YW1wIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgInZyZWciLAlzX2lnbm9yZSwJCTAgfSwKLSNlbmRpZgotCi0gIHtOVUxMLCBOVUxMLCAwfQkJCS8qIGVuZCBzZW50aW5lbCAqLwotfTsKLQotI3VuZGVmIE5PX1JFTE9DCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN0YXJ0cy4gICovCi0KLXZvaWQKLWVsZl9iZWdpbiAoKQotewotICAvKiBBZGQgc3ltYm9scyBmb3IgdGhlIGtub3duIHNlY3Rpb25zIHRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwKLQkJCQkJCQkJVEVYVF9TRUNUSU9OX05BTUUpKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LAotCQkJCQkJCQlEQVRBX1NFQ1RJT05fTkFNRSkpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCQkJCUJTU19TRUNUSU9OX05BTUUpKSk7Ci19Ci0KLXZvaWQKLWVsZl9wb3BfaW5zZXJ0ICgpCi17Ci0gIHBvcF9pbnNlcnQgKGVsZl9wc2V1ZG9fdGFibGUpOwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIHBvcF9pbnNlcnQgKGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZSk7Ci19Ci0KLXN0YXRpYyBiZmRfdm1hCi1lbGZfc19nZXRfc2l6ZSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBTX0dFVF9TSVpFIChzeW0pOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX3Nfc2V0X3NpemUgKHN5bSwgc3opCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgYmZkX3ZtYSBzejsKLXsKLSAgU19TRVRfU0laRSAoc3ltLCBzeik7Ci19Ci0KLXN0YXRpYyBiZmRfdm1hCi1lbGZfc19nZXRfYWxpZ24gKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gU19HRVRfQUxJR04gKHN5bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfc19zZXRfYWxpZ24gKHN5bSwgYWxpZ24pCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgYmZkX3ZtYSBhbGlnbjsKLXsKLSAgU19TRVRfQUxJR04gKHN5bSwgYWxpZ24pOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgKGRlc3QsIHNyYykKLSAgICAgc3ltYm9sUyAqZGVzdCwgKnNyYzsKLXsKLSAgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgKGRlc3QsIHNyYyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWVsZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpOwotfQotCi12b2lkCi1lbGZfZmlsZV9zeW1ib2wgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbmV3IChzLCBhYnNvbHV0ZV9zZWN0aW9uLCAodmFsdWVUKSAwLCAoc3RydWN0IGZyYWcgKikgMCk7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7Ci0KLSAgaWYgKHN5bWJvbF9yb290UCAhPSBzeW0pCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9pbnNlcnQgKHN5bSwgc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSNpZmRlZiBERUJVRwotICAgICAgdmVyaWZ5X3N5bWJvbF9jaGFpbiAoc3ltYm9sX3Jvb3RQLCBzeW1ib2xfbGFzdFApOwotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBlY29mZl9uZXdfZmlsZSAocyk7Ci0jZW5kaWYKLX0KLQotdm9pZAotb2JqX2VsZl9jb21tb24gKGlzX2NvbW1vbikKLSAgICAgaW50IGlzX2NvbW1vbjsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBpbnQgdGVtcCwgc2l6ZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgaW50IGhhdmVfYWxpZ247Ci0KLSAgaWYgKGZsYWdfbXJpICYmIGlzX2NvbW1vbikKLSAgICB7Ci0gICAgICBzX21yaV9jb21tb24gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHNpemUgPSB0ZW1wOwotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSBzaXplKQotCXsKLQkgIGFzX3dhcm4gKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIpLAotCQkgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZSk7Ci0JfQotICAgIH0KLSAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgaGF2ZV9hbGlnbiA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYXZlX2FsaWduID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgaWYgKCEgaGF2ZV9hbGlnbiB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICBpZiAoISBoYXZlX2FsaWduKQotCXRlbXAgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmICh0ZW1wIDwgMCkKLQkgICAgewotCSAgICAgIHRlbXAgPSAwOwotCSAgICAgIGFzX3dhcm4gKF8oIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIpKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsKQotCXsKLQkgIHNlZ1Qgb2xkX3NlYzsKLQkgIGludCBvbGRfc3Vic2VjOwotCSAgY2hhciAqcGZyYWc7Ci0JICBpbnQgYWxpZ247Ci0KLQkvKiBhbGxvY2F0ZV9ic3M6ICovCi0JICBvbGRfc2VjID0gbm93X3NlZzsKLQkgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotCSAgaWYgKHRlbXApCi0JICAgIHsKLQkgICAgICAvKiBjb252ZXJ0IHRvIGEgcG93ZXIgb2YgMiBhbGlnbm1lbnQgKi8KLQkgICAgICBmb3IgKGFsaWduID0gMDsgKHRlbXAgJiAxKSA9PSAwOyB0ZW1wID4+PSAxLCArK2FsaWduKTsKLQkgICAgICBpZiAodGVtcCAhPSAxKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBhbGlnbiA9IDA7Ci0JICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwKLQkJCSAgICAob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7Ci0JICAqcGZyYWcgPSAwOwotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JYWxsb2NhdGVfY29tbW9uOgotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotCSAgU19TRVRfQUxJR04gKHN5bWJvbFAsIHRlbXApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSB1c2UgdGhlIGRvdCwgc29tZSBkb24ndC4gIENhbiB3ZSBnZXQgc29tZSBjb25zaXN0ZW5jeT8/ICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJic3NcIiIsIDQpCi0JICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhXCIiLCA1KSkKLQl7Ci0JICB3aGlsZSAoKi0taW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQkgICAgOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKLQk7Ci0gICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKLSAgICB9Ci0KLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2xvY2FsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwgPSAxOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsID0gMTsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyBzZWdUIHByZXZpb3VzX3NlY3Rpb247Ci1zdGF0aWMgaW50IHByZXZpb3VzX3N1YnNlY3Rpb247Ci0KLXN0cnVjdCBzZWN0aW9uX3N0YWNrCi17Ci0gIHN0cnVjdCBzZWN0aW9uX3N0YWNrICpuZXh0OwotICBzZWdUIHNlZywgcHJldl9zZWc7Ci0gIGludCBzdWJzZWcsIHByZXZfc3Vic2VnOwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX3N0YWNrICpzZWN0aW9uX3N0YWNrOwotCi0KLS8qIEhhbmRsZSB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBjb2RlIHN1cHBvcnRzIHR3byBkaWZmZXJlbnQKLSAgIHN5bnRheGVzLgotCi0gICBUaGUgZmlyc3QgaXMgZm91bmQgb24gU29sYXJpcywgYW5kIGxvb2tzIGxpa2UKLSAgICAgICAuc2VjdGlvbiAiLnNlYzEiLCNhbGxvYywjZXhlY2luc3RyLCN3cml0ZQotICAgSGVyZSB0aGUgbmFtZXMgYWZ0ZXIgJyMnIGFyZSB0aGUgU0hGXyogZmxhZ3MgdG8gdHVybiBvbiBmb3IgdGhlCi0gICBzZWN0aW9uLiAgSSdtIG5vdCBzdXJlIGhvdyBpdCBkZXRlcm1pbmVzIHRoZSBTSFRfKiB0eXBlIChCRkQKLSAgIGRvZXNuJ3QgcmVhbGx5IGdpdmUgdXMgY29udHJvbCBvdmVyIHRoZSB0eXBlLCBhbnlob3cpLgotCi0gICBUaGUgc2Vjb25kIGZvcm1hdCBpcyBmb3VuZCBvbiBVbml4V2FyZSwgYW5kIHByb2JhYmx5IG1vc3QgU1ZSNAotICAgbWFjaGluZXMsIGFuZCBsb29rcyBsaWtlCi0gICAgICAgLnNlY3Rpb24gLnNlYzEsImEiLEBwcm9nYml0cwotICAgVGhlIHF1b3RlZCBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNvbWJpbmF0aW9uIG9mIGEsIHcsIHgsIGFuZAotICAgcmVwcmVzZW50cyB0aGUgU0hGXyogZmxhZ3MgdG8gdHVybiBvbiBmb3IgdGhlIHNlY3Rpb24uICBUaGUgc3RyaW5nCi0gICBiZWdpbm5pbmcgd2l0aCAnQCcgY2FuIGJlIHByb2diaXRzIG9yIG5vYml0cy4gIFRoZXJlIHNob3VsZCBiZQotICAgb3RoZXIgcG9zc2liaWxpdGllcywgYnV0IEkgZG9uJ3Qga25vdyB3aGF0IHRoZXkgYXJlLiAgSW4gYW55IGNhc2UsCi0gICBCRkQgZG9lc24ndCByZWFsbHkgbGV0IHVzIHNldCB0aGUgc2VjdGlvbiB0eXBlLiAgKi8KLQotLyogQ2VydGFpbiBuYW1lZCBzZWN0aW9ucyBoYXZlIHBhcnRpY3VsYXIgZGVmaW5lZCB0eXBlcywgbGlzdGVkIG9uIHAuCi0gICA0LTE5IG9mIHRoZSBBQkkuICAqLwotc3RydWN0IHNwZWNpYWxfc2VjdGlvbgotewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgdHlwZTsKLSAgaW50IGF0dHJpYnV0ZXM7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNwZWNpYWxfc2VjdGlvbiBjb25zdCBzcGVjaWFsX3NlY3Rpb25zW10gPQotewotICB7ICIuYnNzIiwJU0hUX05PQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFCQl9LAotICB7ICIuY29tbWVudCIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuZGF0YSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFCQl9LAotICB7ICIuZGF0YTEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmRlYnVnIiwJU0hUX1BST0dCSVRTLAkwCQkJCX0sCi0gIHsgIi5maW5pIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfRVhFQ0lOU1RSCX0sCi0gIHsgIi5pbml0IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfRVhFQ0lOU1RSCX0sCi0gIHsgIi5saW5lIiwJU0hUX1BST0dCSVRTLAkwCQkJCX0sCi0gIHsgIi5ub3RlIiwJU0hUX05PVEUsCTAJCQkJfSwKLSAgeyAiLnJvZGF0YSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLnJvZGF0YTEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQwkJCX0sCi0gIHsgIi50ZXh0IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfRVhFQ0lOU1RSCX0sCi0KLSNpZmRlZiBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUwotICBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUwotI2VuZGlmCi0KLSNpZiAwCi0gIC8qIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBuYW1lcyBhcmUgc3BlY2lhbCwgYnV0IHRoZXkgY2FuIG5vdAotICAgICByZWFzb25hYmx5IGFwcGVhciBpbiBhc3NlbWJsZXIgY29kZS4gIFNvbWUgb2YgdGhlIGF0dHJpYnV0ZXMgYXJlCi0gICAgIHByb2Nlc3NvciBkZXBlbmRlbnQuICAqLwotICB7ICIuZHluYW1pYyIsCVNIVF9EWU5BTUlDLAlTSEZfQUxMT0MgLyogKyBTSEZfV1JJVEUgKi8gCX0sCi0gIHsgIi5keW5zdHIiLAlTSFRfU1RSVEFCLAlTSEZfQUxMT0MJCQl9LAotICB7ICIuZHluc3ltIiwJU0hUX0RZTlNZTSwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmdvdCIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuaGFzaCIsCVNIVF9IQVNILAlTSEZfQUxMT0MJCQl9LAotICB7ICIuaW50ZXJwIiwJU0hUX1BST0dCSVRTLAkvKiBTSEZfQUxMT0MgKi8JCQl9LAotICB7ICIucGx0IiwJU0hUX1BST0dCSVRTLAkwCQkJCX0sCi0gIHsgIi5zaHN0cnRhYiIsU0hUX1NUUlRBQiwJMAkJCQl9LAotICB7ICIuc3RydGFiIiwJU0hUX1NUUlRBQiwJLyogU0hGX0FMTE9DICovCQkJfSwKLSAgeyAiLnN5bXRhYiIsCVNIVF9TWU1UQUIsCS8qIFNIRl9BTExPQyAqLwkJCX0sCi0jZW5kaWYKLQotICB7IE5VTEwsCTAsCQkwCQkJCX0KLX07Ci0KLXZvaWQKLW9ial9lbGZfY2hhbmdlX3NlY3Rpb24gKG5hbWUsIHR5cGUsIGF0dHIsIHB1c2gpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCB0eXBlLCBhdHRyLCBwdXNoOwotewotICBpbnQgbmV3X3NlYzsKLSAgc2VnVCBzZWM7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIC8qIFN3aXRjaCB0byB0aGUgc2VjdGlvbiwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKHB1c2gpCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fc3RhY2sgKmVsdDsKLSAgICAgIGVsdCA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fc3RhY2spKTsKLSAgICAgIGVsdC0+bmV4dCA9IHNlY3Rpb25fc3RhY2s7Ci0gICAgICBlbHQtPnNlZyA9IG5vd19zZWc7Ci0gICAgICBlbHQtPnByZXZfc2VnID0gcHJldmlvdXNfc2VjdGlvbjsKLSAgICAgIGVsdC0+c3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGVsdC0+cHJldl9zdWJzZWcgPSBwcmV2aW91c19zdWJzZWN0aW9uOwotICAgICAgc2VjdGlvbl9zdGFjayA9IGVsdDsKLSAgICB9Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLQotICBuZXdfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgbmFtZSkgPT0gTlVMTDsKLSAgc2VjID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0KLSAgaWYgKG5ld19zZWMpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBzeW1ib2xTICpzZWNzeW07Ci0gICAgICBpbnQgaTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgaXMgb25lIG9mIHRoZSBzcGVjaWFsIHNlY3Rpb25zLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IHNwZWNpYWxfc2VjdGlvbnNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0gICAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHNwZWNpYWxfc2VjdGlvbnNbaV0ubmFtZSkgPT0gMCkKLSAgICAgICAgICB7Ci0JICAgIGlmICh0eXBlID09IFNIVF9OVUxMKQotCSAgICAgIHR5cGUgPSBzcGVjaWFsX3NlY3Rpb25zW2ldLnR5cGU7Ci0JICAgIGVsc2UgaWYgKHR5cGUgIT0gc3BlY2lhbF9zZWN0aW9uc1tpXS50eXBlKQotCSAgICAgIGFzX3dhcm4gKF8oIlNldHRpbmcgaW5jb3JyZWN0IHNlY3Rpb24gdHlwZSBmb3IgJXMiKSwgbmFtZSk7Ci0KLQkgICAgaWYgKChhdHRyICZ+IHNwZWNpYWxfc2VjdGlvbnNbaV0uYXR0cmlidXRlcykgIT0gMCkKLQkgICAgICB7Ci0JICAgICAgICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIHdlIHBlcm1pdCBhIC5ub3RlIHNlY3Rpb24gdG8gYmUKLQkJICAgYWxsb2NhdGFibGUuICBJZiB0aGUgbGlua2VyIHNlZXMgYW4gYWxsb2NhdGVhYmxlIC5ub3RlCi0JCSAgIHNlY3Rpb24sIGl0IHdpbGwgY3JlYXRlIGEgUFRfTk9URSBzZWdtZW50IGluIHRoZSBvdXRwdXQKLQkJICAgZmlsZS4gICovCi0JCWlmIChzdHJjbXAgKG5hbWUsICIubm90ZSIpICE9IDAKLQkJICAgIHx8IGF0dHIgIT0gU0hGX0FMTE9DKQotCQkgIGFzX3dhcm4gKF8oIlNldHRpbmcgaW5jb3JyZWN0IHNlY3Rpb24gYXR0cmlidXRlcyBmb3IgJXMiKSwKLQkJCSAgIG5hbWUpOwotCSAgICAgIH0KLQkgICAgYXR0ciB8PSBzcGVjaWFsX3NlY3Rpb25zW2ldLmF0dHJpYnV0ZXM7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0gICAgICAvKiBDb252ZXJ0IEVMRiB0eXBlIGFuZCBmbGFncyB0byBCRkQgZmxhZ3MuICAqLwotICAgICAgZmxhZ3MgPSAoU0VDX1JFTE9DCi0JICAgICAgIHwgKChhdHRyICYgU0hGX1dSSVRFKSA/IDAgOiBTRUNfUkVBRE9OTFkpCi0JICAgICAgIHwgKChhdHRyICYgU0hGX0FMTE9DKSA/IFNFQ19BTExPQyA6IDApCi0JICAgICAgIHwgKCgoYXR0ciAmIFNIRl9BTExPQykgJiYgdHlwZSAhPSBTSFRfTk9CSVRTKSA/IFNFQ19MT0FEIDogMCkKLQkgICAgICAgfCAoKGF0dHIgJiBTSEZfRVhFQ0lOU1RSKSA/IFNFQ19DT0RFIDogMCkpOwotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2ZsYWdzCi0gICAgICBmbGFncyA9IG1kX2VsZl9zZWN0aW9uX2ZsYWdzIChmbGFncywgYXR0ciwgdHlwZSk7Ci0jZW5kaWYKLQotICAgICAgLyogUHJldmVudCBTRUNfSEFTX0NPTlRFTlRTIGZyb20gYmVpbmcgaW5hZHZlcnRlbnRseSBzZXQuICAqLwotICAgICAgaWYgKHR5cGUgPT0gU0hUX05PQklUUykKLSAgICAgICAgc2VnX2luZm8gKHNlYyktPmJzcyA9IDE7Ci0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKTsKLQotICAgICAgLyogQWRkIGEgc3ltYm9sIGZvciB0aGlzIHNlY3Rpb24gdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzZWNzeW0gPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gICAgICBpZiAoc2Vjc3ltICE9IE5VTEwpCi0Jc3ltYm9sX3NldF9iZmRzeW0gKHNlY3N5bSwgc2VjLT5zeW1ib2wpOwotICAgICAgZWxzZQotICAgICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoc2VjKSk7Ci0gICAgfQotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgICAgIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLWludAotb2JqX2VsZl9wYXJzZV9zZWN0aW9uX2xldHRlcnMgKHN0ciwgbGVuKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIGludCBhdHRyID0gMDsKLQotICB3aGlsZSAobGVuID4gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpzdHIpCi0JewotCWNhc2UgJ2EnOgotCSAgYXR0ciB8PSBTSEZfQUxMT0M7Ci0JICBicmVhazsKLQljYXNlICd3JzoKLQkgIGF0dHIgfD0gU0hGX1dSSVRFOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBhdHRyIHw9IFNIRl9FWEVDSU5TVFI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgewotCSAgICBjaGFyICpiYWRfbXNnID0gXygiVW5yZWNvZ25pemVkIC5zZWN0aW9uIGF0dHJpYnV0ZTogd2FudCBhLHcseCIpOwotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2xldHRlcgotCSAgICBpbnQgbWRfYXR0ciA9IG1kX2VsZl9zZWN0aW9uX2xldHRlciAoKnN0ciwgJmJhZF9tc2cpOwotCSAgICBpZiAobWRfYXR0ciA+PSAwKQotCSAgICAgIGF0dHIgfD0gbWRfYXR0cjsKLQkgICAgZWxzZQotI2VuZGlmCi0JICAgICAgewotCQlhc193YXJuIChiYWRfbXNnKTsKLQkJYXR0ciA9IC0xOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIHN0cisrLCBsZW4tLTsKLSAgICB9Ci0KLSAgcmV0dXJuIGF0dHI7Ci19Ci0KLWludAotb2JqX2VsZl9zZWN0aW9uX3dvcmQgKHN0ciwgbGVuKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIGlmIChsZW4gPT0gNSAmJiBzdHJuY21wIChzdHIsICJ3cml0ZSIsIDUpID09IDApCi0gICAgcmV0dXJuIFNIRl9XUklURTsKLSAgaWYgKGxlbiA9PSA1ICYmIHN0cm5jbXAgKHN0ciwgImFsbG9jIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gU0hGX0FMTE9DOwotICBpZiAobGVuID09IDkgJiYgc3RybmNtcCAoc3RyLCAiZXhlY2luc3RyIiwgOSkgPT0gMCkKLSAgICByZXR1cm4gU0hGX0VYRUNJTlNUUjsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX3dvcmQKLSAgewotICAgIGludCBtZF9hdHRyID0gbWRfZWxmX3NlY3Rpb25fd29yZCAoc3RyLCBsZW4pOwotICAgIGlmIChtZF9hdHRyID49IDApCi0gICAgICByZXR1cm4gbWRfYXR0cjsKLSAgfQotI2VuZGlmCi0KLSAgYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIHNlY3Rpb24gYXR0cmlidXRlIikpOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1vYmpfZWxmX3NlY3Rpb25fdHlwZSAoc3RyLCBsZW4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgaWYgKGxlbiA9PSA4ICYmIHN0cm5jbXAgKHN0ciwgInByb2diaXRzIiwgOCkgPT0gMCkKLSAgICByZXR1cm4gU0hUX1BST0dCSVRTOwotICBpZiAobGVuID09IDYgJiYgc3RybmNtcCAoc3RyLCAibm9iaXRzIiwgNikgPT0gMCkKLSAgICByZXR1cm4gU0hUX05PQklUUzsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX3R5cGUKLSAgewotICAgIGludCBtZF90eXBlID0gbWRfZWxmX3NlY3Rpb25fdHlwZSAoc3RyLCBsZW4pOwotICAgIGlmIChtZF90eXBlID49IDApCi0gICAgICByZXR1cm4gbWRfdHlwZTsKLSAgfQotI2VuZGlmCi0KLSAgYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW9ial9lbGZfc2VjdGlvbiAocHVzaCkKLSAgICAgaW50IHB1c2g7Ci17Ci0gIGNoYXIgKm5hbWUsICpiZWcsICplbmQ7Ci0gIGludCB0eXBlLCBhdHRyLCBkdW1teTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciBtcmlfdHlwZTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgICAgIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICAgICAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgICAgIHNfbXJpX3NlY3QgKCZtcmlfdHlwZSk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICAgICAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBHZXQgbmFtZSBvZiBzZWN0aW9uLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0gICAgewotICAgICAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmZHVtbXkpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQl7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoMCA9PSBzdHJjaHIgKCJcblx0LDsgIiwgKmVuZCkpCi0JZW5kKys7Ci0gICAgICBpZiAoZW5kID09IGlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JICBhc193YXJuIChfKCJNaXNzaW5nIHNlY3Rpb24gbmFtZSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgIAotICAgICAgbmFtZSA9IHhtYWxsb2MgKGVuZCAtIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICAgbWVtY3B5IChuYW1lLCBpbnB1dF9saW5lX3BvaW50ZXIsIGVuZCAtIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBuYW1lW2VuZCAtIGlucHV0X2xpbmVfcG9pbnRlcl0gPSAnXDAnOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gZW5kOwotICAgIH0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIHR5cGUgPSBTSFRfTlVMTDsKLSAgYXR0ciA9IDA7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIC8qIFNraXAgdGhlIGNvbW1hLiAgKi8KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JewotCSAgYmVnID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZkdW1teSk7Ci0JICBpZiAoYmVnID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYXR0ciB8PSBvYmpfZWxmX3BhcnNlX3NlY3Rpb25fbGV0dGVycyAoYmVnLCBzdHJsZW4gKGJlZykpOwotCi0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBjaGFyIGM7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChjID09ICciJykKLQkJewotCQkgIGJlZyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmZHVtbXkpOwotCQkgIGlmIChiZWcgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIHR5cGUgPSBvYmpfZWxmX3NlY3Rpb25fdHlwZSAoYmVnLCBzdHJsZW4gKGJlZykpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoYyA9PSAnQCcgfHwgYyA9PSAnJScpCi0JCXsKLQkJICBiZWcgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgdHlwZSA9IG9ial9lbGZfc2VjdGlvbl90eXBlIChiZWcsIGlucHV0X2xpbmVfcG9pbnRlciAtIGJlZyk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgY2hhciBjOwotCi0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcjJykKLQkJewotCQkgIGFzX3dhcm4gKF8oIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmUgLSBjaGFyYWN0ZXIgZm9sbG93aW5nIG5hbWUgaXMgbm90ICcjJyIpKTsKLQkJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJlZyA9ICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotCSAgICAgIGF0dHIgfD0gb2JqX2VsZl9zZWN0aW9uX3dvcmQgKGJlZywgaW5wdXRfbGluZV9wb2ludGVyIC0gYmVnKTsKLQotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgfQotCSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIG9ial9lbGZfY2hhbmdlX3NlY3Rpb24gKG5hbWUsIHR5cGUsIGF0dHIsIHB1c2gpOwotfQotCi0vKiBDaGFuZ2UgdG8gdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotCi12b2lkCi1vYmpfZWxmX2RhdGEgKGkpCi0gICAgIGludCBpOwotewotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgcHJldmlvdXNfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotICBzX2RhdGEgKGkpOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLX0KLQotLyogQ2hhbmdlIHRvIHRoZSAudGV4dCBzZWN0aW9uLiAgKi8KLQotdm9pZAotb2JqX2VsZl90ZXh0IChpKQotICAgICBpbnQgaTsKLXsKLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc190ZXh0IChpKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3N1YnNlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgcHJldmlvdXNfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX3NldCAobm93X3NlZywgKHN1YnNlZ1QpIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLX0KLQotLyogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIHByb2Nlc3NvciBiYWNrZW5kcyBpZiB0aGV5IGNoYW5nZQotICAgc2VjdGlvbnMuICAqLwotCi12b2lkCi1vYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCkKLXsKLSAgcHJldmlvdXNfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotfQotCi12b2lkCi1vYmpfZWxmX3ByZXZpb3VzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnVCBuZXdfc2VjdGlvbjsKLSAgaW50IG5ld19zdWJzZWN0aW9uOwotCi0gIGlmIChwcmV2aW91c19zZWN0aW9uID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucHJldmlvdXMgd2l0aG91dCBjb3JyZXNwb25kaW5nIC5zZWN0aW9uOyBpZ25vcmVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgbmV3X3NlY3Rpb24gPSBwcmV2aW91c19zZWN0aW9uOwotICBuZXdfc3Vic2VjdGlvbiA9IHByZXZpb3VzX3N1YnNlY3Rpb247Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc3Vic2VnX3NldCAobmV3X3NlY3Rpb24sIG5ld19zdWJzZWN0aW9uKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3BvcHNlY3Rpb24gKHh4eCkKLSAgICAgaW50IHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqdG9wID0gc2VjdGlvbl9zdGFjazsKLQotICBpZiAodG9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucG9wc2VjdGlvbiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgLnB1c2hzZWN0aW9uOyBpZ25vcmVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgc2VjdGlvbl9zdGFjayA9IHRvcC0+bmV4dDsKLSAgcHJldmlvdXNfc2VjdGlvbiA9IHRvcC0+cHJldl9zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSB0b3AtPnByZXZfc3Vic2VnOwotICBzdWJzZWdfc2V0ICh0b3AtPnNlZywgdG9wLT5zdWJzZWcpOwotICBmcmVlICh0b3ApOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEFzc3VtZSBkZWxpbWl0ZXIgaXMgcGFydCBvZiBleHByZXNzaW9uLiAgQlNENC4yIGFzIGZhaWxzIHdpdGgKLSAgICAgZGVsaWdodGZ1bCBidWcsIHNvIHdlIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIC5zeW12ZXIgcHNldWRvLW9wLCB3aGljaCBpcyB1c2VkIHRvIHNwZWNpZnkgYQotICAgc3ltYm9sIHZlcnNpb24uICBUaGUgc3ludGF4IGlzIGBgLnN5bXZlciBOQU1FLFNZTVZFUk5BTUUnJy4KLSAgIFNZTVZFUk5BTUUgbWF5IGNvbnRhaW4gRUxGX1ZFUl9DSFIgKCdAJykgY2hhcmFjdGVycy4gIFRoaXMKLSAgIHBzZXVkby1vcCBjYXVzZXMgdGhlIGFzc2VtYmxlciB0byBlbWl0IGEgc3ltYm9sIG5hbWVkIFNZTVZFUk5BTUUKLSAgIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHN5bWJvbCBOQU1FLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfc3ltdmVyIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+dmVyc2lvbmVkX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm11bHRpcGxlIC5zeW12ZXIgZGlyZWN0aXZlcyBmb3Igc3ltYm9sIGAlcyciKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChjICE9IEVMRl9WRVJfQ0hSKQotCWJyZWFrOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLSAgICB9Ci0KLSAgc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKHN0cmNociAoc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lLCBFTEZfVkVSX0NIUikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmVyc2lvbiBuYW1lIGluIGAlcycgZm9yIHN5bWJvbCBgJXMnIiksCi0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lLCBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9pbmhlcml0IHBzZXVkby1vcCwgd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZQotICAgdG8gdGhlIGxpbmtlciB0aGUgaGllcmFyY2h5IGluIHdoaWNoIGEgcGFydGljdWxhciB0YWJsZSByZXNpZGVzLiAgVGhlCi0gICBzeW50YXggaXMgIi52dGFibGVfaW5oZXJpdCBDSElMRE5BTUUsIFBBUkVOVE5BTUUiLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdnRhYmxlX2luaGVyaXQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpjbmFtZSwgKnBuYW1lOwotICBzeW1ib2xTICpjc3ltLCAqcHN5bTsKLSAgY2hhciBjLCBiYWQgPSAwOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBjc3ltID0gc3ltYm9sX2ZpbmQgKGNuYW1lKTsKLQotICAvKiBHQ0ZJWE1FOiBzaG91bGQgY2hlY2sgdGhhdCB3ZSBkb24ndCBoYXZlIHR3byAudnRhYmxlX2luaGVyaXRzIGZvcgotICAgICB0aGUgc2FtZSBjaGlsZCBzeW1ib2wuICBBbHNvLCB3ZSBjYW4gY3VycmVudGx5IG9ubHkgZG8gdGhpcyBpZiB0aGUKLSAgICAgY2hpbGQgc3ltYm9sIGlzIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBwbGFjZWQgaW4gYSBmcmFnbWVudC4gICovCi0KLSAgaWYgKGNzeW0gPT0gTlVMTCB8fCBzeW1ib2xfZ2V0X2ZyYWcgKGNzeW0pID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkICgiZXhwZWN0ZWQgYCVzJyB0byBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIC52dGFibGVfaW5oZXJpdCIsCi0JICAgICAgY25hbWUpOwotICAgICAgYmFkID0gMTsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkICgiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAudnRhYmxlX2luaGVyaXQiKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnCi0gICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcMCcKLQkgIHx8IGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMV0pKSkKLSAgICB7Ci0gICAgICBwc3ltID0gc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBwc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAocG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGJhZCkKLSAgICByZXR1cm47Ci0KLSAgYXNzZXJ0IChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGNzeW0pLT5YX29wID09IE9fY29uc3RhbnQpOwotICBmaXhfbmV3IChzeW1ib2xfZ2V0X2ZyYWcgKGNzeW0pLAotCSAgIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoY3N5bSktPlhfYWRkX251bWJlciwgMCwgcHN5bSwgMCwgMCwKLQkgICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQpOwotfQotICAKLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9lbnRyeSBwc2V1ZG8tb3AsIHdoaWNoIGlzIHVzZWQgdG8gaW5kaWNhdGUKLSAgIHRvIHRoZSBsaW5rZXIgdGhhdCBhIHZ0YWJsZSBzbG90IHdhcyB1c2VkLiAgVGhlIHN5bnRheCBpcwotICAgIi52dGFibGVfZW50cnkgdGFibGVuYW1lLCBvZmZzZXQiLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdnRhYmxlX2VudHJ5IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgc3ltYm9sUyAqc3ltOwotICBvZmZzZXRUIG9mZnNldDsKLSAgY2hhciBjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKCJleHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIGluIC52dGFibGVfZW50cnkiKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZml4X25ldyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMCwgc3ltLCBvZmZzZXQsIDAsCi0JICAgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9yZWFkX2JlZ2luX2hvb2sgKCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfc3kgKnN5X29iajsKLQotICBzeV9vYmogPSBzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCk7Ci0gIHN5X29iai0+c2l6ZSA9IE5VTEw7Ci0gIHN5X29iai0+dmVyc2lvbmVkX25hbWUgPSBOVUxMOwotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotb2JqX2VsZl92ZXJzaW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGNoYXIgY2g7Ci0gIGNoYXIgKnA7Ci0gIGFzZWN0aW9uICpzZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIEVsZl9JbnRlcm5hbF9Ob3RlIGlfbm90ZTsKLSAgRWxmX0V4dGVybmFsX05vdGUgZV9ub3RlOwotICBhc2VjdGlvbiAqbm90ZV9zZWNwID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGludCBpLCBsZW47Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCInKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKiAtPiAxc3QgY2hhciBvZiBzdHJpbmcuICovCi0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLSAgICAgICooaW5wdXRfbGluZV9wb2ludGVyIC0gMSkgPSAnXDAnOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIC8qIGNyZWF0ZSB0aGUgLm5vdGUgc2VjdGlvbiAqLwotCi0gICAgICBub3RlX3NlY3AgPSBzdWJzZWdfbmV3ICgiLm5vdGUiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LAotCQkJICAgICBub3RlX3NlY3AsCi0JCQkgICAgIFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkpOwotCi0gICAgICAvKiBwcm9jZXNzIHRoZSB2ZXJzaW9uIHN0cmluZyAqLwotCi0gICAgICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotCi0gICAgICBpX25vdGUubmFtZXN6ID0gKChsZW4gKyAxKSArIDMpICYgfjM7IC8qIHJvdW5kIHRoaXMgdG8gd29yZCBib3VuZGFyeSAqLwotICAgICAgaV9ub3RlLmRlc2NzeiA9IDA7CS8qIG5vIGRlc2NyaXB0aW9uICovCi0gICAgICBpX25vdGUudHlwZSA9IE5UX1ZFUlNJT047Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS5uYW1lc3opKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLm5hbWVzeiwgNCk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS5kZXNjc3opKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLmRlc2NzeiwgNCk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS50eXBlKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS50eXBlLCA0KTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCXsKLQkgIGNoID0gKihuYW1lICsgaSk7Ci0JICB7Ci0JICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoY2gpOwotCSAgfQotCX0KLSAgICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICpwID0gMDsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBgJXMnIGluIC5zaXplIGRpcmVjdGl2ZSIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZXhwcmVzc2lvbiBpbiAuc2l6ZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBleHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gICpwID0gMDsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgU19TRVRfU0laRSAoc3ltLCBleHAuWF9hZGRfbnVtYmVyKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplID0KLQkoZXhwcmVzc2lvblMgKikgeG1hbGxvYyAoc2l6ZW9mIChleHByZXNzaW9uUykpOwotICAgICAgKnN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplID0gZXhwOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBFTEYgLnR5cGUgcHNldWRvLW9wLiAgVGhpcyBzZXRzIHRoZSB0eXBlIG9mIGEgc3ltYm9sLgotICAgVGhlcmUgYXJlIGZvdXIgc3ludGF4ZXM6Ci0gICAKLSAgIFRoZSBmaXJzdCAodXNlZCBvbiBTb2xhcmlzKSBpcwotICAgICAgIC50eXBlIFNZTSwjZnVuY3Rpb24KLSAgIFRoZSBzZWNvbmQgKHVzZWQgb24gVW5peFdhcmUpIGlzCi0gICAgICAgLnR5cGUgU1lNLEBmdW5jdGlvbgotICAgVGhlIHRoaXJkIChyZXBvcnRlZGx5IHRvIGJlIHVzZWQgb24gSXJpeCA2LjApIGlzCi0gICAgICAgLnR5cGUgU1lNIFNUVF9GVU5DCi0gICBUaGUgZm91cnRoICh1c2VkIG9uIE5ldEJTRC9Bcm0gYW5kIExpbnV4L0FSTSkgaXMKLSAgICAgICAudHlwZSBTWU0sJWZ1bmN0aW9uCi0gICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBpbnQgdHlwZTsKLSAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICggICAqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJwotICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcKLSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyUnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHR5cGVuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgdHlwZSA9IDA7Ci0gIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAiZnVuY3Rpb24iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHR5cGVuYW1lLCAiU1RUX0ZVTkMiKSA9PSAwKQotICAgIHR5cGUgPSBCU0ZfRlVOQ1RJT047Ci0gIGVsc2UgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJvYmplY3QiKSA9PSAwCi0JICAgfHwgc3RyY21wICh0eXBlbmFtZSwgIlNUVF9PQkpFQ1QiKSA9PSAwKQotICAgIHR5cGUgPSBCU0ZfT0JKRUNUOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCJpZ25vcmluZyB1bnJlY29nbml6ZWQgc3ltYm9sIHR5cGUgXCIlc1wiIiksIHR5cGVuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gdHlwZTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9pZGVudCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0YXRpYyBzZWdUIGNvbW1lbnRfc2VjdGlvbjsKLSAgc2VnVCBvbGRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBvbGRfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGlmICghY29tbWVudF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjb21tZW50X3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLmNvbW1lbnQiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBjb21tZW50X3NlY3Rpb24sCi0JCQkgICAgIFNFQ19SRUFET05MWSB8IFNFQ19IQVNfQ09OVEVOVFMpOwotICAgICAgcCA9IGZyYWdfbW9yZSAoMSk7Ci0gICAgICAqcCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgc3Vic2VnX3NldCAoY29tbWVudF9zZWN0aW9uLCAwKTsKLSAgc3RyaW5nZXIgKDEpOwotICBzdWJzZWdfc2V0IChvbGRfc2VjdGlvbiwgb2xkX3N1YnNlY3Rpb24pOwotfQotCi0jaWZkZWYgSU5JVF9TVEFCX1NFQ1RJT04KLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWJzIHNlY3Rpb24gaXMgc3BlY2lhbC4gICovCi0KLXZvaWQKLW9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnN0YWJzdHJfbmFtZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBGb3JjZSB0aGUgc2VjdGlvbiB0byBhbGlnbiB0byBhIGxvbmd3b3JkIGJvdW5kYXJ5LiAgV2l0aG91dCB0aGlzLAotICAgICBVbml4V2FyZSBhciBjcmFzaGVzLiAgKi8KLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIDIpOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoaXMgZmlyc3Qgc3ltYm9sLiAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIC8qIFplcm8gaXQgb3V0LiAqLwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdGFic3RyX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VnbWVudF9uYW1lIChzZWcpKSArIDQpOwotICBzdHJjcHkgKHN0YWJzdHJfbmFtZSwgc2VnbWVudF9uYW1lIChzZWcpKTsKLSAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKLSAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKLSAga25vdyAoc3Ryb2ZmID09IDEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Ci0gIHNlZ19pbmZvIChzZWcpLT5zdGFidS5wID0gcDsKLX0KLQotI2VuZGlmCi0KLS8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3RhYl9zZWN0aW9ucyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBhc2VjdGlvbiAqc3Ryc2VjOwotICBjaGFyICpwOwotICBpbnQgc3Ryc3osIG5zeW1zOwotCi0gIGlmIChzdHJuY21wICgiLnN0YWIiLCBzZWMtPm5hbWUsIDUpKQotICAgIHJldHVybjsKLSAgaWYgKCFzdHJjbXAgKCJzdHIiLCBzZWMtPm5hbWUgKyBzdHJsZW4gKHNlYy0+bmFtZSkgLSAzKSkKLSAgICByZXR1cm47Ci0KLSAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWMtPm5hbWUpICsgNCk7Ci0gIHN0cmNweSAobmFtZSwgc2VjLT5uYW1lKTsKLSAgc3RyY2F0IChuYW1lLCAic3RyIik7Ci0gIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLSAgaWYgKHN0cnNlYykKLSAgICBzdHJzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0cnNlYyk7Ci0gIGVsc2UKLSAgICBzdHJzeiA9IDA7Ci0gIG5zeW1zID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSAvIDEyIC0gMTsKLQotICBwID0gc2VnX2luZm8gKHNlYyktPnN0YWJ1LnA7Ci0gIGFzc2VydCAocCAhPSAwKTsKLQotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBuc3ltcywgKGJmZF9ieXRlICopIHAgKyA2KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3Ryc3osIChiZmRfYnl0ZSAqKSBwICsgOCk7Ci19Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFQ09GRiBjb2RlLiAgSXQgaXMgc3VwcG9zZWQgdG8KLSAgIHJlY29yZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGJhY2tlbmQgY2FuCi0gICB3cml0ZSBpdCBvdXQgY29ycmVjdGx5LiAgVGhlIEVMRiBiYWNrZW5kIGRvZXNuJ3QgYWN0dWFsbHkgaGFuZGxlCi0gICB0aGlzIGF0IHRoZSBtb21lbnQsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4gIFdlIHNhdmUgdGhlIGluZm9ybWF0aW9uCi0gICBpbiB0aGUgc3ltYm9sLiAgKi8KLQotdm9pZAotZWxmX2Vjb2ZmX3NldF9leHQgKHN5bSwgZXh0KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN0cnVjdCBlY29mZl9leHRyICpleHQ7Ci17Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT51ZGF0YS5wID0gKFBUUikgZXh0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaXMKLSAgIHN1cHBvc2VkIHRvICpFWFQgdG8gdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiwgYW5kIHJldHVybgotICAgd2hldGhlciB0aGUgc3ltYm9sIHNob3VsZCBiZSB1c2VkIGF0IGFsbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2V0X2V4dHIgKHN5bSwgZXh0KQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmV4dDsKLXsKLSAgaWYgKHN5bS0+dWRhdGEucCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKmV4dCA9ICooRVhUUiAqKSBzeW0tPnVkYXRhLnA7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaGFzCi0gICBub3RoaW5nIHRvIGRvIGZvciBFTEYuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1lbGZfc2V0X2luZGV4IChzeW0sIGluZHgpCi0gICAgIGFzeW1ib2wgKnN5bSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfc2l6ZV90eXBlIGluZHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLX0KLQotI2VuZGlmIC8qIE5FRURfRUNPRkZfREVCVUcgKi8KLQotdm9pZAotZWxmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50cCkKLSAgICAgc3ltYm9sUyAqc3ltcDsKLSAgICAgaW50ICpwdW50cDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfc3kgKnN5X29iajsKLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9mcm9iX3N5bWJvbCAoc3ltcCk7Ci0jZW5kaWYKLQotICBzeV9vYmogPSBzeW1ib2xfZ2V0X29iaiAoc3ltcCk7Ci0KLSAgaWYgKHN5X29iai0+c2l6ZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3lfb2JqLT5zaXplLT5YX29wKQotCXsKLQljYXNlIE9fc3VidHJhY3Q6Ci0JICBTX1NFVF9TSVpFIChzeW1wLAotCQkgICAgICAoU19HRVRfVkFMVUUgKHN5X29iai0+c2l6ZS0+WF9hZGRfc3ltYm9sKQotCQkgICAgICAgKyBzeV9vYmotPnNpemUtPlhfYWRkX251bWJlcgotCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoc3lfb2JqLT5zaXplLT5YX29wX3N5bWJvbCkpKTsKLQkgIGJyZWFrOwotCWNhc2UgT19jb25zdGFudDoKLQkgIFNfU0VUX1NJWkUgKHN5bXAsCi0JCSAgICAgIChTX0dFVF9WQUxVRSAoc3lfb2JqLT5zaXplLT5YX2FkZF9zeW1ib2wpCi0JCSAgICAgICArIHN5X29iai0+c2l6ZS0+WF9hZGRfbnVtYmVyKSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkIChfKCIuc2l6ZSBleHByZXNzaW9uIHRvbyBjb21wbGljYXRlZCB0byBmaXggdXAiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmcmVlIChzeV9vYmotPnNpemUpOwotICAgICAgc3lfb2JqLT5zaXplID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHN5X29iai0+dmVyc2lvbmVkX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgZ2l2ZW4gYSBuZXcgbmFtZSB3aXRoIHRoZSAuc3ltdmVyIGRpcmVjdGl2ZS4KLQotICAgICAgICAgSWYgdGhpcyBpcyBhbiBleHRlcm5hbCByZWZlcmVuY2UsIGp1c3QgcmVuYW1lIHRoZSBzeW1ib2wgdG8KLSAgICAgICAgIGluY2x1ZGUgdGhlIHZlcnNpb24gc3RyaW5nLiAgVGhpcyB3aWxsIG1ha2UgdGhlIHJlbG9jcyBiZQotICAgICAgICAgYWdhaW5zdCB0aGUgY29ycmVjdCB2ZXJzaW9uZWQgc3ltYm9sLgotCi0JIElmIHRoaXMgaXMgYSBkZWZpbml0aW9uLCBhZGQgYW4gYWxpYXMuICBGSVhNRTogVXNpbmcgYW4gYWxpYXMKLQkgd2lsbCBwZXJtaXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byByZWZlciB0byB0aGUgcmlnaHQKLQkgc3ltYm9sLiAgSG93ZXZlciwgaXQncyBub3QgY2xlYXIgd2hldGhlciBpdCBpcyB0aGUgYmVzdAotCSBhcHByb2FjaC4gICovCi0KLSAgICAgIGlmICghIFNfSVNfREVGSU5FRCAoc3ltcCkpCi0JewotCSAgY2hhciAqcDsKLQotCSAgLyogVmVyaWZ5IHRoYXQgdGhlIG5hbWUgaXNuJ3QgdXNpbmcgdGhlIEBAIHN5bnRheC0tdGhpcyBpcwotICAgICAgICAgICAgIHJlc2VydmVkIGZvciBkZWZpbml0aW9ucyBvZiB0aGUgZGVmYXVsdCB2ZXJzaW9uIHRvIGxpbmsKLSAgICAgICAgICAgICBhZ2FpbnN0LiAgKi8KLQkgIHAgPSBzdHJjaHIgKHN5X29iai0+dmVyc2lvbmVkX25hbWUsIEVMRl9WRVJfQ0hSKTsKLQkgIGtub3cgKHAgIT0gTlVMTCk7Ci0JICBpZiAocFsxXSA9PSBFTEZfVkVSX0NIUikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBhdHRlbXB0IHRvIGRlY2xhcmUgZXh0ZXJuYWwgdmVyc2lvbiBuYW1lIGFzIGRlZmF1bHQgaW4gc3ltYm9sIGAlcyciKSwKLQkJICAgICAgc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSk7Ci0JICAgICAgKnB1bnRwID0gdHJ1ZTsKLQkgICAgfQotCSAgU19TRVRfTkFNRSAoc3ltcCwgc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnN5bXAyOwotCi0JICAvKiBGSVhNRTogQ3JlYXRpbmcgYSBuZXcgc3ltYm9sIGhlcmUgaXMgcmlza3kuICBXZSdyZSBpbiB0aGUKLSAgICAgICAgICAgICBmaW5hbCBsb29wIG92ZXIgdGhlIHN5bWJvbCB0YWJsZS4gIFdlIGNhbiBnZXQgYXdheSB3aXRoCi0gICAgICAgICAgICAgaXQgb25seSBiZWNhdXNlIHRoZSBzeW1ib2wgZ29lcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LAotICAgICAgICAgICAgIHdoZXJlIHRoZSBsb29wIHdpbGwgc3RpbGwgc2VlIGl0LiAgSXQgd291bGQgcHJvYmFibHkgYmUKLSAgICAgICAgICAgICBiZXR0ZXIgdG8gZG8gdGhpcyBpbiBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QuICovCi0KLQkgIHN5bXAyID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSk7Ci0KLQkgIC8qIE5vdyB3ZSBhY3QgYXMgdGhvdWdoIHdlIHNhdyBzeW1wMiA9IHN5bS4gICovCi0KLQkgIFNfU0VUX1NFR01FTlQgKHN5bXAyLCBTX0dFVF9TRUdNRU5UIChzeW1wKSk7Ci0KLQkgIC8qIFN1YnRyYWN0aW5nIG91dCB0aGUgZnJhZyBhZGRyZXNzIGhlcmUgaXMgYSBoYWNrIGJlY2F1c2UKLSAgICAgICAgICAgICB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZmluYWwgbG9vcC4gICovCi0JICBTX1NFVF9WQUxVRSAoc3ltcDIsCi0JCSAgICAgICAoU19HRVRfVkFMVUUgKHN5bXApCi0JCQktIHN5bWJvbF9nZXRfZnJhZyAoc3ltcCktPmZyX2FkZHJlc3MpKTsKLQotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1wMiwgc3ltYm9sX2dldF9mcmFnIChzeW1wKSk7Ci0KLQkgIC8qIFRoaXMgd2lsbCBjb3B5IG92ZXIgdGhlIHNpemUgaW5mb3JtYXRpb24uICAqLwotCSAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltcDIsIHN5bXApOwotCi0JICBpZiAoU19JU19XRUFLIChzeW1wKSkKLQkgICAgU19TRVRfV0VBSyAoc3ltcDIpOwotCi0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCi0JICAgIFNfU0VUX0VYVEVSTkFMIChzeW1wMik7Ci0JfQotICAgIH0KLQotICAvKiBEb3VibGUgY2hlY2sgd2VhayBzeW1ib2xzLiAgKi8KLSAgaWYgKFNfSVNfV0VBSyAoc3ltcCkpCi0gICAgewotICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW1wKSkKLQlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKLQkJU19HRVRfTkFNRSAoc3ltcCkpOwotICAgIH0KLQotI2lmZGVmIFRDX01JUFMKLSAgLyogVGhlIElyaXggNSBhbmQgNiBhc3NlbWJsZXJzIHNldCB0aGUgdHlwZSBvZiBhbnkgY29tbW9uIHN5bWJvbCBhbmQKLSAgICAgYW55IHVuZGVmaW5lZCBub24tZnVuY3Rpb24gc3ltYm9sIHRvIFNUVF9PQkpFQ1QuICBXZSB0cnkgdG8gYmUKLSAgICAgY29tcGF0aWJsZSwgc2luY2UgbmV3ZXIgSXJpeCA1IGFuZCA2IGxpbmtlcnMgY2FyZS4gIEhvd2V2ZXIsIHdlCi0gICAgIG9ubHkgc2V0IHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIFNUVF9PQkpFQ1QgaWYgd2UgYXJlIG9uIElyaXgsCi0gICAgIGJlY2F1c2UgdGhhdCBpcyB0aGUgb25seSB0aW1lIGdjYyB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKLSAgICAgLmdsb2JhbCBkaXJlY3RpdmVzIHRvIG1hcmsgZnVuY3Rpb25zLiAgKi8KLQotICBpZiAoU19JU19DT01NT04gKHN5bXApKQotICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQotICBpZiAoc3Ryc3RyIChUQVJHRVRfT1MsICJpcml4IikgIT0gTlVMTAotICAgICAgJiYgISBTX0lTX0RFRklORUQgKHN5bXApCi0gICAgICAmJiAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMCkKLSAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1BQQwotICAvKiBGcm9iIHRoZSBQb3dlclBDLCBzbyB0aGF0IHRoZSBzeW1ib2wgYWx3YXlzIGhhcyBvYmplY3QgdHlwZQotICAgICBpZiBpdCBpcyBub3Qgc29tZSBvdGhlciB0eXBlLiAgVnhXb3JrcyBuZWVkcyB0aGlzLiAgKi8KLSAgaWYgKChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzCi0gICAgICAgJiAoQlNGX0ZVTkNUSU9OIHwgQlNGX0ZJTEUgfCBCU0ZfU0VDVElPTl9TWU0pKSA9PSAwCi0gICAgICAmJiBTX0lTX0RFRklORUQgKHN5bXApKQotICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLSNlbmRpZgotfQotCi12b2lkCi1lbGZfZnJvYl9maWxlICgpCi17Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBhZGp1c3Rfc3RhYl9zZWN0aW9ucywgKFBUUikgMCk7Ci0KLSNpZmRlZiBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZwotICBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyAoKTsKLSNlbmRpZgotfQotCi0vKiBJdCBpcyByZXF1aXJlZCB0aGF0IHdlIGxldCB3cml0ZV9yZWxvY3MgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8KLSAgIG9wdGltaXplIGF3YXkgZml4dXBzIGJlZm9yZSBvdXRwdXQgaGFzIGJlZ3VuLCBzaW5jZSBpdCBpcyBwb3NzaWJsZQotICAgdG8gZWxpbWluYXRlIGFsbCBmaXh1cHMgZm9yIGEgc2VjdGlvbiBhbmQgdGh1cyB3ZSBuZXZlciBzaG91bGQKLSAgIGhhdmUgZ2VuZXJhdGVkIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24uICAqLwotCi12b2lkCi1lbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQotewotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICAvKiBHZW5lcmF0ZSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqZGVidWdfc3dhcDsKLSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGRlYnVnOwotICAgICAgY2hhciAqYnVmOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgZGVidWdfc3dhcAotCT0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKHN0ZG91dHB1dCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gICAgICBrbm93IChkZWJ1Z19zd2FwICE9IChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqKSBOVUxMKTsKLSAgICAgIGVjb2ZmX2J1aWxkX2RlYnVnICgmZGVidWcuc3ltYm9saWNfaGVhZGVyLCAmYnVmLCBkZWJ1Z19zd2FwKTsKLQotICAgICAgLyogU2V0IHVwIHRoZSBwb2ludGVycyBpbiBkZWJ1Zy4gICovCi0jZGVmaW5lIFNFVChwdHIsIG9mZnNldCwgdHlwZSkgXAotICAgIGRlYnVnLnB0ciA9ICh0eXBlKSAoYnVmICsgZGVidWcuc3ltYm9saWNfaGVhZGVyLm9mZnNldCkKLQotICAgICAgU0VUIChsaW5lLCBjYkxpbmVPZmZzZXQsIHVuc2lnbmVkIGNoYXIgKik7Ci0gICAgICBTRVQgKGV4dGVybmFsX2RuciwgY2JEbk9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9hdXgsIGNiQXV4T2Zmc2V0LCB1bmlvbiBhdXhfZXh0ICopOwotICAgICAgU0VUIChzcywgY2JTc09mZnNldCwgY2hhciAqKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBQVFIpOwotICAgICAgLyogc3NleHQgYW5kIGV4dGVybmFsX2V4dCBhcmUgc2V0IHVwIGp1c3QgYmVsb3cuICAqLwotCi0jdW5kZWYgU0VUCi0KLSAgICAgIC8qIFNldCB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gICAgICBkZWJ1Zy5zc2V4dCA9IGRlYnVnLnNzZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy5leHRlcm5hbF9leHQgPSBkZWJ1Zy5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKLSAgICAgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwLCB0cnVlLAotCQkJCSAgICAgICBlbGZfZ2V0X2V4dHIsIGVsZl9zZXRfaW5kZXgpKQotCWFzX2ZhdGFsIChfKCJGYWlsZWQgdG8gc2V0IHVwIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjogJXMiKSwKLQkJICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsICIubWRlYnVnIik7Ci0gICAgICBhc3NlcnQgKHNlYyAhPSBOVUxMKTsKLQotICAgICAga25vdyAoc3Rkb3V0cHV0LT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKTsKLQotICAgICAgLyogV2Ugc2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBjYWxsIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotCSB0byBmb3JjZSB0aGUgRUxGIGJhY2tlbmQgdG8gYWxsb2NhdGUgYSBmaWxlIHBvc2l0aW9uLCBhbmQgdGhlbgotCSB3cml0ZSBvdXQgdGhlIGRhdGEuICBGSVhNRTogSXMgdGhpcyByZWFsbHkgdGhlIGJlc3Qgd2F5IHRvIGRvCi0JIHRoaXM/ICAqLwotICAgICAgc2VjLT5fcmF3X3NpemUgPSBiZmRfZWNvZmZfZGVidWdfc2l6ZSAoc3Rkb3V0cHV0LCAmZGVidWcsIGRlYnVnX3N3YXApOwotCi0gICAgICAvKiBQYXNzIEJVRiB0byBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgYmVjYXVzZSB0aGlzIHdpbGwKLSAgICAgICAgIGV2ZW50dWFsbHkgYmVjb21lIGEgY2FsbCB0byBmd3JpdGUsIGFuZCBJU08gQyBwcm9oaWJpdHMKLSAgICAgICAgIHBhc3NpbmcgYSBOVUxMIHBvaW50ZXIgdG8gYSBzdGRpbyBmdW5jdGlvbiBldmVuIGlmIHRoZQotICAgICAgICAgcG9pbnRlciB3aWxsIG5vdCBiZSB1c2VkLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsIChQVFIpIGJ1ZiwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIChiZmRfc2l6ZV90eXBlKSAwKSkKLQlhc19mYXRhbCAoXygiQ2FuJ3Qgc3RhcnQgd3JpdGluZyAubWRlYnVnIHNlY3Rpb246ICVzIiksCi0JCSAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCi0gICAgICBrbm93IChzdGRvdXRwdXQtPm91dHB1dF9oYXNfYmVndW4gPT0gdHJ1ZSk7Ci0gICAgICBrbm93IChzZWMtPmZpbGVwb3MgIT0gMCk7Ci0KLSAgICAgIGlmICghIGJmZF9lY29mZl93cml0ZV9kZWJ1ZyAoc3Rkb3V0cHV0LCAmZGVidWcsIGRlYnVnX3N3YXAsCi0JCQkJICAgc2VjLT5maWxlcG9zKSkKLQlhc19mYXRhbCAoXygiQ291bGQgbm90IHdyaXRlIC5tZGVidWcgc2VjdGlvbjogJXMiKSwKLQkJICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgfQotI2VuZGlmIC8qIE5FRURfRUNPRkZfREVCVUcgKi8KLX0KLQotI2lmZGVmIFNDT19FTEYKLQotLyogSGVhdmlseSBwbGFnYXJpemVkIGZyb20gb2JqX2VsZl92ZXJzaW9uLiAgVGhlIGlkZWEgaXMgdG8gZW1pdCB0aGUKLSAgIFNDTyBzcGVjaWZpYyBpZGVudGlmaWVyIGluIHRoZSAubm90ZXMgc2VjdGlvbiB0byBzYXRpc2Z5IHRoZSBTQ08KLSAgIGxpbmtlci4KLQotICAgVGhpcyBsb29rcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaXQgcmVhbGx5IGlzLiAgQXMgb3Bwb3NlZCB0byB0aGUKLSAgICJvYnZpb3VzIiBzb2x1dGlvbiwgdGhpcyBzaG91bGQgaGFuZGxlIHRoZSBjcm9zcyBkZXYgY2FzZXMKLSAgIGNvcnJlY3RseS4gIChpLmUsIGhvc3Rpbmcgb24gYSA2NCBiaXQgYmlnIGVuZGlhbiBwcm9jZXNzb3IsIGJ1dAotICAgZ2VuZXJhdGluZyBTQ08gRWxmIGNvZGUpIEVmZmljaWVuY3kgaXNuJ3QgYSBjb25jZXJuLCBhcyB0aGVyZQotICAgc2hvdWxkIGJlIGV4YWN0bHkgb25lIG9mIHRoZXNlIHNlY3Rpb25zIHBlciBvYmplY3QgbW9kdWxlLgotCi0gICBTQ08gT3BlblNlcnZlciA1IGlkZW50aWZpZXMgaXQncyBFTEYgbW9kdWxlcyB3aXRoIGEgc3RhbmRhcmQgRUxGCi0gICAubm90ZSBzZWN0aW9uLgotCi0gICBpbnRfMzIgbmFtZXN6ICA9IDQgOyAgTmFtZSBzaXplIAotICAgaW50XzMyIGRlc2NzeiAgPSAxMiA7IERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIAotICAgaW50XzMyIHR5cGUgICAgPSAxIDsgIAotICAgY2hhciAgIG5hbWVbNF0gPSAiU0NPIiA7IE9yaWdpbmF0b3IgbmFtZSBBTFdBWVMgU0NPICsgTlVMTCAKLSAgIGludF8zMiB2ZXJzaW9uID0gKG1ham9yIHZlciAjIDw8IDE2KSAgfCB2ZXJzaW9uIG9mIHRvb2xzIDsKLSAgIGludF8zMiBzb3VyY2UgID0gKHRvb2xfaWQgPDwgMTYgKSB8IDEgOwotICAgaW50XzMyIGluZm8gICAgPSAwIDsgICAgVGhlc2UgYXJlIHNldCBieSB0aGUgU0NPIHRvb2xzLCBidXQgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGtub3cgZW5vdWdoIGFib3V0IHRoZSBzb3VyY2UgCi0JCQkgICBlbnZpcm9ubWVudCB0byBzZXQgdGhlbS4gIFNDTyBsZCBjdXJyZW50bHkKLQkJCSAgIGlnbm9yZXMgdGhlbSwgYW5kIHJlY29tbWVuZHMgd2Ugc2V0IHRoZW0KLQkJCSAgIHRvIHplcm8uICAqLwotCi0jZGVmaW5lIFNDT19NQUpPUl9WRVJTSU9OIDB4MQotI2RlZmluZSBTQ09fTUlOT1JfVkVSU0lPTiAweDEKLQotdm9pZAotc2NvX2lkICgpCi17Ci0KLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGNoYXIgY2g7Ci0gIGNoYXIgKnA7Ci0gIGFzZWN0aW9uICpzZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIEVsZl9JbnRlcm5hbF9Ob3RlIGlfbm90ZTsKLSAgRWxmX0V4dGVybmFsX05vdGUgZV9ub3RlOwotICBhc2VjdGlvbiAqbm90ZV9zZWNwID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGludCBpLCBsZW47Ci0KLSAgLyogY3JlYXRlIHRoZSAubm90ZSBzZWN0aW9uICovCi0KLSAgbm90ZV9zZWNwID0gc3Vic2VnX25ldyAoIi5ub3RlIiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LAotCQkJIG5vdGVfc2VjcCwKLQkJCSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZKTsKLQotICAvKiBwcm9jZXNzIHRoZSB2ZXJzaW9uIHN0cmluZyAqLwotCi0gIGlfbm90ZS5uYW1lc3ogPSA0OyAKLSAgaV9ub3RlLmRlc2NzeiA9IDEyOwkJLyogMTIgZGVzY3JpcHRpdmUgYnl0ZXMgKi8KLSAgaV9ub3RlLnR5cGUgPSBOVF9WRVJTSU9OOwkvKiBDb250YWlucyBhIHZlcnNpb24gc3RyaW5nICovCi0KLSAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChpX25vdGUubmFtZXN6KSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLm5hbWVzeiwgNCk7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChpX25vdGUuZGVzY3N6KSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLmRlc2NzeiwgNCk7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChpX25vdGUudHlwZSkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS50eXBlLCA0KTsKLQotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgc3RyY3B5IChwLCAiU0NPIik7IAotCi0gIC8qIE5vdGU6IHRoaXMgaXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBFTEYgd2UncmUgcmVwcmVzZW50aW5nICovCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIChTQ09fTUFKT1JfVkVSU0lPTiA8PCAxNikgfCAoU0NPX01JTk9SX1ZFUlNJT04pLCA0KTsKLQotICAvKiBIZXJlLCB3ZSBwaWNrIGEgbWFnaWMgbnVtYmVyIGZvciBvdXJzZWx2ZXMgKHllcywgSSAicmVnaXN0ZXJlZCIKLSAgICAgaXQgd2l0aCBTQ08uICBUaGUgYm90dG9tIGJpdCBzaG93cyB0aGF0IHdlIGFyZSBjb21wYXQgd2l0aCB0aGUKLSAgICAgU0NPIEFCSS4gICovCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDB4NGM1MjAwMDAgfCAweDAwMDEsIDQpOwotCi0gIC8qIElmIHdlIGtuZXcgKG9yIGNhcmVkKSB3aGF0IHRoZSBzb3VyY2UgbGFuZ3VhZ2Ugb3B0aW9ucyB3ZXJlLCB3ZSdkCi0gICAgIGZpbGwgdGhlbSBpbiBoZXJlLiAgU0NPIGhhcyBnaXZlbiB1cyBwZXJtaXNzaW9uIHRvIGlnbm9yZSB0aGVzZQotICAgICBhbmQganVzdCBzZXQgdGhlbSB0byB6ZXJvLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgMHgwMDAwLCA0KTsKLSAKLSAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0KLSAgLyogV2UgcHJvYmFibHkgY2FuJ3QgcmVzdG9yZSB0aGUgY3VycmVudCBzZWdtZW50LCBmb3IgdGhlcmUgbGlrZWx5Ci0gICAgIGlzbid0IG9uZSB5ZXQuLi4gICovCi0gIGlmIChzZWcgJiYgc3Vic2VnKQotICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLQotfQotCi0jZW5kaWYgLyogU0NPX0VMRiAqLwotCi1jb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlbGZfZm9ybWF0X29wcyA9Ci17Ci0gIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCi0gIDAsCi0gIDEsCi0gIGVsZl9mcm9iX3N5bWJvbCwKLSAgZWxmX2Zyb2JfZmlsZSwKLSAgZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MsCi0gIGVsZl9zX2dldF9zaXplLCBlbGZfc19zZXRfc2l6ZSwKLSAgZWxmX3NfZ2V0X2FsaWduLCBlbGZfc19zZXRfYWxpZ24sCi0gIGVsZl9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLAotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubywKLSAgZWNvZmZfc3RhYiwKLSNlbHNlCi0gIDAsCi0gIDAsCQkJCS8qIHByb2Nlc3Nfc3RhYiAqLwotI2VuZGlmCi0gIGVsZl9zZWNfc3ltX29rX2Zvcl9yZWxvYywKLSAgZWxmX3BvcF9pbnNlcnQsCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBlbGZfZWNvZmZfc2V0X2V4dCwKLSNlbHNlCi0gIDAsCi0jZW5kaWYKLSAgb2JqX3JlYWRfYmVnaW5faG9vaywKLSAgb2JqX3N5bWJvbF9uZXdfaG9vaywKLX07CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1lbGYuaCBiL2dhcy9jb25maWcvb2JqLWVsZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDE2Y2EyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWVsZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIEhQIFBBLVJJU0Mgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotICAgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4gICovCi0KLSNpZm5kZWYgX09CSl9FTEZfSAotI2RlZmluZSBfT0JKX0VMRl9ICi0KLSNkZWZpbmUgT0JKX0VMRiAxCi0KLSNpZm5kZWYgT1VUUFVUX0ZMQVZPUgotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSNlbmRpZgotCi0jaW5jbHVkZSA8YmZkLmg+Ci0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0CQkvKiBmb3Igbm93ICovCi0jaW5jbHVkZSAiYmZkL2VsZi1iZmQuaCIKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpZmRlZiBUQ19BTFBIQQotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgYWxwaGFfZmxhZ19tZGVidWcKLWV4dGVybiBpbnQgYWxwaGFfZmxhZ19tZGVidWc7Ci0jZW5kaWYKLQotLyogRm9yIG5vdywgYWx3YXlzIHNldCBFQ09GRl9ERUJVR0dJTkcgZm9yIGEgTUlQUyB0YXJnZXQuICAqLwotI2lmZGVmIFRDX01JUFMKLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMAotI2Vsc2UKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDEKLSNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLwotI2VuZGlmIC8qIFRDX01JUFMgKi8KLQotLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHN5bWJvbC4gICovCi1zdHJ1Y3QgZWxmX29ial9zeQotewotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgaGFzIGJlZW4gbWFya2VkIGFzIGxvY2FsLiAgKi8KLSAgaW50IGxvY2FsOwotCi0gIC8qIFVzZSB0aGlzIHRvIGtlZXAgdHJhY2sgb2YgLnNpemUgZXhwcmVzc2lvbnMgdGhhdCBpbnZvbHZlCi0gICAgIGRpZmZlcmVuY2VzIHRoYXQgd2UgY2FuJ3QgY29tcHV0ZSB5ZXQuICAqLwotICBleHByZXNzaW9uUyAqc2l6ZTsKLQotICAvKiBUaGUgbmFtZSBzcGVjaWZpZWQgYnkgdGhlIC5zeW12ZXIgZGlyZWN0aXZlLiAgKi8KLSAgY2hhciAqdmVyc2lvbmVkX25hbWU7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB3ZSBuZWVkIHNvbWUKLSAgICAgYWRkaXRpb25hbCBmaWVsZHMgZm9yIGVhY2ggc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVmZHIgKmVjb2ZmX2ZpbGU7Ci0gIHN0cnVjdCBsb2NhbHN5bSAqZWNvZmZfc3ltYm9sOwotICB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7Ci0jZW5kaWYKLX07Ci0KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgc3RydWN0IGVsZl9vYmpfc3kKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgICFGQUxTRQotI2VuZGlmCi0KLSNkZWZpbmUgb2JqX2JlZ2luKCkgZWxmX2JlZ2luICgpCi1leHRlcm4gdm9pZCBlbGZfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotCi0vKiBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gYWRkcmVzcyBzaXplISAqLwotI2RlZmluZSBlbGZfc3ltYm9sKGFzeW1ib2wpICgoZWxmX3N5bWJvbF90eXBlICopKCYoYXN5bWJvbCktPnRoZV9iZmQpKQotCi0jaWZuZGVmIFNfR0VUX1NJWkUKLSNkZWZpbmUgU19HRVRfU0laRShTKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUpCi0jZW5kaWYKLSNpZm5kZWYgU19TRVRfU0laRQotI2RlZmluZSBTX1NFVF9TSVpFKFMsVikgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplID0gKFYpKQotI2VuZGlmCi0KLSNpZm5kZWYgU19HRVRfQUxJR04KLSNkZWZpbmUgU19HRVRfQUxJR04oUykgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZSkKLSNlbmRpZgotI2lmbmRlZiBTX1NFVF9BTElHTgotI2RlZmluZSBTX1NFVF9BTElHTihTLFYpIFwKLSAgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUgPSAoVikpCi0jZW5kaWYKLQotI2RlZmluZSBTX0dFVF9PVEhFUihTKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyKQotI2RlZmluZSBTX1NFVF9PVEhFUihTLFYpIFwKLSAgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIgPSAoVikpCi0KLWV4dGVybiBhc2VjdGlvbiAqZ2RiX3NlY3Rpb247Ci0KLSNpZm5kZWYgb2JqX2Zyb2JfZmlsZQotI2RlZmluZSBvYmpfZnJvYl9maWxlICBlbGZfZnJvYl9maWxlCi0jZW5kaWYKLWV4dGVybiB2b2lkIGVsZl9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0jaWZuZGVmIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICBlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotI2VuZGlmCi1leHRlcm4gdm9pZCBlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgb2JqX2FwcF9maWxlIGVsZl9maWxlX3N5bWJvbAotZXh0ZXJuIHZvaWQgZWxmX2ZpbGVfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKikpOwotCi1leHRlcm4gdm9pZCBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBvYmpfZWxmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX3ByZXZpb3VzIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX2VsZl92ZXJzaW9uIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX2VsZl9jb21tb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX3RleHQgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEJGRCB3YW50cyB0byB3cml0ZSB0aGUgdWRhdGEgZmllbGQsIHdoaWNoIGlzIGEgbm8tbm8gZm9yIHRoZQotICAgZ2xvYmFsbHkgZGVmaW5lZCBzZWN0aW9ucy4gICovCi0jaWZuZGVmIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkoKFNFQyktPm93bmVyICE9IDApCi0jZW5kaWYKLQotLyogV2hlbiBzZXR0aW5nIG9uZSBzeW1ib2wgZXF1YWwgdG8gYW5vdGhlciwgYnkgZGVmYXVsdCB3ZSBwcm9iYWJseQotICAgd2FudCB0aGVtIHRvIGhhdmUgdGhlIHNhbWUgInNpemUiLCB3aGF0ZXZlciBpdCBtZWFucyBpbiB0aGUgY3VycmVudAotICAgY29udGV4dC4gICovCi0jaWZuZGVmIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKERFU1QsU1JDKQkJCVwKLWRvCQkJCQkJCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBzdHJ1Y3QgZWxmX29ial9zeSAqc3JjZWxmID0gc3ltYm9sX2dldF9vYmogKFNSQyk7CQlcCi0gICAgc3RydWN0IGVsZl9vYmpfc3kgKmRlc3RlbGYgPSBzeW1ib2xfZ2V0X29iaiAoREVTVCk7CQlcCi0gICAgaWYgKHNyY2VsZi0+c2l6ZSkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQlcCi0JaWYgKGRlc3RlbGYtPnNpemUgPT0gTlVMTCkJCQkJXAotCSAgZGVzdGVsZi0+c2l6ZSA9CQkJCQlcCi0JICAgIChleHByZXNzaW9uUyAqKSB4bWFsbG9jIChzaXplb2YgKGV4cHJlc3Npb25TKSk7CVwKLQkqZGVzdGVsZi0+c2l6ZSA9ICpzcmNlbGYtPnNpemU7CQkJCVwKLSAgICAgIH0JCQkJCQkJCVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCVwKLQlpZiAoZGVzdGVsZi0+c2l6ZSAhPSBOVUxMKQkJCQlcCi0JICBmcmVlIChkZXN0ZWxmLT5zaXplKTsJCQkJCVwKLQlkZXN0ZWxmLT5zaXplID0gTlVMTDsJCQkJCVwKLSAgICAgIH0JCQkJCQkJCVwKLSAgICBTX1NFVF9TSVpFICgoREVTVCksIFNfR0VUX1NJWkUgKFNSQykpOwkJCVwKLSAgICBTX1NFVF9PVEhFUiAoKERFU1QpLCBTX0dFVF9PVEhFUiAoU1JDKSk7CQkJXAotICB9CQkJCQkJCQlcCi13aGlsZSAoMCkKLSNlbmRpZgotCi0vKiBTdGFicyBnbyBpbiBhIHNlcGFyYXRlIHNlY3Rpb24uICAqLwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDEKLQotLyogV2UgbmVlZCAxMiBieXRlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gdG8gaG9sZCBzb21lIGluaXRpYWwKLSAgIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiB2b2lkIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLQotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotLyogV2Ugc211Z2dsZSBzdGFicyBpbiBFQ09GRiByYXRoZXIgdGhhbiB1c2luZyBhIHNlcGFyYXRlIHNlY3Rpb24uCi0gICBUaGUgSXJpeCBsaW5rZXIgY2FuIG5vdCBoYW5kbGUgYSBzZXBhcmF0ZSBzdGFicyBzZWN0aW9uLiAgKi8KLQotI3VuZGVmICBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgKCFFQ09GRl9ERUJVR0dJTkcpCi0KLSN1bmRlZiAgSU5JVF9TVEFCX1NFQ1RJT04KLSNkZWZpbmUgSU5JVF9TVEFCX1NFQ1RJT04oc2VnKSBcCi0gICgodm9pZCkoRUNPRkZfREVCVUdHSU5HID8gMCA6IChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpLCAwKSkpCi0KLSN1bmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0jZGVmaW5lIE9CSl9QUk9DRVNTX1NUQUIoc2VnLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKQkJXAotICBpZiAoRUNPRkZfREVCVUdHSU5HKQkJCQkJCQlcCi0gICAgZWNvZmZfc3RhYiAoKHNlZyksICh3aGF0KSwgKHN0cmluZyksICh0eXBlKSwgKG90aGVyKSwgKGRlc2MpKQotI2VuZGlmIC8qIEVDT0ZGX0RFQlVHR0lORyAqLwotCi1leHRlcm4gdm9pZCBlbGZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotI2lmbmRlZiBvYmpfZnJvYl9zeW1ib2wKLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKHN5bXAsIHB1bnQpIGVsZl9mcm9iX3N5bWJvbCAoc3ltcCwgJnB1bnQpCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgZWxmX3BvcF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOwotI2lmbmRlZiBvYmpfcG9wX2luc2VydAotI2RlZmluZSBvYmpfcG9wX2luc2VydCgpCWVsZl9wb3BfaW5zZXJ0KCkKLSNlbmRpZgotCi0jaWZuZGVmIE9CSl9NQVlCRV9FTEYKLSNkZWZpbmUgb2JqX2Vjb2ZmX3NldF9leHQgZWxmX2Vjb2ZmX3NldF9leHQKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBlY29mZl9leHRyOwotI2VuZGlmCi1leHRlcm4gdm9pZCBlbGZfZWNvZmZfc2V0X2V4dCBQQVJBTVMgKChzeW1ib2xTICosIHN0cnVjdCBlY29mZl9leHRyICopKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX09CSl9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZXZheC5jIGIvZ2FzL2NvbmZpZy9vYmotZXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE4YzgzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWV2YXguYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIG9iai1ldmF4LmMgLSBFVkFYIChvcGVuVk1TL0FscGhhKSBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpIG9mCi0gICAgIHByb0dJUyBTb2Z0d2FyZSwgQWFjaGVuLCBHZXJtYW55LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWV2YXguaCIKLQotI2luY2x1ZGUgImFzLmgiCi0KLXN0YXRpYyB2b2lkIHNfZXZheF93ZWFrIFBBUkFNUyAoKGludCkpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid2VhayIsIHNfZXZheF93ZWFrLCAwfSwKLSAgezAsIDAsIDB9LAotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi12b2lkIG9ial9yZWFkX2JlZ2luX2hvb2sgKCkge30KLQotLyogSGFuZGxlIHRoZSB3ZWFrIHNwZWNpZmljIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2V2YXhfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIG9iai1ldmF4LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWV2YXguaCBiL2dhcy9jb25maWcvb2JqLWV2YXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5ZGIxOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ldmF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWV2YXguaAotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcHJvZ2lzLmRlKSBvZgotICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0gKi8KLQotLyogZGVmaW5lIGFuIG9iaiBzcGVjaWZpYyBtYWNybyBvZmYgd2hpY2ggdGFyZ2V0IGNwdSBiYWNrIGVuZHMgbWF5IGtleS4gKi8KLSNkZWZpbmUgT0JKX0VWQVggMQotCi0vKiBpbmNsdWRlIHdoYXRldmVyIHRhcmdldCBjcHUgaXMgYXBwcm9wcmlhdGUuICovCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotI2VuZGlmCi0KLS8qCi0gKiBTWU1CT0xTCi0gKi8KLQotLyoKLSAqIElmIHlvdXIgb2JqZWN0IGZvcm1hdCBuZWVkcyB0byByZW9yZGVyIHN5bWJvbHMsIGRlZmluZSB0aGlzLiAgV2hlbgotICogZGVmaW5lZCwgc3ltYm9scyBhcmUga2VwdCBvbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBhbmQgZnVuY3Rpb25zIGFyZQotICogbWFkZSBhdmFpbGFibGUgZm9yIHB1c2gsIGluc2VydCwgYXBwZW5kLCBhbmQgZGVsZXRlLiAgSWYgbm90IGRlZmluZWQsCi0gKiBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgc2luZ2x5IGxpbmtlZCBsaXN0LCBvbmx5IHRoZSBhcHBlbmQgYW5kIGNsZWFyCi0gKiBmYWNpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGFuZCB0aGV5IGFyZSBtYWNyb3MuCi0gKi8KLQotLyogI2RlZmluZSBTWU1CT0xTX05FRURfUEFDS1BPSU5URVJTICovCi0KLS8qICAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHZvaWQgKm5vdGhpbmc7Ci0gIH0KLW9ial9zeW1ib2xfdHlwZTsJCS8qIHNob3VsZCBiZSB0aGUgZm9ybWF0J3Mgc3ltYm9sIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAoMCkJLyogeW91ciBtYWdpYyBudW1iZXIgKi8KLQotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSxiLGMpCS8qIG11c3QgYmUgKnNvbWV0aGluZyouICBUaGlzIG5vLW9wJ3MgaXQgb3V0LiAqLwotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykgICAgICAgIHs7fQotCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikKLSNkZWZpbmUgU19TRVRfVFlQRShTLFQpCi0jZGVmaW5lIFNfU0VUX0RFU0MoUyxEKQotI2RlZmluZSBTX0dFVF9PVEhFUihTKQkwCi0jZGVmaW5lIFNfR0VUX1RZUEUoUykJMAotI2RlZmluZSBTX0dFVF9ERVNDKFMpCTAKLQotI2RlZmluZSBQRFNDX1NfS19LSU5EX0ZQX1NUQUNLIDkKLSNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUiAxMAotI2RlZmluZSBQRFNDX1NfS19LSU5EX05VTEwgOAotCi0jZGVmaW5lIFBEU0NfU19LX01JTl9TVEFDS19TSVpFIDMyCi0jZGVmaW5lIFBEU0NfU19LX01JTl9SRUdJU1RFUl9TSVpFIDI0Ci0jZGVmaW5lIFBEU0NfU19LX05VTExfU0laRSAxNgotCi0jZGVmaW5lIFBEU0NfU19NX0JBU0VfUkVHX0lTX0ZQIDB4ODAJLyogbG93IGJ5dGUgKi8KLSNkZWZpbmUgUERTQ19TX01fTkFUSVZFIDB4MTAJCS8qIGhpZ2ggYnl0ZSAqLwotI2RlZmluZSBQRFNDX1NfTV9OT19KQUNLRVQgMHgyMAkJLyogaGlnaCBieXRlICovCi0KLSNkZWZpbmUgTEtQX1NfS19TSVpFIDE2Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZXZheC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1nZW5lcmljLmMgYi9nYXMvY29uZmlnL29iai1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmMzZDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmMgYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gICBvYmplY3QgZm9ybWF0IHNwZWNpZmljIHNvdXJjZSBmaWxlcy4KLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygb2JqLWdlbmVyaWMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oIGIvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzE4ZTQzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotZ2VuZXJpYy5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqLwotCi0vKiBkZWZpbmUgYW4gb2JqIHNwZWNpZmljIG1hY3JvIG9mZiB3aGljaCB0YXJnZXQgY3B1IGJhY2sgZW5kcyBtYXkga2V5LiAqLwotI2RlZmluZSBPQkpfR0VORVJJQyAxCi0KLS8qIGluY2x1ZGUgd2hhdGV2ZXIgdGFyZ2V0IGNwdSBpcyBhcHByb3ByaWF0ZS4gKi8KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0vKgotICogU1lNQk9MUwotICovCi0KLS8qCi0gKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KLSAqIGRlZmluZWQsIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBkb3VibHkgbGlua2VkIGxpc3QgYW5kIGZ1bmN0aW9ucyBhcmUKLSAqIG1hZGUgYXZhaWxhYmxlIGZvciBwdXNoLCBpbnNlcnQsIGFwcGVuZCwgYW5kIGRlbGV0ZS4gIElmIG5vdCBkZWZpbmVkLAotICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgotICogZmFjaWxpdGllcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhleSBhcmUgbWFjcm9zLgotICovCi0KLS8qICNkZWZpbmUgU1lNQk9MU19ORUVEX1BBQ0tQT0lOVEVSUyAqLwotCi0vKiAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB2b2lkICpub3RoaW5nOwotICB9Ci0KLW9ial9zeW1ib2xfdHlwZTsJCS8qIHNob3VsZCBiZSB0aGUgZm9ybWF0J3Mgc3ltYm9sIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOwotCi0vKiBzeW1ib2xzIGhhdmUgbmFtZXMgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKCJmb28iKQkvKiBnZXQgdGhlIG5hbWUgb2YgYSBzeW1ib2xQICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJOwotLyogc3ltYm9scyBoYXZlIHNlZ21lbnRzICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKFNFR19VTktOT1dOKQotI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsdikJOwotLyogc3ltYm9scyBtYXkgYmUgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoMCkKLSNkZWZpbmUgU19TRVRfRVhURVJOQUwocykJOwotCi0vKiBzeW1ib2xzIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoMCkKLQotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAoMCkJLyogeW91ciBtYWdpYyBudW1iZXIgKi8KLQotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSxiLGMpCS8qIG11c3QgYmUgKnNvbWV0aGluZyouICBUaGlzIG5vLW9wJ3MgaXQgb3V0LiAqLwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygb2JqLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYyBiL2dhcy9jb25maWcvb2JqLWhwMzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOWNjNTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotaHAzMDAuaAotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJjb25maWcvb2JqLWFvdXQuYyIKLQotLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLXZvaWQKLWhwMzAwX2hlYWRlcl9hcHBlbmQgKHdoZXJlLCBoZWFkZXJzKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICB0Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpOwotCi0jZGVmaW5lIERPKEZJRUxEKQlcCi0gIHsgXAotICAgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuRklFTEQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLkZJRUxEKSk7IFwKLSAgICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuRklFTEQpOyBcCi0gIH0KLQotICBETyAoYV9pbmZvKTsKLSAgRE8gKGFfc3BhcmUxKTsKLSAgRE8gKGFfc3BhcmUyKTsKLSAgRE8gKGFfdGV4dCk7ICAgICAgCi0gIERPIChhX2RhdGEpOyAgICAgCi0gIERPIChhX2Jzcyk7ICAgICAKLSAgRE8gKGFfdHJzaXplKTsgCi0gIERPIChhX2Ryc2l6ZSk7Ci0gIERPIChhX3NwYXJlMyk7Ci0gIERPIChhX3NwYXJlNCk7Ci0gIERPIChhX3NwYXJlNSk7Ci0gIERPIChhX2VudHJ5KTsgCi0gIERPIChhX3NwYXJlNik7Ci0gIERPIChhX3NwYXJlNyk7Ci0gIERPIChhX3N5bXMpOyAgCi0gIERPIChhX3NwYXJlOCk7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ocDMwMC5oIGIvZ2FzL2NvbmZpZy9vYmotaHAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0MDA2Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ocDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1ocDMwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KLQotc3RydWN0IGV4ZWNfYnl0ZXMKLXsKLSAgdW5zaWduZWQgY2hhciBhX2luZm9bNF07ICAgLyogYV9tYWNodHlwZS9hX21hZ2ljICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTFbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTJbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYV90ZXh0WzRdOyAgIC8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfZGF0YVs0XTsgICAvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX2Jzc1s0XTsgICAgLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfdHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfZHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmUzWzRdOyAvKiBIUCA9IHBhc2NhbCBpbnRlcmZhY2Ugc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU0WzRdOyAvKiBIUCA9IHN5bWJvbCB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTVbNF07IC8qIEhQID0gZGVidWcgbmFtZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9lbnRyeVs0XTsgIC8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlNls0XTsgLyogSFAgPSBzb3VyY2UgbGluZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTdbNF07IC8qIEhQID0gdmFsdWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3ltc1s0XTsgICAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlOFs0XTsKLX07Ci0KLS8qIEhvdyBiaWcgdGhlICJzdHJ1Y3QgZXhlYyIgaXMgb24gZGlzayAqLwotI2RlZmluZSBFWEVDX0JZVEVTX1NJWkUgKDE2ICogNCkKLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX2luZm87Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTE7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTI7Ci0gIHVuc2lnbmVkIGxvbmcgYV90ZXh0OyAgICAgIAotICB1bnNpZ25lZCBsb25nIGFfZGF0YTsgICAgIAotICB1bnNpZ25lZCBsb25nIGFfYnNzOyAgICAgCi0gIHVuc2lnbmVkIGxvbmcgYV90cnNpemU7IAotICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUzOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU0OwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU1OwotICB1bnNpZ25lZCBsb25nIGFfZW50cnk7IAotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU2OwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU3OwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsgIAotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU4OwotfTsKLQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJKE9NQUdJQykKLSNkZWZpbmUgQU9VVF9WRVJTSU9OCTB4MDIKLSNkZWZpbmUgQU9VVF9NQUNIVFlQRQkweDBjCi0jZGVmaW5lIE9NQUdJQwkJMHgxMDYKLSAgICAKLSNkZWZpbmUgb2JqX2hlYWRlcl9hcHBlbmQJaHAzMDBfaGVhZGVyX2FwcGVuZAotI2luY2x1ZGUgImNvbmZpZy9vYmotYW91dC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaWVlZS5jIGIvZ2FzL2NvbmZpZy9vYmotaWVlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGEwNzk4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWllZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0vKiBvYmotZm9ybWF0IGZvciBpZWVlLTY5NSByZWNvcmRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0KLS8qCi0gIGNyZWF0ZWQgYnkKLQotICBzdGV2ZSBjaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0gICovCi0KLS8qCi0gIHRoaXMgd2lsbCBob3BlZnVsbHkgYmVjb21lIHRoZSBwb3J0IHRocm91Z2ggd2hpY2ggYmZkIGFuZCBnYXMgdGFsaywKLSAgZm9yIHRoZSBtb21lbnQsIG9ubHkgaWVlZSBpcyBrbm93biB0byB3b3JrIHdlbGwuCi0gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgotI2luY2x1ZGUgImZyYWdzLmgiCi0KLWJmZCAqYWJmZDsKLQotLyogSG93IG1hbnkgYWRkcmVzc2VzIGRvZXMgdGhlIC5hbGlnbiB0YWtlPyAqLwotc3RhdGljIHJlbGF4X2FkZHJlc3NUCi1yZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQotICAgICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwkvKiBBZGRyZXNzIG5vdy4gKi8KLSAgICAgcmVnaXN0ZXIgbG9uZyBhbGlnbm1lbnQ7CS8qIEFsaWdubWVudCAoYmluYXJ5KS4gKi8KLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19CQkJCS8qIHJlbGF4X2FsaWduKCkgKi8KLQotLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNoYWluIGFuZCBjcmVhdGUgYSBiZmQgc2VjdGlvbgotICAgdG8gY29udGFpbiBhbGwgb2YgaXQgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoc2l6ZV9zZWN0aW9uLCAoYWJmZCwgaWR4KSwKLSAgICAgICBiZmQgKiBhYmZkIEFORAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHVuc2lnbmVkIGludCBzaXplID0gMDsKLSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baWR4XS5mcmFnX3Jvb3Q7Ci0gIHdoaWxlIChmcmFnKQotICAgIHsKLSAgICAgIGlmIChmcmFnLT5mcl9hZGRyZXNzICE9IHNpemUpCi0JewotCSAgcHJpbnRmIChfKCJPdXQgb2Ygc3RlcFxuIikpOwotCSAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7Ci0JfQotICAgICAgc2l6ZSArPSBmcmFnLT5mcl9maXg7Ci0gICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JewotCWNhc2UgcnNfZmlsbDoKLQljYXNlIHJzX29yZzoKLQkgIHNpemUgKz0gZnJhZy0+ZnJfb2Zmc2V0ICogZnJhZy0+ZnJfdmFyOwotCSAgYnJlYWs7Ci0JY2FzZSByc19hbGlnbjoKLQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JICB7Ci0JICAgIGFkZHJlc3NUIG9mZjsKLQotCSAgICBvZmYgPSByZWxheF9hbGlnbiAoc2l6ZSwgZnJhZy0+ZnJfb2Zmc2V0KTsKLQkgICAgaWYgKGZyYWctPmZyX3N1YnR5cGUgIT0gMCAmJiBvZmYgPiBmcmFnLT5mcl9zdWJ0eXBlKQotCSAgICAgIG9mZiA9IDA7Ci0JICAgIHNpemUgKz0gb2ZmOwotCSAgfQotCX0KLSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotICAgIH0KLSAgaWYgKHNpemUpCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IHNlZ21lbnRfaW5mb1tpZHhdLm5hbWU7Ci0gICAgICBpZiAobmFtZSA9PSAoY2hhciAqKSBOVUxMKQotCXsKLQkgIG5hbWUgPSAiLmRhdGEiOwotCX0KLSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnVzZXJfc3R1ZmYgPSAoY2hhciAqKSAoc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSkpOwotICAgICAgLyogTWFrZSBpdCBvdXRwdXQgdGhyb3VnaCBpdHNlbGYgKi8KLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0gICAgICBzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBzaXplKTsKLSAgICB9Ci19Ci0KLS8qIHJ1biB0aHJvdWdoIGEgZnJhZyBjaGFpbiBhbmQgd3JpdGUgb3V0IHRoZSBkYXRhIHRvIGdvIHdpdGggaXQgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZmlsbF9zZWN0aW9uLCAoYWJmZCwgaWR4KSwKLSAgICAgICBiZmQgKiBhYmZkIEFORAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIGFzZWN0aW9uICpzZWMgPSBzZWdtZW50X2luZm9baWR4XS51c2VyX3N0dWZmOwotICBpZiAoc2VjKQotICAgIHsKLSAgICAgIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2lkeF0uZnJhZ19yb290OwotICAgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0gICAgICB3aGlsZSAoZnJhZykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgZmlsbF9zaXplOwotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgcnNfZmlsbDoKLQkgICAgY2FzZSByc19hbGlnbjoKLQkgICAgY2FzZSByc19vcmc6Ci0JICAgICAgaWYgKGZyYWctPmZyX2ZpeCkKLQkJewotCQkgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCQkJICAgIHNlYywKLQkJCQkJICAgIGZyYWctPmZyX2xpdGVyYWwsCi0JCQkJCSAgICBmcmFnLT5mcl9hZGRyZXNzLAotCQkJCQkgICAgZnJhZy0+ZnJfZml4KTsKLQkJfQotCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7Ci0JICAgICAgZmlsbF9zaXplID0gZnJhZy0+ZnJfdmFyOwotCSAgICAgIGlmIChmaWxsX3NpemUpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgb2ZmID0gZnJhZy0+ZnJfZml4OwotCQkgIGZvciAoY291bnQgPSBmcmFnLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkJCWZyYWctPmZyX2xpdGVyYWwgKwotCQkJCQkJZnJhZy0+ZnJfZml4LAotCQkJCQkJZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiwKLQkJCQkJCWZpbGxfc2l6ZSk7Ci0JCSAgICAgIG9mZiArPSBmaWxsX3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0JfQotICAgIH0KLX0KLQotLyogQ291bnQgdGhlIHJlbG9jYXRpb25zIGluIGEgY2hhaW4gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotREVGVU4gKGNvdW50X2VudHJpZXNfaW5fY2hhaW4sIChpZHgpLAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIHVuc2lnbmVkIGludCBucmVsb2NzOwotICBmaXhTICpmaXh1cF9wdHI7Ci0KLSAgLyogQ291bnQgdGhlIHJlbG9jYXRpb25zICovCi0gIGZpeHVwX3B0ciA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OwotICBucmVsb2NzID0gMDsKLSAgd2hpbGUgKGZpeHVwX3B0ciAhPSAoZml4UyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZpeHVwX3B0ciA9IGZpeHVwX3B0ci0+ZnhfbmV4dDsKLSAgICAgIG5yZWxvY3MrKzsKLSAgICB9Ci0gIHJldHVybiBucmVsb2NzOwotfQotCi0vKiBvdXRwdXQgYWxsIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uICovCi12b2lkCi1ERUZVTiAoZG9fcmVsb2NzX2ZvciwgKGlkeCksCi0gICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgdW5zaWduZWQgaW50IG5yZWxvY3M7Ci0gIGFyZWxlbnQgKipyZWxvY19wdHJfdmVjdG9yOwotICBhcmVsZW50ICpyZWxvY192ZWN0b3I7Ci0gIGFzeW1ib2wgKipwdHJzOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IChhc2VjdGlvbiAqKSAoc2VnbWVudF9pbmZvW2lkeF0udXNlcl9zdHVmZik7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaXhTICpmcm9tOwotICBpZiAoc2VjdGlvbikKLSAgICB7Ci0gICAgICBucmVsb2NzID0gY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KTsKLQotICAgICAgcmVsb2NfcHRyX3ZlY3RvciA9IChhcmVsZW50ICoqKSBtYWxsb2MgKChucmVsb2NzICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICAgICAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKikgbWFsbG9jIChucmVsb2NzICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICBwdHJzID0gKGFzeW1ib2wgKiopIG1hbGxvYyAobnJlbG9jcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBmcm9tID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnJlbG9jczsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnRvID0gcmVsb2NfdmVjdG9yICsgaTsKLQkgIGFzeW1ib2wgKnM7Ci0JICByZWxvY19wdHJfdmVjdG9yW2ldID0gdG87Ci0JICB0by0+aG93dG8gPSAocmVsb2NfaG93dG9fdHlwZSAqKSAoZnJvbS0+Znhfcl90eXBlKTsKLQotI2lmIDAJICAvKiBXZSBjYW4ndCByZXByZXNlbnQgY29tcGxpY2F0ZWQgdGhpbmdzIGluIGEgcmVsb2MgeWV0ICovCi0JICBpZiAoZnJvbS0+ZnhfYWRkc3kgPT0gMCB8fCBmcm9tLT5meF9zdWJzeSAhPSAwKSBhYm9ydCgpOwotI2VuZGlmCi0KLQkgIHMgPSAmKGZyb20tPmZ4X2FkZHN5LT5zeV9zeW1ib2wuc3kpOwotCSAgdG8tPmFkZHJlc3MgPSAoKGNoYXIgKikgKGZyb20tPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKwotCQkJCSAgIGZyb20tPmZ4X3doZXJlKSkKLQkgICAgLSAoKGNoYXIgKikgKCYoZnJvbS0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCkpKTsKLQkgIHRvLT5hZGRlbmQgPSBmcm9tLT5meF9vZmZzZXQ7Ci0JICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgd2hpY2ggd2Ugd2FudCB0byByZWxvY2F0ZSB0bywgdHVybgotCSAgICAgdGhpcyByZWxvYWN0aW9uIGludG8gYSBzZWN0aW9uIHJlbGF0aXZlLgotCi0JICAgICBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcGNyZWxhdGl2ZSwgYW5kIHdlIGtub3cgdGhlCi0JICAgICBkZXN0aW5hdGlvbiwgd2Ugc3RpbGwgd2FudCB0byBrZWVwIHRoZSByZWxvY2F0aW9uIC0gc2luY2UKLQkgICAgIHRoZSBsaW5rZXIgbWlnaHQgcmVsYXggc29tZSBvZiB0aGUgYnl0ZXMsIGJ1dCBpdCBzdG9wcwotCSAgICAgYmVpbmcgcGMgcmVsYXRpdmUgYW5kIHR1cm5zIGludG8gYW4gYWJzb2x1dGUgcmVsb2NhdGlvbi4gKi8KLQkgIGlmIChzKQotCSAgICB7Ci0JICAgICAgaWYgKChzLT5mbGFncyAmIEJTRl9VTkRFRklORUQpID09IDApCi0JCXsKLQkJICB0by0+c2VjdGlvbiA9IHMtPnNlY3Rpb247Ci0KLQkJICAvKiBXZSBjYW4gcmVmZXIgZGlyZWN0bHkgdG8gdGhlIHZhbHVlIGZpZWxkIGhlcmUsCi0JCSAgICAgcmF0aGVyIHRoYW4gdXNpbmcgU19HRVRfVkFMVUUsIGJlY2F1c2UgdGhpcyBpcwotCQkgICAgIG9ubHkgY2FsbGVkIGFmdGVyIGRvX3N5bWJvbHMsIHdoaWNoIHNldHMgdXAgdGhlCi0JCSAgICAgdmFsdWUgZmllbGQuICAqLwotCQkgIHRvLT5hZGRlbmQgKz0gcy0+dmFsdWU7Ci0KLQkJICB0by0+c3ltX3B0cl9wdHIgPSAwOwotCQkgIGlmICh0by0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIHBjcmVsIHJlbG9jYXRpb24sIHRoZSBhZGRlbmQgc2hvdWxkIGJlIGFkanVzdGVkICovCi0JCSAgICAgIHRvLT5hZGRlbmQgLT0gdG8tPmFkZHJlc3MgKyAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdG8tPnNlY3Rpb24gPSAwOwotCQkgICpwdHJzID0gJihmcm9tLT5meF9hZGRzeS0+c3lfc3ltYm9sLnN5KTsKLQkJICB0by0+c3ltX3B0cl9wdHIgPSBwdHJzOwotCi0JCSAgaWYgKHRvLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgcGNyZWwgcmVsb2NhdGlvbiwgdGhlIGFkZGVuZCBzaG91bGQgYmUgYWRqdXN0ZWQgKi8KLQkJICAgICAgdG8tPmFkZGVuZCAtPSB0by0+YWRkcmVzcyAtIDE7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB0by0+c2VjdGlvbiA9IDA7Ci0JICAgIH0KLQotCSAgcHRycysrOwotCSAgZnJvbSA9IGZyb20tPmZ4X25leHQ7Ci0JfQotCi0gICAgICAvKiBhdHRhdGNoIHRvIHRoZSBzZWN0aW9uICovCi0gICAgICBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9IHJlbG9jX3B0cl92ZWN0b3I7Ci0gICAgICBzZWN0aW9uLT5yZWxvY19jb3VudCA9IG5yZWxvY3M7Ci0gICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfTE9BRDsKLSAgICB9Ci19Ci0KLS8qIGRvIHRoZSBzeW1ib2xzLi4gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZG9fc3ltYm9scywgKGFiZmQpLAotICAgICAgIGJmZCAqIGFiZmQpCi17Ci0gIGV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci0gIHN5bWJvbFMgKnB0cjsKLSAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfdmVjOwotICBhc3ltYm9sICpzeW1ib2xfdmVjOwotICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLQotICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsKLSAgICAgICBwdHIgIT0gKHN5bWJvbFMgKikgTlVMTDsKLSAgICAgICBwdHIgPSBwdHItPnN5X25leHQpCi0gICAgewotICAgICAgaWYgKFNFR19OT1JNQUwgKHB0ci0+c3lfc3ltYm9sLnNlZykpCi0JewotCSAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9Ci0JICAgIChhc2VjdGlvbiAqKSAoc2VnbWVudF9pbmZvW3B0ci0+c3lfc3ltYm9sLnNlZ10udXNlcl9zdHVmZik7Ci0JICBTX1NFVF9WQUxVRSAocHRyLCBTX0dFVF9WQUxVRSAocHRyKSArIHB0ci0+c3lfZnJhZy0+ZnJfYWRkcmVzcyk7Ci0JICBpZiAocHRyLT5zeV9zeW1ib2wuc3kuZmxhZ3MgPT0gMCkKLQkgICAgewotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAocHRyLT5zeV9zeW1ib2wuc2VnKQotCSAgICB7Ci0JICAgIGNhc2UgU0VHX0FCU09MVVRFOgotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzIHw9IEJTRl9BQlNPTFVURTsKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5zZWN0aW9uID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTRUdfVU5LTk9XTjoKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5mbGFncyA9IEJTRl9VTkRFRklORUQ7Ci0JICAgICAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBwdHItPnN5X3N5bWJvbC5zeS52YWx1ZSA9IFNfR0VUX1ZBTFVFIChwdHIpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gIHN5bWJvbF9wdHJfdmVjID0gKGFzeW1ib2wgKiopIG1hbGxvYyAoKGNvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIGluZGV4ID0gMDsKLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICAgcHRyICE9IChzeW1ib2xTICopIE5VTEw7Ci0gICAgICAgcHRyID0gcHRyLT5zeV9uZXh0KQotICAgIHsKLSAgICAgIHN5bWJvbF9wdHJfdmVjW2luZGV4XSA9ICYocHRyLT5zeV9zeW1ib2wuc3kpOwotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gIHN5bWJvbF9wdHJfdmVjW2luZGV4XSA9IDA7Ci0gIGFiZmQtPm91dHN5bWJvbHMgPSBzeW1ib2xfcHRyX3ZlYzsKLSAgYWJmZC0+c3ltY291bnQgPSBjb3VudDsKLX0KLQotLyogVGhlIGdlbmVyaWMgYXMtPmJmZCBjb252ZXJ0ZXIuIE90aGVyIGJhY2tlbmRzIG1heSBoYXZlIHNwZWNpYWwgY2FzZQotICAgY29kZSAqLwotCi12b2lkCi1ERUZVTl9WT0lEIChiZmRfYXNfd3JpdGVfaG9vaykKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBzaXplX3NlY3Rpb24gKGFiZmQsIGkpOwotICAgIH0KLQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgZmlsbF9zZWN0aW9uIChhYmZkLCBpKTsKLQotICBkb19zeW1ib2xzIChhYmZkKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIGRvX3JlbG9jc19mb3IgKGkpOwotCi19Ci0KLVNfU0VUX1NFR01FTlQgKHgsIHkpCi0gICAgIHN5bWJvbFMgKng7Ci0gICAgIGludCB5OwotewotICB4LT5zeV9zeW1ib2wuc2VnID0geTsKLX0KLQotU19JU19ERUZJTkVEICh4KQotICAgICBzeW1ib2xTICp4OwotewotICBpZiAoU0VHX05PUk1BTCAoeC0+c3lfc3ltYm9sLnNlZykpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBzd2l0Y2ggKHgtPnN5X3N5bWJvbC5zZWcpCi0gICAgewotICAgIGNhc2UgU0VHX1VOS05PV046Ci0gICAgICByZXR1cm4gMDsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1TX0lTX0VYVEVSTkFMICh4KQotewotICBhYm9ydCAoKTsKLX0KLQotU19HRVRfREVTQyAoeCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLVNfR0VUX1NFR01FTlQgKHgpCi0gICAgIHN5bWJvbFMgKng7Ci17Ci0gIHJldHVybiB4LT5zeV9zeW1ib2wuc2VnOwotfQotCi1TX1NFVF9FWFRFUk5BTCAoeCkKLSAgICAgc3ltYm9sUyAqeDsKLXsKLSAgeC0+c3lfc3ltYm9sLnN5LmZsYWdzIHw9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOwotfQotCi1TX1NFVF9OQU1FICh4LCB5KQotICAgICBzeW1ib2xTICp4OwotICAgICBjaGFyICp5OwotewotICB4LT5zeV9zeW1ib2wuc3kubmFtZSA9IHk7Ci19Ci0KLVNfR0VUX09USEVSICh4KQotewotICBhYm9ydCAoKTsKLX0KLQotU19JU19ERUJVRyAoeCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLSNpZm5kZWYgc2VnbWVudF9uYW1lCi1jaGFyICoKLXNlZ21lbnRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfaWVlZV9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGV4dGVybiBjaGFyIGlzX2VuZF9vZl9saW5lW107Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKnMgPSBwOwotICBpbnQgaTsKLSAgLyogTG9vayB1cCB0aGUgbmFtZSwgaWYgaXQgZG9lc24ndCBleGlzdCwgbWFrZSBpdCAqLwotICB3aGlsZSAoKnAgJiYgKnAgIT0gJyAnICYmICpwICE9ICcsJyAmJiAhaXNfZW5kX29mX2xpbmVbKnBdKQotICAgIHsKLSAgICAgIHArKzsKLSAgICB9Ci0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpXS5oYWRvbmUpCi0JewotCSAgaWYgKHN0cm5jbXAgKHNlZ21lbnRfaW5mb1tpXS5uYW1lLCBzLCBwIC0gcykgPT0gMCkKLQkgICAgewotCSAgICAgIGdvdG8gb2s7Ci0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlicmVhazsKLSAgICB9Ci0gIGlmIChpID09IFNFR19VTktOT1dOKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgc2VjdGlvbnMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlZ21lbnRfaW5mb1tpXS5oYWRvbmUgPSAxOwotICBzZWdtZW50X2luZm9baV0ubmFtZSA9IG1hbGxvYyAocCAtIHMgKyAxKTsKLSAgbWVtY3B5IChzZWdtZW50X2luZm9baV0ubmFtZSwgcywgcCAtIHMpOwotICBzZWdtZW50X2luZm9baV0ubmFtZVtwIC0gc10gPSAwOwotb2s6Ci0gIHN1YnNlZ19zZXQgKGksIDApOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWypwXSkKLSAgICBwKys7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0KLX0KLQotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfaWdub3JlICgpOwotCi0KLXZvaWQgc19nbG9ibCAoKTsKLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7InNlY3Rpb24iLCBvYmpfaWVlZV9zZWN0aW9uLCAwfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJleHBvcnQiLCBzX2dsb2JsLCAwfSwKLSAgeyJvcHRpb24iLCBzX2lnbm9yZSwgMH0sCi0gIHsiZW5kIiwgc19pZ25vcmUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJzZGF0YSIsIHN0cmluZ2VyLCAwfSwKLSAgMCwKLQotfTsKLQotCi0KLXZvaWQKLW9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIHN5bWJvbFAtPnN5X3N5bWJvbC5zeS50aGVfYmZkID0gYWJmZDsKLX0KLQotCi0KLQotCi0jaWYgMQotZXh0ZXJuIHZvaWQKLURFRlVOX1ZPSUQgKHdyaXRlX29iamVjdF9maWxlKQotewotICBpbnQgaTsKLSAgc3RydWN0IGZyY2hhaW4gKmZyY2hhaW5fcHRyOwotICBzdHJ1Y3QgZnJhZyAqZnJhZ19wdHI7Ci0KLSAgYWJmZCA9IGJmZF9vcGVudyAob3V0X2ZpbGVfbmFtZSwgImllZWUiKTsKLQotICBpZiAoYWJmZCA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9oODMwMCwgMCk7Ci0gIHN1YnNlZ19zZXQgKDEsIDApOwotICBzdWJzZWdfc2V0ICgyLCAwKTsKLSAgc3Vic2VnX3NldCAoMywgMCk7Ci0gIGZvciAoZnJjaGFpbl9wdHIgPSBmcmNoYWluX3Jvb3Q7Ci0gICAgICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7Ci0gICAgICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ViLXNlZ21lbnRzIGFuZCBhbGlnbiB0aGVtIHVwLiBBbHNvIGNsb3NlIGFueQotCSBvcGVuIGZyYWdzLiBXZSB0YWNrIGEgLmZpbGwgb250byB0aGUgZW5kIG9mIHRoZSBmcmFnIGNoYWluIHNvCi0JIHRoYXQgYW55IC5hbGlnbidzIHNpemUgY2FuIGJlIHdvcmtlZCBieSBsb29raW5nIGF0IHRoZSBuZXh0Ci0JIGZyYWcuICAqLwotCi0gICAgICBzdWJzZWdfc2V0IChmcmNoYWluX3B0ci0+ZnJjaF9zZWcsIGZyY2hhaW5fcHRyLT5mcmNoX3N1YnNlZyk7Ci0jaWZuZGVmIFNVQl9TRUdNRU5UX0FMSUdOCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotI2VuZGlmCi0gICAgICBmcmFnX2FsaWduIChTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksIDAsIDApOwotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25vdy0+ZnJfZml4ID0gMDsKLSAgICAgIGtub3cgKGZyYWdfbm93LT5mcl9uZXh0ID09IE5VTEwpOwotICAgIH0KLQotICAvKiBOb3cgYnVpbGQgb25lIGJpZyBmcmFnIGNoYWluIGZvciBlYWNoIHNlZ21lbnQsIGxpbmtlZCB0aHJvdWdoCi0JICAgZnJfbmV4dC4gKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0KLSAgICAgIGZyYWdTICoqcHJldl9mcmFnX3B0cl9wdHI7Ci0gICAgICBzdHJ1Y3QgZnJjaGFpbiAqbmV4dF9mcmNoYWluX3B0cjsKLQotICAgICAgLyoJc3RydWN0IGZyYWcgKipoZWFkX3B0ciA9IHNlZ21lbnRfaW5mb1tpXS5mcmFnX3Jvb3Q7Ki8KLQotICAgICAgc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdCA9IHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290OwotI2lmIDAKLSAgICAgIC8qIEltIG5vdCBzdXJlIHdoYXQgdGhpcyBpcyBmb3IgKi8KLSAgICAgIGZvciAoZnJjaGFpbl9wdHIgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgICBmcmNoYWluX3B0ciAhPSAoc3RydWN0IGZyY2hhaW4gKikgTlVMTDsKLQkgICBmcmNoYWluX3B0ciA9IGZyY2hhaW5fcHRyLT5mcmNoX25leHQpCi0JewotCSAgKmhlYWRfcHRyID0gZnJjaGFpbl9wdHI7Ci0JICBoZWFkX3B0ciA9ICZmcmNoYWluX3B0ci0+bmV4dDsKLQl9Ci0KLQotI2VuZGlmCi0gICAgfQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgcmVsYXhfc2VnbWVudCAoc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdCwgaSk7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgYWRkcmVzc2VzIG9mIHRoZSBmcmFncyBhcmUgY29ycmVjdCB3aXRoaW4gdGhlIHNlZ21lbnQgKi8KLQotICBiZmRfYXNfd3JpdGVfaG9vayAoKTsKLSAgYmZkX2Nsb3NlIChhYmZkKTsKLX0KLQotI2VuZGlmCi0KLUhfU0VUX1RFWFRfU0laRSAoYSwgYikKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfR0VUX1RFWFRfU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9TRVRfQlNTX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfU0VUX1NUUklOR19TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfU0VUX01BR0lDX05VTUJFUiAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9HRVRfRklMRV9TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotLyogZW5kIG9mIG9iai1pZWVlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWllZWUuaCBiL2dhcy9jb25maWcvb2JqLWllZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZjEyNi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1pZWVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWllZWUuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJGRCAxCi0KLSNpbmNsdWRlIDxiZmQuaD4KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYXN5bWJvbCBzeTsKLSAgaW50IHNlZzsKLX0KLQotb2JqX3N5bWJvbF90eXBlOwotCi0jZGVmaW5lIFNfR0VUX05BTUUocykgKCgocyktPnN5X3N5bWJvbC5zeS5uYW1lKSkKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGludCB4OwotICB9Ci0KLW9iamVjdF9oZWFkZXJzOwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAxCi0KLQotaW50IGxpbmVub19yb290UDsKLQotCi0jZGVmaW5lIElFRUVfU1RZTEUKLQotLyogZW5kIG9mIG9iai1pZWVlLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLW11bHRpLmMgYi9nYXMvY29uZmlnL29iai1tdWx0aS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTE1MDkzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLW11bHRpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIGZvbyAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuaCBiL2dhcy9jb25maWcvb2JqLW11bHRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZTFmOTIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIGhpICovCi0KLSNpbmNsdWRlICJlbXVsLmgiCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SCQkJCQlcCi0JKHRoaXNfZm9ybWF0LT5mbGF2b3IpCi0KLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUCkJCQkJXAotCSh0aGlzX2Zvcm1hdC0+ZnJvYl9zeW1ib2wpIChTLCAmKFApKQotCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGUoKQkJCQkJXAotCSh0aGlzX2Zvcm1hdC0+ZnJvYl9maWxlCQkJCVwKLQkgPyB0aGlzX2Zvcm1hdC0+ZnJvYl9maWxlICgpCQkJXAotCSA6ICh2b2lkKSAwKQotCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCQkJXAotCSh0aGlzX2Zvcm1hdC0+ZnJvYl9maWxlX2FmdGVyX3JlbG9jcykKLQotI2RlZmluZSBvYmpfZWNvZmZfc2V0X2V4dAkJCQlcCi0JKHRoaXNfZm9ybWF0LT5lY29mZl9zZXRfZXh0KQotCi0jZGVmaW5lIG9ial9wb3BfaW5zZXJ0CQkJCQlcCi0JKHRoaXNfZm9ybWF0LT5wb3BfaW5zZXJ0KQotCi0jZGVmaW5lIG9ial9yZWFkX2JlZ2luX2hvb2soKQkJCQlcCi0JKHRoaXNfZm9ybWF0LT5yZWFkX2JlZ2luX2hvb2sJCQlcCi0JID8gdGhpc19mb3JtYXQtPnJlYWRfYmVnaW5faG9vayAoKQkJXAotCSA6ICh2b2lkKSAwKQotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2sJCQkJXAotCSh0aGlzX2Zvcm1hdC0+c3ltYm9sX25ld19ob29rKQotCi0jZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwkJCVwKLQkodGhpc19mb3JtYXQtPnNlY19zeW1fb2tfZm9yX3JlbG9jKQotCi0jZGVmaW5lIFNfR0VUX1NJWkUJCQkJCVwKLQkodGhpc19mb3JtYXQtPnNfZ2V0X3NpemUpCi0KLSNkZWZpbmUgU19TRVRfU0laRQkJCQkJXAotCSh0aGlzX2Zvcm1hdC0+c19zZXRfc2l6ZSkKLQotI2RlZmluZSBTX0dFVF9BTElHTgkJCQkJXAotCSh0aGlzX2Zvcm1hdC0+c19nZXRfYWxpZ24pCi0KLSNkZWZpbmUgU19TRVRfQUxJR04JCQkJCVwKLQkodGhpc19mb3JtYXQtPnNfc2V0X2FsaWduKQotCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKGQscykJCQlcCi0JKHRoaXNfZm9ybWF0LT5jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzCQlcCi0JID8gdGhpc19mb3JtYXQtPmNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgKGQsIHMpCVwKLQkgOiAodm9pZCkgMCkKLQotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKFNFRyxXLFMsVCxPLEQpCQkJXAotCSh0aGlzX2Zvcm1hdC0+cHJvY2Vzc19zdGFiCQkJXAotCSA/IHRoaXNfZm9ybWF0LT5wcm9jZXNzX3N0YWIgKFNFRyxXLFMsVCxPLEQpCVwKLQkgOiAodm9pZCkgMCkKLQotI2lmIGRlZmluZWQgKE9CSl9NQVlCRV9FQ09GRikgfHwgKGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpICYmIGRlZmluZWQgKFRDX01JUFMpKQotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfTUFZQkVfRUxGCi0vKiBXZSBuZWVkIG9iai1lbGYgZm9yIE9CSl9TWU1GSUVMRF9UWVBFIHNvIHRoYXQgc3ltYm9sX2dldF9vYmogaXMgZGVmaW5lZCAqLwotI2luY2x1ZGUgIm9iai1lbGYuaCIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotc29tLmMgYi9nYXMvY29uZmlnL29iai1zb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZjE4Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1zb20uYworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKiBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogU09NIGRvZXMgbm90IG5lZWQgYW55IHBzZXVkby1vcHMuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAge05VTEx9Ci19OwotCi1zdGF0aWMgaW50IHZlcnNpb25fc2VlbiA9IDA7Ci1zdGF0aWMgaW50IGNvcHlyaWdodF9zZWVuID0gMDsKLXN0YXRpYyBpbnQgY29tcGlsZXJfc2VlbiA9IDA7Ci0KLS8qIFVudXNlZCBieSBTT00uICAqLwotdm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rICgpIHt9Ci0KLS8qIEhhbmRsZSBhIC5jb21waWxlciBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byBjcmVhdGUgdGhlCi0gICBjb21waWxhdGlvbiB1bml0IGF1eGlsaWFyeSBoZWFkZXIgZm9yIE1QRSBzdWNoIHRoYXQgdGhlIGxpbmtlZGl0b3IKLSAgIGNhbiBoYW5kbGUgU09NIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlcy4gVGhlIGZvcm1hdCBvZiB0aGUgcXVvdGVkCi0gICBzdHJpbmcgaXMgInNvdXJjZWZpbGUgbGFuZ3VhZ2UgdmVyc2lvbiIgYW5kIGlzIGRlbGltaXRlZCBieSBibGFua3MuKi8KLQotdm9pZAotb2JqX3NvbV9jb21waWxlciAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpidWY7Ci0gIGNoYXIgYzsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKmxhbmd1YWdlX25hbWU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnZlcnNpb25faWQ7Ci0KLSAgaWYgKGNvbXBpbGVyX3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkICgiT25seSBvbmUgLmNvbXBpbGVyIHBzZXVkby1vcCBwZXIgZmlsZSEiKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKLSAgICB7Ci0gICAgICBidWYgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlIChpc19hX2NoYXIgKG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMDAwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBQYXJzZSB0aGUgcXVvdGVkIHN0cmluZyBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuICBTa2lwIHRoZQotICAgICBxdW90ZS4gICovCi0gIGZpbGVuYW1lID0gYnVmICsgMTsKLSAgcCA9IGZpbGVuYW1lOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykKLSAgICBwKys7Ci0gIGlmICgqcCA9PSAnXDAwMCcpCi0gICAgewotICAgICAgYXNfYmFkICgiLmNvbXBpbGVyIGRpcmVjdGl2ZSBtaXNzaW5nIGxhbmd1YWdlIGFuZCB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICBsYW5ndWFnZV9uYW1lCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykgcCsrOwotICBpZiAoKnAgPT0gJ1wwMDAnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIi5jb21waWxlciBkaXJlY3RpdmUgbWlzc2luZyB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICB2ZXJzaW9uX2lkCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJ1wwMDAnKSBwKys7Ci0gIC8qIFJlbW92ZSB0aGUgdHJhaWxpbmcgcXVvdGUuICAqLwotICAqKC0tcCkgPSAnXDAwMCc7Ci0KLSAgY29tcGlsZXJfc2VlbiA9IDE7Ci0gIGlmICghIGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXQgKHN0ZG91dHB1dCwgZmlsZW5hbWUsIGxhbmd1YWdlX25hbWUsCi0JCQkJCSAiR05VIFRvb2xzIiwgdmVyc2lvbl9pZCkpCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBhc19mYXRhbCAoIkZBVEFMOiBBdHRhY2hpbmcgY29tcGlsZXIgaGVhZGVyICVzIiwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnZlcnNpb24gZGlyZWN0aXZlLiAgKi8KLQotdm9pZAotb2JqX3NvbV92ZXJzaW9uICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKnZlcnNpb24sIGM7Ci0KLSAgaWYgKHZlcnNpb25fc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgdmVyc2lvbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKGlzX2FfY2hhciAobmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwMDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZlcnNpb25fc2VlbiA9IDE7Ci0gIGlmIChiZmRfc29tX2F0dGFjaF9hdXhfaGRyIChzdGRvdXRwdXQsIFZFUlNJT05fQVVYX0lELCB2ZXJzaW9uKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmNvcHlyaWdodCBkaXJlY3RpdmUuICAgVGhpcyBwcm9iYWJseSBpc24ndCBjb21wbGV0ZSwgYnV0Ci0gICBpdCdzIG9mIGR1YmlvdXMgdmFsdWUgYW55d2F5IGFuZCAoSU1ITykgbm90IHdvcnRoIHRoZSB0aW1lIHRvIGZpbmlzaC4KLSAgIElmIHlvdSBjYXJlIGFib3V0IGNvcHlyaWdodCBzdHJpbmdzIHRoYXQgbXVjaCwgeW91IGZpeCBpdC4gICovCi0KLXZvaWQKLW9ial9zb21fY29weXJpZ2h0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKmNvcHlyaWdodCwgYzsKLQotICBpZiAoY29weXJpZ2h0X3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJPbmx5IG9uZSAuY29weXJpZ2h0IHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgY29weXJpZ2h0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAwMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29weXJpZ2h0X3NlZW4gPSAxOwotICBpZiAoYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoc3Rkb3V0cHV0LCBDT1BZUklHSFRfQVVYX0lELCBjb3B5cmlnaHQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+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+UHNlY3RfSW5kZXggPSBDdG9yc19Qc2VjdDsKLSAgICB9Ci0KLSAgaWYgKER0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpwc19uYW1lID0gIiRkdG9ycyI7Ci0gICAgICBEdG9yc19Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKHBzX25hbWUsIER0b3JzX1N5bWJvbHMtPlBzZWN0X09mZnNldCArIFhUT1JfU0laRSwKLQkJICAgICAgcHNfRFRPUlMsIDApOwotICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAocHNfbmFtZSwgRHRvcnNfUHNlY3QsCi0JCQkJICAwLCBHQkxTWU1fREVGfEdCTFNZTV9XRUFLKTsKLSAgICAgIGZvciAodnNwID0gRHRvcnNfU3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0JdnNwLT5Qc2VjdF9JbmRleCA9IER0b3JzX1BzZWN0OwotICAgIH0KLQotICAvKioqKioqKiAgVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiBSZWNvcmRzICAqKioqKioqLwotCi0gIC8qCi0gICAqCVdyaXRlIHRoZSB0ZXh0IHNlZ21lbnQgZGF0YQotICAgKi8KLSAgaWYgKHRleHRfc2l6ID4gMCkKLSAgICB2bXNfZml4dXBfdGV4dF9zZWN0aW9uICh0ZXh0X3NpeiwgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KTsKLSAgLyoKLSAgICoJV3JpdGUgdGhlIGRhdGEgc2VnbWVudCBkYXRhLCB0aGVuIGRpc2NhcmQgaXQuCi0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwKQotICAgIHsKLSAgICAgIHZtc19maXh1cF9kYXRhX3NlY3Rpb24gKGRhdGFfc2l6LCB0ZXh0X3Npeik7Ci0gICAgICBmcmVlIChEYXRhX1NlZ21lbnQpLCAgRGF0YV9TZWdtZW50ID0gMDsKLSAgICB9Ci0KLSAgaWYgKEN0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoQ3RvcnNfU3ltYm9scywgQ3RvcnNfUHNlY3QpOwotICAgIH0KLQotICBpZiAoRHRvcnNfU3ltYm9scyAhPSAwKQotICAgIHsKLSAgICAgIHZtc19maXh1cF94dG9yc19zZWN0aW9uIChEdG9yc19TeW1ib2xzLCBEdG9yc19Qc2VjdCk7Ci0gICAgfQotCi0KLSAgLyoqKioqKiogIERlYnVnZ2VyIFN5bWJvbCBUYWJsZSBSZWNvcmRzICAqKioqKioqLwotCi0gIHZtc19idWlsZF9EU1QgKHRleHRfc2l6KTsKLQotCi0gIC8qKioqKioqICBXcmFwIHRoaW5ncyB1cCAgKioqKioqKi8KLQotICAvKgotICAgKglXcml0ZSB0aGUgRW5kIE9mIE1vZHVsZSByZWNvcmQKLSAgICovCi0gIGlmIChFbnRyeV9Qb2ludF9TeW1ib2wpCi0gICAgV3JpdGVfVk1TX0VPTV9SZWNvcmQgKFRleHRfUHNlY3QsIFNfR0VUX1ZBTFVFIChFbnRyeV9Qb2ludF9TeW1ib2wpKTsKLSAgZWxzZQotICAgIFdyaXRlX1ZNU19FT01fUmVjb3JkICgtMSwgKHZhbHVlVCkgMCk7Ci0KLSAgLyoKLSAgICoJQWxsIGRvbmUsIGNsb3NlIHRoZSBvYmplY3QgZmlsZQotICAgKi8KLSAgQ2xvc2VfVk1TX09iamVjdF9GaWxlICgpOwotfQotCi0vKiBlbmQgb2Ygb2JqLXZtcy5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai12bXMuaCBiL2dhcy9jb25maWcvb2JqLXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhmZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUxICswLDAgQEAKLS8qIFZNUyBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKiBUYWcgdG8gdmFsaWRhdGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgT0JKX1ZNUyAxCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jZGVmaW5lIExPTkdXT1JEX0FMSUdOTUVOVAkyCi0KLS8qIFRoaXMgbWFjcm8gY29udHJvbHMgc3Vic2VjdGlvbiBhbGlnbm1lbnQgd2l0aGluIGEgc2VjdGlvbi4KLSAqCi0gKiBVbmRlciBWQVgvVk1TLCB0aGUgbGlua2VyIChhbmQgUFNFQ1Qgc3BlY2lmaWNhdGlvbnMpCi0gKiB0YWtlIGNhcmUgb2YgY29ycmVjdGx5IGFsaWduaW5nIHRoZSBzZWdtZW50cy4KLSAqIERvaW5nIHRoZSBhbGlnbm1lbnQgaGVyZSAob24gaW5pdGlhbGl6ZWQgZGF0YSkgY2FuCi0gKiBtZXNzIHVwIHRoZSBjYWxjdWxhdGlvbiBvZiBnbG9iYWwgZGF0YSBQU0VDVCBzaXplcy4KLSAqLwotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpCVwKLQkJKCgoU0VHKSA9PSBkYXRhX3NlY3Rpb24pID8gMCA6IExPTkdXT1JEX0FMSUdOTUVOVCkKLQotLyogVGhpcyBmbGFnIGlzIHVzZWQgdG8gcmVtZW1iZXIgd2hldGhlciB3ZSBhcmUgaW4gdGhlIGNvbnN0IG9yIHRoZQotICAgZGF0YSBzZWN0aW9uLiAgQnkgYW5kIGxhcmdlIHRoZXkgYXJlIGlkZW50aWNhbCwgYnV0IHdlIHNldCBhIG5vLXdyaXRlCi0gICBiaXQgZm9yIHBzZWN0cyBpbiB0aGUgY29uc3Qgc2VjdGlvbi4gICovCi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGNvbnN0X2ZsYWc7Ci0KLS8qIFRoaXMgaXMgb3ZlcmxvYWRlZCBvbnRvIGNvbnN0X2ZsYWcsIGZvciBjb252ZW5pZW5jZS4gIEl0J3MgdXNlZCB0byBmbGFnCi0gICBkdW1teSBsYWJlbHMgbGlrZSAiZ2NjMl9jb21waWxlZC4iICB3aGljaCBvY2N1ciBiZWZvcmUgdGhlIGZpcnN0IC50ZXh0Ci0gICBvciAuZGF0YSBzZWN0aW9uIGRpcmVjdGl2ZS4gICovCi0KLSNkZWZpbmUgSU5fREVGQVVMVF9TRUNUSU9OIDB4ODAKLQotLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gb2JqLXZtcy5jLiAqLwotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsKLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotI3VuZGVmIE5PX1JFTE9DCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIE5PX1JFTE9DLCBSRUxPQ18zMgotICB9OwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSgwKQotI2RlZmluZSBOX1RYVE9GRih4KQkoIHNpemVvZihzdHJ1Y3QgZXhlYykgKQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQotLyogV2UgdXNlIHRoaXMgY29weSBvZiB0aGUgZXhlYyBoZWFkZXIgZm9yIFZNUy4gIFdlIGRvIG5vdCBhY3R1YWxseSB1c2UgaXQsIGJ1dAotICAgd2hhdCB3ZSBhY3R1YWxseSBkbyBpcyBsZXQgZ2FzIGZpbGwgaW4gdGhlIHJlbGV2YW50IHNsb3RzLCBhbmQgd2hlbiB3ZSBnZXQKLSAgIGFyb3VuZCB0byB3cml0aW5nIGFuIG9iaiBmaWxlLCB3ZSBqdXN0IHBpY2sgb3V0IHdoYXQgd2UgbmVlZC4gICovCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIGxvbmcgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV90cnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9kcnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9lbnRyeTsJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBleGVjIGhlYWRlcjsJCS8qIGEub3V0IGhlYWRlciAqLwotICAgIGxvbmcgc3RyaW5nX3RhYmxlX3NpemU7CS8qIG5hbWVzICsgJ1wwJyArIHNpemVvZihpbnQpICovCi0gIH0KLW9iamVjdF9oZWFkZXJzOwotCi0vKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gKiAodGhpcyBzdGFydGVkIGFzIGEgY2xvbmUgb2YgYm91dC5oJ3Mgbmxpc3QsIGJ1dCBtdWNoIHdhcyB1bm5lZWRlZCkuCi0gKi8KLXN0cnVjdCBubGlzdAotICB7Ci0gICAgY2hhciAqbl9uYW1lOwotICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIG5fb3RoZXI7CS8qIHVzZWQgZm9yIGNvbnN0X2ZsYWcgYW5kICJkZWZhdWx0IHNlY3Rpb24iICovCi0gICAgdW5zaWduZWQJOiAxNjsJCS8qIHBhZGRpbmcgZm9yIGFsaWdubWVudCAqLwotICAgIGludCBuX2Rlc2M7CQkJLyogc291cmNlIGxpbmUgbnVtYmVyIGZvciBOX1NMSU5FIHN0YWJzICovCi0gIH07Ci0KLS8qIExlZ2FsIHZhbHVlcyBvZiBuX3R5cGUgKHNlZSBhb3V0L3N0YWIuZGVmIGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIGNvZGVzKS4KLSAqLwotI2RlZmluZSBOX1VOREYJMAkJLyogVW5kZWZpbmVkIHN5bWJvbAkqLwotI2RlZmluZSBOX0FCUwkyCQkvKiBBYnNvbHV0ZSBzeW1ib2wJKi8KLSNkZWZpbmUgTl9URVhUCTQJCS8qIFRleHQgc3ltYm9sCQkqLwotI2RlZmluZSBOX0RBVEEJNgkJLyogRGF0YSBzeW1ib2wJCSovCi0jZGVmaW5lIE5fQlNTCTgJCS8qIEJTUyBzeW1ib2wJCSovCi0jZGVmaW5lIE5fRk4JMzEJCS8qIEZpbGVuYW1lIHN5bWJvbAkqLwotCi0jZGVmaW5lIE5fRVhUCTEJCS8qIEV4dGVybmFsIHN5bWJvbCAoT1InZCBpbiB3aXRoIG9uZSBvZiBhYm92ZSkJKi8KLSNkZWZpbmUgTl9UWVBFCTAzNgkJLyogTWFzayBmb3IgYWxsIHRoZSB0eXBlIGJpdHMJCQkqLwotCi0jZGVmaW5lIE5fU1RBQgkwMzQwCQkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotLyogU1lNQk9MIFRBQkxFICovCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgZGF0YSB0eXBlICovCi0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsJLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHN0cnVjdCBWTVNfU3ltYm9sICoKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKLQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgaXMgaW4gTl97VEVYVCxEQVRBLEJTUyxBQlN9IG9yIE5fRVhUICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKQkJKFNfR0VUX1RZUEUocykgIT0gTl9VTkRGKQotCi0jZGVmaW5lIFNfSVNfQ09NTU9OKHMpCShTX0dFVF9UWVBFKHMpID09IE5fVU5ERiAmJiBTX0dFVF9WQUxVRShzKSAhPSAwKQotCi0jZGVmaW5lIFNfSVNfUkVHSVNURVIocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9PSBOX1JFR0lTVEVSKQotCi0vKiBUcnVlIGlmIGEgZGVidWcgc3BlY2lhbCBzeW1ib2wgZW50cnkgKi8KLSNkZWZpbmUgU19JU19ERUJVRyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fU1RBQikKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbG9jYWwgc3ltYm9sIG5hbWUgKi8KLS8qIEEgc3ltYm9sIG5hbWUgd2hvc2UgbmFtZSBiZWdpbiB3aXRoIF5BIGlzIGEgZ2FzIGludGVybmFsIHBzZXVkbyBzeW1ib2wKLSAgIG5hbWVsZXNzIHN5bWJvbHMgY29tZSBmcm9tIC5zdGFiIGRpcmVjdGl2ZXMuICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykJCShTX0dFVF9OQU1FKHMpICYmIFwKLQkJCQkgIVNfSVNfREVCVUcocykgJiYgXAotCQkJCSAoc3RyY2hyKFNfR0VUX05BTUUocyksICdcMDAxJykgIT0gMCB8fCBcCi0JCQkJICBzdHJjaHIoU19HRVRfTkFNRShzKSwgJ1wwMDInKSAhPSAwIHx8IFwKLQkJCQkgIChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCi0jZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IChjaGFyICopMCkKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgocyktPnN5X3N5bWJvbC5uX25hbWUpCi0vKiBUaGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfR0VUX09GRlNFVChzKQkJKChzKS0+c3lfbmFtZV9vZmZzZXQpCi0vKiBUaGUgcmF3IHR5cGUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9SQVdfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSkKLS8qIFRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fVFlQRSkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKE5fVFlQRV9zZWdbU19HRVRfVFlQRShzKV0pCi0vKiBUaGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX09USEVSKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlcikKLS8qIFRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9ERVNDKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fbmFtZSA9ICh2KSkKLS8qIFNldCB0aGUgb2Zmc2V0IGluIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19TRVRfT0ZGU0VUKHMsdikJKChzKS0+c3lfbmFtZV9vZmZzZXQgPSAodikpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX1RZUEUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9ICh2KSkKLQotCi0vKiBGaWxlIGhlYWRlciBtYWNybyBhbmQgdHlwZSBkZWZpbml0aW9uICovCi0KLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX3RleHQgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19URVhULCAodikpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfZGF0YSA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX0RBVEEsICh2KSkpCi0jZGVmaW5lIEhfU0VUX0JTU19TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX2JzcyA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX0JTUywgKHYpKSkKLQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogXAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBubGlzdCkpCi0KLS8qIGxpbmUgbnVtYmVyaW5nIHN0dWZmLiAqLwotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9Ci0KLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayhzKQl7O30KLQotLyogRm9yY2Ugc3RydWN0dXJlIHRhZ3MgaW50byBzY29wZSBzbyB0aGF0IHRoZWlyIHVzZSBpbiBwcm90b3R5cGVzCi0gICB3aWxsIG5ldmVyIGJlIHRoZWlyIGZpcnN0IG9jY3VyYW5jZS4gICovCi1zdHJ1Y3QgZml4Owotc3RydWN0IGZyYWc7Ci0KLS8qIG9iai12bXMgcm91dGluZXMgdmlzaWJsZSB0byB0aGUgcmVzdCBvZiBnYXMuICAqLwotCi1leHRlcm4gdm9pZCB0Y19hb3V0X2ZpeF90b19jaGFycyBQQVJBTVMgKChjaGFyICosc3RydWN0IGZpeCAqLHJlbGF4X2FkZHJlc3NUKSk7Ci0KLWV4dGVybiBpbnQgdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oWCkJdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKFgpCi0KLS8qIENvbXBpbGVyLWdlbmVyYXRlZCBsYWJlbCAiX192YXhfZ19kb3VibGVzIiBpcyB1c2VkIHRvIGF1Z21lbnQgLnN0YWJzLiAqLwotZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSBvYmpfZnJvYl9sYWJlbChYKSB2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwoWCkKLQotZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9tYWluIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgdm1zX3dyaXRlX29iamVjdF9maWxlIFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkLHVuc2lnbmVkLAotCQkJCQkgICBzdHJ1Y3QgZnJhZyAqLHN0cnVjdCBmcmFnICopKTsKLQotLyogVk1TIGV4ZWN1dGFibGVzIGFyZSBub3RoaW5nIGxpa2UgYS5vdXQsIGJ1dCB0aGUgVk1TIHBvcnQgb2YgZ2NjIHVzZXMKLSAgIGEub3V0IGZvcm1hdCBzdGFicyB3aGljaCBvYmotdm1zLmMgdGhlbiB0cmFuc2xhdGVzLiAgKi8KLQotI2RlZmluZSBBT1VUX1NUQUJTCi0KLQwKLSNpZmRlZiBXQU5UX1ZNU19PQkpfREVGUwotCi0vKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIGNvbnN0YW50cyB1c2VkIHdpdGhpbgotICAgdGhlIGFjdHVhbCBWTVMgb2JqZWN0IGZpbGUuICBXZSBkbyBub3QgdXNlIGEgJCBpbiB0aGUgc3ltYm9scyAoYXMgcGVyCi0gICB1c3VhbCBWTVMgY29udmVudGlvbikgc2luY2UgU3lzdGVtIFYgZ2FncyBvbiBpdC4gICovCi0KLSNkZWZpbmUJT0JKX1NfQ19IRFIJMAotI2RlZmluZQlPQkpfU19DX0hEUl9NSEQJMAotI2RlZmluZQlPQkpfU19DX0hEUl9MTk0JMQotI2RlZmluZQlPQkpfU19DX0hEUl9TUkMJMgotI2RlZmluZQlPQkpfU19DX0hEUl9UVEwJMwotI2RlZmluZQlPQkpfU19DX0hEUl9DUFIJNAotI2RlZmluZQlPQkpfU19DX0hEUl9NVEMJNQotI2RlZmluZQlPQkpfU19DX0hEUl9HVFgJNgotI2RlZmluZQlPQkpfU19DX0dTRAkxCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1BTQwkwCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1NZTQkxCi0jZGVmaW5lCU9CSl9TX0NfR1NEX0VQTQkyCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1BSTwkzCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1NZTVcJNAotI2RlZmluZQlPQkpfU19DX0dTRF9FUE1XCTUKLSNkZWZpbmUJT0JKX1NfQ19HU0RfUFJPVwk2Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0lEQwk3Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0VOVgk4Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0xTWQk5Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0xFUE0JMTAKLSNkZWZpbmUJT0JKX1NfQ19HU0RfTFBSTwkxMQotI2RlZmluZQlPQkpfU19DX0dTRF9TUFNDCTEyCi0jZGVmaW5lCU9CSl9TX0NfVElSCTIKLSNkZWZpbmUJT0JKX1NfQ19FT00JMwotI2RlZmluZQlPQkpfU19DX0RCRwk0Ci0jZGVmaW5lCU9CSl9TX0NfVEJUCTUKLSNkZWZpbmUJT0JKX1NfQ19MTksJNgotI2RlZmluZQlPQkpfU19DX0VPTVcJNwotI2RlZmluZQlPQkpfU19DX01BWFJFQ1RZUAk3Ci0jZGVmaW5lCU9CSl9TX0tfU1VCVFlQCTEKLSNkZWZpbmUJT0JKX1NfQ19TVUJUWVAJMQotI2RlZmluZQlPQkpfU19DX01BWFJFQ1NJWgkyMDQ4Ci0jZGVmaW5lCU9CSl9TX0NfU1RSTFZMCTAKLSNkZWZpbmUJT0JKX1NfQ19TWU1TSVoJMzEKLSNkZWZpbmUJT0JKX1NfQ19TVE9SRVBMSU0JLTEKLSNkZWZpbmUJT0JKX1NfQ19QU0NBTElMSU0JOQotDAotI2RlZmluZQlNSERfU19DX01IRAkwCi0jZGVmaW5lCU1IRF9TX0NfTE5NCTEKLSNkZWZpbmUJTUhEX1NfQ19TUkMJMgotI2RlZmluZQlNSERfU19DX1RUTAkzCi0jZGVmaW5lCU1IRF9TX0NfQ1BSCTQKLSNkZWZpbmUJTUhEX1NfQ19NVEMJNQotI2RlZmluZQlNSERfU19DX0dUWAk2Ci0jZGVmaW5lCU1IRF9TX0NfTUFYSERSVFlQCTYKLQwKLSNkZWZpbmUJR1NEX1NfS19FTlRSSUVTCTEKLSNkZWZpbmUJR1NEX1NfQ19FTlRSSUVTCTEKLSNkZWZpbmUJR1NEX1NfQ19QU0MJMAotI2RlZmluZQlHU0RfU19DX1NZTQkxCi0jZGVmaW5lCUdTRF9TX0NfRVBNCTIKLSNkZWZpbmUJR1NEX1NfQ19QUk8JMwotI2RlZmluZQlHU0RfU19DX1NZTVcJNAotI2RlZmluZQlHU0RfU19DX0VQTVcJNQotI2RlZmluZQlHU0RfU19DX1BST1cJNgotI2RlZmluZQlHU0RfU19DX0lEQwk3Ci0jZGVmaW5lCUdTRF9TX0NfRU5WCTgKLSNkZWZpbmUJR1NEX1NfQ19MU1kJOQotI2RlZmluZQlHU0RfU19DX0xFUE0JMTAKLSNkZWZpbmUJR1NEX1NfQ19MUFJPCTExCi0jZGVmaW5lCUdTRF9TX0NfU1BTQwkxMgotI2RlZmluZQlHU0RfU19DX1NZTVYJMTMKLSNkZWZpbmUJR1NEX1NfQ19FUE1WCTE0Ci0jZGVmaW5lCUdTRF9TX0NfUFJPVgkxNQotI2RlZmluZQlHU0RfU19DX01BWFJFQ1RZUAkxNQotDAotI2RlZmluZQlHU1lfU19NX1dFQUsJMQotI2RlZmluZQlHU1lfU19NX0RFRgkyCi0jZGVmaW5lCUdTWV9TX01fVU5JCTQKLSNkZWZpbmUJR1NZX1NfTV9SRUwJOAotCi0jZGVmaW5lCUxTWV9TX01fREVGCTIKLSNkZWZpbmUJTFNZX1NfTV9SRUwJOAotCi0jZGVmaW5lCUVOVl9TX01fREVGCTEKLSNkZWZpbmUJRU5WX1NfTV9ORVNURUQJMgotDAotI2RlZmluZQlHUFNfU19NX1BJQwkxCi0jZGVmaW5lCUdQU19TX01fTElCCTIKLSNkZWZpbmUJR1BTX1NfTV9PVlIJNAotI2RlZmluZQlHUFNfU19NX1JFTAk4Ci0jZGVmaW5lCUdQU19TX01fR0JMCTE2Ci0jZGVmaW5lCUdQU19TX01fU0hSCTMyCi0jZGVmaW5lCUdQU19TX01fRVhFCTY0Ci0jZGVmaW5lCUdQU19TX01fUkQJMTI4Ci0jZGVmaW5lCUdQU19TX01fV1JUCTI1NgotI2RlZmluZQlHUFNfU19NX1ZFQwk1MTIKLSNkZWZpbmUJR1BTX1NfS19OQU1FCTkKLSNkZWZpbmUJR1BTX1NfQ19OQU1FCTkKLQwKLSNkZWZpbmUJVElSX1NfQ19TVEFfR0JMCTAKLSNkZWZpbmUJVElSX1NfQ19TVEFfU0IJMQotI2RlZmluZQlUSVJfU19DX1NUQV9TVwkyCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0xXCTMKLSNkZWZpbmUJVElSX1NfQ19TVEFfUEIJNAotI2RlZmluZQlUSVJfU19DX1NUQV9QVwk1Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1BMCTYKLSNkZWZpbmUJVElSX1NfQ19TVEFfVUIJNwotI2RlZmluZQlUSVJfU19DX1NUQV9VVwk4Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0JGSQk5Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1dGSQkxMAotI2RlZmluZQlUSVJfU19DX1NUQV9MRkkJMTEKLSNkZWZpbmUJVElSX1NfQ19TVEFfRVBNCTEyCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0NLQVJHCTEzCi0jZGVmaW5lCVRJUl9TX0NfU1RBX1dQQgkxNAotI2RlZmluZQlUSVJfU19DX1NUQV9XUFcJMTUKLSNkZWZpbmUJVElSX1NfQ19TVEFfV1BMCTE2Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0xTWQkxNwotI2RlZmluZQlUSVJfU19DX1NUQV9MSVQJMTgKLSNkZWZpbmUJVElSX1NfQ19TVEFfTEVQTQkxOQotI2RlZmluZQlUSVJfU19DX01BWFNUQUNPRAkxOQotI2RlZmluZQlUSVJfU19DX01JTlNUT0NPRAkyMAotI2RlZmluZQlUSVJfU19DX1NUT19TQgkyMAotI2RlZmluZQlUSVJfU19DX1NUT19TVwkyMQotI2RlZmluZQlUSVJfU19DX1NUT19MCTIyCi0jZGVmaW5lCVRJUl9TX0NfU1RPX0JECTIzCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1dECTI0Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0xECTI1Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0xJCTI2Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1BJRFIJMjcKLSNkZWZpbmUJVElSX1NfQ19TVE9fUElDUgkyOAotI2RlZmluZQlUSVJfU19DX1NUT19SU0IJMjkKLSNkZWZpbmUJVElSX1NfQ19TVE9fUlNXCTMwCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1JMCTMxCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1ZQUwkzMgotI2RlZmluZQlUSVJfU19DX1NUT19VU0IJMzMKLSNkZWZpbmUJVElSX1NfQ19TVE9fVVNXCTM0Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JVQgkzNQotI2RlZmluZQlUSVJfU19DX1NUT19SVVcJMzYKLSNkZWZpbmUJVElSX1NfQ19TVE9fQgkzNwotI2RlZmluZQlUSVJfU19DX1NUT19XCTM4Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JCCTM5Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JXCTQwCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1JJVkIJNDEKLSNkZWZpbmUJVElSX1NfQ19TVE9fUElSUgk0MgotI2RlZmluZQlUSVJfU19DX01BWFNUT0NPRAk0MgotI2RlZmluZQlUSVJfU19DX01JTk9QUkNPRAk1MAotI2RlZmluZQlUSVJfU19DX09QUl9OT1AJNTAKLSNkZWZpbmUJVElSX1NfQ19PUFJfQURECTUxCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1NVQgk1MgotI2RlZmluZQlUSVJfU19DX09QUl9NVUwJNTMKLSNkZWZpbmUJVElSX1NfQ19PUFJfRElWCTU0Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0FORAk1NQotI2RlZmluZQlUSVJfU19DX09QUl9JT1IJNTYKLSNkZWZpbmUJVElSX1NfQ19PUFJfRU9SCTU3Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX05FRwk1OAotI2RlZmluZQlUSVJfU19DX09QUl9DT00JNTkKLSNkZWZpbmUJVElSX1NfQ19PUFJfSU5TVgk2MAotI2RlZmluZQlUSVJfU19DX09QUl9BU0gJNjEKLSNkZWZpbmUJVElSX1NfQ19PUFJfVVNICTYyCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1JPVAk2MwotI2RlZmluZQlUSVJfU19DX09QUl9TRUwJNjQKLSNkZWZpbmUJVElSX1NfQ19PUFJfUkVERUYJNjUKLSNkZWZpbmUJVElSX1NfQ19PUFJfREZMSVQJNjYKLSNkZWZpbmUJVElSX1NfQ19NQVhPUFJDT0QJNjYKLSNkZWZpbmUJVElSX1NfQ19NSU5DVExDT0QJODAKLSNkZWZpbmUJVElSX1NfQ19DVExfU0VUUkIJODAKLSNkZWZpbmUJVElSX1NfQ19DVExfQVVHUkIJODEKLSNkZWZpbmUJVElSX1NfQ19DVExfREZMT0MJODIKLSNkZWZpbmUJVElSX1NfQ19DVExfU1RMT0MJODMKLSNkZWZpbmUJVElSX1NfQ19DVExfU1RLREwJODQKLSNkZWZpbmUJVElSX1NfQ19NQVhDVExDT0QJODQKLQwKLS8qCi0gKglEZWJ1Z2dlciBzeW1ib2wgZGVmaW5pdGlvbnM6ICBUaGVzZSBhcmUgZG9uZSBieSBoYW5kLCBhcyBubwotICoJCQkJCW1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBzZWVtcwotICoJCQkJCXRvIGJlIGF2YWlsYWJsZS4KLSAqLwotI2RlZmluZSBEU1RfU19DX0MJICA3CS8qIExhbmd1YWdlID09ICJDIgkqLwotI2RlZmluZSBEU1RfU19DX0NYWAkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCTE1MwotI2RlZmluZQlEU1RfU19DX1NPVVJDRQkxNTUJLyogU291cmNlIGZpbGUJCSovCi0jZGVmaW5lIERTVF9TX0NfUFJPTE9HCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkxNzYJLyogQmVnaW5uaW5nIG9mIGJsb2NrCSovCi0jZGVmaW5lCURTVF9TX0NfQkxLRU5ECTE3NwkvKiBFbmQgb2YgYmxvY2sJKi8KLSNkZWZpbmUgRFNUX1NfQ19FTlRSWQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkxODQKLSNkZWZpbmUJRFNUX1NfQ19MSU5FX05VTQkxODUJLyogTGluZSBOdW1iZXIJCSovCi0jZGVmaW5lIERTVF9TX0NfTEJMT1JMSVQJMTg2Ci0jZGVmaW5lIERTVF9TX0NfTEFCRUwJMTg3Ci0jZGVmaW5lCURTVF9TX0NfTU9EQkVHCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECTE4OQkvKiBFbmQgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfUlROQkVHCTE5MAkvKiBCZWdpbm5pbmcgb2Ygcm91dGluZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkVORAkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cJNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IJNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJCTExCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX0wJCTEyCi0jZGVmaW5lIERTVF9TX0NfU0VUX1NUTVROVU0JMTMKLSNkZWZpbmUgRFNUX1NfQ19URVJNCQkxNAkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUgRFNUX1NfQ19URVJNX1cJCTE1CS8qIEVuZCBvZiBsaW5lcwkqLwotI2RlZmluZQlEU1RfU19DX1NFVF9BQlNfUEMJMTYJLyogU2V0IFBDCSovCi0jZGVmaW5lCURTVF9TX0NfREVMVEFfUENfTAkxNwkvKiBJbmNyIFBDCSovCi0jZGVmaW5lIERTVF9TX0NfSU5DUl9MSU5VTV9MCTE4CS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0IJMTkJLyogU2V0IExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9MCTIwCS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUJRFNUX1NfQ19URVJNX0wJCTIxCS8qIEVuZCBvZiBsaW5lcwkqLwotLyogdGhlc2UgYXJlIHVzZWQgd2l0aCBEU1RfU19DX1NPVVJDRSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUNMRklMRQkgMQkvKiBEZWNsYXJlIHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVEZJTEUJIDIJLyogU2V0IHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19MCSAzCS8qIFNldCByZWNvcmQsIGxvbmd3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19XCSA0CS8qIFNldCByZWNvcmQsIHdvcmQgdmFsdWUgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfVwkxMAkvKiAjIG9mIGxpbmUsIHdvcmQgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUZMSU5FU19CCTExCS8qICMgb2YgbGluZSwgYnl0ZSBjb3VudGVyICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0ZPUk1GRUVECTE2CS8qIF5MIGNvdW50cyBhcyBhIHJlY29yZCAqLwotLyogdGhlIGZvbGxvd2luZyBhcmUgdGhlIGNvZGVzIGZvciB0aGUgdmFyaW91cyBkYXRhIHR5cGVzLiAgQW55dGhpbmcgbm90IG9uCi0gKiB0aGUgbGlzdCBpcyBpbmNsdWRlZCB1bmRlciAnYWR2YW5jZWRfdHlwZScKLSAqLwotI2RlZmluZSBEQkdfU19DX1VDSEFSCQkweDAyCi0jZGVmaW5lIERCR19TX0NfVVNJTlQJCTB4MDMKLSNkZWZpbmUgREJHX1NfQ19VTElOVAkJMHgwNAotI2RlZmluZSBEQkdfU19DX1VRVUFECQkweDA1Ci0jZGVmaW5lIERCR19TX0NfU0NIQVIJCTB4MDYKLSNkZWZpbmUgREJHX1NfQ19TU0lOVAkJMHgwNwotI2RlZmluZSBEQkdfU19DX1NMSU5UCQkweDA4Ci0jZGVmaW5lIERCR19TX0NfU1FVQUQJCTB4MDkKLSNkZWZpbmUgREJHX1NfQ19SRUFMNAkJMHgwYQotI2RlZmluZSBEQkdfU19DX1JFQUw4CQkweDBiCQkvKiBEX2Zsb2F0IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDQJCTB4MGMJCS8qIDJ4Rl9mbG9hdCBjb21wbGV4IGZsb2F0ICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOAkJMHgwZAkJLyogMnhEX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfUkVBTDhfRwkJMHgxYgkJLyogR19mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg4X0cJMHgxZAkJLyogMnhHX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfRlVOQ1RJT05fQUREUgkweDE3Ci0jZGVmaW5lIERCR19TX0NfQURWQU5DRURfVFlQRQkweGEzCi0vKiAgU29tZSBvZiB0aGVzZSBhcmUganVzdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gIFtwcl0KLSAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRBCQkweDAxCS8qIHVuc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRVCQkweDIyCS8qIHVuc2lnbmVkLCB1bmFsaWduZWQgYml0IGZpZWxkICovCi0jZGVmaW5lIERCR19TX0NfU0JJVEEJCTB4MjkJLyogc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRVCQkweDJhCS8qIHNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX0NTVFJJTkcJCTB4MmUJLyogYXNjaXogKCdcMCcgdGVybWluYXRlZCkgc3RyaW5nICovCi0jZGVmaW5lIERCR19TX0NfV0NIQVIJCTB4MzgJLyogd2NoYXJfdCAqLwotLyogIFRoZXNlIGFyZSBkZXNjcmlwdG9yIGNsYXNzIGNvZGVzLgotICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX1MJCTB4MDEJLyogc3RhdGljIChmaXhlZCBsZW5ndGgpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0QJCTB4MDIJLyogZHluYW1pYyBzdHJpbmcgKG5vdCB2aWEgbWFsbG9jISkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfQQkJMHgwNAkvKiBhcnJheSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19VQlMJCTB4MGQJLyogdW5hbGlnbmVkIGJpdCBzdHJpbmcgKi8KLS8qICBUaGVzZSBhcmUgdGhlIGNvZGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRlZmluaXRpb25zIG9mIHN0cnVjdAotICogIHVuaW9uIGFuZCBlbnVtIHJlY29yZHMKLSAqLwotI2RlZmluZSBEQkdfU19DX0VOVU1fSVRFTQkJMHhhNAotI2RlZmluZSBEQkdfU19DX0VOVU1fU1RBUlQJCTB4YTUKLSNkZWZpbmUgREJHX1NfQ19FTlVNX0VORAkJMHhhNgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9JVEVNCQlEU1RfS19WRkxBR1NfQklUT0ZGUwkvKiAweGZmICovCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX1NUQVJUCQkweGFiCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX0VORAkJMHhhYwotI2RlZmluZSBEU1RfS19UWVBTUEVDCQkJMHhhZgkJLyogdHlwZSBzcGVjaWZpY2F0aW9uICovCi0vKiBUaGVzZSBjb2RlcyBhcmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkcwotICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19OT1ZBTAkJMHg4MAkvKiBzdHJ1Y3QgZGVmaW5pdGlvbiBvbmx5ICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19EU0MJCTB4ZmEJLyogZGVzY3JpcHRvciB1c2VkICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19UVlMJCTB4ZmIJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCi0jZGVmaW5lIERTVF9LX1ZTX0ZPTExPV1MJCTB4ZmQJLyogdmFsdWUgc3BlYyBmb2xsb3dzICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19CSVRPRkZTCQkweGZmCS8qIHZhbHVlIGNvbnRhaW5zIGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9MSVRFUkFMCTAKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9BRERSCTEKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9ERVNDCTIKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9SRUcJMwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0FQCTB4MGMJLyogUjEyICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfRlAJMHgwZAkvKiBSMTMgKi8KLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9TUAkweDBlCS8qIFIxNCAqLwotI2RlZmluZSBEU1RfVl9WQUxLSU5ECQkwCS8qIG9mZnNldCBvZiB2YWxraW5kIGZpZWxkICovCi0jZGVmaW5lIERTVF9WX0lORElSRUNUCQkyCS8qIG9mZnNldCB0byBpbmRpcmVjdCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfRElTUAkJMwkvKiBvZmZzZXQgdG8gZGlzcGxhY2VtZW50IGJpdCAqLwotI2RlZmluZSBEU1RfVl9SRUdOVU0JCTQJLyogb2Zmc2V0IHRvIHJlZ2lzdGVyIG51bWJlciAqLwotI2RlZmluZSBEU1RfTV9JTkRJUkVDVAkJKDE8PERTVF9WX0lORElSRUNUKQotI2RlZmluZSBEU1RfTV9ESVNQCQkoMTw8RFNUX1ZfRElTUCkKLSNkZWZpbmUgREJHX0NfRlVOQ1RJT05fUEFSQU0JLyogMHhjOSAqLwlcCi0JKERTVF9LX1ZBTEtJTkRfQUREUnxEU1RfTV9ESVNQfChEU1RfS19SRUdfVkFYX0FQPDxEU1RfVl9SRUdOVU0pKQotI2RlZmluZSBEQkdfQ19MT0NBTF9TWU0JCS8qIDB4ZDkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9GUDw8RFNUX1ZfUkVHTlVNKSkKLS8qIEtpbmRzIG9mIHZhbHVlIHNwZWNpZmljYXRpb25zCi0gKi8KLSNkZWZpbmUgRFNUX0tfVlNfQUxMT0NfU1BMSVQJMwkvKiBzcGxpdCBsaWZldGltZSAqLwotLyogS2luZHMgb2YgdHlwZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1RTX0FUT00JCTB4MDEJLyogYXRvbWljIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19EU0MJCTB4MDIJLyogZGVzY3JpcHRvciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfSU5ECQkweDAzCS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19UUFRSCQkweDA0CS8qIHR5cGVkIHBvaW50ZXIgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX1BUUgkJMHgwNQkvKiBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19BUlJBWQkJMHgwNwkvKiBhcnJheSB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfTk9WX0xFTkcJMHgwZQkvKiBub3ZlbCBsZW5ndGggdHlwZSBzcGVjICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBzdWZmaXggcmVjb3JkcyB0byBkZXRlcm1pbmUgdGhlCi0gKiAgYWN0dWFsIGRhdGEgdHlwZQotICovCi0jZGVmaW5lIERCR19TX0NfQkFTSUMJCQlEU1RfS19UU19BVE9NCi0jZGVmaW5lIERCR19TX0NfQkFTSUNfQVJSQVkJCURTVF9LX1RTX0RTQwotI2RlZmluZSBEQkdfU19DX1NUUlVDVAkJCURTVF9LX1RTX0lORAotI2RlZmluZSBEQkdfU19DX1BPSU5URVIJCQlEU1RfS19UU19UUFRSCi0jZGVmaW5lIERCR19TX0NfVk9JRAkJCURTVF9LX1RTX1BUUgotI2RlZmluZSBEQkdfU19DX0NPTVBMRVhfQVJSQVkJCURTVF9LX1RTX0FSUkFZCi0KLSNlbmRpZgkvKiBXQU5UX1ZNU19PQkpfREVGUyAqLwotCi0vKiBlbmQgb2Ygb2JqLXZtcy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWEyOWsuYyBiL2dhcy9jb25maWcvdGMtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBmZWM1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYTI5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NiArMCwwIEBACi0vKiB0Yy1hMjlrLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBBTUQgMjkwMDAuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBKb2huIEdpbG1vcmUgaGFzIHJlb3JnYW5pemVkIHRoaXMgbW9kdWxlIHNvbWV3aGF0LCB0byBtYWtlIGl0IGVhc2llcgotICAgdG8gY29udmVydCBpdCB0byBuZXcgbWFjaGluZXMnIGFzc2VtYmxlcnMgYXMgZGVzaXJlZC4gIFRoZXJlIHdhcyB0b28KLSAgIG11Y2ggYmxvb2R5IHJld3JpdGluZyByZXF1aXJlZCBiZWZvcmUuICBUaGVyZSBzdGlsbCBwcm9iYWJseSBpcy4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvYTI5ay5oIgotCi0vKiBNYWtlIGl0IGVhc2llciB0byBjbG9uZSB0aGlzIG1hY2hpbmUgZGVzYyBpbnRvIGFub3RoZXIgb25lLiAgKi8KLSNkZWZpbmUJbWFjaGluZV9vcGNvZGUJYTI5a19vcGNvZGUKLSNkZWZpbmUJbWFjaGluZV9vcGNvZGVzCWEyOWtfb3Bjb2RlcwotI2RlZmluZQltYWNoaW5lX2lwCWEyOWtfaXAKLSNkZWZpbmUJbWFjaGluZV9pdAlhMjlrX2l0Ci0KLSNkZWZpbmUJSU1NRURJQVRFX0JJVAkweDAxMDAwMDAwCS8qIFR1cm5zIFJCIGludG8gSW1tZWRpYXRlICovCi0jZGVmaW5lCUFCU09MVVRFX0JJVAkweDAxMDAwMDAwCS8qIFR1cm5zIFBDLXJlbGF0aXZlIHRvIEFic29sdXRlICovCi0jZGVmaW5lCUNFX0JJVAkJMHgwMDgwMDAwMAkvKiBDb3Byb2Nlc3NvciBlbmFibGUgaW4gTE9BRCAqLwotI2RlZmluZQlVSV9CSVQJCTB4MDAwMDAwODAJLyogVW5zaWduZWQgaW50ZWdlciBpbiBDT05WRVJUICovCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotc3RydWN0IG1hY2hpbmVfaXQKLSAgewotICAgIGNoYXIgKmVycm9yOwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBpbnQgcGNyZWw7Ci0gICAgaW50IHJlbG9jX29mZnNldDsJCS8qIE9mZnNldCBvZiByZWxvYyB3aXRoaW4gaW5zbiAqLwotCi0gICAgaW50IHJlbG9jOwotICB9Ci10aGVfaW5zbjsKLQotc3RhdGljIHZvaWQgbWFjaGluZV9pcCBQQVJBTVMgKChjaGFyICpzdHIpKTsKLS8qIHN0YXRpYyB2b2lkIHByaW50X2luc24gUEFSQU1TICgoc3RydWN0IG1hY2hpbmVfaXQgKmluc24pKTsgKi8KLSNpZm5kZWYgT0JKX0NPRkYKLXN0YXRpYyB2b2lkIHNfZGF0YTEgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc191c2UgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotY29uc3QgcHNldWRvX3R5cGVTCi1tZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCA0fSwKLSAgeyJibG9jayIsIHNfc3BhY2UsIDB9LAotICB7ImNwdXR5cGUiLCBzX2lnbm9yZSwgMH0sCS8qIENQVSBhcyAyOTAwMCBvciAyOTA1MCAqLwotICB7InJlZyIsIHNfbHN5bSwgMH0sCQkvKiBSZWdpc3RlciBlcXVhdGUsIHNhbWUgYXMgZXF1ICovCi0gIHsic3BhY2UiLCBzX2lnbm9yZSwgMH0sCS8qIExpc3RpbmcgY29udHJvbCAqLwotICB7InNlY3QiLCBzX2lnbm9yZSwgMH0sCS8qIENyZWF0aW9uIG9mIGNvZmYgc2VjdGlvbnMgKi8KLSNpZm5kZWYgT0JKX0NPRkYKLSAgLyogV2UgY2FuIGRvIHRoaXMgcmlnaHQgd2l0aCBjb2ZmLiAgKi8KLSAgeyJ1c2UiLCBzX3VzZSwgMH0sCi0jZW5kaWYKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLSNpZiBkZWZpbmVkKEJGRF9IRUFERVJTKQotI2lmZGVmIFJFTFNaCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IFJFTFNaOwkvKiBDb2ZmIGhlYWRlcnMgKi8KLSNlbHNlCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDEyOwkJLyogc29tZXRoaW5nIGVsc2UgaGVhZGVycyAqLwotI2VuZGlmCi0jZWxzZQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJCS8qIE5vdCBiZmRpemVkKi8KLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFdlIG5lZWRlZCBhbiB1bnVzZWQgY2hhciBmb3IgbGluZSBzZXBhcmF0aW9uIHRvIHdvcmsgYXJvdW5kIHRoZQotICAgbGFjayBvZiBtYWNyb3MsIHVzaW5nIHNlZCBhbmQgc3VjaC4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiQCI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdAotICAgYWxsLCBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLS8qCi0gKiAgYW51bGwgYml0IC0gY2F1c2VzIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgdG8gbm90IGJlIGV4ZWN1dGVkCi0gKi8KLSNkZWZpbmUgQU5OVUwgICAgICAgKDEgPDwgMjkpCi0KLSNpZm5kZWYgT0JKX0NPRkYKLQotc3RhdGljIHZvaWQKLXNfdXNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIudGV4dCIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBzX3RleHQgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5kYXRhIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmRhdGExIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfZGF0YTEgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBMaXRlcmFscyBjYW4ndCBnbyBpbiB0aGUgdGV4dCBzZWdtZW50IGJlY2F1c2UgeW91IGNhbid0IHJlYWQgZnJvbQotICAgICBpbnN0cnVjdGlvbiBtZW1vcnkgb24gc29tZSAyOWsncy4gIFNvLCBpbnRvIGluaXRpYWxpemVkIGRhdGEuICovCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIubGl0IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAyMDApOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXNfYmFkIChfKCJVbmtub3duIHNlZ21lbnQgdHlwZSIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKCkKLXsKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogSW5zdGFsbCBzeW1ib2wgZGVmaW5pdGlvbiB0aGF0IG1hcHMgUkVHTkFNRSB0byBSRUdOTy4KLSAgIEZJWE1FLVNPT046ICBUaGVzZSBhcmUgbm90IHJlY29nbml6ZWQgaW4gbWl4ZWQgY2FzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfc3JlZyAocmVnbmFtZSwgcmVnbnVtKQotICAgICBjaGFyICpyZWduYW1lOwotICAgICBpbnQgcmVnbnVtOwotewotICAvKiBGSVhNRS1TT09OLCBwdXQgc29tZXRoaW5nIGluIHRoZXNlIHN5bXMgc28gdGhleSB3b24ndCBiZSBvdXRwdXQKLSAgICAgdG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlLiAgKi8KLQotICAvKiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBuYW1lcyBvZiB0aGUgc3BlY2lhbCByZWdpc3RlcnMuICAqLwotICBjaGFyIGJ1Zls4MF07Ci0gIGludCBpOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKHJlZ25hbWUsIFNFR19SRUdJU1RFUiwgKHZhbHVlVCkgcmVnbnVtLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBmb3IgKGkgPSAwOyByZWduYW1lW2ldOyBpKyspCi0gICAgYnVmW2ldID0gaXNsb3dlciAocmVnbmFtZVtpXSkgPyB0b3VwcGVyIChyZWduYW1lW2ldKSA6IHJlZ25hbWVbaV07Ci0gIGJ1ZltpXSA9ICdcMCc7Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLX0KLQotLyogSW5zdGFsbCBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIGFzc29ydGVkIHNwZWNpYWwgcmVnaXN0ZXJzLgotICAgU2VlIEFTTTI5SyBSZWYgcGFnZSAyLTkuICAqLwotCi12b2lkCi1kZWZpbmVfc29tZV9yZWdzICgpCi17Ci0jZGVmaW5lIFNSRUcJMjU2Ci0KLSAgLyogUHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyAqLwotICBpbnNlcnRfc3JlZyAoInZhYiIsIFNSRUcgKyAwKTsKLSAgaW5zZXJ0X3NyZWcgKCJvcHMiLCBTUkVHICsgMSk7Ci0gIGluc2VydF9zcmVnICgiY3BzIiwgU1JFRyArIDIpOwotICBpbnNlcnRfc3JlZyAoImNmZyIsIFNSRUcgKyAzKTsKLSAgaW5zZXJ0X3NyZWcgKCJjaGEiLCBTUkVHICsgNCk7Ci0gIGluc2VydF9zcmVnICgiY2hkIiwgU1JFRyArIDUpOwotICBpbnNlcnRfc3JlZyAoImNoYyIsIFNSRUcgKyA2KTsKLSAgaW5zZXJ0X3NyZWcgKCJyYnAiLCBTUkVHICsgNyk7Ci0gIGluc2VydF9zcmVnICgidG1jIiwgU1JFRyArIDgpOwotICBpbnNlcnRfc3JlZyAoInRtciIsIFNSRUcgKyA5KTsKLSAgaW5zZXJ0X3NyZWcgKCJwYzAiLCBTUkVHICsgMTApOwotICBpbnNlcnRfc3JlZyAoInBjMSIsIFNSRUcgKyAxMSk7Ci0gIGluc2VydF9zcmVnICgicGMyIiwgU1JFRyArIDEyKTsKLSAgaW5zZXJ0X3NyZWcgKCJtbXUiLCBTUkVHICsgMTMpOwotICBpbnNlcnRfc3JlZyAoImxydSIsIFNSRUcgKyAxNCk7Ci0KLSAgLyogQWRkaXRpb25hbCBwcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVycyBmb3IgdGhlIDI5MDUwICovCi0gIGluc2VydF9zcmVnICgicnNuIiwgIFNSRUcgKyAxNSk7Ci0gIGluc2VydF9zcmVnICgicm1hMCIsIFNSRUcgKyAxNik7Ci0gIGluc2VydF9zcmVnICgicm1jMCIsIFNSRUcgKyAxNyk7Ci0gIGluc2VydF9zcmVnICgicm1hMSIsIFNSRUcgKyAxOCk7Ci0gIGluc2VydF9zcmVnICgicm1jMSIsIFNSRUcgKyAxOSk7Ci0gIGluc2VydF9zcmVnICgic3BjMCIsIFNSRUcgKyAyMCk7Ci0gIGluc2VydF9zcmVnICgic3BjMSIsIFNSRUcgKyAyMSk7Ci0gIGluc2VydF9zcmVnICgic3BjMiIsIFNSRUcgKyAyMik7Ci0gIGluc2VydF9zcmVnICgiaWJhMCIsIFNSRUcgKyAyMyk7Ci0gIGluc2VydF9zcmVnICgiaWJjMCIsIFNSRUcgKyAyNCk7Ci0gIGluc2VydF9zcmVnICgiaWJhMSIsIFNSRUcgKyAyNSk7Ci0gIGluc2VydF9zcmVnICgiaWJjMSIsIFNSRUcgKyAyNik7Ci0KLSAgLyogQWRkaXRpb25hbCByZWdpc3RlcnMgZm9yIHRoZSAyOTA0MC4gICovCi0gIGluc2VydF9zcmVnICgiZGJhIiwgU1JFRyArIDI3KTsKLSAgaW5zZXJ0X3NyZWcgKCJkYmMiLCBTUkVHICsgMjgpOwotICBpbnNlcnRfc3JlZyAoImNpciIsIFNSRUcgKyAyOSk7Ci0gIGluc2VydF9zcmVnICgiY2RyIiwgU1JFRyArIDMwKTsKLQotICAvKiBVbnByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgKi8KLSAgaW5zZXJ0X3NyZWcgKCJpcGMiLCBTUkVHICsgMTI4KTsKLSAgaW5zZXJ0X3NyZWcgKCJpcGEiLCBTUkVHICsgMTI5KTsKLSAgaW5zZXJ0X3NyZWcgKCJpcGIiLCBTUkVHICsgMTMwKTsKLSAgaW5zZXJ0X3NyZWcgKCJxIiwgU1JFRyArIDEzMSk7Ci0gIGluc2VydF9zcmVnICgiYWx1IiwgU1JFRyArIDEzMik7Ci0gIGluc2VydF9zcmVnICgiYnAiLCBTUkVHICsgMTMzKTsKLSAgaW5zZXJ0X3NyZWcgKCJmYyIsIFNSRUcgKyAxMzQpOwotICBpbnNlcnRfc3JlZyAoImNyIiwgU1JFRyArIDEzNSk7Ci0gIGluc2VydF9zcmVnICgiZnBlIiwgU1JFRyArIDE2MCk7Ci0gIGluc2VydF9zcmVnICgiaW50ZSIsIFNSRUcgKyAxNjEpOwotICBpbnNlcnRfc3JlZyAoImZwcyIsIFNSRUcgKyAxNjIpOwotICAvKiAgIiIsICAgIFNSRUcrMTYzKTsJICBSZXNlcnZlZCAqLwotICBpbnNlcnRfc3JlZyAoImV4b3AiLCBTUkVHICsgMTY0KTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuLCB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbAotICAgbmVlZC4gICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHJlZ2lzdGVyIGludCBza2lwbmV4dCA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICByZWdpc3RlciBjaGFyICpzdHJlbmQsICpzdHJlbmQyOwotCi0gIC8qIEhhc2ggdXAgYWxsIHRoZSBvcGNvZGVzIGZvciBmYXN0IHVzZSBsYXRlci4gICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fb3Bjb2RlczsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtYWNoaW5lX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgaWYgKHNraXBuZXh0KQotCXsKLQkgIHNraXBuZXh0ID0gMDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSGFjayB0byBhdm9pZCBtdWx0aXBsZSBvcGNvZGUgZW50cmllcy4gIFdlIHByZS1sb2NhdGUgYWxsIHRoZQotCSB2YXJpYXRpb25zIChiL2kgZmllbGQgYW5kIFAvQSBmaWVsZCkgYW5kIGhhbmRsZSB0aGVtLiAqLwotCi0gICAgICBpZiAoIXN0cmNtcCAobmFtZSwgbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5uYW1lKSkKLQl7Ci0JICBpZiAoKG1hY2hpbmVfb3Bjb2Rlc1tpXS5vcGNvZGUgJiAweDAxMDAwMDAwKSAhPSAwCi0JICAgICAgfHwgKG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0ub3Bjb2RlICYgMHgwMTAwMDAwMCkgPT0gMAotCSAgICAgIHx8ICgobWFjaGluZV9vcGNvZGVzW2ldLm9wY29kZSB8IDB4MDEwMDAwMDApCi0JCSAgIT0gbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5vcGNvZGUpKQotCSAgICBnb3RvIGJhZF90YWJsZTsKLQkgIHN0cmVuZCA9IG1hY2hpbmVfb3Bjb2Rlc1tpXS5hcmdzICsgc3RybGVuIChtYWNoaW5lX29wY29kZXNbaV0uYXJncykgLSAxOwotCSAgc3RyZW5kMiA9IG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0uYXJncyArIHN0cmxlbiAobWFjaGluZV9vcGNvZGVzW2kgKyAxXS5hcmdzKSAtIDE7Ci0JICBzd2l0Y2ggKCpzdHJlbmQpCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgaWYgKCpzdHJlbmQyICE9ICdpJykKLQkJZ290byBiYWRfdGFibGU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1AnOgotCSAgICAgIGlmICgqc3RyZW5kMiAhPSAnQScpCi0JCWdvdG8gYmFkX3RhYmxlOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICBiYWRfdGFibGU6Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhbmRsZSBvcGNvZGUgJXNcbiIsCi0JCSAgICAgICBuYW1lKTsKLQkgICAgICBsb3NlID0gMTsKLQkgICAgfQotCi0JICAvKiBPSywgdGhpcyBpcyBhbiBpL2Igb3IgQS9QIHBhaXIuICBXZSBza2lwIHRoZQotCSAgICAgaGlnaGVyLXZhbHVlZCBvbmUsIGFuZCBsZXQgdGhlIGNvZGUgZm9yIG9wZXJhbmQgY2hlY2tpbmcKLQkgICAgIGhhbmRsZSBPUi1pbmcgaW4gdGhlIGJpdC4gICovCi0JICBza2lwbmV4dCA9IDE7Ci0JfQotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKFBUUikgJm1hY2hpbmVfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIsCi0JCSAgIG1hY2hpbmVfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgZGVmaW5lX3NvbWVfcmVncyAoKTsKLX0KLQotLyogQXNzZW1ibGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBJdHMgbGFiZWwgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkCi0gICBieSB0aGUgZ2VuZXJpYyBmcm9udCBlbmQuICBXZSBqdXN0IHBhcnNlIG9wY29kZSBhbmQgb3BlcmFuZHMsIGFuZAotICAgcHJvZHVjZSB0aGUgYnl0ZXMgb2YgZGF0YSBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG9QOwotCi0gIGtub3cgKHN0cik7Ci0gIG1hY2hpbmVfaXAgKHN0cik7Ci0gIHRvUCA9IGZyYWdfbW9yZSAoNCk7Ci0gIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgdGhlX2luc24ub3Bjb2RlLCA0KTsKLQotICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCi0gIGlmICh0aGVfaW5zbi5yZWxvYyAhPSBOT19SRUxPQykKLSAgICB7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICh0b1AgLSBmcmFnX25vdy0+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/Ci0Jb24gdGhlIDI5aywgdGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhlcmUgaXMgYSBzeW1ib2wgYXR0YXRjaGVkLgotCW9uIHRoZSBoOCwgdGhpcyBpcyBhbGx3YXlzIHRydWUsIHNpbmNlIG5vIGZpeHVwIGlzIGRvbmUKLSovCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICh4LT5meF9hZGRzeSkKLSNkZWZpbmUgVENfQ09OU19SRUxPQyBSRUxPQ18zMgotCi0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyVwotI2RlZmluZSByZWxvY190eXBlIGludAotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotCi0jZGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMKLQotLyogZW5kIG9mIHRjLWEyOWsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jIGIvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI5YTU3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NTUgKzAsMCBAQAotLyogdGMtYWxwaGEuYyAtIFByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlIGZvciB0aGUgREVDIEFscGhhIEFYUCBDUFUuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHksIDE5OTMuCi0gICBXcml0dGVuIGJ5IEFsZXNzYW5kcm8gRm9yaW4sIGJhc2VkIG9uIGVhcmxpZXIgZ2FzLTEuMzggdGFyZ2V0IENQVSBmaWxlcy4KLSAgIE1vZGlmaWVkIGJ5IEtlbiBSYWVidXJuIGZvciBnYXMtMi54IGFuZCBFQ09GRiBzdXBwb3J0LgotICAgTW9kaWZpZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gZm9yIEVMRiBzdXBwb3J0LgotICAgTW9kaWZpZWQgYnkgS2xhdXMgSyJhbXBmIGZvciBFVkFYIChPcGVuVk1TL0FscGhhKSBzdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogTWFjaCBPcGVyYXRpbmcgU3lzdGVtCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlCi0gKiBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucwotICogdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUwotICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgotICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCi0gKgotICogIFNvZnR3YXJlIERpc3RyaWJ1dGlvbiBDb29yZGluYXRvciAgb3IgIFNvZnR3YXJlLkRpc3RyaWJ1dGlvbkBDUy5DTVUuRURVCi0gKiAgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UKLSAqICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogIFBpdHRzYnVyZ2ggUEEgMTUyMTMtMzg5MAotICoKLSAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgdGhlCi0gKiByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgInN0cnVjLXN5bWJvbC5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvYWxwaGEuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotDAotLyogTG9jYWwgdHlwZXMgKi8KLQotI2RlZmluZSBUT0tFTklaRV9FUlJPUiAtMQotI2RlZmluZSBUT0tFTklaRV9FUlJPUl9SRVBPUlQgLTIKLQotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgMgotI2RlZmluZSBNQVhfSU5TTl9BUkdTIDUKLQotc3RydWN0IGFscGhhX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotc3RydWN0IGFscGhhX2luc24KLXsKLSAgdW5zaWduZWQgaW5zbjsKLSAgaW50IG5maXh1cHM7Ci0gIHN0cnVjdCBhbHBoYV9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKLSAgdW5zaWduZWQgc2VxdWVuY2VbTUFYX0lOU05fRklYVVBTXTsKLX07Ci0KLWVudW0gYWxwaGFfbWFjcm9fYXJnCi17Ci0gIE1BQ1JPX0VPQSA9IDEsCi0gIE1BQ1JPX0lSLAotICBNQUNST19QSVIsCi0gIE1BQ1JPX09QSVIsCi0gIE1BQ1JPX0NQSVIsCi0gIE1BQ1JPX0ZQUiwKLSAgTUFDUk9fRVhQLAotICBNQUNST19MSVRFUkFMLAotICBNQUNST19CQVNFLAotICBNQUNST19CWVRPRkYsCi0gIE1BQ1JPX0pTUgotfTsKLQotc3RydWN0IGFscGhhX21hY3JvCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHZvaWQgKCplbWl0KSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotICBjb25zdCBQVFIgYXJnOwotICBlbnVtIGFscGhhX21hY3JvX2FyZyBhcmdzZXRzWzE2XTsKLX07Ci0KLS8qIEV4dHJhIGV4cHJlc3Npb24gdHlwZXMuICovCi0KLSNkZWZpbmUgT19wcmVnaXN0ZXIJT19tZDEJLyogT19yZWdpc3RlciwgaW4gcGFyZW50aGVzZXMgKi8KLSNkZWZpbmUgT19jcHJlZ2lzdGVyCU9fbWQyCS8qICsgYSBsZWFkaW5nIGNvbW1hICovCi0KLSNpZmRlZiBSRUxPQ19PUF9QCi0vKiBOb3RlLCB0aGUgYWxwaGFfcmVsb2Nfb3AgdGFibGUgYmVsb3cgZGVwZW5kcyBvbiB0aGUgb3JkZXJpbmcKLSAgIG9mIE9fbGl0ZXJhbCAuLiBPX2dwcmVsb3cuICAqLwotI2RlZmluZSBPX2xpdGVyYWwJT19tZDMJLyogIWxpdGVyYWwgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBPX2xpdHVzZV9iYXNlCU9fbWQ0CS8qICFsaXR1c2VfYmFzZSByZWxvY2F0aW9uICovCi0jZGVmaW5lIE9fbGl0dXNlX2J5dG9mZglPX21kNQkvKiAhbGl0dXNlX2J5dG9mZiByZWxvY2F0aW9uICovCi0jZGVmaW5lIE9fbGl0dXNlX2pzcglPX21kNgkvKiAhbGl0dXNlX2pzciByZWxvY2F0aW9uICovCi0jZGVmaW5lIE9fZ3BkaXNwCU9fbWQ3CS8qICFncGRpc3AgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBPX2dwcmVsaGlnaAlPX21kOAkvKiAhZ3ByZWxoaWdoIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgT19ncHJlbGxvdwlPX21kOQkvKiAhZ3ByZWxsb3cgcmVsb2NhdGlvbiAqLwotCi0jZGVmaW5lIFVTRVJfUkVMT0NfUChSKSAoKFIpID49IE9fbGl0ZXJhbCAmJiAoUikgPD0gT19ncHJlbGxvdykKLSNlbmRpZgotCi0KLS8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZyB0aGUgdHlwZSBhbmQgbnVtYmVyIG9mIGVuY29kZWQgcmVnaXN0ZXIgdG9rZW5zICovCi0KLSNkZWZpbmUgaXNfaXJfbnVtKHgpCQkoKCh4KSAmIDMyKSA9PSAwKQotI2RlZmluZSBpc19mcHJfbnVtKHgpCQkoKCh4KSAmIDMyKSAhPSAwKQotI2RlZmluZSByZWdubyh4KQkJKCh4KSAmIDMxKQotCi0vKiBTb21ldGhpbmcgb2RkIGluaGVyaXRlZCBmcm9tIHRoZSBvbGQgYXNzZW1ibGVyICovCi0KLSNkZWZpbmUgbm90ZV9ncHJlZyhSKQkJKGFscGhhX2dwcm1hc2sgfD0gKDEgPDwgKFIpKSkKLSNkZWZpbmUgbm90ZV9mcHJlZyhSKQkJKGFscGhhX2Zwcm1hc2sgfD0gKDEgPDwgKFIpKSkKLQotLyogUHJlZGljYXRlcyBmb3IgMTYtIGFuZCAzMi1iaXQgcmFuZ2VzICovCi0vKiBYWFg6IFRoZSBub24tc2hpZnQgdmVyc2lvbiBhcHBlYXJzIHRvIHRyaWdnZXIgYSBjb21waWxlciBidWcgd2hlbgotICAgY3Jvc3MtYXNzZW1ibGluZyBmcm9tIHg4NiB3LyBnY2MgMi43LjIuICAqLwotCi0jaWYgMQotI2RlZmluZSByYW5nZV9zaWduZWRfMTYoeCkgXAotCSgoKG9mZnNldFQpKHgpID4+IDE1KSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMTUpID09IC0xKQotI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkgXAotCSgoKG9mZnNldFQpKHgpID4+IDMxKSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMzEpID09IC0xKQotI2Vsc2UKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzE2KHgpCSgob2Zmc2V0VCkoeCkgPj0gLShvZmZzZXRUKTB4ODAwMCAmJglcCi0JCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGKQotI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkJKChvZmZzZXRUKSh4KSA+PSAtKG9mZnNldFQpMHg4MDAwMDAwMCAmJiBcCi0JCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGRkZGRikKLSNlbmRpZgotCi0vKiBNYWNyb3MgZm9yIHNpZ24gZXh0ZW5kaW5nIGZyb20gMTYtIGFuZCAzMi1iaXRzLiAgKi8KLS8qIFhYWDogVGhlIGNhc3QgbWFjcm9zIHdpbGwgd29yayBvbiBhbGwgdGhlIHN5c3RlbXMgdGhhdCBJIGNhcmUgYWJvdXQsCi0gICBidXQgcmVhbGx5IGEgcHJlZGljYXRlIHNob3VsZCBiZSBmb3VuZCB0byB1c2UgdGhlIG5vbi1jYXN0IGZvcm1zLiAgKi8KLQotI2lmIDEKLSNkZWZpbmUgc2lnbl9leHRlbmRfMTYoeCkJKChzaG9ydCkoeCkpCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzMyKHgpCSgoaW50KSh4KSkKLSNlbHNlCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzE2KHgpCSgob2Zmc2V0VCkoKCh4KSAmIDB4RkZGRikgXiAweDgwMDApIC0gMHg4MDAwKQotI2RlZmluZSBzaWduX2V4dGVuZF8zMih4KQkoKG9mZnNldFQpKCgoeCkgJiAweEZGRkZGRkZGKSBcCi0JCQkJCSAgIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotI2VuZGlmCi0KLS8qIE1hY3JvcyB0byBidWlsZCB0b2tlbnMgKi8KLQotI2RlZmluZSBzZXRfdG9rX3JlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19yZWdpc3RlciwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfcHJlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19wcmVnaXN0ZXIsCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfY3ByZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fY3ByZWdpc3RlciwJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSkKLSNkZWZpbmUgc2V0X3Rva19mcmVnKHQsIHIpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKLQkJCQkgKHQpLlhfb3AgPSBPX3JlZ2lzdGVyLAkJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSszMikKLSNkZWZpbmUgc2V0X3Rva19zeW0odCwgcywgYSkJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fc3ltYm9sLAkJCVwKLQkJCQkgKHQpLlhfYWRkX3N5bWJvbCA9IChzKSwJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChhKSkKLSNkZWZpbmUgc2V0X3Rva19jb25zdCh0LCBuKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19jb25zdGFudCwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAobikpCi0KLQwKLS8qIFByb3RvdHlwZXMgZm9yIGFsbCBsb2NhbCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCB0b2tlbml6ZV9hcmd1bWVudHMgUEFSQU1TICgoY2hhciAqLCBleHByZXNzaW9uUyAqLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpmaW5kX29wY29kZV9tYXRjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqLCBpbnQgKikpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqZmluZF9tYWNyb19tYXRjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKiwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfb3BlcmFuZAotICBQQVJBTVMgKCh1bnNpZ25lZCwgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKiwgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgYXNzZW1ibGVfaW5zbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwKLQkgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2luc24gUEFSQU1TICgoc3RydWN0IGFscGhhX2luc24gKikpOwotc3RhdGljIHZvaWQgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24KLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIHN0cnVjdCBhbHBoYV9pbnNuICopKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX3Rva2VucwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQgbG9hZF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGludCwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICosIGV4cHJlc3Npb25TICosCi0JICAgY29uc3QgZXhwcmVzc2lvblMgKikpOwotCi1zdGF0aWMgdm9pZCBlbWl0X2xkZ3AgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfZGl2aXNpb24gUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbGRhIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkYWggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfaXJfbG9hZCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sb2Fkc3RvcmUgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfanNyam1wIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkWCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZFh1IFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VsZFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfdWxkWHUgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbGRpbCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9zdFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfdXN0WCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9zZXh0WCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9yZXRqY3IgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLQotc3RhdGljIHZvaWQgc19hbHBoYV90ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9kYXRhIFBBUkFNUyAoKGludCkpOwotI2lmbmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCBzX2FscGhhX2NvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX3JkYXRhIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VDT0ZGCi1zdGF0aWMgdm9pZCBzX2FscGhhX3NkYXRhIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc19hbHBoYV9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9lbnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfbWFzayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZnJhbWUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX3Byb2xvZ3VlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9jb2ZmX3dyYXBwZXIgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotc3RhdGljIHZvaWQgc19hbHBoYV9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBzX2FscGhhX2dwcmVsMzIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX3Byb2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX3NldCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfYmFzZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX3N0cmluZ2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zcGFjZSBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIHZvaWQgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlZ1QgKiwgc3ltYm9sUyAqKikpOwotI2lmbmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCBzZWxlY3RfZ3BfdmFsdWUgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBhbHBoYV9hbGlnbiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgc3ltYm9sUyAqLCBpbnQpKTsKLQotI2lmZGVmIFJFTE9DX09QX1AKLXN0YXRpYyB2b2lkIGFscGhhX2FkanVzdF9zeW10YWJfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLSNlbmRpZgotCi0MCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwKLSAgIHRhcmdldHMuICAqLwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYQotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwKLSAgIGFzIGluIDBkMS4wLiAgKi8KLSNpZiAwCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLSNlbHNlCi0vKiBYWFg6IERvIGFsbCBvZiB0aGVzZSByZWFsbHkgZ2V0IHVzZWQgb24gdGhlIGFscGhhPz8gICovCi1jaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FVkFYCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiRm06ZysxaDpIRzoiOwotI2Vsc2UKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJGbTpnRzoiOwotI2VuZGlmCi0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSNkZWZpbmUgT1BUSU9OXzMyQUREUiAoT1BUSU9OX01EX0JBU0UpCi0gIHsgIjMyYWRkciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fMzJBRERSIH0sCi0jZGVmaW5lIE9QVElPTl9SRUxBWCAoT1BUSU9OXzMyQUREUisxKQotICB7ICJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVggfSwKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIE9QVElPTl9NREVCVUcgKE9QVElPTl9SRUxBWCsxKQotI2RlZmluZSBPUFRJT05fTk9fTURFQlVHIChPUFRJT05fTURFQlVHKzEpCi0gIHsgIm1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTURFQlVHIH0sCi0gIHsgIm5vLW1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTURFQlVHIH0sCi0jZW5kaWYKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMCB9Ci19OwotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLQwKLSNpZmRlZiBPQkpfRVZBWAotI2RlZmluZSBBWFBfUkVHX1IwICAgICAwCi0jZGVmaW5lIEFYUF9SRUdfUjE2ICAgIDE2Ci0jZGVmaW5lIEFYUF9SRUdfUjE3ICAgIDE3Ci0jdW5kZWYgQVhQX1JFR19UOQotI2RlZmluZSBBWFBfUkVHX1Q5ICAgICAyMgotI3VuZGVmIEFYUF9SRUdfVDEwCi0jZGVmaW5lIEFYUF9SRUdfVDEwICAgIDIzCi0jdW5kZWYgQVhQX1JFR19UMTEKLSNkZWZpbmUgQVhQX1JFR19UMTEgICAgMjQKLSN1bmRlZiBBWFBfUkVHX1QxMgotI2RlZmluZSBBWFBfUkVHX1QxMiAgICAyNQotI2RlZmluZSBBWFBfUkVHX0FJICAgICAyNQotI3VuZGVmIEFYUF9SRUdfRlAKLSNkZWZpbmUgQVhQX1JFR19GUCAgICAgMjkKLQotI3VuZGVmIEFYUF9SRUdfR1AKLSNkZWZpbmUgQVhQX1JFR19HUCBBWFBfUkVHX1BWCi0jZW5kaWYgLyogT0JKX0VWQVggICovCi0KLS8qIFRoZSBjcHUgZm9yIHdoaWNoIHdlIGFyZSBnZW5lcmF0aW5nIGNvZGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBhbHBoYV90YXJnZXQgPSBBWFBfT1BDT0RFX0JBU0U7Ci1zdGF0aWMgY29uc3QgY2hhciAqYWxwaGFfdGFyZ2V0X25hbWUgPSAiPGFsbD4iOwotCi0vKiBUaGUgaGFzaCB0YWJsZSBvZiBpbnN0cnVjdGlvbiBvcGNvZGVzICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYWxwaGFfb3Bjb2RlX2hhc2g7Ci0KLS8qIFRoZSBoYXNoIHRhYmxlIG9mIG1hY3JvIG9wY29kZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphbHBoYV9tYWNyb19oYXNoOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0vKiBUaGUgJGdwIHJlbG9jYXRpb24gc3ltYm9sICovCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfZ3Bfc3ltYm9sOwotCi0vKiBYWFg6IHdoYXQgaXMgdGhpcywgYW5kIHdoeSBpcyBpdCBleHBvcnRlZD8gKi8KLXZhbHVlVCBhbHBoYV9ncF92YWx1ZTsKLSNlbmRpZgotCi0vKiBUaGUgY3VycmVudCAkZ3AgcmVnaXN0ZXIgKi8KLXN0YXRpYyBpbnQgYWxwaGFfZ3BfcmVnaXN0ZXIgPSBBWFBfUkVHX0dQOwotCi0vKiBBIHRhYmxlIG9mIHRoZSByZWdpc3RlciBzeW1ib2xzICovCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfcmVnaXN0ZXJfdGFibGVbNjRdOwotCi0vKiBDb25zdGFudCBzZWN0aW9ucywgb3Igc2VjdGlvbnMgb2YgY29uc3RhbnRzICovCi0jaWZkZWYgT0JKX0VDT0ZGCi1zdGF0aWMgc2VnVCBhbHBoYV9saXRhX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBhbHBoYV9saXQ0X3NlY3Rpb247Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotc3RhdGljIHNlZ1QgYWxwaGFfbGlua19zZWN0aW9uOwotc3RhdGljIHNlZ1QgYWxwaGFfY3RvcnNfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIGFscGhhX2R0b3JzX3NlY3Rpb247Ci0jZW5kaWYKLXN0YXRpYyBzZWdUIGFscGhhX2xpdDhfc2VjdGlvbjsKLQotLyogU3ltYm9scyByZWZlcnJpbmcgdG8gc2FpZCBzZWN0aW9ucy4gKi8KLSNpZmRlZiBPQkpfRUNPRkYKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9saXRhX3N5bWJvbDsKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9saXQ0X3N5bWJvbDsKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGlua19zeW1ib2w7Ci1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfY3RvcnNfc3ltYm9sOwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2R0b3JzX3N5bWJvbDsKLSNlbmRpZgotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdDhfc3ltYm9sOwotCi0vKiBMaXRlcmFsIGZvciAubGl0WCsweDgwMDAgd2l0aGluIC5saXRhICovCi0jaWZkZWYgT0JKX0VDT0ZGCi1zdGF0aWMgb2Zmc2V0VCBhbHBoYV9saXQ0X2xpdGVyYWw7Ci1zdGF0aWMgb2Zmc2V0VCBhbHBoYV9saXQ4X2xpdGVyYWw7Ci0jZW5kaWYKLQotLyogVGhlIGFjdGl2ZSAuZW50IHN5bWJvbC4gICovCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHN5bWJvbFMgKmFscGhhX2N1cl9lbnRfc3ltOwotI2VuZGlmCi0KLS8qIElzIHRoZSBhc3NlbWJsZXIgbm90IGFsbG93ZWQgdG8gdXNlICRhdD8gKi8KLXN0YXRpYyBpbnQgYWxwaGFfbm9hdF9vbiA9IDA7Ci0KLS8qIEFyZSBtYWNyb3MgZW5hYmxlZD8gKi8KLXN0YXRpYyBpbnQgYWxwaGFfbWFjcm9zX29uID0gMTsKLQotLyogQXJlIGZsb2F0cyBkaXNhYmxlZD8gKi8KLXN0YXRpYyBpbnQgYWxwaGFfbm9mbG9hdHNfb24gPSAwOwotCi0vKiBBcmUgYWRkcmVzc2VzIDMyIGJpdD8gKi8KLXN0YXRpYyBpbnQgYWxwaGFfYWRkcjMyX29uID0gMDsKLQotLyogU3ltYm9sIGxhYmVsbGluZyB0aGUgY3VycmVudCBpbnNuLiAgV2hlbiB0aGUgQWxwaGEgZ2FzIHNlZXMKLSAgICAgZm9vOgotICAgICAgIC5xdWFkIDAKLSAgIGFuZCB0aGUgc2VjdGlvbiBoYXBwZW5zIHRvIG5vdCBiZSBvbiBhbiBlaWdodCBieXRlIGJvdW5kYXJ5LCBpdAotICAgd2lsbCBhbGlnbiBib3RoIHRoZSBzeW1ib2wgYW5kIHRoZSAucXVhZCB0byBhbiBlaWdodCBieXRlIGJvdW5kYXJ5LiAgKi8KLXN0YXRpYyBzeW1ib2xTICphbHBoYV9pbnNuX2xhYmVsOwotCi0vKiBXaGV0aGVyIHdlIHNob3VsZCBhdXRvbWF0aWNhbGx5IGFsaWduIGRhdGEgZ2VuZXJhdGlvbiBwc2V1ZG8tb3BzLgotICAgLmFsaWduIDAgd2lsbCB0dXJuIHRoaXMgb2ZmLiAgKi8KLXN0YXRpYyBpbnQgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0KLS8qIFRoZSBrbm93biBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgYWxwaGFfY3VycmVudF9hbGlnbjsKLQotLyogVGhlc2UgYXJlIGV4cG9ydGVkIHRvIEVDT0ZGIGNvZGUuICAqLwotdW5zaWduZWQgbG9uZyBhbHBoYV9ncHJtYXNrLCBhbHBoYV9mcHJtYXNrOwotCi0vKiBXaGV0aGVyIHRoZSBkZWJ1Z2dpbmcgb3B0aW9uIHdhcyBzZWVuLiAgKi8KLXN0YXRpYyBpbnQgYWxwaGFfZGVidWc7Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBXaGV0aGVyIHdlIGFyZSBlbWl0dGluZyBhbiBtZGVidWcgc2VjdGlvbi4gICovCi1pbnQgYWxwaGFfZmxhZ19tZGVidWcgPSAxOwotI2VuZGlmCi0KLS8qIERvbid0IGZ1bGx5IHJlc29sdmUgcmVsb2NhdGlvbnMsIGFsbG93aW5nIGNvZGUgbW92ZW1lbnQgaW4gdGhlIGxpbmtlci4gICovCi1zdGF0aWMgaW50IGFscGhhX2ZsYWdfcmVsYXg7Ci0KLS8qIFdoYXQgdmFsdWUgdG8gZ2l2ZSB0byBiZmRfc2V0X2dwX3NpemUuICAqLwotc3RhdGljIGludCBnX3N3aXRjaF92YWx1ZSA9IDg7Ci0KLSNpZmRlZiBPQkpfRVZBWAotLyogQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHByb2NlZHVyZSBoZXJlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgewotICBzeW1ib2xTICpzeW1ib2w7CS8qIHByb2MgcGRlc2Mgc3ltYm9sICovCi0gIGludCBwZHNja2luZDsKLSAgaW50IGZyYW1lcmVnOwkJLyogcmVnaXN0ZXIgZm9yIGZyYW1lIHBvaW50ZXIgKi8KLSAgaW50IGZyYW1lc2l6ZTsJLyogc2l6ZSBvZiBmcmFtZSAqLwotICBpbnQgcnNhX29mZnNldDsKLSAgaW50IHJhX3NhdmU7Ci0gIGludCBmcF9zYXZlOwotICBsb25nIGltYXNrOwotICBsb25nIGZtYXNrOwotICBpbnQgdHlwZTsKLSAgaW50IHByb2xvZ3VlOwotfSBhbHBoYV9ldmF4X3Byb2M7Ci0KLXN0YXRpYyBpbnQgYWxwaGFfZmxhZ19oYXNoX2xvbmdfbmFtZXMgPSAwOwkJLyogLSsgKi8KLXN0YXRpYyBpbnQgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jID0gMDsJCS8qIC1IICovCi0KLS8qIElmIHRoZSAtKyBzd2l0Y2ggaXMgZ2l2ZW4sIHRoZW4gYSBoYXNoIGlzIGFwcGVuZGVkIHRvIGFueSBuYW1lIHRoYXQgaXMKLSAqIGxvbmdlciB0aGFuIDY0IGNoYXJhY3RlcnMsIGVsc2UgbG9uZ2VyIHN5bWJvbCBuYW1lcyBhcmUgdHJ1bmNhdGVkLgotICovCi0KLSNlbmRpZgotDAotI2lmZGVmIFJFTE9DX09QX1AKLS8qIEEgdGFibGUgdG8gbWFwIHRoZSBzcGVsbGluZyBvZiBhIHJlbG9jYXRpb24gb3BlcmFuZCBpbnRvIGFuIGFwcHJvcHJpYXRlCi0gICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgdHlwZS4gIFRoZSB0YWJsZSBpcyBhc3N1bWVkIHRvIGJlIG9yZGVyZWQgc3VjaAotICAgdGhhdCBvcC1PX2xpdGVyYWwgaW5kZXhlcyBpbnRvIGl0LiAgKi8KLQotI2RlZmluZSBBTFBIQV9SRUxPQ19UQUJMRShvcCkJCQkJCQlcCi0mYWxwaGFfcmVsb2Nfb3BbICgoIVVTRVJfUkVMT0NfUCAob3ApKQkJCQkJXAotCQkgID8gKGFib3J0ICgpLCAwKQkJCQkJXAotCQkgIDogKGludCkob3ApIC0gKGludClPX2xpdGVyYWwpIF0KLQotI2RlZmluZSBMSVRVU0VfQkFTRQkxCi0jZGVmaW5lIExJVFVTRV9CWVRPRkYJMgotI2RlZmluZSBMSVRVU0VfSlNSCTMKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgewotICBjb25zdCBjaGFyICpuYW1lOwkJCQkvKiBzdHJpbmcgdG8gbG9va3VwICovCi0gIHNpemVfdCBsZW5ndGg7CQkJCS8qIHNpemUgb2YgdGhlIHN0cmluZyAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7CQkvKiByZWxvY2F0aW9uIGJlZm9yZSBmcm9iICovCi0gIG9wZXJhdG9yVCBvcDsJCQkJCS8qIHdoaWNoIG9wZXJhdG9yIHRvIHVzZSAqLwotICBpbnQgbGl0dXNlOwkJCQkJLyogYWRkZW5lZCB0byBzcGVjaWZ5IGxpdHVzZSAqLwotfSBhbHBoYV9yZWxvY19vcFtdID0gewotCi0gIHsKLSAgICAibGl0ZXJhbCIsCQkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgibGl0ZXJhbCIpLTEsCQkJLyogbGVuZ3RoICovCi0gICAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTCwJCS8qIHJlbG9jICovCi0gICAgT19saXRlcmFsLAkJCQkJLyogb3AgKi8KLSAgICAwLAkJCQkJCS8qIGxpdHVzZSAqLwotICB9LAotCi0gIHsKLSAgICAibGl0dXNlX2Jhc2UiLAkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgibGl0dXNlX2Jhc2UiKS0xLAkJCS8qIGxlbmd0aCAqLwotICAgIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFLAkJLyogcmVsb2MgKi8KLSAgICBPX2xpdHVzZV9iYXNlLAkJCQkvKiBvcCAqLwotICAgIExJVFVTRV9CQVNFLAkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLQotICB7Ci0gICAgImxpdHVzZV9ieXRvZmYiLAkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgibGl0dXNlX2J5dG9mZiIpLTEsCQkJLyogbGVuZ3RoICovCi0gICAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRiwJCS8qIHJlbG9jICovCi0gICAgT19saXR1c2VfYnl0b2ZmLAkJCQkvKiBvcCAqLwotICAgIExJVFVTRV9CWVRPRkYsCQkJCS8qIGxpdHVzZSAqLwotICB9LAotCi0gIHsKLSAgICAibGl0dXNlX2pzciIsCQkJCS8qIG5hbWUgKi8KLSAgICBzaXplb2YgKCJsaXR1c2VfanNyIiktMSwJCQkvKiBsZW5ndGggKi8KLSAgICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSLAkJLyogcmVsb2MgKi8KLSAgICBPX2xpdHVzZV9qc3IsCQkJCS8qIG9wICovCi0gICAgTElUVVNFX0pTUiwJCQkJCS8qIGxpdHVzZSAqLwotICB9LAotCi0gIHsKLSAgICAiZ3BkaXNwIiwJCQkJCS8qIG5hbWUgKi8KLSAgICBzaXplb2YgKCJncGRpc3AiKS0xLAkJCS8qIGxlbmd0aCAqLwotICAgIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQRElTUCwJCS8qIHJlbG9jICovCi0gICAgT19ncGRpc3AsCQkJCQkvKiBvcCAqLwotICAgIDAsCQkJCQkJLyogbGl0dXNlICovCi0gIH0sCi0KLSAgewotICAgICJncHJlbGhpZ2giLAkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgiZ3ByZWxoaWdoIiktMSwJCQkvKiBsZW5ndGggKi8KLSAgICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0gsCQkvKiByZWxvYyAqLwotICAgIE9fZ3ByZWxoaWdoLAkJCQkvKiBvcCAqLwotICAgIDAsCQkJCQkJLyogbGl0dXNlICovCi0gIH0sCi0KLSAgewotICAgICJncHJlbGxvdyIsCQkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgiZ3ByZWxsb3ciKS0xLAkJCS8qIGxlbmd0aCAqLwotICAgIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XLAkJLyogcmVsb2MgKi8KLSAgICBPX2dwcmVsbG93LAkJCQkJLyogb3AgKi8KLSAgICAwLAkJCQkJCS8qIGxpdHVzZSAqLwotICB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBhbHBoYV9udW1fcmVsb2Nfb3AKLSAgPSBzaXplb2YoYWxwaGFfcmVsb2Nfb3ApIC8gc2l6ZW9mKCphbHBoYV9yZWxvY19vcCk7Ci0KLS8qIE1heGltdW0gIyBkaWdpdHMgbmVlZGVkIHRvIGhvbGQgdGhlIGxhcmdlc3Qgc2VxdWVuY2UgIyAqLwotI2RlZmluZSBBTFBIQV9SRUxPQ19ESUdJVFMgMjUKLQotLyogV2hldGhlciBhIHNlcXVlbmNlIG51bWJlciBpcyB2YWxpZC4gICovCi0jZGVmaW5lIEFMUEhBX1JFTE9DX1NFUVVFTkNFX09LKFgpICgoWCkgPiAwICYmICgodW5zaWduZWQpKFgpKSA9PSAoWCkpCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGV4cGxpY3Qgc2VxdWVuY2UgaW5mb3JtYXRpb24uICAqLwotc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnCi17Ci0gIGZpeFMgKmxpdHVzZTsJCQkvKiBoZWFkIG9mIGxpbmtlZCBsaXN0IG9mICFsaXRlcmFscyAqLwotICBzZWdUIHNlZ21lbnQ7CQkJLyogc2VnbWVudCByZWxvY3MgYXJlIGluIG9yIHVuZGVmaW5lZF9zZWN0aW9uKi8KLSAgaW50IG11bHRpX3NlY3Rpb25fcDsJCS8qIFRydWUgaWYgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIHdhcyB1c2VkICovCi0gIHVuc2lnbmVkIHNlcXVlbmNlOwkJLyogc2VxdWVuY2UgIyAqLwotICB1bnNpZ25lZCBuX2xpdGVyYWxzOwkJLyogIyBvZiBsaXRlcmFscyAqLwotICB1bnNpZ25lZCBuX2xpdHVzZXM7CQkvKiAjIG9mIGxpdHVzZXMgKi8KLSAgY2hhciBzdHJpbmdbMV07CQkvKiBwcmludGFibGUgZm9ybSBvZiBzZXF1ZW5jZSB0byBoYXNoIHdpdGggKi8KLX07Ci0KLS8qIEhhc2ggdGFibGUgdG8gbGluayB1cCBsaXRlcmFscyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBsaXR1c2UgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphbHBoYV9saXRlcmFsX2hhc2g7Ci0jZW5kaWYKLQwKLS8qIEEgdGFibGUgb2YgQ1BVIG5hbWVzIGFuZCBvcGNvZGUgc2V0cy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X3R5cGUKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgZmxhZ3M7Ci19IGNwdV90eXBlc1tdID0KLXsKLSAgLyogQWQgaG9jIGNvbnZlbnRpb246IGNwdSBudW1iZXIgZ2V0cyBwYWxjb2RlLCBwcm9jZXNzIGNvZGUgZG9lc24ndC4KLSAgICAgVGhpcyBzdXBwb3J0cyB1c2FnZSB1bmRlciBEVSA0LjBiIHRoYXQgZG9lcyAiLmFyY2ggZXY0IiwgYW5kIAotICAgICB1c2FnZSBpbiBNSUxPIHRoYXQgZG9lcyAtbTIxMDY0LiAgUHJvYmFibHkgc29tZXRoaW5nIG1vcmUKLSAgICAgc3BlY2lmaWMgbGlrZSAtbTIxMDY0LXBhbCBzaG91bGQgYmUgdXNlZCwgYnV0IG9oIHdlbGwuICAqLwotCi0gIHsgIjIxMDY0IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY0IH0sCi0gIHsgIjIxMDY0YSIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAotICB7ICIyMTA2NiIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAotICB7ICIyMTA2OCIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAotICB7ICIyMTE2NCIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNSB9LAotICB7ICIyMTE2NGEiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjV8QVhQX09QQ09ERV9CV1ggfSwKLSAgeyAiMjExNjRwYyIsIChBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjV8QVhQX09QQ09ERV9CV1gKLQkJfEFYUF9PUENPREVfTUFYKSB9LAotICB7ICIyMTI2NCIsIChBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjZ8QVhQX09QQ09ERV9CV1gKLQkgICAgICB8QVhQX09QQ09ERV9NQVh8QVhQX09QQ09ERV9DSVgpIH0sCi0KLSAgeyAiZXY0IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImV2NDUiLCBBWFBfT1BDT0RFX0JBU0UgfSwKLSAgeyAibGNhNDUiLCBBWFBfT1BDT0RFX0JBU0UgfSwKLSAgeyAiZXY1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImV2NTYiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9CV1ggfSwKLSAgeyAicGNhNTYiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9CV1h8QVhQX09QQ09ERV9NQVggfSwKLSAgeyAiZXY2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYfEFYUF9PUENPREVfTUFYfEFYUF9PUENPREVfQ0lYIH0sCi0KLSAgeyAiYWxsIiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBUaGUgbWFjcm8gdGFibGUgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyBhbHBoYV9tYWNyb3NbXSA9IHsKLS8qIExvYWQvU3RvcmUgbWFjcm9zICovCi0gIHsgImxkYSIsCWVtaXRfbGRhLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fTElURVJBTCwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRhaCIsCWVtaXRfbGRhaCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRsIiwJZW1pdF9pcl9sb2FkLCAibGRsIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkbF9sIiwJZW1pdF9pcl9sb2FkLCAibGRsX2wiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRxIiwJZW1pdF9pcl9sb2FkLCAibGRxIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0xJVEVSQUwsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcV9sIiwJZW1pdF9pcl9sb2FkLCAibGRxX2wiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRxX3UiLAllbWl0X2lyX2xvYWQsICJsZHFfdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGYiLAllbWl0X2xvYWRzdG9yZSwgImxkZiIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRnIiwJZW1pdF9sb2Fkc3RvcmUsICJsZGciLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcyIsCWVtaXRfbG9hZHN0b3JlLCAibGRzIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHQiLAllbWl0X2xvYWRzdG9yZSwgImxkdCIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLQotICB7ICJsZGIiLAllbWl0X2xkWCwgKFBUUikwLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRidSIsCWVtaXRfbGRYdSwgKFBUUikwLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGR3IiwJZW1pdF9sZFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkd3UiLAllbWl0X2xkWHUsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAidWxkdyIsCWVtaXRfdWxkWCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkd3UiLAllbWl0X3VsZFh1LCAoUFRSKTEsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGRsIiwJZW1pdF91bGRYLCAoUFRSKTIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGRsdSIsCWVtaXRfdWxkWHUsIChQVFIpMiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVsZHEiLAllbWl0X3VsZFh1LCAoUFRSKTMsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotCi0gIHsgImxkZ3AiLAllbWl0X2xkZ3AsIE5VTEwsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRpIiwJZW1pdF9sZGEsIE5VTEwsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGlsIiwJZW1pdF9sZGlsLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpcSIsCWVtaXRfbGRhLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSNpZiAwCi0gIHsgImxkaWYiCWVtaXRfbGRpcSwgTlVMTCwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGlkIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpZyIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaXMiCWVtaXRfbGRpcSwgTlVMTCwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGl0IgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSNlbmRpZgotCi0gIHsgInN0bCIsCWVtaXRfbG9hZHN0b3JlLCAic3RsIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0bF9jIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGxfYyIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdHEiLAllbWl0X2xvYWRzdG9yZSwgInN0cSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdHFfYyIsCWVtaXRfbG9hZHN0b3JlLCAic3RxX2MiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX3UiLAllbWl0X2xvYWRzdG9yZSwgInN0cV91IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0ZiIsCWVtaXRfbG9hZHN0b3JlLCAic3RmIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdGciLAllbWl0X2xvYWRzdG9yZSwgInN0ZyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RzIiwJZW1pdF9sb2Fkc3RvcmUsICJzdHMiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0dCIsCWVtaXRfbG9hZHN0b3JlLCAic3R0IiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotCi0gIHsgInN0YiIsCWVtaXRfc3RYLCAoUFRSKTAsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdHciLAllbWl0X3N0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidXN0dyIsCWVtaXRfdXN0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidXN0bCIsCWVtaXRfdXN0WCwgKFBUUikyLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidXN0cSIsCWVtaXRfdXN0WCwgKFBUUikzLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLQotLyogQXJpdGhtZXRpYyBtYWNyb3MgKi8KLSNpZiAwCi0gIHsgImFic2wiCWVtaXRfYWJzbCwgMSwgeyBJUiB9IH0sCi0gIHsgImFic2wiCWVtaXRfYWJzbCwgMiwgeyBJUiwgSVIgfSB9LAotICB7ICJhYnNsIgllbWl0X2Fic2wsIDIsIHsgRVhQLCBJUiB9IH0sCi0gIHsgImFic3EiCWVtaXRfYWJzcSwgMSwgeyBJUiB9IH0sCi0gIHsgImFic3EiCWVtaXRfYWJzcSwgMiwgeyBJUiwgSVIgfSB9LAotICB7ICJhYnNxIgllbWl0X2Fic3EsIDIsIHsgRVhQLCBJUiB9IH0sCi0jZW5kaWYKLQotICB7ICJzZXh0YiIsCWVtaXRfc2V4dFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgInNleHR3IiwJZW1pdF9zZXh0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BICovIH0gfSwKLQotICB7ICJkaXZsIiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJkaXZsdSIsCWVtaXRfZGl2aXNpb24sICJfX2Rpdmx1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgImRpdnEiLAllbWl0X2RpdmlzaW9uLCAiX19kaXZxIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgImRpdnF1IiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2cXUiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtbCIsCWVtaXRfZGl2aXNpb24sICJfX3JlbWwiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtbHUiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1sdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJyZW1xIiwJZW1pdF9kaXZpc2lvbiwgIl9fcmVtcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJyZW1xdSIsCWVtaXRfZGl2aXNpb24sICJfX3JlbXF1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0KLSAgeyAianNyIiwJZW1pdF9qc3JqbXAsICJqc3IiLAotICAgIHsgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0pTUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19KU1IsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCAgTUFDUk9fRVhQLCBNQUNST19KU1IsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VYUCwgTUFDUk9fSlNSLCBNQUNST19FT0EgfSB9LAotICB7ICJqbXAiLAllbWl0X2pzcmptcCwgImptcCIsCi0gICAgeyBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSlNSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0pTUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsICBNQUNST19FWFAsIE1BQ1JPX0pTUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19KU1IsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInJldCIsCWVtaXRfcmV0amNyLCAicmV0IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImpjciIsCWVtaXRfcmV0amNyLCAiamNyIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImpzcl9jb3JvdXRpbmUiLAllbWl0X3JldGpjciwgImpjciIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FT0EgfSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhbHBoYV9udW1fbWFjcm9zCi0gID0gc2l6ZW9mKGFscGhhX21hY3JvcykgLyBzaXplb2YoKmFscGhhX21hY3Jvcyk7Ci0MCi0vKiBQdWJsaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2V0cwotICAgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwKLSAgIG5lZWQsIHRoYXQgY2FuIGJlIGRldGVybWluZWQgYmVmb3JlIGFyZ3VtZW50cyBhcmUgcGFyc2VkLiAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgWF9vcCBmaWVsZCBpcyB3aWRlIGVub3VnaC4gICovCi0gIHsKLSAgICBleHByZXNzaW9uUyBlOwotICAgIGUuWF9vcCA9IE9fbWF4OwotICAgIGFzc2VydCAoZS5YX29wID09IE9fbWF4KTsKLSAgfQotCi0gIC8qIENyZWF0ZSB0aGUgb3Bjb2RlIGhhc2ggdGFibGUgKi8KLQotICBhbHBoYV9vcGNvZGVfaGFzaCA9IGhhc2hfbmV3ICgpOwotICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFfbnVtX29wY29kZXM7ICkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lLCAqcmV0dmFsLCAqc2xhc2g7Ci0KLSAgICAgIG5hbWUgPSBhbHBoYV9vcGNvZGVzW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG5hbWUsIChQVFIpJmFscGhhX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCkKLQlhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggb3Bjb2RlIGAlcyc6ICVzIiksIG5hbWUsIHJldHZhbCk7Ci0KLSAgICAgIC8qIFNvbWUgb3Bjb2RlcyBpbmNsdWRlIG1vZGlmaWVycyBvZiB2YXJpb3VzIHNvcnRzIHdpdGggYSAiL21vZCIKLQkgc3ludGF4LCBsaWtlIHRoZSBhcmNoaXRlY3R1cmUgbWFudWFsIHN1Z2dlc3RzLiAgSG93ZXZlciwgZm9yCi0JIHVzZSB3aXRoIGdjYyBhdCBsZWFzdCwgd2UgYWxzbyBuZWVkIGFjY2VzcyB0byB0aG9zZSBzYW1lIG9wY29kZXMKLQkgd2l0aG91dCB0aGUgIi8iLiAgKi8KLQotICAgICAgaWYgKChzbGFzaCA9IHN0cmNociAobmFtZSwgJy8nKSkgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpwID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSk7Ci0JICBtZW1jcHkgKHAsIG5hbWUsIHNsYXNoIC0gbmFtZSk7Ci0JICBzdHJjcHkgKHAgKyAoc2xhc2ggLSBuYW1lKSwgc2xhc2ggKyAxKTsKLQotCSAgKHZvaWQpaGFzaF9pbnNlcnQoYWxwaGFfb3Bjb2RlX2hhc2gsIHAsIChQVFIpJmFscGhhX29wY29kZXNbaV0pOwotCSAgLyogSWdub3JlIGZhaWx1cmVzIC0tIHRoZSBvcGNvZGUgdGFibGUgZG9lcyBkdXBsaWNhdGUgc29tZQotCSAgICAgdmFyaWFudHMgaW4gZGlmZmVyZW50IGZvcm1zLCBsaWtlICJod19zdHEiIGFuZCAiaHdfc3QvcSIuICAqLwotCX0KLQotICAgICAgd2hpbGUgKCsraSA8IGFscGhhX251bV9vcGNvZGVzCi0JICAgICAmJiAoYWxwaGFfb3Bjb2Rlc1tpXS5uYW1lID09IG5hbWUKLQkJIHx8ICFzdHJjbXAgKGFscGhhX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpKQotCWNvbnRpbnVlOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIG1hY3JvIGhhc2ggdGFibGUgKi8KLQotICBhbHBoYV9tYWNyb19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhbHBoYV9udW1fbWFjcm9zOyApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSwgKnJldHZhbDsKLQotICAgICAgbmFtZSA9IGFscGhhX21hY3Jvc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKGFscGhhX21hY3JvX2hhc2gsIG5hbWUsIChQVFIpJmFscGhhX21hY3Jvc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsKQotCWFzX2ZhdGFsIChfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBtYWNybyBgJXMnOiAlcyIpLCBuYW1lLCByZXR2YWwpOwotCi0gICAgICB3aGlsZSAoKytpIDwgYWxwaGFfbnVtX21hY3JvcwotCSAgICAgJiYgKGFscGhhX21hY3Jvc1tpXS5uYW1lID09IG5hbWUKLQkJIHx8ICFzdHJjbXAgKGFscGhhX21hY3Jvc1tpXS5uYW1lLCBuYW1lKSkpCi0JY29udGludWU7Ci0gICAgfQotCi0gIC8qIENvbnN0cnVjdCBzeW1ib2xzIGZvciBlYWNoIG9mIHRoZSByZWdpc3RlcnMgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICBjaGFyIG5hbWVbNF07Ci0gICAgICBzcHJpbnRmKG5hbWUsICIkJWQiLCBpKTsKLSAgICAgIGFscGhhX3JlZ2lzdGVyX3RhYmxlW2ldID0gc3ltYm9sX2NyZWF0ZShuYW1lLCByZWdfc2VjdGlvbiwgaSwKLQkJCQkJICAgICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0gIGZvciAoOyBpIDwgNjQ7ICsraSkKLSAgICB7Ci0gICAgICBjaGFyIG5hbWVbNV07Ci0gICAgICBzcHJpbnRmKG5hbWUsICIkZiVkIiwgaS0zMik7Ci0gICAgICBhbHBoYV9yZWdpc3Rlcl90YWJsZVtpXSA9IHN5bWJvbF9jcmVhdGUobmFtZSwgcmVnX3NlY3Rpb24sIGksCi0JCQkJCSAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgc3BlY2lhbCBzeW1ib2xzIGFuZCBzZWN0aW9ucyB3ZSdsbCBiZSB1c2luZyAqLwotCi0gIC8qIFNvIC5zYnNzIHdpbGwgZ2V0IHVzZWQgZm9yIHRpbnkgb2JqZWN0cy4gICovCi0gIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXRhIiwgJmFscGhhX2xpdGFfc2VjdGlvbiwgJmFscGhhX2xpdGFfc3ltYm9sKTsKLQotICAvKiBGb3IgaGFuZGxpbmcgdGhlIEdQLCBjcmVhdGUgYSBzeW1ib2wgdGhhdCB3b24ndCBiZSBvdXRwdXQgaW4gdGhlCi0gICAgIHN5bWJvbCB0YWJsZS4gIFdlJ2xsIGVkaXQgaXQgb3V0IG9mIHJlbG9jcyBsYXRlci4gICovCi0gIGFscGhhX2dwX3N5bWJvbCA9IHN5bWJvbF9jcmVhdGUgKCI8R1AgdmFsdWU+IiwgYWxwaGFfbGl0YV9zZWN0aW9uLCAweDgwMDAsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VWQVgKLSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saW5rIiwgJmFscGhhX2xpbmtfc2VjdGlvbiwgJmFscGhhX2xpbmtfc3ltYm9sKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIHsKLSAgICAgIHNlZ1Qgc2VjID0gc3Vic2VnX25ldygiLm1kZWJ1ZyIsIChzdWJzZWdUKTApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzKHN0ZG91dHB1dCwgc2VjLCBTRUNfSEFTX0NPTlRFTlRTfFNFQ19SRUFET05MWSk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KHN0ZG91dHB1dCwgc2VjLCAzKTsKLSAgICB9Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0gIHN1YnNlZ19zZXQodGV4dF9zZWN0aW9uLCAwKTsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgLyogQ3JlYXRlIGxpdGVyYWwgbG9va3VwIGhhc2ggdGFibGUuICAqLwotICBhbHBoYV9saXRlcmFsX2hhc2ggPSBoYXNoX25ldygpOwotI2VuZGlmCi19Ci0KLS8qIFRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBpbnN0cnVjdGlvbiBhc3NlbWJsZXIuICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgb3BuYW1lWzMyXTsJCQkvKiBjdXJyZW50IG1heGltdW0gaXMgMTMgKi8KLSAgZXhwcmVzc2lvblMgdG9rW01BWF9JTlNOX0FSR1NdOwotICBpbnQgbnRvaywgdHJ1bmNsZW47Ci0gIHNpemVfdCBvcG5hbWVsZW47Ci0KLSAgLyogc3BsaXQgb2ZmIHRoZSBvcGNvZGUgKi8KLSAgb3BuYW1lbGVuID0gc3Ryc3BuIChzdHIsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5el8vNDY4Iik7Ci0gIHRydW5jbGVuID0gKG9wbmFtZWxlbiA8IHNpemVvZiAob3BuYW1lKSAtIDEKLQkgICAgICA/IG9wbmFtZWxlbgotCSAgICAgIDogc2l6ZW9mIChvcG5hbWUpIC0gMSk7Ci0gIG1lbWNweSAob3BuYW1lLCBzdHIsIHRydW5jbGVuKTsKLSAgb3BuYW1lW3RydW5jbGVuXSA9ICdcMCc7Ci0KLSAgLyogdG9rZW5pemUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KLSAgaWYgKChudG9rID0gdG9rZW5pemVfYXJndW1lbnRzIChzdHIgKyBvcG5hbWVsZW4sIHRvaywgTUFYX0lOU05fQVJHUykpIDwgMCkKLSAgICB7Ci0gICAgICBpZiAobnRvayAhPSBUT0tFTklaRV9FUlJPUl9SRVBPUlQpCi0JYXNfYmFkIChfKCJzeW50YXggZXJyb3IiKSk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogZmluaXNoIGl0IG9mZiAqLwotICBhc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgdG9rLCBudG9rLCBhbHBoYV9tYWNyb3Nfb24pOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24ncyBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBzaXplKQotICAgICBzZWdUIHNlZzsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWcpOwotICB2YWx1ZVQgbWFzayA9ICgodmFsdWVUKTEgPDwgYWxpZ24pIC0gMTsKLQotICByZXR1cm4gKHNpemUgKyBtYXNrKSAmIH5tYXNrOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotZXh0ZXJuIGNoYXIgKnZheF9tZF9hdG9mIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQgKikpOwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgLyogVkFYIGZsb2F0cyAqLwotICAgIGNhc2UgJ0cnOgotICAgICAgLyogVkFYIG1kX2F0b2YgZG9lc24ndCBsaWtlICJHIiBmb3Igc29tZSByZWFzb24uICAqLwotICAgICAgdHlwZSA9ICdnJzsKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHJldHVybiB2YXhfbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApOwotCi0gICAgICAvKiBJRUVFIGZsb2F0cyAqLwotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQLS0pLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogVGFrZSBjYXJlIG9mIHRoZSB0YXJnZXQtc3BlY2lmaWMgY29tbWFuZC1saW5lIG9wdGlvbnMuICAqLwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ0YnOgotICAgICAgYWxwaGFfbm9mbG9hdHNfb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl8zMkFERFI6Ci0gICAgICBhbHBoYV9hZGRyMzJfb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgIGFscGhhX2RlYnVnID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IGF0b2koYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbSc6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IGNwdV90eXBlICpwOwotCWZvciAocCA9IGNwdV90eXBlczsgcC0+bmFtZTsgKytwKQotCSAgaWYgKHN0cmNtcChhcmcsIHAtPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBhbHBoYV90YXJnZXRfbmFtZSA9IHAtPm5hbWUsIGFscGhhX3RhcmdldCA9IHAtPmZsYWdzOwotCSAgICAgIGdvdG8gZm91bmQ7Ci0JICAgIH0KLQlhc193YXJuKF8oIlVua25vd24gQ1BVIGlkZW50aWZpZXIgYCVzJyIpLCBhcmcpOwotICAgICAgZm91bmQ6OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAgIGNhc2UgJysnOgkJCS8qIEZvciBnKysuICBIYXNoIGFueSBuYW1lID4gNjMgY2hhcnMgbG9uZy4gKi8KLSAgICAgIGFscGhhX2ZsYWdfaGFzaF9sb25nX25hbWVzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSCc6CQkJLyogU2hvdyBuZXcgc3ltYm9sIGFmdGVyIGhhc2ggdHJ1bmNhdGlvbiAqLwotICAgICAgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6CQkJLyogZm9yIGdudS1jL3ZheCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIGFscGhhX2ZsYWdfcmVsYXggPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBPUFRJT05fTURFQlVHOgotICAgICAgYWxwaGFfZmxhZ19tZGVidWcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTk9fTURFQlVHOgotICAgICAgYWxwaGFfZmxhZ19tZGVidWcgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFByaW50IGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRoYXQgd2UgYWNjZXB0LiAgKi8KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwdXRzKF8oIlwKLUFscGhhIG9wdGlvbnM6XG5cCi0tMzJhZGRyCQkJdHJlYXQgYWRkcmVzc2VzIGFzIDMyLWJpdCB2YWx1ZXNcblwKLS1GCQkJbGFjayBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgc3VwcG9ydFxuXAotLW1ldjQgfCAtbWV2NDUgfCAtbWV2NSB8IC1tZXY1NiB8IC1tcGNhNTYgfCAtbWV2NiB8IC1tYWxsXG5cCi0JCQlzcGVjaWZ5IHZhcmlhbnQgb2YgQWxwaGEgYXJjaGl0ZWN0dXJlXG5cCi0tbTIxMDY0IHwgLW0yMTA2NiB8IC1tMjExNjQgfCAtbTIxMTY0YSB8IC1tMjExNjRwYyB8IC1tMjEyNjRcblwKLQkJCXRoZXNlIHZhcmlhbnRzIGluY2x1ZGUgUEFMY29kZSBvcGNvZGVzXG4iKSwKLQlzdHJlYW0pOwotI2lmZGVmIE9CSl9FVkFYCi0gIGZwdXRzIChfKCJcCi1WTVMgb3B0aW9uczpcblwKLS0rCQkJaGFzaCBlbmNvZGUgKGRvbid0IHRydW5jYXRlKSBuYW1lcyBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzXG5cCi0tSAkJCXNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIpLAotCXN0cmVhbSk7Ci0jZW5kaWYKLX0KLQotLyogRGVjaWRlIGZyb20gd2hhdCBwb2ludCBhIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8sCi0gICByZWxhdGl2ZSB0byB0aGUgcGMtcmVsYXRpdmUgZml4dXAuICBFciwgcmVsYXRpdmVseSBzcGVha2luZy4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHZhbHVlVCBhZGRyID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgICAgcmV0dXJuIGFkZHI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmaXhQLT5meF9zaXplICsgYWRkcjsKLSAgICB9Ci19Ci0KLS8qIEF0dGVtcHQgdG8gc2ltcGxpZnkgb3IgZXZlbiBlbGltaW5hdGUgYSBmaXh1cC4gIFRoZSByZXR1cm4gdmFsdWUgaXMKLSAgIGlnbm9yZWQ7IHBlcmhhcHMgaXQgd2FzIG9uY2UgbWVhbmluZ2Z1bCwgYnV0IG5vdyBpdCBpcyBoaXN0b3JpY2FsLgotICAgVG8gaW5kaWNhdGUgdGhhdCBhIGZpeHVwIGhhcyBiZWVuIGVsaW1pbmF0ZWQsIHNldCBmaXhQLT5meF9kb25lLgotCi0gICBGb3IgRUxGLCBoZXJlIGl0IGlzIHRoYXQgd2UgdHJhbnNmb3JtIHRoZSBHUERJU1BfSEkxNiByZWxvYyB3ZSB1c2VkCi0gICBpbnRlcm5hbGx5IGludG8gdGhlIEdQRElTUCByZWxvYyB1c2VkIGV4dGVybmFsbHkuICBXZSBoYWQgdG8gZG8KLSAgIHRoaXMgc28gdGhhdCB3ZSdkIGhhdmUgdGhlIEdQRElTUF9MTzE2IHJlbG9jIGFzIGEgdGFnIHRvIGNvbXB1dGUKLSAgIHRoZSBkaXN0YW5jZSB0byB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZm9yIHNldHRpbmcgdGhlIGFkZGVuZCB0bwotICAgR1BESVNQLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHVlUCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWx1ZVA7Ci17Ci0gIGNoYXIgKiBjb25zdCBmaXhwb3MgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gIHZhbHVlVCB2YWx1ZSA9ICp2YWx1ZVA7Ci0gIHVuc2lnbmVkIGltYWdlLCBzaXplOwotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICAgIC8qIFRoZSBHUERJU1AgcmVsb2NhdGlvbnMgYXJlIHByb2Nlc3NlZCBpbnRlcm5hbGx5IHdpdGggYSBzeW1ib2wKLQkgcmVmZXJyaW5nIHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uOyB3ZSBuZWVkIHRvIGRyb3AgaW4gYSB2YWx1ZQotCSB3aGljaCwgd2hlbiBhZGRlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLAotCSBnaXZlcyB0aGUgZGVzaXJlZCBHUC4gICovCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0gICAgICB7Ci0JZml4UyAqbmV4dCA9IGZpeFAtPmZ4X25leHQ7Ci0JYXNzZXJ0IChuZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2KTsKLQotCWZpeFAtPmZ4X29mZnNldCA9IChuZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzICsgbmV4dC0+Znhfd2hlcmUKLQkJCSAgIC0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIGZpeFAtPmZ4X3doZXJlKTsKLQotCXZhbHVlID0gKHZhbHVlIC0gc2lnbl9leHRlbmRfMTYgKHZhbHVlKSkgPj4gMTY7Ci0gICAgICB9Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUDsKLSNlbmRpZgotICAgICAgZ290byBkb19yZWxvY19ncDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgICAgdmFsdWUgPSBzaWduX2V4dGVuZF8xNiAodmFsdWUpOwotICAgICAgZml4UC0+Znhfb2Zmc2V0ID0gMDsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBmaXhQLT5meF9kb25lID0gMTsKLSNlbmRpZgotCi0gICAgZG9fcmVsb2NfZ3A6Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLSAgICAgIHNpemUgPSAyOwotICAgICAgZ290byBkb19yZWxvY194eDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0gICAgICBzaXplID0gNDsKLSAgICAgIGdvdG8gZG9fcmVsb2NfeHg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzY0X1BDUkVMOwotICAgICAgc2l6ZSA9IDg7Ci0gICAgZG9fcmVsb2NfeHg6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgc2l6ZSk7Ci0JICBnb3RvIGRvbmU7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgYXNzZXJ0IChmaXhQLT5meF9zdWJzeSA9PSBhbHBoYV9ncF9zeW1ib2wpOwotICAgICAgZml4UC0+Znhfc3Vic3kgPSAwOwotICAgICAgLyogRklYTUU6IGluaGVyaXRlZCB0aGlzIG9ibGl2aW91c25lc3Mgb2YgYHZhbHVlJyAtLSB3aHk/ICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgLWFscGhhX2dwX3ZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIGltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOwotCSAgaW1hZ2UgPSAoaW1hZ2UgJiB+MHgxRkZGRkYpIHwgKCh2YWx1ZSA+PiAyKSAmIDB4MUZGRkZGKTsKLQkgIGdvdG8gd3JpdGVfZG9uZTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIGltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOwotCSAgaW1hZ2UgPSAoaW1hZ2UgJiB+MHgzRkZGKSB8ICgodmFsdWUgPj4gMikgJiAweDNGRkYpOwotCSAgZ290byB3cml0ZV9kb25lOwotCX0KLSAgICAgIHJldHVybiAxOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgMik7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotICAgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQRElTUDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XOgotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQlpZiAoKGludClmaXhQLT5meF9yX3R5cGUgPj0gMCkKLQkgIGFzX2ZhdGFsIChfKCJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0KLQlhc3NlcnQgKC0oaW50KWZpeFAtPmZ4X3JfdHlwZSA8IChpbnQpYWxwaGFfbnVtX29wZXJhbmRzKTsKLQlvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWy0oaW50KWZpeFAtPmZ4X3JfdHlwZV07Ci0KLQkvKiBUaGUgcmVzdCBvZiB0aGVzZSBmaXh1cHMgb25seSBleGlzdCBpbnRlcm5hbGx5IGR1cmluZyBzeW1ib2wKLQkgICByZXNvbHV0aW9uIGFuZCBoYXZlIG5vIHJlcHJlc2VudGF0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4KLQkgICBUaGVyZWZvcmUgdGhleSBtdXN0IGJlIGNvbXBsZXRlbHkgcmVzb2x2ZWQgYXMgY29uc3RhbnRzLiAgKi8KLQotCWlmIChmaXhQLT5meF9hZGRzeSAhPSAwCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygibm9uLWFic29sdXRlIGV4cHJlc3Npb24gaW4gY29uc3RhbnQgZmllbGQiKSk7Ci0KLQlpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQlpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCAob2Zmc2V0VCl2YWx1ZSwKLQkJCSAgICAgICBmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lKTsKLSAgICAgIH0KLSAgICAgIGdvdG8gd3JpdGVfZG9uZTsKLSAgICB9Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IDAgfHwgZml4UC0+ZnhfcGNyZWwgIT0gMCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm5fd2hlcmUoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oInR5cGUgJWQgcmVsb2MgZG9uZT9cbiIpLCAoaW50KWZpeFAtPmZ4X3JfdHlwZSk7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi13cml0ZV9kb25lOgotICBtZF9udW1iZXJfdG9fY2hhcnMoZml4cG9zLCBpbWFnZSwgNCk7Ci0KLWRvbmU6Ci0gIGZpeFAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIExvb2sgZm9yIGEgcmVnaXN0ZXIgbmFtZSBpbiB0aGUgZ2l2ZW4gc3ltYm9sLgotICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoKm5hbWUgPT0gJyQnKQotICAgIHsKLSAgICAgIGludCBpc19mbG9hdCA9IDAsIG51bTsKLQotICAgICAgc3dpdGNoICgqKytuYW1lKQotCXsKLQljYXNlICdmJzoKLQkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX0ZQXTsKLQkgIGlzX2Zsb2F0ID0gMzI7Ci0JICAvKiBGQUxMVEhSVSAqLwotCi0JY2FzZSAncic6Ci0JICBpZiAoIWlzZGlnaXQoKisrbmFtZSkpCi0JICAgIGJyZWFrOwotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JICBpZiAobmFtZVsxXSA9PSAnXDAnKQotCSAgICBudW0gPSBuYW1lWzBdIC0gJzAnOwotCSAgZWxzZSBpZiAobmFtZVswXSAhPSAnMCcgJiYgaXNkaWdpdChuYW1lWzFdKSAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBudW0gPSAobmFtZVswXSAtICcwJykgKiAxMCArIG5hbWVbMV0gLSAnMCc7Ci0JICAgICAgaWYgKG51bSA+PSAzMikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICghYWxwaGFfbm9hdF9vbiAmJiBudW0gPT0gQVhQX1JFR19BVCkKLQkgICAgYXNfd2FybihfKCJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbbnVtICsgaXNfZmxvYXRdOwotCi0JY2FzZSAnYSc6Ci0JICBpZiAobmFtZVsxXSA9PSAndCcgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKCFhbHBoYV9ub2F0X29uKQotCQlhc193YXJuKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkgICAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbQVhQX1JFR19BVF07Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZyc6Ci0JICBpZiAobmFtZVsxXSA9PSAncCcgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbYWxwaGFfZ3BfcmVnaXN0ZXJdOwotCSAgYnJlYWs7Ci0KLQljYXNlICdzJzoKLQkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX1NQXTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgT0JKX0VDT0ZGCi0vKiBAQEAgTWFnaWMgRUNPRkYgYml0cy4gICovCi0KLXZvaWQKLWFscGhhX2Zyb2JfZWNvZmZfZGF0YSAoKQotewotICBzZWxlY3RfZ3BfdmFsdWUgKCk7Ci0gIC8qICR6ZXJvIGFuZCAkZjMxIGFyZSByZWFkLW9ubHkgKi8KLSAgYWxwaGFfZ3BybWFzayAmPSB+MTsKLSAgYWxwaGFfZnBybWFzayAmPSB+MTsKLX0KLSNlbmRpZgotCi0vKiBIb29rIHRvIHJlbWVtYmVyIGEgcmVjZW50bHkgZGVmaW5lZCBsYWJlbCBzbyB0aGF0IHRoZSBhdXRvLWFsaWduCi0gICBjb2RlIGNhbiBhZGp1c3QgdGhlIHN5bWJvbCBhZnRlciB3ZSBrbm93IHdoYXQgYWxpZ25tZW50IHdpbGwgYmUKLSAgIHJlcXVpcmVkLiAgKi8KLQotdm9pZAotYWxwaGFfZGVmaW5lX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IHN5bTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgd2UgbXVzdCBhbHdheXMgZW1pdCBhIHJlbG9jIGZvciBhIHR5cGUgYW5kIGZhbHNlIGlmCi0gICB0aGVyZSBpcyBzb21lIGhvcGUgb2YgcmVzb2x2aW5nIGl0IGEgYXNzZW1ibHkgdGltZS4gICovCi0KLWludAotYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiAoZikKLSAgICAgZml4UyAqZjsKLXsKLSAgaWYgKGFscGhhX2ZsYWdfcmVsYXgpCi0gICAgcmV0dXJuIDE7Ci0KLSAgc3dpdGNoIChmLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotI2VuZGlmCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOgotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotI2VuZGlmCi0jaWZkZWYgUkVMT0NfT1BfUAotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1A6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0g6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVzoKLSNlbmRpZgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KChpbnQpZi0+Znhfcl90eXBlIDwgMCAmJiAtKGludClmLT5meF9yX3R5cGUgPCAoaW50KWFscGhhX251bV9vcGVyYW5kcyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwYXJ0aWFsbHkgcmVzb2x2ZSBhIHJlbG9jYXRpb24gbm93LiAgKi8KLQotaW50Ci1hbHBoYV9maXhfYWRqdXN0YWJsZSAoZikKLSAgICAgZml4UyAqZjsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZi0+ZnhfYWRkc3kpIHx8IFNfSVNfV0VBSyAoZi0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSAgLyogQXJlIHRoZXJlIGFueSByZWxvY2F0aW9uIHR5cGVzIGZvciB3aGljaCB3ZSBtdXN0IGdlbmVyYXRlIGEgcmVsb2MKLSAgICAgYnV0IHdlIGNhbiBhZGp1c3QgdGhlIHZhbHVlcyBjb250YWluZWQgd2l0aGluIGl0PyAgKi8KLSAgc3dpdGNoIChmLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSAgICAgIHJldHVybiAwOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIFJFTE9DX09QX1AKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0U6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFI6Ci0jZW5kaWYKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOgotI2lmZGVmIFJFTE9DX09QX1AKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1A6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0g6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVzoKLSNlbmRpZgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQgKChpbnQpZi0+Znhfcl90eXBlIDwgMAotCSAgICAgICYmIC0gKGludClmLT5meF9yX3R5cGUgPCAoaW50KWFscGhhX251bV9vcGVyYW5kcyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEdlbmVyYXRlIHRoZSBCRkQgcmVsb2MgdG8gYmUgc3R1Y2sgaW4gdGhlIG9iamVjdCBmaWxlIGZyb20gdGhlCi0gICBmaXh1cCB1c2VkIGludGVybmFsbHkgaW4gdGhlIGFzc2VtYmxlci4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAvKiBNYWtlIHN1cmUgbm9uZSBvZiBvdXIgaW50ZXJuYWwgcmVsb2NhdGlvbnMgbWFrZSBpdCB0aGlzIGZhci4KLSAgICAgVGhleSdkIGJldHRlciBoYXZlIGJlZW4gZnVsbHkgcmVzb2x2ZWQgYnkgdGhpcyBwb2ludC4gICovCi0gIGFzc2VydCAoKGludClmaXhwLT5meF9yX3R5cGUgPiAwKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oImNhbm5vdCByZXByZXNlbnQgYCVzJyByZWxvY2F0aW9uIGluIG9iamVjdCBmaWxlIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCFmaXhwLT5meF9wY3JlbCAhPSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I/IGNhbm5vdCBnZW5lcmF0ZSBgJXMnIHJlbG9jYXRpb24iKSwKLQkJYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotICAgIH0KLSAgYXNzZXJ0ICghZml4cC0+ZnhfcGNyZWwgPT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwpCi0gICAgewotICAgICAgLyogZmFrZSBvdXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gc2lnaCAqLwotICAgICAgcmVsb2MtPmFkZGVuZCA9IC1hbHBoYV9ncF92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyoKLSAgICAgICAqIE9oaGgsIHRoaXMgaXMgdWdseS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgdGhpcyBpcyBhIGxvY2FsIGdsb2JhbAotICAgICAgICogc3ltYm9sLCB0aGUgcmVsb2NhdGlvbiB3aWxsIGVudGlyZWx5IGJlIHBlcmZvcm1lZCBhdCBsaW5rIHRpbWUsIG5vdAotICAgICAgICogYXQgYXNzZW1ibHkgdGltZS4gIGJmZF9wZXJmb3JtX3JlbG9jIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIHNvcnQKLSAgICAgICAqIG9mIHRoaW5nLCBhbmQgYXMgYSByZXN1bHQgd2UgbmVlZCB0byBmYWtlIGl0IG91dCBoZXJlLgotICAgICAgICovCi0gICAgICBpZiAoKFNfSVNfRVhURVJOIChmaXhwLT5meF9hZGRzeSkgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCi0JICAmJiAhU19JU19DT01NT04oZml4cC0+ZnhfYWRkc3kpKQotCXJlbG9jLT5hZGRlbmQgLT0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KS0+dmFsdWU7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBQYXJzZSBhIHJlZ2lzdGVyIG5hbWUgb2ZmIG9mIHRoZSBpbnB1dF9saW5lIGFuZCByZXR1cm4gYSByZWdpc3RlcgotICAgbnVtYmVyLiAgR2V0cyBtZF91bmRlZmluZWRfc3ltYm9sIGFib3ZlIHRvIGRvIHRoZSByZWdpc3RlciBuYW1lCi0gICBtYXRjaGluZyBmb3IgdXMuCi0KLSAgIE9ubHkgY2FsbGVkIGFzIGEgcGFydCBvZiBwcm9jZXNzaW5nIHRoZSBFQ09GRiAuZnJhbWUgZGlyZWN0aXZlLiAgKi8KLQotaW50Ci10Y19nZXRfcmVnaXN0ZXIgKGZyYW1lKQotICAgICBpbnQgZnJhbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGZyYW1lcmVnID0gQVhQX1JFR19TUDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICckJykKLSAgICB7Ci0gICAgICBjaGFyICpzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xTICpzeW0gPSBtZF91bmRlZmluZWRfc3ltYm9sIChzKTsKLQotICAgICAgKnN0cmNocihzLCAnXDAnKSA9IGM7Ci0gICAgICBpZiAoc3ltICYmIChmcmFtZXJlZyA9IFNfR0VUX1ZBTFVFIChzeW0pKSA8PSAzMSkKLQlnb3RvIGZvdW5kOwotICAgIH0KLSAgYXNfd2FybiAoXygiZnJhbWUgcmVnIGV4cGVjdGVkLCB1c2luZyAkJWQuIiksIGZyYW1lcmVnKTsKLQotZm91bmQ6Ci0gIG5vdGVfZ3ByZWcgKGZyYW1lcmVnKTsKLSAgcmV0dXJuIGZyYW1lcmVnOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHN5bWJvbCB0YWJsZSBpcyBwcm9jZXNzZWQuICBJbiBvcmRlciB0bwotICAgd29yayB3aXRoIGdjYyB3aGVuIHVzaW5nIG1pcHMtdGZpbGUsIHdlIG11c3Qga2VlcCBhbGwgbG9jYWwgbGFiZWxzLgotICAgSG93ZXZlciwgaW4gb3RoZXIgY2FzZXMsIHdlIHdhbnQgdG8gZGlzY2FyZCB0aGVtLiAgSWYgd2Ugd2VyZQotICAgY2FsbGVkIHdpdGggLWcsIGJ1dCB3ZSBkaWRuJ3Qgc2VlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGl0IG1heQotICAgbWVhbiB0aGF0IGdjYyBpcyBzbXVnZ2xpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRocm91Z2ggdG8KLSAgIG1pcHMtdGZpbGUsIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBnZW5lcmF0ZSBhbGwgbG9jYWwgbGFiZWxzLiAgKi8KLQotI2lmZGVmIE9CSl9FQ09GRgotCi12b2lkCi1hbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotewotICBpZiAoYWxwaGFfZGVidWcgIT0gMAotICAgICAgJiYgISBlY29mZl9kZWJ1Z2dpbmdfc2VlbikKLSAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKLX0KLQotI2VuZGlmIC8qIE9CSl9FQ09GRiAqLwotDAotI2lmZGVmIFJFTE9DX09QX1AKLQotLyogQmVmb3JlIHRoZSByZWxvY2F0aW9ucyBhcmUgd3JpdHRlbiwgcmVvcmRlciB0aGVtLCBzbyB0aGF0IHVzZXIgc3VwcGxpZWQKLSAgICFsaXR1c2UgcmVsb2NhdGlvbnMgZm9sbG93IHRoZSBhcHByb3ByaWF0ZSAhbGl0ZXJhbCByZWxvY2F0aW9ucy4gIEFsc28KLSAgIGNvbnZlcnQgdGhlIGdhcy1pbnRlcm5hbCByZWxvY2F0aW9ucyB0byB0aGUgYXBwcm9wcmlhdGUgbGlua2VyIHJlbG9jYXRpb25zLgotICAgKi8KLQotdm9pZAotYWxwaGFfYWRqdXN0X3N5bXRhYiAoKQotewotICBpZiAoYWxwaGFfbGl0ZXJhbF9oYXNoKQotICAgIHsKLSNpZmRlZiBERUJVRzJfQUxQSEEKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgImFscGhhX2FkanVzdF9zeW10YWIgY2FsbGVkXG4iKTsKLSNlbmRpZgotCi0gICAgICAvKiBHbyBvdmVyIGVhY2ggc2VjdGlvbiwgcmVvcmRlcmluZyB0aGUgcmVsb2NhdGlvbnMgc28gdGhhdCBhbGwgb2YgdGhlCi0gICAgICAgICBleHBsaWNpdCBMSVRVU0UncyBhcmUgYWRqYWNlbnQgdG8gdGhlIGV4cGxpY2l0IExJVEVSQUwncyAqLwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGFscGhhX2FkanVzdF9zeW10YWJfcmVsb2NzLCAoY2hhciAqKSAwKTsKLSAgICB9Ci19Ci0KLQwKLS8qIElubmVyIGZ1bmN0aW9uIHRvIG1vdmUgTElUVVNFJ3MgbmV4dCB0byB0aGUgTElURVJBTC4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jcyAoYWJmZCwgc2VjLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHB0cjsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgZml4UyAqKnByZXZQOwotICBmaXhTICpmaXhwOwotICBmaXhTICpuZXh0OwotICBmaXhTICpsaXR1c2U7Ci0gIGludCBuX2xpdHVzZXMgPSAwOwotCi0jaWZkZWYgREVCVUcyX0FMUEhBCi0gIGludCBuID0gMDsKLSAgaW50IG5fbGl0ZXJhbHMgPSAwOwotICBpbnQgbl9kdXBfbGl0ZXJhbHMgPSAwOwotI2VuZGlmCi0KLSAgLyogSWYgc2VnaW5mbyBpcyBOVUxMLCB3ZSBkaWQgbm90IGNyZWF0ZSB0aGlzIHNlY3Rpb247IGRvbid0IGRvIGFueXRoaW5nIHdpdGgKLSAgICAgaXQuICBCeSB1c2luZyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyLCB3ZSBjYW4gdXBkYXRlIHRoZSBsaW5rcyBpbiBwbGFjZS4gICovCi0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWxvY2F0aW9ucywgc2tpcCB0aGUgc2VjdGlvbi4gICovCi0gIGlmICghIHNlZ2luZm8tPmZpeF9yb290KQotICAgIHJldHVybjsKLQotICAvKiBGaXJzdCByZWJ1aWxkIHRoZSBmaXh1cCBjaGFpbiB3aXRob3V0IHRoZSBleHBpY2l0IGxpdHVzZSdzLiAgKi8KLSAgcHJldlAgPSAmKHNlZ2luZm8tPmZpeF9yb290KTsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHA7IGZpeHAgPSBuZXh0KQotICAgIHsKLSAgICAgIG5leHQgPSBmaXhwLT5meF9uZXh0OwotICAgICAgZml4cC0+ZnhfbmV4dCA9IChmaXhTICopMDsKLSNpZmRlZiBERUJVRzJfQUxQSEEKLSAgICAgIG4rKzsKLSNlbmRpZgotCi0gICAgICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICpwcmV2UCA9IGZpeHA7Ci0JICBwcmV2UCA9ICYoZml4cC0+ZnhfbmV4dCk7Ci0jaWZkZWYgREVCVUcyX0FMUEhBCi0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICJhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jczogMHglbHgsIG90aGVyIHJlbG9jYXRpb24gJXNcbiIsCi0JCSAgIChsb25nKWZpeHAsCi0JCSAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhwLT5meF9yX3R5cGUpKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0JICAqcHJldlAgPSBmaXhwOwotCSAgcHJldlAgPSAmKGZpeHAtPmZ4X25leHQpOwotCSAgLyogcHJldmVudCBhc3NlbWJsZXIgZnJvbSB0cnlpbmcgdG8gYWRqdXN0IHRoZSBvZmZzZXQgKi8KLSNpZmRlZiBERUJVRzJfQUxQSEEKLQkgIG5fbGl0ZXJhbHMrKzsKLQkgIGlmIChmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5uX2xpdGVyYWxzICE9IDEpCi0JICAgIG5fZHVwX2xpdGVyYWxzKys7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICJhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jczogMHglbHgsICFsaXRlcmFsISUuNmQsICMgbGl0ZXJhbHMgPSAlMmRcbiIsCi0JCSAgIChsb25nKWZpeHAsCi0JCSAgIGZpeHAtPnRjX2ZpeF9kYXRhLmluZm8tPnNlcXVlbmNlLAotCQkgICBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5uX2xpdGVyYWxzKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQkgIC8qIGRvIG5vdCBsaW5rIGluIGxpdHVzZSdzICovCi0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRToKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotCSAgbl9saXR1c2VzKys7Ci0JICBpZiAoZml4cC0+dGNfZml4X2RhdGEuaW5mby0+bl9saXRlcmFscyA9PSAwKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgIF8oIk5vICFsaXRlcmFsISVkIHdhcyBmb3VuZCIpLAotCQkJICBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5zZXF1ZW5jZSk7Ci0jaWZkZWYgREVCVUcyX0FMUEhBCi0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICJhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jczogMHglbHgsICFsaXR1c2UgISUuNmQsICMgbGl0dXNlcyAgPSAlMmQsIG5leHRfbGl0dXNlID0gMHglbHhcbiIsCi0JCSAgIChsb25nKWZpeHAsCi0JCSAgIGZpeHAtPnRjX2ZpeF9kYXRhLmluZm8tPnNlcXVlbmNlLAotCQkgICBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5uX2xpdHVzZXMsCi0JCSAgIChsb25nKWZpeHAtPnRjX2ZpeF9kYXRhLm5leHRfbGl0dXNlKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGVyZSB3ZXJlIGFueSBsaXR1c2VzLCBnbyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNoYWluLCB1bmxlc3MgdGhlcmUgaXMKLSAgICAgbW9yZSB0aGFuIG9uZSAhbGl0ZXJhbCBmb3IgYSBnaXZlbiBzZXF1ZW5jZSBudW1iZXIuICBUaGV5IGFyZSBsaW5rZWQKLSAgICAgdGhyb3VnaCB0aGUgbmV4dF9saXR1c2UgZmllbGQgaW4gcmV2ZXJzZSBvcmRlciwgc28gYXMgd2UgZ28gdGhyb3VnaCB0aGUKLSAgICAgbmV4dF9saXR1c2UgY2hhaW4sIHdlIGVmZmVjdGl2ZWx5IHJldmVyc2UgdGhlIGNoYWluIG9uY2UgYWdhaW4uICBJZiB0aGVyZQotICAgICB3YXMgbW9yZSB0aGFuIG9uZSAhbGl0ZXJhbCwgd2UgZmFsbCBiYWNrIHRvIGxvYWRpbmcgdXAgdGhlIGFkZHJlc3Mgdy9vCi0gICAgIG9wdGltaXphdGlvbi4gIEFsc28sIGlmIHRoZSAhbGl0ZXJhbHMvIWxpdHVzZXMgYXJlIHNwcmVhZCBpbiBkaWZmZXJlbnQKLSAgICAgc2VnbWVudHMgKGhhcHBlbnMgaW4gdGhlIExpbnV4IGtlcm5lbCBzZW1hcGhvcmVzKSwgc3VwcHJlc3MgdGhlCi0gICAgIG9wdGltaXphdGlvbi4gICovCi0gIGlmIChuX2xpdHVzZXMpCi0gICAgewotICAgICAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHA7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMOgotI2lmZGVmIE9CSl9FTEYKLQkgICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw7Ci0jZWxzZQotCSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOwkvKiBYWFggY2hlY2sgdGhpcyAqLwotI2VuZGlmCi0JICAgICAgaWYgKGZpeHAtPnRjX2ZpeF9kYXRhLmluZm8tPm5fbGl0ZXJhbHMgPT0gMQotCQkgICYmICEgZml4cC0+dGNfZml4X2RhdGEuaW5mby0+bXVsdGlfc2VjdGlvbl9wKQotCQl7Ci0JCSAgZm9yIChsaXR1c2UgPSBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5saXR1c2U7Ci0JCSAgICAgICBsaXR1c2UgIT0gKGZpeFMgKikwOwotCQkgICAgICAgbGl0dXNlID0gbGl0dXNlLT50Y19maXhfZGF0YS5uZXh0X2xpdHVzZSkKLQkJICAgIHsKLQkJICAgICAgbGl0dXNlLT5meF9uZXh0ID0gZml4cC0+ZnhfbmV4dDsKLQkJICAgICAgZml4cC0+ZnhfbmV4dCA9IGxpdHVzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0U6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotCSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZkZWYgREVCVUcyX0FMUEhBCi0gIGZwcmludGYgKHN0ZGVyciwgImFscGhhX2FkanVzdF9zeW10YWJfcmVsb2NzOiAlcywgJWQgbGl0ZXJhbCVzLCAlZCBkdXBsaWNhdGUgbGl0ZXJhbCVzLCAlZCBsaXR1c2Ulc1xuXG4iLAotCSAgIHNlYy0+bmFtZSwKLQkgICBuX2xpdGVyYWxzLCAobl9saXRlcmFscyA9PSAxKSA/ICIiIDogInMiLAotCSAgIG5fZHVwX2xpdGVyYWxzLCAobl9kdXBfbGl0ZXJhbHMgPT0gMSkgPyAiIiA6ICJzIiwKLQkgICBuX2xpdHVzZXMsIChuX2xpdHVzZXMgPT0gMSkgPyAiIiA6ICJzIik7Ci0jZW5kaWYKLX0KLQotI2VuZGlmIC8qIFJFTE9DX09QX1AgKi8KLQotDAotI2lmZGVmIERFQlVHX0FMUEhBCi1zdGF0aWMgdm9pZAotZGVidWdfZXhwICh0b2ssIG50b2spCi0gICAgIGV4cHJlc3Npb25TIHRva1tdOwotICAgICBpbnQgbnRvazsKLXsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiZGVidWdfZXhwOiAlZCB0b2tlbnMiLCBudG9rKTsKLSAgZm9yIChpID0gMDsgaSA8IG50b2s7IGkrKykKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyAqdCA9ICZ0b2tbaV07Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3dpdGNoICh0LT5YX29wKQotCXsKLQlkZWZhdWx0OgkJCW5hbWUgPSAidW5rbm93biI7CQlicmVhazsKLQljYXNlIE9faWxsZWdhbDoJCQluYW1lID0gIk9faWxsZWdhbCI7CQlicmVhazsKLQljYXNlIE9fYWJzZW50OgkJCW5hbWUgPSAiT19hYnNlbnQiOwkJYnJlYWs7Ci0JY2FzZSBPX2NvbnN0YW50OgkJbmFtZSA9ICJPX2NvbnN0YW50IjsJCWJyZWFrOwotCWNhc2UgT19zeW1ib2w6CQkJbmFtZSA9ICJPX3N5bWJvbCI7CQlicmVhazsKLQljYXNlIE9fc3ltYm9sX3J2YToJCW5hbWUgPSAiT19zeW1ib2xfcnZhIjsJCWJyZWFrOwotCWNhc2UgT19yZWdpc3RlcjoJCW5hbWUgPSAiT19yZWdpc3RlciI7CQlicmVhazsKLQljYXNlIE9fYmlnOgkJCW5hbWUgPSAiT19iaWciOwkJCWJyZWFrOwotCWNhc2UgT191bWludXM6CQkJbmFtZSA9ICJPX3VtaW51cyI7CQlicmVhazsKLQljYXNlIE9fYml0X25vdDoJCQluYW1lID0gIk9fYml0X25vdCI7CQlicmVhazsKLQljYXNlIE9fbG9naWNhbF9ub3Q6CQluYW1lID0gIk9fbG9naWNhbF9ub3QiOwkJYnJlYWs7Ci0JY2FzZSBPX211bHRpcGx5OgkJbmFtZSA9ICJPX211bHRpcGx5IjsJCWJyZWFrOwotCWNhc2UgT19kaXZpZGU6CQkJbmFtZSA9ICJPX2RpdmlkZSI7CQlicmVhazsKLQljYXNlIE9fbW9kdWx1czoJCQluYW1lID0gIk9fbW9kdWx1cyI7CQlicmVhazsKLQljYXNlIE9fbGVmdF9zaGlmdDoJCW5hbWUgPSAiT19sZWZ0X3NoaWZ0IjsJCWJyZWFrOwotCWNhc2UgT19yaWdodF9zaGlmdDoJCW5hbWUgPSAiT19yaWdodF9zaGlmdCI7CQlicmVhazsKLQljYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoJbmFtZSA9ICJPX2JpdF9pbmNsdXNpdmVfb3IiOwlicmVhazsKLQljYXNlIE9fYml0X29yX25vdDoJCW5hbWUgPSAiT19iaXRfb3Jfbm90IjsJCWJyZWFrOwotCWNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgluYW1lID0gIk9fYml0X2V4Y2x1c2l2ZV9vciI7CWJyZWFrOwotCWNhc2UgT19iaXRfYW5kOgkJCW5hbWUgPSAiT19iaXRfYW5kIjsJCWJyZWFrOwotCWNhc2UgT19hZGQ6CQkJbmFtZSA9ICJPX2FkZCI7CQkJYnJlYWs7Ci0JY2FzZSBPX3N1YnRyYWN0OgkJbmFtZSA9ICJPX3N1YnRyYWN0IjsJCWJyZWFrOwotCWNhc2UgT19lcToJCQluYW1lID0gIk9fZXEiOwkJCWJyZWFrOwotCWNhc2UgT19uZToJCQluYW1lID0gIk9fbmUiOwkJCWJyZWFrOwotCWNhc2UgT19sdDoJCQluYW1lID0gIk9fbHQiOwkJCWJyZWFrOwotCWNhc2UgT19sZToJCQluYW1lID0gIk9fbGUiOwkJCWJyZWFrOwotCWNhc2UgT19nZToJCQluYW1lID0gIk9fZ2UiOwkJCWJyZWFrOwotCWNhc2UgT19ndDoJCQluYW1lID0gIk9fZ3QiOwkJCWJyZWFrOwotCWNhc2UgT19sb2dpY2FsX2FuZDoJCW5hbWUgPSAiT19sb2dpY2FsX2FuZCI7CQlicmVhazsKLQljYXNlIE9fbG9naWNhbF9vcjoJCW5hbWUgPSAiT19sb2dpY2FsX29yIjsJCWJyZWFrOwotCWNhc2UgT19pbmRleDoJCQluYW1lID0gIk9faW5kZXgiOwkJYnJlYWs7Ci0JY2FzZSBPX3ByZWdpc3RlcjoJCW5hbWUgPSAiT19wcmVnaXN0ZXIiOwkJYnJlYWs7Ci0JY2FzZSBPX2NwcmVnaXN0ZXI6CQluYW1lID0gIk9fY3ByZWdpc3RlciI7CQlicmVhazsKLQljYXNlIE9fbGl0ZXJhbDoJCQluYW1lID0gIk9fbGl0ZXJhbCI7CQlicmVhazsKLQljYXNlIE9fbGl0dXNlX2Jhc2U6CQluYW1lID0gIk9fbGl0dXNlX2Jhc2UiOwkJYnJlYWs7Ci0JY2FzZSBPX2xpdHVzZV9ieXRvZmY6CQluYW1lID0gIk9fbGl0dXNlX2J5dG9mZiI7CWJyZWFrOwotCWNhc2UgT19saXR1c2VfanNyOgkJbmFtZSA9ICJPX2xpdHVzZV9qc3IiOwkJYnJlYWs7Ci0JY2FzZSBPX2dwZGlzcDoJCQluYW1lID0gIk9fZ3BkaXNwIjsJCWJyZWFrOwotCWNhc2UgT19ncHJlbGhpZ2g6CQluYW1lID0gIk9fZ3ByZWxoaWdoIjsJCWJyZWFrOwotCWNhc2UgT19ncHJlbGxvdzoJCW5hbWUgPSAiT19ncHJlbGxvdyI7CQlicmVhazsKLQljYXNlIE9fbWQxMDoJCQluYW1lID0gIk9fbWQxMCI7CQlicmVhazsKLQljYXNlIE9fbWQxMToJCQluYW1lID0gIk9fbWQxMSI7CQlicmVhazsKLQljYXNlIE9fbWQxMjoJCQluYW1lID0gIk9fbWQxMiI7CQlicmVhazsKLQljYXNlIE9fbWQxMzoJCQluYW1lID0gIk9fbWQxMyI7CQlicmVhazsKLQljYXNlIE9fbWQxNDoJCQluYW1lID0gIk9fbWQxNCI7CQlicmVhazsKLQljYXNlIE9fbWQxNToJCQluYW1lID0gIk9fbWQxNSI7CQlicmVhazsKLQljYXNlIE9fbWQxNjoJCQluYW1lID0gIk9fbWQxNiI7CQlicmVhazsKLQl9Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiwgJXMoJXMsICVzLCAlZCkiLCBuYW1lLAotCSAgICAgICAodC0+WF9hZGRfc3ltYm9sKSA/IFNfR0VUX05BTUUgKHQtPlhfYWRkX3N5bWJvbCkgOiAiLS0iLAotCSAgICAgICAodC0+WF9vcF9zeW1ib2wpID8gU19HRVRfTkFNRSAodC0+WF9vcF9zeW1ib2wpIDogIi0tIiwKLQkgICAgICAgKGludCl0LT5YX2FkZF9udW1iZXIpOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotfQotI2VuZGlmCi0KLS8qIFBhcnNlIHRoZSBhcmd1bWVudHMgdG8gYW4gb3Bjb2RlLiAgKi8KLQotc3RhdGljIGludAotdG9rZW5pemVfYXJndW1lbnRzIChzdHIsIHRvaywgbnRvaykKLSAgICAgY2hhciAqc3RyOwotICAgICBleHByZXNzaW9uUyB0b2tbXTsKLSAgICAgaW50IG50b2s7Ci17Ci0gIGV4cHJlc3Npb25TICplbmRfdG9rID0gdG9rICsgbnRvazsKLSAgY2hhciAqb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IHNhd19jb21tYSA9IDAsIHNhd19hcmcgPSAwOwotI2lmZGVmIERFQlVHX0FMUEhBCi0gIGV4cHJlc3Npb25TICpvcmlnX3RvayA9IHRvazsKLSNlbmRpZgotI2lmZGVmIFJFTE9DX09QX1AKLSAgY2hhciAqcDsKLSAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqcjsKLSAgaW50IGMsIGk7Ci0gIHNpemVfdCBsZW47Ci0gIGludCByZWxvY19mb3VuZF9wID0gMDsKLSNlbmRpZgotCi0gIG1lbXNldCAodG9rLCAwLCBzaXplb2YgKCp0b2spICogbnRvayk7Ci0KLSAgLyogU2F2ZSBhbmQgcmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgYXJvdW5kIHRoaXMgZnVuY3Rpb24gKi8KLSAgb2xkX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIHdoaWxlICh0b2sgPCBlbmRfdG9rICYmICppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICdcMCc6Ci0JICBnb3RvIGZpbmk7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0JY2FzZSAnISc6Ci0JICAvKiBBIHJlbG9jYXRpb24gb3BlcmFuZCBjYW4gYmUgcGxhY2VkIGFmdGVyIHRoZSBub3JtYWwgb3BlcmFuZCBvbiBhbgotCSAgICAgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3RhdGVtZW50LCBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybToKLQkJIXJlbG9jYXRpb25fdHlwZSFzZXF1ZW5jZV9udW1iZXIuICAqLwotCSAgaWYgKHJlbG9jX2ZvdW5kX3ApCi0JICAgIHsJCQkvKiBvbmx5IHN1cHBvcnQgb25lIHJlbG9jYXRpb24gb3AgcGVyIGluc24gKi8KLQkgICAgICBhc19iYWQgKF8oIk1vcmUgdGhhbiBvbmUgcmVsb2NhdGlvbiBvcCBwZXIgaW5zbiIpKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgaWYgKCFzYXdfYXJnKQotCSAgICBnb3RvIGVycjsKLQotCSAgZm9yIChwID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgICgoYyA9ICpwKSAhPSAnIScgJiYgYyAhPSAnOycgJiYgYyAhPSAnIycgJiYgYyAhPSAnLCcKLQkJJiYgIWlzX2VuZF9vZl9saW5lW2NdKTsKLQkgICAgICAgcCsrKQotCSAgICA7Ci0KLQkgIC8qIFBhcnNlICFyZWxvY2F0aW9uX3R5cGUgKi8KLQkgIGxlbiA9IHAgLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpZiAobGVuID09IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIk5vIHJlbG9jYXRpb24gb3BlcmFuZCIpKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgaWYgKGMgIT0gJyEnKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJObyAhc2VxdWVuY2UtbnVtYmVyIGFmdGVyICElcyIpLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgICAgIGdvdG8gZXJyX3JlcG9ydDsKLQkgICAgfQotCi0JICByID0gJmFscGhhX3JlbG9jX29wWzBdOwotCSAgZm9yIChpID0gYWxwaGFfbnVtX3JlbG9jX29wLTE7IGkgPj0gMDsgaS0tLCByKyspCi0JICAgIHsKLQkgICAgICBpZiAobGVuID09IHItPmxlbmd0aAotCQkgICYmIG1lbWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCByLT5uYW1lLCBsZW4pID09IDApCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoaSA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIlVua25vd24gcmVsb2NhdGlvbiBvcGVyYW5kOiAhJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gKytwOwotCi0JICAvKiBQYXJzZSAhc2VxdWVuY2VfbnVtYmVyICovCi0JICBtZW1zZXQgKHRvaywgJ1wwJywgc2l6ZW9mIChleHByZXNzaW9uUykpOwotCSAgZXhwcmVzc2lvbiAodG9rKTsKLQotCSAgaWYgKHRvay0+WF9vcCAhPSBPX2NvbnN0YW50Ci0JICAgICAgfHwgISBBTFBIQV9SRUxPQ19TRVFVRU5DRV9PSyAodG9rLT5YX2FkZF9udW1iZXIpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJCYWQgc2VxdWVuY2UgbnVtYmVyOiAhJXMhJXMiKSwgci0+bmFtZSwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgdG9rLT5YX29wID0gci0+b3A7Ci0JICByZWxvY19mb3VuZF9wID0gMTsKLQkgICsrdG9rOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgJywnOgotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpZiAoc2F3X2NvbW1hIHx8ICFzYXdfYXJnKQotCSAgICBnb3RvIGVycjsKLQkgIHNhd19jb21tYSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJygnOgotCSAgewotCSAgICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLQkgICAgLyogRmlyc3QgdHJ5IGZvciBwYXJlbnRoZXNpemVkIHJlZ2lzdGVyIC4uLiAqLwotCSAgICBleHByZXNzaW9uICh0b2spOwotCSAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKScgJiYgdG9rLT5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgICAgewotCQl0b2stPlhfb3AgPSAoc2F3X2NvbW1hID8gT19jcHJlZ2lzdGVyIDogT19wcmVnaXN0ZXIpOwotCQlzYXdfY29tbWEgPSAwOwotCQlzYXdfYXJnID0gMTsKLQkJKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSsrdG9rOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogLi4uIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHBsYWluIGV4cHJlc3Npb24gKi8KLQkgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgIH0KLQotCWRlZmF1bHQ6Ci0JICBpZiAoc2F3X2FyZyAmJiAhc2F3X2NvbW1hKQotCSAgICBnb3RvIGVycjsKLQotCSAgZXhwcmVzc2lvbiAodG9rKTsKLQkgIGlmICh0b2stPlhfb3AgPT0gT19pbGxlZ2FsIHx8IHRvay0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgZ290byBlcnI7Ci0KLQkgIHNhd19jb21tYSA9IDA7Ci0JICBzYXdfYXJnID0gMTsKLQkgICsrdG9rOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotZmluaToKLSAgaWYgKHNhd19jb21tYSkKLSAgICBnb3RvIGVycjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotI2lmZGVmIERFQlVHX0FMUEhBCi0gIGRlYnVnX2V4cCAob3JpZ190b2ssIG50b2sgLSAoZW5kX3RvayAtIHRvaykpOwotI2VuZGlmCi0KLSAgcmV0dXJuIG50b2sgLSAoZW5kX3RvayAtIHRvayk7Ci0KLWVycjoKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgcmV0dXJuIFRPS0VOSVpFX0VSUk9SOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotZXJyX3JlcG9ydDoKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgcmV0dXJuIFRPS0VOSVpFX0VSUk9SX1JFUE9SVDsKLSNlbmRpZgotfQotCi0vKiBTZWFyY2ggZm9yd2FyZCB0aHJvdWdoIGFsbCB2YXJpYW50cyBvZiBhbiBvcGNvZGUgbG9va2luZyBmb3IgYQotICAgc3ludGF4IG1hdGNoLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKgotZmluZF9vcGNvZGVfbWF0Y2goZmlyc3Rfb3Bjb2RlLCB0b2ssIHBudG9rLCBwY3B1bWF0Y2gpCi0gICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKmZpcnN0X29wY29kZTsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50ICpwbnRvazsKLSAgICAgaW50ICpwY3B1bWF0Y2g7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZSA9IGZpcnN0X29wY29kZTsKLSAgaW50IG50b2sgPSAqcG50b2s7Ci0gIGludCBnb3RfY3B1X21hdGNoID0gMDsKLQotICBkbwotICAgIHsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waWR4OwotICAgICAgaW50IHRva2lkeCA9IDA7Ci0KLSAgICAgIC8qIERvbid0IG1hdGNoIG9wY29kZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIGFyY2hpdGVjdHVyZSAqLwotICAgICAgaWYgKCEob3Bjb2RlLT5mbGFncyAmIGFscGhhX3RhcmdldCkpCi0JZ290byBtYXRjaF9mYWlsZWQ7Ci0KLSAgICAgIGdvdF9jcHVfbWF0Y2ggPSAxOwotCi0gICAgICBmb3IgKG9waWR4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waWR4OyArK29waWR4KQotCXsKLQkgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWypvcGlkeF07Ci0KLQkgIC8qIG9ubHkgdGFrZSBpbnB1dCBmcm9tIHJlYWwgb3BlcmFuZHMgKi8KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZBS0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiB3aGVuIHdlIGV4cGVjdCBpbnB1dCwgbWFrZSBzdXJlIHdlIGhhdmUgaXQgKi8KLQkgIGlmICh0b2tpZHggPj0gbnRvaykKLQkgICAgewotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9PUFRJT05BTF9NQVNLKSA9PSAwKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBtYXRjaCBvcGVyYW5kIHR5cGUgd2l0aCBleHByZXNzaW9uIHR5cGUgKi8KLQkgIHN3aXRjaCAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9UWVBFQ0hFQ0tfTUFTSykKLQkgICAgewotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0lSOgotCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0ZQUjoKLQkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2Zwcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TOgotCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fcHJlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9QQVJFTlN8QVhQX09QRVJBTkRfQ09NTUE6Ci0JICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19jcHJlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFYUF9PUEVSQU5EX1JFTEFUSVZFOgotCSAgICBjYXNlIEFYUF9PUEVSQU5EX1NJR05FRDoKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9VTlNJR05FRDoKLQkgICAgICBzd2l0Y2ggKHRva1t0b2tpZHhdLlhfb3ApCi0JCXsKLQkJY2FzZSBPX2lsbGVnYWw6Ci0JCWNhc2UgT19hYnNlbnQ6Ci0JCWNhc2UgT19yZWdpc3RlcjoKLQkJY2FzZSBPX3ByZWdpc3RlcjoKLQkJY2FzZSBPX2NwcmVnaXN0ZXI6Ci0JCSAgZ290byBtYXRjaF9mYWlsZWQ7Ci0KLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogZXZlcnl0aGluZyBlbHNlIHNob3VsZCBoYXZlIGJlZW4gZmFrZSAqLwotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQkgICsrdG9raWR4OwotCX0KLQotICAgICAgLyogcG9zc2libGUgbWF0Y2ggLS0gZGlkIHdlIHVzZSBhbGwgb2Ygb3VyIGlucHV0PyAqLwotICAgICAgaWYgKHRva2lkeCA9PSBudG9rKQotCXsKLQkgICpwbnRvayA9IG50b2s7Ci0JICByZXR1cm4gb3Bjb2RlOwotCX0KLQotICAgIG1hdGNoX2ZhaWxlZDo7Ci0gICAgfQotICB3aGlsZSAoKytvcGNvZGUtYWxwaGFfb3Bjb2RlcyA8IGFscGhhX251bV9vcGNvZGVzCi0JICYmICFzdHJjbXAob3Bjb2RlLT5uYW1lLCBmaXJzdF9vcGNvZGUtPm5hbWUpKTsKLQotICBpZiAoKnBjcHVtYXRjaCkKLSAgICAgICpwY3B1bWF0Y2ggPSBnb3RfY3B1X21hdGNoOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZWFyY2ggZm9yd2FyZCB0aHJvdWdoIGFsbCB2YXJpYW50cyBvZiBhIG1hY3JvIGxvb2tpbmcgZm9yIGEgc3ludGF4Ci0gICBtYXRjaC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKgotZmluZF9tYWNyb19tYXRjaChmaXJzdF9tYWNybywgdG9rLCBwbnRvaykKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICpmaXJzdF9tYWNybzsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50ICpwbnRvazsKLXsKLSAgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICptYWNybyA9IGZpcnN0X21hY3JvOwotICBpbnQgbnRvayA9ICpwbnRvazsKLQotICBkbwotICAgIHsKLSAgICAgIGNvbnN0IGVudW0gYWxwaGFfbWFjcm9fYXJnICphcmcgPSBtYWNyby0+YXJnc2V0czsKLSAgICAgIGludCB0b2tpZHggPSAwOwotCi0gICAgICB3aGlsZSAoKmFyZykKLQl7Ci0JICBzd2l0Y2ggKCphcmcpCi0JICAgIHsKLQkgICAgY2FzZSBNQUNST19FT0E6Ci0JICAgICAgaWYgKHRva2lkeCA9PSBudG9rKQotCQlyZXR1cm4gbWFjcm87Ci0JICAgICAgZWxzZQotCQl0b2tpZHggPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgLyogaW5kZXggcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSBNQUNST19JUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIHBhcmVudGhlc2l6ZWQgaW5kZXggcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSBNQUNST19QSVI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19wcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgLyogb3B0aW9uYWwgcGFyZW50aGVzaXplZCBpbmRleCByZWdpc3RlciAqLwotCSAgICBjYXNlIE1BQ1JPX09QSVI6Ci0JICAgICAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX3ByZWdpc3RlcgotCQkgICYmIGlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQkrK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIGxlYWRpbmcgY29tbWEgd2l0aCBhIHBhcmVudGhlc2l6ZWQgaW5kZXggcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSBNQUNST19DUElSOgotCSAgICAgIGlmICh0b2tpZHggPj0gbnRvayB8fCB0b2tbdG9raWR4XS5YX29wICE9IE9fY3ByZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgKyt0b2tpZHg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotCSAgICBjYXNlIE1BQ1JPX0ZQUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2Zwcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgKyt0b2tpZHg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBub3JtYWwgZXhwcmVzc2lvbiAqLwotCSAgICBjYXNlIE1BQ1JPX0VYUDoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2spCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIHN3aXRjaCAodG9rW3Rva2lkeF0uWF9vcCkKLQkJewotCQljYXNlIE9faWxsZWdhbDoKLQkJY2FzZSBPX2Fic2VudDoKLQkJY2FzZSBPX3JlZ2lzdGVyOgotCQljYXNlIE9fcHJlZ2lzdGVyOgotCQljYXNlIE9fY3ByZWdpc3RlcjoKLSNpZmRlZiBSRUxPQ19PUF9QCi0JCWNhc2UgT19saXRlcmFsOgotCQljYXNlIE9fbGl0dXNlX2Jhc2U6Ci0JCWNhc2UgT19saXR1c2VfYnl0b2ZmOgotCQljYXNlIE9fbGl0dXNlX2pzcjoKLQkJY2FzZSBPX2dwZGlzcDoKLQkJY2FzZSBPX2dwcmVsaGlnaDoKLQkJY2FzZSBPX2dwcmVsbG93OgotI2VuZGlmCi0JCSAgZ290byBtYXRjaF9mYWlsZWQ7Ci0KLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgLyogb3B0aW9uYWwgIWxpdGVyYWwhPG51bWJlcj4gKi8KLQkgICAgY2FzZSBNQUNST19MSVRFUkFMOgotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fbGl0ZXJhbCkKLQkJdG9raWR4Kys7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIG9wdGlvbmFsICFsaXR1c2VfYmFzZSE8bnVtYmVyPiAqLwotCSAgICBjYXNlIE1BQ1JPX0JBU0U6Ci0jaWZkZWYgUkVMT0NfT1BfUAotCSAgICAgIGlmICh0b2tpZHggPCBudG9rICYmIHRva1t0b2tpZHhdLlhfb3AgPT0gT19saXR1c2VfYmFzZSkKLQkJdG9raWR4Kys7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIG9wdGlvbmFsICFsaXR1c2VfYnl0b2ZmITxudW1iZXI+ICovCi0JICAgIGNhc2UgTUFDUk9fQllUT0ZGOgotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fbGl0dXNlX2J5dG9mZikKLQkJdG9raWR4Kys7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIG9wdGlvbmFsICFsaXR1c2VfanNyITxudW1iZXI+ICovCi0JICAgIGNhc2UgTUFDUk9fSlNSOgotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fbGl0dXNlX2pzcikKLQkJdG9raWR4Kys7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICBtYXRjaF9mYWlsZWQ6Ci0JICAgICAgd2hpbGUgKCphcmcgIT0gTUFDUk9fRU9BKQotCQkrK2FyZzsKLQkgICAgICB0b2tpZHggPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICArK2FyZzsKLQl9Ci0gICAgfQotICB3aGlsZSAoKyttYWNyby1hbHBoYV9tYWNyb3MgPCBhbHBoYV9udW1fbWFjcm9zCi0JICYmICFzdHJjbXAobWFjcm8tPm5hbWUsIGZpcnN0X21hY3JvLT5uYW1lKSk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9vcGVyYW5kKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMiAmJiAhKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfTk9PVkVSRkxPVykpCi0gICAgewotICAgICAgb2Zmc2V0VCBtaW4sIG1heDsKLQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCXsKLQkgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0oMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgbWluID0gMDsKLQl9Ci0KLSAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQotCXsKLQkgIGNvbnN0IGNoYXIgKmVyciA9Ci0JICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlZCBhbmQgJWQpIik7Ci0JICBjaGFyIGJ1ZltzaXplb2YgKHZhbCkgKiAzICsgMl07Ci0KLQkgIHNwcmludF92YWx1ZShidWYsIHZhbCk7Ci0JICBpZiAoZmlsZSkKLQkgICAgYXNfd2Fybl93aGVyZShmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgZWxzZQotCSAgICBhc193YXJuKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnKQotCWFzX3dhcm4gKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qCi0gKiBUdXJuIGFuIG9wY29kZSBkZXNjcmlwdGlvbiBhbmQgYSBzZXQgb2YgYXJndW1lbnRzIGludG8KLSAqIGFuIGluc3RydWN0aW9uIGFuZCBhIGZpeHVwLgotICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV9pbnNuKG9wY29kZSwgdG9rLCBudG9rLCBpbnNuKQotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYXJnaWR4OwotICB1bnNpZ25lZCBpbWFnZTsKLSAgaW50IHRva2lkeCA9IDA7Ci0KLSAgbWVtc2V0IChpbnNuLCAwLCBzaXplb2YgKCppbnNuKSk7Ci0gIGltYWdlID0gb3Bjb2RlLT5vcGNvZGU7Ci0KLSAgZm9yIChhcmdpZHggPSBvcGNvZGUtPm9wZXJhbmRzOyAqYXJnaWR4OyArK2FyZ2lkeCkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1sqYXJnaWR4XTsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0ID0gKGNvbnN0IGV4cHJlc3Npb25TICopMDsKLQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfRkFLRSkKLQl7Ci0JICAvKiBmYWtlIG9wZXJhbmRzIHRha2Ugbm8gdmFsdWUgYW5kIGdlbmVyYXRlIG5vIGZpeHVwICovCi0JICBpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCAwLCBOVUxMLCAwKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHRva2lkeCA+PSBudG9rKQotCXsKLQkgIHN3aXRjaCAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9PUFRJT05BTF9NQVNLKQotCSAgICB7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfREVGQVVMVF9GSVJTVDoKLQkgICAgICB0ID0gJnRva1swXTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORDoKLQkgICAgICB0ID0gJnRva1sxXTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk86Ci0JICAgICAgewotCQlzdGF0aWMgZXhwcmVzc2lvblMgemVyb19leHA7Ci0JCXQgPSAmemVyb19leHA7Ci0JCXplcm9fZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCQl6ZXJvX2V4cC5YX3Vuc2lnbmVkID0gMTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl0ID0gJnRva1t0b2tpZHgrK107Ci0KLSAgICAgIHN3aXRjaCAodC0+WF9vcCkKLQl7Ci0JY2FzZSBPX3JlZ2lzdGVyOgotCWNhc2UgT19wcmVnaXN0ZXI6Ci0JY2FzZSBPX2NwcmVnaXN0ZXI6Ci0JICBpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCByZWdubyh0LT5YX2FkZF9udW1iZXIpLAotCQkJCSBOVUxMLCAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2NvbnN0YW50OgotCSAgaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgdC0+WF9hZGRfbnVtYmVyLCBOVUxMLCAwKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHsKLQkgICAgc3RydWN0IGFscGhhX2ZpeHVwICpmaXh1cDsKLQotCSAgICBpZiAoaW5zbi0+bmZpeHVwcyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgICAgYXNfZmF0YWwoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICAgIGZpeHVwID0gJmluc24tPmZpeHVwc1tpbnNuLT5uZml4dXBzKytdOwotCi0JICAgIGZpeHVwLT5leHAgPSAqdDsKLQkgICAgZml4dXAtPnJlbG9jID0gb3BlcmFuZC0+ZGVmYXVsdF9yZWxvYzsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaW5zbi0+aW5zbiA9IGltYWdlOwotfQotCi0vKgotICogQWN0dWFsbHkgb3V0cHV0IGFuIGluc3RydWN0aW9uIHdpdGggaXRzIGZpeHVwLgotICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2luc24gKGluc24pCi0gICAgc3RydWN0IGFscGhhX2luc24gKmluc247Ci17Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotCi0gIC8qIFRha2UgY2FyZSBvZiBhbGlnbm1lbnQgZHV0aWVzICovCi0gIGlmIChhbHBoYV9hdXRvX2FsaWduX29uICYmIGFscGhhX2N1cnJlbnRfYWxpZ24gPCAyKQotICAgIGFscGhhX2FsaWduICgyLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiAyKQotICAgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAyOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbi0+aW5zbiwgNCk7Ci0KLSAgLyogQXBwbHkgdGhlIGZpeHVwcyBpbiBvcmRlciAqLwotICBmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bmZpeHVwczsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gKGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICopMDsKLSAgICAgIHN0cnVjdCBhbHBoYV9maXh1cCAqZml4dXAgPSAmaW5zbi0+Zml4dXBzW2ldOwotICAgICAgaW50IHNpemUsIHBjcmVsOwotICAgICAgZml4UyAqZml4UDsKLSNpZmRlZiBSRUxPQ19PUF9QCi0gICAgICBjaGFyIGJ1ZmZlcltBTFBIQV9SRUxPQ19ESUdJVFNdOwotICAgICAgc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnICppbmZvOwotI2VuZGlmCi0KLSAgICAgIC8qIFNvbWUgZml4dXBzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBhbmQgc28gaGF2ZSBubyBob3d0byAqLwotICAgICAgaWYgKChpbnQpZml4dXAtPnJlbG9jIDwgMCkKLQl7Ci0JICBvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWy0oaW50KWZpeHVwLT5yZWxvY107Ci0JICBzaXplID0gNDsKLQkgIHBjcmVsID0gKChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1JFTEFUSVZFKSAhPSAwKTsKLQl9Ci0gICAgICBlbHNlIHN3aXRjaCAoZml4dXAtPnJlbG9jKQotCXsKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseS4gKi8KLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjoKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLQkgIHNpemUgPSAyOwotCSAgcGNyZWwgPSAwOwotCSAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBSRUxPQ19PUF9QCi0JICAvKiBhbmQgdGhlc2UgYWxzbyBhcmUgaW50ZXJuYWwgb25seSByZWxvY2F0aW9ucyAqLwotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTDoKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1I6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1A6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0g6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVzoKLQkgIHNpemUgPSAyOwotCSAgcGNyZWwgPSAwOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvCi0JICAgICAgPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXAtPnJlbG9jKTsKLQkgICAgYXNzZXJ0IChyZWxvY19ob3d0byk7Ci0KLQkgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCSAgICBwY3JlbCA9IHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZTsKLQkgIH0KLQkgIGFzc2VydCAoc2l6ZSA+PSAxICYmIHNpemUgPD0gNCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJCSAgJmZpeHVwLT5leHAsIHBjcmVsLCBmaXh1cC0+cmVsb2MpOwotCi0gICAgICAvKiBUdXJuIG9mZiBjb21wbGFpbnRzIHRoYXQgdGhlIGFkZGVuZCBpcyB0b28gbGFyZ2UgZm9yIHNvbWUgZml4dXBzLAotICAgICAgICAgYW5kIGNvcHkgaW4gdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIGV4cGxpY2l0IHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIHN3aXRjaCAoZml4dXAtPnJlbG9jKQotCXsKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSNpZmRlZiBPQkpfRUNPRkYKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotI2VuZGlmCi0JY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLQkgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgIGJyZWFrOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTDoKLQkgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgIHNwcmludGYgKGJ1ZmZlciwgIiEldSIsIGluc24tPnNlcXVlbmNlW2ldKTsKLQkgIGluZm8gPSAoKHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqKQotCQkgIGhhc2hfZmluZCAoYWxwaGFfbGl0ZXJhbF9oYXNoLCBidWZmZXIpKTsKLQotCSAgaWYgKCEgaW5mbykKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGJ1ZmZlcik7Ci0JICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0JICAgICAgaW5mbyA9ICgoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnICopCi0JCSAgICAgIHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnKSArIGxlbiwgMSkpOwotCi0JICAgICAgaW5mby0+c2VnbWVudCA9IG5vd19zZWc7Ci0JICAgICAgaW5mby0+c2VxdWVuY2UgPSBpbnNuLT5zZXF1ZW5jZVtpXTsKLQkgICAgICBzdHJjcHkgKGluZm8tPnN0cmluZywgYnVmZmVyKTsKLQkgICAgICBlcnJtc2cgPSBoYXNoX2luc2VydCAoYWxwaGFfbGl0ZXJhbF9oYXNoLCBpbmZvLT5zdHJpbmcsIChQVFIpaW5mbyk7Ci0JICAgICAgaWYgKGVycm1zZykKLQkJYXNfYmFkIChlcnJtc2cpOwotCSAgICB9Ci0KLQkgICsraW5mby0+bl9saXRlcmFsczsKLQotCSAgaWYgKGluZm8tPnNlZ21lbnQgIT0gbm93X3NlZykKLQkgICAgaW5mby0+bXVsdGlfc2VjdGlvbl9wID0gMTsKLQotCSAgZml4UC0+dGNfZml4X2RhdGEuaW5mbyA9IGluZm87Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0U6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUjoKLQkgIHNwcmludGYgKGJ1ZmZlciwgIiEldSIsIGluc24tPnNlcXVlbmNlW2ldKTsKLQkgIGluZm8gPSAoKHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqKQotCQkgIGhhc2hfZmluZCAoYWxwaGFfbGl0ZXJhbF9oYXNoLCBidWZmZXIpKTsKLQotCSAgaWYgKCEgaW5mbykKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGJ1ZmZlcik7Ci0JICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0JICAgICAgaW5mbyA9ICgoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnICopCi0JCSAgICAgIHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnKSArIGxlbiwgMSkpOwotCi0JICAgICAgaW5mby0+c2VnbWVudCA9IG5vd19zZWc7Ci0JICAgICAgaW5mby0+c2VxdWVuY2UgPSBpbnNuLT5zZXF1ZW5jZVtpXTsKLQkgICAgICBzdHJjcHkgKGluZm8tPnN0cmluZywgYnVmZmVyKTsKLQkgICAgICBlcnJtc2cgPSBoYXNoX2luc2VydCAoYWxwaGFfbGl0ZXJhbF9oYXNoLCBpbmZvLT5zdHJpbmcsIChQVFIpaW5mbyk7Ci0JICAgICAgaWYgKGVycm1zZykKLQkJYXNfYmFkIChlcnJtc2cpOwotCSAgICB9Ci0JICBpbmZvLT5uX2xpdHVzZXMrKzsKLQkgIGZpeFAtPnRjX2ZpeF9kYXRhLmluZm8gPSBpbmZvOwotCSAgZml4UC0+dGNfZml4X2RhdGEubmV4dF9saXR1c2UgPSBpbmZvLT5saXR1c2U7Ci0JICBpbmZvLT5saXR1c2UgPSBmaXhQOwotCSAgaWYgKGluZm8tPnNlZ21lbnQgIT0gbm93X3NlZykKLQkgICAgaW5mby0+bXVsdGlfc2VjdGlvbl9wID0gMTsKLQotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWRlZmF1bHQ6Ci0JICBpZiAoKGludClmaXh1cC0+cmVsb2MgPCAwKQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfTk9PVkVSRkxPVykKLQkJZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhbiBvcGNvZGUgbmFtZSBhbmQgYSBwcmUtdG9rZW5pemVkIHNldCBvZiBhcmd1bWVudHMsIGFzc2VtYmxlCi0gICB0aGUgaW5zbiwgYnV0IGRvIG5vdCBlbWl0IGl0LgotCi0gICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIG5vIG1hY3JvcyBhbGxvd2VkLCBzaW5jZSB3ZSBjYW4ndCBzdG9yZSBtb3JlCi0gICB0aGFuIG9uZSBpbnNuIGluIGFuIGluc24gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzc2VtYmxlX3Rva2Vuc190b19pbnNuKG9wbmFtZSwgdG9rLCBudG9rLCBpbnNuKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlOwotCi0gIC8qIHNlYXJjaCBvcGNvZGVzICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICopIGhhc2hfZmluZCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG9wbmFtZSk7Ci0gIGlmIChvcGNvZGUpCi0gICAgewotICAgICAgaW50IGNwdW1hdGNoOwotICAgICAgb3Bjb2RlID0gZmluZF9vcGNvZGVfbWF0Y2ggKG9wY29kZSwgdG9rLCAmbnRvaywgJmNwdW1hdGNoKTsKLSAgICAgIGlmIChvcGNvZGUpCi0JewotCSAgYXNzZW1ibGVfaW5zbiAob3Bjb2RlLCB0b2ssIG50b2ssIGluc24pOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGNwdW1hdGNoKQotCWFzX2JhZCAoXygiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiKSwgb3BuYW1lLAotCSAgICAgICAgYWxwaGFfdGFyZ2V0X25hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotfQotCi0vKiBHaXZlbiBhbiBvcGNvZGUgbmFtZSBhbmQgYSBwcmUtdG9rZW5pemVkIHNldCBvZiBhcmd1bWVudHMsIHRha2UgdGhlCi0gICBvcGNvZGUgYWxsIHRoZSB3YXkgdGhyb3VnaCBlbWlzc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgdG9rLCBudG9rLCBsb2NhbF9tYWNyb3Nfb24pCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGludCBsb2NhbF9tYWNyb3Nfb247Ci17Ci0gIGludCBmb3VuZF9zb21ldGhpbmcgPSAwOwotICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqbWFjcm87Ci0gIGludCBjcHVtYXRjaCA9IDE7Ci0KLSAgLyogc2VhcmNoIG1hY3JvcyAqLwotICBpZiAobG9jYWxfbWFjcm9zX29uKQotICAgIHsKLSAgICAgIG1hY3JvID0gKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKikKLQkgICAgICAgaGFzaF9maW5kIChhbHBoYV9tYWNyb19oYXNoLCBvcG5hbWUpKTsKLSAgICAgIGlmIChtYWNybykKLQl7Ci0JICBmb3VuZF9zb21ldGhpbmcgPSAxOwotCSAgbWFjcm8gPSBmaW5kX21hY3JvX21hdGNoIChtYWNybywgdG9rLCAmbnRvayk7Ci0JICBpZiAobWFjcm8pCi0JICAgIHsKLQkgICAgICAoKm1hY3JvLT5lbWl0KSAodG9rLCBudG9rLCBtYWNyby0+YXJnKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkgICAgICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCBvcG5hbWUpOwotICAgICAgbnRvay0tOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIHNlYXJjaCBvcGNvZGVzICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICopIGhhc2hfZmluZCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG9wbmFtZSk7Ci0gIGlmIChvcGNvZGUpCi0gICAgewotICAgICAgZm91bmRfc29tZXRoaW5nID0gMTsKLSAgICAgIG9wY29kZSA9IGZpbmRfb3Bjb2RlX21hdGNoIChvcGNvZGUsIHRvaywgJm50b2ssICZjcHVtYXRjaCk7Ci0gICAgICBpZiAob3Bjb2RlKQotCXsKLQkgIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0JICBhc3NlbWJsZV9pbnNuIChvcGNvZGUsIHRvaywgbnRvaywgJmluc24pOwotCSAgZW1pdF9pbnNuICgmaW5zbik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZm91bmRfc29tZXRoaW5nKQotICAgIGlmIChjcHVtYXRjaCkKLSAgICAgIGFzX2JhZCAoXygiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci0gICAgZWxzZQotICAgICAgYXNfYmFkIChfKCJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiKSwgb3BuYW1lLAotCSAgICAgIGFscGhhX3RhcmdldF9uYW1lKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotfQotCi0MCi0vKiBTb21lIGluc3RydWN0aW9uIHNldHMgaW5kZXhlZCBieSBsZyhzaXplKSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZXh0WF9vcFtdID0geyAic2V4dGIiLCAic2V4dHciLCAic2V4dGwiLCBOVUxMIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluc1hsX29wW10gPSB7ICJpbnNibCIsICJpbnN3bCIsICJpbnNsbCIsICJpbnNxbCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5zWGhfb3BbXSA9IHsgTlVMTCwgICAgImluc3doIiwgImluc2xoIiwgImluc3FoIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRYbF9vcFtdID0geyAiZXh0YmwiLCAiZXh0d2wiLCAiZXh0bGwiLCAiZXh0cWwiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dFhoX29wW10gPSB7IE5VTEwsICAgICJleHR3aCIsICJleHRsaCIsICJleHRxaCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNrWGxfb3BbXSA9IHsgIm1za2JsIiwgIm1za3dsIiwgIm1za2xsIiwgIm1za3FsIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2tYaF9vcFtdID0geyBOVUxMLCAgICAibXNrd2giLCAibXNrbGgiLCAibXNrcWgiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0WF9vcFtdID0geyAic3RiIiwgInN0dyIsICJzdGwiLCAic3RxIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZFhfb3BbXSA9IHsgImxkYiIsICJsZHciLCAibGRsbCIsICJsZHEiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxkWHVfb3BbXSA9IHsgImxkYnUiLCAibGR3dSIsIE5VTEwsIE5VTEwgfTsKLQotLyogSW1wbGVtZW50IHRoZSBsZGdwIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRncCAodG9rLCBudG9rLCB1bnVzZWQpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IFBUUiB1bnVzZWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBPQkpfQU9VVAotRklYTUUKLSNlbmRpZgotI2lmIGRlZmluZWQoT0JKX0VDT0ZGKSB8fCBkZWZpbmVkKE9CSl9FTEYpCi0gIC8qIGZyb20gImxkZ3AgcjEsbihyMikiLCBnZW5lcmF0ZSAibGRhaCByMSxYKFIyKTsgbGRhIHIxLFkocjEpIgotICAgICB3aXRoIGFwcHJvcHJpYXRlIGNvbnN0YW50cyBhbmQgcmVsb2NhdGlvbnMuICAqLwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIGV4cHJlc3Npb25TIGFkZGVuZDsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLSAgICB7Ci0gICAgICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2NfZXhwID0gJnRva1tudG9rLTFdOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvY19leHAtPlhfb3ApOwotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JICAgICAgKGludClyZWxvY19leHAtPlhfYWRkX251bWJlciwgImxkZ3AiKTsKLSAgICAgIG50b2stLTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FQ09GRgotICBpZiAocmVnbm8gKHRva1syXS5YX2FkZF9udW1iZXIpID09IEFYUF9SRUdfUFYpCi0gICAgZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplICgwKTsKLSNlbmRpZgotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgbmV3dG9rWzJdID0gdG9rWzJdOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRhaCIsIG5ld3RvaywgMywgJmluc24pOwotCi0gIGFkZGVuZCA9IHRva1sxXTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICBpZiAoYWRkZW5kLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICBhc19iYWQgKF8oImNhbiBub3QgcmVzb2x2ZSBleHByZXNzaW9uIikpOwotICBhZGRlbmQuWF9vcCA9IE9fc3ltYm9sOwotICBhZGRlbmQuWF9hZGRfc3ltYm9sID0gYWxwaGFfZ3Bfc3ltYm9sOwotI2VuZGlmCi0KLSAgaW5zbi5uZml4dXBzID0gMTsKLSAgaW5zbi5maXh1cHNbMF0uZXhwID0gYWRkZW5kOwotICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjsKLQotICBlbWl0X2luc24gKCZpbnNuKTsKLQotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgdG9rWzBdLlhfYWRkX251bWJlcik7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICBhZGRlbmQuWF9hZGRfbnVtYmVyICs9IDQ7Ci0jZW5kaWYKLQotICBpbnNuLm5maXh1cHMgPSAxOwotICBpbnNuLmZpeHVwc1swXS5leHAgPSBhZGRlbmQ7Ci0gIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OwotCi0gIGVtaXRfaW5zbiAoJmluc24pOwotI2VuZGlmIC8qIE9CSl9FQ09GRiB8fCBPQkpfRUxGICovCi19Ci0KLSNpZmRlZiBPQkpfRVZBWAotCi0vKiBBZGQgc3ltYm9sK2FkZGVuZCB0byBsaW5rIHBvb2wuCi0gICBSZXR1cm4gb2Zmc2V0IGZyb20gYmFzZXN5bSB0byBlbnRyeSBpbiBsaW5rIHBvb2wuCi0KLSAgIEFkZCBuZXcgZml4dXAgb25seSBpZiBvZmZzZXQgaXNuJ3QgMTZiaXQuICAqLwotCi12YWx1ZVQKLWFkZF90b19saW5rX3Bvb2wgKGJhc2VzeW0sIHN5bSwgYWRkZW5kKQotICAgICBzeW1ib2xTICpiYXNlc3ltOwotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIG9mZnNldFQgYWRkZW5kOwotewotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY190eXBlOwotICBjaGFyICpwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChhbHBoYV9saW5rX3NlY3Rpb24pOwotICBmaXhTICpmaXhwOwotCi0gIG9mZnNldCA9IC0gKnN5bWJvbF9nZXRfb2JqIChiYXNlc3ltKTsKLQotICAvKiBAQCBUaGlzIGFzc3VtZXMgYWxsIGVudHJpZXMgaW4gYSBnaXZlbiBzZWN0aW9uIHdpbGwgYmUgb2YgdGhlIHNhbWUKLSAgICAgc2l6ZS4uLiAgUHJvYmFibHkgY29ycmVjdCwgYnV0IHVud2lzZSB0byByZWx5IG9uLiAgKi8KLSAgLyogVGhpcyBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBzdWJzZWdtZW50LiAgKi8KLQotICBpZiAoc2VnaW5mby0+ZnJjaGFpblApCi0gICAgZm9yIChmaXhwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZpeF9yb290OwotCSBmaXhwICE9IChmaXhTICopIE5VTEw7Ci0JIGZpeHAgPSBmaXhwLT5meF9uZXh0LCBvZmZzZXQgKz0gOCkKLSAgICAgIHsKLQlpZiAoZml4cC0+ZnhfYWRkc3kgPT0gc3ltICYmIGZpeHAtPmZ4X29mZnNldCA9PSBhZGRlbmQpCi0JICB7Ci0JICAgIGlmIChyYW5nZV9zaWduZWRfMTYgKG9mZnNldCkpCi0JICAgICAgewotCSAgICAgICAgcmV0dXJuIG9mZnNldDsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogTm90IGZvdW5kIGluIDE2Yml0IHNpZ25lZCByYW5nZS4gICovCi0KLSAgc3Vic2VnX3NldCAoYWxwaGFfbGlua19zZWN0aW9uLCAwKTsKLSAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gIG1lbXNldCAocCwgMCwgOCk7Ci0KLSAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgc3ltLCBhZGRlbmQsIDAsCi0JICAgQkZEX1JFTE9DXzY0KTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gODsKLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotI2VuZGlmIC8qIE9CSl9FVkFYICovCi0KLS8qIExvYWQgYSAocGFydGlhbCkgZXhwcmVzc2lvbiBpbnRvIGEgdGFyZ2V0IHJlZ2lzdGVyLgotCi0gICBJZiBwb2Zmc2V0IGlzIG5vdCBudWxsLCBhZnRlciB0aGUgY2FsbCBpdCB3aWxsIGVpdGhlciBjb250YWluCi0gICBPX2NvbnN0YW50IDAsIG9yIGEgMTYtYml0IG9mZnNldCBhcHByb3ByaWF0ZSBmb3IgYW55IE1FTSBmb3JtYXQKLSAgIGluc3RydWN0aW9uLiAgSW4gYWRkaXRpb24sIHBiYXNlcmVnIHdpbGwgYmUgbW9kaWZpZWQgdG8gcG9pbnQgdG8KLSAgIHRoZSBiYXNlIHJlZ2lzdGVyIHRvIHVzZSBpbiB0aGF0IE1FTSBmb3JtYXQgaW5zdHJ1Y3Rpb24uCi0KLSAgIEluIGFueSBjYXNlLCAqcGJhc2VyZWcgc2hvdWxkIGNvbnRhaW4gYSBiYXNlIHJlZ2lzdGVyIHRvIGFkZCB0byB0aGUKLSAgIGV4cHJlc3Npb24uICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZWl0aGVyIEFYUF9SRUdfWkVSTyBvcgotICAgYWxwaGFfZ3BfcmVnaXN0ZXIuICBTeW1ib2wgYWRkcmVzc2VzIHdpbGwgYWx3YXlzIGJlIGxvYWRlZCB2aWEgJGdwLAotICAgc28gImZvbygkMCkiIGlzIGludGVycHJldGVkIGFzIGFkZGluZyB0aGUgYWRkcmVzcyBvZiBmb28gdG8gJDA7Ci0gICBpLmUuICJsZHEgJHRhcmcsIExJVCgkZ3ApOyBhZGRxICR0YXJnLCAkMCwgJHRhcmciLiAgT2RkLCBwZXJoYXBzLAotICAgYnV0IHRoaXMgaXMgd2hhdCBPU0YvMSBkb2VzLgotCi0gICBJZiBleHBsaWNpdCByZWxvY2F0aW9ucyBvZiB0aGUgZm9ybSAhbGl0ZXJhbCE8bnVtYmVyPiBhcmUgYWxsb3dlZCwKLSAgIGFuZCB1c2VkLCB0aGVuIGV4cGxpY3RfcmVsb2Mgd2l0aCBiZSBhbiBleHByZXNzaW9uIHBvaW50ZXIuCi0KLSAgIEZpbmFsbHksIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgY2FsbGluZyBtYWNybyBtYXkgZW1pdCBhCi0gICBMSVRVU0UgcmVsb2MgaWYgb3RoZXJ3aXNlIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGludAotbG9hZF9leHByZXNzaW9uICh0YXJncmVnLCBleHAsIHBiYXNlcmVnLCBwb2Zmc2V0LCBleHBsaWNpdF9yZWxvYykKLSAgICAgaW50IHRhcmdyZWc7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCAqcGJhc2VyZWc7Ci0gICAgIGV4cHJlc3Npb25TICpwb2Zmc2V0OwotICAgICBjb25zdCBleHByZXNzaW9uUyAqZXhwbGljaXRfcmVsb2M7Ci17Ci0gIGludCBlbWl0X2xpdHVzZSA9IDA7Ci0gIG9mZnNldFQgYWRkZW5kID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gIGludCBiYXNlcmVnID0gKnBiYXNlcmVnOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICB7Ci0jaWZkZWYgT0JKX0VDT0ZGCi0Jb2Zmc2V0VCBsaXQ7Ci0KLQkvKiBhdHRlbXB0IHRvIHJlZHVjZSAubGl0IGxvYWQgYnkgc3BsaXR0aW5nIHRoZSBvZmZzZXQgZnJvbQotCSAgIGl0cyBzeW1ib2wgd2hlbiBwb3NzaWJsZSwgYnV0IGRvbid0IGNyZWF0ZSBhIHNpdHVhdGlvbiBpbgotCSAgIHdoaWNoIHdlJ2QgZmFpbC4gICovCi0JaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkgJiYKLQkgICAgKGFscGhhX25vYXRfb24gfHwgdGFyZ3JlZyA9PSBBWFBfUkVHX0FUKSkKLQkgIHsKLQkgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCwKLQkJCQkgICAgICAgYWxwaGFfbGl0YV9zZWN0aW9uLCA4KTsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGxpdCA9IGFkZF90b19saXRlcmFsX3Bvb2wgKGV4cC0+WF9hZGRfc3ltYm9sLCAwLAotCQkJCSAgICAgICBhbHBoYV9saXRhX3NlY3Rpb24sIDgpOwotCSAgfQotCi0JaWYgKGxpdCA+PSAweDgwMDApCi0JICBhc19mYXRhbCAoXygib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdGEpIHRhYmxlIikpOwotCi0JLyogZW1pdCAibGRxIHIsIGxpdChncCkiICovCi0KLQlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiB0YXJncmVnID09IGJhc2VyZWcpCi0JICB7Ci0JICAgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCSAgICBpZiAodGFyZ3JlZyA9PSBBWFBfUkVHX0FUKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0JICB9Ci0JZWxzZQotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0Jc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0YV9zeW1ib2wsIGxpdCk7Ci0Jc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLQotCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLQlhc3NlcnQgKGV4cGxpY2l0X3JlbG9jID09IChjb25zdCBleHByZXNzaW9uUyAqKTApOwotCWFzc2VydCAoaW5zbi5uZml4dXBzID09IDEpOwotCWluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw7Ci0jZW5kaWYgLyogT0JKX0VDT0ZGICovCi0jaWZkZWYgT0JKX0VMRgotCS8qIGVtaXQgImxkcSByLCBnb3RvZmYoZ3ApIiAqLwotCi0JaWYgKGJhc2VyZWcgIT0gYWxwaGFfZ3BfcmVnaXN0ZXIgJiYgdGFyZ3JlZyA9PSBiYXNlcmVnKQotCSAgewotCSAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQkgICAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQkgICAgaWYgKHRhcmdyZWcgPT0gQVhQX1JFR19BVCkKLQkgICAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCB3aGlsZSAkYXQgaW4gdXNlIikpOwotCi0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotCSAgfQotCWVsc2UKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCi0JLyogWFhYOiBEaXNhYmxlIHRoaXMgLmdvdCBtaW5pbWl6aW5nIG9wdGltaXphdGlvbiBzbyB0aGF0IHdlIGNhbiBnZXQKLQkgICBiZXR0ZXIgaW5zdHJ1Y3Rpb24gb2Zmc2V0IGtub3dsZWRnZSBpbiB0aGUgY29tcGlsZXIuICBUaGlzIGhhcHBlbnMKLQkgICB2ZXJ5IGluZnJlcXVlbnRseSBhbnl3YXkuICAqLwotCWlmICgxIHx8ICghcmFuZ2Vfc2lnbmVkXzMyIChhZGRlbmQpCi0JICAgICYmIChhbHBoYV9ub2F0X29uIHx8IHRhcmdyZWcgPT0gQVhQX1JFR19BVCkpKQotCSAgewotCSAgICBuZXd0b2tbMV0gPSAqZXhwOwotCSAgICBhZGRlbmQgPSAwOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgZXhwLT5YX2FkZF9zeW1ib2wsIDApOwotCSAgfQotCi0Jc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLQotCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLQlhc3NlcnQgKGluc24ubmZpeHVwcyA9PSAxKTsKLQlpZiAoIWV4cGxpY2l0X3JlbG9jKQotCSAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw7Ci0JZWxzZQotCSAgewotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MKLQkgICAgICA9IChBTFBIQV9SRUxPQ19UQUJMRSAoZXhwbGljaXRfcmVsb2MtPlhfb3ApKS0+cmVsb2M7Ci0JICAgIGluc24uc2VxdWVuY2VbMF0gPSBleHBsaWNpdF9yZWxvYy0+WF9hZGRfbnVtYmVyOwotI2Vsc2UKLQkgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQkgIH0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0jaWZkZWYgT0JKX0VWQVgKLQlvZmZzZXRUIGxpbms7Ci0KLQkvKiBGaW5kIHN5bWJvbCBvciBzeW1ib2wgcG9pbnRlciBpbiBsaW5rIHNlY3Rpb24uICAqLwotCi0JYXNzZXJ0IChleHBsaWNpdF9yZWxvYyA9PSAoY29uc3QgZXhwcmVzc2lvblMgKikwKTsKLQlpZiAoZXhwLT5YX2FkZF9zeW1ib2wgPT0gYWxwaGFfZXZheF9wcm9jLnN5bWJvbCkKLQkgIHsKLQkgICAgaWYgKHJhbmdlX3NpZ25lZF8xNiAoYWRkZW5kKSkKLQkgICAgICB7Ci0JCXNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCQlzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGFkZGVuZCk7Ci0JCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQkJYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQkJYWRkZW5kID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCQlzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotCQlzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0JCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRhIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkpCi0JICAgICAgewotCQlsaW5rID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCQkJIGV4cC0+WF9hZGRfc3ltYm9sLCBhZGRlbmQpOwotCQlhZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbGluayA9IGFkZF90b19saW5rX3Bvb2wgKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wsCi0JCQkJCSBleHAtPlhfYWRkX3N5bWJvbCwgMCk7Ci0JICAgICAgfQotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLQkgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaW5rKTsKLQkgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCSAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCSAgfQotI2VuZGlmIC8qIE9CSl9FVkFYICovCi0KLQllbWl0X2luc24oJmluc24pOwotCi0jaWZuZGVmIE9CSl9FVkFYCi0JZW1pdF9saXR1c2UgPSAxOwotCi0JaWYgKGJhc2VyZWcgIT0gYWxwaGFfZ3BfcmVnaXN0ZXIgJiYgYmFzZXJlZyAhPSBBWFBfUkVHX1pFUk8pCi0JICB7Ci0JICAgIC8qIGVtaXQgImFkZHEgciwgYmFzZSwgciIgKi8KLQotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBiYXNlcmVnKTsKLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgdGFyZ3JlZyk7Ci0JICAgIGFzc2VtYmxlX3Rva2VucyAoImFkZHEiLCBuZXd0b2ssIDMsIDApOwotCSAgfQotI2VuZGlmCi0KLQliYXNlcmVnID0gdGFyZ3JlZzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgYXNzZXJ0IChleHBsaWNpdF9yZWxvYyA9PSAoY29uc3QgZXhwcmVzc2lvblMgKikwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgLyogQXNzdW1lIHRoYXQgdGhpcyBkaWZmZXJlbmNlIGV4cHJlc3Npb24gd2lsbCBiZSByZXNvbHZlZCB0byBhbgotCSBhYnNvbHV0ZSB2YWx1ZSBhbmQgdGhhdCB0aGF0IHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMuICovCi0KLSAgICAgIGFzc2VydCAoZXhwbGljaXRfcmVsb2MgPT0gKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSAgICAgIG5ld3Rva1sxXSA9ICpleHA7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOwotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgMCk7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT19iaWc6Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBhZGRlbmQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJjYW4ndCBoYW5kbGUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkpCi0gICAgewotICAgICAgb2Zmc2V0VCBsaXQ7Ci0KLSAgICAgIC8qIGZvciA2NC1iaXQgYWRkZW5kcywganVzdCBwdXQgaXQgaW4gdGhlIGxpdGVyYWwgcG9vbCAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICAgIC8qIGVtaXQgImxkcSB0YXJncmVnLCBsaXQoYmFzZXJlZykiICAqLwotICAgICAgbGl0ID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCSAgICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKSwgYWRkZW5kKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcSIsIG5ld3RvaywgMywgMCk7Ci0jZWxzZQotCi0gICAgICBpZiAoYWxwaGFfbGl0OF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXQ4IiwKLQkJCQkgICZhbHBoYV9saXQ4X3NlY3Rpb24sCi0JCQkJICAmYWxwaGFfbGl0OF9zeW1ib2wpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0JICBhbHBoYV9saXQ4X2xpdGVyYWwgPSBhZGRfdG9fbGl0ZXJhbF9wb29sIChhbHBoYV9saXQ4X3N5bWJvbCwgMHg4MDAwLAotCQkJCQkJICAgIGFscGhhX2xpdGFfc2VjdGlvbiwgOCk7Ci0JICBpZiAoYWxwaGFfbGl0OF9saXRlcmFsID49IDB4ODAwMCkKLQkgICAgYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIpKTsKLSNlbmRpZgotCX0KLQotICAgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoTlVMTCwgYWRkZW5kLCBhbHBoYV9saXQ4X3NlY3Rpb24sIDgpIC0gMHg4MDAwOwotICAgICAgaWYgKGxpdCA+PSAweDgwMDApCi0JYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIpKTsKLQotICAgICAgLyogZW1pdCAibGRhIGxpdHJlZywgLmxpdDgrMHg4MDAwIiAqLwotCi0gICAgICBpZiAodGFyZ3JlZyA9PSBiYXNlcmVnKQotCXsKLQkgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQkgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotCX0KLSAgICAgIGVsc2UKLQlzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGFscGhhX2xpdGFfc3ltYm9sLCBhbHBoYV9saXQ4X2xpdGVyYWwpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgICAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0OF9zeW1ib2wsIDB4ODAwMCk7Ci0jZW5kaWYKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLSAgICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzID09IDEpOwotI2lmZGVmIE9CSl9FQ09GRgotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOwotI2VuZGlmCi0KLSAgICAgIGVtaXRfaW5zbiAoJmluc24pOwotCi0gICAgICAvKiBlbWl0ICJsZHEgbGl0cmVnLCBsaXQobGl0cmVnKSIgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIG5ld3Rva1swXS5YX2FkZF9udW1iZXIpOwotCi0gICAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gTElUVVNFX0JBU0U7Ci0gICAgICBlbWl0X2xpdHVzZSA9IDA7Ci0KLSAgICAgIGVtaXRfaW5zbiAoJmluc24pOwotCi0gICAgICAvKiBlbWl0ICJhZGRxIGxpdHJlZywgYmFzZSwgdGFyZ2V0IiAqLwotCi0gICAgICBpZiAoYmFzZXJlZyAhPSBBWFBfUkVHX1pFUk8pCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgYmFzZXJlZyk7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCB0YXJncmVnKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImFkZHEiLCBuZXd0b2ssIDMsIDApOwotCX0KLSNlbmRpZiAvKiAhT0JKX0VWQVggKi8KLQotICAgICAgaWYgKHBvZmZzZXQpCi0Jc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIDApOwotICAgICAgKnBiYXNlcmVnID0gdGFyZ3JlZzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXRUIGxvdywgaGlnaCwgZXh0cmEsIHRtcDsKLQotICAgICAgLyogZm9yIDMyLWJpdCBvcGVyYW5kcywgYnJlYWsgdXAgdGhlIGFkZGVuZCAqLwotCi0gICAgICBsb3cgPSBzaWduX2V4dGVuZF8xNiAoYWRkZW5kKTsKLSAgICAgIHRtcCA9IGFkZGVuZCAtIGxvdzsKLSAgICAgIGhpZ2ggPSBzaWduX2V4dGVuZF8xNiAodG1wID4+IDE2KTsKLQotICAgICAgaWYgKHRtcCAtIChoaWdoIDw8IDE2KSkKLQl7Ci0JICBleHRyYSA9IDB4NDAwMDsKLQkgIHRtcCAtPSAweDQwMDAwMDAwOwotCSAgaGlnaCA9IHNpZ25fZXh0ZW5kXzE2ICh0bXAgPj4gMTYpOwotCX0KLSAgICAgIGVsc2UKLQlleHRyYSA9IDA7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCi0gICAgICBpZiAoZXh0cmEpCi0JewotCSAgLyogZW1pdCAibGRhaCByLCBleHRyYShyKSAqLwotCSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBleHRyYSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLQkgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnID0gdGFyZ3JlZyk7Ci0JfQotCi0gICAgICBpZiAoaGlnaCkKLQl7Ci0JICAvKiBlbWl0ICJsZGFoIHIsIGhpZ2gocikgKi8KLQkgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgaGlnaCk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLQkgIGJhc2VyZWcgPSB0YXJncmVnOwotCSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCX0KLQotICAgICAgaWYgKChsb3cgJiYgIXBvZmZzZXQpIHx8ICghcG9mZnNldCAmJiBiYXNlcmVnICE9IHRhcmdyZWcpKQotCXsKLQkgIC8qIGVtaXQgImxkYSByLCBsb3coYmFzZSkiICovCi0JICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGxvdyk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOwotCSAgYmFzZXJlZyA9IHRhcmdyZWc7Ci0JICBsb3cgPSAwOwotCX0KLQotICAgICAgaWYgKHBvZmZzZXQpCi0Jc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIGxvdyk7Ci0gICAgICAqcGJhc2VyZWcgPSBiYXNlcmVnOwotICAgIH0KLQotICByZXR1cm4gZW1pdF9saXR1c2U7Ci19Ci0KLS8qIFRoZSBsZGEgbWFjcm8gZGlmZmVycyBmcm9tIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaW4gdGhhdCBpdCBoYW5kbGVzCi0gICBtb3N0IHNpbXBsZSBleHByZXNzaW9ucywgcGFydGljdWFscmx5IHN5bWJvbCBhZGRyZXNzIGxvYWRzIGFuZAotICAgbGFyZ2UgY29uc3RhbnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRhICh0b2ssIG50b2ssIG9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBvcG5hbWU7Ci17Ci0gIGludCBiYXNlcmVnOwotICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2MgPSAoY29uc3QgZXhwcmVzc2lvblMgKikwOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnI7Ci0KLSAgICAgIHJlbG9jID0gJnRva1tudG9rLTFdOwotICAgICAgciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvYy0+WF9vcCk7Ci0gICAgICBzd2l0Y2ggKHJlbG9jLT5YX29wKQotCXsKLQlkZWZhdWx0OgotCSAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JCSAgKGludClyZWxvYy0+WF9hZGRfbnVtYmVyLCAoY29uc3QgY2hhciAqKW9wbmFtZSk7Ci0KLQkgIHJlbG9jID0gKGNvbnN0IGV4cHJlc3Npb25TICopMDsKLQkgIG50b2stLTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2xpdGVyYWw6Ci0JICBudG9rLS07Ci0JICBicmVhazsKLQotCSAgLyogRm9yIGxkYSAkeCwwKCR4KSFsaXR1c2VfYmFzZSF5LCBkb24ndCB1c2UgbG9hZF9leHByZXNzaW9uLCBzaW5jZQotCSAgICAgaXQgaXMgcmVhbGx5IHRvbyBnZW5lcmFsIGZvciBvdXIgbmVlZHMuICBJbnN0ZWFkIGp1c3QgZ2VuZXJhdGUgdGhlCi0JICAgICBsZGEgZGlyZWN0bHkuICAqLwotCWNhc2UgT19saXR1c2VfYmFzZToKLQkgIGlmIChudG9rICE9IDQKLQkgICAgICB8fCB0b2tbMF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JICAgICAgfHwgIWlzX2lyX251bSh0b2tbMF0uWF9hZGRfbnVtYmVyKQotCSAgICAgIHx8IHRva1sxXS5YX29wICE9IE9fY29uc3RhbnQKLQkgICAgICB8fCB0b2tbMl0uWF9vcCAhPSBPX3ByZWdpc3RlcgotCSAgICAgIHx8ICFpc19pcl9udW0odG9rWzJdLlhfYWRkX251bWJlcikpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCBpbnN0cnVjdGlvbiBmb3JtYXQgZm9yIGxkYSAhJXMhJWQiKSwgci0+bmFtZSwKLQkJICAgICAgcmVsb2MtPlhfYWRkX251bWJlcik7Ci0KLQkgICAgICByZWxvYyA9IChjb25zdCBleHByZXNzaW9uUyAqKTA7Ci0JICAgICAgbnRvay0tOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGVtaXRfbG9hZHN0b3JlICh0b2ssIG50b2ssICJsZGEiKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKG50b2sgPT0gMikKLSAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIGVsc2UKLSAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKLQotICAodm9pZCkgbG9hZF9leHByZXNzaW9uICh0b2tbMF0uWF9hZGRfbnVtYmVyLCAmdG9rWzFdLCAmYmFzZXJlZywgTlVMTCwgcmVsb2MpOwotfQotCi0vKiBUaGUgbGRhaCBtYWNybyBkaWZmZXJzIGZyb20gdGhlIGxkYWggaW5zdHJ1Y3Rpb24gaW4gdGhhdCBpdCBoYXMgJDMxCi0gICBhcyBhbiBpbXBsaWVkIGJhc2UgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZGFoICh0b2ssIG50b2ssIHVudXNlZCkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2sgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgUFRSIHVudXNlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsICJsZGFoIik7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBuZXd0b2tbMV0gPSB0b2tbMV07Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1pFUk8pOwotCi0gIGFzc2VtYmxlX3Rva2VucyAoImxkYWgiLCBuZXd0b2ssIDMsIDApOwotfQotCi0vKiBIYW5kbGUgYWxsICJzaW1wbGUiIGludGVnZXIgcmVnaXN0ZXIgbG9hZHMgLS0gbGRxLCBsZHFfbCwgbGRxX3UsCi0gICBldGMuICBUaGV5IGRpZmZlciBmcm9tIHRoZSByZWFsIGluc3RydWN0aW9ucyBpbiB0aGF0IHRoZXkgZG8gc2ltcGxlCi0gICBleHByZXNzaW9ucyBsaWtlIHRoZSBsZGEgbWFjcm8uICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9pcl9sb2FkICh0b2ssIG50b2ssIG9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBvcG5hbWU7Ci17Ci0gIGludCBiYXNlcmVnLCBsaXR1c2U7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jID0gKGNvbnN0IGV4cHJlc3Npb25TICopMDsKLQotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnI7Ci0KLSAgICAgIHJlbG9jID0gJnRva1tudG9rLTFdOwotICAgICAgc3dpdGNoIChyZWxvYy0+WF9vcCkKLQl7Ci0JY2FzZSBPX2xpdHVzZV9iYXNlOgotCSAgbnRvay0tOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fbGl0ZXJhbDoKLQkgIGlmIChzdHJjbXAgKChjb25zdCBjaGFyICopb3BuYW1lLCAibGRxIikgPT0gMCkKLQkgICAgewotCSAgICAgIGVtaXRfbGRhICh0b2ssIG50b2ssIG9wbmFtZSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JICBudG9rLS07Ci0JICByID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jLT5YX29wKTsKLQkgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCQkgIChpbnQpcmVsb2MtPlhfYWRkX251bWJlciwgKGNvbnN0IGNoYXIgKilvcG5hbWUpOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobnRvayA9PSAyKQotICAgIGJhc2VyZWcgPSAodG9rWzFdLlhfb3AgPT0gT19jb25zdGFudCA/IEFYUF9SRUdfWkVSTyA6IGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgZWxzZQotICAgIGJhc2VyZWcgPSB0b2tbMl0uWF9hZGRfbnVtYmVyOwotCi0gIGxpdHVzZSA9IGxvYWRfZXhwcmVzc2lvbiAodG9rWzBdLlhfYWRkX251bWJlciwgJnRva1sxXSwgJmJhc2VyZWcsCi0JCQkgICAgJm5ld3Rva1sxXSwgKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKChjb25zdCBjaGFyICopb3BuYW1lLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKHJlbG9jKQotICAgIHsKLSAgICAgIGludCBuZml4dXBzID0gaW5zbi5uZml4dXBzOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvYy0+WF9vcCk7Ci0KLSAgICAgIGFzc2VydCAobmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5yZWxvYyA9IHItPnJlbG9jOwotICAgICAgaW5zbi5maXh1cHNbbmZpeHVwc10uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzW25maXh1cHNdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5leHAuWF9hZGRfbnVtYmVyID0gci0+bGl0dXNlOwotICAgICAgaW5zbi5zZXF1ZW5jZVtuZml4dXBzXSA9IHJlbG9jLT5YX2FkZF9udW1iZXI7Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobGl0dXNlKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzIDwgTUFYX0lOU05fRklYVVBTKTsKLSAgICAgIGlmIChpbnNuLm5maXh1cHMgPiAwKQotCXsKLQkgIG1lbW1vdmUgKCZpbnNuLmZpeHVwc1sxXSwgJmluc24uZml4dXBzWzBdLAotCQkgICBzaXplb2Yoc3RydWN0IGFscGhhX2ZpeHVwKSAqIGluc24ubmZpeHVwcyk7Ci0JfQotICAgICAgaW5zbi5uZml4dXBzKys7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSBMSVRVU0VfQkFTRTsKLSAgICB9Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci19Ci0KLS8qIEhhbmRsZSBmcCByZWdpc3RlciBsb2FkcywgYW5kIGJvdGggaW50ZWdlciBhbmQgZnAgcmVnaXN0ZXIgc3RvcmVzLgotICAgQWdhaW4sIHdlIGhhbmRsZSBzaW1wbGUgZXhwcmVzc2lvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sb2Fkc3RvcmUgKHRvaywgbnRvaywgb3BuYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIG9wbmFtZTsKLXsKLSAgaW50IGJhc2VyZWcsIGxpdHVzZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2MgPSAoY29uc3QgZXhwcmVzc2lvblMgKikwOwotCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgcmVsb2MgPSAmdG9rWy0tbnRva107Ci0gICAgICBpZiAocmVsb2MtPlhfb3AgIT0gT19saXR1c2VfYmFzZSkKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gJmFscGhhX3JlbG9jX29wWyByZWxvYy0+WF9tZCBdOwotCSAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JCSAgKGludClyZWxvYy0+WF9hZGRfbnVtYmVyLCAoY29uc3QgY2hhciAqKW9wbmFtZSk7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIGlmIChudG9rID09IDIpCi0gICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICBlbHNlCi0gICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKHRva1sxXS5YX29wICE9IE9fY29uc3RhbnQgfHwgIXJhbmdlX3NpZ25lZF8xNih0b2tbMV0uWF9hZGRfbnVtYmVyKSkKLSAgICB7Ci0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgbGl0dXNlID0gbG9hZF9leHByZXNzaW9uIChBWFBfUkVHX0FULCAmdG9rWzFdLCAmYmFzZXJlZywgJm5ld3Rva1sxXSwKLQkJCQkoY29uc3QgZXhwcmVzc2lvblMgKikwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXd0b2tbMV0gPSB0b2tbMV07Ci0gICAgICBsaXR1c2UgPSAwOwotICAgIH0KLQotICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoKGNvbnN0IGNoYXIgKilvcG5hbWUsIG5ld3RvaywgMywgJmluc24pOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAocmVsb2MpCi0gICAgewotICAgICAgaW50IG5maXh1cHMgPSBpbnNuLm5maXh1cHM7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jLT5YX29wKTsKLQotICAgICAgYXNzZXJ0IChuZml4dXBzIDwgTUFYX0lOU05fRklYVVBTKTsKLSAgICAgIGluc24uZml4dXBzW25maXh1cHNdLnJlbG9jID0gci0+cmVsb2M7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5leHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgaW5zbi5maXh1cHNbbmZpeHVwc10uZXhwLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIGluc24uZml4dXBzW25maXh1cHNdLmV4cC5YX2FkZF9udW1iZXIgPSByLT5saXR1c2U7Ci0gICAgICBpbnNuLnNlcXVlbmNlW25maXh1cHNdID0gcmVsb2MtPlhfYWRkX251bWJlcjsKLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChsaXR1c2UpCi0gICAgewotICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOwotICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCi0JewotCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCi0JCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKLQl9Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2wgKG5vd19zZWcpOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IExJVFVTRV9CQVNFOwotICAgIH0KLQotICBlbWl0X2luc24gKCZpbnNuKTsKLX0KLQotLyogTG9hZCBhIGhhbGYtd29yZCBvciBieXRlIGFzIGFuIHVuc2lnbmVkIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2lyX2xvYWQgKHRvaywgbnRvaywgbGRYdV9vcFsobG9uZyl2bGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0JewotCSAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLQkgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIKLQkgICAgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLQotCSAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JCSAgKGludClyZWxvY19leHAtPlhfYWRkX251bWJlciwgImxkYnUvbGR3dSIpOwotCSAgbnRvay0tOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgLyogZW1pdCAibGRhICRhdCwgZXhwIiAqLwotCi0gICAgICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICAgICAgbmV3dG9rWzBdLlhfYWRkX251bWJlciA9IEFYUF9SRUdfQVQ7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIG50b2ssIDEpOwotCi0gICAgICAvKiBlbWl0ICJsZHFfdSB0YXJnLCAwKCRhdCkiICovCi0KLSAgICAgIG5ld3Rva1swXSA9IHRva1swXTsKLSAgICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgImV4dFhsIHRhcmcsICRhdCwgdGFyZyIgKi8KLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gICAgICBuZXd0b2tbMl0gPSBuZXd0b2tbMF07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKGV4dFhsX29wWyhsb25nKXZsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotICAgIH0KLX0KLQotLyogTG9hZCBhIGhhbGYtd29yZCBvciBieXRlIGFzIGEgc2lnbmVkIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgZW1pdF9sZFh1ICh0b2ssIG50b2ssIHZsZ3NpemUpOwotICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wWyhsb25nKXZsZ3NpemVdLCB0b2ssIDEsIDEpOwotfQotCi0vKiBMb2FkIGFuIGludGVncmFsIHZhbHVlIGZyb20gYW4gdW5hbGlnbmVkIGFkZHJlc3MgYXMgYW4gdW5zaWduZWQKLSAgIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfdWxkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBsb25nIGxnc2l6ZSA9IChsb25nKXZsZ3NpemU7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLQotICBpZiAoYWxwaGFfbm9hdF9vbikKLSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAvKiBlbWl0ICJsZGEgJGF0LCBleHAiICovCi0KLSAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgbmV3dG9rWzBdLlhfYWRkX251bWJlciA9IEFYUF9SRUdfQVQ7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci0KLSAgLyogZW1pdCAibGRxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgImxkcV91ICR0MTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMTw8bGdzaXplKS0xKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgImV4dFhsICR0OSwgJGF0LCAkdDkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1Q5KTsKLSAgYXNzZW1ibGVfdG9rZW5zIChleHRYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgImV4dFhoICR0MTAsICRhdCwgJHQxMCIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDEwKTsKLSAgYXNzZW1ibGVfdG9rZW5zIChleHRYaF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgIm9yICR0OSwgJHQxMCwgdGFyZyIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTApOwotICBuZXd0b2tbMl0gPSB0b2tbMF07Ci0gIGFzc2VtYmxlX3Rva2VucyAoIm9yIiwgbmV3dG9rLCAzLCAxKTsKLX0KLQotLyogTG9hZCBhbiBpbnRlZ3JhbCB2YWx1ZSBmcm9tIGFuIHVuYWxpZ25lZCBhZGRyZXNzIGFzIGEgc2lnbmVkIHZhbHVlLgotICAgTm90ZSB0aGF0IHF1YWRzIHNob3VsZCBnZXQgZnVubmVsZWQgdG8gdGhlIHVuc2lnbmVkIGxvYWQgc2luY2Ugd2UKLSAgIGRvbid0IGhhdmUgdG8gZG8gdGhlIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfdWxkWCAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGVtaXRfdWxkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoc2V4dFhfb3BbKGxvbmcpdmxnc2l6ZV0sIHRvaywgMSwgMSk7Ci19Ci0KLS8qIEltcGxlbWVudCB0aGUgbGRpbCBtYWNyby4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xkaWwgKHRvaywgbnRvaywgdW51c2VkKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHVudXNlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBleHByZXNzaW9uUyBuZXd0b2tbMl07Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsICJsZGlsIik7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mKG5ld3RvaykpOwotICBuZXd0b2tbMV0uWF9hZGRfbnVtYmVyID0gc2lnbl9leHRlbmRfMzIgKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci19Ci0KLS8qIFN0b3JlIGEgaGFsZi13b3JkIG9yIGJ5dGUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9zdFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBpbnQgbGdzaXplID0gKGludCkobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCBzdFhfb3BbbGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICAgICAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgICAgIG5ld3Rva1swXS5YX2FkZF9udW1iZXIgPSBBWFBfUkVHX0FUOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAgICAgLyogZW1pdCAibGRxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTAiICovCi0KLSAgICAgIG5ld3Rva1swXSA9IHRva1swXTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOwotICAgICAgYXNzZW1ibGVfdG9rZW5zIChpbnNYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJtc2tYbCAkdDksICRhdCwgJHQ5IiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAobXNrWGxfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCAkdDkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm9yIiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoInN0cV91IiwgbmV3dG9rLCAzLCAxKTsKLSAgICB9Ci19Ci0KLS8qIFN0b3JlIGFuIGludGVnZXIgdG8gYW4gdW5hbGlnbmVkIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91c3RYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgaW50IGxnc2l6ZSA9IChpbnQpKGxvbmcpdmxnc2l6ZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkOSwgMCgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkMTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTEiICovCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTEpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGggc3JjLCAkYXQsICR0MTIiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTIpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGggJHQxMCwgJGF0LCAkdDEwIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQ5LCAkdDExLCAkdDkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDExKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQxMCwgJHQxMiwgJHQxMCIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEyKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgic3RxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgInN0cV91ICR0MTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJzdHFfdSIsIG5ld3RvaywgMywgMSk7Ci19Ci0KLS8qIFNpZ24gZXh0ZW5kIGEgaGFsZi13b3JkIG9yIGJ5dGUuICBUaGUgMzItYml0IHNpZ24gZXh0ZW5kIGlzCi0gICBpbXBsZW1lbnRlZCBhcyAiYWRkbCAkMzEsICRyLCAkdCIgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3NleHRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgbG9uZyBsZ3NpemUgPSAobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wW2xnc2l6ZV0sIHRvaywgbnRvaywgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgYml0c2hpZnQgPSA2NCAtIDggKiAoMSA8PCBsZ3NpemUpOwotICAgICAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotCXsKLQkgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0JICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyCi0JICAgID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0KLQkgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCQkgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsICJzZXR4dCIpOwotCSAgbnRvay0tOwotCX0KLSNlbmRpZgotCi0gICAgICAvKiBlbWl0ICJzbGwgc3JjLGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gICAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGJpdHNoaWZ0KTsKLSAgICAgIG5ld3Rva1syXSA9IHRva1tudG9rIC0gMV07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzbGwiLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJzcmEgZHN0LGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSBuZXd0b2tbMl07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzcmEiLCBuZXd0b2ssIDMsIDEpOwotICAgIH0KLX0KLQotLyogSW1wbGVtZW50IHRoZSBkaXZpc2lvbiBhbmQgbW9kdWx1cyBtYWNyb3MuICAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogTWFrZSByZWdpc3RlciB1c2FnZSBsaWtlIGluIG5vcm1hbCBwcm9jZWR1cmUgY2FsbC4KLSAgIERvbid0IGNsb2JiZXIgUFYgYW5kIFJBLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfZGl2aXNpb24gKHRvaywgbnRvaywgc3ltbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBzeW1uYW1lOwotewotICAvKiBESVZJU0lPTiBhbmQgTU9EVUxVUy4gWWVjaC4KLSAgICoKLSAgICogQ29udmVydAotICAgKiAgICBPUCB4LHkscmVzdWx0Ci0gICAqIHRvCi0gICAqICAgIG1vdiB4LFIxNgkjIGlmIHggIT0gUjE2Ci0gICAqICAgIG1vdiB5LFIxNwkjIGlmIHkgIT0gUjE3Ci0gICAqICAgIGxkYSBBVCxfX09QCi0gICAqICAgIGpzciBBVCwoQVQpLDAKLSAgICogICAgbW92IFIwLHJlc3VsdAotICAgKgotICAgKiB3aXRoIGFwcHJvcHJpYXRlIG9wdGltaXphdGlvbnMgaWYgUjAsUjE2LFIxNyBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsIChjaGFyIGNoYXIgKilzeW1uYW1lKTsKLSAgICAgIG50b2stLTsKLSAgICB9Ci0jZW5kaWYKLQotICB4ciA9IHJlZ25vICh0b2tbMF0uWF9hZGRfbnVtYmVyKTsKLSAgeXIgPSByZWdubyAodG9rWzFdLlhfYWRkX251bWJlcik7Ci0KLSAgaWYgKG50b2sgPCAzKQotICAgIHJyID0geHI7Ci0gIGVsc2UKLSAgICByciA9IHJlZ25vICh0b2tbMl0uWF9hZGRfbnVtYmVyKTsKLQotICAvKiBNb3ZlIHRoZSBvcGVyYW5kcyBpbnRvIHRoZSByaWdodCBwbGFjZSAqLwotICBpZiAoeXIgPT0gQVhQX1JFR19SMTYgJiYgeHIgPT0gQVhQX1JFR19SMTcpCi0gICAgewotICAgICAgLyogVGhleSBhcmUgaW4gZXhhY3RseSB0aGUgd3Jvbmcgb3JkZXIgLS0gc3dhcCB0aHJvdWdoIEFUICovCi0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1IxNik7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjE3KTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE2KTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoeXIgPT0gQVhQX1JFR19SMTYpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMTYpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh4ciAhPSBBWFBfUkVHX1IxNikKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB4cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNik7Ci0gICAgICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh5ciAhPSBBWFBfUkVHX1IxNiAmJiB5ciAhPSBBWFBfUkVHX1IxNykKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB5cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNyk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLSAgICB9Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgc3ltLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCAyLCAxKTsKLQotICAvKiBDYWxsIHRoZSBkaXZpc2lvbiByb3V0aW5lICovCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotICBzZXRfdG9rX2NwcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMl0sIDApOwotICBhc3NlbWJsZV90b2tlbnMgKCJqc3IiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIE1vdmUgdGhlIHJlc3VsdCB0byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKHJyICE9IEFYUF9SRUdfUjApCi0gICAgewotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBycik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotICAgIH0KLX0KLQotI2Vsc2UgLyogIU9CSl9FVkFYICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2RpdmlzaW9uICh0b2ssIG50b2ssIHN5bW5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgc3ltbmFtZTsKLXsKLSAgLyogRElWSVNJT04gYW5kIE1PRFVMVVMuIFllY2guCi0gICAqIENvbnZlcnQKLSAgICogICAgT1AgeCx5LHJlc3VsdAotICAgKiB0bwotICAgKiAgICBsZGEgcHYsX19PUAotICAgKiAgICBtb3YgeCx0MTAKLSAgICogICAgbW92IHksdDExCi0gICAqICAgIGpzciB0OSwocHYpLF9fT1AKLSAgICogICAgbW92IHQxMixyZXN1bHQKLSAgICoKLSAgICogd2l0aCBhcHByb3ByaWF0ZSBvcHRpbWl6YXRpb25zIGlmIHQxMCx0MTEsdDEyIGFyZSB0aGUgcmVnaXN0ZXJzCi0gICAqIHNwZWNpZmllZCBieSB0aGUgY29tcGlsZXIuCi0gICAqLwotCi0gIGludCB4ciwgeXIsIHJyOwotICBzeW1ib2xTICpzeW07Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLSAgICB7Ci0gICAgICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2NfZXhwID0gJnRva1tudG9rLTFdOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvY19leHAtPlhfb3ApOwotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JICAgICAgKGludClyZWxvY19leHAtPlhfYWRkX251bWJlciwgKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKLSAgICAgIG50b2stLTsKLSAgICB9Ci0jZW5kaWYKLQotICB4ciA9IHJlZ25vICh0b2tbMF0uWF9hZGRfbnVtYmVyKTsKLSAgeXIgPSByZWdubyAodG9rWzFdLlhfYWRkX251bWJlcik7Ci0KLSAgaWYgKG50b2sgPCAzKQotICAgIHJyID0geHI7Ci0gIGVsc2UKLSAgICByciA9IHJlZ25vICh0b2tbMl0uWF9hZGRfbnVtYmVyKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY29uc3QgY2hhciAqKXN5bW5hbWUpOwotCi0gIC8qIE1vdmUgdGhlIG9wZXJhbmRzIGludG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmICh5ciA9PSBBWFBfUkVHX1QxMCAmJiB4ciA9PSBBWFBfUkVHX1QxMSkKLSAgICB7Ci0gICAgICAvKiBUaGV5IGFyZSBpbiBleGFjdGx5IHRoZSB3cm9uZyBvcmRlciAtLSBzd2FwIHRocm91Z2ggQVQgKi8KLQotICAgICAgaWYgKGFscGhhX25vYXRfb24pCi0JYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTEpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTApOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh5ciA9PSBBWFBfUkVHX1QxMCkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLQotICAgICAgaWYgKHhyICE9IEFYUF9SRUdfVDEwKQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHhyKTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLQotICAgICAgaWYgKHlyICE9IEFYUF9SRUdfVDEwICYmIHlyICE9IEFYUF9SRUdfVDExKQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHlyKTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDExKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotICAgIH0KLQotICAvKiBDYWxsIHRoZSBkaXZpc2lvbiByb3V0aW5lICovCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX3N5bSAobmV3dG9rWzFdLCBzeW0sIDApOwotICBhc3NlbWJsZV90b2tlbnMgKCJqc3IiLCBuZXd0b2ssIDIsIDEpOwotCi0gIC8qIFJlbG9hZCB0aGUgR1AgcmVnaXN0ZXIgKi8KLSNpZmRlZiBPQkpfQU9VVAotRklYTUUKLSNlbmRpZgotI2lmIGRlZmluZWQoT0JKX0VDT0ZGKSB8fCBkZWZpbmVkKE9CSl9FTEYpCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDkpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZGdwIiwgbmV3dG9rLCAzLCAxKTsKLSNlbmRpZgotCi0gIC8qIE1vdmUgdGhlIHJlc3VsdCB0byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKHJyICE9IEFYUF9SRUdfVDEyKQotICAgIHsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEyKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIHJyKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogIU9CSl9FVkFYICovCi0KLS8qIFRoZSBqc3IgYW5kIGptcCBtYWNyb3MgZGlmZmVyIGZyb20gdGhlaXIgaW5zdHJ1Y3Rpb24gY291bnRlcnBhcnRzCi0gICBpbiB0aGF0IHRoZXkgY2FuIGxvYWQgdGhlIHRhcmdldCBhZGRyZXNzIGFuZCBkZWZhdWx0IG1vc3QKLSAgIGV2ZXJ5dGhpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9qc3JqbXAgKHRvaywgbnRvaywgdm9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2b3BuYW1lOwotewotICBjb25zdCBjaGFyICpvcG5hbWUgPSAoY29uc3QgY2hhciAqKSB2b3BuYW1lOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIGludCByLCB0b2tpZHggPSAwLCBsaXR1c2UgPSAwOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkgICAgICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCBvcG5hbWUpOwotICAgICAgbnRvay0tOwotICAgIH0KLSNlbmRpZgotCi0gIGlmICh0b2tpZHggPCBudG9rICYmIHRva1t0b2tpZHhdLlhfb3AgPT0gT19yZWdpc3RlcikKLSAgICByID0gcmVnbm8gKHRva1t0b2tpZHgrK10uWF9hZGRfbnVtYmVyKTsKLSAgZWxzZQotICAgIHIgPSBzdHJjbXAgKG9wbmFtZSwgImptcCIpID09IDAgPyBBWFBfUkVHX1pFUk8gOiBBWFBfUkVHX1JBOwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHIpOwotCi0gIGlmICh0b2tpZHggPCBudG9rICYmCi0gICAgICAodG9rW3Rva2lkeF0uWF9vcCA9PSBPX3ByZWdpc3RlciB8fCB0b2tbdG9raWR4XS5YX29wID09IE9fY3ByZWdpc3RlcikpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0jaWZkZWYgT0JKX0VWQVgKLSAgLyoga2VlcCByZWdpc3RlciBpZiBqc3IgJG4uPHN5bT4gICovCi0jZWxzZQotICBlbHNlCi0gICAgewotICAgICAgaW50IGJhc2VyZWcgPSBhbHBoYV9ncF9yZWdpc3RlcjsKLSAgICAgIGxpdHVzZSA9IGxvYWRfZXhwcmVzc2lvbiAociA9IEFYUF9SRUdfUFYsICZ0b2tbdG9raWR4XSwgJmJhc2VyZWcsIE5VTEwsCi0JCQkJKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCByKTsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIEZJWE1FOiBBZGQgaGludCByZWxvY3MgdG8gQkZEIGZvciBldmF4LiAgKi8KLSNlbHNlCi0gIGlmICh0b2tpZHggPCBudG9rKQotICAgIG5ld3Rva1syXSA9IHRva1t0b2tpZHhdOwotICBlbHNlCi0jZW5kaWYKLSAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMl0sIDApOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuIChvcG5hbWUsIG5ld3RvaywgMywgJmluc24pOwotCi0gIC8qIGFkZCB0aGUgTElUVVNFIGZpeHVwICovCi0gIGlmIChsaXR1c2UpCi0gICAgewotICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOwotICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCi0JewotCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCi0JCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKLQl9Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2wgKG5vd19zZWcpOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IExJVFVTRV9KU1I7Ci0gICAgfQotCi0gIGVtaXRfaW5zbiAoJmluc24pOwotfQotCi0vKiBUaGUgcmV0IGFuZCBqY3IgaW5zdHJ1Y3Rpb25zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uCi0gICBjb3VudGVycGFydHMgaW4gdGhhdCBldmVyeXRoaW5nIGNhbiBiZSBkZWZhdWx0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9yZXRqY3IgKHRvaywgbnRvaywgdm9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2b3BuYW1lOwotewotICBjb25zdCBjaGFyICpvcG5hbWUgPSAoY29uc3QgY2hhciAqKXZvcG5hbWU7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLSAgaW50IHIsIHRva2lkeCA9IDA7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsIG9wbmFtZSk7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotICBlbHNlCi0gICAgciA9IEFYUF9SRUdfWkVSTzsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJgotICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotICBlbHNlCi0gICAgciA9IEFYUF9SRUdfUkE7Ci0KLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvaykKLSAgICBuZXd0b2tbMl0gPSB0b2tbdG9raWR4XTsKLSAgZWxzZQotICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1syXSwgc3RyY21wKG9wbmFtZSwgInJldCIpID09IDApOwotCi0gIGFzc2VtYmxlX3Rva2VucyAob3BuYW1lLCBuZXd0b2ssIDMsIDApOwotfQotDAotLyogQXNzZW1ibGVyIGRpcmVjdGl2ZXMgKi8KLQotLyogSGFuZGxlIHRoZSAudGV4dCBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV90ZXh0IChpKQotICAgICBpbnQgaTsKLQotewotICBzX3RleHQgKGkpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0vKiBIYW5kbGUgdGhlIC5kYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2RhdGEgKGkpCi0gICAgIGludCBpOwotewotICBzX2RhdGEgKGkpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0jaWYgZGVmaW5lZCAoT0JKX0VDT0ZGKSB8fCBkZWZpbmVkIChPQkpfRVZBWCkKLQotLyogSGFuZGxlIHRoZSBPU0YvMSBhbmQgb3BlblZNUyAuY29tbSBwc2V1ZG8gcXVpcmtzLgotICAgb3BlblZNUyBjb25zdHJ1Y3RzIGEgc2VjdGlvbiBmb3IgZXZlcnkgY29tbW9uIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2NvbW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBvZmZzZXRUIHRlbXA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHNlZ1QgbmV3X3NlZzsKLSNlbmRpZgotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBBbHBoYSBPU0YvMSBjb21waWxlciBkb2Vzbid0IHByb3ZpZGUgdGhlIGNvbW1hLCBnY2MgZG9lcy4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIE1ha2UgYSBzZWN0aW9uIGZvciB0aGUgY29tbW9uIHN5bWJvbC4gICovCi0gIG5ld19zZWcgPSBzdWJzZWdfbmV3ICh4c3RyZHVwIChuYW1lKSwgMCk7Ci0jZW5kaWYKLQotICAqcCA9IGM7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAvKiBhbGlnbm1lbnQgbWlnaHQgZm9sbG93ICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgb2Zmc2V0VCBhbGlnbjsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7ICAgICAgCi0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBuZXdfc2VnLCBhbGlnbik7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIE9CSl9FVkFYCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpID4gMCkKLSAgICB7IAotICAgICAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgbmV3X3NlZykgIT0gdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotI2Vsc2UKLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHRlbXApCi0JYXNfYmFkIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotI2VuZGlmCi0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgT0JKX0VWQVggCi0gICAgICBzdWJzZWdfc2V0IChuZXdfc2VnLCAwKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHRlbXApOwotICAgICAgbmV3X3NlZy0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgIGlmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgbmV3X3NlZyk7Ci0jZWxzZQotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHRlbXApOwotI2VuZGlmCi0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VWQVgKLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7Ci0jZW5kaWYKLQotICBrbm93IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmIC8qICEgT0JKX0VMRiAqLwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0KLS8qIEhhbmRsZSB0aGUgLnJkYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3JkYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FQ09GRgotCi0vKiBIYW5kbGUgdGhlIC5zZGF0YSBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19uZXcgKCIuc2RhdGEiLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOwotCi0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2VudCAoZHVtbXkpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbnQgKDApOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbmFtZSwgbmFtZV9lbmQ7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIGlmIChhbHBoYV9jdXJfZW50X3N5bSkKLQkgICAgYXNfd2FybiAoXygibmVzdGVkIC5lbnQgZGlyZWN0aXZlcyIpKTsKLQotCSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgYWxwaGFfY3VyX2VudF9zeW0gPSBzeW07Ci0KLQkgIC8qIFRoZSAuZW50IGRpcmVjdGl2ZSBpcyBzb21ldGltZXMgZm9sbG93ZWQgYnkgYSBudW1iZXIuICBOb3Qgc3VyZQotCSAgICAgd2hhdCBpdCByZWFsbHkgbWVhbnMsIGJ1dCBpZ25vcmUgaXQuICAqLwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICB9Ci0JICBpZiAoaXNkaWdpdCAoKmlucHV0X2xpbmVfcG9pbnRlcikgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0JICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW5kIChkdW1teSkKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfZGlyZWN0aXZlX2VuZCAoMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lLCBuYW1lX2VuZDsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgICBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgqbmFtZSkpCi0JewotCSAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiKSk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnN5bTsKLQotCSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCSAgaWYgKHN5bSAhPSBhbHBoYV9jdXJfZW50X3N5bSkKLQkgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgbmFtZXMgZGlmZmVyZW50IHN5bWJvbCB0aGFuIC5lbnQiKSk7Ci0KLQkgIC8qIENyZWF0ZSBhbiBleHByZXNzaW9uIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotCSAgaWYgKHN5bSkKLQkgICAgewotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplID0KLQkJKGV4cHJlc3Npb25TICopIHhtYWxsb2MgKHNpemVvZiAoZXhwcmVzc2lvblMpKTsKLQkgICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZS0+WF9vcCA9IE9fc3VidHJhY3Q7Ci0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnNpemUtPlhfYWRkX3N5bWJvbAotCSAgICAgICAgPSBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7Ci0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnNpemUtPlhfb3Bfc3ltYm9sID0gc3ltOwotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICB9Ci0KLQkgIGFscGhhX2N1cl9lbnRfc3ltID0gTlVMTDsKLQotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9tYXNrIChmcCkKLSAgICAgaW50IGZwOwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIHsKLSAgICAgIGlmIChmcCkKLSAgICAgICAgZWNvZmZfZGlyZWN0aXZlX2ZtYXNrICgwKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZWNvZmZfZGlyZWN0aXZlX21hc2sgKDApOwotICAgIH0KLSAgZWxzZQotICAgIGRpc2NhcmRfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mcmFtZSAoZHVtbXkpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSAoMCk7Ci0gIGVsc2UKLSAgICBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfcHJvbG9ndWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW1ib2xTICpzeW07Ci0gIGludCBhcmc7Ci0KLSAgYXJnID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBzeW0gPSBlY29mZl9nZXRfY3VyX3Byb2Nfc3ltICgpOwotICBlbHNlCi0gICAgc3ltID0gYWxwaGFfY3VyX2VudF9zeW07Ci0gIGtub3cgKHN5bSAhPSBOVUxMKTsKLQotICBzd2l0Y2ggKGFyZykKLSAgICB7Ci0gICAgICBjYXNlIDA6IC8qIE5vIFBWIHJlcXVpcmVkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfTk9QVik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6IC8qIFN0ZCBHUCBsb2FkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6IC8qIE5vbi1zdGQgdXNlIG9mIFBWLiAgKi8KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgJWQgdG8gLnByb2xvZ3VlLiIpLCBhcmcpOwotCWJyZWFrOwotICAgIH0gIAotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9jb2ZmX3dyYXBwZXIgKHdoaWNoKQotICAgICBpbnQgd2hpY2g7Ci17Ci0gIHN0YXRpYyB2b2lkICgqIGNvbnN0IGZuc1tdKSBQQVJBTVMgKChpbnQpKSA9IHsKLSAgICBlY29mZl9kaXJlY3RpdmVfYmVnaW4sCi0gICAgZWNvZmZfZGlyZWN0aXZlX2JlbmQsCi0gICAgZWNvZmZfZGlyZWN0aXZlX2RlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZGltLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZmlsZSwKLSAgICBlY29mZl9kaXJlY3RpdmVfc2NsLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV90YWcsCi0gICAgZWNvZmZfZGlyZWN0aXZlX3ZhbCwKLSAgICBlY29mZl9kaXJlY3RpdmVfbG9jLAotICB9OwotCi0gIGFzc2VydCAod2hpY2ggPj0gMCAmJiB3aGljaCA8IChpbnQpKHNpemVvZihmbnMpL3NpemVvZigqZm5zKSkpOwotCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgKCpmbnNbd2hpY2hdKSgwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRUNPRkYgZGVidWdnaW5nIGlzIGRpc2FibGVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotI2lmZGVmIE9CSl9FVkFYCi0gIAotLyogSGFuZGxlIHRoZSBzZWN0aW9uIHNwZWNpZmljIHBzZXVkby1vcC4gICovCi0gIAotc3RhdGljIHZvaWQKLXNfYWxwaGFfc2VjdGlvbiAoc2VjaWQpCi0gICAgIGludCBzZWNpZDsKLXsKLSAgaW50IHRlbXA7Ci0jZGVmaW5lIEVWQVhfU0VDVElPTl9DT1VOVCA1Ci0gIHN0YXRpYyBjaGFyICpzZWN0aW9uX25hbWVbRVZBWF9TRUNUSU9OX0NPVU5UKzFdID0KLSAgICB7ICJOVUxMIiwgIi5yZGF0YSIsICIuY29tbSIsICIubGluayIsICIuY3RvcnMiLCAiLmR0b3JzIiB9OwotCi0gIGlmICgoc2VjaWQgPD0gMCkgfHwgKHNlY2lkID4gRVZBWF9TRUNUSU9OX0NPVU5UKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiVW5rbm93biBzZWN0aW9uIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19uZXcgKHNlY3Rpb25fbmFtZVtzZWNpZF0sIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0KLS8qIFBhcnNlIC5lbnQgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2VudCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW1ib2w7Ci0gIGV4cHJlc3Npb25TIHN5bWV4cHI7Ci0KLSAgYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lcmVnID0gLTE7Ci0gIGFscGhhX2V2YXhfcHJvYy5mcmFtZXNpemUgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MucnNhX29mZnNldCA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy5yYV9zYXZlID0gQVhQX1JFR19SQTsKLSAgYWxwaGFfZXZheF9wcm9jLmZwX3NhdmUgPSAtMTsKLSAgYWxwaGFfZXZheF9wcm9jLmltYXNrID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLmZtYXNrID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLnByb2xvZ3VlID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLnR5cGUgPSAwOwotCi0gIGV4cHJlc3Npb24gKCZzeW1leHByKTsKLQotICBpZiAoc3ltZXhwci5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnN5bWV4cHIpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sID0gc3ltYm9sOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBQYXJzZSAuZnJhbWUgPGZyYW1yZWc+LDxmcmFtZXNpemU+LFJBLDxyc2Ffb2Zmc2V0PiBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnJhbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCi0gICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDEuLzIuIHBhcmFtIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVzaXplID0gdmFsOwotCi0gICh2b2lkKSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDMuLzQuIHBhcmFtIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYWxwaGFfZXZheF9wcm9jLnJzYV9vZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3BkZXNjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIGxvbmcgdmFsOwotICByZWdpc3RlciBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHN5bWJvbFMgKmVudHJ5X3N5bTsKLSAgZml4UyAqZml4cDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKLQotICBpZiAobm93X3NlZyAhPSBhbHBoYV9saW5rX3NlY3Rpb24pCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucGRlc2MgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCA9PSAwKQotICAgICAgfHwgKCFTX0lTX0RFRklORUQgKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wpKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiLnBkZXNjIGhhcyBubyBtYXRjaGluZyAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKnN5bWJvbF9nZXRfb2JqIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKSA9Ci0gICAgKHZhbHVlVCkgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemU7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIucGRlc2MgZGlyZWN0aXZlIGhhcyBubyBlbnRyeSBzeW1ib2wiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbnRyeV9zeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmZXhwKTsKLSAgLyogU2F2ZSBiZmQgc3ltYm9sIG9mIHByb2MgZGVzYyBpbiBmdW5jdGlvbiBzeW1ib2wuICAqLwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCktPnVkYXRhLnAKLSAgICA9IHN5bWJvbF9nZXRfYmZkc3ltIChlbnRyeV9zeW0pOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTm8gY29tbWEgYWZ0ZXIgLnBkZXNjIDxlbnRyeW5hbWU+IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmIChzdHJuY21wKG5hbWUsICJzdGFjayIsIDUpID09IDApCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID0gUERTQ19TX0tfS0lORF9GUF9TVEFDSzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAobmFtZSwgInJlZyIsIDMpID09IDApCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID0gUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAobmFtZSwgIm51bGwiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IFBEU0NfU19LX0tJTkRfTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBwcm9jZWR1cmUga2luZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZnJhZ19hbGlnbiAoMywgMCwgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKDE2KTsKLSAgZml4cCA9IGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsIDAsIDAsIDAsIDApOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gMTY7Ci0KLSAgKnAgPSBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQKLSAgICAgICB8ICgoYWxwaGFfZXZheF9wcm9jLmZyYW1lcmVnID09IDI5KSA/IFBEU0NfU19NX0JBU0VfUkVHX0lTX0ZQIDogMCk7Ci0gICoocCsxKSA9IFBEU0NfU19NX05BVElWRQotCSAgIHwgUERTQ19TX01fTk9fSkFDS0VUOwotCi0gIHN3aXRjaCAoYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kKQotICAgIHsKLSAgICAgIGNhc2UgUERTQ19TX0tfS0lORF9OVUxMOgotCSoocCsyKSA9IDA7Ci0JKihwKzMpID0gMDsKLQlicmVhazsKLSAgICAgIGNhc2UgUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUjoKLQkqKHArMikgPSBhbHBoYV9ldmF4X3Byb2MuZnBfc2F2ZTsKLQkqKHArMykgPSBhbHBoYV9ldmF4X3Byb2MucmFfc2F2ZTsKLQlicmVhazsKLSAgICAgIGNhc2UgUERTQ19TX0tfS0lORF9GUF9TVEFDSzoKLQltZF9udW1iZXJfdG9fY2hhcnMgKHArMiwgKHZhbHVlVClhbHBoYV9ldmF4X3Byb2MucnNhX29mZnNldCwgMik7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgkJLyogaW1wb3NzaWJsZSAqLwotCWJyZWFrOwotICAgIH0KLQotICAqKHArNCkgPSAwOwotICAqKHArNSkgPSBhbHBoYV9ldmF4X3Byb2MudHlwZSAmIDB4MGY7Ci0KLSAgLyogU2lnbmF0dXJlIG9mZnNldC4gICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCs2LCAodmFsdWVUKTAsIDIpOwotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCs4LCA4LCAmZXhwLCAwLCBCRkRfUkVMT0NfNjQpOwotCi0gIGlmIChhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPT0gUERTQ19TX0tfS0lORF9OVUxMKQotICAgIHJldHVybjsKLQotICAvKiBBZGQgZHVtbXkgZml4IHRvIG1ha2UgYWRkX3RvX2xpbmtfcG9vbCB3b3JrLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gIGZpeHAgPSBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAwLCAwLCAwLCAwKTsKLSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDg7Ci0KLSAgLyogcGRlc2MrMTY6IFNpemUuICAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpYWxwaGFfZXZheF9wcm9jLmZyYW1lc2l6ZSwgNCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwKzQsICh2YWx1ZVQpMCwgMik7Ci0KLSAgLyogRW50cnkgbGVuZ3RoLiAgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwKzYsIGFscGhhX2V2YXhfcHJvYy5wcm9sb2d1ZSwgMik7Ci0KLSAgaWYgKGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9PSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSKQotICAgIHJldHVybjsKLQotICAvKiBBZGQgZHVtbXkgZml4IHRvIG1ha2UgYWRkX3RvX2xpbmtfcG9vbCB3b3JrLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gIGZpeHAgPSBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAwLCAwLCAwLCAwKTsKLSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDg7Ci0KLSAgLyogcGRlc2MrMjQ6IHJlZ2lzdGVyIG1hc2tzLiAgKi8KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIGFscGhhX2V2YXhfcHJvYy5pbWFzaywgNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCs0LCBhbHBoYV9ldmF4X3Byb2MuZm1hc2ssIDQpOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBTdXBwb3J0IGZvciBjcmFzaCBkZWJ1ZyBvbiB2bXMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9uYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKLQotICBpZiAobm93X3NlZyAhPSBhbHBoYV9saW5rX3NlY3Rpb24pCi0gICAgewotICAgICAgYXNfYmFkIChfKCIubmFtZSBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubmFtZSBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGZyYWdfYWxpZ24gKDMsIDAsIDApOwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gODsKLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsICZleHAsIDAsIEJGRF9SRUxPQ182NCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2xpbmthZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBjaGFyICpwOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJObyBzeW1ib2wgYWZ0ZXIgLmxpbmthZ2UiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcCA9IGZyYWdfbW9yZSAoTEtQX1NfS19TSVpFKTsKLSAgICAgIG1lbXNldCAocCwgMCwgTEtQX1NfS19TSVpFKTsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBMS1BfU19LX1NJWkUsICZleHAsIDAsXAotCQkgICBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRSk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9jb2RlX2FkZHJlc3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBjaGFyICpwOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJObyBzeW1ib2wgYWZ0ZXIgLmNvZGVfYWRkcmVzcyIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwID0gZnJhZ19tb3JlICg4KTsKLSAgICAgIG1lbXNldCAocCwgMCwgOCk7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgJmV4cCwgMCxcCi0JCSAgIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUik7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mcF9zYXZlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0KLSAgYWxwaGFfZXZheF9wcm9jLmZwX3NhdmUgPSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9tYXNrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAubWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MuaW1hc2sgPSB2YWw7Ci0gICAgICAodm9pZClnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2ZtYXNrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLmZtYXNrID0gdmFsOwotICAgICAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2VuZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyIGM7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgYWxwaGFfZXZheF9wcm9jLnN5bWJvbCA9IDA7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2ZpbGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqczsKLSAgaW50IGxlbmd0aDsKLSAgc3RhdGljIGNoYXIgY2FzZV9oYWNrWzMyXTsKLQotICBleHRlcm4gY2hhciAqZGVtYW5kX2NvcHlfc3RyaW5nIFBBUkFNUyAoKGludCAqbGVuUCkpOwotCi0gIHNwcmludGYgKGNhc2VfaGFjaywgIjxDQVNFOiUwMWQlMDFkPiIsCi0JICAgYWxwaGFfZmxhZ19oYXNoX2xvbmdfbmFtZXMsIGFscGhhX2ZsYWdfc2hvd19hZnRlcl90cnVuYyk7Ci0KLSAgcyA9IHN5bWJvbF9maW5kX29yX21ha2UgKGNhc2VfaGFjayk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzKS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7Ci0KLSAgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHMgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChkZW1hbmRfY29weV9zdHJpbmcgKCZsZW5ndGgpKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHMpLT5mbGFncyB8PSBCU0ZfRklMRTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0jZW5kaWYgLyogT0JKX0VWQVggICovCi0KLS8qIEhhbmRsZSB0aGUgLmdwcmVsMzIgcHNldWRvIG9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZ3ByZWwzMiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIGNoYXIgKnA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBleHByZXNzaW9uICgmZSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBlLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sKGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgZS5YX29wID0gT19zeW1ib2w7Ci0gICAgICAvKiBGQUxMVEhSVSAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0jZWxzZQotI2lmZGVmIE9CSl9FQ09GRgotICBzd2l0Y2ggKGUuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgZS5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgZS5YX29wID0gT19zdWJ0cmFjdDsKLSAgICAgIGUuWF9vcF9zeW1ib2wgPSBhbHBoYV9ncF9zeW1ib2w7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLSAgICBhbHBoYV9hbGlnbiAoMiwgKGNoYXIgKikgTlVMTCwgYWxwaGFfaW5zbl9sYWJlbCwgMCk7Ci0gIGlmIChhbHBoYV9jdXJyZW50X2FsaWduID4gMikKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gMjsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1lbXNldCAocCwgMCwgNCk7Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkgICAgICAgJmUsIDAsIEJGRF9SRUxPQ19HUFJFTDMyKTsKLX0KLQotLyogSGFuZGxlIGZsb2F0aW5nIHBvaW50IGFsbG9jYXRpb24gcHNldWRvLW9wcy4gIFRoaXMgaXMgbGlrZSB0aGUKLSAgIGdlbmVyaWMgdnJlc2lvbiwgYnV0IGl0IG1ha2VzIHN1cmUgdGhlIGN1cnJlbnQgbGFiZWwsIGlmIGFueSwgaXMKLSAgIGNvcnJlY3RseSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZmxvYXRfY29ucyAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGludCBsb2dfc2l6ZTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICBsb2dfc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ0cnOgotICAgICAgbG9nX3NpemUgPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIGxvZ19zaXplID0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotCi0gIGZsb2F0X2NvbnMgKHR5cGUpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5wcm9jIHBzZXVkbyBvcC4gIFdlIGRvbid0IHJlYWxseSBkbyBtdWNoIHdpdGggaXQgZXhjZXB0Ci0gICBwYXJzZSBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3Byb2MgKGlzX3N0YXRpYykKLSAgICAgaW50IGlzX3N0YXRpYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCB0ZW1wOwotCi0gIC8qIFRha2VzICIucHJvYyBuYW1lLG5hcmdzIiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc193YXJuIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIHRlbXAgPSAwOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIC8qICAqc3ltYm9sX2dldF9vYmogKHN5bWJvbFApID0gKHNpZ25lZCBjaGFyKSB0ZW1wOyAqLwotICBhc193YXJuIChfKCJ1bmhhbmRsZWQ6IC5wcm9jICVzLCVkIiksIG5hbWUsIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5zZXQgcHNldWRvIG9wLiAgVGhpcyBpcyB1c2VkIHRvIHR1cm4gb24gYW5kIG9mZiBtb3N0IG9mCi0gICB0aGUgYXNzZW1ibGVyIGZlYXR1cmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfc2V0ICh4KQotICAgICBpbnQgeCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lLCBjaCwgKnM7Ci0gIGludCB5ZXNubyA9IDE7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHMgPSBuYW1lOwotICBpZiAoc1swXSA9PSAnbicgJiYgc1sxXSA9PSAnbycpCi0gICAgewotICAgICAgeWVzbm8gPSAwOwotICAgICAgcyArPSAyOwotICAgIH0KLSAgaWYgKCFzdHJjbXAgKCJyZW9yZGVyIiwgcykpCi0gICAgLyogaWdub3JlICovIDsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoImF0IiwgcykpCi0gICAgYWxwaGFfbm9hdF9vbiA9ICF5ZXNubzsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoIm1hY3JvIiwgcykpCi0gICAgYWxwaGFfbWFjcm9zX29uID0geWVzbm87Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKCJtb3ZlIiwgcykpCi0gICAgLyogaWdub3JlICovIDsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoInZvbGF0aWxlIiwgcykpCi0gICAgLyogaWdub3JlICovIDsKLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIlRyaWVkIHRvIC5zZXQgdW5yZWNvZ25pemVkIG1vZGUgYCVzJyIpLCBuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gY2g7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmJhc2UgcHNldWRvIG9wLiAgVGhpcyBjaGFuZ2VzIHRoZSBhc3NlbWJsZXIncyBub3Rpb24gb2YKLSAgIHRoZSAkZ3AgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9iYXNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiAwCi0gIGlmIChmaXJzdF8zMmJpdF9xdWFkcmFudCkKLSAgICB7Ci0gICAgICAvKiBub3QgZmF0YWwsIGJ1dCBpdCBtaWdodCBub3Qgd29yayBpbiB0aGUgZW5kICovCi0gICAgICBhc193YXJuIChfKCJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iKSk7Ci0gICAgICBmaXJzdF8zMmJpdF9xdWFkcmFudCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCi0gICAgewkJCQkvKiAkck5OIGZvcm0gKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3InKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBhbHBoYV9ncF9yZWdpc3RlciA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxwaGFfZ3BfcmVnaXN0ZXIgPCAwIHx8IGFscGhhX2dwX3JlZ2lzdGVyID4gMzEpCi0gICAgewotICAgICAgYWxwaGFfZ3BfcmVnaXN0ZXIgPSBBWFBfUkVHX0dQOwotICAgICAgYXNfd2FybiAoXygiQmFkIGJhc2UgcmVnaXN0ZXIsIHVzaW5nICQlZC4iKSwgYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3AuICBUaGlzIGFsaWducyB0byBhIHBvd2VyIG9mIHR3by4gIEl0Ci0gICBhbHNvIGFkanVzdHMgYW55IGN1cnJlbnQgaW5zdHJ1Y3Rpb24gbGFiZWwuICBXZSB0cmVhdCB0aGlzIHRoZSBzYW1lCi0gICB3YXkgdGhlIE1JUFMgcG9ydCBkb2VzOiAuYWxpZ24gMCB0dXJucyBvZmYgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9hbGlnbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBhbGlnbjsKLSAgY2hhciBmaWxsLCAqcGZpbGw7Ci0gIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OwotCi0gIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCi0gICAgewotICAgICAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OwotICAgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZCIpLCBhbGlnbik7Ci0gICAgfQotICBlbHNlIGlmIChhbGlnbiA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiKSk7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHBmaWxsID0gJmZpbGw7Ci0gICAgfQotICBlbHNlCi0gICAgcGZpbGwgPSBOVUxMOwotCi0gIGlmIChhbGlnbiAhPSAwKQotICAgIHsKLSAgICAgIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICAgICAgYWxwaGFfYWxpZ24gKGFsaWduLCBwZmlsbCwgYWxwaGFfaW5zbl9sYWJlbCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDA7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhvb2sgdGhlIG5vcm1hbCBzdHJpbmcgcHJvY2Vzc29yIHRvIHJlc2V0IGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3N0cmluZ2VyICh0ZXJtaW5hdGUpCi0gICAgIGludCB0ZXJtaW5hdGU7Ci17Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgc3RyaW5nZXIgKHRlcm1pbmF0ZSk7Ci19Ci0KLS8qIEhvb2sgdGhlIG5vcm1hbCBzcGFjZSBwcm9jZXNzaW5nIHRvIHJlc2V0IGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NwYWNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgc19zcGFjZSAoaWdub3JlKTsKLX0KLQotLyogSG9vayBpbnRvIGNvbnMgZm9yIGF1dG8tYWxpZ25tZW50LiAgKi8KLQotdm9pZAotYWxwaGFfY29uc19hbGlnbiAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBsb2dfc2l6ZTsKLQotICBsb2dfc2l6ZSA9IDA7Ci0gIHdoaWxlICgoc2l6ZSA+Pj0gMSkgIT0gMCkKLSAgICArK2xvZ19zaXplOwotCi0gIGlmIChhbHBoYV9hdXRvX2FsaWduX29uICYmIGFscGhhX2N1cnJlbnRfYWxpZ24gPCBsb2dfc2l6ZSkKLSAgICBhbHBoYV9hbGlnbiAobG9nX3NpemUsIChjaGFyICopIE5VTEwsIGFscGhhX2luc25fbGFiZWwsIDApOwotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+IGxvZ19zaXplKQotICAgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSBsb2dfc2l6ZTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci19Ci0KLS8qIEhlcmUgY29tZSB0aGUgLnV3b3JkLCAudWxvbmcsIGFuZCAudXF1YWQgZXhwbGljaXRseSB1bmFsaWduZWQKLSAgIHBzZXVkb3MuICBXZSBqdXN0IHR1cm4gb2ZmIGF1dG8tYWxpZ25tZW50IGFuZCBjYWxsIGRvd24gdG8gY29ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3Vjb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICBpbnQgaG9sZCA9IGFscGhhX2F1dG9fYWxpZ25fb247Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAwOwotICBjb25zIChieXRlcyk7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSBob2xkOwotfQotCi0vKiBTd2l0Y2ggdGhlIHdvcmtpbmcgY3B1IHR5cGUuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9hcmNoIChpZ25vcmVkKQotICAgICBpbnQgaWdub3JlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lLCBjaDsKLSAgY29uc3Qgc3RydWN0IGNwdV90eXBlICpwOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2ggPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBmb3IgKHAgPSBjcHVfdHlwZXM7IHAtPm5hbWU7ICsrcCkKLSAgICBpZiAoc3RyY21wKG5hbWUsIHAtPm5hbWUpID09IDApCi0gICAgICB7Ci0gICAgICAgIGFscGhhX3RhcmdldF9uYW1lID0gcC0+bmFtZSwgYWxwaGFfdGFyZ2V0ID0gcC0+ZmxhZ3M7Ci0JZ290byBmb3VuZDsKLSAgICAgIH0KLSAgYXNfd2FybigiVW5rbm93biBDUFUgaWRlbnRpZmllciBgJXMnIiwgbmFtZSk7Ci0KLWZvdW5kOgotICAqaW5wdXRfbGluZV9wb2ludGVyID0gY2g7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQwKLQotI2lmZGVmIERFQlVHMQotLyogcHJpbnQgdG9rZW4gZXhwcmVzc2lvbiB3aXRoIGFscGhhIHNwZWNpZmljIGV4dGVuc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9wcmludF90b2tlbihmLCBleHApCi0gICAgRklMRSAqZjsKLSAgICBjb25zdCBleHByZXNzaW9uUyAqZXhwOwotewotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgICBjYXNlIE9fY3ByZWdpc3RlcjoKLQlwdXRjICgnLCcsIGYpOwotCS8qIEZBTExUSFJVICovCi0gICAgICBjYXNlIE9fcHJlZ2lzdGVyOgotCXB1dGMgKCcoJywgZik7Ci0JewotCSAgZXhwcmVzc2lvblMgbmV4cCA9ICpleHA7Ci0JICBuZXhwLlhfb3AgPSBPX3JlZ2lzdGVyOwotCSAgcHJpbnRfZXhwciAoZiwgJm5leHApOwotCX0KLQlwdXRjICgnKScsIGYpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlwcmludF9leHByIChmLCBleHApOwotCWJyZWFrOwotICAgIH0KLSAgcmV0dXJuOwotfQotI2VuZGlmCi0MCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0jaWZkZWYgT0JKX0VDT0ZGCi0gIHsiY29tbSIsIHNfYWxwaGFfY29tbSwgMH0sCS8qIG9zZjEgY29tcGlsZXIgZG9lcyB0aGlzICovCi0gIHsicmRhdGEiLCBzX2FscGhhX3JkYXRhLCAwfSwKLSNlbmRpZgotICB7InRleHQiLCBzX2FscGhhX3RleHQsIDB9LAotICB7ImRhdGEiLCBzX2FscGhhX2RhdGEsIDB9LAotI2lmZGVmIE9CSl9FQ09GRgotICB7InNkYXRhIiwgc19hbHBoYV9zZGF0YSwgMH0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIHsic2VjdGlvbiIsIHNfYWxwaGFfc2VjdGlvbiwgMH0sCi0gIHsic2VjdGlvbi5zIiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0Iiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0LnMiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLSAgeyAicGRlc2MiLCBzX2FscGhhX3BkZXNjLCAwfSwKLSAgeyAibmFtZSIsIHNfYWxwaGFfbmFtZSwgMH0sCi0gIHsgImxpbmthZ2UiLCBzX2FscGhhX2xpbmthZ2UsIDB9LAotICB7ICJjb2RlX2FkZHJlc3MiLCBzX2FscGhhX2NvZGVfYWRkcmVzcywgMH0sCi0gIHsgImVudCIsIHNfYWxwaGFfZW50LCAwfSwKLSAgeyAiZnJhbWUiLCBzX2FscGhhX2ZyYW1lLCAwfSwKLSAgeyAiZnBfc2F2ZSIsIHNfYWxwaGFfZnBfc2F2ZSwgMH0sCi0gIHsgIm1hc2siLCBzX2FscGhhX21hc2ssIDB9LAotICB7ICJmbWFzayIsIHNfYWxwaGFfZm1hc2ssIDB9LAotICB7ICJlbmQiLCBzX2FscGhhX2VuZCwgMH0sCi0gIHsgImZpbGUiLCBzX2FscGhhX2ZpbGUsIDB9LAotICB7ICJyZGF0YSIsIHNfYWxwaGFfc2VjdGlvbiwgMX0sCi0gIHsgImNvbW0iLCBzX2FscGhhX2NvbW0sIDB9LAotICB7ICJsaW5rIiwgc19hbHBoYV9zZWN0aW9uLCAzfSwKLSAgeyAiY3RvcnMiLCBzX2FscGhhX3NlY3Rpb24sIDR9LAotICB7ICJkdG9ycyIsIHNfYWxwaGFfc2VjdGlvbiwgNX0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEZyYW1lIHJlbGF0ZWQgcHNldWRvcy4gICovCi0gIHsiZW50Iiwgc19hbHBoYV9lbnQsIDB9LAotICB7ImVuZCIsIHNfYWxwaGFfZW5kLCAwfSwKLSAgeyJtYXNrIiwgc19hbHBoYV9tYXNrLCAwfSwKLSAgeyJmbWFzayIsIHNfYWxwaGFfbWFzaywgMX0sCi0gIHsiZnJhbWUiLCBzX2FscGhhX2ZyYW1lLCAwfSwKLSAgeyJwcm9sb2d1ZSIsIHNfYWxwaGFfcHJvbG9ndWUsIDB9LAotICAvKiBDT0ZGIGRlYnVnZ2luZyByZWxhdGVkIHBzZXVkb3MuICAqLwotICB7ImJlZ2luIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDB9LAotICB7ImJlbmQiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMX0sCi0gIHsiZGVmIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDJ9LAotICB7ImRpbSIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCAzfSwKLSAgeyJlbmRlZiIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA0fSwKLSAgeyJmaWxlIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDV9LAotICB7InNjbCIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA2fSwKLSAgeyJ0YWciLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgN30sCi0gIHsidmFsIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDh9LAotICB7ImxvYyIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA5fSwKLSNlbHNlCi0gIHsicHJvbG9ndWUiLCBzX2lnbm9yZSwgMH0sCi0jZW5kaWYKLSAgeyJncHJlbDMyIiwgc19hbHBoYV9ncHJlbDMyLCAwfSwKLSAgeyJ0X2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZCd9LAotICB7InNfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsiZl9mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ0YnfSwKLSAgeyJnX2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnRyd9LAotICB7ImRfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdEJ30sCi0KLSAgeyJwcm9jIiwgc19hbHBoYV9wcm9jLCAwfSwKLSAgeyJhcHJvYyIsIHNfYWxwaGFfcHJvYywgMX0sCi0gIHsic2V0Iiwgc19hbHBoYV9zZXQsIDB9LAotICB7InJlZ3VzZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJsaXZlcmVnIiwgc19pZ25vcmUsIDB9LAotICB7ImJhc2UiLCBzX2FscGhhX2Jhc2UsIDB9LAkJLyo/PyovCi0gIHsib3B0aW9uIiwgc19pZ25vcmUsIDB9LAotICB7ImFlbnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsidWdlbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJlZmxhZyIsIHNfaWdub3JlLCAwfSwKLQotICB7ImFsaWduIiwgc19hbHBoYV9hbGlnbiwgMH0sCi0gIHsiZG91YmxlIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZCd9LAotICB7ImZsb2F0Iiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZid9LAotICB7InNpbmdsZSIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJhc2NpaSIsIHNfYWxwaGFfc3RyaW5nZXIsIDB9LAotICB7ImFzY2l6Iiwgc19hbHBoYV9zdHJpbmdlciwgMX0sCi0gIHsic3RyaW5nIiwgc19hbHBoYV9zdHJpbmdlciwgMX0sCi0gIHsic3BhY2UiLCBzX2FscGhhX3NwYWNlLCAwfSwKLSAgeyJza2lwIiwgc19hbHBoYV9zcGFjZSwgMH0sCi0gIHsiemVybyIsIHNfYWxwaGFfc3BhY2UsIDB9LAotCi0vKiBVbmFsaWduZWQgZGF0YSBwc2V1ZG9zLiAgKi8KLSAgeyJ1d29yZCIsIHNfYWxwaGFfdWNvbnMsIDJ9LAotICB7InVsb25nIiwgc19hbHBoYV91Y29ucywgNH0sCi0gIHsidXF1YWQiLCBzX2FscGhhX3Vjb25zLCA4fSwKLQotI2lmZGVmIE9CSl9FTEYKLS8qIER3YXJmIHdhbnRzIHRoZXNlIHZlcnNpb25zIG9mIHVuYWxpZ25lZC4gICovCi0gIHsiMmJ5dGUiLCBzX2FscGhhX3Vjb25zLCAyfSwKLSAgeyI0Ynl0ZSIsIHNfYWxwaGFfdWNvbnMsIDR9LAotICB7IjhieXRlIiwgc19hbHBoYV91Y29ucywgOH0sCi0jZW5kaWYKLQotLyogV2UgZG9uJ3QgZG8gYW55IG9wdGltaXppbmcsIHNvIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZXNlLiAgKi8KLSAgeyJub2FsaWFzIiwgc19pZ25vcmUsIDB9LAotICB7ImFsaWFzIiwgc19pZ25vcmUsIDB9LAotCi0gIHsiYXJjaCIsIHNfYWxwaGFfYXJjaCwgMH0sCi0KLSAge05VTEwsIDAsIDB9LAotfTsKLQotDAotLyogQnVpbGQgYSBCRkQgc2VjdGlvbiB3aXRoIGl0cyBmbGFncyBzZXQgYXBwcm9wcmlhdGVseSBmb3IgdGhlIC5saXRhLAotICAgLmxpdDgsIG9yIC5saXQ0IHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gKG5hbWUsIHNlY3AsIHN5bXApCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHNlZ1QgKnNlY3A7Ci0gICAgIHN5bWJvbFMgKipzeW1wOwotewotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHNlZ1QgbmV3X3NlYzsKLQotICAqc2VjcCA9IG5ld19zZWMgPSBzdWJzZWdfbmV3IChuYW1lLCAwKTsKLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgbmV3X3NlYywgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBuZXdfc2VjLAotCQkJIFNFQ19SRUxPQyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZCi0JCQkgfCBTRUNfREFUQSk7Ci0KLSAgU19DTEVBUl9FWFRFUk5BTCAoKnN5bXAgPSBzZWN0aW9uX3N5bWJvbCAobmV3X3NlYykpOwotfQotCi0jaWZkZWYgT0JKX0VDT0ZGCi0KLS8qIEBAQCBHUCBzZWxlY3Rpb24gdm9vZG9vLiAgQWxsIG9mIHRoaXMgc2VlbXMgb3Zlcmx5IGNvbXBsaWNhdGVkIGFuZAotICAgdW5uZWNlc3Nhcnk7IHdoaWNoIGlzIHRoZSBwcmltYXJ5IHJlYXNvbiBpdCdzIGZvciBFQ09GRiBvbmx5LiAgKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi1tYXliZV9zZXRfZ3AgKHNlYykKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgYmZkX3ZtYSB2bWE7Ci0gIGlmICghc2VjKQotICAgIHJldHVybjsKLSAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoZm9vLCBzZWMpOwotICBpZiAodm1hICYmIHZtYSA8IGFscGhhX2dwX3ZhbHVlKQotICAgIGFscGhhX2dwX3ZhbHVlID0gdm1hOwotfQotCi1zdGF0aWMgdm9pZAotc2VsZWN0X2dwX3ZhbHVlICgpCi17Ci0gIGFzc2VydCAoYWxwaGFfZ3BfdmFsdWUgPT0gMCk7Ci0KLSAgLyogR2V0IG1pbnVzLW9uZSBpbiB3aGF0ZXZlciB3aWR0aC4uLiAgKi8KLSAgYWxwaGFfZ3BfdmFsdWUgPSAwOyBhbHBoYV9ncF92YWx1ZS0tOwotCi0gIC8qIFNlbGVjdCB0aGUgc21hbGxlc3QgVk1BIG9mIHRoZXNlIGV4aXN0aW5nIHNlY3Rpb25zLiAgKi8KLSAgbWF5YmVfc2V0X2dwIChhbHBoYV9saXRhX3NlY3Rpb24pOwotI2lmIDAKLSAgLyogVGhlc2Ugd2VyZSBkaXNhYmxlZCBiZWZvcmUgLS0gc2hvdWxkIHdlIHVzZSB0aGVtPyAgKi8KLSAgbWF5YmVfc2V0X2dwIChzZGF0YSk7Ci0gIG1heWJlX3NldF9ncCAobGl0OF9zZWMpOwotICBtYXliZV9zZXRfZ3AgKGxpdDRfc2VjKTsKLSNlbmRpZgotCi0vKiBAQCBXaWxsIGEgc2ltcGxlIDB4ODAwMCB3b3JrIGhlcmU/ICBJZiBub3QsIHdoeSBub3Q/ICAqLwotI2RlZmluZSBHUF9BREpVU1RNRU5UCSgweDgwMDAgLSAweDEwKQotCi0gIGFscGhhX2dwX3ZhbHVlICs9IEdQX0FESlVTVE1FTlQ7Ci0KLSAgU19TRVRfVkFMVUUgKGFscGhhX2dwX3N5bWJvbCwgYWxwaGFfZ3BfdmFsdWUpOwotCi0jaWZkZWYgREVCVUcxCi0gIHByaW50ZiAoXygiQ2hvc2UgR1AgdmFsdWUgb2YgJWx4XG4iKSwgYWxwaGFfZ3BfdmFsdWUpOwotI2VuZGlmCi19Ci0jZW5kaWYgLyogT0JKX0VDT0ZGICovCi0KLS8qIENhbGxlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSBhbGwgYWxpZ25tZW50IG5lZWRzLiAgVGhpcyB0YWtlcyBjYXJlCi0gICBvZiBlbGlkaW5nIGNhbGxzIHRvIGZyYWdfYWxpZ24gaWYnbiB0aGUgY2FjaGVkIGN1cnJlbnQgYWxpZ25tZW50Ci0gICBzYXlzIHdlJ3ZlIGFscmVhZHkgZ290IGl0LCBhcyB3ZWxsIGFzIHRha2luZyBjYXJlIG9mIHRoZSBhdXRvLWFsaWduCi0gICBmZWF0dXJlIHdydCBsYWJlbHMuICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfYWxpZ24gKG4sIHBmaWxsLCBsYWJlbCwgZm9yY2UpCi0gICAgIGludCBuOwotICAgICBjaGFyICpwZmlsbDsKLSAgICAgc3ltYm9sUyAqbGFiZWw7Ci0gICAgIGludCBmb3JjZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+PSBuKQotICAgIHJldHVybjsKLQotICBpZiAocGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA+IDIKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLQl7Ci0JICBzdGF0aWMgY2hhciBjb25zdCB1bm9wWzRdID0geyAweDAwLCAweDAwLCAweGUwLCAweDJmIH07Ci0JICBzdGF0aWMgY2hhciBjb25zdCBub3B1bm9wWzhdID0gewotCQkweDFmLCAweDA0LCAweGZmLCAweDQ3LAotCQkweDAwLCAweDAwLCAweGUwLCAweDJmCi0JICB9OwotCi0JICAvKiBGaXJzdCwgbWFrZSBzdXJlIHdlJ3JlIG9uIGEgZm91ci1ieXRlIGJvdW5kYXJ5LCBpbiBjYXNlCi0JICAgICBzb21lb25lIGhhcyBiZWVuIHB1dHRpbmcgLmJ5dGUgdmFsdWVzIGludG8gdGhlIHRleHQKLQkgICAgIHNlY3Rpb24uICBUaGUgREVDIGFzc2VtYmxlciBzaWxlbnRseSBmaWxscyB3aXRoIHVuYWxpZ25lZAotCSAgICAgbm8tb3AgaW5zdHJ1Y3Rpb25zLiAgVGhpcyB3aWxsIHplcm8tZmlsbCwgdGhlbiBub3AtZmlsbAotCSAgICAgd2l0aCBwcm9wZXIgYWxpZ25tZW50LiAgKi8KLQkgIGlmIChhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLQkgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0JICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA8IDMpCi0JICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMywgdW5vcCwgc2l6ZW9mIHVub3AsIDApOwotCSAgaWYgKG4gPiAzKQotCSAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcHVub3AsIHNpemVvZiBub3B1bm9wLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbiAobiwgMCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKLQotICBhbHBoYV9jdXJyZW50X2FsaWduID0gbjsKLQotICBpZiAobGFiZWwgIT0gTlVMTCAmJiBTX0dFVF9TRUdNRU5UIChsYWJlbCkgPT0gbm93X3NlZykKLSAgICB7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxhYmVsLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9WQUxVRSAobGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgfQotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIG4pOwotCi0gIC8qID8/PyBpZiBhbHBoYV9mbGFnX3JlbGF4ICYmIGZvcmNlICYmIGVsZiwgcmVjb3JkIHRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50Ci0gICAgIGluIGEgcmVsb2MgZm9yIHRoZSBsaW5rZXIgdG8gc2VlLiAgKi8KLX0KLQotLyogVGhlIEFscGhhIGhhcyBzdXBwb3J0IGZvciBzb21lIFZBWCBmbG9hdGluZyBwb2ludCB0eXBlcywgYXMgd2VsbCBhcyBmb3IKLSAgIElFRUUgZmxvYXRpbmcgcG9pbnQuICBXZSBjb25zaWRlciBJRUVFIHRvIGJlIHRoZSBwcmltYXJ5IGZsb2F0aW5nIHBvaW50Ci0gICBmb3JtYXQsIGFuZCBzbmVhayBpbiB0aGUgVkFYIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgaGVyZS4gICovCi0jZGVmaW5lIG1kX2F0b2YgdmF4X21kX2F0b2YKLSNpbmNsdWRlICJjb25maWcvYXRvZi12YXguYyIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYWxwaGEuaCBiL2dhcy9jb25maWcvdGMtYWxwaGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyYjA0ZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWFscGhhLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtlbiBSYWVidXJuIDxyYWVidXJuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX0FMUEhBCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBUQVJHRVRfQVJDSAkJCWJmZF9hcmNoX2FscGhhCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIJXAotCQkgICAgICAgPyAiZWNvZmYtbGl0dGxlYWxwaGEiCQkJCVwKLQkJICAgICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCVwKLQkJICAgICAgID8gImVsZjY0LWFscGhhIgkJCQkJXAotCQkgICAgICAgOiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCVwKLQkJICAgICAgID8gInZtcy1hbHBoYSIJCQkJCVwKLQkJICAgICAgIDogInVua25vd24tZm9ybWF0IikKLQotI2RlZmluZSBORUVEX0xJVEVSQUxfUE9PTAotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLSNkZWZpbmUgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLQotZXh0ZXJuIGludCBhbHBoYV9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotZXh0ZXJuIGludCBhbHBoYV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWxwaGFfZ3BybWFzaywgYWxwaGFfZnBybWFzazsKLWV4dGVybiB2YWx1ZVQgYWxwaGFfZ3BfdmFsdWU7Ci0KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQlhbHBoYV9mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVhQKQkJYWxwaGFfZml4X2FkanVzdGFibGUgKEZJWFApCi0jZGVmaW5lIFJFTE9DX1JFUVVJUkVTX1NZTUJPTAotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsCi0gICBvYmplY3QgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4KLSAgIFRydWUgaWYgd2UgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcKLSAgIHRoZSAubyBmaWxlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHBjcmVsIHJlbG9jYXRpb25zLiAgKi8KLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKQkJCQlcCi0gICgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTAkJCQkJXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KQkJCQlcCi0gICAgICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotICAgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotCi0jZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhiLHMsZikJCWFzX2ZhdGFsICgiYWxwaGEgY29udmVydF9mcmFnXG4iKQotI2RlZmluZSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheChmLHMpIFwKLQkJCShhc19mYXRhbCgiZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggY2FsbGVkIiksMSkKLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogVGhpcyBmaWVsZCBrZWVwcyB0aGUgc3ltYm9scyBwb3NpdGlvbiBpbiB0aGUgbGluayBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgdmFsdWVUCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXKEZSQUcsT0ZGLExFTixFWFApIFwKLSAgICAgIGZpeF9uZXdfZXhwIChGUkFHLCBPRkYsIChpbnQpTEVOLCBFWFAsIDAsIFwKLQlMRU4gPT0gMiA/IEJGRF9SRUxPQ18xNiBcCi0JOiBMRU4gPT0gNCA/IEJGRF9SRUxPQ18zMiBcCi0JOiBMRU4gPT0gOCA/IEJGRF9SRUxPQ182NCBcCi0JOiBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRSk7Ci0jZW5kaWYKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMJCW51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotZXh0ZXJuIGludCB0Y19nZXRfcmVnaXN0ZXIgUEFSQU1TICgoaW50IGZyYW1lKSk7Ci1leHRlcm4gdm9pZCBhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBhbHBoYV9kZWZpbmVfbGFiZWwgKHN5bSkKLWV4dGVybiB2b2lkIGFscGhhX2RlZmluZV9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgYWxwaGFfY29uc19hbGlnbiAobmJ5dGVzKQotZXh0ZXJuIHZvaWQgYWxwaGFfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLQotI2lmZGVmIE9CSl9FQ09GRgotI2RlZmluZSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCgpIGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpCi1leHRlcm4gdm9pZCBhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBESUZGX0VYUFJfT0sgICAvKiBmb28tLiBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5zZGF0YSIsICAgU0hUX1BST0dCSVRTLCAgIFNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9BTFBIQV9HUFJFTCAgfSwgXAotICB7ICIuc2JzcyIsICAgIFNIVF9OT0JJVFMsICAgICBTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfQUxQSEFfR1BSRUwgIH0sCi0jZW5kaWYKLQotLyogV2hldGhlciB0byBhZGQgc3VwcG9ydCBmb3IgZXhwbGljdCAhcmVsb2NhdGlvbl9vcCFzZXF1ZW5jZV9udW1iZXIuICBBdCB0aGUKLSAgIG1vbWVudCwgb25seSBkbyB0aGlzIGZvciBFTEYsIHRob3VnaCBFQ09GRiBjb3VsZCB1c2UgaXQgYXMgd2VsbC4gICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFJFTE9DX09QX1AKLSNlbmRpZgotCi0jaWZkZWYgUkVMT0NfT1BfUAotLyogQmVmb3JlIHRoZSByZWxvY2F0aW9ucyBhcmUgd3JpdHRlbiwgcmVvcmRlciB0aGVtLCBzbyB0aGF0IHVzZXIgc3VwcGxpZWQKLSAgICFsaXR1c2UgcmVsb2NhdGlvbnMgZm9sbG93IHRoZSBhcHByb3ByaWF0ZSAhbGl0ZXJhbCByZWxvY2F0aW9ucy4gIEFsc28KLSAgIGNvbnZlcnQgdGhlIGdhcy1pbnRlcm5hbCByZWxvY2F0aW9ucyB0byB0aGUgYXBwcm9wcmlhdGUgbGlua2VyIHJlbG9jYXRpb25zLgotICAgKi8KLSNkZWZpbmUgdGNfYWRqdXN0X3N5bXRhYigpIGFscGhhX2FkanVzdF9zeW10YWIgKCkKLWV4dGVybiB2b2lkIGFscGhhX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotCi0vKiBOZXcgZmllbGRzIGZvciBzdXBwb3J0aW5nIGV4cGxpY2l0IHJlbG9jYXRpb25zIChzdWNoIGFzICFsaXRlcmFsIHRvIG1hcmsKLSAgIHdoZXJlIGEgcG9pbnRlciBpcyBsb2FkZWQgZnJvbSB0aGUgZ2xvYmFsIHRhYmxlLCBhbmQgIWxpdHVzZV9iYXNlIHRvIHRyYWNrCi0gICBhbGwgb2YgdGhlIG5vcm1hbCB1c2VzIG9mIHRoYXQgcG9pbnRlcikuICAqLwotCi0jZGVmaW5lIFRDX0ZJWF9UWVBFIHN0cnVjdCBhbHBoYV9maXhfdGFnCi0KLXN0cnVjdCBhbHBoYV9maXhfdGFnCi17Ci0gIHN0cnVjdCBmaXggKm5leHRfbGl0dXNlOwkJLyogbmV4dCAhbGl0dXNlICovCi0gIHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqaW5mbzsJLyogb3RoZXIgbWVtYmVycyB3aXRoIHNhbWUgc2VxdWVuY2UgKi8KLX07Ci0KLS8qIEluaXRpYWxpemUgdGhlIFRDX0ZJWF9UWVBFIGZpZWxkLiAgKi8KLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShmaXhQKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGZpeFAtPnRjX2ZpeF9kYXRhLm5leHRfbGl0dXNlID0gKHN0cnVjdCBmaXggKikwOwkJCVwKLSAgZml4UC0+dGNfZml4X2RhdGEuaW5mbyA9IChzdHJ1Y3QgYWxwaGFfbGl0ZXJhbF90YWcgKikwOwkJXAotfSB3aGlsZSAoMCkKLQotLyogV29yayB3aXRoIERFQlVHNSB0byBwcmludCBmaWVsZHMgaW4gdGNfZml4X3R5cGUuICAqLwotI2RlZmluZSBUQ19GSVhfREFUQV9QUklOVChzdHJlYW0sZml4UCkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGlmIChmaXhQLT50Y19maXhfZGF0YS5pbmZvKQkJCQkJCVwKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcdGluZm8gPSAweCVseCwgbmV4dF9saXR1c2UgPSAweCVseFxuIiwgXAotCSAgICAgKGxvbmcpZml4UC0+dGNfZml4X2RhdGEuaW5mbywJCQkJXAotCSAgICAgKGxvbmcpZml4UC0+dGNfZml4X2RhdGEubmV4dF9saXR1c2UpOwkJCVwKLX0gd2hpbGUgKDApCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJjLmMgYi9nYXMvY29uZmlnL3RjLWFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFmZWEzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg0ICswLDAgQEAKLS8qIHRjLWFyYy5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIEFSQwotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FyYy5oIgotI2luY2x1ZGUgImVsZi9hcmMuaCIKLQotZXh0ZXJuIGludCBhcmNfZ2V0X21hY2ggUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBhcmNfaW5zbiBhcmNfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgoYXJjX2luc24sCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgaW50LAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICosCi0JCQkJCSAgICBvZmZzZXRULCBjaGFyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgYXJjX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGFyY19jcHUgUEFSQU1TICgoaW50KSk7Ci0vKnN0YXRpYyB2b2lkIGFyY19yZW5hbWUgUEFSQU1TICgoaW50KSk7Ki8KLXN0YXRpYyBpbnQgZ2V0X2FyY19leHBfcmVsb2NfdHlwZSBQQVJBTVMgKChpbnQsIGludCwgZXhwcmVzc2lvblMgKiwKLQkJCQkJICAgZXhwcmVzc2lvblMgKikpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDAgfSwJLyogRGVmYXVsdGluZyBpcyBpbnZhbGlkICgwKSAqLwotICB7ICJjb21tb24iLCBhcmNfY29tbW9uLCAwIH0sCi0vKnsgImh3b3JkIiwgY29ucywgMiB9LCAtIGFscmVhZHkgZXhpc3RzICovCi0gIHsgIndvcmQiLCBjb25zLCA0IH0sCi0vKnsgInh3b3JkIiwgY29ucywgOCB9LCovCi0gIHsgImNwdSIsIGFyY19jcHUsIDAgfSwKLS8qeyAicmVuYW1lIiwgYXJjX3JlbmFtZSwgMCB9LCovCi0gIHsgTlVMTCwgMCwgMCB9LAotfTsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiM7IjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cwotICAgd29yayBpZiAnLycgaXNuJ3Qgb3RoZXJ3aXNlIGRlZmluZWQuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREIjsKLQotLyogQnl0ZSBvcmRlci4gICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotY29uc3QgY2hhciAqYXJjX3RhcmdldF9mb3JtYXQgPSBERUZBVUxUX1RBUkdFVF9GT1JNQVQ7Ci1zdGF0aWMgaW50IGJ5dGVfb3JkZXIgPSBERUZBVUxUX0JZVEVfT1JERVI7Ci0KLS8qIE9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LiAgKi8KLXN0YXRpYyBpbnQgYXJjX21hY2hfdHlwZSA9IGJmZF9tYWNoX2FyY19iYXNlOwotCi0vKiBOb24temVybyBpZiB0aGUgY3B1IHR5cGUgaGFzIGJlZW4gZXhwbGljaXRseSBzcGVjaWZpZWQuICAqLwotc3RhdGljIGludCBtYWNoX3R5cGVfc3BlY2lmaWVkX3AgPSAwOwotCi0vKiBOb24temVybyBpZiBvcGNvZGUgdGFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgIEEgLmNwdSBjb21tYW5kIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0YXRpYyBpbnQgY3B1X3RhYmxlc19pbml0X3AgPSAwOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYXJjX3N1ZmZpeF9oYXNoID0gTlVMTDsKLQwKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSNkZWZpbmUgT1BUSU9OX0VCIChPUFRJT05fTURfQkFTRSArIDApCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSNkZWZpbmUgT1BUSU9OX0VMIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMCB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotLyoKLSAqIG1kX3BhcnNlX29wdGlvbgotICoKLSAqIEludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gKiBTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uCi0gKi8KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9FQjoKLSAgICAgIGJ5dGVfb3JkZXIgPSBCSUdfRU5ESUFOOwotICAgICAgYXJjX3RhcmdldF9mb3JtYXQgPSAiZWxmMzItYmlnYXJjIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VMOgotICAgICAgYnl0ZV9vcmRlciA9IExJVFRMRV9FTkRJQU47Ci0gICAgICBhcmNfdGFyZ2V0X2Zvcm1hdCA9ICJlbGYzMi1saXR0bGVhcmMiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLUFSQyBvcHRpb25zOlxuXAotLUVCCQkJZ2VuZXJhdGUgYmlnIGVuZGlhbiBvdXRwdXRcblwKLS1FTAkJCWdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG4iKSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLgotICAgT3Bjb2RlIHNlbGVjdGlvbiBpcyBkZWZlcmVkIHVudGlsIGxhdGVyIGJlY2F1c2Ugd2UgbWlnaHQgc2VlIGEgLmNwdQotICAgY29tbWFuZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIC8qIFRoZSBlbmRpYW5uZXNzIGNhbiBiZSBjaG9zZW4gImF0IHRoZSBmYWN0b3J5Ii4gICovCi0gIHRhcmdldF9iaWdfZW5kaWFuID0gYnl0ZV9vcmRlciA9PSBCSUdfRU5ESUFOOwotCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfYXJjLCBhcmNfbWFjaF90eXBlKSkKLSAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICAvKiBBc3N1bWUgdGhlIGJhc2UgY3B1LiAgVGhpcyBjYWxsIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG5lZWQgdG8KLSAgICAgaW5pdGlhbGl6ZSBgYXJjX29wZXJhbmRfbWFwJyB3aGljaCBtYXkgYmUgbmVlZGVkIGJlZm9yZSB3ZSBzZWUgdGhlCi0gICAgIGZpcnN0IGluc24uICAqLwotICBhcmNfb3Bjb2RlX2luaXRfdGFibGVzIChhcmNfZ2V0X29wY29kZV9tYWNoIChiZmRfbWFjaF9hcmNfYmFzZSwKLQkJCQkJICAgICAgIHRhcmdldF9iaWdfZW5kaWFuKSk7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgb3Bjb2RlIGFuZCBvcGVyYW5kIHRhYmxlcy4KLSAgIE1BQ0ggaXMgb25lIG9mIGJmZF9tYWNoX2FyY194eHguICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF9vcGNvZGVfdGFibGVzIChtYWNoKQotICAgICBpbnQgbWFjaDsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0gIGNoYXIgKmxhc3Q7Ci0KLSAgaWYgKChhcmNfc3VmZml4X2hhc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIikpOwotCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfYXJjLCBtYWNoKSkKLSAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICAvKiBUaGlzIGluaXRpYWxpemVzIGEgZmV3IHRoaW5ncyBpbiBhcmMtb3BjLmMgdGhhdCB3ZSBuZWVkLgotICAgICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdmFyaW91cyBhcmNfeHh4X3N1cHBvcnRlZCBmbnMuICAqLwotICBhcmNfb3Bjb2RlX2luaXRfdGFibGVzIChhcmNfZ2V0X29wY29kZV9tYWNoIChtYWNoLCB0YXJnZXRfYmlnX2VuZGlhbikpOwotCi0gIC8qIE9ubHkgcHV0IHRoZSBmaXJzdCBlbnRyeSBvZiBlYWNoIGVxdWl2YWxlbnRseSBuYW1lZCBzdWZmaXggaW4gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgbGFzdCA9ICIiOwotICBmb3IgKGkgPSAwOyBpIDwgYXJjX3N1ZmZpeGVzX2NvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKCEgYXJjX29wdmFsX3N1cHBvcnRlZCAoJmFyY19zdWZmaXhlc1tpXSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoc3RyY21wIChhcmNfc3VmZml4ZXNbaV0ubmFtZSwgbGFzdCkgIT0gMCkKLQloYXNoX2luc2VydCAoYXJjX3N1ZmZpeF9oYXNoLCBhcmNfc3VmZml4ZXNbaV0ubmFtZSwgKFBUUikgKGFyY19zdWZmaXhlcyArIGkpKTsKLSAgICAgIGxhc3QgPSBhcmNfc3VmZml4ZXNbaV0ubmFtZTsKLSAgICB9Ci0KLSAgLyogU2luY2UgcmVnaXN0ZXJzIGRvbid0IGhhdmUgYSBwcmVmaXgsIHdlIHB1dCB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUgc28KLSAgICAgdGhleSBjYW4ndCBiZSB1c2VkIGFzIHN5bWJvbHMuICBUaGlzIGFsc28gc2ltcGxpZmllcyBhcmd1bWVudCBwYXJzaW5nIGFzCi0gICAgIHdlIGNhbiBsZXQgZ2FzIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuICBUaGUgcmVjb3JkZWQgcmVnaXN0ZXIgbnVtYmVyIGlzCi0gICAgIHRoZSBpbmRleCBpbiBgYXJjX3JlZ19uYW1lcycuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgYXJjX3JlZ19uYW1lc19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFyY19vcHZhbF9zdXBwb3J0ZWQgKCZhcmNfcmVnX25hbWVzW2ldKSkKLQljb250aW51ZTsKLSAgICAgIC8qIFVzZSBzeW1ib2xfY3JlYXRlIGhlcmUgaW5zdGVhZCBvZiBzeW1ib2xfbmV3IHNvIHdlIGRvbid0IHRyeSB0bwotCSBvdXRwdXQgcmVnaXN0ZXJzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKGFyY19yZWdfbmFtZXNbaV0ubmFtZSwgcmVnX3NlY3Rpb24sCi0JCQkJCSAgaSwgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gICAgfQotCi0gIC8qIFRlbGwgYHNfY3B1JyBpdCdzIHRvbyBsYXRlLiAgKi8KLSAgY3B1X3RhYmxlc19pbml0X3AgPSAxOwotfQotDAotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4KLSAgIElmIFJFRyBpcyBub24tTlVMTCwgaXQgaXMgYSByZWdpc3RlciBudW1iZXIgYW5kIGlnbm9yZSBWQUwuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWFyY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWwsIGZpbGUsIGxpbmUpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci17Ci0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05PUFQpICE9IDApCi0JICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIGVsc2UKLQkgICAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgbWluID0gMDsKLQl9Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9ORUdBVElWRSkgIT0gMCkKLQl0ZXN0ID0gLSB2YWw7Ci0gICAgICBlbHNlCi0JdGVzdCA9IHZhbDsKLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotCXsKLQkgIGNvbnN0IGNoYXIgKmVyciA9Ci0JICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLQkgIGNoYXIgYnVmWzEwMF07Ci0KLQkgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKLQkgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JICAgIGFzX3dhcm4gKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICBlbHNlCi0JICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgZXJybXNnID0gTlVMTDsKLSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgKGxvbmcpIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JYXNfd2FybiAoZXJybXNnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBpbnNuIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCSAgICAgPDwgb3BlcmFuZC0+c2hpZnQpOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFdlIGNhbid0IHNpbXBseSBnZW5lcmF0ZSB0aGVtIGFzCi0gICB3ZSBnbywgYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgdXMgdG8gZmlyc3QgY3JlYXRlIHRoZSBmcmFnLCBhbmQKLSAgIHRoYXQgd291bGQgc2NyZXcgdXAgcmVmZXJlbmNlcyB0byBgYC4nJy4gICovCi0KLXN0cnVjdCBhcmNfZml4dXAKLXsKLSAgLyogaW5kZXggaW50byBgYXJjX29wZXJhbmRzJyAqLwotICBpbnQgb3BpbmRleDsKLSAgZXhwcmVzc2lvblMgZXhwOwotfTsKLQotI2RlZmluZSBNQVhfRklYVVBTIDUKLQotI2RlZmluZSBNQVhfU1VGRklYRVMgNQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKm9wY29kZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGFyY19pbnNuIGluc247Ci0gIHN0YXRpYyBpbnQgaW5pdF90YWJsZXNfcCA9IDA7Ci0KLSAgLyogT3Bjb2RlIHRhYmxlIGluaXRpYWxpemF0aW9uIGlzIGRlZmVycmVkIHVudGlsIGhlcmUgYmVjYXVzZSB3ZSBoYXZlIHRvCi0gICAgIHdhaXQgZm9yIGEgcG9zc2libGUgLmNwdSBjb21tYW5kLiAgKi8KLSAgaWYgKCFpbml0X3RhYmxlc19wKQotICAgIHsKLSAgICAgIGluaXRfb3Bjb2RlX3RhYmxlcyAoYXJjX21hY2hfdHlwZSk7Ci0gICAgICBpbml0X3RhYmxlc19wID0gMTsKLSAgICB9Ci0KLSAgLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgIHN0cisrOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBsaXN0cyBoYXNoZWQgYnkgdGhlIGZpcnN0IGxldHRlciAodGhvdWdoCi0gICAgIHdlIG5lZWRuJ3QgY2FyZSBob3cgdGhleSdyZSBoYXNoZWQpLiAgR2V0IHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4gICovCi0KLSAgb3Bjb2RlID0gYXJjX29wY29kZV9sb29rdXBfYXNtIChzdHIpOwotCi0gIC8qIEtlZXAgbG9va2luZyB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guICAqLwotCi0gIHN0YXJ0ID0gc3RyOwotICBmb3IgKCA7IG9wY29kZSAhPSBOVUxMOyBvcGNvZGUgPSBBUkNfT1BDT0RFX05FWFRfQVNNIChvcGNvZGUpKQotICAgIHsKLSAgICAgIGludCBwYXN0X29wY29kZV9wLCBmYywgbnVtX3N1ZmZpeGVzOwotICAgICAgY2hhciAqc3luOwotICAgICAgc3RydWN0IGFyY19maXh1cCBmaXh1cHNbTUFYX0ZJWFVQU107Ci0gICAgICAvKiBVc2VkIGFzIGEgc2FuaXR5IGNoZWNrLiAgSWYgd2UgbmVlZCBhIGxpbW0gcmVsb2MsIG1ha2Ugc3VyZSB3ZSBhc2sKLQkgZm9yIGFuIGV4dHJhIDQgYnl0ZXMgZnJvbSBmcmFnX21vcmUuICAqLwotICAgICAgaW50IGxpbW1fcmVsb2NfcDsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqaW5zbl9zdWZmaXhlc1tNQVhfU1VGRklYRVNdOwotCi0gICAgICAvKiBJcyB0aGlzIG9wY29kZSBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGNwdT8gICovCi0gICAgICBpZiAoISBhcmNfb3Bjb2RlX3N1cHBvcnRlZCAob3Bjb2RlKSkKLQljb250aW51ZTsKLQotICAgICAgLyogU2NhbiB0aGUgc3ludGF4IHN0cmluZy4gIElmIGl0IGRvZXNuJ3QgbWF0Y2gsIHRyeSB0aGUgbmV4dCBvbmUuICAqLwotCi0gICAgICBhcmNfb3Bjb2RlX2luaXRfaW5zZXJ0ICgpOwotICAgICAgaW5zbiA9IG9wY29kZS0+dmFsdWU7Ci0gICAgICBmYyA9IDA7Ci0gICAgICBwYXN0X29wY29kZV9wID0gMDsKLSAgICAgIG51bV9zdWZmaXhlcyA9IDA7Ci0gICAgICBsaW1tX3JlbG9jX3AgPSAwOwotCi0gICAgICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLQkgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgICAgIGZvciAoc3RyID0gc3RhcnQsIHN5biA9IG9wY29kZS0+c3ludGF4OyAqc3luICE9ICdcMCc7ICkKLQl7Ci0JICBpbnQgbW9kczsKLQkgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLQotCSAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLQkgIGlmICgqc3luICE9ICclJyB8fCAqKytzeW4gPT0gJyUnKQotCSAgICB7Ci0JICAgICAgLyogSGFuZGxlICcrJyBzcGVjaWFsbHkgYXMgd2Ugd2FudCB0byBhbGxvdyAibGQgcjAsW3NwLTRdIi4gICovCi0JICAgICAgLyogPz8/IFRoZSBzeW50YXggaGFzIGNoYW5nZWQgdG8gW3NwLC00XS4gICovCi0JICAgICAgaWYgKDAgJiYgKnN5biA9PSAnKycgJiYgKnN0ciA9PSAnLScpCi0JCXsKLQkJICAvKiBTa2lwIG92ZXIgc3luJ3MgKywgYnV0IGxlYXZlIHN0cidzIC0gYWxvbmUuCi0JCSAgICAgVGhhdCBtYWtlcyB0aGUgY2FzZSBpZGVudGljYWwgdG8gImxkIHIwLFtzcCstNF0iLiAgKi8KLQkJICArK3N5bjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCpzdHIgPT0gKnN5bikKLQkJewotCQkgIGlmICgqc3luID09ICcgJykKLQkJICAgIHBhc3Rfb3Bjb2RlX3AgPSAxOwotCQkgICsrc3luOwotCQkgICsrc3RyOwotCQl9Ci0JICAgICAgZWxzZQotCQlicmVhazsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICBQaWNrIG91dCBhbnkgbW9kaWZpZXJzLiAgKi8KLQkgIG1vZHMgPSAwOwotCSAgd2hpbGUgKEFSQ19NT0RfUCAoYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFsqc3luXV0uZmxhZ3MpKQotCSAgICB7Ci0JICAgICAgbW9kcyB8PSBhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwWypzeW5dXS5mbGFncyAmIEFSQ19NT0RfQklUUzsKLQkgICAgICArK3N5bjsKLQkgICAgfQotCSAgb3BlcmFuZCA9IGFyY19vcGVyYW5kcyArIGFyY19vcGVyYW5kX21hcFsqc3luXTsKLQkgIGlmIChvcGVyYW5kLT5mbXQgPT0gMCkKLQkgICAgYXNfZmF0YWwgKF8oInVua25vd24gc3ludGF4IGZvcm1hdCBjaGFyYWN0ZXIgYCVjJyIpLCAqc3luKTsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfRkFLRSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0JICAgICAgaWYgKG9wZXJhbmQtPmluc2VydCkKLQkJewotCQkgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIG9wZXJhbmQsIG1vZHMsIE5VTEwsIDAsICZlcnJtc2cpOwotCQkgIC8qIElmIHdlIGdldCBhbiBlcnJvciwgZ28gb24gdG8gdHJ5IHRoZSBuZXh0IGluc24uICAqLwotCQkgIGlmIChlcnJtc2cpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgICsrc3luOwotCSAgICB9Ci0JICAvKiBBcmUgd2UgZmluaXNoZWQgd2l0aCBzdWZmaXhlcz8gICovCi0JICBlbHNlIGlmICghcGFzdF9vcGNvZGVfcCkKLQkgICAgewotCSAgICAgIGludCBmb3VuZDsKLQkgICAgICBjaGFyIGM7Ci0JICAgICAgY2hhciAqcywqdDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnN1Ziwqc3VmZml4LCpzdWZmaXhfZW5kOwotCi0JICAgICAgaWYgKCEob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TVUZGSVgpKQotCQlhYm9ydCAoKTsKLQotCSAgICAgIC8qIElmIHdlJ3JlIGF0IGEgc3BhY2UgaW4gdGhlIGlucHV0IHN0cmluZywgd2Ugd2FudCB0byBza2lwIHRoZQotCQkgcmVtYWluaW5nIHN1ZmZpeGVzLiAgVGhlcmUgbWF5IGJlIHNvbWUgZmFrZSBvbmVzIHRob3VnaCwgc28KLQkJIGp1c3QgZ28gb24gdG8gdHJ5IHRoZSBuZXh0IG9uZS4gICovCi0JICAgICAgaWYgKCpzdHIgPT0gJyAnKQotCQl7Ci0JCSAgKytzeW47Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIHMgPSBzdHI7Ci0JICAgICAgaWYgKG1vZHMgJiBBUkNfTU9EX0RPVCkKLQkJewotCQkgIGlmICgqcyAhPSAnLicpCi0JCSAgICBicmVhazsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGNhbiBoYXBwZW4gaW4gImIubmQgZm9vIiBhbmQgd2UncmUgY3VycmVudGx5IGxvb2tpbmcKLQkJICAgICBmb3IgIiVxIiAoaWU6IGEgY29uZGl0aW9uIGNvZGUgc3VmZml4KS4gICovCi0JCSAgaWYgKCpzID09ICcuJykKLQkJICAgIHsKLQkJICAgICAgKytzeW47Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBQaWNrIHRoZSBzdWZmaXggb3V0IGFuZCBsb29rIGl0IHVwIHZpYSB0aGUgaGFzaCB0YWJsZS4gICovCi0JICAgICAgZm9yICh0ID0gczsgKnQgJiYgaXNhbHBoYSAoKnQpOyArK3QpCi0JCWNvbnRpbnVlOwotCSAgICAgIGMgPSAqdDsKLQkgICAgICAqdCA9ICdcMCc7Ci0JICAgICAgc3VmID0gaGFzaF9maW5kIChhcmNfc3VmZml4X2hhc2gsIHMpOwotCSAgICAgICp0ID0gYzsKLQkgICAgICBpZiAoIXN1ZikKLQkJewotCQkgIC8qIFRoaXMgY2FuIGhhcHBlbiBpbiAiYmxsZSBmb28iIGFuZCB3ZSdyZSBjdXJyZW50bHkgdXNpbmcKLQkJICAgICB0aGUgdGVtcGxhdGUgImIlcSUubiAlaiIuICBUaGUgImJsIiBpbnNuIG9jY3VycyBsYXRlciBpbgotCQkgICAgIHRoZSB0YWJsZSBzbyAibGxlIiBpc24ndCBhbiBpbGxlZ2FsIHN1ZmZpeC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIElzIGl0IHRoZSByaWdodCB0eXBlPyAgTm90ZSB0aGF0IHRoZSBzYW1lIGNoYXJhY3RlciBpcyB1c2VkCi0JICAgICAgICAgc2V2ZXJhbCB0aW1lcywgc28gd2UgaGF2ZSB0byBleGFtaW5lIGFsbCBvZiB0aGVtLiAgVGhpcyBpcwotCQkgcmVsYXRpdmVseSBlZmZpY2llbnQgYXMgZXF1aXZhbGVudCBlbnRyaWVzIGFyZSBrZXB0Ci0JCSB0b2dldGhlci4gIElmIGl0J3Mgbm90IHRoZSByaWdodCB0eXBlLCBkb24ndCBpbmNyZW1lbnQgYHN0cicKLQkJIHNvIHdlIHRyeSB0aGUgbmV4dCBvbmUgaW4gdGhlIHNlcmllcy4gICovCi0JICAgICAgZm91bmQgPSAwOwotCSAgICAgIHN1ZmZpeF9lbmQgPSBhcmNfc3VmZml4ZXMgKyBhcmNfc3VmZml4ZXNfY291bnQ7Ci0JICAgICAgZm9yIChzdWZmaXggPSBzdWY7Ci0JCSAgIHN1ZmZpeCA8IHN1ZmZpeF9lbmQgJiYgc3RyY21wIChzdWZmaXgtPm5hbWUsIHN1Zi0+bmFtZSkgPT0gMDsKLQkJICAgKytzdWZmaXgpCi0JCXsKLQkJICBpZiAoYXJjX29wZXJhbmRzW3N1ZmZpeC0+dHlwZV0uZm10ID09ICpzeW4pCi0JCSAgICB7Ci0JCSAgICAgIC8qIEluc2VydCB0aGUgc3VmZml4J3MgdmFsdWUgaW50byB0aGUgaW5zbi4gICovCi0JCSAgICAgIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0JCQlpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLAotCQkJCQkJICAgbW9kcywgTlVMTCwgc3VmZml4LT52YWx1ZSwKLQkJCQkJCSAgIE5VTEwpOwotCQkgICAgICBlbHNlCi0JCQlpbnNuIHw9IHN1ZmZpeC0+dmFsdWUgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0KLQkJICAgICAgc3RyID0gdDsKLQkJICAgICAgZm91bmQgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgICsrc3luOwotCSAgICAgIGlmICghZm91bmQpCi0JCTsgLyogV3JvbmcgdHlwZS4gIEp1c3QgZ28gb24gdG8gdHJ5IG5leHQgaW5zbiBlbnRyeS4gICovCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG51bV9zdWZmaXhlcyA9PSBNQVhfU1VGRklYRVMpCi0JCSAgICBhc19iYWQgKF8oInRvbyBtYW55IHN1ZmZpeGVzIikpOwotCQkgIGVsc2UKLQkJICAgIGluc25fc3VmZml4ZXNbbnVtX3N1ZmZpeGVzKytdID0gc3VmZml4OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgLyogVGhpcyBpcyBlaXRoZXIgYSByZWdpc3RlciBvciBhbiBleHByZXNzaW9uIG9mIHNvbWUga2luZC4gICovCi0JICAgIHsKLQkgICAgICBjaGFyIGM7Ci0JICAgICAgY2hhciAqaG9sZDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IE5VTEw7Ci0JICAgICAgbG9uZyB2YWx1ZSA9IDA7Ci0JICAgICAgZXhwcmVzc2lvblMgZXhwOwotCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKQotCQlhYm9ydCAoKTsKLQotCSAgICAgIC8qIElzIHRoZXJlIGFueXRoaW5nIGxlZnQgdG8gcGFyc2U/Ci0JCSBXZSBkb24ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgdG9wIGJlY2F1c2Ugd2Ugd2FudCB0byBwYXJzZQotCQkgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLQkgICAgICBpZiAoKnN0ciA9PSAnXDAnKQotCQlicmVhazsKLSNpZiAwCi0JICAgICAgLyogSXMgdGhpcyBhIHN5bnRheCBjaGFyYWN0ZXI/ICBFZzogaXMgdGhlcmUgYSAnWycgcHJlc2VudCB3aGVuCi0JCSB0aGVyZSBzaG91bGRuJ3QgYmU/ICAqLwotCSAgICAgIGlmICghaXNhbG51bSAoKnN0cikKLQkJICAvKiAnLicgYXMgaW4gIi5MTEMwIiAqLwotCQkgICYmICpzdHIgIT0gJy4nCi0JCSAgLyogJ18nIGFzIGluICJfcHJpbnQiICovCi0JCSAgJiYgKnN0ciAhPSAnXycKLQkJICAvKiAnLScgYXMgaW4gIltmcCwtNF0iICovCi0JCSAgJiYgKnN0ciAhPSAnLScKLQkJICAvKiAnJScgYXMgaW4gIiVpYShfZnVuYykiICovCi0JCSAgJiYgKnN0ciAhPSAnJScpCi0JCWJyZWFrOwotI2VuZGlmCi0KLQkgICAgICAvKiBQYXJzZSB0aGUgb3BlcmFuZC4gICovCi0JICAgICAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0JICAgICAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgICAgICBpZiAoZXhwLlhfb3AgPT0gT19pbGxlZ2FsKQotCQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLQkgICAgICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKLQkJYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0JICAgICAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIHZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGV4cC5YX29wID09IE9fcmVnaXN0ZXIpCi0JCXsKLQkJICByZWcgPSBhcmNfcmVnX25hbWVzICsgZXhwLlhfYWRkX251bWJlcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkJICBpZiAoZmMgPj0gTUFYX0ZJWFVQUykKLQkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JCSAgZml4dXBzW2ZjXS5leHAgPSBleHA7Ci0KLQkJICAvKiBJZiB0aGlzIGlzIGEgcmVnaXN0ZXIgY29uc3RhbnQgKElFOiBvbmUgd2hvc2UKLQkJICAgICByZWdpc3RlciB2YWx1ZSBnZXRzIHN0b3JlZCBhcyA2MS02MykgdGhlbiB0aGlzCi0JCSAgICAgbXVzdCBiZSBhIGxpbW0uICBXZSBkb24ndCBzdXBwb3J0IHNoaW1tIHJlbG9jcy4gICovCi0JCSAgLyogPz8/IFRoaXMgYml0IGNvdWxkIHVzZSBzb21lIGNsZWFuaW5nIHVwLgotCQkgICAgIFJlZmVyZW5jaW5nIHRoZSBmb3JtYXQgY2hhcnMgbGlrZSB0aGlzIGdvZXMKLQkJICAgICBhZ2FpbnN0IHN0eWxlLiAgKi8KLSNkZWZpbmUgSVNfUkVHX09QRVJBTkQobykgKChvKSA9PSAnYScgfHwgKG8pID09ICdiJyB8fCAobykgPT0gJ2MnKQotCQkgIGlmIChJU19SRUdfT1BFUkFORCAoKnN5bikpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmp1bms7Ci0KLQkJICAgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gYXJjX29wZXJhbmRfbWFwWydMJ107Ci0JCSAgICAgIGxpbW1fcmVsb2NfcCA9IDE7Ci0JCSAgICAgIC8qIFRlbGwgaW5zZXJ0X3JlZyB3ZSBuZWVkIGEgbGltbS4gIFRoaXMgaXMKLQkJCSBuZWVkZWQgYmVjYXVzZSB0aGUgdmFsdWUgYXQgdGhpcyBwb2ludCBpcwotCQkJIHplcm8sIGEgc2hpbW0uICAqLwotCQkgICAgICAvKiA/Pz8gV2UgbmVlZCBhIGNsZWFuZXIgaW50ZXJmYWNlIHRoYW4gdGhpcy4gICovCi0JCSAgICAgICgqYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFsnUSddXS5pbnNlcnQpCi0JCQkoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCAwTCwgJmp1bmspOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGZpeHVwc1tmY10ub3BpbmRleCA9IGFyY19vcGVyYW5kX21hcFsqc3luXTsKLQkJICArK2ZjOwotCQkgIHZhbHVlID0gMDsKLQkJfQotCi0JICAgICAgLyogSW5zZXJ0IHRoZSByZWdpc3RlciBvciBleHByZXNzaW9uIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotCQl7Ci0JCSAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKLQkJICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLCBtb2RzLAotCQkJCQkgICAgIHJlZywgKGxvbmcpIHZhbHVlLCAmZXJybXNnKTsKLSNpZiAwCi0JCSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCQkgICAgYXNfd2FybiAoZXJybXNnKTsKLSNlbmRpZgotCQkgIC8qIEZJWE1FOiBXZSB3YW50IHRvIHRyeSBzaGltbSBpbnNucyBmb3IgbGltbSBvbmVzLiAgQnV0IGlmCi0JCSAgICAgdGhlIGNvbnN0YW50IHdvbid0IGZpdCwgd2UgbXVzdCBnbyBvbiB0byB0cnkgdGhlIG5leHQKLQkJICAgICBwb3NzaWJpbGl0eS4gIFdoZXJlIGRvIHdlIGlzc3VlIHdhcm5pbmdzIGZvciBjb25zdGFudHMKLQkJICAgICB0aGF0IGFyZSB0b28gYmlnIHRoZW4/ICBBdCBwcmVzZW50LCB3ZSdsbCBmbGFnIHRoZSBpbnNuCi0JCSAgICAgYXMgdW5yZWNvZ25pemFibGUhICBNYXliZSBoYXZlIHRoZSAiYmFkIGluc3RydWN0aW9uIgotCQkgICAgIGVycm9yIG1lc3NhZ2UgaW5jbHVkZSBvdXIgYGVycm1zZyc/ICAqLwotCQkgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZQotCQlpbnNuIHw9ICh2YWx1ZSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLQotCSAgICAgICsrc3luOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW50YXggc3RyaW5nLCB3ZSdyZSBkb25lLiAgKi8KLSAgICAgIC8qIEZJWE1FOiB0cnkgdG8gbW92ZSB0aGlzIHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKCpzeW4gPT0gJ1wwJykKLQl7Ci0JICBpbnQgaTsKLQkgIGNoYXIgKmY7Ci0JICBsb25nIGxpbW0sIGxpbW1fcDsKLQotCSAgLyogRm9yIHRoZSBtb21lbnQgd2UgYXNzdW1lIGEgdmFsaWQgYHN0cicgY2FuIG9ubHkgY29udGFpbiBibGFua3MKLQkgICAgIG5vdy4gIElFOiBXZSBuZWVkbid0IHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHZlcnNpb24gb2YgdGhlCi0JICAgICBpbnNuIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgbG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIGFwcGVhcgotCSAgICAgYmVmb3JlIHNob3J0ZXIgb25lcyAoZWc6IGxzciByMixyMywxIHZzIGxzciByMixyMykuICAqLwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0JICAgICsrc3RyOwotCi0JICBpZiAoKnN0ciAhPSAnXDAnKQotCSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotCSAgLyogSXMgdGhlcmUgYSBsaW1tIHZhbHVlPyAgKi8KLQkgIGxpbW1fcCA9IGFyY19vcGNvZGVfbGltbV9wICgmbGltbSk7Ci0KLQkgIC8qIFBlcmZvcm0gdmFyaW91cyBlcnJvciBhbmQgd2FybmluZyB0ZXN0cy4gICovCi0KLQkgIHsKLQkgICAgc3RhdGljIGludCBpbl9kZWxheV9zbG90X3AgPSAwOwotCSAgICBzdGF0aWMgaW50IHByZXZfaW5zbl9uZWVkc19jY19ub3BfcCA9IDA7Ci0JICAgIC8qIGRlbGF5IHNsb3QgdHlwZSBzZWVuICovCi0JICAgIGludCBkZWxheV9zbG90X3R5cGUgPSBBUkNfREVMQVlfTk9ORTsKLQkgICAgLyogY29uZGl0aW9uYWwgZXhlY3V0aW9uIGZsYWcgc2VlbiAqLwotCSAgICBpbnQgY29uZGl0aW9uYWwgPSAwOwotCSAgICAvKiAxIGlmIGNvbmRpdGlvbiBjb2RlcyBhcmUgYmVpbmcgc2V0ICovCi0JICAgIGludCBjY19zZXRfcCA9IDA7Ci0JICAgIC8qIDEgaWYgY29uZGl0aW9uYWwgYnJhbmNoLCBpbmNsdWRpbmcgYGInICJicmFuY2ggYWx3YXlzIiAqLwotCSAgICBpbnQgY29uZF9icmFuY2hfcCA9IG9wY29kZS0+ZmxhZ3MgJiBBUkNfT1BDT0RFX0NPTkRfQlJBTkNIOwotCSAgICBpbnQgbmVlZF9jY19ub3BfcCA9IDA7Ci0KLQkgICAgZm9yIChpID0gMDsgaSA8IG51bV9zdWZmaXhlczsgKytpKQotCSAgICAgIHsKLQkJc3dpdGNoIChhcmNfb3BlcmFuZHNbaW5zbl9zdWZmaXhlc1tpXS0+dHlwZV0uZm10KQotCQkgIHsKLQkJICBjYXNlICduJyA6Ci0JCSAgICBkZWxheV9zbG90X3R5cGUgPSBpbnNuX3N1ZmZpeGVzW2ldLT52YWx1ZTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJ3EnIDoKLQkJICAgIGNvbmRpdGlvbmFsID0gaW5zbl9zdWZmaXhlc1tpXS0+dmFsdWU7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdmJyA6Ci0JCSAgICBjY19zZXRfcCA9IDE7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIC8qIFB1dHRpbmcgYW4gaW5zbiB3aXRoIGEgbGltbSB2YWx1ZSBpbiBhIGRlbGF5IHNsb3QgaXMgc3VwcG9zZWQgdG8KLQkgICAgICAgYmUgbGVnYWwsIGJ1dCBsZXQncyB3YXJuIHRoZSB1c2VyIGFueXdheS4gIERpdHRvIGZvciA4IGJ5dGUKLQkgICAgICAganVtcHMgd2l0aCBkZWxheSBzbG90cy4gICovCi0JICAgIGlmIChpbl9kZWxheV9zbG90X3AgJiYgbGltbV9wKQotCSAgICAgIGFzX3dhcm4gKF8oIjggYnl0ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IikpOwotCSAgICBpZiAoZGVsYXlfc2xvdF90eXBlICE9IEFSQ19ERUxBWV9OT05FICYmIGxpbW1fcCkKLQkgICAgICBhc193YXJuIChfKCI4IGJ5dGUganVtcCBpbnN0cnVjdGlvbiB3aXRoIGRlbGF5IHNsb3QiKSk7Ci0JICAgIGluX2RlbGF5X3Nsb3RfcCA9IChkZWxheV9zbG90X3R5cGUgIT0gQVJDX0RFTEFZX05PTkUpICYmICFsaW1tX3A7Ci0KLQkgICAgLyogV2FybiB3aGVuIGEgY29uZGl0aW9uYWwgYnJhbmNoIGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBzZXQgb2YKLQkgICAgICAgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gIE5vdGUgdGhhdCB0aGlzIG5lZWRuJ3QgYmUgZG9uZSBpZiB0aGUKLQkgICAgICAgaW5zbiB0aGF0IHNldHMgdGhlIGNvbmRpdGlvbiBjb2RlcyB1c2VzIGEgbGltbS4gICovCi0JICAgIGlmIChjb25kX2JyYW5jaF9wICYmIGNvbmRpdGlvbmFsICE9IDAgLyogMCA9ICJhbHdheXMiICovCi0JCSYmIHByZXZfaW5zbl9uZWVkc19jY19ub3BfcCkKLQkgICAgICBhc193YXJuIChfKCJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiKSk7Ci0JICAgIHByZXZfaW5zbl9uZWVkc19jY19ub3BfcCA9IGNjX3NldF9wICYmICFsaW1tX3A7Ci0JICB9Ci0KLQkgIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uCi0JICAgICBJdCBpcyBpbXBvcnRhbnQgdG8gZmV0Y2ggZW5vdWdoIHNwYWNlIGluIG9uZSBjYWxsIHRvIGBmcmFnX21vcmUnLgotCSAgICAgV2UgdXNlIChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpIHRvIGNvbXB1dGUgd2hlcmUgd2UgYXJlIGFuZCB3ZQotCSAgICAgZG9uJ3Qgd2FudCBmcmFnX25vdyB0byBjaGFuZ2UgYmV0d2VlbiBjYWxscy4gICovCi0JICBpZiAobGltbV9wKQotCSAgICB7Ci0JICAgICAgZiA9IGZyYWdfbW9yZSAoOCk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYgKyA0LCBsaW1tLCA0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAobGltbV9yZWxvY19wKQotCSAgICB7Ci0JICAgICAgLyogV2UgbmVlZCBhIGxpbW0gcmVsb2MsIGJ1dCB0aGUgdGFibGVzIHRoaW5rIHdlIGRvbid0LiAgKi8KLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLQkgICAgfQotCi0JICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgZmM7ICsraSkKLQkgICAgewotCSAgICAgIGludCBvcF90eXBlLCByZWxvY190eXBlOwotCSAgICAgIGV4cHJlc3Npb25TIGV4cHRtcDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhpcyBvcGVyYW5kLgotCQkgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZvcgotCQkgb3BlcmFuZHMgcmVzaWRpbmcgaW4gdGhlIGluc24sIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotCQkgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkgaGFuZGxlIGZpeHVwcyBmb3IgYW55Ci0JCSBvcGVyYW5kIHR5cGUsIGFsdGhvdWdoIHRoYXQgaXMgYWRtaXR0ZWRseSBub3QgYSB2ZXJ5IGV4Y2l0aW5nCi0JCSBmZWF0dXJlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluIG1kX2FwcGx5X2ZpeC4KLQotCQkgTGltbSB2YWx1ZXMgKDQgYnl0ZSBpbW1lZGlhdGUgImNvbnN0YW50cyIpIG11c3QgYmUgdHJlYXRlZAotCQkgbm9ybWFsbHkgYmVjYXVzZSB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBhY3R1YWwgaW5zbiB3b3JkCi0JCSBhbmQgdGh1cyB0aGUgaW5zZXJ0aW9uIHJvdXRpbmVzIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KLQotCSAgICAgIGlmIChhcmNfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdLmZsYWdzICYgQVJDX09QRVJBTkRfTElNTSkKLQkJewotCQkgIG9wX3R5cGUgPSBmaXh1cHNbaV0ub3BpbmRleDsKLQkJICAvKiBGSVhNRTogY2FuIHdlIGFkZCB0aGlzIGRhdGEgdG8gdGhlIG9wZXJhbmQgdGFibGU/ICAqLwotCQkgIGlmIChvcF90eXBlID09IGFyY19vcGVyYW5kX21hcFsnTCddKQotCQkgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLQkJICBlbHNlIGlmIChvcF90eXBlID09IGFyY19vcGVyYW5kX21hcFsnSiddKQotCQkgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ19BUkNfQjI2OwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIHJlbG9jX3R5cGUgPSBnZXRfYXJjX2V4cF9yZWxvY190eXBlICgxLCByZWxvY190eXBlLAotCQkJCQkJICAgICAgICZmaXh1cHNbaV0uZXhwLAotCQkJCQkJICAgICAgICZleHB0bXApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb3BfdHlwZSA9IGdldF9hcmNfZXhwX3JlbG9jX3R5cGUgKDAsIGZpeHVwc1tpXS5vcGluZGV4LAotCQkJCQkJICAgICZmaXh1cHNbaV0uZXhwLCAmZXhwdG1wKTsKLQkJICByZWxvY190eXBlID0gb3BfdHlwZSArIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0JCX0KLQkgICAgICBvcGVyYW5kID0gJmFyY19vcGVyYW5kc1tvcF90eXBlXTsKLQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICAoKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKLQkJCSAgICArIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0xJTU0gPyA0IDogMCkpLCA0LAotCQkJICAgJmV4cHRtcCwKLQkJCSAgIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCkgIT0gMCwKLQkJCSAgIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIHJlbG9jX3R5cGUpOwotCSAgICB9Ci0KLQkgIC8qIEFsbCBkb25lLiAgKi8KLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0aGUgbmV4dCBlbnRyeS4gICovCi0gICAgfQotCi0gIGFzX2JhZCAoXygiYmFkIGluc3RydWN0aW9uIGAlcyciKSwgc3RhcnQpOwotfQotDAotLyogPz8/IFRoaXMgd2FzIGNvcGllZCBmcm9tIHRjLXNwYXJjLmMsIEkgdGhpbmsuICBJcyBpdCBuZWNlc3Nhcnk/ICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX2NvbW1vbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBzaXplOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICBhc3NlcnQgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0gICAgewotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKHRlbXAgPCAwKQotCXsKLQkgIHRlbXAgPSAwOwotCSAgYXNfd2FybiAoXygiQ29tbW9uIGFsaWdubWVudCBuZWdhdGl2ZTsgMCBhc3N1bWVkIikpOwotCX0KLSAgICAgIGlmIChzeW1ib2xQLT5sb2NhbCkKLQl7Ci0JICBzZWdUIG9sZF9zZWM7Ci0JICBpbnQgb2xkX3N1YnNlYzsKLQkgIGNoYXIgKnA7Ci0JICBpbnQgYWxpZ247Ci0KLQlhbGxvY2F0ZV9ic3M6Ci0JICBvbGRfc2VjID0gbm93X3NlZzsKLQkgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotCSAgYWxpZ24gPSB0ZW1wOwotCSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLQkgIGlmIChhbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0JICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwKLQkJCShvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKLQkgICpwID0gMDsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQlhbGxvY2F0ZV9jb21tb246Ci0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiA/Pz8gU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIuYnNzXCIiLCA1KQotCSAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmRhdGFcIiIsIDYpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCSAgZ290byBiYWRfY29tbW9uX3NlZ21lbnQ7Ci0JfQotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnIicpCi0JOwotICAgICAgZ290byBhbGxvY2F0ZV9jb21tb247Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZXR1cm47Ci0KLSAgewotICBiYWRfY29tbW9uX3NlZ21lbnQ6Ci0gICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJ1xuJykKLSAgICAgIHArKzsKLSAgICBjID0gKnA7Ci0gICAgKnAgPSAnXDAnOwotICAgIGFzX2JhZCAoXygiYmFkIC5jb21tb24gc2VnbWVudCAlcyIpLCBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKLSAgICAqcCA9IGM7Ci0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIHJldHVybjsKLSAgfQotfQotCi0vKiBTZWxlY3QgdGhlIGNwdSB3ZSdyZSBhc3NlbWJsaW5nIGZvci4gICovCi0KLXN0YXRpYyB2b2lkCi1hcmNfY3B1IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBtYWNoOwotICBjaGFyIGM7Ci0gIGNoYXIgKmNwdTsKLQotICAvKiBJZiBhbiBpbnN0cnVjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNlZW4sIGl0J3MgdG9vIGxhdGUuICAqLwotICBpZiAoY3B1X3RhYmxlc19pbml0X3ApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuY3B1IGNvbW1hbmQgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBpbnN0cnVjdGlvbnMiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjcHUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgbWFjaCA9IGFyY19nZXRfbWFjaCAoY3B1KTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGlmIChtYWNoID09IC0xKQotICAgIGdvdG8gYmFkX2NwdTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIC8qIFRoZSBjcHUgbWF5IGhhdmUgYmVlbiBzZWxlY3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgICBUaGUgY2hvaWNlcyBtdXN0IG1hdGNoLiAgKi8KLSAgLyogPz8/IFRoaXMgd2FzIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBlYXJseSBvbi4gIEl0J3MgZ29uZSBub3csIGJ1dAotICAgICBsZWF2ZSB0aGlzIGluLiAgKi8KLSAgaWYgKG1hY2hfdHlwZV9zcGVjaWZpZWRfcCAmJiBtYWNoICE9IGFyY19tYWNoX3R5cGUpCi0gICAgYXNfYmFkIChfKCIuY3B1IGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIHZhbHVlIikpOwotICBlbHNlCi0gICAgewotICAgICAgYXJjX21hY2hfdHlwZSA9IG1hY2g7Ci0gICAgICBtYWNoX3R5cGVfc3BlY2lmaWVkX3AgPSAxOwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9hcmMsIG1hY2gpKQotCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotICAgIH0KLSAgcmV0dXJuOwotCi0gYmFkX2NwdToKLSAgYXNfYmFkIChfKCJiYWQgLmNwdSBvcCIpKTsKLSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2lmIDAKLS8qIFRoZSAucmVuYW1lIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCBieSBnY2MgdG8gaW1wbGVtZW50Ci0gICAtbW1hbmdsZS1jcHUtbGliZ2NjLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19yZW5hbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZSwqbmV3OwotICBjaGFyIGM7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgaW50IGxlbjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHJlbmFtZSBzdHJpbmciKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGlmICgqbmFtZSA9PSAnXDAnKQotICAgIHsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIHN5bWJvbCB0byByZW5hbWUgdG8iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgbmV3ID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICBzdHJjcHkgKG5ldywgbmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUgPSBuZXc7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLSNlbmRpZgotDAotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUC4KLSAgIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0KLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLS8qIFdlIGRvbid0IGhhdmUgYW55IGZvcm0gb2YgcmVsYXhpbmcuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBDb252ZXJ0IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gIFdlIG5ldmVyIGdlbmVyYXRlIHRoZXNlLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGZyYWdTICpmcmFncDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFBhcnNlIGFuIG9wZXJhbmQgdGhhdCBpcyBtYWNoaW5lLXNwZWNpZmljLgotCi0gICBUaGUgQVJDIGhhcyBhIHNwZWNpYWwgJS1vcCB0byBhZGp1c3QgYWRkcmVzc2VzIHNvIHRoZXkncmUgdXNhYmxlIGluCi0gICBicmFuY2hlcy4gIFRoZSAic3QiIGlzIHNob3J0IGZvciB0aGUgU1RhdHVzIHJlZ2lzdGVyLgotICAgPz8/IExhdGVyIGV4cGFuZCB0aGlzIHRvIHRha2UgYSBmbGFncyB2YWx1ZSB0b28uCi0KLSAgID8/PyBXZSBjYW4ndCBjcmVhdGUgbmV3IGV4cHJlc3Npb24gdHlwZXMgc28gd2UgbWFwIHRoZSAlLW9wJ3Mgb250byB0aGUKLSAgIGV4aXN0aW5nIHN5bnRheC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBjb3VsZCB1c2UgdGhlIGNob3NlbiBzeW50YXgKLSAgIHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0LiAgUGVyaGFwcyBwdXQgYSBzcGVjaWFsIGNvb2tpZSBpbiBYX2FkZF9udW1iZXIKLSAgIHRvIG1hcmsgdGhlIGV4cHJlc3Npb24gYXMgc3BlY2lhbC4gICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBjaGFyICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmICgqcCA9PSAnJScgJiYgc3RybmNtcCAocCwgIiVzdCgiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyknKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyAnKScgaW4gJS1vcCIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9PSAwCi0JICAvKiBJIHRoaW5rIHRoaXMgdGVzdCBpcyB1bm5lY2Vzc2FyeSBidXQganVzdCBhcyBhIHNhbml0eSBjaGVjay4uLiAqLwotCSAgJiYgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID09IE5VTEwpCi0JewotCSAgZXhwcmVzc2lvblMgdHdvOwotCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICB0d28uWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICB0d28uWF9hZGRfc3ltYm9sID0gdHdvLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIHR3by5YX2FkZF9udW1iZXIgPSAyOwotCSAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnR3byk7Ci0JfQotICAgICAgLyogYWxsb3cgJXN0KHN5bTEtc3ltMikgKi8KLSAgICAgIGVsc2UgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fc3VidHJhY3QKLQkgICAgICAgJiYgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0JICAgICAgICYmIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCAhPSBOVUxMCi0JICAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBleHByZXNzaW9uUyB0d287Ci0KLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sIChleHByZXNzaW9uUCk7Ci0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICB0d28uWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICB0d28uWF9hZGRfc3ltYm9sID0gdHdvLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIHR3by5YX2FkZF9udW1iZXIgPSAyOwotCSAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnR3byk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCBmb3IgJSVzdCIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4KLSAgIFdlIGNvdWxkIGNhdGNoIHJlZ2lzdGVyIG5hbWVzIGhlcmUsIGJ1dCB0aGF0IGlzIGhhbmRsZWQgYnkgaW5zZXJ0aW5nCi0gICB0aGVtIGFsbCBpbiB0aGUgc3ltYm9sIHRhYmxlIHRvIGJlZ2luIHdpdGguICAqLwotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgZXhwcmVzc2lvbnMuICAqLwotCi0vKiBQYXJzZSBhIC5ieXRlLCAud29yZCwgZXRjLiBleHByZXNzaW9uLgotCi0gICBWYWx1ZXMgZm9yIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYXJlIHNwZWNpZmllZCB3aXRoICVzdChsYWJlbCkuCi0gICBgbGFiZWwnIHdpbGwgYmUgcmlnaHQgc2hpZnRlZCBieSAyLiAgKi8KLQotdm9pZAotYXJjX3BhcnNlX2NvbnNfZXhwcmVzc2lvbiAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHIgKDAsIGV4cCk7Ci19Ci0KLS8qIFJlY29yZCBhIGZpeHVwIGZvciBhIGNvbnMgZXhwcmVzc2lvbi4gICovCi0KLXZvaWQKLWFyY19jb25zX2ZpeF9uZXcgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IG5ieXRlczsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaWYgKG5ieXRlcyA9PSA0KQotICAgIHsKLSAgICAgIGludCByZWxvY190eXBlOwotICAgICAgZXhwcmVzc2lvblMgZXhwdG1wOwotCi0gICAgICAvKiBUaGlzIG1heSBiZSBhIHNwZWNpYWwgQVJDIHJlbG9jIChlZzogJXN0KCkpLiAgKi8KLSAgICAgIHJlbG9jX3R5cGUgPSBnZXRfYXJjX2V4cF9yZWxvY190eXBlICgxLCBCRkRfUkVMT0NfMzIsIGV4cCwgJmV4cHRtcCk7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIG5ieXRlcywgJmV4cHRtcCwgMCwgcmVsb2NfdHlwZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCwgMCwKLQkJICAgbmJ5dGVzID09IDIgPyBCRkRfUkVMT0NfMTYKLQkJICAgOiBuYnl0ZXMgPT0gOCA/IEJGRF9SRUxPQ182NAotCQkgICA6IEJGRF9SRUxPQ18zMik7Ci0gICAgfQotfQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCi0KLWxvbmcgCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZGVsYXkgc2xvdC4gICovCi0gIHJldHVybiBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9zaXplOwotfQotCi0vKiBDb21wdXRlIHRoZSByZWxvYyB0eXBlIG9mIGFuIGV4cHJlc3Npb24uCi0gICBUaGUgcG9zc2libHkgbW9kaWZpZWQgZXhwcmVzc2lvbiBpcyBzdG9yZWQgaW4gRVhQTkVXLgotCi0gICBUaGlzIGlzIHVzZWQgdG8gY29udmVydCB0aGUgZXhwcmVzc2lvbnMgZ2VuZXJhdGVkIGJ5IHRoZSAlLW9wJ3MgaW50bwotICAgdGhlIGFwcHJvcHJpYXRlIG9wZXJhbmQgdHlwZS4gIEl0IGlzIGNhbGxlZCBmb3IgYm90aCBkYXRhIGluIGluc3RydWN0aW9ucwotICAgKG9wZXJhbmRzKSBhbmQgZGF0YSBvdXRzaWRlIGluc3RydWN0aW9ucyAodmFyaWFibGVzLCBkZWJ1Z2dpbmcgaW5mbywgZXRjLikuCi0KLSAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgJS1vcHM6Ci0KLSAgICVzdChzeW1ib2wpOiByZXByZXNlbnRlZCBhcyAic3ltYm9sID4+IDIiCi0gICAgICAgICAgICAgICAgInN0IiBpcyBzaG9ydCBmb3IgU1RhdHVzIGFzIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKHBjKQotCi0gICBERUZBVUxUX1RZUEUgaXMgdGhlIHR5cGUgdG8gdXNlIGlmIG5vIHNwZWNpYWwgcHJvY2Vzc2luZyBpcyByZXF1aXJlZC4KLQotICAgREFUQV9QIGlzIG5vbi16ZXJvIGZvciBkYXRhIG9yIGxpbW0gdmFsdWVzLCB6ZXJvIGZvciBpbnNuIG9wZXJhbmRzLgotICAgUmVtZW1iZXIgdGhhdCB0aGUgb3Bjb2RlICJpbnNlcnRpb24gZm5zIiBjYW5ub3QgYmUgdXNlZCBvbiBkYXRhLCB0aGV5J3JlCi0gICBvbmx5IGZvciBpbnNlcnRpbmcgb3BlcmFuZHMgaW50byBpbnNucy4gIFRoZXkgYWxzbyBjYW4ndCBiZSB1c2VkIGZvciBsaW1tCi0gICB2YWx1ZXMgYXMgdGhlIGluc2VydGlvbiByb3V0aW5lcyBkb24ndCBoYW5kbGUgbGltbSB2YWx1ZXMuICBXaGVuIGNhbGxlZCBmb3IKLSAgIGluc25zIHdlIHJldHVybiBmdWRnZWQgcmVsb2MgdHlwZXMgKHJlYWxfdmFsdWUgLSBCRkRfUkVMT0NfVU5VU0VEKS4gIFdoZW4KLSAgIGNhbGxlZCBmb3IgZGF0YSBvciBsaW1tIHZhbHVlcyB3ZSB1c2UgcmVhbCByZWxvYyB0eXBlcy4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9hcmNfZXhwX3JlbG9jX3R5cGUgKGRhdGFfcCwgZGVmYXVsdF90eXBlLCBleHAsIGV4cG5ldykKLSAgICAgaW50IGRhdGFfcDsKLSAgICAgaW50IGRlZmF1bHRfdHlwZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cG5ldzsKLXsKLSAgLyogSWYgdGhlIGV4cHJlc3Npb24gaXMgInN5bWJvbCA+PiAyIiB3ZSBtdXN0IGNoYW5nZSBpdCB0byBqdXN0ICJzeW1ib2wiLAotICAgICBhcyBmaXhfbmV3X2V4cCBjYW4ndCBoYW5kbGUgaXQuICBTaW1pbGFyaWx5IGZvciAoc3ltYm9sIC0gc3ltYm9sKSA+PiAyLgotICAgICBUaGF0J3Mgb2sgdGhvdWdoLiAgV2hhdCdzIHJlYWxseSBnb2luZyBvbiBoZXJlIGlzIHRoYXQgd2UncmUgdXNpbmcKLSAgICAgIj4+IDIiIGFzIGEgc3BlY2lhbCBzeW50YXggZm9yIHNwZWNpZnlpbmcgQkZEX1JFTE9DX0FSQ19CMjYuICAqLwotCi0gIGlmIChleHAtPlhfb3AgPT0gT19yaWdodF9zaGlmdAotICAgICAgJiYgZXhwLT5YX29wX3N5bWJvbCAhPSBOVUxMCi0gICAgICAmJiBzeW1ib2xfY29uc3RhbnRfcCAoZXhwLT5YX29wX3N5bWJvbCkKLSAgICAgICYmIFNfR0VUX1ZBTFVFIChleHAtPlhfb3Bfc3ltYm9sKSA9PSAyCi0gICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAwKQotICAgIHsKLSAgICAgIGlmIChleHAtPlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0JICAmJiAoc3ltYm9sX2NvbnN0YW50X3AgKGV4cC0+WF9hZGRfc3ltYm9sKQotCSAgICAgIHx8IHN5bWJvbF9lcXVhdGVkX3AgKGV4cC0+WF9hZGRfc3ltYm9sKSkpCi0JewotCSAgKmV4cG5ldyA9ICpleHA7Ci0JICBleHBuZXctPlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cG5ldy0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgcmV0dXJuIGRhdGFfcCA/IEJGRF9SRUxPQ19BUkNfQjI2IDogYXJjX29wZXJhbmRfbWFwWydKJ107Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCktPlhfb3AKLQkJICAgPT0gT19zdWJ0cmFjdCkpCi0JewotCSAgKmV4cG5ldyA9ICpzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4cC0+WF9hZGRfc3ltYm9sKTsKLQkgIHJldHVybiBkYXRhX3AgPyBCRkRfUkVMT0NfQVJDX0IyNiA6IGFyY19vcGVyYW5kX21hcFsnSiddOwotCX0KLSAgICB9Ci0KLSAgKmV4cG5ldyA9ICpleHA7Ci0gIHJldHVybiBkZWZhdWx0X3R5cGU7Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBjb2RlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIGZpeHVwcyB3ZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gZml4X25ld19leHAsIGFib3ZlLiAgSW4gdGhlIGNhbGwKLSAgIGFib3ZlIHdlIHVzZWQgYSByZWxvYyBjb2RlIHdoaWNoIHdhcyB0aGUgbGFyZ2VzdCBsZWdhbCByZWxvYyBjb2RlCi0gICBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgSGVyZSB3ZSB1bmRvIHRoYXQgdG8gcmVjb3ZlciB0aGUgb3BlcmFuZAotICAgaW5kZXguICBBdCB0aGlzIHBvaW50IGFsbCBzeW1ib2wgdmFsdWVzIHNob3VsZCBiZSBmdWxseSByZXNvbHZlZCwKLSAgIGFuZCB3ZSBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGUgcmVsb2MuICBJZiB3ZSBjYW4gbm90IGRvCi0gICB0aGF0LCB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVsb2MgY29kZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIGZpeHVwLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWx1ZVAsIHNlZykKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWx1ZVA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKmNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsqLwotICB2YWx1ZVQgdmFsdWU7Ci0KLSAgLyogRklYTUUgRklYTUUgRklYTUU6IFRoZSB2YWx1ZSB3ZSBhcmUgcGFzc2VkIGluICp2YWx1ZVAgaW5jbHVkZXMKLSAgICAgdGhlIHN5bWJvbCB2YWx1ZXMuICBTaW5jZSB3ZSBhcmUgdXNpbmcgQkZEX0FTU0VNQkxFUiwgaWYgd2UgYXJlCi0gICAgIGRvaW5nIHRoaXMgcmVsb2NhdGlvbiB0aGUgY29kZSBpbiB3cml0ZS5jIGlzIGdvaW5nIHRvIGNhbGwKLSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgd2hpY2ggaXMgYWxzbyBnb2luZyB0byB1c2UgdGhlIHN5bWJvbAotICAgICB2YWx1ZS4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgcmVsb2MgaXMgZnVsbHkgcmVzb2x2ZWQgd2Ugd2FudCB0bwotICAgICB1c2UgKnZhbHVlUCBzaW5jZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkLgotICAgICBIb3dldmVyLCBpZiB0aGUgcmVsb2MgaXMgbm90IGZ1bGx5IHJlc29sdmVkIHdlIGRvIG5vdCB3YW50IHRvIHVzZQotICAgICAqdmFsdWVQLCBhbmQgbXVzdCB1c2UgZnhfb2Zmc2V0IGluc3RlYWQuICBIb3dldmVyLCBpZiB0aGUgcmVsb2MKLSAgICAgaXMgUEMgcmVsYXRpdmUsIHdlIGRvIHdhbnQgdG8gdXNlICp2YWx1ZVAgc2luY2UgaXQgaW5jbHVkZXMgdGhlCi0gICAgIHJlc3VsdCBvZiBtZF9wY3JlbF9mcm9tLiAgVGhpcyBpcyBjb25mdXNpbmcuICAqLwotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlUDsKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgdmFsdWUgPSAqdmFsdWVQOwotICAgICAgLyogRUxGIHJlbG9jYXRpb25zIGFyZSBhZ2FpbnN0IHN5bWJvbHMuCi0JIElmIHRoaXMgc3ltYm9sIGlzIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gdGhlbiB3ZSBuZWVkIHRvIGxlYXZlIGl0IGZvcgotCSB0aGUgbGlua2VyIHRvIGRlYWwgd2l0aC4gIFVuZm9ydHVuYXRlbHksIG1kX3BjcmVsX2Zyb20gY2FuJ3QgdGVsbCwKLQkgc28gd2UgaGF2ZSB0byB1bmRvIGl0J3MgZWZmZWN0cyBoZXJlLiAgKi8KLSAgICAgIGlmIChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZykKLQl2YWx1ZSArPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgIGlmIChmaXhQLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X3N1YnN5KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoKGludCkgZml4UC0+Znhfcl90eXBlID49IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaW50IG9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBjaGFyICp3aGVyZTsKLSAgICAgIGFyY19pbnNuIGluc247Ci0KLSAgICAgIG9waW5kZXggPSAoaW50KSBmaXhQLT5meF9yX3R5cGUgLSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOwotCi0gICAgICBvcGVyYW5kID0gJmFyY19vcGVyYW5kc1tvcGluZGV4XTsKLQotICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLQkgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gICAgICB3aGVyZSA9IGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBpbnNuID0gYXJjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAtMSwgTlVMTCwgKG9mZnNldFQpIHZhbHVlLAotCQkJCSBmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQliZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0KLSAgICAgIGlmIChmaXhQLT5meF9kb25lKQotCXsKLQkgIC8qIE5vdGhpbmcgZWxzZSB0byBkbyBoZXJlLiAgKi8KLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogRGV0ZXJtaW5lIGEgQkZEIHJlbG9jIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIGluZm9ybWF0aW9uLgotCSBXZSBhcmUgb25seSBwcmVwYXJlZCB0byB0dXJuIGEgZmV3IG9mIHRoZSBvcGVyYW5kcyBpbnRvIHJlbG9jcy4KLQkgISEhIE5vdGUgdGhhdCB3ZSBjYW4ndCBoYW5kbGUgbGltbSB2YWx1ZXMgaGVyZS4gIFNpbmNlIHdlJ3JlIHVzaW5nCi0JIGltcGxpY2l0IGFkZGVuZHMgdGhlIGFkZGVuZCBtdXN0IGJlIGluc2VydGVkIGludG8gdGhlIGluc3RydWN0aW9uLAotCSBob3dldmVyLCB0aGUgb3Bjb2RlIGluc2VydGlvbiByb3V0aW5lcyBjdXJyZW50bHkgZG8gbm90aGluZyB3aXRoCi0JIGxpbW0gdmFsdWVzLiAgKi8KLSAgICAgIGlmIChvcGVyYW5kLT5mbXQgPT0gJ0InKQotCXsKLQkgIGFzc2VydCAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIKSAhPSAwCi0JCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAyMAotCQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDcpOwotCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0FSQ19CMjJfUENSRUw7Ci0JfQotICAgICAgZWxzZSBpZiAoMCAmJiBvcGVyYW5kLT5mbXQgPT0gJ0onKQotCXsKLQkgIGFzc2VydCAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfQUJTT0xVVEVfQlJBTkNIKSAhPSAwCi0JCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAyNAotCQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDMyKTsKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BUkNfQjI2OwotCX0KLSAgICAgIGVsc2UgaWYgKDAgJiYgb3BlcmFuZC0+Zm10ID09ICdMJykKLQl7Ci0JICBhc3NlcnQgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0xJTU0pICE9IDAKLQkJICAmJiBvcGVyYW5kLT5iaXRzID09IDMyCi0JCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMzIpOwotCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIikpOwotCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzE2OgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMik7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18zMjoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0jaWYgMAotCWNhc2UgQkZEX1JFTE9DXzY0OgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgOCk7Ci0JICBicmVhazsKLSNlbmRpZgotCWNhc2UgQkZEX1JFTE9DX0FSQ19CMjY6Ci0JICAvKiBJZiAhZml4UC0+ZnhfZG9uZSB0aGVuIGB2YWx1ZScgaXMgYW4gaW1wbGljaXQgYWRkZW5kLgotCSAgICAgV2UgbXVzdCBzaGlmdCBpdCByaWdodCBieSAyIGluIHRoaXMgY2FzZSBhcyB3ZWxsIGJlY2F1c2UgdGhlCi0JICAgICBsaW5rZXIgcGVyZm9ybXMgdGhlIHJlbG9jYXRpb24gYW5kIHRoZW4gYWRkcyB0aGlzIGluIChhcyBvcHBvc2VkCi0JICAgICB0byBhZGRpbmcgdGhpcyBpbiBhbmQgdGhlbiBzaGlmdGluZyByaWdodCBieSAyKS4gICovCi0JICB2YWx1ZSA+Pj0gMjsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeFApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhQOwotewotICBhcmVsZW50ICpyZWxvYzsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhQLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGV4cG9ydCByZWxvYyB0eXBlICVkIChgJXMnKSIpLAotCQkgICAgZml4UC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXNzZXJ0ICghZml4UC0+ZnhfcGNyZWwgPT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpOwotCi0gIHJlbG9jLT5hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotDAotLyogRnJvYmJlcnMuICAqLwotCi0jaWYgMAotLyogU2V0IHRoZSByZWFsIG5hbWUgaWYgdGhlIC5yZW5hbWUgcHNldWRvLW9wIHdhcyB1c2VkLgotICAgUmV0dXJuIDEgaWYgdGhlIHN5bWJvbCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1pbnQKLWFyY19mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBTX1NFVF9OQU1FIChzeW0sIHN5bWJvbF9nZXRfdGMgKHN5bSktPnJlYWxfbmFtZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJjLmggYi9nYXMvY29uZmlnL3RjLWFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDY2MjAxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiB0Yy1hcmMuaCAtIE1hY3JvcyBhbmQgdHlwZSBkZWZpbmVzIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfQVJDIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9hcmMKLQotI2RlZmluZSBMSVRUTEVfRU5ESUFOICAgMTIzNAotI2RlZmluZSBCSUdfRU5ESUFOICAgICAgNDMyMQotCi0vKiBUaGUgZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IGZvcm1hdCBtYXkgY2hhbmdlIGJhc2VkIG9uIGNvbW1hbmQKLSAgIGxpbmUgYXJndW1lbnRzLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICphcmNfdGFyZ2V0X2Zvcm1hdDsKLSNkZWZpbmUgREVGQVVMVF9UQVJHRVRfRk9STUFUICJlbGYzMi1saXR0bGVhcmMiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgYXJjX3RhcmdldF9mb3JtYXQKLSNkZWZpbmUgREVGQVVMVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkFSQyBHQVMgIgotCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotLyogVGhlIEFSQyBuZWVkcyB0byBwYXJzZSByZWxvYyBzcGVjaWZpZXJzIGluIC53b3JkLiAgKi8KLQotZXh0ZXJuIHZvaWQgYXJjX3BhcnNlX2NvbnNfZXhwcmVzc2lvbiAoKTsKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBcCi1hcmNfcGFyc2VfY29uc19leHByZXNzaW9uIChFWFAsIE5CWVRFUykKLQotZXh0ZXJuIHZvaWQgYXJjX2NvbnNfZml4X25ldyAoKTsKLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXKEZSQUcsIFdIRVJFLCBOQllURVMsIEVYUCkgXAotYXJjX2NvbnNfZml4X25ldyAoRlJBRywgV0hFUkUsIE5CWVRFUywgRVhQKQotCi0jaWYgMAotLyogRXh0cmEgc3R1ZmYgdGhhdCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgZm9yIGVhY2ggc3ltYm9sLiAgKi8KLXN0cnVjdCBhcmNfdGNfc3kKLXsKLSAgLyogVGhlIHJlYWwgbmFtZSwgaWYgdGhlIHN5bWJvbCB3YXMgcmVuYW1lZC4gICovCi0gIGNoYXIgKnJlYWxfbmFtZTsKLX07Ci0KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzdHJ1Y3QgYXJjX3RjX3N5Ci0KLS8qIEZpbmlzaCB1cCB0aGUgc3ltYm9sLiAgKi8KLWV4dGVybiBpbnQgYXJjX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0sIHB1bnQpIHB1bnQgPSBhcmNfZnJvYl9zeW1ib2wgKHN5bSkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hcm0uYyBiL2dhcy9jb25maWcvdGMtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTI0MTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDcxMDkgKzAsMCBAQAotLyogdGMtYXJtLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBBUk0KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCU1vZGlmaWVkIGJ5IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSAgTk9fUkVMT0MgMAotI2luY2x1ZGUgImFzLmgiCi0KLS8qIG5lZWQgVEFSR0VUX0NQVSAqLwotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotI2luY2x1ZGUgImxpc3RpbmcuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvYXJtLmgiCi0jZW5kaWYKLQotLyogVHlwZXMgb2YgcHJvY2Vzc29yIHRvIGFzc2VtYmxlIGZvci4gICovCi0jZGVmaW5lIEFSTV8xCQkweDAwMDAwMDAxCi0jZGVmaW5lIEFSTV8yCQkweDAwMDAwMDAyCi0jZGVmaW5lIEFSTV8zCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEFSTV8yNTAJCUFSTV8zCi0jZGVmaW5lIEFSTV82CQkweDAwMDAwMDA4Ci0jZGVmaW5lIEFSTV83CQlBUk1fNiAgICAgICAgICAgLyogc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCAqLwotI2RlZmluZSBBUk1fOAkJQVJNXzYgICAgICAgICAgIC8qIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKi8KLSNkZWZpbmUgQVJNXzkJCUFSTV82ICAgICAgICAgICAvKiBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0ICovCi0jZGVmaW5lIEFSTV9DUFVfTUFTSwkweDAwMDAwMDBmCi0KLS8qIFRoZSBmb2xsb3dpbmcgYml0bWFza3MgY29udHJvbCBDUFUgZXh0ZW5zaW9ucyAoQVJNNyBvbndhcmRzKTogKi8KLSNkZWZpbmUgQVJNX0xPTkdNVUwJMHgwMDAwMDAxMAkvKiBhbGxvdyBsb25nIG11bHRpcGxpZXMgKi8KLSNkZWZpbmUgQVJNX0hBTEZXT1JEICAgIDB4MDAwMDAwMjAJLyogYWxsb3cgaGFsZiB3b3JkIGxvYWRzICovCi0jZGVmaW5lIEFSTV9USFVNQiAgICAgICAweDAwMDAwMDQwCS8qIGFsbG93IEJYIGluc3RydWN0aW9uICAqLwotI2RlZmluZSBBUk1fRVhUX1Y1CTB4MDAwMDAwODAJLyogYWxsb3cgQ0xaIGV0YwkgKi8KLSNkZWZpbmUgQVJNX0VYVF9WNUUgICAgIDB4MDAwMDAyMDAJLyogIkVsIFNlZ3VuZG8iIAkgKi8KLQotLyogQXJjaGl0ZWN0dXJlcyBhcmUgdGhlIHN1bSBvZiB0aGUgYmFzZSBhbmQgZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBBUk1fQVJDSF9WNAkoQVJNXzcgfCBBUk1fTE9OR01VTCB8IEFSTV9IQUxGV09SRCkKLSNkZWZpbmUgQVJNX0FSQ0hfVjRUCShBUk1fQVJDSF9WNCB8IEFSTV9USFVNQikKLSNkZWZpbmUgQVJNX0FSQ0hfVjUJKEFSTV9BUkNIX1Y0IHwgQVJNX0VYVF9WNSApCi0jZGVmaW5lIEFSTV9BUkNIX1Y1VAkoQVJNX0FSQ0hfVjUgfCBBUk1fVEhVTUIpCi0KLS8qIFNvbWUgdXNlZnVsIGNvbWJpbmF0aW9uczogICovCi0jZGVmaW5lIEFSTV9BTlkJCTB4MDBmZmZmZmYKLSNkZWZpbmUgQVJNXzJVUAkJKEFSTV9BTlkgLSBBUk1fMSkKLSNkZWZpbmUgQVJNX0FMTAkJQVJNXzJVUAkJLyogTm90IGFybTEgb25seSAqLwotI2RlZmluZSBBUk1fM1VQCQkweDAwZmZmZmZjCi0jZGVmaW5lIEFSTV82VVAJCTB4MDBmZmZmZjggICAgICAvKiBJbmNsdWRlcyBBUk03ICovCi0KLSNkZWZpbmUgRlBVX0NPUkUJMHg4MDAwMDAwMAotI2RlZmluZSBGUFVfRlBBMTAJMHg0MDAwMDAwMAotI2RlZmluZSBGUFVfRlBBMTEJMHg0MDAwMDAwMAotI2RlZmluZSBGUFVfTk9ORQkwCi0KLS8qIFNvbWUgdXNlZnVsIGNvbWJpbmF0aW9ucyAgKi8KLSNkZWZpbmUgRlBVX0FMTAkJMHhmZjAwMDAwMAkvKiBOb3RlIHRoaXMgaXMgfkFSTV9BTlkgKi8KLSNkZWZpbmUgRlBVX01FTU1VTFRJCTB4N2YwMDAwMDAJLyogTm90IGZwdV9jb3JlICovCi0KLSAgICAgCi0jaWZuZGVmIENQVV9ERUZBVUxUCi0jaWYgZGVmaW5lZCBfX3RodW1iX18KLSNkZWZpbmUgQ1BVX0RFRkFVTFQgKEFSTV9BUkNIX1Y0IHwgQVJNX1RIVU1CKQotI2Vsc2UKLSNkZWZpbmUgQ1BVX0RFRkFVTFQgQVJNX0FMTAotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBGUFVfREVGQVVMVAotI2RlZmluZSBGUFVfREVGQVVMVCBGUFVfQUxMCi0jZW5kaWYKLQotI2RlZmluZSBzdHJlcShhLCBiKSAgICAgICAgICAgKHN0cmNtcCAoYSwgYikgPT0gMCkKLSNkZWZpbmUgc2tpcF93aGl0ZXNwYWNlKHN0cikgIHdoaWxlICgqIChzdHIpID09ICcgJykgKysgKHN0cikKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcJY3B1X3ZhcmlhbnQgPSBDUFVfREVGQVVMVCB8IEZQVV9ERUZBVUxUOwotc3RhdGljIGludCB0YXJnZXRfb2FiaSA9IDA7Ci0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotLyogRmxhZ3Mgc3RvcmVkIGluIHByaXZhdGUgYXJlYSBvZiBCRkQgc3RydWN0dXJlICovCi1zdGF0aWMgYm9vbGVhbgkJdXNlc19hcGNzXzI2ID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbgkJc3VwcG9ydF9pbnRlcndvcmsgPSBmYWxzZTsKLXN0YXRpYyBib29sZWFuCQl1c2VzX2FwY3NfZmxvYXQgPSBmYWxzZTsKLXN0YXRpYyBib29sZWFuCQlwaWNfY29kZSA9IGZhbHNlOwotI2VuZGlmCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1DT05TVCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICJAIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KLUNPTlNUIGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLSNpZmRlZiBURV9MSU5VWAotQ09OU1QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotI2Vsc2UKLUNPTlNUIGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotI2VuZGlmCi0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1DT05TVCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotCi1DT05TVCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhlRXBQIjsKLQotLyogUHJlZml4IGNoYXJhY3RlcnMgdGhhdCBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYW4gaW1tZWRpYXRlCi0gICB2YWx1ZS4gICovCi0jZGVmaW5lIGlzX2ltbWVkaWF0ZV9wcmVmaXgoQykgKChDKSA9PSAnIycgfHwgKEMpID09ICckJykKLQotI2lmZGVmIE9CSl9FTEYKLXN5bWJvbFMgKiBHT1Rfc3ltYm9sOwkJLyogUHJlLWRlZmluZWQgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIgKi8KLSNlbmRpZgotCi1DT05TVCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotc3RhdGljIGludCB0aHVtYl9tb2RlID0gMDsgICAgICAvKiAwOiBhc3NlbWJsZSBmb3IgQVJNLCAxOiBhc3NlbWJsZSBmb3IgVGh1bWIsCi0JCQkJICAgMjogYXNzZW1ibGUgZm9yIFRodW1iIGV2ZW4gdGhvdWdoIHRhcmdldCBjcHUKLQkJCQkgICBkb2VzIG5vdCBzdXBwb3J0IHRodW1iIGluc3RydWN0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgYXJtX2ZpeAotewotICBpbnQgdGh1bWJfbW9kZTsKLX0gYXJtX2ZpeF9kYXRhOwotCi1zdHJ1Y3QgYXJtX2l0Ci17Ci0gIENPTlNUIGNoYXIgKiAgZXJyb3I7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb247Ci0gIGludCAgICAgICAgICAgc3VmZml4OwotICBpbnQgICAgICAgICAgIHNpemU7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSB0eXBlOwotICAgICAgZXhwcmVzc2lvblMgICAgICAgICAgICAgIGV4cDsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICBwY19yZWw7Ci0gICAgfSByZWxvYzsKLX07Ci0KLXN0cnVjdCBhcm1faXQgaW5zdDsKLQotc3RydWN0IGFzbV9zaGlmdAotewotICBDT05TVCBjaGFyICogIHRlbXBsYXRlOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fc2hpZnQgc2hpZnRbXSA9Ci17Ci0gIHsiYXNsIiwgMH0sCi0gIHsibHNsIiwgMH0sCi0gIHsibHNyIiwgMHgwMDAwMDAyMH0sCi0gIHsiYXNyIiwgMHgwMDAwMDA0MH0sCi0gIHsicm9yIiwgMHgwMDAwMDA2MH0sCi0gIHsicnJ4IiwgMHgwMDAwMDA2MH0sCi0gIHsiQVNMIiwgMH0sCi0gIHsiTFNMIiwgMH0sCi0gIHsiTFNSIiwgMHgwMDAwMDAyMH0sCi0gIHsiQVNSIiwgMHgwMDAwMDA0MH0sCi0gIHsiUk9SIiwgMHgwMDAwMDA2MH0sCi0gIHsiUlJYIiwgMHgwMDAwMDA2MH0KLX07Ci0KLSNkZWZpbmUgTk9fU0hJRlRfUkVTVFJJQ1QgMQotI2RlZmluZSBTSElGVF9SRVNUUklDVAkgIDAKLQotI2RlZmluZSBOVU1fRkxPQVRfVkFMUyA4Ci0KLUNPTlNUIGNoYXIgKiBmcF9jb25zdFtdID0gCi17Ci0gICIwLjAiLCAiMS4wIiwgIjIuMCIsICIzLjAiLCAiNC4wIiwgIjUuMCIsICIwLjUiLCAiMTAuMCIsIDAKLX07Ci0KLS8qIE51bWJlciBvZiBsaXR0bGVudW1zIHJlcXVpcmVkIHRvIGhvbGQgYW4gZXh0ZW5kZWQgcHJlY2lzaW9uIG51bWJlciAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLUxJVFRMRU5VTV9UWVBFIGZwX3ZhbHVlc1tOVU1fRkxPQVRfVkFMU11bTUFYX0xJVFRMRU5VTVNdOwotCi0jZGVmaW5lIEZBSUwJKC0xKQotI2RlZmluZSBTVUNDRVNTICgwKQotCi0jZGVmaW5lIFNVRkZfUyAxCi0jZGVmaW5lIFNVRkZfRCAyCi0jZGVmaW5lIFNVRkZfRSAzCi0jZGVmaW5lIFNVRkZfUCA0Ci0KLSNkZWZpbmUgQ1BfVF9YICAgMHgwMDAwODAwMAotI2RlZmluZSBDUF9UX1kgICAweDAwNDAwMDAwCi0jZGVmaW5lIENQX1RfUHJlIDB4MDEwMDAwMDAKLSNkZWZpbmUgQ1BfVF9VRCAgMHgwMDgwMDAwMAotI2RlZmluZSBDUF9UX1dCICAweDAwMjAwMDAwCi0KLSNkZWZpbmUgQ09ORFNfQklUICAgICAgICgweDAwMTAwMDAwKQotI2RlZmluZSBMT0FEX0JJVCAgICAgICAgKDB4MDAxMDAwMDApCi0jZGVmaW5lIFRSQU5TX0JJVAkoMHgwMDIwMDAwMCkKLQotc3RydWN0IGFzbV9jb25kCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci19OwotCi0vKiBUaGlzIGlzIHRvIHNhdmUgYSBoYXNoIGxvb2stdXAgaW4gdGhlIGNvbW1vbiBjYXNlICovCi0jZGVmaW5lIENPTkRfQUxXQVlTIDB4ZTAwMDAwMDAKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fY29uZCBjb25kc1tdID0gCi17Ci0gIHsiZXEiLCAweDAwMDAwMDAwfSwKLSAgeyJuZSIsIDB4MTAwMDAwMDB9LAotICB7ImNzIiwgMHgyMDAwMDAwMH0sIHsiaHMiLCAweDIwMDAwMDAwfSwKLSAgeyJjYyIsIDB4MzAwMDAwMDB9LCB7InVsIiwgMHgzMDAwMDAwMH0sIHsibG8iLCAweDMwMDAwMDAwfSwKLSAgeyJtaSIsIDB4NDAwMDAwMDB9LAotICB7InBsIiwgMHg1MDAwMDAwMH0sCi0gIHsidnMiLCAweDYwMDAwMDAwfSwKLSAgeyJ2YyIsIDB4NzAwMDAwMDB9LAotICB7ImhpIiwgMHg4MDAwMDAwMH0sCi0gIHsibHMiLCAweDkwMDAwMDAwfSwKLSAgeyJnZSIsIDB4YTAwMDAwMDB9LAotICB7Imx0IiwgMHhiMDAwMDAwMH0sCi0gIHsiZ3QiLCAweGMwMDAwMDAwfSwKLSAgeyJsZSIsIDB4ZDAwMDAwMDB9LAotICB7ImFsIiwgMHhlMDAwMDAwMH0sCi0gIHsibnYiLCAweGYwMDAwMDAwfQotfTsKLQotLyogV2FybmluZzogSWYgdGhlIHRvcCBiaXQgb2YgdGhlIHNldF9iaXRzIGlzIHNldCwgdGhlbiB0aGUgc3RhbmRhcmQKLSAgIGluc3RydWN0aW9uIGJpdG1hc2sgaXMgaWdub3JlZCwgYW5kIHRoZSBuZXcgYml0bWFzayBpcyB0YWtlbiBmcm9tCi0gICB0aGUgc2V0X2JpdHM6ICovCi1zdHJ1Y3QgYXNtX2ZsZwotewotICBDT05TVCBjaGFyICogIHRlbXBsYXRlOwkvKiBCYXNpYyBmbGFnIHN0cmluZyAqLwotICB1bnNpZ25lZCBsb25nIHNldF9iaXRzOwkvKiBCaXRzIHRvIHNldCAqLwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIHNfZmxhZ1tdID0KLXsKLSAgeyJzIiwgQ09ORFNfQklUfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgbGRyX2ZsYWdzW10gPQotewotICB7ImIiLCAgMHgwMDQwMDAwMH0sCi0gIHsidCIsICBUUkFOU19CSVR9LAotICB7ImJ0IiwgMHgwMDQwMDAwMCB8IFRSQU5TX0JJVH0sCi0gIHsiaCIsICAweDgwMTAwMGIwfSwKLSAgeyJzaCIsIDB4ODAxMDAwZjB9LAotICB7InNiIiwgMHg4MDEwMDBkMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIHN0cl9mbGFnc1tdID0KLXsKLSAgeyJiIiwgIDB4MDA0MDAwMDB9LAotICB7InQiLCAgVFJBTlNfQklUfSwKLSAgeyJidCIsIDB4MDA0MDAwMDAgfCBUUkFOU19CSVR9LAotICB7ImgiLCAgMHg4MDAwMDBiMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGJ5dGVfZmxhZ1tdID0KLXsKLSAgeyJiIiwgMHgwMDQwMDAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGNtcF9mbGFnc1tdID0KLXsKLSAgeyJzIiwgQ09ORFNfQklUfSwKLSAgeyJwIiwgMHgwMDEwZjAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGxkbV9mbGFnc1tdID0KLXsKLSAgeyJlZCIsIDB4MDE4MDAwMDB9LAotICB7ImZkIiwgMHgwMDgwMDAwMH0sCi0gIHsiZWEiLCAweDAxMDAwMDAwfSwKLSAgeyJmYSIsIDB4MDgwMDAwMDB9LAotICB7ImliIiwgMHgwMTgwMDAwMH0sCi0gIHsiaWEiLCAweDAwODAwMDAwfSwKLSAgeyJkYiIsIDB4MDEwMDAwMDB9LAotICB7ImRhIiwgMHgwODAwMDAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIHN0bV9mbGFnc1tdID0KLXsKLSAgeyJlZCIsIDB4MDgwMDAwMDB9LAotICB7ImZkIiwgMHgwMTAwMDAwMH0sCi0gIHsiZWEiLCAweDAwODAwMDAwfSwKLSAgeyJmYSIsIDB4MDE4MDAwMDB9LAotICB7ImliIiwgMHgwMTgwMDAwMH0sCi0gIHsiaWEiLCAweDAwODAwMDAwfSwKLSAgeyJkYiIsIDB4MDEwMDAwMDB9LAotICB7ImRhIiwgMHgwODAwMDAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGxmbV9mbGFnc1tdID0KLXsKLSAgeyJmZCIsIDB4MDA4MDAwMDB9LAotICB7ImVhIiwgMHgwMTAwMDAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIHNmbV9mbGFnc1tdID0KLXsKLSAgeyJmZCIsIDB4MDEwMDAwMDB9LAotICB7ImVhIiwgMHgwMDgwMDAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIHJvdW5kX2ZsYWdzW10gPQotewotICB7InAiLCAweDAwMDAwMDIwfSwKLSAgeyJtIiwgMHgwMDAwMDA0MH0sCi0gIHsieiIsIDB4MDAwMDAwNjB9LAotICB7TlVMTCwgMH0KLX07Ci0KLS8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRklYIGluc3RydWN0aW9uIGlzIGJyb2tlbiBvbiBzb21lIGFzc2VtYmxlcnMsCi0gICBpbiB0aGF0IGl0IGFjY2VwdHMgYSBwcmVjaXNpb24gc3BlY2lmaWVyIGFzIHdlbGwgYXMgYSByb3VuZGluZyBzcGVjaWZpZXIsCi0gICBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhpcyBpcyBtZWFuaW5nbGVzcy4gIFRvIGJlIG1vcmUgY29tcGF0aWJsZSwgd2UKLSAgIGFjY2VwdCBpdCBhcyB3ZWxsLCB0aG91Z2ggb2YgY291cnNlIGl0IGRvZXMgbm90IHNldCBhbnkgYml0cy4gICovCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgZml4X2ZsYWdzW10gPQotewotICB7InAiLCAweDAwMDAwMDIwfSwKLSAgeyJtIiwgMHgwMDAwMDA0MH0sCi0gIHsieiIsIDB4MDAwMDAwNjB9LAotICB7InNwIiwgMHgwMDAwMDAyMH0sCi0gIHsic20iLCAweDAwMDAwMDQwfSwKLSAgeyJzeiIsIDB4MDAwMDAwNjB9LAotICB7ImRwIiwgMHgwMDAwMDAyMH0sCi0gIHsiZG0iLCAweDAwMDAwMDQwfSwKLSAgeyJkeiIsIDB4MDAwMDAwNjB9LAotICB7ImVwIiwgMHgwMDAwMDAyMH0sCi0gIHsiZW0iLCAweDAwMDAwMDQwfSwKLSAgeyJleiIsIDB4MDAwMDAwNjB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBleGNlcHRfZmxhZ1tdID0KLXsKLSAgeyJlIiwgMHgwMDQwMDAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGNwbG9uZ19mbGFnW10gPQotewotICB7ImwiLCAweDAwNDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdHJ1Y3QgYXNtX3BzcgotewotICBDT05TVCBjaGFyICogIHRlbXBsYXRlOwotICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLX07Ci0KLSNkZWZpbmUgUFNSX0ZJRUxEX01BU0sgIDB4MDAwZjAwMDAKLQotI2RlZmluZSBQU1JfRkxBR1MJMHgwMDA4MDAwMAotI2RlZmluZSBQU1JfQ09OVFJPTAkweDAwMDEwMDAwIC8qIFVuZG9jdW1lbnRlZCBpbnN0cnVjdGlvbiwgaXRzIHVzZSBpcyBkaXNjb3VyYWdlZCBieSBBUk0gKi8KLSNkZWZpbmUgUFNSX0FMTAkJMHgwMDA5MDAwMAotCi0jZGVmaW5lIENQU1JfQUxMCTAKLSNkZWZpbmUgU1BTUl9BTEwJMQotI2RlZmluZSBDUFNSX0ZMRwkyCi0jZGVmaW5lIFNQU1JfRkxHCTMKLSNkZWZpbmUgQ1BTUl9DVEwJNAotI2RlZmluZSBTUFNSX0NUTAk1Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX3BzciBwc3JzW10gPQotewotICAvKiBWYWxpZCA8cHNyPidzICovCi0gIHsiY3BzciIsCUNQU1JfQUxMfSwKLSAgeyJjcHNyX2FsbCIsCUNQU1JfQUxMfSwKLSAgeyJzcHNyIiwJU1BTUl9BTEx9LAotICB7InNwc3JfYWxsIiwJU1BTUl9BTEx9LAotCi0gIC8qIFZhbGlkIDxwc3JmPidzICovCi0gIHsiY3Bzcl9mbGciLAlDUFNSX0ZMR30sCi0gIHsic3Bzcl9mbGciLAlTUFNSX0ZMR30sCi0gIAotICAvKiBWYWxpZCA8cHNyYz4ncyAqLwotICB7ImNwc3JfYyIsCUNQU1JfQ1RMfSwKLSAgeyJjcHNyX2N0bCIsCUNQU1JfQ1RMfSwKLSAgeyJzcHNyX2MiLAlTUFNSX0NUTH0sCi0gIHsic3Bzcl9jdGwiLAlTUFNSX0NUTH0KLX07Ci0KLS8qIEZ1bmN0aW9ucyBjYWxsZWQgYnkgcGFyc2VyICovCi0vKiBBUk0gaW5zdHJ1Y3Rpb25zICovCi1zdGF0aWMgdm9pZCBkb19hcml0CQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2NtcAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19tb3YJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fbGRzdAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19sZG1zdG0JCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fYnJhbmNoCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX3N3aQkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci0vKiBQc2V1ZG8gT3AgY29kZXMgKi8JCQkgICAgICAgCQkgICAgICAKLXN0YXRpYyB2b2lkIGRvX2FkcgkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19hZHJsCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX25vcAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci0vKiBBUk0gMiAqLwkJCQkgICAgICAgCQkgICAgICAKLXN0YXRpYyB2b2lkIGRvX211bAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19tbGEJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotLyogQVJNIDMgKi8JCQkJICAgICAgIAkJICAgICAgCi1zdGF0aWMgdm9pZCBkb19zd2FwCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLS8qIEFSTSA2ICovCQkJCSAgICAgICAJCSAgICAgIAotc3RhdGljIHZvaWQgZG9fbXNyCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX21ycwkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci0vKiBBUk0gN00gKi8JCQkJICAgICAgIAkJICAgICAgCi1zdGF0aWMgdm9pZCBkb19tdWxsCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLS8qIEFSTSBUSFVNQiAqLwkJCQkgICAgICAgCQkgICAgICAKLXN0YXRpYyB2b2lkIGRvX2J4ICAgICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci0KLQkJCQkJICAgICAgIAkJICAgICAgCi0vKiBDb3Byb2Nlc3NvciBJbnN0cnVjdGlvbnMgKi8JCSAgICAgICAJCSAgICAgIAotc3RhdGljIHZvaWQgZG9fY2RwCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2xzdGMJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fY29fcmVnCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2N0cmwJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfbGRzdAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9sZG1zdG0JUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9keWFkaWMJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9tb25hZGljCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfY21wCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2Zyb21fcmVnCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfdG9fcmVnCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotCi1zdGF0aWMgdm9pZCBmaXhfbmV3X2FybQkJUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBzaG9ydCwgZXhwcmVzc2lvblMgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgYXJtX3JlZ19wYXJzZQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGFybV9wc3JfcGFyc2UJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgc3ltYm9sX2xvY2F0ZQlQQVJBTVMgKChzeW1ib2xTICosIENPTlNUIGNoYXIgKiwgc2VnVCwgdmFsdWVULCBmcmFnUyAqKSk7Ci1zdGF0aWMgaW50IGFkZF90b19saXRfcG9vbAlQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdW5zaWduZWQgdmFsaWRhdGVfaW1tZWRpYXRlIFBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgdW5zaWduZWQgdmFsaWRhdGVfaW1tZWRpYXRlX3R3b3BhcnQgUEFSQU1TICgodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGludCB2YWxpZGF0ZV9vZmZzZXRfaW1tCVBBUkFNUyAoKHVuc2lnbmVkIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcGNvZGVfc2VsZWN0CVBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgZW5kX29mX2xpbmUJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCByZWdfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcHNyX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgY29fcHJvY19udW1iZXIJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBjcF9vcGNfZXhwcgkJUEFSQU1TICgoY2hhciAqKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgY3BfcmVnX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGZwX3JlZ19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBjcF9hZGRyZXNzX29mZnNldAlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IG15X2dldF9mbG9hdF9leHByZXNzaW9uCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgc2tpcF9wYXN0X2NvbW1hCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgd2Fsa19ub19iaWdudW1zCVBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIGludCBuZWdhdGVfZGF0YV9vcAlQQVJBTVMgKCh1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgZGF0YV9vcDIJCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgZnBfb3AyCQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyByZWdfbGlzdAkJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgdGh1bWJfbG9hZF9zdG9yZQlQQVJBTVMgKChjaGFyICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGRlY29kZV9zaGlmdAkJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGxkc3RfZXh0ZW5kCQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHRodW1iX2FkZF9zdWIJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGluc2VydF9yZWcJCVBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgdGh1bWJfc2hpZnQJCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB0aHVtYl9tb3ZfY29tcGFyZQlQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgc2V0X2NvbnN0YW50X2Zsb251bXMJUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZhbHVlVCBtZF9jaGFyc190b19udW1iZXIJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGluc2VydF9yZWdfYWxpYXMJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIG91dHB1dF9pbnN0CQlQQVJBTVMgKCh2b2lkKSk7Ci0jaWZkZWYgT0JKX0VMRgotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQlhcm1fcGFyc2VfcmVsb2MgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLS8qIEFSTSBpbnN0cnVjdGlvbnMgdGFrZSA0Ynl0ZXMgaW4gdGhlIG9iamVjdCBmaWxlLCBUaHVtYiBpbnN0cnVjdGlvbnMKLSAgIHRha2UgMjogKi8KLSNkZWZpbmUgSU5TTl9TSVpFICAgICAgIDQKLQotLyogTE9OR0VTVF9JTlNUIGlzIHRoZSBsb25nZXN0IGJhc2ljIGluc3RydWN0aW9uIG5hbWUgd2l0aG91dCBjb25kaXRpb25zIG9yIAotICogZmxhZ3MuCi0gKiBBUk03TSBoYXMgNCBvZiBsZW5ndGggNQotICovCi0KLSNkZWZpbmUgTE9OR0VTVF9JTlNUIDUKLQotCi1zdHJ1Y3QgYXNtX29wY29kZSAKLXsKLSAgQ09OU1QgY2hhciAqICAgICAgICAgICB0ZW1wbGF0ZTsJLyogQmFzaWMgc3RyaW5nIHRvIG1hdGNoICovCi0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmFsdWU7CQkvKiBCYXNpYyBpbnN0cnVjdGlvbiBjb2RlICovCi0KLSAgLyogQ29tcHVsc29yeSBzdWZmaXggdGhhdCBtdXN0IGZvbGxvdyBjb25kcy4gSWYgIiIsIHRoZW4gdGhlCi0gICAgIGluc3RydWN0aW9uIGlzIG5vdCBjb25kaXRpb25hbCBhbmQgbXVzdCBoYXZlIG5vIHN1ZmZpeC4gKi8KLSAgQ09OU1QgY2hhciAqICAgICAgICAgICBjb21wX3N1ZmZpeDsJCi0KLSAgQ09OU1Qgc3RydWN0IGFzbV9mbGcgKiBmbGFnczsJICAgICAgICAvKiBCaXRzIHRvIHRvZ2dsZSBpZiBmbGFnICduJyBzZXQgKi8KLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2YXJpYW50czsJLyogV2hpY2ggQ1BVIHZhcmlhbnRzIHRoaXMgZXhpc3RzIGZvciAqLwotICAvKiBGdW5jdGlvbiB0byBjYWxsIHRvIHBhcnNlIGFyZ3MgKi8KLSAgdm9pZCAoKiAgICAgICAgICAgICAgICBwYXJtcykgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9vcGNvZGUgaW5zbnNbXSA9IAotewotLyogQVJNIEluc3RydWN0aW9ucyAqLwotICB7ImFuZCIsICAgMHgwMDAwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJlb3IiLCAgIDB4MDAyMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsic3ViIiwgICAweDAwNDAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InJzYiIsICAgMHgwMDYwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJhZGQiLCAgIDB4MDA4MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsiYWRjIiwgICAweDAwYTAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InNiYyIsICAgMHgwMGMwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJyc2MiLCAgIDB4MDBlMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsib3JyIiwgICAweDAxODAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7ImJpYyIsICAgMHgwMWMwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJ0c3QiLCAgIDB4MDEwMDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJ0ZXEiLCAgIDB4MDEyMDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJjbXAiLCAgIDB4MDE0MDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJjbW4iLCAgIDB4MDE2MDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJtb3YiLCAgIDB4MDFhMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fbW92fSwKLSAgeyJtdm4iLCAgIDB4MDFlMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fbW92fSwKLSAgeyJzdHIiLCAgIDB4MDQwMDAwMDAsIE5VTEwsICAgc3RyX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fbGRzdH0sCi0gIHsibGRyIiwgICAweDA0MTAwMDAwLCBOVUxMLCAgIGxkcl9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkc3R9LAotICB7InN0bSIsICAgMHgwODAwMDAwMCwgTlVMTCwgICBzdG1fZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZG1zdG19LAotICB7ImxkbSIsICAgMHgwODEwMDAwMCwgTlVMTCwgICBsZG1fZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZG1zdG19LAotICB7InN3aSIsICAgMHgwZjAwMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19zd2l9LAotICB7ImJsIiwgICAgMHgwYmZmZmZmZSwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19icmFuY2h9LAotICB7ImIiLCAgICAgMHgwYWZmZmZmZSwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19icmFuY2h9LAotCi0vKiBQc2V1ZG8gb3BzICovCi0gIHsiYWRyIiwgICAweDAyOGYwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2Fkcn0sCi0gIHsiYWRybCIsICAweDAyOGYwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2Fkcmx9LAotICB7Im5vcCIsICAgMHgwMWEwMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19ub3B9LAotCi0vKiBBUk0gMiBtdWx0aXBsaWVzICovCi0gIHsibXVsIiwgICAweDAwMDAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fMlVQLCAgICAgIGRvX211bH0sCi0gIHsibWxhIiwgICAweDAwMjAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fMlVQLCAgICAgIGRvX21sYX0sCi0KLS8qIEFSTSAzIC0gc3dwIGluc3RydWN0aW9ucyAqLwotICB7InN3cCIsICAgMHgwMTAwMDA5MCwgTlVMTCwgICBieXRlX2ZsYWcsICAgQVJNXzNVUCwgICAgICBkb19zd2FwfSwKLQotLyogQVJNIDYgQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gIHsibXJzIiwgICAweDAxMGYwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fNlVQLCAgICAgIGRvX21yc30sCi0gIHsibXNyIiwgICAweDAxMjBmMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fNlVQLCAgICAgIGRvX21zcn0sCi0vKiBTY290dEI6IG91ciBjb2RlIHVzZXMgMHgwMTI4ZjAwMCBmb3IgbXNyLgotICAgTmlja0M6ICBidXQgdGhpcyBpcyB3cm9uZyBiZWNhdXNlIHRoZSBiaXRzIDE2IGFuZCAxOSBhcmUgaGFuZGxlZAotICAgICAgICAgICBieSB0aGUgUFNSX3h4eCBkZWZpbmVzIGFib3ZlLiAgKi8KLQotLyogQVJNIDdNIGxvbmcgbXVsdGlwbGllcyAtIG5lZWQgc2lnbmVkL3Vuc2lnbmVkIGZsYWdzISAqLwotICB7InNtdWxsIiwgMHgwMGMwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKLSAgeyJ1bXVsbCIsIDB4MDA4MDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCi0gIHsic21sYWwiLCAweDAwZTAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotICB7InVtbGFsIiwgMHgwMGEwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKLQotLyogQVJNIFRIVU1CIGludGVyd29ya2luZyAqLwotICB7ImJ4IiwgICAgMHgwMTJmZmYxMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX1RIVU1CLCAgICBkb19ieH0sCi0KLS8qIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotICB7IndmcyIsICAgMHgwZTIwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKLSAgeyJyZnMiLCAgIDB4MGUzMDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCi0gIHsid2ZjIiwgICAweDBlNDAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7InJmYyIsICAgMHgwZTUwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKLSAgeyJsZGYiLCAgIDB4MGMxMDAxMDAsICJzZGVwIiwgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfbGRzdH0sCi0gIHsic3RmIiwgICAweDBjMDAwMTAwLCAic2RlcCIsIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2xkc3R9LAotICB7ImxmbSIsICAgMHgwYzEwMDIwMCwgTlVMTCwgICBsZm1fZmxhZ3MsICAgRlBVX01FTU1VTFRJLCBkb19mcF9sZG1zdG19LAotICB7InNmbSIsICAgMHgwYzAwMDIwMCwgTlVMTCwgICBzZm1fZmxhZ3MsICAgRlBVX01FTU1VTFRJLCBkb19mcF9sZG1zdG19LAotICB7Im12ZiIsICAgMHgwZTAwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJtbmYiLCAgIDB4MGUxMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYWJzIiwgICAweDBlMjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InJuZCIsICAgMHgwZTMwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJzcXQiLCAgIDB4MGU0MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibG9nIiwgICAweDBlNTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImxnbiIsICAgMHgwZTYwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJleHAiLCAgIDB4MGU3MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsic2luIiwgICAweDBlODA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImNvcyIsICAgMHgwZTkwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJ0YW4iLCAgIDB4MGVhMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYXNuIiwgICAweDBlYjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImFjcyIsICAgMHgwZWMwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhdG4iLCAgIDB4MGVkMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsidXJkIiwgICAweDBlZTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7Im5ybSIsICAgMHgwZWYwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhZGYiLCAgIDB4MGUwMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJzdWYiLCAgIDB4MGUyMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJyc2YiLCAgIDB4MGUzMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJtdWYiLCAgIDB4MGUxMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJkdmYiLCAgIDB4MGU0MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJyZGYiLCAgIDB4MGU1MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJwb3ciLCAgIDB4MGU2MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJycHciLCAgIDB4MGU3MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJybWYiLCAgIDB4MGU4MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJmbWwiLCAgIDB4MGU5MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJmZHYiLCAgIDB4MGVhMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJmcmQiLCAgIDB4MGViMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJwb2wiLCAgIDB4MGVjMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJjbWYiLCAgIDB4MGU5MGYxMTAsIE5VTEwsICAgZXhjZXB0X2ZsYWcsIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLSAgeyJjbmYiLCAgIDB4MGViMGYxMTAsIE5VTEwsICAgZXhjZXB0X2ZsYWcsIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLS8qIFRoZSBGUEExMCBkYXRhIHNoZWV0IHN1Z2dlc3RzIHRoYXQgdGhlICdFJyBvZiBjbWZlL2NuZmUgc2hvdWxkIG5vdAotICAgYmUgYW4gb3B0aW9uYWwgc3VmZml4LCBidXQgcGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUbyBiZSBjb21wYXRpYmxlLAotICAgd2UgYWNjZXB0IGVpdGhlci4gICovCi0gIHsiY21mZSIsICAweDBlZDBmMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2NtcH0sCi0gIHsiY25mZSIsICAweDBlZjBmMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2NtcH0sCi0gIHsiZmx0IiwgICAweDBlMDAwMTEwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2Zyb21fcmVnfSwKLSAgeyJmaXgiLCAgIDB4MGUxMDAxMTAsIE5VTEwsICAgZml4X2ZsYWdzLCAgIEZQVV9BTEwsICAgICAgZG9fZnBfdG9fcmVnfSwKLQotLyogR2VuZXJpYyBjb3ByZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gIHsiY2RwIiwgICAweDBlMDAwMDAwLCBOVUxMLCAgTlVMTCwgICAgICAgICBBUk1fMlVQLCAgICAgIGRvX2NkcH0sCi0gIHsibGRjIiwgICAweDBjMTAwMDAwLCBOVUxMLCAgY3Bsb25nX2ZsYWcsICBBUk1fMlVQLCAgICAgIGRvX2xzdGN9LAotICB7InN0YyIsICAgMHgwYzAwMDAwMCwgTlVMTCwgIGNwbG9uZ19mbGFnLCAgQVJNXzJVUCwgICAgICBkb19sc3RjfSwKLSAgeyJtY3IiLCAgIDB4MGUwMDAwMTAsIE5VTEwsICBOVUxMLCAgICAgICAgIEFSTV8yVVAsICAgICAgZG9fY29fcmVnfSwKLSAgeyJtcmMiLCAgIDB4MGUxMDAwMTAsIE5VTEwsICBOVUxMLCAgICAgICAgIEFSTV8yVVAsICAgICAgZG9fY29fcmVnfSwKLX07Ci0KLS8qIGRlZmluZXMgZm9yIHZhcmlvdXMgYml0cyB0aGF0IHdlIHdpbGwgd2FudCB0byB0b2dnbGUgKi8KLQotI2RlZmluZSBJTlNUX0lNTUVESUFURQkweDAyMDAwMDAwCi0jZGVmaW5lIE9GRlNFVF9SRUcJMHgwMjAwMDAwMAotI2RlZmluZSBIV09GRlNFVF9JTU0gICAgMHgwMDQwMDAwMAotI2RlZmluZSBTSElGVF9CWV9SRUcJMHgwMDAwMDAxMAotI2RlZmluZSBQUkVfSU5ERVgJMHgwMTAwMDAwMAotI2RlZmluZSBJTkRFWF9VUAkweDAwODAwMDAwCi0jZGVmaW5lIFdSSVRFX0JBQ0sJMHgwMDIwMDAwMAotI2RlZmluZSBMRE1fVFlQRV8yX09SXzMJMHgwMDQwMDAwMAotCi0jZGVmaW5lIExJVEVSQUxfTUFTSwkweGYwMDBmMDAwCi0jZGVmaW5lIENPTkRfTUFTSwkweGYwMDAwMDAwCi0jZGVmaW5lIE9QQ09ERV9NQVNLCTB4ZmUxZmZmZmYKLSNkZWZpbmUgREFUQV9PUF9TSElGVAkyMQotCi0vKiBDb2RlcyB0byBkaXN0aW5ndWlzaCB0aGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgKi8KLQotI2RlZmluZSBPUENPREVfQU5ECTAKLSNkZWZpbmUgT1BDT0RFX0VPUgkxCi0jZGVmaW5lIE9QQ09ERV9TVUIJMgotI2RlZmluZSBPUENPREVfUlNCCTMKLSNkZWZpbmUgT1BDT0RFX0FERAk0Ci0jZGVmaW5lIE9QQ09ERV9BREMJNQotI2RlZmluZSBPUENPREVfU0JDCTYKLSNkZWZpbmUgT1BDT0RFX1JTQwk3Ci0jZGVmaW5lIE9QQ09ERV9UU1QJOAotI2RlZmluZSBPUENPREVfVEVRCTkKLSNkZWZpbmUgT1BDT0RFX0NNUAkxMAotI2RlZmluZSBPUENPREVfQ01OCTExCi0jZGVmaW5lIE9QQ09ERV9PUlIJMTIKLSNkZWZpbmUgT1BDT0RFX01PVgkxMwotI2RlZmluZSBPUENPREVfQklDCTE0Ci0jZGVmaW5lIE9QQ09ERV9NVk4JMTUKLQotc3RhdGljIHZvaWQgZG9fdF9ub3AJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9hcml0CQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfYWRkCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfYXNyCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfYnJhbmNoOQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfYnJhbmNoMTIJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDIzCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9ieAkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2NvbXBhcmUJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xkbXN0bQkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xkcgkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xkcmIJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9sZHJoCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfbGRzCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfbHNsCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfbHNyCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfbW92CQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfcHVzaF9wb3AJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X3N0cgkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X3N0cmIJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9zdHJoCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3ViCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3dpCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfYWRyCQlQQVJBTVMgKChjaGFyICopKTsKLQotI2RlZmluZSBUX09QQ09ERV9NVUwgMHg0MzQwCi0jZGVmaW5lIFRfT1BDT0RFX1RTVCAweDQyMDAKLSNkZWZpbmUgVF9PUENPREVfQ01OIDB4NDJjMAotI2RlZmluZSBUX09QQ09ERV9ORUcgMHg0MjQwCi0jZGVmaW5lIFRfT1BDT0RFX01WTiAweDQzYzAKLQotI2RlZmluZSBUX09QQ09ERV9BRERfUjMJMHgxODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9SMyAweDFhMDAKLSNkZWZpbmUgVF9PUENPREVfQUREX0hJIDB4NDQwMAotI2RlZmluZSBUX09QQ09ERV9BRERfU1QgMHhiMDAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9TVCAweGIwODAKLSNkZWZpbmUgVF9PUENPREVfQUREX1NQIDB4YTgwMAotI2RlZmluZSBUX09QQ09ERV9BRERfUEMgMHhhMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9JOCAweDMwMDAKLSNkZWZpbmUgVF9PUENPREVfU1VCX0k4IDB4MzgwMAotI2RlZmluZSBUX09QQ09ERV9BRERfSTMgMHgxYzAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9JMyAweDFlMDAKLQotI2RlZmluZSBUX09QQ09ERV9BU1JfUgkweDQxMDAKLSNkZWZpbmUgVF9PUENPREVfTFNMX1IJMHg0MDgwCi0jZGVmaW5lIFRfT1BDT0RFX0xTUl9SICAweDQwYzAKLSNkZWZpbmUgVF9PUENPREVfQVNSX0kJMHgxMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xTTF9JCTB4MDAwMAotI2RlZmluZSBUX09QQ09ERV9MU1JfSQkweDA4MDAKLQotI2RlZmluZSBUX09QQ09ERV9NT1ZfSTgJMHgyMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9JOCAweDI4MDAKLSNkZWZpbmUgVF9PUENPREVfQ01QX0xSIDB4NDI4MAotI2RlZmluZSBUX09QQ09ERV9NT1ZfSFIgMHg0NjAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9IUiAweDQ1MDAKLQotI2RlZmluZSBUX09QQ09ERV9MRFJfUEMgMHg0ODAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9TUCAweDk4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1NQIDB4OTAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfSVcgMHg2ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9JVyAweDYwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX0lIIDB4ODgwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfSUggMHg4MDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9JQiAweDc4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX0lCIDB4NzAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfUlcgMHg1ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9SVyAweDUwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX1JIIDB4NWEwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfUkggMHg1MjAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9SQiAweDVjMDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1JCIDB4NTQwMAotCi0jZGVmaW5lIFRfT1BDT0RFX1BVU0gJMHhiNDAwCi0jZGVmaW5lIFRfT1BDT0RFX1BPUAkweGJjMDAKLQotI2RlZmluZSBUX09QQ09ERV9CUkFOQ0ggMHhlN2ZlCi0KLXN0YXRpYyBpbnQgdGh1bWJfcmVnCQlQQVJBTVMgKChjaGFyICoqIHN0ciwgaW50IGhpX2xvKSk7Ci0KLSNkZWZpbmUgVEhVTUJfU0laRQkyCS8qIFNpemUgb2YgdGh1bWIgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVEhVTUJfUkVHX0xPCTB4MQotI2RlZmluZSBUSFVNQl9SRUdfSEkJMHgyCi0jZGVmaW5lIFRIVU1CX1JFR19BTlkJMHgzCi0KLSNkZWZpbmUgVEhVTUJfSDEJMHgwMDgwCi0jZGVmaW5lIFRIVU1CX0gyCTB4MDA0MAotCi0jZGVmaW5lIFRIVU1CX0FTUiAwCi0jZGVmaW5lIFRIVU1CX0xTTCAxCi0jZGVmaW5lIFRIVU1CX0xTUiAyCi0KLSNkZWZpbmUgVEhVTUJfTU9WRSAwCi0jZGVmaW5lIFRIVU1CX0NPTVBBUkUgMQotCi0jZGVmaW5lIFRIVU1CX0xPQUQgMAotI2RlZmluZSBUSFVNQl9TVE9SRSAxCi0KLSNkZWZpbmUgVEhVTUJfUFBfUENfTFIgMHgwMTAwCi0KLS8qIFRoZXNlIHRocmVlIGFyZSB1c2VkIGZvciBpbW1lZGlhdGUgc2hpZnRzLCBkbyBub3QgYWx0ZXIgKi8KLSNkZWZpbmUgVEhVTUJfV09SRCAyCi0jZGVmaW5lIFRIVU1CX0hBTEZXT1JEIDEKLSNkZWZpbmUgVEhVTUJfQllURSAwCi0KLXN0cnVjdCB0aHVtYl9vcGNvZGUgCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7CS8qIEJhc2ljIHN0cmluZyB0byBtYXRjaCAqLwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwkJLyogQmFzaWMgaW5zdHJ1Y3Rpb24gY29kZSAqLwotICBpbnQgICAgICAgICAgIHNpemU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmFyaWFudHM7ICAgIC8qIFdoaWNoIENQVSB2YXJpYW50cyB0aGlzIGV4aXN0cyBmb3IgKi8KLSAgdm9pZCAoKiAgICAgICBwYXJtcykgUEFSQU1TICgoY2hhciAqKSk7ICAvKiBGdW5jdGlvbiB0byBjYWxsIHRvIHBhcnNlIGFyZ3MgKi8KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgdGh1bWJfb3Bjb2RlIHRpbnNuc1tdID0KLXsKLSAgeyJhZGMiLAkweDQxNDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsiYWRkIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FkZH0sCi0gIHsiYW5kIiwJMHg0MDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7ImFzciIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hc3J9LAotICB7ImIiLAkJVF9PUENPREVfQlJBTkNILCAyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoMTJ9LAotICB7ImJlcSIsCTB4ZDBmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJibmUiLAkweGQxZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmNzIiwJMHhkMmZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJocyIsCTB4ZDJmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJiY2MiLAkweGQzZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYnVsIiwJMHhkM2ZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJsbyIsCTB4ZDNmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJibWkiLAkweGQ0ZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYnBsIiwJMHhkNWZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJ2cyIsCTB4ZDZmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJidmMiLAkweGQ3ZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmhpIiwJMHhkOGZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJscyIsCTB4ZDlmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJiZ2UiLAkweGRhZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmx0IiwJMHhkYmZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJndCIsCTB4ZGNmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJibGUiLAkweGRkZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmljIiwJMHg0MzgwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7ImJsIiwJMHhmN2ZmZmZmZSwJNCwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDIzfSwKLSAgeyJieCIsCTB4NDcwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9ieH0sCi0gIHsiY21uIiwJVF9PUENPREVfQ01OLAkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsiY21wIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2NvbXBhcmV9LAotICB7ImVvciIsCTB4NDA0MCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJsZG1pYSIsCTB4YzgwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZG1zdG19LAotICB7ImxkciIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZHJ9LAotICB7ImxkcmIiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRyYn0sCi0gIHsibGRyaCIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZHJofSwKLSAgeyJsZHJzYiIsCTB4NTYwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZHN9LAotICB7ImxkcnNoIiwJMHg1ZTAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xkc30sCi0gIHsibGRzYiIsCTB4NTYwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZHN9LAotICB7Imxkc2giLAkweDVlMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRzfSwKLSAgeyJsc2wiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbHNsfSwKLSAgeyJsc3IiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbHNyfSwKLSAgeyJtb3YiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbW92fSwKLSAgeyJtdWwiLAlUX09QQ09ERV9NVUwsCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJtdm4iLAlUX09QQ09ERV9NVk4sCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJuZWciLAlUX09QQ09ERV9ORUcsCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJvcnIiLAkweDQzMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsicG9wIiwJMHhiYzAwLAkJMiwJQVJNX1RIVU1CLCBkb190X3B1c2hfcG9wfSwKLSAgeyJwdXNoIiwJMHhiNDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X3B1c2hfcG9wfSwKLSAgeyJyb3IiLAkweDQxYzAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsic2JjIiwJMHg0MTgwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7InN0bWlhIiwJMHhjMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xkbXN0bX0sCi0gIHsic3RyIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X3N0cn0sCi0gIHsic3RyYiIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9zdHJifSwKLSAgeyJzdHJoIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X3N0cmh9LAotICB7InN3aSIsCTB4ZGYwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9zd2l9LAotICB7InN1YiIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9zdWJ9LAotICB7InRzdCIsCVRfT1BDT0RFX1RTVCwJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICAvKiBQc2V1ZG8gb3BzOiAqLwotICB7ImFkciIsICAgICAgIDB4MDAwMCwgICAgICAgICAyLCAgICAgIEFSTV9USFVNQiwgZG9fdF9hZHJ9LAotICB7Im5vcCIsICAgICAgIDB4NDZDMCwgICAgICAgICAyLCAgICAgIEFSTV9USFVNQiwgZG9fdF9ub3B9LCAgICAgIC8qIG1vdiByOCxyOCAqLwotfTsKLQotc3RydWN0IHJlZ19lbnRyeQotewotICBDT05TVCBjaGFyICogbmFtZTsKLSAgaW50ICAgICAgICAgIG51bWJlcjsKLX07Ci0KLSNkZWZpbmUgaW50X3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDAgJiYgKHJlZykgPD0gMTUpCi0jZGVmaW5lIGNwX3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDMyICYmIChyZWcpIDw9IDQ3KQotI2RlZmluZSBmcF9yZWdpc3RlcihyZWcpICgocmVnKSA+PSAxNiAmJiAocmVnKSA8PSAyMykKLQotI2RlZmluZSBSRUdfUEMJMTUKLSNkZWZpbmUgUkVHX0xSICAxNAotI2RlZmluZSBSRUdfU1AgIDEzCi0KLS8qIFRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgbmFtZXM7ICBVc2VycyBjYW4gYWRkIGFsaWFzZXMgd2l0aCAucmVxICovCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHJlZ19lbnRyeSByZWdfdGFibGVbXSA9Ci17Ci0gIC8qIFByb2Nlc3NvciBSZWdpc3RlciBOdW1iZXJzICovCi0gIHsicjAiLCAwfSwgICAgeyJyMSIsIDF9LCAgICAgIHsicjIiLCAyfSwgICAgICB7InIzIiwgM30sCi0gIHsicjQiLCA0fSwgICAgeyJyNSIsIDV9LCAgICAgIHsicjYiLCA2fSwgICAgICB7InI3IiwgN30sCi0gIHsicjgiLCA4fSwgICAgeyJyOSIsIDl9LCAgICAgIHsicjEwIiwgMTB9LCAgICB7InIxMSIsIDExfSwKLSAgeyJyMTIiLCAxMn0sICB7InIxMyIsIFJFR19TUH0seyJyMTQiLCBSRUdfTFJ9LHsicjE1IiwgUkVHX1BDfSwKLSAgLyogQVBDUyBjb252ZW50aW9ucyAqLwotICB7ImExIiwgMH0sCXsiYTIiLCAxfSwgICAgeyJhMyIsIDJ9LCAgICAgeyJhNCIsIDN9LAotICB7InYxIiwgNH0sCXsidjIiLCA1fSwgICAgeyJ2MyIsIDZ9LCAgICAgeyJ2NCIsIDd9LCAgICAgeyJ2NSIsIDh9LAotICB7InY2IiwgOX0sCXsic2IiLCA5fSwgICAgeyJ2NyIsIDEwfSwgICAgeyJzbCIsIDEwfSwKLSAgeyJmcCIsIDExfSwJeyJpcCIsIDEyfSwgICB7InNwIiwgUkVHX1NQfSx7ImxyIiwgUkVHX0xSfSx7InBjIiwgUkVHX1BDfSwKLSAgLyogRlAgUmVnaXN0ZXJzICovCi0gIHsiZjAiLCAxNn0sICAgeyJmMSIsIDE3fSwgICB7ImYyIiwgMTh9LCAgIHsiZjMiLCAxOX0sCi0gIHsiZjQiLCAyMH0sICAgeyJmNSIsIDIxfSwgICB7ImY2IiwgMjJ9LCAgIHsiZjciLCAyM30sCi0gIHsiYzAiLCAzMn0sICAgeyJjMSIsIDMzfSwgICB7ImMyIiwgMzR9LCAgIHsiYzMiLCAzNX0sCi0gIHsiYzQiLCAzNn0sICAgeyJjNSIsIDM3fSwgICB7ImM2IiwgMzh9LCAgIHsiYzciLCAzOX0sCi0gIHsiYzgiLCA0MH0sICAgeyJjOSIsIDQxfSwgICB7ImMxMCIsIDQyfSwgIHsiYzExIiwgNDN9LAotICB7ImMxMiIsIDQ0fSwgIHsiYzEzIiwgNDV9LCAgeyJjMTQiLCA0Nn0sICB7ImMxNSIsIDQ3fSwKLSAgeyJjcjAiLCAzMn0sICB7ImNyMSIsIDMzfSwgIHsiY3IyIiwgMzR9LCAgeyJjcjMiLCAzNX0sCi0gIHsiY3I0IiwgMzZ9LCAgeyJjcjUiLCAzN30sICB7ImNyNiIsIDM4fSwgIHsiY3I3IiwgMzl9LAotICB7ImNyOCIsIDQwfSwgIHsiY3I5IiwgNDF9LCAgeyJjcjEwIiwgNDJ9LCB7ImNyMTEiLCA0M30sCi0gIHsiY3IxMiIsIDQ0fSwgeyJjcjEzIiwgNDV9LCB7ImNyMTQiLCA0Nn0sIHsiY3IxNSIsIDQ3fSwKLSAge05VTEwsIDB9Ci19OwotCi0jZGVmaW5lIEJBRF9BUkdTIAlfKCJCYWQgYXJndW1lbnRzIHRvIGluc3RydWN0aW9uIikKLSNkZWZpbmUgQkFEX1BDIAkJXygicjE1IG5vdCBhbGxvd2VkIGhlcmUiKQotI2RlZmluZSBCQURfRkxBR1MgCV8oIkluc3RydWN0aW9uIHNob3VsZCBub3QgaGF2ZSBmbGFncyIpCi0jZGVmaW5lIEJBRF9DT05EIAlfKCJJbnN0cnVjdGlvbiBpcyBub3QgY29uZGl0aW9uYWwiKQotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9vcHNfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3RvcHNfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX2NvbmRfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3NoaWZ0X2hzaCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9yZWdfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3Bzcl9oc2ggPSBOVUxMOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi0KLXN0YXRpYyB2b2lkIHNfcmVxIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYnNzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19ldmVuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19sdG9yZyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYXJtIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc190aHVtYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfY29kZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZm9yY2VfdGh1bWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3RodW1iX2Z1bmMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3RodW1iX3NldCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGFybV9zX3RleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcm1fc19kYXRhIFBBUkFNUyAoKGludCkpOwotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkIGFybV9zX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FybV9lbGZfY29ucyBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IG15X2dldF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICosIGNoYXIgKiopKTsKLQotQ09OU1QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAicmVxIiwgICAgICAgICBzX3JlcSwgICAgICAgICAwIH0sCS8qIE5ldmVyIGNhbGxlZCBiZWNhc3VlICcucmVxJyBkb2VzIG5vdCBzdGFydCBsaW5lICovCi0gIHsgImJzcyIsICAgICAgICAgc19ic3MsICAgICAgICAgMCB9LAotICB7ICJhbGlnbiIsICAgICAgIHNfYWxpZ24sICAgICAgIDAgfSwKLSAgeyAiYXJtIiwgICAgICAgICBzX2FybSwgICAgICAgICAwIH0sCi0gIHsgInRodW1iIiwgICAgICAgc190aHVtYiwgICAgICAgMCB9LAotICB7ICJjb2RlIiwgICAgICAgIHNfY29kZSwgICAgICAgIDAgfSwKLSAgeyAiZm9yY2VfdGh1bWIiLCBzX2ZvcmNlX3RodW1iLCAwIH0sCi0gIHsgInRodW1iX2Z1bmMiLCAgc190aHVtYl9mdW5jLCAgMCB9LAotICB7ICJ0aHVtYl9zZXQiLCAgIHNfdGh1bWJfc2V0LCAgIDAgfSwKLSAgeyAiZXZlbiIsICAgICAgICBzX2V2ZW4sICAgICAgICAwIH0sCi0gIHsgImx0b3JnIiwgICAgICAgc19sdG9yZywgICAgICAgMCB9LAotICB7ICJwb29sIiwgICAgICAgIHNfbHRvcmcsICAgICAgIDAgfSwKLSAgLyogQWxsb3cgZm9yIHRoZSBlZmZlY3Qgb2Ygc2VjdGlvbiBjaGFuZ2VzLiAgKi8KLSAgeyAidGV4dCIsICAgICAgICBhcm1fc190ZXh0LCAgICAwIH0sCi0gIHsgImRhdGEiLCAgICAgICAgYXJtX3NfZGF0YSwgICAgMCB9LAotI2lmZGVmIE9CSl9FTEYgIAotICB7ICJzZWN0aW9uIiwgICAgIGFybV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdGlvbi5zIiwgICBhcm1fc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QiLCAgICAgICAgYXJtX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0LnMiLCAgICAgIGFybV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAid29yZCIsICAgICAgICBzX2FybV9lbGZfY29ucywgNCB9LAotICB7ICJsb25nIiwgICAgICAgIHNfYXJtX2VsZl9jb25zLCA0IH0sCi0jZWxzZQotICB7ICJ3b3JkIiwgICAgICAgIGNvbnMsIDR9LAotI2VuZGlmCi0gIHsgImV4dGVuZCIsICAgICAgZmxvYXRfY29ucywgJ3gnIH0sCi0gIHsgImxkb3VibGUiLCAgICAgZmxvYXRfY29ucywgJ3gnIH0sCi0gIHsgInBhY2tlZCIsICAgICAgZmxvYXRfY29ucywgJ3AnIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi0vKiBTdHVmZiBuZWVkZWQgdG8gcmVzb2x2ZSB0aGUgbGFiZWwgYW1iaWd1aXR5Ci0gICBBczoKLSAgICAgLi4uCi0gICAgIGxhYmVsOiAgIDxpbnNuPgotICAgbWF5IGRpZmZlciBmcm9tOgotICAgICAuLi4KLSAgICAgbGFiZWw6Ci0gICAgICAgICAgICAgIDxpbnNuPgotKi8KLQotc3ltYm9sUyAqICBsYXN0X2xhYmVsX3NlZW47Ci1zdGF0aWMgaW50IGxhYmVsX2lzX3RodW1iX2Z1bmN0aW9uX25hbWUgPSBmYWxzZTsKLQotLyogTGl0ZXJhbCBzdHVmZiAqLwotCi0jZGVmaW5lIE1BWF9MSVRFUkFMX1BPT0xfU0laRSAxMDI0Ci0KLXR5cGVkZWYgc3RydWN0IGxpdGVyYWxTCi17Ci0gIHN0cnVjdCBleHByZXNzaW9uUyAgZXhwOwotICBzdHJ1Y3QgYXJtX2l0ICogICAgIGluc3Q7Ci19IGxpdGVyYWxUOwotCi1saXRlcmFsVCAgbGl0ZXJhbHNbTUFYX0xJVEVSQUxfUE9PTF9TSVpFXTsKLWludCAgICAgICBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA9IDA7IC8qIE5leHQgZnJlZSBlbnRyeSBpbiB0aGUgcG9vbCAqLwotaW50ICAgICAgIGxpdF9wb29sX251bSA9IDE7IC8qIE5leHQgbGl0ZXJhbCBwb29sIG51bWJlciAqLwotc3ltYm9sUyAqIGN1cnJlbnRfcG9vbFAgPSBOVUxMOwotCi1zdGF0aWMgaW50Ci1hZGRfdG9fbGl0X3Bvb2wgKCkKLXsKLSAgaW50IGxpdF9jb3VudCA9IDA7Ci0KLSAgaWYgKGN1cnJlbnRfcG9vbFAgPT0gTlVMTCkKLSAgICBjdXJyZW50X3Bvb2xQID0gc3ltYm9sX2NyZWF0ZSAoRkFLRV9MQUJFTF9OQU1FLCB1bmRlZmluZWRfc2VjdGlvbiwKLQkJCQkgICAodmFsdWVUKSAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIC8qIENoZWNrIGlmIHRoaXMgbGl0ZXJhbCB2YWx1ZSBpcyBhbHJlYWR5IGluIHRoZSBwb29sOiAqLwotICB3aGlsZSAobGl0X2NvdW50IDwgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UpCi0gICAgewotICAgICAgaWYgKGxpdGVyYWxzW2xpdF9jb3VudF0uZXhwLlhfb3AgPT0gaW5zdC5yZWxvYy5leHAuWF9vcAotICAgICAgICAgICYmIGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudAotICAgICAgICAgICYmIGxpdGVyYWxzW2xpdF9jb3VudF0uZXhwLlhfYWRkX251bWJlciA9PSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIKLSAgICAgICAgICAmJiBsaXRlcmFsc1tsaXRfY291bnRdLmV4cC5YX3Vuc2lnbmVkID09IGluc3QucmVsb2MuZXhwLlhfdW5zaWduZWQpCi0gICAgICAgIGJyZWFrOwotICAgICAgbGl0X2NvdW50Kys7Ci0gICAgfQotCi0gIGlmIChsaXRfY291bnQgPT0gbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UpIC8qIG5ldyBlbnRyeSAqLwotICAgIHsKLSAgICAgIGlmIChuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA+IE1BWF9MSVRFUkFMX1BPT0xfU0laRSkKLSAgICAgICAgewotICAgICAgICAgIGluc3QuZXJyb3IgPSBfKCJMaXRlcmFsIFBvb2wgT3ZlcmZsb3ciKTsKLSAgICAgICAgICByZXR1cm4gRkFJTDsKLSAgICAgICAgfQotCi0gICAgICBsaXRlcmFsc1tuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZV0uZXhwID0gaW5zdC5yZWxvYy5leHA7Ci0gICAgICBsaXRfY291bnQgPSBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSsrOwotICAgIH0KLQotICBpbnN0LnJlbG9jLmV4cC5YX29wID0gT19zeW1ib2w7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciA9IChsaXRfY291bnQpICogNCAtIDg7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCA9IGN1cnJlbnRfcG9vbFA7Ci0KLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0gCi0vKiBDYW4ndCB1c2Ugc3ltYm9sX25ldyBoZXJlLCBzbyBoYXZlIHRvIGNyZWF0ZSBhIHN5bWJvbCBhbmQgdGhlbiBhdAotICAgYSBsYXRlciBkYXRlIGFzc2lnbiBpdCBhIHZhbHVlLiBUaGF0cyB3aGF0IHRoZXNlIGZ1bmN0aW9ucyBkby4gICovCi1zdGF0aWMgdm9pZAotc3ltYm9sX2xvY2F0ZSAoc3ltYm9sUCwgbmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZykKLSAgICAgc3ltYm9sUyAqICAgIHN5bWJvbFA7IAotICAgICBDT05TVCBjaGFyICogbmFtZTsJCS8qIEl0IGlzIGNvcGllZCwgdGhlIGNhbGxlciBjYW4gbW9kaWZ5ICovCi0gICAgIHNlZ1QgICAgICAgICBzZWdtZW50OwkvKiBTZWdtZW50IGlkZW50aWZpZXIgKFNFR188c29tZXRoaW5nPikgKi8KLSAgICAgdmFsdWVUICAgICAgIHZhbHU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KLSAgICAgZnJhZ1MgKiAgICAgIGZyYWc7CQkvKiBBc3NvY2lhdGVkIGZyYWdtZW50ICovCi17Ci0gIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKLSAgY2hhciAqIHByZXNlcnZlZF9jb3B5X29mX25hbWU7Ci0KLSAgbmFtZV9sZW5ndGggPSBzdHJsZW4gKG5hbWUpICsgMTsgICAgICAvKiArMSBmb3IgXDAgKi8KLSAgb2JzdGFja19ncm93ICgmbm90ZXMsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKLSAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOwotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgaWYgKHByZXNlcnZlZF9jb3B5X29mX25hbWVbMF0gPT0gJ18nKQotICAgIHByZXNlcnZlZF9jb3B5X29mX25hbWUrKzsKLSNlbmRpZgotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHByZXNlcnZlZF9jb3B5X29mX25hbWUgPQotICAgIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAocHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7Ci0jZW5kaWYKLQotICBTX1NFVF9OQU1FIChzeW1ib2xQLCBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKTsKLQotICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzZWdtZW50KTsKLSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIHZhbHUpOwotICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyhzeW1ib2xQKTsKLQotICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWcpOwotCi0gIC8qIExpbmsgdG8gZW5kIG9mIHN5bWJvbCBjaGFpbi4gICovCi0gIHsKLSAgICBleHRlcm4gaW50IHN5bWJvbF90YWJsZV9mcm96ZW47Ci0gICAgaWYgKHN5bWJvbF90YWJsZV9mcm96ZW4pCi0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9sYXN0UCwgJiBzeW1ib2xfcm9vdFAsICYgc3ltYm9sX2xhc3RQKTsKLQotICBvYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLQotI2lmZGVmIHRjX3N5bWJvbF9uZXdfaG9vawotICB0Y19zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotI2VuZGlmCi0gCi0jaWZkZWYgREVCVUdfU1lNUwotICB2ZXJpZnlfc3ltYm9sX2NoYWluIChzeW1ib2xfcm9vdFAsIHN5bWJvbF9sYXN0UCk7Ci0jZW5kaWYgLyogREVCVUdfU1lNUyAqLwotfQotCi0vKiBDaGVjayB0aGF0IGFuIGltbWVkaWF0ZSBpcyB2YWxpZCwgYW5kIGlmIHNvLCBjb252ZXJ0IGl0IHRvIHRoZSByaWdodCBmb3JtYXQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci12YWxpZGF0ZV9pbW1lZGlhdGUgKHZhbCkKLSAgICAgdW5zaWduZWQgaW50IHZhbDsKLXsKLSAgdW5zaWduZWQgaW50IGE7Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSNkZWZpbmUgcm90YXRlX2xlZnQodiwgbikgKHYgPDwgbiB8IHYgPj4gKDMyIC0gbikpCi0gIAotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gMikKLSAgICBpZiAoKGEgPSByb3RhdGVfbGVmdCAodmFsLCBpKSkgPD0gMHhmZikKLSAgICAgIHJldHVybiBhIHwgKGkgPDwgNyk7IC8qIDEyLWJpdCBwYWNrOiBbc2hpZnQtY250LGNvbnN0XSAqLwotICAKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiBhbiBpbW1lZGlhdGUgY2FuIGJlIGNvbXB1dGVkIGFzIHR3byBzZXBlcmF0ZSBpbW1lZGlhdGUKLSAgIHZhbHVlcywgYWRkZWQgdG9nZXRoZXIuICBXZSBhbHJlYWR5IGtub3cgdGhhdCB0aGlzIHZhbHVlIGNhbm5vdCBiZQotICAgY29tcHV0ZWQgYnkganVzdCBvbmUgQVJNIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotdmFsaWRhdGVfaW1tZWRpYXRlX3R3b3BhcnQgKHZhbCwgaGlnaHBhcnQpCi0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci0gICAgIHVuc2lnbmVkIGludCAqIGhpZ2hwYXJ0OwotewotICB1bnNpZ25lZCBpbnQgYTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gMikKLSAgICBpZiAoKChhID0gcm90YXRlX2xlZnQgKHZhbCwgaSkpICYgMHhmZikgIT0gMCkKLSAgICAgIHsKLQlpZiAoYSAmIDB4ZmYwMCkKLQkgIHsKLQkgICAgaWYgKGEgJiB+IDB4ZmZmZikKLQkgICAgICBjb250aW51ZTsKLQkgICAgKiBoaWdocGFydCA9IChhICA+PiA4KSB8ICgoaSArIDI0KSA8PCA3KTsKLQkgIH0KLQllbHNlIGlmIChhICYgMHhmZjAwMDApCi0JICB7Ci0JICAgIGlmIChhICYgMHhmZjAwMDAwMCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICAqIGhpZ2hwYXJ0ID0gKGEgPj4gMTYpIHwgKChpICsgMTYpIDw8IDcpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNzZXJ0IChhICYgMHhmZjAwMDAwMCk7Ci0KLQkgICAgKiBoaWdocGFydCA9IChhID4+IDI0KSB8ICgoaSArIDgpIDw8IDcpOwotCSAgfQotCi0JcmV0dXJuIChhICYgMHhmZikgfCAoaSA8PCA3KTsKLSAgICAgIH0KLSAgCi0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWwsIGh3c2UpCi0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci0gICAgIGludCBod3NlOwotewotICBpZiAoKGh3c2UgJiYgdmFsID4gMjU1KSB8fCB2YWwgPiA0MDk1KQotICAgICByZXR1cm4gRkFJTDsKLSAgcmV0dXJuIHZhbDsKLX0KLQotICAgIAotc3RhdGljIHZvaWQKLXNfcmVxIChhKQotICAgICBpbnQgYTsKLXsKLSAgYXNfYmFkIChfKCJJbnZhbGlkIHN5bnRheCBmb3IgLnJlcSBkaXJlY3RpdmUuIikpOwotfQotCi1zdGF0aWMgdm9pZAotc19ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBwdXR0aW5nIGZyYWdzIGluIHRoZSBCU1Mgc2VnbWVudCwgd2UgZmFrZSBpdCBieQotICAgICBtYXJraW5nIGluX2JzcywgdGhlbiBsb29raW5nIGF0IHNfc2tpcCBmb3IgY2x1ZXM/Li4gKi8KLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19ldmVuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICghbmVlZF9wYXNzXzIpCQkvKiBOZXZlciBtYWtlIGZyYWcgaWYgZXhwZWN0IGV4dHJhIHBhc3MuICovCi0gICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0gIAotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2x0b3JnIChpZ25vcmVkKQotICAgICBpbnQgaWdub3JlZDsKLXsKLSAgaW50IGxpdF9jb3VudCA9IDA7Ci0gIGNoYXIgc3ltX25hbWVbMjBdOwotCi0gIGlmIChjdXJyZW50X3Bvb2xQID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIEFsaWduIHBvb2wgYXMgeW91IGhhdmUgd29yZCBhY2Nlc3NlcyAqLwotICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIGhhdmUgdG8gLi4uICovCi0gIGlmICghbmVlZF9wYXNzXzIpCi0gICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0KLSAgc3ByaW50ZiAoc3ltX25hbWUsICIkJGxpdF9cMDAyJXgiLCBsaXRfcG9vbF9udW0rKyk7Ci0KLSAgc3ltYm9sX2xvY2F0ZSAoY3VycmVudF9wb29sUCwgc3ltX25hbWUsIG5vd19zZWcsCi0JCSAodmFsdWVUKSBmcmFnX25vd19maXggKCksIGZyYWdfbm93KTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoY3VycmVudF9wb29sUCk7Ci0KLSAgQVJNX1NFVF9USFVNQiAoY3VycmVudF9wb29sUCwgdGh1bWJfbW9kZSk7Ci0gIAotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIEFSTV9TRVRfSU5URVJXT1JLIChjdXJyZW50X3Bvb2xQLCBzdXBwb3J0X2ludGVyd29yayk7Ci0jZW5kaWYKLSAgCi0gIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKLSAgICAvKiBGaXJzdCBvdXRwdXQgdGhlIGV4cHJlc3Npb24gaW4gdGhlIGluc3RydWN0aW9uIHRvIHRoZSBwb29sICovCi0gICAgZW1pdF9leHByICgmKGxpdGVyYWxzW2xpdF9jb3VudCsrXS5leHApLCA0KTsgLyogLndvcmQgKi8KLQotICBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA9IDA7Ci0gIGN1cnJlbnRfcG9vbFAgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotc19hbGlnbiAodW51c2VkKQkvKiBTYW1lIGFzIHNfYWxpZ25fcHR3byBidXQgYWxpZ24gMCA9PiBhbGlnbiAyICovCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLSAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAodGVtcCA+IG1heF9hbGlnbm1lbnQpCi0gICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgdGVtcCA9IG1heF9hbGlnbm1lbnQpOwotICBlbHNlIGlmICh0ZW1wIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkFsaWdubWVudCBuZWdhdGl2ZS4gMCBhc3N1bWVkLiIpKTsKLSAgICAgIHRlbXAgPSAwOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZW1wX2ZpbGwgPSAwOwotCi0gIGlmICghdGVtcCkKLSAgICB0ZW1wID0gMjsKLQotICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIEhBVkUgdG8uIC4gLiAqLwotICBpZiAodGVtcCAmJiAhbmVlZF9wYXNzXzIpCi0gICAgZnJhZ19hbGlnbiAodGVtcCwgKGludCkgdGVtcF9maWxsLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCB0ZW1wKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZm9yY2VfdGh1bWIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogSWYgd2UgYXJlIG5vdCBhbHJlYWR5IGluIHRodW1iIG1vZGUgZ28gaW50byBpdCwgRVZFTiBpZgotICAgICB0aGUgdGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRodW1iIGluc3RydWN0aW9ucy4KLSAgICAgVGhpcyBpcyB1c2VkIGJ5IGdjYy9jb25maWcvYXJtL2xpYjFmdW5jcy5hc20gZm9yIGV4YW1wbGUKLSAgICAgdG8gY29tcGlsZSBpbnRlcndvcmtpbmcgc3VwcG9ydCBmdW5jdGlvbnMgZXZlbiBpZiB0aGUKLSAgICAgdGFyZ2V0IHByb2Nlc3NvciBzaG91bGQgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nLiAgKi8KLSAgICAgCi0gIGlmICghIHRodW1iX21vZGUpCi0gICAgewotICAgICAgdGh1bWJfbW9kZSA9IDI7Ci0gICAgICAKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDEpOwotICAgIH0KLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3RodW1iX2Z1bmMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogVGhlIGZvbGxvd2luZyBsYWJlbCBpcyB0aGUgbmFtZS9hZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLgotICAgICBXZSBuZWVkIHRvIGtub3cgdGhpcyBmb3IgdGhlIGludGVyd29ya2luZyBzdXBwb3J0LiAgKi8KLQotICBsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lID0gdHJ1ZTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFBlcmZvcm0gYSAuc2V0IGRpcmVjdGl2ZSwgYnV0IGFsc28gbWFyayB0aGUgYWxpYXMgYXMKLSAgIGJlaW5nIGEgdGh1bWIgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc190aHVtYl9zZXQgKGVxdWl2KQotICAgICBpbnQgZXF1aXY7Ci17Ci0gIC8qIFhYWCB0aGUgZm9sbG93aW5nIGlzIGEgZHVwbGljYXRlIG9mIHRoZSBjb2RlIGZvciBzX3NldCgpIGluIHJlYWQuYwotICAgICBXZSBjYW5ub3QganVzdCBjYWxsIHRoYXQgY29kZSBhcyB3ZSBuZWVkIHRvIGdldCBhdCB0aGUgc3ltYm9sIHRoYXQKLSAgICAgaXMgY3JlYXRlZC4gICovCi0gIHJlZ2lzdGVyIGNoYXIgKiAgICBuYW1lOwotICByZWdpc3RlciBjaGFyICAgICAgZGVsaW07Ci0gIHJlZ2lzdGVyIGNoYXIgKiAgICBlbmRfbmFtZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqIHN5bWJvbFA7Ci0KLSAgLyoKLSAgICogRXNwZWNpYWwgYXBvbG9naWVzIGZvciB0aGUgcmFuZG9tIGxvZ2ljOgotICAgKiB0aGlzIGp1c3QgZ3JldywgYW5kIGNvdWxkIGJlIHBhcnNlZCBtdWNoIG1vcmUgc2ltcGx5IQotICAgKiBEZWFuIGluIGhhc3RlLgotICAgKi8KLSAgbmFtZSAgICAgID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBkZWxpbSAgICAgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZW5kX25hbWUgID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKmVuZF9uYW1lID0gMDsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAqZW5kX25hbWUgPSAwOwotCi0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgLyogWFhYIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbiB0byAudGh1bWJfc2V0ICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKSkgPT0gTlVMTAotICAgICAgJiYgKHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIC8qIFdoZW4gZG9pbmcgc3ltYm9sIGxpc3RpbmdzLCBwbGF5IGdhbWVzIHdpdGggZHVtbXkgZnJhZ21lbnRzIGxpdmluZwotCSBvdXRzaWRlIHRoZSBub3JtYWwgZnJhZ21lbnQgY2hhaW4gdG8gcmVjb3JkIHRoZSBmaWxlIGFuZCBsaW5lIGluZm8KLSAgICAgICAgIGZvciB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAobGlzdGluZyAmIExJU1RJTkdfU1lNQk9MUykKLQl7Ci0JICBleHRlcm4gc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKiBsaXN0aW5nX3RhaWw7Ci0JICBmcmFnUyAqIGR1bW15X2ZyYWcgPSAoZnJhZ1MgKikgeG1hbGxvYyAoc2l6ZW9mKGZyYWdTKSk7Ci0JICBtZW1zZXQgKGR1bW15X2ZyYWcsIDAsIHNpemVvZihmcmFnUykpOwotCSAgZHVtbXlfZnJhZy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBkdW1teV9mcmFnLT5saW5lID0gbGlzdGluZ190YWlsOwotCSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCBkdW1teV9mcmFnKTsKLQkgIGR1bW15X2ZyYWctPmZyX3N5bWJvbCA9IHN5bWJvbFA7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQkJCSAgICAKLSNpZmRlZiBPQkpfQ09GRgotICAgICAgLyogInNldCIgc3ltYm9scyBhcmUgbG9jYWwgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuICovCi0gICAgICBTRl9TRVRfTE9DQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0gICAgfQkJCQkvKiBtYWtlIGEgbmV3IHN5bWJvbCAqLwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotCi0gICogZW5kX25hbWUgPSBkZWxpbTsKLQotICBpZiAoZXF1aXYKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotICAgIGFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotICBwc2V1ZG9fc2V0IChzeW1ib2xQKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgLyogWFhYIE5vdyB3ZSBjb21lIHRvIHRoZSBUaHVtYiBzcGVjaWZpYyBiaXQgb2YgY29kZS4gICovCi0gIAotICBUSFVNQl9TRVRfRlVOQyAoc3ltYm9sUCwgMSk7Ci0gIEFSTV9TRVRfVEhVTUIgKHN5bWJvbFAsIDEpOwotI2lmIGRlZmluZWQgT0JKX0VMRiB8fCBkZWZpbmVkIE9CSl9DT0ZGCi0gIEFSTV9TRVRfSU5URVJXT1JLIChzeW1ib2xQLCBzdXBwb3J0X2ludGVyd29yayk7Ci0jZW5kaWYKLX0KLQotLyogSWYgd2UgY2hhbmdlIHNlY3Rpb24gd2UgbXVzdCBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgZmlyc3QuICAqLwotc3RhdGljIHZvaWQKLWFybV9zX3RleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uKQotICAgIHNfbHRvcmcgKDApOwotICAKLSAgc190ZXh0IChpZ25vcmUpOwotfQotCi1zdGF0aWMgdm9pZAotYXJtX3NfZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgaWYgKG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uKQotCXNfbHRvcmcgKDApOwotICAgIH0KLSAgZWxzZSBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24pCi0gICAgc19sdG9yZyAoMCk7Ci0gIAotICBzX2RhdGEgKGlnbm9yZSk7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZAotYXJtX3Nfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzX2x0b3JnICgwKTsKLQotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLW9wY29kZV9zZWxlY3QgKHdpZHRoKQotICAgICBpbnQgd2lkdGg7Ci17Ci0gIHN3aXRjaCAod2lkdGgpCi0gICAgewotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoISB0aHVtYl9tb2RlKQotCXsKLQkgIGlmICghIChjcHVfdmFyaWFudCAmIEFSTV9USFVNQikpCi0JICAgIGFzX2JhZCAoXygic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgVEhVTUIgb3Bjb2RlcyIpKTsKLQkgIHRodW1iX21vZGUgPSAxOwotICAgICAgICAgIC8qIE5vIG5lZWQgdG8gZm9yY2UgdGhlIGFsaWdubWVudCwgc2luY2Ugd2Ugd2lsbCBoYXZlIGJlZW4KLSAgICAgICAgICAgICBjb21pbmcgZnJvbSBBUk0gbW9kZSwgd2hpY2ggaXMgd29yZC1hbGlnbmVkLiAqLwotICAgICAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMjoKLSAgICAgIGlmICh0aHVtYl9tb2RlKQotCXsKLSAgICAgICAgICBpZiAoKGNwdV92YXJpYW50ICYgQVJNX0FOWSkgPT0gQVJNX1RIVU1CKQotCSAgICBhc19iYWQgKF8oInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IEFSTSBvcGNvZGVzIikpOwotCSAgdGh1bWJfbW9kZSA9IDA7Ci0gICAgICAgICAgaWYgKCFuZWVkX3Bhc3NfMikKLSAgICAgICAgICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotICAgICAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBpbnN0cnVjdGlvbiBzaXplIHNlbGVjdGVkICglZCkiKSwgd2lkdGgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYXJtIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG9wY29kZV9zZWxlY3QgKDMyKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfdGh1bWIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgb3Bjb2RlX3NlbGVjdCAoMTYpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19jb2RlICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3dpdGNoICh0ZW1wKQotICAgIHsKLSAgICBjYXNlIDE2OgotICAgIGNhc2UgMzI6Ci0gICAgICBvcGNvZGVfc2VsZWN0ICh0ZW1wKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kIHRvIC5jb2RlIGRpcmVjdGl2ZSAoJWQpIChleHBlY3RpbmcgMTYgb3IgMzIpIiksIHRlbXApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWVuZF9vZl9saW5lIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKiBzdHIgIT0gJ1wwJykKLSAgICBpbnN0LmVycm9yID0gXygiR2FyYmFnZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24iKTsKLX0KLQotc3RhdGljIGludAotc2tpcF9wYXN0X2NvbW1hIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBjaGFyICpwID0gKnN0ciwgYzsKLSAgaW50IGNvbW1hID0gMDsKLSAgICAKLSAgd2hpbGUgKChjID0gKnApID09ICcgJyB8fCBjID09ICcsJykKLSAgICB7Ci0gICAgICBwKys7Ci0gICAgICBpZiAoYyA9PSAnLCcgJiYgY29tbWErKykKLQlyZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ1wwJykKLSAgICByZXR1cm4gRkFJTDsKLQotICAqc3RyID0gcDsKLSAgcmV0dXJuIGNvbW1hID8gU1VDQ0VTUyA6IEZBSUw7Ci19Ci0KLS8qIEEgc3RhbmRhcmQgcmVnaXN0ZXIgbXVzdCBiZSBnaXZlbiBhdCB0aGlzIHBvaW50LgotICAgU2hpZnQgaXMgdGhlIHBsYWNlIHRvIHB1dCBpdCBpbiBpbnN0Lmluc3RydWN0aW9uLgotICAgUmVzdG9yZXMgaW5wdXQgc3RhcnQgcG9pbnQgb24gZXJyLgotICAgUmV0dXJucyB0aGUgcmVnIywgb3IgRkFJTC4gKi8KLQotc3RhdGljIGludAotcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgc2hpZnQpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHNoaWZ0OwotewotICBzdGF0aWMgY2hhciBidWZmIFsxMjhdOyAvKiBYWFggKi8KLSAgaW50ICAgIHJlZzsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLQotICBpZiAoKHJlZyA9IGFybV9yZWdfcGFyc2UgKHN0cikpICE9IEZBSUwgJiYgaW50X3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIGlmIChzaGlmdCA+PSAwKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHNoaWZ0OwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQsIHdlIG1heSBoYXZlIGdvdCBhIHJlZyBvZiB0aGUgd3JvbmcgY2xhc3MuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIAotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uICAqLwotICBzcHJpbnRmIChidWZmLCBfKCJSZWdpc3RlciBleHBlY3RlZCwgbm90ICclLjEwMHMnIiksIHN0YXJ0KTsKLSAgaW5zdC5lcnJvciA9IGJ1ZmY7Ci0KLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLXBzcl9yZXF1aXJlZF9oZXJlIChzdHIsIGNwc3IsIHNwc3IpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIGNwc3I7Ci0gICAgIGludCAgICAgc3BzcjsKLXsKLSAgaW50ICAgIHBzcjsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLSAgcHNyID0gYXJtX3Bzcl9wYXJzZSAoc3RyKTsKLSAgCi0gIGlmICAocHNyID09IGNwc3IgfHwgcHNyID09IHNwc3IpCi0gICAgewotICAgICAgaWYgKHBzciA9PSBzcHNyKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gMSA8PCAyMjsKLSAgICAgIAotICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgfQotCi0gIC8qIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSAgICAgdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbi4gICovCi0gIGluc3QuZXJyb3IgPSBfKCI8cHNyKGYpPiBleHBlY3RlZCIpOwotCi0gIC8qIFJlc3RvcmUgdGhlIHN0YXJ0IHBvaW50LiAgKi8KLSAgKnN0ciA9IHN0YXJ0OwotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotY29fcHJvY19udW1iZXIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGludCBwcm9jZXNzb3IsIHBjaGFyOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotCi0gIC8qIFRoZSBkYXRhIHNoZWV0IHNlZW1zIHRvIGltcGx5IHRoYXQganVzdCBhIG51bWJlciBvbiBpdHMgb3duIGlzIHZhbGlkCi0gICAgIGhlcmUsIGJ1dCB0aGUgUklTQyBpWCBhc3NlbWJsZXIgc2VlbXMgdG8gYWNjZXB0IGEgcHJlZml4ICdwJy4gIFdlIHdpbGwKLSAgICAgYWNjZXB0IGVpdGhlci4gICovCi0gIGlmICgqKnN0ciA9PSAncCcgfHwgKipzdHIgPT0gJ1AnKQotICAgICgqc3RyKSsrOwotCi0gIHBjaGFyID0gKigqc3RyKSsrOwotICBpZiAocGNoYXIgPj0gJzAnICYmIHBjaGFyIDw9ICc5JykKLSAgICB7Ci0gICAgICBwcm9jZXNzb3IgPSBwY2hhciAtICcwJzsKLSAgICAgIGlmICgqKnN0ciA+PSAnMCcgJiYgKipzdHIgPD0gJzknKQotCXsKLQkgIHByb2Nlc3NvciA9IHByb2Nlc3NvciAqIDEwICsgKigqc3RyKSsrIC0gJzAnOwotCSAgaWYgKHByb2Nlc3NvciA+IDE1KQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIklsbGVnYWwgY28tcHJvY2Vzc29yIG51bWJlciIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJCYWQgb3IgbWlzc2luZyBjby1wcm9jZXNzb3IgbnVtYmVyIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBwcm9jZXNzb3IgPDwgODsKLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX29wY19leHByIChzdHIsIHdoZXJlLCBsZW5ndGgpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cHI7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlICgqIHN0cik7Ci0KLSAgbWVtc2V0ICgmZXhwciwgJ1wwJywgc2l6ZW9mIChleHByKSk7Ci0KLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmZXhwciwgc3RyKSkKLSAgICByZXR1cm4gRkFJTDsKLSAgaWYgKGV4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJiYWQgb3IgbWlzc2luZyBleHByZXNzaW9uIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaWYgKChleHByLlhfYWRkX251bWJlciAmICgoMSA8PCBsZW5ndGgpIC0gMSkpICE9IGV4cHIuWF9hZGRfbnVtYmVyKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbW1lZGlhdGUgY28tcHJvY2Vzc29yIGV4cHJlc3Npb24gdG9vIGxhcmdlIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBleHByLlhfYWRkX251bWJlciA8PCB3aGVyZTsKLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX3JlZ19yZXF1aXJlZF9oZXJlIChzdHIsIHdoZXJlKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICB3aGVyZTsKLXsKLSAgaW50ICAgIHJlZzsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLQotICBpZiAoKHJlZyA9IGFybV9yZWdfcGFyc2UgKHN0cikpICE9IEZBSUwgJiYgY3BfcmVnaXN0ZXIgKHJlZykpCi0gICAgewotICAgICAgcmVnICY9IDE1OwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgd2hlcmU7Ci0gICAgICByZXR1cm4gcmVnOwotICAgIH0KLQotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uICAqLwotICBpbnN0LmVycm9yID0gXygiQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGV4cGVjdGVkIik7Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1mcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCB3aGVyZSkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgd2hlcmU7Ci17Ci0gIGludCByZWc7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0KLSAgaWYgKChyZWcgPSBhcm1fcmVnX3BhcnNlIChzdHIpKSAhPSBGQUlMICYmIGZwX3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIHJlZyAmPSA3OwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgd2hlcmU7Ci0gICAgICByZXR1cm4gcmVnOwotICAgIH0KLQotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uICAqLwotICBpbnN0LmVycm9yID0gXygiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgZXhwZWN0ZWQiKTsKLQotICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludC4gICovCi0gICpzdHIgPSBzdGFydDsKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX2FkZHJlc3Nfb2Zmc2V0IChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBpbnQgb2Zmc2V0OwotCi0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotCi0gIGlmICghIGlzX2ltbWVkaWF0ZV9wcmVmaXggKCoqc3RyKSkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiaW1tZWRpYXRlIGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICAoKnN0cikrKzsKLSAgCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgc3RyKSkKLSAgICByZXR1cm4gRkFJTDsKLSAgCi0gIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotICAgICAgCi0gICAgICBpZiAob2Zmc2V0ICYgMykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiY28tcHJvY2Vzc29yIGFkZHJlc3MgbXVzdCBiZSB3b3JkIGFsaWduZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLQotICAgICAgaWYgKG9mZnNldCA+IDEwMjMgfHwgb2Zmc2V0IDwgLTEwMjMpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIm9mZnNldCB0b28gbGFyZ2UiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLQotICAgICAgaWYgKG9mZnNldCA+PSAwKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5ERVhfVVA7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0ID0gLW9mZnNldDsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBvZmZzZXQgPj4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU07Ci0KLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqIHAgPSAqIHN0cjsKLSAgaW50ICAgIHByZV9pbmMgPSAwOwotICBpbnQgICAgd3JpdGVfYmFjayA9IDA7Ci0KLSAgaWYgKCpwID09ICdbJykKLSAgICB7Ci0gICAgICBpbnQgcmVnOwotCi0gICAgICBwKys7Ci0gICAgICBza2lwX3doaXRlc3BhY2UgKHApOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHAsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChwKTsKLQotICAgICAgaWYgKCpwID09ICddJykKLQl7Ci0JICBwKys7Ci0JICAKLQkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCYgcCkgPT0gU1VDQ0VTUykKLQkgICAgewotCSAgICAgIC8qIFtSbl0sICNleHByICovCi0JICAgICAgd3JpdGVfYmFjayA9IFdSSVRFX0JBQ0s7Ci0JICAgICAgCi0JICAgICAgaWYgKHJlZyA9PSBSRUdfUEMpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygicGMgbWF5IG5vdCBiZSB1c2VkIGluIHBvc3QtaW5jcmVtZW50Iik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIGlmIChjcF9hZGRyZXNzX29mZnNldCAoJiBwKSA9PSBGQUlMKQotCQlyZXR1cm4gRkFJTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwcmVfaW5jID0gUFJFX0lOREVYIHwgSU5ERVhfVVA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qICdbJ1JuLCAjZXhwciddJ1shXSAqLwotCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmIHApID09IEZBSUwpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIHByZV9pbmMgPSBQUkVfSU5ERVg7Ci0JICAKLQkgIGlmIChjcF9hZGRyZXNzX29mZnNldCAoJiBwKSA9PSBGQUlMKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgc2tpcF93aGl0ZXNwYWNlIChwKTsKLQotCSAgaWYgKCpwKysgIT0gJ10nKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIm1pc3NpbmcgXSIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIHNraXBfd2hpdGVzcGFjZSAocCk7Ci0KLQkgIGlmICgqcCA9PSAnIScpCi0JICAgIHsKLQkgICAgICBpZiAocmVnID09IFJFR19QQykKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJwYyBtYXkgbm90IGJlIHVzZWQgd2l0aCB3cml0ZS1iYWNrIik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIHArKzsKLQkgICAgICB3cml0ZV9iYWNrID0gV1JJVEVfQkFDSzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnApKQotCXJldHVybiBGQUlMOwotCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU07Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gODsgIC8qIFBDIHJlbCBhZGp1c3QgKi8KLSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJFR19QQyA8PCAxNik7Ci0gICAgICBwcmVfaW5jID0gUFJFX0lOREVYOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IHdyaXRlX2JhY2sgfCBwcmVfaW5jOwotICAqc3RyID0gcDsKLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19ub3AgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIERvIG5vdGhpbmcgcmVhbGx5LiAgKi8KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsgLyogVGhpcyBpcyBwb2ludGxlc3MuICAqLwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbXJzIChzdHIsIGZsYWdzKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIE9ubHkgb25lIHN5bnRheC4gICovCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0FMTCwgU1BTUl9BTEwpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIjxwc3I+IGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIFRocmVlIHBvc3NpYmxlIGZvcm1zOiAiPHBzcj4sIFJtIiwgIjxwc3JmPiwgUm0iLCAiPHBzcmY+LCAjZXhwcmVzc2lvbiIuICAqLwotc3RhdGljIHZvaWQKLWRvX21zciAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKHBzcl9yZXF1aXJlZF9oZXJlICgmc3RyLCBDUFNSX0FMTCwgU1BTUl9BTEwpID09IFNVQ0NFU1MpCi0gICAgewotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfQUxMOwotCi0gICAgICAvKiBTeXRheCBzaG91bGQgYmUgIjxwc3I+LCBSbSIgKi8KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLQkgIHx8IChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0ZMRywgU1BTUl9GTEcpID09IFNVQ0NFU1MpCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfRkxBR1M7Ci0gICAgICBlbHNlIGlmIChwc3JfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIENQU1JfQ1RMLCBTUFNSX0NUTCkgPT0gU1VDQ0VTUykKLQlpbnN0Lmluc3RydWN0aW9uIHw9IFBTUl9DT05UUk9MOwotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIAotICAgICAgLyogU3ludGF4IGNvdWxkIGJlICI8cHNyZj4sIHJtIiwgIjxwc3JmPiwgI2V4cHJlc3Npb24iICovCi0gICAgICAKLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAwKSkgIT0gRkFJTCkKLQk7Ci0gICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbi4gICovCi0gICAgICBlbHNlIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqIHN0cikpCi0JewotCSAgc3RyICsrOwotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0JICAKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIlJlZ2lzdGVyIG9yIHNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotCSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgdmFsdWUgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcik7Ci0JICAgICAgaWYgKHZhbHVlID09IEZBSUwpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBjb25zdGFudCIpOwotCQkgIHJldHVybjsKLQkJfQotCi0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSB2YWx1ZTsKLQkgICAgfQotCi0JICBmbGFncyB8PSBJTlNUX0lNTUVESUFURTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIkVycm9yOiB1bnJlY29nbmlzZWQgc3ludGF4IGZvciBzZWNvbmQgYXJndW1lbnQgdG8gbXNyIGluc3RydWN0aW9uIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpbnN0LmVycm9yID0gTlVMTDsgCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIExvbmcgTXVsdGlwbHkgUGFyc2VyCi0gICBVTVVMTCBSZExvLCBSZEhpLCBSbSwgUnMKLSAgIFNNVUxMIFJkTG8sIFJkSGksIFJtLCBScwotICAgVU1MQUwgUmRMbywgUmRIaSwgUm0sIFJzCi0gICBTTUxBTCBSZExvLCBSZEhpLCBSbSwgUnMKLSovICAgCi1zdGF0aWMgdm9pZAotZG9fbXVsbCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJkbG8sIHJkaGksIHJtLCByczsKLQotICAvKiBPbmx5IG9uZSBmb3JtYXQgInJkbG8sIHJkaGksIHJtLCBycyIgKi8KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmRsbyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocmRoaSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiByZGhpLCByZGxvIGFuZCBybSBtdXN0IGFsbCBiZSBkaWZmZXJlbnQgKi8KLSAgaWYgKHJkbG8gPT0gcmRoaSB8fCByZGxvID09IHJtIHx8IHJkaGkgPT0gcm0pCi0gICAgYXNfdHNrdHNrIChfKCJyZGhpLCByZGxvIGFuZCBybSBtdXN0IGFsbCBiZSBkaWZmZXJlbnQiKSk7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJzID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDgpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJkaGkgPT0gUkVHX1BDIHx8IHJkaGkgPT0gUkVHX1BDIHx8IHJkaGkgPT0gUkVHX1BDIHx8IHJkaGkgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tdWwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmQsIHJtOwotICAKLSAgLyogT25seSBvbmUgZm9ybWF0ICJyZCwgcm0sIHJzIiAqLwotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChyZCA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmQgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChybSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IHJkKQotICAgIGFzX3Rza3RzayAoXygicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbXVsIikpOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA4KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChybSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX21sYSAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZCwgcm07Ci0KLSAgLyogT25seSBvbmUgZm9ybWF0ICJyZCwgcm0sIHJzLCBybiIgKi8KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmQgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJkID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChybSA9PSByZCkKLSAgICBhc190c2t0c2sgKF8oInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG1sYSIpKTsKLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocmQgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgOCkpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZCA9PSBSRUdfUEMgfHwgcm0gPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIFJldHVybnMgdGhlIGluZGV4IGludG8gZnBfdmFsdWVzIG9mIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBvciAtMSBpZgotICAgbm90IGluIHRoZSB0YWJsZS4gICovCi1zdGF0aWMgaW50Ci1teV9nZXRfZmxvYXRfZXhwcmVzc2lvbiAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBjaGFyICogICAgICAgICBzYXZlX2luOwotICBleHByZXNzaW9uUyAgICBleHA7Ci0gIGludCAgICAgICAgICAgIGk7Ci0gIGludCAgICAgICAgICAgIGo7Ci0KLSAgbWVtc2V0ICh3b3JkcywgMCwgTUFYX0xJVFRMRU5VTVMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gIC8qIExvb2sgZm9yIGEgcmF3IGZsb2F0aW5nIHBvaW50IG51bWJlciAqLwotICBpZiAoKHNhdmVfaW4gPSBhdG9mX2llZWUgKCpzdHIsICd4Jywgd29yZHMpKSAhPSBOVUxMCi0gICAgICAmJiAoaXNfZW5kX29mX2xpbmUgWyhpbnQpKCpzYXZlX2luKV0gfHwgKnNhdmVfaW4gPT0gJ1wwJykpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9GTE9BVF9WQUxTOyBpKyspCi0JewotCSAgZm9yIChqID0gMDsgaiA8IE1BWF9MSVRUTEVOVU1TOyBqKyspCi0JICAgIHsKLQkgICAgICBpZiAod29yZHNbal0gIT0gZnBfdmFsdWVzW2ldW2pdKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAoaiA9PSBNQVhfTElUVExFTlVNUykKLQkgICAgewotCSAgICAgICpzdHIgPSBzYXZlX2luOwotCSAgICAgIHJldHVybiBpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUcnkgYW5kIHBhcnNlIGEgbW9yZSBjb21wbGV4IGV4cHJlc3Npb24sIHRoaXMgd2lsbCBwcm9iYWJseSBmYWlsCi0gICAgIHVubGVzcyB0aGUgY29kZSB1c2VzIGEgZmxvYXRpbmcgcG9pbnQgcHJlZml4IChlZyAiMGYiKSAqLwotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RyOwotICBpZiAoZXhwcmVzc2lvbiAoJmV4cCkgPT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgJiYgZXhwLlhfb3AgPT0gT19iaWcKLSAgICAgICYmIGV4cC5YX2FkZF9udW1iZXIgPCAwKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiA1ID0gWF9QUkVDSVNJT04sIHNob3VsZCBiZSAjZGVmaW5lJ2Qgd2hlcmUgd2UgY2FuIHVzZSBpdC4KLQkgRGl0dG8gZm9yIDE1LiAgKi8KLSAgICAgIGlmIChnZW5fdG9fd29yZHMgKHdvcmRzLCA1LCAobG9uZykxNSkgPT0gMCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKLQkgICAgewotCSAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfTElUVExFTlVNUzsgaisrKQotCQl7Ci0JCSAgaWYgKHdvcmRzW2pdICE9IGZwX3ZhbHVlc1tpXVtqXSkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAoaiA9PSBNQVhfTElUVExFTlVNUykKLQkJewotCQkgICpzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLQkJICByZXR1cm4gaTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGFueXRoaW5nIGluIHRoZSBleHByZXNzaW9uIGlzIGEgYmlnbnVtICovCi1zdGF0aWMgaW50Ci13YWxrX25vX2JpZ251bXMgKHNwKQotICAgICBzeW1ib2xTICogc3A7Ci17Ci0gIGlmIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHNwKS0+WF9vcCA9PSBPX2JpZykKLSAgICByZXR1cm4gMTsKLQotICBpZiAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzcCktPlhfYWRkX3N5bWJvbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKHdhbGtfbm9fYmlnbnVtcyAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzcCktPlhfYWRkX3N5bWJvbCkKLQkgICAgICB8fCAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzcCktPlhfb3Bfc3ltYm9sCi0JCSAgJiYgd2Fsa19ub19iaWdudW1zIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHNwKS0+WF9vcF9zeW1ib2wpKSk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1teV9nZXRfZXhwcmVzc2lvbiAoZXAsIHN0cikKLSAgICAgZXhwcmVzc2lvblMgKiBlcDsKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGNoYXIgKiBzYXZlX2luOwotICBzZWdUICAgc2VnOwotICAKLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cjsKLSAgc2VnID0gZXhwcmVzc2lvbiAoZXApOwotCi0jaWZkZWYgT0JKX0FPVVQKLSAgaWYgKHNlZyAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdGV4dF9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gZGF0YV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gYnNzX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiYmFkX3NlZ21lbnQiKTsKLSAgICAgICpzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogR2V0IHJpZCBvZiBhbnkgYmlnbnVtcyBub3csIHNvIHRoYXQgd2UgZG9uJ3QgZ2VuZXJhdGUgYW4gZXJyb3IgZm9yIHdoaWNoCi0gICAgIHdlIGNhbid0IGVzdGFibGlzaCBhIGxpbmUgbnVtYmVyIGxhdGVyIG9uLiAgQmlnIG51bWJlcnMgYXJlIG5ldmVyIHZhbGlkCi0gICAgIGluIGluc3RydWN0aW9ucywgd2hpY2ggaXMgd2hlcmUgdGhpcyByb3V0aW5lIGlzIGFsd2F5cyBjYWxsZWQuICAqLwotICBpZiAoZXAtPlhfb3AgPT0gT19iaWcKLSAgICAgIHx8IChlcC0+WF9hZGRfc3ltYm9sCi0JICAmJiAod2Fsa19ub19iaWdudW1zIChlcC0+WF9hZGRfc3ltYm9sKQotCSAgICAgIHx8IChlcC0+WF9vcF9zeW1ib2wKLQkJICAmJiB3YWxrX25vX2JpZ251bXMgKGVwLT5YX29wX3N5bWJvbCkpKSkpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLSAgICAgICpzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICpzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAwOwotfQotCi0vKiB1bnJlc3RyaWN0IHNob3VsZCBiZSBvbmUgaWYgPHNoaWZ0PiA8cmVnaXN0ZXI+IGlzIHBlcm1pdHRlZCBmb3IgdGhpcwotICAgaW5zdHJ1Y3Rpb24gKi8KLQotc3RhdGljIGludAotZGVjb2RlX3NoaWZ0IChzdHIsIHVucmVzdHJpY3QpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHVucmVzdHJpY3Q7Ci17Ci0gIHN0cnVjdCBhc21fc2hpZnQgKiBzaGZ0OwotICBjaGFyICogcDsKLSAgY2hhciAgIGM7Ci0gICAgCi0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotICAgIAotICBmb3IgKHAgPSAqc3RyOyBpc2FscGhhICgqcCk7IHArKykKLSAgICA7Ci0KLSAgaWYgKHAgPT0gKnN0cikKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiU2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGMgPSAqcDsKLSAgKnAgPSAnXDAnOwotICBzaGZ0ID0gKHN0cnVjdCBhc21fc2hpZnQgKikgaGFzaF9maW5kIChhcm1fc2hpZnRfaHNoLCAqc3RyKTsKLSAgKnAgPSBjOwotICBpZiAoc2hmdCkKLSAgICB7Ci0gICAgICBpZiAoIXN0cm5jbXAgKCpzdHIsICJycngiLCAzKQotICAgICAgICAgIHx8ICFzdHJuY21wICgqc3RyLCAiUlJYIiwgMykpCi0JewotCSAgKnN0ciA9IHA7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHNoZnQtPnZhbHVlOwotCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JfQotCi0gICAgICBza2lwX3doaXRlc3BhY2UgKHApOwotICAgICAgCi0gICAgICBpZiAodW5yZXN0cmljdCAmJiByZWdfcmVxdWlyZWRfaGVyZSAoJnAsIDgpICE9IEZBSUwpCi0JewotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGZ0LT52YWx1ZSB8IFNISUZUX0JZX1JFRzsKLQkgICpzdHIgPSBwOwotCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKiBwKSkKLQl7Ci0JICBpbnN0LmVycm9yID0gTlVMTDsKLQkgIHArKzsKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmcCkpCi0JICAgIHJldHVybiBGQUlMOwotCi0JICAvKiBWYWxpZGF0ZSBzb21lIHNpbXBsZSAjZXhwcmVzc2lvbnMgKi8KLQkgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBudW0gPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgICAgICAvKiBSZWplY3Qgb3BlcmF0aW9ucyBncmVhdGVyIHRoYW4gMzIsIG9yIGxzbCAjMzIgKi8KLQkgICAgICBpZiAobnVtID4gMzIgfHwgKG51bSA9PSAzMiAmJiBzaGZ0LT52YWx1ZSA9PSAwKSkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGltbWVkaWF0ZSBzaGlmdCIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICAvKiBTaGlmdHMgb2YgemVybyBzaG91bGQgYmUgY29udmVydGVkIHRvIGxzbCAod2hpY2ggaXMgemVybykqLwotCSAgICAgIGlmIChudW0gPT0gMCkKLQkJewotCQkgICpzdHIgPSBwOwotCQkgIHJldHVybiBTVUNDRVNTOwotCQl9Ci0KLQkgICAgICAvKiBTaGlmdHMgb2YgMzIgYXJlIGVuY29kZWQgYXMgMCwgZm9yIHRob3NlIHNoaWZ0cyB0aGF0Ci0JCSBzdXBwb3J0IGl0LiAgKi8KLQkgICAgICBpZiAobnVtID09IDMyKQotCQludW0gPSAwOwotCi0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAobnVtIDw8IDcpIHwgc2hmdC0+dmFsdWU7Ci0JICAgICAgKnN0ciA9IHA7Ci0JICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JICAgIH0KLQotCSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9TSElGVF9JTU07Ci0JICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHNoZnQtPnZhbHVlOwotCSAgKnN0ciA9IHA7Ci0JICByZXR1cm4gU1VDQ0VTUzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zdC5lcnJvciA9IHVucmVzdHJpY3QgPyBfKCJzaGlmdCByZXF1aXJlcyByZWdpc3RlciBvciAjZXhwcmVzc2lvbiIpCi0JICAgIDogXygic2hpZnQgcmVxdWlyZXMgI2V4cHJlc3Npb24iKTsKLQkgICpzdHIgPSBwOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotICAgIH0KLQotICBpbnN0LmVycm9yID0gXygiU2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICByZXR1cm4gRkFJTDsKLX0KLQotLyogRG8gdGhvc2UgZGF0YV9vcHMgd2hpY2ggY2FuIHRha2UgYSBuZWdhdGl2ZSBpbW1lZGlhdGUgY29uc3RhbnQgKi8KLS8qIGJ5IGFsdGVyaW5nIHRoZSBpbnN0dWN0aW9uLiBBIGJpdCBvZiBhIGhhY2sgcmVhbGx5ICovCi0vKiAgICAgIE1PViA8LT4gTVZOCi0gICAgICAgIEFORCA8LT4gQklDCi0gICAgICAgIEFEQyA8LT4gU0JDCi0gICAgICAgIGJ5IGludmVydGluZyB0aGUgc2Vjb25kIG9wZXJhbmQsIGFuZAotICAgICAgICBBREQgPC0+IFNVQgotICAgICAgICBDTVAgPC0+IENNTgotICAgICAgICBieSBuZWdhdGluZyB0aGUgc2Vjb25kIG9wZXJhbmQuCi0qLwotc3RhdGljIGludAotbmVnYXRlX2RhdGFfb3AgKGluc3RydWN0aW9uLCB2YWx1ZSkKLSAgICAgdW5zaWduZWQgbG9uZyAqIGluc3RydWN0aW9uOwotICAgICB1bnNpZ25lZCBsb25nICAgdmFsdWU7Ci17Ci0gIGludCBvcCwgbmV3X2luc3Q7Ci0gIHVuc2lnbmVkIGxvbmcgbmVnYXRlZCwgaW52ZXJ0ZWQ7Ci0KLSAgbmVnYXRlZCA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAoLXZhbHVlKTsKLSAgaW52ZXJ0ZWQgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKH52YWx1ZSk7Ci0KLSAgb3AgPSAoKmluc3RydWN0aW9uID4+IERBVEFfT1BfU0hJRlQpICYgMHhmOwotICBzd2l0Y2ggKG9wKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IG5lZ2F0ZXMgKi8KLSAgICBjYXNlIE9QQ09ERV9TVUI6ICAgICAgICAgICAgIC8qIEFERCA8LT4gU1VCICovCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9BREQ7Ci0gICAgICB2YWx1ZSA9IG5lZ2F0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0FERDogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9TVUI7ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IG5lZ2F0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0NNUDogICAgICAgICAgICAgLyogQ01QIDwtPiBDTU4gKi8KLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0NNTjsKLSAgICAgIHZhbHVlID0gbmVnYXRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQ01OOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0NNUDsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gbmVnYXRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBOb3cgSW52ZXJ0ZWQgb3BzICovCi0gICAgY2FzZSBPUENPREVfTU9WOiAgICAgICAgICAgICAvKiBNT1YgPC0+IE1WTiAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfTVZOOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfTVZOOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX01PVjsKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0FORDogICAgICAgICAgICAgLyogQU5EIDwtPiBCSUMgKi8gCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9CSUM7ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9CSUM6IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfQU5EOwotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQURDOiAgICAgICAgICAgICAgLyogQURDIDwtPiBTQkMgKi8KLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX1NCQzsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX1NCQzogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9BREM7Ci0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFdlIGNhbm5vdCBkbyBhbnl0aGluZyAqLwotICAgIGRlZmF1bHQ6ICAKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBpZiAodmFsdWUgPT0gRkFJTCkKLSAgICByZXR1cm4gRkFJTDsKLQotICAqaW5zdHJ1Y3Rpb24gJj0gT1BDT0RFX01BU0s7Ci0gICppbnN0cnVjdGlvbiB8PSBuZXdfaW5zdCA8PCBEQVRBX09QX1NISUZUOwotICByZXR1cm4gdmFsdWU7IAotfQotCi1zdGF0aWMgaW50Ci1kYXRhX29wMiAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgaW50IHZhbHVlOwotICBleHByZXNzaW9uUyBleHByOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotICAgIAotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgIT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hIChzdHIpID09IFNVQ0NFU1MpCi0JLyogU2hpZnQgb3BlcmF0aW9uIG9uIHJlZ2lzdGVyLiAgKi8KLQlyZXR1cm4gZGVjb2RlX3NoaWZ0IChzdHIsIE5PX1NISUZUX1JFU1RSSUNUKTsKLQotICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqKnN0cikpCi0JewotCSAgKCpzdHIpKys7Ci0JICBpbnN0LmVycm9yID0gTlVMTDsKLQkgIAotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsIHN0cikpCi0JICAgIHJldHVybiBGQUlMOwotCi0JICBpZiAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQotCSAgICB7Ci0JICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU7Ci0JICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hIChzdHIpID09IFNVQ0NFU1MpCi0JCXsKLQkJICAvKiAjeCwgeSAtLSBpZSBleHBsaWNpdCByb3RhdGlvbiBieSBZICAqLwotCQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsIHN0cikpCi0JCSAgICByZXR1cm4gRkFJTDsKLQotCQkgIGlmIChleHByLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0gCi0JCSAgLyogUm90YXRlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyICovCi0JCSAgaWYgKCgodW5zaWduZWQpIGV4cHIuWF9hZGRfbnVtYmVyKSA+IDMwCi0JCSAgICAgIHx8IChleHByLlhfYWRkX251bWJlciAmIDEpICE9IDAKLQkJICAgICAgfHwgKCh1bnNpZ25lZCkgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKSA+IDI1NSkKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBJTlNUX0lNTUVESUFURTsKLQkJICBpbnN0Lmluc3RydWN0aW9uIHw9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQkJICBpbnN0Lmluc3RydWN0aW9uIHw9IGV4cHIuWF9hZGRfbnVtYmVyIDw8IDc7Ci0JCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JCX0KLQotCSAgICAgIC8qIEltcGxpY2l0IHJvdGF0aW9uLCBzZWxlY3QgYSBzdWl0YWJsZSBvbmUgICovCi0JICAgICAgdmFsdWUgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcik7Ci0KLQkgICAgICBpZiAodmFsdWUgPT0gRkFJTCkKLQkJewotCQkgIC8qIENhbid0IGJlIGRvbmUsIHBlcmhhcHMgdGhlIGNvZGUgcmVhZHMgc29tZXRoaW5nIGxpa2UKLQkJICAgICAiYWRkIFJkLCBSbiwgIy1uIiwgd2hlcmUgInN1YiBSZCwgUm4sICNuIiB3b3VsZCBiZSBvayAqLwotCQkgIGlmICgodmFsdWUgPSBuZWdhdGVfZGF0YV9vcCAoJmluc3QuaW5zdHJ1Y3Rpb24sCi0JCQkJCSAgICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpKQotCQkgICAgICA9PSBGQUlMKQotCQkgICAgewotCQkgICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBjb25zdGFudCIpOwotCQkgICAgICByZXR1cm4gRkFJTDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSB2YWx1ZTsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IElOU1RfSU1NRURJQVRFOwotCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JfQotCi0gICAgICAoKnN0cikrKzsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWZwX29wMiAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlICgqIHN0cik7Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApICE9IEZBSUwpCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbiAqLwotICAgICAgaWYgKCooKCpzdHIpKyspID09ICcjJykKLQl7Ci0JICBpbnQgaTsKLQotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0KLQkgIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotCi0JICAvKiBGaXJzdCB0cnkgYW5kIG1hdGNoIGV4YWN0IHN0cmluZ3MsIHRoaXMgaXMgdG8gZ3VhcmFudGVlIHRoYXQKLQkgICAgIHNvbWUgZm9ybWF0cyB3aWxsIHdvcmsgZXZlbiBmb3IgY3Jvc3MgYXNzZW1ibHkgKi8KLQotCSAgZm9yIChpID0gMDsgZnBfY29uc3RbaV07IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJuY21wICgqc3RyLCBmcF9jb25zdFtpXSwgc3RybGVuIChmcF9jb25zdFtpXSkpID09IDApCi0JCXsKLQkJICBjaGFyICpzdGFydCA9ICpzdHI7Ci0KLQkJICAqc3RyICs9IHN0cmxlbiAoZnBfY29uc3RbaV0pOwotCQkgIGlmIChpc19lbmRfb2ZfbGluZVsoaW50KSoqc3RyXSB8fCAqKnN0ciA9PSAnXDAnKQotCQkgICAgewotCQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGkgKyA4OwotCQkgICAgICByZXR1cm4gU1VDQ0VTUzsKLQkJICAgIH0KLQkJICAqc3RyID0gc3RhcnQ7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBKdXN0IGJlY2F1c2Ugd2UgZGlkbid0IGdldCBhIG1hdGNoIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZQotCSAgICAgY29uc3RhbnQgaXNuJ3QgdmFsaWQsIGp1c3QgdGhhdCBpdCBpcyBpbiBhIGZvcm1hdCB0aGF0IHdlCi0JICAgICBkb24ndCBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZS4gIFRyeSBwYXJzaW5nIGl0IHdpdGgKLQkgICAgIHRoZSBzdGFuZGFyZCBleHByZXNzaW9uIHJvdXRpbmVzLiAgKi8KLQkgIGlmICgoaSA9IG15X2dldF9mbG9hdF9leHByZXNzaW9uIChzdHIpKSA+PSAwKQotCSAgICB7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpICsgODsKLQkgICAgICByZXR1cm4gU1VDQ0VTUzsKLQkgICAgfQotCi0JICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgZXhwcmVzc2lvbiIpOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotICAgICAgaW5zdC5lcnJvciA9IF8oIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9yIGltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19hcml0IChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19hZHIgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHIgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKLSAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm0gImFkZCByZCwgcGMsICNsYWJlbC0uLTgiICovCi0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qIEZyYWcgaGFja2luZyB3aWxsIHR1cm4gdGhpcyBpbnRvIGEgc3ViIGluc3RydWN0aW9uIGlmIHRoZSBvZmZzZXQgdHVybnMKLSAgICAgb3V0IHRvIGJlIG5lZ2F0aXZlLiAgKi8KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAvKiBQQyByZWxhdGl2ZSBhZGp1c3QgKi8KLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYWRybCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIFRoaXMgaXMgYSBwc2V1ZG8tb3Agb2YgdGhlIGZvcm0gImFkcmwgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKLSAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm06Ci0gICAgIAlhZGQgcmQsIHBjLCAjbG93KGxhYmVsLS4tOCkiCi0gICAgIAlhZGQgcmQsIHJkLCAjaGlnaChsYWJlbC0uLTgpIiAgICovCi0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCYgc3RyKSA9PSBGQUlMCi0gICAgICB8fCBteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIAotICAvKiBGcmFnIGhhY2tpbmcgd2lsbCB0dXJuIHRoaXMgaW50byBhIHN1YiBpbnN0cnVjdGlvbiBpZiB0aGUgb2Zmc2V0IHR1cm5zCi0gICAgIG91dCB0byBiZSBuZWdhdGl2ZS4gICovCi0gIGluc3QucmVsb2MudHlwZSAgICAgICAgICAgICAgPSBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFOwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gODsgLyogUEMgcmVsYXRpdmUgYWRqdXN0ICovCi0gIGluc3QucmVsb2MucGNfcmVsICAgICAgICAgICAgPSAxOwotICBpbnN0Lmluc3RydWN0aW9uICAgICAgICAgICAgfD0gZmxhZ3M7Ci0gIGluc3Quc2l6ZSAgICAgICAgICAgICAgICAgICAgPSBJTlNOX1NJWkUgKiAyOwotICAKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY21wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZGF0YV9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgaWYgKChmbGFncyAmIDB4MDAwMGYwMDApID09IDApCi0gICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDT05EU19CSVQ7Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX21vdiAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLWxkc3RfZXh0ZW5kIChzdHIsIGh3c2UpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIGh3c2U7Ci17Ci0gIGludCBhZGQgPSBJTkRFWF9VUDsKLQotICBzd2l0Y2ggKCoqc3RyKQotICAgIHsKLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICckJzoKLSAgICAgICgqc3RyKSsrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCBzdHIpKQotCXJldHVybiBGQUlMOwotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIGludCB2YWx1ZSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotICAgICAgICAgIGlmICgoaHdzZSAmJiAodmFsdWUgPCAtMjU1IHx8IHZhbHVlID4gMjU1KSkKLSAgICAgICAgICAgICAgIHx8ICh2YWx1ZSA8IC00MDk1IHx8IHZhbHVlID4gNDA5NSkpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiYWRkcmVzcyBvZmZzZXQgdG9vIGxhcmdlIik7Ci0JICAgICAgcmV0dXJuIEZBSUw7Ci0JICAgIH0KLQotCSAgaWYgKHZhbHVlIDwgMCkKLQkgICAgewotCSAgICAgIHZhbHVlID0gLXZhbHVlOwotCSAgICAgIGFkZCA9IDA7Ci0JICAgIH0KLQotICAgICAgICAgIC8qIEhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uIGluc3RydWN0aW9ucyBoYXZlIHRoZQotICAgICAgICAgICAgIGltbWVkaWF0ZSB2YWx1ZSBzcGxpdCBhY3Jvc3MgYml0cyAxMS4uOCBhbmQgYml0cyAzLi4wICovCi0gICAgICAgICAgaWYgKGh3c2UpCi0gICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZCB8IEhXT0ZGU0VUX0lNTSB8ICgodmFsdWUgPj4gNCkgPDwgOCkgfCAodmFsdWUgJiAweEYpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkIHwgdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLSAgICAgICAgICBpZiAoaHdzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBIV09GRlNFVF9JTU07Ci0gICAgICAgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOwotCSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCX0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgICBhZGQgPSAwOwkvKiBhbmQgZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSAnKyc6Ci0gICAgICAoKnN0cikrKzsJLyogYW5kIGZhbGwgdGhyb3VnaCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgPT0gRkFJTCkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaWYgKGh3c2UpCi0gICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkOwotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQgfCBPRkZTRVRfUkVHOwotICAgICAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKHN0cikgPT0gU1VDQ0VTUykKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfc2hpZnQgKHN0ciwgU0hJRlRfUkVTVFJJQ1QpOwotICAgICAgICB9Ci0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2xkc3QgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgaGFsZndvcmQgPSAwOwotICBpbnQgcHJlX2luYyA9IDA7Ci0gIGludCBjb25mbGljdF9yZWc7Ci0gIGludCB2YWx1ZTsKLQotICAvKiBUaGlzIGlzIG5vdCBpZGVhbCwgYnV0IGl0IGlzIHRoZSBzaW1wbGVzdCB3YXkgb2YgZGVhbGluZyB3aXRoIHRoZQotICAgICBBUk03VCBoYWxmd29yZCBpbnN0cnVjdGlvbnMgKHNpbmNlIHRoZXkgdXNlIGEgZGlmZmVyZW50Ci0gICAgIGVuY29kaW5nLCBidXQgdGhlIHNhbWUgbW5lbW9uaWMpOiAqLwotICBoYWxmd29yZCA9IChmbGFncyAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIGlmIChoYWxmd29yZCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgbG9hZC9zdG9yZSBvZiBhIGhhbGZ3b3JkLCBvciBhCi0gICAgICAgICBzaWduZWQtZXh0ZW5zaW9uIGxvYWQgKi8KLSAgICAgIGlmICgoY3B1X3ZhcmlhbnQgJiBBUk1fSEFMRldPUkQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0LmVycm9yCi0JICAgID0gXygiUHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgaGFsZndvcmRzIG9yIHNpZ25lZCBieXRlcyIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uID0gKGluc3QuaW5zdHJ1Y3Rpb24gJiBDT05EX01BU0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgfCAoZmxhZ3MgJiB+Q09ORF9NQVNLKTsKLQotICAgICAgZmxhZ3MgPSAwOwotICAgIH0KLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0gICAgCi0gIGlmICgoY29uZmxpY3RfcmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAxMikpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJiBzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIkFkZHJlc3MgZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzdHIgPT0gJ1snKQotICAgIHsKLSAgICAgIGludCByZWc7Ci0KLSAgICAgIHN0cisrOwotCi0gICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIC8qIENvbmZsaWN0cyBjYW4gb2NjdXIgb24gc3RvcmVzIGFzIHdlbGwgYXMgbG9hZHMuICAqLwotICAgICAgY29uZmxpY3RfcmVnID0gKGNvbmZsaWN0X3JlZyA9PSByZWcpOwotCi0gICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgICAgIGlmICgqc3RyID09ICddJykKLQl7Ci0JICBzdHIgKys7Ci0JICAKLQkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IFNVQ0NFU1MpCi0JICAgIHsKLQkgICAgICAvKiBbUm5dLC4uLiAocG9zdCBpbmMpICovCi0JICAgICAgaWYgKGxkc3RfZXh0ZW5kICgmc3RyLCBoYWxmd29yZCkgPT0gRkFJTCkKLQkJcmV0dXJuOwotCSAgICAgIGlmIChjb25mbGljdF9yZWcpCi0JCWFzX3dhcm4gKF8oIiVzIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlIiksCi0JCQkgKGluc3QuaW5zdHJ1Y3Rpb24gJiBMT0FEX0JJVCkgPyBfKCJkZXN0aW5hdGlvbiIpIDogXygic291cmNlIikgKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogW1JuXSAqLwotICAgICAgICAgICAgICBpZiAoaGFsZndvcmQpCi0gICAgICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBIV09GRlNFVF9JTU07Ci0KLSAgICAgICAgICAgICAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gICAgICAgICAgICAgIGlmICgqc3RyID09ICchJykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0X3JlZykKLQkJICAgYXNfd2FybiAoXygiJXMgcmVnaXN0ZXIgc2FtZSBhcyB3cml0ZS1iYWNrIGJhc2UiKSwKLQkJCSAgICAoaW5zdC5pbnN0cnVjdGlvbiAmIExPQURfQklUKSA/IF8oImRlc3RpbmF0aW9uIikgOiBfKCJzb3VyY2UiKSApOwotICAgICAgICAgICAgICAgICBzdHIrKzsKLSAgICAgICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBXUklURV9CQUNLOwotICAgICAgICAgICAgICAgfQotCi0JICAgICAgZmxhZ3MgfD0gSU5ERVhfVVA7Ci0JICAgICAgaWYgKCEgKGZsYWdzICYgVFJBTlNfQklUKSkKLQkJcHJlX2luYyA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogW1JuLC4uLl0gKi8KLQkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBwcmVfaW5jID0gMTsKLQkgIGlmIChsZHN0X2V4dGVuZCAoJnN0ciwgaGFsZndvcmQpID09IEZBSUwpCi0JICAgIHJldHVybjsKLQotCSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0JICBpZiAoKnN0cisrICE9ICddJykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJtaXNzaW5nIF0iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0JICBpZiAoKnN0ciA9PSAnIScpCi0JICAgIHsKLQkgICAgICBpZiAoY29uZmxpY3RfcmVnKQotCQlhc193YXJuIChfKCIlcyByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZSIpLAotCQkJIChpbnN0Lmluc3RydWN0aW9uICYgTE9BRF9CSVQpID8gXygiZGVzdGluYXRpb24iKSA6IF8oInNvdXJjZSIpICk7Ci0JICAgICAgc3RyKys7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBXUklURV9CQUNLOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKnN0ciA9PSAnPScpCi0gICAgewotICAgICAgLyogUGFyc2UgYW4gImxkciBSZCwgPWV4cHIiIGluc3RydWN0aW9uOyB0aGlzIGlzIGFub3RoZXIgcHNldWRvIG9wICovCi0gICAgICBzdHIrKzsKLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JICAmJiBpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fc3ltYm9sKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiAodmFsdWUgPSB2YWxpZGF0ZV9pbW1lZGlhdGUoaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKSkgIT0gRkFJTCkKLQl7Ci0JICAvKiBUaGlzIGNhbiBiZSBkb25lIHdpdGggYSBtb3YgaW5zdHJ1Y3Rpb24gKi8KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gJj0gTElURVJBTF9NQVNLOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBJTlNUX0lNTUVESUFURSB8IChPUENPREVfTU9WIDw8IERBVEFfT1BfU0hJRlQpOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoZmxhZ3MgJiBDT05EX01BU0spIHwgKHZhbHVlICYgMHhmZmYpOwotCSAgZW5kX29mX2xpbmUoc3RyKTsKLQkgIHJldHVybjsgCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEluc2VydCBpbnRvIGxpdGVyYWwgcG9vbCAqLyAgICAgCi0JICBpZiAoYWRkX3RvX2xpdF9wb29sICgpID09IEZBSUwpCi0JICAgIHsKLQkgICAgICBpZiAoIWluc3QuZXJyb3IpCi0JCWluc3QuZXJyb3IgPSBfKCJsaXRlcmFsIHBvb2wgaW5zZXJ0aW9uIGZhaWxlZCIpOyAKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgLyogQ2hhbmdlIHRoZSBpbnN0cnVjdGlvbiBleHAgdG8gcG9pbnQgdG8gdGhlIHBvb2wgKi8KLSAgICAgICAgICBpZiAoaGFsZndvcmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOwotICAgICAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0hXTElURVJBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0JICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fTElURVJBTDsKLQkgIGluc3QucmVsb2MucGNfcmVsID0gMTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJFR19QQyA8PCAxNik7Ci0JICBwcmVfaW5jID0gMTsgCi0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChoYWxmd29yZCkKLSAgICAgICAgewotICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOwotICAgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOwotICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDg7ICAvKiBQQyByZWwgYWRqdXN0ICovCi0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOwotICAgICAgcHJlX2luYyA9IDE7Ci0gICAgfQotICAgIAotICBpZiAocHJlX2luYyAmJiAoZmxhZ3MgJiBUUkFOU19CSVQpKQotICAgIGluc3QuZXJyb3IgPSBfKCJQcmUtaW5jcmVtZW50IGluc3RydWN0aW9uIHdpdGggdHJhbnNsYXRlIik7Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFncyB8IChwcmVfaW5jID8gUFJFX0lOREVYIDogMCk7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBsb25nCi1yZWdfbGlzdCAoc3RycCkKLSAgICAgY2hhciAqKiBzdHJwOwotewotICBjaGFyICogc3RyID0gKnN0cnA7Ci0gIGxvbmcgICByYW5nZSA9IDA7Ci0gIGludCAgICBhbm90aGVyX3JhbmdlOwotCi0gIC8qIFdlIGNvbWUgYmFjayBoZXJlIGlmIHdlIGdldCByYW5nZXMgY29uY2F0ZW5hdGVkIGJ5ICcrJyBvciAnfCcgKi8KLSAgZG8KLSAgICB7Ci0gICAgICBhbm90aGVyX3JhbmdlID0gMDsKLQotICAgICAgaWYgKCpzdHIgPT0gJ3snKQotCXsKLQkgIGludCBpbl9yYW5nZSA9IDA7Ci0JICBpbnQgY3VyX3JlZyA9IC0xOwotICAgICAgCi0JICBzdHIrKzsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBpbnQgcmVnOwotCSAgICAKLQkgICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLQkgICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgLTEpKSA9PSBGQUlMKQotCQlyZXR1cm4gRkFJTDsKLQkgICAgICAKLQkgICAgICBpZiAoaW5fcmFuZ2UpCi0JCXsKLQkJICBpbnQgaTsKLQkgICAgICAKLQkJICBpZiAocmVnIDw9IGN1cl9yZWcpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJCYWQgcmFuZ2UgaW4gcmVnaXN0ZXIgbGlzdCIpOwotCQkgICAgICByZXR1cm4gRkFJTDsKLQkJICAgIH0KLQotCQkgIGZvciAoaSA9IGN1cl9yZWcgKyAxOyBpIDwgcmVnOyBpKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmIChyYW5nZSAmICgxIDw8IGkpKQotCQkJYXNfdHNrdHNrIAotCQkJICAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCi0JCQkgICBpKTsKLQkJICAgICAgZWxzZQotCQkJcmFuZ2UgfD0gMSA8PCBpOwotCQkgICAgfQotCQkgIGluX3JhbmdlID0gMDsKLQkJfQotCi0JICAgICAgaWYgKHJhbmdlICYgKDEgPDwgcmVnKSkKLQkJYXNfdHNrdHNrIChfKCJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiKSwKLQkJCSAgIHJlZyk7Ci0JICAgICAgZWxzZSBpZiAocmVnIDw9IGN1cl9yZWcpCi0JCWFzX3Rza3RzayAoXygiV2FybmluZzogUmVnaXN0ZXIgcmFuZ2Ugbm90IGluIGFzY2VuZGluZyBvcmRlciIpKTsKLQotCSAgICAgIHJhbmdlIHw9IDEgPDwgcmVnOwotCSAgICAgIGN1cl9yZWcgPSByZWc7Ci0JICAgIH0gd2hpbGUgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTAotCQkgICAgIHx8IChpbl9yYW5nZSA9IDEsICpzdHIrKyA9PSAnLScpKTsKLQkgIHN0ci0tOwotCSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0JICBpZiAoKnN0cisrICE9ICd9JykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJNaXNzaW5nIGB9JyIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cHI7Ci0KLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsICZzdHIpKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgaWYgKGV4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKGV4cHIuWF9hZGRfbnVtYmVyIAotCQkgICE9IChleHByLlhfYWRkX251bWJlciAmIDB4MDAwMGZmZmYpKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbWFzayIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBpZiAoKHJhbmdlICYgZXhwci5YX2FkZF9udW1iZXIpICE9IDApCi0JCXsKLQkJICBpbnQgcmVnbm8gPSByYW5nZSAmIGV4cHIuWF9hZGRfbnVtYmVyOwotCi0JCSAgcmVnbm8gJj0gLXJlZ25vOwotCQkgIHJlZ25vID0gKDEgPDwgcmVnbm8pIC0gMTsKLQkJICBhc190c2t0c2sgCi0JCSAgICAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCi0JCSAgICAgcmVnbm8pOwotCQl9Ci0KLQkgICAgICByYW5nZSB8PSBleHByLlhfYWRkX251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGluc3QucmVsb2MudHlwZSAhPSAwKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgbWVtY3B5ICgmaW5zdC5yZWxvYy5leHAsICZleHByLCBzaXplb2YgKGV4cHJlc3Npb25TKSk7Ci0JICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9NVUxUSTsKLQkgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgaWYgKCpzdHIgPT0gJ3wnIHx8ICpzdHIgPT0gJysnKQotCXsKLQkgIHN0cisrOwotCSAgYW5vdGhlcl9yYW5nZSA9IDE7Ci0JfQotICAgIH0gd2hpbGUgKGFub3RoZXJfcmFuZ2UpOwotCi0gICpzdHJwID0gc3RyOwotICByZXR1cm4gcmFuZ2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19sZG1zdG0gKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgYmFzZV9yZWc7Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgoYmFzZV9yZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAoYmFzZV9yZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKCpzdHIgPT0gJyEnKQotICAgIHsKLSAgICAgIGZsYWdzIHw9IFdSSVRFX0JBQ0s7Ci0gICAgICBzdHIrKzsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJhbmdlID0gcmVnX2xpc3QgKCZzdHIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKnN0ciA9PSAnXicpCi0gICAgewotICAgICAgc3RyKys7Ci0gICAgICBmbGFncyB8PSBMRE1fVFlQRV8yX09SXzM7Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCByYW5nZTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3N3aSAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLSAgCi0gIC8qIEFsbG93IG9wdGlvbmFsIGxlYWRpbmcgJyMnLiAgKi8KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHN0cisrOwotCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotICAgIHJldHVybjsKLQotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1NXSTsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICAKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIAotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19zd2FwIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLSAgCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChyZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgaW4gc3dhcCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgaW4gc3dhcCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAqc3RyKysgIT0gJ1snKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgqc3RyKysgIT0gJ10nKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJtaXNzaW5nIF0iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2JyYW5jaCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0gIAotI2lmZGVmIE9CSl9FTEYKLSAgewotICAgIGNoYXIgKiBzYXZlX2luOwotICAKLSAgICAvKiBTY290dEI6IEZlYnJ1YXJ5IDUsIDE5OTggKi8KLSAgICAvKiBDaGVjayB0byBzZWUgb2YgUExUMzIgcmVsb2MgcmVxdWlyZWQgZm9yIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgCi0gICAgLyogYXJtX3BhcnNlX3JlbG9jKCkgd29ya3Mgb24gaW5wdXRfbGluZV9wb2ludGVyLgotICAgICAgIFdlIGFjdHVhbGx5IHdhbnQgdG8gcGFyc2UgdGhlIG9wZXJhbmRzIHRvIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24KLSAgICAgICBwYXNzZWQgaW4gJ3N0cicuICBTYXZlIHRoZSBpbnB1dCBwb2ludGVyIGFuZCByZXN0b3JlIGl0IGxhdGVyLiAgKi8KLSAgICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX3N5bWJvbAotCSYmICpzdHIgPT0gJygnCi0JJiYgYXJtX3BhcnNlX3JlbG9jICgpID09IEJGRF9SRUxPQ19BUk1fUExUMzIpCi0gICAgICB7Ci0JaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfQVJNX1BMVDMyOwotCWluc3QucmVsb2MucGNfcmVsID0gMDsKLQkvKiBNb2RpZnkgc3RyIHRvIHBvaW50IHRvIGFmdGVyIHBhcnNlZCBvcGVyYW5kcywgb3RoZXJ3aXNlCi0JICAgZW5kX29mX2xpbmUoKSB3aWxsIGNvbXBsYWluIGFib3V0IHRoZSAoUExUKSBsZWZ0IGluIHN0ci4gICovCi0Jc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIOwotCWluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgICAgIH0KLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICB9Ci0jZWxzZQotICBpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIOwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotICAKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2J4IChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmVnID09IFJFR19QQykKLSAgICBpbnN0LmVycm9yID0gQkFEX1BDOwotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY2RwIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogQ28tcHJvY2Vzc29yIGRhdGEgb3BlcmF0aW9uLgotICAgICBGb3JtYXQ6IENEUHtjb25kfSBDUCMsPGV4cHI+LENSZCxDUm4sQ1Jteyw8ZXhwcj59ICAqLwotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKGNvX3Byb2NfbnVtYmVyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX29wY19leHByICgmc3RyLCAyMCw0KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gU1VDQ0VTUykKLSAgICB7Ci0gICAgICBpZiAoY3Bfb3BjX2V4cHIgKCZzdHIsIDUsIDMpID09IEZBSUwpCi0JewotCSAgaWYgKCFpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbHN0YyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIENvLXByb2Nlc3NvciByZWdpc3RlciBsb2FkL3N0b3JlLgotICAgICBGb3JtYXQ6IDxMREN8U1RDe2NvbmR9W0xdIENQIyxDUmQsPGFkZHJlc3M+ICAqLwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoY29fcHJvY19udW1iZXIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NvX3JlZyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIENvLXByb2Nlc3NvciByZWdpc3RlciB0cmFuc2Zlci4KLSAgICAgRm9ybWF0OiA8TUNSfE1SQz57Y29uZH0gQ1AjLDxleHByMT4sUmQsQ1JuLENSbXssPGV4cHIyPn0gICovCi0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChjb19wcm9jX251bWJlciAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9vcGNfZXhwciAoJnN0ciwgMjEsIDMpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQotICAgIHsKLSAgICAgIGlmIChjcF9vcGNfZXhwciAoJnN0ciwgNSwgMykgPT0gRkFJTCkKLQl7Ci0JICBpZiAoIWluc3QuZXJyb3IpCi0JICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9DT05EOwotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfY3RybCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIEZQIGNvbnRyb2wgcmVnaXN0ZXJzLgotICAgICBGb3JtYXQ6IDxXRlN8UkZTfFdGQ3xSRkM+e2NvbmR9IFJuICAqLwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9sZHN0IChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9FOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1k7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfUDoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9YIHwgQ1BfVF9ZOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2xkbXN0bSAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCBudW1fcmVnczsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogR2V0IE51bWJlciBvZiByZWdpc3RlcnMgdG8gdHJhbnNmZXIgKi8KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gXygiY29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJDb25zdGFudCB2YWx1ZSByZXF1aXJlZCBmb3IgbnVtYmVyIG9mIHJlZ2lzdGVycyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBudW1fcmVncyA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotICBpZiAobnVtX3JlZ3MgPCAxIHx8IG51bV9yZWdzID4gNCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygibnVtYmVyIG9mIHJlZ2lzdGVycyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMTo0XSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzd2l0Y2ggKG51bV9yZWdzKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1kgfCBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChmbGFncykKLSAgICB7Ci0gICAgICBpbnQgcmVnOwotICAgICAgaW50IHdyaXRlX2JhY2s7Ci0gICAgICBpbnQgb2Zmc2V0OwotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkICJlYSIgb3IgImZkIiwgc28gd2UgY2FuIG9ubHkgYWNjZXB0Ci0JIFtSbl17IX0uICBUaGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgcmVhbGx5IHN1cHBvcnQgc3RhY2tpbmcgb3IKLQkgdW5zdGFja2luZywgc28gd2UgaGF2ZSB0byBlbXVsYXRlIHRoZXNlIGJ5IHNldHRpbmcgYXBwcm9wcmlhdGUKLQkgYml0cyBhbmQgb2Zmc2V0cy4gICovCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0JICB8fCAqc3RyICE9ICdbJykKLQl7Ci0JICBpZiAoISBpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBzdHIrKzsKLSAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gICAgICBpZiAoKnN0ciAhPSAnXScpCi0JewotCSAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgc3RyKys7Ci0gICAgICBpZiAoKnN0ciA9PSAnIScpCi0JewotCSAgd3JpdGVfYmFjayA9IDE7Ci0JICBzdHIrKzsKLQkgIGlmIChyZWcgPT0gUkVHX1BDKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIlIxNSBub3QgYWxsb3dlZCBhcyBiYXNlIHJlZ2lzdGVyIHdpdGggd3JpdGUtYmFjayIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl3cml0ZV9iYWNrID0gMDsKLQotICAgICAgaWYgKGZsYWdzICYgQ1BfVF9QcmUpCi0JewotCSAgLyogUHJlLWRlY3JlbWVudCAqLwotCSAgb2Zmc2V0ID0gMyAqIG51bV9yZWdzOwotCSAgaWYgKHdyaXRlX2JhY2spCi0JICAgIGZsYWdzIHw9IENQX1RfV0I7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFBvc3QtaW5jcmVtZW50ICovCi0JICBpZiAod3JpdGVfYmFjaykKLQkgICAgewotCSAgICAgIGZsYWdzIHw9IENQX1RfV0I7Ci0JICAgICAgb2Zmc2V0ID0gMyAqIG51bV9yZWdzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBObyB3cml0ZS1iYWNrLCBzbyBjb252ZXJ0IHRoaXMgaW50byBhIHN0YW5kYXJkIHByZS1pbmNyZW1lbnQKLQkJIGluc3RydWN0aW9uIC0tIGFlc3RoZXRpY2FsbHkgbW9yZSBwbGVhc2luZy4gICovCi0JICAgICAgZmxhZ3MgPSBDUF9UX1ByZSB8IENQX1RfVUQ7Ci0JICAgICAgb2Zmc2V0ID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFncyB8IG9mZnNldDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotCSAgIHx8IGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9keWFkaWMgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgc3dpdGNoIChpbnN0LnN1ZmZpeCkKLSAgICB7Ci0gICAgY2FzZSBTVUZGX1M6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRDoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDAwMDA4MDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9FOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAweDAwMDgwMDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX21vbmFkaWMgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgc3dpdGNoIChpbnN0LnN1ZmZpeCkKLSAgICB7Ci0gICAgY2FzZSBTVUZGX1M6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRDoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDAwMDA4MDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9FOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAweDAwMDgwMDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBmcF9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9jbXAgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfZnJvbV9yZWcgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgc3dpdGNoIChpbnN0LnN1ZmZpeCkKLSAgICB7Ci0gICAgY2FzZSBTVUZGX1M6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRDoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDAwMDA4MDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9FOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAweDAwMDgwMDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF90b19yZWcgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIFRodW1iIHNwZWNpZmljIHJvdXRpbmVzICovCi0KLS8qIFBhcnNlIGFuZCB2YWxpZGF0ZSB0aGF0IGEgcmVnaXN0ZXIgaXMgb2YgdGhlIHJpZ2h0IGZvcm0sIHRoaXMgc2F2ZXMKLSAgIHJlcGVhdGVkIGNoZWNraW5nIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gbWFueSBzaW1pbGFyIGNhc2VzLiAKLSAgIFVubGlrZSB0aGUgMzItYml0IGNhc2Ugd2UgZG8gbm90IGluc2VydCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgb3Bjb2RlIAotICAgaGVyZSwgc2luY2UgdGhlIHBvc2l0aW9uIGlzIG9mdGVuIHVua25vd24gdW50aWwgdGhlIGZ1bGwgaW5zdHJ1Y3Rpb24gCi0gICBoYXMgYmVlbiBwYXJzZWQuICAqLwotc3RhdGljIGludAotdGh1bWJfcmVnIChzdHJwLCBoaV9sbykKLSAgICAgY2hhciAqKiBzdHJwOwotICAgICBpbnQgICAgIGhpX2xvOwotewotICBpbnQgcmVnOwotCi0gIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKHN0cnAsIC0xKSkgPT0gRkFJTCkKLSAgICByZXR1cm4gRkFJTDsKLQotICBzd2l0Y2ggKGhpX2xvKQotICAgIHsKLSAgICBjYXNlIFRIVU1CX1JFR19MTzoKLSAgICAgIGlmIChyZWcgPiA3KQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJsbyByZWdpc3RlciByZXF1aXJlZCIpOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRIVU1CX1JFR19ISToKLSAgICAgIGlmIChyZWcgPCA4KQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJoaSByZWdpc3RlciByZXF1aXJlZCIpOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByZWc7Ci19Ci0KLS8qIFBhcnNlIGFuIGFkZCBvciBzdWJ0cmFjdCBpbnN0cnVjdGlvbiwgU1VCVFJBQ1QgaXMgbm9uLXplcm8gaWYgdGhlIG9wY29kZQotICAgd2FzIFNVQi4gICovCi1zdGF0aWMgdm9pZAotdGh1bWJfYWRkX3N1YiAoc3RyLCBzdWJ0cmFjdCkKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgaW50ICAgIHN1YnRyYWN0OwotewotICBpbnQgUmQsIFJzLCBSbiA9IEZBSUw7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqc3RyKSkKLSAgICB7Ci0gICAgICBScyA9IFJkOwotICAgICAgc3RyKys7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoUnMgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLQl7Ci0JICAvKiBUd28gb3BlcmFuZCBmb3JtYXQsIHNodWZmbGUgdGhlIHJlZ2lzdGVycyBhbmQgcHJldGVuZCB0aGVyZSAKLQkgICAgIGFyZSAzICovCi0JICBSbiA9IFJzOwotCSAgUnMgPSBSZDsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqc3RyKSkKLQl7Ci0JICBzdHIrKzsKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKChSbiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwpCi0JcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBub3cgaGF2ZSBSZCBhbmQgUnMgc2V0IHRvIHJlZ2lzdGVycywgYW5kIFJuIHNldCB0byBhIHJlZ2lzdGVyIG9yIEZBSUw7Ci0gICAgIGZvciB0aGUgbGF0dGVyIGNhc2UsIEVYUFIgY29udGFpbnMgdGhlIGltbWVkaWF0ZSB0aGF0IHdhcyBmb3VuZC4gKi8KLSAgaWYgKFJuICE9IEZBSUwpCi0gICAgewotICAgICAgLyogQWxsIHJlZ2lzdGVyIGZvcm1hdC4gICovCi0gICAgICBpZiAoUmQgPiA3IHx8IFJzID4gNyB8fCBSbiA+IDcpCi0JewotCSAgaWYgKFJzICE9IFJkKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oImRlc3QgYW5kIHNvdXJjZTEgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICAvKiBDYW4ndCBkbyB0aGlzIGZvciBTVUIgKi8KLQkgIGlmIChzdWJ0cmFjdCkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJzdWJ0cmFjdCB2YWxpZCBvbmx5IG9uIGxvIHJlZ3MiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgaW5zdC5pbnN0cnVjdGlvbiA9IChUX09QQ09ERV9BRERfSEkKLQkJCSAgICAgIHwgKFJkID4gNyA/IFRIVU1CX0gxIDogMCkKLQkJCSAgICAgIHwgKFJuID4gNyA/IFRIVU1CX0gyIDogMCkpOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgJiA3KSB8ICgoUm4gJiA3KSA8PCAzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zdC5pbnN0cnVjdGlvbiA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX1IzIDogVF9PUENPREVfQUREX1IzOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKSB8IChSbiA8PCA2KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24sIG5vdyB0aGluZ3Mgc3RhcnQgdG8gZ2V0IG5hc3R5LiAgKi8KLQotICAgICAgLyogRmlyc3QgZGVhbCB3aXRoIEhJIHJlZ3MsIG9ubHkgdmVyeSByZXN0cmljdGVkIGNhc2VzIGFsbG93ZWQ6Ci0JIEFkanVzdGluZyBTUCwgYW5kIHVzaW5nIFBDIG9yIFNQIHRvIGdldCBhbiBhZGRyZXNzLiAgKi8KLSAgICAgIGlmICgoUmQgPiA3ICYmIChSZCAhPSBSRUdfU1AgfHwgUnMgIT0gUkVHX1NQKSkKLQkgIHx8IChScyA+IDcgJiYgUnMgIT0gUkVHX1NQICYmIFJzICE9IFJFR19QQykpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgSGkgcmVnaXN0ZXIgd2l0aCBpbW1lZGlhdGUiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgLyogVmFsdWUgaXNuJ3Qga25vd24geWV0LCBhbGwgd2UgY2FuIGRvIGlzIHN0b3JlIGFsbCB0aGUgZnJhZ21lbnRzCi0JICAgICB3ZSBrbm93IGFib3V0IGluIHRoZSBpbnN0cnVjdGlvbiBhbmQgbGV0IHRoZSByZWxvYyBoYWNraW5nIAotCSAgICAgd29yayBpdCBhbGwgb3V0LiAgKi8KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSAoc3VidHJhY3QgPyAweDgwMDAgOiAwKSB8IChSZCA8PCA0KSB8IFJzOwotCSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBvZmZzZXQgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChzdWJ0cmFjdCkKLQkgICAgb2Zmc2V0ID0gLW9mZnNldDsKLQotCSAgaWYgKG9mZnNldCA8IDApCi0JICAgIHsKLQkgICAgICBvZmZzZXQgPSAtb2Zmc2V0OwotCSAgICAgIHN1YnRyYWN0ID0gMTsKLQotCSAgICAgIC8qIFF1aWNrIGNoZWNrLCBpbiBjYXNlIG9mZnNldCBpcyBNSU5fSU5UICovCi0JICAgICAgaWYgKG9mZnNldCA8IDApCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygiaW1tZWRpYXRlIHZhbHVlIG91dCBvZiByYW5nZSIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN1YnRyYWN0ID0gMDsKLQotCSAgaWYgKFJkID09IFJFR19TUCkKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgJiB+MHgxZmMpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBpbW1lZGlhdGUgdmFsdWUgZm9yIHN0YWNrIGFkanVzdCIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9TVCA6IFRfT1BDT0RFX0FERF9TVDsKLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IG9mZnNldCA+PiAyOwotCSAgICB9Ci0JICBlbHNlIGlmIChScyA9PSBSRUdfUEMgfHwgUnMgPT0gUkVHX1NQKQotCSAgICB7Ci0JICAgICAgaWYgKHN1YnRyYWN0Ci0JCSAgfHwgKG9mZnNldCAmIH4weDNmYykpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBpbW1lZGlhdGUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24iKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gKFJzID09IFJFR19QQyA/IFRfT1BDT0RFX0FERF9QQwotCQkJCSAgOiBUX09QQ09ERV9BRERfU1ApOwotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJkIDw8IDgpIHwgKG9mZnNldCA+PiAyKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoUnMgPT0gUmQpCi0JICAgIHsKLQkgICAgICBpZiAob2Zmc2V0ICYgfjB4ZmYpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygiaW1tZWRpYXRlIHZhbHVlIG91dCBvZiByYW5nZSIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9JOCA6IFRfT1BDT0RFX0FERF9JODsKLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSZCA8PCA4KSB8IG9mZnNldDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG9mZnNldCAmIH4weDcpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygiaW1tZWRpYXRlIHZhbHVlIG91dCBvZiByYW5nZSIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9JMyA6IFRfT1BDT0RFX0FERF9JMzsKLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJzIDw8IDMpIHwgKG9mZnNldCA8PCA2KTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotdGh1bWJfc2hpZnQgKHN0ciwgc2hpZnQpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBzaGlmdDsKLXsKLSAgaW50IFJkLCBScywgUm4gPSBGQUlMOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqc3RyKSkKLSAgICB7Ci0gICAgICAvKiBUd28gb3BlcmFuZCBpbW1lZGlhdGUgZm9ybWF0LCBzZXQgUnMgdG8gUmQuICAqLwotICAgICAgUnMgPSBSZDsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKFJzID0gIHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgLyogVHdvIG9wZXJhbmQgZm9ybWF0LCBzaHVmZmxlIHRoZSByZWdpc3RlcnMgYW5kIHByZXRlbmQgdGhlcmUKLQkgICAgIGFyZSAzICovCi0JICBSbiA9IFJzOwotCSAgUnMgPSBSZDsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqc3RyKSkKLQl7Ci0JICBzdHIrKzsKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKChSbiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBoYXZlIFJkIGFuZCBScyBzZXQgdG8gcmVnaXN0ZXJzLCBhbmQgUm4gc2V0IHRvIGEgcmVnaXN0ZXIgb3IgRkFJTDsKLSAgICAgZm9yIHRoZSBsYXR0ZXIgY2FzZSwgRVhQUiBjb250YWlucyB0aGUgaW1tZWRpYXRlIHRoYXQgd2FzIGZvdW5kLiAqLwotCi0gIGlmIChSbiAhPSBGQUlMKQotICAgIHsKLSAgICAgIGlmIChScyAhPSBSZCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygic291cmNlMSBhbmQgZGVzdCBtdXN0IGJlIHNhbWUgcmVnaXN0ZXIiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc2hpZnQpCi0JewotCWNhc2UgVEhVTUJfQVNSOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQVNSX1I7IGJyZWFrOwotCWNhc2UgVEhVTUJfTFNMOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTFNMX1I7IGJyZWFrOwotCWNhc2UgVEhVTUJfTFNSOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTFNSX1I7IGJyZWFrOwotCX0KLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChSbiA8PCAzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNoaWZ0KQotCXsKLQljYXNlIFRIVU1CX0FTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0FTUl9JOyBicmVhazsKLQljYXNlIFRIVU1CX0xTTDogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTTF9JOyBicmVhazsKLQljYXNlIFRIVU1CX0xTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTUl9JOyBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgLyogVmFsdWUgaXNuJ3Qga25vd24geWV0LCBjcmVhdGUgYSBkdW1teSByZWxvYyBhbmQgbGV0IHJlbG9jCi0JICAgICBoYWNraW5nIGZpeCBpdCB1cCAqLwotCi0JICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBzaGlmdF92YWx1ZSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKHNoaWZ0X3ZhbHVlID4gMzIgfHwgKHNoaWZ0X3ZhbHVlID09IDMyICYmIHNoaWZ0ID09IFRIVU1CX0xTTCkpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHNoaWZ0Iik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIFNoaWZ0cyBvZiB6ZXJvIGFyZSBoYW5kbGVkIGJ5IGNvbnZlcnRpbmcgdG8gTFNMICovCi0JICBpZiAoc2hpZnRfdmFsdWUgPT0gMCkKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTTF9JOwotCi0JICAvKiBTaGlmdHMgb2YgMzIgYXJlIGVuY29kZWQgYXMgYSBzaGlmdCBvZiB6ZXJvICovCi0JICBpZiAoc2hpZnRfdmFsdWUgPT0gMzIpCi0JICAgIHNoaWZ0X3ZhbHVlID0gMDsKLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGlmdF92YWx1ZSA8PCA2OwotCX0KLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKTsKLSAgICB9Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotdGh1bWJfbW92X2NvbXBhcmUgKHN0ciwgbW92ZSkKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgaW50ICAgIG1vdmU7Ci17Ci0gIGludCBSZCwgUnMgPSBGQUlMOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgewotICAgICAgc3RyKys7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKFJzICE9IEZBSUwpCi0gICAgewotICAgICAgaWYgKFJzIDwgOCAmJiBSZCA8IDgpCi0JewotCSAgaWYgKG1vdmUgPT0gVEhVTUJfTU9WRSkKLQkgICAgLyogQSBtb3ZlIG9mIHR3byBsb3dyZWdzIGlzIGVuY29kZWQgYXMgQUREIFJkLCBScywgIzAKLQkgICAgICAgc2luY2UgYSBNT1YgaW5zdHJ1Y3Rpb24gcHJvZHVjZXMgdW5wcmVkaWN0YWJsZSByZXN1bHRzICovCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9BRERfSTM7Ci0JICBlbHNlCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9DTVBfTFI7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJzIDw8IDMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobW92ZSA9PSBUSFVNQl9NT1ZFKQotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTU9WX0hSOwotCSAgZWxzZQotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0hSOwotCi0JICBpZiAoUmQgPiA3KQotCSAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFRIVU1CX0gxOwotCi0JICBpZiAoUnMgPiA3KQotCSAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFRIVU1CX0gyOwotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChSZCAmIDcpIHwgKChScyAmIDcpIDw8IDMpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoUmQgPiA3KQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJvbmx5IGxvIHJlZ3MgYWxsb3dlZCB3aXRoIGltbWVkaWF0ZSIpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKG1vdmUgPT0gVEhVTUJfTU9WRSkKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTU9WX0k4OwotICAgICAgZWxzZQotCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9DTVBfSTg7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgPDwgODsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQlpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTTsKLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCB2YWx1ZSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKHZhbHVlID4gMjU1KQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gdmFsdWU7Ci0JfQotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXRodW1iX2xvYWRfc3RvcmUgKHN0ciwgbG9hZF9zdG9yZSwgc2l6ZSkKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgaW50ICAgIGxvYWRfc3RvcmU7Ci0gICAgIGludCAgICBzaXplOwotewotICBpbnQgUmQsIFJiLCBSbyA9IEZBSUw7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzdHIgPT0gJ1snKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKChSYiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMKQotCXsKLQkgIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqc3RyKSkKLQkgICAgewotCSAgICAgIHN0cisrOwotCSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQkJcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlIGlmICgoUm8gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zdC5yZWxvYy5leHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgPSAwOwotCX0KLQotICAgICAgaWYgKCpzdHIgIT0gJ10nKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJleHBlY3RlZCAnXSciKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzdHIrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHIgPT0gJz0nKQotICAgIHsKLSAgICAgIC8qIFBhcnNlIGFuICJsZHIgUmQsID1leHByIiBpbnN0cnVjdGlvbjsgdGhpcyBpcyBhbm90aGVyIHBzZXVkbyBvcCAqLwotICAgICAgc3RyKys7Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCAmIHN0cikpCi0JcmV0dXJuOwotCi0gICAgICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgICAgIAotICAgICAgaWYgKCAgIGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCSAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX3N5bWJvbCkKLQl7Ci0JICBpbnN0LmVycm9yID0gIkNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgKChpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgJiB+MHhGRikgPT0gMCkpCi0JewotCSAgLyogVGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgbW92IGluc3RydWN0aW9uICovCi0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gID0gVF9PUENPREVfTU9WX0k4IHwgKFJkIDw8IDgpOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0JICByZXR1cm47IAotCX0KLQotICAgICAgLyogSW5zZXJ0IGludG8gbGl0ZXJhbCBwb29sICovICAgICAKLSAgICAgIGlmIChhZGRfdG9fbGl0X3Bvb2wgKCkgPT0gRkFJTCkKLQl7Ci0JICBpZiAoIWluc3QuZXJyb3IpCi0JICAgIGluc3QuZXJyb3IgPSAibGl0ZXJhbCBwb29sIGluc2VydGlvbiBmYWlsZWQiOyAKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ7Ci0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uICA9IFRfT1BDT0RFX0xEUl9QQyB8IChSZCA8PCA4KTsKLSAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciArPSA0OyAvKiBBZGp1c3QgQVJNIHBpcGVsaW5lIG9mZnNldCB0byBUaHVtYiAqLwotCi0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xEUl9QQyB8IChSZCA8PCA4KTsKLSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA0OyAvKiBQaXBlbGluZSBvZmZzZXQgKi8KLSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOwotICAgICAgZW5kX29mX2xpbmUgKHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChSYiA9PSBSRUdfUEMgfHwgUmIgPT0gUkVHX1NQKQotICAgIHsKLSAgICAgIGlmIChzaXplICE9IFRIVU1CX1dPUkQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImJ5dGUgb3IgaGFsZndvcmQgbm90IHZhbGlkIGZvciBiYXNlIHJlZ2lzdGVyIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoUmIgPT0gUkVHX1BDICYmIGxvYWRfc3RvcmUgIT0gVEhVTUJfTE9BRCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiUjE1IGJhc2VkIHN0b3JlIG5vdCBhbGxvd2VkIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoUm8gIT0gRkFJTCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBiYXNlIHJlZ2lzdGVyIGZvciByZWdpc3RlciBvZmZzZXQiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChSYiA9PSBSRUdfUEMpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xEUl9QQzsKLSAgICAgIGVsc2UgaWYgKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTERSX1NQOwotICAgICAgZWxzZQotCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9TVFJfU1A7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgPDwgODsKLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgdW5zaWduZWQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICBpZiAob2Zmc2V0ICYgfjB4M2ZjKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgb2Zmc2V0Iik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gb2Zmc2V0ID4+IDI7Ci0JfQotICAgICAgZWxzZQotCWluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOwotICAgIH0KLSAgZWxzZSBpZiAoUmIgPiA3KQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIGJhc2UgcmVnaXN0ZXIgaW4gbG9hZC9zdG9yZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoUm8gPT0gRkFJTCkKLSAgICB7Ci0gICAgICAvKiBJbW1lZGlhdGUgb2Zmc2V0ICovCi0gICAgICBpZiAoc2l6ZSA9PSBUSFVNQl9XT1JEKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfSVcgOiBUX09QQ09ERV9TVFJfSVcpOwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSBUSFVNQl9IQUxGV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX0lIIDogVF9PUENPREVfU1RSX0lIKTsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX0lCIDogVF9PUENPREVfU1RSX0lCKTsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChSYiA8PCAzKTsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICB1bnNpZ25lZCBvZmZzZXQgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0JICAKLQkgIGlmIChvZmZzZXQgJiB+KDB4MWYgPDwgc2l6ZSkpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBvZmZzZXQiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKG9mZnNldCA+PiBzaXplKSA8PCA2OwotCX0KLSAgICAgIGVsc2UKLQlpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBSZWdpc3RlciBvZmZzZXQgKi8KLSAgICAgIGlmIChzaXplID09IFRIVU1CX1dPUkQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9SVyA6IFRfT1BDT0RFX1NUUl9SVyk7Ci0gICAgICBlbHNlIGlmIChzaXplID09IFRIVU1CX0hBTEZXT1JEKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfUkggOiBUX09QQ09ERV9TVFJfUkgpOwotICAgICAgZWxzZQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfUkIgOiBUX09QQ09ERV9TVFJfUkIpOwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJiIDw8IDMpIHwgKFJvIDw8IDYpOwotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfbm9wIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIC8qIERvIG5vdGhpbmcgKi8KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogSGFuZGxlIHRoZSBGb3JtYXQgNCBpbnN0cnVjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBlcXVpdmFsZW50cyBpbiBvdGhlciAKLSAgIGZvcm1hdHMuICBUaGF0IGlzLCBBREMsIEFORCwgRU9SLCBTQkMsIFJPUiwgVFNULCBORUcsIENNTiwgT1JSLCBNVUwsCi0gICBCSUMgYW5kIE1WTi4gICovCi1zdGF0aWMgdm9pZAotZG9fdF9hcml0IChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCBSZCwgUnMsIFJuOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChScyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIAlyZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpICE9IEZBSUwpCi0gICAgewotICAgICAgLyogVGhyZWUgb3BlcmFuZCBmb3JtYXQgbm90IGFsbG93ZWQgZm9yIFRTVCwgQ01OLCBORUcgYW5kIE1WTi4KLQkgKEl0IGlzbid0IGFsbG93ZWQgZm9yIENNUCBlaXRoZXIsIGJ1dCB0aGF0IGlzbid0IGhhbmRsZWQgYnkgdGhpcwotCSBmdW5jdGlvbi4pICAqLwotICAgICAgaWYgKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfVFNUCi0JICB8fCBpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX0NNTgotCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9ORUcKLSAJICB8fCBpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX01WTikKLQl7Ci0JICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoKFJuID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgaWYgKFJzICE9IFJkKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJkZXN0IGFuZCBzb3VyY2UxIG9uZSBtdXN0IGJlIHRoZSBzYW1lIHJlZ2lzdGVyIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgUnMgPSBSbjsKLSAgICB9Ci0KLSAgaWYgKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfTVVMCi0gICAgICAmJiBScyA9PSBSZCkKLSAgICBhc190c2t0c2sgKF8oIlJzIGFuZCBSZCBtdXN0IGJlIGRpZmZlcmVudCBpbiBNVUwiKSk7Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2FkZCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9hZGRfc3ViIChzdHIsIDApOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9hc3IgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfc2hpZnQgKHN0ciwgVEhVTUJfQVNSKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYnJhbmNoOSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgcmV0dXJuOwotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOTsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYnJhbmNoMTIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi0vKiBGaW5kIHRoZSByZWFsLCBUaHVtYiBlbmNvZGVkIHN0YXJ0IG9mIGEgVGh1bWIgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgc3ltYm9sUyAqCi1maW5kX3JlYWxfc3RhcnQgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKiBzeW1ib2xQOwotewotICBjaGFyICogICAgICAgcmVhbF9zdGFydDsKLSAgY29uc3QgY2hhciAqIG5hbWUgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLSAgc3ltYm9sUyAqICAgIG5ld190YXJnZXQ7Ci0KLSAgLyogVGhpcyBkZWZpbml0b24gbXVzdCBhZ3JlZSB3aXRoIHRoZSBvbmUgaW4gZ2NjL2NvbmZpZy9hcm0vdGh1bWIuYyAqLwotI2RlZmluZSBTVFVCX05BTUUgIi5yZWFsX3N0YXJ0X29mIgotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgYWJvcnQoKTsKLQotICAvKiBOYW1lcyB0aGF0IHN0YXJ0IHdpdGggJy4nIGFyZSBsb2NhbCBsYWJlbHMsIG5vdCBmdW5jdGlvbiBlbnRyeSBwb2ludHMuCi0gICAgIFRoZSBjb21waWxlciBtYXkgZ2VuZXJhdGUgQkwgaW5zdHJ1Y3Rpb25zIHRvIHRoZXNlIGxhYmVscyBiZWNhdXNlIGl0Ci0gICAgIG5lZWRzIHRvIHBlcmZvcm0gYSBicmFuY2ggdG8gYSBmYXIgYXdheSBsb2NhdGlvbi4gICovCi0gIGlmIChuYW1lWzBdID09ICcuJykKLSAgICByZXR1cm4gc3ltYm9sUDsKLSAgCi0gIHJlYWxfc3RhcnQgPSBtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFNUVUJfTkFNRSkgKyAxKTsKLSAgc3ByaW50ZiAocmVhbF9zdGFydCwgIiVzJXMiLCBTVFVCX05BTUUsIG5hbWUpOwotCi0gIG5ld190YXJnZXQgPSBzeW1ib2xfZmluZCAocmVhbF9zdGFydCk7Ci0gIAotICBpZiAobmV3X3RhcmdldCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKCJGYWlsZWQgdG8gZmluZCByZWFsIHN0YXJ0IG9mIGZ1bmN0aW9uOiAlc1xuIiwgbmFtZSk7Ci0gICAgICBuZXdfdGFyZ2V0ID0gc3ltYm9sUDsKLSAgICB9Ci0KLSAgZnJlZSAocmVhbF9zdGFydCk7Ci0KLSAgcmV0dXJuIG5ld190YXJnZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRvX3RfYnJhbmNoMjMgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCAmIHN0cikpCi0gICAgcmV0dXJuOwotICAKLSAgaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0KLSAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggaXMgYSBkZWZpbmVkIHN5bWJvbCB3aGljaCBkb2VzIG5vdCBoYXZlCi0gICAgIHRoZSBUSFVNQl9GVU5DIGF0dHJpYnV0ZSwgdGhlbiB3ZSBtdXN0IGJlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aGljaCBoYXMKLSAgICAgdGhlIChpbnRlcmZhY2Vhcm0pIGF0dHJpYnV0ZS4gIFdlIGxvb2sgZm9yIHRoZSBUaHVtYiBlbnRyeSBwb2ludCB0byB0aGF0Ci0gICAgIGZ1bmN0aW9uIGFuZCBjaGFuZ2UgdGhlIGJyYW5jaCB0byByZWZlciB0byB0aGF0IGZ1bmN0aW9uIGluc3RlYWQuICAqLwotICBpZiAoICAgaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX3N5bWJvbAotICAgICAgJiYgaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sICE9IE5VTEwKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQotICAgICAgJiYgISBUSFVNQl9JU19GVU5DIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wpKQotICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCA9IGZpbmRfcmVhbF9zdGFydCAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYnggKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaW50IHJlZzsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChyZWcgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICAvKiBUaGlzIHNldHMgVEhVTUJfSDIgZnJvbSB0aGUgdG9wIGJpdCBvZiByZWcuICAqLwotICBpbnN0Lmluc3RydWN0aW9uIHw9IHJlZyA8PCAzOwotCi0gIC8qID8/PyBGSVhNRTogU2hvdWxkIGFkZCBhIGhhY2t5IHJlbG9jIGhlcmUgaWYgcmVnIGlzIFJFR19QQy4gIFRoZSByZWxvYwotICAgICBzaG91bGQgY2F1c2UgdGhlIGFsaWdubWVudCB0byBiZSBjaGVja2VkIG9uY2UgaXQgaXMga25vd24uICBUaGlzIGlzCi0gICAgIGJlY2F1c2UgQlggUEMgb25seSB3b3JrcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgd29yZCBhbGlnbmVkLiAgKi8KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfY29tcGFyZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBUSFVNQl9DT01QQVJFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRtc3RtIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCBSYjsKLSAgbG9uZyByYW5nZTsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChSYiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCpzdHIgIT0gJyEnKQotICAgIGFzX3dhcm4gKF8oIkluc2VydGVkIG1pc3NpbmcgJyEnOiBsb2FkL3N0b3JlIG11bHRpcGxlIGFsd2F5cyB3cml0ZXMgYmFjayBiYXNlIHJlZ2lzdGVyIikpOwotICBlbHNlCi0gICAgc3RyKys7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJhbmdlID0gcmVnX2xpc3QgKCZzdHIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5zdC5yZWxvYy50eXBlICE9IEJGRF9SRUxPQ19OT05FKQotICAgIHsKLSAgICAgIC8qIFRoaXMgcmVhbGx5IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdC4gKi8KLSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgaW5zdC5lcnJvciA9IF8oIkV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJhbmdlICYgfjB4ZmYpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm9ubHkgbG8tcmVncyB2YWxpZCBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJiIDw8IDgpIHwgcmFuZ2U7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9MT0FELCBUSFVNQl9XT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyYiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX0xPQUQsIFRIVU1CX0JZVEUpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHJoIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX2xvYWRfc3RvcmUgKHN0ciwgVEhVTUJfTE9BRCwgVEhVTUJfSEFMRldPUkQpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHMgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaW50IFJkLCBSYiwgUm87Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKnN0cisrICE9ICdbJwotICAgICAgfHwgKFJiID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChSbyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgKnN0cisrICE9ICddJykKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBfKCJTeW50YXg6IGxkcnNbYl0gUmQsIFtSYiwgUm9dIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMykgfCAoUm8gPDwgNik7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sc2wgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfc2hpZnQgKHN0ciwgVEhVTUJfTFNMKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbHNyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0xTUik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X21vdiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBUSFVNQl9NT1ZFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfcHVzaF9wb3AgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgbG9uZyByYW5nZTsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHJlYWxseSBkb2Vzbid0IHNlZW0gd29ydGggaXQuICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJFeHByZXNzaW9uIHRvbyBjb21wbGV4Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyYW5nZSAmIH4weGZmKQotICAgIHsKLSAgICAgIGlmICgoaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9QVVNICi0JICAgJiYgKHJhbmdlICYgfjB4ZmYpID09IDEgPDwgUkVHX0xSKQotCSAgfHwgKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfUE9QCi0JICAgICAgJiYgKHJhbmdlICYgfjB4ZmYpID09IDEgPDwgUkVHX1BDKSkKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IFRIVU1CX1BQX1BDX0xSOwotCSAgcmFuZ2UgJj0gMHhmZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbGlzdCB0byBwdXNoL3BvcCBpbnN0cnVjdGlvbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSByYW5nZTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0ciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9XT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3RyYiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9CWVRFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3RyaCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9IQUxGV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N1YiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9hZGRfc3ViIChzdHIsIDEpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zd2kgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9TV0k7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2FkciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHIgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKLSAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm0gImFkZCByZCwgcGMsICNsYWJlbC0uLTQiICovCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDQpID09IEZBSUwgIC8qIFN0b3JlIFJkIGluIHRlbXBvcmFyeSBsb2NhdGlvbiBpbnNpZGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDQ7IC8qIFBDIHJlbGF0aXZlIGFkanVzdCAqLwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUkVHX1BDOyAvKiBSZCBpcyBhbHJlYWR5IHBsYWNlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiAqLwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9yZWcgKGVudHJ5KQotICAgICBpbnQgZW50cnk7Ci17Ci0gIGludCAgICBsZW4gPSBzdHJsZW4gKHJlZ190YWJsZVtlbnRyeV0ubmFtZSkgKyAyOwotICBjaGFyICogYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgY2hhciAqIGJ1ZjIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBpbnQgICAgaSA9IDA7Ci0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgYnVmW2krK10gPSBSRUdJU1RFUl9QUkVGSVg7Ci0jZW5kaWYKLQotICBzdHJjcHkgKGJ1ZiArIGksIHJlZ190YWJsZVtlbnRyeV0ubmFtZSk7Ci0KLSAgZm9yIChpID0gMDsgYnVmW2ldOyBpKyspCi0gICAgYnVmMltpXSA9IGlzbG93ZXIgKGJ1ZltpXSkgPyB0b3VwcGVyIChidWZbaV0pIDogYnVmW2ldOwotCi0gIGJ1ZjJbaV0gPSAnXDAnOwotCi0gIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmLCAoUFRSKSAmcmVnX3RhYmxlW2VudHJ5XSk7Ci0gIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmMiwgKFBUUikgJnJlZ190YWJsZVtlbnRyeV0pOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3JlZ19hbGlhcyAoc3RyLCByZWdudW0pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgc3RydWN0IHJlZ19lbnRyeSAqbmV3ID0KLSAgICAoc3RydWN0IHJlZ19lbnRyeSAqKXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlZ19lbnRyeSkpOwotICBjaGFyICpuYW1lID0geG1hbGxvYyAoc3RybGVuIChzdHIpICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc3RyKTsKLQotICBuZXctPm5hbWUgPSBuYW1lOwotICBuZXctPm51bWJlciA9IHJlZ251bTsKLQotICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIG5hbWUsIChQVFIpIG5ldyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfY29uc3RhbnRfZmxvbnVtcyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKLSAgICBpZiAoYXRvZl9pZWVlICgoY2hhciAqKWZwX2NvbnN0W2ldLCAneCcsIGZwX3ZhbHVlc1tpXSkgPT0gTlVMTCkKLSAgICAgIGFib3J0ICgpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBpbnQgaTsKLSAgCi0gIGlmICggICAoYXJtX29wc19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAotICAgICAgfHwgKGFybV90b3BzX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX2NvbmRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fc2hpZnRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fcmVnX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX3Bzcl9oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIikpOwotICAgIAotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChpbnNucykgLyBzaXplb2YgKHN0cnVjdCBhc21fb3Bjb2RlKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fb3BzX2hzaCwgaW5zbnNbaV0udGVtcGxhdGUsIChQVFIpIChpbnNucyArIGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGluc25zKSAvIHNpemVvZiAoc3RydWN0IHRodW1iX29wY29kZSk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3RvcHNfaHNoLCB0aW5zbnNbaV0udGVtcGxhdGUsIChQVFIpICh0aW5zbnMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvbmRzKSAvIHNpemVvZiAoc3RydWN0IGFzbV9jb25kKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fY29uZF9oc2gsIGNvbmRzW2ldLnRlbXBsYXRlLCAoUFRSKSAoY29uZHMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNoaWZ0KSAvIHNpemVvZiAoc3RydWN0IGFzbV9zaGlmdCk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3NoaWZ0X2hzaCwgc2hpZnRbaV0udGVtcGxhdGUsIChQVFIpIChzaGlmdCArIGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHNycykgLyBzaXplb2YgKHN0cnVjdCBhc21fcHNyKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fcHNyX2hzaCwgcHNyc1tpXS50ZW1wbGF0ZSwgKFBUUikgKHBzcnMgKyBpKSk7Ci0KLSAgZm9yIChpID0gMDsgcmVnX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICBpbnNlcnRfcmVnIChpKTsKLQotICBzZXRfY29uc3RhbnRfZmxvbnVtcyAoKTsKLQotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotICAgIAotICAgIC8qIFNldCB0aGUgZmxhZ3MgaW4gdGhlIHByaXZhdGUgc3RydWN0dXJlICovCi0gICAgaWYgKHVzZXNfYXBjc18yNikgICAgICBmbGFncyB8PSBGX0FQQ1MyNjsKLSAgICBpZiAoc3VwcG9ydF9pbnRlcndvcmspIGZsYWdzIHw9IEZfSU5URVJXT1JLOwotICAgIGlmICh1c2VzX2FwY3NfZmxvYXQpICAgZmxhZ3MgfD0gRl9BUENTX0ZMT0FUOwotICAgIGlmIChwaWNfY29kZSkgICAgICAgICAgZmxhZ3MgfD0gRl9QSUM7Ci0gICAgaWYgKChjcHVfdmFyaWFudCAmIEZQVV9BTEwpID09IEZQVV9OT05FKSBmbGFncyB8PSBGX1NPRlRfRkxPQVQ7Ci0KLSAgICBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKHN0ZG91dHB1dCwgZmxhZ3MpOwotICB9Ci0jZW5kaWYKLSAgCi0gIHsKLSAgICB1bnNpZ25lZCBtYWNoOwotICAgIAotICAgIC8qIFJlY29yZCB0aGUgQ1BVIHR5cGUgYXMgd2VsbCAqLwotICAgIHN3aXRjaCAoY3B1X3ZhcmlhbnQgJiBBUk1fQ1BVX01BU0spCi0gICAgICB7Ci0gICAgICBjYXNlIEFSTV8yOgotCW1hY2ggPSBiZmRfbWFjaF9hcm1fMjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgQVJNXzM6IC8qIGFsc28gQVJNXzI1MCAqLwotCW1hY2ggPSBiZmRfbWFjaF9hcm1fMmE7Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICBjYXNlIEFSTV82IHwgQVJNXzMgfCBBUk1fMjoJLyogQWN0dWFsbHkgbm8gQ1BVIHR5cGUgZGVmaW5lZCAqLwotCW1hY2ggPSBiZmRfbWFjaF9hcm1fNDsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgQVJNXzc6IAkJCS8qIGFsc28gQVJNXzYgKi8KLQltYWNoID0gYmZkX21hY2hfYXJtXzM7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAvKiBDYXRjaCBzcGVjaWFsIGNhc2VzLiAgKi8KLSAgICBpZiAoY3B1X3ZhcmlhbnQgIT0gKEZQVV9ERUZBVUxUIHwgQ1BVX0RFRkFVTFQpKQotICAgICAgewotCWlmIChjcHVfdmFyaWFudCAmIChBUk1fRVhUX1Y1ICYgQVJNX1RIVU1CKSkKLQkgIG1hY2ggPSBiZmRfbWFjaF9hcm1fNVQ7Ci0JZWxzZSBpZiAoY3B1X3ZhcmlhbnQgJiBBUk1fRVhUX1Y1KQotCSAgbWFjaCA9IGJmZF9tYWNoX2FybV81OwotCWVsc2UgaWYgKGNwdV92YXJpYW50ICYgQVJNX1RIVU1CKQotCSAgbWFjaCA9IGJmZF9tYWNoX2FybV80VDsKLQllbHNlIGlmICgoY3B1X3ZhcmlhbnQgJiBBUk1fQVJDSF9WNCkgPT0gQVJNX0FSQ0hfVjQpCi0JICBtYWNoID0gYmZkX21hY2hfYXJtXzQ7Ci0JZWxzZSBpZiAoY3B1X3ZhcmlhbnQgJiBBUk1fTE9OR01VTCkKLQkgIG1hY2ggPSBiZmRfbWFjaF9hcm1fM007Ci0gICAgICB9Ci0JCi0gICAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIG1hY2gpOwotICB9Ci19Ci0KLS8qIFR1cm4gYW4gaW50ZWdlciBvZiBuIGJ5dGVzIChpbiB2YWwpIGludG8gYSBzdHJlYW0gb2YgYnl0ZXMgYXBwcm9wcmlhdGUKLSAgIGZvciB1c2UgaW4gdGhlIGEub3V0IGZpbGUsIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSBidWYuCi0gICBUaGlzIGtub3dzIGFib3V0IHRoZSBlbmRpYW4tbmVzcyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUgYW5kIGRvZXMKLSAgIFRIRSBSSUdIVCBUSElORywgd2hhdGV2ZXIgaXQgaXMuICBQb3NzaWJsZSB2YWx1ZXMgZm9yIG4gYXJlIDEgKGJ5dGUpCi0gICAyIChzaG9ydCkgYW5kIDQgKGxvbmcpICBGbG9hdGluZyBudW1iZXJzIGFyZSBwdXQgb3V0IGFzIGEgc2VyaWVzIG9mCi0gICBMSVRUTEVOVU1TIChzaG9ydHMsIGhlcmUgYXQgbGVhc3QpLiAgKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCAgICBuOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi1zdGF0aWMgdmFsdWVUIAotbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIGludCBuOwotewotICB2YWx1ZVQgcmVzdWx0ID0gMDsKLSAgdW5zaWduZWQgY2hhciAqIHdoZXJlID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHJlc3VsdCB8PSAoKndoZXJlKysgJiAyNTUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHJlc3VsdCB8PSAod2hlcmVbbl0gJiAyNTUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIFRZUEUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLQotICAgTm90ZSB0aGF0IGZwIGNvbnN0YW50cyBhcmVuJ3QgcmVwcmVzZW50IGluIHRoZSBub3JtYWwgd2F5IG9uIHRoZSBBUk0uCi0gICBJbiBiaWcgZW5kaWFuIG1vZGUsIHRoaW5ncyBhcmUgYXMgZXhwZWN0ZWQuICBIb3dldmVyLCBpbiBsaXR0bGUgZW5kaWFuCi0gICBtb2RlIGZwIGNvbnN0YW50cyBhcmUgYmlnLWVuZGlhbiB3b3JkLXdpc2UsIGFuZCBsaXR0bGUtZW5kaWFuIGJ5dGUtd2lzZQotICAgd2l0aGluIHRoZSB3b3Jkcy4gIEZvciBleGFtcGxlLCAoZG91YmxlKSAxLjEgaW4gYmlnIGVuZGlhbiBtb2RlIGlzCi0gICB0aGUgYnl0ZSBzZXF1ZW5jZSAzZiBmMSA5OSA5OSA5OSA5OSA5OSA5YSwgYW5kIGluIGxpdHRsZSBlbmRpYW4gbW9kZSBpcwotICAgdGhlIGJ5dGUgc2VxdWVuY2UgOTkgOTkgZjEgM2YgOWEgOTkgOTkgOTkuCi0KLSAgID8/PyBUaGUgZm9ybWF0IG9mIDEyIGJ5dGUgZmxvYXRzIGlzIHVuY2VydGFpbiBhY2NvcmRpbmcgdG8gZ2NjJ3MgYXJtLmguICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyICAgdHlwZTsKLSAgICAgY2hhciAqIGxpdFA7Ci0gICAgIGludCAqICBzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiAyOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3IgYSA0IGJ5dGUgZmxvYXQgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGluIGB3b3JkcycgaXMgMSAwLiAgRm9yIGFuCi0JIDggYnl0ZSBmbG9hdCB0aGUgb3JkZXIgaXMgMSAwIDMgMi4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSArPSAyKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaSArIDFdLCAyKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCArIDIsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gNDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGUga25vd2xlZGdlIG9mIHRoZSBQQydzIHBpcGVsaW5lIG9mZnNldCBpcyBidWlsdCBpbnRvIHRoZSBpbnNucyB0aGVtc2VsdmVzLiAgKi8gCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICogZml4UDsKLXsKLSAgaWYgKCAgIGZpeFAtPmZ4X2FkZHN5Ci0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLSAgICAgICYmIGZpeFAtPmZ4X3N1YnN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoZml4UC0+ZnhfcGNyZWwgJiYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCkpCi0gICAgewotICAgICAgLyogUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBvbiB0aGUgVGh1bWIgaXMgc2xpZ2h0bHkgb2RkCi0JIGFzIHRoZSBib3R0b20gdHdvIGJpdHMgb2YgdGhlIFBDIGFyZSBmb3JjZWQgdG8gemVybwotCSBmb3IgdGhlIGNhbGN1bGF0aW9uLiAgKi8KLSAgICAgIHJldHVybiAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzKSAmIH4zOwotICAgIH0KLQotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1QgICBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIHJldHVybiBzaXplOwotI2Vsc2UKLSAgLyogUm91bmQgYWxsIHNlY3RzIHRvIG11bHRpcGxlIG9mIDQgKi8KLSAgcmV0dXJuIChzaXplICsgMykgJiB+MzsKLSNlbmRpZgotfQotCi0vKiBVbmRlciBFTEYgd2UgbmVlZCB0byBkZWZhdWx0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFLiAgT3RoZXJ3aXNlIAotICAgd2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICogbmFtZTsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdID09ICdHJwotICAgICAgJiYgc3RyZXEgKG5hbWUsIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSkpCi0gICAgewotICAgICAgaWYgKCFHT1Rfc3ltYm9sKQotCXsKLQkgIGlmIChzeW1ib2xfZmluZCAobmFtZSkpCi0JICAgIGFzX2JhZCAoIkdPVCBhbHJlYWR5IGluIHRoZSBzeW1ib2wgdGFibGUiKTsKLQkgIAotCSAgR09UX3N5bWJvbCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLAotCQkJCSAgICh2YWx1ZVQpMCwgJiB6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JfQotICAgICAgCi0gICAgICByZXR1cm4gR09UX3N5bWJvbDsKLSAgICB9Ci0jZW5kaWYKLSAgCi0gIHJldHVybiAwOwotfQotCi0vKiBhcm1fcmVnX3BhcnNlICgpIDo9IGlmIGl0IGxvb2tzIGxpa2UgYSByZWdpc3RlciwgcmV0dXJuIGl0cyB0b2tlbiBhbmQgCi0gICBhZHZhbmNlIHRoZSBwb2ludGVyLiAqLwotCi1zdGF0aWMgaW50Ci1hcm1fcmVnX3BhcnNlIChjY3ApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKiogY2NwOwotewotICBjaGFyICogc3RhcnQgPSAqIGNjcDsKLSAgY2hhciAgIGM7Ci0gIGNoYXIgKiBwOwotICBzdHJ1Y3QgcmVnX2VudHJ5ICogcmVnOwotCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0gIGlmICgqc3RhcnQgIT0gUkVHSVNURVJfUFJFRklYKQotICAgIHJldHVybiBGQUlMOwotICBwID0gc3RhcnQgKyAxOwotI2Vsc2UKLSAgcCA9IHN0YXJ0OwotI2lmZGVmIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWAotICBpZiAoKnAgPT0gT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYKQotICAgIHArKywgc3RhcnQrKzsKLSNlbmRpZgotI2VuZGlmCi0gIGlmICghaXNhbHBoYSAoKnApIHx8ICFpc19uYW1lX2JlZ2lubmVyICgqcCkpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgYyA9ICpwKys7Ci0gIHdoaWxlIChpc2FscGhhIChjKSB8fCBpc2RpZ2l0IChjKSB8fCBjID09ICdfJykKLSAgICBjID0gKnArKzsKLQotICAqLS1wID0gMDsKLSAgcmVnID0gKHN0cnVjdCByZWdfZW50cnkgKikgaGFzaF9maW5kIChhcm1fcmVnX2hzaCwgc3RhcnQpOwotICAqcCA9IGM7Ci0gIAotICBpZiAocmVnKQotICAgIHsKLSAgICAgICpjY3AgPSBwOwotICAgICAgcmV0dXJuIHJlZy0+bnVtYmVyOwotICAgIH0KLQotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotYXJtX3Bzcl9wYXJzZSAoY2NwKQotICAgICByZWdpc3RlciBjaGFyICoqIGNjcDsKLXsKLSAgY2hhciAqIHN0YXJ0ID0gKiBjY3A7Ci0gIGNoYXIgICBjOwotICBjaGFyICogcDsKLSAgQ09OU1Qgc3RydWN0IGFzbV9wc3IgKiBwc3I7Ci0KLSAgcCA9IHN0YXJ0OwotICBjID0gKnArKzsKLSAgd2hpbGUgKGlzYWxwaGEgKGMpIHx8IGMgPT0gJ18nKQotICAgIGMgPSAqcCsrOwotCi0gICotLXAgPSAwOyAgCi0gIHBzciA9IChDT05TVCBzdHJ1Y3QgYXNtX3BzciAqKSBoYXNoX2ZpbmQgKGFybV9wc3JfaHNoLCBzdGFydCk7Ci0gICpwID0gYzsKLQotICBpZiAocHNyKQotICAgIHsKLSAgICAgICpjY3AgPSBwOwotICAgICAgcmV0dXJuIHBzci0+bnVtYmVyOwotICAgIH0KLQotICByZXR1cm4gRkFJTDsKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWwsIHNlZykKLSAgICAgZml4UyAqICAgICAgZml4UDsKLSAgICAgdmFsdWVUICogICAgdmFsOwotICAgICBzZWdUICAgICAgICBzZWc7Ci17Ci0gIG9mZnNldFQgICAgICAgIHZhbHVlID0gKiB2YWw7Ci0gIG9mZnNldFQgICAgICAgIG5ld3ZhbDsKLSAgdW5zaWduZWQgaW50ICAgbmV3aW1tOwotICB1bnNpZ25lZCBsb25nICB0ZW1wOwotICBpbnQgICAgICAgICAgICBzaWduOwotICBjaGFyICogICAgICAgICBidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGFybV9maXhfZGF0YSAqIGFybV9kYXRhID0gKGFybV9maXhfZGF0YSAqKSBmaXhQLT50Y19maXhfZGF0YTsKLQotICBhc3NlcnQgKGZpeFAtPmZ4X3JfdHlwZSA8IEJGRF9SRUxPQ19VTlVTRUQpOwotCi0gIC8qIE5vdGUgd2hldGhlciB0aGlzIHdpbGwgZGVsZXRlIHRoZSByZWxvY2F0aW9uLiAgKi8KLSNpZiAwIC8qIHBhdGNoIGZyb20gUkVhcm5zaGF3IHRvIEpEYXZpcyAoZGlzYWJsZWQgZm9yIHRoZSBtb21lbnQsIHNpbmNlIGl0IGRvZXNuJ3Qgd29yayBmdWxseSkgKi8KLSAgaWYgKChmaXhQLT5meF9hZGRzeSA9PSAwIHx8IHN5bWJvbF9jb25zdGFudF9wIChmaXhQLT5meF9hZGRzeSkpCi0gICAgICAmJiAhZml4UC0+ZnhfcGNyZWwpCi0jZWxzZQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiAhZml4UC0+ZnhfcGNyZWwpCi0jZW5kaWYKLSAgICBmaXhQLT5meF9kb25lID0gMTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIHRoZW4gd2UgbmVlZCB0byBsZWF2ZSBpdCBmb3IKLSAgICAgdGhlIGxpbmtlciB0byBkZWFsIHdpdGguICBVbmZvcnR1bmF0ZWx5LCBtZF9wY3JlbF9mcm9tIGNhbid0IHRlbGwsCi0gICAgIHNvIHdlIGhhdmUgdG8gdW5kbyBpdCdzIGVmZmVjdHMgaGVyZS4gICovCi0gIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgJiYgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWcpCi0JewotCSAgaWYgKHRhcmdldF9vYWJpCi0JICAgICAgJiYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotCQkpKQotCSAgICB2YWx1ZSA9IDA7Ci0JICBlbHNlCi0JICAgIHZhbHVlICs9IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotCX0KLSAgICB9Ci0KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciBlbWl0X3JlbG9jLiAgKi8KLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURToKLSAgICAgIG5ld2ltbSA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsdWUpOwotICAgICAgdGVtcCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBmYWlsLCBzZWUgaWYgd2UgY2FuIGZpeCB0aGluZ3MgdXAgYnkKLQkgY2hhbmdpbmcgdGhlIG9wY29kZS4gICovCi0gICAgICBpZiAobmV3aW1tID09ICh1bnNpZ25lZCBpbnQpIEZBSUwKLQkgICYmIChuZXdpbW0gPSBuZWdhdGVfZGF0YV9vcCAoJnRlbXAsIHZhbHVlKSkgPT0gKHVuc2lnbmVkIGludCkgRkFJTCkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJpbnZhbGlkIGNvbnN0YW50ICglbHgpIGFmdGVyIGZpeHVwIiksCi0JCQkodW5zaWduZWQgbG9uZykgdmFsdWUpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBuZXdpbW0gfD0gKHRlbXAgJiAweGZmZmZmMDAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCAodmFsdWVUKSBuZXdpbW0sIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURToKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgaGlnaHBhcnQgPSAwOwotCXVuc2lnbmVkIGludCBuZXdpbnNuICA9IDB4ZTFhMDAwMDA7IC8qIG5vcCAqLwotCW5ld2ltbSA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsdWUpOwotCXRlbXAgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLQotCS8qIElmIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGZhaWwsIHNlZSBpZiB3ZSBjYW4gZml4IHRoaW5ncyB1cCBieQotCSAgIGNoYW5naW5nIHRoZSBvcGNvZGUuICAqLwotCWlmIChuZXdpbW0gPT0gKHVuc2lnbmVkIGludCkgRkFJTAotCSAgICAmJiAobmV3aW1tID0gbmVnYXRlX2RhdGFfb3AgKCYgdGVtcCwgdmFsdWUpKSA9PSAodW5zaWduZWQgaW50KSBGQUlMKQotCSAgewotCSAgICAvKiBObyA/ICBPSyAtIHRyeSB1c2luZyB0d28gQUREIGluc3RydWN0aW9ucyB0byBnZW5lcmF0ZSB0aGUgdmFsdWUuICAqLwotCSAgICBuZXdpbW0gPSB2YWxpZGF0ZV9pbW1lZGlhdGVfdHdvcGFydCAodmFsdWUsICYgaGlnaHBhcnQpOwotCi0JICAgIC8qIFllcyAtIHRoZW4gbWFrZSBzdXJlIHRoYXQgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBpcyBhbHNvIGFuIGFkZC4gICovCi0JICAgIGlmIChuZXdpbW0gIT0gKHVuc2lnbmVkIGludCkgRkFJTCkKLQkgICAgICBuZXdpbnNuID0gdGVtcDsKLQkgICAgLyogU3RpbGwgTm8gPyAgVHJ5IHVzaW5nIGEgbmVnYXRlZCB2YWx1ZS4gICovCi0JICAgIGVsc2UgaWYgKHZhbGlkYXRlX2ltbWVkaWF0ZV90d29wYXJ0ICgtIHZhbHVlLCAmIGhpZ2hwYXJ0KSAhPSAodW5zaWduZWQgaW50KSBGQUlMKQotCQl0ZW1wID0gbmV3aW5zbiA9ICh0ZW1wICYgT1BDT0RFX01BU0spIHwgT1BDT0RFX1NVQiA8PCBEQVRBX09QX1NISUZUOwotCSAgICAvKiBPdGhlcndpc2UgLSBnaXZlIHVwLiAgKi8KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgICAgXygiVW5hYmxlIHRvIGNvbXB1dGUgQURSTCBpbnN0cnVjdGlvbnMgZm9yIFBDIG9mZnNldCBvZiAweCV4IiksIHZhbHVlKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIC8qIFJlcGxhY2UgdGhlIGZpcnN0IG9wZXJhbmQgaW4gdGhlIDJuZCBpbnN0cnVjdGlvbiAod2hpY2ggaXMgdGhlIFBDKQotCSAgICAgICB3aXRoIHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4gIFdlIGhhdmUgYWxyZWFkeSBhZGRlZCBpbiB0aGUgUEMgaW4gdGhlCi0JICAgICAgIGZpcnN0IGluc3RydWN0aW9uIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBkbyBpdCBhZ2Fpbi4gICovCi0JICAgIG5ld2luc24gJj0gfiAweGYwMDAwOwotCSAgICBuZXdpbnNuIHw9ICgobmV3aW5zbiAmIDB4MGYwMDApIDw8IDQpOwotCSAgfQotCi0JbmV3aW1tIHw9ICh0ZW1wICYgMHhmZmZmZjAwMCk7Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsICh2YWx1ZVQpIG5ld2ltbSwgSU5TTl9TSVpFKTsKLQotCWhpZ2hwYXJ0IHw9IChuZXdpbnNuICYgMHhmZmZmZjAwMCk7Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYgKyBJTlNOX1NJWkUsICh2YWx1ZVQpIGhpZ2hwYXJ0LCBJTlNOX1NJWkUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTToKLSAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOwotICAgICAgCi0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLSB2YWx1ZTsKLSAgICAgIAotICAgICAgaWYgKHZhbGlkYXRlX29mZnNldF9pbW0gKHZhbHVlLCAwKSA9PSBGQUlMKQotICAgICAgICB7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgXygiYmFkIGltbWVkaWF0ZSB2YWx1ZSBmb3Igb2Zmc2V0ICglbGQpIiksIChsb25nKSB2YWx1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjAwMDsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg6Ci0gICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw6Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIAotICAgICAgaWYgKHZhbHVlIDwgMCkKLQl2YWx1ZSA9IC0gdmFsdWU7Ci0KLSAgICAgIGlmICh2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMSkgPT0gRkFJTCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQlfKCJpbnZhbGlkIGxpdGVyYWwgY29uc3RhbnQ6IHBvb2wgbmVlZHMgdG8gYmUgY2xvc2VyIikpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2JhZCAoXygiYmFkIGltbWVkaWF0ZSB2YWx1ZSBmb3IgaGFsZi13b3JkIG9mZnNldCAoJWxkKSIpLAotCQkgICAgKGxvbmcpIHZhbHVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG5ld3ZhbCAmPSAweGZmN2ZmMGYwOwotICAgICAgbmV3dmFsIHw9ICgodmFsdWUgPj4gNCkgPDwgOCkgfCAodmFsdWUgJiAweGYpIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw6Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIAotICAgICAgaWYgKHZhbHVlIDwgMCkKLQl2YWx1ZSA9IC0gdmFsdWU7Ci0KLSAgICAgIGlmICh2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMCkgPT0gRkFJTCkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIAotCQkJXygiaW52YWxpZCBsaXRlcmFsIGNvbnN0YW50OiBwb29sIG5lZWRzIHRvIGJlIGNsb3NlciIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjAwMDsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU06Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDMyCi0JICB8fCAodmFsdWUgPT0gMzIgCi0JICAgICAgJiYgKCgobmV3dmFsICYgMHg2MCkgPT0gMCkgfHwgKG5ld3ZhbCAmIDB4NjApID09IDB4NjApKSkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJzaGlmdCBleHByZXNzaW9uIGlzIHRvbyBsYXJnZSIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHZhbHVlID09IDApCi0JbmV3dmFsICY9IH4weDYwOwkvKiBTaGlmdHMgb2YgemVybyBtdXN0IGJlIGRvbmUgYXMgbHNsICovCi0gICAgICBlbHNlIGlmICh2YWx1ZSA9PSAzMikKLQl2YWx1ZSA9IDA7Ci0gICAgICBuZXd2YWwgJj0gMHhmZmZmZjA3ZjsKLSAgICAgIG5ld3ZhbCB8PSAodmFsdWUgJiAweDFmKSA8PCA3OwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TV0k6Ci0gICAgICBpZiAoYXJtX2RhdGEtPnRodW1iX21vZGUpCi0JewotCSAgaWYgKCgodW5zaWduZWQgbG9uZykgdmFsdWUpID4gMHhmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIHN3aSBleHByZXNzaW9uIikpOwotCSAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpICYgMHhmZjAwOwotCSAgbmV3dmFsIHw9IHZhbHVlOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4MDBmZmZmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQkgIF8oIkludmFsaWQgc3dpIGV4cHJlc3Npb24iKSk7Ci0JICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKSAmIDB4ZmYwMDAwMDA7Ci0JICBuZXd2YWwgfD0gdmFsdWU7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9NVUxUSToKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4ZmZmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkludmFsaWQgZXhwcmVzc2lvbiBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIikpOwotICAgICAgbmV3dmFsID0gdmFsdWUgfCBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g6Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGlmICghIHRhcmdldF9vYWJpKQotICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSNlbmRpZgotICAgICAgdmFsdWUgID0gKHZhbHVlID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgICAgIHZhbHVlICA9ICh2YWx1ZSArIChuZXd2YWwgJiAweDAwZmZmZmZmKSkgJiAweDAwZmZmZmZmOwotICAgICAgbmV3dmFsID0gdmFsdWUgfCAobmV3dmFsICYgMHhmZjAwMDAwMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk6IC8qIGNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgewotICAgICAgICBhZGRyZXNzVCBkaWZmID0gKG5ld3ZhbCAmIDB4ZmYpIDw8IDE7Ci0gICAgICAgIGlmIChkaWZmICYgMHgxMDApCi0gICAgICAgICBkaWZmIHw9IH4weGZmOwotCi0gICAgICAgIHZhbHVlICs9IGRpZmY7Ci0gICAgICAgIGlmICgodmFsdWUgJiB+MHhmZikgJiYgKCh2YWx1ZSAmIH4weGZmKSAhPSB+MHhmZikpCi0gICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIF8oIkJyYW5jaCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgIG5ld3ZhbCA9IChuZXd2YWwgJiAweGZmMDApIHwgKCh2YWx1ZSAmIDB4MWZmKSA+PiAxKTsKLSAgICAgIH0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjogLyogdW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIHsKLSAgICAgICAgYWRkcmVzc1QgZGlmZiA9IChuZXd2YWwgJiAweDdmZikgPDwgMTsKLSAgICAgICAgaWYgKGRpZmYgJiAweDgwMCkKLSAgICAgICAgIGRpZmYgfD0gfjB4N2ZmOwotCi0gICAgICAgIHZhbHVlICs9IGRpZmY7Ci0gICAgICAgIGlmICgodmFsdWUgJiB+MHg3ZmYpICYmICgodmFsdWUgJiB+MHg3ZmYpICE9IH4weDdmZikpCi0gICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIF8oIkJyYW5jaCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgIG5ld3ZhbCA9IChuZXd2YWwgJiAweGY4MDApIHwgKCh2YWx1ZSAmIDB4ZmZmKSA+PiAxKTsKLSAgICAgIH0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMzoKLSAgICAgIHsKLSAgICAgICAgb2Zmc2V0VCBuZXd2YWwyOwotICAgICAgICBhZGRyZXNzVCBkaWZmOwotCi0JbmV3dmFsICA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgICAgbmV3dmFsMiA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmICsgVEhVTUJfU0laRSwgVEhVTUJfU0laRSk7Ci0gICAgICAgIGRpZmYgPSAoKG5ld3ZhbCAmIDB4N2ZmKSA8PCAxMikgfCAoKG5ld3ZhbDIgJiAweDdmZikgPDwgMSk7Ci0gICAgICAgIGlmIChkaWZmICYgMHg0MDAwMDApCi0JICBkaWZmIHw9IH4weDNmZmZmZjsKLSNpZmRlZiBPQkpfRUxGCi0JdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0jZW5kaWYKLSAgICAgICAgdmFsdWUgKz0gZGlmZjsKLSAgICAgICAgaWYgKCh2YWx1ZSAmIH4weDNmZmZmZikgJiYgKCh2YWx1ZSAmIH4weDNmZmZmZikgIT0gfjB4M2ZmZmZmKSkKLQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCV8oIkJyYW5jaCB3aXRoIGxpbmsgb3V0IG9mIHJhbmdlIikpOwotCi0gICAgICAgIG5ld3ZhbCAgPSAobmV3dmFsICAmIDB4ZjgwMCkgfCAoKHZhbHVlICYgMHg3ZmZmZmYpID4+IDEyKTsKLSAgICAgICAgbmV3dmFsMiA9IChuZXd2YWwyICYgMHhmODAwKSB8ICgodmFsdWUgJiAweGZmZikgPj4gMSk7Ci0gICAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIFRIVU1CX1NJWkUpOwotICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiArIFRIVU1CX1NJWkUsIG5ld3ZhbDIsIFRIVU1CX1NJWkUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAxKTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDEpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSB8fCBmaXhQLT5meF9wY3JlbCkKLQltZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGVsc2UgaWYgKCF0YXJnZXRfb2FiaSkKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMik7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVDMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1RPRkY6Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIDAsIDQpOwotCWJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSB8fCBmaXhQLT5meF9wY3JlbCkKLQltZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDQpOwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGVsc2UgaWYgKCF0YXJnZXRfb2FiaSkKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgNCk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1BMVDMyOgotICAgICAgLyogSXQgYXBwZWFycyB0aGUgaW5zdHJ1Y3Rpb24gaXMgZnVsbHkgcHJlcGFyZWQgYXQgdGhpcyBwb2ludC4gKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UUEM6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTToKLSAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOwotICAgICAgaWYgKHZhbHVlIDwgLTEwMjMgfHwgdmFsdWUgPiAxMDIzIHx8ICh2YWx1ZSAmIDMpKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygiSWxsZWdhbCB2YWx1ZSBmb3IgY28tcHJvY2Vzc29yIG9mZnNldCIpKTsKLSAgICAgIGlmICh2YWx1ZSA8IDApCi0JdmFsdWUgPSAtdmFsdWU7Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKSAmIDB4ZmY3ZmZmMDA7Ci0gICAgICBuZXd2YWwgfD0gKHZhbHVlID4+IDIpIHwgKHNpZ24gPyAgSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOgotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgLyogRXhhY3RseSB3aGF0IHJhbmdlcywgYW5kIHdoZXJlIHRoZSBvZmZzZXQgaXMgaW5zZXJ0ZWQgZGVwZW5kcyBvbgotCSB0aGUgdHlwZSBvZiBpbnN0cnVjdGlvbiwgd2UgY2FuIGVzdGFibGlzaCB0aGlzIGZyb20gdGhlIHRvcCA0IGJpdHMgKi8KLSAgICAgIHN3aXRjaCAobmV3dmFsID4+IDEyKQotCXsKLQljYXNlIDQ6IC8qIFBDIGxvYWQgKi8KLQkgIC8qIFRodW1iIFBDIGxvYWRzIGFyZSBzb21ld2hhdCBvZGQsIGJpdCAxIG9mIHRoZSBQQyBpcwotCSAgICAgZm9yY2VkIHRvIHplcm8gZm9yIHRoZXNlIGxvYWRzLCBzbyB3ZSB3aWxsIG5lZWQgdG8gcm91bmQKLQkgICAgIHVwIHRoZSBvZmZzZXQgaWYgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MgaXMgbm90IHdvcmQKLQkgICAgIGFsaWduZWQgKHNpbmNlIHRoZSBmaW5hbCBhZGRyZXNzIHByb2R1Y2VkIG11c3QgYmUsIGFuZAotCSAgICAgd2UgY2FuIG9ubHkgZGVzY3JpYmUgd29yZC1hbGlnbmVkIGltbWVkaWF0ZSBvZmZzZXRzKS4gICovCi0KLQkgIGlmICgoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlICsgdmFsdWUpICYgMykKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCwgdGFyZ2V0IG5vdCB3b3JkIGFsaWduZWQgKDB4JTA4WCkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlICsgdmFsdWUpKTsKLQotCSAgaWYgKCh2YWx1ZSArIDIpICYgfjB4M2ZlKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0LCB2YWx1ZSB0b28gYmlnICgweCUwOFgpIiksIHZhbHVlKTsKLQotICAgICAgICAgIC8qIFJvdW5kIHVwLCBzaW5jZSBwYyB3aWxsIGJlIHJvdW5kZWQgZG93bi4gICovCi0JICBuZXd2YWwgfD0gKHZhbHVlICsgMikgPj4gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA5OiAvKiBTUCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgzZmMpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQsIHZhbHVlIHRvbyBiaWcgKDB4JTA4WCkiKSwgdmFsdWUpOwotCSAgbmV3dmFsIHw9IHZhbHVlID4+IDI7Ci0JICBicmVhazsKLQotCWNhc2UgNjogLyogV29yZCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHg3YykKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCwgdmFsdWUgdG9vIGJpZyAoMHglMDhYKSIpLCB2YWx1ZSk7Ci0JICBuZXd2YWwgfD0gdmFsdWUgPDwgNDsgLyogNiAtIDIgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSA3OiAvKiBCeXRlIGxvYWQvc3RvcmUgKi8KLQkgIGlmICh2YWx1ZSAmIH4weDFmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0LCB2YWx1ZSB0b28gYmlnICgweCUwOFgpIiksIHZhbHVlKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA2OwotCSAgYnJlYWs7Ci0KLQljYXNlIDg6IC8qIEhhbGZ3b3JkIGxvYWQvc3RvcmUgKi8KLQkgIGlmICh2YWx1ZSAmIH4weDNlKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0LCB2YWx1ZSB0b28gYmlnICgweCUwOFgpIiksIHZhbHVlKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA1OyAvKiA2IC0gMSAqLwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJIlVuYWJsZSB0byBwcm9jZXNzIHJlbG9jYXRpb24gZm9yIHRodW1iIG9wY29kZTogJWx4IiwKLQkJCSh1bnNpZ25lZCBsb25nKSBuZXd2YWwpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ6Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tcGxpY2F0ZWQgcmVsb2NhdGlvbiwgc2luY2Ugd2UgdXNlIGl0IGZvciBhbGwgb2YKLSAgICAgICAgIHRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHJlbG9jYXRpb25zOgotICAgICAgICAgICAgM2JpdCBBREQvU1VCCi0gICAgICAgICAgICA4Yml0IEFERC9TVUIKLSAgICAgICAgICAgIDliaXQgQUREL1NVQiBTUCB3b3JkLWFsaWduZWQKLSAgICAgICAgICAgMTBiaXQgQUREIFBDL1NQIHdvcmQtYWxpZ25lZAotCi0gICAgICAgICBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbiBiZWluZyBwcm9jZXNzZWQgaXMgZW5jb2RlZCBpbiB0aGUKLSAgICAgICAgIGluc3RydWN0aW9uIGZpZWxkOgotICAgICAgICAgICAweDgwMDAgIFNVQgotICAgICAgICAgICAweDAwRjAgIFJkCi0gICAgICAgICAgIDB4MDAwRiAgUnMKLSAgICAgICovCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICB7Ci0gICAgICAgIGludCByZCA9IChuZXd2YWwgPj4gNCkgJiAweGY7Ci0gICAgICAgIGludCBycyA9IG5ld3ZhbCAmIDB4ZjsKLSAgICAgICAgaW50IHN1YnRyYWN0ID0gbmV3dmFsICYgMHg4MDAwOwotCi0gICAgICAgIGlmIChyZCA9PSBSRUdfU1ApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4MWZjKQotICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHN0YWNrIGFkZHJlc3MgY2FsY3VsYXRpb24iKSk7Ci0gICAgICAgICAgICBuZXd2YWwgPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9TVCA6IFRfT1BDT0RFX0FERF9TVDsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZSA+PiAyOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocnMgPT0gUkVHX1BDIHx8IHJzID09IFJFR19TUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3VidHJhY3QgfHwKLSAgICAgICAgICAgICAgICB2YWx1ZSAmIH4weDNmYykKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uICh2YWx1ZSA9IDB4JTA4bFgpIiksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIHZhbHVlKTsKLSAgICAgICAgICAgIG5ld3ZhbCA9IChycyA9PSBSRUdfUEMgPyBUX09QQ09ERV9BRERfUEMgOiBUX09QQ09ERV9BRERfU1ApOwotICAgICAgICAgICAgbmV3dmFsIHw9IHJkIDw8IDg7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gdmFsdWUgPj4gMjsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJzID09IHJkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAmIH4weGZmKQotICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCA4Yml0IGltbWVkaWF0ZSIpKTsKLSAgICAgICAgICAgIG5ld3ZhbCA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX0k4IDogVF9PUENPREVfQUREX0k4OwotICAgICAgICAgICAgbmV3dmFsIHw9IChyZCA8PCA4KSB8IHZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAmIH4weDcpCi0gICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIDNiaXQgaW1tZWRpYXRlIikpOwotICAgICAgICAgICAgbmV3dmFsID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTMgOiBUX09QQ09ERV9BRERfSTM7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gcmQgfCAocnMgPDwgMykgfCAodmFsdWUgPDwgNik7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NOgotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgc3dpdGNoIChuZXd2YWwgPj4gMTEpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAweDA0OiAvKiA4Yml0IGltbWVkaWF0ZSBNT1YgKi8KLSAgICAgICAgY2FzZSAweDA1OiAvKiA4Yml0IGltbWVkaWF0ZSBDTVAgKi8KLSAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KQotICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIGltbWVkaWF0ZTogJWxkIGlzIHRvbyBsYXJnZSIpLAotCQkJICAobG9uZykgdmFsdWUpOwotICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDoKLSAgICAgIC8qIDViaXQgc2hpZnQgdmFsdWUgKDAuLjMxKSAqLwotICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDMxKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygiSWxsZWdhbCBUaHVtYiBzaGlmdCB2YWx1ZTogJWxkIiksIChsb25nKSB2YWx1ZSk7Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSkgJiAweGYwM2Y7Ci0gICAgICBuZXd2YWwgfD0gdmFsdWUgPDwgNjsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oIkJhZCByZWxvY2F0aW9uIGZpeHVwIHR5cGUgKCVkKSIpLCBmaXhQLT5meF9yX3R5cGUpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICAqLwotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgZml4UyAqIGZpeHA7Ci17Ci0gIGFyZWxlbnQgKiByZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIC8qIEBAIFdoeSBmeF9hZGRudW1iZXIgc29tZXRpbWVzIGFuZCBmeF9vZmZzZXQgb3RoZXIgdGltZXM/ICAqLwotI2lmbmRlZiBPQkpfRUxGCi0gIGlmIChmaXhwLT5meF9wY3JlbCA9PSAwKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0ID0gcmVsb2MtPmFkZHJlc3M7Ci0jZWxzZSAgLyogT0JKX0VMRiAqLwotICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotI2VuZGlmCi0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JewotCSAgY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JewotCSAgY29kZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLQotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIOgotICAgIGNhc2UgQkZEX1JFTE9DX1JWQTogICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5OgotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9MSVRFUkFMOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw6Ci0gICAgICAvKiBJZiB0aGlzIGlzIGNhbGxlZCB0aGVuIHRoZSBhIGxpdGVyYWwgaGFzIGJlZW4gcmVmZXJlbmNlZCBhY3Jvc3MKLQkgYSBzZWN0aW9uIGJvdW5kYXJ5IC0gcG9zc2libHkgZHVlIHRvIGFuIGltcGxpY2l0IGR1bXAgKi8KLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkxpdGVyYWwgcmVmZXJlbmNlZCBhY3Jvc3Mgc2VjdGlvbiBib3VuZGFyeSAoSW1wbGljaXQgZHVtcD8pIikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVDMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1RPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1BMVDMyOgotICAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU6Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKElNTUVESUFURSkiKSwKLQkJICAgIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURToKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkFEUkwgdXNlZCBmb3IgYSBzeW1ib2wgbm90IGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZSIpLAotCQkgICAgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU06Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKE9GRlNFVF9JTU0pIiksCi0JCSAgICBmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgewotCWNoYXIgKiB0eXBlOwotCXN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotCSAgewotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURTogICAgdHlwZSA9ICJJTU1FRElBVEUiOyAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOiAgIHR5cGUgPSAiT0ZGU0VUX0lNTSI7ICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg6ICB0eXBlID0gIk9GRlNFVF9JTU04IjsgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTTogICAgdHlwZSA9ICJTSElGVF9JTU0iOyAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9TV0k6ICAgICAgICAgIHR5cGUgPSAiU1dJIjsgICAgICAgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fTVVMVEk6ICAgICAgICB0eXBlID0gIk1VTFRJIjsgICAgICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU06ICAgdHlwZSA9ICJDUF9PRkZfSU1NIjsgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ6ICAgIHR5cGUgPSAiVEhVTUJfQUREIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQ6ICB0eXBlID0gIlRIVU1CX1NISUZUIjsgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTTogICAgdHlwZSA9ICJUSFVNQl9JTU0iOyAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ6IHR5cGUgPSAiVEhVTUJfT0ZGU0VUIjsgYnJlYWs7Ci0JICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gXygiPHVua25vd24+Iik7IGJyZWFrOwotCSAgfQotCWFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCAoJWQpIiksCi0JCSAgICAgIHR5cGUsIGZpeHAtPmZ4X3BjcmVsKTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBPQkpfRUxGCi0gaWYgKGNvZGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMCi0gICAgICYmIEdPVF9zeW1ib2wKLSAgICAgJiYgZml4cC0+ZnhfYWRkc3kgPT0gR09UX3N5bWJvbCkKLSAgIHsKLSAgICAgY29kZSA9IEJGRF9SRUxPQ19BUk1fR09UUEM7Ci0gICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQgPSByZWxvYy0+YWRkcmVzczsKLSAgIH0KLSNlbmRpZgotICAgCi0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLQotICBpZiAocmVsb2MtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgLyogSEFDSzogU2luY2UgYXJtIEVMRiB1c2VzIFJlbCBpbnN0ZWFkIG9mIFJlbGEsIGVuY29kZSB0aGUKLSAgICAgIHZ0YWJsZSBlbnRyeSB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uJ3Mgc2VjdGlvbiBvZmZzZXQuICAqLwotICAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X29mZnNldDsKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWd0eXBlKQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBzZWdUICAgIHNlZ3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIikpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLW91dHB1dF9pbnN0IFBBUkFNUyAoKHZvaWQpKQotewotICBjaGFyICogdG8gPSBOVUxMOwotICAgIAotICBpZiAoaW5zdC5lcnJvcikKLSAgICB7Ci0gICAgICBhc19iYWQgKGluc3QuZXJyb3IpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0byA9IGZyYWdfbW9yZSAoaW5zdC5zaXplKTsKLSAgCi0gIGlmICh0aHVtYl9tb2RlICYmIChpbnN0LnNpemUgPiBUSFVNQl9TSVpFKSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc3Quc2l6ZSA9PSAoMiAqIFRIVU1CX1NJWkUpKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG8sIGluc3QuaW5zdHJ1Y3Rpb24gPj4gMTYsIFRIVU1CX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0byArIFRIVU1CX1NJWkUsIGluc3QuaW5zdHJ1Y3Rpb24sIFRIVU1CX1NJWkUpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5zdC5zaXplID4gSU5TTl9TSVpFKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zdC5zaXplID09ICgyICogSU5TTl9TSVpFKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uLCBJTlNOX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0byArIElOU05fU0laRSwgaW5zdC5pbnN0cnVjdGlvbiwgSU5TTl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uLCBpbnN0LnNpemUpOwotCi0gIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgZml4X25ld19hcm0gKGZyYWdfbm93LCB0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgaW5zdC5zaXplLCAmIGluc3QucmVsb2MuZXhwLCBpbnN0LnJlbG9jLnBjX3JlbCwKLQkJIGluc3QucmVsb2MudHlwZSk7Ci0KLSAgcmV0dXJuOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBjaGFyICAgYzsKLSAgY2hhciAqIHA7Ci0gIGNoYXIgKiBxOwotICBjaGFyICogc3RhcnQ7Ci0KLSAgLyogQWxpZ24gdGhlIGluc3RydWN0aW9uLgotICAgICBUaGlzIG1heSBub3QgYmUgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGJ1dCAuLi4gKi8KLSAgLyogYXJtX2FsaWduICgyLCAwKTsgKi8KLSAgbGlzdGluZ19wcmV2X2xpbmUgKCk7IC8qIERlZmluZWQgaW4gbGlzdGluZy5oICovCi0KLSAgLyogQWxpZ24gdGhlIHByZXZpb3VzIGxhYmVsIGlmIG5lZWRlZC4gICovCi0gIGlmIChsYXN0X2xhYmVsX3NlZW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxhc3RfbGFiZWxfc2VlbiwgZnJhZ19ub3cpOwotICAgICAgU19TRVRfVkFMVUUgKGxhc3RfbGFiZWxfc2VlbiwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGxhc3RfbGFiZWxfc2Vlbiwgbm93X3NlZyk7Ci0gICAgfQotCi0gIG1lbXNldCAoJmluc3QsICdcMCcsIHNpemVvZiAoaW5zdCkpOwotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0gIAotICAvKiBTY2FuIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG9wLWNvZGUsIHdoaWNoIG11c3QgZW5kIGluIHdoaXRlIHNwYWNlIG9yCi0gICAgIGVuZCBvZiBzdHJpbmcuICAqLwotICBmb3IgKHN0YXJ0ID0gcCA9IHN0cjsgKnAgIT0gJ1wwJzsgcCsrKQotICAgIGlmICgqcCA9PSAnICcpCi0gICAgICBicmVhazsKLSAgICAKLSAgaWYgKHAgPT0gc3RyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTm8gb3BlcmF0b3IgLS0gc3RhdGVtZW50IGAlcydcbiIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAodGh1bWJfbW9kZSkKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICogb3Bjb2RlOwotCi0gICAgICBjID0gKnA7Ci0gICAgICAqcCA9ICdcMCc7Ci0gICAgICBvcGNvZGUgPSAoQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFybV90b3BzX2hzaCwgc3RyKTsKLSAgICAgICpwID0gYzsKLSAgICAgIAotICAgICAgaWYgKG9wY29kZSkKLQl7Ci0JICAvKiBDaGVjayB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIGZvciB0aGlzIENQVS4gICovCi0JICBpZiAodGh1bWJfbW9kZSA9PSAxICYmIChvcGNvZGUtPnZhcmlhbnRzICYgY3B1X3ZhcmlhbnQpID09IDApCi0JICAgICB7Ci0JICAgIAlhc19iYWQgKF8oInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3Bjb2RlIikpOwotCQlyZXR1cm47Ci0JICAgICB9Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSBvcGNvZGUtPnZhbHVlOwotCSAgaW5zdC5zaXplID0gb3Bjb2RlLT5zaXplOwotCSAgKCpvcGNvZGUtPnBhcm1zKShwKTsKLQkgIG91dHB1dF9pbnN0ICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSAqIG9wY29kZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgY29uZF9jb2RlOwotCi0gICAgICBpbnN0LnNpemUgPSBJTlNOX1NJWkU7Ci0gICAgICAvKiBwIG5vdyBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgb3Bjb2RlLCBwcm9iYWJseSB3aGl0ZSBzcGFjZSwgYnV0IHdlCi0JIGhhdmUgdG8gYnJlYWsgdGhlIG9wY29kZSB1cCBpbiBjYXNlIGl0IGNvbnRhaW5zIGNvbmRpb25hbHMgYW5kIGZsYWdzOwotCSBrZWVwIHRyeWluZyB3aXRoIHByb2dyZXNzaXZlbHkgc21hbGxlciBiYXNpYyBpbnN0cnVjdGlvbnMgdW50aWwgb25lCi0JIG1hdGNoZXMsIG9yIHdlIHJ1biBvdXQgb2Ygb3Bjb2RlLiAgKi8KLSAgICAgIHEgPSAocCAtIHN0ciA+IExPTkdFU1RfSU5TVCkgPyBzdHIgKyBMT05HRVNUX0lOU1QgOiBwOwotICAgICAgZm9yICg7IHEgIT0gc3RyOyBxLS0pCi0JewotCSAgYyA9ICpxOwotCSAgKnEgPSAnXDAnOwotCSAgb3Bjb2RlID0gKENPTlNUIHN0cnVjdCBhc21fb3Bjb2RlICopIGhhc2hfZmluZCAoYXJtX29wc19oc2gsIHN0cik7Ci0JICAqcSA9IGM7Ci0JICAKLQkgIGlmIChvcGNvZGUgJiYgb3Bjb2RlLT50ZW1wbGF0ZSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ19iaXRzID0gMDsKLQkgICAgICBjaGFyICogcjsKLQotCSAgICAgIC8qIENoZWNrIHRoYXQgdGhpcyBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgQ1BVLiAgKi8KLQkgICAgICBpZiAoKG9wY29kZS0+dmFyaWFudHMgJiBjcHVfdmFyaWFudCkgPT0gMCkKLQkJZ290byB0cnlfc2hvcnRlcjsKLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBvcGNvZGUtPnZhbHVlOwotCSAgICAgIGlmIChxID09IHApCQkvKiBKdXN0IGEgc2ltcGxlIG9wY29kZS4gICovCi0JCXsKLQkJICBpZiAob3Bjb2RlLT5jb21wX3N1ZmZpeCkKLQkJICAgIHsKLQkJICAgICAgIGlmICgqb3Bjb2RlLT5jb21wX3N1ZmZpeCAhPSAnXDAnKQotCQkgICAgCSBhc19iYWQgKF8oIk9wY29kZSBgJXMnIG11c3QgaGF2ZSBzdWZmaXggZnJvbSA8JXM+XG4iKSwKLQkJCSAgICAgc3RyLCBvcGNvZGUtPmNvbXBfc3VmZml4KTsKLQkJICAgICAgIGVsc2UKLQkJCSAvKiBOb3QgYSBjb25kaXRpb25hbCBpbnN0cnVjdGlvbi4gKi8KLQkJICAgICAgICAgKCpvcGNvZGUtPnBhcm1zKShxLCAwKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIEEgY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gd2l0aCBkZWZhdWx0IGNvbmRpdGlvbi4gKi8KLQkJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDT05EX0FMV0FZUzsKLQkJICAgICAgKCpvcGNvZGUtPnBhcm1zKShxLCAwKTsKLQkJICAgIH0KLQkJICBvdXRwdXRfaW5zdCAoKTsKLQkJICByZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIE5vdCBqdXN0IGEgc2ltcGxlIG9wY29kZS4gIENoZWNrIGlmIGV4dHJhIGlzIGEgY29uZGl0aW9uYWwuICovCi0JICAgICAgciA9IHE7Ci0JICAgICAgaWYgKHAgLSByID49IDIpCi0JCXsKLQkJICBDT05TVCBzdHJ1Y3QgYXNtX2NvbmQgKmNvbmQ7Ci0JCSAgY2hhciBkID0gKihyICsgMik7Ci0KLQkJICAqKHIgKyAyKSA9ICdcMCc7Ci0JCSAgY29uZCA9IChDT05TVCBzdHJ1Y3QgYXNtX2NvbmQgKikgaGFzaF9maW5kIChhcm1fY29uZF9oc2gsIHIpOwotCQkgICoociArIDIpID0gZDsKLQkJICBpZiAoY29uZCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbmQtPnZhbHVlID09IDB4ZjAwMDAwMDApCi0JCQlhc190c2t0c2sgKAotXygiV2FybmluZzogVXNlIG9mIHRoZSAnbnYnIGNvbmRpdGlvbmFsIGlzIGRlcHJlY2F0ZWRcbiIpKTsKLQotCQkgICAgICBjb25kX2NvZGUgPSBjb25kLT52YWx1ZTsKLQkJICAgICAgciArPSAyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGNvbmRfY29kZSA9IENPTkRfQUxXQVlTOwotCQl9Ci0JICAgICAgZWxzZQotCQljb25kX2NvZGUgPSBDT05EX0FMV0FZUzsKLQotCi0JICAgICAgLyogQXBwbHkgdGhlIGNvbmRpdGlvbmFsLCBvciBjb21wbGFpbiBpdCdzIG5vdCBhbGxvd2VkLiAqLwotCSAgICAgIGlmIChvcGNvZGUtPmNvbXBfc3VmZml4ICYmICpvcGNvZGUtPmNvbXBfc3VmZml4ID09ICdcMCcpCi0JCXsKLQkJICAgLyogSW5zdHJ1Y3Rpb24gaXNuJ3QgY29uZGl0aW9uYWwgKi8KLQkJICAgaWYgKGNvbmRfY29kZSAhPSBDT05EX0FMV0FZUykKLQkJICAgICB7Ci0JCSAgICAgICBhc19iYWQgKF8oIk9wY29kZSBgJXMnIGlzIHVuY29uZGl0aW9uYWxcbiIpLCBzdHIpOwotCQkgICAgICAgcmV0dXJuOwotCQkgICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJLyogSW5zdHJ1Y3Rpb24gaXMgY29uZGl0aW9uYWw6IHNldCB0aGUgY29uZGl0aW9uIGludG8gaXQuICovCi0JCWluc3QuaW5zdHJ1Y3Rpb24gfD0gY29uZF9jb2RlOwkgICAgIAotCi0KLQkgICAgICAvKiBJZiB0aGVyZSBpcyBhIGNvbXB1bHNvcnkgc3VmZml4LCBpdCBzaG91bGQgY29tZSBoZXJlLCBiZWZvcmUKLQkJIGFueSBvcHRpb25hbCBmbGFncy4gICovCi0JICAgICAgaWYgKG9wY29kZS0+Y29tcF9zdWZmaXggJiYgKm9wY29kZS0+Y29tcF9zdWZmaXggIT0gJ1wwJykKLQkJewotCQkgIENPTlNUIGNoYXIgKnMgPSBvcGNvZGUtPmNvbXBfc3VmZml4OwotCi0JCSAgd2hpbGUgKCpzKQotCQkgICAgewotCQkgICAgICBpbnN0LnN1ZmZpeCsrOwotCQkgICAgICBpZiAoKnIgPT0gKnMpCi0JCQlicmVhazsKLQkJICAgICAgcysrOwotCQkgICAgfQotCi0JCSAgaWYgKCpzID09ICdcMCcpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiT3Bjb2RlIGAlcycgbXVzdCBoYXZlIHN1ZmZpeCBmcm9tIDwlcz5cbiIpLCBzdHIsCi0JCQkgICAgICBvcGNvZGUtPmNvbXBfc3VmZml4KTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCi0JCSAgcisrOwotCQl9Ci0KLQkgICAgICAvKiBUaGUgcmVtYWluZGVyLCBpZiBhbnkgc2hvdWxkIG5vdyBiZSBmbGFncyBmb3IgdGhlIGluc3RydWN0aW9uOwotCQkgU2NhbiB0aGVzZSBjaGVja2luZyBlYWNoIG9uZSBmb3VuZCB3aXRoIHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGlmIChyICE9IHApCi0JCXsKLQkJICBjaGFyIGQ7Ci0JCSAgQ09OU1Qgc3RydWN0IGFzbV9mbGcgKmZsYWcgPSBvcGNvZGUtPmZsYWdzOwotCi0JCSAgaWYgKGZsYWcpCi0JCSAgICB7Ci0JCSAgICAgIGludCBmbGFnbm87Ci0KLQkJICAgICAgZCA9ICpwOwotCQkgICAgICAqcCA9ICdcMCc7Ci0KLQkJICAgICAgZm9yIChmbGFnbm8gPSAwOyBmbGFnW2ZsYWdub10udGVtcGxhdGU7IGZsYWdubysrKQotCQkJewotCQkJICBpZiAoc3RyZXEgKHIsIGZsYWdbZmxhZ25vXS50ZW1wbGF0ZSkpCi0JCQkgICAgewotCQkJICAgICAgZmxhZ19iaXRzIHw9IGZsYWdbZmxhZ25vXS5zZXRfYml0czsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICAqcCA9IGQ7Ci0JCSAgICAgIGlmICghIGZsYWdbZmxhZ25vXS50ZW1wbGF0ZSkKLQkJCWdvdG8gdHJ5X3Nob3J0ZXI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZ290byB0cnlfc2hvcnRlcjsKLQkJfQotCi0JICAgICAgKCpvcGNvZGUtPnBhcm1zKSAocCwgZmxhZ19iaXRzKTsKLQkgICAgICBvdXRwdXRfaW5zdCAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCXRyeV9zaG9ydGVyOgotCSAgOwotCX0KLSAgICB9Ci0KLSAgLyogSXQgd2Fzbid0IGFuIGluc3RydWN0aW9uLCBidXQgaXQgbWlnaHQgYmUgYSByZWdpc3RlciBhbGlhcyBvZiB0aGUgZm9ybQotICAgICBhbGlhcyAucmVxIHJlZyAqLwotICBxID0gcDsKLSAgc2tpcF93aGl0ZXNwYWNlIChxKTsKLQotICBjID0gKnA7Ci0gICpwID0gJ1wwJzsKLSAgICAKLSAgaWYgKCpxICYmICFzdHJuY21wIChxLCAiLnJlcSAiLCA0KSkKLSAgICB7Ci0gICAgICBpbnQgICAgcmVnOwotICAgICAgY2hhciAqIGNvcHlfb2Zfc3RyID0gc3RyOwotICAgICAgY2hhciAqIHI7Ci0gICAgICAKLSAgICAgIHEgKz0gNDsKLSAgICAgIHNraXBfd2hpdGVzcGFjZSAocSk7Ci0KLSAgICAgIGZvciAociA9IHE7ICpyICE9ICdcMCc7IHIrKykKLQlpZiAoKnIgPT0gJyAnKQotCSAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGlmIChyICE9IHEpCi0JewotCSAgaW50IHJlZ251bTsKLQkgIGNoYXIgZCA9ICpyOwotCi0JICAqciA9ICdcMCc7Ci0JICByZWdudW0gPSBhcm1fcmVnX3BhcnNlICgmIHEpOwotCSAgKnIgPSBkOwotCi0JICByZWcgPSBhcm1fcmVnX3BhcnNlICgmIHN0cik7Ci0JICAKLQkgIGlmIChyZWcgPT0gRkFJTCkKLQkgICAgewotCSAgICAgIGlmIChyZWdudW0gIT0gRkFJTCkKLQkJaW5zZXJ0X3JlZ19hbGlhcyAoc3RyLCByZWdudW0pOwotCSAgICAgIGVsc2UKLQkJYXNfd2FybiAoXygicmVnaXN0ZXIgJyVzJyBkb2VzIG5vdCBleGlzdFxuIiksIHEpOwotCSAgICB9Ci0JICBlbHNlIGlmIChyZWdudW0gIT0gRkFJTCkKLQkgICAgewotCSAgICAgIGlmIChyZWcgIT0gcmVnbnVtKQotCQlhc193YXJuIChfKCJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyIpLCBjb3B5X29mX3N0ciApOwotCSAgICAgIAotCSAgICAgIC8qIERvIG5vdCB3YXJuIGFib3V0IHJlZGVmaW5pdGlvbnMgdG8gdGhlIHNhbWUgYWxpYXMuICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIHRvIG5vbi1leGlzdGFudCByZWdpc3RlciAnJXMnIiksCi0JCSAgICAgY29weV9vZl9zdHIsIHEpOwotCX0KLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJpZ25vcmluZyBpbmNvbXBsZXRlIC5yZXEgcHNldXNvIG9wIikpOwotICAgICAgCi0gICAgICAqcCA9IGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICpwID0gYzsKLSAgYXNfYmFkIChfKCJiYWQgaW5zdHJ1Y3Rpb24gYCVzJyIpLCBzdGFydCk7Ci19Ci0KLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqICAgIEludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gKiAgICBTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBUaGVzZSBhcmU6Ci0gKiAgICBDcHUgdmFyaWFudHMsIHRoZSBhcm0gcGFydCBpcyBvcHRpb25hbDoKLSAqICAgICAgICAgICAgLW1bYXJtXTEgICAgICAgICAgICAgICAgQ3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCi0gKiAgICAgICAgICAgIC1tW2FybV0yLCAtbVthcm1dMjUwICAgIEFybSAyIGFuZCBBcm0gMjUwIHByb2Nlc3NvcgotICogICAgICAgICAgICAtbVthcm1dMyAgICAgICAgICAgICAgICBBcm0gMyBwcm9jZXNzb3IKLSAqICAgICAgICAgICAgLW1bYXJtXTZbeHhdLCAgICAgICAgICAgQXJtIDYgcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbVthcm1dN1t4eF1bdF1bW2RdbV0gICBBcm0gNyBwcm9jZXNzb3JzCi0gKiAgICAgICAgICAgIC1tW2FybV04WzEwXSAgICAgICAgICAgIEFybSA4IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1bYXJtXTlbMjBdW3RkbWldICAgICAgQXJtIDkgcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbXN0cm9uZ2FybVsxMTBbMF1dICAgICBTdHJvbmdBUk0gcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbVthcm1ddlsyMzQ1XQkgICAgICBBcm0gYXJjaGl0ZWN0dXJlcwotICogICAgICAgICAgICAtbWFsbCAgICAgICAgICAgICAgICAgICBBbGwgKGV4Y2VwdCB0aGUgQVJNMSkKLSAqICAgIEZQIHZhcmlhbnRzOgotICogICAgICAgICAgICAtbWZwYTEwLCAtbWZwYTExICAgICAgICBGUEExMCBhbmQgMTEgY28tcHJvY2Vzc29yIGluc3RydWN0aW9ucwotICogICAgICAgICAgICAtbWZwZS1vbGQgICAgICAgICAgICAgICAoTm8gZmxvYXQgbG9hZC9zdG9yZSBtdWx0aXBsZXMpCi0gKiAgICAgICAgICAgIC1tbm8tZnB1ICAgICAgICAgICAgICAgIERpc2FibGUgYWxsIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucwotICogICAgUnVuLXRpbWUgZW5kaWFuIHNlbGVjdGlvbjoKLSAqICAgICAgICAgICAgLUVCICAgICAgICAgICAgICAgICAgICAgYmlnIGVuZGlhbiBjcHUKLSAqICAgICAgICAgICAgLUVMICAgICAgICAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbiBjcHUKLSAqICAgIEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZDoKLSAqCSAgICAgIC1tYXBjcy0zMgkJICAgICAgMzIgYml0IEFQQ1MKLSAqCSAgICAgIC1tYXBjcy0yNgkJICAgICAgMjYgYml0IEFQQ1MKLSAqCSAgICAgIC1tYXBjcy1mbG9hdAkgICAgICBQYXNzIGZsb2F0cyBpbiBmbG9hdCByZWdzCi0gKgkgICAgICAtbWFwY3MtcmVlbnRyYW50ICAgICAgICBQb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlCi0gKiAgICAgICAgICAgIC1tdGh1bWItaW50ZXJ3b3JrICAgICAgIENvZGUgc3VwcG9ydHMgQXJtL1RodW1iIGludGVyd29ya2luZwotICogICAgICAgICAgICAtbW9hYmkgICAgICAgICAgICAgICAgICBPbGQgRUxGIEFCSQotICovCi0KLUNPTlNUIGNoYXIgKiBtZF9zaG9ydG9wdHMgPSAibTprIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jaWZkZWYgQVJNX0JJX0VORElBTgotI2RlZmluZSBPUFRJT05fRUIgKE9QVElPTl9NRF9CQVNFICsgMCkKLSAgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUJ9LAotI2RlZmluZSBPUFRJT05fRUwgKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUx9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OX09BQkkgKE9QVElPTl9NRF9CQVNFICsyKQotICB7Im9hYmkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09BQkl9LAotI2VuZGlmCi0jZW5kaWYKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCAgICBjOwotICAgICBjaGFyICogYXJnOwotewotICBjaGFyICogc3RyID0gYXJnOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0jaWZkZWYgQVJNX0JJX0VORElBTgotICAgIGNhc2UgT1BUSU9OX0VCOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRUw6Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSAnbSc6Ci0gICAgICBzd2l0Y2ggKCpzdHIpCi0JewotCWNhc2UgJ2YnOgotCSAgaWYgKHN0cmVxIChzdHIsICJmcGExMCIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9GUEExMDsKLQkgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcGExMSIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9GUEExMTsKLQkgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcGUtb2xkIikpCi0JICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkZQVV9BTEwpIHwgRlBVX0NPUkU7Ci0JICBlbHNlCi0JICAgIGdvdG8gYmFkOwotCSAgYnJlYWs7Ci0KLQljYXNlICduJzoKLQkgIGlmIChzdHJlcSAoc3RyLCAibm8tZnB1IikpCi0JICAgIGNwdV92YXJpYW50ICY9IH5GUFVfQUxMOwotCSAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgIGlmIChzdHJlcSAoc3RyLCAib2FiaSIpKQotICAgICAgICAgICAgdGFyZ2V0X29hYmkgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0JICAKLSAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgLyogTGltaXQgYXNzZW1ibGVyIHRvIGdlbmVyYXRpbmcgb25seSBUaHVtYiBpbnN0cnVjdGlvbnM6ICovCi0gICAgICAgICAgaWYgKHN0cmVxIChzdHIsICJ0aHVtYiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9USFVNQjsKLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfTk9ORTsKLSAgICAgICAgICAgICAgdGh1bWJfbW9kZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInRodW1iLWludGVyd29yayIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9USFVNQiB8IEFSTV9BUkNIX1Y0OwotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gICAgICAgICAgICAgIHN1cHBvcnRfaW50ZXJ3b3JrID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLQkgICAgZ290byBiYWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHN0cmVxIChzdHIsICJhbGwiKSkKLQkgICAgewotCSAgICAgIGNwdV92YXJpYW50ID0gQVJNX0FMTCB8IEZQVV9BTEw7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIH0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotCSAgaWYgKCEgc3RybmNtcCAoc3RyLCAiYXBjcy0iLCA1KSkKLQkgICAgewotCSAgICAgIC8qIEdDQyBwYXNzZXMgb24gYWxsIGNvbW1hbmQgbGluZSBvcHRpb25zIHN0YXJ0aW5nICItbWFwY3MtLi4uIgotCQkgdG8gdXMsIHNvIHdlIG11c3QgcGFyc2UgdGhlbSBoZXJlLiAgKi8KLQotCSAgICAgIHN0ciArPSA1OwotCSAgICAgIAotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMzIiKSkKLQkJewotCQkgIHVzZXNfYXBjc18yNiA9IGZhbHNlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjI2IikpCi0JCXsKLQkJICB1c2VzX2FwY3NfMjYgPSB0cnVlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgImZyYW1lIikpCi0JCXsKLQkJICAvKiBTdGFjayBmcmFtZXMgYXJlIGJlaW5nIGdlbmVyYXRlZCAtIGRvZXMgbm90IGFmZmVjdAotCQkgICAgIGxpbmthZ2Ugb2YgY29kZS4gICovCi0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAic3RhY2stY2hlY2siKSkKLQkJewotCQkgIC8qIFN0YWNrIGNoZWNraW5nIGlzIGJlaW5nIHBlcmZvcm1lZCAtIGRvZXMgbm90IGFmZmVjdAotCQkgICAgIGxpbmthZ2UsIGJ1dCBkb2VzIHJlcXVpcmUgdGhhdCB0aGUgZnVuY3Rpb25zCi0JCSAgICAgX19ydF9zdGtvdmZfc3BsaXRfc21hbGwgYW5kIF9fcnRfc3Rrb3ZmX3NwbGl0X2JpZyBiZQotCQkgICAgIHByZXNlbnQgaW4gdGhlIGZpbmFsIGxpbmsuICAqLwotCi0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZmxvYXQiKSkKLQkJewotCQkgIC8qIEZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBhcmUgYmVpbmcgcGFzc2VkIGluIHRoZSBmbG9hdGluZwotCQkgICAgIHBvaW50IHJlZ2lzdGVycy4gIFRoaXMgZG9lcyBhZmZlY3QgbGlua2luZywgc2luY2UgdGhpcwotCQkgICAgIHZlcnNpb24gb2YgdGhlIEFQQ1MgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdAotCQkgICAgIHBhc3NlcyBmbG9hdGluZyBwb2ludHMgaW4gdGhlIGludGVnZXIgcmVnaXN0ZXJzLiAgKi8KLQotCQkgIHVzZXNfYXBjc19mbG9hdCA9IHRydWU7Ci0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAicmVlbnRyYW50IikpCi0JCXsKLQkJICAvKiBSZWVudHJhbnQgY29kZSBoYXMgYmVlbiBnZW5lcmF0ZWQuICBUaGlzIGRvZXMgYWZmZWN0Ci0JCSAgICAgbGlua2luZywgc2luY2UgdGhlcmUgaXMgbm8gcG9pbnQgaW4gbGlua2luZyByZWVudHJhbnQvCi0JCSAgICAgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSB3aXRoIGFic29sdXRlIHBvc2l0aW9uIGNvZGUuICovCi0JCSAgcGljX2NvZGUgPSB0cnVlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgCi0JICAgICAgYXNfYmFkIChfKCJVbnJlY29nbmlzZWQgQVBDUyBzd2l0Y2ggLW0lcyIpLCBhcmcpOwotCSAgICAgIHJldHVybiAwOwotICAJICAgIH0KLSNlbmRpZgotCSAgLyogU3RyaXAgb2ZmIG9wdGlvbmFsICJhcm0iICovCi0JICBpZiAoISBzdHJuY21wIChzdHIsICJhcm0iLCAzKSkKLQkgICAgc3RyICs9IDM7Ci0KLQkgIHN3aXRjaCAoKnN0cikKLQkgICAgewotCSAgICBjYXNlICcxJzoKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjEiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMTsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzInOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMiIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8yOwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICIyNTAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMjUwOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMyc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICIzIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzM7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc2JzoKLQkgICAgICBzd2l0Y2ggKHN0cnRvbCAoc3RyLCBOVUxMLCAxMCkpCi0JCXsKLQkJY2FzZSA2OgotCQljYXNlIDYwOgotCQljYXNlIDYwMDoKLQkJY2FzZSA2MTA6Ci0JCWNhc2UgNjIwOgotCQkgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzY7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZ290byBiYWQ7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc3JzoKLQkgICAgICBzd2l0Y2ggKHN0cnRvbCAoc3RyLCAmIHN0ciwgMTApKQkvKiBFYXQgdGhlIHByb2Nlc3NvciBuYW1lICovCi0JCXsKLQkJY2FzZSA3OgotCQljYXNlIDcwOgotCQljYXNlIDcwMDoKLQkJY2FzZSA3MTA6Ci0JCWNhc2UgNzEwMDoKLQkJY2FzZSA3NTAwOgotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGdvdG8gYmFkOwotCQl9Ci0gICAgICAgICAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzc7Ci0gICAgICAgICAgICAgIGZvciAoOyAqc3RyOyBzdHIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICgqIHN0cikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICBjcHVfdmFyaWFudCB8PSAoQVJNX1RIVU1CIHwgQVJNX0FSQ0hfVjQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgIGNwdV92YXJpYW50IHw9IEFSTV9MT05HTVVMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCQkgIGNhc2UgJ2YnOiAvKiBmZSA9PiBmcCBlbmFibGVkIGNwdS4gICovCi0JCSAgICBpZiAoc3RyWzFdID09ICdlJykKLQkJICAgICAgKysgc3RyOwotCQkgICAgZWxzZQotCQkgICAgICBnb3RvIGJhZDsKLQkJICAgIAotCQkgIGNhc2UgJ2MnOiAvKiBMZWZ0IG92ZXIgZnJvbSA3MTBjIHByb2Nlc3NvciBuYW1lLiAgKi8KLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiAvKiBEZWJ1ZyAqLwotICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6IC8qIEVtYmVkZGVkIElDRSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGluIEFSTSBwcm9jZXNzb3IgbmFtaW5nLiAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZ290byBiYWQ7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzgnOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiOCIpIHx8IHN0cmVxIChzdHIsICI4MTAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOCB8IEFSTV9BUkNIX1Y0IHwgQVJNX0xPTkdNVUw7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSAnOSc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICI5IikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICI5MjAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOSB8IEFSTV9BUkNIX1Y0IHwgQVJNX0xPTkdNVUw7Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjkyMHQiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOSB8IEFSTV9BUkNIX1Y0IHwgQVJNX0xPTkdNVUwgfCBBUk1fVEhVTUI7Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjl0ZG1pIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICJzdHJvbmdhcm0iKQotCQkgIHx8IHN0cmVxIChzdHIsICJzdHJvbmdhcm0xMTAiKQotCQkgIHx8IHN0cmVxIChzdHIsICJzdHJvbmdhcm0xMTAwIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzggfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0JCQotCSAgICBjYXNlICd2JzoKLQkgICAgICAvKiBTZWxlY3QgdmFyaWFudCBiYXNlZCBvbiBhcmNoaXRlY3R1cmUgcmF0aGVyIHRoYW4gcHJvY2Vzc29yICovCi0JICAgICAgc3dpdGNoICgqKytzdHIpCi0JCXsKLQkJY2FzZSAnMic6Ci0JCSAgc3dpdGNoICgqKytzdHIpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdhJzogY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMzsgYnJlYWs7Ci0JCSAgICBjYXNlIDA6ICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMjsgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OiAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgJzMnOgotCQkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fNzsKLSAgICAgICAgICAgICAgICAgICAgCi0JCSAgc3dpdGNoICgqKytzdHIpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdtJzogY3B1X3ZhcmlhbnQgfD0gQVJNX0xPTkdNVUw7IGJyZWFrOwotCQkgICAgY2FzZSAwOiAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDogIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7IGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICc0JzoKLQkJICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9BUkNIX1Y0OwotCQkgIAotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAndCc6IGNwdV92YXJpYW50IHw9IEFSTV9USFVNQjsgYnJlYWs7Ci0JCSAgICBjYXNlIDA6ICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OiAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnNSc6Ci0JCSAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fQVJDSF9WNTsKLQkJICBzd2l0Y2ggKCorK3N0cikKLQkJICAgIHsKLQkJICAgIGNhc2UgJ3QnOiBjcHVfdmFyaWFudCB8PSBBUk1fVEhVTUI7IGJyZWFrOwotCQkgICAgY2FzZSAnZSc6IGNwdV92YXJpYW50IHw9IEFSTV9FWFRfVjVFOyBicmVhazsKLQkJICAgIGNhc2UgMDogICBicmVhazsKLQkJICAgIGRlZmF1bHQ6ICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOyBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQkgIAotCQlkZWZhdWx0OgotCQkgIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgYmFkOgotCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBwcm9jZXNzb3IgdmFyaWFudCAtbSVzIiksIGFyZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotI2lmIGRlZmluZWQgT0JKX0VMRiB8fCBkZWZpbmVkIE9CSl9DT0ZGCi0gICAgY2FzZSAnayc6Ci0gICAgICBwaWNfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKGZwKQotICAgICBGSUxFICogZnA7Ci17Ci0gIGZwcmludGYgKGZwLAotXygiXAotIEFSTSBTcGVjaWZpYyBBc3NlbWJsZXIgT3B0aW9uczpcblwKLSAgLW1bYXJtXVs8cHJvY2Vzc29yIG5hbWU+XSBzZWxlY3QgcHJvY2Vzc29yIHZhcmlhbnRcblwKLSAgLW1bYXJtXXZbMnwyYXwzfDNtfDR8NHR8NV1zZWxlY3QgYXJjaGl0ZWN0dXJlIHZhcmlhbnRcblwKLSAgLW10aHVtYiAgICAgICAgICAgICAgICAgICBvbmx5IGFsbG93IFRodW1iIGluc3RydWN0aW9uc1xuXAotICAtbXRodW1iLWludGVyd29yayAgICAgICAgIG1hcmsgdGhlIGFzc2VtYmxlZCBjb2RlIGFzIHN1cHBvcnRpbmcgaW50ZXJ3b3JraW5nXG5cCi0gIC1tYWxsICAgICAgICAgICAgICAgICAgICAgYWxsb3cgYW55IGluc3RydWN0aW9uXG5cCi0gIC1tZnBhMTAsIC1tZnBhMTEgICAgICAgICAgc2VsZWN0IGZsb2F0aW5nIHBvaW50IGFyY2hpdGVjdHVyZVxuXAotICAtbWZwZS1vbGQgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGZsb2F0aW5nLXBvaW50IG11bHRpcGxlIGluc3RydWN0aW9uc1xuXAotICAtbW5vLWZwdSAgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGFueSBmbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMuXG4iKSk7Ci0gIGZwcmludGYgKGZwLAotXygiXAotICAtayAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIFBJQyBjb2RlLlxuIikpOwotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIGZwcmludGYgKGZwLAotXygiXAotICAtbWFwY3MtMzIsIC1tYXBjcy0yNiAgICAgIHNwZWNpZnkgd2hpY2ggQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIHRvIHVzZVxuIikpOwotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLW1hcGNzLWZsb2F0ICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCBhcmdzIGFyZSBwYXNzZWQgaW4gRlAgcmVnc1xuIikpOwotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgICB0aGUgY29kZSBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudC9yZWVudHJhbnRcbiIpKTsKLSAgI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLW1vYWJpICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvbGQgRUxGIEFCSVxuIikpOwotI2VuZGlmCi0jaWZkZWYgQVJNX0JJX0VORElBTgotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLUVCICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gY3B1XG5cCi0gIC1FTCAgICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIGNwdVxuIikpOwotI2VuZGlmCi19Ci0KLS8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBmaXggdXAgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGluIHNvbWUgc3RhdGVtZW50cy4KLSAgIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHN5bWJvbHMgdGhhdCBhcmUgYW4gYXJiaXRyYXJ5IGRpc3RhbmNlIGZyb20KLSAgIHRoZSBwYy4gIFRoZSBtb3N0IGNvbW1vbiBjYXNlcyBhcmUgb2YgdGhlIGZvcm0gKCgrLy1zeW0gLS8rIC4gLSA4KSAmIG1hc2spLAotICAgd2hpY2ggcmV0dXJucyBwYXJ0IG9mIGFuIGFkZHJlc3MgaW4gYSBmb3JtIHdoaWNoIHdpbGwgYmUgdmFsaWQgZm9yCi0gICBhIGRhdGEgaW5zdHJ1Y3Rpb24uICBXZSBkbyB0aGlzIGJ5IHB1c2hpbmcgdGhlIGV4cHJlc3Npb24gaW50byBhIHN5bWJvbAotICAgaW4gdGhlIGV4cHJfc2VjdGlvbiwgYW5kIGNyZWF0aW5nIGEgZml4IGZvciB0aGF0LiAgKi8KLQotc3RhdGljIHZvaWQKLWZpeF9uZXdfYXJtIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY19yZWwsIHJlbG9jKQotICAgICBmcmFnUyAqICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgd2hlcmU7Ci0gICAgIHNob3J0IGludCAgICAgc2l6ZTsKLSAgICAgZXhwcmVzc2lvblMgKiBleHA7Ci0gICAgIGludCAgICAgICAgICAgcGNfcmVsOwotICAgICBpbnQgICAgICAgICAgIHJlbG9jOwotewotICBmaXhTICogICAgICAgICBuZXdfZml4OwotICBhcm1fZml4X2RhdGEgKiBhcm1fZGF0YTsKLQotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgY2FzZSBPX2FkZDoKLSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0gICAgICBuZXdfZml4ID0gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjX3JlbCwgcmVsb2MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgbmV3X2ZpeCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBtYWtlX2V4cHJfc3ltYm9sIChleHApLCAwLAotCQkJIHBjX3JlbCwgcmVsb2MpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIE1hcmsgd2hldGhlciB0aGUgZml4IGlzIHRvIGEgVEhVTUIgaW5zdHJ1Y3Rpb24sIG9yIGFuIEFSTSBpbnN0cnVjdGlvbiAqLwotICBhcm1fZGF0YSA9IChhcm1fZml4X2RhdGEgKikgb2JzdGFja19hbGxvYyAoJiBub3Rlcywgc2l6ZW9mIChhcm1fZml4X2RhdGEpKTsKLSAgbmV3X2ZpeC0+dGNfZml4X2RhdGEgPSAoUFRSKSBhcm1fZGF0YTsKLSAgYXJtX2RhdGEtPnRodW1iX21vZGUgPSB0aHVtYl9tb2RlOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBUaGlzIGZpeF9uZXcgaXMgY2FsbGVkIGJ5IGNvbnMgdmlhIFRDX0NPTlNfRklYX05FVy4gICovCi12b2lkCi1jb25zX2ZpeF9uZXdfYXJtIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQotICAgICBmcmFnUyAqICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgd2hlcmU7Ci0gICAgIGludCAgICAgICAgICAgc2l6ZTsKLSAgICAgZXhwcmVzc2lvblMgKiBleHA7Ci17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSB0eXBlOwotICBpbnQgcGNyZWwgPSAwOwotICAKLSAgLyogUGljayBhIHJlbG9jIC4uLgotICAgKgotICAgKiBAQCBTaG91bGQgbG9vayBhdCBDUFUgd29yZCBzaXplLgotICAgKi8KLSAgc3dpdGNoIChzaXplKSAKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgdHlwZSA9IEJGRF9SRUxPQ18xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICBkZWZhdWx0OgotICAgICAgdHlwZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIHR5cGUgPSBCRkRfUkVMT0NfNjQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIChpbnQpIHNpemUsIGV4cCwgcGNyZWwsIHR5cGUpOwotfQotCi0vKiBBIGdvb2QgcGxhY2UgdG8gZG8gdGhpcywgYWx0aG91Z2ggdGhpcyB3YXMgcHJvYmFibHkgbm90IGludGVuZGVkCi0gICBmb3IgdGhpcyBraW5kIG9mIHVzZS4gIFdlIG5lZWQgdG8gZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGJlZm9yZQotICAgcmVmZXJlbmNlcyBhcmUgbWFkZSB0byBhIG51bGwgc3ltYm9sIHBvaW50ZXIuICAqLwotdm9pZAotYXJtX2NsZWFudXAgKCkKLXsKLSAgaWYgKGN1cnJlbnRfcG9vbFAgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIAotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOyAvKiBQdXQgaXQgYXQgdGhlIGVuZCBvZiB0ZXh0IHNlY3Rpb24uICAqLwotICBzX2x0b3JnICgwKTsKLSAgbGlzdGluZ19wcmV2X2xpbmUgKCk7Ci19Ci0KLXZvaWQKLWFybV9zdGFydF9saW5lX2hvb2sgKCkKLXsKLSAgbGFzdF9sYWJlbF9zZWVuID0gTlVMTDsKLX0KLQotdm9pZAotYXJtX2Zyb2JfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqIHN5bTsKLXsKLSAgbGFzdF9sYWJlbF9zZWVuID0gc3ltOwotICAKLSAgQVJNX1NFVF9USFVNQiAoc3ltLCB0aHVtYl9tb2RlKTsKLSAgCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSAgQVJNX1NFVF9JTlRFUldPUksgKHN5bSwgc3VwcG9ydF9pbnRlcndvcmspOwotI2VuZGlmCi0gIAotICBpZiAobGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSkKLSAgICB7Ci0gICAgICAvKiBXaGVuIHRoZSBhZGRyZXNzIG9mIGEgVGh1bWIgZnVuY3Rpb24gaXMgdGFrZW4gdGhlIGJvdHRvbQotCSBiaXQgb2YgdGhhdCBhZGRyZXNzIHNob3VsZCBiZSBzZXQuICBUaGlzIHdpbGwgYWxsb3cKLQkgaW50ZXJ3b3JraW5nIGJldHdlZW4gQXJtIGFuZCBUaHVtYiBmdW5jdGlvbnMgdG8gd29yawotCSBjb3JyZWN0bHkuICAqLwotCi0gICAgICBUSFVNQl9TRVRfRlVOQyAoc3ltLCAxKTsKLSAgICAgIAotICAgICAgbGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSA9IGZhbHNlOwotICAgIH0KLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIG1hcmtzIFRodW1iIHN5bWJvbHMgYXMgZGlzdGluY3QgZnJvbQotICAgQVJNIG9uZXMuICAqLwotCi12b2lkCi1hcm1fYWRqdXN0X3N5bXRhYiAoKQotewotI2lmZGVmIE9CSl9DT0ZGCi0gIHN5bWJvbFMgKiBzeW07Ci0KLSAgZm9yIChzeW0gPSBzeW1ib2xfcm9vdFA7IHN5bSAhPSBOVUxMOyBzeW0gPSBzeW1ib2xfbmV4dCAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAoQVJNX0lTX1RIVU1CIChzeW0pKQotICAgICAgICB7Ci0JICBpZiAoVEhVTUJfSVNfRlVOQyAoc3ltKSkKLQkgICAgewotCSAgICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBpZiAoICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX1NUQVQKLQkJICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfTEFCRUwpIC8qIFRoaXMgY2FuIGhhcHBlbiEgKi8KLQkJU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CU1RBVEZVTkMpOwotCi0JICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0VYVCkKLQkJU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CRVhURlVOQyk7Ci0JICAgICAgZWxzZQotCQlhc19iYWQgKF8oIiVzOiB1bmV4cGVjdGVkIGZ1bmN0aW9uIHR5cGU6ICVkIiksCi0JCQlTX0dFVF9OQU1FIChzeW0pLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pKTsKLQkgICAgfQotICAgICAgICAgIGVsc2Ugc3dpdGNoIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIENfRVhUOgotICAgICAgICAgICAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQkVYVCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQ19TVEFUOgotICAgICAgICAgICAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQlNUQVQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIENfTEFCRUw6Ci0gICAgICAgICAgICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CTEFCRUwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBkbyBub3RoaW5nICovIAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIGlmIChBUk1fSVNfSU5URVJXT1JLIChzeW0pKQotCWNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gMHhGRjsKLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIHN5bWJvbFMgKiAgICAgICAgIHN5bTsKLSAgZWxmX3N5bWJvbF90eXBlICogZWxmX3N5bTsKLSAgY2hhciAgICAgICAgICAgICAgYmluZDsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChBUk1fSVNfVEhVTUIgKHN5bSkpCi0gICAgICAgIHsKLQkgIGlmIChUSFVNQl9JU19GVU5DIChzeW0pKQotCSAgICB7Ci0JICAgICAgZWxmX3N5bSA9IGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKTsKLQkgICAgICBiaW5kID0gRUxGX1NUX0JJTkQgKGVsZl9zeW0pOwotCSAgICAgIGVsZl9zeW0tPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChiaW5kLCBTVFRfQVJNX1RGVU5DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgfQotI2VuZGlmCi19Ci0KLWludAotYXJtX2RhdGFfaW5fY29kZSAoKQotewotICBpZiAodGh1bWJfbW9kZSAmJiAhIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciArIDEsICJkYXRhOiIsIDUpKQotICAgIHsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnLyc7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAobmFtZSkKLSAgICAgY2hhciAqIG5hbWU7Ci17Ci0gIGludCBsZW47Ci0KLSAgaWYgKHRodW1iX21vZGUgJiYgKGxlbiA9IHN0cmxlbiAobmFtZSkpID4gNQotICAgICAgJiYgc3RyZXEgKG5hbWUgKyBsZW4gLSA1LCAiL2RhdGEiKSkKLSAgICAqKG5hbWUgKyBsZW4gLSA1KSA9IDA7Ci0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLWJvb2xlYW4KLWFybV92YWxpZGF0ZV9maXggKGZpeFApCi0gICAgIGZpeFMgKiBmaXhQOwotewotICAvKiBJZiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGJyYW5jaCBpcyBhIGRlZmluZWQgc3ltYm9sIHdoaWNoIGRvZXMgbm90IGhhdmUKLSAgICAgdGhlIFRIVU1CX0ZVTkMgYXR0cmlidXRlLCB0aGVuIHdlIG11c3QgYmUgY2FsbGluZyBhIGZ1bmN0aW9uIHdoaWNoIGhhcwotICAgICB0aGUgKGludGVyZmFjZWFybSkgYXR0cmlidXRlLiAgV2UgbG9vayBmb3IgdGhlIFRodW1iIGVudHJ5IHBvaW50IHRvIHRoYXQKLSAgICAgZnVuY3Rpb24gYW5kIGNoYW5nZSB0aGUgYnJhbmNoIHRvIHJlZmVyIHRvIHRoYXQgZnVuY3Rpb24gaW5zdGVhZC4gICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgJiYgISBUSFVNQl9JU19GVU5DIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBmaW5kX3JlYWxfc3RhcnQgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBSZWxvY2F0aW9ucyBhZ2FpbnN0IFRodW1iIGZ1bmN0aW9uIG5hbWVzIG11c3QgYmUgbGVmdCB1bmFkanVzdGVkLAotICAgc28gdGhhdCB0aGUgbGlua2VyIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBjb3JyZWN0bHkgc2V0IHRoZQotICAgYm90dG9tIGJpdCBvZiB0aGVpciBhZGRyZXNzZXMuICBUaGUgTUlQUyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24KLSAgIGFsc28gcHJldmVudHMgcmVsb2NhdGlvbnMgdGhhdCBhcmUgbWlwcy0xNiBzcGVjaWZpYywgYnV0IEkgZG8gbm90Ci0gICBrbm93IHdoeSBpdCBkb2VzIHRoaXMuCi0KLSAgIEZJWE1FOgotICAgVGhlcmUgaXMgb25lIG90aGVyIHByb2JsZW0gdGhhdCBvdWdodCB0byBiZSBhZGRyZXNzZWQgaGVyZSwgYnV0Ci0gICB3aGljaCBjdXJyZW50bHkgaXMgbm90OiAgVGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgbGFiZWwgKHJhdGhlcgotICAgdGhhbiBhIGZ1bmN0aW9uKSBhbmQgdGhlbiBsYXRlciBqdW1waW5nIHRvIHRoYXQgYWRkcmVzcy4gIFN1Y2gKLSAgIGFkZHJlc3NlcyBhbHNvIG91Z2h0IHRvIGhhdmUgdGhlaXIgYm90dG9tIGJpdCBzZXQgKGFzc3VtaW5nIHRoYXQKLSAgIHRoZXkgcmVzaWRlIGluIFRodW1iIGNvZGUpLCBidXQgYXQgdGhlIG1vbWVudCB0aGV5IHdpbGwgbm90LiAgKi8KLSAgIAotYm9vbGVhbgotYXJtX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotCi0gIGlmIChUSFVNQl9JU19GVU5DIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICYmIGZpeFAtPmZ4X3N1YnN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KLQotY29uc3QgY2hhciAqCi1lbGYzMl9hcm1fdGFyZ2V0X2Zvcm1hdCAoKQotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgaWYgKHRhcmdldF9vYWJpKQotICAgICAgcmV0dXJuICJlbGYzMi1iaWdhcm0tb2FiaSI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICJlbGYzMi1iaWdhcm0iOwotICBlbHNlCi0gICAgaWYgKHRhcmdldF9vYWJpKQotICAgICAgcmV0dXJuICJlbGYzMi1saXR0bGVhcm0tb2FiaSI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICJlbGYzMi1saXR0bGVhcm0iOwotfQotCi12b2lkCi1hcm1lbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKQotICAgICBzeW1ib2xTICogc3ltcDsKLSAgICAgaW50ICogcHVudHA7Ci17Ci0gIGVsZl9mcm9iX3N5bWJvbCAoc3ltcCwgcHVudHApOwotfSAKLQotaW50Ci1hcm1fZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgc3RydWN0IGZpeCAqIGZpeHA7Ci17Ci0gIGlmICggICBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNICi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzKSAgICAKLSAgICByZXR1cm4gMTsKLSAgCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1hcm1fcGFyc2VfcmVsb2MgKCkKLXsKLSAgY2hhciAgIGlkWzE2XTsKLSAgY2hhciAqIGlwOwotICBpbnQgICAgaTsKLSAgc3RhdGljIHN0cnVjdAotICB7Ci0gICAgY2hhciAqIHN0cjsKLSAgICBpbnQgICAgbGVuOwotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgfQotICByZWxvY19tYXBbXSA9Ci0gIHsKLSNkZWZpbmUgTUFQKHN0cixyZWxvYykgeyBzdHIsIHNpemVvZiAoc3RyKS0xLCByZWxvYyB9Ci0gICAgTUFQICgiKGdvdCkiLCAgICBCRkRfUkVMT0NfQVJNX0dPVDMyKSwKLSAgICBNQVAgKCIoZ290b2ZmKSIsIEJGRF9SRUxPQ19BUk1fR09UT0ZGKSwKLSAgICAvKiBTY290dEI6IEphbiAzMCwgMTk5OCAqLwotICAgIC8qIEFkZGVkIHN1cHBvcnQgZm9yIHBhcnNpbmcgInZhcihQTFQpIiBicmFuY2ggaW5zdHJ1Y3Rpb25zICovCi0gICAgLyogZ2VuZXJhdGVkIGJ5IEdDQyBmb3IgUExUIHJlbG9jcyAqLwotICAgIE1BUCAoIihwbHQpIiwgICAgQkZEX1JFTE9DX0FSTV9QTFQzMiksCi0gICAgeyBOVUxMLCAwLCAgICAgICAgIEJGRF9SRUxPQ19VTlVTRUQgfQotI3VuZGVmIE1BUCAgICAKLSAgfTsKLQotICBmb3IgKGkgPSAwLCBpcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICBpIDwgc2l6ZW9mIChpZCkgJiYgKGlzYWxudW0gKCppcCkgfHwgaXNwdW5jdCAoKmlwKSk7Ci0gICAgICAgaSsrLCBpcCsrKQotICAgIGlkW2ldID0gdG9sb3dlciAoKmlwKTsKLSAgCi0gIGZvciAoaSA9IDA7IHJlbG9jX21hcFtpXS5zdHI7IGkrKykKLSAgICBpZiAoc3RybmNtcCAoaWQsIHJlbG9jX21hcFtpXS5zdHIsIHJlbG9jX21hcFtpXS5sZW4pID09IDApCi0gICAgICBicmVhazsKLSAgCi0gIGlucHV0X2xpbmVfcG9pbnRlciArPSByZWxvY19tYXBbaV0ubGVuOwotICAKLSAgcmV0dXJuIHJlbG9jX21hcFtpXS5yZWxvYzsKLX0KLQotc3RhdGljIHZvaWQKLXNfYXJtX2VsZl9jb25zIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9jb25zX2FsaWduCi0gIG1kX2NvbnNfYWxpZ24gKG5ieXRlcyk7Ci0jZW5kaWYKLQotICBkbwotICAgIHsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgICAgIAotICAgICAgZXhwcmVzc2lvbiAoJiBleHApOwotCi0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICAgICAmJiAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnKCcKLSAgICAgICAgICAmJiAocmVsb2MgPSBhcm1fcGFyc2VfcmVsb2MoKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICAgICAgewotICAgICAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByZWxvYyk7Ci0gICAgICAgICAgaW50IHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLQotICAgICAgICAgIGlmIChzaXplID4gbmJ5dGVzKQotICAgICAgICAgICAgYXNfYmFkICgiJXMgcmVsb2NhdGlvbnMgZG8gbm90IGZpdCBpbiAlZCBieXRlcyIsIGhvd3RvLT5uYW1lLCBuYnl0ZXMpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVnaXN0ZXIgY2hhciAqIHAgPSBmcmFnX21vcmUgKChpbnQpIG5ieXRlcyk7Ci0gICAgICAgICAgICAgIGludCBvZmZzZXQgPSBuYnl0ZXMgLSBzaXplOwotCi0gICAgICAgICAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LCBzaXplLAotCQkJICAgJiBleHAsIDAsIHJlbG9jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlbWl0X2V4cHIgKCYgZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJtLmggYi9nYXMvY29uZmlnL3RjLWFybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWFiODg3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWFybS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQlNb2RpZmllZCBieSBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX0FSTSAxCi0KLSNpZm5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIENPRkZfTUFHSUMgCUFSTU1BR0lDCi0jZGVmaW5lIFRBUkdFVF9BUkNIIAliZmRfYXJjaF9hcm0KLQotI2RlZmluZSBBT1VUX01BQ0hUWVBFIAkwCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCi0KLSNpZmRlZiAgTElUVExFX0VORElBTgotI3VuZGVmICBMSVRUTEVfRU5ESUFOCi0jZW5kaWYKLQotI2lmZGVmICBCSUdfRU5ESUFOCi0jdW5kZWYgIEJJR19FTkRJQU4KLSNlbmRpZgotCi0jZGVmaW5lIExJVFRMRV9FTkRJQU4gCTEyMzQKLSNkZWZpbmUgQklHX0VORElBTiAJNDMyMQotCi0jaWYgZGVmaW5lZCBPQkpfQU9VVAotI2lmIGRlZmluZWQgVEVfUklTQ0lYCi0jIGRlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1yaXNjaXgiCi0jZWxpZiBkZWZpbmVkIFRFX0xJTlVYCi0jIGRlZmluZSBBUk1fQklfRU5ESUFOCi0jIGRlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1hcm0tbGludXgiCi0jZWxpZiBkZWZpbmVkIFRFX05ldEJTRAotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtYXJtLW5ldGJzZCIKLSNlbHNlCi0jIGRlZmluZSBBUk1fQklfRU5ESUFOCi0jIGRlZmluZSBUQVJHRVRfRk9STUFUIFwKLSAgKHRhcmdldF9iaWdfZW5kaWFuID8gImEub3V0LWFybS1iaWciIDogImEub3V0LWFybS1saXR0bGUiKQotI2VuZGlmCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLQotI2lmZGVmIE9CSl9BSUYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYWlmIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotIyBkZWZpbmUgQVJNX0JJX0VORElBTgotICAgICAKLSMgZGVmaW5lIFRDX1ZBTElEQVRFX0ZJWChmaXhQLCBzZWdUeXBlLCBMYWJlbCkgXAotICAgICBpZiAoYXJtX3ZhbGlkYXRlX2ZpeCAoZml4UCkpIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kKLSAgZXh0ZXJuIGJvb2xlYW4gYXJtX3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNlbmRpZgotICAgICAKLSNpZmRlZiBPQkpfQ09GRgotIyBpZiBkZWZpbmVkIFRFX1BFCi0jICBkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTih4KSAoKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1JWQSkKLSMgICBpZmRlZiBURV9FUE9DCi0jICAgIGRlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlcG9jLXBlLWFybS1iaWciIDogImVwb2MtcGUtYXJtLWxpdHRsZSIpCi0jICAgZWxzZQotIyAgICBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAicGUtYXJtLWJpZyIgOiAicGUtYXJtLWxpdHRsZSIpCi0jICAgZW5kaWYKLSMgZWxzZQotIyAgZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImNvZmYtYXJtLWJpZyIgOiAiY29mZi1hcm0tbGl0dGxlIikKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCBlbGYzMl9hcm1fdGFyZ2V0X2Zvcm1hdCgpCi0gIGV4dGVybiBjb25zdCBjaGFyICogZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotICAKLSMgZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgYXJtX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gIGV4dGVybiBpbnQgYXJtX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYiwgcywgZikge2FzX2ZhdGFsIChfKCJhcm0gY29udmVydF9mcmFnXG4iKSk7fQotCi0jZGVmaW5lIG1kX2NsZWFudXAoKSBhcm1fY2xlYW51cCAoKQotIGV4dGVybiB2b2lkIGFybV9jbGVhbnVwIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBtZF9zdGFydF9saW5lX2hvb2soKSBhcm1fc3RhcnRfbGluZV9ob29rICgpCi0gZXh0ZXJuIHZvaWQgYXJtX3N0YXJ0X2xpbmVfaG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChTKSBhcm1fZnJvYl9sYWJlbCAoUykKLSBleHRlcm4gdm9pZCBhcm1fZnJvYl9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogV2UgYWxzbyBuZWVkIHRvIG1hcmsgYXNzZW1ibGVyIGNyZWF0ZWQgc3ltYm9sczogICovCi0jZGVmaW5lIHRjX2Zyb2JfZmFrZV9sYWJlbChTKSBhcm1fZnJvYl9sYWJlbCAoUykKLQotLyogTk9URTogVGhlIGZha2UgbGFiZWwgY3JlYXRpb24gaW4gc3RhYnMuYzpzX3N0YWJfZ2VuZXJpYygpIGhhcwotICAgZGVsaWJlcmF0ZWx5IG5vdCBiZWVuIHVwZGF0ZWQgdG8gbWFyayBhc3NlbWJsZXIgY3JlYXRlZCBzdGFicwotICAgc3ltYm9scyBhcyBUaHVtYi4gICovCi0KLSNkZWZpbmUgVENfRklYX1RZUEUgUFRSCi0jZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoRklYUCkgKChGSVhQKS0+dGNfZml4X2RhdGEgPSBOVUxMKQotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgIndyaXRlLmgiICAgICAgICAvKiBGb3IgZGVmaW5pdGlvbiBvZiBmaXhTICovCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBhcm1fZml4X2FkanVzdGFibGUgKGZpeFApCi1ib29sZWFuIGFybV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChmaXhTICopKTsKLSNlbHNlCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSAwCi0jZW5kaWYKLQotLyogV2UgbmVlZCB0byBrZWVwIHNvbWUgbG9jYWwgaW5mb3JtYXRpb24gb24gc3ltYm9scy4gICovCi0KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSB1bnNpZ25lZCBpbnQKLSNkZWZpbmUgQVJNX0dFVF9GTEFHKHMpICAgCSgqc3ltYm9sX2dldF90YyAocykpCi0jZGVmaW5lIEFSTV9TRVRfRkxBRyhzLHYpIAkoKnN5bWJvbF9nZXRfdGMgKHMpIHw9ICh2KSkKLSNkZWZpbmUgQVJNX1JFU0VUX0ZMQUcocyx2KSAJKCpzeW1ib2xfZ2V0X3RjIChzKSAmPSB+KHYpKQotCi0jZGVmaW5lIEFSTV9GTEFHX1RIVU1CIAkJKDEgPDwgMCkJLyogVGhlIHN5bWJvbCBpcyBhIFRodW1iIHN5bWJvbCByYXRoZXIgdGhhbiBhbiBBcm0gc3ltYm9sLiAgKi8KLSNkZWZpbmUgQVJNX0ZMQUdfSU5URVJXT1JLIAkoMSA8PCAxKQkvKiBUaGUgc3ltYm9sIGlzIGF0dGFjaGVkIHRvIGNvZGUgdGhhdCBzdXBwcG9ydHMgaW50ZXJ3b3JraW5nLiAgKi8KLSNkZWZpbmUgVEhVTUJfRkxBR19GVU5DCQkoMSA8PCAyKQkvKiBUaGUgc3ltYm9sIGlzIGF0dGFjaGVkIHRvIHRoZSBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KLQotI2RlZmluZSBBUk1fSVNfVEhVTUIocykJCShBUk1fR0VUX0ZMQUcgKHMpICYgQVJNX0ZMQUdfVEhVTUIpCi0jZGVmaW5lIEFSTV9JU19JTlRFUldPUksocykJKEFSTV9HRVRfRkxBRyAocykgJiBBUk1fRkxBR19JTlRFUldPUkspCi0jZGVmaW5lIFRIVU1CX0lTX0ZVTkMocykJKEFSTV9HRVRfRkxBRyAocykgJiBUSFVNQl9GTEFHX0ZVTkMpCi0KLSNkZWZpbmUgQVJNX1NFVF9USFVNQihzLHQpICAgICAgKCh0KSA/IEFSTV9TRVRfRkxBRyAocywgQVJNX0ZMQUdfVEhVTUIpICAgICA6IEFSTV9SRVNFVF9GTEFHIChzLCBBUk1fRkxBR19USFVNQikpCi0jZGVmaW5lIEFSTV9TRVRfSU5URVJXT1JLKHMsdCkgICgodCkgPyBBUk1fU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX0lOVEVSV09SSykgOiBBUk1fUkVTRVRfRkxBRyAocywgQVJNX0ZMQUdfSU5URVJXT1JLKSkKLSNkZWZpbmUgVEhVTUJfU0VUX0ZVTkMocyx0KSAgICAgKCh0KSA/IEFSTV9TRVRfRkxBRyAocywgVEhVTUJfRkxBR19GVU5DKSAgICA6IEFSTV9SRVNFVF9GTEFHIChzLCBUSFVNQl9GTEFHX0ZVTkMpKQotCi0KLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoQyxTVFIpIFwKLSAgKGMgPT0gJzonIHx8IChjID09ICcvJyAmJiBhcm1fZGF0YV9pbl9jb2RlICgpKSkKLWludCBhcm1fZGF0YV9pbl9jb2RlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUoc3RyKSBcCi0gYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3RyKTsKLWNoYXIgKiBhcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi0jZGVmaW5lIG9ial9hZGp1c3Rfc3ltdGFiKCkgYXJtX2FkanVzdF9zeW10YWIgKCkKLSBleHRlcm4gdm9pZCBhcm1fYWRqdXN0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzeW0sIHB1bnQpICBhcm1lbGZfZnJvYl9zeW1ib2wgKChzeW0pLCAmIChwdW50KSkKLXZvaWQgYXJtZWxmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50ICopKTsKLSNlbmRpZgotCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkFSTSBHQVMgIgotCi0jZGVmaW5lIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCAnJScKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAnTCcpKQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgICAxCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBMT0NBTF9MQUJFTF9QUkVGSVggJy4nCi0jZW5kaWYKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbCBvYmplY3QKLSAgIGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICBUcnVlIGlmIHdlCi0gICBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZyB0aGUgLm8gZmlsZS4KLSAgIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucywgc28gR09UT0ZGIGRvZXMgbm90IG5lZWQgdG8gYmUKLSAgIGNoZWNrZWQgaGVyZS4gIEkgYW0gbm90IHN1cmUgaWYgc29tZSBvZiB0aGUgb3RoZXJzIGFyZSBldmVyIHVzZWQgd2l0aAotICAgcGNyZWwsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gYmUgc2FmZSB0aGFuIHNvcnJ5LiAgKi8KLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAotICAgKCAgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfQVJNX0dPVDEyIFwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0FSTV9HT1QzMiBcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMikKLQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X2FybQotIGV4dGVybiB2b2lkIGNvbnNfZml4X25ld19hcm0gUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBpbnQsIGV4cHJlc3Npb25TICopKTsKLQotLyogRG9uJ3QgYWxsb3cgc3ltYm9scyB0byBiZSBkaXNjYXJkZWQgb24gR09UIHJlbGF0ZWQgcmVsb2NzLAotICAgbm9yIG9uIGdsb2JhbHMuICAqLyAKLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoeCkgKFwKLSAgICAgKCh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fUExUMzIgXAotICAgfHwgKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9HT1QzMiBcCi0gICB8fCAoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX0dPVE9GRiBcCi0gICB8fCBTX0lTX0VYVEVSTiAoKHgpLT5meF9hZGRzeSkgXAotICAgfHwgU19JU19XRUFLICgoeCktPmZ4X2FkZHN5KSkgPyAwIDogMSkKLSAgICAgCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbHNlCi0jZGVmaW5lIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbmRpZgotICAgICAKLS8qIGVuZCBvZiB0Yy1hcm0uaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmMgYi9nYXMvY29uZmlnL3RjLWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0OWE5NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NjMgKzAsMCBAQAotLyogdGMtZDEwdi5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWl0c3ViaXNoaSBEMTBWCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk8iOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQotaW50IE9wdGltaXppbmcgPSAwOwotCi0jZGVmaW5lIEFUX1dPUkRfUChYKSAoKFgpLT5YX29wID09IE9fcmlnaHRfc2hpZnQgXAotCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sICE9IE5VTEwgXAotCQkgICAgICAmJiBzeW1ib2xfY29uc3RhbnRfcCAoKFgpLT5YX29wX3N5bWJvbCkgXAotCQkgICAgICAmJiBTX0dFVF9WQUxVRSAoKFgpLT5YX29wX3N5bWJvbCkgPT0gQVRfV09SRF9SSUdIVF9TSElGVCkKLSNkZWZpbmUgQVRfV09SRF9SSUdIVF9TSElGVCAyCi0KLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBkMTB2X2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9wZXJhbmQ7Ci0gIGludCBwY3JlbDsKLSAgaW50IHNpemU7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9maXh1cHMKLXsKLSAgaW50IGZjOwotICBzdHJ1Y3QgZDEwdl9maXh1cCBmaXhbTUFYX0lOU05fRklYVVBTXTsKLSAgc3RydWN0IF9maXh1cHMgKm5leHQ7Ci19IEZpeHVwczsKLQotc3RhdGljIEZpeHVwcyBGaXhVcHNbMl07Ci1zdGF0aWMgRml4dXBzICpmaXh1cHM7Ci0KLXN0YXRpYyBpbnQgZG9fbm90X2lnbm9yZV9oYXNoID0gMDsKLQotLyogVHJ1ZSBpZiBpbnN0cnVjdGlvbiBzd2FwcGluZyB3YXJuaW5ncyBzaG91bGQgYmUgaW5oaWJpdGVkLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXA7IC8qIC0tbm93YXJuc3dhcCAqLwotCi0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBpbnQgcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBpbnQgY2hlY2tfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyBudW0sIGludCBiaXRzLCBpbnQgZmxhZ3MpKTsKLXN0YXRpYyBpbnQgcG9zdGZpeCBQQVJBTVMgKChjaGFyICpwKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGdldF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcCkpOwotc3RhdGljIGludCBnZXRfb3BlcmFuZHMgUEFSQU1TICgoZXhwcmVzc2lvblMgZXhwW10pKTsKLXN0YXRpYyBzdHJ1Y3QgZDEwdl9vcGNvZGUgKmZpbmRfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlLCBleHByZXNzaW9uUyBvcHNbXSkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVpbGRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgZXhwcmVzc2lvblMgKm9wZXJzLCB1bnNpZ25lZCBsb25nIGluc24pKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2xvbmcgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIHVuc2lnbmVkIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOwotc3RhdGljIHZvaWQgd3JpdGVfMV9zaG9ydCBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgdW5zaWduZWQgbG9uZyBpbnNuLCBGaXh1cHMgKmZ4KSk7Ci1zdGF0aWMgaW50IHdyaXRlXzJfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUxLCB1bnNpZ25lZCBsb25nIGluc24xLCAKLQkJCQkgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwgaW50IGV4ZWNfdHlwZSwgRml4dXBzICpmeCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9fYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgZDEwdl9vcGNvZGUgKipvcGNvZGUpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGQxMHZfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgoIHVuc2lnbmVkIGxvbmcgaW5zbiwgaW50IG9wX3R5cGUsCi0JCQkJCQkgICBvZmZzZXRUIHZhbHVlLCBpbnQgbGVmdCwgZml4UyAqZml4KSk7Ci1zdGF0aWMgaW50IHBhcmFsbGVsX29rIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCi0JCQkJc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUyLCB1bnNpZ25lZCBsb25nIGluc24yLAotCQkJCWludCBleGVjX3R5cGUpKTsKLXN0YXRpYyBzeW1ib2xTICogZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotI2RlZmluZSBPUFRJT05fTk9XQVJOU1dBUCAoT1BUSU9OX01EX0JBU0UpCi0gIHsibm93YXJuc3dhcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9XQVJOU1dBUH0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7ICAgICAgIAotCi1zdGF0aWMgdm9pZCBkMTB2X2RvdF93b3JkIFBBUkFNUyAoKGludCkpOwotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJ3b3JkIiwJZDEwdl9kb3Rfd29yZCwJMiB9LAotICB7IE5VTEwsICAgICAgIE5VTEwsICAgICAgICAgICAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpkMTB2X2hhc2g7Ci0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycwotICAgYXJyYXkgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IGQxMHZfcmVnX25hbWVfY250KCkgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZSAKLQkgIHJldHVybiBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIHJlZ2lzdGVyX25hbWUoKSBjaGVja3MgdGhlIHN0cmluZyBhdCBpbnB1dF9saW5lX3BvaW50ZXIKLSAgIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIHJlZ2lzdGVyIG5hbWUgKi8KLQotc3RhdGljIGludAotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgYywgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICB3aGlsZSAoKnAgJiYgKnAhPSdcbicgJiYgKnAhPSdccicgJiYgKnAgIT0nLCcgJiYgKnAhPScgJyAmJiAqcCE9JyknKQotICAgIHArKzsKLQotICBjID0gKnA7Ci0gIGlmIChjKQotICAgICpwKysgPSAwOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIC8qIHRlbXBvcmFyaWx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGhlcmUgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoYykKLSAgICAqKHAtMSkgPSBjOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1jaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykKLSAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0gICAgIGludCBiaXRzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGxvbmcgbWluLCBtYXgsIGJpdDE7Ci0gIGludCByZXR2YWw9MDsKLQotICAvKiBkb24ndCBib3RoZXIgY2hlY2tpbmcgMTYtYml0IHZhbHVlcyAqLwotICBpZiAoYml0cyA9PSAxNikKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHsKLSAgICAgIC8qIGFsbCBzcGVjaWFsIHNoaWZ0IG9wZXJhbmRzIGFyZSB1bnNpZ25lZCAqLwotICAgICAgLyogYW5kIDw9IDE2LiAgV2UgYWxsb3cgMCBmb3Igbm93LiAqLwotICAgICAgaWYgKG51bT4xNikKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0gICAgewotICAgICAgLyogU2lnbmVkIDMtYml0IGludGVnZXJzIGFyZSByZXN0cmljdGVkIHRvIHRoZSAoLTIsIDMpIHJhbmdlICovCi0gICAgICBpZiAoZmxhZ3MgJiBSRVNUUklDVEVEX05VTTMpCi0JewotCSAgaWYgKChsb25nKSBudW0gPCAtMiB8fCAobG9uZykgbnVtID4gMykKLQkgICAgcmV0dmFsID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOyAKLQkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7ICAKLQkgIGlmICgoKGxvbmcpIG51bSA+IG1heCkgfHwgKChsb25nKSBudW0gPCBtaW4pKQotCSAgICByZXR2YWwgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0gICAgICBtaW4gPSAwOwotICAgICAgaWYgKChudW0gPiBtYXgpIHx8IChudW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiRDEwViBvcHRpb25zOlxuXAotLU8gICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUuICBXaWxsIGRvIHNvbWUgb3BlcmF0aW9ucyBpbiBwYXJhbGxlbC5cbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnTyc6Ci0gICAgICAvKiBPcHRpbWl6ZS4gV2lsbCBhdHRlbXB0IHRvIHBhcmFsbGVsaXplIG9wZXJhdGlvbnMgKi8KLSAgICAgIE9wdGltaXppbmcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTk9XQVJOU1dBUDoKLSAgICAgIGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXAgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0gIAotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgCi0gICpzaXplUCA9IHByZWMgKiAyOwotICAKLSAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgZDEwdl9oYXNoID0gaGFzaF9uZXcoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBEMTB2IGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICBmb3IgKG9wY29kZSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcGNvZGUtPm5hbWUpKQotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopb3Bjb2RlLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKGQxMHZfaGFzaCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICB9Ci0KLSAgZml4dXBzID0gJkZpeFVwc1swXTsKLSAgRml4VXBzWzBdLm5leHQgPSAmRml4VXBzWzFdOwotICBGaXhVcHNbMV0ubmV4dCA9ICZGaXhVcHNbMF07Ci19Ci0KLQotLyogdGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBwb3N0aW5jcmVtZW50IG9yIHBvc3RkZWNyZW1lbnQKLSAgIG9wZXJhdG9yICggJysnIG9yICctJyApIGZyb20gYW4gZXhwcmVzc2lvbiAqLwotCi1zdGF0aWMgaW50IHBvc3RmaXggKHApIAotICAgICBjaGFyICpwOwotewotICB3aGlsZSAoKnAgIT0gJy0nICYmICpwICE9ICcrJykgCi0gICAgewotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgaWYgKCpwID09ICctJykgCi0gICAgewotICAgICAgKnAgPSAnICc7Ci0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0gIGlmICgqcCA9PSAnKycpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIAotZ2V0X3JlbG9jIChvcCkgCi0gICAgIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wOwotewotICBpbnQgYml0cyA9IG9wLT5iaXRzOwotCi0gIGlmIChiaXRzIDw9IDQpIAotICAgIHJldHVybiAoMCk7Ci0gICAgICAKLSAgaWYgKG9wLT5mbGFncyAmIE9QRVJBTkRfQUREUikgCi0gICAgewotICAgICAgaWYgKGJpdHMgPT0gOCkKLQlyZXR1cm4gKEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpOwotICAgICAgZWxzZQotCXJldHVybiAoQkZEX1JFTE9DX0QxMFZfMThfUENSRUwpOwotICAgIH0KLQotICByZXR1cm4gKEJGRF9SRUxPQ18xNik7Ci19Ci0KLQotLyogZ2V0X29wZXJhbmRzIHBhcnNlcyBhIHN0cmluZyBvZiBvcGVyYW5kcyBhbmQgcmV0dXJucwotICAgYW4gYXJyYXkgb2YgZXhwcmVzc2lvbnMgKi8KLQotc3RhdGljIGludAotZ2V0X29wZXJhbmRzIChleHApIAotICAgICBleHByZXNzaW9uUyBleHBbXTsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IG51bW9wcyA9IDA7Ci0gIGludCBwb3N0ID0gMDsKLSAgaW50IHVzZXNfYXQgPSAwOwotICAKLSAgd2hpbGUgKCpwKSAgCi0gICAgewotICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCi0JcCsrOwotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIAotICAgICAgaWYgKCpwID09ICdAJykgCi0JewotCSAgdXNlc19hdCA9IDE7Ci0JICAKLQkgIHArKzsKLQkgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGlmICgqcCA9PSAnKCcpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRQQVI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICctJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVE1JTlVTOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUU0lHTjsKLQkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7Ci0JICAgIH0KLQkgIG51bW9wcysrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnAgPT0gJyknKSAKLQl7Ci0JICAvKiBqdXN0IHNraXAgdGhlIHRyYWlsaW5nIHBhcmVuICovCi0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0KLSAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBpdCBtaWdodCBiZSBhIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgIGlmICghcmVnaXN0ZXJfbmFtZSAoJmV4cFtudW1vcHNdKSkKLQl7Ci0JICAvKiBwYXJzZSBhcyBhbiBleHByZXNzaW9uICovCi0JICBpZiAodXNlc19hdCkKLQkgICAgewotCSAgICAgIC8qIEFueSBleHByZXNzaW9uIHRoYXQgaW52b2x2ZXMgdGhlIGluZGlyZWN0IGFkZHJlc3NpbmcKLQkJIGNhbm5vdCBhbHNvIGludm9sdmUgaW1tZWRpYXRlIGFkZHJlc3NpbmcuICBUaGVyZWZvcmUKLQkJIHRoZSB1c2Ugb2YgdGhlIGhhc2ggY2hhcmFjdGVyIGlzIGlsbGVnYWwuICAqLwotCSAgICAgIGludCBzYXZlID0gZG9fbm90X2lnbm9yZV9oYXNoOwotCSAgICAgIGRvX25vdF9pZ25vcmVfaGFzaCA9IDE7Ci0JICAgICAgCi0JICAgICAgZXhwcmVzc2lvbiAoJmV4cFtudW1vcHNdKTsKLQkgICAgICAKLQkgICAgICBkb19ub3RfaWdub3JlX2hhc2ggPSBzYXZlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7Ci0JfQotCi0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkB3b3JkIiwgNSkgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLQkgIGlmIChleHBbbnVtb3BzXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgIHsKLQkgICAgICAvKiBpZiBpdCBsb29rZWQgbGlrZSBhIHJlZ2lzdGVyIG5hbWUgYnV0IHdhcyBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAiQHdvcmQiIHRoZW4gaXQgd2FzIHJlYWxseSBhIHN5bWJvbCwgc28gY2hhbmdlIGl0IHRvCi0gICAgICAgICAgICAgICAgIG9uZSAqLwotCSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKWV4cFtudW1vcHNdLlhfb3Bfc3ltYm9sKTsKLQkgICAgfQotCi0JICAvKiBjaGVjayBmb3IgaWRlbnRpZmllckB3b3JkK2NvbnN0YW50ICovCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKycpCi0JICB7Ci0JICAgIGNoYXIgKm9yaWdfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKLQkgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOwotCSAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBuZXdfZXhwLlhfYWRkX251bWJlcjsKLQkgIH0KLQotCSAgLyogY29udmVydCBleHByIGludG8gYSByaWdodCBzaGlmdCBieSBBVF9XT1JEX1JJR0hUX1NISUZUICovCi0JICB7Ci0JICAgIGV4cHJlc3Npb25TIG5ld19leHA7Ci0JICAgIG1lbXNldCAoJm5ld19leHAsIDAsIHNpemVvZiBuZXdfZXhwKTsKLQkgICAgbmV3X2V4cC5YX2FkZF9udW1iZXIgPSBBVF9XT1JEX1JJR0hUX1NISUZUOwotCSAgICBuZXdfZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICBuZXdfZXhwLlhfdW5zaWduZWQgPSAxOwotCSAgICBleHBbbnVtb3BzXS5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZuZXdfZXhwKTsKLQkgICAgZXhwW251bW9wc10uWF9vcCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICB9Ci0KLQkgIGtub3cgKEFUX1dPUkRfUCAoJmV4cFtudW1vcHNdKSk7Ci0JfQotICAgICAgCi0gICAgICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2lsbGVnYWwpIAotCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOwotICAgICAgZWxzZSBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2Fic2VudCkgCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0KLSAgICAgIG51bW9wcysrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgc3dpdGNoIChwb3N0KSAKLSAgICB7Ci0gICAgY2FzZSAtMToJLyogcG9zdGRlY3JlbWVudCBtb2RlICovCi0gICAgICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfTUlOVVM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6CS8qIHBvc3RpbmNyZW1lbnQgbW9kZSAqLwotICAgICAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotICAgICAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX1BMVVM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZXhwW251bW9wc10uWF9vcCA9IDA7Ci0gIHJldHVybiAobnVtb3BzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWQxMHZfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wX3R5cGUsIHZhbHVlLCBsZWZ0LCBmaXgpIAotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCBvcF90eXBlOwotICAgICBvZmZzZXRUIHZhbHVlOwotICAgICBpbnQgbGVmdDsKLSAgICAgZml4UyAqZml4OwotewotICBpbnQgc2hpZnQsIGJpdHM7Ci0KLSAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wX3R5cGVdLnNoaWZ0OwotICBpZiAobGVmdCkKLSAgICBzaGlmdCArPSAxNTsKLQotICBiaXRzID0gZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5iaXRzOwotCi0gIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KLSAgaWYgKGNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5mbGFncykpCi0gICAgYXNfYmFkX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksIHZhbHVlKTsKLQotICB2YWx1ZSAmPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotICBpbnNuIHw9ICh2YWx1ZSA8PCBzaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQotLyogYnVpbGRfaW5zbiB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIG9wY29kZSBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlCi0gICBhbmQgdGhlIGFycmF5IG9mIG9wZXJhbmQgZXhwcmVzc2lvbnMgYW5kIHJldHVybnMgdGhlIGluc3RydWN0aW9uICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1idWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzLCBpbnNuKSAKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyczsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotewotICBpbnQgaSwgYml0cywgc2hpZnQsIGZsYWdzLCBmb3JtYXQ7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotICAKLSAgLyogdGhlIGluc24gYXJndW1lbnQgaXMgb25seSB1c2VkIGZvciB0aGUgRElWUyBrbHVkZ2UgKi8KLSAgaWYgKGluc24pCi0gICAgZm9ybWF0ID0gTE9OR19SOwotICBlbHNlCi0gICAgewotICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotICAgICAgZm9ybWF0ID0gb3Bjb2RlLT5mb3JtYXQ7Ci0gICAgfQotICAKLSAgZm9yIChpPTA7b3Bjb2RlLT5vcGVyYW5kc1tpXTtpKyspIAotICAgIHsKLSAgICAgIGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLSAgICAgIGJpdHMgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmJpdHM7Ci0gICAgICBzaGlmdCA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uc2hpZnQ7Ci0gICAgICBudW1iZXIgPSBvcGVyc1tpXS5YX2FkZF9udW1iZXI7Ci0KLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKSAKLQl7Ci0JICBudW1iZXIgJj0gUkVHSVNURVJfTUFTSzsKLQkgIGlmIChmb3JtYXQgPT0gTE9OR19MKQotCSAgICBzaGlmdCArPSAxNTsKLQl9Ci0KLSAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fcmVnaXN0ZXIgJiYgb3BlcnNbaV0uWF9vcCAhPSBPX2NvbnN0YW50KSAKLQl7Ci0JICAvKiBub3cgY3JlYXRlIGEgZml4dXAgKi8KLQotCSAgaWYgKGZpeHVwcy0+ZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICBpZiAoQVRfV09SRF9QICgmb3BlcnNbaV0pKQotCSAgICB7Ci0JICAgICAgLyogUmVjb25pemUgWFhYPj4xK04gYWthIFhYWEB3b3JkK04gYXMgc3BlY2lhbCAoQVRfV09SRCkgKi8KLQkgICAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9IEJGRF9SRUxPQ19EMTBWXzE4OwotCSAgICAgIG9wZXJzW2ldLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBvcGVyc1tpXS5YX29wX3N5bWJvbCA9IE5VTEw7IC8qIFNob3VsZCBmcmVlIGl0ICovCi0JICAgICAgLyogbnVtYmVyIGlzIGxlZnQgc2hpZnRlZCBieSBBVF9XT1JEX1JJR0hUX1NISUZUIHNvCi0gICAgICAgICAgICAgICAgIHRoYXQsIGl0IGlzIGFsaWduZWQgd2l0aCB0aGUgc3ltYm9sJ3MgdmFsdWUuICBMYXRlciwKLSAgICAgICAgICAgICAgICAgQkZEX1JFTE9DX0QxMFZfMTggd2lsbCByaWdodCBzaGlmdCAoc3ltYm9sX3ZhbHVlICsKLSAgICAgICAgICAgICAgICAgWF9hZGRfbnVtYmVyKS4gKi8KLQkgICAgICBudW1iZXIgPDw9IEFUX1dPUkRfUklHSFRfU0hJRlQ7Ci0JICAgICAgb3BlcnNbaV0uWF9hZGRfbnVtYmVyID0gbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID0gCi0JICAgICAgZ2V0X3JlbG9jKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0pOwotCi0JICBpZiAoZml4dXBzLT5maXhbZml4dXBzLT5mY10ucmVsb2MgPT0gQkZEX1JFTE9DXzE2IHx8IAotCSAgICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5zaXplID0gMjsgCSAgICAKLQkgIGVsc2UKLQkgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDQ7Ci0gCSAgICAKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLmV4cCA9IG9wZXJzW2ldOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ub3BlcmFuZCA9IG9wY29kZS0+b3BlcmFuZHNbaV07Ci0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IChmbGFncyAmIE9QRVJBTkRfQUREUikgPyB0cnVlIDogZmFsc2U7Ci0JICAoZml4dXBzLT5mYykrKzsKLQl9Ci0KLSAgICAgIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIGlmICgob3BlcnNbaV0uWF9vcCA9PSBPX2NvbnN0YW50KSAmJiBjaGVja19yYW5nZSAobnVtYmVyLCBiaXRzLCBmbGFncykpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiKSxudW1iZXIpOwotICAgICAgbnVtYmVyICY9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7Ci0gICAgICBpbnNuID0gaW5zbiB8IChudW1iZXIgPDwgc2hpZnQpOwotICAgIH0KLQotICAvKiBrbHVkZ2U6IGZvciBESVZTLCB3ZSBuZWVkIHRvIHB1dCB0aGUgb3BlcmFuZHMgaW4gdHdpY2UgKi8KLSAgLyogb24gdGhlIHNlY29uZCBwYXNzLCBmb3JtYXQgaXMgY2hhbmdlZCB0byBMT05HX1IgdG8gZm9yY2UgKi8KLSAgLyogdGhlIHNlY29uZCBzZXQgb2Ygb3BlcmFuZHMgdG8gbm90IGJlIHNoaWZ0ZWQgb3ZlciAxNSAqLwotICBpZiAoKG9wY29kZS0+b3Bjb2RlID09IE9QQ09ERV9ESVZTKSAmJiAoZm9ybWF0PT1MT05HX0wpKQotICAgIGluc24gPSBidWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzLCBpbnNuKTsKLSAgICAgIAotICByZXR1cm4gaW5zbjsKLX0KLQotLyogd3JpdGUgb3V0IGEgbG9uZyBmb3JtIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZAotd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmeCkgCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIEZpeHVwcyAqZng7Ci17Ci0gIGludCBpLCB3aGVyZTsKLSAgY2hhciAqZiA9IGZyYWdfbW9yZSg0KTsKLQotICBpbnNuIHw9IEZNMTE7Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIDQpOwotCi0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBpZiAoZngtPmZpeFtpXS5zaXplID09IDIpCi0JICAgIHdoZXJlICs9IDI7Ci0KLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCSAgICBmeC0+Zml4W2ldLm9wZXJhbmQgfD0gNDA5NjsJICAKLQotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgd2hlcmUsCi0JCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCi0JCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCSAgICAgICBmeC0+Zml4W2ldLm9wZXJhbmR8MjA0OCk7Ci0JfQotICAgIH0KLSAgZngtPmZjID0gMDsKLX0KLQotCi0vKiB3cml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGJ5IGl0c2VsZiAqLwotc3RhdGljIHZvaWQKLXdyaXRlXzFfc2hvcnQgKG9wY29kZSwgaW5zbiwgZngpIAotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotewotICBjaGFyICpmID0gZnJhZ19tb3JlKDQpOwotICBpbnQgaSwgd2hlcmU7Ci0KLSAgaWYgKG9wY29kZS0+ZXhlY190eXBlICYgUEFST05MWSkKLSAgICBhc19mYXRhbCAoXygiSW5zdHJ1Y3Rpb24gbXVzdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCB3aXRoIGFub3RoZXIgaW5zdHJ1Y3Rpb24uIikpOwotCi0gIC8qIHRoZSBvdGhlciBjb250YWluZXIgbmVlZHMgdG8gYmUgTk9QICovCi0gIC8qIGFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAwLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZCBvbmx5Ci0gICAgIGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLwotICBpZiAob3Bjb2RlLT51bml0ID09IElVKQotICAgIGluc24gfD0gRk0wMCB8IChOT1AgPDwgMTUpOwkJLyogcmlnaHQgY29udGFpbmVyICovCi0gIGVsc2UKLSAgICBpbnNuID0gRk0wMCB8IChpbnNuIDw8IDE1KSB8IE5PUDsJLyogbGVmdCBjb250YWluZXIgKi8KLQotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLSAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0gICAgewotICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JeyAKLQkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgIGlmIChmeC0+Zml4W2ldLnNpemUgPT0gMikKLQkgICAgd2hlcmUgKz0gMjsKLQotCSAgaWYgKGZ4LT5maXhbaV0ucmVsb2MgPT0gQkZEX1JFTE9DX0QxMFZfMTgpCi0JICAgIGZ4LT5maXhbaV0ub3BlcmFuZCB8PSA0MDk2OwkgIAotCi0JICAvKiBpZiBpdCdzIGFuIFIgcmVsb2MsIHdlIG1heSBoYXZlIHRvIHN3aXRjaCBpdCB0byBMICovCi0JICBpZiAoIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpICYmIChvcGNvZGUtPnVuaXQgIT0gSVUpICkKLQkgICAgZngtPmZpeFtpXS5vcGVyYW5kIHw9IDEwMjQ7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLCAKLQkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAotCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJICAgICAgIGZ4LT5maXhbaV0ub3BlcmFuZHwyMDQ4KTsKLQl9Ci0gICAgfQotICBmeC0+ZmMgPSAwOwotfQotCi0vKiB3cml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGlmIHBvc3NpYmxlICovCi0vKiByZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBub3Qgd3JpdHRlbiBvdXQgKi8KLXN0YXRpYyBpbnQKLXdyaXRlXzJfc2hvcnQgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlLCBmeCkgCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgKm9wY29kZTI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBpbnQgZXhlY190eXBlOwotICAgICBGaXh1cHMgKmZ4OwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGNoYXIgKmY7Ci0gIGludCBpLGosIHdoZXJlOwotCi0gIGlmICggKGV4ZWNfdHlwZSAhPSAxKSAmJiAoKG9wY29kZTEtPmV4ZWNfdHlwZSAmIFBBUk9OTFkpCi0JICAgICAgICAgICAgICAgIHx8IChvcGNvZGUyLT5leGVjX3R5cGUgJiBQQVJPTkxZKSkpCi0gICAgYXNfZmF0YWwgKF8oIkluc3RydWN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gIAotICBpZiAoIChvcGNvZGUxLT5mb3JtYXQgJiBMT05HX09QQ09ERSkgfHwgKG9wY29kZTItPmZvcm1hdCAmIExPTkdfT1BDT0RFKSkKLSAgICBhc19mYXRhbCAoXygiTG9uZyBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBjb21iaW5lZC4iKSk7Ci0KLSAgaWYob3Bjb2RlMS0+ZXhlY190eXBlICYgQlJBTkNIX0xJTksgJiYgZXhlY190eXBlID09IDApCi0gICAgewotICAgICAgLyogSW5zdHJ1Y3Rpb25zIHBhaXJlZCB3aXRoIGEgc3Vicm91dGluZSBjYWxsIGFyZSBleGVjdXRlZCBiZWZvcmUgdGhlCi0JIHN1YnJvdXRpbmUsIHNvIGRvbid0IGRvIHRoZXNlIHBhaXJpbmdzIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCi0gICAgICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQpOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChleGVjX3R5cGUpIAotICAgIHsKLSAgICBjYXNlIDA6CS8qIG9yZGVyIG5vdCBzcGVjaWZpZWQgKi8KLSAgICAgIGlmICggT3B0aW1pemluZyAmJiBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpKQotCXsKLQkgIC8qIHBhcmFsbGVsICovCi0JICBpZiAob3Bjb2RlMS0+dW5pdCA9PSBJVSkKLQkgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7Ci0JICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VKQotCSAgICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDE1KSB8IGluc24yOyAgCi0JICAgICAgZnggPSBmeC0+bmV4dDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUpIAotCXsKLQkgIC8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTAxIHwgKGluc24xIDw8IDE1KSB8IGluc24yOwotCSAgZnggPSBmeC0+bmV4dDsgIAotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToJLyogcGFyYWxsZWwgKi8KLSAgICAgIGlmIChvcGNvZGUxLT5leGVjX3R5cGUgJiBTRVEgfHwgb3Bjb2RlMi0+ZXhlY190eXBlICYgU0VRKQotCWFzX2ZhdGFsIChfKCJPbmUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIikpOwotCi0gICAgICBpZiAob3Bjb2RlMS0+dW5pdCA9PSBJVSkKLQl7Ci0JICBpZiAob3Bjb2RlMi0+dW5pdCA9PSBJVSkKLQkgICAgYXNfZmF0YWwgKF8oIlR3byBJVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLSAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCi0JICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotIAkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTItPnVuaXQgPT0gTVUpCi0JewotCSAgaWYgKG9wY29kZTEtPnVuaXQgPT0gTVUpCi0JICAgIGFzX2ZhdGFsIChfKCJUd28gTVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gICAgICAgICAgaWYgKCFmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKQotCSAgICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLQkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsgIAotCSAgZnggPSBmeC0+bmV4dDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6CS8qIHNlcXVlbnRpYWwgKi8KLSAgICAgIGlmIChvcGNvZGUxLT51bml0ICE9IElVKQotCWluc24gPSBGTTAxIHwgKGluc24xIDw8IDE1KSB8IGluc24yOyAgCi0gICAgICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VIHx8IG9wY29kZTItPnVuaXQgPT0gRUlUSEVSKQotCXsKLSAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCi0JICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7ICAKLQl9Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIikpOwotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoJLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMi0+dW5pdCAhPSBNVSkKLQlpbnNuID0gRk0xMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsKLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUgfHwgb3Bjb2RlMS0+dW5pdCA9PSBFSVRIRVIpCi0JewotICAgICAgICAgIGlmICghZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCkKLQkgICAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0JICBpbnNuID0gRk0wMSB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsgIAotCX0KLSAgICAgIGVsc2UKLQlhc19mYXRhbCAoXygiTVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgcmlnaHQgY29udGFpbmVyIikpOwotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBleGVjdXRpb24gdHlwZSBwYXNzZWQgdG8gd3JpdGVfMl9zaG9ydCgpIikpOwotICAgIH0KLQotICBmID0gZnJhZ19tb3JlKDQpOwotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLQotICBmb3IgKGo9MDsgajwyOyBqKyspIAotICAgIHsKLSAgICAgIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotCXsKLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCSAgICB7Ci0JICAgICAgd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7IAotCSAgICAgIGlmIChmeC0+Zml4W2ldLnNpemUgPT0gMikKLQkJd2hlcmUgKz0gMjsKLQkgICAgICAKLQkgICAgICBpZiAoIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpICYmIChqID09IDApICkKLQkJZngtPmZpeFtpXS5vcGVyYW5kIHw9IDEwMjQ7Ci0JICAgICAgCi0JICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MgPT0gQkZEX1JFTE9DX0QxMFZfMTgpCi0JCWZ4LT5maXhbaV0ub3BlcmFuZCB8PSA0MDk2OwkgIAotCi0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgd2hlcmUsIAotCQkJICAgZngtPmZpeFtpXS5zaXplLAotCQkJICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCQkgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkJICAgZngtPmZpeFtpXS5vcGVyYW5kfDIwNDgpOwotCSAgICB9Ci0JfQotICAgICAgZngtPmZjID0gMDsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0KLS8qIENoZWNrIDIgaW5zdHJ1Y3Rpb25zIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBjYW4gYmUgc2FmZWx5ICovCi0vKiBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIFJldHVybnMgMSBpZiB0aGV5IGNhbiBiZS4gICAgICAgICAqLwotc3RhdGljIGludAotcGFyYWxsZWxfb2sgKG9wMSwgaW5zbjEsIG9wMiwgaW5zbjIsIGV4ZWNfdHlwZSkKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDEsICpvcDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBpbnQgZXhlY190eXBlOwotewotICBpbnQgaSwgaiwgZmxhZ3MsIG1hc2ssIHNoaWZ0LCByZWdubzsKLSAgdW5zaWduZWQgbG9uZyBpbnMsIG1vZFsyXSwgdXNlZFsyXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKLQotICBpZiAoKG9wMS0+ZXhlY190eXBlICYgU0VRKSAhPSAwIHx8IChvcDItPmV4ZWNfdHlwZSAmIFNFUSkgIT0gMAotICAgICAgfHwgKG9wMS0+ZXhlY190eXBlICYgUEFSKSA9PSAwIHx8IChvcDItPmV4ZWNfdHlwZSAmIFBBUikgPT0gMAotICAgICAgfHwgKG9wMS0+dW5pdCA9PSBCT1RIKSB8fCAob3AyLT51bml0ID09IEJPVEgpCi0gICAgICB8fCAob3AxLT51bml0ID09IElVICYmIG9wMi0+dW5pdCA9PSBJVSkKLSAgICAgIHx8IChvcDEtPnVuaXQgPT0gTVUgJiYgb3AyLT51bml0ID09IE1VKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggYW5kIHRoaXMgaXMgYXV0byBwYXJhbGxhemF0aW9uLAotICAgICBkb24ndCBjb21iaW5lIHdpdGggYW55IHNlY29uZCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChleGVjX3R5cGUgPT0gMCAmJiAob3AxLT5leGVjX3R5cGUgJiBCUkFOQ0gpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogVGhlIGlkZWEgaGVyZSBpcyB0byBjcmVhdGUgdHdvIHNldHMgb2YgYml0bWFza3MgKG1vZCBhbmQgdXNlZCkKLSAgICAgd2hpY2ggaW5kaWNhdGUgd2hpY2ggcmVnaXN0ZXJzIGFyZSBtb2RpZmllZCBvciB1c2VkIGJ5IGVhY2gKLSAgICAgaW5zdHJ1Y3Rpb24uICBUaGUgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIGRvbmUgaW4gcGFyYWxsZWwgaWYKLSAgICAgaW5zdHJ1Y3Rpb24gMSBhbmQgaW5zdHJ1Y3Rpb24gMiBtb2RpZnkgZGlmZmVyZW50IHJlZ2lzdGVycywgYW5kCi0gICAgIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtb2RpZnkgcmVnaXN0ZXJzIHRoYXQgdGhlIHNlY29uZAotICAgICBpcyB1c2luZyAoVGhlIHNlY29uZCBpbnN0cnVjdGlvbiBjYW4gbW9kaWZ5IHJlZ2lzdGVycyB0aGF0IHRoZQotICAgICBmaXJzdCBpcyB1c2luZyBhcyB0aGV5IGFyZSBvbmx5IHdyaXR0ZW4gYmFjayBhZnRlciB0aGUgZmlyc3QKLSAgICAgaW5zdHJ1Y3Rpb24gaGFzIGNvbXBsZXRlZCkuICBBY2Nlc3NlcyB0byBjb250cm9sIHJlZ2lzdGVycywgUFNXLAotICAgICBhbmQgbWVtb3J5IGFyZSB0cmVhdGVkIGFzIGFjY2Vzc2VzIHRvIGEgc2luZ2xlIHJlZ2lzdGVyLiAgU28gaWYKLSAgICAgYm90aCBpbnN0cnVjdGlvbnMgd3JpdGUgbWVtb3J5IG9yIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3cml0ZXMKLSAgICAgbWVtb3J5IGFuZCB0aGUgc2Vjb25kIHJlYWRzLCB0aGVuIHRoZXkgY2Fubm90IGJlIGRvbmUgaW4KLSAgICAgcGFyYWxsZWwuICBMaWtld2lzZSwgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIG11Y2tzIHdpdGggdGhlIHBzdwotICAgICBhbmQgdGhlIHNlY29uZCByZWFkcyB0aGUgUFNXICh3aGljaCBpbmNsdWRlcyBDLCBGMCwgYW5kIEYxKSwgdGhlbgotICAgICB0aGV5IGNhbm5vdCBvcGVyYXRlIHNhZmVseSBpbiBwYXJhbGxlbC4gKi8KLQotICAvKiB0aGUgYml0bWFza3MgKG1vZCBhbmQgdXNlZCkgbG9vayBsaWtlIHRoaXMgKGJpdCAzMSA9IE1TQikgKi8KLSAgLyogcjAtcjE1CSAgMC0xNSAgKi8KLSAgLyogYTAtYTEJICAxNi0xNyAqLwotICAvKiBjciAobm90IHBzdykgMTggICAgKi8KLSAgLyogcHN3CSAgMTkgICAgKi8KLSAgLyogbWVtCSAgMjAgICAgKi8KLQotICBmb3IgKGo9MDtqPDI7aisrKQotICAgIHsKLSAgICAgIGlmIChqID09IDApCi0JewotCSAgb3AgPSBvcDE7Ci0JICBpbnMgPSBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3AgPSBvcDI7Ci0JICBpbnMgPSBpbnNuMjsKLQl9Ci0gICAgICBtb2Rbal0gPSB1c2VkW2pdID0gMDsKLSAgICAgIGlmIChvcC0+ZXhlY190eXBlICYgQlJBTkNIX0xJTkspCi0JbW9kW2pdIHw9IDEgPDwgMTM7Ci0KLSAgICAgIGZvciAoaSA9IDA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCXsKLQkgIGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV0uc2hpZnQ7Ci0JICBtYXNrID0gMHg3RkZGRkZGRiA+PiAoMzEgLSBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV0uYml0cyk7Ci0JICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkgICAgewotCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiBtYXNrOwotCSAgICAgIGlmIChmbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQkJcmVnbm8gKz0gMTY7Ci0JICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCS8qIG12dGMgb3IgbXZmYyAqLwotCQl7IAotCQkgIGlmIChyZWdubyA9PSAwKQotCQkgICAgcmVnbm8gPSAxOTsKLQkJICBlbHNlCi0JCSAgICByZWdubyA9IDE4OyAKLQkJfQotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgKE9QRVJBTkRfRkZMQUd8T1BFUkFORF9DRkxBRykpCi0JCXJlZ25vID0gMTk7Ci0JICAgICAgCi0JICAgICAgaWYgKCBmbGFncyAmIE9QRVJBTkRfREVTVCApCi0JCXsKLQkJICBtb2Rbal0gfD0gMSA8PCByZWdubzsKLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0VWRU4pCi0JCSAgICBtb2Rbal0gfD0gMSA8PCAocmVnbm8gKyAxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHVzZWRbal0gfD0gMSA8PCByZWdubyA7Ci0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9FVkVOKQotCQkgICAgdXNlZFtqXSB8PSAxIDw8IChyZWdubyArIDEpOwotCi0JCSAgLyogQXV0byBpbmMvZGVjIGFsc28gbW9kaWZpZXMgdGhlIHJlZ2lzdGVyLiAgKi8KLQkJICBpZiAob3AtPm9wZXJhbmRzW2krMV0gIT0gMAotCQkgICAgICAmJiAoZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MKLQkJCSAgJiAoT1BFUkFORF9QTFVTIHwgT1BFUkFORF9NSU5VUykpICE9IDApCi0JCSAgICBtb2Rbal0gfD0gMSA8PCByZWdubzsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykKLQkgICAgewotCSAgICAgIC8qIFNQIGltcGxpY2l0bHkgdXNlZC9tb2RpZmllZCAqLwotCSAgICAgIG1vZFtqXSB8PSAxIDw8IDE1OwotCSAgICAgIHVzZWRbal0gfD0gMSA8PCAxNTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChvcC0+ZXhlY190eXBlICYgUk1FTSkKLQl1c2VkW2pdIHw9IDEgPDwgMjA7Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhlY190eXBlICYgV01FTSkKLQltb2Rbal0gfD0gMSA8PCAyMDsKLSAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBSRjApCi0JdXNlZFtqXSB8PSAxIDw8IDE5OwotICAgICAgZWxzZSBpZiAob3AtPmV4ZWNfdHlwZSAmIFdGMCkKLQltb2Rbal0gfD0gMSA8PCAxOTsKLSAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBXQ0FSKQotCW1vZFtqXSB8PSAxIDw8IDE5OwotICAgIH0KLSAgaWYgKChtb2RbMF0gJiBtb2RbMV0pID09IDAgJiYgKG1vZFswXSAmIHVzZWRbMV0pID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBzdHIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUtZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyAKLSAgIGl0IGFzc2VtYmxlcyB0by4gIEZvciB0aGUgRDEwViwgaXQgbW9zdGx5IGhhbmRsZXMgdGhlIHNwZWNpYWwgVkxJVyBwYXJzaW5nIGFuZCBwYWNraW5nCi0gICBhbmQgbGVhdmVzIHRoZSBkaWZmaWN1bHQgc3R1ZmYgdG8gZG9fYXNzZW1ibGUoKS4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2luc247Ci1zdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICpwcmV2X29wY29kZSA9IDA7Ci1zdGF0aWMgc3Vic2VnVCBwcmV2X3N1YnNlZzsKLXN0YXRpYyBzZWdUIHByZXZfc2VnID0gMDs7Ci1zdGF0aWMgaW50IGV0eXBlID0gMDsJCS8qIHNhdmVkIGV4dHlwZS4gIHVzZWQgZm9yIG11bHRpbGluZSBpbnN0cnVjdGlvbnMgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKiBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgaW50IGV4dHlwZSA9IDA7CQkvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwsIGV0YyAqLwotICBjaGFyICogc3RyMjsKLQotICBpZiAoZXR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBsb29rIGZvciB0aGUgc3BlY2lhbCBtdWx0aXBsZSBpbnN0cnVjdGlvbiBzZXBhcmF0b3JzICovCi0gICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICJ8fCIpOwotICAgICAgaWYgKHN0cjIpIAotCWV4dHlwZSA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiLT4iKTsKLQkgIGlmIChzdHIyKSAKLQkgICAgZXh0eXBlID0gMjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIjwtIik7Ci0JICAgICAgaWYgKHN0cjIpIAotCQlleHR5cGUgPSAzOwotCSAgICB9Ci0JfQotICAgICAgLyogc3RyMiBwb2ludHMgdG8gdGhlIHNlcGFyYXRvciwgaWYgb25lICovCi0gICAgICBpZiAoc3RyMikgCi0JewotCSAgKnN0cjIgPSAwOwotCSAgCi0JICAvKiBpZiB0d28gaW5zdHJ1Y3Rpb25zIGFyZSBwcmVzZW50IGFuZCB3ZSBhbHJlYWR5IGhhdmUgb25lIHNhdmVkCi0JICAgICB0aGVuIGZpcnN0IHdyaXRlIGl0IG91dCAqLwotCSAgZDEwdl9jbGVhbnVwICgpOwotCSAgCi0JICAvKiBhc3NlbWJsZSBmaXJzdCBpbnN0cnVjdGlvbiBhbmQgc2F2ZSBpdCAqLwotCSAgcHJldl9pbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJnByZXZfb3Bjb2RlKTsKLQkgIGlmIChwcmV2X2luc24gPT0gLTEpCi0JICAgIGFzX2ZhdGFsIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0JICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7Ci0JICBzdHIgPSBzdHIyICsgMjsKLQl9Ci0gICAgfQotCi0gIGluc24gPSBkb19hc3NlbWJsZSAoc3RyLCAmb3Bjb2RlKTsKLSAgaWYgKGluc24gPT0gLTEpCi0gICAgewotICAgICAgaWYgKGV4dHlwZSkKLQl7Ci0JICBldHlwZSA9IGV4dHlwZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhc19mYXRhbCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLQotICBpZiAoZXR5cGUpCi0gICAgewotICAgICAgZXh0eXBlID0gZXR5cGU7Ci0gICAgICBldHlwZSA9IDA7Ci0gICAgfQotCi0gIC8qIGlmIHRoaXMgaXMgYSBsb25nIGluc3RydWN0aW9uLCB3cml0ZSBpdCBhbmQgYW55IHByZXZpb3VzIHNob3J0IGluc3RydWN0aW9uICovCi0gIGlmIChvcGNvZGUtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSAKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlKSAKLQlhc19mYXRhbCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgZDEwdl9jbGVhbnVwICgpOwotICAgICAgd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmaXh1cHMpOwotICAgICAgcHJldl9vcGNvZGUgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGlmIChwcmV2X29wY29kZSAmJiBwcmV2X3NlZyAmJiAoKHByZXZfc2VnICE9IG5vd19zZWcpIHx8IChwcmV2X3N1YnNlZyAhPSBub3dfc3Vic2VnKSkpCi0gICAgZDEwdl9jbGVhbnVwKCk7Ci0gIAotICBpZiAocHJldl9vcGNvZGUgJiYgKHdyaXRlXzJfc2hvcnQgKHByZXZfb3Bjb2RlLCBwcmV2X2luc24sIG9wY29kZSwgaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApKSAKLSAgICB7Ci0gICAgICAvKiBubyBpbnN0cnVjdGlvbnMgc2F2ZWQgKi8KLSAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlKSAKLQlhc19mYXRhbCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgLyogc2F2ZSBvZmYgbGFzdCBpbnN0cnVjdGlvbiBzbyBpdCBtYXkgYmUgcGFja2VkIG9uIG5leHQgcGFzcyAqLwotICAgICAgcHJldl9vcGNvZGUgPSBvcGNvZGU7Ci0gICAgICBwcmV2X2luc24gPSBpbnNuOwotICAgICAgcHJldl9zZWcgPSBub3dfc2VnOwotICAgICAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotICAgIH0KLX0KLQotCi0vKiBkb19hc3NlbWJsZSBhc3NlbWJsZXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gYW5kIHJldHVybnMgYW4gb3Bjb2RlICovCi0vKiBpdCByZXR1cm5zIC0xIChhbiBpbnZhbGlkIG9wY29kZSkgb24gZXJyb3IgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWRvX2Fzc2VtYmxlIChzdHIsIG9wY29kZSkgCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICoqb3Bjb2RlOwotewotICB1bnNpZ25lZCBjaGFyICpvcF9zdGFydCwgKnNhdmU7Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKLSAgY2hhciBuYW1lWzIwXTsKLSAgaW50IG5sZW4gPSAwOwotICBleHByZXNzaW9uUyBteW9wc1s2XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZSBlbmQuICAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gKHVuc2lnbmVkIGNoYXIgKikgKHN0cik7Ci0gICAgICAgKm9wX2VuZAotICAgICAgICYmIG5sZW4gPCAyMAotICAgICAgICYmICFpc19lbmRfb2ZfbGluZVsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBuYW1lW25sZW5dID0gdG9sb3dlciAob3Bfc3RhcnRbbmxlbl0pOwotICAgICAgbmxlbisrOwotICAgIH0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0gIAotICAvKiBGaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUuICAqLwotICAqb3Bjb2RlID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWhhc2hfZmluZCAoZDEwdl9oYXNoLCBuYW1lKTsKLSAgaWYgKCpvcGNvZGUgPT0gTlVMTCkKLSAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIG9wY29kZTogJXMiKSxuYW1lKTsKLQotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcF9lbmQ7Ci0gICpvcGNvZGUgPSBmaW5kX29wY29kZSAoKm9wY29kZSwgbXlvcHMpOwotICBpZiAoKm9wY29kZSA9PSAwKQotICAgIHJldHVybiAtMTsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLQotICBpbnNuID0gYnVpbGRfaW5zbiAoKCpvcGNvZGUpLCBteW9wcywgMCk7IAotICByZXR1cm4gKGluc24pOwotfQotCi0vKiBGaW5kIHRoZSBzeW1ib2wgd2hpY2ggaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyIGluIHRoZSBnaXZlbiBleHByZXNzaW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICoKLWZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyIChleHApCi0gICAgIGV4cHJlc3Npb25TICogZXhwOwotewotICBpbnQgaTsKLSAgCi0gIGlmIChleHAtPlhfb3AgIT0gT19yZWdpc3RlcikKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIEZpbmQgdGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyLiAgKi8KLSAgZm9yIChpID0gZDEwdl9yZWdfbmFtZV9jbnQgKCk7IGktLTspCi0gICAgaWYgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgW2ldLnZhbHVlID09IGV4cC0+WF9hZGRfbnVtYmVyKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGkgPCAwKQotICAgIGFib3J0ICgpOwotCi0gIC8qIE5vdyBzZWUgaWYgYSBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICByZXR1cm4gc3ltYm9sX2ZpbmQgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgW2ldLm5hbWUpOwotfQotCi0KLS8qIGZpbmRfb3Bjb2RlKCkgZ2V0cyBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZS4gICAgICAgKi8KLS8qIEl0IG11c3QgbG9vayBhdCBhbGwgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHVzZSB0aGUgb3BlcmFuZHMgKi8KLS8qIHRvIGNob29zZSB0aGUgY29ycmVjdCBvcGNvZGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZDEwdl9vcGNvZGUgKgotZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotewotICBpbnQgaSwgbWF0Y2gsIGRvbmU7Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqbmV4dF9vcGNvZGU7Ci0KLSAgLyogZ2V0IGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucyAqLwotICBnZXRfb3BlcmFuZHMgKG15b3BzKTsKLQotICAvKiBub3cgc2VlIGlmIHRoZSBvcGVyYW5kIGlzIGEgZmFrZS4gIElmIHNvLCBmaW5kIHRoZSBjb3JyZWN0IHNpemUgKi8KLSAgLyogaW5zdHJ1Y3Rpb24sIGlmIHBvc3NpYmxlICovCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBPUENPREVfRkFLRSkKLSAgICB7Ci0gICAgICBpbnQgb3BudW0gPSBvcGNvZGUtPm9wZXJhbmRzWzBdOwotICAgICAgaW50IGZsYWdzOwotCQkJIAotICAgICAgaWYgKG15b3BzW29wbnVtXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgbXlvcHNbb3BudW1dLlhfb3AgPSBPX3N5bWJvbDsKLQkgIG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW29wbnVtXS5YX29wX3N5bWJvbCk7Ci0JICBteW9wc1tvcG51bV0uWF9hZGRfbnVtYmVyID0gMDsKLQkgIG15b3BzW29wbnVtXS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBuZXh0X29wY29kZT1vcGNvZGUrMTsKLQotICAgICAgLyogSWYgdGhlIGZpcnN0IG9wZXJhbmQgaXMgc3VwcG9zZWQgdG8gYmUgYSByZWdpc3RlciwgbWFrZSBzdXJlCi0JIHdlIGdvdCBhIHZhbGlkIG9uZS4gICovCi0gICAgICBmbGFncyA9IGQxMHZfb3BlcmFuZHNbbmV4dF9vcGNvZGUtPm9wZXJhbmRzWzBdXS5mbGFnczsKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCXsKLQkgIGludCBYX29wID0gbXlvcHNbMF0uWF9vcDsKLQkgIGludCBudW0gPSBteW9wc1swXS5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChYX29wICE9IE9fcmVnaXN0ZXIKLQkgICAgICB8fCAobnVtICYgfmZsYWdzCi0JCSAgJiAoT1BFUkFORF9HUFIgfCBPUEVSQU5EX0FDQzAgfCBPUEVSQU5EX0FDQzEKLQkJICAgICB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0NGTEFHIHwgT1BFUkFORF9DT05UUk9MKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiKSk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChteW9wc1tvcG51bV0uWF9vcCA9PSBPX2NvbnN0YW50IHx8IChteW9wc1tvcG51bV0uWF9vcCA9PSBPX3N5bWJvbCAmJgotCSAgU19JU19ERUZJTkVEKG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wpICYmCi0JICAoU19HRVRfU0VHTUVOVChteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnKSkpCi0JewotCSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaSsxXTsgaSsrKQotCSAgICB7Ci0JICAgICAgaW50IGJpdHMgPSBkMTB2X29wZXJhbmRzW25leHRfb3Bjb2RlLT5vcGVyYW5kc1tvcG51bV1dLmJpdHM7Ci0JICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tuZXh0X29wY29kZS0+b3BlcmFuZHNbb3BudW1dXS5mbGFnczsKLQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JCWJpdHMgKz0gMjsKLQkgICAgICBpZiAobXlvcHNbb3BudW1dLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIGlmICghY2hlY2tfcmFuZ2UgKG15b3BzW29wbnVtXS5YX2FkZF9udW1iZXIsIGJpdHMsIGZsYWdzKSkKLQkJICAgIHJldHVybiBuZXh0X29wY29kZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdTICpmOwotCQkgIGxvbmcgdmFsdWU7Ci0JCSAgLyogY2FsY3VsYXRlIHRoZSBjdXJyZW50IGFkZHJlc3MgYnkgcnVubmluZyB0aHJvdWdoIHRoZSBwcmV2aW91cyBmcmFncyAqLwotCQkgIC8qIGFuZCBhZGRpbmcgb3VyIGN1cnJlbnQgb2Zmc2V0ICovCi0JCSAgZm9yICh2YWx1ZSA9IDAsIGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmOyBmID0gZi0+ZnJfbmV4dCkKLQkJICAgIHZhbHVlICs9IGYtPmZyX2ZpeCArIGYtPmZyX29mZnNldDsKLQotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUREUikKLQkJICAgIHZhbHVlID0gU19HRVRfVkFMVUUobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCkgLSB2YWx1ZSAtCi0JCSAgICAgIChvYnN0YWNrX25leHRfZnJlZSgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7Ci0JCSAgZWxzZQotCQkgICAgdmFsdWUgPSBTX0dFVF9WQUxVRShteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKTsKLQotCQkgIGlmIChBVF9XT1JEX1AgKCZteW9wc1tvcG51bV0pKQotCQkgICAgewotCQkgICAgICBpZiAoYml0cyA+IDQpCi0JCQl7Ci0JCQkgIGJpdHMgKz0gMjsKLQkJCSAgaWYgKCFjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkKLQkJCSAgICByZXR1cm4gbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIWNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZmxhZ3MpKQotCQkgICAgcmV0dXJuIG5leHRfb3Bjb2RlOwotCQl9Ci0JICAgICAgbmV4dF9vcGNvZGUrKzsKLQkgICAgfQotCSAgYXNfZmF0YWwgKF8oInZhbHVlIG91dCBvZiByYW5nZSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbm90IGEgY29uc3RhbnQsIHNvIHVzZSBhIGxvbmcgaW5zdHJ1Y3Rpb24gKi8gICAgCi0JICByZXR1cm4gb3Bjb2RlKzI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIC8qIG5vdyBzZWFyY2ggdGhlIG9wY29kZSB0YWJsZSB0YWJsZSBmb3Igb25lIHdpdGggb3BlcmFuZHMgKi8KLSAgICAgIC8qIHRoYXQgbWF0Y2hlcyB3aGF0IHdlJ3ZlIGdvdCAqLwotICAgICAgd2hpbGUgKCFtYXRjaCkKLQl7Ci0JICBtYXRjaCA9IDE7Ci0JICBmb3IgKGkgPSAwOyBvcGNvZGUtPm9wZXJhbmRzW2ldOyBpKyspIAotCSAgICB7Ci0JICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgICAgICBpbnQgWF9vcCA9IG15b3BzW2ldLlhfb3A7Ci0JICAgICAgaW50IG51bSA9IG15b3BzW2ldLlhfYWRkX251bWJlcjsKLQotCSAgICAgIGlmIChYX29wID09IDApCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkJewotCQkgIGlmICgoWF9vcCAhPSBPX3JlZ2lzdGVyKQotCQkgICAgICB8fCAobnVtICYgfmZsYWdzCi0JCQkgICYgKE9QRVJBTkRfR1BSIHwgT1BFUkFORF9BQ0MwIHwgT1BFUkFORF9BQ0MxCi0JCQkgICAgIHwgT1BFUkFORF9GRkxBRyB8IE9QRVJBTkRfQ0ZMQUcKLQkJCSAgICAgfCBPUEVSQU5EX0NPTlRST0wpKSkKLQkJICAgIHsKLQkJICAgICAgbWF0Y2ggPSAwOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIAotCSAgICAgIGlmICgoKGZsYWdzICYgT1BFUkFORF9NSU5VUykgICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9NSU5VUykpKSB8fAotCQkgICgoZmxhZ3MgJiBPUEVSQU5EX1BMVVMpICAgICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBPUEVSQU5EX1BMVVMpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9BVE1JTlVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9BVE1JTlVTKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRQQVIpICAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfQVRQQVIpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9BVFNJR04pICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8ICgobnVtICE9IE9QRVJBTkRfQVRTSUdOKSAmJiAobnVtICE9IE9QRVJBTkRfQVRQQVIpKSkpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgCi0JICAgICAgLyogVW5mb3J0dW5hdGx5LCBmb3IgdGhlIGluZGlyZWN0IG9wZXJhbmQgaW4gaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMKLQkJIGBgbGRiIHIxLCBAKGMscjE0KScnIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHBhc3NlZCBYX29wID09IE9fcmVnaXN0ZXIKLQkJIChiZWNhdXNlICdjJyBpcyBhIHZhbGlkIHJlZ2lzdGVyIG5hbWUpLiAgSG93ZXZlciB3ZSBjYW5ub3QganVzdAotCQkgaWdub3JlIHRoZSBjYXNlIHdoZW4gWF9vcCA9PSBPX3JlZ2lzdGVyIGJ1dCBmbGFncyAmIE9QRVJBTkRfUkVHIGlzCi0JCSBudWxsLCBzbyB3ZSBjaGVjayB0byBzZWUgaWYgYSBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVnaXN0ZXIKLQkJIGV4aXN0cy4gIElmIHRoZSBzeW1ib2wgZG9lcyBleGlzdCwgdGhlbiB0aGUgcGFyc2VyIHdhcyB1bmFibGUgdG8KLQkJIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgYW5kIHdlIGZpeCB0aGluZ3MgaGVyZS4gIChSZWY6IFBSMTQ4MjYpICovCi0JICAgICAgCi0JICAgICAgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX1JFRykgJiYgKFhfb3AgPT0gT19yZWdpc3RlcikpCi0JCXsKLQkJICBzeW1ib2xTICogc3ltOwotCQkgIAotCQkgIHN5bSA9IGZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyICgmIG15b3BzW2ldKTsKLQkJICAKLQkJICBpZiAoc3ltICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIG15b3BzIFtpXS5YX29wID09IFhfb3AgPT0gT19zeW1ib2w7Ci0JCSAgICAgIG15b3BzIFtpXS5YX2FkZF9zeW1ib2wgPSBzeW07Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkCi0JCSAgICAgIChfKCJpbGxlZ2FsIG9wZXJhbmQgLSByZWdpc3RlciBuYW1lIGZvdW5kIHdoZXJlIG5vbmUgZXhwZWN0ZWQiKSk7Ci0JCX0KLQkgICAgfQotCSAgCi0JICAvKiBXZSdyZSBvbmx5IGRvbmUgaWYgdGhlIG9wZXJhbmRzIG1hdGNoZWQgc28gZmFyIEFORCB0aGVyZQotCSAgICAgYXJlIG5vIG1vcmUgdG8gY2hlY2suICAqLwotCSAgaWYgKG1hdGNoICYmIG15b3BzW2ldLlhfb3AgPT0gMCkgCi0JICAgIGJyZWFrOwotCSAgZWxzZQotCSAgICBtYXRjaCA9IDA7Ci0KLQkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKLQkgIAotCSAgaWYgKG5leHRfb3Bjb2RlLT5vcGNvZGUgPT0gMCkgCi0JICAgIGJyZWFrOwotCSAgCi0JICBpZiAoc3RyY21wIChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQkgICAgYnJlYWs7Ci0JICAKLQkgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkgIAotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIG9wY29kZSBvciBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoYXQgYWxsIHJlZ2lzdGVycyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSBldmVuIGFyZS4gKi8KLSAgLyogQWxzbywgaWYgYW55IG9wZXJhbmRzIHdlcmUgbWFya2VkIGFzIHJlZ2lzdGVycywgYnV0IHdlcmUgcmVhbGx5IHN5bWJvbHMgKi8KLSAgLyogZml4IHRoYXQgaGVyZS4gKi8KLSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaV07IGkrKykgCi0gICAgewotICAgICAgaWYgKChkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgT1BFUkFORF9FVkVOKSAmJgotCSAgKG15b3BzW2ldLlhfYWRkX251bWJlciAmIDEpKSAKLQlhc19mYXRhbCAoXygiUmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgRVZFTiIpKTsKLSAgICAgIGlmIChteW9wc1tpXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgaWYgKCEoZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIE9QRVJBTkRfUkVHKSkgCi0JICAgIHsKLQkgICAgICBteW9wc1tpXS5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgbXlvcHNbaV0uWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNoYXIgKilteW9wc1tpXS5YX29wX3N5bWJvbCk7Ci0JICAgICAgbXlvcHNbaV0uWF9hZGRfbnVtYmVyID0gMDsKLQkgICAgICBteW9wc1tpXS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gb3Bjb2RlOwotfQotCi0vKiBpZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLCAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+Znhfb2Zmc2V0OwotCi0gIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQotICAgICBmaXhTICpmaXhwOwotICAgICBzZWdUIHNlYzsKLXsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopTlVMTCAmJiAoIVNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpIHx8Ci0gICAgICAoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IHNlYykpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICB2YWx1ZVQgKnZhbHVlcDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGNoYXIgKndoZXJlOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGxvbmcgdmFsdWU7Ci0gIGludCBvcF90eXBlOwotICBpbnQgbGVmdD0wOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgdmFsdWUgPSAqdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLSAJICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIG9wX3R5cGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gIGlmIChvcF90eXBlICYgMjA0OCkKLSAgICB7Ci0gICAgICBvcF90eXBlIC09IDIwNDg7Ci0gICAgICBpZiAob3BfdHlwZSAmIDEwMjQpCi0JewotCSAgb3BfdHlwZSAtPSAxMDI0OwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTDsKLQkgIGxlZnQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wX3R5cGUgJiA0MDk2KQotCXsKLQkgIG9wX3R5cGUgLT0gNDA5NjsKLQkgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMTBWXzE4OwotCX0KLSAgICAgIGVsc2UKLQlmaXhwLT5meF9yX3R5cGUgPSBnZXRfcmVsb2MoKHN0cnVjdCBkMTB2X29wZXJhbmQgKikmZDEwdl9vcGVyYW5kc1tvcF90eXBlXSk7IAotICAgIH0KLQotICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KLSAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gIGluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzE4OgotICAgICAgLyogaW5zdHJ1Y3Rpb24gYWRkcmVzc2VzIGFyZSBhbHdheXMgcmlnaHQtc2hpZnRlZCBieSAyICovCi0gICAgICB2YWx1ZSA+Pj0gQVRfV09SRF9SSUdIVF9TSElGVDsKLSAgICAgIGlmIChmaXhwLT5meF9zaXplID09IDIpCi0JYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGQxMHZfb3Bjb2RlICpyZXAsICpyZXBpOwotCi0JICByZXAgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopIGhhc2hfZmluZCAoZDEwdl9oYXNoLCAicmVwIik7Ci0JICByZXBpID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKSBoYXNoX2ZpbmQgKGQxMHZfaGFzaCwgInJlcGkiKTsKLQkgIGlmICgoaW5zbiAmIEZNMTEpID09IEZNMTEKLQkgICAgICAmJiAocmVwaSAhPSBOVUxMICYmIChpbnNuICYgcmVwaS0+bWFzaykgPT0gcmVwaS0+b3Bjb2RlCi0JCSAgfHwgcmVwICE9IE5VTEwgJiYgKGluc24gJiByZXAtPm1hc2spID09IHJlcC0+b3Bjb2RlKQotCSAgICAgICYmIHZhbHVlIDwgNCkKLQkgICAgYXNfZmF0YWwKLQkgICAgICAoXygibGluZSAlZDogcmVwIG9yIHJlcGkgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IDQgaW5zdHJ1Y3Rpb25zIiksCi0JICAgICAgIGZpeHAtPmZ4X2xpbmUpOwotCSAgaW5zbiA9IGQxMHZfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wX3R5cGUsIChvZmZzZXRUKXZhbHVlLCBsZWZ0LCBmaXhwKTsKLQkgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7ICAKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBiZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4cC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygibGluZSAlZDogdW5rbm93biByZWxvY2F0aW9uIHR5cGU6IDB4JXgiKSxmaXhwLT5meF9saW5lLGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogZDEwdl9jbGVhbnVwKCkgaXMgY2FsbGVkIGFmdGVyIHRoZSBhc3NlbWJsZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcgdGhlIGlucHV0IAotICAgZmlsZSBvciBhZnRlciBhIGxhYmVsIGlzIGRlZmluZWQuICBCZWNhdXNlIHRoZSBEMTBWIGFzc2VtYmxlciBzb21ldGltZXMgc2F2ZXMgc2hvcnQgCi0gICBpbnN0cnVjdGlvbnMgdG8gc2VlIGlmIGl0IGNhbiBwYWNrYWdlIHRoZW0gd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgdGhlcmUgbWF5Ci0gICBiZSBhIHNob3J0IGluc3RydWN0aW9uIHRoYXQgc3RpbGwgbmVlZHMgd3JpdHRlbi4gICovCi1pbnQKLWQxMHZfY2xlYW51cCAoKQotewotICBzZWdUIHNlZzsKLSAgc3Vic2VnVCBzdWJzZWc7Ci0KLSAgaWYgKHByZXZfb3Bjb2RlICYmIGV0eXBlID09IDApCi0gICAgewotICAgICAgc2VnID0gbm93X3NlZzsKLSAgICAgIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBpZiAocHJldl9zZWcpCi0Jc3Vic2VnX3NldCAocHJldl9zZWcsIHByZXZfc3Vic2VnKTsKLSAgICAgIHdyaXRlXzFfc2hvcnQgKHByZXZfb3Bjb2RlLCBwcmV2X2luc24sIGZpeHVwcy0+bmV4dCk7Ci0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgICBwcmV2X29wY29kZSA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotLyogTGlrZSBub3JtYWwgLndvcmQsIGV4Y2VwdCBzdXBwb3J0IEB3b3JkICovCi0vKiBjbG9iYmVycyBpbnB1dF9saW5lX3BvaW50ZXIsIGNoZWNrcyBlbmQtb2YtbGluZS4gKi8KLXN0YXRpYyB2b2lkCi1kMTB2X2RvdF93b3JkIChuYnl0ZXMpCi0gICAgIHJlZ2lzdGVyIGludCBuYnl0ZXM7CS8qIDE9LmJ5dGUsIDI9LndvcmQsIDQ9LmxvbmcgKi8KLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIGNoYXIgKnA7Ci0gIGludCBvZmZzZXQ7Ci0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBleHByZXNzaW9uICgmZXhwKTsKLSAgICAgIGlmICghc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkB3b3JkIiwgNSkpCi0JewotCSAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLQkKLQkgIHAgPSBmcmFnX21vcmUgKDIpOwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsIAotCQkgICAgICAgJmV4cCwgMCwgQkZEX1JFTE9DX0QxMFZfMTgpOwotCX0KLSAgICAgIGVsc2UKLQllbWl0X2V4cHIgKCZleHAsIDIpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotCi0vKiBNaXRzdWJpc2hpIGFza2VkIHRoYXQgd2Ugc3VwcG9ydCBzb21lIG9sZCBzeW50YXggdGhhdCBhcHBhcmVudGx5ICovCi0vKiBoYWQgaW1tZWRpYXRlIG9wZXJhbmRzIHN0YXJ0aW5nIHdpdGggJyMnLiAgVGhpcyBpcyBpbiBzb21lIG9mIHRoZWlyICovCi0vKiBzYW1wbGUgY29kZSBidXQgaXMgbm90IGRvY3VtZW50ZWQgKGFsdGhvdWdoIGl0IGFwcGVhcnMgaW4gc29tZSAgKi8KLS8qIGV4YW1wbGVzIGluIHRoZWlyIGFzc2VtYmxlciBtYW51YWwpLiBGb3Igbm93LCB3ZSdsbCBzb2x2ZSB0aGlzICovCi0vKiBjb21wYXRpYmlsaXR5IHByb2JsZW0gYnkgc2ltcGx5IGlnbm9yaW5nIGFueSAnIycgYXQgdGhlIGJlZ2lubmluZyAqLwotLyogb2YgYW4gb3BlcmFuZC4gKi8KLQotLyogb3BlcmFuZHMgdGhhdCBiZWdpbiB3aXRoICcjJyBzaG91bGQgZmFsbCB0aHJvdWdoIHRvIGhlcmUgKi8KLS8qIGZyb20gZXhwci5jICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycgJiYgISBkb19ub3RfaWdub3JlX2hhc2gpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi1ib29sZWFuCi1kMTB2X2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqZml4UDsKLXsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQotCi1pbnQKLWQxMHZfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZDEwdi5oIGIvZ2FzL2NvbmZpZy90Yy1kMTB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZmZkNWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiB0Yy1kMTB2LmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLWQxMHYuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfRDEwVgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIEQxMFYgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfZDEwdgotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWQxMHYiCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykgICAKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuCi0KLWludCBkMTB2X2NsZWFudXAgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9hZnRlcl9wYXNzX2hvb2soKQkgICAgIGQxMHZfY2xlYW51cCgpCi0jZGVmaW5lIG1kX2NsZWFudXAoKQkJICAgICBkMTB2X2NsZWFudXAoKQotI2RlZmluZSBtZF9kb19hbGlnbihhLGIsYyxkLGUpCSAgICAgZDEwdl9jbGVhbnVwKCkKLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIGRvIHtcCi0gIGQxMHZfY2xlYW51cCgpOyBcCi0gIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIGQxMHZfZml4X2FkanVzdGFibGUoZml4UCkKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSBkMTB2X2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKLWV4dGVybiBpbnQgZDEwdl9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWQzMHYuYyBiL2dhcy9jb25maWcvdGMtZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM1NDEyNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQzMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMzcgKzAsMCBAQAotLyogdGMtZDMwdi5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWl0c3ViaXNoaSBEMzBWCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL2QzMHYuaCIKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiT25OY0MiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQotI2lmIEhBVkVfTElNSVRTX0gKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotCi0jaWZuZGVmIENIQVJfQklUCi0jZGVmaW5lIENIQVJfQklUIDgKLSNlbmRpZgotCi0jZGVmaW5lIE5PUF9NVUxUSVBMWSAxCi0jZGVmaW5lIE5PUF9BTEwgMgotc3RhdGljIGludCB3YXJuX25vcHMgPSAwOwotc3RhdGljIGludCBPcHRpbWl6aW5nID0gMDsKLXN0YXRpYyBpbnQgd2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cyA9IDE7Ci0KLSNkZWZpbmUgRk9SQ0VfU0hPUlQJMQotI2RlZmluZSBGT1JDRV9MT05HCTIKLQotLyogRVhFQyB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gX2V4ZWNfdHlwZQotewotICBFWEVDX1VOS05PV04sCQkJLyogbm8gb3JkZXIgc3BlY2lmaWVkICovCi0gIEVYRUNfUEFSQUxMRUwsCQkvKiBkb25lIGluIHBhcmFsbGVsIChGTT0wMCkgKi8KLSAgRVhFQ19TRVEsCQkJLyogc2VxdWVudGlhbCAoRk09MDEpICovCi0gIEVYRUNfUkVWU0VRCQkJLyogcmV2ZXJzZSBzZXF1ZW50aWFsIChGTT0xMCkgKi8KLX0gZXhlY190eXBlX2VudW07Ci0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgZDMwdl9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGVyYW5kOwotICBpbnQgcGNyZWw7Ci0gIGludCBzaXplOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfZml4dXBzCi17Ci0gIGludCBmYzsKLSAgc3RydWN0IGQzMHZfZml4dXAgZml4W01BWF9JTlNOX0ZJWFVQU107Ci0gIHN0cnVjdCBfZml4dXBzICpuZXh0OwotfSBGaXh1cHM7Ci0KLXN0YXRpYyBGaXh1cHMgRml4VXBzWzJdOwotc3RhdGljIEZpeHVwcyAqZml4dXBzOwotCi0vKiBXaGV0aGVyIGN1cnJlbnQgYW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGFyZSB3b3JkIG11bHRpcGx5IGluc25zLiAgKi8KLXN0YXRpYyBpbnQgY3VyX211bDMyX3AgPSAwOwotc3RhdGljIGludCBwcmV2X211bDMyX3AgPSAwOwotCi0vKiAgVGhlIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCBpcyB0cnVlIGlmZiB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYXNzZW1ibGVkCi0gICAgaGFzIGJlZW4gZXhwbGljaXRseSB3cml0dGVuIGFzIGEgcGFyYWxsZWwgc2hvcnQtaW5zdHJ1Y3Rpb24gcGFpciBieSB0aGUKLSAgICBodW1hbiBwcm9ncmFtbWVyLiAgSXQgaXMgdXNlZCBpbiBwYXJhbGxlbF9vaygpIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgICB0aG9zZSBkYW5nZXJvdXMgcGFyYWxsZWxpemF0aW9ucyBhdHRlbXB0ZWQgYnkgdGhlIGh1bWFuLCB3aGljaCBhcmUgdG8gYmUKLSAgICBhbGxvd2VkLCBhbmQgdGhvc2UgYXR0ZW1wdGVkIGJ5IHRoZSBhc3NlbWJsZXIsIHdoaWNoIGFyZSBub3QuICBJdCBpcyBzZXQKLSAgICBmcm9tIG1kX2Fzc2VtYmxlKCkuICAqLwotc3RhdGljIGludCBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSAwOyAKLXN0YXRpYyBpbnQgZmxhZ194cF9zdGF0ZSA9IDA7Ci0KLS8qIFdoZXRoZXIgY3VycmVudCBhbmQgcHJldmlvdXMgbGVmdCBzdWItaW5zdHJ1Y3Rpb24gZGlzYWJsZXMKLSAgIGV4ZWN1dGlvbiBvZiByaWdodCBzdWItaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIGludCBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMDsKLXN0YXRpYyBpbnQgcHJldl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOwotCi0vKiBUaGUga25vd24gY3VycmVudCBhbGlnbm1lbnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50IGQzMHZfY3VycmVudF9hbGlnbjsKLXN0YXRpYyBzZWdUIGQzMHZfY3VycmVudF9hbGlnbl9zZWc7Ci0KLS8qIFRoZSBsYXN0IHNlZW4gbGFiZWwgaW4gdGhlIGN1cnJlbnQgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBhdXRvLWFsaWduCi0gICBsYWJlbHMgcHJlY2VlZGluZyBpbnN0cnVjdGlvbnMuICAqLwotc3RhdGljIHN5bWJvbFMgKmQzMHZfbGFzdF9sYWJlbDsKLQotLyogVHdvIG5vcHMgKi8KLSNkZWZpbmUgTk9QX0xFRlQgICAoKGxvbmcgbG9uZykgTk9QIDw8IDMyKQotI2RlZmluZSBOT1BfUklHSFQgICgobG9uZyBsb25nKSBOT1ApCi0jZGVmaW5lIE5PUDIgKEZNMDAgfCBOT1BfTEVGVCB8IE5PUF9SSUdIVCkKLQotLyogbG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci1zdGF0aWMgaW50IHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgaW50IGNoZWNrX3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7Ci1zdGF0aWMgaW50IHBvc3RmaXggUEFSQU1TICgoY2hhciAqcCkpOwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBnZXRfcmVsb2MgUEFSQU1TICgoc3RydWN0IGQzMHZfb3BlcmFuZCAqb3AsIGludCByZWxfZmxhZykpOwotc3RhdGljIGludCBnZXRfb3BlcmFuZHMgUEFSQU1TICgoZXhwcmVzc2lvblMgZXhwW10sIGludCBjbXBfaGFjaykpOwotc3RhdGljIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZmluZF9mb3JtYXQgUEFSQU1TICgoc3RydWN0IGQzMHZfb3Bjb2RlICpvcGNvZGUsIAotCQkJZXhwcmVzc2lvblMgb3BzW10saW50IGZzaXplLCBpbnQgY21wX2hhY2spKTsKLXN0YXRpYyBsb25nIGxvbmcgYnVpbGRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUsIGV4cHJlc3Npb25TICpvcGVycykpOwotc3RhdGljIHZvaWQgd3JpdGVfbG9uZyBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUsIGxvbmcgbG9uZyBpbnNuLCBGaXh1cHMgKmZ4KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV8xX3Nob3J0IFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwgbG9uZyBsb25nIGluc24sCi0JCQkJICAgRml4dXBzICpmeCwgaW50IHVzZV9zZXF1ZW50aWFsKSk7Ci1zdGF0aWMgaW50IHdyaXRlXzJfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMSwgbG9uZyBsb25nIGluc24xLCAKLQkJICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMiwgbG9uZyBsb25nIGluc24yLCBleGVjX3R5cGVfZW51bSBleGVjX3R5cGUsIEZpeHVwcyAqZngpKTsKLXN0YXRpYyBsb25nIGxvbmcgZG9fYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUsCi0JCQkJICAgICAgaW50IHNob3J0cCwgaW50IGlzX3BhcmFsbGVsKSk7Ci1zdGF0aWMgaW50IHBhcmFsbGVsX29rIFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTEsIHVuc2lnbmVkIGxvbmcgaW5zbjEsIAotCQkJCXN0cnVjdCBkMzB2X2luc24gKm9wY29kZTIsIHVuc2lnbmVkIGxvbmcgaW5zbjIsCi0JCQkJZXhlY190eXBlX2VudW0gZXhlY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X251bWJlcl90b19jaGFycyBQQVJBTVMgKChjaGFyICpidWYsIGxvbmcgbG9uZyB2YWx1ZSwgaW50IG5ieXRlcykpOwotc3RhdGljIHZvaWQgY2hlY2tfc2l6ZSBQQVJBTVMgKChsb25nIHZhbHVlLCBpbnQgYml0cywgY2hhciAqZmlsZSwgaW50IGxpbmUpKTsKLXN0YXRpYyB2b2lkIGQzMHZfYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgc19kMzB2X2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kMzB2X3RleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2QzMHZfZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZDMwdl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7ICAgICAgIAotCi0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndvcmQiLCBjb25zLCA0IH0sCi0gIHsgImh3b3JkIiwgY29ucywgMiB9LAotICB7ICJhbGlnbiIsIHNfZDMwdl9hbGlnbiwgMCB9LAotICB7ICJ0ZXh0Iiwgc19kMzB2X3RleHQsIDAgfSwKLSAgeyAiZGF0YSIsIHNfZDMwdl9kYXRhLCAwIH0sCi0gIHsgInNlY3Rpb24iLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0aW9uLnMiLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0Iiwgc19kMzB2X3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdC5zIiwgc19kMzB2X3NlY3Rpb24sIDAgfSwKLSAgeyBOVUxMLCBOVUxMLCAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpkMzB2X2hhc2g7Ci0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgcHJlX2RlZmluZWRfcmVnaXN0ZXJzCi0gICBhcnJheSB0byBzZWUgaWYgIm5hbWUiIGlzIGEgdmFsaWQgcmVnaXRlciBuYW1lLiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIKLSAgIG51bWJlciBmcm9tIHRoZSBhcnJheSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLiAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gcmVnX25hbWVfY250ICgpIC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzeW1ib2xfZmluZCAobmFtZSkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICh3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzKQotCQlhc193YXJuIChfKCJSZWdpc3RlciBuYW1lICVzIGNvbmZsaWN0cyB3aXRoIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lIiksCi0JCQkgbmFtZSk7Ci0JICAgIH0KLSAgCi0JICByZXR1cm4gcHJlX2RlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0udmFsdWU7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgCi0gIHJldHVybiAtMTsKLX0KLQotLyogcmVnaXN0ZXJfbmFtZSgpIGNoZWNrcyB0aGUgc3RyaW5nIGF0IGlucHV0X2xpbmVfcG9pbnRlcgotICAgdG8gc2VlIGlmIGl0IGlzIGEgdmFsaWQgcmVnaXN0ZXIgbmFtZS4gICovCi0KLXN0YXRpYyBpbnQKLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyIGMsICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgd2hpbGUgKCpwICYmICpwIT0nXG4nICYmICpwIT0nXHInICYmICpwICE9JywnICYmICpwIT0nICcgJiYgKnAhPScpJykKLSAgICBwKys7Ci0KLSAgYyA9ICpwOwotICBpZiAoYykKLSAgICAqcCsrID0gMDsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChpbnB1dF9saW5lX3BvaW50ZXIpOwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICAvKiB0ZW1wb3JhcmlseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBoZXJlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSAoc3ltYm9sUyAqKWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGMpCi0gICAgKihwLTEpID0gYzsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotY2hlY2tfcmFuZ2UgKG51bSwgYml0cywgZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtOwotICAgICBpbnQgYml0czsKLSAgICAgaW50IGZsYWdzOwotewotICBsb25nIG1pbiwgbWF4OwotICBpbnQgcmV0dmFsPTA7Ci0KLSAgLyogZG9uJ3QgYm90aGVyIGNoZWNraW5nIDMyLWJpdCB2YWx1ZXMgKi8KLSAgaWYgKGJpdHMgPT0gMzIgJiYgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQgPT0gMzIpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogU2lnbiBleHRlbmQgc2lnbmVkIHZhbHVlcyB0byB1bnNpZ25lZCBsb25nICovCi0gIGlmICgoZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkgJiYgKG51bSAmICgodW5zaWduZWQgbG9uZykxIDw8IChiaXRzIC0gMSkpKSkKLSAgICBudW0gfD0gKChsb25nKS0xIDw8IChiaXRzIC0gMSkpOwotCi0gIGlmIChmbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0gICAgewotICAgICAgLyogV2Uga25vdyB0aGF0IGFsbCBzaGlmdHMgYXJlIHJpZ2h0IGJ5IHRocmVlIGJpdHMuLi4uICovCi0gICAgICAKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotCW51bSA9ICh1bnNpZ25lZCBsb25nKSAoIChsb25nKSBudW0gPj0gMCkgCi0JCT8gKCAoKGxvbmcpIG51bSkgPj4gMyApCi0JCTogKCAobnVtID4+IDMpIHwgKCh1bnNpZ25lZCBsb25nKS0xIDw8ICgzMiAtIDMpKSApOwotICAgICAgZWxzZQotCW51bSA+Pj0gMzsKLSAgICB9Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0gICAgewotICAgICAgbWF4ID0gKCh1bnNpZ25lZCBsb25nKTEgPDwgKGJpdHMgLSAxKSkgLSAxOyAKLSAgICAgIG1pbiA9IC0gKCh1bnNpZ25lZCBsb25nKTEgPDwgKGJpdHMgLSAxKSk7Ci0gICAgICBpZiAoKChsb25nKW51bSA+IG1heCkgfHwgKChsb25nKW51bSA8IG1pbikpCi0JcmV0dmFsID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtYXggPSAoKHVuc2lnbmVkIGxvbmcpMSA8PCBiaXRzKSAtIDE7Ci0gICAgICBtaW4gPSAwOwotICAgICAgaWYgKChudW0gPiBtYXgpIHx8IChudW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICAKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbkQzMFYgb3B0aW9uczpcblwKLS1PICAgICAgICAgICAgICAgICAgICAgIE1ha2UgYWRqYWNlbnQgc2hvcnQgaW5zdHJ1Y3Rpb25zIHBhcmFsbGVsIGlmIHBvc3NpYmxlLlxuXAotLW4gICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBhbGwgTk9QcyBpbnNlcnRlZCBieSB0aGUgYXNzZW1ibGVyLlxuXAotLU4JCQlXYXJuIGFib3V0IE5PUHMgaW5zZXJ0ZWQgYWZ0ZXIgd29yZCBtdWx0aXBsaWVzLlxuXAotLWMgICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBzeW1ib2xzIHdob2VzIG5hbWVzIG1hdGNoIHJlZ2lzdGVyIG5hbWVzLlxuXAotLUMgICAgICAgICAgICAgICAgICAgICAgT3Bwb3NpdGUgb2YgLUMuICAtYyBpcyB0aGUgZGVmYXVsdC5cbiIpKTsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICAgIC8qIE9wdGltaXplLiBXaWxsIGF0dGVtcHQgdG8gcGFyYWxsZWxpemUgb3BlcmF0aW9ucyAqLwotICAgIGNhc2UgJ08nOgotICAgICAgT3B0aW1pemluZyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2FybiBhYm91dCBhbGwgTk9QUyB0aGF0IHRoZSBhc3NlbWJsZXIgaW5zZXJ0cy4gICovCi0gICAgY2FzZSAnbic6Ci0gICAgICB3YXJuX25vcHMgPSBOT1BfQUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgdGhlIE5PUFMgdGhhdCB0aGUgYXNzZW1ibGVyIGluc2VydHMgYmVjYXVzZSBvZiB0aGUKLQkgbXVsdGlwbHkgaGF6YXJkLiAgKi8KLSAgICBjYXNlICdOJzoKLSAgICAgIHdhcm5fbm9wcyA9IE5PUF9NVUxUSVBMWTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYyc6Ci0gICAgICB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0gIAotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgCi0gICpzaXplUCA9IHByZWMgKiAyOwotICAKLSAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqIG9wY29kZTsKLSAgZDMwdl9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IG9wY29kZSBuYW1lcyBpbnRvIGEgaGFzaCB0YWJsZS4gKi8KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IGQzMHZfb3Bjb2RlICopZDMwdl9vcGNvZGVfdGFibGU7IG9wY29kZS0+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+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQkgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAotCSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiAoRkxBR19KTVAgfCBGTEFHX0pTUikKLQkJJiYgKChvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfREVMQVkpID09IDApCi0JCSYmICgob3Bjb2RlMS0+ZWNjID09IEVDQ19BTCkgfHwgISBPcHRpbWl6aW5nKSkKLQkgICAgICAgfHwgb3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiBGTEFHX1JQKQotCXsKLQkgIC8qIFdlIG11c3QgZW1pdCAobm9uLWRlbGF5ZWQpIGJyYW5jaCB0eXBlIGluc3RydWN0aW9ucwotCSAgICAgb24gdGhlaXIgb3duIHdpdGggbm90aGluZyBpbiB0aGUgcmlnaHQgY29udGFpbmVyLiAgKi8KLQkgIC8qIFdlIG11c3QgdHJlYXQgcmVwZWF0IGluc3RydWN0aW9ucyBsaWtld2lzZSwgc2luY2UgdGhlCi0JICAgICBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gaGFzIHRvIGJlIHNlcGFyYXRlIGZyb20gdGhlIHJlcGVhdAotCSAgICAgaW4gb3JkZXIgdG8gYmUgcmVwZWF0ZWQuICAqLwotCSAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0LCBmYWxzZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCkKLQl7Ci0JICAvKiBUaGUgbGVmdCBpbnN0cnVjdGlvbiBraWxzIHRoZSByaWdodCBzbG90LCBzbyB3ZQotCSAgICAgbXVzdCBsZWF2ZSBpdCBlbXB0eS4gICovCi0JICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQsIGZhbHNlKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IElVCi0JICAgICAgIHx8IChvcGNvZGUxLT5vcC0+dW5pdCA9PSBFSVRIRVIKLQkJICAgJiYgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpKQotCXsKLQkgIC8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7Ci0JICBleGVjX3R5cGUgPSBFWEVDX1JFVlNFUTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogc2VxdWVudGlhbCAqLwotCSAgaW5zbiA9IEZNMDEgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7Ci0JICBmeCA9IGZ4LT5uZXh0OwotCSAgZXhlY190eXBlID0gRVhFQ19TRVE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVYRUNfUEFSQUxMRUw6CS8qIHBhcmFsbGVsICovCi0gICAgICBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSBmbGFnX3hwX3N0YXRlOwotICAgICAgaWYgKCEgcGFyYWxsZWxfb2sgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlKSkKLQlhc19iYWQgKF8oIkluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotICAgICAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUpCi0JewotCSAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IElVKQotCSAgICBhc19iYWQgKF8oIlR3byBJVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLQkgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotIAkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTItPm9wLT51bml0ID09IE1VKQotCXsKLQkgIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBNVSkKLQkgICAgYXNfYmFkIChfKCJUd28gTVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0JICBlbHNlIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQkgICAgYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUxLT5vcC0+bmFtZSk7Ci0JICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLQkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JICAgIGFzX3dhcm4gKF8oIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiKSwgb3Bjb2RlMi0+b3AtPm5hbWUpOwotCSAgCi0JICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAotCSAgZnggPSBmeC0+bmV4dDsKLQl9Ci0gICAgICBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVYRUNfU0VROgkvKiBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUpCi0JYXNfYmFkIChfKCJJVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSBsZWZ0IGNvbnRhaW5lciIpKTsKLSAgICAgIGlmIChwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCkKLQlhc19iYWQgKF8oInNwZWNpYWwgbGVmdCBpbnN0cnVjdGlvbiBgJXMnIGtpbGxzIGluc3RydWN0aW9uICIKLQkJICAgImAlcycgaW4gcmlnaHQgY29udGFpbmVyIiksCi0JCSBvcGNvZGUxLT5vcC0+bmFtZSwgb3Bjb2RlMi0+b3AtPm5hbWUpOwotICAgICAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCWFzX3dhcm4gKF8oIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiKSwgb3Bjb2RlMi0+b3AtPm5hbWUpOwotICAgICAgaW5zbiA9IEZNMDEgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVhFQ19SRVZTRVE6CS8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotICAgICAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IE1VKQotCWFzX2JhZCAoXygiTVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgcmlnaHQgY29udGFpbmVyIikpOwotICAgICAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCWFzX3dhcm4gKF8oIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiKSwgb3Bjb2RlMi0+b3AtPm5hbWUpOwotICAgICAgaW5zbiA9IEZNMTAgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBleGVjdXRpb24gdHlwZSBwYXNzZWQgdG8gd3JpdGVfMl9zaG9ydCgpIikpOwotICAgIH0KLQotICAvKiAgcHJpbnRmICgid3JpdGluZyBvdXQgJWxseFxuIixpbnNuKTsgKi8KLSAgZiA9IGZyYWdfbW9yZSAoOCk7Ci0gIGQzMHZfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA4KTsKLQotICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGEgMzItYml0IG11bHRpcGx5IGJ1dCBpdCBpcyBwdXQgaW50byBhCi0gICAgIHBhcmFsbGVsIGNvbnRhaW5lciwgbWFyayB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBhcyBiZWluZyBhIDMyLWJpdAotICAgICBtdWx0aXBseS4gICovCi0gIGlmIChwcmV2X211bDMyX3AgJiYgZXhlY190eXBlID09IEVYRUNfUEFSQUxMRUwpCi0gICAgY3VyX211bDMyX3AgPSAxOwotCi0gIGZvciAoaj0wOyBqPDI7IGorKykgCi0gICAgewotICAgICAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0JewotCSAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JICAgIHsKLQkgICAgICB3aGVyZSA9IChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpICsgNCpqOwotCi0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgd2hlcmUsIAotCQkJICAgZngtPmZpeFtpXS5zaXplLAotCQkJICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCQkgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkJICAgZngtPmZpeFtpXS5yZWxvYyk7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIGZ4LT5mYyA9IDA7Ci0gICAgICBmeCA9IGZ4LT5uZXh0OwotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi0KLS8qIENoZWNrIDIgaW5zdHJ1Y3Rpb25zIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBjYW4gYmUgc2FmZWx5ICovCi0vKiBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIFJldHVybnMgMSBpZiB0aGV5IGNhbiBiZS4gICAgICAgICAqLwotc3RhdGljIGludAotcGFyYWxsZWxfb2sgKG9wMSwgaW5zbjEsIG9wMiwgaW5zbjIsIGV4ZWNfdHlwZSkKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3AxLCAqb3AyOwotICAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLSAgICAgZXhlY190eXBlX2VudW0gZXhlY190eXBlOwotewotICBpbnQgaSwgaiwgc2hpZnQsIHJlZ25vLCBiaXRzLCBlY2M7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIG1hc2ssIGZsYWdzX3NldDEsIGZsYWdzX3NldDIsIGZsYWdzX3VzZWQxLCBmbGFnc191c2VkMjsKLSAgdW5zaWduZWQgbG9uZyBpbnMsIG1vZF9yZWdbMl1bM10sIHVzZWRfcmVnWzJdWzNdLCBmbGFnX3JlZ1syXTsKLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmOwotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wOwotCi0gIC8qIHNlY3Rpb24gNC4zOiBib3RoIGluc3RydWN0aW9ucyBtdXN0IG5vdCBiZSBJVSBvciBNVSBvbmx5ICovCi0gIGlmICgob3AxLT5vcC0+dW5pdCA9PSBJVSAmJiBvcDItPm9wLT51bml0ID09IElVKQotICAgICAgfHwgKG9wMS0+b3AtPnVuaXQgPT0gTVUgJiYgb3AyLT5vcC0+dW5pdCA9PSBNVSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogZmlyc3QgaW5zdHJ1Y3Rpb24gbXVzdCBub3QgYmUgYSBqdW1wIHRvIHNhZmVseSBvcHRpbWl6ZSwgdW5sZXNzIHRoaXMKLSAgICAgaXMgYW4gZXhwbGljaXQgcGFyYWxsZWwgb3BlcmF0aW9uLiAgKi8KLSAgaWYgKGV4ZWNfdHlwZSAhPSBFWEVDX1BBUkFMTEVMCi0gICAgICAmJiAob3AxLT5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX0pNUCB8IEZMQUdfSlNSKSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogSWYgb25lIGluc3RydWN0aW9uIGlzIC9UWCBvciAvWFQgYW5kIHRoZSBvdGhlciBpcyAvRlggb3IgL1hGIHJlc3BlY3RpdmVseSwKLSAgICAgdGhlbiBpdCBpcyBzYWZlIHRvIGFsbG93IHRoZSB0d28gdG8gYmUgZG9uZSBhcyBwYXJhbGxlbCBvcHMsIHNpbmNlIG9ubHkKLSAgICAgb25lIHdpbGwgZXZlciBiZSBleGVjdXRlZCBhdCBhIHRpbWUuICAqLwotICBpZiAoKG9wMS0+ZWNjID09IEVDQ19UWCAmJiBvcDItPmVjYyA9PSBFQ0NfRlgpCi0gICAgICB8fCAob3AxLT5lY2MgPT0gRUNDX0ZYICYmIG9wMi0+ZWNjID09IEVDQ19UWCkKLSAgICAgIHx8IChvcDEtPmVjYyA9PSBFQ0NfWFQgJiYgb3AyLT5lY2MgPT0gRUNDX1hGKQotICAgICAgfHwgKG9wMS0+ZWNjID09IEVDQ19YRiAmJiBvcDItPmVjYyA9PSBFQ0NfWFQpKQotICAgICByZXR1cm4gMTsKLQotICAvKiBbMF0gcjAtcjMxCi0gICAgIFsxXSByMzItcjYzCi0gICAgIFsyXSBhMCwgYTEsIGZsYWcgcmVnaXN0ZXJzICovCi0KLSAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICB7Ci0gICAgICBpZiAoaiA9PSAwKQotCXsKLQkgIGYgPSBvcDEtPmZvcm07Ci0JICBvcCA9IG9wMS0+b3A7Ci0JICBlY2MgPSBvcDEtPmVjYzsKLQkgIGlucyA9IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmID0gb3AyLT5mb3JtOwotCSAgb3AgPSBvcDItPm9wOwotCSAgZWNjID0gb3AyLT5lY2M7Ci0JICBpbnMgPSBpbnNuMjsKLQl9Ci0gICAgICBmbGFnX3JlZ1tqXSA9IDA7Ci0gICAgICBtb2RfcmVnW2pdWzBdID0gbW9kX3JlZ1tqXVsxXSA9IDA7Ci0gICAgICB1c2VkX3JlZ1tqXVswXSA9IHVzZWRfcmVnW2pdWzFdID0gMDsKLQotICAgICAgaWYgKGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCkKLQl7Ci0JICAvKiBGb3IgaHVtYW4gc3BlY2lmaWVkIHBhcmFsbGVsIGluc3RydWN0aW9ucyB3ZSBoYXZlIGJlZW4gYXNrZWQKLQkgICAgIHRvIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgdGhhdCBib3RoIGluc3RydWN0aW9ucyBjb3VsZCBtb2RpZnkKLQkgICAgIGJpdHMgaW4gdGhlIFBTVywgc28gd2UgaW5pdGlhbGlzZSB0aGUgbW9kICYgdXNlZCBhcnJheXMgdG8gMC4KLQkgICAgIFdlIGhhdmUgYmVlbiBhc2tlZCwgaG93ZXZlciwgdG8gcmVmdXNlIHRvIGFsbG93IHBhcmFsbGVsCi0JICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggZXhwbGljaXRseSBzZXQgdGhlIHNhbWUgZmxhZyByZWdpc3RlciwKLQkgICAgIGVnICJjbXBuZSBmMCxyMSwweDEwIHx8IGNtcGVxIGYwLCByNSwgMHgyIiwgc28gZnVydGhlciBvbiB3ZSB0ZXN0Ci0JICAgICBmb3IgdGhlIHVzZSBvZiBhIGZsYWcgcmVnaXN0ZXIgYW5kIHNldCBhIGJpdCBpbiB0aGUgbW9kIG9yIHVzZWQKLQkgICAgIGFycmF5IGFwcHJvcHJpYXRlbHkuICAqLwotCSAgICAgCi0JICBtb2RfcmVnW2pdWzJdICA9IDA7Ci0JICB1c2VkX3JlZ1tqXVsyXSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1vZF9yZWdbal1bMl0gPSAob3AtPmZsYWdzX3NldCAmIEZMQUdfQUxMKTsKLQkgIHVzZWRfcmVnW2pdWzJdID0gKG9wLT5mbGFnc191c2VkICYgRkxBR19BTEwpOwotCX0KLSAgICAgIAotICAgICAgLyogQlNSL0pTUiBhbHdheXMgc2V0cyBSNjIgKi8KLSAgICAgIGlmIChvcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfSlNSKQotCW1vZF9yZWdbal1bMV0gPSAoMUwgPDwgKDYyLTMyKSk7Ci0KLSAgICAgIC8qIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBhZmZlY3RzIHRoZSBmbGFnc191c2VkICovCi0gICAgICBzd2l0Y2ggKGVjYykKLQl7Ci0JY2FzZSBFQ0NfVFg6Ci0JY2FzZSBFQ0NfRlg6Ci0JICB1c2VkX3JlZ1tqXVsyXSB8PSBmbGFnX3JlZ1tqXSA9IEZMQUdfMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFQ0NfWFQ6Ci0JY2FzZSBFQ0NfWEY6Ci0JICB1c2VkX3JlZ1tqXVsyXSB8PSBmbGFnX3JlZ1tqXSA9IEZMQUdfMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFQ0NfVFQ6Ci0JY2FzZSBFQ0NfVEY6Ci0JICB1c2VkX3JlZ1tqXVsyXSB8PSBmbGFnX3JlZ1tqXSA9IChGTEFHXzAgfCBGTEFHXzEpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmb3IgKGkgPSAwOyBmLT5vcGVyYW5kc1tpXTsgaSsrKQotCXsKLQkgIGZsYWdzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgIHNoaWZ0ID0gMTIgLSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaV1dLnBvc2l0aW9uOwotCSAgYml0cyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpXV0uYml0czsKLQkgIGlmIChiaXRzID09IDMyKQotCSAgICBtYXNrID0gMHhmZmZmZmZmZjsKLQkgIGVsc2UKLQkgICAgbWFzayA9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7Ci0KLQkgIGlmICgoZmxhZ3MgJiBPUEVSQU5EX1BMVVMpIHx8IChmbGFncyAmIE9QRVJBTkRfTUlOVVMpKQotCSAgICB7Ci0JICAgICAgLyogdGhpcyBpcyBhIHBvc3QtaW5jcmVtZW50IG9yIHBvc3QtZGVjcmVtZW50ICovCi0JICAgICAgLyogdGhlIHByZXZpb3VzIHJlZ2lzdGVyIG5lZWRzIHRvIGJlIG1hcmtlZCBhcyBtb2RpZmllZCAqLwotCi0JICAgICAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpLTFdXS5wb3NpdGlvbjsKLQkgICAgICByZWdubyA9IChpbnMgPj4gc2hpZnQpICYgMHgzZjsKLQkgICAgICBpZiAocmVnbm8gPj0gMzIpCi0JCW1vZF9yZWdbal1bMV0gfD0gMUwgPDwgKHJlZ25vIC0gMzIpOwotCSAgICAgIGVsc2UKLQkJbW9kX3JlZ1tqXVswXSB8PSAxTCA8PCByZWdubzsKLQkgICAgfQotCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkgICAgewotCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiBtYXNrOwotCSAgICAgIC8qIHRoZSBtZW1vcnkgd3JpdGUgZnVuY3Rpb25zIGRvbid0IGhhdmUgYSBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCSAgICAgIGlmICgoZmxhZ3MgJiBPUEVSQU5EX0RFU1QpICYmICEob3AtPmZsYWdzX3NldCAmIEZMQUdfTUVNKSkKLQkJewotCQkgIC8qIE1PRElGSUVEIHJlZ2lzdGVycyBhbmQgZmxhZ3MgKi8KLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FDQykKLQkJICAgIHsKLQkJICAgICAgaWYgKHJlZ25vID09IDApCi0JCQltb2RfcmVnW2pdWzJdIHw9IEZMQUdfQTA7Ci0JCSAgICAgIGVsc2UgaWYgKHJlZ25vID09IDEpCi0JCQltb2RfcmVnW2pdWzJdIHw9IEZMQUdfQTE7Ci0JCSAgICAgIGVsc2UKLQkJCWFib3J0ICgpOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9GTEFHKQotCQkgICAgbW9kX3JlZ1tqXVsyXSB8PSAxTCA8PCByZWdubzsKLQkJICBlbHNlIGlmICghKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKSkKLQkJICAgIHsKLQkJICAgICAgaW50IHIsIHo7Ci0KLQkJICAgICAgLyogbmVlZCB0byBjaGVjayBpZiB0aGVyZSBhcmUgdHdvIGRlc3RpbmF0aW9uICovCi0JCSAgICAgIC8qIHJlZ2lzdGVycywgZm9yIGV4YW1wbGUgbGQydyAqLwotCQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EXzJSRUcpCi0JCQl6ID0gMTsKLQkJICAgICAgZWxzZQotCQkJeiA9IDA7Ci0KLQkJICAgICAgZm9yIChyID0gcmVnbm87IHIgPD0gcmVnbm8gKyB6OyByKyspCi0JCQl7IAotCQkJICBpZiAociA+PSAzMikKLQkJCSAgICBtb2RfcmVnW2pdWzFdIHw9IDFMIDw8IChyIC0gMzIpOwotCQkJICBlbHNlCi0JCQkgICAgbW9kX3JlZ1tqXVswXSB8PSAxTCA8PCByOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVVNFRCwgYnV0IG5vdCBtb2RpZmllZCByZWdpc3RlcnMgYW5kIGZsYWdzICovCi0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9BQ0MpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChyZWdubyA9PSAwKQotCQkJdXNlZF9yZWdbal1bMl0gfD0gRkxBR19BMDsKLQkJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gMSkKLQkJCXVzZWRfcmVnW2pdWzJdIHw9IEZMQUdfQTE7Ci0JCSAgICAgIGVsc2UKLQkJCWFib3J0ICgpOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9GTEFHKQotCQkgICAgdXNlZF9yZWdbal1bMl0gfD0gMUwgPDwgcmVnbm87Ci0JCSAgZWxzZSBpZiAoIShmbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkpCi0JCSAgICB7Ci0JCSAgICAgIGludCByLCB6OwotCi0JCSAgICAgIC8qIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHR3byBzb3VyY2UgKi8KLQkJICAgICAgLyogcmVnaXN0ZXJzLCBmb3IgZXhhbXBsZSBzdDJ3ICovCi0JCSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfMlJFRykKLQkJCXogPSAxOwotCQkgICAgICBlbHNlCi0JCQl6ID0gMDsKLQotCQkgICAgICBmb3IgKHIgPSByZWdubzsgciA8PSByZWdubyArIHo7IHIrKykKLQkJCXsgCi0JCQkgIGlmIChyID49IDMyKQotCQkJICAgIHVzZWRfcmVnW2pdWzFdIHw9IDFMIDw8IChyIC0gMzIpOwotCQkJICBlbHNlCi0JCQkgICAgdXNlZF9yZWdbal1bMF0gfD0gMUwgPDwgcjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIGZsYWdzX3NldDEgPSBvcDEtPm9wLT5mbGFnc19zZXQ7Ci0gIGZsYWdzX3NldDIgPSBvcDItPm9wLT5mbGFnc19zZXQ7Ci0gIGZsYWdzX3VzZWQxID0gb3AxLT5vcC0+ZmxhZ3NfdXNlZDsKLSAgZmxhZ3NfdXNlZDIgPSBvcDItPm9wLT5mbGFnc191c2VkOwotCi0gIC8qIFNUMlcvU1Q0SEIgY29tYmluZWQgd2l0aCBBRERwcHAvU1VCcHBwIGlzIGlsbGVnYWwuICAqLwotICBpZiAoKChmbGFnc19zZXQxICYgKEZMQUdfTUVNIHwgRkxBR18yV09SRCkpID09IChGTEFHX01FTSB8IEZMQUdfMldPUkQpCi0gICAgICAgJiYgKGZsYWdzX3VzZWQyICYgRkxBR19BRERTVUJwcHApICE9IDApCi0gICAgICB8fCAoKGZsYWdzX3NldDIgJiAoRkxBR19NRU0gfCBGTEFHXzJXT1JEKSkgPT0gKEZMQUdfTUVNIHwgRkxBR18yV09SRCkKLQkgICYmIChmbGFnc191c2VkMSAmIEZMQUdfQUREU1VCcHBwKSAhPSAwKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBMb2FkIGluc3RydWN0aW9uIGNvbWJpbmVkIHdpdGggaGFsZi13b3JkIG11bHRpcGx5IGlzIGlsbGVnYWwuICAqLwotICBpZiAoKChmbGFnc191c2VkMSAmIEZMQUdfTUVNKSAhPSAwICYmIChmbGFnc191c2VkMiAmIEZMQUdfTVVMMTYpKQotICAgICAgfHwgKChmbGFnc191c2VkMiAmIEZMQUdfTUVNKSAhPSAwICYmIChmbGFnc191c2VkMSAmIEZMQUdfTVVMMTYpKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTcGVjaWZpY2FsbHkgYWxsb3cgYWRkIHx8IGFkZCBieSByZW1vdmluZyBjYXJyeSwgb3ZlcmZsb3cgYml0cyBkZXBlbmRlbmN5LgotICAgICBUaGlzIGlzIHNhZmUsIGV2ZW4gaWYgYW4gYWRkYyBmb2xsb3dzIHNpbmNlIHRoZSBJVSB0YWtlcyB0aGUgYXJndW1lbnQgaW4KLSAgICAgdGhlIHJpZ2h0IGNvbnRhaW5lciwgYW5kIGl0IHdyaXRlcyBpdHMgcmVzdWx0cyBsYXN0LgotICAgICBIb3dldmVyLCBkb24ndCBwYXJhbGVsbGl6ZSBhZGQgZm9sbG93ZWQgYnkgYWRkYyBvciBzdWIgZm9sbG93ZWQgYnkKLSAgICAgc3ViYi4gICovCi0KLSAgaWYgKG1vZF9yZWdbMF1bMl0gPT0gRkxBR19DVlZBICYmIG1vZF9yZWdbMV1bMl0gPT0gRkxBR19DVlZBCi0gICAgICAmJiAodXNlZF9yZWdbMF1bMl0gJiB+ZmxhZ19yZWdbMF0pID09IDAKLSAgICAgICYmICh1c2VkX3JlZ1sxXVsyXSAmIH5mbGFnX3JlZ1sxXSkgPT0gMAotICAgICAgJiYgb3AxLT5vcC0+dW5pdCA9PSBFSVRIRVIgJiYgb3AyLT5vcC0+dW5pdCA9PSBFSVRIRVIpCi0gICAgewotICAgICAgbW9kX3JlZ1swXVsyXSA9IG1vZF9yZWdbMV1bMl0gPSAwOwotICAgIH0KLQotICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gZGVwZW5kcyBvbiB0aGUgZmlyc3QsIHdlIG9idmlvdXNseQotCSBjYW5ub3QgcGFyYWxsZWxpemUuICBOb3RlLCB0aGUgbW9kIGZsYWcgaW1wbGllcyB1c2UsIHNvCi0JIGNoZWNrIHRoYXQgYXMgd2VsbC4gICovCi0gICAgICAvKiBJZiBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgaXMgc2V0LCB0aGVuIHRoZSBjYXNlIG9mIHRoZSAKLQkgc2Vjb25kIGluc3RydWN0aW9uIHVzaW5nIGEgcmVnaXN0ZXIgdGhlIGZpcnN0IGluc3RydWN0aW9uCi0JIG1vZGlmaWVzIGlzIGFzc3VtZWQgdG8gYmUgb2theTsgd2UgdHJ1c3QgdGhlIGh1bWFuLiAgV2UKLQkgZG9uJ3QgdHJ1c3QgdGhlIGh1bWFuIGlmIGJvdGggaW5zdHJ1Y3Rpb25zIG1vZGlmeSB0aGUgc2FtZQotCSByZWdpc3RlciBidXQgd2UgZG8gdHJ1c3QgdGhlIGh1bWFuIGlmIHRoZXkgbW9kaWZ5IHRoZSBzYW1lCi0JIGZsYWdzLiAqLwotICAgICAgLyogV2UgaGF2ZSBub3cgYmVlbiByZXF1ZXN0ZWQgbm90IHRvIHRydXN0IHRoZSBodW1hbiBpZiB0aGUKLQkgaW5zdHJ1Y3Rpb25zIG1vZGlmeSB0aGUgc2FtZSBmbGFnIHJlZ2lzdGVycyBlaXRoZXIuICAqLwotICAgICAgaWYgKGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCkKLQl7Ci0JICBpZiAoKG1vZF9yZWdbMF1bal0gJiBtb2RfcmVnWzFdW2pdKSAhPSAwKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIGlmICgobW9kX3JlZ1swXVtqXSAmIChtb2RfcmVnWzFdW2pdIHwgdXNlZF9yZWdbMV1bal0pKSAhPSAwKQotCSAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLS8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBzdHIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUtZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyAKLSAgIGl0IGFzc2VtYmxlcyB0by4gIEZvciB0aGUgRDMwViwgaXQgbW9zdGx5IGhhbmRsZXMgdGhlIHNwZWNpYWwgVkxJVyBwYXJzaW5nIGFuZCBwYWNraW5nCi0gICBhbmQgbGVhdmVzIHRoZSBkaWZmaWN1bHQgc3R1ZmYgdG8gZG9fYXNzZW1ibGUoKS4gICovCi0KLXN0YXRpYyBsb25nIGxvbmcgcHJldl9pbnNuID0gLTE7Ci1zdGF0aWMgc3RydWN0IGQzMHZfaW5zbiBwcmV2X29wY29kZTsKLXN0YXRpYyBzdWJzZWdUIHByZXZfc3Vic2VnOwotc3RhdGljIHNlZ1QgcHJldl9zZWcgPSAwOwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHN0cnVjdCBkMzB2X2luc24gb3Bjb2RlOwotICBsb25nIGxvbmcgaW5zbjsKLSAgZXhlY190eXBlX2VudW0gZXh0eXBlID0gRVhFQ19VTktOT1dOOwkJLyogZXhlY3V0aW9uIHR5cGU7IHBhcmFsbGVsLCBldGMgKi8KLSAgc3RhdGljIGV4ZWNfdHlwZV9lbnVtIGV0eXBlID0gRVhFQ19VTktOT1dOOwkvKiBzYXZlZCBleHR5cGUuICB1c2VkIGZvciBtdWx0aWxpbmUgaW5zdHJ1Y3Rpb25zICovCi0gIGNoYXIgKnN0cjI7Ci0KLSAgaWYgKChwcmV2X2luc24gIT0gLTEpICYmIHByZXZfc2VnCi0gICAgICAgJiYgKChwcmV2X3NlZyAhPSBub3dfc2VnKSB8fCAocHJldl9zdWJzZWcgIT0gbm93X3N1YnNlZykpKQotICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCi0gIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCAzKQotICAgIGQzMHZfYWxpZ24gKDMsIE5VTEwsIGQzMHZfbGFzdF9sYWJlbCk7Ci0gIGVsc2UgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA+IDMpCi0gICAgZDMwdl9jdXJyZW50X2FsaWduID0gMzsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLQotICBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSAwOwotICBmbGFnX3hwX3N0YXRlID0gMDsKLSAgaWYgKGV0eXBlID09IEVYRUNfVU5LTk9XTikKLSAgICB7Ci0gICAgICAvKiBsb29rIGZvciB0aGUgc3BlY2lhbCBtdWx0aXBsZSBpbnN0cnVjdGlvbiBzZXBhcmF0b3JzICovCi0gICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICJ8fCIpOwotICAgICAgaWYgKHN0cjIpIAotCXsKLQkgIGV4dHlwZSA9IEVYRUNfUEFSQUxMRUw7Ci0JICBmbGFnX3hwX3N0YXRlID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiLT4iKTsKLQkgIGlmIChzdHIyKSAKLQkgICAgZXh0eXBlID0gRVhFQ19TRVE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICI8LSIpOwotCSAgICAgIGlmIChzdHIyKSAKLQkJZXh0eXBlID0gRVhFQ19SRVZTRVE7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBzdHIyIHBvaW50cyB0byB0aGUgc2VwYXJhdG9yLCBpZiBvbmUgKi8KLSAgICAgIGlmIChzdHIyKSAKLQl7Ci0JICAqc3RyMiA9IDA7Ci0JICAKLQkgIC8qIGlmIHR3byBpbnN0cnVjdGlvbnMgYXJlIHByZXNlbnQgYW5kIHdlIGFscmVhZHkgaGF2ZSBvbmUgc2F2ZWQKLQkgICAgIHRoZW4gZmlyc3Qgd3JpdGUgaXQgb3V0ICovCi0JICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQkgIAotCSAgLyogQXNzZW1ibGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYW5kIHNhdmUgaXQuICAqLwotCSAgcHJldl9pbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJnByZXZfb3Bjb2RlLCAxLCAwKTsKLQkgIGlmIChwcmV2X2luc24gPT0gLTEpCi0JICAgIGFzX2JhZCAoXygiQ2Fubm90IGFzc2VtYmxlIGluc3RydWN0aW9uIikpOwotCSAgaWYgKHByZXZfb3Bjb2RlLmZvcm0gIT0gTlVMTCAmJiBwcmV2X29wY29kZS5mb3JtLT5mb3JtID49IExPTkcpCi0JICAgIGFzX2JhZCAoXygiRmlyc3Qgb3Bjb2RlIGlzIGxvbmcuICBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQuIikpOyAKLQkgIGZpeHVwcyA9IGZpeHVwcy0+bmV4dDsKLQkgIHN0ciA9IHN0cjIgKyAyOwotCSAgcHJldl9zZWcgPSBub3dfc2VnOwotCSAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotCX0KLSAgICB9Ci0KLSAgaW5zbiA9IGRvX2Fzc2VtYmxlIChzdHIsICZvcGNvZGUsCi0JCSAgICAgIChleHR5cGUgIT0gRVhFQ19VTktOT1dOIHx8IGV0eXBlICE9IEVYRUNfVU5LTk9XTiksCi0JCSAgICAgIGV4dHlwZSA9PSBFWEVDX1BBUkFMTEVMKTsKLSAgaWYgKGluc24gPT0gLTEpCi0gICAgewotICAgICAgaWYgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04pCi0JZXR5cGUgPSBleHR5cGU7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCBhc3NlbWJsZSBpbnN0cnVjdGlvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV0eXBlICE9IEVYRUNfVU5LTk9XTikKLSAgICB7Ci0gICAgICBleHR5cGUgPSBldHlwZTsKLSAgICAgIGV0eXBlID0gRVhFQ19VTktOT1dOOwotICAgIH0KLQotICAvKiBXb3JkIG11bHRpcGx5IGluc3RydWN0aW9ucyBtdXN0IG5vdCBiZSBmb2xsb3dlZCBieSBlaXRoZXIgYSBsb2FkIG9yIGEKLSAgICAgMTYtYml0IG11bHRpcGx5IGluc3RydWN0aW9uIGluIHRoZSBuZXh0IGN5Y2xlLiAgKi8KLSAgaWYgKCAgIChleHR5cGUgIT0gRVhFQ19SRVZTRVEpCi0gICAgICAmJiBwcmV2X211bDMyX3AKLSAgICAgICYmIChvcGNvZGUub3AtPmZsYWdzX3VzZWQgJiAoRkxBR19NRU0gfCBGTEFHX01VTDE2KSkpCi0gICAgewotICAgICAgLyogSG93ZXZlciwgbG9hZCBhbmQgbXVsdGlwbHkgc2hvdWxkIGFibGUgdG8gYmUgY29tYmluZWQgaW4gYSBwYXJhbGxlbAotCSBvcGVyYXRpb24sIHNvIGNoZWNrIGZvciB0aGF0IGZpcnN0LiAgKi8KLSAgICAgIGlmIChwcmV2X2luc24gIT0gLTEKLQkgICYmIChvcGNvZGUub3AtPmZsYWdzX3VzZWQgJiBGTEFHX01FTSkKLQkgICYmIG9wY29kZS5mb3JtLT5mb3JtIDwgTE9ORwotCSAgJiYgKGV4dHlwZSA9PSBFWEVDX1BBUkFMTEVMIHx8IChPcHRpbWl6aW5nICYmIGV4dHlwZSA9PSBFWEVDX1VOS05PV04pKQotCSAgJiYgcGFyYWxsZWxfb2sgKCZwcmV2X29wY29kZSwgKGxvbmcpcHJldl9pbnNuLAotCQkJICAmb3Bjb2RlLCAobG9uZylpbnNuLCBleHR5cGUpCi0JICAmJiB3cml0ZV8yX3Nob3J0ICgmcHJldl9vcGNvZGUsIChsb25nKXByZXZfaW5zbiwKLQkJCSAgICAmb3Bjb2RlLCAobG9uZylpbnNuLCBleHR5cGUsIGZpeHVwcykgPT0gMCkKLQl7Ci0JICAvKiBubyBpbnN0cnVjdGlvbnMgc2F2ZWQgKi8KLQkgIHByZXZfaW5zbiA9IC0xOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYW4ndCBwYXJhbGxlbGl6ZSwgZmx1c2ggcHJldmlvdXMgaW5zdHJ1Y3Rpb24gYW5kIGVtaXQgYSB3b3JkIG9mIE5PUFMsCi0JICAgICB1bmxlc3MgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgTk9QLCBpbiB3aGljaCBjYXNlIGp1c3QgZmx1c2ggaXQsCi0JICAgICBhcyB0aGlzIHdpbGwgZ2VuZXJhdGUgYSB3b3JkIG9mIE5PUHMgZm9yIHVzLiAgKi8KLQotCSAgaWYgKHByZXZfaW5zbiAhPSAtMSAmJiAoc3RyY21wIChwcmV2X29wY29kZS5vcC0+bmFtZSwgIm5vcCIpID09IDApKQotCSAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKiBmOwotCSAgICAgIAotCSAgICAgIGlmIChwcmV2X2luc24gIT0gLTEpCi0JCWQzMHZfY2xlYW51cCAodHJ1ZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZiA9IGZyYWdfbW9yZSAoOCk7Ci0JCSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIE5PUDIsIDgpOwotCQkgIAotCQkgIGlmICh3YXJuX25vcHMgPT0gTk9QX0FMTCB8fCB3YXJuX25vcHMgPT0gTk9QX01VTFRJUExZKQotCQkgICAgewotCQkgICAgICBpZiAob3Bjb2RlLm9wLT5mbGFnc191c2VkICYgRkxBR19NRU0pCi0JCQlhc193YXJuIChfKCJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCBsb2FkIikpOwotCQkgICAgICBlbHNlCi0JCQlhc193YXJuIChfKCJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCAxNi1iaXQgbXVsdGlwbHkiKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgCi0JICBleHR5cGUgPSBFWEVDX1VOS05PV047Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoICAgKGV4dHlwZSA9PSBFWEVDX1JFVlNFUSkKLQkgICAmJiBjdXJfbXVsMzJfcAotCSAgICYmIChwcmV2X29wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX01FTSB8IEZMQUdfTVVMMTYpKSkKLSAgICB7Ci0gICAgICAvKiBDYW4ndCBwYXJhbGxlbGl6ZSwgZmx1c2ggY3VycmVudCBpbnN0cnVjdGlvbiBhbmQgYWRkIGEgc2VxdWVudGlhbCBOT1AuICovCi0gICAgICB3cml0ZV8xX3Nob3J0ICgmIG9wY29kZSwgKGxvbmcpIGluc24sIGZpeHVwcy0+bmV4dC0+bmV4dCwgdHJ1ZSk7Ci0gICAgICAKLSAgICAgIC8qIE1ha2UgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHRoZSBjdXJyZW50IG9uZS4gICovCi0gICAgICBleHR5cGUgPSBFWEVDX1VOS05PV047Ci0gICAgICBpbnNuID0gcHJldl9pbnNuOwotICAgICAgbm93X3NlZyA9IHByZXZfc2VnOwotICAgICAgbm93X3N1YnNlZyA9IHByZXZfc3Vic2VnOwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgICBjdXJfbXVsMzJfcCA9IHByZXZfbXVsMzJfcDsKLSAgICAgIHByZXZfbXVsMzJfcCA9IDA7Ci0gICAgICBtZW1jcHkgKCZvcGNvZGUsICZwcmV2X29wY29kZSwgc2l6ZW9mIChwcmV2X29wY29kZSkpOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbG9uZyBpbnN0cnVjdGlvbiwgd3JpdGUgaXQgYW5kIGFueSBwcmV2aW91cyBzaG9ydCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChvcGNvZGUuZm9ybS0+Zm9ybSA+PSBMT05HKSAKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTikgCi0JYXNfYmFkIChfKCJJbnN0cnVjdGlvbiB1c2VzIGxvbmcgdmVyc2lvbiwgc28gaXQgY2Fubm90IGJlIG1peGVkIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotICAgICAgd3JpdGVfbG9uZyAoJiBvcGNvZGUsIGluc24sIGZpeHVwcyk7Ci0gICAgICBwcmV2X2luc24gPSAtMTsKLSAgICB9Ci0gIGVsc2UgaWYgKChwcmV2X2luc24gIT0gLTEpCi0JICAgJiYgKHdyaXRlXzJfc2hvcnQKLQkgICAgICAgKCYgcHJldl9vcGNvZGUsIChsb25nKSBwcmV2X2luc24sICYgb3Bjb2RlLAotCQkobG9uZykgaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApKSAKLSAgICB7Ci0gICAgICAvKiBObyBpbnN0cnVjdGlvbnMgc2F2ZWQuICAqLwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04pIAotCWFzX2JhZCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgCi0gICAgICAvKiBTYXZlIG9mZiBsYXN0IGluc3RydWN0aW9uIHNvIGl0IG1heSBiZSBwYWNrZWQgb24gbmV4dCBwYXNzLiAgKi8KLSAgICAgIG1lbWNweSAoJnByZXZfb3Bjb2RlLCAmb3Bjb2RlLCBzaXplb2YgKHByZXZfb3Bjb2RlKSk7Ci0gICAgICBwcmV2X2luc24gPSBpbnNuOwotICAgICAgcHJldl9zZWcgPSBub3dfc2VnOwotICAgICAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotICAgICAgcHJldl9tdWwzMl9wID0gY3VyX211bDMyX3A7Ci0gICAgfQotfQotCi0KLS8qIGRvX2Fzc2VtYmxlIGFzc2VtYmxlcyBhIHNpbmdsZSBpbnN0cnVjdGlvbiBhbmQgcmV0dXJucyBhbiBvcGNvZGUgKi8KLS8qIGl0IHJldHVybnMgLTEgKGFuIGludmFsaWQgb3Bjb2RlKSBvbiBlcnJvciAqLwotCi0jZGVmaW5lIE5BTUVfQlVGX0xFTgkyMAotCi1zdGF0aWMgbG9uZyBsb25nCi1kb19hc3NlbWJsZSAoc3RyLCBvcGNvZGUsIHNob3J0cCwgaXNfcGFyYWxsZWwpIAotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTsKLSAgICAgaW50IHNob3J0cDsKLSAgICAgaW50IGlzX3BhcmFsbGVsOwotewotICB1bnNpZ25lZCBjaGFyICogb3Bfc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKiBzYXZlOwotICB1bnNpZ25lZCBjaGFyICogb3BfZW5kOwotICBjaGFyICAgICAgICAgICAgbmFtZSBbTkFNRV9CVUZfTEVOXTsKLSAgaW50ICAgICAgICAgICAgIGNtcF9oYWNrOwotICBpbnQgICAgICAgICAgICAgbmxlbiA9IDA7Ci0gIGludCAgICAgICAgICAgICBmc2l6ZSA9IChzaG9ydHAgPyBGT1JDRV9TSE9SVCA6IDApOwotICBleHByZXNzaW9uUyAgICAgbXlvcHMgWzZdOwotICBsb25nIGxvbmcgICAgICAgaW5zbjsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKiBzdHIgPT0gJyAnKQotICAgIHN0ciArKzsKLQotICAvKiBmaW5kIHRoZSBvcGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSAodW5zaWduZWQgY2hhciAqKSAoc3RyKTsKLSAgICAgICAqIG9wX2VuZAotICAgICAgICYmIG5sZW4gPCAoTkFNRV9CVUZfTEVOIC0gMSkKLSAgICAgICAmJiAqIG9wX2VuZCAhPSAnLycKLSAgICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgbmFtZVtubGVuXSA9IHRvbG93ZXIgKG9wX3N0YXJ0W25sZW5dKTsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgLyogaWYgdGhlcmUgaXMgYW4gZXhlY3V0aW9uIGNvbmRpdGlvbiBjb2RlLCBoYW5kbGUgaXQgKi8KLSAgaWYgKCpvcF9lbmQgPT0gJy8nKQotICAgIHsKLSAgICAgIGludCBpID0gMDsKLSAgICAgIHdoaWxlICggKGkgPCBFQ0NfTUFYKSAmJiBzdHJuY2FzZWNtcCAoZDMwdl9lY2NfbmFtZXNbaV0sIG9wX2VuZCArIDEsIDIpKQotCWkrKzsKLSAgICAgIAotICAgICAgaWYgKGkgPT0gRUNDX01BWCkKLQl7Ci0JICBjaGFyIHRtcFs0XTsKLQkgIHN0cm5jcHkgKHRtcCwgb3BfZW5kICsgMSwgMik7Ci0JICB0bXBbMl0gPSAwOwotCSAgYXNfYmFkIChfKCJ1bmtub3duIGNvbmRpdGlvbiBjb2RlOiAlcyIpLHRtcCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgLyogICAgICBwcmludGYgKCJjb25kaXRpb24gY29kZT0lZFxuIixpKTsgKi8KLSAgICAgIG9wY29kZS0+ZWNjID0gaTsKLSAgICAgIG9wX2VuZCArPSAzOwotICAgIH0KLSAgZWxzZQotICAgIG9wY29kZS0+ZWNjID0gRUNDX0FMOwotICAKLQotICAvKiBDTVAgYW5kIENNUFUgY2hhbmdlIHRoZWlyIG5hbWUgYmFzZWQgb24gY29uZGl0aW9uIGNvZGVzICovCi0gIGlmICghc3RybmNtcCAobmFtZSwgImNtcCIsIDMpKQotICAgIHsKLSAgICAgIGludCBwLGk7Ci0gICAgICBjaGFyICoqc3RyID0gKGNoYXIgKiopZDMwdl9jY19uYW1lczsKLSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKLQlwID0gNDsKLSAgICAgIGVsc2UKLQlwID0gMzsKLQotICAgICAgZm9yIChpPTE7ICpzdHIgJiYgc3RybmNtcCAoKnN0ciwgJiBuYW1lW3BdLCAyKTsgaSsrLCBzdHIrKykKLQk7Ci0KLSAgICAgIC8qIGNtcHUgb25seSBzdXBwb3J0cyBzb21lIGNvbmRpdGlvbiBjb2RlcyAqLwotICAgICAgaWYgKHAgPT0gNCkKLQl7Ci0JICBpZiAoaSA8IDMgfHwgaSA+IDYpCi0JICAgIHsKLQkgICAgICBuYW1lW3ArMl09MDsKLQkgICAgICBhc19iYWQgKF8oImNtcHUgZG9lc24ndCBzdXBwb3J0IGNvbmRpdGlvbiBjb2RlICVzIiksJm5hbWVbcF0pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISpzdHIpCi0JewotCSAgbmFtZVtwKzJdPTA7Ci0JICBhc19iYWQgKF8oInVua25vd24gY29uZGl0aW9uIGNvZGU6ICVzIiksJm5hbWVbcF0pOyAgICAgIAotCX0KLSAgICAgIAotICAgICAgY21wX2hhY2sgPSBpOwotICAgICAgbmFtZVtwXSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgY21wX2hhY2sgPSAwOwotICAKLSAgLyogIHByaW50ZigiY21wX2hhY2s9JWRcbiIsY21wX2hhY2spOyAqLwotCi0gIC8qIG5lZWQgdG8gbG9vayBmb3IgLnMgb3IgLmwgKi8KLSAgaWYgKG5hbWVbbmxlbi0yXSA9PSAnLicpCi0gICAgewotICAgICAgc3dpdGNoIChuYW1lW25sZW4tMV0pCi0JewotCWNhc2UgJ3MnOgotCSAgZnNpemUgPSBGT1JDRV9TSE9SVDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgZnNpemUgPSBGT1JDRV9MT05HOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbmFtZVtubGVuLTJdID0gMDsKLSAgICB9Ci0KLSAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovICAKLSAgb3Bjb2RlLT5vcCA9IChzdHJ1Y3QgZDMwdl9vcGNvZGUgKiloYXNoX2ZpbmQgKGQzMHZfaGFzaCwgbmFtZSk7Ci0gIGlmIChvcGNvZGUtPm9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZTogJXMiKSxuYW1lKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BfZW5kOwotICB3aGlsZSAoIShvcGNvZGUtPmZvcm0gPSBmaW5kX2Zvcm1hdCAob3Bjb2RlLT5vcCwgbXlvcHMsIGZzaXplLCBjbXBfaGFjaykpKQotICAgIHsKLSAgICAgIG9wY29kZS0+b3ArKzsKLSAgICAgIGlmIChvcGNvZGUtPm9wLT5uYW1lID09IE5VTEwgfHwgc3RyY21wIChvcGNvZGUtPm9wLT5uYW1lLCBuYW1lKSkKLQl7Ci0JICBhc19iYWQgKF8oIm9wZXJhbmRzIGZvciBvcGNvZGUgYCVzJyBkbyBub3QgbWF0Y2ggYW55IHZhbGlkIGZvcm1hdCIpLCBuYW1lKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotCi0gIGluc24gPSBidWlsZF9pbnNuIChvcGNvZGUsIG15b3BzKTsgCi0KLSAgLyogUHJvcGlnYXRlIG11bHRpcGx5IHN0YXR1cyAqLwotICBpZiAoaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoaXNfcGFyYWxsZWwgJiYgcHJldl9tdWwzMl9wKQotCWN1cl9tdWwzMl9wID0gMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmV2X211bDMyX3AgPSBjdXJfbXVsMzJfcDsKLQkgIGN1cl9tdWwzMl9wICA9IChvcGNvZGUtPm9wLT5mbGFnc191c2VkICYgRkxBR19NVUwzMikgIT0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFByb3BhZ2F0ZSBsZWZ0X2tpbGxzX3JpZ2h0IHN0YXR1cyAqLwotICBpZiAoaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCA9IGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3A7Ci0KLSAgICAgIGlmIChvcGNvZGUtPm9wLT5mbGFnc19zZXQgJiBGTEFHX0xLUikKLQl7Ci0JICBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMTsKLQkgIAotCSAgaWYgKHN0cmNtcCAob3Bjb2RlLT5vcC0+bmFtZSwgIm12dHN5cyIpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBMZWZ0IGtpbGxzIHJpZ2h0IGZvciBvbmx5IG12dHN5cyBvbmx5IGZvciBQU1cvUFNXSC9QU1dML2ZsYWdzIHRhcmdldC4gKi8KLQkgICAgICBpZiAoKG15b3BzWzBdLlhfb3AgPT0gT19yZWdpc3RlcikgJiYKLQkJICAoKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0NPTlRST0wpIHx8IC8qIHBzdyAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMikgfHwgLyogcHN3aCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMSkgfHwgLyogcHN3bCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRyswKSB8fCAvKiBmMCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRysxKSB8fCAvKiBmMSAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRysyKSB8fCAvKiBmMiAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRyszKSB8fCAvKiBmMyAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys0KSB8fCAvKiBmNCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys1KSB8fCAvKiBmNSAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys2KSB8fCAvKiBmNiAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys3KSkpIC8qIGY3ICovCi0JCXsKLQkJICBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIE90aGVyIG12dHN5cyB0YXJnZXQgcmVnaXN0ZXJzIGRvbid0IGtpbGwgcmlnaHQgaW5zdHJ1Y3Rpb24uICovCi0JCSAgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci0JCX0KLQkgICAgfSAvKiBtdnRzeXMgKi8KLQl9Ci0gICAgICBlbHNlCi0JY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiBpbnNuOwotfQotCi0KLS8qIGZpbmRfZm9ybWF0KCkgZ2V0cyBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZvcm1hdCB0YWJsZS4KLSAgIEl0IG11c3QgbG9vayBhdCBhbGwgZm9ybWF0cyBmb3IgYW4gb3Bjb2RlIGFuZCB1c2UgdGhlIG9wZXJhbmRzCi0gICB0byBjaG9vc2UgdGhlIGNvcnJlY3Qgb25lLiAgUmV0dXJucyBOVUxMIG9uIGVycm9yLiAqLwotCi1zdGF0aWMgc3RydWN0IGQzMHZfZm9ybWF0ICoKLWZpbmRfZm9ybWF0IChvcGNvZGUsIG15b3BzLCBmc2l6ZSwgY21wX2hhY2spCi0gICAgIHN0cnVjdCBkMzB2X29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotICAgICBpbnQgZnNpemU7Ci0gICAgIGludCBjbXBfaGFjazsKLXsKLSAgaW50IG51bW9wcywgbWF0Y2gsIGluZGV4LCBpPTAsIGosIGs7Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZm07Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgLyogR2V0IGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucy4gICovCi0gIG51bW9wcyA9IGdldF9vcGVyYW5kcyAobXlvcHMsIGNtcF9oYWNrKTsKLQotICB3aGlsZSAoKGluZGV4ID0gb3Bjb2RlLT5mb3JtYXRbaSsrXSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZnNpemUgPT0gRk9SQ0VfU0hPUlQgJiYgaW5kZXggPj0gTE9ORykKLQljb250aW51ZTsKLQotICAgICAgaWYgKGZzaXplID09IEZPUkNFX0xPTkcgJiYgaW5kZXggPCBMT05HKQotCWNvbnRpbnVlOwotCi0gICAgICBmbSA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKikmZDMwdl9mb3JtYXRfdGFibGVbaW5kZXhdOwotICAgICAgayA9IGluZGV4OwotICAgICAgd2hpbGUgKGZtLT5mb3JtID09IGluZGV4KQotCXsKLQkgIG1hdGNoID0gMTsKLQkgIC8qIE5vdyBjaGVjayB0aGUgb3BlcmFuZHMgZm9yIGNvbXBhdGliaWxpdHkuICAqLwotCSAgZm9yIChqID0gMDsgbWF0Y2ggJiYgZm0tPm9wZXJhbmRzW2pdOyBqKyspCi0JICAgIHsKLQkgICAgICBpbnQgZmxhZ3MgPSBkMzB2X29wZXJhbmRfdGFibGVbZm0tPm9wZXJhbmRzW2pdXS5mbGFnczsKLQkgICAgICBpbnQgYml0cyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmbS0+b3BlcmFuZHNbal1dLmJpdHM7Ci0JICAgICAgaW50IFhfb3AgPSBteW9wc1tqXS5YX29wOwotCSAgICAgIGludCBudW0gPSBteW9wc1tqXS5YX2FkZF9udW1iZXI7Ci0JICAgICAgCi0JICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TUEVDSUFMKQotCQlicmVhazsKLQkgICAgICBlbHNlIGlmIChYX29wID09IE9faWxsZWdhbCkKLQkJbWF0Y2ggPSAwOwotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JCXsKLQkJICBpZiAoWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FDQykgJiYgIShudW0gJiBPUEVSQU5EX0FDQykpCi0JCSAgICAgIHx8ICghKGZsYWdzICYgT1BFUkFORF9BQ0MpICYmIChudW0gJiBPUEVSQU5EX0FDQykpCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpICYmICEobnVtICYgT1BFUkFORF9GTEFHKSkKLQkJICAgICAgfHwgKCEoZmxhZ3MgJiAoT1BFUkFORF9GTEFHIHwgT1BFUkFORF9DT05UUk9MKSkgJiYgKG51bSAmIE9QRVJBTkRfRkxBRykpCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCi0JCQkgICYmICEobnVtICYgKE9QRVJBTkRfQ09OVFJPTCB8IE9QRVJBTkRfRkxBRykpKSkKLQkJICAgIHsKLQkJICAgICAgbWF0Y2ggPSAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKChmbGFncyAmIE9QRVJBTkRfTUlOVVMpCi0JCSAgICAgICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfTUlOVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfUExVUykKLQkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX1BMVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykKLQkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX0FUTUlOVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQVRQQVIpCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9BVFBBUikpCi0JCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BVFNJR04pCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9BVFNJR04pKSkKLQkJewotCQkgIG1hdGNoPTA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfTlVNKQotCQl7Ci0JCSAgLyogQSBudW1iZXIgY2FuIGJlIGEgY29uc3RhbnQgb3Igc3ltYm9sIGV4cHJlc3Npb24uICAqLwotCi0JCSAgLyogSWYgd2UgaGF2ZSBmb3VuZCBhIHJlZ2lzdGVyIG5hbWUsIGJ1dCB0aGF0IG5hbWUgYWxzbwotCQkgICAgIG1hdGNoZXMgYSBzeW1ib2wsIHRoZW4gcmUtcGFyc2UgdGhlIG5hbWUgYXMgYW4gZXhwcmVzc2lvbi4gICovCi0JCSAgaWYgKFhfb3AgPT0gT19yZWdpc3RlcgotCQkgICAgICAmJiBzeW1ib2xfZmluZCAoKGNoYXIgKikgbXlvcHNbal0uWF9vcF9zeW1ib2wpKQotCQkgICAgewotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAoY2hhciAqKSBteW9wc1tqXS5YX29wX3N5bWJvbDsKLQkJICAgICAgZXhwcmVzc2lvbiAoJiBteW9wc1tqXSk7Ci0JCSAgICB9Ci0JCSAgICAgIAotCQkgIC8qIFR1cm4gYW4gZXhwcmVzc2lvbiBpbnRvIGEgc3ltYm9sIGZvciBsYXRlciByZXNvbHV0aW9uLiAgKi8KLQkJICBpZiAoWF9vcCAhPSBPX2Fic2VudCAmJiBYX29wICE9IE9fY29uc3RhbnQKLQkJICAgICAgJiYgWF9vcCAhPSBPX3N5bWJvbCAmJiBYX29wICE9IE9fcmVnaXN0ZXIKLQkJICAgICAgJiYgWF9vcCAhPSBPX2JpZykKLQkJICAgIHsKLQkJICAgICAgc3ltYm9sUyAqc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJm15b3BzW2pdKTsKLQkJICAgICAgbXlvcHNbal0uWF9vcCA9IFhfb3AgPSBPX3N5bWJvbDsKLQkJICAgICAgbXlvcHNbal0uWF9hZGRfc3ltYm9sID0gc3ltOwotCQkgICAgICBteW9wc1tqXS5YX2FkZF9udW1iZXIgPSBudW0gPSAwOwotCQkgICAgfQotCi0JCSAgaWYgKGZtLT5mb3JtID49IExPTkcpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHdlJ3JlIHRlc3RpbmcgZm9yIGEgTE9ORyBmb3JtYXQsIGVpdGhlciBmaXRzLiAqLwotCQkgICAgICBpZiAoWF9vcCAhPSBPX2NvbnN0YW50ICYmIFhfb3AgIT0gT19zeW1ib2wpCi0JCQltYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZm0tPmZvcm0gPCBMT05HCi0JCQkgICAmJiAoKGZzaXplID09IEZPUkNFX1NIT1JUICYmIFhfb3AgPT0gT19zeW1ib2wpCi0JCQkgICAgICAgfHwgKGZtLT5mb3JtID09IFNIT1JUX0QyICYmIGogPT0gMCkpKQotCQkgICAgbWF0Y2ggPSAxOwotCQkgIC8qIFRoaXMgaXMgdGhlIHRyaWNreSBwYXJ0LiAgV2lsbCB0aGUgY29uc3RhbnQgb3Igc3ltYm9sCi0JCSAgICAgZml0IGludG8gdGhlIHNwYWNlIGluIHRoZSBjdXJyZW50IGZvcm1hdD8gKi8KLQkJICBlbHNlIGlmIChYX29wID09IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykpCi0JCQltYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoWF9vcCA9PSBPX3N5bWJvbAotCQkJICAgJiYgU19JU19ERUZJTkVEIChteW9wc1tqXS5YX2FkZF9zeW1ib2wpCi0JCQkgICAmJiBTX0dFVF9TRUdNRU5UIChteW9wc1tqXS5YX2FkZF9zeW1ib2wpID09IG5vd19zZWcKLQkJCSAgICYmIG9wY29kZS0+cmVsb2NfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBzZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0Ci0JCQkgaW50byB0aGUgZm9ybSB3ZSdyZSBjb25zaWRlcmluZy4gKi8KLQkJICAgICAgZnJhZ1MgKmY7Ci0JCSAgICAgIGxvbmcgdmFsdWU7Ci0KLQkJICAgICAgLyogQ2FsY3VsYXRlIHRoZSBjdXJyZW50IGFkZHJlc3MgYnkgcnVubmluZyB0aHJvdWdoIHRoZQotCQkJIHByZXZpb3VzIGZyYWdzIGFuZCBhZGRpbmcgb3VyIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgICBmb3IgKGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmOyBmID0gZi0+ZnJfbmV4dCkKLQkJCXZhbHVlICs9IGYtPmZyX2ZpeCArIGYtPmZyX29mZnNldDsKLQkJICAgICAgdmFsdWUgPSAoU19HRVRfVkFMVUUgKG15b3BzW2pdLlhfYWRkX3N5bWJvbCkgLSB2YWx1ZQotCQkJICAgICAgIC0gKG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykKLQkJCQkgIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpKTsKLQkJICAgICAgaWYgKGNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZmxhZ3MpKSAKLQkJCW1hdGNoID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgfQotCSAgLyogcHJpbnRmKCJ0aHJvdWdoIHRoZSBsb29wOiBtYXRjaD0lZFxuIixtYXRjaCk7ICAqLwotCSAgLyogV2UncmUgb25seSBkb25lIGlmIHRoZSBvcGVyYW5kcyBtYXRjaGVkIHNvIGZhciBBTkQgdGhlcmUKLQkgICAgIGFyZSBubyBtb3JlIHRvIGNoZWNrLiAgKi8KLQkgIGlmIChtYXRjaCAmJiBteW9wc1tqXS5YX29wID09IDApCi0JICAgIHsKLQkgICAgICAvKiBGaW5hbCBjaGVjayAtIGlzc3VlIGEgd2FybmluZyBpZiBhbiBvZGQgbnVtYmVyZWQgcmVnaXN0ZXIKLQkJIGlzIHVzZWQgYXMgdGhlIGZpcnN0IHJlZ2lzdGVyIGluIGFuIGluc3RydWN0aW9uIHRoYXQgcmVhZHMKLQkJIG9yIHdyaXRlcyAyIHJlZ2lzdGVycy4gICovCi0KLQkgICAgICBmb3IgKGogPSAwOyBmbS0+b3BlcmFuZHNbal07IGorKykKLQkJaWYgKG15b3BzW2pdLlhfb3AgPT0gT19yZWdpc3RlcgotCQkgICAgJiYgKG15b3BzW2pdLlhfYWRkX251bWJlciAmIDEpCi0JCSAgICAmJiAoZDMwdl9vcGVyYW5kX3RhYmxlW2ZtLT5vcGVyYW5kc1tqXV0uZmxhZ3MgJiBPUEVSQU5EXzJSRUcpKQotCQkgIGFzX3dhcm4gKFwKLV8oIk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbiIpKTsKLQkgICAgICAKLQkgICAgICByZXR1cm4gZm07Ci0JICAgIH0KLQkgIGZtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVsrK2tdOwotCX0KLSAgICAgIC8qIHByaW50ZigidHJ5aW5nIGFub3RoZXIgZm9ybWF0OiBpPSVkXG4iLGkpOyAqLwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQotICAgICBmaXhTICpmaXhwOwotICAgICBzZWdUIHNlYzsKLXsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopTlVMTCAmJiAoIVNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpIHx8Ci0gICAgIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKiBmaXhwOwotICAgICB2YWx1ZVQgKiB2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICogd2hlcmU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbiwgaW5zbjI7Ci0gIGxvbmcgdmFsdWU7Ci0gIAotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVwOwotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICAKLSAgICAgIGlmIChmaXhwLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikgCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KLSAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gIGluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gIAotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODogIC8qIENoZWNrIGZvciBhIGJhZCAuYnl0ZSBkaXJlY3RpdmUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgYnl0ZSIpLAotCQlmaXhwLT5meF9saW5lLCBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotICAgICAgZWxzZSBpZiAoKCh1bnNpZ25lZCl2YWx1ZSkgPiAweGZmKQotCSAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIGJ5dGUiKSwKLQkJICAgIGZpeHAtPmZ4X2xpbmUsIHZhbHVlKTsKLSAgICAgIGVsc2UKLQkqICh1bnNpZ25lZCBjaGFyICopIHdoZXJlID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DXzE2OiAgLyogQ2hlY2sgZm9yIGEgYmFkIC5zaG9ydCBkaXJlY3RpdmUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgc2hvcnQiKSwKLQkJZml4cC0+ZnhfbGluZSwgU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpKTsKLSAgICAgIGVsc2UgaWYgKCgodW5zaWduZWQpdmFsdWUpID4gMHhmZmZmKQotCSAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIHNob3J0IiksCi0JCSAgICBmaXhwLT5meF9saW5lLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DXzY0OiAgLyogQ2hlY2sgZm9yIGEgYmFkIC5xdWFkIGRpcmVjdGl2ZS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQlhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBxdWFkIiksCi0JCWZpeHAtPmZ4X2xpbmUsIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICBiZmRfcHV0YjMyICgwLCAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpICsgNCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzY6Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgNiwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9IHZhbHVlICYgMHgzRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SOwotCX0KLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCA5LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKCh2YWx1ZSA+PiAzKSAmIDB4M0YpIDw8IDEyOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8xNToKLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAxNSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4RkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUjsKLQl9Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMTUsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweEZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMjE6Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMjEsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweDNGRkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUjsKLQl9Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMjEsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweDNGRkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8zMjoKLSAgICAgIGluc24yID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDI2KSAmIDB4M0Y7CQkvKiB0b3AgNiBiaXRzICovCi0gICAgICBpbnNuMiB8PSAoKHZhbHVlICYgMHgwM0ZDMDAwMCkgPDwgMik7CS8qIG5leHQgOCBiaXRzICovIAotICAgICAgaW5zbjIgfD0gdmFsdWUgJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbjIsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUw6Ci0gICAgICBpbnNuMiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAyNikgJiAweDNGOwkJLyogdG9wIDYgYml0cyAqLwotICAgICAgaW5zbjIgfD0gKCh2YWx1ZSAmIDB4MDNGQzAwMDApIDw8IDIpOwkvKiBuZXh0IDggYml0cyAqLyAKLSAgICAgIGluc24yIHw9IHZhbHVlICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24yLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIpLAotCSAgICAgIGZpeHAtPmZ4X2xpbmUsZml4cC0+Znhfcl90eXBlKTsKLSAgICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQotCi0vKiBkMzB2X2NsZWFudXAoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQgcGFyc2luZyB0aGUgaW5wdXQgCi0gICBmaWxlIG9yIGFmdGVyIGEgbGFiZWwgaXMgZGVmaW5lZC4gIEJlY2F1c2UgdGhlIEQzMFYgYXNzZW1ibGVyIHNvbWV0aW1lcyBzYXZlcyBzaG9ydCAKLSAgIGluc3RydWN0aW9ucyB0byBzZWUgaWYgaXQgY2FuIHBhY2thZ2UgdGhlbSB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uLCB0aGVyZSBtYXkKLSAgIGJlIGEgc2hvcnQgaW5zdHJ1Y3Rpb24gdGhhdCBzdGlsbCBuZWVkcyB3cml0dGVuLiAgKi8KLWludAotZDMwdl9jbGVhbnVwICh1c2Vfc2VxdWVudGlhbCkKLSAgICAgaW50IHVzZV9zZXF1ZW50aWFsOwotewotICBzZWdUIHNlZzsKLSAgc3Vic2VnVCBzdWJzZWc7Ci0KLSAgaWYgKHByZXZfaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBzZWcgPSBub3dfc2VnOwotICAgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIHN1YnNlZ19zZXQgKHByZXZfc2VnLCBwcmV2X3N1YnNlZyk7Ci0gICAgICB3cml0ZV8xX3Nob3J0ICgmcHJldl9vcGNvZGUsIChsb25nKXByZXZfaW5zbiwgZml4dXBzLT5uZXh0LCB1c2Vfc2VxdWVudGlhbCk7Ci0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgICBwcmV2X2luc24gPSAtMTsKLSAgICAgIGlmICh1c2Vfc2VxdWVudGlhbCkKLQlwcmV2X211bDMyX3AgPSBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAKLWQzMHZfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBuKQotICAgICBjaGFyICpidWY7CQkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgbG9uZyB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG47CQkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIHdoaWxlIChuLS0pCi0gICAgewotICAgICAgYnVmW25dID0gdmFsdWUgJiAweGZmOwotICAgICAgdmFsdWUgPj49IDg7Ci0gICAgfQotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBldmVyeSBsaW5lLiAqLwotLyogaXQgY2hlY2tzIHRvIHNlZSBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgJy4nICovCi0vKiB3aGljaCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGEgcHNldWRvLW9wLiAgSWYgaXQgaXMsICovCi0vKiB0aGVuIHdyaXRlIG91dCBhbnkgdW53cml0dGVuIGluc3RydWN0aW9ucyAqLwotCi12b2lkIAotZDMwdl9zdGFydF9saW5lICgpCi17Ci0gIGNoYXIgKmMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgd2hpbGUgKGlzc3BhY2UgKCpjKSkKLSAgICBjKys7Ci0KLSAgaWYgKCpjID09ICcuJykKLSAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgCi1jaGVja19zaXplICh2YWx1ZSwgYml0cywgZmlsZSwgbGluZSkKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIGludCBsaW5lOwotewotICBpbnQgdG1wLCBtYXg7Ci0KLSAgaWYgKHZhbHVlIDwgMCkKLSAgICB0bXAgPSB+dmFsdWU7Ci0gIGVsc2UKLSAgICB0bXAgPSB2YWx1ZTsKLSAgICAKLSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOwotCi0gIGlmICh0bXAgPiBtYXgpCi0gICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJ2YWx1ZSB0b28gbGFyZ2UgdG8gZml0IGluICVkIGJpdHMiKSwgYml0cyk7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBkMzB2X2Zyb2JfbGFiZWwoKSBpcyBjYWxsZWQgd2hlbiBhZnRlciBhIGxhYmVsIGlzIHJlY29nbml6ZWQuICAqLwotCi12b2lkCi1kMzB2X2Zyb2JfbGFiZWwgKGxhYikKLSAgICAgc3ltYm9sUyAqbGFiOwotewotICAvKiBFbWl0IGFueSBwZW5kaW5nIGluc3RydWN0aW9ucy4gICovCi0gIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCi0gIC8qIFVwZGF0ZSB0aGUgbGFiZWwncyBhZGRyZXNzIHdpdGggdGhlIGN1cnJlbnQgb3V0cHV0IHBvaW50ZXIuICAqLwotICBzeW1ib2xfc2V0X2ZyYWcgKGxhYiwgZnJhZ19ub3cpOwotICBTX1NFVF9WQUxVRSAobGFiLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCi0gIC8qIFJlY29yZCB0aGlzIGxhYmVsIGZvciBmdXR1cmUgYWRqdXN0bWVudCBhZnRlciB3ZSBmaW5kIG91dCB3aGF0Ci0gICAgIGtpbmQgb2YgZGF0YSBpdCByZWZlcmVuY2VzLCBhbmQgdGhlIHJlcXVpcmVkIGFsaWdubWVudCB0aGVyZXdpdGguICAqLwotICBkMzB2X2xhc3RfbGFiZWwgPSBsYWI7Ci19Ci0KLS8qIEhvb2sgaW50byBjb25zIGZvciBjYXB0dXJpbmcgYWxpZ25tZW50IGNoYW5nZXMuICAqLwotCi12b2lkCi1kMzB2X2NvbnNfYWxpZ24gKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBpbnQgbG9nX3NpemU7Ci0KLSAgbG9nX3NpemUgPSAwOwotICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCi0gICAgKytsb2dfc2l6ZTsKLQotICBpZiAoZDMwdl9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgZDMwdl9hbGlnbiAobG9nX3NpemUsIChjaGFyICopIE5VTEwsIE5VTEwpOwotICBlbHNlIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBkMzB2X2N1cnJlbnRfYWxpZ24gPSBsb2dfc2l6ZTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLX0KLQotLyogQ2FsbGVkIGludGVybmFsbHkgdG8gaGFuZGxlIGFsbCBhbGlnbm1lbnQgbmVlZHMuICBUaGlzIHRha2VzIGNhcmUKLSAgIG9mIGVsaWRpbmcgY2FsbHMgdG8gZnJhZ19hbGlnbiBpZiduIHRoZSBjYWNoZWQgY3VycmVudCBhbGlnbm1lbnQKLSAgIHNheXMgd2UndmUgYWxyZWFkeSBnb3QgaXQsIGFzIHdlbGwgYXMgdGFraW5nIGNhcmUgb2YgdGhlIGF1dG8tYWxpZ25pbmcKLSAgIGxhYmVscyB3cnQgY29kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1kMzB2X2FsaWduIChuLCBwZmlsbCwgbGFiZWwpCi0gICAgIGludCBuOwotICAgICBjaGFyICpwZmlsbDsKLSAgICAgc3ltYm9sUyAqbGFiZWw7Ci17Ci0gIC8qIFRoZSBmcm9udCBlbmQgaXMgcHJvbmUgdG8gY2hhbmdpbmcgc2VnbWVudHMgb3V0IGZyb20gdW5kZXIgdXMKLSAgICAgdGVtcG9yYXJpbHkgd2hlbiAtZyBpcyBpbiBlZmZlY3QuICAqLwotICBpbnQgc3dpdGNoZWRfc2VnX3AgPSAoZDMwdl9jdXJyZW50X2FsaWduX3NlZyAhPSBub3dfc2VnKTsKLQotICAvKiBEbyBub3QgYXNzdW1lIHRoYXQgaWYgJ2QzMHZfY3VycmVudF9hbGlnbiA+PSBuJyBhbmQKLSAgICAgJyEgc3dpdGNoZWRfc2VnX3AnIHRoYXQgaXQgaXMgc2FmZSB0byBhdm9pZCBwZXJmb3JtaW5nCi0gICAgIHRoaXMgYWxpZ25lbWVudCByZXF1ZXN0LiAgVGhlIGFsaWdubWVudCBvZiB0aGUgY3VycmVudCBmcmFnCi0gICAgIGNhbiBiZSBjaGFuZ2VkIHVuZGVyIG91ciBmZWV0LCBmb3IgZXhhbXBsZSBieSBhIC5hc2NpaQotICAgICBkaXJlY3RpdmUgaW4gdGhlIHNvdXJjZSBjb2RlLiAgY2YgdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMgICovCi0gIAotICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQotICBpZiAocGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA+IDIKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLQl7Ci0JICBzdGF0aWMgY2hhciBjb25zdCBub3BbNF0gPSB7IDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAgfTsKLQotCSAgLyogRmlyc3QsIG1ha2Ugc3VyZSB3ZSdyZSBvbiBhIGZvdXItYnl0ZSBib3VuZGFyeSwgaW4gY2FzZQotCSAgICAgc29tZW9uZSBoYXMgYmVlbiBwdXR0aW5nIC5ieXRlIHZhbHVlcyB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCAyIHx8IHN3aXRjaGVkX3NlZ19wKQotCSAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLQkgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbm9wLCBzaXplb2Ygbm9wLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbiAobiwgMCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKLQotICBpZiAoIXN3aXRjaGVkX3NlZ19wKQotICAgIGQzMHZfY3VycmVudF9hbGlnbiA9IG47Ci0KLSAgaWYgKGxhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUyAqICAgICBzeW07Ci0gICAgICBpbnQgICAgICAgICAgIGxhYmVsX3NlZW4gPSBmYWxzZTsKLSAgICAgIHN0cnVjdCBmcmFnICogb2xkX2ZyYWc7Ci0gICAgICB2YWx1ZVQgICAgICAgIG9sZF92YWx1ZTsKLSAgICAgIHZhbHVlVCAgICAgICAgbmV3X3ZhbHVlOwotICAgICAgCi0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLQotICAgICAgb2xkX2ZyYWcgID0gc3ltYm9sX2dldF9mcmFnIChsYWJlbCk7Ci0gICAgICBvbGRfdmFsdWUgPSBTX0dFVF9WQUxVRSAobGFiZWwpOwotICAgICAgbmV3X3ZhbHVlID0gKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpOwotICAgICAgCi0gICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbGFiZWwgYXQgYSBwYXJ0aWN1bGFyCi0JIGFkZHJlc3MsIGVzcGVjaWFsbHkgaWYgZGVidWdnaW5nIGlzIGVuYWJsZWQsIHNvIHdlIG11c3QKLQkgdGFrZSBjYXJlIHRvIGFkanVzdCBhbGwgdGhlIGxhYmVscyBhdCB0aGlzIGFkZHJlc3MgaW4gdGhpcwotCSBmcmFnbWVudC4gIFRvIHNhdmUgdGltZSB3ZSBzZWFyY2ggZnJvbSB0aGUgZW5kIG9mIHRoZSBzeW1ib2wKLQkgbGlzdCwgYmFja3dhcmRzLCBzaW5jZSB0aGUgc3ltYm9scyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBhcmUKLQkgYWxtb3N0IGNlcnRhaW5seSB0aGUgb25lcyB0aGF0IHdlcmUgbW9zdCByZWNlbnRseSBhZGRlZC4KLQkgQWxzbyB0byBzYXZlIHRpbWUgd2Ugc3RvcCBzZWFyY2hpbmcgb25jZSB3ZSBoYXZlIHNlZW4gYXQgbGVhc3QKLQkgb25lIG1hdGNoaW5nIGxhYmVsLCBhbmQgd2UgZW5jb3VudGVyIGEgbGFiZWwgdGhhdCBpcyBubyBsb25nZXIKLQkgaW4gdGhlIHRhcmdldCBmcmFnbWVudC4gIE5vdGUsIHRoaXMgc2VhcmNoIGlzIGd1YXJhbnRlZWQgdG8KLQkgZmluZCBhdCBsZWFzdCBvbmUgbWF0Y2ggd2hlbiBzeW0gPT0gbGFiZWwsIHNvIG5vIHNwZWNpYWwgY2FzZQotCSBjb2RlIGlzIG5lY2Vzc2FyeS4gICovCi0gICAgICBmb3IgKHN5bSA9IHN5bWJvbF9sYXN0UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9wcmV2aW91cyAoc3ltKSkKLQl7Ci0JICBpZiAoc3ltYm9sX2dldF9mcmFnIChzeW0pID09IG9sZF9mcmFnCi0JICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gb2xkX3ZhbHVlKQotCSAgICB7Ci0JICAgICAgbGFiZWxfc2VlbiA9IHRydWU7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLQkgICAgICBTX1NFVF9WQUxVRSAoc3ltLCBuZXdfdmFsdWUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChsYWJlbF9zZWVuICYmIHN5bWJvbF9nZXRfZnJhZyAoc3ltKSAhPSBvbGRfZnJhZykKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgVGhpcyBhbGlnbnMgdG8gYSBwb3dlciBvZiB0d28uICBXZQotICAgaG9vayBoZXJlIHRvIGxhdGNoIHRoZSBjdXJyZW50IGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfYWxpZ24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGFsaWduOwotICBjaGFyIGZpbGwsICpwZmlsbCA9IE5VTEw7Ci0gIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OwotCi0gIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCi0gICAgewotICAgICAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OwotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQgYXNzdW1lZCIpLCBhbGlnbik7Ci0gICAgfQotICBlbHNlIGlmIChhbGlnbiA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiKSk7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHBmaWxsID0gJmZpbGw7Ci0gICAgfQotCi0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfYWxpZ24gKGFsaWduLCBwZmlsbCwgTlVMTCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudGV4dCBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgdGhlIHNhdmVkIGxhc3QgbGFiZWwgYW5kIHJlc2V0cyBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19kMzB2X3RleHQgKGkpCi0gICAgIGludCBpOwotCi17Ci0gIHNfdGV4dCAoaSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQotCi0vKiBIYW5kbGUgdGhlIC5kYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfZGF0YSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHNfZGF0YSAoaSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmggYi9nYXMvY29uZmlnL3RjLWQzMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlYmJiOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIHRjLTMxMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtZDMwdi5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19EMzBWCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBEMzBWIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2QzMHYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItZDMwdiIKLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oRklYUCwgU0VDKSAgIAotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4KLQotaW50IGQzMHZfY2xlYW51cCBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgbWRfYWZ0ZXJfcGFzc19ob29rKCkJICAgICBkMzB2X2NsZWFudXAgKGZhbHNlKQotI2RlZmluZSBtZF9jbGVhbnVwKCkJCSAgICAgZDMwdl9jbGVhbnVwIChmYWxzZSkKLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2gsIHB0cikgICAgICAoY2ggPT0gJzonICYmIGQzMHZfY2xlYW51cCAoZmFsc2UpKQotI2RlZmluZSBtZF9zdGFydF9saW5lX2hvb2soKQkgICAgIGQzMHZfc3RhcnRfbGluZSAoZmFsc2UpCi0KLXZvaWQgZDMwdl9mcm9iX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkJICAgICBkMzB2X2Zyb2JfbGFiZWwoc3ltKQotCi12b2lkIGQzMHZfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpCSAgICAgZDMwdl9jb25zX2FsaWduKG5ieXRlcykKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZnIzMC5jIGIvZ2FzL2NvbmZpZy90Yy1mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTU4ODAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1mcjMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyogdGMtZnIzMC5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIEZ1aml0c3UgRlIzMC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGVzL2ZyMzAtZGVzYy5oIgotI2luY2x1ZGUgIm9wY29kZXMvZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgZGVzY3JpYmluZwotICAgYW4gaW5kaXZpZHVhbCBpbnN0cnVjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBDR0VOX0lOU04gKglpbnNuOwotICBjb25zdCBDR0VOX0lOU04gKglvcmlnX2luc247Ci0gIENHRU5fRklFTERTCQlmaWVsZHM7Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0gIENHRU5fSU5TTl9JTlQgICAgICAgICBidWZmZXIgWzFdOwotI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKCooYnVmKSkKLSNlbHNlCi0gIHVuc2lnbmVkIGNoYXIgICAgICAgICBidWZmZXIgW0NHRU5fTUFYX0lOU05fU0laRV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoYnVmKQotI2VuZGlmCi0gIGNoYXIgKgkJYWRkcjsKLSAgZnJhZ1MgKgkJZnJhZzsKLSAgaW50ICAgICAgICAgICAgICAgICAgIG51bV9maXh1cHM7Ci0gIGZpeFMgKiAgICAgICAgICAgICAgICBmaXh1cHMgW0dBU19DR0VOX01BWF9GSVhVUFNdOwotICBpbnQgICAgICAgICAgICAgICAgICAgaW5kaWNlcyBbTUFYX09QRVJBTkRfSU5TVEFOQ0VTXTsKLX0KLWZyMzBfaW5zbjsKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gICAgICAgID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSAgID0gIiMiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gInwiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSAgICAgICAgICAgID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gICAgICAgICAgICA9ICJkRCI7Ci0MCi0jZGVmaW5lIEZSMzBfU0hPUlRPUFRTICIiCi1jb25zdCBjaGFyICogbWRfc2hvcnRvcHRzID0gRlIzMF9TSE9SVE9QVFM7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgICAgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICogc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBGUjMwIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zOlxuIikpOwotfSAKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsCWNvbnMsCQk0IH0sCi0gIHsgTlVMTCwgCU5VTEwsIAkJMCB9Ci19OwotCi0MCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotICBzZWdUICAgICBzZWc7Ci0gIHN1YnNlZ1QgIHN1YnNlZzsKLQotICAvKiBJbml0aWFsaXplIHRoZSBgY2dlbicgaW50ZXJmYWNlLiAgKi8KLSAgCi0gIC8qIFNldCB0aGUgbWFjaGluZSBudW1iZXIgYW5kIGVuZGlhbi4gICovCi0gIGdhc19jZ2VuX2NwdV9kZXNjID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX01BQ0hTLCAwLAotCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5ESUFOLAotCQkJCQkgIENHRU5fRU5ESUFOX0JJRywKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gIGZyMzBfY2dlbl9pbml0X2FzbSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOwotCi0gIC8qIFRoaXMgaXMgYSBjYWxsYmFjayBmcm9tIGNnZW4gdG8gZ2FzIHRvIHBhcnNlIG9wZXJhbmRzLiAgKi8KLSAgY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGdhc19jZ2VuX3BhcnNlX29wZXJhbmQpOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBzdGF0aWMgaW50IGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdCA9IDA7Ci0gIGZyMzBfaW5zbiBpbnNuOwotICBjaGFyICogICAgZXJybXNnOwotICBjaGFyICogICAgc3RyMiA9IE5VTEw7Ci0KLSAgLyogSW5pdGlhbGl6ZSBHQVMncyBjZ2VuIGludGVyZmFjZSBmb3IgYSBuZXcgaW5zdHJ1Y3Rpb24uICAqLwotICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOwotCi0gIGluc24uaW5zbiA9IGZyMzBfY2dlbl9hc3NlbWJsZV9pbnNuCi0gICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBzdHIsICYgaW5zbi5maWVsZHMsIGluc24uYnVmZmVyLCAmIGVycm1zZyk7Ci0gIAotICBpZiAoIWluc24uaW5zbikKLSAgICB7Ci0gICAgICBhc19iYWQgKGVycm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGF0IHdlIHBhc3MgZm9yIFJFTEFYX1AgaGVyZS4gICovCi0gIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLmluc24sIGluc24uYnVmZmVyLAotCQkJQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBpbnNuLmZpZWxkcyksIDEsIE5VTEwpOwotCi0gIC8qIFdhcm4gYWJvdXQgaW52YWxpZCBpbnNucyBpbiBkZWxheSBzbG90cy4gICovCi0gIGlmIChsYXN0X2luc25faGFkX2RlbGF5X3Nsb3QKLSAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLmluc24sIENHRU5fSU5TTl9OT1RfSU5fREVMQVlfU0xPVCkpCi0gICAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXMgbm90IGFsbG93ZWQgaW4gYSBkZWxheSBzbG90LiIpLAotCSAgICAgQ0dFTl9JTlNOX05BTUUgKGluc24uaW5zbikpOwotCi0gIGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdAotICAgID0gQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24uaW5zbiwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QpOwotfQotCi0vKiBUaGUgc3ludGF4IGluIHRoZSBtYW51YWwgc2F5cyBjb25zdGFudHMgYmVnaW4gd2l0aCAnIycuCi0gICBXZSBqdXN0IGlnbm9yZSBpdC4gICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1QgICBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotDAotLyogSW50ZXJmYWNlIHRvIHJlbGF4X3NlZ21lbnQuICAqLwotCi0vKiBGSVhNRTogQnVpbGQgdGFibGUgYnkgaGFuZCwgZ2V0IGl0IHdvcmtpbmcsIHRoZW4gbWFjaGluZSBnZW5lcmF0ZS4gICovCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotLyogVGhlIGZpZWxkcyBhcmU6Ci0gICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLiAgKi8KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgbXVzdCBiZSB1bnVzZWQgYmVjYXVzZSBhbiBgcmx4X21vcmUnIHZhbHVlIG9mIHplcm8gZW5kcwotICAgICBlYWNoIGxpc3QuICAqLwotICB7MSwgMSwgMCwgMH0sCi0KLSAgLyogVGhlIGRpc3BsYWNlbWVudCB1c2VkIGJ5IEdBUyBpcyBmcm9tIHRoZSBlbmQgb2YgdGhlIDIgYnl0ZSBpbnNuLAotICAgICBzbyB3ZSBzdWJ0cmFjdCAyIGZyb20gdGhlIGZvbGxvd2luZy4gICovCi0gIC8qIDE2IGJpdCBpbnNuLCA4IGJpdCBkaXNwIC0+IDEwIGJpdCByYW5nZS4KLSAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSBhIGJyYW5jaCBpbiB0aGUgcmlnaHQgc2xvdCBhdCB0aGUgYm9yZGVyOgotICAgICB0aGUgIiYgLTQiIGlzbid0IHRha2VuIGludG8gYWNjb3VudC4gIEl0J3Mgbm90IGltcG9ydGFudCBlbm91Z2ggdG8KLSAgICAgY29tcGxpY2F0ZSB0aGluZ3Mgb3ZlciBpdCwgc28gd2Ugc3VidHJhY3QgYW4gZXh0cmEgMiAob3IgKyAyIGluIC12ZQotICAgICBjYXNlKS4gICovCi0gIHs1MTEgLSAyIC0gMiwgLTUxMiAtIDIgKyAyLCAwLCAyIH0sCi0gIC8qIDMyIGJpdCBpbnNuLCAyNCBiaXQgZGlzcCAtPiAyNiBiaXQgcmFuZ2UuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCAyLCAwIH0sCi0gIC8qIFNhbWUgdGhpbmcsIGJ1dCB3aXRoIGxlYWRpbmcgbm9wIGZvciBhbGlnbm1lbnQuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCA0LCAwIH0KLX07Ci0KLWxvbmcKLWZyMzBfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICogZnJhZ1A7Ci0gICAgIGxvbmcgICAgc3RyZXRjaDsKLXsKLSAgLyogQWRkcmVzcyBvZiBicmFuY2ggaW5zbi4gICovCi0gIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0gIGxvbmcgZ3Jvd3RoID0gMDsKLQotICAvKiBLZWVwIDMyIGJpdCBpbnNucyBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgPT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7Ci0JICBncm93dGggPSAtMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZ3Jvd3RoID0gcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotCi0gICAgICAvKiBMb25nIGp1bXAgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5PyAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyICYmIChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggKz0gMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBncm93dGg7Ci19Ci0KLS8qIFJldHVybiBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBsZW5ndGggYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8KLSAgIGhvbGQgYSBicmFuY2ggdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uLgotICAgQWxzbyB1cGRhdGVzIGZyX3R5cGUvZnJfc3VidHlwZSBhcyBuZWNlc3NhcnkuCi0KLSAgIENhbGxlZCBqdXN0IGJlZm9yZSBkb2luZyByZWxheGF0aW9uLgotICAgQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCi0gICBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gICBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICAgQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICAgMCB2YWx1ZS4gICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBzZWdUICAgIHNlZ21lbnQ7Ci17Ci0gIGludCAgICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBUaGUgb25seSB0aGluZyB3ZSBoYXZlIHRvIGhhbmRsZSBoZXJlIGFyZSBzeW1ib2xzIG91dHNpZGUgb2YgdGhlCi0gICAgIGN1cnJlbnQgc2VnbWVudC4gIFRoZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGluCi0gICAgIHdoaWNoIGNhc2UgbGlua2VyIHNjcmlwdHMgbWF5IHBsYWNlIHRoZW0gYW55d2hlcmUuCi0gICAgIEhvd2V2ZXIsIHdlIGNhbid0IGZpbmlzaCB0aGUgZnJhZ21lbnQgaGVyZSBhbmQgZW1pdCB0aGUgcmVsb2MgYXMgaW5zbgotICAgICBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG1heSBtb3ZlIHRoZSBpbnNuIGFib3V0LiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQuCi0JIENoYW5nZSB0aGUgcmVsYXhhdGlvbiBzdWJ0eXBlIHRvIHRoZSBtYXggYWxsb3dhYmxlIGFuZCBsZWF2ZQotCSBhbGwgZnVydGhlciBoYW5kbGluZyB0byBtZF9jb252ZXJ0X2ZyYWcuICAqLwotICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCi0jaWYgMCAvKiBDYW4ndCB1c2UgdGhpcywgYnV0IGxlYXZlIGluIGZvciBpbGx1c3RyYXRpb24uICAqLyAgICAgCi0gICAgICAvKiBDaGFuZ2UgMTYgYml0IGluc24gdG8gMzIgYml0IGluc24uICAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSB8PSAweDgwOwotCi0gICAgICAvKiBJbmNyZWFzZSBrbm93biAoZml4ZWQpIHNpemUgb2YgZnJhZ21lbnQuICAqLwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCi0gICAgICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSAvKiBwY3JlbCAqLywKLQkgICAgICAgLyogRklYTUU6IENhbid0IHVzZSBhIHJlYWwgQkZEIHJlbG9jIGhlcmUuCi0JCSAgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyBjYW4ndCBoYW5kbGUgaXQuICAqLwotCSAgICAgICBCRkRfUkVMT0NfRlIzMF8yNl9QQ1JFTCk7Ci0KLSAgICAgIC8qIE1hcmsgdGhpcyBmcmFnbWVudCBhcyBmaW5pc2hlZC4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLSNlbHNlCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLQlpbnQgICAgICAgICAgICAgICBpOwotCi0JLyogVXBkYXRlIHRoZSByZWNvcmRlZCBpbnNuLgotCSAgIEZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgdG8gbG9vayB2ZXJ5IGZhci4KLQkgICBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gcmVjb3JkIGluIHRoZSBpbnN0cnVjdGlvbiB0aGUgbmV4dCBoaWdoZXIKLQkgICByZWxheGFibGUgaW5zbiB0byB1c2UuICAqLwotCWZvciAoaSA9IDAsIGluc24gPSBmcmFnUC0+ZnJfY2dlbi5pbnNuOyBpIDwgNDsgaSsrLCBpbnNuKyspCi0JICB7Ci0JICAgIGlmICgoc3RyY21wIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pLAotCQkJIENHRU5fSU5TTl9NTkVNT05JQyAoZnJhZ1AtPmZyX2NnZW4uaW5zbikpCi0JCSA9PSAwKQotCQkmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSkKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoaSA9PSA0KQotCSAgYWJvcnQgKCk7Ci0KLQlmcmFnUC0+ZnJfY2dlbi5pbnNuID0gaW5zbjsKLQlyZXR1cm4gMjsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19IAotCi0vKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCi0gICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplLgotCi0gICBDYWxsZWQgYWZ0ZXIgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZC4KLSAgIGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICAgZnJhZ1AtPmZyX3N1YnR5cGUgaXMgdGhlIHN1YnR5cGUgb2Ygd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKiAgIGFiZmQ7Ci0gIHNlZ1QgICAgc2VjOwotICBmcmFnUyAqIGZyYWdQOwotewotI2lmIDAKLSAgY2hhciAqIG9wY29kZTsKLSAgY2hhciAqIGRpc3BsYWNlbWVudDsKLSAgaW50ICAgIHRhcmdldF9hZGRyZXNzOwotICBpbnQgICAgb3Bjb2RlX2FkZHJlc3M7Ci0gIGludCAgICBleHRlbnNpb247Ci0gIGludCAgICBhZGRlbmQ7Ci0KLSAgb3Bjb2RlID0gZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICAqLwotICBvcGNvZGVfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSAxIDoKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMiA6Ci0gICAgICBvcGNvZGVbMF0gfD0gMHg4MDsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMyA6Ci0gICAgICBvcGNvZGVbMl0gPSBvcGNvZGVbMF0gfCAweDgwOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGUsIFBBUl9OT1BfSU5TTiwgMik7Ci0gICAgICBvcGNvZGVfYWRkcmVzcyArPSAyOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzNdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKLSAgICB7Ci0gICAgICAvKiBzeW1ib2wgbXVzdCBiZSByZXNvbHZlZCBieSBsaW5rZXIgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfb2Zmc2V0ICYgMykKLQlhc193YXJuIChfKCJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIikpOwotICAgICAgYWRkZW5kID0gZnJhZ1AtPmZyX29mZnNldCA+PiAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkZHJlc3Mgd2Ugd2FudCB0byByZWFjaCBpbiBmaWxlIHNwYWNlLiAgKi8KLSAgICAgIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgICAgIHRhcmdldF9hZGRyZXNzICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0gICAgICBhZGRlbmQgPSAodGFyZ2V0X2FkZHJlc3MgLSAob3Bjb2RlX2FkZHJlc3MgJiAtNCkpID4+IDI7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIHN5bWJvbHMgdGhhdCBtdXN0IGJlIHJlc29sdmVkIGJ5IHRoZSBsaW5rZXIuCi0gICAgIE90aGVyd2lzZSBvdXRwdXQgdGhlIGNvbXBsZXRlZCBpbnNuLiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQotICAgIHsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMSk7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9jZ2VuLmluc24gIT0gMCk7Ci0gICAgICBnYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWdQLAotCQkJICAgICAvKiBPZmZzZXQgb2YgYnJhbmNoIGluc24gaW4gZnJhZy4gICovCi0JCQkgICAgIGZyYWdQLT5mcl9maXggKyBleHRlbnNpb24gLSA0LAotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5pbnNuLAotCQkJICAgICA0IC8qbGVuZ3RoKi8sCi0JCQkgICAgIC8qIEZJWE1FOiBxdWljayBoYWNrICovCi0jaWYgMAotCQkJICAgICBDR0VOX09QRVJBTkRfRU5UUlkgKGZyYWdQLT5mcl9jZ2VuLm9waW5kZXgpLAotI2Vsc2UKLQkJCSAgICAgQ0dFTl9PUEVSQU5EX0VOVFJZIChGUjMwX09QRVJBTkRfRElTUDI0KSwKLSNlbmRpZgotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5vcGluZm8sCi0JCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgIH0KLQotI2RlZmluZSBTSVpFX0ZST01fUkVMQVhfU1RBVEUobikgKChuKSA9PSAxID8gMSA6IDMpCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChkaXNwbGFjZW1lbnQsICh2YWx1ZVQpIGFkZGVuZCwKLQkJICAgICAgU0laRV9GUk9NX1JFTEFYX1NUQVRFIChmcmFnUC0+ZnJfc3VidHlwZSkpOwotCi0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotI2VuZGlmCi19Ci0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWMpCi0gICAgIGZpeFMgKiBmaXhQOwotICAgICBzZWdUICAgc2VjOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWMpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIChvciBpcyBkZWZpbmVkIGJ1dCBub3QgaW4gdGhpcyBzZWN0aW9uKS4KLQkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUpICYgfjE7Ci19Ci0KLS8qIFJldHVybiB0aGUgYmZkIHJlbG9jIHR5cGUgZm9yIE9QRVJBTkQgb2YgSU5TTiBhdCBmaXh1cCBGSVhQLgotICAgUmV0dXJucyBCRkRfUkVMT0NfTk9ORSBpZiBubyByZWxvYyB0eXBlIGNhbiBiZSBmb3VuZC4KLSAgICpGSVhQIG1heSBiZSBtb2RpZmllZCBpZiBkZXNpcmVkLiAgKi8KLQotYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1tZF9jZ2VuX2xvb2t1cF9yZWxvYyAoaW5zbiwgb3BlcmFuZCwgZml4UCkKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogICAgaW5zbjsKLSAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKLSAgICAgZml4UyAqICAgICAgICAgICAgICAgZml4UDsKLXsKLSAgc3dpdGNoIChvcGVyYW5kLT50eXBlKQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDk6ICBmaXhQLT5meF9wY3JlbCA9IDE7IHJldHVybiBCRkRfUkVMT0NfRlIzMF85X1BDUkVMOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTI6IGZpeFAtPmZ4X3BjcmVsID0gMTsgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMDogIHJldHVybiBCRkRfUkVMT0NfRlIzMF8xMF9JTl84OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5OiAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF85X0lOXzg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDg6ICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzhfSU5fODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDY6ICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfNl9JTl80OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4OiAgICAgIHJldHVybiBCRkRfUkVMT0NfODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzI6ICAgICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfNDg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwOiAgICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzIwOwotICAgIGRlZmF1bHQgOiAvKiBhdm9pZCAtV2FsbCB3YXJuaW5nICovCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotfQotCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi0KLWludAotZnIzMF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKiBmaXg7Ci17Ci0gIGlmICggICBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50ICAgIG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgICB0eXBlOwotICAgICBjaGFyICogbGl0UDsKLSAgICAgaW50ICogIHNpemVQOwotewotICBpbnQgICAgICAgICAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgICB3b3JkcyBbTUFYX0xJVFRMRU5VTVNdOwotICBjaGFyICogICAgICAgICAgIHQ7Ci0gIGNoYXIgKiAgICAgICAgICAgYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAvKiBGSVhNRTogU29tZSB0YXJnZXRzIGFsbG93IG90aGVyIGZvcm1hdCBjaGFycyBmb3IgYmlnZ2VyIHNpemVzIGhlcmUuICAqLwotCi0gICAgZGVmYXVsdDoKLSAgICAgICogc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKiBzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdvcmtlciBmdW5jdGlvbiBmb3IgZnIzMF9pc19jb2xvbl9pbnNuKCkuICAqLwotc3RhdGljIGNoYXIKLXJlc3RvcmVfY29sb24gKGFkdmFuY2VfaV9sX3BfYnkpCi0gICAgIGludCBhZHZhbmNlX2lfbF9wX2J5OwotewotICBjaGFyIGM7Ci0gIAotICAvKiBSZXN0b3JlIHRoZSBjb2xvbiwgYW5kIGFkdmFuY2UgaW5wdXRfbGluZV9wb2ludGVyIHRvCi0gICAgIHRoZSBlbmQgb2YgdGhlIG5ldyBzeW1ib2wuICAqLwotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9ICc6JzsKLSAgaW5wdXRfbGluZV9wb2ludGVyICs9IGFkdmFuY2VfaV9sX3BfYnk7Ci0gIGMgPSAqIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICAKLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIERldGVybWluZXMgaWYgdGhlIHN5bWJvbCBzdGFydGluZyBhdCBTVEFSVCBhbmQgZW5kaW5nIGluCi0gICBhIGNvbG9uIHRoYXQgd2FzIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IElOUFVUX0xJTkVfUE9JTlRFUgotICAgKGJ1dCB3aGljaCBoYXMgbm93IGJlZW4gcmVwbGFjZWQgYnUgYSBOVUwpIGlzIGluIGZhY3QgYW4KLSAgIExESTo4LCBMREk6MjAsIExESTozMiwgQ0FMTDpELiBKTVA6RCwgUkVUOkQgb3IgQmNjOkQgaW5zdHJ1Y3Rpb24uCi0gICBJZiBpdCBpcywgdGhlbiBpdCByZXN0b3JlcyB0aGUgY29sb24sIGFkdmFuY2VzIElOUFVUX0xJTkVfUE9JTlRFUgotICAgdG8gdGhlIHJlYWwgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi9zeW1ib2wsIGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIKLSAgIHRoYXQgcmVhbGx5IHRlcm1pbmF0ZWQgdGhlIHN5bWJvbC4gIE90aGVyd2lzZSBpdCByZXR1cm5zIDAuICAqLwotY2hhcgotZnIzMF9pc19jb2xvbl9pbnNuIChzdGFydCkKLSAgICAgY2hhciAqICBzdGFydDsKLXsKLSAgY2hhciAqIGlfbF9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc3ltYm9sIHBhcnNlZCBzbyBmYXIgaXMgJ2xkaScgICovCi0gIGlmICggICAoc3RhcnRbMF0gIT0gJ2wnICYmIHN0YXJ0WzBdICE9ICdMJykKLSAgICAgIHx8IChzdGFydFsxXSAhPSAnZCcgJiYgc3RhcnRbMV0gIT0gJ0QnKQotICAgICAgfHwgKHN0YXJ0WzJdICE9ICdpJyAmJiBzdGFydFsyXSAhPSAnSScpCi0gICAgICB8fCBzdGFydFszXSAhPSAwKQotICAgIHsKLSAgICAgIC8qIE5vcGUgLSBjaGVjayB0byBzZWUgYSAnZCcgZm9sbG93cyB0aGUgY29sb24uICAqLwotICAgICAgaWYgKCAgIChpX2xfcFsxXSA9PSAnZCcgfHwgaV9sX3BbMV0gPT0gJ0QnKQotCSAgJiYgKGlfbF9wWzJdID09ICcgJyB8fCBpX2xfcFsyXSA9PSAnXHQnIHx8IGlfbF9wWzJdID09ICdcbicpKQotCXsKLQkgIC8qIFl1cCAtIGl0IG1pZ2h0IGJlIGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb24uICAqLwotCSAgaW50ICAgICAgICAgICBpOwotCSAgc3RhdGljIGNoYXIgKiBkZWxheV9pbnNucyBbXSA9Ci0JICB7Ci0JICAgICJjYWxsIiwgImptcCIsICJyZXQiLCAiYnJhIiwgImJubyIsCi0JICAgICJiZXEiLCAgImJuZSIsICJiYyIsICAiYm5jIiwgImJuIiwKLQkgICAgImJwIiwgICAiYnYiLCAgImJudiIsICJibHQiLCAiYmdlIiwKLQkgICAgImJsZSIsICAiYmd0IiwgImJscyIsICJiaGkiCi0JICB9OwotCi0JICBmb3IgKGkgPSBzaXplb2YgKGRlbGF5X2luc25zKSAvIHNpemVvZiAoZGVsYXlfaW5zbnNbMF0pOyBpLS07KQotCSAgICB7Ci0JICAgICAgY2hhciAqIGluc24gPSBkZWxheV9pbnNuc1tpXTsKLQkgICAgICBpbnQgICAgbGVuICA9IHN0cmxlbiAoaW5zbik7Ci0KLQkgICAgICBpZiAoc3RhcnQgW2xlbl0gIT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgCi0JICAgICAgd2hpbGUgKGxlbiAtLSkKLQkJaWYgKHRvbG93ZXIgKHN0YXJ0IFtsZW5dKSAhPSBpbnNuIFtsZW5dKQotCQkgIGJyZWFrOwotCSAgICAgIAotCSAgICAgIGlmIChsZW4gPT0gLTEpCi0JCXJldHVybiByZXN0b3JlX2NvbG9uICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogTm9wZSAtIGl0IGlzIGEgbm9ybWFsIGxhYmVsLiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnOCcgKi8KLSAgaWYgKGlfbF9wWzFdID09ICc4JyAmJiAoaV9sX3BbMl0gPT0gJyAnIHx8IGlfbF9wWzJdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgyKTsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnMjAnICovCi0gIGVsc2UgaWYgKGlfbF9wWzFdID09ICcyJyAmJiBpX2xfcFsyXSA9PScwJyAmJiAoaV9sX3BbM10gPT0gJyAnIHx8IGlfbF9wWzNdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgzKTsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnMzInICovCi0gIGVsc2UgaWYgKGlfbF9wWzFdID09ICczJyAmJiBpX2xfcFsyXSA9PScyJyAmJiAoaV9sX3BbM10gPT0gJyAnIHx8IGlfbF9wWzNdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgzKTsKLQotICByZXR1cm4gMDsKLX0KLQotYm9vbGVhbgotZnIzMF9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKiBmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0jaWYgMCAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWZyMzAuaCBiL2dhcy9jb25maWcvdGMtZnIzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjcyZDhiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZnIzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogdGMtZnIzMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1mcjMwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19GUjMwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogbGVhZGluZyBzcGFjZSBzbyB3aWxsIGNvbXBpbGUgd2l0aCBjYyAqLwotICNlcnJvciBGUjMwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkZSMzAgR0FTICIKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfZnIzMAotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWZyMzAiCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLWxvbmcgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCkpOwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9hcHBseV9maXgzIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgZnIzMF9maXhfYWRqdXN0YWJsZSAoZml4UCkKLWV4dGVybiBib29sZWFuIGZyMzBfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gZW1pdCB2YXJpb3VzIHJlbG9jcyB3ZSBvdGhlcndpc2Ugd291bGRuJ3QuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgZnIzMF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IGZyMzBfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSB0Y19nZW5fcmVsb2MgZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jCi0KLS8qIENhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKCksIG5vdCBtZF9wY3JlbF9mcm9tKCkuICAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLWV4dGVybiBsb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLQotLyogRm9yIDggdnMgMTYgdnMgMzIgYml0IGJyYW5jaCBzZWxlY3Rpb24uICAqLwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLQotLyogV2UgbmVlZCBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgVENfU1RBUlRfTEFCRUwgbWFjcm8gc28gdGhhdCB3ZQotICAgYWxsb3cgdGhlIExESTo4LCBMREk6MjAsIExESTozMiBhbmQgZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgdG8gYmUKLSAgIHBhcnNlZCBhcyBzdWNoLiAgTm90ZSAtIGluIGEgSE9SUklCTEUgSEFDSywgd2UgbWFrZSB1c2Ugb2YgdGhlCi0gICBrbm93bGVkZ2UgdGhhdCB0aGlzIG1hcmNvIGlzIG9ubHkgZXZlciBldmFsdWF0ZWQgaW4gb25lIHBsYWNlCi0gICAocmVhZF9hX3NvdXJjZV9maWxlIGluIHJlYWQuYykgd2hlcmUgd2UgY2FuIGFjY2VzcyB0aGUgbG9jYWwKLSAgIHZhcmlhYmxlICdzJyAtIHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIHRoYXQgd2FzIHRlcm1pbmF0ZWQgYnkKLSAgICdjaGFyYWN0ZXInLiAgQWxzbyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZgotICAgdGhlIGxvY2FsIHZhcmlhYmxlICdjJyB3aGljaCBpcyBwYXNzZWQgdG8gdGhpcyBtYWNybyBhcyAnY2hhcmFjdGVyJy4gICovCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoYXJhY3RlciwgaV9sX3ApCQkJXAotICAoKGNoYXJhY3RlcikgIT0gJzonID8gMCA6IChjaGFyYWN0ZXIgPSBmcjMwX2lzX2NvbG9uX2luc24gKHMpKSA/IDAgOiAoKGNoYXJhY3RlciA9ICc6JyksIDEpKQotZXh0ZXJuIGNoYXIgZnIzMF9pc19jb2xvbl9pbnNuIFBBUkFNUyAoKGNoYXIgKikpOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmMgYi9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuaCBiL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmRmMDIwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWdlbmVyaWMuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyB0Yy1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yIHRhcmdldCBjcHUKLSAqIHNwZWNpZmljIGhlYWRlciBmaWxlcy4gIEl0IGlzIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSBjb21waWxlLiAgSXQgaXMgYWxzbwotICogbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIGdyb3cgaW50byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBib3RoIGEKLSAqIHRlbXBsYXRlIGZvciBwb3J0aW5nLCBhbmQgYSBzdHViIGZvciB0ZXN0aW5nLiAgeG94b3JpY2guCi0gKi8KLQotI2RlZmluZSBUQ19HRU5FUklDIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy1nZW5lcmljLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDgzMDAuYyBiL2dhcy9jb25maWcvdGMtaDgzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1YWRhMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWg4MzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk1ICswLDAgQEAKLS8qIHRjLWg4MzAwLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgSDgvMzAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0gIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgc2FjQGN5Z251cy5jb20KLSAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2RlZmluZSBoOF9vcGNvZGVzIG9wcwotI2luY2x1ZGUgIm9wY29kZS9oODMwMC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0KLXsnOycsIDB9OwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0KLXswfTsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotdm9pZCBjb25zICgpOwotCi1pbnQgSG1vZGU7Ci1pbnQgU21vZGU7Ci0jZGVmaW5lIFBTSVpFIChIbW9kZSA/IExfMzIgOiBMXzE2KQotI2RlZmluZSBETU9ERSAoTF8xNikKLSNkZWZpbmUgRFNZTU1PREUgKEhtb2RlID8gTF8yNCA6IExfMTYpCi1pbnQgYnNpemUgPSBMXzg7CQkvKiBkZWZhdWx0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKi8KLQotCi12b2lkCi1oODMwMGhtb2RlICgpCi17Ci0gIEhtb2RlID0gMTsKLSAgU21vZGUgPSAwOwotfQotCi12b2lkCi1oODMwMHNtb2RlICgpCi17Ci0gIFNtb2RlID0gMTsKLSAgSG1vZGUgPSAxOwotfQotdm9pZAotc2JyYW5jaCAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGJzaXplID0gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgcGludCAoKQotewotICBjb25zIChIbW9kZSA/IDQgOiAyKTsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLQotICB7Img4MzAwaCIsIGg4MzAwaG1vZGUsIDB9LAotICB7Img4MzAwcyIsIGg4MzAwc21vZGUsIDB9LAotICB7InNicmFuY2giLCBzYnJhbmNoLCBMXzh9LAotICB7ImxicmFuY2giLCBzYnJhbmNoLCBMXzE2fSwKLQotICB7ImludCIsIHBpbnQsIDB9LAotICB7ImRhdGEuYiIsIGNvbnMsIDF9LAotICB7ImRhdGEudyIsIGNvbnMsIDJ9LAotICB7ImRhdGEubCIsIGNvbnMsIDR9LAotICB7ImZvcm0iLCBsaXN0aW5nX3BzaXplLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKgotICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQKLSAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gICovCi0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICBjaGFyIHByZXZfYnVmZmVyWzEwMF07Ci0gIGludCBpZHggPSAwOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLSAgcHJldl9idWZmZXJbMF0gPSAwOwotCi0gIGZvciAob3Bjb2RlID0gaDhfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICAvKiBTdHJpcCBvZmYgYW55IC4gcGFydCB3aGVuIGluc2VydGluZyB0aGUgb3Bjb2RlIGFuZCBvbmx5IGVudGVyCi0gICAgICAgICB1bmlxdWUgY29kZXMgaW50byB0aGUgaGFzaCB0YWJsZQotICAgICAgICAgKi8KLSAgICAgIGNoYXIgKnNyYyA9IG9wY29kZS0+bmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4gKHNyYyk7Ci0gICAgICBjaGFyICpkc3QgPSBtYWxsb2MgKGxlbiArIDEpOwotICAgICAgY2hhciAqYnVmZmVyID0gZHN0OwotCi0gICAgICBvcGNvZGUtPnNpemUgPSAwOwotICAgICAgd2hpbGUgKCpzcmMpCi0JewotCSAgaWYgKCpzcmMgPT0gJy4nKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgb3Bjb2RlLT5zaXplID0gKnNyYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKmRzdCsrID0gKnNyYysrOwotCX0KLSAgICAgICpkc3QrKyA9IDA7Ci0gICAgICBpZiAoc3RyY21wIChidWZmZXIsIHByZXZfYnVmZmVyKSkKLQl7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgYnVmZmVyLCAoY2hhciAqKSBvcGNvZGUpOwotCSAgc3RyY3B5IChwcmV2X2J1ZmZlciwgYnVmZmVyKTsKLQkgIGlkeCsrOwotCX0KLSAgICAgIG9wY29kZS0+aWR4ID0gaWR4OwotCi0KLSAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyAqLwotICAgICAgb3Bjb2RlLT5ub3BlcmFuZHMgPSAwOwotICAgICAgd2hpbGUgKG9wY29kZS0+YXJncy5uaWJbb3Bjb2RlLT5ub3BlcmFuZHNdICE9IEUpCi0Jb3Bjb2RlLT5ub3BlcmFuZHMrKzsKLSAgICAgIC8qIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgb3Bjb2RlIGluIGJ5dGVzICovCi0gICAgICBvcGNvZGUtPmxlbmd0aCA9IDA7Ci0gICAgICB3aGlsZSAob3Bjb2RlLT5kYXRhLm5pYltvcGNvZGUtPmxlbmd0aCAqIDJdICE9IEUpCi0Jb3Bjb2RlLT5sZW5ndGgrKzsKLSAgICB9Ci0KLSAgbGlua3JlbGF4ID0gMTsKLX0KLQotCi1zdHJ1Y3QgaDhfZXhwCi17Ci0gIGNoYXIgKmVfYmVnOwotICBjaGFyICplX2VuZDsKLSAgZXhwcmVzc2lvblMgZV9leHA7Ci19OwotaW50IGRpc3ByZWc7Ci1pbnQgb3BzaXplOwkJCS8qIFNldCB3aGVuIGEgcmVnaXN0ZXIgc2l6ZSBpcyBzZWVuICovCi0KLQotc3RydWN0IGg4X29wCi17Ci0gIG9wX3R5cGUgbW9kZTsKLSAgdW5zaWduZWQgcmVnOwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi0vKgotICBwYXJzZSBvcGVyYW5kcwotICBXUkVHIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHI3LGZwLHNwCi0gIHIwbCxyMGgsLi5yN2wscjdoCi0gIEBXUkVHCi0gIEBXUkVHKwotICBALVdSRUcKLSAgI2NvbnN0Ci0gIGNjcgotKi8KLQotLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLwotaW50Ci1wYXJzZV9yZWcgKHNyYywgbW9kZSwgcmVnLCBkaXJlY3Rpb24pCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgb3BfdHlwZSAqbW9kZTsKLSAgICAgdW5zaWduZWQgaW50ICpyZWc7Ci0gICAgIGludCBkaXJlY3Rpb247Ci0KLXsKLSAgY2hhciAqZW5kOwotICBpbnQgbGVuOwotCi0gIC8qIENyaWJiZWQgZnJvbSBnZXRfc3ltYm9sX2VuZCgpLiAgKi8KLSAgaWYgKCFpc19uYW1lX2JlZ2lubmVyICgqc3JjKSB8fCAqc3JjID09ICdcMDAxJykKLSAgICByZXR1cm4gMDsKLSAgZW5kID0gc3JjKzE7Ci0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCplbmQpIHx8ICplbmQgPT0gJ1wwMDEnKQotICAgIGVuZCsrOwotICBsZW4gPSBlbmQgLSBzcmM7Ci0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAncycgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFBTSVpFIHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IDc7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnYycgJiYgc3JjWzFdID09ICdjJyAmJiBzcmNbMl0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gQ0NSOwotICAgICAgKnJlZyA9IDA7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICd4JyAmJiBzcmNbMl0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gRVhSOwotICAgICAgKnJlZyA9IDA7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFBTSVpFIHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IDY7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICdyJwotICAgICAgJiYgc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzcnKQotICAgIHsKLSAgICAgICptb2RlID0gTF8zMiB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSBzcmNbMl0gLSAnMCc7Ci0gICAgICBpZiAoIUhtb2RlKQotCWFzX3dhcm4gKF8oIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIpKTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnNycpCi0gICAgewotICAgICAgKm1vZGUgPSBMXzE2IHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IHNyY1sxXSAtICcwJyArIDg7Ci0gICAgICBpZiAoIUhtb2RlKQotCWFzX3dhcm4gKF8oIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIpKTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnNycpCi0JewotCSAgaWYgKGxlbiA9PSAzICYmIHNyY1syXSA9PSAnbCcpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IExfOCB8IFJFRyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcmVnID0gKHNyY1sxXSAtICcwJykgKyA4OwotCSAgICAgIHJldHVybiBsZW47Ci0JICAgIH0KLQkgIGlmIChsZW4gPT0gMyAmJiBzcmNbMl0gPT0gJ2gnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBMXzggfCBSRUcgfCBkaXJlY3Rpb247Ci0JICAgICAgKnJlZyA9IChzcmNbMV0gLSAnMCcpOwotCSAgICAgIHJldHVybiBsZW47Ci0JICAgIH0KLQkgIGlmIChsZW4gPT0gMikKLQkgICAgewotCSAgICAgICptb2RlID0gTF8xNiB8IFJFRyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcmVnID0gKHNyY1sxXSAtICcwJyk7Ci0JICAgICAgcmV0dXJuIGxlbjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotcGFyc2VfZXhwIChzLCBvcCkKLSAgICAgY2hhciAqczsKLSAgICAgZXhwcmVzc2lvblMgKiBvcDsKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqbmV3OwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKG9wKTsKLSAgaWYgKG9wLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXNraXBfY29sb250aGluZyAocHRyLCBleHAsIG1vZGUpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50ICptb2RlOwotewotICBpZiAoKnB0ciA9PSAnOicpCi0gICAgewotICAgICAgcHRyKys7Ci0gICAgICAqbW9kZSAmPSB+U0laRTsKLSAgICAgIGlmICgqcHRyID09ICc4JykKLQl7Ci0JICBwdHIrKzsKLQkgIC8qIGZmIGZpbGwgYW55IDggYml0IHF1YW50aXR5ICovCi0JIC8qIGV4cC0+WF9hZGRfbnVtYmVyIC09IDB4MTAwOyovCi0JICAqbW9kZSB8PSBMXzg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgqcHRyID09ICcyJykKLQkgICAgewotCSAgICAgICptb2RlIHw9IExfMjQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwdHIgPT0gJzMnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgfD0gTF8zMjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnB0ciA9PSAnMScpCi0JICAgIHsKLQkgICAgICAqbW9kZSB8PSBMXzE2OwotCSAgICB9Ci0JICB3aGlsZSAoaXNkaWdpdCAoKnB0cikpCi0JICAgIHB0cisrOwotCX0KLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6Ci0KLSAgIFJuCQkJUmVnaXN0ZXIgZGlyZWN0Ci0gICBAUm4JCQlSZWdpc3RlciBpbmRpcmVjdAotICAgQChleHBbOjE2XSwgUm4pCVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0gICBAUm4rCi0gICBALVJuCi0gICBAYWE6OAkJCWFic29sdXRlIDggYml0Ci0gICBAYWE6MTYJCQlhYnNvbHV0ZSAxNiBiaXQKLSAgIEBhYQkJCWFic29sdXRlIDE2IGJpdAotCi0gICAjeHhbOnNpemVdCQlpbW1lZGlhdGUgZGF0YQotICAgQChleHA6WzhdLCBwYykJCXBjIHJlbAotICAgQEBhYVs6OF0JCW1lbW9yeSBpbmRpcmVjdAotCi0gICAqLwotCi1jaGFyICoKLWNvbG9ubW9kMjQgKG9wLCBzcmMpCi0gICAgIHN0cnVjdCBoOF9vcCAqb3A7Ci0gICAgIGNoYXIgKnNyYzsKLQotewotICBpbnQgbW9kZSA9IDA7Ci0gIHNyYyA9IHNraXBfY29sb250aGluZyAoc3JjLCAmb3AtPmV4cCwgJm1vZGUpOwotCi0gIGlmICghbW9kZSkKLSAgICB7Ci0gICAgICAvKiBDaG9vc2UgYSBkZWZhdWx0IG1vZGUgKi8KLSAgICAgIGlmIChvcC0+ZXhwLlhfYWRkX251bWJlciA8IC0zMjc2OAotCSAgfHwgb3AtPmV4cC5YX2FkZF9udW1iZXIgPiAzMjc2NykKLQl7Ci0JICBpZiAoSG1vZGUpCi0JICAgIG1vZGUgPSBMXzI0OwotCSAgZWxzZQotCSAgICBtb2RlID0gTF8xNjsKLQl9Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhwLlhfYWRkX3N5bWJvbAotCSAgICAgICB8fCBvcC0+ZXhwLlhfb3Bfc3ltYm9sKQotCW1vZGUgPSBEU1lNTU9ERTsKLSAgICAgIGVsc2UKLQltb2RlID0gRE1PREU7Ci0gICAgfQotICBvcC0+bW9kZSB8PSBtb2RlOwotICByZXR1cm4gc3JjOwotCi19Ci0KLQotc3RhdGljIHZvaWQKLWdldF9vcGVyYW5kIChwdHIsIG9wLCBkc3QsIGRpcmVjdGlvbikKLSAgICAgY2hhciAqKnB0cjsKLSAgICAgc3RydWN0IGg4X29wICpvcDsKLSAgICAgdW5zaWduZWQgaW50IGRzdDsKLSAgICAgaW50IGRpcmVjdGlvbjsKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgb3BfdHlwZSBtb2RlOwotICB1bnNpZ25lZCBpbnQgbnVtOwotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIG9wLT5tb2RlID0gRTsKLQotICAvKiBHcm9zcy4gIEdyb3NzLiAgbGRtIGFuZCBzdG0gaGF2ZSBhIGZvcm1hdCBub3QgZWFzaWx5IGhhbmRsZWQKLSAgICAgYnkgZ2V0X29wZXJhbmQuICBXZSBkZWFsIHdpdGggaXQgZXhwbGljaXRseSBoZXJlLiAgKi8KLSAgaWYgKHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICdyJyAmJiBpc2RpZ2l0KHNyY1syXSkKLSAgICAgICYmIHNyY1szXSA9PSAnLScgJiYgc3JjWzRdID09ICdlJyAmJiBzcmNbNV0gPT0gJ3InICYmIGlzZGlnaXQoc3JjWzZdKSkKLSAgICB7Ci0gICAgICBpbnQgbG93LCBoaWdoOwotCi0gICAgICBsb3cgPSBzcmNbMl0gLSAnMCc7Ci0gICAgICBoaWdoID0gc3JjWzZdIC0gJzAnOwotCi0gICAgICBpZiAoaGlnaCA8IGxvdykKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIikpOwotCi0gICAgICBpZiAobG93ICUgMikKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIikpOwotCi0gICAgICBpZiAoaGlnaCAtIGxvdyA+IDMpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIpKTsKLQotICAgICAgaWYgKGhpZ2ggLSBsb3cgIT0gMQotCSAgJiYgbG93ICUgNCkKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIikpOwotCi0gICAgICAvKiBFdmVuIHNpY2tlci4gIFdlIGVuY29kZSB0d28gcmVnaXN0ZXJzIGludG8gb3AtPnJlZy4gIE9uZQotCSBmb3IgdGhlIGxvdyByZWdpc3RlciB0byBzYXZlLCB0aGUgb3RoZXIgZm9yIHRoZSBoaWdoCi0JIHJlZ2lzdGVyIHRvIHNhdmU7ICB3ZSBhbHNvIHNldCB0aGUgaGlnaCBiaXQgaW4gb3AtPnJlZwotCSBzbyB3ZSBrbm93IHRoaXMgaXMgInZlcnkgc3BlY2lhbCIuICAqLwotICAgICAgb3AtPnJlZyA9IDB4ODAwMDAwMDAgfCAoaGlnaCA8PCA4KSB8IGxvdzsKLSAgICAgIG9wLT5tb2RlID0gUkVHOwotICAgICAgKnB0ciA9IHNyYyArIDc7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmb3AtPm1vZGUsICZvcC0+cmVnLCBkaXJlY3Rpb24pOwotICBpZiAobGVuKQotICAgIHsKLSAgICAgICpwdHIgPSBzcmMgKyBsZW47Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3JjID09ICdAJykKLSAgICB7Ci0gICAgICBzcmMrKzsKLSAgICAgIGlmICgqc3JjID09ICdAJykKLQl7Ci0JICBzcmMrKzsKLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7Ci0KLQkgIHNyYyA9IHNraXBfY29sb250aGluZyAoc3JjLCAmb3AtPmV4cCwgJm9wLT5tb2RlKTsKLQotCSAgKnB0ciA9IHNyYzsKLQotCSAgb3AtPm1vZGUgPSBNRU1JTkQ7Ci0JICByZXR1cm47Ci0KLQl9Ci0KLQotICAgICAgaWYgKCpzcmMgPT0gJy0nKQotCXsKLQkgIHNyYysrOwotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmbnVtLCBkaXJlY3Rpb24pOwotCSAgaWYgKGxlbiA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogT29wcywgbm90IGEgcmVnIGFmdGVyIGFsbCwgbXVzdCBiZSBvcmRpbmFyeSBleHAgKi8KLQkgICAgICBzcmMtLTsKLQkgICAgICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCi0JICAgICAgb3AtPm1vZGUgPSBBQlMgfCBQU0laRSB8IGRpcmVjdGlvbjsKLQkgICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChwYXJzZV9leHAgKHNyYywgJm9wLT5leHApLAotCQkJCSAgICAgICZvcC0+ZXhwLCAmb3AtPm1vZGUpOwotCi0JICAgICAgcmV0dXJuOwotCi0KLQkgICAgfQotCi0KLQkgIGlmICgobW9kZSAmIFNJWkUpICE9IFBTSVpFKQotCSAgICBhc19iYWQgKF8oIldyb25nIHNpemUgcG9pbnRlciByZWdpc3RlciBmb3IgYXJjaGl0ZWN0dXJlLiIpKTsKLQkgIG9wLT5tb2RlID0gUkRERUM7Ci0JICBvcC0+cmVnID0gbnVtOwotCSAgKnB0ciA9IHNyYyArIGxlbjsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoKnNyYyA9PSAnKCcpCi0JewotCSAgLyogRGlzcCAqLwotCSAgc3JjKys7Ci0KLQkgIC8qIFN0YXJ0IG9mZiBhc3N1bWluZyBhIDE2IGJpdCBvZmZzZXQgKi8KLQotCi0JICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotCi0JICBzcmMgPSBjb2xvbm1vZDI0IChvcCwgc3JjKTsKLQotCSAgaWYgKCpzcmMgPT0gJyknKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgb3AtPm1vZGUgfD0gQUJTIHwgZGlyZWN0aW9uOwotCSAgICAgICpwdHIgPSBzcmM7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGlmICgqc3JjICE9ICcsJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIpKTsKLQkgICAgICByZXR1cm47Ci0KLQkgICAgfQotCSAgc3JjKys7Ci0KLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm9wLT5yZWcsIGRpcmVjdGlvbik7Ci0JICBpZiAobGVuID09IDAgfHwgIShtb2RlICYgUkVHKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIG9wLT5tb2RlIHw9IERJU1AgfCBkaXJlY3Rpb247Ci0JICBkaXNwcmVnID0gb3AtPnJlZzsKLQkgIHNyYyArPSBsZW47Ci0JICBzcmMgPSBza2lwX2NvbG9udGhpbmcgKHNyYywgJm9wLT5leHAsICZvcC0+bW9kZSk7Ci0KLQkgIGlmICgqc3JjICE9ICcpJyAmJiAnKCcpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCByZWcxNikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAqcHRyID0gc3JjICsgMTsKLQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm51bSwgZGlyZWN0aW9uKTsKLQotICAgICAgaWYgKGxlbikKLQl7Ci0JICBzcmMgKz0gbGVuOwotCSAgaWYgKCpzcmMgPT0gJysnKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgaWYgKChtb2RlICYgU0laRSkgIT0gUFNJWkUpCi0JCWFzX2JhZCAoXygiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIikpOwotCSAgICAgIG9wLT5tb2RlID0gUlNJTkM7Ci0JICAgICAgb3AtPnJlZyA9IG51bTsKLQkgICAgICAqcHRyID0gc3JjOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgaWYgKChtb2RlICYgU0laRSkgIT0gUFNJWkUpCi0JICAgIGFzX2JhZCAoXygiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIikpOwotCi0JICBvcC0+bW9kZSA9IGRpcmVjdGlvbiB8IElORCB8IFBTSVpFOwotCSAgb3AtPnJlZyA9IG51bTsKLQkgICpwdHIgPSBzcmM7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbXVzdCBiZSBhIHN5bWJvbCAqLwotCi0JICBvcC0+bW9kZSA9IEFCUyB8IGRpcmVjdGlvbjsKLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7Ci0KLQkgICpwdHIgPSBjb2xvbm1vZDI0IChvcCwgc3JjKTsKLQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLQotICBpZiAoKnNyYyA9PSAnIycpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICBvcC0+bW9kZSA9IElNTTsKLSAgICAgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7Ci0gICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmb3AtPm1vZGUpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChzcmMsICJtYWNoIiwgNCkgPT0gMAotCSAgIHx8IHN0cm5jbXAgKHNyYywgIm1hY2wiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIG9wLT5yZWcgPSBzcmNbM10gPT0gJ2wnOwotICAgICAgb3AtPm1vZGUgPSBNQUNSRUc7Ci0gICAgICAqcHRyID0gc3JjICsgNDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotICAgICAgLyogVHJhaWxpbmcgJzonIHNpemUgPyAqLwotICAgICAgaWYgKCpzcmMgPT0gJzonKQotCXsKLQkgIGlmIChzcmNbMV0gPT0gJzEnICYmIHNyY1syXSA9PSAnNicpCi0JICAgIHsKLQkgICAgICBvcC0+bW9kZSA9IFBDUkVMIHwgTF8xNjsKLQkgICAgICBzcmMgKz0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3JjWzFdID09ICc4JykKLQkgICAgewotCSAgICAgIG9wLT5tb2RlID0gUENSRUwgfCBMXzg7Ci0JICAgICAgc3JjICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0IDo4IG9yIDoxNiBoZXJlIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wLT5tb2RlID0gUENSRUwgfCBic2l6ZTsKLQl9Ci0gICAgICAqcHRyID0gc3JjOwotICAgIH0KLX0KLQotCi1zdGF0aWMKLWNoYXIgKgotZ2V0X29wZXJhbmRzIChub3BlcmFuZHMsIG9wX2VuZCwgb3BlcmFuZCkKLSAgICAgdW5zaWduZWQgaW50IG5vcGVyYW5kczsKLSAgICAgY2hhciAqb3BfZW5kOwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci17Ci0gIGNoYXIgKnB0ciA9IG9wX2VuZDsKLQotICBzd2l0Y2ggKG5vcGVyYW5kcykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgb3BlcmFuZFswXS5tb2RlID0gMDsKLSAgICAgIG9wZXJhbmRbMV0ubW9kZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwLCBTUkMpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXsKLQkgIHB0cisrOwotCSAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxLCBEU1QpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcGVyYW5kWzFdLm1vZGUgPSAwOwotCX0KLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDAsIFNSQyk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEsIERTVCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gICAqLwotc3RhdGljCi1zdHJ1Y3QgaDhfb3Bjb2RlICoKLWdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kcywgc2l6ZSkKLSAgICAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmRzOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGg4X29wY29kZSAqdGhpc190cnkgPSBvcGNvZGU7Ci0gIGludCBmb3VuZCA9IDA7Ci0KLSAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSBvcGNvZGUtPmlkeDsKLQotICAvKiBUaGVyZSdzIG9ubHkgb25lIGxkbS9zdG0gYW5kIGl0J3MgZWFzaWVyIHRvIGp1c3QKLSAgICAgZ2V0IG91dCBxdWljayBmb3IgdGhlbS4gICovCi0gIGlmIChzdHJjbXAgKG9wY29kZS0+bmFtZSwgInN0bS5sIikgPT0gMAotICAgICAgfHwgc3RyY21wIChvcGNvZGUtPm5hbWUsICJsZG0ubCIpID09IDApCi0gICAgcmV0dXJuIHRoaXNfdHJ5OwotCi0gIHdoaWxlICh0aGlzX2luZGV4ID09IG9wY29kZS0+aWR4ICYmICFmb3VuZCkKLSAgICB7Ci0gICAgICBmb3VuZCA9IDE7Ci0KLSAgICAgIHRoaXNfdHJ5ID0gb3Bjb2RlKys7Ci0gICAgICBpZiAodGhpc190cnktPm5vcGVyYW5kcyA9PSAwKQotCXsKLQkgIGludCB0aGlzX3NpemU7Ci0KLQkgIHRoaXNfc2l6ZSA9IHRoaXNfdHJ5LT5ob3cgJiBTTjsKLQkgIGlmICh0aGlzX3NpemUgIT0gc2l6ZSAmJiAodGhpc19zaXplICE9IFNCIHx8IHNpemUgIT0gU04pKQotCSAgICBmb3VuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgdGhpc190cnktPm5vcGVyYW5kcyAmJiBmb3VuZDsgaSsrKQotCSAgICB7Ci0JICAgICAgb3BfdHlwZSBvcCA9IHRoaXNfdHJ5LT5hcmdzLm5pYltpXTsKLQkgICAgICBpbnQgeCA9IG9wZXJhbmRzW2ldLm1vZGU7Ci0KLQkgICAgICBpZiAoKG9wICYgKERJU1AgfCBSRUcpKSA9PSAoRElTUCB8IFJFRykKLQkJICAmJiAoKHggJiAoRElTUCB8IFJFRykpID09IChESVNQIHwgUkVHKSkpCi0JCXsKLQkJICBkaXNwcmVnID0gb3BlcmFuZHNbaV0ucmVnOwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3AgJiBSRUcpCi0JCXsKLQkJICBpZiAoISh4ICYgUkVHKSkKLQkJICAgIGZvdW5kID0gMDsKLQotCQkgIGlmICh4ICYgTF9QKQotCQkgICAgeCA9ICh4ICYgfkxfUCkgfCAoSG1vZGUgPyBMXzMyIDogTF8xNik7Ci0JCSAgaWYgKG9wICYgTF9QKQotCQkgICAgb3AgPSAob3AgJiB+TF9QKSB8IChIbW9kZSA/IExfMzIgOiBMXzE2KTsKLQotCQkgIG9wc2l6ZSA9IG9wICYgU0laRTsKLQotCQkgIC8qIFRoZSBzaXplIG9mIHRoZSByZWcgaXMgdiBpbXBvcnRhbnQgKi8KLQkJICBpZiAoKG9wICYgU0laRSkgIT0gKHggJiBTSVpFKSkKLQkJICAgIGZvdW5kID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcCAmIEFCU0pNUCkgJiYgKHggJiBBQlMpKQotCQl7Ci0JCSAgb3BlcmFuZHNbaV0ubW9kZSAmPSB+QUJTOwotCQkgIG9wZXJhbmRzW2ldLm1vZGUgfD0gQUJTSk1QOwotCQkgIC8qIEJ1dCBpdCBtYXkgbm90IGJlIDI0IGJpdHMgbG9uZyAqLwotCQkgIGlmICghSG1vZGUpCi0JCSAgICB7Ci0JCSAgICAgIG9wZXJhbmRzW2ldLm1vZGUgJj0gflNJWkU7Ci0JCSAgICAgIG9wZXJhbmRzW2ldLm1vZGUgfD0gTF8xNjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcCAmIChLQklUIHwgREJJVCkpICYmICh4ICYgSU1NKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgb2sgaWYgdGhlIGltbWVkaWF0ZSB2YWx1ZSBpcyBzZW5zaWJsZSAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3AgJiBQQ1JFTCkKLQkJewotCQkgIC8qIFRoZSBzaXplIG9mIHRoZSBkaXNwbGFjZW1lbnQgaXMgaW1wb3J0YW50ICovCi0JCSAgaWYgKChvcCAmIFNJWkUpICE9ICh4ICYgU0laRSkpCi0JCSAgICBmb3VuZCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiAoRElTUCB8IElNTSB8IEFCUykpCi0JCSAgICAgICAmJiAob3AgJiAoRElTUCB8IElNTSB8IEFCUykpID09ICh4ICYgKERJU1AgfCBJTU0gfCBBQlMpKSkKLQkJewotCQkgIC8qIFByb21vdGUgYSBMXzI0IHRvIExfMzIgaWYgaXQgbWFrZXMgdXMgbWF0Y2guICAqLwotCQkgIGlmICgoeCAmIExfMjQpICYmIChvcCAmIExfMzIpKQotCQkgICAgewotCQkgICAgICB4ICY9IH5MXzI0OwotCQkgICAgICB4IHw9IExfMzI7Ci0JCSAgICB9Ci0JCSAgLyogUHJvbW90ZSBhbiBMOCB0byBMXzE2IGlmIGl0IG1ha2VzIHVzIG1hdGNoLiAgKi8KLQkJICBpZiAob3AgJiBBQlMgJiYgb3AgJiBMXzggJiYgb3AgJiBESVNQKSAKLQkJICAgIHsKLQkJICAgICAgaWYgKHggJiBMXzE2KQotCQkJZm91bmQ9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKHggJiBTSVpFKSAhPSAwCi0JCQkgICAmJiAoKG9wICYgU0laRSkgIT0gKHggJiBTSVpFKSkpCi0JCSAgICBmb3VuZCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiBNQUNSRUcpICE9ICh4ICYgTUFDUkVHKSkKLQkJewotCQkgIGZvdW5kID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcCAmIE1PREUpICE9ICh4ICYgTU9ERSkpCi0JCXsKLQkJICBmb3VuZCA9IDA7Ci0JCX0JCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRoaXNfdHJ5OwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19vcGVyYW5kIChvcGVyYW5kLCB3aWR0aCwgc3RyaW5nKQotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci0gICAgIHVuc2lnbmVkIGludCB3aWR0aDsKLSAgICAgY2hhciAqc3RyaW5nOwotewotICBpZiAob3BlcmFuZC0+ZXhwLlhfYWRkX3N5bWJvbCA9PSAwCi0gICAgICAmJiBvcGVyYW5kLT5leHAuWF9vcF9zeW1ib2wgPT0gMCkKLSAgICB7Ci0KLSAgICAgIC8qIE5vIHN5bWJvbCBpbnZvbHZlZCwgbGV0J3MgbG9vayBhdCBvZmZzZXQsIGl0J3MgZGFuZ2Vyb3VzIGlmIGFueSBvZgotCSB0aGUgaGlnaCBiaXRzIGFyZSBub3QgMCBvciBmZidzLCBmaW5kIG91dCBieSBvcmluZyBvciBhbmRpbmcgd2l0aAotCSB0aGUgd2lkdGggYW5kIHNlZWluZyBpZiB0aGUgYW5zd2VyIGlzIDAgb3IgYWxsIGZzKi8KLSAgICAgIAotICAgICAgaWYgKChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgfndpZHRoKSAhPSAwICYmCi0JICAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciB8IHdpZHRoKSAhPSAofjApKQotCXsKLQkgIGlmICh3aWR0aCA9PSAyNTUgCi0JICAgICAgJiYgKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJiAweGZmMDApID09IDB4ZmYwMCkKLQkgICAgewotCSAgICAgIC8qIEp1c3QgaWdub3JlIHRoaXMgb25lIC0gd2hpY2ggaGFwcGVucyB3aGVuIHRyeWluZyB0bwotCQkgZml0IGEgMTYgYml0IGFkZHJlc3MgdHJ1bmNhdGVkIGludG8gYW4gOCBiaXQgYWRkcmVzcwotCQkgb2Ygc29tZXRoaW5nIGxpa2UgYnNldC4gICovCi0JICAgIH0KLQkgIGVsc2UgCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJvcGVyYW5kICVzMHglbHggb3V0IG9mIHJhbmdlLiIpLCBzdHJpbmcsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi19Ci0KLS8qIFJFTEFYTU9ERSBoYXMgb25lIG9mIDMgdmFsdWVzOgotCi0gICAwIE91dHB1dCBhICJub3JtYWwiIHJlbG9jLCBubyByZWxheGluZyBwb3NzaWJsZSBmb3IgdGhpcyBpbnNuL3JlbG9jCi0KLSAgIDEgT3V0cHV0IGEgcmVsYXhhYmxlIDI0Yml0IGFic29sdXRlIG1vdi53IGFkZHJlc3MgcmVsb2NhdGlvbgotICAgICAobWF5IHJlbGF4IGludG8gYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzKS4KLQotICAgMiBPdXRwdXQgYSByZWxheGFibGUgMTYvMjQgYWJzb2x1dGUgbW92LmIgYWRkcmVzcyByZWxvY2F0aW9uCi0gICAgIChtYXkgcmVsYXggaW50byBhbiA4Yml0IGFic29sdXRlIGFkZHJlc3MpLiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX2FfZml4X2ltbSAob2Zmc2V0LCBvcGVyYW5kLCByZWxheG1vZGUpCi0gICAgIGludCBvZmZzZXQ7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKLSAgICAgaW50IHJlbGF4bW9kZTsKLXsKLSAgaW50IGlkeDsKLSAgaW50IHNpemU7Ci0gIGludCB3aGVyZTsKLQotCi0gIGNoYXIgKnQgPSBvcGVyYW5kLT5tb2RlICYgSU1NID8gIiMiIDogIkAiOwotCi0gIGlmIChvcGVyYW5kLT5leHAuWF9hZGRfc3ltYm9sID09IDApCi0gICAgewotICAgICAgY2hhciAqYnl0ZXMgPSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldDsKLSAgICAgIHN3aXRjaCAob3BlcmFuZC0+bW9kZSAmIFNJWkUpCi0JewotCWNhc2UgTF8yOgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHgzLCB0KTsKLQkgIGJ5dGVzWzBdIHw9IChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKSA8PCA0OwotCSAgYnJlYWs7Ci0JY2FzZSBMXzM6Ci0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweDcsIHQpOwotCSAgYnl0ZXNbMF0gfD0gKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpIDw8IDQ7Ci0JICBicmVhazsKLQljYXNlIExfODoKLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4ZmYsIHQpOwotCSAgYnl0ZXNbMF0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyOwotCSAgYnJlYWs7Ci0JY2FzZSBMXzE2OgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHhmZmZmLCB0KTsKLQkgIGJ5dGVzWzBdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiA4OwotCSAgYnl0ZXNbMV0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDA7Ci0JICBicmVhazsKLQljYXNlIExfMjQ6Ci0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweGZmZmZmZiwgdCk7Ci0JICBieXRlc1swXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMTY7Ci0JICBieXRlc1sxXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gODsKLQkgIGJ5dGVzWzJdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIExfMzI6Ci0JICAvKiBUaGlzIHNob3VsZCBiZSBkb25lIHdpdGggYmZkICovCi0JICBieXRlc1swXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMjQ7Ci0JICBieXRlc1sxXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMTY7Ci0JICBieXRlc1syXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gODsKLQkgIGJ5dGVzWzNdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChvcGVyYW5kLT5tb2RlICYgU0laRSkKLQl7Ci0KLQljYXNlIExfMjQ6Ci0JY2FzZSBMXzMyOgotCSAgc2l6ZSA9IDQ7Ci0JICB3aGVyZSA9IChvcGVyYW5kLT5tb2RlICYgU0laRSkgPT0gTF8yNCA/IC0xIDogMDsKLQkgIGlmIChyZWxheG1vZGUgPT0gMikKLQkgICAgaWR4ID0gUl9NT1YyNEIxOwotCSAgZWxzZSBpZiAocmVsYXhtb2RlID09IDEpCi0JICAgIGlkeCA9IFJfTU9WTDE7Ci0JICBlbHNlCi0JICAgIGlkeCA9IFJfUkVMTE9ORzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19iYWQoXygiQ2FuJ3Qgd29yayBvdXQgc2l6ZSBvZiBvcGVyYW5kLlxuIikpOwotCWNhc2UgTF8xNjoKLQkgIHNpemUgPSAyOwotCSAgd2hlcmUgPSAwOwotCSAgaWYgKHJlbGF4bW9kZSA9PSAyKQotCSAgICBpZHggPSBSX01PVjE2QjE7Ci0JICBlbHNlCi0JICAgIGlkeCA9IFJfUkVMV09SRDsKLQkgIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPSAoc2hvcnQpb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcjsKLQkgIGJyZWFrOwotCWNhc2UgTF84OgotCSAgc2l6ZSA9IDE7Ci0JICB3aGVyZSA9IDA7Ci0JICBpZHggPSBSX1JFTEJZVEU7Ci0JICAvKiBUaGlzIHVzZWQgdG8gdXNlIGEgY2FzdCB0byBjaGFyLCBidXQgdGhhdCBmYWlscyBpZiBjaGFyIGlzIGFuCi0JICAgICB1bnNpZ25lZCB0eXBlLiAgV2UgY2FuJ3QgdXNlIGBzaWduZWQgY2hhcicsIGFzIHRoYXQgaXNuJ3QgdmFsaWQKLQkgICAgIEsmUiBDLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgMHg4MCkKLQkgICAgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciB8PSAoKG9mZnNldFQpIC0xIDw8IDgpOwotCSAgZWxzZQotCSAgICBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICY9IDB4ZmY7Ci0JfQotCi0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIG9mZnNldCArIHdoZXJlLAotCQkgICBzaXplLAotCQkgICAmb3BlcmFuZC0+ZXhwLAotCQkgICAwLAotCQkgICBpZHgpOwotICAgIH0KLQotfQotCi0vKiBOb3cgd2Uga25vdyB3aGF0IHNvcnQgb2Ygb3Bjb2RlcyBpdCBpcywgbGV0cyBidWlsZCB0aGUgYnl0ZXMgLQotICovCi1zdGF0aWMgdm9pZAotYnVpbGRfYnl0ZXMgKHRoaXNfdHJ5LCBvcGVyYW5kKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICp0aGlzX3RyeTsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBjaGFyICpvdXRwdXQgPSBmcmFnX21vcmUgKHRoaXNfdHJ5LT5sZW5ndGgpOwotICBvcF90eXBlICpuaWJibGVfcHRyID0gdGhpc190cnktPmRhdGEubmliOwotICBvcF90eXBlIGM7Ci0gIHVuc2lnbmVkIGludCBuaWJibGVfY291bnQgPSAwOwotICBpbnQgYWJzYXQ7Ci0gIGludCBpbW1hdDsKLSAgaW50IG5pYjsKLSAgaW50IG1vdmIgPSAwOwotICBjaGFyIGFzbmliYmxlc1szMF07Ci0gIGNoYXIgKnAgPSBhc25pYmJsZXM7Ci0KLSAgaWYgKCEodGhpc190cnktPmluYmFzZSB8fCBIbW9kZSkpCi0gICAgYXNfd2FybiAoXygiT3Bjb2RlIGAlcycgd2l0aCB0aGVzZSBvcGVyYW5kIHR5cGVzIG5vdCBhdmFpbGFibGUgaW4gSDgvMzAwIG1vZGUiKSwKLQkgICAgIHRoaXNfdHJ5LT5uYW1lKTsKLQotICB3aGlsZSAoKm5pYmJsZV9wdHIgIT0gRSkKLSAgICB7Ci0gICAgICBpbnQgZDsKLSAgICAgIGMgPSAqbmliYmxlX3B0cisrOwotCi0gICAgICBkID0gKGMgJiAoRFNUIHwgU1JDX0lOX0RTVCkpICE9IDA7Ci0KLSAgICAgIGlmIChjIDwgMTYpCi0JewotCSAgbmliID0gYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCi0JICBpZiAoYyAmIChSRUcgfCBJTkQgfCBJTkMgfCBERUMpKQotCSAgICB7Ci0JICAgICAgbmliID0gb3BlcmFuZFtkXS5yZWc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChjICYgRElTUFJFRykgPT0gKERJU1BSRUcpKQotCSAgICB7Ci0JICAgICAgbmliID0gZGlzcHJlZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyAmICBBQlMgKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZFtkXS5tb2RlID0gYzsKLQkgICAgICBhYnNhdCA9IG5pYmJsZV9jb3VudCAvIDI7Ci0JICAgICAgbmliID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyAmIChJTU0gfCBQQ1JFTCB8IEFCUyB8IEFCU0pNUCB8IERJU1ApKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZFtkXS5tb2RlID0gYzsKLQkgICAgICBpbW1hdCA9IG5pYmJsZV9jb3VudCAvIDI7Ci0JICAgICAgbmliID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyAmIElHTk9SRSkKLQkgICAgewotCSAgICAgIG5pYiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiBEQklUKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChvcGVyYW5kWzBdLmV4cC5YX2FkZF9udW1iZXIpCi0JCXsKLQkJY2FzZSAxOgotCQkgIG5pYiA9IGM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICBuaWIgPSAweDggfCBjOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFzX2JhZCAoXygiTmVlZCAjMSBvciAjMiBoZXJlIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiBLQklUKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChvcGVyYW5kWzBdLmV4cC5YX2FkZF9udW1iZXIpCi0JCXsKLQkJY2FzZSAxOgotCQkgIG5pYiA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICBuaWIgPSA4OwotCQkgIGJyZWFrOwotCQljYXNlIDQ6Ci0JCSAgaWYgKCFIbW9kZSkKLQkJICAgIGFzX3dhcm4gKF8oIiM0IG5vdCB2YWxpZCBvbiBIOC8zMDAuIikpOwotCQkgIG5pYiA9IDk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIk5lZWQgIzEgb3IgIzIgaGVyZSIpKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIHN0b3AgaXQgbWFraW5nIGEgZml4ICovCi0JICAgICAgb3BlcmFuZFswXS5tb2RlID0gMDsKLQkgICAgfQotCi0JICBpZiAoYyAmIE1FTVJFTEFYKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZFtkXS5tb2RlIHw9IE1FTVJFTEFYOwotCSAgICB9Ci0KLQkgIGlmIChjICYgQjMxKQotCSAgICB7Ci0JICAgICAgbmliIHw9IDB4ODsKLQkgICAgfQotCi0JICBpZiAoYyAmIE1BQ1JFRykKLQkgICAgewotCSAgICAgIG5pYiA9IDIgKyBvcGVyYW5kW2RdLnJlZzsKLQkgICAgfQotCX0KLSAgICAgIG5pYmJsZV9jb3VudCsrOwotCi0gICAgICAqcCsrID0gbmliOwotICAgIH0KLQotICAvKiBEaXNndXN0aW5nLiAgV2h5LCBvaCB3aHkgZGlkbid0IHNvbWVvbmUgYXNrIHVzIGZvciBhZHZpY2UKLSAgICAgb24gdGhlIGFzc2VtYmxlciBmb3JtYXQuICAqLwotICBpZiAoc3RyY21wICh0aGlzX3RyeS0+bmFtZSwgInN0bS5sIikgPT0gMAotICAgICAgfHwgc3RyY21wICh0aGlzX3RyeS0+bmFtZSwgImxkbS5sIikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgaGlnaCwgbG93OwotICAgICAgaGlnaCA9IChvcGVyYW5kW3RoaXNfdHJ5LT5uYW1lWzBdID09ICdsJyA/IDEgOiAwXS5yZWcgPj4gOCkgJiAweGY7Ci0gICAgICBsb3cgPSBvcGVyYW5kW3RoaXNfdHJ5LT5uYW1lWzBdID09ICdsJyA/IDEgOiAwXS5yZWcgJiAweGY7Ci0KLSAgICAgIGFzbmliYmxlc1syXSA9IGhpZ2ggLSBsb3c7Ci0gICAgICBhc25pYmJsZXNbN10gPSAodGhpc190cnktPm5hbWVbMF0gPT0gJ2wnKSA/IGhpZ2ggOiBsb3c7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCB0aGlzX3RyeS0+bGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgb3V0cHV0W2ldID0gKGFzbmliYmxlc1tpICogMl0gPDwgNCkgfCBhc25pYmJsZXNbaSAqIDIgKyAxXTsKLSAgICB9Ci0KLSAgLyogTm90ZSBpZiB0aGlzIGlzIGEgbW92YiBpbnN0cnVjdGlvbiAtLSB0aGVyZSdzIGEgc3BlY2lhbCByZWxheGF0aW9uCi0gICAgIHdoaWNoIG9ubHkgYXBwbGllcyB0byB0aGVtLiAgKi8KLSAgaWYgKHN0cmNtcCAodGhpc190cnktPm5hbWUsICJtb3YuYiIpID09IDApCi0gICAgbW92YiA9IDE7Ci0KLSAgLyogb3V0cHV0IGFueSBmaXhlcyAqLwotICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgIHsKLSAgICAgIGludCB4ID0gb3BlcmFuZFtpXS5tb2RlOwotCi0gICAgICBpZiAoeCAmIChJTU0gfCBESVNQKSkKLQl7Ci0JICBkb19hX2ZpeF9pbW0gKG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgaW1tYXQsCi0JCQlvcGVyYW5kICsgaSwgeCAmIE1FTVJFTEFYICE9IDApOwotCX0KLSAgICAgIGVsc2UgaWYgKHggJiBBQlMpCi0JewotCSAgZG9fYV9maXhfaW1tIChvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGFic2F0LAotCQkJb3BlcmFuZCArIGksIHggJiBNRU1SRUxBWCA/IG1vdmIgKyAxIDogMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoeCAmIFBDUkVMKQotCXsKLQkgIGludCBzaXplMTYgPSB4ICYgTF8xNjsKLQkgIGludCB3aGVyZSA9IHNpemUxNiA/IDIgOiAxOwotCSAgaW50IHNpemUgPSBzaXplMTYgPyAyIDogMTsKLQkgIGludCB0eXBlID0gc2l6ZTE2ID8gUl9QQ1JXT1JEIDogUl9QQ1JCWVRFOwotCi0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kICsgaSwgc2l6ZTE2ID8gMHg3ZmZmIDogMHg3ZiwgIkAiKTsKLQotCSAgaWYgKG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAmIDEpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJicmFuY2ggb3BlcmFuZCBoYXMgb2RkIG9mZnNldCAoJWx4KVxuIiksCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcik7Ci0JICAgIH0KLQotCSAgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyIC09IDE7Ci0JICAvKiBUaGlzIHVzZWQgdG8gdXNlIGEgY2FzdCB0byBjaGFyLCBidXQgdGhhdCBmYWlscyBpZiBjaGFyIGlzIGFuCi0JICAgICB1bnNpZ25lZCB0eXBlLiAgV2UgY2FuJ3QgdXNlIGBzaWduZWQgY2hhcicsIGFzIHRoYXQgaXNuJ3QgdmFsaWQKLQkgICAgIEsmUiBDLiAgKi8KLQkgIGlmIChvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgJiAweDgwKQotCSAgICBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgfD0gKChvZmZzZXRUKSAtMSA8PCA4KTsKLQkgIGVsc2UKLQkgICAgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyICY9IDB4ZmY7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgd2hlcmUsCi0JCSAgICAgICBzaXplLAotCQkgICAgICAgJm9wZXJhbmRbaV0uZXhwLAotCQkgICAgICAgMSwKLQkJICAgICAgIHR5cGUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHggJiBNRU1JTkQpCi0JewotCi0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kICsgaSwgMHhmZiwgIkBAIik7Ci0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDEsCi0JCSAgICAgICAxLAotCQkgICAgICAgJm9wZXJhbmRbaV0uZXhwLAotCQkgICAgICAgMCwKLQkJICAgICAgIFJfTUVNX0lORElSRUNUKTsKLQl9Ci0gICAgICBlbHNlIGlmICh4ICYgQUJTSk1QKQotCXsKLQkgIC8qIFRoaXMgam1wIG1heSBiZSBhIGp1bXAgb3IgYSBicmFuY2ggKi8KLQotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCArIGksIEhtb2RlID8gMHhmZmZmZmYgOiAweGZmZmYsICJAIik7Ci0JICBpZiAob3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyICYgMSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImJyYW5jaCBvcGVyYW5kIGhhcyBvZGQgb2Zmc2V0ICglbHgpXG4iKSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKLQkgICAgfQotCSAgaWYgKCFIbW9kZSkKLQkgICAgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyID0gKHNob3J0KSBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXI7Ci0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDQsCi0JCSAgICAgICAmb3BlcmFuZFtpXS5leHAsCi0JCSAgICAgICAwLAotCQkgICAgICAgUl9KTVBMMSk7Ci0JfQotICAgIH0KLQotfQotCi0vKgotICB0cnkgYW5kIGdpdmUgYW4gaW50ZWxsaWdlbnQgZXJyb3IgbWVzc2FnZSBmb3IgY29tbW9uIGFuZCBzaW1wbGUgdG8KLSAgZGV0ZWN0IGVycm9ycwotICAqLwotCi1zdGF0aWMgdm9pZAotY2xldmVyX21lc3NhZ2UgKG9wY29kZSwgb3BlcmFuZCkKLSAgICAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci17Ci0gIC8qIEZpbmQgb3V0IGlmIHRoZXJlIHdhcyBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIG9wY2NvZGUgKi8KLQotICBpZiAoKG9wY29kZSArIDEpLT5pZHggIT0gb3Bjb2RlLT5pZHgpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFyZ247Ci0KLSAgICAgIC8qIE9ubHkgb25lIG9wY29kZSBvZiB0aGlzIGZsYXZvdXIsIHRyeSBhbmQgZ3Vlc3Mgd2hpY2ggb3BlcmFuZAotICAgICAgICAgZGlkbid0IG1hdGNoICovCi0gICAgICBmb3IgKGFyZ24gPSAwOyBhcmduIDwgb3Bjb2RlLT5ub3BlcmFuZHM7IGFyZ24rKykKLQl7Ci0JICBzd2l0Y2ggKG9wY29kZS0+YXJncy5uaWJbYXJnbl0pCi0JICAgIHsKLQkgICAgY2FzZSBSRDE2OgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gUkQxNikKLQkJewotCQkgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2IGJpdCByZWdpc3RlciIpKTsKLQkJICByZXR1cm47Ci0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUlM4OgotCi0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBSUzgpCi0JCXsKLQkJICBhc19iYWQgKF8oInNvdXJjZSBvcGVyYW5kIG11c3QgYmUgOCBiaXQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBQlMxNkRTVDoKLQkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IEFCUzE2RFNUKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRDg6Ci0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBSRDgpCi0JCXsKLQkJICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBicmVhazsKLQotCi0JICAgIGNhc2UgQUJTMTZTUkM6Ci0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBBQlMxNlNSQykKLQkJewotCQkgIGFzX2JhZCAoXygic291cmNlIG9wZXJhbmQgbXVzdCBiZSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIH0KLQl9Ci0gICAgfQotICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMiKSk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmNpdG9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gICAqLwotCi0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpvcF9zdGFydDsKLSAgY2hhciAqb3BfZW5kOwotICBzdHJ1Y3QgaDhfb3Agb3BlcmFuZFsyXTsKLSAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICBzdHJ1Y3QgaDhfb3Bjb2RlICpwcmV2X29wY29kZTsKLQotICBjaGFyICpkb3QgPSAwOwotICBjaGFyIGM7Ci0gIGludCBzaXplOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBmaW5kIHRoZSBvcCBjb2RlIGVuZCAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOwotICAgICAgICpvcF9lbmQgIT0gMCAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBpZiAoKm9wX2VuZCA9PSAnLicpCi0JewotCSAgZG90ID0gb3BfZW5kICsgMTsKLQkgICpvcF9lbmQgPSAwOwotCSAgb3BfZW5kICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIDsKLQotICBpZiAob3BfZW5kID09IG9wX3N0YXJ0KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLSAgYyA9ICpvcF9lbmQ7Ci0KLSAgKm9wX2VuZCA9IDA7Ci0KLSAgb3Bjb2RlID0gKHN0cnVjdCBoOF9vcGNvZGUgKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLAotCQkJCQkgICBvcF9zdGFydCk7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIHVzZSB0byBzZXQgaW5wdXRfbGluZV9wb2ludGVyIHRvIHRoZSByZXN1bHQgb2YgZ2V0X29wZXJhbmRzLAotICAgICBidXQgdGhhdCBpcyB3cm9uZy4gIE91ciBjYWxsZXIgYXNzdW1lcyB3ZSBkb24ndCBjaGFuZ2UgaXQuICAqLwotCi0gICh2b2lkKSBnZXRfb3BlcmFuZHMgKG9wY29kZS0+bm9wZXJhbmRzLCBvcF9lbmQsIG9wZXJhbmQpOwotICAqb3BfZW5kID0gYzsKLSAgcHJldl9vcGNvZGUgPSBvcGNvZGU7Ci0KLSAgc2l6ZSA9IFNOOwotICBpZiAoZG90KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmRvdCkKLQl7Ci0JY2FzZSAnYic6Ci0JICBzaXplID0gU0I7Ci0JICBicmVhazsKLQotCWNhc2UgJ3cnOgotCSAgc2l6ZSA9IFNXOwotCSAgYnJlYWs7Ci0KLQljYXNlICdsJzoKLQkgIHNpemUgPSBTTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIG9wY29kZSA9IGdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kLCBzaXplKTsKLQotICBpZiAob3Bjb2RlID09IDApCi0gICAgewotICAgICAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLSAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotICAgICAgd2hlcmVbMF0gPSAweDA7Ci0gICAgICB3aGVyZVsxXSA9IDB4MDsKLSAgICAgIGNsZXZlcl9tZXNzYWdlIChwcmV2X29wY29kZSwgb3BlcmFuZCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGNvZGUtPnNpemUgJiYgZG90KQotICAgIHsKLSAgICAgIGlmIChvcGNvZGUtPnNpemUgIT0gKmRvdCkKLQl7Ci0JICBhc193YXJuIChfKCJtaXNtYXRjaCBiZXR3ZWVuIG9wY29kZSBzaXplIGFuZCBvcGVyYW5kIHNpemUiKSk7Ci0JfQotICAgIH0KLQotICBidWlsZF9ieXRlcyAob3Bjb2RlLCBvcGVyYW5kKTsKLQotfQotCi12b2lkCi10Y19jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVyczsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotdGNfaGVhZGVyc19ob29rIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnM7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAoKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBwcmludGYgKF8oImNhbGwgdG8gbWRfY29udmVydF9mcmFnIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUIAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBzaXplKQotICAgICBzZWdUIHNlZzsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLQotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3NpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0b21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKLSAgICAgY2hhciAqcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0KLXZvaWQKLXRjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKLSAgICAgZml4UyAqZml4X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOwotICAgICBiZmRfdm1hIGJhc2U7Ci0KLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKLQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBUQ19DT05TX1JFTE9DKQotICAgIHsKLSAgICAgIC8qIGNvbnMgbGlrZXMgdG8gY3JlYXRlIHJlbG9jMzIncyB3aGF0ZXZlciB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MuLgotICAgICAgICovCi0gICAgICBzd2l0Y2ggKGZpeF9wdHItPmZ4X3NpemUpCi0JewotCWNhc2UgNDoKLQkgIGludHItPnJfdHlwZSA9IFJfUkVMTE9ORzsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGludHItPnJfdHlwZSA9IFJfUkVMV09SRDsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIGludHItPnJfdHlwZSA9IFJfUkVMQllURTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludHItPnJfdHlwZSA9IGZpeF9wdHItPmZ4X3JfdHlwZTsKLSAgICB9Ci0KLSAgaW50ci0+cl92YWRkciA9IGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZSArIGJhc2U7Ci0gIGludHItPnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotCi0gIGlmIChzeW1ib2xfcHRyKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xfcHRyLT5zeV9udW1iZXIgIT0gLTEpCi0JaW50ci0+cl9zeW1uZHggPSBzeW1ib2xfcHRyLT5zeV9udW1iZXI7Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sUyAqc2Vnc3ltOwotCi0JICAvKiBUaGlzIGNhc2UgYXJpc2VzIHdoZW4gYSByZWZlcmVuY2UgaXMgbWFkZSB0byBgLicuICAqLwotCSAgc2Vnc3ltID0gc2VnX2luZm8gKFNfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpKS0+ZG90OwotCSAgaWYgKHNlZ3N5bSA9PSBOVUxMKQotCSAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50ci0+cl9zeW1uZHggPSBzZWdzeW0tPnN5X251bWJlcjsKLQkgICAgICBpbnRyLT5yX29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltYm9sX3B0cik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLQotCi19Ci0KLS8qIGVuZCBvZiB0Yy1oODMwMC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4MzAwLmggYi9nYXMvY29uZmlnL3RjLWg4MzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMmE3MDQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1oODMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWg4MzAwLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNkZWZpbmUgVENfSDgzMDAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBpbnRlcm5hbF9yZWxvYzsKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgYWJvcnQoKTsKLQotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9oODMwMAotI2RlZmluZSBDT0ZGX01BR0lDICggU21vZGUgPyAweDgzMDIgOiBIbW9kZSA/IDB4ODMwMSA6IDB4ODMwMCkKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKDEpCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKGEpIDsgLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgVENfQ09OU19SRUxPQyAgICAgICAgICAoSG1vZGUgPyBSX1JFTExPTkc6IFJfUkVMV09SRCkKLQotI2RlZmluZSBET19OT1RfU1RSSVAgMAotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiSGl0YWNoaSBIOC8zMDAgR0FTICIKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotI2RlZmluZSBSRUxPQ18zMiAxMjM0Ci0KLWV4dGVybiBpbnQgSG1vZGU7Ci1leHRlcm4gaW50IFNtb2RlOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogZW5kIG9mIHRjLWg4MzAwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDg1MDAuYyBiL2dhcy9jb25maWcvdGMtaDg1MDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlYzNlMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWg4NTAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMzICswLDAgQEAKLS8qIHRjLWg4NTAwLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgSDgvNTAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgc2FjQGN5Z251cy5jb20KLSAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2RlZmluZSBBU1NFTUJMRVJfVEFCTEUKLSNpbmNsdWRlICJvcGNvZGVzL2g4NTAwLW9wYy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIhIyI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotdm9pZCBjb25zICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDJ9LAotICB7ImRhdGEuYiIsIGNvbnMsIDF9LAotICB7ImRhdGEudyIsIGNvbnMsIDJ9LAotICB7ImRhdGEubCIsIGNvbnMsIDR9LAotICB7ImZvcm0iLCBsaXN0aW5nX3BzaXplLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0KLSNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj4yKSkKLQotI2RlZmluZSBCWVRFX0RJU1AgMQotI2RlZmluZSBXT1JEX0RJU1AgMgotI2RlZmluZSBVTkRFRl9CWVRFX0RJU1AgMAotI2RlZmluZSBVTkRFRl9XT1JEX0RJU1AgMwotCi0jZGVmaW5lIEJSQU5DSCAgMQotI2RlZmluZSBTQ0JfRiAgIDIKLSNkZWZpbmUgU0NCX1RTVCAzCi0jZGVmaW5lIEVORCA0Ci0KLSNkZWZpbmUgQllURV9GIDEyNwotI2RlZmluZSBCWVRFX0IgLTEyNgotI2RlZmluZSBXT1JEX0YgMzI3NjcKLSNkZWZpbmUgV09SRF9CIDMyNzY4Ci0KLXJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKgotICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQKLSAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gIGNoYXIgcHJldl9idWZmZXJbMTAwXTsKLSAgaW50IGlkeCA9IDA7Ci0gIHJlZ2lzdGVyIHJlbGF4X3R5cGVTICp0YWJsZTsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0gIHByZXZfYnVmZmVyWzBdID0gMDsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChpZHggIT0gb3Bjb2RlLT5pZHgpCi0JewotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQkgIGlkeCsrOwotCX0KLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgcmVsYXggdGFibGUuICBXZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSB0byBhdm9pZAotICAgICB3YXJuaW5ncyBhYm91dCBtb2RpZnlpbmcgYSBzdXBwb3NlZGx5IGNvbnN0IGRhdGEgc3RydWN0dXJlLiAgKi8KLSAgdGFibGUgPSAocmVsYXhfdHlwZVMgKikgbWRfcmVsYXhfdGFibGU7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgQllURV9ESVNQKV0ucmx4X2JhY2t3YXJkID0gQllURV9COwotICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9sZW5ndGggPSAyOwotICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoQlJBTkNILCBXT1JEX0RJU1ApOwotCi0gIHRhYmxlW0MgKEJSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2ZvcndhcmQgPSBXT1JEX0Y7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9sZW5ndGggPSAzOwotICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKLQotICB0YWJsZVtDIChTQ0JfRiwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7Ci0gIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKLSAgdGFibGVbQyAoU0NCX0YsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoU0NCX0YsIFdPUkRfRElTUCk7Ci0KLSAgdGFibGVbQyAoU0NCX0YsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDg7Ci0gIHRhYmxlW0MgKFNDQl9GLCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLSAgdGFibGVbQyAoU0NCX1RTVCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoU0NCX1RTVCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDM7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoU0NCX1RTVCwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKLSAgdGFibGVbQyAoU0NCX1RTVCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gMTA7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKLQotfQotCi1zdGF0aWMgaW50IHJuOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJOICovCi1zdGF0aWMgaW50IHJzOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJTICovCi1zdGF0aWMgaW50IHJkOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJEICovCi1zdGF0aWMgaW50IGNyYjsJCQkvKiBieXRlIHNpemUgY3IgKi8KLXN0YXRpYyBpbnQgY3J3OwkJCS8qIHdvcmQgc2l6ZWQgY3IgKi8KLXN0YXRpYyBpbnQgY3I7CQkJLyogdW5rbm93biBzaXplIGNyICovCi0KLXN0YXRpYyBleHByZXNzaW9uUyBkaXNwbGFjZW1lbnQ7LyogZGlzcGxhY2VtZW50IGV4cHJlc3Npb24gKi8KLXN0YXRpYyBpbnQgZGlzcGxhY2VtZW50X3NpemU7CS8qIGFuZCBzaXplIGlmIGdpdmVuICovCi0KLXN0YXRpYyBpbnQgaW1tZWRpYXRlX2lucGFnZTsKLXN0YXRpYyBleHByZXNzaW9uUyBpbW1lZGlhdGU7CS8qIGltbWVkaWF0ZSBleHByZXNzaW9uICovCi1zdGF0aWMgaW50IGltbWVkaWF0ZV9zaXplOwkvKiBhbmQgc2l6ZSBpZiBnaXZlbiAqLwotCi1zdGF0aWMgZXhwcmVzc2lvblMgYWJzb2x1dGU7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KLXN0YXRpYyBpbnQgYWJzb2x1dGVfc2l6ZTsJLyogYW5kIHNpemUgaWYgZ2l2ZW4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IHR5cGU7Ci0gIGludCByZWc7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IHBhZ2U7Ci19Ci0KLWg4NTAwX29wZXJhbmRfaW5mbzsKLQotLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLwotc3RhdGljIGludAotcGFyc2VfcmVnIChzcmMsIG1vZGUsIHJlZykKLSAgICAgY2hhciAqc3JjOwotICAgICBpbnQgKm1vZGU7Ci0gICAgIGludCAqcmVnOwotewotICBjaGFyICplbmQ7Ci0gIGludCBsZW47Ci0KLSAgLyogQ3JpYmJlZCBmcm9tIGdldF9zeW1ib2xfZW5kKCkuICAqLwotICBpZiAoIWlzX25hbWVfYmVnaW5uZXIgKCpzcmMpIHx8ICpzcmMgPT0gJ1wwMDEnKQotICAgIHJldHVybiAwOwotICBlbmQgPSBzcmMrMTsKLSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKmVuZCkgfHwgKmVuZCA9PSAnXDAwMScpCi0gICAgZW5kKys7Ci0gIGxlbiA9IGVuZCAtIHNyYzsKLQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnKQotCXsKLQkgICptb2RlID0gUk47Ci0JICAqcmVnID0gKHNyY1sxXSAtICcwJyk7Ci0JICByZXR1cm4gbGVuOwotCX0KLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBSTjsKLSAgICAgICpyZWcgPSA3OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2MnICYmIHNyY1sxXSA9PSAnYycgJiYgc3JjWzJdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSAxOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncicpCi0gICAgewotICAgICAgKm1vZGUgPSBDUlc7Ci0gICAgICAqcmVnID0gMDsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdiJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JCOwotICAgICAgKnJlZyA9IDM7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSA0OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2QnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBDUkI7Ci0gICAgICAqcmVnID0gNTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICd0JyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JCOwotICAgICAgKnJlZyA9IDc7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFJOOwotICAgICAgKnJlZyA9IDY7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotY2hhciAqCi1wYXJzZV9leHAgKHMsIG9wLCBwYWdlKQotICAgICBjaGFyICpzOwotICAgICBleHByZXNzaW9uUyAqb3A7Ci0gICAgIGludCAqcGFnZTsKLXsKLSAgY2hhciAqc2F2ZTsKLSAgY2hhciAqbmV3OwotCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgKnBhZ2UgPSAwOwotICBpZiAoc1swXSA9PSAnJScpCi0gICAgewotICAgICAgaWYgKHNbMV0gPT0gJ3AnICYmIHNbMl0gPT0gJ2EnICYmIHNbM10gPT0gJ2cnICYmIHNbNF0gPT0gJ2UnKQotCXsKLQkgIHMgKz0gNTsKLQkgICpwYWdlID0gJ3AnOwotCX0KLSAgICAgIGlmIChzWzFdID09ICdoJyAmJiBzWzJdID09ICdpJyAmJiBzWzNdID09ICcxJyAmJiBzWzRdID09ICc2JykKLQl7Ci0JICBzICs9IDU7Ci0JICAqcGFnZSA9ICdoJzsKLQl9Ci0gICAgICBlbHNlIGlmIChzWzFdID09ICdvJyAmJiBzWzJdID09ICdmJyAmJiBzWzNdID09ICdmJykKLQl7Ci0JICBzICs9IDQ7Ci0JICAqcGFnZSA9ICdvJzsKLQl9Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0KLSAgZXhwcmVzc2lvbiAob3ApOwotICBpZiAob3AtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBleHBfc2lnbmVkLCBleHBfdW5zaWduZWQsIGV4cF9zYW5kdQotICB9IHNpZ25fdHlwZTsKLQotCi1zdGF0aWMgY2hhciAqCi1za2lwX2NvbG9udGhpbmcgKHNpZ24sIHB0ciwgZXhwLCBkZWYsIHNpemU4LCBzaXplMTYsIHNpemUyNCkKLSAgICAgc2lnbl90eXBlIHNpZ247Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpleHA7Ci0gICAgIGludCBkZWY7Ci0gICAgIGludCBzaXplODsKLSAgICAgaW50IHNpemUxNjsKLSAgICAgaW50IHNpemUyNDsKLXsKLSAgcHRyID0gcGFyc2VfZXhwIChwdHIsICZleHAtPmV4cCwgJmV4cC0+cGFnZSk7Ci0gIGlmICgqcHRyID09ICc6JykKLSAgICB7Ci0gICAgICBwdHIrKzsKLSAgICAgIGlmICgqcHRyID09ICc4JykKLQl7Ci0JICBwdHIrKzsKLQkgIGV4cC0+dHlwZSA9IHNpemU4OwotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnMScgJiBwdHJbMV0gPT0gJzYnKQotCXsKLQkgIHB0ciArPSAyOwotCSAgZXhwLT50eXBlID0gc2l6ZTE2OwotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnMicgJiBwdHJbMV0gPT0gJzQnKQotCXsKLQkgIGlmICghc2l6ZTI0KQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCI6MjQgbm90IHZhbGlkIGZvciB0aGlzIG9wY29kZSIpKTsKLQkgICAgfQotCSAgcHRyICs9IDI7Ci0JICBleHAtPnR5cGUgPSBzaXplMjQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiZXhwZWN0IDo4LDoxNiBvciA6MjQiKSk7Ci0JICBleHAtPnR5cGUgPSBzaXplMTY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChleHAtPnBhZ2UgPT0gJ3AnKQotCXsKLQkgIGV4cC0+dHlwZSA9IElNTTg7Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5wYWdlID09ICdoJykKLQl7Ci0JICBleHAtPnR5cGUgPSBJTU0xNjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTGV0J3Mgd29yayBvdXQgdGhlIHNpemUgZnJvbSB0aGUgY29udGV4dCAqLwotCSAgaW50IG4gPSBleHAtPmV4cC5YX2FkZF9udW1iZXI7Ci0JICBpZiAoc2l6ZTgKLQkgICAgICAmJiBleHAtPmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiAoKHNpZ24gPT0gZXhwX3NpZ25lZCAmJiAobiA+PSAtMTI4ICYmIG4gPD0gMTI3KSkKLQkJICB8fCAoc2lnbiA9PSBleHBfdW5zaWduZWQgJiYgKG4gPj0gMCAmJiAobiA8PSAyNTUpKSkKLQkJICB8fCAoc2lnbiA9PSBleHBfc2FuZHUgJiYgKG4gPj0gLTEyOCAmJiAobiA8PSAyNTUpKSkpKQotCSAgICB7Ci0JICAgICAgZXhwLT50eXBlID0gc2l6ZTg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cC0+dHlwZSA9IGRlZjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX3JlZ2xpc3QgKHNyYywgb3ApCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcDsKLXsKLSAgaW50IG1vZGU7Ci0gIGludCBybjsKLSAgaW50IG1hc2sgPSAwOwotICBpbnQgcm07Ci0gIGludCBpZHggPSAxOwkJCS8qIHNraXAgKCAqLwotCi0gIHdoaWxlIChzcmNbaWR4XSAmJiBzcmNbaWR4XSAhPSAnKScpCi0gICAgewotICAgICAgaW50IGRvbmUgPSBwYXJzZV9yZWcgKHNyYyArIGlkeCwgJm1vZGUsICZybik7Ci0KLSAgICAgIGlmIChkb25lKQotCXsKLQkgIGlkeCArPSBkb25lOwotCSAgbWFzayB8PSAxIDw8IHJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiByZWcgbGlzdCIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmIChzcmNbaWR4XSA9PSAnLScpCi0JewotCSAgaWR4Kys7Ci0JICBkb25lID0gcGFyc2VfcmVnIChzcmMgKyBpZHgsICZtb2RlLCAmcm0pOwotCSAgaWYgKGRvbmUpCi0JICAgIHsKLQkgICAgICBpZHggKz0gZG9uZTsKLQkgICAgICB3aGlsZSAocm4gPD0gcm0pCi0JCXsKLQkJICBtYXNrIHw9IDEgPDwgcm47Ci0JCSAgcm4rKzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZmluYWwgcmVnaXN0ZXIgaW4gcmFuZ2UiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjW2lkeF0gPT0gJywnKQotCWlkeCsrOwotICAgIH0KLSAgaWR4Kys7Ci0gIG9wLT5leHAuWF9hZGRfc3ltYm9sID0gMDsKLSAgb3AtPmV4cC5YX29wX3N5bWJvbCA9IDA7Ci0gIG9wLT5leHAuWF9hZGRfbnVtYmVyID0gbWFzazsKLSAgb3AtPmV4cC5YX29wID0gT19jb25zdGFudDsKLSAgb3AtPmV4cC5YX3Vuc2lnbmVkID0gMTsKLSAgb3AtPnR5cGUgPSBJTU04OwotICByZXR1cm4gaWR4OwotCi19Ci0KLS8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6Ci0KLSAgIFJuCQkJUmVnaXN0ZXIgZGlyZWN0Ci0gICBAUm4JCQlSZWdpc3RlciBpbmRpcmVjdAotICAgQChkaXNwWzpzaXplXSwgUm4pCVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0gICBAUm4rCi0gICBALVJuCi0gICBAYWFbOnNpemVdCQlhYnNvbHV0ZQotICAgI3h4WzpzaXplXQkJaW1tZWRpYXRlIGRhdGEKLQotICAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9vcGVyYW5kIChwdHIsIG9wLCBpc3BhZ2UpCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3A7Ci0gICAgIGNoYXIgaXNwYWdlOwotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgbW9kZTsKLSAgdW5zaWduZWQgaW50IG51bTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgb3AtPnBhZ2UgPSAwOwotICBpZiAoc3JjWzBdID09ICcoJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSByZWdpc3RlciBsaXN0ICovCi0gICAgICAqcHRyID0gc3JjICsgcGFyc2VfcmVnbGlzdCAoc3JjLCBvcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmb3AtPnR5cGUsICZvcC0+cmVnKTsKLQotICBpZiAobGVuKQotICAgIHsKLSAgICAgICpwdHIgPSBzcmMgKyBsZW47Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3JjID09ICdAJykKLSAgICB7Ci0gICAgICBzcmMrKzsKLSAgICAgIGlmICgqc3JjID09ICctJykKLQl7Ci0JICBzcmMrKzsKLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm51bSk7Ci0JICBpZiAobGVuID09IDApCi0JICAgIHsKLQkgICAgICAvKiBPb3BzLCBub3QgYSByZWcgYWZ0ZXIgYWxsLCBtdXN0IGJlIG9yZGluYXJ5IGV4cCAqLwotCSAgICAgIHNyYy0tOwotCSAgICAgIC8qIG11c3QgYmUgYSBzeW1ib2wgKi8KLQkgICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChleHBfdW5zaWduZWQsIHNyYywKLQkJCQkgICAgICBvcCwgQUJTMTYsIEFCUzgsIEFCUzE2LCBBQlMyNCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIG9wLT50eXBlID0gUk5ERUM7Ci0JICBvcC0+cmVnID0gbnVtOwotCSAgKnB0ciA9IHNyYyArIGxlbjsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoKnNyYyA9PSAnKCcpCi0JewotCSAgLyogRGlzcCAqLwotCSAgc3JjKys7Ci0KLQkgIHNyYyA9IHNraXBfY29sb250aGluZyAoZXhwX3NpZ25lZCwgc3JjLCAKLQkJCQkgb3AsIFJOSU5EX0QxNiwgUk5JTkRfRDgsIFJOSU5EX0QxNiwgMCk7Ci0KLQkgIGlmICgqc3JjICE9ICcsJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIFJuKSIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHNyYysrOwotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmb3AtPnJlZyk7Ci0JICBpZiAobGVuID09IDAgfHwgbW9kZSAhPSBSTikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIFJuKSIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHNyYyArPSBsZW47Ci0JICBpZiAoKnNyYyAhPSAnKScpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCBSbikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAqcHRyID0gc3JjICsgMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0pOwotCi0gICAgICBpZiAobGVuKQotCXsKLQkgIHNyYyArPSBsZW47Ci0JICBpZiAoKnNyYyA9PSAnKycpCi0JICAgIHsKLQkgICAgICBzcmMrKzsKLQkgICAgICBpZiAobW9kZSAhPSBSTikKLQkJewotCQkgIGFzX2JhZCAoXygiQFJuKyBuZWVkcyB3b3JkIHJlZ2lzdGVyIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIG9wLT50eXBlID0gUk5JTkM7Ci0JICAgICAgb3AtPnJlZyA9IG51bTsKLQkgICAgICAqcHRyID0gc3JjOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgaWYgKG1vZGUgIT0gUk4pCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkBSbiBuZWVkcyB3b3JkIHJlZ2lzdGVyIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgb3AtPnR5cGUgPSBSTklORDsKLQkgIG9wLT5yZWcgPSBudW07Ci0JICAqcHRyID0gc3JjOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCi0JICAqcHRyID0KLQkgICAgc2tpcF9jb2xvbnRoaW5nIChleHBfdW5zaWduZWQsIHNyYywgb3AsCi0JCQkgICAgIGlzcGFnZSA/IEFCUzI0IDogQUJTMTYsIEFCUzgsIEFCUzE2LCBBQlMyNCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoKnNyYyA9PSAnIycpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChleHBfc2FuZHUsIHNyYywgb3AsIElNTTE2LCBJTU04LCBJTU0xNiwgQUJTMjQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKGV4cF9zaWduZWQsIHNyYywgb3AsCi0JCQkgICAgICBpc3BhZ2UgPyBBQlMyNCA6IFBDUkVMOCwgUENSRUw4LCBQQ1JFTDE2LCBBQlMyNCk7Ci0gICAgfQotfQotCi1zdGF0aWMKLWNoYXIgKgotZ2V0X29wZXJhbmRzIChpbmZvLCBhcmdzLCBvcGVyYW5kKQotICAgICBoODUwMF9vcGNvZGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYXJnczsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOwotCi17Ci0gIGNoYXIgKnB0ciA9IGFyZ3M7Ci0KLSAgc3dpdGNoIChpbmZvLT5uYXJncykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgb3BlcmFuZFswXS50eXBlID0gMDsKLSAgICAgIG9wZXJhbmRbMV0udHlwZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCBpbmZvLT5uYW1lWzBdID09ICdwJyk7Ci0gICAgICBvcGVyYW5kWzFdLnR5cGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAotICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcwotICAgcHJvdmlkZWQKLSAgICovCi0KLWludCBwY3JlbDg7CQkJLyogU2V0IHdoZW4gd2UndmUgc2VlbiBhIHBjcmVsIG9wZXJhbmQgKi8KLQotc3RhdGljCi1oODUwMF9vcGNvZGVfaW5mbyAqCi1nZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZHMpCi0gICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZHM7Ci17Ci0gIGg4NTAwX29wY29kZV9pbmZvICp0aGlzX3RyeSA9IG9wY29kZTsKLSAgaW50IGZvdW5kID0gMDsKLSAgdW5zaWduZWQgaW50IG5vcGVyYW5kcyA9IG9wY29kZS0+bmFyZ3M7Ci0KLSAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSBvcGNvZGUtPmlkeDsKLQotICB3aGlsZSAodGhpc19pbmRleCA9PSBvcGNvZGUtPmlkeCAmJiAhZm91bmQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIHRoaXNfdHJ5ID0gb3Bjb2RlKys7Ci0KLSAgICAgIC8qIGxvb2sgYXQgYm90aCBvcGVyYW5kcyBuZWVkZWQgYnkgdGhlIG9wY29kZXMgYW5kIHByb3ZpZGVkIGJ5Ci0gICAgICAgdGhlIHVzZXIqLwotICAgICAgZm9yIChpID0gMDsgaSA8IG5vcGVyYW5kczsgaSsrKQotCXsKLQkgIGg4NTAwX29wZXJhbmRfaW5mbyAqdXNlciA9IG9wZXJhbmRzICsgaTsKLQotCSAgc3dpdGNoICh0aGlzX3RyeS0+YXJnX3R5cGVbaV0pCi0JICAgIHsKLQkgICAgY2FzZSBGUElORF9EODoKLQkgICAgICAvKiBPcGNvZGUgbmVlZHMgKGRpc3A6OCxmcCkgKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EOCAmJiB1c2VyLT5yZWcgPT0gNikKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EX0QxNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EMTYpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgcmQgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EOCkKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICByZCA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5EX0QxNjoKLQkgICAgY2FzZSBSTklORF9EODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSB0aGlzX3RyeS0+YXJnX3R5cGVbaV0pCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgcm4gPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNQREVDOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOREVDICYmIHVzZXItPnJlZyA9PSA3KQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUElOQzoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklOQyAmJiB1c2VyLT5yZWcgPT0gNykKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMTY6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTMTYpCi0JCXsKLQkJICBhYnNvbHV0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTOCkKLQkJewotCQkgIGFic29sdXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMjQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTMjQpCi0JCXsKLQkJICBhYnNvbHV0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ1JCOgotCSAgICAgIGlmICgodXNlci0+dHlwZSA9PSBDUkIgfHwgdXNlci0+dHlwZSA9PSBDUikgJiYgdXNlci0+cmVnICE9IDApCi0JCXsKLQkJICBjcmIgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUlc6Ci0JICAgICAgaWYgKCh1c2VyLT50eXBlID09IENSVyB8fCB1c2VyLT50eXBlID09IENSKSAmJiB1c2VyLT5yZWcgPT0gMCkKLQkJewotCQkgIGNydyA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1AxNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBESVNQMTYpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBESVNQOCkKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOICYmIHVzZXItPnJlZyA9PSA2KQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDE2OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFBDUkVMMTYpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUENSRUw4KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIHBjcmVsOCA9IDE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIElNTTE2OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IElNTTE2Ci0JCSAgfHwgdXNlci0+dHlwZSA9PSBJTU04KQotCQl7Ci0JCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7Ci0JCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkxJU1Q6Ci0JICAgIGNhc2UgSU1NODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU04KQotCQl7Ci0JCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7Ci0JCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NNDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU04KQotCQl7Ci0JCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7Ci0JCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUUlNOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IElNTTgKLQkJICAmJiB1c2VyLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgJiYKLQkJICAodXNlci0+ZXhwLlhfYWRkX251bWJlciA9PSAtMgotCQkgICB8fCB1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IC0xCi0JCSAgIHx8IHVzZXItPmV4cC5YX2FkZF9udW1iZXIgPT0gMQotCQkgICB8fCB1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IDIpKQotCQl7Ci0JCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7Ci0JCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk4pCi0JCXsKLQkJICByZCA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJTOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOKQotCQl7Ci0JCSAgcnMgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORCkKLQkJewotCQkgIHJkID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCi0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklOQzoKLQkgICAgY2FzZSBSTklORDoKLQkgICAgY2FzZSBSTkRFQzoKLQkgICAgY2FzZSBSTjoKLQotCSAgICAgIGlmICh1c2VyLT50eXBlID09IHRoaXNfdHJ5LT5hcmdfdHlwZVtpXSkKLQkJewotCQkgIHJuID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1A6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk4gJiYgdXNlci0+cmVnID09IDcpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHByaW50ZiAoXygidW5oYW5kbGVkICVkXG4iKSwgdGhpc190cnktPmFyZ190eXBlW2ldKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBnZXQgaGVyZSB0aGlzIGRpZG4ndCB3b3JrIG91dCAqLwotCSAgZ290byBmYWlsOwotCX0KLSAgICAgIGZvdW5kID0gMTsKLSAgICBmYWlsOjsKLQotICAgIH0KLQotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRoaXNfdHJ5OwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7Ci0gICAgIGludCBsb3c7Ci0gICAgIGludCBoaWdoOwotewotICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiksIGxvdywgaGlnaCk7Ci0gICAgfQotICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotfQotCi1zdGF0aWMKLXZvaWQKLWluc2VydCAob3V0cHV0LCBpbmRleCwgZXhwLCByZWxvYywgcGNyZWwpCi0gICAgIGNoYXIgKm91dHB1dDsKLSAgICAgaW50IGluZGV4OwotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgcmVsb2M7Ci0gICAgIGludCBwY3JlbDsKLXsKLSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGluZGV4LAotCSAgICAgICA0LAkgICAgICAgCS8qIGFsd2F5cyBzYXkgc2l6ZSBpcyA0LCBidXQgd2Uga25vdyBiZXR0ZXIgKi8KLQkgICAgICAgZXhwLAotCSAgICAgICBwY3JlbCwKLQkgICAgICAgcmVsb2MpOwotfQotCi12b2lkCi1idWlsZF9yZWxheGFibGVfaW5zdHJ1Y3Rpb24gKG9wY29kZSwgb3BlcmFuZCkKLSAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOwotewotICAvKiBBbGwgcmVsYXhhYmxlIGluc3RydWN0aW9ucyBzdGFydCBsaWZlIGFzIHR3byBieXRlcyBidXQgY2FuIGJlY29tZQotICAgICB0aHJlZSBieXRlcyBsb25nIGlmIGEgbG9uZWx5IGJyYW5jaCBhbmQgdXAgdG8gOSBieXRlcyBpZiBsb25nIHNjYgotICAgICAqLwotICBjaGFyICpwOwotICBpbnQgbGVuOwotICBpbnQgdHlwZTsKLQotICBpZiAob3Bjb2RlLT5ieXRlc1swXS5jb250ZW50cyA9PSAweDAxKQotICAgIHsKLSAgICAgIHR5cGUgPSBTQ0JfRjsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgPT0gMHgwNgotCSAgIHx8IG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgPT0gMHgwNykKLSAgICB7Ci0gICAgICB0eXBlID0gU0NCX1RTVDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0eXBlID0gQlJBTkNIOwotICAgIH0KLQotICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQltZF9yZWxheF90YWJsZVtDICh0eXBlLCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoLAotCQlsZW4gPSBtZF9yZWxheF90YWJsZVtDICh0eXBlLCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoLAotCQlDICh0eXBlLCBVTkRFRl9CWVRFX0RJU1ApLAotCQlkaXNwbGFjZW1lbnQuWF9hZGRfc3ltYm9sLAotCQlkaXNwbGFjZW1lbnQuWF9hZGRfbnVtYmVyLAotCQkwKTsKLQotICBwWzBdID0gb3Bjb2RlLT5ieXRlc1swXS5jb250ZW50czsKLSAgaWYgKHR5cGUgIT0gQlJBTkNIKQotICAgIHsKLSAgICAgIHBbMV0gPSBvcGNvZGUtPmJ5dGVzWzFdLmNvbnRlbnRzIHwgcnM7Ci0gICAgfQotfQotCi0vKiBOb3cgd2Uga25vdyB3aGF0IHNvcnQgb2Ygb3Bjb2RlcyBpdCBpcywgbGV0cyBidWlsZCB0aGUgYnl0ZXMgLQotICovCi1zdGF0aWMgdm9pZAotYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCkKLSAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOwotCi17Ci0gIGludCBpbmRleDsKLQotICBpZiAocGNyZWw4KQotICAgIHsKLSAgICAgIHBjcmVsOCA9IDA7Ci0gICAgICBidWlsZF9yZWxheGFibGVfaW5zdHJ1Y3Rpb24gKG9wY29kZSwgb3BlcmFuZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqb3V0cHV0ID0gZnJhZ19tb3JlIChvcGNvZGUtPmxlbmd0aCk7Ci0KLSAgICAgIG1lbXNldCAob3V0cHV0LCAwLCBvcGNvZGUtPmxlbmd0aCk7Ci0gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvcGNvZGUtPmxlbmd0aDsgaW5kZXgrKykKLQl7Ci0JICBvdXRwdXRbaW5kZXhdID0gb3Bjb2RlLT5ieXRlc1tpbmRleF0uY29udGVudHM7Ci0KLQkgIHN3aXRjaCAob3Bjb2RlLT5ieXRlc1tpbmRleF0uaW5zZXJ0KQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmIChfKCJmYWlsZWQgZm9yICVkXG4iKSwgb3Bjb2RlLT5ieXRlc1tpbmRleF0uaW5zZXJ0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAwOgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOOgotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gcm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ6Ci0JICAgIGNhc2UgUkRJTkQ6Ci0JICAgICAgCi0JICAgICAgb3V0cHV0W2luZGV4XSB8PSByZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSUzoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IHJzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1AxNjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfSU1NMTYsIDApOwotCSAgICAgIGluZGV4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRElTUDg6Ci0JICAgIGNhc2UgRlBJTkRfRDg6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmZGlzcGxhY2VtZW50LCBSX0g4NTAwX0lNTTgsIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgSU1NMTY6Ci0JICAgICAgewotCQlpbnQgcDsKLQkJc3dpdGNoIChpbW1lZGlhdGVfaW5wYWdlKSB7Ci0JCWNhc2UgJ3AnOgotCQkgIHAgPSBSX0g4NTAwX0hJR0gxNjsKLQkJICBicmVhazsKLQkJY2FzZSAnaCc6CQkKLQkJICBwID0gUl9IODUwMF9ISUdIMTY7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgcCA9IFJfSDg1MDBfSU1NMTY7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkJCi0JCWluc2VydCAob3V0cHV0LCBpbmRleCwgJmltbWVkaWF0ZSxwLCAwKTsKLQkgICAgICB9Ci0JCQotCSAgICAgIGluZGV4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkxJU1Q6Ci0JICAgIGNhc2UgSU1NODoKLQkgICAgICBpZiAoaW1tZWRpYXRlX2lucGFnZSkKLQkJewotCQkgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmltbWVkaWF0ZSwgUl9IODUwMF9ISUdIOCwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZpbW1lZGlhdGUsIFJfSDg1MDBfSU1NOCwgMCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDE2OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmRpc3BsYWNlbWVudCwgUl9IODUwMF9QQ1JFTDE2LCAxKTsKLQkgICAgICBpbmRleCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMODoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfUENSRUw4LCAxKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU00OgotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY2hlY2sgKCZpbW1lZGlhdGUsIDAsIDE1KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUjoKLQotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY3I7Ci0JICAgICAgaWYgKGNyID09IDApCi0JCXsKLQkJICBvdXRwdXRbMF0gfD0gMHg4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb3V0cHV0WzBdICY9IH4weDg7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ1JCOgotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY3JiOwotCSAgICAgIG91dHB1dFswXSAmPSB+MHg4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSVzoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNydzsKLQkgICAgICBvdXRwdXRbMF0gfD0gMHg4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzI0OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmFic29sdXRlLCBSX0g4NTAwX0lNTTI0LCAwKTsKLQkgICAgICBpbmRleCArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzE2OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmFic29sdXRlLCBSX0g4NTAwX0lNTTE2LCAwKTsKLQkgICAgICBpbmRleCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzg6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmYWJzb2x1dGUsIFJfSDg1MDBfSU1NOCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUUlNOgotCSAgICAgIHN3aXRjaCAoaW1tZWRpYXRlLlhfYWRkX251bWJlcikKLQkJewotCQljYXNlIC0yOgotCQkgIG91dHB1dFtpbmRleF0gfD0gMHg1OwotCQkgIGJyZWFrOwotCQljYXNlIC0xOgotCQkgIG91dHB1dFtpbmRleF0gfD0gMHg0OwotCQkgIGJyZWFrOwotCQljYXNlIDE6Ci0JCSAgb3V0cHV0W2luZGV4XSB8PSAwOwotCQkgIGJyZWFrOwotCQljYXNlIDI6Ci0JCSAgb3V0cHV0W2luZGV4XSB8PSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jaXRvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotdm9pZAotREVGVU4gKG1kX2Fzc2VtYmxlLCAoc3RyKSwKLSAgICAgICBjaGFyICpzdHIpCi17Ci0gIGNoYXIgKm9wX3N0YXJ0OwotICBjaGFyICpvcF9lbmQ7Ci0gIGg4NTAwX29wZXJhbmRfaW5mbyBvcGVyYW5kWzJdOwotICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICBoODUwMF9vcGNvZGVfaW5mbyAqcHJldl9vcGNvZGU7Ci0gIGNoYXIgbmFtZVsxMV07Ci0KLSAgaW50IG5sZW4gPSAwOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBmaW5kIHRoZSBvcCBjb2RlIGVuZCAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOwotICAgICAgICpvcF9lbmQgJiYKLSAgICAgICAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgaWYgKAkJCS8qKm9wX2VuZCAhPSAnLicKLQkgICYmICpvcF9lbmQgIT0gJzonCi0JICAgCSAgIAkgICAJICAmJiAqLyBubGVuIDwgMTApCi0JewotCSAgbmFtZVtubGVuKytdID0gKm9wX2VuZDsKLQl9Ci0gICAgfQotICBuYW1lW25sZW5dID0gMDsKLQotICBpZiAob3BfZW5kID09IG9wX3N0YXJ0KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLQotICBvcGNvZGUgPSAoaDg1MDBfb3Bjb2RlX2luZm8gKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBuYW1lKTsKLQotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwgb3BlcmFuZCk7Ci0gIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotCi0gIG9wY29kZSA9IGdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kKTsKLQotICBpZiAob3Bjb2RlID09IDApCi0gICAgewotICAgICAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLSAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotICAgICAgd2hlcmVbMF0gPSAweDA7Ci0gICAgICB3aGVyZVsxXSA9IDB4MDsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWlsZF9ieXRlcyAob3Bjb2RlLCBvcGVyYW5kKTsKLQotfQotCi12b2lkCi1ERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi1zeW1ib2xTICoKLURFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCi0gICAgICAgY2hhciAqbmFtZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLURFRlVOICh0Y19oZWFkZXJzX2hvb2ssIChoZWFkZXJzKSwKLSAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAoKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi1zdGF0aWMKLXZvaWQKLXdvcmRpZnlfc2NiIChidWZmZXIsIGRpc3Bfc2l6ZSwgaW5zdF9zaXplKQotICAgICBjaGFyICpidWZmZXI7Ci0gICAgIGludCAqZGlzcF9zaXplOwotICAgICBpbnQgKmluc3Rfc2l6ZTsKLXsKLSAgaW50IHJuID0gYnVmZmVyWzFdICYgMHg3OwotCi0gIHN3aXRjaCAoYnVmZmVyWzBdKQotICAgIHsKLSAgICBjYXNlIDB4MGU6CQkJLyogQlNSICovCi0gICAgY2FzZSAweDIwOgotICAgIGNhc2UgMHgyMToKLSAgICBjYXNlIDB4MjI6Ci0gICAgY2FzZSAweDIzOgotICAgIGNhc2UgMHgyNDoKLSAgICBjYXNlIDB4MjU6Ci0gICAgY2FzZSAweDI2OgotICAgIGNhc2UgMHgyNzoKLSAgICBjYXNlIDB4Mjg6Ci0gICAgY2FzZSAweDI5OgotICAgIGNhc2UgMHgyYToKLSAgICBjYXNlIDB4MmI6Ci0gICAgY2FzZSAweDJjOgotICAgIGNhc2UgMHgyZDoKLSAgICBjYXNlIDB4MmU6Ci0gICAgY2FzZSAweDJmOgotICAgICAgYnVmZmVyWzBdIHw9IDB4MTA7Ci0gICAgICBidWZmZXJbMV0gPSAwOwotICAgICAgYnVmZmVyWzJdID0gMDsKLSAgICAgICpkaXNwX3NpemUgPSAyOwotICAgICAgKmluc3Rfc2l6ZSA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSAweDAxOgotICAgICAgKmluc3Rfc2l6ZSA9IDY7Ci0gICAgICAqZGlzcF9zaXplID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwNjoKLSAgICAgICppbnN0X3NpemUgPSA4OwotICAgICAgKmRpc3Bfc2l6ZSA9IDI7Ci0KLSAgICAgICpidWZmZXIrKyA9IDB4MjY7CQkvKiBibmUgKyA4ICovCi0gICAgICAqYnVmZmVyKysgPSAweDA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDA3OgotICAgICAgKmluc3Rfc2l6ZSA9IDg7Ci0gICAgICAqZGlzcF9zaXplID0gMjsKLSAgICAgICpidWZmZXIrKyA9IDB4Mjc7CQkvKiBibmUgKyA4ICovCi0gICAgICAqYnVmZmVyKysgPSAweDA4OwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gICpidWZmZXIrKyA9IDB4YTggfCBybjsJLyogYWRkcSAtMSxybiAqLwotICAqYnVmZmVyKysgPSAweDBjOwotICAqYnVmZmVyKysgPSAweDA0OwkJLyogY21wICMweGZmOjgsIHJuICovCi0gICpidWZmZXIrKyA9IDB4ZmY7Ci0gICpidWZmZXIrKyA9IDB4NzAgfCBybjsKLSAgKmJ1ZmZlcisrID0gMHgzNjsJCS8qIGJuZSAuLi4gKi8KLSAgKmJ1ZmZlcisrID0gMDsKLSAgKmJ1ZmZlcisrID0gMDsKLX0KLQotLyoKLWNhbGxlZCBhZnRlciByZWxheGluZywgY2hhbmdlIHRoZSBmcmFncyBzbyB0aGV5IGtub3cgaG93IGJpZyB0aGV5IGFyZQotKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGludCBkaXNwX3NpemUgPSAwOwotICBpbnQgaW5zdF9zaXplID0gMDsKLSAgY2hhciAqYnVmZmVyID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQlJBTkNILCBCWVRFX0RJU1ApOgotICAgICAgZGlzcF9zaXplID0gMTsKLSAgICAgIGluc3Rfc2l6ZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoU0NCX0YsIEJZVEVfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfVFNULCBCWVRFX0RJU1ApOgotICAgICAgZGlzcF9zaXplID0gMTsKLSAgICAgIGluc3Rfc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogQnJhbmNoZXMgdG8gYSBrbm93biAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0KLSAgICAgIC8qIFR1cm4gb24gdGhlIDE2Yml0IGJpdCAqLwotICAgIGNhc2UgQyAoQlJBTkNILCBXT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX0YsIFdPUkRfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfVFNULCBXT1JEX0RJU1ApOgotICAgICAgd29yZGlmeV9zY2IgKGJ1ZmZlciwgJmRpc3Bfc2l6ZSwgJmluc3Rfc2l6ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQlJBTkNILCBVTkRFRl9XT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX0YsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfVFNULCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgLyogVGhpcyB0cmllZCB0byBiZSByZWxheGVkLCBidXQgZGlkbid0IG1hbmFnZSBpdCwgaXQgbm93IG5lZWRzIGEKLQkgZml4ICovCi0gICAgICB3b3JkaWZ5X3NjYiAoYnVmZmVyLCAmZGlzcF9zaXplLCAmaW5zdF9zaXplKTsKLQotICAgICAgLyogTWFrZSBhIHJlbG9jICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwKLQkgICAgICAgZnJhZ1AtPmZyX2ZpeCArIGluc3Rfc2l6ZSwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgUl9IODUwMF9QQ1JFTDE2KTsKLQotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIHJldHVybjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChpbnN0X3NpemUpCi0gICAgewotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uICovCi0gICAgICBpbnQgbmV4dF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzICsgZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgaW50IHRhcmdfYWRkciA9IChTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKwotCQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCk7Ci0gICAgICBpbnQgZGlzcCA9IHRhcmdfYWRkciAtIG5leHRfaW5zdDsKLQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXIgKyBpbnN0X3NpemUsIGRpc3AsIGRpc3Bfc2l6ZSk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgIH0KLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIHNpemUpCi0gICAgIHNlZ1Qgc2VnIDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpIAotCSAgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOwotCi19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9yX3R5cGUgPSBmaXhQLT5meF9zaXplID09IDQgPyBSX0g4NTAwX0lNTTMyIDogUl9IODUwMF9JTU0xNjsKLSAgICB9Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotCi0gICAgY2FzZSBSX0g4NTAwX0lNTTg6Ci0gICAgY2FzZSBSX0g4NTAwX1BDUkVMODoKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgY2FzZSBSX0g4NTAwX1BDUkVMMTY6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0hJR0g4OgotICAgICAgKmJ1ZisrID0gdmFsID4+IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0hJR0gxNjoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAyNDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0zMjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgfQotfQotCi0vKgotY2FsbGVkIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbiwgcmV0dXJuIHRoZSBsZW5ndGgKLWJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvIHJlYWNoIGl0J3MgZGVzdGluYXRpb24KLSovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgQyAoQlJBTkNILCBVTkRFRl9CWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX0YsIFVOREVGX0JZVEVfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfVFNULCBVTkRFRl9CWVRFX0RJU1ApOgotICAgICAgLyogdXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24gKi8KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgLyogR290IGEgc3ltYm9sIGFuZCBpdCdzIGRlZmluZWQgaW4gdGhpcyBzZWdtZW50LCBiZWNvbWUgYnl0ZQotCSBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIEJZVEVfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSXRzIGdvdCBhIHNlZ21lbnQsIGJ1dCBpdHMgbm90IG91cnMsIHNvIGl0IHdpbGwgYWx3YXlzIGJlIGxvbmcgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgVU5ERUZfV09SRF9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIFdPUkRfRElTUCldLnJseF9sZW5ndGg7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGZyYWdQLT5mcl92YXI7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgdmFsdWVUIHVzZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQotICAgICBzeW1ib2xTICppZ25vcmU7Ci17Ci19Ci0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4X3B0cikKLSAgICAgZml4UyAqZml4X3B0cjsKLXsKLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgKi8KLSAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKLQl7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIFJfSDg1MDBfSU1NMTY7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICByZXR1cm4gUl9IODUwMF9JTU04OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHJldHVybiBmaXhfcHRyLT5meF9yX3R5cGU7Ci19Ci0KLXZvaWQKLXRjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKLSAgICAgZml4UyAqZml4X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOwotICAgICBiZmRfdm1hIGJhc2U7Ci0KLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKLQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU04OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLwotICBpZiAoc3ltYm9sX3B0cikKLSAgICB7Ci0gICAgICBzeW1ib2xTICpkb3Q7Ci0KLSAgICAgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OwotICAgICAgaWYgKGRvdCkKLQl7Ci0JICAvKgkgIGludHItPnJfb2Zmc2V0IC09Ci0JICAgIHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UKHN5bWJvbF9wdHIpXS5zY25oZHIuc19wYWRkcjsqLwotCSAgaW50ci0+cl9vZmZzZXQgKz0gU19HRVRfVkFMVUUgKHN5bWJvbF9wdHIpOwotCSAgaW50ci0+cl9zeW1uZHggPSBkb3QtPnN5X251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50ci0+cl9zeW1uZHggPSBzeW1ib2xfcHRyLT5zeV9udW1iZXI7Ci0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLSAgICB9Ci0KLX0KLQotCi0KLWludAotc3RhcnRfbGFiZWwgKHB0cikKLSAgICAgY2hhciAqcHRyOwotewotICAvKiBDaGVjayBmb3IgOnMudyAqLwotICBpZiAoaXNhbHBoYSAocHRyWzFdKSAmJiBwdHJbMl0gPT0gJy4nKQotICAgIHJldHVybiAwOwotICAvKiBDaGVjayBmb3IgOnMgKi8KLSAgaWYgKGlzYWxwaGEgKHB0clsxXSkgJiYgIWlzYWxwaGEgKHB0clsyXSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOwotfQotCi0vKiBlbmQgb2YgdGMtaDg1MDAuYyAqLwotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4NTAwLmggYi9nYXMvY29uZmlnL3RjLWg4NTAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTNlYzMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1oODUwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWg4NTAwLmgKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNkZWZpbmUgVENfSDg1MDAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBpbnRlcm5hbF9yZWxvYzsKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLQotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9oODUwMAotI2RlZmluZSBDT0ZGX01BR0lDIDB4ODUwMAotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKHgpLT5meF9hZGRzeXx8KHgpLT5meF9zdWJzeSkKLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUocyxhLGIsYykgdGNfcmVsb2NfbWFuZ2xlKGEsYixjKQotZXh0ZXJuIHZvaWQgdGNfcmVsb2NfbWFuZ2xlCi0gIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF92bWEpKTsKLQotI2RlZmluZSBET19OT1RfU1RSSVAgMAotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiSGl0YWNoaSBIOC81MDAgR0FTICIKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotI2RlZmluZSBSRUxPQ18zMiAxMjM0Ci0KLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2gsIHB0cikgIChjaCA9PSAnOicgJiYgc3RhcnRfbGFiZWwocHRyKSkKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBlbmQgb2YgdGMtaDg1MDAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmMgYi9nYXMvY29uZmlnL3RjLWhwcGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1MzI3My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWhwcGEuYworKysgL2Rldi9udWxsCkBAIC0xLDg0MjEgKzAsMCBAQAotLyogdGMtaHBwYS5jIC0tIEFzc2VtYmxlIGZvciB0aGUgUEEKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogSFAgUEEtUklTQyBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0gICBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAiYmZkL2xpYmhwcGEuaCIKLSNpbmNsdWRlICJiZmQvbGliYmZkLmgiCi0KLS8qIEJlIGNhcmVmdWwsIHRoaXMgZmlsZSBpbmNsdWRlcyBkYXRhICpkZWNsYXJhdGlvbnMqLiAgKi8KLSNpbmNsdWRlICJvcGNvZGUvaHBwYS5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgJiYgZGVmaW5lZCAoT0JKX1NPTSkKLWVycm9yIG9ubHkgb25lIG9mIE9CSl9FTEYgYW5kIE9CSl9TT00gY2FuIGJlIGRlZmluZWQKLSNlbmRpZgotCi0vKiBJZiB3ZSBhcmUgdXNpbmcgRUxGLCB0aGVuIHdlIHByb2JhYmx5IGNhbiBzdXBwb3J0IGR3YXJmMiBkZWJ1ZwotICAgcmVjb3Jkcy4gIEZ1cnRoZXJtb3JlLCBpZiB3ZSBhcmUgc3VwcG9ydGluZyBkd2FyZjIgZGVidWcgcmVjb3JkcywKLSAgIHRoZW4gd2Ugd2FudCB0byB1c2UgdGhlIGFzc2VtYmxlciBzdXBwb3J0IGZvciBjb21wYWN0IGxpbmUgbnVtYmVycy4gICovCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImR3YXJmMmRiZy5oIgotc3RydWN0IGR3YXJmMl9saW5lX2luZm8gZGVidWdfbGluZTsKLSNlbmRpZgotCi0vKiBBICJjb252aWVudCIgcGxhY2UgdG8gcHV0IG9iamVjdCBmaWxlIGRlcGVuZGVuY2llcyB3aGljaCBkbwotICAgbm90IG5lZWQgdG8gYmUgc2VlbiBvdXRzaWRlIG9mIHRjLWhwcGEuYy4gICovCi0jaWZkZWYgT0JKX0VMRgotLyogT2JqZWN0IGZpbGUgZm9ybWF0cyBzcGVjaWZ5IHJlbG9jYXRpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbGZfaHBwYV9yZWxvY190eXBlIHJlbG9jX3R5cGU7Ci0KLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSBCRkQgc3ltYm9sIHR5cGVzLiAgKi8KLXR5cGVkZWYgZWxmX3N5bWJvbF90eXBlIG9ial9zeW1ib2xfdHlwZTsKLQotI2lmZGVmIEJGRDY0Ci0vKiBIb3cgdG8gZ2VuZXJhdGUgYSByZWxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgaHBwYV9nZW5fcmVsb2NfdHlwZSBfYmZkX2VsZjY0X2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSNlbHNlCi0jZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlCi0jZW5kaWYKLQotLyogRUxGIG9iamVjdHMgY2FuIGhhdmUgdmVyc2lvbnMsIGJ1dCBhcHBhcmVudGx5IGRvIG5vdCBoYXZlIGFueXdoZXJlCi0gICB0byBzdG9yZSBhIGNvcHlyaWdodCBzdHJpbmcuICAqLwotI2RlZmluZSBvYmpfdmVyc2lvbiBvYmpfZWxmX3ZlcnNpb24KLSNkZWZpbmUgb2JqX2NvcHlyaWdodCBvYmpfZWxmX3ZlcnNpb24KLQotI2RlZmluZSBVTldJTkRfU0VDVElPTl9OQU1FICIuUEFSSVNDLnVud2luZCIKLSNlbmRpZgotCi0jaWZkZWYgT0JKX1NPTQotLyogTmFtZXMgb2YgdmFyaW91cyBkZWJ1Z2dpbmcgc3BhY2VzL3N1YnNwYWNlcy4gICovCi0jZGVmaW5lIEdEQl9ERUJVR19TUEFDRV9OQU1FICIkR0RCX0RFQlVHJCIKLSNkZWZpbmUgR0RCX1NUUklOR1NfU1VCU1BBQ0VfTkFNRSAiJEdEQl9TVFJJTkdTJCIKLSNkZWZpbmUgR0RCX1NZTUJPTFNfU1VCU1BBQ0VfTkFNRSAiJEdEQl9TWU1CT0xTJCIKLSNkZWZpbmUgVU5XSU5EX1NFQ1RJT05fTkFNRSAiJFVOV0lORCQiCi0KLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgaW50IHJlbG9jX3R5cGU7Ci0KLS8qIFNPTSBvYmplY3RzIGNhbiBoYXZlIGJvdGggYSB2ZXJzaW9uIHN0cmluZyBhbmQgYSBjb3B5cmlnaHQgc3RyaW5nLiAgKi8KLSNkZWZpbmUgb2JqX3ZlcnNpb24gb2JqX3NvbV92ZXJzaW9uCi0jZGVmaW5lIG9ial9jb3B5cmlnaHQgb2JqX3NvbV9jb3B5cmlnaHQKLQotLyogSG93IHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUKLQotLyogT2JqZWN0IGZpbGUgZm9ybWF0cyBzcGVjaWZ5IEJGRCBzeW1ib2wgdHlwZXMuICAqLwotdHlwZWRlZiBzb21fc3ltYm9sX3R5cGUgb2JqX3N5bWJvbF90eXBlOwotCi0vKiBUaGlzIGFwcGFyZW50bHkgaXNuJ3QgaW4gb2xkZXIgdmVyc2lvbnMgb2YgaHB1eCByZWxvYy5oLiAgKi8KLSNpZm5kZWYgUl9ETFRfUkVMCi0jZGVmaW5lIFJfRExUX1JFTCAweDc4Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjBTRUwKLSNkZWZpbmUgUl9OMFNFTCAweGQ4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX04xU0VMCi0jZGVmaW5lIFJfTjFTRUwgMHhkOQotI2VuZGlmCi0KLS8qIFZhcmlvdXMgc3RydWN0dXJlcyBhbmQgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGluIHRjLWhwcGEuYy4gICovCi0KLS8qIFVud2luZCB0YWJsZSBhbmQgZGVzY3JpcHRvci4gIEZJWE1FOiBTeW5jIHRoaXMgd2l0aCBHREIgdmVyc2lvbi4gICovCi0KLXN0cnVjdCB1bndpbmRfZGVzYwotICB7Ci0gICAgdW5zaWduZWQgaW50IGNhbm5vdF91bndpbmQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgbWlsbGljb2RlOjE7Ci0gICAgdW5zaWduZWQgaW50IG1pbGxpY29kZV9zYXZlX3Jlc3Q6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVnaW9uX2Rlc2M6MjsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9zcjoyOwotICAgIHVuc2lnbmVkIGludCBlbnRyeV9mcjo0OwotICAgIHVuc2lnbmVkIGludCBlbnRyeV9ncjo1OwotICAgIHVuc2lnbmVkIGludCBhcmdzX3N0b3JlZDoxOwotICAgIHVuc2lnbmVkIGludCBjYWxsX2ZyOjU7Ci0gICAgdW5zaWduZWQgaW50IGNhbGxfZ3I6NTsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9zcDoxOwotICAgIHVuc2lnbmVkIGludCBzYXZlX3JwOjE7Ci0gICAgdW5zaWduZWQgaW50IHNhdmVfcnBfaW5fZnJhbWU6MTsKLSAgICB1bnNpZ25lZCBpbnQgZXh0bl9wdHJfZGVmaW5lZDoxOwotICAgIHVuc2lnbmVkIGludCBjbGVhbnVwX2RlZmluZWQ6MTsKLQotICAgIHVuc2lnbmVkIGludCBocGVfaW50ZXJydXB0X21hcmtlcjoxOwotICAgIHVuc2lnbmVkIGludCBocHV4X2ludGVycnVwdF9tYXJrZXI6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MzsKLSAgICB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZToyNzsKLSAgfTsKLQotc3RydWN0IHVud2luZF90YWJsZQotICB7Ci0gICAgLyogU3RhcnRpbmcgYW5kIGVuZGluZyBvZmZzZXRzIG9mIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5Ci0gICAgICAgZGVzY3JpcHRvci4gICovCi0gICAgdW5zaWduZWQgaW50IHN0YXJ0X29mZnNldDsKLSAgICB1bnNpZ25lZCBpbnQgZW5kX29mZnNldDsKLSAgICBzdHJ1Y3QgdW53aW5kX2Rlc2MgZGVzY3JpcHRvcjsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgLmNhbGxpbmZvLCAuZW50ZXIsIC5sZWF2ZSBwc2V1ZG8tb3BzIHRvCi0gICBjb250cm9sIHRoZSBlbnRyeSBhbmQgZXhpdCBjb2RlIHRoZXkgZ2VuZXJhdGUuIEl0IGlzIGFsc28gdXNlZCBpbgotICAgY3JlYXRpb24gb2YgdGhlIGNvcnJlY3Qgc3RhY2sgdW53aW5kIGRlc2NyaXB0b3JzLgotCi0gICBOT1RFOiAgR0FTIGRvZXMgbm90IHN1cHBvcnQgLmVudGVyIGFuZCAubGVhdmUgZm9yIHRoZSBnZW5lcmF0aW9uIG9mCi0gICBwcm9sb2d1ZXMgYW5kIGVwaWxvZ3Vlcy4gIEZJWE1FLgotCi0gICBUaGUgZmllbGRzIGluIHN0cnVjdHVyZSByb3VnaGx5IGNvcnJlc3BvbmQgdG8gdGhlIGFyZ3VtZW50cyBhdmFpbGFibGUgb24gdGhlCi0gICAuY2FsbGluZm8gcHNldWRvLW9wLiAgKi8KLQotc3RydWN0IGNhbGxfaW5mbwotICB7Ci0gICAgLyogVGhlIHVud2luZCBkZXNjcmlwdG9yIGJlaW5nIGJ1aWx0LiAgKi8KLSAgICBzdHJ1Y3QgdW53aW5kX3RhYmxlIGNpX3Vud2luZDsKLQotICAgIC8qIE5hbWUgb2YgdGhpcyBmdW5jdGlvbi4gICovCi0gICAgc3ltYm9sUyAqc3RhcnRfc3ltYm9sOwotCi0gICAgLyogKHRlbXBvcmFyeSkgc3ltYm9sIHVzZWQgdG8gbWFyayB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uICAqLwotICAgIHN5bWJvbFMgKmVuZF9zeW1ib2w7Ci0KLSAgICAvKiBOZXh0IGVudHJ5IGluIHRoZSBjaGFpbi4gICovCi0gICAgc3RydWN0IGNhbGxfaW5mbyAqY2lfbmV4dDsKLSAgfTsKLQotLyogT3BlcmFuZCBmb3JtYXRzIGZvciBGUCBpbnN0cnVjdGlvbnMuICAgTm90ZSBub3QgYWxsIEZQIGluc3RydWN0aW9ucwotICAgYWxsb3cgYWxsIGZvdXIgZm9ybWF0cyB0byBiZSB1c2VkIChmb3IgZXhhbXBsZSBmbXB5c3ViIG9ubHkgYWxsb3dzCi0gICBTR0wgYW5kIERCTCkuICAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBTR0wsIERCTCwgSUxMRUdBTF9GTVQsIFFVQUQsIFcsIFVXLCBEVywgVURXLCBRVywgVVFXCi0gIH0KLWZwX29wZXJhbmRfZm9ybWF0OwotCi0vKiBUaGlzIGZ1bGx5IGRlc2NyaWJlcyB0aGUgc3ltYm9sIHR5cGVzIHdoaWNoIG1heSBiZSBhdHRhY2hlZCB0bwotICAgYW4gRVhQT1JUIG9yIElNUE9SVCBkaXJlY3RpdmUuICBPbmx5IFNPTSB1c2VzIHRoaXMgZm9ybWF0aW9uCi0gICAoRUxGIGhhcyBubyBuZWVkIGZvciBpdCkuICAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBTWU1CT0xfVFlQRV9VTktOT1dOLAotICAgIFNZTUJPTF9UWVBFX0FCU09MVVRFLAotICAgIFNZTUJPTF9UWVBFX0NPREUsCi0gICAgU1lNQk9MX1RZUEVfREFUQSwKLSAgICBTWU1CT0xfVFlQRV9FTlRSWSwKLSAgICBTWU1CT0xfVFlQRV9NSUxMSUNPREUsCi0gICAgU1lNQk9MX1RZUEVfUExBQkVMLAotICAgIFNZTUJPTF9UWVBFX1BSSV9QUk9HLAotICAgIFNZTUJPTF9UWVBFX1NFQ19QUk9HLAotICB9Ci1wYV9zeW1ib2xfdHlwZTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGFzc2VtYmxlCi0gICBpbmRpdmlkdWFsIGluc3RydWN0aW9ucy4gICovCi1zdHJ1Y3QgcGFfaXQKLSAgewotICAgIC8qIEhvbGRzIHRoZSBvcGNvZGUgYWZ0ZXIgcGFyc2luZyBieSBwYV9pcC4gICovCi0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgICAvKiBIb2xkcyBhbiBleHByZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi0gICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgLyogRG9lcyB0aGlzIGluc3RydWN0aW9uIHVzZSBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nLiAgKi8KLSAgICBpbnQgcGNyZWw7Ci0KLSAgICAvKiBGbG9hdGluZyBwb2ludCBmb3JtYXRzIGZvciBvcGVyYW5kMSBhbmQgb3BlcmFuZDIuICAqLwotICAgIGZwX29wZXJhbmRfZm9ybWF0IGZwb2YxOwotICAgIGZwX29wZXJhbmRfZm9ybWF0IGZwb2YyOwotCi0gICAgLyogV2hldGhlciBvciBub3Qgd2Ugc2F3IGEgdHJ1bmNhdGlvbiByZXF1ZXN0IG9uIGFuIGZjbnYgaW5zbi4gICovCi0gICAgaW50IHRydW5jOwotCi0gICAgLyogSG9sZHMgdGhlIGZpZWxkIHNlbGVjdG9yIGZvciB0aGlzIGluc3RydWN0aW9uCi0gICAgICAgKGZvciBleGFtcGxlIEwlLCBMUiUsIGV0YykuICAqLwotICAgIGxvbmcgZmllbGRfc2VsZWN0b3I7Ci0KLSAgICAvKiBIb2xkcyBhbnkgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgICAgaW5zdHJ1Y3Rpb24uICAoaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIHNvbWUgc29ydCBvZiBjYWxsKS4gICovCi0gICAgbG9uZyBhcmdfcmVsb2M7Ci0KLSAgICAvKiBUaGUgZm9ybWF0IHNwZWNpZmljYXRpb24gZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgIGludCBmb3JtYXQ7Ci0KLSAgICAvKiBUaGUgcmVsb2NhdGlvbiAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgcmVsb2NfdHlwZSByZWxvYzsKLSAgfTsKLQotLyogUEEtODkgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFyZSBhcnJhbmdlZCBsaWtlIHRoaXM6Ci0KLQotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotICAgfCAgIDAgb3IgMTZMICAgfCAgMTYgb3IgMTZSICAgfAotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotICAgfCAgIDEgb3IgMTdMICAgfCAgMTcgb3IgMTdSICAgfAotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAotCi0gICAuICAgICAgICAgICAgICAuICAgICAgICAgICAgICAuCi0gICAuICAgICAgICAgICAgICAuICAgICAgICAgICAgICAuCi0gICAuICAgICAgICAgICAgICAuICAgICAgICAgICAgICAuCi0KLSAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgIDE0IG9yIDMwTCAgIHwgIDMwIG9yIDMwUiAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgIDE1IG9yIDMxTCAgIHwgIDMxIG9yIDMxUiAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLQotCi0gICBUaGUgZm9sbG93aW5nIGlzIGEgdmVyc2lvbiBvZiBwYV9wYXJzZV9udW1iZXIgdGhhdAotICAgaGFuZGxlcyB0aGUgTC9SIG5vdGF0aW9uIGFuZCByZXR1cm5zIHRoZSBjb3JyZWN0Ci0gICB2YWx1ZSB0byBwdXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIgZmllbGQuCi0gICBUaGUgY29ycmVjdCB2YWx1ZSB0byBwdXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24gaXMKLSAgIGVuY29kZWQgaW4gdGhlIHN0cnVjdHVyZSAncGFfMTFfZnBfcmVnX3N0cnVjdCcuICAqLwotCi1zdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdAotICB7Ci0gICAgLyogVGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgY2hhciBudW1iZXJfcGFydDsKLQotICAgIC8qIEwvUiBzZWxlY3Rvci4gICovCi0gICAgY2hhciBsX3Jfc2VsZWN0OwotICB9OwotCi0vKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lZWRlZCB0byBidWlsZCBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWJzLiAgKi8KLXN0cnVjdCBjYWxsX2Rlc2MKLSAgewotICAgIC8qIFRoZSBhcmd1bWVudCByZWxvY2F0aW9uIHNwZWNpZmljYXRpb24uICAqLwotICAgIHVuc2lnbmVkIGludCBhcmdfcmVsb2M7Ci0KLSAgICAvKiBOdW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgYXJnX2NvdW50OwotICB9OwotCi0jaWZkZWYgT0JKX1NPTQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBlbnRyeSBpbiB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeQotICAgY2hhaW4uICAqLwotCi1zdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbgotICB7Ci0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNzZF9kZWZpbmVkOwotCi0gICAgLyogTmFtZSBvZiB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICBjaGFyICpzc2RfbmFtZTsKLQotICAgIC8qIEdBUyBzZWdtZW50IGFuZCBzdWJzZWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICBhc2VjdGlvbiAqc3NkX3NlZzsKLSAgICBpbnQgc3NkX3N1YnNlZzsKLQotICAgIC8qIE5leHQgc3BhY2UgaW4gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkgY2hhaW4uICAqLwotICAgIHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluICpzc2RfbmV4dDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbiBzc2RfY2hhaW5fc3RydWN0OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGVudHJ5IGluIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5Ci0gICBjaGFpbi4gICovCi0KLXN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X2NoYWluCi0gIHsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgaGFzIGJlZW4gZGVmaW5lZCBieSB0aGUgdXNlciBjb2RlIG9yCi0gICAgICAgYXMgYSBkZWZhdWx0IHNwYWNlLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgc2RfZGVmaW5lZDsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZXMgaGFzIGJlZW4gZGVmaW5lZCBieSB0aGUgdXNlciBjb2RlLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgc2RfdXNlcl9kZWZpbmVkOwotCi0gICAgLyogVGhlIHNwYWNlIG51bWJlciAob3IgaW5kZXgpLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgc2Rfc3BudW07Ci0KLSAgICAvKiBUaGUgbmFtZSBvZiB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICBjaGFyICpzZF9uYW1lOwotCi0gICAgLyogR0FTIHNlZ21lbnQgdG8gd2hpY2ggdGhpcyBzdWJzcGFjZSBjb3JyZXNwb25kcy4gICovCi0gICAgYXNlY3Rpb24gKnNkX3NlZzsKLQotICAgIC8qIEN1cnJlbnQgc3Vic2VnbWVudCBudW1iZXIgYmVpbmcgdXNlZC4gICovCi0gICAgaW50IHNkX2xhc3Rfc3Vic2VnOwotCi0gICAgLyogVGhlIGNoYWluIG9mIHN1YnNwYWNlcyBjb250YWluZWQgd2l0aGluIHRoaXMgc3BhY2UuICAqLwotICAgIHNzZF9jaGFpbl9zdHJ1Y3QgKnNkX3N1YnNwYWNlczsKLQotICAgIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoZSBzcGFjZSBkaWN0aW9uYXJ5IGNoYWluLiAgKi8KLSAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9jaGFpbiAqc2RfbmV4dDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9jaGFpbiBzZF9jaGFpbl9zdHJ1Y3Q7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYXR0cmlidXRlcyBvZiB0aGUgZGVmYXVsdCBzdWJzcGFjZQotICAgZGljdGlvbmFyeSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGRlZmF1bHRfc3Vic3BhY2VfZGljdAotICB7Ci0gICAgLyogTmFtZSBvZiB0aGUgc3Vic3BhY2UuICAqLwotICAgIGNoYXIgKm5hbWU7Ci0KLSAgICAvKiBGSVhNRS4gIElzIHRoaXMgc3RpbGwgbmVlZGVkPyAgKi8KLSAgICBjaGFyIGRlZmluZWQ7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3Vic3BhY2UgaXMgbG9hZGFibGUuICAqLwotICAgIGNoYXIgbG9hZGFibGU7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3Vic3BhY2UgY29udGFpbnMgb25seSBjb2RlLiAgKi8KLSAgICBjaGFyIGNvZGVfb25seTsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGNvbW1vbiBzdWJzcGFjZS4gICovCi0gICAgY2hhciBjb21tb247Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3Vic3BhY2Ugd2hpY2ggYWxsb3dzIHN5bWJvbHMKLSAgICAgICB0byBiZSBtdWx0aXBseSBkZWZpbmVkLiAgKi8KLSAgICBjaGFyIGR1cF9jb21tb247Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3Vic3BhY2Ugc2hvdWxkIGJlIHplcm8gZmlsbGVkLiAgKi8KLSAgICBjaGFyIHplcm87Ci0KLSAgICAvKiBTb3J0IGtleSBmb3IgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgdW5zaWduZWQgY2hhciBzb3J0OwotCi0gICAgLyogQWNjZXNzIGNvbnRyb2wgYml0cyBmb3IgdGhpcyBzdWJzcGFjZS4gIENhbiByZXByZXNlbnQgUldYIGFjY2VzcwotICAgICAgIGFzIHdlbGwgYXMgcHJpdmlsZWdlIGxldmVsIGNoYW5nZXMgZm9yIGdhdGV3YXlzLiAgKi8KLSAgICBpbnQgYWNjZXNzOwotCi0gICAgLyogSW5kZXggb2YgY29udGFpbmluZyBzcGFjZS4gICovCi0gICAgaW50IHNwYWNlX2luZGV4OwotCi0gICAgLyogQWxpZ25tZW50IChpbiBieXRlcykgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgaW50IGFsaWdubWVudDsKLQotICAgIC8qIFF1YWRyYW50IHdpdGhpbiBzcGFjZSB3aGVyZSB0aGlzIHN1YnNwYWNlIHNob3VsZCBiZSBsb2FkZWQuICAqLwotICAgIGludCBxdWFkcmFudDsKLQotICAgIC8qIEFuIGluZGV4IGludG8gdGhlIGRlZmF1bHQgc3BhY2VzIGFycmF5LiAgKi8KLSAgICBpbnQgZGVmX3NwYWNlX2luZGV4OwotCi0gICAgLyogU3Vic2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCi0gICAgc3Vic2VnVCBzdWJzZWdtZW50OwotICB9OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGF0dHJpYnV0ZXMgb2YgdGhlIGRlZmF1bHQgc3BhY2UKLSAgIGRpY3Rpb25hcnkgZW50cmllcy4gICovCi0KLXN0cnVjdCBkZWZhdWx0X3NwYWNlX2RpY3QKLSAgewotICAgIC8qIE5hbWUgb2YgdGhlIHNwYWNlLiAgKi8KLSAgICBjaGFyICpuYW1lOwotCi0gICAgLyogU3BhY2UgbnVtYmVyLiAgSXQgaXMgcG9zc2libGUgdG8gaWRlbnRpZnkgc3BhY2VzIHdpdGhpbgotICAgICAgIGFzc2VtYmx5IGNvZGUgbnVtZXJpY2FsbHkhICAqLwotICAgIGludCBzcG51bTsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBpcyBsb2FkYWJsZS4gICovCi0gICAgY2hhciBsb2FkYWJsZTsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBpcyAiZGVmaW5lZCIuICBGSVhNRSBpcyBzdGlsbCBuZWVkZWQgKi8KLSAgICBjaGFyIGRlZmluZWQ7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgY2FuIG5vdCBiZSBzaGFyZWQuICAqLwotICAgIGNoYXIgcHJpdmF0ZTsKLQotICAgIC8qIFNvcnQga2V5IGZvciB0aGlzIHNwYWNlLiAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHNvcnQ7Ci0KLSAgICAvKiBTZWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNwYWNlLiAgKi8KLSAgICBhc2VjdGlvbiAqc2VnbWVudDsKLSAgfTsKLSNlbmRpZgotCi0vKiBTdHJ1Y3R1cmUgZm9yIHByZXZpb3VzIGxhYmVsIHRyYWNraW5nLiAgTmVlZGVkIHNvIHRoYXQgYWxpZ25tZW50cywKLSAgIGNhbGxpbmZvIGRlY2xhcmF0aW9ucywgZXRjIGNhbiBiZSBlYXNpbHkgYXR0YWNoZWQgdG8gYSBwYXJ0aWN1bGFyCi0gICBsYWJlbC4gICovCi10eXBlZGVmIHN0cnVjdCBsYWJlbF9zeW1ib2xfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpsc3NfbGFiZWw7Ci0jaWZkZWYgT0JKX1NPTQotICAgIHNkX2NoYWluX3N0cnVjdCAqbHNzX3NwYWNlOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIHNlZ1QgbHNzX3NlZ21lbnQ7Ci0jZW5kaWYKLSAgICBzdHJ1Y3QgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbHNzX25leHQ7Ci0gIH0KLWxhYmVsX3N5bWJvbF9zdHJ1Y3Q7Ci0KLS8qIEV4dHJhIGluZm9ybWF0aW9uIG5lZWRlZCB0byBwZXJmb3JtIGZpeHVwcyAocmVsb2NhdGlvbnMpIG9uIHRoZSBQQS4gICovCi1zdHJ1Y3QgaHBwYV9maXhfc3RydWN0Ci0gIHsKLSAgICAvKiBUaGUgZmllbGQgc2VsZWN0b3IuICAqLwotICAgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCBmeF9yX2ZpZWxkOwotCi0gICAgLyogVHlwZSBvZiBmaXh1cC4gICovCi0gICAgaW50IGZ4X3JfdHlwZTsKLQotICAgIC8qIEZvcm1hdCBvZiBmaXh1cC4gICovCi0gICAgaW50IGZ4X3JfZm9ybWF0OwotCi0gICAgLyogQXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzLiAgKi8KLSAgICBsb25nIGZ4X2FyZ19yZWxvYzsKLQotICAgIC8qIFRoZSBzZWdtZW50IHRoaXMgZml4dXAgYXBwZWFycyBpbi4gICovCi0gICAgc2VnVCBzZWdtZW50OwotICB9OwotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi0KLXN0cnVjdCBwZF9yZWcKLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IHZhbHVlOwotICB9OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBtYXBwaW5nIGZyb20gYSBGUCBjb25kaXRpb24gc3RyaW5nCi0gICB0byBhIGNvbmRpdGlvbiBudW1iZXIgd2hpY2ggY2FuIGJlIHJlY29yZGVkIGluIGFuIGluc3RydWN0aW9uLiAgKi8KLXN0cnVjdCBmcF9jb25kX21hcAotICB7Ci0gICAgY2hhciAqc3RyaW5nOwotICAgIGludCBjb25kOwotICB9OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgbWFwcGluZyBmcm9tIGEgZmllbGQgc2VsZWN0b3IKLSAgIHN0cmluZyB0byBhIGZpZWxkIHNlbGVjdG9yIHR5cGUuICAqLwotc3RydWN0IHNlbGVjdG9yX2VudHJ5Ci0gIHsKLSAgICBjaGFyICpwcmVmaXg7Ci0gICAgaW50IGZpZWxkX3NlbGVjdG9yOwotICB9OwotCi0vKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgbG9jYWwgdG8gdGMtaHBwYS5jLiAgKi8KLQotI2lmZGVmIE9CSl9TT00KLXN0YXRpYyB2b2lkIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi1zdGF0aWMgZnBfb3BlcmFuZF9mb3JtYXQgcGFfcGFyc2VfZnBfZm9ybWF0IFBBUkFNUyAoKGNoYXIgKipzKSk7Ci1zdGF0aWMgdm9pZCBwYV9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9maWxsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbGNvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sc3ltIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfc3RyaW5nZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfZnBfY21wX2NvbmQgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBnZXRfZXhwcmVzc2lvbiBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gUEFSQU1TICgoc3RydWN0IHBhX2l0ICosIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgZXZhbHVhdGVfYWJzb2x1dGUgUEFSQU1TICgoc3RydWN0IHBhX2l0ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfYnVpbGRfYXJnX3JlbG9jIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBwYV9hbGlnbl9hcmdfcmVsb2MgUEFSQU1TICgodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfbnVsbGlmIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2NtcGJfNjRfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfY21waWJfNjRfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfYWRkYl82NF9jbXBsdHIgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgcGFfYmxvY2sgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9icnRhYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3RyeSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2NhbGwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jYWxsX2FyZ3MgUEFSQU1TICgoc3RydWN0IGNhbGxfZGVzYyAqKSk7Ci1zdGF0aWMgdm9pZCBwYV9jYWxsaW5mbyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2NvZGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY29weXJpZ2h0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW5kIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW50ZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9lbnRyeSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VxdSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2V4aXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9leHBvcnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90eXBlX2FyZ3MgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2ltcG9ydCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xhYmVsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbGVhdmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sZXZlbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX29yaWdpbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3Byb2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9wcm9jZW5kIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfcGFyYW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV91bmRlZmluZV9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IG5lZWRfcGExMV9vcGNvZGUgUEFSQU1TICgoc3RydWN0IHBhX2l0ICosCi0JCQkJICAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX251bWJlciBQQVJBTVMgKChjaGFyICoqLCBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqKSk7Ci1zdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqcGFfZ2V0X2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKLSNpZmRlZiBPQkpfU09NCi1zdGF0aWMgdm9pZCBwYV9jb21waWxlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfc3BhY2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9zcG51bSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3N1YnNwYWNlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqY3JlYXRlX25ld19zcGFjZSBQQVJBTVMgKChjaGFyICosIGludCwgaW50LAotCQkJCQkJICBpbnQsIGludCwgaW50LAotCQkJCQkJICBhc2VjdGlvbiAqLCBpbnQpKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICpjcmVhdGVfbmV3X3N1YnNwYWNlIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqLAotCQkJCQkJICAgICAgY2hhciAqLCBpbnQsIGludCwKLQkJCQkJCSAgICAgIGludCwgaW50LCBpbnQsCi0JCQkJCQkgICAgICBpbnQsIGludCwgaW50LCBpbnQsCi0JCQkJCQkgICAgICBpbnQsIGFzZWN0aW9uICopKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICp1cGRhdGVfc3Vic3BhY2UgUEFSQU1TICgoc2RfY2hhaW5fc3RydWN0ICosCi0JCQkJCQkgIGNoYXIgKiwgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwgaW50LAotCQkJCQkJICBpbnQsIGludCwgaW50LAotCQkJCQkJICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICppc19kZWZpbmVkX3NwYWNlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKmlzX2RlZmluZWRfc3Vic3BhY2UgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9zZWdtZW50X3RvX3NwYWNlIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICpwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIFBBUkFNUyAoKGFzZWN0aW9uICosCi0JCQkJCQkJICAgIHN1YnNlZ1QpKTsKLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKnBhX2ZpbmRfc3BhY2VfYnlfbnVtYmVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHVuc2lnbmVkIGludCBwYV9zdWJzcGFjZV9zdGFydCBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKiwgaW50KSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9wYXJzZV9zcGFjZV9zdG10IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX25leHRfc3Vic2VnIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqKSk7Ci1zdGF0aWMgdm9pZCBwYV9zcGFjZXNfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBwYV9pcCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGZpeF9uZXdfaHBwYSBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGludCwgc3ltYm9sUyAqLAotCQkJCSAgbG9uZywgZXhwcmVzc2lvblMgKiwgaW50LAotCQkJCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLAotCQkJCSAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0LAotCQkJCSAgaW50LCBsb25nLCBpbnQgKikpOwotc3RhdGljIGludCBpc19lbmRfb2Zfc3RhdGVtZW50IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBwYV9jaGtfZmllbGRfc2VsZWN0b3IgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBpc19zYW1lX2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgZnJhZ1MgKikpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19leGl0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgbG9nMiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfc3RyaW5nZXJfYXV4IFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGZwX29wZXJhbmRfZm9ybWF0IHBhX3BhcnNlX2ZwX2Nudl9mb3JtYXQgUEFSQU1TICgoY2hhciAqKnMpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfZnRlc3RfZ2Z4X2NvbXBsZXRlciBQQVJBTVMgKChjaGFyICoqKSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UgUEFSQU1TICgoc3RydWN0IGNhbGxfaW5mbyAqKSk7Ci0jZW5kaWYKLQotLyogRmlsZSBhbmQgZ2xvYWxseSBzY29wZWQgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAgKi8KLQotI2lmZGVmIE9CSl9TT00KLS8qIFJvb3QgYW5kIGZpbmFsIGVudHJ5IGluIHRoZSBzcGFjZSBjaGFpbi4gICovCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9kaWN0X3Jvb3Q7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9kaWN0X2xhc3Q7Ci0KLS8qIFRoZSBjdXJyZW50IHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpjdXJyZW50X3NwYWNlOwotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKmN1cnJlbnRfc3Vic3BhY2U7Ci0jZW5kaWYKLQotLyogUm9vdCBvZiB0aGUgY2FsbF9pbmZvIGNoYWluLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm9fcm9vdDsKLQotLyogVGhlIGxhc3QgY2FsbF9pbmZvIChmb3IgZnVuY3Rpb25zKSBzdHJ1Y3R1cmUKLSAgIHNlZW4gc28gaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBmaXh1cHMgYW5kCi0gICBmdW5jdGlvbiBsYWJlbHMuICAqLwotc3RhdGljIHN0cnVjdCBjYWxsX2luZm8gKmxhc3RfY2FsbF9pbmZvOwotCi0vKiBUaGUgbGFzdCBjYWxsIGRlc2NyaXB0aW9uIChmb3IgYWN0dWFsIGNhbGxzKS4gICovCi1zdGF0aWMgc3RydWN0IGNhbGxfZGVzYyBsYXN0X2NhbGxfZGVzYzsKLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLQotLyogVGFibGUgb2YgcHNldWRvIG9wcyBmb3IgdGhlIFBBLiAgRklYTUUgLS0gaG93IG1hbnkgb2YgdGhlc2UKLSAgIGFyZSBub3cgcmVkdW5kYW50IHdpdGggdGhlIG92ZXJhbGwgR0FTIGFuZCB0aGUgb2JqZWN0IGZpbGUKLSAgIGRlcGVuZGVudCB0YWJsZXM/ICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgLyogYWxpZ24gcHNldWRvLW9wcyBvbiB0aGUgUEEgc3BlY2lmeSB0aGUgYWN0dWFsIGFsaWdubWVudCByZXF1ZXN0ZWQsCi0gICAgIG5vdCB0aGUgbG9nMiBvZiB0aGUgcmVxdWVzdGVkIGFsaWdubWVudC4gICovCi0jaWZkZWYgT0JKX1NPTQotICB7ImFsaWduIiwgcGFfYWxpZ24sIDh9LAotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgOH0sCi0jZW5kaWYKLSAgeyJiZWdpbl9icnRhYiIsIHBhX2JydGFiLCAxfSwKLSAgeyJiZWdpbl90cnkiLCBwYV90cnksIDF9LAotICB7ImJsb2NrIiwgcGFfYmxvY2ssIDF9LAotICB7ImJsb2NreiIsIHBhX2Jsb2NrLCAwfSwKLSAgeyJieXRlIiwgcGFfY29ucywgMX0sCi0gIHsiY2FsbCIsIHBhX2NhbGwsIDB9LAotICB7ImNhbGxpbmZvIiwgcGFfY2FsbGluZm8sIDB9LAotICB7ImNvZGUiLCBwYV9jb2RlLCAwfSwKLSAgeyJjb21tIiwgcGFfY29tbSwgMH0sCi0jaWZkZWYgT0JKX1NPTQotICB7ImNvbXBpbGVyIiwgcGFfY29tcGlsZXIsIDB9LAotI2VuZGlmCi0gIHsiY29weXJpZ2h0IiwgcGFfY29weXJpZ2h0LCAwfSwKLSAgeyJkYXRhIiwgcGFfZGF0YSwgMH0sCi0gIHsiZG91YmxlIiwgcGFfZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJkd29yZCIsIHBhX2NvbnMsIDh9LAotICB7ImVuZCIsIHBhX2VuZCwgMH0sCi0gIHsiZW5kX2JydGFiIiwgcGFfYnJ0YWIsIDB9LAotICB7ImVuZF90cnkiLCBwYV90cnksIDB9LAotICB7ImVudGVyIiwgcGFfZW50ZXIsIDB9LAotICB7ImVudHJ5IiwgcGFfZW50cnksIDB9LAotICB7ImVxdSIsIHBhX2VxdSwgMH0sCi0gIHsiZXhpdCIsIHBhX2V4aXQsIDB9LAotICB7ImV4cG9ydCIsIHBhX2V4cG9ydCwgMH0sCi0jaWZkZWYgT0JKX0VMRgotICB7ICJmaWxlIiwgZHdhcmYyX2RpcmVjdGl2ZV9maWxlIH0sCi0jZW5kaWYKLSAgeyJmaWxsIiwgcGFfZmlsbCwgMH0sCi0gIHsiZmxvYXQiLCBwYV9mbG9hdF9jb25zLCAnZid9LAotICB7ImhhbGYiLCBwYV9jb25zLCAyfSwKLSAgeyJpbXBvcnQiLCBwYV9pbXBvcnQsIDB9LAotICB7ImludCIsIHBhX2NvbnMsIDR9LAotICB7ImxhYmVsIiwgcGFfbGFiZWwsIDB9LAotICB7Imxjb21tIiwgcGFfbGNvbW0sIDB9LAotICB7ImxlYXZlIiwgcGFfbGVhdmUsIDB9LAotICB7ImxldmVsIiwgcGFfbGV2ZWwsIDB9LAotI2lmZGVmIE9CSl9FTEYKLSAgeyAibG9jIiwgZHdhcmYyX2RpcmVjdGl2ZV9sb2MgfSwKLSNlbmRpZgotICB7ImxvbmciLCBwYV9jb25zLCA0fSwKLSAgeyJsc3ltIiwgcGFfbHN5bSwgMH0sCi0jaWZkZWYgT0JKX1NPTQotICB7Im5zdWJzcGEiLCBwYV9zdWJzcGFjZSwgMX0sCi0jZW5kaWYKLSAgeyJvY3RhIiwgcGFfY29ucywgMTZ9LAotICB7Im9yZyIsIHBhX29yaWdpbiwgMH0sCi0gIHsib3JpZ2luIiwgcGFfb3JpZ2luLCAwfSwKLSAgeyJwYXJhbSIsIHBhX3BhcmFtLCAwfSwKLSAgeyJwcm9jIiwgcGFfcHJvYywgMH0sCi0gIHsicHJvY2VuZCIsIHBhX3Byb2NlbmQsIDB9LAotICB7InF1YWQiLCBwYV9jb25zLCA4fSwKLSAgeyJyZWciLCBwYV9lcXUsIDF9LAotICB7InNob3J0IiwgcGFfY29ucywgMn0sCi0gIHsic2luZ2xlIiwgcGFfZmxvYXRfY29ucywgJ2YnfSwKLSNpZmRlZiBPQkpfU09NCi0gIHsic3BhY2UiLCBwYV9zcGFjZSwgMH0sCi0gIHsic3BudW0iLCBwYV9zcG51bSwgMH0sCi0jZW5kaWYKLSAgeyJzdHJpbmciLCBwYV9zdHJpbmdlciwgMH0sCi0gIHsic3RyaW5neiIsIHBhX3N0cmluZ2VyLCAxfSwKLSNpZmRlZiBPQkpfU09NCi0gIHsic3Vic3BhIiwgcGFfc3Vic3BhY2UsIDB9LAotI2VuZGlmCi0gIHsidGV4dCIsIHBhX3RleHQsIDB9LAotICB7InZlcnNpb24iLCBwYV92ZXJzaW9uLCAwfSwKLSAgeyJ3b3JkIiwgcGFfY29ucywgNH0sCi0gIHtOVUxMLCAwLCAwfQotfTsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dC4KLQotICAgTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4KLQotICAgQWxzbyBub3RlIHRoYXQgQyBzdHlsZSBjb21tZW50cyB3aWxsIGFsd2F5cyB3b3JrLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcmFjdGVycyB3aGljaCBhY3QgYXMgbGluZSBzZXBhcmF0b3JzLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIhIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LgotICAgQXMgaW4gMGYxMi40NTYgb3IgMGQxLjIzNDVlMTIuCi0KLSAgIEJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhZSB0byBrbm93IGFib3UgaXQgYXQKLSAgIGFsbCwgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi1zdGF0aWMgc3RydWN0IHBhX2l0IHRoZV9pbnNuOwotCi0vKiBQb2ludHMgdG8gdGhlIGVuZCBvZiBhbiBleHByZXNzaW9uIGp1c3QgcGFyc2VkIGJ5IGdldF9leHByZXNzb2luCi0gICBhbmQgZnJpZW5kcy4gIEZJWE1FLiAgVGhpcyBzaG91bGRuJ3QgYmUgaGFuZGxlZCB3aXRoIGEgZmlsZS1nbG9iYWwKLSAgIHZhcmlhYmxlLiAgKi8KLXN0YXRpYyBjaGFyICpleHByX2VuZDsKLQotLyogTm9uemVybyBpZiBhIC5jYWxsaW5mbyBhcHBlYXJlZCB3aXRoaW4gdGhlIGN1cnJlbnQgcHJvY2VkdXJlLiAgKi8KLXN0YXRpYyBpbnQgY2FsbGluZm9fZm91bmQ7Ci0KLS8qIE5vbnplcm8gaWYgdGhlIGFzc2VtYmxlciBpcyBjdXJyZW50bHkgd2l0aGluIGEgLmVudHJ5Ly5leGl0IHBhaXIuICAqLwotc3RhdGljIGludCB3aXRoaW5fZW50cnlfZXhpdDsKLQotLyogTm9uemVybyBpZiB0aGUgYXNzZW1ibGVyIGlzIGN1cnJlbnRseSB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gICovCi1zdGF0aWMgaW50IHdpdGhpbl9wcm9jZWR1cmU7Ci0KLS8qIEhhbmRsZSBvbiBzdHJ1Y3V0cmUgd2hpY2gga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzeW1ib2wKLSAgIHNlZW4gaW4gZWFjaCBzdWJzcGFjZS4gICovCi1zdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sc19yb290cCA9IE5VTEw7Ci0KLS8qIEhvbGRzIHRoZSBsYXN0IGZpZWxkIHNlbGVjdG9yLiAgKi8KLXN0YXRpYyBpbnQgaHBwYV9maWVsZF9zZWxlY3RvcjsKLQotLyogTm9uemVybyB3aGVuIHN0cmljdCBzeW50YXggY2hlY2tpbmcgaXMgZW5hYmxlZC4gIFplcm8gb3RoZXJ3aXNlLgotCi0gICBFYWNoIG9wY29kZSBpbiB0aGUgdGFibGUgaGFzIGEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QKLSAgIHN0cmljdCBzeW50YXggY2hlY2tpbmcgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoYXQgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIGludCBzdHJpY3QgPSAwOwotCi0jaWZkZWYgT0JKX1NPTQotLyogQSBkdW1teSBiZmQgc3ltYm9sIHNvIHRoYXQgYWxsIHJlbG9jYXRpb25zIGhhdmUgc3ltYm9scyBvZiBzb21lIGtpbmQuICAqLwotc3RhdGljIHN5bWJvbFMgKmR1bW15X3N5bWJvbDsKLSNlbmRpZgotCi0vKiBOb256ZXJvIGlmIGVycm9ycyBhcmUgdG8gYmUgcHJpbnRlZC4gICovCi1zdGF0aWMgaW50IHByaW50X2Vycm9ycyA9IDE7Ci0KLS8qIExpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHByZS1kZWZpbmVkOgotCi0gICBFYWNoIGdlbmVyYWwgcmVnaXN0ZXIgaGFzIG9uZSBwcmVkZWZpbmVkIG5hbWUgb2YgdGhlIGZvcm0KLSAgICVyPFJFR05VTT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8UkVHTlVNPi4KLQotICAgU3BhY2UgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSBoYW5kbGVkIGluIGEgc2ltaWxhciBtYW5uZXIsCi0gICBidXQgdXNlICVzcjxSRUdOVU0+IGFuZCAlY3I8UkVHTlVNPiBhcyB0aGVpciBwcmVkZWZpbmVkIG5hbWVzLgotCi0gICBMaWtld2lzZSBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgYnV0IG9mIHRoZSBmb3JtCi0gICAlZnI8UkVHTlVNPi4gIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBoYXZlIGFkZGl0aW9uYWwgcHJlZGVmaW5lZAotICAgbmFtZXMgd2l0aCAnTCcgYW5kICdSJyBzdWZmaXhlcyAoZS5nLiAlZnIxOUwsICVmcjE5Uikgd2hpY2gKLSAgIGFnYWluIGhhdmUgdGhlIHZhbHVlIDxSRUdOVU0+LgotCi0gICBNYW55IHJlZ2lzdGVycyBhbHNvIGhhdmUgc3lub255bXM6Ci0KLSAgICVyMjYgLSAlcjIzIGhhdmUgJWFyZzAgLSAlYXJnMyBhcyBzeW5vbnltcwotICAgJXIyOCAtICVyMjkgaGF2ZSAlcmV0MCAtICVyZXQxIGFzIHN5bm9ueW1zCi0gICAlcjMwIGhhcyAlc3AgYXMgYSBzeW5vbnltCi0gICAlcjI3IGhhcyAlZHAgYXMgYSBzeW5vbnltCi0gICAlcjIgIGhhcyAlcnAgYXMgYSBzeW5vbnltCi0KLSAgIEFsbW9zdCBldmVyeSBjb250cm9sIHJlZ2lzdGVyIGhhcyBhIHN5bm9ueW07IHRoZXkgYXJlIG5vdCBsaXN0ZWQKLSAgIGhlcmUgZm9yIGJyZXZpdHkuCi0KLSAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsiJWFyZzAiLCAyNn0sCi0gIHsiJWFyZzEiLCAyNX0sCi0gIHsiJWFyZzIiLCAyNH0sCi0gIHsiJWFyZzMiLCAyM30sCi0gIHsiJWNyMCIsIDB9LAotICB7IiVjcjEwIiwgMTB9LAotICB7IiVjcjExIiwgMTF9LAotICB7IiVjcjEyIiwgMTJ9LAotICB7IiVjcjEzIiwgMTN9LAotICB7IiVjcjE0IiwgMTR9LAotICB7IiVjcjE1IiwgMTV9LAotICB7IiVjcjE2IiwgMTZ9LAotICB7IiVjcjE3IiwgMTd9LAotICB7IiVjcjE4IiwgMTh9LAotICB7IiVjcjE5IiwgMTl9LAotICB7IiVjcjIwIiwgMjB9LAotICB7IiVjcjIxIiwgMjF9LAotICB7IiVjcjIyIiwgMjJ9LAotICB7IiVjcjIzIiwgMjN9LAotICB7IiVjcjI0IiwgMjR9LAotICB7IiVjcjI1IiwgMjV9LAotICB7IiVjcjI2IiwgMjZ9LAotICB7IiVjcjI3IiwgMjd9LAotICB7IiVjcjI4IiwgMjh9LAotICB7IiVjcjI5IiwgMjl9LAotICB7IiVjcjMwIiwgMzB9LAotICB7IiVjcjMxIiwgMzF9LAotICB7IiVjcjgiLCA4fSwKLSAgeyIlY3I5IiwgOX0sCi0gIHsiJWRwIiwgMjd9LAotICB7IiVlaWVtIiwgMTV9LAotICB7IiVlaXJyIiwgMjN9LAotICB7IiVmcjAiLCAwfSwKLSAgeyIlZnIwbCIsIDB9LAotICB7IiVmcjByIiwgMH0sCi0gIHsiJWZyMSIsIDF9LAotICB7IiVmcjEwIiwgMTB9LAotICB7IiVmcjEwbCIsIDEwfSwKLSAgeyIlZnIxMHIiLCAxMH0sCi0gIHsiJWZyMTEiLCAxMX0sCi0gIHsiJWZyMTFsIiwgMTF9LAotICB7IiVmcjExciIsIDExfSwKLSAgeyIlZnIxMiIsIDEyfSwKLSAgeyIlZnIxMmwiLCAxMn0sCi0gIHsiJWZyMTJyIiwgMTJ9LAotICB7IiVmcjEzIiwgMTN9LAotICB7IiVmcjEzbCIsIDEzfSwKLSAgeyIlZnIxM3IiLCAxM30sCi0gIHsiJWZyMTQiLCAxNH0sCi0gIHsiJWZyMTRsIiwgMTR9LAotICB7IiVmcjE0ciIsIDE0fSwKLSAgeyIlZnIxNSIsIDE1fSwKLSAgeyIlZnIxNWwiLCAxNX0sCi0gIHsiJWZyMTVyIiwgMTV9LAotICB7IiVmcjE2IiwgMTZ9LAotICB7IiVmcjE2bCIsIDE2fSwKLSAgeyIlZnIxNnIiLCAxNn0sCi0gIHsiJWZyMTciLCAxN30sCi0gIHsiJWZyMTdsIiwgMTd9LAotICB7IiVmcjE3ciIsIDE3fSwKLSAgeyIlZnIxOCIsIDE4fSwKLSAgeyIlZnIxOGwiLCAxOH0sCi0gIHsiJWZyMThyIiwgMTh9LAotICB7IiVmcjE5IiwgMTl9LAotICB7IiVmcjE5bCIsIDE5fSwKLSAgeyIlZnIxOXIiLCAxOX0sCi0gIHsiJWZyMWwiLCAxfSwKLSAgeyIlZnIxciIsIDF9LAotICB7IiVmcjIiLCAyfSwKLSAgeyIlZnIyMCIsIDIwfSwKLSAgeyIlZnIyMGwiLCAyMH0sCi0gIHsiJWZyMjByIiwgMjB9LAotICB7IiVmcjIxIiwgMjF9LAotICB7IiVmcjIxbCIsIDIxfSwKLSAgeyIlZnIyMXIiLCAyMX0sCi0gIHsiJWZyMjIiLCAyMn0sCi0gIHsiJWZyMjJsIiwgMjJ9LAotICB7IiVmcjIyciIsIDIyfSwKLSAgeyIlZnIyMyIsIDIzfSwKLSAgeyIlZnIyM2wiLCAyM30sCi0gIHsiJWZyMjNyIiwgMjN9LAotICB7IiVmcjI0IiwgMjR9LAotICB7IiVmcjI0bCIsIDI0fSwKLSAgeyIlZnIyNHIiLCAyNH0sCi0gIHsiJWZyMjUiLCAyNX0sCi0gIHsiJWZyMjVsIiwgMjV9LAotICB7IiVmcjI1ciIsIDI1fSwKLSAgeyIlZnIyNiIsIDI2fSwKLSAgeyIlZnIyNmwiLCAyNn0sCi0gIHsiJWZyMjZyIiwgMjZ9LAotICB7IiVmcjI3IiwgMjd9LAotICB7IiVmcjI3bCIsIDI3fSwKLSAgeyIlZnIyN3IiLCAyN30sCi0gIHsiJWZyMjgiLCAyOH0sCi0gIHsiJWZyMjhsIiwgMjh9LAotICB7IiVmcjI4ciIsIDI4fSwKLSAgeyIlZnIyOSIsIDI5fSwKLSAgeyIlZnIyOWwiLCAyOX0sCi0gIHsiJWZyMjlyIiwgMjl9LAotICB7IiVmcjJsIiwgMn0sCi0gIHsiJWZyMnIiLCAyfSwKLSAgeyIlZnIzIiwgM30sCi0gIHsiJWZyMzAiLCAzMH0sCi0gIHsiJWZyMzBsIiwgMzB9LAotICB7IiVmcjMwciIsIDMwfSwKLSAgeyIlZnIzMSIsIDMxfSwKLSAgeyIlZnIzMWwiLCAzMX0sCi0gIHsiJWZyMzFyIiwgMzF9LAotICB7IiVmcjNsIiwgM30sCi0gIHsiJWZyM3IiLCAzfSwKLSAgeyIlZnI0IiwgNH0sCi0gIHsiJWZyNGwiLCA0fSwKLSAgeyIlZnI0ciIsIDR9LAotICB7IiVmcjUiLCA1fSwKLSAgeyIlZnI1bCIsIDV9LAotICB7IiVmcjVyIiwgNX0sCi0gIHsiJWZyNiIsIDZ9LAotICB7IiVmcjZsIiwgNn0sCi0gIHsiJWZyNnIiLCA2fSwKLSAgeyIlZnI3IiwgN30sCi0gIHsiJWZyN2wiLCA3fSwKLSAgeyIlZnI3ciIsIDd9LAotICB7IiVmcjgiLCA4fSwKLSAgeyIlZnI4bCIsIDh9LAotICB7IiVmcjhyIiwgOH0sCi0gIHsiJWZyOSIsIDl9LAotICB7IiVmcjlsIiwgOX0sCi0gIHsiJWZyOXIiLCA5fSwKLSAgeyIlaHRhIiwgMjV9LAotICB7IiVpaXIiLCAxOX0sCi0gIHsiJWlvciIsIDIxfSwKLSAgeyIlaXBzdyIsIDIyfSwKLSAgeyIlaXNyIiwgMjB9LAotICB7IiVpdG1yIiwgMTZ9LAotICB7IiVpdmEiLCAxNH0sCi0gIHsiJXBjb3EiLCAxOH0sCi0gIHsiJXBjc3EiLCAxN30sCi0gIHsiJXBpZHIxIiwgOH0sCi0gIHsiJXBpZHIyIiwgOX0sCi0gIHsiJXBpZHIzIiwgMTJ9LAotICB7IiVwaWRyNCIsIDEzfSwKLSAgeyIlcHBkYSIsIDI0fSwKLSAgeyIlcjAiLCAwfSwKLSAgeyIlcjEiLCAxfSwKLSAgeyIlcjEwIiwgMTB9LAotICB7IiVyMTEiLCAxMX0sCi0gIHsiJXIxMiIsIDEyfSwKLSAgeyIlcjEzIiwgMTN9LAotICB7IiVyMTQiLCAxNH0sCi0gIHsiJXIxNSIsIDE1fSwKLSAgeyIlcjE2IiwgMTZ9LAotICB7IiVyMTciLCAxN30sCi0gIHsiJXIxOCIsIDE4fSwKLSAgeyIlcjE5IiwgMTl9LAotICB7IiVyMiIsIDJ9LAotICB7IiVyMjAiLCAyMH0sCi0gIHsiJXIyMSIsIDIxfSwKLSAgeyIlcjIyIiwgMjJ9LAotICB7IiVyMjMiLCAyM30sCi0gIHsiJXIyNCIsIDI0fSwKLSAgeyIlcjI1IiwgMjV9LAotICB7IiVyMjYiLCAyNn0sCi0gIHsiJXIyNyIsIDI3fSwKLSAgeyIlcjI4IiwgMjh9LAotICB7IiVyMjkiLCAyOX0sCi0gIHsiJXIzIiwgM30sCi0gIHsiJXIzMCIsIDMwfSwKLSAgeyIlcjMxIiwgMzF9LAotICB7IiVyNCIsIDR9LAotICB7IiVyNSIsIDV9LAotICB7IiVyNiIsIDZ9LAotICB7IiVyNyIsIDd9LAotICB7IiVyOCIsIDh9LAotICB7IiVyOSIsIDl9LAotICB7IiVyY3RyIiwgMH0sCi0gIHsiJXJldDAiLCAyOH0sCi0gIHsiJXJldDEiLCAyOX0sCi0gIHsiJXJwIiwgMn0sCi0gIHsiJXNhciIsIDExfSwKLSAgeyIlc3AiLCAzMH0sCi0gIHsiJXNyMCIsIDB9LAotICB7IiVzcjEiLCAxfSwKLSAgeyIlc3IyIiwgMn0sCi0gIHsiJXNyMyIsIDN9LAotICB7IiVzcjQiLCA0fSwKLSAgeyIlc3I1IiwgNX0sCi0gIHsiJXNyNiIsIDZ9LAotICB7IiVzcjciLCA3fSwKLSAgeyIldHIwIiwgMjR9LAotICB7IiV0cjEiLCAyNX0sCi0gIHsiJXRyMiIsIDI2fSwKLSAgeyIldHIzIiwgMjd9LAotICB7IiV0cjQiLCAyOH0sCi0gIHsiJXRyNSIsIDI5fSwKLSAgeyIldHI2IiwgMzB9LAotICB7IiV0cjciLCAzMX0KLX07Ci0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkIGJ5IG9yZGVyIG9mIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gVGhpcyBpcwotICAgc28gd2UgY2hlY2sgZm9yIDw+IGJlZm9yZSB3ZSBjaGVjayBmb3IgPC4gSWYgd2UgaGFkIGEgPD4gYW5kIGNoZWNrZWQKLSAgIGZvciA8IGZpcnN0LCB3ZSB3b3VsZCBnZXQgYSBmYWxzZSBtYXRjaC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZwX2NvbmRfbWFwIGZwX2NvbmRfbWFwW10gPQotewotICB7ImZhbHNlPyIsIDB9LAotICB7ImZhbHNlIiwgMX0sCi0gIHsidHJ1ZT8iLCAzMH0sCi0gIHsidHJ1ZSIsIDMxfSwKLSAgeyIhPD0+IiwgM30sCi0gIHsiIT8+PSIsIDh9LAotICB7IiE/PD0iLCAxNn0sCi0gIHsiITw+IiwgN30sCi0gIHsiIT49IiwgMTF9LAotICB7IiE/PiIsIDEyfSwKLSAgeyI/PD0iLCAxNH0sCi0gIHsiITw9IiwgMTl9LAotICB7IiE/PCIsIDIwfSwKLSAgeyI/Pj0iLCAyMn0sCi0gIHsiIT89IiwgMjR9LAotICB7IiE9dCIsIDI3fSwKLSAgeyI8PT4iLCAyOX0sCi0gIHsiPXQiLCA1fSwKLSAgeyI/PSIsIDZ9LAotICB7Ij88IiwgMTB9LAotICB7Ijw9IiwgMTN9LAotICB7IiE+IiwgMTV9LAotICB7Ij8+IiwgMTh9LAotICB7Ij49IiwgMjF9LAotICB7IiE8IiwgMjN9LAotICB7Ijw+IiwgMjV9LAotICB7IiE9IiwgMjZ9LAotICB7IiE/IiwgMjh9LAotICB7Ij8iLCAyfSwKLSAgeyI9IiwgNH0sCi0gIHsiPCIsIDl9LAotICB7Ij4iLCAxN30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VsZWN0b3JfZW50cnkgc2VsZWN0b3JfdGFibGVbXSA9Ci17Ci0gIHsiZiIsIGVfZnNlbH0sCi0gIHsibCIsIGVfbHNlbH0sCi0gIHsibGQiLCBlX2xkc2VsfSwKLSAgeyJscCIsIGVfbHBzZWx9LAotICB7ImxyIiwgZV9scnNlbH0sCi0gIHsibHMiLCBlX2xzc2VsfSwKLSAgeyJsdCIsIGVfbHRzZWx9LAotICB7Imx0cCIsIGVfbHRwc2VsfSwKLSAgeyJuIiwgZV9uc2VsfSwKLSAgeyJubCIsIGVfbmxzZWx9LAotICB7Im5sciIsIGVfbmxyc2VsfSwKLSAgeyJwIiwgZV9wc2VsfSwKLSAgeyJyIiwgZV9yc2VsfSwKLSAgeyJyZCIsIGVfcmRzZWx9LAotICB7InJwIiwgZV9ycHNlbH0sCi0gIHsicnIiLCBlX3Jyc2VsfSwKLSAgeyJycyIsIGVfcnNzZWx9LAotICB7InJ0IiwgZV9ydHNlbH0sCi0gIHsicnRwIiwgZV9ydHBzZWx9LAotICB7InQiLCBlX3RzZWx9LAotfTsKLQotI2lmZGVmIE9CSl9TT00KLS8qIGRlZmF1bHQgc3BhY2UgYW5kIHN1YnNwYWNlIGRpY3Rpb25hcmllcyAqLwotCi0jZGVmaW5lIEdEQl9TWU1CT0xTICAgICAgICAgIEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUKLSNkZWZpbmUgR0RCX1NUUklOR1MgICAgICAgICAgR0RCX1NUUklOR1NfU1VCU1BBQ0VfTkFNRQotCi0vKiBwcmUtZGVmaW5lZCBzdWJzZWdtZW50cyAoc3Vic3BhY2VzKSBmb3IgdGhlIEhQUEEuICAqLwotI2RlZmluZSBTVUJTRUdfQ09ERSAgIDAKLSNkZWZpbmUgU1VCU0VHX0xJVCAgICAxCi0jZGVmaW5lIFNVQlNFR19NSUxMSSAgMgotI2RlZmluZSBTVUJTRUdfREFUQSAgIDAKLSNkZWZpbmUgU1VCU0VHX0JTUyAgICAyCi0jZGVmaW5lIFNVQlNFR19VTldJTkQgMwotI2RlZmluZSBTVUJTRUdfR0RCX1NUUklOR1MgMAotI2RlZmluZSBTVUJTRUdfR0RCX1NZTUJPTFMgMQotCi1zdGF0aWMgc3RydWN0IGRlZmF1bHRfc3Vic3BhY2VfZGljdCBwYV9kZWZfc3Vic3BhY2VzW10gPQotewotICB7IiRDT0RFJCIsIDEsIDEsIDEsIDAsIDAsIDAsIDI0LCAweDJjLCAwLCA4LCAwLCAwLCBTVUJTRUdfQ09ERX0sCi0gIHsiJERBVEEkIiwgMSwgMSwgMCwgMCwgMCwgMCwgMjQsIDB4MWYsIDEsIDgsIDEsIDEsIFNVQlNFR19EQVRBfSwKLSAgeyIkTElUJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDE2LCAweDJjLCAwLCA4LCAwLCAwLCBTVUJTRUdfTElUfSwKLSAgeyIkTUlMTElDT0RFJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDgsIDB4MmMsIDAsIDgsIDAsIDAsIFNVQlNFR19NSUxMSX0sCi0gIHsiJEJTUyQiLCAxLCAxLCAwLCAwLCAwLCAxLCA4MCwgMHgxZiwgMSwgOCwgMSwgMSwgU1VCU0VHX0JTU30sCi0gIHtOVUxMLCAwLCAxLCAwLCAwLCAwLCAwLCAyNTUsIDB4MWYsIDAsIDQsIDAsIDAsIDB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGRlZmF1bHRfc3BhY2VfZGljdCBwYV9kZWZfc3BhY2VzW10gPQotewotICB7IiRURVhUJCIsIDAsIDEsIDEsIDAsIDgsIEFTRUNfTlVMTH0sCi0gIHsiJFBSSVZBVEUkIiwgMSwgMSwgMSwgMSwgMTYsIEFTRUNfTlVMTH0sCi0gIHtOVUxMLCAwLCAwLCAwLCAwLCAwLCBBU0VDX05VTEx9Ci19OwotCi0vKiBNaXNjIGxvY2FsIGRlZmluaXRpb25zIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gICovCi0KLS8qIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBtYWludGFpbiBzcGFjZXMvc3Vic3BhY2VzLiAgKi8KLSNkZWZpbmUgU1BBQ0VfREVGSU5FRChzcGFjZV9jaGFpbikJKHNwYWNlX2NoYWluKS0+c2RfZGVmaW5lZAotI2RlZmluZSBTUEFDRV9VU0VSX0RFRklORUQoc3BhY2VfY2hhaW4pIChzcGFjZV9jaGFpbiktPnNkX3VzZXJfZGVmaW5lZAotI2RlZmluZSBTUEFDRV9TUE5VTShzcGFjZV9jaGFpbikJKHNwYWNlX2NoYWluKS0+c2Rfc3BudW0KLSNkZWZpbmUgU1BBQ0VfTkFNRShzcGFjZV9jaGFpbikJCShzcGFjZV9jaGFpbiktPnNkX25hbWUKLQotI2RlZmluZSBTVUJTUEFDRV9ERUZJTkVEKHNzX2NoYWluKQkoc3NfY2hhaW4pLT5zc2RfZGVmaW5lZAotI2RlZmluZSBTVUJTUEFDRV9OQU1FKHNzX2NoYWluKQkJKHNzX2NoYWluKS0+c3NkX25hbWUKLSNlbmRpZgotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgUyBwb3RlbnRpYWxseSByZXByZXNlbnRzCi0gICBhIHJpZ2h0IG9yIGxlZnQgaGFsZiBvZiBhIEZQIHJlZ2lzdGVyICAqLwotI2RlZmluZSBJU19SX1NFTEVDVChTKSAgICgqKFMpID09ICdSJyB8fCAqKFMpID09ICdyJykKLSNkZWZpbmUgSVNfTF9TRUxFQ1QoUykgICAoKihTKSA9PSAnTCcgfHwgKihTKSA9PSAnbCcpCi0KLS8qIEluc2VydCBGSUVMRCBpbnRvIE9QQ09ERSBzdGFydGluZyBhdCBiaXQgU1RBUlQuICBDb250aW51ZSBwYV9pcAotICAgbWFpbiBsb29wIGFmdGVyIGluc2VydGlvbi4gICovCi0KLSNkZWZpbmUgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRShPUENPREUsIEZJRUxELCBTVEFSVCkgXAotICB7IFwKLSAgICAoKE9QQ09ERSkgfD0gKEZJRUxEKSA8PCAoU1RBUlQpKTsgXAotICAgIGNvbnRpbnVlOyBcCi0gIH0KLQotLyogU2ltcGxlIHJhbmdlIGNoZWNraW5nIGZvciBGSUVMRCBhZ2FpbnQgSElHSCBhbmQgTE9XIGJvdW5kcy4KLSAgIElHTk9SRSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoZSBlcnJvciBtZXNzYWdlLiAgKi8KLQotI2RlZmluZSBDSEVDS19GSUVMRChGSUVMRCwgSElHSCwgTE9XLCBJR05PUkUpIFwKLSAgeyBcCi0gICAgaWYgKChGSUVMRCkgPiAoSElHSCkgfHwgKEZJRUxEKSA8IChMT1cpKSBcCi0gICAgICB7IFwKLQlpZiAoISBJR05PUkUpIFwKLSAgICAgICAgICBhc19iYWQgKF8oIkZpZWxkIG91dCBvZiByYW5nZSBbJWQuLiVkXSAoJWQpLiIpLCAoTE9XKSwgKEhJR0gpLCBcCi0JCSAgKGludCkgKEZJRUxEKSk7XAotICAgICAgICBicmVhazsgXAotICAgICAgfSBcCi0gIH0KLQotI2RlZmluZSBpc19EUF9yZWxhdGl2ZShleHApCQkJXAotICAoKGV4cCkuWF9vcCA9PSBPX3N1YnRyYWN0CQkJXAotICAgJiYgc3RyY21wIChTX0dFVF9OQU1FICgoZXhwKS5YX29wX3N5bWJvbCksICIkZ2xvYmFsJCIpID09IDApCi0KLSNkZWZpbmUgaXNfUENfcmVsYXRpdmUoZXhwKQkJCVwKLSAgKChleHApLlhfb3AgPT0gT19zdWJ0cmFjdAkJCVwKLSAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoKGV4cCkuWF9vcF9zeW1ib2wpLCAiJFBJQ19wY3JlbCQwIikgPT0gMCkKLQotLyogV2UgbmVlZCBzb21lIGNvbXBsZXggaGFuZGxpbmcgZm9yIHN0YWJzIChzeW0xIC0gc3ltMikuICBMdWNraWx5LCB3ZSdsbAotICAgYWx3YXlzIGJlIGFibGUgdG8gcmVkdWNlIHRoZSBleHByZXNzaW9uIHRvIGEgY29uc3RhbnQsIHNvIHdlIGRvbid0Ci0gICBuZWVkIHJlYWwgY29tcGxleCBoYW5kbGluZyB5ZXQuICAqLwotI2RlZmluZSBpc19jb21wbGV4KGV4cCkJCQkJXAotICAoKGV4cCkuWF9vcCAhPSBPX2NvbnN0YW50ICYmIChleHApLlhfb3AgIT0gT19zeW1ib2wpCi0KLS8qIEFjdHVhbCBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IHRoZSBQQSBzcGVjaWZpYyBjb2RlIGZvciB0aGUgYXNzZW1ibGVyLiAgKi8KLQotLyogQ2FsbGVkIGJlZm9yZSB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4gIE1ha2Ugc3VyZSBlbnRyeS9leGl0IGFuZAotICAgcHJvYy9wcm9jZW5kIHBhaXJzIG1hdGNoLiAgKi8KLQotdm9pZAotcGFfY2hlY2tfZW9mICgpCi17Ci0gIGlmICh3aXRoaW5fZW50cnlfZXhpdCkKLSAgICBhc19mYXRhbCAoXygiTWlzc2luZyAuZXhpdFxuIikpOwotCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2ZhdGFsIChfKCJNaXNzaW5nIC5wcm9jZW5kXG4iKSk7Ci19Ci0KLS8qIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYWJlbF9zeW1ib2xfc3RydWN0IGZvciB0aGUgY3VycmVudCBzcGFjZS4KLSAgIG9yIE5VTEwgaWYgbm8gbGFiZWxfc3ltYm9sX3N0cnVjdCBleGlzdHMgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKgotcGFfZ2V0X2xhYmVsICgpCi17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluOwotCi0gIGZvciAobGFiZWxfY2hhaW4gPSBsYWJlbF9zeW1ib2xzX3Jvb3RwOwotICAgICAgIGxhYmVsX2NoYWluOwotICAgICAgIGxhYmVsX2NoYWluID0gbGFiZWxfY2hhaW4tPmxzc19uZXh0KQotICAgIHsKLSNpZmRlZiBPQkpfU09NCi0gICAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gbGFiZWxfY2hhaW4tPmxzc19zcGFjZSAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsKQotICAgICAgcmV0dXJuIGxhYmVsX2NoYWluOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGlmIChub3dfc2VnID09IGxhYmVsX2NoYWluLT5sc3Nfc2VnbWVudCAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsKQotICAgICAgcmV0dXJuIGxhYmVsX2NoYWluOwotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZpbmVzIGEgbGFiZWwgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAgSWYgb25lIGlzIGFscmVhZHkgZGVmaW5lZCwKLSAgIHRoaXMgZnVuY3Rpb24gd2lsbCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyBsYWJlbC4gICovCi0KLXZvaWQKLXBhX2RlZmluZV9sYWJlbCAoc3ltYm9sKQotICAgICBzeW1ib2xTICpzeW1ib2w7Ci17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gIGlmIChsYWJlbF9jaGFpbikKLSAgICBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsID0gc3ltYm9sOwotICBlbHNlCi0gICAgewotICAgICAgLyogQ3JlYXRlIGEgbmV3IGxhYmVsIGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIGhlYWQgb2YgdGhlIGNoYWluLiAgKi8KLSAgICAgIGxhYmVsX2NoYWluCi0JPSAobGFiZWxfc3ltYm9sX3N0cnVjdCAqKSB4bWFsbG9jIChzaXplb2YgKGxhYmVsX3N5bWJvbF9zdHJ1Y3QpKTsKLSAgICAgIGxhYmVsX2NoYWluLT5sc3NfbGFiZWwgPSBzeW1ib2w7Ci0jaWZkZWYgT0JKX1NPTQotICAgICAgbGFiZWxfY2hhaW4tPmxzc19zcGFjZSA9IGN1cnJlbnRfc3BhY2U7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBsYWJlbF9jaGFpbi0+bHNzX3NlZ21lbnQgPSBub3dfc2VnOwotI2VuZGlmCi0gICAgICBsYWJlbF9jaGFpbi0+bHNzX25leHQgPSBOVUxMOwotCi0gICAgICBpZiAobGFiZWxfc3ltYm9sc19yb290cCkKLQlsYWJlbF9jaGFpbi0+bHNzX25leHQgPSBsYWJlbF9zeW1ib2xzX3Jvb3RwOwotCi0gICAgICBsYWJlbF9zeW1ib2xzX3Jvb3RwID0gbGFiZWxfY2hhaW47Ci0gICAgfQotfQotCi0vKiBSZW1vdmVzIGEgbGFiZWwgZGVmaW5pdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3BhY2UuCi0gICBJZiB0aGVyZSBpcyBubyBsYWJlbF9zeW1ib2xfc3RydWN0IGVudHJ5LCB0aGVuIG5vIGFjdGlvbiBpcyB0YWtlbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV91bmRlZmluZV9sYWJlbCAoKQotewotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9jaGFpbjsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqcHJldl9sYWJlbF9jaGFpbiA9IE5VTEw7Ci0KLSAgZm9yIChsYWJlbF9jaGFpbiA9IGxhYmVsX3N5bWJvbHNfcm9vdHA7Ci0gICAgICAgbGFiZWxfY2hhaW47Ci0gICAgICAgbGFiZWxfY2hhaW4gPSBsYWJlbF9jaGFpbi0+bHNzX25leHQpCi0gICAgewotICAgICAgaWYgKDEKLSNpZmRlZiBPQkpfU09NCi0gCSAgJiYgY3VycmVudF9zcGFjZSA9PSBsYWJlbF9jaGFpbi0+bHNzX3NwYWNlICYmIGxhYmVsX2NoYWluLT5sc3NfbGFiZWwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAJICAmJiBub3dfc2VnID09IGxhYmVsX2NoYWluLT5sc3Nfc2VnbWVudCAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsCi0jZW5kaWYKLQkgICkKLQl7Ci0JICAvKiBSZW1vdmUgdGhlIGxhYmVsIGZyb20gdGhlIGNoYWluIGFuZCBmcmVlIGl0cyBtZW1vcnkuICAqLwotCSAgaWYgKHByZXZfbGFiZWxfY2hhaW4pCi0JICAgIHByZXZfbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gbGFiZWxfY2hhaW4tPmxzc19uZXh0OwotCSAgZWxzZQotCSAgICBsYWJlbF9zeW1ib2xzX3Jvb3RwID0gbGFiZWxfY2hhaW4tPmxzc19uZXh0OwotCi0JICBmcmVlIChsYWJlbF9jaGFpbik7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmV2X2xhYmVsX2NoYWluID0gbGFiZWxfY2hhaW47Ci0gICAgfQotfQotCi0KLS8qIEFuIEhQUEEtc3BlY2lmaWMgdmVyc2lvbiBvZiBmaXhfbmV3LiAgVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBIUFBBCi0gICBjb2RlIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2Ygc29tZSBleHRyYSBzdHVmZi4gIEVhY2ggY2FsbCB0byBmaXhfbmV3X2hwcGEKLSAgIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGFuIGluc3RhbmNlIG9mIGFuIGhwcGFfZml4X3N0cnVjdC4gIEFuCi0gICBocHBhX2ZpeF9zdHJ1Y3Qgc3RvcmVzIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBhbG9uZyB3aXRoIGEgcG9pbnRlciB0byB0aGUKLSAgIG9yaWdpbmFsIGZpeFMuICBUaGlzIGlzIGF0dGFjaGVkIHRvIHRoZSBvcmlnaW5hbCBmaXh1cCB2aWEgdGhlCi0gICB0Y19maXhfZGF0YSBmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1maXhfbmV3X2hwcGEgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLCBvZmZzZXQsIGV4cCwgcGNyZWwsCi0JICAgICAgcl90eXBlLCByX2ZpZWxkLCByX2Zvcm1hdCwgYXJnX3JlbG9jLCB1bndpbmRfYml0cykKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IHNpemU7Ci0gICAgIHN5bWJvbFMgKmFkZF9zeW1ib2w7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgcGNyZWw7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7Ci0gICAgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCByX2ZpZWxkOwotICAgICBpbnQgcl9mb3JtYXQ7Ci0gICAgIGxvbmcgYXJnX3JlbG9jOwotICAgICBpbnQqIHVud2luZF9iaXRzOwotewotICBmaXhTICpuZXdfZml4OwotCi0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4ID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikKLSAgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QpKTsKLQotICBpZiAoZXhwICE9IE5VTEwpCi0gICAgbmV3X2ZpeCA9IGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwgcl90eXBlKTsKLSAgZWxzZQotICAgIG5ld19maXggPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwgcl90eXBlKTsKLSAgbmV3X2ZpeC0+dGNfZml4X2RhdGEgPSAodm9pZCAqKSBocHBhX2ZpeDsKLSAgaHBwYV9maXgtPmZ4X3JfdHlwZSA9IHJfdHlwZTsKLSAgaHBwYV9maXgtPmZ4X3JfZmllbGQgPSByX2ZpZWxkOwotICBocHBhX2ZpeC0+Znhfcl9mb3JtYXQgPSByX2Zvcm1hdDsKLSAgaHBwYV9maXgtPmZ4X2FyZ19yZWxvYyA9IGFyZ19yZWxvYzsKLSAgaHBwYV9maXgtPnNlZ21lbnQgPSBub3dfc2VnOwotI2lmZGVmIE9CSl9TT00KLSAgaWYgKHJfdHlwZSA9PSBSX0VOVFJZIHx8IHJfdHlwZSA9PSBSX0VYSVQpCi0gICAgbmV3X2ZpeC0+Znhfb2Zmc2V0ID0gKnVud2luZF9iaXRzOwotI2VuZGlmCi0KLSAgLyogZm9vLSRnbG9iYWwkIGlzIHVzZWQgdG8gYWNjZXNzIG5vbi1hdXRvbWF0aWMgc3RvcmFnZS4gICRnbG9iYWwkCi0gICAgIGlzIHJlYWxseSBqdXN0IGEgbWFya2VyIGFuZCBoYXMgc2VydmVkIGl0cyBwdXJwb3NlLCBzbyBlbGltaW5hdGUKLSAgICAgaXQgbm93IHNvIGFzIG5vdCB0byBjb25mdXNlIHdyaXRlLmMuICAqLwotICBpZiAobmV3X2ZpeC0+Znhfc3Vic3kKLSAgICAgICYmICFzdHJjbXAgKFNfR0VUX05BTUUgKG5ld19maXgtPmZ4X3N1YnN5KSwgIiRnbG9iYWwkIikpCi0gICAgbmV3X2ZpeC0+Znhfc3Vic3kgPSBOVUxMOwotfQotCi0vKiBQYXJzZSBhIC5ieXRlLCAud29yZCwgLmxvbmcgZXhwcmVzc2lvbiBmb3IgdGhlIEhQUEEuICBDYWxsZWQgYnkKLSAgIGNvbnMgdmlhIHRoZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gbWFjcm8uICAqLwotCi12b2lkCi1wYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoZXhwKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBocHBhX2ZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgZXhwcmVzc2lvbiAoZXhwKTsKLX0KLQotLyogVGhpcyBmaXhfbmV3IGlzIGNhbGxlZCBieSBjb25zIHZpYSBUQ19DT05TX0ZJWF9ORVcuCi0gICBocHBhX2ZpZWxkX3NlbGVjdG9yIGlzIHNldCBieSB0aGUgcGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfaHBwYSAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIHVuc2lnbmVkIGludCByZWxfdHlwZTsKLQotICAvKiBHZXQgYSBiYXNlIHJlbG9jYXRpb24gdHlwZS4gICovCi0gIGlmIChpc19EUF9yZWxhdGl2ZSAoKmV4cCkpCi0gICAgcmVsX3R5cGUgPSBSX0hQUEFfR09UT0ZGOwotICBlbHNlIGlmIChpc19jb21wbGV4ICgqZXhwKSkKLSAgICByZWxfdHlwZSA9IFJfSFBQQV9DT01QTEVYOwotICBlbHNlCi0gICAgcmVsX3R5cGUgPSBSX0hQUEE7Ci0KLSAgaWYgKGhwcGFfZmllbGRfc2VsZWN0b3IgIT0gZV9wc2VsICYmIGhwcGFfZmllbGRfc2VsZWN0b3IgIT0gZV9mc2VsKQotICAgIGFzX3dhcm4gKF8oIkludmFsaWQgZmllbGQgc2VsZWN0b3IuICBBc3N1bWluZyBGJSUuIikpOwotCi0gIGZpeF9uZXdfaHBwYSAoZnJhZywgd2hlcmUsIHNpemUsCi0JCShzeW1ib2xTICopIE5VTEwsIChvZmZzZXRUKSAwLCBleHAsIDAsIHJlbF90eXBlLAotCQlocHBhX2ZpZWxkX3NlbGVjdG9yLCBzaXplICogOCwgMCwgTlVMTCk7Ci0KLSAgLyogUmVzZXQgZmllbGQgc2VsZWN0b3IgdG8gaXRzIGRlZmF1bHQgc3RhdGUuICAqLwotICBocHBhX2ZpZWxkX3NlbGVjdG9yID0gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBpID0gMDsKLQotICBsYXN0X2NhbGxfaW5mbyA9IE5VTEw7Ci0gIGNhbGxfaW5mb19yb290ID0gTlVMTDsKLQotICAvKiBTZXQgdGhlIGRlZmF1bHQgbWFjaGluZSB0eXBlLiAgKi8KLSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAxMCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogRm9sZGluZyBvZiB0ZXh0IGFuZCBkYXRhIHNlZ21lbnRzIGZhaWxzIG1pc2VyYWJseSBvbiB0aGUgUEEuCi0gICAgIFdhcm4gdXNlciBhbmQgZGlzYWJsZSAiLVIiIG9wdGlvbi4gICovCi0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCItUiBvcHRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldC4iKSk7Ci0gICAgICBmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCA9IDA7Ci0gICAgfQotCi0jaWZkZWYgT0JKX1NPTQotICBwYV9zcGFjZXNfYmVnaW4gKCk7Ci0jZW5kaWYKLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgd2hpbGUgKGkgPCBOVU1PUENPREVTKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBwYV9vcGNvZGVzW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKHN0cnVjdCBwYV9vcGNvZGUgKikgJnBhX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMICYmICpyZXR2YWwgIT0gJ1wwJykKLQl7Ci0JICBhc19mYXRhbCAoXygiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLCBuYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgICAgZG8KLQl7Ci0JICBpZiAoKHBhX29wY29kZXNbaV0ubWF0Y2ggJiBwYV9vcGNvZGVzW2ldLm1hc2spCi0JICAgICAgIT0gcGFfb3Bjb2Rlc1tpXS5tYXRjaCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iKSwKLQkJICAgICAgIHBhX29wY29kZXNbaV0ubmFtZSwgcGFfb3Bjb2Rlc1tpXS5hcmdzKTsKLQkgICAgICBsb3NlID0gMTsKLQkgICAgfQotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChpIDwgTlVNT1BDT0RFUyAmJiAhc3RyY21wIChwYV9vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKTsKLSAgICB9Ci0KLSAgaWYgKGxvc2UpCi0gICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBTT00gd2lsbCBjaGFuZ2UgdGV4dF9zZWN0aW9uLiAgVG8gbWFrZSBzdXJlIHdlIG5ldmVyIHB1dAotICAgICBhbnl0aGluZyBpbnRvIHRoZSBvbGQgb25lIHN3aXRjaCB0byB0aGUgbmV3IG9uZSBub3cuICAqLwotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfU09NCi0gIGR1bW15X3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKCJMJGR1bW15Iik7Ci0gIFNfU0VUX1NFR01FTlQgKGR1bW15X3N5bWJvbCwgdGV4dF9zZWN0aW9uKTsKLSAgLyogRm9yY2UgdGhlIHN5bWJvbCB0byBiZSBjb252ZXJ0ZWQgdG8gYSByZWFsIHN5bWJvbC4gKi8KLSAgKHZvaWQpIHN5bWJvbF9nZXRfYmZkc3ltIChkdW1teV9zeW1ib2wpOwotI2VuZGlmCi19Ci0KLS8qIEFzc2VtYmxlIGEgc2luZ2xlIGluc3RydWN0aW9uIHN0b3JpbmcgaXQgaW50byBhIGZyYWcuICAqLwotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICp0bzsKLQotICAvKiBUaGUgaGFkIGJldHRlciBiZSBzb21ldGhpbmcgdG8gYXNzZW1ibGUuICAqLwotICBhc3NlcnQgKHN0cik7Ci0KLSAgLyogSWYgd2UgYXJlIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLCBtYWtlIHN1cmUgd2UndmUKLSAgICAgZGVmaW5lZCBhIGxhYmVsIGZvciB0aGUgcHJvY2VkdXJlOyBoYW5kbGUgY2FzZSB3aGVyZSB0aGUKLSAgICAgbGFiZWwgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotICAgICBOb3RlIHRoZXJlJ3Mgbm90IG5lZWQgdG8gZGlkZGxlIHdpdGggdGhlIHNlZ21lbnQgb3IgZnJhZ21lbnQKLSAgICAgZm9yIHRoZSBsYWJlbCBzeW1ib2wgaW4gdGhpcyBjYXNlLiAgV2UgaGF2ZSBhbHJlYWR5IHN3aXRjaGVkCi0gICAgIGludG8gdGhlIG5ldyAkQ09ERSQgc3Vic3BhY2UgYXQgdGhpcyBwb2ludC4gICovCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlICYmIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICAgIGlmIChsYWJlbF9zeW1ib2wpCi0JewotCSAgaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQotCSAgICB7Ci0JICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCktPmZsYWdzCi0JCXw9IEJTRl9GVU5DVElPTjsKLSNpZmRlZiBPQkpfU09NCi0JICAgICAgLyogQWxzbyBoYW5kbGUgYWxsb2NhdGlvbiBvZiBhIGZpeHVwIHRvIGhvbGQgdGhlIHVud2luZAotCQkgaW5mb3JtYXRpb24gd2hlbiB0aGUgbGFiZWwgYXBwZWFycyBhZnRlciB0aGUgcHJvYy9wcm9jZW5kLiAgKi8KLQkgICAgICBpZiAod2l0aGluX2VudHJ5X2V4aXQpCi0JCXsKLQkJICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLQkJICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQkJCU5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAotCQkJCTAsIFJfSFBQQV9FTlRSWSwgZV9mc2VsLCAwLCAwLAotCQkJCShpbnQgKikmbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yKTsKLQkJfQotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MiKSk7Ci0gICAgfQotCi0gIC8qIEFzc2VtYmxlIHRoZSBpbnN0cnVjdGlvbi4gIFJlc3VsdHMgYXJlIHNhdmVkIGludG8gInRoZV9pbnNuIi4gICovCi0gIHBhX2lwIChzdHIpOwotCi0gIC8qIEdldCBzb21ld2hlcmUgdG8gcHV0IHRoZSBhc3NlbWJsZWQgaW5zdHJ1dGlvbi4gICovCi0gIHRvID0gZnJhZ19tb3JlICg0KTsKLQotICAvKiBPdXRwdXQgdGhlIG9wY29kZS4gKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0bywgdGhlX2luc24ub3Bjb2RlLCA0KTsKLQotICAvKiBJZiBuZWNlc3Nhcnkgb3V0cHV0IG1vcmUgc3R1ZmYuICAqLwotICBpZiAodGhlX2luc24ucmVsb2MgIT0gUl9IUFBBX05PTkUpCi0gICAgZml4X25ld19ocHBhIChmcmFnX25vdywgKHRvIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCA0LCBOVUxMLAotCQkgIChvZmZzZXRUKSAwLCAmdGhlX2luc24uZXhwLCB0aGVfaW5zbi5wY3JlbCwKLQkJICB0aGVfaW5zbi5yZWxvYywgdGhlX2luc24uZmllbGRfc2VsZWN0b3IsCi0JCSAgdGhlX2luc24uZm9ybWF0LCB0aGVfaW5zbi5hcmdfcmVsb2MsIE5VTEwpOwotCi0jaWZkZWYgT0JKX0VMRgotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19EV0FSRjIpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyOwotCi0gICAgICAvKiBGaXJzdCB1cGRhdGUgdGhlIG5vdGlvbiBvZiB0aGUgY3VycmVudCBzb3VyY2UgbGluZS4gICovCi0gICAgICBkd2FyZjJfd2hlcmUgKCZkZWJ1Z19saW5lKTsKLQotICAgICAgLyogV2Ugd2FudCB0aGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGlzIGluc3RydWN0aW9uIHdpdGhpbiB0aGUKLQkgdGhlIGN1cnJlbnQgZnJhZy4gICovCi0gICAgICBhZGRyID0gZnJhZ19ub3ctPmZyX2FkZHJlc3MgKyBmcmFnX25vd19maXggKCkgLSA0OwotCi0gICAgICAvKiBBbmQgcmVjb3JkIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gICAgICBkd2FyZjJfZ2VuX2xpbmVfaW5mbyAoYWRkciwgJmRlYnVnX2xpbmUpOwotICAgIH0KLSNlbmRpZgotfQotCi0vKiBEbyB0aGUgcmVhbCB3b3JrIGZvciBhc3NlbWJsaW5nIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgU3RvcmUgcmVzdWx0cwotICAgaW50byB0aGUgZ2xvYmFsICJ0aGVfaW5zbiIgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfaXAgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICplcnJvcl9tZXNzYWdlID0gIiI7Ci0gIGNoYXIgKnMsIGMsICphcmdzdGFydCwgKm5hbWUsICpzYXZlX3M7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGludCBtYXRjaCA9IEZBTFNFOwotICBpbnQgY29tbWEgPSAwOwotICBpbnQgY21wbHRyLCBudWxsaWYsIGZsYWcsIGNvbmQsIG51bTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHN0cnVjdCBwYV9vcGNvZGUgKmluc247Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgLyogQ29udmVydCBldmVyeXRoaW5nIHVwIHRvIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpbnRvIGxvd2VyCi0gICAgIGNhc2UuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnICYmICpzICE9ICdcbicgJiYgKnMgIT0gJ1wwJzsgcysrKQotICAgIGlmIChpc3VwcGVyICgqcykpCi0gICAgICAqcyA9IHRvbG93ZXIgKCpzKTsKLQotICAvKiBTa2lwIHRvIHNvbWV0aGluZyBpbnRlcmVzdGluZy4gICovCi0gIGZvciAocyA9IHN0cjsgaXN1cHBlciAoKnMpIHx8IGlzbG93ZXIgKCpzKSB8fCAoKnMgPj0gJzAnICYmICpzIDw9ICczJyk7ICsrcykKLSAgICA7Ci0KLSAgc3dpdGNoICgqcykKLSAgICB7Ci0KLSAgICBjYXNlICdcMCc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJywnOgotICAgICAgY29tbWEgPSAxOwotCi0gICAgICAvKkZBTExUSFJPVUdIICovCi0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgfQotCi0gIHNhdmVfcyA9IHN0cjsKLQotICAvKiBMb29rIHVwIHRoZSBvcGNvZGUgaW4gdGhlIGhhcyB0YWJsZS4gICovCi0gIGlmICgoaW5zbiA9IChzdHJ1Y3QgcGFfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKCJVbmtub3duIG9wY29kZTogYCVzJyIsIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChjb21tYSkKLSAgICB7Ci0gICAgICAqLS1zID0gJywnOwotICAgIH0KLQotICAvKiBNYXJrIHRoZSBsb2NhdGlvbiB3aGVyZSBhcmd1bWVudHMgZm9yIHRoZSBpbnN0cnVjdGlvbiBzdGFydCwgdGhlbgotICAgICBzdGFydCBwcm9jZXNzaW5nIHRoZW0uICAqLwotICBhcmdzdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgLyogRG8gc29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gICAgICBvcGNvZGUgPSBpbnNuLT5tYXRjaDsKLSAgICAgIHN0cmljdCA9IChpbnNuLT5mbGFncyAmIEZMQUdfU1RSSUNUKTsKLSAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAwLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0KLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX05PTkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZSwKLQkgdGhlbiBzZXQgYSBuZXcgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgICAgIC8qIEJ1dCBkbyBub3QgYXV0b21hdGljYWxseSBwcm9tb3RlIHRvIHBhMi4wLiAgVGhlIGF1dG9tYXRpYyBwcm9tb3Rpb24KLQkgY3J1ZCBpcyBmb3IgY29tcGF0YWJpbGl0eSB3aXRoIEhQJ3Mgb2xkIGFzc2VtYmxlcnMgb25seS4gICovCi0gICAgICBpZiAoaW5zbi0+YXJjaCA8IDIwCi0JICAmJiBiZmRfZ2V0X21hY2ggKHN0ZG91dHB1dCkgPCBpbnNuLT5hcmNoKQotCXsKLQkgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgaW5zbi0+YXJjaCkpCi0JICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCB1cGRhdGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoc3Rkb3V0cHV0KSA8IGluc24tPmFyY2gpCi0JewotCSAgbWF0Y2ggPSBGQUxTRTsKLQkgIGdvdG8gZmFpbGVkOwotCX0KLQotICAgICAgLyogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZQotICAgICAgICAgc3VyZSB0aGF0IHRoZSBvcGVyYW5kcyBtYXRjaC4gICovCi0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIC8qIEFic29yYiB3aGl0ZSBzcGFjZSBpbiBpbnN0cnVjdGlvbi4gICovCi0JICB3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpCi0JICAgIHMrKzsKLQotCSAgc3dpdGNoICgqYXJncykKLQkgICAgewotCi0JICAgIC8qIEVuZCBvZiBhcmd1bWVudHMuICAqLwotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCW1hdGNoID0gVFJVRTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcrJzoKLQkgICAgICBpZiAoKnMgPT0gJysnKQotCQl7Ci0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKCpzID09ICctJykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogVGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLQkgICAgY2FzZSAnKCc6Ci0JICAgIGNhc2UgJyknOgotCSAgICBjYXNlICcsJzoKLQkgICAgY2FzZSAnICc6Ci0JICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIG9yIGNvbnRyb2wgcmVnaXN0ZXIgZmllbGQgYXQgMTAuICAqLwotCSAgICBjYXNlICdiJzoKLQkgICAgY2FzZSAnXic6Ci0JICAgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JICAgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCWJyZWFrOwotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMjEpOwotCi0JICAgIC8qIEhhbmRsZSAlc2FyIG9yICVjcjExLiAgTm8gYml0cyBnZXQgc2V0LCB3ZSBqdXN0IHZlcmlmeSB0aGF0IGl0Ci0JICAgICAgIGlzIHRoZXJlLiAgKi8KLQkgICAgY2FzZSAnISc6Ci0JICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlIGJlZm9yZSByZWdpc3Rlci4gICovCi0JICAgICAgd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKQotCQlzID0gcyArIDE7Ci0KLQkgICAgICBpZiAoIXN0cm5jYXNlY21wKHMsICIlc2FyIiwgNCkpCi0JICAgICAgICB7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKHMsICIlY3IxMSIsIDUpKQotCSAgICAgICAgewotCQkgIHMgKz0gNTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JICAgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCWJyZWFrOwotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAndCc6Ci0JICAgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JICAgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCWJyZWFrOwotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMTAgYW5kIDE1LiAgKi8KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JICAgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCWJyZWFrOwotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBvcGNvZGUgfD0gbnVtIDw8IDE2OwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAyMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgZmllbGQgbGVuZ3RoIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnVCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMyLCAxLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIDMyIC0gbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCBpbW1lZGlhdGUgYXQgMTUuICAqLwotCSAgICBjYXNlICc1JzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgLyogV2hlbiBpbiBzdHJpY3QgbW9kZSwgd2Ugd2FudCB0byBqdXN0IHJlamVjdCB0aGlzCi0JCSBtYXRjaCBpbnN0ZWFkIG9mIGdpdmluZyBhbiBvdXQgb2YgcmFuZ2UgZXJyb3IuICAqLwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDE1LCAtMTYsIHN0cmljdCk7Ci0JICAgICAgbG93X3NpZ25fdW5leHQgKG51bSwgNSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdWJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgLyogV2hlbiBpbiBzdHJpY3QgbW9kZSwgd2Ugd2FudCB0byBqdXN0IHJlamVjdCB0aGlzCi0JCSBtYXRjaCBpbnN0ZWFkIG9mIGdpdmluZyBhbiBvdXQgb2YgcmFuZ2UgZXJyb3IuICAqLwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDE1LCAtMTYsIHN0cmljdCkKLQkgICAgICBsb3dfc2lnbl91bmV4dCAobnVtLCA1LCAmbnVtKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGFuIHVuc2lnbmVkIDUgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ3InOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIHN0cmljdCk7Ci0KLQkgICAgLyogSGFuZGxlIGFuIHVuc2lnbmVkIDUgYml0IGltbWVkaWF0ZSBhdCAxNS4gICovCi0JICAgIGNhc2UgJ1InOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTYpOwotCi0JICAgIC8qIEhhbmRsZSBhbiB1bnNpZ25lZCAxMCBiaXQgaW1tZWRpYXRlIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnVSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDEwMjMsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYSAyIGJpdCBzcGFjZSBpZGVudGlmaWVyIGF0IDE3LiAgKi8KLQkgICAgY2FzZSAncyc6Ci0JICAgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JICAgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCWJyZWFrOwotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMsIDAsIDEpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMyBiaXQgc3BhY2UgaWRlbnRpZmllciBhdCAxOC4gICovCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA3LCAwLCAxKTsKLQkgICAgICBkaXNfYXNzZW1ibGVfMyAobnVtLCAmbnVtKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBhbGwgY29tcGxldGVycy4gICovCi0JICAgIGNhc2UgJ2MnOgotCSAgICAgIHN3aXRjaCAoKisrYXJncykKLQkJewotCi0JCS8qIEhhbmRsZSBhIGNvbXBsZXRlciBmb3IgYW4gaW5kZXhpbmcgbG9hZCBvciBzdG9yZS4gICovCi0JCWNhc2UgJ3gnOgotCQkgIHsKLQkJICAgIGludCB1dSA9IDA7Ci0JCSAgICBpbnQgbSA9IDA7Ci0JCSAgICBpbnQgaSA9IDA7Ci0JCSAgICB3aGlsZSAoKnMgPT0gJywnICYmIGkgPCAyKQotCQkgICAgICB7Ci0JCQlzKys7Ci0JCQlpZiAoc3RybmNhc2VjbXAgKHMsICJzbSIsIDIpID09IDApCi0JCQkgIHsKLQkJCSAgICB1dSA9IDE7Ci0JCQkgICAgbSA9IDE7Ci0JCQkgICAgcysrOwotCQkJICAgIGkrKzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJtIiwgMSkgPT0gMCkKLQkJCSAgbSA9IDE7Ci0JCQllbHNlIGlmICgoc3RybmNhc2VjbXAgKHMsICJzICIsIDIpID09IDApCi0JCQkJIHx8IChzdHJuY2FzZWNtcCAocywgInMsIiwgMikgPT0gMCkpCi0JCQkgIHV1ID0gMTsKLQkJCS8qIFdoZW4gaW4gc3RyaWN0IG1vZGUgdGhpcyBpcyBhIG1hdGNoIGZhaWx1cmUuICAqLwotCQkJZWxzZSBpZiAoc3RyaWN0KQotCQkJICB7Ci0JCQkgICAgcy0tOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBJbmRleGVkIExvYWQgQ29tcGxldGVyLiIpKTsKLQkJCXMrKzsKLQkJCWkrKzsKLQkJICAgICAgfQotCQkgICAgaWYgKGkgPiAyKQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlciBTeW50YXguIikpOwotCQkgICAgb3Bjb2RlIHw9IG0gPDwgNTsKLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgdXUsIDEzKTsKLQkJICB9Ci0KLQkJLyogSGFuZGxlIGEgc2hvcnQgbG9hZC9zdG9yZSBjb21wbGV0ZXIuICAqLwotCQljYXNlICdtJzoKLQkJY2FzZSAncSc6Ci0JCWNhc2UgJ0onOgotCQljYXNlICdlJzoKLQkJICB7Ci0JCSAgICBpbnQgYSA9IDA7Ci0JCSAgICBpbnQgbSA9IDA7Ci0JCSAgICBpZiAoKnMgPT0gJywnKQotCQkgICAgICB7Ci0JCQlpbnQgZm91bmQgPSAwOwotCQkJcysrOwotCQkJaWYgKHN0cm5jYXNlY21wIChzLCAibWEiLCAyKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgYSA9IDA7Ci0JCQkgICAgbSA9IDE7Ci0JCQkgICAgZm91bmQgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm1iIiwgMikgPT0gMCkKLQkJCSAgewotCQkJICAgIGEgPSAxOwotCQkJICAgIG0gPSAxOwotCQkJICAgIGZvdW5kID0gMTsKLQkJCSAgfQotCi0JCQkvKiBXaGVuIGluIHN0cmljdCBtb2RlLCBwYXNzIHRocm91Z2ggZm9yIGNhY2hlIG9wLiAgKi8KLQkJCWlmICghZm91bmQgJiYgc3RyaWN0KQotCQkJICBzLS07Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpZiAoIWZvdW5kKQotCQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIFNob3J0IExvYWQvU3RvcmUgQ29tcGxldGVyLiIpKTsKLQkJCSAgICBzICs9IDI7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgLyogSWYgd2UgZGlkIG5vdCBnZXQgYSBtYS9tYiBjb21wbGV0ZXIsIHRoZW4gd2UgZG8gbm90Ci0JCSAgICAgICBjb25zaWRlciB0aGlzIGEgcG9zaXRpdmUgbWF0Y2ggZm9yICdjZScuICAqLwotCQkgICAgZWxzZSBpZiAoKmFyZ3MgPT0gJ2UnKQotCQkgICAgICBicmVhazsKLQotCQkgICAvKiAnSicsICdtJyBhbmQgJ3EnIGFyZSB0aGUgc2FtZSwgZXhjZXB0IGZvciB3aGVyZSB0aGV5Ci0JCSAgICAgICBlbmNvZGUgdGhlIGJlZm9yZS9hZnRlciBmaWVsZC4gICovCi0JCSAgIGlmICgqYXJncyA9PSAnbScpCi0JCSAgICAgIHsKLQkJCW9wY29kZSB8PSBtIDw8IDU7Ci0JCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGEsIDEzKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoKmFyZ3MgPT0gJ3EnKQotCQkgICAgICB7Ci0JCQlvcGNvZGUgfD0gbSA8PCAzOwotCQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBhLCAyKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoKmFyZ3MgPT0gJ0onKQotCQkgICAgICB7Ci0JCSAgICAgICAgLyogTSBiaXQgaXMgZXhwbGljaXQgaW4gdGhlIG1ham9yIG9wY29kZS4gICovCi0JCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGEsIDIpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmICgqYXJncyA9PSAnZScpCi0JCSAgICAgIHsKLQkJCS8qIEdyb3NzISAgSGlkZSB0aGVzZSB2YWx1ZXMgaW4gdGhlIGltbWVkaWF0ZSBmaWVsZAotCQkJICAgb2YgdGhlIGluc3RydWN0aW9uLCB0aGVuIHB1bGwgdGhlbSBvdXQgbGF0ZXIuICAqLwotCQkJb3Bjb2RlIHw9IG0gPDwgODsKLQkJCW9wY29kZSB8PSBhIDw8IDk7Ci0JCQljb250aW51ZTsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBIYW5kbGUgYSBzdGJ5cyBjb21wbGV0ZXIuICAqLwotCQljYXNlICdzJzoKLQkJICB7Ci0JCSAgICBpbnQgYSA9IDA7Ci0JCSAgICBpbnQgbSA9IDA7Ci0JCSAgICBpbnQgaSA9IDA7Ci0JCSAgICB3aGlsZSAoKnMgPT0gJywnICYmIGkgPCAyKQotCQkgICAgICB7Ci0JCQlzKys7Ci0JCQlpZiAoc3RybmNhc2VjbXAgKHMsICJtIiwgMSkgPT0gMCkKLQkJCSAgbSA9IDE7Ci0JCQllbHNlIGlmICgoc3RybmNhc2VjbXAgKHMsICJiICIsIDIpID09IDApCi0JCQkJIHx8IChzdHJuY2FzZWNtcCAocywgImIsIiwgMikgPT0gMCkpCi0JCQkgIGEgPSAwOwotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJlIiwgMSkgPT0gMCkKLQkJCSAgYSA9IDE7Ci0JCQkvKiBXaGVuIGluIHN0cmljdCBtb2RlIHRoaXMgaXMgYSBtYXRjaCBmYWlsdXJlLiAgKi8KLQkJCWVsc2UgaWYgKHN0cmljdCkKLQkJCSAgewotCQkJICAgIHMtLTsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBhc19iYWQgKF8oIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIikpOwotCQkJcysrOwotCQkJaSsrOwotCQkgICAgICB9Ci0JCSAgICBpZiAoaSA+IDIpCi0JCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBTdG9yZSBCeXRlcyBTaG9ydCBDb21wbGV0ZXIiKSk7Ci0JCSAgICBvcGNvZGUgfD0gbSA8PCA1OwotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBhLCAxMyk7Ci0JCSAgfQotCi0JCS8qIEhhbmRsZSBsb2FkIGNhY2hlIGhpbnQgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnYyc6Ci0JCSAgY21wbHRyID0gMDsKLQkJICBpZiAoIXN0cm5jbXAocywgIixzbCIsIDMpKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICB9Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEwKTsKLQotCQkvKiBIYW5kbGUgc3RvcmUgY2FjaGUgaGludCBjb21wbGV0ZXIuICAqLwotCQljYXNlICdDJzoKLQkJICBjbXBsdHIgPSAwOwotCQkgIGlmICghc3RybmNtcChzLCAiLHNsIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgY21wbHRyID0gMjsKLQkJICAgIH0KLQkJICBlbHNlIGlmICghc3RybmNtcChzLCAiLGJjIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgY21wbHRyID0gMTsKLQkJICAgIH0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTApOwotCi0JCS8qIEhhbmRsZSBsb2FkIGFuZCBjbGVhciBjYWNoZSBoaW50IGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ2QnOgotCQkgIGNtcGx0ciA9IDA7Ci0JCSAgaWYgKCFzdHJuY21wKHMsICIsY28iLCAzKSkKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICBjbXBsdHIgPSAxOwotCQkgICAgfQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMCk7Ci0KLQkJLyogSGFuZGxlIGxvYWQgb3JkZXJpbmcgY29tcGxldGVyLiAqLwotCQljYXNlICdvJzoKLQkJICBpZiAoc3RybmNtcChzLCAiLG8iLCAyKSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCi0JCS8qIEhhbmRsZSBhIGJyYW5jaCBnYXRlIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ2cnOgotCQkgIGlmIChzdHJuY2FzZWNtcCAocywgIixnYXRlIiwgNSkgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gNTsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYSBicmFuY2ggbGluayBhbmQgcHVzaCBjb21wbGV0ZXIuICAqLwotCQljYXNlICdwJzoKLQkJICBpZiAoc3RybmNhc2VjbXAgKHMsICIsbCxwdXNoIiwgNykgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gNzsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYSBicmFuY2ggbGluayBjb21wbGV0ZXIuICAqLwotCQljYXNlICdsJzoKLQkJICBpZiAoc3RybmNhc2VjbXAgKHMsICIsbCIsIDIpICE9IDApCi0JCSAgICBicmVhazsKLQkJICBzICs9IDI7Ci0JCSAgY29udGludWU7Ci0KLQkJLyogSGFuZGxlIGEgYnJhbmNoIHBvcCBjb21wbGV0ZXIuICAqLwotCQljYXNlICdQJzoKLQkJICBpZiAoc3RybmNhc2VjbXAgKHMsICIscG9wIiwgNCkgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYSBsb2NhbCBwcm9jZXNzb3IgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnTCc6Ci0JCSAgaWYgKHN0cm5jYXNlY21wIChzLCAiLGwiLCAyKSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCi0JCS8qIEhhbmRsZSBhIFBST0JFIHJlYWQvd3JpdGUgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAndyc6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIix3IiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHIiLCAyKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgNik7Ci0KLQkJLyogSGFuZGxlIE1GQ1RMIHdpZGUgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnVyc6Ci0JCSAgaWYgKHN0cm5jYXNlY21wIChzLCAiLHciLCAyKSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCi0JCS8qIEhhbmRsZSBhbiBSRkkgcmVzdG9yZSBjb21wbGV0ZXIuICAqLwotCQljYXNlICdyJzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHIiLCAyKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDU7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgNSk7Ci0KLQkJLyogSGFuZGxlIGEgc3lzdGVtIGNvbnRyb2wgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnWic6Ci0JCSAgaWYgKCpzID09ICcsJyAmJiAoKihzICsgMSkgPT0gJ20nIHx8ICoocyArIDEpID09ICdNJykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZmxhZyA9IDA7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDUpOwotCi0JCS8qIEhhbmRsZSBpbnRlcm1lZGlhdGUvZmluYWwgY29tcGxldGVyIGZvciBEQ09SLiAgKi8KLQkJY2FzZSAnaSc6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixpIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDYpOwotCi0JCS8qIEhhbmRsZSB6ZXJvL3NpZ24gZXh0ZW5zaW9uIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ3onOgotCQkgIGZsYWcgPSAxOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIseiIsIDIpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMDsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCi0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMCk7Ci0KLQkJLyogSGFuZGxlIGFkZCBjb21wbGV0ZXIuICAqLwotCQljYXNlICdhJzoKLQkJICBmbGFnID0gMTsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGwiLCAyKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDI7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlIGlmICghc3RybmNhc2VjbXAgKHMsICIsdHN2IiwgNCkpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAzOwotCQkgICAgICBzICs9IDQ7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEwKTsKLQotCQkvKiBIYW5kbGUgNjQgYml0IGNhcnJ5IGZvciBBREQuICAqLwotCQljYXNlICdZJzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGRjLHRzdiIsIDcpIHx8Ci0JCSAgICAgICFzdHJuY2FzZWNtcCAocywgIix0c3YsZGMiLCA3KSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gNzsKLQkJICAgIH0KLQkJICBlbHNlIGlmICghc3RybmNhc2VjbXAgKHMsICIsZGMiLCAzKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JCS8qIEhhbmRsZSAzMiBiaXQgY2FycnkgZm9yIEFERC4gICovCi0JCWNhc2UgJ3knOgotCQkgIGZsYWcgPSAwOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIsYyx0c3YiLCA2KSB8fAotCQkgICAgICAhc3RybmNhc2VjbXAgKHMsICIsdHN2LGMiLCA2KSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gNjsKLQkJICAgIH0KLQkJICBlbHNlIGlmICghc3RybmNhc2VjbXAgKHMsICIsYyIsIDIpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMDsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwotCi0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMSk7Ci0KLQkJLyogSGFuZGxlIHRyYXAgb24gc2lnbmVkIG92ZXJmbG93LiAgKi8KLQkJY2FzZSAndic6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIix0c3YiLCA0KSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gNDsKLQkJICAgIH0KLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JCS8qIEhhbmRsZSB0cmFwIG9uIGNvbmRpdGlvbiBhbmQgb3ZlcmZsb3cuICAqLwotCQljYXNlICd0JzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHRjLHRzdiIsIDcpIHx8Ci0JCSAgICAgICFzdHJuY2FzZWNtcCAocywgIix0c3YsdGMiLCA3KSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gNzsKLQkJICAgIH0KLQkJICBlbHNlIGlmICghc3RybmNhc2VjbXAgKHMsICIsdGMiLCAzKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JCS8qIEhhbmRsZSA2NCBiaXQgYm9ycm93IGZvciBTVUIuICAqLwotCQljYXNlICdCJzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGRiLHRzdiIsIDcpIHx8Ci0JCSAgICAgICFzdHJuY2FzZWNtcCAocywgIix0c3YsZGIiLCA3KSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gNzsKLQkJICAgIH0KLQkJICBlbHNlIGlmICghc3RybmNhc2VjbXAgKHMsICIsZGIiLCAzKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JCS8qIEhhbmRsZSAzMiBiaXQgYm9ycm93IGZvciBTVUIuICAqLwotCQljYXNlICdiJzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGIsdHN2IiwgNikgfHwKLQkJICAgICAgIXN0cm5jYXNlY21wIChzLCAiLHRzdixiIiwgNikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDY7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGIiLCAyKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JCS8qIEhhbmRsZSB0cmFwIGNvbmRpdGlvbiBjb21wbGV0ZXIgZm9yIFVBRERDTS4gICovCi0JCWNhc2UgJ1QnOgotCQkgIGZsYWcgPSAwOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIsdGMiLCAzKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgNik7Ci0KLQkJLyogSGFuZGxlIHNpZ25lZC91bnNpZ25lZCBhdCAyMS4gICovCi0JCWNhc2UgJ1MnOgotCQkgIHsKLQkJICAgIGludCBzaWduID0gMTsKLQkJICAgIGlmIChzdHJuY2FzZWNtcCAocywgIixzIiwgMikgPT0gMCkKLQkJICAgICAgewotCQkJc2lnbiA9IDE7Ci0JCQlzICs9IDI7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAiLHUiLCAyKSA9PSAwKQotCQkgICAgICB7Ci0JCQlzaWduID0gMDsKLQkJCXMgKz0gMjsKLQkJICAgICAgfQotCi0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHNpZ24sIDEwKTsKLQkJICB9Ci0KLQkJLyogSGFuZGxlIGxlZnQvcmlnaHQgY29tYmluYXRpb24gYXQgMTc6MTguICAqLwotCQljYXNlICdoJzoKLQkJICBpZiAoKnMrKyA9PSAnLCcpCi0JCSAgICB7Ci0JCSAgICAgIGludCBsciA9IDA7Ci0JCSAgICAgIGlmICgqcyA9PSAncicpCi0JCQlsciA9IDI7Ci0JCSAgICAgIGVsc2UgaWYgKCpzID09ICdsJykKLQkJCWxyID0gMDsKLQkJICAgICAgZWxzZQotCQkJYXNfYmFkKF8oIkludmFsaWQgbGVmdC9yaWdodCBjb21iaW5hdGlvbiBjb21wbGV0ZXIiKSk7Ci0KLQkJICAgICAgcysrOwotCQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGxyLCAxMyk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkKF8oIkludmFsaWQgbGVmdC9yaWdodCBjb21iaW5hdGlvbiBjb21wbGV0ZXIiKSk7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogSGFuZGxlIHNhdHVyYXRpb24gYXQgMjQ6MjUuICAqLwotCQljYXNlICdIJzoKLQkJICB7Ci0JCSAgICBpbnQgc2F0ID0gMzsKLQkJICAgIGlmIChzdHJuY2FzZWNtcCAocywgIixzcyIsIDMpID09IDApCi0JCSAgICAgIHsKLQkJCXNhdCA9IDE7Ci0JCQlzICs9IDM7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAiLHVzIiwgMykgPT0gMCkKLQkJICAgICAgewotCQkJc2F0ID0gMDsKLQkJCXMgKz0gMzsKLQkJICAgICAgfQotCi0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHNhdCwgNik7Ci0JCSAgfQotCi0JCS8qIEhhbmRsZSBwZXJtdXRhdGlvbiBjb21wbGV0ZXIuICAqLwotCQljYXNlICcqJzoKLQkJICBpZiAoKnMrKyA9PSAnLCcpCi0JCSAgICB7Ci0JCSAgICAgIGludCBwZXJtbG9jWzRdOwotCQkgICAgICBpbnQgcGVybSA9IDA7Ci0JCSAgICAgIGludCBpID0gMDsKLQkJICAgICAgcGVybWxvY1swXSA9IDEzOwotCQkgICAgICBwZXJtbG9jWzFdID0gMTA7Ci0JCSAgICAgIHBlcm1sb2NbMl0gPSA4OwotCQkgICAgICBwZXJtbG9jWzNdID0gNjsKLQkJICAgICAgZm9yICg7IGkgPCA0OyBpKyspCi0JCSAgICAgICAgewotCQkJICBzd2l0Y2ggKCpzKyspCi0JCQkgICAgewotCQkJICAgIGNhc2UgJzAnOgotCQkJICAgICAgcGVybSA9IDA7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlICcxJzoKLQkJCSAgICAgIHBlcm0gPSAxOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSAnMic6Ci0JCQkgICAgICBwZXJtID0gMjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJzMnOgotCQkJICAgICAgcGVybSA9IDM7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBkZWZhdWx0OgotCQkJICAgICAgYXNfYmFkKF8oIkludmFsaWQgcGVybXV0YXRpb24gY29tcGxldGVyIikpOwotCQkJICAgIH0KLQkJCSAgb3Bjb2RlIHw9IHBlcm0gPDwgcGVybWxvY1tpXTsKLQkJCX0KLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkKF8oIkludmFsaWQgcGVybXV0YXRpb24gY29tcGxldGVyIikpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICAvKiBIYW5kbGUgYWxsIGNvbmRpdGlvbnMuICAqLwotCSAgICBjYXNlICc/JzoKLQkgICAgICB7Ci0JCWFyZ3MrKzsKLQkJc3dpdGNoICgqYXJncykKLQkJICB7Ci0gCQkgIC8qIEhhbmRsZSBGUCBjb21wYXJlIGNvbmRpdGlvbnMuICAqLwotIAkJICBjYXNlICdmJzoKLSAJCSAgICBjb25kID0gcGFfcGFyc2VfZnBfY21wX2NvbmQgKCZzKTsKLSAJCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNvbmQsIDApOwotCi0JCSAgLyogSGFuZGxlIGFuIGFkZCBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ0EnOgotCQkgIGNhc2UgJ2EnOgotIAkJICAgIGNtcGx0ciA9IDA7Ci0gCQkgICAgZmxhZyA9IDA7Ci0JCSAgICBpZiAoKnMgPT0gJywnKQotCQkgICAgICB7Ci0JCQlzKys7Ci0KLQkJCS8qIDY0IGJpdCBjb25kaXRpb25zLiAgKi8KLQkJCWlmICgqYXJncyA9PSAnQScpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJyonKQotCQkJICAgICAgcysrOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGJyZWFrOwotCQkJICB9Ci0JCQllbHNlIGlmICgqcyA9PSAnKicpCi0JCQkgIGJyZWFrOwotCQkJbmFtZSA9IHM7Ci0KLQkJCW5hbWUgPSBzOwotCQkJd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQkJCSAgcyArPSAxOwotCQkJYyA9ICpzOwotCQkJKnMgPSAweDAwOwotCQkJaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSAxOwotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JCQkgIGNtcGx0ciA9IDI7Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCi0JCQkgIGNtcGx0ciA9IDM7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnV2IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNDsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ6bnYiKSA9PSAwKQotCQkJICBjbXBsdHIgPSA1OwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInN2IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNjsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCi0JCQkgIGNtcGx0ciA9IDc7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidHIiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMDsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMTsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMjsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAzOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidXYiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNDsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInZueiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA1OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDY7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA3OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQkvKiAiLCoiIGlzIGEgdmFsaWQgY29uZGl0aW9uLiAgKi8KLQkJCWVsc2UgaWYgKCphcmdzID09ICdhJykKLQkJCSAgYXNfYmFkIChfKCJJbnZhbGlkIEFkZCBDb25kaXRpb246ICVzIiksIG5hbWUpOwotCQkJKnMgPSBjOwotCQkgICAgICB9Ci0JCSAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkJICAvKiBIYW5kbGUgbm9uLW5lZ2F0ZWQgYWRkIGFuZCBicmFuY2ggY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdkJzoKLQkJICAgIGNtcGx0ciA9IHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyICgmcywgMSk7Ci0JCSAgICBpZiAoY21wbHRyIDwgMCkKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJJbnZhbGlkIEFkZCBhbmQgQnJhbmNoIENvbmRpdGlvbjogJWMiKSwgKnMpOwotCQkJY21wbHRyID0gMDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSA2NCBiaXQgd2lkZS1tb2RlIGFkZCBhbmQgYnJhbmNoIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnVyc6Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9hZGRiXzY0X2NtcGx0ciAoJnMpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSW52YWxpZCBBZGQgYW5kIEJyYW5jaCBDb25kaXRpb246ICVjIiksICpzKTsKLQkJCWNtcGx0ciA9IDA7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogTmVnYXRlZCBjb25kaXRpb24gcmVxdWlyZXMgYW4gb3Bjb2RlIGNoYW5nZS4gKi8KLQkJCW9wY29kZSB8PSAoY21wbHRyICYgOCkgPDwgMjQ7Ci0JCSAgICAgIH0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyICYgNywgMTMpOwotCi0JCSAgLyogSGFuZGxlIGEgbmVnYXRlZCBvciBub24tbmVnYXRlZCBhZGQgYW5kIGJyYW5jaAotCQkgICAgIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnQCc6Ci0JCSAgICBzYXZlX3MgPSBzOwotCQkgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgKCZzLCAxKTsKLQkJICAgIGlmIChjbXBsdHIgPCAwKQotCQkgICAgICB7Ci0JCQlzID0gc2F2ZV9zOwotCQkJY21wbHRyID0gcGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIgKCZzLCAxKTsKLQkJCWlmIChjbXBsdHIgPCAwKQotCQkJICB7Ci0JCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uIikpOwotCQkJICAgIGNtcGx0ciA9IDA7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIC8qIE5lZ2F0ZWQgY29uZGl0aW9uIHJlcXVpcmVzIGFuIG9wY29kZSBjaGFuZ2UuICovCi0JCQkgICAgb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBicmFuY2ggb24gYml0IGNvbmRpdGlvbnMuICAqLwotCQkgIGNhc2UgJ0InOgotCQkgIGNhc2UgJ2InOgotCQkgICAgY21wbHRyID0gMDsKLQkJICAgIGlmICgqcyA9PSAnLCcpCi0JCSAgICAgIHsKLQkJCXMrKzsKLQotCQkJaWYgKCphcmdzID09ICdCJykKLQkJCSAgewotCQkJICAgIGlmICgqcyA9PSAnKicpCi0JCQkgICAgICBzKys7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKCpzID09ICcqJykKLQkJCSAgYnJlYWs7Ci0KLQkJCWlmIChzdHJuY21wIChzLCAiPCIsIDEpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAwOwotCQkJICAgIHMrKzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNtcCAocywgIj49IiwgMikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDE7Ci0JCQkgICAgcyArPSAyOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBCaXQgQnJhbmNoIENvbmRpdGlvbjogJWMiKSwgKnMpOwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTUpOwotCi0JCSAgLyogSGFuZGxlIGEgY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ1MnOgotCQkgIGNhc2UgJ3MnOgotCQkgICAgY21wbHRyID0gMDsKLQkJICAgIGZsYWcgPSAwOwotCQkgICAgaWYgKCpzID09ICcsJykKLQkJICAgICAgewotCQkJcysrOwotCi0JCQkvKiA2NCBiaXQgY29uZGl0aW9ucy4gICovCi0JCQlpZiAoKmFyZ3MgPT0gJ1MnKQotCQkJICB7Ci0JCQkgICAgaWYgKCpzID09ICcqJykKLQkJCSAgICAgIHMrKzsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZSBpZiAoKnMgPT0gJyonKQotCQkJICBicmVhazsKLQkJCW5hbWUgPSBzOwotCi0JCQluYW1lID0gczsKLQkJCXdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JCQkgIHMgKz0gMTsKLQkJCWMgPSAqczsKLQkJCSpzID0gMHgwMDsKLQkJCWlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMTsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkJICBjbXBsdHIgPSAyOwotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSAzOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIjw8IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNDsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI8PD0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSA1OwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInN2IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNjsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCi0JCQkgIGNtcGx0ciA9IDc7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidHIiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMDsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMTsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMjsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAzOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPj49IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDQ7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI+PiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA1OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDY7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA3OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQkvKiAiLCoiIGlzIGEgdmFsaWQgY29uZGl0aW9uLiAgKi8KLQkJCWVsc2UgaWYgKCphcmdzICE9ICdTJykKLQkJCSAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uOiAlcyIpLAotCQkJCSAgbmFtZSk7Ci0JCQkqcyA9IGM7Ci0JCSAgICAgIH0KLQkJICAgIG9wY29kZSB8PSBjbXBsdHIgPDwgMTM7Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEyKTsKLQotCQkgIC8qIEhhbmRsZSBhIG5vbi1uZWdhdGVkIGNvbXBhcmUgY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICd0JzoKLQkJICAgIGNtcGx0ciA9IHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyICgmcywgMSk7Ci0JCSAgICBpZiAoY21wbHRyIDwgMCkKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uOiAlYyIpLCAqcyk7Ci0JCQljbXBsdHIgPSAwOwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JCSAgLyogSGFuZGxlIGEgMzIgYml0IGNvbXBhcmUgYW5kIGJyYW5jaCBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ24nOgotCQkgICAgc2F2ZV9zID0gczsKLQkJICAgIGNtcGx0ciA9IHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyICgmcywgMSk7Ci0JCSAgICBpZiAoY21wbHRyIDwgMCkKLQkJICAgICAgewotCQkJcyA9IHNhdmVfczsKLQkJCWNtcGx0ciA9IHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyICgmcywgMSk7Ci0JCQlpZiAoY21wbHRyIDwgMCkKLQkJCSAgewotCQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlIGFuZCBCcmFuY2ggQ29uZGl0aW9uLiIpKTsKLQkJCSAgICBjbXBsdHIgPSAwOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICAvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAqLwotCQkJICAgIG9wY29kZSB8PSAxIDw8IDI3OwotCQkJICB9Ci0JCSAgICAgIH0KLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBhIDY0IGJpdCBjb21wYXJlIGFuZCBicmFuY2ggY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdOJzoKLQkJICAgIGNtcGx0ciA9IHBhX3BhcnNlX2NtcGJfNjRfY21wbHRyICgmcyk7Ci0JCSAgICBpZiAoY21wbHRyID49IDApCi0JCSAgICAgIHsKLQkJCS8qIE5lZ2F0ZWQgY29uZGl0aW9uIHJlcXVpcmVzIGFuIG9wY29kZSBjaGFuZ2UuICovCi0JCQlvcGNvZGUgfD0gKGNtcGx0ciAmIDgpIDw8IDI2OwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIC8qIE5vdCBhIDY0IGJpdCBjb25kLiAgR2l2ZSAzMiBiaXQgYSBjaGFuY2UuICovCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciAmIDcsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBhIDY0IGJpdCBjbXBpYiBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ1EnOgotCQkgICAgY21wbHRyID0gcGFfcGFyc2VfY21waWJfNjRfY21wbHRyICgmcyk7Ci0JCSAgICBpZiAoY21wbHRyIDwgMCkKLQkJICAgICAgLyogTm90IGEgNjQgYml0IGNvbmQuICBHaXZlIDMyIGJpdCBhIGNoYW5jZS4gKi8KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkJICAgIC8qIEhhbmRsZSBhIGxvZ2ljYWwgaW5zdHJ1Y3Rpb24gY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdMJzoKLQkJICBjYXNlICdsJzoKLQkJICAgIGNtcGx0ciA9IDA7Ci0JCSAgICBmbGFnID0gMDsKLQkJICAgIGlmICgqcyA9PSAnLCcpCi0JCSAgICAgIHsKLQkJCXMrKzsKLQotCQkJLyogNjQgYml0IGNvbmRpdGlvbnMuICAqLwotCQkJaWYgKCphcmdzID09ICdMJykKLQkJCSAgewotCQkJICAgIGlmICgqcyA9PSAnKicpCi0JCQkgICAgICBzKys7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKCpzID09ICcqJykKLQkJCSAgYnJlYWs7Ci0JCQluYW1lID0gczsKLQotCQkJbmFtZSA9IHM7Ci0JCQl3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkJICBzICs9IDE7Ci0JCQljID0gKnM7Ci0JCQkqcyA9IDB4MDA7Ci0KLQotCQkJaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSAxOwotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JCQkgIGNtcGx0ciA9IDI7Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCi0JCQkgIGNtcGx0ciA9IDM7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkJICBjbXBsdHIgPSA3OwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDA7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDE7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDI7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDc7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCS8qICIsKiIgaXMgYSB2YWxpZCBjb25kaXRpb24uICAqLwotCQkJZWxzZSBpZiAoKmFyZ3MgIT0gJ0wnKQotCQkJICBhc19iYWQgKF8oIkludmFsaWQgTG9naWNhbCBJbnN0cnVjdGlvbiBDb25kaXRpb24uIikpOwotCQkJKnMgPSBjOwotCQkgICAgICB9Ci0JCSAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkJICAvKiBIYW5kbGUgYSBzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdYJzoKLQkJICBjYXNlICd4JzoKLQkJICBjYXNlICd5JzoKLQkJICAgIGNtcGx0ciA9IDA7Ci0JCSAgICBpZiAoKnMgPT0gJywnKQotCQkgICAgICB7Ci0JCQlzYXZlX3MgPSBzKys7Ci0KLQkJCS8qIDY0IGJpdCBjb25kaXRpb25zLiAgKi8KLQkJCWlmICgqYXJncyA9PSAnWCcpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJyonKQotCQkJICAgICAgcysrOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGJyZWFrOwotCQkJICB9Ci0JCQllbHNlIGlmICgqcyA9PSAnKicpCi0JCQkgIGJyZWFrOwotCQkJbmFtZSA9IHM7Ci0KLQkJCW5hbWUgPSBzOwotCQkJd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQkJCSAgcyArPSAxOwotCQkJYyA9ICpzOwotCQkJKnMgPSAweDAwOwotCQkJaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSAxOwotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JCQkgIGNtcGx0ciA9IDI7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkJICBjbXBsdHIgPSAzOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJCSAgY21wbHRyID0gNDsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNTsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNjsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JCQkgIGNtcGx0ciA9IDc7Ci0JCQkvKiBIYW5kbGUgbW92YixuLiAgUHV0IHRoaW5ncyBiYWNrIHRoZSB3YXkgdGhleSB3ZXJlLgotCQkJICAgVGhpcyBpbmNsdWRlcyBtb3ZpbmcgcyBiYWNrIHRvIHdoZXJlIGl0IHN0YXJ0ZWQuICAqLwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmICphcmdzID09ICd5JykKLQkJCSAgewotCQkJICAgICpzID0gYzsKLQkJCSAgICBzID0gc2F2ZV9zOwotCQkJICAgIGNvbnRpbnVlOwotCQkJICB9Ci0JCQkvKiAiLCoiIGlzIGEgdmFsaWQgY29uZGl0aW9uLiAgKi8KLQkJCWVsc2UgaWYgKCphcmdzICE9ICdYJykKLQkJCSAgYXNfYmFkIChfKCJJbnZhbGlkIFNoaWZ0L0V4dHJhY3QvRGVwb3NpdCBDb25kaXRpb24uIikpOwotCQkJKnMgPSBjOwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JCSAgLyogSGFuZGxlIGEgdW5pdCBpbnN0cnVjdGlvbiBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ1UnOgotCQkgIGNhc2UgJ3UnOgotCQkgICAgY21wbHRyID0gMDsKLQkJICAgIGZsYWcgPSAwOwotCQkgICAgaWYgKCpzID09ICcsJykKLQkJICAgICAgewotCQkJcysrOwotCi0JCQkvKiA2NCBiaXQgY29uZGl0aW9ucy4gICovCi0JCQlpZiAoKmFyZ3MgPT0gJ1UnKQotCQkJICB7Ci0JCQkgICAgaWYgKCpzID09ICcqJykKLQkJCSAgICAgIHMrKzsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZSBpZiAoKnMgPT0gJyonKQotCQkJICBicmVhazsKLQotCQkJaWYgKHN0cm5jYXNlY21wIChzLCAic2J6IiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDI7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNoeiIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAzOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzZGMiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNDsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAic2JjIiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDY7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNoYyIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA3OwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJ0ciIsIDIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAwOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMjsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuYnoiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMjsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmh6IiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDM7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5kYyIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA0OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuYmMiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNjsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmhjIiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDc7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInN3eiIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAxOwotCQkJICAgIGZsYWcgPSAwOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzd2MiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNTsKLQkJCSAgICBmbGFnID0gMDsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibnd6IiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDE7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm53YyIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA1OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJLyogIiwqIiBpcyBhIHZhbGlkIGNvbmRpdGlvbi4gICovCi0JCQllbHNlIGlmICgqYXJncyAhPSAnVScpCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBVbml0IEluc3RydWN0aW9uIENvbmRpdGlvbi4iKSk7Ci0JCSAgICAgIH0KLQkJICAgIG9wY29kZSB8PSBjbXBsdHIgPDwgMTM7Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEyKTsKLQotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhYm9ydCAoKTsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYnJhbmNoIGluc3RydWN0aW9ucy4gICovCi0JICAgIGNhc2UgJ24nOgotCSAgICAgIG51bGxpZiA9IHBhX3BhcnNlX251bGxpZiAoJnMpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVsbGlmLCAxKTsKLQotCSAgICAvKiBIYW5kbGUgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgY29wciBhbmQgc3BvcCBpbnNucy4gICovCi0JICAgIGNhc2UgJ04nOgotCSAgICAgIG51bGxpZiA9IHBhX3BhcnNlX251bGxpZiAoJnMpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVsbGlmLCA1KTsKLQotCSAgICAvKiBIYW5kbGUgLCVyMiBjb21wbGV0ZXIgZm9yIG5ldyBzeW50YXggYnJhbmNoZXMuICAqLwotCSAgICBjYXNlICdMJzoKLQkgICAgICBpZiAoKnMgPT0gJywnICYmIHN0cm5jYXNlY21wIChzICsgMSwgIiVyMiIsIDMpID09IDApCi0JCXMgKz0gNDsKLQkgICAgICBlbHNlIGlmICgqcyA9PSAnLCcgJiYgc3RybmNhc2VjbXAgKHMgKyAxLCAiJXJwIiwgMykgPT0gMCkKLQkJcyArPSA0OwotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgLyogSGFuZGxlIDMgYml0IGVudHJ5IGludG8gdGhlIGZwIGNvbXBhcmUgYXJyYXkuICAgVmFsaWQgdmFsdWVzCi0JICAgICAgIGFyZSAwLi42IGluY2x1c2l2ZS4gICovCi0JICAgIGNhc2UgJ2gnOgotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA2LCAwLCAwKTsKLQkJICBudW0rKzsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTMpOwotCQl9Ci0JICAgICAgZWxzZQotCQlicmVhazsKLQotCSAgICAvKiBIYW5kbGUgMyBiaXQgZW50cnkgaW50byB0aGUgZnAgY29tcGFyZSBhcnJheS4gICBWYWxpZCB2YWx1ZXMKLQkgICAgICAgYXJlIDAuLjYgaW5jbHVzaXZlLiAgKi8KLQkgICAgY2FzZSAnbSc6Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgcyA9IGV4cHJfZW5kOwotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDYsIDAsIDApOwotCQkgIG51bSA9IChudW0gKyAxKSBeIDE7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIGdyYXBoaWNzIHRlc3QgY29tcGxldGVycyBmb3IgZnRlc3QgKi8KLQkgICAgY2FzZSAnPSc6Ci0JICAgICAgewotCQludW0gPSBwYV9wYXJzZV9mdGVzdF9nZnhfY29tcGxldGVyICgmcyk7Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTEgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ2knOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDEwMjMsIC0xMDI0LCAwKTsKLQkJICBsb3dfc2lnbl91bmV4dCAobnVtLCAxMSwgJm51bSk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxMTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDE0IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdKJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBpbnQgYSwgbTsKLQotCQkgIC8qIFhYWCB0aGUgY29tcGxldGVyIHN0b3JlZCBhd2F5IHRpYml0cyBvZiBpbmZvcm1hdGlvbgotCQkgICAgIGZvciB1cyB0byBleHRyYWN0LiAgV2UgbmVlZCBhIGNsZWFuZXIgd2F5IHRvIGRvIHRoaXMuCi0JCSAgICAgTm93IHRoYXQgd2UgaGF2ZSBsb3RzIG9mIGxldHRlcnMgYWdhaW4sIGl0IHdvdWxkIGJlCi0JCSAgICAgZ29vZCB0byByZXRoaW5rIHRoaXMuICAqLwotCQkgIG0gPSAob3Bjb2RlICYgKDEgPDwgOCkpICE9IDA7Ci0JCSAgYSA9IChvcGNvZGUgJiAoMSA8PCA5KSkgIT0gMDsKLQkJICBvcGNvZGUgJj0gfiAoMyA8PCA4KTsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAoKGEgPT0gMSAmJiBudW0gPj0gMCkgfHwgKGEgPT0gMCAmJiBudW0gPCAwKSkKLQkJICAgIGJyZWFrOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTEsIC04MTkyLCAwKTsKLQkJICBsb3dfc2lnbl91bmV4dCAobnVtLCAxNCwgJm51bSk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAxNCBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnSyc6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgaW50IGEsIG07Ci0KLQkJICAvKiBYWFggdGhlIGNvbXBsZXRlciBzdG9yZWQgYXdheSB0aWJpdHMgb2YgaW5mb3JtYXRpb24KLQkJICAgICBmb3IgdXMgdG8gZXh0cmFjdC4gIFdlIG5lZWQgYSBjbGVhbmVyIHdheSB0byBkbyB0aGlzLgotCQkgICAgIE5vdyB0aGF0IHdlIGhhdmUgbG90cyBvZiBsZXR0ZXJzIGFnYWluLCBpdCB3b3VsZCBiZQotCQkgICAgIGdvb2QgdG8gcmV0aGluayB0aGlzLiAgKi8KLQkJICBtID0gKG9wY29kZSAmICgxIDw8IDgpKSAhPSAwOwotCQkgIGEgPSAob3Bjb2RlICYgKDEgPDwgOSkpICE9IDA7Ci0JCSAgb3Bjb2RlICY9IH4gKDMgPDwgOCk7Ci0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgaWYgKChhID09IDEgJiYgbnVtIDwgMCkgfHwgKGEgPT0gMCAmJiBudW0gPiAwKSkKLQkJICAgIGJyZWFrOwotCQkgIGlmIChudW0gJSA0KQotCQkgICAgYnJlYWs7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgODE5MSwgLTgxOTIsIDApOwotCQkgIGlmIChudW0gPCAwKQotCQkgICAgb3Bjb2RlIHw9IDE7Ci0gICAgICAgICAgICAgICAgICBudW0gJj0gMHgxZmZmOwotICAgICAgICAgICAgICAgICAgbnVtID4+PSAyOwotICAgICAgICAgICAgICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDMpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgMTQgYml0IGltbWVkaWF0ZWQsIHNoaWZ0ZWQgbGVmdCB0aHJlZSB0aW1lcy4gICovCi0JICAgIGNhc2UgJyMnOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJiAweDcpCi0JCSAgICBicmVhazsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAtODE5MiwgMCk7Ci0JCSAgaWYgKG51bSA8IDApCi0JCSAgICBvcGNvZGUgfD0gMTsKLQkJICBudW0gJj0gMHgxZmZmOwotCQkgIG51bSA+Pj0gMzsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaXNfRFBfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9HT1RPRkY7Ci0JCSAgZWxzZSBpZiAoaXNfUENfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIGVsc2UKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDE0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIDE0IGJpdCBpbW1lZGlhdGUsIHNoaWZ0ZWQgbGVmdCB0d2ljZS4gICovCi0JICAgIGNhc2UgJ2QnOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJiAweDMpCi0JCSAgICBicmVhazsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAtODE5MiwgMCk7Ci0JCSAgaWYgKG51bSA8IDApCi0JCSAgICBvcGNvZGUgfD0gMTsKLQkJICBudW0gJj0gMHgxZmZmOwotCQkgIG51bSA+Pj0gMjsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaXNfRFBfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9HT1RPRkY7Ci0JCSAgZWxzZSBpZiAoaXNfUENfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIGVsc2UKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDE0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTQgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ2onOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTEsIC04MTkyLCAwKTsKLQkJICBsb3dfc2lnbl91bmV4dCAobnVtLCAxNCwgJm51bSk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDIxIGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdrJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtID4+IDExLCAxMDQ4NTc1LCAtMTA0ODU3NiwgMCk7Ci0JCSAgZGlzX2Fzc2VtYmxlXzIxIChudW0sICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMjE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAxMiBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudC4gICovCi0JICAgIGNhc2UgJ3cnOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLCAiTCQwXDAwMSIpKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTksIC04MTg0LCAwKTsKLQkJICBzaWduX3VuZXh0ICgobnVtIC0gOCkgPj4gMiwgMTIsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xMiAocmVzdWx0LCAmdzEsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsICgodzEgPDwgMikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDEyOwotCQkgIHRoZV9pbnNuLmFyZ19yZWxvYyA9IGxhc3RfY2FsbF9kZXNjLmFyZ19yZWxvYzsKLQkJICBtZW1zZXQgKCZsYXN0X2NhbGxfZGVzYywgMCwgc2l6ZW9mIChzdHJ1Y3QgY2FsbF9kZXNjKSk7Ci0JCSAgcyA9IGV4cHJfZW5kOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLwotCSAgICBjYXNlICdXJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGlmICghdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbAotCQkgIHx8ICFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLAotCQkJICAgICAgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MiwgdzEsIHcsIHJlc3VsdDsKLQotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJSA0KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkJyYW5jaCB0byB1bmFsaWduZWQgYWRkcmVzcyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgMjYyMTQzLCAtMjYyMTQ0LCAwKTsKLQotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKQotCQkgICAgbnVtIC09IDg7Ci0KLQkJICBzaWduX3VuZXh0IChudW0gPj4gMiwgMTcsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xNyAocmVzdWx0LCAmdzEsICZ3MiwgJncpOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwKLQkJCQkJICAgKCh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDE3OwotCQkgIHRoZV9pbnNuLmFyZ19yZWxvYyA9IGxhc3RfY2FsbF9kZXNjLmFyZ19yZWxvYzsKLQkJICBtZW1zZXQgKCZsYXN0X2NhbGxfZGVzYywgMCwgc2l6ZW9mIChzdHJ1Y3QgY2FsbF9kZXNjKSk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAyMiBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudC4gICovCi0JICAgIGNhc2UgJ1gnOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgaWYgKCF0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sCi0JCSAgfHwgIXN0cmNtcCAoU19HRVRfTkFNRSAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCksCi0JCQkgICAgICAiTCQwXDAwMSIpKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IHczLCB3MiwgdzEsIHcsIHJlc3VsdDsKLQotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJSA0KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkJyYW5jaCB0byB1bmFsaWduZWQgYWRkcmVzcyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgODM4ODYwNywgLTgzODg2MDgsIDApOwotCi0JCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpCi0JCSAgICBudW0gLT0gODsKLQotCQkgIHNpZ25fdW5leHQgKG51bSA+PiAyLCAyMiwgJnJlc3VsdCk7Ci0JCSAgZGlzX2Fzc2VtYmxlXzIyIChyZXN1bHQsICZ3MywgJncxLCAmdzIsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCi0JCQkJCSAgICAgKCh3MyA8PCAyMSkgfCAodzIgPDwgMikKLQkJCQkJICAgICAgfCAodzEgPDwgMTYpIHwgdyksCi0JCQkJCSAgICAgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDIyOwotCQkgIHRoZV9pbnNuLmFyZ19yZWxvYyA9IGxhc3RfY2FsbF9kZXNjLmFyZ19yZWxvYzsKLQkJICBtZW1zZXQgKCZsYXN0X2NhbGxfZGVzYywgMCwgc2l6ZW9mIChzdHJ1Y3QgY2FsbF9kZXNjKSk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYW4gYWJzb2x1dGUgMTcgYml0IGJyYW5jaCB0YXJnZXQuICAqLwotCSAgICBjYXNlICd6JzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAwOwotCSAgICAgIGlmICghdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbAotCQkgIHx8ICFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLAotCQkJICAgICAgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MiwgdzEsIHcsIHJlc3VsdDsKLQotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJSA0KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkJyYW5jaCB0byB1bmFsaWduZWQgYWRkcmVzcyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgMjYyMTQzLCAtMjYyMTQ0LCAwKTsKLQotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKQotCQkgICAgbnVtIC09IDg7Ci0KLQkJICBzaWduX3VuZXh0IChudW0gPj4gMiwgMTcsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xNyAocmVzdWx0LCAmdzEsICZ3MiwgJncpOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwKLQkJCQkJICAgKCh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9BQlNfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNzsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlICclcjEnIGltcGxpY2l0IG9wZXJhbmQgb2YgYWRkaWwgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICBjYXNlICdaJzoKLQkgICAgICBpZiAoKnMgPT0gJywnICYmICoocyArIDEpID09ICclJyAmJiAqKHMgKyAzKSA9PSAnMScKLQkJICAmJiAoKihzICsgMikgPT0gJ3InIHx8ICoocyArIDIpID09ICdSJykpCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JICAgICAgICBicmVhazsKLQotCSAgICAvKiBIYW5kbGUgJyVzcjAsJXIzMScgaW1wbGljaXQgb3BlcmFuZCBvZiBiZSxsIGluc3RydWN0aW9uLiAgKi8KLQkgICAgY2FzZSAnWSc6Ci0JICAgICAgaWYgKHN0cm5jYXNlY21wIChzLCAiJXNyMCwlcjMxIiwgOSkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA5OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIC8qIEhhbmRsZSBpbW1lZGlhdGUgdmFsdWUgb2YgMCBmb3Igb3JkZXJlZCBsb2FkL3N0b3JlIGluc3RydWN0aW9ucy4gICovCi0JICAgIGNhc2UgJ0AnOgotCSAgICAgIGlmICgqcyAhPSAnMCcpCi0JCWJyZWFrOwotCSAgICAgIHMrKzsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICAvKiBIYW5kbGUgYSAyIGJpdCBzaGlmdCBjb3VudCBhdCAyNS4gICovCi0JICAgIGNhc2UgJy4nOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzLCAxLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCA2KTsKLQotCSAgICAvKiBIYW5kbGUgYSA0IGJpdCBzaGlmdCBjb3VudCBhdCAyNS4gICovCi0JICAgIGNhc2UgJyonOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxNSwgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgc2hpZnQgY291bnQgYXQgMjYuICAqLwotCSAgICBjYXNlICdwJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAzMSAtIG51bSwgNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNiBiaXQgc2hpZnQgY291bnQgYXQgMjAsMjI6MjYuICAqLwotCSAgICBjYXNlICd+JzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNjMsIDAsIHN0cmljdCk7Ci0JICAgICAgbnVtID0gNjMgLSBudW07Ci0JICAgICAgb3Bjb2RlIHw9IChudW0gJiAweDIwKSA8PCA2OwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtICYgMHgxZiwgNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNiBiaXQgZmllbGQgbGVuZ3RoIGF0IDIzLDI3OjMxLiAgKi8KLQkgICAgY2FzZSAnJSc6Ci0JICAgICAgZmxhZyA9IDA7Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDY0LCAxLCBzdHJpY3QpOwotCSAgICAgIG51bS0tOwotCSAgICAgIG9wY29kZSB8PSAobnVtICYgMHgyMCkgPDwgMzsKLQkgICAgICBudW0gPSAzMSAtIChudW0gJiAweDFmKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNiBiaXQgZmllbGQgbGVuZ3RoIGF0IDE5LDI3OjMxLiAgKi8KLQkgICAgY2FzZSAnfCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDY0LCAxLCBzdHJpY3QpOwotCSAgICAgIG51bS0tOwotCSAgICAgIG9wY29kZSB8PSAobnVtICYgMHgyMCkgPDwgNzsKLQkgICAgICBudW0gPSAzMSAtIChudW0gJiAweDFmKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgYml0IHBvc2l0aW9uIGF0IDI2LiAgKi8KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCA1KTsKLQotCSAgICAvKiBIYW5kbGUgYSA2IGJpdCBiaXQgcG9zaXRpb24gYXQgMjAsMjI6MjYuICAqLwotCSAgICBjYXNlICdxJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNjMsIDAsIHN0cmljdCk7Ci0JICAgICAgb3Bjb2RlIHw9IChudW0gJiAweDIwKSA8PCA2OwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtICYgMHgxZiwgNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDEwIHdpdGggJ2QnIGFzIHRoZSBjb21wbGVtZW50Ci0JICAgICAgIG9mIHRoZSBoaWdoIGJpdCBvZiB0aGUgaW1tZWRpYXRlLiAgKi8KLQkgICAgY2FzZSAnQic6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDYzLCAwLCBzdHJpY3QpOwotCSAgICAgIGlmIChudW0gJiAweDIwKQotCQk7Ci0JICAgICAgZWxzZQotCQlvcGNvZGUgfD0gKDEgPDwgMTMpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtICYgMHgxZiwgMjEpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAxMC4gICovCi0JICAgIGNhc2UgJ1EnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgYSA5IGJpdCBpbW1lZGlhdGUgYXQgMjguICAqLwotCSAgICBjYXNlICckJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNTExLCAxLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAzKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxMyBiaXQgaW1tZWRpYXRlIGF0IDE4LiAgKi8KLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDgxOTEsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgYSAyNiBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnRCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDY3MTEwODg2NCwgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMyBiaXQgU0ZVIGlkZW50aWZpZXIgYXQgMjUuICAqLwotCSAgICBjYXNlICd2JzoKLQkgICAgICBpZiAoKnMrKyAhPSAnLCcpCi0JCWFzX2JhZCAoXygiSW52YWxpZCBTRlUgaWRlbnRpZmllciIpKTsKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgMjAgYml0IFNPUCBmaWVsZCBmb3Igc3BvcDAuICAqLwotCSAgICBjYXNlICdPJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTA0ODU3NSwgMCwgc3RyaWN0KTsKLQkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwZmZmZTApIDw8IDYpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxNWJpdCBTT1AgZmllbGQgZm9yIHNwb3AxLiAgKi8KLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMyNzY3LCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMTBiaXQgU09QIGZpZWxkIGZvciBzcG9wMy4gICovCi0JICAgIGNhc2UgJzAnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAwLCBzdHJpY3QpOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDAwMDNlMCkgPDwgNik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDE1IGJpdCBTT1AgZmllbGQgZm9yIHNwb3AyLiAgKi8KLQkgICAgY2FzZSAnMSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMyNzY3LCAwLCBzdHJpY3QpOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDAwN2ZlMCkgPDwgNik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDMtYml0IGNvLXByb2Nlc3NvciBJRCBmaWVsZC4gICovCi0JICAgIGNhc2UgJ3UnOgotCSAgICAgIGlmICgqcysrICE9ICcsJykKLQkJYXNfYmFkIChfKCJJbnZhbGlkIENPUFIgaWRlbnRpZmllciIpKTsKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgMjJiaXQgU09QIGZpZWxkIGZvciBjb3ByLiAgKi8KLQkgICAgY2FzZSAnMic6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDQxOTQzMDMsIDAsIHN0cmljdCk7Ci0JICAgICAgbnVtID0gKG51bSAmIDB4MWYpIHwgKChudW0gJiAweDAwM2ZmZmUwKSA8PCA0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgc291cmNlIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ3snOgotCSAgICAgIGlmICgqcyA9PSAnLCcgJiYgKihzKzEpID09ICd0JykKLQkJewotCQkgIHRoZV9pbnNuLnRydW5jID0gMTsKLQkJICBzICs9IDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnRydW5jID0gMDsKLQkgICAgICBmbGFnID0gcGFfcGFyc2VfZnBfY252X2Zvcm1hdCAoJnMpOwotCSAgICAgIHRoZV9pbnNuLmZwb2YxID0gZmxhZzsKLQkgICAgICBpZiAoZmxhZyA9PSBXIHx8IGZsYWcgPT0gVVcpCi0JCWZsYWcgPSBTR0w7Ci0JICAgICAgaWYgKGZsYWcgPT0gRFcgfHwgZmxhZyA9PSBVRFcpCi0JCWZsYWcgPSBEQkw7Ci0JICAgICAgaWYgKGZsYWcgPT0gUVcgfHwgZmxhZyA9PSBVUVcpCi0JCWZsYWcgPSBRVUFEOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JICAgIC8qIEhhbmRsZSBhIGRlc3RpbmF0aW9uIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ18nOgotCSAgICAgIC8qIHBhX3BhcnNlX2Zvcm1hdCBuZWVkcyB0aGUgJywnIHByZWZpeC4gICovCi0JICAgICAgcy0tOwotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9jbnZfZm9ybWF0ICgmcyk7Ci0JICAgICAgdGhlX2luc24uZnBvZjIgPSBmbGFnOwotCSAgICAgIGlmIChmbGFnID09IFcgfHwgZmxhZyA9PSBVVykKLQkJZmxhZyA9IFNHTDsKLQkgICAgICBpZiAoZmxhZyA9PSBEVyB8fCBmbGFnID09IFVEVykKLQkJZmxhZyA9IERCTDsKLQkgICAgICBpZiAoZmxhZyA9PSBRVyB8fCBmbGFnID09IFVRVykKLQkJZmxhZyA9IFFVQUQ7Ci0JICAgICAgb3Bjb2RlIHw9IGZsYWcgPDwgMTM7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTAotCQkgIHx8IHRoZV9pbnNuLmZwb2YxID09IERCTAotCQkgIHx8IHRoZV9pbnNuLmZwb2YxID09IFFVQUQpCi0JCXsKLQkJICBpZiAodGhlX2luc24uZnBvZjIgPT0gU0dMCi0JCSAgICAgIHx8IHRoZV9pbnNuLmZwb2YyID09IERCTAotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBRVUFEKQotCQkgICAgZmxhZyA9IDA7Ci0JCSAgZWxzZSBpZiAodGhlX2luc24uZnBvZjIgPT0gVwotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBEVwotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBRVykKLQkJICAgIGZsYWcgPSAyOwotCQkgIGVsc2UgaWYgKHRoZV9pbnNuLmZwb2YyID09IFVXCi0JCSAgICAgIHx8IHRoZV9pbnNuLmZwb2YyID09IFVEVwotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBVUVcpCi0JCSAgICBmbGFnID0gNjsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHRoZV9pbnNuLmZwb2YxID09IFcKLQkJICAgICAgIHx8IHRoZV9pbnNuLmZwb2YxID09IERXCi0JCSAgICAgICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBRVykKLQkJewotCQkgIGlmICh0aGVfaW5zbi5mcG9mMiA9PSBTR0wKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gREJMCi0JCSAgICAgIHx8IHRoZV9pbnNuLmZwb2YyID09IFFVQUQpCi0JCSAgICBmbGFnID0gMTsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHRoZV9pbnNuLmZwb2YxID09IFVXCi0JCSAgICAgICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBVRFcKLQkJICAgICAgIHx8IHRoZV9pbnNuLmZwb2YxID09IFVRVykKLQkJewotCQkgIGlmICh0aGVfaW5zbi5mcG9mMiA9PSBTR0wKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gREJMCi0JCSAgICAgIHx8IHRoZV9pbnNuLmZwb2YyID09IFFVQUQpCi0JCSAgICBmbGFnID0gNTsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGZsYWcgfD0gdGhlX2luc24udHJ1bmM7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgc291cmNlIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ0YnOgotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICB0aGVfaW5zbi5mcG9mMSA9IGZsYWc7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgZGVzdGluYXRpb24gRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyLiAgKi8KLQkgICAgY2FzZSAnRyc6Ci0JICAgICAgLyogcGFfcGFyc2VfZm9ybWF0IG5lZWRzIHRoZSAnLCcgcHJlZml4LiAgKi8KLQkgICAgICBzLS07Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOwotCSAgICAgIHRoZV9pbnNuLmZwb2YyID0gZmxhZzsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgYSBzb3VyY2UgRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyIGF0IDIwLiAgKi8KLQkgICAgY2FzZSAnSSc6Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOwotCSAgICAgIHRoZV9pbnNuLmZwb2YxID0gZmxhZzsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCSAgICAvKiBIYW5kbGUgYSBmbG9hdGluZyBwb2ludCBvcGVyYW5kIGZvcm1hdCBhdCAyNi4KLQkgICAgICAgT25seSBhbGxvd3Mgc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uLiAgKi8KLQkgICAgY2FzZSAnSCc6Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOwotCSAgICAgIHN3aXRjaCAoZmxhZykKLQkJewotCQljYXNlIFNHTDoKLQkJICBvcGNvZGUgfD0gMHgyMDsKLQkJY2FzZSBEQkw6Ci0JCSAgdGhlX2luc24uZnBvZjEgPSBmbGFnOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgUVVBRDoKLQkJY2FzZSBJTExFR0FMX0ZNVDoKLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIkludmFsaWQgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQuIikpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIGFsbCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuICAqLwotCSAgICBjYXNlICdmJzoKLQkgICAgICBzd2l0Y2ggKCorK2FyZ3MpCi0JICAgICAgICB7Ci0JCS8qIEZsb2F0IHRhcmdldCByZWdpc3Rlci4gICovCi0JCWNhc2UgJ3QnOgotCQkgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgYnJlYWs7Ci0JCSAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCQkvKiBGbG9hdCB0YXJnZXQgcmVnaXN0ZXIgd2l0aCBML1Igc2VsZWN0aW9uLiAgKi8KLQkJY2FzZSAnVCc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgb3Bjb2RlIHw9IHJlc3VsdC5udW1iZXJfcGFydDsKLQotCQkgICAgLyogMHgzMCBvcGNvZGVzIGFyZSBGUCBhcml0aG1ldGljIG9wZXJhdGlvbiBvcGNvZGVzCi0JCSAgICAgICBhbmQgbmVlZCB0byBiZSB0dXJuZWQgaW50byAweDM4IG9wY29kZXMuICBUaGlzCi0JCSAgICAgICBpcyBub3QgbmVjZXNzYXJ5IGZvciBsb2Fkcy9zdG9yZXMuICAqLwotCQkgICAgaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkKLQkJCSYmICgob3Bjb2RlICYgMHhmYzAwMDAwMCkgPT0gMHgzMDAwMDAwMCkpCi0JCSAgICAgIG9wY29kZSB8PSAxIDw8IDI3OwotCi0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSwgNik7Ci0JCSAgfQotCi0JCS8qIEZsb2F0IG9wZXJhbmQgMS4gICovCi0JCWNhc2UgJ2EnOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIG9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQgPDwgMjE7Ci0JCSAgICBpZiAobmVlZF9wYTExX29wY29kZSAoJnRoZV9pbnNuLCAmcmVzdWx0KSkKLQkJICAgICAgewotCQkJb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDc7Ci0JCQlvcGNvZGUgfD0gMSA8PCAyNzsKLQkJICAgICAgfQotCQkgICAgY29udGludWU7Ci0JCSAgfQotCi0JCS8qIEZsb2F0IG9wZXJhbmQgMSB3aXRoIEwvUiBzZWxlY3Rpb24uICAqLwotCQljYXNlICdYJzoKLQkJY2FzZSAnQSc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgb3Bjb2RlIHw9IHJlc3VsdC5udW1iZXJfcGFydCA8PCAyMTsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA3OwotCQkgICAgY29udGludWU7Ci0JCSAgfQotCi0JCS8qIEZsb2F0IG9wZXJhbmQgMi4gICovCi0JCWNhc2UgJ2InOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgxZikgPDwgMTY7Ci0JCSAgICBpZiAobmVlZF9wYTExX29wY29kZSAoJnRoZV9pbnNuLCAmcmVzdWx0KSkKLQkJICAgICAgewotCQkJb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDEyOwotCQkJb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCSAgICAgIH0KLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQotCQkvKiBGbG9hdCBvcGVyYW5kIDIgd2l0aCBML1Igc2VsZWN0aW9uLiAgKi8KLQkJY2FzZSAnQic6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFmKSA8PCAxNjsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCAxMjsKLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQotCQkvKiBGbG9hdCBvcGVyYW5kIDMgZm9yIGZtcHlmYWRkLCBmbXB5bmZhZGQuICAqLwotCQljYXNlICdDJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MWMpIDw8IDExOwotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDMpIDw8IDk7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgODsKLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQotCQkvKiBGbG9hdCBtdWx0IG9wZXJhbmQgMSBmb3IgZm1weWFkZCwgZm1weXN1YiAqLwotCQljYXNlICdpJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQotCQkgICAgICB7Ci0JCQlpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCQkgIHsKLQkJCSAgICBhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCi0JCQlyZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOwotCQkJcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7Ci0JCSAgICAgIH0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAyMSk7Ci0JCSAgfQotCi0JCS8qIEZsb2F0IG11bHQgb3BlcmFuZCAyIGZvciBmbXB5YWRkLCBmbXB5c3ViICovCi0JCWNhc2UgJ2onOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgICAgIHsKLQkJICAgICAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgICAgICB7Ci0JCSAgICAJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDE2KTsKLQkJICB9Ci0KLQkJLyogRmxvYXQgbXVsdCB0YXJnZXQgZm9yIGZtcHlhZGQsIGZtcHlzdWIgKi8KLQkJY2FzZSAnayc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICAgICAgewotCQkgICAgICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKLQkJICAgICAgICAgIHsKLQkJICAgIAlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKLQkJICAgIAlicmVhazsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOwotCQkgICAgICAgIHJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMCk7Ci0JCSAgfQotCi0JCS8qIEZsb2F0IGFkZCBvcGVyYW5kIDEgZm9yIGZtcHlhZGQsIGZtcHlzdWIgKi8KLQkJY2FzZSAnbCc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICAgICAgewotCQkgICAgICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKLQkJICAgICAgICAgIHsKLQkJICAgIAlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKLQkJICAgIAlicmVhazsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOwotCQkgICAgICAgIHJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgNik7Ci0JCSAgfQotCi0JCS8qIEZsb2F0IGFkZCB0YXJnZXQgZm9yIGZtcHlhZGQsIGZtcHlzdWIgKi8KLQkJY2FzZSAnbSc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICAgICAgewotCQkgICAgICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKLQkJICAgICAgICAgIHsKLQkJICAgIAlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKLQkJICAgIAlicmVhazsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOwotCQkgICAgICAgIHJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMTEpOwotCQkgIH0KLQotCQkvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICd4Jy4gICovCi0JCWNhc2UgJ2UnOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MWYpIDw8IDE2OwotCQkgICAgaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgICAgIHsKLQkJCW9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCAxOwotCQkgICAgICB9Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSBmYWlsZWQ6Ci0gICAgICAvKiBDaGVjayBpZiB0aGUgYXJncyBtYXRjaGVkLiAgKi8KLSAgICAgIGlmIChtYXRjaCA9PSBGQUxTRSkKLQl7Ci0JICBpZiAoJmluc25bMV0gLSBwYV9vcGNvZGVzIDwgKGludCkgTlVNT1BDT0RFUwotCSAgICAgICYmICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpCi0JICAgIHsKLQkgICAgICArK2luc247Ci0JICAgICAgcyA9IGFyZ3N0YXJ0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgb3BlcmFuZHMgJXMiKSwgZXJyb3JfbWVzc2FnZSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaXMgcmV0dXJuZWQuICAqLwotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLQotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBXcml0ZSBvdXQgYmlnLWVuZGlhbi4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICAqLwotCi1hcmVsZW50ICoqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXhwOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLSAgc3RhdGljIGFyZWxlbnQgKm5vX3JlbG9jcyA9IE5VTEw7Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAqKmNvZGVzOwotICBpbnQgbl9yZWxvY3M7Ci0gIGludCBpOwotCi0gIGhwcGFfZml4cCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopIGZpeHAtPnRjX2ZpeF9kYXRhOwotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gMCkKLSAgICByZXR1cm4gJm5vX3JlbG9jczsKLSAgYXNzZXJ0IChocHBhX2ZpeHAgIT0gMCk7Ci0gIGFzc2VydCAoc2VjdGlvbiAhPSAwKTsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgY29kZXMgPSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICoqKSBocHBhX2dlbl9yZWxvY190eXBlIChzdGRvdXRwdXQsCi0JCQkgICAgICAgZml4cC0+Znhfcl90eXBlLAotCQkJICAgICAgIGhwcGFfZml4cC0+Znhfcl9mb3JtYXQsCi0JCQkgICAgICAgaHBwYV9maXhwLT5meF9yX2ZpZWxkLAotCQkJICAgICAgIGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwsCi0JCQkgICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KSk7Ci0KLSAgaWYgKGNvZGVzID09IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgZm9yIChuX3JlbG9jcyA9IDA7IGNvZGVzW25fcmVsb2NzXTsgbl9yZWxvY3MrKykKLSAgICA7Ci0KLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIG5fcmVsb2NzICsgMSk7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSAqIG5fcmVsb2NzKTsKLSAgZm9yIChpID0gMDsgaSA8IG5fcmVsb2NzOyBpKyspCi0gICAgcmVsb2NzW2ldID0gJnJlbG9jW2ldOwotCi0gIHJlbG9jc1tuX3JlbG9jc10gPSBOVUxMOwotCi0jaWZkZWYgT0JKX0VMRgotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCAobl9yZWxvY3MgPT0gMSk7Ci0KLSAgICAgIGNvZGUgPSAqY29kZXNbMF07Ci0KLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gICAgICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSAwOwkvKiBkZWZhdWx0ICovCi0KLSAgICAgIGFzc2VydCAocmVsb2MtPmhvd3RvICYmIGNvZGUgPT0gcmVsb2MtPmhvd3RvLT50eXBlKTsKLQotICAgICAgLyogTm93LCBkbyBhbnkgcHJvY2Vzc2luZyB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGUgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgICAgIHN3aXRjaCAoY29kZSkKLQl7Ci0JY2FzZSBSX1BBUklTQ19ETFRSRUwyMUw6Ci0JY2FzZSBSX1BBUklTQ19ETFRSRUwxNFI6Ci0JY2FzZSBSX1BBUklTQ19ETFRSRUwxNEY6Ci0JY2FzZSBSX1BBUklTQ19QTEFCRUwzMjoKLQljYXNlIFJfUEFSSVNDX1BMQUJFTDIxTDoKLQljYXNlIFJfUEFSSVNDX1BMQUJFTDE0UjoKLQkgIC8qIEZvciBwbGFiZWwgcmVsb2NhdGlvbnMsIHRoZSBhZGRlbmQgb2YgdGhlCi0JICAgICByZWxvY2F0aW9uIHNob3VsZCBiZSBlaXRoZXIgMCAobm8gc3RhdGljIGxpbmspIG9yIDIKLQkgICAgIChzdGF0aWMgbGluayByZXF1aXJlZCkuCi0KLQkgICAgIEZJWE1FOiBXZSBhbHdheXMgYXNzdW1lIG5vIHN0YXRpYyBsaW5rIQotCi0JICAgICBXZSBhbHNvIHNsYW0gYSB6ZXJvIGFkZGVuZCBpbnRvIHRoZSBETFQgcmVsYXRpdmUgcmVsb2NzOwotCSAgICAgaXQgZG9lc24ndCBtYWtlIGEgbG90IG9mIHNlbnNlIHRvIHVzZSBhbnkgYWRkZW5kIHNpbmNlCi0JICAgICBpdCBnZXRzIHlvdSBhIGRpZmZlcmVudCAoZWcgdW5rbm93bikgRExUIGVudHJ5LiAgKi8KLQkgIHJlbG9jLT5hZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUEFSSVNDX1BDUkVMMjFMOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxN1I6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTdDOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxNFI6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDE0RjoKLQkgIC8qIFRoZSBjb25zdGFudCBpcyBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIHJlbG9jLT5hZGRlbmQgPSBIUFBBX1JfQURERU5EIChocHBhX2ZpeHAtPmZ4X2FyZ19yZWxvYywgMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLSNlbHNlIC8qIE9CSl9TT00gKi8KLQotICAvKiBXYWxrIG92ZXIgcmVhY2ggcmVsb2NhdGlvbiByZXR1cm5lZCBieSB0aGUgQkZEIGJhY2tlbmQuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbl9yZWxvY3M7IGkrKykKLSAgICB7Ci0gICAgICBjb2RlID0gKmNvZGVzW2ldOwotCi0gICAgICByZWxvY3NbaV0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICAqcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvY3NbaV0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICAgICAgcmVsb2NzW2ldLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gICAgICBzd2l0Y2ggKGNvZGUpCi0JewotCWNhc2UgUl9DT01QMjoKLQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZXZlciB1c2UgYSBSX0NPTVAyIGZpeHVwIGlzIGZvciB0aGUgZGlmZmVyZW5jZQotCSAgICAgb2YgdHdvIHN5bWJvbHMuICBXaXRoIHRoYXQgaW4gbWluZCB3ZSBmaWxsIGluIGFsbCBmb3VyCi0JICAgICByZWxvY3Mgbm93IGFuZCBicmVhayBvdXQgb2YgdGhlIGxvb3AuICAqLwotCSAgYXNzZXJ0IChpID09IDEpOwotCSAgcmVsb2NzWzBdLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSAmKGJmZF9hYnNfc3ltYm9sKTsKLQkgIHJlbG9jc1swXS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgKmNvZGVzWzBdKTsKLQkgIHJlbG9jc1swXS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQkgIHJlbG9jc1swXS0+YWRkZW5kID0gMDsKLQkgIHJlbG9jc1sxXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLQkgICpyZWxvY3NbMV0tPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLQkgIHJlbG9jc1sxXS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgKmNvZGVzWzFdKTsKLQkgIHJlbG9jc1sxXS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQkgIHJlbG9jc1sxXS0+YWRkZW5kID0gMDsKLQkgIHJlbG9jc1syXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLQkgICpyZWxvY3NbMl0tPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X3N1YnN5KTsKLQkgIHJlbG9jc1syXS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgKmNvZGVzWzJdKTsKLQkgIHJlbG9jc1syXS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQkgIHJlbG9jc1syXS0+YWRkZW5kID0gMDsKLQkgIHJlbG9jc1szXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgJihiZmRfYWJzX3N5bWJvbCk7Ci0JICByZWxvY3NbM10tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1szXSk7Ci0JICByZWxvY3NbM10tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbM10tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbNF0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopICYoYmZkX2Fic19zeW1ib2wpOwotCSAgcmVsb2NzWzRdLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCAqY29kZXNbNF0pOwotCSAgcmVsb2NzWzRdLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCSAgcmVsb2NzWzRdLT5hZGRlbmQgPSAwOwotCSAgZ290byBkb25lOwotCWNhc2UgUl9QQ1JFTF9DQUxMOgotCWNhc2UgUl9BQlNfQ0FMTDoKLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gSFBQQV9SX0FEREVORCAoaHBwYV9maXhwLT5meF9hcmdfcmVsb2MsIDApOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfRExUX1JFTDoKLQljYXNlIFJfREFUQV9QTEFCRUw6Ci0JY2FzZSBSX0NPREVfUExBQkVMOgotCSAgLyogRm9yIHBsYWJlbCByZWxvY2F0aW9ucywgdGhlIGFkZGVuZCBvZiB0aGUKLQkgICAgIHJlbG9jYXRpb24gc2hvdWxkIGJlIGVpdGhlciAwIChubyBzdGF0aWMgbGluaykgb3IgMgotCSAgICAgKHN0YXRpYyBsaW5rIHJlcXVpcmVkKS4KLQotCSAgICAgRklYTUU6IFdlIGFsd2F5cyBhc3N1bWUgbm8gc3RhdGljIGxpbmshCi0KLQkgICAgIFdlIGFsc28gc2xhbSBhIHplcm8gYWRkZW5kIGludG8gdGhlIERMVCByZWxhdGl2ZSByZWxvY3M7Ci0JICAgICBpdCBkb2Vzbid0IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgdG8gdXNlIGFueSBhZGRlbmQgc2luY2UKLQkgICAgIGl0IGdldHMgeW91IGEgZGlmZmVyZW50IChlZyB1bmtub3duKSBETFQgZW50cnkuICAqLwotCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfTl9NT0RFOgotCWNhc2UgUl9TX01PREU6Ci0JY2FzZSBSX0RfTU9ERToKLQljYXNlIFJfUl9NT0RFOgotCWNhc2UgUl9GU0VMOgotCWNhc2UgUl9MU0VMOgotCWNhc2UgUl9SU0VMOgotCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQljYXNlIFJfRU5EX0JSVEFCOgotCWNhc2UgUl9CRUdJTl9UUlk6Ci0JY2FzZSBSX04wU0VMOgotCWNhc2UgUl9OMVNFTDoKLQkgIC8qIFRoZXJlIGlzIG5vIHN5bWJvbCBvciBhZGRlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGZpeHVwcy4gICovCi0gICAgICAgICAgcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgICAgICpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGR1bW15X3N5bWJvbCk7Ci0JICByZWxvY3NbaV0tPmFkZGVuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgUl9FTkRfVFJZOgotCWNhc2UgUl9FTlRSWToKLQljYXNlIFJfRVhJVDoKLQkgIC8qIFRoZXJlIGlzIG5vIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlc2UgZml4dXBzLiAgKi8KLSAgICAgICAgICByZWxvY3NbaV0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICAgICAgKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZHVtbXlfc3ltYm9sKTsKLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0JfQotICAgIH0KLQotIGRvbmU6Ci0jZW5kaWYKLQotICByZXR1cm4gcmVsb2NzOwotfQotCi0vKiBQcm9jZXNzIGFueSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnIHR5cGVzLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICByZWdpc3RlciBiZmQgKmFiZmQ7Ci0gICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgdW5zaWduZWQgaW50IGFkZHJlc3M7Ci0KLSAgaWYgKGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKGludCkgZnJhZ1AtPmZyX3N1YnR5cGUpCi0JewotCWNhc2UgMDoKLQkgIGZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKLQkgIGtub3cgKGZyYWdQLT5mcl92YXIgPT0gMSk7Ci0JICBrbm93IChmcmFnUC0+ZnJfbmV4dCk7Ci0JICBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4OwotCSAgaWYgKGFkZHJlc3MgJSBmcmFnUC0+ZnJfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX29mZnNldCA9Ci0JCWZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzCi0JCS0gZnJhZ1AtPmZyX2FkZHJlc3MKLQkJLSBmcmFnUC0+ZnJfZml4OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZyYWdQLT5mcl9vZmZzZXQgPSAwOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIGFzZWN0aW9uICpzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKLSAgaW50IGFsaWduMiA9ICgxIDw8IGFsaWduKSAtIDE7Ci0KLSAgcmV0dXJuIChzaXplICsgYWxpZ24yKSAmIH5hbGlnbjI7Ci19Ci0KLS8qIFJldHVybiB0aGUgYXBwcm94aW1hdGUgc2l6ZSBvZiBhIGZyYWcgYmVmb3JlIHJlbGF4YXRpb24gaGFzIG9jY3VycmVkLiAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIGFzZWN0aW9uICpzZWdtZW50OwotewotICBpbnQgc2l6ZTsKLQotICBzaXplID0gMDsKLQotICB3aGlsZSAoKGZyYWdQLT5mcl9maXggKyBzaXplKSAlIGZyYWdQLT5mcl9vZmZzZXQpCi0gICAgc2l6ZSsrOwotCi0gIHJldHVybiBzaXplOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLX0KLQwKLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogQXBwbHkgYSBmaXh1cCB0byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXhQOwotICBsb25nIG5ld192YWwsIHJlc3VsdCA9IDA7Ci0gIHVuc2lnbmVkIGludCB3MSwgdzIsIHcsIHJlc3VsdGk7Ci0KLSAgaHBwYV9maXhQID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4UC0+dGNfZml4X2RhdGE7Ci0gIC8qIFNPTSB1c2VzIFJfSFBQQV9FTlRSWSBhbmQgUl9IUFBBX0VYSVQgcmVsb2NhdGlvbnMgd2hpY2ggY2FuCi0gICAgIG5ldmVyIGJlICJhcHBsaWVkIiAodGhleSBhcmUganVzdCBtYXJrZXJzKS4gIExpa2V3aXNlIGZvcgotICAgICBSX0hQUEFfQkVHSU5fQlJUQUIgYW5kIFJfSFBQQV9FTkRfQlJUQUIuICAqLwotI2lmZGVmIE9CSl9TT00KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5UUlkKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRVhJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9CRUdJTl9CUlRBQgotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfQlJUQUIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fVFJZKQotICAgIHJldHVybiAxOwotCi0gIC8qIERpc2d1c3RpbmcuICBXZSBtdXN0IHNldCBmeF9vZmZzZXQgb3Vyc2VsdmVzIC0tIFJfSFBQQV9FTkRfVFJZCi0gICAgIGZpeHVwcyBhcmUgY29uc2lkZXJlZCBub3QgYWRqdXN0YWJsZSwgd2hpY2ggaW4gdHVybiBjYXVzZXMKLSAgICAgYWRqdXN0X3JlbG9jX3N5bXMgdG8gbm90IHNldCBmeF9vZmZzZXQuICBVZ2guICAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfVFJZKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X29mZnNldCA9ICp2YWxwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogVGhlcmUgc2hvdWxkIGhhdmUgYmVlbiBhbiBIUFBBIHNwZWNpZmljIGZpeHVwIGFzc29jaWF0ZWQKLSAgICAgd2l0aCB0aGUgR0FTIGZpeHVwLiAgKi8KLSAgaWYgKGhwcGFfZml4UCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGJ1Zl93ZCA9IGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKTsKLSAgICAgIGludCBmbXQgPSBiZmRfaHBwYV9pbnNuMmZtdCAoYnVmX3dkKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgYSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZml4dXAsIHRoZW4gaXQncyBzb21ldGhpbmcKLQkgd2hpY2ggd2lsbCBuZWVkIGEgU09NIHJlbG9jYXRpb24gKGV4Y2VwdCBmb3Igc29tZSBQQy1yZWxhdGl2ZSByZWxvY3MpLgotCSBJbiBzdWNoIGNhc2VzIHdlIHNob3VsZCB0cmVhdCB0aGUgInZhbCIgb3IgImFkZGVuZCIgYXMgemVybyBzaW5jZSBpdAotCSB3aWxsIGJlIGFkZGVkIGluIGFzIG5lZWRlZCBmcm9tIGZ4X29mZnNldCBpbiB0Y19nZW5fcmVsb2MuICAqLwotICAgICAgaWYgKChmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0JICAgfHwgZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9OT05FKQotI2lmZGVmIE9CSl9TT00KLQkgICYmIGZtdCAhPSAzMgotI2VuZGlmCi0JICApCi0JbmV3X3ZhbCA9ICgoZm10ID09IDEyIHx8IGZtdCA9PSAxNyB8fCBmbXQgPT0gMjIpID8gOCA6IDApOwotI2lmZGVmIE9CSl9TT00KLSAgICAgIC8qIFRoZXNlIGZpZWxkIHNlbGVjdG9ycyBpbXBseSB0aGF0IHdlIGRvIG5vdCB3YW50IGFuIGFkZGVuZC4gICovCi0gICAgICBlbHNlIGlmIChocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9wc2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3Jwc2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX2xwc2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3RzZWwKLQkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfcnRzZWwKLQkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfbHRzZWwpCi0JbmV3X3ZhbCA9ICgoZm10ID09IDEyIHx8IGZtdCA9PSAxNyB8fCBmbXQgPT0gMjIpID8gOCA6IDApOwotICAgICAgLyogVGhpcyBpcyB0cnVlbHkgZGlzZ3VzdGluZy4gIFRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgYmxpbmRseQotCSBhZGRzIGluIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGJlaW5nIHJlbG9jYXRlZCBhZ2FpbnN0LiAgRGFtbiEgICovCi0gICAgICBlbHNlIGlmIChmbXQgPT0gMzIKLQkgICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gYmZkX2NvbV9zZWN0aW9uX3B0cikKLQluZXdfdmFsID0gaHBwYV9maWVsZF9hZGp1c3QgKCp2YWxwIC0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KSwKLQkJCQkgICAgIDAsIGhwcGFfZml4UC0+Znhfcl9maWVsZCk7Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQluZXdfdmFsID0gaHBwYV9maWVsZF9hZGp1c3QgKCp2YWxwLCAwLCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQpOwotCi0gICAgICAvKiBIYW5kbGUgcGMtcmVsYXRpdmUgZXhjZXB0aW9ucyBmcm9tIGFib3ZlLiAgKi8KLSNkZWZpbmUgYXJnX3JlbG9jX3N0dWJfbmVlZGVkKENBTExFUiwgQ0FMTEVFKSBcCi0gICgoQ0FMTEVFKSAmJiAoQ0FMTEVSKSAmJiAoKENBTExFRSkgIT0gKENBTExFUikpKQotICAgICAgaWYgKChmbXQgPT0gMTIgfHwgZm10ID09IDE3IHx8IGZtdCA9PSAyMikKLQkgICYmIGZpeFAtPmZ4X2FkZHN5Ci0JICAmJiBmaXhQLT5meF9wY3JlbAotI2lmZGVmIE9CSl9TT00KLQkgICYmICFhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQgKChsb25nKSAoKG9ial9zeW1ib2xfdHlwZSAqKQotCQlzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYywKLQkJaHBwYV9maXhQLT5meF9hcmdfcmVsb2MpCi0jZW5kaWYKLQkgICYmICgoKGludCkoKnZhbHApID4gLTI2MjE0NCAmJiAoaW50KSgqdmFscCkgPCAyNjIxNDMpICYmIGZtdCAhPSAyMikKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSA9PSBocHBhX2ZpeFAtPnNlZ21lbnQKLQkgICYmICEoZml4UC0+Znhfc3Vic3kKLQkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpICE9IGhwcGFfZml4UC0+c2VnbWVudCkpCi0KLQluZXdfdmFsID0gaHBwYV9maWVsZF9hZGp1c3QgKCp2YWxwLCAwLCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQpOwotI3VuZGVmIGFyZ19yZWxvY19zdHViX25lZWRlZAotCi0gICAgICBzd2l0Y2ggKGZtdCkKLQl7Ci0JLyogSGFuZGxlIGFsbCBvcGNvZGVzIHdpdGggdGhlICdqJyBvcGVyYW5kIHR5cGUuICAqLwotCWNhc2UgMTQ6Ci0JICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgODE5MSwgLTgxOTIsIDApOwotCi0JICAvKiBNYXNrIG9mZiAxNCBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLwotCSAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAotCQkgICAgICBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZmZjMDAwLAotCQkgICAgICBidWYpOwotCSAgbG93X3NpZ25fdW5leHQgKG5ld192YWwsIDE0LCAmcmVzdWx0aSk7Ci0JICByZXN1bHQgPSByZXN1bHRpOwotCSAgYnJlYWs7Ci0KLQkvKiBIYW5kbGUgYWxsIG9wY29kZXMgd2l0aCB0aGUgJ2snIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAyMToKLQkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCAyMDk3MTUyLCAwLCAwKTsKLQotCSAgLyogTWFzayBvZmYgMjEgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwMDAwMCwKLQkJICAgICAgYnVmKTsKLQkgIGRpc19hc3NlbWJsZV8yMSAobmV3X3ZhbCwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSAnaScgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDExOgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDEwMjMsIC0xMDIzLCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTEgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmODAwLAotCQkgICAgICBidWYpOwotCSAgbG93X3NpZ25fdW5leHQgKG5ld192YWwsIDExLCAmcmVzdWx0aSk7Ci0JICByZXN1bHQgPSByZXN1bHRpOwotCSAgYnJlYWs7Ci0KLQkvKiBIYW5kbGUgYWxsIHRoZSBvcGNvZGVzIHdpdGggdGhlICd3JyBvcGVyYW5kIHR5cGUuICAqLwotCWNhc2UgMTI6Ci0JICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgODE5OSwgLTgxODQsIDApOwotCi0JICAvKiBNYXNrIG9mZiAxMSBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLwotCSAgc2lnbl91bmV4dCAoKG5ld192YWwgLSA4KSA+PiAyLCAxMiwgJnJlc3VsdGkpOwotCSAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAotCQkgICAgICBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZmZlMDAyLAotCQkgICAgICBidWYpOwotCi0JICBkaXNfYXNzZW1ibGVfMTIgKHJlc3VsdGksICZ3MSwgJncpOwotCSAgcmVzdWx0ID0gKCh3MSA8PCAyKSB8IHcpOwotCSAgYnJlYWs7Ci0KLQkvKiBIYW5kbGUgc29tZSBvZiB0aGUgb3Bjb2RlcyB3aXRoIHRoZSAnVycgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDE3OgotCSAgewotCSAgICBpbnQgZGlzdGFuY2UgPSAqdmFscDsKLQotCSAgICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgMjYyMTQzLCAtMjYyMTQ0LCAwKTsKLQotCSAgICAvKiBJZiB0aGlzIGlzIGFuIGFic29sdXRlIGJyYW5jaCAoaWUgbm8gbGluaykgd2l0aCBhbiBvdXQgb2YKLQkgICAgICAgcmFuZ2UgdGFyZ2V0LCB0aGVuIHdlIHdhbnQgdG8gY29tcGxhaW4uICAqLwotCSAgICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9QQ1JFTF9DQUxMCi0JCSYmIChkaXN0YW5jZSA+IDI2MjE0MyB8fCBkaXN0YW5jZSA8IC0yNjIxNDQpCi0JCSYmIChiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZTAwMDAwKSA9PSAweGU4MDAwMDAwKQotCSAgICAgIENIRUNLX0ZJRUxEIChkaXN0YW5jZSwgMjYyMTQzLCAtMjYyMTQ0LCAwKTsKLQotCSAgICAvKiBNYXNrIG9mZiAxNyBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLwotCSAgICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCQliZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZTBlMDAyLAotCQkJYnVmKTsKLQkgICAgc2lnbl91bmV4dCAoKG5ld192YWwgLSA4KSA+PiAyLCAxNywgJnJlc3VsdGkpOwotCSAgICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdGksICZ3MSwgJncyLCAmdyk7Ci0JICAgIHJlc3VsdCA9ICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSAyMjoKLQkgIHsKLQkgICAgaW50IGRpc3RhbmNlID0gKnZhbHAsIHczOwotCi0JICAgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCA4Mzg4NjA3LCAtODM4ODYwOCwgMCk7Ci0KLQkgICAgLyogSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggKGllIG5vIGxpbmspIHdpdGggYW4gb3V0IG9mCi0JICAgICAgIHJhbmdlIHRhcmdldCwgdGhlbiB3ZSB3YW50IHRvIGNvbXBsYWluLiAgKi8KLQkgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfUENSRUxfQ0FMTAotCQkmJiAoZGlzdGFuY2UgPiA4Mzg4NjA3IHx8IGRpc3RhbmNlIDwgLTgzODg2MDgpCi0JCSYmIChiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZTAwMDAwKSA9PSAweGU4MDAwMDAwKQotCSAgICAgIENIRUNLX0ZJRUxEIChkaXN0YW5jZSwgODM4ODYwNywgLTgzODg2MDgsIDApOwotCi0JICAgIC8qIE1hc2sgb2ZmIDIyIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICAgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJCWJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmMwMGUwMDIsCi0JCQlidWYpOwotCSAgICBzaWduX3VuZXh0ICgobmV3X3ZhbCAtIDgpID4+IDIsIDIyLCAmcmVzdWx0aSk7Ci0JICAgIGRpc19hc3NlbWJsZV8yMiAocmVzdWx0aSwgJnczLCAmdzEsICZ3MiwgJncpOwotCSAgICByZXN1bHQgPSAoKHczIDw8IDIxKSB8ICh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIDMyOgotCSAgcmVzdWx0ID0gMDsKLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwgbmV3X3ZhbCwgYnVmKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX2JhZCAoXygiVW5rbm93biByZWxvY2F0aW9uIGVuY291bnRlcmVkIGluIG1kX2FwcGx5X2ZpeC4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIEluc2VydCB0aGUgcmVsb2NhdGlvbi4gICovCi0gICAgICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSB8IHJlc3VsdCwgYnVmKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygibm8gaHBwYV9maXh1cCBlbnRyeSBmb3IgdGhpcyBmaXh1cCAoZml4UCA9IDB4JXgsIHR5cGUgPSAweCV4KVxuIiksCi0JICAgICAgKHVuc2lnbmVkIGludCkgZml4UCwgZml4UC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIFBBLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgaW5wdXQgbGluZSBwb2ludGVyIGlzIGF0IHRoZSBlbmQgb2YKLSAgIGEgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIGludAotaXNfZW5kX29mX3N0YXRlbWVudCAoKQotewotICByZXR1cm4gKCgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICB8fCAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnOycpCi0JICB8fCAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIScpKTsKLX0KLQotLyogUmVhZCBhIG51bWJlciBmcm9tIFMuICBUaGUgbnVtYmVyIG1pZ2h0IGNvbWUgaW4gb25lIG9mIG1hbnkgZm9ybXMsCi0gICB0aGUgbW9zdCBjb21tb24gd2lsbCBiZSBhIGhleCBvciBkZWNpbWFsIGNvbnN0YW50LCBidXQgaXQgY291bGQgYmUKLSAgIGEgcHJlLWRlZmluZWQgcmVnaXN0ZXIgKFl1ayEpLCBvciBhbiBhYnNvbHV0ZSBzeW1ib2wuCi0KLSAgIFJldHVybiBhIG51bWJlciBvciAtMSBmb3IgZmFpbHVyZS4KLQotICAgV2hlbiBwYXJzaW5nIFBBLTg5IEZQIHJlZ2lzdGVyIG51bWJlcnMgUkVTVUxUIHdpbGwgYmUKLSAgIHRoZSBhZGRyZXNzIG9mIGEgc3RydWN0dXJlIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dAotICAgTC9SIGhhbGYgb2YgRlAgcmVnaXN0ZXJzLCBzdG9yZSByZXN1bHRzIHRoZXJlIGFzIGFwcHJvcHJpYXRlLgotCi0gICBwYV9wYXJzZV9udW1iZXIgY2FuIG5vdCBoYW5kbGUgbmVnYXRpdmUgY29uc3RhbnRzIGFuZCB3aWxsIGZhaWwKLSAgIGhvcnJpYmx5IGlmIGl0IGlzIHBhc3NlZCBzdWNoIGEgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9udW1iZXIgKHMsIHJlc3VsdCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0ICpyZXN1bHQ7Ci17Ci0gIGludCBudW07Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc3ltYm9sUyAqc3ltOwotICBpbnQgc3RhdHVzOwotICBjaGFyICpwID0gKnM7Ci0KLSAgLyogU2tpcCB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgbnVtYmVyLiAgKi8KLSAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQotICAgIHAgPSBwICsgMTsKLQotICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgY2FsbGVyLiAgKi8KLSAgaWYgKHJlc3VsdCkKLSAgICB7Ci0gICAgICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gLTE7Ci0gICAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAtMTsKLSAgICB9Ci0gIG51bSA9IC0xOwotCi0gIGlmIChpc2RpZ2l0ICgqcCkpCi0gICAgewotICAgICAgLyogTG9va3MgbGlrZSBhIG51bWJlci4gICovCi0gICAgICBudW0gPSAwOwotCi0gICAgICBpZiAoKnAgPT0gJzAnICYmICgqKHAgKyAxKSA9PSAneCcgfHwgKihwICsgMSkgPT0gJ1gnKSkKLQl7Ci0JICAvKiBUaGUgbnVtYmVyIGlzIHNwZWNpZmllZCBpbiBoZXguICAqLwotCSAgcCArPSAyOwotCSAgd2hpbGUgKGlzZGlnaXQgKCpwKSB8fCAoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpCi0JCSB8fCAoKCpwID49ICdBJykgJiYgKCpwIDw9ICdGJykpKQotCSAgICB7Ci0JICAgICAgaWYgKGlzZGlnaXQgKCpwKSkKLQkJbnVtID0gbnVtICogMTYgKyAqcCAtICcwJzsKLQkgICAgICBlbHNlIGlmICgqcCA+PSAnYScgJiYgKnAgPD0gJ2YnKQotCQludW0gPSBudW0gKiAxNiArICpwIC0gJ2EnICsgMTA7Ci0JICAgICAgZWxzZQotCQludW0gPSBudW0gKiAxNiArICpwIC0gJ0EnICsgMTA7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBudW1iZXIgaXMgc3BlY2lmaWVkIGluIGRlY2ltYWwuICAqLwotCSAgd2hpbGUgKGlzZGlnaXQgKCpwKSkKLQkgICAgewotCSAgICAgIG51bSA9IG51bSAqIDEwICsgKnAgLSAnMCc7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgdGhlIGNhbGxlci4gICovCi0gICAgICBpZiAocmVzdWx0KQotCXsKLQkgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSBudW07Ci0KLQkgIGlmIChJU19SX1NFTEVDVCAocCkpCi0JICAgIHsKLQkgICAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAxOwotCSAgICAgICsrcDsKLQkgICAgfQotCSAgZWxzZSBpZiAoSVNfTF9TRUxFQ1QgKHApKQotCSAgICB7Ci0JICAgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQkgICAgICArK3A7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmICgqcCA9PSAnJScpCi0gICAgewotICAgICAgLyogVGhlIG51bWJlciBtaWdodCBiZSBhIHByZWRlZmluZWQgcmVnaXN0ZXIuICAqLwotICAgICAgbnVtID0gMDsKLSAgICAgIG5hbWUgPSBwOwotICAgICAgcCsrOwotICAgICAgYyA9ICpwOwotICAgICAgLyogVGVnZSBoYWNrOiBTcGVjaWFsIGNhc2UgZm9yIGdlbmVyYWwgcmVnaXN0ZXJzIGFzIHRoZSBnZW5lcmFsCi0gICAgICAgICBjb2RlIG1ha2VzIGEgYmluYXJ5IHNlYXJjaCB3aXRoIGNhc2UgdHJhbnNsYXRpb24sIGFuZCBpcyBWRVJZCi0gICAgICAgICBzbG93LiAqLwotICAgICAgaWYgKGMgPT0gJ3InKQotCXsKLQkgIHArKzsKLQkgIGlmICgqcCA9PSAnZScgJiYgKihwICsgMSkgPT0gJ3QnCi0JICAgICAgJiYgKCoocCArIDIpID09ICcwJyB8fCAqKHAgKyAyKSA9PSAnMScpKQotCSAgICB7Ci0JICAgICAgcCArPSAyOwotCSAgICAgIG51bSA9ICpwIC0gJzAnICsgMjg7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcCA9PSAncCcpCi0JICAgIHsKLQkgICAgICBudW0gPSAyOwotCSAgICAgIHArKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoIWlzZGlnaXQgKCpwKSkKLQkgICAgewotCSAgICAgIGlmIChwcmludF9lcnJvcnMpCi0JCWFzX2JhZCAoXygiVW5kZWZpbmVkIHJlZ2lzdGVyOiAnJXMnLiIpLCBuYW1lKTsKLQkgICAgICBudW0gPSAtMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZG8KLQkJbnVtID0gbnVtICogMTAgKyAqcCsrIC0gJzAnOwotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgqcCkpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvIGEgbm9ybWFsIHJlZ2lzdGVyIHNlYXJjaC4gICovCi0JICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjKSkKLQkgICAgewotCSAgICAgIHAgPSBwICsgMTsKLQkgICAgICBjID0gKnA7Ci0JICAgIH0KLQkgICpwID0gMDsKLQkgIHN0YXR1cyA9IHJlZ19uYW1lX3NlYXJjaCAobmFtZSk7Ci0JICBpZiAoc3RhdHVzID49IDApCi0JICAgIG51bSA9IHN0YXR1czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwcmludF9lcnJvcnMpCi0JCWFzX2JhZCAoXygiVW5kZWZpbmVkIHJlZ2lzdGVyOiAnJXMnLiIpLCBuYW1lKTsKLQkgICAgICBudW0gPSAtMTsKLQkgICAgfQotCSAgKnAgPSBjOwotCX0KLQotICAgICAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IGNhbGxlci4gICovCi0gICAgICBpZiAocmVzdWx0KQotCXsKLQkgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSBudW07Ci0JICBpZiAoSVNfUl9TRUxFQ1QgKHAgLSAxKSkKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMTsKLQkgIGVsc2UgaWYgKElTX0xfU0VMRUNUIChwIC0gMSkpCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JICBlbHNlCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFuZCBmaW5hbGx5LCBpdCBjb3VsZCBiZSBhIHN5bWJvbCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiB3aGljaAotICAgICAgICAgaXMgZWZmZWN0aXZlbHkgYSBjb25zdGFudC4gICovCi0gICAgICBudW0gPSAwOwotICAgICAgbmFtZSA9IHA7Ci0gICAgICBjID0gKnA7Ci0gICAgICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjKSkKLQl7Ci0JICBwID0gcCArIDE7Ci0JICBjID0gKnA7Ci0JfQotICAgICAgKnAgPSAwOwotICAgICAgaWYgKChzeW0gPSBzeW1ib2xfZmluZCAobmFtZSkpICE9IE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF9hYnNfc2VjdGlvbikKLQkgICAgbnVtID0gU19HRVRfVkFMVUUgKHN5bSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHJpbnRfZXJyb3JzKQotCQlhc19iYWQgKF8oIk5vbi1hYnNvbHV0ZSBzeW1ib2w6ICclcycuIiksIG5hbWUpOwotCSAgICAgIG51bSA9IC0xOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZXJlIGlzIHdoZXJlIHdlJ2QgY29tZSBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbAotCSAgICAgb3IgZm9yIGFuIGVtcHR5IHN0cmluZy4gIEZvciBhbiBlbXB0eSBzdHJpbmcgd2UKLQkgICAgIHdpbGwgcmV0dXJuIHplcm8uICBUaGF0J3MgYSBjb25jZXNzaW9uIG1hZGUgZm9yCi0JICAgICBjb21wYXRhYmlsaXR5IHdpdGggdGhlIGJyYWluZGFtYWdlZCBIUCBhc3NlbWJsZXJzLiAgKi8KLQkgIGlmICgqbmFtZSA9PSAwKQotCSAgICBudW0gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHByaW50X2Vycm9ycykKLQkJYXNfYmFkIChfKCJVbmRlZmluZWQgYWJzb2x1dGUgY29uc3RhbnQ6ICclcycuIiksIG5hbWUpOwotCSAgICAgIG51bSA9IC0xOwotCSAgICB9Ci0JfQotICAgICAgKnAgPSBjOwotCi0gICAgICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgY2FsbGVyLiAgKi8KLSAgICAgIGlmIChyZXN1bHQpCi0JewotCSAgcmVzdWx0LT5udW1iZXJfcGFydCA9IG51bTsKLQkgIGlmIChJU19SX1NFTEVDVCAocCAtIDEpKQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAxOwotCSAgZWxzZSBpZiAoSVNfTF9TRUxFQ1QgKHAgLSAxKSkKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQkgIGVsc2UKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQl9Ci0gICAgfQotCi0gICpzID0gcDsKLSAgcmV0dXJuIG51bTsKLX0KLQotI2RlZmluZSBSRUdfTkFNRV9DTlQJKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKQotCi0vKiBHaXZlbiBOQU1FLCBmaW5kIHRoZSByZWdpc3RlciBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZSwgcmV0dXJuCi0gICB0aGUgaW50ZWdlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgLTEgb24gZmFpbHVyZS4gICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSBSRUdfTkFNRV9DTlQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGdpdmVuIElOU04gYW5kIEwvUiBpbmZvcm1hdGlvbiB3aWxsIHJlcXVpcmUKLSAgIGEgbmV3IFBBLTEuMSBvcGNvZGUuICAqLwotCi1zdGF0aWMgaW50Ci1uZWVkX3BhMTFfb3Bjb2RlIChpbnNuLCByZXN1bHQpCi0gICAgIHN0cnVjdCBwYV9pdCAqaW5zbjsKLSAgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKnJlc3VsdDsKLXsKLSAgaWYgKHJlc3VsdC0+bF9yX3NlbGVjdCA9PSAxICYmICEoaW5zbi0+ZnBvZjEgPT0gREJMICYmIGluc24tPmZwb2YyID09IERCTCkpCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLAotCSB0aGVuIHNldCBhIG5ldyBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoc3Rkb3V0cHV0KSA8IHBhMTEpCi0JewotCSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCBwYTExKSkKLQkgICAgYXNfd2FybiAoXygiY291bGQgbm90IHVwZGF0ZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0JfQotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0vKiBQYXJzZSBhIGNvbmRpdGlvbiBmb3IgYSBmY21wIGluc3RydWN0aW9uLiAgUmV0dXJuIHRoZSBudW1lcmljYWwKLSAgIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25kaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9mcF9jbXBfY29uZCAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCBjb25kLCBpOwotCi0gIGNvbmQgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsIGZwX2NvbmRfbWFwW2ldLnN0cmluZywKLQkJICAgICAgIHN0cmxlbiAoZnBfY29uZF9tYXBbaV0uc3RyaW5nKSkgPT0gMCkKLQl7Ci0JICBjb25kID0gZnBfY29uZF9tYXBbaV0uY29uZDsKLQkgICpzICs9IHN0cmxlbiAoZnBfY29uZF9tYXBbaV0uc3RyaW5nKTsKLQkgIC8qIElmIG5vdCBhIGNvbXBsZXRlIG1hdGNoLCBiYWNrIHVwIHRoZSBpbnB1dCBzdHJpbmcgYW5kCi0JICAgICByZXBvcnQgYW4gZXJyb3IuICAqLwotCSAgaWYgKCoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JICAgIHsKLQkgICAgICAqcyAtPSBzdHJsZW4gKGZwX2NvbmRfbWFwW2ldLnN0cmluZyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHdoaWxlICgqKnMgPT0gJyAnIHx8ICoqcyA9PSAnXHQnKQotCSAgICAqcyA9ICpzICsgMTsKLQkgIHJldHVybiBjb25kOwotCX0KLSAgICB9Ci0KLSAgYXNfYmFkIChfKCJJbnZhbGlkIEZQIENvbXBhcmUgQ29uZGl0aW9uOiAlcyIpLCAqcyk7Ci0KLSAgLyogQWR2YW5jZSBvdmVyIHRoZSBib2d1cyBjb21wbGV0ZXIuICAqLwotICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotICAgICpzICs9IDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFBhcnNlIGEgZ3JhcGhpY3MgdGVzdCBjb21wbGV0ZSBmb3IgZnRlc3QuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9mdGVzdF9nZnhfY29tcGxldGVyIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IHZhbHVlOwotCi0gIHZhbHVlID0gMDsKLSAgaWYgKHN0cm5jYXNlY21wICgqcywgImFjYzgiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIHZhbHVlID0gNTsKLSAgICAgICpzICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJhY2M2IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IDk7Ci0gICAgICAqcyArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiYWNjNCIsIDQpID09IDApCi0gICAgewotICAgICAgdmFsdWUgPSAxMzsKLSAgICAgICpzICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJhY2MyIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IDE3OwotICAgICAgKnMgKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgImFjYyIsIDMpID09IDApCi0gICAgewotICAgICAgdmFsdWUgPSAxOwotICAgICAgKnMgKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInJlajgiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIHZhbHVlID0gNjsKLSAgICAgICpzICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJyZWoiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIHZhbHVlID0gMjsKLSAgICAgICpzICs9IDM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSAwOwotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIEZURVNUIGNvbXBsZXRlcjogJXMiKSwgKnMpOwotICAgIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFBhcnNlIGFuIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIGNvbXBsZXRlcgotICAgdHlwZS4gICovCi0KLXN0YXRpYyBmcF9vcGVyYW5kX2Zvcm1hdAotcGFfcGFyc2VfZnBfY252X2Zvcm1hdCAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCBmb3JtYXQ7Ci0KLSAgZm9ybWF0ID0gU0dMOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgaWYgKHN0cm5jYXNlY21wICgqcywgInNnbCIsIDMpID09IDApCi0JewotCSAgZm9ybWF0ID0gU0dMOwotCSAgKnMgKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJkYmwiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IERCTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAicXVhZCIsIDQpID09IDApCi0JewotCSAgZm9ybWF0ID0gUVVBRDsKLQkgICpzICs9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAidyIsIDEpID09IDApCi0JewotCSAgZm9ybWF0ID0gVzsKLQkgICpzICs9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAidXciLCAyKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFVXOwotCSAgKnMgKz0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJkdyIsIDIpID09IDApCi0JewotCSAgZm9ybWF0ID0gRFc7Ci0JICAqcyArPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInVkdyIsIDMpID09IDApCi0JewotCSAgZm9ybWF0ID0gVURXOwotCSAgKnMgKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJxdyIsIDIpID09IDApCi0JewotCSAgZm9ybWF0ID0gUVc7Ci0JICAqcyArPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInVxdyIsIDMpID09IDApCi0JewotCSAgZm9ybWF0ID0gVVFXOwotCSAgKnMgKz0gNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9ybWF0ID0gSUxMRUdBTF9GTVQ7Ci0JICBhc19iYWQgKF8oIkludmFsaWQgRlAgT3BlcmFuZCBGb3JtYXQ6ICUzcyIpLCAqcyk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZm9ybWF0OwotfQotCi0vKiBQYXJzZSBhbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZSBjb21wbGV0ZXIKLSAgIHR5cGUuICAqLwotCi1zdGF0aWMgZnBfb3BlcmFuZF9mb3JtYXQKLXBhX3BhcnNlX2ZwX2Zvcm1hdCAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCBmb3JtYXQ7Ci0KLSAgZm9ybWF0ID0gU0dMOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgaWYgKHN0cm5jYXNlY21wICgqcywgInNnbCIsIDMpID09IDApCi0JewotCSAgZm9ybWF0ID0gU0dMOwotCSAgKnMgKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJkYmwiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IERCTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAicXVhZCIsIDQpID09IDApCi0JewotCSAgZm9ybWF0ID0gUVVBRDsKLQkgICpzICs9IDU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvcm1hdCA9IElMTEVHQUxfRk1UOwotCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZQIE9wZXJhbmQgRm9ybWF0OiAlM3MiKSwgKnMpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZvcm1hdDsKLX0KLQotLyogQ29udmVydCBmcm9tIGEgc2VsZWN0b3Igc3RyaW5nIGludG8gYSBzZWxlY3RvciB0eXBlLiAgKi8KLQotc3RhdGljIGludAotcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIChzdHIpCi0gICAgIGNoYXIgKipzdHI7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLSAgY2hhciBuYW1lWzRdOwotCi0gIC8qIFJlYWQgcGFzdCBhbnkgd2hpdGVzcGFjZS4gICovCi0gIC8qIEZJWE1FOiBzaG91bGQgd2UgcmVhZCBwYXN0IG5ld2xpbmVzIGFuZCBmb3JtZmVlZHM/Pz8gKi8KLSAgd2hpbGUgKCoqc3RyID09ICcgJyB8fCAqKnN0ciA9PSAnXHQnIHx8ICoqc3RyID09ICdcbicgfHwgKipzdHIgPT0gJ1xmJykKLSAgICAqc3RyID0gKnN0ciArIDE7Ci0KLSAgaWYgKCgqc3RyKVsxXSA9PSAnXCcnIHx8ICgqc3RyKVsxXSA9PSAnJScpCi0gICAgbmFtZVswXSA9IHRvbG93ZXIgKCgqc3RyKVswXSksCi0gICAgbmFtZVsxXSA9IDA7Ci0gIGVsc2UgaWYgKCgqc3RyKVsyXSA9PSAnXCcnIHx8ICgqc3RyKVsyXSA9PSAnJScpCi0gICAgbmFtZVswXSA9IHRvbG93ZXIgKCgqc3RyKVswXSksCi0gICAgbmFtZVsxXSA9IHRvbG93ZXIgKCgqc3RyKVsxXSksCi0gICAgbmFtZVsyXSA9IDA7Ci0gIGVsc2UgaWYgKCgqc3RyKVszXSA9PSAnXCcnIHx8ICgqc3RyKVszXSA9PSAnJScpCi0gICAgbmFtZVswXSA9IHRvbG93ZXIgKCgqc3RyKVswXSksCi0gICAgbmFtZVsxXSA9IHRvbG93ZXIgKCgqc3RyKVsxXSksCi0gICAgbmFtZVsyXSA9IHRvbG93ZXIgKCgqc3RyKVsyXSksCi0gICAgbmFtZVszXSA9IDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gZV9mc2VsOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSBzaXplb2YgKHNlbGVjdG9yX3RhYmxlKSAvIHNpemVvZiAoc3RydWN0IHNlbGVjdG9yX2VudHJ5KSAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY21wIChuYW1lLCBzZWxlY3Rvcl90YWJsZVttaWRkbGVdLnByZWZpeCk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQl7Ci0JICAqc3RyICs9IHN0cmxlbiAobmFtZSkgKyAxOwotI2lmbmRlZiBPQkpfU09NCi0JICBpZiAoc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5maWVsZF9zZWxlY3RvciA9PSBlX25zZWwpCi0JICAgIHJldHVybiBlX2ZzZWw7Ci0jZW5kaWYKLQkgIHJldHVybiBzZWxlY3Rvcl90YWJsZVttaWRkbGVdLmZpZWxkX3NlbGVjdG9yOwotCX0KLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0KLSAgcmV0dXJuIGVfZnNlbDsKLX0KLQotLyogTWFyayAodmlhIGV4cHJfZW5kKSB0aGUgZW5kIG9mIGFuIGV4cHJlc3Npb24gKEkgdGhpbmspLiAgRklYTUUuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfZXhwcmVzc2lvbiAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0gIGFzZWN0aW9uICpzZWc7Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBzZWcgPSBleHByZXNzaW9uICgmdGhlX2luc24uZXhwKTsKLSAgaWYgKCEoc2VnID09IGFic29sdXRlX3NlY3Rpb24KLQl8fCBzZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQl8fCBTRUdfTk9STUFMIChzZWcpKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgc2VnbWVudCBpbiBleHByZXNzaW9uLiIpKTsKLSAgICAgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAwOwotfQotCi0vKiBNYXJrICh2aWEgZXhwcl9lbmQpIHRoZSBlbmQgb2YgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIEZJWE1FLiAqLwotc3RhdGljIGludAotcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKGluc24sIHN0cnApCi0gICAgIHN0cnVjdCBwYV9pdCAqaW5zbjsKLSAgICAgY2hhciAqKnN0cnA7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0KLSAgaW5zbi0+ZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKHN0cnApOwotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RycDsKLSAgZXhwcmVzc2lvbiAoJmluc24tPmV4cCk7Ci0gIC8qIFRoaXMgaXMgbm90IHBlcmZlY3QsIGJ1dCBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQgb3ZlciBkb2luZyBub3RoaW5nLgotCi0gICAgIFRoZSBQQSBhc3NlbWJseSBzeW50YXggaXMgYW1iaWdpb3VzIGluIGEgdmFyaWV0eSBvZiB3YXlzLiAgQ29uc2lkZXIKLSAgICAgdGhpcyBzdHJpbmcgIjQgJXI1IiAgSXMgdGhhdCB0aGUgbnVtYmVyIDQgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyCi0gICAgIHI1LCBvciBpcyB0aGF0IDQgTU9EIDU/Ci0KLSAgICAgSWYgd2UgZ2V0IGEgbW9kdWxvIGV4cHJlc2lvbiBXaGVuIGxvb2tpbmcgZm9yIGFuIGFic29sdXRlLCB3ZSB0cnkKLSAgICAgYWdhaW4gY3V0dGluZyBvZmYgdGhlIGlucHV0IHN0cmluZyBhdCB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICAqLwotICBpZiAoaW5zbi0+ZXhwLlhfb3AgPT0gT19tb2R1bHVzKQotICAgIHsKLSAgICAgIGNoYXIgKnMsIGM7Ci0gICAgICBpbnQgcmV0dmFsOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RycDsKLSAgICAgIHMgPSAqc3RycDsKLSAgICAgIHdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0gICAgICAgIHMrKzsKLQotICAgICAgYyA9ICpzOwotICAgICAgKnMgPSAwOwotCi0gICAgICByZXR2YWwgPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoaW5zbiwgc3RycCk7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICAqcyA9IGM7Ci0gICAgICByZXR1cm4gZXZhbHVhdGVfYWJzb2x1dGUgKGluc24pOwotICAgIH0KLSAgLyogV2hlbiBpbiBzdHJpY3QgbW9kZSB3ZSBoYXZlIGEgbm9uLW1hdGNoLCBmaXggdXAgdGhlIHBvaW50ZXJzCi0gICAgIGFuZCByZXR1cm4gdG8gb3VyIGNhbGxlci4gICovCi0gIGlmIChpbnNuLT5leHAuWF9vcCAhPSBPX2NvbnN0YW50ICYmIHN0cmljdCkKLSAgICB7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChpbnNuLT5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQmFkIHNlZ21lbnQgKHNob3VsZCBiZSBhYnNvbHV0ZSkuIikpOwotICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIGV2YWx1YXRlX2Fic29sdXRlIChpbnNuKTsKLX0KLQotLyogRXZhbHVhdGUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBFWFAgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIGJ5Ci0gICB0aGUgc2VsZWN0b3IgRklFTERfU0VMRUNUT1IuICBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiAgKi8KLXN0YXRpYyBpbnQKLWV2YWx1YXRlX2Fic29sdXRlIChpbnNuKQotICAgICBzdHJ1Y3QgcGFfaXQgKmluc247Ci17Ci0gIGludCB2YWx1ZTsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgZmllbGRfc2VsZWN0b3IgPSBpbnNuLT5maWVsZF9zZWxlY3RvcjsKLQotICBleHAgPSBpbnNuLT5leHA7Ci0gIHZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKLQotICBzd2l0Y2ggKGZpZWxkX3NlbGVjdG9yKQotICAgIHsKLSAgICAvKiBObyBjaGFuZ2UuICAqLwotICAgIGNhc2UgZV9mc2VsOgotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBJZiBiaXQgMjEgaXMgb24gdGhlbiBhZGQgMHg4MDAgYW5kIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCi0gICAgY2FzZSBlX2xzc2VsOgotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpZ24gZXh0ZW5kIGZyb20gYml0IDIxLiAgKi8KLSAgICBjYXNlIGVfcnNzZWw6Ci0gICAgICBpZiAodmFsdWUgJiAweDAwMDAwNDAwKQotCXZhbHVlIHw9IDB4ZmZmZmY4MDA7Ci0gICAgICBlbHNlCi0JdmFsdWUgJj0gMHg3ZmY7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCi0gICAgY2FzZSBlX2xzZWw6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTZXQgYml0cyAwLTIwIHRvIHplcm8uICAqLwotICAgIGNhc2UgZV9yc2VsOgotICAgICAgdmFsdWUgPSB2YWx1ZSAmIDB4N2ZmOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBZGQgMHg4MDAgYW5kIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCi0gICAgY2FzZSBlX2xkc2VsOgotICAgICAgdmFsdWUgKz0gMHg4MDA7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTZXQgYml0Z3MgMC0yMSB0byBvbmUuICAqLwotICAgIGNhc2UgZV9yZHNlbDoKLSAgICAgIHZhbHVlIHw9IDB4ZmZmZmY4MDA7Ci0gICAgICBicmVhazsKLQotI2RlZmluZSBSU0VMX1JPVU5EKGMpICAoKChjKSArIDB4MTAwMCkgJiB+MHgxZmZmKQotICAgIGNhc2UgZV9ycnNlbDoKLSAgICAgIHZhbHVlID0gKFJTRUxfUk9VTkQgKHZhbHVlKSAmIDB4N2ZmKSArICh2YWx1ZSAtIFJTRUxfUk9VTkQgKHZhbHVlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9scnNlbDoKLSAgICAgIHZhbHVlID0gKFJTRUxfUk9VTkQgKHZhbHVlKSA+PiAxMSkgJiAweDFmZmZmZjsKLSAgICAgIGJyZWFrOwotI3VuZGVmIFJTRUxfUk9VTkQKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZmllbGRfc2VsZWN0b3IpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIEdpdmVuIGFuIGFyZ3VtZW50IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gcmV0dXJuIHRoZSBhc3NvY2lhdGVkCi0gICBhcmd1bWVudCBsb2NhdGlvbiBudW1iZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9idWlsZF9hcmdfcmVsb2MgKHR5cGVfbmFtZSkKLSAgICAgY2hhciAqdHlwZV9uYW1lOwotewotCi0gIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAibm8iLCAyKSA9PSAwKQotICAgIHJldHVybiAwOwotICBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImdyIiwgMikgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImZyIiwgMikgPT0gMCkKLSAgICByZXR1cm4gMjsKLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImZ1IiwgMikgPT0gMCkKLSAgICByZXR1cm4gMzsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygiSW52YWxpZCBhcmd1bWVudCBsb2NhdGlvbjogJXNcbiIpLCB0eXBlX25hbWUpOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBFbmNvZGUgYW5kIHJldHVybiBhbiBhcmd1bWVudCByZWxvY2F0aW9uIHNwZWNpZmljYXRpb24gZm9yCi0gICB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBhcmdfcmVsb2MuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9hbGlnbl9hcmdfcmVsb2MgKHJlZywgYXJnX3JlbG9jKQotICAgICB1bnNpZ25lZCBpbnQgcmVnOwotICAgICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOwotewotICB1bnNpZ25lZCBpbnQgbmV3X3JlbG9jOwotCi0gIG5ld19yZWxvYyA9IGFyZ19yZWxvYzsKLSAgc3dpdGNoIChyZWcpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIG5ld19yZWxvYyA8PD0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIG5ld19yZWxvYyA8PD0gNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG5ld19yZWxvYyA8PD0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIG5ld19yZWxvYyA8PD0gMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgZGVzY3JpcHRpb246ICVkIiksIHJlZyk7Ci0gICAgfQotCi0gIHJldHVybiBuZXdfcmVsb2M7Ci19Ci0KLS8qIFBhcnNlIGEgUEEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgKCxuKS4gIFJldHVybiBub256ZXJvIGlmIHRoZQotICAgY29tcGxldGVyIHdhcyBmb3VuZDsgcmV0dXJuIHplcm8gaWYgbm8gY29tcGxldGVyIHdhcyBmb3VuZC4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX251bGxpZiAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCBudWxsaWY7Ci0KLSAgbnVsbGlmID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgPSAqcyArIDE7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKCpzLCAibiIsIDEpID09IDApCi0JbnVsbGlmID0gMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIkludmFsaWQgTnVsbGlmaWNhdGlvbjogKCVjKSIpLCAqKnMpOwotCSAgbnVsbGlmID0gMDsKLQl9Ci0gICAgICAqcyA9ICpzICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIG51bGxpZjsKLX0KLQotLyogUGFyc2UgYSBub24tbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbXBsZXRlciByZXR1cm5pbmcgdGhlCi0gICBudW1iZXIgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLSAgaW50IG51bGxpZnkgPSAwOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLQotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JICBudWxsaWZ5ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG51bGxpZnkpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLQotICByZXR1cm4gY21wbHRyOwotfQotCi0vKiBQYXJzZSBhIG5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZQotICAgbnVtYmVyIChmb3IgZW5jb2RpbmcgaW4gaW5zdHJ1dGlvbnMpIG9mIHRoZSBnaXZlbiBjb21wbGV0ZXIuCi0KLSAgIElTQlJBTkNIIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHBhcnNpbmcgYSBjb25kaXRpb24KLSAgIGNvbXBsZXRlciBmb3IgYSBicmFuY2ggKHZzIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGEKLSAgIGNvbXB1dGF0aW9uYWwgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0ciAocywgaXNicmFuY2gpCi0gICAgIGNoYXIgKipzOwotICAgICBpbnQgaXNicmFuY2g7Ci17Ci0gIGludCBjbXBsdHI7Ci0gIGNoYXIgKm5hbWUgPSAqcyArIDE7Ci0gIGNoYXIgYzsKLSAgY2hhciAqc2F2ZV9zID0gKnM7Ci0gIGludCBudWxsaWZ5ID0gMDsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0KLQotICAgICAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PiIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JewotCSAgY21wbHRyID0gNzsKLQl9Ci0gICAgICAvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIGFkZGIsbiB0aGVuIHRoZXJlIGlzIG5vIGNvbmRpdGlvbgotICAgICAgICAgY29tcGxldGVyLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiBpc2JyYW5jaCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCSAgbnVsbGlmeSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChudWxsaWZ5KQotICAgICpzID0gc2F2ZV9zOwotCi0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotCi0vKiBQYXJzZSBhIDY0IGJpdCBjb21wYXJlIGFuZCBicmFuY2ggY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyIChmb3IKLSAgIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBOb25uZWdhdGVkIGNvbXBhcmlzb25zIGFyZSByZXR1cm5lZCBhcyAwLTcsIG5lZ2F0ZWQgY29tcGFyaXNvbnMgYXJlCi0gICByZXR1cm5lZCBhcyA4LTE1LiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfY21wYl82NF9jbXBsdHIgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotCi0gIGNtcGx0ciA9IC0xOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIqIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPDwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKjw8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKnN2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqb2QiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIip0ciIpID09IDApCi0JewotCSAgY21wbHRyID0gODsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPD4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKj4+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKj4+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKm5zdiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIipldiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogUGFyc2UgYSA2NCBiaXQgY29tcGFyZSBpbW1lZGlhdGUgYW5kIGJyYW5jaCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZSBudW1iZXIKLSAgIChmb3IgZW5jb2RpbmcgaW4gaW5zdHJ1dGlvbnMpIG9mIHRoZSBnaXZlbiBjb21wbGV0ZXIuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9jbXBpYl82NF9jbXBsdHIgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotCi0gIGNtcGx0ciA9IC0xOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIqPDwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKjw9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio+Pj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqPj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjbXBsdHIgPSAtMTsKLQl9Ci0gICAgICAqKnMgPSBjOwotICAgIH0KLQotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLS8qIFBhcnNlIGEgbm9uLW5lZ2F0ZWQgYWRkaXRpb24gY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyCi0gICAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgKHMsIGlzYnJhbmNoKQotICAgICBjaGFyICoqczsKLSAgICAgaW50IGlzYnJhbmNoOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiem52IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGNtcGx0ciA9PSAwICYmICpuYW1lID09ICduJyAmJiBpc2JyYW5jaCkKLSAgICAqcyA9IHNhdmVfczsKLQotICByZXR1cm4gY21wbHRyOwotfQotCi0vKiBQYXJzZSBhIG5lZ2F0ZWQgYWRkaXRpb24gY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyCi0gICAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uKS4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25lZ19hZGRfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ2bnoiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGNtcGx0ciA9PSAwICYmICpuYW1lID09ICduJyAmJiBpc2JyYW5jaCkKLSAgICAqcyA9IHNhdmVfczsKLQotICByZXR1cm4gY21wbHRyOwotfQotCi0vKiBQYXJzZSBhIDY0IGJpdCB3aWRlIG1vZGUgYWRkIGFuZCBicmFuY2ggY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyIChmb3IKLSAgIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfYWRkYl82NF9jbXBsdHIgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotICBpbnQgbnVsbGlmeSA9IDA7Ci0KLSAgY21wbHRyID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqPSIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gNzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JewotCSAgY21wbHRyID0gODsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gOTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE1OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JICBudWxsaWZ5ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG51bGxpZnkpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotI2lmZGVmIE9CSl9TT00KLS8qIEhhbmRsZSBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlLiAgU3BlY2lhbCBzbyB0aGF0IHdlIGNhbiB1cGRhdGUgdGhlCi0gICBhbGlnbm1lbnQgb2YgdGhlIHN1YnNwYWNlIGlmIG5lY2Vzc2FyeS4gICovCi1zdGF0aWMgdm9pZAotcGFfYWxpZ24gKGJ5dGVzKQotewotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLQotICAvKiBMZXQgdGhlIGdlbmVyaWMgZ2FzIGNvZGUgZG8gbW9zdCBvZiB0aGUgd29yay4gICovCi0gIHNfYWxpZ25fYnl0ZXMgKGJ5dGVzKTsKLQotICAvKiBJZiBieXRlcyBpcyBhIHBvd2VyIG9mIDIsIHRoZW4gdXBkYXRlIHRoZSBjdXJyZW50IHN1YnNwYWNlJ3MKLSAgICAgYWxpZ25tZW50IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChsb2cyIChieXRlcykgIT0gLTEpCi0gICAgcmVjb3JkX2FsaWdubWVudCAoY3VycmVudF9zdWJzcGFjZS0+c3NkX3NlZywgbG9nMiAoYnl0ZXMpKTsKLX0KLSNlbmRpZgotCi0vKiBIYW5kbGUgYSAuQkxPQ0sgdHlwZSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfYmxvY2sgKHopCi0gICAgIGludCB6OwotewotICBjaGFyICpwOwotICBsb25nIGludCB0ZW1wX2ZpbGw7Ci0gIHVuc2lnbmVkIGludCB0ZW1wX3NpemU7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHRlbXBfc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIC8qIEFsd2F5cyBmaWxsIHdpdGggemVyb3MsIHRoYXQncyB3aGF0IHRoZSBIUCBhc3NlbWJsZXIgZG9lcy4gICovCi0gIHRlbXBfZmlsbCA9IDA7Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19maWxsLCAoaW50KSB0ZW1wX3NpemUsIChpbnQpIHRlbXBfc2l6ZSwKLQkJKHJlbGF4X3N1YnN0YXRlVCkgMCwgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIDEsIE5VTEwpOwotICBtZW1zZXQgKHAsIDAsIHRlbXBfc2l6ZSk7Ci0KLSAgLyogQ29udmVydCAyIGJ5dGVzIGF0IGEgdGltZS4gICovCi0KLSAgZm9yIChpID0gMDsgaSA8IHRlbXBfc2l6ZTsgaSArPSAyKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIGksCi0JCQkgICh2YWx1ZVQpIHRlbXBfZmlsbCwKLQkJCSAgKGludCkgKCh0ZW1wX3NpemUgLSBpKSA+IDIgPyAyIDogKHRlbXBfc2l6ZSAtIGkpKSk7Ci0gICAgfQotCi0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuYmVnaW5fYnJ0YWIgYW5kIC5lbmRfYnJ0YWIgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2JydGFiIChiZWdpbikKLSAgICAgaW50IGJlZ2luOwotewotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBUaGUgQlJUQUIgcmVsb2NhdGlvbnMgYXJlIG9ubHkgYXZhaWxibGUgaW4gU09NICh0byBkZW5vdGUKLSAgICAgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGJyYW5jaCB0YWJsZXMpLiAgKi8KLSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCU5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAotCQkwLCBiZWdpbiA/IFJfSFBQQV9CRUdJTl9CUlRBQiA6IFJfSFBQQV9FTkRfQlJUQUIsCi0JCWVfZnNlbCwgMCwgMCwgTlVMTCk7Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuYmVnaW5fdHJ5IGFuZCAuZW5kX3RyeSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdHJ5IChiZWdpbikKLSAgICAgaW50IGJlZ2luOwotewotI2lmZGVmIE9CSl9TT00KLSAgZXhwcmVzc2lvblMgZXhwOwotICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLSAgaWYgKCEgYmVnaW4pCi0gICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgLyogVGhlIFRSWSByZWxvY2F0aW9ucyBhcmUgb25seSBhdmFpbGJsZSBpbiBTT00gKHRvIGRlbm90ZQotICAgICB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgZXhjZXB0aW9uIGhhbmRsaW5nIHJlZ2lvbnMpLiAgKi8KLQotICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQlOVUxMLCAob2Zmc2V0VCkgMCwgYmVnaW4gPyBOVUxMIDogJmV4cCwKLQkJMCwgYmVnaW4gPyBSX0hQUEFfQkVHSU5fVFJZIDogUl9IUFBBX0VORF9UUlksCi0JCWVfZnNlbCwgMCwgMCwgTlVMTCk7Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuQ0FMTCBwc2V1ZG8tb3AuICBUaGlzIGludm9sdmVzIHN0b3JpbmcgYXdheSBpbmZvcm1hdGlvbgotICAgYWJvdXQgd2hlcmUgYXJndW1lbnRzIGFyZSB0byBiZSBmb3VuZCBzbyB0aGUgbGlua2VyIGNhbiBkZXRlY3QKLSAgIChhbmQgY29ycmVjdCkgYXJndW1lbnQgbG9jYXRpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGNhbGxlciBhbmQgY2FsbGVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NhbGwgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgcGFfY2FsbF9hcmdzICgmbGFzdF9jYWxsX2Rlc2MpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBEbyB0aGUgZGlydHkgd29yayBvZiBidWlsZGluZyBhIGNhbGwgZGVzY3JpcHRvciB3aGljaCBkZXNjcmliZXMKLSAgIHdoZXJlIHRoZSBjYWxsZXIgcGxhY2VkIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uIGNhbGwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2FsbF9hcmdzIChjYWxsX2Rlc2MpCi0gICAgIHN0cnVjdCBjYWxsX2Rlc2MgKmNhbGxfZGVzYzsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHVuc2lnbmVkIGludCB0ZW1wLCBhcmdfcmVsb2M7Ci0KLSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAvKiBQcm9jZXNzIGEgc291cmNlIGFyZ3VtZW50LiAgKi8KLSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhcmd3IiwgNCkgPT0gMCkpCi0JewotCSAgdGVtcCA9IGF0b2kgKG5hbWUgKyA0KTsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBhcmdfcmVsb2MgPSBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpOwotCSAgY2FsbF9kZXNjLT5hcmdfcmVsb2MgfD0gcGFfYWxpZ25fYXJnX3JlbG9jICh0ZW1wLCBhcmdfcmVsb2MpOwotCX0KLSAgICAgIC8qIFByb2Nlc3MgYSByZXR1cm4gdmFsdWUuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicnRudmFsIiwgNikgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGFyZ19yZWxvYyA9IHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSk7Ci0JICBjYWxsX2Rlc2MtPmFyZ19yZWxvYyB8PSAoYXJnX3JlbG9jICYgMHgzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5DQUxMIGFyZ3VtZW50OiAlcyIpLCBuYW1lKTsKLQl9Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgRlJBRzEgYW5kIEZSQUcyIGFyZSB0aGUgc2FtZS4gICovCi0KLXN0YXRpYyBpbnQKLWlzX3NhbWVfZnJhZyAoZnJhZzEsIGZyYWcyKQotICAgICBmcmFnUyAqZnJhZzE7Ci0gICAgIGZyYWdTICpmcmFnMjsKLXsKLQotICBpZiAoZnJhZzEgPT0gTlVMTCkKLSAgICByZXR1cm4gKEZBTFNFKTsKLSAgZWxzZSBpZiAoZnJhZzIgPT0gTlVMTCkKLSAgICByZXR1cm4gKEZBTFNFKTsKLSAgZWxzZSBpZiAoZnJhZzEgPT0gZnJhZzIpCi0gICAgcmV0dXJuIChUUlVFKTsKLSAgZWxzZSBpZiAoZnJhZzItPmZyX3R5cGUgPT0gcnNfZmlsbCAmJiBmcmFnMi0+ZnJfZml4ID09IDApCi0gICAgcmV0dXJuIChpc19zYW1lX2ZyYWcgKGZyYWcxLCBmcmFnMi0+ZnJfbmV4dCkpOwotICBlbHNlCi0gICAgcmV0dXJuIChGQUxTRSk7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBCdWlsZCBhbiBlbnRyeSBpbiB0aGUgVU5XSU5EIHN1YnNwYWNlIGZyb20gdGhlIGdpdmVuIGZ1bmN0aW9uCi0gICBhdHRyaWJ1dGVzIGluIENBTExfSU5GTy4gIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgU09NIGFzIHVzaW5nCi0gICBSX0VOVFJZIGFuZCBSX0VYSVQgcmVsb2NhdGlvbnMgYWxsb3cgdGhlIGxpbmtlciB0byBoYW5kbGUgYnVpbGRpbmcKLSAgIG9mIHRoZSB1bndpbmQgc3BhY2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSAoY2FsbF9pbmZvKQotICAgICBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm87Ci17Ci0gIGNoYXIgKnVud2luZDsKLSAgYXNlY3Rpb24gKnNlZywgKnNhdmVfc2VnOwotICBhc3ltYm9sICpzeW07Ci0gIHN1YnNlZ1Qgc3Vic2VnLCBzYXZlX3N1YnNlZzsKLSAgaW50IGksIHJlbG9jOwotICBjaGFyIGMsICpwOwotCi0gIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChzdGRvdXRwdXQpLT5iaXRzX3Blcl9hZGRyZXNzID09IDMyKQotICAgIHJlbG9jID0gUl9QQVJJU0NfRElSMzI7Ci0gIGVsc2UKLSAgICByZWxvYyA9IFJfUEFSSVNDX1NFR1JFTDMyOwotCi0gIC8qIEdldCBpbnRvIHRoZSByaWdodCBzZWcvc3Vic2VnLiAgVGhpcyBtYXkgaW52b2x2ZSBjcmVhdGluZwotICAgICB0aGUgc2VnIHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICBNYWtlIHN1cmUgdG8gaGF2ZSB0aGUKLSAgICAgb2xkIHNlZy9zdWJzZWcgc28gdGhhdCB3ZSBjYW4gcmVzZXQgdGhpbmdzIHdoZW4gd2UgYXJlIGRvbmUuICAqLwotICBzZWcgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LCBVTldJTkRfU0VDVElPTl9OQU1FKTsKLSAgaWYgKHNlZyA9PSBBU0VDX05VTEwpCi0gICAgewotICAgICAgc2VnID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIFVOV0lORF9TRUNUSU9OX05BTUUpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX0hBU19DT05URU5UUwotCQkJICAgICB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0FMTE9DIHwgU0VDX0RBVEEpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIDIpOwotICAgIH0KLQotICBzYXZlX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgc3Vic2VnX3NldCAoc2VnLCAwKTsKLQotCi0gIC8qIEdldCBzb21lIHNwYWNlIHRvIGhvbGQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHVud2luZAotICAgICBkZXNjcmlwdG9yLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgMCwgNCk7Ci0KLSAgLyogUmVsb2NhdGlvbiBpbmZvLiBmb3Igc3RhcnQgb2Zmc2V0IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgcmVsb2MsCi0JCWVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDAsIDQpOwotCi0gIC8qIFJlbG9jYXRpb24gaW5mby4gZm9yIGVuZCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uLgotCi0gICAgIEJlY2F1c2Ugd2UgYWxsb3cgcmVkdWN0aW9ucyBvZiAzMmJpdCByZWxvY2F0aW9ucyBmb3IgRUxGLCB0aGlzIHdpbGwgYmUKLSAgICAgcmVkdWNlZCB0byBzZWN0aW9uX3N5bSArIG9mZnNldCB3aGljaCBhdm9pZHMgcHV0dGluZyB0aGUgdGVtcG9yYXJ5Ci0gICAgIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBJdCAoc2hvdWxkKSBlbmQgdXAgZ2l2aW5nIHRoZSBzYW1lCi0gICAgIHZhbHVlIGFzIGNhbGxfaW5mby0+c3RhcnRfc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBvbmNlIHRoZSBsaW5rZXIgaXMKLSAgICAgZmluaXNoZWQgd2l0aCBpdHMgd29yay4gICovCi0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQljYWxsX2luZm8tPmVuZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgcmVsb2MsCi0JCWVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIC8qIER1bXAgaXQuICovCi0gIHVud2luZCA9IChjaGFyICopICZjYWxsX2luZm8tPmNpX3Vud2luZDsKLSAgZm9yIChpID0gODsgaSA8IHNpemVvZiAoc3RydWN0IHVud2luZF90YWJsZSk7IGkrKykKLSAgICB7Ci0gICAgICBjID0gKih1bndpbmQgKyBpKTsKLSAgICAgIHsKLQlGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotICAgICAgfQotICAgIH0KLQotICAvKiBSZXR1cm4gYmFjayB0byB0aGUgb3JpZ2luYWwgc2VnbWVudC9zdWJzZWdtZW50LiAgKi8KLSAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKLX0KLSNlbmRpZgotCi0vKiBQcm9jZXNzIGEgLkNBTExJTkZPIHBzZXVkby1vcC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBsYXRlcgotICAgdG8gYnVpbGQgdW53aW5kIGRlc2NyaXB0b3JzIGFuZCBtYXliZSBvbmUgZGF5IHRvIHN1cHBvcnQKLSAgIC5FTlRFUiBhbmQgLkxFQVZFLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NhbGxpbmZvICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBpbnQgdGVtcDsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICAvKiAuQ0FMTElORk8gbXVzdCBhcHBlYXIgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uICAqLwotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCIuY2FsbGluZm8gaXMgbm90IHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uIikpOwotCi0gIC8qIE1hcmsgdGhlIGZhY3QgdGhhdCB3ZSBmb3VuZCB0aGUgLkNBTExJTkZPIGZvciB0aGUKLSAgICAgY3VycmVudCBwcm9jZWR1cmUuICAqLwotICBjYWxsaW5mb19mb3VuZCA9IFRSVUU7Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIHRoZSAuQ0FMTElORk8gYXJndW1lbnRzLiAgKi8KLSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAvKiBGcmFtZSBzaXplIHNwZWNpZmljYXRpb24uICAqLwotICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImZyYW1lIiwgNSkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKCh0ZW1wICYgMHgzKSAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJGUkFNRSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDg6ICVkXG4iKSwgdGVtcCk7Ci0JICAgICAgdGVtcCA9IDA7Ci0JICAgIH0KLQotCSAgLyogY2FsbGluZm8gaXMgaW4gYnl0ZXMgYW5kIHVud2luZF9kZXNjIGlzIGluIDggYnl0ZSB1bml0cy4gICovCi0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZnJhbWVfc2l6ZSA9IHRlbXAgLyA4OwotCi0JfQotICAgICAgLyogRW50cnkgcmVnaXN0ZXIgKEdSLCBHUiBhbmQgU1IpIHNwZWNpZmljYXRpb25zLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X2dyIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgLyogVGhlIEhQIGFzc2VtYmxlciBhY2NlcHRzIDE5IGFzIHRoZSBoaWdoIGJvdW5kIGZvciBFTlRSWV9HUgotCSAgICAgZXZlbiB0aG91Z2ggJXIxOSBpcyBjYWxsZXIgc2F2ZWQuICBJIHRoaW5rIHRoaXMgaXMgYSBidWcgaW4KLQkgICAgIHRoZSBIUCBhc3NlbWJsZXIsIGFuZCB3ZSBhcmUgbm90IGdvaW5nIHRvIGVtdWxhdGUgaXQuICAqLwotCSAgaWYgKHRlbXAgPCAzIHx8IHRlbXAgPiAxOCkKLQkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfR1IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMy4uMThcbiIpKTsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5lbnRyeV9nciA9IHRlbXAgLSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X2ZyIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgLyogU2ltaWxhcmx5IHRoZSBIUCBhc3NlbWJsZXIgdGFrZXMgMzEgYXMgdGhlIGhpZ2ggYm91bmQgZXZlbgotCSAgICAgdGhvdWdoICVmcjIxIGlzIHRoZSBsYXN0IGNhbGxlZSBzYXZlZCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0JICBpZiAodGVtcCA8IDEyIHx8IHRlbXAgPiAyMSkKLQkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfRlIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMTIuLjIxXG4iKSk7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZW50cnlfZnIgPSB0ZW1wIC0gMTE7Ci0JfQotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZW50cnlfc3IiLCA4KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAodGVtcCAhPSAzKQotCSAgICBhc19iYWQgKF8oIlZhbHVlIGZvciBFTlRSWV9TUiBtdXN0IGJlIDNcbiIpKTsKLQl9Ci0gICAgICAvKiBOb3RlIHdoZXRoZXIgb3Igbm90IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYW55IGNhbGxzLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNhbGxzIiwgNSkgPT0gMCkgfHwKLQkgICAgICAgKHN0cm5jYXNlY21wIChuYW1lLCAiY2FsbGVyIiwgNikgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJub19jYWxscyIsIDgpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JfQotICAgICAgLyogU2hvdWxkIFJQIGJlIHNhdmVkIGludG8gdGhlIHN0YWNrLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNhdmVfcnAiLCA3KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLnNhdmVfcnAgPSAxOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciBTUC4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzYXZlX3NwIiwgNykgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5zYXZlX3NwID0gMTsKLQl9Ci0gICAgICAvKiBJcyB0aGlzIGFuIHVud2luZGFibGUgcHJvY2VkdXJlLiAgSWYgc28gbWFyayBpdCBzbwotICAgICAgICAgaW4gdGhlIHVud2luZCBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm5vX3Vud2luZCIsIDkpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuY2Fubm90X3Vud2luZCA9IDE7Ci0JfQotICAgICAgLyogSXMgdGhpcyBhbiBpbnRlcnJ1cHQgcm91dGluZS4gIElmIHNvIG1hcmsgaXQgaW4gdGhlCi0gICAgICAgICB1bndpbmQgZGVzY3JpcHRvci4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJocHV4X2ludCIsIDcpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuaHB1eF9pbnRlcnJ1cHRfbWFya2VyID0gMTsKLQl9Ci0gICAgICAvKiBJcyB0aGlzIGEgbWlsbGljb2RlIHJvdXRpbmUuICAibWlsbGljb2RlIiBpc24ndCBpbiBteQotCSBhc3NlbWJsZXIgbWFudWFsLCBidXQgbXkgY29weSBpcyBvbGQuICBUaGUgSFAgYXNzZW1ibGVyCi0JIGFjY2VwdHMgaXQsIGFuZCB0aGVyZSdzIGEgcGxhY2UgaW4gdGhlIHVud2luZCBkZXNjcmlwdG9yCi0JIHRvIGRyb3AgdGhlIGluZm9ybWF0aW9uLCBzbyB3ZSdsbCBhY2NlcHQgaXQgdG9vLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm1pbGxpY29kZSIsIDkpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IubWlsbGljb2RlID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5DQUxMSU5GTyBhcmd1bWVudDogJXMiKSwgbmFtZSk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFN3aXRjaCBpbnRvIHRoZSBjb2RlIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvZGUgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIGN1cnJlbnRfc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlICgiJFRFWFQkIik7Ci0gIGN1cnJlbnRfc3Vic3BhY2UKLSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGN1cnJlbnRfc3BhY2UtPnNkX3NlZywgMCk7Ci0jZW5kaWYKLSAgc190ZXh0ICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHN0YW5kYXJkIEdBUyBzX2NvbW0oKS4gT24gSFA5MDAwLzgwMCBtYWNoaW5lcywKLSAgIHRoZSAuY29tbSBwc2V1ZG8tb3AgaGFzIHRoZSBmb2xsb3dpbmcgc3ltdGF4OgotCi0gICA8bGFiZWw+IC5jb21tIDxsZW5ndGg+Ci0KLSAgIHdoZXJlIDxsYWJlbD4gaXMgb3B0aW9uYWwgYW5kIGlzIGEgc3ltYm9sIHdob3NlIGFkZHJlc3Mgd2lsbCBiZSB0aGUgc3RhcnQgb2YKLSAgIGEgYmxvY2sgb2YgbWVtb3J5IDxsZW5ndGg+IGJ5dGVzIGxvbmcuIDxsZW5ndGg+IG11c3QgYmUgYW4gYWJzb2x1dGUKLSAgIGV4cHJlc3Npb24uICA8bGVuZ3RoPiBieXRlcyB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGUgY3VycmVudCBzcGFjZQotICAgYW5kIHN1YnNwYWNlLgotCi0gICBBbHNvIG5vdGUgdGhlIGxhYmVsIG1heSBub3QgZXZlbiBiZSBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSAuY29tbS4KLQotICAgVGhpcyBkaWZmZXJlbmNlIGluIHN5bnRheCBtZWFucyB0aGUgY29sb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLSAgIG9uIHRoZSBzeW1ib2wgYmVmb3JlIHdlIGFycml2ZSBpbiBwYV9jb21tLiAgY29sb24gd2lsbCBzZXQgYSBudW1iZXIKLSAgIG9mIGF0dHJpYnV0ZXMgb2YgdGhlIHN5bWJvbCB0aGF0IG5lZWQgdG8gYmUgZml4ZWQgaGVyZS4gIEluIHBhcnRpY3VsYXIKLSAgIHRoZSB2YWx1ZSwgc2VjdGlvbiBwb2ludGVyLCBmcmFnbWVudCBwb2ludGVyLCBmbGFncywgZXRjLiAgV2hhdAotICAgYSBwYWluLgotCi0gICBUaGlzIGFsc28gbWFrZXMgZXJyb3IgZGV0ZWN0aW9uIGFsbCBidXQgaW1wb3NzaWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jb21tICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzeW1ib2xTICpzeW1ib2w7Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKLQotICBpZiAobGFiZWxfc3ltYm9sKQotICAgIHN5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotICBlbHNlCi0gICAgc3ltYm9sID0gTlVMTDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBpZiAoc3ltYm9sKQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2wsIHNpemUpOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sLCBiZmRfdW5kX3NlY3Rpb25fcHRyKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2wpOwotCi0gICAgICAvKiBjb2xvbigpIGhhcyBhbHJlYWR5IHNldCB0aGUgZnJhZyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUKLSAgICAgICAgIGN1cnJlbnQgc3Vic3BhY2U7IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGZyYWdtZW50IHRvIHRoZSB6ZXJvIGFkZHJlc3MKLSAgICAgICAgIGZyYWdtZW50LiAgV2UgYWxzbyBuZWVkIHRvIHJlc2V0IHRoZSBzZWdtZW50IHBvaW50ZXIuICAqLwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2wsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIGEgLkVORCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZW5kICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgYSAuRU5URVIgcHNldWRvLW9wLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAgKi8KLXN0YXRpYyB2b2lkCi1wYV9lbnRlciAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBhc19iYWQgKF8oIlRoZSAuRU5URVIgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgYSAuRU5UUlkgcHNldWRvLW9wLiAgLkVOVFJZIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBwcm9jZXN1cmUuICAqLwotc3RhdGljIHZvaWQKLXBhX2VudHJ5ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIGlmICghd2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19iYWQgKF8oIk1pc3BsYWNlZCAuZW50cnkuIElnbm9yZWQuIikpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCFjYWxsaW5mb19mb3VuZCkKLQlhc19iYWQgKF8oIk1pc3NpbmcgLmNhbGxpbmZvLiIpKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHdpdGhpbl9lbnRyeV9leGl0ID0gVFJVRTsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogU09NIGRlZmVycyBidWlsZGluZyBvZiB1bndpbmQgZGVzY3JpcHRvcnMgdW50aWwgdGhlIGxpbmsgcGhhc2UuCi0gICAgIFRoZSBhc3NlbWJsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIFJfRU5UUlkgcmVsb2NhdGlvbgotICAgICB0byBtYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSByZWdpb24gYW5kIGhvbGQgdGhlIHVud2luZCBiaXRzLCBhbmQKLSAgICAgZm9yIGNyZWF0aW5nIGFuIFJfRVhJVCByZWxvY2F0aW9uIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgcmVnaW9uLgotCi0gICAgIEZJWE1FLiAgRUxGIHNob3VsZCBiZSB1c2luZyB0aGUgc2FtZSBjb252ZW50aW9ucyEgIFRoZSBwcm9ibGVtCi0gICAgIGlzIGFuIHVud2luZCByZXF1aXJlcyB0b28gbXVjaCByZWxvY2F0aW9uIHNwYWNlLiAgSG1tbS4gIE1heWJlCi0gICAgIGlmIHdlIHNwbGl0IHRoZSB1bndpbmQgYml0cyB1cCBiZXR3ZWVuIHRoZSByZWxvY2F0aW9ucyB3aGljaAotICAgICBkZW5vdGUgdGhlIGVudHJ5IGFuZCBleGl0IHBvaW50cy4gICovCi0gIGlmIChsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0gICAgICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQkgICAgTlVMTCwgKG9mZnNldFQpIDAsIE5VTEwsCi0JCSAgICAwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKLQkJICAgIChpbnQgKikgJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLS8qIEhhbmRsZSBhIC5FUVUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2VxdSAocmVnKQotICAgICBpbnQgcmVnOwotewotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICBpZiAobGFiZWxfc3ltYm9sKQotICAgIHsKLSAgICAgIHN5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotICAgICAgaWYgKHJlZykKLQlTX1NFVF9WQUxVRSAoc3ltYm9sLCBwYV9wYXJzZV9udW1iZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIsIDApKTsKLSAgICAgIGVsc2UKLQlTX1NFVF9WQUxVRSAoc3ltYm9sLCAodW5zaWduZWQgaW50KSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2wsIGJmZF9hYnNfc2VjdGlvbl9wdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChyZWcpCi0JYXNfYmFkIChfKCIuUkVHIG11c3QgdXNlIGEgbGFiZWwiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCIuRVFVIG11c3QgdXNlIGEgbGFiZWwiKSk7Ci0gICAgfQotCi0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIZWxwZXIgZnVuY3Rpb24uICBEb2VzIHByb2Nlc3NpbmcgZm9yIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4gIFRoaXMKLSAgIHVzdWFsbHkgaW52b2x2ZXMgY3JlYXRpbmcgc29tZSByZWxvY2F0aW9ucyBvciBidWlsZGluZyBzcGVjaWFsCi0gICBzeW1ib2xzIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19leGl0ICgpCi17Ci0gIGNoYXIgKndoZXJlOwotCi0gIHdoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogTWFyayB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgc3R1ZmYgYXdheSB0aGUgbG9jYXRpb24gb2YgdGhlIGZyYWcKLSAgICAgZm9yIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBhbmQgZmluYWxseSBjYWxsIHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZQotICAgICB0byBhZGQgYW4gZW50cnkgaW4gdGhlIHVud2luZCB0YWJsZS4gICovCi0gIGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uICgpOwotICBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UgKGxhc3RfY2FsbF9pbmZvKTsKLSNlbHNlCi0gIC8qIFNPTSBkZWZlcnMgYnVpbGRpbmcgb2YgdW53aW5kIGRlc2NyaXB0b3JzIHVudGlsIHRoZSBsaW5rIHBoYXNlLgotICAgICBUaGUgYXNzZW1ibGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbiBSX0VOVFJZIHJlbG9jYXRpb24KLSAgICAgdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcmVnaW9uIGFuZCBob2xkIHRoZSB1bndpbmQgYml0cywgYW5kCi0gICAgIGZvciBjcmVhdGluZyBhbiBSX0VYSVQgcmVsb2NhdGlvbiB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbi4KLQotICAgICBGSVhNRS4gIEVMRiBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUgY29udmVudGlvbnMhICBUaGUgcHJvYmxlbQotICAgICBpcyBhbiB1bndpbmQgcmVxdWlyZXMgdG9vIG11Y2ggcmVsb2NhdGlvbiBzcGFjZS4gIEhtbW0uICBNYXliZQotICAgICBpZiB3ZSBzcGxpdCB0aGUgdW53aW5kIGJpdHMgdXAgYmV0d2VlbiB0aGUgcmVsb2NhdGlvbnMgd2hpY2gKLSAgICAgZGVub3RlIHRoZSBlbnRyeSBhbmQgZXhpdCBwb2ludHMuICAqLwotICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQlOVUxMLCAob2Zmc2V0VCkgMCwKLQkJTlVMTCwgMCwgUl9IUFBBX0VYSVQsIGVfZnNlbCwgMCwgMCwKLQkJKGludCAqKSAmbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yICsgMSk7Ci0jZW5kaWYKLX0KLQotLyogUHJvY2VzcyBhIC5FWElUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9leGl0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIGlmICghd2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19iYWQgKF8oIi5FWElUIG11c3QgYXBwZWFyIHdpdGhpbiBhIHByb2NlZHVyZSIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghY2FsbGluZm9fZm91bmQpCi0JYXNfYmFkIChfKCJNaXNzaW5nIC5jYWxsaW5mbyIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIXdpdGhpbl9lbnRyeV9leGl0KQotCSAgICBhc19iYWQgKF8oIk5vIC5FTlRSWSBmb3IgdGhpcyAuRVhJVCIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdpdGhpbl9lbnRyeV9leGl0ID0gRkFMU0U7Ci0JICAgICAgcHJvY2Vzc19leGl0ICgpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyBhIC5FWFBPUlQgZGlyZWN0aXZlLiAgVGhpcyBtYWtlcyBmdW5jdGlvbnMgZXh0ZXJuYWwKLSAgIGFuZCBwcm92aWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGFyZ3VtZW50IHJlbG9jYXRpb24gZW50cmllcwotICAgdG8gY2FsbGVycy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9leHBvcnQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIE1ha2Ugc3VyZSB0aGUgZ2l2ZW4gc3ltYm9sIGV4aXN0cy4gICovCi0gIGlmICgoc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgZGVmaW5lIGV4cG9ydCBzeW1ib2w6ICVzXG4iKSwgbmFtZSk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT0suICBTZXQgdGhlIGV4dGVybmFsIGJpdHMgYW5kIHByb2Nlc3MgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbCk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgcGFfdHlwZV9hcmdzIChzeW1ib2wsIDEpOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGVscGVyIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYXJndW1lbnRzIHRvIGEgLkVYUE9SVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdHlwZV9hcmdzIChzeW1ib2xQLCBpc19leHBvcnQpCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIGludCBpc19leHBvcnQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICB1bnNpZ25lZCBpbnQgdGVtcCwgYXJnX3JlbG9jOwotICBwYV9zeW1ib2xfdHlwZSB0eXBlID0gU1lNQk9MX1RZUEVfVU5LTk9XTjsKLSAgb2JqX3N5bWJvbF90eXBlICpzeW1ib2wgPSAob2JqX3N5bWJvbF90eXBlICopIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKTsKLQotICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImFic29sdXRlIiwgOCkgPT0gMCkKLQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA4OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2Fic19zZWN0aW9uX3B0cik7Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfQUJTT0xVVEU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiY29kZSIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICAvKiBJTVBPUlRpbmcvRVhQT1JUaW5nIENPREUgdHlwZXMgZm9yIGZ1bmN0aW9ucyBpcyBtZWFuaW5nbGVzcyBmb3IgU09NLAotICAgICAgICAgaW5zdGVhZCBvbmUgc2hvdWxkIGJlIElNUE9SVGluZy9FWFBPUlRpbmcgRU5UUlkgdHlwZXMuCi0KLSAgICAgICAgIENvbXBsYWluIGlmIG9uZSB0cmllcyB0byBFWFBPUlQgYSBDT0RFIHR5cGUgc2luY2UgdGhhdCdzIG5ldmVyCi0gICAgICAgICBkb25lLiAgQm90aCBHQ0MgYW5kIEhQIEMgc3RpbGwgdHJ5IHRvIElNUE9SVCBDT0RFIHR5cGVzLCBzbwotICAgICAgICAgc2lsZW50bHkgZml4IHRoZW0gdG8gYmUgRU5UUlkgdHlwZXMuICAqLwotICAgICAgaWYgKFNfSVNfRlVOQ1RJT04gKHN5bWJvbFApKQotCXsKLQkgIGlmIChpc19leHBvcnQpCi0JICAgIGFzX3Rza3RzayAoXygiVXNpbmcgRU5UUlkgcmF0aGVyIHRoYW4gQ09ERSBpbiBleHBvcnQgZGlyZWN0aXZlIGZvciAlcyIpLAotCQkgICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgIHR5cGUgPSBTWU1CT0xfVFlQRV9FTlRSWTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotCSAgdHlwZSA9IFNZTUJPTF9UWVBFX0NPREU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGEiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX0RBVEE7Ci0gICAgfQotICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImVudHJ5IiwgNSkgPT0gMCkpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9FTlRSWTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJtaWxsaWNvZGUiLCA5KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA5OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfTUlMTElDT0RFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInBsYWJlbCIsIDYpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfUExBQkVMOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInByaV9wcm9nIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gODsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1BSSV9QUk9HOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNlY19wcm9nIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gODsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1NFQ19QUk9HOwotICAgIH0KLQotICAvKiBTT00gcmVxdWlyZXMgbXVjaCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCB0eXBlcwotICAgICB0aGFuIEJGRCB1bmRlcnN0YW5kcy4gIFRoaXMgaXMgaG93IHdlIGdldCB0aGlzIGluZm9ybWF0aW9uCi0gICAgIHRvIHRoZSBTT00gQkZEIGJhY2tlbmQuICAqLwotI2lmZGVmIG9ial9zZXRfc3ltYm9sX3R5cGUKLSAgb2JqX3NldF9zeW1ib2xfdHlwZSAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLCAoaW50KSB0eXBlKTsKLSNlbmRpZgotCi0gIC8qIE5vdyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBleHBvcnRlZCBzeW1ib2wgaGFzIGJlZW4gaGFuZGxlZCwKLSAgICAgaGFuZGxlIGFueSBhcmd1bWVudCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAvKiBBcmd1bWVudCBzb3VyY2VzLiAgKi8KLSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhcmd3IiwgNCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGF0b2kgKG5hbWUgKyA0KTsKLQkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBhcmdfcmVsb2MgPSBwYV9hbGlnbl9hcmdfcmVsb2MgKHRlbXAsIHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSkpOwotI2lmZGVmIE9CSl9TT00KLQkgIHN5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyB8PSBhcmdfcmVsb2M7Ci0jZW5kaWYKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIC8qIFRoZSByZXR1cm4gdmFsdWUuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicnRudmFsIiwgNikpID09IDApCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGFyZ19yZWxvYyA9IHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSk7Ci0jaWZkZWYgT0JKX1NPTQotCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jIHw9IGFyZ19yZWxvYzsKLSNlbmRpZgotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgLyogUHJpdmVsZWdlIGxldmVsLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInByaXZfbGV2IiwgOCkpID09IDApCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGF0b2kgKGlucHV0X2xpbmVfcG9pbnRlcik7Ci0jaWZkZWYgT0JKX1NPTQotCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9IHRlbXA7Ci0jZW5kaWYKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIlVuZGVmaW5lZCAuRVhQT1JULy5JTVBPUlQgYXJndW1lbnQgKGlnbm9yZWQpOiAlcyIpLCBuYW1lKTsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JfQotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLX0KLQotLyogSGFuZGxlIGFuIC5JTVBPUlQgcHNldWRvLW9wLiAgQW55IHN5bWJvbCByZWZlcmVuY2VkIGluIGEgZ2l2ZW4KLSAgIGFzc2VtYmx5IGZpbGUgbXVzdCBlaXRoZXIgYmUgZGVmaW5lZCBpbiB0aGUgYXNzZW1ibHkgZmlsZSwgb3IKLSAgIGV4cGxpY2l0bHkgSU1QT1JURUQgZnJvbSBhbm90aGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2ltcG9ydCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW1ib2wgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gIC8qIFVnaC4gIFdlIG1pZ2h0IGJlIGltcG9ydGluZyBhIHN5bWJvbCBkZWZpbmVkIGVhcmxpZXIgaW4gdGhlIGZpbGUsCi0gICAgIGluIHdoaWNoIGNhc2UgYWxsIHRoZSBjb2RlIGJlbG93IHdpbGwgcmVhbGx5IHNjcmV3IHRoaW5ncyB1cAotICAgICAoc2V0IHRoZSB3cm9uZyBzZWdtZW50LCBzeW1ib2wgZmxhZ3MgJiB0eXBlLCBldGMpLiAgKi8KLSAgaWYgKHN5bWJvbCA9PSBOVUxMIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbCkpCi0gICAgewotICAgICAgc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotCi0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBwYV90eXBlX2FyZ3MgKHN5bWJvbCwgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNpZ2guICBUbyBiZSBjb21wYXRhYmxlIHdpdGggdGhlIEhQIGFzc2VtYmxlciBhbmQgdG8gaGVscAotCSAgICAgcG9vcmx5IHdyaXR0ZW4gYXNzZW1ibHkgY29kZSwgd2UgYXNzaWduIGEgdHlwZSBiYXNlZCBvbgotCSAgICAgdGhlIHRoZSBjdXJyZW50IHNlZ21lbnQuICBOb3RlIG9ubHkgQlNGX0ZVTkNUSU9OIHJlYWxseQotCSAgICAgbWF0dGVycywgd2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBmdWxsIFNZTUJPTF9UWVBFXyogaW5mby4gICovCi0JICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2wpLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLQkgIC8qIElmIHRoZSBzZWN0aW9uIGlzIHVuZGVmaW5lZCwgdGhlbiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZAotCSAgICAgU2luY2UgdGhpcyBpcyBhbiBpbXBvcnQsIGxlYXZlIHRoZSBzZWN0aW9uIHVuZGVmaW5lZC4gICovCi0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2wsIGJmZF91bmRfc2VjdGlvbl9wdHIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIHdhcyBhbHJlYWR5IGRlZmluZWQuICBKdXN0IGVhdCBldmVyeXRoaW5nIHVwIHRvCi0JIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3RhdGVtZW50LiAgKi8KLSAgICAgIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLkxBQkVMIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sYWJlbCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKHN0cmxlbiAobmFtZSkgPiAwKQotICAgIHsKLSAgICAgIGNvbG9uIChuYW1lKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBsYWJlbCBuYW1lIG9uIC5MQUJFTCIpKTsKLSAgICB9Ci0KLSAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oImV4dHJhIC5MQUJFTCBhcmd1bWVudHMgaWdub3JlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLkxFQVZFIHBzZXVkby1vcC4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbGVhdmUgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgYXNfYmFkIChfKCJUaGUgLkxFQVZFIHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuTEVWRUwgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xldmVsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKmxldmVsOwotCi0gIGxldmVsID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoc3RybmNtcCAobGV2ZWwsICIxLjAiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAxMCkpCi0JYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChsZXZlbCwgIjEuMSIsIDMpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDExKSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGxldmVsLCAiMi4wdyIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDI1KSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGxldmVsLCAiMi4wIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMjApKQotCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIC5MRVZFTCBhcmd1bWVudFxuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5PUklHSU4gcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX29yaWdpbiAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzX29yZyAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBIYW5kbGUgYSAuUEFSQU0gcHNldWRvLW9wLiAgVGhpcyBpcyBtdWNoIGxpa2UgYSAuRVhQT1JULCBleGNlcHQgaXQKLSAgIGlzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgRklYTUUuICBTaG91bGQgc2hhcmUgbW9yZSBjb2RlIHdpdGggLkVYUE9SVC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9wYXJhbSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoKHN5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IGRlZmluZSBzdGF0aWMgc3ltYm9sOiAlc1xuIiksIG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbCk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgcGFfdHlwZV9hcmdzIChzeW1ib2wsIDApOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLlBST0MgcHNldWRvLW9wLiAgSXQgaXMgdXNlZCB0byBtYXJrIHRoZSBiZWdpbm5pbmcKLSAgIG9mIGEgcHJvY2VkdXJlIGZyb20gYSBzeW50YXRpY2FsIHBvaW50IG9mIHZpZXcuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfcHJvYyAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm87Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfZmF0YWwgKF8oIk5lc3RlZCBwcm9jZWR1cmVzIikpOwotCi0gIC8qIFJlc2V0IGdsb2JhbCB2YXJpYWJsZXMgZm9yIG5ldyBwcm9jZWR1cmUuICAqLwotICBjYWxsaW5mb19mb3VuZCA9IEZBTFNFOwotICB3aXRoaW5fcHJvY2VkdXJlID0gVFJVRTsKLQotICAvKiBDcmVhdGUgYW5vdGhlciBjYWxsX2luZm8gc3RydWN0dXJlLiAgKi8KLSAgY2FsbF9pbmZvID0gKHN0cnVjdCBjYWxsX2luZm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY2FsbF9pbmZvKSk7Ci0KLSAgaWYgKCFjYWxsX2luZm8pCi0gICAgYXNfZmF0YWwgKF8oIkNhbm5vdCBhbGxvY2F0ZSB1bndpbmQgZGVzY3JpcHRvclxuIikpOwotCi0gIG1lbXNldCAoY2FsbF9pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCBjYWxsX2luZm8pKTsKLQotICBjYWxsX2luZm8tPmNpX25leHQgPSBOVUxMOwotCi0gIGlmIChjYWxsX2luZm9fcm9vdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNhbGxfaW5mb19yb290ID0gY2FsbF9pbmZvOwotICAgICAgbGFzdF9jYWxsX2luZm8gPSBjYWxsX2luZm87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGFzdF9jYWxsX2luZm8tPmNpX25leHQgPSBjYWxsX2luZm87Ci0gICAgICBsYXN0X2NhbGxfaW5mbyA9IGNhbGxfaW5mbzsKLSAgICB9Ci0KLSAgLyogc2V0IHVwIGRlZmF1bHRzIG9uIGNhbGxfaW5mbyBzdHJ1Y3R1cmUgKi8KLQotICBjYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmNhbm5vdF91bndpbmQgPSAwOwotICBjYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLnJlZ2lvbl9kZXNjID0gMTsKLSAgY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5ocHV4X2ludGVycnVwdF9tYXJrZXIgPSAwOwotCi0gIC8qIElmIHdlIGdvdCBhIC5QUk9DIHBzZXVkby1vcCwgd2Uga25vdyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkCi0gICAgIGxvY2FsbHkuICBNYWtlIHN1cmUgaXQgZ2V0cyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICB7Ci0gICAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gICAgaWYgKGxhYmVsX3N5bWJvbCkKLSAgICAgIHsKLQlpZiAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpCi0JICB7Ci0JICAgIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLQkgICAgc3ltYm9sX2dldF9iZmRzeW0gKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgfQotCWVsc2UKLQkgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID0gTlVMTDsKLSAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgdGhlIHN5bnRhdGljYWwgZW5kIG9mIGEgcHJvY2VkdXJlLiAgTWFrZSBzdXJlIGFsbCB0aGUKLSAgIGFwcHJvcHJpYXRlIHBzZXVkby1vcHMgd2VyZSBmb3VuZCB3aXRoaW4gdGhlIHByb2NlZHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9wcm9jZW5kICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgLyogSWYgd2UgYXJlIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLCBtYWtlIHN1cmUgd2UndmUKLSAgICAgZGVmaW5lZCBhIGxhYmVsIGZvciB0aGUgcHJvY2VkdXJlOyBoYW5kbGUgY2FzZSB3aGVyZSB0aGUKLSAgICAgbGFiZWwgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotICAgICBOb3RlIHRoZXJlJ3Mgbm90IG5lZWQgdG8gZGlkZGxlIHdpdGggdGhlIHNlZ21lbnQgb3IgZnJhZ21lbnQKLSAgICAgZm9yIHRoZSBsYWJlbCBzeW1ib2wgaW4gdGhpcyBjYXNlLiAgV2UgaGF2ZSBhbHJlYWR5IHN3aXRjaGVkCi0gICAgIGludG8gdGhlIG5ldyAkQ09ERSQgc3Vic3BhY2UgYXQgdGhpcyBwb2ludC4gICovCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlICYmIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICAgIGlmIChsYWJlbF9zeW1ib2wpCi0JewotCSAgaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQotCSAgICB7Ci0JICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCktPmZsYWdzCi0JCXw9IEJTRl9GVU5DVElPTjsKLSNpZmRlZiBPQkpfU09NCi0JICAgICAgLyogQWxzbyBoYW5kbGUgYWxsb2NhdGlvbiBvZiBhIGZpeHVwIHRvIGhvbGQgdGhlIHVud2luZAotCQkgaW5mb3JtYXRpb24gd2hlbiB0aGUgbGFiZWwgYXBwZWFycyBhZnRlciB0aGUgcHJvYy9wcm9jZW5kLiAgKi8KLQkgICAgICBpZiAod2l0aGluX2VudHJ5X2V4aXQpCi0JCXsKLQkJICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLQkJICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQkJCU5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAotCQkJCTAsIFJfSFBQQV9FTlRSWSwgZV9mc2VsLCAwLCAwLAotCQkJCShpbnQgKikgJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7Ci0JCX0KLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIikpOwotICAgIH0KLQotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCJtaXNwbGFjZWQgLnByb2NlbmQiKSk7Ci0KLSAgaWYgKCFjYWxsaW5mb19mb3VuZCkKLSAgICBhc19iYWQgKF8oIk1pc3NpbmcgLmNhbGxpbmZvIGZvciB0aGlzIHByb2NlZHVyZSIpKTsKLQotICBpZiAod2l0aGluX2VudHJ5X2V4aXQpCi0gICAgYXNfYmFkIChfKCJNaXNzaW5nIC5FWElUIGZvciBhIC5FTlRSWSIpKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogRUxGIG5lZWRzIHRvIG1hcmsgdGhlIGVuZCBvZiBlYWNoIGZ1bmN0aW9uIHNvIHRoYXQgaXQgY2FuIGNvbXB1dGUKLSAgICAgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uIChhcHBhcmVudGx5IGl0cyBuZWVkZWQgaW4gdGhlIHN5bWJvbCB0YWJsZSkuICAqLwotICBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiAoKTsKLSNlbmRpZgotCi0gIHdpdGhpbl9wcm9jZWR1cmUgPSBGQUxTRTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIElmIFZBTFVFIGlzIGFuIGV4YWN0IHBvd2VyIG9mIHR3byBiZXR3ZWVuIHplcm8gYW5kIDJeMzEsIHRoZW4KLSAgIHJldHVybiBsb2cyIChWQUxVRSkuICBFbHNlIHJldHVybiAtMS4gICovCi0KLXN0YXRpYyBpbnQKLWxvZzIgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGludCBzaGlmdCA9IDA7Ci0KLSAgd2hpbGUgKCgxIDw8IHNoaWZ0KSAhPSB2YWx1ZSAmJiBzaGlmdCA8IDMyKQotICAgIHNoaWZ0Kys7Ci0KLSAgaWYgKHNoaWZ0ID49IDMyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZQotICAgIHJldHVybiBzaGlmdDsKLX0KLQotCi0jaWZkZWYgT0JKX1NPTQotLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCkKLXsKLSAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTm90IGluIGEgc3BhY2UuXG4iKSk7Ci0KLSAgaWYgKGN1cnJlbnRfc3Vic3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTm90IGluIGEgc3Vic3BhY2UuXG4iKSk7Ci19Ci0KLS8qIFBhcnNlIHRoZSBwYXJhbWV0ZXJzIHRvIGEgLlNQQUNFIGRpcmVjdGl2ZTsgaWYgQ1JFQVRFX0ZMQUcgaXMgbm9uemVybywKLSAgIHRoZW4gY3JlYXRlIGEgbmV3IHNwYWNlIGVudHJ5IHRvIGhvbGQgdGhlIGluZm9ybWF0aW9uIHNwZWNpZmllZAotICAgYnkgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIC5TUEFDRSBkaXJlY3RpdmUuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLXBhX3BhcnNlX3NwYWNlX3N0bXQgKHNwYWNlX25hbWUsIGNyZWF0ZV9mbGFnKQotICAgICBjaGFyICpzcGFjZV9uYW1lOwotICAgICBpbnQgY3JlYXRlX2ZsYWc7Ci17Ci0gIGNoYXIgKm5hbWUsICpwdGVtcCwgYzsKLSAgY2hhciBsb2FkYWJsZSwgZGVmaW5lZCwgcHJpdmF0ZSwgc29ydDsKLSAgaW50IHNwbnVtLCB0ZW1wOwotICBhc2VjdGlvbiAqc2VnID0gTlVMTDsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLQotICAvKiBsb2FkIGRlZmF1bHQgdmFsdWVzICovCi0gIHNwbnVtID0gMDsKLSAgc29ydCA9IDA7Ci0gIGxvYWRhYmxlID0gVFJVRTsKLSAgZGVmaW5lZCA9IFRSVUU7Ci0gIHByaXZhdGUgPSBGQUxTRTsKLSAgaWYgKHN0cmNtcCAoc3BhY2VfbmFtZSwgIiRURVhUJCIpID09IDApCi0gICAgewotICAgICAgc2VnID0gcGFfZGVmX3NwYWNlc1swXS5zZWdtZW50OwotICAgICAgZGVmaW5lZCA9IHBhX2RlZl9zcGFjZXNbMF0uZGVmaW5lZDsKLSAgICAgIHByaXZhdGUgPSBwYV9kZWZfc3BhY2VzWzBdLnByaXZhdGU7Ci0gICAgICBzb3J0ID0gcGFfZGVmX3NwYWNlc1swXS5zb3J0OwotICAgICAgc3BudW0gPSBwYV9kZWZfc3BhY2VzWzBdLnNwbnVtOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzcGFjZV9uYW1lLCAiJFBSSVZBVEUkIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWcgPSBwYV9kZWZfc3BhY2VzWzFdLnNlZ21lbnQ7Ci0gICAgICBkZWZpbmVkID0gcGFfZGVmX3NwYWNlc1sxXS5kZWZpbmVkOwotICAgICAgcHJpdmF0ZSA9IHBhX2RlZl9zcGFjZXNbMV0ucHJpdmF0ZTsKLSAgICAgIHNvcnQgPSBwYV9kZWZfc3BhY2VzWzFdLnNvcnQ7Ci0gICAgICBzcG51bSA9IHBhX2RlZl9zcGFjZXNbMV0uc3BudW07Ci0gICAgfQotCi0gIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBwcmludF9lcnJvcnMgPSBGQUxTRTsKLSAgICAgIHB0ZW1wID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLSAgICAgIC8qIEZpcnN0IHNlZSBpZiB0aGUgc3BhY2Ugd2FzIHNwZWNpZmllZCBhcyBhIG51bWJlciByYXRoZXIgdGhhbgotICAgICAgICAgYXMgYSBuYW1lLiAgQWNjb3JkaW5nIHRvIHRoZSBQQSBhc3NlbWJseSBtYW51YWwgdGhlIHJlc3Qgb2YKLSAgICAgICAgIHRoZSBsaW5lIHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KLSAgICAgIHRlbXAgPSBwYV9wYXJzZV9udW1iZXIgKCZwdGVtcCwgMCk7Ci0gICAgICBpZiAodGVtcCA+PSAwKQotCXsKLQkgIHNwbnVtID0gdGVtcDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHB0ZW1wOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic3BudW0iLCA1KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHNwbnVtID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzb3J0IiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBzb3J0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJ1bmxvYWRhYmxlIiwgMTApID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgbG9hZGFibGUgPSBGQUxTRTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm5vdGRlZmluZWQiLCAxMCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBkZWZpbmVkID0gRkFMU0U7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJwcml2YXRlIiwgNykgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBwcml2YXRlID0gVFJVRTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZCAoXygiSW52YWxpZCAuU1BBQ0UgYXJndW1lbnQiKSk7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCQkgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHByaW50X2Vycm9ycyA9IFRSVUU7Ci0gICAgfQotCi0gIGlmIChjcmVhdGVfZmxhZyAmJiBzZWcgPT0gTlVMTCkKLSAgICBzZWcgPSBzdWJzZWdfbmV3IChzcGFjZV9uYW1lLCAwKTsKLQotICAvKiBJZiBjcmVhdGVfZmxhZyBpcyBub256ZXJvLCB0aGVuIGNyZWF0ZSB0aGUgbmV3IHNwYWNlIHdpdGgKLSAgICAgdGhlIGF0dHJpYnV0ZXMgY29tcHV0ZWQgYWJvdmUuICBFbHNlIHNldCB0aGUgdmFsdWVzIGluCi0gICAgIGFuIGFscmVhZHkgZXhpc3Rpbmcgc3BhY2UgLS0gdGhpcyBjYW4gb25seSBoYXBwZW4gZm9yCi0gICAgIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgYSBidWlsdC1pbiBzcGFjZS4gICovCi0gIGlmIChjcmVhdGVfZmxhZykKLSAgICBzcGFjZSA9IGNyZWF0ZV9uZXdfc3BhY2UgKHNwYWNlX25hbWUsIHNwbnVtLCBsb2FkYWJsZSwgZGVmaW5lZCwKLQkJCSAgICAgIHByaXZhdGUsIHNvcnQsIHNlZywgMSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKHNwYWNlX25hbWUpOwotICAgICAgU1BBQ0VfU1BOVU0gKHNwYWNlKSA9IHNwbnVtOwotICAgICAgU1BBQ0VfREVGSU5FRCAoc3BhY2UpID0gZGVmaW5lZCAmIDE7Ci0gICAgICBTUEFDRV9VU0VSX0RFRklORUQgKHNwYWNlKSA9IDE7Ci0gICAgfQotCi0jaWZkZWYgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMKLSAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNlZywgZGVmaW5lZCwgcHJpdmF0ZSwgc29ydCwgc3BudW0pOwotI2VuZGlmCi0KLSAgcmV0dXJuIHNwYWNlOwotfQotCi0vKiBIYW5kbGUgYSAuU1BBQ0UgcHNldWRvLW9wOyB0aGlzIHN3aXRjaGVzIHRoZSBjdXJyZW50IHNwYWNlIHRvIHRoZQotICAgZ2l2ZW4gc3BhY2UsIGNyZWF0aW5nIHRoZSBuZXcgc3BhY2UgaWYgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3NwYWNlICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpzcGFjZV9uYW1lLCAqc2F2ZV9zOwotICBpbnQgdGVtcDsKLSAgc2RfY2hhaW5fc3RydWN0ICpzZF9jaGFpbjsKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhblwndCBjaGFuZ2Ugc3BhY2VzIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLiBJZ25vcmVkIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDaGVjayBmb3Igc29tZSBvZiB0aGUgcHJlZGVmaW5lZCBzcGFjZXMuICAgRklYTUU6IG1vc3Qgb2YgdGhlIGNvZGUKLSAgICAgICAgIGJlbG93IGlzIHJlcGVhdGVkIHNldmVyYWwgdGltZXMsIGNhbiB3ZSBleHRyYWN0IHRoZSBjb21tb24gcGFydHMKLSAgICAgICAgIGFuZCBwbGFjZSB0aGVtIGludG8gYSBzdWJyb3V0aW5lIG9yIHNvbWV0aGluZyBzaW1pbGFyPyAgKi8KLSAgICAgIC8qIEZJWE1FIElzIHRoaXMgKGFuZCB0aGUgbmV4dCBJRiBzdG10KSByZWFsbHkgcmlnaHQ/Ci0JIFdoYXQgaWYgSU5QVVRfTElORV9QT0lOVEVSIHBvaW50cyB0byAiJFRFWFQkRk9PIj8gICovCi0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiJFRFWFQkIiwgNikgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLQkgIHNkX2NoYWluID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRURVhUJCIpOwotCSAgaWYgKHNkX2NoYWluID09IE5VTEwpCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRURVhUJCIsIDEpOwotCSAgZWxzZSBpZiAoU1BBQ0VfVVNFUl9ERUZJTkVEIChzZF9jaGFpbikgPT0gMCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10ICgiJFRFWFQkIiwgMCk7Ci0KLQkgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQkgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIGN1cnJlbnRfc3Vic3BhY2UKLQkgICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlICh0ZXh0X3NlY3Rpb24sCi0JCQkJCSBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiJFBSSVZBVEUkIiwgOSkgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gOTsKLQkgIHNkX2NoYWluID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRQUklWQVRFJCIpOwotCSAgaWYgKHNkX2NoYWluID09IE5VTEwpCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRQUklWQVRFJCIsIDEpOwotCSAgZWxzZSBpZiAoU1BBQ0VfVVNFUl9ERUZJTkVEIChzZF9jaGFpbikgPT0gMCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10ICgiJFBSSVZBVEUkIiwgMCk7Ci0KLQkgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQkgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIGN1cnJlbnRfc3Vic3BhY2UKLQkgICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChkYXRhX3NlY3Rpb24sCi0JCQkJCSBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoIXN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsCi0JCQlHREJfREVCVUdfU1BBQ0VfTkFNRSwKLQkJCXN0cmxlbiAoR0RCX0RFQlVHX1NQQUNFX05BTUUpKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc3RybGVuIChHREJfREVCVUdfU1BBQ0VfTkFNRSk7Ci0JICBzZF9jaGFpbiA9IGlzX2RlZmluZWRfc3BhY2UgKEdEQl9ERUJVR19TUEFDRV9OQU1FKTsKLQkgIGlmIChzZF9jaGFpbiA9PSBOVUxMKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKEdEQl9ERUJVR19TUEFDRV9OQU1FLCAxKTsKLQkgIGVsc2UgaWYgKFNQQUNFX1VTRVJfREVGSU5FRCAoc2RfY2hhaW4pID09IDApCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoR0RCX0RFQlVHX1NQQUNFX05BTUUsIDApOwotCi0JICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0KLQkgIHsKLQkgICAgYXNlY3Rpb24gKmdkYl9zZWN0aW9uCi0JICAgID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIEdEQl9ERUJVR19TUEFDRV9OQU1FKTsKLQotCSAgICBzdWJzZWdfc2V0IChnZGJfc2VjdGlvbiwgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgICAgY3VycmVudF9zdWJzcGFjZQotCSAgICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoZ2RiX3NlY3Rpb24sCi0JCQkJCSAgIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICB9Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogSXQgY291bGQgYmUgYSBzcGFjZSBzcGVjaWZpZWQgYnkgbnVtYmVyLiAgKi8KLSAgICAgIHByaW50X2Vycm9ycyA9IDA7Ci0gICAgICBzYXZlX3MgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoKHRlbXAgPSBwYV9wYXJzZV9udW1iZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIsIDApKSA+PSAwKQotCXsKLQkgIGlmICgoc2RfY2hhaW4gPSBwYV9maW5kX3NwYWNlX2J5X251bWJlciAodGVtcCkpKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCi0JICAgICAgc3Vic2VnX3NldCAoc2RfY2hhaW4tPnNkX3NlZywgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgICAgICBjdXJyZW50X3N1YnNwYWNlCi0JCT0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoc2RfY2hhaW4tPnNkX3NlZywKLQkJCQkJICAgICBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOb3QgYSBudW1iZXIsIGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHNwYWNlLiAgKi8KLSAgICAgIHByaW50X2Vycm9ycyA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3M7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3BhY2VfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgICAgIHN0cmNweSAoc3BhY2VfbmFtZSwgbmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10IChzcGFjZV9uYW1lLCAxKTsKLSAgICAgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQotICAgICAgc3Vic2VnX3NldCAoc2RfY2hhaW4tPnNkX3NlZywgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLSAgICAgIGN1cnJlbnRfc3Vic3BhY2UgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChzZF9jaGFpbi0+c2Rfc2VnLAotCQkJCQkJICBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci19Ci0KLS8qIFN3aXRjaCB0byBhIG5ldyBzcGFjZS4gIChJIHRoaW5rKS4gIEZJWE1FLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3NwbnVtICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHNwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAobmFtZSk7Ci0gIGlmIChzcGFjZSkKLSAgICB7Ci0gICAgICBwID0gZnJhZ19tb3JlICg0KTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgU1BBQ0VfU1BOVU0gKHNwYWNlKSwgNCk7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfd2FybiAoXygiVW5kZWZpbmVkIHNwYWNlOiAnJXMnIEFzc3VtaW5nIHNwYWNlIG51bWJlciA9IDAuIiksIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuU1VCU1BBQ0UgcHNldWRvLW9wOyB0aGlzIHN3aXRjaGVzIHRoZSBjdXJyZW50IHN1YnNwYWNlIHRvIHRoZQotICAgZ2l2ZW4gc3Vic3BhY2UsIGNyZWF0aW5nIHRoZSBuZXcgc3Vic3BhY2UgaWYgbmVjZXNzYXJ5LgotCi0gICBGSVhNRS4gIFNob3VsZCBtaXJyb3IgcGFfc3BhY2UgbW9yZSBjbG9zZWx5LCBpbiBwYXJ0aWN1bGFyIGhvdwotICAgdGhleSdyZSBicm9rZW4gdXAgaW50byBzdWJyb3V0aW5lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zdWJzcGFjZSAoY3JlYXRlX25ldykKLSAgICAgaW50IGNyZWF0ZV9uZXc7Ci17Ci0gIGNoYXIgKm5hbWUsICpzc19uYW1lLCBjOwotICBjaGFyIGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwgemVybywgc29ydDsKLSAgaW50IGksIGFjY2Vzcywgc3BhY2VfaW5kZXgsIGFsaWdubWVudCwgcXVhZHJhbnQsIGFwcGxpY2FibGUsIGZsYWdzOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotICBzc2RfY2hhaW5fc3RydWN0ICpzc2Q7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGlmIChjdXJyZW50X3NwYWNlID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIk11c3QgYmUgaW4gYSBzcGFjZSBiZWZvcmUgY2hhbmdpbmcgb3IgZGVjbGFyaW5nIHN1YnNwYWNlcy5cbiIpKTsKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhblwndCBjaGFuZ2Ugc3Vic3BhY2VzIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLiBJZ25vcmVkIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3NfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgICAgIHN0cmNweSAoc3NfbmFtZSwgbmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgLyogTG9hZCBkZWZhdWx0IHZhbHVlcy4gICovCi0gICAgICBzb3J0ID0gMDsKLSAgICAgIGFjY2VzcyA9IDB4N2Y7Ci0gICAgICBsb2FkYWJsZSA9IDE7Ci0gICAgICBjb21tb24gPSAwOwotICAgICAgZHVwX2NvbW1vbiA9IDA7Ci0gICAgICBjb2RlX29ubHkgPSAwOwotICAgICAgemVybyA9IDA7Ci0gICAgICBzcGFjZV9pbmRleCA9IH4wOwotICAgICAgYWxpZ25tZW50ID0gMTsKLSAgICAgIHF1YWRyYW50ID0gMDsKLQotICAgICAgc3BhY2UgPSBjdXJyZW50X3NwYWNlOwotICAgICAgaWYgKGNyZWF0ZV9uZXcpCi0Jc3NkID0gTlVMTDsKLSAgICAgIGVsc2UKLQlzc2QgPSBpc19kZWZpbmVkX3N1YnNwYWNlIChzc19uYW1lKTsKLSAgICAgIC8qIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGJ1aWx0aW4gYXR0cmlidXRlcyBvZiBzdWJzcGFjZXMuICBCdXQKLSAgICAgICAgIG9ubHkgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgY2hhbmdlZCBvbmNlISAgKi8KLSAgICAgIGlmIChzc2QgJiYgU1VCU1BBQ0VfREVGSU5FRCAoc3NkKSkKLQl7Ci0JICBzdWJzZWdfc2V0IChzc2QtPnNzZF9zZWcsIHNzZC0+c3NkX3N1YnNlZyk7Ci0JICBjdXJyZW50X3N1YnNwYWNlID0gc3NkOwotCSAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCSAgICBhc193YXJuIChfKCJQYXJhbWV0ZXJzIG9mIGFuIGV4aXN0aW5nIHN1YnNwYWNlIGNhblwndCBiZSBtb2RpZmllZCIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgbmV3IHN1YnNwYWNlLiAgTG9hZCBkZWZhdWx0IHZhbHVlcyBpZiBpdCBtYXRjaGVzIG9uZSBvZgotCSAgICAgdGhlIGJ1aWx0aW4gc3Vic3BhY2VzLiAgKi8KLQkgIGkgPSAwOwotCSAgd2hpbGUgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSkKLQkgICAgewotCSAgICAgIGlmIChzdHJjYXNlY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsIHNzX25hbWUpID09IDApCi0JCXsKLQkJICBsb2FkYWJsZSA9IHBhX2RlZl9zdWJzcGFjZXNbaV0ubG9hZGFibGU7Ci0JCSAgY29tbW9uID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5jb21tb247Ci0JCSAgZHVwX2NvbW1vbiA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uZHVwX2NvbW1vbjsKLQkJICBjb2RlX29ubHkgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvZGVfb25seTsKLQkJICB6ZXJvID0gcGFfZGVmX3N1YnNwYWNlc1tpXS56ZXJvOwotCQkgIHNwYWNlX2luZGV4ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5zcGFjZV9pbmRleDsKLQkJICBhbGlnbm1lbnQgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmFsaWdubWVudDsKLQkJICBxdWFkcmFudCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0ucXVhZHJhbnQ7Ci0JCSAgYWNjZXNzID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5hY2Nlc3M7Ci0JCSAgc29ydCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uc29ydDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGkrKzsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2Ugc2hvdWxkIGJlIHdvcmtpbmcgd2l0aCBhIG5ldyBzdWJzcGFjZSBub3cuICBGaWxsIGluCi0gICAgICAgICBhbnkgaW5mb3JtYXRpb24gYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgKi8KLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkgICAgewotCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJxdWFkIiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBxdWFkcmFudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYWxpZ24iLCA1KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIGFsaWdubWVudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQkgIGlmIChsb2cyIChhbGlnbm1lbnQpID09IC0xKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiIpKTsKLQkJICAgICAgYWxpZ25tZW50ID0gMTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImFjY2VzcyIsIDYpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgYWNjZXNzID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzb3J0IiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBzb3J0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJjb2RlX29ubHkiLCA5KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGNvZGVfb25seSA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJ1bmxvYWRhYmxlIiwgMTApID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgbG9hZGFibGUgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiY29tbW9uIiwgNikgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBjb21tb24gPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZHVwX2NvbW0iLCA4KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGR1cF9jb21tb24gPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiemVybyIsIDQpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgemVybyA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJmaXJzdCIsIDUpID09IDApKQotCQlhc19iYWQgKF8oIkZJUlNUIG5vdCBzdXBwb3J0ZWQgYXMgYSAuU1VCU1BBQ0UgYXJndW1lbnQiKSk7Ci0JICAgICAgZWxzZQotCQlhc19iYWQgKF8oIkludmFsaWQgLlNVQlNQQUNFIGFyZ3VtZW50IikpOwotCSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkJaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENvbXB1dGUgYSByZWFzb25hYmxlIHNldCBvZiBCRkQgZmxhZ3MgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uCi0gICAgICAgICBpbiB0aGUgLnN1YnNwYWNlIGRpcmVjdGl2ZS4gICovCi0gICAgICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLSAgICAgIGZsYWdzID0gMDsKLSAgICAgIGlmIChsb2FkYWJsZSkKLQlmbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpOwotICAgICAgaWYgKGNvZGVfb25seSkKLQlmbGFncyB8PSBTRUNfQ09ERTsKLSAgICAgIGlmIChjb21tb24gfHwgZHVwX2NvbW1vbikKLQlmbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCi0gICAgICBmbGFncyB8PSBTRUNfUkVMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOwotCi0gICAgICAvKiBUaGlzIGlzIGEgemVyby1maWxsZWQgc3Vic3BhY2UgKGVnIEJTUykuICAqLwotICAgICAgaWYgKHplcm8pCi0JZmxhZ3MgJj0gfihTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotCi0gICAgICBhcHBsaWNhYmxlICY9IGZsYWdzOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIGV4aXN0aW5nIHN1YnNwYWNlLCB0aGVuIHdlIHdhbnQgdG8gdXNlIHRoZQotICAgICAgICAgc2VnbWVudCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic3BhY2UuCi0KLSAgICAgICAgIEZJWE1FIE5PVyEgIEVMRiBCRkQgZG9lc24ndCBhcHBlYXIgdG8gYmUgcmVhZHkgdG8gZGVhbCB3aXRoCi0gICAgICAgICBsb3RzIG9mIHNlY3Rpb25zLiAgSXQgbWlnaHQgYmUgYSBwcm9ibGVtIGluIHRoZSBQQSBFTEYKLSAgICAgICAgIGNvZGUsIEkgZG8gbm90IGtub3cgeWV0LiAgRm9yIG5vdyBhdm9pZCBjcmVhdGluZyBhbnl0aGluZwotICAgICAgICAgYnV0IHRoZSAic3RhbmRhcmQiIHNlY3Rpb25zIGZvciBFTEYuICAqLwotICAgICAgaWYgKGNyZWF0ZV9uZXcpCi0Jc2VjdGlvbiA9IHN1YnNlZ19mb3JjZV9uZXcgKHNzX25hbWUsIDApOwotICAgICAgZWxzZSBpZiAoc3NkKQotCXNlY3Rpb24gPSBzc2QtPnNzZF9zZWc7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbiA9IHN1YnNlZ19uZXcgKHNzX25hbWUsIDApOwotCi0gICAgICBpZiAoemVybykKLQlzZWdfaW5mbyAoc2VjdGlvbiktPmJzcyA9IDE7Ci0KLSAgICAgIC8qIE5vdyBzZXQgdGhlIGZsYWdzLiAgKi8KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWN0aW9uLCBhcHBsaWNhYmxlKTsKLQotICAgICAgLyogUmVjb3JkIGFueSBhbGlnbm1lbnQgcmVxdWVzdCBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHNlY3Rpb24sIGxvZzIgKGFsaWdubWVudCkpOwotCi0gICAgICAvKiBTZXQgdGhlIHN0YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgc2VjdGlvbiwKLQkJCSAgIHBhX3N1YnNwYWNlX3N0YXJ0IChzcGFjZSwgcXVhZHJhbnQpKTsKLQotICAgICAgLyogTm93IHRoYXQgYWxsIHRoZSBmbGFncyBhcmUgc2V0LCB1cGRhdGUgYW4gZXhpc3Rpbmcgc3Vic3BhY2UsCi0gICAgICAgICBvciBjcmVhdGUgYSBuZXcgb25lLiAgKi8KLSAgICAgIGlmIChzc2QpCi0KLQljdXJyZW50X3N1YnNwYWNlID0gdXBkYXRlX3N1YnNwYWNlIChzcGFjZSwgc3NfbmFtZSwgbG9hZGFibGUsCi0JCQkJCSAgICBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwKLQkJCQkJICAgIHNvcnQsIHplcm8sIGFjY2Vzcywgc3BhY2VfaW5kZXgsCi0JCQkJCSAgICBhbGlnbm1lbnQsIHF1YWRyYW50LAotCQkJCQkgICAgc2VjdGlvbik7Ci0gICAgICBlbHNlCi0JY3VycmVudF9zdWJzcGFjZSA9IGNyZWF0ZV9uZXdfc3Vic3BhY2UgKHNwYWNlLCBzc19uYW1lLCBsb2FkYWJsZSwKLQkJCQkJCWNvZGVfb25seSwgY29tbW9uLAotCQkJCQkJZHVwX2NvbW1vbiwgemVybywgc29ydCwKLQkJCQkJCWFjY2Vzcywgc3BhY2VfaW5kZXgsCi0JCQkJCSAgICAgIGFsaWdubWVudCwgcXVhZHJhbnQsIHNlY3Rpb24pOwotCi0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgY3VycmVudF9zdWJzcGFjZS0+c3NkX3NlZyA9IHNlY3Rpb247Ci0gICAgICBzdWJzZWdfc2V0IChjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc2VnLCBjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc3Vic2VnKTsKLSAgICB9Ci0gIFNVQlNQQUNFX0RFRklORUQgKGN1cnJlbnRfc3Vic3BhY2UpID0gMTsKLX0KLQotCi0vKiBDcmVhdGUgZGVmYXVsdCBzcGFjZSBhbmQgc3Vic3BhY2UgZGljdGlvbmFyaWVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3NwYWNlc19iZWdpbiAoKQotewotICBpbnQgaTsKLQotICBzcGFjZV9kaWN0X3Jvb3QgPSBOVUxMOwotICBzcGFjZV9kaWN0X2xhc3QgPSBOVUxMOwotCi0gIGkgPSAwOwotICB3aGlsZSAocGFfZGVmX3NwYWNlc1tpXS5uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIFBpY2sgdGhlIHJpZ2h0IG5hbWUgdG8gdXNlIGZvciB0aGUgbmV3IHNlY3Rpb24uICAqLwotICAgICAgbmFtZSA9IHBhX2RlZl9zcGFjZXNbaV0ubmFtZTsKLQotICAgICAgcGFfZGVmX3NwYWNlc1tpXS5zZWdtZW50ID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0gICAgICBjcmVhdGVfbmV3X3NwYWNlIChwYV9kZWZfc3BhY2VzW2ldLm5hbWUsIHBhX2RlZl9zcGFjZXNbaV0uc3BudW0sCi0JCQlwYV9kZWZfc3BhY2VzW2ldLmxvYWRhYmxlLCBwYV9kZWZfc3BhY2VzW2ldLmRlZmluZWQsCi0JCQlwYV9kZWZfc3BhY2VzW2ldLnByaXZhdGUsIHBhX2RlZl9zcGFjZXNbaV0uc29ydCwKLQkJCXBhX2RlZl9zcGFjZXNbaV0uc2VnbWVudCwgMCk7Ci0gICAgICBpKys7Ci0gICAgfQotCi0gIGkgPSAwOwotICB3aGlsZSAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBpbnQgYXBwbGljYWJsZSwgc3Vic2VnbWVudDsKLSAgICAgIGFzZWN0aW9uICpzZWdtZW50ID0gTlVMTDsKLSAgICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0KLSAgICAgIC8qIFBpY2sgdGhlIHJpZ2h0IG5hbWUgZm9yIHRoZSBuZXcgc2VjdGlvbiBhbmQgcGljayB0aGUgcmlnaHQKLSAgICAgICAgIHN1YnNlZ21lbnQgbnVtYmVyLiAgKi8KLSAgICAgIG5hbWUgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWU7Ci0gICAgICBzdWJzZWdtZW50ID0gMDsKLQotICAgICAgLyogQ3JlYXRlIHRoZSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBzZWdtZW50ID0gc3Vic2VnX25ldyAobmFtZSwgc3Vic2VnbWVudCk7Ci0KLQotICAgICAgLyogRm9yIFNPTSB3ZSB3YW50IHRvIHJlcGxhY2UgdGhlIHN0YW5kYXJkIC50ZXh0LCAuZGF0YSwgYW5kIC5ic3MKLSAgICAgICAgIHNlY3Rpb25zIHdpdGggb3VyIG93bi4gICBXZSBhbHNvIHdhbnQgdG8gc2V0IEJGRCBmbGFncyBmb3IKLQkgYWxsIHRoZSBidWlsdC1pbiBzdWJzcGFjZXMuICAqLwotICAgICAgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRDT0RFJCIpKQotCXsKLQkgIHRleHRfc2VjdGlvbiA9IHNlZ21lbnQ7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFCi0JCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJERBVEEkIikpCi0JewotCSAgZGF0YV9zZWN0aW9uID0gc2VnbWVudDsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQotCi0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJEJTUyQiKSkKLQl7Ci0JICBic3Nfc2VjdGlvbiA9IHNlZ21lbnQ7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgU0VDX0FMTE9DKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkTElUJCIpKQotCXsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJE1JTExJQ09ERSQiKSkKLQl7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQwotCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRVTldJTkQkIikpCi0JewotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICAgIHNwYWNlID0gcGFfc2VnbWVudF90b19zcGFjZSAocGFfZGVmX3NwYWNlc1twYV9kZWZfc3Vic3BhY2VzW2ldLgotCQkJCQkJIGRlZl9zcGFjZV9pbmRleF0uc2VnbWVudCk7Ci0gICAgICBpZiAoc3BhY2UgPT0gTlVMTCkKLQl7Ci0JICBhc19mYXRhbCAoXygiSW50ZXJuYWwgZXJyb3I6IFVuYWJsZSB0byBmaW5kIGNvbnRhaW5pbmcgc3BhY2UgZm9yICVzLiIpLAotCQkgICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lKTsKLQl9Ci0KLSAgICAgIGNyZWF0ZV9uZXdfc3Vic3BhY2UgKHNwYWNlLCBuYW1lLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5sb2FkYWJsZSwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uY29kZV9vbmx5LAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5jb21tb24sCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmR1cF9jb21tb24sCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnplcm8sCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnNvcnQsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmFjY2VzcywKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uc3BhY2VfaW5kZXgsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmFsaWdubWVudCwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0ucXVhZHJhbnQsCi0JCQkgICBzZWdtZW50KTsKLSAgICAgIGkrKzsKLSAgICB9Ci19Ci0KLQotCi0vKiBDcmVhdGUgYSBuZXcgc3BhY2UgTkFNRSwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYXMgZGVmaW5lZAotICAgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLWNyZWF0ZV9uZXdfc3BhY2UgKG5hbWUsIHNwbnVtLCBsb2FkYWJsZSwgZGVmaW5lZCwgcHJpdmF0ZSwKLQkJICBzb3J0LCBzZWcsIHVzZXJfZGVmaW5lZCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IHNwbnVtOwotICAgICBpbnQgbG9hZGFibGU7Ci0gICAgIGludCBkZWZpbmVkOwotICAgICBpbnQgcHJpdmF0ZTsKLSAgICAgaW50IHNvcnQ7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGludCB1c2VyX2RlZmluZWQ7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqY2hhaW5fZW50cnk7Ci0KLSAgY2hhaW5fZW50cnkgPSAoc2RfY2hhaW5fc3RydWN0ICopIHhtYWxsb2MgKHNpemVvZiAoc2RfY2hhaW5fc3RydWN0KSk7Ci0gIGlmICghY2hhaW5fZW50cnkpCi0gICAgYXNfZmF0YWwgKF8oIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iKSwKLQkgICAgICBuYW1lKTsKLQotICBTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSkgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIHN0cmNweSAoU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpLCBuYW1lKTsKLSAgU1BBQ0VfREVGSU5FRCAoY2hhaW5fZW50cnkpID0gZGVmaW5lZDsKLSAgU1BBQ0VfVVNFUl9ERUZJTkVEIChjaGFpbl9lbnRyeSkgPSB1c2VyX2RlZmluZWQ7Ci0gIFNQQUNFX1NQTlVNIChjaGFpbl9lbnRyeSkgPSBzcG51bTsKLQotICBjaGFpbl9lbnRyeS0+c2Rfc2VnID0gc2VnOwotICBjaGFpbl9lbnRyeS0+c2RfbGFzdF9zdWJzZWcgPSAtMTsKLSAgY2hhaW5fZW50cnktPnNkX3N1YnNwYWNlcyA9IE5VTEw7Ci0gIGNoYWluX2VudHJ5LT5zZF9uZXh0ID0gTlVMTDsKLQotICAvKiBGaW5kIHNwb3QgZm9yIHRoZSBuZXcgc3BhY2UgYmFzZWQgb24gaXRzIHNvcnQga2V5LiAgKi8KLSAgaWYgKCFzcGFjZV9kaWN0X2xhc3QpCi0gICAgc3BhY2VfZGljdF9sYXN0ID0gY2hhaW5fZW50cnk7Ci0KLSAgaWYgKHNwYWNlX2RpY3Rfcm9vdCA9PSBOVUxMKQotICAgIHNwYWNlX2RpY3Rfcm9vdCA9IGNoYWluX2VudHJ5OwotICBlbHNlCi0gICAgewotICAgICAgc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9wb2ludGVyOwotICAgICAgc2RfY2hhaW5fc3RydWN0ICpwcmV2X2NoYWluX3BvaW50ZXI7Ci0KLSAgICAgIGNoYWluX3BvaW50ZXIgPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICBwcmV2X2NoYWluX3BvaW50ZXIgPSBOVUxMOwotCi0gICAgICB3aGlsZSAoY2hhaW5fcG9pbnRlcikKLQl7Ci0JICBwcmV2X2NoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyOwotCSAgY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXItPnNkX25leHQ7Ci0JfQotCi0gICAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGZvdW5kIHRoZSBjb3JyZWN0IHBsYWNlIHRvIGFkZCB0aGUgbmV3Ci0gICAgICAgICBlbnRyeS4gIFNvIGFkZCBpdCBhbmQgdXBkYXRlIHRoZSBsaW5rZWQgbGlzdHMgYXMgYXBwcm9wcmlhdGUuICAqLwotICAgICAgaWYgKHByZXZfY2hhaW5fcG9pbnRlcikKLQl7Ci0JICBjaGFpbl9lbnRyeS0+c2RfbmV4dCA9IGNoYWluX3BvaW50ZXI7Ci0JICBwcmV2X2NoYWluX3BvaW50ZXItPnNkX25leHQgPSBjaGFpbl9lbnRyeTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3BhY2VfZGljdF9yb290ID0gY2hhaW5fZW50cnk7Ci0JICBjaGFpbl9lbnRyeS0+c2RfbmV4dCA9IGNoYWluX3BvaW50ZXI7Ci0JfQotCi0gICAgICBpZiAoY2hhaW5fZW50cnktPnNkX25leHQgPT0gTlVMTCkKLQlzcGFjZV9kaWN0X2xhc3QgPSBjaGFpbl9lbnRyeTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBoZXJlIHRvIGNhdGNoIHByZWRlZmluZWQgc3BhY2VzIHdoaWNoIGRvIG5vdCBnZXQKLSAgICAgbW9kaWZpZWQgYnkgdGhlIHVzZXIncyBpbnB1dC4gIEFub3RoZXIgY2FsbCBpcyBmb3VuZCBhdAotICAgICB0aGUgYm90dG9tIG9mIHBhX3BhcnNlX3NwYWNlX3N0bXQgdG8gaGFuZGxlIGNhc2VzIHdoZXJlCi0gICAgIHRoZSB1c2VyIG1vZGlmaWVzIGEgcHJlZGVmaW5lZCBzcGFjZS4gICovCi0jaWZkZWYgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMKLSAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNlZywgZGVmaW5lZCwgcHJpdmF0ZSwgc29ydCwgc3BudW0pOwotI2VuZGlmCi0KLSAgcmV0dXJuIGNoYWluX2VudHJ5OwotfQotCi0vKiBDcmVhdGUgYSBuZXcgc3Vic3BhY2UgTkFNRSwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYXMgZGVmaW5lZAotICAgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0KLSAgIEFkZCB0aGUgbmV3IHN1YnNwYWNlIHRvIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IGNoYWluIGluIG51bWVyaWNhbAotICAgb3JkZXIgYXMgZGVmaW5lZCBieSB0aGUgU09SVCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKgotY3JlYXRlX25ld19zdWJzcGFjZSAoc3BhY2UsIG5hbWUsIGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwKLQkJICAgICBkdXBfY29tbW9uLCBpc196ZXJvLCBzb3J0LCBhY2Nlc3MsIHNwYWNlX2luZGV4LAotCQkgICAgIGFsaWdubWVudCwgcXVhZHJhbnQsIHNlZykKLSAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwgaXNfemVybzsKLSAgICAgaW50IHNvcnQ7Ci0gICAgIGludCBhY2Nlc3M7Ci0gICAgIGludCBzcGFjZV9pbmRleDsKLSAgICAgaW50IGFsaWdubWVudDsKLSAgICAgaW50IHF1YWRyYW50OwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBzc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9lbnRyeTsKLQotICBjaGFpbl9lbnRyeSA9IChzc2RfY2hhaW5fc3RydWN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3NkX2NoYWluX3N0cnVjdCkpOwotICBpZiAoIWNoYWluX2VudHJ5KQotICAgIGFzX2ZhdGFsIChfKCJPdXQgb2YgbWVtb3J5OiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IHN1YnNwYWNlIGNoYWluIGVudHJ5OiAlc1xuIiksIG5hbWUpOwotCi0gIFNVQlNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgc3RyY3B5IChTVUJTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSksIG5hbWUpOwotCi0gIC8qIEluaXRpYWxpemUgc3Vic3BhY2VfZGVmaW5lZC4gIFdoZW4gd2UgaGl0IGEgLnN1YnNwYWNlIGRpcmVjdGl2ZQotICAgICB3ZSdsbCBzZXQgaXQgdG8gMSB3aGljaCAibG9ja3MtaW4iIHRoZSBzdWJzcGFjZSBhdHRyaWJ1dGVzLiAgKi8KLSAgU1VCU1BBQ0VfREVGSU5FRCAoY2hhaW5fZW50cnkpID0gMDsKLQotICBjaGFpbl9lbnRyeS0+c3NkX3N1YnNlZyA9IDA7Ci0gIGNoYWluX2VudHJ5LT5zc2Rfc2VnID0gc2VnOwotICBjaGFpbl9lbnRyeS0+c3NkX25leHQgPSBOVUxMOwotCi0gIC8qIEZpbmQgc3BvdCBmb3IgdGhlIG5ldyBzdWJzcGFjZSBiYXNlZCBvbiBpdHMgc29ydCBrZXkuICAqLwotICBpZiAoc3BhY2UtPnNkX3N1YnNwYWNlcyA9PSBOVUxMKQotICAgIHNwYWNlLT5zZF9zdWJzcGFjZXMgPSBjaGFpbl9lbnRyeTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX3BvaW50ZXI7Ci0gICAgICBzc2RfY2hhaW5fc3RydWN0ICpwcmV2X2NoYWluX3BvaW50ZXI7Ci0KLSAgICAgIGNoYWluX3BvaW50ZXIgPSBzcGFjZS0+c2Rfc3Vic3BhY2VzOwotICAgICAgcHJldl9jaGFpbl9wb2ludGVyID0gTlVMTDsKLQotICAgICAgd2hpbGUgKGNoYWluX3BvaW50ZXIpCi0JewotCSAgcHJldl9jaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlcjsKLQkgIGNoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyLT5zc2RfbmV4dDsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBoYXZlIHNvbWV3aGVyZSB0byBwdXQgdGhlIG5ldyBlbnRyeS4gIEluc2VydCBpdCBhbmQgdXBkYXRlCi0gICAgICAgICB0aGUgbGlua3MuICAqLwotICAgICAgaWYgKHByZXZfY2hhaW5fcG9pbnRlcikKLQl7Ci0JICBjaGFpbl9lbnRyeS0+c3NkX25leHQgPSBjaGFpbl9wb2ludGVyOwotCSAgcHJldl9jaGFpbl9wb2ludGVyLT5zc2RfbmV4dCA9IGNoYWluX2VudHJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzcGFjZS0+c2Rfc3Vic3BhY2VzID0gY2hhaW5fZW50cnk7Ci0JICBjaGFpbl9lbnRyeS0+c3NkX25leHQgPSBjaGFpbl9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSNpZmRlZiBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBzcGFjZS0+c2Rfc2VnLCBhY2Nlc3MsCi0JCQkJIHNvcnQsIHF1YWRyYW50KTsKLSNlbmRpZgotCi0gIHJldHVybiBjaGFpbl9lbnRyeTsKLX0KLQotLyogVXBkYXRlIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHN1YnNwYWNlIGJhc2VkIHVwb24gdGhlCi0gICB2YXJpb3VzIGFyZ3VtZW50cy4gICBSZXR1cm4gdGhlIG1vZGlmaWVkIHN1YnNwYWNlIGNoYWluIGVudHJ5LiAgKi8KLQotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKgotdXBkYXRlX3N1YnNwYWNlIChzcGFjZSwgbmFtZSwgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLCBzb3J0LAotCQkgemVybywgYWNjZXNzLCBzcGFjZV9pbmRleCwgYWxpZ25tZW50LCBxdWFkcmFudCwgc2VjdGlvbikKLSAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGxvYWRhYmxlOwotICAgICBpbnQgY29kZV9vbmx5OwotICAgICBpbnQgY29tbW9uOwotICAgICBpbnQgZHVwX2NvbW1vbjsKLSAgICAgaW50IHplcm87Ci0gICAgIGludCBzb3J0OwotICAgICBpbnQgYWNjZXNzOwotICAgICBpbnQgc3BhY2VfaW5kZXg7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0gICAgIGludCBxdWFkcmFudDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX2VudHJ5OwotCi0gIGNoYWluX2VudHJ5ID0gaXNfZGVmaW5lZF9zdWJzcGFjZSAobmFtZSk7Ci0KLSNpZmRlZiBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VjdGlvbiwgc3BhY2UtPnNkX3NlZywgYWNjZXNzLAotCQkJCSBzb3J0LCBxdWFkcmFudCk7Ci0jZW5kaWYKLQotICByZXR1cm4gY2hhaW5fZW50cnk7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3BhY2UgY2hhaW4gZW50cnkgZm9yIHRoZSBzcGFjZSB3aXRoIHRoZSBuYW1lIE5BTUUgb3IKLSAgIE5VTEwgaWYgbm8gc3VjaCBzcGFjZSBleGlzdHMuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLWlzX2RlZmluZWRfc3BhY2UgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqY2hhaW5fcG9pbnRlcjsKLQotICBmb3IgKGNoYWluX3BvaW50ZXIgPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgY2hhaW5fcG9pbnRlcjsKLSAgICAgICBjaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlci0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChTUEFDRV9OQU1FIChjaGFpbl9wb2ludGVyKSwgbmFtZSkgPT0gMCkKLQlyZXR1cm4gY2hhaW5fcG9pbnRlcjsKLSAgICB9Ci0KLSAgLyogTm8gbWFwcGluZyBmcm9tIHNlZ21lbnQgdG8gc3BhY2Ugd2FzIGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRmluZCBhbmQgcmV0dXJuIHRoZSBzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNlZy4gIElmIG5vIG1hcHBpbmcKLSAgIGZyb20gdGhlIGdpdmVuIHNlZyB0byBhIHNwYWNlIGlzIGZvdW5kLCB0aGVuIHJldHVybiBOVUxMLgotCi0gICBVbmxpa2Ugc3Vic3BhY2VzLCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpcyBub3QgZXhwZWN0ZWQgdG8gZ3JvdyBtdWNoLAotICAgc28gYSBsaW5lYXIgZXhoYXVzdGl2ZSBzZWFyY2ggaXMgT0sgaGVyZS4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotcGFfc2VnbWVudF90b19zcGFjZSAoc2VnKQotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHNwYWNlIGxvb2tpbmcgZm9yIHRoZSBjb3JyZWN0IG1hcHBpbmcuICAqLwotICBmb3IgKHNwYWNlX2NoYWluID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIHNwYWNlX2NoYWluOwotICAgICAgIHNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX25leHQpCi0gICAgewotICAgICAgaWYgKHNwYWNlX2NoYWluLT5zZF9zZWcgPT0gc2VnKQotCXJldHVybiBzcGFjZV9jaGFpbjsKLSAgICB9Ci0KLSAgLyogTWFwcGluZyB3YXMgbm90IGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIHRoZSBzcGFjZSBjaGFpbiBlbnRyeSBmb3IgdGhlIHN1YnNwYWNlIHdpdGggdGhlIG5hbWUgTkFNRSBvcgotICAgTlVMTCBpZiBubyBzdWNoIHN1YnNwYWNlIGV4aXN0cy4KLQotICAgVXNlcyBhIGxpbmVhciBzZWFyY2ggdGhyb3VnaCBhbGwgdGhlIHNwYWNlcyBhbmQgc3Vic3BhY2VzLCB0aGlzIG1heQotICAgbm90IGJlIGFwcHJvcHJpYXRlIGlmIHdlIGV2ZXIgYmVpbmcgcGxhY2luZyBlYWNoIGZ1bmN0aW9uIGluIGl0cwotICAgb3duIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKgotaXNfZGVmaW5lZF9zdWJzcGFjZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKLSAgc3NkX2NoYWluX3N0cnVjdCAqc3Vic3BhY2VfY2hhaW47Ci0KLSAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3BhY2UuICAqLwotICBmb3IgKHNwYWNlX2NoYWluID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIHNwYWNlX2NoYWluOwotICAgICAgIHNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX25leHQpCi0gICAgewotICAgICAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3Vic3BhY2UgbG9va2luZyBmb3IgYSBuYW1lIHdoaWNoIG1hdGNoZXMuICAqLwotICAgICAgZm9yIChzdWJzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9zdWJzcGFjZXM7Ci0JICAgc3Vic3BhY2VfY2hhaW47Ci0JICAgc3Vic3BhY2VfY2hhaW4gPSBzdWJzcGFjZV9jaGFpbi0+c3NkX25leHQpCi0JaWYgKHN0cmNtcCAoU1VCU1BBQ0VfTkFNRSAoc3Vic3BhY2VfY2hhaW4pLCBuYW1lKSA9PSAwKQotCSAgcmV0dXJuIHN1YnNwYWNlX2NoYWluOwotICAgIH0KLQotICAvKiBTdWJzcGFjZSB3YXNuJ3QgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIGFuZCByZXR1cm4gdGhlIHN1YnNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc2VnLiAgSWYgbm8KLSAgIG1hcHBpbmcgZnJvbSB0aGUgZ2l2ZW4gc2VnIHRvIGEgc3Vic3BhY2UgaXMgZm91bmQsIHRoZW4gcmV0dXJuIE5VTEwuCi0KLSAgIElmIHdlIGV2ZXIgcHV0IGVhY2ggcHJvY2VkdXJlL2Z1bmN0aW9uIHdpdGhpbiBpdHMgb3duIHN1YnNwYWNlCi0gICAodG8gbWFrZSBsaWZlIGVhc2llciBvbiB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciksIHRoZW4gdGhpcyB3aWxsIGhhdmUKLSAgIHRvIGJlY29tZSBtb3JlIGVmZmljaWVudC4gICovCi0KLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKLXBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHNlZywgc3Vic2VnKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKLSAgc3NkX2NoYWluX3N0cnVjdCAqc3Vic3BhY2VfY2hhaW47Ci0KLSAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3BhY2UuICAqLwotICBmb3IgKHNwYWNlX2NoYWluID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIHNwYWNlX2NoYWluOwotICAgICAgIHNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX25leHQpCi0gICAgewotICAgICAgaWYgKHNwYWNlX2NoYWluLT5zZF9zZWcgPT0gc2VnKQotCXsKLQkgIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHN1YnNwYWNlIHdpdGhpbiBlYWNoIHNwYWNlIGxvb2tpbmcgZm9yCi0JICAgICB0aGUgY29ycmVjdCBtYXBwaW5nLiAgKi8KLQkgIGZvciAoc3Vic3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2Rfc3Vic3BhY2VzOwotCSAgICAgICBzdWJzcGFjZV9jaGFpbjsKLQkgICAgICAgc3Vic3BhY2VfY2hhaW4gPSBzdWJzcGFjZV9jaGFpbi0+c3NkX25leHQpCi0JICAgIGlmIChzdWJzcGFjZV9jaGFpbi0+c3NkX3N1YnNlZyA9PSAoaW50KSBzdWJzZWcpCi0JICAgICAgcmV0dXJuIHN1YnNwYWNlX2NoYWluOwotCX0KLSAgICB9Ci0KLSAgLyogTm8gbWFwcGluZyBmcm9tIHN1YnNlZ21lbnQgdG8gc3Vic3BhY2UgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhIG51bWJlciwgdHJ5IGFuZCBmaW5kIGEgc3BhY2Ugd2l0aCB0aGUgbmFtZSBudW1iZXIuCi0KLSAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBzcGFjZSBkaWN0aW9uYXJ5IGNoYWluIGVudHJ5IGZvciB0aGUgc3BhY2UKLSAgIHRoYXQgd2FzIGZvdW5kIG9yIE5VTEwgb24gZmFpbHVyZS4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotcGFfZmluZF9zcGFjZV9ieV9udW1iZXIgKG51bWJlcikKLSAgICAgaW50IG51bWJlcjsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKLQotICBmb3IgKHNwYWNlX2NoYWluID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIHNwYWNlX2NoYWluOwotICAgICAgIHNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX25leHQpCi0gICAgewotICAgICAgaWYgKFNQQUNFX1NQTlVNIChzcGFjZV9jaGFpbikgPT0gKHVuc2lnbmVkIGludCkgbnVtYmVyKQotCXJldHVybiBzcGFjZV9jaGFpbjsKLSAgICB9Ci0KLSAgLyogTm8gYXBwcm9wcmlhdGUgc3BhY2UgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXR1cm4gdGhlIHN0YXJ0aW5nIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBzdWJzcGFjZS4gIElmIHRoZSBzdGFydGluZwotICAgYWRkcmVzcyBpcyB1bmtub3duIHRoZW4gcmV0dXJuIHplcm8uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9zdWJzcGFjZV9zdGFydCAoc3BhY2UsIHF1YWRyYW50KQotICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotICAgICBpbnQgcXVhZHJhbnQ7Ci17Ci0gIC8qIEZJWE1FLiAgQXNzdW1lcyBldmVyeW9uZSBwdXRzIHJlYWQvd3JpdGUgZGF0YSBhdCAweDQwMDAwMDAsIHRoaXMKLSAgICAgaXMgbm90IGNvcnJlY3QgZm9yIHRoZSBQQSBPU0YxIHBvcnQuICAqLwotICBpZiAoKHN0cmNtcCAoU1BBQ0VfTkFNRSAoc3BhY2UpLCAiJFBSSVZBVEUkIikgPT0gMCkgJiYgcXVhZHJhbnQgPT0gMSkKLSAgICByZXR1cm4gMHg0MDAwMDAwMDsKLSAgZWxzZSBpZiAoc3BhY2UtPnNkX3NlZyA9PSBkYXRhX3NlY3Rpb24gJiYgcXVhZHJhbnQgPT0gMSkKLSAgICByZXR1cm4gMHg0MDAwMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiAwOwotICByZXR1cm4gMDsKLX0KLQotLyogRklYTUUuICBOZWVkcyBkb2N1bWVudGF0aW9uLiAgKi8KLXN0YXRpYyBpbnQKLXBhX25leHRfc3Vic2VnIChzcGFjZSkKLSAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLXsKLQotICBzcGFjZS0+c2RfbGFzdF9zdWJzZWcrKzsKLSAgcmV0dXJuIHNwYWNlLT5zZF9sYXN0X3N1YnNlZzsKLX0KLSNlbmRpZgotCi0vKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHBhX3N0cmluZ2VyLiAgVXNlZCB0byBmaW5kIHRoZSBlbmQgb2YKLSAgIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGFfc3RyaW5nZXJfYXV4IChzKQotICAgICBjaGFyICpzOwotewotICB1bnNpZ25lZCBpbnQgYyA9ICpzICYgQ0hBUl9NQVNLOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnXCInOgotICAgICAgYyA9IE5PVF9BX0NIQVI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gYzsKLX0KLQotLyogSGFuZGxlIGEgLlNUUklORyB0eXBlIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zdHJpbmdlciAoYXBwZW5kX3plcm8pCi0gICAgIGludCBhcHBlbmRfemVybzsKLXsKLSAgY2hhciAqcywgbnVtX2J1Zls0XTsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGludCBpOwotCi0gIC8qIFByZXByb2Nlc3MgdGhlIHN0cmluZyB0byBoYW5kbGUgUEEtc3BlY2lmaWMgZXNjYXBlIHNlcXVlbmNlcy4KLSAgICAgRm9yIGV4YW1wbGUsIFx4REQgd2hlcmUgREQgaXMgYSBoZXhpZGVjaW1hbCBudW1iZXIgc2hvdWxkIGJlCi0gICAgIGNoYW5nZWQgdG8gXE9PTyB3aGVyZSBPT08gaXMgYW4gb2N0YWwgbnVtYmVyLiAgKi8KLQotICAvKiBTa2lwIHRoZSBvcGVuaW5nIHF1b3RlLiAgKi8KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0KLSAgd2hpbGUgKGlzX2FfY2hhciAoYyA9IHBhX3N0cmluZ2VyX2F1eCAocysrKSkpCi0gICAgewotICAgICAgaWYgKGMgPT0gJ1xcJykKLQl7Ci0JICBjID0gKnM7Ci0JICBzd2l0Y2ggKGMpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgXHg8bnVtPi4gICovCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IG51bWJlcjsKLQkJaW50IG51bV9kaWdpdDsKLQkJY2hhciBkZzsKLQkJY2hhciAqc19zdGFydCA9IHM7Ci0KLQkJLyogR2V0IHBhcyB0aGUgJ3gnLiAgKi8KLQkJcysrOwotCQlmb3IgKG51bV9kaWdpdCA9IDAsIG51bWJlciA9IDAsIGRnID0gKnM7Ci0JCSAgICAgbnVtX2RpZ2l0IDwgMgotCQkgICAgICYmIChpc2RpZ2l0IChkZykgfHwgKGRnID49ICdhJyAmJiBkZyA8PSAnZicpCi0JCQkgfHwgKGRnID49ICdBJyAmJiBkZyA8PSAnRicpKTsKLQkJICAgICBudW1fZGlnaXQrKykKLQkJICB7Ci0JCSAgICBpZiAoaXNkaWdpdCAoZGcpKQotCQkgICAgICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGRnIC0gJzAnOwotCQkgICAgZWxzZSBpZiAoZGcgPj0gJ2EnICYmIGRnIDw9ICdmJykKLQkJICAgICAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBkZyAtICdhJyArIDEwOwotCQkgICAgZWxzZQotCQkgICAgICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGRnIC0gJ0EnICsgMTA7Ci0KLQkJICAgIHMrKzsKLQkJICAgIGRnID0gKnM7Ci0JCSAgfQotCQlpZiAobnVtX2RpZ2l0ID4gMCkKLQkJICB7Ci0JCSAgICBzd2l0Y2ggKG51bV9kaWdpdCkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDE6Ci0JCQlzcHJpbnRmIChudW1fYnVmLCAiJTAybyIsIG51bWJlcik7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAyOgotCQkJc3ByaW50ZiAobnVtX2J1ZiwgIiUwM28iLCBudW1iZXIpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX2RpZ2l0OyBpKyspCi0JCSAgICAgIHNfc3RhcnRbaV0gPSBudW1fYnVmW2ldOwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAvKiBUaGlzIG1pZ2h0IGJlIGEgIlwiIiwgc2tpcCBvdmVyIHRoZSBlc2NhcGVkIGNoYXIuICAqLwotCSAgICBkZWZhdWx0OgotCSAgICAgIHMrKzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHN0cmluZ2VyIChhcHBlbmRfemVybyk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBIYW5kbGUgYSAuVkVSU0lPTiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdmVyc2lvbiAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBvYmpfdmVyc2lvbiAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0jaWZkZWYgT0JKX1NPTQotCi0vKiBIYW5kbGUgYSAuQ09NUElMRVIgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvbXBpbGVyICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIG9ial9zb21fY29tcGlsZXIgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIC5DT1BZUklHSFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvcHlyaWdodCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBvYmpfY29weXJpZ2h0ICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIEp1c3QgbGlrZSBhIG5vcm1hbCBjb25zLCBidXQgd2hlbiBmaW5pc2hlZCB3ZSBoYXZlIHRvIHVuZGVmaW5lCi0gICB0aGUgbGF0ZXN0IHNwYWNlIGxhYmVsLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvbnMgKG5ieXRlcykKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgY29ucyAobmJ5dGVzKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIFN3aXRjaCB0byB0aGUgZGF0YSBzcGFjZS4gIEFzIHVzdWFsIGRlbGV0ZSBvdXIgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZGF0YSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgY3VycmVudF9zcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKCIkUFJJVkFURSQiKTsKLSAgY3VycmVudF9zdWJzcGFjZQotICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoY3VycmVudF9zcGFjZS0+c2Rfc2VnLCAwKTsKLSNlbmRpZgotICBzX2RhdGEgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogTGlrZSBmbG9hdF9jb25zLCBidXQgd2UgbmVlZCB0byB1bmRlZmluZSBvdXIgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZmxvYXRfY29ucyAoZmxvYXRfdHlwZSkKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci17Ci0gIGZsb2F0X2NvbnMgKGZsb2F0X3R5cGUpOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogTGlrZSBzX2ZpbGwsIGJ1dCBkZWxldGUgb3VyIGxhYmVsIHdoZW4gZmluaXNoZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZmlsbCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzX2ZpbGwgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogTGlrZSBsY29tbSwgYnV0IGRlbGV0ZSBvdXIgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sY29tbSAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgc19sY29tbSAobmVlZHNfYWxpZ24pOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogTGlrZSBsc3ltLCBidXQgZGVsZXRlIG91ciBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xzeW0gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgc19sc3ltICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIFN3aXRjaCB0byB0aGUgdGV4dCBzcGFjZS4gIExpa2Ugc190ZXh0LCBidXQgZGVsZXRlIG91cgotICAgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCi1zdGF0aWMgdm9pZAotcGFfdGV4dCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgY3VycmVudF9zcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKLSAgY3VycmVudF9zdWJzcGFjZQotICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoY3VycmVudF9zcGFjZS0+c2Rfc2VnLCAwKTsKLSNlbmRpZgotCi0gIHNfdGV4dCAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBPbiB0aGUgUEEgcmVsb2NhdGlvbnMgd2hpY2ggaW52b2x2ZSBmdW5jdGlvbiBzeW1ib2xzIG11c3Qgbm90IGJlCi0gICBhZGp1c3RlZC4gIFRoaXMgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBrbm93IHdoZW4vaG93IHRvIGNyZWF0ZSBhcmd1bWVudAotICAgcmVsb2NhdGlvbiBzdHVicyBmb3IgaW5kaXJlY3QgY2FsbHMgYW5kIGNhbGxzIHRvIHN0YXRpYyBmdW5jdGlvbnMuCi0KLSAgICJUIiBmaWVsZCBzZWxlY3RvcnMgY3JlYXRlIERMVCByZWxhdGl2ZSBmaXh1cHMgZm9yIGFjY2Vzc2luZwotICAgZ2xvYmFscyBhbmQgc3RhdGljcyBpbiBQSUMgY29kZTsgZWFjaCBETFQgcmVsYXRpdmUgZml4dXAgY3JlYXRlcwotICAgYW4gZW50cnkgaW4gdGhlIERMVCB0YWJsZS4gIFRoZSBlbnRyaWVzIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YKLSAgIHRoZSBmaW5hbCB0YXJnZXQgKGVnIGFjY2Vzc2luZyAiZm9vIiB3b3VsZCBjcmVhdGUgYSBETFQgZW50cnkKLSAgIHdpdGggdGhlIGFkZHJlc3Mgb2YgImZvbyIpLgotCi0gICBVbmZvcnR1bmF0ZWx5LCB0aGUgSFAgbGlua2VyIGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgYW55IGFkZGVuZAotICAgd2hlbiBnZW5lcmF0aW5nIHRoZSBETFQ7IHNvIGFjY2Vzc2luZyAkTElUJCs4IHB1dHMgdGhlIGFkZHJlc3Mgb2YKLSAgICRMSVQkIGludG8gdGhlIERMVCByYXRoZXIgdGhhbiB0aGUgYWRkcmVzcyBvZiAkTElUJCs4LgotCi0gICBUaGUgZW5kIHJlc3VsdCBpcyB3ZSBjYW4ndCBwZXJmb3JtIHJlbG9jYXRpb24gc3ltYm9sIHJlZHVjdGlvbnMgZm9yCi0gICBhbnkgZml4dXAgd2hpY2ggY3JlYXRlcyBlbnRyaWVzIGluIHRoZSBETFQgKGVnIHRoZXkgdXNlICJUIiBmaWVsZAotICAgc2VsZWN0b3JzKS4KLQotICAgUmVqZWN0IHJlZHVjdGlvbnMgaW52b2x2aW5nIHN5bWJvbHMgd2l0aCBleHRlcm5hbCBzY29wZTsgc3VjaAotICAgcmVkdWN0aW9ucyBtYWtlIGxpZmUgYSBsaXZpbmcgaGVsbCBmb3Igb2JqZWN0IGZpbGUgZWRpdG9ycy4KLQotICAgRklYTUUuICBBbHNvIHJlamVjdCBSX0hQUEEgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIDMyYml0cyB3aWRlIGluCi0gICB0aGUgY29kZSBzcGFjZS4gIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBrbm93IGhvdyB0byBwdWxsIHRoZQotICAgcmlnaHQgYml0cyBvdXQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLWhwcGFfZml4X2FkanVzdGFibGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4OwotCi0gIGhwcGFfZml4ID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gMzJiaXQgcmVsb2NzLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEEgJiYgaHBwYV9maXgtPmZ4X3JfZm9ybWF0ID09IDMyKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gc3ltMS1zeW0yIGV4cHJlc3Npb25zIHdoZW4KLSAgICAgdGhlIGZpeHVwIHdpbGwgb2NjdXIgaW4gYSBDT0RFIHN1YnNwYWNlLgotCi0gICAgIFhYWCBGSVhNRTogTG9uZyB0ZXJtIHdlIHByb2JhYmx5IHdhbnQgdG8gcmVqZWN0IGFsbCBvZiB0aGVzZTsKLSAgICAgZm9yIGV4YW1wbGUgcmVkdWNpbmcgaW4gdGhlIGRlYnVnIHNlY3Rpb24gd291bGQgbG9zZSBpZiB3ZSBldmVyCi0gICAgIHN1cHBvcnRlZCB1c2luZyB0aGUgb3B0aW1pemluZyBocCBsaW5rZXIuICAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kKLSAgICAgICYmIGZpeHAtPmZ4X3N1YnN5Ci0gICAgICAmJiAoaHBwYV9maXgtPnNlZ21lbnQtPmZsYWdzICYgU0VDX0NPREUpKQotICAgIHsKLSAgICAgIC8qIEFwcGFyZW50bHkgc3lfdXNlZF9pbl9yZWxvYyBuZXZlciBnZXRzIHNldCBmb3Igc3ViIHN5bWJvbHMuICAqLwotICAgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+Znhfc3Vic3kpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IGFkanVzdCBhbnkgcmVsb2NzIHRoYXQgdXNlIExSJSBhbmQgUlIlIGZpZWxkIHNlbGVjdG9ycy4KLSAgICAgVGhhdCBjb25mdXNlcyB0aGUgSFAgbGlua2VyLiAgKi8KLSAgaWYgKGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfbHJzZWwKLSAgICAgIHx8IGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfcnJzZWwKLSAgICAgIHx8IGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfbmxyc2VsKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSAgLyogUmVqZWN0IHJlZHVjdGlvbnMgb2Ygc3ltYm9scyBpbiBETFQgcmVsYXRpdmUgcmVsb2NzLAotICAgICByZWxvY2F0aW9ucyB3aXRoIHBsYWJlbHMuICAqLwotICBpZiAoaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV90c2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2x0c2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3J0c2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3BzZWwKLSAgICAgIHx8IGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfcnBzZWwKLSAgICAgIHx8IGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfbHBzZWwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICYmIFNfSVNfRVhURVJOQUwgKGZpeHAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBSZWplY3QgYWJzb2x1dGUgY2FsbHMgKGp1bXBzKS4gICovCi0gIGlmIChocHBhX2ZpeC0+Znhfcl90eXBlID09IFJfSFBQQV9BQlNfQ0FMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBSZWplY3QgcmVkdWN0aW9ucyBvZiBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IDAgfHwgISBTX0lTX0ZVTkNUSU9OIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBub256ZXJvIGlmIHRoZSBmaXh1cCBpbiBGSVhQIHdpbGwgcmVxdWlyZSBhIHJlbG9jYXRpb24sCi0gICBldmVuIGl0IGlmIGFwcGVhcnMgdGhhdCB0aGUgZml4dXAgY291bGQgYmUgY29tcGxldGVseSBoYW5kbGVkCi0gICB3aXRoaW4gR0FTLiAgKi8KLQotaW50Ci1ocHBhX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4cDsKLSAgaW50IGRpc3RhbmNlOwotCi0gIGhwcGFfZml4cCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopIGZpeHAtPnRjX2ZpeF9kYXRhOwotI2lmZGVmIE9CSl9TT00KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5UUlkgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FWElUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0JFR0lOX0JSVEFCCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VORF9CUlRBQgotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9CRUdJTl9UUlkKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX1RSWQotICAgICAgfHwgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwgJiYgZml4cC0+Znhfc3Vic3kgIT0gTlVMTAotCSAgJiYgKGhwcGFfZml4cC0+c2VnbWVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkpCi0gICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotI2RlZmluZSBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQoQ0FMTEVSLCBDQUxMRUUpIFwKLSAgKChDQUxMRUUpICYmIChDQUxMRVIpICYmICgoQ0FMTEVFKSAhPSAoQ0FMTEVSKSkpCi0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIEl0IGlzIG5lY2Vzc2FyeSB0byBmb3JjZSBQQy1yZWxhdGl2ZSBjYWxscy9qdW1wcyB0byBoYXZlIGEgcmVsb2NhdGlvbgotICAgICBlbnRyeSBpZiB0aGV5J3JlIGdvaW5nIHRvIG5lZWQgZWl0aGVyIGEgYXJndW1lbnQgcmVsb2NhdGlvbiBvciBsb25nCi0gICAgIGNhbGwgc3R1Yi4gIEZJWE1FLiAgQ2FuJ3Qgd2UgbmVlZCB0aGUgc2FtZSBmb3IgYWJzb2x1dGUgY2FsbHM/ICAqLwotICBpZiAoZml4cC0+ZnhfcGNyZWwgJiYgZml4cC0+ZnhfYWRkc3kKLSAgICAgICYmIChhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQgKChsb25nKSAoKG9ial9zeW1ib2xfdHlwZSAqKQotCXN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSkpLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jLAotCWhwcGFfZml4cC0+ZnhfYXJnX3JlbG9jKSkpCi0gICAgcmV0dXJuIDE7Ci0jZW5kaWYKLSAgZGlzdGFuY2UgPSAoZml4cC0+Znhfb2Zmc2V0ICsgU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgIC0gbWRfcGNyZWxfZnJvbSAoZml4cCkpOwotICAvKiBOb3cgY2hlY2sgYW5kIHNlZSBpZiB3ZSdyZSBnb2luZyB0byBuZWVkIGEgbG9uZy1icmFuY2ggc3R1Yi4gICovCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX1BDUkVMX0NBTEwKLSAgICAgICYmIChkaXN0YW5jZSA+IDI2MjE0MyB8fCBkaXN0YW5jZSA8IC0yNjIxNDQpKQotICAgIHJldHVybiAxOwotCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0FCU19DQUxMKQotICAgIHJldHVybiAxOwotI3VuZGVmIGFyZ19yZWxvY19zdHViX25lZWRlZAotCi0gIC8qIE5vIG5lZWQgKHlldCkgdG8gZm9yY2UgYW5vdGhlciByZWxvY2F0aW9ucyB0byBiZSBlbWl0dGVkLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE5vdyBmb3Igc29tZSBFTEYgc3BlY2lmaWMgY29kZS4gIEZJWE1FLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0vKiBNYXJrIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gY29tcHV0ZQotICAgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uIGluIGhwcGFfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gKCkKLXsKLSAgLyogRUxGIGRvZXMgbm90IGhhdmUgRVhJVCByZWxvY2F0aW9ucy4gIEFsbCB3ZSBkbyBpcyBjcmVhdGUgYQotICAgICB0ZW1wb3Jhcnkgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBjaGFyICpuYW1lID0gKGNoYXIgKikKLSAgICB4bWFsbG9jIChzdHJsZW4gKCJMJFwwMDFlbmRfIikgKwotCSAgICAgc3RybGVuIChTX0dFVF9OQU1FIChsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sKSkgKyAxKTsKLQotICBpZiAobmFtZSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1ib2xQOwotCi0gICAgICBzdHJjcHkgKG5hbWUsICJMJFwwMDFlbmRfIik7Ci0gICAgICBzdHJjYXQgKG5hbWUsIFNfR0VUX05BTUUgKGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wpKTsKLQotICAgICAgLyogSWYgd2UgaGF2ZSBhIC5leGl0IGZvbGxvd2VkIGJ5IGEgLnByb2NlbmQsIHRoZW4gdGhlCi0JIHN5bWJvbCB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQuICAqLwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgICAgIGlmIChzeW1ib2xQKQotCXsKLQkgIC8qIFRoZSBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkISAgVGhpcyBjYW4KLQkgICAgIGhhcHBlbiBpZiB3ZSBoYXZlIGEgLmV4aXQgZm9sbG93ZWQgYnkgYSAucHJvY2VuZC4KLQotCSAgICAgVGhpcyBpcyAqbm90KiBhbiBlcnJvci4gIEFsbCB3ZSB3YW50IHRvIGRvIGlzIGZyZWUKLQkgICAgIHRoZSBtZW1vcnkgd2UganVzdCBhbGxvY2F0ZWQgZm9yIHRoZSBuYW1lIGFuZCBjb250aW51ZS4gICovCi0JICB4ZnJlZSAobmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHN5bWJvbCB2YWx1ZSBzaG91bGQgYmUgdGhlIG9mZnNldCBvZiB0aGUKLQkgICAgIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGZ1bmN0aW9uICovCi0JICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgbm93X3NlZywgKHZhbHVlVCkgKGZyYWdfbm93X2ZpeCAoKSAtIDQpLAotCQkJCWZyYWdfbm93KTsKLQotCSAgYXNzZXJ0IChzeW1ib2xQKTsKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0JfQotCi0gICAgICBpZiAoc3ltYm9sUCkKLQlsYXN0X2NhbGxfaW5mby0+ZW5kX3N5bWJvbCA9IHN5bWJvbFA7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJTeW1ib2wgJyVzJyBjb3VsZCBub3QgYmUgY3JlYXRlZC4iKSwgbmFtZSk7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oIk5vIG1lbW9yeSBmb3Igc3ltYm9sIG5hbWUuIikpOwotCi19Ci0KLS8qIEZvciBFTEYsIHRoaXMgZnVuY3Rpb24gc2VydmVzIG9uZSBwdXJwb3NlOiAgdG8gc2V0dXAgdGhlIHN0X3NpemUKLSAgIGZpZWxkIG9mIFNUVF9GVU5DIHN5bWJvbHMuICBUbyBkbyB0aGlzLCB3ZSBuZWVkIHRvIHNjYW4gdGhlCi0gICBjYWxsX2luZm8gc3RydWN0dXJlIGxpc3QsIGRldGVybWluaW5nIHN0X3NpemUgaW4gYnkgdGFraW5nIHRoZQotICAgZGlmZmVyZW5jZSBpbiB0aGUgYWRkcmVzcyBvZiB0aGUgYmVnaW5uaW5nL2VuZCBtYXJrZXIgc3ltYm9scy4gICovCi0KLXZvaWQKLWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcgKCkKLXsKLSAgc3RydWN0IGNhbGxfaW5mbyAqY2FsbF9pbmZvX3BvaW50ZXI7Ci0KLSAgZm9yIChjYWxsX2luZm9fcG9pbnRlciA9IGNhbGxfaW5mb19yb290OwotICAgICAgIGNhbGxfaW5mb19wb2ludGVyOwotICAgICAgIGNhbGxfaW5mb19wb2ludGVyID0gY2FsbF9pbmZvX3BvaW50ZXItPmNpX25leHQpCi0gICAgewotICAgICAgZWxmX3N5bWJvbF90eXBlICplc3ltCi0JPSAoKGVsZl9zeW1ib2xfdHlwZSAqKQotCSAgIHN5bWJvbF9nZXRfYmZkc3ltIChjYWxsX2luZm9fcG9pbnRlci0+c3RhcnRfc3ltYm9sKSk7Ci0gICAgICBlc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgPQotCVNfR0VUX1ZBTFVFIChjYWxsX2luZm9fcG9pbnRlci0+ZW5kX3N5bWJvbCkKLQktIFNfR0VUX1ZBTFVFIChjYWxsX2luZm9fcG9pbnRlci0+c3RhcnRfc3ltYm9sKSArIDQ7Ci0gICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi1wYV9lbmRfb2Zfc291cmNlICgpCi17Ci0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX0RXQVJGMikKLSAgICBkd2FyZjJfZmluaXNoICgpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWhwcGEuaCBiL2dhcy9jb25maWcvdGMtaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q1NWRjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qIHRjLWhwcGEuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGhlIFBBCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIEhQIFBBLVJJU0Mgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotICAgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4gICovCi0KLS8qIFBsZWFzZSByZWZyYWluIGZyb20gZXhwb3NpbmcgdGhlIHdvcmxkIHRvIHRoZSBpbnRlcm5hbHMgb2YgdGMtaHBwYS5jCi0gICB3aGVuIHRoaXMgZmlsZSBpcyBpbmNsdWRlZC4gIFRoaXMgbWVhbnMgb25seSBkZWNsYXJpbmcgZXhwb3J0ZWQgZnVuY3Rpb25zLAotICAgKHBsZWFzZSBQQVJBTWl6ZSB0aGVtISkgbm90IGV4cG9ydGluZyBzdHJ1Y3R1cmVzIGFuZCBkYXRhIGl0ZW1zIHdoaWNoCi0gICBhcmUgdXNlZCBzb2xlbHkgd2l0aGluIHRjLWhwcGEuYywgZXRjLgotCi0gICBBbHNvIHJlZnJhaW4gZnJvbSBhZGRpbmcgYW55IG1vcmUgb2JqZWN0IGZpbGUgZGVwZW5kZW50IGNvZGUsIHRoZXJlIGlzIAotICAgYWxyZWFkeSBmYXIgdG9vIG11Y2ggb2JqZWN0IGZpbGUgZm9ybWF0IGRlcGVuZGVudCBjb2RlIGluIHRoaXMgZmlsZS4KLSAgIEluIHRoZW9yeSB0aGlzIGZpbGUgc2hvdWxkIGNvbnRhaW4gb25seSBleHBvcnRlZCBmdW5jdGlvbnMsIHN0cnVjdHVyZXMKLSAgIGFuZCBkYXRhIGRlY2xhcmF0aW9ucyBjb21tb24gdG8gYWxsIFBBIGFzc2VtYmxlcnMuICAqLwotCi0jaWZuZGVmIF9UQ19IUFBBX0gKLSNkZWZpbmUgX1RDX0hQUEFfSAotCi0jaWZuZGVmIFRDX0hQUEEKLSNkZWZpbmUgVENfSFBQQQkxCi0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfaHBwYQotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogRklYTUUuICBUaGUgbGFjayBvZiBhIHBsYWNlIHRvIHB1dCB0aGluZ3Mgd2hpY2ggYXJlIGJvdGggdGFyZ2V0IGNwdQotICAgYW5kIHRhcmdldCBmb3JtYXQgZGVwZW5kZW50IG1ha2VzIGhhY2tzIGxpa2UgdGhpcyBuZWNlc3NhcnkuICAqLwotI2lmZGVmIE9CSl9FTEYKLSNpZmRlZiBCRkQ2NAotI2luY2x1ZGUgImJmZC9lbGY2NC1ocHBhLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjY0LWhwcGEiCi0jZWxzZQotI2luY2x1ZGUgImJmZC9lbGYzMi1ocHBhLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWhwcGEiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX1NPTQotI2luY2x1ZGUgImJmZC9zb20uaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAic29tIgotI2VuZGlmCi0KLS8qIEZJWE1FLiAgV2h5IG9oIHdoeSBhcmVuJ3QgdGhlc2UgZGVmaW5lZCBzb21ld2hlcmUgZ2xvYmFsbHk/ICAqLwotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgICgwKQotI2RlZmluZSBUUlVFICAgICghRkFMU0UpCi0jZW5kaWYKLQotI2RlZmluZSBBU0VDX05VTEwgKGFzZWN0aW9uICopMAotCi0vKiBMYWJlbHMgYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIGEgY29sb24gZm9yIGEgc3VmZml4LiAgKi8KLSNkZWZpbmUgTEFCRUxTX1dJVEhPVVRfQ09MT05TCi0KLS8qIEZJWE1FLiAgVGhpcyBzaG91bGQgYmUgc3RhdGljIGFuZCBkZWNsYXJlZCBpbiB0Yy1ocHBhLmMsIGJ1dCAKLSAgIHBhX2RlZmluZV9sYWJlbCBnZXRzIHVzZWQgb3V0c2lkZSBvZiB0Yy1ocHBhLmMgdmlhIHRjX2Zyb2JfbGFiZWwuCi0gICBTaG91bGQgYWxzbyBiZSBQQVJBTWl6ZWQsIGJ1dCBzeW1ib2xTIGlzbid0IGF2YWlsYWJsZSBoZXJlLiAgKi8KLWV4dGVybiB2b2lkIHBhX2RlZmluZV9sYWJlbCAoKTsKLQotLyogRklYTUUuICBUeXBlcyBub3QgYXZhaWxhYmxlIGhlcmUsIHNvIHRoZXkgY2FuJ3QgYmUgUEFSQU1pemVkLiAgKi8KLWV4dGVybiB2b2lkIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhICgpOwotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X2hwcGEgKCk7Ci1leHRlcm4gaW50IGhwcGFfZm9yY2VfcmVsb2NhdGlvbiAoKTsKLQotLyogVGhpcyBnZXRzIGNhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUgdG8gbWFrZSBzdXJlCi0gICB0aGluZ3MgbGlrZSBlbnRyeS9leGl0IGFuZCBwcm9jL3Byb2NlbmQgcGFpcnMgbWF0Y2guICAqLwotZXh0ZXJuIHZvaWQgcGFfY2hlY2tfZW9mIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgdGNfZnJvYl9maWxlIHBhX2NoZWNrX2VvZgotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBwYV9kZWZpbmVfbGFiZWwgKHN5bSkKLQotLyogVGhlIFBBIGRvZXMgbm90IG5lZWQgc3VwcG9ydCBmb3IgZWl0aGVyIG9mIHRoZXNlLiAgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGhlYWRlcnMpIHs7fQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soaGVhZGVycykgezt9Ci0KLSNkZWZpbmUgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi0jZGVmaW5lIE1BWF9SRUxPQ19FWFBBTlNJT04gNgotCi0vKiBGSVhNRS4gIE1vcmUgdGhpbmdzIHdoaWNoIGFyZSBib3RoIEhQUEEgYW5kIEVMRiBzcGVjaWZpYy4gIFRoZXJlIGlzIAotICAgbm93aGVyZSB0byBwdXQgc3VjaCB0aGluZ3MuICAqLwotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcJZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZwotdm9pZCBlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0vKiBUaGUgUEEgbmVlZHMgdG8gcGFyc2UgZmllbGQgc2VsZWN0b3JzIGluIC5ieXRlLCBldGMuICAqLwotCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgXAotICBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoRVhQKQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X2hwcGEKLQotLyogT24gdGhlIFBBLCBhbiBlcXVhbCBzaWduIG9mdGVuIGFwcGVhcnMgYXMgYSBjb25kaXRpb24gb3IgbnVsbGlmaWNhdGlvbgotICAgY29tcGxldGVyIGluIGFuIGluc3RydWN0aW9uLiAgVGhpcyBjYW4gYmUgZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgdGhlCi0gICBwcmV2aW91cyBjaGFyYWN0ZXIsIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBjb21tYSwgdGhlbiB0aGUgZXF1YWwgaXMKLSAgIGJlaW5nIHVzZWQgYXMgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFRDX0VRVUFMX0lOX0lOU04oQywgUFRSKQkoKEMpID09ICcsJykKLQotLyogU2ltaWxhcmx5IGZvciBhbiBleGNsYW1hdGlvbiBwb2ludC4gIEl0IGlzIHVzZWQgaW4gRlAgY29tcGFyaXNvbgotICAgaW5zdHJ1Y3Rpb25zIGFuZCBhcyBhbiBlbmQgb2YgbGluZSBtYXJrZXIuICBXaGVuIHVzZWQgaW4gYW4gaW5zdHJ1Y3Rpb24KLSAgIGl0IHdpbGwgYWx3YXlzIGZvbGxvdyBhIGNvbW1hLiAgKi8KLSNkZWZpbmUgVENfRU9MX0lOX0lOU04oUFRSKQkoKihQVFIpID09ICchJyAmJiAoUFRSKVstMV0gPT0gJywnKQotCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlIGhwcGFfZml4X2FkanVzdGFibGUKLQotLyogQmVjYXVzZSBvZiB0aGUgc3RyYW5nZSBQQSBjYWxsaW5nIGNvbnZlbnRpb25zLCBpdCBpcyBzb21ldGltZXMKLSAgIG5lY2Vzc2FyeSB0byBlbWl0IGEgcmVsb2NhdGlvbiBmb3IgYSBjYWxsIGV2ZW4gdGhvdWdoIGl0IHdvdWxkCi0gICBub3JtYWxseSBhcHBlYXIgc2FmZSB0byBoYW5kbGUgaXQgY29tcGxldGVseSB3aXRoaW4gR0FTLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKSBocHBhX2ZvcmNlX3JlbG9jYXRpb24gKEZJWFApCi0KLSNpZmRlZiBPQkpfU09NCi0vKiBJZiBhIHN5bWJvbCBpcyBpbXBvcnRlZCwgYnV0IG5ldmVyIHVzZWQsIHRoZW4gdGhlIHN5bWJvbCBzaG91bGQKLSAgICpub3QqIGVuZCB1cCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgTGlrZXdpc2UgZm9yIGFic29sdXRlIHN5bWJvbHMKLSAgIHdpdGggbG9jYWwgc2NvcGUuICAqLwotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkgXAotICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX3VuZF9zZWN0aW9uICYmICEgc3ltYm9sX3VzZWRfcCAoc3ltKSkgXAotCXx8IChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfYWJzX3NlY3Rpb24gXAotCSAgICAmJiAhIFNfSVNfRVhURVJOQUwgKHN5bSkpKSBcCi0gICAgICBwdW50ID0gMQotCi0vKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFrZSByZWxvY2F0aW9ucyBpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YKLSAgIHR3byBzeW1ib2xzLiAgVGhpcyBpbmNsdWRlcyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyB3aGVuCi0gICBvbmUgb2YgdGhlbSBpcyB1bmRlZmluZWQgKHRoaXMgY29tZXMgdXAgaW4gUElDIGNvZGUgZ2VuZXJhdGlvbikuIAotCi0gICBXZSBkb24ndCBkZWZpbmUgRElGRl9FWFBSX09LIGJlY2F1c2UgaXQgZG9lcyB0aGUgd3JvbmcgdGhpbmcgaWYKLSAgIHRoZSBhZGQgc3ltYm9sIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHN1YiBzeW1ib2wgaXMgYSBzeW1ib2wgaW4KLSAgIHRoZSBzYW1lIHNlY3Rpb24gYXMgdGhlIHJlbG9jYXRpb24uICBXZSBhbHNvIG5lZWQgc29tZSB3YXkgdG8KLSAgIHNwZWNpYWxpemUgc29tZSBjb2RlIGluIGFkanVzdF9yZWxvY19zeW1zLiAgKi8KLSNkZWZpbmUgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkgXAotICB7IFwKLSAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAhIHN5bWJvbF91c2VkX3AgKHN5bSkpIFwKLQl8fCAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX2Fic19zZWN0aW9uIFwKLQkgICAgJiYgISBTX0lTX0VYVEVSTkFMIChzeW0pKSBcCi0JfHwgc3RyY21wIChTX0dFVF9OQU1FIChzeW0pLCAiJGdsb2JhbCQiKSA9PSAwKSBcCi0gICAgICBwdW50ID0gMTsgXAotICB9Ci0jZW5kaWYKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBtZF9lbmQoKSBwYV9lbmRfb2Zfc291cmNlICgpCi0jZW5kaWYKLQotI2RlZmluZSBUQ19GSVhfVFlQRSBQVFIKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGSVhQKSAoKEZJWFApLT50Y19maXhfZGF0YSA9IE5VTEwpCi0KLSNlbmRpZiAvKiBfVENfSFBQQV9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWkzODYuYyBiL2dhcy9jb25maWcvdGMtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjE5MTEzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3NCArMCwwIEBACi0vKiBpMzg2LmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEludGVsIDgwMzg2Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICBJbnRlbCA4MDM4NiBtYWNoaW5lIHNwZWNpZmljIGdhcy4KLSAgV3JpdHRlbiBieSBFbGlvdCBEcmVzc2VsaGF1cyAoZWxpb3RAbWdtLm1pdC5lZHUpLgotICBCdWdzICYgc3VnZ2VzdGlvbnMgYXJlIGNvbXBsZXRlbHkgd2VsY29tZS4gIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4KLSAgUGxlYXNlIGhlbHAgdXMgbWFrZSBpdCBiZXR0ZXIuCi0gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2kzODYuaCIKLQotI2lmbmRlZiBUQ19SRUxPQwotI2RlZmluZSBUQ19SRUxPQyhYLFkpIChZKQotI2VuZGlmCi0KLSNpZm5kZWYgUkVHSVNURVJfV0FSTklOR1MKLSNkZWZpbmUgUkVHSVNURVJfV0FSTklOR1MgMQotI2VuZGlmCi0KLSNpZm5kZWYgSU5GRVJfQUREUl9QUkVGSVgKLSNkZWZpbmUgSU5GRVJfQUREUl9QUkVGSVggMQotI2VuZGlmCi0KLSNpZm5kZWYgU0NBTEUxX1dIRU5fTk9fSU5ERVgKLS8qIFNwZWNpZnlpbmcgYSBzY2FsZSBmYWN0b3IgYmVzaWRlcyAxIHdoZW4gdGhlcmUgaXMgbm8gaW5kZXggaXMKLSAgIGZ1dGlsZS4gIGVnLiBgbW92ICglZWJ4LDIpLCVhbCcgZG9lcyBleGFjdGx5IHRoZSBzYW1lIGFzCi0gICBgbW92ICglZWJ4KSwlYWwnLiAgVG8gc2xhdmlzaGx5IGZvbGxvdyB3aGF0IHRoZSBwcm9ncmFtbWVyCi0gICBzcGVjaWZpZWQsIHNldCBTQ0FMRTFfV0hFTl9OT19JTkRFWCB0byAwLiAgKi8KLSNkZWZpbmUgU0NBTEUxX1dIRU5fTk9fSU5ERVggMQotI2VuZGlmCi0KLSNkZWZpbmUgdHJ1ZSAxCi0jZGVmaW5lIGZhbHNlIDAKLQotc3RhdGljIHVuc2lnbmVkIGludCBtb2RlX2Zyb21fZGlzcF9zaXplIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludCBmaXRzX2luX3NpZ25lZF9ieXRlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl91bnNpZ25lZF9ieXRlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl91bnNpZ25lZF93b3JkIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl9zaWduZWRfd29yZCBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IHNtYWxsZXN0X2ltbV90eXBlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgYWRkX3ByZWZpeCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF8xNmJpdF9jb2RlX2ZsYWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzZXRfMTZiaXRfZ2NjX2NvZGVfZmxhZyBQQVJBTVMoKGludCkpOwotc3RhdGljIHZvaWQgc2V0X2ludGVsX3N5bnRheCBQQVJBTVMgKChpbnQpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MKLSAgUEFSQU1TICgoaW50LCBpbnQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotI2VuZGlmCi0KLS8qICdtZF9hc3NlbWJsZSAoKScgZ2F0aGVycyB0b2dldGhlciBpbmZvcm1hdGlvbiBhbmQgcHV0cyBpdCBpbnRvIGEKLSAgIGkzODZfaW5zbi4gKi8KLQotc3RydWN0IF9pMzg2X2luc24KLSAgewotICAgIC8qIFRNIGhvbGRzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGluc24gd2VyZSBjdXJyZW50bHkgYXNzZW1ibGluZy4gKi8KLSAgICB0ZW1wbGF0ZSB0bTsKLQotICAgIC8qIFNVRkZJWCBob2xkcyB0aGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGlmIGdpdmVuLgotICAgICAgIChlLmcuICdsJyBmb3IgJ21vdmwnKSAgKi8KLSAgICBjaGFyIHN1ZmZpeDsKLQotICAgIC8qIE9wZXJhbmRzIGFyZSBjb2RlZCB3aXRoIE9QRVJBTkRTLCBUWVBFUywgRElTUFMsIElNTVMsIGFuZCBSRUdTLiAqLwotCi0gICAgLyogT1BFUkFORFMgZ2l2ZXMgdGhlIG51bWJlciBvZiBnaXZlbiBvcGVyYW5kcy4gKi8KLSAgICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgICAvKiBSRUdfT1BFUkFORFMsIERJU1BfT1BFUkFORFMsIE1FTV9PUEVSQU5EUywgSU1NX09QRVJBTkRTIGdpdmUgdGhlIG51bWJlcgotICAgICAgIG9mIGdpdmVuIHJlZ2lzdGVyLCBkaXNwbGFjZW1lbnQsIG1lbW9yeSBvcGVyYW5kcyBhbmQgaW1tZWRpYXRlCi0gICAgICAgb3BlcmFuZHMuICovCi0gICAgdW5zaWduZWQgaW50IHJlZ19vcGVyYW5kcywgZGlzcF9vcGVyYW5kcywgbWVtX29wZXJhbmRzLCBpbW1fb3BlcmFuZHM7Ci0KLSAgICAvKiBUWVBFUyBbaV0gaXMgdGhlIHR5cGUgKHNlZSBhYm92ZSAjZGVmaW5lcykgd2hpY2ggdGVsbHMgdXMgaG93IHRvCi0gICAgICAgc2VhcmNoIHRocm91Z2ggRElTUFMgW2ldICYgSU1NUyBbaV0gJiBSRUdTIFtpXSBmb3IgdGhlIHJlcXVpcmVkCi0gICAgICAgb3BlcmFuZC4gICovCi0gICAgdW5zaWduZWQgaW50IHR5cGVzW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBEaXNwbGFjZW1lbnRzIChpZiBnaXZlbikgZm9yIGVhY2ggb3BlcmFuZC4gKi8KLSAgICBleHByZXNzaW9uUyAqZGlzcHNbTUFYX09QRVJBTkRTXTsKLQotICAgIC8qIFJlbG9jYXRpb24gdHlwZSBmb3Igb3BlcmFuZCAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgZGlzcF9yZWxvY1tNQVhfT1BFUkFORFNdOwotI2Vsc2UKLSAgICBpbnQgZGlzcF9yZWxvY1tNQVhfT1BFUkFORFNdOwotI2VuZGlmCi0KLSAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZHMgKGlmIGdpdmVuKSBmb3IgZWFjaCBvcGVyYW5kLiAqLwotICAgIGV4cHJlc3Npb25TICppbW1zW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBSZWdpc3RlciBvcGVyYW5kcyAoaWYgZ2l2ZW4pIGZvciBlYWNoIG9wZXJhbmQuICovCi0gICAgY29uc3QgcmVnX2VudHJ5ICpyZWdzW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBCQVNFX1JFRywgSU5ERVhfUkVHLCBhbmQgTE9HMl9TQ0FMRV9GQUNUT1IgYXJlIHVzZWQgdG8gZW5jb2RlCi0gICAgICAgdGhlIGJhc2UgaW5kZXggYnl0ZSBiZWxvdy4gICovCi0gICAgY29uc3QgcmVnX2VudHJ5ICpiYXNlX3JlZzsKLSAgICBjb25zdCByZWdfZW50cnkgKmluZGV4X3JlZzsKLSAgICB1bnNpZ25lZCBpbnQgbG9nMl9zY2FsZV9mYWN0b3I7Ci0KLSAgICAvKiBTRUcgZ2l2ZXMgdGhlIHNlZ19lbnRyaWVzIG9mIHRoaXMgaW5zbi4gIFRoZXkgYXJlIHplcm8gdW5sZXNzCi0gICAgICAgZXhwbGljaXQgc2VnbWVudCBvdmVycmlkZXMgYXJlIGdpdmVuLiAqLwotICAgIGNvbnN0IHNlZ19lbnRyeSAqc2VnWzJdOwkvKiBzZWdtZW50cyBmb3IgbWVtb3J5IG9wZXJhbmRzIChpZiBnaXZlbikgKi8KLQotICAgIC8qIFBSRUZJWCBob2xkcyBhbGwgdGhlIGdpdmVuIHByZWZpeCBvcGNvZGVzICh1c3VhbGx5IG51bGwpLgotICAgICAgIFBSRUZJWEVTIGlzIHRoZSBudW1iZXIgb2YgcHJlZml4IG9wY29kZXMuICAqLwotICAgIHVuc2lnbmVkIGludCBwcmVmaXhlczsKLSAgICB1bnNpZ25lZCBjaGFyIHByZWZpeFtNQVhfUFJFRklYRVNdOwotCi0gICAgLyogUk0gYW5kIFNJQiBhcmUgdGhlIG1vZHJtIGJ5dGUgYW5kIHRoZSBzaWIgYnl0ZSB3aGVyZSB0aGUKLSAgICAgICBhZGRyZXNzaW5nIG1vZGVzIG9mIHRoaXMgaW5zbiBhcmUgZW5jb2RlZC4gICovCi0KLSAgICBtb2RybV9ieXRlIHJtOwotICAgIHNpYl9ieXRlIHNpYjsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2kzODZfaW5zbiBpMzg2X2luc247Ci0KLS8qIExpc3Qgb2YgY2hhcnMgYmVzaWRlcyB0aG9zZSBpbiBhcHAuYzpzeW1ib2xfY2hhcnMgdGhhdCBjYW4gc3RhcnQgYW4KLSAgIG9wZXJhbmQuICBVc2VkIHRvIHByZXZlbnQgdGhlIHNjcnViYmVyIGVhdGluZyB2aXRhbCB3aGl0ZS1zcGFjZS4gICovCi0jaWZkZWYgTEVYX0FUCi1jb25zdCBjaGFyIGV4dHJhX3N5bWJvbF9jaGFyc1tdID0gIiolLShAIjsKLSNlbHNlCi1jb25zdCBjaGFyIGV4dHJhX3N5bWJvbF9jaGFyc1tdID0gIiolLSgiOwotI2VuZGlmCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi0jaWYgZGVmaW5lZCAoVEVfSTM4NkFJWCkgfHwgKChkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKSkgJiYgISBkZWZpbmVkIChURV9MSU5VWCkpCi0vKiBQdXR0aW5nICcvJyBoZXJlIG1ha2VzIGl0IGltcG9zc2libGUgdG8gdXNlIHRoZSBkaXZpZGUgb3BlcmF0b3IuCi0gICBIb3dldmVyLCB3ZSBuZWVkIGl0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU1ZSNCBzeXN0ZW1zLiAgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMvIjsKLSNkZWZpbmUgUFJFRklYX1NFUEFSQVRPUiAnXFwnCi0jZWxzZQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0jZGVmaW5lIFBSRUZJWF9TRVBBUkFUT1IgJy8nCi0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrIGlmCi0gICAnLycgaXNuJ3Qgb3RoZXJ3aXNlIGRlZmluZWQuICAqLwotI2lmIGRlZmluZWQgKFRFX0kzODZBSVgpIHx8ICgoZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikpICYmICEgZGVmaW5lZCAoVEVfTElOVVgpKQotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIiOwotI2Vsc2UKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiLyI7Ci0jZW5kaWYKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRmREeFgiOwotCi0vKiB0YWJsZXMgZm9yIGxleGljYWwgYW5hbHlzaXMgKi8KLXN0YXRpYyBjaGFyIG1uZW1vbmljX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciByZWdpc3Rlcl9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgb3BlcmFuZF9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgaWRlbnRpZmllcl9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgZGlnaXRfY2hhcnNbMjU2XTsKLQotLyogbGV4aWNhbCBtYWNyb3MgKi8KLSNkZWZpbmUgaXNfbW5lbW9uaWNfY2hhcih4KSAobW5lbW9uaWNfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19vcGVyYW5kX2NoYXIoeCkgKG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19yZWdpc3Rlcl9jaGFyKHgpIChyZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX3NwYWNlX2NoYXIoeCkgKCh4KSA9PSAnICcpCi0jZGVmaW5lIGlzX2lkZW50aWZpZXJfY2hhcih4KSAoaWRlbnRpZmllcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX2RpZ2l0X2NoYXIoeCkgKGRpZ2l0X2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLQotLyogcHV0IGhlcmUgYWxsIG5vbi1kaWdpdCBub24tbGV0dGVyIGNoYXJjdGVycyB0aGF0IG1heSBvY2N1ciBpbiBhbiBvcGVyYW5kICovCi1zdGF0aWMgY2hhciBvcGVyYW5kX3NwZWNpYWxfY2hhcnNbXSA9ICIlJC0rKCwpKi5ffi88PnwmXiE6W0BdIjsKLQotLyogbWRfYXNzZW1ibGUoKSBhbHdheXMgbGVhdmVzIHRoZSBzdHJpbmdzIGl0J3MgcGFzc2VkIHVuYWx0ZXJlZC4gIFRvCi0gICBlZmZlY3QgdGhpcyB3ZSBtYWludGFpbiBhIHN0YWNrIG9mIHNhdmVkIGNoYXJhY3RlcnMgdGhhdCB3ZSd2ZSBzbWFzaGVkCi0gICB3aXRoICdcMCdzIChpbmRpY2F0aW5nIGVuZCBvZiBzdHJpbmdzIGZvciB2YXJpb3VzIHN1Yi1maWVsZHMgb2YgdGhlCi0gICBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24pLiAqLwotc3RhdGljIGNoYXIgc2F2ZV9zdGFja1szMl07Ci1zdGF0aWMgY2hhciAqc2F2ZV9zdGFja19wOwkvKiBzdGFjayBwb2ludGVyICovCi0jZGVmaW5lIEVORF9TVFJJTkdfQU5EX1NBVkUocykgXAotCWRvIHsgKnNhdmVfc3RhY2tfcCsrID0gKihzKTsgKihzKSA9ICdcMCc7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFJFU1RPUkVfRU5EX1NUUklORyhzKSBcCi0JZG8geyAqKHMpID0gKi0tc2F2ZV9zdGFja19wOyB9IHdoaWxlICgwKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gd2UncmUgYXNzZW1ibGluZy4gKi8KLXN0YXRpYyBpMzg2X2luc24gaTsKLQotLyogUG9zc2libGUgdGVtcGxhdGVzIGZvciBjdXJyZW50IGluc24uICAqLwotc3RhdGljIGNvbnN0IHRlbXBsYXRlcyAqY3VycmVudF90ZW1wbGF0ZXM7Ci0KLS8qIFBlciBpbnN0cnVjdGlvbiBleHByZXNzaW9uUyBidWZmZXJzOiAyIGRpc3BsYWNlbWVudHMgJiAyIGltbWVkaWF0ZSBtYXguICovCi1zdGF0aWMgZXhwcmVzc2lvblMgZGlzcF9leHByZXNzaW9uc1syXSwgaW1fZXhwcmVzc2lvbnNbMl07Ci0KLXN0YXRpYyBpbnQgdGhpc19vcGVyYW5kOwkvKiBjdXJyZW50IG9wZXJhbmQgd2UgYXJlIHdvcmtpbmcgb24gKi8KLQotc3RhdGljIGludCBmbGFnX2RvX2xvbmdfanVtcDsJLyogRklYTUUgd2hhdCBkb2VzIHRoaXMgZG8/ICovCi0KLXN0YXRpYyBpbnQgZmxhZ18xNmJpdF9jb2RlOwkvKiAxIGlmIHdlJ3JlIHdyaXRpbmcgMTYtYml0IGNvZGUsIDAgaWYgMzItYml0ICovCi0KLXN0YXRpYyBpbnQgaW50ZWxfc3ludGF4ID0gMDsJLyogMSBmb3IgaW50ZWwgc3ludGF4LCAwIGlmIGF0dCBzeW50YXggKi8KLQotc3RhdGljIGludCBhbGxvd19uYWtlZF9yZWcgPSAwOyAgLyogMSBpZiByZWdpc3RlciBwcmVmaXggJSBub3QgcmVxdWlyZWQgKi8KLQotc3RhdGljIGNoYXIgc3RhY2tvcF9zaXplID0gJ1wwJzsgIC8qIFVzZWQgaW4gMTYgYml0IGdjYyBtb2RlIHRvIGFkZCBhbiBsCi0JCQkJICAgICBzdWZmaXggdG8gY2FsbCwgcmV0LCBlbnRlciwgbGVhdmUsIHB1c2gsCi0JCQkJICAgICBhbmQgcG9wIGluc3RydWN0aW9ucy4gICovCi0KLS8qIEludGVyZmFjZSB0byByZWxheF9zZWdtZW50LgotICAgVGhlcmUgYXJlIDIgcmVsYXggc3RhdGVzIGZvciAzODYganVtcCBpbnNuczogb25lIGZvciBjb25kaXRpb25hbCAmCi0gICBvbmUgZm9yIHVuY29uZGl0aW9uYWwganVtcHMuICBUaGlzIGlzIGJlY2F1c2UgdGhlc2UgdHdvIHR5cGVzIG9mCi0gICBqdW1wcyBhZGQgZGlmZmVyZW50IHNpemVzIHRvIGZyYWdzIHdoZW4gd2UncmUgZmlndXJpbmcgb3V0IHdoYXQKLSAgIHNvcnQgb2YganVtcCB0byBjaG9vc2UgdG8gcmVhY2ggYSBnaXZlbiBsYWJlbC4gICovCi0KLS8qIHR5cGVzICovCi0jZGVmaW5lIENPTkRfSlVNUCAxCQkvKiBjb25kaXRpb25hbCBqdW1wICovCi0jZGVmaW5lIFVOQ09ORF9KVU1QIDIJCS8qIHVuY29uZGl0aW9uYWwganVtcCAqLwotLyogc2l6ZXMgKi8KLSNkZWZpbmUgQ09ERTE2CTEKLSNkZWZpbmUgU01BTEwJMAotI2RlZmluZSBTTUFMTDE2IChTTUFMTHxDT0RFMTYpCi0jZGVmaW5lIEJJRwkyCi0jZGVmaW5lIEJJRzE2CShCSUd8Q09ERTE2KQotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIElOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgRU5DT0RFX1JFTEFYX1NUQVRFKHR5cGUsc2l6ZSkgXAotICAoKHJlbGF4X3N1YnN0YXRlVCkoKHR5cGU8PDIpIHwgKHNpemUpKSkKLSNkZWZpbmUgU0laRV9GUk9NX1JFTEFYX1NUQVRFKHMpIFwKLSAgICAoICgoKHMpICYgMHgzKSA9PSBCSUcgPyA0IDogKCgocykgJiAweDMpID09IEJJRzE2ID8gMiA6IDEpKSApCi0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCBieSByZWxheF9mcmFnIHRvIHByb21vdGUgc2hvcnQganVtcHMgdG8gbG9uZwotICAgb25lcyB3aGVyZSBuZWNlc3NhcnkuICBTTUFMTCAoc2hvcnQpIGp1bXBzIG1heSBiZSBwcm9tb3RlZCB0byBCSUcKLSAgICgzMiBiaXQgbG9uZykgb25lcywgYW5kIFNNQUxMMTYganVtcHMgdG8gQklHMTYgKDE2IGJpdCBsb25nKS4gIFdlCi0gICBkb24ndCBhbGxvdyBhIHNob3J0IGp1bXAgaW4gYSAzMiBiaXQgY29kZSBzZWdtZW50IHRvIGJlIHByb21vdGVkIHRvCi0gICBhIDE2IGJpdCBvZmZzZXQganVtcCBiZWNhdXNlIGl0J3Mgc2xvd2VyIChyZXF1aXJlcyBkYXRhIHNpemUKLSAgIHByZWZpeCksIGFuZCBkb2Vzbid0IHdvcmssIHVubGVzcyB0aGUgZGVzdGluYXRpb24gaXMgaW4gdGhlIGJvdHRvbQotICAgNjRrIG9mIHRoZSBjb2RlIHNlZ21lbnQgKFRoZSB0b3AgMTYgYml0cyBvZiBlaXAgYXJlIHplcm9lZCkuICAqLwotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgLyogVGhlIGZpZWxkcyBhcmU6Ci0gICAgIDEpIG1vc3QgcG9zaXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgICA0KSB3aGljaCBpbmRleCBpbnRvIHRoZSB0YWJsZSB0byB0cnkgaWYgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBvbmUuCi0gICovCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MTI3ICsgMSwgLTEyOCArIDEsIDAsIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBCSUcpfSwKLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHMTYpfSwKLSAgLyogZHdvcmQgY29uZGl0aW9uYWxzIGFkZHMgNCBieXRlcyB0byBmcmFnOgotICAgICAxIGV4dHJhIG9wY29kZSBieXRlLCAzIGV4dHJhIGRpc3BsYWNlbWVudCBieXRlcy4gICovCi0gIHswLCAwLCA0LCAwfSwKLSAgLyogd29yZCBjb25kaXRpb25hbHMgYWRkIDIgYnl0ZXMgdG8gZnJhZzoKLSAgICAgMSBleHRyYSBvcGNvZGUgYnl0ZSwgMSBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZS4gICovCi0gIHswLCAwLCAyLCAwfSwKLQotICB7MTI3ICsgMSwgLTEyOCArIDEsIDAsIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRyl9LAotICB7MTI3ICsgMSwgLTEyOCArIDEsIDAsIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRzE2KX0sCi0gIC8qIGR3b3JkIGptcCBhZGRzIDMgYnl0ZXMgdG8gZnJhZzoKLSAgICAgMCBleHRyYSBvcGNvZGUgYnl0ZXMsIDMgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGVzLiAgKi8KLSAgezAsIDAsIDMsIDB9LAotICAvKiB3b3JkIGptcCBhZGRzIDEgYnl0ZSB0byBmcmFnOgotICAgICAwIGV4dHJhIG9wY29kZSBieXRlcywgMSBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZS4gICovCi0gIHswLCAwLCAxLCAwfQotCi19OwotCi0KLXZvaWQKLWkzODZfYWxpZ25fY29kZSAoZnJhZ1AsIGNvdW50KQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgLyogVmFyaW91cyBlZmZpY2llbnQgbm8tb3AgcGF0dGVybnMgZm9yIGFsaWduaW5nIGNvZGUgbGFiZWxzLiAgKi8KLSAgLyogTm90ZTogRG9uJ3QgdHJ5IHRvIGFzc2VtYmxlIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGNvbW1lbnRzLiAqLwotICAvKiAgICAgICAwTCBhbmQgMHcgYXJlIG5vdCBsZWdhbCAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMVtdID0KLSAgICB7MHg5MH07CQkJCQkvKiBub3AJCQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMltdID0KLSAgICB7MHg4OSwweGY2fTsJCQkJLyogbW92bCAlZXNpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzNbXSA9Ci0gICAgezB4OGQsMHg3NiwweDAwfTsJCQkJLyogbGVhbCAwKCVlc2kpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzRbXSA9Ci0gICAgezB4OGQsMHg3NCwweDI2LDB4MDB9OwkJCS8qIGxlYWwgMCglZXNpLDEpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzVbXSA9Ci0gICAgezB4OTAsCQkJCQkvKiBub3AJCQkqLwotICAgICAweDhkLDB4NzQsMHgyNiwweDAwfTsJCQkvKiBsZWFsIDAoJWVzaSwxKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl82W10gPQotICAgIHsweDhkLDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMH07CQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzdbXSA9Ci0gICAgezB4OGQsMHhiNCwweDI2LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlc2ksMSksJWVzaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfOFtdID0KLSAgICB7MHg5MCwJCQkJCS8qIG5vcAkJCSovCi0gICAgIDB4OGQsMHhiNCwweDI2LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlc2ksMSksJWVzaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfOVtdID0KLSAgICB7MHg4OSwweGY2LAkJCQkJLyogbW92bCAlZXNpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xMFtdID0KLSAgICB7MHg4ZCwweDc2LDB4MDAsCQkJCS8qIGxlYWwgMCglZXNpKSwlZXNpCSovCi0gICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTFbXSA9Ci0gICAgezB4OGQsMHg3NCwweDI2LDB4MDAsCQkJLyogbGVhbCAwKCVlc2ksMSksJWVzaQkqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzEyW10gPQotICAgIHsweDhkLDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMCwJCS8qIGxlYWwgMEwoJWVzaSksJWVzaQkqLwotICAgICAweDhkLDB4YmYsMHgwMCwweDAwLDB4MDAsMHgwMH07CQkvKiBsZWFsIDBMKCVlZGkpLCVlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzEzW10gPQotICAgIHsweDhkLDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMCwJCS8qIGxlYWwgMEwoJWVzaSksJWVzaQkqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzE0W10gPQotICAgIHsweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBsZWFsIDBMKCVlc2ksMSksJWVzaSAqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzE1W10gPQotICAgIHsweGViLDB4MGQsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAkvKiBqbXAgLisxNTsgbG90c2Egbm9wcwkqLwotICAgICAweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTB9OwotICBzdGF0aWMgY29uc3QgY2hhciBmMTZfM1tdID0KLSAgICB7MHg4ZCwweDc0LDB4MDB9OwkJCQkvKiBsZWEgMCglZXNpKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl80W10gPQotICAgIHsweDhkLDB4YjQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJXNpKSwlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzVbXSA9Ci0gICAgezB4OTAsCQkJCQkvKiBub3AJCQkqLwotICAgICAweDhkLDB4YjQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJXNpKSwlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzZbXSA9Ci0gICAgezB4ODksMHhmNiwJCQkJCS8qIG1vdiAlc2ksJXNpCQkqLwotICAgICAweDhkLDB4YmQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJWRpKSwlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzdbXSA9Ci0gICAgezB4OGQsMHg3NCwweDAwLAkJCQkvKiBsZWEgMCglc2kpLCVzaQkqLwotICAgICAweDhkLDB4YmQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJWRpKSwlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzhbXSA9Ci0gICAgezB4OGQsMHhiNCwweDAwLDB4MDAsCQkJLyogbGVhIDB3KCVzaSksJXNpCSovCi0gICAgIDB4OGQsMHhiZCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglZGkpLCVkaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZjMyX3BhdHRbXSA9IHsKLSAgICBmMzJfMSwgZjMyXzIsIGYzMl8zLCBmMzJfNCwgZjMyXzUsIGYzMl82LCBmMzJfNywgZjMyXzgsCi0gICAgZjMyXzksIGYzMl8xMCwgZjMyXzExLCBmMzJfMTIsIGYzMl8xMywgZjMyXzE0LCBmMzJfMTUKLSAgfTsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGYxNl9wYXR0W10gPSB7Ci0gICAgZjMyXzEsIGYzMl8yLCBmMTZfMywgZjE2XzQsIGYxNl81LCBmMTZfNiwgZjE2XzcsIGYxNl84LAotICAgIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNQotICB9OwotCi0gIGlmIChjb3VudCA+IDAgJiYgY291bnQgPD0gMTUpCi0gICAgewotICAgICAgaWYgKGZsYWdfMTZiaXRfY29kZSkKLQl7Ci0JICBtZW1jcHkoZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LAotCQkgZjE2X3BhdHRbY291bnQgLSAxXSwgY291bnQpOwotCSAgaWYgKGNvdW50ID4gOCkgLyogYWRqdXN0IGp1bXAgb2Zmc2V0ICovCi0JICAgIGZyYWdQLT5mcl9saXRlcmFsW2ZyYWdQLT5mcl9maXggKyAxXSA9IGNvdW50IC0gMjsKLQl9Ci0gICAgICBlbHNlCi0JbWVtY3B5KGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeCwKLQkgICAgICAgZjMyX3BhdHRbY291bnQgLSAxXSwgY291bnQpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IGNvdW50OwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKm91dHB1dF9pbnZhbGlkIFBBUkFNUyAoKGludCBjKSk7Ci1zdGF0aWMgaW50IGkzODZfb3BlcmFuZCBQQVJBTVMgKChjaGFyICpvcGVyYW5kX3N0cmluZykpOwotc3RhdGljIGludCBpMzg2X2ludGVsX29wZXJhbmQgUEFSQU1TICgoY2hhciAqb3BlcmFuZF9zdHJpbmcsIGludCBnb3RfYV9mbG9hdCkpOwotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSAqcGFyc2VfcmVnaXN0ZXIgUEFSQU1TICgoY2hhciAqcmVnX3N0cmluZywKLQkJCQkJCWNoYXIgKiplbmRfb3ApKTsKLQotI2lmbmRlZiBJMzg2Q09GRgotc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotc3ltYm9sUyAqR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iICovCi0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1tb2RlX2Zyb21fZGlzcF9zaXplICh0KQotICAgICB1bnNpZ25lZCBpbnQgdDsKLXsKLSAgcmV0dXJuICh0ICYgRGlzcDgpID8gMSA6ICh0ICYgKERpc3AxNnxEaXNwMzIpKSA/IDIgOiAwOwotfQotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl9zaWduZWRfYnl0ZSAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSAgcmV0dXJuIChudW0gPj0gLTEyOCkgJiYgKG51bSA8PSAxMjcpOwotfQkJCQkvKiBmaXRzX2luX3NpZ25lZF9ieXRlKCkgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWZpdHNfaW5fdW5zaWduZWRfYnl0ZSAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSAgcmV0dXJuIChudW0gJiAweGZmKSA9PSBudW07Ci19CQkJCS8qIGZpdHNfaW5fdW5zaWduZWRfYnl0ZSgpICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1maXRzX2luX3Vuc2lnbmVkX3dvcmQgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAobnVtICYgMHhmZmZmKSA9PSBudW07Ci19CQkJCS8qIGZpdHNfaW5fdW5zaWduZWRfd29yZCgpICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1maXRzX2luX3NpZ25lZF93b3JkIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotICByZXR1cm4gKC0zMjc2OCA8PSBudW0pICYmIChudW0gPD0gMzI3NjcpOwotfQkJCQkvKiBmaXRzX2luX3NpZ25lZF93b3JkKCkgKi8KLQotc3RhdGljIGludAotc21hbGxlc3RfaW1tX3R5cGUgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0jaWYgMAotICAvKiBUaGlzIGNvZGUgaXMgZGlzYWJsZWQgYmVjYXVzZSBhbGwgdGhlIEltbTEgZm9ybXMgaW4gdGhlIG9wY29kZSB0YWJsZQotICAgICBhcmUgc2xvd2VyIG9uIHRoZSBpNDg2LCBhbmQgdGhleSdyZSB0aGUgdmVyc2lvbnMgd2l0aCB0aGUgaW1wbGljaXRseQotICAgICBzcGVjaWZpZWQgc2luZ2xlLXBvc2l0aW9uIGRpc3BsYWNlbWVudCwgd2hpY2ggaGFzIGFub3RoZXIgc3ludGF4IGlmCi0gICAgIHlvdSByZWFsbHkgd2FudCB0byB1c2UgdGhhdCBmb3JtLiAgSWYgeW91IHJlYWxseSBwcmVmZXIgdG8gaGF2ZSB0aGUKLSAgICAgb25lLWJ5dGUtc2hvcnRlciBJbW0xIGZvcm0gZGVzcGl0ZSB0aGVzZSBwcm9ibGVtcywgcmUtZW5hYmxlIHRoaXMKLSAgICAgY29kZS4gICovCi0gIGlmIChudW0gPT0gMSkKLSAgICByZXR1cm4gSW1tMSB8IEltbTggfCBJbW04UyB8IEltbTE2IHwgSW1tMzI7Ci0jZW5kaWYKLSAgcmV0dXJuIChmaXRzX2luX3NpZ25lZF9ieXRlIChudW0pCi0JICA/IChJbW04UyB8IEltbTggfCBJbW0xNiB8IEltbTMyKQotCSAgOiBmaXRzX2luX3Vuc2lnbmVkX2J5dGUgKG51bSkKLQkgID8gKEltbTggfCBJbW0xNiB8IEltbTMyKQotCSAgOiAoZml0c19pbl9zaWduZWRfd29yZCAobnVtKSB8fCBmaXRzX2luX3Vuc2lnbmVkX3dvcmQgKG51bSkpCi0JICA/IChJbW0xNiB8IEltbTMyKQotCSAgOiAoSW1tMzIpKTsKLX0JCQkJLyogc21hbGxlc3RfaW1tX3R5cGUoKSAqLwotCi0vKiBSZXR1cm5zIDAgaWYgYXR0ZW1wdGluZyB0byBhZGQgYSBwcmVmaXggd2hlcmUgb25lIGZyb20gdGhlIHNhbWUKLSAgIGNsYXNzIGFscmVhZHkgZXhpc3RzLCAxIGlmIG5vbiByZXAvcmVwbmUgYWRkZWQsIDIgaWYgcmVwL3JlcG5lCi0gICBhZGRlZC4gICovCi1zdGF0aWMgaW50Ci1hZGRfcHJlZml4IChwcmVmaXgpCi0gICAgIHVuc2lnbmVkIGludCBwcmVmaXg7Ci17Ci0gIGludCByZXQgPSAxOwotICBpbnQgcTsKLQotICBzd2l0Y2ggKHByZWZpeCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBDU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgRFNfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIEVTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBGU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgR1NfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIFNTX1BSRUZJWF9PUENPREU6Ci0gICAgICBxID0gU0VHX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVBORV9QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgUkVQRV9QUkVGSVhfT1BDT0RFOgotICAgICAgcmV0ID0gMjsKLSAgICAgIC8qIGZhbGwgdGhydSAqLwotICAgIGNhc2UgTE9DS19QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IExPQ0tSRVBfUFJFRklYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZXQUlUX09QQ09ERToKLSAgICAgIHEgPSBXQUlUX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBRERSX1BSRUZJWF9PUENPREU6Ci0gICAgICBxID0gQUREUl9QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREFUQV9QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IERBVEFfUFJFRklYOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChpLnByZWZpeFtxXSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInNhbWUgdHlwZSBvZiBwcmVmaXggdXNlZCB0d2ljZSIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpLnByZWZpeGVzICs9IDE7Ci0gIGkucHJlZml4W3FdID0gcHJlZml4OwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZAotc2V0XzE2Yml0X2NvZGVfZmxhZyAobmV3XzE2Yml0X2NvZGVfZmxhZykKLSAgICAgaW50IG5ld18xNmJpdF9jb2RlX2ZsYWc7Ci17Ci0gIGZsYWdfMTZiaXRfY29kZSA9IG5ld18xNmJpdF9jb2RlX2ZsYWc7Ci0gIHN0YWNrb3Bfc2l6ZSA9ICdcMCc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfMTZiaXRfZ2NjX2NvZGVfZmxhZyAobmV3XzE2Yml0X2NvZGVfZmxhZykKLSAgICAgaW50IG5ld18xNmJpdF9jb2RlX2ZsYWc7Ci17Ci0gIGZsYWdfMTZiaXRfY29kZSA9IG5ld18xNmJpdF9jb2RlX2ZsYWc7Ci0gIHN0YWNrb3Bfc2l6ZSA9IG5ld18xNmJpdF9jb2RlX2ZsYWcgPyAnbCcgOiAnXDAnOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2ludGVsX3N5bnRheCAoc3ludGF4X2ZsYWcpCi0gICAgIGludCBzeW50YXhfZmxhZzsKLXsKLSAgLyogRmluZCBvdXQgaWYgcmVnaXN0ZXIgcHJlZml4aW5nIGlzIHNwZWNpZmllZC4gICovCi0gIGludCBhc2tfbmFrZWRfcmVnID0gMDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBjaGFyICpzdHJpbmcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnQgZSA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgICBpZiAoc3RyY21wKHN0cmluZywgInByZWZpeCIpID09IDApCi0JYXNrX25ha2VkX3JlZyA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoc3RyaW5nLCAibm9wcmVmaXgiKSA9PSAwKQotCWFza19uYWtlZF9yZWcgPSAtMTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIkJhZCBhcmd1bWVudCB0byBzeW50YXggZGlyZWN0aXZlLiIpKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBlOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpbnRlbF9zeW50YXggPSBzeW50YXhfZmxhZzsKLQotICBpZiAoYXNrX25ha2VkX3JlZyA9PSAwKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBhbGxvd19uYWtlZF9yZWcgPSAoaW50ZWxfc3ludGF4Ci0JCQkgJiYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoc3Rkb3V0cHV0KSAhPSAnXDAnKSk7Ci0jZWxzZQotICAgICAgYWxsb3dfbmFrZWRfcmVnID0gMDsgLyogY29uc2VydmF0aXZlIGRlZmF1bHQgKi8KLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIGFsbG93X25ha2VkX3JlZyA9IChhc2tfbmFrZWRfcmVnIDwgMCk7Ci19Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0jaWZuZGVmIEkzODZDT0ZGCi0gIHsiYnNzIiwgc19ic3MsIDB9LAotI2VuZGlmCi0jaWYgIWRlZmluZWQoT0JKX0FPVVQpICYmICFkZWZpbmVkKFVTRV9BTElHTl9QVFdPKQotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0jZWxzZQotICB7ImFsaWduIiwgc19hbGlnbl9wdHdvLCAwfSwKLSNlbmRpZgotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZGZsb2F0IiwgZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJ0ZmxvYXQiLCBmbG9hdF9jb25zLCAneCd9LAotICB7InZhbHVlIiwgY29ucywgMn0sCi0gIHsibm9vcHQiLCBzX2lnbm9yZSwgMH0sCi0gIHsib3B0aW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsiY29kZTE2Z2NjIiwgc2V0XzE2Yml0X2djY19jb2RlX2ZsYWcsIDF9LAotICB7ImNvZGUxNiIsIHNldF8xNmJpdF9jb2RlX2ZsYWcsIDF9LAotICB7ImNvZGUzMiIsIHNldF8xNmJpdF9jb2RlX2ZsYWcsIDB9LAotICB7ImludGVsX3N5bnRheCIsIHNldF9pbnRlbF9zeW50YXgsIDF9LAotICB7ImF0dF9zeW50YXgiLCBzZXRfaW50ZWxfc3ludGF4LCAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi0vKiBmb3IgaW50ZXJmYWNlIHdpdGggZXhwcmVzc2lvbiAoKSAqLwotZXh0ZXJuIGNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsKLQotLyogaGFzaCB0YWJsZSBmb3IgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLS8qIGhhc2ggdGFibGUgZm9yIHJlZ2lzdGVyIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnJlZ19oYXNoOwotDAotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpoYXNoX2VycjsKLQotICAvKiBpbml0aWFsaXplIG9wX2hhc2ggaGFzaCB0YWJsZSAqLwotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgewotICAgIHJlZ2lzdGVyIGNvbnN0IHRlbXBsYXRlICpvcHRhYjsKLSAgICByZWdpc3RlciB0ZW1wbGF0ZXMgKmNvcmVfb3B0YWI7Ci0KLSAgICBvcHRhYiA9IGkzODZfb3B0YWI7CQkvKiBzZXR1cCBmb3IgbG9vcCAqLwotICAgIGNvcmVfb3B0YWIgPSAodGVtcGxhdGVzICopIHhtYWxsb2MgKHNpemVvZiAodGVtcGxhdGVzKSk7Ci0gICAgY29yZV9vcHRhYi0+c3RhcnQgPSBvcHRhYjsKLQotICAgIHdoaWxlICgxKQotICAgICAgewotCSsrb3B0YWI7Ci0JaWYgKG9wdGFiLT5uYW1lID09IE5VTEwKLQkgICAgfHwgc3RyY21wIChvcHRhYi0+bmFtZSwgKG9wdGFiIC0gMSktPm5hbWUpICE9IDApCi0JICB7Ci0JICAgIC8qIGRpZmZlcmVudCBuYW1lIC0tPiBzaGlwIG91dCBjdXJyZW50IHRlbXBsYXRlIGxpc3Q7Ci0JICAgICAgIGFkZCB0byBoYXNoIHRhYmxlOyAmIGJlZ2luIGFuZXcgKi8KLQkgICAgY29yZV9vcHRhYi0+ZW5kID0gb3B0YWI7Ci0JICAgIGhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsCi0JCQkJICAgIChvcHRhYiAtIDEpLT5uYW1lLAotCQkJCSAgICAoUFRSKSBjb3JlX29wdGFiKTsKLQkgICAgaWYgKGhhc2hfZXJyKQotCSAgICAgIHsKLQkgICAgICBoYXNoX2Vycm9yOgotCQlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIpLAotCQkJICAob3B0YWIgLSAxKS0+bmFtZSwKLQkJCSAgaGFzaF9lcnIpOwotCSAgICAgIH0KLQkgICAgaWYgKG9wdGFiLT5uYW1lID09IE5VTEwpCi0JICAgICAgYnJlYWs7Ci0JICAgIGNvcmVfb3B0YWIgPSAodGVtcGxhdGVzICopIHhtYWxsb2MgKHNpemVvZiAodGVtcGxhdGVzKSk7Ci0JICAgIGNvcmVfb3B0YWItPnN0YXJ0ID0gb3B0YWI7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBpbml0aWFsaXplIHJlZ19oYXNoIGhhc2ggdGFibGUgKi8KLSAgcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIHJlZ2lzdGVyIGNvbnN0IHJlZ19lbnRyeSAqcmVndGFiOwotCi0gICAgZm9yIChyZWd0YWIgPSBpMzg2X3JlZ3RhYjsKLQkgcmVndGFiIDwgaTM4Nl9yZWd0YWIgKyBzaXplb2YgKGkzODZfcmVndGFiKSAvIHNpemVvZiAoaTM4Nl9yZWd0YWJbMF0pOwotCSByZWd0YWIrKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChyZWdfaGFzaCwgcmVndGFiLT5yZWdfbmFtZSwgKFBUUikgcmVndGFiKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBnb3RvIGhhc2hfZXJyb3I7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBmaWxsIGluIGxleGljYWwgdGFibGVzOiAgbW5lbW9uaWNfY2hhcnMsIG9wZXJhbmRfY2hhcnMuICAqLwotICB7Ci0gICAgcmVnaXN0ZXIgaW50IGM7Ci0gICAgcmVnaXN0ZXIgY2hhciAqcDsKLQotICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykKLSAgICAgIHsKLQlpZiAoaXNkaWdpdCAoYykpCi0JICB7Ci0JICAgIGRpZ2l0X2NoYXJzW2NdID0gYzsKLQkgICAgbW5lbW9uaWNfY2hhcnNbY10gPSBjOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCSAgfQotCWVsc2UgaWYgKGlzbG93ZXIgKGMpKQotCSAgewotCSAgICBtbmVtb25pY19jaGFyc1tjXSA9IGM7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gYzsKLQkgICAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0JZWxzZSBpZiAoaXN1cHBlciAoYykpCi0JICB7Ci0JICAgIG1uZW1vbmljX2NoYXJzW2NdID0gdG9sb3dlciAoYyk7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gbW5lbW9uaWNfY2hhcnNbY107Ci0JICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCSAgfQotCi0JaWYgKGlzYWxwaGEgKGMpIHx8IGlzZGlnaXQgKGMpKQotCSAgaWRlbnRpZmllcl9jaGFyc1tjXSA9IGM7Ci0JZWxzZSBpZiAoYyA+PSAxMjgpCi0JICB7Ci0JICAgIGlkZW50aWZpZXJfY2hhcnNbY10gPSBjOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLSAgICAgIH0KLQotI2lmZGVmIExFWF9BVAotICAgIGlkZW50aWZpZXJfY2hhcnNbJ0AnXSA9ICdAJzsKLSNlbmRpZgotICAgIGRpZ2l0X2NoYXJzWyctJ10gPSAnLSc7Ci0gICAgaWRlbnRpZmllcl9jaGFyc1snXyddID0gJ18nOwotICAgIGlkZW50aWZpZXJfY2hhcnNbJy4nXSA9ICcuJzsKLQotICAgIGZvciAocCA9IG9wZXJhbmRfc3BlY2lhbF9jaGFyczsgKnAgIT0gJ1wwJzsgcCsrKQotICAgICAgb3BlcmFuZF9jaGFyc1sodW5zaWduZWQgY2hhcikgKnBdID0gKnA7Ci0gIH0KLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgcmVjb3JkX2FsaWdubWVudCAodGV4dF9zZWN0aW9uLCAyKTsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKGRhdGFfc2VjdGlvbiwgMik7Ci0gICAgICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgMik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXZvaWQKLWkzODZfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAiaTM4NiBvcGNvZGUiLCBvcF9oYXNoKTsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAiaTM4NiByZWdpc3RlciIsIHJlZ19oYXNoKTsKLX0KLQwKLQotI2lmZGVmIERFQlVHMzg2Ci0KLS8qIGRlYnVnZ2luZyByb3V0aW5lcyBmb3IgbWRfYXNzZW1ibGUgKi8KLXN0YXRpYyB2b2lkIHBpIFBBUkFNUyAoKGNoYXIgKiwgaTM4Nl9pbnNuICopKTsKLXN0YXRpYyB2b2lkIHB0ZSBQQVJBTVMgKCh0ZW1wbGF0ZSAqKSk7Ci1zdGF0aWMgdm9pZCBwdCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHBlIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIHBzIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi1zdGF0aWMgdm9pZAotcGkgKGxpbmUsIHgpCi0gICAgIGNoYXIgKmxpbmU7Ci0gICAgIGkzODZfaW5zbiAqeDsKLXsKLSAgcmVnaXN0ZXIgdGVtcGxhdGUgKnA7Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0ZG91dCwgIiVzOiB0ZW1wbGF0ZSAiLCBsaW5lKTsKLSAgcHRlICgmeC0+dG0pOwotICBmcHJpbnRmIChzdGRvdXQsICIgIG1vZHJtOiAgbW9kZSAleCAgcmVnICV4ICByZWcvbWVtICV4IiwKLQkgICB4LT5ybS5tb2RlLCB4LT5ybS5yZWcsIHgtPnJtLnJlZ21lbSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIiBiYXNlICV4ICBpbmRleCAleCAgc2NhbGUgJXhcbiIsCi0JICAgeC0+YmkuYmFzZSwgeC0+YmkuaW5kZXgsIHgtPmJpLnNjYWxlKTsKLSAgZm9yIChpID0gMDsgaSA8IHgtPm9wZXJhbmRzOyBpKyspCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiICAgICMlZDogICIsIGkgKyAxKTsKLSAgICAgIHB0ICh4LT50eXBlc1tpXSk7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotICAgICAgaWYgKHgtPnR5cGVzW2ldCi0JICAmIChSZWcgfCBTUmVnMiB8IFNSZWczIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCB8IFJlZ01NWCB8IFJlZ1hNTSkpCi0JZnByaW50ZiAoc3Rkb3V0LCAiJXNcbiIsIHgtPnJlZ3NbaV0tPnJlZ19uYW1lKTsKLSAgICAgIGlmICh4LT50eXBlc1tpXSAmIEltbSkKLQlwZSAoeC0+aW1tc1tpXSk7Ci0gICAgICBpZiAoeC0+dHlwZXNbaV0gJiBEaXNwKQotCXBlICh4LT5kaXNwc1tpXSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHRlICh0KQotICAgICB0ZW1wbGF0ZSAqdDsKLXsKLSAgaW50IGk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIiAlZCBvcGVyYW5kcyAiLCB0LT5vcGVyYW5kcyk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIm9wY29kZSAleCAiLAotCSAgIHQtPmJhc2Vfb3Bjb2RlKTsKLSAgaWYgKHQtPmV4dGVuc2lvbl9vcGNvZGUgIT0gTm9uZSkKLSAgICBmcHJpbnRmIChzdGRvdXQsICJleHQgJXggIiwgdC0+ZXh0ZW5zaW9uX29wY29kZSk7Ci0gIGlmICh0LT5vcGNvZGVfbW9kaWZpZXIgJiBEKQotICAgIGZwcmludGYgKHN0ZG91dCwgIkQiKTsKLSAgaWYgKHQtPm9wY29kZV9tb2RpZmllciAmIFcpCi0gICAgZnByaW50ZiAoc3Rkb3V0LCAiVyIpOwotICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotICBmb3IgKGkgPSAwOyBpIDwgdC0+b3BlcmFuZHM7IGkrKykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgIyVkIHR5cGUgIiwgaSArIDEpOwotICAgICAgcHQgKHQtPm9wZXJhbmRfdHlwZXNbaV0pOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wZSAoZSkKLSAgICAgZXhwcmVzc2lvblMgKmU7Ci17Ci0gIGZwcmludGYgKHN0ZG91dCwgIiAgICBvcGVyYXRpb24gICAgICVkXG4iLCBlLT5YX29wKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiICAgIGFkZF9udW1iZXIgICAgJWxkICglbHgpXG4iLAotCSAgIChsb25nKSBlLT5YX2FkZF9udW1iZXIsIChsb25nKSBlLT5YX2FkZF9udW1iZXIpOwotICBpZiAoZS0+WF9hZGRfc3ltYm9sKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICBhZGRfc3ltYm9sICAgICIpOwotICAgICAgcHMgKGUtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotICAgIH0KLSAgaWYgKGUtPlhfb3Bfc3ltYm9sKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICBvcF9zeW1ib2wgICAgIik7Ci0gICAgICBwcyAoZS0+WF9vcF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiJXMgdHlwZSAlcyVzIiwKLQkgICBTX0dFVF9OQU1FIChzKSwKLQkgICBTX0lTX0VYVEVSTkFMIChzKSA/ICJFWFRFUk5BTCAiIDogIiIsCi0JICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzKSkpOwotfQotCi1zdHJ1Y3QgdHlwZV9uYW1lCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbWFzazsKLSAgICBjaGFyICp0bmFtZTsKLSAgfQotCi10eXBlX25hbWVzW10gPQotewotICB7IFJlZzgsICJyOCIgfSwKLSAgeyBSZWcxNiwgInIxNiIgfSwKLSAgeyBSZWczMiwgInIzMiIgfSwKLSAgeyBJbW04LCAiaTgiIH0sCi0gIHsgSW1tOFMsICJpOHMiIH0sCi0gIHsgSW1tMTYsICJpMTYiIH0sCi0gIHsgSW1tMzIsICJpMzIiIH0sCi0gIHsgSW1tMSwgImkxIiB9LAotICB7IEJhc2VJbmRleCwgIkJhc2VJbmRleCIgfSwKLSAgeyBEaXNwOCwgImQ4IiB9LAotICB7IERpc3AxNiwgImQxNiIgfSwKLSAgeyBEaXNwMzIsICJkMzIiIH0sCi0gIHsgSW5PdXRQb3J0UmVnLCAiSW5PdXRQb3J0UmVnIiB9LAotICB7IFNoaWZ0Q291bnQsICJTaGlmdENvdW50IiB9LAotICB7IENvbnRyb2wsICJjb250cm9sIHJlZyIgfSwKLSAgeyBUZXN0LCAidGVzdCByZWciIH0sCi0gIHsgRGVidWcsICJkZWJ1ZyByZWciIH0sCi0gIHsgRmxvYXRSZWcsICJGUmVnIiB9LAotICB7IEZsb2F0QWNjLCAiRkFjYyIgfSwKLSAgeyBTUmVnMiwgIlNSZWcyIiB9LAotICB7IFNSZWczLCAiU1JlZzMiIH0sCi0gIHsgQWNjLCAiQWNjIiB9LAotICB7IEp1bXBBYnNvbHV0ZSwgIkp1bXAgQWJzb2x1dGUiIH0sCi0gIHsgUmVnTU1YLCAick1NWCIgfSwKLSAgeyBSZWdYTU0sICJyWE1NIiB9LAotICB7IEVzU2VnLCAiZXMiIH0sCi0gIHsgMCwgIiIgfQotfTsKLQotc3RhdGljIHZvaWQKLXB0ICh0KQotICAgICB1bnNpZ25lZCBpbnQgdDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHR5cGVfbmFtZSAqdHk7Ci0KLSAgaWYgKHQgPT0gVW5rbm93bikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsIF8oIlVua25vd24iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yICh0eSA9IHR5cGVfbmFtZXM7IHR5LT5tYXNrOyB0eSsrKQotCWlmICh0ICYgdHktPm1hc2spCi0JICBmcHJpbnRmIChzdGRvdXQsICIlcywgIiwgdHktPnRuYW1lKTsKLSAgICB9Ci0gIGZmbHVzaCAoc3Rkb3V0KTsKLX0KLQotI2VuZGlmIC8qIERFQlVHMzg2ICovCi0MCi1pbnQKLXRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgc3RydWN0IGZpeCAqZml4cDsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci0jZWxzZQotICAvKiBGb3IgQ09GRiAqLwotICByZXR1cm4gZml4cC0+Znhfcl90eXBlPT03OwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jCi0gIFBBUkFNUyAoKGludCwgaW50LCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotcmVsb2MgKHNpemUsIHBjcmVsLCBvdGhlcikKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBwY3JlbDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIG90aGVyOwotewotICBpZiAob3RoZXIgIT0gTk9fUkVMT0MpIHJldHVybiBvdGhlcjsKLQotICBpZiAocGNyZWwpCi0gICAgewotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6IHJldHVybiBCRkRfUkVMT0NfOF9QQ1JFTDsKLQljYXNlIDI6IHJldHVybiBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JY2FzZSA0OiByZXR1cm4gQkZEX1JFTE9DXzMyX1BDUkVMOwotCX0KLSAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6IHJldHVybiBCRkRfUkVMT0NfODsKLQljYXNlIDI6IHJldHVybiBCRkRfUkVMT0NfMTY7Ci0JY2FzZSA0OiByZXR1cm4gQkZEX1JFTE9DXzMyOwotCX0KLSAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyoKLSAqIEhlcmUgd2UgZGVjaWRlIHdoaWNoIGZpeHVwcyBjYW4gYmUgYWRqdXN0ZWQgdG8gbWFrZSB0aGVtIHJlbGF0aXZlIHRvCi0gKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIGluc3RlYWQgb2YgdGhlIHN5bWJvbC4gIEJhc2ljYWxseSB3ZSBuZWVkCi0gKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgZG9uZSBjb3JyZWN0bHksIHNvIGluCi0gKiBzb21lIGNhc2VzIHdlIGZvcmNlIHRoZSBvcmlnaW5hbCBzeW1ib2wgdG8gYmUgdXNlZC4KLSAqLwotaW50Ci10Y19pMzg2X2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKFRFX1BFKQotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scywgb3IgZWxzZSBkeW5hbWljCi0gICAgIGxpbmtpbmcgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuICAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0gIC8qIGFkanVzdF9yZWxvY19zeW1zIGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgR09UICovCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzg2X1BMVDMyCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9HT1QzMgotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19SVkEKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLSNlbHNlCi0jZGVmaW5lIHJlbG9jKFNJWkUsUENSRUwsT1RIRVIpCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzE2CQkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zMgkJMAotI2RlZmluZSBCRkRfUkVMT0NfMTZfUENSRUwJMAotI2RlZmluZSBCRkRfUkVMT0NfMzJfUENSRUwJMAotI2RlZmluZSBCRkRfUkVMT0NfMzg2X1BMVDMyCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzM4Nl9HT1QzMgkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zODZfR09UT0ZGCTAKLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1pbnRlbF9mbG9hdF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKm1uZW1vbmljKSk7Ci0KLXN0YXRpYyBpbnQKLWludGVsX2Zsb2F0X29wZXJhbmQgKG1uZW1vbmljKQotICAgICBjaGFyICptbmVtb25pYzsKLXsKLSAgaWYgKG1uZW1vbmljWzBdID09ICdmJyAmJiBtbmVtb25pY1sxXSA9PSdpJykKLSAgICByZXR1cm4gMDsKLQotICBpZiAobW5lbW9uaWNbMF0gPT0gJ2YnKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBMSU5FIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChsaW5lKQotICAgICBjaGFyICpsaW5lOwotewotICAvKiBQb2ludHMgdG8gdGVtcGxhdGUgb25jZSB3ZSd2ZSBmb3VuZCBpdC4gKi8KLSAgY29uc3QgdGVtcGxhdGUgKnQ7Ci0KLSAgLyogQ291bnQgdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIGdlbmVyYXRlZC4gICovCi0gIGludCBpbnNuX3NpemUgPSAwOwotCi0gIGludCBqOwotCi0gIGNoYXIgbW5lbW9uaWNbTUFYX01ORU1fU0laRV07Ci0KLSAgLyogSW5pdGlhbGl6ZSBnbG9iYWxzLiAqLwotICBtZW1zZXQgKCZpLCAnXDAnLCBzaXplb2YgKGkpKTsKLSAgZm9yIChqID0gMDsgaiA8IE1BWF9PUEVSQU5EUzsgaisrKQotICAgIGkuZGlzcF9yZWxvY1tqXSA9IE5PX1JFTE9DOwotICBtZW1zZXQgKGRpc3BfZXhwcmVzc2lvbnMsICdcMCcsIHNpemVvZiAoZGlzcF9leHByZXNzaW9ucykpOwotICBtZW1zZXQgKGltX2V4cHJlc3Npb25zLCAnXDAnLCBzaXplb2YgKGltX2V4cHJlc3Npb25zKSk7Ci0gIHNhdmVfc3RhY2tfcCA9IHNhdmVfc3RhY2s7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KLQotICAvKiBGaXJzdCBwYXJzZSBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYyAmIGNhbGwgaTM4Nl9vcGVyYW5kIGZvciB0aGUgb3BlcmFuZHMuCi0gICAgIFdlIGFzc3VtZSB0aGF0IHRoZSBzY3J1YmJlciBoYXMgYXJyYW5nZWQgaXQgc28gdGhhdCBsaW5lWzBdIGlzIHRoZSB2YWxpZAotICAgICBzdGFydCBvZiBhIChwb3NzaWJseSBwcmVmaXhlZCkgbW5lbW9uaWMuICovCi0gIHsKLSAgICBjaGFyICpsID0gbGluZTsKLSAgICBjaGFyICp0b2tlbl9zdGFydCA9IGw7Ci0gICAgY2hhciAqbW5lbV9wOwotCi0gICAgLyogTm9uLXplcm8gaWYgd2UgZm91bmQgYSBwcmVmaXggb25seSBhY2NlcHRhYmxlIHdpdGggc3RyaW5nIGluc25zLiAqLwotICAgIGNvbnN0IGNoYXIgKmV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24gPSBOVUxMOwotCi0gICAgd2hpbGUgKDEpCi0gICAgICB7Ci0JbW5lbV9wID0gbW5lbW9uaWM7Ci0Jd2hpbGUgKCgqbW5lbV9wID0gbW5lbW9uaWNfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpsXSkgIT0gMCkKLQkgIHsKLQkgICAgbW5lbV9wKys7Ci0JICAgIGlmIChtbmVtX3AgPj0gbW5lbW9uaWMgKyBzaXplb2YgKG1uZW1vbmljKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygibm8gc3VjaCAzODYgaW5zdHJ1Y3Rpb246IGAlcyciKSwgdG9rZW5fc3RhcnQpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBsKys7Ci0JICB9Ci0JaWYgKCFpc19zcGFjZV9jaGFyICgqbCkKLQkgICAgJiYgKmwgIT0gRU5EX09GX0lOU04KLQkgICAgJiYgKmwgIT0gUFJFRklYX1NFUEFSQVRPUikKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBtbmVtb25pYyIpLAotCQkgICAgb3V0cHV0X2ludmFsaWQgKCpsKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLQlpZiAodG9rZW5fc3RhcnQgPT0gbCkKLQkgIHsKLQkgICAgaWYgKCpsID09IFBSRUZJWF9TRVBBUkFUT1IpCi0JICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgcHJlZml4OyBnb3Qgbm90aGluZyIpKTsKLQkgICAgZWxzZQotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIG1uZW1vbmljOyBnb3Qgbm90aGluZyIpKTsKLQkgICAgcmV0dXJuOwotCSAgfQotCi0JLyogTG9vayB1cCBpbnN0cnVjdGlvbiAob3IgcHJlZml4KSB2aWEgaGFzaCB0YWJsZS4gICovCi0JY3VycmVudF90ZW1wbGF0ZXMgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG1uZW1vbmljKTsKLQotCWlmICgqbCAhPSBFTkRfT0ZfSU5TTgotCSAgICAmJiAoISBpc19zcGFjZV9jaGFyICgqbCkgfHwgbFsxXSAhPSBFTkRfT0ZfSU5TTikKLQkgICAgJiYgY3VycmVudF90ZW1wbGF0ZXMKLQkgICAgJiYgKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNQcmVmaXgpKQotCSAgewotCSAgICAvKiBJZiB3ZSBhcmUgaW4gMTYtYml0IG1vZGUsIGRvIG5vdCBhbGxvdyBhZGRyMTYgb3IgZGF0YTE2LgotCSAgICAgICBTaW1pbGFybHksIGluIDMyLWJpdCBtb2RlLCBkbyBub3QgYWxsb3cgYWRkcjMyIG9yIGRhdGEzMi4gICovCi0JICAgIGlmICgoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiAoU2l6ZTE2IHwgU2l6ZTMyKSkKLQkJJiYgKCgoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBTaXplMzIpICE9IDApCi0JCSAgICBeIGZsYWdfMTZiaXRfY29kZSkpCi0JICAgICAgewotCQlhc19iYWQgKF8oInJlZHVuZGFudCAlcyBwcmVmaXgiKSwKLQkJCWN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIC8qIEFkZCBwcmVmaXgsIGNoZWNraW5nIGZvciByZXBlYXRlZCBwcmVmaXhlcy4gICovCi0JICAgIHN3aXRjaCAoYWRkX3ByZWZpeCAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5iYXNlX29wY29kZSkpCi0JICAgICAgewotCSAgICAgIGNhc2UgMDoKLQkJcmV0dXJuOwotCSAgICAgIGNhc2UgMjoKLQkJZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbiA9Ci0JCSAgY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIFNraXAgcGFzdCBQUkVGSVhfU0VQQVJBVE9SIGFuZCByZXNldCB0b2tlbl9zdGFydC4gICovCi0JICAgIHRva2VuX3N0YXJ0ID0gKytsOwotCSAgfQotCWVsc2UKLQkgIGJyZWFrOwotICAgICAgfQotCi0gICAgaWYgKCFjdXJyZW50X3RlbXBsYXRlcykKLSAgICAgIHsKLQkvKiBTZWUgaWYgd2UgY2FuIGdldCBhIG1hdGNoIGJ5IHRyaW1taW5nIG9mZiBhIHN1ZmZpeC4gICovCi0Jc3dpdGNoIChtbmVtX3BbLTFdKQotCSAgewotCSAgY2FzZSBEV09SRF9NTkVNX1NVRkZJWDoKLQkgIGNhc2UgV09SRF9NTkVNX1NVRkZJWDoKLQkgIGNhc2UgQllURV9NTkVNX1NVRkZJWDoKLQkgIGNhc2UgU0hPUlRfTU5FTV9TVUZGSVg6Ci0jaWYgTE9OR19NTkVNX1NVRkZJWCAhPSBEV09SRF9NTkVNX1NVRkZJWAotCSAgY2FzZSBMT05HX01ORU1fU1VGRklYOgotI2VuZGlmCi0JICAgIGkuc3VmZml4ID0gbW5lbV9wWy0xXTsKLQkgICAgbW5lbV9wWy0xXSA9ICdcMCc7Ci0JICAgIGN1cnJlbnRfdGVtcGxhdGVzID0gaGFzaF9maW5kIChvcF9oYXNoLCBtbmVtb25pYyk7Ci0JICAgIGJyZWFrOwotCi0JICAvKiBJbnRlbCBTeW50YXggKi8KLQkgIGNhc2UgSU5URUxfRFdPUkRfTU5FTV9TVUZGSVg6Ci0JICAgIGlmIChpbnRlbF9zeW50YXgpCi0JICAgICAgewotCQlpLnN1ZmZpeCA9IG1uZW1fcFstMV07Ci0JCW1uZW1fcFstMV0gPSAnXDAnOwotCQljdXJyZW50X3RlbXBsYXRlcyA9IGhhc2hfZmluZCAob3BfaGFzaCwgbW5lbW9uaWMpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKCFjdXJyZW50X3RlbXBsYXRlcykKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJubyBzdWNoIDM4NiBpbnN0cnVjdGlvbjogYCVzJyIpLCB0b2tlbl9zdGFydCk7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIGNoZWNrIGZvciByZXAvcmVwbmUgd2l0aG91dCBhIHN0cmluZyBpbnN0cnVjdGlvbiAqLwotICAgIGlmIChleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uCi0JJiYgIShjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSkKLSAgICAgIHsKLQlhc19iYWQgKF8oImV4cGVjdGluZyBzdHJpbmcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgYCVzJyIpLAotCQlleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICAvKiBUaGVyZSBtYXkgYmUgb3BlcmFuZHMgdG8gcGFyc2UuICovCi0gICAgaWYgKCpsICE9IEVORF9PRl9JTlNOKQotICAgICAgewotCS8qIHBhcnNlIG9wZXJhbmRzICovCi0KLQkvKiAxIGlmIG9wZXJhbmQgaXMgcGVuZGluZyBhZnRlciAnLCcuICovCi0JdW5zaWduZWQgaW50IGV4cGVjdGluZ19vcGVyYW5kID0gMDsKLQotCS8qIE5vbi16ZXJvIGlmIG9wZXJhbmQgcGFyZW5zIG5vdCBiYWxhbmNlZC4gKi8KLQl1bnNpZ25lZCBpbnQgcGFyZW5fbm90X2JhbGFuY2VkOwotCi0JZG8KLQkgIHsKLQkgICAgLyogc2tpcCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBiZWZvcmUgb3BlcmFuZCAqLwotCSAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmwpKQotCSAgICAgICsrbDsKLQkgICAgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpsKSAmJiAqbCAhPSBFTkRfT0ZfSU5TTikKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiaW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlIG9wZXJhbmQgJWQiKSwKLQkJCW91dHB1dF9pbnZhbGlkICgqbCksCi0JCQlpLm9wZXJhbmRzICsgMSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIHRva2VuX3N0YXJ0ID0gbDsJLyogYWZ0ZXIgd2hpdGUgc3BhY2UgKi8KLQkgICAgcGFyZW5fbm90X2JhbGFuY2VkID0gMDsKLQkgICAgd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqbCAhPSAnLCcpCi0JICAgICAgewotCQlpZiAoKmwgPT0gRU5EX09GX0lOU04pCi0JCSAgewotCQkgICAgaWYgKHBhcmVuX25vdF9iYWxhbmNlZCkKLQkJICAgICAgewotCQkJaWYgKCFpbnRlbF9zeW50YXgpCi0JCQkgIGFzX2JhZCAoXygidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiBvcGVyYW5kICVkLiIpLAotCQkJCSAgaS5vcGVyYW5kcyArIDEpOwotCQkJZWxzZQotCQkJICBhc19iYWQgKF8oInVuYmFsYW5jZWQgYnJhY2tldHMgaW4gb3BlcmFuZCAlZC4iKSwKLQkJCQkgIGkub3BlcmFuZHMgKyAxKTsKLQkJCXJldHVybjsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICBicmVhazsJLyogd2UgYXJlIGRvbmUgKi8KLQkJICB9Ci0JCWVsc2UgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpsKSAmJiAhaXNfc3BhY2VfY2hhciAoKmwpKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiaW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gb3BlcmFuZCAlZCIpLAotCQkJICAgIG91dHB1dF9pbnZhbGlkICgqbCksCi0JCQkgICAgaS5vcGVyYW5kcyArIDEpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkJaWYgKCFpbnRlbF9zeW50YXgpCi0JCSAgewotCQkgICAgaWYgKCpsID09ICcoJykKLQkJICAgICAgKytwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JCSAgICBpZiAoKmwgPT0gJyknKQotCQkgICAgICAtLXBhcmVuX25vdF9iYWxhbmNlZDsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAoKmwgPT0gJ1snKQotCQkgICAgICArK3BhcmVuX25vdF9iYWxhbmNlZDsKLQkJICAgIGlmICgqbCA9PSAnXScpCi0JCSAgICAgIC0tcGFyZW5fbm90X2JhbGFuY2VkOwotCQkgIH0KLQkJbCsrOwotCSAgICAgIH0KLQkgICAgaWYgKGwgIT0gdG9rZW5fc3RhcnQpCi0JICAgICAgewkJCS8qIHllcywgd2UndmUgcmVhZCBpbiBhbm90aGVyIG9wZXJhbmQgKi8KLQkJdW5zaWduZWQgaW50IG9wZXJhbmRfb2s7Ci0JCXRoaXNfb3BlcmFuZCA9IGkub3BlcmFuZHMrKzsKLQkJaWYgKGkub3BlcmFuZHMgPiBNQVhfT1BFUkFORFMpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJzcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiKSwKLQkJCSAgICBNQVhfT1BFUkFORFMpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkJLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2knIGFzIHdlIGdvIGFsb25nICovCi0JCUVORF9TVFJJTkdfQU5EX1NBVkUgKGwpOwotCi0JCWlmIChpbnRlbF9zeW50YXgpCi0JCSAgb3BlcmFuZF9vayA9IGkzODZfaW50ZWxfb3BlcmFuZCAodG9rZW5fc3RhcnQsIGludGVsX2Zsb2F0X29wZXJhbmQgKG1uZW1vbmljKSk7Ci0JCWVsc2UKLQkJICBvcGVyYW5kX29rID0gaTM4Nl9vcGVyYW5kICh0b2tlbl9zdGFydCk7Ci0KLQkJUkVTVE9SRV9FTkRfU1RSSU5HIChsKTsJLyogcmVzdG9yZSBvbGQgY29udGVudHMgKi8KLQkJaWYgKCFvcGVyYW5kX29rKQotCQkgIHJldHVybjsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmIChleHBlY3Rpbmdfb3BlcmFuZCkKLQkJICB7Ci0JCSAgZXhwZWN0aW5nX29wZXJhbmRfYWZ0ZXJfY29tbWE6Ci0JCSAgICBhc19iYWQgKF8oImV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKSk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCQlpZiAoKmwgPT0gJywnKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIG9wZXJhbmQgYmVmb3JlICcsJzsgZ290IG5vdGhpbmciKSk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBub3cgKmwgbXVzdCBiZSBlaXRoZXIgJywnIG9yIEVORF9PRl9JTlNOICovCi0JICAgIGlmICgqbCA9PSAnLCcpCi0JICAgICAgewotCQlpZiAoKisrbCA9PSBFTkRfT0ZfSU5TTikKLQkJICB7CQkvKiBqdXN0IHNraXAgaXQsIGlmIGl0J3MgXG4gY29tcGxhaW4gKi8KLQkJICAgIGdvdG8gZXhwZWN0aW5nX29wZXJhbmRfYWZ0ZXJfY29tbWE7Ci0JCSAgfQotCQlleHBlY3Rpbmdfb3BlcmFuZCA9IDE7Ci0JICAgICAgfQotCSAgfQotCXdoaWxlICgqbCAhPSBFTkRfT0ZfSU5TTik7CS8qIHVudGlsIHdlIGdldCBlbmQgb2YgaW5zbiAqLwotICAgICAgfQotICB9Ci0KLSAgLyogTm93IHdlJ3ZlIHBhcnNlZCB0aGUgbW5lbW9uaWMgaW50byBhIHNldCBvZiB0ZW1wbGF0ZXMsIGFuZCBoYXZlIHRoZQotICAgICBvcGVyYW5kcyBhdCBoYW5kLgotCi0gICAgIE5leHQsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGluc24sCi0gICAgIG1ha2luZyBzdXJlIHRoZSBvdmVybGFwIG9mIHRoZSBnaXZlbiBvcGVyYW5kcyB0eXBlcyBpcyBjb25zaXN0ZW50Ci0gICAgIHdpdGggdGhlIHRlbXBsYXRlIG9wZXJhbmQgdHlwZXMuICovCi0KLSNkZWZpbmUgTUFUQ0gob3ZlcmxhcCwgZ2l2ZW4sIHRlbXBsYXRlKSBcCi0gICgob3ZlcmxhcCkgXAotICAgJiYgKChnaXZlbikgJiBCYXNlSW5kZXgpID09ICgob3ZlcmxhcCkgJiBCYXNlSW5kZXgpIFwKLSAgICYmICgoZ2l2ZW4pICYgSnVtcEFic29sdXRlKSA9PSAoKHRlbXBsYXRlKSAmIEp1bXBBYnNvbHV0ZSkpCi0KLSAgLyogSWYgZ2l2ZW4gdHlwZXMgcjAgYW5kIHIxIGFyZSByZWdpc3RlcnMgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUKLSAgICAgdW5sZXNzIHRoZSBleHBlY3RlZCBvcGVyYW5kIHR5cGUgcmVnaXN0ZXIgb3ZlcmxhcCBpcyBudWxsLgotICAgICBOb3RlIHRoYXQgQWNjIGluIGEgdGVtcGxhdGUgbWF0Y2hlcyBldmVyeSBzaXplIG9mIHJlZy4gICovCi0jZGVmaW5lIENPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0gobTAsIGcwLCB0MCwgbTEsIGcxLCB0MSkgXAotICAoICgoZzApICYgUmVnKSA9PSAwIHx8ICgoZzEpICYgUmVnKSA9PSAwIHx8IFwKLSAgICAoKGcwKSAmIFJlZykgPT0gKChnMSkgJiBSZWcpIHx8IFwKLSAgICAoKCgobTApICYgQWNjKSA/IFJlZyA6ICh0MCkpICYgKCgobTEpICYgQWNjKSA/IFJlZyA6ICh0MSkpICYgUmVnKSA9PSAwICkKLQotICB7Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IG92ZXJsYXAwLCBvdmVybGFwMTsKLSAgICB1bnNpZ25lZCBpbnQgb3ZlcmxhcDI7Ci0gICAgdW5zaWduZWQgaW50IGZvdW5kX3JldmVyc2VfbWF0Y2g7Ci0gICAgaW50IHN1ZmZpeF9jaGVjazsKLQotICAgIC8qIEFsbCBpbnRlbCBvcGNvZGVzIGhhdmUgcmV2ZXJzZWQgb3BlcmFuZHMgZXhjZXB0IGZvciBCT1VORCBhbmQgRU5URVIgKi8KLSAgICBpZiAoaW50ZWxfc3ludGF4Ci0JJiYgKHN0cmNtcCAobW5lbW9uaWMsICJlbnRlciIpICE9IDApCi0JJiYgKHN0cmNtcCAobW5lbW9uaWMsICJib3VuZCIpICE9IDApCi0JJiYgKHN0cm5jbXAgKG1uZW1vbmljLCAiZnN1YiIsIDQpICE9MCkKLQkmJiAoc3RybmNtcCAobW5lbW9uaWMsICJmZGl2IiwgNCkgIT0wKSkKLSAgICAgIHsKLQljb25zdCByZWdfZW50cnkgKnRlbXBfcmVnID0gTlVMTDsKLQlleHByZXNzaW9uUyAqdGVtcF9kaXNwID0gTlVMTDsKLQlleHByZXNzaW9uUyAqdGVtcF9pbW0gPSBOVUxMOwotCXVuc2lnbmVkIGludCB0ZW1wX3R5cGU7Ci0JaW50IHhjaGcxID0gMDsKLQlpbnQgeGNoZzIgPSAwOwotCi0JaWYgKGkub3BlcmFuZHMgPT0gMikKLQkgIHsKLQkgICAgeGNoZzEgPSAwOwotCSAgICB4Y2hnMiA9IDE7Ci0JICB9Ci0JZWxzZSBpZiAoaS5vcGVyYW5kcyA9PSAzKQotCSAgewotCSAgICB4Y2hnMSA9IDA7Ci0JICAgIHhjaGcyID0gMjsKLQkgIH0KLQotCWlmIChpLm9wZXJhbmRzID4gMSkKLQkgIHsKLQkgICAgdGVtcF90eXBlID0gaS50eXBlc1t4Y2hnMl07Ci0JICAgIGlmICh0ZW1wX3R5cGUgJiAoUmVnIHwgRmxvYXRSZWcpKQotCSAgICAgIHRlbXBfcmVnID0gaS5yZWdzW3hjaGcyXTsKLQkgICAgZWxzZSBpZiAodGVtcF90eXBlICYgSW1tKQotCSAgICAgIHRlbXBfaW1tID0gaS5pbW1zW3hjaGcyXTsKLQkgICAgZWxzZSBpZiAodGVtcF90eXBlICYgRGlzcCkKLQkgICAgICB0ZW1wX2Rpc3AgPSBpLmRpc3BzW3hjaGcyXTsKLQotCSAgICBpLnR5cGVzW3hjaGcyXSA9IGkudHlwZXNbeGNoZzFdOwotCi0JICAgIGlmIChpLnR5cGVzW3hjaGcxXSAmIChSZWcgfCBGbG9hdFJlZykpCi0JICAgICAgewotCQlpLnJlZ3NbeGNoZzJdID0gaS5yZWdzW3hjaGcxXTsKLQkJaS5yZWdzW3hjaGcxXSA9IE5VTEw7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChpLnR5cGVzW3hjaGcyXSAmIEltbSkKLQkgICAgICB7Ci0JCWkuaW1tc1t4Y2hnMl0gPSBpLmltbXNbeGNoZzFdOwotCQlpLmltbXNbeGNoZzFdID0gTlVMTDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGkudHlwZXNbeGNoZzJdICYgRGlzcCkKLQkgICAgICB7Ci0JCWkuZGlzcHNbeGNoZzJdID0gaS5kaXNwc1t4Y2hnMV07Ci0JCWkuZGlzcHNbeGNoZzFdID0gTlVMTDsKLQkgICAgICB9Ci0KLQkgICAgaWYgKHRlbXBfdHlwZSAmIChSZWcgfCBGbG9hdFJlZykpCi0JICAgICAgewotCQlpLnJlZ3NbeGNoZzFdID0gdGVtcF9yZWc7Ci0JCWlmICghIChpLnR5cGVzW3hjaGcxXSAmIChSZWcgfCBGbG9hdFJlZykpKQotCQkgIGkucmVnc1t4Y2hnMl0gPSBOVUxMOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAodGVtcF90eXBlICYgSW1tKQotCSAgICAgIHsKLQkJaS5pbW1zW3hjaGcxXSA9IHRlbXBfaW1tOwotCQlpZiAoISAoaS50eXBlc1t4Y2hnMV0gJiBJbW0pKQotCQkgIGkuaW1tc1t4Y2hnMl0gPSBOVUxMOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAodGVtcF90eXBlICYgRGlzcCkKLQkgICAgICB7Ci0JCWkuZGlzcHNbeGNoZzFdID0gdGVtcF9kaXNwOwotCQlpZiAoISAoaS50eXBlc1t4Y2hnMV0gJiBEaXNwKSkKLQkJICBpLmRpc3BzW3hjaGcyXSA9IE5VTEw7Ci0JICAgICAgfQotCi0JICAgIGkudHlwZXNbeGNoZzFdID0gdGVtcF90eXBlOwotCSAgfQotCWlmICghc3RyY21wKG1uZW1vbmljLCJqbXAiKQotCSAgICB8fCAhc3RyY21wIChtbmVtb25pYywgImNhbGwiKSkKLQkgIGlmICgoaS50eXBlc1swXSAmIFJlZykgfHwgaS50eXBlc1swXSAmIEJhc2VJbmRleCkKLQkgICAgaS50eXBlc1swXSB8PSBKdW1wQWJzb2x1dGU7Ci0KLSAgICAgIH0KLSAgICBvdmVybGFwMCA9IDA7Ci0gICAgb3ZlcmxhcDEgPSAwOwotICAgIG92ZXJsYXAyID0gMDsKLSAgICBmb3VuZF9yZXZlcnNlX21hdGNoID0gMDsKLSAgICBzdWZmaXhfY2hlY2sgPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWAotCQkgICAgPyBOb19iU3VmCi0JCSAgICA6IChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYCi0JCSAgICAgICA/IE5vX3dTdWYKLQkJICAgICAgIDogKGkuc3VmZml4ID09IFNIT1JUX01ORU1fU1VGRklYCi0JCQkgID8gTm9fc1N1ZgotCQkJICA6IChpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYCi0JCQkgICAgID8gTm9fbFN1ZgotCQkJICAgICA6IChpLnN1ZmZpeCA9PSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWAotCQkJCT8gTm9fZFN1ZgotCQkJCTogKGkuc3VmZml4ID09IExPTkdfRE9VQkxFX01ORU1fU1VGRklYID8gTm9feFN1ZiA6IDApKSkpKSk7Ci0KLSAgICBmb3IgKHQgPSBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQ7Ci0JIHQgPCBjdXJyZW50X3RlbXBsYXRlcy0+ZW5kOwotCSB0KyspCi0gICAgICB7Ci0JLyogTXVzdCBoYXZlIHJpZ2h0IG51bWJlciBvZiBvcGVyYW5kcy4gKi8KLQlpZiAoaS5vcGVyYW5kcyAhPSB0LT5vcGVyYW5kcykKLQkgIGNvbnRpbnVlOwotCi0JLyogRm9yIHNvbWUgb3Bjb2RlcywgZG9uJ3QgY2hlY2sgdGhlIHN1ZmZpeCAqLwotCWlmIChpbnRlbF9zeW50YXgpCi0JICB7Ci0JICAgIGlmIChzdHJjbXAgKHQtPm5hbWUsICJmbnN0Y3ciKQotCQkmJiBzdHJjbXAgKHQtPm5hbWUsICJmbGRjdyIpCi0JCSYmICh0LT5vcGNvZGVfbW9kaWZpZXIgJiBzdWZmaXhfY2hlY2spKQotCSAgICAgIGNvbnRpbnVlOwotCSAgfQotCS8qIE11c3Qgbm90IGhhdmUgZGlzYWxsb3dlZCBzdWZmaXguICovCi0JZWxzZSBpZiAoKHQtPm9wY29kZV9tb2RpZmllciAmIHN1ZmZpeF9jaGVjaykpCi0JICBjb250aW51ZTsKLQotCWVsc2UgaWYgKCF0LT5vcGVyYW5kcykKLQkgIGJyZWFrOwkJLyogMCBvcGVyYW5kcyBhbHdheXMgbWF0Y2hlcyAqLwotCi0Jb3ZlcmxhcDAgPSBpLnR5cGVzWzBdICYgdC0+b3BlcmFuZF90eXBlc1swXTsKLQlzd2l0Y2ggKHQtPm9wZXJhbmRzKQotCSAgewotCSAgY2FzZSAxOgotCSAgICBpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1swXSkpCi0JICAgICAgY29udGludWU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgY2FzZSAzOgotCSAgICBvdmVybGFwMSA9IGkudHlwZXNbMV0gJiB0LT5vcGVyYW5kX3R5cGVzWzFdOwotCSAgICBpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1swXSkKLQkJfHwgIU1BVENIIChvdmVybGFwMSwgaS50eXBlc1sxXSwgdC0+b3BlcmFuZF90eXBlc1sxXSkKLQkJfHwgIUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLAotCQkJCQkgICAgICAgdC0+b3BlcmFuZF90eXBlc1swXSwKLQkJCQkJICAgICAgIG92ZXJsYXAxLCBpLnR5cGVzWzFdLAotCQkJCQkgICAgICAgdC0+b3BlcmFuZF90eXBlc1sxXSkpCi0JICAgICAgewotCi0JCS8qIGNoZWNrIGlmIG90aGVyIGRpcmVjdGlvbiBpcyB2YWxpZCAuLi4gKi8KLQkJaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiAoRHxGbG9hdEQpKSA9PSAwKQotCQkgIGNvbnRpbnVlOwotCi0JCS8qIHRyeSByZXZlcnNpbmcgZGlyZWN0aW9uIG9mIG9wZXJhbmRzICovCi0JCW92ZXJsYXAwID0gaS50eXBlc1swXSAmIHQtPm9wZXJhbmRfdHlwZXNbMV07Ci0JCW92ZXJsYXAxID0gaS50eXBlc1sxXSAmIHQtPm9wZXJhbmRfdHlwZXNbMF07Ci0JCWlmICghTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLCB0LT5vcGVyYW5kX3R5cGVzWzFdKQotCQkgICAgfHwgIU1BVENIIChvdmVybGFwMSwgaS50eXBlc1sxXSwgdC0+b3BlcmFuZF90eXBlc1swXSkKLQkJICAgIHx8ICFDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwKLQkJCQkJCSAgIHQtPm9wZXJhbmRfdHlwZXNbMV0sCi0JCQkJCQkgICBvdmVybGFwMSwgaS50eXBlc1sxXSwKLQkJCQkJCSAgIHQtPm9wZXJhbmRfdHlwZXNbMF0pKQotCQkgIHsKLQkJICAgIC8qIGRvZXMgbm90IG1hdGNoIGVpdGhlciBkaXJlY3Rpb24gKi8KLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQkJLyogZm91bmRfcmV2ZXJzZV9tYXRjaCBob2xkcyB3aGljaCBvZiBEIG9yIEZsb2F0RFIKLQkJICAgd2UndmUgZm91bmQuICAqLwotCQlmb3VuZF9yZXZlcnNlX21hdGNoID0gdC0+b3Bjb2RlX21vZGlmaWVyICYgKER8RmxvYXREUik7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgLyogZm91bmQgYSBmb3J3YXJkIDIgb3BlcmFuZCBtYXRjaCBoZXJlICovCi0JICAgIGlmICh0LT5vcGVyYW5kcyA9PSAzKQotCSAgICAgIHsKLQkJLyogSGVyZSB3ZSBtYWtlIHVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBubwotCQkgICByZXZlcnNlIG1hdGNoIDMgb3BlcmFuZCBpbnN0cnVjdGlvbnMsIGFuZCBhbGwgMwotCQkgICBvcGVyYW5kIGluc3RydWN0aW9ucyBvbmx5IG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IKLQkJICAgcmVnaXN0ZXIgY29uc2lzdGVuY3kgYmV0d2VlbiBvcGVyYW5kcyAyIGFuZCAzLiAgKi8KLQkJb3ZlcmxhcDIgPSBpLnR5cGVzWzJdICYgdC0+b3BlcmFuZF90eXBlc1syXTsKLQkJaWYgKCFNQVRDSCAob3ZlcmxhcDIsIGkudHlwZXNbMl0sIHQtPm9wZXJhbmRfdHlwZXNbMl0pCi0JCSAgICB8fCAhQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzFdLAotCQkJCQkJICAgb3ZlcmxhcDIsIGkudHlwZXNbMl0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzJdKSkKLQotCQkgIGNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgLyogZm91bmQgZWl0aGVyIGZvcndhcmQvcmV2ZXJzZSAyIG9yIDMgb3BlcmFuZCBtYXRjaCBoZXJlOgotCSAgICAgICBzbGlwIHRocm91Z2ggdG8gYnJlYWsgKi8KLQkgIH0KLQlicmVhazsJCQkvKiB3ZSd2ZSBmb3VuZCBhIG1hdGNoOyBicmVhayBvdXQgb2YgbG9vcCAqLwotICAgICAgfQkJCQkvKiBmb3IgKHQgPSAuLi4gKi8KLSAgICBpZiAodCA9PSBjdXJyZW50X3RlbXBsYXRlcy0+ZW5kKQotICAgICAgewkJCQkvKiB3ZSBmb3VuZCBubyBtYXRjaCAqLwotCWFzX2JhZCAoXygic3VmZml4IG9yIG9wZXJhbmRzIGludmFsaWQgZm9yIGAlcyciKSwKLQkJY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBpZiAoKHQtPm9wY29kZV9tb2RpZmllciAmIChJc1ByZWZpeHxJZ25vcmVTaXplKSkgPT0gKElzUHJlZml4fElnbm9yZVNpemUpKQotICAgICAgewotCS8qIFdhcm4gdGhlbSB0aGF0IGEgZGF0YSBvciBhZGRyZXNzIHNpemUgcHJlZml4IGRvZXNuJ3QgYWZmZWN0Ci0JICAgYXNzZW1ibHkgb2YgdGhlIG5leHQgbGluZSBvZiBjb2RlLiAgKi8KLQlhc193YXJuIChfKCJzdGFuZC1hbG9uZSBgJXMnIHByZWZpeCIpLCB0LT5uYW1lKTsKLSAgICAgIH0KLQotICAgIC8qIENvcHkgdGhlIHRlbXBsYXRlIHdlIGZvdW5kLiAgKi8KLSAgICBpLnRtID0gKnQ7Ci0gICAgaWYgKGZvdW5kX3JldmVyc2VfbWF0Y2gpCi0gICAgICB7Ci0JaS50bS5vcGVyYW5kX3R5cGVzWzBdID0gdC0+b3BlcmFuZF90eXBlc1sxXTsKLQlpLnRtLm9wZXJhbmRfdHlwZXNbMV0gPSB0LT5vcGVyYW5kX3R5cGVzWzBdOwotICAgICAgfQotCi0KLSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBGV2FpdCkKLSAgICAgIGlmICghIGFkZF9wcmVmaXggKEZXQUlUX09QQ09ERSkpCi0JcmV0dXJuOwotCi0gICAgLyogQ2hlY2sgc3RyaW5nIGluc3RydWN0aW9uIHNlZ21lbnQgb3ZlcnJpZGVzICovCi0gICAgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSAhPSAwICYmIGkubWVtX29wZXJhbmRzICE9IDApCi0gICAgICB7Ci0JaW50IG1lbV9vcCA9IChpLnR5cGVzWzBdICYgQW55TWVtKSA/IDAgOiAxOwotCWlmICgoaS50bS5vcGVyYW5kX3R5cGVzW21lbV9vcF0gJiBFc1NlZykgIT0gMCkKLQkgIHsKLQkgICAgaWYgKGkuc2VnWzBdICE9IE5VTEwgJiYgaS5zZWdbMF0gIT0gJmVzKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJgJXMnIG9wZXJhbmQgJWQgbXVzdCB1c2UgYCUlZXMnIHNlZ21lbnQiKSwKLQkJCWkudG0ubmFtZSwKLQkJCW1lbV9vcCArIDEpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICAvKiBUaGVyZSdzIG9ubHkgZXZlciBvbmUgc2VnbWVudCBvdmVycmlkZSBhbGxvd2VkIHBlciBpbnN0cnVjdGlvbi4KLQkgICAgICAgVGhpcyBpbnN0cnVjdGlvbiBwb3NzaWJseSBoYXMgYSBsZWdhbCBzZWdtZW50IG92ZXJyaWRlIG9uIHRoZQotCSAgICAgICBzZWNvbmQgb3BlcmFuZCwgc28gY29weSB0aGUgc2VnbWVudCB0byB3aGVyZSBub24tc3RyaW5nCi0JICAgICAgIGluc3RydWN0aW9ucyBzdG9yZSBpdCwgYWxsb3dpbmcgY29tbW9uIGNvZGUuICAqLwotCSAgICBpLnNlZ1swXSA9IGkuc2VnWzFdOwotCSAgfQotCWVsc2UgaWYgKChpLnRtLm9wZXJhbmRfdHlwZXNbbWVtX29wICsgMV0gJiBFc1NlZykgIT0gMCkKLQkgIHsKLQkgICAgaWYgKGkuc2VnWzFdICE9IE5VTEwgJiYgaS5zZWdbMV0gIT0gJmVzKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJgJXMnIG9wZXJhbmQgJWQgbXVzdCB1c2UgYCUlZXMnIHNlZ21lbnQiKSwKLQkJCWkudG0ubmFtZSwKLQkJCW1lbV9vcCArIDIpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gICAgLyogSWYgbWF0Y2hlZCBpbnN0cnVjdGlvbiBzcGVjaWZpZXMgYW4gZXhwbGljaXQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMKLSAgICAgICBzdWZmaXgsIHVzZSBpdC4gICovCi0gICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgKFNpemUxNiB8IFNpemUzMikpCi0gICAgICB7Ci0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgU2l6ZTE2KQotCSAgaS5zdWZmaXggPSBXT1JEX01ORU1fU1VGRklYOwotCWVsc2UKLQkgIGkuc3VmZml4ID0gRFdPUkRfTU5FTV9TVUZGSVg7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoaS5yZWdfb3BlcmFuZHMpCi0gICAgICB7Ci0JLyogSWYgdGhlcmUncyBubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggd2UgdHJ5IHRvIGludmVudCBvbmUKLQkgICBiYXNlZCBvbiByZWdpc3RlciBvcGVyYW5kcy4gKi8KLQlpZiAoIWkuc3VmZml4KQotCSAgewotCSAgICAvKiBXZSB0YWtlIGkuc3VmZml4IGZyb20gdGhlIGxhc3QgcmVnaXN0ZXIgb3BlcmFuZCBzcGVjaWZpZWQsCi0JICAgICAgIERlc3RpbmF0aW9uIHJlZ2lzdGVyIHR5cGUgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHNvdXJjZQotCSAgICAgICByZWdpc3RlciB0eXBlLiAgKi8KLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgaWYgKGkudHlwZXNbb3BdICYgUmVnKQotCQl7Ci0JCSAgaS5zdWZmaXggPSAoKGkudHlwZXNbb3BdICYgUmVnOCkgPyBCWVRFX01ORU1fU1VGRklYIDoKLQkJCSAgICAgIChpLnR5cGVzW29wXSAmIFJlZzE2KSA/IFdPUkRfTU5FTV9TVUZGSVggOgotCQkJICAgICAgRFdPUkRfTU5FTV9TVUZGSVgpOwotCQkgIGJyZWFrOwotCQl9Ci0JICB9Ci0JZWxzZSBpZiAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCkKLQkgIHsKLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgewotCQkvKiBJZiB0aGlzIGlzIGFuIGVpZ2h0IGJpdCByZWdpc3RlciwgaXQncyBPSy4gIElmIGl0J3MKLQkJICAgdGhlIDE2IG9yIDMyIGJpdCB2ZXJzaW9uIG9mIGFuIGVpZ2h0IGJpdCByZWdpc3RlciwKLQkJICAgd2Ugd2lsbCBqdXN0IHVzZSB0aGUgbG93IHBvcnRpb24sIGFuZCB0aGF0J3MgT0sgdG9vLiAqLwotCQlpZiAoaS50eXBlc1tvcF0gJiBSZWc4KQotCQkgIGNvbnRpbnVlOwotCi0JCS8qIG1vdnp4IGFuZCBtb3ZzeCBzaG91bGQgbm90IGdlbmVyYXRlIHRoaXMgd2FybmluZy4gKi8KLQkJaWYgKGludGVsX3N5bnRheAotCQkgICAgJiYgKGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjcKLQkJCXx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjYKLQkJCXx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYmUKLQkJCXx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYmYpKQotCQkgIGNvbnRpbnVlOwotCi0JCWlmICgoaS50eXBlc1tvcF0gJiBXb3JkUmVnKSAmJiBpLnJlZ3Nbb3BdLT5yZWdfbnVtIDwgNAotI2lmIDAKLQkJICAgIC8qIENoZWNrIHRoYXQgdGhlIHRlbXBsYXRlIGFsbG93cyBlaWdodCBiaXQgcmVncwotCQkgICAgICAgVGhpcyBraWxscyBpbnNucyBzdWNoIGFzIGBvcmIgJDEsJWVkeCcsIHdoaWNoCi0JCSAgICAgICBtYXliZSBzaG91bGQgYmUgYWxsb3dlZC4gICovCi0JCSAgICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWc4fEluT3V0UG9ydFJlZykpCi0jZW5kaWYKLQkJICAgICkKLQkJICB7Ci0jaWYgUkVHSVNURVJfV0FSTklOR1MKLQkJICAgIGlmICgoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIEluT3V0UG9ydFJlZykgPT0gMCkKLQkJICAgICAgYXNfd2FybiAoXygidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIpLAotCQkJICAgICAgIChpLnJlZ3Nbb3BdIC0gKGkudHlwZXNbb3BdICYgUmVnMTYgPyA4IDogMTYpKS0+cmVnX25hbWUsCi0JCQkgICAgICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgICAgICAgaS5zdWZmaXgpOwotI2VuZGlmCi0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JCS8qIEFueSBvdGhlciByZWdpc3RlciBpcyBiYWQgKi8KLQkJaWYgKGkudHlwZXNbb3BdICYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJCSAgIHwgU1JlZzIgfCBTUmVnMwotCQkJCSAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdAotCQkJCSAgIHwgRmxvYXRSZWcgfCBGbG9hdEFjYykpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciKSwKLQkJCSAgICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgICBpLnRtLm5hbWUsCi0JCQkgICAgaS5zdWZmaXgpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoaS5zdWZmaXggPT0gRFdPUkRfTU5FTV9TVUZGSVgpCi0JICB7Ci0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIC8qIFJlamVjdCBlaWdodCBiaXQgcmVnaXN0ZXJzLCBleGNlcHQgd2hlcmUgdGhlIHRlbXBsYXRlCi0JCSByZXF1aXJlcyB0aGVtLiAoZWcuIG1vdnpiKSAgKi8KLQkgICAgICBpZiAoKGkudHlwZXNbb3BdICYgUmVnOCkgIT0gMAotCQkgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzE2fFJlZzMyfEFjYykpICE9IDApCi0JCXsKLQkJICBhc19iYWQgKF8oImAlJSVzJyBub3QgYWxsb3dlZCB3aXRoIGAlcyVjJyIpLAotCQkJICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgaS50bS5uYW1lLAotCQkJICBpLnN1ZmZpeCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0jaWYgUkVHSVNURVJfV0FSTklOR1MKLQkgICAgICAvKiBXYXJuIGlmIHRoZSBlIHByZWZpeCBvbiBhIGdlbmVyYWwgcmVnIGlzIG1pc3NpbmcuICAqLwotCSAgICAgIGVsc2UgaWYgKChpLnR5cGVzW29wXSAmIFJlZzE2KSAhPSAwCi0JCSAgICAgICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWczMnxBY2MpKSAhPSAwKQotCQl7Ci0JCSAgYXNfd2FybiAoXygidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIpLAotCQkJICAgKGkucmVnc1tvcF0gKyA4KS0+cmVnX25hbWUsCi0JCQkgICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgIGkuc3VmZml4KTsKLQkJfQotI2VuZGlmCi0JICB9Ci0JZWxzZSBpZiAoaS5zdWZmaXggPT0gV09SRF9NTkVNX1NVRkZJWCkKLQkgIHsKLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgLyogUmVqZWN0IGVpZ2h0IGJpdCByZWdpc3RlcnMsIGV4Y2VwdCB3aGVyZSB0aGUgdGVtcGxhdGUKLQkJIHJlcXVpcmVzIHRoZW0uIChlZy4gbW92emIpICAqLwotCSAgICAgIGlmICgoaS50eXBlc1tvcF0gJiBSZWc4KSAhPSAwCi0JCSAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMTZ8UmVnMzJ8QWNjKSkgIT0gMCkKLQkJewotCQkgIGFzX2JhZCAoXygiYCUlJXMnIG5vdCBhbGxvd2VkIHdpdGggYCVzJWMnIiksCi0JCQkgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICBpLnRtLm5hbWUsCi0JCQkgIGkuc3VmZml4KTsKLQkJICByZXR1cm47Ci0JCX0KLSNpZiBSRUdJU1RFUl9XQVJOSU5HUwotCSAgICAgIC8qIFdhcm4gaWYgdGhlIGUgcHJlZml4IG9uIGEgZ2VuZXJhbCByZWcgaXMgcHJlc2VudC4gICovCi0JICAgICAgZWxzZSBpZiAoKGkudHlwZXNbb3BdICYgUmVnMzIpICE9IDAKLQkJICAgICAgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzE2fEFjYykpICE9IDApCi0JCXsKLQkJICBhc193YXJuIChfKCJ1c2luZyBgJSUlcycgaW5zdGVhZCBvZiBgJSUlcycgZHVlIHRvIGAlYycgc3VmZml4IiksCi0JCQkgICAoaS5yZWdzW29wXSAtIDgpLT5yZWdfbmFtZSwKLQkJCSAgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICAgaS5zdWZmaXgpOwotCQl9Ci0jZW5kaWYKLQkgIH0KLQllbHNlCi0JICBhYm9ydCgpOwotICAgICAgfQotICAgIGVsc2UgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIERlZmF1bHRTaXplKSAmJiAhaS5zdWZmaXgpCi0gICAgICB7Ci0JaS5zdWZmaXggPSBzdGFja29wX3NpemU7Ci0gICAgICB9Ci0KLSAgICAvKiBNYWtlIHN0aWxsIHVucmVzb2x2ZWQgaW1tZWRpYXRlIG1hdGNoZXMgY29uZm9ybSB0byBzaXplIG9mIGltbWVkaWF0ZQotICAgICAgIGdpdmVuIGluIGkuc3VmZml4LiAgTm90ZTogb3ZlcmxhcDIgY2Fubm90IGJlIGFuIGltbWVkaWF0ZSEgICovCi0gICAgaWYgKChvdmVybGFwMCAmIChJbW04IHwgSW1tOFMgfCBJbW0xNiB8IEltbTMyKSkKLQkmJiBvdmVybGFwMCAhPSBJbW04ICYmIG92ZXJsYXAwICE9IEltbThTCi0JJiYgb3ZlcmxhcDAgIT0gSW1tMTYgJiYgb3ZlcmxhcDAgIT0gSW1tMzIpCi0gICAgICB7Ci0JaWYgKGkuc3VmZml4KQotCSAgewotCSAgICBvdmVybGFwMCAmPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCA/IChJbW04IHwgSW1tOFMpIDoKLQkJCSAoaS5zdWZmaXggPT0gV09SRF9NTkVNX1NVRkZJWCA/IEltbTE2IDogSW1tMzIpKTsKLQkgIH0KLQllbHNlIGlmIChvdmVybGFwMCA9PSAoSW1tMTYgfCBJbW0zMikpCi0JICB7Ci0JICAgIG92ZXJsYXAwID0KLQkgICAgICAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwKSkgPyBJbW0xNiA6IEltbTMyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW47IGNhbid0IGRldGVybWluZSBpbW1lZGlhdGUgc2l6ZSIpKTsKLQkgICAgcmV0dXJuOwotCSAgfQotICAgICAgfQotICAgIGlmICgob3ZlcmxhcDEgJiAoSW1tOCB8IEltbThTIHwgSW1tMTYgfCBJbW0zMikpCi0JJiYgb3ZlcmxhcDEgIT0gSW1tOCAmJiBvdmVybGFwMSAhPSBJbW04UwotCSYmIG92ZXJsYXAxICE9IEltbTE2ICYmIG92ZXJsYXAxICE9IEltbTMyKQotICAgICAgewotCWlmIChpLnN1ZmZpeCkKLQkgIHsKLQkgICAgb3ZlcmxhcDEgJj0gKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVggPyAoSW1tOCB8IEltbThTKSA6Ci0JCQkgKGkuc3VmZml4ID09IFdPUkRfTU5FTV9TVUZGSVggPyBJbW0xNiA6IEltbTMyKSk7Ci0JICB9Ci0JZWxzZSBpZiAob3ZlcmxhcDEgPT0gKEltbTE2IHwgSW1tMzIpKQotCSAgewotCSAgICBvdmVybGFwMSA9Ci0JICAgICAgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMCkpID8gSW1tMTYgOiBJbW0zMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGFzX2JhZCAoXygibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuOyBjYW4ndCBkZXRlcm1pbmUgaW1tZWRpYXRlIHNpemUiKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLSAgICBhc3NlcnQgKChvdmVybGFwMiAmIEltbSkgPT0gMCk7Ci0KLSAgICBpLnR5cGVzWzBdID0gb3ZlcmxhcDA7Ci0gICAgaWYgKG92ZXJsYXAwICYgSW1wbGljaXRSZWdpc3RlcikKLSAgICAgIGkucmVnX29wZXJhbmRzLS07Ci0gICAgaWYgKG92ZXJsYXAwICYgSW1tMSkKLSAgICAgIGkuaW1tX29wZXJhbmRzID0gMDsJLyoga2x1ZGdlIGZvciBzaGlmdCBpbnNucyAqLwotCi0gICAgaS50eXBlc1sxXSA9IG92ZXJsYXAxOwotICAgIGlmIChvdmVybGFwMSAmIEltcGxpY2l0UmVnaXN0ZXIpCi0gICAgICBpLnJlZ19vcGVyYW5kcy0tOwotCi0gICAgaS50eXBlc1syXSA9IG92ZXJsYXAyOwotICAgIGlmIChvdmVybGFwMiAmIEltcGxpY2l0UmVnaXN0ZXIpCi0gICAgICBpLnJlZ19vcGVyYW5kcy0tOwotCi0gICAgLyogRmluYWxpemUgb3Bjb2RlLiAgRmlyc3QsIHdlIGNoYW5nZSB0aGUgb3Bjb2RlIGJhc2VkIG9uIHRoZSBvcGVyYW5kCi0gICAgICAgc2l6ZSBnaXZlbiBieSBpLnN1ZmZpeDogIFdlIG5lZWQgbm90IGNoYW5nZSB0aGluZ3MgZm9yIGJ5dGUgaW5zbnMuICAqLwotCi0gICAgaWYgKCFpLnN1ZmZpeCAmJiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBXKSkKLSAgICAgIHsKLQlhc19iYWQgKF8oIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbiBhbmQgbm8gcmVnaXN0ZXIgb3BlcmFuZHM7IGNhbid0IHNpemUgaW5zdHJ1Y3Rpb24iKSk7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gICAgLyogRm9yIG1vdnp4IGFuZCBtb3ZzeCwgbmVlZCB0byBjaGVjayB0aGUgcmVnaXN0ZXIgdHlwZSAqLwotICAgIGlmIChpbnRlbF9zeW50YXgKLQkmJiAoaS50bS5iYXNlX29wY29kZSA9PSAweGZiNiB8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmJlKSkKLSAgICAgIGlmIChpLnN1ZmZpeCAmJiBpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYKQotCXsKLQkgIHVuc2lnbmVkIGludCBwcmVmaXggPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0KLQkgIGlmICgoaS5yZWdzWzFdLT5yZWdfdHlwZSAmIFJlZzE2KSAhPSAwKQotCSAgICBpZiAoIWFkZF9wcmVmaXggKHByZWZpeCkpCi0JICAgICAgcmV0dXJuOwotCX0KLQotICAgIGlmIChpLnN1ZmZpeCAmJiBpLnN1ZmZpeCAhPSBCWVRFX01ORU1fU1VGRklYKQotICAgICAgewotCS8qIEl0J3Mgbm90IGEgYnl0ZSwgc2VsZWN0IHdvcmQvZHdvcmQgb3BlcmF0aW9uLiAgKi8KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBXKQotCSAgewotCSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBTaG9ydEZvcm0pCi0JICAgICAgaS50bS5iYXNlX29wY29kZSB8PSA4OwotCSAgICBlbHNlCi0JICAgICAgaS50bS5iYXNlX29wY29kZSB8PSAxOwotCSAgfQotCS8qIE5vdyBzZWxlY3QgYmV0d2VlbiB3b3JkICYgZHdvcmQgb3BlcmF0aW9ucyB2aWEgdGhlIG9wZXJhbmQKLQkgICBzaXplIHByZWZpeCwgZXhjZXB0IGZvciBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsIGlnbm9yZSB0aGlzCi0JICAgcHJlZml4IGFueXdheS4gICovCi0JaWYgKCgoaW50ZWxfc3ludGF4ICYmIChpLnN1ZmZpeCA9PSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCkpCi0JICAgICB8fCBpLnN1ZmZpeCA9PSBEV09SRF9NTkVNX1NVRkZJWAotCSAgICAgfHwgaS5zdWZmaXggPT0gTE9OR19NTkVNX1NVRkZJWCkgPT0gZmxhZ18xNmJpdF9jb2RlCi0JICAgICYmICEoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBJZ25vcmVTaXplKSkKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHByZWZpeCA9IERBVEFfUFJFRklYX09QQ09ERTsKLQkgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSnVtcEJ5dGUpIC8qIGpjeHosIGxvb3AgKi8KLQkgICAgICBwcmVmaXggPSBBRERSX1BSRUZJWF9PUENPREU7Ci0KLQkgICAgaWYgKCEgYWRkX3ByZWZpeCAocHJlZml4KSkKLQkgICAgICByZXR1cm47Ci0JICB9Ci0JLyogU2l6ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbi4gICovCi0JaWYgKGkuc3VmZml4ID09IExPTkdfTU5FTV9TVUZGSVgKLQkgICAgfHwgKGludGVsX3N5bnRheCAmJiBpLnN1ZmZpeCA9PSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCkpCi0JICB7Ci0JICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEZsb2F0TUYpCi0JICAgICAgaS50bS5iYXNlX29wY29kZSBePSA0OwotCSAgfQotICAgICAgfQotCi0gICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSW1tRXh0KQotICAgICAgewotCS8qIFRoZXNlIEFNRCAzRE5vdyEgYW5kIEludGVsIEthdG1haSBOZXcgSW5zdHJ1Y3Rpb25zIGhhdmUgYW4KLQkgICBvcGNvZGUgc3VmZml4IHdoaWNoIGlzIGNvZGVkIGluIHRoZSBzYW1lIHBsYWNlIGFzIGFuIDgtYml0Ci0JICAgaW1tZWRpYXRlIGZpZWxkIHdvdWxkIGJlLiAgSGVyZSB3ZSBmYWtlIGFuIDgtYml0IGltbWVkaWF0ZQotCSAgIG9wZXJhbmQgZnJvbSB0aGUgb3Bjb2RlIHN1ZmZpeCBzdG9yZWQgaW4gdG0uZXh0ZW5zaW9uX29wY29kZS4gICovCi0KLQlleHByZXNzaW9uUyAqZXhwOwotCi0JYXNzZXJ0KGkuaW1tX29wZXJhbmRzID09IDAgJiYgaS5vcGVyYW5kcyA8PSAyKTsKLQotCWV4cCA9ICZpbV9leHByZXNzaW9uc1tpLmltbV9vcGVyYW5kcysrXTsKLQlpLmltbXNbaS5vcGVyYW5kc10gPSBleHA7Ci0JaS50eXBlc1tpLm9wZXJhbmRzKytdID0gSW1tODsKLQlleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotCWV4cC0+WF9hZGRfbnVtYmVyID0gaS50bS5leHRlbnNpb25fb3Bjb2RlOwotCWkudG0uZXh0ZW5zaW9uX29wY29kZSA9IE5vbmU7Ci0gICAgICB9Ci0KLSAgICAvKiBGb3IgaW5zbnMgd2l0aCBvcGVyYW5kcyB0aGVyZSBhcmUgbW9yZSBkaWRkbGVzIHRvIGRvIHRvIHRoZSBvcGNvZGUuICovCi0gICAgaWYgKGkub3BlcmFuZHMpCi0gICAgICB7Ci0JLyogRGVmYXVsdCBzZWdtZW50IHJlZ2lzdGVyIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB1c2UKLQkgICBmb3IgbWVtb3J5IGFjY2Vzc2VzLiAgMCBtZWFucyB1bmtub3duLgotCSAgIFRoaXMgaXMgb25seSBmb3Igb3B0aW1pemluZyBvdXQgdW5uZWNlc3Nhcnkgc2VnbWVudCBvdmVycmlkZXMuICAqLwotCWNvbnN0IHNlZ19lbnRyeSAqZGVmYXVsdF9zZWcgPSAwOwotCi0JLyogSWYgd2UgZm91bmQgYSByZXZlcnNlIG1hdGNoIHdlIG11c3QgYWx0ZXIgdGhlIG9wY29kZQotCSAgIGRpcmVjdGlvbiBiaXQuICBmb3VuZF9yZXZlcnNlX21hdGNoIGhvbGRzIGJpdHMgdG8gY2hhbmdlCi0JICAgKGRpZmZlcmVudCBmb3IgaW50ICYgZmxvYXQgaW5zbnMpLiAgKi8KLQotCWkudG0uYmFzZV9vcGNvZGUgXj0gZm91bmRfcmV2ZXJzZV9tYXRjaDsKLQotCS8qIFRoZSBpbXVsICRpbW0sICVyZWcgaW5zdHJ1Y3Rpb24gaXMgY29udmVydGVkIGludG8KLQkgICBpbXVsICRpbW0sICVyZWcsICVyZWcsIGFuZCB0aGUgY2xyICVyZWcgaW5zdHJ1Y3Rpb24KLQkgICBpcyBjb252ZXJ0ZWQgaW50byB4b3IgJXJlZywgJXJlZy4gICovCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgcmVnS2x1ZGdlKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgZmlyc3RfcmVnX29wID0gKGkudHlwZXNbMF0gJiBSZWcpID8gMCA6IDE7Ci0JICAgIC8qIFByZXRlbmQgd2Ugc2F3IHRoZSBleHRyYSByZWdpc3RlciBvcGVyYW5kLiAqLwotCSAgICBpLnJlZ3NbZmlyc3RfcmVnX29wKzFdID0gaS5yZWdzW2ZpcnN0X3JlZ19vcF07Ci0JICAgIGkucmVnX29wZXJhbmRzID0gMjsKLQkgIH0KLQotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFNob3J0Rm9ybSkKLQkgIHsKLQkgICAgLyogVGhlIHJlZ2lzdGVyIG9yIGZsb2F0IHJlZ2lzdGVyIG9wZXJhbmQgaXMgaW4gb3BlcmFuZCAwIG9yIDEuICovCi0JICAgIHVuc2lnbmVkIGludCBvcCA9IChpLnR5cGVzWzBdICYgKFJlZyB8IEZsb2F0UmVnKSkgPyAwIDogMTsKLQkgICAgLyogUmVnaXN0ZXIgZ29lcyBpbiBsb3cgMyBiaXRzIG9mIG9wY29kZS4gKi8KLQkgICAgaS50bS5iYXNlX29wY29kZSB8PSBpLnJlZ3Nbb3BdLT5yZWdfbnVtOwotCSAgICBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVWdoKSAhPSAwKQotCSAgICAgIHsKLQkJLyogV2FybiBhYm91dCBzb21lIGNvbW1vbiBlcnJvcnMsIGJ1dCBwcmVzcyBvbiByZWdhcmRsZXNzLgotCQkgICBUaGUgZmlyc3QgY2FzZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGdjYyAoPD0gMi44LjEpLiAgKi8KLQkJaWYgKGkub3BlcmFuZHMgPT0gMikKLQkJICB7Ci0JCSAgICAvKiByZXZlcnNlZCBhcmd1bWVudHMgb24gZmFkZHAsIGZzdWJwLCBldGMuICovCi0JCSAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcywlJSVzJyIpLCBpLnRtLm5hbWUsCi0JCQkgICAgIGkucmVnc1sxXS0+cmVnX25hbWUsCi0JCQkgICAgIGkucmVnc1swXS0+cmVnX25hbWUpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIGV4dHJhbmVvdXMgYGwnIHN1ZmZpeCBvbiBmcCBpbnNuICovCi0JCSAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcyciKSwgaS50bS5uYW1lLAotCQkJICAgICBpLnJlZ3NbMF0tPnJlZ19uYW1lKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgTW9kcm0pCi0JICB7Ci0JICAgIC8qIFRoZSBvcGNvZGUgaXMgY29tcGxldGVkIChtb2R1bG8gaS50bS5leHRlbnNpb25fb3Bjb2RlIHdoaWNoCi0JICAgICAgIG11c3QgYmUgcHV0IGludG8gdGhlIG1vZHJtIGJ5dGUpLgotCSAgICAgICBOb3csIHdlIG1ha2UgdGhlIG1vZHJtICYgaW5kZXggYmFzZSBieXRlcyBiYXNlZCBvbiBhbGwgdGhlCi0JICAgICAgIGluZm8gd2UndmUgY29sbGVjdGVkLiAqLwotCi0JICAgIC8qIGkucmVnX29wZXJhbmRzIE1VU1QgYmUgdGhlIG51bWJlciBvZiByZWFsIHJlZ2lzdGVyIG9wZXJhbmRzOwotCSAgICAgICBpbXBsaWNpdCByZWdpc3RlcnMgZG8gbm90IGNvdW50LiAqLwotCSAgICBpZiAoaS5yZWdfb3BlcmFuZHMgPT0gMikKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBzb3VyY2UsIGRlc3Q7Ci0JCXNvdXJjZSA9ICgoaS50eXBlc1swXQotCQkJICAgJiAoUmVnIHwgUmVnTU1YIHwgUmVnWE1NCi0JCQkgICAgICB8IFNSZWcyIHwgU1JlZzMKLQkJCSAgICAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCkpCi0JCQkgID8gMCA6IDEpOwotCQlkZXN0ID0gc291cmNlICsgMTsKLQotCQlpLnJtLm1vZGUgPSAzOwotCQkvKiBPbmUgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUKLQkJICAgaS50bS5yZWcgZmllbGQsIHRoZSBvdGhlciBpbiB0aGUgY29tYmluZWQgaS50bS5tb2RlCi0JCSAgIGFuZCBpLnRtLnJlZ21lbSBmaWVsZHMuICBJZiBubyBmb3JtIG9mIHRoaXMKLQkJICAgaW5zdHJ1Y3Rpb24gc3VwcG9ydHMgYSBtZW1vcnkgZGVzdGluYXRpb24gb3BlcmFuZCwKLQkJICAgdGhlbiB3ZSBhc3N1bWUgdGhlIHNvdXJjZSBvcGVyYW5kIG1heSBzb21ldGltZXMgYmUKLQkJICAgYSBtZW1vcnkgb3BlcmFuZCBhbmQgc28gd2UgbmVlZCB0byBzdG9yZSB0aGUKLQkJICAgZGVzdGluYXRpb24gaW4gdGhlIGkucm0ucmVnIGZpZWxkLiAgKi8KLQkJaWYgKChpLnRtLm9wZXJhbmRfdHlwZXNbZGVzdF0gJiBBbnlNZW0pID09IDApCi0JCSAgewotCQkgICAgaS5ybS5yZWcgPSBpLnJlZ3NbZGVzdF0tPnJlZ19udW07Ci0JCSAgICBpLnJtLnJlZ21lbSA9IGkucmVnc1tzb3VyY2VdLT5yZWdfbnVtOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGkucm0ucmVnID0gaS5yZWdzW3NvdXJjZV0tPnJlZ19udW07Ci0JCSAgICBpLnJtLnJlZ21lbSA9IGkucmVnc1tkZXN0XS0+cmVnX251bTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewkJCS8qIGlmIGl0J3Mgbm90IDIgcmVnIG9wZXJhbmRzLi4uICovCi0JCWlmIChpLm1lbV9vcGVyYW5kcykKLQkJICB7Ci0JCSAgICB1bnNpZ25lZCBpbnQgZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDA7Ci0JCSAgICB1bnNpZ25lZCBpbnQgb3AgPSAoKGkudHlwZXNbMF0gJiBBbnlNZW0pCi0JCQkJICAgICAgID8gMAotCQkJCSAgICAgICA6IChpLnR5cGVzWzFdICYgQW55TWVtKSA/IDEgOiAyKTsKLQotCQkgICAgZGVmYXVsdF9zZWcgPSAmZHM7Ci0KLQkJICAgIGlmICghIGkuYmFzZV9yZWcpCi0JCSAgICAgIHsKLQkJCWkucm0ubW9kZSA9IDA7Ci0JCQlpZiAoISBpLmRpc3Bfb3BlcmFuZHMpCi0JCQkgIGZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAxOwotCQkJaWYgKCEgaS5pbmRleF9yZWcpCi0JCQkgIHsKLQkJCSAgICAvKiBPcGVyYW5kIGlzIGp1c3QgPGRpc3A+ICovCi0JCQkgICAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkpCi0JCQkgICAgICB7Ci0JCQkJaS5ybS5yZWdtZW0gPSBOT19CQVNFX1JFR0lTVEVSXzE2OwotCQkJCWkudHlwZXNbb3BdICY9IH5EaXNwOwotCQkJCWkudHlwZXNbb3BdIHw9IERpc3AxNjsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkJaS5ybS5yZWdtZW0gPSBOT19CQVNFX1JFR0lTVEVSOwotCQkJCWkudHlwZXNbb3BdICY9IH5EaXNwOwotCQkJCWkudHlwZXNbb3BdIHw9IERpc3AzMjsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJZWxzZSAvKiAhIGkuYmFzZV9yZWcgJiYgaS5pbmRleF9yZWcgKi8KLQkJCSAgewotCQkJICAgIGkuc2liLmluZGV4ID0gaS5pbmRleF9yZWctPnJlZ19udW07Ci0JCQkgICAgaS5zaWIuYmFzZSA9IE5PX0JBU0VfUkVHSVNURVI7Ci0JCQkgICAgaS5zaWIuc2NhbGUgPSBpLmxvZzJfc2NhbGVfZmFjdG9yOwotCQkJICAgIGkucm0ucmVnbWVtID0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkc7Ci0JCQkgICAgaS50eXBlc1tvcF0gJj0gfkRpc3A7Ci0JCQkgICAgaS50eXBlc1tvcF0gfD0gRGlzcDMyOwkvKiBNdXN0IGJlIDMyIGJpdCAqLwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMTYpCi0JCSAgICAgIHsKLQkJCXN3aXRjaCAoaS5iYXNlX3JlZy0+cmVnX251bSkKLQkJCSAgewotCQkJICBjYXNlIDM6IC8qICglYngpICovCi0JCQkgICAgaWYgKCEgaS5pbmRleF9yZWcpCi0JCQkgICAgICBpLnJtLnJlZ21lbSA9IDc7Ci0JCQkgICAgZWxzZSAvKiAoJWJ4LCVzaSkgLT4gMCwgb3IgKCVieCwlZGkpIC0+IDEgKi8KLQkJCSAgICAgIGkucm0ucmVnbWVtID0gaS5pbmRleF9yZWctPnJlZ19udW0gLSA2OwotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlIDU6IC8qICglYnApICovCi0JCQkgICAgZGVmYXVsdF9zZWcgPSAmc3M7Ci0JCQkgICAgaWYgKCEgaS5pbmRleF9yZWcpCi0JCQkgICAgICB7Ci0JCQkJaS5ybS5yZWdtZW0gPSA2OwotCQkJCWlmICgoaS50eXBlc1tvcF0gJiBEaXNwKSA9PSAwKQotCQkJCSAgewotCQkJCSAgICAvKiBmYWtlICglYnApIGludG8gMCglYnApICovCi0JCQkJICAgIGkudHlwZXNbb3BdIHw9IERpc3A4OwotCQkJCSAgICBmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMTsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlIC8qICglYnAsJXNpKSAtPiAyLCBvciAoJWJwLCVkaSkgLT4gMyAqLwotCQkJICAgICAgaS5ybS5yZWdtZW0gPSBpLmluZGV4X3JlZy0+cmVnX251bSAtIDYgKyAyOwotCQkJICAgIGJyZWFrOwotCQkJICBkZWZhdWx0OiAvKiAoJXNpKSAtPiA0IG9yICglZGkpIC0+IDUgKi8KLQkJCSAgICBpLnJtLnJlZ21lbSA9IGkuYmFzZV9yZWctPnJlZ19udW0gLSA2ICsgNDsKLQkJCSAgfQotCQkJaS5ybS5tb2RlID0gbW9kZV9mcm9tX2Rpc3Bfc2l6ZSAoaS50eXBlc1tvcF0pOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIC8qIGkuYmFzZV9yZWcgYW5kIDMyIGJpdCBtb2RlICovCi0JCSAgICAgIHsKLQkJCWkucm0ucmVnbWVtID0gaS5iYXNlX3JlZy0+cmVnX251bTsKLQkJCWkuc2liLmJhc2UgPSBpLmJhc2VfcmVnLT5yZWdfbnVtOwotCQkJaWYgKGkuYmFzZV9yZWctPnJlZ19udW0gPT0gRUJQX1JFR19OVU0pCi0JCQkgIHsKLQkJCSAgICBkZWZhdWx0X3NlZyA9ICZzczsKLQkJCSAgICBpZiAoaS5kaXNwX29wZXJhbmRzID09IDApCi0JCQkgICAgICB7Ci0JCQkJZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDE7Ci0JCQkJaS50eXBlc1tvcF0gfD0gRGlzcDg7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKGkuYmFzZV9yZWctPnJlZ19udW0gPT0gRVNQX1JFR19OVU0pCi0JCQkgIHsKLQkJCSAgICBkZWZhdWx0X3NlZyA9ICZzczsKLQkJCSAgfQotCQkJaS5zaWIuc2NhbGUgPSBpLmxvZzJfc2NhbGVfZmFjdG9yOwotCQkJaWYgKCEgaS5pbmRleF9yZWcpCi0JCQkgIHsKLQkJCSAgICAvKiA8ZGlzcD4oJWVzcCkgYmVjb21lcyB0d28gYnl0ZSBtb2RybQotCQkJICAgICAgIHdpdGggbm8gaW5kZXggcmVnaXN0ZXIuICBXZSd2ZSBhbHJlYWR5Ci0JCQkgICAgICAgc3RvcmVkIHRoZSBjb2RlIGZvciBlc3AgaW4gaS5ybS5yZWdtZW0KLQkJCSAgICAgICBpZS4gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkcuICBBbnkKLQkJCSAgICAgICBiYXNlIHJlZ2lzdGVyIGJlc2lkZXMgJWVzcCB3aWxsIG5vdCB1c2UKLQkJCSAgICAgICB0aGUgZXh0cmEgbW9kcm0gYnl0ZS4gICovCi0JCQkgICAgaS5zaWIuaW5kZXggPSBOT19JTkRFWF9SRUdJU1RFUjsKLSNpZiAhIFNDQUxFMV9XSEVOX05PX0lOREVYCi0JCQkgICAgLyogQW5vdGhlciBjYXNlIHdoZXJlIHdlIGZvcmNlIHRoZSBzZWNvbmQKLQkJCSAgICAgICBtb2RybSBieXRlLiAgKi8KLQkJCSAgICBpZiAoaS5sb2cyX3NjYWxlX2ZhY3RvcikKLQkJCSAgICAgIGkucm0ucmVnbWVtID0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkc7Ci0jZW5kaWYKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaS5zaWIuaW5kZXggPSBpLmluZGV4X3JlZy0+cmVnX251bTsKLQkJCSAgICBpLnJtLnJlZ21lbSA9IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HOwotCQkJICB9Ci0JCQlpLnJtLm1vZGUgPSBtb2RlX2Zyb21fZGlzcF9zaXplIChpLnR5cGVzW29wXSk7Ci0JCSAgICAgIH0KLQotCQkgICAgaWYgKGZha2VfemVyb19kaXNwbGFjZW1lbnQpCi0JCSAgICAgIHsKLQkJCS8qIEZha2VzIGEgemVybyBkaXNwbGFjZW1lbnQgYXNzdW1pbmcgdGhhdCBpLnR5cGVzW29wXQotCQkJICAgaG9sZHMgdGhlIGNvcnJlY3QgZGlzcGxhY2VtZW50IHNpemUuICovCi0JCQlleHByZXNzaW9uUyAqZXhwOwotCi0JCQlleHAgPSAmZGlzcF9leHByZXNzaW9uc1tpLmRpc3Bfb3BlcmFuZHMrK107Ci0JCQlpLmRpc3BzW29wXSA9IGV4cDsKLQkJCWV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JCQlleHAtPlhfYWRkX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0JCQlleHAtPlhfb3Bfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBGaWxsIGluIGkucm0ucmVnIG9yIGkucm0ucmVnbWVtIGZpZWxkIHdpdGggcmVnaXN0ZXIKLQkJICAgb3BlcmFuZCAoaWYgYW55KSBiYXNlZCBvbiBpLnRtLmV4dGVuc2lvbl9vcGNvZGUuCi0JCSAgIEFnYWluLCB3ZSBtdXN0IGJlIGNhcmVmdWwgdG8gbWFrZSBzdXJlIHRoYXQKLQkJICAgc2VnbWVudC9jb250cm9sL2RlYnVnL3Rlc3QvTU1YIHJlZ2lzdGVycyBhcmUgY29kZWQKLQkJICAgaW50byB0aGUgaS5ybS5yZWcgZmllbGQuICovCi0JCWlmIChpLnJlZ19vcGVyYW5kcykKLQkJICB7Ci0JCSAgICB1bnNpZ25lZCBpbnQgb3AgPQotCQkgICAgICAoKGkudHlwZXNbMF0KLQkJCSYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJICAgfCBTUmVnMiB8IFNSZWczCi0JCQkgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QpKQotCQkgICAgICAgPyAwCi0JCSAgICAgICA6ICgoaS50eXBlc1sxXQotCQkJICAgJiAoUmVnIHwgUmVnTU1YIHwgUmVnWE1NCi0JCQkgICAgICB8IFNSZWcyIHwgU1JlZzMKLQkJCSAgICAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCkpCi0JCQkgID8gMQotCQkJICA6IDIpKTsKLQkJICAgIC8qIElmIHRoZXJlIGlzIGFuIGV4dGVuc2lvbiBvcGNvZGUgdG8gcHV0IGhlcmUsIHRoZQotCQkgICAgICAgcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgcHV0IGludG8gdGhlIHJlZ21lbSBmaWVsZC4gKi8KLQkJICAgIGlmIChpLnRtLmV4dGVuc2lvbl9vcGNvZGUgIT0gTm9uZSkKLQkJICAgICAgaS5ybS5yZWdtZW0gPSBpLnJlZ3Nbb3BdLT5yZWdfbnVtOwotCQkgICAgZWxzZQotCQkgICAgICBpLnJtLnJlZyA9IGkucmVnc1tvcF0tPnJlZ19udW07Ci0KLQkJICAgIC8qIE5vdywgaWYgbm8gbWVtb3J5IG9wZXJhbmQgaGFzIHNldCBpLnJtLm1vZGUgPSAwLCAxLCAyCi0JCSAgICAgICB3ZSBtdXN0IHNldCBpdCB0byAzIHRvIGluZGljYXRlIHRoaXMgaXMgYSByZWdpc3RlcgotCQkgICAgICAgb3BlcmFuZCBpbiB0aGUgcmVnbWVtIGZpZWxkLiAgKi8KLQkJICAgIGlmICghaS5tZW1fb3BlcmFuZHMpCi0JCSAgICAgIGkucm0ubW9kZSA9IDM7Ci0JCSAgfQotCi0JCS8qIEZpbGwgaW4gaS5ybS5yZWcgZmllbGQgd2l0aCBleHRlbnNpb24gb3Bjb2RlIChpZiBhbnkpLiAqLwotCQlpZiAoaS50bS5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCi0JCSAgaS5ybS5yZWcgPSBpLnRtLmV4dGVuc2lvbl9vcGNvZGU7Ci0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgKFNlZzJTaG9ydEZvcm0gfCBTZWczU2hvcnRGb3JtKSkKLQkgIHsKLQkgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gUE9QX1NFR19TSE9SVCAmJiBpLnJlZ3NbMF0tPnJlZ19udW0gPT0gMSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygieW91IGNhbid0IGBwb3AgJSVjcyciKSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gKGkucmVnc1swXS0+cmVnX251bSA8PCAzKTsKLQkgIH0KLQllbHNlIGlmICgoaS50bS5iYXNlX29wY29kZSAmIH4oRHxXKSkgPT0gTU9WX0FYX0RJU1AzMikKLQkgIHsKLQkgICAgZGVmYXVsdF9zZWcgPSAmZHM7Ci0JICB9Ci0JZWxzZSBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpICE9IDApCi0JICB7Ci0JICAgIC8qIEZvciB0aGUgc3RyaW5nIGluc3RydWN0aW9ucyB0aGF0IGFsbG93IGEgc2VnbWVudCBvdmVycmlkZQotCSAgICAgICBvbiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMsIHRoZSBkZWZhdWx0IHNlZ21lbnQgaXMgZHMuICAqLwotCSAgICBkZWZhdWx0X3NlZyA9ICZkczsKLQkgIH0KLQotCS8qIElmIGEgc2VnbWVudCB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQsCi0JICAgYW5kIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBpcyBub3QgdGhlIGRlZmF1bHQsCi0JICAgdXNlIGFuIG9wY29kZSBwcmVmaXggdG8gc2VsZWN0IGl0LgotCSAgIElmIHdlIG5ldmVyIGZpZ3VyZWQgb3V0IHdoYXQgdGhlIGRlZmF1bHQgc2VnbWVudCBpcywKLQkgICB0aGVuIGRlZmF1bHRfc2VnIHdpbGwgYmUgemVybyBhdCB0aGlzIHBvaW50LAotCSAgIGFuZCB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgcHJlZml4IHdpbGwgYWx3YXlzIGJlIHVzZWQuICAqLwotCWlmICgoaS5zZWdbMF0pICYmIChpLnNlZ1swXSAhPSBkZWZhdWx0X3NlZykpCi0JICB7Ci0JICAgIGlmICghIGFkZF9wcmVmaXggKGkuc2VnWzBdLT5zZWdfcHJlZml4KSkKLQkgICAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVWdoKSAhPSAwKQotICAgICAgewotCS8qIFVuaXhXYXJlIGZzdWIgbm8gYXJncyBpcyBhbGlhcyBmb3IgZnN1YnAsIGZhZGQgLT4gZmFkZHAsIGV0Yy4gICovCi0JYXNfd2FybiAoXygidHJhbnNsYXRpbmcgdG8gYCVzcCciKSwgaS50bS5uYW1lKTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIEhhbmRsZSBjb252ZXJzaW9uIG9mICdpbnQgJDMnIC0tPiBzcGVjaWFsIGludDMgaW5zbi4gKi8KLSAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gSU5UX09QQ09ERSAmJiBpLmltbXNbMF0tPlhfYWRkX251bWJlciA9PSAzKQotICAgIHsKLSAgICAgIGkudG0uYmFzZV9vcGNvZGUgPSBJTlQzX09QQ09ERTsKLSAgICAgIGkuaW1tX29wZXJhbmRzID0gMDsKLSAgICB9Ci0KLSAgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIChKdW1wIHwgSnVtcEJ5dGUgfCBKdW1wRHdvcmQpKQotICAgICAgJiYgaS5kaXNwc1swXS0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIC8qIENvbnZlcnQgImptcCBjb25zdGFudCIgKGFuZCAiY2FsbCBjb25zdGFudCIpIHRvIGEganVtcCAoY2FsbCkgdG8KLQkgdGhlIGFic29sdXRlIGFkZHJlc3MgZ2l2ZW4gYnkgdGhlIGNvbnN0YW50LiAgU2luY2UgaXg4NiBqdW1wcyBhbmQKLQkgY2FsbHMgYXJlIHBjIHJlbGF0aXZlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVsb2MuICAqLwotICAgICAgaS5kaXNwc1swXS0+WF9hZGRfc3ltYm9sID0gJmFic19zeW1ib2w7Ci0gICAgICBpLmRpc3BzWzBdLT5YX29wID0gT19zeW1ib2w7Ci0gICAgfQotCi0gIC8qIFdlIGFyZSByZWFkeSB0byBvdXRwdXQgdGhlIGluc24uICovCi0gIHsKLSAgICByZWdpc3RlciBjaGFyICpwOwotCi0gICAgLyogT3V0cHV0IGp1bXBzLiAqLwotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEp1bXApCi0gICAgICB7Ci0JaW50IHNpemU7Ci0JaW50IGNvZGUxNjsKLQlpbnQgcHJlZml4OwotCi0JY29kZTE2ID0gMDsKLQlpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgY29kZTE2ID0gQ09ERTE2OwotCi0JcHJlZml4ID0gMDsKLQlpZiAoaS5wcmVmaXhbREFUQV9QUkVGSVhdKQotCSAgewotCSAgICBwcmVmaXggPSAxOwotCSAgICBpLnByZWZpeGVzIC09IDE7Ci0JICAgIGNvZGUxNiBePSBDT0RFMTY7Ci0JICB9Ci0KLQlzaXplID0gNDsKLQlpZiAoY29kZTE2KQotCSAgc2l6ZSA9IDI7Ci0KLQlpZiAoaS5wcmVmaXhlcyAhPSAwICYmICFpbnRlbF9zeW50YXgpCi0JICBhc193YXJuIChfKCJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIikpOwotCi0JLyogSXQncyBhbHdheXMgYSBzeW1ib2w7ICBFbmQgZnJhZyAmIHNldHVwIGZvciByZWxheC4KLQkgICBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhpcyBmcmFnIGZvciB0aGUgbGFyZ2VzdAotCSAgIGluc3RydWN0aW9uIHdlIG1heSBnZW5lcmF0ZSBpbiBtZF9jb252ZXJ0X2ZyYWcuICBUaGlzIGlzIDIKLQkgICBieXRlcyBmb3IgdGhlIG9wY29kZSBhbmQgcm9vbSBmb3IgdGhlIHByZWZpeCBhbmQgbGFyZ2VzdAotCSAgIGRpc3BsYWNlbWVudC4gICovCi0JZnJhZ19ncm93IChwcmVmaXggKyAyICsgc2l6ZSk7Ci0JaW5zbl9zaXplICs9IHByZWZpeCArIDE7Ci0JLyogUHJlZml4IGFuZCAxIG9wY29kZSBieXRlIGdvIGluIGZyX2ZpeC4gICovCi0JcCA9IGZyYWdfbW9yZSAocHJlZml4ICsgMSk7Ci0JaWYgKHByZWZpeCkKLQkgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JKnAgPSBpLnRtLmJhc2Vfb3Bjb2RlOwotCS8qIDEgcG9zc2libGUgZXh0cmEgb3Bjb2RlICsgZGlzcGxhY2VtZW50IGdvIGluIGZyX3Zhci4gICovCi0JZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkgIDEgKyBzaXplLAotCQkgIDEsCi0JCSAgKCh1bnNpZ25lZCBjaGFyKSAqcCA9PSBKVU1QX1BDX1JFTEFUSVZFCi0JCSAgID8gRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwpIHwgY29kZTE2Ci0JCSAgIDogRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMKSB8IGNvZGUxNiksCi0JCSAgaS5kaXNwc1swXS0+WF9hZGRfc3ltYm9sLAotCQkgIGkuZGlzcHNbMF0tPlhfYWRkX251bWJlciwKLQkJICBwKTsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChKdW1wQnl0ZSB8IEp1bXBEd29yZCkpCi0gICAgICB7Ci0JaW50IHNpemU7Ci0KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wQnl0ZSkKLQkgIHsKLQkgICAgLyogVGhpcyBpcyBhIGxvb3Agb3IgamVjeHogdHlwZSBpbnN0cnVjdGlvbi4gICovCi0JICAgIHNpemUgPSAxOwotCSAgICBpZiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDE7Ci0JCUZSQUdfQVBQRU5EXzFfQ0hBUiAoQUREUl9QUkVGSVhfT1BDT0RFKTsKLQkJaS5wcmVmaXhlcyAtPSAxOwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGludCBjb2RlMTY7Ci0KLQkgICAgY29kZTE2ID0gMDsKLQkgICAgaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgICAgICBjb2RlMTYgPSBDT0RFMTY7Ci0KLQkgICAgaWYgKGkucHJlZml4W0RBVEFfUFJFRklYXSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlGUkFHX0FQUEVORF8xX0NIQVIgKERBVEFfUFJFRklYX09QQ09ERSk7Ci0JCWkucHJlZml4ZXMgLT0gMTsKLQkJY29kZTE2IF49IENPREUxNjsKLQkgICAgICB9Ci0KLQkgICAgc2l6ZSA9IDQ7Ci0JICAgIGlmIChjb2RlMTYpCi0JICAgICAgc2l6ZSA9IDI7Ci0JICB9Ci0KLQlpZiAoaS5wcmVmaXhlcyAhPSAwICYmICFpbnRlbF9zeW50YXgpCi0JICBhc193YXJuIChfKCJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIikpOwotCi0JaWYgKGZpdHNfaW5fdW5zaWduZWRfYnl0ZSAoaS50bS5iYXNlX29wY29kZSkpCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAxICsgc2l6ZTsKLQkgICAgcCA9IGZyYWdfbW9yZSAoMSArIHNpemUpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogb3Bjb2RlIGNhbiBiZSBhdCBtb3N0IHR3byBieXRlcyAqLwotCSAgICBpbnNuX3NpemUgKz0gMiArIHNpemU7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDIgKyBzaXplKTsKLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDgpICYgMHhmZjsKLQkgIH0KLQkqcCsrID0gaS50bS5iYXNlX29wY29kZSAmIDB4ZmY7Ci0KLQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJICAgICBpLmRpc3BzWzBdLCAxLCByZWxvYyAoc2l6ZSwgMSwgaS5kaXNwX3JlbG9jWzBdKSk7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wSW50ZXJTZWdtZW50KQotICAgICAgewotCWludCBzaXplOwotCWludCByZWxvY190eXBlOwotCWludCBwcmVmaXg7Ci0JaW50IGNvZGUxNjsKLQotCWNvZGUxNiA9IDA7Ci0JaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgIGNvZGUxNiA9IENPREUxNjsKLQotCXByZWZpeCA9IDA7Ci0JaWYgKGkucHJlZml4W0RBVEFfUFJFRklYXSkKLQkgIHsKLQkgICAgcHJlZml4ID0gMTsKLQkgICAgaS5wcmVmaXhlcyAtPSAxOwotCSAgICBjb2RlMTYgXj0gQ09ERTE2OwotCSAgfQotCi0Jc2l6ZSA9IDQ7Ci0JcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLQlpZiAoY29kZTE2KQotCSAgewotCSAgICBzaXplID0gMjsKLQkgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18xNjsKLQkgIH0KLQotCWlmIChpLnByZWZpeGVzICE9IDAgJiYgIWludGVsX3N5bnRheCkKLQkgIGFzX3dhcm4gKF8oInNraXBwaW5nIHByZWZpeGVzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24iKSk7Ci0KLQlpbnNuX3NpemUgKz0gcHJlZml4ICsgMSArIDIgKyBzaXplOyAgLyogMSBvcGNvZGU7IDIgc2VnbWVudDsgb2Zmc2V0ICovCi0JcCA9IGZyYWdfbW9yZSAocHJlZml4ICsgMSArIDIgKyBzaXplKTsKLQlpZiAocHJlZml4KQotCSAgKnArKyA9IERBVEFfUFJFRklYX09QQ09ERTsKLQkqcCsrID0gaS50bS5iYXNlX29wY29kZTsKLQlpZiAoaS5pbW1zWzFdLT5YX29wID09IE9fY29uc3RhbnQpCi0JICB7Ci0JICAgIGxvbmcgbiA9IChsb25nKSBpLmltbXNbMV0tPlhfYWRkX251bWJlcjsKLQotCSAgICBpZiAoc2l6ZSA9PSAyICYmICFmaXRzX2luX3Vuc2lnbmVkX3dvcmQgKG4pKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCIxNi1iaXQganVtcCBvdXQgb2YgcmFuZ2UiKSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgbiwgc2l6ZSk7Ci0JICB9Ci0JZWxzZQotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCSAgICAgICBpLmltbXNbMV0sIDAsIHJlbG9jX3R5cGUpOwotCWlmIChpLmltbXNbMF0tPlhfb3AgIT0gT19jb25zdGFudCkKLQkgIGFzX2JhZCAoXygiY2FuJ3QgaGFuZGxlIG5vbiBhYnNvbHV0ZSBzZWdtZW50IGluIGAlcyciKSwKLQkJICBpLnRtLm5hbWUpOwotCW1kX251bWJlcl90b19jaGFycyAocCArIHNpemUsICh2YWx1ZVQpIGkuaW1tc1swXS0+WF9hZGRfbnVtYmVyLCAyKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JLyogT3V0cHV0IG5vcm1hbCBpbnN0cnVjdGlvbnMgaGVyZS4gKi8KLQl1bnNpZ25lZCBjaGFyICpxOwotCi0JLyogVGhlIHByZWZpeCBieXRlcy4gKi8KLQlmb3IgKHEgPSBpLnByZWZpeDsKLQkgICAgIHEgPCBpLnByZWZpeCArIHNpemVvZiAoaS5wcmVmaXgpIC8gc2l6ZW9mIChpLnByZWZpeFswXSk7Ci0JICAgICBxKyspCi0JICB7Ci0JICAgIGlmICgqcSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlwID0gZnJhZ19tb3JlICgxKTsKLQkJbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAqcSwgMSk7Ci0JICAgICAgfQotCSAgfQotCi0JLyogTm93IHRoZSBvcGNvZGU7IGJlIGNhcmVmdWwgYWJvdXQgd29yZCBvcmRlciBoZXJlISAqLwotCWlmIChmaXRzX2luX3Vuc2lnbmVkX2J5dGUgKGkudG0uYmFzZV9vcGNvZGUpKQotCSAgewotCSAgICBpbnNuX3NpemUgKz0gMTsKLQkgICAgRlJBR19BUFBFTkRfMV9DSEFSIChpLnRtLmJhc2Vfb3Bjb2RlKTsKLQkgIH0KLQllbHNlIGlmIChmaXRzX2luX3Vuc2lnbmVkX3dvcmQgKGkudG0uYmFzZV9vcGNvZGUpKQotCSAgewotCSAgICBpbnNuX3NpemUgKz0gMjsKLQkgICAgcCA9IGZyYWdfbW9yZSAoMik7Ci0JICAgIC8qIHB1dCBvdXQgaGlnaCBieXRlIGZpcnN0OiBjYW4ndCB1c2UgbWRfbnVtYmVyX3RvX2NoYXJzISAqLwotCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gOCkgJiAweGZmOwotCSAgICAqcCA9IGkudG0uYmFzZV9vcGNvZGUgJiAweGZmOwotCSAgfQotCWVsc2UKLQkgIHsJCQkvKiBvcGNvZGUgaXMgZWl0aGVyIDMgb3IgNCBieXRlcyAqLwotCSAgICBpZiAoaS50bS5iYXNlX29wY29kZSAmIDB4ZmYwMDAwMDApCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gNDsKLQkJcCA9IGZyYWdfbW9yZSAoNCk7Ci0JCSpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiAyNCkgJiAweGZmOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDM7Ci0JCXAgPSBmcmFnX21vcmUgKDMpOwotCSAgICAgIH0KLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDE2KSAmIDB4ZmY7Ci0JICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiA4KSAmIDB4ZmY7Ci0JICAgICpwID0gKGkudG0uYmFzZV9vcGNvZGUpICYgMHhmZjsKLQkgIH0KLQotCS8qIE5vdyB0aGUgbW9kcm0gYnl0ZSBhbmQgc2liIGJ5dGUgKGlmIHByZXNlbnQpLiAgKi8KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBNb2RybSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDE7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDEpOwotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJKHZhbHVlVCkgKGkucm0ucmVnbWVtIDw8IDAKLQkJCQkJICB8IGkucm0ucmVnIDw8IDMKLQkJCQkJICB8IGkucm0ubW9kZSA8PCA2KSwKLQkJCQkxKTsKLQkgICAgLyogSWYgaS5ybS5yZWdtZW0gPT0gRVNQICg0KQotCSAgICAgICAmJiBpLnJtLm1vZGUgIT0gKFJlZ2lzdGVyIG1vZGUpCi0JICAgICAgICYmIG5vdCAxNiBiaXQKLQkgICAgICAgPT0+IG5lZWQgc2Vjb25kIG1vZHJtIGJ5dGUuICAqLwotCSAgICBpZiAoaS5ybS5yZWdtZW0gPT0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkcKLQkJJiYgaS5ybS5tb2RlICE9IDMKLQkJJiYgIShpLmJhc2VfcmVnICYmIChpLmJhc2VfcmVnLT5yZWdfdHlwZSAmIFJlZzE2KSAhPSAwKSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlwID0gZnJhZ19tb3JlICgxKTsKLQkJbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCSAgICAodmFsdWVUKSAoaS5zaWIuYmFzZSA8PCAwCi0JCQkJCSAgICAgIHwgaS5zaWIuaW5kZXggPDwgMwotCQkJCQkgICAgICB8IGkuc2liLnNjYWxlIDw8IDYpLAotCQkJCSAgICAxKTsKLQkgICAgICB9Ci0JICB9Ci0KLQlpZiAoaS5kaXNwX29wZXJhbmRzKQotCSAgewotCSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbjsKLQotCSAgICBmb3IgKG4gPSAwOyBuIDwgaS5vcGVyYW5kczsgbisrKQotCSAgICAgIHsKLQkJaWYgKGkuZGlzcHNbbl0pCi0JCSAgewotCQkgICAgaWYgKGkuZGlzcHNbbl0tPlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJaW50IHNpemUgPSA0OwotCQkJbG9uZyB2YWwgPSAobG9uZykgaS5kaXNwc1tuXS0+WF9hZGRfbnVtYmVyOwotCi0JCQlpZiAoaS50eXBlc1tuXSAmIChEaXNwOCB8IERpc3AxNikpCi0JCQkgIHsKLQkJCSAgICBsb25nIG1hc2s7Ci0KLQkJCSAgICBzaXplID0gMjsKLQkJCSAgICBtYXNrID0gfiAobG9uZykgMHhmZmZmOwotCQkJICAgIGlmIChpLnR5cGVzW25dICYgRGlzcDgpCi0JCQkgICAgICB7Ci0JCQkJc2l6ZSA9IDE7Ci0JCQkJbWFzayA9IH4gKGxvbmcpIDB4ZmY7Ci0JCQkgICAgICB9Ci0KLQkJCSAgICBpZiAoKHZhbCAmIG1hc2spICE9IDAgJiYgKHZhbCAmIG1hc2spICE9IG1hc2spCi0JCQkgICAgICBhc193YXJuIChfKCIlbGQgc2hvcnRlbmVkIHRvICVsZCIpLAotCQkJCSAgICAgICB2YWwsIHZhbCAmIH5tYXNrKTsKLQkJCSAgfQotCQkJaW5zbl9zaXplICs9IHNpemU7Ci0JCQlwID0gZnJhZ19tb3JlIChzaXplKTsKLQkJCW1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgdmFsLCBzaXplKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoaS50eXBlc1tuXSAmIERpc3AzMikKLQkJICAgICAgewotCQkJaW5zbl9zaXplICs9IDQ7Ci0JCQlwID0gZnJhZ19tb3JlICg0KTsKLQkJCWZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQkJCSAgICAgaS5kaXNwc1tuXSwgMCwKLQkJCQkgICAgIFRDX1JFTE9DIChpLmRpc3BfcmVsb2Nbbl0sIEJGRF9SRUxPQ18zMikpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsgLyogbXVzdCBiZSBEaXNwMTYgKi8KLQkJCWluc25fc2l6ZSArPSAyOwotCQkJcCA9IGZyYWdfbW9yZSAoMik7Ci0JCQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwKLQkJCQkgICAgIGkuZGlzcHNbbl0sIDAsCi0JCQkJICAgICBUQ19SRUxPQyAoaS5kaXNwX3JlbG9jW25dLCBCRkRfUkVMT0NfMTYpKTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9CQkJLyogZW5kIGRpc3BsYWNlbWVudCBvdXRwdXQgKi8KLQotCS8qIG91dHB1dCBpbW1lZGlhdGUgKi8KLQlpZiAoaS5pbW1fb3BlcmFuZHMpCi0JICB7Ci0JICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBuOwotCi0JICAgIGZvciAobiA9IDA7IG4gPCBpLm9wZXJhbmRzOyBuKyspCi0JICAgICAgewotCQlpZiAoaS5pbW1zW25dKQotCQkgIHsKLQkJICAgIGlmIChpLmltbXNbbl0tPlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJaW50IHNpemUgPSA0OwotCQkJbG9uZyB2YWwgPSAobG9uZykgaS5pbW1zW25dLT5YX2FkZF9udW1iZXI7Ci0KLQkJCWlmIChpLnR5cGVzW25dICYgKEltbTggfCBJbW04UyB8IEltbTE2KSkKLQkJCSAgewotCQkJICAgIGxvbmcgbWFzazsKLQotCQkJICAgIHNpemUgPSAyOwotCQkJICAgIG1hc2sgPSB+IChsb25nKSAweGZmZmY7Ci0JCQkgICAgaWYgKGkudHlwZXNbbl0gJiAoSW1tOCB8IEltbThTKSkKLQkJCSAgICAgIHsKLQkJCQlzaXplID0gMTsKLQkJCQltYXNrID0gfiAobG9uZykgMHhmZjsKLQkJCSAgICAgIH0KLQkJCSAgICBpZiAoKHZhbCAmIG1hc2spICE9IDAgJiYgKHZhbCAmIG1hc2spICE9IG1hc2spCi0JCQkgICAgICBhc193YXJuIChfKCIlbGQgc2hvcnRlbmVkIHRvICVsZCIpLAotCQkJCSAgICAgICB2YWwsIHZhbCAmIH5tYXNrKTsKLQkJCSAgfQotCQkJaW5zbl9zaXplICs9IHNpemU7Ci0JCQlwID0gZnJhZ19tb3JlIChzaXplKTsKLQkJCW1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgdmFsLCBzaXplKTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7CQkvKiBub3QgYWJzb2x1dGVfc2VjdGlvbiAqLwotCQkJLyogTmVlZCBhIDMyLWJpdCBmaXh1cCAoZG9uJ3Qgc3VwcG9ydCA4Yml0Ci0JCQkgICBub24tYWJzb2x1dGUgaW1zKS4gIFRyeSB0byBzdXBwb3J0IG90aGVyCi0JCQkgICBzaXplcyAuLi4gKi8KLQkJCWludCByX3R5cGU7Ci0JCQlpbnQgc2l6ZTsKLQkJCWludCBwY3JlbCA9IDA7Ci0KLQkJCWlmIChpLnR5cGVzW25dICYgKEltbTggfCBJbW04UykpCi0JCQkgIHNpemUgPSAxOwotCQkJZWxzZSBpZiAoaS50eXBlc1tuXSAmIEltbTE2KQotCQkJICBzaXplID0gMjsKLQkJCWVsc2UKLQkJCSAgc2l6ZSA9IDQ7Ci0JCQlpbnNuX3NpemUgKz0gc2l6ZTsKLQkJCXAgPSBmcmFnX21vcmUgKHNpemUpOwotCQkJcl90eXBlID0gcmVsb2MgKHNpemUsIDAsIGkuZGlzcF9yZWxvY1swXSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfMzIKLQkJCSAgICAmJiBHT1Rfc3ltYm9sCi0JCQkgICAgJiYgR09UX3N5bWJvbCA9PSBpLmltbXNbbl0tPlhfYWRkX3N5bWJvbAotCQkJICAgICYmIChpLmltbXNbbl0tPlhfb3AgPT0gT19zeW1ib2wKLQkJCQl8fCAoaS5pbW1zW25dLT5YX29wID09IE9fYWRkCi0JCQkJICAgICYmICgoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uCi0JCQkJCSAoaS5pbW1zW25dLT5YX29wX3N5bWJvbCktPlhfb3ApCi0JCQkJCT09IE9fc3VidHJhY3QpKSkpCi0JCQkgIHsKLQkJCSAgICByX3R5cGUgPSBCRkRfUkVMT0NfMzg2X0dPVFBDOwotCQkJICAgIGkuaW1tc1tuXS0+WF9hZGRfbnVtYmVyICs9IDM7Ci0JCQkgIH0KLSNlbmRpZgotCQkJZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCQkJICAgICBpLmltbXNbbl0sIHBjcmVsLCByX3R5cGUpOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0JCQkvKiBlbmQgaW1tZWRpYXRlIG91dHB1dCAqLwotICAgICAgfQotCi0jaWZkZWYgREVCVUczODYKLSAgICBpZiAoZmxhZ19kZWJ1ZykKLSAgICAgIHsKLQlwaSAobGluZSwgJmkpOwotICAgICAgfQotI2VuZGlmIC8qIERFQlVHMzg2ICovCi0gIH0KLX0KLQwKLXN0YXRpYyBpbnQgaTM4Nl9pbW1lZGlhdGUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfaW1tZWRpYXRlIChpbW1fc3RhcnQpCi0gICAgIGNoYXIgKmltbV9zdGFydDsKLXsKLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHNlZ1QgZXhwX3NlZyA9IDA7Ci0gIGV4cHJlc3Npb25TICogZXhwOwotCi0gIGlmIChpLmltbV9vcGVyYW5kcyA9PSBNQVhfSU1NRURJQVRFX09QRVJBTkRTKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiT25seSAxIG9yIDIgaW1tZWRpYXRlIG9wZXJhbmRzIGFyZSBhbGxvd2VkIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGV4cCA9ICZpbV9leHByZXNzaW9uc1tpLmltbV9vcGVyYW5kcysrXTsKLSAgaS5pbW1zW3RoaXNfb3BlcmFuZF0gPSBleHA7Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCppbW1fc3RhcnQpKQotICAgICsraW1tX3N0YXJ0OwotCi0gIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbW1fc3RhcnQ7Ci0KLSNpZm5kZWYgTEVYX0FUCi0gIHsKLSAgICAvKgotICAgICAqIFdlIGNhbiBoYXZlIG9wZXJhbmRzIG9mIHRoZSBmb3JtCi0gICAgICogICA8c3ltYm9sPkBHT1RPRkYrPG5ubj4KLSAgICAgKiBUYWtlIHRoZSBlYXN5IHdheSBvdXQgaGVyZSBhbmQgY29weSBldmVyeXRoaW5nCi0gICAgICogaW50byBhIHRlbXBvcmFyeSBidWZmZXIuLi4KLSAgICAgKi8KLSAgICByZWdpc3RlciBjaGFyICpjcDsKLQotICAgIGNwID0gc3RyY2hyIChpbnB1dF9saW5lX3BvaW50ZXIsICdAJyk7Ci0gICAgaWYgKGNwICE9IE5VTEwpCi0gICAgICB7Ci0JY2hhciAqdG1wYnVmOwotCWludCBsZW4gPSAwOwotCWludCBmaXJzdDsKLQotCS8qIEdPVCByZWxvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSAqLwotCWlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICBhc19iYWQgKF8oIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIikpOwotCi0JaWYgKEdPVF9zeW1ib2wgPT0gTlVMTCkKLQkgIEdPVF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOwotCi0JaWYgKHN0cm5jbXAgKGNwICsgMSwgIlBMVCIsIDMpID09IDApCi0JICB7Ci0JICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9QTFQzMjsKLQkgICAgbGVuID0gMzsKLQkgIH0KLQllbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1RPRkYiLCA2KSA9PSAwKQotCSAgewotCSAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UT0ZGOwotCSAgICBsZW4gPSA2OwotCSAgfQotCWVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVCIsIDMpID09IDApCi0JICB7Ci0JICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1QzMjsKLQkgICAgbGVuID0gMzsKLQkgIH0KLQllbHNlCi0JICBhc19iYWQgKF8oIkJhZCByZWxvYyBzcGVjaWZpZXIgaW4gZXhwcmVzc2lvbiIpKTsKLQotCS8qIFJlcGxhY2UgdGhlIHJlbG9jYXRpb24gdG9rZW4gd2l0aCAnICcsIHNvIHRoYXQgZXJyb3JzIGxpa2UKLQkgICBmb29AR09UT0ZGMSB3aWxsIGJlIGRldGVjdGVkLiAgKi8KLQlmaXJzdCA9IGNwIC0gaW5wdXRfbGluZV9wb2ludGVyOwotCXRtcGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuKGlucHV0X2xpbmVfcG9pbnRlcikpOwotCW1lbWNweSAodG1wYnVmLCBpbnB1dF9saW5lX3BvaW50ZXIsIGZpcnN0KTsKLQl0bXBidWZbZmlyc3RdID0gJyAnOwotCXN0cmNweSAodG1wYnVmICsgZmlyc3QgKyAxLCBjcCArIDEgKyBsZW4pOwotCWlucHV0X2xpbmVfcG9pbnRlciA9IHRtcGJ1ZjsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgZXhwX3NlZyA9IGV4cHJlc3Npb24gKGV4cCk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICBhc19iYWQgKF8oIklnbm9yaW5nIGp1bmsgYCVzJyBhZnRlciBleHByZXNzaW9uIiksIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKGV4cC0+WF9vcCA9PSBPX2Fic2VudCB8fCBleHAtPlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgLyogbWlzc2luZyBvciBiYWQgZXhwciBiZWNvbWVzIGFic29sdXRlIDAgKi8KLSAgICAgIGFzX2JhZCAoXygiTWlzc2luZyBvciBpbnZhbGlkIGltbWVkaWF0ZSBleHByZXNzaW9uIGAlcycgdGFrZW4gYXMgMCIpLAotCSAgICAgIGltbV9zdGFydCk7Ci0gICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZXhwLT5YX2FkZF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotICAgICAgZXhwLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0gICAgfQotCi0gIGlmIChleHAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnQgYmlnaW1tID0gSW1tMzI7Ci0gICAgICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwKSkKLQliaWdpbW0gPSBJbW0xNjsKLQotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9Ci0JKGJpZ2ltbSB8IHNtYWxsZXN0X2ltbV90eXBlICgobG9uZykgZXhwLT5YX2FkZF9udW1iZXIpKTsKLQotICAgICAgLyogSWYgYSBzdWZmaXggaXMgZ2l2ZW4sIHRoaXMgb3BlcmFuZCBtYXkgYmUgc2hvcnRlbmRlZC4gKi8KLSAgICAgIHN3aXRjaCAoaS5zdWZmaXgpCi0JewotCWNhc2UgV09SRF9NTkVNX1NVRkZJWDoKLQkgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBJbW0xNjsKLQkgIGJyZWFrOwotCWNhc2UgQllURV9NTkVNX1NVRkZJWDoKLQkgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBJbW0xNiB8IEltbTggfCBJbW04UzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0jaWZkZWYgT0JKX0FPVVQKLSAgZWxzZSBpZiAoZXhwX3NlZyAhPSB0ZXh0X3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IGRhdGFfc2VjdGlvbgotCSAgICYmIGV4cF9zZWcgIT0gYnNzX3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKGV4cF9zZWcpCi0jZW5kaWYKLQkgICApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIiksIGV4cF9zZWcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2VuZGlmCi0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIGFkZHJlc3MuICBUaGUgc2l6ZSBvZiB0aGUgYWRkcmVzcyB3aWxsIGJlCi0JIGRldGVybWluZWQgbGF0ZXIsIGRlcGVuZGluZyBvbiBkZXN0aW5hdGlvbiByZWdpc3RlciwKLQkgc3VmZml4LCBvciB0aGUgZGVmYXVsdCBmb3IgdGhlIHNlY3Rpb24uICBXZSBleGNsdWRlCi0JIEltbThTIGhlcmUgc28gdGhhdCBgcHVzaCAkZm9vJyBhbmQgb3RoZXIgaW5zdHJ1Y3Rpb25zCi0JIHdpdGggYW4gSW1tOFMgZm9ybSB3aWxsIHVzZSBJbW0xNiBvciBJbW0zMi4gICovCi0gICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gKEltbTggfCBJbW0xNiB8IEltbTMyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9zY2FsZSBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9zY2FsZSAoc2NhbGUpCi0gICAgIGNoYXIgKnNjYWxlOwotewotICBpZiAoIWlzZGlnaXQgKCpzY2FsZSkpCi0gICAgZ290byBiYWRfc2NhbGU7Ci0KLSAgc3dpdGNoICgqc2NhbGUpCi0gICAgewotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcyJzoKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNCc6Ci0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzgnOgotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDM7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGJhZF9zY2FsZToKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIHNjYWxlIGZhY3RvciBvZiAxLCAyLCA0LCBvciA4OiBnb3QgYCVzJyIpLAotCSAgICAgIHNjYWxlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKGkubG9nMl9zY2FsZV9mYWN0b3IgIT0gMCAmJiAhIGkuaW5kZXhfcmVnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInNjYWxlIGZhY3RvciBvZiAlZCB3aXRob3V0IGFuIGluZGV4IHJlZ2lzdGVyIiksCi0JICAgICAgIDEgPDwgaS5sb2cyX3NjYWxlX2ZhY3Rvcik7Ci0jaWYgU0NBTEUxX1dIRU5fTk9fSU5ERVgKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAwOwotI2VuZGlmCi0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBpMzg2X2Rpc3BsYWNlbWVudCBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X2Rpc3BsYWNlbWVudCAoZGlzcF9zdGFydCwgZGlzcF9lbmQpCi0gICAgIGNoYXIgKmRpc3Bfc3RhcnQ7Ci0gICAgIGNoYXIgKmRpc3BfZW5kOwotewotICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwOwotICBzZWdUIGV4cF9zZWcgPSAwOwotICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IGJpZ2Rpc3AgPSBEaXNwMzI7Ci0KLSAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkpCi0gICAgYmlnZGlzcCA9IERpc3AxNjsKLSAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IGJpZ2Rpc3A7Ci0KLSAgZXhwID0gJmRpc3BfZXhwcmVzc2lvbnNbaS5kaXNwX29wZXJhbmRzXTsKLSAgaS5kaXNwc1t0aGlzX29wZXJhbmRdID0gZXhwOwotICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IE5PX1JFTE9DOwotICBpLmRpc3Bfb3BlcmFuZHMrKzsKLSAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGRpc3Bfc3RhcnQ7Ci0gIEVORF9TVFJJTkdfQU5EX1NBVkUgKGRpc3BfZW5kKTsKLQotI2lmbmRlZiBHQ0NfQVNNX09fSEFDSwotI2RlZmluZSBHQ0NfQVNNX09fSEFDSyAwCi0jZW5kaWYKLSNpZiBHQ0NfQVNNX09fSEFDSwotICBFTkRfU1RSSU5HX0FORF9TQVZFIChkaXNwX2VuZCArIDEpOwotICBpZiAoKGkudHlwZXNbdGhpc19vcGVyYW5kXSAmIEJhc2VJbmRleCkgIT0gMAotICAgICAgJiYgZGlzcGxhY2VtZW50X3N0cmluZ19lbmRbLTFdID09ICcrJykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGhhY2sgaXMgdG8gYXZvaWQgYSB3YXJuaW5nIHdoZW4gdXNpbmcgdGhlICJvIgotCSBjb25zdHJhaW50IHdpdGhpbiBnY2MgYXNtIHN0YXRlbWVudHMuCi0JIEZvciBpbnN0YW5jZToKLQotCSAjZGVmaW5lIF9zZXRfdHNzbGR0X2Rlc2MobixhZGRyLGxpbWl0LHR5cGUpIFwKLQkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCBcCi0JICJtb3Z3ICV3MiwlMFxuXHQiIFwKLQkgIm1vdncgJXcxLDIrJTBcblx0IiBcCi0JICJyb3JsICQxNiwlMVxuXHQiIFwKLQkgIm1vdmIgJWIxLDQrJTBcblx0IiBcCi0JICJtb3ZiICU0LDUrJTBcblx0IiBcCi0JICJtb3ZiICQwLDYrJTBcblx0IiBcCi0JICJtb3ZiICVoMSw3KyUwXG5cdCIgXAotCSAicm9ybCAkMTYsJTEiIFwKLQkgOiAiPW8iKCoobikpIDogInEiIChhZGRyKSwgInJpIihsaW1pdCksICJpIih0eXBlKSkKLQotCSBUaGlzIHdvcmtzIGdyZWF0IGV4Y2VwdCB0aGF0IHRoZSBvdXRwdXQgYXNzZW1ibGVyIGVuZHMKLQkgdXAgbG9va2luZyBhIGJpdCB3ZWlyZCBpZiBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBpcwotCSBubyBvZmZzZXQuICBZb3UgZW5kIHVwIHByb2R1Y2luZyBjb2RlIHRoYXQgbG9va3MgbGlrZToKLQotCSAjQVBQCi0JIG1vdncgJDIzNSwoJWVheCkKLQkgbW92dyAlZHgsMisoJWVheCkKLQkgcm9ybCAkMTYsJWVkeAotCSBtb3ZiICVkbCw0KyglZWF4KQotCSBtb3ZiICQxMzcsNSsoJWVheCkKLQkgbW92YiAkMCw2KyglZWF4KQotCSBtb3ZiICVkaCw3KyglZWF4KQotCSByb3JsICQxNiwlZWR4Ci0JICNOT19BUFAKLQotCSBTbyBoZXJlIHdlIHByb3ZpZGUgdGhlIG1pc3NpbmcgemVyby4KLSAgICAgICovCi0KLSAgICAgICpkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCA9ICcwJzsKLSAgICB9Ci0jZW5kaWYKLSNpZm5kZWYgTEVYX0FUCi0gIHsKLSAgICAvKgotICAgICAqIFdlIGNhbiBoYXZlIG9wZXJhbmRzIG9mIHRoZSBmb3JtCi0gICAgICogICA8c3ltYm9sPkBHT1RPRkYrPG5ubj4KLSAgICAgKiBUYWtlIHRoZSBlYXN5IHdheSBvdXQgaGVyZSBhbmQgY29weSBldmVyeXRoaW5nCi0gICAgICogaW50byBhIHRlbXBvcmFyeSBidWZmZXIuLi4KLSAgICAgKi8KLSAgICByZWdpc3RlciBjaGFyICpjcDsKLQotICAgIGNwID0gc3RyY2hyIChpbnB1dF9saW5lX3BvaW50ZXIsICdAJyk7Ci0gICAgaWYgKGNwICE9IE5VTEwpCi0gICAgICB7Ci0JY2hhciAqdG1wYnVmOwotCWludCBsZW4gPSAwOwotCWludCBmaXJzdDsKLQotCS8qIEdPVCByZWxvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSAqLwotCWlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICBhc19iYWQgKF8oIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIikpOwotCi0JaWYgKEdPVF9zeW1ib2wgPT0gTlVMTCkKLQkgIEdPVF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOwotCi0JaWYgKHN0cm5jbXAgKGNwICsgMSwgIlBMVCIsIDMpID09IDApCi0JICB7Ci0JICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9QTFQzMjsKLQkgICAgbGVuID0gMzsKLQkgIH0KLQllbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1RPRkYiLCA2KSA9PSAwKQotCSAgewotCSAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UT0ZGOwotCSAgICBsZW4gPSA2OwotCSAgfQotCWVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVCIsIDMpID09IDApCi0JICB7Ci0JICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1QzMjsKLQkgICAgbGVuID0gMzsKLQkgIH0KLQllbHNlCi0JICBhc19iYWQgKF8oIkJhZCByZWxvYyBzcGVjaWZpZXIgaW4gZXhwcmVzc2lvbiIpKTsKLQotCS8qIFJlcGxhY2UgdGhlIHJlbG9jYXRpb24gdG9rZW4gd2l0aCAnICcsIHNvIHRoYXQgZXJyb3JzIGxpa2UKLQkgICBmb29AR09UT0ZGMSB3aWxsIGJlIGRldGVjdGVkLiAgKi8KLQlmaXJzdCA9IGNwIC0gaW5wdXRfbGluZV9wb2ludGVyOwotCXRtcGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuKGlucHV0X2xpbmVfcG9pbnRlcikpOwotCW1lbWNweSAodG1wYnVmLCBpbnB1dF9saW5lX3BvaW50ZXIsIGZpcnN0KTsKLQl0bXBidWZbZmlyc3RdID0gJyAnOwotCXN0cmNweSAodG1wYnVmICsgZmlyc3QgKyAxLCBjcCArIDEgKyBsZW4pOwotCWlucHV0X2xpbmVfcG9pbnRlciA9IHRtcGJ1ZjsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgZXhwX3NlZyA9IGV4cHJlc3Npb24gKGV4cCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIFdlIGRvIHRoaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlY3Rpb24gc3ltYm9sIGlzIGluCi0gICAgIHRoZSBzeW1ib2wgdGFibGUuICBXZSB3aWxsIHVsdGltYXRlbHkgY2hhbmdlIHRoZSByZWxvY2F0aW9uCi0gICAgIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gKi8KLSAgaWYgKGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID09IEJGRF9SRUxPQ18zODZfR09UT0ZGKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0xPQ0FMKGV4cC0+WF9hZGRfc3ltYm9sKQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZXhwLT5YX2FkZF9zeW1ib2wpICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotCXNlY3Rpb25fc3ltYm9sIChTX0dFVF9TRUdNRU5UIChleHAtPlhfYWRkX3N5bWJvbCkpOwotICAgICAgYXNzZXJ0IChleHAtPlhfb3AgPT0gT19zeW1ib2wpOwotICAgICAgZXhwLT5YX29wID0gT19zdWJ0cmFjdDsKLSAgICAgIGV4cC0+WF9vcF9zeW1ib2wgPSBHT1Rfc3ltYm9sOwotICAgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzI7Ci0gICAgfQotI2VuZGlmCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICBhc19iYWQgKF8oIklnbm9yaW5nIGp1bmsgYCVzJyBhZnRlciBleHByZXNzaW9uIiksCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0jaWYgR0NDX0FTTV9PX0hBQ0sKLSAgUkVTVE9SRV9FTkRfU1RSSU5HIChkaXNwX2VuZCArIDEpOwotI2VuZGlmCi0gIFJFU1RPUkVfRU5EX1NUUklORyAoZGlzcF9lbmQpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoZXhwLT5YX29wID09IE9fYWJzZW50IHx8IGV4cC0+WF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICAvKiBtaXNzaW5nIG9yIGJhZCBleHByIGJlY29tZXMgYWJzb2x1dGUgMCAqLwotICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIG9yIGludmFsaWQgZGlzcGxhY2VtZW50IGV4cHJlc3Npb24gYCVzJyB0YWtlbiBhcyAwIiksCi0JICAgICAgZGlzcF9zdGFydCk7Ci0gICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZXhwLT5YX2FkZF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotICAgICAgZXhwLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0gICAgfQotCi0gIGlmIChleHAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpZiAoZml0c19pbl9zaWduZWRfYnl0ZSAoZXhwLT5YX2FkZF9udW1iZXIpKQotCWkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBEaXNwODsKLSAgICB9Ci0jaWZkZWYgT0JKX0FPVVQKLSAgZWxzZSBpZiAoZXhwX3NlZyAhPSB0ZXh0X3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IGRhdGFfc2VjdGlvbgotCSAgICYmIGV4cF9zZWcgIT0gYnNzX3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXyAoIlVuaW1wbGVtZW50ZWQgc2VnbWVudCB0eXBlICVkIGluIG9wZXJhbmQiKSwgZXhwX3NlZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0jZW5kaWYKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9vcGVyYW5kX21vZGlmaWVyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotCi1zdGF0aWMgaW50Ci1pMzg2X29wZXJhbmRfbW9kaWZpZXIgKG9wX3N0cmluZywgZ290X2FfZmxvYXQpCi0gICAgIGNoYXIgKipvcF9zdHJpbmc7Ci0gICAgIGludCBnb3RfYV9mbG9hdDsKLXsKLSAgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIkJZVEUgUFRSIiwgOCkpCi0gICAgewotICAgICAgaS5zdWZmaXggPSBCWVRFX01ORU1fU1VGRklYOwotICAgICAgKm9wX3N0cmluZyArPSA4OwotICAgICAgcmV0dXJuIEJZVEVfUFRSOwotCi0gICAgfQotICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJXT1JEIFBUUiIsIDgpKQotICAgIHsKLSAgICAgIGkuc3VmZml4ID0gV09SRF9NTkVNX1NVRkZJWDsKLSAgICAgICpvcF9zdHJpbmcgKz0gODsKLSAgICAgIHJldHVybiBXT1JEX1BUUjsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiRFdPUkQgUFRSIiwgOSkpCi0gICAgewotICAgICAgaWYgKGdvdF9hX2Zsb2F0KQotCWkuc3VmZml4ID0gU0hPUlRfTU5FTV9TVUZGSVg7Ci0gICAgICBlbHNlCi0JaS5zdWZmaXggPSBEV09SRF9NTkVNX1NVRkZJWDsKLSAgICAgICpvcF9zdHJpbmcgKz0gOTsKLSAgICAgIHJldHVybiBEV09SRF9QVFI7Ci0gICAgfQotCi0gIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIlFXT1JEIFBUUiIsIDkpKQotICAgIHsKLSAgICAgIGkuc3VmZml4ID0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVg7Ci0gICAgICAqb3Bfc3RyaW5nICs9IDk7Ci0gICAgICByZXR1cm4gUVdPUkRfUFRSOwotICAgIH0KLQotICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJYV09SRCBQVFIiLCA5KSkKLSAgICB7Ci0gICAgICBpLnN1ZmZpeCA9IExPTkdfRE9VQkxFX01ORU1fU1VGRklYOwotICAgICAgKm9wX3N0cmluZyArPSA5OwotICAgICAgcmV0dXJuIFhXT1JEX1BUUjsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiU0hPUlQiLCA1KSkKLSAgICB7Ci0gICAgICAqb3Bfc3RyaW5nICs9IDU7Ci0gICAgICByZXR1cm4gU0hPUlQ7Ci0gICAgfQotCi0gIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIk9GRlNFVCBGTEFUOiIsIDEyKSkKLSAgICB7Ci0gICAgICAqb3Bfc3RyaW5nICs9IDEyOwotICAgICAgcmV0dXJuIE9GRlNFVF9GTEFUOwotICAgIH0KLQotICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJGTEFUIiwgNCkpCi0gICAgewotICAgICAgKm9wX3N0cmluZyArPSA0OwotICAgICAgcmV0dXJuIEZMQVQ7Ci0gICAgfQotCi0gIGVsc2UgcmV0dXJuIE5PTkVfRk9VTkQ7Ci19Ci0KLXN0YXRpYyBjaGFyICogYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyBQQVJBTVMgKChpbnQsIGNoYXIgKikpOwotCi1zdGF0aWMgY2hhciAqCi1idWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nIChpbml0aWFsX2Rpc3AsIG9wX3N0cmluZykKLSAgICAgaW50IGluaXRpYWxfZGlzcDsKLSAgICAgY2hhciAqb3Bfc3RyaW5nOwotewotICBjaGFyICp0ZW1wX3N0cmluZyA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChvcF9zdHJpbmcpICsgMSk7Ci0gIGNoYXIgKmVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLSAgY2hhciAqdGM7Ci0gIGNoYXIgKnRlbXBfZGlzcDsKLQotICB0ZW1wX3N0cmluZ1swXSA9ICdcMCc7Ci0gIHRjID0gZW5kX29mX29wZXJhbmRfc3RyaW5nID0gc3RyY2hyIChvcF9zdHJpbmcsICdbJyk7Ci0gIGlmICggaW5pdGlhbF9kaXNwICYmICFlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpCi0gICAgewotICAgICAgc3RyY3B5ICh0ZW1wX3N0cmluZywgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAodGVtcF9zdHJpbmcpOwotICAgIH0KLQotICAvKiBCdWlsZCB0aGUgd2hvbGUgZGlzcGxhY2VtZW50IHN0cmluZyAqLwotICBpZiAoaW5pdGlhbF9kaXNwKQotICAgIHsKLSAgICAgIHN0cm5jcHkgKHRlbXBfc3RyaW5nLCBvcF9zdHJpbmcsIGVuZF9vZl9vcGVyYW5kX3N0cmluZyAtIG9wX3N0cmluZyk7Ci0gICAgICB0ZW1wX3N0cmluZ1tlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgLSBvcF9zdHJpbmddID0gJ1wwJzsKLSAgICAgIHRlbXBfZGlzcCA9IHRjOwotICAgIH0KLSAgZWxzZQotICAgIHRlbXBfZGlzcCA9IG9wX3N0cmluZzsKLQotICB3aGlsZSAoKnRlbXBfZGlzcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIGNoYXIgKmVuZF9vcDsKLSAgICAgIGludCBhZGRfbWludXMgPSAoKnRlbXBfZGlzcCA9PSAnLScpOwotCi0gICAgICBpZiAoKnRlbXBfZGlzcCA9PSAnKycgfHwgKnRlbXBfZGlzcCA9PSAnLScgfHwgKnRlbXBfZGlzcCA9PSAnWycpCi0JdGVtcF9kaXNwKys7Ci0KLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqdGVtcF9kaXNwKSkKLQl0ZW1wX2Rpc3ArKzsKLQotICAgICAgLyogRG9uJ3QgY29uc2lkZXIgcmVnaXN0ZXJzICovCi0gICAgICBpZiAoICEoKCp0ZW1wX2Rpc3AgPT0gUkVHSVNURVJfUFJFRklYIHx8IGFsbG93X25ha2VkX3JlZykKLQkgICAgICYmIHBhcnNlX3JlZ2lzdGVyICh0ZW1wX2Rpc3AsICZlbmRfb3ApKSApCi0JewotCSAgY2hhciAqc3RyaW5nX3N0YXJ0ID0gdGVtcF9kaXNwOwotCi0JICB3aGlsZSAoKnRlbXBfZGlzcCAhPSAnXScKLQkJICYmICp0ZW1wX2Rpc3AgIT0gJysnCi0JCSAmJiAqdGVtcF9kaXNwICE9ICctJwotCQkgJiYgKnRlbXBfZGlzcCAhPSAnKicpCi0JICAgICsrdGVtcF9kaXNwOwotCi0JICBpZiAoYWRkX21pbnVzKQotCSAgICBzdHJjYXQgKHRlbXBfc3RyaW5nLCAiLSIpOwotCSAgZWxzZQotCSAgICBzdHJjYXQgKHRlbXBfc3RyaW5nLCAiKyIpOwotCi0JICBzdHJuY2F0ICh0ZW1wX3N0cmluZywgc3RyaW5nX3N0YXJ0LCB0ZW1wX2Rpc3AgLSBzdHJpbmdfc3RhcnQpOwotCSAgaWYgKCp0ZW1wX2Rpc3AgPT0gJysnIHx8ICp0ZW1wX2Rpc3AgPT0gJy0nKQotCSAgICAtLXRlbXBfZGlzcDsKLQl9Ci0KLSAgICAgIHdoaWxlICgqdGVtcF9kaXNwICE9ICdcMCcKLQkgICAgICYmICp0ZW1wX2Rpc3AgIT0gJysnCi0JICAgICAmJiAqdGVtcF9kaXNwICE9ICctJykKLQkrK3RlbXBfZGlzcDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRlbXBfc3RyaW5nOwotfQotCi1zdGF0aWMgaW50IGkzODZfcGFyc2Vfc2VnIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X3BhcnNlX3NlZyAob3Bfc3RyaW5nKQotICAgICBjaGFyICpvcF9zdHJpbmc7Ci17Ci0gIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICArK29wX3N0cmluZzsKLQotICAvKiBTaG91bGQgYmUgb25lIG9mIGVzLCBjcywgc3MsIGRzIGZzIG9yIGdzICovCi0gIHN3aXRjaCAoKm9wX3N0cmluZysrKQotICAgIHsKLSAgICBjYXNlICdlJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZlczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmNzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmc3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZkczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2YnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmZzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZyc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZ3M7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJiYWQgc2VnbWVudCBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoKm9wX3N0cmluZysrICE9ICdzJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCBzZWdtZW50IG5hbWUgYCVzJyIpLCBvcF9zdHJpbmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICArK29wX3N0cmluZzsKLQotICBpZiAoKm9wX3N0cmluZyAhPSAnOicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgc2VnbWVudCBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLQotfQotCi1zdGF0aWMgaW50IGkzODZfaW5kZXhfY2hlY2sgUEFSQU1TKChjb25zdCBjaGFyICopKTsKLQotLyogTWFrZSBzdXJlIHRoZSBtZW1vcnkgb3BlcmFuZCB3ZSd2ZSBiZWVuIGRlYWx0IGlzIHZhbGlkLgotICAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gYSBmYWlsdXJlLgotKi8KLXN0YXRpYyBpbnQKLWkzODZfaW5kZXhfY2hlY2sgKG9wZXJhbmRfc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpvcGVyYW5kX3N0cmluZzsKLXsKLSNpZiBJTkZFUl9BRERSX1BSRUZJWAotICBpbnQgZnVkZ2VkID0gMDsKLQotIHRyeXByZWZpeDoKLSNlbmRpZgotICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSA/Ci0gICAgICAvKiAxNiBiaXQgbW9kZSBjaGVja3MgKi8KLSAgICAgICgoaS5iYXNlX3JlZwotCSYmICgoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKLQkgICAgIT0gKFJlZzE2fEJhc2VJbmRleCkpKQotICAgICAgIHx8IChpLmluZGV4X3JlZwotCSAgICYmICgoKGkuaW5kZXhfcmVnLT5yZWdfdHlwZSAmIChSZWcxNnxCYXNlSW5kZXgpKQotCQkhPSAoUmVnMTZ8QmFzZUluZGV4KSkKLQkgICAgICAgfHwgISAoaS5iYXNlX3JlZwotCQkgICAgICYmIGkuYmFzZV9yZWctPnJlZ19udW0gPCA2Ci0JCSAgICAgJiYgaS5pbmRleF9yZWctPnJlZ19udW0gPj0gNgotCQkgICAgICYmIGkubG9nMl9zY2FsZV9mYWN0b3IgPT0gMCkpKSkgOgotICAgICAgLyogMzIgYml0IG1vZGUgY2hlY2tzICovCi0gICAgICAoKGkuYmFzZV9yZWcKLQkmJiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWczMikgPT0gMCkKLSAgICAgICB8fCAoaS5pbmRleF9yZWcKLQkgICAmJiAoKGkuaW5kZXhfcmVnLT5yZWdfdHlwZSAmIChSZWczMnxCYXNlSW5kZXgpKQotCSAgICAgICAhPSAoUmVnMzJ8QmFzZUluZGV4KSkpKSkKLSAgICB7Ci0jaWYgSU5GRVJfQUREUl9QUkVGSVgKLSAgICAgIGlmIChpLnByZWZpeFtBRERSX1BSRUZJWF0gPT0gMCAmJiBzdGFja29wX3NpemUgIT0gJ1wwJykKLQl7Ci0JICBpLnByZWZpeFtBRERSX1BSRUZJWF0gPSBBRERSX1BSRUZJWF9PUENPREU7Ci0JICBpLnByZWZpeGVzICs9IDE7Ci0JICAvKiBDaGFuZ2UgdGhlIHNpemUgb2YgYW55IGRpc3BsYWNlbWVudCB0b28uICBBdCBtb3N0IG9uZSBvZgotCSAgICAgRGlzcDE2IG9yIERpc3AzMiBpcyBzZXQuCi0JICAgICBGSVhNRS4gIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgcmVhbCBuZWVkIGZvciBzZXBhcmF0ZQotCSAgICAgRGlzcDE2IGFuZCBEaXNwMzIgZmxhZ3MuICBUaGUgc2FtZSBnb2VzIGZvciBJbW0xNiBhbmQgSW1tMzIuCi0JICAgICBSZW1vdmluZyB0aGVtIHdvdWxkIHByb2JhYmx5IGNsZWFuIHVwIHRoZSBjb2RlIHF1aXRlIGEgbG90LgotCSAgKi8KLQkgIGlmIChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiAoRGlzcDE2fERpc3AzMikpCi0JICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gXj0gKERpc3AxNnxEaXNwMzIpOwotCSAgZnVkZ2VkID0gMTsKLQkgIGdvdG8gdHJ5cHJlZml4OwotCX0KLSAgICAgIGlmIChmdWRnZWQpCi0JYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkIGJhc2UvaW5kZXggZXhwcmVzc2lvbiIpLAotCQlvcGVyYW5kX3N0cmluZyk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlhc19iYWQgKF8oImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIpLAotCQlvcGVyYW5kX3N0cmluZywKLQkJZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSA/ICIxNiIgOiAiMzIiKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCAob3BlcmFuZF9zdHJpbmcpCi0gICAgIGNoYXIgKm9wZXJhbmRfc3RyaW5nOwotewotICBjaGFyICpvcF9zdHJpbmcgPSBvcGVyYW5kX3N0cmluZzsKLSAgY2hhciAqZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCi0gIGlmICgoaS5tZW1fb3BlcmFuZHMgPT0gMQotICAgICAgICYmIChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSA9PSAwKQotICAgICAgfHwgaS5tZW1fb3BlcmFuZHMgPT0gMikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInRvbyBtYW55IG1lbW9yeSByZWZlcmVuY2VzIGZvciBgJXMnIiksCi0JICAgICAgY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBMb29rIGZvciBkaXNwbGFjZW1lbnQgcHJlY2VkaW5nIG9wZW4gYnJhY2tldCAqLwotICBpZiAoKm9wX3N0cmluZyAhPSAnWycpCi0gICAgewotICAgICAgY2hhciAqZW5kX3NlZzsKLSAgICAgIGNoYXIgKnRlbXBfc3RyaW5nOwotCi0gICAgICBlbmRfc2VnID0gc3RyY2hyIChvcF9zdHJpbmcsICc6Jyk7Ci0gICAgICBpZiAoZW5kX3NlZykKLQl7Ci0JICBpZiAoIWkzODZfcGFyc2Vfc2VnIChvcF9zdHJpbmcpKQotCSAgICByZXR1cm4gMDsKLQkgIG9wX3N0cmluZyA9IGVuZF9zZWcgKyAxOwotCX0KLQotICAgICAgdGVtcF9zdHJpbmcgPSBidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nICh0cnVlLCBvcF9zdHJpbmcpOwotCi0gICAgICBpZiAoaS5kaXNwX29wZXJhbmRzID09IDAgJiYKLQkgICFpMzg2X2Rpc3BsYWNlbWVudCAodGVtcF9zdHJpbmcsIHRlbXBfc3RyaW5nICsgc3RybGVuICh0ZW1wX3N0cmluZykpKQotCXJldHVybiAwOwotCi0gICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBzdHJjaHIgKG9wX3N0cmluZywgJ1snKTsKLSAgICAgIGlmICghZW5kX29mX29wZXJhbmRfc3RyaW5nKQotCWVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZyArIHN0cmxlbiAob3Bfc3RyaW5nKTsKLQotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcpKQotCS0tZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCi0gICAgICBvcF9zdHJpbmcgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gICAgfQotCi0gIGlmICgqb3Bfc3RyaW5nID09ICdbJykKLSAgICB7Ci0gICAgICArK29wX3N0cmluZzsKLQotICAgICAgLyogUGljayBvZmYgZWFjaCBjb21wb25lbnQgYW5kIGZpZ3VyZSBvdXQgd2hlcmUgaXQgYmVsb25ncyAqLwotCi0gICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmc7Ci0KLSAgICAgIHdoaWxlICgqb3Bfc3RyaW5nICE9ICddJykKLQl7Ci0JICBjb25zdCByZWdfZW50cnkgKnRlbXBfcmVnOwotCSAgY2hhciAqZW5kX29wOwotCSAgY2hhciAqdGVtcF9zdHJpbmc7Ci0KLQkgIHdoaWxlICgqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcrJwotCQkgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnLScKLQkJICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJyonCi0JCSAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICddJykKLQkgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nKys7Ci0KLQkgIHRlbXBfc3RyaW5nID0gb3Bfc3RyaW5nOwotCSAgaWYgKCp0ZW1wX3N0cmluZyA9PSAnKycpCi0JICAgIHsKLQkgICAgICArK3RlbXBfc3RyaW5nOwotCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqdGVtcF9zdHJpbmcpKQotCQkrK3RlbXBfc3RyaW5nOwotCSAgICB9Ci0KLQkgIGlmICgoKnRlbXBfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCB8fCBhbGxvd19uYWtlZF9yZWcpCi0JICAgICAgJiYgKHRlbXBfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKHRlbXBfc3RyaW5nLCAmZW5kX29wKSkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChpLmJhc2VfcmVnID09IE5VTEwpCi0JCWkuYmFzZV9yZWcgPSB0ZW1wX3JlZzsKLQkgICAgICBlbHNlCi0JCWkuaW5kZXhfcmVnID0gdGVtcF9yZWc7Ci0KLQkgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gQmFzZUluZGV4OwotCSAgICB9Ci0JICBlbHNlIGlmICgqdGVtcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIiksIHRlbXBfc3RyaW5nKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLQkJICAgfHwgKm9wX3N0cmluZyA9PSAnKycgfHwgKm9wX3N0cmluZyA9PSAnLScpCi0JICAgIHsKLQkgICAgICB0ZW1wX3N0cmluZyA9IGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgKGZhbHNlLCBvcF9zdHJpbmcpOwotCi0JICAgICAgaWYgKCp0ZW1wX3N0cmluZyA9PSAnKycpCi0JCSsrdGVtcF9zdHJpbmc7Ci0KLQkgICAgICBpZiAoaS5kaXNwX29wZXJhbmRzID09IDAgJiYKLQkJICAhaTM4Nl9kaXNwbGFjZW1lbnQgKHRlbXBfc3RyaW5nLCB0ZW1wX3N0cmluZyArIHN0cmxlbiAodGVtcF9zdHJpbmcpKSkKLQkJcmV0dXJuIDA7Ci0KLQkgICAgICArK29wX3N0cmluZzsKLQkgICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmc7Ci0JICAgICAgd2hpbGUgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJ10nCi0JCSAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKycKLQkJICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICctJwotCQkgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJyonKQotCQkrK2VuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoKm9wX3N0cmluZyA9PSAnKicpCi0JICAgIHsKLQkgICAgICArK29wX3N0cmluZzsKLQotCSAgICAgIGlmIChpLmJhc2VfcmVnICYmICFpLmluZGV4X3JlZykKLQkJewotCQkgIGkuaW5kZXhfcmVnID0gaS5iYXNlX3JlZzsKLQkJICBpLmJhc2VfcmVnID0gMDsKLQkJfQotCi0JICAgICAgaWYgKCFpMzg2X3NjYWxlIChvcF9zdHJpbmcpKQotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgb3Bfc3RyaW5nID0gZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCSAgKytlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0JfQotICAgIH0KLQotICBpZiAoaTM4Nl9pbmRleF9jaGVjayAob3BlcmFuZF9zdHJpbmcpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaS5tZW1fb3BlcmFuZHMrKzsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWkzODZfaW50ZWxfb3BlcmFuZCAob3BlcmFuZF9zdHJpbmcsIGdvdF9hX2Zsb2F0KQotICAgICBjaGFyICpvcGVyYW5kX3N0cmluZzsKLSAgICAgaW50IGdvdF9hX2Zsb2F0OwotewotICBjb25zdCByZWdfZW50cnkgKiByOwotICBjaGFyICplbmRfb3A7Ci0gIGNoYXIgKm9wX3N0cmluZyA9IG9wZXJhbmRfc3RyaW5nOwotCi0gIGludCBvcGVyYW5kX21vZGlmaWVyID0gaTM4Nl9vcGVyYW5kX21vZGlmaWVyICgmb3Bfc3RyaW5nLCBnb3RfYV9mbG9hdCk7Ci0gIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICArK29wX3N0cmluZzsKLQotICBzd2l0Y2ggKG9wZXJhbmRfbW9kaWZpZXIpCi0gICAgewotICAgIGNhc2UgQllURV9QVFI6Ci0gICAgY2FzZSBXT1JEX1BUUjoKLSAgICBjYXNlIERXT1JEX1BUUjoKLSAgICBjYXNlIFFXT1JEX1BUUjoKLSAgICBjYXNlIFhXT1JEX1BUUjoKLSAgICAgIGlmICghaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCAob3Bfc3RyaW5nKSkKLQlyZXR1cm4gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGTEFUOgotICAgIGNhc2UgT0ZGU0VUX0ZMQVQ6Ci0gICAgICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotCXJldHVybiAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIT1JUOgotICAgIGNhc2UgTk9ORV9GT1VORDoKLSAgICAgIC8qIFNob3VsZCBiZSByZWdpc3RlciBvciBpbW1lZGlhdGUgKi8KLSAgICAgIGlmIChpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKQotCSAgJiYgc3RyY2hyIChvcF9zdHJpbmcsICdbJykgPT0gMCkKLQl7Ci0JICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlIGlmICgoKm9wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVggfHwgYWxsb3dfbmFrZWRfcmVnKQotCSAgICAgICAmJiAociA9IHBhcnNlX3JlZ2lzdGVyIChvcF9zdHJpbmcsICZlbmRfb3ApKSAhPSBOVUxMKQotCXsKLQkgIC8qIENoZWNrIGZvciBhIHNlZ21lbnQgb3ZlcnJpZGUgYnkgc2VhcmNoaW5nIGZvciAnOicgYWZ0ZXIgYQotCSAgICAgc2VnbWVudCByZWdpc3Rlci4gICovCi0JICBvcF9zdHJpbmcgPSBlbmRfb3A7Ci0JICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0JICAgICsrb3Bfc3RyaW5nOwotCSAgaWYgKCpvcF9zdHJpbmcgPT0gJzonICYmIChyLT5yZWdfdHlwZSAmIChTUmVnMiB8IFNSZWczKSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHItPnJlZ19udW0pCi0JCXsKLQkJY2FzZSAwOgotCQkgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZlczsKLQkJICBicmVhazsKLQkJY2FzZSAxOgotCQkgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZjczsKLQkJICBicmVhazsKLQkJY2FzZSAyOgotCQkgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZzczsKLQkJICBicmVhazsKLQkJY2FzZSAzOgotCQkgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZkczsKLQkJICBicmVhazsKLQkJY2FzZSA0OgotCQkgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZmczsKLQkJICBicmVhazsKLQkJY2FzZSA1OgotCQkgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZnczsKLQkJICBicmVhazsKLQkJfQotCi0JICAgIH0KLQkgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSByLT5yZWdfdHlwZSAmIH5CYXNlSW5kZXg7Ci0JICBpLnJlZ3NbdGhpc19vcGVyYW5kXSA9IHI7Ci0JICBpLnJlZ19vcGVyYW5kcysrOwotCX0KLSAgICAgIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYKQotCXsKLQkgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIpLCBvcF9zdHJpbmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZSBpZiAoIWkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQgKG9wX3N0cmluZykpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotICAgIH0gIC8qIGVuZCBzd2l0Y2ggKi8KLQotICByZXR1cm4gMTsKLX0KLQotLyogUGFyc2UgT1BFUkFORF9TVFJJTkcgaW50byB0aGUgaTM4Nl9pbnNuIHN0cnVjdHVyZSBJLiAgUmV0dXJucyBub24temVybwotICAgb24gZXJyb3IuICovCi0KLXN0YXRpYyBpbnQKLWkzODZfb3BlcmFuZCAob3BlcmFuZF9zdHJpbmcpCi0gICAgIGNoYXIgKm9wZXJhbmRfc3RyaW5nOwotewotICBjb25zdCByZWdfZW50cnkgKnI7Ci0gIGNoYXIgKmVuZF9vcDsKLSAgY2hhciAqb3Bfc3RyaW5nID0gb3BlcmFuZF9zdHJpbmc7Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotICAgICsrb3Bfc3RyaW5nOwotCi0gIC8qIFdlIGNoZWNrIGZvciBhbiBhYnNvbHV0ZSBwcmVmaXggKGRpZmZlcmVudGlhdGluZywKLSAgICAgZm9yIGV4YW1wbGUsICdqbXAgcGNfcmVsYXRpdmVfbGFiZWwnIGZyb20gJ2ptcCAqYWJzb2x1dGVfbGFiZWwnLiAqLwotICBpZiAoKm9wX3N0cmluZyA9PSBBQlNPTFVURV9QUkVGSVgpCi0gICAgewotICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0JKytvcF9zdHJpbmc7Ci0gICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSnVtcEFic29sdXRlOwotICAgIH0KLQotICAvKiBDaGVjayBpZiBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIuICovCi0gIGlmICgoKm9wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVggfHwgYWxsb3dfbmFrZWRfcmVnKQotICAgICAgJiYgKHIgPSBwYXJzZV9yZWdpc3RlciAob3Bfc3RyaW5nLCAmZW5kX29wKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBDaGVjayBmb3IgYSBzZWdtZW50IG92ZXJyaWRlIGJ5IHNlYXJjaGluZyBmb3IgJzonIGFmdGVyIGEKLQkgc2VnbWVudCByZWdpc3Rlci4gICovCi0gICAgICBvcF9zdHJpbmcgPSBlbmRfb3A7Ci0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0JKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoKm9wX3N0cmluZyA9PSAnOicgJiYgKHItPnJlZ190eXBlICYgKFNSZWcyIHwgU1JlZzMpKSkKLQl7Ci0JICBzd2l0Y2ggKHItPnJlZ19udW0pCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZlczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOgotCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZjczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyOgotCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZzczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzOgotCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZkczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSA0OgotCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZmczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSA1OgotCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZnczsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBTa2lwIHRoZSAnOicgYW5kIHdoaXRlc3BhY2UuICAqLwotCSAgKytvcF9zdHJpbmc7Ci0JICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0JICAgICsrb3Bfc3RyaW5nOwotCi0JICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpCi0JICAgICAgJiYgIWlzX2lkZW50aWZpZXJfY2hhciAoKm9wX3N0cmluZykKLQkgICAgICAmJiAqb3Bfc3RyaW5nICE9ICcoJwotCSAgICAgICYmICpvcF9zdHJpbmcgIT0gQUJTT0xVVEVfUFJFRklYKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgbWVtb3J5IG9wZXJhbmQgYCVzJyIpLCBvcF9zdHJpbmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAvKiBIYW5kbGUgY2FzZSBvZiAlZXM6KmZvby4gKi8KLQkgIGlmICgqb3Bfc3RyaW5nID09IEFCU09MVVRFX1BSRUZJWCkKLQkgICAgewotCSAgICAgICsrb3Bfc3RyaW5nOwotCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLQkJKytvcF9zdHJpbmc7Ci0JICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEp1bXBBYnNvbHV0ZTsKLQkgICAgfQotCSAgZ290byBkb19tZW1vcnlfcmVmZXJlbmNlOwotCX0KLSAgICAgIGlmICgqb3Bfc3RyaW5nKQotCXsKLQkgIGFzX2JhZCAoXygiSnVuayBgJXMnIGFmdGVyIHJlZ2lzdGVyIiksIG9wX3N0cmluZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gci0+cmVnX3R5cGUgJiB+QmFzZUluZGV4OwotICAgICAgaS5yZWdzW3RoaXNfb3BlcmFuZF0gPSByOwotICAgICAgaS5yZWdfb3BlcmFuZHMrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIpLCBvcF9zdHJpbmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlIGlmICgqb3Bfc3RyaW5nID09IElNTUVESUFURV9QUkVGSVgpCi0gICAgewkJCQkvKiAuLi4gb3IgYW4gaW1tZWRpYXRlICovCi0gICAgICArK29wX3N0cmluZzsKLSAgICAgIGlmIChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiBKdW1wQWJzb2x1dGUpCi0JewotCSAgYXNfYmFkIChfKCJJbW1lZGlhdGUgb3BlcmFuZCBpbGxlZ2FsIHdpdGggYWJzb2x1dGUganVtcCIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCi0JcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlIGlmIChpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKQotCSAgIHx8IGlzX2lkZW50aWZpZXJfY2hhciAoKm9wX3N0cmluZykKLQkgICB8fCAqb3Bfc3RyaW5nID09ICcoJyApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIG1lbW9yeSByZWZlcmVuY2Ugb2Ygc29tZSBzb3J0LiAqLwotICAgICAgY2hhciAqYmFzZV9zdHJpbmc7Ci0KLSAgICAgIC8qIFN0YXJ0IGFuZCBlbmQgb2YgZGlzcGxhY2VtZW50IHN0cmluZyBleHByZXNzaW9uIChpZiBmb3VuZCkuICovCi0gICAgICBjaGFyICpkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0OwotICAgICAgY2hhciAqZGlzcGxhY2VtZW50X3N0cmluZ19lbmQ7Ci0KLSAgICBkb19tZW1vcnlfcmVmZXJlbmNlOgotICAgICAgaWYgKChpLm1lbV9vcGVyYW5kcyA9PSAxCi0JICAgJiYgKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpID09IDApCi0JICB8fCBpLm1lbV9vcGVyYW5kcyA9PSAyKQotCXsKLQkgIGFzX2JhZCAoXygidG9vIG1hbnkgbWVtb3J5IHJlZmVyZW5jZXMgZm9yIGAlcyciKSwKLQkJICBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWUpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBDaGVjayBmb3IgYmFzZSBpbmRleCBmb3JtLiAgV2UgZGV0ZWN0IHRoZSBiYXNlIGluZGV4IGZvcm0gYnkKLQkgbG9va2luZyBmb3IgYW4gJyknIGF0IHRoZSBlbmQgb2YgdGhlIG9wZXJhbmQsIHNlYXJjaGluZwotCSBmb3IgdGhlICcoJyBtYXRjaGluZyBpdCwgYW5kIGZpbmRpbmcgYSBSRUdJU1RFUl9QUkVGSVggb3IgJywnCi0JIGFmdGVyIHRoZSAnKCcuICAqLwotICAgICAgYmFzZV9zdHJpbmcgPSBvcF9zdHJpbmcgKyBzdHJsZW4gKG9wX3N0cmluZyk7Ci0KLSAgICAgIC0tYmFzZV9zdHJpbmc7Ci0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQktLWJhc2Vfc3RyaW5nOwotCi0gICAgICAvKiBJZiB3ZSBvbmx5IGhhdmUgYSBkaXNwbGFjZW1lbnQsIHNldC11cCBmb3IgaXQgdG8gYmUgcGFyc2VkIGxhdGVyLiAqLwotICAgICAgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCA9IG9wX3N0cmluZzsKLSAgICAgIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kID0gYmFzZV9zdHJpbmcgKyAxOwotCi0gICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcpJykKLQl7Ci0JICBjaGFyICp0ZW1wX3N0cmluZzsKLQkgIHVuc2lnbmVkIGludCBwYXJlbnNfYmFsYW5jZWQgPSAxOwotCSAgLyogV2UndmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIG51bWJlciBvZiBsZWZ0ICYgcmlnaHQgKCkncyBhcmUKLQkgICAgIGVxdWFsLCBzbyB0aGlzIGxvb3Agd2lsbCBub3QgYmUgaW5maW5pdGUuICovCi0JICBkbwotCSAgICB7Ci0JICAgICAgYmFzZV9zdHJpbmctLTsKLQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcpJykKLQkJcGFyZW5zX2JhbGFuY2VkKys7Ci0JICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnKCcpCi0JCXBhcmVuc19iYWxhbmNlZC0tOwotCSAgICB9Ci0JICB3aGlsZSAocGFyZW5zX2JhbGFuY2VkKTsKLQotCSAgdGVtcF9zdHJpbmcgPSBiYXNlX3N0cmluZzsKLQotCSAgLyogU2tpcCBwYXN0ICcoJyBhbmQgd2hpdGVzcGFjZS4gICovCi0JICArK2Jhc2Vfc3RyaW5nOwotCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JICAgICsrYmFzZV9zdHJpbmc7Ci0KLQkgIGlmICgqYmFzZV9zdHJpbmcgPT0gJywnCi0JICAgICAgfHwgKCgqYmFzZV9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYIHx8IGFsbG93X25ha2VkX3JlZykKLQkJICAmJiAoaS5iYXNlX3JlZyA9IHBhcnNlX3JlZ2lzdGVyIChiYXNlX3N0cmluZywgJmVuZF9vcCkpICE9IE5VTEwpKQotCSAgICB7Ci0JICAgICAgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgPSB0ZW1wX3N0cmluZzsKLQotCSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBCYXNlSW5kZXg7Ci0KLQkgICAgICBpZiAoaS5iYXNlX3JlZykKLQkJewotCQkgIGJhc2Vfc3RyaW5nID0gZW5kX29wOwotCQkgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkgICAgKytiYXNlX3N0cmluZzsKLQkJfQotCi0JICAgICAgLyogVGhlcmUgbWF5IGJlIGFuIGluZGV4IHJlZyBvciBzY2FsZSBmYWN0b3IgaGVyZS4gICovCi0JICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnLCcpCi0JCXsKLQkJICArK2Jhc2Vfc3RyaW5nOwotCQkgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkgICAgKytiYXNlX3N0cmluZzsKLQotCQkgIGlmICgoKmJhc2Vfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCB8fCBhbGxvd19uYWtlZF9yZWcpCi0JCSAgICAgICYmIChpLmluZGV4X3JlZyA9IHBhcnNlX3JlZ2lzdGVyIChiYXNlX3N0cmluZywgJmVuZF9vcCkpICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGJhc2Vfc3RyaW5nID0gZW5kX29wOwotCQkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkJCSsrYmFzZV9zdHJpbmc7Ci0JCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJywnKQotCQkJewotCQkJICArK2Jhc2Vfc3RyaW5nOwotCQkJICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkJCSAgICArK2Jhc2Vfc3RyaW5nOwotCQkJfQotCQkgICAgICBlbHNlIGlmICgqYmFzZV9zdHJpbmcgIT0gJyknICkKLQkJCXsKLQkJCSAgYXNfYmFkIChfKCJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBpbmRleCByZWdpc3RlciBpbiBgJXMnIiksCi0JCQkJICBvcGVyYW5kX3N0cmluZyk7Ci0JCQkgIHJldHVybiAwOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKCpiYXNlX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIpLCBiYXNlX3N0cmluZyk7Ci0JCSAgICAgIHJldHVybiAwOwotCQkgICAgfQotCi0JCSAgLyogQ2hlY2sgZm9yIHNjYWxlIGZhY3Rvci4gKi8KLQkJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpiYXNlX3N0cmluZykpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghaTM4Nl9zY2FsZSAoYmFzZV9zdHJpbmcpKQotCQkJcmV0dXJuIDA7Ci0KLQkJICAgICAgKytiYXNlX3N0cmluZzsKLQkJICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCQkrK2Jhc2Vfc3RyaW5nOwotCQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nICE9ICcpJykKLQkJCXsKLQkJCSAgYXNfYmFkIChfKCJleHBlY3RpbmcgYCknIGFmdGVyIHNjYWxlIGZhY3RvciBpbiBgJXMnIiksCi0JCQkJICBvcGVyYW5kX3N0cmluZyk7Ci0JCQkgIHJldHVybiAwOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKCFpLmluZGV4X3JlZykKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgaW5kZXggcmVnaXN0ZXIgb3Igc2NhbGUgZmFjdG9yIGFmdGVyIGAsJzsgZ290ICclYyciKSwKLQkJCSAgICAgICpiYXNlX3N0cmluZyk7Ci0JCSAgICAgIHJldHVybiAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKmJhc2Vfc3RyaW5nICE9ICcpJykKLQkJewotCQkgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgYmFzZSByZWdpc3RlciBpbiBgJXMnIiksCi0JCQkgIG9wZXJhbmRfc3RyaW5nKTsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmICgqYmFzZV9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIiksIGJhc2Vfc3RyaW5nKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgdGhlcmUncyBhbiBleHByZXNzaW9uIGJlZ2lubmluZyB0aGUgb3BlcmFuZCwgcGFyc2UgaXQsCi0JIGFzc3VtaW5nIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgYW5kCi0JIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kIGFyZSBtZWFuaW5nZnVsLiAgKi8KLSAgICAgIGlmIChkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0ICE9IGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kKQotCXsKLQkgIGlmICghaTM4Nl9kaXNwbGFjZW1lbnQgKGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQsCi0JCQkJICBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCkpCi0JICAgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciAoJWR4KSB3aGlsZSBkb2luZyBpbnB1dC9vdXRwdXQgb3AuICAqLwotICAgICAgaWYgKGkuYmFzZV9yZWcKLQkgICYmIGkuYmFzZV9yZWctPnJlZ190eXBlID09IChSZWcxNiB8IEluT3V0UG9ydFJlZykKLQkgICYmIGkuaW5kZXhfcmVnID09IDAKLQkgICYmIGkubG9nMl9zY2FsZV9mYWN0b3IgPT0gMAotCSAgJiYgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID09IDAKLQkgICYmIChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiBEaXNwKSA9PSAwKQotCXsKLQkgIGkudHlwZXNbdGhpc19vcGVyYW5kXSA9IEluT3V0UG9ydFJlZzsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgaWYgKGkzODZfaW5kZXhfY2hlY2sgKG9wZXJhbmRfc3RyaW5nKSA9PSAwKQotCXJldHVybiAwOwotICAgICAgaS5tZW1fb3BlcmFuZHMrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIGl0J3Mgbm90IGEgbWVtb3J5IG9wZXJhbmQ7IGFyZ2ghICovCi0gICAgICBhc19iYWQgKF8oImludmFsaWQgY2hhciAlcyBiZWdpbm5pbmcgb3BlcmFuZCAlZCBgJXMnIiksCi0JICAgICAgb3V0cHV0X2ludmFsaWQgKCpvcF9zdHJpbmcpLAotCSAgICAgIHRoaXNfb3BlcmFuZCArIDEsCi0JICAgICAgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7CQkJLyogbm9ybWFsIHJldHVybiAqLwotfQotDAotLyoKLSAqIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkKLSAqCi0gKiBDYWxsZWQganVzdCBiZWZvcmUgcmVsYXgoKS4KLSAqIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgotICogUmV0dXJuIHRoZSBjb3JyZWN0IGZyX3N1YnR5cGUgaW4gdGhlIGZyYWcuCi0gKiBSZXR1cm4gdGhlIGluaXRpYWwgImd1ZXNzIGZvciBmcl92YXIiIHRvIGNhbGxlci4KLSAqIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KLSAqIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCi0gKiBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCi0gKiAwIHZhbHVlLgotICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnQ7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm9wY29kZTsKLSAgcmVnaXN0ZXIgaW50IG9sZF9mcl9maXg7Ci0KLSAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0gIG9wY29kZSA9ICh1bnNpZ25lZCBjaGFyICopIGZyYWdQLT5mcl9vcGNvZGU7Ci0gIC8qIFdlJ3ZlIGFscmVhZHkgZ290IGZyYWdQLT5mcl9zdWJ0eXBlIHJpZ2h0OyAgYWxsIHdlIGhhdmUgdG8gZG8gaXMKLSAgICAgY2hlY2sgZm9yIHVuLXJlbGF4YWJsZSBzeW1ib2xzLiAgKi8KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnQpCi0gICAgewotICAgICAgLyogc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQgKi8KLSAgICAgIGludCBjb2RlMTYgPSBmcmFnUC0+ZnJfc3VidHlwZSAmIENPREUxNjsKLSAgICAgIGludCBzaXplID0gY29kZTE2ID8gMiA6IDQ7Ci0gICAgICBpbnQgcGNyZWxfcmVsb2MgPSBjb2RlMTYgPyBCRkRfUkVMT0NfMTZfUENSRUwgOiBCRkRfUkVMT0NfMzJfUENSRUw7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlWzBdKQotCXsKLQljYXNlIEpVTVBfUENfUkVMQVRJVkU6CS8qIG1ha2Ugam1wICgweGViKSBhIGR3b3JkIGRpc3BsYWNlbWVudCBqdW1wICovCi0JICBvcGNvZGVbMF0gPSAweGU5OwkvKiBkd29yZCBkaXNwIGptcCAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSBzaXplOwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXgsIHNpemUsCi0JCSAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsCi0JCSAgIChHT1Rfc3ltYm9sICYmIC8qIE5vdCBxdWl0ZSByaWdodCAtIHdlIHNob3VsZCBzd2l0Y2ggb24KLQkJCQkgICAgIHByZXNlbmNlIG9mIEBQTFQsIGJ1dCBJIGNhbm5vdCBzZWUgaG93Ci0JCQkJICAgICB0byBnZXQgdG8gdGhhdCBmcm9tIGhlcmUuICBXZSBzaG91bGQgaGF2ZQotCQkJCSAgICAgZG9uZSB0aGlzIGluIG1kX2Fzc2VtYmxlIHRvIHJlYWxseQotCQkJCSAgICAgZ2V0IGl0IHJpZ2h0IGFsbCBvZiB0aGUgdGltZSwgYnV0IEkKLQkJCQkgICAgIHRoaW5rIGl0IGRvZXMgbm90IG1hdHRlciB0aGF0IG11Y2gsIGFzCi0JCQkJICAgICB0aGlzIHdpbGwgYmUgcmlnaHQgbW9zdCBvZiB0aGUgdGltZS4gRVJZKi8KLQkJICAgIFNfR0VUX1NFR01FTlQoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgID8gQkZEX1JFTE9DXzM4Nl9QTFQzMiA6IHBjcmVsX3JlbG9jKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIC8qIFRoaXMgY2hhbmdlcyB0aGUgYnl0ZS1kaXNwbGFjZW1lbnQganVtcCAweDdOCi0JICAgICB0byB0aGUgZHdvcmQtZGlzcGxhY2VtZW50IGp1bXAgMHgwZjhOLiAgKi8KLQkgIG9wY29kZVsxXSA9IG9wY29kZVswXSArIDB4MTA7Ci0JICBvcGNvZGVbMF0gPSBUV09fQllURV9PUENPREVfRVNDQVBFOwkvKiB0d28tYnl0ZSBlc2NhcGUgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIHNpemU7CS8qIHdlJ3ZlIGFkZGVkIGFuIG9wY29kZSBieXRlICovCi0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDEsIHNpemUsCi0JCSAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsCi0JCSAgIChHT1Rfc3ltYm9sICYmICAvKiBOb3QgcXVpdGUgcmlnaHQgLSB3ZSBzaG91bGQgc3dpdGNoIG9uCi0JCQkJICAgICAgcHJlc2VuY2Ugb2YgQFBMVCwgYnV0IEkgY2Fubm90IHNlZSBob3cKLQkJCQkgICAgICB0byBnZXQgdG8gdGhhdCBmcm9tIGhlcmUuICBFUlkgKi8KLQkJICAgIFNfR0VUX1NFR01FTlQoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgID8gQkZEX1JFTE9DXzM4Nl9QTFQzMiA6IHBjcmVsX3JlbG9jKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotICAgIH0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0MCi0vKgotICoJCQltZF9jb252ZXJ0X2ZyYWcoKTsKLSAqCi0gKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KLSAqIEluOglBZGRyZXNzIG9mIGZyYWcuCi0gKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCi0gKgotICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgotICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICovCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VnVCBzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotI2Vsc2UKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlZ1Qgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvcGNvZGU7Ci0gIHVuc2lnbmVkIGNoYXIgKndoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBvcGNvZGVfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbiA9IDA7Ci0gIGludCBkaXNwbGFjZW1lbnRfZnJvbV9vcGNvZGVfc3RhcnQ7Ci0KLSAgb3Bjb2RlID0gKHVuc2lnbmVkIGNoYXIgKikgZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIHdlIHdhbnQgdG8gcmVhY2ggaW4gZmlsZSBzcGFjZS4gKi8KLSAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotI2lmZGVmIEJGRF9BU1NFTUJMRVIgLyogbm90IG5lZWRlZCBvdGhlcndpc2U/ICovCi0gIHRhcmdldF9hZGRyZXNzICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICovCi0gIG9wY29kZV9hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4OwotCi0gIC8qIERpc3BsYWNlbWVudCBmcm9tIG9wY29kZSBzdGFydCB0byBmaWxsIGludG8gaW5zdHJ1Y3Rpb24uICovCi0gIGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydCA9IHRhcmdldF9hZGRyZXNzIC0gb3Bjb2RlX2FkZHJlc3M7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgU01BTEwpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMMTYpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwxNik6Ci0gICAgICAvKiBkb24ndCBoYXZlIHRvIGNoYW5nZSBvcGNvZGUgKi8KLSAgICAgIGV4dGVuc2lvbiA9IDE7CQkvKiAxIG9wY29kZSArIDEgZGlzcGxhY2VtZW50ICovCi0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHKToKLSAgICAgIGV4dGVuc2lvbiA9IDU7CQkvKiAyIG9wY29kZSArIDQgZGlzcGxhY2VtZW50ICovCi0gICAgICBvcGNvZGVbMV0gPSBvcGNvZGVbMF0gKyAweDEwOwotICAgICAgb3Bjb2RlWzBdID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzJdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRyk6Ci0gICAgICBleHRlbnNpb24gPSA0OwkJLyogMSBvcGNvZGUgKyA0IGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzBdID0gMHhlOTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBCSUcxNik6Ci0gICAgICBleHRlbnNpb24gPSAzOwkJLyogMiBvcGNvZGUgKyAyIGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzFdID0gb3Bjb2RlWzBdICsgMHgxMDsKLSAgICAgIG9wY29kZVswXSA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsyXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcxNik6Ci0gICAgICBleHRlbnNpb24gPSAyOwkJLyogMSBvcGNvZGUgKyAyIGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzBdID0gMHhlOTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyogbm93IHB1dCBkaXNwbGFjZW1lbnQgYWZ0ZXIgb3Bjb2RlICovCi0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCwKLQkJICAgICAgKHZhbHVlVCkgKGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydCAtIGV4dGVuc2lvbiksCi0JCSAgICAgIFNJWkVfRlJPTV9SRUxBWF9TVEFURSAoZnJhZ1AtPmZyX3N1YnR5cGUpKTsKLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19Ci0MCi0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAyOwkvKiBzaXplIG9mIGJ5dGUgZGlzcGxhY2VtZW50IGptcCAqLwotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNTsJLyogc2l6ZSBvZiBkd29yZCBkaXNwbGFjZW1lbnQgam1wICovCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzeW1ib2xTICp0b19zeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbG9uZyBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAyKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4ZWIsIDEpOwkvKiBvcGNvZGUgZm9yIGJ5dGUtZGlzcCBqdW1wICovCi0gIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCAxKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIGxvbmcgb2Zmc2V0OwotCi0gIGlmIChmbGFnX2RvX2xvbmdfanVtcCkKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gU19HRVRfVkFMVUUgKHRvX3N5bWJvbCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhlOSwgMSk7Lyogb3Bjb2RlIGZvciBsb25nIGptcCAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgICAgZml4X25ldyAoZnJhZywgKHB0ciArIDEpIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwKLQkgICAgICAgdG9fc3ltYm9sLCAob2Zmc2V0VCkgMCwgMCwgQkZEX1JFTE9DXzMyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4ZTksIDEpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgIH0KLX0KLQwKLS8qIEFwcGx5IGEgZml4dXAgKGZpeFMpIHRvIHNlZ21lbnQgZGF0YSwgb25jZSBpdCBoYXMgYmVlbiBkZXRlcm1pbmVkCi0gICBieSBvdXIgY2FsbGVyIHRoYXQgd2UgaGF2ZSBhbGwgdGhlIGluZm8gd2UgbmVlZCB0byBmaXggaXQgdXAuCi0KLSAgIE9uIHRoZSAzODYsIGltbWVkaWF0ZXMsIGRpc3BsYWNlbWVudHMsIGFuZCBkYXRhIHBvaW50ZXJzIGFyZSBhbGwgaW4KLSAgIHRoZSBzYW1lIChsaXR0bGUtZW5kaWFuKSBmb3JtYXQsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB3aGljaAotICAgd2UgYXJlIGhhbmRsaW5nLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWxwLCBzZWcpCi0gICAgIGZpeFMgKmZpeFA7CQkvKiBUaGUgZml4IHdlJ3JlIHRvIHB1dCBpbi4gICovCi0gICAgIHZhbHVlVCAqdmFscDsJCS8qIFBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAgKi8KLSAgICAgc2VnVCBzZWcgQVRUUklCVVRFX1VOVVNFRDsJLyogU2VnbWVudCBmaXggaXMgZnJvbS4gICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnAgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIHZhbHVlVCB2YWx1ZSA9ICp2YWxwOwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKFRFX01hY2gpCi0gIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIGhhY2suICBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLgotICAgICBUaGlzIGNvdmVycyBmb3IgdGhlIGZhY3QgdGhhdCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdpbGwKLSAgICAgc3VidHJhY3QgdGhlIGN1cnJlbnQgbG9jYXRpb24gKGZvciBwYXJ0aWFsX2lucGxhY2UsIFBDIHJlbGF0aXZlCi0gICAgIHJlbG9jYXRpb25zKTsgc2VlIG1vcmUgYmVsb3cuICAqLwotICBpZiAoKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMCi0gICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184X1BDUkVMKQotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgewotI2lmbmRlZiBPQkpfQU9VVAotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotI2lmZGVmIFRFX1BFCi0JICB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0jZW5kaWYKLQkgICkKLQl2YWx1ZSArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBzZWdUIGZzZWcgPSBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSk7Ci0KLQkgIGlmICgoZnNlZyA9PSBzZWcKLQkgICAgICAgfHwgKHN5bWJvbF9zZWN0aW9uX3AgKGZpeFAtPmZ4X2FkZHN5KQotCQkgICAmJiBmc2VnICE9IGFic29sdXRlX3NlY3Rpb24pKQotCSAgICAgICYmICEgU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgJiYgISBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgJiYgISBTX0lTX0NPTU1PTiAoZml4UC0+ZnhfYWRkc3kpKQotCSAgICB7Ci0JICAgICAgLyogWWVzLCB3ZSBhZGQgdGhlIHZhbHVlcyBpbiB0d2ljZS4gIFRoaXMgaXMgYmVjYXVzZQotCQkgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzdWJ0cmFjdHMgdGhlbSBvdXQgYWdhaW4uICBJIHRoaW5rCi0JCSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIGJyb2tlbiwgYnV0IEkgZG9uJ3QgZGFyZSBjaGFuZ2UKLQkJIGl0LiAgRklYTUUuICAqLwotCSAgICAgIHZhbHVlICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLQkgICAgfQotCX0KLSNlbmRpZgotI2lmIGRlZmluZWQgKE9CSl9DT0ZGKSAmJiBkZWZpbmVkIChURV9QRSkKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFBFIGZvcm1hdCBkb2VzIG5vdCBzdG9yZSBhIHNlY3Rpb24KLQkgYWRkcmVzcyBvZmZzZXQgZm9yIGEgUEMgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnKQotCXZhbHVlICs9IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotICAgICAgZWxzZSBpZiAoU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGFuIGV4dGVybmFsIHJlbG9jYXRpb24gZm9yIHRoaXMgZGVmaW5lZAotICAgICAgICAgICAgIHN5bWJvbC4gIFdlIGFkZCB0aGUgYWRkcmVzcywgYmVjYXVzZQotICAgICAgICAgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2lsbCBzdWJ0cmFjdCBpdC4gIFZBTFVFIGFscmVhZHkKLSAgICAgICAgICAgICBob2xkcyB0aGUgc3ltYm9sIHZhbHVlLCBiZWNhdXNlIGZpeHVwX3NlZ21lbnQgYWRkZWQgaXQKLSAgICAgICAgICAgICBpbi4gIFdlIHN1YnRyYWN0IGl0IG91dCwgYW5kIHRoZW4gd2Ugc3VidHJhY3QgaXQgb3V0Ci0gICAgICAgICAgICAgYWdhaW4gYmVjYXVzZSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdpbGwgYWRkIGl0IGluCi0gICAgICAgICAgICAgYWdhaW4uICAqLwotCSAgdmFsdWUgKz0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0JICB2YWx1ZSAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0jaWZkZWYgVEVfUEUKLSAgZWxzZSBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAgJiYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkpCi0gICAgewotICAgICAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYW4gZXh0ZXJuYWwgcmVsb2NhdGlvbiBmb3IgdGhpcyBkZWZpbmVkCi0gICAgICAgICBzeW1ib2wuICBWQUxVRSBhbHJlYWR5IGhvbGRzIHRoZSBzeW1ib2wgdmFsdWUsIGFuZAotICAgICAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGFkZCBpdCBpbiBhZ2Fpbi4gIFdlIGRvbid0IHdhbnQKLSAgICAgICAgIGVpdGhlciBhZGRpdGlvbi4gICovCi0gICAgICB2YWx1ZSAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBGaXggYSBmZXcgdGhpbmdzIC0gdGhlIGR5bmFtaWMgbGlua2VyIGV4cGVjdHMgY2VydGFpbiB2YWx1ZXMgaGVyZSwKLSAgICAgYW5kIHdlIG11c3Qgbm90IGRpc3NhcHBvaW50IGl0LiAqLwotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKSB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1BMVDMyOgotICAgICAgLyogTWFrZSB0aGUganVtcCBpbnN0cnVjdGlvbiBwb2ludCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb3BlcmFuZC4gIEF0Ci0JIHJ1bnRpbWUgd2UgbWVyZWx5IGFkZCB0aGUgb2Zmc2V0IHRvIHRoZSBhY3R1YWwgUExUIGVudHJ5LiAqLwotICAgICAgdmFsdWUgPSAweGZmZmZmZmZjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVFBDOgotLyoKLSAqICAgVGhpcyBpcyB0b3VnaCB0byBleHBsYWluLiAgV2UgZW5kIHVwIHdpdGggdGhpcyBvbmUgaWYgd2UgaGF2ZQotICogb3BlcmFuZHMgdGhhdCBsb29rIGxpa2UgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDI4NF0iLiAgVGhlIGdvYWwKLSAqIGhlcmUgaXMgdG8gb2J0YWluIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIHRoZSBHT1QsIGFuZCBpdCBpcyBzdHJvbmdseQotICogcHJlZmVyYWJsZSBmcm9tIGEgcGVyZm9ybWFuY2UgcG9pbnQgb2YgdmlldyB0byBhdm9pZCB1c2luZyBhIHJ1bnRpbWUKLSAqIHJlbG9jYXRpb24gZm9yIHRoaXMuICBUaGUgYWN0dWFsIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyBvZnRlbiBsb29rCi0gKiBzb21ldGhpbmcgbGlrZToKLSAqCi0gKgljYWxsCS5MNjYKLSAqIC5MNjY6Ci0gKglwb3BsCSVlYngKLSAqCWFkZGwJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDY2XSwlZWJ4Ci0gKgotICogICBUaGUgY2FsbCBhbmQgcG9wIGVzc2VudGlhbGx5IHJldHVybiB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZgotICogdGhlIGxhYmVsIC5MNjYgYW5kIHN0b3JlIGl0IGluICVlYnguICBUaGUgbGlua2VyIGl0c2VsZiB3aWxsCi0gKiB1bHRpbWF0ZWx5IGNoYW5nZSB0aGUgZmlyc3Qgb3BlcmFuZCBvZiB0aGUgYWRkbCBzbyB0aGF0ICVlYnggcG9pbnRzIHRvCi0gKiB0aGUgR09ULCBidXQgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCB0aGUgLm8gZmlsZSBtdXN0IGhhdmUgdGhpcyBvcGVyYW5kCi0gKiBzZXQgc28gdGhhdCBpdCBnZW5lcmF0ZXMgbm90IHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIC5MNjYsIGJ1dCB0aGUKLSAqIGFic29sdXRlIGFkZHJlc3Mgb2YgaXRzZWxmLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciBpdHNlbGYgc2ltcGx5Ci0gKiB0cmVhdCBhIEdPVFBDIHJlbG9jYXRpb24gYXMgYXNraW5nIGZvciBhIHBjcmVsIG9mZnNldCB0byB0aGUgR09UIHRvIGJlCi0gKiBhZGRlZCBpbiwgYW5kIHRoZSBhZGRlbmQgb2YgdGhlIHJlbG9jYXRpb24gaXMgc3RvcmVkIGluIHRoZSBvcGVyYW5kCi0gKiBmaWVsZCBmb3IgdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KLSAqCi0gKiAgIE91ciBqb2IgaGVyZSBpcyB0byBmaXggdGhlIG9wZXJhbmQgc28gdGhhdCBpdCB3b3VsZCBhZGQgdGhlIGNvcnJlY3QKLSAqIG9mZnNldCBzbyB0aGF0ICVlYnggd291bGQgcG9pbnQgdG8gaXRzZWxmLiAgVGhlIHRoaW5nIHRoYXQgaXMgdHJpY2t5IGlzCi0gKiB0aGF0IC4tLkw2NiB3aWxsIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB3ZSBuZWVkCi0gKiB0byBmdXJ0aGVyIG1vZGlmeSB0aGUgb3BlcmFuZCBzbyB0aGF0IGl0IHdpbGwgcG9pbnQgdG8gaXRzZWxmLgotICogVGhlcmUgYXJlIG90aGVyIGNhc2VzIHdoZXJlIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgotICoKLSAqCS5sb25nCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkw2Nl0KLSAqCi0gKiBhbmQgaGVyZSBubyBjb3JyZWN0aW9uIHdvdWxkIGJlIHJlcXVpcmVkLiAgSW50ZXJuYWxseSBpbiB0aGUgYXNzZW1ibGVyCi0gKiB3ZSB0cmVhdCBvcGVyYW5kcyBvZiB0aGlzIGZvcm0gYXMgbm90IGJlaW5nIHBjcmVsIHNpbmNlIHRoZSAnLicgaXMKLSAqIGV4cGxpY2l0bHkgbWVudGlvbmVkLCBhbmQgSSB3b25kZXIgd2hldGhlciBpdCB3b3VsZCBzaW1wbGlmeSBtYXR0ZXJzCi0gKiB0byBkbyBpdCB0aGlzIHdheS4gIFdobyBrbm93cy4gIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIFBJQyBwYXRjaGVzLAotICogdGhlIHBjcmVsX2FkanVzdCBmaWVsZCB3YXMgdXNlZCB0byBzdG9yZSB0aGUgY29ycmVjdGlvbiwgYnV0IHNpbmNlIHRoZQotICogZXhwcmVzc2lvbiBpcyBub3QgcGNyZWwsIEkgZmVsdCBpdCB3b3VsZCBiZSBjb25mdXNpbmcgdG8gZG8gaXQgdGhpcyB3YXkuCi0gKi8KLSAgICAgIHZhbHVlIC09IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6Ci0gICAgICB2YWx1ZSA9IDA7IC8qIEZ1bGx5IHJlc29sdmVkIGF0IHJ1bnRpbWUuICBObyBhZGRlbmQuICAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikgKi8KLSAgKnZhbHAgPSB2YWx1ZTsKLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoVEVfTWFjaCkgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB2YWx1ZSwgZml4UC0+Znhfc2l6ZSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiAwCi0vKiBUaGlzIGlzIG5ldmVyIHVzZWQuICAqLwotbG9uZwkJCQkvKiBLbm93cyBhYm91dCB0aGUgYnl0ZSBvcmRlciBpbiBhIHdvcmQuICovCi1tZF9jaGFyc190b19udW1iZXIgKGNvbiwgbmJ5dGVzKQotICAgICB1bnNpZ25lZCBjaGFyIGNvbltdOwkvKiBMb3cgb3JkZXIgYnl0ZSAxc3QuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGlucHV0LiAqLwotewotICBsb25nIHJldHZhbDsKLSAgZm9yIChyZXR2YWwgPSAwLCBjb24gKz0gbmJ5dGVzIC0gMTsgbmJ5dGVzLS07IGNvbi0tKQotICAgIHsKLSAgICAgIHJldHZhbCA8PD0gQklUU19QRVJfQ0hBUjsKLSAgICAgIHJldHZhbCB8PSAqY29uOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZiAvKiAwICovCi0MCi0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBsaXRQIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgZW1pdCB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMgZW1pdHRlZAotICAgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mICgpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIC8qIFRoaXMgbG9vcHMgb3V0cHV0cyB0aGUgTElUVExFTlVNcyBpbiBSRVZFUlNFIG9yZGVyOyBpbiBhY2NvcmQgd2l0aAotICAgICB0aGUgYmlnZW5kaWFuIDM4Ni4gICovCi0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWMgLSAxOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUC0tKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotDAotY2hhciBvdXRwdXRfaW52YWxpZF9idWZbOF07Ci0KLXN0YXRpYyBjaGFyICogb3V0cHV0X2ludmFsaWQgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBjaGFyICoKLW91dHB1dF9pbnZhbGlkIChjKQotICAgICBpbnQgYzsKLXsKLSAgaWYgKGlzcHJpbnQgKGMpKQotICAgIHNwcmludGYgKG91dHB1dF9pbnZhbGlkX2J1ZiwgIiclYyciLCBjKTsKLSAgZWxzZQotICAgIHNwcmludGYgKG91dHB1dF9pbnZhbGlkX2J1ZiwgIigweCV4KSIsICh1bnNpZ25lZCkgYyk7Ci0gIHJldHVybiBvdXRwdXRfaW52YWxpZF9idWY7Ci19Ci0KLQotLyogUkVHX1NUUklORyBzdGFydHMgKmJlZm9yZSogUkVHSVNURVJfUFJFRklYLiAgKi8KLQotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSAqCi1wYXJzZV9yZWdpc3RlciAocmVnX3N0cmluZywgZW5kX29wKQotICAgICBjaGFyICpyZWdfc3RyaW5nOwotICAgICBjaGFyICoqZW5kX29wOwotewotICBjaGFyICpzID0gcmVnX3N0cmluZzsKLSAgY2hhciAqcDsKLSAgY2hhciByZWdfbmFtZV9naXZlbltNQVhfUkVHX05BTUVfU0laRSArIDFdOwotICBjb25zdCByZWdfZW50cnkgKnI7Ci0KLSAgLyogU2tpcCBwb3NzaWJsZSBSRUdJU1RFUl9QUkVGSVggYW5kIHBvc3NpYmxlIHdoaXRlc3BhY2UuICAqLwotICBpZiAoKnMgPT0gUkVHSVNURVJfUFJFRklYKQotICAgICsrczsKLQotICBpZiAoaXNfc3BhY2VfY2hhciAoKnMpKQotICAgICsrczsKLQotICBwID0gcmVnX25hbWVfZ2l2ZW47Ci0gIHdoaWxlICgoKnArKyA9IHJlZ2lzdGVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqc10pICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKHAgPj0gcmVnX25hbWVfZ2l2ZW4gKyBNQVhfUkVHX05BTUVfU0laRSkKLQlyZXR1cm4gKGNvbnN0IHJlZ19lbnRyeSAqKSBOVUxMOwotICAgICAgcysrOwotICAgIH0KLQotICAqZW5kX29wID0gczsKLQotICByID0gKGNvbnN0IHJlZ19lbnRyeSAqKSBoYXNoX2ZpbmQgKHJlZ19oYXNoLCByZWdfbmFtZV9naXZlbik7Ci0KLSAgLyogSGFuZGxlIGZsb2F0aW5nIHBvaW50IHJlZ3MsIGFsbG93aW5nIHNwYWNlcyBpbiB0aGUgKGkpIHBhcnQuICAqLwotICBpZiAociA9PSBpMzg2X3JlZ3RhYiAvKiAlc3QgaXMgZmlyc3QgZW50cnkgb2YgdGFibGUgKi8pCi0gICAgewotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpzKSkKLQkrK3M7Ci0gICAgICBpZiAoKnMgPT0gJygnKQotCXsKLQkgICsrczsKLQkgIGlmIChpc19zcGFjZV9jaGFyICgqcykpCi0JICAgICsrczsKLQkgIGlmICgqcyA+PSAnMCcgJiYgKnMgPD0gJzcnKQotCSAgICB7Ci0JICAgICAgciA9ICZpMzg2X2Zsb2F0X3JlZ3RhYlsqcyAtICcwJ107Ci0JICAgICAgKytzOwotCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqcykpCi0JCSsrczsKLQkgICAgICBpZiAoKnMgPT0gJyknKQotCQl7Ci0JCSAgKmVuZF9vcCA9IHMgKyAxOwotCQkgIHJldHVybiByOwotCQl9Ci0JICAgIH0KLQkgIC8qIFdlIGhhdmUgIiVzdCgiIHRoZW4gZ2FyYmFnZSAqLwotCSAgcmV0dXJuIChjb25zdCByZWdfZW50cnkgKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotDAotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAia21WUTpzcSI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIm0iOwotI2VuZGlmCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICBmbGFnX2RvX2xvbmdfanVtcCA9IDE7Ci0gICAgICBicmVhazsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gICAgICAvKiAtazogSWdub3JlIGZvciBGcmVlQlNEIGNvbXBhdGliaWxpdHkuICAqLwotICAgIGNhc2UgJ2snOgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgLyogLXM6IE9uIGkzODYgU29sYXJpcywgdGhpcyB0ZWxscyB0aGUgbmF0aXZlIGFzc2VtYmxlciB0byB1c2UKLSAgICAgICAgIC5zdGFiIGluc3RlYWQgb2YgLnN0YWIuZXhjbC4gIFdlIGFsd2F5cyB1c2UgLnN0YWIgYW55aG93LiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncSc6Ci0gICAgICAvKiAtcTogT24gaTM4NiBTb2xhcmlzLCB0aGlzIHRlbGxzIHRoZSBuYXRpdmUgYXNzZW1ibGVyIGRvZXMKLSAgICAgICAgIGZld2VyIGNoZWNrcy4gICovCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW0JCQkgIGRvIGxvbmcganVtcFxuIikpOwotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtVgkJCSAgcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG5cCi0gIC1rCQkJICBpZ25vcmVkXG5cCi0gIC1ReSwgLVFuCQkgIGlnbm9yZWRcblwKLSAgLXEJCQkgIGlnbm9yZWRcblwKLSAgLXMJCQkgIGlnbm9yZWRcbiIpKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLSNpZmRlZiBPQkpfTUFZQkVfQ09GRgotCi0vKiBQaWNrIHRoZSB0YXJnZXQgZm9ybWF0IHRvIHVzZS4gICovCi0KLWNvbnN0IGNoYXIgICoKLWkzODZfdGFyZ2V0X2Zvcm1hdCAoKQotewotICBzd2l0Y2ggKE9VVFBVVF9GTEFWT1IpCi0gICAgewotICAgIGNhc2UgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gImNvZmYtaTM4NiI7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyOgotICAgICAgcmV0dXJuICJlbGYzMi1pMzg2IjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBPQkpfTUFZQkVfQ09GRiAqLwotI2VuZGlmIC8qIE9CSl9NQVlCRV9FTEYgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0MCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09IEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRVswXQotICAgICAgJiYgbmFtZVsxXSA9PSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUVbMV0KLSAgICAgICYmIG5hbWVbMl0gPT0gR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FWzJdCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoIUdPVF9zeW1ib2wpCi0JewotCSAgaWYgKHN5bWJvbF9maW5kIChuYW1lKSkKLQkgICAgYXNfYmFkIChfKCJHT1QgYWxyZWFkeSBpbiBzeW1ib2wgdGFibGUiKSk7Ci0JICBHT1Rfc3ltYm9sID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJICAgKHZhbHVlVCkgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQl9OwotICAgICAgcmV0dXJuIEdPVF9zeW1ib2w7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBGb3IgYS5vdXQsIGZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4gIElmIHdlIGRvbid0IGRvCi0gICAgIHRoaXMsIEJGRCB3aWxsIGFsaWduIGl0IGZvciB1cywgYnV0IGl0IHdpbGwgbm90IHdyaXRlIG91dCB0aGUKLSAgICAgZmluYWwgYnl0ZXMgb2YgdGhlIHNlY3Rpb24uICBUaGlzIG1heSBiZSBhIGJ1ZyBpbiBCRkQsIGJ1dCBpdCBpcwotICAgICBlYXNpZXIgdG8gZml4IGl0IGhlcmUgc2luY2UgdGhhdCBpcyBob3cgdGhlIG90aGVyIGEub3V0IHRhcmdldHMKLSAgICAgd29yay4gICovCi0gIGludCBhbGlnbjsKLQotICBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIHNpemUgPSAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgodmFsdWVUKSAtMSA8PCBhbGlnbikpOwotI2VuZGlmCi0jZW5kaWYKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogT24gdGhlIGkzODYsIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgIG5leHQgaW5zdHJ1Y3Rpb24uICBUaGF0IGlzLCB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzIGl0cwotICAgc2l6ZSwgc2luY2UgdGhlIG9mZnNldCBpcyBhbHdheXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0jaWZuZGVmIEkzODZDT0ZGCi0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmCi0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotaTM4Nl92YWxpZGF0ZV9maXggKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9zdWJzeSAmJiBmaXhwLT5meF9zdWJzeSA9PSBHT1Rfc3ltYm9sKQotICAgIHsKLSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zODZfR09UT0ZGOwotICAgICAgZml4cC0+Znhfc3Vic3kgPSAwOwotICAgIH0KLX0KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfc2l6ZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwKLQkJICAgICAgZml4cC0+Znhfc2l6ZSk7Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOiBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7ICBicmVhazsKLQkgICAgY2FzZSAyOiBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOyBicmVhazsKLQkgICAgY2FzZSA0OiBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOyBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGZpeHAtPmZ4X3NpemUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIGZpeHAtPmZ4X3NpemUpOwotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTogY29kZSA9IEJGRF9SRUxPQ184OyAgYnJlYWs7Ci0JICAgIGNhc2UgMjogY29kZSA9IEJGRF9SRUxPQ18xNjsgYnJlYWs7Ci0JICAgIGNhc2UgNDogY29kZSA9IEJGRF9SRUxPQ18zMjsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DXzMyCi0gICAgICAmJiBHT1Rfc3ltYm9sCi0gICAgICAmJiBmaXhwLT5meF9hZGRzeSA9PSBHT1Rfc3ltYm9sKQotICAgIGNvZGUgPSBCRkRfUkVMT0NfMzg2X0dPVFBDOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLQotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIC8qIEhBQ0s6IFNpbmNlIGkzODYgRUxGIHVzZXMgUmVsIGluc3RlYWQgb2YgUmVsYSwgZW5jb2RlIHRoZQotICAgICB2dGFibGUgZW50cnkgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X29mZnNldDsKLQotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgaWYgKHJlbC0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIC8qIFNldCBob3d0byB0byBhIGdhcmJhZ2UgdmFsdWUgc28gdGhhdCB3ZSBjYW4ga2VlcCBnb2luZy4gICovCi0gICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ18zMik7Ci0gICAgICBhc3NlcnQgKHJlbC0+aG93dG8gIT0gTlVMTCk7Ci0gICAgfQotCi0gIHJldHVybiByZWw7Ci19Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWYgKGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkpCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIC8qCi0gICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KLSAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotCQkgICAgICAodmFsdWVUKSAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkJCSsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSksCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs2XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNF0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDMpICYgMHgwOCkKLQkgICAgICB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDEpICYgMHgwNikKLQkgICAgICB8ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDApICYgMHgwMSkgJiAweDBmKSk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0jaWYgZGVmaW5lZCAoSTM4NkNPRkYpCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0lNQUdFQkFTRSkKLSAgICByZXR1cm4gUl9JTUFHRUJBU0U7Ci0KLSAgcmV0dXJuIChmaXhQLT5meF9wY3JlbCA/Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9QQ1JCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1BDUldPUkQgOgotCSAgIFJfUENSTE9ORykgOgotCSAgKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUkVMQllURSA6Ci0JICAgZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9SRUxXT1JEIDoKLQkgICBSX0RJUjMyKSk7Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGlmIChmcmFnLT5mcl9uZXh0KQotICAgIHJldHVybiAoZnJhZy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2FkZHJlc3MpOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBJMzg2Q09GRiAqLwotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0MCi0vKiBlbmQgb2YgdGMtaTM4Ni5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWkzODYuaCBiL2dhcy9jb25maWcvdGMtaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDFhY2U5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLS8qIHRjLWkzODYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtaTM4Ni5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVENfSTM4NgotI2RlZmluZSBUQ19JMzg2IDEKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTAKLQotI2lmZGVmIFRFX0xZTlgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtaTM4Ni1seW54IgotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHJlbG9jYXRpb24gdHlwZXMgaW4gdGMtaTM4Ni5jLiAgVGhlIGZpcnN0Ci0gICBwYXJhbWV0ZXIgaXMgdGhlIGN1cnJlbnQgcmVsb2NhdGlvbiB0eXBlLCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgZGVzaXJlZAotICAgdHlwZS4gIFRoZSBpZGVhIGlzIHRoYXQgaWYgdGhlIG9yaWdpbmFsIHR5cGUgaXMgYWxyZWFkeSBzb21lIGtpbmQgb2YgUElDCi0gICByZWxvY2F0aW9uLCB3ZSBsZWF2ZSBpdCBhbG9uZSwgb3RoZXJ3aXNlIHdlIGdpdmUgaXQgdGhlIGRlc2lyZWQgdHlwZSAqLwotCi0jZGVmaW5lIFRDX1JFTE9DKFgsWSkgKCgoWCkgIT0gQkZEX1JFTE9DXzM4Nl9QTFQzMiAmJiBcCi0JICAgKFgpICE9IEJGRF9SRUxPQ18zODZfR09UT0ZGICYmIFwKLQkgICAoWCkgIT0gQkZEX1JFTE9DXzM4Nl9HT1QzMiAmJiBcCi0JICAgKFgpICE9IEJGRF9SRUxPQ18zODZfR09UUEMpID8gWSA6IFgpCi0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoWCkgIHRjX2kzODZfZml4X2FkanVzdGFibGUoWCkKLWV4dGVybiBpbnQgdGNfaTM4Nl9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogVGhpcyBpcyB0aGUgcmVsb2NhdGlvbiB0eXBlIGZvciBkaXJlY3QgcmVmZXJlbmNlcyB0byBHTE9CQUxfT0ZGU0VUX1RBQkxFLgotICogSXQgY29tZXMgdXAgaW4gY29tcGxpY2F0ZWQgZXhwcmVzc2lvbnMgc3VjaCBhcyAKLSAqIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDI4NF0sIHdoaWNoIGNhbm5vdCBiZSBleHByZXNzZWQgbm9ybWFsbHkgd2l0aAotICogdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUaGUgZml4dXAgc3BlY2lmaWVkIGhlcmUgd2hlbiB1c2VkIGF0IHJ1bnRpbWUgCi0gKiBpbXBsaWVzIHRoYXQgd2Ugc2hvdWxkIGFkZCB0aGUgYWRkcmVzcyBvZiB0aGUgR09UIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sCi0gKiBhbmQgYXMgYSByZXN1bHQgd2UgaGF2ZSBzaW1wbGlmaWVkIHRoZSBleHByZXNzaW9uIGludG8gc29tZXRoaW5nIHdlIGNhbiB1c2UuCi0gKi8KLSNkZWZpbmUgVENfUkVMT0NfR0xPQkFMX09GRlNFVF9UQUJMRSBCRkRfUkVMT0NfMzg2X0dPVFBDCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuCi0gICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcGNyZWwgcmVsb2NhdGlvbnMsIHNvIEdPVE9GRiBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gICBjaGVja2VkIGhlcmUuICBJIGFtIG5vdCBzdXJlIGlmIHNvbWUgb2YgdGhlIG90aGVycyBhcmUgZXZlciB1c2VkIHdpdGgKLSAgIHBjcmVsLCBidXQgaXQgaXMgZWFzaWVyIHRvIGJlIHNhZmUgdGhhbiBzb3JyeS4gKi8KLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKQkJCQlcCi0gICgoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfUExUMzIJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfR09UMzIJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfR09UUEMJCQlcCi0gICAmJiAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLSAgICAgICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkpCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX2kzODYKLQotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgVEVfTmV0QlNECi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2LW5ldGJzZCIKLSNlbmRpZgotI2lmZGVmIFRFXzM4NkJTRAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1ic2QiCi0jZW5kaWYKLSNpZmRlZiBURV9MSU5VWAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1saW51eCIKLSNlbmRpZgotI2lmZGVmIFRFX01hY2gKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LW1hY2gzIgotI2VuZGlmCi0jaWZkZWYgVEVfRFlOSVgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LWkzODYtZHluaXgiCi0jZW5kaWYKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4NiIKLSNlbmRpZgotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJlbGYzMi1pMzg2IgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfTUFZQkVfRUxGCi0jaWZkZWYgT0JKX01BWUJFX0NPRkYKLWV4dGVybiBjb25zdCBjaGFyICppMzg2X3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBUQVJHRVRfRk9STUFUIGkzODZfdGFyZ2V0X2Zvcm1hdCAoKQotI2VuZGlmCi0jZW5kaWYKLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIENPRkYgU1RVRkYgKi8KLQotI2RlZmluZSBDT0ZGX01BR0lDIEkzODZNQUdJQwotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyV1IKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3kgfHwgKHgpLT5meF9yX3R5cGU9PTcpCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi1leHRlcm4gc2hvcnQgdGNfY29mZl9maXgycnR5cGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcChmcmFnKQotZXh0ZXJuIGludCB0Y19jb2ZmX3NpemVtYWNoZGVwIFBBUkFNUyAoKGZyYWdTICpmcmFnKSk7Ci0KLSNpZmRlZiBURV9HTzMyCi0vKiBESkdQUCBub3cgZXhwZWN0cyBzb21lIHNlY3Rpb25zIHRvIGJlIDIqKjQgYWxpZ25lZC4gICovCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykJCQkJCQlcCi0gICgoc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLnRleHQiKSA9PSAwCQkJXAotICAgIHx8IHN0cmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5kYXRhIikgPT0gMAkJCVwKLSAgICB8fCBzdHJuY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmdudS5saW5rb25jZS50IiwgMTUpID09IDAJXAotICAgIHx8IHN0cm5jbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIuZ251LmxpbmtvbmNlLmQiLCAxNSkgPT0gMAlcCi0gICAgfHwgc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5nbnUubGlua29uY2UuciIsIDE1KSA9PSAwKQlcCi0gICA/IDQJCQkJCQkJCQlcCi0gICA6IDIpCi0jZWxzZQotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDIKLSNlbmRpZgotCi0jZGVmaW5lIFRDX1JWQV9SRUxPQyA3Ci0vKiBOZWVkIHRoaXMgZm9yIFBJQyByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotCi0KLSNpZmRlZiBURV8zODZCU0QKLS8qIFRoZSBCU0RJIGxpbmtlciBhcHBhcmVudGx5IHJlamVjdHMgb2JqZWN0cyB3aXRoIGEgbWFjaGluZSB0eXBlIG9mCi0gICBNXzM4NiAoMTAwKS4gICovCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMAotI2Vsc2UKLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAxMDAKLSNlbmRpZgotCi0jdW5kZWYgUkVWRVJTRV9TT1JUX1JFTE9DUwotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSB0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKLWV4dGVybiBpbnQgdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBOT19SRUxPQyBCRkRfUkVMT0NfTk9ORQotI2Vsc2UKLSNkZWZpbmUgTk9fUkVMT0MgMAotI2VuZGlmCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKQk7CS8qIG5vdCB1c2VkICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2lmbmRlZiBPQkpfQU9VVAotI2lmbmRlZiBURV9QRQotI2lmbmRlZiBURV9HTzMyCi0vKiBMb2NhbCBsYWJlbHMgc3RhcnRzIHdpdGggLkwgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKG5hbWVbMF0gPT0gJy4nIFwKLQkJICYmIChuYW1lWzFdID09ICdMJyB8fCBuYW1lWzFdID09ICdYJyB8fCBuYW1lWzFdID09ICcuJykpCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgZXh0cmFfc3ltYm9sX2NoYXJzW107Ci0jZGVmaW5lIHRjX3N5bWJvbF9jaGFycyBleHRyYV9zeW1ib2xfY2hhcnMKLQotI2RlZmluZSBNQVhfT1BFUkFORFMgMwkJLyogbWF4IG9wZXJhbmRzIHBlciBpbnNuICovCi0jZGVmaW5lIE1BWF9JTU1FRElBVEVfT1BFUkFORFMgMi8qIG1heCBpbW1lZGlhdGVzIHBlciBpbnNuIChsY2FsbCwgbGptcCkgKi8KLSNkZWZpbmUgTUFYX01FTU9SWV9PUEVSQU5EUyAyCS8qIG1heCBtZW1vcnkgcmVmcyBwZXIgaW5zbiAoc3RyaW5nIG9wcykgKi8KLQotLyogUHJlZml4ZXMgd2lsbCBiZSBlbWl0dGVkIGluIHRoZSBvcmRlciBkZWZpbmVkIGJlbG93LgotICAgV0FJVF9QUkVGSVggbXVzdCBiZSB0aGUgZmlyc3QgcHJlZml4IHNpbmNlIEZXQUlUIGlzIHJlYWxseSBpcyBhbgotICAgaW5zdHJ1Y3Rpb24sIGFuZCBzbyBtdXN0IGNvbWUgYmVmb3JlIGFueSBwcmVmaXhlcy4gKi8KLSNkZWZpbmUgV0FJVF9QUkVGSVgJMAotI2RlZmluZSBMT0NLUkVQX1BSRUZJWAkxCi0jZGVmaW5lIEFERFJfUFJFRklYCTIKLSNkZWZpbmUgREFUQV9QUkVGSVgJMwotI2RlZmluZSBTRUdfUFJFRklYCTQKLSNkZWZpbmUgTUFYX1BSRUZJWEVTCTUJLyogbWF4IHByZWZpeGVzIHBlciBvcGNvZGUgKi8KLQotLyogd2UgZGVmaW5lIHRoZSBzeW50YXggaGVyZSAobW9kdWxvIGJhc2UsaW5kZXgsc2NhbGUgc3ludGF4KSAqLwotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVggJyUnCi0jZGVmaW5lIElNTUVESUFURV9QUkVGSVggJyQnCi0jZGVmaW5lIEFCU09MVVRFX1BSRUZJWCAnKicKLQotI2RlZmluZSBUV09fQllURV9PUENPREVfRVNDQVBFIDB4MGYKLSNkZWZpbmUgTk9QX09QQ09ERSAoY2hhcikgMHg5MAotCi0vKiByZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lIEVCUF9SRUdfTlVNIDUKLSNkZWZpbmUgRVNQX1JFR19OVU0gNAotCi0vKiBtb2RybV9ieXRlLnJlZ21lbSBmb3IgdHdvYnl0ZSBlc2NhcGUgKi8KLSNkZWZpbmUgRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkcgRVNQX1JFR19OVU0KLS8qIGluZGV4X2Jhc2VfYnl0ZS5pbmRleCBmb3Igbm8gaW5kZXggcmVnaXN0ZXIgYWRkcmVzc2luZyAqLwotI2RlZmluZSBOT19JTkRFWF9SRUdJU1RFUiBFU1BfUkVHX05VTQotLyogaW5kZXhfYmFzZV9ieXRlLmJhc2UgZm9yIG5vIGJhc2UgcmVnaXN0ZXIgYWRkcmVzc2luZyAqLwotI2RlZmluZSBOT19CQVNFX1JFR0lTVEVSIEVCUF9SRUdfTlVNCi0jZGVmaW5lIE5PX0JBU0VfUkVHSVNURVJfMTYgNgotCi0vKiB0aGVzZSBhcmUgdGhlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzLiAgKi8KLSNkZWZpbmUgRFdPUkRfTU5FTV9TVUZGSVggJ2wnCi0jZGVmaW5lIFdPUkRfTU5FTV9TVUZGSVggICd3JwotI2RlZmluZSBCWVRFX01ORU1fU1VGRklYICAnYicKLSNkZWZpbmUgU0hPUlRfTU5FTV9TVUZGSVggJ3MnCi0jZGVmaW5lIExPTkdfTU5FTV9TVUZGSVggICdsJwotLyogSW50ZWwgU3ludGF4ICovCi0jZGVmaW5lIExPTkdfRE9VQkxFX01ORU1fU1VGRklYICd4JwotLyogSW50ZWwgU3ludGF4ICovCi0jZGVmaW5lIElOVEVMX0RXT1JEX01ORU1fU1VGRklYICdkJwotCi0vKiBtb2RybS5tb2RlID0gUkVHTUVNX0ZJRUxEX0hBU19SRUcgd2hlbiBhIHJlZ2lzdGVyIGlzIGluIHRoZXJlICovCi0jZGVmaW5lIFJFR01FTV9GSUVMRF9IQVNfUkVHIDB4My8qIGFsd2F5cyA9IDB4MyAqLwotI2RlZmluZSBSRUdNRU1fRklFTERfSEFTX01FTSAoflJFR01FTV9GSUVMRF9IQVNfUkVHKQotCi0jZGVmaW5lIEVORF9PRl9JTlNOICdcMCcKLQotLyogSW50ZWwgU3ludGF4ICovCi0vKiBWYWx1ZXMgMC00IG1hcCBvbnRvIHNjYWxlIGZhY3RvciAqLwotI2RlZmluZSBCWVRFX1BUUiAgICAgMAotI2RlZmluZSBXT1JEX1BUUiAgICAgMQotI2RlZmluZSBEV09SRF9QVFIgICAgMgotI2RlZmluZSBRV09SRF9QVFIgICAgMwotI2RlZmluZSBYV09SRF9QVFIgICAgNAotI2RlZmluZSBTSE9SVCAgICAgICAgNQotI2RlZmluZSBPRkZTRVRfRkxBVCAgNgotI2RlZmluZSBGTEFUICAgICAgICAgNwotI2RlZmluZSBOT05FX0ZPVU5EICAgOAotLyoKLSAgV2hlbiBhbiBvcGVyYW5kIGlzIHJlYWQgaW4gaXQgaXMgY2xhc3NpZmllZCBieSBpdHMgdHlwZS4gIFRoaXMgdHlwZSBpbmNsdWRlcwotICBhbGwgdGhlIHBvc3NpYmxlIHdheXMgYW4gb3BlcmFuZCBjYW4gYmUgdXNlZC4gIFRodXMsICclZWF4JyBpcyBib3RoICdyZWdpc3RlcgotICAjIDAnIGFuZCAnVGhlIEFjY3VtdWxhdG9yJy4gIEluIG91ciBsYW5ndWFnZSB0aGlzIGlzIGV4cHJlc3NlZCBieSBPUidpbmcKLSAgJ1JlZzMyJyAoYW55IDMyIGJpdCByZWdpc3RlcikgYW5kICdBY2MnICh0aGUgYWNjdW11bGF0b3IpLgotICBPcGVyYW5kcyBhcmUgY2xhc3NpZmllZCBzbyB0aGF0IHdlIGNhbiBtYXRjaCBnaXZlbiBvcGVyYW5kIHR5cGVzIHdpdGgKLSAgdGhlIG9wY29kZSB0YWJsZSBpbiBvcGNvZGUvaTM4Ni5oLgotICAqLwotLyogcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUmVnOAkJICAgMHgxCS8qIDggYml0IHJlZyAqLwotI2RlZmluZSBSZWcxNgkJICAgMHgyCS8qIDE2IGJpdCByZWcgKi8KLSNkZWZpbmUgUmVnMzIJCSAgIDB4NAkvKiAzMiBiaXQgcmVnICovCi0vKiBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tOAkJICAgMHg4CS8qIDggYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBJbW04UwkJICAweDEwCS8qIDggYml0IGltbWVkaWF0ZSBzaWduIGV4dGVuZGVkICovCi0jZGVmaW5lIEltbTE2CQkgIDB4MjAJLyogMTYgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBJbW0zMgkJICAweDQwCS8qIDMyIGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tMQkJICAweDgwCS8qIDEgYml0IGltbWVkaWF0ZSAqLwotLyogbWVtb3J5ICovCi0jZGVmaW5lIEJhc2VJbmRleAkgMHgxMDAKLS8qIERpc3A4LDE2LDMyIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24gdGhlCi0gICBpbnN0cnVjdGlvbi4gIEZvciBqdW1wcywgdGhleSBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBQQyByZWxhdGl2ZQotICAgZGlzcGxhY2VtZW50LCBmb3IgYmFzZWluZGV4IHR5cGUgaW5zdHJ1Y3Rpb25zLCB0aGV5IHNwZWNpZnkgdGhlCi0gICBzaXplIG9mIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGJhc2UgcmVnaXN0ZXIsIGFuZCBmb3IgbWVtb3J5Ci0gICBvZmZzZXQgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgYG1vdiAxMjM0LCVhbCcgdGhleSBzcGVjaWZ5IHRoZSBzaXplIG9mCi0gICB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzZWdtZW50IGJhc2UuICAqLwotI2RlZmluZSBEaXNwOAkJIDB4MjAwCS8qIDggYml0IGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBEaXNwMTYJCSAweDQwMAkvKiAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIERpc3AzMgkJIDB4ODAwCS8qIDMyIGJpdCBkaXNwbGFjZW1lbnQgKi8KLS8qIHNwZWNpYWxzICovCi0jZGVmaW5lIEluT3V0UG9ydFJlZwkweDEwMDAJLyogcmVnaXN0ZXIgdG8gaG9sZCBpbi9vdXQgcG9ydCBhZGRyID0gZHggKi8KLSNkZWZpbmUgU2hpZnRDb3VudAkweDIwMDAJLyogcmVnaXN0ZXIgdG8gaG9sZCBzaGlmdCBjb3VuZCA9IGNsICovCi0jZGVmaW5lIENvbnRyb2wJICAgICAgICAweDQwMDAJLyogQ29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBEZWJ1ZwkgICAgICAgIDB4ODAwMAkvKiBEZWJ1ZyByZWdpc3RlciAqLwotI2RlZmluZSBUZXN0CSAgICAgICAweDEwMDAwCS8qIFRlc3QgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRmxvYXRSZWcgICAgICAgMHgyMDAwMAkvKiBGbG9hdCByZWdpc3RlciAqLwotI2RlZmluZSBGbG9hdEFjYyAgICAgICAweDQwMDAwCS8qIEZsb2F0IHN0YWNrIHRvcCAlc3QoMCkgKi8KLSNkZWZpbmUgU1JlZzIJICAgICAgIDB4ODAwMDAJLyogMiBiaXQgc2VnbWVudCByZWdpc3RlciAqLwotI2RlZmluZSBTUmVnMwkgICAgICAweDEwMDAwMAkvKiAzIGJpdCBzZWdtZW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIEFjYwkgICAgICAweDIwMDAwMAkvKiBBY2N1bXVsYXRvciAlYWwgb3IgJWF4IG9yICVlYXggKi8KLSNkZWZpbmUgSnVtcEFic29sdXRlICAweDQwMDAwMAotI2RlZmluZSBSZWdNTVgJICAgICAgMHg4MDAwMDAJLyogTU1YIHJlZ2lzdGVyICovCi0jZGVmaW5lIFJlZ1hNTQkgICAgIDB4MTAwMDAwMAkvKiBYTU0gcmVnaXN0ZXJzIGluIFBJSUkgKi8KLSNkZWZpbmUgRXNTZWcJICAgICAweDIwMDAwMDAJLyogU3RyaW5nIGluc24gb3BlcmFuZCB3aXRoIGZpeGVkIGVzIHNlZ21lbnQgKi8KLS8qIEludk1lbSBpcyBmb3IgaW5zdHJ1Y3Rpb25zIHdpdGggYSBtb2RybSBieXRlIHRoYXQgb25seSBhbGxvdyBhCi0gICBnZW5lcmFsIHJlZ2lzdGVyIGVuY29kaW5nIGluIHRoZSBpLnRtLm1vZGUgYW5kIGkudG0ucmVnbWVtIGZpZWxkcywKLSAgIGVnLiBjb250cm9sIHJlZyBtb3Zlcy4gIFRoZXkgcmVhbGx5IG91Z2h0IHRvIHN1cHBvcnQgYSBtZW1vcnkgZm9ybSwKLSAgIGJ1dCBkb24ndCwgc28gd2UgYWRkIGFuIEludk1lbSBmbGFnIHRvIHRoZSByZWdpc3RlciBvcGVyYW5kIHRvCi0gICBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBiZSBlbmNvZGVkIGluIHRoZSBpLnRtLnJlZ21lbSBmaWVsZC4gICovCi0jZGVmaW5lIEludk1lbQkgICAgIDB4NDAwMDAwMAotCi0jZGVmaW5lIFJlZwkoUmVnOHxSZWcxNnxSZWczMikJLyogZ2VuJ2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgV29yZFJlZyAoUmVnMTZ8UmVnMzIpCi0jZGVmaW5lIEltcGxpY2l0UmVnaXN0ZXIgKEluT3V0UG9ydFJlZ3xTaGlmdENvdW50fEFjY3xGbG9hdEFjYykKLSNkZWZpbmUgSW1tCShJbW04fEltbThTfEltbTE2fEltbTMyKSAvKiBnZW4nbCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgRGlzcAkoRGlzcDh8RGlzcDE2fERpc3AzMikJLyogR2VuZXJhbCBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgQW55TWVtCShEaXNwfEJhc2VJbmRleHxJbnZNZW0pCS8qIEdlbmVyYWwgbWVtb3J5ICovCi0vKiBUaGUgZm9sbG93aW5nIGFsaWFzZXMgYXJlIGRlZmluZWQgYmVjYXVzZSB0aGUgb3Bjb2RlIHRhYmxlCi0gICBjYXJlZnVsbHkgc3BlY2lmaWVzIHRoZSBhbGxvd2VkIG1lbW9yeSB0eXBlcyBmb3IgZWFjaCBpbnN0cnVjdGlvbi4KLSAgIEF0IHRoZSBtb21lbnQgd2UgY2FuIG9ubHkgdGVsbCBhIG1lbW9yeSByZWZlcmVuY2Ugc2l6ZSBieSB0aGUKLSAgIGluc3RydWN0aW9uIHN1ZmZpeCwgc28gdGhlcmUncyBub3QgbXVjaCBwb2ludCBpbiBkZWZpbmluZyBNZW04LAotICAgTWVtMTYsIE1lbTMyIGFuZCBNZW02NCBvcGNvZGUgbW9kaWZpZXJzIC0gV2UgbWlnaHQgYXMgd2VsbCBqdXN0IHVzZQotICAgdGhlIHN1ZmZpeCBkaXJlY3RseSB0byBjaGVjayBtZW1vcnkgb3BlcmFuZHMuICAqLwotI2RlZmluZSBMTG9uZ01lbSBBbnlNZW0JCS8qIDY0IGJpdHMgKG9yIG1vcmUpICovCi0jZGVmaW5lIExvbmdNZW0gQW55TWVtCQkvKiAzMiBiaXQgbWVtb3J5IHJlZiAqLwotI2RlZmluZSBTaG9ydE1lbSBBbnlNZW0JCS8qIDE2IGJpdCBtZW1vcnkgcmVmICovCi0jZGVmaW5lIFdvcmRNZW0gQW55TWVtCQkvKiAxNiBvciAzMiBiaXQgbWVtb3J5IHJlZiAqLwotI2RlZmluZSBCeXRlTWVtIEFueU1lbQkJLyogOCBiaXQgbWVtb3J5IHJlZiAqLwotCi0jZGVmaW5lIFNNQUxMRVNUX0RJU1BfVFlQRShudW0pIFwKLSAgICAoZml0c19pbl9zaWduZWRfYnl0ZShudW0pID8gKERpc3A4fERpc3AzMikgOiBEaXNwMzIpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIGluc3RydWN0aW9uIG5hbWUgc2FucyB3aWR0aCBzdWZmaXggKCJtb3YiIGZvciBtb3ZsIGluc25zKSAqLwotICBjaGFyICpuYW1lOwotCi0gIC8qIGhvdyBtYW55IG9wZXJhbmRzICovCi0gIHVuc2lnbmVkIGludCBvcGVyYW5kczsKLQotICAvKiBiYXNlX29wY29kZSBpcyB0aGUgZnVuZGFtZW50YWwgb3Bjb2RlIGJ5dGUgd2l0aG91dCBvcHRpb25hbAotICAgICBwcmVmaXgoZXMpLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2Vfb3Bjb2RlOwotCi0gIC8qIGV4dGVuc2lvbl9vcGNvZGUgaXMgdGhlIDMgYml0IGV4dGVuc2lvbiBmb3IgZ3JvdXAgPG4+IGluc25zLgotICAgICBUaGlzIGZpZWxkIGlzIGFsc28gdXNlZCB0byBzdG9yZSB0aGUgOC1iaXQgb3Bjb2RlIHN1ZmZpeCBmb3IgdGhlCi0gICAgIEFNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zLgotICAgICBJZiB0aGlzIHRlbXBsYXRlIGhhcyBubyBleHRlbnNpb24gb3Bjb2RlICh0aGUgdXN1YWwgY2FzZSkgdXNlIE5vbmUgKi8KLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbl9vcGNvZGU7Ci0jZGVmaW5lIE5vbmUgMHhmZmZmCQkvKiBJZiBubyBleHRlbnNpb25fb3Bjb2RlIGlzIHBvc3NpYmxlLiAqLwotCi0gIC8qIHRoZSBiaXRzIGluIG9wY29kZV9tb2RpZmllciBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgb3Bjb2RlIGZyb20KLSAgICAgdGhlIGJhc2Vfb3Bjb2RlLiAgVGhlc2UgYml0cyBhbHNvIGFyZSB1c2VkIHRvIGRldGVjdCBhbHRlcm5hdGUgZm9ybXMgb2YKLSAgICAgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKi8KLSAgdW5zaWduZWQgaW50IG9wY29kZV9tb2RpZmllcjsKLQotICAvKiBvcGNvZGVfbW9kaWZpZXIgYml0czogKi8KLSNkZWZpbmUgVwkJICAgMHgxCS8qIHNldCBpZiBvcGVyYW5kcyBjYW4gYmUgd29yZHMgb3IgZHdvcmRzCi0JCQkJICAgZW5jb2RlZCB0aGUgY2Fub25pY2FsIHdheSAqLwotI2RlZmluZSBECQkgICAweDIJLyogRCA9IDAgaWYgUmVnIC0tPiBSZWdtZW07Ci0JCQkJICAgRCA9IDEgaWYgUmVnbWVtIC0tPiBSZWc6ICAgIE1VU1QgQkUgMHgyICovCi0jZGVmaW5lIE1vZHJtCQkgICAweDQKLSNkZWZpbmUgRmxvYXRSCQkgICAweDgJLyogc3JjL2Rlc3Qgc3dhcCBmb3IgZmxvYXRzOiAgIE1VU1QgQkUgMHg4ICovCi0jZGVmaW5lIFNob3J0Rm9ybQkgIDB4MTAJLyogcmVnaXN0ZXIgaXMgaW4gbG93IDMgYml0cyBvZiBvcGNvZGUgKi8KLSNkZWZpbmUgRmxvYXRNRgkJICAweDIwCS8qIEZQIGluc24gbWVtb3J5IGZvcm1hdCBiaXQsIHNpemVkIGJ5IDB4NCAqLwotI2RlZmluZSBKdW1wCQkgIDB4NDAJLyogc3BlY2lhbCBjYXNlIGZvciBqdW1wIGluc25zLiAqLwotI2RlZmluZSBKdW1wRHdvcmQJICAweDgwICAvKiBjYWxsIGFuZCBqdW1wICovCi0jZGVmaW5lIEp1bXBCeXRlCSAweDEwMCAgLyogbG9vcCBhbmQgamVjeHogKi8KLSNkZWZpbmUgSnVtcEludGVyU2VnbWVudCAweDIwMAkvKiBzcGVjaWFsIGNhc2UgZm9yIGludGVyc2VnbWVudCBsZWFwcy9jYWxscyAqLwotI2RlZmluZSBGbG9hdEQJCSAweDQwMAkvKiBkaXJlY3Rpb24gZm9yIGZsb2F0IGluc25zOiAgTVVTVCBCRSAweDQwMCAqLwotI2RlZmluZSBTZWcyU2hvcnRGb3JtCSAweDgwMAkvKiBlbmNvZGluZyBvZiBsb2FkIHNlZ21lbnQgcmVnIGluc25zICovCi0jZGVmaW5lIFNlZzNTaG9ydEZvcm0JMHgxMDAwCS8qIGZzL2dzIHNlZ21lbnQgcmVnaXN0ZXIgaW5zbnMuICovCi0jZGVmaW5lIFNpemUxNgkJMHgyMDAwCS8qIG5lZWRzIHNpemUgcHJlZml4IGlmIGluIDMyLWJpdCBtb2RlICovCi0jZGVmaW5lIFNpemUzMgkJMHg0MDAwCS8qIG5lZWRzIHNpemUgcHJlZml4IGlmIGluIDE2LWJpdCBtb2RlICovCi0jZGVmaW5lIElnbm9yZVNpemUJMHg4MDAwICAvKiBpbnN0cnVjdGlvbiBpZ25vcmVzIG9wZXJhbmQgc2l6ZSBwcmVmaXggKi8KLSNkZWZpbmUgRGVmYXVsdFNpemUgICAgMHgxMDAwMCAgLyogZGVmYXVsdCBpbnNuIHNpemUgZGVwZW5kcyBvbiBtb2RlICovCi0jZGVmaW5lIE5vX2JTdWYJICAgICAgIDB4MjAwMDAJLyogYiBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb193U3VmCSAgICAgICAweDQwMDAwCS8qIHcgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9fbFN1ZgkgICAgICAgMHg4MDAwMAkvKiBsIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX3NTdWYJICAgICAgMHgxMDAwMDAJLyogcyBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb19kU3VmICAgICAgIDB4MjAwMDAwICAvKiBkIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX3hTdWYgICAgICAgMHg0MDAwMDAgIC8qIHggc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgRldhaXQJICAgICAgMHg4MDAwMDAJLyogaW5zdHJ1Y3Rpb24gbmVlZHMgRldBSVQgKi8KLSNkZWZpbmUgSXNTdHJpbmcgICAgIDB4MTAwMDAwMAkvKiBxdWljayB0ZXN0IGZvciBzdHJpbmcgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIHJlZ0tsdWRnZSAgICAweDIwMDAwMDAJLyogZmFrZSBhbiBleHRyYSByZWcgb3BlcmFuZCBmb3IgY2xyLCBpbXVsICovCi0jZGVmaW5lIElzUHJlZml4ICAgICAweDQwMDAwMDAJLyogb3Bjb2RlIGlzIGEgcHJlZml4ICovCi0jZGVmaW5lIEltbUV4dAkgICAgIDB4ODAwMDAwMAkvKiBpbnN0cnVjdGlvbiBoYXMgZXh0ZW5zaW9uIGluIDggYml0IGltbSAqLwotI2RlZmluZSBVZ2gJICAgIDB4ODAwMDAwMDAJLyogZGVwcmVjYXRlZCBmcCBpbnNuLCBnZXRzIGEgd2FybmluZyAqLwotCi0gIC8qIG9wZXJhbmRfdHlwZXNbaV0gZGVzY3JpYmVzIHRoZSB0eXBlIG9mIG9wZXJhbmQgaS4gIFRoaXMgaXMgbWFkZQotICAgICBieSBPUidpbmcgdG9nZXRoZXIgYWxsIG9mIHRoZSBwb3NzaWJsZSB0eXBlIG1hc2tzLiAgKGUuZy4KLSAgICAgJ29wZXJhbmRfdHlwZXNbaV0gPSBSZWd8SW1tJyBzcGVjaWZpZXMgdGhhdCBvcGVyYW5kIGkgY2FuIGJlCi0gICAgIGVpdGhlciBhIHJlZ2lzdGVyIG9yIGFuIGltbWVkaWF0ZSBvcGVyYW5kICovCi0gIHVuc2lnbmVkIGludCBvcGVyYW5kX3R5cGVzWzNdOwotfQotdGVtcGxhdGU7Ci0KLS8qCi0gICd0ZW1wbGF0ZXMnIGlzIGZvciBncm91cGluZyB0b2dldGhlciAndGVtcGxhdGUnIHN0cnVjdHVyZXMgZm9yIG9wY29kZXMKLSAgb2YgdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBzdG9yaW5nIHRoZSBpbnNucyBpbiB0aGUgZ3JhbmQKLSAgb2xlIGhhc2ggdGFibGUgb2YgaW5zbnMuCi0gIFRoZSB0ZW1wbGF0ZXMgdGhlbXNlbHZlcyBzdGFydCBhdCBTVEFSVCBhbmQgcmFuZ2UgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKQotICBFTkQuCi0gICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY29uc3QgdGVtcGxhdGUgKnN0YXJ0OwotICAgIGNvbnN0IHRlbXBsYXRlICplbmQ7Ci0gIH0gdGVtcGxhdGVzOwotCi0vKiB0aGVzZSBhcmUgZm9yIHJlZ2lzdGVyIG5hbWUgLS0+IG51bWJlciAmIHR5cGUgaGFzaCBsb29rdXAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBjaGFyICpyZWdfbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgcmVnX3R5cGU7Ci0gICAgdW5zaWduZWQgaW50IHJlZ19udW07Ci0gIH0KLXJlZ19lbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKnNlZ19uYW1lOwotICAgIHVuc2lnbmVkIGludCBzZWdfcHJlZml4OwotICB9Ci1zZWdfZW50cnk7Ci0KLS8qIDM4NiBvcGVyYW5kIGVuY29kaW5nIGJ5dGVzOiAgc2VlIDM4NiBib29rIGZvciBkZXRhaWxzIG9mIHRoaXMuICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgaW50IHJlZ21lbTsJLyogY29kZXMgcmVnaXN0ZXIgb3IgbWVtb3J5IG9wZXJhbmQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcmVnOwkJLyogY29kZXMgcmVnaXN0ZXIgb3BlcmFuZCAob3IgZXh0ZW5kZWQgb3Bjb2RlKSAqLwotICAgIHVuc2lnbmVkIGludCBtb2RlOwkJLyogaG93IHRvIGludGVycHJldCByZWdtZW0gJiByZWcgKi8KLSAgfQotbW9kcm1fYnl0ZTsKLQotLyogMzg2IG9wY29kZSBieXRlIHRvIGNvZGUgaW5kaXJlY3QgYWRkcmVzc2luZy4gKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBiYXNlOwotICAgIHVuc2lnbmVkIGluZGV4OwotICAgIHVuc2lnbmVkIHNjYWxlOwotICB9Ci1zaWJfYnl0ZTsKLQotLyogVGhlIG5hbWUgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4gQWxsb3cKLSAgIHRoaXMgdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkIGJlLiAqLwotI2lmbmRlZiBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUKLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQgaTM4Nl92YWxpZGF0ZV9maXggUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZGVmaW5lIFRDX1ZBTElEQVRFX0ZJWChGSVhQLFNFR1RZUEUsU0tJUCkgaTM4Nl92YWxpZGF0ZV9maXgoRklYUCkKLSNlbmRpZgotCi0jZW5kaWYgLyogVENfSTM4NiAqLwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotI2RlZmluZSBtZF9kb19hbGlnbihuLCBmaWxsLCBsZW4sIG1heCwgYXJvdW5kKQkJCQlcCi1pZiAoKG4pICYmICFuZWVkX3Bhc3NfMgkJCQkJCQlcCi0gICAgJiYgKCEoZmlsbCkgfHwgKChjaGFyKSooZmlsbCkgPT0gKGNoYXIpMHg5MCAmJiAobGVuKSA9PSAxKSkJCVwKLSAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSkJCQkJCQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgY2hhciAqcDsJCQkJCQkJCVwKLSAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDE1LCAxLCAocmVsYXhfc3Vic3RhdGVUKSBtYXgsCQlcCi0JCSAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIChuKSwgKGNoYXIgKikgMCk7CQlcCi0gICAgKnAgPSAweDkwOwkJCQkJCQkJXAotICAgIGdvdG8gYXJvdW5kOwkJCQkJCQlcCi0gIH0KLQotZXh0ZXJuIHZvaWQgaTM4Nl9hbGlnbl9jb2RlIFBBUkFNUyAoKGZyYWdTICosIGludCkpOwotCi0jZGVmaW5lIEhBTkRMRV9BTElHTihmcmFnUCkJCQkJCQlcCi1pZiAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSkgCQkJCQlcCi0gIGkzODZfYWxpZ25fY29kZSAoZnJhZ1AsIChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwkJCVwKLQkJCSAgIC0gZnJhZ1AtPmZyX2FkZHJlc3MJCQkJXAotCQkJICAgLSBmcmFnUC0+ZnJfZml4KSk7Ci0KLS8qIGNhbGwgbWRfYXBwbHlfZml4MyB3aXRoIHNlZ21lbnQgaW5zdGVhZCBvZiBtZF9hcHBseV9maXggKi8KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi12b2lkIGkzODZfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLSNkZWZpbmUgdGNfcHJpbnRfc3RhdGlzdGljcyBpMzg2X3ByaW50X3N0YXRpc3RpY3MKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0jaWZkZWYgU0NPX0VMRgotI2RlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MoKSBzY29faWQgKCkKLWV4dGVybiB2b2lkIHNjb19pZCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBESUZGX0VYUFJfT0sgICAgLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogZW5kIG9mIHRjLWkzODYuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pODYwLmMgYi9nYXMvY29uZmlnL3RjLWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxNzI4Mi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNjMgKzAsMCBAQAotLyogdGMtaTg2MC5jIC0tIEFzc2VtYmxlIGZvciB0aGUgSTg2MAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvaTg2MC5oIgotCi12b2lkIG1kX2JlZ2luICgpOwotdm9pZCBtZF9udW1iZXJfdG9fY2hhcnMgKCk7Ci12b2lkIG1kX2Fzc2VtYmxlICgpOwotY2hhciAqbWRfYXRvZiAoKTsKLXZvaWQgbWRfY29udmVydF9mcmFnICgpOwotaW50IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4ICgpOwotdm9pZCBtZF9udW1iZXJfdG9faW1tICgpOwotdm9pZCBtZF9udW1iZXJfdG9fZGlzcCAoKTsKLXZvaWQgbWRfbnVtYmVyX3RvX2ZpZWxkICgpOwotdm9pZCBtZF9yaV90b19jaGFycyAoKTsKLXN0YXRpYyB2b2lkIGk4NjBfaXAgKCk7Ci0vKiB2b2lkIGVtaXRfbWFjaGluZV9yZWxvYygpOyAqLwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0KLS8qIHZvaWQgKCptZF9lbWl0X3JlbG9jYXRpb25zKSgpID0gZW1pdF9tYWNoaW5lX3JlbG9jOyAqLwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIHNfZHVhbCAoKSwgc19lbmRkdWFsICgpOwotc3RhdGljIHZvaWQgc19hdG1wICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMKLSAgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImR1YWwiLCBzX2R1YWwsIDR9LAotICB7ImVuZGR1YWwiLCBzX2VuZGR1YWwsIDR9LAotICB7ImF0bXAiLCBzX2F0bXAsIDR9LAotICB7TlVMTCwgMCwgMH0sCi19OwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIS8iOwkvKiBKRiByZW1vdmVkICd8JyBmcm9tIGNvbW1lbnRfY2hhcnMgKi8KLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIy8iOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4KLSAgICovCi1pbnQgc2l6ZV9yZWxvY19pbmZvID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgb2N0YWxbMjU2XTsKLSNkZWZpbmUgaXNvY3RhbChjKSAgb2N0YWxbY10KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRvSGV4WzI1Nl07Ci0KLXN0cnVjdCBpODYwX2l0Ci0gIHsKLSAgICBjaGFyICplcnJvcjsKLSAgICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgICBzdHJ1Y3Qgbmxpc3QgKm5saXN0cDsKLSAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgaW50IHBjcmVsOwotICAgIGVudW0gZXhwYW5kX3R5cGUgZXhwYW5kOwotICAgIGVudW0gaGlnaGxvd190eXBlIGhpZ2hsb3c7Ci0gICAgZW51bSByZWxvY190eXBlIHJlbG9jOwotICB9IHRoZV9pbnNuOwotCi0jaWYgX19TVERDX18gPT0gMQotCi1zdGF0aWMgdm9pZCBwcmludF9pbnNuIChzdHJ1Y3QgaTg2MF9pdCAqaW5zbik7Ci1zdGF0aWMgaW50IGdldEV4cHJlc3Npb24gKGNoYXIgKnN0cik7Ci0KLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotCi1zdGF0aWMgdm9pZCBwcmludF9pbnNuICgpOwotc3RhdGljIGludCBnZXRFeHByZXNzaW9uICgpOwotCi0jZW5kaWYgLyogbm90IF9fU1REQ19fICovCi0KLXN0YXRpYyBjaGFyICpleHByX2VuZDsKLXN0YXRpYyBjaGFyIGxhc3RfZXhwYW5kOwkvKiBlcnJvciBpZiBleHBhbnNpb24gYWZ0ZXIgYnJhbmNoICovCi0KLWVudW0gZHVhbAotewotICBEVUFMX09GRiA9IDAsIERVQUxfT04sIERVQUxfRERPVCwgRFVBTF9PTkRET1QsCi19Owotc3RhdGljIGVudW0gZHVhbCBkdWFsX21vZGUgPSBEVUFMX09GRjsJLyogZHVhbC1pbnN0cnVjdGlvbiBtb2RlICovCi0KLXN0YXRpYyB2b2lkCi1zX2R1YWwgKCkJCQkvKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgaGF2ZSBkdWFsIHNldCAqLwotewotICBkdWFsX21vZGUgPSBEVUFMX09OOwotfQotCi1zdGF0aWMgdm9pZAotc19lbmRkdWFsICgpCQkJLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGhhdmUgZHVhbCBzZXQgKi8KLXsKLSAgZHVhbF9tb2RlID0gRFVBTF9PRkY7Ci19Ci0KLXN0YXRpYyBpbnQgYXRtcCA9IDMxOwkJLyogdGVtcG9yYXJ5IHJlZ2lzdGVyIGZvciBwc2V1ZG8ncyAqLwotCi1zdGF0aWMgdm9pZAotc19hdG1wICgpCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic3AiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgICAgYXRtcCA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJmcCIsIDIpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICBhdG1wID0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInIiLCAxKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAxOwotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKHRlbXAgPj0gMCAmJiB0ZW1wIDw9IDMxKQotCWF0bXAgPSB0ZW1wOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIikpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgaW50IGxvc2UgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHdoaWxlIChpIDwgTlVNT1BDT0RFUykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gaTg2MF9vcGNvZGVzW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgJmk4NjBfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksCi0JCSAgIGk4NjBfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgICAgZG8KLQl7Ci0JICBpZiAoaTg2MF9vcGNvZGVzW2ldLm1hdGNoICYgaTg2MF9vcGNvZGVzW2ldLmxvc2UpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBsb3Npbmcgb3Bjb2RlOiBgJXMnIFwiJXNcIlxuIiksCi0JCSAgICAgICBpODYwX29wY29kZXNbaV0ubmFtZSwgaTg2MF9vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCBOVU1PUENPREVTCi0JICAgICAmJiAhc3RyY21wIChpODYwX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpOwotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgZm9yIChpID0gJzAnOyBpIDwgJzgnOyArK2kpCi0gICAgb2N0YWxbaV0gPSAxOwotICBmb3IgKGkgPSAnMCc7IGkgPD0gJzknOyArK2kpCi0gICAgdG9IZXhbaV0gPSBpIC0gJzAnOwotICBmb3IgKGkgPSAnYSc7IGkgPD0gJ2YnOyArK2kpCi0gICAgdG9IZXhbaV0gPSBpICsgMTAgLSAnYSc7Ci0gIGZvciAoaSA9ICdBJzsgaSA8PSAnRic7ICsraSkKLSAgICB0b0hleFtpXSA9IGkgKyAxMCAtICdBJzsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICp0b1A7Ci0gIGludCByc2Q7Ci0gIGludCBub19vcGNvZGVzID0gMTsKLSAgaW50IGk7Ci0gIHN0cnVjdCBpODYwX2l0IHBzZXVkb1szXTsKLQotICBhc3NlcnQgKHN0cik7Ci0gIGk4NjBfaXAgKHN0cik7Ci0KLSAgLyogY2hlY2sgZm9yIGV4cGFuZGFibGUgZmxhZyB0byBwcm9kdWNlIHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLSAgaWYgKHRoZV9pbnNuLmV4cGFuZCAhPSAwICYmIHRoZV9pbnNuLmhpZ2hsb3cgPT0gTk9fU1BFQykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCXBzZXVkb1tpXSA9IHRoZV9pbnNuOwotCi0gICAgICBzd2l0Y2ggKHRoZV9pbnNuLmV4cGFuZCkKLQl7Ci0KLQljYXNlIEVfREVMQVk6Ci0JICBub19vcGNvZGVzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01PVjoKLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgKDEgPDwgMTUpICYmCi0JICAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gLSgxIDw8IDE1KSkpCi0JICAgIGJyZWFrOwotCSAgLyogb3IgbCVjb25zdCxyMCxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgfCAweGU0MDAwMDAwOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBQQUlSOwotCSAgLyogb3JoIGglY29uc3QsaXJlZ19kZXN0LGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAzZmZmZmZmKSB8IDB4ZWMwMDAwMDAgfAotCSAgICAoKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIDw8IDUpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBISUdIOwotCSAgbm9fb3Bjb2RlcyA9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9BRERSOgotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIC8qIG9yaCBoYSVhZGRyX2V4cHIscjAscjMxICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gMHhlYzAwMDAwMCB8IChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSEFESjsKLQkgIHBzZXVkb1swXS5yZWxvYyA9IExPVzA7CS8qIG11c3Qgb3ZlcndyaXRlICovCi0JICAvKiBsJWFkZHJfZXhwcihyMzEpLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiB+MHgwMDNlMDAwMCkgfCAoYXRtcCA8PCAyMSk7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IFBBSVI7Ci0JICBub19vcGNvZGVzID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX1UzMjoJCS8qIDJuZCB2ZXJzaW9uIGVtdWxhdGVzIEludGVsIGFzLCBub3QgZG9jLiAqLwotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNikgJiYKLQkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAwKSkKLQkgICAgYnJlYWs7Ci0JICAvKiAkKG9wY29kZSloIGglY29uc3QsaXJlZ19zcmMyLGlyZWdfZGVzdAotCQkJICAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweGYzZmZmZmZmKSB8IDB4MGMwMDAwMDA7ICovCi0JICAvKiAkKG9wY29kZSloIGglY29uc3QsaXJlZ19zcmMyLHIzMSAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweGYzZTBmZmZmKSB8IDB4MGMwMDAwMDAgfAotCSAgICAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0g7Ci0JICAvKiAkKG9wY29kZSkgbCVjb25zdCxpcmVnX2Rlc3QsaXJlZ19kZXN0Ci0JCQkgICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjAxZjAwMDApIHwgMHgwNDAwMDAwMCB8Ci0JCQkgICAoKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIDw8IDUpOyAqLwotCSAgLyogJChvcGNvZGUpIGwlY29uc3QscjMxLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweGYwMWYwMDAwKSB8IDB4MDQwMDAwMDAgfAotCSAgICAoYXRtcCA8PCAyMSk7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IFBBSVI7Ci0JICBub19vcGNvZGVzID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX0FORDoJCS8qIDJuZCB2ZXJzaW9uIGVtdWxhdGVzIEludGVsIGFzLCBub3QgZG9jLiAqLwotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNikgJiYKLQkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAwKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBhbmRub3QgaCVjb25zdCxpcmVnX3NyYzIsaXJlZ19kZXN0Ci0JCQkgICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDNmZmZmZmYpIHwgMHhkNDAwMDAwMDsgKi8KLQkgIC8qIGFuZG5vdCBoJWNvbnN0LGlyZWdfc3JjMixyMzEgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwM2UwZmZmZikgfCAweGQ0MDAwMDAwIHwKLQkgICAgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIOwotCSAgcHNldWRvWzBdLmV4cC5YX2FkZF9udW1iZXIgPSAtMSAtIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JICAvKiBhbmRub3QgbCVjb25zdCxpcmVnX2Rlc3QsaXJlZ19kZXN0Ci0JCQkgICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIHwgMHhkNDAwMDAwMCB8Ci0JCQkgICAoKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIDw8IDUpOyAqLwotCSAgLyogYW5kbm90IGwlY29uc3QscjMxLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSB8IDB4ZDQwMDAwMDAgfAotCSAgICAoYXRtcCA8PCAyMSk7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IFBBSVI7Ci0JICBwc2V1ZG9bMV0uZXhwLlhfYWRkX251bWJlciA9IC0xIC0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKLQkgIG5vX29wY29kZXMgPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfUzMyOgotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNSkgJiYKLQkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAtKDEgPDwgMTUpKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBvcmggaCVjb25zdCxyMCxyMzEgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAweGVjMDAwMDAwIHwgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIOwotCSAgLyogb3IgbCVjb25zdCxyMzEscjMxICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gMHhlNDAwMDAwMCB8IChhdG1wIDw8IDIxKSB8IChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKLQkgIC8qIHIzMSxpcmVnX3NyYzIsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMl0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIH4weDA0MDBmZmZmKSB8IChhdG1wIDw8IDExKTsKLQkgIHBzZXVkb1syXS5yZWxvYyA9IE5PX1JFTE9DOwotCSAgbm9fb3Bjb2RlcyA9IDM7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JfQotCi0gICAgICB0aGVfaW5zbiA9IHBzZXVkb1swXTsKLSAgICAgIC8qIGNoZWNrIGZvciBleHBhbmRlZCBvcGNvZGUgYWZ0ZXIgYnJhbmNoIG9yIGluIGR1YWwgKi8KLSAgICAgIGlmIChub19vcGNvZGVzID4gMSAmJiBsYXN0X2V4cGFuZCA9PSAxKQotCWFzX3dhcm4gKF8oIkV4cGFuZGVkIG9wY29kZSBhZnRlciBkZWxheWVkIGJyYW5jaDogYCVzJyIpLCBzdHIpOwotICAgICAgaWYgKG5vX29wY29kZXMgPiAxICYmIGR1YWxfbW9kZSAhPSBEVUFMX09GRikKLQlhc193YXJuIChfKCJFeHBhbmRlZCBvcGNvZGUgaW4gZHVhbCBtb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgfQotCi0gIGkgPSAwOwotICBkbwotICAgIHsJCQkJLyogYWx3YXlzIHByb2R1Y2UgYXQgbGVhc3Qgb25lIG9wY29kZSAqLwotICAgICAgdG9QID0gZnJhZ19tb3JlICg0KTsKLSAgICAgIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIHRoZV9pbnNuLm9wY29kZSwgNCk7Ci0KLSAgICAgIC8qIGNoZWNrIGZvciBleHBhbmRlZCBvcGNvZGUgYWZ0ZXIgYnJhbmNoIG9yIGluIGR1YWwgKi8KLSAgICAgIGxhc3RfZXhwYW5kID0gdGhlX2luc24ucGNyZWw7Ci0KLSAgICAgIC8qIHB1dCBvdXQgdGhlIHN5bWJvbC1kZXBlbmRlbnQgc3R1ZmYgKi8KLSAgICAgIGlmICh0aGVfaW5zbi5yZWxvYyAhPSBOT19SRUxPQykKLQl7Ci0JICBmaXhfbmV3IChmcmFnX25vdywJLyogd2hpY2ggZnJhZyAqLwotCQkgICAodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLAkvKiB3aGVyZSAqLwotCQkgICA0LAkJLyogc2l6ZSAqLwotCQkgICAmdGhlX2luc24uZXhwLAotCQkgICB0aGVfaW5zbi5wY3JlbCwKLQkgIC8qIG1lcmdlIGJpdCBmaWVsZHMgaW50byBvbmUgYXJndW1lbnQgKi8KLQkgIChpbnQpICgoKHRoZV9pbnNuLmhpZ2hsb3cgJiAweDMpIDw8IDQpIHwgKHRoZV9pbnNuLnJlbG9jICYgMHhmKSkpOwotCX0KLSAgICAgIHRoZV9pbnNuID0gcHNldWRvWysraV07Ci0gICAgfQotICB3aGlsZSAoLS1ub19vcGNvZGVzID4gMCk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLWk4NjBfaXAgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBjb25zdCBjaGFyICphcmdzOwotICBjaGFyIGM7Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLSAgc3RydWN0IGk4NjBfb3Bjb2RlICppbnNuOwotICBjaGFyICphcmdzU3RhcnQ7Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICB1bnNpZ25lZCBpbnQgbWFzazsKLSAgaW50IG1hdGNoID0gMDsKLSAgaW50IGNvbW1hID0gMDsKLQotCi0gIGZvciAocyA9IHN0cjsgaXNsb3dlciAoKnMpIHx8ICpzID09ICcuJyB8fCAqcyA9PSAnMyc7ICsrcykKLSAgICA7Ci0gIHN3aXRjaCAoKnMpCi0gICAgewotCi0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGNvbW1hID0gMTsKLQotICAgICAgLypGQUxMVEhST1VHSCovCi0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wIChzdHIsICJkLiIsIDIpID09IDApCi0gICAgewkJCQkvKiBjaGVjayBmb3IgZC4gb3Bjb2RlIHByZWZpeCAqLwotICAgICAgaWYgKGR1YWxfbW9kZSA9PSBEVUFMX09OKQotCWR1YWxfbW9kZSA9IERVQUxfT05ERE9UOwotICAgICAgZWxzZQotCWR1YWxfbW9kZSA9IERVQUxfRERPVDsKLSAgICAgIHN0ciArPSAyOwotICAgIH0KLQotICBpZiAoKGluc24gPSAoc3RydWN0IGk4NjBfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfRERPVCB8fCBkdWFsX21vZGUgPT0gRFVBTF9PTkRET1QpCi0Jc3RyIC09IDI7Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoY29tbWEpCi0gICAgewotICAgICAgKi0tcyA9ICcsJzsKLSAgICB9Ci0gIGFyZ3NTdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBtZW1zZXQgKCZ0aGVfaW5zbiwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zbikpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSBOT19SRUxPQzsKLQotICAgICAgLyoKLQkJICogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZQotCQkgKiBzdXJlIHRoYXQgdGhlIG9wZXJhbmRzIG1hdGNoCi0JCSAqLwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLQl7Ci0JICBzd2l0Y2ggKCphcmdzKQotCSAgICB7Ci0KLQkgICAgY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJewotCQkgIG1hdGNoID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJysnOgotCSAgICBjYXNlICcoJzoJCS8qIHRoZXNlIG11c3QgbWF0Y2ggZXhhY3RseSAqLwotCSAgICBjYXNlICcpJzoKLQkgICAgY2FzZSAnLCc6Ci0JICAgIGNhc2UgJyAnOgotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcjJzoJCS8qIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0ICovCi0JICAgICAgaWYgKGlzZGlnaXQgKCpzKyspKQotCQl7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCpzKSkKLQkJICAgIHsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMSc6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJzInOgotCSAgICBjYXNlICdkJzoKLQkgICAgICBzd2l0Y2ggKCpzKQotCQl7Ci0KLQkJY2FzZSAnZic6CS8qIGZyYW1lIHBvaW50ZXIgKi8KLQkJICBzKys7Ci0JCSAgaWYgKCpzKysgPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMHgzOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBnb3RvIGVycm9yOwotCi0JCWNhc2UgJ3MnOgkvKiBzdGFjayBwb2ludGVyICovCi0JCSAgcysrOwotCQkgIGlmICgqcysrID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgbWFzayA9IDB4MjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgZ290byBlcnJvcjsKLQotCQljYXNlICdyJzoJLyogYW55IHJlZ2lzdGVyICovCi0JCSAgcysrOwotCQkgIGlmICghaXNkaWdpdCAoYyA9ICpzKyspKQotCQkgICAgewotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGlmIChpc2RpZ2l0ICgqcykpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgoYyA9IDEwICogKGMgLSAnMCcpICsgKCpzKysgLSAnMCcpKSA+PSAzMikKLQkJCXsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGMgLT0gJzAnOwotCQkgICAgfQotCQkgIG1hc2sgPSBjOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6CS8qIG5vdCB0aGlzIG9wY29kZSAqLwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAvKgotCQkJCSAqIEdvdCB0aGUgcmVnaXN0ZXIsIG5vdyBmaWd1cmUgb3V0IHdoZXJlCi0JCQkJICogaXQgZ29lcyBpbiB0aGUgb3Bjb2RlLgotCQkJCSAqLwotCSAgICAgIHN3aXRjaCAoKmFyZ3MpCi0JCXsKLQotCQljYXNlICcxJzoKLQkJICBvcGNvZGUgfD0gbWFzayA8PCAxMTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICcyJzoKLQkJICBvcGNvZGUgfD0gbWFzayA8PCAyMTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdkJzoKLQkJICBvcGNvZGUgfD0gbWFzayA8PCAxNjsKLQkJICBjb250aW51ZTsKLQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZSc6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgICAgaWYgKCpzKysgPT0gJ2YnICYmIGlzZGlnaXQgKCpzKSkKLQkJewotCQkgIG1hc2sgPSAqcysrOwotCQkgIGlmIChpc2RpZ2l0ICgqcykpCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgPSAxMCAqIChtYXNrIC0gJzAnKSArICgqcysrIC0gJzAnKTsKLQkJICAgICAgaWYgKG1hc2sgPj0gMzIpCi0JCQl7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbWFzayAtPSAnMCc7Ci0JCSAgICB9Ci0JCSAgc3dpdGNoICgqYXJncykKLQkJICAgIHsKLQotCQkgICAgY2FzZSAnZSc6Ci0JCSAgICAgIG9wY29kZSB8PSBtYXNrIDw8IDExOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnZic6Ci0JCSAgICAgIG9wY29kZSB8PSBtYXNrIDw8IDIxOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnZyc6Ci0JCSAgICAgIG9wY29kZSB8PSBtYXNrIDw8IDE2OwotCQkgICAgICBpZiAoZHVhbF9tb2RlICE9IERVQUxfT0ZGKQotCQkJb3Bjb2RlIHw9ICgxIDw8IDkpOwkvKiBkdWFsIG1vZGUgaW5zdHJ1Y3Rpb24gKi8KLQkJICAgICAgaWYgKGR1YWxfbW9kZSA9PSBEVUFMX0RET1QpCi0JCQlkdWFsX21vZGUgPSBEVUFMX09GRjsKLQkJICAgICAgaWYgKGR1YWxfbW9kZSA9PSBEVUFMX09ORERPVCkKLQkJCWR1YWxfbW9kZSA9IERVQUxfT047Ci0JCSAgICAgIGlmICgob3Bjb2RlICYgKDEgPDwgMTApKSAmJiAobWFzayA9PSAoKG9wY29kZSA+PiAxMSkgJiAweDFmKSkpCi0JCQlhc193YXJuIChfKCJGc3IxIGVxdWFscyBmZGVzdCB3aXRoIFBpcGVsaW5pbmciKSk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYyc6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgImZpciIsIDMpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHgwIDw8IDIxOwotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAicHNyIiwgMykgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDEgPDwgMjE7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJkaXJiYXNlIiwgNykgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDIgPDwgMjE7Ci0JCSAgcyArPSA3OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJkYiIsIDIpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHgzIDw8IDIxOwotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZnNyIiwgMykgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDQgPDwgMjE7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJlcHNyIiwgNCkgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDUgPDwgMjE7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNSc6CQkvKiA1IGJpdCBpbW1lZGlhdGUgaW4gc3JjMSAqLwotCSAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0JICAgICAgaWYgKCFnZXRFeHByZXNzaW9uIChzKSkKLQkJewotCQkgIHMgPSBleHByX2VuZDsKLQkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciAmIH4weDFmKQotCQkgICAgYXNfYmFkIChfKCI1LWJpdCBpbW1lZGlhdGUgdG9vIGxhcmdlIikpOwotCQkgIG9wY29kZSB8PSAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciAmIDB4MWYpIDw8IDExOwotCQkgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBOT19SRUxPQzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2wnOgkJLyogMjYgYml0IGltbWVkaWF0ZSwgcmVsYXRpdmUgYnJhbmNoICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCUkFERFI7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ3MnOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgc3BsaXQgcmVsYXRpdmUgYnJhbmNoICovCi0JICAgICAgLyogdXBwZXIgNSBiaXRzIG9mIG9mZnNldCBpbiBkZXN0IGZpZWxkICovCi0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gU1BMSVQwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ1MnOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgc3BsaXQgKHN0KSwgYWxpZ25lZCAqLwotCSAgICAgIGlmIChvcGNvZGUgJiAoMSA8PCAyOCkpCi0JCWlmIChvcGNvZGUgJiAweDEpCi0JCSAgdGhlX2luc24ucmVsb2MgPSBTUExJVDI7Ci0JCWVsc2UKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFNQTElUMTsKLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnJlbG9jID0gU1BMSVQwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ0knOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgYWxpZ25lZCAqLwotCSAgICAgIGlmIChvcGNvZGUgJiAoMSA8PCAyOCkpCi0JCWlmIChvcGNvZGUgJiAweDEpCi0JCSAgdGhlX2luc24ucmVsb2MgPSBMT1cyOwotCQllbHNlCi0JCSAgdGhlX2luc24ucmVsb2MgPSBMT1cxOwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBMT1cwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2knOgkJLyogMTYgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gTE9XMDsKLQotCSAgICAgIC8qRkFMTFRIUk9VR0gqLwotCi0JICAgIGltbWVkaWF0ZToKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQlzKys7Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJoYSUiLCAzKSA9PSAwKQotCQl7Ci0JCSAgdGhlX2luc24uaGlnaGxvdyA9IEhJR0hBREo7Ci0JCSAgcyArPSAzOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImglIiwgMikgPT0gMCkKLQkJewotCQkgIHRoZV9pbnNuLmhpZ2hsb3cgPSBISUdIOwotCQkgIHMgKz0gMjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICJsJSIsIDIpID09IDApCi0JCXsKLQkJICB0aGVfaW5zbi5oaWdobG93ID0gUEFJUjsKLQkJICBzICs9IDI7Ci0JCX0KLQkgICAgICB0aGVfaW5zbi5leHBhbmQgPSBpbnNuLT5leHBhbmQ7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgaWYgdGhlIGdldEV4cHJlc3Npb24oKSBmYWlscywgd2Ugd2lsbCBzdGlsbCBoYXZlCi0JCQkJICAgY3JlYXRlZCBVIGVudHJpZXMgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlICdzeW1ib2xzJwotCQkJCSAgIGluIHRoZSBpbnB1dCBzdHJpbmcuICBUcnkgbm90IHRvIGNyZWF0ZSBVIHN5bWJvbHMgZm9yCi0JCQkJICAgcmVnaXN0ZXJzLCBldGMuICovCi0KLQkgICAgICBpZiAoIWdldEV4cHJlc3Npb24gKHMpKQotCQl7Ci0JCSAgcyA9IGV4cHJfZW5kOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotCXsKLQkgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotCSAgaWYgKCZpbnNuWzFdIC0gaTg2MF9vcGNvZGVzIDwgTlVNT1BDT0RFUwotCSAgICAgICYmICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpCi0JICAgIHsKLQkgICAgICArK2luc247Ci0JICAgICAgcyA9IGFyZ3NTdGFydDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldEV4cHJlc3Npb24gKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzYXZlX2luOwotICBzZWdUIHNlZzsKLQotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0gIHNlZyA9IGV4cHJlc3Npb24gKCZ0aGVfaW5zbi5leHApOwotICBpZiAoc2VnICE9IGFic29sdXRlX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB1bmRlZmluZWRfc2VjdGlvbgotICAgICAgJiYgISBTRUdfTk9STUFMIChzZWcpKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLmVycm9yID0gXygiYmFkIHNlZ21lbnQiKTsKLSAgICAgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAwOwotfQotCi0KLS8qCi0gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBtZF9hdG9mIGluIG02OGsuYy4gIEkgdGhpbmsgdGhpcyBpcyByaWdodCwKLSAgYnV0IEknbSBub3Qgc3VyZS4KLQotICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotCi0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKgotICogV3JpdGUgb3V0IGJpZy1lbmRpYW4uCi0gKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIG4sIGZpeFApCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGludCBuOwotICAgICBmaXhTICpmaXhQOwotewotICBlbnVtIHJlbG9jX3R5cGUgcmVsb2MgPSBmaXhQLT5meF9yX3R5cGUgJiAweGY7Ci0gIGVudW0gaGlnaGxvd190eXBlIGhpZ2hsb3cgPSAoZml4UC0+Znhfcl90eXBlID4+IDQpICYgMHgzOwotCi0gIGFzc2VydCAoYnVmKTsKLSAgYXNzZXJ0IChuID09IDQpOwkJLyogYWx3YXlzIG9uIGk4NjAgKi8KLQotICBzd2l0Y2ggKGhpZ2hsb3cpCi0gICAgewotCi0gICAgY2FzZSBISUdIQURKOgkJLyogYWRqdXN0cyB0aGUgaGlnaC1vcmRlciAxNi1iaXRzICovCi0gICAgICBpZiAodmFsICYgKDEgPDwgMTUpKQotCXZhbCArPSAoMSA8PCAxNik7Ci0KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotCi0gICAgY2FzZSBISUdIOgkJCS8qIHNlbGVjdHMgdGhlIGhpZ2gtb3JkZXIgMTYtYml0cyAqLwotICAgICAgdmFsID4+PSAxNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQQUlSOgkJCS8qIHNlbGVjdHMgdGhlIGxvdy1vcmRlciAxNi1iaXRzICovCi0gICAgICB2YWwgPSB2YWwgJiAweGZmZmY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgc3dpdGNoIChyZWxvYykKLSAgICB7Ci0KLSAgICBjYXNlIEJSQUREUjoJCS8qIGJyLGNhbGwsYmMsYmMudCxibmMsYm5jLnQgdy8yNi1iaXQgaW1tZWRpYXRlICovCi0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgIT0gMSkKLQlhc19iYWQgKF8oIjI2LWJpdCBicmFuY2ggdy9vIHBjIHJlbGF0aXZlIHNldDogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgPj49IDI7CQkvKiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwgKi8KLQotICAgICAgaWYgKHZhbCA+PSAoMSA8PCAyNSkgfHwgdmFsIDwgLSgxIDw8IDI1KSkJLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JYXNfYmFkIChfKCIyNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IiksIHZhbCk7Ci0gICAgICBidWZbMF0gPSAoYnVmWzBdICYgMHhmYykgfCAoKHZhbCA+PiAyNCkgJiAweDMpOwotICAgICAgYnVmWzFdID0gdmFsID4+IDE2OwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU1BMSVQyOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgNC1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDMpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDQtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDM7CQkvKiA0LWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgU1BMSVQxOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgMi1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDEpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDItYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDE7CQkvKiAyLWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgU1BMSVQwOgkJLyogc3QsYmxhLGJ0ZSxidG5lIHcvMTYtYml0IGltbWVkaWF0ZSAqLwotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDEpCi0JdmFsID4+PSAyOwkJLyogYWxpZ24gcGNyZWwgb2Zmc2V0LCBzZWUgbWFudWFsICovCi0gICAgICAvKiBjaGVjayBmb3IgYm91bmRzICovCi0gICAgICBpZiAoaGlnaGxvdyAhPSBQQUlSICYmICh2YWwgPj0gKDEgPDwgMTYpIHx8IHZhbCA8IC0oMSA8PCAxNSkpKQotCWFzX2JhZCAoXygiMTYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgYnVmWzFdID0gKGJ1ZlsxXSAmIH4weDFmKSB8ICgodmFsID4+IDExKSAmIDB4MWYpOwotICAgICAgYnVmWzJdID0gKGJ1ZlsyXSAmIH4weDcpIHwgKCh2YWwgPj4gOCkgJiAweDcpOwotICAgICAgYnVmWzNdIHw9IHZhbDsJCS8qIHBlcnNlcnZlIGJvdHRvbSBvcGNvZGUgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIExPVzQ6CQkJLyogZmxkLHBmbGQscHN0LGZsdXNoIDE2LWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4ZikKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgMTYtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weGY7CQkvKiAxNi1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIExPVzM6CQkJLyogZmxkLHBmbGQscHN0LGZsdXNoIDgtYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHg3KQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSA4LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHg3OwkJLyogOC1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIExPVzI6CQkJLyogMTYgYml0IGltbWVkaWF0ZSwgNC1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDMpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDQtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDM7CQkvKiA0LWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgTE9XMToJCQkvKiAxNiBiaXQgaW1tZWRpYXRlLCAyLWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4MSkKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgMi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4MTsJCS8qIDItYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBMT1cwOgkJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIGJ5dGUgYWxpZ25lZCAqLwotICAgICAgLyogY2hlY2sgZm9yIGJvdW5kcyAqLwotICAgICAgaWYgKGhpZ2hsb3cgIT0gUEFJUiAmJiAodmFsID49ICgxIDw8IDE2KSB8fCB2YWwgPCAtKDEgPDwgMTUpKSkKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgb3ZlcmZsb3c6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gfD0gdmFsOwkJLyogcGVyc2VydmUgYm90dG9tIG9wY29kZSBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTk9fUkVMT0M6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IiksIHJlbG9jKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotewotICBhc19mYXRhbCAoXygibWRfbnVtYmVyX3RvX2Rpc3BcbiIpKTsKLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2ZpZWxkIChidWYsIHZhbCwgZml4KQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICB2b2lkICpmaXg7Ci17Ci0gIGFzX2ZhdGFsIChfKCJpODYwX251bWJlcl90b19maWVsZFxuIikpOwotfQotCi0vKiB0aGUgYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QgcGxheXMgaGVsbAotICAgd2l0aCB0aGUgYnl0ZS1vcmRlciBwcm9ibGVtcyBvZiBjcm9zcy1hc3NlbWJseS4gIFNvIGFzIGEgaGFjaywKLSAgIEkgYWRkZWQgdGhpcyBtYWNoLiBkZXBlbmRlbnQgcmkgdHdpZGRsZXIuICBVZ2x5LCBidXQgaXQgZ2V0cwotICAgeW91IHRoZXJlLiAtS1dLICovCi0vKiBvbiBpODYwOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBuZXh0IHRocmVlCi0gICBieXRlcyBhcmUgaW5kZXgsIG1vc3Qgc2lnLiBieXRlIGZpcnN0LiAgQnl0ZSA3IGlzIGJyb2tlbiB1cCB3aXRoCi0gICBiaXQgNyBhcyBwY3JlbCwgYml0IDYgYXMgZXh0ZXJuLCBhbmQgdGhlIGxvd2VyIHNpeCBiaXRzIGFzCi0gICByZWxvY2F0aW9uIHR5cGUgKGhpZ2hsb3cgNS00KS4gIE5leHQgNCBieXRlcyBhcmUgbG9uZyBhZGRlbmQuICovCi0vKiBUaGFueCBhbmQgYSB0aXAgb2YgdGhlIGhhdCB0byBNaWNoYWVsIEJsb29tLCBtYkB0dGlkY2EudHRpLmNvbSAqLwotdm9pZAotbWRfcmlfdG9fY2hhcnMgKHJpX3AsIHJpKQotICAgICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyaV9wLCByaTsKLXsKLSNpZiAwCi0gIHVuc2lnbmVkIGNoYXIgdGhlX2J5dGVzW3NpemVvZiAoKnJpX3ApXTsKLQotICAvKiB0aGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLnJfYWRkcmVzcywgc2l6ZW9mIChyaS5yX2FkZHJlc3MpKTsKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgdGhlX2J5dGVzWzRdID0gKHJpLnJfaW5kZXggPj4gMTYpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s1XSA9IChyaS5yX2luZGV4ID4+IDgpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s2XSA9IHJpLnJfaW5kZXggJiAweDBmZjsKLSAgdGhlX2J5dGVzWzddID0gKChyaS5yX2V4dGVybiA8PCA3KSAmIDB4ODApIHwgKDAgJiAweDYwKSB8IChyaS5yX3R5cGUgJiAweDFGKTsKLSAgLyogQWxzbyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAoJnRoZV9ieXRlc1s4XSwgcmkucl9hZGRlbmQsIHNpemVvZiAocmkucl9hZGRlbmQpKTsKLSAgLyogbm93IHB1dCBpdCBiYWNrIHdoZXJlIHlvdSBmb3VuZCBpdCwgSnVuaW9yLi4uICovCi0gIG1lbWNweSAoKGNoYXIgKikgcmlfcCwgdGhlX2J5dGVzLCBzaXplb2YgKCpyaV9wKSk7Ci0jZW5kaWYKLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLwotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgYXNfZmF0YWwgKF8oImk4NjBfY29udmVydF9mcmFnXG4iKSk7Ci19Ci0KLS8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGk4NjAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWd0eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VndHlwZTsKLXsKLSAgYXNfZmF0YWwgKF8oImk4NjBfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIpKTsKLX0KLQotLyogZm9yIGRlYnVnZ2luZyBvbmx5LCBtdXN0IG1hdGNoIGVudW0gcmVsb2NfdHlwZSAqLwotc3RhdGljIGNoYXIgKlJlbG9jW10gPQotewotICAiTk9fUkVMT0MiLAotICAiQlJBRERSIiwKLSAgIkxPVzAiLAotICAiTE9XMSIsCi0gICJMT1cyIiwKLSAgIkxPVzMiLAotICAiTE9XNCIsCi0gICJTUExJVDAiLAotICAiU1BMSVQxIiwKLSAgIlNQTElUMiIsCi0gICJSRUxPQ18zMiIsCi19Owotc3RhdGljIGNoYXIgKkhpZ2hsb3dbXSA9Ci17Ci0gICJOT19TUEVDIiwKLSAgIlBBSVIiLAotICAiSElHSCIsCi0gICJISUdIQURKIiwKLX07Ci1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbiAoaW5zbikKLSAgICAgc3RydWN0IGk4NjBfaXQgKmluc247Ci17Ci0gIGlmIChpbnNuLT5lcnJvcikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogJXNcbiIpOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAib3Bjb2RlPTB4JTA4eFx0IiwgaW5zbi0+b3Bjb2RlKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZXhwYW5kPTB4JTA4eFx0IiwgaW5zbi0+ZXhwYW5kKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAicmVsb2MgPSAlc1x0IiwgUmVsb2NbaW5zbi0+cmVsb2NdKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiaGlnaGxvdyA9ICVzXG4iLCBIaWdobG93W2luc24tPmhpZ2hsb3ddKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZXhwID0gIHtcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9hZGRfc3ltYm9sID0gJXNcbiIsCi0JICAgaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCA/Ci0JICAgKFNfR0VUX05BTUUgKGluc24tPmV4cC5YX2FkZF9zeW1ib2wpID8KLQkgICAgU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCkgOiAiPz8/IikgOiAiMCIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9vcF9zeW1ib2wgPSAlc1xuIiwKLQkgICBpbnNuLT5leHAuWF9vcF9zeW1ib2wgPwotCSAgIChTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9vcF9zeW1ib2wpID8KLQkgICAgU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sKSA6ICI/Pz8iKSA6ICIwIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX2FkZF9udW1iZXIgPSAlZFxuIiwKLQkgICBpbnNuLT5leHAuWF9hZGRfbnVtYmVyKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAifVxuIik7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotI2lmZGVmIGNvbW1lbnQKLS8qCi0gKiBJODYwIHJlbG9jYXRpb25zIGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudCwgc28gaXQgbmVlZHMKLSAqIHRoaXMgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZSB0byBlbWl0IHRoZW0uCi0gKi8KLXZvaWQKLWVtaXRfbWFjaGluZV9yZWxvYyAoZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIHJlZ2lzdGVyIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBzdHJ1Y3QgcmVsb2NfaW5mb19pODYwIHJpOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBleHRlcm4gY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsKLSAgbG9uZyBhZGRfbnVtYmVyOwotCi0gIG1lbXNldCAoKGNoYXIgKikgJnJpLCAnXDAnLCBzaXplb2YgKHJpKSk7Ci0gIGZvciAoOyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0KLSAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgJiB+MHgzZikKLQl7Ci0JICBhc19mYXRhbCAoImZpeFAtPmZ4X3JfdHlwZSA9ICVkXG4iLCBmaXhQLT5meF9yX3R5cGUpOwotCX0KLSAgICAgIHJpLnJfcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLSAgICAgIHJpLnJfdHlwZSA9IGZpeFAtPmZ4X3JfdHlwZTsKLQotICAgICAgaWYgKChzeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kpICE9IE5VTEwpCi0JewotCSAgcmkucl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArCi0JICAgIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci0JICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICByaS5yX2V4dGVybiA9IDE7Ci0JICAgICAgcmkucl9zeW1ib2xudW0gPSBzeW1ib2xQLT5zeV9udW1iZXI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJpLnJfZXh0ZXJuID0gMDsKLQkgICAgICByaS5yX3N5bWJvbG51bSA9IFNfR0VUX1RZUEUgKHN5bWJvbFApOwotCSAgICB9Ci0JICBpZiAoc3ltYm9sUCAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgPSBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzOwotCSAgICB9Ci0JICByaS5yX3R5cGUgPSBmaXhQLT5meF9yX3R5cGU7Ci0JICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JICAgIHsKLQkgICAgICAvKiBwcmVzZXJ2ZSBhY3R1YWwgb2Zmc2V0IHZzLiBwYyArIDQgKi8KLQkgICAgICByaS5yX2FkZGVuZCAtPSAocmkucl9hZGRyZXNzICsgNCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCSAgICB9Ci0KLQkgIG1kX3JpX3RvX2NoYXJzICgoY2hhciAqKSAmcmksIHJpKTsKLQkgIGFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIChjaGFyICopICZyaSwgc2l6ZW9mIChyaSkpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLSNpZmRlZiBPQkpfQU9VVAotCi0vKiBvbiBpODYwOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBuZXh0IHRocmVlCi0gICBieXRlcyBhcmUgaW5kZXgsIG1vc3Qgc2lnLiBieXRlIGZpcnN0LiAgQnl0ZSA3IGlzIGJyb2tlbiB1cCB3aXRoCi0gICBiaXQgNyBhcyBwY3JlbCwgYml0IDYgYXMgZXh0ZXJuLCBhbmQgdGhlIGxvd2VyIHNpeCBiaXRzIGFzCi0gICByZWxvY2F0aW9uIHR5cGUgKGhpZ2hsb3cgNS00KS4gIE5leHQgNCBieXRlcyBhcmUgbG9uZyBhZGRlbmQuICovCi0KLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgbG9uZyByX2luZGV4OwotICBsb25nIHJfZXh0ZXJuOwotICBsb25nIHJfYWRkZW5kID0gMDsKLSAgbG9uZyByX2FkZHJlc3M7Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kpOwotICBrbm93ICghKGZpeFAtPmZ4X3JfdHlwZSAmIH4weDNmKSk7Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDE7Ci0gICAgICByX2luZGV4ID0gZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpOwotICAgIH0KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotCQkgICAgICByX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgd2hlcmVbNF0gPSAocl9pbmRleCA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9pbmRleCA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfaW5kZXggJiAweDBmZjsKLSAgd2hlcmVbN10gPSAoKChmaXhQLT5meF9wY3JlbCA8PCA3KSAmIDB4ODApCi0JICAgICAgfCAoKHJfZXh0ZXJuIDw8IDYpICYgMHg0MCkKLQkgICAgICB8IChmaXhQLT5meF9yX3R5cGUgJiAweDNGKSk7Ci0KLSAgaWYgKHN5bWJvbF9nZXRfZnJhZyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIHJfYWRkZW5kID0gc3ltYm9sX2dldF9mcmFnIChmaXhQLT5meF9hZGRzeSktPmZyX2FkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICAvKiBwcmVzZXJ2ZSBhY3R1YWwgb2Zmc2V0IHZzLiBwYyArIDQgKi8KLSAgICAgIHJfYWRkZW5kIC09IChyX2FkZHJlc3MgKyA0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByX2FkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLSAgICB9Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgmd2hlcmVbOF0sIHJfYWRkZW5kLCA0KTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIGk4NjAsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cwotICAgaXRzIHNpemUuICg/Pz8gSXMgdGhpcyByaWdodD8gIEZJWE1FLVNPT04hKSAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqcGxhY2UgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgLyogbG9va3MgdG8gbWUgbGlrZSBpODYwIG5ldmVyIGhhcyBiaXQgZml4ZXMuIExldCdzIHNlZS4geG94b3JpY2guICovCi0gIGtub3cgKGZpeFAtPmZ4X2JpdF9maXhQID09IE5VTEwpOwotICBpZiAoIWZpeFAtPmZ4X2JpdF9maXhQKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKLSAgICAgIG1kX251bWJlcl90b19pbW0gKHBsYWNlLCB2YWwsIGZpeFAtPmZ4X3NpemUsIGZpeFApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19maWVsZCAocGxhY2UsIHZhbCwgZml4UC0+ZnhfYml0X2ZpeFApOwotICAgIH0KLX0KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLWk4NjAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pODYwLmggYi9nYXMvY29uZmlnL3RjLWk4NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiMjFjMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIHRjLWk4NjAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGhlIEk4NjAKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfSTg2MCAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGMtaTg2MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWk5NjAuYyBiL2dhcy9jb25maWcvdGMtaTk2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGMxNWMwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0OSArMCwwIEBACi0vKiB0Yy1pOTYwLmMgLSBBbGwgdGhlIGk4MDk2MC1zcGVjaWZpYyBzdHVmZgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBTZWUgY29tbWVudCBvbiBtZF9wYXJzZV9vcHRpb24gZm9yIDgwOTYwLXNwZWNpZmljIGludm9jYXRpb24gb3B0aW9ucy4gKi8KLQotLyogVGhlcmUgYXJlIDQgZGlmZmVyZW50IGxlbmd0aHMgb2YgKHBvdGVudGlhbGx5KSBzeW1ib2wtYmFzZWQgZGlzcGxhY2VtZW50cwotICAgaW4gdGhlIDgwOTYwIGluc3RydWN0aW9uIHNldCwgZWFjaCBvZiB3aGljaCBjb3VsZCByZXF1aXJlIGFkZHJlc3MgZml4LXVwcwotICAgYW5kIChpbiB0aGUgY2FzZSBvZiBleHRlcm5hbCBzeW1ib2xzKSBlbWlzc2lvbiBvZiByZWxvY2F0aW9uIGRpcmVjdGl2ZXM6Ci0KLSAgIDMyLWJpdCAoTUVNQikKLSAgICAgICAgVGhpcyBpcyBhIHN0YW5kYXJkIGxlbmd0aCBmb3IgdGhlIGJhc2UgYXNzZW1ibGVyIGFuZCByZXF1aXJlcyBubwotICAgICAgICBzcGVjaWFsIGFjdGlvbi4KLQotICAgMTMtYml0IChDT0JSKQotICAgICAgICBUaGlzIGlzIGEgbm9uLXN0YW5kYXJkIGxlbmd0aCwgYnV0IHRoZSBiYXNlIGFzc2VtYmxlciBoYXMgYQotICAgICAgICBob29rIGZvciBiaXQgZmllbGQgYWRkcmVzcyBmaXh1cHM6IHRoZSBmaXhTIHN0cnVjdHVyZSBjYW4KLSAgICAgICAgcG9pbnQgdG8gYSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCwgaW4gd2hpY2ggY2FzZSBvdXIKLSAgICAgICAgbWRfbnVtYmVyX3RvX2ZpZWxkKCkgcm91dGluZSBnZXRzIGNhbGxlZCB0byBwcm9jZXNzIGl0LgotCi0gICAgICAgIEkgbWFkZSB0aGUgaG9vayBhIGxpdHRsZSBjbGVhbmVyIGJ5IGhhdmluZyBmaXhfbmV3KCkgKGluIHRoZSBiYXNlCi0gICAgICAgIGFzc2VtYmxlcikgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZml4UyBpbiBxdWVzdGlvbi4gIEFuZCBJIG1hZGUgaXQgYQotICAgICAgICBsaXR0bGUgc2ltcGxlciBieSBzdG9yaW5nIHRoZSBmaWVsZCBzaXplIChpbiB0aGlzIGNhc2UgMTMpIGluc3RlYWQgb2YKLSAgICAgICAgb2YgYSBwb2ludGVyIHRvIGFub3RoZXIgc3RydWN0dXJlOiAgODA5NjAgZGlzcGxhY2VtZW50cyBhcmUgQUxXQVlTCi0gICAgICAgIHN0b3JlZCBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYSA0LWJ5dGUgd29yZC4KLQotICAgICAgICBTaW5jZSB0aGUgdGFyZ2V0IG9mIGEgQ09CUiBjYW5ub3QgYmUgZXh0ZXJuYWwsIG5vIHJlbG9jYXRpb24KLSAgICAgICAgZGlyZWN0aXZlcyBmb3IgdGhpcyBzaXplIGRpc3BsYWNlbWVudCBoYXZlIHRvIGJlIGdlbmVyYXRlZC4KLSAgICAgICAgQnV0IHRoZSBiYXNlIGFzc2VtYmxlciBoYWQgdG8gYmUgbW9kaWZpZWQgdG8gaXNzdWUgZXJyb3IKLSAgICAgICAgbWVzc2FnZXMgaWYgdGhlIHN5bWJvbCBkaWQgdHVybiBvdXQgdG8gYmUgZXh0ZXJuYWwuCi0KLSAgIDI0LWJpdCAoQ1RSTCkKLSAgICAgICAgRml4dXBzIGFyZSBoYW5kbGVkIGFzIGZvciB0aGUgMTMtYml0IGNhc2UgKGV4Y2VwdCB0aGF0IDI0IGlzIHN0b3JlZAotICAgICAgICBpbiB0aGUgZml4UykuCi0KLSAgICAgICAgVGhlIHJlbG9jYXRpb24gZGlyZWN0aXZlIGdlbmVyYXRlZCBpcyB0aGUgc2FtZSBhcyB0aGF0IGZvciB0aGUgMzItYml0Ci0gICAgICAgIGRpc3BsYWNlbWVudCwgZXhjZXB0IHRoYXQgaXQncyBQQy1yZWxhdGl2ZSAodGhlIDMyLWJpdCBkaXNwbGFjZW1lbnQKLSAgICAgICAgbmV2ZXIgaXMpLiAgIFRoZSBpODA5NjAgdmVyc2lvbiBvZiB0aGUgbGlua2VyIG5lZWRzIGEgbW9kIHRvCi0gICAgICAgIGRpc3Rpbmd1aXNoIGFuZCBoYW5kbGUgdGhlIDI0LWJpdCBjYXNlLgotCi0gICAxMi1iaXQgKE1FTUEpCi0gICAgICAgIE1FTUEgZm9ybWF0cyBhcmUgYWx3YXlzIHByb21vdGVkIHRvIE1FTUIgKDMyLWJpdCkgaWYgdGhlIGRpc3BsYWNlbWVudAotICAgICAgICBpcyBiYXNlZCBvbiBhIHN5bWJvbCwgYmVjYXVzZSBpdCBjb3VsZCBiZSByZWxvY2F0ZWQgYXQgbGluayB0aW1lLgotICAgICAgICBUaGUgb25seSB0aW1lIHdlIHVzZSB0aGUgMTItYml0IGZvcm1hdCBpcyBpZiBhbiBhYnNvbHV0ZSB2YWx1ZSBvZgotICAgICAgICBsZXNzIHRoYW4gNDA5NiBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCBuZWl0aGVyIGEgZml4dXAgbm9yCi0gICAgICAgIGEgcmVsb2NhdGlvbiBkaXJlY3RpdmUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotI2luY2x1ZGUgIm9wY29kZS9pOTYwLmgiCi0KLSNpZiBkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpCi0KLSNkZWZpbmUgVENfU19JU19TWVNQUk9DKHMpCSgoMTw9U19HRVRfT1RIRVIocykpICYmIChTX0dFVF9PVEhFUihzKTw9MzIpKQotI2RlZmluZSBUQ19TX0lTX0JBTE5BTUUocykJKFNfR0VUX09USEVSKHMpID09IE5fQkFMTkFNRSkKLSNkZWZpbmUgVENfU19JU19DQUxMTkFNRShzKQkoU19HRVRfT1RIRVIocykgPT0gTl9DQUxMTkFNRSkKLSNkZWZpbmUgVENfU19JU19CQURQUk9DKHMpCSgoU19HRVRfT1RIRVIocykgIT0gMCkgJiYgIVRDX1NfSVNfQ0FMTE5BTUUocykgJiYgIVRDX1NfSVNfQkFMTkFNRShzKSAmJiAhVENfU19JU19TWVNQUk9DKHMpKQotCi0jZGVmaW5lIFRDX1NfU0VUX1NZU1BST0MocywgcCkJKFNfU0VUX09USEVSKChzKSwgKHApKzEpKQotI2RlZmluZSBUQ19TX0dFVF9TWVNQUk9DKHMpCShTX0dFVF9PVEhFUihzKS0xKQotCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRShzKQkoU19TRVRfT1RIRVIoKHMpLCBOX0JBTE5BTUUpKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FKHMpCShTX1NFVF9PVEhFUigocyksIE5fQ0FMTE5BTUUpKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX1NZU1BST0MocykJezt9Ci0KLSNlbHNlIC8qICEgT0JKX0EvQk9VVCAqLwotI2lmZGVmIE9CSl9DT0ZGCi0KLSNkZWZpbmUgVENfU19JU19TWVNQUk9DKHMpCShTX0dFVF9TVE9SQUdFX0NMQVNTKHMpID09IENfU0NBTEwpCi0jZGVmaW5lIFRDX1NfSVNfQkFMTkFNRShzKQkoU0ZfR0VUX0JBTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfSVNfQ0FMTE5BTUUocykJKFNGX0dFVF9DQUxMTkFNRShzKSkKLSNkZWZpbmUgVENfU19JU19CQURQUk9DKHMpCShUQ19TX0lTX1NZU1BST0MocykgJiYgVENfU19HRVRfU1lTUFJPQyhzKSA8IDAgJiYgMzEgPCBUQ19TX0dFVF9TWVNQUk9DKHMpKQotCi0jZGVmaW5lIFRDX1NfU0VUX1NZU1BST0MocywgcCkJKChzKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMV0ueF9zYy54X3N0aW5keCA9IChwKSkKLSNkZWZpbmUgVENfU19HRVRfU1lTUFJPQyhzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2F1eGVudFsxXS54X3NjLnhfc3RpbmR4KQotCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRShzKQkoU0ZfU0VUX0JBTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUocykJKFNGX1NFVF9DQUxMTkFNRShzKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19TWVNQUk9DKHMpCShTX1NFVF9TVE9SQUdFX0NMQVNTKChzKSwgQ19TQ0FMTCkpCi0KLSNlbHNlIC8qICEgT0JKX0NPRkYgKi8KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRDX1NfSVNfU1lTUFJPQyhzKQkwCi0KLSNkZWZpbmUgVENfU19JU19CQUxOQU1FKHMpCTAKLSNkZWZpbmUgVENfU19JU19DQUxMTkFNRShzKQkwCi0jZGVmaW5lIFRDX1NfSVNfQkFEUFJPQyhzKQkwCi0KLSNkZWZpbmUgVENfU19TRVRfU1lTUFJPQyhzLCBwKQotI2RlZmluZSBUQ19TX0dFVF9TWVNQUk9DKHMpIDAKLQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUocykKLSNkZWZpbmUgVENfU19GT1JDRV9UT19DQUxMTkFNRShzKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX1NZU1BST0MocykKLSNlbHNlCi0gI2Vycm9yIENPRkYsIGEub3V0LCBiLm91dCwgYW5kIEVMRiBhcmUgdGhlIG9ubHkgc3VwcG9ydGVkIGZvcm1hdHMuCi0jZW5kaWYgLyogISBPQkpfRUxGICovCi0jZW5kaWYgLyogISBPQkpfQ09GRiAqLwotI2VuZGlmIC8qICEgT0JKX0EvQk9VVCAqLwotCi1leHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotCi0jaWYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICFkZWZpbmVkIChCRkQpCi0jaWZkZWYgT0JKX0NPRkYKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2MpOwotI2Vsc2UgLyogT0JKX0NPRkYgKi8KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotI2VuZGlmCi0KLS8qIExvY2FsIGk4MDk2MCByb3V0aW5lcy4gICovCi0KLXN0YXRpYyB2b2lkIGJyY250X2VtaXQgKCk7CS8qIEVtaXQgYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uIGNvZGUgKi8KLXN0YXRpYyBjaGFyICpicmxhYl9uZXh0ICgpOwkvKiBSZXR1cm4gbmV4dCBicmFuY2ggbG9jYWwgbGFiZWwgKi8KLXZvaWQgYnJ0YWJfZW1pdCAoKTsJCS8qIEVtaXQgYnItcHJlZGljdCBpbnN0cnVtZW50YXRpb24gdGFibGUgKi8KLXN0YXRpYyB2b2lkIGNvYnJfZm10ICgpOwkvKiBHZW5lcmF0ZSBDT0JSIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZCBjdHJsX2ZtdCAoKTsJLyogR2VuZXJhdGUgQ1RSTCBpbnN0cnVjdGlvbiAqLwotc3RhdGljIGNoYXIgKmVtaXQgKCk7CQkvKiBFbWl0IChpbnRlcm5hbGx5KSBiaW5hcnkgKi8KLXN0YXRpYyBpbnQgZ2V0X2FyZ3MgKCk7CQkvKiBCcmVhayBhcmd1bWVudHMgb3V0IG9mIGNvbW1hLXNlcGFyYXRlZCBsaXN0ICovCi1zdGF0aWMgdm9pZCBnZXRfY2Rpc3AgKCk7CS8qIEhhbmRsZSBDT0JSIG9yIENUUkwgZGlzcGxhY2VtZW50ICovCi1zdGF0aWMgY2hhciAqZ2V0X2lzcGVjICgpOwkvKiBGaW5kIGluZGV4IHNwZWNpZmljYXRpb24gc3RyaW5nICovCi1zdGF0aWMgaW50IGdldF9yZWdudW0gKCk7CS8qIFRyYW5zbGF0ZSB0ZXh0IHRvIHJlZ2lzdGVyIG51bWJlciAqLwotc3RhdGljIGludCBpX3NjYW4gKCk7CQkvKiBMZXhpY2FsIHNjYW4gb2YgaW5zdHJ1Y3Rpb24gc291cmNlICovCi1zdGF0aWMgdm9pZCBtZW1fZm10ICgpOwkJLyogR2VuZXJhdGUgTUVNQSBvciBNRU1CIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZCBtZW1hX3RvX21lbWIgKCk7CS8qIENvbnZlcnQgTUVNQSBpbnN0cnVjdGlvbiB0byBNRU1CIGZvcm1hdCAqLwotc3RhdGljIHZvaWQgcGFyc2VfZXhwciAoKTsJLyogUGFyc2UgYW4gZXhwcmVzc2lvbiAqLwotc3RhdGljIGludCBwYXJzZV9sZGNvbnN0ICgpOwkvKiBQYXJzZSBhbmQgcmVwbGFjZSBhICdsZGNvbnN0JyBwc2V1ZG8tb3AgKi8KLXN0YXRpYyB2b2lkIHBhcnNlX21lbW9wICgpOwkvKiBQYXJzZSBhIG1lbW9yeSBvcGVyYW5kICovCi1zdGF0aWMgdm9pZCBwYXJzZV9wbyAoKTsJLyogUGFyc2UgbWFjaGluZS1kZXBlbmRlbnQgcHNldWRvLW9wICovCi1zdGF0aWMgdm9pZCBwYXJzZV9yZWdvcCAoKTsJLyogUGFyc2UgYSByZWdpc3RlciBvcGVyYW5kICovCi1zdGF0aWMgdm9pZCByZWdfZm10ICgpOwkJLyogR2VuZXJhdGUgYSBSRUcgZm9ybWF0IGluc3RydWN0aW9uICovCi12b2lkIHJlbG9jX2NhbGxqICgpOwkJLyogUmVsb2NhdGUgYSAnY2FsbGonIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZCByZWxheF9jb2JyICgpOwkvKiAiRGUtb3B0aW1pemUiIGNvYnIgaW50byBjb21wYXJlL2JyYW5jaCAqLwotc3RhdGljIHZvaWQgc19sZWFmcHJvYyAoKTsJLyogUHJvY2VzcyAnLmxlYWZwcm9jJyBwc2V1ZG8tb3AgKi8KLXN0YXRpYyB2b2lkIHNfc3lzcHJvYyAoKTsJLyogUHJvY2VzcyAnLnN5c3Byb2MnIHBzZXVkby1vcCAqLwotc3RhdGljIGludCBzaGlmdF9vayAoKTsJCS8qIFdpbGwgYSAnc2hsbycgc3Vic3RpdHVyZSBmb3IgYSAnbGRjb25zdCc/ICovCi1zdGF0aWMgdm9pZCBzeW50YXggKCk7CQkvKiBHaXZlIHN5bnRheCBlcnJvciAqLwotc3RhdGljIGludCB0YXJnX2hhc19zZnIgKCk7CS8qIFRhcmdldCBjaGlwIHN1cHBvcnRzIHNwZWMtZnVuYyByZWdpc3Rlcj8gKi8KLXN0YXRpYyBpbnQgdGFyZ19oYXNfaWNsYXNzICgpOwkvKiBUYXJnZXQgY2hpcCBzdXBwb3J0cyBpbnN0cnVjdGlvbiBzZXQ/ICovCi0KLS8qIFNlZSBtZF9wYXJzZV9vcHRpb24oKSBmb3IgbWVhbmluZ3Mgb2YgdGhlc2Ugb3B0aW9ucyAqLwotc3RhdGljIGNoYXIgbm9yZWxheDsJCS8qIFRydWUgaWYgLW5vcmVsYXggc3dpdGNoIHNlZW4gKi8KLXN0YXRpYyBjaGFyIGluc3RydW1lbnRfYnJhbmNoZXM7CS8qIFRydWUgaWYgLWIgc3dpdGNoIHNlZW4gKi8KLQotLyogQ2hhcmFjdGVycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuCi0gICBJZiB0aGUgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLgotICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0LgotCi0gICBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LgotICovCi0KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLwotCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1sxXTsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1sxXTsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwKLSAgIGFzIGluIDBmMTIuNDU2IG9yIDBkMS4yMzQ1ZTEyCi0gKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkZkRHRUIjsKLQotCi0vKiBUYWJsZSB1c2VkIGJ5IGJhc2UgYXNzZW1ibGVyIHRvIHJlbGF4IGFkZHJlc3NlcyBiYXNlZCBvbiB2YXJ5aW5nIGxlbmd0aAotICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGZpZWxkcyBhcmU6Ci0gICAgIDEpIG1vc3QgcG9zaXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgICA0KSB3aGljaCBpbmRleCBpbnRvIHRoZSB0YWJsZSB0byB0cnkgaWYgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBvbmUuCi0KLSAgIEZvciBpODA5NjAsIHRoZSBvbmx5IGFwcGxpY2F0aW9uIGlzIHRoZSAoZGUtKW9wdGltaXphdGlvbiBvZiBjb2JyCi0gICBpbnN0cnVjdGlvbnMgaW50byBzZXBhcmF0ZSBjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHdoZW4gYSAxMy1iaXQKLSAgIGRpc3BsYWNlbWVudCB3b24ndCBoYWNrIGl0LgotICovCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgezAsIDAsIDAsIDB9LAkJCS8qIFN0YXRlIDAgPT4gbm8gbW9yZSByZWxheGF0aW9uIHBvc3NpYmxlICovCi0gIHs0MDg4LCAtNDA5NiwgMCwgMn0sCQkvKiBTdGF0ZSAxOiBjb25kaXRpb25hbCBicmFuY2ggKGNvYnIpICovCi0gIHsweDgwMDAwMCAtIDgsIC0weDgwMDAwMCwgNCwgMH0sCS8qIFN0YXRlIDI6IGNvbXBhcmUgKHJlZykgJiBicmFuY2ggKGN0cmwpICovCi19OwotCi1zdGF0aWMgdm9pZCBzX2VuZGlhbiBQQVJBTVMgKChpbnQpKTsKLQotLyogVGhlc2UgYXJlIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwc2V1ZG8tb3BzLgotCi0gICBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgICAgICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgICAgICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgICAgICAgaW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAqLwotI2RlZmluZSBTX0xFQUZQUk9DCTEKLSNkZWZpbmUgU19TWVNQUk9DCTIKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJic3MiLCBzX2xjb21tLCAxfSwKLSAgeyJlbmRpYW4iLCBzX2VuZGlhbiwgMH0sCi0gIHsiZXh0ZW5kZWQiLCBmbG9hdF9jb25zLCAndCd9LAotICB7ImxlYWZwcm9jIiwgcGFyc2VfcG8sIFNfTEVBRlBST0N9LAotICB7InN5c3Byb2MiLCBwYXJzZV9wbywgU19TWVNQUk9DfSwKLQotICB7IndvcmQiLCBjb25zLCA0fSwKLSAgeyJxdWFkIiwgY29ucywgMTZ9LAotCi0gIHswLCAwLCAwfQotfTsKLQwKLS8qIE1hY3JvcyB0byBleHRyYWN0IGluZm8gZnJvbSBhbiAnZXhwcmVzc2lvblMnIHN0cnVjdHVyZSAnZScgKi8KLSNkZWZpbmUgYWRkcyhlKQllLlhfYWRkX3N5bWJvbAotI2RlZmluZSBvZmZzKGUpCWUuWF9hZGRfbnVtYmVyCi0KLQotLyogQnJhbmNoLXByZWRpY3Rpb24gYml0cyBmb3IgQ1RSTC9DT0JSIGZvcm1hdCBvcGNvZGVzICovCi0jZGVmaW5lIEJQX01BU0sJCTB4MDAwMDAwMDIJLyogTWFzayBmb3IgYnJhbmNoLXByZWRpY3Rpb24gYml0ICovCi0jZGVmaW5lIEJQX1RBS0VOCTB4MDAwMDAwMDAJLyogVmFsdWUgdG8gT1IgaW4gdG8gcHJlZGljdCBicmFuY2ggKi8KLSNkZWZpbmUgQlBfTk9UX1RBS0VOCTB4MDAwMDAwMDIJLyogVmFsdWUgdG8gT1IgaW4gdG8gcHJlZGljdCBubyBicmFuY2ggKi8KLQotCi0vKiBTb21lIGluc3RydWN0aW9uIG9wY29kZXMgdGhhdCB3ZSBuZWVkIGV4cGxpY2l0bHkgKi8KLSNkZWZpbmUgQkUJMHgxMjAwMDAwMAotI2RlZmluZSBCRwkweDExMDAwMDAwCi0jZGVmaW5lIEJHRQkweDEzMDAwMDAwCi0jZGVmaW5lIEJMCTB4MTQwMDAwMDAKLSNkZWZpbmUgQkxFCTB4MTYwMDAwMDAKLSNkZWZpbmUgQk5FCTB4MTUwMDAwMDAKLSNkZWZpbmUgQk5PCTB4MTAwMDAwMDAKLSNkZWZpbmUgQk8JMHgxNzAwMDAwMAotI2RlZmluZSBDSEtCSVQJMHg1YTAwMjcwMAotI2RlZmluZSBDTVBJCTB4NWEwMDIwODAKLSNkZWZpbmUgQ01QTwkweDVhMDAyMDAwCi0KLSNkZWZpbmUgQgkweDA4MDAwMDAwCi0jZGVmaW5lIEJBTAkweDBiMDAwMDAwCi0jZGVmaW5lIENBTEwJMHgwOTAwMDAwMAotI2RlZmluZSBDQUxMUwkweDY2MDAzODAwCi0jZGVmaW5lIFJFVAkweDBhMDAwMDAwCi0KLQotLyogVGhlc2UgbWFza3MgYXJlIHVzZWQgdG8gYnVpbGQgdXAgYSBzZXQgb2YgTUVNQiBtb2RlIGJpdHMuICovCi0jZGVmaW5lCUFfQklUCQkweDA0MDAKLSNkZWZpbmUJSV9CSVQJCTB4MDgwMAotI2RlZmluZSBNRU1CX0JJVAkweDEwMDAKLSNkZWZpbmUJRF9CSVQJCTB4MjAwMAotCi0KLS8qIE1hc2sgZm9yIHRoZSBvbmx5IG1vZGUgYml0IGluIGEgTUVNQSBpbnN0cnVjdGlvbiAoaWYgc2V0LCBhYmFzZSByZWcgaXMKLSAgIHVzZWQpLiAgKi8KLSNkZWZpbmUgTUVNQV9BQkFTRQkweDIwMDAKLQotLyogSW5mbyBmcm9tIHdoaWNoIGEgTUVNQSBvciBNRU1CIGZvcm1hdCBpbnN0cnVjdGlvbiBjYW4gYmUgZ2VuZXJhdGVkICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgLyogKEZpcnN0KSAzMiBiaXRzIG9mIGluc3RydWN0aW9uICovCi0gICAgbG9uZyBvcGNvZGU7Ci0gICAgLyogMC0obm9uZSksIDEyLSBvciwgMzItYml0IGRpc3BsYWNlbWVudCBuZWVkZWQgKi8KLSAgICBpbnQgZGlzcDsKLSAgICAvKiBUaGUgZXhwcmVzc2lvbiBpbiB0aGUgc291cmNlIGluc3RydWN0aW9uIGZyb20gd2hpY2ggdGhlCi0gICAgICAgZGlzcGxhY2VtZW50IHNob3VsZCBiZSBkZXRlcm1pbmVkLiAgKi8KLSAgICBjaGFyICplOwotICB9Ci0KLW1lbVM7Ci0KLQotLyogVGhlIHR3byBwaWVjZXMgb2YgaW5mbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVnaXN0ZXIgb3BlcmFuZCAqLwotc3RydWN0IHJlZ29wCi0gIHsKLSAgICBpbnQgbW9kZTsJCQkvKiAwID0+bG9jYWwvZ2xvYmFsL3NwZWMgcmVnOyAxPT4gbGl0ZXJhbCBvciBmcCByZWcgKi8KLSAgICBpbnQgc3BlY2lhbDsJCS8qIDAgPT5ub3QgYSBzZnI7ICAxPT4gaXMgYSBzZnIgKG5vdCB2YWxpZCB3L21vZGU9MCkgKi8KLSAgICBpbnQgbjsJCQkvKiBSZWdpc3RlciBudW1iZXIgb3IgbGl0ZXJhbCB2YWx1ZSAqLwotICB9OwotCi0KLS8qIE51bWJlciBhbmQgYXNzZW1ibGVyIG1uZW1vbmljIGZvciBhbGwgcmVnaXN0ZXJzIHRoYXQgY2FuIGFwcGVhciBpbgotICAgb3BlcmFuZHMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdAotICB7Ci0gICAgY2hhciAqcmVnX25hbWU7Ci0gICAgaW50IHJlZ19udW07Ci0gIH0KLXJlZ25hbWVzW10gPQotewotICB7ICJwZnAiLCAwIH0sCi0gIHsgInNwIiwgMSB9LAotICB7ICJyaXAiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJnMCIsIDE2IH0sCi0gIHsgImcxIiwgMTcgfSwKLSAgeyAiZzIiLCAxOCB9LAotICB7ICJnMyIsIDE5IH0sCi0gIHsgImc0IiwgMjAgfSwKLSAgeyAiZzUiLCAyMSB9LAotICB7ICJnNiIsIDIyIH0sCi0gIHsgImc3IiwgMjMgfSwKLSAgeyAiZzgiLCAyNCB9LAotICB7ICJnOSIsIDI1IH0sCi0gIHsgImcxMCIsIDI2IH0sCi0gIHsgImcxMSIsIDI3IH0sCi0gIHsgImcxMiIsIDI4IH0sCi0gIHsgImcxMyIsIDI5IH0sCi0gIHsgImcxNCIsIDMwIH0sCi0gIHsgImZwIiwgMzEgfSwKLQotICAvKiBOdW1iZXJzIGZvciBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVycyBhcmUgZm9yIGFzc2VtYmxlciBpbnRlcm5hbAotICAgICB1c2Ugb25seTogdGhleSBhcmUgc2NhbGVkIGJhY2sgdG8gcmFuZ2UgWzAtMzFdIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KLSNkZWZpbmUgU0YwCTMyCi0KLSAgeyAic2YwIiwgMzIgfSwKLSAgeyAic2YxIiwgMzMgfSwKLSAgeyAic2YyIiwgMzQgfSwKLSAgeyAic2YzIiwgMzUgfSwKLSAgeyAic2Y0IiwgMzYgfSwKLSAgeyAic2Y1IiwgMzcgfSwKLSAgeyAic2Y2IiwgMzggfSwKLSAgeyAic2Y3IiwgMzkgfSwKLSAgeyAic2Y4IiwgNDAgfSwKLSAgeyAic2Y5IiwgNDEgfSwKLSAgeyAic2YxMCIsIDQyIH0sCi0gIHsgInNmMTEiLCA0MyB9LAotICB7ICJzZjEyIiwgNDQgfSwKLSAgeyAic2YxMyIsIDQ1IH0sCi0gIHsgInNmMTQiLCA0NiB9LAotICB7ICJzZjE1IiwgNDcgfSwKLSAgeyAic2YxNiIsIDQ4IH0sCi0gIHsgInNmMTciLCA0OSB9LAotICB7ICJzZjE4IiwgNTAgfSwKLSAgeyAic2YxOSIsIDUxIH0sCi0gIHsgInNmMjAiLCA1MiB9LAotICB7ICJzZjIxIiwgNTMgfSwKLSAgeyAic2YyMiIsIDU0IH0sCi0gIHsgInNmMjMiLCA1NSB9LAotICB7ICJzZjI0IiwgNTYgfSwKLSAgeyAic2YyNSIsIDU3IH0sCi0gIHsgInNmMjYiLCA1OCB9LAotICB7ICJzZjI3IiwgNTkgfSwKLSAgeyAic2YyOCIsIDYwIH0sCi0gIHsgInNmMjkiLCA2MSB9LAotICB7ICJzZjMwIiwgNjIgfSwKLSAgeyAic2YzMSIsIDYzIH0sCi0KLSAgLyogTnVtYmVycyBmb3IgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFyZSBmb3IgYXNzZW1ibGVyIGludGVybmFsCi0gICAgIHVzZSBvbmx5OiB0aGV5IGFyZSBzY2FsZWQgYmFjayB0byBbMC0zXSBmb3IgYmluYXJ5IG91dHB1dC4gICovCi0jZGVmaW5lIEZQMAk2NAotCi0gIHsgImZwMCIsIDY0IH0sCi0gIHsgImZwMSIsIDY1IH0sCi0gIHsgImZwMiIsIDY2IH0sCi0gIHsgImZwMyIsIDY3IH0sCi0KLSAgeyBOVUxMLCAwIH0sCQkJCS8qIEVORCBPRiBMSVNUICovCi19OwotCi0jZGVmaW5lCUlTX1JHX1JFRyhuKQkoKDAgPD0gKG4pKSAmJiAoKG4pIDwgU0YwKSkKLSNkZWZpbmUJSVNfU0ZfUkVHKG4pCSgoU0YwIDw9IChuKSkgJiYgKChuKSA8IEZQMCkpCi0jZGVmaW5lCUlTX0ZQX1JFRyhuKQkoKG4pID49IEZQMCkKLQotLyogTnVtYmVyIGFuZCBhc3NlbWJsZXIgbW5lbW9uaWMgZm9yIGFsbCByZWdpc3RlcnMgdGhhdCBjYW4gYXBwZWFyIGFzCi0gICAnYWJhc2UnIChpbmRpcmVjdCBhZGRyZXNzaW5nKSByZWdpc3RlcnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdAotICB7Ci0gICAgY2hhciAqYXJlZ19uYW1lOwotICAgIGludCBhcmVnX251bTsKLSAgfQotYXJlZ3NbXSA9Ci17Ci0gIHsgIihwZnApIiwgMCB9LAotICB7ICIoc3ApIiwgMSB9LAotICB7ICIocmlwKSIsIDIgfSwKLSAgeyAiKHIzKSIsIDMgfSwKLSAgeyAiKHI0KSIsIDQgfSwKLSAgeyAiKHI1KSIsIDUgfSwKLSAgeyAiKHI2KSIsIDYgfSwKLSAgeyAiKHI3KSIsIDcgfSwKLSAgeyAiKHI4KSIsIDggfSwKLSAgeyAiKHI5KSIsIDkgfSwKLSAgeyAiKHIxMCkiLCAxMCB9LAotICB7ICIocjExKSIsIDExIH0sCi0gIHsgIihyMTIpIiwgMTIgfSwKLSAgeyAiKHIxMykiLCAxMyB9LAotICB7ICIocjE0KSIsIDE0IH0sCi0gIHsgIihyMTUpIiwgMTUgfSwKLSAgeyAiKGcwKSIsIDE2IH0sCi0gIHsgIihnMSkiLCAxNyB9LAotICB7ICIoZzIpIiwgMTggfSwKLSAgeyAiKGczKSIsIDE5IH0sCi0gIHsgIihnNCkiLCAyMCB9LAotICB7ICIoZzUpIiwgMjEgfSwKLSAgeyAiKGc2KSIsIDIyIH0sCi0gIHsgIihnNykiLCAyMyB9LAotICB7ICIoZzgpIiwgMjQgfSwKLSAgeyAiKGc5KSIsIDI1IH0sCi0gIHsgIihnMTApIiwgMjYgfSwKLSAgeyAiKGcxMSkiLCAyNyB9LAotICB7ICIoZzEyKSIsIDI4IH0sCi0gIHsgIihnMTMpIiwgMjkgfSwKLSAgeyAiKGcxNCkiLCAzMCB9LAotICB7ICIoZnApIiwgMzEgfSwKLQotI2RlZmluZSBJUFJFTAkzMgotICAvKiBGb3IgYXNzZW1ibGVyIGludGVybmFsIHVzZSBvbmx5OiB0aGlzIG51bWJlciBuZXZlciBhcHBlYXJzIGluIGJpbmFyeQotICAgICBvdXRwdXQuICAqLwotICB7ICIoaXApIiwgSVBSRUwgfSwKLQotICB7IE5VTEwsIDAgfSwJCQkJLyogRU5EIE9GIExJU1QgKi8KLX07Ci0KLQotLyogSGFzaCB0YWJsZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcmVnX2hhc2g7CS8qIFJlZ2lzdGVyIG5hbWUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFyZWdfaGFzaDsJLyogQWJhc2UgcmVnaXN0ZXIgaGFzaCB0YWJsZSAqLwotCi0KLS8qIEFyY2hpdGVjdHVyZSBmb3Igd2hpY2ggd2UgYXJlIGFzc2VtYmxpbmcgKi8KLSNkZWZpbmUgQVJDSF9BTlkJMAkvKiBEZWZhdWx0OiBubyBhcmNoaXRlY3R1cmUgY2hlY2tpbmcgZG9uZSAqLwotI2RlZmluZSBBUkNIX0tBCQkxCi0jZGVmaW5lIEFSQ0hfS0IJCTIKLSNkZWZpbmUgQVJDSF9NQwkJMwotI2RlZmluZSBBUkNIX0NBCQk0Ci0jZGVmaW5lIEFSQ0hfSlgJCTUKLSNkZWZpbmUgQVJDSF9IWAkJNgotaW50IGFyY2hpdGVjdHVyZSA9IEFSQ0hfQU5ZOwkvKiBBcmNoaXRlY3R1cmUgcmVxdWVzdGVkIG9uIGludm9jYXRpb24gbGluZSAqLwotaW50IGljbGFzc2VzX3NlZW47CQkvKiBPUiBvZiBpbnN0cnVjdGlvbiBjbGFzc2VzIChJXyogY29uc3RhbnRzKQotCQkJCSAqICAgIGZvciB3aGljaCB3ZSd2ZSBhY3R1YWxseSBhc3NlbWJsZWQKLQkJCQkgKiAgICAgIGluc3RydWN0aW9ucy4KLQkJCQkgKi8KLQotCi0vKiBCUkFOQ0gtUFJFRElDVElPTiBJTlNUUlVNRU5UQVRJT04KLQotICAgICAgICBUaGUgZm9sbG93aW5nIHN1cHBvcnRzIGdlbmVyYXRpb24gb2YgYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uCi0gICAgICAgICh0dXJuZWQgb24gYnkgLWIgc3dpdGNoKS4gIFRoZSBpbnN0cnVtZW50YXRpb24gY29sbGVjdHMgY291bnRzCi0gICAgICAgIG9mIGJyYW5jaGVzIHRha2VuL25vdC10YWtlbiBmb3IgbGF0ZXIgaW5wdXQgdG8gYSB1dGlsaXR5IHRoYXQgd2lsbAotICAgICAgICBzZXQgdGhlIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgb2YgdGhlIGluc3RydWN0aW9ucyBpbiBhY2NvcmRhbmNlIHdpdGgKLSAgICAgICAgdGhlIGJlaGF2aW9yIG9ic2VydmVkLiAgKE5vdGUgdGhhdCB0aGUgS1ggc2VyaWVzIGRvZXMgbm90IGhhdmUKLSAgICAgICAgYnJhY2gtcHJlZGljdGlvbi4pCi0KLSAgICAgICAgVGhlIGluc3RydW1lbnRhdGlvbiBjb25zaXN0cyBvZjoKLQotICAgICAgICAoMSkgYmVmb3JlIGFuZCBhZnRlciBlYWNoIGNvbmRpdGlvbmFsIGJyYW5jaCwgYSBjYWxsIHRvIGFuIGV4dGVybmFsCi0gICAgICAgICAgICByb3V0aW5lIHRoYXQgaW5jcmVtZW50cyBhbmQgc3RlcHMgb3ZlciBhbiBpbmxpbmUgY291bnRlci4gIFRoZQotICAgICAgICAgICAgY291bnRlciBpdHNlbGYsIGluaXRpYWxpemVkIHRvIDAsIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGNhbGwKLSAgICAgICAgICAgIGluc3RydWN0aW9uLiAgRm9yIGVhY2ggYnJhbmNoLCB0aGUgY291bnRlciBmb2xsb3dpbmcgdGhlIGJyYW5jaAotICAgICAgICAgICAgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYnJhbmNoIHdhcyBub3QgdGFrZW4sIGFuZCB0aGUgZGlmZmVyZW5jZQotICAgICAgICAgICAgYmV0d2VlbiB0aGUgY291bnRlcnMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgdGFrZW4uICBBbgotICAgICAgICAgICAgZXhhbXBsZSBvZiBhbiBpbnN0cnVtZW50ZWQgY29uZGl0aW9uYWwgYnJhbmNoOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgICAgQlJfQ05UX0ZVTkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndvcmQgICAwCi0gICAgICAgICAgICAgICAgTEJSQU5DSDIzOiAgICAgIGJlICAgICAgbGFiZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCAgICBCUl9DTlRfRlVOQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud29yZCAgIDAKLQotICAgICAgICAoMikgYSB0YWJsZSBvZiBwb2ludGVycyB0byB0aGUgaW5zdHJ1bWVudGVkIGJyYW5jaGVzLCBzbyB0aGF0IGFuCi0gICAgICAgICAgICBleHRlcm5hbCBwb3N0cHJvY2Vzc2luZyByb3V0aW5lIGNhbiBsb2NhdGUgYWxsIG9mIHRoZSBjb3VudGVycy4KLSAgICAgICAgICAgIHRoZSB0YWJsZSBiZWdpbnMgd2l0aCBhIDItd29yZCBoZWFkZXI6IGEgcG9pbnRlciB0byB0aGUgbmV4dCBpbgotICAgICAgICAgICAgYSBsaW5rZWQgbGlzdCBvZiBzdWNoIHRhYmxlcyAoaW5pdGlhbGl6ZWQgdG8gMCk7ICBhbmQgYSBjb3VudAotICAgICAgICAgICAgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZSAoZXhjbHVzaXZlIG9mIHRoZSBoZWFkZXIuCi0KLSAgICAgICAgICAgIE5vdGUgdGhhdCBpbnB1dCBzb3VyY2UgY29kZSBpcyBleHBlY3RlZCB0byBhbHJlYWR5IGNvbnRhaW4gY2FsbHMKLSAgICAgICAgICAgIGFuIGV4dGVybmFsIHJvdXRpbmUgdGhhdCB3aWxsIGxpbmsgdGhlIGJyYW5jaCBsb2NhbCB0YWJsZSBpbnRvIGEKLSAgICAgICAgICAgIGxpc3Qgb2Ygc3VjaCB0YWJsZXMuCi0gKi8KLQotLyogTnVtYmVyIG9mIGJyYW5jaGVzIGluc3RydW1lbnRlZCBzbyBmYXIuICBBbHNvIHVzZWQgdG8gZ2VuZXJhdGUKLSAgIHVuaXF1ZSBsb2NhbCBsYWJlbHMgZm9yIGVhY2ggaW5zdHJ1bWVudGVkIGJyYW5jaC4gICovCi1zdGF0aWMgaW50IGJyX2NudDsKLQotI2RlZmluZSBCUl9MQUJFTF9CQVNFCSJMQlJBTkNIIgotLyogQmFzZW5hbWUgb2YgbG9jYWwgbGFiZWxzIG9uIGluc3RydW1lbnRlZCBicmFuY2hlcywgdG8gYXZvaWQKLSAgIGNvbmZsaWN0IHdpdGggY29tcGlsZXItIGdlbmVyYXRlZCBsb2NhbCBsYWJlbHMuICAqLwotCi0jZGVmaW5lIEJSX0NOVF9GVU5DCSJfX2luY19icmFuY2giCi0vKiBOYW1lIG9mIHRoZSBleHRlcm5hbCByb3V0aW5lIHRoYXQgd2lsbCBpbmNyZW1lbnQgKGFuZCBzdGVwIG92ZXIpIGFuCi0gICBpbmxpbmUgY291bnRlci4gICovCi0KLSNkZWZpbmUgQlJfVEFCX05BTUUJIl9fQlJBTkNIX1RBQkxFX18iCi0vKiBOYW1lIG9mIHRoZSB0YWJsZSBvZiBwb2ludGVycyB0byBicmFuY2hlcy4gIEEgbG9jYWwgKGkuZS4sCi0gICBub24tZXh0ZXJuYWwpIHN5bWJvbC4gICovCi0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2JlZ2luOiAgT25lLXRpbWUgaW5pdGlhbGl6YXRpb24uCi0KLSAgCVNldCB1cCBoYXNoIHRhYmxlcy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGludCBpOwkJCS8qIExvb3AgY291bnRlciAqLwotICBjb25zdCBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwkvKiBQb2ludGVyIGludG8gb3Bjb2RlIHRhYmxlICovCi0gIGNvbnN0IGNoYXIgKnJldHZhbDsJCS8qIFZhbHVlIHJldHVybmVkIGJ5IGhhc2ggZnVuY3Rpb25zICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotICByZWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotICBhcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBiYXNlIGFzc2VtYmxlciB1c2VzIGFuIGVtcHR5IHN0cmluZyBmb3IgIm5vCi0gICAgIGVycm9yIG1lc3NhZ2UiLCBpbnN0ZWFkIG9mIGEgTlVMTCBwb2ludGVyLiAgKi8KLSAgcmV0dmFsID0gMDsKLQotICBmb3IgKG9QID0gaTk2MF9vcGNvZGVzOyBvUC0+bmFtZSAmJiAhcmV0dmFsOyBvUCsrKQotICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBvUC0+bmFtZSwgKFBUUikgb1ApOwotCi0gIGZvciAoaSA9IDA7IHJlZ25hbWVzW2ldLnJlZ19uYW1lICYmICFyZXR2YWw7IGkrKykKLSAgICByZXR2YWwgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIHJlZ25hbWVzW2ldLnJlZ19uYW1lLAotCQkJICAoY2hhciAqKSAmcmVnbmFtZXNbaV0ucmVnX251bSk7Ci0KLSAgZm9yIChpID0gMDsgYXJlZ3NbaV0uYXJlZ19uYW1lICYmICFyZXR2YWw7IGkrKykKLSAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoYXJlZ19oYXNoLCBhcmVnc1tpXS5hcmVnX25hbWUsCi0JCQkgIChjaGFyICopICZhcmVnc1tpXS5hcmVnX251bSk7Ci0KLSAgaWYgKHJldHZhbCkKLSAgICBhc19mYXRhbCAoXygiSGFzaGluZyByZXR1cm5lZCBcIiVzXCIuIiksIHJldHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfYXNzZW1ibGU6ICBBc3NlbWJsZSBhbiBpbnN0cnVjdGlvbgotCi0gICBBc3N1bXB0aW9ucyBhYm91dCB0aGUgcGFzc2VkLWluIHRleHQ6Ci0gIAktIGFsbCBjb21tZW50cywgbGFiZWxzIHJlbW92ZWQKLSAgCS0gdGV4dCBpcyBhbiBpbnN0cnVjdGlvbgotICAJLSBhbGwgd2hpdGUgc3BhY2UgY29tcHJlc3NlZCB0byBzaW5nbGUgYmxhbmtzCi0gIAktIGFsbCBjaGFyYWN0ZXIgY29uc3RhbnRzIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGRlY2ltYWwKLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX2Fzc2VtYmxlICh0ZXh0UCkKLSAgICAgY2hhciAqdGV4dFA7CQkvKiBTb3VyY2UgdGV4dCBvZiBpbnN0cnVjdGlvbiAqLwotewotICAvKiBQYXJzZWQgaW5zdHJ1Y3Rpb24gdGV4dCwgY29udGFpbmluZyBOTyB3aGl0ZXNwYWNlOiBhcmdbMF0tPm9wY29kZQotICAgICBtbmVtb25pYyBhcmdbMS0zXS0+b3BlcmFuZHMsIHdpdGggY2hhciBjb25zdGFudHMgcmVwbGFjZWQgYnkKLSAgICAgZGVjaW1hbCBudW1iZXJzLiAgKi8KLSAgY2hhciAqYXJnc1s0XTsKLQotICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIGluc3RydWN0aW9uIG9wZXJhbmRzICovCi0gIC8qIFBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24gZGVzY3JpcHRpb24gKi8KLSAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsKLSAgLyogVFJVRSBpZmYgb3Bjb2RlIG1uZW1vbmljIGluY2x1ZGVkIGJyYW5jaC1wcmVkaWN0aW9uIHN1ZmZpeCAoIi5mIgotICAgICBvciAiLnQiKS4gICovCi0gIGludCBicmFuY2hfcHJlZGljdDsKLSAgLyogU2V0dGluZyBvZiBicmFuY2gtcHJlZGljdGlvbiBiaXQocykgdG8gYmUgT1InZCBpbnRvIGluc3RydWN0aW9uCi0gICAgIG9wY29kZSBvZiBDVFJML0NPQlIgZm9ybWF0IGluc3RydWN0aW9ucy4gICovCi0gIGxvbmcgYnBfYml0czsKLQotICBpbnQgbjsJCQkvKiBPZmZzZXQgb2YgbGFzdCBjaGFyYWN0ZXIgaW4gb3Bjb2RlIG1uZW1vbmljICovCi0KLSAgY29uc3QgY2hhciAqYnBfZXJyb3JfbXNnID0gXygiYnJhbmNoIHByZWRpY3Rpb24gaW52YWxpZCBvbiB0aGlzIG9wY29kZSIpOwotCi0KLSAgLyogUGFyc2UgaW5zdHJ1Y3Rpb24gaW50byBvcGNvZGUgYW5kIG9wZXJhbmRzICovCi0gIG1lbXNldCAoYXJncywgJ1wwJywgc2l6ZW9mIChhcmdzKSk7Ci0gIG5fb3BzID0gaV9zY2FuICh0ZXh0UCwgYXJncyk7Ci0gIGlmIChuX29wcyA9PSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm47CQkJLyogRXJyb3IgbWVzc2FnZSBhbHJlYWR5IGlzc3VlZCAqLwotICAgIH0KLQotICAvKiBEbyAibWFjcm8gc3Vic3RpdHV0aW9uIiAoc29ydCBvZikgb24gJ2xkY29uc3QnIHBzZXVkby1pbnN0cnVjdGlvbiAqLwotICBpZiAoIXN0cmNtcCAoYXJnc1swXSwgImxkY29uc3QiKSkKLSAgICB7Ci0gICAgICBuX29wcyA9IHBhcnNlX2xkY29uc3QgKGFyZ3MpOwotICAgICAgaWYgKG5fb3BzID09IC0xKQotCXsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0KLQotICAvKiBDaGVjayBmb3IgYnJhbmNoLXByZWRpY3Rpb24gc3VmZml4IG9uIG9wY29kZSBtbmVtb25pYywgc3RyaXAgaXQgb2ZmICovCi0gIG4gPSBzdHJsZW4gKGFyZ3NbMF0pIC0gMTsKLSAgYnJhbmNoX3ByZWRpY3QgPSAwOwotICBicF9iaXRzID0gMDsKLSAgaWYgKGFyZ3NbMF1bbiAtIDFdID09ICcuJyAmJiAoYXJnc1swXVtuXSA9PSAndCcgfHwgYXJnc1swXVtuXSA9PSAnZicpKQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCi0JIHN1cHBvcnRzIGJyYW5jaCBwcmVkaWN0aW9uLCBidXQgd2h5IGJvdGhlcj8gIFRoZSBiaXQgd2lsbAotCSBqdXN0IGJlIGlnbm9yZWQgYnkgcHJvY2Vzc29ycyB0aGF0IGRvbid0IHVzZSBpdC4gICovCi0gICAgICBicmFuY2hfcHJlZGljdCA9IDE7Ci0gICAgICBicF9iaXRzID0gKGFyZ3NbMF1bbl0gPT0gJ3QnKSA/IEJQX1RBS0VOIDogQlBfTk9UX1RBS0VOOwotICAgICAgYXJnc1swXVtuIC0gMV0gPSAnXDAnOwkvKiBTdHJpcCBzdWZmaXggZnJvbSBvcGNvZGUgbW5lbW9uaWMgKi8KLSAgICB9Ci0KLSAgLyogTG9vayB1cCBvcGNvZGUgbW5lbW9uaWMgaW4gdGFibGUgYW5kIGNoZWNrIG51bWJlciBvZiBvcGVyYW5kcy4KLSAgICAgQ2hlY2sgdGhhdCBvcGNvZGUgaXMgbGVnYWwgZm9yIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAgSWYgYWxsCi0gICAgIGxvb2tzIGdvb2QsIGFzc2VtYmxlIGluc3RydWN0aW9uLiAgKi8KLSAgb1AgPSAoc3RydWN0IGk5NjBfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgYXJnc1swXSk7Ci0gIGlmICghb1AgfHwgIXRhcmdfaGFzX2ljbGFzcyAob1AtPmljbGFzcykpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIG9wY29kZSwgXCIlc1wiLiIpLCBhcmdzWzBdKTsKLQotICAgIH0KLSAgZWxzZSBpZiAobl9vcHMgIT0gb1AtPm51bV9vcHMpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbXByb3BlciBudW1iZXIgb2Ygb3BlcmFuZHMuICBleHBlY3RpbmcgJWQsIGdvdCAlZCIpLAotCSAgICAgIG9QLT5udW1fb3BzLCBuX29wcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChvUC0+Zm9ybWF0KQotCXsKLQljYXNlIEZCUkE6Ci0JY2FzZSBDVFJMOgotCSAgY3RybF9mbXQgKGFyZ3NbMV0sIG9QLT5vcGNvZGUgfCBicF9iaXRzLCBvUC0+bnVtX29wcyk7Ci0JICBpZiAob1AtPmZvcm1hdCA9PSBGQlJBKQotCSAgICB7Ci0JICAgICAgLyogTm93IGdlbmVyYXRlIGEgJ2JubycgdG8gc2FtZSBhcmcgKi8KLQkgICAgICBjdHJsX2ZtdCAoYXJnc1sxXSwgQk5PIHwgYnBfYml0cywgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ09CUjoKLQljYXNlIENPSjoKLQkgIGNvYnJfZm10IChhcmdzLCBvUC0+b3Bjb2RlIHwgYnBfYml0cywgb1ApOwotCSAgYnJlYWs7Ci0JY2FzZSBSRUc6Ci0JICBpZiAoYnJhbmNoX3ByZWRpY3QpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChicF9lcnJvcl9tc2cpOwotCSAgICB9Ci0JICByZWdfZm10IChhcmdzLCBvUCk7Ci0JICBicmVhazsKLQljYXNlIE1FTTE6Ci0JICBpZiAoYXJnc1swXVswXSA9PSAnYycgJiYgYXJnc1swXVsxXSA9PSAnYScpCi0JICAgIHsKLQkgICAgICBpZiAoYnJhbmNoX3ByZWRpY3QpCi0JCXsKLQkJICBhc193YXJuIChicF9lcnJvcl9tc2cpOwotCQl9Ci0JICAgICAgbWVtX2ZtdCAoYXJncywgb1AsIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JY2FzZSBNRU0yOgotCWNhc2UgTUVNNDoKLQljYXNlIE1FTTg6Ci0JY2FzZSBNRU0xMjoKLQljYXNlIE1FTTE2OgotCSAgaWYgKGJyYW5jaF9wcmVkaWN0KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKLQkgICAgfQotCSAgbWVtX2ZtdCAoYXJncywgb1AsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBDQUxMSjoKLQkgIGlmIChicmFuY2hfcHJlZGljdCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7Ci0JICAgIH0KLQkgIC8qIE91dHB1dCBvcGNvZGUgJiBzZXQgdXAgImZpeHVwIiAocmVsb2NhdGlvbik7IGZsYWcKLQkgICAgIHJlbG9jYXRpb24gYXMgJ2NhbGxqJyB0eXBlLiAgKi8KLQkgIGtub3cgKG9QLT5udW1fb3BzID09IDEpOwotCSAgZ2V0X2NkaXNwIChhcmdzWzFdLCAiQ1RSTCIsIG9QLT5vcGNvZGUsIDI0LCAwLCAxKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAob1AtPmZvcm1hdCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQkJCQkvKiBtZF9hc3NlbWJsZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfbnVtYmVyX3RvX2NoYXJzOiAgY29udmVydCBhIG51bWJlciB0byB0YXJnZXQgYnl0ZSBvcmRlcgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsdWUsIG4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2NoYXJzX3RvX251bWJlcjogIGNvbnZlcnQgZnJvbSB0YXJnZXQgYnl0ZSBvcmRlciB0byBob3N0IGJ5dGUgb3JkZXIuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1pbnQKLW1kX2NoYXJzX3RvX251bWJlciAodmFsLCBuKQotICAgICB1bnNpZ25lZCBjaGFyICp2YWw7CS8qIFZhbHVlIGluIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgIGludCBuOwkJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgaW5wdXQgKi8KLXsKLSAgaW50IHJldHZhbDsKLQotICBmb3IgKHJldHZhbCA9IDA7IG4tLTspCi0gICAgewotICAgICAgcmV0dmFsIDw8PSA4OwotICAgICAgcmV0dmFsIHw9IHZhbFtuXTsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUwk2Ci0jZGVmaW5lIExOVU1fU0laRQlzaXplb2YoTElUVExFTlVNX1RZUEUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfYXRvZjoJY29udmVydCBhc2NpaSB0byBmbG9hdGluZyBwb2ludAotCi0gICBUdXJuIGEgc3RyaW5nIGF0IGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgJ3R5cGUnLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGF0ICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHJldHVybmVkIGF0ICdzaXplUCcuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBhIHBvaW50ZXIKLSAgIHRvIGFuIGVtcHR5IG1lc3NhZ2UgaWYgT0suCi0KLSAgIE5vdGUgd2UgY2FsbCB0aGUgaTM4NiBmbG9hdGluZyBwb2ludCByb3V0aW5lLCByYXRoZXIgdGhhbiBjb21wbGljYXRpbmcKLSAgIHRoaW5ncyB3aXRoIG1vcmUgZmlsZXMgb3Igc3ltYm9saWMgbGlua3MuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGludCBwcmVjOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICBjYXNlICdUJzoKLSAgICAgIHByZWMgPSA1OwotICAgICAgdHlwZSA9ICd4JzsJCS8qIFRoYXQncyB3aGF0IGF0b2ZfaWVlZSgpIHVuZGVyc3RhbmRzICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgICB9Ci0KLSAgKnNpemVQID0gcHJlYyAqIExOVU1fU0laRTsKLQotICAvKiBPdXRwdXQgdGhlIExJVFRMRU5VTXMgaW4gUkVWRVJTRSBvcmRlciBpbiBhY2NvcmQgd2l0aCBpODA5NjAKLSAgICAgd29yZC1vcmRlci4gIChEdW5ubyB3aHkgYXRvZl9pZWVlIGRvZXNuJ3QgZG8gaXQgaW4gdGhlIHJpZ2h0Ci0gICAgIG9yZGVyIGluIHRoZSBmaXJzdCBwbGFjZSAtLSBwcm9iYWJseSBiZWNhdXNlIGl0J3MgYSBoYWNrIG9mCi0gICAgIGF0b2ZfbTY4ay4pICAqLwotCi0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWMgLSAxOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFAtLSksIExOVU1fU0laRSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX251bWJlcl90b19pbW0KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9udW1iZXJfdG9fZGlzcAotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfbnVtYmVyX3RvX2ZpZWxkOgotCi0gIAlTdGljayBhIHZhbHVlIChhbiBhZGRyZXNzIGZpeHVwKSBpbnRvIGEgYml0IGZpZWxkIG9mCi0gIAlwcmV2aW91c2x5LWdlbmVyYXRlZCBpbnN0cnVjdGlvbi4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX251bWJlcl90b19maWVsZCAoaW5zdHJQLCB2YWwsIGJmaXhQKQotICAgICBjaGFyICppbnN0clA7CQkvKiBQb2ludGVyIHRvIGluc3RydWN0aW9uIHRvIGJlIGZpeGVkICovCi0gICAgIGxvbmcgdmFsOwkJCS8qIEFkZHJlc3MgZml4dXAgdmFsdWUgKi8KLSAgICAgYml0X2ZpeFMgKmJmaXhQOwkJLyogRGVzY3JpcHRpb24gb2YgYml0IGZpZWxkIHRvIGJlIGZpeGVkIHVwICovCi17Ci0gIGludCBudW1iaXRzOwkJCS8qIExlbmd0aCBvZiBiaXQgZmllbGQgdG8gYmUgZml4ZWQgKi8KLSAgbG9uZyBpbnN0cjsJCQkvKiAzMi1iaXQgaW5zdHJ1Y3Rpb24gdG8gYmUgZml4ZWQtdXAgKi8KLSAgbG9uZyBzaWduOwkJCS8qIDAgb3IgLTEsIGFjY29yZGluZyB0byBzaWduIGJpdCBvZiAndmFsJyAqLwotCi0gIC8qIENvbnZlcnQgaW5zdHJ1Y3Rpb24gYmFjayB0byBob3N0IGJ5dGUgb3JkZXIuICAqLwotICBpbnN0ciA9IG1kX2NoYXJzX3RvX251bWJlciAoaW5zdHJQLCA0KTsKLQotICAvKiBTdXJwcmlzZSEgLS0gd2Ugc3RvcmVkIHRoZSBudW1iZXIgb2YgYml0cyB0byBiZSBtb2RpZmllZCByYXRoZXIKLSAgICAgdGhhbiBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUuICAqLwotICBudW1iaXRzID0gKGludCkgYmZpeFA7Ci0gIGlmIChudW1iaXRzID09IDEpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIG5vLW9wLCBzdHVjayBoZXJlIGJ5IHJlbG9jX2NhbGxqKCkgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAga25vdyAoKG51bWJpdHMgPT0gMTMpIHx8IChudW1iaXRzID09IDI0KSk7Ci0KLSAgLyogUHJvcGFnYXRlIHNpZ24gYml0IG9mICd2YWwnIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuICBSZXN1bHQKLSAgICAgc2hvdWxkIGJlIGFsbCAwIG9yIGFsbCAxLiAgKi8KLSAgc2lnbiA9IHZhbCA+PiAoKGludCkgbnVtYml0cyAtIDEpOwotICBpZiAoKCh2YWwgPCAwKSAmJiAoc2lnbiAhPSAtMSkpCi0gICAgICB8fCAoKHZhbCA+IDApICYmIChzaWduICE9IDApKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkZpeHVwIG9mICVsZCB0b28gbGFyZ2UgZm9yIGZpZWxkIHdpZHRoIG9mICVkIiksCi0JICAgICAgdmFsLCBudW1iaXRzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQdXQgYml0IGZpZWxkIGludG8gaW5zdHJ1Y3Rpb24gYW5kIHdyaXRlIGJhY2sgaW4gdGFyZ2V0Ci0gICAgICAgICAqIGJ5dGUgb3JkZXIuCi0gICAgICAgKi8KLSAgICAgIHZhbCAmPSB+KC0xIDw8IChpbnQpIG51bWJpdHMpOwkvKiBDbGVhciB1bnVzZWQgc2lnbiBiaXRzICovCi0gICAgICBpbnN0ciB8PSB2YWw7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGluc3RyUCwgaW5zdHIsIDQpOwotICAgIH0KLX0JCQkJLyogbWRfbnVtYmVyX3RvX2ZpZWxkKCkgKi8KLQwKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9wYXJzZV9vcHRpb24KLSAgCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gIAlTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBGb3IgdGhlIDk2MCwgdGhlc2UgYXJlOgotCi0gIAktbm9yZWxheDoKLSAgCQlDb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSBkaXNwbGFjZW1lbnRzCi0gIAkJZ3JlYXRlciB0aGFuIDEzIGJpdHMgKG9yIHRoYXQgaGF2ZSBleHRlcm5hbCB0YXJnZXRzKSBzaG91bGQKLSAgCQlnZW5lcmF0ZSBlcnJvcnMuICBUaGUgZGVmYXVsdCBpcyB0byByZXBsYWNlIGVhY2ggc3VjaAotICAJCWluc3RydWN0aW9uIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSAob3IgY2hrYml0KSBhbmQKLSAgCQlicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgTm90ZSB0aGF0IHRoZSBJbnRlbCAiaiIgY29iciBkaXJlY3RpdmVzCi0gIAkJYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpbiB0aGlzIHdheSB3aGVuIG5lY2Vzc2FyeSwKLSAgCQlyZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoaXMgb3B0aW9uLgotCi0gIAktYjoKLSAgCQlBZGQgY29kZSB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGJyYW5jaGVzIHRha2VuLCBmb3IKLSAgCQlsYXRlciBvcHRpbWl6YXRpb24gb2YgYnJhbmNoIHByZWRpY3Rpb24gYml0cyBieSBhIHNlcGFyYXRlCi0gIAkJdG9vbC4gIENPQlIgYW5kIENOVEwgZm9ybWF0IGluc3RydWN0aW9ucyBoYXZlIGJyYW5jaAotICAJCXByZWRpY3Rpb24gYml0cyAoaW4gdGhlIENYIGFyY2hpdGVjdHVyZSk7ICBpZiAiQlIiIHJlcHJlc2VudHMKLSAgCQlhbiBpbnN0cnVjdGlvbiBpbiBvbmUgb2YgdGhlc2UgY2xhc3NlcywgdGhlIGZvbGxvd2luZyByZXAtCi0gIAkJcmVzZW50cyB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlcjoKLQotICAJCQljYWxsCTxpbmNyZW1lbnQgcm91dGluZT4KLSAgCQkJLndvcmQJMAkjIHByZS1jb3VudGVyCi0gIAkJTGFiZWw6ICBCUgotICAJCQljYWxsCTxpbmNyZW1lbnQgcm91dGluZT4KLSAgCQkJLndvcmQJMAkjIHBvc3QtY291bnRlcgotCi0gIAkJQSB0YWJsZSBvZiBhbGwgc3VjaCAiTGFiZWxzIiBpcyBhbHNvIGdlbmVyYXRlZC4KLQotCi0gIAktQUtBLCAtQUtCLCAtQUtDLCAtQVNBLCAtQVNCLCAtQU1DLCAtQUNBOgotICAJCVNlbGVjdCB0aGUgODA5NjAgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdAotICAJCXN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsIGVycm9ycy4KLSAgCQlUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBhbnkgaW5zdHJ1Y3Rpb24gb3IgZmVhdHVyZQotICAJCXRoYXQgaXMgc3VwcG9ydGVkIGJ5IFNPTUUgdmVyc2lvbiBvZiB0aGUgOTYwIChldmVuIGlmIHRoaXMKLSAgCQltZWFucyBtaXhpbmcgYXJjaGl0ZWN0dXJlcyEpLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOmIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSNkZWZpbmUgT1BUSU9OX0xJTktSRUxBWCAoT1BUSU9OX01EX0JBU0UpCi0gIHsibGlua3JlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSU5LUkVMQVh9LAotICB7ImxpbmstcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJTktSRUxBWH0sCi0jZGVmaW5lIE9QVElPTl9OT1JFTEFYIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsibm9yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9SRUxBWH0sCi0gIHsibm8tcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PUkVMQVh9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotc3RydWN0IHRhYmVudHJ5Ci0gIHsKLSAgICBjaGFyICpmbGFnOwotICAgIGludCBhcmNoOwotICB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCB0YWJlbnRyeSBhcmNoX3RhYltdID0KLXsKLSAgeyJLQSIsIEFSQ0hfS0F9LAotICB7IktCIiwgQVJDSF9LQn0sCi0gIHsiU0EiLCBBUkNIX0tBfSwJCS8qIFN5bm9ueW0gZm9yIEtBICovCi0gIHsiU0IiLCBBUkNIX0tCfSwJCS8qIFN5bm9ueW0gZm9yIEtCICovCi0gIHsiS0MiLCBBUkNIX01DfSwJCS8qIFN5bm9ueW0gZm9yIE1DICovCi0gIHsiTUMiLCBBUkNIX01DfSwKLSAgeyJDQSIsIEFSQ0hfQ0F9LAotICB7IkpYIiwgQVJDSF9KWH0sCi0gIHsiSFgiLCBBUkNIX0hYfSwKLSAge05VTEwsIDB9Ci19OwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX0xJTktSRUxBWDoKLSAgICAgIGxpbmtyZWxheCA9IDE7Ci0gICAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9SRUxBWDoKLSAgICAgIG5vcmVsYXggPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICAgIGluc3RydW1lbnRfYnJhbmNoZXMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdBJzoKLSAgICAgIHsKLQljb25zdCBzdHJ1Y3QgdGFiZW50cnkgKnRwOwotCWNoYXIgKnAgPSBhcmc7Ci0KLQlmb3IgKHRwID0gYXJjaF90YWI7IHRwLT5mbGFnICE9IE5VTEw7IHRwKyspCi0JICBpZiAoIXN0cmNtcCAocCwgdHAtPmZsYWcpKQotCSAgICBicmVhazsKLQotCWlmICh0cC0+ZmxhZyA9PSBOVUxMKQotCSAgewotCSAgICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlICVzIiksIHApOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQllbHNlCi0JICBhcmNoaXRlY3R1cmUgPSB0cC0+YXJjaDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGludCBpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIkk5NjAgb3B0aW9uczpcbiIpKTsKLSAgZm9yIChpID0gMDsgYXJjaF90YWJbaV0uZmxhZzsgaSsrKQotICAgIGZwcmludGYgKHN0cmVhbSwgIiVzLUElcyIsIGkgPyAiIHwgIiA6ICIiLCBhcmNoX3RhYltpXS5mbGFnKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcblwKLQkJCXNwZWNpZnkgdmFyaWFudCBvZiA5NjAgYXJjaGl0ZWN0dXJlXG5cCi0tYgkJCWFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlblxuXAotLWxpbmstcmVsYXgJCXByZXNlcnZlIGluZGl2aWR1YWwgYWxpZ25tZW50IGRpcmVjdGl2ZXMgc28gbGlua2VyXG5cCi0JCQljYW4gZG8gcmVsYXhpbmcgKGIub3V0IGZvcm1hdCBvbmx5KVxuXAotLW5vLXJlbGF4CQlkb24ndCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvclxuXAotCQkJbG9uZyBkaXNwbGFjZW1lbnRzXG4iKSk7Ci19Ci0MCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfY29udmVydF9mcmFnOgotICAJQ2FsbGVkIGJ5IGJhc2UgYXNzZW1ibGVyIGFmdGVyIGFkZHJlc3MgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZDogIG1vZGlmeQotICAJdmFyaWFibGUgZnJhZ21lbnRzIGFjY29yZGluZyB0byBob3cgbXVjaCByZWxheGF0aW9uIHdhcyBkb25lLgotCi0gIAlJZiB0aGUgZnJhZ21lbnQgc3Vic3RhdGUgaXMgc3RpbGwgMSwgYSAxMy1iaXQgZGlzcGxhY2VtZW50IHdhcyBlbm91Z2gKLSAgCXRvIHJlYWNoIHRoZSBzeW1ib2wgaW4gcXVlc3Rpb24uICBTZXQgdXAgYW4gYWRkcmVzcyBmaXh1cCwgYnV0IG90aGVyd2lzZQotICAJbGVhdmUgdGhlIGNvYnIgaW5zdHJ1Y3Rpb24gYWxvbmUuCi0KLSAgCUlmIHRoZSBmcmFnbWVudCBzdWJzdGF0ZSBpcyAyLCBhIDEzLWJpdCBkaXNwbGFjZW1lbnQgd2FzIG5vdCBlbm91Z2guCi0gIAlSZXBsYWNlIHRoZSBjb2JyIHdpdGggYSB0d28gaW5zdHJ1Y3Rpb25zIChhIGNvbXBhcmUgYW5kIGEgYnJhbmNoKS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbHNlCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICBmaXhTICpmaXhQOwkJCS8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIG5lZWRlZCBhZGRyZXNzIGZpeCAqLwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIExFQVZFIFNJTkdMRSBDT0JSIElOU1RSVUNUSU9OICovCi0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsCi0JCSAgICAgIGZyYWdQLT5mcl9vcGNvZGUgLSBmcmFnUC0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgNCwKLQkJICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkJICAgICAgMSwKLQkJICAgICAgTk9fUkVMT0MpOwotCi0gICAgICBmaXhQLT5meF9iaXRfZml4UCA9IChiaXRfZml4UyAqKSAxMzsJLyogc2l6ZSBvZiBiaXQgZmllbGQgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIC8qIFJFUExBQ0UgQ09CUiBXSVRIIENPTVBBUkUvQlJBTkNIIElOU1RSVUNUSU9OUyAqLwotICAgICAgcmVsYXhfY29iciAoZnJhZ1ApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXg6ICBIb3cgbXVjaCBkb2VzIGl0IGxvb2sgbGlrZSAqZnJhZ1Agd2lsbCBncm93PwotCi0gIAlDYWxsZWQgYnkgYmFzZSBhc3NlbWJsZXIganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLgotICAJUmV0dXJuIHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGZyYWdtZW50IHdpbGwgZ3Jvdy4KLQotICAJQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQ7IGNvYnIncwotICAJYmFzZWQgb24gdW5kZWZpbmVkIHN5bWJvbHMgd2lsbCBoYXZlIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBjb21wYXJlCi0gIAlpbnN0cnVjdGlvbiBhbmQgYSBicmFuY2ggaW5zdHJ1Y3Rpb24sIGFuZCB0aGUgY29kZSBmcmFnbWVudCB3aWxsIGdyb3cKLSAgCWJ5IDQgYnl0ZXMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICAvKiBJZiBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgZ28gdG8gInJlbGF4ZWQiIHN0YXRlCi0gICAgIChjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2YgY29icikgcmlnaHQgbm93LiAgKi8KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnRfdHlwZSkKLSAgICB7Ci0gICAgICByZWxheF9jb2JyIChmcmFnUCk7Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0gIHJldHVybiAwOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0KLSNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfcmlfdG9fY2hhcnM6Ci0gIAlUaGlzIHJvdXRpbmUgZXhpc3RzIGluIG9yZGVyIHRvIG92ZXJjb21lIG1hY2hpbmUgYnl0ZS1vcmRlciBwcm9ibGVtcwotICAJd2hlbiBkZWFsaW5nIHdpdGggYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QuCi0KLSAgCUJ1dCByZWxvY2F0aW9uIGluZm8gd2lsbCBiZSB1c2VkIG9uIHRoZSBob3N0IG1hY2hpbmUgb25seSAob25seQotICAJZXhlY3V0YWJsZSBjb2RlIGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIGk4MDk2MCkuICBUaGVyZWZvcmUsCi0gIAl3ZSBsZWF2ZSBpdCBpbiBob3N0IGJ5dGUgb3JkZXIuCi0KLSAgCVRoZSBhYm92ZSBjb21tZW50IGlzIG5vIGxvbmdlciB0cnVlLiAgVGhpcyByb3V0aW5lIG5vdyByZWFsbHkKLSAgCWRvZXMgZG8gdGhlIHJlb3JkZXJpbmcgKElhbiBUYXlsb3IgMjggQXVnIDkyKS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotc3RhdGljIHZvaWQKLW1kX3JpX3RvX2NoYXJzICh3aGVyZSwgcmkpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyaTsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgcmktPnJfYWRkcmVzcywKLQkJICAgICAgc2l6ZW9mIChyaS0+cl9hZGRyZXNzKSk7Ci0gIHdoZXJlWzRdID0gcmktPnJfaW5kZXggJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocmktPnJfaW5kZXggPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSAocmktPnJfaW5kZXggPj4gMTYpICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKChyaS0+cl9wY3JlbCA8PCAwKQotCSAgICAgIHwgKHJpLT5yX2xlbmd0aCA8PCAxKQotCSAgICAgIHwgKHJpLT5yX2V4dGVybiA8PCAzKQotCSAgICAgIHwgKHJpLT5yX2JzciA8PCA0KQotCSAgICAgIHwgKHJpLT5yX2Rpc3AgPDwgNSkKLQkgICAgICB8IChyaS0+cl9jYWxsaiA8PCA2KSk7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpICovCi0KLQwKLS8qIEZPTExPV0lORyBBUkUgVEhFIExPQ0FMIFJPVVRJTkVTLCBJTiBBTFBIQUJFVElDQUwgT1JERVIgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgYnJjbnRfZW1pdDoJRW1pdCBjb2RlIHRvIGluY3JlbWVudCBpbmxpbmUgYnJhbmNoIGNvdW50ZXIuCi0KLSAgCVNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIGRlY2xhcmF0aW9uIG9mICdicl9jbnQnIGZvciBkZXRhaWxzIG9uCi0gIAlicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24uCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLWJyY250X2VtaXQgKCkKLXsKLSAgY3RybF9mbXQgKEJSX0NOVF9GVU5DLCBDQUxMLCAxKTsJLyogRW1pdCBjYWxsIHRvICJpbmNyZW1lbnQiIHJvdXRpbmUgKi8KLSAgZW1pdCAoMCk7CQkJLyogRW1pdCBpbmxpbmUgY291bnRlciB0byBiZSBpbmNyZW1lbnRlZCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGJybGFiX25leHQ6CWdlbmVyYXRlIHRoZSBuZXh0IGJyYW5jaCBsb2NhbCBsYWJlbAotCi0gIAlTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBkZWNsYXJhdGlvbiBvZiAnYnJfY250JyBmb3IgZGV0YWlscyBvbgotICAJYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBjaGFyICoKLWJybGFiX25leHQgKCkKLXsKLSAgc3RhdGljIGNoYXIgYnVmWzIwXTsKLQotICBzcHJpbnRmIChidWYsICIlcyVkIiwgQlJfTEFCRUxfQkFTRSwgYnJfY250KyspOwotICByZXR1cm4gYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGJydGFiX2VtaXQ6CWdlbmVyYXRlIHRoZSBmZXRjaC1wcmVkaWN0aW9uIGJyYW5jaCB0YWJsZS4KLQotICAJU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgZGVjbGFyYXRpb24gb2YgJ2JyX2NudCcgZm9yIGRldGFpbHMgb24KLSAgCWJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbi4KLQotICAJVGhlIGNvZGUgZW1pdHRlZCBoZXJlIHdvdWxkIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcKLSAgCWV4YW1wbGUgYXNzZW1ibGVyIHNvdXJjZS4KLQotICAJCQkuZGF0YQotICAJCQkuYWxpZ24JMgotICAJICAgQlJfVEFCX05BTUU6Ci0gIAkJCS53b3JkCTAJCSMgbGluayB0byBuZXh0IHRhYmxlCi0gIAkJCS53b3JkCTMJCSMgbGVuZ3RoIG9mIHRhYmxlCi0gIAkJCS53b3JkCUxCUkFOQ0gwCSMgMXN0IGVudHJ5IGluIHRhYmxlIHByb3BlcgotICAJCQkud29yZAlMQlJBTkNIMQotICAJCQkud29yZAlMQlJBTkNIMgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1icnRhYl9lbWl0ICgpCi17Ci0gIGludCBpOwotICBjaGFyIGJ1ZlsyMF07Ci0gIGNoYXIgKnA7CQkJLyogV2hlcmUgdGhlIGJpbmFyeSB3YXMgb3V0cHV0IHRvICovCi0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRpb24gb2YgZGVmZXJyZWQgYWRkcmVzcyBmaXh1cC4gICovCi0gIGZpeFMgKmZpeFA7Ci0KLSAgaWYgKCFpbnN0cnVtZW50X2JyYW5jaGVzKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAwKTsJLyogICAgICAuZGF0YSAqLwotICBmcmFnX2FsaWduICgyLCAwLCAwKTsJCS8qICAgICAgLmFsaWduIDIgKi8KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0gIGNvbG9uIChCUl9UQUJfTkFNRSk7CQkvKiBCUl9UQUJfTkFNRTogKi8KLSAgZW1pdCAoMCk7CQkJLyogICAgICAud29yZCAwICNsaW5rIHRvIG5leHQgdGFibGUgKi8KLSAgZW1pdCAoYnJfY250KTsJCS8qICAgICAgLndvcmQgbiAjbGVuZ3RoIG9mIHRhYmxlICovCi0KLSAgZm9yIChpID0gMDsgaSA8IGJyX2NudDsgaSsrKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzJWQiLCBCUl9MQUJFTF9CQVNFLCBpKTsKLSAgICAgIHAgPSBlbWl0ICgwKTsKLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnX25vdywKLQkJICAgICAgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICAgICA0LAotCQkgICAgICBzeW1ib2xfZmluZCAoYnVmKSwKLQkJICAgICAgMCwKLQkJICAgICAgMCwKLQkJICAgICAgTk9fUkVMT0MpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBjb2JyX2ZtdDoJZ2VuZXJhdGUgYSBDT0JSLWZvcm1hdCBpbnN0cnVjdGlvbgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1jb2JyX2ZtdCAoYXJnLCBvcGNvZGUsIG9QKQotICAgICAvKiBhcmdbMF0tPm9wY29kZSBtbmVtb25pYywgYXJnWzEtM10tPm9wZXJhbmRzIChhc2NpaSkgKi8KLSAgICAgY2hhciAqYXJnW107Ci0gICAgIC8qIE9wY29kZSwgd2l0aCBicmFuY2gtcHJlZGljdGlvbiBiaXRzIGFscmVhZHkgc2V0IGlmIG5lY2Vzc2FyeS4gICovCi0gICAgIGxvbmcgb3Bjb2RlOwotICAgICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGluc3RydWN0aW9uLiAgKi8KLSAgICAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsKLXsKLSAgbG9uZyBpbnN0cjsJCQkvKiAzMi1iaXQgaW5zdHJ1Y3Rpb24gKi8KLSAgc3RydWN0IHJlZ29wIHJlZ29wOwkJLyogRGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLwotICBpbnQgbjsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgaW50IHZhcl9mcmFnOwkJCS8qIDEgaWYgdmFyeWluZyBsZW5ndGggY29kZSBmcmFnbWVudCBzaG91bGQKLQkJCQkgKiAgICBiZSBlbWl0dGVkOyAgMCBpZiBhbiBhZGRyZXNzIGZpeAotCQkJCSAqICAgICAgc2hvdWxkIGJlIGVtaXR0ZWQuCi0JCQkJICovCi0KLSAgaW5zdHIgPSBvcGNvZGU7Ci0gIG4gPSBvUC0+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+MXN0IG9wZXJhbmQsIGFyZ3NbMl0tPjJuZCBvcGVyYW5kICovCi17Ci0gIHN5bWJvbFMgKmNhbGxQOwkJLyogUG9pbnRlciB0byBsZWFmcHJvYyAnY2FsbCcgZW50cnkgcG9pbnQgc3ltYm9sICovCi0gIHN5bWJvbFMgKmJhbFA7CQkvKiBQb2ludGVyIHRvIGxlYWZwcm9jICdiYWwnIGVudHJ5IHBvaW50IHN5bWJvbCAqLwotCi0gIGlmICgobl9vcHMgIT0gMSkgJiYgKG5fb3BzICE9IDIpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic2hvdWxkIGhhdmUgMSBvciAyIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogQ2hlY2sgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotCi0gIC8qIEZpbmQgb3IgY3JlYXRlIHN5bWJvbCBmb3IgJ2NhbGwnIGVudHJ5IHBvaW50LiAqLwotICBjYWxsUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMV0pOwotCi0gIGlmIChUQ19TX0lTX0NBTExOQU1FIChjYWxsUCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiUmVkZWZpbmluZyBsZWFmcHJvYyAlcyIpLCBTX0dFVF9OQU1FIChjYWxsUCkpOwotICAgIH0JCQkJLyogaXMgbGVhZnByb2MgKi8KLQotICAvKiBJZiB0aGF0IHdhcyB0aGUgb25seSBhcmd1bWVudCwgdXNlIGl0IGFzIHRoZSAnYmFsJyBlbnRyeSBwb2ludC4KLSAgICAgKiBPdGhlcndpc2UsIG1hcmsgaXQgYXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCBhbmQgZmluZCBvciBjcmVhdGUKLSAgICAgKiBhbm90aGVyIHN5bWJvbCBmb3IgdGhlICdiYWwnIGVudHJ5IHBvaW50LgotICAgKi8KLSAgaWYgKChuX29wcyA9PSAxKSB8fCAhc3RyY21wIChhcmdzWzFdLCBhcmdzWzJdKSkKLSAgICB7Ci0gICAgICBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUgKGNhbGxQKTsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUgKGNhbGxQKTsKLQotICAgICAgYmFsUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMl0pOwotICAgICAgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKGJhbFApKQotCXsKLQkgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiKSwgU19HRVRfTkFNRSAoYmFsUCkpOwotCX0KLSAgICAgIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRSAoYmFsUCk7Ci0KLSNpZm5kZWYgT0JKX0VMRgotICAgICAgdGNfc2V0X2JhbF9vZl9jYWxsIChjYWxsUCwgYmFsUCk7Ci0jZW5kaWYKLSAgICB9CQkJCS8qIGlmIG9ubHkgb25lIGFyZywgb3IgdGhlIGFyZ3MgYXJlIHRoZSBzYW1lICovCi19Ci0KLQotLyoKLSAgIHNfc3lzcHJvYzogcHJvY2VzcyAuc3lzcHJvYyBwc2V1ZG8tb3AKLQotICAgICAgICAuc3lzcHJvYyB0YWtlcyB0d28gYXJndW1lbnRzOgotICAgICAgICAgICAgICAgIGFyZ1sxXTogbmFtZSBvZiBlbnRyeSBwb2ludCB0byBzeXN0ZW0gcHJvY2VkdXJlCi0gICAgICAgICAgICAgICAgYXJnWzJdOiAnZW50cnlfbnVtJyAoaW5kZXgpIG9mIHN5c3RlbSBwcm9jZWR1cmUgaW4gdGhlIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICBbMCwzMV0gaW5jbHVzaXZlLgotCi0gICAgICAgIEZvciBbYWJdLm91dCwgd2Ugc3RvcmUgdGhlICdlbnRyeW51bScgaW4gdGhlICduX290aGVyJyBmaWVsZCBvZgotICAgICAgICB0aGUgc3ltYm9sLiAgU2luY2UgdGhhdCBlbnRyeSBpcyBub3JtYWxseSAwLCB3ZSBiaWFzICdlbnRyeW51bScKLSAgICAgICAgYnkgYWRkaW5nIDEgdG8gaXQuICBJdCBtdXN0IGJlIHVuYmlhc2VkIGJlZm9yZSBpdCBpcyB1c2VkLiAgKi8KLXN0YXRpYyB2b2lkCi1zX3N5c3Byb2MgKG5fb3BzLCBhcmdzKQotICAgICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMV0tPjFzdCBvcGVyYW5kLCBhcmdzWzJdLT4ybmQgb3BlcmFuZCAqLwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIHN5bWJvbFMgKnN5bVA7Ci0KLSAgaWYgKG5fb3BzICE9IDIpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzaG91bGQgaGF2ZSB0d28gb3BlcmFuZHMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBiYWQgYXJnIGNvdW50ICovCi0KLSAgLyogUGFyc2UgImVudHJ5X251bSIgYXJndW1lbnQgYW5kIGNoZWNrIGl0IGZvciB2YWxpZGl0eS4gKi8KLSAgcGFyc2VfZXhwciAoYXJnc1syXSwgJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCAob2ZmcyAoZXhwKSA8IDApCi0gICAgICB8fCAob2ZmcyAoZXhwKSA+IDMxKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIidlbnRyeV9udW0nIG11c3QgYmUgYWJzb2x1dGUgbnVtYmVyIGluIFswLDMxXSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRmluZC9tYWtlIHN5bWJvbCBhbmQgc3RpY2sgZW50cnkgbnVtYmVyIChiaWFzZWQgYnkgKzEpIGludG8gaXQgKi8KLSAgc3ltUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMV0pOwotCi0gIGlmIChUQ19TX0lTX1NZU1BST0MgKHN5bVApKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgZW50cnludW0gZm9yIHN5c3Byb2MgJXMiKSwgU19HRVRfTkFNRSAoc3ltUCkpOwotICAgIH0JCQkJLyogcmVkZWZpbmluZyAqLwotCi0gIFRDX1NfU0VUX1NZU1BST0MgKHN5bVAsIG9mZnMgKGV4cCkpOwkvKiBlbmNvZGUgZW50cnkgbnVtYmVyICovCi0gIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyAoc3ltUCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBzaGlmdF9vazoKLSAgCURldGVybWluZSBpZiBhICJzaGxvIiBpbnN0cnVjdGlvbiBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSAibGRjb25zdCIuCi0gIAlUaGlzIG1lYW5zIHRoYXQgc29tZSBudW1iZXIgWCA8IDMyIGNhbiBiZSBzaGlmdGVkIGxlZnQgdG8gcHJvZHVjZSB0aGUKLSAgCWNvbnN0YW50IG9mIGludGVyZXN0LgotCi0gIAlSZXR1cm4gdGhlIHNoaWZ0IGNvdW50LCBvciAwIGlmIHdlIGNhbid0IGRvIGl0LgotICAJQ2FsbGVyIGNhbGN1bGF0ZXMgWCBieSBzaGlmdGluZyBvcmlnaW5hbCBjb25zdGFudCByaWdodCAnc2hpZnQnIHBsYWNlcy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotaW50Ci1zaGlmdF9vayAobikKLSAgICAgaW50IG47CQkJLyogVGhlIGNvbnN0YW50IG9mIGludGVyZXN0ICovCi17Ci0gIGludCBzaGlmdDsJCQkvKiBUaGUgc2hpZnQgY291bnQgKi8KLQotICBpZiAobiA8PSAwKQotICAgIHsKLSAgICAgIC8qIENhbid0IGRvIGl0IGZvciBuZWdhdGl2ZSBudW1iZXJzICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogU2hpZnQgJ24nIHJpZ2h0IHVudGlsIGEgMSBpcyBhYm91dCB0byBiZSBsb3N0ICovCi0gIGZvciAoc2hpZnQgPSAwOyAobiAmIDEpID09IDA7IHNoaWZ0KyspCi0gICAgewotICAgICAgbiA+Pj0gMTsKLSAgICB9Ci0KLSAgaWYgKG4gPj0gMzIpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gc2hpZnQ7Ci19Ci0KLQotLyogc3ludGF4OiBpc3N1ZSBzeW50YXggZXJyb3IgKi8KLQotc3RhdGljIHZvaWQKLXN5bnRheCAoKQotewotICBhc19iYWQgKF8oInN5bnRheCBlcnJvciIpKTsKLX0JCQkJLyogc3ludGF4KCkgKi8KLQotCi0vKiB0YXJnX2hhc19zZnI6Ci0KLSAgIFJldHVybiBUUlVFIGlmZiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyIChzZnIpLiAgKi8KLQotc3RhdGljCi1pbnQKLXRhcmdfaGFzX3NmciAobikKLSAgICAgaW50IG47CQkJLyogTnVtYmVyICgwLTMxKSBvZiBzZnIgKi8KLXsKLSAgc3dpdGNoIChhcmNoaXRlY3R1cmUpCi0gICAgewotICAgIGNhc2UgQVJDSF9LQToKLSAgICBjYXNlIEFSQ0hfS0I6Ci0gICAgY2FzZSBBUkNIX01DOgotICAgIGNhc2UgQVJDSF9KWDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgQVJDSF9IWDoKLSAgICAgIHJldHVybiAoKDAgPD0gbikgJiYgKG4gPD0gNCkpOwotICAgIGNhc2UgQVJDSF9DQToKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICgoMCA8PSBuKSAmJiAobiA8PSAyKSk7Ci0gICAgfQotfQotCi0KLS8qIHRhcmdfaGFzX2ljbGFzczoKLQotICAgUmV0dXJuIFRSVUUgaWZmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIHRoZSBpbmRpY2F0ZWQKLSAgIGNsYXNzIG9mIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMKLWludAotdGFyZ19oYXNfaWNsYXNzIChpYykKLSAgICAgLyogSW5zdHJ1Y3Rpb24gY2xhc3M7ICBvbmUgb2Y6Ci0gICAgICAgIElfQkFTRSwgSV9DWCwgSV9ERUMsIElfS1gsIElfRlAsIElfTUlMLCBJX0NBU0lNLCBJX0NYMiwgSV9IWCwgSV9IWDIKLSAgICAgICovCi0gICAgIGludCBpYzsKLXsKLSAgaWNsYXNzZXNfc2VlbiB8PSBpYzsKLSAgc3dpdGNoIChhcmNoaXRlY3R1cmUpCi0gICAgewotICAgIGNhc2UgQVJDSF9LQToKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0tYKTsKLSAgICBjYXNlIEFSQ0hfS0I6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9LWCB8IElfRlAgfCBJX0RFQyk7Ci0gICAgY2FzZSBBUkNIX01DOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfS1ggfCBJX0ZQIHwgSV9ERUMgfCBJX01JTCk7Ci0gICAgY2FzZSBBUkNIX0NBOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfQ1ggfCBJX0NYMiB8IElfQ0FTSU0pOwotICAgIGNhc2UgQVJDSF9KWDoKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0NYMiB8IElfSlgpOwotICAgIGNhc2UgQVJDSF9IWDoKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0NYMiB8IElfSlggfCBJX0hYKTsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChpY2xhc3Nlc19zZWVuICYgKElfS1ggfCBJX0ZQIHwgSV9ERUMgfCBJX01JTCkpCi0JICAmJiAoaWNsYXNzZXNfc2VlbiAmIChJX0NYIHwgSV9DWDIpKSkKLQl7Ci0JICBhc193YXJuIChfKCJhcmNoaXRlY3R1cmUgb2Ygb3Bjb2RlIGNvbmZsaWN0cyB3aXRoIHRoYXQgb2YgZWFybGllciBpbnN0cnVjdGlvbihzKSIpKTsKLQkgIGljbGFzc2VzX3NlZW4gJj0gfmljOwotCX0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgLmVuZGlhbiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19lbmRpYW4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJsaXR0bGUiKSA9PSAwKQotICAgIDsKLSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImJpZyIpID09IDApCi0gICAgYXNfYmFkIChfKCJiaWcgZW5kaWFuIG1vZGUgaXMgbm90IHN1cHBvcnRlZCIpKTsKLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIHVucmVjb2duaXplZCAuZW5kaWFuIHR5cGUgYCVzJyIpLCBuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBpOTYwLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiwKLSAgIHdoaWNoIHdlIGhhdmUgc2V0IHVwIGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXh1cCB0b28uICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFscDsKLSNlbHNlCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci0jZW5kaWYKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGxvbmcgdmFsID0gKnZhbHA7Ci0jZW5kaWYKLSAgY2hhciAqcGxhY2UgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCkKLSAgICB7Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIC8qIEZvciBjYWxseCwgd2UgYWx3YXlzIHdhbnQgdG8gd3JpdGUgb3V0IHplcm8sIGFuZCBlbWl0IGEKLQkgc3ltYm9saWMgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfYnNyKQotCXZhbCA9IDA7Ci0KLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKLSNlbmRpZgotCi0gICAgICBtZF9udW1iZXJfdG9faW1tIChwbGFjZSwgdmFsLCBmaXhQLT5meF9zaXplLCBmaXhQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fZmllbGQgKHBsYWNlLCB2YWwsIGZpeFAtPmZ4X2JpdF9maXhQKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKLXZvaWQKLXRjX2JvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyByaTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBtZW1zZXQgKChjaGFyICopICZyaSwgJ1wwJywgc2l6ZW9mIChyaSkpOwotICBzeW1ib2xQID0gZml4UC0+ZnhfYWRkc3k7Ci0gIGtub3cgKHN5bWJvbFAgIT0gMCB8fCBmaXhQLT5meF9yX3R5cGUgIT0gTk9fUkVMT0MpOwotICByaS5yX2JzciA9IGZpeFAtPmZ4X2JzcjsJLypTQUMgTEQgUkVMQVggSEFDSyAqLwotICAvKiBUaGVzZSB0d28gJ2N1eiBvZiBOUzMySyAqLwotICByaS5yX2NhbGxqID0gZml4UC0+ZnhfdGNiaXQ7Ci0gIGlmIChmaXhQLT5meF9iaXRfZml4UCkKLSAgICByaS5yX2xlbmd0aCA9IDI7Ci0gIGVsc2UKLSAgICByaS5yX2xlbmd0aCA9IG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXTsKLSAgcmkucl9wY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLQotICBpZiAoZml4UC0+Znhfcl90eXBlICE9IE5PX1JFTE9DKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIHJzX2FsaWduOgotCSAgcmkucl9pbmRleCA9IC0yOwotCSAgcmkucl9wY3JlbCA9IDE7Ci0JICByaS5yX2xlbmd0aCA9IGZpeFAtPmZ4X3NpemUgLSAxOwotCSAgYnJlYWs7Ci0JY2FzZSByc19vcmc6Ci0JICByaS5yX2luZGV4ID0gLTI7Ci0JICByaS5yX3BjcmVsID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgcnNfZmlsbDoKLQkgIHJpLnJfaW5kZXggPSAtMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICByaS5yX2V4dGVybiA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChsaW5rcmVsYXggfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgZml4UC0+ZnhfYnNyKQotICAgIHsKLSAgICAgIHJpLnJfZXh0ZXJuID0gMTsKLSAgICAgIHJpLnJfaW5kZXggPSBzeW1ib2xQLT5zeV9udW1iZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmkucl9leHRlcm4gPSAwOwotICAgICAgcmkucl9pbmRleCA9IFNfR0VUX1RZUEUgKHN5bWJvbFApOwotICAgIH0KLQotICAvKiBPdXRwdXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gbWFjaGluZS1kZXBlbmRlbnQgZm9ybS4gKi8KLSAgbWRfcmlfdG9fY2hhcnMgKHdoZXJlLCAmcmkpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotI2lmIGRlZmluZWQgKE9CSl9DT0ZGKSAmJiBkZWZpbmVkIChCRkQpCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9ic3IpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBSX1JFTExPTkc7Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsICE9IDAgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBSX0lQUk1FRDsKLQotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGlmIChmcmFnLT5mcl9uZXh0KQotICAgIHJldHVybiBmcmFnLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfYWRkcmVzczsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIEFsaWduIGFuIGFkZHJlc3MgYnkgcm91bmRpbmcgaXQgdXAgdG8gdGhlIHNwZWNpZmllZCBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwkJLyogQWRkcmVzcyB0byBiZSByb3VuZGVkIHVwICovCi17Ci0gIGludCBhbGlnbjsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotI2Vsc2UKLSAgYWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddOwotI2VuZGlmCi0gIHJldHVybiAoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKTsKLX0KLQotZXh0ZXJuIGludCBjb2ZmX2ZsYWdzOwotCi0jaWZkZWYgT0JKX0NPRkYKLXZvaWQKLXRjX2hlYWRlcnNfaG9vayAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHN3aXRjaCAoYXJjaGl0ZWN0dXJlKQotICAgIHsKLSAgICBjYXNlIEFSQ0hfS0E6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MEtBOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfS0I6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MEtCOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfTUM6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2ME1DOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfQ0E6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MENBOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfSlg6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MEpYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfSFg6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MEhYOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGljbGFzc2VzX3NlZW4gPT0gSV9CQVNFKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwQ09SRTsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0NYKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwQ0E7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9IWCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MEhYOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfSlgpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBKWDsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0NYMikKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MENBOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfTUlMKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwTUM7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgKElfREVDIHwgSV9GUCkpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBLQjsKLSAgICAgIGVsc2UKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MEtBOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICB7Ci0gICAgICBoZWFkZXJzLT5maWxlaGRyLmZfbWFnaWMgPSBJOTYwUldNQUdJQzsKLSAgICAgIGhlYWRlcnMtPmFvdXRoZHIubWFnaWMgPSBPTUFHSUM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGVhZGVycy0+ZmlsZWhkci5mX21hZ2ljID0gSTk2MFJPTUFHSUM7Ci0gICAgICBoZWFkZXJzLT5hb3V0aGRyLm1hZ2ljID0gTk1BR0lDOwotICAgIH0JCQkJLyogc2V0IG1hZ2ljIG51bWJlcnMgKi8KLX0KLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBUaGluZ3MgZ29pbmcgb24gaGVyZToKLQotICAgRm9yIGJvdXQsIFdlIG5lZWQgdG8gYXNzdXJlIGEgY291cGxlIG9mIHNpbXBsaWZ5aW5nCi0gICBhc3N1bXB0aW9ucyBhYm91dCBsZWFmcHJvY3MgZm9yIHRoZSBsaW5rZXI6IHRoZSBsZWFmcHJvYwotICAgZW50cnkgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUgYXNzZW1ibHkgaW4KLSAgIHdoaWNoIHRoZXkncmUgZGVjbGFyZWQgd2l0aCB0aGUgJy5sZWFmcHJvYycgZGlyZWN0aXZlOwotICAgYW5kIGlmIGEgbGVhZnByb2MgaGFzIGJvdGggJ2NhbGwnIGFuZCAnYmFsJyBlbnRyeSBwb2ludHMKLSAgIHRoZXkgYXJlIGJvdGggZ2xvYmFsIG9yIGJvdGggbG9jYWwuCi0KLSAgIEZvciBjb2ZmLCB0aGUgY2FsbCBzeW1ib2wgaGFzIGEgc2Vjb25kIGF1eCBlbnRyeSB0aGF0Ci0gICBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50LiAgVGhlIGJhbCBzeW1ib2wgYmVjb21lcyBhCi0gICBsYWJlbC4KLQotICAgRm9yIGNvZmYgcmVwcmVzZW50YXRpb24sIHRoZSBjYWxsIHN5bWJvbCBoYXMgYSBzZWNvbmQgYXV4IGVudHJ5IHRoYXQKLSAgIGNvbnRhaW5zIHRoZSBiYWwgZW50cnkgcG9pbnQuICBUaGUgYmFsIHN5bWJvbCBiZWNvbWVzIGEgbGFiZWwuICAqLwotCi12b2lkCi10Y19jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIGlmIChUQ19TX0lTX1NZU1BST0MgKHN5bWJvbFApKQotCXsKLQkgIC8qIHNlY29uZCBhdXggZW50cnkgYWxyZWFkeSBjb250YWlucyB0aGUgc3lzcHJvYyBudW1iZXIgKi8KLQkgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDIpOwotCSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19TQ0FMTCk7Ci0JICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCkgfCAoRFRfRkNOIDw8IE5fQlRTSEZUKSk7Ci0JICBjb250aW51ZTsKLQl9CQkJLyogcmV3cml0ZSBzeXNwcm9jICovCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotICAgICAgaWYgKCFUQ19TX0lTX0JBTE5BTUUgKHN5bWJvbFApICYmICFUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9CQkJLyogTm90IGEgbGVhZnByb2Mgc3ltYm9sICovCi0KLSAgICAgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQl7Ci0JICBhc19iYWQgKF8oImxlYWZwcm9jIHN5bWJvbCAnJXMnIHVuZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JfQkJCS8qIHVuZGVmaW5lZCBsZWFmICovCi0KLSAgICAgIGlmIChUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKLQl7Ci0JICBzeW1ib2xTICpiYWxQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChzeW1ib2xQKTsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSAhPSBTX0lTX0VYVEVSTkFMIChiYWxQKSkKLQkgICAgewotCSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgICAgICBTX1NFVF9FWFRFUk5BTCAoYmFsUCk7Ci0JICAgICAgYXNfd2FybiAoXygiV2FybmluZzogbWFraW5nIGxlYWZwcm9jIGVudHJpZXMgJXMgYW5kICVzIGJvdGggZ2xvYmFsXG4iKSwKLQkJICAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCBTX0dFVF9OQU1FIChiYWxQKSk7Ci0JICAgIH0JCQkvKiBleHRlcm5hbGl0eSBtaXNtYXRjaCAqLwotCX0JCQkvKiBpZiBjYWxsbmFtZSAqLwotICAgIH0JCQkJLyogd2FsayB0aGUgc3ltYm9sIGNoYWluICovCi19Ci0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogRm9yIGFvdXQgb3IgYm91dCwgdGhlIGJhbCBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBjYWxsLgotCi0gICBGb3IgY29mZiwgd2UgY2hlYXQgYW5kIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgYmFsIHN5bWJvbCBpbiB0aGUKLSAgIHNlY29uZCBhdXggZW50cnkgb2YgdGhlIGNhbGwuICAqLwotCi0jdW5kZWYgT0JKX0FCT1VUCi0jaWZkZWYgT0JKX0FPVVQKLSNkZWZpbmUgT0JKX0FCT1VUCi0jZW5kaWYKLSNpZmRlZiBPQkpfQk9VVAotI2RlZmluZSBPQkpfQUJPVVQKLSNlbmRpZgotCi12b2lkCi10Y19zZXRfYmFsX29mX2NhbGwgKGNhbGxQLCBiYWxQKQotICAgICBzeW1ib2xTICpjYWxsUDsKLSAgICAgc3ltYm9sUyAqYmFsUDsKLXsKLSAga25vdyAoVENfU19JU19DQUxMTkFNRSAoY2FsbFApKTsKLSAga25vdyAoVENfU19JU19CQUxOQU1FIChiYWxQKSk7Ci0KLSNpZmRlZiBPQkpfQ09GRgotCi0gIGNhbGxQLT5zeV90YyA9IGJhbFA7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGNhbGxQLCAyKTsKLQotI2Vsc2UgLyogISBPQkpfQ09GRiAqLwotI2lmZGVmIE9CSl9BQk9VVAotCi0gIC8qIElmIHRoZSAnYmFsJyBlbnRyeSBkb2Vzbid0IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgJ2NhbGwnCi0gICAgICogc3ltYm9sLCB1bmxpbmsgaXQgZnJvbSB0aGUgc3ltYm9sIGxpc3QgYW5kIHJlLWluc2VydCBpdC4KLSAgICovCi0gIGlmIChzeW1ib2xfbmV4dCAoY2FsbFApICE9IGJhbFApCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoYmFsUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChiYWxQLCBjYWxsUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQkJCQkvKiBpZiBub3QgaW4gb3JkZXIgKi8KLQotI2Vsc2UgLyogISBPQkpfQUJPVVQgKi8KLSAgYXNfZmF0YWwgKCJPbmx5IHN1cHBvcnRlZCBmb3IgYS5vdXQsIGIub3V0LCBvciBDT0ZGIik7Ci0jZW5kaWYgLyogISBPQkpfQUJPVVQgKi8KLSNlbmRpZiAvKiAhIE9CSl9DT0ZGICovCi19Ci0KLXN5bWJvbFMgKgotdGNfZ2V0X2JhbF9vZl9jYWxsIChjYWxsUCkKLSAgICAgc3ltYm9sUyAqY2FsbFA7Ci17Ci0gIHN5bWJvbFMgKnJldHZhbDsKLQotICBrbm93IChUQ19TX0lTX0NBTExOQU1FIChjYWxsUCkpOwotCi0jaWZkZWYgT0JKX0NPRkYKLSAgcmV0dmFsID0gY2FsbFAtPnN5X3RjOwotI2Vsc2UKLSNpZmRlZiBPQkpfQUJPVVQKLSAgcmV0dmFsID0gc3ltYm9sX25leHQgKGNhbGxQKTsKLSNlbHNlCi0gIGFzX2ZhdGFsICgiT25seSBzdXBwb3J0ZWQgZm9yIGEub3V0LCBiLm91dCwgb3IgQ09GRiIpOwotI2VuZGlmIC8qICEgT0JKX0FCT1VUICovCi0jZW5kaWYgLyogISBPQkpfQ09GRiAqLwotCi0gIGtub3cgKFRDX1NfSVNfQkFMTkFNRSAocmV0dmFsKSk7Ci0gIHJldHVybiByZXR2YWw7Ci19CQkJCS8qIF90Y19nZXRfYmFsX29mX2NhbGwoKSAqLwotCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGlmIChUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKLSAgICB7Ci0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIHN5bWJvbFMgKmJhbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKHN5bWJvbFApOwotCi0jaWYgMAotICAgICAgLyogc2Vjb25kIGF1eCBlbnRyeSBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50ICovCi0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAyKTsKLSNlbmRpZgotICAgICAgc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMV0ueF9iYWwueF9iYWxudHJ5ID0gU19HRVRfVkFMVUUgKGJhbFApOwotICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUKQotCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTEVBRkVYVCk7Ci0gICAgICBlbHNlCi0JU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19MRUFGU1RBVCk7Ci0gICAgICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCkgfCAoRFRfRkNOIDw8IE5fQlRTSEZUKSk7Ci0gICAgICAvKiBmaXggdXAgdGhlIGJhbCBzeW1ib2wgKi8KLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKGJhbFAsIENfTEFCRUwpOwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0gICAgfQkJCQkvKiBvbmx5IG9uIGNhbGxzICovCi19Ci0KLXZvaWQKLWk5NjBfaGFuZGxlX2FsaWduIChmcmFncCkKLSAgICAgZnJhZ1MgKmZyYWdwOwotewotICBpZiAoIWxpbmtyZWxheCkKLSAgICByZXR1cm47Ci0KLSNpZm5kZWYgT0JKX0JPVVQKLQotICBhc19iYWQgKF8oIm9wdGlvbiAtLWxpbmstcmVsYXggaXMgb25seSBzdXBwb3J0ZWQgaW4gYi5vdXQgZm9ybWF0IikpOwotICBsaW5rcmVsYXggPSAwOwotICByZXR1cm47Ci0KLSNlbHNlCi0KLSAgLyogVGhlIHRleHQgc2VjdGlvbiAiZW5kcyIgd2l0aCBhbm90aGVyIGFsaWdubWVudCByZWxvYywgdG8gd2hpY2ggd2UKLSAgICAgYXJlbid0IGFkZGluZyBwYWRkaW5nLiAgKi8KLSAgaWYgKGZyYWdwLT5mcl9uZXh0ID09IHRleHRfbGFzdF9mcmFnCi0gICAgICB8fCBmcmFncC0+ZnJfbmV4dCA9PSBkYXRhX2xhc3RfZnJhZykKLSAgICByZXR1cm47Ci0KLSAgLyogYWxpZ25tZW50IGRpcmVjdGl2ZSAqLwotICBmaXhfbmV3IChmcmFncCwgZnJhZ3AtPmZyX2ZpeCwgZnJhZ3AtPmZyX29mZnNldCwgMCwgMCwgMCwKLQkgICAoaW50KSBmcmFncC0+ZnJfdHlwZSk7Ci0jZW5kaWYgLyogT0JKX0JPVVQgKi8KLX0KLQotaW50Ci1pOTYwX3ZhbGlkYXRlX2ZpeCAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUsIGFkZF9zeW1ib2xQUCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsKLSAgICAgc3ltYm9sUyAqKmFkZF9zeW1ib2xQUDsKLXsKLSNkZWZpbmUgYWRkX3N5bWJvbFAgKCphZGRfc3ltYm9sUFApCi0gIGlmIChmaXhQLT5meF90Y2JpdCAmJiBUQ19TX0lTX0NBTExOQU1FIChhZGRfc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogUmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIGFzc29jaWF0ZWQgJ2JhbCcKLSAgICAgICAgIGVudHJ5IHBvaW50IHN5bWJvbC4gKi8KLQotICAgICAgaWYgKCFUQ19TX0lTX0JBTE5BTUUgKHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApKSkKLQl7Ci0JICBhc19iYWQgKF8oIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIpLAotCQkgIFNfR0VUX05BTUUgKGFkZF9zeW1ib2xQKSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCk7Ci0gICAgfQotI2lmIDAKLSAgLyogU3RpbGwgaGF2ZSB0byB3b3JrIG91dCBvdGhlciBjb25kaXRpb25zIGZvciB0aGVzZSB0ZXN0cy4gICovCi0gIHsKLSAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCi0gICAgICB7Ci0JYXNfYmFkIChfKCJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIikpOwotCXJldHVybiAxOwotICAgICAgfQotICAgIHJlbG9jX2NhbGxqIChmaXhQKTsKLSAgICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCi0gICAgICB7Ci0JLyogVGhpcyBpcyBhIENPQlIgaW5zdHJ1Y3Rpb24uICBUaGV5IGhhdmUgb25seSBhIDEzLWJpdAotCSAgIGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZCBmb3IgbG9jYWwgYnJhbmNoZXM6Ci0JICAgZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUgcmVsb2NhdGlvbi4gICovCi0JYXNfYmFkIChfKCJjYW4ndCB1c2UgQ09CUiBmb3JtYXQgd2l0aCBleHRlcm5hbCBsYWJlbCIpKTsKLQlmaXhQLT5meF9hZGRzeSA9IE5VTEw7CS8qIE5vIHJlbG9jYXRpb25zIHBsZWFzZS4gKi8KLQlyZXR1cm4gMTsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0jdW5kZWYgYWRkX3N5bWJvbFAKLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIEZyb20gY2dlbi5jOiAgKi8KLQotc3RhdGljIHNob3J0Ci10Y19iZmRfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotI2lmIDAKLSAgaWYgKGZpeFAtPmZ4X2JzcikKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIGlmIChmaXhQLT5meF9wY3JlbCA9PSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gQkZEX1JFTE9DXzMyOwotCi0gIGlmIChmaXhQLT5meF9wY3JlbCAhPSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gQkZEX1JFTE9DXzI0X1BDUkVMOwotCi0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuCi0KLSAgIEZJWE1FOiBUbyB3aGF0IGV4dGVudCBjYW4gd2UgZ2V0IGFsbCByZWxldmFudCB0YXJnZXRzIHRvIHVzZSB0aGlzPyAgKi8KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeFApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhQOwotewotICBhcmVsZW50ICogcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICAvKiBIQUNLOiBJcyB0aGlzIHJpZ2h0PyAqLwotICBmaXhQLT5meF9yX3R5cGUgPSB0Y19iZmRfZml4MnJ0eXBlIChmaXhQKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4UC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiwKLQkJICAgIGZpeFAtPmZ4X3JfdHlwZSwKLQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhQLT5meF9yX3R5cGUpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhc3NlcnQgKCFmaXhQLT5meF9wY3JlbCA9PSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKLSAgcmVsb2MtPmFkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLS8qIGVuZCBmcm9tIGNnZW4uYyAqLwotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBlbmQgb2YgdGMtaTk2MC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWk5NjAuaCBiL2dhcy9jb25maWcvdGMtaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ2ZWRlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTk2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qIHRjLWk5NjAuaCAtIEJhc2ljIDgwOTYwIGluc3RydWN0aW9uIGZvcm1hdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZm5kZWYgVENfSTk2MAotI2RlZmluZSBUQ19JOTYwIDEKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItaTk2MCIKLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfaTk2MAotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyoKLSAqIFRoZSAnQ09KJyBpbnN0cnVjdGlvbnMgYXJlIGFjdHVhbGx5IENPQlIgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlICdiJyBpbgotICogdGhlIG1uZW1vbmljIHJlcGxhY2VkIGJ5IGEgJ2onOyAgdGhleSBhcmUgQUxXQVlTICJkZS1vcHRpbWl6ZWQiIGlmIG5lY2Vzc2FyeToKLSAqIGlmIHRoZSBkaXNwbGFjZW1lbnQgd2lsbCBub3QgZml0IGluIDEzIGJpdHMsIHRoZSBhc3NlbWJsZXIgd2lsbCByZXBsYWNlIHRoZW0KLSAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4KLSAqCi0gKiBBbGwgb2YgdGhlICdNRU1uJyBpbnN0cnVjdGlvbnMgYXJlIHRoZSBzYW1lIGZvcm1hdDsgdGhlICduJyBpbiB0aGUgbmFtZQotICogaW5kaWNhdGVzIHRoZSBkZWZhdWx0IGluZGV4IHNjYWxlIGZhY3RvciAodGhlIHNpemUgb2YgdGhlIGRhdHVtIG9wZXJhdGVkIG9uKS4KLSAqCi0gKiBUaGUgRkJSQSBmb3JtYXRzIGFyZSBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgVGhleSBhcmUgdGhlCi0gKiAiY29udmVuaWVuY2UgZGlyZWN0aXZlcyIgZm9yIGJyYW5jaGluZyBvbiBmbG9hdGluZy1wb2ludCBjb21wYXJpc29ucywKLSAqIGVhY2ggb2Ygd2hpY2ggZ2VuZXJhdGVzIDIgaW5zdHJ1Y3Rpb25zIChhICdibm8nIGFuZCBvbmUgb3RoZXIgYnJhbmNoKS4KLSAqCi0gKiBUaGUgQ0FMTEogZm9ybWF0IGlzIG5vdCBhY3R1YWxseSBhbiBpbnN0cnVjdGlvbiBmb3JtYXQuICBJdCBpbmRpY2F0ZXMgdGhhdAotICogdGhlIGluc3RydWN0aW9uIGdlbmVyYXRlZCAoYSBDVFJMLWZvcm1hdCAnY2FsbCcpIHNob3VsZCBoYXZlIGl0cyByZWxvY2F0aW9uCi0gKiBzcGVjaWFsbHkgZmxhZ2dlZCBmb3IgbGluay10aW1lIHJlcGxhY2VtZW50IHdpdGggYSAnYmFsJyBvciAnY2FsbHMnIGlmCi0gKiBhcHByb3ByaWF0ZS4KLSAqLwotCi0vKiB0YWlsb3IgZ2FzICovCi0jZGVmaW5lIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSNkZWZpbmUgQklURklFTERfQ09OU19FWFBSRVNTSU9OUwotCi0vKiB0YWlsb3IgdGhlIGNvZmYgZm9ybWF0ICovCi0jZGVmaW5lIEJGRF9BUkNICQkJCWJmZF9hcmNoX2k5NjAKLSNkZWZpbmUgQ09GRl9GTEFHUwkJCQlGX0FSMzJXUgotI2RlZmluZSBDT0ZGX01BR0lDCQkJCUk5NjBST01BR0lDCi0jZGVmaW5lIE9CSl9DT0ZGX1NFQ1RJT05fSEVBREVSX0hBU19BTElHTk1FTlQKLSNkZWZpbmUgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMJCQkoMikKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoRklYUCkJCQkoIShGSVhQKS0+ZnhfZG9uZSkKLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoRklYUCkJCQl0Y19jb2ZmX2ZpeDJydHlwZShGSVhQKQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKEZSQUdQKQkJdGNfY29mZl9zaXplbWFjaGRlcChGUkFHUCkKLSNkZWZpbmUgVENfQ09GRl9TRVRfTUFDSElORShIRFJTKQkJdGNfaGVhZGVyc19ob29rIChIRFJTKQotZXh0ZXJuIHZvaWQgdGNfaGVhZGVyc19ob29rICgpOwotZXh0ZXJuIHNob3J0IHRjX2NvZmZfZml4MnJ0eXBlICgpOwotZXh0ZXJuIGludCB0Y19jb2ZmX3NpemVtYWNoZGVwICgpOwotCi0vKiBNRUFOSU5HIE9GICduX290aGVyJyBpbiB0aGUgc3ltYm9sIHJlY29yZC4KLSAqCi0gKiBJZiBub24temVybywgdGhlICduX290aGVyJyBmaWVsZHMgaW5kaWNhdGVzIGVpdGhlciBhIGxlYWYgcHJvY2VkdXJlIG9yCi0gKiBhIHN5c3RlbSBwcm9jZWR1cmUsIGFzIGZvbGxvd3M6Ci0gKgotICoJMSA8PSBuX290aGVyIDw9IDMyIDoKLSAqCQlUaGUgc3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludCB0byBhIHN5c3RlbSBwcm9jZWR1cmUuCi0gKgkJJ25fdmFsdWUnIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSwgYXMgZm9yIGFueSBvdGhlcgotICoJCXByb2NlZHVyZS4gIFRoZSBzeXN0ZW0gcHJvY2VkdXJlIG51bWJlciAod2hpY2ggY2FuIGJlIHVzZWQgaW4KLSAqCQlhICdjYWxscycgaW5zdHJ1Y3Rpb24pIGlzIChuX290aGVyLTEpLiAgVGhlc2UgZW50cmllcyBjb21lIGZyb20KLSAqCQknLnN5c3Byb2MnIGRpcmVjdGl2ZXMuCi0gKgotICoJbl9vdGhlciA9PSBOX0NBTExOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2NhbGwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlICpuZXh0KiBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSBtdXN0IGJlIHRoZSBjb3JyZXNwb25kaW5nCi0gKgkJJ2JhbCcgZW50cnkgcG9pbnQgdG8gdGhlIHByb2NlZHVyZSAoc2VlIGZvbGxvd2luZykuICBUaGVzZQotICoJCWVudHJpZXMgY29tZSBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggdHdvIGRpZmZlcmVudAotICoJCXN5bWJvbHMgYXJlIHNwZWNpZmllZCAodGhlIGZpcnN0IG9uZSBpcyByZXByZXNlbnRlZCBoZXJlKS4KLSAqCi0gKgotICoJbl9vdGhlciA9PSBOX0JBTE5BTUUKLSAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnYmFsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgotICoJCVRoZXNlIGVudHJpZXMgcmVzdWx0IGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCBvbmx5Ci0gKgkJb25lIHN5bWJvbCBpcyBzcGVjaWZpZWQsIG9yIGluIHdoaWNoIHRoZSBzYW1lIHN5bWJvbCBpcwotICoJCXNwZWNpZmllZCB0d2ljZS4KLSAqCi0gKiBOb3RlIHRoYXQgYW4gTl9DQUxMTkFNRSBlbnRyeSAqbXVzdCogaGF2ZSBhIGNvcnJlc3BvbmRpbmcgTl9CQUxOQU1FIGVudHJ5LAotICogYnV0IG5vdCBldmVyeSBOX0JBTE5BTUUgZW50cnkgbXVzdCBoYXZlIGFuIE5fQ0FMTE5BTUUgZW50cnkuCi0gKi8KLSNkZWZpbmUJTl9DQUxMTkFNRQkoKGNoYXIpLTEpCi0jZGVmaW5lCU5fQkFMTkFNRQkoKGNoYXIpLTIpCi0KLS8qIGk5NjAgdXNlcyBhIGN1c3RvbSByZWxvY2F0aW9uIHJlY29yZC4gKi8KLQotLyogbGV0IG9iai1hb3V0Lmgga25vdyAqLwotI2RlZmluZSBDVVNUT01fUkVMT0NfRk9STUFUIDEKLS8qIGxldCBhb3V0X2dudS5oIGtub3cgKi8KLSNkZWZpbmUgTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQgMQotc3RydWN0IHJlbG9jYXRpb25faW5mbwotICB7Ci0gICAgaW50IHJfYWRkcmVzczsJCS8qIEZpbGUgYWRkcmVzcyBvZiBpdGVtIHRvIGJlIHJlbG9jYXRlZAkqLwotICAgIHVuc2lnbmVkCi0gICAgICByX2luZGV4OjI0LAkJLyogSW5kZXggb2Ygc3ltYm9sIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMgYmFzZWQqLwotICAgICAgcl9wY3JlbDoxLAkJLyogMSA9PiByZWxvY2F0ZSBQQy1yZWxhdGl2ZTsgZWxzZSBhYnNvbHV0ZQotCQkJCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0Ci0JCQkJICoJYWRkcmVzcywgYWJzb2x1dGUgaW1wbGllcyAzMi1iaXQuCi0JCQkJICovCi0gICAgICByX2xlbmd0aDoyLAkJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlbG9jYXRlOgotCQkJCSAqCTAgPT4gMSBieXRlCi0JCQkJICoJMSA9PiAyIGJ5dGVzCi0JCQkJICoJMiA9PiA0IGJ5dGVzIC0tIG9ubHkgdmFsdWUgdXNlZCBmb3IgaTk2MAotCQkJCSAqLwotICAgICAgcl9leHRlcm46MSwgcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9kaXNwOjEsCQkJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9jYWxsajoxLAkJLyogMSBpZiByZWxvY2F0aW9uIHRhcmdldCBpcyBhbiBpOTYwICdjYWxsaicgKi8KLSAgICAgIG51dGhpbjoxOwkJCS8qIFVudXNlZAkJCQkqLwotICB9OwotCi0jaWZkZWYgT0JKX0NPRkYKLQotLyogV2Ugc3RvcmUgdGhlIGJhbCBpbmZvcm1hdGlvbiBpbiB0aGUgc3lfdGMgZmllbGQuICAqLwotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHN5bWJvbFMgKgotCi0jZGVmaW5lIFRDX0FESlVTVF9SRUxPQ19DT1VOVChGSVhQLENPVU5UKSBcCi0gIHsgZml4UyAqdGNmaXhwID0gKEZJWFApOyBcCi0gICAgZm9yICg7dGNmaXhwO3RjZml4cD10Y2ZpeHAtPmZ4X25leHQpIFwKLSAgICAgIGlmICh0Y2ZpeHAtPmZ4X3RjYml0ICYmIHRjZml4cC0+ZnhfYWRkc3kgIT0gMCkgXAotICAgICAgICArKyhDT1VOVCk7IFwKLSAgfQotI2VuZGlmCi0KLWV4dGVybiBpbnQgaTk2MF92YWxpZGF0ZV9maXggUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdULCBzeW1ib2xTICoqKSk7Ci0jZGVmaW5lIFRDX1ZBTElEQVRFX0ZJWChGSVhQLFNFR1RZUEUsTEFCRUwpIFwKLQlpZiAoaTk2MF92YWxpZGF0ZV9maXggKEZJWFAsIFNFR1RZUEUsICZhZGRfc3ltYm9sUCkgIT0gMCkgZ290byBMQUJFTAotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAotICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0jZW5kaWYKLQotI2lmbmRlZiBPQkpfRUxGCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWFApCQkoKEZJWFApLT5meF9ic3IgPT0gMCkKLSNlbHNlCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWFApCQkJCQkJXAotICAoKEZJWFApLT5meF9ic3IgPT0gMAkJCQkJCQlcCi0gICAmJiAhIFNfSVNfRVhURVJOQUwgKChGSVhQKS0+ZnhfYWRkc3kpCQkJCVwKLSAgICYmICEgU19JU19XRUFLICgoRklYUCktPmZ4X2FkZHN5KSkKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBicnRhYl9lbWl0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZW5kKCkJYnJ0YWJfZW1pdCAoKQotCi1leHRlcm4gdm9pZCByZWxvY19jYWxsaiAoKTsKLQotZXh0ZXJuIHZvaWQgdGNfc2V0X2JhbF9vZl9jYWxsIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci0KLWV4dGVybiBzdHJ1Y3Qgc3ltYm9sICp0Y19nZXRfYmFsX29mX2NhbGwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLWV4dGVybiB2b2lkIGk5NjBfaGFuZGxlX2FsaWduICgpOwotI2RlZmluZSBIQU5ETEVfQUxJR04oRlJBRykJaTk2MF9oYW5kbGVfYWxpZ24gKEZSQUcpCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFCi0jZGVmaW5lIE5PX1JFTE9DIC0xCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0jZGVmaW5lIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLQotI2RlZmluZSBUQ19GSVhfVFlQRSBzdHJ1Y3QgeyB1bnNpZ25lZCBic3IgOiAxOyB9Ci0jZGVmaW5lIGZ4X2JzciB0Y19maXhfZGF0YS5ic3IKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGKQkoKEYpLT50Y19maXhfZGF0YS5ic3IgPSAwKQotCi0jZW5kaWYKLQotLyogZW5kIG9mIHRjLWk5NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmMgYi9nYXMvY29uZmlnL3RjLW0zMnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkZTVjYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW0zMnIuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OTggKzAsMCBAQAotLyogdGMtbTMyci5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIE1pdHN1YmlzaGkgTTMyUi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGVzL20zMnItZGVzYy5oIgotI2luY2x1ZGUgIm9wY29kZXMvbTMyci1vcGMuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIExpbmtlZCBsaXN0IG9mIHN5bWJvbHMgdGhhdCBhcmUgZGVidWdnaW5nIHN5bWJvbHMgdG8gYmUgZGVmaW5lZCBhcyB0aGUKLSAgIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBzeW1fbGluawotewotICBzdHJ1Y3Qgc3ltX2xpbmsgKm5leHQ7Ci0gIHN5bWJvbFMJICAqc3ltYm9sOwotfSBzeW1fbGlua1M7Ci0KLXN0YXRpYyBzeW1fbGlua1MgKmRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7Ci0gIAotLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBkZXNjcmliaW5nCi0gICBhbiBpbmRpdmlkdWFsIGluc3RydWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IENHRU5fSU5TTiAqCWluc247Ci0gIGNvbnN0IENHRU5fSU5TTiAqCW9yaWdfaW5zbjsKLSAgQ0dFTl9GSUVMRFMJCWZpZWxkczsKLSNpZiBDR0VOX0lOVF9JTlNOX1AKLSAgQ0dFTl9JTlNOX0lOVCAgICAgICAgIGJ1ZmZlciBbMV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoKihidWYpKQotI2Vsc2UKLSAgdW5zaWduZWQgY2hhciAgICAgICAgIGJ1ZmZlciBbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSNkZWZpbmUgSU5TTl9WQUxVRShidWYpIChidWYpCi0jZW5kaWYKLSAgY2hhciAqCQlhZGRyOwotICBmcmFnUyAqCQlmcmFnOwotICBpbnQgICAgICAgICAgICAgICAgICAgbnVtX2ZpeHVwczsKLSAgZml4UyAqICAgICAgICAgICAgICAgIGZpeHVwcyBbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci0gIGludCAgICAgICAgICAgICAgICAgICBpbmRpY2VzIFtNQVhfT1BFUkFORF9JTlNUQU5DRVNdOwotICBzeW1fbGlua1MJCSpkZWJ1Z19zeW1fbGluazsKLX0KLW0zMnJfaW5zbjsKLQotLyogcHJldl9pbnNuLmluc24gaXMgbm9uLW51bGwgaWYgbGFzdCBpbnNuIHdhcyBhIDE2IGJpdCBpbnNuIG9uIGEgMzIgYml0Ci0gICBib3VuZGFyeSAoaS5lLiB3YXMgdGhlIGZpcnN0IG9mIHR3byAxNiBiaXQgaW5zbnMpLiAgKi8KLXN0YXRpYyBtMzJyX2luc24JcHJldl9pbnNuOwotCi0vKiBOb24temVybyBpZiB3ZSd2ZSBzZWVuIGEgcmVsYXhhYmxlIGluc24gc2luY2UgdGhlIGxhc3QgMzIgYml0Ci0gICBhbGlnbm1lbnQgcmVxdWVzdC4gICovCi1zdGF0aWMgaW50IHNlZW5fcmVsYXhhYmxlX3AgPSAwOwotCi0vKiBOb24temVybyBpZiAtcmVsYXggc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHN1ZmZpY2llbnQgcmVsb2NzIGFyZSBvdXRwdXQKLSAgIGZvciB0aGUgbGlua2VyIHRvIGRvIHJlbGF4aW5nLgotICAgV2UgZG8gc2ltcGxlIGZvcm1zIG9mIHJlbGF4aW5nIGludGVybmFsbHksIGJ1dCB0aGV5IGFyZSBhbHdheXMgZG9uZS4KLSAgIFRoaXMgZmxhZyBkb2VzIG5vdCBhcHBseSB0byB0aGVtLiAgKi8KLXN0YXRpYyBpbnQgbTMycl9yZWxheDsKLQotI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLS8qIElmIG5vbi1OVUxMLCBwb2ludGVyIHRvIGNwdSBkZXNjcmlwdGlvbiBmaWxlIHRvIHJlYWQuCi0gICBUaGlzIGFsbG93cyBydW50aW1lIGFkZGl0aW9ucyB0byB0aGUgYXNzZW1ibGVyLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogbTMycl9jcHVfZGVzYzsKLSNlbmRpZgotCi0vKiBOb24temVybyBpZiB3YXJuIHdoZW4gYSBoaWdoL3NoaWdoIHJlbG9jIGhhcyBubyBtYXRjaGluZyBsb3cgcmVsb2MuCi0gICBFYWNoIGhpZ2gvc2hpZ2ggcmVsb2MgbXVzdCBiZSBwYWlyZWQgd2l0aCBpdCdzIGxvdyBjb3VzaW4gaW4gb3JkZXIgdG8KLSAgIHByb3Blcmx5IGNhbGN1bGF0ZSB0aGUgYWRkZW5kIGluIGEgcmVsb2NhdGFibGUgbGluayAoc2luY2UgdGhlcmUgaXMgYQotICAgcG90ZW50aWFsIGNhcnJ5IGZyb20gdGhlIGxvdyB0byB0aGUgaGlnaC9zaGlnaCkuCi0gICBUaGlzIG9wdGlvbiBpcyBvZmYgYnkgZGVmYXVsdCB0aG91Z2ggZm9yIHVzZXItd3JpdHRlbiBhc3NlbWJsZXIgY29kZSBpdAotICAgbWlnaHQgbWFrZSBzZW5zZSB0byBtYWtlIHRoZSBkZWZhdWx0IGJlIG9uIChpLmUuIGhhdmUgZ2NjIHBhc3MgYSBmbGFnCi0gICB0byB0dXJuIGl0IG9mZikuICBUaGlzIHdhcm5pbmcgbXVzdCBub3QgYmUgb24gZm9yIEdDQyBjcmVhdGVkIGNvZGUgYXMKLSAgIG9wdGltaXphdGlvbiBtYXkgZGVsZXRlIHRoZSBsb3cgYnV0IG5vdCB0aGUgaGlnaC9zaGlnaCAoYXQgbGVhc3Qgd2UKLSAgIHNob3VsZG4ndCBhc3N1bWUgb3IgcmVxdWlyZSBpdCB0bykuICAqLwotc3RhdGljIGludCB3YXJuX3VubWF0Y2hlZF9oaWdoID0gMDsKLQotLyogTm9uLXplcm8gaWYgLW0zMnJ4IGhhcyBiZWVuIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBzdXBwb3J0IGZvciB0aGUKLSAgIGV4dGVuZGVkIE0zMlJYIGluc3RydWN0aW9uIHNldCBzaG91bGQgYmUgZW5hYmxlZC4gICovCi1zdGF0aWMgaW50IGVuYWJsZV9tMzJyeCA9IDA7Ci0KLS8qIE5vbi16ZXJvIGlmIC1tMzJyeCAtaGlkZGVuIGhhcyBiZWVuIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBzdXBwb3J0IGZvcgotICAgdGhlIHNwZWNpYWwgTTMyUlggaW5zdHJ1Y3Rpb24gc2V0IHNob3VsZCBiZSBlbmFibGVkLiAgKi8KLXN0YXRpYyBpbnQgZW5hYmxlX3NwZWNpYWwgPSAwOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJvZ3JhbW1lciBzaG91bGQgYmUgd2FybmVkIHdoZW4gYW4gZXhwbGljaXQgcGFyYWxsZWwKLSAgIGluc3RydWN0aW9uIG1pZ2h0IGhhdmUgY29uc3RyYWludCB2aW9sYXRpb25zLiAgKi8KLXN0YXRpYyBpbnQgd2Fybl9leHBsaWNpdF9wYXJhbGxlbF9jb25mbGljdHMgPSAxOwotCi0vKiBOb24temVybyBpZiBpbnNucyBjYW4gYmUgbWFkZSBwYXJhbGxlbC4gICovCi1zdGF0aWMgaW50IG9wdGltaXplOwotCi0vKiBzdHVmZiBmb3IgLnNjb21tIHN5bWJvbHMuICAqLwotc3RhdGljIHNlZ1QgICAgIHNic3Nfc2VjdGlvbjsKLXN0YXRpYyBhc2VjdGlvbiBzY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgc2NvbV9zeW1ib2w7Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdICAgICAgICA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gICA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSAgICAgICAgICAgID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gICAgICAgICAgICA9ICJkRCI7Ci0KLS8qIFJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBhcmUgZG9uZSBpbiB0d28KLSAgIHBhcnRzLCB3aXRoIGEgSEkgcmVsb2NhdGlvbiBhbmQgYSBMTyByZWxvY2F0aW9uLiAgRWFjaCByZWxvY2F0aW9uCi0gICBoYXMgb25seSAxNiBiaXRzIG9mIHNwYWNlIHRvIHN0b3JlIGFuIGFkZGVuZC4gIFRoaXMgbWVhbnMgdGhhdCBpbgotICAgb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gaGFuZGxlIGNhcnJpZXMgY29ycmVjdGx5LCBpdCBtdXN0IGJlIGFibGUKLSAgIHRvIGxvY2F0ZSBib3RoIHRoZSBISSBhbmQgdGhlIExPIHJlbG9jYXRpb24uICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICByZWxvY2F0aW9ucyBtdXN0IGFwcGVhciBpbiBvcmRlciBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZS4KLQotICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoaXMsIHdlIGtlZXAgdHJhY2sgb2YgZWFjaCB1bm1hdGNoZWQgSEkKLSAgIHJlbG9jYXRpb24uICBXZSB0aGVuIHNvcnQgdGhlbSBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgTE8gcmVsb2NhdGlvbi4gKi8KLQotc3RydWN0IG0zMnJfaGlfZml4dXAKLXsKLSAgc3RydWN0IG0zMnJfaGlfZml4dXAgKiBuZXh0OyAgLyogTmV4dCBISSBmaXh1cC4gICovCi0gIGZpeFMgKiAgICAgICAgICAgICAgICAgZml4cDsgIC8qIFRoaXMgZml4dXAuICAqLwotICBzZWdUICAgICAgICAgICAgICAgICAgIHNlZzsgICAvKiBUaGUgc2VjdGlvbiB0aGlzIGZpeHVwIGlzIGluLiAgKi8KLQotfTsKLQotLyogVGhlIGxpc3Qgb2YgdW5tYXRjaGVkIEhJIHJlbG9jcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIG0zMnJfaGlfZml4dXBfbGlzdDsKLQotDAotc3RhdGljIHZvaWQKLWFsbG93X20zMnJ4IChvbikKLSAgICAgaW50IG9uOwotewotICBlbmFibGVfbTMycnggPSBvbjsKLQotICBpZiAoc3Rkb3V0cHV0ICE9IE5VTEwpCi0gICAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsCi0JCSAgICAgICBlbmFibGVfbTMycnggPyBiZmRfbWFjaF9tMzJyeCA6IGJmZF9tYWNoX20zMnIpOwotfQotDAotI2RlZmluZSBNMzJSX1NIT1JUT1BUUyAiTyIKLWNvbnN0IGNoYXIgKiBtZF9zaG9ydG9wdHMgPSBNMzJSX1NIT1JUT1BUUzsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSNkZWZpbmUgT1BUSU9OX00zMlJYCShPUFRJT05fTURfQkFTRSkKLSAgeyJtMzJyeCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTMyUlh9LAotI2RlZmluZSBPUFRJT05fV0FSTl9QQVJBTExFTAkoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7Indhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX1BBUkFMTEVMfSwKLSAgeyJXcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9QQVJBTExFTH0sCi0jZGVmaW5lIE9QVElPTl9OT19XQVJOX1BBUkFMTEVMCShPUFRJT05fTURfQkFTRSArIDIpCi0gIHsibm8td2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1dBUk5fUEFSQUxMRUx9LAotICB7IlducCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fV0FSTl9QQVJBTExFTH0sCi0jZGVmaW5lIE9QVElPTl9TUEVDSUFMCShPUFRJT05fTURfQkFTRSArIDMpCi0gIHsiaGlkZGVuIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUEVDSUFMfSwKLQotICAvKiBTaWdoLiAgSSBndWVzcyBhbGwgd2FybmluZ3MgbXVzdCBub3cgaGF2ZSBib3RoIHZhcmlhbnRzLiAgKi8KLSNkZWZpbmUgT1BUSU9OX1dBUk5fVU5NQVRDSEVEIChPUFRJT05fTURfQkFTRSArIDQpCi0gIHsid2Fybi11bm1hdGNoZWQtaGlnaCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9VTk1BVENIRUR9LAotICB7Ild1aCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9VTk1BVENIRUR9LAotI2RlZmluZSBPUFRJT05fTk9fV0FSTl9VTk1BVENIRUQgKE9QVElPTl9NRF9CQVNFICsgNSkKLSAgeyJuby13YXJuLXVubWF0Y2hlZC1oaWdoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRH0sCi0gIHsiV251aCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fV0FSTl9VTk1BVENIRUR9LAotCi0jaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLwotI2RlZmluZSBPUFRJT05fUkVMQVggIChPUFRJT05fTURfQkFTRSArIDYpCi0gIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKLSNkZWZpbmUgT1BUSU9OX0NQVV9ERVNDIChPUFRJT05fTURfQkFTRSArIDcpCi0gIHsiY3B1LWRlc2MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NQVV9ERVNDfSwKLSNlbmRpZgotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50ICAgIGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnTyc6Ci0gICAgICBvcHRpbWl6ZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX00zMlJYOgotICAgICAgYWxsb3dfbTMycnggKDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QVElPTl9XQVJOX1BBUkFMTEVMOgotICAgICAgd2Fybl9leHBsaWNpdF9wYXJhbGxlbF9jb25mbGljdHMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QVElPTl9OT19XQVJOX1BBUkFMTEVMOgotICAgICAgd2Fybl9leHBsaWNpdF9wYXJhbGxlbF9jb25mbGljdHMgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TUEVDSUFMOgotICAgICAgaWYgKGVuYWJsZV9tMzJyeCkKLQllbmFibGVfc3BlY2lhbCA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgLyogUHJldGVuZCB0aGF0IHdlIGRvIG5vdCByZWNvZ25pc2UgdGhpcyBvcHRpb24uICAqLwotCSAgYXNfYmFkIChfKCJVbnJlY29nbmlzZWQgb3B0aW9uOiAtaGlkZGVuIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9XQVJOX1VOTUFUQ0hFRDoKLSAgICAgIHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRDoKLSAgICAgIHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICBtMzJyX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0NQVV9ERVNDOgotICAgICAgbTMycl9jcHVfZGVzYyA9IGFyZzsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqIHN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgTTMyUiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uczpcbiIpKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW0zMnJ4ICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgZXh0ZW5kZWQgbTMycnggaW5zdHJ1Y3Rpb24gc2V0XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtTyAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gY29tYmluZSBpbnN0cnVjdGlvbnMgaW4gcGFyYWxsZWxcbiIpKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzICAgICB3YXJuIHdoZW4gcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aW9sYXRlIGNvbnRyYWludHNcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1uby13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0cyAgZG8gbm90IHdhcm4gd2hlbiBwYXJhbGxlbFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIHZpb2xhdGUgY29udHJhaW50c1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVdwICAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtV25wICAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtbm8td2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHNcbiIpKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLXdhcm4tdW5tYXRjaGVkLWhpZ2ggICAgd2FybiB3aGVuIGFuIChzKWhpZ2ggcmVsb2MgaGFzIG5vIG1hdGNoaW5nIGxvdyByZWxvY1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2ggZG8gbm90IHdhcm4gYWJvdXQgbWlzc2luZyBsb3cgcmVsb2NzXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtV3VoICAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtd2Fybi11bm1hdGNoZWQtaGlnaFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVdudWggICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIpKTsKLQotI2lmIDAKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1yZWxheCAgICAgICAgICAgICAgICAgY3JlYXRlIGxpbmtlciByZWxheGFibGUgY29kZVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLWNwdS1kZXNjICAgICAgICAgICAgICBwcm92aWRlIHJ1bnRpbWUgY3B1IGRlc2NyaXB0aW9uIGZpbGVcbiIpKTsKLSNlbmRpZgotfSAKLQotc3RhdGljIHZvaWQgZmlsbF9pbnNuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbTMycl9zY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGRlYnVnX3N5bSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGV4cGFuZF9kZWJ1Z19zeW1zIFBBUkFNUyAoKHN5bV9saW5rUyAqLCBpbnQpKTsKLQotLyogU2V0IGJ5IG1kX2Fzc2VtYmxlIGZvciB1c2UgYnkgbTMycl9maWxsX2luc24uICAqLwotc3RhdGljIHN1YnNlZ1QgcHJldl9zdWJzZWc7Ci1zdGF0aWMgc2VnVCBwcmV2X3NlZzsKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsCWNvbnMsCQk0IH0sCi0gIHsgImZpbGxpbnNuIiwgZmlsbF9pbnNuLAkwIH0sCi0gIHsgInNjb21tIiwJbTMycl9zY29tbSwJMCB9LAotICB7ICJkZWJ1Z3N5bSIsCWRlYnVnX3N5bSwJMCB9LAotICAvKiBOb3QgZG9jdW1lbnRlZCBhcyBzbyBmYXIgdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlbS4uLi4gKi8gIAotICB7ICJtMzJyIiwJYWxsb3dfbTMycngsCTAgfSwKLSAgeyAibTMycngiLAlhbGxvd19tMzJyeCwJMSB9LAotICB7IE5VTEwsIE5VTEwsIDAgfQotfTsKLQotLyogRklYTUU6IFNob3VsZCBiZSBtYWNoaW5lIGdlbmVyYXRlZC4gICovCi0jZGVmaW5lIE5PUF9JTlNOIDB4NzAwMAotI2RlZmluZSBQQVJfTk9QX0lOU04gMHhmMDAwIC8qIGNhbiBvbmx5IGJlIHVzZWQgaW4gMm5kIHNsb3QgKi8KLQotLyogV2hlbiB3ZSBhbGlnbiB0aGUgLnRleHQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLgotICAgTiBpcyB0aGUgcG93ZXIgb2YgMiBhbGlnbm1lbnQuICBMRU4gaXMgdGhlIGxlbmd0aCBvZiBwYXR0ZXJuIEZJTEwuCi0gICBNQVggaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuIGRvaW5nIHRoZSBhbGlnbm1lbnQsCi0gICBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotCi1pbnQKLW0zMnJfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4KQotICAgICBpbnQgICAgICAgICAgbjsKLSAgICAgY29uc3QgY2hhciAqIGZpbGw7Ci0gICAgIGludCAgICAgICAgICBsZW47Ci0gICAgIGludCAgICAgICAgICBtYXg7Ci17Ci0gIC8qIE9ubHkgZG8gdGhpcyBpZiB0aGUgZmlsbCBwYXR0ZXJuIHdhc24ndCBzcGVjaWZpZWQuICAqLwotICBpZiAoZmlsbCA9PSBOVUxMCi0gICAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKQotICAgICAgLyogT25seSBkbyB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgaWYgYWxpZ25pbmcgdG8gYXQgbGVhc3QgYQotCSA0IGJ5dGUgYm91bmRhcnkuICAqLwotICAgICAgJiYgbiA+IDEKLSAgICAgLyogT25seSBkbyB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgaWYgd2UncmUgYWxsb3dlZCB0byBlbWl0IGF0Ci0JIGxlYXN0IHR3byBieXRlcy4gICovCi0gICAgICAmJiAobWF4ID09IDAgfHwgbWF4ID4gMSkpCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9wX3BhdHRlcm5bXSA9IHsgMHhmMCwgMHgwMCB9OwotCi0jaWYgMAotICAgICAgLyogRmlyc3QgYWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnksIGluIGNhc2UgdGhlcmUgaXMgYW4gb2RkIC5ieXRlLiAgKi8KLSAgICAgIC8qIEZJWE1FOiBIb3cgbXVjaCBtZW1vcnkgd2lsbCBjYXVzZSBnYXMgdG8gdXNlIHdoZW4gYXNzZW1ibGluZyBhIGJpZwotCSBwcm9ncmFtPyAgUGVyaGFwcyB3ZSBjYW4gYXZvaWQgdGhlIGZyYWdfYWxpZ24gY2FsbD8gICovCi0gICAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSNlbmRpZgotICAgICAgLyogTmV4dCBhbGlnbiB0byBhIDQgYnl0ZSBib3VuZGFyeSAod2Uga25vdyBuID49IDIpIHVzaW5nIGEgcGFyYWxsZWwKLQkgbm9wLiAgKi8KLSAgICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMiwgbm9wX3BhdHRlcm4sIHNpemVvZiBub3BfcGF0dGVybiwgMCk7Ci0gICAgICAvKiBJZiBkb2luZyBsYXJnZXIgYWxpZ25tZW50cyB1c2UgYSByZXBlYXRpbmcgc2VxdWVuY2Ugb2YgYXBwcm9wcmlhdGUKLQkgbm9wcy4gICovCi0gICAgICBpZiAobiA+IDIpCi0JewotCSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbXVsdGlfbm9wX3BhdHRlcm5bXSA9Ci0JICB7IDB4NzAsIDB4MDAsIDB4ZjAsIDB4MDAgfTsKLQkgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbXVsdGlfbm9wX3BhdHRlcm4sIHNpemVvZiBtdWx0aV9ub3BfcGF0dGVybiwKLQkJCSAgICAgIG1heCA/IG1heCAtIDIgOiAwKTsKLQl9Ci0gICAgICAKLSAgICAgIHByZXZfaW5zbi5pbnNuID0gTlVMTDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gd2FzIHRoZSBmaXJzdCBvZiAyIDE2IGJpdCBpbnNucywKLSAgIG91dHB1dCBhIG5vcCB0byBtb3ZlIHRoZSBQQyB0byBhIDMyIGJpdCBib3VuZGFyeS4KLQotICAgVGhpcyBpcyBkb25lIHZpYSBhbiBhbGlnbm1lbnQgc3BlY2lmaWNhdGlvbiBzaW5jZSBicmFuY2ggcmVsYXhpbmcKLSAgIG1heSBtYWtlIGl0IHVubmVjZXNzYXJ5LgotCi0gICBJbnRlcm5hbGx5LCB3ZSBuZWVkIHRvIG91dHB1dCBvbmUgb2YgdGhlc2UgZWFjaCB0aW1lIGEgMzIgYml0IGluc24gaXMKLSAgIHNlZW4gYWZ0ZXIgYW4gaW5zbiB0aGF0IGlzIHJlbGF4YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1maWxsX2luc24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgKHZvaWQpIG0zMnJfZG9fYWxpZ24gKDIsIE5VTEwsIDAsIDApOwotICBwcmV2X2luc24uaW5zbiA9IE5VTEw7Ci0gIHNlZW5fcmVsYXhhYmxlX3AgPSAwOwotfQotCi0vKiBSZWNvcmQgdGhlIHN5bWJvbCBzbyB0aGF0IHdoZW4gd2Ugb3V0cHV0IHRoZSBpbnNuLCB3ZSBjYW4gY3JlYXRlCi0gICBhIHN5bWJvbCB0aGF0IGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQKLSAgIHRvIGVtaXQgdGhlIGxhYmVsIGZvciB0aGUgc3RhcnQgb2YgYSBicmVha3BvaW50IHdpdGhvdXQgY2F1c2luZwotICAgdGhlIGFzc2VtYmxlciB0byBlbWl0IGEgTk9QIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYQotICAgMTYgYml0IGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWRlYnVnX3N5bSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGRlbGltOwotICByZWdpc3RlciBjaGFyICplbmRfbmFtZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgcmVnaXN0ZXIgc3ltX2xpbmtTICpsaW5rOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbGltID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVuZF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotIAotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpID09IE5VTEwKLSAgICAgICYmIChzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkpID09IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgIT0gcmVnX3NlY3Rpb24pCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxpbmsgPSAoc3ltX2xpbmtTICopIHhtYWxsb2MgKHNpemVvZiAoc3ltX2xpbmtTKSk7Ci0gICAgICBsaW5rLT5zeW1ib2wgPSBzeW1ib2xQOwotICAgICAgbGluay0+bmV4dCA9IGRlYnVnX3N5bV9saW5rOwotICAgICAgZGVidWdfc3ltX2xpbmsgPSBsaW5rOwotICAgICAgc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCA9IDE7Ci0gICAgfQotCi0gICplbmRfbmFtZSA9IGRlbGltOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBTZWNvbmQgcGFzcyB0byBleHBhbmRpbmcgdGhlIGRlYnVnIHN5bWJvbHMsIGdvIHRocm91Z2ggbGlua2VkCi0gICBsaXN0IG9mIHN5bWJvbHMgYW5kIHJlYXNzaWduIHRoZSBhZGRyZXNzLiAgKi8KLQotc3RhdGljIHZvaWQKLWV4cGFuZF9kZWJ1Z19zeW1zIChzeW1zLCBhbGlnbikKLSAgICAgc3ltX2xpbmtTICpzeW1zOwotICAgICBpbnQgYWxpZ247Ci17Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgc3ltX2xpbmtTICpuZXh0X3N5bXM7Ci0KLSAgaWYgKCFzeW1zKQotICAgIHJldHVybjsKLQotICAodm9pZCkgbTMycl9kb19hbGlnbiAoYWxpZ24sIE5VTEwsIDAsIDApOwotICBmb3IgKDsgc3ltcyAhPSAoc3ltX2xpbmtTICopMDsgc3ltcyA9IG5leHRfc3ltcykKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1ib2xQID0gc3ltcy0+c3ltYm9sOwotICAgICAgbmV4dF9zeW1zID0gc3ltcy0+bmV4dDsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9ICIuXG4iOwotICAgICAgcHNldWRvX3NldCAoc3ltYm9sUCk7Ci0gICAgICBmcmVlICgoY2hhciAqKXN5bXMpOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmU7Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIGZpbGxfaW5zbiBjYWxsZWQgYWZ0ZXIgYSBsYWJlbCBhbmQgYXQgZW5kIG9mIGFzc2VtYmx5LgotICAgVGhlIHJlc3VsdCBpcyBhbHdheXMgMTogd2UncmUgY2FsbGVkIGluIGEgY29uZGl0aW9uYWwgdG8gc2VlIGlmIHRoZQotICAgY3VycmVudCBsaW5lIGlzIGEgbGFiZWwuICAqLwotCi1pbnQKLW0zMnJfZmlsbF9pbnNuIChkb25lKQotICAgICBpbnQgZG9uZTsKLXsKLSAgaWYgKHByZXZfc2VnICE9IE5VTEwpCi0gICAgewotICAgICAgc2VnVCAgICBzZWcgICAgPSBub3dfc2VnOwotICAgICAgc3Vic2VnVCBzdWJzZWcgPSBub3dfc3Vic2VnOwotCi0gICAgICBzdWJzZWdfc2V0IChwcmV2X3NlZywgcHJldl9zdWJzZWcpOwotICAgICAgCi0gICAgICBmaWxsX2luc24gKDApOwotCi0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotCi0gIGlmIChkb25lICYmIGRlYnVnX3N5bV9saW5rKQotICAgIHsKLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChkZWJ1Z19zeW1fbGluaywgMSk7Ci0gICAgICBkZWJ1Z19zeW1fbGluayA9IChzeW1fbGlua1MgKikwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQwKLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGZsYWd3b3JkIGFwcGxpY2FibGU7Ci0gIHNlZ1QgICAgIHNlZzsKLSAgc3Vic2VnVCAgc3Vic2VnOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGBjZ2VuJyBpbnRlcmZhY2UuICAqLwotICAKLSAgLyogU2V0IHRoZSBtYWNoaW5lIG51bWJlciBhbmQgZW5kaWFuLiAgKi8KLSAgZ2FzX2NnZW5fY3B1X2Rlc2MgPSBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fTUFDSFMsIDAsCi0JCQkJCSAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sCi0JCQkJCSAgQ0dFTl9FTkRJQU5fQklHLAotCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgbTMycl9jZ2VuX2luaXRfYXNtIChnYXNfY2dlbl9jcHVfZGVzYyk7Ci0KLSAgLyogVGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgaXMgdXNlZCBkdXJpbmcgb3B0aW1pemF0aW9uIHRvIGRldGVybWluZQotICAgICB3aGljaCBpbnNucyBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuICBJdCBpcyBhbHNvIHVzZWQgdG8gZ2l2ZQotICAgICB3YXJuaW5ncyByZWdhcmRpbmcgb3BlcmFuZCBpbnRlcmZlcmVuY2UgaW4gcGFyYWxsZWwgaW5zbnMuICAqLwotICBtMzJyX2NnZW5faW5pdF9vcGluc3RfdGFibGUgKGdhc19jZ2VuX2NwdV9kZXNjKTsKLQotICAvKiBUaGlzIGlzIGEgY2FsbGJhY2sgZnJvbSBjZ2VuIHRvIGdhcyB0byBwYXJzZSBvcGVyYW5kcy4gICovCi0gIGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4gKGdhc19jZ2VuX2NwdV9kZXNjLCBnYXNfY2dlbl9wYXJzZV9vcGVyYW5kKTsKLQotI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLSAgLyogSWYgYSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlIHdhcyBwcm92aWRlZCwgcGFyc2UgaXQuICAqLwotICBpZiAobTMycl9jcHVfZGVzYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBlcnJtc2c7Ci0KLSAgICAgIGVycm1zZyA9IGNnZW5fcmVhZF9jcHVfZmlsZSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIG0zMnJfY3B1X2Rlc2MpOwotICAgICAgaWYgKGVycm1zZyAhPSBOVUxMKQotCWFzX2JhZCAoIiVzOiAlcyIsIG0zMnJfY3B1X2Rlc2MsIGVycm1zZyk7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogU2F2ZSB0aGUgY3VycmVudCBzdWJzZWcgc28gd2UgY2FuIHJlc3RvcmUgaXQgW2l0J3MgdGhlIGRlZmF1bHQgb25lIGFuZAotICAgICB3ZSBkb24ndCB3YW50IHRoZSBpbml0aWFsIHNlY3Rpb24gdG8gYmUgLnNic3NdLiAgKi8KLSAgc2VnICAgID0gbm93X3NlZzsKLSAgc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICAvKiBUaGUgc2JzcyBzZWN0aW9uIGlzIGZvciBsb2NhbCAuc2NvbW0gc3ltYm9scy4gICovCi0gIHNic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDApOwotICAKLSAgLyogVGhpcyBpcyBjb3BpZWQgZnJvbSBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MuICAqLwotICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSAmIFNFQ19BTExPQyk7Ci0gIAotI2lmIDAgLyogV2hhdCBkb2VzIHRoaXMgZG8/IFtzZWUgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzXSAgKi8KLSAgc2VnX2luZm8gKGJzc19zZWN0aW9uKS0+YnNzID0gMTsKLSNlbmRpZgotCi0gIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLQotICAvKiBXZSBtdXN0IGNvbnN0cnVjdCBhIGZha2Ugc2VjdGlvbiBzaW1pbGFyIHRvIGJmZF9jb21fc2VjdGlvbgotICAgICBidXQgd2l0aCB0aGUgbmFtZSAuc2NvbW1vbi4gICovCi0gIHNjb21fc2VjdGlvbiAgICAgICAgICAgICAgICA9IGJmZF9jb21fc2VjdGlvbjsKLSAgc2NvbV9zZWN0aW9uLm5hbWUgICAgICAgICAgID0gIi5zY29tbW9uIjsKLSAgc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiBzY29tX3NlY3Rpb247Ci0gIHNjb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgc2NvbV9zeW1ib2w7Ci0gIHNjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgc2NvbV9zZWN0aW9uLnN5bWJvbDsKLSAgc2NvbV9zeW1ib2wgICAgICAgICAgICAgICAgID0gKiBiZmRfY29tX3NlY3Rpb24uc3ltYm9sOwotICBzY29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnNjb21tb24iOwotICBzY29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHNjb21fc2VjdGlvbjsKLQotICBhbGxvd19tMzJyeCAoZW5hYmxlX20zMnJ4KTsKLX0KLQotI2RlZmluZSBPUEVSQU5EX0lTX0NPTkRfQklUKG9wZXJhbmQsIGluZGljZXMsIGluZGV4KSBcCi0gICgob3BlcmFuZCktPmh3X3R5cGUgPT0gSFdfSF9DT05ECQkJXAotICAgfHwgKChvcGVyYW5kKS0+aHdfdHlwZSA9PSBIV19IX1BTVykJCQlcCi0gICB8fCAoKG9wZXJhbmQpLT5od190eXBlID09IEhXX0hfQ1IJCQlcCi0gICAgICAgJiYgKGluZGljZXMgW2luZGV4XSA9PSAwIHx8IGluZGljZXMgW2luZGV4XSA9PSAxKSkpCi0KLS8qIFJldHVybnMgdHJ1ZSBpZiBhbiBvdXRwdXQgb2YgaW5zdHJ1Y3Rpb24gJ2EnIGlzIHJlZmVyZW5jZWQgYnkgYW4gb3BlcmFuZAotICAgb2YgaW5zdHJ1Y3Rpb24gJ2InLiAgSWYgJ2NoZWNrX291dHB1dHMnIGlzIHRydWUgdGhlbiBiJ3Mgb3V0cHV0cyBhcmUKLSAgIGNoZWNrZWQsIG90aGVyd2lzZSBpdHMgaW5wdXRzIGFyZSBleGFtaW5lZC4gICovCi0KLXN0YXRpYyBpbnQKLWZpcnN0X3dyaXRlc190b19zZWNvbmRzX29wZXJhbmRzIChhLCBiLCBjaGVja19vdXRwdXRzKQotICAgICBtMzJyX2luc24gKiBhOwotICAgICBtMzJyX2luc24gKiBiOwotICAgICBjb25zdCBpbnQgICBjaGVja19vdXRwdXRzOwotewotICBjb25zdCBDR0VOX09QSU5TVCAqIGFfb3BlcmFuZHMgPSBDR0VOX0lOU05fT1BFUkFORFMgKGEtPmluc24pOwotICBjb25zdCBDR0VOX09QSU5TVCAqIGJfb3BzID0gQ0dFTl9JTlNOX09QRVJBTkRTIChiLT5pbnNuKTsKLSAgaW50IGFfaW5kZXg7Ci0KLSAgLyogSWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbnN0cnVjdGlvbnMgdGFrZXMgbm8gb3BlcmFuZHMsIHRoZW4gdGhlcmUgaXMKLSAgICAgbm90aGluZyB0byBjaGVjay4gIFRoZXJlIHJlYWxseSBhcmUgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgb3BlcmFuZHMsCi0gICAgIGVnICdub3AnLiAgKi8KLSAgaWYgKGFfb3BlcmFuZHMgPT0gTlVMTCB8fCBiX29wcyA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAgICAgCi0gIC8qIFNjYW4gdGhlIG9wZXJhbmQgbGlzdCBvZiAnYScgbG9va2luZyBmb3IgYW4gb3V0cHV0IG9wZXJhbmQuICAqLwotICBmb3IgKGFfaW5kZXggPSAwOwotICAgICAgIGFfb3BlcmFuZHMtPnR5cGUgIT0gQ0dFTl9PUElOU1RfRU5EOwotICAgICAgIGFfaW5kZXggKyssIGFfb3BlcmFuZHMgKyspCi0gICAgewotICAgICAgaWYgKGFfb3BlcmFuZHMtPnR5cGUgPT0gQ0dFTl9PUElOU1RfT1VUUFVUKQotCXsKLQkgIGludCBiX2luZGV4OwotCSAgY29uc3QgQ0dFTl9PUElOU1QgKiBiX29wZXJhbmRzID0gYl9vcHM7Ci0KLQkgIC8qIFNwZWNpYWwgQ2FzZToKLQkgICAgIFRoZSBDb25kaXRpb24gYml0ICdDJyBpcyBhIHNoYWRvdyBvZiB0aGUgQ0JSIHJlZ2lzdGVyIChjb250cm9sCi0JICAgICByZWdpc3RlciAxKSBhbmQgYWxzbyBhIHNoYWRvdyBvZiBiaXQgMzEgb2YgdGhlIHByb2dyYW0gc3RhdHVzCi0JICAgICB3b3JkIChjb250cm9sIHJlZ2lzdGVyIDApLiAgRm9yIG5vdyB0aGlzIGlzIGhhbmRsZWQgaGVyZSwgcmF0aGVyCi0JICAgICB0aGFuIGJ5IGNnZW4uLi4uICovCi0JICAKLQkgIGlmIChPUEVSQU5EX0lTX0NPTkRfQklUIChhX29wZXJhbmRzLCBhLT5pbmRpY2VzLCBhX2luZGV4KSkKLQkgICAgewotCSAgICAgIC8qIFNjYW4gb3BlcmFuZCBsaXN0IG9mICdiJyBsb29raW5nIGZvciBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUKLQkJIGNvbmRpdGlvbiBiaXQsIHdoaWNoIGdvZXMgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4gICovCi0JICAgICAgZm9yIChiX2luZGV4ID0gMDsKLQkJICAgYl9vcGVyYW5kcy0+dHlwZSAhPSBDR0VOX09QSU5TVF9FTkQ7Ci0JCSAgIGJfaW5kZXggKyssIGJfb3BlcmFuZHMgKyspCi0JCXsKLQkJICBpZiAoKGJfb3BlcmFuZHMtPnR5cGUKLQkJICAgICAgID09IChjaGVja19vdXRwdXRzCi0JCQkgICA/IENHRU5fT1BJTlNUX09VVFBVVAotCQkJICAgOiBDR0VOX09QSU5TVF9JTlBVVCkpCi0JCSAgICAgICYmIE9QRVJBTkRfSVNfQ09ORF9CSVQgKGJfb3BlcmFuZHMsIGItPmluZGljZXMsIGJfaW5kZXgpKQotCQkgICAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2NhbiBvcGVyYW5kIGxpc3Qgb2YgJ2InIGxvb2tpbmcgZm9yIGFuIG9wZXJhbmQgdGhhdAotCQkgcmVmZXJlbmNlcyB0aGUgc2FtZSBoYXJkd2FyZSBlbGVtZW50LCBhbmQgd2hpY2ggZ29lcyBpbiB0aGUKLQkJIHJpZ2h0IGRpcmVjdGlvbi4gICovCi0JICAgICAgZm9yIChiX2luZGV4ID0gMDsKLQkJICAgYl9vcGVyYW5kcy0+dHlwZSAhPSBDR0VOX09QSU5TVF9FTkQ7Ci0JCSAgIGJfaW5kZXggKyssIGJfb3BlcmFuZHMgKyspCi0JCXsKLQkJICBpZiAoKGJfb3BlcmFuZHMtPnR5cGUKLQkJICAgICAgID09IChjaGVja19vdXRwdXRzCi0JCQkgICA/IENHRU5fT1BJTlNUX09VVFBVVAotCQkJICAgOiBDR0VOX09QSU5TVF9JTlBVVCkpCi0JCSAgICAgICYmIChiX29wZXJhbmRzLT5od190eXBlID09IGFfb3BlcmFuZHMtPmh3X3R5cGUpCi0JCSAgICAgICYmIChhLT5pbmRpY2VzIFthX2luZGV4XSA9PSBiLT5pbmRpY2VzIFtiX2luZGV4XSkpCi0JCSAgICByZXR1cm4gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJucyB0cnVlIGlmIHRoZSBpbnNuIGNhbiAocG90ZW50aWFsbHkpIGFsdGVyIHRoZSBwcm9ncmFtIGNvdW50ZXIuICAqLwotCi1zdGF0aWMgaW50Ci13cml0ZXNfdG9fcGMgKGEpCi0gICAgIG0zMnJfaW5zbiAqIGE7Ci17Ci0jaWYgMCAgLyogT25jZSBQQyBvcGVyYW5kcyBhcmUgd29ya2luZy4uLi4gKi8KLSAgY29uc3QgQ0dFTl9PUElOU1QgKiBhX29wZXJhbmRzID09IENHRU5fSU5TTl9PUEVSQU5EUyAoZ2FzX2NnZW5fY3B1X2Rlc2MsCi0JCQkJCQkJYS0+aW5zbik7Ci0KLSAgaWYgKGFfb3BlcmFuZHMgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICB3aGlsZSAoYV9vcGVyYW5kcy0+dHlwZSAhPSBDR0VOX09QSU5TVF9FTkQpCi0gICAgewotICAgICAgaWYgKGFfb3BlcmFuZHMtPm9wZXJhbmQgIT0gTlVMTAotCSAgJiYgQ0dFTl9PUEVSQU5EX0lOREVYIChnYXNfY2dlbl9jcHVfZGVzYywgYV9vcGVyYW5kcy0+b3BlcmFuZCkgPT0gTTMyUl9PUEVSQU5EX1BDKQotCXJldHVybiAxOwotICAgICAgCi0gICAgICBhX29wZXJhbmRzICsrOwotICAgIH0KLSNlbHNlCi0gIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoYS0+aW5zbiwgQ0dFTl9JTlNOX1VOQ09ORF9DVEkpCi0gICAgICB8fCBDR0VOX0lOU05fQVRUUl9WQUxVRSAoYS0+aW5zbiwgQ0dFTl9JTlNOX0NPTkRfQ1RJKSkKLSAgICByZXR1cm4gMTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJucyBOVUxMIGlmIHRoZSB0d28gMTYgYml0IGluc25zIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCwKLSAgIG90aGVyd2lzZSBpdCByZXR1cm5zIGEgcG9pbnRlciB0byBhbiBlcnJvciBtZXNzYWdlIGV4cGxhaW5pbmcgd2h5IG5vdC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWNhbl9tYWtlX3BhcmFsbGVsIChhLCBiKQotICAgICBtMzJyX2luc24gKiBhOwotICAgICBtMzJyX2luc24gKiBiOwotewotICBQSVBFX0FUVFIgYV9waXBlOwotICBQSVBFX0FUVFIgYl9waXBlOwotICAKLSAgLyogTWFrZSBzdXJlIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHRoZSByaWdodCBsZW5ndGguICAqLwotICBpZiAoICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBhLT5maWVsZHMpICE9IDE2Ci0gICAgICB8fCBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGItPmZpZWxkcykgIT0gMTYpCi0gICAgYWJvcnQoKTsKLQotICBpZiAoZmlyc3Rfd3JpdGVzX3RvX3NlY29uZHNfb3BlcmFuZHMgKGEsIGIsIHRydWUpKQotICAgIHJldHVybiBfKCJJbnN0cnVjdGlvbnMgd3JpdGUgdG8gdGhlIHNhbWUgZGVzdGluYXRpb24gcmVnaXN0ZXIuIik7Ci0gIAotICBhX3BpcGUgPSBDR0VOX0lOU05fQVRUUl9WQUxVRSAoYS0+aW5zbiwgQ0dFTl9JTlNOX1BJUEUpOwotICBiX3BpcGUgPSBDR0VOX0lOU05fQVRUUl9WQUxVRSAoYi0+aW5zbiwgQ0dFTl9JTlNOX1BJUEUpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgdXNlIHRoZSBjb3JyZWN0IGV4ZWN1dGlvbiBwaXBlbGluZXMuICAqLwotICBpZiAoICAgYV9waXBlID09IFBJUEVfTk9ORQotICAgICAgfHwgYl9waXBlID09IFBJUEVfTk9ORSkKLSAgICByZXR1cm4gXygiSW5zdHJ1Y3Rpb25zIGRvIG5vdCB1c2UgcGFyYWxsZWwgZXhlY3V0aW9uIHBpcGVsaW5lcy4iKTsKLQotICAvKiBMZWF2ZSB0aGlzIHRlc3QgZm9yIGxhc3QsIHNpbmNlIGl0IGlzIHRoZSBvbmx5IHRlc3QgdGhhdCBjYW4KLSAgICAgZ28gYXdheSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBzd2FwcGVkLCBhbmQgd2Ugd2FudCB0byBtYWtlCi0gICAgIHN1cmUgdGhhdCBhbnkgb3RoZXIgZXJyb3JzIGFyZSBkZXRlY3RlZCBiZWZvcmUgdGhpcyBoYXBwZW5zLiAgKi8KLSAgaWYgKCAgIGFfcGlwZSA9PSBQSVBFX1MKLSAgICAgIHx8IGJfcGlwZSA9PSBQSVBFX08pCi0gICAgcmV0dXJuIF8oIkluc3RydWN0aW9ucyBzaGFyZSB0aGUgc2FtZSBleGVjdXRpb24gcGlwZWxpbmUiKTsKLSAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBGb3JjZSB0aGUgdG9wIGJpdCBvZiB0aGUgc2Vjb25kIDE2LWJpdCBpbnNuIHRvIGJlIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1tYWtlX3BhcmFsbGVsIChidWZmZXIpCi0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotewotI2lmIENHRU5fSU5UX0lOU05fUAotICAqYnVmZmVyIHw9IDB4ODAwMDsKLSNlbHNlCi0gIGJ1ZmZlciBbQ0dFTl9DUFVfRU5ESUFOIChnYXNfY2dlbl9jcHVfZGVzYykgPT0gQ0dFTl9FTkRJQU5fQklHID8gMCA6IDFdCi0gICAgfD0gMHg4MDsKLSNlbmRpZgotfQotCi0vKiBTYW1lIGFzIG1ha2VfcGFyYWxsZWwgZXhjZXB0IGJ1ZmZlciBjb250YWlucyB0aGUgYnl0ZXMgaW4gdGFyZ2V0IG9yZGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXRhcmdldF9tYWtlX3BhcmFsbGVsIChidWZmZXIpCi0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgYnVmZmVyIFtDR0VOX0NQVV9FTkRJQU4gKGdhc19jZ2VuX2NwdV9kZXNjKSA9PSBDR0VOX0VORElBTl9CSUcgPyAwIDogMV0KLSAgICB8PSAweDgwOwotfQotCi0vKiBBc3NlbWJsZSB0d28gaW5zdHJ1Y3Rpb25zIHdpdGggYW4gZXhwbGljaXQgcGFyYWxsZWwgb3BlcmF0aW9uICh8fCkgb3IKLSAgIHNlcXVlbnRpYWwgb3BlcmF0aW9uICgtPikuICAqLwotCi1zdGF0aWMgdm9pZAotYXNzZW1ibGVfdHdvX2luc25zIChzdHIsIHN0cjIsIHBhcmFsbGVsX3ApCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGNoYXIgKiBzdHIyOwotICAgICBpbnQgICAgcGFyYWxsZWxfcDsKLXsKLSAgY2hhciAqICAgIHN0cjM7Ci0gIG0zMnJfaW5zbiBmaXJzdDsKLSAgbTMycl9pbnNuIHNlY29uZDsKLSAgY2hhciAqICAgIGVycm1zZzsKLSAgY2hhciAgICAgIHNhdmVfc3RyMiA9ICpzdHIyOwotCi0gICogc3RyMiA9IDA7IC8qIFNlcGVyYXRlIHRoZSB0d28gaW5zdHJ1Y3Rpb25zLiAgKi8KLQotICAvKiBNYWtlIHN1cmUgdGhlIHR3byBpbnNucyBiZWdpbiBvbiBhIDMyIGJpdCBib3VuZGFyeS4KLSAgICAgVGhpcyBpcyBhbHNvIGRvbmUgZm9yIHRoZSBzZXJpYWwgY2FzZSAoZm9vIC0+IGJhciksIHJlbGF4aW5nIGRvZXNuJ3QKLSAgICAgYWZmZWN0IGluc25zIHdyaXR0ZW4gbGlrZSB0aGlzLgotICAgICBOb3RlIHRoYXQgd2UgbXVzdCBhbHdheXMgZG8gdGhpcyBhcyB3ZSBjYW4ndCBhc3N1bWUgYW55dGhpbmcgYWJvdXQKLSAgICAgd2hldGhlciB3ZSdyZSBjdXJyZW50bHkgb24gYSAzMiBiaXQgYm91bmRhcnkgb3Igbm90LiAgUmVsYXhpbmcgbWF5Ci0gICAgIGNoYW5nZSB0aGlzLiAgKi8KLSAgZmlsbF9pbnNuICgwKTsKLQotICBmaXJzdC5kZWJ1Z19zeW1fbGluayA9IGRlYnVnX3N5bV9saW5rOwotICBkZWJ1Z19zeW1fbGluayA9IChzeW1fbGlua1MgKikwOwotCi0gIC8qIFBhcnNlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4gICovCi0gIGlmICghIChmaXJzdC5pbnNuID0gbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24KLQkgKGdhc19jZ2VuX2NwdV9kZXNjLCBzdHIsICYgZmlyc3QuZmllbGRzLCBmaXJzdC5idWZmZXIsICYgZXJybXNnKSkpCi0gICAgewotICAgICAgYXNfYmFkIChlcnJtc2cpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBDaGVjayBpdC4gICovCi0gIGlmIChDR0VOX0ZJRUxEU19CSVRTSVpFICgmZmlyc3QuZmllbGRzKSAhPSAxNikKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJub3QgYSAxNiBiaXQgaW5zdHJ1Y3Rpb24gJyVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoISBlbmFibGVfc3BlY2lhbAotICAgICAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGZpcnN0Lmluc24sIENHRU5fSU5TTl9TUEVDSUFMKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIGluc3RydWN0aW9uICclcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZW5hYmxlX20zMnJ4Ci0gICAgICAvKiBGSVhNRTogTmVlZCBzdGFuZGFyZCBtYWNybyB0byBwZXJmb3JtIHRoaXMgdGVzdC4gICovCi0gICAgICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoZmlyc3QuaW5zbiwgQ0dFTl9JTlNOX01BQ0gpID09ICgxIDw8IE1BQ0hfTTMyUlgpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oImluc3RydWN0aW9uICclcycgaXMgZm9yIHRoZSBNMzJSWCBvbmx5IiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiBhbGxvd2FibGUgcGFyYWxsZWwgaW5zbi4gICovCi0gIGlmIChwYXJhbGxlbF9wICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChmaXJzdC5pbnNuLCBDR0VOX0lOU05fUElQRSkgPT0gUElQRV9OT05FKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oImluc3RydWN0aW9uICclcycgY2Fubm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gICpzdHIyID0gc2F2ZV9zdHIyOyAvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBhc3NlbWJseSB0ZXh0LCBqdXN0IGluIGNhc2UgaXQgaXMgbmVlZGVkLiAgKi8KLSAgc3RyMyAgPSBzdHI7ICAgICAgIC8qIFNhdmUgdGhlIG9yaWdpbmFsIHN0cmluZyBwb2ludGVyLiAgKi8KLSAgc3RyICAgPSBzdHIyICsgMjsgIC8qIEFkdmFuY2VkIHBhc3QgdGhlIHBhcnNlZCBzdHJpbmcuICAqLwotICBzdHIyICA9IHN0cjM7ICAgICAgLyogUmVtZW1iZXIgdGhlIGVudGlyZSBzdHJpbmcgaW4gY2FzZSBpdCBpcyBuZWVkZWQgZm9yIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotICAvKiBDb252ZXJ0IHRoZSBvcGNvZGUgdG8gbG93ZXIgY2FzZS4gICovCi0gIHsKLSAgICBjaGFyICpzMiA9IHN0cjsKLSAgICAKLSAgICB3aGlsZSAoaXNzcGFjZSAoKnMyICsrKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLS1zMjsKLQotICAgIHdoaWxlIChpc2FsbnVtICgqczIpKQotICAgICAgewotCWlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMyKSkKLQkgICpzMiA9IHRvbG93ZXIgKCpzMik7Ci0JczIgKys7Ci0gICAgICB9Ci0gIH0KLSAgCi0gIC8qIFByZXNlcnZlIGFueSBmaXh1cHMgdGhhdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGFuZCByZXNldCB0aGUgbGlzdCB0byBlbXB0eS4gICovCi0gIGdhc19jZ2VuX3NhdmVfZml4dXBzICgpOwotCi0gIC8qIEdldCB0aGUgaW5kaWNlcyBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IENHRU5fRklFTERTIGlzIGFscmVhZHkgcmVjb3JkZWQsIGJ1dCByZWx5aW5nIG9uIHRoYXQgZmFjdAotICAgICBkb2Vzbid0IHNlZW0gcmlnaHQuICBQZXJoYXBzIGFsbG93IHBhc3NpbmcgZmllbGRzIGxpa2Ugd2UgZG8gaW5zbi4gICovCi0gIC8qIEZJWE1FOiBBTElBUyBpbnNucyBkbyBub3QgaGF2ZSBvcGVyYW5kcywgc28gd2UgdXNlIHRoaXMgZnVuY3Rpb24KLSAgICAgdG8gZmluZCB0aGUgZXF1aXZhbGVudCBpbnNuIGFuZCBvdmVyd3JpdGUgdGhlIHZhbHVlIHN0b3JlZCBpbiBvdXIKLSAgICAgc3RydWN0dXJlLiAgV2Ugc3RpbGwgbmVlZCB0aGUgb3JpZ2luYWwgaW5zbiwgaG93ZXZlciwgc2luY2UgdGhpcwotICAgICBtYXkgaGF2ZSBjZXJ0YWluIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIHVuYWxpYXNlZAotICAgICB2ZXJzaW9uIChlZyByZWxheGFiaWxpdHkpLiAgV2hlbiBhbGlhc2VzIGJlaGF2ZSBkaWZmZXJlbnRseSB0aGlzCi0gICAgIG1heSBoYXZlIHRvIGNoYW5nZS4gICovCi0gIGZpcnN0Lm9yaWdfaW5zbiA9IGZpcnN0Lmluc247Ci0gIHsKLSAgICBDR0VOX0ZJRUxEUyB0bXBfZmllbGRzOwotICAgIGZpcnN0Lmluc24gPSBjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcwotICAgICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBOVUxMLCBJTlNOX1ZBTFVFIChmaXJzdC5idWZmZXIpLCBOVUxMLCAxNiwKLSAgICAgICBmaXJzdC5pbmRpY2VzLCAmdG1wX2ZpZWxkcyk7Ci0gIH0KLSAgCi0gIGlmIChmaXJzdC5pbnNuID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yOiBsb29rdXAvZ2V0IG9wZXJhbmRzIGZhaWxlZCIpKTsKLQotICBzZWNvbmQuZGVidWdfc3ltX2xpbmsgPSBOVUxMOwotCi0gIC8qIFBhcnNlIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoISAoc2Vjb25kLmluc24gPSBtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbgotCSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIHN0ciwgJiBzZWNvbmQuZmllbGRzLCBzZWNvbmQuYnVmZmVyLCAmIGVycm1zZykpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoZXJybXNnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgaXQuICAqLwotICBpZiAoQ0dFTl9GSUVMRFNfQklUU0laRSAoJnNlY29uZC5maWVsZHMpICE9IDE2KQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oIm5vdCBhIDE2IGJpdCBpbnN0cnVjdGlvbiAnJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlIGlmICghIGVuYWJsZV9zcGVjaWFsCi0gICAgICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoc2Vjb25kLmluc24sIENHRU5fSU5TTl9TUEVDSUFMKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIGluc3RydWN0aW9uICclcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZW5hYmxlX20zMnJ4Ci0gICAgICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoc2Vjb25kLmluc24sIENHRU5fSU5TTl9NQUNIKSA9PSAoMSA8PCBNQUNIX00zMlJYKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJpbnN0cnVjdGlvbiAnJXMnIGlzIGZvciB0aGUgTTMyUlggb25seSIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiBhbGxvd2FibGUgcGFyYWxsZWwgaW5zbi4gICovCi0gIGlmIChwYXJhbGxlbF9wICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChzZWNvbmQuaW5zbiwgQ0dFTl9JTlNOX1BJUEUpID09IFBJUEVfTk9ORSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJpbnN0cnVjdGlvbiAnJXMnIGNhbm5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4iKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpZiAocGFyYWxsZWxfcCAmJiAhIGVuYWJsZV9tMzJyeCkKLSAgICB7Ci0gICAgICBpZiAoQ0dFTl9JTlNOX05VTSAoZmlyc3QuaW5zbikgIT0gTTMyUl9JTlNOX05PUAotCSAgJiYgQ0dFTl9JTlNOX05VTSAoc2Vjb25kLmluc24pICE9IE0zMlJfSU5TTl9OT1ApCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGFzX2JhZCAoXygiJyVzJzogb25seSB0aGUgTk9QIGluc3RydWN0aW9uIGNhbiBiZSBpc3N1ZWQgaW4gcGFyYWxsZWwgb24gdGhlIG0zMnIiKSwgc3RyMik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBHZXQgdGhlIGluZGljZXMgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIHNlY29uZC5vcmlnX2luc24gPSBzZWNvbmQuaW5zbjsKLSAgewotICAgIENHRU5fRklFTERTIHRtcF9maWVsZHM7Ci0gICAgc2Vjb25kLmluc24gPSBjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcwotICAgICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBOVUxMLCBJTlNOX1ZBTFVFIChzZWNvbmQuYnVmZmVyKSwgTlVMTCwgMTYsCi0gICAgICAgc2Vjb25kLmluZGljZXMsICZ0bXBfZmllbGRzKTsKLSAgfQotICAKLSAgaWYgKHNlY29uZC5pbnNuID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yOiBsb29rdXAvZ2V0IG9wZXJhbmRzIGZhaWxlZCIpKTsKLQotICAvKiBXZSBhc3N1bWUgdGhhdCBpZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd3JpdGVzIHRvIGEgcmVnaXN0ZXIgdGhhdCBpcwotICAgICByZWFkIGJ5IHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gaXQgaXMgYmVjYXVzZSB0aGUgcHJvZ3JhbW1lciBpbnRlbmRlZAotICAgICB0aGlzIHRvIGhhcHBlbiwgKGFmdGVyIGFsbCB0aGV5IGhhdmUgZXhwbGljaXRseSByZXF1ZXN0ZWQgdGhhdCB0aGVzZQotICAgICB0d28gaW5zdHJ1Y3Rpb25zIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsKS4gIEFsdGhvdWdoIGlmIHRoZSBnbG9iYWwKLSAgICAgdmFyaWFibGUgd2Fybl9leHBsaWNpdF9wYXJhbGxlbF9jb25mbGljdHMgaXMgdHJ1ZSB0aGVuIHdlIGRvIGdlbmVyYXRlCi0gICAgIGEgd2FybmluZyBtZXNzYWdlLiAgU2ltaWxhcmx5IHdlIGFzc3VtZSB0aGF0IHBhcmFsbGVsIGJyYW5jaCBhbmQganVtcAotICAgICBpbnN0cnVjdGlvbnMgYXJlIGRlbGliZXJhdGUgYW5kIHNob3VsZCBub3QgcHJvZHVjZSBlcnJvcnMuICAqLwotICAKLSAgaWYgKHBhcmFsbGVsX3AgJiYgd2Fybl9leHBsaWNpdF9wYXJhbGxlbF9jb25mbGljdHMpCi0gICAgewotICAgICAgaWYgKGZpcnN0X3dyaXRlc190b19zZWNvbmRzX29wZXJhbmRzICgmIGZpcnN0LCAmIHNlY29uZCwgZmFsc2UpKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JYXNfd2FybiAoXygiJXM6IG91dHB1dCBvZiAxc3QgaW5zdHJ1Y3Rpb24gaXMgdGhlIHNhbWUgYXMgYW4gaW5wdXQgdG8gMm5kIGluc3RydWN0aW9uIC0gaXMgdGhpcyBpbnRlbnRpb25hbCA/IiksIHN0cjIpOwotICAgICAgCi0gICAgICBpZiAoZmlyc3Rfd3JpdGVzX3RvX3NlY29uZHNfb3BlcmFuZHMgKCYgc2Vjb25kLCAmIGZpcnN0LCBmYWxzZSkpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlhc193YXJuIChfKCIlczogb3V0cHV0IG9mIDJuZCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAxc3QgaW5zdHJ1Y3Rpb24gLSBpcyB0aGlzIGludGVudGlvbmFsID8iKSwgc3RyMik7Ci0gICAgfQotICAgICAgCi0gIGlmICghcGFyYWxsZWxfcAotICAgICAgfHwgKGVycm1zZyA9IChjaGFyICopIGNhbl9tYWtlX3BhcmFsbGVsICgmIGZpcnN0LCAmIHNlY29uZCkpID09IE5VTEwpCi0gICAgewotICAgICAgLyogR2V0IHRoZSBmaXh1cHMgZm9yIHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBnYXNfY2dlbl9zd2FwX2ZpeHVwcyAoKTsKLQotICAgICAgLyogV3JpdGUgaXQgb3V0LiAgKi8KLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChmaXJzdC5kZWJ1Z19zeW1fbGluaywgMSk7Ci0gICAgICBnYXNfY2dlbl9maW5pc2hfaW5zbiAoZmlyc3Qub3JpZ19pbnNuLCBmaXJzdC5idWZmZXIsCi0JCQkgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBmaXJzdC5maWVsZHMpLCAwLCBOVUxMKTsKLSAgICAgIAotICAgICAgLyogRm9yY2UgdGhlIHRvcCBiaXQgb2YgdGhlIHNlY29uZCBpbnNuIHRvIGJlIHNldC4gICovCi0gICAgICBpZiAocGFyYWxsZWxfcCkKLQltYWtlX3BhcmFsbGVsIChzZWNvbmQuYnVmZmVyKTsKLQotICAgICAgLyogR2V0IGl0cyBmaXh1cHMuICAqLwotICAgICAgZ2FzX2NnZW5fcmVzdG9yZV9maXh1cHMgKCk7Ci0KLSAgICAgIC8qIFdyaXRlIGl0IG91dC4gICovCi0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoc2Vjb25kLmRlYnVnX3N5bV9saW5rLCAxKTsKLSAgICAgIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChzZWNvbmQub3JpZ19pbnNuLCBzZWNvbmQuYnVmZmVyLAotCQkJICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgc2Vjb25kLmZpZWxkcyksIDAsIE5VTEwpOwotICAgIH0KLSAgLyogVHJ5IHN3YXBwaW5nIHRoZSBpbnN0cnVjdGlvbnMgdG8gc2VlIGlmIHRoZXkgd29yayB0aGF0IHdheS4gICovCi0gIGVsc2UgaWYgKGNhbl9tYWtlX3BhcmFsbGVsICgmIHNlY29uZCwgJiBmaXJzdCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXcml0ZSBvdXQgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBmaXJzdC4gICovCi0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoc2Vjb25kLmRlYnVnX3N5bV9saW5rLCAxKTsKLSAgICAgIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChzZWNvbmQub3JpZ19pbnNuLCBzZWNvbmQuYnVmZmVyLAotCQkJICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgc2Vjb25kLmZpZWxkcyksIDAsIE5VTEwpOwotICAgICAgCi0gICAgICAvKiBGb3JjZSB0aGUgdG9wIGJpdCBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gdG8gYmUgc2V0LiAgKi8KLSAgICAgIG1ha2VfcGFyYWxsZWwgKGZpcnN0LmJ1ZmZlcik7Ci0KLSAgICAgIC8qIEdldCB0aGUgZml4dXBzIGZvciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZ2FzX2NnZW5fcmVzdG9yZV9maXh1cHMgKCk7Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGZpcnN0LmRlYnVnX3N5bV9saW5rLCAxKTsKLSAgICAgIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChmaXJzdC5vcmlnX2luc24sIGZpcnN0LmJ1ZmZlciwKLQkJCSAgICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGZpcnN0LmZpZWxkcyksIDAsIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoIiclcyc6ICVzIiwgc3RyMiwgZXJybXNnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAKLSAgLyogU2V0IHRoZXNlIHNvIG0zMnJfZmlsbF9pbnNuIGNhbiB1c2UgdGhlbS4gICovCi0gIHByZXZfc2VnICAgID0gbm93X3NlZzsKLSAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBtMzJyX2luc24gaW5zbjsKLSAgY2hhciAqICAgIGVycm1zZzsKLSAgY2hhciAqICAgIHN0cjIgPSBOVUxMOwotCi0gIC8qIEluaXRpYWxpemUgR0FTJ3MgY2dlbiBpbnRlcmZhY2UgZm9yIGEgbmV3IGluc3RydWN0aW9uLiAgKi8KLSAgZ2FzX2NnZW5faW5pdF9wYXJzZSAoKTsKLQotICAvKiBMb29rIGZvciBhIHBhcmFsbGVsIGluc3RydWN0aW9uIHNlcGVyYXRvci4gICovCi0gIGlmICgoc3RyMiA9IHN0cnN0ciAoc3RyLCAifHwiKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlbWJsZV90d29faW5zbnMgKHN0ciwgc3RyMiwgMSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEFsc28gbG9vayBmb3IgYSBzZXF1ZW50aWFsIGluc3RydWN0aW9uIHNlcGVyYXRvci4gICovCi0gIGlmICgoc3RyMiA9IHN0cnN0ciAoc3RyLCAiLT4iKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlbWJsZV90d29faW5zbnMgKHN0ciwgc3RyMiwgMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaW5zbi5kZWJ1Z19zeW1fbGluayA9IGRlYnVnX3N5bV9saW5rOwotICBkZWJ1Z19zeW1fbGluayA9IChzeW1fbGlua1MgKikwOwotCi0gIGluc24uaW5zbiA9IG0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuCi0gICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBzdHIsICYgaW5zbi5maWVsZHMsIGluc24uYnVmZmVyLCAmIGVycm1zZyk7Ci0gIAotICBpZiAoIWluc24uaW5zbikKLSAgICB7Ci0gICAgICBhc19iYWQgKGVycm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICghIGVuYWJsZV9zcGVjaWFsCi0gICAgICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5pbnNuLCBDR0VOX0lOU05fU1BFQ0lBTCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBpbnN0cnVjdGlvbiAnJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlIGlmICghIGVuYWJsZV9tMzJyeAotCSAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLmluc24sIENHRU5fSU5TTl9NQUNIKSA9PSAoMSA8PCBNQUNIX00zMlJYKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJpbnN0cnVjdGlvbiAnJXMnIGlzIGZvciB0aGUgTTMyUlggb25seSIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGlmIChDR0VOX0lOU05fQklUU0laRSAoaW5zbi5pbnNuKSA9PSAzMikKLSAgICB7Ci0gICAgICAvKiAzMiBiaXQgaW5zbnMgbXVzdCBsaXZlIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KLSAgICAgIGlmIChwcmV2X2luc24uaW5zbiB8fCBzZWVuX3JlbGF4YWJsZV9wKQotCXsKLQkgIC8qID8/PyBJZiBjYWxsaW5nIGZpbGxfaW5zbiB0b28gbWFueSB0aW1lcyB0dXJucyB1cyBpbnRvIGEgbWVtb3J5Ci0JICAgICBwaWcsIGNhbiB3ZSBjYWxsIGEgZm4gdG8gYXNzZW1ibGUgYSBub3AgaW5zdGVhZCBvZgotCSAgICAgIXNlZW5fcmVsYXhhYmxlX3A/ICAqLwotCSAgZmlsbF9pbnNuICgwKTsKLQl9Ci0KLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChpbnNuLmRlYnVnX3N5bV9saW5rLCAyKTsKLQotICAgICAgLyogRG9lc24ndCByZWFsbHkgbWF0dGVyIHdoYXQgd2UgcGFzcyBmb3IgUkVMQVhfUCBoZXJlLiAgKi8KLSAgICAgIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLmluc24sIGluc24uYnVmZmVyLAotCQkJICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgaW5zbi5maWVsZHMpLCAxLCBOVUxMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgb25fMzJiaXRfYm91bmRhcnlfcDsKLSAgICAgIGludCBzd2FwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChDR0VOX0lOU05fQklUU0laRSAoaW5zbi5pbnNuKSAhPSAxNikKLQlhYm9ydCgpOwotCi0gICAgICBpbnNuLm9yaWdfaW5zbiA9IGluc24uaW5zbjsKLQotICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc24gd2FzIHJlbGF4YWJsZSwgdGhlbiBpdCBtYXkgYmUgZXhwYW5kZWQKLQkgdG8gZmlsbCB0aGUgY3VycmVudCAxNiBiaXQgc2xvdC4gIEVtaXQgYSBOT1AgaGVyZSB0byBvY2N1cHkKLQkgdGhpcyBzbG90LCBzbyB0aGF0IHdlIGNhbiBzdGFydCBhdCBvcHRpbWl6aW5nIGF0IGEgMzIgYml0Ci0JIGJvdW5kYXJ5LiAgKi8KLSAgICAgIGlmIChwcmV2X2luc24uaW5zbiAmJiBzZWVuX3JlbGF4YWJsZV9wICYmIG9wdGltaXplKQotCWZpbGxfaW5zbiAoMCk7Ci0gICAgICAKLSAgICAgIGlmIChlbmFibGVfbTMycngpCi0JewotCSAgLyogR2V0IHRoZSBpbmRpY2VzIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0JICAgICBGSVhNRTogU2VlIGFzc2VtYmxlX3BhcmFsbGVsIGZvciBub3RlcyBvbiBvcmlnX2luc24uICAqLwotCSAgewotCSAgICBDR0VOX0ZJRUxEUyB0bXBfZmllbGRzOwotCSAgICBpbnNuLmluc24gPSBjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcwotCSAgICAgIChnYXNfY2dlbl9jcHVfZGVzYywgTlVMTCwgSU5TTl9WQUxVRSAoaW5zbi5idWZmZXIpLCBOVUxMLAotCSAgICAgICAxNiwgaW5zbi5pbmRpY2VzLCAmdG1wX2ZpZWxkcyk7Ci0JICB9Ci0JICAKLQkgIGlmIChpbnNuLmluc24gPT0gTlVMTCkKLQkgICAgYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yOiBsb29rdXAvZ2V0IG9wZXJhbmRzIGZhaWxlZCIpKTsKLQl9Ci0KLSAgICAgIC8qIENvbXB1dGUgd2hldGhlciB3ZSdyZSBvbiBhIDMyIGJpdCBib3VuZGFyeSBvciBub3QuCi0JIHByZXZfaW5zbi5pbnNuIGlzIE5VTEwgd2hlbiB3ZSdyZSBvbiBhIDMyIGJpdCBib3VuZGFyeS4gICovCi0gICAgICBvbl8zMmJpdF9ib3VuZGFyeV9wID0gcHJldl9pbnNuLmluc24gPT0gTlVMTDsKLQotICAgICAgLyogTG9vayB0byBzZWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBjYW4gYmUgY29tYmluZWQgd2l0aCB0aGUKLQkgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gdG8gbWFrZSBvbmUsIHBhcmFsbGVsLCAzMiBiaXQgaW5zdHJ1Y3Rpb24uCi0JIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiAocG90ZW50aWFsbHkpIGNoYW5nZWQgdGhlIGZsb3cgb2YKLQkgcHJvZ3JhbSBjb250cm9sLCB0aGVuIGl0IGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIHRoZSBjdXJyZW50Ci0JIGluc3RydWN0aW9uLiAgSWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgcmVsYXhhYmxlLCB0aGVuIGl0Ci0JIG1pZ2h0IGJlIHJlcGxhY2VkIHdpdGggYSBsb25nZXIgdmVyc2lvbiwgc28gd2UgY2Fubm90IGNvbWJpbmUgaXQuCi0JIEFsc28gaWYgdGhlIG91dHB1dCBvZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgdXNlZCBhcyBhbgotCSBpbnB1dCB0byB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB0aGVuIGl0IGNhbm5vdCBiZSBjb21iaW5lZC4KLQkgT3RoZXJ3aXNlIGNhbGwgY2FuX21ha2VfcGFyYWxsZWwoKSB3aXRoIGJvdGggb3JkZXJpbmdzIG9mIHRoZQotCSBpbnN0cnVjdGlvbnMgdG8gc2VlIGlmIHRoZXkgY2FuIGJlIGNvbWJpbmVkLiAgKi8KLSAgICAgIGlmICggICAgICEgb25fMzJiaXRfYm91bmRhcnlfcAotCSAgJiYgICBlbmFibGVfbTMycngKLQkgICYmICAgb3B0aW1pemUKLQkgICYmICAgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24ub3JpZ19pbnNuLCBDR0VOX0lOU05fUkVMQVhBQkxFKSA9PSAwCi0JICAmJiAhIHdyaXRlc190b19wYyAoJiBwcmV2X2luc24pCi0JICAmJiAhIGZpcnN0X3dyaXRlc190b19zZWNvbmRzX29wZXJhbmRzICgmIHByZXZfaW5zbiwgJmluc24sIGZhbHNlKQotCSAgKQotCXsKLQkgIGlmIChjYW5fbWFrZV9wYXJhbGxlbCAoJiBwcmV2X2luc24sICYgaW5zbikgPT0gTlVMTCkKLQkgICAgbWFrZV9wYXJhbGxlbCAoaW5zbi5idWZmZXIpOwotCSAgZWxzZSBpZiAoY2FuX21ha2VfcGFyYWxsZWwgKCYgaW5zbiwgJiBwcmV2X2luc24pID09IE5VTEwpCi0JICAgIHN3YXAgPSB0cnVlOwotCX0KLQotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGluc24uZGVidWdfc3ltX2xpbmssIDEpOwotCi0gICAgICB7Ci0JaW50IGk7Ci0JZmluaXNoZWRfaW5zblMgZmk7Ci0KLQkvKiBFbnN1cmUgZWFjaCBwYWlyIG9mIDE2IGJpdCBpbnNucyBpcyBpbiB0aGUgc2FtZSBmcmFnLiAgKi8KLQlmcmFnX2dyb3cgKDQpOwotCi0JZ2FzX2NnZW5fZmluaXNoX2luc24gKGluc24ub3JpZ19pbnNuLCBpbnNuLmJ1ZmZlciwKLQkJCSAgICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgaW5zbi5maWVsZHMpLAotCQkJICAgICAgMSAvKnJlbGF4X3AqLywgJmZpKTsKLQlpbnNuLmFkZHIgPSBmaS5hZGRyOwotCWluc24uZnJhZyA9IGZpLmZyYWc7Ci0JaW5zbi5udW1fZml4dXBzID0gZmkubnVtX2ZpeHVwczsKLQlmb3IgKGkgPSAwOyBpIDwgZmkubnVtX2ZpeHVwczsgKytpKQotCSAgaW5zbi5maXh1cHNbaV0gPSBmaS5maXh1cHNbaV07Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzd2FwKQotCXsKLQkgIGludCBpLHRtcDsKLQotI2RlZmluZSBTV0FQX0JZVEVTKGEsYikgdG1wID0gYTsgYSA9IGI7IGIgPSB0bXAKLQotCSAgLyogU3dhcCB0aGUgdHdvIGluc25zICovCi0JICBTV0FQX0JZVEVTIChwcmV2X2luc24uYWRkciBbMF0sIGluc24uYWRkciBbMF0pOwotCSAgU1dBUF9CWVRFUyAocHJldl9pbnNuLmFkZHIgWzFdLCBpbnNuLmFkZHIgWzFdKTsKLQotCSAgdGFyZ2V0X21ha2VfcGFyYWxsZWwgKGluc24uYWRkcik7Ci0KLQkgIC8qIFN3YXAgYW55IHJlbGF4YWJsZSBmcmFncyByZWNvcmRlZCBmb3IgdGhlIHR3byBpbnNucy4gICovCi0JICAvKiBGSVhNRTogQ2xhcmlmeS4gIHJlbGF4YXRpb24gcHJlY2x1ZGVzIHBhcmFsbGVsIGluc25zICovCi0JICBpZiAocHJldl9pbnNuLmZyYWctPmZyX29wY29kZSA9PSBwcmV2X2luc24uYWRkcikKLQkgICAgcHJldl9pbnNuLmZyYWctPmZyX29wY29kZSA9IGluc24uYWRkcjsKLQkgIGVsc2UgaWYgKGluc24uZnJhZy0+ZnJfb3Bjb2RlID09IGluc24uYWRkcikKLQkgICAgaW5zbi5mcmFnLT5mcl9vcGNvZGUgPSBwcmV2X2luc24uYWRkcjsKLQotCSAgLyogVXBkYXRlIHRoZSBhZGRyZXNzZXMgaW4gYW55IGZpeHVwcy4KLQkgICAgIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBlYWNoIGluc24gaXMgaW4KLQkgICAgIGEgZGlmZmVyZW50IGZyYWcgYXMgd2UgZW5zdXJlIHRoZXkncmUgaW4gdGhlIHNhbWUgZnJhZyBhYm92ZS4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgcHJldl9pbnNuLm51bV9maXh1cHM7ICsraSkKLQkgICAgcHJldl9pbnNuLmZpeHVwc1tpXS0+Znhfd2hlcmUgKz0gMjsKLQkgIGZvciAoaSA9IDA7IGkgPCBpbnNuLm51bV9maXh1cHM7ICsraSkKLQkgICAgaW5zbi5maXh1cHNbaV0tPmZ4X3doZXJlIC09IDI7Ci0JfQotCi0gICAgICAvKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UndmUgc2VlbiBhIHBhaXIgb2YgMTYgYml0IGluc25zLgotCSBwcmV2X2luc24uaW5zbiBpcyBOVUxMIHdoZW4gd2UncmUgb24gYSAzMiBiaXQgYm91bmRhcnkuICAqLwotICAgICAgaWYgKG9uXzMyYml0X2JvdW5kYXJ5X3ApCi0JcHJldl9pbnNuID0gaW5zbjsKLSAgICAgIGVsc2UKLQlwcmV2X2luc24uaW5zbiA9IE5VTEw7Ci0gICAgICAKLSAgICAgIC8qIElmIHRoZSBpbnNuIG5lZWRzIHRoZSBmb2xsb3dpbmcgb25lIHRvIGJlIG9uIGEgMzIgYml0IGJvdW5kYXJ5Ci0JIChlLmcuIHN1YnJvdXRpbmUgY2FsbHMpLCBmaWxsIHRoaXMgaW5zbidzIHNsb3QuICAqLwotICAgICAgaWYgKG9uXzMyYml0X2JvdW5kYXJ5X3AKLQkgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLm9yaWdfaW5zbiwgQ0dFTl9JTlNOX0ZJTExfU0xPVCkgIT0gMCkKLQlmaWxsX2luc24gKDApOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsYXhhYmxlIGluc24gKGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgbGFyZ2VyIHZlcnNpb24pCi0JIG1hcmsgdGhlIGZhY3Qgc28gdGhhdCB3ZSBjYW4gZW1pdCBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlIGZvciBhCi0JIGZvbGxvd2luZyAzMiBiaXQgaW5zbiBpZiB3ZSBzZWUgb25lLiAgICovCi0gICAgICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24ub3JpZ19pbnNuLCBDR0VOX0lOU05fUkVMQVhBQkxFKSAhPSAwKQotCXNlZW5fcmVsYXhhYmxlX3AgPSAxOwotICAgIH0KLQotICAvKiBTZXQgdGhlc2Ugc28gbTMycl9maWxsX2luc24gY2FuIHVzZSB0aGVtLiAgKi8KLSAgcHJldl9zZWcgICAgPSBub3dfc2VnOwotICBwcmV2X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci19Ci0KLS8qIFRoZSBzeW50YXggaW4gdGhlIG1hbnVhbCBzYXlzIGNvbnN0YW50cyBiZWdpbiB3aXRoICcjJy4KLSAgIFdlIGp1c3QgaWdub3JlIGl0LiAgKi8KLQotdm9pZCAKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICB9Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCAgIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICByZXR1cm4gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICogbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiAuc2NvbW0gcHNldWRvLW9wIGhhbmRsZXIuCi0KLSAgIFRoaXMgaXMgYSBuZXcgcHNldWRvLW9wIHRvIGhhbmRsZSBwdXR0aW5nIG9iamVjdHMgaW4gLnNjb21tb24uCi0gICBCeSBkb2luZyB0aGlzIHRoZSBsaW5rZXIgd29uJ3QgbmVlZCB0byBkbyBhbnkgd29yayBhbmQgbW9yZSBpbXBvcnRhbnRseQotICAgaXQgcmVtb3ZlcyB0aGUgaW1wbGljaXQgLUcgYXJnIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkgbGluayB0aGUgb2JqZWN0IGZpbGUuCi0qLwotCi1zdGF0aWMgdm9pZAotbTMycl9zY29tbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICogICAgbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciAgICAgIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKiAgICBwOwotICBvZmZzZXRUICAgICAgICAgICAgc2l6ZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqIHN5bWJvbFA7Ci0gIG9mZnNldFQgICAgICAgICAgICBhbGlnbjsKLSAgaW50ICAgICAgICAgICAgICAgIGFsaWduMjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICogcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc193YXJuIChfKCIuU0NPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgc2l6ZSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLnNjb21tIGlzIHRoZSBhbGlnbm1lbnQuICAqLwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGFsaWduID0gODsKLSAgZWxzZQotICAgIHsKLSAgICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoYWxpZ24gPD0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgYWxpZ24gPSA4OwotCX0KLSAgICB9Ci0gIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudC4gICovCi0gIGlmIChhbGlnbikKLSAgICB7Ci0gICAgICBmb3IgKGFsaWduMiA9IDA7IChhbGlnbiAmIDEpID09IDA7IGFsaWduID4+PSAxLCArKyBhbGlnbjIpCi0JY29udGludWU7Ci0gICAgICBpZiAoYWxpZ24gIT0gMSkKLQl7Ci0JICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFsaWduMiA9IDA7Ci0KLSAgKiBwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqIHAgPSBjOwotCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiTGVuZ3RoIG9mIC5zY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkgICAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBzaXplKTsKLQotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwpCi0gICAgewotICAgICAgc2VnVCAgIG9sZF9zZWMgICAgPSBub3dfc2VnOwotICAgICAgaW50ICAgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICAgICAgY2hhciAqIHBmcmFnOwotCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChzYnNzX3NlY3Rpb24sIGFsaWduMik7Ci0gICAgICBzdWJzZWdfc2V0IChzYnNzX3NlY3Rpb24sIDApOwotICAgICAgCi0gICAgICBpZiAoYWxpZ24yKQotCWZyYWdfYWxpZ24gKGFsaWduMiwgMCwgMCk7Ci0gICAgICAKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBzYnNzX3NlY3Rpb24pCi0Jc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLSAgICAgIAotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0gICAgICAKLSAgICAgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwgc2l6ZSwKLQkJCShjaGFyICopIDApOwotICAgICAgKiBwZnJhZyA9IDA7Ci0gICAgICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNic3Nfc2VjdGlvbik7Ci0gICAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLSAgICAgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCBhbGlnbjIpOwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgJiBzY29tX3NlY3Rpb24pOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogSW50ZXJmYWNlIHRvIHJlbGF4X3NlZ21lbnQuICAqLwotCi0vKiBGSVhNRTogQnVpbGQgdGFibGUgYnkgaGFuZCwgZ2V0IGl0IHdvcmtpbmcsIHRoZW4gbWFjaGluZSBnZW5lcmF0ZS4gICovCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotLyogVGhlIGZpZWxkcyBhcmU6Ci0gICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLiAgKi8KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgbXVzdCBiZSB1bnVzZWQgYmVjYXVzZSBhbiBgcmx4X21vcmUnIHZhbHVlIG9mIHplcm8gZW5kcwotICAgICBlYWNoIGxpc3QuICAqLwotICB7MSwgMSwgMCwgMH0sCi0KLSAgLyogVGhlIGRpc3BsYWNlbWVudCB1c2VkIGJ5IEdBUyBpcyBmcm9tIHRoZSBlbmQgb2YgdGhlIDIgYnl0ZSBpbnNuLAotICAgICBzbyB3ZSBzdWJ0cmFjdCAyIGZyb20gdGhlIGZvbGxvd2luZy4gICovCi0gIC8qIDE2IGJpdCBpbnNuLCA4IGJpdCBkaXNwIC0+IDEwIGJpdCByYW5nZS4KLSAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSBhIGJyYW5jaCBpbiB0aGUgcmlnaHQgc2xvdCBhdCB0aGUgYm9yZGVyOgotICAgICB0aGUgIiYgLTQiIGlzbid0IHRha2VuIGludG8gYWNjb3VudC4gIEl0J3Mgbm90IGltcG9ydGFudCBlbm91Z2ggdG8KLSAgICAgY29tcGxpY2F0ZSB0aGluZ3Mgb3ZlciBpdCwgc28gd2Ugc3VidHJhY3QgYW4gZXh0cmEgMiAob3IgKyAyIGluIC12ZQotICAgICBjYXNlKS4gICovCi0gIHs1MTEgLSAyIC0gMiwgLTUxMiAtIDIgKyAyLCAwLCAyIH0sCi0gIC8qIDMyIGJpdCBpbnNuLCAyNCBiaXQgZGlzcCAtPiAyNiBiaXQgcmFuZ2UuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCAyLCAwIH0sCi0gIC8qIFNhbWUgdGhpbmcsIGJ1dCB3aXRoIGxlYWRpbmcgbm9wIGZvciBhbGlnbm1lbnQuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCA0LCAwIH0KLX07Ci0KLWxvbmcKLW0zMnJfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICogZnJhZ1A7Ci0gICAgIGxvbmcgICAgc3RyZXRjaDsKLXsKLSAgLyogQWRkcmVzcyBvZiBicmFuY2ggaW5zbi4gICovCi0gIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0gIGxvbmcgZ3Jvd3RoID0gMDsKLQotICAvKiBLZWVwIDMyIGJpdCBpbnNucyBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgPT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7Ci0JICBncm93dGggPSAtMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZ3Jvd3RoID0gcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotCi0gICAgICAvKiBMb25nIGp1bXAgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5PyAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyICYmIChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggKz0gMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBncm93dGg7Ci19Ci0KLS8qIFJldHVybiBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBsZW5ndGggYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8KLSAgIGhvbGQgYSBicmFuY2ggdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uLgotICAgQWxzbyB1cGRhdGVzIGZyX3R5cGUvZnJfc3VidHlwZSBhcyBuZWNlc3NhcnkuCi0KLSAgIENhbGxlZCBqdXN0IGJlZm9yZSBkb2luZyByZWxheGF0aW9uLgotICAgQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCi0gICBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gICBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICAgQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICAgMCB2YWx1ZS4gICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBzZWdUICAgIHNlZ21lbnQ7Ci17Ci0gIGludCAgICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBUaGUgb25seSB0aGluZyB3ZSBoYXZlIHRvIGhhbmRsZSBoZXJlIGFyZSBzeW1ib2xzIG91dHNpZGUgb2YgdGhlCi0gICAgIGN1cnJlbnQgc2VnbWVudC4gIFRoZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGluCi0gICAgIHdoaWNoIGNhc2UgbGlua2VyIHNjcmlwdHMgbWF5IHBsYWNlIHRoZW0gYW55d2hlcmUuCi0gICAgIEhvd2V2ZXIsIHdlIGNhbid0IGZpbmlzaCB0aGUgZnJhZ21lbnQgaGVyZSBhbmQgZW1pdCB0aGUgcmVsb2MgYXMgaW5zbgotICAgICBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG1heSBtb3ZlIHRoZSBpbnNuIGFib3V0LiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQuCi0JIENoYW5nZSB0aGUgcmVsYXhhdGlvbiBzdWJ0eXBlIHRvIHRoZSBtYXggYWxsb3dhYmxlIGFuZCBsZWF2ZQotCSBhbGwgZnVydGhlciBoYW5kbGluZyB0byBtZF9jb252ZXJ0X2ZyYWcuICAqLwotICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCi0jaWYgMCAvKiBDYW4ndCB1c2UgdGhpcywgYnV0IGxlYXZlIGluIGZvciBpbGx1c3RyYXRpb24uICAqLyAgICAgCi0gICAgICAvKiBDaGFuZ2UgMTYgYml0IGluc24gdG8gMzIgYml0IGluc24uICAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSB8PSAweDgwOwotCi0gICAgICAvKiBJbmNyZWFzZSBrbm93biAoZml4ZWQpIHNpemUgb2YgZnJhZ21lbnQuICAqLwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCi0gICAgICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSAvKiBwY3JlbCAqLywKLQkgICAgICAgLyogRklYTUU6IENhbid0IHVzZSBhIHJlYWwgQkZEIHJlbG9jIGhlcmUuCi0JCSAgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyBjYW4ndCBoYW5kbGUgaXQuICAqLwotCSAgICAgICBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTCk7Ci0KLSAgICAgIC8qIE1hcmsgdGhpcyBmcmFnbWVudCBhcyBmaW5pc2hlZC4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLSNlbHNlCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLQlpbnQgICAgICAgICAgICAgICBpOwotCi0JLyogVXBkYXRlIHRoZSByZWNvcmRlZCBpbnNuLgotCSAgIEZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgdG8gbG9vayB2ZXJ5IGZhci4KLQkgICBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gcmVjb3JkIGluIHRoZSBpbnN0cnVjdGlvbiB0aGUgbmV4dCBoaWdoZXIKLQkgICByZWxheGFibGUgaW5zbiB0byB1c2UuICAqLwotCWZvciAoaSA9IDAsIGluc24gPSBmcmFnUC0+ZnJfY2dlbi5pbnNuOyBpIDwgNDsgaSsrLCBpbnNuKyspCi0JICB7Ci0JICAgIGlmICgoc3RyY21wIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pLAotCQkJIENHRU5fSU5TTl9NTkVNT05JQyAoZnJhZ1AtPmZyX2NnZW4uaW5zbikpCi0JCSA9PSAwKQotCQkmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSkKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoaSA9PSA0KQotCSAgYWJvcnQgKCk7Ci0KLQlmcmFnUC0+ZnJfY2dlbi5pbnNuID0gaW5zbjsKLQlyZXR1cm4gMjsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19IAotCi0vKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCi0gICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplLgotCi0gICBDYWxsZWQgYWZ0ZXIgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZC4KLSAgIGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICAgZnJhZ1AtPmZyX3N1YnR5cGUgaXMgdGhlIHN1YnR5cGUgb2Ygd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKiAgIGFiZmQ7Ci0gIHNlZ1QgICAgc2VjOwotICBmcmFnUyAqIGZyYWdQOwotewotICBjaGFyICogb3Bjb2RlOwotICBjaGFyICogZGlzcGxhY2VtZW50OwotICBpbnQgICAgdGFyZ2V0X2FkZHJlc3M7Ci0gIGludCAgICBvcGNvZGVfYWRkcmVzczsKLSAgaW50ICAgIGV4dGVuc2lvbjsKLSAgaW50ICAgIGFkZGVuZDsKLQotICBvcGNvZGUgPSBmcmFnUC0+ZnJfb3Bjb2RlOwotCi0gIC8qIEFkZHJlc3Mgb3Bjb2RlIHJlc2lkZXMgYXQgaW4gZmlsZSBzcGFjZS4gICovCi0gIG9wY29kZV9hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4IC0gMjsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIDEgOgotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyIDoKLSAgICAgIG9wY29kZVswXSB8PSAweDgwOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzIDoKLSAgICAgIG9wY29kZVsyXSA9IG9wY29kZVswXSB8IDB4ODA7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKG9wY29kZSwgUEFSX05PUF9JTlNOLCAyKTsKLSAgICAgIG9wY29kZV9hZGRyZXNzICs9IDI7Ci0gICAgICBleHRlbnNpb24gPSA0OwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbM107Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQotICAgIHsKLSAgICAgIC8qIHN5bWJvbCBtdXN0IGJlIHJlc29sdmVkIGJ5IGxpbmtlciAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9vZmZzZXQgJiAzKQotCWFzX3dhcm4gKF8oIkFkZGVuZCB0byB1bnJlc29sdmVkIHN5bWJvbCBub3Qgb24gd29yZCBib3VuZGFyeS4iKSk7Ci0gICAgICBhZGRlbmQgPSBmcmFnUC0+ZnJfb2Zmc2V0ID4+IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQWRkcmVzcyB3ZSB3YW50IHRvIHJlYWNoIGluIGZpbGUgc3BhY2UuICAqLwotICAgICAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICAgICAgdGFyZ2V0X2FkZHJlc3MgKz0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzczsKLSAgICAgIGFkZGVuZCA9ICh0YXJnZXRfYWRkcmVzcyAtIChvcGNvZGVfYWRkcmVzcyAmIC00KSkgPj4gMjsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGEgcmVsb2NhdGlvbiBmb3Igc3ltYm9scyB0aGF0IG11c3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGxpbmtlci4KLSAgICAgT3RoZXJ3aXNlIG91dHB1dCB0aGUgY29tcGxldGVkIGluc24uICAqLwotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWMpCi0gICAgewotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfc3VidHlwZSAhPSAxKTsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2NnZW4uaW5zbiAhPSAwKTsKLSAgICAgIGdhc19jZ2VuX3JlY29yZF9maXh1cCAoZnJhZ1AsCi0JCQkgICAgIC8qIE9mZnNldCBvZiBicmFuY2ggaW5zbiBpbiBmcmFnLiAgKi8KLQkJCSAgICAgZnJhZ1AtPmZyX2ZpeCArIGV4dGVuc2lvbiAtIDQsCi0JCQkgICAgIGZyYWdQLT5mcl9jZ2VuLmluc24sCi0JCQkgICAgIDQgLypsZW5ndGgqLywKLQkJCSAgICAgLyogRklYTUU6IHF1aWNrIGhhY2sgKi8KLSNpZiAwCi0JCQkgICAgIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywKLQkJCQkJCQkgZnJhZ1AtPmZyX2NnZW4ub3BpbmRleCksCi0jZWxzZQotCQkJICAgICBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsCi0JCQkJCQkJIE0zMlJfT1BFUkFORF9ESVNQMjQpLAotI2VuZGlmCi0JCQkgICAgIGZyYWdQLT5mcl9jZ2VuLm9waW5mbywKLQkJCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCk7Ci0gICAgfQotCi0jZGVmaW5lIFNJWkVfRlJPTV9SRUxBWF9TVEFURShuKSAoKG4pID09IDEgPyAxIDogMykKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKGRpc3BsYWNlbWVudCwgKHZhbHVlVCkgYWRkZW5kLAotCQkgICAgICBTSVpFX0ZST01fUkVMQVhfU1RBVEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSk7Ci0KLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19Ci0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWMpCi0gICAgIGZpeFMgKiBmaXhQOwotICAgICBzZWdUICAgc2VjOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWMpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIChvciBpcyBkZWZpbmVkIGJ1dCBub3QgaW4gdGhpcyBzZWN0aW9uKS4KLQkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUpICYgLTRMOwotfQotCi0vKiBSZXR1cm4gdGhlIGJmZCByZWxvYyB0eXBlIGZvciBPUEVSQU5EIG9mIElOU04gYXQgZml4dXAgRklYUC4KLSAgIFJldHVybnMgQkZEX1JFTE9DX05PTkUgaWYgbm8gcmVsb2MgdHlwZSBjYW4gYmUgZm91bmQuCi0gICAqRklYUCBtYXkgYmUgbW9kaWZpZWQgaWYgZGVzaXJlZC4gICovCi0KLWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGZpeFMgKiAgICAgICAgICAgICAgIGZpeFA7Ci17Ci0gIHN3aXRjaCAob3BlcmFuZC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOiByZXR1cm4gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6IHJldHVybiBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTDsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOiByZXR1cm4gQkZEX1JFTE9DX00zMlJfMjZfUENSRUw7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDogcmV0dXJuIEJGRF9SRUxPQ19NMzJSXzI0OwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICAvKiBJZiBsb3cvaGlnaC9zaGlnaC9zZGEgd2FzIHVzZWQsIGl0IGlzIHJlY29yZGVkIGluIGBvcGluZm8nLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9jZ2VuLm9waW5mbyAhPSAwKQotCXJldHVybiBmaXhQLT5meF9jZ2VuLm9waW5mbzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOiAvKiBhdm9pZCAtV2FsbCB3YXJuaW5nICovCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyogUmVjb3JkIGEgSEkxNiByZWxvYyBmb3IgbGF0ZXIgbWF0Y2hpbmcgd2l0aCBpdHMgTE8xNiBjb3VzaW4uICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9yZWNvcmRfaGkxNiAocmVsb2NfdHlwZSwgZml4UCwgc2VnKQotICAgICBpbnQgICAgcmVsb2NfdHlwZTsKLSAgICAgZml4UyAqIGZpeFA7Ci0gICAgIHNlZ1QgICBzZWc7Ci17Ci0gIHN0cnVjdCBtMzJyX2hpX2ZpeHVwICogaGlfZml4dXA7Ci0KLSAgYXNzZXJ0IChyZWxvY190eXBlID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi0JICB8fCByZWxvY190eXBlID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKTsKLQotICBoaV9maXh1cCA9ICgoc3RydWN0IG0zMnJfaGlfZml4dXAgKikKLQkgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtMzJyX2hpX2ZpeHVwKSkpOwotICBoaV9maXh1cC0+Zml4cCA9IGZpeFA7Ci0gIGhpX2ZpeHVwLT5zZWcgID0gbm93X3NlZzsKLSAgaGlfZml4dXAtPm5leHQgPSBtMzJyX2hpX2ZpeHVwX2xpc3Q7Ci0gIAotICBtMzJyX2hpX2ZpeHVwX2xpc3QgPSBoaV9maXh1cDsKLX0KLQotLyogQ2FsbGVkIHdoaWxlIHBhcnNpbmcgYW4gaW5zdHJ1Y3Rpb24gdG8gY3JlYXRlIGEgZml4dXAuCi0gICBXZSBuZWVkIHRvIGNoZWNrIGZvciBISTE2IHJlbG9jcyBhbmQgcXVldWUgdGhlbSB1cCBmb3IgbGF0ZXIgc29ydGluZy4gICovCi0KLWZpeFMgKgotbTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHAgKGZyYWcsIHdoZXJlLCBpbnNuLCBsZW5ndGgsIG9wZXJhbmQsIG9waW5mbywgZXhwKQotICAgICBmcmFnUyAqICAgICAgICAgICAgICBmcmFnOwotICAgICBpbnQgICAgICAgICAgICAgICAgICB3aGVyZTsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogICAgaW5zbjsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICBjb25zdCBDR0VOX09QRVJBTkQgKiBvcGVyYW5kOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBvcGluZm87Ci0gICAgIGV4cHJlc3Npb25TICogICAgICAgIGV4cDsKLXsKLSAgZml4UyAqIGZpeFAgPSBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnLCB3aGVyZSwgaW5zbiwgbGVuZ3RoLAotCQkJCQkgICBvcGVyYW5kLCBvcGluZm8sIGV4cCk7Ci0KLSAgc3dpdGNoIChvcGVyYW5kLT50eXBlKQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIC8qIElmIGxvdy9oaWdoL3NoaWdoL3NkYSB3YXMgdXNlZCwgaXQgaXMgcmVjb3JkZWQgaW4gYG9waW5mbycuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2NnZW4ub3BpbmZvID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi0JICB8fCBmaXhQLT5meF9jZ2VuLm9waW5mbyA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTykKLQltMzJyX3JlY29yZF9oaTE2IChmaXhQLT5meF9jZ2VuLm9waW5mbywgZml4UCwgbm93X3NlZyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDogLyogYXZvaWQgLVdhbGwgd2FybmluZyAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmaXhQOwotfQotCi0vKiBSZXR1cm4gQkZEIHJlbG9jIHR5cGUgZnJvbSBvcGluZm8gZmllbGQgaW4gYSBmaXhTLgotICAgSXQncyB0cmlja3kgdXNpbmcgZnhfcl90eXBlIGluIG0zMnJfZnJvYl9maWxlIGJlY2F1c2UgdGhlIHZhbHVlcwotICAgYXJlIEJGRF9SRUxPQ19VTlVTRUQgKyBvcGVyYW5kIG51bWJlci4gICovCi0jZGVmaW5lIEZYX09QSU5GT19SX1RZUEUoZikgKChmKS0+ZnhfY2dlbi5vcGluZm8pCi0KLS8qIFNvcnQgYW55IHVubWF0Y2hlZCBISTE2IHJlbG9jcyBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZQotICAgdGhlIGNvcnJlc3BvbmRpbmcgTE8xNiByZWxvYy4gIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBtZF9hcHBseV9maXggYW5kCi0gICB0Y19nZW5fcmVsb2MuICAqLwotCi12b2lkCi1tMzJyX2Zyb2JfZmlsZSAoKQotewotICBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIGw7Ci0KLSAgZm9yIChsID0gbTMycl9oaV9maXh1cF9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHNlZ21lbnRfaW5mb190eXBlICogc2VnaW5mbzsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgcGFzczsKLQotICAgICAgYXNzZXJ0IChGWF9PUElORk9fUl9UWVBFIChsLT5maXhwKSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotCSAgICAgIHx8IEZYX09QSU5GT19SX1RZUEUgKGwtPmZpeHApID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKTsKLQotICAgICAgLyogQ2hlY2sgcXVpY2tseSB3aGV0aGVyIHRoZSBuZXh0IGZpeHVwIGhhcHBlbnMgdG8gYmUgYSBtYXRjaGluZyBsb3cuICAqLwotICAgICAgaWYgKGwtPmZpeHAtPmZ4X25leHQgIT0gTlVMTAotCSAgJiYgRlhfT1BJTkZPX1JfVFlQRSAobC0+Zml4cC0+ZnhfbmV4dCkgPT0gQkZEX1JFTE9DX00zMlJfTE8xNgotCSAgJiYgbC0+Zml4cC0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+ZnhfYWRkc3kKLQkgICYmIGwtPmZpeHAtPmZ4X29mZnNldCA9PSBsLT5maXhwLT5meF9uZXh0LT5meF9vZmZzZXQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgZml4dXBzIGZvciB0aGlzIHNlZ21lbnQgZm9yIGEgbWF0Y2hpbmcgYGxvdycuCi0gICAgICAgICBXaGVuIHdlIGZpbmQgb25lLCBtb3ZlIHRoZSBoaWdoL3NoaWdoIGp1c3QgaW4gZnJvbnQgb2YgaXQuICBXZSBkbwotICAgICAgICAgdGhpcyBpbiB0d28gcGFzc2VzLiAgSW4gdGhlIGZpcnN0IHBhc3MsIHdlIHRyeSB0byBmaW5kIGEKLSAgICAgICAgIHVuaXF1ZSBgbG93Jy4gIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgcGVybWl0IG11bHRpcGxlIGhpZ2gncwotICAgICAgICAgcmVsb2NzIGZvciBhIHNpbmdsZSBgbG93Jy4gICovCi0gICAgICBzZWdpbmZvID0gc2VnX2luZm8gKGwtPnNlZyk7Ci0gICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKQotCXsKLQkgIGZpeFMgKiBmOwotCSAgZml4UyAqIHByZXY7Ci0KLQkgIHByZXYgPSBOVUxMOwotCSAgZm9yIChmID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGYgIT0gTlVMTDsgZiA9IGYtPmZ4X25leHQpCi0JICAgIHsKLQkgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBgbG93JyBmaXh1cCB3aGljaCBtYXRjaGVzIGwtPmZpeHAuICAqLwotCSAgICAgIGlmIChGWF9PUElORk9fUl9UWVBFIChmKSA9PSBCRkRfUkVMT0NfTTMyUl9MTzE2Ci0JCSAgJiYgZi0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfYWRkc3kKLQkJICAmJiBmLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+Znhfb2Zmc2V0Ci0JCSAgJiYgKHBhc3MgPT0gMQotCQkgICAgICB8fCBwcmV2ID09IE5VTEwKLQkJICAgICAgfHwgKEZYX09QSU5GT19SX1RZUEUgKHByZXYpICE9IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi0JCQkgICYmIEZYX09QSU5GT19SX1RZUEUgKHByZXYpICE9IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKQotCQkgICAgICB8fCBwcmV2LT5meF9hZGRzeSAhPSBmLT5meF9hZGRzeQotCQkgICAgICB8fCBwcmV2LT5meF9vZmZzZXQgIT0gIGYtPmZ4X29mZnNldCkpCi0JCXsKLQkJICBmaXhTICoqIHBmOwotCi0JCSAgLyogTW92ZSBsLT5maXhwIGJlZm9yZSBmLiAgKi8KLQkJICBmb3IgKHBmID0gJnNlZ2luZm8tPmZpeF9yb290OwotCQkgICAgICAgKiBwZiAhPSBsLT5maXhwOwotCQkgICAgICAgcGYgPSAmICgqIHBmKS0+ZnhfbmV4dCkKLQkJICAgIGFzc2VydCAoKiBwZiAhPSBOVUxMKTsKLQotCQkgICogcGYgPSBsLT5maXhwLT5meF9uZXh0OwotCi0JCSAgbC0+Zml4cC0+ZnhfbmV4dCA9IGY7Ci0JCSAgaWYgKHByZXYgPT0gTlVMTCkKLQkJICAgIHNlZ2luZm8tPmZpeF9yb290ID0gbC0+Zml4cDsKLQkJICBlbHNlCi0JCSAgICBwcmV2LT5meF9uZXh0ID0gbC0+Zml4cDsKLQotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBwcmV2ID0gZjsKLQkgICAgfQotCi0JICBpZiAoZiAhPSBOVUxMKQotCSAgICBicmVhazsKLQotCSAgaWYgKHBhc3MgPT0gMQotCSAgICAgICYmIHdhcm5fdW5tYXRjaGVkX2hpZ2gpCi0JICAgIGFzX3dhcm5fd2hlcmUgKGwtPmZpeHAtPmZ4X2ZpbGUsIGwtPmZpeHAtPmZ4X2xpbmUsCi0JCQkgICBfKCJVbm1hdGNoZWQgaGlnaC9zaGlnaCByZWxvYyIpKTsKLQl9Ci0gICAgfQotfQotCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi0KLWludAotbTMycl9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKiBmaXg7Ci17Ci0gIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKCEgbTMycl9yZWxheCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGZpeC0+ZnhfcGNyZWwKLQkgIHx8IDAgLyogPz8/ICovKTsKLX0KLQwKLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGVuZGlhbm5lc3MuICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICogYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgICAgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50ICAgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICAgIHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFICAgd29yZHMgW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqICAgICAgICAgICB0OwotICBjaGFyICogICAgICAgICAgIGF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgLyogRklYTUU6IFNvbWUgdGFyZ2V0cyBhbGxvdyBvdGhlciBmb3JtYXQgY2hhcnMgZm9yIGJpZ2dlciBzaXplcyBoZXJlLiAgKi8KLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqIHNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICogc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0KLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLAotCQkJICAgICAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCSAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCkKLXsKLSAgLyogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgYSBzZWN0aW9uIGFuZCB3ZSBoYXZlIGp1c3QgZW1pdHRlZCBhCi0gICAgIDE2IGJpdCBpbnNuLCB0aGVuIGVtaXQgYSBub3AgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlY3Rpb24gZW5kcyBvbgotICAgICBhIDMyIGJpdCBib3VuZGFyeS4gICovCi0gIAotICBpZiAocHJldl9pbnNuLmluc24gfHwgc2Vlbl9yZWxheGFibGVfcCkKLSAgICAodm9pZCkgbTMycl9maWxsX2luc24gKDApOwotfQotCi1ib29sZWFuCi1tMzJyX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqZml4UDsKLXsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW0zMnIuaCBiL2dhcy9jb25maWcvdGMtbTMyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNmY2ExLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTMyci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qIHRjLW0zMnIuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtbTMyci5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfTTMyUgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGxlYWRpbmcgc3BhY2Ugc28gd2lsbCBjb21waWxlIHdpdGggY2MgKi8KLSAjZXJyb3IgTTMyUiBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJNMzJSIEdBUyAiCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX20zMnIKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tMzJyIgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi1sb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykgICAKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIEZvciA4IHZzIDE2IHZzIDMyIGJpdCBicmFuY2ggc2VsZWN0aW9uLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0jaWYgMAotZXh0ZXJuIHZvaWQgbTMycl9wcmVwYXJlX3JlbGF4X3NjYW4gKCk7Ci0jZGVmaW5lIG1kX3ByZXBhcmVfcmVsYXhfc2NhbihmcmFnUCwgYWRkcmVzcywgYWltLCB0aGlzX3N0YXRlLCB0aGlzX3R5cGUpIFwKLW0zMnJfcHJlcGFyZV9yZWxheF9zY2FuIChmcmFnUCwgYWRkcmVzcywgYWltLCB0aGlzX3N0YXRlLCB0aGlzX3R5cGUpCi0jZWxzZQotZXh0ZXJuIGxvbmcgbTMycl9yZWxheF9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGxvbmcpKTsKLSNkZWZpbmUgbWRfcmVsYXhfZnJhZyhmcmFnUCwgc3RyZXRjaCkgXAotbTMycl9yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCkKLSNlbmRpZgotLyogQWNjb3VudCBmb3Igbm9wIGlmIDMyIGJpdCBpbnNuIGZhbGxzIG9uIG9kZCBoYWxmd29yZCBib3VuZGFyeS4gICovCi0jZGVmaW5lIFRDX0NHRU5fTUFYX1JFTEFYKGluc24sIGxlbikgKDYpCi0KLS8qIEFsaWdubWVudHMgYXJlIHVzZWQgdG8gZW5zdXJlIDMyIGJpdCBpbnNucyBsaXZlIG9uIDMyIGJpdCBib3VuZGFyaWVzLCBzbwotICAgd2UgdXNlIGEgc3BlY2lhbCBhbGlnbm1lbnQgZnVuY3Rpb24gdG8gaW5zZXJ0IHRoZSBjb3JyZWN0IG5vcCBwYXR0ZXJuLiAgKi8KLWV4dGVybiBpbnQgbTMycl9kb19hbGlnbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLSNkZWZpbmUgbWRfZG9fYWxpZ24obiwgZmlsbCwgbGVuLCBtYXgsIGwpIFwKLWlmIChtMzJyX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkpIGdvdG8gbAotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgbWRfYXBwbHlfZml4MyBnYXNfY2dlbl9tZF9hcHBseV9maXgzCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIG0zMnJfZml4X2FkanVzdGFibGUoZml4UCkKLQotLyogQWZ0ZXIgY3JlYXRpbmcgYSBmaXh1cCBmb3IgYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCwgd2UgbmVlZCB0byBjaGVjayBmb3IKLSAgIEhJMTYgcmVsb2NzIGFuZCBxdWV1ZSB0aGVtIHVwIGZvciBsYXRlciBzb3J0aW5nLiAgKi8KLSNkZWZpbmUgbWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwIG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwCi0KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNkZWZpbmUgdGNfZ2VuX3JlbG9jIGdhc19jZ2VuX3RjX2dlbl9yZWxvYwotCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZSgpIG0zMnJfZnJvYl9maWxlICgpCi1leHRlcm4gdm9pZCBtMzJyX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gZW1pdCB2YXJpb3VzIHJlbG9jcyB3ZSBvdGhlcndpc2Ugd291bGRuJ3QuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgbTMycl9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IG0zMnJfZm9yY2VfcmVsb2NhdGlvbiAoKTsKLQotLyogRW5zdXJlIGluc25zIGF0IGxhYmVscyBhcmUgYWxpZ25lZCB0byAzMiBiaXQgYm91bmRhcmllcy4gICovCi1pbnQgbTMycl9maWxsX2luc24gUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIG1kX2FmdGVyX3Bhc3NfaG9vaygpCW0zMnJfZmlsbF9pbnNuICgxKQotI2RlZmluZSBUQ19TVEFSVF9MQUJFTChjaCwgcHRyKQkoY2ggPT0gJzonICYmIG0zMnJfZmlsbF9pbnNuICgwKSkKLQotLyogQWRkIGV4dHJhIE0zMlIgc2VjdGlvbnMuICAqLwotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5zZGF0YSIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5zYnNzIiwJCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LAotCi0jZGVmaW5lIG1kX2NsZWFudXAgICAgICAgICAgICAgICAgIG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotZXh0ZXJuIHZvaWQgbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsgICAgCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW02ODg1MS5oIGIvZ2FzL2NvbmZpZy90Yy1tNjg4NTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZDc0MS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW02ODg1MS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1tNjg4NTEuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogcG1tdS5oCi0gKi8KLQotLyogSSBzdXBwb3NlIHdlIGhhdmUgdG8gY29weXJpZ2h0IHRoaXMgZmlsZS4gIFNvbWVvbmUgb24gdGhlIG5ldCBzZW50IGl0Ci0gICB0byB1cyBhcyBwYXJ0IG9mIHRoZSBjaGFuZ2VzIGZvciB0aGUgbTY4ODUxIE1lbW9yeSBNYW5hZ2VtZW50IFVuaXQgKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHYXMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBUaGUgR05VIGFzc2VtYmxlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLiAgTm8gYXV0aG9yIG9yIGRpc3RyaWJ1dG9yCi0gICBhY2NlcHRzIHJlc3BvbnNpYmlsaXR5IHRvIGFueW9uZSBmb3IgdGhlIGNvbnNlcXVlbmNlcyBvZiB1c2luZyBpdAotICAgb3IgZm9yIHdoZXRoZXIgaXQgc2VydmVzIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igd29ya3MgYXQgYWxsLAotICAgdW5sZXNzIGhlIHNheXMgc28gaW4gd3JpdGluZy4gIFJlZmVyIHRvIHRoZSBHTlUgQXNzZW1ibGVyIEdlbmVyYWwKLSAgIFB1YmxpYyBMaWNlbnNlIGZvciBmdWxsIGRldGFpbHMuCi0gICAKLSAgIEV2ZXJ5b25lIGlzIGdyYW50ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZQotICAgdGhlIEdOVSBBc3NlbWJsZXIsIGJ1dCBvbmx5IHVuZGVyIHRoZSBjb25kaXRpb25zIGRlc2NyaWJlZCBpbiB0aGUKLSAgIEdOVSBBc3NlbWJsZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UgaXMKLSAgIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCB0aGUgR05VIEFzc2VtYmxlcgotICAgc28geW91IGNhbiBrbm93IHlvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlCi0gICBpbiBhIGZpbGUgbmFtZWQgQ09QWUlORy4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodAotICAgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLiAgKi8KLQotI2lmZGVmIG02ODg1MQotCi0vKgotICBJIGRpZG4ndCB1c2UgbXVjaCBpbWFnaW5hdGlvbiBpbiBjaG9vc2luZyB0aGUgCi0gIGZvbGxvd2luZyBjb2Rlcywgc28gbWFueSBvZiB0aGVtIGFyZW4ndCB2ZXJ5Ci0gIG1uZW1vbmljLiAtcmFiCi0gIAotICBQICBwbW11IHJlZ2lzdGVyCi0gIFBvc3NpYmxlIHZhbHVlczoKLSAgMDAwCVRDCVRyYW5zbGF0aW9uIENvbnRyb2wgcmVnCi0gIDEwMAlDQUwJQ3VycmVudCBBY2Nlc3MgTGV2ZWwKLSAgMTAxCVZBTAlWYWxpZGF0ZSBBY2Nlc3MgTGV2ZWwKLSAgMTEwCVNDQwlTdGFjayBDaGFuZ2UgQ29udHJvbAotICAxMTEJQUMJQWNjZXNzIENvbnRyb2wKLSAgCi0gIFcgIHdpZGUgcG1tdSByZWdpc3RlcnMKLSAgUG9zc2libGUgdmFsdWVzOgotICAwMDEJRFJQCURtYSBSb290IFBvaW50ZXIKLSAgMDEwCVNSUAlTdXBlcnZpc29yIFJvb3QgUG9pbnRlcgotICAwMTEJQ1JQCUNwdSBSb290IFBvaW50ZXIKLSAgCi0gIGYJZnVuY3Rpb24gY29kZSByZWdpc3RlcgotICAwCVNGQwotICAxCURGQwotICAKLSAgVglWQUwgcmVnaXN0ZXIgb25seQotICAKLSAgWAlCQUR4LCBCQUN4Ci0gIDEwMAlCQUQJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBEYXRhCi0gIDEwMQlCQUMJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBDb250cm9sCi0gIAotICBZCVBTUgotICBaCVBDU1IKLSAgCi0gIHwJbWVtb3J5IAkJKG1vZGVzIDItNiwgNy4qKQotICAKLSAgKi8KLQotLyoKLSAqIHRoZXNlIGRlZmluZXMgc2hvdWxkIGJlIGluIG02OGsuYyBidXQKLSAqIGkgcHV0IHRoZW0gaGVyZSB0byBrZWVwIGFsbCB0aGUgbTY4ODUxIHN0dWZmCi0gKiB0b2dldGhlciAtcmFiCi0gKiBKRi0tTWFrZSBzdXJlIHRoZXNlICNzIGRvbid0IGNsYXNoIHdpdGggdGhlIG9uZXMgaW4gbTY4ay5jCi0gKiBUaGF0IHdvdWxkIGJlIEJBRC4KLSAqLwotI2RlZmluZSBUQwkoRlBTKzEpCQkvKiA0OCAqLwotI2RlZmluZSBEUlAJKFRDKzEpCQkvKiA0OSAqLwotI2RlZmluZSBTUlAJKERSUCsxKQkJLyogNTAgKi8KLSNkZWZpbmUgQ1JQCShTUlArMSkJCS8qIDUxICovCi0jZGVmaW5lIENBTAkoQ1JQKzEpCQkvKiA1MiAqLwotI2RlZmluZSBWQUwJKENBTCsxKQkJLyogNTMgKi8KLSNkZWZpbmUgU0NDCShWQUwrMSkJCS8qIDU0ICovCi0jZGVmaW5lIEFDCShTQ0MrMSkJCS8qIDU1ICovCi0jZGVmaW5lIEJBRAkoQUMrMSkJCS8qIDU2LDU3LDU4LDU5LCA2MCw2MSw2Miw2MyAqLwotI2RlZmluZSBCQUMJKEJBRCs4KQkJLyogNjQsNjUsNjYsNjcsIDY4LDY5LDcwLDcxICovCi0jZGVmaW5lIFBTUgkoQkFDKzgpCQkvKiA3MiAqLwotI2RlZmluZSBQQ1NSCShQU1IrMSkJCS8qIDczICovCi0KLS8qIG5hbWUgKi8JLyogb3Bjb2RlICovCQkvKiBtYXRjaCAqLwkJLyogYXJncyAqLwotCi17InBiYWMiLAlvbmUoMHhmMGM3KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYWN3IiwJb25lKDB4ZjA4NyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmFzIiwJb25lKDB4ZjBjNiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmFzdyIsCW9uZSgweGYwODYpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJiYyIsCW9uZSgweGYwYzEpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJiY3ciLAlvbmUoMHhmMDgxKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYnMiLAlvbmUoMHhmMGMwKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYnN3IiwJb25lKDB4ZjA4MCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmNjIiwJb25lKDB4ZjBjZiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmNjdyIsCW9uZSgweGYwOGYpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjcyIsCW9uZSgweGYwY2UpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjc3ciLAlvbmUoMHhmMDhlKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiZ2MiLAlvbmUoMHhmMGNkKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiZ2N3IiwJb25lKDB4ZjA4ZCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdzIiwJb25lKDB4ZjBjYyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdzdyIsCW9uZSgweGYwOGMpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJpYyIsCW9uZSgweGYwY2IpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJpY3ciLAlvbmUoMHhmMDhiKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaXMiLAlvbmUoMHhmMGNhKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaXN3IiwJb25lKDB4ZjA4YSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmxjIiwJb25lKDB4ZjBjMyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmxjdyIsCW9uZSgweGYwODMpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJscyIsCW9uZSgweGYwYzIpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJsc3ciLAlvbmUoMHhmMDgyKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBic2MiLAlvbmUoMHhmMGM1KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBic2N3IiwJb25lKDB4ZjA4NSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNzIiwJb25lKDB4ZjBjNCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNzdyIsCW9uZSgweGYwODQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJ3YyIsCW9uZSgweGYwYzkpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJ3Y3ciLAlvbmUoMHhmMDg5KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid3MiLAlvbmUoMHhmMGM4KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid3N3IiwJb25lKDB4ZjA4OCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAotICAgIAotICAgIAoteyJwZGJhYyIsCXR3bygweGYwNDgsIDB4MDAwNyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmFzIiwJdHdvKDB4ZjA0OCwgMHgwMDA2KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiYmMiLAl0d28oMHhmMDQ4LCAweDAwMDEpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJicyIsCXR3bygweGYwNDgsIDB4MDAwMCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmNjIiwJdHdvKDB4ZjA0OCwgMHgwMDBmKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiY3MiLAl0d28oMHhmMDQ4LCAweDAwMGUpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJnYyIsCXR3bygweGYwNDgsIDB4MDAwZCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmdzIiwJdHdvKDB4ZjA0OCwgMHgwMDBjKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiaWMiLAl0d28oMHhmMDQ4LCAweDAwMGIpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJpcyIsCXR3bygweGYwNDgsIDB4MDAwYSksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmxjIiwJdHdvKDB4ZjA0OCwgMHgwMDAzKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRibHMiLAl0d28oMHhmMDQ4LCAweDAwMDIpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJzYyIsCXR3bygweGYwNDgsIDB4MDAwNSksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYnNzIiwJdHdvKDB4ZjA0OCwgMHgwMDA0KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRid2MiLAl0d28oMHhmMDQ4LCAweDAwMDkpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJ3cyIsCXR3bygweGYwNDgsIDB4MDAwOCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi0gICAgCi17InBmbHVzaGEiLAl0d28oMHhmMDAwLCAweDI0MDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIiB9LAotICAgIAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDMwMTApLAl0d28oMHhmZmMwLCAweGZlMTApLAkiVDNUOSIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzODEwKSwJdHdvKDB4ZmZjMCwgMHhmZTEwKSwJIlQzVDkmcyIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZTE4KSwJIkQzVDkiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzgwOCksCXR3bygweGZmYzAsIDB4ZmUxOCksCSJEM1Q5JnMiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzAwMCksCXR3bygweGZmYzAsIDB4ZmUxZSksCSJmM1Q5IiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDM4MDApLAl0d28oMHhmZmMwLCAweGZlMWUpLAkiZjNUOSZzIiB9LAotICAgIAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDEwKSwJdHdvKDB4ZmZmOCwgMHhmZTEwKSwJIlQzVDkiIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDApLAl0d28oMHhmZmY4LCAweGZlMDApLAkiVDNUOSZzIiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDA4KSwJdHdvKDB4ZmZmOCwgMHhmZTE4KSwJIkQzVDkiIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDgpLAl0d28oMHhmZmY4LCAweGZlMTgpLAkiRDNUOSZzIiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDAwKSwJdHdvKDB4ZmZmOCwgMHhmZTFlKSwJImYzVDkiIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDApLAl0d28oMHhmZmY4LCAweGZlMWUpLAkiZjNUOSZzIn0sCi0gICAgCi17InBmbHVzaHIiLAl0d28oMHhmMDAwLCAweGEwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkifHMiIH0sCi0gICAgCi17InBsb2FkciIsCXR3bygweGYwMDAsIDB4MjIxMCksCXR3bygweGZmYzAsIDB4ZmZmMCksCSJUMyZzIiB9LAoteyJwbG9hZHIiLAl0d28oMHhmMDAwLCAweDIyMDgpLAl0d28oMHhmZmMwLCAweGZmZjgpLAkiRDMmcyIgfSwKLXsicGxvYWRyIiwJdHdvKDB4ZjAwMCwgMHgyMjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZlKSwJImYzJnMiIH0sCi17InBsb2FkdyIsCXR3bygweGYwMDAsIDB4MjAxMCksCXR3bygweGZmYzAsIDB4ZmZmMCksCSJUMyZzIiB9LAoteyJwbG9hZHciLAl0d28oMHhmMDAwLCAweDIwMDgpLAl0d28oMHhmZmMwLCAweGZmZjgpLAkiRDMmcyIgfSwKLXsicGxvYWR3IiwJdHdvKDB4ZjAwMCwgMHgyMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZlKSwJImYzJnMiIH0sCi0gICAgCi0gICAgLyogVEMsIENSUCwgRFJQLCBTUlAsIENBTCwgVkFMLCBTQ0MsIEFDICovCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg0MDAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwJIipzUDgiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg0MjAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwJIlA4JXMiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg0MDAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwJInxzVzgiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg0MjAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwJIlc4fnMiIH0sCi0gICAgCi0gICAgLyogQkFEeCwgQkFDeCAqLwoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NjIwMCksCXR3bygweGZmYzAsIDB4ZTNlMyksCSIqc1gzIiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NjAwMCksCXR3bygweGZmYzAsIDB4ZTNlMyksCSJYMyVzIiB9LAotICAgIAotICAgIC8qIFBTUiwgUENTUiAqLwotICAgIC8qIHsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYxMDApLAl0d28ob3hmZmMwLCBveGZmZmYpLAkiKnNaOCIgfSwgKi8KLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiKnNZOCIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYyMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiWTglcyIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDY2MDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiWjglcyIgfSwKLSAgICAKLXsicHJlc3RvcmUiLAlvbmUoMHhmMTQwKSwJCW9uZSgweGZmYzApLAkJIiZzIn0sCi17InByZXN0b3JlIiwJb25lKDB4ZjE1OCksCQlvbmUoMHhmZmY4KSwJCSIrcyJ9LAoteyJwc2F2ZSIsCW9uZSgweGYxMDApLAkJb25lKDB4ZmZjMCksCQkiJnMifSwKLXsicHNhdmUiLAlvbmUoMHhmMTAwKSwJCW9uZSgweGZmYzApLAkJIitzIn0sCi0gICAgCi17InBzYWMiLAl0d28oMHhmMDQwLCAweDAwMDcpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNhcyIsCXR3bygweGYwNDAsIDB4MDAwNiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2JjIiwJdHdvKDB4ZjA0MCwgMHgwMDAxKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzYnMiLAl0d28oMHhmMDQwLCAweDAwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNjYyIsCXR3bygweGYwNDAsIDB4MDAwZiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2NzIiwJdHdvKDB4ZjA0MCwgMHgwMDBlKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzZ2MiLAl0d28oMHhmMDQwLCAweDAwMGQpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNncyIsCXR3bygweGYwNDAsIDB4MDAwYyksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2ljIiwJdHdvKDB4ZjA0MCwgMHgwMDBiKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzaXMiLAl0d28oMHhmMDQwLCAweDAwMGEpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNsYyIsCXR3bygweGYwNDAsIDB4MDAwMyksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2xzIiwJdHdvKDB4ZjA0MCwgMHgwMDAyKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzc2MiLAl0d28oMHhmMDQwLCAweDAwMDUpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNzcyIsCXR3bygweGYwNDAsIDB4MDAwNCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3djIiwJdHdvKDB4ZjA0MCwgMHgwMDA5KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzd3MiLAl0d28oMHhmMDQwLCAweDAwMDgpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLSAgICAKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MjEwKSwJdHdvKDB4ZmZjMCwgMHhlM2YwKSwJIlQzJnNROCIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MzEwKSwJdHdvKDB4ZmZjMCwgMHhlMzEwKSwJIlQzJnNROEE5IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgyMDgpLAl0d28oMHhmZmMwLCAweGUzZjgpLAkiRDMmc1E4IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgzMDgpLAl0d28oMHhmZmMwLCAweGUzMTgpLAkiRDMmc1E4QTkiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODIwMCksCXR3bygweGZmYzAsIDB4ZTNmZSksCSJmMyZzUTgiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODMwMCksCXR3bygweGZmYzAsIDB4ZTMxZSksCSJmMyZzUThBOSIgfSwKLSAgICAKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MDEwKSwJdHdvKDB4ZmZjMCwgMHhlM2YwKSwJIlQzJnNROCIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MTEwKSwJdHdvKDB4ZmZjMCwgMHhlMzEwKSwJIlQzJnNROEE5IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgwMDgpLAl0d28oMHhmZmMwLCAweGUzZjgpLAkiRDMmc1E4IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgxMDgpLAl0d28oMHhmZmMwLCAweGUzMTgpLAkiRDMmc1E4QTkiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODAwMCksCXR3bygweGZmYzAsIDB4ZTNmZSksCSJmMyZzUTgiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODEwMCksCXR3bygweGZmYzAsIDB4ZTMxZSksCSJmMyZzUThBOSIgfSwKLSAgICAKLXsicHRyYXBhY3ciLAl0d28oMHhmMDdhLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBhY2wiLAl0d28oMHhmMDdiLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBhYyIsCXR3bygweGYwN2MsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBhc3ciLAl0d28oMHhmMDdhLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBhc2wiLAl0d28oMHhmMDdiLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBhcyIsCXR3bygweGYwN2MsIDB4MDAwNiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBiY3ciLAl0d28oMHhmMDdhLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBiY2wiLAl0d28oMHhmMDdiLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBiYyIsCXR3bygweGYwN2MsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBic3ciLAl0d28oMHhmMDdhLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBic2wiLAl0d28oMHhmMDdiLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBicyIsCXR3bygweGYwN2MsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBjY3ciLAl0d28oMHhmMDdhLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBjY2wiLAl0d28oMHhmMDdiLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBjYyIsCXR3bygweGYwN2MsIDB4MDAwZiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBjc3ciLAl0d28oMHhmMDdhLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBjc2wiLAl0d28oMHhmMDdiLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBjcyIsCXR3bygweGYwN2MsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBnY3ciLAl0d28oMHhmMDdhLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBnY2wiLAl0d28oMHhmMDdiLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBnYyIsCXR3bygweGYwN2MsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBnc3ciLAl0d28oMHhmMDdhLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBnc2wiLAl0d28oMHhmMDdiLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBncyIsCXR3bygweGYwN2MsIDB4MDAwYyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBpY3ciLAl0d28oMHhmMDdhLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBpY2wiLAl0d28oMHhmMDdiLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBpYyIsCXR3bygweGYwN2MsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBpc3ciLAl0d28oMHhmMDdhLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBpc2wiLAl0d28oMHhmMDdiLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBpcyIsCXR3bygweGYwN2MsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBsY3ciLAl0d28oMHhmMDdhLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBsY2wiLAl0d28oMHhmMDdiLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBsYyIsCXR3bygweGYwN2MsIDB4MDAwMyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBsc3ciLAl0d28oMHhmMDdhLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBsc2wiLAl0d28oMHhmMDdiLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBscyIsCXR3bygweGYwN2MsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBzY3ciLAl0d28oMHhmMDdhLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBzY2wiLAl0d28oMHhmMDdiLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBzYyIsCXR3bygweGYwN2MsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBzc3ciLAl0d28oMHhmMDdhLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBzc2wiLAl0d28oMHhmMDdiLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBzcyIsCXR3bygweGYwN2MsIDB4MDAwNCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXB3Y3ciLAl0d28oMHhmMDdhLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXB3Y2wiLAl0d28oMHhmMDdiLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXB3YyIsCXR3bygweGYwN2MsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXB3c3ciLAl0d28oMHhmMDdhLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXB3c2wiLAl0d28oMHhmMDdiLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXB3cyIsCXR3bygweGYwN2MsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyODAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlZzJnMifSwKLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyYzAwKSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkEzJnMiIH0sCi0gICAgCi0jZW5kaWYgLyogbTY4ODUxICovCi0KLS8qIGVuZCBvZiB0Yy1tNjg4NTEuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmMgYi9nYXMvY29uZmlnL3RjLW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0OTY2NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDcxMzggKzAsMCBAQAotLyogdGMtbTY4ay5jIC0tIEFzc2VtYmxlIGZvciB0aGUgbTY4ayBmYW1pbHkKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL202OGsuaCIKLSNpbmNsdWRlICJtNjhrLXBhcnNlLmgiCi0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKQotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0jZW5kaWYKLQotLyogVGhpcyBzdHJpbmcgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLiAgVGhlIG1hY3JvCi0gICB0Y19jb21tZW50X2NoYXJzIHBvaW50cyB0byB0aGlzLiAgV2UgdXNlIHRoaXMsIHJhdGhlciB0aGFuIHRoZQotICAgdXN1YWwgY29tbWVudF9jaGFycywgc28gdGhhdCB0aGUgLS1iaXR3aXNlLW9yIG9wdGlvbiB3aWxsIHdvcmsuICAqLwotI2lmIGRlZmluZWQgKFRFX1NWUjQpIHx8IGRlZmluZWQgKFRFX0RFTFRBKQotY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzID0gInwjIjsKLSNlbHNlCi1jb25zdCBjaGFyICptNjhrX2NvbW1lbnRfY2hhcnMgPSAifCI7Ci0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyoiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLUNPTlNUIGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgYXMKLSAgIGluICIwZjEyLjQ1NiIgb3IgIjBkMS4yMzQ1ZTEyIi4gICovCi0KLUNPTlNUIGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WGVFcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotLyogQXJlIHdlIHRyeWluZyB0byBnZW5lcmF0ZSBQSUMgY29kZT8gIElmIHNvLCBhYnNvbHV0ZSByZWZlcmVuY2VzCi0gICBvdWdodCB0byBiZSBtYWRlIGludG8gbGlua2FnZSB0YWJsZSByZWZlcmVuY2VzIG9yIHBjLXJlbGF0aXZlCi0gICByZWZlcmVuY2VzLiAgTm90IGltcGxlbWVudGVkLiAgRm9yIEVMRiB0aGVyZSBhcmUgb3RoZXIgbWVhbnMgCi0gICB0byBkZW5vdGUgcGljIHJlbG9jYXRpb25zLiAgKi8KLWludCBmbGFnX3dhbnRfcGljOwotCi1zdGF0aWMgaW50IGZsYWdfc2hvcnRfcmVmczsJLyogLWwgb3B0aW9uICovCi1zdGF0aWMgaW50IGZsYWdfbG9uZ19qdW1wczsJLyogLVMgb3B0aW9uICovCi0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwKLWludCBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUw7Ci0jZWxzZQotaW50IGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbDsKLSNlbmRpZgotCi0vKiBXaGV0aGVyIC0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIHdhcyB1c2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotc3RhdGljIGludCByZWdfcHJlZml4X29wdGlvbmFsX3NlZW47Ci0KLS8qIFRoZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciB0byB1c2UgYnkgZGVmYXVsdC4gICovCi1zdGF0aWMgZW51bSBtNjhrX3JlZ2lzdGVyIG02OGtfZmxvYXRfY29wbnVtID0gQ09QMTsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiByZWZlcmVuY2VzIHRvIG51bWJlciglcGMpIHdpbGwgYmUgdGFrZW4KLSAgIHRvIHJlZmVyIHRvIG51bWJlciwgcmF0aGVyIHRoYW4gdG8gJXBjICsgbnVtYmVyLiAgKi8KLXN0YXRpYyBpbnQgbTY4a19hYnNwY2FkZDsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiB0aGUgcXVpY2sgZm9ybXMgb2YgdGhlIG1vdmUsIGFkZCwgYW5kIHN1YgotICAgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIHdoZW4gcG9zc2libGUuICAqLwotc3RhdGljIGludCBtNjhrX3F1aWNrID0gMTsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiBpZiB0aGUgc2l6ZSBpcyBub3Qgc3BlY2lmaWVkIGZvciBhIGJhc2UKLSAgIG9yIG91dGVyIGRpc3BsYWNlbWVudCwgdGhlIGFzc2VtYmxlciBhc3N1bWVzIHRoYXQgdGhlIHNpemUgc2hvdWxkCi0gICBiZSAzMiBiaXRzLiAgKi8KLXN0YXRpYyBpbnQgbTY4a19yZWwzMiA9IDE7Ci0KLS8qIFRoaXMgaXMgbm9uLXplcm8gaWYgbTY4a19yZWwzMiB3YXMgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi1zdGF0aWMgaW50IG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lOwotCi0vKiBUaGUgZGVmYXVsdCB3aWR0aCB0byB1c2UgZm9yIGFuIGluZGV4IHJlZ2lzdGVyIHdoZW4gdXNpbmcgYSBiYXNlCi0gICBkaXNwbGFjZW1lbnQuICAqLwotc3RhdGljIGVudW0gbTY4a19zaXplIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCA9IFNJWkVfTE9ORzsKLQotLyogV2Ugd2FudCB0byB3YXJuIGlmIGFueSB0ZXh0IGxhYmVscyBhcmUgbWlzYWxpZ25lZC4gIEluIG9yZGVyIHRvIGdldAotICAgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyLCB3ZSBuZWVkIHRvIHJlY29yZCB0aGUgbGluZSBudW1iZXIgZm9yIGVhY2gKLSAgIGxhYmVsLiAgKi8KLQotc3RydWN0IGxhYmVsX2xpbmUKLXsKLSAgc3RydWN0IGxhYmVsX2xpbmUgKm5leHQ7Ci0gIHN5bWJvbFMgKmxhYmVsOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgaW50IHRleHQ7Ci19OwotCi0vKiBUaGUgbGlzdCBvZiBsYWJlbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGxhYmVsX2xpbmUgKmxhYmVsczsKLQotLyogVGhlIGN1cnJlbnQgbGFiZWwuICAqLwotCi1zdGF0aWMgc3RydWN0IGxhYmVsX2xpbmUgKmN1cnJlbnRfbGFiZWw7Ci0KLS8qIEl0cyBhbiBhcmJpdHJhcnkgbmFtZTogIFRoaXMgbWVhbnMgSSBkb24ndCBhcHByb3ZlIG9mIGl0ICovCi0vKiBTZWUgZmxhbWVzIGJlbG93ICovCi1zdGF0aWMgc3RydWN0IG9ic3RhY2sgcm9ieW47Ci0KLSNkZWZpbmUgVEFCKHgseSkJKCgoeCk8PDIpKyh5KSkKLSNkZWZpbmUgVEFCVFlQRSh4eSkgICAgICgoeHkpID4+IDIpCi0jZGVmaW5lIEJZVEUJCTAKLSNkZWZpbmUgU0hPUlQJCTEKLSNkZWZpbmUgTE9ORwkJMgotI2RlZmluZSBTWl9VTkRFRgkzCi0jdW5kZWYgQlJBTkNICi0vKiBDYXNlIGBnJyBleGNlcHQgd2hlbiBCQ0M2ODAwMCBpcyBhcHBsaWNhYmxlLiAgKi8KLSNkZWZpbmUgQUJSQU5DSAkJMQotLyogQ29wcm9jZXNzb3IgYnJhbmNoZXMuICAqLwotI2RlZmluZSBGQlJBTkNICQkyCi0vKiBNb2RlIDcuMiAtLSBwcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCAoMTYtYml0KSBkaXNwbGFjZW1lbnQsCi0gICBzdXBwb3J0ZWQgb24gYWxsIGNwdXMuICBXaWRlbnMgdG8gMzItYml0IGFic29sdXRlLiAgKi8KLSNkZWZpbmUgUENSRUwJCTMKLS8qIEZvciBpbnNlcnRpbmcgYW4gZXh0cmEgam1wIGluc3RydWN0aW9uIHdpdGggbG9uZyBvZmZzZXQgb24gNjgwMDAsCi0gICBmb3IgZXhwYW5kaW5nIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKE5vdCBic3Igb3IgYnJhLikgIFNpbmNlIHRoZQotICAgNjgwMDAgZG9lc24ndCBzdXBwb3J0IDMyLWJpdCBkaXNwbGFjZW1lbnRzIGZvciBjb25kaXRpb25hbAotICAgYnJhbmNoZXMsIHdlIGZha2UgaXQgYnkgcmV2ZXJzaW5nIHRoZSBjb25kaXRpb24gYW5kIGJyYW5jaGluZwotICAgYXJvdW5kIGEgam1wIHdpdGggYW4gYWJzb2x1dGUgbG9uZyBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgQkNDNjgwMDAgICAgICAgIDQKLS8qIEZvciB0aGUgREJjYyAiaW5zdHJ1Y3Rpb25zIi4gIElmIHRoZSBkaXNwbGFjZW1lbnQgcmVxdWlyZXMgMzIgYml0cywKLSAgIHRoZSBicmFuY2gtYXJvdW5kLWEtanVtcCBnYW1lIGlzIHBsYXllZCBoZXJlIHRvby4gICovCi0jZGVmaW5lIERCQ0MgICAgICAgICAgICA1Ci0vKiBOb3QgY3VycmVudGx5IHVzZWQ/ICAqLwotI2RlZmluZSBQQ0xFQQkJNgotLyogTW9kZSBBSU5EWCAoYXBjLXJlbGF0aXZlKSB1c2luZyBQQywgd2l0aCB2YXJpYWJsZSB0YXJnZXQsIG1pZ2h0IGZpdAotICAgaW4gMTYgb3IgOCBiaXRzLiAgKi8KLSNkZWZpbmUgUENJTkRFWAkJNwotCi1zdHJ1Y3QgbTY4a19pbmNhbnQKLSAgewotICAgIGNvbnN0IGNoYXIgKm1fb3BlcmFuZHM7Ci0gICAgdW5zaWduZWQgbG9uZyBtX29wY29kZTsKLSAgICBzaG9ydCBtX29wbnVtOwotICAgIHNob3J0IG1fY29kZW51bTsKLSAgICBpbnQgbV9hcmNoOwotICAgIHN0cnVjdCBtNjhrX2luY2FudCAqbV9uZXh0OwotICB9OwotCi0jZGVmaW5lIGdldG9uZSh4KQkoKCgoeCktPm1fb3Bjb2RlKT4+MTYpJjB4ZmZmZikKLSNkZWZpbmUgZ2V0dHdvKHgpCSgoKHgpLT5tX29wY29kZSkmMHhmZmZmKQotCi1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODAwMF9jb250cm9sX3JlZ3NbXSA9IHsgMCB9Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwMTBfY29udHJvbF9yZWdzW10gPSB7Ci0gIFNGQywgREZDLCBVU1AsIFZCUiwKLSAgMAotfTsKLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4MDIwX2NvbnRyb2xfcmVnc1tdID0gewotICBTRkMsIERGQywgVVNQLCBWQlIsIENBQ1IsIENBQVIsIE1TUCwgSVNQLAotICAwCi19Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwNDBfY29udHJvbF9yZWdzW10gPSB7Ci0gIFNGQywgREZDLCBDQUNSLCBUQywgSVRUMCwgSVRUMSwgRFRUMCwgRFRUMSwKLSAgVVNQLCBWQlIsIE1TUCwgSVNQLCBNTVVTUiwgVVJQLCBTUlAsCi0gIDAKLX07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODA2MF9jb250cm9sX3JlZ3NbXSA9IHsKLSAgU0ZDLCBERkMsIENBQ1IsIFRDLCBJVFQwLCBJVFQxLCBEVFQwLCBEVFQxLCBCVVNDUiwKLSAgVVNQLCBWQlIsIFVSUCwgU1JQLCBQQ1IsCi0gIDAKLX07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG1jZl9jb250cm9sX3JlZ3NbXSA9IHsKLSAgQ0FDUiwgVEMsIElUVDAsIElUVDEsIERUVDAsIERUVDEsIFZCUiwgUk9NQkFSLCAKLSAgUkFNQkFSMCwgUkFNQkFSMSwgTUJBUiwKLSAgMAotfTsKLSNkZWZpbmUgY3B1MzJfY29udHJvbF9yZWdzIG02ODAxMF9jb250cm9sX3JlZ3MKLQotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciAqY29udHJvbF9yZWdzOwotCi0vKiBpbnRlcm5hbCBmb3JtIG9mIGEgNjgwMjAgaW5zdHJ1Y3Rpb24gKi8KLXN0cnVjdCBtNjhrX2l0Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm9yOwotICBjb25zdCBjaGFyICphcmdzOwkJLyogbGlzdCBvZiBvcGNvZGUgaW5mbyAqLwotICBpbnQgbnVtYXJnczsKLQotICBpbnQgbnVtbzsJCQkvKiBOdW1iZXIgb2Ygc2hvcnRzIGluIG9wY29kZSAqLwotICBzaG9ydCBvcGNvZGVbMTFdOwotCi0gIHN0cnVjdCBtNjhrX29wIG9wZXJhbmRzWzZdOwotCi0gIGludCBuZXhwOwkJCS8qIG51bWJlciBvZiBleHBycyBpbiB1c2UgKi8KLSAgc3RydWN0IG02OGtfZXhwIGV4cHJzWzRdOwotCi0gIGludCBuZnJhZzsJCQkvKiBOdW1iZXIgb2YgZnJhZ3Mgd2UgaGF2ZSB0byBwcm9kdWNlICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCBmcmFnb2ZmOwkJLyogV2hlcmUgaW4gdGhlIGN1cnJlbnQgb3Bjb2RlIHRoZSBmcmFnIGVuZHMgKi8KLSAgICAgIHN5bWJvbFMgKmZhZGQ7Ci0gICAgICBvZmZzZXRUIGZvZmY7Ci0gICAgICBpbnQgZnJhZ3R5OwotICAgIH0KLSAgZnJhZ2JbNF07Ci0KLSAgaW50IG5yZWw7CQkJLyogTnVtIG9mIHJlbG9jIHN0cnVjcyBpbiB1c2UgKi8KLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IG47Ci0gICAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgICBjaGFyIHdpZDsKLSAgICAgIGNoYXIgcGNyZWw7Ci0gICAgICAvKiBJbiBhIHBjIHJlbGF0aXZlIGFkZHJlc3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcwotCSBvZiB0aGUgb2Zmc2V0IGFuZCB0aGUgYWRkcmVzcyB0aGF0IHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUKLQkgdG8uICBUaGlzIGRlcGVuZHMgb24gdGhlIGFkZHJlc3NpbmcgbW9kZS4gIEJhc2ljYWxseSB0aGlzCi0JIGlzIHRoZSB2YWx1ZSB0byBwdXQgaW4gdGhlIG9mZnNldCBmaWVsZCB0byBhZGRyZXNzIHRoZQotCSBmaXJzdCBieXRlIG9mIHRoZSBvZmZzZXQsIHdpdGhvdXQgcmVnYXJkaW5nIHRoZSBzcGVjaWFsCi0JIHNpZ25pZmljYW5jZSBvZiBzb21lIHZhbHVlcyAoaW4gdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiwgZm9yCi0JIGV4YW1wbGUpLiAgKi8KLSAgICAgIGludCBwY3JlbF9maXg7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogV2hldGhlciB0aGlzIGV4cHJlc3Npb24gbmVlZHMgc3BlY2lhbCBwaWMgcmVsb2NhdGlvbiwgYW5kIGlmCi0JIHNvLCB3aGljaC4gICovCi0gICAgICBlbnVtIHBpY19yZWxvY2F0aW9uIHBpY19yZWxvYzsKLSNlbmRpZgotICAgIH0KLSAgcmVsb2NbNV07CQkJLyogRml2ZSBpcyBlbm91Z2g/Pz8gKi8KLX07Ci0KLSNkZWZpbmUgY3B1X29mX2FyY2goeCkJCSgoeCkgJiAobTY4MDAwdXB8bWNmKSkKLSNkZWZpbmUgZmxvYXRfb2ZfYXJjaCh4KQkoKHgpICYgbWZsb2F0KQotI2RlZmluZSBtbXVfb2ZfYXJjaCh4KQkJKCh4KSAmIG1tbXUpCi0jZGVmaW5lIGFyY2hfY29sZGZpcmVfcCh4KQkoKCh4KSAmIG1jZikgIT0gMCkKLQotLyogTWFjcm9zIGZvciBkZXRlcm1pbmluZyBpZiBjcHUgc3VwcG9ydHMgYSBzcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGUgKi8KLSNkZWZpbmUgSEFWRV9MT05HX0JSQU5DSCh4KQkoKHgpICYgKG02ODAyMHxtNjgwMzB8bTY4MDQwfG02ODA2MHxjcHUzMikpCi0KLXN0YXRpYyBzdHJ1Y3QgbTY4a19pdCB0aGVfaW5zOwkvKiB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYXNzZW1ibGVkICovCi0KLSNkZWZpbmUgb3AoZXgpCQkoKGV4KS0+ZXhwLlhfb3ApCi0jZGVmaW5lIGFkZHMoZXgpCSgoZXgpLT5leHAuWF9hZGRfc3ltYm9sKQotI2RlZmluZSBzdWJzKGV4KQkoKGV4KS0+ZXhwLlhfb3Bfc3ltYm9sKQotI2RlZmluZSBvZmZzKGV4KQkoKGV4KS0+ZXhwLlhfYWRkX251bWJlcikKLQotLyogTWFjcm9zIGZvciBhZGRpbmcgdGhpbmdzIHRvIHRoZSBtNjhrX2l0IHN0cnVjdCAqLwotCi0jZGVmaW5lIGFkZHdvcmQodykJdGhlX2lucy5vcGNvZGVbdGhlX2lucy5udW1vKytdPSh3KQotCi0vKiBTdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgaW5zb3AgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKikpOwotc3RhdGljIHZvaWQgYWRkX2ZpeCBQQVJBTVMgKChpbnQsIHN0cnVjdCBtNjhrX2V4cCAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgYWRkX2ZyYWcgUEFSQU1TICgoc3ltYm9sUyAqLCBvZmZzZXRULCBpbnQpKTsKLQotLyogTGlrZSBhZGR3b3JkLCBidXQgZ29lcyBCRUZPUkUgZ2VuZXJhbCBvcGVyYW5kcyAqLwotc3RhdGljIHZvaWQKLWluc29wICh3LCBvcGNvZGUpCi0gICAgIGludCB3OwotICAgICBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKm9wY29kZTsKLXsKLSAgaW50IHo7Ci0gIGZvcih6PXRoZV9pbnMubnVtbzt6Pm9wY29kZS0+bV9jb2RlbnVtOy0teikKLSAgICB0aGVfaW5zLm9wY29kZVt6XT10aGVfaW5zLm9wY29kZVt6LTFdOwotICBmb3Ioej0wO3o8dGhlX2lucy5ucmVsO3orKykKLSAgICB0aGVfaW5zLnJlbG9jW3pdLm4rPTI7Ci0gIGZvciAoeiA9IDA7IHogPCB0aGVfaW5zLm5mcmFnOyB6KyspCi0gICAgdGhlX2lucy5mcmFnYlt6XS5mcmFnb2ZmKys7Ci0gIHRoZV9pbnMub3Bjb2RlW29wY29kZS0+bV9jb2RlbnVtXT13OwotICB0aGVfaW5zLm51bW8rKzsKLX0KLQotLyogVGhlIG51bW8rMSBrbHVkZ2UgaXMgc28gd2UgY2FuIGhpdCB0aGUgbG93IG9yZGVyIGJ5dGUgb2YgdGhlIHByZXYgd29yZC4KLSAgIEJsZWNjaC4gICovCi1zdGF0aWMgdm9pZAotYWRkX2ZpeCAod2lkdGgsIGV4cCwgcGNfcmVsLCBwY19maXgpCi0gICAgIGludCB3aWR0aDsKLSAgICAgc3RydWN0IG02OGtfZXhwICpleHA7Ci0gICAgIGludCBwY19yZWw7Ci0gICAgIGludCBwY19maXg7Ci17Ci0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5uID0gKCh3aWR0aCA9PSAnQicgfHwgd2lkdGggPT0gJzMnKQotCQkJCSAgID8gKHRoZV9pbnMubnVtbyoyLTEpCi0JCQkJICAgOiAoKCh3aWR0aCk9PSdiJykKLQkJCQkgICAgICA/ICh0aGVfaW5zLm51bW8qMisxKQotCQkJCSAgICAgIDogKHRoZV9pbnMubnVtbyoyKSkpOwotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbF0uZXhwID0gZXhwLT5leHA7Ci0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS53aWQgPSB3aWR0aDsKLSAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWxdLnBjcmVsX2ZpeCA9IHBjX2ZpeDsKLSNpZmRlZiBPQkpfRUxGCi0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5waWNfcmVsb2MgPSBleHAtPnBpY19yZWxvYzsKLSNlbmRpZgotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCsrXS5wY3JlbCA9IHBjX3JlbDsKLX0KLQotLyogQ2F1c2UgYW4gZXh0cmEgZnJhZyB0byBiZSBnZW5lcmF0ZWQgaGVyZSwgaW5zZXJ0aW5nIHVwIHRvIDEwIGJ5dGVzCi0gICAodGhhdCB2YWx1ZSBpcyBjaG9zZW4gaW4gdGhlIGZyYWdfdmFyIGNhbGwgaW4gbWRfYXNzZW1ibGUpLiAgVFlQRQotICAgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIGZyYWcgdG8gYmUgZ2VuZXJhdGVkOyBpdHMgcHJpbWFyeSB0eXBlIGlzCi0gICByc19tYWNoaW5lX2RlcGVuZGVudC4KLQotICAgVGhlIFRZUEUgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMSBhbmQKLSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LiAgVGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZml4dXAgd2lsbAotICAgYmUgZW1pdHRlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMS4KLQotICAgQUREIGJlY29tZXMgdGhlIEZSX1NZTUJPTCBmaWVsZCBvZiB0aGUgZnJhZywgYW5kIE9GRiB0aGUgRlJfT0ZGU0VULiAgKi8KLXN0YXRpYyB2b2lkCi1hZGRfZnJhZyAoYWRkLCBvZmYsIHR5cGUpCi0gICAgIHN5bWJvbFMgKmFkZDsKLSAgICAgb2Zmc2V0VCBvZmY7Ci0gICAgIGludCB0eXBlOwotewotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZyYWdvZmY9dGhlX2lucy5udW1vOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZhZGQ9YWRkOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZvZmY9b2ZmOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWcrK10uZnJhZ3R5PXR5cGU7Ci19Ci0KLSNkZWZpbmUgaXN2YXIoZXgpIFwKLSAgKG9wIChleCkgIT0gT19jb25zdGFudCAmJiBvcCAoZXgpICE9IE9fYmlnKQotCi1zdGF0aWMgY2hhciAqY3JhY2tfb3BlcmFuZCBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBtNjhrX29wICpvcFApKTsKLXN0YXRpYyBpbnQgZ2V0X251bSBQQVJBTVMgKChzdHJ1Y3QgbTY4a19leHAgKmV4cCwgaW50IG9rKSk7Ci1zdGF0aWMgdm9pZCBtNjhrX2lwIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgaW5zZXJ0X3JlZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgc2VsZWN0X2NvbnRyb2xfcmVncyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBpbml0X3JlZ3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcmV2ZXJzZV8xNl9iaXRzIFBBUkFNUyAoKGludCBpbikpOwotc3RhdGljIGludCByZXZlcnNlXzhfYml0cyBQQVJBTVMgKChpbnQgaW4pKTsKLXN0YXRpYyB2b2lkIGluc3RhbGxfZ2VuX29wZXJhbmQgUEFSQU1TICgoaW50IG1vZGUsIGludCB2YWwpKTsKLXN0YXRpYyB2b2lkIGluc3RhbGxfb3BlcmFuZCBQQVJBTVMgKChpbnQgbW9kZSwgaW50IHZhbCkpOwotc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kYXRhMiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZXZlbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfcHJvYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1yaV9jaGlwIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfY2hpcCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZm9wdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfb3B0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3Jlc3RvcmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3NhdmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9pZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2Vsc2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9lbmRpIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfYnJlYWsgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9uZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZm9yIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZW5kZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX3JlcGVhdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX3VudGlsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfd2hpbGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9lbmR3IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWRfYXBwbHlfZml4XzIgUEFSQU1TICgoZml4UyAqLCBvZmZzZXRUKSk7Ci1zdGF0aWMgdm9pZCBtZF9jb252ZXJ0X2ZyYWdfMSBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLXN0YXRpYyBpbnQgY3VycmVudF9hcmNoaXRlY3R1cmU7Ci0KLXN0cnVjdCBtNjhrX2NwdSB7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IGFsaWFzOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtNjhrX2NwdSBhcmNoc1tdID0gewotICB7IG02ODAwMCwgIjY4MDAwIiwgMCB9LAotICB7IG02ODAxMCwgIjY4MDEwIiwgMCB9LAotICB7IG02ODAyMCwgIjY4MDIwIiwgMCB9LAotICB7IG02ODAzMCwgIjY4MDMwIiwgMCB9LAotICB7IG02ODA0MCwgIjY4MDQwIiwgMCB9LAotICB7IG02ODA2MCwgIjY4MDYwIiwgMCB9LAotICB7IGNwdTMyLCAgImNwdTMyIiwgMCB9LAotICB7IG02ODg4MSwgIjY4ODgxIiwgMCB9LAotICB7IG02ODg1MSwgIjY4ODUxIiwgMCB9LAotICB7IG1jZjUyMDAsICI1MjAwIiwgMCB9LAotICB7IG1jZjUyMDZlLCAiNTIwNmUiLCAwIH0sCi0gIHsgbWNmNTMwNywgIjUzMDciLCAwfSwKLSAgLyogQWxpYXNlcyAoZWZmZWN0aXZlbHksIHNvIGZhciBhcyBnYXMgaXMgY29uY2VybmVkKSBmb3IgdGhlIGFib3ZlCi0gICAgIGNwdXMuICAqLwotICB7IG02ODAyMCwgIjY4ayIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODAwOCIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODMwMiIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODMwNiIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODMwNyIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODMyMiIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODM1NiIsIDEgfSwKLSAgeyBtNjgwMDAsICI2OGVjMDAwIiwgMSB9LAotICB7IG02ODAwMCwgIjY4aGMwMDAiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjhoYzAwMSIsIDEgfSwKLSAgeyBtNjgwMjAsICI2OGVjMDIwIiwgMSB9LAotICB7IG02ODAzMCwgIjY4ZWMwMzAiLCAxIH0sCi0gIHsgbTY4MDQwLCAiNjhlYzA0MCIsIDEgfSwKLSAgeyBtNjgwNjAsICI2OGVjMDYwIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzMwIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzMxIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzMyIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzMzIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzM0IiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzM2IiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzQwIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzQxIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzQ5IiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzYwIiwgMSB9LAotICB7IG02ODg4MSwgIjY4ODgyIiwgMSB9LAotICB7IG1jZjUyMDAsICI1MjAyIiwgMSB9LAotICB7IG1jZjUyMDAsICI1MjA0IiwgMSB9LAotICB7IG1jZjUyMDAsICI1MjA2IiwgMSB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBuX2FyY2hzID0gc2l6ZW9mIChhcmNocykgLyBzaXplb2YgKGFyY2hzWzBdKTsKLQotLyogQkNDNjgwMDAgaXMgZm9yIHBhdGNoaW5nIGluIGFuIGV4dHJhIGptcCBpbnN0cnVjdGlvbiBmb3IgbG9uZyBvZmZzZXRzCi0gICBvbiB0aGUgNjgwMDAuICBUaGUgNjgwMDAgZG9lc24ndCBzdXBwb3J0IGxvbmcgYnJhbmNoZXMgd2l0aCBicmFuY2hzICovCi0KLS8qIFRoaXMgdGFibGUgZGVzcmliZXMgaG93IHlvdSBjaGFuZ2Ugc2l6ZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHZhcmlhYmxlCi0gICBzaXplIGV4cHJlc3Npb25zLiAgVGhpcyB2ZXJzaW9uIG9ubHkgc3VwcG9ydHMgdHdvIGtpbmRzLiAqLwotCi0vKiBOb3RlIHRoYXQgY2FsbHMgdG8gZnJhZ192YXIgbmVlZCB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIGV4cGFuc2lvbgotICAgbmVlZGVkOyB0aGlzIGlzIGN1cnJlbnRseSAxMCBieXRlcyBmb3IgREJDQy4gICovCi0KLS8qIFRoZSBmaWVsZHMgYXJlOgotICAgSG93IGZhciBGb3J3YXJkIHRoaXMgbW9kZSB3aWxsIHJlYWNoOgotICAgSG93IGZhciBCYWNrd2FyZCB0aGlzIG1vZGUgd2lsbCByZWFjaDoKLSAgIEhvdyBtYW55IGJ5dGVzIHRoaXMgbW9kZSB3aWxsIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgZnJhZwotICAgV2hpY2ggbW9kZSB0byBnbyB0byBpZiB0aGUgb2Zmc2V0IHdvbid0IGZpdCBpbiB0aGlzIG9uZQotICAgKi8KLXJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7MSwgMSwgMCwgMH0sCQkJLyogRmlyc3QgZW50cmllcyBhcmVuJ3QgdXNlZCAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogRm9yIG5vIGdvb2QgcmVhc29uIGV4Y2VwdCAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdGhhdCB0aGUgVkFYIGRvZXNuJ3QgZWl0aGVyICovCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7KDEyNyksICgtMTI4KSwgMCwgVEFCIChBQlJBTkNILCBTSE9SVCl9LAotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoQUJSQU5DSCwgTE9ORyl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MSwgMSwgMCwgMH0sCQkJLyogRkJSQU5DSCBkb2Vzbid0IGNvbWUgQllURSAqLwotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoRkJSQU5DSCwgTE9ORyl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MSwgMSwgMCwgMH0sCQkJLyogUENSRUwgZG9lc24ndCBjb21lIEJZVEUgKi8KLSAgeygzMjc2NyksICgtMzI3NjgpLCAyLCBUQUIgKFBDUkVMLCBMT05HKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsoMTI3KSwgKC0xMjgpLCAwLCBUQUIgKEJDQzY4MDAwLCBTSE9SVCl9LAotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoQkNDNjgwMDAsIExPTkcpfSwKLSAgezAsIDAsIDYsIDB9LAkJCS8qIGptcCBsb25nIHNwYWNlICovCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MSwgMSwgMCwgMH0sCQkJLyogREJDQyBkb2Vzbid0IGNvbWUgQllURSAqLwotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoREJDQywgTE9ORyl9LAotICB7MCwgMCwgMTAsIDB9LAkJLyogYnJhL2ptcCBsb25nIHNwYWNlICovCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MSwgMSwgMCwgMH0sCQkJLyogUENMRUEgZG9lc24ndCBjb21lIEJZVEUgKi8KLSAgezMyNzY3LCAtMzI3NjgsIDIsIFRBQiAoUENMRUEsIExPTkcpfSwKLSAgezAsIDAsIDYsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgLyogRm9yLCBlLmcuLCBqbXAgcGNyZWwgaW5kZXhlZC4gICovCi0gIHsxMjUsIC0xMzAsIDAsIFRBQiAoUENJTkRFWCwgU0hPUlQpfSwKLSAgezMyNzY1LCAtMzI3NzAsIDIsIFRBQiAoUENJTkRFWCwgTE9ORyl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLX07Ci0KLS8qIFRoZXNlIGFyZSB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcHNldWRvLW9wcy4gIFRoZXNlIGFyZSBpbmNsdWRlZCBzbwotICAgdGhlIGFzc2VtYmxlciBjYW4gd29yayBvbiB0aGUgb3V0cHV0IGZyb20gdGhlIFNVTiBDIGNvbXBpbGVyLCB3aGljaAotICAgZ2VuZXJhdGVzIHRoZXNlLgotICAgKi8KLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkYXRhMSIsIHNfZGF0YTEsIDB9LAotICB7ImRhdGEyIiwgc19kYXRhMiwgMH0sCi0gIHsiYnNzIiwgc19ic3MsIDB9LAotICB7ImV2ZW4iLCBzX2V2ZW4sIDB9LAotICB7InNraXAiLCBzX3NwYWNlLCAwfSwKLSAgeyJwcm9jIiwgc19wcm9jLCAwfSwKLSNpZiBkZWZpbmVkIChURV9TVU4zKSB8fCBkZWZpbmVkIChPQkpfRUxGKQotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIHsic3diZWciLCBzX2lnbm9yZSwgMH0sCi0jZW5kaWYKLSAgeyJleHRlbmQiLCBmbG9hdF9jb25zLCAneCd9LAotICB7Imxkb3VibGUiLCBmbG9hdF9jb25zLCAneCd9LAotCi0gIC8qIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBhcmUgc3VwcG9ydGVkIGZvciBNUkkgY29tcGF0aWJpbGl0eS4gICovCi0gIHsiY2hpcCIsIHNfY2hpcCwgMH0sCi0gIHsiY29tbGluZSIsIHNfc3BhY2UsIDF9LAotICB7ImZvcHQiLCBzX2ZvcHQsIDB9LAotICB7Im1hc2syIiwgc19pZ25vcmUsIDB9LAotICB7Im9wdCIsIHNfb3B0LCAwfSwKLSAgeyJyZWciLCBzX3JlZywgMH0sCi0gIHsicmVzdG9yZSIsIHNfcmVzdG9yZSwgMH0sCi0gIHsic2F2ZSIsIHNfc2F2ZSwgMH0sCi0KLSAgeyJpZiIsIHNfbXJpX2lmLCAwfSwKLSAgeyJpZi5iIiwgc19tcmlfaWYsICdiJ30sCi0gIHsiaWYudyIsIHNfbXJpX2lmLCAndyd9LAotICB7ImlmLmwiLCBzX21yaV9pZiwgJ2wnfSwKLSAgeyJlbHNlIiwgc19tcmlfZWxzZSwgMH0sCi0gIHsiZWxzZS5zIiwgc19tcmlfZWxzZSwgJ3MnfSwKLSAgeyJlbHNlLmwiLCBzX21yaV9lbHNlLCAnbCd9LAotICB7ImVuZGkiLCBzX21yaV9lbmRpLCAwfSwKLSAgeyJicmVhayIsIHNfbXJpX2JyZWFrLCAwfSwKLSAgeyJicmVhay5zIiwgc19tcmlfYnJlYWssICdzJ30sCi0gIHsiYnJlYWsubCIsIHNfbXJpX2JyZWFrLCAnbCd9LAotICB7Im5leHQiLCBzX21yaV9uZXh0LCAwfSwKLSAgeyJuZXh0LnMiLCBzX21yaV9uZXh0LCAncyd9LAotICB7Im5leHQubCIsIHNfbXJpX25leHQsICdsJ30sCi0gIHsiZm9yIiwgc19tcmlfZm9yLCAwfSwKLSAgeyJmb3IuYiIsIHNfbXJpX2ZvciwgJ2InfSwKLSAgeyJmb3IudyIsIHNfbXJpX2ZvciwgJ3cnfSwKLSAgeyJmb3IubCIsIHNfbXJpX2ZvciwgJ2wnfSwKLSAgeyJlbmRmIiwgc19tcmlfZW5kZiwgMH0sCi0gIHsicmVwZWF0Iiwgc19tcmlfcmVwZWF0LCAwfSwKLSAgeyJ1bnRpbCIsIHNfbXJpX3VudGlsLCAwfSwKLSAgeyJ1bnRpbC5iIiwgc19tcmlfdW50aWwsICdiJ30sCi0gIHsidW50aWwudyIsIHNfbXJpX3VudGlsLCAndyd9LAotICB7InVudGlsLmwiLCBzX21yaV91bnRpbCwgJ2wnfSwKLSAgeyJ3aGlsZSIsIHNfbXJpX3doaWxlLCAwfSwKLSAgeyJ3aGlsZS5iIiwgc19tcmlfd2hpbGUsICdiJ30sCi0gIHsid2hpbGUudyIsIHNfbXJpX3doaWxlLCAndyd9LAotICB7IndoaWxlLmwiLCBzX21yaV93aGlsZSwgJ2wnfSwKLSAgeyJlbmR3Iiwgc19tcmlfZW5kdywgMH0sCi0KLSAgezAsIDAsIDB9Ci19OwotCi0KLS8qIFRoZSBtb3RlIHBzZXVkbyBvcHMgYXJlIHB1dCBpbnRvIHRoZSBvcGNvZGUgdGFibGUsIHNpbmNlIHRoZXkKLSAgIGRvbid0IHN0YXJ0IHdpdGggYSAuIHRoZXkgbG9vayBsaWtlIG9wY29kZXMgdG8gZ2FzLgotICAgKi8KLQotI2lmZGVmIE02OEtDT0ZGCi1leHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLUNPTlNUIHBzZXVkb190eXBlUyBtb3RlX3BzZXVkb190YWJsZVtdID0KLXsKLQotICB7ImRjbCIsIGNvbnMsIDR9LAotICB7ImRjIiwgY29ucywgMn0sCi0gIHsiZGN3IiwgY29ucywgMn0sCi0gIHsiZGNiIiwgY29ucywgMX0sCi0KLSAgeyJkc2wiLCBzX3NwYWNlLCA0fSwKLSAgeyJkcyIsIHNfc3BhY2UsIDJ9LAotICB7ImRzdyIsIHNfc3BhY2UsIDJ9LAotICB7ImRzYiIsIHNfc3BhY2UsIDF9LAotCi0gIHsieGRlZiIsIHNfZ2xvYmwsIDB9LAotI2lmZGVmIE9CSl9FTEYKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAotI2Vsc2UKLSAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0jZW5kaWYKLSNpZmRlZiBNNjhLQ09GRgotICB7InNlY3QiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0aW9uIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0jZW5kaWYKLSAgezAsIDAsIDB9Ci19OwotCi0jZGVmaW5lIGlzc2J5dGUoeCkJKCh4KT49LTEyOCAmJiAoeCk8PTEyNykKLSNkZWZpbmUgaXN1Ynl0ZSh4KQkoKHgpPj0wICYmICh4KTw9MjU1KQotI2RlZmluZSBpc3N3b3JkKHgpCSgoeCk+PS0zMjc2OCAmJiAoeCk8PTMyNzY3KQotI2RlZmluZSBpc3V3b3JkKHgpCSgoeCk+PTAgJiYgKHgpPD02NTUzNSkKLQotI2RlZmluZSBpc2J5dGUoeCkJKCh4KT49IC0yNTUgJiYgKHgpPD0yNTUpCi0jZGVmaW5lIGlzd29yZCh4KQkoKHgpPj0tNjU1MzYgJiYgKHgpPD02NTUzNSkKLSNkZWZpbmUgaXNsb25nKHgpCSgxKQotCi1leHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotCi1zdGF0aWMgY2hhciBta2xvd2VyX3RhYmxlWzI1Nl07Ci0jZGVmaW5lIG1rbG93ZXIoYykgKG1rbG93ZXJfdGFibGVbKHVuc2lnbmVkIGNoYXIpKGMpXSkKLXN0YXRpYyBjaGFyIG5vdGVuZF90YWJsZVsyNTZdOwotc3RhdGljIGNoYXIgYWx0X25vdGVuZF90YWJsZVsyNTZdOwotI2RlZmluZSBub3RlbmQocykJCQkJCQlcCi0gICghIChub3RlbmRfdGFibGVbKHVuc2lnbmVkIGNoYXIpICpzXQkJCQlcCi0gICAgICB8fCAoKnMgPT0gJzonCQkJCQkJXAotCSAgJiYgYWx0X25vdGVuZF90YWJsZVsodW5zaWduZWQgY2hhcikgc1sxXV0pKSkKLQotI2lmIGRlZmluZWQgKE02OEtDT0ZGKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLQotI2lmZGVmIE5PX1BDUkVMX1JFTE9DUwotCi1pbnQKLW1ha2VfcGNyZWxfYWJzb2x1dGUoZml4UCwgYWRkX251bWJlcikKLSAgICBmaXhTICpmaXhQOwotICAgIGxvbmcgKmFkZF9udW1iZXI7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm9wY29kZSA9IGZpeFAtPmZ4X2ZyYWctPmZyX29wY29kZTsKLQotICAvKiByZXdyaXRlIHRoZSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgdG8gYWJzb2x1dGUgYWRkcmVzcyBvbmVzLgotICAgKiB0aGVzZSBhcmUgcnVtb3VyZWQgdG8gYmUgZmFzdGVyLCBhbmQgdGhlIGFwb2xsbyBsaW5rZXIgcmVmdXNlcwotICAgKiB0byBkZWFsIHdpdGggdGhlIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotICAgKi8KLSAgaWYgKG9wY29kZVswXSA9PSAweDYwICYmIG9wY29kZVsxXSA9PSAweGZmKSAvKiBCUkEgLT4gSk1QICovCi0gICAgewotICAgICAgb3Bjb2RlWzBdID0gMHg0ZTsKLSAgICAgIG9wY29kZVsxXSA9IDB4Zjk7Ci0gICAgfQotICBlbHNlIGlmIChvcGNvZGVbMF0gPT0gMHg2MSAmJiBvcGNvZGVbMV0gPT0gMHhmZikgLyogQlNSIC0+IEpTUiAqLwotICAgIHsKLSAgICAgIG9wY29kZVswXSA9IDB4NGU7Ci0gICAgICBvcGNvZGVbMV0gPSAweGI5OwotICAgIH0KLSAgZWxzZQotICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIikpOwotICAqYWRkX251bWJlciAtPSA0OwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIE5PX1BDUkVMX1JFTE9DUyAqLwotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF90Y2JpdCAmJiBmaXhQLT5meF9zaXplID09IDQpCi0gICAgcmV0dXJuIFJfUkVMTE9OR19ORUc7Ci0jaWZkZWYgTk9fUENSRUxfUkVMT0NTCi0gIGtub3cgKGZpeFAtPmZ4X3BjcmVsID09IDApOwotICByZXR1cm4gKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUkVMQllURQotCSAgOiBmaXhQLT5meF9zaXplID09IDIgPyBSX0RJUjE2Ci0JICA6IFJfRElSMzIpOwotI2Vsc2UKLSAgcmV0dXJuIChmaXhQLT5meF9wY3JlbCA/Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9QQ1JCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1BDUldPUkQgOgotCSAgIFJfUENSTE9ORykgOgotCSAgKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUkVMQllURSA6Ci0JICAgZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9SRUxXT1JEIDoKLQkgICBSX1JFTExPTkcpKTsKLSNlbmRpZgotfQotCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLQotLyogQ29tcHV0ZSB0aGUgcmVsb2NhdGlvbiBjb2RlIGZvciBhIGZpeHVwIG9mIFNJWkUgYnl0ZXMsIHVzaW5nIHBjCi0gICByZWxhdGl2ZSByZWxvY2F0aW9uIGlmIFBDUkVMIGlzIG5vbi16ZXJvLiAgUElDIHNheXMgd2hldGhlciBhIHNwZWNpYWwKLSAgIHBpYyByZWxvY2F0aW9uIHdhcyByZXF1ZXN0ZWQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGdldF9yZWxvY19jb2RlCi0gIFBBUkFNUyAoKGludCwgaW50LCBlbnVtIHBpY19yZWxvY2F0aW9uKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWdldF9yZWxvY19jb2RlIChzaXplLCBwY3JlbCwgcGljKQotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IHBjcmVsOwotICAgICBlbnVtIHBpY19yZWxvY2F0aW9uIHBpYzsKLXsKLSAgc3dpdGNoIChwaWMpCi0gICAgewotICAgIGNhc2UgcGljX2dvdF9wY3JlbDoKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIEJGRF9SRUxPQ184X0dPVF9QQ1JFTDsKLQljYXNlIDI6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDsKLQljYXNlIDQ6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcGljX2dvdF9vZmY6Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMToKLQkgIHJldHVybiBCRkRfUkVMT0NfOF9HT1RPRkY7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIEJGRF9SRUxPQ18xNl9HT1RPRkY7Ci0JY2FzZSA0OgotCSAgcmV0dXJuIEJGRF9SRUxPQ18zMl9HT1RPRkY7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHBpY19wbHRfcGNyZWw6Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMToKLQkgIHJldHVybiBCRkRfUkVMT0NfOF9QTFRfUENSRUw7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIEJGRF9SRUxPQ18xNl9QTFRfUENSRUw7Ci0JY2FzZSA0OgotCSAgcmV0dXJuIEJGRF9SRUxPQ18zMl9QTFRfUENSRUw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHBpY19wbHRfb2ZmOgotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzhfUExUT0ZGOwotCWNhc2UgMjoKLQkgIHJldHVybiBCRkRfUkVMT0NfMTZfUExUT0ZGOwotCWNhc2UgNDoKLQkgIHJldHVybiBCRkRfUkVMT0NfMzJfUExUT0ZGOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBwaWNfbm9uZToKLSAgICAgIGlmIChwY3JlbCkKLQl7Ci0JICBzd2l0Y2ggKHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSAxOgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgICAgY2FzZSAyOgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICAgIGNhc2UgNDoKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoc2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDE6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ184OwotCSAgICBjYXNlIDI6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ18xNjsKLQkgICAgY2FzZSA0OgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfMzI7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChwY3JlbCkKLSAgICB7Ci0gICAgICBpZiAocGljID09IHBpY19ub25lKQotCWFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcGljIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBpYyA9PSBwaWNfbm9uZSkKLQlhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIHNpemUpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBpYyByZWxvY2F0aW9uIiksIHNpemUpOwotICAgIH0KLQotICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Ci19Ci0KLS8qIEhlcmUgd2UgZGVjaWRlIHdoaWNoIGZpeHVwcyBjYW4gYmUgYWRqdXN0ZWQgdG8gbWFrZSB0aGVtIHJlbGF0aXZlCi0gICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIGluc3RlYWQgb2YgdGhlIHN5bWJvbC4gIEJhc2ljYWxseQotICAgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgZG9uZQotICAgY29ycmVjdGx5LCBzbyBpbiBzb21lIGNhc2VzIHdlIGZvcmNlIHRoZSBvcmlnaW5hbCBzeW1ib2wgdG8gYmUKLSAgIHVzZWQuICAqLwotaW50Ci10Y19tNjhrX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgfHwgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogYWRqdXN0X3JlbG9jX3N5bXMgZG9lc24ndCBrbm93IGFib3V0IHRoZSBHT1QgKi8KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzhfR09UX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9HT1RfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyX0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ184X1BMVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QTFRfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRPRkY6Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLQotI2Vsc2UgLyogIU9CSl9FTEYgKi8KLQotI2RlZmluZSBnZXRfcmVsb2NfY29kZShTSVpFLFBDUkVMLE9USEVSKSBOT19SRUxPQwotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLQotICBpZiAoZml4cC0+ZnhfdGNiaXQpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotCi0gICAgICAvKiBTaW5jZSBESUZGX0VYUFJfT0sgaXMgZGVmaW5lZCBpbiB0Yy1tNjhrLmgsIGl0IGlzIHBvc3NpYmxlCi0gICAgICAgICB0aGF0IGZpeHVwX3NlZ21lbnQgY29udmVydGVkIGEgbm9uLVBDIHJlbGF0aXZlIHJlbG9jIGludG8gYQotICAgICAgICAgUEMgcmVsYXRpdmUgcmVsb2MuICBJbiBzdWNoIGEgY2FzZSwgd2UgbmVlZCB0byBjb252ZXJ0IHRoZQotICAgICAgICAgcmVsb2MgY29kZS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JewotCSAgc3dpdGNoIChjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfR09UX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ184X1BMVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfUExUX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QTFRPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiQ2Fubm90IG1ha2UgJXMgcmVsb2NhdGlvbiBQQyByZWxhdGl2ZSIpLAotCQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotI2RlZmluZSBGKFNaLFBDUkVMKQkJKCgoU1opIDw8IDEpICsgKFBDUkVMKSkKLSAgICAgIHN3aXRjaCAoRiAoZml4cC0+Znhfc2l6ZSwgZml4cC0+ZnhfcGNyZWwpKQotCXsKLSNkZWZpbmUgTUFQKFNaLFBDUkVMLFRZUEUpCWNhc2UgRihTWixQQ1JFTCk6IGNvZGUgPSAoVFlQRSk7IGJyZWFrCi0JICBNQVAgKDEsIDAsIEJGRF9SRUxPQ184KTsKLQkgIE1BUCAoMiwgMCwgQkZEX1JFTE9DXzE2KTsKLQkgIE1BUCAoNCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgIE1BUCAoMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCSAgTUFQICgyLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotCSAgTUFQICg0LCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotI3VuZGVmIEYKLSN1bmRlZiBNQVAKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotI2lmbmRlZiBPQkpfRUxGCi0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IDA7Ci0jZWxzZQotICBpZiAoIWZpeHAtPmZ4X3BjcmVsKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gKHNlY3Rpb24tPnZtYQotCQkgICAgICsgKGZpeHAtPmZ4X3BjcmVsX2FkanVzdCA9PSA2NAotCQkJPyAtMSA6IGZpeHAtPmZ4X3BjcmVsX2FkanVzdCkKLQkJICAgICArIGZpeHAtPmZ4X2FkZG51bWJlcgotCQkgICAgICsgbWRfcGNyZWxfZnJvbSAoZml4cCkpOwotI2VuZGlmCi0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBhc3NlcnQgKHJlbG9jLT5ob3d0byAhPSAwKTsKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFJldHVybiB6ZXJvIGlmIHRoZSByZWZlcmVuY2UgdG8gU1lNQk9MIGZyb20gd2l0aGluIHRoZSBzYW1lIHNlZ21lbnQgbWF5Ci0gICBiZSByZWxheGVkLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIE9uIGFuIEVMRiBzeXN0ZW0sIHdlIGNhbid0IHJlbGF4IGFuIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2wsCi0gICBiZWNhdXNlIGl0IG1heSBiZSBvdmVycmlkZGVuIGJ5IGEgc2hhcmVkIGxpYnJhcnkuICBIb3dldmVyLCBpZgotICAgVEFSR0VUX09TIGlzICJlbGYiLCB0aGVuIHdlIHByZXN1bWUgdGhhdCB3ZSBhcmUgYXNzZW1ibGluZyBmb3IgYW4KLSAgIGVtYmVkZGVkIHN5c3RlbSwgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNoYXJlZAotICAgbGlicmFyaWVzLCBhbmQgd2UgY2FuIHJlbGF4IGFueXRoaW5nLiAgKi8KLQotI2RlZmluZSByZWxheGFibGVfc3ltYm9sKHN5bWJvbCkJCVwKLSAgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgPT0gMAkJXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoc3ltYm9sKQkJCVwKLSAgICAgICAmJiAhIFNfSVNfV0VBSyAoc3ltYm9sKSkpCi0KLSNlbHNlCi0KLSNkZWZpbmUgcmVsYXhhYmxlX3N5bWJvbChzeW1ib2wpIDEKLQotI2VuZGlmCi0gCi0vKiBIYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlLiAgTlVMTCBtZWFucyBhbnkgdXNlIGJlZm9yZQotICAgbTY4a19pcF9iZWdpbigpIHdpbGwgY3Jhc2guICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0MCi0vKiBBc3NlbWJsZSBhbiBtNjhrIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW02OGtfaXAgKGluc3RyaW5nKQotICAgICBjaGFyICppbnN0cmluZzsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgc3RydWN0IG02OGtfb3AgKm9wUDsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG02OGtfaW5jYW50ICpvcGNvZGU7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0gIHJlZ2lzdGVyIGludCB0bXByZWcgPSAwLCBiYXNlbyA9IDAsIG91dHJvID0gMCwgbmV4dHdvcmQ7Ci0gIGNoYXIgKnBkb3QsICpwZG90bW92ZTsKLSAgZW51bSBtNjhrX3NpemUgc2l6MSwgc2l6MjsKLSAgY2hhciBjOwotICBpbnQgbG9zaW5nOwotICBpbnQgb3BzZm91bmQ7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzZdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZHA7Ci0gIHVuc2lnbmVkIGxvbmcgb2tfYXJjaCA9IDA7Ci0KLSAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0gICAgaW5zdHJpbmcrKzsJCQkvKiBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCi0gIC8qIFNjYW4gdXAgdG8gZW5kIG9mIG9wZXJhdGlvbi1jb2RlLCB3aGljaCBNVVNUIGVuZCBpbiBlbmQtb2Ytc3RyaW5nCi0gICAgIG9yIGV4YWN0bHkgMSBzcGFjZS4gKi8KLSAgcGRvdCA9IDA7Ci0gIGZvciAocCA9IGluc3RyaW5nOyAqcCAhPSAnXDAnOyBwKyspCi0gICAgewotICAgICAgaWYgKCpwID09ICcgJykKLQlicmVhazsKLSAgICAgIGlmICgqcCA9PSAnLicpCi0JcGRvdCA9IHA7Ci0gICAgfQotCi0gIGlmIChwID09IGluc3RyaW5nKQotICAgIHsKLSAgICAgIHRoZV9pbnMuZXJyb3IgPSBfKCJObyBvcGVyYXRvciIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBwIG5vdyBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgb3Bjb2RlIG5hbWUsIHByb2JhYmx5IHdoaXRlc3BhY2UuCi0gICAgIE1ha2Ugc3VyZSB0aGUgbmFtZSBpcyBudWxsIHRlcm1pbmF0ZWQgYnkgY2xvYmJlcmluZyB0aGUKLSAgICAgd2hpdGVzcGFjZSwgbG9vayBpdCB1cCBpbiB0aGUgaGFzaCB0YWJsZSwgdGhlbiBmaXggaXQgYmFjay4KLSAgICAgUmVtb3ZlIGEgZG90LCBmaXJzdCwgc2luY2UgdGhlIG9wY29kZSB0YWJsZXMgaGF2ZSBub25lLiAgKi8KLSAgaWYgKHBkb3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKHBkb3Rtb3ZlID0gcGRvdDsgcGRvdG1vdmUgPCBwOyBwZG90bW92ZSsrKQotCSpwZG90bW92ZSA9IHBkb3Rtb3ZlWzFdOwotICAgICAgcC0tOwotICAgIH0KLQotICBjID0gKnA7Ci0gICpwID0gJ1wwJzsKLSAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBtNjhrX2luY2FudCAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIGluc3RyaW5nKTsKLSAgKnAgPSBjOwotCi0gIGlmIChwZG90ICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwZG90bW92ZSA9IHA7IHBkb3Rtb3ZlID4gcGRvdDsgcGRvdG1vdmUtLSkKLQkqcGRvdG1vdmUgPSBwZG90bW92ZVstMV07Ci0gICAgICAqcGRvdCA9ICcuJzsKLSAgICAgICsrcDsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHRoZV9pbnMuZXJyb3IgPSBfKCJVbmtub3duIG9wZXJhdG9yIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGZvdW5kIGEgbGVnaXRpbWF0ZSBvcGNvZGUsIHN0YXJ0IG1hdGNoaW5nIG9wZXJhbmRzICovCi0gIHdoaWxlICgqcCA9PSAnICcpCi0gICAgKytwOwotCi0gIGlmIChvcGNvZGUtPm1fb3BlcmFuZHMgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqb2xkID0gJ1xuJzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgICAvKiBBaGggLSBpdCdzIGEgbW90b3JvbGEgc3R5bGUgcHN1ZWRvIG9wICovCi0gICAgICBtb3RlX3BzZXVkb190YWJsZVtvcGNvZGUtPm1fb3BudW1dLnBvY19oYW5kbGVyCi0JKG1vdGVfcHNldWRvX3RhYmxlW29wY29kZS0+bV9vcG51bV0ucG9jX3ZhbCk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGQ7Ci0gICAgICAqb2xkID0gMDsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmxhZ19tcmkgJiYgb3Bjb2RlLT5tX29wbnVtID09IDApCi0gICAgewotICAgICAgLyogSW4gTVJJIG1vZGUsIHJhbmRvbSBnYXJiYWdlIGlzIGFsbG93ZWQgYWZ0ZXIgYW4gaW5zdHJ1Y3Rpb24KLSAgICAgICAgIHdoaWNoIGFjY2VwdHMgbm8gb3BlcmFuZHMuICAqLwotICAgICAgdGhlX2lucy5hcmdzID0gb3Bjb2RlLT5tX29wZXJhbmRzOwotICAgICAgdGhlX2lucy5udW1hcmdzID0gb3Bjb2RlLT5tX29wbnVtOwotICAgICAgdGhlX2lucy5udW1vID0gb3Bjb2RlLT5tX2NvZGVudW07Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSA9IGdldG9uZSAob3Bjb2RlKTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdID0gZ2V0dHdvIChvcGNvZGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmb3IgKG9wUCA9ICZ0aGVfaW5zLm9wZXJhbmRzWzBdOyAqcDsgb3BQKyspCi0gICAgewotICAgICAgcCA9IGNyYWNrX29wZXJhbmQgKHAsIG9wUCk7Ci0KLSAgICAgIGlmIChvcFAtPmVycm9yKQotCXsKLQkgIHRoZV9pbnMuZXJyb3IgPSBvcFAtPmVycm9yOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgb3BzZm91bmQgPSBvcFAgLSAmdGhlX2lucy5vcGVyYW5kc1swXTsKLQotICAvKiBUaGlzIHVnbHkgaGFjayBpcyB0byBzdXBwb3J0IHRoZSBmbG9hdGluZyBwdCBvcGNvZGVzIGluIHRoZWlyCi0gICAgIHN0YW5kYXJkIGZvcm0uICBFc3NlbnRpYWxseSwgd2UgZmFrZSBhIGZpcnN0IGVudHkgb2YgdHlwZSBDT1AjMSAqLwotICBpZiAob3Bjb2RlLT5tX29wZXJhbmRzWzBdID09ICdJJykKLSAgICB7Ci0gICAgICBpbnQgbjsKLQotICAgICAgZm9yIChuID0gb3BzZm91bmQ7IG4gPiAwOyAtLW4pCi0JdGhlX2lucy5vcGVyYW5kc1tuXSA9IHRoZV9pbnMub3BlcmFuZHNbbiAtIDFdOwotCi0gICAgICBtZW1zZXQgKChjaGFyICopICgmdGhlX2lucy5vcGVyYW5kc1swXSksICdcMCcsCi0JICAgICAgc2l6ZW9mICh0aGVfaW5zLm9wZXJhbmRzWzBdKSk7Ci0gICAgICB0aGVfaW5zLm9wZXJhbmRzWzBdLm1vZGUgPSBDT05UUk9MOwotICAgICAgdGhlX2lucy5vcGVyYW5kc1swXS5yZWcgPSBtNjhrX2Zsb2F0X2NvcG51bTsKLSAgICAgIG9wc2ZvdW5kKys7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGdvdCB0aGUgb3BlcmFuZHMuICBGaW5kIGFuIG9wY29kZSB0aGF0J2xsIGFjY2VwdCB0aGVtICovCi0gIGZvciAobG9zaW5nID0gMDs7KQotICAgIHsKLSAgICAgIC8qIElmIHdlIGRpZG4ndCBnZXQgdGhlIHJpZ2h0IG51bWJlciBvZiBvcHMsIG9yIHdlIGhhdmUgbm8KLQkgY29tbW9uIG1vZGVsIHdpdGggdGhpcyBwYXR0ZXJuIHRoZW4gcmVqZWN0IHRoaXMgcGF0dGVybi4gKi8KLQotICAgICAgb2tfYXJjaCB8PSBvcGNvZGUtPm1fYXJjaDsKLSAgICAgIGlmIChvcHNmb3VuZCAhPSBvcGNvZGUtPm1fb3BudW0KLQkgIHx8ICgob3Bjb2RlLT5tX2FyY2ggJiBjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gMCkpCi0JKytsb3Npbmc7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChzID0gb3Bjb2RlLT5tX29wZXJhbmRzLCBvcFAgPSAmdGhlX2lucy5vcGVyYW5kc1swXTsKLQkgICAgICAgKnMgJiYgIWxvc2luZzsKLQkgICAgICAgcyArPSAyLCBvcFArKykKLQkgICAgewotCSAgICAgIC8qIFdhcm5pbmc6IHRoaXMgc3dpdGNoIGlzIGh1Z2UhICovCi0JICAgICAgLyogSSd2ZSB0cmllZCB0byBvcmdhbml6ZSB0aGUgY2FzZXMgaW50byB0aGlzIG9yZGVyOgotCQkgbm9uLWFscGhhIGZpcnN0LCB0aGVuIGFscGhhIGJ5IGxldHRlci4gIExvd2VyLWNhc2UKLQkJIGdvZXMgZGlyZWN0bHkgYmVmb3JlIHVwcGVyY2FzZSBjb3VudGVycGFydC4gICovCi0JICAgICAgLyogQ29kZSB3aXRoIG11bHRpcGxlIGNhc2UgLi4uOiBnZXRzIHNvcnRlZCBieSB0aGUgbG93ZXN0Ci0JCSBjYXNlIC4uLiBpdCBiZWxvbmdzIHRvLiAgSSBob3BlIHRoaXMgbWFrZXMgc2Vuc2UuICAqLwotCSAgICAgIHN3aXRjaCAoKnMpCi0JCXsKLQkJY2FzZSAnISc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICc8JzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJz4nOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQwotCQkJICB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbSc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIEFJTkRSOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAnbic6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERJU1A6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICdvJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgQkFTRToKLQkJICAgIGNhc2UgQUJTTDoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICdwJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQUlORFI6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBESVNQOgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICdxJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQUlORFI6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBESVNQOgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAndic6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFJTkRSOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgRElTUDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICcjJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IElNTUVEKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnYicKLQkJCSAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAmJiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgICAgICB8fCAhIGlzYnl0ZSAob3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ0InCi0JCQkgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgJiYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICAgICAgfHwgISBpc3NieXRlIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAndycKLQkJCSAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAmJiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgICAgICB8fCAhIGlzd29yZCAob3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ1cnCi0JCQkgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgJiYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICAgICAgfHwgISBpc3N3b3JkIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnXic6Ci0JCWNhc2UgJ1QnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICckJzoKLQkJICBpZiAob3BQLT5tb2RlID09IEFSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBJTU1FRAotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gUkVHTFNUCi0JCSAgICAgIHx8IChvcFAtPm1vZGUgIT0gQUJTTAotCQkJICAmJiAob3BQLT5yZWcgPT0gUEMKLQkJCSAgICAgIHx8IG9wUC0+cmVnID09IFpQQykpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnJSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBGUFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gUkVHTFNUCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBJTU1FRAotCQkgICAgICB8fCAob3BQLT5tb2RlICE9IEFCU0wKLQkJCSAgJiYgKG9wUC0+cmVnID09IFBDCi0JCQkgICAgICB8fCBvcFAtPnJlZyA9PSBaUEMpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJyYnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQwotCQkJICB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnKic6Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBGUFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gUkVHTFNUKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnKyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBSU5DKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBREVDKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLyc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICc7JzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnPyc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEFCU0w6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLQkJCWxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICdAJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ34nOgkvKiBGb3Igbm93ISAoSkYgRk9PIGlzIHRoaXMgcmlnaHQ/KSAqLwotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQwotCQkJICB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnMyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IChvcFAtPnJlZyAhPSBUVDAgJiYgb3BQLT5yZWcgIT0gVFQxKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0EnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQVJFRykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2EnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQUlORFIpCi0JCSAgICArK2xvc2luZzsKLQkJICBicmVhazsKLQotCQljYXNlICdCJzoJLyogRk9PICovCi0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBQlNMCi0JCSAgICAgIHx8IChmbGFnX2xvbmdfanVtcHMKLQkJCSAgJiYgc3RybmNtcCAoaW5zdHJpbmcsICJqYnNyIiwgNCkgPT0gMCkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdDJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gQ0NSKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBESVNQCi0JCSAgICAgIHx8IG9wUC0+cmVnIDwgQUREUjAKLQkJICAgICAgfHwgb3BQLT5yZWcgPiBBRERSNykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0QnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gRFJFRykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0UnOgotCQkgIGlmIChvcFAtPnJlZyAhPSBBQ0MpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdGJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEZQUkVHKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRyc6Ci0JCSAgaWYgKG9wUC0+cmVnICE9IE1BQ1NSKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnSCc6Ci0JCSAgaWYgKG9wUC0+cmVnICE9IE1BU0spCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdJJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5yZWcgPCBDT1AwCi0JCSAgICAgIHx8IG9wUC0+cmVnID4gQ09QNykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0onOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPnJlZyA8IFVTUAotCQkgICAgICB8fCBvcFAtPnJlZyA+IGxhc3RfbW92ZWNfcmVnKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgKnJwOwotCQkgICAgICBmb3IgKHJwID0gY29udHJvbF9yZWdzOyAqcnA7IHJwKyspCi0JCQlpZiAoKnJwID09IG9wUC0+cmVnKQotCQkJICBicmVhazsKLQkJICAgICAgaWYgKCpycCA9PSAwKQotCQkJbG9zaW5nKys7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnayc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2wnOgotCQljYXNlICdMJzoKLQkJICBpZiAob3BQLT5tb2RlID09IERSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEFSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHKQotCQkgICAgewotCQkgICAgICBpZiAoc1sxXSA9PSAnOCcpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSBEUkVHOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAob3BQLT5yZWcgLSBEQVRBMCk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIEFSRUc6Ci0JCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IChvcFAtPnJlZyAtIEFERFIwICsgOCk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIEZQUkVHOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAob3BQLT5yZWcgLSBGUDAgKyAxNik7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBkZWZhdWx0OgotCQkJICAgICAgYWJvcnQgKCk7Ci0JCQkgICAgfQotCQkJICBvcFAtPm1vZGUgPSBSRUdMU1Q7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAob3BQLT5tb2RlID09IENPTlRST0wpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzWzFdICE9ICc4JykKLQkJCWxvc2luZysrOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JCQkgICAgewotCQkJICAgIGNhc2UgRlBJOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAyNDsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgRlBTOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAyNTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgRlBDOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAyNjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkgICAgICBsb3NpbmcrKzsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgb3BQLT5tb2RlID0gUkVHTFNUOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKG9wUC0+bW9kZSAhPSBSRUdMU1QpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChzWzFdID09ICc4JyAmJiAob3BQLT5tYXNrICYgMHgwZmZmZmZmKSAhPSAwKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnMycgJiYgKG9wUC0+bWFzayAmIDB4NzAwMDAwMCkgIT0gMCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ00nOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgfHwgISBpc3NieXRlIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmICghIG02OGtfcXVpY2sKLQkJCSAgICYmIGluc3RyaW5nWzNdICE9ICdxJwotCQkJICAgJiYgaW5zdHJpbmdbNF0gIT0gJ3EnKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnTyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBEUkVHCi0JCSAgICAgICYmIG9wUC0+bW9kZSAhPSBJTU1FRAotCQkgICAgICAmJiBvcFAtPm1vZGUgIT0gQUJTTCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1EnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgfHwgb3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIgPCAxCi0JCQkgICB8fCBvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlciA+IDgpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmICghIG02OGtfcXVpY2sKLQkJCSAgICYmIChzdHJuY21wIChpbnN0cmluZywgImFkZCIsIDMpID09IDAKLQkJCSAgICAgICB8fCBzdHJuY21wIChpbnN0cmluZywgInN1YiIsIDMpID09IDApCi0JCQkgICAmJiBpbnN0cmluZ1szXSAhPSAncScpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdSJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IERSRUcgJiYgb3BQLT5tb2RlICE9IEFSRUcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdyJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEFJTkRSCi0JCSAgICAgICYmIChvcFAtPm1vZGUgIT0gQkFTRQotCQkJICB8fCAob3BQLT5yZWcgIT0gMAotCQkJICAgICAgJiYgb3BQLT5yZWcgIT0gWkFERFIwKQotCQkJICB8fCBvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19hYnNlbnQKLQkJCSAgfHwgKChvcFAtPmluZGV4LnJlZyA8IERBVEEwCi0JCQkgICAgICAgfHwgb3BQLT5pbmRleC5yZWcgPiBEQVRBNykKLQkJCSAgICAgICYmIChvcFAtPmluZGV4LnJlZyA8IEFERFIwCi0JCQkJICB8fCBvcFAtPmluZGV4LnJlZyA+IEFERFI3KSkKLQkJCSAgfHwgb3BQLT5pbmRleC5zaXplICE9IFNJWkVfVU5TUEVDCi0JCQkgIHx8IG9wUC0+aW5kZXguc2NhbGUgIT0gMSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdzJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgISAob3BQLT5yZWcgPT0gRlBJCi0JCQkgICAgfHwgb3BQLT5yZWcgPT0gRlBTCi0JCQkgICAgfHwgb3BQLT5yZWcgPT0gRlBDKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1MnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBTUikKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3QnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgfHwgb3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIgPCAwCi0JCQkgICB8fCBvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlciA+IDcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdVJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gVVNQKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBKRiB0aGVzZSBhcmUgb3V0IG9mIG9yZGVyLiAgV2UgY291bGQgcHV0IHRoZW0KLQkJICAgICBpbiBvcmRlciBpZiB3ZSB3ZXJlIHdpbGxpbmcgdG8gcHV0IHVwIHdpdGgKLQkJICAgICBidW5jaGVzIG9mICNpZmRlZiBtNjg4NTFzIGluIHRoZSBjb2RlLgotCi0JCSAgICAgRG9uJ3QgZm9yZ2V0IHRoYXQgeW91IG5lZWQgdGhlc2Ugb3BlcmFuZHMKLQkJICAgICB0byB1c2UgNjgwMzAgTU1VIGluc3RydWN0aW9ucy4gICovCi0jaWZuZGVmIE5PXzY4ODUxCi0JCSAgLyogTWVtb3J5IGFkZHJlc3NpbmcgbW9kZSB1c2VkIGJ5IHBmbHVzaHIgKi8KLQkJY2FzZSAnfCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBGUFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gQVJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gUkVHTFNUKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgLyogV2Ugc2hvdWxkIGFjY2VwdCBpbW1lZGlhdGUgb3BlcmFuZHMsIGJ1dCB0aGV5Ci0gICAgICAgICAgICAgICAgICAgICBzdXBwb3NlZGx5IGhhdmUgdG8gYmUgcXVhZCB3b3JkLCBhbmQgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSB0aGF0LiAgSSB3b3VsZCBsaWtlIHRvIHNlZSB3aGF0IGEgTW90b3JvbGEKLSAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlciBkb2VzIGJlZm9yZSBkb2luZyBzb21ldGhpbmcgaGVyZS4gICovCi0JCSAgaWYgKG9wUC0+bW9kZSA9PSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2YnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAob3BQLT5yZWcgIT0gU0ZDICYmIG9wUC0+cmVnICE9IERGQykpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcwJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gVEMpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcxJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gQUMpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcyJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgKG9wUC0+cmVnICE9IENBTAotCQkJICAmJiBvcFAtPnJlZyAhPSBWQUwKLQkJCSAgJiYgb3BQLT5yZWcgIT0gU0NDKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1YnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPnJlZyAhPSBWQUwpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdXJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgKG9wUC0+cmVnICE9IERSUAotCQkJICAmJiBvcFAtPnJlZyAhPSBTUlAKLQkJCSAgJiYgb3BQLT5yZWcgIT0gQ1JQKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1gnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAoIShvcFAtPnJlZyA+PSBCQUQgJiYgb3BQLT5yZWcgPD0gQkFEICsgNykKLQkJCSAgJiYgIShvcFAtPnJlZyA+PSBCQUMgJiYgb3BQLT5yZWcgPD0gQkFDICsgNykpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IFBTUikKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1onOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBQQ1NSKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0jZW5kaWYKLQkJY2FzZSAnYyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IChvcFAtPnJlZyAhPSBOQwotCQkJICAmJiBvcFAtPnJlZyAhPSBJQwotCQkJICAmJiBvcFAtPnJlZyAhPSBEQwotCQkJICAmJiBvcFAtPnJlZyAhPSBCQykpCi0JCSAgICB7Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgfQkJLyogbm90IGEgY2FjaGUgc3BlY2lmaWVyLiAqLwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ18nOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQUJTTCkKLQkJICAgICsrbG9zaW5nOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3UnOgotCQkgIGlmIChvcFAtPnJlZyA8IERBVEEwTCB8fCBvcFAtPnJlZyA+IEFERFI3VSkKLQkJICAgIGxvc2luZysrOwotCQkgIC8qIEZJWE1FOiBrbHVkZ2UgaW5zdGVhZCBvZiBmaXhpbmcgcGFyc2VyOgotICAgICAgICAgICAgICAgICAgICAgdXBwZXIvbG93ZXIgcmVnaXN0ZXJzIGFyZSAqbm90KiBDT05UUk9MCi0gICAgICAgICAgICAgICAgICAgICByZWdpc3RlcnMsIGJ1dCBvcmRpbmFyeSBvbmVzLiAqLwotCQkgIGlmICgob3BQLT5yZWcgPj0gREFUQTBMICYmIG9wUC0+cmVnIDw9IERBVEE3TCkKLQkJICAgICAgfHwgKG9wUC0+cmVnID49IERBVEEwVSAmJiBvcFAtPnJlZyA8PSBEQVRBN1UpKQotCQkgICAgb3BQLT5tb2RlID0gRFJFRzsKLQkJICBlbHNlCi0JCSAgICBvcFAtPm1vZGUgPSBBUkVHOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCX0JCS8qIHN3aXRjaCBvbiB0eXBlIG9mIG9wZXJhbmQgKi8KLQotCSAgICAgIGlmIChsb3NpbmcpCi0JCWJyZWFrOwotCSAgICB9CQkJLyogZm9yIGVhY2ggb3BlcmFuZCAqLwotCX0JCQkvKiBpZiBpbW1lZGlhdGVseSB3cm9uZyAqLwotCi0gICAgICBpZiAoIWxvc2luZykKLQl7Ci0JICBicmVhazsKLQl9CQkJLyogZ290IGl0LiAqLwotCi0gICAgICBvcGNvZGUgPSBvcGNvZGUtPm1fbmV4dDsKLQotICAgICAgaWYgKCFvcGNvZGUpCi0JewotCSAgaWYgKG9rX2FyY2gKLQkgICAgICAmJiAhKG9rX2FyY2ggJiBjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JICAgIHsKLQkgICAgICBjaGFyIGJ1ZlsyMDBdLCAqY3A7Ci0KLQkgICAgICBzdHJjcHkgKGJ1ZiwKLQkJICAgICAgXygiaW52YWxpZCBpbnN0cnVjdGlvbiBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzICIpKTsKLQkgICAgICBjcCA9IGJ1ZiArIHN0cmxlbiAoYnVmKTsKLQkgICAgICBzd2l0Y2ggKG9rX2FyY2gpCi0JCXsKLQkJY2FzZSBtZmxvYXQ6Ci0JCSAgc3RyY3B5IChjcCwgXygiZnB1ICg2ODA0MCwgNjgwNjAgb3IgNjg4ODEvNjg4ODIpIikpOwotCQkgIGJyZWFrOwotCQljYXNlIG1tbXU6Ci0JCSAgc3RyY3B5IChjcCwgXygibW11ICg2ODAzMCBvciA2ODg1MSkiKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgbTY4MDIwdXA6Ci0JCSAgc3RyY3B5IChjcCwgXygiNjgwMjAgb3IgaGlnaGVyIikpOwotCQkgIGJyZWFrOwotCQljYXNlIG02ODAwMHVwOgotCQkgIHN0cmNweSAoY3AsIF8oIjY4MDAwIG9yIGhpZ2hlciIpKTsKLQkJICBicmVhazsKLQkJY2FzZSBtNjgwMTB1cDoKLQkJICBzdHJjcHkgKGNwLCBfKCI2ODAxMCBvciBoaWdoZXIiKSk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgewotCQkgICAgaW50IGdvdF9vbmUgPSAwLCBpZHg7Ci0JCSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNpemVvZiAoYXJjaHMpIC8gc2l6ZW9mIChhcmNoc1swXSk7Ci0JCQkgaWR4KyspCi0JCSAgICAgIHsKLQkJCWlmICgoYXJjaHNbaWR4XS5hcmNoICYgb2tfYXJjaCkKLQkJCSAgICAmJiAhIGFyY2hzW2lkeF0uYWxpYXMpCi0JCQkgIHsKLQkJCSAgICBpZiAoZ290X29uZSkKLQkJCSAgICAgIHsKLQkJCQlzdHJjcHkgKGNwLCAiIG9yICIpOwotCQkJCWNwICs9IHN0cmxlbiAoY3ApOwotCQkJICAgICAgfQotCQkJICAgIGdvdF9vbmUgPSAxOwotCQkJICAgIHN0cmNweSAoY3AsIGFyY2hzW2lkeF0ubmFtZSk7Ci0JCQkgICAgY3AgKz0gc3RybGVuIChjcCk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLQkJfQotCSAgICAgIGNwID0geG1hbGxvYyAoc3RybGVuIChidWYpICsgMSk7Ci0JICAgICAgc3RyY3B5IChjcCwgYnVmKTsKLQkgICAgICB0aGVfaW5zLmVycm9yID0gY3A7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgdGhlX2lucy5lcnJvciA9IF8oIm9wZXJhbmRzIG1pc21hdGNoIik7Ci0JICByZXR1cm47Ci0JfQkJCS8qIEZlbGwgb2ZmIHRoZSBlbmQgKi8KLQotICAgICAgbG9zaW5nID0gMDsKLSAgICB9Ci0KLSAgLyogbm93IGFzc2VtYmxlIGl0ICovCi0KLSAgdGhlX2lucy5hcmdzID0gb3Bjb2RlLT5tX29wZXJhbmRzOwotICB0aGVfaW5zLm51bWFyZ3MgPSBvcGNvZGUtPm1fb3BudW07Ci0gIHRoZV9pbnMubnVtbyA9IG9wY29kZS0+bV9jb2RlbnVtOwotICB0aGVfaW5zLm9wY29kZVswXSA9IGdldG9uZSAob3Bjb2RlKTsKLSAgdGhlX2lucy5vcGNvZGVbMV0gPSBnZXR0d28gKG9wY29kZSk7Ci0KLSAgZm9yIChzID0gdGhlX2lucy5hcmdzLCBvcFAgPSAmdGhlX2lucy5vcGVyYW5kc1swXTsgKnM7IHMgKz0gMiwgb3BQKyspCi0gICAgewotICAgICAgLyogVGhpcyBzd2l0Y2ggaXMgYSBkb296eS4KLSAgICAgICBXYXRjaCB0aGUgZmlyc3Qgc3RlcDsgaXRzIGEgYmlnIG9uZSEgKi8KLSAgICAgIHN3aXRjaCAoc1swXSkKLQl7Ci0KLQljYXNlICcqJzoKLQljYXNlICd+JzoKLQljYXNlICclJzoKLQljYXNlICc7JzoKLQljYXNlICdAJzoKLQljYXNlICchJzoKLQljYXNlICcmJzoKLQljYXNlICckJzoKLQljYXNlICc/JzoKLQljYXNlICcvJzoKLQljYXNlICc8JzoKLQljYXNlICc+JzoKLQljYXNlICdtJzoKLQljYXNlICduJzoKLQljYXNlICdvJzoKLQljYXNlICdwJzoKLQljYXNlICdxJzoKLQljYXNlICd2JzoKLSNpZm5kZWYgTk9fNjg4NTEKLQljYXNlICd8JzoKLSNlbmRpZgotCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBJTU1FRDoKLQkgICAgICB0bXByZWcgPSAweDNjOwkvKiA3LjQgKi8KLQkgICAgICBpZiAoc3RyY2hyICgiYndsIiwgc1sxXSkpCi0JCW5leHR3b3JkID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgICAgIGVsc2UKLQkJbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCAwKTsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQlhZGRfZml4IChzWzFdLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkgICAgICBzd2l0Y2ggKHNbMV0pCi0JCXsKLQkJY2FzZSAnYic6Ci0JCSAgaWYgKCFpc2J5dGUgKG5leHR3b3JkKSkKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSIpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBiYXNlbyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3cnOgotCQkgIGlmICghaXN3b3JkIChuZXh0d29yZCkpCi0JCSAgICBvcFAtPmVycm9yID0gXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UiKTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgYmFzZW8gPSAwOwotCQkgIGJyZWFrOwotCQljYXNlICdXJzoKLQkJICBpZiAoIWlzc3dvcmQgKG5leHR3b3JkKSkKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSIpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBiYXNlbyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkgIGFkZHdvcmQgKG5leHR3b3JkID4+IDE2KTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgYmFzZW8gPSAwOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2YnOgotCQkgIGJhc2VvID0gMjsKLQkJICBvdXRybyA9IDg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0YnOgotCQkgIGJhc2VvID0gNDsKLQkJICBvdXRybyA9IDExOwotCQkgIGJyZWFrOwotCQljYXNlICd4JzoKLQkJICBiYXNlbyA9IDY7Ci0JCSAgb3V0cm8gPSAxNTsKLQkJICBicmVhazsKLQkJY2FzZSAncCc6Ci0JCSAgYmFzZW8gPSA2OwotCQkgIG91dHJvID0gLTE7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBpZiAoIWJhc2VvKQotCQlicmVhazsKLQotCSAgICAgIC8qIFdlIGdvdHRhIHB1dCBvdXQgc29tZSBmbG9hdCAqLwotCSAgICAgIGlmIChvcCAoJm9wUC0+ZGlzcCkgIT0gT19iaWcpCi0JCXsKLQkJICB2YWx1ZVQgdmFsOwotCQkgIGludCBnZW5jbnQ7Ci0KLQkJICAvKiBDYW4gb3RoZXIgY2FzZXMgaGFwcGVuIGhlcmU/ICAqLwotCQkgIGlmIChvcCAoJm9wUC0+ZGlzcCkgIT0gT19jb25zdGFudCkKLQkJICAgIGFib3J0ICgpOwotCi0JCSAgdmFsID0gKHZhbHVlVCkgb2ZmcyAoJm9wUC0+ZGlzcCk7Ci0JCSAgZ2VuY250ID0gMDsKLQkJICBkbwotCQkgICAgewotCQkgICAgICBnZW5lcmljX2JpZ251bVtnZW5jbnRdID0gKExJVFRMRU5VTV9UWVBFKSB2YWw7Ci0JCSAgICAgIHZhbCA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgICArK2dlbmNudDsKLQkJICAgIH0KLQkJICB3aGlsZSAodmFsICE9IDApOwotCQkgIG9mZnMgKCZvcFAtPmRpc3ApID0gZ2VuY250OwotCQl9Ci0JICAgICAgaWYgKG9mZnMgKCZvcFAtPmRpc3ApID4gMCkKLQkJewotCQkgIGlmIChvZmZzICgmb3BQLT5kaXNwKSA+IGJhc2VvKQotCQkgICAgewotCQkgICAgICBhc193YXJuIChfKCJCaWdudW0gdG9vIGJpZyBmb3IgJWMgZm9ybWF0OyB0cnVuY2F0ZWQiKSwKLQkJCSAgICAgICBzWzFdKTsKLQkJICAgICAgb2ZmcyAoJm9wUC0+ZGlzcCkgPSBiYXNlbzsKLQkJICAgIH0KLQkJICBiYXNlbyAtPSBvZmZzICgmb3BQLT5kaXNwKTsKLQkJICB3aGlsZSAoYmFzZW8tLSkKLQkJICAgIGFkZHdvcmQgKDApOwotCQkgIGZvciAod29yZHAgPSBnZW5lcmljX2JpZ251bSArIG9mZnMgKCZvcFAtPmRpc3ApIC0gMTsKLQkJICAgICAgIG9mZnMgKCZvcFAtPmRpc3ApLS07Ci0JCSAgICAgICAtLXdvcmRwKQotCQkgICAgYWRkd29yZCAoKndvcmRwKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGdlbl90b193b3JkcyAod29yZHMsIGJhc2VvLCAobG9uZykgb3V0cm8pOwotCSAgICAgIGZvciAod29yZHAgPSB3b3JkczsgYmFzZW8tLTsgd29yZHArKykKLQkJYWRkd29yZCAoKndvcmRwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEUkVHOgotCSAgICAgIHRtcHJlZyA9IG9wUC0+cmVnIC0gREFUQTsJLyogMC5kcmVnICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJFRzoKLQkgICAgICB0bXByZWcgPSAweDA4ICsgb3BQLT5yZWcgLSBBRERSOwkvKiAxLmFyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBSU5EUjoKLQkgICAgICB0bXByZWcgPSAweDEwICsgb3BQLT5yZWcgLSBBRERSOwkvKiAyLmFyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBREVDOgotCSAgICAgIHRtcHJlZyA9IDB4MjAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDQuYXJlZyAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFJTkM6Ci0JICAgICAgdG1wcmVnID0gMHgxOCArIG9wUC0+cmVnIC0gQUREUjsJLyogMy5hcmVnICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRElTUDoKLQotCSAgICAgIG5leHR3b3JkID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCi0JICAgICAgaWYgKG9wUC0+cmVnID09IFBDCi0JCSAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJICAmJiBtNjhrX2Fic3BjYWRkKQotCQl7Ci0JCSAgb3BQLT5kaXNwLmV4cC5YX29wID0gT19zeW1ib2w7Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQkJICBvcFAtPmRpc3AuZXhwLlhfYWRkX3N5bWJvbCA9ICZhYnNfc3ltYm9sOwotI2Vsc2UKLQkJICBvcFAtPmRpc3AuZXhwLlhfYWRkX3N5bWJvbCA9Ci0JCSAgICBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0jZW5kaWYKLQkJfQotCi0JICAgICAgLyogRm9yY2UgaW50byBpbmRleCBtb2RlLiAgSG9wZSB0aGlzIHdvcmtzICovCi0KLQkgICAgICAvKiBXZSBkbyB0aGUgZmlyc3QgYml0IGZvciAzMi1iaXQgZGlzcGxhY2VtZW50cywgYW5kIHRoZQotCQkgc2Vjb25kIGJpdCBmb3IgMTYgYml0IG9uZXMuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlCi0JCSBzaG91bGQgbWFrZSB0aGUgZGVmYXVsdCBiZSBXT1JEIGluc3RlYWQgb2YgTE9ORywgYnV0Ci0JCSBJIHRoaW5rIHRoYXQnZCBicmVhayBHQ0MsIHNvIHdlIHB1dCB1cCB3aXRoIGEgbGl0dGxlCi0JCSBpbmVmZmljaWVuY3kgZm9yIHRoZSBzYWtlIG9mIHdvcmtpbmcgb3V0cHV0LiAgKi8KLQotCSAgICAgIGlmICghaXNzd29yZCAobmV4dHdvcmQpCi0JCSAgfHwgKGlzdmFyICgmb3BQLT5kaXNwKQotCQkgICAgICAmJiAoKG9wUC0+ZGlzcC5zaXplID09IFNJWkVfVU5TUEVDCi0JCQkgICAmJiBmbGFnX3Nob3J0X3JlZnMgPT0gMAotCQkJICAgJiYgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA+PSBtNjgwMjAKLQkJCSAgICYmICEgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JCQkgIHx8IG9wUC0+ZGlzcC5zaXplID09IFNJWkVfTE9ORykpKQotCQl7Ci0JCSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkJICAgICAgfHwgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JCSAgICBvcFAtPmVycm9yID0KLQkJICAgICAgXygiZGlzcGxhY2VtZW50IHRvbyBsYXJnZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIpOwotCQkgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJICAgIHRtcHJlZyA9IDB4M0I7CS8qIDcuMyAqLwotCQkgIGVsc2UKLQkJICAgIHRtcHJlZyA9IDB4MzAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDYuYXJlZyAqLwotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJCXsKLQkJCSAgaWYgKG9wUC0+ZGlzcC5zaXplID09IFNJWkVfTE9ORwotI2lmZGVmIE9CSl9FTEYKLQkJCSAgICAgIC8qIElmIHRoZSBkaXNwbGFjZW1lbnQgbmVlZHMgcGljCi0JCQkJIHJlbG9jYXRpb24gaXQgY2Fubm90IGJlIHJlbGF4ZWQuICAqLwotCQkJICAgICAgfHwgb3BQLT5kaXNwLnBpY19yZWxvYyAhPSBwaWNfbm9uZQotI2VuZGlmCi0JCQkgICAgICApCi0JCQkgICAgewotCQkJICAgICAgYWRkd29yZCAoMHgwMTcwKTsKLQkJCSAgICAgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLAotCQkJCQlvZmZzICgmb3BQLT5kaXNwKSwKLQkJCQkJVEFCIChQQ0xFQSwgU1pfVU5ERUYpKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhZGR3b3JkICgweDAxNzApOwotCQkJICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDAsIDApOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFkZHdvcmQgKDB4MDE3MCk7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQgPj4gMTYpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkgICAgdG1wcmVnID0gMHgzQTsJLyogNy4yICovCi0JCSAgZWxzZQotCQkgICAgdG1wcmVnID0gMHgyOCArIG9wUC0+cmVnIC0gQUREUjsJLyogNS5hcmVnICovCi0KLQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQkgICAgewotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMpCi0JCQl7Ci0JCQkgIGFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBQT1NUOgotCSAgICBjYXNlIFBSRToKLQkgICAgY2FzZSBCQVNFOgotCSAgICAgIG5leHR3b3JkID0gMDsKLQkgICAgICBiYXNlbyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgICAgICBpZiAob3BQLT5tb2RlID09IFBPU1QgfHwgb3BQLT5tb2RlID09IFBSRSkKLQkJb3V0cm8gPSBnZXRfbnVtICgmb3BQLT5vZGlzcCwgODApOwotCSAgICAgIC8qIEZpZ3VyZSBvdXQgdGhlIGBhZGRyZXNzaW5nIG1vZGUnLgotCQkgQWxzbyB0dXJuIG9uIHRoZSBCQVNFX0RJU0FCTEUgYml0LCBpZiBuZWVkZWQuICAqLwotCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCXsKLQkJICB0bXByZWcgPSAweDNiOwkvKiA3LjMgKi8KLQkJICBpZiAob3BQLT5yZWcgPT0gWlBDKQotCQkgICAgbmV4dHdvcmQgfD0gMHg4MDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wUC0+cmVnID09IDApCi0JCXsKLQkJICBuZXh0d29yZCB8PSAweDgwOwotCQkgIHRtcHJlZyA9IDB4MzA7CS8qIDYuZ2FyYmFnZSAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BQLT5yZWcgPj0gWkFERFIwICYmIG9wUC0+cmVnIDw9IFpBRERSNykKLQkJewotCQkgIG5leHR3b3JkIHw9IDB4ODA7Ci0JCSAgdG1wcmVnID0gMHgzMCArIG9wUC0+cmVnIC0gWkFERFIwOwotCQl9Ci0JICAgICAgZWxzZQotCQl0bXByZWcgPSAweDMwICsgb3BQLT5yZWcgLSBBRERSOwkvKiA2LmFyZWcgKi8KLQotCSAgICAgIHNpejEgPSBvcFAtPmRpc3Auc2l6ZTsKLQkgICAgICBpZiAob3BQLT5tb2RlID09IFBPU1QgfHwgb3BQLT5tb2RlID09IFBSRSkKLQkJc2l6MiA9IG9wUC0+b2Rpc3Auc2l6ZTsKLQkgICAgICBlbHNlCi0JCXNpejIgPSBTSVpFX1VOU1BFQzsKLQotCSAgICAgIC8qIEluZGV4IHJlZ2lzdGVyIHN0dWZmICovCi0JICAgICAgaWYgKG9wUC0+aW5kZXgucmVnICE9IDAKLQkJICAmJiBvcFAtPmluZGV4LnJlZyA+PSBEQVRBCi0JCSAgJiYgb3BQLT5pbmRleC5yZWcgPD0gQUREUjcpCi0JCXsKLQkJICBuZXh0d29yZCB8PSAob3BQLT5pbmRleC5yZWcgLSBEQVRBKSA8PCAxMjsKLQotCQkgIGlmIChvcFAtPmluZGV4LnNpemUgPT0gU0laRV9MT05HCi0JCSAgICAgIHx8IChvcFAtPmluZGV4LnNpemUgPT0gU0laRV9VTlNQRUMKLQkJCSAgJiYgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0ID09IFNJWkVfTE9ORykpCi0JCSAgICBuZXh0d29yZCB8PSAweDgwMDsKLQotCQkgIGlmICgob3BQLT5pbmRleC5zY2FsZSAhPSAxIAotCQkgICAgICAgJiYgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMCkKLQkJICAgICAgfHwgKG9wUC0+aW5kZXguc2NhbGUgPT0gOCAKLQkJCSAgJiYgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpKQotCQkgICAgewotCQkgICAgICBvcFAtPmVycm9yID0KLQkJCV8oInNjYWxlIGZhY3RvciBpbnZhbGlkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyBjcHUzMiBvciA2ODAyMCBvciBoaWdoZXIiKTsKLQkJICAgIH0KLQotCQkgIGlmIChhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCQkgICAgICAmJiBvcFAtPmluZGV4LnNpemUgPT0gU0laRV9XT1JEKQotCQkgICAgb3BQLT5lcnJvciA9IF8oImludmFsaWQgaW5kZXggc2l6ZSBmb3IgY29sZGZpcmUiKTsKLQotCQkgIHN3aXRjaCAob3BQLT5pbmRleC5zY2FsZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDI6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MjAwOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgNDoKLQkJICAgICAgbmV4dHdvcmQgfD0gMHg0MDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA4OgotCQkgICAgICBuZXh0d29yZCB8PSAweDYwMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIH0KLQkJICAvKiBJRiBpdHMgc2ltcGxlLAotCQkgICAgIEdFVCBVUyBPVVQgT0YgSEVSRSEgKi8KLQotCQkgIC8qIE11c3QgYmUgSU5ERVgsIHdpdGggYW4gaW5kZXggcmVnaXN0ZXIuICBBZGRyZXNzCi0JCSAgICAgcmVnaXN0ZXIgY2Fubm90IGJlIFpFUk8tUEMsIGFuZCBlaXRoZXIgOmIgd2FzCi0JCSAgICAgZm9yY2VkLCBvciB3ZSBrbm93IGl0IHdpbGwgZml0LiAgRm9yIGEgNjgwMDAgb3IKLQkJICAgICA2ODAxMCwgZm9yY2UgdGhpcyBtb2RlIGFueXdheXMsIGJlY2F1c2UgdGhlCi0JCSAgICAgbGFyZ2VyIG1vZGVzIGFyZW4ndCBzdXBwb3J0ZWQuICAqLwotCQkgIGlmIChvcFAtPm1vZGUgPT0gQkFTRQotCQkgICAgICAmJiAoKG9wUC0+cmVnID49IEFERFIwCi0JCQkgICAmJiBvcFAtPnJlZyA8PSBBRERSNykKLQkJCSAgfHwgb3BQLT5yZWcgPT0gUEMpKQotCQkgICAgewotCQkgICAgICBpZiAoc2l6MSA9PSBTSVpFX0JZVEUKLQkJCSAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCQkJICB8fCBhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCQkJICB8fCAoc2l6MSA9PSBTSVpFX1VOU1BFQwotCQkJICAgICAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJCSAgICAgICYmIGlzc2J5dGUgKGJhc2VvKSkpCi0JCQl7Ci0gCQkJICBuZXh0d29yZCArPSBiYXNlbyAmIDB4ZmY7Ci0gCQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0gCQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIERvIGEgYnl0ZSByZWxvY2F0aW9uLiAgSWYgaXQgZG9lc24ndAotCQkJCSBmaXQgKHBvc3NpYmxlIG9uIG02ODAwMCkgbGV0IHRoZQotCQkJCSBmaXh1cCBwcm9jZXNzaW5nIGNvbXBsYWluIGxhdGVyLiAgKi8KLQkJCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJCQlhZGRfZml4ICgnQicsICZvcFAtPmRpc3AsIDEsIDEpOwotCQkJICAgICAgZWxzZQotCQkJCWFkZF9maXggKCdCJywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JCQkgICAgfQotCQkJICBlbHNlIGlmIChzaXoxICE9IFNJWkVfQllURSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc2l6MSAhPSBTSVpFX1VOU1BFQykKLQkJCQlhc193YXJuIChfKCJGb3JjaW5nIGJ5dGUgZGlzcGxhY2VtZW50IikpOwotCQkJICAgICAgaWYgKCEgaXNzYnl0ZSAoYmFzZW8pKQotCQkJCW9wUC0+ZXJyb3IgPSBfKCJieXRlIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UiKTsKLQkJCSAgICB9Ci0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNpejEgPT0gU0laRV9VTlNQRUMKLQkJCSAgICAgICAmJiBvcFAtPnJlZyA9PSBQQwotCQkJICAgICAgICYmIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgICAgICYmIHN1YnMgKCZvcFAtPmRpc3ApID09IE5VTEwKLSNpZmRlZiBPQkpfRUxGCi0JCQkgICAgICAgLyogSWYgdGhlIGRpc3BsYWNlbWVudCBuZWVkcyBwaWMKLQkJCQkgIHJlbG9jYXRpb24gaXQgY2Fubm90IGJlIHJlbGF4ZWQuICAqLwotCQkJICAgICAgICYmIG9wUC0+ZGlzcC5waWNfcmVsb2MgPT0gcGljX25vbmUKLSNlbmRpZgotCQkJICAgICAgICkKLQkJCXsKLQkJCSAgLyogVGhlIGNvZGUgaW4gbWRfY29udmVydF9mcmFnXzEgbmVlZHMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJsZSB0byBhZGp1c3QgbmV4dHdvcmQuICBDYWxsIGZyYWdfZ3JvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBzcGFjZSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhZyBvYnN0YWNrIHRvIG1ha2UgYWxsIHRoZSBieXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aWd1b3VzLiAgKi8KLQkJCSAgZnJhZ19ncm93ICgxNCk7Ci0gCQkJICBuZXh0d29yZCArPSBiYXNlbyAmIDB4ZmY7Ci0gCQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0gCQkJICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksIG9mZnMgKCZvcFAtPmRpc3ApLAotIAkJCQkgICAgVEFCIChQQ0lOREVYLCBTWl9VTkRFRikpOwotCi0JCQkgIGJyZWFrOwotIAkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG5leHR3b3JkIHw9IDB4NDA7CS8qIE5vIGluZGV4IHJlZyAqLwotCQkgIGlmIChvcFAtPmluZGV4LnJlZyA+PSBaREFUQTAKLQkJICAgICAgJiYgb3BQLT5pbmRleC5yZWcgPD0gWkRBVEE3KQotCQkgICAgbmV4dHdvcmQgfD0gKG9wUC0+aW5kZXgucmVnIC0gWkRBVEEwKSA8PCAxMjsKLQkJICBlbHNlIGlmIChvcFAtPmluZGV4LnJlZyA+PSBaQUREUjAKLQkJCSAgIHx8IG9wUC0+aW5kZXgucmVnIDw9IFpBRERSNykKLQkJICAgIG5leHR3b3JkIHw9IChvcFAtPmluZGV4LnJlZyAtIFpBRERSMCArIDgpIDw8IDEyOwotCQl9Ci0KLQkgICAgICAvKiBJdCBpc24ndCBzaW1wbGUuICAqLwotCi0JICAgICAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkJICB8fCBhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkJb3BQLT5lcnJvciA9Ci0JCSAgXygiaW52YWxpZCBvcGVyYW5kIG1vZGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiKTsKLQotCSAgICAgIG5leHR3b3JkIHw9IDB4MTAwOwotCSAgICAgIC8qIElmIHRoZSBndXkgc3BlY2lmaWVkIGEgd2lkdGgsIHdlIGFzc3VtZSB0aGF0IGl0IGlzCi0JCSB3aWRlIGVub3VnaC4gIE1heWJlIGl0IGlzbid0LiAgSWYgc28sIHdlIGxvc2UuICAqLwotCSAgICAgIHN3aXRjaCAoc2l6MSkKLQkJewotCQljYXNlIFNJWkVfVU5TUEVDOgotCQkgIGlmIChpc3ZhciAoJm9wUC0+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+cmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0UnOgkJLyogSWdub3JlIGl0ICovCi0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIEZQMCk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0cnOgkJLyogSWdub3JlIGl0ICovCi0JY2FzZSAnSCc6Ci0JICBicmVhazsKLQotCWNhc2UgJ0knOgotCSAgdG1wcmVnID0gb3BQLT5yZWcgLSBDT1AwOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdKJzoJCS8qIEpGIGZvbyAqLwotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIFNGQzoKLQkgICAgICB0bXByZWcgPSAweDAwMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBERkM6Ci0JICAgICAgdG1wcmVnID0gMHgwMDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0FDUjoKLQkgICAgICB0bXByZWcgPSAweDAwMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBUQzoKLQkgICAgICB0bXByZWcgPSAweDAwMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJVFQwOgotCSAgICAgIHRtcHJlZyA9IDB4MDA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElUVDE6Ci0JICAgICAgdG1wcmVnID0gMHgwMDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRUMDoKLQkgICAgICB0bXByZWcgPSAweDAwNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEVFQxOgotCSAgICAgIHRtcHJlZyA9IDB4MDA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJVU0NSOgotCSAgICAgIHRtcHJlZyA9IDB4MDA4OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgVVNQOgotCSAgICAgIHRtcHJlZyA9IDB4ODAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZCUjoKLQkgICAgICB0bXByZWcgPSAweDgwMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDQUFSOgotCSAgICAgIHRtcHJlZyA9IDB4ODAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1TUDoKLQkgICAgICB0bXByZWcgPSAweDgwMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJU1A6Ci0JICAgICAgdG1wcmVnID0gMHg4MDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTU1VU1I6Ci0JICAgICAgdG1wcmVnID0gMHg4MDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVVJQOgotCSAgICAgIHRtcHJlZyA9IDB4ODA2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNSUDoKLQkgICAgICB0bXByZWcgPSAweDgwNzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1I6Ci0JICAgICAgdG1wcmVnID0gMHg4MDg7Ci0JICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJPTUJBUjoKLQkgICAgICB0bXByZWcgPSAweEMwMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSQU1CQVIwOgotCSAgICAgIHRtcHJlZyA9IDB4QzA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJBTUJBUjE6Ci0JICAgICAgdG1wcmVnID0gMHhDMDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTUJBUjoKLQkgICAgICB0bXByZWcgPSAweEMwRjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdrJzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDU1KTsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnICYgMHg3Zik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2wnOgotCSAgdG1wcmVnID0gb3BQLT5tYXNrOwotCSAgaWYgKHNbMV0gPT0gJ3cnKQotCSAgICB7Ci0JICAgICAgaWYgKHRtcHJlZyAmIDB4N0ZGMDAwMCkKLQkJYXNfYmFkIChfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiByZWdpc3RlciBsaXN0IikpOwotCSAgICAgIGluc29wIChyZXZlcnNlXzE2X2JpdHMgKHRtcHJlZyksIG9wY29kZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDcwMEZGRkYpCi0JCWFzX2JhZCAoXygiV3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIpKTsKLQkgICAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHJldmVyc2VfOF9iaXRzICh0bXByZWcgPj4gMTYpKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdMJzoKLQkgIHRtcHJlZyA9IG9wUC0+bWFzazsKLQkgIGlmIChzWzFdID09ICd3JykKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDdGRjAwMDApCi0JCWFzX2JhZCAoXygiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gcmVnaXN0ZXIgbGlzdCIpKTsKLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzWzFdID09ICc4JykKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDBGRkZGRkYpCi0JCWFzX2JhZCAoXygiaW5jb3JyZWN0IHJlZ2lzdGVyIGluIHJlZ2xpc3QiKSk7Ci0JICAgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcgPj4gMjQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAodG1wcmVnICYgMHg3MDBGRkZGKQotCQlhc19iYWQgKF8oIndyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiKSk7Ci0JICAgICAgZWxzZQotCQlpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyA+PiAxNik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnTSc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIGdldF9udW0gKCZvcFAtPmRpc3AsIDYwKSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ08nOgotCSAgdG1wcmVnID0gKChvcFAtPm1vZGUgPT0gRFJFRykKLQkJICAgID8gMHgyMCArIG9wUC0+cmVnIC0gREFUQQotCQkgICAgOiAoZ2V0X251bSAoJm9wUC0+ZGlzcCwgNDApICYgMHgxRikpOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdRJzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDEwKTsKLQkgIGlmICh0bXByZWcgPT0gOCkKLQkgICAgdG1wcmVnID0gMDsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUic6Ci0JICAvKiBUaGlzIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBBRERSIHJlZ2lzdGVycyBhcmUgZWlnaHQKLQkgICAgIG1vcmUgdGhhbiB0aGVpciBjb3JyZXNwb25kaW5nIERBVEEgcmVncywgc28gdGhlIHJlc3VsdAotCSAgICAgd2lsbCBoYXZlIHRoZSBBRERSX1JFRyBiaXQgc2V0ICovCi0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3InOgotCSAgaWYgKG9wUC0+bW9kZSA9PSBBSU5EUikKLQkgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIERBVEEpOwotCSAgZWxzZQotCSAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+aW5kZXgucmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3MnOgotCSAgaWYgKG9wUC0+cmVnID09IEZQSSkKLQkgICAgdG1wcmVnID0gMHgxOwotCSAgZWxzZSBpZiAob3BQLT5yZWcgPT0gRlBTKQotCSAgICB0bXByZWcgPSAweDI7Ci0JICBlbHNlIGlmIChvcFAtPnJlZyA9PSBGUEMpCi0JICAgIHRtcHJlZyA9IDB4NDsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgkJLyogSWdub3JlIGl0ICovCi0JICBicmVhazsKLQotCWNhc2UgJ1QnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBnZXRfbnVtICgmb3BQLT5kaXNwLCAzMCkpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdVJzoJCS8qIElnbm9yZSBpdCAqLwotCSAgYnJlYWs7Ci0KLQljYXNlICdjJzoKLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBOQzoKLQkgICAgICB0bXByZWcgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERDOgotCSAgICAgIHRtcHJlZyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSUM6Ci0JICAgICAgdG1wcmVnID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCQzoKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrIikpOwotCSAgICB9CQkJLyogc3dpdGNoIG9uIGNhY2hlIHRva2VuICovCi0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLSNpZm5kZWYgTk9fNjg4NTEKLQkgIC8qIEpGOiBUaGVzZSBhcmUgb3V0IG9mIG9yZGVyLCBJIGZlYXIuICovCi0JY2FzZSAnZic6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgU0ZDOgotCSAgICAgIHRtcHJlZyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgREZDOgotCSAgICAgIHRtcHJlZyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgVEM6Ci0JICAgICAgdG1wcmVnID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDQUw6Ci0JICAgICAgdG1wcmVnID0gNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBWQUw6Ci0JICAgICAgdG1wcmVnID0gNTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTQ0M6Ci0JICAgICAgdG1wcmVnID0gNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQzoKLQkgICAgICB0bXByZWcgPSA3OwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1YnOgotCSAgaWYgKG9wUC0+cmVnID09IFZBTCkKLQkgICAgYnJlYWs7Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgJ1cnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIERSUDoKLQkgICAgICB0bXByZWcgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNSUDoKLQkgICAgICB0bXByZWcgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSUDoKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1gnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIEJBRDoKLQkgICAgY2FzZSBCQUQgKyAxOgotCSAgICBjYXNlIEJBRCArIDI6Ci0JICAgIGNhc2UgQkFEICsgMzoKLQkgICAgY2FzZSBCQUQgKyA0OgotCSAgICBjYXNlIEJBRCArIDU6Ci0JICAgIGNhc2UgQkFEICsgNjoKLQkgICAgY2FzZSBCQUQgKyA3OgotCSAgICAgIHRtcHJlZyA9ICg0IDw8IDEwKSB8ICgob3BQLT5yZWcgLSBCQUQpIDw8IDIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkFDOgotCSAgICBjYXNlIEJBQyArIDE6Ci0JICAgIGNhc2UgQkFDICsgMjoKLQkgICAgY2FzZSBCQUMgKyAzOgotCSAgICBjYXNlIEJBQyArIDQ6Ci0JICAgIGNhc2UgQkFDICsgNToKLQkgICAgY2FzZSBCQUMgKyA2OgotCSAgICBjYXNlIEJBQyArIDc6Ci0JICAgICAgdG1wcmVnID0gKDUgPDwgMTApIHwgKChvcFAtPnJlZyAtIEJBQykgPDwgMik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWSc6Ci0JICBrbm93IChvcFAtPnJlZyA9PSBQU1IpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWic6Ci0JICBrbm93IChvcFAtPnJlZyA9PSBQQ1NSKTsKLQkgIGJyZWFrOwotI2VuZGlmIC8qIG02ODg1MSAqLwotCWNhc2UgJzMnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIFRUMDoKLQkgICAgICB0bXByZWcgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFRUMToKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDIwKTsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ18nOgkvKiB1c2VkIG9ubHkgZm9yIG1vdmUxNiBhYnNvbHV0ZSAzMi1iaXQgYWRkcmVzcyAqLwotCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgIGFkZHdvcmQgKHRtcHJlZyA+PiAxNik7Ci0JICBhZGR3b3JkICh0bXByZWcgJiAweEZGRkYpOwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQTBMKTsKLQkgIG9wUC0+cmVnIC09IChEQVRBMEwpOwotCSAgb3BQLT5yZWcgJj0gMHgwRjsJLyogcmVtb3ZlIHVwcGVyL2xvd2VyIGJpdCAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogQnkgdGhlIHRpbWUgd2hlIGdldCBoZXJlIChGSU5BTExZKSB0aGVfaW5zIGNvbnRhaW5zIHRoZSBjb21wbGV0ZQotICAgICBpbnN0cnVjdGlvbiwgcmVhZHkgdG8gYmUgZW1pdHRlZC4gLiAuICovCi19Ci0KLXN0YXRpYyBpbnQKLXJldmVyc2VfMTZfYml0cyAoaW4pCi0gICAgIGludCBpbjsKLXsKLSAgaW50IG91dCA9IDA7Ci0gIGludCBuOwotCi0gIHN0YXRpYyBpbnQgbWFza1sxNl0gPQotICB7Ci0gICAgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAKLSAgfTsKLSAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspCi0gICAgewotICAgICAgaWYgKGluICYgbWFza1tuXSkKLQlvdXQgfD0gbWFza1sxNSAtIG5dOwotICAgIH0KLSAgcmV0dXJuIG91dDsKLX0JCQkJLyogcmV2ZXJzZV8xNl9iaXRzKCkgKi8KLQotc3RhdGljIGludAotcmV2ZXJzZV84X2JpdHMgKGluKQotICAgICBpbnQgaW47Ci17Ci0gIGludCBvdXQgPSAwOwotICBpbnQgbjsKLQotICBzdGF0aWMgaW50IG1hc2tbOF0gPQotICB7Ci0gICAgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gIH07Ci0KLSAgZm9yIChuID0gMDsgbiA8IDg7IG4rKykKLSAgICB7Ci0gICAgICBpZiAoaW4gJiBtYXNrW25dKQotCW91dCB8PSBtYXNrWzcgLSBuXTsKLSAgICB9Ci0gIHJldHVybiBvdXQ7Ci19CQkJCS8qIHJldmVyc2VfOF9iaXRzKCkgKi8KLQotLyogQ2F1c2UgYW4gZXh0cmEgZnJhZyB0byBiZSBnZW5lcmF0ZWQgaGVyZSwgaW5zZXJ0aW5nIHVwIHRvIDEwIGJ5dGVzCi0gICAodGhhdCB2YWx1ZSBpcyBjaG9zZW4gaW4gdGhlIGZyYWdfdmFyIGNhbGwgaW4gbWRfYXNzZW1ibGUpLiAgVFlQRQotICAgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIGZyYWcgdG8gYmUgZ2VuZXJhdGVkOyBpdHMgcHJpbWFyeSB0eXBlIGlzCi0gICByc19tYWNoaW5lX2RlcGVuZGVudC4KLQotICAgVGhlIFRZUEUgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMSBhbmQKLSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LiAgVGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZml4dXAgd2lsbAotICAgYmUgZW1pdHRlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMS4KLQotICAgQUREIGJlY29tZXMgdGhlIEZSX1NZTUJPTCBmaWVsZCBvZiB0aGUgZnJhZywgYW5kIE9GRiB0aGUgRlJfT0ZGU0VULiAgKi8KLXN0YXRpYyB2b2lkCi1pbnN0YWxsX29wZXJhbmQgKG1vZGUsIHZhbCkKLSAgICAgaW50IG1vZGU7Ci0gICAgIGludCB2YWw7Ci17Ci0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWwgJiAweEZGOwkvKiBKRiBGRiBpcyBmb3IgTSBrbHVkZ2UgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsIDw8IDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcxJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzInOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICczJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzQnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsIDw8IDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsyXSB8PSB2YWwgPDwgNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzYnOgotICAgICAgLyogREFOR0VSISAgVGhpcyBpcyBhIGhhY2sgdG8gZm9yY2UgY2FzMmwgYW5kIGNhczJ3IGNtZHMgdG8gYmUKLQkgdGhyZWUgd29yZHMgbG9uZyEgKi8KLSAgICAgIHRoZV9pbnMubnVtbysrOwotICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzgnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDEwOwotICAgICAgYnJlYWs7Ci0jaWZuZGVmIE5PXzY4ODUxCi0gICAgY2FzZSAnOSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlICd0JzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICh2YWwgPDwgMTApIHwgKHZhbCA8PCA3KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0QnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKHZhbCA8PCAxMikgfCB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdnJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA9IDB4ZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA8PCA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdqJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKLSAgICAgIHRoZV9pbnMubnVtbysrOwkJLyogV2hhdCBhIGhhY2sgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2snOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICd3JzoKLSAgICBjYXNlICdXJzoKLSAgICBjYXNlICdsJzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2UnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKHZhbCA8PCA2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0wnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gPSAodmFsID4+IDE2KTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzJdID0gdmFsICYgMHhmZmZmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAoKHZhbCAmIDB4OCkgPDwgKDYgLSAzKSk7Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAoKHZhbCAmIDB4NykgPDwgOSk7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAoKHZhbCAmIDB4MTApIDw8ICg3IC0gNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbic6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAoKHZhbCAmIDB4OCkgPDwgKDYgLSAzKSk7Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAoKHZhbCAmIDB4NykgPDwgOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdvJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCAxMjsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICgodmFsICYgMHgxMCkgPDwgKDcgLSA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdNJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICh2YWwgJiAweEYpOwotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKCh2YWwgJiAweDEwKSA8PCAoNiAtIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ04nOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKHZhbCAmIDB4Rik7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAoKHZhbCAmIDB4MTApIDw8ICg2IC0gNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAoKHZhbCAhPSAxKSA8PCAxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotICAgIH0KLX0JCQkJLyogaW5zdGFsbF9vcGVyYW5kKCkgKi8KLQotc3RhdGljIHZvaWQKLWluc3RhbGxfZ2VuX29wZXJhbmQgKG1vZGUsIHZhbCkKLSAgICAgaW50IG1vZGU7Ci0gICAgIGludCB2YWw7Ci17Ci0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIC8qIFRoaXMgaXMgYSBrbHVkZ2UhISEgKi8KLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICh2YWwgJiAweDA3KSA8PCA5IHwgKHZhbCAmIDB4MzgpIDw8IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICd3JzoKLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdwJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgICAgLyogbW9yZSBzdHVmZiBnb2VzIGhlcmUgKi8KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotICAgIH0KLX0JCQkJLyogaW5zdGFsbF9nZW5fb3BlcmFuZCgpICovCi0KLS8qCi0gKiB2ZXJpZnkgdGhhdCB3ZSBoYXZlIHNvbWUgbnVtYmVyIG9mIHBhcmVuIHBhaXJzLCBkbyBtNjhrX2lwX29wKCksIGFuZAotICogdGhlbiBkZWFsIHdpdGggdGhlIGJpdGZpZWxkIGhhY2suCi0gKi8KLQotc3RhdGljIGNoYXIgKgotY3JhY2tfb3BlcmFuZCAoc3RyLCBvcFApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnN0cjsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IG02OGtfb3AgKm9wUDsKLXsKLSAgcmVnaXN0ZXIgaW50IHBhcmVuczsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKmJlZ19zdHI7Ci0gIGludCBpbnF1b3RlID0gMDsKLQotICBpZiAoIXN0cikKLSAgICB7Ci0gICAgICByZXR1cm4gc3RyOwotICAgIH0KLSAgYmVnX3N0ciA9IHN0cjsKLSAgZm9yIChwYXJlbnMgPSAwOyAqc3RyICYmIChwYXJlbnMgPiAwIHx8IGlucXVvdGUgfHwgbm90ZW5kIChzdHIpKTsgc3RyKyspCi0gICAgewotICAgICAgaWYgKCEgaW5xdW90ZSkKLQl7Ci0JICBpZiAoKnN0ciA9PSAnKCcpCi0JICAgIHBhcmVucysrOwotCSAgZWxzZSBpZiAoKnN0ciA9PSAnKScpCi0JICAgIHsKLQkgICAgICBpZiAoIXBhcmVucykKLQkJewkJCS8qIEVSUk9SICovCi0JCSAgb3BQLT5lcnJvciA9IF8oIkV4dHJhICkiKTsKLQkJICByZXR1cm4gc3RyOwotCQl9Ci0JICAgICAgLS1wYXJlbnM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZmxhZ19tcmkgJiYgKnN0ciA9PSAnXCcnKQotCWlucXVvdGUgPSAhIGlucXVvdGU7Ci0gICAgfQotICBpZiAoISpzdHIgJiYgcGFyZW5zKQotICAgIHsJCQkJLyogRVJST1IgKi8KLSAgICAgIG9wUC0+ZXJyb3IgPSBfKCJNaXNzaW5nICkiKTsKLSAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotICBjID0gKnN0cjsKLSAgKnN0ciA9ICdcMCc7Ci0gIGlmIChtNjhrX2lwX29wIChiZWdfc3RyLCBvcFApICE9IDApCi0gICAgewotICAgICAgKnN0ciA9IGM7Ci0gICAgICByZXR1cm4gc3RyOwotICAgIH0KLSAgKnN0ciA9IGM7Ci0gIGlmIChjID09ICd9JykKLSAgICBjID0gKisrc3RyOwkJCS8qIEpGIGJpdGZpZWxkIGhhY2sgKi8KLSAgaWYgKGMpCi0gICAgewotICAgICAgYyA9ICorK3N0cjsKLSAgICAgIGlmICghYykKLQlhc19iYWQgKF8oIk1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgICB9Ci0KLSAgLyogRGV0ZWN0IE1SSSBSRUcgc3ltYm9scyBhbmQgY29udmVydCB0aGVtIHRvIFJFR0xTVHMuICAqLwotICBpZiAob3BQLT5tb2RlID09IENPTlRST0wgJiYgKGludClvcFAtPnJlZyA8IDApCi0gICAgewotICAgICAgb3BQLT5tb2RlID0gUkVHTFNUOwotICAgICAgb3BQLT5tYXNrID0gfihpbnQpb3BQLT5yZWc7Ci0gICAgICBvcFAtPnJlZyA9IDA7Ci0gICAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gICAqLwotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3JlZyAocmVnbmFtZSwgcmVnbnVtKQotICAgICBjb25zdCBjaGFyICpyZWduYW1lOwotICAgICBpbnQgcmVnbnVtOwotewotICBjaGFyIGJ1ZlsxMDBdOwotICBpbnQgaTsKLQotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotICBpZiAoIWZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCkKLSAgICB7Ci0gICAgICBidWZbMF0gPSBSRUdJU1RFUl9QUkVGSVg7Ci0gICAgICBzdHJjcHkgKGJ1ZiArIDEsIHJlZ25hbWUpOwotICAgICAgcmVnbmFtZSA9IGJ1ZjsKLSAgICB9Ci0jZW5kaWYKLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChyZWduYW1lLCByZWdfc2VjdGlvbiwgcmVnbnVtLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCi0gIGZvciAoaSA9IDA7IHJlZ25hbWVbaV07IGkrKykKLSAgICBidWZbaV0gPSBpc2xvd2VyIChyZWduYW1lW2ldKSA/IHRvdXBwZXIgKHJlZ25hbWVbaV0pIDogcmVnbmFtZVtpXTsKLSAgYnVmW2ldID0gJ1wwJzsKLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChidWYsIHJlZ19zZWN0aW9uLCByZWdudW0sCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci19Ci0KLXN0cnVjdCBpbml0X2VudHJ5Ci0gIHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGludCBudW1iZXI7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5pdF9lbnRyeSBpbml0X3RhYmxlW10gPQotewotICB7ICJkMCIsIERBVEEwIH0sCi0gIHsgImQxIiwgREFUQTEgfSwKLSAgeyAiZDIiLCBEQVRBMiB9LAotICB7ICJkMyIsIERBVEEzIH0sCi0gIHsgImQ0IiwgREFUQTQgfSwKLSAgeyAiZDUiLCBEQVRBNSB9LAotICB7ICJkNiIsIERBVEE2IH0sCi0gIHsgImQ3IiwgREFUQTcgfSwKLSAgeyAiYTAiLCBBRERSMCB9LAotICB7ICJhMSIsIEFERFIxIH0sCi0gIHsgImEyIiwgQUREUjIgfSwKLSAgeyAiYTMiLCBBRERSMyB9LAotICB7ICJhNCIsIEFERFI0IH0sCi0gIHsgImE1IiwgQUREUjUgfSwKLSAgeyAiYTYiLCBBRERSNiB9LAotICB7ICJmcCIsIEFERFI2IH0sCi0gIHsgImE3IiwgQUREUjcgfSwKLSAgeyAic3AiLCBBRERSNyB9LAotICB7ICJzc3AiLCBBRERSNyB9LAotICB7ICJmcDAiLCBGUDAgfSwKLSAgeyAiZnAxIiwgRlAxIH0sCi0gIHsgImZwMiIsIEZQMiB9LAotICB7ICJmcDMiLCBGUDMgfSwKLSAgeyAiZnA0IiwgRlA0IH0sCi0gIHsgImZwNSIsIEZQNSB9LAotICB7ICJmcDYiLCBGUDYgfSwKLSAgeyAiZnA3IiwgRlA3IH0sCi0gIHsgImZwaSIsIEZQSSB9LAotICB7ICJmcGlhciIsIEZQSSB9LAotICB7ICJmcGMiLCBGUEkgfSwKLSAgeyAiZnBzIiwgRlBTIH0sCi0gIHsgImZwc3IiLCBGUFMgfSwKLSAgeyAiZnBjIiwgRlBDIH0sCi0gIHsgImZwY3IiLCBGUEMgfSwKLSAgeyAiY29udHJvbCIsIEZQQyB9LAotICB7ICJzdGF0dXMiLCBGUFMgfSwKLSAgeyAiaWFkZHIiLCBGUEkgfSwKLQotICB7ICJjb3AwIiwgQ09QMCB9LAotICB7ICJjb3AxIiwgQ09QMSB9LAotICB7ICJjb3AyIiwgQ09QMiB9LAotICB7ICJjb3AzIiwgQ09QMyB9LAotICB7ICJjb3A0IiwgQ09QNCB9LAotICB7ICJjb3A1IiwgQ09QNSB9LAotICB7ICJjb3A2IiwgQ09QNiB9LAotICB7ICJjb3A3IiwgQ09QNyB9LAotICB7ICJwYyIsIFBDIH0sCi0gIHsgInpwYyIsIFpQQyB9LAotICB7ICJzciIsIFNSIH0sCi0KLSAgeyAiY2NyIiwgQ0NSIH0sCi0gIHsgImNjIiwgQ0NSIH0sCi0KLSAgeyAiYWNjIiwgQUNDIH0sCi0gIHsgIm1hY3NyIiwgTUFDU1IgfSwKLSAgeyAibWFzayIsIE1BU0sgfSwKLQotICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICB7ICJzZmMiLCBTRkMgfSwJCS8qIFNvdXJjZSBGdW5jdGlvbiBDb2RlICovCi0gIHsgInNmY3IiLCBTRkMgfSwKLSAgeyAiZGZjIiwgREZDIH0sCQkvKiBEZXN0aW5hdGlvbiBGdW5jdGlvbiBDb2RlICovCi0gIHsgImRmY3IiLCBERkMgfSwKLSAgeyAiY2FjciIsIENBQ1IgfSwJCS8qIENhY2hlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSAgeyAiY2FhciIsIENBQVIgfSwJCS8qIENhY2hlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQotICB7ICJ1c3AiLCBVU1AgfSwJCS8qIFVzZXIgU3RhY2sgUG9pbnRlciAqLwotICB7ICJ2YnIiLCBWQlIgfSwJCS8qIFZlY3RvciBCYXNlIFJlZ2lzdGVyICovCi0gIHsgIm1zcCIsIE1TUCB9LAkJLyogTWFzdGVyIFN0YWNrIFBvaW50ZXIgKi8KLSAgeyAiaXNwIiwgSVNQIH0sCQkvKiBJbnRlcnJ1cHQgU3RhY2sgUG9pbnRlciAqLwotCi0gIHsgIml0dDAiLCBJVFQwIH0sCQkvKiBJbnN0cnVjdGlvbiBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWcgMCAqLwotICB7ICJpdHQxIiwgSVRUMSB9LAkJLyogSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gUmVnIDEgKi8KLSAgeyAiZHR0MCIsIERUVDAgfSwJCS8qIERhdGEgVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gUmVnaXN0ZXIgMCAqLwotICB7ICJkdHQxIiwgRFRUMSB9LAkJLyogRGF0YSBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWdpc3RlciAxICovCi0KLSAgLyogNjhlYzA0MCB2ZXJzaW9ucyBvZiBzYW1lICovCi0gIHsgImlhY3IwIiwgSVRUMCB9LAkJLyogSW5zdHJ1Y3Rpb24gQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwotICB7ICJpYWNyMSIsIElUVDEgfSwJCS8qIEluc3RydWN0aW9uIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIDAgKi8KLSAgeyAiZGFjcjAiLCBEVFQwIH0sCQkvKiBEYXRhIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIDAgKi8KLSAgeyAiZGFjcjEiLCBEVFQxIH0sCQkvKiBEYXRhIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIDAgKi8KLQotICAvKiBtY2Y1MjAwIHZlcnNpb25zIG9mIHNhbWUuICBUaGUgQ29sZEZpcmUgcHJvZ3JhbW1lcidzIHJlZmVyZW5jZQotICAgICBtYW51YWwgaW5kaWNhdGVkIHRoYXQgdGhlIG9yZGVyIGlzIDIsMywwLDEsIGJ1dCBLZW4gUm9zZQotICAgICA8cm9zZUBuZXRjb20uY29tPiBzYXlzIHRoYXQgMCwxLDIsMyBpcyB0aGUgY29ycmVjdCBvcmRlci4gICovCi0gIHsgImFjcjAiLCBJVFQwIH0sCQkvKiBBY2Nlc3MgQ29udHJvbCBVbml0IDAgKi8KLSAgeyAiYWNyMSIsIElUVDEgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMSAqLwotICB7ICJhY3IyIiwgRFRUMCB9LAkJLyogQWNjZXNzIENvbnRyb2wgVW5pdCAyICovCi0gIHsgImFjcjMiLCBEVFQxIH0sCQkvKiBBY2Nlc3MgQ29udHJvbCBVbml0IDMgKi8KLQotICB7ICJ0YyIsIFRDIH0sCQkJLyogTU1VIFRyYW5zbGF0aW9uIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSAgeyAidGNyIiwgVEMgfSwKLQotICB7ICJtbXVzciIsIE1NVVNSIH0sCQkvKiBNTVUgU3RhdHVzIFJlZ2lzdGVyICovCi0gIHsgInNycCIsIFNSUCB9LAkJLyogVXNlciBSb290IFBvaW50ZXIgKi8KLSAgeyAidXJwIiwgVVJQIH0sCQkvKiBTdXBlcnZpc29yIFJvb3QgUG9pbnRlciAqLwotCi0gIHsgImJ1c2NyIiwgQlVTQ1IgfSwKLSAgeyAicGNyIiwgUENSIH0sCi0KLSAgeyAicm9tYmFyIiwgUk9NQkFSIH0sCQkvKiBST00gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0gIHsgInJhbWJhcjAiLCBSQU1CQVIwIH0sCS8qIFJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSAgeyAicmFtYmFyMSIsIFJBTUJBUjEgfSwJLyogUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLwotICB7ICJtYmFyIiwgTUJBUiB9LAkJLyogTW9kdWxlIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLwotICAvKiBlbmQgb2YgY29udHJvbCByZWdpc3RlcnMgKi8KLQotICB7ICJhYyIsIEFDIH0sCi0gIHsgImJjIiwgQkMgfSwKLSAgeyAiY2FsIiwgQ0FMIH0sCi0gIHsgImNycCIsIENSUCB9LAotICB7ICJkcnAiLCBEUlAgfSwKLSAgeyAicGNzciIsIFBDU1IgfSwKLSAgeyAicHNyIiwgUFNSIH0sCi0gIHsgInNjYyIsIFNDQyB9LAotICB7ICJ2YWwiLCBWQUwgfSwKLSAgeyAiYmFkMCIsIEJBRDAgfSwKLSAgeyAiYmFkMSIsIEJBRDEgfSwKLSAgeyAiYmFkMiIsIEJBRDIgfSwKLSAgeyAiYmFkMyIsIEJBRDMgfSwKLSAgeyAiYmFkNCIsIEJBRDQgfSwKLSAgeyAiYmFkNSIsIEJBRDUgfSwKLSAgeyAiYmFkNiIsIEJBRDYgfSwKLSAgeyAiYmFkNyIsIEJBRDcgfSwKLSAgeyAiYmFjMCIsIEJBQzAgfSwKLSAgeyAiYmFjMSIsIEJBQzEgfSwKLSAgeyAiYmFjMiIsIEJBQzIgfSwKLSAgeyAiYmFjMyIsIEJBQzMgfSwKLSAgeyAiYmFjNCIsIEJBQzQgfSwKLSAgeyAiYmFjNSIsIEJBQzUgfSwKLSAgeyAiYmFjNiIsIEJBQzYgfSwKLSAgeyAiYmFjNyIsIEJBQzcgfSwKLQotICB7ICJpYyIsIElDIH0sCi0gIHsgImRjIiwgREMgfSwKLSAgeyAibmMiLCBOQyB9LAotCi0gIHsgInR0MCIsIFRUMCB9LAotICB7ICJ0dDEiLCBUVDEgfSwKLSAgLyogNjhlYzAzMCB2ZXJzaW9ucyBvZiBzYW1lICovCi0gIHsgImFjMCIsIFRUMCB9LAotICB7ICJhYzEiLCBUVDEgfSwKLSAgLyogNjhlYzAzMCBhY2Nlc3MgY29udHJvbCB1bml0LCBpZGVudGljYWwgdG8gMDMwIE1NVSBzdGF0dXMgcmVnICovCi0gIHsgImFjdXNyIiwgUFNSIH0sCi0KLSAgLyogU3VwcHJlc3NlZCBkYXRhIGFuZCBhZGRyZXNzIHJlZ2lzdGVycy4gICovCi0gIHsgInpkMCIsIFpEQVRBMCB9LAotICB7ICJ6ZDEiLCBaREFUQTEgfSwKLSAgeyAiemQyIiwgWkRBVEEyIH0sCi0gIHsgInpkMyIsIFpEQVRBMyB9LAotICB7ICJ6ZDQiLCBaREFUQTQgfSwKLSAgeyAiemQ1IiwgWkRBVEE1IH0sCi0gIHsgInpkNiIsIFpEQVRBNiB9LAotICB7ICJ6ZDciLCBaREFUQTcgfSwKLSAgeyAiemEwIiwgWkFERFIwIH0sCi0gIHsgInphMSIsIFpBRERSMSB9LAotICB7ICJ6YTIiLCBaQUREUjIgfSwKLSAgeyAiemEzIiwgWkFERFIzIH0sCi0gIHsgInphNCIsIFpBRERSNCB9LAotICB7ICJ6YTUiLCBaQUREUjUgfSwKLSAgeyAiemE2IiwgWkFERFI2IH0sCi0gIHsgInphNyIsIFpBRERSNyB9LAotCi0gIC8qIFVwcGVyIGFuZCBsb3dlciBkYXRhIGFuZCBhZGRyZXNzIHJlZ2lzdGVycywgdXNlZCBieSBtYWN3IGFuZCBtc2Fjdy4gKi8KLSAgeyAiZDBsIiwgREFUQTBMIH0sCi0gIHsgImQxbCIsIERBVEExTCB9LAotICB7ICJkMmwiLCBEQVRBMkwgfSwKLSAgeyAiZDNsIiwgREFUQTNMIH0sCi0gIHsgImQ0bCIsIERBVEE0TCB9LAotICB7ICJkNWwiLCBEQVRBNUwgfSwKLSAgeyAiZDZsIiwgREFUQTZMIH0sCi0gIHsgImQ3bCIsIERBVEE3TCB9LAotCi0gIHsgImEwbCIsIEFERFIwTCB9LAotICB7ICJhMWwiLCBBRERSMUwgfSwKLSAgeyAiYTJsIiwgQUREUjJMIH0sCi0gIHsgImEzbCIsIEFERFIzTCB9LAotICB7ICJhNGwiLCBBRERSNEwgfSwKLSAgeyAiYTVsIiwgQUREUjVMIH0sCi0gIHsgImE2bCIsIEFERFI2TCB9LAotICB7ICJhN2wiLCBBRERSN0wgfSwKLQotICB7ICJkMHUiLCBEQVRBMFUgfSwKLSAgeyAiZDF1IiwgREFUQTFVIH0sCi0gIHsgImQydSIsIERBVEEyVSB9LAotICB7ICJkM3UiLCBEQVRBM1UgfSwKLSAgeyAiZDR1IiwgREFUQTRVIH0sCi0gIHsgImQ1dSIsIERBVEE1VSB9LAotICB7ICJkNnUiLCBEQVRBNlUgfSwKLSAgeyAiZDd1IiwgREFUQTdVIH0sCi0KLSAgeyAiYTB1IiwgQUREUjBVIH0sCi0gIHsgImExdSIsIEFERFIxVSB9LAotICB7ICJhMnUiLCBBRERSMlUgfSwKLSAgeyAiYTN1IiwgQUREUjNVIH0sCi0gIHsgImE0dSIsIEFERFI0VSB9LAotICB7ICJhNXUiLCBBRERSNVUgfSwKLSAgeyAiYTZ1IiwgQUREUjZVIH0sCi0gIHsgImE3dSIsIEFERFI3VSB9LAotCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgdm9pZAotaW5pdF9yZWd0YWJsZSAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaW5pdF90YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgaW5zZXJ0X3JlZyAoaW5pdF90YWJsZVtpXS5uYW1lLCBpbml0X3RhYmxlW2ldLm51bWJlcik7Ci19Ci0KLXN0YXRpYyBpbnQgbm9fNjg4NTEsIG5vXzY4ODgxOwotCi0jaWZkZWYgT0JKX0FPVVQKLS8qIGEub3V0IG1hY2hpbmUgdHlwZS4gIERlZmF1bHQgdG8gNjgwMjAuICAqLwotaW50IG02OGtfYW91dF9tYWNodHlwZSA9IDI7Ci0jZW5kaWYKLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjb25zdCBjaGFyICplcjsKLSAgc2hvcnQgKmZyb21QOwotICBjaGFyICp0b1AgPSBOVUxMOwotICBpbnQgbSwgbiA9IDA7Ci0gIGNoYXIgKnRvX2JlZ19QOwotICBpbnQgc2hvcnRzX3RoaXNfZnJhZzsKLSAgZml4UyAqZml4UDsKLQotICAvKiBJbiBNUkkgbW9kZSwgdGhlIGluc3RydWN0aW9uIGFuZCBvcGVyYW5kcyBhcmUgc2VwYXJhdGVkIGJ5IGEKLSAgICAgc3BhY2UuICBBbnl0aGluZyBmb2xsb3dpbmcgdGhlIG9wZXJhbmRzIGlzIGEgY29tbWVudC4gIFRoZSBsYWJlbAotICAgICBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQuICAqLwotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGludCBmaWVsZHMgPSAwOwotICAgICAgaW50IGluZmllbGQgPSAwOwotICAgICAgaW50IGlucXVvdGUgPSAwOwotCi0gICAgICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCc7IHMrKykKLQl7Ci0JICBpZiAoKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSAmJiAhIGlucXVvdGUpCi0JICAgIHsKLQkgICAgICBpZiAoaW5maWVsZCkKLQkJewotCQkgICsrZmllbGRzOwotCQkgIGlmIChmaWVsZHMgPj0gMikKLQkJICAgIHsKLQkJICAgICAgKnMgPSAnXDAnOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpbmZpZWxkID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBpbmZpZWxkKQotCQlpbmZpZWxkID0gMTsKLQkgICAgICBpZiAoKnMgPT0gJ1wnJykKLQkJaW5xdW90ZSA9ICEgaW5xdW90ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJnRoZV9pbnMpLCAnXDAnLCBzaXplb2YgKHRoZV9pbnMpKTsKLSAgbTY4a19pcCAoc3RyKTsKLSAgZXIgPSB0aGVfaW5zLmVycm9yOwotICBpZiAoIWVyKQotICAgIHsKLSAgICAgIGZvciAobiA9IDA7IG4gPCB0aGVfaW5zLm51bWFyZ3M7IG4rKykKLQlpZiAodGhlX2lucy5vcGVyYW5kc1tuXS5lcnJvcikKLQkgIHsKLQkgICAgZXIgPSB0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yOwotCSAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0gIGlmIChlcikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIiVzIC0tIHN0YXRlbWVudCBgJXMnIGlnbm9yZWQiKSwgZXIsIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgY3VycmVudCBsYWJlbCwgcmVjb3JkIHRoYXQgaXQgbWFya3MgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoY3VycmVudF9sYWJlbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGN1cnJlbnRfbGFiZWwtPnRleHQgPSAxOwotICAgICAgY3VycmVudF9sYWJlbCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmICh0aGVfaW5zLm5mcmFnID09IDApCi0gICAgewotICAgICAgLyogTm8gZnJhZyBoYWNraW5nIGludm9sdmVkOyBqdXN0IHB1dCBpdCBvdXQgKi8KLSAgICAgIHRvUCA9IGZyYWdfbW9yZSAoMiAqIHRoZV9pbnMubnVtbyk7Ci0gICAgICBmcm9tUCA9ICZ0aGVfaW5zLm9wY29kZVswXTsKLSAgICAgIGZvciAobSA9IHRoZV9pbnMubnVtbzsgbTsgLS1tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAodG9QLCAobG9uZykgKCpmcm9tUCksIDIpOwotCSAgdG9QICs9IDI7Ci0JICBmcm9tUCsrOwotCX0KLSAgICAgIC8qIHB1dCBvdXQgc3ltYm9sLWRlcGVuZGVudCBpbmZvICovCi0gICAgICBmb3IgKG0gPSAwOyBtIDwgdGhlX2lucy5ucmVsOyBtKyspCi0JewotCSAgc3dpdGNoICh0aGVfaW5zLnJlbG9jW21dLndpZCkKLQkgICAgewotCSAgICBjYXNlICdCJzoKLQkgICAgICBuID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgbiA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzMnOgotCSAgICAgIG4gPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgbiA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2wnOgotCSAgICAgIG4gPSA0OwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJEb24ndCBrbm93IGhvdyB0byBmaWd1cmUgd2lkdGggb2YgJWMgaW4gbWRfYXNzZW1ibGUoKSIpLAotCQkJdGhlX2lucy5yZWxvY1ttXS53aWQpOwotCSAgICB9Ci0KLQkgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICAgICAoKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKQotCQkJICAgICAgIC0gdGhlX2lucy5udW1vICogMiArIHRoZV9pbnMucmVsb2NbbV0ubiksCi0JCQkgICAgICBuLAotCQkJICAgICAgJnRoZV9pbnMucmVsb2NbbV0uZXhwLAotCQkJICAgICAgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCSAgICAgIGdldF9yZWxvY19jb2RlIChuLCB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJCQkgICAgICB0aGVfaW5zLnJlbG9jW21dLnBpY19yZWxvYykpOwotCSAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gdGhlX2lucy5yZWxvY1ttXS5wY3JlbF9maXg7Ci0JICBpZiAodGhlX2lucy5yZWxvY1ttXS53aWQgPT0gJ0InKQotCSAgICBmaXhQLT5meF9zaWduZWQgPSAxOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlcmUncyBzb21lIGZyYWcgaGFja2luZyAqLwotICBmb3IgKG4gPSAwLCBmcm9tUCA9ICZ0aGVfaW5zLm9wY29kZVswXTsgbiA8IHRoZV9pbnMubmZyYWc7IG4rKykKLSAgICB7Ci0gICAgICBpbnQgd2lkOwotCi0gICAgICBpZiAobiA9PSAwKQotCXdpZCA9IDIgKiB0aGVfaW5zLmZyYWdiW25dLmZyYWdvZmY7Ci0gICAgICBlbHNlCi0Jd2lkID0gMiAqICh0aGVfaW5zLm51bW8gLSB0aGVfaW5zLmZyYWdiW24gLSAxXS5mcmFnb2ZmKTsKLSAgICAgIHRvUCA9IGZyYWdfbW9yZSAod2lkKTsKLSAgICAgIHRvX2JlZ19QID0gdG9QOwotICAgICAgc2hvcnRzX3RoaXNfZnJhZyA9IDA7Ci0gICAgICBmb3IgKG0gPSB3aWQgLyAyOyBtOyAtLW0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIChsb25nKSAoKmZyb21QKSwgMik7Ci0JICB0b1AgKz0gMjsKLQkgIGZyb21QKys7Ci0JICBzaG9ydHNfdGhpc19mcmFnKys7Ci0JfQotICAgICAgZm9yIChtID0gMDsgbSA8IHRoZV9pbnMubnJlbDsgbSsrKQotCXsKLQkgIGlmICgodGhlX2lucy5yZWxvY1ttXS5uKSA+PSAyICogc2hvcnRzX3RoaXNfZnJhZykKLQkgICAgewotCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ubiAtPSAyICogc2hvcnRzX3RoaXNfZnJhZzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgd2lkID0gdGhlX2lucy5yZWxvY1ttXS53aWQ7Ci0JICBpZiAod2lkID09IDApCi0JICAgIGNvbnRpbnVlOwotCSAgdGhlX2lucy5yZWxvY1ttXS53aWQgPSAwOwotCSAgd2lkID0gKHdpZCA9PSAnYicpID8gMSA6ICh3aWQgPT0gJ3cnKSA/IDIgOiAod2lkID09ICdsJykgPyA0IDogNDAwMDsKLQotCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgICAgICgodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAgICAgLSB0aGVfaW5zLm51bW8gKiAyICsgdGhlX2lucy5yZWxvY1ttXS5uKSwKLQkJCSAgICAgIHdpZCwKLQkJCSAgICAgICZ0aGVfaW5zLnJlbG9jW21dLmV4cCwKLQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkgICAgICBnZXRfcmVsb2NfY29kZSAod2lkLCB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJCQkgICAgICB0aGVfaW5zLnJlbG9jW21dLnBpY19yZWxvYykpOwotCSAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gdGhlX2lucy5yZWxvY1ttXS5wY3JlbF9maXg7Ci0JfQotICAgICAgKHZvaWQpIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDAsCi0JCSAgICAgICAocmVsYXhfc3Vic3RhdGVUKSAodGhlX2lucy5mcmFnYltuXS5mcmFndHkpLAotCQkgICAgICAgdGhlX2lucy5mcmFnYltuXS5mYWRkLCB0aGVfaW5zLmZyYWdiW25dLmZvZmYsIHRvX2JlZ19QKTsKLSAgICB9Ci0gIG4gPSAodGhlX2lucy5udW1vIC0gdGhlX2lucy5mcmFnYltuIC0gMV0uZnJhZ29mZik7Ci0gIHNob3J0c190aGlzX2ZyYWcgPSAwOwotICBpZiAobikKLSAgICB7Ci0gICAgICB0b1AgPSBmcmFnX21vcmUgKG4gKiBzaXplb2YgKHNob3J0KSk7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAodG9QLCAobG9uZykgKCpmcm9tUCksIDIpOwotCSAgdG9QICs9IDI7Ci0JICBmcm9tUCsrOwotCSAgc2hvcnRzX3RoaXNfZnJhZysrOwotCX0KLSAgICB9Ci0gIGZvciAobSA9IDA7IG0gPCB0aGVfaW5zLm5yZWw7IG0rKykKLSAgICB7Ci0gICAgICBpbnQgd2lkOwotCi0gICAgICB3aWQgPSB0aGVfaW5zLnJlbG9jW21dLndpZDsKLSAgICAgIGlmICh3aWQgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIHRoZV9pbnMucmVsb2NbbV0ud2lkID0gMDsKLSAgICAgIHdpZCA9ICh3aWQgPT0gJ2InKSA/IDEgOiAod2lkID09ICd3JykgPyAyIDogKHdpZCA9PSAnbCcpID8gNCA6IDQwMDA7Ci0KLSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICgodGhlX2lucy5yZWxvY1ttXS5uICsgdG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAtIHNob3J0c190aGlzX2ZyYWcgKiAyKSwKLQkJCSAgd2lkLAotCQkJICAmdGhlX2lucy5yZWxvY1ttXS5leHAsCi0JCQkgIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkgIGdldF9yZWxvY19jb2RlICh3aWQsIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkJCSAgdGhlX2lucy5yZWxvY1ttXS5waWNfcmVsb2MpKTsKLSAgICAgIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IHRoZV9pbnMucmVsb2NbbV0ucGNyZWxfZml4OwotICAgIH0KLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgLyoKLSAgICogbWRfYmVnaW4gLS0gc2V0IHVwIGhhc2ggdGFibGVzIHdpdGggNjgwMDAgaW5zdHJ1Y3Rpb25zLgotICAgKiBzaW1pbGFyIHRvIHdoYXQgdGhlIHZheCBhc3NlbWJsZXIgZG9lcy4gIC0tLXBocgotICAgKi8KLSAgLyogUk1TIGNsYWltcyB0aGUgdGhpbmcgdG8gZG8gaXMgdGFrZSB0aGUgbTY4ay1vcGNvZGUuaCB0YWJsZSwgYW5kIG1ha2UKLSAgICAgYSBjb3B5IG9mIGl0IGF0IHJ1bnRpbWUsIGFkZGluZyBpbiB0aGUgaW5mb3JtYXRpb24gd2Ugd2FudCBidXQgaXNuJ3QKLSAgICAgdGhlcmUuICBJIHRoaW5rIGl0J2QgYmUgYmV0dGVyIHRvIGhhdmUgYW4gYXdrIHNjcmlwdCBoYWNrIHRoZSB0YWJsZQotICAgICBhdCBjb21waWxlIHRpbWUuICBPciBldmVuIGp1c3QgeHN0ciB0aGUgdGFibGUgYW5kIHVzZSBpdCBhcy1pcy4gIEJ1dAotICAgICBteSBsb3JkIGdob2QgaGF0aCBzcG9rZW4sIHNvIHdlIGRvIGl0IHRoaXMgd2F5LiAgRXhjdXNlIHRoZSB1Z2x5IHZhcgotICAgICBuYW1lcy4gICovCi0KLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICppbnM7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBtNjhrX2luY2FudCAqaGFjaywgKnNsYWs7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnJldHZhbCA9IDA7CS8qIGVtcHR5IHN0cmluZywgb3IgZXJyb3IgbXNnIHRleHQgKi8KLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMTsKLSAgICAgIG02OGtfYWJzcGNhZGQgPSAxOwotICAgICAgaWYgKCEgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpCi0JbTY4a19yZWwzMiA9IDA7Ci0gICAgfQotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBvYnN0YWNrX2JlZ2luICgmcm9ieW4sIDQwMDApOwotICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1vcGNvZGVzOyBpKyspCi0gICAgewotICAgICAgaGFjayA9IHNsYWsgPSAoc3RydWN0IG02OGtfaW5jYW50ICopIG9ic3RhY2tfYWxsb2MgKCZyb2J5biwgc2l6ZW9mIChzdHJ1Y3QgbTY4a19pbmNhbnQpKTsKLSAgICAgIGRvCi0JewotCSAgaW5zID0gJm02OGtfb3Bjb2Rlc1tpXTsKLQkgIC8qIFdlICpjb3VsZCogaWdub3JlIGluc25zIHRoYXQgZG9uJ3QgbWF0Y2ggb3VyIGFyY2ggaGVyZQotCSAgICAgYnV0IGp1c3QgbGVhdmluZyB0aGVtIG91dCBvZiB0aGUgaGFzaC4gKi8KLQkgIHNsYWstPm1fb3BlcmFuZHMgPSBpbnMtPmFyZ3M7Ci0JICBzbGFrLT5tX29wbnVtID0gc3RybGVuIChzbGFrLT5tX29wZXJhbmRzKSAvIDI7Ci0JICBzbGFrLT5tX2FyY2ggPSBpbnMtPmFyY2g7Ci0JICBzbGFrLT5tX29wY29kZSA9IGlucy0+b3Bjb2RlOwotCSAgLyogVGhpcyBpcyBrbHVkZ2V5ICovCi0JICBzbGFrLT5tX2NvZGVudW0gPSAoKGlucy0+bWF0Y2gpICYgMHhmZmZmTCkgPyAyIDogMTsKLQkgIGlmIChpICsgMSAhPSBtNjhrX251bW9wY29kZXMKLQkgICAgICAmJiAhc3RyY21wIChpbnMtPm5hbWUsIG02OGtfb3Bjb2Rlc1tpICsgMV0ubmFtZSkpCi0JICAgIHsKLQkgICAgICBzbGFrLT5tX25leHQgPSAoc3RydWN0IG02OGtfaW5jYW50ICopIG9ic3RhY2tfYWxsb2MgKCZyb2J5biwgc2l6ZW9mIChzdHJ1Y3QgbTY4a19pbmNhbnQpKTsKLQkgICAgICBpKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc2xhay0+bV9uZXh0ID0gMDsKLQkgIHNsYWsgPSBzbGFrLT5tX25leHQ7Ci0JfQotICAgICAgd2hpbGUgKHNsYWspOwotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgaW5zLT5uYW1lLCAoY2hhciAqKSBoYWNrKTsKLSAgICAgIGlmIChyZXR2YWwpCi0JYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiAgQ2FuJ3QgaGFzaCAlczogJXMiKSwgaW5zLT5uYW1lLCByZXR2YWwpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1hbGlhc2VzOyBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG02OGtfb3Bjb2RlX2FsaWFzZXNbaV0ucHJpbWFyeTsKLSAgICAgIGNvbnN0IGNoYXIgKmFsaWFzID0gbTY4a19vcGNvZGVfYWxpYXNlc1tpXS5hbGlhczsKLSAgICAgIFBUUiB2YWwgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG5hbWUpOwotICAgICAgaWYgKCF2YWwpCi0JYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiBDYW4ndCBmaW5kICVzIGluIGhhc2ggdGFibGUiKSwgbmFtZSk7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgYWxpYXMsIHZhbCk7Ci0gICAgICBpZiAocmV0dmFsKQotCWFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgaGFzaCAlczogJXMiKSwgYWxpYXMsIHJldHZhbCk7Ci0gICAgfQotCi0gIC8qIEluIE1SSSBtb2RlLCBhbGwgdW5zaXplZCBicmFuY2hlcyBhcmUgdmFyaWFibGUgc2l6ZWQuICBOb3JtYWxseSwKLSAgICAgdGhleSBhcmUgd29yZCBzaXplZC4gICovCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBzdGF0aWMgc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzIG1yaV9hbGlhc2VzW10gPQotCXsKLQkgIHsgImJoaSIsCSJqaGkiLCB9LAotCSAgeyAiYmxzIiwJImpscyIsIH0sCi0JICB7ICJiY2MiLAkiamNjIiwgfSwKLQkgIHsgImJjcyIsCSJqY3MiLCB9LAotCSAgeyAiYm5lIiwJImpuZSIsIH0sCi0JICB7ICJiZXEiLAkiamVxIiwgfSwKLQkgIHsgImJ2YyIsCSJqdmMiLCB9LAotCSAgeyAiYnZzIiwJImp2cyIsIH0sCi0JICB7ICJicGwiLAkianBsIiwgfSwKLQkgIHsgImJtaSIsCSJqbWkiLCB9LAotCSAgeyAiYmdlIiwJImpnZSIsIH0sCi0JICB7ICJibHQiLAkiamx0IiwgfSwKLQkgIHsgImJndCIsCSJqZ3QiLCB9LAotCSAgeyAiYmxlIiwJImpsZSIsIH0sCi0JICB7ICJicmEiLAkianJhIiwgfSwKLQkgIHsgImJzciIsCSJqYnNyIiwgfSwKLQl9OwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIG1yaV9hbGlhc2VzIC8gc2l6ZW9mIG1yaV9hbGlhc2VzWzBdOyBpKyspCi0JewotCSAgY29uc3QgY2hhciAqbmFtZSA9IG1yaV9hbGlhc2VzW2ldLnByaW1hcnk7Ci0JICBjb25zdCBjaGFyICphbGlhcyA9IG1yaV9hbGlhc2VzW2ldLmFsaWFzOwotCSAgUFRSIHZhbCA9IGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7Ci0JICBpZiAoIXZhbCkKLQkgICAgYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiBDYW4ndCBmaW5kICVzIGluIGhhc2ggdGFibGUiKSwgbmFtZSk7Ci0JICByZXR2YWwgPSBoYXNoX2phbSAob3BfaGFzaCwgYWxpYXMsIHZhbCk7Ci0JICBpZiAocmV0dmFsKQotCSAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGhhc2ggJXM6ICVzIiksIGFsaWFzLCByZXR2YWwpOwotCX0KLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAobWtsb3dlcl90YWJsZSk7IGkrKykKLSAgICBta2xvd2VyX3RhYmxlW2ldID0gKGlzdXBwZXIgKGMgPSAoY2hhcikgaSkpID8gdG9sb3dlciAoYykgOiBjOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG5vdGVuZF90YWJsZSk7IGkrKykKLSAgICB7Ci0gICAgICBub3RlbmRfdGFibGVbaV0gPSAwOwotICAgICAgYWx0X25vdGVuZF90YWJsZVtpXSA9IDA7Ci0gICAgfQotICBub3RlbmRfdGFibGVbJywnXSA9IDE7Ci0gIG5vdGVuZF90YWJsZVsneyddID0gMTsKLSAgbm90ZW5kX3RhYmxlWyd9J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydhJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydBJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydkJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydEJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWycjJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWycmJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydmJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydGJ10gPSAxOwotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotICBhbHRfbm90ZW5kX3RhYmxlW1JFR0lTVEVSX1BSRUZJWF0gPSAxOwotI2VuZGlmCi0KLSAgLyogV2UgbmVlZCB0byBwdXQgJygnIGluIGFsdF9ub3RlbmRfdGFibGUgdG8gaGFuZGxlCi0gICAgICAgY2FzMiAlZDA6JWQyLCVkMzolZDQsKCVhMCk6KCVhMSkKLSAgICAgKi8KLSAgYWx0X25vdGVuZF90YWJsZVsnKCddID0gMTsKLQotICAvKiBXZSBuZWVkIHRvIHB1dCAnQCcgaW4gYWx0X25vdGVuZF90YWJsZSB0byBoYW5kbGUKLSAgICAgICBjYXMyICVkMDolZDIsJWQzOiVkNCxAKCVkMCk6QCglZDEpCi0gICAgICovCi0gIGFsdF9ub3RlbmRfdGFibGVbJ0AnXSA9IDE7Ci0KLSAgLyogV2UgbmVlZCB0byBwdXQgZGlnaXRzIGluIGFsdF9ub3RlbmRfdGFibGUgdG8gaGFuZGxlCi0gICAgICAgYmZleHR1ICVkMHsyNDoxfSwlZDAKLSAgICAgKi8KLSAgYWx0X25vdGVuZF90YWJsZVsnMCddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnMSddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnMiddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnMyddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnNCddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnNSddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnNiddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnNyddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnOCddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnOSddID0gMTsKLQotI2lmbmRlZiBNSVRfU1lOVEFYX09OTFkKLSAgLyogSW5zZXJ0IHBzZXVkbyBvcHMsIHRoZXNlIGhhdmUgdG8gZ28gaW50byB0aGUgb3Bjb2RlIHRhYmxlIHNpbmNlCi0gICAgIGdhcyBleHBlY3RzIHBzZXVkbyBvcHMgdG8gc3RhcnQgd2l0aCBhIGRvdCAqLwotICB7Ci0gICAgaW50IG4gPSAwOwotICAgIHdoaWxlIChtb3RlX3BzZXVkb190YWJsZVtuXS5wb2NfbmFtZSkKLSAgICAgIHsKLQloYWNrID0gKHN0cnVjdCBtNjhrX2luY2FudCAqKQotCSAgb2JzdGFja19hbGxvYyAoJnJvYnluLCBzaXplb2YgKHN0cnVjdCBtNjhrX2luY2FudCkpOwotCWhhc2hfaW5zZXJ0IChvcF9oYXNoLAotCQkgICAgIG1vdGVfcHNldWRvX3RhYmxlW25dLnBvY19uYW1lLCAoY2hhciAqKSBoYWNrKTsKLQloYWNrLT5tX29wZXJhbmRzID0gMDsKLQloYWNrLT5tX29wbnVtID0gbjsKLQluKys7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGluaXRfcmVndGFibGUgKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIHJlY29yZF9hbGlnbm1lbnQgKHRleHRfc2VjdGlvbiwgMik7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKGRhdGFfc2VjdGlvbiwgMik7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCAyKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotc2VsZWN0X2NvbnRyb2xfcmVncyAoKQotewotICAvKiBOb3RlIHdoaWNoIHNldCBvZiAibW92ZWMiIGNvbnRyb2wgcmVnaXN0ZXJzIGlzIGF2YWlsYWJsZS4gICovCi0gIHN3aXRjaCAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLSAgICB7Ci0gICAgY2FzZSBtNjgwMDA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwMDBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtNjgwMTA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwMTBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtNjgwMjA6Ci0gICAgY2FzZSBtNjgwMzA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwMjBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtNjgwNDA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwNDBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtNjgwNjA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwNjBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjcHUzMjoKLSAgICAgIGNvbnRyb2xfcmVncyA9IGNwdTMyX2NvbnRyb2xfcmVnczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbWNmNTIwMDoKLSAgICBjYXNlIG1jZjUyMDZlOgotICAgIGNhc2UgbWNmNTMwNzoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG1jZl9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi12b2lkCi1tNjhrX2luaXRfYWZ0ZXJfYXJncyAoKQotewotICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSAwKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotCi0gICAgICBpZiAoKmRlZmF1bHRfY3B1ID09ICdtJykKLQlkZWZhdWx0X2NwdSsrOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKLQlpZiAoc3RyY2FzZWNtcCAoZGVmYXVsdF9jcHUsIGFyY2hzW2ldLm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChpID09IG5fYXJjaHMpCi0JewotCSAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgZGVmYXVsdCBjcHUgYCVzJyA/Pz8iKSwgVEFSR0VUX0NQVSk7Ci0JICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjgwMjA7Ci0JfQotICAgICAgZWxzZQotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2hzW2ldLmFyY2g7Ci0gICAgfQotICAvKiBQZXJtaXQgbTY4ODgxIHNwZWNpZmljYXRpb24gd2l0aCBhbGwgY3B1czsgdGhvc2UgdGhhdCBjYW4ndCB3b3JrCi0gICAgIHdpdGggYSBjb3Byb2Nlc3NvciBjb3VsZCBiZSBkb2luZyBlbXVsYXRpb24uICAqLwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4NTEpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4MDQwKQotCXsKLQkgIGFzX3dhcm4gKF8oIjY4MDQwIGFuZCA2ODg1MSBzcGVjaWZpZWQ7IG1tdSBpbnN0cnVjdGlvbnMgbWF5IGFzc2VtYmxlIGluY29ycmVjdGx5IikpOwotCX0KLSAgICB9Ci0gIC8qIFdoYXQgb3RoZXIgaW5jb21wYXRpYmlsaXRpZXMgY291bGQgd2UgY2hlY2sgZm9yPyAgKi8KLQotICAvKiBUb3NzIGluIHNvbWUgZGVmYXVsdCBhc3N1bXB0aW9ucyBhYm91dCBjb3Byb2Nlc3NvcnMuICAqLwotICBpZiAoIW5vXzY4ODgxCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCSAgLyogQ2FuIENQVTMyIGhhdmUgYSA2ODg4MSBjb3Byb2Nlc3Nvcj8/ICAqLwotCSAgJiAobTY4MDIwIHwgbTY4MDMwIHwgY3B1MzIpKSkKLSAgICB7Ci0gICAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4ODE7Ci0gICAgfQotICBpZiAoIW5vXzY4ODUxCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIG02ODAyMHVwKSAhPSAwCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIG02ODA0MHVwKSA9PSAwKQotICAgIHsKLSAgICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKLSAgICB9Ci0gIGlmIChub182ODg4MSAmJiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4ODEpKQotICAgIGFzX2JhZCAoXygib3B0aW9ucyBmb3IgNjg4ODEgYW5kIG5vLTY4ODgxIGJvdGggZ2l2ZW4iKSk7Ci0gIGlmIChub182ODg1MSAmJiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4NTEpKQotICAgIGFzX2JhZCAoXygib3B0aW9ucyBmb3IgNjg4NTEgYW5kIG5vLTY4ODUxIGJvdGggZ2l2ZW4iKSk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotICAvKiBXb3JrIG91dCB0aGUgbWFnaWMgbnVtYmVyLiAgVGhpcyBpc24ndCB2ZXJ5IGdlbmVyYWwuICAqLwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMDApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMDsKLSAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMTApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMTsKLSAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMjApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMjsKLSAgZWxzZQotICAgIG02OGtfYW91dF9tYWNodHlwZSA9IDI7Ci0jZW5kaWYKLQotICAvKiBOb3RlIHdoaWNoIHNldCBvZiAibW92ZWMiIGNvbnRyb2wgcmVnaXN0ZXJzIGlzIGF2YWlsYWJsZS4gICovCi0gIHNlbGVjdF9jb250cm9sX3JlZ3MgKCk7Ci0KLSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLSAgICAgIHx8IGFyY2hfY29sZGZpcmVfcCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQotICAgIG1kX3JlbGF4X3RhYmxlW1RBQiAoUENJTkRFWCwgQllURSldLnJseF9tb3JlID0gMDsKLX0KLQwKLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBsYWJlbCBpcyBkZWZpbmVkLiAgKi8KLQotdm9pZAotbTY4a19mcm9iX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3RydWN0IGxhYmVsX2xpbmUgKm47Ci0KLSAgbiA9IChzdHJ1Y3QgbGFiZWxfbGluZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5uZXh0ID0gbGFiZWxzOwotICBuLT5sYWJlbCA9IHN5bTsKLSAgYXNfd2hlcmUgKCZuLT5maWxlLCAmbi0+bGluZSk7Ci0gIG4tPnRleHQgPSAwOwotICBsYWJlbHMgPSBuOwotICBjdXJyZW50X2xhYmVsID0gbjsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIGluc3RydWN0aW9uIGlzIGVtaXR0ZWQuICAqLwotCi12b2lkCi1tNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi17Ci0gIGN1cnJlbnRfbGFiZWwgPSBOVUxMOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSwgd2hlbiB0aGUgZmluYWwgdmFsdWUgb2YKLSAgIHRoZSBsYWJlbCBpcyBrbm93bi4gIFdlIHdhcm4gaWYgdGhpcyBpcyBhIHRleHQgc3ltYm9sIGFsaWduZWQgYXQgYW4KLSAgIG9kZCBsb2NhdGlvbi4gICovCi0KLXZvaWQKLW02OGtfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSByZWdfc2VjdGlvbgotICAgICAgJiYgKGludCkgU19HRVRfVkFMVUUgKHN5bSkgPCAwKQotICAgIHsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCB+KGludClTX0dFVF9WQUxVRSAoc3ltKSk7Ci0gICAgfQotICBlbHNlIGlmICgoU19HRVRfVkFMVUUgKHN5bSkgJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBsYWJlbF9saW5lICpsOwotCi0gICAgICBmb3IgKGwgPSBsYWJlbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JewotCSAgaWYgKGwtPmxhYmVsID09IHN5bSkKLQkgICAgewotCSAgICAgIGlmIChsLT50ZXh0KQotCQlhc193YXJuX3doZXJlIChsLT5maWxlLCBsLT5saW5lLAotCQkJICAgICAgIF8oInRleHQgbGFiZWwgYCVzJyBhbGlnbmVkIHRvIG9kZCBib3VuZGFyeSIpLAotCQkJICAgICAgIFNfR0VUX05BTUUgKHN5bSkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQwKLS8qIFRoaXMgaXMgY2FsbGVkIGlmIHdlIGdvIGluIG9yIG91dCBvZiBNUkkgbW9kZSBiZWNhdXNlIG9mIHRoZSAubXJpCi0gICBwc2V1ZG8tb3AuICAqLwotCi12b2lkCi1tNjhrX21yaV9tb2RlX2NoYW5nZSAob24pCi0gICAgIGludCBvbjsKLXsKLSAgaWYgKG9uKQotICAgIHsKLSAgICAgIGlmICghIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCkKLQl7Ci0JICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSAxOwotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotCSAgaW5pdF9yZWd0YWJsZSAoKTsKLSNlbmRpZgotCX0KLSAgICAgIG02OGtfYWJzcGNhZGQgPSAxOwotICAgICAgaWYgKCEgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpCi0JbTY4a19yZWwzMiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgcmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuKQotCXsKLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwKLQkgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTDsKLSNlbHNlCi0JICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSAwOwotI2VuZGlmCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0JICBpbml0X3JlZ3RhYmxlICgpOwotI2VuZGlmCi0JfQotICAgICAgbTY4a19hYnNwY2FkZCA9IDA7Ci0gICAgICBpZiAoISBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSkKLQltNjhrX3JlbDMyID0gMTsKLSAgICB9Ci19Ci0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi1zdGF0aWMgdm9pZAotbWRfYXBwbHlfZml4XzIgKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci17Ci0gIGFkZHJlc3NUIHVwcGVyX2xpbWl0OwotICBvZmZzZXRUIGxvd2VyX2xpbWl0OwotCi0gIC8qIFRoaXMgaXMgdW5uZWNlc3NhcnkgYnV0IGl0IGNvbnZpbmNlcyB0aGUgbmF0aXZlIHJzNjAwMCBjb21waWxlcgotICAgICB0byBnZW5lcmF0ZSB0aGUgY29kZSB3ZSB3YW50LiAgKi8KLSAgY2hhciAqYnVmID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgYnVmICs9IGZpeFAtPmZ4X3doZXJlOwotICAvKiBlbmQgaWJtIGNvbXBpbGVyIHdvcmthcm91bmQgKi8KLQotICBpZiAodmFsICYgMHg4MDAwMDAwMCkKLSAgICB2YWwgfD0gfihhZGRyZXNzVCkweDdmZmZmZmZmOwotICBlbHNlCi0gICAgdmFsICY9IDB4N2ZmZmZmZmY7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChmaXhQLT5meF9hZGRzeSkKLSAgICB7Ci0gICAgICBtZW1zZXQgKGJ1ZiwgMCwgZml4UC0+Znhfc2l6ZSk7Ci0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciBlbWl0X3JlbG9jICovCi0KLSAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0JICAmJiAhU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgICYmICFTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLQlTX1NFVF9XRUFLIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm47Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3NpemUpCi0gICAgewotICAgICAgLyogVGhlIGNhc3QgdG8gb2Zmc2V0VCBiZWxvdyBhcmUgbmVjZXNzYXJ5IHRvIG1ha2UgY29kZSBjb3JyZWN0IGZvcgotCSBtYWNoaW5lcyB3aGVyZSBpbnRzIGFyZSBzbWFsbGVyIHRoYW4gb2Zmc2V0VCAqLwotICAgIGNhc2UgMToKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIHVwcGVyX2xpbWl0ID0gMHg3ZjsKLSAgICAgIGxvd2VyX2xpbWl0ID0gLSAob2Zmc2V0VCkgMHg4MDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICB1cHBlcl9saW1pdCA9IDB4N2ZmZjsKLSAgICAgIGxvd2VyX2xpbWl0ID0gLSAob2Zmc2V0VCkgMHg4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICB1cHBlcl9saW1pdCA9IDB4N2ZmZmZmZmY7Ci0gICAgICBsb3dlcl9saW1pdCA9IC0gKG9mZnNldFQpIDB4N2ZmZmZmZmYgLSAxOwkvKiBhdm9pZCBjb25zdGFudCBvdmVyZmxvdyAqLwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmaXhQLT5meF9zaXplKTsKLSAgICB9Ci0KLSAgLyogRml4IHVwIGEgbmVnYXRpdmUgcmVsb2MuICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCAmJiBmaXhQLT5meF9zdWJzeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gZml4UC0+Znhfc3Vic3k7Ci0gICAgICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0gICAgICBmaXhQLT5meF90Y2JpdCA9IDE7Ci0gICAgfQotCi0gIC8qIEZvciBub24tcGMtcmVsYXRpdmUgdmFsdWVzLCBpdCdzIGNvbmNlaXZhYmxlIHdlIG1pZ2h0IGdldCBzb21ldGhpbmcKLSAgICAgbGlrZSAiMHhmZiIgZm9yIGEgYnl0ZSBmaWVsZC4gIFNvIGV4dGVuZCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcmFuZ2UKLSAgICAgdG8gYWNjZXB0IHN1Y2ggbnVtYmVycy4gIFdlIGFyYml0cmFyaWx5IGRpc2FsbG93ICItMHhmZiIgb3IgIjB4ZmYrMHhmZiIsCi0gICAgIHNvIHRoYXQgd2UgY2FuIGRvIGFueSByYW5nZSBjaGVja2luZyBhdCBhbGwuICAqLwotICBpZiAoISBmaXhQLT5meF9wY3JlbCAmJiAhIGZpeFAtPmZ4X3NpZ25lZCkKLSAgICB1cHBlcl9saW1pdCA9IHVwcGVyX2xpbWl0ICogMiArIDE7Ci0KLSAgaWYgKChhZGRyZXNzVCkgdmFsID4gdXBwZXJfbGltaXQKLSAgICAgICYmICh2YWwgPiAwIHx8IHZhbCA8IGxvd2VyX2xpbWl0KSkKLSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInZhbHVlIG91dCBvZiByYW5nZSIpKTsKLQotICAvKiBBIG9uZSBieXRlIFBDLXJlbGF0aXZlIHJlbG9jIG1lYW5zIGEgc2hvcnQgYnJhbmNoLiAgV2UgY2FuJ3QgdXNlCi0gICAgIGEgc2hvcnQgYnJhbmNoIHdpdGggYSB2YWx1ZSBvZiAwIG9yIC0xLCBiZWNhdXNlIHRob3NlIGluZGljYXRlCi0gICAgIGRpZmZlcmVudCBvcGNvZGVzIChicmFuY2hlcyB3aXRoIGxvbmdlciBvZmZzZXRzKS4gIGZpeHVwX3NlZ21lbnQKLSAgICAgaW4gd3JpdGUuYyBtYXkgaGF2ZSBjbG9iYmVyZWQgZnhfcGNyZWwsIHNvIHdlIG5lZWQgdG8gZXhhbWluZSB0aGUKLSAgICAgcmVsb2MgdHlwZS4gICovCi0gIGlmICgoZml4UC0+ZnhfcGNyZWwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184X1BDUkVMCi0jZW5kaWYKLSAgICAgICApCi0gICAgICAmJiBmaXhQLT5meF9zaXplID09IDEKLSAgICAgICYmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMCi0JICB8fCBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICAgICYmICh2YWwgPT0gMCB8fCB2YWwgPT0gLTEpKQotICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygiaW52YWxpZCBieXRlIGJyYW5jaCBvZmZzZXQiKSk7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotewotICBtZF9hcHBseV9maXhfMiAoZml4UCwgKGFkZHJlc3NUKSAqdmFscCk7Ci0gIHJldHVybiAxOwotfQotI2Vsc2UKLXZvaWQgbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBtZF9hcHBseV9maXhfMiAoZml4UCwgKGFkZHJlc3NUKSB2YWwpOwotfQotI2VuZGlmCi0KLS8qICpmcmFnUCBoYXMgYmVlbiByZWxheGVkIHRvIGl0cyBmaW5hbCBzaXplLCBhbmQgbm93IG5lZWRzIHRvIGhhdmUKLSAgIHRoZSBieXRlcyBpbnNpZGUgaXQgbW9kaWZpZWQgdG8gY29uZm9ybSB0byB0aGUgbmV3IHNpemUgIFRoZXJlIGlzIFVHTFkKLSAgIE1BR0lDIGhlcmUuIC4uCi0gICAqLwotc3RhdGljIHZvaWQKLW1kX2NvbnZlcnRfZnJhZ18xIChmcmFnUCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBsb25nIGRpc3A7Ci0gIGxvbmcgZXh0ID0gMDsKLSAgZml4UyAqZml4UDsKLQotICAvKiBBZGRyZXNzIGluIG9iamVjdCBjb2RlIG9mIHRoZSBkaXNwbGFjZW1lbnQuICAqLwotICByZWdpc3RlciBpbnQgb2JqZWN0X2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7Ci0KLSAgLyogQWRkcmVzcyBpbiBnYXMgY29yZSBvZiB0aGUgcGxhY2UgdG8gc3RvcmUgdGhlIGRpc3BsYWNlbWVudC4gICovCi0gIC8qIFRoaXMgY29udmluY2VzIHRoZSBuYXRpdmUgcnM2MDAwIGNvbXBpbGVyIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHdlCi0gICAgIHdhbnQuICovCi0gIHJlZ2lzdGVyIGNoYXIgKmJ1ZmZlcl9hZGRyZXNzID0gZnJhZ1AtPmZyX2xpdGVyYWw7Ci0gIGJ1ZmZlcl9hZGRyZXNzICs9IGZyYWdQLT5mcl9maXg7Ci0gIC8qIGVuZCBpYm0gY29tcGlsZXIgd29ya2Fyb3VuZCAqLwotCi0gIC8qIFRoZSBkaXNwbGFjZW1lbnQgb2YgdGhlIGFkZHJlc3MsIGZyb20gY3VycmVudCBsb2NhdGlvbi4gICovCi0gIGRpc3AgPSBmcmFnUC0+ZnJfc3ltYm9sID8gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpIDogMDsKLSAgZGlzcCA9IChkaXNwICsgZnJhZ1AtPmZyX29mZnNldCkgLSBvYmplY3RfYWRkcmVzczsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZGlzcCArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBCWVRFKToKLSAgICBjYXNlIFRBQiAoQUJSQU5DSCwgQllURSk6Ci0gICAgICBrbm93IChpc3NieXRlIChkaXNwKSk7Ci0gICAgICBpZiAoZGlzcCA9PSAwKQotCWFzX2JhZCAoXygic2hvcnQgYnJhbmNoIHdpdGggemVybyBvZmZzZXQ6IHVzZSA6dyIpKTsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSBkaXNwOwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChEQkNDLCBTSE9SVCk6Ci0gICAgICBrbm93IChpc3N3b3JkIChkaXNwKSk7Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBTSE9SVCk6Ci0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIFNIT1JUKToKLSAgICAgIGtub3cgKGlzc3dvcmQgKGRpc3ApKTsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDAwOwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChBQlJBTkNILCBMT05HKToKLSAgICAgIGlmICghSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JewotCSAgaWYgKGZyYWdQLT5mcl9vcGNvZGVbMF0gPT0gMHg2MSkKLQkgICAgLyogQlNSICovCi0JICAgIHsKLQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzBdID0gMHg0RTsKLQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4Qjk7IC8qIEpCU1Igd2l0aCBBQlNMIExPTkcgb2Zmc2V0ICovCi0KLQkgICAgICBmaXhfbmV3IChmcmFnUCwKLQkJICAgICAgIGZyYWdQLT5mcl9maXgsCi0JCSAgICAgICA0LAotCQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JCSAgICAgICAwLAotCQkgICAgICAgTk9fUkVMT0MpOwotCi0JICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgICAgIGV4dCA9IDA7Ci0JICAgIH0KLQkgIC8qIEJSQSAqLwotCSAgZWxzZSBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYwKQotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEY5OyAvKiBKTVAgIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLwotCSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgICBleHQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvbmcgYnJhbmNoIG9mZnNldCBub3Qgc3VwcG9ydGVkLiIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4ZmY7Ci0JICBleHQgPSA0OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgTE9ORyk6Ci0gICAgICAvKiBvbmx5IEJjYyA2ODAwMCBpbnN0cnVjdGlvbnMgY2FuIGNvbWUgaGVyZSAqLwotICAgICAgLyogY2hhbmdlIGJjYyBpbnRvIGIhY2Mvam1wIGFic2wgbG9uZyAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSBePSAweDAxOwkvKiBpbnZlcnQgYmNjICovCi0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gMHg2Oy8qIGJyYW5jaCBvZmZzZXQgPSA2ICovCi0KLSAgICAgIC8qIEpGOiB0aGVzZSB1c2VkIHRvIGJlIGZyX29wY29kZVsyLDNdLCBidXQgdGhleSBtYXkgYmUgaW4gYQotCSAgIGRpZmZlcmVudCBmcmFnLCBpbiB3aGljaCBjYXNlIHJlZmVyaW5nIHRvIHRoZW0gaXMgYSBuby1uby4KLQkgICBPbmx5IGZyX29wY29kZVswLDFdIGFyZSBndWFyYW50ZWVkIHRvIHdvcmsuICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAoY2hhcikgMHhmOTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsJLyogYWNjb3VudCBmb3Igam1wIGluc3RydWN0aW9uICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChEQkNDLCBMT05HKToKLSAgICAgIC8qIG9ubHkgREJjYyA2ODAwMCBpbnN0cnVjdGlvbnMgY2FuIGNvbWUgaGVyZSAqLwotICAgICAgLyogY2hhbmdlIGRiY2MgaW50byBkYmNjL2ptcCBhYnNsIGxvbmcgKi8KLSAgICAgIC8qIEpGOiB0aGVzZSB1c2VkIHRvIGJlIGZyX29wY29kZVsyLTddLCBidXQgdGhhdCdzIHdyb25nICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4MDA7CS8qIGJyYW5jaCBvZmZzZXQgPSA0ICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4MDQ7Ci0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4NjA7CS8qIHB1dCBpbiBicmEgcGMrNiAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDA2OwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gKGNoYXIpIDB4Zjk7Ci0KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbnMgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gICAgICBleHQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKEZCUkFOQ0gsIFNIT1JUKToKLSAgICAgIGtub3cgKChmcmFnUC0+ZnJfb3Bjb2RlWzFdICYgMHg0MCkgPT0gMCk7Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKEZCUkFOQ0gsIExPTkcpOgotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDQwOwkvKiBUdXJuIG9uIExPTkcgYml0ICovCi0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDUkVMLCBTSE9SVCk6Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDUkVMLCBMT05HKToKLSAgICAgIC8qIFRoZSB0aGluZyB0byBkbyBoZXJlIGlzIGZvcmNlIGl0IHRvIEFCU09MVVRFIExPTkcsIHNpbmNlCi0JUENSRUwgaXMgcmVhbGx5IHRyeWluZyB0byBzaG9ydGVuIGFuIEFCU09MVVRFIGFkZHJlc3MgYW55d2F5ICovCi0gICAgICAvKiBKRiBGT08gVGhpcyBjb2RlIGhhcyBub3QgYmVlbiB0ZXN0ZWQgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLCBOT19SRUxPQyk7Ci0gICAgICBpZiAoKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAweDNGKSAhPSAweDNBKQotCWFzX2JhZCAoXygiSW50ZXJuYWwgZXJyb3IgKGxvbmcgUEMtcmVsYXRpdmUgb3BlcmFuZCkgZm9yIGluc24gMHglMDR4IGF0IDB4JWx4IiksCi0JCSh1bnNpZ25lZCkgZnJhZ1AtPmZyX29wY29kZVswXSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzKTsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gJj0gfjB4M0Y7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdIHw9IDB4Mzk7CS8qIE1vZGUgNy4xICovCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gICAgICBleHQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDTEVBLCBTSE9SVCk6Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdICY9IH4weDNGOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDNBOyAvKiAwNzIgLSBtb2RlIDcuMiAqLwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ0xFQSwgTE9ORyk6Ci0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLSAgICAgIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IDI7Ci0gICAgICAvKiBBbHJlYWR5IHNldCB0byBtb2RlIDcuMzsgdGhpcyBpbmRpY2F0ZXM6IFBDIGluZGlyZWN0IHdpdGgKLQkgc3VwcHJlc3NlZCBpbmRleCwgMzItYml0IGRpc3BsYWNlbWVudC4gICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4MDE7Ci0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4NzA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRBQiAoUENJTkRFWCwgQllURSk6Ci0gICAgICBkaXNwICs9IDI7Ci0gICAgICBpZiAoIWlzc2J5dGUgKGRpc3ApKQotCXsKLQkgIGFzX2JhZCAoXygiZGlzcGxhY2VtZW50IGRvZXNuJ3QgZml0IGluIG9uZSBieXRlIikpOwotCSAgZGlzcCA9IDA7Ci0JfQotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfZml4ID49IDIpOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTJdICY9IH4xOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTFdID0gZGlzcDsKLSAgICAgIGV4dCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENJTkRFWCwgU0hPUlQpOgotICAgICAgZGlzcCArPSAyOwotICAgICAgYXNzZXJ0IChpc3N3b3JkIChkaXNwKSk7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9maXggPj0gMik7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMl0gfD0gMHgxOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTFdID0gMHgyMDsKLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAoZnJhZ1AtPmZyX29wY29kZVsxXSAmIDA3NykgPT0gMDczLAotCQkgICAgICBOT19SRUxPQyk7Ci0gICAgICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAyOwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ0lOREVYLCBMT05HKToKLSAgICAgIGRpc3AgKz0gMjsKLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAoZnJhZ1AtPmZyX29wY29kZVsxXSAmIDA3NykgPT0gMDczLAotCQkgICAgICBOT19SRUxPQyk7Ci0gICAgICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAyOwotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfZml4ID49IDIpOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTJdIHw9IDB4MTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0xXSA9IDB4MzA7Ci0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChleHQpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXJfYWRkcmVzcywgKGxvbmcpIGRpc3AsIChpbnQpIGV4dCk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IGV4dDsKLSAgICB9Ci19Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlYywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlYzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBtZF9jb252ZXJ0X2ZyYWdfMSAoZnJhZ1ApOwotfQotCi0jZWxzZQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWdUIHNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIG1kX2NvbnZlcnRfZnJhZ18xIChmcmFnUCk7Ci19Ci0jZW5kaWYKLQotLyogRm9yY2UgdHJ1bHkgdW5kZWZpbmVkIHN5bWJvbHMgdG8gdGhlaXIgbWF4aW11bSBzaXplLCBhbmQgZ2VuZXJhbGx5IHNldCB1cAotICAgdGhlIGZyYWcgbGlzdCB0byBiZSByZWxheGVkCi0gICAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBpbnQgb2xkX2ZpeDsKLSAgcmVnaXN0ZXIgY2hhciAqYnVmZmVyX2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWw7Ci0KLSAgb2xkX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0KLSAgLyogaGFuZGxlIFNaX1VOREVGIGZpcnN0LCBpdCBjYW4gYmUgY2hhbmdlZCB0byBCWVRFIG9yIFNIT1JUICovCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotCi0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKGZyYWdQLT5mcl9zeW1ib2wgIT0gTlVMTCkJLyogTm90IGFic29sdXRlICovCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChUQUJUWVBFIChmcmFnUC0+ZnJfc3VidHlwZSksIEJZVEUpOwotCSAgICBicmVhazsKLQkgIH0KLQllbHNlIGlmICgoZnJhZ1AtPmZyX3N5bWJvbCA9PSAwKSB8fCAhSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JICB7Ci0JICAgIC8qIE9uIDY4MDAwLCBvciBmb3IgYWJzb2x1dGUgdmFsdWUsIHN3aXRjaCB0byBhYnMgbG9uZyAqLwotCSAgICAvKiBGSVhNRSwgd2Ugc2hvdWxkIGNoZWNrIGFicyB2YWwsIHBpY2sgc2hvcnQgb3IgbG9uZyAqLwotCSAgICBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYxKQotCSAgICAgIHsKLQkJZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JCWZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhCOTsgLyogSkJTUiB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQkJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsCi0JCQkgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCQlmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JCWZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYwKQotCSAgICAgIHsKLQkJZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JCWZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhGOTsgLyogSk1QICB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQkJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsCi0JCQkgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCQlmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JCWZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYXNfd2FybiAoXygiTG9uZyBicmFuY2ggb2Zmc2V0IHRvIGV4dGVybiBzeW1ib2wgbm90IHN1cHBvcnRlZC4iKSk7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsJCQkvKiBTeW1ib2wgaXMgc3RpbGwgdW5kZWZpbmVkLiAgTWFrZSBpdCBzaW1wbGUgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweGZmOwotCSAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogY2FzZSBUQUIoQUJSQU5DSCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChGQlJBTkNILCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgICAgfHwgZmxhZ19zaG9ydF9yZWZzKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoRkJSQU5DSCwgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmaXhfbmV3IChmcmFnUCwgKGludCkgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDQwOyAvKiBUdXJuIG9uIExPTkcgYml0ICovCi0JICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgfQotCWJyZWFrOwotICAgICAgfQkJCQkvKiBUQUIoRkJSQU5DSCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChQQ1JFTCwgU1pfVU5ERUYpOgotICAgICAgewotCWlmICgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICAgIHx8IGZsYWdfc2hvcnRfcmVmcwotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDUkVMLCBTSE9SVCk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ1JFTCwgTE9ORyk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gNDsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogVEFCKFBDUkVMLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwpCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChCQ0M2ODAwMCwgQllURSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCS8qIG9ubHkgQmNjIDY4MDAwIGluc3RydWN0aW9ucyBjYW4gY29tZSBoZXJlICovCi0JLyogY2hhbmdlIGJjYyBpbnRvIGIhY2Mvam1wIGFic2wgbG9uZyAqLwotCWZyYWdQLT5mcl9vcGNvZGVbMF0gXj0gMHgwMTsJLyogaW52ZXJ0IGJjYyAqLwotCWlmIChmbGFnX3Nob3J0X3JlZnMpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDA0OwkvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLwotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbMiwzXSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1swXSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1sxXSA9IChjaGFyKSAweGY4OwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDA2OwkvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLwotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbMiwzXSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1swXSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1sxXSA9IChjaGFyKSAweGY5OwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgIH0KLQlmcmFnX3dhbmUgKGZyYWdQKTsKLQlicmVhazsKLSAgICAgIH0JCQkJLyogY2FzZSBUQUIoQkNDNjgwMDAsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoREJDQywgU1pfVU5ERUYpOgotICAgICAgewotCWlmIChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwKLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKERCQ0MsIFNIT1JUKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSAyOwotCSAgICBicmVhazsKLQkgIH0KLQkvKiBvbmx5IERCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLQkvKiBjaGFuZ2UgZGJjYyBpbnRvIGRiY2Mvam1wIGFic2wgbG9uZyAqLwotCS8qIEpGOiB0aGVzZSB1c2VkIHRvIGJlIGZyX29wY29kZVsyLTRdLCB3aGljaCBpcyB3cm9uZy4gKi8KLQlidWZmZXJfYWRkcmVzc1swXSA9IDB4MDA7CS8qIGJyYW5jaCBvZmZzZXQgPSA0ICovCi0JYnVmZmVyX2FkZHJlc3NbMV0gPSAweDA0OwotCWJ1ZmZlcl9hZGRyZXNzWzJdID0gMHg2MDsJLyogcHV0IGluIGJyYSBwYyArIC4uLiAqLwotCi0JaWYgKGZsYWdfc2hvcnRfcmVmcykKLQkgIHsKLQkgICAgLyogSkY6IHRoZXNlIHdlcmUgZnJfb3Bjb2RlWzUtN10gKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbM10gPSAweDA0OwkvKiBwbHVzIDQgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNF0gPSAweDRlOwkvKiBQdXQgaW4gSnVtcCBXb3JkICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzVdID0gKGNoYXIpIDB4Zjg7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVs1LTddICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzNdID0gMHgwNjsJLyogUGx1cyA2ICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzRdID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzVdID0gKGNoYXIpIDB4Zjk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgIH0KLQotCWZyYWdfd2FuZSAoZnJhZ1ApOwotCWJyZWFrOwotICAgICAgfQkJCQkvKiBjYXNlIFRBQihEQkNDLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKFBDTEVBLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKCgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkpID09IHNlZ21lbnQKLQkgICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgICB8fCBmbGFnX3Nob3J0X3JlZnMKLQkgICAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID09IG1jZjUyMDApCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0xFQSwgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENMRUEsIExPTkcpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDY7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIFRBQihQQ0xFQSxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChQQ0lOREVYLCBTWl9VTkRFRik6Ci0gICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENJTkRFWCwgQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0lOREVYLCBMT05HKTsKLQkgIGZyYWdQLT5mcl92YXIgKz0gNDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogbm93IHRoYXQgU1pfVU5ERUYgYXJlIHRha2VuIGNhcmUgb2YsIGNoZWNrIG90aGVycyAqLwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIEJZVEUpOgotICAgIGNhc2UgVEFCIChBQlJBTkNILCBCWVRFKToKLSAgICAgIC8qIFdlIGNhbid0IGRvIGEgc2hvcnQganVtcCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgc28gaW4gdGhhdAotCSBjYXNlIHdlIGZvcmNlIHdvcmQgbW9kZS4gIEF0IHRoaXMgcG9pbnQgU19HRVRfVkFMVUUgc2hvdWxkCi0JIHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wgd2l0aGluIGl0cyBmcmFnLiAgSWYgdGhlCi0JIHN5bWJvbCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBmcmFnLCBhbmQgaXQgaXMgdGhlIG5leHQgZnJhZwotCSB3aXRoIGFueSBkYXRhIGluIGl0ICh1c3VhbGx5IHRoaXMgaXMganVzdCB0aGUgbmV4dCBmcmFnLCBidXQKLQkgYXNzZW1ibGVyIGxpc3RpbmdzIG1heSBpbnRyb2R1Y2UgZW1wdHkgZnJhZ3MpLCB3ZSBtdXN0IHVzZQotCSB3b3JkIG1vZGUuICAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wgJiYgU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpID09IDApCi0JewotCSAgZnJhZ1MgKnN0b3A7Ci0JICBmcmFnUyAqbDsKLQotCSAgc3RvcCA9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0JICBmb3IgKGwgPSBmcmFnUC0+ZnJfbmV4dDsgbCAhPSBzdG9wOyBsID0gbC0+ZnJfbmV4dCkKLQkgICAgaWYgKGwtPmZyX2ZpeCArIGwtPmZyX3ZhciAhPSAwKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGwgPT0gc3RvcCkKLQkgICAgewotCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChUQUJUWVBFIChmcmFnUC0+ZnJfc3VidHlwZSksIFNIT1JUKTsKLQkgICAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZml4OwotfQotCi0jaWYgZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKQotLyogdGhlIGJpdC1maWVsZCBlbnRyaWVzIGluIHRoZSByZWxvY2F0aW9uX2luZm8gc3RydWN0IHBsYXlzIGhlbGwKLSAgIHdpdGggdGhlIGJ5dGUtb3JkZXIgcHJvYmxlbXMgb2YgY3Jvc3MtYXNzZW1ibHkuICBTbyBhcyBhIGhhY2ssCi0gICBJIGFkZGVkIHRoaXMgbWFjaC4gZGVwZW5kZW50IHJpIHR3aWRkbGVyLiAgVWdseSwgYnV0IGl0IGdldHMKLSAgIHlvdSB0aGVyZS4gLUtXSyAqLwotLyogb24gbTY4azogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGxvbmcsIG5leHQgdGhyZWUgYnl0ZXMKLSAgIGFyZSBzeW1ib2xudW0sIG1vc3Qgc2lnLiBieXRlIGZpcnN0LiAgTGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoCi0gICBiaXQgNyBhcyBwY3JlbCwgYml0cyA2ICYgNSBhcyBsZW5ndGgsIGJpdCA0IGFzIHBjcmVsLCBhbmQgdGhlIGxvd2VyCi0gICBuaWJibGUgYXMgbnV0aGluLiAob24gU3VuIDMgYXQgbGVhc3QpICovCi0vKiBUcmFuc2xhdGUgdGhlIGludGVybmFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW50byB0YXJnZXQtc3BlY2lmaWMKLSAgIGZvcm1hdC4gKi8KLSNpZmRlZiBjb21tZW50Ci12b2lkCi1tZF9yaV90b19jaGFycyAodGhlX2J5dGVzLCByaSkKLSAgICAgY2hhciAqdGhlX2J5dGVzOwotICAgICBzdHJ1Y3QgcmVsb2NfaW5mb19nZW5lcmljICpyaTsKLXsKLSAgLyogdGhpcyBpcyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAodGhlX2J5dGVzLCByaS0+cl9hZGRyZXNzLCA0KTsKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgdGhlX2J5dGVzWzRdID0gKHJpLT5yX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzVdID0gKHJpLT5yX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNl0gPSByaS0+cl9zeW1ib2xudW0gJiAweDBmZjsKLSAgdGhlX2J5dGVzWzddID0gKCgocmktPnJfcGNyZWwgPDwgNykgJiAweDgwKSB8ICgocmktPnJfbGVuZ3RoIDw8IDUpICYgMHg2MCkgfAotCQkgICgocmktPnJfZXh0ZXJuIDw8IDQpICYgMHgxMCkpOwotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgLyoKLSAgICogSW46IGxlbmd0aCBvZiByZWxvY2F0aW9uIChvciBvZiBhZGRyZXNzKSBpbiBjaGFyczogMSwgMiBvciA0LgotICAgKiBPdXQ6IEdOVSBMRCByZWxvY2F0aW9uIGxlbmd0aCBjb2RlOiAwLCAxLCBvciAyLgotICAgKi8KLQotICBzdGF0aWMgQ09OU1QgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs0XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDcpICYgMHg4MCkgfCAoKG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXSA8PCA1KSAmIDB4NjApIHwKLQkgICAgICAoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDQpICYgMHgxMCkpOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLUNPTlNUIGludCBtZF9zaG9ydF9qdW1wX3NpemUgPSA0OwotQ09OU1QgaW50IG1kX2xvbmdfanVtcF9zaXplID0gNjsKLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzeW1ib2xTICp0b19zeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDIpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweDYwMDAsIDIpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDIsICh2YWx1ZVQpIG9mZnNldCwgMik7Ci19Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIGlmICghSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0gICAgewotICAgICAgb2Zmc2V0ID0gdG9fYWRkciAtIFNfR0VUX1ZBTFVFICh0b19zeW1ib2wpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4NEVGOSwgMik7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDIsICh2YWx1ZVQpIG9mZnNldCwgNCk7Ci0gICAgICBmaXhfbmV3IChmcmFnLCAocHRyICsgMikgLSBmcmFnLT5mcl9saXRlcmFsLCA0LCB0b19zeW1ib2wsIChvZmZzZXRUKSAwLAotCSAgICAgICAwLCBOT19SRUxPQyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAyKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweDYwZmYsIDIpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIERpZmZlcmVudCB2YWx1ZXMgb2YgT0sgdGVsbCB3aGF0IGl0cyBPSyB0byByZXR1cm4uICBUaGluZ3MgdGhhdAotICAgYXJlbid0IE9LIGFyZSBhbiBlcnJvciAod2hhdCBhIHNob2NrLCBubz8pCi0KLSAgIDA6ICBFdmVyeXRoaW5nIGlzIE9LCi0gICAxMDogIEFic29sdXRlIDE6OAlvbmx5Ci0gICAyMDogIEFic29sdXRlIDA6Nwlvbmx5Ci0gICAzMDogIGFic29sdXRlIDA6MTUJb25seQotICAgNDA6ICBBYnNvbHV0ZSAwOjMxCW9ubHkKLSAgIDUwOiAgYWJzb2x1dGUgMDoxMjcJb25seQotICAgNTU6ICBhYnNvbHV0ZSAtNjQ6NjMgICAgb25seQotICAgNjA6ICBhYnNvbHV0ZSAtMTI4OjEyNwlvbmx5Ci0gICA3MDogIGFic29sdXRlIDA6NDA5NQlvbmx5Ci0gICA4MDogIE5vIGJpZ251bXMKLQotICAgKi8KLQotc3RhdGljIGludAotZ2V0X251bSAoZXhwLCBvaykKLSAgICAgc3RydWN0IG02OGtfZXhwICpleHA7Ci0gICAgIGludCBvazsKLXsKLSAgaWYgKGV4cC0+ZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgewotICAgICAgLyogRG8gdGhlIHNhbWUgdGhpbmcgdGhlIFZBWCBhc20gZG9lcyAqLwotICAgICAgb3AgKGV4cCkgPSBPX2NvbnN0YW50OwotICAgICAgYWRkcyAoZXhwKSA9IDA7Ci0gICAgICBzdWJzIChleHApID0gMDsKLSAgICAgIG9mZnMgKGV4cCkgPSAwOwotICAgICAgaWYgKG9rID09IDEwKQotCXsKLQkgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDEiKSk7Ci0JICBvZmZzIChleHApID0gMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChleHAtPmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgc3dpdGNoIChvaykKLQl7Ci0JY2FzZSAxMDoKLQkgIGlmIChvZmZzIChleHApIDwgMSB8fCBvZmZzIChleHApID4gOCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDEiKSk7Ci0JICAgICAgb2ZmcyAoZXhwKSA9IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMjA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDcpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDMwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiAxNSkKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNDA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDMyKQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSA1MDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gMTI3KQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSA1NToKLQkgIGlmIChvZmZzIChleHApIDwgLTY0IHx8IG9mZnMgKGV4cCkgPiA2MykKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNjA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IC0xMjggfHwgb2ZmcyAoZXhwKSA+IDEyNykKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNzA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDQwOTUpCi0JICAgIHsKLQkgICAgb3V0cmFuZ2U6Ci0JICAgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMCIpKTsKLQkgICAgICBvZmZzIChleHApID0gMDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGV4cC0+ZXhwLlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgaWYgKG9mZnMgKGV4cCkgPD0gMAkvKiBmbG9udW0gKi8KLQkgICYmIChvayA9PSA4MAkJLyogbm8gYmlnbnVtcyAqLwotCSAgICAgIHx8IChvayA+IDEwCS8qIHNtYWxsLWludCByYW5nZXMgaW5jbHVkaW5nIDAgb2sgKi8KLQkJICAvKiBJZiB3ZSBoYXZlIGEgZmxvbnVtIHplcm8sIGEgemVybyBpbnRlZ2VyIHNob3VsZAotCQkgICAgIGRvIGFzIHdlbGwgKGUuZy4sIGluIG1vdmVxKS4gICovCi0JCSAgJiYgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuZXhwb25lbnQgPT0gMAotCQkgICYmIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvd1swXSA9PSAwKSkpCi0JewotCSAgLyogSEFDSyEgVHVybiBpdCBpbnRvIGEgbG9uZyAqLwotCSAgTElUVExFTlVNX1RZUEUgd29yZHNbNl07Ci0KLQkgIGdlbl90b193b3JkcyAod29yZHMsIDIsIDhMKTsJLyogVGhlc2UgbnVtYmVycyBhcmUgbWFnaWMhICovCi0JICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7Ci0JICBhZGRzIChleHApID0gMDsKLQkgIHN1YnMgKGV4cCkgPSAwOwotCSAgb2ZmcyAoZXhwKSA9IHdvcmRzWzFdIHwgKHdvcmRzWzBdIDw8IDE2KTsKLQl9Ci0gICAgICBlbHNlIGlmIChvayAhPSAwKQotCXsKLQkgIG9wIChleHApID0gT19jb25zdGFudDsKLQkgIGFkZHMgKGV4cCkgPSAwOwotCSAgc3VicyAoZXhwKSA9IDA7Ci0JICBvZmZzIChleHApID0gKG9rID09IDEwKSA/IDEgOiAwOwotCSAgYXNfd2FybiAoXygiQ2FuJ3QgZGVhbCB3aXRoIGV4cHJlc3Npb247IGRlZmF1bHRpbmcgdG8gJWxkIiksCi0JCSAgIG9mZnMgKGV4cCkpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob2sgPj0gMTAgJiYgb2sgPD0gNzApCi0JewotCSAgb3AgKGV4cCkgPSBPX2NvbnN0YW50OwotCSAgYWRkcyAoZXhwKSA9IDA7Ci0JICBzdWJzIChleHApID0gMDsKLQkgIG9mZnMgKGV4cCkgPSAob2sgPT0gMTApID8gMSA6IDA7Ci0JICBhc193YXJuIChfKCJDYW4ndCBkZWFsIHdpdGggZXhwcmVzc2lvbjsgZGVmYXVsdGluZyB0byAlbGQiKSwKLQkJICAgb2ZmcyAoZXhwKSk7Ci0JfQotICAgIH0KLQotICBpZiAoZXhwLT5zaXplICE9IFNJWkVfVU5TUEVDKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZXhwLT5zaXplKQotCXsKLQljYXNlIFNJWkVfVU5TUEVDOgotCWNhc2UgU0laRV9MT05HOgotCSAgYnJlYWs7Ci0JY2FzZSBTSVpFX0JZVEU6Ci0JICBpZiAoIWlzYnl0ZSAob2ZmcyAoZXhwKSkpCi0JICAgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gZG9lc24ndCBmaXQgaW4gQllURSIpKTsKLQkgIGJyZWFrOwotCWNhc2UgU0laRV9XT1JEOgotCSAgaWYgKCFpc3dvcmQgKG9mZnMgKGV4cCkpKQotCSAgICBhc193YXJuIChfKCJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIFdPUkQiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBvZmZzIChleHApOwotfQotCi0vKiBUaGVzZSBhcmUgdGhlIGJhY2stZW5kcyBmb3IgdGhlIHZhcmlvdXMgbWFjaGluZSBkZXBlbmRlbnQgcHNldWRvLW9wcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2RhdGExIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAxKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDIpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBXZSBkb24ndCBzdXBwb3J0IHB1dHRpbmcgZnJhZ3MgaW4gdGhlIEJTUyBzZWdtZW50LCB3ZSBmYWtlIGl0Ci0gICAgIGJ5IG1hcmtpbmcgaW5fYnNzLCB0aGVuIGxvb2tpbmcgYXQgc19za2lwIGZvciBjbHVlcy4gICovCi0KLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19ldmVuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIGxvbmcgdGVtcF9maWxsOwotCi0gIHRlbXAgPSAxOwkJCS8qIEpGIHNob3VsZCBiZSAyPyAqLwotICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKCFuZWVkX3Bhc3NfMikJCS8qIE5ldmVyIG1ha2UgZnJhZyBpZiBleHBlY3QgZXh0cmEgcGFzcy4gKi8KLSAgICBmcmFnX2FsaWduICh0ZW1wLCAoaW50KSB0ZW1wX2ZpbGwsIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCB0ZW1wKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfcHJvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQc2V1ZG8tb3BzIGhhbmRsZWQgZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBhcmd1bWVudCBpcyBhIGNvbmRpdGlvbmFsCi0gICBwc2V1ZG8tb3AuICBUaGlzIGlzIGNhbGxlZCB3aGVuIGNoZWNraW5nIHdoZXRoZXIgYSBwZW5kaW5nCi0gICBhbGlnbm1lbnQgaXMgbmVlZGVkLiAgKi8KLQotaW50Ci1tNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCi0gICAgIHBzZXVkb190eXBlUyAqcG9wOwotewotICByZXR1cm4gKHBvcC0+cG9jX2hhbmRsZXIgPT0gc19tcmlfaWYKLQkgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19tcmlfZWxzZSk7Ci19Ci0KLS8qIEhhbmRsZSBhbiBNUkkgc3R5bGUgY2hpcCBzcGVjaWZpY2F0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW1yaV9jaGlwICgpCi17Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgYzsKLSAgaW50IGk7Ci0KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgLyogV2UgY2FuJ3QgdXNlIGdldF9zeW1ib2xfZW5kIHNpbmNlIHRoZSBwcm9jZXNzb3IgbmFtZXMgYXJlIG5vdCBwcm9wZXIKLSAgICAgc3ltYm9scy4gICovCi0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspKQotICAgIDsKLSAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKLSAgICBpZiAoc3RyY2FzZWNtcCAocywgYXJjaHNbaV0ubmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotICBpZiAoaSA+PSBuX2FyY2hzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiJXM6IHVucmVjb2duaXplZCBwcm9jZXNzb3IgbmFtZSIpLCBzKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcvJykKLSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IDA7Ci0gIGVsc2UKLSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSAmPSBtNjg4ODEgfCBtNjg4NTE7Ci0gIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2hzW2ldLmFyY2g7Ci0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy8nKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIC8qIFdlIGNhbid0IHVzZSBnZXRfc3ltYm9sX2VuZCBzaW5jZSB0aGUgcHJvY2Vzc29yIG5hbWVzIGFyZSBub3QKLQkgcHJvcGVyIHN5bWJvbHMuICAqLwotICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykpCi0JOwotICAgICAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgICAgIGlmIChzdHJjbXAgKHMsICI2ODg4MSIpID09IDApCi0JY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiNjg4NTEiKSA9PSAwKQotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotICAvKiBVcGRhdGUgaW5mbyBhYm91dCBhdmFpbGFibGUgY29udHJvbCByZWdpc3RlcnMuICAqLwotICBzZWxlY3RfY29udHJvbF9yZWdzICgpOwotfQotCi0vKiBUaGUgTVJJIENISVAgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfY2hpcCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0gIG1yaV9jaGlwICgpOwotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSBNUkkgRk9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19mb3B0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiSUQ9IiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgdGVtcDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAodGVtcCA8IDAgfHwgdGVtcCA+IDcpCi0JYXNfYmFkIChfKCJiYWQgY29wcm9jZXNzb3IgaWQiKSk7Ci0gICAgICBlbHNlCi0JbTY4a19mbG9hdF9jb3BudW0gPSBDT1AwICsgdGVtcDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVucmVjb2duaXplZCBmb3B0IG9wdGlvbiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBoYW5kbGUgdGhlIE1SSSBPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RydWN0IG9wdF9hY3Rpb24KLXsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIG9wdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBub3QgTlVMTCwganVzdCBjYWxsIHRoaXMgZnVuY3Rpb24uICBUaGUgZmlyc3QgYXJndW1lbnQKLSAgICAgaXMgdGhlIEFSRyBmaWVsZCBvZiB0aGlzIHN0cnVjdHVyZSwgdGhlIHNlY29uZCBhcmd1bWVudCBpcwotICAgICB3aGV0aGVyIHRoZSBvcHRpb24gd2FzIG5lZ2F0ZWQuICAqLwotICB2b2lkICgqcGZuKSBQQVJBTVMgKChpbnQgYXJnLCBpbnQgb24pKTsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBOVUxMLCBhbmQgdGhlIFBGTiBmaWVsZCBpcyBOVUxMLCBzZXQgdGhlIHZhcmlhYmxlCi0gICAgIHRoaXMgcG9pbnRzIHRvLiAgU2V0IGl0IHRvIHRoZSBBUkcgZmllbGQgaWYgdGhlIG9wdGlvbiB3YXMgbm90Ci0gICAgIG5lZ2F0ZWQsIGFuZCB0aGUgTk9UQVJHIGZpZWxkIG90aGVyd2lzZS4gICovCi0gIGludCAqcHZhcjsKLQotICAvKiBUaGUgdmFsdWUgdG8gcGFzcyB0byBQRk4gb3IgdG8gYXNzaWduIHRvICpQVkFSLiAgKi8KLSAgaW50IGFyZzsKLQotICAvKiBUaGUgdmFsdWUgdG8gYXNzaWduIHRvICpQVkFSIGlmIHRoZSBvcHRpb24gaXMgbmVnYXRlZC4gIElmIFBGTiBpcwotICAgICBOVUxMLCBhbmQgUFZBUiBpcyBub3QgTlVMTCwgYW5kIEFSRyBhbmQgTk9UQVJHIGFyZSB0aGUgc2FtZSwgdGhlbgotICAgICB0aGUgb3B0aW9uIG1heSBub3QgYmUgbmVnYXRlZC4gICovCi0gIGludCBub3Rhcmc7Ci19OwotCi0vKiBUaGUgdGFibGUgdXNlZCB0byBoYW5kbGUgdGhlIE1SSSBPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQgc2tpcF90b19jb21tYSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3B0X25lc3QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9wdF9jaGlwIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfbGlzdCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3B0X2xpc3Rfc3ltYm9scyBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdF9hY3Rpb24gb3B0X3RhYmxlW10gPQotewotICB7ICJhYnNwY2FkZCIsIDAsICZtNjhrX2Fic3BjYWRkLCAxLCAwIH0sCi0KLSAgLyogV2UgZG8gcmVsYXhpbmcsIHNvIHRoZXJlIGlzIGxpdHRsZSB1c2UgZm9yIHRoZXNlIG9wdGlvbnMuICAqLwotICB7ICJiIiwgMCwgMCwgMCwgMCB9LAotICB7ICJicnMiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJyYiIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiYnJsIiwgMCwgMCwgMCwgMCB9LAotICB7ICJicnciLCAwLCAwLCAwLCAwIH0sCi0KLSAgeyAiYyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiY2V4IiwgMCwgMCwgMCwgMCB9LAotICB7ICJjYXNlIiwgMCwgJnN5bWJvbHNfY2FzZV9zZW5zaXRpdmUsIDEsIDAgfSwKLSAgeyAiY2wiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImNyZSIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiZCIsIDAsICZmbGFnX2tlZXBfbG9jYWxzLCAxLCAwIH0sCi0gIHsgImUiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImYiLCAwLCAmZmxhZ19zaG9ydF9yZWZzLCAxLCAwIH0sCi0gIHsgImZycyIsIDAsICZmbGFnX3Nob3J0X3JlZnMsIDEsIDAgfSwKLSAgeyAiZnJsIiwgMCwgJmZsYWdfc2hvcnRfcmVmcywgMCwgMSB9LAotICB7ICJnIiwgMCwgMCwgMCwgMCB9LAotICB7ICJpIiwgMCwgMCwgMCwgMCB9LAotICB7ICJtIiwgMCwgMCwgMCwgMCB9LAotICB7ICJtZXgiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm1jIiwgMCwgMCwgMCwgMCB9LAotICB7ICJtZCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAibmVzdCIsIG9wdF9uZXN0LCAwLCAwLCAwIH0sCi0gIHsgIm5leHQiLCBza2lwX3RvX2NvbW1hLCAwLCAwLCAwIH0sCi0gIHsgIm8iLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm9sZCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAib3AiLCBza2lwX3RvX2NvbW1hLCAwLCAwLCAwIH0sCi0gIHsgInBjbyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAicCIsIG9wdF9jaGlwLCAwLCAwLCAwIH0sCi0gIHsgInBjciIsIDAsIDAsIDAsIDAgfSwKLSAgeyAicGNzIiwgMCwgMCwgMCwgMCB9LAotICB7ICJyIiwgMCwgMCwgMCwgMCB9LAotICB7ICJxdWljayIsIDAsICZtNjhrX3F1aWNrLCAxLCAwIH0sCi0gIHsgInJlbDMyIiwgMCwgJm02OGtfcmVsMzIsIDEsIDAgfSwKLSAgeyAicyIsIG9wdF9saXN0LCAwLCAwLCAwIH0sCi0gIHsgInQiLCBvcHRfbGlzdF9zeW1ib2xzLCAwLCAwLCAwIH0sCi0gIHsgInciLCAwLCAmZmxhZ19ub193YXJuaW5ncywgMCwgMSB9LAotICB7ICJ4IiwgMCwgMCwgMCwgMCB9Ci19OwotCi0jZGVmaW5lIE9QVENPVU5UIChzaXplb2Ygb3B0X3RhYmxlIC8gc2l6ZW9mIG9wdF90YWJsZVswXSkKLQotLyogVGhlIE1SSSBPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfb3B0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZG8KLSAgICB7Ci0gICAgICBpbnQgdDsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyIGM7Ci0gICAgICBpbnQgaTsKLSAgICAgIGNvbnN0IHN0cnVjdCBvcHRfYWN0aW9uICpvOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIHQgPSAxOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgdCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIk5PIiwgMikgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIHQgPSAwOwotCX0KLQotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgZm9yIChpID0gMCwgbyA9IG9wdF90YWJsZTsgaSA8IE9QVENPVU5UOyBpKyssIG8rKykKLQl7Ci0JICBpZiAoc3RyY2FzZWNtcCAocywgby0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChvLT5wZm4pCi0JCXsKLQkJICAvKiBSZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlciBub3cgaW4gY2FzZSB0aGUgb3B0aW9uCi0JCSAgICAgdGFrZXMgYXJndW1lbnRzLiAgKi8KLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAoKm8tPnBmbikgKG8tPmFyZywgdCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvLT5wdmFyICE9IE5VTEwpCi0JCXsKLQkJICBpZiAoISB0ICYmIG8tPmFyZyA9PSBvLT5ub3RhcmcpCi0JCSAgICBhc19iYWQgKF8oIm9wdGlvbiBgJXMnIG1heSBub3QgYmUgbmVnYXRlZCIpLCBzKTsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAqby0+cHZhciA9IHQgPyBvLT5hcmcgOiBvLT5ub3Rhcmc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCSppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGkgPj0gT1BUQ09VTlQpCi0JewotCSAgYXNfYmFkIChfKCJvcHRpb24gYCVzJyBub3QgcmVjb2duaXplZCIpLCBzKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAvKiBNb3ZlIGJhY2sgdG8gdGVybWluYXRpbmcgY2hhcmFjdGVyLiAgKi8KLSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFNraXAgYWhlYWQgdG8gYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgT1BUIG9wdGlvbnMgd2hpY2ggd2UgZG8KLSAgIG5vdCBzdXBwb3IgdGFuZCB3aGljaCB0YWtlIGFyZ3VtZW50cy4gICovCi0KLXN0YXRpYyB2b2lkCi1za2lwX3RvX2NvbW1hIChhcmcsIG9uKQotICAgICBpbnQgYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvbiBBVFRSSUJVVEVfVU5VU0VEOwotewotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcKLQkgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIE5FU1Q9ZGVwdGggb3B0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wdF9uZXN0IChhcmcsIG9uKQotICAgICBpbnQgYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvbiBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPScpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgZm9ybWF0IG9mIE9QVCBORVNUPWRlcHRoIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgbWF4X21hY3JvX25lc3QgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBPUFQgUD1jaGlwIG9wdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vcHRfY2hpcCAoYXJnLCBvbikKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb24gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMganVzdCBPUFQgUCwgd2hpY2ggd2UgZG8gbm90IHN1cHBvcnQuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgbXJpX2NoaXAgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIFMgb3B0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wdF9saXN0IChhcmcsIG9uKQotICAgICBpbnQgYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvbjsKLXsKLSAgbGlzdGluZ19saXN0IChvbik7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIFQgb3B0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wdF9saXN0X3N5bWJvbHMgKGFyZywgb24pCi0gICAgIGludCBhcmcgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9uOwotewotICBpZiAob24pCi0gICAgbGlzdGluZyB8PSBMSVNUSU5HX1NZTUJPTFM7Ci0gIGVsc2UKLSAgICBsaXN0aW5nICY9fiBMSVNUSU5HX1NZTUJPTFM7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIFJFRyBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19yZWcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpzOwotICBpbnQgYzsKLSAgc3RydWN0IG02OGtfb3Agcm9wOwotICBpbnQgbWFzazsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGxpbmVfbGFiZWwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgbGFiZWwiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gUkVHSVNURVJfUFJFRklYCi0jZW5kaWYKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLycKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotICBpZiAobTY4a19pcF9vcCAocywgJnJvcCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAocm9wLmVycm9yID09IE5VTEwpCi0JYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImJhZCByZWdpc3RlciBsaXN0OiAlcyIpLCByb3AuZXJyb3IpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAocm9wLm1vZGUgPT0gUkVHTFNUKQotICAgIG1hc2sgPSByb3AubWFzazsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gRFJFRykKLSAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIERBVEEwKTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQVJFRykKLSAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIEFERFIwICsgOCk7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IEZQUkVHKQotICAgIG1hc2sgPSAxIDw8IChyb3AucmVnIC0gRlAwICsgMTYpOwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBDT05UUk9MCi0JICAgJiYgcm9wLnJlZyA9PSBGUEkpCi0gICAgbWFzayA9IDEgPDwgMjQ7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IENPTlRST0wKLQkgICAmJiByb3AucmVnID09IEZQUykKLSAgICBtYXNrID0gMSA8PCAyNTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQ09OVFJPTAotCSAgICYmIHJvcC5yZWcgPT0gRlBDKQotICAgIG1hc2sgPSAxIDw8IDI2OwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHJlZ19zZWN0aW9uKTsKLSAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIH5tYXNrKTsKLSAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgTVJJIFNBVkUgYW5kIFJFU1RPUkUgcHNldWRvLW9wcy4gICovCi0KLXN0cnVjdCBzYXZlX29wdHMKLXsKLSAgc3RydWN0IHNhdmVfb3B0cyAqbmV4dDsKLSAgaW50IGFic3BjYWRkOwotICBpbnQgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLSAgaW50IGtlZXBfbG9jYWxzOwotICBpbnQgc2hvcnRfcmVmczsKLSAgaW50IGFyY2hpdGVjdHVyZTsKLSAgaW50IHF1aWNrOwotICBpbnQgcmVsMzI7Ci0gIGludCBsaXN0aW5nOwotICBpbnQgbm9fd2FybmluZ3M7Ci0gIC8qIEZJWE1FOiBXZSBkb24ndCBzYXZlIE9QVCBTLiAgKi8KLX07Ci0KLS8qIFRoaXMgdmFyaWFibGUgaG9sZHMgdGhlIHN0YWNrIG9mIHNhdmVkIG9wdGlvbnMuICAqLwotCi1zdGF0aWMgc3RydWN0IHNhdmVfb3B0cyAqc2F2ZV9zdGFjazsKLQotLyogVGhlIE1SSSBTQVZFIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3NhdmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3Qgc2F2ZV9vcHRzICpzOwotCi0gIHMgPSAoc3RydWN0IHNhdmVfb3B0cyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzYXZlX29wdHMpKTsKLSAgcy0+YWJzcGNhZGQgPSBtNjhrX2Fic3BjYWRkOwotICBzLT5zeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlID0gc3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLSAgcy0+a2VlcF9sb2NhbHMgPSBmbGFnX2tlZXBfbG9jYWxzOwotICBzLT5zaG9ydF9yZWZzID0gZmxhZ19zaG9ydF9yZWZzOwotICBzLT5hcmNoaXRlY3R1cmUgPSBjdXJyZW50X2FyY2hpdGVjdHVyZTsKLSAgcy0+cXVpY2sgPSBtNjhrX3F1aWNrOwotICBzLT5yZWwzMiA9IG02OGtfcmVsMzI7Ci0gIHMtPmxpc3RpbmcgPSBsaXN0aW5nOwotICBzLT5ub193YXJuaW5ncyA9IGZsYWdfbm9fd2FybmluZ3M7Ci0KLSAgcy0+bmV4dCA9IHNhdmVfc3RhY2s7Ci0gIHNhdmVfc3RhY2sgPSBzOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSBNUkkgUkVTVE9SRSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19yZXN0b3JlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHNhdmVfb3B0cyAqczsKLQotICBpZiAoc2F2ZV9zdGFjayA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygicmVzdG9yZSB3aXRob3V0IHNhdmUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzID0gc2F2ZV9zdGFjazsKLSAgc2F2ZV9zdGFjayA9IHMtPm5leHQ7Ci0KLSAgbTY4a19hYnNwY2FkZCA9IHMtPmFic3BjYWRkOwotICBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlID0gcy0+c3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLSAgZmxhZ19rZWVwX2xvY2FscyA9IHMtPmtlZXBfbG9jYWxzOwotICBmbGFnX3Nob3J0X3JlZnMgPSBzLT5zaG9ydF9yZWZzOwotICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IHMtPmFyY2hpdGVjdHVyZTsKLSAgbTY4a19xdWljayA9IHMtPnF1aWNrOwotICBtNjhrX3JlbDMyID0gcy0+cmVsMzI7Ci0gIGxpc3RpbmcgPSBzLT5saXN0aW5nOwotICBmbGFnX25vX3dhcm5pbmdzID0gcy0+bm9fd2FybmluZ3M7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVHlwZXMgb2YgTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmVzLiAgKi8KLQotZW51bSBtcmlfY29udHJvbF90eXBlCi17Ci0gIG1yaV9mb3IsCi0gIG1yaV9pZiwKLSAgbXJpX3JlcGVhdCwKLSAgbXJpX3doaWxlCi19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0YWNrIHRoZSBNUkkgc3RydWN0dXJlZCBjb250cm9sCi0gICBkaXJlY3RpdmVzLiAgKi8KLQotc3RydWN0IG1yaV9jb250cm9sX2luZm8KLXsKLSAgLyogVGhlIGRpcmVjdGl2ZSB3aXRoaW4gd2hpY2ggdGhpcyBvbmUgaXMgZW5jbG9zZWQuICAqLwotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqb3V0ZXI7Ci0KLSAgLyogVGhlIHR5cGUgb2YgZGlyZWN0aXZlLiAgKi8KLSAgZW51bSBtcmlfY29udHJvbF90eXBlIHR5cGU7Ci0KLSAgLyogV2hldGhlciBhbiBFTFNFIGhhcyBiZWVuIGluIGFuIElGLiAgKi8KLSAgaW50IGVsc2Vfc2VlbjsKLQotICAvKiBUaGUgYWRkIG9yIHN1YiBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiBhIEZPUi4gICovCi0gIGNoYXIgKmluY3I7Ci0KLSAgLyogVGhlIGxhYmVsIG9mIHRoZSB0b3Agb2YgYSBGT1Igb3IgUkVQRUFUIGxvb3AuICAqLwotICBjaGFyICp0b3A7Ci0KLSAgLyogVGhlIGxhYmVsIHRvIGp1bXAgdG8gZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiwgb3IgdGhlIGVsc2UKLSAgICAgZXhwcmVzc2lvbiBvZiBhIGNvbmRpdGlvbmFsLiAgKi8KLSAgY2hhciAqbmV4dDsKLQotICAvKiBUaGUgbGFiZWwgdG8ganVtcCB0byB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG9yIHRoZSBsYWJlbCBwYXN0Ci0gICAgIHRoZSBlbmQgb2YgYSBjb25kaXRpb25hbC4gICovCi0gIGNoYXIgKmJvdHRvbTsKLX07Ci0KLS8qIFRoZSBzdGFjayBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm1yaV9jb250cm9sX3N0YWNrOwotCi0vKiBUaGUgY3VycmVudCBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSBpbmRleCBudW1iZXIsIHVzZWQgdG8KLSAgIGdlbmVyYXRlIGxhYmVsIG5hbWVzLiAgKi8KLQotc3RhdGljIGludCBtcmlfY29udHJvbF9pbmRleDsKLQotLyogU29tZSBmdW5jdGlvbiBwcm90b3R5cGVzLiAgKi8KLQotc3RhdGljIHZvaWQgbXJpX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGNoYXIgKm1yaV9jb250cm9sX2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqcHVzaF9tcmlfY29udHJvbAotICBQQVJBTVMgKChlbnVtIG1yaV9jb250cm9sX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHBvcF9tcmlfY29udHJvbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHBhcnNlX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZAotICBQQVJBTVMgKChpbnQgKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKikpOwotc3RhdGljIGludCBzd2FwX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IHJldmVyc2VfbXJpX2NvbmRpdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQKLSAgUEFSQU1TICgoaW50LCBpbnQsIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLS8qIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uIGZvciBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotCi0gIC8qIG1kX2Fzc2VtYmxlIGV4cGVjdHMgdGhlIG9wY29kZSB0byBiZSBpbiBsb3dlciBjYXNlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnICcgJiYgKnMgIT0gJ1wwJzsgcysrKQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMpKQotCSpzID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKLSAgICB9Ci0KLSAgbWRfYXNzZW1ibGUgKHN0cik7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgbmV3IE1SSSBsYWJlbCBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIGxhYmVsIG5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1tcmlfY29udHJvbF9sYWJlbCAoKQotewotICBjaGFyICpuOwotCi0gIG4gPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIHNwcmludGYgKG4sICIlc21jJWQiLCBGQUtFX0xBQkVMX05BTUUsIG1yaV9jb250cm9sX2luZGV4KTsKLSAgKyttcmlfY29udHJvbF9pbmRleDsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqCi1wdXNoX21yaV9jb250cm9sICh0eXBlKQotICAgICBlbnVtIG1yaV9jb250cm9sX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgbiA9IChzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvKSk7Ci0KLSAgbi0+dHlwZSA9IHR5cGU7Ci0gIG4tPmVsc2Vfc2VlbiA9IDA7Ci0gIGlmICh0eXBlID09IG1yaV9pZiB8fCB0eXBlID09IG1yaV93aGlsZSkKLSAgICBuLT50b3AgPSBOVUxMOwotICBlbHNlCi0gICAgbi0+dG9wID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0gIG4tPm5leHQgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLSAgbi0+Ym90dG9tID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0KLSAgbi0+b3V0ZXIgPSBtcmlfY29udHJvbF9zdGFjazsKLSAgbXJpX2NvbnRyb2xfc3RhY2sgPSBuOwotCi0gIHJldHVybiBuOwotfQotCi0vKiBQb3Agb2ZmIHRoZSBzdGFjayBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcG9wX21yaV9jb250cm9sICgpCi17Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotCi0gIG4gPSBtcmlfY29udHJvbF9zdGFjazsKLSAgbXJpX2NvbnRyb2xfc3RhY2sgPSBuLT5vdXRlcjsKLSAgaWYgKG4tPnRvcCAhPSBOVUxMKQotICAgIGZyZWUgKG4tPnRvcCk7Ci0gIGZyZWUgKG4tPm5leHQpOwotICBmcmVlIChuLT5ib3R0b20pOwotICBmcmVlIChuKTsKLX0KLQotLyogUmVjb2duaXplIGEgY29uZGl0aW9uIGNvZGUgaW4gYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIGludAotcGFyc2VfbXJpX2NvbmRpdGlvbiAocGNjKQotICAgICBpbnQgKnBjYzsKLXsKLSAgY2hhciBjMSwgYzI7Ci0KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPCcpOwotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBjMSA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgYzIgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz4nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoaXN1cHBlciAoYzEpKQotICAgIGMxID0gdG9sb3dlciAoYzEpOwotICBpZiAoaXN1cHBlciAoYzIpKQotICAgIGMyID0gdG9sb3dlciAoYzIpOwotCi0gICpwY2MgPSAoYzEgPDwgOCkgfCBjMjsKLQotICByZXR1cm4gMTsKLX0KLQotLyogUGFyc2UgYSBzaW5nbGUgb3BlcmFuZCBpbiBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kIChwY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsIHJpZ2h0c3RvcCkKLSAgICAgaW50ICpwY2M7Ci0gICAgIGNoYXIgKipsZWZ0c3RhcnQ7Ci0gICAgIGNoYXIgKipsZWZ0c3RvcDsKLSAgICAgY2hhciAqKnJpZ2h0c3RhcnQ7Ci0gICAgIGNoYXIgKipyaWdodHN0b3A7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICpwY2MgPSAtMTsKLSAgKmxlZnRzdGFydCA9IE5VTEw7Ci0gICpsZWZ0c3RvcCA9IE5VTEw7Ci0gICpyaWdodHN0YXJ0ID0gTlVMTDsKLSAgKnJpZ2h0c3RvcCA9IE5VTEw7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzwnKQotICAgIHsKLSAgICAgIC8qIEl0J3MganVzdCBhIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSAgICAgIHJldHVybiBwYXJzZV9tcmlfY29uZGl0aW9uIChwY2MpOwotICAgIH0KLQotICAvKiBMb29rIGFoZWFkIGZvciB0aGUgY29uZGl0aW9uIGNvZGUuICAqLwotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICpzICE9ICdcMCc7ICsrcykKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJzwnICYmIHNbMV0gIT0gJ1wwJyAmJiBzWzJdICE9ICdcMCcgJiYgc1szXSA9PSAnPicpCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoKnMgPT0gJ1wwJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgY29uZGl0aW9uIGNvZGUgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAqbGVmdHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqbGVmdHN0b3AgPSBzOwotICBpZiAoKmxlZnRzdG9wID4gKmxlZnRzdGFydAotICAgICAgJiYgKCgqbGVmdHN0b3ApWy0xXSA9PSAnICcgfHwgKCpsZWZ0c3RvcClbLTFdID09ICdcdCcpKQotICAgIC0tKmxlZnRzdG9wOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGlmICghIHBhcnNlX21yaV9jb25kaXRpb24gKHBjYykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogTG9vayBhaGVhZCBmb3IgQU5EIG9yIE9SIG9yIGVuZCBvZiBsaW5lLiAgKi8KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAqcyAhPSAnXDAnOyArK3MpCi0gICAgewotICAgICAgaWYgKChzdHJuY2FzZWNtcCAocywgIkFORCIsIDMpID09IDAKLQkgICAmJiAoc1szXSA9PSAnLicgfHwgISBpc19wYXJ0X29mX25hbWUgKHNbM10pKSkKLQkgIHx8IChzdHJuY2FzZWNtcCAocywgIk9SIiwgMikgPT0gMAotCSAgICAgICYmIChzWzJdID09ICcuJyB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoc1syXSkpKSkKLQlicmVhazsKLSAgICB9Ci0KLSAgKnJpZ2h0c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpyaWdodHN0b3AgPSBzOwotICBpZiAoKnJpZ2h0c3RvcCA+ICpyaWdodHN0YXJ0Ci0gICAgICAmJiAoKCpyaWdodHN0b3ApWy0xXSA9PSAnICcgfHwgKCpyaWdodHN0b3ApWy0xXSA9PSAnXHQnKSkKLSAgICAtLSpyaWdodHN0b3A7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICByZXR1cm4gMTsKLX0KLQotI2RlZmluZSBNQ0MoYjEsIGIyKSAoKChiMSkgPDwgOCkgfCAoYjIpKQotCi0vKiBTd2FwIHRoZSBzZW5zZSBvZiBhIGNvbmRpdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgY29uZGl0aW9uIHNvIHRoYXQKLSAgIGl0IGdlbmVyYXRlcyB0aGUgc2FtZSByZXN1bHQgd2hlbiB0aGUgb3BlcmFuZHMgYXJlIHN3YXBwZWQuICAqLwotCi1zdGF0aWMgaW50Ci1zd2FwX21yaV9jb25kaXRpb24gKGNjKQotICAgICBpbnQgY2M7Ci17Ci0gIHN3aXRjaCAoY2MpCi0gICAgewotICAgIGNhc2UgTUNDICgnaCcsICdpJyk6IHJldHVybiBNQ0MgKCdjJywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAncycpOiByZXR1cm4gTUNDICgnYycsICdjJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ2MnKTogcmV0dXJuIE1DQyAoJ2wnLCAncycpOwotICAgIGNhc2UgTUNDICgnYycsICdzJyk6IHJldHVybiBNQ0MgKCdoJywgJ2knKTsKLSAgICBjYXNlIE1DQyAoJ3AnLCAnbCcpOiByZXR1cm4gTUNDICgnbScsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdtJywgJ2knKTogcmV0dXJuIE1DQyAoJ3AnLCAnbCcpOwotICAgIGNhc2UgTUNDICgnZycsICdlJyk6IHJldHVybiBNQ0MgKCdsJywgJ2UnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAndCcpOiByZXR1cm4gTUNDICgnZycsICd0Jyk7Ci0gICAgY2FzZSBNQ0MgKCdnJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2wnLCAndCcpOwotICAgIGNhc2UgTUNDICgnbCcsICdlJyk6IHJldHVybiBNQ0MgKCdnJywgJ2UnKTsKLSAgICB9Ci0gIHJldHVybiBjYzsKLX0KLQotLyogUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgYSBjb25kaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1yZXZlcnNlX21yaV9jb25kaXRpb24gKGNjKQotICAgICBpbnQgY2M7Ci17Ci0gIHN3aXRjaCAoY2MpCi0gICAgewotICAgIGNhc2UgTUNDICgnaCcsICdpJyk6IHJldHVybiBNQ0MgKCdsJywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAncycpOiByZXR1cm4gTUNDICgnaCcsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ2MnKTogcmV0dXJuIE1DQyAoJ2MnLCAncycpOwotICAgIGNhc2UgTUNDICgnYycsICdzJyk6IHJldHVybiBNQ0MgKCdjJywgJ2MnKTsKLSAgICBjYXNlIE1DQyAoJ24nLCAnZScpOiByZXR1cm4gTUNDICgnZScsICdxJyk7Ci0gICAgY2FzZSBNQ0MgKCdlJywgJ3EnKTogcmV0dXJuIE1DQyAoJ24nLCAnZScpOwotICAgIGNhc2UgTUNDICgndicsICdjJyk6IHJldHVybiBNQ0MgKCd2JywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ3YnLCAncycpOiByZXR1cm4gTUNDICgndicsICdjJyk7Ci0gICAgY2FzZSBNQ0MgKCdwJywgJ2wnKTogcmV0dXJuIE1DQyAoJ20nLCAnaScpOwotICAgIGNhc2UgTUNDICgnbScsICdpJyk6IHJldHVybiBNQ0MgKCdwJywgJ2wnKTsKLSAgICBjYXNlIE1DQyAoJ2cnLCAnZScpOiByZXR1cm4gTUNDICgnbCcsICd0Jyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2cnLCAnZScpOwotICAgIGNhc2UgTUNDICgnZycsICd0Jyk6IHJldHVybiBNQ0MgKCdsJywgJ2UnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAnZScpOiByZXR1cm4gTUNDICgnZycsICd0Jyk7Ci0gICAgfQotICByZXR1cm4gY2M7Ci19Ci0KLS8qIEJ1aWxkIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gIFRoaXMgZ2VuZXJhdGVzIHRlc3QKLSAgIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgSXQgZ29lcyB0byBUUlVFTEFCIGlmIHRoZSBjb25kaXRpb24gaXMKLSAgIHRydWUsIGFuZCB0byBGQUxTRUxBQiBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLiAgRXhhY3RseSBvbmUgb2YKLSAgIFRSVUVMQUIgYW5kIEZBTFNFTEFCIHdpbGwgYmUgTlVMTCwgbWVhbmluZyB0byBmYWxsIHRocm91Z2guICBRVUFMCi0gICBpcyB0aGUgc2l6ZSBxdWFsaWZpZXIgZm9yIHRoZSBleHByZXNzaW9uLiAgRVhURU5UIGlzIHRoZSBzaXplIHRvCi0gICB1c2UgZm9yIHRoZSBicmFuY2guICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkgICByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpCi0gICAgIGludCBxdWFsOwotICAgICBpbnQgY2M7Ci0gICAgIGNoYXIgKmxlZnRzdGFydDsKLSAgICAgY2hhciAqbGVmdHN0b3A7Ci0gICAgIGNoYXIgKnJpZ2h0c3RhcnQ7Ci0gICAgIGNoYXIgKnJpZ2h0c3RvcDsKLSAgICAgY29uc3QgY2hhciAqdHJ1ZWxhYjsKLSAgICAgY29uc3QgY2hhciAqZmFsc2VsYWI7Ci0gICAgIGludCBleHRlbnQ7Ci17Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqczsKLQotICBpZiAobGVmdHN0YXJ0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG02OGtfb3AgbGVmdG9wLCByaWdodG9wOwotICAgICAgY2hhciBjOwotCi0gICAgICAvKiBTd2FwIHRoZSBjb21wYXJlIG9wZXJhbmRzLCBpZiBuZWNlc3NhcnksIHRvIHByb2R1Y2UgYSBsZWdhbAotCSBtNjhrIGNvbXBhcmUgaW5zdHJ1Y3Rpb24uICBDb21wYXJpbmcgYSByZWdpc3RlciBvcGVyYW5kIHdpdGgKLQkgYSBub24tcmVnaXN0ZXIgb3BlcmFuZCByZXF1aXJlcyB0aGUgcmVnaXN0ZXIgdG8gYmUgb24gdGhlCi0JIHJpZ2h0IChjbXAsIGNtcGEpLiAgQ29tcGFyaW5nIGFuIGltbWVkaWF0ZSB2YWx1ZSB3aXRoCi0JIGFueXRoaW5nIHJlcXVpcmVzIHRoZSBpbW1lZGlhdGUgdmFsdWUgdG8gYmUgb24gdGhlIGxlZnQKLQkgKGNtcGkpLiAgKi8KLQotICAgICAgYyA9ICpsZWZ0c3RvcDsKLSAgICAgICpsZWZ0c3RvcCA9ICdcMCc7Ci0gICAgICAodm9pZCkgbTY4a19pcF9vcCAobGVmdHN0YXJ0LCAmbGVmdG9wKTsKLSAgICAgICpsZWZ0c3RvcCA9IGM7Ci0KLSAgICAgIGMgPSAqcmlnaHRzdG9wOwotICAgICAgKnJpZ2h0c3RvcCA9ICdcMCc7Ci0gICAgICAodm9pZCkgbTY4a19pcF9vcCAocmlnaHRzdGFydCwgJnJpZ2h0b3ApOwotICAgICAgKnJpZ2h0c3RvcCA9IGM7Ci0KLSAgICAgIGlmIChyaWdodG9wLm1vZGUgPT0gSU1NRUQKLQkgIHx8ICgobGVmdG9wLm1vZGUgPT0gRFJFRyB8fCBsZWZ0b3AubW9kZSA9PSBBUkVHKQotCSAgICAgICYmIChyaWdodG9wLm1vZGUgIT0gRFJFRyAmJiByaWdodG9wLm1vZGUgIT0gQVJFRykpKQotCXsKLQkgIGNoYXIgKnRlbXA7Ci0KLQkgIGNjID0gc3dhcF9tcmlfY29uZGl0aW9uIChjYyk7Ci0JICB0ZW1wID0gbGVmdHN0YXJ0OwotCSAgbGVmdHN0YXJ0ID0gcmlnaHRzdGFydDsKLQkgIHJpZ2h0c3RhcnQgPSB0ZW1wOwotCSAgdGVtcCA9IGxlZnRzdG9wOwotCSAgbGVmdHN0b3AgPSByaWdodHN0b3A7Ci0JICByaWdodHN0b3AgPSB0ZW1wOwotCX0KLSAgICB9Ci0KLSAgaWYgKHRydWVsYWIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjYyA9IHJldmVyc2VfbXJpX2NvbmRpdGlvbiAoY2MpOwotICAgICAgdHJ1ZWxhYiA9IGZhbHNlbGFiOwotICAgIH0KLSAgICAgIAotICBpZiAobGVmdHN0YXJ0ICE9IE5VTEwpCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAKLQkJCSAgICAgICsgKGxlZnRzdG9wIC0gbGVmdHN0YXJ0KQotCQkJICAgICAgKyAocmlnaHRzdG9wIC0gcmlnaHRzdGFydCkpOwotICAgICAgcyA9IGJ1ZjsKLSAgICAgICpzKysgPSAnYyc7Ci0gICAgICAqcysrID0gJ20nOwotICAgICAgKnMrKyA9ICdwJzsKLSAgICAgIGlmIChxdWFsICE9ICdcMCcpCi0JKnMrKyA9IHF1YWw7Ci0gICAgICAqcysrID0gJyAnOwotICAgICAgbWVtY3B5IChzLCBsZWZ0c3RhcnQsIGxlZnRzdG9wIC0gbGVmdHN0YXJ0KTsKLSAgICAgIHMgKz0gbGVmdHN0b3AgLSBsZWZ0c3RhcnQ7Ci0gICAgICAqcysrID0gJywnOwotICAgICAgbWVtY3B5IChzLCByaWdodHN0YXJ0LCByaWdodHN0b3AgLSByaWdodHN0YXJ0KTsKLSAgICAgIHMgKz0gcmlnaHRzdG9wIC0gcmlnaHRzdGFydDsKLSAgICAgICpzID0gJ1wwJzsKLSAgICAgIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgfQotICAgICAgCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuICh0cnVlbGFiKSk7Ci0gIHMgPSBidWY7Ci0gICpzKysgPSAnYic7Ci0gICpzKysgPSBjYyA+PiA4OwotICAqcysrID0gY2MgJiAweGZmOwotICBpZiAoZXh0ZW50ICE9ICdcMCcpCi0gICAgKnMrKyA9IGV4dGVudDsKLSAgKnMrKyA9ICcgJzsKLSAgc3RyY3B5IChzLCB0cnVlbGFiKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotfQotCi0vKiBQYXJzZSBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICBUaGlzIGdlbmVyYXRlcyB0ZXN0Ci0gICBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4gIFNUT1AgaXMgd2hlcmUgdGhlIGV4cHJlc3Npb24gZW5kcy4gIEl0Ci0gICBnb2VzIHRvIFRSVUVMQUIgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBhbmQgdG8gRkFMU0VMQUIgaWYgdGhlCi0gICBjb25kaXRpb24gaXMgZmFsc2UuICBFeGFjdGx5IG9uZSBvZiBUUlVFTEFCIGFuZCBGQUxTRUxBQiB3aWxsIGJlCi0gICBOVUxMLCBtZWFuaW5nIHRvIGZhbGwgdGhyb3VnaC4gIFFVQUwgaXMgdGhlIHNpemUgcXVhbGlmaWVyIGZvciB0aGUKLSAgIGV4cHJlc3Npb24uICBFWFRFTlQgaXMgdGhlIHNpemUgdG8gdXNlIGZvciB0aGUgYnJhbmNoLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHN0b3AsIHF1YWwsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpCi0gICAgIGNoYXIgKnN0b3A7Ci0gICAgIGludCBxdWFsOwotICAgICBjb25zdCBjaGFyICp0cnVlbGFiOwotICAgICBjb25zdCBjaGFyICpmYWxzZWxhYjsKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgaW50IGM7Ci0gIGludCBjYzsKLSAgY2hhciAqbGVmdHN0YXJ0OwotICBjaGFyICpsZWZ0c3RvcDsKLSAgY2hhciAqcmlnaHRzdGFydDsKLSAgY2hhciAqcmlnaHRzdG9wOwotCi0gIGMgPSAqc3RvcDsKLSAgKnN0b3AgPSAnXDAnOwotCi0gIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAotCQkJCSAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKLSAgICB7Ci0gICAgICAqc3RvcCA9IGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQU5EIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmbGFiOwotCi0gICAgICBpZiAoZmFsc2VsYWIgIT0gTlVMTCkKLQlmbGFiID0gZmFsc2VsYWI7Ci0gICAgICBlbHNlCi0JZmxhYiA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmbGFiLCBleHRlbnQpOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcuJwotCSAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcMCcpCi0JcXVhbCA9ICdcMCc7Ci0gICAgICBlbHNlCi0JewotCSAgcXVhbCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCX0KLQotICAgICAgaWYgKCEgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAoJmNjLCAmbGVmdHN0YXJ0LCAmbGVmdHN0b3AsCi0JCQkJICAgICAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKLQl7Ci0JICAqc3RvcCA9IGM7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KTsKLQotICAgICAgaWYgKGZhbHNlbGFiID09IE5VTEwpCi0JY29sb24gKGZsYWIpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIk9SIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICp0bGFiOwotCi0gICAgICBpZiAodHJ1ZWxhYiAhPSBOVUxMKQotCXRsYWIgPSB0cnVlbGFiOwotICAgICAgZWxzZQotCXRsYWIgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLQotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdGxhYiwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZXh0ZW50KTsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicKLQkgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnKQotCXF1YWwgPSAnXDAnOwotICAgICAgZWxzZQotCXsKLQkgIHF1YWwgPSBpbnB1dF9saW5lX3BvaW50ZXJbMV07Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQl9Ci0KLSAgICAgIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAotCQkJCSAgICAgICAmcmlnaHRzdGFydCwgJnJpZ2h0c3RvcCkpCi0JewotCSAgKnN0b3AgPSBjOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCk7Ci0KLSAgICAgIGlmICh0cnVlbGFiID09IE5VTEwpCi0JY29sb24gKHRsYWIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpOwotICAgIH0KLQotICAqc3RvcCA9IGM7Ci0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgIT0gc3RvcCkKLSAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIikpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBJRiBwc2V1ZG8tb3AuICBUaGlzIG1heSBiZSBhIHN0cnVjdHVyZWQgY29udHJvbAotICAgZGlyZWN0aXZlLCBvciBpdCBtYXkgYmUgYSByZWd1bGFyIGFzc2VtYmxlciBjb25kaXRpb25hbCwgZGVwZW5kaW5nCi0gICBvbiBpdHMgb3BlcmFuZHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfaWYgKHF1YWwpCi0gICAgIGludCBxdWFsOwotewotICBjaGFyICpzOwotICBpbnQgYzsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgLyogQSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIG11c3QgZW5kIHdpdGggVEhFTiB3aXRoIGFuCi0gICAgIG9wdGlvbmFsIHF1YWxpZmllci4gICovCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10KLQkgJiYgKCEgZmxhZ19tcmkgfHwgKnMgIT0gJyonKSkKLSAgICArK3M7Ci0gIC0tczsKLSAgd2hpbGUgKHMgPiBpbnB1dF9saW5lX3BvaW50ZXIgJiYgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSkKLSAgICAtLXM7Ci0KLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPiAxCi0gICAgICAmJiBzWy0xXSA9PSAnLicpCi0gICAgcyAtPSAyOwotCi0gIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyIDwgMwotICAgICAgfHwgc3RybmNhc2VjbXAgKHMgLSAzLCAiVEhFTiIsIDQpICE9IDApCi0gICAgewotICAgICAgaWYgKHF1YWwgIT0gJ1wwJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgdGhlbiIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBJdCdzIGEgY29uZGl0aW9uYWwuICAqLwotICAgICAgc19pZiAoT19uZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNpbmNlIHRoaXMgbWlnaHQgYmUgYSBjb25kaXRpb25hbCBpZiwgdGhpcyBwc2V1ZG8tb3Agd2lsbCBiZQotICAgICBjYWxsZWQgZXZlbiBpZiB3ZSBhcmUgc3VwcG9ydGVkIHRvIGJlIGlnbm9yaW5nIGlucHV0LiAgRG91YmxlCi0gICAgIGNoZWNrIG5vdy4gIENsb2JiZXIgKmlucHV0X2xpbmVfcG9pbnRlciBzbyB0aGF0IGlnbm9yZV9pbnB1dAotICAgICB0aGlua3MgdGhhdCB0aGlzIGlzIG5vdCBhIHNwZWNpYWwgcHNldWRvLW9wLiAgKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICBpZiAoaWdub3JlX2lucHV0ICgpKQotICAgIHsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIG4gPSBwdXNoX21yaV9jb250cm9sIChtcmlfaWYpOwotCi0gIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMgLSAzLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCW4tPm5leHQsIHNbMV0gPT0gJy4nID8gc1syXSA6ICdcMCcpOwotCi0gIGlmIChzWzFdID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMzsKLSAgZWxzZQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAxOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIGVsc2UgcHNldWRvLW9wLiAgSWYgd2UgYXJlIGN1cnJlbnRseSBkb2luZyBhbiBNUkkKLSAgIHN0cnVjdHVyZWQgSUYsIGFzc29jaWF0ZSB0aGUgRUxTRSB3aXRoIHRoZSBJRi4gIE90aGVyd2lzZSwgYXNzdW1lCi0gICBpdCBpcyBhIGNvbmRpdGlvbmFsIGVsc2UuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZWxzZSAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGludCBjOwotICBjaGFyICpidWY7Ci0gIGNoYXIgcVsyXTsKLQotICBpZiAocXVhbCA9PSAnXDAnCi0gICAgICAmJiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotCSAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmCi0JICB8fCBtcmlfY29udHJvbF9zdGFjay0+ZWxzZV9zZWVuKSkKLSAgICB7Ci0gICAgICBzX2Vsc2UgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIGlmIChpZ25vcmVfaW5wdXQgKCkpCi0gICAgewotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9pZgotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImVsc2Ugd2l0aG91dCBtYXRjaGluZyBpZiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4gPSAxOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKSk7Ci0gIHFbMF0gPSBxdWFsOwotICBxWzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBxLCBtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgRU5ESSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZW5kaSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfaWYpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJlbmRpIHdpdGhvdXQgbWF0Y2hpbmcgaWYiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBpZ25vcmVfaW5wdXQgd2lsbCBub3QgcmV0dXJuIHRydWUgZm9yIEVOREksIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAgICAgd29ycnkgYWJvdXQgY2hlY2tpbmcgaXQgYWdhaW4gaGVyZS4gICovCi0KLSAgaWYgKCEgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbikKLSAgICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPm5leHQpOwotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7Ci0KLSAgcG9wX21yaV9jb250cm9sICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEJSRUFLIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9icmVhayAoZXh0ZW50KQotICAgICBpbnQgZXh0ZW50OwotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLSAgY2hhciAqYnVmOwotICBjaGFyIGV4WzJdOwotCi0gIG4gPSBtcmlfY29udHJvbF9zdGFjazsKLSAgd2hpbGUgKG4gIT0gTlVMTAotCSAmJiBuLT50eXBlICE9IG1yaV9mb3IKLQkgJiYgbi0+dHlwZSAhPSBtcmlfcmVwZWF0Ci0JICYmIG4tPnR5cGUgIT0gbXJpX3doaWxlKQotICAgIG4gPSBuLT5vdXRlcjsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJyZWFrIG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG4tPmJvdHRvbSkpOwotICBleFswXSA9IGV4dGVudDsKLSAgZXhbMV0gPSAnXDAnOwotICBzcHJpbnRmIChidWYsICJicmElcyAlcyIsIGV4LCBuLT5ib3R0b20pOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgTkVYVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfbmV4dCAoZXh0ZW50KQotICAgICBpbnQgZXh0ZW50OwotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLSAgY2hhciAqYnVmOwotICBjaGFyIGV4WzJdOwotCi0gIG4gPSBtcmlfY29udHJvbF9zdGFjazsKLSAgd2hpbGUgKG4gIT0gTlVMTAotCSAmJiBuLT50eXBlICE9IG1yaV9mb3IKLQkgJiYgbi0+dHlwZSAhPSBtcmlfcmVwZWF0Ci0JICYmIG4tPnR5cGUgIT0gbXJpX3doaWxlKQotICAgIG4gPSBuLT5vdXRlcjsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm5leHQgb3V0c2lkZSBvZiBzdHJ1Y3R1cmVkIGxvb3AiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMCArIHN0cmxlbiAobi0+bmV4dCkpOwotICBleFswXSA9IGV4dGVudDsKLSAgZXhbMV0gPSAnXDAnOwotICBzcHJpbnRmIChidWYsICJicmElcyAlcyIsIGV4LCBuLT5uZXh0KTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEZPUiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZm9yIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgY29uc3QgY2hhciAqdmFyc3RhcnQsICp2YXJzdG9wOwotICBjb25zdCBjaGFyICppbml0c3RhcnQsICppbml0c3RvcDsKLSAgY29uc3QgY2hhciAqZW5kc3RhcnQsICplbmRzdG9wOwotICBjb25zdCBjaGFyICpieXN0YXJ0LCAqYnlzdG9wOwotICBpbnQgdXA7Ci0gIGludCBieTsKLSAgaW50IGV4dGVudDsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqczsKLSAgY2hhciBleFsyXTsKLQotICAvKiBUaGUgc3ludGF4IGlzCi0gICAgICAgRk9SLnEgdmFyID0gaW5pdCB7IFRPIHwgRE9XTlRPIH0gZW5kIFsgQlkgYnkgXSBETy5lCi0gICAgICovCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICB2YXJzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBMb29rIGZvciB0aGUgJz0nLiAgKi8KLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPScpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nID0iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2YXJzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAodmFyc3RvcCA+IHZhcnN0YXJ0Ci0gICAgICAmJiAodmFyc3RvcFstMV0gPT0gJyAnIHx8IHZhcnN0b3BbLTFdID09ICdcdCcpKQotICAgIC0tdmFyc3RvcDsKLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpbml0c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogTG9vayBmb3IgVE8gb3IgRE9XTlRPLiAgKi8KLSAgdXAgPSAxOwotICBpbml0c3RvcCA9IE5VTEw7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlRPIiwgMikgPT0gMAotCSAgJiYgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlclsyXSkpCi0JewotCSAgaW5pdHN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiRE9XTlRPIiwgNikgPT0gMAotCSAgJiYgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlcls2XSkpCi0JewotCSAgaW5pdHN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB1cCA9IDA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgaWYgKGluaXRzdG9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHRvIG9yIGRvd250byIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoaW5pdHN0b3AgPiBpbml0c3RhcnQKLSAgICAgICYmIChpbml0c3RvcFstMV0gPT0gJyAnIHx8IGluaXRzdG9wWy0xXSA9PSAnXHQnKSkKLSAgICAtLWluaXRzdG9wOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgZW5kc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogTG9vayBmb3IgQlkgb3IgRE8uICAqLwotICBieSA9IDA7Ci0gIGVuZHN0b3AgPSBOVUxMOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJCWSIsIDIpID09IDAKLQkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKQotCXsKLQkgIGVuZHN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBieSA9IDE7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiRE8iLCAyKSA9PSAwCi0JICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJwotCSAgICAgIHx8ICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKSkKLQl7Ci0JICBlbmRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGlmIChlbmRzdG9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGRvIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChlbmRzdG9wID4gZW5kc3RhcnQKLSAgICAgICYmIChlbmRzdG9wWy0xXSA9PSAnICcgfHwgZW5kc3RvcFstMV0gPT0gJ1x0JykpCi0gICAgLS1lbmRzdG9wOwotCi0gIGlmICghIGJ5KQotICAgIHsKLSAgICAgIGJ5c3RhcnQgPSAiIzEiOwotICAgICAgYnlzdG9wID0gYnlzdGFydCArIDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgYnlzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgLyogTG9vayBmb3IgRE8uICAqLwotICAgICAgYnlzdG9wID0gTlVMTDsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPIiwgMikgPT0gMAotCSAgICAgICYmIChpbnB1dF9saW5lX3BvaW50ZXJbMl0gPT0gJy4nCi0JCSAgfHwgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlclsyXSkpKQotCSAgICB7Ci0JICAgICAgYnlzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgICBpZiAoYnlzdG9wID09IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIGRvIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoYnlzdG9wID4gYnlzdGFydAotCSAgJiYgKGJ5c3RvcFstMV0gPT0gJyAnIHx8IGJ5c3RvcFstMV0gPT0gJ1x0JykpCi0JLS1ieXN0b3A7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcuJykKLSAgICBleHRlbnQgPSAnXDAnOwotICBlbHNlCi0gICAgewotICAgICAgZXh0ZW50ID0gaW5wdXRfbGluZV9wb2ludGVyWzFdOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgZnVsbHkgcGFyc2VkIHRoZSBGT1Igb3BlcmFuZHMuICBOb3cgYnVpbGQgdGhlIGxvb3AuICAqLwotCi0gIG4gPSBwdXNoX21yaV9jb250cm9sIChtcmlfZm9yKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICg1MCArIChpbnB1dF9saW5lX3BvaW50ZXIgLSB2YXJzdGFydCkpOwotCi0gIC8qIG1vdmUgaW5pdCx2YXIgKi8KLSAgcyA9IGJ1ZjsKLSAgKnMrKyA9ICdtJzsKLSAgKnMrKyA9ICdvJzsKLSAgKnMrKyA9ICd2JzsKLSAgKnMrKyA9ICdlJzsKLSAgaWYgKHF1YWwgIT0gJ1wwJykKLSAgICAqcysrID0gcXVhbDsKLSAgKnMrKyA9ICcgJzsKLSAgbWVtY3B5IChzLCBpbml0c3RhcnQsIGluaXRzdG9wIC0gaW5pdHN0YXJ0KTsKLSAgcyArPSBpbml0c3RvcCAtIGluaXRzdGFydDsKLSAgKnMrKyA9ICcsJzsKLSAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKLSAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7Ci0gICpzID0gJ1wwJzsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotCi0gIGNvbG9uIChuLT50b3ApOwotCi0gIC8qIGNtcCBlbmQsdmFyICovCi0gIHMgPSBidWY7Ci0gICpzKysgPSAnYyc7Ci0gICpzKysgPSAnbSc7Ci0gICpzKysgPSAncCc7Ci0gIGlmIChxdWFsICE9ICdcMCcpCi0gICAgKnMrKyA9IHF1YWw7Ci0gICpzKysgPSAnICc7Ci0gIG1lbWNweSAocywgZW5kc3RhcnQsIGVuZHN0b3AgLSBlbmRzdGFydCk7Ci0gIHMgKz0gZW5kc3RvcCAtIGVuZHN0YXJ0OwotICAqcysrID0gJywnOwotICBtZW1jcHkgKHMsIHZhcnN0YXJ0LCB2YXJzdG9wIC0gdmFyc3RhcnQpOwotICBzICs9IHZhcnN0b3AgLSB2YXJzdGFydDsKLSAgKnMgPSAnXDAnOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0KLSAgLyogYmNjIGJvdHRvbSAqLwotICBleFswXSA9IGV4dGVudDsKLSAgZXhbMV0gPSAnXDAnOwotICBpZiAodXApCi0gICAgc3ByaW50ZiAoYnVmLCAiYmx0JXMgJXMiLCBleCwgbi0+Ym90dG9tKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGJ1ZiwgImJndCVzICVzIiwgZXgsIG4tPmJvdHRvbSk7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLQotICAvKiBQdXQgdG9nZXRoZXIgdGhlIGFkZCBvciBzdWIgaW5zdHJ1Y3Rpb24gdXNlZCBieSBFTkRGLiAgKi8KLSAgcyA9IGJ1ZjsKLSAgaWYgKHVwKQotICAgIHN0cmNweSAocywgImFkZCIpOwotICBlbHNlCi0gICAgc3RyY3B5IChzLCAic3ViIik7Ci0gIHMgKz0gMzsKLSAgaWYgKHF1YWwgIT0gJ1wwJykKLSAgICAqcysrID0gcXVhbDsKLSAgKnMrKyA9ICcgJzsKLSAgbWVtY3B5IChzLCBieXN0YXJ0LCBieXN0b3AgLSBieXN0YXJ0KTsKLSAgcyArPSBieXN0b3AgLSBieXN0YXJ0OwotICAqcysrID0gJywnOwotICBtZW1jcHkgKHMsIHZhcnN0YXJ0LCB2YXJzdG9wIC0gdmFyc3RhcnQpOwotICBzICs9IHZhcnN0b3AgLSB2YXJzdGFydDsKLSAgKnMgPSAnXDAnOwotICBuLT5pbmNyID0gYnVmOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEVOREYgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2VuZGYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2ZvcikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImVuZGYgd2l0aG91dCBmb3IiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPm5leHQpOwotCi0gIG1yaV9hc3NlbWJsZSAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IpOwotCi0gIHNwcmludGYgKG1yaV9jb250cm9sX3N0YWNrLT5pbmNyLCAiYnJhICVzIiwgbXJpX2NvbnRyb2xfc3RhY2stPnRvcCk7Ci0gIG1yaV9hc3NlbWJsZSAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IpOwotCi0gIGZyZWUgKG1yaV9jb250cm9sX3N0YWNrLT5pbmNyKTsKLQotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7Ci0KLSAgcG9wX21yaV9jb250cm9sICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIFJFUEVBVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfcmVwZWF0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV9yZXBlYXQpOwotICBjb2xvbiAobi0+dG9wKTsKLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIFVOVElMIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV91bnRpbCAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9yZXBlYXQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bnRpbCB3aXRob3V0IHJlcGVhdCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc107IHMrKykKLSAgICA7Ci0KLSAgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAocywgcXVhbCwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQltcmlfY29udHJvbF9zdGFjay0+dG9wLCAnXDAnKTsKLQotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgV0hJTEUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX3doaWxlIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgY2hhciAqczsKLQotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdCi0JICYmICghIGZsYWdfbXJpIHx8ICpzICE9ICcqJykpCi0gICAgcysrOwotICAtLXM7Ci0gIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykKLSAgICAtLXM7Ci0gIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyID4gMQotICAgICAgJiYgc1stMV0gPT0gJy4nKQotICAgIHMgLT0gMjsKLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPCAyCi0gICAgICB8fCBzdHJuY2FzZWNtcCAocyAtIDEsICJETyIsIDIpICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGRvIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV93aGlsZSk7Ci0KLSAgY29sb24gKG4tPm5leHQpOwotCi0gIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMgLSAxLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLCBuLT5ib3R0b20sCi0JCQkJc1sxXSA9PSAnLicgPyBzWzJdIDogJ1wwJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcyArIDE7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBFTkRXIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbmR3IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqYnVmOwotCi0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfd2hpbGUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJlbmR3IHdpdGhvdXQgd2hpbGUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMCArIHN0cmxlbiAobXJpX2NvbnRyb2xfc3RhY2stPm5leHQpKTsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhICVzIiwgbXJpX2NvbnRyb2xfc3RhY2stPm5leHQpOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyoKLSAqIG1kX3BhcnNlX29wdGlvbgotICoJSW52b2NhdGlvbiBsaW5lIGluY2x1ZGVzIGEgc3dpdGNoIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBiYXNlIGFzc2VtYmxlci4KLSAqCVNlZSBpZiBpdCdzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGlvbi4gIFRoZXNlIGFyZToKLSAqCi0gKgktW0FdbVtjXTY4MDAwLCAtW0FdbVtjXTY4MDA4LCAtW0FdbVtjXTY4MDEwLCAtW0FdbVtjXTY4MDIwLCAtW0FdbVtjXTY4MDMwLCAtW0FdbVtjXTY4MDQwCi0gKgktW0FdbVtjXTY4ODgxLCAtW0FdbVtjXTY4ODgyLCAtW0FdbVtjXTY4ODUxCi0gKgkJU2VsZWN0IHRoZSBhcmNoaXRlY3R1cmUuICBJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90Ci0gKgkJc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBhcmNoaXRlY3R1cmUgY2F1c2UgZmF0YWwKLSAqCQllcnJvcnMuICBNb3JlIHRoYW4gb25lIG1heSBiZSBzcGVjaWZpZWQuICBUaGUgZGVmYXVsdCBpcwotICoJCS1tNjgwMjAgLW02ODg1MSAtbTY4ODgxLiAgTm90ZSB0aGF0IC1tNjgwMDggaXMgYSBzeW5vbnltCi0gKgkJZm9yIC1tNjgwMDAsIGFuZCAtbTY4ODgyIGlzIGEgc3lub255bSBmb3IgLW02ODg4MS4KLSAqCS1bQV1tW2Ndbm8tNjg4NTEsIC1bQV1tW2Ndbm8tNjg4ODEKLSAqCQlEb24ndCBhY2NlcHQgNjg4PzEgaW5zdHJ1Y3Rpb25zLiAgKFRoZSAiYyIgaXMga2luZCBvZiBzaWxseSwKLSAqCQlzbyBkb24ndCB1c2Ugb3IgZG9jdW1lbnQgaXQsIGJ1dCB0aGF0J3MgdGhlIHdheSB0aGUgcGFyc2luZwotICoJCXdvcmtzKS4KLSAqCi0gKgktcGljCUluZGljYXRlcyBQSUMuCi0gKgktawlJbmRpY2F0ZXMgUElDLiAgKFN1biAzIG9ubHkuKQotICoKLSAqCS0tYml0d2lzZS1vcgotICoJCVBlcm1pdCBgfCcgdG8gYmUgdXNlZCBpbiBleHByZXNzaW9ucy4KLSAqCi0gKi8KLQotI2lmZGVmIE9CSl9FTEYKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJsU0E6bTprUTpWIjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibFNBOm06ayI7Ci0jZW5kaWYKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fUElDIChPUFRJT05fTURfQkFTRSkKLSAgeyJwaWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BJQ30sCi0jZGVmaW5lIE9QVElPTl9SRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJyZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWwiLCBub19hcmd1bWVudCwgTlVMTCwKLSAgICAgT1BUSU9OX1JFR0lTVEVSX1BSRUZJWF9PUFRJT05BTH0sCi0jZGVmaW5lIE9QVElPTl9CSVRXSVNFX09SIChPUFRJT05fTURfQkFTRSArIDIpCi0gIHsiYml0d2lzZS1vciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQklUV0lTRV9PUn0sCi0jZGVmaW5lIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8xNiAoT1BUSU9OX01EX0JBU0UgKyAzKQotICB7ImJhc2Utc2l6ZS1kZWZhdWx0LTE2Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8xNn0sCi0jZGVmaW5lIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8zMiAoT1BUSU9OX01EX0JBU0UgKyA0KQotICB7ImJhc2Utc2l6ZS1kZWZhdWx0LTMyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8zMn0sCi0jZGVmaW5lIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8xNiAoT1BUSU9OX01EX0JBU0UgKyA1KQotICB7ImRpc3Atc2l6ZS1kZWZhdWx0LTE2Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8xNn0sCi0jZGVmaW5lIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8zMiAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7ImRpc3Atc2l6ZS1kZWZhdWx0LTMyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8zMn0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbCc6CQkJLyogLWwgbWVhbnMga2VlcCBleHRlcm5hbCB0byAyIGJpdCBvZmZzZXQKLQkJCQkgICByYXRoZXIgdGhhbiAxNiBiaXQgb25lICovCi0gICAgICBmbGFnX3Nob3J0X3JlZnMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoJCQkvKiAtUyBtZWFucyB0aGF0IGpic3IncyBhbHdheXMgdHVybiBpbnRvCi0JCQkJICAganNyJ3MuICAqLwotICAgICAgZmxhZ19sb25nX2p1bXBzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICBpZiAoKmFyZyA9PSAnbScpCi0gCWFyZysrOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbC10aHJvdWdoICovCi0gICAgY2FzZSAnbSc6Ci0KLSAgICAgIGlmIChhcmdbMF0gPT0gJ24nICYmIGFyZ1sxXSA9PSAnbycgJiYgYXJnWzJdID09ICctJykKLQl7Ci0JICBpbnQgaTsKLQkgIHVuc2lnbmVkIGxvbmcgYXJjaDsKLQkgIGNvbnN0IGNoYXIgKm9hcmcgPSBhcmc7Ci0KLQkgIGFyZyArPSAzOwotCSAgaWYgKCphcmcgPT0gJ20nKQotCSAgICB7Ci0JICAgICAgYXJnKys7Ci0JICAgICAgaWYgKGFyZ1swXSA9PSAnYycgJiYgYXJnWzFdID09ICc2JykKLQkJYXJnKys7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBuX2FyY2hzOyBpKyspCi0JICAgIGlmICghc3RyY21wIChhcmcsIGFyY2hzW2ldLm5hbWUpKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGkgPT0gbl9hcmNocykKLQkgICAgewotCSAgICB1bmtub3duOgotCSAgICAgIGFzX2JhZCAoXygidW5yZWNvZ25pemVkIG9wdGlvbiBgJXMnIiksIG9hcmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICBhcmNoID0gYXJjaHNbaV0uYXJjaDsKLQkgIGlmIChhcmNoID09IG02ODg4MSkKLQkgICAgbm9fNjg4ODEgPSAxOwotCSAgZWxzZSBpZiAoYXJjaCA9PSBtNjg4NTEpCi0JICAgIG5vXzY4ODUxID0gMTsKLQkgIGVsc2UKLQkgICAgZ290byB1bmtub3duOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgaTsKLQotCSAgaWYgKGFyZ1swXSA9PSAnYycgJiYgYXJnWzFdID09ICc2JykKLQkgICAgYXJnKys7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBuX2FyY2hzOyBpKyspCi0JICAgIGlmICghc3RyY21wIChhcmcsIGFyY2hzW2ldLm5hbWUpKQotCSAgICAgIHsKLQkJdW5zaWduZWQgbG9uZyBhcmNoID0gYXJjaHNbaV0uYXJjaDsKLQkJaWYgKGNwdV9vZl9hcmNoIChhcmNoKSkKLQkJICAvKiBJdCdzIGEgY3B1IHNwZWMuICAqLwotCQkgIHsKLQkJICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlICY9IH5tNjgwMDB1cDsKLQkJICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2g7Ci0JCSAgfQotCQllbHNlIGlmIChhcmNoID09IG02ODg4MSkKLQkJICB7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4ODE7Ci0JCSAgICBub182ODg4MSA9IDA7Ci0JCSAgfQotCQllbHNlIGlmIChhcmNoID09IG02ODg1MSkKLQkJICB7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4NTE7Ci0JCSAgICBub182ODg1MSA9IDA7Ci0JCSAgfQotCQllbHNlCi0JCSAgLyogPz8/ICovCi0JCSAgYWJvcnQgKCk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIGlmIChpID09IG5fYXJjaHMpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInVucmVjb2duaXplZCBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBgJXMnIiksIGFyZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BJQzoKLSAgICBjYXNlICdrJzoKLSAgICAgIGZsYWdfd2FudF9waWMgPSAxOwotICAgICAgYnJlYWs7CQkJLyogLXBpYywgUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAqLwotCi0gICAgY2FzZSBPUFRJT05fUkVHSVNURVJfUFJFRklYX09QVElPTkFMOgotICAgICAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMTsKLSAgICAgIHJlZ19wcmVmaXhfb3B0aW9uYWxfc2VlbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogLVY6IFNWUjQgYXJndW1lbnQgdG8gcHJpbnQgdmVyc2lvbiBJRC4gICovCi0gICAgY2FzZSAnVic6Ci0gICAgICBwcmludF92ZXJzaW9uX2lkICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1ReSwgLVFuOiBTVlI0IGFyZ3VtZW50cyBjb250cm9sbGluZyB3aGV0aGVyIGEgLmNvbW1lbnQgc2VjdGlvbgotCSBzaG91bGQgYmUgZW1pdHRlZCBvciBub3QuICBGSVhNRTogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgICBjYXNlICdRJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQklUV0lTRV9PUjoKLSAgICAgIHsKLQljaGFyICpuLCAqdDsKLQljb25zdCBjaGFyICpzOwotCi0JbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobTY4a19jb21tZW50X2NoYXJzKSArIDEpOwotCXQgPSBuOwotCWZvciAocyA9IG02OGtfY29tbWVudF9jaGFyczsgKnMgIT0gJ1wwJzsgcysrKQotCSAgaWYgKCpzICE9ICd8JykKLQkgICAgKnQrKyA9ICpzOwotCSp0ID0gJ1wwJzsKLQltNjhrX2NvbW1lbnRfY2hhcnMgPSBuOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8xNjoKLSAgICAgIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCA9IFNJWkVfV09SRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzI6Ci0gICAgICBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPSBTSVpFX0xPTkc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0RJU1BfU0laRV9ERUZBVUxUXzE2OgotICAgICAgbTY4a19yZWwzMiA9IDA7Ci0gICAgICBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0RJU1BfU0laRV9ERUZBVUxUXzMyOgotICAgICAgbTY4a19yZWwzMiA9IDE7Ci0gICAgICBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotNjgwWDAgb3B0aW9uczpcblwKLS1sCQkJdXNlIDEgd29yZCBmb3IgcmVmcyB0byB1bmRlZmluZWQgc3ltYm9scyBbZGVmYXVsdCAyXVxuXAotLW02ODAwMCB8IC1tNjgwMDggfCAtbTY4MDEwIHwgLW02ODAyMCB8IC1tNjgwMzAgfCAtbTY4MDQwIHwgLW02ODA2MFxuXAotIHwgLW02ODMwMiB8IC1tNjgzMzEgfCAtbTY4MzMyIHwgLW02ODMzMyB8IC1tNjgzNDAgfCAtbTY4MzYwXG5cCi0gfCAtbWNwdTMyIHwgLW01MjAwXG5cCi0JCQlzcGVjaWZ5IHZhcmlhbnQgb2YgNjgwWDAgYXJjaGl0ZWN0dXJlIFtkZWZhdWx0IDY4MDIwXVxuXAotLW02ODg4MSB8IC1tNjg4ODIgfCAtbW5vLTY4ODgxIHwgLW1uby02ODg4MlxuXAotCQkJdGFyZ2V0IGhhcy9sYWNrcyBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3NvclxuXAotCQkJW2RlZmF1bHQgeWVzIGZvciA2ODAyMCwgNjgwMzAsIGFuZCBjcHUzMl1cbiIpKTsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1tNjg4NTEgfCAtbW5vLTY4ODUxXG5cCi0JCQl0YXJnZXQgaGFzL2xhY2tzIG1lbW9yeS1tYW5hZ2VtZW50IHVuaXQgY29wcm9jZXNzb3JcblwKLQkJCVtkZWZhdWx0IHllcyBmb3IgNjgwMjAgYW5kIHVwXVxuXAotLXBpYywgLWsJCWdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcblwKLS1TCQkJdHVybiBqYnNyIGludG8ganNyXG5cCi0tLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbFxuXAotCQkJcmVjb2duaXplIHJlZ2lzdGVyIG5hbWVzIHdpdGhvdXQgcHJlZml4IGNoYXJhY3RlclxuXAotLS1iaXR3aXNlLW9yCQlkbyBub3QgdHJlYXQgYHwnIGFzIGEgY29tbWVudCBjaGFyYWN0ZXJcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tLWJhc2Utc2l6ZS1kZWZhdWx0LTE2CWJhc2UgcmVnIHdpdGhvdXQgc2l6ZSBpcyAxNiBiaXRzXG5cCi0tLWJhc2Utc2l6ZS1kZWZhdWx0LTMyCWJhc2UgcmVnIHdpdGhvdXQgc2l6ZSBpcyAzMiBiaXRzIChkZWZhdWx0KVxuXAotLS1kaXNwLXNpemUtZGVmYXVsdC0xNglkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMTYgYml0c1xuXAotLS1kaXNwLXNpemUtZGVmYXVsdC0zMglkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcbiIpKTsKLX0KLQwKLSNpZmRlZiBURVNUMgotCi0vKiBURVNUMjogIFRlc3QgbWRfYXNzZW1ibGUoKSAqLwotLyogV2FybmluZywgdGhpcyByb3V0aW5lIHByb2JhYmx5IGRvZXNuJ3Qgd29yayBhbnltb3JlICovCi0KLW1haW4gKCkKLXsKLSAgc3RydWN0IG02OGtfaXQgdGhlX2luczsKLSAgY2hhciBidWZbMTIwXTsKLSAgY2hhciAqY3A7Ci0gIGludCBuOwotCi0gIG02OGtfaXBfYmVnaW4gKCk7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKCFnZXRzIChidWYpIHx8ICEqYnVmKQotCWJyZWFrOwotICAgICAgaWYgKGJ1ZlswXSA9PSAnfCcgfHwgYnVmWzFdID09ICcuJykKLQljb250aW51ZTsKLSAgICAgIGZvciAoY3AgPSBidWY7ICpjcDsgY3ArKykKLQlpZiAoKmNwID09ICdcdCcpCi0JICAqY3AgPSAnICc7Ci0gICAgICBpZiAoaXNfbGFiZWwgKGJ1ZikpCi0JY29udGludWU7Ci0gICAgICBtZW1zZXQgKCZ0aGVfaW5zLCAnXDAnLCBzaXplb2YgKHRoZV9pbnMpKTsKLSAgICAgIG02OGtfaXAgKCZ0aGVfaW5zLCBidWYpOwotICAgICAgaWYgKHRoZV9pbnMuZXJyb3IpCi0JewotCSAgcHJpbnRmIChfKCJFcnJvciAlcyBpbiAlc1xuIiksIHRoZV9pbnMuZXJyb3IsIGJ1Zik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiT3Bjb2RlKCVkLiVzKTogIiksIHRoZV9pbnMubnVtbywgdGhlX2lucy5hcmdzKTsKLQkgIGZvciAobiA9IDA7IG4gPCB0aGVfaW5zLm51bW87IG4rKykKLQkgICAgcHJpbnRmICgiIDB4JXgiLCB0aGVfaW5zLm9wY29kZVtuXSAmIDB4ZmZmZik7Ci0JICBwcmludGYgKCIgICAgIik7Ci0JICBwcmludF90aGVfaW5zbiAoJnRoZV9pbnMub3Bjb2RlWzBdLCBzdGRvdXQpOwotCSAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotCX0KLSAgICAgIGZvciAobiA9IDA7IG4gPCBzdHJsZW4gKHRoZV9pbnMuYXJncykgLyAyOyBuKyspCi0JewotCSAgaWYgKHRoZV9pbnMub3BlcmFuZHNbbl0uZXJyb3IpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJvcCVkIEVycm9yICVzIGluICVzXG4iLCBuLCB0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yLCBidWYpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBwcmludGYgKCJtb2RlICVkLCByZWcgJWQsICIsIHRoZV9pbnMub3BlcmFuZHNbbl0ubW9kZSwgdGhlX2lucy5vcGVyYW5kc1tuXS5yZWcpOwotCSAgaWYgKHRoZV9pbnMub3BlcmFuZHNbbl0uYl9jb25zdCkKLQkgICAgcHJpbnRmICgiQ29uc3RhbnQ6ICclLipzJywgIiwgMSArIHRoZV9pbnMub3BlcmFuZHNbbl0uZV9jb25zdCAtIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9jb25zdCwgdGhlX2lucy5vcGVyYW5kc1tuXS5iX2NvbnN0KTsKLQkgIHByaW50ZiAoImlyZWcgJWQsIGlzaXogJWQsIGltdWwgJWQsICIsIHRoZV9pbnMub3BlcmFuZHNbbl0uaXJlZywgdGhlX2lucy5vcGVyYW5kc1tuXS5pc2l6LCB0aGVfaW5zLm9wZXJhbmRzW25dLmltdWwpOwotCSAgaWYgKHRoZV9pbnMub3BlcmFuZHNbbl0uYl9pYWRkKQotCSAgICBwcmludGYgKCJJYWRkOiAnJS4qcycsIiwgMSArIHRoZV9pbnMub3BlcmFuZHNbbl0uZV9pYWRkIC0gdGhlX2lucy5vcGVyYW5kc1tuXS5iX2lhZGQsIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9pYWRkKTsKLQkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLQl9Ci0gICAgfQotICBtNjhrX2lwX2VuZCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWlzX2xhYmVsIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotICB3aGlsZSAoKnN0ciAmJiAqc3RyICE9ICcgJykKLSAgICBzdHIrKzsKLSAgaWYgKHN0clstMV0gPT0gJzonIHx8IHN0clsxXSA9PSAnPScpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotLyogUG9zc2libGUgc3RhdGVzIGZvciByZWxheGF0aW9uOgotCi0gICAwIDAJYnJhbmNoIG9mZnNldAlieXRlCShicmEsIGV0YykKLSAgIDAgMQkJCXdvcmQKLSAgIDAgMgkJCWxvbmcKLQotICAgMSAwCWluZGV4ZWQgb2Zmc2V0cwlieXRlCWEwQCgzMixkNDp3OjEpIGV0YwotICAgMSAxCQkJd29yZAotICAgMSAyCQkJbG9uZwotCi0gICAyIDAJdHdvLW9mZnNldCBpbmRleCB3b3JkLXdvcmQgYTBAKDMyLGQ0KUAoNDUpIGV0YwotICAgMiAxCQkJd29yZC1sb25nCi0gICAyIDIJCQlsb25nLXdvcmQKLSAgIDIgMwkJCWxvbmctbG9uZwotCi0gICAqLwotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogRm9yIGEub3V0LCBmb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuICBJZiB3ZSBkb24ndCBkbwotICAgICB0aGlzLCBCRkQgd2lsbCBhbGlnbiBpdCBmb3IgdXMsIGJ1dCBpdCB3aWxsIG5vdCB3cml0ZSBvdXQgdGhlCi0gICAgIGZpbmFsIGJ5dGVzIG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBtYXkgYmUgYSBidWcgaW4gQkZELCBidXQgaXQgaXMKLSAgICAgZWFzaWVyIHRvIGZpeCBpdCBoZXJlIHNpbmNlIHRoYXQgaXMgaG93IHRoZSBvdGhlciBhLm91dCB0YXJnZXRzCi0gICAgIHdvcmsuICAqLwotICBpbnQgYWxpZ247Ci0KLSAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICBzaXplID0gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoKHZhbHVlVCkgLTEgPDwgYWxpZ24pKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSA2OGssIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBleHRlbnNpb24KLSAgIHdvcmQuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzZXMgb2YgdGhlIG9mZnNldCBhbmQgdGhlCi0gICBmaXJzdCBleHRlbnNpb24gd29yZCBpcyBzdG9yZWQgaW4gZnhfcGNyZWxfYWRqdXN0LiAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaW50IGFkanVzdDsKLQotICAvKiBCZWNhdXNlIGZ4X3BjcmVsX2FkanVzdCBpcyBhIGNoYXIsIGFuZCBtYXkgYmUgdW5zaWduZWQsIHdlIHN0b3JlCi0gICAgIC0xIGFzIDY0LiAgKi8KLSAgYWRqdXN0ID0gZml4UC0+ZnhfcGNyZWxfYWRqdXN0OwotICBpZiAoYWRqdXN0ID09IDY0KQotICAgIGFkanVzdCA9IC0xOwotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzIC0gYWRqdXN0OwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfQ09GRgotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQotICAgICBzeW1ib2xTICppZ25vcmU7Ci17Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHN3aXRjaCAoZnJhZy0+ZnJfc3VidHlwZSAmIDB4MykKLSAgICB7Ci0gICAgY2FzZSBCWVRFOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBTSE9SVDoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgTE9ORzoKLSAgICAgIHJldHVybiA0OwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi12b2lkIG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcoKQotewotICAgLyogU2V0IGZpbGUtc3BlY2lmaWMgZmxhZ3MgaWYgdGhpcyBpcyBhIGNwdTMyIHByb2Nlc3NvciAqLwotICAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgJiBjcHUzMikKLSAgICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9DUFUzMjsKLX0KLSNlbmRpZgotLyogZW5kIG9mIHRjLW02OGsuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmggYi9nYXMvY29uZmlnL3RjLW02OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg0OTJiOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW02OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtbTY4ay5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19NNjhLIDEKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgVEVfU1VOMwotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1zdW5vcy1iaWciCi0jZW5kaWYKLSNpZmRlZiBURV9OZXRCU0QKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtbTY4ay1uZXRic2QiCi0jZW5kaWYKLSNpZmRlZiBURV9MSU5VWAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1tNjhrLWxpbnV4IgotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtemVyby1iaWciCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tNjhrIgotI2VuZGlmCi0KLSNpZmRlZiBURV9BUE9MTE8KLSNkZWZpbmUgQ09GRl9NQUdJQwkJQVBPTExPTTY4S01BR0lDCi0jZGVmaW5lIENPRkZfQU9VVEhEUl9NQUdJQwlBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUgotI3VuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZW5kaWYKLQotI2lmZGVmIFRFX0xZTlgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1seW54IgotI2VuZGlmCi0jaWZkZWYgVEVfQVVYCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJjb2ZmLW02OGstYXV4IgotI2VuZGlmCi0jaWZkZWYgVEVfREVMVEEKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1zeXN2IgotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9NQUdJQwotI2RlZmluZSBDT0ZGX01BR0lDIE1DNjhNQUdJQwotI2VuZGlmCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX202OGsgLyogZm9yIG5vbi1CRkRfQVNTRU1CTEVSICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX202OGsgLyogQkZEX0FTU0VNQkxFUiAqLwotI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMlcKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3l8fCh4KS0+Znhfc3Vic3kpCi0KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoc3RydWN0IGZyYWcgKikpOwotI2lmZGVmIFRFX1NVTjMKLS8qIFRoaXMgdmFyaWFibGUgY29udGFpbnMgdGhlIHZhbHVlIHRvIHdyaXRlIG91dCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICB0aGUgYS5vdXQgZmlsZS4gIFRoZSAyPDwxNiBtZWFucyB0aGF0IHRoaXMgaXMgYSA2ODAyMCBmaWxlIGluc3RlYWQKLSAgIG9mIGFuIG9sZC1zdHlsZSA2ODAwMCBmaWxlICovCi0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICgyPDwxNnxPTUFHSUMpOwkvKiBNYWdpYyBieXRlIGZvciBmaWxlIGhlYWRlciAqLwotI2VuZGlmIC8qIFRFX1NVTjMgKi8KLQotI2lmbmRlZiBBT1VUX01BQ0hUWVBFCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgbTY4a19hb3V0X21hY2h0eXBlCi1leHRlcm4gaW50IG02OGtfYW91dF9tYWNodHlwZTsKLSNlbmRpZgotCi0jZGVmaW5lIHRjX2NvbW1lbnRfY2hhcnMgbTY4a19jb21tZW50X2NoYXJzCi1leHRlcm4gY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzOwotCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBMSVNUSU5HX1dPUkRfU0laRSAyCS8qIEEgd29yZCBpcyAyIGJ5dGVzICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIIDIJLyogT25lIHdvcmQgb24gdGhlIGZpcnN0IGxpbmUgKi8KLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEhfU0VDT05EIDIJLyogT25lIHdvcmQgb24gdGhlIHNlY29uZCBsaW5lICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNC8qIEFuZCA0IGxpbmVzIG1heCAqLwotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiNjhLIEdBUyAiCi0KLSNpZm5kZWYgUkVHSVNURVJfUFJFRklYCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWCAnJScKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCkKLSNpZiBkZWZpbmVkIChNNjhLQ09GRikgfHwgZGVmaW5lZCAoT0JKX0VMRikKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZVswXSA9PSAnLicgXAotCQkJICAgJiYgKG5hbWVbMV0gPT0gJ0wnIHx8IG5hbWVbMV0gPT0gJy4nKSkKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDAKLSNlbHNlIC8qICEgKENPRkYgfHwgRUxGKSAqLwotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotI2VuZGlmIC8qICEgKENPRkYgfHwgRUxGKSAqLwotI2VuZGlmIC8qIG5vdCBkZWYgUkVHSVNURVJfUFJFRklYIGFuZCBub3QgZGVmIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCAqLwotCi0jaWZkZWYgVEVfREVMVEEKLS8qIE9uIHRoZSBEZWx0YSwgYCUnIGNhbiBvY2N1ciB3aXRoaW4gYSBsYWJlbCBuYW1lLCBidXQgbm90IGFzIHRoZQotICAgaW5pdGlhbCBjaGFyYWN0ZXIuICAqLwotI2RlZmluZSBMRVhfUENUIExFWF9OQU1FCi0vKiBPbiB0aGUgRGVsdGEsIGB+JyBjYW4gc3RhcnQgYSBsYWJlbCBuYW1lLCBidXQgaXMgY29udmVydGVkIHRvICcuJy4gKi8KLSNkZWZpbmUgTEVYX1RJTERFIExFWF9CRUdJTl9OQU1FCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShzKSAoKCoocykgPT0gJ34nID8gKihzKSA9ICcuJyA6ICcuJyksIHMpCi0vKiBPbiB0aGUgRGVsdGEsIGRvdHMgYXJlIG5vdCByZXF1aXJlZCBiZWZvcmUgcHNldWRvLW9wcy4gICovCi0jZGVmaW5lIE5PX1BTRVVET19ET1QKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI3VuZGVmIExPQ0FMX0xBQkVMCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIFwKLSAgKG5hbWVbMF0gPT0gJy4nIHx8IChuYW1lWzBdID09ICdMJyAmJiBuYW1lWzFdID09ICclJykpCi0jZW5kaWYKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBtNjhrX21yaV9tb2RlX2NoYW5nZSBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgTVJJX01PREVfQ0hBTkdFKGkpIG02OGtfbXJpX21vZGVfY2hhbmdlIChpKQotCi1leHRlcm4gaW50IG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3AgUEFSQU1TICgocHNldWRvX3R5cGVTICopKTsKLSNkZWZpbmUgdGNfY29uZGl0aW9uYWxfcHNldWRvb3AocG9wKSBtNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCi0KLWV4dGVybiB2b2lkIG02OGtfZnJvYl9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIG02OGtfZnJvYl9sYWJlbCAoc3ltKQotCi1leHRlcm4gdm9pZCBtNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQoKSBtNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi0KLWV4dGVybiB2b2lkIG02OGtfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpCQkJCVwKLWRvCQkJCQkJCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSByZWdfc2VjdGlvbikJCQlcCi0gICAgICBwdW50ID0gMTsJCQkJCQkJXAotICAgIG02OGtfZnJvYl9zeW1ib2wgKHN5bSk7CQkJCQlcCi0gIH0JCQkJCQkJCVwKLXdoaWxlICgwKQotCi0jZGVmaW5lIE5PX1JFTE9DIEJGRF9SRUxPQ19OT05FCi0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuICBJZgotICAgdGhlIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbCwgdGhlbiB0aGUgYXNzZW1ibGVyCi0gICBzaG91bGQgbmV2ZXIgZG8gdGhlIHJlbG9jYXRpb24uICAqLwotCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpCQkJXAotCSgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTAkJCVwKLQkgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJXAotCSAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCVwKLQkgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJXAotCSAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoWCkgdGNfbTY4a19maXhfYWRqdXN0YWJsZShYKQotZXh0ZXJuIGludCB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nCi1leHRlcm4gdm9pZCBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYKQkJCVwKLQkoKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJXAotCSB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIHRjX2Zyb2JfY29mZl9zeW1ib2woc3ltKSBtNjhrX2Zyb2Jfc3ltYm9sIChzeW0pCi0KLSNkZWZpbmUgTk9fUkVMT0MgMAotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCi0KLWV4dGVybiB2b2lkIG02OGtfaW5pdF9hZnRlcl9hcmdzIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzIG02OGtfaW5pdF9hZnRlcl9hcmdzCi0KLWV4dGVybiBpbnQgbTY4a19wYXJzZV9sb25nX29wdGlvbiBQQVJBTVMgKChjaGFyICopKTsKLSNkZWZpbmUgbWRfcGFyc2VfbG9uZ19vcHRpb24gbTY4a19wYXJzZV9sb25nX29wdGlvbgotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBUQVJHRVRfV09SRF9TSVpFIDMyCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX202OGsKLQotZXh0ZXJuIHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogQ29waWVkIGZyb20gd3JpdGUuYyAqLwotLyogVGhpcyB3YXMgZm9ybWVybHkgY2FsbGVkIE02OEtfQUlNX0tMVURHRS4gICovCi0jZGVmaW5lIG1kX3ByZXBhcmVfcmVsYXhfc2NhbihmcmFnUCwgYWRkcmVzcywgYWltLCB0aGlzX3N0YXRlLCB0aGlzX3R5cGUpIFwKLSAgaWYgKGFpbT09MCAmJiB0aGlzX3N0YXRlPT0gNCkgeyAvKiBoYXJkIGVuY29kZWQgZnJvbSB0Yy1tNjhrLmMgKi8gXAotICAgIGFpbT10aGlzX3R5cGUtPnJseF9mb3J3YXJkKzE7IC8qIEZvcmNlIHJlbGF4YXRpb24gaW50byB3b3JkIG1vZGUgKi8gXAotICB9Ci0KLS8qIGVuZCBvZiB0Yy1tNjhrLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTg4ay5jIGIvZ2FzL2NvbmZpZy90Yy1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzQ2MGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUyICswLDAgQEAKLS8qIG04OGsuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAotICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5Ci0gICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJtODhrLW9wY29kZS5oIgotCi1zdHJ1Y3QgZmllbGRfdmFsX2Fzc29jCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIHZhbDsKLX07Ci0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MgY3JfcmVnc1tdID0KLXsKLSAgeyJQSUQiLCAwfSwKLSAgeyJQU1IiLCAxfSwKLSAgeyJFUFNSIiwgMn0sCi0gIHsiU1NCUiIsIDN9LAotICB7IlNYSVAiLCA0fSwKLSAgeyJTTklQIiwgNX0sCi0gIHsiU0ZJUCIsIDZ9LAotICB7IlZCUiIsIDd9LAotICB7IkRNVDAiLCA4fSwKLSAgeyJETUQwIiwgOX0sCi0gIHsiRE1BMCIsIDEwfSwKLSAgeyJETVQxIiwgMTF9LAotICB7IkRNRDEiLCAxMn0sCi0gIHsiRE1BMSIsIDEzfSwKLSAgeyJETVQyIiwgMTR9LAotICB7IkRNRDIiLCAxNX0sCi0gIHsiRE1BMiIsIDE2fSwKLSAgeyJTUjAiLCAxN30sCi0gIHsiU1IxIiwgMTh9LAotICB7IlNSMiIsIDE5fSwKLSAgeyJTUjMiLCAyMH0sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBmY3JfcmVnc1tdID0KLXsKLSAgeyJGUEVDUiIsIDB9LAotICB7IkZQSFMxIiwgMX0sCi0gIHsiRlBMUzEiLCAyfSwKLSAgeyJGUEhTMiIsIDN9LAotICB7IkZQTFMyIiwgNH0sCi0gIHsiRlBQVCIsIDV9LAotICB7IkZQUkgiLCA2fSwKLSAgeyJGUFJMIiwgN30sCi0gIHsiRlBJVCIsIDh9LAotCi0gIHsiRlBTUiIsIDYyfSwKLSAgeyJGUENSIiwgNjN9LAotCi0gIHtOVUxMLCAwfSwKLX07Ci0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MgY21wc2xvdFtdID0KLXsKLS8qIEludGVnZXIJRmxvYXRpbmcgcG9pbnQgKi8KLSAgeyJuYyIsIDB9LAotICB7ImNwIiwgMX0sCi0gIHsiZXEiLCAyfSwKLSAgeyJuZSIsIDN9LAotICB7Imd0IiwgNH0sCi0gIHsibGUiLCA1fSwKLSAgeyJsdCIsIDZ9LAotICB7ImdlIiwgN30sCi0gIHsiaGkiLCA4fSwJeyJvdSIsIDh9LAotICB7ImxzIiwgOX0sCXsiaWIiLCA5fSwKLSAgeyJsbyIsIDEwfSwJeyJpbiIsIDEwfSwKLSAgeyJocyIsIDExfSwJeyJvYiIsIDExfSwKLSAgeyJiZSIsIDEyfSwJeyJ1ZSIsIDEyfSwKLSAgeyJuYiIsIDEzfSwJeyJsZyIsIDEzfSwKLSAgeyJoZSIsIDE0fSwJeyJ1ZyIsIDE0fSwKLSAgeyJuaCIsIDE1fSwJeyJ1bGUiLCAxNX0sCi0JCXsidWwiLCAxNn0sCi0JCXsidWdlIiwgMTd9LAotCi0gIHtOVUxMLCAwfSwKLX07Ci0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MgY25kbXNrW10gPQotewotICB7Imd0MCIsIDF9LAotICB7ImVxMCIsIDJ9LAotICB7ImdlMCIsIDN9LAotICB7Imx0MCIsIDEyfSwKLSAgeyJuZTAiLCAxM30sCi0gIHsibGUwIiwgMTR9LAotCi0gIHtOVUxMLCAwfSwKLX07Ci0KLXN0cnVjdCBtODhrX2luc24KLXsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgZW51bSByZWxvY190eXBlIHJlbG9jOwotfTsKLQotc3RhdGljIGNoYXIgKmdldF9iZiBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXRfY21wIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9jbmQgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2NyIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqcmVnbm9wKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2ZjciBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnJlZ25vcCkpOwotc3RhdGljIGNoYXIgKmdldF9pbW0xNiBQQVJBTVMgKChjaGFyICpwYXJhbSwgc3RydWN0IG04OGtfaW5zbiAqaW5zbikpOwotc3RhdGljIGNoYXIgKmdldF9vNiBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXRfcmVnIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqcmVnbm9wLCBpbnQgcmVnX3ByZWZpeCkpOwotc3RhdGljIGNoYXIgKmdldF92ZWM5IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldHZhbCBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgaW50ICp2YWxwKSk7Ci0KLXN0YXRpYyBjaGFyICpnZXRfcGNyIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuLAotCQkgICAgICBlbnVtIHJlbG9jX3R5cGUgcmVsb2MpKTsKLQotc3RhdGljIGludCBjYWxjb3AgUEFSQU1TICgoc3RydWN0IG04OGtfb3Bjb2RlICpmb3JtYXQsCi0JCQkgICBjaGFyICpwYXJhbSwgc3RydWN0IG04OGtfaW5zbiAqaW5zbikpOwotCi0KLWV4dGVybiBjaGFyICpteW5hbWU7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLS8qIFRoZXNlIGJpdHMgc2hvdWxkIGJlIHR1cm5lZCBvZmYgaW4gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgZXZlcnkgc2VnbWVudCAqLwotaW50IG1kX3NlZ19hbGlnbiA9IDc7Ci0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotCi0vKiBUaGVzZSBjaGFycyBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBhcyBpbiAwZjEyMy40NTYgKi8KLS8qIG9yICAgIDBIMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKSAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRGZGIjsKLQotZXh0ZXJuIHZvaWQgZmxvYXRfY29ucyAoKSwgY29ucyAoKSwgc19nbG9ibCAoKSwgc19zcGFjZSAoKSwKLSAgc19zZXQgKCksIHNfbGNvbW0gKCk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCA0fSwKLSAgeyJkZWYiLCBzX3NldCwgMH0sCi0gIHsiZGZsb2F0IiwgZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJmZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAotICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAotICB7ImhhbGYiLCBjb25zLCAyfSwKLSAgeyJic3MiLCBzX2xjb21tLCAxfSwKLSAgeyJzdHJpbmciLCBzdHJpbmdlciwgMH0sCi0gIHsid29yZCIsIGNvbnMsIDR9LAotICAvKiBGb3JjZSBzZXQgdG8gYmUgdHJlYXRlZCBhcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIHsic2V0IiwgTlVMTCwgMH0sCi0gIHsiLnNldCIsIHNfc2V0LCAwfSwKLSAgezB9Ci19OwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgLyogaW5pdGlhbGl6ZSBoYXNoIHRhYmxlICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIGxvb3AgdW50aWwgeW91IHNlZSB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCi0KLSAgd2hpbGUgKCptODhrX29wY29kZXNbaV0ubmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lID0gbTg4a19vcGNvZGVzW2ldLm5hbWU7Ci0KLSAgICAgIC8qIGhhc2ggZWFjaCBtbmVtb25pYyBhbmQgcmVjb3JkIGl0cyBwb3NpdGlvbiAqLwotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgJm04OGtfb3Bjb2Rlc1tpXSk7Ci0KLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQlhc19mYXRhbCAoXygiQ2FuJ3QgaGFzaCBpbnN0cnVjdGlvbiAnJXMnOiVzIiksCi0JCSAgbTg4a19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0KLSAgICAgIC8qIHNraXAgdG8gbmV4dCB1bmlxdWUgbW5lbW9uaWMgb3IgZW5kIG9mIGxpc3QgKi8KLQotICAgICAgZm9yIChpKys7ICFzdHJjbXAgKG04OGtfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKTsgaSsrKQotCTsKLSAgICB9Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotdm9pZAotbWRfYXNzZW1ibGUgKG9wKQotICAgICBjaGFyICpvcDsKLXsKLSAgY2hhciAqcGFyYW0sICp0aGlzZnJhZzsKLSAgY2hhciBjOwotICBzdHJ1Y3QgbTg4a19vcGNvZGUgKmZvcm1hdDsKLSAgc3RydWN0IG04OGtfaW5zbiBpbnNuOwotCi0gIGFzc2VydCAob3ApOwotCi0gIC8qIHNraXAgb3ZlciBpbnN0cnVjdGlvbiB0byBmaW5kIHBhcmFtZXRlcnMgKi8KLQotICBmb3IgKHBhcmFtID0gb3A7ICpwYXJhbSAhPSAwICYmICFpc3NwYWNlICgqcGFyYW0pOyBwYXJhbSsrKQotICAgIDsKLSAgYyA9ICpwYXJhbTsKLSAgKnBhcmFtKysgPSAnXDAnOwotCi0gIC8qIHRyeSB0byBmaW5kIHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgaGFzaCB0YWJsZSAqLwotCi0gIGlmICgoZm9ybWF0ID0gKHN0cnVjdCBtODhrX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG9wKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkludmFsaWQgbW5lbW9uaWMgJyVzJyIpLCBvcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHRyeSBwYXJzaW5nIHRoaXMgaW5zdHJ1Y3Rpb24gaW50byBpbnNuICovCi0KLSAgaW5zbi5leHAuWF9hZGRfc3ltYm9sID0gMDsKLSAgaW5zbi5leHAuWF9vcF9zeW1ib2wgPSAwOwotICBpbnNuLmV4cC5YX2FkZF9udW1iZXIgPSAwOwotICBpbnNuLmV4cC5YX29wID0gT19pbGxlZ2FsOwotICBpbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0KLSAgd2hpbGUgKCFjYWxjb3AgKGZvcm1hdCwgcGFyYW0sICZpbnNuKSkKLSAgICB7Ci0gICAgICAvKiBpZiBpdCBkb2Vzbid0IHBhcnNlIHRyeSB0aGUgbmV4dCBpbnN0cnVjdGlvbiAqLwotCi0gICAgICBpZiAoIXN0cmNtcCAoZm9ybWF0WzBdLm5hbWUsIGZvcm1hdFsxXS5uYW1lKSkKLQlmb3JtYXQrKzsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19mYXRhbCAoXygiUGFyYW1ldGVyIHN5bnRheCBlcnJvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIGdyb3cgdGhlIGN1cnJlbnQgZnJhZyBhbmQgcGxvcCBpbiB0aGUgb3Bjb2RlICovCi0KLSAgdGhpc2ZyYWcgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoaXNmcmFnLCBpbnNuLm9wY29kZSwgNCk7Ci0KLSAgLyogaWYgdGhpcyBpbnN0cnVjdGlvbiByZXF1aXJlcyBsYWJlbHMgbWFyayBpdCBmb3IgbGF0ZXIgKi8KLQotICBzd2l0Y2ggKGluc24ucmVsb2MpCi0gICAgewotICAgIGNhc2UgTk9fUkVMT0M6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfTE8xNjoKLSAgICBjYXNlIFJFTE9DX0hJMTY6Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIHRoaXNmcmFnIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyAyLAotCQkgICAyLAotCQkgICAmaW5zbi5leHAsCi0JCSAgIDAsCi0JCSAgIGluc24ucmVsb2MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0lXMTY6Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIHRoaXNmcmFnIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSAgIDQsCi0JCSAgICZpbnNuLmV4cCwKLQkJICAgMCwKLQkJICAgaW5zbi5yZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDIsCi0JCSAgIDIsCi0JCSAgICZpbnNuLmV4cCwKLQkJICAgMSwKLQkJICAgaW5zbi5yZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgNCwKLQkJICAgJmluc24uZXhwLAotCQkgICAxLAotCQkgICBpbnNuLnJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIHJlbG9jYXRpb24gdHlwZSIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGludAotY2FsY29wIChmb3JtYXQsIHBhcmFtLCBpbnNuKQotICAgICBzdHJ1Y3QgbTg4a19vcGNvZGUgKmZvcm1hdDsKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHN0cnVjdCBtODhrX2luc24gKmluc247Ci17Ci0gIGNoYXIgKmZtdCA9IGZvcm1hdC0+b3Bfc3BlYzsKLSAgaW50IGY7Ci0gIHVuc2lnbmVkIHZhbDsKLSAgdW5zaWduZWQgb3Bjb2RlOwotICBpbnQgcmVnX3ByZWZpeCA9ICdyJzsKLQotICBpbnNuLT5vcGNvZGUgPSBmb3JtYXQtPm9wY29kZTsKLSAgb3Bjb2RlID0gMDsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmIChwYXJhbSA9PSAwKQotCXJldHVybiAwOwotICAgICAgZiA9ICpmbXQrKzsKLSAgICAgIHN3aXRjaCAoZikKLQl7Ci0JY2FzZSAwOgotCSAgaW5zbi0+b3Bjb2RlIHw9IG9wY29kZTsKLQkgIHJldHVybiAoKnBhcmFtID09IDAgfHwgKnBhcmFtID09ICdcbicpOwotCi0JZGVmYXVsdDoKLQkgIGlmIChmICE9ICpwYXJhbSsrKQotCSAgICByZXR1cm4gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6Ci0JICBwYXJhbSA9IGdldF9yZWcgKHBhcmFtLCAmdmFsLCByZWdfcHJlZml4KTsKLQkgIHJlZ19wcmVmaXggPSAncic7Ci0JICBvcGNvZGUgfD0gdmFsIDw8IDIxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdvJzoKLQkgIHBhcmFtID0gZ2V0X282IChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gKCh2YWwgPj4gMikgPDwgNyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3gnOgotCSAgcmVnX3ByZWZpeCA9ICd4JzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMSc6Ci0JICBwYXJhbSA9IGdldF9yZWcgKHBhcmFtLCAmdmFsLCByZWdfcHJlZml4KTsKLQkgIHJlZ19wcmVmaXggPSAncic7Ci0JICBvcGNvZGUgfD0gdmFsIDw8IDE2OwotCSAgYnJlYWs7Ci0KLQljYXNlICcyJzoKLQkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsIHJlZ19wcmVmaXgpOwotCSAgcmVnX3ByZWZpeCA9ICdyJzsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJzMnOgotCSAgcGFyYW0gPSBnZXRfcmVnIChwYXJhbSwgJnZhbCwgJ3InKTsKLQkgIG9wY29kZSB8PSAodmFsIDw8IDE2KSB8IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6Ci0JICBwYXJhbSA9IGdldF9pbW0xNiAocGFyYW0sIGluc24pOwotCSAgYnJlYWs7Ci0KLQljYXNlICdiJzoKLQkgIHBhcmFtID0gZ2V0X2JmIChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICdwJzoKLQkgIHBhcmFtID0gZ2V0X3BjciAocGFyYW0sIGluc24sIFJFTE9DX1BDMTYpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdQJzoKLQkgIHBhcmFtID0gZ2V0X3BjciAocGFyYW0sIGluc24sIFJFTE9DX1BDMjYpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdCJzoKLQkgIHBhcmFtID0gZ2V0X2NtcCAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTSc6Ci0JICBwYXJhbSA9IGdldF9jbmQgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJ2MnOgotCSAgcGFyYW0gPSBnZXRfY3IgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWwgPDwgNTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBwYXJhbSA9IGdldF9mY3IgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWwgPDwgNTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVic6Ci0JICBwYXJhbSA9IGdldF92ZWM5IChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICc/JzoKLQkgIC8qIEhhdmluZyB0aGlzIGhlcmUgcmVwZWF0cyB0aGUgd2FybmluZyBzb210aW1lcy4KLQkgICBCdXQgY2FuJ3Qgd2Ugc3RhbmQgdGhhdD8gICovCi0JICBhc193YXJuIChfKCJVc2Ugb2Ygb2Jzb2xldGUgaW5zdHJ1Y3Rpb24iKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1tYXRjaF9uYW1lIChwYXJhbSwgYXNzb2NfdGFiLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyAqYXNzb2NfdGFiOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBuYW1lX2xlbjsKLQotICBmb3IgKGkgPSAwOzsgaSsrKQotICAgIHsKLSAgICAgIG5hbWUgPSBhc3NvY190YWJbaV0ubmFtZTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBuYW1lX2xlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoIXN0cm5jbXAgKHBhcmFtLCBuYW1lLCBuYW1lX2xlbikpCi0JewotCSAgKnZhbHAgPSBhc3NvY190YWJbaV0udmFsOwotCSAgcmV0dXJuIHBhcmFtICsgbmFtZV9sZW47Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3JlZyAocGFyYW0sIHJlZ25vcCwgcmVnX3ByZWZpeCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICpyZWdub3A7Ci0gICAgIGludCByZWdfcHJlZml4OwotewotICB1bnNpZ25lZCBjOwotICB1bnNpZ25lZCByZWdubzsKLQotICBjID0gKnBhcmFtKys7Ci0gIGlmIChjID09IHJlZ19wcmVmaXgpCi0gICAgewotICAgICAgcmVnbm8gPSAqcGFyYW0rKyAtICcwJzsKLSAgICAgIGlmIChyZWdubyA8IDEwKQotCXsKLQkgIGlmIChyZWdubyA9PSAwKQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IDA7Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JICBjID0gKnBhcmFtIC0gJzAnOwotCSAgaWYgKGMgPCAxMCkKLQkgICAgewotCSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArIGM7Ci0JICAgICAgaWYgKGMgPCAzMikKLQkJewotCQkgICpyZWdub3AgPSByZWdubzsKLQkJICByZXR1cm4gcGFyYW0gKyAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpyZWdub3AgPSByZWdubzsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKGMgPT0gJ3MnICYmIHBhcmFtWzBdID09ICdwJykKLSAgICB7Ci0gICAgICAqcmVnbm9wID0gMzE7Ci0gICAgICByZXR1cm4gcGFyYW0gKyAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2ltbTE2IChwYXJhbSwgaW5zbikKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHN0cnVjdCBtODhrX2luc24gKmluc247Ci17Ci0gIGVudW0gcmVsb2NfdHlwZSByZWxvYyA9IE5PX1JFTE9DOwotICB1bnNpZ25lZCBpbnQgdmFsOwotICBjaGFyICpzYXZlX3B0cjsKLQotICBpZiAoIXN0cm5jbXAgKHBhcmFtLCAiaGkxNiIsIDQpICYmICFpc2FsbnVtIChwYXJhbVs0XSkpCi0gICAgewotICAgICAgcmVsb2MgPSBSRUxPQ19ISTE2OwotICAgICAgcGFyYW0gKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChwYXJhbSwgImxvMTYiLCA0KSAmJiAhaXNhbG51bSAocGFyYW1bNF0pKQotICAgIHsKLSAgICAgIHJlbG9jID0gUkVMT0NfTE8xNjsKLSAgICAgIHBhcmFtICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmICghc3RybmNtcCAocGFyYW0sICJpdzE2IiwgNCkgJiYgIWlzYWxudW0gKHBhcmFtWzRdKSkKLSAgICB7Ci0gICAgICByZWxvYyA9IFJFTE9DX0lXMTY7Ci0gICAgICBwYXJhbSArPSA0OwotICAgIH0KLQotICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOwotICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7Ci0KLSAgdmFsID0gaW5zbi0+ZXhwLlhfYWRkX251bWJlcjsKLQotICBpZiAoaW5zbi0+ZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICAvKiBJbnNlcnQgdGhlIHZhbHVlIG5vdywgYW5kIHJlc2V0IHJlbG9jIHRvIE5PX1JFTE9DLiAgKi8KLSAgICAgIGlmIChyZWxvYyA9PSBOT19SRUxPQykKLQl7Ci0JICAvKiBXYXJuIGFib3V0IHRvbyBiaWcgZXhwcmVzc2lvbnMgaWYgbm90IHN1cnJvdW5kZWQgYnkgeHgxNi4gICovCi0JICBpZiAodmFsID4gMHhmZmZmKQotCSAgICBhc193YXJuIChfKCJFeHByZXNzaW9uIHRydW5jYXRlZCB0byAxNiBiaXRzIikpOwotCX0KLQotICAgICAgaWYgKHJlbG9jID09IFJFTE9DX0hJMTYpCi0JdmFsID4+PSAxNjsKLQotICAgICAgaW5zbi0+b3Bjb2RlIHw9IHZhbCAmIDB4ZmZmZjsKLSAgICAgIHJlbG9jID0gTk9fUkVMT0M7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvYyA9PSBOT19SRUxPQykKLSAgICAvKiBXZSBhY2NlcHQgYSBzeW1ib2wgZXZlbiB3aXRob3V0IGxvMTYsIGhpMTYsIGV0YywgYW5kIGFzc3VtZQotICAgICAgIGxvMTYgd2FzIGludGVuZGVkLiAgKi8KLSAgICByZWxvYyA9IFJFTE9DX0xPMTY7Ci0KLSAgaW5zbi0+cmVsb2MgPSByZWxvYzsKLQotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9wY3IgKHBhcmFtLCBpbnNuLCByZWxvYykKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHN0cnVjdCBtODhrX2luc24gKmluc247Ci0gICAgIGVudW0gcmVsb2NfdHlwZSByZWxvYzsKLXsKLSAgY2hhciAqc2F2ZXB0ciwgKnNhdmVwYXJhbTsKLQotICBzYXZlcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLQotICBleHByZXNzaW9uICgmaW5zbi0+ZXhwKTsKLQotICBzYXZlcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVwdHI7Ci0KLSAgLyogQm90Y2g6IFdlIHNob3VsZCByZWxvY2F0ZSBub3cgaWYgT19jb25zdGFudC4gICovCi0gIGluc24tPnJlbG9jID0gcmVsb2M7Ci0KLSAgcmV0dXJuIHNhdmVwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2NtcCAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgdW5zaWduZWQgaW50IHZhbDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgc2F2ZV9wdHIgPSBwYXJhbTsKLQotICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBjbXBzbG90LCB2YWxwKTsKLSAgdmFsID0gKnZhbHA7Ci0KLSAgaWYgKHBhcmFtID09IE5VTEwpCi0gICAgewotICAgICAgcGFyYW0gPSBzYXZlX3B0cjsKLQotICAgICAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgICAgIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICAgICAgaWYgKHZhbCA+PSAzMikKLQl7Ci0JICBhc193YXJuIChfKCJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA1IGJpdHMiKSk7Ci0JICB2YWwgJT0gMzI7Ci0JfQotICAgIH0KLQotICAqdmFscCA9IHZhbCA8PCAyMTsKLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfY25kIChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCBpbnQgdmFsOwotCi0gIGlmIChpc2RpZ2l0ICgqcGFyYW0pKQotICAgIHsKLSAgICAgIHBhcmFtID0gZ2V0dmFsIChwYXJhbSwgJnZhbCk7Ci0KLSAgICAgIGlmICh2YWwgPj0gMzIpCi0JewotCSAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gNSBiaXRzIikpOwotCSAgdmFsICU9IDMyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKnBhcmFtKSkKLQkqcGFyYW0gPSB0b2xvd2VyICgqcGFyYW0pOwotCi0gICAgICBpZiAoaXN1cHBlciAocGFyYW1bMV0pKQotCXBhcmFtWzFdID0gdG9sb3dlciAocGFyYW1bMV0pOwotCi0gICAgICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBjbmRtc2ssIHZhbHApOwotCi0gICAgICBpZiAocGFyYW0gPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgdmFsID0gKnZhbHA7Ci0gICAgfQotCi0gICp2YWxwID0gdmFsIDw8IDIxOwotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9iZjIgKHBhcmFtLCBiYykKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIGludCBiYzsKLXsKLSAgaW50IGRlcHRoID0gMDsKLSAgaW50IGM7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjID0gKnBhcmFtOwotICAgICAgaWYgKGMgPT0gMCkKLQlyZXR1cm4gcGFyYW07Ci0gICAgICBlbHNlIGlmIChjID09ICcoJykKLQlkZXB0aCsrOwotICAgICAgZWxzZSBpZiAoYyA9PSAnKScpCi0JZGVwdGgtLTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gYmMgJiYgZGVwdGggPD0gMCkKLQlyZXR1cm4gcGFyYW07Ci0gICAgICBwYXJhbSsrOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2JmX29mZnNldF9leHByZXNzaW9uIChwYXJhbSwgb2Zmc2V0cCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICpvZmZzZXRwOwotewotICB1bnNpZ25lZCBvZmZzZXQ7Ci0KLSAgaWYgKGlzYWxwaGEgKHBhcmFtWzBdKSkKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAocGFyYW1bMF0pKQotCXBhcmFtWzBdID0gdG9sb3dlciAocGFyYW1bMF0pOwotICAgICAgaWYgKGlzdXBwZXIgKHBhcmFtWzFdKSkKLQlwYXJhbVsxXSA9IHRvbG93ZXIgKHBhcmFtWzFdKTsKLQotICAgICAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgY21wc2xvdCwgb2Zmc2V0cCk7Ci0KLSAgICAgIHJldHVybiBwYXJhbTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgICAgIG9mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gICpvZmZzZXRwID0gb2Zmc2V0OwotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9iZiAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgdW5zaWduZWQgb2Zmc2V0ID0gMDsKLSAgdW5zaWduZWQgd2lkdGggPSAwOwotICBjaGFyICp4cDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgeHAgPSBnZXRfYmYyIChwYXJhbSwgJzwnKTsKLQotICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gIGlmICgqeHAgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBkaWQgbm90IGZpbmQgJzwnLiAgV2UgaGF2ZSBhbiBvZmZzZXQgKHdpZHRoIGltcGxpY2l0bHkgMzIpLiAgKi8KLSAgICAgIHBhcmFtID0gZ2V0X2JmX29mZnNldF9leHByZXNzaW9uIChwYXJhbSwgJm9mZnNldCk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLSAgICAgIGlmIChwYXJhbSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICp4cCsrID0gMDsJCS8qIE92ZXJ3cml0ZSB0aGUgJzwnICovCi0gICAgICBwYXJhbSA9IGdldF9iZjIgKHhwLCAnPicpOwotICAgICAgaWYgKCpwYXJhbSA9PSAwKQotCXJldHVybiBOVUxMOwotICAgICAgKnBhcmFtKysgPSAwOwkJLyogT3ZlcndyaXRlIHRoZSAnPicgKi8KLQotICAgICAgd2lkdGggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHhwID0gZ2V0X2JmX29mZnNldF9leHByZXNzaW9uICh4cCwgJm9mZnNldCk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICAgICAgaWYgKHhwICsgMSAhPSBwYXJhbSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgKnZhbHAgPSAoKHdpZHRoICUgMzIpIDw8IDUpIHwgKG9mZnNldCAlIDMyKTsKLQotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9jciAocGFyYW0sIHJlZ25vcCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICpyZWdub3A7Ci17Ci0gIHVuc2lnbmVkIHJlZ25vOwotICB1bnNpZ25lZCBjOwotCi0gIGlmICghc3RybmNtcCAocGFyYW0sICJjciIsIDIpKQotICAgIHsKLSAgICAgIHBhcmFtICs9IDI7Ci0KLSAgICAgIHJlZ25vID0gKnBhcmFtKysgLSAnMCc7Ci0gICAgICBpZiAocmVnbm8gPCAxMCkKLQl7Ci0JICBpZiAocmVnbm8gPT0gMCkKLQkgICAgewotCSAgICAgICpyZWdub3AgPSAwOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCSAgYyA9ICpwYXJhbSAtICcwJzsKLQkgIGlmIChjIDwgMTApCi0JICAgIHsKLQkgICAgICByZWdubyA9IHJlZ25vICogMTAgKyBjOwotCSAgICAgIGlmIChjIDwgNjQpCi0JCXsKLQkJICAqcmVnbm9wID0gcmVnbm87Ci0JCSAgcmV0dXJuIHBhcmFtICsgMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gcmVnbm87Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNyX3JlZ3MsIHJlZ25vcCk7Ci0KLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfZmNyIChwYXJhbSwgcmVnbm9wKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnJlZ25vcDsKLXsKLSAgdW5zaWduZWQgcmVnbm87Ci0gIHVuc2lnbmVkIGM7Ci0KLSAgaWYgKCFzdHJuY21wIChwYXJhbSwgImZjciIsIDMpKQotICAgIHsKLSAgICAgIHBhcmFtICs9IDM7Ci0KLSAgICAgIHJlZ25vID0gKnBhcmFtKysgLSAnMCc7Ci0gICAgICBpZiAocmVnbm8gPCAxMCkKLQl7Ci0JICBpZiAocmVnbm8gPT0gMCkKLQkgICAgewotCSAgICAgICpyZWdub3AgPSAwOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCSAgYyA9ICpwYXJhbSAtICcwJzsKLQkgIGlmIChjIDwgMTApCi0JICAgIHsKLQkgICAgICByZWdubyA9IHJlZ25vICogMTAgKyBjOwotCSAgICAgIGlmIChjIDwgNjQpCi0JCXsKLQkJICAqcmVnbm9wID0gcmVnbm87Ci0JCSAgcmV0dXJuIHBhcmFtICsgMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gcmVnbm87Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGZjcl9yZWdzLCByZWdub3ApOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3ZlYzkgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIHZhbDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gIGlmICh2YWwgPj0gMSA8PCA5KQotICAgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDkgYml0cyIpKTsKLQotICAqdmFscCA9IHZhbCAlICgxIDw8IDkpOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X282IChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCB2YWw7Ci0gIGNoYXIgKnNhdmVfcHRyOwotCi0gIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICBpZiAodmFsICYgMHgzKQotICAgIGFzX3dhcm4gKF8oIlJlbW92ZWQgbG93ZXIgMiBiaXRzIG9mIGV4cHJlc3Npb24iKSk7Ci0KLSAgKnZhbHAgPSB2YWw7Ci0KLSAgcmV0dXJuKHBhcmFtKTsKLX0KLQotI2RlZmluZSBoZXh2YWwoeikgXAotICAoaXNkaWdpdCAoeikgPyAoeikgLSAnMCcgOgkJCQkJCVwKLSAgIGlzbG93ZXIgKHopID8gKHopIC0gJ2EnICsgMTAgOiAJCQkJCVwKLSAgIGlzdXBwZXIgKHopID8gKHopIC0gJ0EnICsgMTAgOiAtMSkKLQotc3RhdGljIGNoYXIgKgotZ2V0dmFsIChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkIGludCAqdmFscDsKLXsKLSAgdW5zaWduZWQgaW50IHZhbCA9IDA7Ci0gIHVuc2lnbmVkIGludCBjOwotCi0gIGMgPSAqcGFyYW0rKzsKLSAgaWYgKGMgPT0gJzAnKQotICAgIHsKLSAgICAgIGMgPSAqcGFyYW0rKzsKLSAgICAgIGlmIChjID09ICd4JyB8fCBjID09ICdYJykKLQl7Ci0JICBjID0gKnBhcmFtKys7Ci0JICBjID0gaGV4dmFsIChjKTsKLQkgIHdoaWxlIChjIDwgMTYpCi0JICAgIHsKLQkgICAgICB2YWwgPSB2YWwgKiAxNiArIGM7Ci0JICAgICAgYyA9ICpwYXJhbSsrOwotCSAgICAgIGMgPSBoZXh2YWwgKGMpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGMgLT0gJzAnOwotCSAgd2hpbGUgKGMgPCA4KQotCSAgICB7Ci0JICAgICAgdmFsID0gdmFsICogOCArIGM7Ci0JICAgICAgYyA9ICpwYXJhbSsrIC0gJzAnOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgLT0gJzAnOwotICAgICAgd2hpbGUgKGMgPCAxMCkKLQl7Ci0JICB2YWwgPSB2YWwgKiAxMCArIGM7Ci0JICBjID0gKnBhcmFtKysgLSAnMCc7Ci0JfQotICAgIH0KLQotICAqdmFscCA9IHZhbDsKLSAgcmV0dXJuIHBhcmFtIC0gMTsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbmJ5dGVzKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuYnl0ZXMpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIHJvdXRpbmUgaXMgbmV2ZXIgY2FsbGVkLiAgV2hhdCBpcyBpdCBmb3I/Ci0gICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCAxMyBKdWwgMTk5MyAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbmJ5dGVzLCBmaXhQLCBzZWdfdHlwZSkKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotICAgICBpbnQgbmJ5dGVzOwotICAgICBmaXhTICpmaXhQOwotICAgICBpbnQgc2VnX3R5cGU7Ci17Ci0gIGlmIChzZWdfdHlwZSAhPSBOX1RFWFQgfHwgZml4UC0+Znhfcl90eXBlID09IE5PX1JFTE9DKQotICAgIHsKLSAgICAgIHN3aXRjaCAobmJ5dGVzKQotCXsKLQljYXNlIDQ6Ci0JICAqYnVmKysgPSB2YWwgPj4gMjQ7Ci0JICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0JY2FzZSAyOgotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JY2FzZSAxOgotCSAgKmJ1ZiA9IHZhbDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUkVMT0NfSVcxNjoKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0xPMTY6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlsxXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19ISTE2OgotICAgICAgYnVmWzBdID0gdmFsID4+IDI0OwotICAgICAgYnVmWzFdID0gdmFsID4+IDE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICB2YWwgKz0gNDsKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICB2YWwgKz0gNDsKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDI2KSAmIDB4MDM7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTg7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gMTA7Ci0gICAgICBidWZbM10gPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIkJhZCByZWxvY2F0aW9uIHR5cGUiKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLXZvaWQKLW1kX251bWJlcl90b19kaXNwIChidWYsIHZhbCwgbmJ5dGVzKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCB2YWw7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9udW1iZXJfdG9fZGlzcCBub3QgZGVmaW5lZCIpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbmJ5dGVzKTsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2ZpZWxkIChidWYsIHZhbCwgbmJ5dGVzKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCB2YWw7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9udW1iZXJfdG9fZmllbGQgbm90IGRlZmluZWQiKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG5ieXRlcyk7Ci19Ci0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSA0OwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHB0clswXSA9IChjaGFyKSAweGMwOwotICBwdHJbMV0gPSAweDAwOwotICBwdHJbMl0gPSAweDAwOwotICBwdHJbM10gPSAweDAwOwotICBmaXhfbmV3IChmcmFnLAotCSAgIHB0ciAtIGZyYWctPmZyX2xpdGVyYWwsCi0JICAgNCwKLQkgICB0b19zeW1ib2wsCi0JICAgKG9mZnNldFQpIDAsCi0JICAgMCwKLQkgICBSRUxPQ19QQzI2KTsJCS8qIEJvdGNoOiBTaG91bGRuJ3QgdGhpcyBiZSBSRUxPQ19QQzE2PyAqLwotfQotCi1pbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA0OwotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgcHRyWzBdID0gKGNoYXIpIDB4YzA7Ci0gIHB0clsxXSA9IDB4MDA7Ci0gIHB0clsyXSA9IDB4MDA7Ci0gIHB0clszXSA9IDB4MDA7Ci0gIGZpeF9uZXcgKGZyYWcsCi0JICAgcHRyIC0gZnJhZy0+ZnJfbGl0ZXJhbCwKLQkgICA0LAotCSAgIHRvX3N5bWJvbCwKLQkgICAob2Zmc2V0VCkgMCwKLQkgICAwLAotCSAgIFJFTE9DX1BDMjYpOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBhc19mYXRhbCAoXygiUmVsYXhhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIiKSk7Ci0gIHJldHVybiAoLTEpOwotfQotCi0jaWYgMAotCi0vKiBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhpcyByb3V0aW5lIGlzIG5ldmVyIGNhbGxlZC4gIFdoYXQgaXMgaXQKLSAgIGRvaW5nIGhlcmU/Ci0gICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCAxMyBKdWwgMTk5MyAqLwotCi0KLS8qCi0gKiBSaXNjIHJlbG9jYXRpb25zIGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudCwgc28gaXQgbmVlZHMKLSAqIHRoaXMgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZSB0byBlbWl0IHRoZW0uCi0gKi8KLXZvaWQKLWVtaXRfcmVsb2NhdGlvbnMgKGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgc3RydWN0IHJlbG9jX2luZm9fbTg4ayByaTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZXh0ZXJuIGNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7Ci0KLSAgYnplcm8gKChjaGFyICopICZyaSwgc2l6ZW9mIChyaSkpOwotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA+PSBOT19SRUxPQykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJmaXhQLT5meF9yX3R5cGUgPSAlZFxuIiwgZml4UC0+Znhfcl90eXBlKTsKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaWYgKChzeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kpICE9IE5VTEwpCi0JewotCSAgcmkucl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArCi0JICAgIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci0JICBpZiAoKHN5bWJvbFAtPnN5X3R5cGUgJiBOX1RZUEUpID09IE5fVU5ERikKLQkgICAgewotCSAgICAgIHJpLnJfZXh0ZXJuID0gMTsKLQkgICAgICByaS5yX3N5bWJvbG51bSA9IHN5bWJvbFAtPnN5X251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmkucl9leHRlcm4gPSAwOwotCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gc3ltYm9sUC0+c3lfdHlwZSAmIE5fVFlQRTsKLQkgICAgfQotCSAgaWYgKHN5bWJvbFAgJiYgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfYWRkcmVzczsKLQkgICAgfQotCSAgcmkucl90eXBlID0gZml4UC0+Znhfcl90eXBlOwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgLT0gcmkucl9hZGRyZXNzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLQkgICAgfQotCi0JICBhcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCAoY2hhciAqKSAmcmksIHNpemVvZiAocmkpKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwotCi0jaWYgMAotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIHN1YnN1bWVkIGJ5IHNfbGNvbW0gaW4gcmVhZC5jLgotICAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQgMTMgSnVsIDE5OTMgKi8KLQotCi1zdGF0aWMgdm9pZAotc19ic3MgKCkKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBpbnQgdGVtcCwgYnNzX2FsaWduOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJTUyBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGJzc19hbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIGJzc19hbGlnbiA9IDA7Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQoc3ltYm9sUCkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQoc3ltYm9sUCkgPT0gU0VHX0JTUykKLSAgICB7Ci0gICAgICBpZiAoISBuZWVkX3Bhc3NfMikKLQl7Ci0JICBjaGFyICpwOwotCSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0JICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCSAgc3Vic2VnX3NldCAoU0VHX0JTUywgMSk7IC8qIHN3aXRjaCB0byBic3MJKi8KLQotCSAgaWYgKGJzc19hbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYnNzX2FsaWduLCAwLCAwKTsKLQotCSAgLyogZGV0YWNoIGZyb20gb2xkIGZyYWcgKi8KLQkgIGlmIChzeW1ib2xQLT5zeV90eXBlID09IE5fQlNTICYmIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgIT0gTlVMTCkKLQkgICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gTlVMTDsKLQotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0JICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAotCQkJKG9mZnNldFQpIHRlbXAsIChjaGFyICopMCk7Ci0JICAqcCA9IDA7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfQlNTKTsKLQotCSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybiAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sICVzLiIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLSNpZmRlZiBNODhLQ09GRgotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5lZWRlZCBpZiB3ZSBhcmUgbGlua2luZyB3aXRoIG9iai1jb2ZmYmZkLmMuCi0gICBUaGF0IGZpbGUgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgbW9yZSBCRkQgb3JpZW50ZWQgdmVyc2lvbiBhdCBzb21lCi0gICBwb2ludC4gIElmIHRoYXQgaGFwcGVucywgdGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSByZXhhbWluZWQuCi0KLSAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCAxMyBKdWx5IDE5OTMuICAqLwotCi0vKiBHaXZlbiBhIGZpeFMgc3RydWN0dXJlIChjcmVhdGVkIGJ5IGEgY2FsbCB0byBmaXhfbmV3LCBhYm92ZSksCi0gICByZXR1cm4gdGhlIEJGRCByZWxvY2F0aW9uIHR5cGUgdG8gdXNlIGZvciBpdC4gICovCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUkVMT0NfTE8xNjoKLSAgICAgIHJldHVybiBSX0xWUlQxNjsKLSAgICBjYXNlIFJFTE9DX0hJMTY6Ci0gICAgICByZXR1cm4gUl9IVlJUMTY7Ci0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgcmV0dXJuIFJfUENSMTZMOwotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIHJldHVybiBSX1BDUjI2TDsKLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgcmV0dXJuIFJfVlJUMzI7Ci0gICAgY2FzZSBSRUxPQ19JVzE2OgotICAgICAgcmV0dXJuIFJfVlJUMTY7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogQXBwbHkgYSBmaXhTIHRvIHRoZSBvYmplY3QgZmlsZS4gIFNpbmNlIENPRkYgZG9lcyBub3QgdXNlIGFkZGVuZHMKLSAgIGluIHJlbG9jcywgdGhlIGFkZGVuZCBpcyBhY3R1YWxseSBzdG9yZWQgZGlyZWN0bHkgaW4gdGhlIG9iamVjdAotICAgZmlsZSBpdHNlbGYuICAqLwotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeHAsIHZhbCkKLSAgICAgZml4UyAqZml4cDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBidWYgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gIGZpeHAtPmZ4X29mZnNldCA9IDA7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUkVMT0NfSVcxNjoKLSAgICAgIGZpeHAtPmZ4X29mZnNldCA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0xPMTY6Ci0gICAgICBmaXhwLT5meF9vZmZzZXQgPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlsxXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19ISTE2OgotICAgICAgZml4cC0+Znhfb2Zmc2V0ID0gdmFsID4+IDE2OwotICAgICAgYnVmWzBdID0gdmFsID4+IDg7Ci0gICAgICBidWZbMV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICBidWZbMF0gfD0gKHZhbCA+PiAyNikgJiAweDAzOwotICAgICAgYnVmWzFdID0gdmFsID4+IDE4OwotICAgICAgYnVmWzJdID0gdmFsID4+IDEwOwotICAgICAgYnVmWzNdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfMzI6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogV2hlcmUgYSBQQyByZWxhdGl2ZSBvZmZzZXQgaXMgY2FsY3VsYXRlZCBmcm9tLiAgT24gdGhlIG04OGsgdGhleQotICAgYXJlIGNhbGN1bGF0ZWQgZnJvbSBqdXN0IGFmdGVyIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlIC0gMjsKLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFdoZW4gd2UgYWxpZ24gdGhlIC5pbml0IHNlY3Rpb24sIGluc2VydCB0aGUgY29ycmVjdCBOT1AgcGF0dGVybi4gICovCi0KLWludAotbTg4a19kb19hbGlnbiAobiwgZmlsbCwgbWF4LCBsZW4pCi0gICAgIGludCBuOwotICAgICBjb25zdCBjaGFyICpmaWxsOwotICAgICBpbnQgbGVuOwotICAgICBpbnQgbWF4OwotewotICBpZiAoZmlsbCA9PSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG9ial9zZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmluaXQiKSA9PSAwKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vcF9wYXR0ZXJuW10gPSB7IDB4ZjQsIDB4MDAsIDB4NTgsIDB4MDAgfTsKLSAgICAgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbm9wX3BhdHRlcm4sIHNpemVvZiAobm9wX3BhdHRlcm4pLCBtYXgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIE04OEtDT0ZGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW04OGsuaCBiL2dhcy9jb25maWcvdGMtbTg4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZiNjk3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTg4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIG04OGsuaCAtLSBBc3NlbWJsZXIgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAotICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5Ci0gICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19NODhLCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWZkZWYgTTg4S0NPRkYKLSNkZWZpbmUgQ09GRl9NQUdJQyBNQzg4T01BR0lDCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX204OGsKLSNkZWZpbmUgQ09GRl9GTEFHUyBGX0FSMzJXCi0jZW5kaWYKLQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotI2RlZmluZSBUQ19LRUVQX0ZYX09GRlNFVAotI2RlZmluZSBUQ19DT05TX1JFTE9DIFJFTE9DXzMyCi0KLS8qIGRpZmZlcmVudCB0eXBlIG9mIHJlbG9jYXRpb24gYXZhaWxhYmxlIGluIHRoZSBtODhrICovCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSRUxPQ19MTzE2LAkJCS8qIGxvMTYoc3ltKSAqLwotICBSRUxPQ19ISTE2LAkJCS8qIGhpMTYoc3ltKSAqLwotICBSRUxPQ19QQzE2LAkJCS8qIGJiMCwgYmIxLCBiY25kICovCi0gIFJFTE9DX1BDMjYsCQkJLyogYnIsIGJzciAqLwotICBSRUxPQ18zMiwJCQkvKiBqdW1wIHRhYmxlcywgZXRjICovCi0gIFJFTE9DX0lXMTYsCQkJLyogZ2xvYmFsIGFjY2VzcyB0aHJvdWdoIGxpbmtlciByZWdzIDI4ICovCi0gIE5PX1JFTE9DCi19OwotCi1zdHJ1Y3QgcmVsb2NfaW5mb19tODhrCi17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgdW5zaWduZWQgaW50IHJfcGFkOjM7Ci0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU6NDsKLSAgbG9uZyBpbnQgcl9hZGRlbmQ7Ci19OwotCi0jZGVmaW5lIHJlbG9jYXRpb25faW5mbyByZWxvY19pbmZvX204OGsKLQotLyogVGhlIG04OGsgdXNlcyAnQCcgdG8gc3RhcnQgbG9jYWwgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTEVYX0FUIChMRVhfQkVHSU5fTkFNRSB8IExFWF9OQU1FKQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgXAotICAoKG5hbWVbMF0gPT0nQCcgJiYgKG5hbWUgWzFdID09ICdMJyB8fCBuYW1lIFsxXSA9PSAnLicpKSBcCi0gICB8fCAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnMCcgJiYgbmFtZVsyXSA9PSAnXDAwMScpKQotI2VuZGlmCi0KLS8qIFRoZSBtODhrIHVzZXMgcHNldWRvLW9wcyB3aXRoIG5vIGxlYWRpbmcgcGVyaW9kLiAgKi8KLSNkZWZpbmUgTk9fUFNFVURPX0RPVAotCi0vKiBEb24ndCB3YXJuIG9uIHdvcmQgb3ZlcmZsb3c7IGl0IGhhcHBlbnMgb24gJWhpIHJlbG9jcy4gICovCi0jdW5kZWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRAotCi0jZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhiLHMsZikJCXthc19mYXRhbCAoXygibTg4ayBjb252ZXJ0X2ZyYWdcbiIpKTt9Ci0KLS8qIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotI2RlZmluZSBtZF91bmRlZmluZWRfc3ltYm9sKHMpIDAKLQotLyogV2UgaGF2ZSBubyBzcGVjaWFsIG9wZXJhbmQgaGFuZGxpbmcuICAqLwotI2RlZmluZSBtZF9vcGVyYW5kKGUpCi0KLSNpZmRlZiBNODhLQ09GRgotCi0vKiBXaGV0aGVyIGEgcmVsb2Mgc2hvdWxkIGJlIG91dHB1dC4gICovCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKGZpeHApICgoZml4cCktPmZ4X2FkZHN5ICE9IE5VTEwpCi0KLS8qIEdldCB0aGUgQkZEIHJlbG9jIHR5cGUgdG8gdXNlIGZvciBhIGdhcyBmaXhTIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeHApIHRjX2NvZmZfZml4MnJ0eXBlIChmaXhwKQotCi0vKiBObyBzcGVjaWFsIGhvb2sgbmVlZGVkIGZvciBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKHMpCi0KLS8qIEFsaWduIHNlY3Rpb25zIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpCSgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLSNlbmRpZgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpCW1heCAoc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgKFNFRyldLCA0KQotCi0vKiBXZSB1c2UgYSBzcGVjaWFsIGFsaWdubWVudCBmdW5jdGlvbiB0byBpbnNlcnQgdGhlIGNvcnJlY3Qgbm9wCi0gICBwYXR0ZXJuIGluIC5pbml0LiAgKi8KLWV4dGVybiBpbnQgbTg4a19kb19hbGlnbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLSNkZWZpbmUgbWRfZG9fYWxpZ24obixmaWxsLGxlbixtYXgsbCkgaWYgKG04OGtfZG9fYWxpZ24obixmaWxsLG1heCxsZW4pKSBnb3RvIGwKLQotI2VuZGlmIC8qIE04OEtDT0ZGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1jb3JlLmMgYi9nYXMvY29uZmlnL3RjLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjNhNzMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3MyArMCwwIEBACi0vKiB0Yy1tY29yZS5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIE0qQ29yZQotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIi4uL29wY29kZXMvbWNvcmUtb3BjLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLSNlbmRpZgotCi0jaWZuZGVmIHN0cmVxCi0jZGVmaW5lIHN0cmVxKGEsYikgKHN0cmNtcCAoYSwgYikgPT0gMCkKLSNlbmRpZgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZHVtYiBjb21waWxlcnMuICAqLwotc3RhdGljIHZvaWQgICBtY29yZV9zX2xpdGVyYWxzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfZmlsbCAgIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCAgICBsb2cyIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9yZWcgICAgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX2NyZWcgICBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkICopKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfZXhwICAgIFBBUkFNUyAoKGNoYXIgKiwgZXhwcmVzc2lvblMgKikpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9ydCAgICAgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqLCBpbnQsIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfaW1tICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX21lbSAgICBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkICosIHVuc2lnbmVkICosIHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCAgIG1ha2VfbmFtZSBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50ICAgIGVudGVyX2xpdGVyYWwgUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCAgIGR1bXBfbGl0ZXJhbHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIGNoZWNrX2xpdGVyYWxzIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfdGV4dCAgICBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfc19kYXRhICAgIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfYnNzICAgICBQQVJBTVMgKChpbnQpKTsKLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfY29tbSAgICBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi0vKiBTZXZlcmFsIHBsYWNlcyBpbiB0aGlzIGZpbGUgaW5zZXJ0IHJhdyBpbnN0cnVjdGlvbnMgaW50byB0aGUKLSAgIG9iamVjdC4gVGhleSBzaG91bGQgdXNlIE1DT1JFX0lOU1RfWFhYIG1hY3JvcyB0byBnZXQgdGhlIG9wY29kZXMKLSAgIGFuZCB0aGVuIHVzZSB0aGVzZSB0d28gbWFjcm9zIHRvIGNyYWNrIHRoZSBNQ09SRV9JTlNUIHZhbHVlIGludG8KLSAgIHRoZSBhcHByb3ByaWF0ZSBieXRlIHZhbHVlcy4gICovCi0jZGVmaW5lCUlOU1RfQllURTAoeCkgICgoKHgpID4+IDgpICYgMHhGRikKLSNkZWZpbmUJSU5TVF9CWVRFMSh4KSAgKCh4KSAmIDB4RkYpCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMvIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIy8iOwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7Ci0KLXN0YXRpYyBpbnQgZG9fanNyaTJic3IgPSAwOwkvKiBjaGFuZ2UgaGVyZSBmcm9tIDEgYnkgQ3J1ZXNzIDE5IEF1Z3VzdCA5NyAqLwotc3RhdGljIGludCBzaWZpbHRlcl9tb2RlID0gMDsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotI2RlZmluZSBDKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQotI2RlZmluZSBHRVRfV0hBVCh4KSAgICAoKHggPj4gMikpCi0KLS8qIFRoZXNlIGFyZSB0aGUgdHdvIHR5cGVzIG9mIHJlbGF4YWJsZSBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBDT05EX0pVTVAgIDEKLSNkZWZpbmUgVU5DRF9KVU1QICAyCi0KLSNkZWZpbmUgVU5ERUZfRElTUCAgICAgIDAKLSNkZWZpbmUgQ09ORDEyICAgICAgICAgIDEKLSNkZWZpbmUgQ09ORDMyICAgICAgICAgIDIKLSNkZWZpbmUgVU5DRDEyICAgICAgICAgIDEKLSNkZWZpbmUgVU5DRDMyICAgICAgICAgIDIKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDQKLSNkZWZpbmUgRU5EICAgICAgICAgICAgIDUKLQotI2RlZmluZSBDMTJfTEVOCSAgICAgICAgMgotI2RlZmluZSBDMzJfTEVOCSAgICAgICAxMAkvKiBhbGxvdyBmb3IgYWxpZ24gKi8KLSNkZWZpbmUgVTEyX0xFTgkgICAgICAgIDIKLSNkZWZpbmUgVTMyX0xFTgkgICAgICAgIDgJLyogYWxsb3cgZm9yIGFsaWduICovCi0KLQotLyogSW5pdGlhbGl6ZSB0aGUgcmVsYXggdGFibGUgKi8KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMDogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDE6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAyOiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMzogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDQ6IHVudXNlZCAqLyAgCi17IDIwNDgsIC0yMDQ2LCBDMTJfTEVOLCBDKENPTkRfSlVNUCwgQ09ORDMyKSB9LAkvKiA1OiBDKENPTkRfSlVNUCwgQ09ORDEyKSAqLwoteyAgICAwLCAgICAgMCwgQzMyX0xFTiwgMCB9LAkJCS8qIDY6IEMoQ09ORF9KVU1QLCBDT05EMzIpICovCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiA3OiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogODogdW51c2VkICovICAKLXsgMjA0OCwgLTIwNDYsIFUxMl9MRU4sIEMoVU5DRF9KVU1QLCBVTkNEMzIpIH0sCS8qIDk6IEMoVU5DRF9KVU1QLCBVTkNEMTIpICovCi17ICAgIDAsICAgICAwLCBVMzJfTEVOLCAwIH0sCQkJLyoxMDogQyhVTkNEX0pVTVAsIFVOQ0QzMikgKi8KLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qMTE6IHVudXNlZCAqLyAgCi17ICAgIDAsICAgICAwLAkgICAgIDAsIDAgfQkJCS8qMTI6IHVudXNlZCAqLyAgCi19OwotCi0vKiBMSVRFUkFMIFBPT0wgREFUQSBTVFJVQ1RVUkVTICovCi1zdHJ1Y3QgbGl0ZXJhbAotewotICB1bnNpZ25lZCBzaG9ydCAgcmVmY250OwotICB1bnNpZ25lZCBjaGFyCSAgaXNwY3JlbDsKLSAgdW5zaWduZWQgY2hhcgkgIHVudXNlZDsKLSAgZXhwcmVzc2lvblMJICBlOwotfTsKLQotI2RlZmluZSBNQVhfUE9PTF9TSVpFCSgxMDI0LzQpCi1zdGF0aWMgc3RydWN0IGxpdGVyYWwgbGl0cG9vbCBbTUFYX1BPT0xfU0laRV07Ci1zdGF0aWMgdW5zaWduZWQgcG9vbHNpemU7Ci1zdGF0aWMgdW5zaWduZWQgcG9vbG51bWJlcjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvb2xzcGFuOwotCi0vKiBTUEFOUEFOSUM6IHRoZSBwb2ludCBhdCB3aGljaCB3ZSBnZXQgdG9vIHNjYXJlZCBhbmQgZm9yY2UgYSBkdW1wCi0gICBvZiB0aGUgbGl0ZXJhbCBwb29sLCBhbmQgcGVyaGFwcyBwdXQgYSBicmFuY2ggaW4gcGxhY2UuCi0gICBDYWxjdWxhdGVkIGFzOgotICAJCSAxMDI0CXNwYW4gb2YgbHJ3L2ptcGkvanNyaSBpbnNuIChhY3R1YWxseSBzcGFuKzEpCi0gIAkJLTIJcG9zc2libGUgYWxpZ25tZW50IGF0IHRoZSBpbnNuLgotICAJCS0yCXBvc3NpYmxlIGFsaWdubWVudCB0byBnZXQgdGhlIHRhYmxlIGFsaWduZWQuCi0gIAkJLTIJYW4gaW5zZXJ0ZWQgYnJhbmNoIGFyb3VuZCB0aGUgdGFibGUuCi0gIAkgICAgID09IDEwMTgKLSAgIGF0IDEwMTgsIHdlIG1pZ2h0IGJlIGluIHRyb3VibGUuCi0gICAtLSBzbyB3ZSBoYXZlIHRvIGJlIHNtYWxsZXIgdGhhbiAxMDE4IGFuZCBzaW5jZSB3ZSBkZWFsIHdpdGggMi1ieXRlCi0gICBpbnN0cnVjdGlvbnMsIHRoZSBuZXh0IGdvb2QgY2hvaWNlIGlzIDEwMTYuCi0gICAtLSBOb3RlIHdlIGhhdmUgYSB0ZXN0IGNhc2UgdGhhdCBmYWlscyB3aGVuIHdlJ3ZlIGdvdCAxMDE4IGhlcmUuICAqLwotI2RlZmluZSBTUEFOUEFOSUMJKDEwMTYpCQkvKiAxMDI0IC0gMSBlbnRyeSAtIDIgYnl0ZSByb3VuZGluZyAqLwotI2RlZmluZSBTUEFOQ0xPU0UJKDkwMCkKLSNkZWZpbmUgU1BBTkVYSVQJKDYwMCkKLXN0YXRpYyBzeW1ib2xTICogcG9vbHN5bTsJCS8qIGxhYmVsIGZvciBjdXJyZW50IHBvb2wgKi8KLXN0YXRpYyBjaGFyIHBvb2xuYW1lWzhdOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICAgIFBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICAgIEZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiAgICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJleHBvcnQiLCAgIHNfZ2xvYmwsICAgICAgICAgIDAgfSwKLSAgeyAiaW1wb3J0IiwgICBzX2lnbm9yZSwgICAgICAgICAwIH0sCi0gIHsgImxpdGVyYWxzIiwgbWNvcmVfc19saXRlcmFscywgMCB9LAotICB7ICJwYWdlIiwgICAgIGxpc3RpbmdfZWplY3QsICAgIDAgfSwKLQotICAvKiBUaGUgZm9sbG93aW5nIGFyZSB0byBpbnRlcmNlcHQgdGhlIHBsYWNlbWVudCBvZiBkYXRhIGludG8gdGhlIHRleHQKLSAgICAgc2VjdGlvbiAoZWcgYWRkcmVzc2VzIGZvciBhIHN3aXRjaCB0YWJsZSksIHNvIHRoYXQgdGhlIHNwYWNlIHRoZXkKLSAgICAgb2NjdXB5IGNhbiBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBkZWNpZGluZyB3aGV0aGVyIG9yIG5vdCB0bwotICAgICBkdW1wIHRoZSBjdXJyZW50IGxpdGVyYWwgcG9vbC4KLSAgICAgWFhYIC0gY3VycmVudGx5IHdlIGRvIG5vdCBjb3BlIHdpdGggdGhlIC5zcGFjZSBhbmQgLmRjYi5kIGRpcmVjdGl2ZXMuICAqLwotICB7ICJhc2NpaSIsICAgIG1jb3JlX3N0cmluZ2VyLCAgICAgICAwIH0sCi0gIHsgImFzY2l6IiwgICAgbWNvcmVfc3RyaW5nZXIsICAgICAgIDEgfSwKLSAgeyAiYnl0ZSIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMSB9LAotICB7ICJkYyIsICAgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgImRjLmIiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDEgfSwKLSAgeyAiZGMuZCIsICAgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZCd9LAotICB7ICJkYy5sIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA0IH0sCi0gIHsgImRjLnMiLCAgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2YnfSwKLSAgeyAiZGMudyIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJkYy54IiwgICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICd4J30sCi0gIHsgImRvdWJsZSIsICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2QnfSwKLSAgeyAiZmxvYXQiLCAgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZid9LAotICB7ICJod29yZCIsICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgImludCIsICAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDQgfSwKLSAgeyAibG9uZyIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAotICB7ICJvY3RhIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgIDE2IH0sCi0gIHsgInF1YWQiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDggfSwKLSAgeyAic2hvcnQiLCAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJzaW5nbGUiLCAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJ30sCi0gIHsgInN0cmluZyIsICAgbWNvcmVfc3RyaW5nZXIsICAgICAgIDEgfSwKLSAgeyAid29yZCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJmaWxsIiwgICAgIG1jb3JlX2ZpbGwsICAgICAgICAgICAwIH0sCi0KLSAgLyogQWxsb3cgZm9yIHRoZSBlZmZlY3Qgb2Ygc2VjdGlvbiBjaGFuZ2VzLiAgKi8KLSAgeyAidGV4dCIsICAgICAgbWNvcmVfc190ZXh0LCAgICAwIH0sCi0gIHsgImRhdGEiLCAgICAgIG1jb3JlX3NfZGF0YSwgICAgMCB9LAotICB7ICJic3MiLCAgICAgICBtY29yZV9zX2JzcywgICAgIDEgfSwKLSNpZmRlZiBPQkpfRUYKLSAgeyAiY29tbSIsICAgICAgbWNvcmVfc19jb21tLCAgICAwIH0sCi0jZW5kaWYKLSAgeyAic2VjdGlvbiIsICAgbWNvcmVfc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3Rpb24ucyIsIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0IiwgICAgICBtY29yZV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdC5zIiwgICAgbWNvcmVfc19zZWN0aW9uLCAwIH0sCi0gIAotICB7IDAsICAgICAgICAgIDAsICAgICAgICAgICAgICAgIDAgfQotfTsKLQotc3RhdGljIHZvaWQKLW1jb3JlX3NfbGl0ZXJhbHMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW1jb3JlX2NvbnMgKG5ieXRlcykKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKiBwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnQgICAgY29tbWFzID0gMTsKLSAgICAgIAotICAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBjb21tYXMgb24gdGhlIGxpbmUuICAqLwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmUgWyogcHRyXSkKLQljb21tYXMgKz0gKiBwdHIgKysgPT0gJywnOwotICAgICAgCi0gICAgICBwb29sc3BhbiArPSBuYnl0ZXMgKiBjb21tYXM7Ci0gICAgfQotICAKLSAgY29ucyAobmJ5dGVzKTsKLQotICAvKiBJbiB0aGVvcnkgd2Ugb3VnaHQgdG8gY2FsbCBjaGVja19saXRlcmFscyAoMiwwKSBoZXJlIGluIGNhc2UKLSAgICAgd2UgbmVlZCB0byBkdW1wIHRoZSBsaXRlcmFsIHRhYmxlLiAgV2UgY2Fubm90IGRvIHRoaXMgaG93ZXZlciwKLSAgICAgYXMgdGhlIGRpcmVjdGl2ZXMgdGhhdCB3ZSBhcmUgaW50ZXJjZXB0aW5nIG1heSBiZSBiZWluZyB1c2VkCi0gICAgIHRvIGJ1aWxkIGEgc3dpdGNoIHRhYmxlLCBhbmQgd2UgbXVzdCBub3QgaW50ZXJmZXJlIHdpdGggaXRzCi0gICAgIGNvbnRlbnRzLiAgSW5zdGVhZCB3ZSBjcm9zcyBvdXIgZmluZ2VycyBhbmQgcHJheS4uLiAqLwotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfZmxvYXRfY29ucyAoZmxvYXRfdHlwZSkKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci17Ci0gIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICogcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ICAgIGNvbW1hcyA9IDE7Ci0KLSNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotI2Vycm9yIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TIG5vdCBoYW5kbGVkCi0jZW5kaWYKLSAgICAgIAotICAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBjb21tYXMgb24gdGhlIGxpbmUuICAqLwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmUgWyogcHRyXSkKLQljb21tYXMgKz0gKiBwdHIgKysgPT0gJywnOwotCi0gICAgICAvKiBXZSB3b3VsZCBsaWtlIHRvIGNvbXB1dGUgImhleF9mbG9hdCAoZmxvYXRfdHlwZSkgKiBjb21tYXMiCi0JIGJ1dCBoZXhfZmxvYXQgaXMgbm90IGV4cG9ydGVkIGZyb20gcmVhZC5jICAqLwotICAgICAgZmxvYXRfdHlwZSA9PSAnZicgPyA0IDogKGZsb2F0X3R5cGUgPT0gJ2QnID8gOCA6IDEyKTsKLSAgICAgIHBvb2xzcGFuICs9IGZsb2F0X3R5cGUgKiBjb21tYXM7Ci0gICAgfQotCi0gIGZsb2F0X2NvbnMgKGZsb2F0X3R5cGUpOwotICAKLSAgLyogU2VlIHRoZSBjb21tZW50IGluIG1jb3JlX2NvbnMgKCkgYWJvdXQgY2FsbGluZyBjaGVja19saXRlcmFscy4KLSAgICAgSXQgaXMgdW5saWtlbHkgdGhhdCBhIHN3aXRjaCB0YWJsZSB3aWxsIGJlIGNvbnN0cnVjdGVkIHVzaW5nCi0gICAgIGZsb2F0aW5nIHBvaW50IHZhbHVlcywgYnV0IGl0IGlzIHN0aWxsIGxpa2VseSB0aGF0IGFuIGluZGV4ZWQKLSAgICAgdGFibGUgb2YgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIGlzIGJlaW5nIGNyZWF0ZWQgYnkgdGhlc2UKLSAgICAgZGlyZWN0aXZlcywgc28gYWdhaW4gd2UgbXVzdCBub3QgaW50ZXJmZXJlIHdpdGggdGhlaXIgcGxhY2VtZW50LiAgKi8KLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX3N0cmluZ2VyIChhcHBlbmRfemVybykKLSAgICAgaW50IGFwcGVuZF96ZXJvOwotewotICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCi0gICAgewotICAgICAgY2hhciAqIHB0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIAotICAgICAgLyogSW4gdGhlb3J5IHdlIHNob3VsZCBjb21wdXRlIGhvdyBtYW55IGJ5dGVzIGFyZSBnb2luZyB0bwotCSBiZSBvY2N1cGllZCBieSB0aGUgc3RyaW5nKHMpIGFuZCBhZGQgdGhpcyB0byB0aGUgcG9vbHNwYW4uCi0JIFRvIGtlZXAgdGhpbmdzIHNpbXBsZSBob3dldmVyLCB3ZSBqdXN0IGFkZCB0aGUgbnVtYmVyIG9mCi0JIGJ5dGVzIGxlZnQgb24gdGhlIGN1cnJlbnQgbGluZS4gIFRoaXMgd2lsbCBiZSBhbiBvdmVyLQotCSBlc3RpbWF0ZSwgd2hpY2ggaXMgT0ssIGFuZCBhdXRvbWF0aWNhbGx5IGFsbG93cyBmb3IgdGhlCi0JIGFwcGVuZGluZyBhIHplcm8gYnl0ZSwgc2luY2UgdGhlIHJlYWwgc3RyaW5nKHMpIGlzL2FyZQotCSByZXF1aXJlZCB0byBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCi0JcHRyICsrOwotCi0gICAgICBwb29sc3BhbiArPSBwdHIgLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICAKLSAgc3RyaW5nZXIgKGFwcGVuZF96ZXJvKTsKLQotICAvKiBXZSBjYWxsIGNoZWNrX2xpdGVyYWxzIGhlcmUgaW4gY2FzZSBhIGxhcmdlIG51bWJlciBvZiBzdHJpbmdzIGFyZQotICAgICBiZWluZyBwbGFjZWQgaW50byB0aGUgdGV4dCBzZWN0aW9uIHdpdGggYSBzZXF1ZW5jZSBvZiBzdHJpbmdlcgotICAgICBkaXJlY3RpdmVzLiAgSW4gdGhlb3J5IHdlIGNvdWxkIGJlIHVwc2V0dGluZyBzb21ldGhpbmcgaWYgdGhlc2UKLSAgICAgc3RyaW5ncyBhcmUgYWN0dWFsbHkgaW4gYW4gaW5kZXhlZCB0YWJsZSBpbnN0ZWFkIG9mIHJlZmVyZW5jZWQgYnkKLSAgICAgaW5kaXZpZHVhbCBsYWJlbHMuICBMZXQgdXMgaG9wZSB0aGF0IHRoYXQgbmV2ZXIgaGFwcGVucy4gICovCi0gIGNoZWNrX2xpdGVyYWxzICgyLCAwKTsKLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX2ZpbGwgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKiBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnQgICAgc2l6ZSA9IDE7Ci0gICAgICBpbnQgICAgcmVwZWF0OwotCi0gICAgICByZXBlYXQgPSBhdG9pIChzdHIpOwotICAgICAgCi0gICAgICAvKiBMb29rIHRvIHNlZSBpZiBhIHNpemUgaGFzIGJlZW4gc3BlY2lmaWVkLiAgKi8KLSAgICAgIHdoaWxlICgqc3RyICE9ICdcbicgJiYgKnN0ciAhPSAwICYmICpzdHIgIT0gJywnKQotCSsrIHN0cjsKLSAgICAgIAotICAgICAgaWYgKCogc3RyID09ICcsJykKLQl7Ci0JICBzaXplID0gYXRvaSAoc3RyICsgMSk7Ci0KLQkgIGlmIChzaXplID4gOCkKLQkgICAgc2l6ZSA9IDg7Ci0JICBlbHNlIGlmIChzaXplIDwgMCkKLQkgICAgc2l6ZSA9IDA7Ci0JfQotCi0gICAgICBwb29sc3BhbiArPSBzaXplICogcmVwZWF0OwotICAgIH0KLSAgCi0gIHNfZmlsbCAodW51c2VkKTsKLQotICBjaGVja19saXRlcmFscyAoMiwgMCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgc2VjdGlvbiBjaGFuZ2luZyBwc2V1ZG8tb3BzLiAgVGhlc2UgY2FsbCB0aHJvdWdoIHRvIHRoZQotICAgbm9ybWFsIGltcGxlbWVudGF0aW9ucywgYnV0IHRoZXkgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGZpcnN0LiAgKi8KLXN0YXRpYyB2b2lkCi1tY29yZV9zX3RleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIAotI2lmZGVmIE9CSl9FTEYKLSAgb2JqX2VsZl90ZXh0IChpZ25vcmUpOwotI2Vsc2UKLSAgc190ZXh0IChpZ25vcmUpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zX2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIAotI2lmZGVmIE9CSl9FTEYKLSAgb2JqX2VsZl9kYXRhIChpZ25vcmUpOwotI2Vsc2UKLSAgc19kYXRhIChpZ25vcmUpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogU2NhbiBmb3J3YXJkcyB0byBmaW5kIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uLiAgSWYgdGhlIHNlY3Rpb24KLSAgICAgYmVpbmcgc3dpdGNoZWQgdG8gaXMgIi5saW5lIiB0aGVuIHRoaXMgaXMgYSBEV0FSRjEgZGVidWcgc2VjdGlvbgotICAgICB3aGljaCBpcyBhcmJpdGFyaWx5IHBsYWNlZCBpbnNpZGUgZ2VuZXJhdGVkIGNvZGUuICBJbiB0aGlzIGNhc2UKLSAgICAgZG8gbm90IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWNhdXNlIGl0IGlzIGEpIGluZWZmaWNpZW50IGFuZAotICAgICBiKSB3b3VsZCByZXF1aXJlIHRoZSBnZW5lcmF0aW9uIG9mIGV4dHJhIGNvZGUgdG8ganVtcCBhcm91bmQgdGhlCi0gICAgIHBvb2wuICAqLwotICBjaGFyICogaWxwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHdoaWxlICgqaWxwICE9IDAgJiYgaXNzcGFjZSgqaWxwKSkKLSAgICArKyBpbHA7Ci0KLSAgaWYgKHN0cm5jbXAgKGlscCwgIi5saW5lIiwgNSkgPT0gMAotICAgICAgJiYgKGlzc3BhY2UgKGlscFs1XSkgfHwgKmlscCA9PSAnXG4nIHx8ICppbHAgPT0gJ1xyJykpCi0gICAgOwotICBlbHNlCi0gICAgZHVtcF9saXRlcmFscyAoMCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIG9ial9lbGZfc2VjdGlvbiAoaWdub3JlKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9DT0ZGCi0gIG9ial9jb2ZmX3NlY3Rpb24gKGlnbm9yZSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX3NfYnNzIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgCi0gIHNfbGNvbW1fYnl0ZXMgKG5lZWRzX2FsaWduKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkCi1tY29yZV9zX2NvbW0gKG5lZWRzX2FsaWduKQotICAgICBpbnQgbmVlZHNfYWxpZ247Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSAgb2JqX2VsZl9jb21tb24gKG5lZWRzX2FsaWduKTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciBuZWVkcy4gICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBtY29yZV9vcGNvZGVfaW5mbyAqIG9wY29kZTsKLSAgY2hhciAqIHByZXZfbmFtZSA9ICIiOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IG1jb3JlX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSArKykKLSAgICB7Ci0gICAgICBpZiAoc3RyZXEgKHByZXZfbmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQl7Ci0JICAvKiBNYWtlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHN0cmluZy4gICovCi0JICBvcGNvZGUtPm5hbWUgPSBwcmV2X25hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByZXZfbmFtZSA9IG9wY29kZS0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGludCByZWdfbTsKLXN0YXRpYyBpbnQgcmVnX247Ci1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlOwkvKiBhYnNvbHV0ZSBleHByZXNzaW9uICovCi0KLS8qIEdldCBhIGxvZzIodmFsKS4gICovCi1zdGF0aWMgaW50Ci1sb2cyICh2YWwpCi0gICAgdW5zaWduZWQgaW50IHZhbDsKLXsKLSAgICBpbnQgbG9nID0gLTE7Ci0gICAgd2hpbGUgKHZhbCAhPSAwKQotICAgICAgewotICAgICAgICBsb2cgKys7Ci0gICAgICAgIHZhbCA+Pj0gMTsKLSAgICAgIH0KLSAgICAKLSAgICByZXR1cm4gbG9nOwotfQotCi0vKiBUcnkgdG8gcGFyc2UgYSByZWcgbmFtZS4gICovCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9yZWcgKHMsIHJlZykKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogcmVnOwotewotICAvKiBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArKyBzOwotICAKLSAgaWYgKHRvbG93ZXIgKHNbMF0pID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc1sxXSA9PSAnMScgJiYgc1syXSA+PSAnMCcgJiYgc1syXSA8PSAnNScpCi0JewotCSAgKnJlZyA9IDEwICsgc1syXSAtICcwJzsKLQkgIHJldHVybiBzICsgMzsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChzWzFdID49ICcwJyAmJiBzWzFdIDw9ICc5JykKLQl7Ci0JICAqcmVnID0gc1sxXSAtICcwJzsKLQkgIHJldHVybiBzICsgMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmICggICB0b2xvd2VyIChzWzBdKSA9PSAncycKLQkgICAmJiB0b2xvd2VyIChzWzFdKSA9PSAncCcKLQkgICAmJiAhIGlzYWxudW0gKHNbMl0pKQotICAgIHsKLSAgICAgICogcmVnID0gMDsKLSAgICAgIHJldHVybiBzICsgMjsKLSAgICB9Ci0gIAotICBhc19iYWQgKF8oInJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIpLCBzKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgQ3JlZ3MKLXsKLSAgY2hhciAqIG5hbWU7Ci0gIHVuc2lnbmVkIGludCBjcm51bTsKLX0KLWNyZWdzW10gPQotewotICB7ICJwc3IiLAkgMH0sCi0gIHsgInZiciIsCSAxfSwKLSAgeyAiZXBzciIsCSAyfSwKLSAgeyAiZnBzciIsCSAzfSwKLSAgeyAiZXBjIiwJIDR9LAotICB7ICJmcGMiLAkgNX0sCi0gIHsgInNzMCIsCSA2fSwKLSAgeyAic3MxIiwJIDd9LAotICB7ICJzczIiLAkgOH0sCi0gIHsgInNzMyIsCSA5fSwKLSAgeyAic3M0IiwJMTB9LAotICB7ICJnY3IiLAkxMX0sCi0gIHsgImdzciIsCTEyfSwKLSAgeyAiIiwJCSAwfQotfTsKLQotc3RhdGljIGNoYXIgKgotcGFyc2VfY3JlZyAocywgcmVnKQotICAgICBjaGFyICogczsKLSAgICAgdW5zaWduZWQgKiByZWc7Ci17Ci0gIGludCBpOwotCi0gIC8qIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHMpKQotICAgICsrczsKLSAgCi0gIGlmICgodG9sb3dlciAoc1swXSkgPT0gJ2MnICYmIHRvbG93ZXIgKHNbMV0pID09ICdyJykpCi0gICAgewotICAgICAgaWYgKHNbMl0gPT0gJzMnICYmIHNbM10gPj0gJzAnICYmIHNbM10gPD0gJzEnKQotCXsKLQkgICpyZWcgPSAzMCArIHNbM10gLSAnMCc7Ci0JICByZXR1cm4gcyArIDQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1syXSA9PSAnMicgJiYgc1szXSA+PSAnMCcgJiYgc1szXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IDIwICsgc1szXSAtICcwJzsKLQkgIHJldHVybiBzICsgNDsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChzWzJdID09ICcxJyAmJiBzWzNdID49ICcwJyAmJiBzWzNdIDw9ICc5JykKLQl7Ci0JICAqcmVnID0gMTAgKyBzWzNdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyA0OwotCX0KLSAgICAgIAotICAgICAgaWYgKHNbMl0gPj0gJzAnICYmIHNbMl0gPD0gJzknKQotCXsKLQkgICpyZWcgPSBzWzJdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyAzOwotCX0KLSAgICB9Ci0gIAotICAvKiBMb29rIGF0IGFsdGVybmF0ZSBjcmVnIG5hbWVzIGJlZm9yZSBnaXZpbmcgZXJyb3IuICAqLwotICBmb3IgKGkgPSAwOyBjcmVnc1tpXS5uYW1lWzBdICE9ICdcMCc7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZiBbMTBdOwotICAgICAgaW50ICBsZW5ndGg7Ci0gICAgICBpbnQgIGo7Ci0gICAgICAKLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoY3JlZ3NbaV0ubmFtZSk7Ci0gICAgICAKLSAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKLQlidWZbal0gPSB0b2xvd2VyIChzW2pdKTsKLSAgICAgIAotICAgICAgaWYgKHN0cm5jbXAgKGNyZWdzW2ldLm5hbWUsIGJ1ZiwgbGVuZ3RoKSA9PSAwKQotCXsKLQkgICpyZWcgPSBjcmVnc1tpXS5jcm51bTsKLQkgIHJldHVybiBzICsgbGVuZ3RoOwotCX0KLSAgICB9Ci0gIAotICBhc19iYWQgKF8oImNvbnRyb2wgcmVnaXN0ZXIgZXhwZWN0ZWQsIGJ1dCBzYXcgJyUuNnMnIiksIHMpOwotICAKLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2V4cCAocywgZSkKLSAgICAgY2hhciAqIHM7Ci0gICAgIGV4cHJlc3Npb25TICogZTsKLXsKLSAgY2hhciAqIHNhdmU7Ci0gIGNoYXIgKiBuZXc7Ci0KLSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0gICAgKysgczsKLSAgCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0KLSAgZXhwcmVzc2lvbiAoZSk7Ci0gIAotICBpZiAoZS0+WF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgCi0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgCi0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWtlX25hbWUgKHMsIHAsIG4pCi0gICAgIGNoYXIgKiBzOwotICAgICBjaGFyICogcDsKLSAgICAgaW50IG47Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotCi0gIHNbMF0gPSBwWzBdOwotICBzWzFdID0gcFsxXTsKLSAgc1syXSA9IHBbMl07Ci0gIHNbM10gPSBoZXhbKG4gPj4gMTIpICYgMHhGXTsKLSAgc1s0XSA9IGhleFsobiA+PiAgOCkgJiAweEZdOwotICBzWzVdID0gaGV4WyhuID4+ICA0KSAmIDB4Rl07Ci0gIHNbNl0gPSBoZXhbKG4pICAgICAgICYgMHhGXTsKLSAgc1s3XSA9IDA7Ci19Ci0KLSNkZWZpbmUgUE9PTF9FTkRfTEFCRUwgICAiLkxFIgotI2RlZmluZSBQT09MX1NUQVJUX0xBQkVMICIuTFMiCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2xpdGVyYWxzIChpc2ZvcmNlKQotICAgICBpbnQgaXNmb3JjZTsKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBsaXRlcmFsICogcDsKLSAgc3ltYm9sUyAqIGJyYXJzeW07Ci0gIAotICBpZiAocG9vbHNpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogTXVzdCB3ZSBicmFuY2ggYXJvdW5kIHRoZSBsaXRlcmFsIHRhYmxlPyAqLwotICBpZiAoaXNmb3JjZSkKLSAgICB7Ci0gICAgICBjaGFyICogb3V0cHV0OwotICAgICAgY2hhciBicmFybmFtZVs4XTsKLSAgICAgIAotICAgICAgbWFrZV9uYW1lIChicmFybmFtZSwgUE9PTF9FTkRfTEFCRUwsIHBvb2xudW1iZXIpOwotICAgICAgCi0gICAgICBicmFyc3ltID0gc3ltYm9sX21ha2UgKGJyYXJuYW1lKTsKLSAgICAgIAotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoYnJhcnN5bSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoLAotCQkJIEMgKFVOQ0RfSlVNUCwgMCksIGJyYXJzeW0sIDAsIDApOwotICAgICAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoTUNPUkVfSU5TVF9CUik7CS8qIGJyIC4reHh4ICovCi0gICAgICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChNQ09SRV9JTlNUX0JSKTsKLSAgICB9Ci0gICAgICAKLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHNlY3Rpb24gaXMgc3VmZmljaWVudGx5IGFsaWduZWQgYW5kIHRoYXQKLSAgICAgdGhlIGxpdGVyYWwgdGFibGUgaXMgYWxpZ25lZCB3aXRoaW4gaXQuICAqLwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAyKTsKLSAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0gIAotICBjb2xvbiAoU19HRVRfTkFNRSAocG9vbHN5bSkpOwotICAKLSAgZm9yIChpID0gMCwgcCA9IGxpdHBvb2w7IGkgPCBwb29sc2l6ZTsgaSsrLCBwKyspCi0gICAgZW1pdF9leHByICgmIHAtPmUsIDQpOwotICAKLSAgaWYgKGlzZm9yY2UpCi0gICAgY29sb24gKFNfR0VUX05BTUUgKGJyYXJzeW0pKTsKLSAgCi0gICBwb29sc2l6ZSA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19saXRlcmFscyAoa2luZCwgb2Zmc2V0KQotICAgICBpbnQga2luZDsKLSAgICAgaW50IG9mZnNldDsKLXsKLSAgcG9vbHNwYW4gKz0gb2Zmc2V0OwotICAgIAotICAvKiBTUEFOQ0xPU0UgYW5kIFNQQU5FWElUIGFyZSBzbWFsbGVyIG51bWJlcnMgdGhhbiBTUEFOUEFOSUMuCi0gICAgIFNQQU5QQU5JQyBtZWFucyB0aGF0IHdlIG11c3QgZHVtcCBub3cuCi0gICAgIGtpbmQgPT0gMCBpcyBhbnkgb2xkIGluc3RydWN0aW9uLgotICAgICBraW5kICA+IDAgbWVhbnMgd2UganVzdCBoYWQgYSBjb250cm9sIHRyYW5zZmVyIGluc3RydWN0aW9uLgotICAgICBraW5kID09IDEgbWVhbnMgd2l0aGluIGEgZnVuY3Rpb24KLSAgICAga2luZCA9PSAyIG1lYW5zIHdlIGp1c3QgbGVmdCBhIGZ1bmN0aW9uCi0gICAgCi0gICAgIFRoZSBkdW1wX2xpdGVyYWxzICgxKSBjYWxsIGluc2VydHMgYSBicmFuY2ggYXJvdW5kIHRoZSB0YWJsZSwgc28KLSAgICAgd2UgZmlyc3QgbG9vayB0byBzZWUgaWYgaXRzIGEgc2l0dWF0aW9uIHdoZXJlIHdlIHdvbid0IGhhdmUgdG8KLSAgICAgaW5zZXJ0IGEgYnJhbmNoIChlLmcuLCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGFuIHVuY29uZGl0aW9uYWwKLSAgICAgYnJhbmNoKS4KLSAgICAKLSAgICAgU1BBTlBBTklDIGlzIHRoZSBwb2ludCB3aGVyZSB3ZSBtdXN0IGR1bXAgYSBzaW5nbGUtZW50cnkgcG9vbC4KLSAgICAgaXQgYWNjb3VudHMgZm9yIGFsaWdubWVudHMgYW5kIGFuIGluc2VydGVkIGJyYW5jaC4KLSAgICAgdGhlICdwb29sc2l6ZSoyJyBhY2NvdW50cyBmb3IgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGRvOgotICAgICAgIGxydyByMSxsaXQxOyBscncgcjIsbGl0MjsgbHJ3IHIzLGxpdDMKLSAgICAgTm90ZSB0aGF0IHRoZSAnbGl0MicgcmVmZXJlbmNlIGlzIDIgYnl0ZXMgZnVydGhlciBhbG9uZwotICAgICBidXQgdGhlIGxpdGVyYWwgaXQgcmVmZXJlbmNlcyB3aWxsIGJlIDQgYnl0ZXMgZnVydGhlciBhbG9uZywKLSAgICAgc28gd2UgbXVzdCBjb25zaWRlciB0aGUgcG9vbHNpemUgaW50byB0aGlzIGVxdWF0aW9uLgotICAgICBUaGlzIGlzIHNsaWdodGx5IG92ZXItY2F1dGlvdXMsIGJ1dCBndWFyYW50ZWVzIHRoYXQgd2Ugd29uJ3QKLSAgICAgcGFuaWMgYmVjYXVzZSBhIHJlbG9jYXRpb24gaXMgdG9vIGRpc3RhbnQuICAqLwotICAKLSAgaWYgKHBvb2xzcGFuID4gU1BBTkNMT1NFICYmIGtpbmQgPiAwKQotICAgIGR1bXBfbGl0ZXJhbHMgKDApOwotICBlbHNlIGlmIChwb29sc3BhbiA+IFNQQU5FWElUICYmIGtpbmQgPiAxKQotICAgIGR1bXBfbGl0ZXJhbHMgKDApOwotICBlbHNlIGlmIChwb29sc3BhbiA+PSAoU1BBTlBBTklDIC0gcG9vbHNpemUgKiAyKSkKLSAgICBkdW1wX2xpdGVyYWxzICgxKTsKLX0KLQotc3RhdGljIGludAotZW50ZXJfbGl0ZXJhbCAoZSwgaXNwY3JlbCkKLSAgICAgZXhwcmVzc2lvblMgKiBlOwotICAgICBpbnQgaXNwY3JlbDsKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBsaXRlcmFsICogcDsKLQotICBpZiAocG9vbHNpemUgPj0gTUFYX1BPT0xfU0laRSAtIDIpCi0gICAgewotICAgICAgLyogVGhlIGxpdGVyYWwgcG9vbCBpcyBhcyBmdWxsIGFzIHdlIGNhbiBoYW5kbGUuIFdlIGhhdmUKLSAgICAgICAgIHRvIGJlIDIgZW50cmllcyBzaHkgb2YgdGhlIDEwMjQvND0yNTYgZW50cmllcyBiZWNhdXNlIHdlCi0gICAgICAgICBoYXZlIHRvIGFsbG93IGZvciB0aGUgYnJhbmNoICgyIGJ5dGVzKSBhbmQgdGhlIGFsaWdubWVudAotICAgICAgICAgKDIgYnl0ZXMgYmVmb3JlIHRoZSBmaXJzdCBpbnNuIHJlZmVyZW5jaW5nIHRoZSBwb29sIGFuZAotICAgICAgICAgMiBieXRlcyBiZWZvcmUgdGhlIHBvb2wgaXRzZWxmKSA9PSA2IGJ5dGVzLCByb3VuZHMgdXAKLSAgICAgICAgIHRvIDIgZW50cmllcy4gICovIAotICAgICAgZHVtcF9saXRlcmFscyAoMSk7Ci0gICAgfQotCi0gIGlmIChwb29sc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBuZXcgbGl0ZXJhbCBwb29sLiAgKi8KLSAgICAgIGlmICgrKyBwb29sbnVtYmVyID4gMHhGRkZGKQotCWFzX2ZhdGFsIChfKCJtb3JlIHRoYW4gNjVLIGxpdGVyYWwgcG9vbHMiKSk7Ci0gICAgICAKLSAgICAgIG1ha2VfbmFtZSAocG9vbG5hbWUsIFBPT0xfU1RBUlRfTEFCRUwsIHBvb2xudW1iZXIpOwotICAgICAgcG9vbHN5bSA9IHN5bWJvbF9tYWtlIChwb29sbmFtZSk7Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChwb29sc3ltKTsKLSAgICAgIHBvb2xzcGFuID0gMDsKLSAgICB9Ci0gIAotICAvKiBTZWFyY2ggcG9vbCBmb3IgdmFsdWUgc28gd2UgZG9uJ3QgaGF2ZSBkdXBsaWNhdGVzLiAgKi8KLSAgZm9yIChwID0gbGl0cG9vbCwgaSA9IDA7IGkgPCBwb29sc2l6ZTsgaSsrLCBwKyspCi0gICAgewotICAgICAgaWYgKGUtPlhfb3AgPT0gcC0+ZS5YX29wCi0JICAmJiBlLT5YX2FkZF9zeW1ib2wgPT0gcC0+ZS5YX2FkZF9zeW1ib2wKLQkgICYmIGUtPlhfYWRkX251bWJlciA9PSBwLT5lLlhfYWRkX251bWJlcgotCSAgJiYgaXNwY3JlbCA9PSBwLT5pc3BjcmVsKQotCXsKLQkgIHAtPnJlZmNudCArKzsKLQkgIHJldHVybiBpOwotCX0KLSAgICB9Ci0KLSAgcC0+cmVmY250ICA9IDE7Ci0gIHAtPmlzcGNyZWwgPSBpc3BjcmVsOwotICBwLT5lICAgICAgID0gKiBlOwotICAKLSAgcG9vbHNpemUgKys7Ci0KLSAgcmV0dXJuIGk7ICAgCi19Ci0KLS8qIFBhcnNlIGEgbGl0ZXJhbCBzcGVjaWZpY2F0aW9uLiAtLSBlaXRoZXIgbmV3IG9yIG9sZCBzeW50YXguCi0gICBvbGQgc3ludGF4OiB0aGUgdXNlciBzdXBwbGllcyB0aGUgbGFiZWwgYW5kIHBsYWNlcyB0aGUgbGl0ZXJhbC4KLSAgIG5ldyBzeW50YXg6IHdlIHB1dCBpdCBpbnRvIHRoZSBsaXRlcmFsIHBvb2wuICAqLwotc3RhdGljIGNoYXIgKgotcGFyc2VfcnQgKHMsIG91dHB1dHAsIGlzcGNyZWwsIGVwKQotICAgICBjaGFyICogczsKLSAgICAgY2hhciAqKiBvdXRwdXRwOwotICAgICBpbnQgaXNwY3JlbDsKLSAgICAgZXhwcmVzc2lvblMgKiBlcDsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLSAgaW50IG47Ci0gIAotICBpZiAoZXApCi0gICAgLyogSW5kaWNhdGUgbm90aGluZyB0aGVyZS4gICovCi0gICAgZXAtPlhfb3AgPSBPX2Fic2VudDsKLSAgCi0gIGlmICgqcyA9PSAnWycpCi0gICAgewotICAgICAgcyA9IHBhcnNlX2V4cCAocyArIDEsICYgZSk7Ci0gICAgICAKLSAgICAgIGlmICgqcyA9PSAnXScpCi0JcysrOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygibWlzc2luZyAnXSciKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcyA9IHBhcnNlX2V4cCAocywgJiBlKTsKLSAgICAgIAotICAgICAgbiA9IGVudGVyX2xpdGVyYWwgKCYgZSwgaXNwY3JlbCk7Ci0gICAgICAKLSAgICAgIGlmIChlcCkKLQkqZXAgPSBlOwotCi0gICAgICAvKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gcG9vbCBlbnRyeS4gICovCi0gICAgICBlLlhfb3AgICAgICAgICA9IE9fc3ltYm9sOwotICAgICAgZS5YX2FkZF9zeW1ib2wgPSBwb29sc3ltOwotICAgICAgZS5YX2FkZF9udW1iZXIgPSBuIDw8IDI7Ci0gICAgfQotICAKLSAgKiBvdXRwdXRwID0gZnJhZ19tb3JlICgyKTsKLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csICgqb3V0cHV0cCkgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwgJiBlLCAxLAotCSAgICAgICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCk7Ci0KLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2ltbSAocywgdmFsLCBtaW4sIG1heCkKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogdmFsOwotICAgICB1bnNpZ25lZCBtaW47Ci0gICAgIHVuc2lnbmVkIG1heDsKLXsKLSAgY2hhciAqIG5ldzsKLSAgZXhwcmVzc2lvblMgZTsKLSAgCi0gIG5ldyA9IHBhcnNlX2V4cCAocywgJiBlKTsKLSAgCi0gIGlmIChlLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgOyAvKiBBbiBlcnJvciBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gZW1pdHRlZC4gICovCi0gIGVsc2UgaWYgKGUuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGEgY29uc3RhbnQiKSk7Ci0gIGVsc2UgaWYgKGUuWF9hZGRfbnVtYmVyIDwgbWluIHx8IGUuWF9hZGRfbnVtYmVyID4gbWF4KQotICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCwgbm90ICVkIiksCi0JICAgIG1pbiwgbWF4LCBlLlhfYWRkX251bWJlcik7Ci0KLSAgKiB2YWwgPSBlLlhfYWRkX251bWJlcjsKLSAgCi0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX21lbSAocywgcmVnLCBvZmYsIHNpeikKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogcmVnOwotICAgICB1bnNpZ25lZCAqIG9mZjsKLSAgICAgdW5zaWduZWQgc2l6OwotewotICBjaGFyICogbmV3OwotCi0gICogb2ZmID0gMDsKLSAgCi0gIHdoaWxlIChpc3NwYWNlICgqIHMpKQotICAgICsrIHM7Ci0gICAgICAKLSAgaWYgKCogcyA9PSAnKCcpCi0gICAgewotICAgICAgcyA9IHBhcnNlX3JlZyAocyArIDEsIHJlZyk7Ci0KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHMpKQotCSsrIHM7Ci0gICAgICAKLSAgICAgIGlmICgqIHMgPT0gJywnKQotCXsKLQkgIHMgPSBwYXJzZV9pbW0gKHMgKyAxLCBvZmYsIDAsIDYzKTsKLQkgIAotCSAgaWYgKHNpeiA+IDEpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ID4gMikKLQkJewotCQkgIGlmICgqIG9mZiAmIDB4MykKLQkJICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpKTsKLQkJICAKLQkJICAqIG9mZiA+Pj0gMjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgqIG9mZiAmIDB4MSkKLQkJICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiIpKTsKLQkJICAKLQkJICAqIG9mZiA+Pj0gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLQkrKyBzOwotICAgICAgCi0gICAgICBpZiAoKiBzID09ICcpJykKLQlzICsrOwotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygiYmFzZSByZWdpc3RlciBleHBlY3RlZCIpKTsKLSAgCi0gIHJldHVybiBzOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgY2hhciAqIG9wX3N0YXJ0OwotICBjaGFyICogb3BfZW5kOwotICBtY29yZV9vcGNvZGVfaW5mbyAqIG9wY29kZTsKLSAgY2hhciAqIG91dHB1dDsKLSAgaW50IG5sZW4gPSAwOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0OwotICB1bnNpZ25lZCByZWc7Ci0gIHVuc2lnbmVkIG9mZjsKLSAgdW5zaWduZWQgaXNpemU7Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIGNoYXIgbmFtZVsyMF07Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotICAgIHN0ciArKzsKLQotICAvKiBGaW5kIHRoZSBvcCBjb2RlIGVuZC4gICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSBzdHI7Ci0gICAgICAgKiBvcF9lbmQgJiYgbmxlbiA8IDIwICYmICFpc19lbmRfb2ZfbGluZSBbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgbmFtZVtubGVuXSA9IG9wX3N0YXJ0W25sZW5dOwotICAgICAgbmxlbisrOwotICAgIH0KLSAgCi0gIG5hbWUgW25sZW5dID0gMDsKLSAgCi0gIGlmIChubGVuID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG9wY29kZSA9IChtY29yZV9vcGNvZGVfaW5mbyAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG5hbWUpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaW5zdCA9IG9wY29kZS0+aW5zdDsKLSAgaXNpemUgPSAyOwotICAKLSAgc3dpdGNoIChvcGNvZGUtPm9wY2xhc3MpCi0gICAgewotICAgIGNhc2UgTzA6Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9UOgotICAgICAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTzE6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBKTVA6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIC8qIEluIGEgc2lmaWx0ZXIgbW9kZSwgd2UgZW1pdCB0aGlzIGluc24gMiB0aW1lcywKLSAgICAgICAgIGZpeGVzIHByb2JsZW0gb2YgYW4gaW50ZXJydXB0IGR1cmluZyBhIGptcC4uICovCi0gICAgICBpZiAoc2lmaWx0ZXJfbW9kZSkKLQl7Ci0JICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLQkgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSlNSOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgPT0gMTUpCi0JYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyOiByMTUgaWxsZWdhbCIpKTsKLSAgICAgIAotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgCi0gICAgICBpZiAoc2lmaWx0ZXJfbW9kZSkKLQl7Ci0JICAvKiBSZXBsYWNlIHdpdGg6ICBic3IgLisyIDsgYWRkaSByMTUsNjsgam1wIHJ4IDsgam1wIHJ4ICovCi0JICBpbnN0ID0gTUNPUkVfSU5TVF9CU1I7CS8qIHdpdGggMCBkaXNwbGFjZW1lbnQgKi8KLQkgIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotCSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0KLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JICBpbnN0ID0gTUNPUkVfSU5TVF9BRERJOwotCSAgaW5zdCB8PSAxNTsJCQkvKiBhZGRpIHIxNSw2ICovCi0JICBpbnN0IHw9ICg2IC0gMSkgPDwgNDsJCS8qIG92ZXIgdGhlIGptcCdzICovCi0JICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLQkgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotCi0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCSAgaW5zdCA9IE1DT1JFX0lOU1RfSk1QIHwgcmVnOwotCSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0JICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLQotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsJCS8qIDJuZCBlbWl0dGVkIGluIGZhbGx0aHJ1ICovCi0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9DOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9jcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPMjoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFgxOgkvKiBIYW5kbGUgYm90aCBzeW50YXgtPiB4dHJiLSByMSxyeCBPUiB4dHJiLSByeCAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQkvKiB4dHJiLSByMSxyeCAqLwotCXsKLQkgIGlmIChyZWcgIT0gMSkKLQkgICAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiByZWdpc3RlciBtdXN0IGJlIHIxIikpOwotCSAgCi0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQl9Ci0gICAgICAKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPMVIxOiAgLyogZGl2LSByeCxyMSAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICBpZiAocmVnICE9IDEpCi0JICAgIGFzX2JhZCAoXygic291cmNlIHJlZ2lzdGVyIG11c3QgYmUgcjEiKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPSToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMyKTsKLQkgIGluc3QgfD0gKHJlZyAtIDEpIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQjoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDMxKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQjI6CQkvKiBsaWtlIE9CLCBidXQgYXJnIGlzIDJebiBpbnN0ZWFkIG9mIG4gKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDEgPDwgMzEpOwotCSAgLyogRnVydGhlciByZXN0cmljdCB0aGUgaW1tZWRpYXRlIHRvIGEgcG93ZXIgb2YgdHdvLiAqLwotCSAgaWYgKChyZWcgJiAocmVnIC0gMSkpID09IDApCi0JICAgIHJlZyA9IGxvZzIgKHJlZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWcgPSAwOwotCSAgICAgIGFzX2JhZCAoXygiaW1tZWRpYXRlIGlzIG5vdCBhIHBvd2VyIG9mIHR3byIpKTsKLQkgICAgfQotCSAgaW5zdCB8PSAocmVnKSA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0JSYToJLyogU3BlY2lmaWMgZm9yIGJnZW5pOiBpbW0gb2YgMC0+NiB0cmFuc2xhdGUgdG8gbW92aS4gKi8KLSAgICBjYXNlIE9CUmI6Ci0gICAgY2FzZSBPQlJjOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMzEpOwotCSAgLyogaW1tZWRpYXRlIHZhbHVlcyBvZiAwIC0+IDYgdHJhbnNsYXRlIHRvIG1vdmkgKi8KLQkgIGlmIChyZWcgPD0gNikKLQkgICAgewotCSAgICAgIGluc3QgPSAoaW5zdCAmIDB4RikgfCBNQ09SRV9JTlNUX0JHRU5JX0FMVDsKLQkgICAgICByZWcgPSAweDEgPDwgcmVnOwotCSAgICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIGJnZW5pIHRvIG1vdmkiKSk7Ci0JICAgIH0KLQkgIGluc3QgJj0gfiAweDAxZjA7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0JSMjoJLyogbGlrZSBPQlIsIGJ1dCBhcmcgaXMgMl5uIGluc3RlYWQgb2YgbiAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMSA8PCAzMSk7Ci0JICAKLQkgIC8qIEZ1cnRoZXIgcmVzdHJpY3QgdGhlIGltbWVkaWF0ZSB0byBhIHBvd2VyIG9mIHR3by4gICovCi0JICBpZiAoKHJlZyAmIChyZWcgLSAxKSkgPT0gMCkKLQkgICAgcmVnID0gbG9nMiAocmVnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlZyA9IDA7Ci0JICAgICAgYXNfYmFkIChfKCJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIikpOwotCSAgICB9Ci0JICAKLQkgIC8qIEltbWVkaWF0ZSB2YWx1ZXMgb2YgMCAtPiA2IHRyYW5zbGF0ZSB0byBtb3ZpLiAqLwotCSAgaWYgKHJlZyA8PSA2KQotCSAgICB7Ci0JICAgICAgaW5zdCA9IChpbnN0ICYgMHhGKSB8IE1DT1JFX0lOU1RfQkdFTklfQUxUOwotCSAgICAgIHJlZyA9IDB4MSA8PCByZWc7Ci0JICAgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgbWdlbmkgdG8gbW92aSIpKTsKLQkgICAgfQotCSAgCi0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT01hOgkvKiBTcGVjaWZpYyBmb3IgYm1hc2tpOiBpbW0gMS0+NyB0cmFuc2xhdGUgdG8gbW92aS4gICovCi0gICAgY2FzZSBPTWI6Ci0gICAgY2FzZSBPTWM6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMik7Ci0JICAKLQkgIC8qIEltbWVkaWF0ZSB2YWx1ZXMgb2YgMSAtPiA3IHRyYW5zbGF0ZSB0byBtb3ZpLiAqLwotCSAgaWYgKHJlZyA8PSA3KQotCSAgICB7Ci0JICAgICAgaW5zdCA9IChpbnN0ICYgMHhGKSB8IE1DT1JFX0lOU1RfQk1BU0tJX0FMVDsKLQkgICAgICByZWcgPSAoMHgxIDw8IHJlZykgLSAxOwotCSAgICAgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JICAgICAgCi0JICAgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgYm1hc2tpIHRvIG1vdmkiKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc3QgJj0gfiAweDAxRjA7Ci0JICAgICAgaW5zdCB8PSAocmVnICYgMHgxRikgPDwgNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0k6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSTc6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAweDdGKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBMUzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWcgPDwgODsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgaW50IHNpemU7Ci0JICAKLQkgIGlmICgoaW5zdCAmIDB4NjAwMCkgPT0gMCkKLQkgICAgc2l6ZSA9IDQ7Ci0JICBlbHNlIGlmICgoaW5zdCAmIDB4NjAwMCkgPT0gMHg0MDAwKQotCSAgICBzaXplID0gMjsKLQkgIGVsc2UgaWYgKChpbnN0ICYgMHg2MDAwKSA9PSAweDIwMDApCi0JICAgIHNpemUgPSAxOwotCSAgCi0JICBvcF9lbmQgPSBwYXJzZV9tZW0gKG9wX2VuZCArIDEsICYgcmVnLCAmIG9mZiwgc2l6ZSk7Ci0JICAKLQkgIGlmIChvZmYgPiAxNikKLQkgICAgYXNfYmFkIChfKCJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlICglZCkiKSwgb2ZmKTsKLQkgIGVsc2UKLQkgICAgaW5zdCB8PSAocmVnKSB8IChvZmYgPDwgNCk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBMUjoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICBpZiAocmVnID09IDAgfHwgcmVnID09IDE1KQotCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlcjogcjAgYW5kIHIxNSBpbGxlZ2FsIikpOwotICAgICAgCi0gICAgICBpbnN0IHw9IChyZWcgPDwgOCk7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCS8qIHBhcnNlX3J0IGNhbGxzIGZyYWdfbW9yZSgpIGZvciB1cy4gICovCi0JaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfcnQgKG9wX2VuZCArIDEsICYgb3V0cHV0LCAwLCAwKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwkJLyogc2F2ZSBpdHMgc3BhY2UgKi8KLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTEo6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9ydCAob3BfZW5kICsgMSwgJiBvdXRwdXQsIDEsIDApOwotICAgICAgLyogcGFyc2VfcnQoKSBjYWxscyBmcmFnX21vcmUoKSBmb3IgdXMuICAqLwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJNOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgPT0gMCB8fCByZWcgPT0gMTUpCi0JYXNfYmFkIChfKCJiYWQgc3RhcnRpbmcgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaW52YWxpZCIpKTsKLSAgICAgIAotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJy0nKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgCi0JICBpZiAocmVnICE9IDE1KQotCSAgICBhc19iYWQgKF8oImVuZGluZyByZWdpc3RlciBtdXN0IGJlIHIxNSIpKTsKLQkgIAotCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JICAgICsrIG9wX2VuZDsKLQl9Ci0gICAgICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kICsrOwotCSAgCi0JICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkgICAgKysgb3BfZW5kOwotICAKLQkgIGlmICgqIG9wX2VuZCA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgICAgICAKLQkgICAgICBpZiAocmVnICE9IDApCi0JCWFzX2JhZCAoXygiYmFkIGJhc2UgcmVnaXN0ZXI6IG11c3QgYmUgcjAiKSk7Ci0JICAgICAgCi0JICAgICAgaWYgKCogb3BfZW5kID09ICcpJykKLQkJb3BfZW5kICsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiYmFzZSByZWdpc3RlciBleHBlY3RlZCIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJROgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgIT0gNCkKLQlhc19mYXRhbCAoXygiZmlyc3QgcmVnaXN0ZXIgbXVzdCBiZSByNCIpKTsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLScpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICAKLQkgIGlmIChyZWcgIT0gNykKLQkgICAgYXNfZmF0YWwgKF8oImxhc3QgcmVnaXN0ZXIgbXVzdCBiZSByNyIpKTsKLQkgIAotCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JICAgICsrIG9wX2VuZDsKLSAgCi0JICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCSAgICB7Ci0JICAgICAgb3BfZW5kICsrOwotCSAgICAgIAotCSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkJKysgb3BfZW5kOwotICAKLQkgICAgICBpZiAoKiBvcF9lbmQgPT0gJygnKQotCQl7Ci0JCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JCSAgCi0JCSAgaWYgKHJlZyA+PSA0ICYmIHJlZyA8PSA3KQotCQkgICAgYXNfZmF0YWwgKCJiYXNlIHJlZ2lzdGVyIGNhbm5vdCBiZSByNCwgcjUsIHI2LCBvciByNyIpOwotCQkgIAotCQkgIGluc3QgfD0gcmVnOwotCQkgIAotCQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkJICAgICsrIG9wX2VuZDsKLQkJICAKLQkJICBpZiAoKiBvcF9lbmQgPT0gJyknKQotCQkgICAgb3BfZW5kICsrOwotCQl9Ci0JICAgICAgZWxzZQotCQlhc19iYWQgKF8oImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInJlZy1yZWcgZXhwZWN0ZWQiKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQlI6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICAKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgb3V0cHV0LWZyYWdfbm93LT5mcl9saXRlcmFsLCAKLQkJICAgMiwgJiBlLCAxLCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJMOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZyA8PCA0OwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCSAgCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIG91dHB1dC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgCi0JCSAgICAgICAyLCAmIGUsIDEsIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSkM6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQzMildLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMTIpXS5ybHhfbGVuZ3RoLAotCQkJIEMgKENPTkRfSlVNUCwgMCksIGUuWF9hZGRfc3ltYm9sLCBlLlhfYWRkX251bWJlciwgMCk7Ci0gICAgICBpc2l6ZSA9IEMzMl9MRU47Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSlU6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICBvdXRwdXQgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoLAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aCwKLQkJCSBDIChVTkNEX0pVTVAsIDApLCBlLlhfYWRkX3N5bWJvbCwgZS5YX2FkZF9udW1iZXIsIDApOwotICAgICAgaXNpemUgPSBVMzJfTEVOOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpMOgotICAgICAgaW5zdCA9IE1DT1JFX0lOU1RfSlNSSTsJCS8qIGpzcmkgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX3J0IChvcF9lbmQgKyAxLCAmIG91dHB1dCwgMSwgJiBlKTsKLSAgICAgIC8qIHBhcnNlX3J0KCkgY2FsbHMgZnJhZ19tb3JlIGZvciB1cy4gICovCi0gICAgICAKLSAgICAgIC8qIE9ubHkgZG8gdGhpcyBpZiB3ZSBrbm93IGhvdyB0byBkbyBpdCAuLi4gKi8KLSAgICAgIGlmIChlLlhfb3AgIT0gT19hYnNlbnQgJiYgZG9fanNyaTJic3IpCi0JewotCSAgLyogTG9vayBhdCBhZGRpbmcgdGhlIFJfUENSRUxfSlNSSU1NMTFCWTIuICAqLwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBvdXRwdXQtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIAotCQkgICAgICAgMiwgJiBlLCAxLCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUlNJOgkJCQkvKiBTSSwgYnV0IGltbSBiZWNvbWVzIDMyLWltbSAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOwotCSAgCi0JICByZWcgPSAzMiAtIHJlZzsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBETzIxOgkJCS8qIE8yLCBkdXAgcmQsIGxpdCBtdXN0IGJlIDEgKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBpbnN0IHw9IHJlZyA8PCA0OwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7Ci0JICAKLQkgIGlmIChyZWcgIT0gMSkKLQkgICAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtdXN0IGJlIDEiKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSWE6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7Ci0KLQkgIGlmIChyZWcgPT0gMCkKLQkgICAgYXNfYmFkIChfKCJ6ZXJvIHVzZWQgYXMgaW1tZWRpYXRlIHZhbHVlIikpOwotCSAgCi0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oInVuaW1wbGVtZW50ZWQgb3Bjb2RlIFwiJXNcIiIpLCBuYW1lKTsKLSAgICB9Ci0gIAotICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0gIAotICBjaGVja19saXRlcmFscyAob3Bjb2RlLT50cmFuc2ZlciwgaXNpemUpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgICAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9tY29yZV9lbmQgKCkKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5LiAgKi8KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4qLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKiBsaXRQOwotICAgICBpbnQgKiBzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgaW50ICAgIGk7Ci0gIGNoYXIgKiB0OwotICBjaGFyICogYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfTlRPRigpIik7Ci0gICAgfQotICAKLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIAotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgCi0gICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICAgIHsKLQltZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLAotCQkJICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQlsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIiI7Ci0KLSNkZWZpbmUgT1BUSU9OX0pTUkkyQlNSX09OCShPUFRJT05fTURfQkFTRSArIDApCi0jZGVmaW5lIE9QVElPTl9KU1JJMkJTUl9PRkYJKE9QVElPTl9NRF9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NJRklMVEVSX09OCShPUFRJT05fTURfQkFTRSArIDIpCi0jZGVmaW5lIE9QVElPTl9TSUZJTFRFUl9PRkYJKE9QVElPTl9NRF9CQVNFICsgMykKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSAgeyAibm8tanNyaTJic3IiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0pTUkkyQlNSX09GRn0sCi0gIHsgImpzcmkyYnNyIiwgICAgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9KU1JJMkJTUl9PTn0sCi0gIHsgInNpZmlsdGVyIiwgICAgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSUZJTFRFUl9PTn0sCi0gIHsgIm5vLXNpZmlsdGVyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSUZJTFRFUl9PRkZ9LAotICB7IE5VTEwsICAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIGludCBpOwotICBjaGFyICogcDsKLQotICBzd2l0Y2ggKGMpCi0gICAgewotICAgICAgCi0gICAgY2FzZSBPUFRJT05fSlNSSTJCU1JfT046ICBkb19qc3JpMmJzciA9IDE7ICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSlNSSTJCU1JfT0ZGOiBkb19qc3JpMmJzciA9IDA7ICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0lGSUxURVJfT046ICBzaWZpbHRlcl9tb2RlID0gMTsgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0lGSUxURVJfT0ZGOiBzaWZpbHRlcl9tb2RlID0gMDsgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqIHN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1NQ09SRSBzcGVjaWZpYyBvcHRpb25zOlxuXAotICAte25vLX1qc3JpMmJzcgkgIHtkaXN9YWJsZSBqc3JpIHRvIGJzciB0cmFuc2Zvcm1hdGlvbiAoZGVmOiBkaXMpXG5cCi0gIC17bm8tfXNpZmlsdGVyCSAge2Rpc31hYmxlIHNpbGljb24gZmlsdGVyIGJlaGF2aW9yIChkZWY6IGRpcykiKSk7Ci19Ci0MCi1pbnQgbWRfc2hvcnRfanVtcF9zaXplOwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX05kZHIsIHRvX05kZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqIHB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9OZGRyOwotICAgICBhZGRyZXNzVCB0b19OZGRyOwotICAgICBmcmFnUyAqIGZyYWc7Ci0gICAgIHN5bWJvbFMgKiB0b19zeW1ib2w7Ci17Ci0gIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG9ydF9qdW1wIikpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fTmRkciwgdG9fTmRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICogcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX05kZHI7Ci0gICAgIGFkZHJlc3NUIHRvX05kZHI7Ci0gICAgIGZyYWdTICogZnJhZzsKLSAgICAgc3ltYm9sUyAqIHRvX3N5bWJvbDsKLXsKLSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2s6IGxvbmdfanVtcCIpKTsKLX0KLQotLyogQ2FsbGVkIGFmdGVyIHJlbGF4aW5nLCBjaGFuZ2UgdGhlIGZyYWdzIHNvIHRoZXkga25vdyBob3cgYmlnIHRoZXkgYXJlLiAgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICogZnJhZ1A7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKiBidWZmZXI7Ci0gIGludCB0YXJnX2FkZHIgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICAKLSAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbCk7Ci0gIHRhcmdfYWRkciArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMTIpOgotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkNEMTIpOgotICAgICAgewotCS8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JaW50IG5leHRfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzcyArIDI7Ci0JdW5zaWduZWQgY2hhciB0MDsKLQlpbnQgZGlzcCA9IHRhcmdfYWRkciAtIG5leHRfaW5zdDsKLQkKLQlpZiAoZGlzcCAmIDEpCi0JICBhc19iYWQgKF8oIm9kZCBkaXNwbGFjZW1lbnQgYXQgJXgiKSwgbmV4dF9pbnN0IC0gMik7Ci0JCi0JZGlzcCA+Pj0gMTsKLQkgIHsKLQkgICAgdDAgPSBidWZmZXJbMF0gJiAweEY4OwotCQotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciwgZGlzcCwgMik7Ci0JCi0JICAgIGJ1ZmZlclswXSA9IChidWZmZXJbMF0gJiAweDA3KSB8IHQwOwotCSAgfQotCQotCWZyYWdQLT5mcl9maXggKz0gMjsKLQlmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChDT05EX0pVTVAsIENPTkQzMik6Ci0gICAgY2FzZSBDIChDT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICB7Ci0JLyogQSBjb25kaXRpb25hbCBicmFuY2ggd29udCBmaXQgaW50byAxMiBiaXRzIHNvOgotCSAqCWIhY29uZAkxZgotCSAqCWptcGkJMGYKLQkgKgkuYWxpZ24gMgotCSAqIDA6CS5sb25nIGRpc3AKLQkgKiAxOgotCSAqCi0JICogaWYgdGhlIGIhY29uZCBpcyA0IGJ5dGUgYWxpZ25lZCwgdGhlIGxpdGVyYWwgd2hpY2ggd291bGQKLQkgKiBnbyBhdCB4KzQgd2lsbCBhbHNvIGJlIGFsaWduZWQuCi0JICovCi0JaW50IGZpcnN0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7Ci0JaW50IG5lZWRwYWQgPSAoZmlyc3RfaW5zdCAmIDMpOwotCi0JICBidWZmZXJbMF0gXj0gMHgwODsJLyogVG9nZ2xlIFQvRiBiaXQgKi8KLQotCWJ1ZmZlclsyXSA9IElOU1RfQllURTAgKE1DT1JFX0lOU1RfSk1QSSk7CS8qIEJ1aWxkIGptcGkgKi8KLQlidWZmZXJbM10gPSBJTlNUX0JZVEUxIChNQ09SRV9JTlNUX0pNUEkpOwotIAotCWlmIChuZWVkcGFkKQotCSAgewotCSAgICAgIHsKLQkJYnVmZmVyWzFdID0gNDsJLyogYnJhbmNoIG92ZXIgam1waSwgcGFkLCBhbmQgcHRyICovCi0JCWJ1ZmZlclszXSA9IDE7CS8qIGptcGkgb2Zmc2V0IG9mIDEgZ2V0cyB0aGUgcG9pbnRlciAqLwotCSAgICAgIH0KLQkgICAgCi0JICAgIGJ1ZmZlcls0XSA9IDA7CS8qIGFsaWdubWVudC9wYWQgKi8KLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgYnVmZmVyWzZdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCi0JICAgIGJ1ZmZlcls3XSA9IDA7Ci0JICAgIGJ1ZmZlcls4XSA9IDA7Ci0JICAgIGJ1ZmZlcls5XSA9IDA7Ci0JICAgIAotCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNiwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICAKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBDMzJfTEVOOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogU2VlIGNvbW1lbnQgYmVsb3cgYWJvdXQgdGhpcyBnaXZlbiBnYXMnIGxpbWl0YXRpb25zIGZvcgotCSAgICAgICBzaHJpbmtpbmcgdGhlIGZyYWdtZW50LiAnMycgaXMgdGhlIGFtb3VudCBvZiBjb2RlIHRoYXQKLQkgICAgICAgd2UgaW5zZXJ0ZWQgaGVyZSwgYnV0ICc0JyBpcyByaWdodCBmb3IgdGhlIHNwYWNlIHdlIHJlc2VydmVkCi0JICAgICAgIGZvciB0aGlzIGZyYWdtZW50LiAqLwotCSAgICAgIHsKLQkJYnVmZmVyWzFdID0gMzsJLyogYnJhbmNoIG92ZXIgam1waSwgYW5kIHB0ciAqLwotCQlidWZmZXJbM10gPSAwOwkvKiBqbXBpIG9mZnNldCBvZiAwIGdldHMgdGhlIHBvaW50ZXIgKi8KLQkgICAgICB9Ci0JICAgIAotCSAgICBidWZmZXJbNF0gPSAwOwkvKiBzcGFjZSBmb3IgMzIgYml0IGFkZHJlc3MgKi8KLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgYnVmZmVyWzZdID0gMDsKLQkgICAgYnVmZmVyWzddID0gMDsKLQkgICAgCi0JICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AuICAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDQsCi0JCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBDMzJfTEVOOwotCi0JICAgIC8qIEZyYWcgaXMgYWN0dWFsbHkgc2hvcnRlciAoc2VlIHRoZSBvdGhlciBzaWRlIG9mIHRoaXMgaWZkZWYpCi0JICAgICAgIGJ1dCBnYXMgaXNuJ3QgcHJlcGFyZWQgZm9yIHRoYXQuICBXZSBoYXZlIHRvIHJlLWFkanVzdAotCSAgICAgICB0aGUgYnJhbmNoIGRpc3BsYWNlbWVudCBzbyB0aGF0IGl0IGdvZXMgYmV5b25kIHRoZSAKLQkgICAgICAgZnVsbCBsZW5ndGggb2YgdGhlIGZyYWdtZW50LCBub3QganVzdCB3aGF0IHdlIGFjdHVhbGx5Ci0JICAgICAgIGZpbGxlZCBpbi4gICovCi0JICAgICAgYnVmZmVyWzFdID0gNDsJLyogam1waSwgcHRyLCBhbmQgdGhlICd0YWlsIHBhZCcgKi8KLQkgIH0KLQkKLQlmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChVTkNEX0pVTVAsIFVOQ0QzMik6Ci0gICAgY2FzZSBDIChVTkNEX0pVTVAsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICB7Ci0JLyogQW4gdW5jb25kaXRpb25hbCBicmFuY2ggd2lsbCBub3QgZml0IGluIDEyIGJpdHMsIG1ha2UgY29kZSB3aGljaAotCSAgIGxvb2tzIGxpa2U6Ci0JICAJam1waQkwZgotCSAgCS5hbGlnbiAyCi0JICAgICAwOgkubG9uZyBkaXNwCi0JICAgd2UgbmVlZCBhIHBhZCBpZiAiZmlyc3RfaW5zdCIgaXMgNCBieXRlIGFsaWduZWQuCi0JICAgW2JlY2F1c2UgdGhlIG5hdHVyYWwgbGl0ZXJhbCBwbGFjZSBpcyB4ICsgMl0gICovCi0JaW50IGZpcnN0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7Ci0JaW50IG5lZWRwYWQgPSAhKGZpcnN0X2luc3QgJiAzKTsKLQotCWJ1ZmZlclswXSA9IElOU1RfQllURTAgKE1DT1JFX0lOU1RfSk1QSSk7CS8qIEJ1aWxkIGptcGkgKi8KLQlidWZmZXJbMV0gPSBJTlNUX0JZVEUxIChNQ09SRV9JTlNUX0pNUEkpOwotCi0JaWYgKG5lZWRwYWQpCi0JICB7Ci0JICAgICAgYnVmZmVyWzFdID0gMTsJLyogam1waSBvZmZzZXQgb2YgMSBzaW5jZSBwYWRkZWQgKi8KLQkgICAgYnVmZmVyWzJdID0gMDsJLyogYWxpZ25tZW50ICovCi0JICAgIGJ1ZmZlclszXSA9IDA7Ci0JICAgIGJ1ZmZlcls0XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbNV0gPSAwOwotCSAgICBidWZmZXJbNl0gPSAwOwotCSAgICBidWZmZXJbN10gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcC4gICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICAKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBVMzJfTEVOOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgICBidWZmZXJbMV0gPSAwOwkvKiBqbXBpIG9mZnNldCBvZiAwIGlmIG5vIHBhZCAqLwotCSAgICBidWZmZXJbMl0gPSAwOwkvKiBzcGFjZSBmb3IgMzIgYml0IGFkZHJlc3MgKi8KLQkgICAgYnVmZmVyWzNdID0gMDsKLQkgICAgYnVmZmVyWzRdID0gMDsKLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgCi0JICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AuICAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsCi0JCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBVMzJfTEVOOwotCSAgfQotCi0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIEFwcGxpZXMgdGhlIGRlc2lyZWQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLSAgIEFsc28gc2V0cyB1cCBhZGRlbmRzIGZvciAncmVsYScgdHlwZSByZWxvY2F0aW9ucy4gICovCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHAsIHNlZ21lbnQpCi0gICAgIGZpeFMgKiAgIGZpeFA7Ci0gICAgIHZhbHVlVCAqIHZhbHA7Ci0gICAgIHNlZ1QgICAgIHNlZ21lbnQ7Ci17Ci0gIGNoYXIgKiAgICAgICBidWYgID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBjaGFyICogICAgICAgZmlsZSA9IGZpeFAtPmZ4X2ZpbGUgPyBmaXhQLT5meF9maWxlIDogXygidW5rbm93biIpOwotICBjb25zdCBjaGFyICogc3ltbmFtZTsKLSAgLyogTm90ZTogdXNlIG9mZnNldFQgYmVjYXVzZSBpdCBpcyBzaWduZWQsIHZhbHVlVCBpcyB1bnNpZ25lZC4gICovCi0gIG9mZnNldFQgICAgICB2YWwgID0gKG9mZnNldFQpICogdmFscDsgCi0gIAotICBzeW1uYW1lID0gZml4UC0+ZnhfYWRkc3kgPyBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSkgOiBfKCI8dW5rbm93bj4iKTsKLSAgLyogU2F2ZSB0aGlzIGZvciB0aGUgYWRkZW5kIGluIHRoZSByZWxvY2F0aW9uIHJlY29yZC4gICovCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKLQotICAvKiBJZiB0aGUgZml4IGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkLCBvciBub3QKLSAgICAgaW4gdGhlIHNhbWUgc2VnbWVudCBhcyB0aGUgZml4LCB3ZSBjYW5ub3QgcmVzb2x2ZSBpdCBoZXJlLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmICggICAhIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZ21lbnQpKSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICAvKiBGb3IgRUxGIHdlIGNhbiBqdXN0IHJldHVybiBhbmQgbGV0IHRoZSByZWxvYyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkCi0JIHRha2UgY2FyZSBvZiBldmVyeXRoaW5nLiAgRm9yIENPRkYgd2Ugc3RpbGwgaGF2ZSB0byBpbnNlcnQgJ3ZhbCcKLQkgaW50byB0aGUgaW5zbiBzaW5jZSB0aGUgYWRkZW5kIGZpZWxkIHdpbGwgYmUgaWdub3JlZC4gICovCi0gICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotICAKLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyOiAgICAgLyogc2Vjb25kIGJ5dGUgb2YgMiBieXRlIG9wY29kZSAqLwotICAgICAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygib2RkIGRpc3RhbmNlIGJyYW5jaCAoMHgleCBieXRlcykiKSwgdmFsKTsKLSAgICAgIHZhbCAvPSAyOwotICAgICAgaWYgKCgodmFsICYgfjB4M2ZmKSAhPSAwKSAmJiAoKHZhbCB8IDB4M2ZmKSAhPSAtMSkpCi0JYXNfYmFkX3doZXJlIChmaWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJwY3JlbCBmb3IgYnJhbmNoIHRvICVzIHRvbyBmYXIgKDB4JXgpIiksCi0JCSAgICAgIHN5bW5hbWUsIHZhbCk7Ci0gICAgICAgIGJ1ZlswXSB8PSAoKHZhbCA+PiA4KSAmIDB4Nyk7Ci0gICAgICAgIGJ1ZlsxXSB8PSAodmFsICYgMHhmZik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQ6CS8qIGxvd2VyIDggYml0cyBvZiAyIGJ5dGUgb3Bjb2RlICovCi0gICAgICB2YWwgKz0gMzsKLSAgICAgIHZhbCAvPSA0OwotICAgICAgaWYgKHZhbCAmIH4weGZmKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygicGNyZWwgZm9yIGxydy9qbXBpL2pzcmkgdG8gJXMgdG9vIGZhciAoMHgleCkiKSwKLQkJICAgICAgc3ltbmFtZSwgdmFsKTsKLSAgICAgIGVsc2UKLQlidWZbMV0gfD0gKHZhbCAmIDB4ZmYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyOgkvKiBsb29wdCBpbnN0cnVjdGlvbiAqLwotICAgICAgaWYgKCh2YWwgPCAtMzIpIHx8ICh2YWwgPiAtMikpCi0JYXNfYmFkX3doZXJlIChmaWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJwY3JlbCBmb3IgbG9vcHQgdG9vIGZhciAoMHgleCkiKSwgdmFsKTsKLSAgICAgIHZhbCAvPSAyOwotICAgICAgICBidWZbMV0gfD0gKHZhbCAmIDB4Zik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKLSAgICAgIC8qIENvbmRpdGlvbmFsIGxpbmtlciBtYXAganNyaSB0byBic3IuICAqLwotICAgICAgLyogSWYgaXRzIGEgbG9jYWwgdGFyZ2V0IGFuZCBjbG9zZSBlbm91Z2gsIGZpeCBpdC4gCi0gICAgICAgICBOQjogPj0gLTJrIGZvciBiYWNrd2FyZHMgYnNyOyA8IDJrIGZvciBmb3J3YXJkcy4uLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmIHZhbCA+PSAtMjA0OCAgJiYgdmFsIDwgMjA0OCkKLQl7Ci0JICBsb25nIG52YWwgPSAodmFsIC8gMikgJiAweDdmZjsKLQkgIG52YWwgfD0gTUNPUkVfSU5TVF9CU1I7Ci0JICAKLQkgIC8qIFJFUExBQ0UgdGhlIGluc3RydWN0aW9uLCBkb24ndCBqdXN0IG1vZGlmeSBpdC4gICovCi0JICBidWZbMF0gPSBJTlNUX0JZVEUwIChudmFsKTsKLQkgIGJ1ZlsxXSA9IElOU1RfQllURTEgKG52YWwpOwotCX0KLSAgICAgIGVsc2UKLQlmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB0aGUgZml4IGlzIGFuIGFic29sdXRlIHJlbG9jIGJhc2VkIG9uIGEgc3ltYm9sJ3MKLQkgICAgIGFkZHJlc3MsIHRoZW4gaXQgY2Fubm90IGJlIHJlc29sdmVkIHVudGlsIHRoZSBmaW5hbCBsaW5rLiAgKi8KLQkgIGZpeFAtPmZ4X2RvbmUgPSAwOwotCX0KLSNpZmRlZiBPQkpfRUxGICAgICAgCi0gICAgICBlbHNlCi0jZW5kaWYKLQl7Ci0JICBpZiAoZml4UC0+Znhfc2l6ZSA9PSA0KQotCSAgICA7Ci0JICBlbHNlIGlmIChmaXhQLT5meF9zaXplID09IDIgJiYgdmFsID49IC0zMjc2OCAmJiB2YWwgPD0gMzI3NjcpCi0JICAgIDsKLQkgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSAmJiB2YWwgPj0gLTI1NiAmJiB2YWwgPD0gMjU1KQotCSAgICA7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAwOyAvKiBSZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4gICovCi19Ci0KLXZvaWQKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICAvKiBJZ25vcmUgbGVhZGluZyBoYXNoIHN5bWJvbCwgaWYgcG9yZXNlbnQuICAqLwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICB9Ci19Ci0KLWludCBtZF9sb25nX2p1bXBfc2l6ZTsKLQotLyogQ2FsbGVkIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbiwgcmV0dXJuIHRoZSBsZW5ndGgKLSAgIGJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvIHJlYWNoIGl0J3MgZGVzdGluYXRpb24uICAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKiBmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICAgIC8qIFVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duLiAgKi8KLSAgICAgIGlmICghZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ0RfSlVNUCwgVU5DRDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DRF9KVU1QLCBVTkNEMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNEX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIAotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICAgIC8qIFVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duLiAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JICAgICBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKENPTkRfSlVNUCwgQ09ORDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZy4gICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKENPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQzMildLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBrbm93IHRoZSBhYnMgdmFsdWUuICAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChDT05EX0pVTVAsIENPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMTIpXS5ybHhfbGVuZ3RoOwotCX0KLQotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgcmV0dXJuIGZyYWdQLT5mcl92YXI7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKiBwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gICAgc3dpdGNoIChuYnl0ZXMpCi0gICAgICB7Ci0gICAgICBjYXNlIDQ6ICpwdHIrKyA9ICh1c2UgPj4gMjQpICYgMHhmZjsgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDM6ICpwdHIrKyA9ICh1c2UgPj4gMTYpICYgMHhmZjsgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI6ICpwdHIrKyA9ICh1c2UgPj4gIDgpICYgMHhmZjsgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDE6ICpwdHIrKyA9ICh1c2UgPj4gIDApICYgMHhmZjsgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLSAgICAgIH0KLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCi0gICAgIGZpeFMgKiBmaXhwOwotICAgICBzZWdUIHNlYzsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGRlZmluZWQgaW4gYW5vdGhlciBzZWN0aW9uCi0gICAgIHdlIGxlYXZlIHRoZSBhZGQgbnVtYmVyIGFsb25lIGZvciB0aGUgbGlua2VyIHRvIGZpeCBpdCBsYXRlci4KLSAgICAgT25seSBhY2NvdW50IGZvciB0aGUgUEMgcHJlLWJ1bXAgKHdoaWNoIGlzIDIgYnl0ZXMgb24gdGhlIE1Db3JlKS4gKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICB8fCAoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IHNlYykpKQotICAgICAgCi0gIHsKLSAgICBhc3NlcnQgKGZpeHAtPmZ4X3NpemUgPT0gMik7CS8qIG11c3QgYmUgYW4gaW5zbiAqLwotICAgIHJldHVybiBmaXhwLT5meF9zaXplOwotICB9Ci0jZW5kaWYKLQotICAvKiBUaGUgY2FzZSB3aGVyZSB3ZSBhcmUgZ29pbmcgdG8gcmVzb2x2ZSB0aGluZ3MuLi4gKi8KLSAgcmV0dXJuICBmaXhwLT5meF9zaXplICsgZml4cC0+Znhfd2hlcmUgKyBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0jZGVmaW5lIEYoU1osUENSRUwpCQkoKChTWikgPDwgMSkgKyAoUENSRUwpKQotI2RlZmluZSBNQVAoU1osUENSRUwsVFlQRSkJY2FzZSBGIChTWiwgUENSRUwpOiBjb2RlID0gKFRZUEUpOyBicmVhawotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotICAgICBmaXhTICogZml4cDsKLXsKLSAgYXJlbGVudCAqIHJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0gIGludCBoYW5kbGVkID0gMDsKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgICAvKiBUaGVzZSBjb25mdXNlIHRoZSBzaXplL3BjcmVsIG1hY3JvIGFwcHJvYWNoLiAqLwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyOgotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyOgotICAgIGNhc2UgQkZEX1JFTE9DX1JWQTogICAgICAKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICAKLSAgICBkZWZhdWx0OgotICAgICAgc3dpdGNoIChGIChmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBNQVAgKDEsIDAsIEJGRF9SRUxPQ184KTsKLSAgICAgICAgICBNQVAgKDIsIDAsIEJGRF9SRUxPQ18xNik7Ci0gICAgICAgICAgTUFQICg0LCAwLCBCRkRfUkVMT0NfMzIpOwotICAgICAgICAgIE1BUCAoMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgICAgIE1BUCAoMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgICAgICBNQVAgKDQsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0JICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlICVzcmVsb2NhdGlvbiIpLAotCQkgIGZpeHAtPmZ4X3NpemUsCi0JICAgICAgICAgIGZpeHAtPmZ4X3BjcmVsID8gXygicGMtcmVsYXRpdmUiKSA6ICIiKTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgLyogQWx3YXlzIHBhc3MgdGhlIGFkZGVuZCBhbG9uZyEgICovCi0gIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIAotICBpZiAocmVsLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygiQ2Fubm90IHJlcHJlc2VudCByZWxvY2F0aW9uIHR5cGUgJXMiKSwKLSAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIAotICAgICAgLyogU2V0IGhvd3RvIHRvIGEgZ2FyYmFnZSB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGFzc2VydCAocmVsLT5ob3d0byAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbDsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLS8qIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxvY2F0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIG91dCBzd2l0Y2ggYW5kIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdoZW4KLSAgIHJlbGF4aW5nLiAgKi8KLWludAotbWNvcmVfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICogZml4OwotewotICBpZiAoICAgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1JWQSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGZpeCBjYW4gYmUgaGFuZGxlZCBieSBHQVMsIGZhbHNlIGlmIGl0IG11c3QKLSAgIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBsaW5rZXIuICAqLwotYm9vbGVhbgotbWNvcmVfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICogZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzLiAgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbWNvcmUuaCBiL2dhcy9jb25maWcvdGMtbWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmMTMyMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLW1jb3JlLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmCVRDX01DT1JFCi0jZGVmaW5lIFRDX01DT1JFIDEKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIE1DT1JFIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJYmZkX2FyY2hfbWNvcmUKLS8qIFVzZWQgdG8gaW5pdGlhbGlzZSB0YXJnZXRfYmlnX2VuZGlhbi4gICovCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotLyogRG9uJ3Qgd3JpdGUgb3V0IHJlbG9jcyBmb3IgcGNyZWwgc3R1ZmYuICAqLwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKCh4KS0+ZnhfYWRkc3kgfHwgKHgpLT5meF9zdWJzeSkgJiYgXAotCQkJICAgKHgpLT5meF9yX3R5cGUgPCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCkKLQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShhLGIsYykgdGNfcmVsb2NfbWFuZ2xlIChhLCBiLCBjKQotCi0vKiBTb21lIHBzZXVkby1vcCBzZW1hbnRpYyBleHRlbnNpb25zLiAgKi8KLSNkZWZpbmUJUFNFVURPX0xDT01NX09QVElPTkFMX0FMSUdOCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgICAgICAgIAkiTS5DT1JFIEdBUyBWZXJzaW9uIDIuOS40IgotI2RlZmluZSBMSVNUSU5HX0xIU19DT05UX0xJTkVTCTQKLQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQkxCi0jZGVmaW5lIENPRkZfRkxBR1MgCTEKLQotLyogV2Ugd2FudCBsb2NhbCBsYWJlbCBzdXBwb3J0LiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSAgICAgCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotI2RlZmluZSBtZF9lbmQJbWRfbWNvcmVfZW5kCi0KLS8qIFdhbnQgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24gdG9vLi4uICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoRklYUCwgU0VDKQotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMgIC8qIFdlIHdhbnQgdGhlIHNlZ21lbnQgYXMgd2VsbC4gICovCi0KLQotCi0jaWZkZWYgIE9CSl9DT0ZGCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkodGFyZ2V0X2JpZ19lbmRpYW4gPyAicGUtbWNvcmUtYmlnIiA6ICJwZS1tY29yZS1saXR0bGUiKQotCi1zdHJ1Y3QgbWNvcmVfdGNfc3kKLXsKLSAgaW50IHN5X2ZsYWdzOwotfTsKLQotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHN0cnVjdCBtY29yZV90Y19zeQotCi0jIGlmIGRlZmluZWQgVEVfUEUKLSMgIGRlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKHgpICgoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUlZBKQotIyBlbmRpZgotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotCi0jaWZkZWYgT0JKX0VMRgotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImVsZjMyLW1jb3JlLWJpZyIgOiAiZWxmMzItbWNvcmUtbGl0dGxlIikKLQotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5jdG9ycyIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLSAgeyAiLmR0b3JzIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAotLyogT3RoZXIgc3BlY2lhbCBzZWN0aW9ucyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXI6IC5yZWdpbmZvLAotICAgLmxpYmxpc3QsIC5jb25mbGljdCwgLmdwdGFiLCAuZ290LCAuZHluYW1pYywgLnJlbC5keW4uICAqLwotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGVtaXQgdmFyaW91cyByZWxvY3Mgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0LiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIG1jb3JlX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLWV4dGVybiBpbnQgbWNvcmVfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgbWNvcmVfZml4X2FkanVzdGFibGUgKGZpeFApCi1leHRlcm4gYm9vbGVhbiBtY29yZV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jIGVycm9yIE5vIHRhcmdldCBmb3JtYXQgc3BlY2lmaWVkLgotI2VuZGlmCi0KLSNpbmNsdWRlICJ3cml0ZS5oIiAgICAgICAgLyogRm9yIGRlZmluaXRpb24gb2YgZml4UyAqLwotICAKLWV4dGVybiB2b2lkICAgICAgbWRfYmVnaW4gICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2Fzc2VtYmxlICAgICAgICAgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gc3ltYm9sUyAqIG1kX3VuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX21jb3JlX2VuZCAgICAgICAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKiAgICBtZF9hdG9mICAgICAgICAgICAgIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQgKikpOwotZXh0ZXJuIGludCAgICAgICBtZF9wYXJzZV9vcHRpb24gICAgIFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX3Nob3dfdXNhZ2UgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIAotICBQQVJBTVMgKChjaGFyICosIGFkZHJlc3NULCBhZGRyZXNzVCwgZnJhZ1MgKiwgc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2NyZWF0ZV9sb25nX2p1bXAKLSAgUEFSQU1TICgoY2hhciAqLCBhZGRyZXNzVCwgYWRkcmVzc1QsIGZyYWdTICosIHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9jb252ZXJ0X2ZyYWcgICAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgc2VnVCwgZnJhZ1MgKikpOwotZXh0ZXJuIGludCAgICAgICBtZF9hcHBseV9maXgzICAgICAgICAgICAgICAgICBQQVJBTVMgKChmaXhTICosIHZhbHVlVCAqLCBzZWdUKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX29wZXJhbmQgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLWV4dGVybiBpbnQgICAgICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggUEFSQU1TICgoZnJhZ1MgKiwgc2VnVCkpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgICAgICAgICAgICBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50KSk7Ci1leHRlcm4gdmFsdWVUICAgIG1kX3NlY3Rpb25fYWxpZ24gICAgICAgICAgICAgIFBBUkFNUyAoKHNlZ1QsIHZhbHVlVCkpOwotZXh0ZXJuIGxvbmcgICAgICBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gICAgICAgICBQQVJBTVMgKChmaXhTICosIHNlZ1QpKTsKLWV4dGVybiBhcmVsZW50ICogdGNfZ2VuX3JlbG9jICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYXNlY3Rpb24gKiwgZml4UyAqKSk7Ci0KLSNlbmRpZiAvKiBUQ19NQ09SRSAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1taXBzLmMgYi9nYXMvY29uZmlnL3RjLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmZGNhNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDExNzcyICswLDAgQEAKLS8qIHRjLW1pcHMuYyAtLSBhc3NlbWJsZSBjb2RlIGZvciBhIE1JUFMgY2hpcC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgdGhlIE9TRiBhbmQgUmFscGggQ2FtcGJlbGwuCi0gICBXcml0dGVuIGJ5IEtlaXRoIEtub3dsZXMgYW5kIFJhbHBoIENhbXBiZWxsLCB3b3JraW5nIGluZGVwZW5kZW50bHkuCi0gICBNb2RpZmllZCBmb3IgRUNPRkYgYW5kIFI0MDAwIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMKLSAgIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIFVTRV9TVERBUkcKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotI2lmZGVmIFVTRV9WQVJBUkdTCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIERCRyh4KQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfTUFZQkVfRUxGCi0vKiBDbGVhbiB1cCBuYW1lc3BhY2Ugc28gd2UgY2FuIGluY2x1ZGUgb2JqLWVsZi5oIHRvby4gICovCi1zdGF0aWMgaW50IG1pcHNfb3V0cHV0X2ZsYXZvciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IG1pcHNfb3V0cHV0X2ZsYXZvciAoKSB7IHJldHVybiBPVVRQVVRfRkxBVk9SOyB9Ci0jdW5kZWYgT0JKX1BST0NFU1NfU1RBQgotI3VuZGVmIE9VVFBVVF9GTEFWT1IKLSN1bmRlZiBTX0dFVF9BTElHTgotI3VuZGVmIFNfR0VUX1NJWkUKLSN1bmRlZiBTX1NFVF9BTElHTgotI3VuZGVmIFNfU0VUX1NJWkUKLSN1bmRlZiBvYmpfZnJvYl9maWxlCi0jdW5kZWYgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLSN1bmRlZiBvYmpfZnJvYl9zeW1ib2wKLSN1bmRlZiBvYmpfcG9wX2luc2VydAotI3VuZGVmIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotI3VuZGVmIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTCi0KLSNpbmNsdWRlICJvYmotZWxmLmgiCi0vKiBGaXggYW55IG9mIHRoZW0gdGhhdCB3ZSBhY3R1YWxseSBjYXJlIGFib3V0LiAgKi8KLSN1bmRlZiBPVVRQVVRfRkxBVk9SCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgbWlwc19vdXRwdXRfZmxhdm9yKCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikKLSNpbmNsdWRlICJlbGYvbWlwcy5oIgotI2VuZGlmCi0KLSNpZm5kZWYgRUNPRkZfREVCVUdHSU5HCi0jZGVmaW5lIE5PX0VDT0ZGX0RFQlVHR0lORwotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMAotI2VuZGlmCi0KLSNpbmNsdWRlICJlY29mZi5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLXN0YXRpYyBjaGFyICptaXBzX3JlZ21hc2tfZnJhZzsKLSNlbmRpZgotCi0jZGVmaW5lIEFUICAxCi0jZGVmaW5lIFRSRUcgMjQKLSNkZWZpbmUgUElDX0NBTExfUkVHIDI1Ci0jZGVmaW5lIEtUMCAyNgotI2RlZmluZSBLVDEgMjcKLSNkZWZpbmUgR1AgIDI4Ci0jZGVmaW5lIFNQICAyOQotI2RlZmluZSBGUCAgMzAKLSNkZWZpbmUgUkEgIDMxCi0KLSNkZWZpbmUgSUxMRUdBTF9SRUcgKDMyKQotCi0vKiBBbGxvdyBvdmVycmlkZSBvZiBzdGFuZGFyZCBsaXR0bGUtZW5kaWFuIEVDT0ZGIGZvcm1hdC4gICovCi0KLSNpZm5kZWYgRUNPRkZfTElUVExFX0ZPUk1BVAotI2RlZmluZSBFQ09GRl9MSVRUTEVfRk9STUFUICJlY29mZi1saXR0bGVtaXBzIgotI2VuZGlmCi0KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLS8qIDEgaXMgd2Ugc2hvdWxkIHVzZSB0aGUgNjQgYml0IE1JUFMgRUxGIEFCSSwgMCBpZiB3ZSBzaG91bGQgdXNlIHRoZQotICAgMzIgYml0IEFCSS4gIFRoaXMgaGFzIG5vIG1lYW5pbmcgZm9yIEVDT0ZGLgotICAgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGlzIGFsd2F5cyAzMiBiaXQsIGV2ZW4gaWYgImNvbmZpZ3VyZWQiIGZvcgotICAgNjQgYml0IFtlLmcuIC0tdGFyZ2V0PW1pcHM2NC1lbGZdLiAgKi8KLXN0YXRpYyBpbnQgbWlwc182NDsKLQotLyogVGhlIGRlZmF1bHQgdGFyZ2V0IGZvcm1hdCB0byB1c2UuICAqLwotY29uc3QgY2hhciAqCi1taXBzX3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgc3dpdGNoIChPVVRQVVRfRkxBVk9SKQotICAgIHsKLSAgICBjYXNlIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyOgotICAgICAgcmV0dXJuIHRhcmdldF9iaWdfZW5kaWFuID8gImEub3V0LW1pcHMtYmlnIiA6ICJhLm91dC1taXBzLWxpdHRsZSI7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gdGFyZ2V0X2JpZ19lbmRpYW4gPyAiZWNvZmYtYmlnbWlwcyIgOiBFQ09GRl9MSVRUTEVfRk9STUFUOwotICAgIGNhc2UgYmZkX3RhcmdldF9lbGZfZmxhdm91cjoKLSAgICAgIHJldHVybiAodGFyZ2V0X2JpZ19lbmRpYW4KLQkgICAgICA/IChtaXBzXzY0ID8gImVsZjY0LWJpZ21pcHMiIDogImVsZjMyLWJpZ21pcHMiKQotCSAgICAgIDogKG1pcHNfNjQgPyAiZWxmNjQtbGl0dGxlbWlwcyIgOiAiZWxmMzItbGl0dGxlbWlwcyIpKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSByZWFkb25seSBkYXRhIHNlY3Rpb24uICAqLwotI2RlZmluZSBSREFUQV9TRUNUSU9OX05BTUUgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIgXAotCQkJICAgID8gIi5kYXRhIiBcCi0JCQkgICAgOiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciBcCi0JCQkgICAgPyAiLnJkYXRhIiBcCi0JCQkgICAgOiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIgXAotCQkJICAgID8gIi5yb2RhdGEiIFwKLQkJCSAgICA6IChhYm9ydCAoKSwgIiIpKQotCi0vKiBUaGlzIGlzIHRoZSBzZXQgb2Ygb3B0aW9ucyB3aGljaCBtYXkgYmUgbW9kaWZpZWQgYnkgdGhlIC5zZXQKLSAgIHBzZXVkby1vcC4gIFdlIHVzZSBhIHN0cnVjdCBzbyB0aGF0IC5zZXQgcHVzaCBhbmQgLnNldCBwb3AgYXJlIG1vcmUKLSAgIHJlbGlhYmxlLiAgKi8KLQotc3RydWN0IG1pcHNfc2V0X29wdGlvbnMKLXsKLSAgLyogTUlQUyBJU0EgKEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUpIGxldmVsLiAgVGhpcyBpcyBzZXQgdG8gLTEKLSAgICAgaWYgaXQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiAgQ2hhbmdlZCBieSBgLnNldCBtaXBzTicsIGFuZCB0aGUKLSAgICAgLW1pcHNOIGNvbW1hbmQgbGluZSBvcHRpb24sIGFuZCB0aGUgZGVmYXVsdCBDUFUuICAqLwotICBpbnQgaXNhOwotICAvKiBXaGV0aGVyIHdlIGFyZSBhc3NlbWJsaW5nIGZvciB0aGUgbWlwczE2IHByb2Nlc3Nvci4gIDAgaWYgd2UgYXJlCi0gICAgIG5vdCwgMSBpZiB3ZSBhcmUsIGFuZCAtMSBpZiB0aGUgdmFsdWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLgotICAgICBDaGFuZ2VkIGJ5IGAuc2V0IG1pcHMxNicgYW5kIGAuc2V0IG5vbWlwczE2JywgYW5kIHRoZSAtbWlwczE2IGFuZAotICAgICAtbm9taXBzMTYgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFuZCB0aGUgZGVmYXVsdCBDUFUuICAqLwotICBpbnQgbWlwczE2OwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IHJlb3JkZXIgaW5zdHJ1Y3Rpb25zLiAgQ2hhbmdlZCBieSBgLnNldAotICAgICByZW9yZGVyJyBhbmQgYC5zZXQgbm9yZW9yZGVyJy4gICovCi0gIGludCBub3Jlb3JkZXI7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgcGVybWl0IHRoZSAkYXQgKCQxKSByZWdpc3RlciB0byBiZSB1c2VkCi0gICAgIGluIGluc3RydWN0aW9ucy4gIENoYW5nZWQgYnkgYC5zZXQgYXQnIGFuZCBgLnNldCBub2F0Jy4gICovCi0gIGludCBub2F0OwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgd2FybiB3aGVuIGEgbWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kcyBpbnRvCi0gICAgIG1vcmUgdGhhbiBvbmUgbWFjaGluZSBpbnN0cnVjdGlvbi4gIENoYW5nZWQgYnkgYC5zZXQgbm9tYWNybycgYW5kCi0gICAgIGAuc2V0IG1hY3JvJy4gICovCi0gIGludCB3YXJuX2Fib3V0X21hY3JvczsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBtb3ZlIGluc3RydWN0aW9ucy4gIENoYW5nZWQgYnkgYC5zZXQKLSAgICAgbW92ZScsIGAuc2V0IHZvbGF0aWxlJywgYC5zZXQgbm9tb3ZlJywgYW5kIGAuc2V0IG5vdm9sYXRpbGUnLiAgKi8KLSAgaW50IG5vbW92ZTsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBvcHRpbWl6ZSBicmFuY2hlcyBieSBtb3ZpbmcgdGhlIHRhcmdldAotICAgICBvZiB0aGUgYnJhbmNoIGludG8gdGhlIGRlbGF5IHNsb3QuICBBY3R1YWxseSwgd2UgZG9uJ3QgcGVyZm9ybQotICAgICB0aGlzIG9wdGltaXphdGlvbiBhbnlob3cuICBDaGFuZ2VkIGJ5IGAuc2V0IGJvcHQnIGFuZCBgLnNldAotICAgICBub2JvcHQnLiAgKi8KLSAgaW50IG5vYm9wdDsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBhdXRvZXh0ZW5kIG1pcHMxNiBpbnN0cnVjdGlvbnMuCi0gICAgIENoYW5nZWQgYnkgYC5zZXQgYXV0b2V4dGVuZCcgYW5kIGAuc2V0IG5vYXV0b2V4dGVuZCcuICAqLwotICBpbnQgbm9hdXRvZXh0ZW5kOwotfTsKLQotLyogVGhpcyBpcyB0aGUgc3RydWN0IHdlIHVzZSB0byBob2xkIHRoZSBjdXJyZW50IHNldCBvZiBvcHRpb25zLiAgTm90ZQotICAgdGhhdCB3ZSBtdXN0IHNldCB0aGUgaXNhIGFuZCBtaXBzMTYgZmllbGRzIHRvIC0xIHRvIGluZGljYXRlIHRoYXQKLSAgIHRoZXkgaGF2ZSBub3QgYmVlbiBpbml0aWFsaXplZC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19zZXRfb3B0aW9ucyBtaXBzX29wdHMgPSB7IC0xLCAtMSB9OwotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBtYXNrcyBvZiByZWdpc3RlcnMgdXNlZC4KLSAgIFRoZSBvYmplY3QgZm9ybWF0IGNvZGUgcmVhZHMgdGhlbSBhbmQgcHV0cyB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZQotICAgcGxhY2UuICAqLwotdW5zaWduZWQgbG9uZyBtaXBzX2dwcm1hc2s7Ci11bnNpZ25lZCBsb25nIG1pcHNfY3BybWFza1s0XTsKLQotLyogTUlQUyBJU0Egd2UgYXJlIHVzaW5nIGZvciB0aGlzIG91dHB1dCBmaWxlLiAgKi8KLXN0YXRpYyBpbnQgZmlsZV9taXBzX2lzYTsKLQotLyogVGhlIENQVSB0eXBlIGFzIGEgbnVtYmVyOiAyMDAwLCAzMDAwLCA0MDAwLCA0NDAwLCBldGMuICAqLwotc3RhdGljIGludCBtaXBzX2NwdSA9IC0xOwotCi0vKiBUaGUgYXJndW1lbnQgb2YgdGhlIC1tYWJpPSBmbGFnLiAqLwotc3RhdGljIGNoYXIqIG1pcHNfYWJpX3N0cmluZyA9IDA7Ci0KLS8qIFdldGhlciB3ZSBzaG91bGQgbWFyayB0aGUgZmlsZSBFQUJJNjQgb3IgRUFCSTMyLiAqLwotc3RhdGljIGludCBtaXBzX2VhYmk2NCA9IDA7Ci0KLS8qIElmIHRoZXkgYXNrZWQgZm9yIG1pcHMxIG9yIG1pcHMyIGFuZCBhIGNwdSB0aGF0IGlzCi0gICBtaXBzMyBvciBncmVhdGVyLCB0aGVuIG1hcmsgdGhlIG9iamVjdCBmaWxlIDMyQklUTU9ERS4gKi8KLXN0YXRpYyBpbnQgbWlwc18zMmJpdG1vZGUgPSAwOwotCi0vKiBTb21lIElTQSdzIGhhdmUgZGVsYXkgc2xvdHMgZm9yIGluc3RydWN0aW9ucyB3aGljaCByZWFkIG9yIHdyaXRlCi0gICBmcm9tIGEgY29wcm9jZXNzb3IgKGVnLiBtaXBzMS1taXBzMyk7IHNvbWUgZG9uJ3QgKGVnIG1pcHM0KS4KLSAgIFJldHVybiB0cnVlIGlmIGluc3RydWN0aW9ucyBtYXJrZWQgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSwgCi0gICBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZLCBvciBJTlNOX1dSSVRFX0NPTkRfQ09ERSBhY3R1YWxseSBoYXZlIGEKLSAgIGRlbGF5IHNsb3QgaW4gdGhpcyBJU0EuICBUaGUgdXNlcyBvZiB0aGlzIG1hY3JvIGFzc3VtZSB0aGF0IGFueQotICAgSVNBIHRoYXQgaGFzIGRlbGF5IHNsb3RzIGZvciBvbmUgb2YgdGhlc2UsIGhhcyB0aGVtIGZvciBhbGwuICBUaGV5Ci0gICBhbHNvIGFzc3VtZSB0aGF0IElTQXMgd2hpY2ggZG9uJ3QgaGF2ZSBkZWxheXMgZm9yIHRoZXNlIGluc25zLCBkb24ndAotICAgaGF2ZSBkZWxheXMgZm9yIHRoZSBJTlNOX0xPQURfTUVNT1JZX0RFTEFZIGluc3RydWN0aW9ucyBlaXRoZXIuICovCi0jZGVmaW5lIElTQV9IQVNfQ09QUk9DX0RFTEFZUyhJU0EpICggICAgICAgIFwKLSAgIChJU0EpID09IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfHwgKElTQSkgPT0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB8fCAoSVNBKSA9PSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICkKLQotLyogIFJldHVybiB0cnVlIGlmIElTQSBzdXBwb3J0cyA2NCBiaXQgZ3AgcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLiAqLwotI2RlZmluZSBJU0FfSEFTXzY0QklUX1JFR1MoSVNBKSAoICAgIFwKLSAgIChJU0EpID09IDMgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB8fCAoSVNBKSA9PSA0ICAgICAgICAgICAgICAgICAgICAgXAotICAgKQotCi0vKiBXaGV0aGVyIHRoZSBwcm9jZXNzb3IgdXNlcyBoYXJkd2FyZSBpbnRlcmxvY2tzIHRvIHByb3RlY3QgCi0gICByZWFkcyBmcm9tIHRoZSBISSBhbmQgTE8gcmVnaXN0ZXJzLCBhbmQgdGh1cyBkb2VzIG5vdAotICAgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkLgotCi0gICBGSVhNRTogR0NDIG1ha2VzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiAtbWNwdT1GT08gYW5kIC1tRk9POgotICAgLW1jcHU9Rk9PIHNjaGVkdWxlcyBmb3IgRk9PLCBidXQgc3RpbGwgcHJvZHVjZXMgY29kZSB0aGF0IG1lZXRzIHRoZQotICAgcmVxdWlyZW1lbnRzIG9mIE1JUFMgSVNBIEkuICBGb3IgZXhhbXBsZSwgaXQgd29uJ3QgZ2VuZXJhdGUgYW55Ci0gICBGT08tc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLCBhbmQgaXQgd2lsbCBzdGlsbCBhc3N1bWUgdGhhdCBhbnkKLSAgIHNjaGVkdWxpbmcgaGF6YXJkcyBkZXNjcmliZWQgaW4gTUlQUyBJU0EgSSBhcmUgdGhlcmUsIGV2ZW4gaWYgRk9PCi0gICBoYXMgaW50ZXJsb2Nrcy4gIC1tRk9PIGdpdmVzIEdDQyBwZXJtaXNzaW9uIHRvIGdlbmVyYXRlIGNvZGUgdGhhdAotICAgd2lsbCBvbmx5IHJ1biBvbiBhIEZPTzsgaXQgd2lsbCBnZW5lcmF0ZSBGT08tc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLAotICAgYW5kIGFzc3VtZSBpbnRlcmxvY2tzIHByb3ZpZGVkIGJ5IGEgRk9PLgotCi0gICBIb3dldmVyLCBHQVMgY3VycmVudGx5IGRvZXNuJ3QgbWFrZSB0aGlzIGRpc3RpbmN0aW9uOyBiZWZvcmUgSmFuIDI4Ci0gICAxOTk5LCBHQVMncyAtbWNwdT1GT08gaW1wbGllZCAtbUZPTywgd2hpY2ggdmlvbGF0ZXMgR0NDJ3MKLSAgIGFzc3VtcHRpb25zLiAgVGhlIEdDQyBkcml2ZXIgcGFzc2VzIHRoZXNlIGZsYWdzIHRocm91Z2ggdG8gR0FTLCBzbwotICAgaWYgR0FTIGFjdHVhbGx5IGRvZXMgYW55dGhpbmcgdGhhdCBkb2Vzbid0IG1lZXQgTUlQUyBJU0EgSSB3aXRoCi0gICAtbUZPTywgdGhlbiBHQ0MncyAtbWNwdT1GT08gZmxhZyBpc24ndCBnb2luZyB0byB3b3JrLgotCi0gICBBbmQgZnVydGhlcm1vcmUsIGl0IGRpZCBub3QgYXNzdW1lIHRoYXQgLW1GT08gaW1wbGllZCAtbWNwdT1GT08sCi0gICB3aGljaCBzZWVtcyBzZW5zZWxlc3MgLS0tIHdoeSBnZW5lcmF0ZSBjb2RlIHdoaWNoIHdpbGwgb25seSBydW4gb24KLSAgIGEgRk9PLCBidXQgc2NoZWR1bGUgZm9yIHNvbWV0aGluZyBlbHNlPwotCi0gICBTbyBub3csIGF0IGxlYXN0LCAtbWNwdT1GT08gYW5kIC1tRk9PIGFyZSBleGFjdGx5IGVxdWl2YWxlbnQuCi0KLSAgIC0tIEppbSBCbGFuZHkgPGppbWJAY3lnbnVzLmNvbT4gKi8KLQotI2RlZmluZSBoaWxvX2ludGVybG9ja3MgKG1pcHNfY3B1ID09IDQwMTAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0vKiBXaGV0aGVyIHRoZSBwcm9jZXNzb3IgdXNlcyBoYXJkd2FyZSBpbnRlcmxvY2tzIHRvIHByb3RlY3QgcmVhZHMKLSAgIGZyb20gdGhlIEdQUnMsIGFuZCB0aHVzIGRvZXMgbm90IHJlcXVpcmUgbm9wcyB0byBiZSBpbnNlcnRlZC4gICovCi0jZGVmaW5lIGdwcl9pbnRlcmxvY2tzIFwKLSAgKG1pcHNfb3B0cy5pc2EgIT0gMSAgXAotICAgfHwgbWlwc19jcHUgPT0gMzkwMCkKLQotLyogQXMgd2l0aCBvdGhlciAiaW50ZXJsb2NrcyIgdGhpcyBpcyB1c2VkIGJ5IGhhcmR3YXJlIHRoYXQgaGFzIEZQCi0gICAoY28tcHJvY2Vzc29yKSBpbnRlcmxvY2tzLiAgKi8KLS8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSNkZWZpbmUgY29wX2ludGVybG9ja3MgKG1pcHNfY3B1ID09IDQzMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJKQotCi0vKiBNSVBTIFBJQyBsZXZlbC4gICovCi0KLWVudW0gbWlwc19waWNfbGV2ZWwKLXsKLSAgLyogRG8gbm90IGdlbmVyYXRlIFBJQyBjb2RlLiAgKi8KLSAgTk9fUElDLAotCi0gIC8qIEdlbmVyYXRlIFBJQyBjb2RlIGFzIGluIElyaXggNC4gIFRoaXMgaXMgbm90IGltcGxlbWVudGVkLCBhbmQgSSdtCi0gICAgIG5vdCBzdXJlIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uICAqLwotICBJUklYNF9QSUMsCi0KLSAgLyogR2VuZXJhdGUgUElDIGNvZGUgYXMgaW4gdGhlIFNWUjQgTUlQUyBBQkkuICAqLwotICBTVlI0X1BJQywKLQotICAvKiBHZW5lcmF0ZSBQSUMgY29kZSB3aXRob3V0IHVzaW5nIGEgZ2xvYmFsIG9mZnNldCB0YWJsZTogdGhlIGRhdGEKLSAgICAgc2VnbWVudCBoYXMgYSBtYXhpbXVtIHNpemUgb2YgNjRLLCBhbGwgZGF0YSByZWZlcmVuY2VzIGFyZSBvZmYKLSAgICAgdGhlICRncCByZWdpc3RlciwgYW5kIGFsbCB0ZXh0IHJlZmVyZW5jZXMgYXJlIFBDIHJlbGF0aXZlLiAgVGhpcwotICAgICBpcyB1c2VkIG9uIHNvbWUgZW1iZWRkZWQgc3lzdGVtcy4gICovCi0gIEVNQkVEREVEX1BJQwotfTsKLQotc3RhdGljIGVudW0gbWlwc19waWNfbGV2ZWwgbWlwc19waWM7Ci0KLS8qIDEgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIDMyIGJpdCBvZmZzZXRzIGZyb20gdGhlIEdQIHJlZ2lzdGVyIGluCi0gICBTVlI0X1BJQyBtb2RlLiAgQ3VycmVudGx5IGhhcyBubyBtZWFuaW5nIGluIG90aGVyIG1vZGVzLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19iaWdfZ290OwotCi0vKiAxIGlmIHRyYXAgaW5zdHJ1Y3Rpb25zIHNob3VsZCB1c2VkIGZvciBvdmVyZmxvdyByYXRoZXIgdGhhbiBicmVhawotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0YXRpYyBpbnQgbWlwc190cmFwOwotCi0vKiBOb24temVybyBpZiBhbnkgLnNldCBub3Jlb3JkZXIgZGlyZWN0aXZlcyB3ZXJlIHVzZWQuICAqLwotCi1zdGF0aWMgaW50IG1pcHNfYW55X25vcmVvcmRlcjsKLQotLyogVGhlIHNpemUgb2YgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKLS8qIFdoZXRoZXIgdGhlIC1HIG9wdGlvbiB3YXMgdXNlZC4gICovCi1zdGF0aWMgaW50IGdfc3dpdGNoX3NlZW4gPSAwOwotCi0jZGVmaW5lIE5fUk1BU0sgMHhjNAotI2RlZmluZSBOX1ZGUCAgIDB4ZDQKLQotLyogSWYgd2UgY2FuIGRldGVybWluZSBpbiBhZHZhbmNlIHRoYXQgR1Agb3B0aW1pemF0aW9uIHdvbid0IGJlCi0gICBwb3NzaWJsZSwgd2UgY2FuIHNraXAgdGhlIHJlbGF4YXRpb24gc3R1ZmYgdGhhdCB0cmllcyB0byBwcm9kdWNlCi0gICBHUC1yZWxhdGl2ZSByZWZlcmVuY2VzLiAgVGhpcyBtYWtlcyBkZWxheSBzbG90IG9wdGltaXphdGlvbiB3b3JrCi0gICBiZXR0ZXIuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgcHJvdmlkZSBhIGd1ZXNzLCBidXQgaXQgc2VlbXMgdG8gd29yayBmb3IKLSAgIGdjYyBvdXRwdXQuICBJdCBuZWVkcyB0byBndWVzcyByaWdodCBmb3IgZ2NjLCBvdGhlcndpc2UgZ2NjCi0gICB3aWxsIHB1dCB3aGF0IGl0IHRoaW5rcyBpcyBhIEdQLXJlbGF0aXZlIGluc3RydWN0aW9uIGluIGEgYnJhbmNoCi0gICBkZWxheSBzbG90LgotCi0gICBJIGRvbid0IGtub3cgaWYgYSBmaXggaXMgbmVlZGVkIGZvciB0aGUgU1ZSNF9QSUMgbW9kZS4gIEkndmUgb25seQotICAgZml4ZWQgaXQgZm9yIHRoZSBub24tUElDIG1vZGUuICBLUiA5NS8wNC8wNyAgKi8KLXN0YXRpYyBpbnQgbm9waWNfbmVlZF9yZWxheCBQQVJBTVMgKChzeW1ib2xTICosIGludCkpOwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLS8qIFRoZSBvcGNvZGUgaGFzaCB0YWJsZSB3ZSB1c2UgZm9yIHRoZSBtaXBzMTYuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1pcHMxNl9vcF9oYXNoID0gTlVMTDsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IEMgc3R5bGUgY29tbWVudHMgYXJlIGFsd2F5cyBzdXBwb3J0ZWQuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyBtYWNoaW5lIHNwZWNpZmljIGxpbmUgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4KLSAqLwotCi1zdGF0aWMgY2hhciAqaW5zbl9lcnJvcjsKLQotc3RhdGljIGludCBhdXRvX2FsaWduID0gMTsKLQotLyogV2hlbiBvdXRwdXR0aW5nIFNWUjQgUElDIGNvZGUsIHRoZSBhc3NlbWJsZXIgbmVlZHMgdG8ga25vdyB0aGUKLSAgIG9mZnNldCBpbiB0aGUgc3RhY2sgZnJhbWUgZnJvbSB3aGljaCB0byByZXN0b3JlIHRoZSAkZ3AgcmVnaXN0ZXIuCi0gICBUaGlzIGlzIHNldCBieSB0aGUgLmNwcmVzdG9yZSBwc2V1ZG8tb3AsIGFuZCBzYXZlZCBpbiB0aGlzCi0gICB2YXJpYWJsZS4gICovCi1zdGF0aWMgb2Zmc2V0VCBtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPSAtMTsKLQotLyogVGhpcyBpcyB0aGUgcmVnaXN0ZXIgd2hpY2ggaG9sZHMgdGhlIHN0YWNrIGZyYW1lLCBhcyBzZXQgYnkgdGhlCi0gICAuZnJhbWUgcHNldWRvLW9wLiAgVGhpcyBpcyBuZWVkZWQgdG8gaW1wbGVtZW50IC5jcHJlc3RvcmUuICAqLwotc3RhdGljIGludCBtaXBzX2ZyYW1lX3JlZyA9IFNQOwotCi0vKiBUbyBvdXRwdXQgTk9QIGluc3RydWN0aW9ucyBjb3JyZWN0bHksIHdlIG5lZWQgdG8ga2VlcCBpbmZvcm1hdGlvbgotICAgYWJvdXQgdGhlIHByZXZpb3VzIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCi0vKiBXaGV0aGVyIHdlIGFyZSBvcHRpbWl6aW5nLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgMiBtZWFucyB0byByZW1vdmUKLSAgIHVubmVlZGVkIE5PUHMgYW5kIHN3YXAgYnJhbmNoIGluc3RydWN0aW9ucyB3aGVuIHBvc3NpYmxlLiAgQSB2YWx1ZQotICAgb2YgMSBtZWFucyB0byBub3Qgc3dhcCBicmFuY2hlcy4gIEEgdmFsdWUgb2YgMCBtZWFucyB0byBhbHdheXMKLSAgIGluc2VydCBOT1BzLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19vcHRpbWl6ZSA9IDI7Ci0KLS8qIERlYnVnZ2luZyBsZXZlbC4gIC1nIHNldHMgdGhpcyB0byAyLiAgLWdOIHNldHMgdGhpcyB0byBOLiAgLWcwIGlzCi0gICBlcXVpdmFsZW50IHRvIHNlZWluZyBubyAtZyBvcHRpb24gYXQgYWxsLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19kZWJ1ZyA9IDA7Ci0KLS8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgc3RydWN0IG1pcHNfY2xfaW5zbiBwcmV2X2luc247Ci0KLS8qIFRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgcHJldl9pbnNuLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWlwc19jbF9pbnNuIHByZXZfcHJldl9pbnNuOwotCi0vKiBJZiB3ZSBkb24ndCB3YW50IGluZm9ybWF0aW9uIGZvciBwcmV2X2luc24gb3IgcHJldl9wcmV2X2luc24sIHdlCi0gICBwb2ludCB0aGUgaW5zbl9tbyBmaWVsZCBhdCB0aGlzIGR1bW15IGludGVnZXIuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBkdW1teV9vcGNvZGUgPSB7IDAgfTsKLQotLyogTm9uLXplcm8gaWYgcHJldl9pbnNuIGlzIHZhbGlkLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9pbnNuX3ZhbGlkOwotCi0vKiBUaGUgZnJhZyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZnJhZyAqcHJldl9pbnNuX2ZyYWc7Ci0KLS8qIFRoZSBvZmZzZXQgaW50byBwcmV2X2luc25fZnJhZyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBsb25nIHByZXZfaW5zbl93aGVyZTsKLQotLyogVGhlIHJlbG9jIHR5cGUgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgaWYgYW55LiAgKi8KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcHJldl9pbnNuX3JlbG9jX3R5cGU7Ci0KLS8qIFRoZSByZWxvYyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCBpZiBhbnkuICAqLwotc3RhdGljIGZpeFMgKnByZXZfaW5zbl9maXhwOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgZGVsYXkgc2xvdC4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl9pc19kZWxheV9zbG90OwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgLnNldCBub3Jlb3JkZXIuICAqLwotc3RhdGljIGludCBwcmV2X2luc25fdW5yZW9yZGVyZWQ7Ci0KLS8qIE5vbi16ZXJvIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB1c2VzIGFuIGV4dGVuZCBvcGNvZGUgKGlmCi0gICBtaXBzMTYpLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9pbnNuX2V4dGVuZGVkOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgLnNldAotICAgbm9yZW9yZGVyLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQ7Ci0KLS8qIElmIHRoaXMgaXMgc2V0LCBpdCBwb2ludHMgdG8gYSBmcmFnIGhvbGRpbmcgbm9wIGluc3RydWN0aW9ucyB3aGljaAotICAgd2VyZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHN0YXJ0IG9mIGEgbm9yZW9yZGVyIHNlY3Rpb24uICBJZiB0aG9zZQotICAgbm9wcyB0dXJuIG91dCB0byBiZSB1bm5lY2Vzc2FyeSwgdGhlIHNpemUgb2YgdGhlIGZyYWcgY2FuIGJlCi0gICBkZWNyZWFzZWQuICAqLwotc3RhdGljIGZyYWdTICpwcmV2X25vcF9mcmFnOwotCi0vKiBUaGUgbnVtYmVyIG9mIG5vcCBpbnN0cnVjdGlvbnMgd2UgY3JlYXRlZCBpbiBwcmV2X25vcF9mcmFnLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19ob2xkczsKLQotLyogVGhlIG51bWJlciBvZiBub3AgaW5zdHJ1Y3Rpb25zIHRoYXQgd2Uga25vdyB3ZSBuZWVkIGluCi0gICBwcmV2X25vcF9mcmFnLiAqLwotc3RhdGljIGludCBwcmV2X25vcF9mcmFnX3JlcXVpcmVkOwotCi0vKiBUaGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB3ZSd2ZSBzZWVuIHNpbmNlIHByZXZfbm9wX2ZyYWcuICAqLwotc3RhdGljIGludCBwcmV2X25vcF9mcmFnX3NpbmNlOwotCi0vKiBGb3IgRUNPRkYgYW5kIEVMRiwgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBkb25lIGluIHR3bwotICAgcGFydHMsIHdpdGggYSBISSByZWxvY2F0aW9uIGFuZCBhIExPIHJlbG9jYXRpb24uICBFYWNoIHJlbG9jYXRpb24KLSAgIGhhcyBvbmx5IDE2IGJpdHMgb2Ygc3BhY2UgdG8gc3RvcmUgYW4gYWRkZW5kLiAgVGhpcyBtZWFucyB0aGF0IGluCi0gICBvcmRlciBmb3IgdGhlIGxpbmtlciB0byBoYW5kbGUgY2FycmllcyBjb3JyZWN0bHksIGl0IG11c3QgYmUgYWJsZQotICAgdG8gbG9jYXRlIGJvdGggdGhlIEhJIGFuZCB0aGUgTE8gcmVsb2NhdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgIHJlbG9jYXRpb25zIG11c3QgYXBwZWFyIGluIG9yZGVyIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLgotCi0gICBJbiBvcmRlciB0byBpbXBsZW1lbnQgdGhpcywgd2Uga2VlcCB0cmFjayBvZiBlYWNoIHVubWF0Y2hlZCBISQotICAgcmVsb2NhdGlvbi4gIFdlIHRoZW4gc29ydCB0aGVtIHNvIHRoYXQgdGhleSBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZQotICAgY29ycmVzcG9uZGluZyBMTyByZWxvY2F0aW9uLiAqLwotCi1zdHJ1Y3QgbWlwc19oaV9maXh1cAotewotICAvKiBOZXh0IEhJIGZpeHVwLiAgKi8KLSAgc3RydWN0IG1pcHNfaGlfZml4dXAgKm5leHQ7Ci0gIC8qIFRoaXMgZml4dXAuICAqLwotICBmaXhTICpmaXhwOwotICAvKiBUaGUgc2VjdGlvbiB0aGlzIGZpeHVwIGlzIGluLiAgKi8KLSAgc2VnVCBzZWc7Ci19OwotCi0vKiBUaGUgbGlzdCBvZiB1bm1hdGNoZWQgSEkgcmVsb2NzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICptaXBzX2hpX2ZpeHVwX2xpc3Q7Ci0KLS8qIE1hcCBub3JtYWwgTUlQUyByZWdpc3RlciBudW1iZXJzIHRvIG1pcHMxNiByZWdpc3RlciBudW1iZXJzLiAgKi8KLQotI2RlZmluZSBYIElMTEVHQUxfUkVHCi1zdGF0aWMgY29uc3QgaW50IG1pcHMzMl90b18xNl9yZWdfbWFwW10gPQotewotICBYLCBYLCAyLCAzLCA0LCA1LCA2LCA3LAotICBYLCBYLCBYLCBYLCBYLCBYLCBYLCBYLAotICAwLCAxLCBYLCBYLCBYLCBYLCBYLCBYLAotICBYLCBYLCBYLCBYLCBYLCBYLCBYLCBYCi19OwotI3VuZGVmIFgKLQotLyogTWFwIG1pcHMxNiByZWdpc3RlciBudW1iZXJzIHRvIG5vcm1hbCBNSVBTIHJlZ2lzdGVyIG51bWJlcnMuICAqLwotCi1zdGF0aWMgY29uc3QgaW50IG1pcHMxNl90b18zMl9yZWdfbWFwW10gPQotewotICAxNiwgMTcsIDIsIDMsIDQsIDUsIDYsIDcKLX07Ci0MCi0vKiBTaW5jZSB0aGUgTUlQUyBkb2VzIG5vdCBoYXZlIG11bHRpcGxlIGZvcm1zIG9mIFBDIHJlbGF0aXZlCi0gICBpbnN0cnVjdGlvbnMsIHdlIGRvIG5vdCBoYXZlIHRvIGRvIHJlbGF4aW5nIGFzIGlzIGRvbmUgb24gb3RoZXIKLSAgIHBsYXRmb3Jtcy4gIEhvd2V2ZXIsIHdlIGRvIGhhdmUgdG8gaGFuZGxlIEdQIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgIGNvcnJlY3RseSwgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGEgc2ltaWxhciBwcm9ibGVtLgotCi0gICBFdmVyeSBtYWNybyB0aGF0IHJlZmVycyB0byBhIHN5bWJvbCBjYW4gb2NjdXIgaW4gKGF0IGxlYXN0KSB0d28KLSAgIGZvcm1zLCBvbmUgd2l0aCBHUCByZWxhdGl2ZSBhZGRyZXNzaW5nIGFuZCBvbmUgd2l0aG91dC4gIEZvcgotICAgZXhhbXBsZSwgbG9hZGluZyBhIGdsb2JhbCB2YXJpYWJsZSBpbnRvIGEgcmVnaXN0ZXIgZ2VuZXJhbGx5IHVzZXMKLSAgIGEgbWFjcm8gaW5zdHJ1Y3Rpb24gbGlrZSB0aGlzOgotICAgICBsdyAkNCxpCi0gICBJZiBpIGNhbiBiZSBhZGRyZXNzZWQgb2ZmIHRoZSBHUCByZWdpc3RlciAodGhpcyBpcyB0cnVlIGlmIGl0IGlzIGluCi0gICB0aGUgLnNic3Mgb3IgLnNkYXRhIHNlY3Rpb24sIG9yIGlmIGl0IGlzIGtub3duIHRvIGJlIHNtYWxsZXIgdGhhbgotICAgdGhlIC1HIGFyZ3VtZW50KSB0aGlzIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbjoKLSAgICAgbHcgJDQsaSgkZ3ApCi0gICBUaGlzIGluc3RydWN0aW9uIHdpbGwgdXNlIGEgR1BSRUwgcmVsb2MuICBJZiBpIGNhbiBub3QgYmUgYWRkcmVzc2VkCi0gICBvZmYgdGhlIEdQIHJlZ2lzdGVyLCB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uIHNlcXVlbmNlIHdpbGwgYmUgdXNlZDoKLSAgICAgbHVpICRhdCxpCi0gICAgIGx3ICQ0LGkoJGF0KQotICAgSW4gdGhpcyBjYXNlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3aWxsIGhhdmUgYSBISTE2IHJlbG9jLCBhbmQgdGhlCi0gICBzZWNvbmQgcmVsb2Mgd2lsbCBoYXZlIGEgTE8xNiByZWxvYy4gIEJvdGggcmVsb2NzIHdpbGwgYmUgYWdhaW5zdAotICAgdGhlIHN5bWJvbCBpLgotCi0gICBUaGUgaXNzdWUgaGVyZSBpcyB0aGF0IHdlIG1heSBub3Qga25vdyB3aGV0aGVyIGkgaXMgR1AgYWRkcmVzc2FibGUKLSAgIHVudGlsIGFmdGVyIHdlIHNlZSB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzIGl0LiAgVGhlcmVmb3JlLCB3ZQotICAgd2FudCB0byBiZSBhYmxlIHRvIGNob29zZSB0aGUgZmluYWwgaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugb25seSBhdAotICAgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHdheSBvdGhlcgotICAgcGxhdGZvcm1zIGNob29zZSB0aGUgc2l6ZSBvZiBhIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIG9ubHkgYXQgdGhlCi0gICBlbmQgb2YgYXNzZW1ibHkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHdlIGRvIG5vdCB1c2UgR1AKLSAgIGFkZHJlc3NpbmcgaW4gcXVpdGUgdGhlIHNhbWUgd2F5LCBidXQgdGhlIGlzc3VlIHN0aWxsIGFyaXNlcyBhcwotICAgZXh0ZXJuYWwgc3ltYm9scyBhbmQgbG9jYWwgc3ltYm9scyBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCi0KLSAgIFdlIGhhbmRsZSB0aGVzZSBpc3N1ZXMgYnkgYWN0dWFsbHkgZ2VuZXJhdGluZyBib3RoIHBvc3NpYmxlCi0gICBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMuICBUaGUgbG9uZ2VyIG9uZSBpcyBwdXQgaW4gYSBmcmFnX3ZhciB3aXRoCi0gICB0eXBlIHJzX21hY2hpbmVfZGVwZW5kZW50LiAgV2UgZW5jb2RlIHdoYXQgdG8gZG8gd2l0aCB0aGUgZnJhZyBpbgotICAgdGhlIHN1YnR5cGUgZmllbGQuICBXZSBlbmNvZGUgKDEpIHRoZSBudW1iZXIgb2YgZXhpc3RpbmcgYnl0ZXMgdG8KLSAgIHJlcGxhY2UsICgyKSB0aGUgbnVtYmVyIG9mIG5ldyBieXRlcyB0byB1c2UsICgzKSB0aGUgb2Zmc2V0IGZyb20KLSAgIHRoZSBzdGFydCBvZiB0aGUgZXhpc3RpbmcgYnl0ZXMgdG8gdGhlIGZpcnN0IHJlbG9jIHdlIG11c3QgZ2VuZXJhdGUKLSAgICh0aGF0IGlzLCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nCi0gICBieXRlcyBhZnRlciB0aGV5IGFyZSByZXBsYWNlZCBieSB0aGUgbmV3IGJ5dGVzLCBpZiBhbnkpLCAoNCkgdGhlCi0gICBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nIGJ5dGVzIHRvIHRoZSBzZWNvbmQgcmVsb2MsCi0gICAoNSkgd2hldGhlciBhIHRoaXJkIHJlbG9jIGlzIG5lZWRlZCAodGhlIHRoaXJkIHJlbG9jIGlzIGFsd2F5cyBmb3VyCi0gICBieXRlcyBhZnRlciB0aGUgc2Vjb25kIHJlbG9jKSwgYW5kICg2KSB3aGV0aGVyIHRvIHdhcm4gaWYgdGhpcwotICAgdmFyaWFudCBpcyB1c2VkICh0aGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgaWYgLnNldCBub21hY3JvIG9yIC5zZXQKLSAgIG5vYXQgaXMgaW4gZWZmZWN0KS4gIEFsbCB0aGVzZSBudW1iZXJzIGFyZSByZWFzb25hYmx5IHNtYWxsLgotCi0gICBHZW5lcmF0aW5nIHR3byBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMgbXVzdCBiZSBoYW5kbGVkIGNhcmVmdWxseSB0bwotICAgZW5zdXJlIHRoYXQgZGVsYXkgc2xvdHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiAgRm9ydHVuYXRlbHksIHRoZXJlCi0gICBhcmUgYSBsaW1pdGVkIG51bWJlciBvZiBjYXNlcy4gIFdoZW4gdGhlIHNlY29uZCBpbnN0cnVjdGlvbgotICAgc2VxdWVuY2UgaXMgZ2VuZXJhdGVkLCBhcHBlbmRfaW5zbiBpcyBkaXJlY3RlZCB0byBtYWludGFpbiB0aGUKLSAgIGV4aXN0aW5nIGRlbGF5IHNsb3QgaW5mb3JtYXRpb24sIHNvIGl0IGNvbnRpbnVlcyB0byBhcHBseSB0byBhbnkKLSAgIGNvZGUgYWZ0ZXIgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgIHNlY29uZCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBtdXN0IG5vdCBpbXBvc2UgYW55IHJlcXVpcmVtZW50cyBub3QKLSAgIHJlcXVpcmVkIGJ5IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4KLQotICAgVGhlc2UgdmFyaWFudCBmcmFncyBhcmUgdGhlbiBoYW5kbGVkIGluIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlCi0gICBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUuICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCByZXR1cm5zCi0gICB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgZnJhZy4gIG1kX2NvbnZlcnRfZnJhZyBzZXRzIHVwIHRoZSBmaW5hbCBmb3JtCi0gICBvZiB0aGUgZnJhZy4gIHRjX2dlbl9yZWxvYyBhZGp1c3QgdGhlIGZpcnN0IHJlbG9jIGFuZCBhZGRzIGEgc2Vjb25kCi0gICBvbmUgaWYgbmVlZGVkLiAgKi8KLSNkZWZpbmUgUkVMQVhfRU5DT0RFKG9sZCwgbmV3LCByZWxvYzEsIHJlbG9jMiwgcmVsb2MzLCB3YXJuKSBcCi0gICgocmVsYXhfc3Vic3RhdGVUKSBcCi0gICAoKChvbGQpIDw8IDIzKSBcCi0gICAgfCAoKG5ldykgPDwgMTYpIFwKLSAgICB8ICgoKHJlbG9jMSkgKyA2NCkgPDwgOSkgXAotICAgIHwgKCgocmVsb2MyKSArIDY0KSA8PCAyKSBcCi0gICAgfCAoKHJlbG9jMykgPyAoMSA8PCAxKSA6IDApIFwKLSAgICB8ICgod2FybikgPyAxIDogMCkpKQotI2RlZmluZSBSRUxBWF9PTEQoaSkgKCgoaSkgPj4gMjMpICYgMHg3ZikKLSNkZWZpbmUgUkVMQVhfTkVXKGkpICgoKGkpID4+IDE2KSAmIDB4N2YpCi0jZGVmaW5lIFJFTEFYX1JFTE9DMShpKSAoKGJmZF92bWEpKCgoaSkgPj4gOSkgJiAweDdmKSAtIDY0KQotI2RlZmluZSBSRUxBWF9SRUxPQzIoaSkgKChiZmRfdm1hKSgoKGkpID4+IDIpICYgMHg3ZikgLSA2NCkKLSNkZWZpbmUgUkVMQVhfUkVMT0MzKGkpICgoKGkpID4+IDEpICYgMSkKLSNkZWZpbmUgUkVMQVhfV0FSTihpKSAoKGkpICYgMSkKLQotLyogRm9yIG1pcHMxNiBjb2RlLCB3ZSB1c2UgYW4gZW50aXJlbHkgZGlmZmVyZW50IGZvcm0gb2YgcmVsYXhhdGlvbi4KLSAgIG1pcHMxNiBzdXBwb3J0cyB0d28gdmVyc2lvbnMgb2YgbW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggdGFrZQotICAgaW1tZWRpYXRlIHZhbHVlczogYSBzbWFsbCBvbmUgd2hpY2ggdGFrZXMgc29tZSBzbWFsbCB2YWx1ZSwgYW5kIGEKLSAgIGxhcmdlciBvbmUgd2hpY2ggdGFrZXMgYSAxNiBiaXQgdmFsdWUuICBTaW5jZSBicmFuY2hlcyBhbHNvIGZvbGxvdwotICAgdGhpcyBwYXR0ZXJuLCByZWxheGluZyB0aGVzZSB2YWx1ZXMgaXMgcmVxdWlyZWQuCi0KLSAgIFdlIGNhbiBhc3NlbWJsZSBib3RoIG1pcHMxNiBhbmQgbm9ybWFsIE1JUFMgY29kZSBpbiBhIHNpbmdsZQotICAgb2JqZWN0LiAgVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhpcyB0eXBlIG9mIHJlbGF4YXRpb24gYXQKLSAgIHRoZSBzYW1lIHRpbWUgdGhhdCB3ZSBzdXBwb3J0IHRoZSByZWxheGF0aW9uIGRlc2NyaWJlZCBhYm92ZS4gIFdlCi0gICB1c2UgdGhlIGhpZ2ggYml0IG9mIHRoZSBzdWJ0eXBlIGZpZWxkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzLgotCi0gICBUaGUgaW5mb3JtYXRpb24gd2Ugc3RvcmUgZm9yIHRoaXMgdHlwZSBvZiByZWxheGF0aW9uIGlzIHRoZQotICAgYXJndW1lbnQgY29kZSBmb3VuZCBpbiB0aGUgb3Bjb2RlIGZpbGUgZm9yIHRoaXMgcmVsb2NhdGlvbiwgd2hldGhlcgotICAgdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgYSBzbWFsbCBvciBleHRlbmRlZCBmb3JtLCBhbmQgd2hldGhlcgotICAgdGhlIHJlbG9jYXRpb24gaXMgaW4gYSBqdW1wIG9yIGphbCBkZWxheSBzbG90LiAgVGhhdCB0ZWxscyB1cyB0aGUKLSAgIHNpemUgb2YgdGhlIHZhbHVlLCBhbmQgaG93IGl0IHNob3VsZCBiZSBzdG9yZWQuICBXZSBhbHNvIHN0b3JlCi0gICB3aGV0aGVyIHRoZSBmcmFnbWVudCBpcyBjb25zaWRlcmVkIHRvIGJlIGV4dGVuZGVkIG9yIG5vdC4gIFdlIGFsc28KLSAgIHN0b3JlIHdoZXRoZXIgdGhpcyBpcyBrbm93biB0byBiZSBhIGJyYW5jaCB0byBhIGRpZmZlcmVudCBzZWN0aW9uLAotICAgd2hldGhlciB3ZSBoYXZlIHRyaWVkIHRvIHJlbGF4IHRoaXMgZnJhZyB5ZXQsIGFuZCB3aGV0aGVyIHdlIGhhdmUKLSAgIGV2ZXIgZXh0ZW5kZWQgYSBQQyByZWxhdGl2ZSBmcmFnbWVudCBiZWNhdXNlIG9mIGEgc2hpZnQgY291bnQuICAqLwotI2RlZmluZSBSRUxBWF9NSVBTMTZfRU5DT0RFKHR5cGUsIHNtYWxsLCBleHQsIGRzbG90LCBqYWxfZHNsb3QpCVwKLSAgKDB4ODAwMDAwMDAJCQkJCQkJXAotICAgfCAoKHR5cGUpICYgMHhmZikJCQkJCQlcCi0gICB8ICgoc21hbGwpID8gMHgxMDAgOiAwKQkJCQkJXAotICAgfCAoKGV4dCkgPyAweDIwMCA6IDApCQkJCQlcCi0gICB8ICgoZHNsb3QpID8gMHg0MDAgOiAwKQkJCQkJXAotICAgfCAoKGphbF9kc2xvdCkgPyAweDgwMCA6IDApKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfUChpKSAoKChpKSAmIDB4ODAwMDAwMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9UWVBFKGkpICgoaSkgJiAweGZmKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfVVNFUl9TTUFMTChpKSAoKChpKSAmIDB4MTAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfVVNFUl9FWFQoaSkgKCgoaSkgJiAweDIwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0RTTE9UKGkpICgoKGkpICYgMHg0MDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9KQUxfRFNMT1QoaSkgKCgoaSkgJiAweDgwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0VYVEVOREVEKGkpICgoKGkpICYgMHgxMDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfTUFSS19FWFRFTkRFRChpKSAoKGkpIHwgMHgxMDAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfQ0xFQVJfRVhURU5ERUQoaSkgKChpKSAmfiAweDEwMDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9MT05HX0JSQU5DSChpKSAoKChpKSAmIDB4MjAwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0goaSkgKChpKSB8IDB4MjAwMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0NMRUFSX0xPTkdfQlJBTkNIKGkpICgoaSkgJn4gMHgyMDAwKQotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBpbnRlcm5hbEVycm9yKCkgXAotICAgIGFzX2ZhdGFsIChfKCJpbnRlcm5hbCBFcnJvciwgbGluZSAlZCwgJXMiKSwgX19MSU5FX18sIF9fRklMRV9fKQotI2Vsc2UKLSNkZWZpbmUgaW50ZXJuYWxFcnJvcigpIGFzX2ZhdGFsIChfKCJNSVBTIGludGVybmFsIEVycm9yIikpOwotI2VuZGlmCi0KLWVudW0gbWlwc19yZWdjbGFzcyB7IE1JUFNfR1JfUkVHLCBNSVBTX0ZQX1JFRywgTUlQUzE2X1JFRyB9OwotCi1zdGF0aWMgaW50IGluc25fdXNlc19yZWcgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqaXAsCi0JCQkJICB1bnNpZ25lZCBpbnQgcmVnLCBlbnVtIG1pcHNfcmVnY2xhc3MgY2xhc3MpKTsKLXN0YXRpYyBpbnQgcmVnX25lZWRzX2RlbGF5IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWlwczE2X21hcmtfbGFiZWxzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGFwcGVuZF9pbnNuIFBBUkFNUyAoKGNoYXIgKnBsYWNlLAotCQkJCSBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXAsCi0JCQkJIGV4cHJlc3Npb25TICogcCwKLQkJCQkgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHIsCi0JCQkJIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIG1pcHNfbm9fcHJldl9pbnNuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWlwc19lbWl0X2RlbGF5cyBQQVJBTVMgKChib29sZWFuKSk7Ci0jaWZkZWYgVVNFX1NUREFSRwotc3RhdGljIHZvaWQgbWFjcm9fYnVpbGQgUEFSQU1TICgoY2hhciAqcGxhY2UsIGludCAqY291bnRlciwgZXhwcmVzc2lvblMgKiBlcCwKLQkJCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZm10LAotCQkJCSAuLi4pKTsKLSNlbHNlCi1zdGF0aWMgdm9pZCBtYWNyb19idWlsZCAoKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgbWlwczE2X21hY3JvX2J1aWxkIFBBUkFNUyAoKGNoYXIgKiwgaW50ICosIGV4cHJlc3Npb25TICosCi0JCQkJCWNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCQl2YV9saXN0KSk7Ci1zdGF0aWMgdm9pZCBtYWNyb19idWlsZF9sdWkgUEFSQU1TICgoY2hhciAqcGxhY2UsIGludCAqY291bnRlciwKLQkJCQkgICAgIGV4cHJlc3Npb25TICogZXAsIGludCByZWdudW0pKTsKLXN0YXRpYyB2b2lkIHNldF9hdCBQQVJBTVMgKChpbnQgKmNvdW50ZXIsIGludCByZWcsIGludCB1bnNpZ25lZHApKTsKLXN0YXRpYyB2b2lkIGNoZWNrX2Fic29sdXRlX2V4cHIgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwLAotCQkJCQkgZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgbG9hZF9yZWdpc3RlciBQQVJBTVMgKChpbnQgKiwgaW50LCBleHByZXNzaW9uUyAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGxvYWRfYWRkcmVzcyBQQVJBTVMgKChpbnQgKmNvdW50ZXIsIGludCByZWcsIGV4cHJlc3Npb25TICplcCkpOwotc3RhdGljIHZvaWQgbWFjcm8gUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci1zdGF0aWMgdm9pZCBtaXBzMTZfbWFjcm8gUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci0jaWZkZWYgTE9TSU5HX0NPTVBJTEVSCi1zdGF0aWMgdm9pZCBtYWNybzIgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIG1pcHNfaXAgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9pcCBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotc3RhdGljIHZvaWQgbWlwczE2X2ltbWVkIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQsIG9mZnNldFQsIGJvb2xlYW4sCi0JCQkJICBib29sZWFuLCBib29sZWFuLCB1bnNpZ25lZCBsb25nICosCi0JCQkJICBib29sZWFuICosIHVuc2lnbmVkIHNob3J0ICopKTsKLXN0YXRpYyBpbnQgbXlfZ2V0U21hbGxFeHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXAsIGNoYXIgKnN0cikpOwotc3RhdGljIHZvaWQgbXlfZ2V0RXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGVwLCBjaGFyICpzdHIpKTsKLXN0YXRpYyBzeW1ib2xTICpnZXRfc3ltYm9sIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG1pcHNfYWxpZ24gUEFSQU1TICgoaW50IHRvLCBpbnQgZmlsbCwgc3ltYm9sUyAqbGFiZWwpKTsKLXN0YXRpYyB2b2lkIHNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NoYW5nZV9zZWMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfZ2xvYmwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX29wdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc3NldCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWJpY2FsbHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NwbG9hZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfY3ByZXN0b3JlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19ncHdvcmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NwYWRkIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19pbnNuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWRfb2JqX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG1kX29ial9lbmQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGxvbmcgZ2V0X251bWJlciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfZW50IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19mcmFtZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19tYXNrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX3N0YWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfd2Vha2V4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZmlsZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgbWlwczE2X2V4dGVuZGVkX2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgYXNlY3Rpb24gKiwgbG9uZykpOwotCi0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfbWlwc19pbnNuIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqKSk7Ci0MCi0vKiBQc2V1ZG8tb3AgdGFibGUuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sKLSAgIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUsIGJ1dCBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkOiAuYWxpYXMsCi0gICAuZ2FsaXZlLCAuZ2phbGRlZiwgLmdqcmxpdmUsIC5saXZlcmVnLCAubm9hbGlhcy4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKLSAgIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBiZWluZyBnZW5lcmF0ZWQsIGFuZAotICAgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGhlIG9iamVjdCBmb3JtYXQ6IC5hZW50LCAuYmVnaW4sIC5iZW5kLAotICAgLmJnbmIsIC5lbmQsIC5lbmRiLCAuZW50LCAuZm1hc2ssIC5mcmFtZSwgLmxvYywgLm1hc2ssIC52ZXJzdGFtcCwKLSAgIC52cmVnLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQotICAgbm90IE1JUFMgQ1BVIHNwZWNpZmljLCBidXQgYXJlIGFsc28gbm90IHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZQotICAgZm9ybWF0LiAgVGhpcyBmaWxlIGlzIHByb2JhYmx5IHRoZSBiZXN0IHBsYWNlIHRvIGRlZmluZSB0aGVtLCBidXQKLSAgIHRoZXkgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkOiAuYXNtMCwgLmVuZHIsIC5sYWIsIC5yZXBlYXQsCi0gICAuc3RydWN0LiAgKi8KLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBtaXBzX3BzZXVkb190YWJsZVtdID0KLXsKLSAvKiBNSVBTIHNwZWNpZmljIHBzZXVkby1vcHMuICAqLwotICB7Im9wdGlvbiIsIHNfb3B0aW9uLCAwfSwKLSAgeyJzZXQiLCBzX21pcHNzZXQsIDB9LAotICB7InJkYXRhIiwgc19jaGFuZ2Vfc2VjLCAncid9LAotICB7InNkYXRhIiwgc19jaGFuZ2Vfc2VjLCAncyd9LAotICB7ImxpdmVyZWciLCBzX2lnbm9yZSwgMH0sCi0gIHsiYWJpY2FsbHMiLCBzX2FiaWNhbGxzLCAwfSwKLSAgeyJjcGxvYWQiLCBzX2NwbG9hZCwgMH0sCi0gIHsiY3ByZXN0b3JlIiwgc19jcHJlc3RvcmUsIDB9LAotICB7Imdwd29yZCIsIHNfZ3B3b3JkLCAwfSwKLSAgeyJjcGFkZCIsIHNfY3BhZGQsIDB9LAotICB7Imluc24iLCBzX2luc24sIDB9LAotCi0gLyogUmVsYXRpdmVseSBnZW5lcmljIHBzZXVkby1vcHMgdGhhdCBoYXBwZW4gdG8gYmUgdXNlZCBvbiBNSVBTCi0gICAgIGNoaXBzLiAgKi8KLSAgeyJhc2NpaXoiLCBzdHJpbmdlciwgMX0sCi0gIHsiYnNzIiwgc19jaGFuZ2Vfc2VjLCAnYid9LAotICB7ImVyciIsIHNfZXJyLCAwfSwKLSAgeyJoYWxmIiwgc19jb25zLCAxfSwKLSAgeyJkd29yZCIsIHNfY29ucywgM30sCi0gIHsid2Vha2V4dCIsIHNfbWlwc193ZWFrZXh0LCAwfSwKLQotIC8qIFRoZXNlIHBzZXVkby1vcHMgYXJlIGRlZmluZWQgaW4gcmVhZC5jLCBidXQgbXVzdCBiZSBvdmVycmlkZGVuCi0gICAgIGhlcmUgZm9yIG9uZSByZWFzb24gb3IgYW5vdGhlci4gICovCi0gIHsiYWxpZ24iLCBzX2FsaWduLCAwfSwKLSAgeyJieXRlIiwgc19jb25zLCAwfSwKLSAgeyJkYXRhIiwgc19jaGFuZ2Vfc2VjLCAnZCd9LAotICB7ImRvdWJsZSIsIHNfZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJmbG9hdCIsIHNfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJnbG9ibCIsIHNfbWlwc19nbG9ibCwgMH0sCi0gIHsiZ2xvYmFsIiwgc19taXBzX2dsb2JsLCAwfSwKLSAgeyJod29yZCIsIHNfY29ucywgMX0sCi0gIHsiaW50Iiwgc19jb25zLCAyfSwKLSAgeyJsb25nIiwgc19jb25zLCAyfSwKLSAgeyJvY3RhIiwgc19jb25zLCA0fSwKLSAgeyJxdWFkIiwgc19jb25zLCAzfSwKLSAgeyJzaG9ydCIsIHNfY29ucywgMX0sCi0gIHsic2luZ2xlIiwgc19mbG9hdF9jb25zLCAnZid9LAotICB7InN0YWJuIiwgc19taXBzX3N0YWIsICduJ30sCi0gIHsidGV4dCIsIHNfY2hhbmdlX3NlYywgJ3QnfSwKLSAgeyJ3b3JkIiwgc19jb25zLCAyfSwKLSAgeyAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIG1pcHNfbm9uZWNvZmZfcHNldWRvX3RhYmxlW10gPSB7Ci0gLyogVGhlc2UgcHNldWRvLW9wcyBzaG91bGQgYmUgZGVmaW5lZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgIEhvd2V2ZXIsIGEub3V0IGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLCBzbyB3ZSBoYXZlIHZlcnNpb25zIGhlcmUuICAqLwotICB7ImFlbnQiLCBzX21pcHNfZW50LCAxfSwKLSAgeyJiZ25iIiwgc19pZ25vcmUsIDB9LAotICB7ImVuZCIsIHNfbWlwc19lbmQsIDB9LAotICB7ImVuZGIiLCBzX2lnbm9yZSwgMH0sCi0gIHsiZW50Iiwgc19taXBzX2VudCwgMH0sCi0gIHsiZmlsZSIsIHNfZmlsZSwgMH0sCi0gIHsiZm1hc2siLCBzX21pcHNfbWFzaywgJ0YnfSwKLSAgeyJmcmFtZSIsIHNfbWlwc19mcmFtZSwgMH0sCi0gIHsibG9jIiwgc19pZ25vcmUsIDB9LAotICB7Im1hc2siLCBzX21pcHNfbWFzaywgJ1InfSwKLSAgeyJ2ZXJzdGFtcCIsIHNfaWdub3JlLCAwfSwKLSAgeyAwIH0sCi19OwotCi1leHRlcm4gdm9pZCBwb3BfaW5zZXJ0IFBBUkFNUyAoKGNvbnN0IHBzZXVkb190eXBlUyAqKSk7Ci0KLXZvaWQKLW1pcHNfcG9wX2luc2VydCAoKQotewotICBwb3BfaW5zZXJ0IChtaXBzX3BzZXVkb190YWJsZSk7Ci0gIGlmICghIEVDT0ZGX0RFQlVHR0lORykKLSAgICBwb3BfaW5zZXJ0IChtaXBzX25vbmVjb2ZmX3BzZXVkb190YWJsZSk7Ci19Ci0MCi0vKiBTeW1ib2xzIGxhYmVsbGluZyB0aGUgY3VycmVudCBpbnNuLiAgKi8KLQotc3RydWN0IGluc25fbGFiZWxfbGlzdAotewotICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpuZXh0OwotICBzeW1ib2xTICpsYWJlbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICppbnNuX2xhYmVsczsKLXN0YXRpYyBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpmcmVlX2luc25fbGFiZWxzOwotCi1zdGF0aWMgdm9pZCBtaXBzX2NsZWFyX2luc25fbGFiZWxzIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGlubGluZSB2b2lkCi1taXBzX2NsZWFyX2luc25fbGFiZWxzICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKipwbDsKLQotICBmb3IgKHBsID0gJmZyZWVfaW5zbl9sYWJlbHM7ICpwbCAhPSBOVUxMOyBwbCA9ICYoKnBsKS0+bmV4dCkKLSAgICA7Ci0gICpwbCA9IGluc25fbGFiZWxzOwotICBpbnNuX2xhYmVscyA9IE5VTEw7Ci19Ci0MCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci0KLS8qIEV4cHJlc3Npb25zIHdoaWNoIGFwcGVhciBpbiBpbnN0cnVjdGlvbnMuICBUaGVzZSBhcmUgc2V0IGJ5Ci0gICBtaXBzX2lwLiAgKi8KLQotc3RhdGljIGV4cHJlc3Npb25TIGltbV9leHByOwotc3RhdGljIGV4cHJlc3Npb25TIG9mZnNldF9leHByOwotCi0vKiBSZWxvY3MgYXNzb2NpYXRlZCB3aXRoIGltbV9leHByIGFuZCBvZmZzZXRfZXhwci4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgaW1tX3JlbG9jOwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBvZmZzZXRfcmVsb2M7Ci0KLS8qIFRoaXMgaXMgc2V0IGJ5IG1pcHNfaXAgaWYgaW1tX3JlbG9jIGlzIGFuIHVubWF0Y2hlZCBISTE2X1MgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBpbW1fdW5tYXRjaGVkX2hpOwotCi0vKiBUaGVzZSBhcmUgc2V0IGJ5IG1pcHMxNl9pcCBpZiBhbiBleHBsaWNpdCBleHRlbnNpb24gaXMgdXNlZC4gICovCi0KLXN0YXRpYyBib29sZWFuIG1pcHMxNl9zbWFsbCwgbWlwczE2X2V4dDsKLQotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0vKiBUaGUgcGRyIHNlZ21lbnQgZm9yIHBlciBwcm9jZWR1cmUgZnJhbWUvcmVnbWFzayBpbmZvICovCi0KLXN0YXRpYyBzZWdUIHBkcl9zZWc7Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAqIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLgotICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBib29sZWFuIG9rID0gZmFsc2U7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpID0gMDsKLSAgY29uc3QgY2hhciAqY3B1OwotICBjaGFyICphID0gTlVMTDsKLSAgaW50IGJyb2tlbiA9IDA7Ci0gIGludCBtaXBzX2lzYV9mcm9tX2NwdTsKLQotICBjcHUgPSBUQVJHRVRfQ1BVOwotICBpZiAoc3RyY21wIChjcHUgKyAoc2l6ZW9mIFRBUkdFVF9DUFUpIC0gMywgImVsIikgPT0gMCkKLSAgICB7Ci0gICAgICBhID0geG1hbGxvYyAoc2l6ZW9mIFRBUkdFVF9DUFUpOwotICAgICAgc3RyY3B5IChhLCBUQVJHRVRfQ1BVKTsKLSAgICAgIGFbKHNpemVvZiBUQVJHRVRfQ1BVKSAtIDNdID0gJ1wwJzsKLSAgICAgIGNwdSA9IGE7Ci0gICAgfQotCi0gIGlmIChtaXBzX2NwdSA8IDApCi0gICAgewotICAgICAgLyogU2V0IG1pcHNfY3B1IGJhc2VkIG9uIFRBUkdFVF9DUFUsIHVubGVzcyBUQVJHRVRfQ1BVIGlzCi0gICAgICAgICBqdXN0IHRoZSBnZW5lcmljICdtaXBzJywgaW4gd2hpY2ggY2FzZSBzZXQgbWlwc19jcHUgYmFzZWQKLSAgICAgICAgIG9uIHRoZSBnaXZlbiBJU0EsIGlmIGFueS4gKi8KLQotICAgICAgaWYgKHN0cmNtcCAoY3B1LCAibWlwcyIpID09IDApCi0gICAgICAgIHsKLQkgIGlmIChtaXBzX29wdHMuaXNhIDwgMCkKLQkgICAgbWlwc19jcHUgPSAzMDAwOyAgIAotCi0JICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDIpCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDYwMDA7Ci0KLSAgICAgICAgICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDMpCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDQwMDA7Ci0KLSAgICAgICAgICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDQpCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDgwMDA7Ci0KLSAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgbWlwc19jcHUgPSAzMDAwOwotICAgICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjM5MDAiKSA9PSAwCi0gICAgICAgICAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHN0eDM5IikgPT0gMAotICAgICAgICAgICAgICAgKQotICAgICAgICBtaXBzX2NwdSA9IDM5MDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjYwMDAiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczIiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDYwMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0IikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgInI0MDAwIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHMzIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MDAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0NDAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0NDAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NG9yaW9uIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgInI0NjAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0NjAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0NjUwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0NjUwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNDMwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDMwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjR2cjQxMTEiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQxMTE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0dnI0MTAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MTAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0MDEwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MDEwOwotCi0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjUwMDAiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczY0dnI1MDAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA1MDAwOwotCi0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyODAwMCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzNCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gODAwMDsKLSAgICAgIAotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyMTAwMDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDEwMDAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHMxNiIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gMDsgLyogRklYTUUgKi8KLQotICAgICAgZWxzZQotICAgICAgICBtaXBzX2NwdSA9IDMwMDA7Ci0gICAgfQotCi0gIGlmIChtaXBzX2NwdSA9PSAzMDAwCi0gICAgICB8fCBtaXBzX2NwdSA9PSAzOTAwKQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gMTsKLQotICBlbHNlIGlmIChtaXBzX2NwdSA9PSA2MDAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDAxMCkKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDI7Ci0KLSAgZWxzZSBpZiAobWlwc19jcHUgPT0gNDAwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQxMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0MTExCi0JICAgfHwgbWlwc19jcHUgPT0gNDQwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQzMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0NjAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDY1MCkKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDM7Ci0KLSAgZWxzZSBpZiAobWlwc19jcHUgPT0gNTAwMAotCSAgIHx8IG1pcHNfY3B1ID09IDgwMDAKLSAgICAgICAgICAgICAgIHx8IG1pcHNfY3B1ID09IDEwMDAwKQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gNDsKLQotICBlbHNlCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSAtMTsKLQotICBpZiAobWlwc19vcHRzLmlzYSA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAobWlwc19pc2FfZnJvbV9jcHUgIT0gLTEpCi0JbWlwc19vcHRzLmlzYSA9IG1pcHNfaXNhX2Zyb21fY3B1OwotICAgICAgZWxzZQotCW1pcHNfb3B0cy5pc2EgPSAxOwotICAgIH0KLQotICBpZiAobWlwc19vcHRzLm1pcHMxNiA8IDApCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJtaXBzMTYiLCBzaXplb2YgIm1pcHMxNiIgLSAxKSA9PSAwKQotCW1pcHNfb3B0cy5taXBzMTYgPSAxOwotICAgICAgZWxzZQotCW1pcHNfb3B0cy5taXBzMTYgPSAwOwotICAgIH0KLQotICAvKiBFbmQgb2YgVEFSR0VUX0NQVSBwcm9jZXNzaW5nLCBnZXQgcmlkIG9mIG1hbGxvY2VkIG1lbW9yeQotICAgICBpZiBuZWNlc3NhcnkuICovCi0gIGNwdSA9IE5VTEw7Ci0gIGlmIChhICE9IE5VTEwpCi0gICAgewotICAgIGZyZWUgKGEpOwotICAgIGEgPSBOVUxMOwotICAgIH0KLQotICBpZiAobWlwc19vcHRzLmlzYSA9PSAxICYmIG1pcHNfdHJhcCkKLSAgICBhc19iYWQgKF8oInRyYXAgZXhjZXB0aW9uIG5vdCBzdXBwb3J0ZWQgYXQgSVNBIDEiKSk7Ci0KLSAgLyogU2V0IHRoZSBFQUJJIGtpbmQgYmFzZWQgb24gdGhlIElTQSBiZWZvcmUgdGhlIHVzZXIgZ2V0cwotICAgICB0byBjaGFuZ2UgdGhlIElTQSB3aXRoIGRpcmVjdGl2ZXMuICBUaGlzIGlzbid0IHJlYWxseQotICAgICB0aGUgYmVzdCwgYnV0IHRoZW4gbmVpdGhlciBpcyBiYXNpbmcgdGhlIGFiaSBvbiB0aGUgaXNhLiAqLyAgICAgCi0gIGlmIChJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpCi0gICAgICAmJiBtaXBzX2FiaV9zdHJpbmcKLSAgICAgICYmIDAgPT0gc3RyY21wIChtaXBzX2FiaV9zdHJpbmcsImVhYmkiKSkKLSAgICBtaXBzX2VhYmk2NCA9IDE7Ci0KLSAgaWYgKG1pcHNfY3B1ICE9IDAgJiYgbWlwc19jcHUgIT0gLTEpCi0gICAgewotICAgICAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCBtaXBzX2NwdSk7Ci0gICAgICAKLSAgICAgIC8qIElmIHRoZXkgYXNrZWQgZm9yIG1pcHMxIG9yIG1pcHMyIGFuZCBhIGNwdSB0aGF0IGlzCi0JIG1pcHMzIG9yIGdyZWF0ZXIsIHRoZW4gbWFyayB0aGUgb2JqZWN0IGZpbGUgMzJCSVRNT0RFLiAqLwotICAgICAgaWYgKG1pcHNfaXNhX2Zyb21fY3B1ICE9IC0xCi0JICAmJiAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkgCi0JICAmJiBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfaXNhX2Zyb21fY3B1KSkKLQltaXBzXzMyYml0bW9kZSA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChtaXBzX29wdHMuaXNhKQotCXsKLQljYXNlIDE6Ci0JICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDMwMDApOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCA2MDAwKTsKLQkgIGJyZWFrOwotCWNhc2UgMzoKLQkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgNDAwMCk7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDgwMDApOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoISBvaykKLSAgICBhc193YXJuIChfKCJDb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICBmaWxlX21pcHNfaXNhID0gbWlwc19vcHRzLmlzYTsKLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTU9QQ09ERVM7KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtaXBzX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChQVFIpICZtaXBzX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLAotCQkgICBtaXBzX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQkgIC8qIFByb2JhYmx5IGEgbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbT8gIEdpdmUgdXAgbm93LiAgKi8KLQkgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmIChtaXBzX29wY29kZXNbaV0ucGluZm8gIT0gSU5TTl9NQUNSTykKLQkgICAgewotCSAgICAgIGlmICghdmFsaWRhdGVfbWlwc19pbnNuICgmbWlwc19vcGNvZGVzW2ldKSkKLQkJYnJva2VuID0gMTsKLQkgICAgfQotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlICgoaSA8IE5VTU9QQ09ERVMpICYmICFzdHJjbXAgKG1pcHNfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIG1pcHMxNl9vcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlIChpIDwgYmZkX21pcHMxNl9udW1fb3Bjb2RlcykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbWlwczE2X29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG1pcHMxNl9vcF9oYXNoLCBuYW1lLCAoUFRSKSAmbWlwczE2X29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCWFzX2ZhdGFsIChfKCJpbnRlcm5hbDogY2FuJ3QgaGFzaCBgJXMnOiAlcyIpLAotCQkgIG1pcHMxNl9vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0gICAgICBkbwotCXsKLQkgIGlmIChtaXBzMTZfb3Bjb2Rlc1tpXS5waW5mbyAhPSBJTlNOX01BQ1JPCi0JICAgICAgJiYgKChtaXBzMTZfb3Bjb2Rlc1tpXS5tYXRjaCAmIG1pcHMxNl9vcGNvZGVzW2ldLm1hc2spCi0JCSAgIT0gbWlwczE2X29wY29kZXNbaV0ubWF0Y2gpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogYmFkIG1pcHMxNiBvcGNvZGU6ICVzICVzXG4iKSwKLQkJICAgICAgIG1pcHMxNl9vcGNvZGVzW2ldLm5hbWUsIG1pcHMxNl9vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGJyb2tlbiA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoaSA8IGJmZF9taXBzMTZfbnVtX29wY29kZXMKLQkgICAgICYmIHN0cmNtcCAobWlwczE2X29wY29kZXNbaV0ubmFtZSwgbmFtZSkgPT0gMCk7Ci0gICAgfQotCi0gIGlmIChicm9rZW4pCi0gICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCi0gIC8qIFdlIGFkZCBhbGwgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgbmFtZXMgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMKLSAgICAgaGVscHMgdXMgZGV0ZWN0IGludmFsaWQgdXNlcyBvZiB0aGVtLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0gICAgewotICAgICAgY2hhciBidWZbNV07Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiQlZCIsIGkpOwotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCByZWdfc2VjdGlvbiwgaSwKLQkJCQkgICAgICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gICAgfQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGZwIiwgcmVnX3NlY3Rpb24sIEZQLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJHNwIiwgcmVnX3NlY3Rpb24sIFNQLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGdwIiwgcmVnX3NlY3Rpb24sIEdQLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGF0IiwgcmVnX3NlY3Rpb24sIEFULAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGt0MCIsIHJlZ19zZWN0aW9uLCBLVDAsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIka3QxIiwgcmVnX3NlY3Rpb24sIEtUMSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRwYyIsIHJlZ19zZWN0aW9uLCAtMSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLQotICBtaXBzX25vX3ByZXZfaW5zbiAoZmFsc2UpOwotCi0gIG1pcHNfZ3BybWFzayA9IDA7Ci0gIG1pcHNfY3BybWFza1swXSA9IDA7Ci0gIG1pcHNfY3BybWFza1sxXSA9IDA7Ci0gIG1pcHNfY3BybWFza1syXSA9IDA7Ci0gIG1pcHNfY3BybWFza1szXSA9IDA7Ci0KLSAgLyogc2V0IHRoZSBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGhlIHRleHQgc2VjdGlvbiAoMioqMikgKi8KLSAgcmVjb3JkX2FsaWdubWVudCAodGV4dF9zZWN0aW9uLCAyKTsKLQotICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLSAgICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgZ19zd2l0Y2hfdmFsdWUpOwotCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgLyogT24gYSBuYXRpdmUgc3lzdGVtLCBzZWN0aW9ucyBtdXN0IGJlIGFsaWduZWQgdG8gMTYgYnl0ZQotCSBib3VuZGFyaWVzLiAgV2hlbiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYgdGFyZ2V0LCB3ZQotCSBkb24ndCBib3RoZXIuICAqLwotICAgICAgaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKLQl7Ci0JICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sIDQpOwotCSAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uLCA0KTsKLQkgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIGJzc19zZWN0aW9uLCA0KTsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhIC5yZWdpbmZvIHNlY3Rpb24gZm9yIHJlZ2lzdGVyIG1hc2tzIGFuZCBhIC5tZGVidWcKLQkgc2VjdGlvbiBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHsKLQlzZWdUIHNlZzsKLQlzdWJzZWdUIHN1YnNlZzsKLQlmbGFnd29yZCBmbGFnczsKLQlzZWdUIHNlYzsKLQotCXNlZyA9IG5vd19zZWc7Ci0Jc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCS8qIFRoZSBBQkkgc2F5cyB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlIGxvYWRlZCBzbyB0aGF0IHRoZQotCSAgIHJ1bm5pbmcgcHJvZ3JhbSBjYW4gYWNjZXNzIGl0LiAgSG93ZXZlciwgd2UgZG9uJ3QgbG9hZCBpdAotCSAgIGlmIHdlIGFyZSBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCB0YXJnZXQgKi8KLQlmbGFncyA9IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBOwotCWlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JICBmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQotCWlmICghIG1pcHNfNjQpCi0JICB7Ci0JICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIucmVnaW5mbyIsIChzdWJzZWdUKSAwKTsKLQotCi0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlYywgMik7Ci0JCi0jaWZkZWYgT0JKX0VMRgotCSAgICBtaXBzX3JlZ21hc2tfZnJhZyA9IGZyYWdfbW9yZSAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0jZW5kaWYKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIFRoZSA2NC1iaXQgQUJJIHVzZXMgYSAuTUlQUy5vcHRpb25zIHNlY3Rpb24gcmF0aGVyIHRoYW4KLSAgICAgICAgICAgICAgIC5yZWdpbmZvIHNlY3Rpb24uICAqLwotCSAgICBzZWMgPSBzdWJzZWdfbmV3ICgiLk1JUFMub3B0aW9ucyIsIChzdWJzZWdUKSAwKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VjLCAzKTsKLQotI2lmZGVmIE9CSl9FTEYKLQkgICAgLyogU2V0IHVwIHRoZSBvcHRpb24gaGVhZGVyLiAgKi8KLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zIG9wdGhkcjsKLQkgICAgICBjaGFyICpmOwotCi0JICAgICAgb3B0aGRyLmtpbmQgPSBPREtfUkVHSU5GTzsKLQkgICAgICBvcHRoZHIuc2l6ZSA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKQotCQkJICAgICArIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykpOwotCSAgICAgIG9wdGhkci5zZWN0aW9uID0gMDsKLQkgICAgICBvcHRoZHIuaW5mbyA9IDA7Ci0JICAgICAgZiA9IGZyYWdfbW9yZSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpOwotCSAgICAgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0IChzdGRvdXRwdXQsICZvcHRoZHIsCi0JCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGYpOwotCi0JICAgICAgbWlwc19yZWdtYXNrX2ZyYWcgPSBmcmFnX21vcmUgKHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykpOwotCSAgICB9Ci0jZW5kaWYKLQkgIH0KLQotCWlmIChFQ09GRl9ERUJVR0dJTkcpCi0JICB7Ci0JICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIubWRlYnVnIiwgKHN1YnNlZ1QpIDApOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VjLCAyKTsKLQkgIH0KLQotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0JcGRyX3NlZyA9IHN1YnNlZ19uZXcgKCIucGRyIiwgKHN1YnNlZ1QpIDApOwotCSh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcGRyX3NlZywKLQkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX1JFTE9DIHwgU0VDX0RFQlVHR0lORyk7Ci0JKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgcGRyX3NlZywgMik7Ci0jZW5kaWYKLQotCXN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKCEgRUNPRkZfREVCVUdHSU5HKQotICAgIG1kX29ial9iZWdpbiAoKTsKLX0KLQotdm9pZAotbWRfbWlwc19lbmQgKCkKLXsKLSAgaWYgKCEgRUNPRkZfREVCVUdHSU5HKQotICAgIG1kX29ial9lbmQgKCk7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RydWN0IG1pcHNfY2xfaW5zbiBpbnNuOwotCi0gIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgaW1tX3VubWF0Y2hlZF9oaSA9IGZhbHNlOwotICBvZmZzZXRfZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X2lwIChzdHIsICZpbnNuKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG1pcHNfaXAgKHN0ciwgJmluc24pOwotICAgICAgREJHKChfKCJyZXR1cm5lZCBmcm9tIG1pcHNfaXAoJXMpIGluc25fb3Bjb2RlID0gMHgleFxuIiksIAotCQlzdHIsIGluc24uaW5zbl9vcGNvZGUpKTsKLSAgICB9Ci0KLSAgaWYgKGluc25fZXJyb3IpCi0gICAgewotICAgICAgYXNfYmFkICgiJXMgYCVzJyIsIGluc25fZXJyb3IsIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnNuLmluc25fbW8tPnBpbmZvID09IElOU05fTUFDUk8pCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0JbWlwczE2X21hY3JvICgmaW5zbik7Ci0gICAgICBlbHNlCi0JbWFjcm8gKCZpbnNuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2Fic2VudCkKLQlhcHBlbmRfaW5zbiAoKGNoYXIgKikgTlVMTCwgJmluc24sICZpbW1fZXhwciwgaW1tX3JlbG9jLAotCQkgICAgIGltbV91bm1hdGNoZWRfaGkpOwotICAgICAgZWxzZSBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2Fic2VudCkKLQlhcHBlbmRfaW5zbiAoKGNoYXIgKikgTlVMTCwgJmluc24sICZvZmZzZXRfZXhwciwgb2Zmc2V0X3JlbG9jLCBmYWxzZSk7Ci0gICAgICBlbHNlCi0JYXBwZW5kX2luc24gKChjaGFyICopIE5VTEwsICZpbnNuLCBOVUxMLCBCRkRfUkVMT0NfVU5VU0VELCBmYWxzZSk7Ci0gICAgfQotfQotCi0vKiBTZWUgd2hldGhlciBpbnN0cnVjdGlvbiBJUCByZWFkcyByZWdpc3RlciBSRUcuICBDTEFTUyBpcyB0aGUgdHlwZQotICAgb2YgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgaW50Ci1pbnNuX3VzZXNfcmVnIChpcCwgcmVnLCBjbGFzcykKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci0gICAgIHVuc2lnbmVkIGludCByZWc7Ci0gICAgIGVudW0gbWlwc19yZWdjbGFzcyBjbGFzczsKLXsKLSAgaWYgKGNsYXNzID09IE1JUFMxNl9SRUcpCi0gICAgewotICAgICAgYXNzZXJ0IChtaXBzX29wdHMubWlwczE2KTsKLSAgICAgIHJlZyA9IG1pcHMxNl90b18zMl9yZWdfbWFwW3JlZ107Ci0gICAgICBjbGFzcyA9IE1JUFNfR1JfUkVHOwotICAgIH0KLQotICAvKiBEb24ndCByZXBvcnQgb24gZ2VuZXJhbCByZWdpc3RlciAwLCBzaW5jZSBpdCBuZXZlciBjaGFuZ2VzLiAgKi8KLSAgaWYgKGNsYXNzID09IE1JUFNfR1JfUkVHICYmIHJlZyA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmIChjbGFzcyA9PSBNSVBTX0ZQX1JFRykKLSAgICB7Ci0gICAgICBhc3NlcnQgKCEgbWlwc19vcHRzLm1pcHMxNik7Ci0gICAgICAvKiBJZiB3ZSBhcmUgY2FsbGVkIHdpdGggZWl0aGVyICRmMCBvciAkZjEsIHdlIG11c3QgY2hlY2sgJGYwLgotCSBUaGlzIGlzIG5vdCBvcHRpbWFsLCBiZWNhdXNlIGl0IHdpbGwgaW50cm9kdWNlIGFuIHVubmVjZXNzYXJ5Ci0JIE5PUCBiZXR3ZWVuICJsd2MxICRmMCIgYW5kICJzd2MxICRmMSIuICBUbyBmaXggdGhpcyB3ZSB3b3VsZAotCSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHJlYWRpbmcgYm90aCAkZjAgYW5kICRmMSBvciBqdXN0IG9uZSBvZgotCSB0aGVtLiAgTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlIG90aGVyIHdheSwKLQkgYmVjYXVzZSB0aGVyZSBpcyBubyBpbnN0cnVjdGlvbiB0aGF0IHNldHMgYm90aCAkZjAgYW5kICRmMQotCSBhbmQgcmVxdWlyZXMgYSBkZWxheS4gICovCi0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9GUFJfUykKLQkgICYmICgoKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlMpICYgT1BfTUFTS19GUykgJn4odW5zaWduZWQpMSkKLQkgICAgICA9PSAocmVnICZ+ICh1bnNpZ25lZCkgMSkpKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfRlBSX1QpCi0JICAmJiAoKCgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlQpICZ+KHVuc2lnbmVkKTEpCi0JICAgICAgPT0gKHJlZyAmfiAodW5zaWduZWQpIDEpKSkKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgbWlwc19vcHRzLm1pcHMxNikKLSAgICB7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9HUFJfUykKLQkgICYmICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlMpID09IHJlZykKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0dQUl9UKQotCSAgJiYgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCkgPT0gcmVnKQotCXJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9YKQotCSAgJiYgKG1pcHMxNl90b18zMl9yZWdfbWFwWygoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKQotCQkJCSAgICAmIE1JUFMxNk9QX01BU0tfUlgpXQotCSAgICAgID09IHJlZykpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWSkKLQkgICYmIChtaXBzMTZfdG9fMzJfcmVnX21hcFsoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWSkKLQkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX1JZKV0KLQkgICAgICA9PSByZWcpKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1opCi0JICAmJiAobWlwczE2X3RvXzMyX3JlZ19tYXBbKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfTU9WRTMyWikKLQkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopXQotCSAgICAgID09IHJlZykpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfVCkgJiYgcmVnID09IFRSRUcpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfU1ApICYmIHJlZyA9PSBTUCkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF8zMSkgJiYgcmVnID09IFJBKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YKQotCSAgJiYgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUkVHUjMyKQotCSAgICAgICYgTUlQUzE2T1BfTUFTS19SRUdSMzIpID09IHJlZykKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIG1vZGlmeWluZyBhIHJlZ2lzdGVyIHJlcXVpcmVzIGEKLSAgIGRlbGF5LiAgKi8KLQotc3RhdGljIGludAotcmVnX25lZWRzX2RlbGF5IChyZWcpCi0gICAgIGludCByZWc7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcHJldl9waW5mbzsKLQotICBwcmV2X3BpbmZvID0gcHJldl9pbnNuLmluc25fbW8tPnBpbmZvOwotICBpZiAoISBtaXBzX29wdHMubm9yZW9yZGVyCi0gICAgICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0gICAgICAmJiAoKHByZXZfcGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQotCSAgfHwgKCEgZ3ByX2ludGVybG9ja3MKLQkgICAgICAmJiAocHJldl9waW5mbyAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKSkpCi0gICAgewotICAgICAgLyogQSBsb2FkIGZyb20gYSBjb3Byb2Nlc3NvciBvciBmcm9tIG1lbW9yeS4gIEFsbCBsb2FkCi0JIGRlbGF5cyBkZWxheSB0aGUgdXNlIG9mIGdlbmVyYWwgcmVnaXN0ZXIgcnQgZm9yIG9uZQotCSBpbnN0cnVjdGlvbiBvbiB0aGUgcjMwMDAuICBUaGUgcjYwMDAgYW5kIHI0MDAwIHVzZQotCSBpbnRlcmxvY2tzLiAgKi8KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGtub3cgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKTsKLSAgICAgIGlmIChyZWcgPT0gKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCkpCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBNYXJrIGluc3RydWN0aW9uIGxhYmVscyBpbiBtaXBzMTYgbW9kZS4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvCi0gICBoYW5kbGUgdGhlbSBzcGVjaWFsbHksIHN1Y2ggYXMgZ2VuZXJhdGluZyBqYWx4IGluc3RydWN0aW9ucyB3aGVuCi0gICBuZWVkZWQuICBXZSBhbHNvIG1ha2UgdGhlbSBvZGQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXNzZW1ibHksIGluCi0gICBvcmRlciB0byBnZW5lcmF0ZSB0aGUgcmlnaHQgc29ydCBvZiBjb2RlLiAgV2Ugd2lsbCBtYWtlIHRoZW0gZXZlbgotICAgaW4gdGhlIGFkanVzdF9zeW10YWIgcm91dGluZSwgd2hpbGUgbGVhdmluZyB0aGVtIG1hcmtlZC4gIFRoaXMgaXMKLSAgIGNvbnZlbmllbnQgZm9yIHRoZSBkZWJ1Z2dlciBhbmQgdGhlIGRpc2Fzc2VtYmxlci4gIFRoZSBsaW5rZXIga25vd3MKLSAgIHRvIG1ha2UgdGhlbSBvZGQgYWdhaW4uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwczE2X21hcmtfbGFiZWxzICgpCi17Ci0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKmw7Ci0KLSAgICAgIGZvciAobCA9IGluc25fbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLSNpZmRlZiBPQkpfRUxGCi0JICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICBTX1NFVF9PVEhFUiAobC0+bGFiZWwsIFNUT19NSVBTMTYpOwotI2VuZGlmCi0JICBpZiAoKFNfR0VUX1ZBTFVFIChsLT5sYWJlbCkgJiAxKSA9PSAwKQotCSAgICBTX1NFVF9WQUxVRSAobC0+bGFiZWwsIFNfR0VUX1ZBTFVFIChsLT5sYWJlbCkgKyAxKTsKLQl9Ci0gICAgfQotfQotCi0vKiBPdXRwdXQgYW4gaW5zdHJ1Y3Rpb24uICBQTEFDRSBpcyB3aGVyZSB0byBwdXQgdGhlIGluc3RydWN0aW9uOyBpZgotICAgaXQgaXMgTlVMTCwgdGhpcyB1c2VzIGZyYWdfbW9yZSB0byBnZXQgcm9vbS4gIElQIGlzIHRoZSBpbnN0cnVjdGlvbgotICAgaW5mb3JtYXRpb24uICBBRERSRVNTX0VYUFIgaXMgYW4gb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUKLSAgIHVzZWQgd2l0aCBSRUxPQ19UWVBFLiAgKi8KLQotc3RhdGljIHZvaWQKLWFwcGVuZF9pbnNuIChwbGFjZSwgaXAsIGFkZHJlc3NfZXhwciwgcmVsb2NfdHlwZSwgdW5tYXRjaGVkX2hpKQotICAgICBjaGFyICpwbGFjZTsKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci0gICAgIGV4cHJlc3Npb25TICphZGRyZXNzX2V4cHI7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY190eXBlOwotICAgICBib29sZWFuIHVubWF0Y2hlZF9oaTsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBwcmV2X3BpbmZvLCBwaW5mbzsKLSAgY2hhciAqZjsKLSAgZml4UyAqZml4cDsKLSAgaW50IG5vcHMgPSAwOwotCi0gIC8qIE1hcmsgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluIG1pcHMxNiBtb2RlLiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIHByZXZfcGluZm8gPSBwcmV2X2luc24uaW5zbl9tby0+cGluZm87Ci0gIHBpbmZvID0gaXAtPmluc25fbW8tPnBpbmZvOwotCi0gIGlmIChwbGFjZSA9PSBOVUxMICYmICghIG1pcHNfb3B0cy5ub3Jlb3JkZXIgfHwgcHJldl9ub3BfZnJhZyAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBpbnQgcHJldl9wcmV2X25vcDsKLQotICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc24gcmVxdWlyZWQgYW55IGRlbGF5IHNsb3RzLCBzZWUgaWYgd2UgbmVlZAotCSB0byBpbnNlcnQgYSBOT1Agb3IgdHdvLiAgVGhlcmUgYXJlIGVpZ2h0IGtpbmRzIG9mIHBvc3NpYmxlCi0JIGhhemFyZHMsIG9mIHdoaWNoIGFuIGluc3RydWN0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHR5cGUuCi0JICgxKSBhIGxvYWQgZnJvbSBtZW1vcnkgZGVsYXkKLQkgKDIpIGEgbG9hZCBmcm9tIGEgY29wcm9jZXNzb3IgZGVsYXkKLQkgKDMpIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5Ci0JICg0KSBhIGNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheQotCSAoNSkgYSBtb3ZlIHRvIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGRlbGF5Ci0JICg2KSBhIGxvYWQgY29wcm9jZXNzb3IgcmVnaXN0ZXIgZnJvbSBtZW1vcnkgZGVsYXkKLQkgKDcpIGEgY29wcm9jZXNzb3IgY29uZGl0aW9uIGNvZGUgZGVsYXkKLQkgKDgpIGEgSEkvTE8gc3BlY2lhbCByZWdpc3RlciBkZWxheQotCi0JIFRoZXJlIGFyZSBhIGxvdCBvZiBvcHRpbWl6YXRpb25zIHdlIGNvdWxkIGRvIHRoYXQgd2UgZG9uJ3QuCi0JIEluIHBhcnRpY3VsYXIsIHdlIGRvIG5vdCwgaW4gZ2VuZXJhbCwgcmVvcmRlciBpbnN0cnVjdGlvbnMuCi0JIElmIHlvdSB1c2UgZ2NjIHdpdGggb3B0aW1pemF0aW9uLCBpdCB3aWxsIHJlb3JkZXIKLQkgaW5zdHJ1Y3Rpb25zIGFuZCBnZW5lcmFsbHkgZG8gbXVjaCBtb3JlIG9wdGltaXphdGlvbiB0aGVuIHdlCi0JIGRvIGhlcmU7IHJlcGVhdGluZyBhbGwgdGhhdCB3b3JrIGluIHRoZSBhc3NlbWJsZXIgd291bGQgb25seQotCSBiZW5lZml0IGhhbmQgd3JpdHRlbiBhc3NlbWJseSBjb2RlLCBhbmQgZG9lcyBub3Qgc2VlbSB3b3J0aAotCSBpdC4gICovCi0KLSAgICAgIC8qIFRoaXMgaXMgaG93IGEgTk9QIGlzIGVtaXR0ZWQuICAqLwotI2RlZmluZSBlbWl0X25vcCgpCQkJCQlcCi0gIChtaXBzX29wdHMubWlwczE2CQkJCQlcCi0gICA/IG1kX251bWJlcl90b19jaGFycyAoZnJhZ19tb3JlICgyKSwgMHg2NTAwLCAyKQlcCi0gICA6IG1kX251bWJlcl90b19jaGFycyAoZnJhZ19tb3JlICg0KSwgMCwgNCkpCi0KLSAgICAgIC8qIFRoZSBwcmV2aW91cyBpbnNuIG1pZ2h0IHJlcXVpcmUgYSBkZWxheSBzbG90LCBkZXBlbmRpbmcgdXBvbgotCSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgaW5zbi4gICovCi0gICAgICBpZiAoISBtaXBzX29wdHMubWlwczE2Ci0JICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JICAmJiAoKChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSkKLSAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCi0JICAgICAgfHwgKCEgZ3ByX2ludGVybG9ja3MKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKSkpCi0JewotCSAgLyogQSBsb2FkIGZyb20gYSBjb3Byb2Nlc3NvciBvciBmcm9tIG1lbW9yeS4gIEFsbCBsb2FkCi0JICAgICBkZWxheXMgZGVsYXkgdGhlIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIHJ0IGZvciBvbmUKLQkgICAgIGluc3RydWN0aW9uIG9uIHRoZSByMzAwMC4gIFRoZSByNjAwMCBhbmQgcjQwMDAgdXNlCi0JICAgICBpbnRlcmxvY2tzLiAgKi8KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBrbm93IChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCk7Ci0JICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JICAgICAgfHwgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpCi0JCQkJICYgT1BfTUFTS19SVCksCi0JCQkJTUlQU19HUl9SRUcpKQotCSAgICArK25vcHM7Ci0JfQotICAgICAgZWxzZSBpZiAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkgICAgICAgJiYgKCgocHJldl9waW5mbyAmIElOU05fQ09QUk9DX01PVkVfREVMQVkpCi0gICAgICAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCi0JCSAgIHx8IChtaXBzX29wdHMuaXNhID09IDEKLQkJICAgICAgICYmIChwcmV2X3BpbmZvICYgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZKSkpKQotCXsKLQkgIC8qIEEgZ2VuZXJpYyBjb3Byb2Nlc3NvciBkZWxheS4gIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbgotCSAgICAgbW9kaWZpZWQgYSBjb3Byb2Nlc3NvciBnZW5lcmFsIG9yIGNvbnRyb2wgcmVnaXN0ZXIuICBJZgotCSAgICAgaXQgbW9kaWZpZWQgYSBjb250cm9sIHJlZ2lzdGVyLCB3ZSBuZWVkIHRvIGF2b2lkIGFueQotCSAgICAgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgcHJvYmFibHkgbm90IGFsd2F5cwotCSAgICAgcmVxdWlyZWQsIGJ1dCBpdCBzb21ldGltZXMgaXMpLiAgSWYgaXQgbW9kaWZpZWQgYSBnZW5lcmFsCi0JICAgICByZWdpc3Rlciwgd2UgYXZvaWQgdXNpbmcgdGhhdCByZWdpc3Rlci4KLQotCSAgICAgT24gdGhlIHI2MDAwIGFuZCByNDAwMCBsb2FkaW5nIGEgY29wcm9jZXNzb3IgcmVnaXN0ZXIKLQkgICAgIGZyb20gbWVtb3J5IGlzIGludGVybG9ja2VkLCBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIGRlbGF5LgotCi0JICAgICBUaGlzIGNhc2UgaXMgbm90IGhhbmRsZWQgdmVyeSB3ZWxsLiAgVGhlcmUgaXMgbm8gc3BlY2lhbAotCSAgICAga25vd2xlZGdlIG9mIENQMCBoYW5kbGluZywgYW5kIHRoZSBjb3Byb2Nlc3NvcnMgb3RoZXIKLQkgICAgIHRoYW4gdGhlIGZsb2F0aW5nIHBvaW50IHVuaXQgYXJlIG5vdCBkaXN0aW5ndWlzaGVkIGF0Ci0JICAgICBhbGwuICAqLwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gRklYTUUhCi0gICAgICAgICAgICAgTmVlZCB0byBtb2RpZnkgdGhpcyB0byBpbmNsdWRlIGtub3dsZWRnZSBhYm91dCAKLSAgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBkZWxheXMhICAqLwotCSAgaWYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9UKQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9GVCkKLQkJCQkgICAgICYgT1BfTUFTS19GVCksCi0JCQkJICAgIE1JUFNfRlBfUkVHKSkKLQkJKytub3BzOwotCSAgICB9Ci0JICBlbHNlIGlmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9GUFJfUykKLQkgICAgewotCSAgICAgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfRlMpCi0JCQkJICAgICAmIE9QX01BU0tfRlMpLAotCQkJCSAgICBNSVBTX0ZQX1JFRykpCi0JCSsrbm9wczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uCi0JCSBkb2VzLiAgSWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gdXNlcyBhIGNvcHJvY2Vzc29yCi0JCSByZWdpc3Rlciwgd2UgbXVzdCBpbnNlcnQgYSBOT1AuICBJZiBwcmV2aW91cwotCQkgaW5zdHJ1Y3Rpb24gbWF5IHNldCB0aGUgY29uZGl0aW9uIGNvZGVzLCBhbmQgdGhlCi0JCSBjdXJyZW50IGluc3RydWN0aW9uIHVzZXMgdGhlbSwgd2UgbXVzdCBpbnNlcnQgdHdvCi0JCSBOT1BTLiAgKi8KLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgICAgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCAoKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLQkJICAgICAgJiYgKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkpKQotCQlub3BzICs9IDI7Ci0JICAgICAgZWxzZSBpZiAocGluZm8gJiBJTlNOX0NPUCkKLQkJKytub3BzOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkgICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLSAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHNldHMgdGhlIGNvcHJvY2Vzc29yIGNvbmRpdGlvbgotCSAgICAgY29kZXMsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGEgZ2VuZXJhbCBjb3Byb2Nlc3NvciBkZWxheQotCSAgICAgKHRoaXMgbWVhbnMgaXQgaXMgYSBmbG9hdGluZyBwb2ludCBjb21wYXJpc29uCi0JICAgICBpbnN0cnVjdGlvbikuICBJZiB0aGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGNvbmRpdGlvbgotCSAgICAgY29kZXMsIHdlIG5lZWQgdG8gaW5zZXJ0IGEgc2luZ2xlIE5PUC4gICovCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCSAgICAgIHx8IChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQotCSAgICArK25vcHM7Ci0JfQotICAgICAgZWxzZSBpZiAocHJldl9waW5mbyAmIElOU05fUkVBRF9MTykKLQl7Ci0JICAvKiBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gcmVhZHMgdGhlIExPIHJlZ2lzdGVyOyBpZiB0aGUKLQkgICAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd3JpdGVzIHRvIHRoZSBMTyByZWdpc3Rlciwgd2UgbXVzdAotCSAgICAgaW5zZXJ0IHR3byBOT1BTLiAgU29tZSBuZXdlciBwcm9jZXNzb3JzIGhhdmUgaW50ZXJsb2Nrcy4gCi0JICAgICBBbHNvIHRoZSB0eDM5J3MgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBleGVjdHV0ZWQgCi0gICAgICAgICAgICAgaW1tZWRpYXRseSBhZnRlciBhIHJlYWQgZnJvbSBISS9MTyAod2l0aG91dCB0aGUgZGVsYXkpLAotICAgICAgICAgICAgIHRob3VnaCB0aGUgdHgzOSdzIGRpdmlkZSBpbnNucyBzdGlsbCBkbyByZXF1aXJlIHRoZSAKLQkgICAgIGRlbGF5LiAqLwotCSAgaWYgKCEgKGhpbG9faW50ZXJsb2NrcwotCQkgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpCi0JICAgICAgJiYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IChwaW5mbyAmIElOU05fV1JJVEVfTE8pKSkKLQkgICAgbm9wcyArPSAyOwotCSAgLyogTW9zdCBtaXBzMTYgYnJhbmNoIGluc25zIGRvbid0IGhhdmUgYSBkZWxheSBzbG90LgotCSAgICAgSWYgYSByZWFkIGZyb20gTE8gaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBicmFuY2gKLQkgICAgIHRvIGEgd3JpdGUgdG8gTE8gd2UgaGF2ZSBhIHJlYWQgZm9sbG93ZWQgYnkgYSB3cml0ZQotCSAgICAgbGVzcyB0aGFuIDIgaW5zbnMgYXdheS4gIFdlIGFzc3VtZSB0aGUgdGFyZ2V0IG9mCi0JICAgICBhIGJyYW5jaCBtaWdodCBiZSBhIHdyaXRlIHRvIExPLCBhbmQgaW5zZXJ0IGEgbm9wCi0JICAgICBiZXR3ZWVuIGEgcmVhZCBhbmQgYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGJyYW5jaC4gKi8KLQkgIGVsc2UgaWYgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAgJiYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgICAgICAgfHwgKHBpbmZvICYgTUlQUzE2X0lOU05fQlJBTkNIKSkpCi0JICAgIG5vcHMgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHJlYWRzIHRoZSBISSByZWdpc3RlcjsgaWYgdGhlCi0JICAgICBjdXJyZW50IGluc3RydWN0aW9uIHdyaXRlcyB0byB0aGUgSEkgcmVnaXN0ZXIsIHdlIG11c3QKLQkgICAgIGluc2VydCBhIE5PUC4gIFNvbWUgbmV3ZXIgcHJvY2Vzc29ycyBoYXZlIGludGVybG9ja3MuCi0JICAgICBBbHNvIHRoZSBub3RlIHR4MzkncyBtdWx0aXBseSBhYm92ZS4gKi8KLQkgIGlmICghIChoaWxvX2ludGVybG9ja3MKLQkJIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKQotCSAgICAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCAocGluZm8gJiBJTlNOX1dSSVRFX0hJKSkpCi0JICAgIG5vcHMgKz0gMjsKLQkgIC8qIE1vc3QgbWlwczE2IGJyYW5jaCBpbnNucyBkb24ndCBoYXZlIGEgZGVsYXkgc2xvdC4KLQkgICAgIElmIGEgcmVhZCBmcm9tIEhJIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgYnJhbmNoCi0JICAgICB0byBhIHdyaXRlIHRvIEhJIHdlIGhhdmUgYSByZWFkIGZvbGxvd2VkIGJ5IGEgd3JpdGUKLQkgICAgIGxlc3MgdGhhbiAyIGluc25zIGF3YXkuICBXZSBhc3N1bWUgdGhlIHRhcmdldCBvZgotCSAgICAgYSBicmFuY2ggbWlnaHQgYmUgYSB3cml0ZSB0byBISSwgYW5kIGluc2VydCBhIG5vcAotCSAgICAgYmV0d2VlbiBhIHJlYWQgYW5kIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBicmFuY2guICovCi0JICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2Ci0JCSAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICAgICAgIHx8IChwaW5mbyAmIE1JUFMxNl9JTlNOX0JSQU5DSCkpKQotCSAgICBub3BzICs9IDE7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgbm9yZW9yZGVyIHNlY3Rpb24sIHRoZW4KLSAgICAgICAgIHdlIGRvbid0IHdhbnQgdG8gaW5zZXJ0IHRoZSBub3AgYWZ0ZXIgYWxsLiAgKi8KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGlmIChwcmV2X2luc25fdW5yZW9yZGVyZWQpCi0Jbm9wcyA9IDA7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSB0d28gY2FzZXMgd2hpY2ggcmVxdWlyZSB0d28gaW50ZXJ2ZW5pbmcKLQkgaW5zdHJ1Y3Rpb25zOiAxKSBzZXR0aW5nIHRoZSBjb25kaXRpb24gY29kZXMgdXNpbmcgYSBtb3ZlIHRvCi0JIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgZ2VuZXJhbCBjb3Byb2Nlc3NvcgotCSBkZWxheSBhbmQgdGhlbiByZWFkaW5nIHRoZSBjb25kaXRpb24gY29kZXMgMikgcmVhZGluZyB0aGUgSEkKLQkgb3IgTE8gcmVnaXN0ZXIgYW5kIHRoZW4gd3JpdGluZyB0byBpdCAoZXhjZXB0IG9uIHByb2Nlc3NvcnMKLQkgd2hpY2ggaGF2ZSBpbnRlcmxvY2tzKS4gIElmIHdlIGFyZSBub3QgYWxyZWFkeSBlbWl0dGluZyBhIE5PUAotCSBpbnN0cnVjdGlvbiwgd2UgbXVzdCBjaGVjayBmb3IgdGhlc2UgY2FzZXMgY29tcGFyZWQgdG8gdGhlCi0JIGluc3RydWN0aW9uIHByZXZpb3VzIHRvIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkgICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZKQotCSAgICYmIChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKQotCSAgICYmIChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpCi0JICAgJiYgISBjb3BfaW50ZXJsb2NrcykKLQkgIHx8ICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfTE8pCi0JICAgICAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9MTykKLQkgICAgICAmJiAhIChoaWxvX2ludGVybG9ja3MKLQkJICAgIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKSkKLQkgIHx8ICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JICAgICAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9ISSkKLQkgICAgICAmJiAhIChoaWxvX2ludGVybG9ja3MKLQkJICAgIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKSkpCi0JcHJldl9wcmV2X25vcCA9IDE7Ci0gICAgICBlbHNlCi0JcHJldl9wcmV2X25vcCA9IDA7Ci0KLSAgICAgIGlmIChwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCkKLQlwcmV2X3ByZXZfbm9wID0gMDsKLQotICAgICAgaWYgKHByZXZfcHJldl9ub3AgJiYgbm9wcyA9PSAwKQotCSsrbm9wczsKLQotICAgICAgLyogSWYgd2UgYXJlIGJlaW5nIGdpdmVuIGEgbm9wIGluc3RydWN0aW9uLCBkb24ndCBib3RoZXIgd2l0aAotCSBvbmUgb2YgdGhlIG5vcHMgd2Ugd291bGQgb3RoZXJ3aXNlIG91dHB1dC4gIFRoaXMgd2lsbCBvbmx5Ci0JIGhhcHBlbiB3aGVuIGEgbm9wIGluc3RydWN0aW9uIGlzIHVzZWQgd2l0aCBtaXBzX29wdGltaXplIHNldAotCSB0byAwLiAgKi8KLSAgICAgIGlmIChub3BzID4gMAotCSAgJiYgISBtaXBzX29wdHMubm9yZW9yZGVyCi0JICAmJiBpcC0+aW5zbl9vcGNvZGUgPT0gKG1pcHNfb3B0cy5taXBzMTYgPyAweDY1MDAgOiAwKSkKLQktLW5vcHM7Ci0KLSAgICAgIC8qIE5vdyBlbWl0IHRoZSByaWdodCBudW1iZXIgb2YgTk9QIGluc3RydWN0aW9ucy4gICovCi0gICAgICBpZiAobm9wcyA+IDAgJiYgISBtaXBzX29wdHMubm9yZW9yZGVyKQotCXsKLQkgIGZyYWdTICpvbGRfZnJhZzsKLQkgIHVuc2lnbmVkIGxvbmcgb2xkX2ZyYWdfb2Zmc2V0OwotCSAgaW50IGk7Ci0JICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0JICBvbGRfZnJhZyA9IGZyYWdfbm93OwotCSAgb2xkX2ZyYWdfb2Zmc2V0ID0gZnJhZ19ub3dfZml4ICgpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgbm9wczsgaSsrKQotCSAgICBlbWl0X25vcCAoKTsKLQotCSAgaWYgKGxpc3RpbmcpCi0JICAgIHsKLQkgICAgICBsaXN0aW5nX3ByZXZfbGluZSAoKTsKLQkgICAgICAvKiBXZSBtYXkgYmUgYXQgdGhlIHN0YXJ0IG9mIGEgdmFyaWFudCBmcmFnLiAgSW4gY2FzZSB3ZQotICAgICAgICAgICAgICAgICBhcmUsIG1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBmcmFnCi0gICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBmcmFncyBjcmVhdGVkIGJ5IGxpc3RpbmdfcHJldl9saW5lLiAgVGhlCi0gICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIGZyYWdfZ3JvdyBoZXJlIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UKLSAgICAgICAgICAgICAgICAgYXMgdGhlIGFyZ3VtZW50IHRvIGFsbCBvdGhlciBjYWxscyB0byBmcmFnX2dyb3cgaW4KLSAgICAgICAgICAgICAgICAgdGhpcyBmaWxlLiAgV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBiZWluZyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgbWlkZGxlIG9mIGEgdmFyaWFudCBmcmFnLCBiZWNhdXNlIHRoZSB2YXJpYW50cyBpbnNlcnQKLSAgICAgICAgICAgICAgICAgYWxsIG5lZWRlZCBub3AgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICAqLwotCSAgICAgIGZyYWdfZ3JvdyAoNDApOwotCSAgICB9Ci0KLQkgIGZvciAobCA9IGluc25fbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsLT5sYWJlbCkgPT0gbm93X3NlZyk7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChsLT5sYWJlbCwgZnJhZ19ub3cpOwotCSAgICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgICAgICAvKiBtaXBzMTYgdGV4dCBsYWJlbHMgYXJlIHN0b3JlZCBhcyBvZGQuICAqLwotCSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQotCQlTX1NFVF9WQUxVRSAobC0+bGFiZWwsIFNfR0VUX1ZBTFVFIChsLT5sYWJlbCkgKyAxKTsKLQkgICAgfQotCi0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotCSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLQkgICAgZWNvZmZfZml4X2xvYyAob2xkX2ZyYWcsIG9sZF9mcmFnX29mZnNldCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X25vcF9mcmFnICE9IE5VTEwpCi0JewotCSAgLyogV2UgaGF2ZSBhIGZyYWcgaG9sZGluZyBub3BzIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZS4gIElmCi0gICAgICAgICAgICAgd2UgZG9uJ3QgbmVlZCBhbnkgbm9wcywgd2UgY2FuIGRlY3JlYXNlIHRoZSBzaXplIG9mCi0gICAgICAgICAgICAgcHJldl9ub3BfZnJhZyBieSB0aGUgc2l6ZSBvZiBvbmUgaW5zdHJ1Y3Rpb24uICBJZiB3ZSBkbwotICAgICAgICAgICAgIG5lZWQgc29tZSBub3BzLCB3ZSBjb3VudCB0aGVtIGluIHByZXZfbm9wc19yZXF1aXJlZC4gKi8KLQkgIGlmIChwcmV2X25vcF9mcmFnX3NpbmNlID09IDApCi0JICAgIHsKLQkgICAgICBpZiAobm9wcyA9PSAwKQotCQl7Ci0JCSAgcHJldl9ub3BfZnJhZy0+ZnJfZml4IC09IG1pcHNfb3B0cy5taXBzMTYgPyAyIDogNDsKLQkJICAtLXByZXZfbm9wX2ZyYWdfaG9sZHM7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgKz0gbm9wczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHByZXZfcHJldl9ub3AgPT0gMCkKLQkJewotCQkgIHByZXZfbm9wX2ZyYWctPmZyX2ZpeCAtPSBtaXBzX29wdHMubWlwczE2ID8gMiA6IDQ7Ci0JCSAgLS1wcmV2X25vcF9mcmFnX2hvbGRzOwotCQl9Ci0JICAgICAgZWxzZQotCQkrK3ByZXZfbm9wX2ZyYWdfcmVxdWlyZWQ7Ci0JICAgIH0KLQotCSAgaWYgKHByZXZfbm9wX2ZyYWdfaG9sZHMgPD0gcHJldl9ub3BfZnJhZ19yZXF1aXJlZCkKLQkgICAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0KLQkgICsrcHJldl9ub3BfZnJhZ19zaW5jZTsKLQotCSAgLyogU2FuaXR5IGNoZWNrOiBieSB0aGUgdGltZSB3ZSByZWFjaCB0aGUgc2Vjb25kIGluc3RydWN0aW9uCi0gICAgICAgICAgICAgYWZ0ZXIgcHJldl9ub3BfZnJhZywgd2Ugc2hvdWxkIGhhdmUgdXNlZCB1cCBhbGwgdGhlIG5vcHMKLSAgICAgICAgICAgICBvbmUgd2F5IG9yIGFub3RoZXIuICAqLwotCSAgYXNzZXJ0IChwcmV2X25vcF9mcmFnX3NpbmNlIDw9IDEgfHwgcHJldl9ub3BfZnJhZyA9PSBOVUxMKTsKLQl9Ci0gICAgfQotCi0gIGlmIChyZWxvY190eXBlID4gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHNldCB1cCBhIHZhcmlhbnQgZnJhZy4gICovCi0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5taXBzMTYgJiYgYWRkcmVzc19leHByICE9IE5VTEwpOwotICAgICAgZiA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMCwKLQkJICAgIFJFTEFYX01JUFMxNl9FTkNPREUgKHJlbG9jX3R5cGUgLSBCRkRfUkVMT0NfVU5VU0VELAotCQkJCQkgbWlwczE2X3NtYWxsLCBtaXBzMTZfZXh0LAotCQkJCQkgKHByZXZfcGluZm8KLQkJCQkJICAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSksCi0JCQkJCSAocHJldl9pbnNuX3JlbG9jX3R5cGUKLQkJCQkJICA9PSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkpLAotCQkgICAgbWFrZV9leHByX3N5bWJvbCAoYWRkcmVzc19leHByKSwgKG9mZnNldFQpIDAsCi0JCSAgICAoY2hhciAqKSBOVUxMKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHBsYWNlICE9IE5VTEwpCi0gICAgZiA9IHBsYWNlOwotICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2Ci0JICAgJiYgISBpcC0+dXNlX2V4dGVuZAotCSAgICYmIHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIHRvIHN3YXAgdGhpcyBpbnN0cnVjdGlvbiB3aXRoCi0gICAgICAgICBhIGZvbGxvd2luZyBqdW1wIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGZyYWdfZ3JvdyAoNik7Ci0gICAgICBmID0gZnJhZ19tb3JlICgyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobWlwc19vcHRzLm1pcHMxNgotCSAgJiYgbWlwc19vcHRzLm5vcmVvcmRlcgotCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpICE9IDApCi0JYXNfd2FybiAoXygiZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIpKTsKLQotICAgICAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gICAgfQotCi0gIGZpeHAgPSBOVUxMOwotICBpZiAoYWRkcmVzc19leHByICE9IE5VTEwgJiYgcmVsb2NfdHlwZSA8IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaWYgKGFkZHJlc3NfZXhwci0+WF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHN3aXRjaCAocmVsb2NfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweGZmZmY7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0JICAgICAgaWYgKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDMpICE9IDApCi0JCWFzX2JhZCAoXygianVtcCB0byBtaXNhbGlnbmVkIGFkZHJlc3MgKDB4JWx4KSIpLAotCQkJKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyKTsKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyID4+IDIpICYgMHgzZmZmZmZmOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6Ci0JICAgICAgaWYgKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDMpICE9IDApCi0JCWFzX2JhZCAoXygianVtcCB0byBtaXNhbGlnbmVkIGFkZHJlc3MgKDB4JWx4KSIpLAotCQkJKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyKTsKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0KLQkJKCgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweDdjMDAwMCkgPDwgMykKLQkJIHwgKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDB4ZjgwMDAwMCkgPj4gNykKLQkJIHwgKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDB4M2ZmZmMpID4+IDIpKTsKLQkgICAgICBicmVhazsKLQotCi0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotCSAgICAgIGdvdG8gbmVlZF9yZWxvYzsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCW5lZWRfcmVsb2M6Ci0JICAvKiBEb24ndCBnZW5lcmF0ZSBhIHJlbG9jIGlmIHdlIGFyZSB3cml0aW5nIGludG8gYSB2YXJpYW50Ci0JICAgICBmcmFnLiAgKi8KLQkgIGlmIChwbGFjZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZml4cCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQkJCSAgYWRkcmVzc19leHByLAotCQkJCSAgcmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfMTZfUENSRUxfUzIsCi0JCQkJICByZWxvY190eXBlKTsKLQkgICAgICBpZiAodW5tYXRjaGVkX2hpKQotCQl7Ci0JCSAgc3RydWN0IG1pcHNfaGlfZml4dXAgKmhpX2ZpeHVwOwotCi0JCSAgYXNzZXJ0IChyZWxvY190eXBlID09IEJGRF9SRUxPQ19ISTE2X1MpOwotCQkgIGhpX2ZpeHVwID0gKChzdHJ1Y3QgbWlwc19oaV9maXh1cCAqKQotCQkJICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbWlwc19oaV9maXh1cCkpKTsKLQkJICBoaV9maXh1cC0+Zml4cCA9IGZpeHA7Ci0JCSAgaGlfZml4dXAtPnNlZyA9IG5vd19zZWc7Ci0JCSAgaGlfZml4dXAtPm5leHQgPSBtaXBzX2hpX2ZpeHVwX2xpc3Q7Ci0JCSAgbWlwc19oaV9maXh1cF9saXN0ID0gaGlfZml4dXA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKCEgbWlwc19vcHRzLm1pcHMxNikKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGlwLT5pbnNuX29wY29kZSwgNCk7Ci0gIGVsc2UgaWYgKHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpcC0+aW5zbl9vcGNvZGUgPj4gMTYsIDIpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgMiwgaXAtPmluc25fb3Bjb2RlICYgMHhmZmZmLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXAtPnVzZV9leHRlbmQpCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCAweGYwMDAgfCBpcC0+ZXh0ZW5kLCAyKTsKLQkgIGYgKz0gMjsKLQl9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGlwLT5pbnNuX29wY29kZSwgMik7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgcmVnaXN0ZXIgbWFzayBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgewotICAgICAgaWYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKTsKLSAgICAgIGlmICgocGluZm8gJiAoSU5TTl9XUklURV9HUFJfVCB8IElOU05fUkVBRF9HUFJfVCkpICE9IDApCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCk7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX1JFQURfR1BSX1MpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlMpICYgT1BfTUFTS19SUyk7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAzMTsKLSAgICAgIGlmIChwaW5mbyAmIElOU05fV1JJVEVfRlBSX0QpCi0JbWlwc19jcHJtYXNrWzFdIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRkQpICYgT1BfTUFTS19GRCk7Ci0gICAgICBpZiAoKHBpbmZvICYgKElOU05fV1JJVEVfRlBSX1MgfCBJTlNOX1JFQURfRlBSX1MpKSAhPSAwKQotCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZTKSAmIE9QX01BU0tfRlMpOwotICAgICAgaWYgKChwaW5mbyAmIChJTlNOX1dSSVRFX0ZQUl9UIHwgSU5TTl9SRUFEX0ZQUl9UKSkgIT0gMCkKLQltaXBzX2Nwcm1hc2tbMV0gfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GVCkgJiBPUF9NQVNLX0ZUKTsKLSAgICAgIGlmICgocGluZm8gJiBJTlNOX1JFQURfRlBSX1IpICE9IDApCi0JbWlwc19jcHJtYXNrWzFdIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlIpICYgT1BfTUFTS19GUik7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX0NPUCkKLQl7Ci0JICAvKiBXZSBkb24ndCBrZWVwIGVub3VnaCBpbmZvcm1hdGlvbiB0byBzb3J0IHRoZXNlIGNhc2VzIG91dC4gCi0JICAgICBUaGUgaXRibCBzdXBwb3J0IGRvZXMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGhvd2V2ZXIsIGFsdGhvdWdoIAotCSAgICAgd2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgaXRibCBmcHJtYXRzIGFzIHBhcnQgb2YgdGhlIGNvcCAKLQkgICAgIGluc3RydWN0aW9uLiAgTWF5IHdhbnQgdG8gYWRkIHRoaXMgc3VwcG9ydCBpbiB0aGUgZnV0dXJlLiAqLwotCX0KLSAgICAgIC8qIE5ldmVyIHNldCB0aGUgYml0IGZvciAkMCwgd2hpY2ggaXMgYWx3YXlzIHplcm8uICAqLwotICAgICAgbWlwc19ncHJtYXNrICY9fiAxIDw8IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFX1ggfCBNSVBTMTZfSU5TTl9SRUFEX1gpKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKQotCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX1JYKTsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9ZIHwgTUlQUzE2X0lOU05fUkVBRF9ZKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWSkKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SWSk7Ci0gICAgICBpZiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9aKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JaKQotCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX1JaKTsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9UIHwgTUlQUzE2X0lOU05fUkVBRF9UKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCBUUkVHOwotICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFX1NQIHwgTUlQUzE2X0lOU05fUkVBRF9TUCkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgU1A7Ci0gICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfMzEgfCBNSVBTMTZfSU5TTl9SRUFEXzMxKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCBSQTsKLSAgICAgIGlmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8IE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSIChpcC0+aW5zbl9vcGNvZGUpOwotICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9aKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX01PVkUzMlopCi0JCQkgICAgICAmIE1JUFMxNk9QX01BU0tfTU9WRTMyWik7Ci0gICAgICBpZiAocGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JFR1IzMikKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SRUdSMzIpOwotICAgIH0KLQotICBpZiAocGxhY2UgPT0gTlVMTCAmJiAhIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0gICAgewotICAgICAgLyogRmlsbGluZyB0aGUgYnJhbmNoIGRlbGF5IHNsb3QgaXMgbW9yZSBjb21wbGV4LiAgV2UgdHJ5IHRvCi0JIHN3aXRjaCB0aGUgYnJhbmNoIHdpdGggdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCB3aGljaCB3ZSBjYW4KLQkgZG8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGRvZXMgbm90IHNldCB1cCBhIGNvbmRpdGlvbgotCSB0aGF0IHRoZSBicmFuY2ggdGVzdHMgYW5kIGlmIHRoZSBicmFuY2ggaXMgbm90IGl0c2VsZiB0aGUKLQkgdGFyZ2V0IG9mIGFueSBicmFuY2guICAqLwotICAgICAgaWYgKChwaW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkKLQkgIHx8IChwaW5mbyAmIElOU05fQ09ORF9CUkFOQ0hfREVMQVkpKQotCXsKLQkgIGlmIChtaXBzX29wdGltaXplIDwgMgotCSAgICAgIC8qIElmIHdlIGhhdmUgc2VlbiAuc2V0IHZvbGF0aWxlIG9yIC5zZXQgbm9tb3ZlLCBkb24ndAotCQkgb3B0aW1pemUuICAqLwotCSAgICAgIHx8IG1pcHNfb3B0cy5ub21vdmUgIT0gMAotCSAgICAgIC8qIElmIHdlIGhhZCB0byBlbWl0IGFueSBOT1AgaW5zdHJ1Y3Rpb25zLCB0aGVuIHdlCi0JCSBhbHJlYWR5IGtub3cgd2UgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCBub3BzICE9IDAKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBldmVuIGtub3cgdGhlIHByZXZpb3VzIGluc24sIHdlIGNhbiBub3QKLQkJIHN3YXAuICovCi0JICAgICAgfHwgISBwcmV2X2luc25fdmFsaWQKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zbiBpcyBhbHJlYWR5IGluIGEgYnJhbmNoIGRlbGF5Ci0JCSBzbG90LCB0aGVuIHdlIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgcHJldmlvdXMgaW5zbiB3YXMgaW4gYSAuc2V0Ci0JCSBub3Jlb3JkZXIsIHdlIGNhbid0IHN3YXAuICBBY3R1YWxseSwgdGhlIE1JUFMKLQkJIGFzc2VtYmxlciB3aWxsIHN3YXAgaW4gdGhpcyBzaXR1YXRpb24uICBIb3dldmVyLCBnY2MKLQkJIGNvbmZpZ3VyZWQgLXdpdGgtZ251LWFzIHdpbGwgZ2VuZXJhdGUgY29kZSBsaWtlCi0JCSAgIC5zZXQgbm9yZW9yZGVyCi0JCSAgIGx3CSQ0LFhYWAotCQkgICAuc2V0CXJlb3JkZXIKLQkJICAgSU5TTgotCQkgICBibmUJJDQsJDAsZm9vCi0JCSBpbiB3aGljaCB3ZSBjYW4gbm90IHN3YXAgdGhlIGJuZSBhbmQgSU5TTi4gIElmIGdjYyBpcwotCQkgbm90IGNvbmZpZ3VyZWQgLXdpdGgtZ251LWFzLCBpdCBkb2VzIG5vdCBvdXRwdXQgdGhlCi0JCSAuc2V0IHBzZXVkby1vcHMuICBXZSBkb24ndCBoYXZlIHRvIGNoZWNrCi0JCSBwcmV2X2luc25fdW5yZW9yZGVyZWQsIGJlY2F1c2UgcHJldl9pbnNuX3ZhbGlkIHdpbGwKLQkJIGJlIDAgaW4gdGhhdCBjYXNlLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UKLQkJIHByZXZfcHJldl9pbnNuX3ZhbGlkLCBiZWNhdXNlIHdlIGRvIHdhbnQgdG8gYmUgYWJsZQotCQkgdG8gc3dhcCBhdCB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbi4gICovCi0JICAgICAgfHwgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIGlzIGl0c2VsZiB0aGUgdGFyZ2V0IG9mIGEgYnJhbmNoLCB3ZQotCQkgY2FuIG5vdCBzd2FwLiAgV2UgY2hlYXQgb24gdGhpczsgYWxsIHdlIGNoZWNrIGZvciBpcwotCQkgd2hldGhlciB0aGVyZSBpcyBhIGxhYmVsIG9uIHRoaXMgaW5zdHJ1Y3Rpb24uICBJZgotCQkgdGhlcmUgYXJlIGFueSBicmFuY2hlcyB0byBhbnl0aGluZyBvdGhlciB0aGFuIGEKLQkJIGxhYmVsLCB1c2VycyBtdXN0IHVzZSAuc2V0IG5vcmVvcmRlci4gICovCi0JICAgICAgfHwgaW5zbl9sYWJlbHMgIT0gTlVMTAotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBpbiBhIHZhcmlhbnQgZnJhZywgd2UKLQkJIGNhbiBub3QgZG8gdGhlIHN3YXAuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIHRoZQotCQkgbWlwczE2LCB3aGljaCB1c2VzIHZhcmlhbnQgZnJhZ3MgZm9yIGRpZmZlcmVudAotCQkgcHVycG9zZXMuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBwcmV2X2luc25fZnJhZy0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudCkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHJlYWRzIHRoZSBjb25kaXRpb24gY29kZXMsIHdlIGRvbid0Ci0JCSBldmVuIHRyeSB0byBzd2FwLCBiZWNhdXNlIGluIHRoZSBzZXF1ZW5jZQotCQkgICBjdGMxICRYLCQzMQotCQkgICBJTlNOCi0JCSAgIElOU04KLQkJICAgYmMxdCBMQUJFTAotCQkgd2UgY2FuIG5vdCBzd2FwLCBhbmQgSSBkb24ndCBmZWVsIGxpa2UgaGFuZGxpbmcgdGhhdAotCQkgY2FzZS4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkJICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkKLQkgICAgICAvKiBXZSBjYW4gbm90IHN3YXAgd2l0aCBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlcXVpcmVzIGEKLQkJIGRlbGF5IHNsb3QsIGJlY2FzZSB0aGUgdGFyZ2V0IG9mIHRoZSBicmFuY2ggbWlnaHQKLQkJIGludGVyZmVyZSB3aXRoIHRoYXQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JCSAgJiYgKHByZXZfcGluZm8KLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCQkgICAgICAmIChJTlNOX0xPQURfQ09QUk9DX0RFTEFZCi0JCQkgfCBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZCi0JCQkgfCBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpKQotCSAgICAgIHx8ICghIChoaWxvX2ludGVybG9ja3MKLQkJICAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkKLQkJICAmJiAocHJldl9waW5mbwotCQkgICAgICAmIChJTlNOX1JFQURfTE8KLQkJCSB8IElOU05fUkVBRF9ISSkpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAhIGdwcl9pbnRlcmxvY2tzCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgbWlwc19vcHRzLmlzYSA9PSAxCi0gICAgICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkpKQotCSAgICAgIC8qIFdlIGNhbiBub3Qgc3dhcCB3aXRoIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICB8fCAocHJldl9waW5mbwotCQkgICYgKElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotCQkgICAgIHwgSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotCQkgICAgIHwgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkpKQotCSAgICAgIC8qIFdlIGRvIG5vdCBzd2FwIHdpdGggYSB0cmFwIGluc3RydWN0aW9uLCBzaW5jZSBpdAotCQkgY29tcGxpY2F0ZXMgdHJhcCBoYW5kbGVycyB0byBoYXZlIHRoZSB0cmFwCi0JCSBpbnN0cnVjdGlvbiBiZSBpbiBhIGRlbGF5IHNsb3QuICAqLwotCSAgICAgIHx8IChwcmV2X3BpbmZvICYgSU5TTl9UUkFQKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggcmVhZHMgYSByZWdpc3RlciB0aGF0IHRoZSBwcmV2aW91cwotCQkgaW5zdHJ1Y3Rpb24gc2V0cywgd2UgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCQkgICAgICYgT1BfTUFTS19SVCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLQkJCQkgICAgICYgT1BfTUFTS19SRCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmICgoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9YKQotCQkgICAgICAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAoKHByZXZfaW5zbi5pbnNuX29wY29kZQotCQkJCQkgICA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCQkJICAmIE1JUFMxNk9QX01BU0tfUlgpLAotCQkJCQkgTUlQUzE2X1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1kpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUKLQkJCQkJICAgICAgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkJCSAgICAgJiBNSVBTMTZPUF9NQVNLX1JZKSwKLQkJCQkJICAgIE1JUFMxNl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9aKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlCi0JCQkJCSAgICAgID4+IE1JUFMxNk9QX1NIX1JaKQotCQkJCQkgICAgICYgTUlQUzE2T1BfTUFTS19SWiksCi0JCQkJCSAgICBNSVBTMTZfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfVCkKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsIFRSRUcsIE1JUFNfR1JfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLCBSQSwgTUlQU19HUl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9HUFJfWSkKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAgICBNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAocHJldl9pbnNuLgotCQkJCQkJCQkgICAgIGluc25fb3Bjb2RlKSwKLQkJCQkJICAgIE1JUFNfR1JfUkVHKSkpKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggd3JpdGVzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIHNldHMsIHdlIGNhbiBub3Qgc3dhcCAod2Uga25vdyB0aGF0Ci0JCSBicmFuY2hlcyB3cml0ZSBvbmx5IHRvIFJEIG9yIHRvICQzMSkuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX1QpCi0JCSAgJiYgKCgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICAgICAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpCi0JCQkgICA9PSAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKSkpCi0JCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQkJCSAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQotCQkJICAgICAgICYgT1BfTUFTS19SVCkKLQkJCSAgICAgID09IDMxKSkpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JCSAgJiYgKCgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICAgICAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpCi0JCQkgICA9PSAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKSkpCi0JCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQkJCSAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKQotCQkJICAgICAgICYgT1BfTUFTS19SRCkKLQkJCSAgICAgID09IDMxKSkpKQotCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCSAgJiYgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZKQotCQkJICAmJiAoTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKHByZXZfaW5zbi5pbnNuX29wY29kZSkKLQkJCSAgICAgID09IFJBKSkpKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggd3JpdGVzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIHJlYWRzLCB3ZSBjYW4gbm90IHN3YXAgKHdlIGtub3cgdGhhdAotCQkgYnJhbmNoZXMgb25seSB3cml0ZSB0byBSRCBvciB0byAkMzEpLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLAotCQkJCSAgICAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLQkJCQkgICAgICYgT1BfTUFTS19SRCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwgMzEsIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sIFJBLCBNSVBTX0dSX1JFRykpCi0JICAgICAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHRoZSBicmFuY2gKLQkJIG1pZ2h0IGJlIGV4cGFuZGVkIGludG8gYSBzZXF1ZW5jZSB3aGljaCB1c2VzICRhdCwgc28KLQkJIHdlIGNhbid0IHN3YXAgd2l0aCBhbiBpbnN0cnVjdGlvbiB3aGljaCByZWFkcyBpdC4gICovCi0JICAgICAgfHwgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sIEFULCBNSVBTX0dSX1JFRykpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc3RydWN0aW9uIGhhcyBhIGxvYWQKLQkJIGRlbGF5LCBhbmQgc2V0cyBhIHJlZ2lzdGVyIHRoYXQgdGhlIGJyYW5jaCByZWFkcywgd2UKLQkJIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCQkgICYmICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQotCQkgICAgICB8fCAoISBncHJfaW50ZXJsb2NrcwotCQkJICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8KLQkJCSAgICAgICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfcHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQotCQkJCSAgICAgJiBPUF9NQVNLX1JUKSwKLQkJCQkgICAgTUlQU19HUl9SRUcpKQotCSAgICAgIC8qIElmIG9uZSBpbnN0cnVjdGlvbiBzZXRzIGEgY29uZGl0aW9uIGNvZGUgYW5kIHRoZQotICAgICAgICAgICAgICAgICBvdGhlciBvbmUgdXNlcyBhIGNvbmRpdGlvbiBjb2RlLCB3ZSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKQotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQotCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBQQywgd2UgY2FuIG5vdAotICAgICAgICAgICAgICAgICBzd2FwLiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9QQykpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBleHRlbmRlZCwgd2UgY2FuIG5vdAotICAgICAgICAgICAgICAgICBzd2FwLiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNiAmJiBwcmV2X2luc25fZXh0ZW5kZWQpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGhhZCBhIGZpeHVwIGluIG1pcHMxNgotICAgICAgICAgICAgICAgICBtb2RlLCB3ZSBjYW4gbm90IHN3YXAuICBUaGlzIG5vcm1hbGx5IG1lYW5zIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhIDQgYnl0ZSBicmFuY2ggYW55aG93LiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNiAmJiBwcmV2X2luc25fZml4cCkKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBzeW5jLCBzeW5jLmwsIG9yIAotCQkgc3luYy5wLCB3ZSBjYW4gbm90IHN3YXAuICovCi0JICAgICAgfHwgKHByZXZfcGluZm8gJiBJTlNOX1NZTkMpKQotCSAgICB7Ci0JICAgICAgLyogV2UgY291bGQgZG8gZXZlbiBiZXR0ZXIgZm9yIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgdG8KLQkJIHBvcnRpb25zIG9mIHRoaXMgb2JqZWN0IGZpbGU7IHdlIGNvdWxkIHBpY2sgdXAgdGhlCi0JCSBpbnN0cnVjdGlvbiBhdCB0aGUgZGVzdGluYXRpb24sIHB1dCBpdCBpbiB0aGUgZGVsYXkKLQkJIHNsb3QsIGFuZCBidW1wIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzLiAgKi8KLQkgICAgICBlbWl0X25vcCAoKTsKLQkgICAgICAvKiBVcGRhdGUgdGhlIHByZXZpb3VzIGluc24gaW5mb3JtYXRpb24uICAqLwotCSAgICAgIHByZXZfcHJldl9pbnNuID0gKmlwOwotCSAgICAgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSXQgbG9va3MgbGlrZSB3ZSBjYW4gYWN0dWFsbHkgZG8gdGhlIHN3YXAuICAqLwotCSAgICAgIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0JCXsKLQkJICBjaGFyICpwcmV2X2Y7Ci0JCSAgY2hhciB0ZW1wWzRdOwotCi0JCSAgcHJldl9mID0gcHJldl9pbnNuX2ZyYWctPmZyX2xpdGVyYWwgKyBwcmV2X2luc25fd2hlcmU7Ci0JCSAgbWVtY3B5ICh0ZW1wLCBwcmV2X2YsIDQpOwotCQkgIG1lbWNweSAocHJldl9mLCBmLCA0KTsKLQkJICBtZW1jcHkgKGYsIHRlbXAsIDQpOwotCQkgIGlmIChwcmV2X2luc25fZml4cCkKLQkJICAgIHsKLQkJICAgICAgcHJldl9pbnNuX2ZpeHAtPmZ4X2ZyYWcgPSBmcmFnX25vdzsKLQkJICAgICAgcHJldl9pbnNuX2ZpeHAtPmZ4X3doZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOwotCQkgICAgfQotCQkgIGlmIChmaXhwKQotCQkgICAgewotCQkgICAgICBmaXhwLT5meF9mcmFnID0gcHJldl9pbnNuX2ZyYWc7Ci0JCSAgICAgIGZpeHAtPmZ4X3doZXJlID0gcHJldl9pbnNuX3doZXJlOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcHJldl9mOwotCQkgIGNoYXIgdGVtcFsyXTsKLQotCQkgIGFzc2VydCAocHJldl9pbnNuX2ZpeHAgPT0gTlVMTCk7Ci0JCSAgcHJldl9mID0gcHJldl9pbnNuX2ZyYWctPmZyX2xpdGVyYWwgKyBwcmV2X2luc25fd2hlcmU7Ci0JCSAgbWVtY3B5ICh0ZW1wLCBwcmV2X2YsIDIpOwotCQkgIG1lbWNweSAocHJldl9mLCBmLCAyKTsKLQkJICBpZiAocmVsb2NfdHlwZSAhPSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkKLQkJICAgIHsKLQkJICAgICAgYXNzZXJ0IChyZWxvY190eXBlID09IEJGRF9SRUxPQ19VTlVTRUQpOwotCQkgICAgICBtZW1jcHkgKGYsIHRlbXAsIDIpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5IChmLCBmICsgMiwgMik7Ci0JCSAgICAgIG1lbWNweSAoZiArIDIsIHRlbXAsIDIpOwotCQkgICAgfQotCQkgIGlmIChmaXhwKQotCQkgICAgewotCQkgICAgICBmaXhwLT5meF9mcmFnID0gcHJldl9pbnNuX2ZyYWc7Ci0JCSAgICAgIGZpeHAtPmZ4X3doZXJlID0gcHJldl9pbnNuX3doZXJlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBVcGRhdGUgdGhlIHByZXZpb3VzIGluc24gaW5mb3JtYXRpb247IGxlYXZlIHByZXZfaW5zbgotCQkgdW5jaGFuZ2VkLiAgKi8KLQkgICAgICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKLQkgICAgfQotCSAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAxOwotCi0JICAvKiBJZiB0aGF0IHdhcyBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgZm9yZ2V0IHRoZSBwcmV2aW91cwotCSAgICAgaW5zbiBpbmZvcm1hdGlvbi4gICovCi0JICBpZiAocGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpCi0JICAgIHsKLQkgICAgICBwcmV2X3ByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICAgIH0KLQotCSAgcHJldl9pbnNuX2ZpeHAgPSBOVUxMOwotCSAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgcHJldl9pbnNuX2V4dGVuZGVkID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChwaW5mbyAmIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZKQotCXsKLQkgIC8qIFdlIGRvbid0IHlldCBvcHRpbWl6ZSBhIGJyYW5jaCBsaWtlbHkuICBXaGF0IHdlIHNob3VsZCBkbwotCSAgICAgaXMgbG9vayBhdCB0aGUgdGFyZ2V0LCBjb3B5IHRoZSBpbnN0cnVjdGlvbiBmb3VuZCB0aGVyZQotCSAgICAgaW50byB0aGUgZGVsYXkgc2xvdCwgYW5kIGluY3JlbWVudCB0aGUgYnJhbmNoIHRvIGp1bXAgdG8KLQkgICAgIHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLQkgIGVtaXRfbm9wICgpOwotCSAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgIHByZXZfcHJldl9pbnNuID0gKmlwOwotCSAgcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgcHJldl9pbnNuX2ZpeHAgPSBOVUxMOwotCSAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgcHJldl9pbnNuX2V4dGVuZGVkID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmIChub3BzID4gMCkKLQkgICAgcHJldl9wcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICBlbHNlCi0JICAgIHByZXZfcHJldl9pbnNuID0gcHJldl9pbnNuOwotCSAgcHJldl9pbnNuID0gKmlwOwotCi0JICAvKiBBbnkgdGltZSB3ZSBzZWUgYSBicmFuY2gsIHdlIGFsd2F5cyBmaWxsIHRoZSBkZWxheSBzbG90Ci0JICAgICBpbW1lZGlhdGVseTsgc2luY2UgdGhpcyBpbnNuIGlzIG5vdCBhIGJyYW5jaCwgd2Uga25vdyBpdAotCSAgICAgaXMgbm90IGluIGEgZGVsYXkgc2xvdC4gICovCi0JICBwcmV2X2luc25faXNfZGVsYXlfc2xvdCA9IDA7Ci0KLQkgIHByZXZfaW5zbl9maXhwID0gZml4cDsKLQkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gcmVsb2NfdHlwZTsKLQkgIGlmIChtaXBzX29wdHMubWlwczE2KQotCSAgICBwcmV2X2luc25fZXh0ZW5kZWQgPSAoaXAtPnVzZV9leHRlbmQKLQkJCQkgIHx8IHJlbG9jX3R5cGUgPiBCRkRfUkVMT0NfVU5VU0VEKTsKLQl9Ci0KLSAgICAgIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gcHJldl9pbnNuX3VucmVvcmRlcmVkOwotICAgICAgcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMDsKLSAgICAgIHByZXZfaW5zbl9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBwcmV2X2luc25fd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7Ci0gICAgICBwcmV2X2luc25fdmFsaWQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHJlY29yZCBhIGJpdCBvZiBpbmZvcm1hdGlvbiBldmVuIHdoZW4gd2UgYXJlIG5vdAotICAgICAgICAgcmVvcmRlcmluZywgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBiYXNlIGFkZHJlc3MgZm9yIG1pcHMxNgotICAgICAgICAgUEMgcmVsYXRpdmUgcmVsb2NzLiAgKi8KLSAgICAgIHByZXZfcHJldl9pbnNuID0gcHJldl9pbnNuOwotICAgICAgcHJldl9pbnNuID0gKmlwOwotICAgICAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSByZWxvY190eXBlOwotICAgICAgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQgPSBwcmV2X2luc25fdW5yZW9yZGVyZWQ7Ci0gICAgICBwcmV2X2luc25fdW5yZW9yZGVyZWQgPSAxOwotICAgIH0KLQotICAvKiBXZSBqdXN0IG91dHB1dCBhbiBpbnNuLCBzbyB0aGUgbmV4dCBvbmUgZG9lc24ndCBoYXZlIGEgbGFiZWwuICAqLwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotCi0gIC8qIFdlIG11c3QgZW5zdXJlIHRoYXQgYSBmaXh1cCBhc3NvY2lhdGVkIHdpdGggYW4gdW5tYXRjaGVkICVoaQotICAgICByZWxvYyBkb2VzIG5vdCBiZWNvbWUgYSB2YXJpYW50IGZyYWcuICBPdGhlcndpc2UsIHRoZQotICAgICByZWFycmFuZ2VtZW50IG9mICVoaSByZWxvY3MgaW4gZnJvYl9maWxlIG1heSBjb25mdXNlCi0gICAgIHRjX2dlbl9yZWxvYy4gICovCi0gIGlmICh1bm1hdGNoZWRfaGkpCi0gICAgewotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGZvcmdldHMgdGhhdCB0aGVyZSB3YXMgYW55IHByZXZpb3VzIGluc3RydWN0aW9uIG9yCi0gICBsYWJlbC4gIElmIFBSRVNFUlZFIGlzIG5vbi16ZXJvLCBpdCByZW1lbWJlcnMgZW5vdWdoIGluZm9ybWF0aW9uIHRvCi0gICBrbm93IHdoZXRoZXIgbm9wcyBhcmUgbmVlZGVkIGJlZm9yZSBhIG5vcmVvcmRlciBzZWN0aW9uLiAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19ub19wcmV2X2luc24gKHByZXNlcnZlKQotICAgICBpbnQgcHJlc2VydmU7Ci17Ci0gIGlmICghIHByZXNlcnZlKQotICAgIHsKLSAgICAgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLSAgICAgIHByZXZfcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotICAgICAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0gICAgICBwcmV2X25vcF9mcmFnX2hvbGRzID0gMDsKLSAgICAgIHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgPSAwOwotICAgICAgcHJldl9ub3BfZnJhZ19zaW5jZSA9IDA7Ci0gICAgfQotICBwcmV2X2luc25fdmFsaWQgPSAwOwotICBwcmV2X2luc25faXNfZGVsYXlfc2xvdCA9IDA7Ci0gIHByZXZfaW5zbl91bnJlb3JkZXJlZCA9IDA7Ci0gIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7Ci0gIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQgPSAwOwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIHdlIHR1cm4gb24gbm9yZW9yZGVyIG9yIGVtaXQKLSAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGluc3RydWN0aW9ucy4gIEl0IGluc2VydHMgYW55IE5PUFMgd2hpY2ggbWlnaHQKLSAgIGJlIG5lZWRlZCBieSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24sIGFuZCBjbGVhcnMgdGhlIGluZm9ybWF0aW9uCi0gICBrZXB0IGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb25zLiAgVGhlIElOU05TIHBhcmFtZXRlciBpcyB0cnVlIGlmCi0gICBpbnN0cnVjdGlvbnMgYXJlIHRvIGZvbGxvdy4gKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZW1pdF9kZWxheXMgKGluc25zKQotICAgICBib29sZWFuIGluc25zOwotewotICBpZiAoISBtaXBzX29wdHMubm9yZW9yZGVyKQotICAgIHsKLSAgICAgIGludCBub3BzOwotCi0gICAgICBub3BzID0gMDsKLSAgICAgIGlmICgoISBtaXBzX29wdHMubWlwczE2Ci0JICAgJiYgSVNBX0hBU19DT1BST0NfREVMQVlTIChtaXBzX29wdHMuaXNhKQotCSAgICYmICghIGNvcF9pbnRlcmxvY2tzCi0gICAgICAgICAgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0gICAgICAgICAgICAgICAgICAgJiAoSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotICAgICAgICAgICAgICAgICAgICAgIHwgSU5TTl9DT1BST0NfTU9WRV9ERUxBWQotICAgICAgICAgICAgICAgICAgICAgIHwgSU5TTl9XUklURV9DT05EX0NPREUpKSkpCi0JICB8fCAoISBoaWxvX2ludGVybG9ja3MKLQkgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0JCSAgJiAoSU5TTl9SRUFEX0xPCi0JCSAgICAgfCBJTlNOX1JFQURfSEkpKSkKLQkgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAmJiAhIGdwcl9pbnRlcmxvY2tzCi0JICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAKLSAgICAgICAgICAgICAgICAgICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpCi0JICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgJiYgbWlwc19vcHRzLmlzYSA9PSAxCi0JICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbwotCQkgICYgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZKSkpCi0JewotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgICsrbm9wczsKLQkgIGlmICgoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkgICAgICAgJiYgKCEgY29wX2ludGVybG9ja3MKLSAgICAgICAgICAgICAgICAgICAmJiBwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpCi0JICAgICAgfHwgKCEgaGlsb19pbnRlcmxvY2tzCi0JCSAgJiYgKChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JCSAgICAgIHx8IChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfTE8pKSkpCi0JICAgICsrbm9wczsKLQotCSAgaWYgKHByZXZfaW5zbl91bnJlb3JkZXJlZCkKLQkgICAgbm9wcyA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCQkmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JCSYmICghIGNvcF9pbnRlcmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICYmIHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQotCSAgICAgICB8fCAoISBoaWxvX2ludGVybG9ja3MKLQkJICAgJiYgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9ISSkKLQkJICAgICAgIHx8IChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9MTykpKSkKLQl7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgaWYgKCEgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpCi0JICAgICsrbm9wczsKLQl9Ci0KLSAgICAgIGlmIChub3BzID4gMCkKLQl7Ci0JICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0JICBpZiAoaW5zbnMpCi0JICAgIHsKLQkgICAgICAvKiBSZWNvcmQgdGhlIGZyYWcgd2hpY2ggaG9sZHMgdGhlIG5vcCBpbnN0cnVjdGlvbnMsIHNvCi0gICAgICAgICAgICAgICAgIHRoYXQgd2UgY2FuIHJlbW92ZSB0aGVtIGlmIHdlIGRvbid0IG5lZWQgdGhlbS4gICovCi0JICAgICAgZnJhZ19ncm93IChtaXBzX29wdHMubWlwczE2ID8gbm9wcyAqIDIgOiBub3BzICogNCk7Ci0JICAgICAgcHJldl9ub3BfZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIHByZXZfbm9wX2ZyYWdfaG9sZHMgPSBub3BzOwotCSAgICAgIHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgPSAwOwotCSAgICAgIHByZXZfbm9wX2ZyYWdfc2luY2UgPSAwOwotCSAgICB9Ci0KLQkgIGZvciAoOyBub3BzID4gMDsgLS1ub3BzKQotCSAgICBlbWl0X25vcCAoKTsKLQotCSAgaWYgKGluc25zKQotCSAgICB7Ci0JICAgICAgLyogTW92ZSBvbiB0byBhIG5ldyBmcmFnLCBzbyB0aGF0IGl0IGlzIHNhZmUgdG8gc2ltcGx5Ci0gICAgICAgICAgICAgICAgIGRlY3JlYXNlIHRoZSBzaXplIG9mIHByZXZfbm9wX2ZyYWcuICovCi0JICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0JICAgICAgZnJhZ19uZXcgKDApOwotCSAgICB9Ci0KLQkgIGZvciAobCA9IGluc25fbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsLT5sYWJlbCkgPT0gbm93X3NlZyk7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChsLT5sYWJlbCwgZnJhZ19ub3cpOwotCSAgICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgICAgICAvKiBtaXBzMTYgdGV4dCBsYWJlbHMgYXJlIHN0b3JlZCBhcyBvZGQuICAqLwotCSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQotCQlTX1NFVF9WQUxVRSAobC0+bGFiZWwsIFNfR0VUX1ZBTFVFIChsLT5sYWJlbCkgKyAxKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICAqLwotICBpZiAobWlwc19vcHRzLm1pcHMxNiAmJiBpbnNucykKLSAgICBtaXBzMTZfbWFya19sYWJlbHMgKCk7Ci0KLSAgbWlwc19ub19wcmV2X2luc24gKGluc25zKTsKLX0KLQotLyogQnVpbGQgYW4gaW5zdHJ1Y3Rpb24gY3JlYXRlZCBieSBhIG1hY3JvIGV4cGFuc2lvbi4gIFRoaXMgaXMgcGFzc2VkCi0gICBhIHBvaW50ZXIgdG8gdGhlIGNvdW50IG9mIGluc3RydWN0aW9ucyBjcmVhdGVkIHNvIGZhciwgYW4KLSAgIGV4cHJlc3Npb24sIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBidWlsZCwgYW4gb3BlcmFuZCBmb3JtYXQKLSAgIHN0cmluZywgYW5kIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzLiAgKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXN0YXRpYyB2b2lkCi1tYWNyb19idWlsZCAoY2hhciAqcGxhY2UsCi0JICAgICBpbnQgKmNvdW50ZXIsCi0JICAgICBleHByZXNzaW9uUyAqIGVwLAotCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkgICAgIGNvbnN0IGNoYXIgKmZtdCwKLQkgICAgIC4uLikKLSNlbHNlCi1zdGF0aWMgdm9pZAotbWFjcm9fYnVpbGQgKHBsYWNlLCBjb3VudGVyLCBlcCwgbmFtZSwgZm10LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIGludCAqY291bnRlcjsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0gIHZhX2xpc3QgYXJnczsKLQotI2lmZGVmIFVTRV9TVERBUkcKLSAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLQotICAvKgotICAgKiBJZiB0aGUgbWFjcm8gaXMgYWJvdXQgdG8gZXhwYW5kIGludG8gYSBzZWNvbmQgaW5zdHJ1Y3Rpb24sCi0gICAqIHByaW50IGEgd2FybmluZyBpZiBuZWVkZWQuIFdlIG5lZWQgdG8gcGFzcyBpcCBhcyBhIHBhcmFtZXRlcgotICAgKiB0byBnZW5lcmF0ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UgaGVyZS4uLgotICAgKi8KLSAgaWYgKG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyAmJiBwbGFjZSA9PSBOVUxMICYmICpjb3VudGVyID09IDEpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMiKSk7Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgKmNvdW50ZXIgKz0gMTsJCS8qIGJ1bXAgaW5zdHJ1Y3Rpb24gY291bnRlciAqLwotCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIG1pcHMxNl9tYWNyb19idWlsZCAocGxhY2UsIGNvdW50ZXIsIGVwLCBuYW1lLCBmbXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIGluc24uaW5zbl9tbyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLSAgYXNzZXJ0IChpbnNuLmluc25fbW8pOwotICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLQotICAvKiBTZWFyY2ggdW50aWwgd2UgZ2V0IGEgbWF0Y2ggZm9yIE5BTUUuICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChmbXQsIGluc24uaW5zbl9tby0+YXJncykgPT0gMAotCSAgJiYgaW5zbi5pbnNuX21vLT5waW5mbyAhPSBJTlNOX01BQ1JPCi0JICAmJiBPUENPREVfSVNfTUVNQkVSIChpbnNuLmluc25fbW8sIG1pcHNfb3B0cy5pc2EsIG1pcHNfY3B1KQotCSAgJiYgKG1pcHNfY3B1ICE9IDQ2NTAgfHwgKGluc24uaW5zbl9tby0+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+IChvZmZzZXRUKSAweDdmZmZmZmZmKSkKLQkJJiYgKCEgZGJsCi0JCSAgICB8fCAhIGVwLT5YX3Vuc2lnbmVkCi0JCSAgICB8fCBzaXplb2YgKGVwLT5YX2FkZF9udW1iZXIpID4gNAotCQkgICAgfHwgKGVwLT5YX2FkZF9udW1iZXIgJiAweDgwMDAwMDAwKSA9PSAwKSkKLQkgICAgICAgfHwgKCghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkgfHwgISBkYmwpCi0JCSAgICYmIChlcC0+WF9hZGRfbnVtYmVyICZ+IChvZmZzZXRUKSAweGZmZmZmZmZmKSA9PSAwKQotCSAgICAgICB8fCAoISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpCi0JCSAgICYmICEgZGJsCi0JCSAgICYmICgoZXAtPlhfYWRkX251bWJlciAmfiAob2Zmc2V0VCkgMHhmZmZmZmZmZikKLQkJICAgICAgID09IH4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpKSkKLQl7Ci0JICAvKiAzMiBiaXQgdmFsdWVzIHJlcXVpcmUgYW4gbHVpLiAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgImx1aSIsICJ0LHUiLCByZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7Ci0JICBpZiAoKGVwLT5YX2FkZF9udW1iZXIgJiAweGZmZmYpICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgIm9yaSIsICJ0LHIsaSIsIHJlZywgcmVnLAotCQkJIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiAzMiBiaXRzLiAgKi8KLQotICBpZiAoISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTnVtYmVyIGxhcmdlciB0aGFuIDMyIGJpdHMiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJhZGRpdSIsICJ0LHIsaiIsIHJlZywgMCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXAtPlhfb3AgIT0gT19iaWcpCi0gICAgewotICAgICAgaGkzMiA9ICplcDsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyID0gKHZhbHVlVCkgaGkzMi5YX2FkZF9udW1iZXIgPj4gMTY7Ci0gICAgICBoaTMyLlhfYWRkX251bWJlciA9ICh2YWx1ZVQpIGhpMzIuWF9hZGRfbnVtYmVyID4+IDE2OwotICAgICAgaGkzMi5YX2FkZF9udW1iZXIgJj0gMHhmZmZmZmZmZjsKLSAgICAgIGxvMzIgPSAqZXA7Ci0gICAgICBsbzMyLlhfYWRkX251bWJlciAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoZXAtPlhfYWRkX251bWJlciA+IDIpOwotICAgICAgaWYgKGVwLT5YX2FkZF9udW1iZXIgPT0gMykKLQlnZW5lcmljX2JpZ251bVszXSA9IDA7Ci0gICAgICBlbHNlIGlmIChlcC0+WF9hZGRfbnVtYmVyID4gNCkKLQlhc19iYWQgKF8oIk51bWJlciBsYXJnZXIgdGhhbiA2NCBiaXRzIikpOwotICAgICAgbG8zMi5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGxvMzIuWF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMF0gKyAoZ2VuZXJpY19iaWdudW1bMV0gPDwgMTYpOwotICAgICAgaGkzMi5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMl0gKyAoZ2VuZXJpY19iaWdudW1bM10gPDwgMTYpOwotICAgIH0KLQotICBpZiAoaGkzMi5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICBmcmVnID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBzaGlmdCwgYml0OwotICAgICAgdW5zaWduZWQgbG9uZyBoaSwgbG87Ci0KLSAgICAgIGlmIChoaTMyLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZjgwMDApID09IDB4ZmZmZjgwMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgImFkZGl1IiwgInQscixqIiwKLQkJCSAgIHJlZywgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGxvMzIuWF9hZGRfbnVtYmVyICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAibHVpIiwgInQsdSIsIHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKLQkgICAgICBpZiAobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmYpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgIm9yaSIsICJ0LHIsaSIsCi0JCQkgICAgIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAvKiBDaGVjayBmb3IgMTZiaXQgc2hpZnRlZCBjb25zdGFudC4gIFdlIGtub3cgdGhhdCBoaTMyIGlzCi0gICAgICAgICBub24temVybywgc28gc3RhcnQgdGhlIG1hc2sgb24gdGhlIGZpcnN0IGJpdCBvZiB0aGUgaGkzMgotICAgICAgICAgdmFsdWUuICAqLwotICAgICAgc2hpZnQgPSAxNzsKLSAgICAgIGRvCi0gICAgICAgewotCSB1bnNpZ25lZCBsb25nIGhpbWFzaywgbG9tYXNrOwotCi0JIGlmIChzaGlmdCA8IDMyKQotCSAgIHsKLQkgICAgIGhpbWFzayA9IDB4ZmZmZiA+PiAoMzIgLSBzaGlmdCk7Ci0JICAgICBsb21hc2sgPSAoMHhmZmZmIDw8IHNoaWZ0KSAmIDB4ZmZmZmZmZmY7Ci0JICAgfQotCSBlbHNlCi0JICAgewotCSAgICAgaGltYXNrID0gMHhmZmZmIDw8IChzaGlmdCAtIDMyKTsKLQkgICAgIGxvbWFzayA9IDA7Ci0JICAgfQotCSBpZiAoKGhpMzIuWF9hZGRfbnVtYmVyICYgfiAob2Zmc2V0VCkgaGltYXNrKSA9PSAwCi0JICAgICAmJiAobG8zMi5YX2FkZF9udW1iZXIgJiB+IChvZmZzZXRUKSBsb21hc2spID09IDApCi0JICAgewotCSAgICAgZXhwcmVzc2lvblMgdG1wOwotCi0JICAgICB0bXAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICBpZiAoc2hpZnQgPCAzMikKLQkgICAgICAgdG1wLlhfYWRkX251bWJlciA9ICgoaGkzMi5YX2FkZF9udW1iZXIgPDwgKDMyIC0gc2hpZnQpKQotCQkJCSAgIHwgKGxvMzIuWF9hZGRfbnVtYmVyID4+IHNoaWZ0KSk7Ci0JICAgICBlbHNlCi0JICAgICAgIHRtcC5YX2FkZF9udW1iZXIgPSBoaTMyLlhfYWRkX251bWJlciA+PiAoc2hpZnQgLSAzMik7Ci0JICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJnRtcCwgIm9yaSIsICJ0LHIsaSIsIHJlZywgMCwKLQkJCSAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0JCQkgIChzaGlmdCA+PSAzMikgPyAiZHNsbDMyIiA6ICJkc2xsIiwKLQkJCSAgImQsdyw8IiwgcmVnLCByZWcsCi0JCQkgIChzaGlmdCA+PSAzMikgPyBzaGlmdCAtIDMyIDogc2hpZnQpOwotCSAgICAgcmV0dXJuOwotCSAgIH0KLSAgICAgICAgIHNoaWZ0Kys7Ci0gICAgICAgfSB3aGlsZSAoc2hpZnQgPD0gKDY0IC0gMTYpKTsKLQotICAgICAgLyogRmluZCB0aGUgYml0IG51bWJlciBvZiB0aGUgbG93ZXN0IG9uZSBiaXQsIGFuZCBzdG9yZSB0aGUKLSAgICAgICAgIHNoaWZ0ZWQgdmFsdWUgaW4gaGkvbG8uICAqLwotICAgICAgaGkgPSAodW5zaWduZWQgbG9uZykgKGhpMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmZmZmZik7Ci0gICAgICBsbyA9ICh1bnNpZ25lZCBsb25nKSAobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmZmZmZmKTsKLSAgICAgIGlmIChsbyAhPSAwKQotCXsKLQkgIGJpdCA9IDA7Ci0JICB3aGlsZSAoKGxvICYgMSkgPT0gMCkKLQkgICAgewotCSAgICAgIGxvID4+PSAxOwotCSAgICAgICsrYml0OwotCSAgICB9Ci0JICBsbyB8PSAoaGkgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IGJpdCkgLSAxKSkgPDwgKDMyIC0gYml0KTsKLQkgIGhpID4+PSBiaXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJpdCA9IDMyOwotCSAgd2hpbGUgKChoaSAmIDEpID09IDApCi0JICAgIHsKLQkgICAgICBoaSA+Pj0gMTsKLQkgICAgICArK2JpdDsKLQkgICAgfQotCSAgbG8gPSBoaTsKLQkgIGhpID0gMDsKLQl9Ci0KLSAgICAgIC8qIE9wdGltaXplIGlmIHRoZSBzaGlmdGVkIHZhbHVlIGlzIGEgKHBvd2VyIG9mIDIpIC0gMS4gICovCi0gICAgICBpZiAoKGhpID09IDAgJiYgKChsbyArIDEpICYgbG8pID09IDApCi0JICB8fCAobG8gPT0gMHhmZmZmZmZmZiAmJiAoKGhpICsgMSkgJiBoaSkgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzaGlmdCA9IENPVU5UX1RPUF9aRVJPRVMgKCh1bnNpZ25lZCBpbnQpIGhpMzIuWF9hZGRfbnVtYmVyKTsKLQkgIGlmIChzaGlmdCAhPSAwKQotICAgICAgICAgICAgewotCSAgICAgIGV4cHJlc3Npb25TIHRtcDsKLQotCSAgICAgIC8qIFRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCBzZXQgdGhlIHJlZ2lzdGVyIHRvIGJlIGFsbAotICAgICAgICAgICAgICAgICBvbmVzLiAgKi8KLSAgICAgICAgICAgICAgdG1wLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgICAgICAgICB0bXAuWF9hZGRfbnVtYmVyID0gKG9mZnNldFQpIC0xOwotICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJnRtcCwgImFkZGl1IiwgInQscixqIiwKLQkJCSAgIHJlZywgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgICAgICAgICBpZiAoYml0ICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYml0ICs9IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCA+PSAzMikgPyAiZHNsbDMyIiA6ICJkc2xsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZCx3LDwiLCByZWcsIHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0ID49IDMyKSA/IGJpdCAtIDMyIDogYml0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAotCQkJICAgKHNoaWZ0ID49IDMyKSA/ICJkc3JsMzIiIDogImRzcmwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImQsdyw8IiwgcmVnLCByZWcsCi0JCQkgICAoc2hpZnQgPj0gMzIpID8gc2hpZnQgLSAzMiA6IHNoaWZ0KTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qIFNpZ24gZXh0ZW5kIGhpMzIgYmVmb3JlIGNhbGxpbmcgbG9hZF9yZWdpc3RlciwgYmVjYXVzZSB3ZSBjYW4KLSAgICAgICAgIGdlbmVyYWxseSBnZXQgYmV0dGVyIGNvZGUgd2hlbiB3ZSBsb2FkIGEgc2lnbiBleHRlbmRlZCB2YWx1ZS4gICovCi0gICAgICBpZiAoKGhpMzIuWF9hZGRfbnVtYmVyICYgMHg4MDAwMDAwMCkgIT0gMCkKLQloaTMyLlhfYWRkX251bWJlciB8PSB+IChvZmZzZXRUKSAweGZmZmZmZmZmOwotICAgICAgbG9hZF9yZWdpc3RlciAoY291bnRlciwgcmVnLCAmaGkzMiwgMCk7Ci0gICAgICBmcmVnID0gcmVnOwotICAgIH0KLSAgaWYgKChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZjAwMDApID09IDApCi0gICAgewotICAgICAgaWYgKGZyZWcgIT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzbGwzMiIsICJkLHcsPCIsIHJlZywKLQkJICAgICAgIGZyZWcsIDApOwotCSAgZnJlZyA9IHJlZzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgbWlkMTY7Ci0KLSAgICAgIGlmICgoZnJlZyA9PSAwKSAmJiAobG8zMi5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0gICAgICAgIHsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgImx1aSIsICJ0LHUiLCByZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7Ci0gICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc3JsMzIiLCAiZCx3LDwiLCByZWcsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZywgMCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChmcmVnICE9IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc2xsIiwgImQsdyw8IiwgcmVnLAotCQkgICAgICAgZnJlZywgMTYpOwotCSAgZnJlZyA9IHJlZzsKLQl9Ci0gICAgICBtaWQxNiA9IGxvMzI7Ci0gICAgICBtaWQxNi5YX2FkZF9udW1iZXIgPj49IDE2OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZtaWQxNiwgIm9yaSIsICJ0LHIsaSIsIHJlZywKLQkJICAgZnJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc2xsIiwgImQsdyw8IiwgcmVnLAotCQkgICByZWcsIDE2KTsKLSAgICAgIGZyZWcgPSByZWc7Ci0gICAgfQotICBpZiAoKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmKSAhPSAwKQotICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgIm9yaSIsICJ0LHIsaSIsIHJlZywgZnJlZywKLQkJIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLX0KLQotLyogTG9hZCBhbiBhZGRyZXNzIGludG8gYSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyB2b2lkCi1sb2FkX2FkZHJlc3MgKGNvdW50ZXIsIHJlZywgZXApCi0gICAgIGludCAqY291bnRlcjsKLSAgICAgaW50IHJlZzsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotewotICBjaGFyICpwOwotCi0gIGlmIChlcC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICAmJiBlcC0+WF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0gICAgICBlcC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotCi0gIGlmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIHJlZywgZXAsIDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICBhZGRpdQkkcmVnLCRncCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSBPdGhlcndpc2Ugd2Ugd2FudAotCSAgIGx1aQkJJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHdlIGhhdmUgYW4gYWRkZW5kLCB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgZm9ybS4gICovCi0gICAgICBpZiAoKHZhbHVlVCkgZXAtPlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0gICAgICAgICAgfHwgbm9waWNfbmVlZF9yZWxheCAoZXAtPlhfYWRkX3N5bWJvbCwgMSkpCi0JcCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ19ncm93ICgyMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgcmVnLCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMCwKLQkJCVJFTEFYX0VOQ09ERSAoNCwgOCwgMCwgNCwgMCwKLQkJCQkgICAgICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAotCQkJZXAtPlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgY291bnRlciwgZXAsIHJlZyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotCXAgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgIH0KLSAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgZXg7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgbHcJCSRyZWcsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSBPdGhlcndpc2Ugd2Ugd2FudAotCSAgIGx3CQkkcmVnLDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICBub3AKLQkgICBhZGRpdQkkcmVnLCRyZWcsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgaXQgbXVzdCBiZSBhZGRlZCBpbiBhZnRlci4gICovCi0gICAgICBleC5YX2FkZF9udW1iZXIgPSBlcC0+WF9hZGRfbnVtYmVyOwotICAgICAgZXAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBmcmFnX2dyb3cgKDIwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgPyAibHciIDogImxkIiksCi0JCSAgICJ0LG8oYikiLCByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAwLAotCQkgICAgUkVMQVhfRU5DT0RFICgwLCA0LCAtOCwgMCwgMCwgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zKSwKLQkJICAgIGVwLT5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgaWYgKGV4LlhfYWRkX251bWJlciAhPSAwKQotCXsKLQkgIGlmIChleC5YX2FkZF9udW1iZXIgPCAtMHg4MDAwIHx8IGV4LlhfYWRkX251bWJlciA+PSAweDgwMDApCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmV4LAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBleDsKLSAgICAgIGludCBvZmY7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGxhcmdlIEdPVCBjYXNlLiAgSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbgotCSBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICBsdWkJCSRyZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICBhZGR1CQkkcmVnLCRyZWcsJGdwCi0JICAgbHcJCSRyZWcsPHN5bT4oJHJlZykJKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSBPdGhlcndpc2UsIGZvciBhIHJlZmVyZW5jZSB0byBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgIGx3CQkkcmVnLDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICBub3AKLQkgICBhZGRpdQkkcmVnLCRyZWcsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgaXQgbXVzdCBiZSBhZGRlZCBpbiBhZnRlci4gICovCi0gICAgICBleC5YX2FkZF9udW1iZXIgPSBlcC0+WF9hZGRfbnVtYmVyOwotICAgICAgZXAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0Jb2ZmID0gNDsKLSAgICAgIGVsc2UKLQlvZmYgPSAwOwotICAgICAgZnJhZ19ncm93ICgzMik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJsdWkiLCAidCx1IiwgcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICJkLHYsdCIsIHJlZywgcmVnLCBHUCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAidCxvKGIpIiwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgcmVnKTsKLSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgb2ZmLCAwLAotCQkgICAgUkVMQVhfRU5DT0RFICgxMiwgMTIgKyBvZmYsIG9mZiwgOCArIG9mZiwgMCwKLQkJCQkgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCSAgICBlcC0+WF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBpZiAob2ZmID4gMCkKLQl7Ci0JICAvKiBXZSBuZWVkIGEgbm9wIGJlZm9yZSBsb2FkaW5nIGZyb20gJGdwLiAgVGhpcyBzcGVjaWFsCi0gICAgICAgICAgICAgY2hlY2sgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgbHVpIHdoaWNoIHN0YXJ0cyB0aGUgbWFpbgotICAgICAgICAgICAgIGluc3RydWN0aW9uIHN0cmVhbSBkb2VzIG5vdCByZWZlciB0byAkZ3AsIGFuZCBzbyB3aWxsIG5vdAotICAgICAgICAgICAgIGluc2VydCB0aGUgbm9wIHdoaWNoIG1heSBiZSByZXF1aXJlZC4gICovCi0JICBtYWNyb19idWlsZCAocCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBwICs9IDQ7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgInQsbyhiKSIsIHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgaWYgKGV4LlhfYWRkX251bWJlciAhPSAwKQotCXsKLQkgIGlmIChleC5YX2FkZF9udW1iZXIgPCAtMHg4MDAwIHx8IGV4LlhfYWRkX251bWJlciA+PSAweDgwMDApCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmV4LAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotICAgIHsKLSAgICAgIC8qIFdlIGFsd2F5cyBkbwotCSAgIGFkZGl1CSRyZWcsJGdwLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICovCi0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotfQotCi0vKgotICoJCQlCdWlsZCBtYWNyb3MKLSAqICAgVGhpcyByb3V0aW5lIGltcGxlbWVudHMgdGhlIHNlZW1pbmdseSBlbmRsZXNzIG1hY3JvIG9yIHN5bnRoZXNpemVkCi0gKiBpbnN0cnVjdGlvbnMgYW5kIGFkZHJlc3NpbmcgbW9kZXMgaW4gdGhlIG1pcHMgYXNzZW1ibHkgbGFuZ3VhZ2UuIE1hbnkKLSAqIG9mIHRoZXNlIG1hY3JvcyBhcmUgc2ltcGxlIGFuZCBhcmUgc2ltaWxhciB0byBlYWNoIG90aGVyLiBUaGVzZSBjb3VsZAotICogcHJvYmFibHkgYmUgaGFuZGxlZCBieSBzb21lIGtpbmQgb2YgdGFibGUgb3IgZ3JhbW1lciBhcHJvYWNoIGluc3RlYWQgb2YKLSAqIHRoaXMgdmVyYm9zZSBtZXRob2QuIE90aGVycyBhcmUgbm90IHNpbXBsZSBtYWNyb3MgYnV0IGFyZSBtb3JlIGxpa2UKLSAqIG9wdGltaXppbmcgY29kZSBnZW5lcmF0aW9uLgotICogICBPbmUgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9uIGlzIHdoZW4gc2V2ZXJhbCBzdG9yZSBtYWNyb3MgYXBwZWFyCi0gKiBjb25zZWN1dGl2bHkgdGhhdCB3b3VsZCBsb2FkIEFUIHdpdGggdGhlIHVwcGVyIGhhbGYgb2YgdGhlIHNhbWUgYWRkcmVzcy4KLSAqIFRoZSBlbnN1aW5nIGxvYWQgdXBwZXIgaW5zdHJ1Y3Rpb25zIGFyZSBvbW1pdGVkLiBUaGlzIGltcGxpZXMgc29tZSBraW5kCi0gKiBvZiBnbG9iYWwgb3B0aW1pemF0aW9uLiBXZSBjdXJyZW50bHkgb25seSBvcHRpbWl6ZSB3aXRoaW4gYSBzaW5nbGUgbWFjcm8uCi0gKiAgIEZvciBtYW55IG9mIHRoZSBsb2FkIGFuZCBzdG9yZSBtYWNyb3MgaWYgdGhlIGFkZHJlc3MgaXMgc3BlY2lmaWVkIGFzIGEKLSAqIGNvbnN0YW50IGV4cHJlc3Npb24gaW4gdGhlIGZpcnN0IDY0ayBvZiBtZW1vcnkgKGllIGxkICQyLDB4NDAwMGMpIHdlCi0gKiBmaXJzdCBsb2FkIHJlZ2lzdGVyICdhdCcgd2l0aCB6ZXJvIGFuZCB1c2UgaXQgYXMgdGhlIGJhc2UgcmVnaXN0ZXIuIFRoZQotICogbWlwcyBhc3NlbWJsZXIgc2ltcGx5IHVzZXMgcmVnaXN0ZXIgJHplcm8uIEp1c3Qgb25lIHRpbnkgb3B0aW1pemF0aW9uCi0gKiB3ZSdyZSBtaXNzaW5nLgotICovCi1zdGF0aWMgdm9pZAotbWFjcm8gKGlwKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRyZWcsIHNyZWcsIGRyZWcsIGJyZWc7Ci0gIGludCB0ZW1wcmVnOwotICBpbnQgbWFzazsKLSAgaW50IGljbnQgPSAwOwotICBpbnQgdXNlZF9hdDsKLSAgZXhwcmVzc2lvblMgZXhwcjE7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKnMyOwotICBjb25zdCBjaGFyICpmbXQ7Ci0gIGludCBsaWtlbHkgPSAwOwotICBpbnQgZGJsID0gMDsKLSAgaW50IGNvcHJvYyA9IDA7Ci0gIGludCBsciA9IDA7Ci0gIGludCBpbW0gPSAwOwotICBvZmZzZXRUIG1heG51bTsKLSAgaW50IG9mZjsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0gIGNoYXIgKnA7Ci0gIGludCBob2xkX21pcHNfb3B0aW1pemU7Ci0KLSAgYXNzZXJ0ICghIG1pcHNfb3B0cy5taXBzMTYpOwotCi0gIHRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDE2KSAmIDB4MWY7Ci0gIGRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDExKSAmIDB4MWY7Ci0gIHNyZWcgPSBicmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAyMSkgJiAweDFmOwotICBtYXNrID0gaXAtPmluc25fbW8tPm1hc2s7Ci0KLSAgZXhwcjEuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHIxLlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLQotICBzd2l0Y2ggKG1hc2spCi0gICAgewotICAgIGNhc2UgTV9EQUJTOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fQUJTOgotICAgICAgLyogYmdleiAkYTAsLisxMgotCSBtb3ZlIHYwLCRhMAotCSBzdWIgdjAsJHplcm8sJGEwCi0JICovCi0KLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLQotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYmdleiIsICJzLHAiLCBzcmVnKTsKLSAgICAgIGlmIChkcmVnID09IHNyZWcpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotICAgICAgZWxzZQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgc3JlZywgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkc3ViIiA6ICJzdWIiLAotCQkgICAiZCx2LHQiLCBkcmVnLCAwLCBzcmVnKTsKLQotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX0FERF9JOgotICAgICAgcyA9ICJhZGRpIjsKLSAgICAgIHMyID0gImFkZCI7Ci0gICAgICBnb3RvIGRvX2FkZGk7Ci0gICAgY2FzZSBNX0FERFVfSToKLSAgICAgIHMgPSAiYWRkaXUiOwotICAgICAgczIgPSAiYWRkdSI7Ci0gICAgICBnb3RvIGRvX2FkZGk7Ci0gICAgY2FzZSBNX0RBRERfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRhZGRpIjsKLSAgICAgIHMyID0gImRhZGQiOwotICAgICAgZ290byBkb19hZGRpOwotICAgIGNhc2UgTV9EQUREVV9JOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGFkZGl1IjsKLSAgICAgIHMyID0gImRhZGR1IjsKLSAgICBkb19hZGRpOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgcywgInQscixqIiwgdHJlZywgc3JlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkLHYsdCIsIHRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0FORF9JOgotICAgICAgcyA9ICJhbmRpIjsKLSAgICAgIHMyID0gImFuZCI7Ci0gICAgICBnb3RvIGRvX2JpdDsKLSAgICBjYXNlIE1fT1JfSToKLSAgICAgIHMgPSAib3JpIjsKLSAgICAgIHMyID0gIm9yIjsKLSAgICAgIGdvdG8gZG9fYml0OwotICAgIGNhc2UgTV9OT1JfSToKLSAgICAgIHMgPSAiIjsKLSAgICAgIHMyID0gIm5vciI7Ci0gICAgICBnb3RvIGRvX2JpdDsKLSAgICBjYXNlIE1fWE9SX0k6Ci0gICAgICBzID0gInhvcmkiOwotICAgICAgczIgPSAieG9yIjsKLSAgICBkb19iaXQ6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBpZiAobWFzayAhPSBNX05PUl9JKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgcywgInQscixpIiwgdHJlZywKLQkJCSBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgIm9yaSIsICJ0LHIsaSIsCi0JCQkgICB0cmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9yIiwgImQsdix0IiwKLQkJCSAgIHRyZWcsIHRyZWcsIDApOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCx2LHQiLCB0cmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CRVFfSToKLSAgICAgIHMgPSAiYmVxIjsKLSAgICAgIGdvdG8gYmVxX2k7Ci0gICAgY2FzZSBNX0JFUUxfSToKLSAgICAgIHMgPSAiYmVxbCI7Ci0gICAgICBsaWtlbHkgPSAxOwotICAgICAgZ290byBiZXFfaTsKLSAgICBjYXNlIE1fQk5FX0k6Ci0gICAgICBzID0gImJuZSI7Ci0gICAgICBnb3RvIGJlcV9pOwotICAgIGNhc2UgTV9CTkVMX0k6Ci0gICAgICBzID0gImJuZWwiOwotICAgICAgbGlrZWx5ID0gMTsKLSAgICBiZXFfaToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJzLHQscCIsIHNyZWcsCi0JCSAgICAgICAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInMsdCxwIiwgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdFTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHRToKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmdlemwiIDogImJnZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmxlemwiIDogImJsZXoiLAotCQkgICAgICAgInMscCIsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIEFULCBzcmVnLCB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdUTF9JOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdUX0k6Ci0gICAgICAvKiBjaGVjayBmb3IgPiBtYXggaW50ZWdlciAqLwotICAgICAgbWF4bnVtID0gMHg3ZmZmZmZmZjsKLSAgICAgIGlmIChJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gbWF4bnVtCi0JICAmJiAoISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpIHx8IHNpemVvZiAobWF4bnVtKSA+IDQpKQotCXsKLQlkb19mYWxzZToKLQkgIC8qIHJlc3VsdCBpcyBhbHdheXMgZmFsc2UgKi8KLQkgIGlmICghIGxpa2VseSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIkJyYW5jaCAlcyBpcyBhbHdheXMgZmFsc2UgKG5vcCkiKSwgaXAtPmluc25fbW8tPm5hbWUpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiQnJhbmNoIGxpa2VseSAlcyBpcyBhbHdheXMgZmFsc2UiKSwgaXAtPmluc25fbW8tPm5hbWUpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiYm5lbCIsCi0JCQkgICAicyx0LHAiLCAwLCAwKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIE1fQkdFX0k6Ci0gICAgY2FzZSBNX0JHRUxfSToKLSAgICAgIGlmIChtYXNrID09IE1fQkdFTF9JKQotCWxpa2VseSA9IDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJnZXpsIiA6ICJiZ2V6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJndHpsIiA6ICJiZ3R6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYXhudW0gPSAweDdmZmZmZmZmOwotICAgICAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkgJiYgc2l6ZW9mIChtYXhudW0pID4gNCkKLQl7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCX0KLSAgICAgIG1heG51bSA9IC0gbWF4bnVtIC0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8PSBtYXhudW0KLQkgICYmICghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JewotCWRvX3RydWU6Ci0JICAvKiByZXN1bHQgaXMgYWx3YXlzIHRydWUgKi8KLQkgIGFzX3dhcm4gKF8oIkJyYW5jaCAlcyBpcyBhbHdheXMgdHJ1ZSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImIiLCAicCIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR0VVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHRVU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgICAgICJzLHQscCIsIDAsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVFVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR1RVX0k6Ci0gICAgICBpZiAoc3JlZyA9PSAwCi0JICB8fCAoISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpCi0JICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDB4ZmZmZmZmZmYpKQotCWdvdG8gZG9fZmFsc2U7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIrKzsKLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBNX0JHRVVfSToKLSAgICBjYXNlIE1fQkdFVUxfSToKLSAgICAgIGlmIChtYXNrID09IE1fQkdFVUxfSSkKLQlsaWtlbHkgPSAxOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQlnb3RvIGRvX3RydWU7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzZXRfYXQgKCZpY250LCBzcmVnLCAxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdUTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVDoKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmd0emwiIDogImJndHoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmx0emwiIDogImJsdHoiLAotCQkgICAgICAgInMscCIsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIEFULCB0cmVnLCBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdUVUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR1RVOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAgICAgInMsdCxwIiwgc3JlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQlnb3RvIGRvX2ZhbHNlOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIEFULCB0cmVnLAotCQkgICBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkxFTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMRToKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmxlemwiIDogImJsZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmdlemwiIDogImJnZXoiLAotCQkgICAgICAgInMscCIsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIEFULCB0cmVnLCBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkxFTF9JOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxFX0k6Ci0gICAgICBtYXhudW0gPSAweDdmZmZmZmZmOwotICAgICAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkgJiYgc2l6ZW9mIChtYXhudW0pID4gNCkKLQl7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSBtYXhudW0KLQkgICYmICghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CTFRfSToKLSAgICBjYXNlIE1fQkxUTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CTFRMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmx0emwiIDogImJsdHoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmxlemwiIDogImJsZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMRVU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgdHJlZywKLQkJICAgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRVVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEVVX0k6Ci0gICAgICBpZiAoc3JlZyA9PSAwCi0JICB8fCAoISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpCi0JICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDB4ZmZmZmZmZmYpKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIE1fQkxUVV9JOgotICAgIGNhc2UgTV9CTFRVTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CTFRVTF9JKQotCWxpa2VseSA9IDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCWdvdG8gZG9fZmFsc2U7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzZXRfYXQgKCZpY250LCBzcmVnLCAxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkxUTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMVDoKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmx0emwiIDogImJsdHoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmd0emwiIDogImJndHoiLAotCQkgICAgICAgInMscCIsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIEFULCBzcmVnLCB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkxUVUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTFRVOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQlnb3RvIGRvX2ZhbHNlOwotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAgICAgInMsdCxwIiwgMCwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIEFULCBzcmVnLAotCQkgICB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRERJVl8zOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fRElWXzM6Ci0gICAgICBzID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXYzOwotICAgIGNhc2UgTV9EUkVNXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9SRU1fMzoKLSAgICAgIHMgPSAibWZoaSI7Ci0gICAgZG9fZGl2MzoKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgYXNfd2FybiAoXygiRGl2aWRlIGJ5IHplcm8uIikpOwotCSAgaWYgKG1pcHNfdHJhcCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIDAsIDApOwotCSAgZWxzZQotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIGlmIChtaXBzX3RyYXApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIHRyZWcsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICAgICAgZGJsID8gImRkaXYiIDogImRpdiIsCi0JCSAgICAgICAieixzLHQiLCBzcmVnLCB0cmVnKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgdHJlZywgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgICAgICBkYmwgPyAiZGRpdiIgOiAiZGl2IiwKLQkJICAgICAgICJ6LHMsdCIsIHNyZWcsIHRyZWcpOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNyk7Ci0JfQotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gLTE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJICAgZGJsID8gImRhZGRpdSIgOiAiYWRkaXUiLAotCQkgICAidCxyLGoiLCBBVCwgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gbWlwc190cmFwID8gKGRibCA/IDEyIDogOCkgOiAoZGJsID8gMjAgOiAxNik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZSIsICJzLHQscCIsIHRyZWcsIEFUKTsKLSAgICAgIGlmIChkYmwpCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiZGFkZGl1IiwgInQscixqIiwgQVQsIDAsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJkc2xsMzIiLCAiZCx3LDwiLCBBVCwgQVQsCi0JCSAgICAgICAzMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDB4ODAwMDAwMDA7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImx1aSIsICJ0LHUiLCBBVCwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKLQl9Ci0gICAgICBpZiAobWlwc190cmFwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCBzcmVnLCBBVCk7Ci0JICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KLQkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KLQkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgc3JlZywgQVQpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCi0JICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KLQkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KLQkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNik7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRElWXzNJOgotICAgICAgcyA9ICJkaXYiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RJVlVfM0k6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX1JFTV8zSToKLSAgICAgIHMgPSAiZGl2IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9SRU1VXzNJOgotICAgICAgcyA9ICJkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9ERElWXzNJOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGRpdiI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRERJVlVfM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRFJFTV8zSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRkaXYiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RSRU1VXzNJOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgZG9fZGl2aToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgYXNfd2FybiAoXygiRGl2aWRlIGJ5IHplcm8uIikpOwotCSAgaWYgKG1pcHNfdHJhcCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIDAsIDApOwotCSAgZWxzZQotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQotCXsKLQkgIGlmIChzdHJjbXAgKHMyLCAibWZsbyIpID09IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywKLQkJCSBzcmVnKTsKLQkgIGVsc2UKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gLTEKLQkgICYmIHNbc3RybGVuIChzKSAtIDFdICE9ICd1JykKLQl7Ci0JICBpZiAoc3RyY21wIChzMiwgIm1mbG8iKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKGRibCkKLQkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiZG5lZyIsICJkLHciLCBkcmVnLAotCQkJICAgICBzcmVnKTsKLQkgICAgICBlbHNlCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5lZyIsICJkLHciLCBkcmVnLAotCQkJICAgICBzcmVnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ6LHMsdCIsIHNyZWcsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkIiwgZHJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ESVZVXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9SRU1VXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9ERElWVV8zOgotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RSRU1VXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgIGRvX2RpdnUzOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgaWYgKG1pcHNfdHJhcCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgdHJlZywgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ6LHMsdCIsIHNyZWcsIHRyZWcpOwotCSAgLyogV2Ugd2FudCB0byBjbG9zZSB0aGUgbm9yZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUsIHNvCi0JICAgICB0aGF0IGxhdGVyIGluc25zIGFyZSBhdmFpbGFibGUgZm9yIGRlbGF5IHNsb3QgZmlsbGluZy4gICovCi0JICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZSIsICJzLHQscCIsIHRyZWcsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAieixzLHQiLCBzcmVnLCB0cmVnKTsKLQotCSAgLyogV2Ugd2FudCB0byBjbG9zZSB0aGUgbm9yZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUsIHNvCi0JICAgICB0aGF0IGxhdGVyIGluc25zIGFyZSBhdmFpbGFibGUgZm9yIGRlbGF5IHNsb3QgZmlsbGluZy4gICovCi0JICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCIsIGRyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX0RMQV9BQjoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX0xBX0FCOgotICAgICAgLyogTG9hZCB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCBpbnRvIGEgcmVnaXN0ZXIuICBJZiBicmVnIGlzIG5vdAotCSB6ZXJvLCB3ZSB0aGVuIGFkZCBhIGJhc2UgcmVnaXN0ZXIgdG8gaXQuICAqLwotCi0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHdlIHBlcm1pdCBleHByZXNzaW9ucyBvZgotCSB0aGUgZm9ybQotCSAgIGxhCSQ0LGZvby1iYXIKLQkgd2hlcmUgYmFyIGlzIGFuIGFkZHJlc3MgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBUaGVzZSBhcmUgdXNlZAotCSB3aGVuIGdldHRpbmcgdGhlIGFkZHJlc3NlcyBvZiBmdW5jdGlvbnMuICBXZSBkb24ndCBwZXJtaXQKLQkgWF9hZGRfbnVtYmVyIHRvIGJlIG5vbi16ZXJvLCBiZWNhdXNlIGlmIHRoZSBzeW1ib2wgaXMKLQkgZXh0ZXJuYWwgdGhlIHJlbGF4aW5nIGNvZGUgbmVlZHMgdG8ga25vdyB0aGF0IGFueSBhZGRlbmQgaXMKLQkgcHVyZWx5IHRoZSBvZmZzZXQgdG8gWF9vcF9zeW1ib2wuICAqLwotICAgICAgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotCSAgJiYgb2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N1YnRyYWN0Ci0JICAmJiBub3dfc2VnID09IHRleHRfc2VjdGlvbgotCSAgJiYgKHN5bWJvbF9jb25zdGFudF9wIChvZmZzZXRfZXhwci5YX29wX3N5bWJvbCkKLQkgICAgICA/IFNfR0VUX1NFR01FTlQgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKSA9PSB0ZXh0X3NlY3Rpb24KLQkgICAgICA6IChzeW1ib2xfZXF1YXRlZF9wIChvZmZzZXRfZXhwci5YX29wX3N5bWJvbCkKLQkJICYmIChTX0dFVF9TRUdNRU5UCi0JCSAgICAgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JCSAgICAgIC0+WF9hZGRfc3ltYm9sKQotCQkgICAgID09IHRleHRfc2VjdGlvbikpKQotCSAgJiYgYnJlZyA9PSAwCi0JICAmJiBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCB0cmVnLCB0cmVnLCAoaW50KSBCRkRfUkVMT0NfUENSRUxfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX3N5bWJvbAotCSAgJiYgb2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCX0KLQotICAgICAgaWYgKHRyZWcgPT0gYnJlZykKLQl7Ci0JICB0ZW1wcmVnID0gQVQ7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdGVtcHJlZyA9IHRyZWc7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0KLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JbG9hZF9yZWdpc3RlciAoJmljbnQsIHRlbXByZWcsICZvZmZzZXRfZXhwciwgZGJsKTsKLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkZ3AsPHN5bT4JKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPHN5bT4JKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgSWYgd2UgaGF2ZSBhIGNvbnN0YW50LCB3ZSBuZWVkIHR3byBpbnN0cnVjdGlvbnMgYW55aG93LAotCSAgICAgc28gd2UgbWF5IGFzIHdlbGwgYWx3YXlzIHVzZSB0aGUgbGF0dGVyIGZvcm0uICAqLwotCSAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0JICAgICAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKLQkgICAgcCA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcmFnX2dyb3cgKDIwKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIAkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCB0ZW1wcmVnLCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICg0LCA4LCAwLCA0LCAwLAotCQkJCQkgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCB0ZW1wcmVnKTsKLQkgIGlmIChwICE9IE5VTEwpCi0JICAgIHAgKz0gNDsKLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCBhbmQgdGhlcmUKLQkgICAgIGlzIG5vIGNvbnN0YW50LCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPHN5bT4JKEJGRF9SRUxPQ19MTzE2KQotCi0JICAgICBJZiB3ZSBoYXZlIGEgc21hbGwgY29uc3RhbnQsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0JICAgICBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8Y29uc3RhbnQ+Ci0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24KLQkgICAgIHNlcXVlbmNlLCBidXQgd2Ugb3V0cHV0IGEgQkZEX1JFTE9DX0xPMTYgcmVsb2Mgb24gdGhlCi0JICAgICBhZGRpdSBpbnN0cnVjdGlvbi4KLQotCSAgICAgSWYgd2UgaGF2ZSBhIGxhcmdlIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBsdWkJJGF0LDxoaWNvbnN0YW50PgotCSAgICAgICBhZGRpdQkkYXQsJGF0LDxsb2NvbnN0YW50PgotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRhdAotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50IHRoZSBzYW1lIGluc3RydWN0aW9uCi0JICAgICBzZXF1ZW5jZSwgYnV0IHdlIG91dHB1dCBhIEJGRF9SRUxPQ19MTzE2IHJlbG9jIG9uIHRoZQotCSAgICAgYWRkaXUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGZyYWdfZ3JvdyAoMzIpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgaW50IG9mZjsKLQotCSAgICAgIGlmIChicmVnID09IDApCi0JCW9mZiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UncmUgZ29pbmcgdG8gcHV0IGluIGFuIGFkZHUgaW5zdHJ1Y3Rpb24gdXNpbmcKLQkJICAgICB0ZW1wcmVnLCBzbyB3ZSBtYXkgYXMgd2VsbCBpbnNlcnQgdGhlIG5vcCByaWdodAotCQkgICAgIG5vdy4gICovCi0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibm9wIiwgIiIpOwotCQkgIG9mZiA9IDQ7Ci0JCX0KLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4IC0gb2ZmLCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoMCwgOCAtIG9mZiwgLTQgLSBvZmYsIDQgLSBvZmYsIDAsCi0JCQkJCSAgKGJyZWcgPT0gMAotCQkJCQkgICA/IG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcwotCQkJCQkgICA6IDApKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCSAgICAgIGlmIChicmVnID09IDApCi0JCXsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCQkgIHAgKz0gNDsKLQkJfQotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgLyogRklYTUU6IElmIGJyZWcgPT0gMCwgYW5kIHRoZSBuZXh0IGluc3RydWN0aW9uIHVzZXMKLQkJICR0ZW1wcmVnLCB0aGVuIGlmIHRoaXMgdmFyaWFudCBjYXNlIGlzIHVzZWQgYW4gZXh0cmEKLQkJIG5vcCB3aWxsIGJlIGdlbmVyYXRlZC4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cHIxLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JCSAgICYmIGV4cHIxLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgKHZvaWQpIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMCwgMCwKLQkJCSAgICAgICBSRUxBWF9FTkNPREUgKDAsIDAsIC0xMiwgLTQsIDAsIDApLAotCQkJICAgICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBvZmYxOwotCi0JICAgICAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIGFkZCBpbiBhIGJhc2UgcmVnaXN0ZXIsIGFuZCB0aGUKLQkJIHRhcmdldCByZWdpc3RlciBhbmQgdGhlIGJhc2UgcmVnaXN0ZXIgYXJlIHRoZSBzYW1lLAotCQkgdGhlbiB3ZSBhcmUgdXNpbmcgQVQgYXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuICBTaW5jZQotCQkgd2Ugd2FudCB0byBsb2FkIHRoZSBjb25zdGFudCBpbnRvIEFULCB3ZSBhZGQgb3VyCi0JCSBjdXJyZW50IEFUIChmcm9tIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlKSBhbmQgdGhlCi0JCSByZWdpc3RlciBpbnRvIHRoZSByZWdpc3RlciBub3csIGFuZCBwcmV0ZW5kIHdlIHdlcmUKLQkJIG5vdCB1c2luZyBhIGJhc2UgcmVnaXN0ZXIuICAqLwotCSAgICAgIGlmIChicmVnICE9IHRyZWcpCi0JCW9mZjEgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCB0cmVnLCBBVCwgYnJlZyk7Ci0JCSAgYnJlZyA9IDA7Ci0JCSAgdGVtcHJlZyA9IHRyZWc7Ci0JCSAgb2ZmMSA9IC04OwotCQl9Ci0KLQkgICAgICAvKiBTZXQgbWlwc19vcHRpbWl6ZSBhcm91bmQgdGhlIGx1aSBpbnN0cnVjdGlvbiB0byBhdm9pZAotCQkgaW5zZXJ0aW5nIGFuIHVubmVjZXNzYXJ5IG5vcCBhZnRlciB0aGUgbHcuICAqLwotCSAgICAgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBBVCk7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCBBVCwgQVQsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgQVQpOwotCSAgICAgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDAsIDAsCi0JCQkgICAgICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTYgKyBvZmYxLCAtOCwgMCwgMCksCi0JCQkgICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICB1c2VkX2F0ID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIGludCBncGRlbDsKLQotCSAgLyogVGhpcyBpcyB0aGUgbGFyZ2UgR09UIGNhc2UuICBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wsIGFuZCB0aGVyZSBpcyBubyBjb25zdGFudCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQotCSAgICAgSWYgd2UgaGF2ZSBhIHNtYWxsIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRncAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkdGVtcHJlZykgKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PgotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PiAoQkZEX1JFTE9DX0xPMTYpCi0KLQkgICAgIElmIHdlIGhhdmUgYSBsYXJnZSBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4KLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4JKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRhdAotCSAgICAgKi8KLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBmcmFnX2dyb3cgKDUyKTsKLQkgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkgICAgZ3BkZWwgPSA0OwotCSAgZWxzZQotCSAgICBncGRlbCA9IDA7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGRibCA/ICJsZCIgOiAibHciLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAotCQkgICAgICAgdGVtcHJlZyk7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICBpbnQgb2ZmOwotCi0JICAgICAgaWYgKGJyZWcgPT0gMCkKLQkJb2ZmID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSdyZSBnb2luZyB0byBwdXQgaW4gYW4gYWRkdSBpbnN0cnVjdGlvbiB1c2luZwotCQkgICAgIHRlbXByZWcsIHNvIHdlIG1heSBhcyB3ZWxsIGluc2VydCB0aGUgbm9wIHJpZ2h0Ci0JCSAgICAgbm93LiAgKi8KLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICJub3AiLCAiIik7Ci0JCSAgb2ZmID0gNDsKLQkJfQotCi0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDEyICsgb2ZmLCAxMiArIGdwZGVsLCBncGRlbCwKLQkJCQkJICA4ICsgZ3BkZWwsIDAsCi0JCQkJCSAgKGJyZWcgPT0gMAotCQkJCQkgICA/IG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcwotCQkJCQkgICA6IDApKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlIGlmIChleHByMS5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCQkgICAmJiBleHByMS5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgIm5vcCIsICIiKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCi0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDIwLCAxMiArIGdwZGVsLCBncGRlbCwgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGFkaiwgZHJlZzsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBnb2luZyB0byBhZGQgaW4gYSBiYXNlIHJlZ2lzdGVyLCBhbmQgdGhlCi0JCSB0YXJnZXQgcmVnaXN0ZXIgYW5kIHRoZSBiYXNlIHJlZ2lzdGVyIGFyZSB0aGUgc2FtZSwKLQkJIHRoZW4gd2UgYXJlIHVzaW5nIEFUIGFzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiAgU2luY2UKLQkJIHdlIHdhbnQgdG8gbG9hZCB0aGUgY29uc3RhbnQgaW50byBBVCwgd2UgYWRkIG91cgotCQkgY3VycmVudCBBVCAoZnJvbSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSkgYW5kIHRoZQotCQkgcmVnaXN0ZXIgaW50byB0aGUgcmVnaXN0ZXIgbm93LCBhbmQgcHJldGVuZCB3ZSB3ZXJlCi0JCSBub3QgdXNpbmcgYSBiYXNlIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoYnJlZyAhPSB0cmVnKQotCQl7Ci0JCSAgYWRqID0gMDsKLQkJICBkcmVnID0gdGVtcHJlZzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzc2VydCAodGVtcHJlZyA9PSBBVCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibm9wIiwgIiIpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRyZWcsIEFULCBicmVnKTsKLQkJICBkcmVnID0gdHJlZzsKLQkJICBhZGogPSA4OwotCQl9Ci0KLQkgICAgICAvKiBTZXQgbWlwc19vcHRpbWl6ZSBhcm91bmQgdGhlIGx1aSBpbnN0cnVjdGlvbiB0byBhdm9pZAotCQkgaW5zZXJ0aW5nIGFuIHVubmVjZXNzYXJ5IG5vcCBhZnRlciB0aGUgbHcuICAqLwotCSAgICAgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBBVCk7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCBBVCwgQVQsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgZHJlZywgZHJlZywgQVQpOwotCi0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTYgKyBncGRlbCArIGFkaiwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDI0ICsgYWRqLCAxNiArIGdwZGVsICsgYWRqLCBncGRlbCwKLQkJCQkJICA4ICsgZ3BkZWwsIDAsCi0JCQkJCSAgKGJyZWcgPT0gMAotCQkJCQkgICA/IG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcwotCQkJCQkgICA6IDApKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCi0JICAgICAgdXNlZF9hdCA9IDE7Ci0JICAgIH0KLQotCSAgaWYgKGdwZGVsID4gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhpcyBpbnN0cnVjdGlvbiB1c2VzICRncCwgYnV0Ci0gICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvbiB0aGUgbWFpbiBzdHJlYW0gZG9lcyBub3QuICAqLwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGRibCA/ICJsZCIgOiAibHciLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBwICs9IDQ7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICAgICAmJiBleHByMS5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIC8qIEZJWE1FOiBJZiBhZGRfbnVtYmVyIGlzIDAsIGFuZCB0aGVyZSB3YXMgbm8gYmFzZQotICAgICAgICAgICAgICAgICByZWdpc3RlciwgdGhlIGV4dGVybmFsIHN5bWJvbCBjYXNlIGVuZGVkIHdpdGggYSBsb2FkLAotICAgICAgICAgICAgICAgICBzbyBpZiB0aGUgc3ltYm9sIHR1cm5zIG91dCB0byBub3QgYmUgZXh0ZXJuYWwsIGFuZAotICAgICAgICAgICAgICAgICB0aGUgbmV4dCBpbnN0cnVjdGlvbiB1c2VzIHRlbXByZWcsIGFuIHVubmVjZXNzYXJ5IG5vcAotICAgICAgICAgICAgICAgICB3aWxsIGJlIGluc2VydGVkLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGJyZWcgPT0gdHJlZykKLQkJewotCQkgIC8qIFdlIG11c3QgYWRkIGluIHRoZSBiYXNlIHJlZ2lzdGVyIG5vdywgYXMgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBzeW1ib2wgY2FzZS4gICovCi0JCSAgYXNzZXJ0ICh0ZW1wcmVnID09IEFUKTsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCQkgIHAgKz0gNDsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCB0cmVnLCBBVCwgYnJlZyk7Ci0JCSAgcCArPSA0OwotCQkgIHRlbXByZWcgPSB0cmVnOwotCQkgIC8qIFdlIHNldCBicmVnIHRvIDAgYmVjYXVzZSB3ZSBoYXZlIGFycmFuZ2VkIHRvIGFkZAotICAgICAgICAgICAgICAgICAgICAgaXQgaW4gaW4gYm90aCBjYXNlcy4gICovCi0JCSAgYnJlZyA9IDA7Ci0JCX0KLQotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZleHByMSwgQVQpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBBVCk7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIC8qIFdlIHVzZQotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkZ3AsPHN5bT4JKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCB0cmVnLCB0ZW1wcmVnLCBicmVnKTsKLQotICAgICAgaWYgKCEgdXNlZF9hdCkKLQlyZXR1cm47Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0pfQToKLSAgICAgIC8qIFRoZSBqIGluc3RydWN0aW9uIG1heSBub3QgYmUgdXNlZCBpbiBQSUMgY29kZSwgc2luY2UgaXQKLQkgcmVxdWlyZXMgYW4gYWJzb2x1dGUgYWRkcmVzcy4gIFdlIGNvbnZlcnQgaXQgdG8gYSBiCi0JIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJqIiwgImEiKTsKLSAgICAgIGVsc2UKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImIiLCAicCIpOwotICAgICAgcmV0dXJuOwotCi0gICAgICAvKiBUaGUgamFsIGluc3RydWN0aW9ucyBtdXN0IGJlIGhhbmRsZWQgYXMgbWFjcm9zIGJlY2F1c2Ugd2hlbgotCSBnZW5lcmF0aW5nIFBJQyBjb2RlIHRoZXkgZXhwYW5kIHRvIG11bHRpLWluc3RydWN0aW9uCi0JIHNlcXVlbmNlcy4gIE5vcm1hbGx5IHRoZXkgYXJlIHNpbXBsZSBpbnN0cnVjdGlvbnMuICAqLwotICAgIGNhc2UgTV9KQUxfMToKLSAgICAgIGRyZWcgPSBSQTsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBNX0pBTF8yOgotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgfHwgbWlwc19waWMgPT0gRU1CRURERURfUElDKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJqYWxyIiwKLQkJICAgICAiZCxzIiwgZHJlZywgc3JlZyk7Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpZiAoc3JlZyAhPSBQSUNfQ0FMTF9SRUcpCi0JICAgIGFzX3dhcm4gKF8oIk1JUFMgUElDIGNhbGwgdG8gcmVnaXN0ZXIgb3RoZXIgdGhhbiAkMjUiKSk7Ci0gICAgICAKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJqYWxyIiwKLQkJICAgICAgICJkLHMiLCBkcmVnLCBzcmVnKTsKLQkgIGlmIChtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPCAwKQotCSAgICBhc193YXJuIChfKCJObyAuY3ByZXN0b3JlIHBzZXVkby1vcCB1c2VkIGluIFBJQyBjb2RlIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsIG1pcHNfZnJhbWVfcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX0pBTF9BOgotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImphbCIsICJhIik7Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIHdlIGFyZQotCSAgICAgdXNpbmcgYSBzbWFsbCBHT1QsIHdlIHdhbnQKLQkgICAgICAgbHcJJDI1LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19DQUxMMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBqYWxyCSQyNQotCSAgICAgICBub3AKLQkgICAgICAgbHcJJGdwLGNwcmVzdG9yZSgkc3ApCi0JICAgICBUaGUgY3ByZXN0b3JlIHZhbHVlIGlzIHNldCB1c2luZyB0aGUgLmNwcmVzdG9yZQotCSAgICAgcHNldWRvLW9wLiAgSWYgd2UgYXJlIHVzaW5nIGEgYmlnIEdPVCwgd2Ugd2FudAotCSAgICAgICBsdWkJJDI1LDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2KQotCSAgICAgICBhZGR1CSQyNSwkMjUsJGdwCi0JICAgICAgIGx3CSQyNSw8c3ltPigkMjUpCQkoQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KQotCSAgICAgICBub3AKLQkgICAgICAgamFscgkkMjUKLQkgICAgICAgbm9wCi0JICAgICAgIGx3CSRncCxjcHJlc3RvcmUoJHNwKQotCSAgICAgSWYgdGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwsIHdlIHdhbnQKLQkgICAgICAgbHcJJDI1LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSQyNSwkMjUsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgamFscgkkMjUKLQkgICAgICAgbm9wCi0JICAgICAgIGx3ICRncCxjcHJlc3RvcmUoJHNwKSAqLwotCSAgZnJhZ19ncm93ICg0MCk7Ci0JICBpZiAoISBtaXBzX2JpZ19nb3QpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAibHciIDogImxkIiksCi0JCQkgICAidCxvKGIpIiwgUElDX0NBTExfUkVHLAotCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBHUCk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJub3AiLCAiIik7Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDAsIDQsIC04LCAwLCAwLCAwKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgZ3BkZWw7Ci0KLQkgICAgICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0JCWdwZGVsID0gNDsKLQkgICAgICBlbHNlCi0JCWdwZGVsID0gMDsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkJICAgUElDX0NBTExfUkVHLCAoaW50KSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCBQSUNfQ0FMTF9SRUcsIFBJQ19DQUxMX1JFRywgR1ApOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBQSUNfQ0FMTF9SRUcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYsIFBJQ19DQUxMX1JFRyk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJub3AiLCAiIik7Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDE2LCAxMiArIGdwZGVsLCBncGRlbCwgOCArIGdwZGVsLAotCQkJCQkgIDAsIDApLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgICAgaWYgKGdwZGVsID4gMCkKLQkJewotCQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JCSAgcCArPSA0OwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIFBJQ19DQUxMX1JFRywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICAgICAgcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICAgICAgcCArPSA0OwotCSAgICB9CQkJICAgCi0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIFBJQ19DQUxMX1JFRywgUElDX0NBTExfUkVHLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICJqYWxyIiwgInMiLCBQSUNfQ0FMTF9SRUcpOwotCSAgaWYgKG1pcHNfY3ByZXN0b3JlX29mZnNldCA8IDApCi0JICAgIGFzX3dhcm4gKF8oIk5vIC5jcHJlc3RvcmUgcHNldWRvLW9wIHVzZWQgaW4gUElDIGNvZGUiKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobWlwc19vcHRzLm5vcmVvcmRlcikKLQkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgIm5vcCIsICIiKTsKLQkgICAgICBleHByMS5YX2FkZF9udW1iZXIgPSBtaXBzX2NwcmVzdG9yZV9vZmZzZXQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIEdQLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwKLQkJCSAgIG1pcHNfZnJhbWVfcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImJhbCIsICJwIik7Ci0JICAvKiBUaGUgbGlua2VyIG1heSBleHBhbmQgdGhlIGNhbGwgdG8gYSBsb25nZXIgc2VxdWVuY2Ugd2hpY2gKLQkgICAgIHVzZXMgJGF0LCBzbyB3ZSBtdXN0IGJyZWFrIHJhdGhlciB0aGFuIHJldHVybi4gICovCi0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9MQl9BQjoKLSAgICAgIHMgPSAibGIiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTEJVX0FCOgotICAgICAgcyA9ICJsYnUiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTEhfQUI6Ci0gICAgICBzID0gImxoIjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xIVV9BQjoKLSAgICAgIHMgPSAibGh1IjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXX0FCOgotICAgICAgcyA9ICJsdyI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MwX0FCOgotICAgICAgcyA9ICJsd2MwIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MxX0FCOgotICAgICAgcyA9ICJsd2MxIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MyX0FCOgotICAgICAgcyA9ICJsd2MyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MzX0FCOgotICAgICAgcyA9ICJsd2MzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0xfQUI6Ci0gICAgICBzID0gImx3bCI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV1JfQUI6Ci0gICAgICBzID0gImx3ciI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MREMxX0FCOgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzID0gImxkYzEiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEQzJfQUI6Ci0gICAgICBzID0gImxkYzIiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEQzNfQUI6Ci0gICAgICBzID0gImxkYzMiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xETF9BQjoKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIGxyID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEUl9BQjoKLSAgICAgIHMgPSAibGRyIjsKLSAgICAgIGxyID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xMX0FCOgotICAgICAgcyA9ICJsbCI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MTERfQUI6Ci0gICAgICBzID0gImxsZCI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV1VfQUI6Ci0gICAgICBzID0gImx3dSI7Ci0gICAgbGQ6Ci0gICAgICBpZiAoYnJlZyA9PSB0cmVnIHx8IGNvcHJvYyB8fCBscikKLQl7Ci0JICB0ZW1wcmVnID0gQVQ7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdGVtcHJlZyA9IHRyZWc7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBnb3RvIGxkX3N0OwotICAgIGNhc2UgTV9TQl9BQjoKLSAgICAgIHMgPSAic2IiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0hfQUI6Ci0gICAgICBzID0gInNoIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXX0FCOgotICAgICAgcyA9ICJzdyI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MwX0FCOgotICAgICAgcyA9ICJzd2MwIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MxX0FCOgotICAgICAgcyA9ICJzd2MxIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MyX0FCOgotICAgICAgcyA9ICJzd2MyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MzX0FCOgotICAgICAgcyA9ICJzd2MzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0xfQUI6Ci0gICAgICBzID0gInN3bCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV1JfQUI6Ci0gICAgICBzID0gInN3ciI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TQ19BQjoKLSAgICAgIHMgPSAic2MiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0NEX0FCOgotICAgICAgcyA9ICJzY2QiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RDMV9BQjoKLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgcyA9ICJzZGMxIjsKLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TREMyX0FCOgotICAgICAgcyA9ICJzZGMyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TREMzX0FCOgotICAgICAgcyA9ICJzZGMzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TRExfQUI6Ci0gICAgICBzID0gInNkbCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TRFJfQUI6Ci0gICAgICBzID0gInNkciI7Ci0gICAgc3Q6Ci0gICAgICB0ZW1wcmVnID0gQVQ7Ci0gICAgICB1c2VkX2F0ID0gMTsKLSAgICBsZF9zdDoKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGlmIChtYXNrID09IE1fTFdDMV9BQgotCSAgfHwgbWFzayA9PSBNX1NXQzFfQUIKLQkgIHx8IG1hc2sgPT0gTV9MREMxX0FCCi0JICB8fCBtYXNrID09IE1fU0RDMV9BQgotCSAgfHwgbWFzayA9PSBNX0xfREFCCi0JICB8fCBtYXNrID09IE1fU19EQUIpCi0JZm10ID0gIlQsbyhiKSI7Ci0gICAgICBlbHNlIGlmIChjb3Byb2MpCi0JZm10ID0gIkUsbyhiKSI7Ci0gICAgICBlbHNlCi0JZm10ID0gInQsbyhiKSI7Ci0KLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkgICYmIG9mZnNldF9leHByLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JfQotCi0gICAgICAvKiBBIGNvbnN0YW50IGV4cHJlc3Npb24gaW4gUElDIGNvZGUgY2FuIGJlIGhhbmRsZWQganVzdCBhcyBpdAotCSBpcyBpbiBub24gUElDIGNvZGUuICAqLwotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgfHwgb2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIGFuZCB0aGVyZQotCSAgICAgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2Ugd2FudAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHdlIGhhdmUgYSBjb25zdGFudCwgd2UgbmVlZCB0d28gaW5zdHJ1Y3Rpb25zIGFueWhvdywKLQkgICAgIHNvIHdlIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBmb3JtLgotCi0JICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3RlciwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYQotCSAgICAgR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJGJyZWcsJGdwCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGJyZWcKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkdGVtcHJlZykJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgV2l0aCBhIGNvbnN0YW50IHdlIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBjYXNlLiAgKi8KLQkgIGlmIChicmVnID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLQkJICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQotCQlwID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcmFnX2dyb3cgKDIwKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBHUCk7Ci0JCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMCwKLQkJCQlSRUxBWF9FTkNPREUgKDQsIDgsIDAsIDQsIDAsCi0JCQkJCSAgICAgIChtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgICAgIHx8ICh1c2VkX2F0Ci0JCQkJCQkgICAmJiBtaXBzX29wdHMubm9hdCkpKSwKLQkJCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJCShjaGFyICopIE5VTEwpOwotCQkgIHVzZWRfYXQgPSAwOwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCB0ZW1wcmVnKTsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQlwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwgdHJlZywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCB0ZW1wcmVnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0JCSAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKLQkJcCA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnJhZ19ncm93ICgyOCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgdGVtcHJlZywgYnJlZywgR1ApOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyLCAwLAotCQkJCVJFTEFYX0VOQ09ERSAoOCwgMTIsIDAsIDgsIDAsIDApLAotCQkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkJKGNoYXIgKikgTlVMTCk7Ci0JCX0KLQkgICAgICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHRlbXByZWcpOwotCSAgICAgIGlmIChwICE9IE5VTEwpCi0JCXAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgYnJlZyk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsIHRyZWcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyAmJiAhIG1pcHNfYmlnX2dvdCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkdGVtcHJlZykKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPHN5bT4JKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIGFkZCBpdCB0byAkdGVtcHJlZyBiZWZvcmUKLQkgICAgIHRoZSA8b3A+LiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgd2Ugc3RpY2sgaXQgaW4gdGhlCi0JICAgICA8b3A+IGluc3RydWN0aW9uLiAgV2UgZG9uJ3QgaGFuZGxlIGNvbnN0YW50cyBsYXJnZXIgdGhhbgotCSAgICAgMTYgYml0cywgYmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB0byBsb2FkIHRoZSB1cHBlciAxNiBiaXRzCi0JICAgICAoYWN0dWFsbHksIHdlIGNvdWxkIGhhbmRsZSB0aGVtIGZvciB0aGUgc3Vic2V0IG9mIGNhc2VzCi0JICAgICBpbiB3aGljaCB3ZSBhcmUgbm90IHVzaW5nICRhdCkuICAqLwotCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sKTsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAotCSAgICAgIHx8IGV4cHIxLlhfYWRkX251bWJlciA+PSAweDgwMDApCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgZnJhZ19ncm93ICgyMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsIAotCQkJUkVMQVhfRU5DT0RFICgwLCA0LCAtOCwgMCwgMCwgMCksCi0JCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJKGNoYXIgKikgTlVMTCk7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIGJyZWcpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwgdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCB0ZW1wcmVnKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpbnQgZ3BkZWw7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRncAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkdGVtcHJlZykgKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJHRlbXByZWcgYmVmb3JlCi0JICAgICB0aGUgPG9wPi4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIHdlIHN0aWNrIGl0IGluIHRoZQotCSAgICAgPG9wPiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhbmRsZSBjb25zdGFudHMgbGFyZ2VyIHRoYW4KLQkgICAgIDE2IGJpdHMsIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8gbG9hZCB0aGUgdXBwZXIgMTYgYml0cwotCSAgICAgKGFjdHVhbGx5LCB3ZSBjb3VsZCBoYW5kbGUgdGhlbSBmb3IgdGhlIHN1YnNldCBvZiBjYXNlcwotCSAgICAgaW4gd2hpY2ggd2UgYXJlIG5vdCB1c2luZyAkYXQpLiAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkgICAgZ3BkZWwgPSA0OwotCSAgZWxzZQotCSAgICBncGRlbCA9IDA7Ci0JICBmcmFnX2dyb3cgKDM2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCSAgICAgICB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwKLQkJICAgICAgIHRlbXByZWcpOwotCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKLQkJCVJFTEFYX0VOQ09ERSAoMTIsIDEyICsgZ3BkZWwsIGdwZGVsLCA4ICsgZ3BkZWwsIDAsIDApLAotCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0JICBpZiAoZ3BkZWwgPiAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBwICs9IDQ7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBicmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsIHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIC8qIElmIHRoZXJlIGlzIG5vIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3Rlciwgd2Ugd2FudAotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCRicmVnLCRncAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAqLwotCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sKTsKLQkgIGlmIChicmVnID09IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIEdQKTsKLQkgICAgICB1c2VkX2F0ID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIGJyZWcsIEdQKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoISB1c2VkX2F0KQotCXJldHVybjsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fTEk6Ci0gICAgY2FzZSBNX0xJX1M6Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgdHJlZywgJmltbV9leHByLCAwKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9ETEk6Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgdHJlZywgJmltbV9leHByLCAxKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9MSV9TUzoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICJtdGMxIiwgInQsRyIsIEFULCB0cmVnKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wKLQkJICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVAotCQkJCQkgICAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sKSksCi0JCQkgICAgICIubGl0NCIpID09IDAKLQkJICAmJiBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3YzEiLCAiVCxvKGIpIiwKLQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEdQKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICBjYXNlIE1fTElfRDoKLSAgICAgIC8qIElmIHdlIGhhdmUgYSBjb25zdGFudCBpbiBJTU1fRVhQUiwgdGhlbiBpbiBtaXBzMyBtb2RlIGl0IGlzCi0gICAgICAgICB0aGUgZW50aXJlIHZhbHVlLCBhbmQgaW4gbWlwczEgbW9kZSBpdCBpcyB0aGUgaGlnaCBvcmRlciAzMgotICAgICAgICAgYml0cyBvZiB0aGUgdmFsdWUgYW5kIHRoZSBsb3cgb3JkZXIgMzIgYml0cyBhcmUgZWl0aGVyIHplcm8KLSAgICAgICAgIG9yIGluIG9mZnNldF9leHByLiAgKi8KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgfHwgaW1tX2V4cHIuWF9vcCA9PSBPX2JpZykKLQl7Ci0JICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgaHJlZywgbHJlZzsKLQotCSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQkJewotCQkgIGhyZWcgPSB0cmVnOwotCQkgIGxyZWcgPSB0cmVnICsgMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGhyZWcgPSB0cmVnICsgMTsKLQkJICBscmVnID0gdHJlZzsKLQkJfQotCi0JICAgICAgaWYgKGhyZWcgPD0gMzEpCi0JCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBocmVnLCAmaW1tX2V4cHIsIDApOwotCSAgICAgIGlmIChscmVnIDw9IDMxKQotCQl7Ci0JCSAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19hYnNlbnQpCi0JCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsCi0JCQkJIGxyZWcsIDApOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpOwotCQkgICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgbHJlZywgJm9mZnNldF9leHByLCAwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSBrbm93IHRoYXQgc3ltIGlzIGluIHRoZSAucmRhdGEgc2VjdGlvbi4gIEZpcnN0IHdlIGdldCB0aGUKLQkgdXBwZXIgMTYgYml0cyBvZiB0aGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCXsKLQkgIC8qIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsgZm9yIGEgNjQgYml0IGFkZHJlc3MuICAqLwotCSAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIC8qIEZvciBlbWJlZGRlZCBQSUMgd2UgcGljayB1cCB0aGUgZW50aXJlIGFkZHJlc3Mgb2ZmICRncCBpbgotCSAgICAgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgQVQsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCQotICAgICAgLyogTm93IHdlIGxvYWQgdGhlIHJlZ2lzdGVyKHMpLiAgKi8KLSAgICAgIGlmIChJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGQiLCAidCxvKGIpIiwKLQkJICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgZWxzZQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHciLCAidCxvKGIpIiwKLQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBpZiAodHJlZyAhPSAzMSkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBIb3cgaW4gdGhlIHdvcmxkIGRvIHdlIGRlYWwgd2l0aCB0aGUgcG9zc2libGUKLQkJIG92ZXJmbG93IGhlcmU/ICAqLwotCSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHciLCAidCxvKGIpIiwKLQkJCSAgIHRyZWcgKyAxLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoaXMKLQkgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MSV9ERDoKLSAgICAgIC8qIElmIHdlIGhhdmUgYSBjb25zdGFudCBpbiBJTU1fRVhQUiwgdGhlbiBpbiBtaXBzMyBtb2RlIGl0IGlzCi0gICAgICAgICB0aGUgZW50aXJlIHZhbHVlLCBhbmQgaW4gbWlwczEgbW9kZSBpdCBpcyB0aGUgaGlnaCBvcmRlciAzMgotICAgICAgICAgYml0cyBvZiB0aGUgdmFsdWUgYW5kIHRoZSBsb3cgb3JkZXIgMzIgYml0cyBhcmUgZWl0aGVyIHplcm8KLSAgICAgICAgIG9yIGluIG9mZnNldF9leHByLiAgKi8KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgfHwgaW1tX2V4cHIuWF9vcCA9PSBPX2JpZykKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSk7Ci0JICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAiZG10YzEiLCAidCxTIiwgQVQsIHRyZWcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJtdGMxIiwgInQsRyIsIEFULCB0cmVnICsgMSk7Ci0JICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19hYnNlbnQpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICJtdGMxIiwgInQsRyIsIDAsIHRyZWcpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KTsKLQkJICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZvZmZzZXRfZXhwciwgMCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyk7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAmJiBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCk7Ci0gICAgICBzID0gc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wpKTsKLSAgICAgIGlmIChzdHJjbXAgKHMsICIubGl0OCIpID09IDApCi0JewotCSAgaWYgKG1pcHNfb3B0cy5pc2EgIT0gMSkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGRjMSIsCi0JCQkgICAiVCxvKGIpIiwgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfTElURVJBTCwgR1ApOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYnJlZyA9IEdQOwotCSAgciA9IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw7Ci0JICBnb3RvIGRvYjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNzZXJ0IChzdHJjbXAgKHMsIFJEQVRBX1NFQ1RJT05fTkFNRSkgPT0gMCk7Ci0JICBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICA/ICJsdyIgOiAibGQiKSwKLQkJCSAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGZvciBhIDY0IGJpdCBhZGRyZXNzLiAgKi8KLQkgICAgICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIEFUKTsKLQkgICAgfQotCSAgICAgIAotCSAgaWYgKG1pcHNfb3B0cy5pc2EgIT0gMSkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGRjMSIsCi0JCQkgICAiVCxvKGIpIiwgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQotCSAgICAgIC8qIFRvIGF2b2lkIGNvbmZ1c2lvbiBpbiB0Y19nZW5fcmVsb2MsIHdlIG11c3QgZW5zdXJlCi0JCSB0aGF0IHRoaXMgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLQkgICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLQkgICAgICBmcmFnX25ldyAoMCk7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlZyA9IEFUOwotCSAgciA9IEJGRF9SRUxPQ19MTzE2OwotCSAgZ290byBkb2I7Ci0JfQotCi0gICAgY2FzZSBNX0xfRE9COgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCi0JIHRvIGFkanVzdCB3aGVuIGxvYWRpbmcgZnJvbSBtZW1vcnkuICAqLwotICAgICAgciA9IEJGRF9SRUxPQ19MTzE2OwotICAgIGRvYjoKLSAgICAgIGFzc2VydCAobWlwc19vcHRzLmlzYSA9PSAxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHdjMSIsICJULG8oYikiLAotCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgKGludCkgciwgYnJlZyk7Ci0gICAgICAvKiBGSVhNRTogQSBwb3NzaWJsZSBvdmVyZmxvdyB3aGljaCBJIGRvbid0IGtub3cgaG93IHRvIGRlYWwKLQkgd2l0aC4gICovCi0gICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHdjMSIsICJULG8oYikiLAotCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgKGludCkgciwgYnJlZyk7Ci0KLSAgICAgIC8qIFRvIGF2b2lkIGNvbmZ1c2lvbiBpbiB0Y19nZW5fcmVsb2MsIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhpcwotCSBkb2VzIG5vdCBiZWNvbWUgYSB2YXJpYW50IGZyYWcuICAqLwotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0KLSAgICAgIGlmIChicmVnICE9IEFUKQotCXJldHVybjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0xfREFCOgotICAgICAgLyoKLSAgICAgICAqIFRoZSBNSVBTIGFzc2VtYmxlciBzZWVtcyB0byBjaGVjayBmb3IgWF9hZGRfbnVtYmVyIG5vdAotICAgICAgICogYmVpbmcgZG91YmxlIGFsaWduZWQgYW5kIGdlbmVyYXRpbmc6Ci0gICAgICAgKglsdWkJYXQsJWhpKGZvbysxKQotICAgICAgICoJYWRkdQlhdCxhdCx2MQotICAgICAgICoJYWRkaXUJYXQsYXQsJWxvKGZvbysxKQotICAgICAgICoJbHdjMQlmMiwwKGF0KQotICAgICAgICoJbHdjMQlmMyw0KGF0KQotICAgICAgICogQnV0LCB0aGUgcmVzdWx0aW5nIGFkZHJlc3MgaXMgdGhlIHNhbWUgYWZ0ZXIgcmVsb2NhdGlvbiBzbyB3aHkKLSAgICAgICAqIGdlbmVyYXRlIHRoZSBleHRyYSBpbnN0cnVjdGlvbj8KLSAgICAgICAqLwotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgIT0gMSkKLQl7Ci0JICBzID0gImxkYzEiOwotCSAgZ290byBsZDsKLQl9Ci0KLSAgICAgIHMgPSAibHdjMSI7Ci0gICAgICBmbXQgPSAiVCxvKGIpIjsKLSAgICAgIGdvdG8gbGRkX3N0ZDsKLQotICAgIGNhc2UgTV9TX0RBQjoKLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAobWlwc19vcHRzLmlzYSAhPSAxKQotCXsKLQkgIHMgPSAic2RjMSI7Ci0JICBnb3RvIHN0OwotCX0KLQotICAgICAgcyA9ICJzd2MxIjsKLSAgICAgIGZtdCA9ICJULG8oYikiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGRkX3N0ZDsKLQotICAgIGNhc2UgTV9MRF9BQjoKLSAgICAgIGlmIChJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCXsKLQkgIHMgPSAibGQiOwotCSAgZ290byBsZDsKLQl9Ci0KLSAgICAgIHMgPSAibHciOwotICAgICAgZm10ID0gInQsbyhiKSI7Ci0gICAgICBnb3RvIGxkZF9zdGQ7Ci0KLSAgICBjYXNlIE1fU0RfQUI6Ci0gICAgICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQl7Ci0JICBzID0gInNkIjsKLQkgIGdvdG8gc3Q7Ci0JfQotCi0gICAgICBzID0gInN3IjsKLSAgICAgIGZtdCA9ICJ0LG8oYikiOwotCi0gICAgbGRkX3N0ZDoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fc3ltYm9sCi0JICAmJiBvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JfQotCi0gICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCi0JIHRvIGFkanVzdCB3aGVuIGxvYWRpbmcgZnJvbSBtZW1vcnkuICBXZSBzZXQgY29wcm9jIGlmIHdlIG11c3QKLQkgbG9hZCAkZm4rMSBmaXJzdC4gICovCi0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQljb3Byb2MgPSAwOwotCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDCi0JICB8fCBvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIElmIHdlIGhhdmUgYSBiYXNlIHJlZ2lzdGVyLCB3ZSB1c2UgdGhpcwotCSAgICAgICBhZGR1CSRhdCwkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB0aGlzIGlzIG5vdCBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJGF0LDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIGFkZCBpdCB0byAkYXQgYWZ0ZXIgdGhlCi0JICAgICBsdWkgaW5zdHJ1Y3Rpb24uICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCB3ZSBhbHdheXMgdXNlCi0JICAgICB0aGUgbGFzdCBjYXNlLiAgKi8KLQkgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCSAgICAgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JICAgIHsKLQkgICAgICBwID0gTlVMTDsKLQkgICAgICB1c2VkX2F0ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IG9mZjsKLQotCSAgICAgIGlmIChicmVnID09IDApCi0JCXsKLQkJICBmcmFnX2dyb3cgKDI4KTsKLQkJICB0ZW1wcmVnID0gR1A7Ci0JCSAgb2ZmID0gMDsKLQkJICB1c2VkX2F0ID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdfZ3JvdyAoMzYpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIEFULCBicmVnLCBHUCk7Ci0JCSAgdGVtcHJlZyA9IEFUOwotCQkgIG9mZiA9IDQ7Ci0JCSAgdXNlZF9hdCA9IDE7Ci0JCX0KLQotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLQotCSAgICAgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuCi0gICAgICAgICAgICAgICAgIHVuZGVzaXJlZCBub3AuICAqLwotCSAgICAgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAotCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0KLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIG9mZiwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDggKyBvZmYsIDEyICsgb2ZmLCAwLCA0ICsgb2ZmLCAxLAotCQkJCQkgIHVzZWRfYXQgJiYgbWlwc19vcHRzLm5vYXQpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0KLQkgICAgICAvKiBXZSBqdXN0IGdlbmVyYXRlZCB0d28gcmVsb2NzLiAgV2hlbiB0Y19nZW5fcmVsb2MKLQkJIGhhbmRsZXMgdGhpcyBjYXNlLCBpdCB3aWxsIHNraXAgdGhlIGZpcnN0IHJlbG9jIGFuZAotCQkgaGFuZGxlIHRoZSBzZWNvbmQuICBUaGUgc2Vjb25kIHJlbG9jIGFscmVhZHkgaGFzIGFuCi0JCSBleHRyYSBhZGRlbmQgb2YgNCwgd2hpY2ggd2UgYWRkZWQgYWJvdmUuICBXZSBtdXN0Ci0JCSBzdWJ0cmFjdCBpdCBvdXQsIGFuZCB0aGVuIHN1YnRyYWN0IGFub3RoZXIgNCB0byBtYWtlCi0JCSB0aGUgZmlyc3QgcmVsb2MgY29tZSBvdXQgcmlnaHQuICBUaGUgc2Vjb25kIHJlbG9jCi0JCSB3aWxsIGNvbWUgb3V0IHJpZ2h0IGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGFkZCA0IHRvCi0JCSBvZmZzZXRfZXhwciB3aGVuIHdlIGJ1aWxkIGl0cyBpbnN0cnVjdGlvbiBiZWxvdy4KLQotCQkgSWYgd2UgaGF2ZSBhIHN5bWJvbCwgdGhlbiB3ZSBkb24ndCB3YW50IHRvIGluY2x1ZGUKLQkJIHRoZSBvZmZzZXQsIGJlY2F1c2UgaXQgd2lsbCB3aW5kIHVwIGJlaW5nIGluY2x1ZGVkCi0JCSB3aGVuIHdlIGdlbmVyYXRlIHRoZSByZWxvYy4gICovCi0KLQkgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gODsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAtNDsKLQkJICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJfQotCSAgICB9Ci0JICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIEFUKTsKLQkgIGlmIChwICE9IE5VTEwpCi0JICAgIHAgKz0gNDsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQlwICs9IDQ7Ci0JICAgIH0KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIGlmIChwICE9IE5VTEwpCi0JICAgIHAgKz0gNDsKLQkgIC8qIEZJWE1FOiBIb3cgZG8gd2UgaGFuZGxlIG92ZXJmbG93IGhlcmU/ICAqLwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JfQkgIAotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0JewotCSAgaW50IG9mZjsKLQotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJGF0LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkYXQpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw0KCRhdCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx3CSRhdCw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3RlciB3ZSBhZGQgaXQgdG8gJGF0IGJlZm9yZSB0aGUKLQkgICAgIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCB3ZSBpbmNsdWRlIGl0Ci0JICAgICBpbiB0aGUgbHdjMSBpbnN0cnVjdGlvbnMuICAqLwotCSAgdXNlZF9hdCA9IDE7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gNCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBpZiAoYnJlZyA9PSAwKQotCSAgICBvZmYgPSAwOwotCSAgZWxzZQotCSAgICBvZmYgPSA0OwotCSAgZnJhZ19ncm93ICgyNCArIG9mZik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgKz0gNDsKLQotCSAgLyogU2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0byBhdm9pZCBpbnNlcnRpbmcgYW4gdW5kZXNpcmVkCi0gICAgICAgICAgICAgbm9wLiAgKi8KLQkgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICBtaXBzX29wdGltaXplID0gMjsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0KLQkgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDAsIDAsCi0JCQkgICBSRUxBWF9FTkNPREUgKDAsIDAsIC0xNiAtIG9mZiwgLTgsIDEsIDApLAotCQkJICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgIChjaGFyICopIE5VTEwpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIGludCBncGRlbCwgb2ZmOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJGF0LDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgICAgIGFkZHUJJGF0LCRhdCwkZ3AKLQkgICAgICAgbHcJJGF0LDxzeW0+KCRhdCkJCShCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgbm9wCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkYXQpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw0KCRhdCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx3CSRhdCw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3RlciB3ZSBhZGQgaXQgdG8gJGF0IGJlZm9yZSB0aGUKLQkgICAgIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCB3ZSBpbmNsdWRlIGl0Ci0JICAgICBpbiB0aGUgbHdjMSBpbnN0cnVjdGlvbnMuICAqLwotCSAgdXNlZF9hdCA9IDE7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gNCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0JICAgIGdwZGVsID0gNDsKLQkgIGVsc2UKLQkgICAgZ3BkZWwgPSAwOwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgb2ZmID0gMDsKLQkgIGVsc2UKLQkgICAgb2ZmID0gNDsKLQkgIGZyYWdfZ3JvdyAoNTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJICAgICAgIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgICAiZCx2LHQiLCBBVCwgQVQsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgQVQpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIGV4cHIxLlhfYWRkX251bWJlciArPSA0OwotCi0JICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbiB1bmRlc2lyZWQKLSAgICAgICAgICAgICBub3AuICAqLwotCSAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgIG1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQkgIGV4cHIxLlhfYWRkX251bWJlciAtPSA0OwotCi0JICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxNiArIGdwZGVsICsgb2ZmLCAwLAotCQkJUkVMQVhfRU5DT0RFICgyNCArIG9mZiwgMTYgKyBncGRlbCArIG9mZiwgZ3BkZWwsCi0JCQkJICAgICAgOCArIGdwZGVsICsgb2ZmLCAxLCAwKSwKLQkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkoY2hhciAqKSBOVUxMKTsKLQkgIGlmIChncGRlbCA+IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBwICs9IDQ7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgcCArPSA0OwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgcCArPSA0OwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZGVzaXJlZAotICAgICAgICAgICAgIG5vcC4gICovCi0JICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBJZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB1c2UKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3Rlciwgd2UgdXNlCi0JICAgICAgIGFkZHUJJGF0LCRicmVnLCRncAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICovCi0JICBpZiAoYnJlZyA9PSAwKQotCSAgICB7Ci0JICAgICAgdGVtcHJlZyA9IEdQOwotCSAgICAgIHVzZWRfYXQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgQVQsIGJyZWcsIEdQKTsKLQkgICAgICB0ZW1wcmVnID0gQVQ7Ci0JICAgICAgdXNlZF9hdCA9IDE7Ci0JICAgIH0KLQotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKCEgdXNlZF9hdCkKLQlyZXR1cm47Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0xEX09COgotICAgICAgcyA9ICJsdyI7Ci0gICAgICBnb3RvIHNkX29iOwotICAgIGNhc2UgTV9TRF9PQjoKLSAgICAgIHMgPSAic3ciOwotICAgIHNkX29iOgotICAgICAgYXNzZXJ0IChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyIAotCSAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnICsgMSwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAvKiBOZXcgY29kZSBhZGRlZCB0byBzdXBwb3J0IENPUFogaW5zdHJ1Y3Rpb25zLgotICAgICAgVGhpcyBjb2RlIGJ1aWxkcyB0YWJsZSBlbnRyaWVzIG91dCBvZiB0aGUgbWFjcm9zIGluIG1pcF9vcGNvZGVzLgotICAgICAgUjQwMDAgdXNlcyBpbnRlcmxvY2tzIHRvIGhhbmRsZSBjb3Byb2MgZGVsYXlzLgotICAgICAgT3RoZXIgY2hpcHMgKGxpa2UgdGhlIFIzMDAwKSByZXF1aXJlIG5vcHMgdG8gYmUgaW5zZXJ0ZWQgZm9yIGRlbGF5cy4KLQotICAgICAgRklYTUU6IEN1cnJlbnRseSwgd2UgcmVxdWlyZSB0aGF0IHRoZSB1c2VyIGhhbmRsZSBkZWxheXMuCi0gICAgICBJbiBvcmRlciB0byBmaWxsIGRlbGF5IHNsb3RzIGZvciBub24taW50ZXJsb2NrZWQgY2hpcHMsCi0gICAgICB3ZSBtdXN0IGhhdmUgYSB3YXkgdG8gc3BlY2lmeSBkZWxheXMgYmFzZWQgb24gdGhlIGNvcHJvY2Vzc29yLgotICAgICAgRWcuIDQgY3ljbGVzIGlmIGxvYWQgY29wcm9jIHJlZyBmcm9tIG1lbW9yeSwgMSBpZiBpbiBjYWNoZSwgZXRjLgotICAgICAgV2hhdCBhcmUgdGhlIHNpZGUtZWZmZWN0cyBvZiB0aGUgY29wIGluc3RydWN0aW9uPwotICAgICAgV2hhdCBjYWNoZSBzdXBwb3J0IG1pZ2h0IHdlIGhhdmUgYW5kIHdoYXQgYXJlIGl0cyBlZmZlY3RzPwotICAgICAgQm90aCBjb3Byb2Nlc3NvciAmIG1lbW9yeSByZXF1aXJlIGRlbGF5cy4gaG93IGxvbmc/Pz8KLSAgICAgIFdoYXQgcmVnaXN0ZXJzIGFyZSByZWFkL3NldC9tb2RpZmllZD8gCi0KLSAgICAgIElmIGFuIGl0YmwgaXMgcHJvdmlkZWQgdG8gaW50ZXJwcmV0IGNvcCBpbnN0cnVjdGlvbnMsCi0gICAgICB0aGlzIGtub3dsZWRnZSBjYW4gYmUgZW5jb2RlZCBpbiB0aGUgaXRibCBzcGVjLiAqLwotCi0gICAgY2FzZSBNX0NPUDA6Ci0gICAgICBzID0gImMwIjsKLSAgICAgIGdvdG8gY29wejsKLSAgICBjYXNlIE1fQ09QMToKLSAgICAgIHMgPSAiYzEiOwotICAgICAgZ290byBjb3B6OwotICAgIGNhc2UgTV9DT1AyOgotICAgICAgcyA9ICJjMiI7Ci0gICAgICBnb3RvIGNvcHo7Ci0gICAgY2FzZSBNX0NPUDM6Ci0gICAgICBzID0gImMzIjsKLSAgICBjb3B6OgotICAgICAgLyogRm9yIG5vdyB3ZSBqdXN0IGRvIEMgKHNhbWUgYXMgQ3opLiAgVGhlIHBhcmFtZXRlciB3aWxsIGJlCi0gICAgICAgICBzdG9yZWQgaW4gaW5zbl9vcGNvZGUgYnkgbWlwc19pcC4gICovCi0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCBzLCAiQyIsCi0JCSAgIGlwLT5pbnNuX29wY29kZSk7Ci0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBMT1NJTkdfQ09NUElMRVIKLSAgICBkZWZhdWx0OgotICAgICAgLyogVHJ5IGFuZCBzZWUgaWYgdGhpcyBpcyBhIG5ldyBpdGJsIGluc3RydWN0aW9uLgotICAgICAgICAgVGhpcyBjb2RlIGJ1aWxkcyB0YWJsZSBlbnRyaWVzIG91dCBvZiB0aGUgbWFjcm9zIGluIG1pcF9vcGNvZGVzLgotICAgICAgICAgRklYTUU6IEZvciBub3cgd2UganVzdCBhc3NlbWJsZSB0aGUgZXhwcmVzc2lvbiBhbmQgcGFzcyBpdCdzCi0gICAgICAgICB2YWx1ZSBhbG9uZyBhcyBhIDMyLWJpdCBpbW1lZGlhdGUuCi0gICAgICAgICBXZSBtYXkgd2FudCB0byBoYXZlIHRoZSBhc3NlbWJsZXIgYXNzZW1ibGUgdGhpcyB2YWx1ZSwgCi0gICAgICAgICBzbyB0aGF0IHdlIGdhaW4gdGhlIGFzc2VtYmxlcidzIGtub3dsZWRnZSBvZiBkZWxheSBzbG90cywKLSAgICAgICAgIHN5bWJvbHMsIGV0Yy4KLSAgICAgICAgIFdvdWxkIGl0IGJlIG1vcmUgZWZmaWNpZW50IHRvIHVzZSBtYXNrIChpZCkgaGVyZT8gKi8KLSAgICAgIGlmIChpdGJsX2hhdmVfZW50cmllcyAKLQkgICYmIChpbW1lZF9leHByID0gaXRibF9hc3NlbWJsZSAoaXAtPmluc25fbW8tPm5hbWUsICIiKSkpCi0gICAgICAgIHsKLQkgIHMgPSBpcC0+aW5zbl9tby0+bmFtZTsKLQkgIHMyID0gImNvcDMiOwotCSAgY29wcm9jID0gSVRCTF9ERUNPREVfUE5VTSAoaW1tZWRfZXhwcik7OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tZWRfZXhwciwgcywgIkMiKTsKLQkgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgbWFjcm8yIChpcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAobWlwc19vcHRzLm5vYXQpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gdXNlZCAkYXQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiIpKTsKLX0KLSAgICAgICAgICAKLXN0YXRpYyB2b2lkCi1tYWNybzIgKGlwKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRyZWcsIHNyZWcsIGRyZWcsIGJyZWc7Ci0gIGludCB0ZW1wcmVnOwotICBpbnQgbWFzazsKLSAgaW50IGljbnQgPSAwOwotICBpbnQgdXNlZF9hdDsKLSAgZXhwcmVzc2lvblMgZXhwcjE7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKnMyOwotICBjb25zdCBjaGFyICpmbXQ7Ci0gIGludCBsaWtlbHkgPSAwOwotICBpbnQgZGJsID0gMDsKLSAgaW50IGNvcHJvYyA9IDA7Ci0gIGludCBsciA9IDA7Ci0gIGludCBpbW0gPSAwOwotICBpbnQgb2ZmOwotICBvZmZzZXRUIG1heG51bTsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0gIGNoYXIgKnA7Ci0gICAgICAgICAgCi0gIHRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDE2KSAmIDB4MWY7Ci0gIGRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDExKSAmIDB4MWY7Ci0gIHNyZWcgPSBicmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAyMSkgJiAweDFmOwotICBtYXNrID0gaXAtPmluc25fbW8tPm1hc2s7Ci0gICAgICAgICAgCi0gIGV4cHIxLlhfb3AgPSBPX2NvbnN0YW50OwotICBleHByMS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0gICAgICAgICAgCi0gIHN3aXRjaCAobWFzaykKLSAgICB7Ci0jZW5kaWYgLyogTE9TSU5HX0NPTVBJTEVSICovCi0KLSAgICBjYXNlIE1fRE1VTDoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX01VTDoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0dSIgOiAibXVsdHUiLAotCQkgICAicyx0Iiwgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9ETVVMX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxfSToKLSAgICAgIC8qIFRoZSBNSVBTIGFzc2VtYmxlciBzb21lIHRpbWVzIGdlbmVyYXRlcyBzaGlmdHMgYW5kIGFkZHMuICBJJ20KLQkgbm90IHRyeWluZyB0byBiZSB0aGF0IGZhbmN5LiBHQ0Mgc2hvdWxkIGRvIHRoaXMgZm9yIHVzCi0JIGFueXdheS4gICovCi0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0IiA6ICJtdWx0IiwKLQkJICAgInMsdCIsIHNyZWcsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE1VTE9fSToKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX01VTE9fSToKLSAgICAgIGltbSA9IDE7Ci0gICAgICBnb3RvIGRvX211bG87Ci0KLSAgICBjYXNlIE1fRE1VTE86Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPOgotICAgIGRvX211bG86Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAoaW1tKQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZG11bHQiIDogIm11bHQiLAotCQkgICAicyx0Iiwgc3JlZywgaW1tID8gQVQgOiB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZHNyYTMyIiA6ICJzcmEiLAotCQkgICAiZCx3LDwiLCBkcmVnLCBkcmVnLCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmhpIiwgImQiLCBBVCk7Ci0gICAgICBpZiAobWlwc190cmFwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRuZSIsICJzLHQiLCBkcmVnLCBBVCk7Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYmVxIiwgInMsdCxwIiwgZHJlZywgQVQpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNik7Ci0JfQotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ETVVMT1VfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX01VTE9VX0k6Ci0gICAgICBpbW0gPSAxOwotICAgICAgZ290byBkb19tdWxvdTsKLQotICAgIGNhc2UgTV9ETVVMT1U6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPVToKLSAgICBkb19tdWxvdToKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIGlmIChpbW0pCi0JbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgInMsdCIsIHNyZWcsIGltbSA/IEFUIDogdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmhpIiwgImQiLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIGlmIChtaXBzX3RyYXApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidG5lIiwgInMsdCIsIEFULCAwKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJiZXEiLCAicyx0LHAiLCBBVCwgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7Ci0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA2KTsKLQl9Ci0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST0w6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzdWJ1IiwgImQsdix0IiwgQVQsIDAsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3JsdiIsICJkLHQscyIsIEFULCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGx2IiwgImQsdCxzIiwgZHJlZywgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JPTF9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oInJvdGF0ZSBjb3VudCB0b28gbGFyZ2UiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCBBVCwgc3JlZywKLQkJICAgKGludCkgKGltbV9leHByLlhfYWRkX251bWJlciAmIDB4MWYpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIGRyZWcsIHNyZWcsCi0JCSAgIChpbnQpICgoMCAtIGltbV9leHByLlhfYWRkX251bWJlcikgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JPUjoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInN1YnUiLCAiZCx2LHQiLCBBVCwgMCwgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGx2IiwgImQsdCxzIiwgQVQsIHNyZWcsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybHYiLCAiZCx0LHMiLCBkcmVnLCBzcmVnLAotCQkgICB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgZHJlZywgZHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fUk9SX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygicm90YXRlIGNvdW50IHRvbyBsYXJnZSIpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIEFULCBzcmVnLAotCQkgICAoaW50KSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyICYgMHgxZikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgZHJlZywgc3JlZywKLQkJICAgKGludCkgKCgwIC0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyKSAmIDB4MWYpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgZHJlZywgZHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU19ET0I6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGFzc2VydCAobWlwc19vcHRzLmlzYSA9PSAxKTsKLSAgICAgIC8qIEV2ZW4gb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgJGZuIGNvbWVzIGJlZm9yZSAkZm4rMS4gIFdlIGhhdmUKLQkgdG8gYWRqdXN0IHdoZW4gc3RvcmluZyB0byBtZW1vcnkuICAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJzd2MxIiwgIlQsbyhiKSIsCi0JCSAgIHRhcmdldF9iaWdfZW5kaWFuID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic3djMSIsICJULG8oYikiLAotCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NFUToKLSAgICAgIGlmIChzcmVnID09IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsCi0JCSAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgZWxzZSBpZiAodHJlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAotCQkgICAgICAgc3JlZywgdHJlZyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKLQkJICAgICAgIGRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0VRX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgICAgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgZmFsc2UiKSwKLQkJICAgaXAtPmluc25fbW8tPm5hbWUpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInhvcmkiLCAidCxyLGkiLCBkcmVnLAotCQkgICAgICAgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMCkKLQl7Ci0JICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAotCQkgICAgICAgc3JlZywgQVQpOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsIGRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmICh1c2VkX2F0KQotCWJyZWFrOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NHRToJCS8qIHNyZWcgPj0gdHJlZyA8PT0+IG5vdCAoc3JlZyA8IHRyZWcpICovCi0gICAgICBzID0gInNsdCI7Ci0gICAgICBnb3RvIHNnZTsKLSAgICBjYXNlIE1fU0dFVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgc2dlOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCBzcmVnLCB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TR0VfSToJCS8qIHNyZWcgPj0gSSA8PT0+IG5vdCAoc3JlZyA8IEkpICovCi0gICAgY2FzZSBNX1NHRVVfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICBtYXNrID09IE1fU0dFX0kgPyAic2x0aSIgOiAic2x0aXUiLAotCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgICAgIG1hc2sgPT0gTV9TR0VfSSA/ICJzbHQiIDogInNsdHUiLAotCQkgICAgICAgImQsdix0IiwgZHJlZywgc3JlZywgQVQpOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgaWYgKHVzZWRfYXQpCi0JYnJlYWs7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dUOgkJLyogc3JlZyA+IHRyZWcgIDw9PT4gIHRyZWcgPCBzcmVnICovCi0gICAgICBzID0gInNsdCI7Ci0gICAgICBnb3RvIHNndDsKLSAgICBjYXNlIE1fU0dUVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgc2d0OgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCB0cmVnLCBzcmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TR1RfSToJCS8qIHNyZWcgPiBJICA8PT0+ICBJIDwgc3JlZyAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzZ3RpOwotICAgIGNhc2UgTV9TR1RVX0k6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNndGk6Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIEFULCBzcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NMRToJCS8qIHNyZWcgPD0gdHJlZyAgPD09PiAgdHJlZyA+PSBzcmVnICA8PT0+ICBub3QgKHRyZWcgPCBzcmVnKSAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzbGU7Ci0gICAgY2FzZSBNX1NMRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNsZToKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgdHJlZywgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0xFX0k6CQkvKiBzcmVnIDw9IEkgPD09PiBJID49IHNyZWcgPD09PiBub3QgKEkgPCBzcmVnKSAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzbGVpOwotICAgIGNhc2UgTV9TTEVVX0k6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNsZWk6Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIEFULCBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NMVF9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInNsdGkiLCAidCxyLGoiLAotCQkgICAgICAgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NMVFVfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJzbHRpdSIsICJ0LHIsaiIsCi0JCSAgICAgICBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIHNyZWcsCi0JCSAgIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NORToKLSAgICAgIGlmIChzcmVnID09IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsCi0JCSAgICAgdHJlZyk7Ci0gICAgICBlbHNlIGlmICh0cmVnID09IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsCi0JCSAgICAgc3JlZyk7Ci0gICAgICBlbHNlCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKLQkJICAgICAgIHNyZWcsIHRyZWcpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsCi0JCSAgICAgICBkcmVnKTsKLQl9Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU05FX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgICAgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJJbnN0cnVjdGlvbiAlczogcmVzdWx0IGlzIGFsd2F5cyB0cnVlIiksCi0JCSAgIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIDAsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInhvcmkiLCAidCxyLGkiLAotCQkgICAgICAgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMCkKLQl7Ci0JICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCBBVCk7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwgZHJlZyk7Ci0gICAgICBpZiAodXNlZF9hdCkKLQlicmVhazsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9EU1VCX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9TVUJfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8PSAweDgwMDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgZGJsID8gImRhZGRpIiA6ICJhZGRpIiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzdWIiIDogInN1YiIsCi0JCSAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RTVUJVX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9TVUJVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gMHg4MDAwKQotCXsKLQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKLQkJICAgICAgIGRibCA/ICJkYWRkaXUiIDogImFkZGl1IiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzdWJ1IiA6ICJzdWJ1IiwKLQkJICAgImQsdix0IiwgZHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVEVRX0k6Ci0gICAgICBzID0gInRlcSI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RHRV9JOgotICAgICAgcyA9ICJ0Z2UiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UR0VVX0k6Ci0gICAgICBzID0gInRnZXUiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UTFRfSToKLSAgICAgIHMgPSAidGx0IjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVExUVV9JOgotICAgICAgcyA9ICJ0bHR1IjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVE5FX0k6Ci0gICAgICBzID0gInRuZSI7Ci0gICAgdHJhcDoKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInMsdCIsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1RSVU5DV0Q6Ci0gICAgY2FzZSBNX1RSVU5DV1M6Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPT0gMSk7Ci0gICAgICBzcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwkvKiBmbG9hdGluZyByZWcgKi8KLSAgICAgIGRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDA2KSAmIDB4MWY7CS8qIGZsb2F0aW5nIHJlZyAqLwotCi0gICAgICAvKgotICAgICAgICogSXMgdGhlIGRvdWJsZSBjZmMxIGluc3RydWN0aW9uIGEgYnVnIGluIHRoZSBtaXBzIGFzc2VtYmxlcjsKLSAgICAgICAqIG9yIGlzIHRoZXJlIGEgcmVhc29uIGZvciBpdD8KLSAgICAgICAqLwotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY2ZjMSIsICJ0LEciLCB0cmVnLCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjZmMxIiwgInQsRyIsIHRyZWcsIDMxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDM7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgIm9yaSIsICJ0LHIsaSIsIEFULCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgQVQsIEFULAotCQkgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImN0YzEiLCAidCxHIiwgQVQsIDMxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkgICAgICBtYXNrID09IE1fVFJVTkNXRCA/ICJjdnQudy5kIiA6ICJjdnQudy5zIiwgIkQsUyIsIGRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY3RjMSIsICJ0LEciLCB0cmVnLCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VTEg6Ci0gICAgICBzID0gImxiIjsKLSAgICAgIGdvdG8gdWxoOwotICAgIGNhc2UgTV9VTEhVOgotICAgICAgcyA9ICJsYnUiOwotICAgIHVsaDoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg3ZmZmKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKLSAgICAgIC8qIGF2b2lkIGxvYWQgZGVsYXkgKi8KLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gMTsKLSAgICAgIGVsc2UKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGJ1IiwgInQsbyhiKSIsIEFULAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLCB0cmVnLCA4KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywgdHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVUxEOgotICAgICAgcyA9ICJsZGwiOwotICAgICAgczIgPSAibGRyIjsKLSAgICAgIG9mZiA9IDc7Ci0gICAgICBnb3RvIHVsdzsKLSAgICBjYXNlIE1fVUxXOgotICAgICAgcyA9ICJsd2wiOwotICAgICAgczIgPSAibHdyIjsKLSAgICAgIG9mZiA9IDM7Ci0gICAgdWx3OgotICAgICAgaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDgwMDAgLSBvZmYpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG92ZXJmbG93IikpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IG9mZjsKLSAgICAgIGVsc2UKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMyLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1VMRF9BOgotICAgICAgcyA9ICJsZGwiOwotICAgICAgczIgPSAibGRyIjsKLSAgICAgIG9mZiA9IDc7Ci0gICAgICBnb3RvIHVsd2E7Ci0gICAgY2FzZSBNX1VMV19BOgotICAgICAgcyA9ICJsd2wiOwotICAgICAgczIgPSAibHdyIjsKLSAgICAgIG9mZiA9IDM7Ci0gICAgdWx3YToKLSAgICAgIGxvYWRfYWRkcmVzcyAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIpOwotICAgICAgaWYgKGJyZWcgIT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICJkLHYsdCIsIEFULCBBVCwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSBvZmY7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMyLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VMSF9BOgotICAgIGNhc2UgTV9VTEhVX0E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJICAgbWFzayA9PSBNX1VMSF9BID8gImxiIiA6ICJsYnUiLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImxidSIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCB0cmVnLAotCQkgICB0cmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VU0g6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4N2ZmZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInNiIiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIEFULCB0cmVnLCA4KTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gMTsKLSAgICAgIGVsc2UKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic2IiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VTRDoKLSAgICAgIHMgPSAic2RsIjsKLSAgICAgIHMyID0gInNkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1c3c7Ci0gICAgY2FzZSBNX1VTVzoKLSAgICAgIHMgPSAic3dsIjsKLSAgICAgIHMyID0gInN3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVzdzoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gb2ZmKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSBvZmY7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9VU0RfQToKLSAgICAgIHMgPSAic2RsIjsKLSAgICAgIHMyID0gInNkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1c3dhOwotICAgIGNhc2UgTV9VU1dfQToKLSAgICAgIHMgPSAic3dsIjsKLSAgICAgIHMyID0gInN3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVzd2E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VU0hfQToKLSAgICAgIGxvYWRfYWRkcmVzcyAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIpOwotICAgICAgaWYgKGJyZWcgIT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICJkLHYsdCIsIEFULCBBVCwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzYiIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3JsIiwgImQsdyw8IiwgdHJlZywKLQkJICAgdHJlZywgOCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNiIiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImxidSIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCB0cmVnLAotCQkgICB0cmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBGSVhNRTogQ2hlY2sgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIGl0YmwgbWFjcm9zLCBzaW5jZSB0aGV5Ci0JIGFyZSBhZGRlZCBkeW5hbWljYWxseS4gKi8KLSAgICAgIGFzX2JhZCAoXygiTWFjcm8gJXMgbm90IGltcGxlbWVudGVkIHlldCIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGlmIChtaXBzX29wdHMubm9hdCkKLSAgICBhc193YXJuIChfKCJNYWNybyB1c2VkICRhdCBhZnRlciBcIi5zZXQgbm9hdFwiIikpOwotfQotCi0vKiBJbXBsZW1lbnQgbWFjcm9zIGluIG1pcHMxNiBtb2RlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9tYWNybyAoaXApCi0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotewotICBpbnQgbWFzazsKLSAgaW50IHhyZWcsIHlyZWcsIHpyZWcsIHRtcDsKLSAgaW50IGljbnQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBpbnQgZGJsOwotICBjb25zdCBjaGFyICpzLCAqczIsICpzMzsKLQotICBtYXNrID0gaXAtPmluc25fbW8tPm1hc2s7Ci0KLSAgeHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKLSAgeXJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlkpICYgTUlQUzE2T1BfTUFTS19SWTsKLSAgenJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKLQotICBpY250ID0gMDsKLQotICBleHByMS5YX29wID0gT19jb25zdGFudDsKLSAgZXhwcjEuWF9vcF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotCi0gIGRibCA9IDA7Ci0KLSAgc3dpdGNoIChtYXNrKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLQotICAgIGNhc2UgTV9ERElWXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9ESVZfMzoKLSAgICAgIHMgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdjM7Ci0gICAgY2FzZSBNX0RSRU1fMzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX1JFTV8zOgotICAgICAgcyA9ICJtZmhpIjsKLSAgICBkb19kaXYzOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZGRpdiIgOiAiZGl2IiwKLQkJICAgIjAseCx5IiwgeHJlZywgeXJlZyk7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmV6IiwgIngscCIsIHlyZWcpOwotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgIjYiLCA3KTsKLSAgICAgIAotICAgICAgLyogRklYTUU6IFRoZSBub3JtYWwgY29kZSBjaGVja3MgZm9yIG9mIC0xIC8gLTB4ODAwMDAwMDAgaGVyZSwKLSAgICAgICAgIHNpbmNlIHRoYXQgY2F1c2VzIGFuIG92ZXJmbG93LiAgV2Ugc2hvdWxkIGRvIHRoYXQgYXMgd2VsbCwKLSAgICAgICAgIGJ1dCBJIGRvbid0IHNlZSBob3cgdG8gZG8gdGhlIGNvbXBhcmlzb25zIHdpdGhvdXQgYSB0ZW1wb3JhcnkKLSAgICAgICAgIHJlZ2lzdGVyLiAgKi8KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgIngiLCB6cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RJVlVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX1JFTVVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RESVZVXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fRFJFTVVfMzoKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgZG9fZGl2dTM6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICIwLHgseSIsIHhyZWcsIHlyZWcpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5leiIsICJ4LHAiLCB5cmVnKTsKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICI2IiwgNyk7Ci0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAieCIsIHpyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE1VTDoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX01VTDoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0dSIgOiAibXVsdHUiLAotCQkgICAieCx5IiwgeHJlZywgeXJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgIngiLCB6cmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9EU1VCVV9JOgotICAgICAgZGJsID0gMTsKLSAgICAgIGdvdG8gZG9fc3VidTsKLSAgICBjYXNlIE1fU1VCVV9JOgotICAgIGRvX3N1YnU6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgIGRibCA/ICJkYWRkaXUiIDogImFkZGl1IiwKLQkJICAgInkseCw0IiwgeXJlZywgeHJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TVUJVX0lfMjoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgImFkZGl1IiwKLQkJICAgIngsayIsIHhyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRFNVQlVfSV8yOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAiZGFkZGl1IiwKLQkJICAgInksaiIsIHlyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVROgotICAgICAgcyA9ICJjbXAiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JORToKLSAgICAgIHMgPSAiY21wIjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoOwotICAgIGNhc2UgTV9CTFQ6Ci0gICAgICBzID0gInNsdCI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxUVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxFOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19yZXZlcnNlX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxFVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBnb3RvIGRvX3JldmVyc2VfYnJhbmNoOwotICAgIGNhc2UgTV9CR0U6Ci0gICAgICBzID0gInNsdCI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdFVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdUOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19yZXZlcnNlX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdUVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0KLSAgICBkb19yZXZlcnNlX2JyYW5jaDoKLSAgICAgIHRtcCA9IHhyZWc7Ci0gICAgICB4cmVnID0geXJlZzsKLSAgICAgIHlyZWcgPSB0bXA7Ci0KLSAgICBkb19icmFuY2g6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCBzLCAieCx5IiwKLQkJICAgeHJlZywgeXJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJwIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CRVFfSToKLSAgICAgIHMgPSAiY21waSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LFUiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQk5FX0k6Ci0gICAgICBzID0gImNtcGkiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgczMgPSAieCxVIjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JMVF9JOgotICAgICAgcyA9ICJzbHRpIjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTFRVX0k6Ci0gICAgICBzID0gInNsdGl1IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTEVfSToKLSAgICAgIHMgPSAic2x0aSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19hZGRvbmVfYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JMRVVfSToKLSAgICAgIHMgPSAic2x0aXUiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYWRkb25lX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CR0VfSToKLSAgICAgIHMgPSAic2x0aSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdFVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdUX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYWRkb25lX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CR1RVX0k6Ci0gICAgICBzID0gInNsdGl1IjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0KLSAgICBkb19hZGRvbmVfYnJhbmNoX2k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICArK2ltbV9leHByLlhfYWRkX251bWJlcjsKLQotICAgIGRvX2JyYW5jaF9pOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsIHMsIHMzLCB4cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInAiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0FCUzoKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGkiLCAieCw4IiwgIHlyZWcpOwotICAgICAgaWYgKHhyZWcgIT0geXJlZykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICJtb3ZlIiwgInksWCIsIHhyZWcsIHlyZWcpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYnRlcXoiLCAicCIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgIm5lZyIsICJ4LHciLCB4cmVnLCB4cmVnKTsKLSAgICB9Ci19Ci0KLS8qIEZvciBjb25zaXN0ZW5jeSBjaGVja2luZywgdmVyaWZ5IHRoYXQgYWxsIGJpdHMgYXJlIHNwZWNpZmllZCBlaXRoZXIKLSAgIGJ5IHRoZSBtYXRjaC9tYXNrIHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGRlZmluaXRpb24sIG9yIGJ5IHRoZQotICAgb3BlcmFuZCBsaXN0LiAgKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX21pcHNfaW5zbiAob3BjKQotICAgICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wYzsKLXsKLSAgY29uc3QgY2hhciAqcCA9IG9wYy0+YXJnczsKLSAgY2hhciBjOwotICB1bnNpZ25lZCBsb25nIHVzZWRfYml0cyA9IG9wYy0+bWFzazsKLQotICBpZiAoKHVzZWRfYml0cyAmIG9wYy0+bWF0Y2gpICE9IG9wYy0+bWF0Y2gpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlIChtYXNrIGVycm9yKTogJXMgJXMiKSwKLQkgICAgICBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0jZGVmaW5lIFVTRV9CSVRTKG1hc2ssc2hpZnQpCSh1c2VkX2JpdHMgfD0gKChtYXNrKSA8PCAoc2hpZnQpKSkKLSAgd2hpbGUgKCpwKQotICAgIHN3aXRjaCAoYyA9ICpwKyspCi0gICAgICB7Ci0gICAgICBjYXNlICcsJzogYnJlYWs7Ci0gICAgICBjYXNlICcoJzogYnJlYWs7Ci0gICAgICBjYXNlICcpJzogYnJlYWs7Ci0gICAgICBjYXNlICc8JzogVVNFX0JJVFMgKE9QX01BU0tfU0hBTVQsCU9QX1NIX1NIQU1UKTsJYnJlYWs7Ci0gICAgICBjYXNlICc+JzoJVVNFX0JJVFMgKE9QX01BU0tfU0hBTVQsCU9QX1NIX1NIQU1UKTsJYnJlYWs7Ci0gICAgICBjYXNlICdBJzogYnJlYWs7Ci0gICAgICBjYXNlICdCJzoJVVNFX0JJVFMgKE9QX01BU0tfU1lTQ0FMTCwJT1BfU0hfU1lTQ0FMTCk7CWJyZWFrOwotICAgICAgY2FzZSAnQyc6CVVTRV9CSVRTIChPUF9NQVNLX0NPUFosCQlPUF9TSF9DT1BaKTsJYnJlYWs7Ci0gICAgICBjYXNlICdEJzoJVVNFX0JJVFMgKE9QX01BU0tfRkQsCQlPUF9TSF9GRCk7CWJyZWFrOwotICAgICAgY2FzZSAnRSc6CVVTRV9CSVRTIChPUF9NQVNLX1JULAkJT1BfU0hfUlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ0YnOiBicmVhazsKLSAgICAgIGNhc2UgJ0cnOglVU0VfQklUUyAoT1BfTUFTS19SRCwJCU9QX1NIX1JEKTsJYnJlYWs7Ci0gICAgICBjYXNlICdJJzogYnJlYWs7Ci0gICAgICBjYXNlICdMJzogYnJlYWs7Ci0gICAgICBjYXNlICdNJzoJVVNFX0JJVFMgKE9QX01BU0tfQ0NDLAkJT1BfU0hfQ0NDKTsJYnJlYWs7Ci0gICAgICBjYXNlICdOJzoJVVNFX0JJVFMgKE9QX01BU0tfQkNDLAkJT1BfU0hfQkNDKTsJYnJlYWs7Ci0gICAgICBjYXNlICdSJzoJVVNFX0JJVFMgKE9QX01BU0tfRlIsCQlPUF9TSF9GUik7CWJyZWFrOwotICAgICAgY2FzZSAnUyc6CVVTRV9CSVRTIChPUF9NQVNLX0ZTLAkJT1BfU0hfRlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ1QnOglVU0VfQklUUyAoT1BfTUFTS19GVCwJCU9QX1NIX0ZUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdWJzoJVVNFX0JJVFMgKE9QX01BU0tfRlMsCQlPUF9TSF9GUyk7CWJyZWFrOwotICAgICAgY2FzZSAnVyc6CVVTRV9CSVRTIChPUF9NQVNLX0ZULAkJT1BfU0hfRlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ2EnOglVU0VfQklUUyAoT1BfTUFTS19UQVJHRVQsCU9QX1NIX1RBUkdFVCk7CWJyZWFrOwotICAgICAgY2FzZSAnYic6CVVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ2MnOglVU0VfQklUUyAoT1BfTUFTS19DT0RFLAkJT1BfU0hfQ09ERSk7CWJyZWFrOwotICAgICAgY2FzZSAnZCc6CVVTRV9CSVRTIChPUF9NQVNLX1JELAkJT1BfU0hfUkQpOwlicmVhazsKLSAgICAgIGNhc2UgJ2YnOiBicmVhazsKLSAgICAgIGNhc2UgJ2gnOglVU0VfQklUUyAoT1BfTUFTS19QUkVGWCwJT1BfU0hfUFJFRlgpOwlicmVhazsKLSAgICAgIGNhc2UgJ2knOglVU0VfQklUUyAoT1BfTUFTS19JTU1FRElBVEUsCU9QX1NIX0lNTUVESUFURSk7IGJyZWFrOwotICAgICAgY2FzZSAnaic6CVVTRV9CSVRTIChPUF9NQVNLX0RFTFRBLAlPUF9TSF9ERUxUQSk7CWJyZWFrOwotICAgICAgY2FzZSAnayc6CVVTRV9CSVRTIChPUF9NQVNLX0NBQ0hFLAlPUF9TSF9DQUNIRSk7CWJyZWFrOwotICAgICAgY2FzZSAnbCc6IGJyZWFrOwotICAgICAgY2FzZSAnbyc6IFVTRV9CSVRTIChPUF9NQVNLX0RFTFRBLAlPUF9TSF9ERUxUQSk7CWJyZWFrOwotICAgICAgY2FzZSAncCc6CVVTRV9CSVRTIChPUF9NQVNLX0RFTFRBLAlPUF9TSF9ERUxUQSk7CWJyZWFrOwotICAgICAgY2FzZSAncSc6CVVTRV9CSVRTIChPUF9NQVNLX0NPREUyLAlPUF9TSF9DT0RFMik7CWJyZWFrOwotICAgICAgY2FzZSAncic6IFVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ3MnOglVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICd0JzoJVVNFX0JJVFMgKE9QX01BU0tfUlQsCQlPUF9TSF9SVCk7CWJyZWFrOwotICAgICAgY2FzZSAndSc6CVVTRV9CSVRTIChPUF9NQVNLX0lNTUVESUFURSwJT1BfU0hfSU1NRURJQVRFKTsgYnJlYWs7Ci0gICAgICBjYXNlICd2JzoJVVNFX0JJVFMgKE9QX01BU0tfUlMsCQlPUF9TSF9SUyk7CWJyZWFrOwotICAgICAgY2FzZSAndyc6CVVTRV9CSVRTIChPUF9NQVNLX1JULAkJT1BfU0hfUlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ3gnOiBicmVhazsKLSAgICAgIGNhc2UgJ3onOiBicmVhazsKLSAgICAgIGNhc2UgJ1AnOiBVU0VfQklUUyAoT1BfTUFTS19QRVJGUkVHLAlPUF9TSF9QRVJGUkVHKTsJYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAodW5rbm93biBvcGVyYW5kIHR5cGUgYCVjJyk6ICVzICVzIiksCi0JCWMsIG9wYy0+bmFtZSwgb3BjLT5hcmdzKTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSN1bmRlZiBVU0VfQklUUwotICBpZiAodXNlZF9iaXRzICE9IDB4ZmZmZmZmZmYpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlIChiaXRzIDB4JWx4IHVuZGVmaW5lZCk6ICVzICVzIiksCi0JICAgICAgfnVzZWRfYml0cyAmIDB4ZmZmZmZmZmYsIG9wYy0+bmFtZSwgb3BjLT5hcmdzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBhc3NlbWJsZXMgYW4gaW5zdHJ1Y3Rpb24gaW50byBpdHMgYmluYXJ5IGZvcm1hdC4gIEFzIGEKLSAgIHNpZGUgZWZmZWN0LCBpdCBzZXRzIG9uZSBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBpbW1fcmVsb2Mgb3IKLSAgIG9mZnNldF9yZWxvYyB0byB0aGUgdHlwZSBvZiByZWxvY2F0aW9uIHRvIGRvIGlmIG9uZSBvZiB0aGUgb3BlcmFuZHMKLSAgIGlzIGFuIGFkZHJlc3MgZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2lwIChzdHIsIGlwKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotewotICBjaGFyICpzOwotICBjb25zdCBjaGFyICphcmdzOwotICBjaGFyIGM7Ci0gIHN0cnVjdCBtaXBzX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBpbnQgcmVnbm87Ci0gIHVuc2lnbmVkIGludCBsYXN0cmVnbm8gPSAwOwotICBjaGFyICpzX3Jlc2V0OwotICBjaGFyIHNhdmVfYyA9IDA7Ci0gIGludCBmdWxsX29wY29kZV9tYXRjaCA9IDE7Ci0KLSAgaW5zbl9lcnJvciA9IE5VTEw7Ci0KLSAgLyogSWYgdGhlIGluc3RydWN0aW9uIGNvbnRhaW5zIGEgJy4nLCB3ZSBmaXJzdCB0cnkgdG8gbWF0Y2ggYW4gaW5zdHJ1Y3Rpb24KLSAgICAgaW5jbHVkaW5nIHRoZSAnLicuICBUaGVuIHdlIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSAnLicuICAqLwotICBpbnNuID0gTlVMTDsKLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpOyArK3MpCi0gICAgY29udGludWU7Ci0KLSAgLyogSWYgd2Ugc3RvcHBlZCBvbiB3aGl0ZXNwYWNlLCB0aGVuIHJlcGxhY2UgdGhlIHdoaXRlc3BhY2Ugd2l0aCBudWxsIGZvcgotICAgICB0aGUgY2FsbCB0byBoYXNoX2ZpbmQuICBTYXZlIHRoZSBjaGFyYWN0ZXIgd2UgcmVwbGFjZWQganVzdCBpbiBjYXNlIHdlCi0gICAgIGhhdmUgdG8gcmUtcGFyc2UgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0gICAgewotICAgICAgc2F2ZV9jID0gKnM7Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICB9Ci0JCi0gIGluc24gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKTsKLQotICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIG9wY29kZSB0YWJsZSwgdHJ5IGFnYWluLCBidXQKLSAgICAgdGhpcyB0aW1lIHdpdGgganVzdCB0aGUgaW5zdHJ1Y3Rpb24gdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nIHRoZQotICAgICBmaXJzdCAnLicuICAqLwotICBpZiAoaW5zbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFJlc3RvcmUgdGhlIGNoYXJhY3RlciB3ZSBvdmVyd3JpdGUgYWJvdmUgKGlmIGFueSkuICAqLyAKLSAgICAgIGlmIChzYXZlX2MpCi0JKigtLXMpID0gc2F2ZV9jOwotCi0gICAgICAvKiBTY2FuIHVwIHRvIHRoZSBmaXJzdCAnLicgb3Igd2hpdGVzcGFjZS4gICovCi0gICAgICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgKnMgIT0gJy4nICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpOyArK3MpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGRpZCBub3QgZmluZCBhICcuJywgdGhlbiB3ZSBjYW4gcXVpdCBub3cuICAqLwotICAgICAgaWYgKCpzICE9ICcuJykKLQl7Ci0JICBpbnNuX2Vycm9yID0gInVucmVjb2duaXplZCBvcGNvZGUiOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogTG9va3VwIHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGlmICgoaW5zbiA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotCXsKLQkgIGluc25fZXJyb3IgPSAidW5yZWNvZ25pemVkIG9wY29kZSI7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBmdWxsX29wY29kZV9tYXRjaCA9IDA7Ci0gICAgfQotCi0gIGFyZ3NTdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgYXNzZXJ0IChzdHJjbXAgKGluc24tPm5hbWUsIHN0cikgPT0gMCk7Ci0KLSAgICAgIGlmIChPUENPREVfSVNfTUVNQkVSIChpbnNuLCBtaXBzX29wdHMuaXNhLCBtaXBzX2NwdSkpCi0Jb2sgPSB0cnVlOwotICAgICAgZWxzZSAKLQlvayA9IGZhbHNlOwotICAgICAgCi0gICAgICBpZiAoaW5zbi0+cGluZm8gIT0gSU5TTl9NQUNSTykKLQl7Ci0JICBpZiAobWlwc19jcHUgPT0gNDY1MCAmJiAoaW5zbi0+cGluZm8gJiBGUF9EKSAhPSAwKQotCSAgICBvayA9IGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgb2spCi0JewotCSAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXQotCSAgICAgICYmIHN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQkgICAgICBzcHJpbnRmIChidWYsIAotCQkgICAgICAgXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3I6ICVkIChNSVBTJWQpIiksCi0JCSAgICAgICBtaXBzX2NwdSwgbWlwc19vcHRzLmlzYSk7Ci0JCSAgICAgICAKLQkgICAgICBpbnNuX2Vycm9yID0gYnVmOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaXAtPmluc25fbW8gPSBpbnNuOwotICAgICAgaXAtPmluc25fb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIGlmICgqcyA9PSAnICcpCi0JICAgICsrczsKLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJywnOgotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBzLS07Ci0JICAgICAgc3dpdGNoICgqKythcmdzKQotCQl7Ci0JCWNhc2UgJ3InOgotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDIxOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ3cnOgotCQljYXNlICdXJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDE2OwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ1YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcoJzoKLQkgICAgICAvKiBIYW5kbGUgb3B0aW9uYWwgYmFzZSByZWdpc3Rlci4KLQkJIEVpdGhlciB0aGUgYmFzZSByZWdpc3RlciBpcyBvbWl0dGVkIG9yCi0JCSB3ZSBtdXN0IGhhdmUgYSBsZWZ0IHBhcmVuLiAqLwotCSAgICAgIC8qIFRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBuZXh0IG9wZXJhbmQgc3BlY2lmaWVyCi0JCSBpcyBhIGJhc2UgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4gICovCi0JICAgICAgYXNzZXJ0IChhcmdzWzFdID09ICdiJyB8fCBhcmdzWzFdID09ICc1JwotCQkgICAgICB8fCBhcmdzWzFdID09ICctJyB8fCBhcmdzWzFdID09ICc0Jyk7Ci0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXJldHVybjsKLQotCSAgICBjYXNlICcpJzoJCS8qIHRoZXNlIG11c3QgbWF0Y2ggZXhhY3RseSAqLwotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc8JzoJCS8qIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0ICovCi0JICAgICAgLyoKLQkgICAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCwgaWYgdGhlIHNoaWZ0IGFtb3VudCBpcyBncmVhdGVyCi0JICAgICAgICogdGhhbiAzMSBvciBsZXNzIHRoYW4gMCB0aGUgdGhlIHNoaWZ0IGFtb3VudCBzaG91bGQgYmUKLQkgICAgICAgKiBtb2QgMzIuIEluIHJlYWxpdHkgdGhlIG1pcHMgYXNzZW1ibGVyIGlzc3VlcyBhbiBlcnJvci4KLQkgICAgICAgKiBXZSBpc3N1ZSBhIHdhcm5pbmcgYW5kIG1hc2sgb3V0IGFsbCBidXQgdGhlIGxvdyA1IGJpdHMuCi0JICAgICAgICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDMxKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW1wcm9wZXIgc2hpZnQgYW1vdW50ICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCA2OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnPic6CQkvKiBzaGlmdCBhbW91bnQgbWludXMgMzIgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMzIKLQkJICB8fCAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gNjMpCi0JCWJyZWFrOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIC0gMzIpIDw8IDY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCi0JICAgIGNhc2UgJ2snOgkJLyogY2FjaGUgY29kZSAqLwotCSAgICBjYXNlICdoJzoJCS8qIHByZWZ4IGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gMzEpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIiksCi0JCQkgICBpcC0+aW5zbl9tby0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDFmOwotCQl9Ci0JICAgICAgaWYgKCphcmdzID09ICdrJykKLQkJaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCBPUF9TSF9DQUNIRTsKLQkgICAgICBlbHNlCi0JCWlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgT1BfU0hfUFJFRlg7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdjJzoJCS8qIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQpIGltbV9leHByLlhfYWRkX251bWJlciA+IDEwMjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbGxlZ2FsIGJyZWFrIGNvZGUgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgMTY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdxJzoJCS8qIGxvd2VyIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQpIGltbV9leHByLlhfYWRkX251bWJlciA+IDEwMjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbGxlZ2FsIGxvd2VyIGJyZWFrIGNvZGUgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0InOgkJLyogc3lzY2FsbCBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAweGZmZmZmKQotCQlhc193YXJuIChfKCJJbGxlZ2FsIHN5c2NhbGwgY29kZSAoJWxkKSIpLAotCQkJIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBjYXNlICdDJzogICAgICAgICAgIC8qIENvcHJvY2Vzc29yIGNvZGUgKi8KLSAgICAgICAgICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLSAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gKDE8PDI1KSkKLQkJewotICAgICAgICAgICAgICAgICAgYXNfd2FybiAoXygiQ29wcm9jY2Vzb3IgY29kZSA+IDI1IGJpdHMgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotICAgICAgICAgICAgICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9ICgoMTw8MjUpIC0gMSk7Ci0JCX0KLSAgICAgICAgICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgICAgICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICAgICAgICAgICAgICBzID0gZXhwcl9lbmQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ1AnOgkJLyogUGVyZm9ybWFuY2UgcmVnaXN0ZXIgKi8KLSAgICAgICAgICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLSAgICAgICAgICAgICAgaWYgKGltbV9leHByLlhfYWRkX251bWJlciAhPSAwICYmIGltbV9leHByLlhfYWRkX251bWJlciAhPSAxKQotCQl7Ci0gICAgICAgICAgICAgICAgICBhc193YXJuIChfKCJJbnZhbGlkYXRlIHBlcmZvcm1hbmNlIHJlZ3N0ZXIgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotICAgICAgICAgICAgICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDE7Ci0JCX0KLSAgICAgICAgICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IChpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgMSk7Ci0gICAgICAgICAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgICAgICAgICAgcyA9IGV4cHJfZW5kOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdiJzoJCS8qIGJhc2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnZCc6CQkvKiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCSAgICBjYXNlICdzJzoJCS8qIHNvdXJjZSByZWdpc3RlciAqLwotCSAgICBjYXNlICd0JzoJCS8qIHRhcmdldCByZWdpc3RlciAqLwotCSAgICBjYXNlICdyJzoJCS8qIGJvdGggdGFyZ2V0IGFuZCBzb3VyY2UgKi8KLQkgICAgY2FzZSAndic6CQkvKiBib3RoIGRlc3QgYW5kIHNvdXJjZSAqLwotCSAgICBjYXNlICd3JzoJCS8qIGJvdGggZGVzdCBhbmQgdGFyZ2V0ICovCi0JICAgIGNhc2UgJ0UnOgkJLyogY29wcm9jZXNzb3IgdGFyZ2V0IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ0cnOgkJLyogY29wcm9jZXNzb3IgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAneCc6CQkvKiBpZ25vcmUgcmVnaXN0ZXIgbmFtZSAqLwotCSAgICBjYXNlICd6JzoJCS8qIG11c3QgYmUgemVybyByZWdpc3RlciAqLwotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChzWzBdID09ICckJykKLQkJewotCi0JCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzWzFdKSkKLQkJICAgIHsKLQkJICAgICAgKytzOwotCQkgICAgICByZWdubyA9IDA7Ci0JCSAgICAgIGRvCi0JCQl7Ci0JCQkgIHJlZ25vICo9IDEwOwotCQkJICByZWdubyArPSAqcyAtICcwJzsKLQkJCSAgKytzOwotCQkJfQotCQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0JCSAgICAgIGlmIChyZWdubyA+IDMxKQotCQkJYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqYXJncyA9PSAnRScgfHwgKmFyZ3MgPT0gJ0cnKQotCQkgICAgZ290byBub3RyZWc7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoc1sxXSA9PSAnZicgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBGUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAncycgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBTUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnZycgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBHUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnYScgJiYgc1syXSA9PSAndCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBBVDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnaycgJiYgc1syXSA9PSAndCcgJiYgc1szXSA9PSAnMCcpCi0JCQl7Ci0JCQkgIHMgKz0gNDsKLQkJCSAgcmVnbm8gPSBLVDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzEnKQotCQkJewotCQkJICBzICs9IDQ7Ci0JCQkgIHJlZ25vID0gS1QxOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChpdGJsX2hhdmVfZW50cmllcykKLQkJCXsKLQkJCSAgY2hhciAqcCwgKm47Ci0JCQkgIHVuc2lnbmVkIGxvbmcgcjsKLQotCQkJICBwID0gcyArIDE7IAkvKiBhZHZhbmNlIHBhc3QgJyQnICovCi0JCQkgIG4gPSBpdGJsX2dldF9maWVsZCAoJnApOyAgLyogbiBpcyBuYW1lICovCi0KLQkJCSAgLyogU2VlIGlmIHRoaXMgaXMgYSByZWdpc3RlciBkZWZpbmVkIGluIGFuCi0JCQkgICAgIGl0YmwgZW50cnkuICAqLwotCQkJICBpZiAoaXRibF9nZXRfcmVnX3ZhbCAobiwgJnIpKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIEdldF9maWVsZCBhZHZhbmNlcyB0byB0aGUgc3RhcnQgb2YKLQkJCQkgdGhlIG5leHQgZmllbGQsIHNvIHdlIG5lZWQgdG8gYmFjawotCQkJCSByYWNrIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZmllbGQuICAqLwotCQkJICAgICAgaWYgKHApIAotCQkJCXMgPSBwIC0gMTsKLQkJCSAgICAgIGVsc2UgCi0JCQkJcyA9IHN0cmNociAocywgJ1wwJyk7Ci0JCQkgICAgICByZWdubyA9IHI7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgZ290byBub3RyZWc7Ci0JCQkgIH0KLQkJICAgICAgZWxzZQotCQkJZ290byBub3RyZWc7Ci0JCSAgICB9Ci0JCSAgaWYgKHJlZ25vID09IEFUCi0JCSAgICAgICYmICEgbWlwc19vcHRzLm5vYXQKLQkJICAgICAgJiYgKmFyZ3MgIT0gJ0UnCi0JCSAgICAgICYmICphcmdzICE9ICdHJykKLQkJICAgIGFzX3dhcm4gKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkJICBjID0gKmFyZ3M7Ci0JCSAgaWYgKCpzID09ICcgJykKLQkJICAgIHMrKzsKLQkJICBpZiAoYXJnc1sxXSAhPSAqcykKLQkJICAgIHsKLQkJICAgICAgaWYgKGMgPT0gJ3InIHx8IGMgPT0gJ3YnIHx8IGMgPT0gJ3cnKQotCQkJewotCQkJICByZWdubyA9IGxhc3RyZWdubzsKLQkJCSAgcyA9IHNfcmVzZXQ7Ci0JCQkgIGFyZ3MrKzsKLQkJCX0KLQkJICAgIH0KLQkJICAvKiAneicgb25seSBtYXRjaGVzICQwLiAgKi8KLQkJICBpZiAoYyA9PSAneicgJiYgcmVnbm8gIT0gMCkKLQkJICAgIGJyZWFrOwotCi0JLyogTm93IHRoYXQgd2UgaGF2ZSBhc3NlbWJsZWQgb25lIG9wZXJhbmQsIHdlIHVzZSB0aGUgYXJncyBzdHJpbmcgCi0JICogdG8gZmlndXJlIG91dCB3aGVyZSBpdCBnb2VzIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQkJICBzd2l0Y2ggKGMpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdyJzoKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgY2FzZSAndic6Ci0JCSAgICBjYXNlICdiJzoKLQkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDIxOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgY2FzZSAnRyc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd3JzoKLQkJICAgIGNhc2UgJ3QnOgotCQkgICAgY2FzZSAnRSc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxNjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd4JzoKLQkJICAgICAgLyogVGhpcyBjYXNlIGV4aXN0cyBiZWNhdXNlIG9uIHRoZSByMzAwMCB0cnVuYwotCQkJIGV4cGFuZHMgaW50byBhIG1hY3JvIHdoaWNoIHJlcXVpcmVzIGEgZ3AKLQkJCSByZWdpc3Rlci4gIE9uIHRoZSByNjAwMCBvciByNDAwMCBpdCBpcwotCQkJIGFzc2VtYmxlZCBpbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uIHdoaWNoCi0JCQkgaWdub3JlcyB0aGUgcmVnaXN0ZXIuICBUaHVzIHRoZSBpbnNuIHZlcnNpb24KLQkJCSBpcyBNSVBTX0lTQTIgYW5kIHVzZXMgJ3gnLCBhbmQgdGhlIG1hY3JvCi0JCQkgdmVyc2lvbiBpcyBNSVBTX0lTQTEgYW5kIHVzZXMgJ3QnLiAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd6JzoKLQkJICAgICAgLyogVGhpcyBjYXNlIGlzIGZvciB0aGUgZGl2IGluc3RydWN0aW9uLCB3aGljaAotCQkJIGFjdHMgZGlmZmVyZW50bHkgaWYgdGhlIGRlc3RpbmF0aW9uIGFyZ3VtZW50Ci0JCQkgaXMgJDAuICBUaGlzIG9ubHkgbWF0Y2hlcyAkMCwgYW5kIGlzIGNoZWNrZWQKLQkJCSBvdXRzaWRlIHRoZSBzd2l0Y2guICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ0QnOgotCQkgICAgICAvKiBJdGJsIG9wZXJhbmQ7IG5vdCB5ZXQgaW1wbGVtZW50ZWQuIEZJWE1FID8/ICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgICAvKiBXaGF0IGFib3V0IGFsbCBvdGhlciBvcGVyYW5kcyBsaWtlICdpJywgd2hpY2gKLQkJCSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBvcGNvZGUgdGFibGU/ICovCi0JCSAgICB9Ci0JCSAgbGFzdHJlZ25vID0gcmVnbm87Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgbm90cmVnOgotCSAgICAgIHN3aXRjaCAoKmFyZ3MrKykKLQkJewotCQljYXNlICdyJzoKLQkJY2FzZSAndic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAyMTsKLQkJICBjb250aW51ZTsKLQkJY2FzZSAndyc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxNjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0QnOgkJLyogZmxvYXRpbmcgcG9pbnQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnUyc6CQkvKiBmbG9hdGluZyBwb2ludCBzb3VyY2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnVCc6CQkvKiBmbG9hdGluZyBwb2ludCB0YXJnZXQgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnUic6CQkvKiBmbG9hdGluZyBwb2ludCBzb3VyY2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnVic6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChzWzBdID09ICckJyAmJiBzWzFdID09ICdmJyAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc1syXSkpCi0JCXsKLQkJICBzICs9IDI7Ci0JCSAgcmVnbm8gPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vICo9IDEwOwotCQkgICAgICByZWdubyArPSAqcyAtICcwJzsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKTsKLQotCQkgIGlmIChyZWdubyA+IDMxKQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIGZsb2F0IHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKLQotCQkgIGlmICgocmVnbm8gJiAxKSAhPSAwCi0JCSAgICAgICYmICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKQotCQkgICAgICAmJiAhIChzdHJjbXAgKHN0ciwgIm10YzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJtZmMxIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAibHdjMSIpID09IDAKLQkJCSAgICB8fCBzdHJjbXAgKHN0ciwgInN3YzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJsLnMiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJzLnMiKSA9PSAwKSkKLQkJICAgIGFzX3dhcm4gKF8oIkZsb2F0IHJlZ2lzdGVyIHNob3VsZCBiZSBldmVuLCB3YXMgJWQiKSwKLQkJCSAgICAgcmVnbm8pOwotCi0JCSAgYyA9ICphcmdzOwotCQkgIGlmICgqcyA9PSAnICcpCi0JCSAgICBzKys7Ci0JCSAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjID09ICdWJyB8fCBjID09ICdXJykKLQkJCXsKLQkJCSAgcmVnbm8gPSBsYXN0cmVnbm87Ci0JCQkgIHMgPSBzX3Jlc2V0OwotCQkJICBhcmdzKys7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgc3dpdGNoIChjKQotCQkgICAgewotCQkgICAgY2FzZSAnRCc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCA2OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1YnOgotCQkgICAgY2FzZSAnUyc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdXJzoKLQkJICAgIGNhc2UgJ1QnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTY7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUic6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAyMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgbGFzdHJlZ25vID0gcmVnbm87Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCi0JICAgICAgc3dpdGNoICgqYXJncysrKQotCQl7Ci0JCWNhc2UgJ1YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTE7Ci0JCSAgY29udGludWU7Ci0JCWNhc2UgJ1cnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTY7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdJJzoKLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fYmlnCi0JCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlpbnNuX2Vycm9yID0gXygiYWJzb2x1dGUgZXhwcmVzc2lvbiByZXF1aXJlZCIpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdBJzoKLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ18zMjsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnRic6Ci0JICAgIGNhc2UgJ0wnOgotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnbCc6Ci0JICAgICAgewotCQlpbnQgZjY0OwotCQljaGFyICpzYXZlX2luOwotCQljaGFyICplcnI7Ci0JCXVuc2lnbmVkIGNoYXIgdGVtcFs4XTsKLQkJaW50IGxlbjsKLQkJdW5zaWduZWQgaW50IGxlbmd0aDsKLQkJc2VnVCBzZWc7Ci0JCXN1YnNlZ1Qgc3Vic2VnOwotCQljaGFyICpwOwotCi0JCS8qIFRoZXNlIG9ubHkgYXBwZWFyIGFzIHRoZSBsYXN0IG9wZXJhbmQgaW4gYW4KLQkJICAgaW5zdHJ1Y3Rpb24sIGFuZCBldmVyeSBpbnN0cnVjdGlvbiB0aGF0IGFjY2VwdHMKLQkJICAgdGhlbSBpbiBhbnkgdmFyaWFudCBhY2NlcHRzIHRoZW0gaW4gYWxsIHZhcmlhbnRzLgotCQkgICBUaGlzIG1lYW5zIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYmFja2luZyBvdXQKLQkJICAgYW55IGNoYW5nZXMgaWYgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoLgotCi0JCSAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB0aGUgc2l6ZSBvZiB0aGUKLQkJICAgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgYW5kIHdoZXJlIGl0IGdvZXMuICBGb3IgJ0YnCi0JCSAgIGFuZCAnTCcgdGhlIGNvbnN0YW50IGlzIDY0IGJpdHM7IGZvciAnZicgYW5kICdsJyBpdAotCQkgICBpcyAzMiBiaXRzLiAgV2hlcmUgdGhlIGNvbnN0YW50IGlzIHBsYWNlZCBpcyBiYXNlZAotCQkgICBvbiBob3cgdGhlIE1JUFMgYXNzZW1ibGVyIGRvZXMgdGhpbmdzOgotCQkgICAgRiAtLSAucmRhdGEKLQkJICAgIEwgLS0gLmxpdDgKLQkJICAgIGYgLS0gaW1tZWRpYXRlIHZhbHVlCi0JCSAgICBsIC0tIC5saXQ0Ci0KLQkJICAgIFRoZSAubGl0NCBhbmQgLmxpdDggc2VjdGlvbnMgYXJlIG9ubHkgdXNlZCBpZgotCQkgICAgcGVybWl0dGVkIGJ5IHRoZSAtRyBhcmd1bWVudC4KLQotCQkgICAgV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSB1c2UgdGhlCi0JCSAgICAubGl0OCBzZWN0aW9uIGJ1dCBub3QgdGhlIC5saXQ0IHNlY3Rpb24gKHdlIGNhbiBkbwotCQkgICAgLmxpdDQgaW5saW5lIGVhc2lseTsgd2UgbmVlZCB0byBwdXQgLmxpdDgKLQkJICAgIHNvbWV3aGVyZSBpbiB0aGUgZGF0YSBzZWdtZW50LCBhbmQgdXNpbmcgLmxpdDgKLQkJICAgIHBlcm1pdHMgdGhlIGxpbmtlciB0byBldmVudHVhbGx5IGNvbWJpbmUgaWRlbnRpY2FsCi0JCSAgICAubGl0OCBlbnRyaWVzKS4gICovCi0KLQkJZjY0ID0gKmFyZ3MgPT0gJ0YnIHx8ICphcmdzID09ICdMJzsKLQotCQlzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCQllcnIgPSBtZF9hdG9mIChmNjQgPyAnZCcgOiAnZicsIChjaGFyICopIHRlbXAsICZsZW4pOwotCQlsZW5ndGggPSBsZW47Ci0JCXMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCWlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0JCWlmIChlcnIgIT0gTlVMTCAmJiAqZXJyICE9ICdcMCcpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJCYWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQ6ICVzIiksIGVycik7Ci0JCSAgICBtZW1zZXQgKHRlbXAsICdcMCcsIHNpemVvZiB0ZW1wKTsKLQkJICAgIGxlbmd0aCA9IGY2NCA/IDggOiA0OwotCQkgIH0KLQotCQlhc3NlcnQgKGxlbmd0aCA9PSAoZjY0ID8gOCA6IDQpKTsKLQotCQlpZiAoKmFyZ3MgPT0gJ2YnCi0JCSAgICB8fCAoKmFyZ3MgPT0gJ2wnCi0JCQkmJiAoISBVU0VfR0xPQkFMX1BPSU5URVJfT1BUCi0JCQkgICAgfHwgbWlwc19waWMgPT0gRU1CRURERURfUElDCi0JCQkgICAgfHwgZ19zd2l0Y2hfdmFsdWUgPCA0Ci0JCQkgICAgfHwgKHRlbXBbMF0gPT0gMCAmJiB0ZW1wWzFdID09IDApCi0JCQkgICAgfHwgKHRlbXBbMl0gPT0gMCAmJiB0ZW1wWzNdID09IDApKSkpCi0JCSAgewotCQkgICAgaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCSAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGwzMiAodGVtcCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRiMzIgKHRlbXApOwotCQkgIH0KLQkJZWxzZSBpZiAobGVuZ3RoID4gNAotCQkJICYmICgodGVtcFswXSA9PSAwICYmIHRlbXBbMV0gPT0gMCkKLQkJCSAgICAgfHwgKHRlbXBbMl0gPT0gMCAmJiB0ZW1wWzNdID09IDApKQotCQkJICYmICgodGVtcFs0XSA9PSAwICYmIHRlbXBbNV0gPT0gMCkKLQkJCSAgICAgfHwgKHRlbXBbNl0gPT0gMCAmJiB0ZW1wWzddID09IDApKSkKLQkJICB7Ci0JCSAgICAvKiBUaGUgdmFsdWUgaXMgc2ltcGxlIGVub3VnaCB0byBsb2FkIHdpdGggYQotICAgICAgICAgICAgICAgICAgICAgICBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLiAgSW4gbWlwczEgbW9kZSwgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgIGltbV9leHByIHRvIHRoZSBoaWdoIG9yZGVyIDMyIGJpdHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF9leHByIHRvIHRoZSBsb3cgb3JkZXIgMzIgYml0cy4KLSAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBzZXQgaW1tX2V4cHIgdG8gdGhlIGVudGlyZSA2NCBiaXQKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQuICAqLwotCQkgICAgaWYgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgewotCQkJaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICB7Ci0JCQkgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGwzMiAodGVtcCArIDQpOwotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsMzIgKHRlbXApOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjMyICh0ZW1wKTsKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjMyICh0ZW1wICsgNCk7Ci0JCQkgIH0KLQkJCWlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQkJCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzaXplb2YgKGltbV9leHByLlhfYWRkX251bWJlcikgPiA0KQotCQkgICAgICB7Ci0JCQlpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDY0ICh0ZW1wKTsKLQkJCWVsc2UKLQkJCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGI2NCAodGVtcCk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaW1tX2V4cHIuWF9vcCA9IE9fYmlnOwotCQkJaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gNDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICB7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMF0gPSBiZmRfZ2V0bDE2ICh0ZW1wKTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVsxXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyAyKTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVsyXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyA0KTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVszXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyA2KTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMF0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgNik7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMV0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgNCk7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMl0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgMik7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bM10gPSBiZmRfZ2V0YjE2ICh0ZW1wKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmV3bmFtZTsKLQkJICAgIHNlZ1QgbmV3X3NlZzsKLQotCQkgICAgLyogU3dpdGNoIHRvIHRoZSByaWdodCBzZWN0aW9uLiAgKi8KLQkJICAgIHNlZyA9IG5vd19zZWc7Ci0JCSAgICBzdWJzZWcgPSBub3dfc3Vic2VnOwotCQkgICAgc3dpdGNoICgqYXJncykKLQkJICAgICAgewotCQkgICAgICBkZWZhdWx0OiAvKiB1bnVzZWQgZGVmYXVsdCBjYXNlIGF2b2lkcyB3YXJuaW5ncy4gICovCi0JCSAgICAgIGNhc2UgJ0wnOgotCQkJbmV3bmFtZSA9IFJEQVRBX1NFQ1RJT05fTkFNRTsKLQkJCWlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUICYmIGdfc3dpdGNoX3ZhbHVlID49IDgpCi0JCQkgIG5ld25hbWUgPSAiLmxpdDgiOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ0YnOgotCQkJbmV3bmFtZSA9IFJEQVRBX1NFQ1RJT05fTkFNRTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdsJzoKLQkJCWFzc2VydCAoIVVTRV9HTE9CQUxfUE9JTlRFUl9PUFQKLQkJCQl8fCBnX3N3aXRjaF92YWx1ZSA+PSA0KTsKLQkJCW5ld25hbWUgPSAiLmxpdDQiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIG5ld19zZWcgPSBzdWJzZWdfbmV3IChuZXduYW1lLCAoc3Vic2VnVCkgMCk7Ci0JCSAgICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbmV3X3NlZywKLQkJCQkJICAgICAoU0VDX0FMTE9DCi0JCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgfCBTRUNfREFUQSkpOwotCQkgICAgZnJhZ19hbGlnbiAoKmFyZ3MgPT0gJ2wnID8gMiA6IDMsIDAsIDApOwotCQkgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkJJiYgc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCQkgICAgICByZWNvcmRfYWxpZ25tZW50IChuZXdfc2VnLCA0KTsKLQkJICAgIGVsc2UKLQkJICAgICAgcmVjb3JkX2FsaWdubWVudCAobmV3X3NlZywgKmFyZ3MgPT0gJ2wnID8gMiA6IDMpOwotCQkgICAgaWYgKHNlZyA9PSBub3dfc2VnKQotCQkgICAgICBhc19iYWQgKF8oIkNhbid0IHVzZSBmbG9hdGluZyBwb2ludCBpbnNuIGluIHRoaXMgc2VjdGlvbiIpKTsKLQotCQkgICAgLyogU2V0IHRoZSBhcmd1bWVudCB0byB0aGUgY3VycmVudCBhZGRyZXNzIGluIHRoZQotCQkgICAgICAgc2VjdGlvbi4gICovCi0JCSAgICBvZmZzZXRfZXhwci5YX29wID0gT19zeW1ib2w7Ci0JCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wgPQotCQkgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwgZnJhZ19ub3cpOwotCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQotCQkgICAgLyogUHV0IHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgaW50byB0aGUgc2VjdGlvbi4gICovCi0JCSAgICBwID0gZnJhZ19tb3JlICgoaW50KSBsZW5ndGgpOwotCQkgICAgbWVtY3B5IChwLCB0ZW1wLCBsZW5ndGgpOwotCi0JCSAgICAvKiBTd2l0Y2ggYmFjayB0byB0aGUgb3JpZ2luYWwgc2VjdGlvbi4gICovCi0JCSAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdpJzoJCS8qIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLQkgICAgY2FzZSAnaic6CQkvKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqLwotCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19MTzE2OwotCSAgICAgIGMgPSBteV9nZXRTbWFsbEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgaWYgKGMgIT0gJ1wwJykKLQkJewotCQkgIGlmIChjICE9ICdsJykKLQkJICAgIHsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJCWltbV9leHByLlhfYWRkX251bWJlciA9Ci0JCQkgIChpbW1fZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQkgICAgICBlbHNlIGlmIChjID09ICdoJykKLQkJCXsKLQkJCSAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0hJMTZfUzsKLQkJCSAgaW1tX3VubWF0Y2hlZF9oaSA9IHRydWU7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweGZmZmY7Ci0JCX0KLQkgICAgICBpZiAoKmFyZ3MgPT0gJ2knKQotCQl7Ci0JCSAgaWYgKChjID09ICdcMCcgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgICB8fCAoKGltbV9leHByLlhfYWRkX251bWJlciA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltbV9leHByLlhfYWRkX251bWJlciA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpKQotCQkgICAgewotCQkgICAgICBpZiAoaW5zbiArIDEgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdICYmCi0JCQkgICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpCi0JCQlicmVhazsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAmJiBpbW1fZXhwci5YX29wICE9IE9fYmlnKQotCQkJaW5zbl9lcnJvciA9IF8oImFic29sdXRlIGV4cHJlc3Npb24gcmVxdWlyZWQiKTsKLQkJICAgICAgZWxzZQotCQkJYXNfYmFkIChfKCIxNiBiaXQgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgMC4uNjU1MzUiKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgbW9yZTsKLQkJICBvZmZzZXRUIG1heDsKLQotCQkgIC8qIFRoZSB1cHBlciBib3VuZCBzaG91bGQgYmUgMHg4MDAwLCBidXQKLQkJICAgICB1bmZvcnR1bmF0ZWx5IHRoZSBNSVBTIGFzc2VtYmxlciBhY2NlcHRzIG51bWJlcnMKLQkJICAgICBmcm9tIDB4ODAwMCB0byAweGZmZmYgYW5kIHNpZ24gZXh0ZW5kcyB0aGVtLCBhbmQKLQkJICAgICB3ZSB3YW50IHRvIGJlIGNvbXBhdGlibGUuICBXZSBvbmx5IHBlcm1pdCB0aGlzCi0JCSAgICAgZXh0ZW5kZWQgcmFuZ2UgZm9yIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90Ci0JCSAgICAgcHJvdmlkZSBhbnkgZnVydGhlciBhbHRlcm5hdGVzLCBzaW5jZSB0aG9zZQotCQkgICAgIGFsdGVybmF0ZXMgbWF5IGhhbmRsZSBvdGhlciBjYXNlcy4gIFBlb3BsZSBzaG91bGQKLQkJICAgICB1c2UgdGhlIG51bWJlcnMgdGhleSBtZWFuLCByYXRoZXIgdGhhbiByZWx5aW5nIG9uCi0JCSAgICAgYSBteXN0ZXJpb3VzIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQkJICBtb3JlID0gKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgotCQkJICBzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkgPT0gMCk7Ci0JCSAgaWYgKG1vcmUpCi0JCSAgICBtYXggPSAweDgwMDA7Ci0JCSAgZWxzZQotCQkgICAgbWF4ID0gMHgxMDAwMDsKLQkJICBpZiAoKGMgPT0gJ1wwJyAmJiBpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICAgIHx8ICgoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IG1heCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgICB8fCAobW9yZQotCQkJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwCi0JCQkgICYmIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkKLQkJCSAgJiYgaW1tX2V4cHIuWF91bnNpZ25lZAotCQkJICAmJiBzaXplb2YgKGltbV9leHByLlhfYWRkX251bWJlcikgPD0gNCkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChtb3JlKQotCQkJYnJlYWs7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2JpZykKLQkJCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7Ci0JCSAgICAgIGVsc2UKLQkJCWFzX2JhZCAoXygiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIC0zMjc2OC4uMzI3NjciKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnbyc6CQkvKiAxNiBiaXQgb2Zmc2V0ICovCi0JICAgICAgYyA9IG15X2dldFNtYWxsRXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQotCSAgICAgIC8qIElmIHRoaXMgdmFsdWUgd29uJ3QgZml0IGludG8gYSAxNiBiaXQgb2Zmc2V0LCB0aGVuIGdvCi0JCSBmaW5kIGEgbWFjcm8gdGhhdCB3aWxsIGdlbmVyYXRlIHRoZSAzMiBiaXQgb2Zmc2V0Ci0JCSBjb2RlIHBhdHRlcm4uICBBcyBhIHNwZWNpYWwgaGFjaywgd2UgYWNjZXB0IHRoZQotCQkgZGlmZmVyZW5jZSBvZiB0d28gbG9jYWwgc3ltYm9scyBhcyBhIGNvbnN0YW50LiAgVGhpcwotCQkgaXMgcmVxdWlyZWQgdG8gc3VwcG9zZSBlbWJlZGRlZCBQSUMgc3dpdGNoZXMsIHdoaWNoCi0JCSB1c2UgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggbG9va3MgbGlrZQotCQkgICAgIGx3ICQ0LCRMMTItJExTMTIoJDQpCi0JCSBUaGUgcHJvYmxlbSB3aXRoIGhhbmRsaW5nIHRoaXMgaW4gYSBtb3JlIGdlbmVyYWwKLQkJIGZhc2hpb24gaXMgdGhhdCB0aGUgbWFjcm8gZnVuY3Rpb24gZG9lc24ndCBleHBlY3QgdG8KLQkJIHNlZSBhbnl0aGluZyB3aGljaCBjYW4gYmUgaGFuZGxlZCBpbiBhIHNpbmdsZQotCQkgY29uc3RhbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChjID09IDAKLQkJICAmJiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCSAgICAgIHx8IG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDgwMDAKLQkJICAgICAgfHwgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCkKLQkJICAmJiAobWlwc19waWMgIT0gRU1CRURERURfUElDCi0JCSAgICAgIHx8IG9mZnNldF9leHByLlhfb3AgIT0gT19zdWJ0cmFjdAotCQkgICAgICB8fCBub3dfc2VnICE9IHRleHRfc2VjdGlvbgotCQkgICAgICB8fCAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JCQkgICE9IHRleHRfc2VjdGlvbikpKQotCQlicmVhazsKLQotCSAgICAgIGlmIChjID09ICdoJyB8fCBjID09ICdIJykKLQkJewotCQkgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICBicmVhazsKLQkJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPQotCQkgICAgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0JCX0KLQkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAncCc6CQkvKiBwYyByZWxhdGl2ZSBvZmZzZXQgKi8KLQkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfMTZfUENSRUxfUzI7Ci0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAndSc6CQkvKiB1cHBlciAxNiBiaXRzICovCi0JICAgICAgYyA9IG15X2dldFNtYWxsRXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKLQkgICAgICBpZiAoYykKLQkJewotCQkgIGlmIChjICE9ICdsJykKLQkJICAgIHsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJCWltbV9leHByLlhfYWRkX251bWJlciA9Ci0JCQkgIChpbW1fZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQkgICAgICBlbHNlIGlmIChjID09ICdoJykKLQkJCXsKLQkJCSAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0hJMTZfUzsKLQkJCSAgaW1tX3VubWF0Y2hlZF9oaSA9IHRydWU7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweGZmZmY7Ci0JCX0KLQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgJiYgKGltbV9leHByLlhfYWRkX251bWJlciA8IDAKLQkJICAgICAgfHwgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDB4MTAwMDApKQotCQlhc19iYWQgKF8oImx1aSBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAwLi42NTUzNSIpKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYSc6CQkvKiAyNiBiaXQgYWRkcmVzcyAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTX0pNUDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdOJzoJCS8qIDMgYml0IGJyYW5jaCBjb25kaXRpb24gY29kZSAqLwotCSAgICBjYXNlICdNJzoJCS8qIDMgYml0IGNvbXBhcmUgY29uZGl0aW9uIGNvZGUgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiRmY2MiLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgcmVnbm8gPSAwOwotCSAgICAgIGRvCi0JCXsKLQkJICByZWdubyAqPSAxMDsKLQkJICByZWdubyArPSAqcyAtICcwJzsKLQkJICArK3M7Ci0JCX0KLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0JICAgICAgaWYgKHJlZ25vID4gNykKLQkJYXNfYmFkIChfKCJpbnZhbGlkIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyICRmY2MlZCIpLCByZWdubyk7Ci0JICAgICAgaWYgKCphcmdzID09ICdOJykKLQkJaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE9QX1NIX0JDQzsKLQkgICAgICBlbHNlCi0JCWlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBPUF9TSF9DQ0M7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgY2hhciA9ICclYydcbiIpLCAqYXJncyk7Ci0JICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogQXJncyBkb24ndCBtYXRjaC4gICovCi0gICAgICBpZiAoaW5zbiArIDEgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdICYmCi0JICAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCXsKLQkgICsraW5zbjsKLQkgIHMgPSBhcmdzU3RhcnQ7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpbnNuX2Vycm9yID0gXygiaWxsZWdhbCBvcGVyYW5kcyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIGFzc2VtYmxlcyBhbiBpbnN0cnVjdGlvbiBpbnRvIGl0cyBiaW5hcnkgZm9ybWF0IHdoZW4KLSAgIGFzc2VtYmxpbmcgZm9yIHRoZSBtaXBzMTYuICBBcyBhIHNpZGUgZWZmZWN0LCBpdCBzZXRzIG9uZSBvZiB0aGUKLSAgIGdsb2JhbCB2YXJpYWJsZXMgaW1tX3JlbG9jIG9yIG9mZnNldF9yZWxvYyB0byB0aGUgdHlwZSBvZgotICAgcmVsb2NhdGlvbiB0byBkbyBpZiBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIGFuIGFkZHJlc3MgZXhwcmVzc2lvbi4KLSAgIEl0IGFsc28gc2V0cyBtaXBzMTZfc21hbGwgYW5kIG1pcHMxNl9leHQgaWYgdGhlIHVzZXIgZXhwbGljaXRseQotICAgcmVxdWVzdGVkIGEgc21hbGwgb3IgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwczE2X2lwIChzdHIsIGlwKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotewotICBjaGFyICpzOwotICBjb25zdCBjaGFyICphcmdzOwotICBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NzdGFydDsKLSAgdW5zaWduZWQgaW50IHJlZ25vOwotICB1bnNpZ25lZCBpbnQgbGFzdHJlZ25vID0gMDsKLSAgY2hhciAqc19yZXNldDsKLQotICBpbnNuX2Vycm9yID0gTlVMTDsKLQotICBtaXBzMTZfc21hbGwgPSBmYWxzZTsKLSAgbWlwczE2X2V4dCA9IGZhbHNlOwotCi0gIGZvciAocyA9IHN0cjsgaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotICAgIDsKLSAgc3dpdGNoICgqcykKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIGlmIChzWzFdID09ICd0JyAmJiBzWzJdID09ICcgJykKLQl7Ci0JICAqcyA9ICdcMCc7Ci0JICBtaXBzMTZfc21hbGwgPSB0cnVlOwotCSAgcyArPSAzOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnZScgJiYgc1syXSA9PSAnICcpCi0JewotCSAgKnMgPSAnXDAnOwotCSAgbWlwczE2X2V4dCA9IHRydWU7Ci0JICBzICs9IDM7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnNuX2Vycm9yID0gXygidW5rbm93biBvcGNvZGUiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfb3B0cy5ub2F1dG9leHRlbmQgJiYgISBtaXBzMTZfZXh0KQotICAgIG1pcHMxNl9zbWFsbCA9IHRydWU7Ci0KLSAgaWYgKChpbnNuID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG1pcHMxNl9vcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluc25fZXJyb3IgPSBfKCJ1bnJlY29nbml6ZWQgb3Bjb2RlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFyZ3NzdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgYXNzZXJ0IChzdHJjbXAgKGluc24tPm5hbWUsIHN0cikgPT0gMCk7Ci0KLSAgICAgIGlwLT5pbnNuX21vID0gaW5zbjsKLSAgICAgIGlwLT5pbnNuX29wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgaXAtPnVzZV9leHRlbmQgPSBmYWxzZTsKLSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBvZmZzZXRfZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczsgMTsgKythcmdzKQotCXsKLQkgIGludCBjOwotCi0JICBpZiAoKnMgPT0gJyAnKQotCSAgICArK3M7Ci0KLQkgIC8qIEluIHRoaXMgc3dpdGNoIHN0YXRlbWVudCB3ZSBjYWxsIGJyZWFrIGlmIHdlIGRpZCBub3QgZmluZAotICAgICAgICAgICAgIGEgbWF0Y2gsIGNvbnRpbnVlIGlmIHdlIGRpZCBmaW5kIGEgbWF0Y2gsIG9yIHJldHVybiBpZiB3ZQotICAgICAgICAgICAgIGFyZSBkb25lLiAgKi8KLQotCSAgYyA9ICphcmdzOwotCSAgc3dpdGNoIChjKQotCSAgICB7Ci0JICAgIGNhc2UgJ1wwJzoKLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJewotCQkgIC8qIFN0dWZmIHRoZSBpbW1lZGlhdGUgdmFsdWUgaW4gbm93LCBpZiB3ZSBjYW4uICAqLwotCQkgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkJICAgICAgJiYgaW1tX3JlbG9jID4gQkZEX1JFTE9DX1VOVVNFRAotCQkgICAgICAmJiBpbnNuLT5waW5mbyAhPSBJTlNOX01BQ1JPKQotCQkgICAgewotCQkgICAgICBtaXBzMTZfaW1tZWQgKChjaGFyICopIE5VTEwsIDAsCi0JCQkJICAgIGltbV9yZWxvYyAtIEJGRF9SRUxPQ19VTlVTRUQsCi0JCQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciwgdHJ1ZSwgbWlwczE2X3NtYWxsLAotCQkJCSAgICBtaXBzMTZfZXh0LCAmaXAtPmluc25fb3Bjb2RlLAotCQkJCSAgICAmaXAtPnVzZV9leHRlbmQsICZpcC0+ZXh0ZW5kKTsKLQkJICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCQkgICAgfQotCi0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnLCc6Ci0JICAgICAgaWYgKCpzKysgPT0gYykKLQkJY29udGludWU7Ci0JICAgICAgcy0tOwotCSAgICAgIHN3aXRjaCAoKisrYXJncykKLQkJewotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JYOwotCQkgIGNvbnRpbnVlOwotCQljYXNlICd3JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JZOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKCc6Ci0JICAgIGNhc2UgJyknOgotCSAgICAgIGlmICgqcysrID09IGMpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3YnOgotCSAgICBjYXNlICd3JzoKLQkgICAgICBpZiAoc1swXSAhPSAnJCcpCi0JCXsKLQkJICBpZiAoYyA9PSAndicpCi0JCSAgICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JYOwotCQkgIGVsc2UKLQkJICAgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgTUlQUzE2T1BfU0hfUlk7Ci0JCSAgKythcmdzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ3knOgotCSAgICBjYXNlICd6JzoKLQkgICAgY2FzZSAnWic6Ci0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICdTJzoKLQkgICAgY2FzZSAnUic6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICdZJzoKLQkgICAgICBpZiAoc1swXSAhPSAnJCcpCi0JCWJyZWFrOwotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc1sxXSkpCi0JCXsKLQkJICArK3M7Ci0JCSAgcmVnbm8gPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vICo9IDEwOwotCQkgICAgICByZWdubyArPSAqcyAtICcwJzsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKTsKLQkJICBpZiAocmVnbm8gPiAzMSkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKLQkJICAgICAgcmVnbm8gPSAyOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHNbMV0gPT0gJ2YnICYmIHNbMl0gPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIHJlZ25vID0gRlA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAncycgJiYgc1syXSA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgcmVnbm8gPSBTUDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzWzFdID09ICdnJyAmJiBzWzJdID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICByZWdubyA9IEdQOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2EnICYmIHNbMl0gPT0gJ3QnKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIHJlZ25vID0gQVQ7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnaycgJiYgc1syXSA9PSAndCcgJiYgc1szXSA9PSAnMCcpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gNDsKLQkJICAgICAgcmVnbm8gPSBLVDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnaycgJiYgc1syXSA9PSAndCcgJiYgc1szXSA9PSAnMScpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gNDsKLQkJICAgICAgcmVnbm8gPSBLVDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCSsrczsKLQkgICAgICBpZiAoYXJnc1sxXSAhPSAqcykKLQkJewotCQkgIGlmIChjID09ICd2JyB8fCBjID09ICd3JykKLQkJICAgIHsKLQkJICAgICAgcmVnbm8gPSBtaXBzMTZfdG9fMzJfcmVnX21hcFtsYXN0cmVnbm9dOwotCQkgICAgICBzID0gc19yZXNldDsKLQkJICAgICAgYXJncysrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzd2l0Y2ggKGMpCi0JCXsKLQkJY2FzZSAneCc6Ci0JCWNhc2UgJ3knOgotCQljYXNlICd6JzoKLQkJY2FzZSAndic6Ci0JCWNhc2UgJ3cnOgotCQljYXNlICdaJzoKLQkJICByZWdubyA9IG1pcHMzMl90b18xNl9yZWdfbWFwW3JlZ25vXTsKLQkJICBicmVhazsKLQotCQljYXNlICcwJzoKLQkJICBpZiAocmVnbm8gIT0gMCkKLQkJICAgIHJlZ25vID0gSUxMRUdBTF9SRUc7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUyc6Ci0JCSAgaWYgKHJlZ25vICE9IFNQKQotCQkgICAgcmVnbm8gPSBJTExFR0FMX1JFRzsKLQkJICBicmVhazsKLQotCQljYXNlICdSJzoKLQkJICBpZiAocmVnbm8gIT0gUkEpCi0JCSAgICByZWdubyA9IElMTEVHQUxfUkVHOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1gnOgotCQljYXNlICdZJzoKLQkJICBpZiAocmVnbm8gPT0gQVQgJiYgISBtaXBzX29wdHMubm9hdCkKLQkJICAgIGFzX3dhcm4gKF8oInVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGludGVybmFsRXJyb3IgKCk7Ci0JCX0KLQotCSAgICAgIGlmIChyZWdubyA9PSBJTExFR0FMX1JFRykKLQkJYnJlYWs7Ci0KLQkgICAgICBzd2l0Y2ggKGMpCi0JCXsKLQkJY2FzZSAneCc6Ci0JCWNhc2UgJ3YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SWDsKLQkJICBicmVhazsKLQkJY2FzZSAneSc6Ci0JCWNhc2UgJ3cnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SWTsKLQkJICBicmVhazsKLQkJY2FzZSAneic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JaOwotCQkgIGJyZWFrOwotCQljYXNlICdaJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfTU9WRTMyWjsKLQkJY2FzZSAnMCc6Ci0JCWNhc2UgJ1MnOgotCQljYXNlICdSJzoKLQkJICBicmVhazsKLQkJY2FzZSAnWCc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JFR1IzMjsKLQkJICBicmVhazsKLQkJY2FzZSAnWSc6Ci0JCSAgcmVnbm8gPSAoKHJlZ25vICYgNykgPDwgMikgfCAoKHJlZ25vICYgMHgxOCkgPj4gMyk7Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JFRzMyUjsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBpbnRlcm5hbEVycm9yICgpOwotCQl9Ci0KLQkgICAgICBsYXN0cmVnbm8gPSByZWdubzsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdQJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiRwYyIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc8JzoKLQkgICAgY2FzZSAnPic6Ci0JICAgIGNhc2UgJ1snOgotCSAgICBjYXNlICddJzoKLQkgICAgY2FzZSAnNCc6Ci0JICAgIGNhc2UgJzUnOgotCSAgICBjYXNlICdIJzoKLQkgICAgY2FzZSAnVyc6Ci0JICAgIGNhc2UgJ0QnOgotCSAgICBjYXNlICdqJzoKLQkgICAgY2FzZSAnOCc6Ci0JICAgIGNhc2UgJ1YnOgotCSAgICBjYXNlICdDJzoKLQkgICAgY2FzZSAnVSc6Ci0JICAgIGNhc2UgJ2snOgotCSAgICBjYXNlICdLJzoKLQkgICAgICBpZiAoc1swXSA9PSAnJScKLQkJICAmJiBzdHJuY21wIChzICsgMSwgImdwcmVsKCIsIHNpemVvZiAiZ3ByZWwoIiAtIDEpID09IDApCi0JCXsKLQkJICAvKiBUaGlzIGlzICVncHJlbChTWU1CT0wpLiAgV2UgbmVlZCB0byByZWFkIFNZTUJPTCwKLSAgICAgICAgICAgICAgICAgICAgIGFuZCBnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgcmVsb2MuICBJZiB0aGUgdGV4dAotICAgICAgICAgICAgICAgICAgICAgaW5zaWRlICVncHJlbCBpcyBub3QgYSBzeW1ib2wgbmFtZSB3aXRoIGFuCi0gICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBvZmZzZXQsIHRoZW4gd2UgZ2VuZXJhdGUgYSBub3JtYWwgcmVsb2MKLSAgICAgICAgICAgICAgICAgICAgIGFuZCB3aWxsIHByb2JhYmx5IGZhaWwgbGF0ZXIuICAqLwotCQkgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyArIHNpemVvZiAiJWdwcmVsIiAtIDEpOwotCQkgIGlmIChpbW1fZXhwci5YX29wID09IE9fc3ltYm9sKQotCQkgICAgewotCQkgICAgICBtaXBzMTZfZXh0ID0gdHJ1ZTsKLQkJICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX01JUFMxNl9HUFJFTDsKLQkJICAgICAgcyA9IGV4cHJfZW5kOwotCQkgICAgICBpcC0+dXNlX2V4dGVuZCA9IHRydWU7Ci0JCSAgICAgIGlwLT5leHRlbmQgPSAwOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEp1c3QgcGljayB1cCBhIG5vcm1hbCBleHByZXNzaW9uLiAgKi8KLQkJICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCQl9Ci0KLQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX3JlZ2lzdGVyKQotCQl7Ci0JCSAgLyogV2hhdCB3ZSB0aG91Z2h0IHdhcyBhbiBleHByZXNzaW9uIHR1cm5lZCBvdXQgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlIGEgcmVnaXN0ZXIuICAqLwotCi0JCSAgaWYgKHNbMF0gPT0gJygnICYmIGFyZ3NbMV0gPT0gJygnKQotCQkgICAgewotCQkgICAgICAvKiBJdCBsb29rcyBsaWtlIHRoZSBleHByZXNzaW9uIHdhcyBvbWl0dGVkCi0JCQkgYmVmb3JlIGEgcmVnaXN0ZXIgaW5kaXJlY3Rpb24sIHdoaWNoIG1lYW5zCi0JCQkgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcyBpbXBsaWNpdGx5IHplcm8uICBXZQotCQkJIHN0aWxsIHNldCB1cCBpbW1fZXhwciwgc28gdGhhdCB3ZSBoYW5kbGUKLQkJCSBleHBsaWNpdCBleHRlbnNpb25zIGNvcnJlY3RseS4gICovCi0JCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQkgICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCQkgICAgICBpbW1fcmVsb2MgPSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEICsgYzsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgLyogV2UgbmVlZCB0byByZWxheCB0aGlzIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpbW1fcmVsb2MgPSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEICsgYzsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAncCc6Ci0JICAgIGNhc2UgJ3EnOgotCSAgICBjYXNlICdBJzoKLQkgICAgY2FzZSAnQic6Ci0JICAgIGNhc2UgJ0UnOgotCSAgICAgIC8qIFdlIHVzZSBvZmZzZXRfcmVsb2MgcmF0aGVyIHRoYW4gaW1tX3JlbG9jIGZvciB0aGUgUEMKLSAgICAgICAgICAgICAgICAgcmVsYXRpdmUgb3BlcmFuZHMuICBUaGlzIGxldHMgbWFjcm9zIHdpdGggYm90aAotICAgICAgICAgICAgICAgICBpbW1lZGlhdGUgYW5kIGFkZHJlc3Mgb3BlcmFuZHMgd29yayBjb3JyZWN0bHkuICAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0KLQkgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3JlZ2lzdGVyKQotCQlicmVhazsKLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gcmVsYXggdGhpcyBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgb2Zmc2V0X3JlbG9jID0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJzYnOgkJLyogYnJlYWsgY29kZSAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiA2MykKLQkJewotCQkgIGFzX3dhcm4gKF8oIkludmFsaWQgdmFsdWUgZm9yIGAlcycgKCVsdSkiKSwKLQkJCSAgIGlwLT5pbnNuX21vLT5uYW1lLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlcik7Ci0JCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDB4M2Y7Ci0JCX0KLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IE1JUFMxNk9QX1NIX0lNTTY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdhJzoJCS8qIDI2IGJpdCBhZGRyZXNzICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX01JUFMxNl9KTVA7Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIDw8PSAxNjsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdsJzoJCS8qIHJlZ2lzdGVyIGxpc3QgZm9yIGVudHJ5IG1hY3JvICovCi0JICAgIGNhc2UgJ0wnOgkJLyogcmVnaXN0ZXIgbGlzdCBmb3IgZXhpdCBtYWNybyAqLwotCSAgICAgIHsKLQkJaW50IG1hc2s7Ci0KLQkJaWYgKGMgPT0gJ2wnKQotCQkgIG1hc2sgPSAwOwotCQllbHNlCi0JCSAgbWFzayA9IDcgPDwgMzsKLQkJd2hpbGUgKCpzICE9ICdcMCcpCi0JCSAgewotCQkgICAgaW50IGZyZWcsIHJlZzEsIHJlZzI7Ci0KLQkJICAgIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJywnKQotCQkgICAgICArK3M7Ci0JCSAgICBpZiAoKnMgIT0gJyQnKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oImNhbid0IHBhcnNlIHJlZ2lzdGVyIGxpc3QiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgKytzOwotCQkgICAgaWYgKCpzICE9ICdmJykKLQkJICAgICAgZnJlZyA9IDA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWZyZWcgPSAxOwotCQkJKytzOwotCQkgICAgICB9Ci0JCSAgICByZWcxID0gMDsKLQkJICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkgICAgICB7Ci0JCQlyZWcxICo9IDEwOwotCQkJcmVnMSArPSAqcyAtICcwJzsKLQkJCSsrczsKLQkJICAgICAgfQotCQkgICAgaWYgKCpzID09ICcgJykKLQkJICAgICAgKytzOwotCQkgICAgaWYgKCpzICE9ICctJykKLQkJICAgICAgcmVnMiA9IHJlZzE7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCSsrczsKLQkJCWlmICgqcyAhPSAnJCcpCi0JCQkgIGJyZWFrOwotCQkJKytzOwotCQkJaWYgKGZyZWcpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJ2YnKQotCQkJICAgICAgKytzOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlhc19iYWQgKF8oImludmFsaWQgcmVnaXN0ZXIgbGlzdCIpKTsKLQkJCQlicmVhazsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJcmVnMiA9IDA7Ci0JCQl3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJCSAgewotCQkJICAgIHJlZzIgKj0gMTA7Ci0JCQkgICAgcmVnMiArPSAqcyAtICcwJzsKLQkJCSAgICArK3M7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgaWYgKGZyZWcgJiYgcmVnMSA9PSAwICYmIHJlZzIgPT0gMCAmJiBjID09ICdMJykKLQkJICAgICAgewotCQkJbWFzayAmPSB+ICg3IDw8IDMpOwotCQkJbWFzayB8PSA1IDw8IDM7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGZyZWcgJiYgcmVnMSA9PSAwICYmIHJlZzIgPT0gMSAmJiBjID09ICdMJykKLQkJICAgICAgewotCQkJbWFzayAmPSB+ICg3IDw8IDMpOwotCQkJbWFzayB8PSA2IDw8IDM7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHJlZzEgPT0gNCAmJiByZWcyID49IDQgJiYgcmVnMiA8PSA3ICYmIGMgIT0gJ0wnKQotCQkgICAgICBtYXNrIHw9IChyZWcyIC0gMykgPDwgMzsKLQkJICAgIGVsc2UgaWYgKHJlZzEgPT0gMTYgJiYgcmVnMiA+PSAxNiAmJiByZWcyIDw9IDE3KQotCQkgICAgICBtYXNrIHw9IChyZWcyIC0gMTUpIDw8IDE7Ci0JCSAgICBlbHNlIGlmIChyZWcxID09IDMxICYmIHJlZzIgPT0gMzEpCi0JCSAgICAgIG1hc2sgfD0gMTsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkJLyogVGhlIG1hc2sgaXMgZmlsbGVkIGluIGluIHRoZSBvcGNvZGUgdGFibGUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgIGJlbmVmaXQgb2YgdGhlIGRpc2Fzc2VtYmxlci4gIFdlIHJlbW92ZSBpdCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICBhcHBseWluZyB0aGUgYWN0dWFsIG1hc2suICAqLwotCQlpcC0+aW5zbl9vcGNvZGUgJj0gfiAoKDcgPDwgMykgPDwgTUlQUzE2T1BfU0hfSU1NNik7Ci0JCWlwLT5pbnNuX29wY29kZSB8PSBtYXNrIDw8IE1JUFMxNk9QX1NIX0lNTTY7Ci0JICAgICAgfQotCSAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdlJzoJCS8qIGV4dGVuZCBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDB4N2ZmKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIpLAotCQkJICAgaXAtPmluc25fbW8tPm5hbWUsCi0JCQkgICAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHg3ZmY7Ci0JCX0KLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBpbnRlcm5hbEVycm9yICgpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHMxNl9vcGNvZGVzW2JmZF9taXBzMTZfbnVtX29wY29kZXNdICYmCi0JICBzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkgPT0gMCkKLQl7Ci0JICArK2luc247Ci0JICBzID0gYXJnc3N0YXJ0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpbnNuX2Vycm9yID0gXygiaWxsZWdhbCBvcGVyYW5kcyIpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiB3ZSBrbm93IGFib3V0IGEgbWlwczE2IGltbWVkaWF0ZQotICAgYXJndW1lbnQgdHlwZS4gICovCi0KLXN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZAotewotICAvKiBUaGUgdHlwZSBjb2RlIHVzZWQgaW4gdGhlIGFyZ3VtZW50IHN0cmluZyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaW50IHR5cGU7Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgc2hvcnQgZm9ybSBvZiB0aGUgb3Bjb2RlLiAgKi8KLSAgaW50IG5iaXRzOwotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGV4dGVuZGVkIGZvcm0gb2YgdGhlIG9wY29kZS4gICovCi0gIGludCBleHRiaXRzOwotICAvKiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzaG9ydCBmb3JtIGlzIHNoaWZ0ZWQgd2hlbiBpdCBpcyB1c2VkOwotICAgICBmb3IgZXhhbXBsZSwgdGhlIHN3IGluc3RydWN0aW9uIGhhcyBhIHNoaWZ0IGNvdW50IG9mIDIuICAqLwotICBpbnQgc2hpZnQ7Ci0gIC8qIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHNob3J0IGZvcm0gaXMgc2hpZnRlZCB3aGVuIGl0IGlzIHN0b3JlZAotICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbiBjb2RlLiAgKi8KLSAgaW50IG9wX3NoaWZ0OwotICAvKiBOb24temVybyBpZiB0aGUgc2hvcnQgZm9ybSBpcyB1bnNpZ25lZC4gICovCi0gIGludCB1bnNwOwotICAvKiBOb24temVybyBpZiB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1bnNpZ25lZC4gICovCi0gIGludCBleHR1OwotICAvKiBOb24temVybyBpZiB0aGUgdmFsdWUgaXMgUEMgcmVsYXRpdmUuICAqLwotICBpbnQgcGNyZWw7Ci19OwotCi0vKiBUaGUgbWlwczE2IGltbWVkaWF0ZSBvcGVyYW5kIHR5cGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCBtaXBzMTZfaW1tZWRfb3BlcmFuZHNbXSA9Ci17Ci0gIHsgJzwnLCAgMywgIDUsIDAsIE1JUFMxNk9QX1NIX1JaLCAgIDEsIDEsIDAgfSwKLSAgeyAnPicsICAzLCAgNSwgMCwgTUlQUzE2T1BfU0hfUlgsICAgMSwgMSwgMCB9LAotICB7ICdbJywgIDMsICA2LCAwLCBNSVBTMTZPUF9TSF9SWiwgICAxLCAxLCAwIH0sCi0gIHsgJ10nLCAgMywgIDYsIDAsIE1JUFMxNk9QX1NIX1JYLCAgIDEsIDEsIDAgfSwKLSAgeyAnNCcsICA0LCAxNSwgMCwgTUlQUzE2T1BfU0hfSU1NNCwgMCwgMCwgMCB9LAotICB7ICc1JywgIDUsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCi0gIHsgJ0gnLCAgNSwgMTYsIDEsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDAgfSwKLSAgeyAnVycsICA1LCAxNiwgMiwgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMCB9LAotICB7ICdEJywgIDUsIDE2LCAzLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCi0gIHsgJ2onLCAgNSwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTUsIDAsIDAsIDAgfSwKLSAgeyAnOCcsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMCwgMCB9LAotICB7ICdWJywgIDgsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAwLCAwIH0sCi0gIHsgJ0MnLCAgOCwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDAgfSwKLSAgeyAnVScsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMSwgMCB9LAotICB7ICdrJywgIDgsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAwIH0sCi0gIHsgJ0snLCAgOCwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTgsIDAsIDAsIDAgfSwKLSAgeyAncCcsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMCwgMCwgMSB9LAotICB7ICdxJywgMTEsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAxIH0sCi0gIHsgJ0EnLCAgOCwgMTYsIDIsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDEgfSwKLSAgeyAnQicsICA1LCAxNiwgMywgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMSB9LAotICB7ICdFJywgIDUsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAxIH0KLX07Ci0KLSNkZWZpbmUgTUlQUzE2X05VTV9JTU1FRCBcCi0gIChzaXplb2YgbWlwczE2X2ltbWVkX29wZXJhbmRzIC8gc2l6ZW9mIG1pcHMxNl9pbW1lZF9vcGVyYW5kc1swXSkKLQotLyogSGFuZGxlIGEgbWlwczE2IGluc3RydWN0aW9uIHdpdGggYW4gaW1tZWRpYXRlIHZhbHVlLiAgVGhpcyBvcidzIHRoZQotICAgc21hbGwgaW1tZWRpYXRlIHZhbHVlIGludG8gKklOU04uICBJdCBzZXRzICpVU0VfRVhURU5EIHRvIGluZGljYXRlCi0gICB3aGV0aGVyIGFuIGV4dGVuZGVkIHZhbHVlIGlzIG5lZWRlZDsgaWYgb25lIGlzIG5lZWRlZCwgaXQgc2V0cwotICAgKkVYVEVORCB0byB0aGUgdmFsdWUuICBUaGUgYXJndW1lbnQgdHlwZSBpcyBUWVBFLiAgVGhlIHZhbHVlIGlzIFZBTC4KLSAgIElmIFNNQUxMIGlzIHRydWUsIGFuIHVuZXh0ZW5kZWQgb3Bjb2RlIHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4KLSAgIElmIEVYVCBpcyB0cnVlLCBhbiBleHRlbmRlZCBvcGNvZGUgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgSWYKLSAgIFdBUk4gaXMgdHJ1ZSwgd2FybiBpZiBFWFQgZG9lcyBub3QgbWF0Y2ggcmVhbGl0eS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzMTZfaW1tZWQgKGZpbGUsIGxpbmUsIHR5cGUsIHZhbCwgd2Fybiwgc21hbGwsIGV4dCwgaW5zbiwgdXNlX2V4dGVuZCwKLQkgICAgICBleHRlbmQpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBpbnQgdHlwZTsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGJvb2xlYW4gd2FybjsKLSAgICAgYm9vbGVhbiBzbWFsbDsKLSAgICAgYm9vbGVhbiBleHQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmluc247Ci0gICAgIGJvb2xlYW4gKnVzZV9leHRlbmQ7Ci0gICAgIHVuc2lnbmVkIHNob3J0ICpleHRlbmQ7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCAqb3A7Ci0gIGludCBtaW50aW55LCBtYXh0aW55OwotICBib29sZWFuIG5lZWRleHQ7Ci0KLSAgb3AgPSBtaXBzMTZfaW1tZWRfb3BlcmFuZHM7Ci0gIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQotICAgIHsKLSAgICAgICsrb3A7Ci0gICAgICBhc3NlcnQgKG9wIDwgbWlwczE2X2ltbWVkX29wZXJhbmRzICsgTUlQUzE2X05VTV9JTU1FRCk7Ci0gICAgfQotCi0gIGlmIChvcC0+dW5zcCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCi0JewotCSAgbWludGlueSA9IDE7Ci0JICBtYXh0aW55ID0gMSA8PCBvcC0+bmJpdHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1pbnRpbnkgPSAwOwotCSAgbWF4dGlueSA9ICgxIDw8IG9wLT5uYml0cykgLSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtaW50aW55ID0gLSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpOwotICAgICAgbWF4dGlueSA9ICgxIDw8IChvcC0+bmJpdHMgLSAxKSkgLSAxOwotICAgIH0KLQotICAvKiBCcmFuY2ggb2Zmc2V0cyBoYXZlIGFuIGltcGxpY2l0IDAgaW4gdGhlIGxvd2VzdCBiaXQuICAqLwotICBpZiAodHlwZSA9PSAncCcgfHwgdHlwZSA9PSAncScpCi0gICAgdmFsIC89IDI7Ci0KLSAgaWYgKCh2YWwgJiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpKSAhPSAwCi0gICAgICB8fCB2YWwgPCAobWludGlueSA8PCBvcC0+c2hpZnQpCi0gICAgICB8fCB2YWwgPiAobWF4dGlueSA8PCBvcC0+c2hpZnQpKQotICAgIG5lZWRleHQgPSB0cnVlOwotICBlbHNlCi0gICAgbmVlZGV4dCA9IGZhbHNlOwotCi0gIGlmICh3YXJuICYmIGV4dCAmJiAhIG5lZWRleHQpCi0gICAgYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgXygiZXh0ZW5kZWQgb3BlcmFuZCByZXF1ZXN0ZWQgYnV0IG5vdCByZXF1aXJlZCIpKTsKLSAgaWYgKHNtYWxsICYmIG5lZWRleHQpCi0gICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJpbnZhbGlkIHVuZXh0ZW5kZWQgb3BlcmFuZCB2YWx1ZSIpKTsKLQotICBpZiAoc21hbGwgfHwgKCEgZXh0ICYmICEgbmVlZGV4dCkpCi0gICAgewotICAgICAgaW50IGluc252YWw7Ci0KLSAgICAgICp1c2VfZXh0ZW5kID0gZmFsc2U7Ci0gICAgICBpbnNudmFsID0gKCh2YWwgPj4gb3AtPnNoaWZ0KSAmICgoMSA8PCBvcC0+bmJpdHMpIC0gMSkpOwotICAgICAgaW5zbnZhbCA8PD0gb3AtPm9wX3NoaWZ0OwotICAgICAgKmluc24gfD0gaW5zbnZhbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIG1pbmV4dCwgbWF4ZXh0OwotICAgICAgaW50IGV4dHZhbDsKLQotICAgICAgaWYgKG9wLT5leHR1KQotCXsKLQkgIG1pbmV4dCA9IDA7Ci0JICBtYXhleHQgPSAoMSA8PCBvcC0+ZXh0Yml0cykgLSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW5leHQgPSAtICgxIDw8IChvcC0+ZXh0Yml0cyAtIDEpKTsKLQkgIG1heGV4dCA9ICgxIDw8IChvcC0+ZXh0Yml0cyAtIDEpKSAtIDE7Ci0JfQotICAgICAgaWYgKHZhbCA8IG1pbmV4dCB8fCB2YWwgPiBtYXhleHQpCi0JYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAotCQkgICAgICBfKCJvcGVyYW5kIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW5zdHJ1Y3Rpb24iKSk7Ci0KLSAgICAgICp1c2VfZXh0ZW5kID0gdHJ1ZTsKLSAgICAgIGlmIChvcC0+ZXh0Yml0cyA9PSAxNikKLQl7Ci0JICBleHR2YWwgPSAoKHZhbCA+PiAxMSkgJiAweDFmKSB8ICh2YWwgJiAweDdlMCk7Ci0JICB2YWwgJj0gMHgxZjsKLQl9Ci0gICAgICBlbHNlIGlmIChvcC0+ZXh0Yml0cyA9PSAxNSkKLQl7Ci0JICBleHR2YWwgPSAoKHZhbCA+PiAxMSkgJiAweGYpIHwgKHZhbCAmIDB4N2YwKTsKLQkgIHZhbCAmPSAweGY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4dHZhbCA9ICgodmFsICYgMHgxZikgPDwgNikgfCAodmFsICYgMHgyMCk7Ci0JICB2YWwgPSAwOwotCX0KLQotICAgICAgKmV4dGVuZCA9ICh1bnNpZ25lZCBzaG9ydCkgZXh0dmFsOwotICAgICAgKmluc24gfD0gdmFsOwotICAgIH0KLX0KLQwKLSNkZWZpbmUgTFAgJygnCi0jZGVmaW5lIFJQICcpJwotCi1zdGF0aWMgaW50Ci1teV9nZXRTbWFsbEV4cHJlc3Npb24gKGVwLCBzdHIpCi0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzcDsKLSAgaW50IGMgPSAwOwotCi0gIGlmICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLSAgaWYgKCpzdHIgPT0gTFAKLSAgICAgIHx8ICgqc3RyID09ICclJyAmJgotCSAgKChzdHJbMV0gPT0gJ2gnICYmIHN0clsyXSA9PSAnaScpCi0JICAgfHwgKHN0clsxXSA9PSAnSCcgJiYgc3RyWzJdID09ICdJJykKLQkgICB8fCAoc3RyWzFdID09ICdsJyAmJiBzdHJbMl0gPT0gJ28nKSkKLQkgICYmIHN0clszXSA9PSBMUCkpCi0gICAgewotICAgICAgaWYgKCpzdHIgPT0gTFApCi0JYyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgYyA9IHN0clsxXTsKLQkgIHN0ciArPSAzOwotCX0KLQotICAgICAgLyoKLSAgICAgICAqIEEgc21hbGwgZXhwcmVzc2lvbiBtYXkgYmUgZm9sbG93ZWQgYnkgYSBiYXNlIHJlZ2lzdGVyLgotICAgICAgICogU2NhbiB0byB0aGUgZW5kIG9mIHRoaXMgb3BlcmFuZCwgYW5kIHRoZW4gYmFjayBvdmVyIGEgcG9zc2libGUKLSAgICAgICAqIGJhc2UgcmVnaXN0ZXIuICBUaGVuIHNjYW4gdGhlIHNtYWxsIGV4cHJlc3Npb24gdXAgdG8gdGhhdAotICAgICAgICogcG9pbnQuICAoQmFzZWQgb24gY29kZSBpbiBzcGFyYy5jLi4uKQotICAgICAgICovCi0gICAgICBmb3IgKHNwID0gc3RyOyAqc3AgJiYgKnNwICE9ICcsJzsgc3ArKykKLQk7Ci0gICAgICBpZiAoc3AgLSA0ID49IHN0ciAmJiBzcFstMV0gPT0gUlApCi0JewotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzcFstMl0pKQotCSAgICB7Ci0JICAgICAgZm9yIChzcCAtPSAzOyBzcCA+PSBzdHIgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzcCk7IHNwLS0pCi0JCTsKLQkgICAgICBpZiAoKnNwID09ICckJyAmJiBzcCA+IHN0ciAmJiBzcFstMV0gPT0gTFApCi0JCXsKLQkJICBzcC0tOwotCQkgIGdvdG8gZG9faXQ7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3AgLSA1ID49IHN0cgotCQkgICAmJiBzcFstNV0gPT0gTFAKLQkJICAgJiYgc3BbLTRdID09ICckJwotCQkgICAmJiAoKHNwWy0zXSA9PSAnZicgJiYgc3BbLTJdID09ICdwJykKLQkJICAgICAgIHx8IChzcFstM10gPT0gJ3MnICYmIHNwWy0yXSA9PSAncCcpCi0JCSAgICAgICB8fCAoc3BbLTNdID09ICdnJyAmJiBzcFstMl0gPT0gJ3AnKQotCQkgICAgICAgfHwgKHNwWy0zXSA9PSAnYScgJiYgc3BbLTJdID09ICd0JykpKQotCSAgICB7Ci0JICAgICAgc3AgLT0gNTsKLQkgICAgZG9faXQ6Ci0JICAgICAgaWYgKHNwID09IHN0cikKLQkJewotCQkgIC8qIG5vIGV4cHJlc3Npb24gbWVhbnMgemVybyBvZmZzZXQgKi8KLQkJICBpZiAoYykKLQkJICAgIHsKLQkJICAgICAgLyogJXh4KHJlZykgaXMgYW4gZXJyb3IgKi8KLQkJICAgICAgZXAtPlhfb3AgPSBPX2Fic2VudDsKLQkJICAgICAgZXhwcl9lbmQgPSBzdHIgLSAzOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZXAtPlhfb3AgPSBPX2NvbnN0YW50OwotCQkgICAgICBleHByX2VuZCA9IHNwOwotCQkgICAgfQotCQkgIGVwLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCQkgIGVwLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JCSAgZXAtPlhfYWRkX251bWJlciA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAqc3AgPSAnXDAnOwotCQkgIG15X2dldEV4cHJlc3Npb24gKGVwLCBzdHIpOwotCQkgICpzcCA9IExQOwotCQl9Ci0JICAgICAgcmV0dXJuIGM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBteV9nZXRFeHByZXNzaW9uIChlcCwgc3RyKTsKLSAgcmV0dXJuIGM7CQkJLyogPT4gJWhpIG9yICVsbyBlbmNvdW50ZXJlZCAqLwotfQotCi1zdGF0aWMgdm9pZAotbXlfZ2V0RXhwcmVzc2lvbiAoZXAsIHN0cikKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBleHByZXNzaW9uIChlcCk7Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotCi0gIC8qIElmIHdlIGFyZSBpbiBtaXBzMTYgbW9kZSwgYW5kIHRoaXMgaXMgYW4gZXhwcmVzc2lvbiBiYXNlZCBvbiBgLicsCi0gICAgIHRoZW4gd2UgYnVtcCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBieSAxIHNpbmNlIHRoYXQgaXMgaG93IG90aGVyCi0gICAgIHRleHQgc3ltYm9scyBhcmUgaGFuZGxlZC4gIFdlIGRvbid0IGJvdGhlciB0byBoYW5kbGUgY29tcGxleAotICAgICBleHByZXNzaW9ucywganVzdCBgLicgcGx1cyBvciBtaW51cyBhIGNvbnN0YW50LiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYKLSAgICAgICYmIGVwLT5YX29wID09IE9fc3ltYm9sCi0gICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGVwLT5YX2FkZF9zeW1ib2wpLCBGQUtFX0xBQkVMX05BTUUpID09IDAKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGVwLT5YX2FkZF9zeW1ib2wpID09IG5vd19zZWcKLSAgICAgICYmIHN5bWJvbF9nZXRfZnJhZyAoZXAtPlhfYWRkX3N5bWJvbCkgPT0gZnJhZ19ub3cKLSAgICAgICYmIHN5bWJvbF9jb25zdGFudF9wIChlcC0+WF9hZGRfc3ltYm9sKQotICAgICAgJiYgU19HRVRfVkFMVUUgKGVwLT5YX2FkZF9zeW1ib2wpID09IGZyYWdfbm93X2ZpeCAoKSkKLSAgICBTX1NFVF9WQUxVRSAoZXAtPlhfYWRkX3N5bWJvbCwgU19HRVRfVkFMVUUgKGVwLT5YX2FkZF9zeW1ib2wpICsgMSk7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlcgotICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIDI7Ci0KLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gICAgIAotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJPOjpnOjpHOiI7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSNkZWZpbmUgT1BUSU9OX01JUFMxIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsibWlwczAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMxfSwKLSAgeyJtaXBzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzF9LAotI2RlZmluZSBPUFRJT05fTUlQUzIgKE9QVElPTl9NRF9CQVNFICsgMikKLSAgeyJtaXBzMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzJ9LAotI2RlZmluZSBPUFRJT05fTUlQUzMgKE9QVElPTl9NRF9CQVNFICsgMykKLSAgeyJtaXBzMyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzN9LAotI2RlZmluZSBPUFRJT05fTUlQUzQgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyJtaXBzNCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzR9LAotI2RlZmluZSBPUFRJT05fTUNQVSAoT1BUSU9OX01EX0JBU0UgKyA1KQotICB7Im1jcHUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01DUFV9LAotI2RlZmluZSBPUFRJT05fTUVNQkVEREVEX1BJQyAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7Im1lbWJlZGRlZC1waWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTUJFRERFRF9QSUN9LAotI2RlZmluZSBPUFRJT05fVFJBUCAoT1BUSU9OX01EX0JBU0UgKyA5KQotICB7InRyYXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQVB9LAotICB7Im5vLWJyZWFrIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFQfSwKLSNkZWZpbmUgT1BUSU9OX0JSRUFLIChPUFRJT05fTURfQkFTRSArIDEwKQotICB7ImJyZWFrIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CUkVBS30sCi0gIHsibm8tdHJhcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQlJFQUt9LAotI2RlZmluZSBPUFRJT05fRUIgKE9QVElPTl9NRF9CQVNFICsgMTEpCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSNkZWZpbmUgT1BUSU9OX0VMIChPUFRJT05fTURfQkFTRSArIDEyKQotICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCi0jZGVmaW5lIE9QVElPTl9NNDY1MCAoT1BUSU9OX01EX0JBU0UgKyAxMykKLSAgeyJtNDY1MCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTQ2NTB9LAotI2RlZmluZSBPUFRJT05fTk9fTTQ2NTAgKE9QVElPTl9NRF9CQVNFICsgMTQpCi0gIHsibm8tbTQ2NTAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX000NjUwfSwKLSNkZWZpbmUgT1BUSU9OX000MDEwIChPUFRJT05fTURfQkFTRSArIDE1KQotICB7Im00MDEwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NNDAxMH0sCi0jZGVmaW5lIE9QVElPTl9OT19NNDAxMCAoT1BUSU9OX01EX0JBU0UgKyAxNikKLSAgeyJuby1tNDAxMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTQwMTB9LAotI2RlZmluZSBPUFRJT05fTTQxMDAgKE9QVElPTl9NRF9CQVNFICsgMTcpCi0gIHsibTQxMDAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX000MTAwfSwKLSNkZWZpbmUgT1BUSU9OX05PX000MTAwIChPUFRJT05fTURfQkFTRSArIDE4KQotICB7Im5vLW00MTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NNDEwMH0sCi0jZGVmaW5lIE9QVElPTl9NSVBTMTYgKE9QVElPTl9NRF9CQVNFICsgMjIpCi0gIHsibWlwczE2Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTMTZ9LAotI2RlZmluZSBPUFRJT05fTk9fTUlQUzE2IChPUFRJT05fTURfQkFTRSArIDIzKQotICB7Im5vLW1pcHMxNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTUlQUzE2fSwKLSNkZWZpbmUgT1BUSU9OX00zOTAwIChPUFRJT05fTURfQkFTRSArIDI2KQotICB7Im0zOTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NMzkwMH0sCi0jZGVmaW5lIE9QVElPTl9OT19NMzkwMCAoT1BUSU9OX01EX0JBU0UgKyAyNykKLSAgeyJuby1tMzkwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTM5MDB9LAotCi0KLSNkZWZpbmUgT1BUSU9OX01BQkkgKE9QVElPTl9NRF9CQVNFICsgMzgpCi0gIHsibWFiaSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFCSX0sCi0KLSNkZWZpbmUgT1BUSU9OX0NBTExfU0hBUkVEIChPUFRJT05fTURfQkFTRSArIDcpCi0jZGVmaW5lIE9QVElPTl9OT05fU0hBUkVEIChPUFRJT05fTURfQkFTRSArIDgpCi0jZGVmaW5lIE9QVElPTl9YR09UIChPUFRJT05fTURfQkFTRSArIDE5KQotI2RlZmluZSBPUFRJT05fMzIgKE9QVElPTl9NRF9CQVNFICsgMjApCi0jZGVmaW5lIE9QVElPTl82NCAoT1BUSU9OX01EX0JBU0UgKyAyMSkKLSNpZmRlZiBPQkpfRUxGCi0gIHsiS1BJQyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0FMTF9TSEFSRUR9LAotICB7Inhnb3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1hHT1R9LAotICB7ImNhbGxfc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gIHsibm9uX3NoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9OX1NIQVJFRH0sCi0gIHsiMzIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzMyfSwKLSAgeyI2NCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fNjR9LAotI2VuZGlmCi0KLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9UUkFQOgotICAgICAgbWlwc190cmFwID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQlJFQUs6Ci0gICAgICBtaXBzX3RyYXAgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FQjoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRUw6Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ08nOgotICAgICAgaWYgKGFyZyAmJiBhcmdbMV0gPT0gJzAnKQotCW1pcHNfb3B0aW1pemUgPSAxOwotICAgICAgZWxzZQotCW1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgIGlmIChhcmcgPT0gTlVMTCkKLQltaXBzX2RlYnVnID0gMjsKLSAgICAgIGVsc2UKLQltaXBzX2RlYnVnID0gYXRvaSAoYXJnKTsKLSAgICAgIC8qIFdoZW4gdGhlIE1JUFMgYXNzZW1ibGVyIHNlZXMgLWcgb3IgLWcyLCBpdCBkb2VzIG5vdCBkbwotICAgICAgICAgb3B0aW1pemF0aW9ucyB3aGljaCBsaW1pdCBmdWxsIHN5bWJvbGljIGRlYnVnZ2luZy4gIFdlIHRha2UKLSAgICAgICAgIHRoYXQgdG8gYmUgZXF1aXZhbGVudCB0byAtTzAuICAqLwotICAgICAgaWYgKG1pcHNfZGVidWcgPT0gMikKLQltaXBzX29wdGltaXplID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzE6Ci0gICAgICBtaXBzX29wdHMuaXNhID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzI6Ci0gICAgICBtaXBzX29wdHMuaXNhID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzM6Ci0gICAgICBtaXBzX29wdHMuaXNhID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzQ6Ci0gICAgICBtaXBzX29wdHMuaXNhID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUNQVToKLSAgICAgIHsKLQljaGFyICpwOwotCi0JLyogSWRlbnRpZnkgdGhlIHByb2Nlc3NvciB0eXBlICovCi0JcCA9IGFyZzsKLQlpZiAoc3RyY21wIChwLCAiZGVmYXVsdCIpID09IDAKLQkgICAgfHwgc3RyY21wIChwLCAiREVGQVVMVCIpID09IDApCi0JICBtaXBzX2NwdSA9IC0xOwotCWVsc2UKLQkgIHsKLQkgICAgaW50IHN2ID0gMDsKLQotCSAgICAvKiBXZSBuZWVkIHRvIGNvcGUgd2l0aCB0aGUgdmFyaW91cyAidnIiIHByZWZpeGVzIGZvciB0aGUgNDMwMAotCSAgICAgICBwcm9jZXNzb3IuICAqLwotCSAgICBpZiAoKnAgPT0gJ3YnIHx8ICpwID09ICdWJykKLQkgICAgICB7Ci0JCXN2ID0gMTsKLQkJcCsrOwotCSAgICAgIH0KLQotCSAgICBpZiAoKnAgPT0gJ3InIHx8ICpwID09ICdSJykKLQkgICAgICBwKys7Ci0KLQkgICAgbWlwc19jcHUgPSAtMTsKLQkgICAgc3dpdGNoICgqcCkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnMSc6Ci0JCWlmIChzdHJjbXAgKHAsICIxMDAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjEwayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjEwSyIpID09IDApCi0JCSAgbWlwc19jcHUgPSAxMDAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICcyJzoKLQkJaWYgKHN0cmNtcCAocCwgIjIwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIyayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjJLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDIwMDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnMyc6Ci0JCWlmIChzdHJjbXAgKHAsICIzMDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiM2siKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIzSyIpID09IDApCi0JCSAgbWlwc19jcHUgPSAzMDAwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAocCwgIjM5MDAiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSAzOTAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzQnOgotCQlpZiAoc3RyY21wIChwLCAiNDAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjRrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNEsiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDAwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDEwMCIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIG1pcHNfY3B1ID0gNDEwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDExMSIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIG1pcHNfY3B1ID0gNDExMTsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDMwMCIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0MzAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0NDAwIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDQ0MDA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQ2MDAiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDYwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDY1MCIpID09IDApCi0JCSAgICBtaXBzX2NwdSA9IDQ2NTA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQwMTAiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSA0MDEwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzUnOgotCQlpZiAoc3RyY21wIChwLCAiNTAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjVrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNUsiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNTAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICc2JzoKLQkJaWYgKHN0cmNtcCAocCwgIjYwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI2ayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjZLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDYwMDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnOCc6Ci0JCWlmIChzdHJjbXAgKHAsICI4MDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiOGsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI4SyIpID09IDApCi0JCSAgbWlwc19jcHUgPSA4MDAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJ28nOgotCQlpZiAoc3RyY21wIChwLCAib3Jpb24iKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDYwMDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmIChzdgotCQkmJiAobWlwc19jcHUgIT0gNDMwMAotCQkgICAgJiYgbWlwc19jcHUgIT0gNDEwMAotCQkgICAgJiYgbWlwc19jcHUgIT0gNDExMQotCQkgICAgJiYgbWlwc19jcHUgIT0gNTAwMCkpCi0JICAgICAgewotCQlhc19iYWQgKF8oImlnbm9yaW5nIGludmFsaWQgbGVhZGluZyAndicgaW4gLW1jcHU9JXMgc3dpdGNoIiksIGFyZyk7Ci0JCXJldHVybiAwOwotCSAgICAgIH0KLQotCSAgICBpZiAobWlwc19jcHUgPT0gLTEpCi0JICAgICAgewotCQlhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC1tY3B1PSVzIiksIGFyZyk7Ci0JCXJldHVybiAwOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTTQ2NTA6Ci0gICAgICBtaXBzX2NwdSA9IDQ2NTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PX000NjUwOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NNDAxMDoKLSAgICAgIG1pcHNfY3B1ID0gNDAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fTTQwMTA6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX000MTAwOgotICAgICAgbWlwc19jcHUgPSA0MTAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19NNDEwMDoKLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIE9QVElPTl9NMzkwMDoKLSAgICAgIG1pcHNfY3B1ID0gMzkwMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUFRJT05fTk9fTTM5MDA6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01JUFMxNjoKLSAgICAgIG1pcHNfb3B0cy5taXBzMTYgPSAxOwotICAgICAgbWlwc19ub19wcmV2X2luc24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fTUlQUzE2OgotICAgICAgbWlwc19vcHRzLm1pcHMxNiA9IDA7Ci0gICAgICBtaXBzX25vX3ByZXZfaW5zbiAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NRU1CRURERURfUElDOgotICAgICAgbWlwc19waWMgPSBFTUJFRERFRF9QSUM7Ci0gICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBnX3N3aXRjaF9zZWVuKQotCXsKLQkgIGFzX2JhZCAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggZW1iZWRkZWQgUElDIGNvZGUiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIEVMRiBjb2RlLCB3ZSBwZXJtaXQgLUtQSUMgYW5kIC1jYWxsX3NoYXJlZCB0bwotCSBzZWxlY3QgU1ZSNF9QSUMsIGFuZCAtbm9uX3NoYXJlZCB0byBzZWxlY3Qgbm8gUElDLiAgVGhpcyBpcwotCSBpbnRlbmRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggSXJpeCA1LiAgKi8KLSAgICBjYXNlIE9QVElPTl9DQUxMX1NIQVJFRDoKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgYXNfYmFkIChfKCItY2FsbF9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBtaXBzX3BpYyA9IFNWUjRfUElDOwotICAgICAgaWYgKGdfc3dpdGNoX3NlZW4gJiYgZ19zd2l0Y2hfdmFsdWUgIT0gMCkKLQl7Ci0JICBhc19iYWQgKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PTl9TSEFSRUQ6Ci0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGFzX2JhZCAoXygiLW5vbl9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBtaXBzX3BpYyA9IE5PX1BJQzsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGUgLXhnb3Qgb3B0aW9uIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gdXNlIDMyIG9mZnNldHMgd2hlbgotICAgICAgICAgYWNjZXNzaW5nIHRoZSBnb3QgaW4gU1ZSNF9QSUMgbW9kZS4gIEl0IGlzIGZvciBJcml4Ci0gICAgICAgICBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICBjYXNlIE9QVElPTl9YR09UOgotICAgICAgbWlwc19iaWdfZ290ID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICBpZiAoISBVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotCXsKLQkgIGFzX2JhZCAoXygiLUcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb25maWd1cmF0aW9uIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgfHwgbWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIGFzX2JhZCAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBvciBlbWJlZGRlZCBQSUMgY29kZSIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UKLQlnX3N3aXRjaF92YWx1ZSA9IGF0b2kgKGFyZyk7Ci0gICAgICBnX3N3aXRjaF9zZWVuID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGUgLTMyIGFuZCAtNjQgb3B0aW9ucyB0ZWxsIHRoZSBhc3NlbWJsZXIgdG8gb3V0cHV0IHRoZSAzMgotICAgICAgICAgYml0IG9yIHRoZSA2NCBiaXQgTUlQUyBFTEYgZm9ybWF0LiAgKi8KLSAgICBjYXNlIE9QVElPTl8zMjoKLSAgICAgIG1pcHNfNjQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl82NDoKLSAgICAgIHsKLQljb25zdCBjaGFyICoqbGlzdCwgKipsOwotCi0JbGlzdCA9IGJmZF90YXJnZXRfbGlzdCAoKTsKLQlmb3IgKGwgPSBsaXN0OyAqbCAhPSBOVUxMOyBsKyspCi0JICBpZiAoc3RyY21wICgqbCwgImVsZjY0LWJpZ21pcHMiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wICgqbCwgImVsZjY0LWxpdHRsZW1pcHMiKSA9PSAwKQotCSAgICBicmVhazsKLQlpZiAoKmwgPT0gTlVMTCkKLQkgIGFzX2ZhdGFsIChfKCJObyBjb21waWxlZCBpbiBzdXBwb3J0IGZvciA2NCBiaXQgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotCWZyZWUgKGxpc3QpOwotCW1pcHNfNjQgPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgT1BUSU9OX01BQkk6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsIjMyIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmcsIm4zMiIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCI2NCIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCJvNjQiKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZywiZWFiaSIpID09IDApCi0JbWlwc19hYmlfc3RyaW5nID0gYXJnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zaG93IChzdHJlYW0sIHN0cmluZywgY29sX3AsIGZpcnN0X3ApCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgKmNvbF9wOwotICAgICBpbnQgKmZpcnN0X3A7Ci17Ci0gIGlmICgqZmlyc3RfcCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdHJlYW0sICIlMjRzIiwgIiIpOwotICAgICAgKmNvbF9wID0gMjQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICpjb2xfcCArPSAyOwotICAgIH0KLQotICBpZiAoKmNvbF9wICsgc3RybGVuIChzdHJpbmcpID4gNzIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiXG4lMjRzIiwgIiIpOwotICAgICAgKmNvbF9wID0gMjQ7Ci0gICAgfQotCi0gIGZwcmludGYgKHN0cmVhbSwgIiVzIiwgc3RyaW5nKTsKLSAgKmNvbF9wICs9IHN0cmxlbiAoc3RyaW5nKTsKLQotICAqZmlyc3RfcCA9IDA7Ci19Ci0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGludCBjb2x1bW4sIGZpcnN0OwotCi0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1NSVBTIG9wdGlvbnM6XG5cCi0tbWVtYmVkZGVkLXBpYwkJZ2VuZXJhdGUgZW1iZWRkZWQgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuXAotLUVCCQkJZ2VuZXJhdGUgYmlnIGVuZGlhbiBvdXRwdXRcblwKLS1FTAkJCWdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG5cCi0tZywgLWcyCQkJZG8gbm90IHJlbW92ZSB1bmVlZGVkIE5PUHMgb3Igc3dhcCBicmFuY2hlc1xuXAotLUcgTlVNCQkJYWxsb3cgcmVmZXJlbmNpbmcgb2JqZWN0cyB1cCB0byBOVU0gYnl0ZXNcblwKLQkJCWltcGxpY2l0bHkgd2l0aCB0aGUgZ3AgcmVnaXN0ZXIgW2RlZmF1bHQgOF1cbiIpKTsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1taXBzMQkJCWdlbmVyYXRlIE1JUFMgSVNBIEkgaW5zdHJ1Y3Rpb25zXG5cCi0tbWlwczIJCQlnZW5lcmF0ZSBNSVBTIElTQSBJSSBpbnN0cnVjdGlvbnNcblwKLS1taXBzMwkJCWdlbmVyYXRlIE1JUFMgSVNBIElJSSBpbnN0cnVjdGlvbnNcblwKLS1taXBzNAkJCWdlbmVyYXRlIE1JUFMgSVNBIElWIGluc3RydWN0aW9uc1xuXAotLW1jcHU9Q1BVCQlnZW5lcmF0ZSBjb2RlIGZvciBDUFUsIHdoZXJlIENQVSBpcyBvbmUgb2Y6XG4iKSk7Ci0KLSAgZmlyc3QgPSAxOwotCi0gIHNob3cgKHN0cmVhbSwgIjIwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICIzMDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiMzkwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MDEwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDEwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQxMTEiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MzAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDQwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQ2MDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0NjUwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNTAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjYwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI4MDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiMTAwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBmcHV0YyAoJ1xuJywgc3RyZWFtKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1tQ1BVCQkJZXF1aXZhbGVudCB0byAtbWNwdT1DUFUuXG5cCi0tbm8tbUNQVQkJZG9uJ3QgZ2VuZXJhdGUgY29kZSBzcGVjaWZpYyB0byBDUFUuXG5cCi0JCQlGb3IgLW1DUFUgYW5kIC1uby1tQ1BVLCBDUFUgbXVzdCBiZSBvbmUgb2Y6XG4iKSk7Ci0KLSAgZmlyc3QgPSAxOwotCi0gIHNob3cgKHN0cmVhbSwgIjM5MDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MDEwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDEwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQ2NTAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBmcHV0YyAoJ1xuJywgc3RyZWFtKTsKLQotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLW1pcHMxNgkJCWdlbmVyYXRlIG1pcHMxNiBpbnN0cnVjdGlvbnNcblwKLS1uby1taXBzMTYJCWRvIG5vdCBnZW5lcmF0ZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zXG4iKSk7Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tTzAJCQlyZW1vdmUgdW5uZWVkZWQgTk9QcywgZG8gbm90IHN3YXAgYnJhbmNoZXNcblwKLS1PCQkJcmVtb3ZlIHVubmVlZGVkIE5PUHMgYW5kIHN3YXAgYnJhbmNoZXNcblwKLS0tdHJhcCwgLS1uby1icmVhawl0cmFwIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuXAotLS1icmVhaywgLS1uby10cmFwCWJyZWFrIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuIikpOwotI2lmZGVmIE9CSl9FTEYKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1LUElDLCAtY2FsbF9zaGFyZWQJZ2VuZXJhdGUgU1ZSNCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCi0tbm9uX3NoYXJlZAkJZG8gbm90IGdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcblwKLS14Z290CQkJYXNzdW1lIGEgMzIgYml0IEdPVFxuXAotLTMyCQkJY3JlYXRlIDMyIGJpdCBvYmplY3QgZmlsZSAoZGVmYXVsdClcblwKLS02NAkJCWNyZWF0ZSA2NCBiaXQgb2JqZWN0IGZpbGVcbiIpKTsKLSNlbmRpZgotfQotDAotdm9pZAotbWlwc19pbml0X2FmdGVyX2FyZ3MgKCkKLXsKLSAgLyogaW5pdGlhbGl6ZSBvcGNvZGVzICovCi0gIGJmZF9taXBzX251bV9vcGNvZGVzID0gYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2RlczsKLSAgbWlwc19vcGNvZGVzID0gKHN0cnVjdCBtaXBzX29wY29kZSopIG1pcHNfYnVpbHRpbl9vcGNvZGVzOwotfQotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG1ha2VzIGEgYnJhbmNoIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wgYmUgYSBicmFuY2ggdG8gdGhlCi0JIGN1cnJlbnQgbG9jYXRpb24uICAqLwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gIC8qIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZGVsYXkgc2xvdCAqLwotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgZW1pdF9leHByIHZpYSBUQ19DT05TX0ZJWF9ORVcgd2hlbiBjcmVhdGluZyBhCi0gICByZWxvYyBmb3IgYSBjb25zLiAgV2UgY291bGQgdXNlIHRoZSBkZWZpbml0aW9uIHRoZXJlLCBleGNlcHQgdGhhdAotICAgd2Ugd2FudCB0byBoYW5kbGUgNjQgYml0IHJlbG9jcyBzcGVjaWFsbHkuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfbWlwcyAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotI2lmbmRlZiBPQkpfRUxGCi0gIC8qIElmIHdlIGFyZSBhc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLCB0dXJuIGFuIDggYnl0ZSByZWxvYyBpbnRvIGEKLSAgICAgNCBieXRlIHJlbG9jLiAgKi8KLSAgaWYgKG5ieXRlcyA9PSA4ICYmICEgbWlwc182NCkKLSAgICB7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0Jd2hlcmUgKz0gNDsKLSAgICAgIG5ieXRlcyA9IDQ7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKG5ieXRlcyAhPSAyICYmIG5ieXRlcyAhPSA0ICYmIG5ieXRlcyAhPSA4KQotICAgIGFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgcmVsb2Mgc2l6ZSAlZCIpLCBuYnl0ZXMpOwotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgd2hlcmUsIChpbnQpIG5ieXRlcywgZXhwLCAwLAotCSAgICAgICAobmJ5dGVzID09IDIKLQkJPyBCRkRfUkVMT0NfMTYKLQkJOiAobmJ5dGVzID09IDQgPyBCRkRfUkVMT0NfMzIgOiBCRkRfUkVMT0NfNjQpKSk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgc3ltYm9sIHRhYmxlIGlzIHByb2Nlc3NlZC4gIEluIG9yZGVyIHRvCi0gICB3b3JrIHdpdGggZ2NjIHdoZW4gdXNpbmcgbWlwcy10ZmlsZSwgd2UgbXVzdCBrZWVwIGFsbCBsb2NhbCBsYWJlbHMuCi0gICBIb3dldmVyLCBpbiBvdGhlciBjYXNlcywgd2Ugd2FudCB0byBkaXNjYXJkIHRoZW0uICBJZiB3ZSB3ZXJlCi0gICBjYWxsZWQgd2l0aCAtZywgYnV0IHdlIGRpZG4ndCBzZWUgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaXQgbWF5Ci0gICBtZWFuIHRoYXQgZ2NjIGlzIHNtdWdnbGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdGhyb3VnaCB0bwotICAgbWlwcy10ZmlsZSwgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IGdlbmVyYXRlIGFsbCBsb2NhbCBsYWJlbHMuICAqLwotCi12b2lkCi1taXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpCi17Ci0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotICBpZiAoRUNPRkZfREVCVUdHSU5HCi0gICAgICAmJiBtaXBzX2RlYnVnICE9IDAKLSAgICAgICYmICEgZWNvZmZfZGVidWdnaW5nX3NlZW4pCi0gICAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci0jZW5kaWYKLX0KLQotLyogU29ydCBhbnkgdW5tYXRjaGVkIEhJMTZfUyByZWxvY3Mgc28gdGhhdCB0aGV5IGltbWVkaWF0ZWx5IHByZWNlZGUKLSAgIHRoZSBjb3JyZXNwb25kaW5nIExPIHJlbG9jLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIG1kX2FwcGx5X2ZpeCBhbmQKLSAgIHRjX2dlbl9yZWxvYy4gIFVubWF0Y2hlZCBISTE2X1MgcmVsb2NzIGNhbiBvbmx5IGJlIGdlbmVyYXRlZCBieQotICAgZXhwbGljaXQgdXNlIG9mIHRoZSAlaGkgbW9kaWZpZXIuICAqLwotCi12b2lkCi1taXBzX2Zyb2JfZmlsZSAoKQotewotICBzdHJ1Y3QgbWlwc19oaV9maXh1cCAqbDsKLQotICBmb3IgKGwgPSBtaXBzX2hpX2ZpeHVwX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gICAgICBpbnQgcGFzczsKLQotICAgICAgYXNzZXJ0IChsLT5maXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0hJMTZfUyk7Ci0KLSAgICAgIC8qIENoZWNrIHF1aWNrbHkgd2hldGhlciB0aGUgbmV4dCBmaXh1cCBoYXBwZW5zIHRvIGJlIGEgbWF0Y2hpbmcKLSAgICAgICAgICVsby4gICovCi0gICAgICBpZiAobC0+Zml4cC0+ZnhfbmV4dCAhPSBOVUxMCi0JICAmJiBsLT5maXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0xPMTYKLQkgICYmIGwtPmZpeHAtPmZ4X2FkZHN5ID09IGwtPmZpeHAtPmZ4X25leHQtPmZ4X2FkZHN5Ci0JICAmJiBsLT5maXhwLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+Znhfb2Zmc2V0KQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIGZpeHVwcyBmb3IgdGhpcyBzZWdtZW50IGZvciBhIG1hdGNoaW5nICVsby4KLSAgICAgICAgIFdoZW4gd2UgZmluZCBvbmUsIG1vdmUgdGhlICVoaSBqdXN0IGluIGZyb250IG9mIGl0LiAgV2UgZG8KLSAgICAgICAgIHRoaXMgaW4gdHdvIHBhc3Nlcy4gIEluIHRoZSBmaXJzdCBwYXNzLCB3ZSB0cnkgdG8gZmluZCBhCi0gICAgICAgICB1bmlxdWUgJWxvLiAgSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBwZXJtaXQgbXVsdGlwbGUgJWhpCi0gICAgICAgICByZWxvY3MgZm9yIGEgc2luZ2xlICVsbyAodGhpcyBpcyBhIEdOVSBleHRlbnNpb24pLiAgKi8KLSAgICAgIHNlZ2luZm8gPSBzZWdfaW5mbyAobC0+c2VnKTsKLSAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspCi0JewotCSAgZml4UyAqZiwgKnByZXY7Ci0KLQkgIHByZXYgPSBOVUxMOwotCSAgZm9yIChmID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGYgIT0gTlVMTDsgZiA9IGYtPmZ4X25leHQpCi0JICAgIHsKLQkgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSAlbG8gZml4dXAgd2hpY2ggbWF0Y2hlcyBsLT5maXhwLiAgKi8KLQkgICAgICBpZiAoZi0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19MTzE2Ci0JCSAgJiYgZi0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfYWRkc3kKLQkJICAmJiBmLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+Znhfb2Zmc2V0Ci0JCSAgJiYgKHBhc3MgPT0gMQotCQkgICAgICB8fCBwcmV2ID09IE5VTEwKLQkJICAgICAgfHwgcHJldi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1MKLQkJICAgICAgfHwgcHJldi0+ZnhfYWRkc3kgIT0gZi0+ZnhfYWRkc3kKLQkJICAgICAgfHwgcHJldi0+Znhfb2Zmc2V0ICE9ICBmLT5meF9vZmZzZXQpKQotCQl7Ci0JCSAgZml4UyAqKnBmOwotCi0JCSAgLyogTW92ZSBsLT5maXhwIGJlZm9yZSBmLiAgKi8KLQkJICBmb3IgKHBmID0gJnNlZ2luZm8tPmZpeF9yb290OwotCQkgICAgICAgKnBmICE9IGwtPmZpeHA7Ci0JCSAgICAgICBwZiA9ICYoKnBmKS0+ZnhfbmV4dCkKLQkJICAgIGFzc2VydCAoKnBmICE9IE5VTEwpOwotCi0JCSAgKnBmID0gbC0+Zml4cC0+ZnhfbmV4dDsKLQotCQkgIGwtPmZpeHAtPmZ4X25leHQgPSBmOwotCQkgIGlmIChwcmV2ID09IE5VTEwpCi0JCSAgICBzZWdpbmZvLT5maXhfcm9vdCA9IGwtPmZpeHA7Ci0JCSAgZWxzZQotCQkgICAgcHJldi0+ZnhfbmV4dCA9IGwtPmZpeHA7Ci0KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgcHJldiA9IGY7Ci0JICAgIH0KLQotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLSNpZiAwIC8qIEdDQyBjb2RlIG1vdGlvbiBwbHVzIGluY29tcGxldGUgZGVhZCBjb2RlIGVsaW1pbmF0aW9uCi0JIGNhbiBsZWF2ZSBhICVoaSB3aXRob3V0IGEgJWxvLiAgKi8KLQkgIGlmIChwYXNzID09IDEpCi0JICAgIGFzX3dhcm5fd2hlcmUgKGwtPmZpeHAtPmZ4X2ZpbGUsIGwtPmZpeHAtPmZ4X2xpbmUsCi0JCQkgICBfKCJVbm1hdGNoZWQgJSVoaSByZWxvYyIpKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLS8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBuZWVkIHRvIHVzZSBhIHNwZWNpYWwKLSAgIHJlbG9jYXRpb24gdG8gcmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiAoc3dpdGNoIHRhYmxlcyB1c2UgYSBkaWZmZXJlbmNlIG9mIHRoaXMgc29ydCkuICBTZWUKLSAgIGluY2x1ZGUvY29mZi9taXBzLmggZm9yIGRldGFpbHMuICBUaGlzIG1hY3JvIGNoZWNrcyB3aGV0aGVyIHRoaXMKLSAgIGZpeHVwIHJlcXVpcmVzIHRoZSBzcGVjaWFsIHJlbG9jLiAgKi8KLSNkZWZpbmUgU1dJVENIX1RBQkxFKGZpeHApIFwKLSAgKChmaXhwKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMiBcCi0gICAmJiAoZml4cCktPmZ4X2FkZHN5ICE9IE5VTEwgXAotICAgJiYgKGZpeHApLT5meF9zdWJzeSAhPSBOVUxMIFwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXhwKS0+ZnhfYWRkc3kpID09IHRleHRfc2VjdGlvbiBcCi0gICAmJiBTX0dFVF9TRUdNRU5UICgoZml4cCktPmZ4X3N1YnN5KSA9PSB0ZXh0X3NlY3Rpb24pCi0KLS8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBtdXN0IGtlZXAgYWxsIFBDIHJlbGF0aXZlCi0gICByZWxvY2F0aW9ucywgaW4gY2FzZSB0aGUgbGlua2VyIGhhcyB0byByZWxheCBhIGNhbGwuICBXZSBhbHNvIG5lZWQKLSAgIHRvIGtlZXAgcmVsb2NhdGlvbnMgZm9yIHN3aXRjaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotLypBUkdTVVNFRCovCi1pbnQKLW1pcHNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0JICAmJiAoZml4cC0+ZnhfcGNyZWwKLQkgICAgICB8fCBTV0lUQ0hfVEFCTEUgKGZpeHApCi0JICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MKLQkgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpKTsKLX0KLQotLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsdWVQKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHVlUDsKLXsKLSAgdW5zaWduZWQgY2hhciAqYnVmOwotICBsb25nIGluc24sIHZhbHVlOwotCi0gIGFzc2VydCAoZml4UC0+Znhfc2l6ZSA9PSA0Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzY0Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSk7Ci0KLSAgdmFsdWUgPSAqdmFsdWVQOwotCi0gIC8qIElmIHdlIGFyZW4ndCBhZGp1c3RpbmcgdGhpcyBmaXh1cCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uCi0gICAgIHN5bWJvbCwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMICYmIE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICBpZiAoU19HRVRfT1RIRVIgKGZpeFAtPmZ4X2FkZHN5KSA9PSBTVE9fTUlQUzE2IAotICAgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgICB8fCAoc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAgICAgICAmJiAoKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCQkJIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkKLQkJICAmIFNFQ19MSU5LX09OQ0UpICE9IDApCi0JCXx8ICFzdHJuY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSksCi0JCQkgICAgICIuZ251LmxpbmtvbmNlIiwKLQkJCSAgICAgc2l6ZW9mICgiLmdudS5saW5rb25jZSIpIC0gMSkpKSkKLQotICAgICAgewotICAgICAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpOwotICAgICAgICBpZiAodmFsdWUgIT0gMCAmJiAhIGZpeFAtPmZ4X3BjcmVsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluIHRoaXMgY2FzZSwgdGhlIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gcm91dGluZSB3aWxsCi0gICAgICAgICAgICAgICBpbmNvcnJlY3RseSBhZGQgdGhlIHN5bWJvbCB2YWx1ZSBiYWNrIGluLiAgV2UganVzdCB3YW50Ci0gICAgICAgICAgICAgICB0aGUgYWRkZW5kIHRvIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgICAgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYKLQotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgdGNfZ2VuX3JlbG9jICovCi0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwgJiYgISBmaXhQLT5meF9wY3JlbCkKLSAgICBmaXhQLT5meF9kb25lID0gMTsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HUFJFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1QxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9HUFJFTDoKLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkludmFsaWQgUEMgcmVsYXRpdmUgcmVsb2MiKSk7Ci0gICAgICAvKiBOb3RoaW5nIG5lZWRlZCB0byBkby4gVGhlIHZhbHVlIGNvbWVzIGZyb20gdGhlIHJlbG9jIGVudHJ5ICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6Ci0gICAgICAvKiBXZSBjdXJyZW50bHkgYWx3YXlzIGdlbmVyYXRlIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCwgd2hpY2gKLSAgICAgICAgIG1lYW5zIHRoYXQgd2UgZG9uJ3Qgd2FudCBhbiBhZGRlbmQgZXZlbiBpZiB0aGUgc3ltYm9sIGlzCi0gICAgICAgICBkZWZpbmVkLiAgKi8KLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKLSAgICAgIC8qIFRoZSBhZGRlbmQgZm9yIHRoaXMgaXMgdHJpY2t5IGlmIGl0IGlzIGludGVybmFsLCBzbyB3ZSBqdXN0Ci0JIGRvIGV2ZXJ5dGhpbmcgaGVyZSByYXRoZXIgdGhhbiBpbiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmICgoc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JewotCSAgLyogRm9yIGFuIGV4dGVybmFsIHN5bWJvbCBhZGp1c3QgYnkgdGhlIGFkZHJlc3MgdG8gbWFrZSBpdAotCSAgICAgcGNyZWxfb2Zmc2V0LiAgV2UgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBSRUxMTyByZWxvYwotCSAgICAgd2hpY2ggZm9sbG93cyB0aGlzIG9uZS4gICovCi0JICB2YWx1ZSArPSAoZml4UC0+ZnhfbmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkgICAgKyBmaXhQLT5meF9uZXh0LT5meF93aGVyZSk7Ci0JfQotICAgICAgaWYgKHZhbHVlICYgMHg4MDAwKQotCXZhbHVlICs9IDB4MTAwMDA7Ci0gICAgICB2YWx1ZSA+Pj0gMTY7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYnVmICs9IDI7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgLyogVGhlIGFkZGVuZCBmb3IgdGhpcyBpcyB0cmlja3kgaWYgaXQgaXMgaW50ZXJuYWwsIHNvIHdlIGp1c3QKLQkgZG8gZXZlcnl0aGluZyBoZXJlIHJhdGhlciB0aGFuIGluIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotICAgICAgaWYgKChzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQl2YWx1ZSArPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYnVmICs9IDI7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICAgIC8qIFRoaXMgaXMgaGFuZGxlZCBsaWtlIEJGRF9SRUxPQ18zMiwgYnV0IHdlIG91dHB1dCBhIHNpZ24KLSAgICAgICAgIGV4dGVuZGVkIHZhbHVlIGlmIHdlIGFyZSBvbmx5IDMyIGJpdHMuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUKLQkgIHx8IChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMgJiYgU1dJVENIX1RBQkxFIChmaXhQKSkpCi0JewotCSAgaWYgKDggPD0gc2l6ZW9mICh2YWx1ZVQpKQotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCQl2YWx1ZSwgOCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsb25nIHcxLCB3MjsKLQkgICAgICBsb25nIGhpdjsKLQotCSAgICAgIHcxID0gdzIgPSBmaXhQLT5meF93aGVyZTsKLQkgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JCXcxICs9IDQ7Ci0JICAgICAgZWxzZQotCQl3MiArPSA0OwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIHcxLCB2YWx1ZSwgNCk7Ci0JICAgICAgaWYgKCh2YWx1ZSAmIDB4ODAwMDAwMDApICE9IDApCi0JCWhpdiA9IDB4ZmZmZmZmZmY7Ci0JICAgICAgZWxzZQotCQloaXYgPSAwOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIHcyLCBoaXYsIDQpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIC8qIElmIHdlIGFyZSBkZWxldGluZyB0aGlzIHJlbG9jIGVudHJ5LCB3ZSBtdXN0IGZpbGwgaW4gdGhlCi0JIHZhbHVlIG5vdy4gIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBoYXZlIGEgLndvcmQgd2hpY2ggaXMgbm90Ci0JIHJlc29sdmVkIHdoZW4gaXQgYXBwZWFycyBidXQgaXMgbGF0ZXIgZGVmaW5lZC4gIFdlIGFsc28gbmVlZAotCSB0byBmaWxsIGluIHRoZSB2YWx1ZSBpZiB0aGlzIGlzIGFuIGVtYmVkZGVkIFBJQyBzd2l0Y2ggdGFibGUKLQkgZW50cnkuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUKLQkgIHx8IChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMgJiYgU1dJVENIX1RBQkxFIChmaXhQKSkpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgdmFsdWUsIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIC8qIElmIHdlIGFyZSBkZWxldGluZyB0aGlzIHJlbG9jIGVudHJ5LCB3ZSBtdXN0IGZpbGwgaW4gdGhlCi0gICAgICAgICB2YWx1ZSBub3cuICAqLwotICAgICAgYXNzZXJ0IChmaXhQLT5meF9zaXplID09IDIpOwotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotICAgICAgLyogV2hlbiBoYW5kbGluZyBhbiBlbWJlZGRlZCBQSUMgc3dpdGNoIHN0YXRlbWVudCwgd2UgY2FuIHdpbmQKLQkgdXAgZGVsZXRpbmcgYSBMTzE2IHJlbG9jLiAgU2VlIHRoZSAnbycgY2FzZSBpbiBtaXBzX2lwLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lKQotCXsKLQkgIGlmICh2YWx1ZSA8IC0weDgwMDAgfHwgdmFsdWUgPiAweDdmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKLQkgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQkgICAgYnVmICs9IDI7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0gICAgICAvKgotICAgICAgICogV2UgbmVlZCB0byBzYXZlIHRoZSBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbiBzaW5jZSBmaXh1cF9zZWdtZW50KCkKLSAgICAgICAqIG1pZ2h0IGJlIGRlbGV0aW5nIHRoZSByZWxvY2F0aW9uIGVudHJ5IChpLmUuLCBhIGJyYW5jaCB3aXRoaW4KLSAgICAgICAqIHRoZSBjdXJyZW50IHNlZ21lbnQpLgotICAgICAgICovCi0gICAgICBpZiAoKHZhbHVlICYgMHgzKSAhPSAwKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygiQnJhbmNoIHRvIG9kZCBhZGRyZXNzICglbHgpIiksIHZhbHVlKTsKLSAgICAgIHZhbHVlID4+PSAyOwotCi0gICAgICAvKiB1cGRhdGUgb2xkIGluc3RydWN0aW9uIGRhdGEgKi8KLSAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIChmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWluc24gPSAoYnVmWzBdIDw8IDI0KSB8IChidWZbMV0gPDwgMTYpIHwgKGJ1ZlsyXSA8PCA4KSB8IGJ1ZlszXTsKLSAgICAgIGVsc2UKLQlpbnNuID0gKGJ1ZlszXSA8PCAyNCkgfCAoYnVmWzJdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMF07Ci0KLSAgICAgIGlmICh2YWx1ZSA+PSAtMHg4MDAwICYmIHZhbHVlIDwgMHg4MDAwKQotCWluc24gfD0gdmFsdWUgJiAweGZmZmY7Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIGJyYW5jaCBvZmZzZXQgaXMgdG9vIGxhcmdlLiAgSWYgdGhpcyBpcyBhbgotICAgICAgICAgICAgIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBhbmQgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIFBJQyBjb2RlLAotICAgICAgICAgICAgIHdlIGNhbiBjb252ZXJ0IGl0IHRvIGFuIGFic29sdXRlIGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotCSAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgICAgICYmIGZpeFAtPmZ4X2RvbmUKLQkgICAgICAmJiBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzID49IHRleHRfc2VjdGlvbi0+dm1hCi0JICAgICAgJiYgKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJICA8IHRleHRfc2VjdGlvbi0+dm1hICsgdGV4dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgICAgJiYgKChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgxMDAwMDAwMAkgLyogYmVxICQwLCQwICovCi0JCSAgfHwgKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MDEwMDAwCSAvKiBiZ2V6ICQwICovCi0JCSAgfHwgKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MTEwMDAwKSkgLyogYmdlemFsICQwICovCi0JICAgIHsKLQkgICAgICBpZiAoKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MTEwMDAwKQkgLyogYmdlemFsICQwICovCi0JCWluc24gPSAweDBjMDAwMDAwOwkvKiBqYWwgKi8KLQkgICAgICBlbHNlCi0JCWluc24gPSAweDA4MDAwMDAwOwkvKiBqICovCi0JICAgICAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX01JUFNfSk1QOwotCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKHRleHRfc2VjdGlvbik7Ci0JICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gKHZhbHVlIDw8IDIpICsgbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FLiAgSXQgd291bGQgYmUgcG9zc2libGUgaW4gcHJpbmNpcGxlIHRvIGhhbmRsZQotICAgICAgICAgICAgICAgICBjb25kaXRpb25hbCBicmFuY2hlcyB3aGljaCBvdmVyZmxvdy4gIFRoZXkgY291bGQgYmUKLSAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgaW50byBhIGJyYW5jaCBhcm91bmQgYSBqdW1wLiAgVGhpcyB3b3VsZAotICAgICAgICAgICAgICAgICByZXF1aXJlIHNldHRpbmcgdXAgdmFyaWFudCBmcmFncyBmb3IgZWFjaCBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgYnJhbmNoIHR5cGUuICBUaGUgbmF0aXZlIE1JUFMgYXNzZW1ibGVyIGF0dGVtcHRzIHRvCi0gICAgICAgICAgICAgICAgIGhhbmRsZSB0aGVzZSBjYXNlcywgYnV0IGl0IGFwcGVhcnMgdG8gZG8gaXQKLSAgICAgICAgICAgICAgICAgaW5jb3JyZWN0bHkuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotCSAgICB9Ci0JfQotCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopIGJ1ZiwgKHZhbHVlVCkgaW5zbiwgNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kKLSAgICAgICAgICAmJiAhU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICAgICAmJiAhU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgICAgIFNfU0VUX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnRlcm5hbEVycm9yICgpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotI2lmIDAKLXZvaWQKLXByaW50SW5zbiAob2MpCi0gICAgIHVuc2lnbmVkIGxvbmcgb2M7Ci17Ci0gIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqcDsKLSAgaW50IHRyZWcsIHNyZWcsIGRyZWcsIHNoYW10OwotICBzaG9ydCBpbW07Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1PUENPREVTOyArK2kpCi0gICAgewotICAgICAgcCA9ICZtaXBzX29wY29kZXNbaV07Ci0gICAgICBpZiAoKChvYyAmIHAtPm1hc2spID09IHAtPm1hdGNoKSAmJiAocC0+cGluZm8gIT0gSU5TTl9NQUNSTykpCi0JewotCSAgcHJpbnRmICgiJTA4bHggJXNcdCIsIG9jLCBwLT5uYW1lKTsKLQkgIHRyZWcgPSAob2MgPj4gMTYpICYgMHgxZjsKLQkgIHNyZWcgPSAob2MgPj4gMjEpICYgMHgxZjsKLQkgIGRyZWcgPSAob2MgPj4gMTEpICYgMHgxZjsKLQkgIHNoYW10ID0gKG9jID4+IDYpICYgMHgxZjsKLQkgIGltbSA9IG9jOwotCSAgZm9yIChhcmdzID0gcC0+YXJnczs7ICsrYXJncykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKmFyZ3MpCi0JCXsKLQkJY2FzZSAnXDAnOgotCQkgIHByaW50ZiAoIlxuIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLCc6Ci0JCWNhc2UgJygnOgotCQljYXNlICcpJzoKLQkJICBwcmludGYgKCIlYyIsICphcmdzKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdyJzoKLQkJICBhc3NlcnQgKHRyZWcgPT0gc3JlZyk7Ci0JCSAgcHJpbnRmICgiJCVkLCQlZCIsIHRyZWcsIHNyZWcpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2QnOgotCQljYXNlICdHJzoKLQkJICBwcmludGYgKCIkJWQiLCBkcmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICd0JzoKLQkJY2FzZSAnRSc6Ci0JCSAgcHJpbnRmICgiJCVkIiwgdHJlZyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnayc6Ci0JCSAgcHJpbnRmICgiMHgleCIsIHRyZWcpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2InOgotCQljYXNlICdzJzoKLQkJICBwcmludGYgKCIkJWQiLCBzcmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdhJzoKLQkJICBwcmludGYgKCIweCUwOGx4Iiwgb2MgJiAweDFmZmZmZmYpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2knOgotCQljYXNlICdqJzoKLQkJY2FzZSAnbyc6Ci0JCWNhc2UgJ3UnOgotCQkgIHByaW50ZiAoIiVkIiwgaW1tKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICc8JzoKLQkJY2FzZSAnPic6Ci0JCSAgcHJpbnRmICgiJCVkIiwgc2hhbXQpOwotCQkgIGNvbnRpbnVlOwotCi0JCWRlZmF1bHQ6Ci0JCSAgaW50ZXJuYWxFcnJvciAoKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgcHJpbnRmIChfKCIlMDhseCAgVU5ERUZJTkVEXG4iKSwgb2MpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzeW1ib2xTICoKLWdldF9zeW1ib2wgKCkKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN5bWJvbFMgKnA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gKHN5bWJvbFMgKikgc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICByZXR1cm4gcDsKLX0KLQotLyogQWxpZ24gdGhlIGN1cnJlbnQgZnJhZyB0byBhIGdpdmVuIHBvd2VyIG9mIHR3by4gIFRoZSBNSVBTIGFzc2VtYmxlcgotICAgYWxzbyBhdXRvbWF0aWNhbGx5IGFkanVzdHMgYW55IHByZWNlZGluZyBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2FsaWduICh0bywgZmlsbCwgbGFiZWwpCi0gICAgIGludCB0bzsKLSAgICAgaW50IGZpbGw7Ci0gICAgIHN5bWJvbFMgKmxhYmVsOwotewotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0gIGZyYWdfYWxpZ24gKHRvLCBmaWxsLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgdG8pOwotICBpZiAobGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGFiZWwsIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChsYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICB9Ci19Ci0KLS8qIEFsaWduIHRvIGEgZ2l2ZW4gcG93ZXIgb2YgdHdvLiAgLmFsaWduIDAgdHVybnMgb2ZmIHRoZSBhdXRvbWF0aWMKLSAgIGFsaWdubWVudCB1c2VkIGJ5IHRoZSBkYXRhIGNyZWF0aW5nIHBzZXVkby1vcHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbGlnbiAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLSAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7Ci0KLSAgLyoKLQotICAgIG8gIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIHB1bGxzIGRvd24gYW55IGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgbGFiZWwKLSAgICAgICB0byB0aGUgYWxpZ25lZCBhZGRyZXNzLgotICAgIG8gIEl0J3Mgbm90IGRvY3VtZW50ZWQgYnV0IGF1dG8gYWxpZ25tZW50IGlzIHJlaW5zdGF0ZWQgYnkKLSAgICAgICBhIC5hbGlnbiBwc2V1ZG8gaW5zdHJ1Y3Rpb24uCi0gICAgbyAgTm90ZSBhbHNvIHRoYXQgYWZ0ZXIgYXV0byBhbGlnbm1lbnQgaXMgdHVybmVkIG9mZiB0aGUgbWlwcyBhc3NlbWJsZXIKLSAgICAgICBpc3N1ZXMgYW4gZXJyb3Igb24gYXR0ZW1wdCB0byBhc3NlbWJsZSBhbiBpbXByb3Blcmx5IGFsaWduZWQgZGF0YSBpdGVtLgotICAgICAgIFdlIGRvbid0LgotCi0gICAgKi8KLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKLSAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIpLCB0ZW1wID0gbWF4X2FsaWdubWVudCk7Ci0gIGVsc2UgaWYgKHRlbXAgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkLiIpKTsKLSAgICAgIHRlbXAgPSAwOwotICAgIH0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgdGVtcF9maWxsID0gMDsKLSAgaWYgKHRlbXApCi0gICAgewotICAgICAgYXV0b19hbGlnbiA9IDE7Ci0gICAgICBtaXBzX2FsaWduICh0ZW1wLCAoaW50KSB0ZW1wX2ZpbGwsCi0JCSAgaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGF1dG9fYWxpZ24gPSAwOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1taXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi17Ci0gIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY2hhbmdlX3NlYyAoc2VjKQotICAgICBpbnQgc2VjOwotewotICBzZWdUIHNlZzsKLQotICAvKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHdlIG9ubHkgdXNlIHRoZSAudGV4dCwgLmxpdDgsCi0gICAgIC5zZGF0YSBhbmQgLnNic3Mgc2VjdGlvbnMuICBXZSBjaGFuZ2UgdGhlIC5kYXRhIGFuZCAucmRhdGEKLSAgICAgcHNldWRvLW9wcyB0byB1c2UgLnNkYXRhLiAgKi8KLSAgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotICAgICAgJiYgKHNlYyA9PSAnZCcgfHwgc2VjID09ICdyJykpCi0gICAgc2VjID0gJ3MnOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBUaGUgRUxGIGJhY2tlbmQgbmVlZHMgdG8ga25vdyB0aGF0IHdlIGFyZSBjaGFuZ2luZyBzZWN0aW9ucywgc28KLSAgICAgdGhhdCAucHJldmlvdXMgd29ya3MgY29ycmVjdGx5LiAgV2UgY291bGQgZG8gc29tZXRoaW5nIGxpa2UgY2hlY2sKLSAgICAgZm9yIGEgb2JqX3NlY3Rpb25fY2hhbmdlX2hvb2sgbWFjcm8sIGJ1dCB0aGF0IG1pZ2h0IGJlIGNvbmZ1c2luZwotICAgICBhcyBpdCB3b3VsZCBub3QgYmUgYXBwcm9wcmlhdGUgdG8gdXNlIGl0IGluIHRoZSBzZWN0aW9uIGNoYW5naW5nCi0gICAgIGZ1bmN0aW9ucyBpbiByZWFkLmMsIHNpbmNlIG9iai1lbGYuYyBpbnRlcmNlcHRzIHRob3NlLiAgRklYTUU6Ci0gICAgIFRoaXMgc2hvdWxkIGJlIGNsZWFuZXIsIHNvbWVob3cuICAqLwotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLQotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0gIHN3aXRjaCAoc2VjKQotICAgIHsKLSAgICBjYXNlICd0JzoKLSAgICAgIHNfdGV4dCAoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLQl7Ci0JICBzZWcgPSBzdWJzZWdfbmV3IChSREFUQV9TRUNUSU9OX05BTUUsCi0JCQkgICAgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQkgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLAotCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgfCBTRUNfREFUQSkpOwotCSAgICAgIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCA0KTsKLQkgICAgfQotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJObyByZWFkIG9ubHkgZGF0YSBzZWN0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0JewotCSAgc2VnID0gc3Vic2VnX25ldyAoIi5zZGF0YSIsIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0JICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCQkgICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkJICAgICB8IFNFQ19EQVRBKTsKLQkgICAgICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgNCk7Ci0JICAgIH0KLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJHbG9iYWwgcG9pbnRlcnMgbm90IHN1cHBvcnRlZDsgcmVjb21waWxlIC1HIDAiKSk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgYXV0b19hbGlnbiA9IDE7Ci19Ci0KLXZvaWQKLW1pcHNfZW5hYmxlX2F1dG9fYWxpZ24gKCkKLXsKLSAgYXV0b19hbGlnbiA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbnMgKGxvZ19zaXplKQotICAgICBpbnQgbG9nX3NpemU7Ci17Ci0gIHN5bWJvbFMgKmxhYmVsOwotCi0gIGxhYmVsID0gaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEw7Ci0gIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKLSAgaWYgKGxvZ19zaXplID4gMCAmJiBhdXRvX2FsaWduKQotICAgIG1pcHNfYWxpZ24gKGxvZ19zaXplLCAwLCBsYWJlbCk7Ci0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0gIGNvbnMgKDEgPDwgbG9nX3NpemUpOwotfQotCi1zdGF0aWMgdm9pZAotc19mbG9hdF9jb25zICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgc3ltYm9sUyAqbGFiZWw7Ci0KLSAgbGFiZWwgPSBpbnNuX2xhYmVscyAhPSBOVUxMID8gaW5zbl9sYWJlbHMtPmxhYmVsIDogTlVMTDsKLQotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0KLSAgaWYgKGF1dG9fYWxpZ24pCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gJ2QnKQotCW1pcHNfYWxpZ24gKDMsIDAsIGxhYmVsKTsKLSAgICAgIGVsc2UKLQltaXBzX2FsaWduICgyLCAwLCBsYWJlbCk7Ci0gICAgfQotCi0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0KLSAgZmxvYXRfY29ucyAodHlwZSk7Ci19Ci0KLS8qIEhhbmRsZSAuZ2xvYmwuICBXZSBuZWVkIHRvIG92ZXJyaWRlIGl0IGJlY2F1c2Ugb24gSXJpeCA1IHlvdSBhcmUKLSAgIHBlcm1pdHRlZCB0byBzYXkKLSAgICAgICAuZ2xvYmwgZm9vIC50ZXh0Ci0gICB3aGVyZSBmb28gaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgdG8gbWVhbiB0aGF0IGZvbyBzaG91bGQgYmUKLSAgIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZ2xvYmwgKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZmxhZ3dvcmQgZmxhZzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBPbiBJcml4IDUsIGV2ZXJ5IGdsb2JhbCBzeW1ib2wgdGhhdCBpcyBub3QgZXhwbGljaXRseSBsYWJlbGxlZCBhcwotICAgICBiZWluZyBhIGZ1bmN0aW9uIGlzIGFwcGFyZW50bHkgbGFiZWxsZWQgYXMgYmVpbmcgYW4gb2JqZWN0LiAgKi8KLSAgZmxhZyA9IEJTRl9PQkpFQ1Q7Ci0KLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGNoYXIgKnNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBzZWNuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgc2VjbmFtZSk7Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JYXNfYmFkIChfKCIlczogbm8gc3VjaCBzZWN0aW9uIiksIHNlY25hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCWZsYWcgPSBCU0ZfRlVOQ1RJT047Ci0gICAgfQotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gZmxhZzsKLQotICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX29wdGlvbiAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGNoYXIgKm9wdDsKLSAgY2hhciBjOwotCi0gIG9wdCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmICgqb3B0ID09ICdPJykKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogV2hhdCBkb2VzIHRoaXMgbWVhbj8gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChvcHQsICJwaWMiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBpID0gYXRvaSAob3B0ICsgMyk7Ci0gICAgICBpZiAoaSA9PSAwKQotCW1pcHNfcGljID0gTk9fUElDOwotICAgICAgZWxzZSBpZiAoaSA9PSAyKQotCW1pcHNfcGljID0gU1ZSNF9QSUM7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCIub3B0aW9uIHBpYyVkIG5vdCBzdXBwb3J0ZWQiKSwgaSk7Ci0KLSAgICAgIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUICYmIG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIGlmIChnX3N3aXRjaF9zZWVuICYmIGdfc3dpdGNoX3ZhbHVlICE9IDApCi0JICAgIGFzX3dhcm4gKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7Ci0JICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0JICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgMCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBvcHRpb24gXCIlc1wiIiksIG9wdCk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIHN0YWNrIG9mIC5zZXQgdmFsdWVzLiAgKi8KLQotc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrCi17Ci0gIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqbmV4dDsKLSAgc3RydWN0IG1pcHNfc2V0X29wdGlvbnMgb3B0aW9uczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKm1pcHNfb3B0c19zdGFjazsKLQotLyogSGFuZGxlIHRoZSAuc2V0IHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNzZXQgKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyLCBjaDsKLQotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgY2ggPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotICBpZiAoc3RyY21wIChuYW1lLCAicmVvcmRlciIpID09IDApCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIgJiYgcHJldl9ub3BfZnJhZyAhPSBOVUxMKQotCXsKLQkgIC8qIElmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBub3BzLCB3ZSBjYW4gZGlzY2FyZCB0aGVtLiAgVGhlCi0JICAgICB1c3VhbCBub3AgaGFuZGxpbmcgd2lsbCBpbnNlcnQgYW55IHRoYXQgYXJlIHN0aWxsCi0JICAgICBuZWVkZWQuICovCi0JICBwcmV2X25vcF9mcmFnLT5mcl9maXggLT0gKHByZXZfbm9wX2ZyYWdfaG9sZHMKLQkJCQkgICAgKiAobWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0KSk7Ci0JICBwcmV2X25vcF9mcmFnID0gTlVMTDsKLQl9Ci0gICAgICBtaXBzX29wdHMubm9yZW9yZGVyID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vcmVvcmRlciIpID09IDApCi0gICAgewotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICBtaXBzX29wdHMubm9yZW9yZGVyID0gMTsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYXQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9hdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYXQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWFjcm8iKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub21hY3JvIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWlwc19vcHRzLm5vcmVvcmRlciA9PSAwKQotCWFzX2JhZCAoXygiYG5vcmVvcmRlcicgbXVzdCBiZSBzZXQgYmVmb3JlIGBub21hY3JvJyIpKTsKLSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb3ZlIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICJub3ZvbGF0aWxlIikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMubm9tb3ZlID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vbW92ZSIpID09IDAgfHwgc3RyY21wIChuYW1lLCAidm9sYXRpbGUiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub21vdmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYm9wdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYm9wdCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub2JvcHQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2JvcHQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWlwczE2IikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIk1JUFMtMTYiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5taXBzMTYgPSAxOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub21pcHMxNiIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICJub01JUFMtMTYiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5taXBzMTYgPSAwOwotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAibWlwcyIsIDQpID09IDApCi0gICAgewotICAgICAgaW50IGlzYTsKLQotICAgICAgLyogUGVybWl0IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgSVNBIG9uIHRoZSBmbHkuICBOZWVkbGVzcyB0bwotCSBzYXksIG1pc3VzZSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcy4gICovCi0gICAgICBpc2EgPSBhdG9pIChuYW1lICsgNCk7Ci0gICAgICBpZiAoaXNhID09IDApCi0JbWlwc19vcHRzLmlzYSA9IGZpbGVfbWlwc19pc2E7Ci0gICAgICBlbHNlIGlmIChpc2EgPCAxIHx8IGlzYSA+IDQpCi0JYXNfYmFkIChfKCJ1bmtub3duIElTQSBsZXZlbCIpKTsKLSAgICAgIGVsc2UKLQltaXBzX29wdHMuaXNhID0gaXNhOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0b2V4dGVuZCIpID09IDApCi0gICAgbWlwc19vcHRzLm5vYXV0b2V4dGVuZCA9IDA7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vYXV0b2V4dGVuZCIpID09IDApCi0gICAgbWlwc19vcHRzLm5vYXV0b2V4dGVuZCA9IDE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInB1c2giKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqczsKLQotICAgICAgcyA9IChzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpzKTsKLSAgICAgIHMtPm5leHQgPSBtaXBzX29wdHNfc3RhY2s7Ci0gICAgICBzLT5vcHRpb25zID0gbWlwc19vcHRzOwotICAgICAgbWlwc19vcHRzX3N0YWNrID0gczsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInBvcCIpID09IDApCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICpzOwotCi0gICAgICBzID0gbWlwc19vcHRzX3N0YWNrOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlhc19iYWQgKF8oIi5zZXQgcG9wIHdpdGggbm8gLnNldCBwdXNoIikpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHdlJ3JlIGNoYW5naW5nIHRoZSByZW9yZGVyIG1vZGUgd2UgbmVlZCB0byBoYW5kbGUKLSAgICAgICAgICAgICBkZWxheSBzbG90cyBjb3JyZWN0bHkuICAqLwotCSAgaWYgKHMtPm9wdGlvbnMubm9yZW9yZGVyICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcikKLQkgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0JICBlbHNlIGlmICghIHMtPm9wdGlvbnMubm9yZW9yZGVyICYmIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAocHJldl9ub3BfZnJhZyAhPSBOVUxMKQotCQl7Ci0JCSAgcHJldl9ub3BfZnJhZy0+ZnJfZml4IC09IChwcmV2X25vcF9mcmFnX2hvbGRzCi0JCQkJCSAgICAqIChtaXBzX29wdHMubWlwczE2ID8gMiA6IDQpKTsKLQkJICBwcmV2X25vcF9mcmFnID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIG1pcHNfb3B0cyA9IHMtPm9wdGlvbnM7Ci0JICBtaXBzX29wdHNfc3RhY2sgPSBzLT5uZXh0OwotCSAgZnJlZSAocyk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlRyaWVkIHRvIHNldCB1bnJlY29nbml6ZWQgc3ltYm9sOiAlc1xuIiksIG5hbWUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGNoOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hYmljYWxscyBwc2V1ZG8tb3AuICBJIGJlbGlldmUgdGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gICAub3B0aW9uIHBpYzIuICBJdCBtZWFucyB0byBnZW5lcmF0ZSBTVlI0IFBJQyBjYWxscy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FiaWNhbGxzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG1pcHNfcGljID0gU1ZSNF9QSUM7Ci0gIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotICAgIHsKLSAgICAgIGlmIChnX3N3aXRjaF9zZWVuICYmIGdfc3dpdGNoX3ZhbHVlICE9IDApCi0JYXNfd2FybiAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBQSUMgY29kZSIpKTsKLSAgICAgIGdfc3dpdGNoX3ZhbHVlID0gMDsKLSAgICB9Ci0gIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuY3Bsb2FkIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgU1ZSNAotICAgUElDIGNvZGUuICBJdCBzZXRzIHRoZSAkZ3AgcmVnaXN0ZXIgZm9yIHRoZSBmdW5jdGlvbiBiYXNlZCBvbiB0aGUKLSAgIGZ1bmN0aW9uIGFkZHJlc3MsIHdoaWNoIGlzIGluIHRoZSByZWdpc3RlciBuYW1lZCBpbiB0aGUgYXJndW1lbnQuCi0gICBUaGlzIHVzZXMgYSByZWxvY2F0aW9uIGFnYWluc3QgX2dwX2Rpc3AsIHdoaWNoIGlzIGhhbmRsZWQgc3BlY2lhbGx5Ci0gICBieSB0aGUgbGlua2VyLiAgVGhlIHJlc3VsdCBpczoKLQlsdWkJJGdwLCVoaShfZ3BfZGlzcCkKLQlhZGRpdQkkZ3AsJGdwLCVsbyhfZ3BfZGlzcCkKLQlhZGR1CSRncCwkZ3AsLmNwbG9hZCBhcmd1bWVudAotICAgVGhlIC5jcGxvYWQgYXJndW1lbnQgaXMgbm9ybWFsbHkgJDI1ID09ICR0OS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NwbG9hZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleDsKLSAgaW50IGljbnQgPSAwOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBTVlI0IFBJQyBjb2RlLCAuY3Bsb2FkIGlzIGlnbm9yZWQuICAqLwotICBpZiAobWlwc19waWMgIT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgc19pZ25vcmUgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiAuY3Bsb2FkIHNob3VsZCBiZSBhIGluIC5zZXQgbm9yZW9yZGVyIHNlY3Rpb24uICAqLwotICBpZiAobWlwc19vcHRzLm5vcmVvcmRlciA9PSAwKQotICAgIGFzX3dhcm4gKF8oIi5jcGxvYWQgbm90IGluIG5vcmVvcmRlciBzZWN0aW9uIikpOwotCi0gIGV4Llhfb3AgPSBPX3N5bWJvbDsKLSAgZXguWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoIl9ncF9kaXNwIik7Ci0gIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQotICAvKiBJbiBFTEYsIHRoaXMgc3ltYm9sIGlzIGltcGxpY2l0bHkgYW4gU1RUX09CSkVDVCBzeW1ib2wuICAqLwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoZXguWF9hZGRfc3ltYm9sKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQotICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsIEdQKTsKLSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsICJhZGRpdSIsICJ0LHIsaiIsIEdQLCBHUCwKLQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCi0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJhZGR1IiwgImQsdix0IiwKLQkgICAgICAgR1AsIEdQLCB0Y19nZXRfcmVnaXN0ZXIgKDApKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5jcHJlc3RvcmUgcHNldWRvLW9wLiAgVGhpcyBzdG9yZXMgJGdwIGludG8gYSBnaXZlbgotICAgb2Zmc2V0IGZyb20gJHNwLiAgVGhlIG9mZnNldCBpcyByZW1lbWJlcmVkLCBhbmQgYWZ0ZXIgbWFraW5nIGEgUElDCi0gICBjYWxsICRncCBpcyByZXN0b3JlZCBmcm9tIHRoYXQgbG9jYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc19jcHJlc3RvcmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGludCBpY250ID0gMDsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZSwgLmNwcmVzdG9yZSBpcyBpZ25vcmVkLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbWlwc19jcHJlc3RvcmVfb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXguWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCi0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4LAotCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJPyAic3ciIDogInNkIiksCi0JICAgICAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsIFNQKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5ncHdvcmQgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBQSUMKLSAgIGNvZGUuICBJdCBnZW5lcmF0ZXMgYSAzMiBiaXQgR1AgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotc19ncHdvcmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqbGFiZWw7Ci0gIGV4cHJlc3Npb25TIGV4OwotICBjaGFyICpwOwotCi0gIC8qIFdoZW4gbm90IGdlbmVyYXRpbmcgUElDIGNvZGUsIHRoaXMgaXMgdHJlYXRlZCBhcyAud29yZC4gICovCi0gIGlmIChtaXBzX3BpYyAhPSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzX2NvbnMgKDIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsYWJlbCA9IGluc25fbGFiZWxzICE9IE5VTEwgPyBpbnNuX2xhYmVscy0+bGFiZWwgOiBOVUxMOwotICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgaWYgKGF1dG9fYWxpZ24pCi0gICAgbWlwc19hbGlnbiAoMiwgMCwgbGFiZWwpOwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotCi0gIGV4cHJlc3Npb24gKCZleCk7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19zeW1ib2wgfHwgZXguWF9hZGRfbnVtYmVyICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnN1cHBvcnRlZCB1c2Ugb2YgLmdwd29yZCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIDAsIDQpOwotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwgJmV4LCAwLAotCSAgICAgICBCRkRfUkVMT0NfTUlQU19HUFJFTDMyKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5jcGFkZCBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggc3dpdGNoCi0gICB0YWJsZXMgaW4gU1ZSNCBQSUMgY29kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NwYWRkIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHJlZzsKLQotICAvKiBUaGlzIGlzIGlnbm9yZWQgd2hlbiBub3QgZ2VuZXJhdGluZyBTVlI0IFBJQyBjb2RlLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQWRkICRncCB0byB0aGUgcmVnaXN0ZXIgbmFtZWQgYXMgYW4gYXJndW1lbnQuICAqLwotICByZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOwotICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkgICAgICAgImQsdix0IiwgcmVnLCByZWcsIEdQKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOyAgCi19Ci0KLS8qIEhhbmRsZSB0aGUgLmluc24gcHNldWRvLW9wLiAgVGhpcyBtYXJrcyBpbnN0cnVjdGlvbiBsYWJlbHMgaW4KLSAgIG1pcHMxNiBtb2RlLiAgVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8gaGFuZGxlIHRoZW0gc3BlY2lhbGx5LAotICAgc3VjaCBhcyBnZW5lcmF0aW5nIGphbHggaW5zdHJ1Y3Rpb25zIHdoZW4gbmVlZGVkLiAgV2UgYWxzbyBtYWtlCi0gICB0aGVtIG9kZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhc3NlbWJseSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlCi0gICByaWdodCBzb3J0IG9mIGNvZGUuICBXZSB3aWxsIG1ha2UgdGhlbSBldmVuIGluIHRoZSBhZGp1c3Rfc3ltdGFiCi0gICByb3V0aW5lLCB3aGlsZSBsZWF2aW5nIHRoZW0gbWFya2VkLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciB0aGUKLSAgIGRlYnVnZ2VyIGFuZCB0aGUgZGlzYXNzZW1ibGVyLiAgVGhlIGxpbmtlciBrbm93cyB0byBtYWtlIHRoZW0gb2RkCi0gICBhZ2Fpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2luc24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5zdGFibiBkaXJlY3RpdmUuICBXZSBuZWVkIHRoZXNlIGluIG9yZGVyIHRvIG1hcmsgYSBsYWJlbAotICAgYXMgYmVpbmcgYSBtaXBzMTYgdGV4dCBsYWJlbCBjb3JyZWN0bHkuICBTb21ldGltZXMgdGhlIGNvbXBpbGVyCi0gICB3aWxsIGVtaXQgYSBsYWJlbCwgZm9sbG93ZWQgYnkgYSAuc3RhYm4sIGFuZCB0aGVuIHN3aXRjaCBzZWN0aW9ucy4KLSAgIElmIHRoZSBsYWJlbCBhbmQgLnN0YWJuIGFyZSBpbiBtaXBzMTYgbW9kZSwgdGhlbiB0aGUgbGFiZWwgaXMKLSAgIHJlYWxseSBhIG1pcHMxNiB0ZXh0IGxhYmVsLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19zdGFiICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gJ24nICYmIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIHNfc3RhYiAodHlwZSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLndlYWtleHQgcHNldWRvLW9wIGFzIGRlZmluZWQgaW4gS2FuZSBhbmQgSGVpbnJpY2guCi0gKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc193ZWFrZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCXsKLQkgIGFzX2JhZCAoIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIGAlcycuIiwKLQkJICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIAotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCX0KLSAgICAgIAotICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgYXNfYmFkICgiYmFkIC53ZWFrZXh0IGRpcmVjdGl2ZSIpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltYm9sUCwgJmV4cCk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFBhcnNlIGEgcmVnaXN0ZXIgc3RyaW5nIGludG8gYSBudW1iZXIuICBDYWxsZWQgZnJvbSB0aGUgRUNPRkYgY29kZQotICAgdG8gcGFyc2UgLmZyYW1lLiAgVGhlIGFyZ3VtZW50IGlzIG5vbi16ZXJvIGlmIHRoaXMgaXMgdGhlIGZyYW1lCi0gICByZWdpc3Rlciwgc28gdGhhdCB3ZSBjYW4gcmVjb3JkIGl0IGluIG1pcHNfZnJhbWVfcmVnLiAgKi8KLQotaW50Ci10Y19nZXRfcmVnaXN0ZXIgKGZyYW1lKQotICAgICBpbnQgZnJhbWU7Ci17Ci0gIGludCByZWc7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICckJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJleHBlY3RlZCBgJCciKSk7Ci0gICAgICByZWcgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIHJlZyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKHJlZyA8IDAgfHwgcmVnID49IDMyKQotCXsKLQkgIGFzX3dhcm4gKF8oIkJhZCByZWdpc3RlciBudW1iZXIiKSk7Ci0JICByZWcgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZnAiLCAyKSA9PSAwKQotCXJlZyA9IEZQOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic3AiLCAyKSA9PSAwKQotCXJlZyA9IFNQOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZ3AiLCAyKSA9PSAwKQotCXJlZyA9IEdQOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYXQiLCAyKSA9PSAwKQotCXJlZyA9IEFUOwotICAgICAgZWxzZQotCXsKLQkgIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCByZWdpc3RlciBuYW1lIikpOwotCSAgcmVnID0gMDsKLQl9Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICB9Ci0gIGlmIChmcmFtZSkKLSAgICBtaXBzX2ZyYW1lX3JlZyA9IHJlZyAhPSAwID8gcmVnIDogU1A7Ci0gIHJldHVybiByZWc7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBXZSBkb24ndCBuZWVkIHRvIGFsaWduIEVMRiBzZWN0aW9ucyB0byB0aGUgZnVsbCBhbGlnbm1lbnQuCi0gICAgIEhvd2V2ZXIsIElyaXggNSBtYXkgcHJlZmVyIHRoYXQgd2UgYWxpZ24gdGhlbSBhdCBsZWFzdCB0byBhIDE2Ci0gICAgIGJ5dGUgYm91bmRhcnkuICBXZSBkb24ndCBib3RoZXIgdG8gYWxpZ24gdGhlIHNlY3Rpb25zIGlmIHdlIGFyZQotICAgICB0YXJnZXRlZCBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLiAgKi8KLSAgaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgPT0gMCkKLSAgICByZXR1cm4gYWRkcjsKLSAgaWYgKGFsaWduID4gNCkKLSAgICBhbGlnbiA9IDQ7Ci0jZW5kaWYKLQotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotLyogVXRpbGl0eSByb3V0aW5lLCBjYWxsZWQgZnJvbSBhYm92ZSBhcyB3ZWxsLiAgSWYgY2FsbGVkIHdoaWxlIHRoZQotICAgaW5wdXQgZmlsZSBpcyBzdGlsbCBiZWluZyByZWFkLCBpdCdzIG9ubHkgYW4gYXBwcm94aW1hdGlvbi4gIChGb3IKLSAgIGV4YW1wbGUsIGEgc3ltYm9sIG1heSBsYXRlciBiZWNvbWUgZGVmaW5lZCB3aGljaCBhcHBlYXJlZCB0byBiZQotICAgdW5kZWZpbmVkIGVhcmxpZXIuKSAgKi8KLQotc3RhdGljIGludAotbm9waWNfbmVlZF9yZWxheCAoc3ltLCBiZWZvcmVfcmVsYXhpbmcpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50IGJlZm9yZV9yZWxheGluZzsKLXsKLSAgaWYgKHN5bSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0gICAgICBpbnQgY2hhbmdlOwotCi0gICAgICAvKiBGaW5kIG91dCB3aGV0aGVyIHRoaXMgc3ltYm9sIGNhbiBiZSByZWZlcmVuY2VkIG9mZiB0aGUgR1AKLQkgcmVnaXN0ZXIuICBJdCBjYW4gYmUgaWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSAtRyBzaXplIG9yIGlmCi0JIGl0IGlzIGluIHRoZSAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbi4gIENlcnRhaW4gc3ltYm9scyBjYW4KLQkgbm90IGJlIHJlZmVyZW5jZWQgb2ZmIHRoZSBHUCwgYWx0aG91Z2ggaXQgYXBwZWFycyBhcyB0aG91Z2gKLQkgdGhleSBjYW4uICAqLwotICAgICAgc3ltbmFtZSA9IFNfR0VUX05BTUUgKHN5bSk7Ci0gICAgICBpZiAoc3ltbmFtZSAhPSAoY29uc3QgY2hhciAqKSBOVUxMCi0JICAmJiAoc3RyY21wIChzeW1uYW1lLCAiZXByb2wiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiZXRleHQiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2dwIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgImVkYXRhIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9mYnNzIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9mZGF0YSIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZnRleHQiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiZW5kIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9ncF9kaXNwIikgPT0gMCkpCi0JY2hhbmdlID0gMTsKLSAgICAgIGVsc2UgaWYgKCghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkKLQkgICAgICAgJiYgKDAKLSNpZm5kZWYgTk9fRUNPRkZfREVCVUdHSU5HCi0JCSAgIHx8IChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZXh0ZXJuX3NpemUgIT0gMAotCQkgICAgICAgJiYgKHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9leHRlcm5fc2l6ZQotCQkJICAgPD0gZ19zd2l0Y2hfdmFsdWUpKQotI2VuZGlmCi0JCSAgIC8qIFdlIG11c3QgZGVmZXIgdGhpcyBkZWNpc2lvbiB1bnRpbCBhZnRlciB0aGUgd2hvbGUKLQkJICAgICAgZmlsZSBoYXMgYmVlbiByZWFkLCBzaW5jZSB0aGVyZSBtaWdodCBiZSBhIC5leHRlcm4KLQkJICAgICAgYWZ0ZXIgdGhlIGZpcnN0IHVzZSBvZiB0aGlzIHN5bWJvbC4gICovCi0JCSAgIHx8IChiZWZvcmVfcmVsYXhpbmcKLSNpZm5kZWYgTk9fRUNPRkZfREVCVUdHSU5HCi0JCSAgICAgICAmJiBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZXh0ZXJuX3NpemUgPT0gMAotI2VuZGlmCi0JCSAgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA9PSAwKQotCQkgICB8fCAoU19HRVRfVkFMVUUgKHN5bSkgIT0gMAotCQkgICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPD0gZ19zd2l0Y2hfdmFsdWUpKSkKLQljaGFuZ2UgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0KLQkgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bSkpOwotCSAgYXNzZXJ0IChzdHJjbXAgKHNlZ25hbWUsICIubGl0OCIpICE9IDAKLQkJICAmJiBzdHJjbXAgKHNlZ25hbWUsICIubGl0NCIpICE9IDApOwotCSAgY2hhbmdlID0gKHN0cmNtcCAoc2VnbmFtZSwgIi5zZGF0YSIpICE9IDAKLQkJICAgICYmIHN0cmNtcCAoc2VnbmFtZSwgIi5zYnNzIikgIT0gMAotCQkgICAgJiYgc3RybmNtcCAoc2VnbmFtZSwgIi5zZGF0YS4iLCA3KSAhPSAwCi0JCSAgICAmJiBzdHJuY21wIChzZWduYW1lLCAiLmdudS5saW5rb25jZS5zLiIsIDE2KSAhPSAwKTsKLQl9Ci0gICAgICByZXR1cm4gY2hhbmdlOwotICAgIH0KLSAgZWxzZQotICAgIC8qIFdlIGFyZSBub3Qgb3B0aW1pemluZyBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotLyogR2l2ZW4gYSBtaXBzMTYgdmFyaWFudCBmcmFnIEZSQUdQLCByZXR1cm4gbm9uLXplcm8gaWYgaXQgbmVlZHMgYW4KLSAgIGV4dGVuZGVkIG9wY29kZS4gIFNFQyBpcyB0aGUgc2VjdGlvbiB0aGUgZnJhZyBpcyBpbi4gICovCi0KLXN0YXRpYyBpbnQKLW1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgc2VjLCBzdHJldGNoKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGxvbmcgc3RyZXRjaDsKLXsKLSAgaW50IHR5cGU7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCAqb3A7Ci0gIG9mZnNldFQgdmFsOwotICBpbnQgbWludGlueSwgbWF4dGlueTsKLSAgc2VnVCBzeW1zZWM7Ci0KLSAgaWYgKFJFTEFYX01JUFMxNl9VU0VSX1NNQUxMIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChSRUxBWF9NSVBTMTZfVVNFUl9FWFQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICByZXR1cm4gMTsKLQotICB0eXBlID0gUkVMQVhfTUlQUzE2X1RZUEUgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgb3AgPSBtaXBzMTZfaW1tZWRfb3BlcmFuZHM7Ci0gIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQotICAgIHsKLSAgICAgICsrb3A7Ci0gICAgICBhc3NlcnQgKG9wIDwgbWlwczE2X2ltbWVkX29wZXJhbmRzICsgTUlQUzE2X05VTV9JTU1FRCk7Ci0gICAgfQotCi0gIGlmIChvcC0+dW5zcCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCi0JewotCSAgbWludGlueSA9IDE7Ci0JICBtYXh0aW55ID0gMSA8PCBvcC0+bmJpdHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1pbnRpbnkgPSAwOwotCSAgbWF4dGlueSA9ICgxIDw8IG9wLT5uYml0cykgLSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtaW50aW55ID0gLSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpOwotICAgICAgbWF4dGlueSA9ICgxIDw8IChvcC0+bmJpdHMgLSAxKSkgLSAxOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBhbHdheXMgY2FsbCBTX0dFVF9WQUxVRSBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgbG9jayBpbiBhIHBhcnRpY3VsYXIgZnJhZyBhZGRyZXNzLiAgKi8KLSAgaWYgKHN5bWJvbF9jb25zdGFudF9wIChmcmFncC0+ZnJfc3ltYm9sKSkKLSAgICB7Ci0gICAgICB2YWwgPSAoU19HRVRfVkFMVUUgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICAgICArIHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MpOwotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0gICAgfQotICBlbHNlIGlmIChzeW1ib2xfZXF1YXRlZF9wIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgICYmIChzeW1ib2xfY29uc3RhbnRfcAotCSAgICAgICAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfc3ltYm9sKSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqZXFzeW07Ci0KLSAgICAgIGVxc3ltID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfc3ltYm9sOwotICAgICAgdmFsID0gKFNfR0VUX1ZBTFVFIChlcXN5bSkKLQkgICAgICsgc3ltYm9sX2dldF9mcmFnIChlcXN5bSktPmZyX2FkZHJlc3MKLQkgICAgICsgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfbnVtYmVyCi0JICAgICArIHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MpOwotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoZXFzeW0pOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAxOwotCi0gIGlmIChvcC0+cGNyZWwpCi0gICAgewotICAgICAgYWRkcmVzc1QgYWRkcjsKLQotICAgICAgLyogV2Ugd29uJ3QgaGF2ZSB0aGUgc2VjdGlvbiB3aGVuIHdlIGFyZSBjYWxsZWQgZnJvbQotICAgICAgICAgbWlwc19yZWxheF9mcmFnLiAgSG93ZXZlciwgd2Ugd2lsbCBhbHdheXMgaGF2ZSBiZWVuIGNhbGxlZAotICAgICAgICAgZnJvbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBmaXJzdC4gIElmIHRoaXMgaXMgYQotICAgICAgICAgYnJhbmNoIHRvIGEgZGlmZmVyZW50IHNlY3Rpb24sIHdlIG1hcmsgaXQgYXMgc3VjaC4gIElmIFNFQyBpcwotICAgICAgICAgTlVMTCwgYW5kIHRoZSBmcmFnIGlzIG5vdCBtYXJrZWQsIHRoZW4gaXQgbXVzdCBiZSBhIGJyYW5jaCB0bwotICAgICAgICAgdGhlIHNhbWUgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JewotCSAgaWYgKFJFTEFYX01JUFMxNl9MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN5bXNlYyAhPSBzZWMpCi0JICAgIHsKLQkgICAgICBmcmFncC0+ZnJfc3VidHlwZSA9Ci0JCVJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0KLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHN1cHBvcnQgdGhpcywgYW5kIGxldCB0aGUgbGlua2VyCi0gICAgICAgICAgICAgICAgIGNhdGNoIGJyYW5jaGVzIGFuZCBsb2FkcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLAotCQkJICAgIF8oInVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSB0byBkaWZmZXJlbnQgc2VjdGlvbiIpKTsKLQotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGUgc3ltYm9sIGZyYWdtZW50IGlzIGluCi0JIHRoZSBzYW1lIHNlY3Rpb24uICBJZiB0aGUgZnJfYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGZyYWdtZW50Ci0JIGlzIGdyZWF0ZXIgdGhlbiB0aGUgYWRkcmVzcyBvZiB0aGlzIGZyYWdtZW50IHdlIHdhbnQgdG8gYWRkCi0JIGluIFNUUkVUQ0ggaW4gb3JkZXIgdG8gZ2V0IGEgYmV0dGVyIGVzdGltYXRlIG9mIHRoZSBhZGRyZXNzLgotCSBUaGlzIHBhcnRpY3VsYXJseSBtYXR0ZXJzIGJlY2F1c2Ugb2YgdGhlIHNoaWZ0IGJpdHMuICAqLwotICAgICAgaWYgKHN0cmV0Y2ggIT0gMAotCSAgJiYgKHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MKLQkgICAgICA+PSBmcmFncC0+ZnJfYWRkcmVzcykpCi0JewotCSAgZnJhZ1MgKmY7Ci0KLQkgIC8qIEFkanVzdCBzdHJldGNoIGZvciBhbnkgYWxpZ25tZW50IGZyYWcuICBOb3RlIHRoYXQgaWYgaGF2ZQotICAgICAgICAgICAgIGJlZW4gZXhwYW5kaW5nIHRoZSBlYXJsaWVyIGNvZGUsIHRoZSBzeW1ib2wgbWF5IGJlCi0gICAgICAgICAgICAgZGVmaW5lZCBpbiB3aGF0IGFwcGVhcnMgdG8gYmUgYW4gZWFybGllciBmcmFnLiAgRklYTUU6Ci0gICAgICAgICAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSB0aGUgZnJfc3VidHlwZSBmaWVsZCwgd2hpY2ggc3BlY2lmaWVzCi0gICAgICAgICAgICAgYSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBza2lwIHdoZW4gZG9pbmcgYW4KLSAgICAgICAgICAgICBhbGlnbm1lbnQuICAqLwotCSAgZm9yIChmID0gZnJhZ3A7Ci0JICAgICAgIGYgIT0gTlVMTCAmJiBmICE9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0JICAgICAgIGYgPSBmLT5mcl9uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKGYtPmZyX3R5cGUgPT0gcnNfYWxpZ24gfHwgZi0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlKQotCQl7Ci0JCSAgaWYgKHN0cmV0Y2ggPCAwKQotCQkgICAgc3RyZXRjaCA9IC0gKCgtIHN0cmV0Y2gpCi0JCQkJICYgfiAoKDEgPDwgKGludCkgZi0+ZnJfb2Zmc2V0KSAtIDEpKTsKLQkJICBlbHNlCi0JCSAgICBzdHJldGNoICY9IH4gKCgxIDw8IChpbnQpIGYtPmZyX29mZnNldCkgLSAxKTsKLQkJICBpZiAoc3RyZXRjaCA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgdmFsICs9IHN0cmV0Y2g7Ci0JfQotCi0gICAgICBhZGRyID0gZnJhZ3AtPmZyX2FkZHJlc3MgKyBmcmFncC0+ZnJfZml4OwotCi0gICAgICAvKiBUaGUgYmFzZSBhZGRyZXNzIHJ1bGVzIGFyZSBjb21wbGljYXRlZC4gIFRoZSBiYXNlIGFkZHJlc3Mgb2YKLSAgICAgICAgIGEgYnJhbmNoIGlzIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uICBUaGUgYmFzZSBhZGRyZXNzIG9mIGEKLSAgICAgICAgIFBDIHJlbGF0aXZlIGxvYWQgb3IgYWRkIGlzIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsIGJ1dCBpZiBpdAotICAgICAgICAgaXMgaW4gYSBkZWxheSBzbG90IChpbiB3aGljaCBjYXNlIGl0IGNhbiBub3QgYmUgZXh0ZW5kZWQpIHVzZQotICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIHdob3NlIGRlbGF5IHNsb3QgaXQgaXMgaW4uICAqLwotICAgICAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotCXsKLQkgIGFkZHIgKz0gMjsKLQotCSAgLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3N1bWluZyB0aGF0IHRoaXMgZnJhZyBzaG91bGQgYmUKLQkgICAgIGV4dGVuZGVkLCB0aGVuLCB0aGUgY3VycmVudCBhZGRyZXNzIGlzIHR3byBieXRlcwotCSAgICAgaGlnaGVyLiAqLwotCSAgaWYgKFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICBhZGRyICs9IDI7Ci0KLQkgIC8qIElnbm9yZSB0aGUgbG93IGJpdCBpbiB0aGUgdGFyZ2V0LCBzaW5jZSBpdCB3aWxsIGJlIHNldAotICAgICAgICAgICAgIGZvciBhIHRleHQgbGFiZWwuICAqLwotCSAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCSAgICAtLXZhbDsKLQl9Ci0gICAgICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfSkFMX0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JYWRkciAtPSA0OwotICAgICAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JYWRkciAtPSAyOwotCi0gICAgICB2YWwgLT0gYWRkciAmIH4gKCgxIDw8IG9wLT5zaGlmdCkgLSAxKTsKLQotICAgICAgLyogQnJhbmNoIG9mZnNldHMgaGF2ZSBhbiBpbXBsaWNpdCAwIGluIHRoZSBsb3dlc3QgYml0LiAgKi8KLSAgICAgIGlmICh0eXBlID09ICdwJyB8fCB0eXBlID09ICdxJykKLQl2YWwgLz0gMjsKLQotICAgICAgLyogSWYgYW55IG9mIHRoZSBzaGlmdGVkIGJpdHMgYXJlIHNldCwgd2UgbXVzdCB1c2UgYW4gZXh0ZW5kZWQKLSAgICAgICAgIG9wY29kZS4gIElmIHRoZSBhZGRyZXNzIGRlcGVuZHMgb24gdGhlIHNpemUgb2YgdGhpcwotICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoaXMgY2FuIGxlYWQgdG8gYSBsb29wLCBzbyB3ZSBhcnJhbmdlIHRvIGFsd2F5cwotICAgICAgICAgdXNlIGFuIGV4dGVuZGVkIG9wY29kZS4gIFdlIG9ubHkgY2hlY2sgdGhpcyB3aGVuIHdlIGFyZSBpbgotICAgICAgICAgdGhlIG1haW4gcmVsYXhhdGlvbiBsb29wLCB3aGVuIFNFQyBpcyBOVUxMLiAgKi8KLSAgICAgIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMCAmJiBzZWMgPT0gTlVMTCkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9Ci0JICAgIFJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBhYm91dCB0byBtYXJrIGEgZnJhZyBhcyBleHRlbmRlZCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICAgICAgaXMgcHJlY2lzZWx5IG1heHRpbnkgKyAxLCB0aGVuIHRoZXJlIGlzIGEgY2hhbmNlIG9mIGFuCi0gICAgICAgICBpbmZpbml0ZSBsb29wIGFzIGluIHRoZSBmb2xsb3dpbmcgY29kZToKLQkgICAgIGxhCSQ0LGZvbwotCSAgICAgLnNraXAJMTAyMAotCSAgICAgLmFsaWduCTIKLQkgICBmb286Ci0JIEluIHRoaXMgY2FzZSB3aGVuIHRoZSBsYSBpcyBleHRlbmRlZCwgZm9vIGlzIDB4M2ZjIGJ5dGVzCi0JIGF3YXksIHNvIHRoZSBsYSBjYW4gYmUgc2hydW5rLCBidXQgdGhlbiBmb28gaXMgMHg0MDAgYXdheSwgc28KLQkgdGhlIGxhIG11c3QgYmUgZXh0ZW5kZWQuICBUbyBhdm9pZCB0aGlzIGxvb3AsIHdlIG1hcmsgdGhlCi0JIGZyYWcgYXMgZXh0ZW5kZWQgaWYgaXQgd2FzIHNtYWxsLCBhbmQgaXMgYWJvdXQgdG8gYmVjb21lCi0JIGV4dGVuZGVkIHdpdGggYSB2YWx1ZSBvZiBtYXh0aW55ICsgMS4gICovCi0gICAgICBpZiAodmFsID09ICgobWF4dGlueSArIDEpIDw8IG9wLT5zaGlmdCkKLQkgICYmICEgUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkKLQkgICYmIHNlYyA9PSBOVUxMKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0KLQkgICAgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN5bXNlYyAhPSBhYnNvbHV0ZV9zZWN0aW9uICYmIHNlYyAhPSBOVUxMKQotICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLCBfKCJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIikpOwotCi0gIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMAotICAgICAgfHwgdmFsIDwgKG1pbnRpbnkgPDwgb3AtPnNoaWZ0KQotICAgICAgfHwgdmFsID4gKG1heHRpbnkgPDwgb3AtPnNoaWZ0KSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhIGZyYWcgYmVmb3JlIHJlbGF4aW5nLiAgVW5sZXNzIHRoaXMgaXMgdGhlCi0gICBtaXBzMTYsIHdlIGFyZSBub3QgcmVhbGx5IHJlbGF4aW5nIGhlcmUsIGFuZCB0aGUgZmluYWwgc2l6ZSBpcwotICAgZW5jb2RlZCBpbiB0aGUgc3VidHlwZSBpbmZvcm1hdGlvbi4gIEZvciB0aGUgbWlwczE2LCB3ZSBoYXZlIHRvCi0gICBkZWNpZGUgd2hldGhlciB3ZSBhcmUgdXNpbmcgYW4gZXh0ZW5kZWQgb3Bjb2RlIG9yIG5vdC4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZ3R5cGUpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZ3R5cGU7Ci17Ci0gIGludCBjaGFuZ2U7Ci0KLSAgaWYgKFJFTEFYX01JUFMxNl9QIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgewotICAgICAgaWYgKG1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgc2VndHlwZSwgMCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfTUFSS19FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgfQotCi0gIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0gICAgewotICAgICAgY2hhbmdlID0gbm9waWNfbmVlZF9yZWxheCAoZnJhZ3AtPmZyX3N5bWJvbCwgMCk7Ci0gICAgfQotICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc3ltc2VjOwotCi0gICAgICBzeW0gPSBmcmFncC0+ZnJfc3ltYm9sOwotCi0gICAgICAvKiBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzeW1ib2wgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbC4gICovCi0gICAgICB3aGlsZSAoc3ltYm9sX2VxdWF0ZWRfcCAoc3ltKQotCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQl7Ci0JICBzeW1ib2xTICpuOwotCi0JICAvKiBJdCdzIHBvc3NpYmxlIHRvIGdldCBhIGxvb3AgaGVyZSBpbiBhIGJhZGx5IHdyaXR0ZW4KLSAgICAgICAgICAgICBwcm9ncmFtLiAgKi8KLQkgIG4gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX3N5bWJvbDsKLQkgIGlmIChuID09IHN5bSkKLQkgICAgYnJlYWs7Ci0JICBzeW0gPSBuOwotCX0KLQotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotICAgICAgLyogVGhpcyBtdXN0IGR1cGxpY2F0ZSB0aGUgdGVzdCBpbiBhZGp1c3RfcmVsb2Nfc3ltcy4gICovCi0gICAgICBjaGFuZ2UgPSAoc3ltc2VjICE9ICZiZmRfdW5kX3NlY3Rpb24KLQkJJiYgc3ltc2VjICE9ICZiZmRfYWJzX3NlY3Rpb24KLQkJJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNlYykpOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIGlmIChjaGFuZ2UpCi0gICAgewotICAgICAgLyogUmVjb3JkIHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0IHJlbG9jIGluIHRoZSBmcl9vcGNvZGUgZmllbGQuCi0JIFRoaXMgbGV0cyBtZF9jb252ZXJ0X2ZyYWcgYW5kIHRjX2dlbl9yZWxvYyBrbm93IHRoYXQgdGhlIGNvZGUKLQkgbXVzdCBiZSBleHBhbmRlZC4gICovCi0gICAgICBmcmFncC0+ZnJfb3Bjb2RlID0gKGZyYWdwLT5mcl9saXRlcmFsCi0JCQkgICsgZnJhZ3AtPmZyX2ZpeAotCQkJICAtIFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpCi0JCQkgICsgUkVMQVhfUkVMT0MxIChmcmFncC0+ZnJfc3VidHlwZSkpOwotICAgICAgLyogRklYTUU6IFRoaXMgcmVhbGx5IG5lZWRzIGFzX3dhcm5fd2hlcmUuICAqLwotICAgICAgaWYgKFJFTEFYX1dBUk4gKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlhc193YXJuIChfKCJBVCB1c2VkIGFmdGVyIFwiLnNldCBub2F0XCIgb3IgbWFjcm8gdXNlZCBhZnRlciBcIi5zZXQgbm9tYWNyb1wiIikpOwotICAgIH0KLQotICBpZiAoISBjaGFuZ2UpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gUkVMQVhfTkVXIChmcmFncC0+ZnJfc3VidHlwZSkgLSBSRUxBWF9PTEQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wKLSAgIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLiAgRG9uJ3QgYWRqdXN0Ci0gICBNSVBTMTYganVtcCByZWxvY2F0aW9ucywgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZm9ybWF0Ci0gICBvZiB0aGUgb2Zmc2V0IGluIHRoZSAubyBmaWxlLiAgRG9uJ3QgYWRqdXN0IHJlbG9jYXRpb25zIGFnYWluc3QKLSAgIG1pcHMxNiBzeW1ib2xzLCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIGZpbmQgdGhlbSBpZiBpdCBuZWVkcyB0byBzZXQKLSAgIHVwIGEgc3R1Yi4gICovCi0KLWludAotbWlwc19maXhfYWRqdXN0YWJsZSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIFNfR0VUX09USEVSIChmaXhwLT5meF9hZGRzeSkgPT0gU1RPX01JUFMxNgotICAgICAgJiYgZml4cC0+Znhfc3Vic3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICByZXR1cm4gMTsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICAqLwotCi1hcmVsZW50ICoqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBzdGF0aWMgYXJlbGVudCAqcmV0dmFsWzRdOwotICBhcmVsZW50ICpyZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgcmVsb2MgPSByZXR2YWxbMF0gPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmV0dmFsWzFdID0gTlVMTDsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLSAgICAgICYmIFNXSVRDSF9UQUJMRSAoZml4cCkpCi0gICAgewotICAgICAgLyogRm9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5IHdlIHVzZSBhIHNwZWNpYWwgcmVsb2MuICBUaGUgYWRkZW5kCi0JIGlzIGFjdHVhbGx5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIHRoZQotCSBzdWJ0cmFoZW5kLiAgKi8KLSAgICAgIHJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzcyAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JYXNfZmF0YWwgKF8oIkRvdWJsZSBjaGVjayBmeF9yX3R5cGUgaW4gdGMtbWlwcy5jOnRjX2dlbl9yZWxvYyIpKTsKLSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19HUFJFTDMyOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9MTzE2KQotICAgIHsKLSAgICAgIC8qIFdlIHVzZSBhIHNwZWNpYWwgYWRkZW5kIGZvciBhbiBpbnRlcm5hbCBSRUxMTyByZWxvYy4gICovCi0gICAgICBpZiAoc3ltYm9sX3NlY3Rpb25fcCAoZml4cC0+ZnhfYWRkc3kpKQotCXJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzcyAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBlbHNlCi0JcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlciArIHJlbG9jLT5hZGRyZXNzOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MpCi0gICAgewotICAgICAgYXNzZXJ0IChmaXhwLT5meF9uZXh0ICE9IE5VTEwKLQkgICAgICAmJiBmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpOwotICAgICAgLyogV2UgdXNlIGEgc3BlY2lhbCBhZGRlbmQgZm9yIGFuIGludGVybmFsIFJFTEhJIHJlbG9jLiAgVGhlCi0JIHJlbG9jIGlzIHJlbGF0aXZlIHRvIHRoZSBSRUxMTzsgYWRqdXN0IHRoZSBhZGRlbmQKLQkgYWNjb3JkaW5nbHkuICAqLwotICAgICAgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKGZpeHAtPmZ4X2FkZHN5KSkKLQlyZWxvYy0+YWRkZW5kID0gKGZpeHAtPmZ4X25leHQtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJCSArIGZpeHAtPmZ4X25leHQtPmZ4X3doZXJlCi0JCQkgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpKTsKLSAgICAgIGVsc2UKLQlyZWxvYy0+YWRkZW5kID0gKGZpeHAtPmZ4X2FkZG51bWJlcgotCQkJICsgZml4cC0+ZnhfbmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkJICsgZml4cC0+ZnhfbmV4dC0+Znhfd2hlcmUpOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwgPT0gMCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0JLyogQSBncnVlc29tZSBoYWNrIHdoaWNoIGlzIGEgcmVzdWx0IG9mIHRoZSBncnVlc29tZSBnYXMgcmVsb2MKLQkgICBoYW5kbGluZy4gICovCi0JcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRyZXNzOwotICAgICAgZWxzZQotCXJlbG9jLT5hZGRlbmQgPSAtcmVsb2MtPmFkZHJlc3M7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB2YXJpYW50IGZyYWcsIHdlIG1heSBuZWVkIHRvIGFkanVzdCB0aGUgZXhpc3RpbmcKLSAgICAgcmVsb2MgYW5kIGdlbmVyYXRlIGEgbmV3IG9uZS4gICovCi0gIGlmIChmaXhwLT5meF9mcmFnLT5mcl9vcGNvZGUgIT0gTlVMTAotICAgICAgJiYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTAotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTDE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNikpCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsb2MyOwotCi0gICAgICBhc3NlcnQgKCEgUkVMQVhfTUlQUzE2X1AgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgcmVsb2MgaW4gdGhpcyBmcmFnLCB0aGVuIHdlIGhhdmUgdHdvCi0JIEdQUkVMIHJlbG9jcywgb3IgYSBHT1RfSEkxNi9HT1RfTE8xNiBwYWlyLCBvciBhCi0JIENBTExfSEkxNi9DQUxMX0xPMTYsIGJvdGggb2Ygd2hpY2ggYXJlIGJlaW5nIHJlcGxhY2VkLiAgTGV0Ci0JIHRoZSBzZWNvbmQgb25lIGhhbmRsZSBhbGwgb2YgdGhlbS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfbmV4dCAhPSBOVUxMCi0JICAmJiBmaXhwLT5meF9mcmFnID09IGZpeHAtPmZ4X25leHQtPmZ4X2ZyYWcpCi0JewotCSAgYXNzZXJ0ICgoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMCi0JCSAgICYmIGZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkJICB8fCAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci0JCSAgICAgICYmIChmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUKLQkJCSAgPT0gQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpKQotCQkgIHx8IChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2Ci0JCSAgICAgICYmIChmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUKLQkJCSAgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KSkpOwotCSAgcmV0dmFsWzBdID0gTlVMTDsKLQkgIHJldHVybiByZXR2YWw7Ci0JfQotCi0gICAgICBmaXhwLT5meF93aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX29wY29kZSAtIGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gICAgICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIHJlbG9jMiA9IHJldHZhbFsxXSA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgcmV0dmFsWzJdID0gTlVMTDsKLSAgICAgIHJlbG9jMi0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICpyZWxvYzItPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIHJlbG9jMi0+YWRkcmVzcyA9IChyZWxvYy0+YWRkcmVzcwotCQkJICsgKFJFTEFYX1JFTE9DMiAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkKLQkJCSAgICAtIFJFTEFYX1JFTE9DMSAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkpKTsKLSAgICAgIHJlbG9jMi0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICAgICAgcmVsb2MyLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBhc3NlcnQgKHJlbG9jMi0+aG93dG8gIT0gTlVMTCk7Ci0KLSAgICAgIGlmIChSRUxBWF9SRUxPQzMgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpKQotCXsKLQkgIGFyZWxlbnQgKnJlbG9jMzsKLQotCSAgcmVsb2MzID0gcmV0dmFsWzJdID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JICByZXR2YWxbM10gPSBOVUxMOwotCSAgKnJlbG9jMyA9ICpyZWxvYzI7Ci0JICByZWxvYzMtPmFkZHJlc3MgKz0gNDsKLQl9Ci0KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JewotCSAgYXNzZXJ0IChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0hJMTZfUzsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVDE2OgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTEwxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTY6Ci0JICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX01JUFNfR09UMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFNpbmNlIE1JUFMgRUxGIHVzZXMgUmVsIGluc3RlYWQgb2YgUmVsYSwgZW5jb2RlIHRoZSB2dGFibGUgZW50cnkKLSAgICAgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRyZXNzID0gcmVsb2MtPmFkZGVuZDsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBTaW5jZSBESUZGX0VYUFJfT0sgaXMgZGVmaW5lZCBpbiB0Yy1taXBzLmgsIGl0IGlzIHBvc3NpYmxlIHRoYXQKLSAgICAgZml4dXBfc2VnbWVudCBjb252ZXJ0ZWQgYSBub24tUEMgcmVsYXRpdmUgcmVsb2MgaW50byBhIFBDCi0gICAgIHJlbGF0aXZlIHJlbG9jLiAgSW4gc3VjaCBhIGNhc2UsIHdlIG5lZWQgdG8gY29udmVydCB0aGUgcmVsb2MKLSAgICAgY29kZS4gICovCi0gIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNvZGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18zMjoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ182NDoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfNjRfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotCWNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKLQljYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCV8oIkNhbm5vdCBtYWtlICVzIHJlbG9jYXRpb24gUEMgcmVsYXRpdmUiKSwKLQkJCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0JfQotICAgIH0KLQotICAvKiBUbyBzdXBwb3J0IGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlCi0gICAgIGZvciBFQ09GRiwgd2UgdXNlIGEgQ3lnbnVzIGV4dGVuc2lvbi4gIFdlIGNoZWNrIGZvciB0aGF0IGhlcmUgdG8KLSAgICAgbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgbGV0IHN1Y2ggYSByZWxvYyBlc2NhcGUgbm9ybWFsbHkuICAqLwotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgICYmIGNvZGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyCi0gICAgICAmJiBtaXBzX3BpYyAhPSBFTUJFRERFRF9QSUMpCi0gICAgcmVsb2MtPmhvd3RvID0gTlVMTDsKLSAgZWxzZQotICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLQotICBpZiAocmVsb2MtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIHJldHZhbFswXSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qIFJlbGF4IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gIFRoaXMgcmV0dXJucyB0aGUgYW1vdW50IGJ5IHdoaWNoCi0gICB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBmcmFnIHNob3VsZCBjaGFuZ2UuICAqLwotCi1pbnQKLW1pcHNfcmVsYXhfZnJhZyAoZnJhZ3AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgbG9uZyBzdHJldGNoOwotewotICBpZiAoISBSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHJldHVybiAwOwotCi0gIGlmIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyAoZnJhZ3AsIChhc2VjdGlvbiAqKSBOVUxMLCBzdHJldGNoKSkKLSAgICB7Ci0gICAgICBpZiAoUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JcmV0dXJuIDA7Ci0gICAgICBmcmFncC0+ZnJfc3VidHlwZSA9IFJFTEFYX01JUFMxNl9NQVJLX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlyZXR1cm4gMDsKLSAgICAgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICByZXR1cm4gLTI7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBDb252ZXJ0IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgYXNlYywgZnJhZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBhc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGludCBvbGQsIG5ldzsKLSAgY2hhciAqZml4cHRyOwotCi0gIGlmIChSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotICAgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kICpvcDsKLSAgICAgIGJvb2xlYW4gc21hbGwsIGV4dDsKLSAgICAgIG9mZnNldFQgdmFsOwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGV4dGVuZDsKLQotICAgICAgdHlwZSA9IFJFTEFYX01JUFMxNl9UWVBFIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICBvcCA9IG1pcHMxNl9pbW1lZF9vcGVyYW5kczsKLSAgICAgIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQotCSsrb3A7Ci0KLSAgICAgIGlmIChSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQl7Ci0JICBzbWFsbCA9IGZhbHNlOwotCSAgZXh0ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc21hbGwgPSB0cnVlOwotCSAgZXh0ID0gZmFsc2U7Ci0JfQotCi0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZ3AtPmZyX3N5bWJvbCwgMSk7Ci0gICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0gICAgICBpZiAob3AtPnBjcmVsKQotCXsKLQkgIGFkZHJlc3NUIGFkZHI7Ci0KLQkgIGFkZHIgPSBmcmFncC0+ZnJfYWRkcmVzcyArIGZyYWdwLT5mcl9maXg7Ci0KLQkgIC8qIFRoZSBydWxlcyBmb3IgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jIGFyZQotICAgICAgICAgICAgIGNvbXBsaWNhdGVkOyBzZWUgbWlwczE2X2V4dGVuZGVkX2ZyYWcuICAqLwotCSAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotCSAgICB7Ci0JICAgICAgYWRkciArPSAyOwotCSAgICAgIGlmIChleHQpCi0JCWFkZHIgKz0gMjsKLQkgICAgICAvKiBJZ25vcmUgdGhlIGxvdyBiaXQgaW4gdGhlIHRhcmdldCwgc2luY2UgaXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICBzZXQgZm9yIGEgdGV4dCBsYWJlbC4gICovCi0JICAgICAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCQktLXZhbDsKLQkgICAgfQotCSAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICBhZGRyIC09IDQ7Ci0JICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQkgICAgYWRkciAtPSAyOwotCi0JICBhZGRyICY9IH4gKGFkZHJlc3NUKSAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpOwotCSAgdmFsIC09IGFkZHI7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiB3aW5kcyB1cCB3aXRoIHRoZSBhbGlnbm1lbnQgd2UgaGF2ZQotICAgICAgICAgICAgIGFzc3VtZWQuICAqLwotCSAgaWYgKG9wLT5zaGlmdCA+IDApCi0JICAgIHJlY29yZF9hbGlnbm1lbnQgKGFzZWMsIG9wLT5zaGlmdCk7Ci0JfQotCi0gICAgICBpZiAoZXh0Ci0JICAmJiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpCi0JICAgICAgfHwgUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpKQotCWFzX3dhcm5fd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwKLQkJICAgICAgIF8oImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiKSk7Ci0KLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSAoZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4KTsKLQotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWluc24gPSBiZmRfZ2V0YjE2IChidWYpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDE2IChidWYpOwotCi0gICAgICBtaXBzMTZfaW1tZWQgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwgdHlwZSwgdmFsLAotCQkgICAgUkVMQVhfTUlQUzE2X1VTRVJfRVhUIChmcmFncC0+ZnJfc3VidHlwZSksCi0JCSAgICBzbWFsbCwgZXh0LCAmaW5zbiwgJnVzZV9leHRlbmQsICZleHRlbmQpOwotCi0gICAgICBpZiAodXNlX2V4dGVuZCkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgMHhmMDAwIHwgZXh0ZW5kLCAyKTsKLQkgIGZyYWdwLT5mcl9maXggKz0gMjsKLQkgIGJ1ZiArPSAyOwotCX0KLQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIGluc24sIDIpOwotICAgICAgZnJhZ3AtPmZyX2ZpeCArPSAyOwotICAgICAgYnVmICs9IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGZyYWdwLT5mcl9vcGNvZGUgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAgIG9sZCA9IFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICAgICAgbmV3ID0gUkVMQVhfTkVXIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICBmaXhwdHIgPSBmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXg7Ci0KLSAgICAgIGlmIChuZXcgPiAwKQotCW1lbWNweSAoZml4cHRyIC0gb2xkLCBmaXhwdHIsIG5ldyk7Ci0KLSAgICAgIGZyYWdwLT5mcl9maXggKz0gbmV3IC0gb2xkOwotICAgIH0KLX0KLQotI2lmZGVmIE9CSl9FTEYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlbG9jcyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotICAgV2UndmUgYmVlbiBzdG9yaW5nIG1pcHMxNiB0ZXh0IGxhYmVscyBhcyBvZGQuICBIZXJlIHdlIGNvbnZlcnQgdGhlbQotICAgYmFjayB0byBldmVuIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGRlYnVnZ2VyLiAgKi8KLQotdm9pZAotbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpCi17Ci0gIGFzeW1ib2wgKipzeW1zOwotICB1bnNpZ25lZCBpbnQgY291bnQsIGk7Ci0KLSAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm47Ci0KLSAgc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoc3Rkb3V0cHV0KTsKLSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChzdGRvdXRwdXQpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltcysrKQotICAgIHsKLSAgICAgIGlmIChlbGZfc3ltYm9sICgqc3ltcyktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIgPT0gU1RPX01JUFMxNgotCSAgJiYgKCgqc3ltcyktPnZhbHVlICYgMSkgIT0gMCkKLQl7Ci0JICAoKnN5bXMpLT52YWx1ZSAmPSB+MTsKLQkgIC8qIElmIHRoZSBzeW1ib2wgaGFzIGFuIG9kZCBzaXplLCBpdCB3YXMgcHJvYmFibHkgY29tcHV0ZWQKLQkgICAgIGluY29ycmVjdGx5LCBzbyBhZGp1c3QgdGhhdCBhcyB3ZWxsLiAgKi8KLQkgIGlmICgoZWxmX3N5bWJvbCAoKnN5bXMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgJiAxKSAhPSAwKQotCSAgICArK2VsZl9zeW1ib2wgKCpzeW1zKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIGxhYmVsIGlzIGRlZmluZWQuICBJdCBpcyB1c2VkCi0gICB3aGVuIGhhbmRsaW5nIGJyYW5jaCBkZWxheXM7IGlmIGEgYnJhbmNoIGhhcyBhIGxhYmVsLCB3ZSBhc3N1bWUgd2UKLSAgIGNhbiBub3QgbW92ZSBpdC4gICovCi0KLXZvaWQKLW1pcHNfZGVmaW5lX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotICBpZiAoZnJlZV9pbnNuX2xhYmVscyA9PSBOVUxMKQotICAgIGwgPSAoc3RydWN0IGluc25fbGFiZWxfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKmwpOwotICBlbHNlCi0gICAgewotICAgICAgbCA9IGZyZWVfaW5zbl9sYWJlbHM7Ci0gICAgICBmcmVlX2luc25fbGFiZWxzID0gbC0+bmV4dDsKLSAgICB9Ci0KLSAgbC0+bGFiZWwgPSBzeW07Ci0gIGwtPm5leHQgPSBpbnNuX2xhYmVsczsKLSAgaW5zbl9sYWJlbHMgPSBsOwotfQotDAotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0KLS8qIFNvbWUgc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBhIE1JUFMgRUxGIGZpbGUuICAqLwotCi12b2lkCi1taXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nICgpCi17Ci0gIC8qIFdyaXRlIG91dCB0aGUgcmVnaXN0ZXIgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBtaXBzXzY0KQotICAgIHsKLSAgICAgIEVsZjMyX1JlZ0luZm8gczsKLQotICAgICAgcy5yaV9ncHJtYXNrID0gbWlwc19ncHJtYXNrOwotICAgICAgcy5yaV9jcHJtYXNrWzBdID0gbWlwc19jcHJtYXNrWzBdOwotICAgICAgcy5yaV9jcHJtYXNrWzFdID0gbWlwc19jcHJtYXNrWzFdOwotICAgICAgcy5yaV9jcHJtYXNrWzJdID0gbWlwc19jcHJtYXNrWzJdOwotICAgICAgcy5yaV9jcHJtYXNrWzNdID0gbWlwc19jcHJtYXNrWzNdOwotICAgICAgLyogVGhlIGdwX3ZhbHVlIGZpZWxkIGlzIHNldCBieSB0aGUgTUlQUyBFTEYgYmFja2VuZC4gICovCi0KLSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKHN0ZG91dHB1dCwgJnMsCi0JCQkJICAgICAgICgoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkJCQltaXBzX3JlZ21hc2tfZnJhZykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gczsKLQotICAgICAgcy5yaV9ncHJtYXNrID0gbWlwc19ncHJtYXNrOwotICAgICAgcy5yaV9wYWQgPSAwOwotICAgICAgcy5yaV9jcHJtYXNrWzBdID0gbWlwc19jcHJtYXNrWzBdOwotICAgICAgcy5yaV9jcHJtYXNrWzFdID0gbWlwc19jcHJtYXNrWzFdOwotICAgICAgcy5yaV9jcHJtYXNrWzJdID0gbWlwc19jcHJtYXNrWzJdOwotICAgICAgcy5yaV9jcHJtYXNrWzNdID0gbWlwc19jcHJtYXNrWzNdOwotICAgICAgLyogVGhlIGdwX3ZhbHVlIGZpZWxkIGlzIHNldCBieSB0aGUgTUlQUyBFTEYgYmFja2VuZC4gICovCi0KLSAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQgKHN0ZG91dHB1dCwgJnMsCi0JCQkJICAgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkJCQltaXBzX3JlZ21hc2tfZnJhZykpOwotICAgIH0KLQotICAvKiBTZXQgdGhlIE1JUFMgRUxGIGZsYWcgYml0cy4gIEZJWE1FOiBUaGVyZSBzaG91bGQgcHJvYmFibHkgYmUgc29tZQotICAgICBzb3J0IG9mIEJGRCBpbnRlcmZhY2UgZm9yIHRoaXMuICAqLwotICBpZiAobWlwc19hbnlfbm9yZW9yZGVyKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU19OT1JFT1JERVI7Ci0gIGlmIChtaXBzX3BpYyAhPSBOT19QSUMpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9NSVBTX1BJQzsKLQotICAvKiBTZXQgdGhlIE1JUFMgRUxGIEFCSSBmbGFncy4gKi8KLSAgaWYgKG1pcHNfYWJpX3N0cmluZyA9PSAwKQotICAgIDsKLSAgZWxzZSBpZiAoc3RyY21wIChtaXBzX2FiaV9zdHJpbmcsIjMyIikgPT0gMCkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfTzMyOwotICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywibzY0IikgPT0gMCkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfTzY0OwotICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywiZWFiaSIpID09IDApCi0gICAgewotICAgICAgaWYgKG1pcHNfZWFiaTY0KQotCWVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9FQUJJNjQ7Ci0gICAgICBlbHNlCi0JZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFX01JUFNfQUJJX0VBQkkzMjsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfMzJiaXRtb2RlKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU18zMkJJVE1PREU7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRUxGIHx8IE9CSl9NQVlCRV9FTEYgKi8KLQwKLXR5cGVkZWYgc3RydWN0IHByb2MKLSAgewotICAgIHN5bWJvbFMgKmlzeW07Ci0gICAgdW5zaWduZWQgbG9uZyByZWdfbWFzazsKLSAgICB1bnNpZ25lZCBsb25nIHJlZ19vZmZzZXQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmcHJlZ19tYXNrOwotICAgIHVuc2lnbmVkIGxvbmcgZnByZWdfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfcmVnOwotICAgIHVuc2lnbmVkIGxvbmcgcGNfcmVnOwotICB9Ci1wcm9jUzsKLQotc3RhdGljIHByb2NTIGN1cl9wcm9jOwotc3RhdGljIHByb2NTICpjdXJfcHJvY19wdHI7Ci1zdGF0aWMgaW50IG51bXByb2NzOwotCi1zdGF0aWMgdm9pZAotbWRfb2JqX2JlZ2luICgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZF9vYmpfZW5kICgpCi17Ci0gIC8qIGNoZWNrIGZvciBwcmVtYXR1cmUgZW5kLCBuZXN0aW5nIGVycm9ycywgZXRjICovCi0gIGlmIChjdXJfcHJvY19wdHIpCi0gICAgYXNfd2FybiAoXygibWlzc2luZyBgLmVuZCcgYXQgZW5kIG9mIGFzc2VtYmx5IikpOwotfQotCi1zdGF0aWMgbG9uZwotZ2V0X251bWJlciAoKQotewotICBpbnQgbmVnYXRpdmUgPSAwOwotICBsb25nIHZhbCA9IDA7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmVnYXRpdmUgPSAxOwotICAgIH0KLSAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgYXNfYmFkIChfKCJFeHBlY3RlZCBzaW1wbGUgbnVtYmVyLiIpKTsKLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnMCcpCi0gICAgewotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAneCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICB3aGlsZSAoaXN4ZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkgICAgewotCSAgICAgIHZhbCA8PD0gNDsKLQkgICAgICB2YWwgfD0gaGV4X3ZhbHVlICgqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCSAgICB9Ci0JICByZXR1cm4gbmVnYXRpdmUgPyAtdmFsIDogdmFsOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JICAgIHsKLQkgICAgICB2YWwgPDw9IDM7Ci0JICAgICAgdmFsIHw9ICppbnB1dF9saW5lX3BvaW50ZXIrKyAtICcwJzsKLQkgICAgfQotCSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKLQl9Ci0gICAgfQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiAqaW5wdXRfbGluZV9wb2ludGVyID09ICclYycgMHglMDJ4XG4iKSwKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyLCAqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgbnVtYmVyIikpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICB2YWwgKj0gMTA7Ci0gICAgICB2YWwgKz0gKmlucHV0X2xpbmVfcG9pbnRlcisrIC0gJzAnOwotICAgIH0KLSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKLX0KLQotLyogVGhlIC5maWxlIGRpcmVjdGl2ZTsganVzdCBsaWtlIHRoZSB1c3VhbCAuZmlsZSBkaXJlY3RpdmUsIGJ1dCB0aGVyZQotICAgaXMgYW4gaW5pdGlhbCBudW1iZXIgd2hpY2ggaXMgdGhlIEVDT0ZGIGZpbGUgaW5kZXguICAqLwotCi1zdGF0aWMgdm9pZAotc19maWxlICh4KQotICAgICBpbnQgeDsKLXsKLSAgaW50IGxpbmU7Ci0KLSAgbGluZSA9IGdldF9udW1iZXIgKCk7Ci0gIHNfYXBwX2ZpbGUgKDApOwotfQotCi0KLS8qIFRoZSAuZW5kIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZW5kICh4KQotICAgICBpbnQgeDsKLXsKLSAgc3ltYm9sUyAqcDsKLSAgaW50IG1heWJlX3RleHQ7Ci0KLSAgaWYgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgcCA9IGdldF9zeW1ib2wgKCk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHAgPSBOVUxMOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKSAmIFNFQ19DT0RFKSAhPSAwKQotICAgIG1heWJlX3RleHQgPSAxOwotICBlbHNlCi0gICAgbWF5YmVfdGV4dCA9IDA7Ci0jZWxzZQotICBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24gJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKLSAgICBtYXliZV90ZXh0ID0gMTsKLSAgZWxzZQotICAgIG1heWJlX3RleHQgPSAwOwotI2VuZGlmCi0KLSAgaWYgKCFtYXliZV90ZXh0KQotICAgIGFzX3dhcm4gKF8oIi5lbmQgbm90IGluIHRleHQgc2VjdGlvbiIpKTsKLQotICBpZiAoIWN1cl9wcm9jX3B0cikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChwICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0IChTX0dFVF9OQU1FIChwKSk7Ci0gICAgICBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChwKSwgU19HRVRfTkFNRSAoY3VyX3Byb2NfcHRyLT5pc3ltKSkpCi0JYXNfd2FybiAoXygiLmVuZCBzeW1ib2wgZG9lcyBub3QgbWF0Y2ggLmVudCBzeW1ib2wuIikpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIG1pc3Npbmcgb3IgdW5rbm93biBzeW1ib2wiKSk7Ci0KLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotICB7Ci0gICAgc2VnVCBzYXZlZF9zZWcgPSBub3dfc2VnOwotICAgIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICBmcmFnUyAqc2F2ZWRfZnJhZyA9IGZyYWdfbm93OwotICAgIHZhbHVlVCBkb3Q7Ci0gICAgc2VnVCBzZWc7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGNoYXIgKmZyYWdwOwotCi0gICAgZG90ID0gZnJhZ19ub3dfZml4ICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gICAgYXNzZXJ0IChwZHJfc2VnKTsKLSAgICBzdWJzZWdfc2V0IChwZHJfc2VnLCAwKTsKLQotICAgIC8qIFdyaXRlIHRoZSBzeW1ib2wgKi8KLSAgICBleHAuWF9vcCA9IE9fc3ltYm9sOwotICAgIGV4cC5YX2FkZF9zeW1ib2wgPSBwOwotICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgIGVtaXRfZXhwciAoJmV4cCwgNCk7Ci0KLSAgICBmcmFncCA9IGZyYWdfbW9yZSAoNyo0KTsKLQotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AsICAgICAodmFsdWVUKSBjdXJfcHJvY19wdHItPnJlZ19tYXNrLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsgNCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5yZWdfb2Zmc2V0LCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsgOCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcHJlZ19tYXNrLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsxMiwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcHJlZ19vZmZzZXQsIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKzE2LCAodmFsdWVUKSBjdXJfcHJvY19wdHItPmZyYW1lX29mZnNldCwgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMjAsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnJhbWVfcmVnLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsyNCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5wY19yZWcsIDQpOwotCi0gICAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotICB9Ci0jZW5kaWYKLQotICBjdXJfcHJvY19wdHIgPSBOVUxMOwotfQotCi0vKiBUaGUgLmFlbnQgYW5kIC5lbnQgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZW50IChhZW50KQotICAgICBpbnQgYWVudDsKLXsKLSAgaW50IG51bWJlciA9IDA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBtYXliZV90ZXh0OwotCi0gIHN5bWJvbFAgPSBnZXRfc3ltYm9sICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKQotICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0gICAgbnVtYmVyID0gZ2V0X251bWJlciAoKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLSAgICBtYXliZV90ZXh0ID0gMTsKLSAgZWxzZQotICAgIG1heWJlX3RleHQgPSAwOwotI2Vsc2UKLSAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCi0gICAgbWF5YmVfdGV4dCA9IDE7Ci0gIGVsc2UKLSAgICBtYXliZV90ZXh0ID0gMDsKLSNlbmRpZgotCi0gIGlmICghbWF5YmVfdGV4dCkKLSAgICBhc193YXJuIChfKCIuZW50IG9yIC5hZW50IG5vdCBpbiB0ZXh0IHNlY3Rpb24uIikpOwotCi0gIGlmICghYWVudCAmJiBjdXJfcHJvY19wdHIpCi0gICAgYXNfd2FybiAoXygibWlzc2luZyBgLmVuZCciKSk7Ci0KLSAgaWYgKCFhZW50KQotICAgIHsKLSAgICAgIGN1cl9wcm9jX3B0ciA9ICZjdXJfcHJvYzsKLSAgICAgIG1lbXNldCAoY3VyX3Byb2NfcHRyLCAnXDAnLCBzaXplb2YgKHByb2NTKSk7Ci0KLSAgICAgIGN1cl9wcm9jX3B0ci0+aXN5bSA9IHN5bWJvbFA7Ci0KLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCi0gICAgICBudW1wcm9jcysrOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmZyYW1lIGRpcmVjdGl2ZS4gSWYgdGhlIG1kZWJ1ZyBzZWN0aW9uIGlzIHByZXNlbnQgKElSSVggNSBuYXRpdmUpCi0gICB0aGVuIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSkgaXMgdXNlZC4gRm9yIGVtYmVkZGVkIHRhcmdldHMsIAotICAgc19taXBzX2ZyYW1lIGlzIHVzZWQgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBQRFIgaW5mb3JtYXRpb24gY29ycmVjdGx5LgotICAgV2UgY2FuJ3QgdXNlIHRoZSBlY29mZiByb3V0aW5lcyBiZWNhdXNlIHRoZXkgbWFrZSByZWZlcmVuY2UgdG8gdGhlIGVjb2ZmIAotICAgc3ltYm9sIHRhYmxlIChpbiB0aGUgbWRlYnVnIHNlY3Rpb24pLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19mcmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0KLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAgKHByb2NTICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmZyYW1lIG91dHNpZGUgb2YgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+ZnJhbWVfcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCi0gICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPmZyYW1lX29mZnNldCA9IHZhbDsKLSAgY3VyX3Byb2NfcHRyLT5wY19yZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0jZWxzZQotICBzX2lnbm9yZSAoaWdub3JlKTsKLSNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLwotfQotCi0vKiBUaGUgLmZtYXNrIGFuZCAubWFzayBkaXJlY3RpdmVzLiBJZiB0aGUgbWRlYnVnIHNlY3Rpb24gaXMgcHJlc2VudCAKLSAgIChJUklYIDUgbmF0aXZlKSB0aGVuIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9tYXNrKSBpcyB1c2VkLiBGb3IgCi0gICBlbWJlZGRlZCB0YXJnZXRzLCBzX21pcHNfbWFzayBpcyB1c2VkIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgUERSCi0gICBpbmZvcm1hdGlvbiBjb3JyZWN0bHkuIFdlIGNhbid0IHVzZSB0aGUgZWNvZmYgcm91dGluZXMgYmVjYXVzZSB0aGV5IAotICAgbWFrZSByZWZlcmVuY2UgdG8gdGhlIGVjb2ZmIHN5bWJvbCB0YWJsZSAoaW4gdGhlIG1kZWJ1ZyBzZWN0aW9uKS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfbWFzayAocmVnX3R5cGUpCi0gICAgIGNoYXIgcmVnX3R5cGU7Ci17Ci0jaWZkZWYgTUlQU19TVEFCU19FTEYKLSAgbG9uZyBtYXNrLCBvZmY7Ci0gIAotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5tYXNrLy5mbWFzayBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZtYXNrKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrLy5mbWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG9mZiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGlmIChyZWdfdHlwZSA9PSAnRicpCi0gICAgewotICAgICAgY3VyX3Byb2NfcHRyLT5mcHJlZ19tYXNrID0gbWFzazsKLSAgICAgIGN1cl9wcm9jX3B0ci0+ZnByZWdfb2Zmc2V0ID0gb2ZmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGN1cl9wcm9jX3B0ci0+cmVnX21hc2sgPSBtYXNrOwotICAgICAgY3VyX3Byb2NfcHRyLT5yZWdfb2Zmc2V0ID0gb2ZmOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotI2Vsc2UKLSAgc19pZ25vcmUgKHJlZ190eXBlKTsKLSNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLwotfQotCi0vKiBUaGUgLmxvYyBkaXJlY3RpdmUuICAqLwotCi0jaWYgMAotc3RhdGljIHZvaWQKLXNfbG9jICh4KQotICAgICBpbnQgeDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgaW50IGxpbmVubzsKLSAgaW50IGFkZHJvZmY7Ci0KLSAgYXNzZXJ0IChub3dfc2VnID09IHRleHRfc2VjdGlvbik7Ci0KLSAgbGluZW5vID0gZ2V0X251bWJlciAoKTsKLSAgYWRkcm9mZiA9IGZyYWdfbm93X2ZpeCAoKTsKLQotICBzeW1ib2xQID0gc3ltYm9sX25ldyAoIiIsIE5fU0xJTkUsIGFkZHJvZmYsIGZyYWdfbm93KTsKLSAgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9TTElORSk7Ci0gIFNfU0VUX09USEVSIChzeW1ib2xQLCAwKTsKLSAgU19TRVRfREVTQyAoc3ltYm9sUCwgbGluZW5vKTsKLSAgc3ltYm9sUC0+c3lfc2VnbWVudCA9IG5vd19zZWc7Ci19Ci0jZW5kaWYKLQotCi0gIApkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1taXBzLmggYi9nYXMvY29uZmlnL3RjLW1pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmZDk5OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiB0Yy1taXBzLmggLS0gaGVhZGVyIGZpbGUgZm9yIHRjLW1pcHMuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSB0aGUgT1NGIGFuZCBSYWxwaCBDYW1wYmVsbC4KLSAgIFdyaXR0ZW4gYnkgS2VpdGggS25vd2xlcyBhbmQgUmFscGggQ2FtcGJlbGwsIHdvcmtpbmcgaW5kZXBlbmRlbnRseS4KLSAgIE1vZGlmaWVkIGZvciBFQ09GRiBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBUQ19NSVBTCi0KLSNkZWZpbmUgVENfTUlQUwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgZnJhZzsKLXN0cnVjdCBleHByZXNzaW9uUzsKLSNlbmRpZgotCi0vKiBEZWZhdWx0IHRvIGJpZyBlbmRpYW4uICAqLwotI2lmbmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkJMQotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbWlwcwotCi0jZGVmaW5lIE9OTFlfU1RBTkRBUkRfRVNDQVBFUwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECTEKLSNkZWZpbmUgT0xEX0ZMT0FUX1JFQURTCi0jZGVmaW5lIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0jZGVmaW5lIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotI2RlZmluZSBNQVhfUkVMT0NfRVhQQU5TSU9OIDMKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogTWF4aW11bSBzeW1ib2wgb2Zmc2V0IHRoYXQgY2FuIGJlIGVuY29kZWQgaW4gYSBCRkRfUkVMT0NfTUlQU19HUFJFTAotICAgcmVsb2NhdGlvbjogKi8KLSNkZWZpbmUgTUFYX0dQUkVMX09GRlNFVCAoMHg3RkY0KQotCi0jZGVmaW5lIG1kX3JlbGF4X2ZyYWcoZnJhZ3AsIHN0cmV0Y2gpIG1pcHNfcmVsYXhfZnJhZyhmcmFncCwgc3RyZXRjaCkKLWV4dGVybiBpbnQgbWlwc19yZWxheF9mcmFnIFBBUkFNUyAoKHN0cnVjdCBmcmFnICosIGxvbmcpKTsKLQotI2RlZmluZSBtZF91bmRlZmluZWRfc3ltYm9sKG5hbWUpCSgwKQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIFdlIHBlcm1pdCBQQyByZWxhdGl2ZSBkaWZmZXJlbmNlIGV4cHJlc3Npb25zIHdoZW4gZ2VuZXJhdGluZwotICAgZW1iZWRkZWQgUElDIGNvZGUuICAqLwotI2RlZmluZSBESUZGX0VYUFJfT0sKLQotLyogVGVsbCBhc3NlbWJsZXIgdGhhdCB3ZSBoYXZlIGFuIGl0YmxfbWlwcy5oIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUuICovCi0jZGVmaW5lIEhBVkVfSVRCTF9DUFUKLQotLyogVGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldCBmb3JtYXQgbWF5IGNoYW5nZSBiYXNlZCBvbiBjb21tYW5kCi0gICBsaW5lIGFyZ3VtZW50cy4gICovCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgbWlwc190YXJnZXRfZm9ybWF0KCkKLWV4dGVybiBjb25zdCBjaGFyICptaXBzX3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotCi1zdHJ1Y3QgbWlwc19jbF9pbnNuCi17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl9vcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqaW5zbl9tbzsKLSAgLyogVGhlIG5leHQgdHdvIGZpZWxkcyBhcmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgbWlwczE2IGNvZGUuICAqLwotICBib29sZWFuIHVzZV9leHRlbmQ7Ci0gIHVuc2lnbmVkIHNob3J0IGV4dGVuZDsKLX07Ci0KLWV4dGVybiBpbnQgdGNfZ2V0X3JlZ2lzdGVyIFBBUkFNUyAoKGludCBmcmFtZSkpOwotCi0jZGVmaW5lIHRjX2luaXRfYWZ0ZXJfYXJncygpIG1pcHNfaW5pdF9hZnRlcl9hcmdzKCkKLWV4dGVybiB2b2lkIG1pcHNfaW5pdF9hZnRlcl9hcmdzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBtZF9wYXJzZV9sb25nX29wdGlvbihhcmcpIG1pcHNfcGFyc2VfbG9uZ19vcHRpb24gKGFyZykKLWV4dGVybiBpbnQgbWlwc19wYXJzZV9sb25nX29wdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgbWlwc19kZWZpbmVfbGFiZWwgKHN5bSkKLWV4dGVybiB2b2lkIG1pcHNfZGVmaW5lX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KCkgbWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotZXh0ZXJuIHZvaWQgbWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9maWxlKCkgbWlwc19mcm9iX2ZpbGUgKCkKLWV4dGVybiB2b2lkIG1pcHNfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi1leHRlcm4gdm9pZCBtaXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19taXBzCi1leHRlcm4gdm9pZCBjb25zX2ZpeF9uZXdfbWlwcwotICBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBpbnQsIHVuc2lnbmVkIGludCwgc3RydWN0IGV4cHJlc3Npb25TICopKTsKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShmaXhwKSBtaXBzX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQotZXh0ZXJuIGludCBtaXBzX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUgd2UgbXVzdCBrZWVwIFBDIHJlbGF0aXZlCi0gICByZWxvY2F0aW9ucy4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgbWlwc19mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotZXh0ZXJuIGludCBtaXBzX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIG1kX2FwcGx5X2ZpeCBzZXRzIGZ4X2RvbmUgY29ycmVjdGx5LiAgKi8KLSNkZWZpbmUgVENfSEFORExFX0ZYX0RPTkUgMQotCi0vKiBSZWdpc3RlciBtYXNrIHZhcmlhYmxlcy4gIFRoZXNlIGFyZSBzZXQgYnkgdGhlIE1JUFMgYXNzZW1ibHkgY29kZQotICAgYW5kIHVzZWQgYnkgRUNPRkYgYW5kIHBvc3NpYmx5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWlwc19ncHJtYXNrOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWlwc19jcHJtYXNrWzRdOwotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLQotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nCi1leHRlcm4gdm9pZCBtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5zZGF0YSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX01JUFNfR1BSRUwJfSwgXAotICB7ICIuc2JzcyIsCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKLSAgeyAiLmxpdDQiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKLSAgeyAiLmxpdDgiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKLSAgeyAiLnVjb2RlIiwJU0hUX01JUFNfVUNPREUsCTAJCQkJCX0sIFwKLSAgeyAiLm1kZWJ1ZyIsCVNIVF9NSVBTX0RFQlVHLAkwCQkJCQl9LAotLyogT3RoZXIgc3BlY2lhbCBzZWN0aW9ucyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXI6IC5yZWdpbmZvLAotICAgLmxpYmxpc3QsIC5jb25mbGljdCwgLmdwdGFiLCAuZ290LCAuZHluYW1pYywgLnJlbC5keW4uICAqLwotCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgbWRfbWlwc19lbmQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9lbmQoKQltZF9taXBzX2VuZCgpCi0KLSNkZWZpbmUgVVNFX0dMT0JBTF9QT0lOVEVSX09QVAkoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIgXAotCQkJCSB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0KLWV4dGVybiB2b2lkIG1pcHNfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX3BvcF9pbnNlcnQoKQkJbWlwc19wb3BfaW5zZXJ0KCkKLQotZXh0ZXJuIHZvaWQgbWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQKLQotZXh0ZXJuIHZvaWQgbWlwc19lbmFibGVfYXV0b19hbGlnbiBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCkJbWlwc19lbmFibGVfYXV0b19hbGlnbigpCi0KLSNlbmRpZiAvKiBUQ19NSVBTICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuYyBiL2dhcy9jb25maWcvdGMtbW4xMDIwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRmN2JmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxNCArMCwwIEBACi0vKiB0Yy1tbjEwMjAwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMjAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAyMDAuaCIKLQwKLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCByZWdfbmFtZQotewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgdmFsdWU7Ci19OwotCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9IHsKLSAgLyogYkNDIHJlbGF4aW5nICovCi0gIHsweDgxLCAtMHg3ZSwgMiwgMX0sCi0gIHsweDgwMDQsIC0weDdmZmIsIDUsIDJ9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNywgMH0sCi0gIC8qIGJDQ3ggcmVsYXhpbmcgKi8KLSAgezB4ODEsIC0weDdlLCAzLCA0fSwKLSAgezB4ODAwNCwgLTB4N2ZmYiwgNiwgNX0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA4LCAwfSwKLSAgLyoganNyIHJlbGF4aW5nICovCi0gIHsweDgwMDQsIC0weDdmZmIsIDMsIDd9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNSwgMH0sCi0gIC8qIGptcCByZWxheGluZyAqLwotICB7MHg4MSwgLTB4N2UsIDIsIDl9LAotICB7MHg4MDA0LCAtMHg3ZmZiLCAzLCAxMH0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA1LCAwfSwKLQotfTsKLS8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQsIGNoYXIgKiwgdW5zaWduZWQsCi0JCQkJCSAgICB1bnNpZ25lZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hlY2tfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqLAotCQkJCQkgICAgb2Zmc2V0VCkpOwotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2ggUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlZ19uYW1lICosIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkYXRhX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBhZGRyZXNzX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBvdGhlcl9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotCi0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgbW4xMDIwMF9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19Owotc3RydWN0IG1uMTAyMDBfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci1zdGF0aWMgaW50IGZjOwotDAotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7IAotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7IE5VTEwsICAgICAgIE5VTEwsICAgICAgICAgICAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptbjEwMjAwX2hhc2g7Ci0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgZGF0YV9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImQwIiwgMCB9LAotICB7ICJkMSIsIDEgfSwKLSAgeyAiZDIiLCAyIH0sCi0gIHsgImQzIiwgMyB9LAotfTsKLSNkZWZpbmUgREFUQV9SRUdfTkFNRV9DTlQJKHNpemVvZihkYXRhX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBhZGRyZXNzX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCAwIH0sCi0gIHsgImExIiwgMSB9LAotICB7ICJhMiIsIDIgfSwKLSAgeyAiYTMiLCAzIH0sCi19OwotI2RlZmluZSBBRERSRVNTX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGFkZHJlc3NfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIG90aGVyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWRyIiwgMCB9LAotICB7ICJwc3ciLCAwIH0sCi19OwotI2RlZmluZSBPVEhFUl9SRUdfTkFNRV9DTlQJKHNpemVvZihvdGhlcl9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUKLSAgIHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUpCi0gICAgIGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqcmVnczsKLSAgICAgaW50IHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UgCi0JICByZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWRhdGFfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoZGF0YV9yZWdpc3RlcnMsIERBVEFfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1hZGRyZXNzX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGFkZHJlc3NfcmVnaXN0ZXJzLCBBRERSRVNTX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotb3RoZXJfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAob3RoZXJfcmVnaXN0ZXJzLCBPVEhFUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiTU4xMDIwMCBvcHRpb25zOlxuXAotbm9uZSB5ZXRcbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICBpbnQgdHlwZTsKLSAgY2hhciAqbGl0cDsKLSAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZXAgPSBwcmVjICogMjsKLQotICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhYmVsX2NvdW50ID0gMDsKLSAgY2hhciBidWZbNDBdOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxKQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlOToKLQkgIG9wY29kZSA9IDB4ZTg7Ci0JICBicmVhazsKLQljYXNlIDB4ZTA6Ci0JICBvcGNvZGUgPSAweGUyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgb3Bjb2RlID0gMHhlMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMzoKLQkgIG9wY29kZSA9IDB4ZTE7Ci0JICBicmVhazsKLQljYXNlIDB4ZTE6Ci0JICBvcGNvZGUgPSAweGUzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGU0OgotCSAgb3Bjb2RlID0gMHhlNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNjoKLQkgIG9wY29kZSA9IDB4ZTQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZTc6Ci0JICBvcGNvZGUgPSAweGU1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU1OgotCSAgb3Bjb2RlID0gMHhlNzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4ZmM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMDoKLQkgIG9wY29kZSA9IDB4ZTI7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBvcGNvZGUgPSAweGUwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUzOgotCSAgb3Bjb2RlID0gMHhlMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMToKLQkgIG9wY29kZSA9IDB4ZTM7Ci0JICBicmVhazsKLQljYXNlIDB4ZTQ6Ci0JICBvcGNvZGUgPSAweGU2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU2OgotCSAgb3Bjb2RlID0gMHhlNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNzoKLQkgIG9wY29kZSA9IDB4ZTU7Ci0JICBicmVhazsKLQljYXNlIDB4ZTU6Ci0JICBvcGNvZGUgPSAweGU3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhmNDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhlMDsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzI0X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNCkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZmM6Ci0JICBvcGNvZGUgPSAweGZkOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZkOgotCSAgb3Bjb2RlID0gMHhmYzsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZToKLQkgIG9wY29kZSA9IDB4ZmY7Ci0JICBicmVhazsKLQljYXNlIDB4ZmY6Ci0JICBvcGNvZGUgPSAweGZlOwotCWNhc2UgMHhlODoKLQkgIG9wY29kZSA9IDB4ZTk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTk6Ci0JICBvcGNvZGUgPSAweGU4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGUwOgotCSAgb3Bjb2RlID0gMHhlMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMjoKLQkgIG9wY29kZSA9IDB4ZTA7Ci0JICBicmVhazsKLQljYXNlIDB4ZTM6Ci0JICBvcGNvZGUgPSAweGUxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUxOgotCSAgb3Bjb2RlID0gMHhlMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNDoKLQkgIG9wY29kZSA9IDB4ZTY7Ci0JICBicmVhazsKLQljYXNlIDB4ZTY6Ci0JICBvcGNvZGUgPSAweGU0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU3OgotCSAgb3Bjb2RlID0gMHhlNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNToKLQkgIG9wY29kZSA9IDB4ZTc7Ci0JICBicmVhazsKLQljYXNlIDB4ZWM6Ci0JICBvcGNvZGUgPSAweGVkOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVkOgotCSAgb3Bjb2RlID0gMHhlYzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZToKLQkgIG9wY29kZSA9IDB4ZWY7Ci0JICBicmVhazsKLQljYXNlIDB4ZWY6Ci0JICBvcGNvZGUgPSAweGVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZmM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDUpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGZjOgotCSAgb3Bjb2RlID0gMHhmZDsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZDoKLQkgIG9wY29kZSA9IDB4ZmM7Ci0JICBicmVhazsKLQljYXNlIDB4ZmU6Ci0JICBvcGNvZGUgPSAweGZmOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZmOgotCSAgb3Bjb2RlID0gMHhmZTsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMDoKLQkgIG9wY29kZSA9IDB4ZTI7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBvcGNvZGUgPSAweGUwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUzOgotCSAgb3Bjb2RlID0gMHhlMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMToKLQkgIG9wY29kZSA9IDB4ZTM7Ci0JICBicmVhazsKLQljYXNlIDB4ZTQ6Ci0JICBvcGNvZGUgPSAweGU2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU2OgotCSAgb3Bjb2RlID0gMHhlNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNzoKLQkgIG9wY29kZSA9IDB4ZTU7Ci0JICBicmVhazsKLQljYXNlIDB4ZTU6Ci0JICBvcGNvZGUgPSAweGU3OwotCSAgYnJlYWs7Ci0JY2FzZSAweGVjOgotCSAgb3Bjb2RlID0gMHhlZDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZDoKLQkgIG9wY29kZSA9IDB4ZWM7Ci0JICBicmVhazsKLQljYXNlIDB4ZWU6Ci0JICBvcGNvZGUgPSAweGVmOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVmOgotCSAgb3Bjb2RlID0gMHhlZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNF0gPSAweGUwOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA1LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMjRfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDg7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA2KQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNykKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGUxOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbZnJhZ1AtPmZyX2ZpeF0gPSAweGVhOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDkpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYzsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMCkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGUwOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcDsKLQotICBtbjEwMjAwX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIE1OMTAyMDAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIG9wID0gbW4xMDIwMF9vcGNvZGVzOwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcC0+bmFtZSkpIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG1uMTAyMDBfaGFzaCwgb3AtPm5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGJvdGggYSBzaW1wbGlmaWNhdGlvbiAod2UgZG9uJ3QgaGF2ZSB0byB3cml0ZSBtZF9hcHBseV9maXgpCi0gICAgIGFuZCBzdXBwb3J0IGZvciBmdXR1cmUgb3B0aW1pemF0aW9ucyAoYnJhbmNoIHNob3J0ZW5pbmcgYW5kIHNpbWlsYXIKLSAgICAgc3R1ZmYgaW4gdGhlIGxpbmtlci4gICovCi0gIGxpbmtyZWxheCA9IDE7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpIAotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3Bjb2RlOwotICBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm5leHRfb3Bjb2RlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLSAgaW50IG5leHRfb3BpbmRleCwgcmVsYXhhYmxlOwotICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbiwgc2l6ZSA9IDA7Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotICBpbnQgbWF0Y2g7Ci0KLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIGZpbmQgdGhlIGZpcnN0IG9wY29kZSB3aXRoIHRoZSBwcm9wZXIgbmFtZSAqLwotICBvcGNvZGUgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopaGFzaF9maW5kIChtbjEwMjAwX2hhc2gsIHN0cik7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RyID0gczsKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICBmb3IoOzspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKLSAgICAgIGludCBvcF9pZHg7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgaW50IGV4dHJhX3NoaWZ0ID0gMDsKLQotICAgICAgcmVsYXhhYmxlID0gMDsKLSAgICAgIGZjID0gMDsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0gICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgZm9yIChvcF9pZHggPSAxLCBvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7Ci0JICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgb3BpbmRleF9wdHIrKywgb3BfaWR4KyspCi0JewotCSAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLQkgIGV4cHJlc3Npb25TIGV4OwotCi0JICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzW25leHRfb3BpbmRleF07Ci0JICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLQkgICAgfQotCi0JICBlcnJtc2cgPSBOVUxMOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcpCi0JICAgICsrc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUkVMQVgpCi0JICAgIHJlbGF4YWJsZSA9IDE7Ci0KLQkgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gKi8KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICAvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSBvcGVyYW5kcy4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9EUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9BUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QU1cpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjbXAgKHN0YXJ0LCAicHN3IikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9NRFIpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjbXAgKHN0YXJ0LCAibWRyIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWRkcmVzc19yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG90aGVyX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnN0ciA9PSAnKScgfHwgKnN0ciA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4KTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKGV4Llhfb3ApIAotCSAgICB7Ci0JICAgIGNhc2UgT19pbGxlZ2FsOgotCSAgICAgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgY2FzZSBPX3JlZ2lzdGVyOgotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAmIChNTjEwMjAwX09QRVJBTkRfRFJFRyB8IE1OMTAyMDBfT1BFUkFORF9BUkVHKSkgPT0gMCkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JCQotCSAgICAgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNSkKLQkJZXh0cmFfc2hpZnQgPSA4OwotCSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF82Ci0JCSAgICAgICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNykKLQkJZXh0cmFfc2hpZnQgPSAxNjsKLQkgICAgICBlbHNlCi0JCWV4dHJhX3NoaWZ0ID0gMDsKLQkgICAgICAKLQkgICAgICBtbjEwMjAwX2luc2VydF9vcGVyYW5kICgmaW5zbiwgJmV4dGVuc2lvbiwgb3BlcmFuZCwKLQkJCQkgICAgICBleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCi0JCQkJICAgICAgMCwgZXh0cmFfc2hpZnQpOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBPX2NvbnN0YW50OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIGFuZCBpdCBkb2Vzbid0Ci0JCSBmaXQgaW50byB0aGUgYWxsb2NhdGVkIGJpdGZpZWxkIGZvciB0aGlzIGluc24sCi0JCSB0aGVuIHByb21vdGUgaXQgKGllIHRoaXMgb3Bjb2RlIGRvZXMgbm90IG1hdGNoKS4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzCi0JCSAgJiAoTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMjAwX09QRVJBTkRfUkVMQVgpCi0JCSAgJiYgISBjaGVja19vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCSAgICAgIGV4LlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCwKLQkJCQkgICAgICAwLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIHRoZW4gdGhpcyBvcGNvZGUgZGlkbid0Ci0JCSBtYXRjaCBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIGl0IG5lZWRlZCBwcm9tb3Rpb24hICAqLwotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgICAgICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCQlhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgICAgIGZpeHVwc1tmY10uZXhwID0gZXg7Ci0JICAgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgICAgIGZpeHVwc1tmY10ucmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgICsrZmM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQota2VlcF9nb2luZzoKLQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJykKLQkgICAgKytzdHI7Ci0KLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB1c2VkIGFsbCB0aGUgb3BlcmFuZHMhICAqLwotICAgICAgaWYgKCpzdHIgIT0gJywnKQotCW1hdGNoID0gMTsKLQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0gICAgICAgIHsKLQkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKLQkgIGlmICghc3RyY21wKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQotCSAgICB7Ci0JICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIAotCSAgYXNfYmFkICgiJXMiLCBlcnJtc2cpOwotCSAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgICAKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlmICgqc3RyICE9ICdcMCcpCi0gICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMSkKLSAgICBzaXplID0gMTsKLSAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzIgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzQpCi0gICAgc2l6ZSA9IDI7Ci0gIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF81KQotICAgIHNpemUgPSAzOwotICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNikKLSAgICBzaXplID0gNDsKLSAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzcpCi0gICAgc2l6ZSA9IDU7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgICAgICAgIAotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLQotICBpZiAocmVsYXhhYmxlICYmIGZjID4gMCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLQotICAgICAgLyogYkNDICovCi0gICAgICBpZiAoc2l6ZSA9PSAyICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmMwMDAwKQotCXsKLQkgIC8qIEhhbmRsZSBicmEgc3BlY2lhbGx5LiAgQmFzaWNhbGx5IHRyZWF0IGl0IGxpa2Ugam1wIHNvCi0JICAgICB0aGF0IHdlIGF1dG9tYXRpY2FsbHkgaGFuZGxlIDgsIDE2IGFuZCAzMiBiaXQgb2Zmc2V0cwotCSAgICAgY29ycmVjdGx5IGFzIHdlbGwgYXMganVtcHMgdG8gYW4gdW5kZWZpbmVkIGFkZHJlc3MuCi0KLQkgICAgIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdCB0cmVhdCBpdCBsaWtlIG90aGVyIGJDQwotCSAgICAgaW5zdHJ1Y3Rpb25zIHNpbmNlIHRoZSBsb25nIGZvcm1zIG9mIGJyYSBpcyBkaWZmZXJlbnQKLQkgICAgIGZyb20gb3RoZXIgYkNDIGluc3RydWN0aW9ucy4gICovCi0gICAgICAgICAgaWYgKG9wY29kZS0+b3Bjb2RlID09IDB4ZWEwMCkKLSAgICAgICAgICAgIHR5cGUgPSA4OwotCSAgZWxzZQotCSAgICB0eXBlID0gMDsKLQl9Ci0gICAgICAvKiBqc3IgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gMyAmJiBvcGNvZGUtPm9wY29kZSA9PSAweGZkMDAwMCkKLQl0eXBlID0gNjsKLSAgICAgIC8qIGptcCAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAzICYmIG9wY29kZS0+b3Bjb2RlID09IDB4ZmMwMDAwKQotCXR5cGUgPSA4OwotICAgICAgLyogYkNDeCAqLwotICAgICAgZWxzZQotCXR5cGUgPSAzOwotCi0gICAgICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCA4IC0gc2l6ZSwgdHlwZSwKLQkJICAgIGZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCSAgICAoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLSAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIHNpemUpOwotICAgICAgaWYgKDggLSBzaXplID4gNCkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgc2l6ZSwgMCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgc2l6ZSArIDQsIDAsIDggLSBzaXplIC0gNCk7Ci0JfQotICAgICAgZWxzZQotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyBzaXplLCAwLCA4IC0gc2l6ZSk7Ci0gICAgfQotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBmID0gZnJhZ19tb3JlIChzaXplKTsKLQotICAgICAgLyogT2gsIHdoYXQgYSBtZXNzLiAgVGhlIGluc3RydWN0aW9uIGlzIGluIGJpZyBlbmRpYW4gZm9ybWF0LCBidXQKLQkgMTYgYW5kIDI0Yml0IGltbWVkaWF0ZXMgYXJlIGxpdHRsZSBlbmRpYW4hICAqLwotICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zKQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIGluc24gJiAweGZmZmYsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF82KQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgaW5zbiAmIDB4ZmZmZiwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzcpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24gJiAweGZmLCAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSA+IDQgPyA0IDogc2l6ZSk7Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotCi0JICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOwotCSAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICB7Ci0JICAgICAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG87Ci0JICAgICAgaW50IHNpemU7Ci0JICAgICAgaW50IG9mZnNldDsKLQkgICAgICBmaXhTICpmaXhQOwotCi0JICAgICAgcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgICAgIGlmICghcmVsb2NfaG93dG8pCi0JCWFib3J0KCk7Ci0JICAKLQkgICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLQkgICAgICBpZiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpCi0JCWFib3J0KCk7Ci0KLQkgICAgICBvZmZzZXQgPSA0IC0gc2l6ZTsKLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICBzaXplLAotCQkJCSAgJmZpeHVwc1tpXS5leHAsIAotCQkJCSAgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCSAgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgICAgIC8qIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQKLQkJIGluc3RydWN0aW9uLCBub3QgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChyZWxvY19ob3d0by0+cGNfcmVsYXRpdmUpCi0JCWZpeFAtPmZ4X29mZnNldCArPSBzaXplOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgcmVsb2MsIHBjcmVsLCByZWxvY19zaXplLCBvZmZzZXQ7Ci0JICAgICAgZml4UyAqZml4UDsKLQotCSAgICAgIHJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0JICAgICAgLyogSG93IGJpZyBpcyB0aGUgcmVsb2M/ICBSZW1lbWJlciBTUExJVCByZWxvY3MgYXJlCi0JCSBpbXBsaWNpdGx5IDMyYml0cy4gICovCi0JICAgICAgcmVsb2Nfc2l6ZSA9IG9wZXJhbmQtPmJpdHM7Ci0KLQkgICAgICBvZmZzZXQgPSBzaXplIC0gcmVsb2Nfc2l6ZSAvIDg7Ci0KLQkgICAgICAvKiBJcyB0aGUgcmVsb2MgcGMtcmVsYXRpdmU/ICAqLwotCSAgICAgIHBjcmVsID0gKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BDUkVMKSAhPSAwOwotCi0KLQkgICAgICAvKiBDaG9vc2UgYSBwcm9wZXIgQkZEIHJlbG9jYXRpb24gdHlwZS4gICovCi0JICAgICAgaWYgKHBjcmVsKQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAyNCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzI0X1BDUkVMOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gMzIpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18zMjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMTY7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfODsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDI0KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMjQ7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIC8qIENvbnZlcnQgdGhlIHNpemUgb2YgdGhlIHJlbG9jIGludG8gd2hhdCBmaXhfbmV3X2V4cCB3YW50cy4gICovCi0JICAgICAgcmVsb2Nfc2l6ZSA9IHJlbG9jX3NpemUgLyA4OwotCSAgICAgIGlmIChyZWxvY19zaXplID09IDgpCi0JCXJlbG9jX3NpemUgPSAwOwotCSAgICAgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCXJlbG9jX3NpemUgPSAxOwotCSAgICAgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMzIgfHwgcmVsb2Nfc2l6ZSA9PSAyNCkKLQkJcmVsb2Nfc2l6ZSA9IDI7Ci0KLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICByZWxvY19zaXplLCAmZml4dXBzW2ldLmV4cCwgcGNyZWwsCi0JCQkJICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgcmVsb2MpKTsKLQotCSAgICAgIC8qIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQKLQkJIGluc3RydWN0aW9uLCBub3QgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChwY3JlbCkKLQkJZml4UC0+Znhfb2Zmc2V0ICs9IHNpemU7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICYmIGZpeHAtPmZ4X3N1YnN5KQotICAgIHsKLSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkiRGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmYmZkX2Fic19zeW1ib2w7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gKFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSArIGZpeHAtPmZ4X29mZnNldCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICAgIH0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHJldHVybiAyOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICByZXR1cm4gMzsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA3OwotCSAgcmV0dXJuIDU7Ci0JfQotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gOCkKLSAgICB7Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSAxMDsKLQkgIHJldHVybiA1OwotCX0KLSAgICAgIHJldHVybiAyOwotICAgIH0KLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2lmIDAKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwgJiYgISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotI2VuZGlmCi19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLyogV2Ugc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUgYmVjYXVzZSBsaW5rcmVsYXggaXMgbm9uemVyby4gICovCi0gIGFib3J0ICgpOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCAoaW5zbnAsIGV4dGVuc2lvbnAsIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSwgc2hpZnQpCi0gICAgIHVuc2lnbmVkIGxvbmcgKmluc25wOwotICAgICB1bnNpZ25lZCBsb25nICpleHRlbnNpb25wOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIHVuc2lnbmVkIGludCBzaGlmdDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAyNCBvciAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA8IDI0Ci0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSykgPT0gMCkKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLSAgICAgICAgICBtaW4gPSAwOwotICAgICAgICB9Ci0KLSAgICAgIHRlc3QgPSB2YWw7Ci0KLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgY29uc3QgY2hhciAqZXJyID0KLSAgICAgICAgICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLSAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAgICAgc3ByaW50X3ZhbHVlIChidWYsIHRlc3QpOwotICAgICAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0gICAgICAgICAgICBhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCkgPT0gMCkKLSAgICB7Ci0gICAgICAqaW5zbnAgfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JCSA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCkpOwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEKSAhPSAwKQotCSppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJICAgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQgKyAyKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKmV4dGVuc2lvbnAgfD0gKHZhbCA+PiAxNikgJiAweGZmOwotICAgICAgKmluc25wIHw9IHZhbCAmIDB4ZmZmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1jaGVja19vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCB2YWwpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci17Ci0gIC8qIE5vIG5lZWQgdG8gY2hlY2sgMjRiaXQgb3IgMzJiaXQgb3BlcmFuZHMgZm9yIGEgYml0LiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPCAyNAotICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0spID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgfQotCi0gICAgICB0ZXN0ID0gdmFsOwotCi0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQlyZXR1cm4gMDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmggYi9nYXMvY29uZmlnL3RjLW1uMTAyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzZTU2OS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIHRjLW1uMTAyMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtbW4xMDIwMC5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfTU4xMDIwMAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIE1OMTAyMDAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbW4xMDIwMAotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW1uMTAyMDAiCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotLyogRG9uJ3QgYm90aGVyIHRvIGFkanVzdCByZWxvY3MuICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpIDAKLQotLyogV2UgZG8gcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBhcyB3ZWxsIGFzIHRoZSBsaW5rZXIuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmMgYi9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwNzZmNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OTYgKzAsMCBAQAotLyogdGMtbW4xMDMwMC5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWF0c3VzaGl0YSAxMDMwMAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiCi0MCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcmVnX25hbWUKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHZhbHVlOwotfTsKLQotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIAotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGQxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0MCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPSB7Ci0gIC8qIGJDQyByZWxheGluZyAqLwotICB7MHg3ZiwgLTB4ODAsIDIsIDF9LAotICB7MHg3ZmZmLCAtMHg4MDAwLCA1LCAyfSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA3LCAwfSwKLQotICAvKiBiQ0MgcmVsYXhpbmcgKHVuY29tbW9uIGNhc2VzKSAqLwotICB7MHg3ZiwgLTB4ODAsIDMsIDR9LAotICB7MHg3ZmZmLCAtMHg4MDAwLCA2LCA1fSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA4LCAwfSwKLQotICAvKiBjYWxsIHJlbGF4aW5nICovCi0gIHsweDdmZmYsIC0weDgwMDAsIDUsIDd9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDcsIDB9LAotCi0gIC8qIGNhbGxzIHJlbGF4aW5nICovCi0gIHsweDdmZmYsIC0weDgwMDAsIDQsIDl9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDYsIDB9LAotCi0gIC8qIGptcCByZWxheGluZyAqLwotICB7MHg3ZiwgLTB4ODAsIDIsIDExfSwKLSAgezB4N2ZmZiwgLTB4ODAwMCwgMywgMTJ9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDUsIDB9LAotCi19OwotCi0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICosCi0JCQkJCSAgICBvZmZzZXRULCBjaGFyICosIHVuc2lnbmVkLAotCQkJCQkgICAgdW5zaWduZWQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoZWNrX29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQpKTsKLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGF0YV9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGJvb2xlYW4gYWRkcmVzc19yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGJvb2xlYW4gb3RoZXJfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyB2b2lkIHNldF9hcmNoX21hY2ggUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBpbnQgY3VycmVudF9tYWNoaW5lOwotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IG1uMTAzMDBfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLXN0cnVjdCBtbjEwMzAwX2ZpeHVwIGZpeHVwc1tNQVhfSU5TTl9GSVhVUFNdOwotc3RhdGljIGludCBmYzsKLQotLyogV2UgbXVzdCBzdG9yZSB0aGUgdmFsdWUgb2YgZWFjaCByZWdpc3RlciBvcGVyYW5kIHNvIHRoYXQgd2UgY2FuCi0gICB2ZXJpZnkgdGhhdCBjZXJ0YWluIHJlZ2lzdGVycyBkbyBub3QgbWF0Y2guICAqLwotaW50IG1uMTAzMDBfcmVnX29wZXJhbmRzW01OMTAzMDBfTUFYX09QRVJBTkRTXTsKLQwKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYW0zMCIsCXNldF9hcmNoX21hY2gsCQkzMDAgfSwKLSAgeyAiYW0zMyIsCXNldF9hcmNoX21hY2gsCQkzMzAgfSwKLSAgeyAibW4xMDMwMCIsCXNldF9hcmNoX21hY2gsCQkzMDAgfSwKLSAge05VTEwsIDAsIDB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbW4xMDMwMF9oYXNoOwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGRhdGFfcmVnaXN0ZXJzW10gPQotewotICB7ICJkMCIsIDAgfSwKLSAgeyAiZDEiLCAxIH0sCi0gIHsgImQyIiwgMiB9LAotICB7ICJkMyIsIDMgfSwKLX07Ci0jZGVmaW5lIERBVEFfUkVHX05BTUVfQ05UCShzaXplb2YoZGF0YV9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgYWRkcmVzc19yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgMCB9LAotICB7ICJhMSIsIDEgfSwKLSAgeyAiYTIiLCAyIH0sCi0gIHsgImEzIiwgMyB9LAotfTsKLSNkZWZpbmUgQUREUkVTU19SRUdfTkFNRV9DTlQJKHNpemVvZihhZGRyZXNzX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSByX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCA4IH0sCi0gIHsgImExIiwgOSB9LAotICB7ICJhMiIsIDEwIH0sCi0gIHsgImEzIiwgMTEgfSwKLSAgeyAiZDAiLCAxMiB9LAotICB7ICJkMSIsIDEzIH0sCi0gIHsgImQyIiwgMTQgfSwKLSAgeyAiZDMiLCAxNSB9LAotICB7ICJlMCIsIDAgfSwKLSAgeyAiZTEiLCAxIH0sCi0gIHsgImUxMCIsIDEwIH0sCi0gIHsgImUxMSIsIDExIH0sCi0gIHsgImUxMiIsIDEyIH0sCi0gIHsgImUxMyIsIDEzIH0sCi0gIHsgImUxNCIsIDE0IH0sCi0gIHsgImUxNSIsIDE1IH0sCi0gIHsgImUyIiwgMiB9LAotICB7ICJlMyIsIDMgfSwKLSAgeyAiZTQiLCA0IH0sCi0gIHsgImU1IiwgNSB9LAotICB7ICJlNiIsIDYgfSwKLSAgeyAiZTciLCA3IH0sCi0gIHsgImU4IiwgOCB9LAotICB7ICJlOSIsIDkgfSwKLSAgeyAicjAiLCAwIH0sCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi19OwotI2RlZmluZSBSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKHJfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHhyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWNyaCIsIDIgfSwKLSAgeyAibWNybCIsIDMgfSwKLSAgeyAibWN2ZiIsIDQgfSwKLSAgeyAibWRycSIsIDEgfSwKLSAgeyAic3AiLCAwIH0sCi0gIHsgInhyMCIsIDAgfSwKLSAgeyAieHIxIiwgMSB9LAotICB7ICJ4cjEwIiwgMTAgfSwKLSAgeyAieHIxMSIsIDExIH0sCi0gIHsgInhyMTIiLCAxMiB9LAotICB7ICJ4cjEzIiwgMTMgfSwKLSAgeyAieHIxNCIsIDE0IH0sCi0gIHsgInhyMTUiLCAxNSB9LAotICB7ICJ4cjIiLCAyIH0sCi0gIHsgInhyMyIsIDMgfSwKLSAgeyAieHI0IiwgNCB9LAotICB7ICJ4cjUiLCA1IH0sCi0gIHsgInhyNiIsIDYgfSwKLSAgeyAieHI3IiwgNyB9LAotICB7ICJ4cjgiLCA4IH0sCi0gIHsgInhyOSIsIDkgfSwKLX07Ci0jZGVmaW5lIFhSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKHhyX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIG90aGVyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWRyIiwgMCB9LAotICB7ICJwc3ciLCAwIH0sCi0gIHsgInNwIiwgMCB9LAotfTsKLSNkZWZpbmUgT1RIRVJfUkVHX05BTUVfQ05UCShzaXplb2Yob3RoZXJfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIHRhYmxlCi0gICB0byBzZWUgaWYgIm5hbWUiIGlzIGEgdmFsaWQgcmVnaXRlciBuYW1lLiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIKLSAgIG51bWJlciBmcm9tIHRoZSBhcnJheSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLiAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lKQotICAgICBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKnJlZ3M7Ci0gICAgIGludCByZWdjb3VudDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdjb3VudCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcmVnc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlIAotCSAgcmV0dXJuIHJlZ3NbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1yX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHJfcmVnaXN0ZXJzLCBSX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgoteHJfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoeHJfcmVnaXN0ZXJzLCBYUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWRhdGFfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoZGF0YV9yZWdpc3RlcnMsIERBVEFfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1hZGRyZXNzX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGFkZHJlc3NfcmVnaXN0ZXJzLCBBRERSRVNTX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotb3RoZXJfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAob3RoZXJfcmVnaXN0ZXJzLCBPVEhFUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiTU4xMDMwMCBvcHRpb25zOlxuXAotbm9uZSB5ZXRcbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICBpbnQgdHlwZTsKLSAgY2hhciAqbGl0cDsKLSAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuICJiYWQgY2FsbCB0byBtZF9hdG9mIjsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZXAgPSBwcmVjICogMjsKLQotICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhYmVsX2NvdW50ID0gMDsKLSAgY2hhciBidWZbNDBdOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhjODoKLQkgIG9wY29kZSA9IDB4Yzk7Ci0JICBicmVhazsKLQljYXNlIDB4Yzk6Ci0JICBvcGNvZGUgPSAweGM4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGMwOgotCSAgb3Bjb2RlID0gMHhjMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMjoKLQkgIG9wY29kZSA9IDB4YzA7Ci0JICBicmVhazsKLQljYXNlIDB4YzM6Ci0JICBvcGNvZGUgPSAweGMxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMxOgotCSAgb3Bjb2RlID0gMHhjMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNDoKLQkgIG9wY29kZSA9IDB4YzY7Ci0JICBicmVhazsKLQljYXNlIDB4YzY6Ci0JICBvcGNvZGUgPSAweGM0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM3OgotCSAgb3Bjb2RlID0gMHhjNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNToKLQkgIG9wY29kZSA9IDB4Yzc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhjYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMywgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4Yzg6Ci0JICBvcGNvZGUgPSAweGM5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM5OgotCSAgb3Bjb2RlID0gMHhjODsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMDoKLQkgIG9wY29kZSA9IDB4YzI7Ci0JICBicmVhazsKLQljYXNlIDB4YzI6Ci0JICBvcGNvZGUgPSAweGMwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMzOgotCSAgb3Bjb2RlID0gMHhjMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMToKLQkgIG9wY29kZSA9IDB4YzM7Ci0JICBicmVhazsKLQljYXNlIDB4YzQ6Ci0JICBvcGNvZGUgPSAweGM2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM2OgotCSAgb3Bjb2RlID0gMHhjNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNzoKLQkgIG9wY29kZSA9IDB4YzU7Ci0JICBicmVhazsKLQljYXNlIDB4YzU6Ci0JICBvcGNvZGUgPSAweGM3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4ZGM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDc7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNCkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYToKLQkgIG9wY29kZSA9IDB4ZWI7Ci0JICBicmVhazsKLQljYXNlIDB4ZWI6Ci0JICBvcGNvZGUgPSAweGVhOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGNjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNSkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGVhOgotCSAgb3Bjb2RlID0gMHhlYjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYjoKLQkgIG9wY29kZSA9IDB4ZWE7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZGM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDg7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA2KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4Y2Q7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA3KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZGQ7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA1XSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNl0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA0XTsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOCkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGZhOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGZmOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOSkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGZjOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGZmOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMCkKLSAgICB7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtmcmFnUC0+ZnJfZml4XSA9IDB4Y2E7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDExKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4Y2M7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEyKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZGM7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcDsKLQotICBtbjEwMzAwX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIE1OMTAzMDAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIG9wID0gbW4xMDMwMF9vcGNvZGVzOwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcC0+bmFtZSkpIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG1uMTAzMDBfaGFzaCwgb3AtPm5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGJvdGggYSBzaW1wbGlmaWNhdGlvbiAod2UgZG9uJ3QgaGF2ZSB0byB3cml0ZSBtZF9hcHBseV9maXgpCi0gICAgIGFuZCBzdXBwb3J0IGZvciBmdXR1cmUgb3B0aW1pemF0aW9ucyAoYnJhbmNoIHNob3J0ZW5pbmcgYW5kIHNpbWlsYXIKLSAgICAgc3R1ZmYgaW4gdGhlIGxpbmtlcikuICAqLwotICBsaW5rcmVsYXggPSAxOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCBtYWNoaW5lIHR5cGUuICAqLwotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21uMTAzMDAsIDMwMCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgY3VycmVudF9tYWNoaW5lID0gMzAwOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKSAKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKm9wY29kZTsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpuZXh0X29wY29kZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0gIGludCBuZXh0X29waW5kZXgsIHJlbGF4YWJsZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb24sIHNpemUgPSAwOwotICBjaGFyICpmOwotICBpbnQgaTsKLSAgaW50IG1hdGNoOwotCi0gIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICEgaXNzcGFjZSAoKnMpOyBzKyspCi0gICAgOwotICBpZiAoKnMgIT0gJ1wwJykKLSAgICAqcysrID0gJ1wwJzsKLQotICAvKiBmaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUgKi8KLSAgb3Bjb2RlID0gKHN0cnVjdCBtbjEwMzAwX29wY29kZSAqKWhhc2hfZmluZCAobW4xMDMwMF9oYXNoLCBzdHIpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ciA9IHM7Ci0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgZm9yKDs7KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICAgIGludCBvcF9pZHg7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgaW50IGV4dHJhX3NoaWZ0ID0gMDsKLQotCi0gICAgICBlcnJtc2cgPSBfKCJJbnZhbGlkIG9wY29kZS9vcGVyYW5kcyIpOwotCi0gICAgICAvKiBSZXNldCB0aGUgYXJyYXkgb2YgcmVnaXN0ZXIgb3BlcmFuZHMuICAqLwotICAgICAgbWVtc2V0IChtbjEwMzAwX3JlZ19vcGVyYW5kcywgLTEsIHNpemVvZiAobW4xMDMwMF9yZWdfb3BlcmFuZHMpKTsKLQotICAgICAgcmVsYXhhYmxlID0gMDsKLSAgICAgIGZjID0gMDsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0gICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0gICAgICBleHRlbnNpb24gPSAwOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBtYWNoaW5lCi0JIHRoZW4gaXQgY2FuIG5vdCBwb3NzaWJseSBtYXRjaC4gICovCi0gICAgICBpZiAob3Bjb2RlLT5tYWNoaW5lCi0JICAmJiAob3Bjb2RlLT5tYWNoaW5lICE9IGN1cnJlbnRfbWFjaGluZSkpCi0JZ290byBlcnJvcjsKLQotICAgICAgZm9yIChvcF9pZHggPSAxLCBvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7Ci0JICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgb3BpbmRleF9wdHIrKywgb3BfaWR4KyspCi0JewotCSAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqb3BlcmFuZDsKLQkgIGV4cHJlc3Npb25TIGV4OwotCi0JICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzW25leHRfb3BpbmRleF07Ci0JICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLQkgICAgfQotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcpCi0JICAgICsrc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVMQVgpCi0JICAgIHJlbGF4YWJsZSA9IDE7Ci0KLQkgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gKi8KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICAvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSBvcGVyYW5kcy4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9EUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9BUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUCkKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAic3AiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JSRUcpCi0JICAgIHsKLQkgICAgICBpZiAoIXJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1hSUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCF4cl9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfVVNQKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJ1c3AiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NTUCkKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAic3NwIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NU1ApCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgIm1zcCIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEMpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInBjIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9FUFNXKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJlcHN3IikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QTFVTKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJysnKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BTVykKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAicHN3IikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NRFIpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgIm1kciIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOwotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdbJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgICAvKiBFYXQgdGhlICdbJy4gICovCi0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAKLQkgICAgICAvKiBXZSB1c2VkIHRvIHJlamVjdCBhIG51bGwgcmVnaXN0ZXIgbGlzdCBoZXJlOyBob3dldmVyLAotCQkgd2UgYWNjZXB0IGl0IG5vdyBzbyB0aGUgY29tcGlsZXIgY2FuIGVtaXQgImNhbGwiIGluc3RydWN0aW9ucwotCQkgZm9yIGFsbCBjYWxscyB0byBuYW1lZCBmdW5jdGlvbnMuCi0KLQkJIFRoZSBsaW5rZXIgY2FuIHRoZW4gZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgYml0cyBmb3IgdGhlCi0JCSByZWdpc3RlciBsaXN0IGFuZCBzdGFjayBzaXplIG9yIGNoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24KLQkJIGludG8gYSAiY2FsbHMiIGlmIHVzaW5nICJjYWxsIiBpcyBub3QgcHJvZml0YWJsZS4gICovCi0JICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ10nKQotCQl7Ci0JCSAgY2hhciAqc3RhcnQ7Ci0JCSAgY2hhciBjOwotCi0JCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCQkgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLQkJICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkJICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJkMiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4ODA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiZDMiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDQwOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgImEyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgyMDsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJhMyIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MTA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAib3RoZXIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDA4OwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChjdXJyZW50X21hY2hpbmUgPT0gMzMwCi0JCQkgICAmJiBzdHJjYXNlY21wIChzdGFydCwgImV4cmVnMCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MDQ7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGN1cnJlbnRfbWFjaGluZSA9PSAzMzAKLQkJCSAgICYmIHN0cmNhc2VjbXAgKHN0YXJ0LCAiZXhyZWcxIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgwMjsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoY3VycmVudF9tYWNoaW5lID09IDMzMAotCQkJICAgJiYgc3RyY2FzZWNtcCAoc3RhcnQsICJleG90aGVyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgwMTsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoY3VycmVudF9tYWNoaW5lID09IDMzMAotCQkJICAgJiYgc3RyY2FzZWNtcCAoc3RhcnQsICJhbGwiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweGZmOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgICAgIHN0ciA9IGhvbGQ7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgICAgICAgICAgbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0KLQkgICAgfQotCSAgZWxzZSBpZiAoZGF0YV9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmIChvdGhlcl9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmICh4cl9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpzdHIgPT0gJyknIHx8ICpzdHIgPT0gJygnKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb24gKCZleCk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChleC5YX29wKSAKLQkgICAgewotCSAgICBjYXNlIE9faWxsZWdhbDoKLQkgICAgICBlcnJtc2cgPSBfKCJpbGxlZ2FsIG9wZXJhbmQiKTsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICBjYXNlIE9fYWJzZW50OgotCSAgICAgIGVycm1zZyA9IF8oIm1pc3Npbmcgb3BlcmFuZCIpOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIGNhc2UgT19yZWdpc3RlcjoKLQkgICAgICB7Ci0JCWludCBtYXNrOwotCi0JCW1hc2sgPSBNTjEwMzAwX09QRVJBTkRfRFJFRyB8IE1OMTAzMDBfT1BFUkFORF9BUkVHOwotCQltYXNrIHw9IE1OMTAzMDBfT1BFUkFORF9SUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1hSUkVHOwotCQlpZiAoKG9wZXJhbmQtPmZsYWdzICYgbWFzaykgPT0gMCkKLQkJICB7Ci0JCSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgICAgc3RyID0gaG9sZDsKLQkJICAgIGdvdG8gZXJyb3I7Ci0JCSAgfQotCQkKLQkJaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzEpCi0JCSAgZXh0cmFfc2hpZnQgPSA4OwotCQllbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDQKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzYKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDUpCi0JCSAgZXh0cmFfc2hpZnQgPSAxNjsKLQkJZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q3KQotCQkgIGV4dHJhX3NoaWZ0ID0gODsKLQkJZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q4IHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EOSkKLQkJICBleHRyYV9zaGlmdCA9IDg7Ci0JCWVsc2UKLQkJICBleHRyYV9zaGlmdCA9IDA7Ci0JICAgICAgCi0JCW1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCQlleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCi0JCQkJCTAsIGV4dHJhX3NoaWZ0KTsKLQotCi0JCS8qIEFuZCBub3RlIHRoZSByZWdpc3RlciBudW1iZXIgaW4gdGhlIHJlZ2lzdGVyIGFycmF5LiAgKi8KLQkJbW4xMDMwMF9yZWdfb3BlcmFuZHNbb3BfaWR4IC0gMV0gPSBleC5YX2FkZF9udW1iZXI7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgYW5kIGl0IGRvZXNuJ3QKLQkJIGZpdCBpbnRvIHRoZSBhbGxvY2F0ZWQgYml0ZmllbGQgZm9yIHRoaXMgaW5zbiwKLQkJIHRoZW4gcHJvbW90ZSBpdCAoaWUgdGhpcyBvcGNvZGUgZG9lcyBub3QgbWF0Y2gpLiAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MKLQkJICAmIChNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCkKLQkJICAmJiAhIGNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlcikpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0JCQkJICAgICAgZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAotCQkJCSAgICAgIDAsIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgdGhlbiB0aGlzIG9wY29kZSBkaWRuJ3QKLQkJIG1hdGNoIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgaXQgbmVlZGVkIHByb21vdGlvbiEgICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotCSAgICAgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICAgICAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgICAgICBmaXh1cHNbZmNdLm9waW5kZXggPSAqb3BpbmRleF9wdHI7Ci0JICAgICAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgICAgKytmYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi1rZWVwX2dvaW5nOgotCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQotCSAgICArK3N0cjsKLQotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHdlIHVzZWQgYWxsIHRoZSBvcGVyYW5kcyEgICovCi0gICAgICBpZiAoKnN0ciAhPSAnLCcpCi0JbWF0Y2ggPSAxOwotCi0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGhhcyByZWdpc3RlcnMgdGhhdCBtdXN0IG5vdCBtYXRjaCwgdmVyaWZ5Ci0JIHRoYXQgdGhleSBkbyBpbmRlZWQgbm90IG1hdGNoLiAgKi8KLSAgICAgIGlmIChvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQotCXsKLQkgIGludCBpOwotCi0JICAvKiBMb29rIGF0IGVhY2ggb3BlcmFuZCB0byBzZWUgaWYgaXQncyBtYXJrZWQuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IE1OMTAzMDBfTUFYX09QRVJBTkRTOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoKDEgPDwgaSkgJiBvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQotCQl7Ci0JCSAgaW50IGo7Ci0KLQkJICAvKiBvcGVyYW5kIEkgaXMgbWFya2VkLiAgQ2hlY2sgdGhhdCBpdCBkb2VzIG5vdCBtYXRjaCBhbnkKLQkJICAgICBvcGVyYW5kcyA+IEkgd2hpY2ggYXJlIG1hcmtlZC4gICovCi0JCSAgZm9yIChqID0gaSArIDE7IGogPCBNTjEwMzAwX01BWF9PUEVSQU5EUzsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoKCgxIDw8IGopICYgb3Bjb2RlLT5ub19tYXRjaF9vcGVyYW5kcykKLQkJCSAgJiYgbW4xMDMwMF9yZWdfb3BlcmFuZHNbaV0gPT0gbW4xMDMwMF9yZWdfb3BlcmFuZHNbal0pCi0JCQl7Ci0JCQkgIGVycm1zZyA9IF8oIkludmFsaWQgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4iKTsKLQkJCSAgbWF0Y2ggPSAwOwotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotICAgICAgICB7Ci0JICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7Ci0JICBpZiAoIXN0cmNtcChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQkgICAgewotCSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAKLQkgIGFzX2JhZCAoIiVzIiwgZXJybXNnKTsKLQkgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMCkKLSAgICBzaXplID0gMTsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMCkKLSAgICBzaXplID0gMjsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSkKLSAgICBzaXplID0gMzsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q2KQotICAgIHNpemUgPSAzOwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDcgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QxMCkKLSAgICBzaXplID0gNDsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q4KQotICAgIHNpemUgPSA2OwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDkpCi0gICAgc2l6ZSA9IDc7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNCkKLSAgICBzaXplID0gNTsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2IHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENSkKLSAgICBzaXplID0gNzsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyKQotICAgIHNpemUgPSA0OwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDQpCi0gICAgc2l6ZSA9IDY7Ci0KLSAgaWYgKHJlbGF4YWJsZSAmJiBmYyA+IDApCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0KLSAgICAgIC8qIGJDQyAqLwotICAgICAgaWYgKHNpemUgPT0gMikKLQl7Ci0JICAvKiBIYW5kbGUgYnJhIHNwZWNpYWxseS4gIEJhc2ljYWxseSB0cmVhdCBpdCBsaWtlIGptcCBzbwotCSAgICAgdGhhdCB3ZSBhdXRvbWF0aWNhbGx5IGhhbmRsZSA4LCAxNiBhbmQgMzIgYml0IG9mZnNldHMKLQkgICAgIGNvcnJlY3RseSBhcyB3ZWxsIGFzIGp1bXBzIHRvIGFuIHVuZGVmaW5lZCBhZGRyZXNzLgotCi0JICAgICBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3QgdHJlYXQgaXQgbGlrZSBvdGhlciBiQ0MKLQkgICAgIGluc3RydWN0aW9ucyBzaW5jZSB0aGUgbG9uZyBmb3JtcyBvZiBicmEgaXMgZGlmZmVyZW50Ci0JICAgICBmcm9tIG90aGVyIGJDQyBpbnN0cnVjdGlvbnMuICAqLwotCSAgaWYgKG9wY29kZS0+b3Bjb2RlID09IDB4Y2EwMCkKLQkgICAgdHlwZSA9IDEwOwotCSAgZWxzZQotCSAgICB0eXBlID0gMDsKLQl9Ci0gICAgICAvKiBjYWxsICovCi0gICAgICBlbHNlIGlmIChzaXplID09IDUpCi0gICAgICAgIHR5cGUgPSA2OwotICAgICAgLyogY2FsbHMgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKLQl0eXBlID0gODsKLSAgICAgIC8qIGptcCAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAzICYmIG9wY29kZS0+b3Bjb2RlID09IDB4Y2MwMDAwKQotCXR5cGUgPSAxMDsKLSAgICAgIC8qIGJDQyAodW5jb21tb24gY2FzZXMpICovCi0gICAgICBlbHNlCi0JdHlwZSA9IDM7Ci0KLSAgICAgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDggLSBzaXplLCB0eXBlLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCSAgICBmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKLQkJICAgIChjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOwotICAgICAgCi0gICAgICAvKiBUaGlzIGlzIHByZXR0eSBob2tleS4gIFdlIGJhc2ljYWxseSBqdXN0IGNhcmUgYWJvdXQgdGhlCi0JIG9wY29kZSwgc28gd2UgaGF2ZSB0byB3cml0ZSBvdXQgdGhlIGZpcnN0IHdvcmQgYmlnIGVuZGlhbi4KLQotCSBUaGUgZXhjZXB0aW9uIGlzICJjYWxsIiwgd2hpY2ggaGFzIHR3byBvcGVyYW5kcyB0aGF0IHdlCi0JIGNhcmUgYWJvdXQuCi0KLQkgVGhlIGZpcnN0IG9wZXJhbmQgKHRoZSByZWdpc3RlciBsaXN0KSBoYXBwZW5zIHRvIGJlIGluIHRoZQotCSBmaXJzdCBpbnN0cnVjdGlvbiB3b3JkLCBhbmQgd2lsbCBiZSBpbiB0aGUgcmlnaHQgcGxhY2UgaWYKLQkgd2Ugb3V0cHV0IHRoZSBmaXJzdCB3b3JkIGluIGJpZyBlbmRpYW4gbW9kZS4KLQotCSBUaGUgc2Vjb25kIG9wZXJhbmQgKHN0YWNrIHNpemUpIGlzIGluIHRoZSBleHRlbnNpb24gd29yZCwKLQkgYW5kIHdlIHdhbnQgaXQgdG8gYXBwZWFyIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGV4dGVuc2lvbgotCSB3b3JkIChhcyBpdCBhcHBlYXJzIGluIG1lbW9yeSkuICBMdWNraWx5LCB3cml0aW5nIHRoZSBleHRlbnNpb24KLQkgd29yZCBpbiBiaWcgZW5kaWFuIGZvcm1hdCB3aWxsIGRvIHdoYXQgd2Ugd2FudC4gICovCi0gICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplID4gNCA/IDQgOiBzaXplKTsKLSAgICAgIGlmIChzaXplID4gOCkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNCwgZXh0ZW5zaW9uLCA0KTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA4LCAwLCBzaXplIC0gOCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc2l6ZSA+IDQpCi0JbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiwgc2l6ZSAtIDQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZiA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gYnl0ZXMgZm9yIHRoZSBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCBvcGNvZGUgZmllbGRzCi0JIGFyZSB3cml0dGVuIGJpZy1lbmRpYW4sIDE2ICYgMzJiaXQgaW1tZWRpYXRlcyBhcmUgd3JpdHRlbgotCSBsaXR0bGUgZW5kaWFuLiAgRWdhZC4gICovCi0gICAgICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MwCi0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzEKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMAotCSAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q2Ci0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDcKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMTAKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkZjAwMDAKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkZTAwMDApCi0JewotCSAgLyogQSBmb3JtYXQgUzIgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBfbm90XyAicmV0IiBhbmQgInJldGYiLiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIGluc24gJiAweGZmZmYsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMikKLQl7Ci0JICAvKiBUaGlzIG11c3QgYmUgYSByZXQgb3IgcmV0Ziwgd2hpY2ggaXMgd3JpdHRlbiBlbnRpcmVseSBpbgotCSAgICAgYmlnLWVuZGlhbiBmb3JtYXQuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgMyk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0Ci0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZGMwMDAwMDApCi0JewotCSAgLyogVGhpcyBtdXN0IGJlIGEgZm9ybWF0IFM0ICJjYWxsIiBpbnN0cnVjdGlvbi4gIFdoYXQgYSBwYWluLiAgKi8KLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IChpbnNuID4+IDgpICYgMHhmZmZmOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgMywgaW5zbiAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNCkKLQl7Ci0JICAvKiBUaGlzIG11c3QgYmUgYSBmb3JtYXQgUzQgImptcCIgaW5zdHJ1Y3Rpb24uICAqLwotCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZmZmZmYpIDw8IDgpIHwgKGV4dGVuc2lvbiAmIDB4ZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgNCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZmZmKSA8PCA4KQotCSAgICB8ICgoZXh0ZW5zaW9uID4+IDE2KSAmIDB4ZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNSwgKGV4dGVuc2lvbiA+PiA4KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDYsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMgotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGZhZjgwMDAwCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmFmMDAwMDAKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYWY0MDAwMCkKLQl7Ci0JICAvKiBBIGZvcm1hdCBEMiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgMTZiaXQgaW1tZWRpYXRlIGlzCi0JICAgICByZWFsbHkgYSBzaW5nbGUgMTZiaXQgdmFsdWUsIG5vdCB0d28gOGJpdCB2YWx1ZXMuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIpCi0JewotCSAgLyogQSBmb3JtYXQgRDIgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIDE2Yml0IGltbWVkaWF0ZQotCSAgICAgaXMgcmVhbGx5IHR3byA4Yml0IGltbWVkaWF0ZXMuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgNCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpIHwgKGV4dGVuc2lvbiAmIDB4ZmZmZik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIHRlbXAsIDQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KQotCSAgICAJCQl8ICgoZXh0ZW5zaW9uID4+IDgpICYgMHhmZmZmKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgdGVtcCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNiwgZXh0ZW5zaW9uICYgMHhmZiwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q4KQotCXsKLSAgICAgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmKSA8PCAxNikgfCAoZXh0ZW5zaW9uICYgMHhmZmZmKTsKLSAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiA4KSAmIDB4ZmZmZmZmLCAzKTsKLSAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgMywgKHRlbXAgJiAweGZmKSwgMSk7Ci0gICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDQsIHRlbXAgPj4gOCwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q5KQotCXsKLSAgICAgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmKSA8PCAyNCkgfCAoZXh0ZW5zaW9uICYgMHhmZmZmZmYpOwotICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDgpICYgMHhmZmZmZmYsIDMpOwotICAgICAgICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAzLCB0ZW1wLCA0KTsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgIG9wZXJhbmQgPSAmbW4xMDMwMF9vcGVyYW5kc1tmaXh1cHNbaV0ub3BpbmRleF07Ci0JICBpZiAoZml4dXBzW2ldLnJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JICAgIHsKLQkgICAgICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0bzsKLQkgICAgICBpbnQgc2l6ZTsKLQkgICAgICBpbnQgb2Zmc2V0OwotCSAgICAgIGZpeFMgKmZpeFA7Ci0KLQkgICAgICByZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cHNbaV0ucmVsb2MpOwotCi0JICAgICAgaWYgKCFyZWxvY19ob3d0bykKLQkJYWJvcnQoKTsKLQkgIAotCSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgICAgIGlmIChzaXplIDwgMSB8fCBzaXplID4gNCkKLQkJYWJvcnQoKTsKLQotCSAgICAgIG9mZnNldCA9IDQgLSBzaXplOwotCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKLQkJCQkgIHNpemUsICZmaXh1cHNbaV0uZXhwLAotCQkJCSAgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCSAgZml4dXBzW2ldLnJlbG9jKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IHJlbG9jLCBwY3JlbCwgcmVsb2Nfc2l6ZSwgb2Zmc2V0OwotCSAgICAgIGZpeFMgKmZpeFA7Ci0KLQkgICAgICByZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotCSAgICAgIC8qIEhvdyBiaWcgaXMgdGhlIHJlbG9jPyAgUmVtZW1iZXIgU1BMSVQgcmVsb2NzIGFyZQotCQkgaW1wbGljaXRseSAzMmJpdHMuICAqLwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0JCXJlbG9jX3NpemUgPSAzMjsKLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfMjRCSVQpICE9IDApCi0JCXJlbG9jX3NpemUgPSAyNDsKLQkgICAgICBlbHNlCi0JCXJlbG9jX3NpemUgPSBvcGVyYW5kLT5iaXRzOwotCi0JICAgICAgLyogSXMgdGhlIHJlbG9jIHBjLXJlbGF0aXZlPyAgKi8KLQkgICAgICBwY3JlbCA9IChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCkgIT0gMDsKLQotCSAgICAgIC8qIEdyb3NzLiAgVGhpcyBkaXNndXN0aW5nIGhhY2sgaXMgdG8gbWFrZSBzdXJlIHdlCi0JCSBnZXQgdGhlIHJpZ2h0IG9mZnNldCBmb3IgdGhlIDE2LzMyIGJpdCByZWxvYyBpbiAKLQkJICJjYWxsIiBpbnN0cnVjdGlvbnMuICBCYXNpY2FsbHkgdGhleSdyZSBhIHBhaW4KLQkJIGJlY2F1c2UgdGhlIHJlbG9jIGlzbid0IGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKHNpemUgPT0gNSB8fCBzaXplID09IDcpCi0JCSAgJiYgKCgoaW5zbiA+PiAyNCkgJiAweGZmKSA9PSAweGNkCi0JCSAgICAgIHx8ICgoaW5zbiA+PiAyNCkgJiAweGZmKSA9PSAweGRkKSkKLQkJc2l6ZSAtPSAyOwotCi0JICAgICAgLyogU2ltaWxhcmx5IGZvciBjZXJ0YWluIGJpdCBpbnN0cnVjdGlvbnMgd2hpY2ggZG9uJ3QKLQkJIGhhdiB0aGVpciAzMmJpdCByZWxvYyBhdCB0aGUgdGFpbCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChzaXplID09IDcKLQkJICAmJiAoKChpbnNuID4+IDE2KSAmIDB4ZmZmZikgPT0gMHhmZTAwCi0JCSAgICAgIHx8ICgoaW5zbiA+PiAxNikgJiAweGZmZmYpID09IDB4ZmUwMQotCQkgICAgICB8fCAoKGluc24gPj4gMTYpICYgMHhmZmZmKSA9PSAweGZlMDIpKQotCQlzaXplIC09IDE7Ci0JCi0JICAgICAgb2Zmc2V0ID0gc2l6ZSAtIHJlbG9jX3NpemUgLyA4OwotCi0JICAgICAgLyogQ2hvb3NlIGEgcHJvcGVyIEJGRCByZWxvY2F0aW9uIHR5cGUuICAqLwotCSAgICAgIGlmIChwY3JlbCkKLQkJewotCQkgIGlmIChyZWxvY19zaXplID09IDMyKQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzMyOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18xNjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDgpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ184OwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICAvKiBDb252ZXJ0IHRoZSBzaXplIG9mIHRoZSByZWxvYyBpbnRvIHdoYXQgZml4X25ld19leHAgd2FudHMuICAqLwotCSAgICAgIHJlbG9jX3NpemUgPSByZWxvY19zaXplIC8gODsKLQkgICAgICBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQlyZWxvY19zaXplID0gMDsKLQkgICAgICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQlyZWxvY19zaXplID0gMTsKLQkgICAgICBlbHNlIGlmIChyZWxvY19zaXplID09IDMyKQotCQlyZWxvY19zaXplID0gMjsKLQotCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKLQkJCQkgIHJlbG9jX3NpemUsICZmaXh1cHNbaV0uZXhwLCBwY3JlbCwKLQkJCQkgICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSByZWxvYykpOwotCi0JICAgICAgaWYgKHBjcmVsKQotCQlmaXhQLT5meF9vZmZzZXQgKz0gb2Zmc2V0OwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi0vKiBpZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSAmJiBmaXhwLT5meF9zdWJzeSkKLSAgICB7Ci0gICAgCi0gICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJIkRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgaXMgbm90IHN1cHBvcnRlZCIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmYmZkX2Fic19zeW1ib2w7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gKFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSArIGZpeHAtPmZ4X29mZnNldCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YoIGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICAgIH0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHJldHVybiAyOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICByZXR1cm4gMzsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA3OwotCSAgcmV0dXJuIDc7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiA1OwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA5OwotCSAgcmV0dXJuIDY7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiA0OwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDEwKQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gMTI7Ci0JICByZXR1cm4gNTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDI7Ci0gICAgfQotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jaWYgMAotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTCAmJiAhIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0jZW5kaWYKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBXZSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZSBiZWNhdXNlIGxpbmtyZWxheCBpcyBub256ZXJvLiAgKi8KLSAgYWJvcnQgKCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMzAwX2luc2VydF9vcGVyYW5kIChpbnNucCwgZXh0ZW5zaW9ucCwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzaGlmdCkKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmV4dGVuc2lvbnA7Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNoaWZ0OwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gIE5vdGUgdGhhdAotICAgICBNTjEwMzAwX09QRVJBTkRfU1BMSVQgaXMgYW4gaW1wbGljaXQgMzJiaXQgb3BlcmFuZC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyCi0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLSAgICAgIGludCBiaXRzOwotCi0gICAgICBiaXRzID0gb3BlcmFuZC0+Yml0czsKLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkKLQliaXRzID0gMjQ7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyICplcnIgPQotICAgICAgICAgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpOwotICAgICAgICAgIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgICAgICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0gICAgICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICAgICAgICAgIGFzX3dhcm4gKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLSAgICAgICAgfQotICAgIH0KLQotICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSAhPSAwKQotICAgIHsKLSAgICAgICppbnNucCB8PSAodmFsID4+ICgzMiAtIG9wZXJhbmQtPmJpdHMpKSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICAgICAgKmV4dGVuc2lvbnAgfD0gKCh2YWwgJiAoKDEgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpIC0gMSkpCi0JCSAgICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqaW5zbnAgfD0gKHZhbCA+PiAoMjQgLSBvcGVyYW5kLT5iaXRzKSkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLSAgICAgICpleHRlbnNpb25wIHw9ICgodmFsICYgKCgxIDw8ICgyNCAtIG9wZXJhbmQtPmJpdHMpKSAtIDEpKQotCQkgICAgICA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpID09IDApCi0gICAgewotICAgICAgKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKLQkqaW5zbnAgfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JCSAgIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgb3BlcmFuZC0+Yml0cykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpleHRlbnNpb25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgICAgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCkpOwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEKSAhPSAwKQotCSpleHRlbnNpb25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkJPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQgKyBvcGVyYW5kLT5iaXRzKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotY2hlY2tfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gIE5vdGUgdGhhdAotICAgICBNTjEwMzAwX09QRVJBTkRfU1BMSVQgaXMgYW4gaW1wbGljaXQgMzJiaXQgb3BlcmFuZC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyCi0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLSAgICAgIGludCBiaXRzOwotCi0gICAgICBiaXRzID0gb3BlcmFuZC0+Yml0czsKLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkKLQliaXRzID0gMjQ7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0JcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9hcmNoX21hY2ggKG1hY2gpCi0gICAgIGludCBtYWNoOwotewotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21uMTAzMDAsIG1hY2gpKQotICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIGN1cnJlbnRfbWFjaGluZSA9IG1hY2g7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuaCBiL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNiMjI3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogdGMtbW4xMDMwMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1tbjEwMzAwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19NTjEwMzAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgTU4xMDMwMCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tbjEwMzAwCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbW4xMDMwMCIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0vKiBEb24ndCBib3RoZXIgdG8gYWRqdXN0IHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgMAotCi0vKiBXZSBkbyByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlci4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1uczMyay5jIGIvZ2FzL2NvbmZpZy90Yy1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWYxNDY3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbnMzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMzAgKzAsMCBAQAotLyogbnMzMmsuYyAgLS0gQXNzZW1ibGUgb24gdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgMzJrIHNlcmllcwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qI2RlZmluZSBTSE9XX05VTSAxKi8vKiB1bmNvbW1lbnQgZm9yIGRlYnVnZ2luZyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvcGNvZGUvbnMzMmsuaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogTWFjcm9zICovCi0jZGVmaW5lIElJRl9FTlRSSUVTIDEzCQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBpaWYgKi8KLSNkZWZpbmUgUFJJVkFURV9TSVpFIDI1NgkvKiBzaXplIG9mIG15IGdhcmJhZ2UgbWVtb3J5ICovCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgREVGQVVMVAktMQkJLyogYWRkcl9tb2RlIHJldHVybnMgdGhpcyB2YWx1ZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluIGNvbnN0YW50IG9yIGxhYmVsIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY291bnRlcmVkICovCi0KLSNkZWZpbmUgSUlGKHB0cixhMSxjMSxlMSxnMSxpMSxrMSxtMSxvMSxxMSxzMSx1MSkJXAotICAgIGlpZi5paWZQW3B0cl0udHlwZT0gYTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnNpemU9IGMxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5vYmplY3Q9IGUxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5vYmplY3RfYWRqdXN0PSBnMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5wY3JlbD0gaTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnBjcmVsX2FkanVzdD0gazE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uaW1fZGlzcD0gbTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnJlbGF4X3N1YnN0YXRlPSBvMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5iaXRfZml4UD0gcTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLmFkZHJfbW9kZT0gczE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uYnNyPSB1MTsKLQotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotI2RlZmluZSBMSU5FX0NPTU1FTlRfQ0hBUlMgInwiCi0jZGVmaW5lIEFCU09MVVRFX1BSRUZJWCAnQCcKLSNkZWZpbmUgSU1NRURJQVRFX1BSRUZJWCAnIycKLSNlbmRpZgotCi0jaWZuZGVmIExJTkVfQ09NTUVOVF9DSEFSUwotI2RlZmluZSBMSU5FX0NPTU1FTlRfQ0hBUlMgIiMiCi0jZW5kaWYKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gTElORV9DT01NRU5UX0NIQVJTOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0jaWYgIWRlZmluZWQoQUJTT0xVVEVfUFJFRklYKSAmJiAhZGVmaW5lZChJTU1FRElBVEVfUFJFRklYKQotI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJ0AnCS8qIE9uZSBvciB0aGUgb3RoZXIgTVVTVCBiZSBkZWZpbmVkICovCi0jZW5kaWYKLQotc3RydWN0IGFkZHJfbW9kZQotICB7Ci0gICAgY2hhciBtb2RlOwkJCS8qIGFkZHJlc3NpbmcgbW9kZSBvZiBvcGVyYW5kICgwLTMxKSAqLwotICAgIGNoYXIgc2NhbGVkX21vZGU7CQkvKiBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkIG1vZGUgKi8KLSAgICBjaGFyIHNjYWxlZF9yZWc7CQkvKiByZWdpc3RlciB1c2VkIGluIHNjYWxlZCsxICgxLTgpICovCi0gICAgY2hhciBmbG9hdF9mbGFnOwkJLyogc2V0IGlmIFIwLi5SNyB3YXMgRjAuLkY3IGllIGEKLQkJCQkgICBmbG9hdGluZy1wb2ludC1yZWdpc3RlciAqLwotICAgIGNoYXIgYW1fc2l6ZTsJCS8qIGVzdGltYXRlZCBtYXggc2l6ZSBvZiBnZW5lcmFsIGFkZHItbW9kZQotCQkJCSAgIHBhcnRzICovCi0gICAgY2hhciBpbV9kaXNwOwkJLyogaWYgaW1fZGlzcD09MSB3ZSBoYXZlIGEgZGlzcGxhY2VtZW50ICovCi0gICAgY2hhciBwY3JlbDsJCQkvKiAxIGlmIHBjcmVsLCB0aGlzIGlzIHJlYWxseSByZWR1bmRhbnQgaW5mbyAqLwotICAgIGNoYXIgZGlzcF9zdWZmaXhbMl07CS8qIGxlbmd0aCBvZiBkaXNwbGFjZW1lbnQocyksIDA9dW5kZWZpbmVkICovCi0gICAgY2hhciAqZGlzcFsyXTsJCS8qIHBvaW50ZXIocykgYXQgZGlzcGxhY2VtZW50KHMpCi0JCQkJICAgb3IgaW1tZWRpYXRlcyhzKSAgICAgKGFzY2lpKSAqLwotICAgIGNoYXIgaW5kZXhfYnl0ZTsJCS8qIGluZGV4IGJ5dGUgKi8KLSAgfTsKLXR5cGVkZWYgc3RydWN0IGFkZHJfbW9kZSBhZGRyX21vZGVTOwotCi0KLWNoYXIgKmZyZWVwdHIsICpmcmVlcHRyX3N0YXRpYzsJLyogcG9pbnRzIGF0IHNvbWUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgKi8KLXN0cnVjdCBoYXNoX2NvbnRyb2wgKmluc3RfaGFzaF9oYW5kbGU7Ci0KLXN0cnVjdCBuczMya19vcGNvZGUgKmRlc2M7CS8qIHBvaW50ZXIgYXQgZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24gKi8KLWFkZHJfbW9kZVMgYWRkcl9tb2RlUDsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmZCI7CS8qIHdlIGRvbid0IHdhbnQgdG8gc3VwcG9ydCBsb3dlcmNhc2UsIGRvIHdlICovCi0KLS8qIFVQUEVSQ0FTRSBkZW5vdGVzIGxpdmUgbmFtZXMgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBidWlsdCwgSUlGIGlzCi0gKiB1c2VkIGFzIGFuIGludGVybWVkaWF0ZSBmb3JtIHRvIHN0b3JlIHRoZSBhY3R1YWwgcGFydHMgb2YgdGhlCi0gKiBpbnN0cnVjdGlvbi4gQSBuczMyayBtYWNoaW5lIGluc3RydWN0aW9uIGNhbiBiZSBkaXZpZGVkIGludG8gYQotICogY291cGxlIG9mIHN1YiBQQVJUcy4gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBhc3NlbWJsZWQgdGhlCi0gKiBhcHByb3ByaWF0ZSBQQVJUIGdldCBhbiBhc3NpZ25tZW50LiBXaGVuIGFuIElJRiBoYXMgYmVlbiBjb21wbGV0ZWQKLSAqIGl0IGlzIGNvbnZlcnRlZCB0byBhIEZSQUdtZW50IGFzIHNwZWNpZmllZCBpbiBBUy5IICovCi0KLS8qIGludGVybmFsIHN0cnVjdHMgKi8KLXN0cnVjdCBuczMya19vcHRpb24KLSAgewotICAgIGNoYXIgKnBhdHRlcm47Ci0gICAgdW5zaWduZWQgbG9uZyBvcjsKLSAgICB1bnNpZ25lZCBsb25nIGFuZDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGludCB0eXBlOwkJCS8qIGhvdyB0byBpbnRlcnByZXQgb2JqZWN0ICovCi0gICAgaW50IHNpemU7CQkJLyogRXN0aW1hdGVkIG1heCBzaXplIG9mIG9iamVjdCAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2JqZWN0OwkvKiBiaW5hcnkgZGF0YSAqLwotICAgIGludCBvYmplY3RfYWRqdXN0OwkJLyogbnVtYmVyIGFkZGVkIHRvIG9iamVjdCAqLwotICAgIGludCBwY3JlbDsJCQkvKiBUcnVlIGlmIG9iamVjdCBpcyBwY3JlbCAqLwotICAgIGludCBwY3JlbF9hZGp1c3Q7CQkvKiBsZW5ndGggaW4gYnl0ZXMgZnJvbSB0aGUKLQkJCQkJICAgaW5zdHJ1Y3Rpb24gc3RhcnQgdG8gdGhlCi0JCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotICAgIGludCBpbV9kaXNwOwkJLyogVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZGlzcGxhY2VtZW50ICovCi0gICAgcmVsYXhfc3Vic3RhdGVUIHJlbGF4X3N1YnN0YXRlOwkvKiBJbml0aWFsIHJlbGF4c3Vic3RhdGUgKi8KLSAgICBiaXRfZml4UyAqYml0X2ZpeFA7CQkvKiBQb2ludGVyIGF0IGJpdF9maXggc3RydWN0ICovCi0gICAgaW50IGFkZHJfbW9kZTsJCS8qIFdoYXQgYWRkcm1vZGUgZG8gd2UgYXNzb2NpYXRlIHdpdGggdGhpcwotCQkJCSAgIGlpZi1lbnRyeSAqLwotICAgIGNoYXIgYnNyOwkJCS8qIFNlcXVlbnQgaGFjayAqLwotICB9IGlpZl9lbnRyeVQ7CQkJLyogSW50ZXJuYWwgSW5zdHJ1Y3Rpb24gRm9ybWF0ICovCi0KLXN0cnVjdCBpbnRfaW5zX2Zvcm0KLSAgewotICAgIGludCBpbnN0cl9zaXplOwkJLyogTWF4IHNpemUgb2YgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuICovCi0gICAgaWlmX2VudHJ5VCBpaWZQW0lJRl9FTlRSSUVTICsgMV07Ci0gIH07Ci1zdHJ1Y3QgaW50X2luc19mb3JtIGlpZjsKLWV4cHJlc3Npb25TIGV4cHJQOwotY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotLyogZGVzY3JpcHRpb24gb2YgdGhlIFBBUlRzIGluIElJRgotICpvYmplY3Rbbl06Ci0gKiAwCXRvdGFsIGxlbmd0aCBpbiBieXRlcyBvZiBlbnRyaWVzIGluIGlpZgotICogMQlvcGNvZGUKLSAqIDIJaW5kZXhfYnl0ZV9hCi0gKiAzCWluZGV4X2J5dGVfYgotICogNAlkaXNwX2FfMQotICogNQlkaXNwX2FfMgotICogNglkaXNwX2JfMQotICogNwlkaXNwX2JfMgotICogOAlpbW1fYQotICogOQlpbW1fYgotICogMTAJaW1wbGllZDEKLSAqIDExCWltcGxpZWQyCi0gKgotICogRm9yIGV2ZXJ5IGVudHJ5IHRoZXJlIGlzIGEgZGF0YWxlbmd0aCBpbiBieXRlcy4gVGhpcyBpcyBzdG9yZWQgaW4gc2l6ZVtuXS4KLSAqCSAwLAl0aGUgb2JqZWN0bGVuZ3RoIGlzIG5vdCBleHBsaWNpdGx5IGdpdmVuIGJ5IHRoZSBpbnN0cnVjdGlvbgotICoJCWFuZCB0aGUgb3BlcmFuZCBpcyB1bmRlZmluZWQuIFRoaXMgaXMgYSBjYXNlIGZvciByZWxheGF0aW9uLgotICoJCVJlc2VydmUgNCBieXRlcyBmb3IgdGhlIGZpbmFsIG9iamVjdC4KLSAqCi0gKgkgMSwJdGhlIGVudHJ5IGNvbnRhaW5zIG9uZSBieXRlCi0gKgkgMiwJdGhlIGVudHJ5IGNvbnRhaW5zIHR3byBieXRlcwotICoJIDMsCXRoZSBlbnRyeSBjb250YWlucyB0aHJlZSBieXRlcwotICoJIDQsCXRoZSBlbnRyeSBjb250YWlucyBmb3VyIGJ5dGVzCi0gKglldGMKLSAqCi0gKiBGdXJ0aGVybW9yZSwgZXZlcnkgZW50cnkgaGFzIGEgZGF0YSB0eXBlIGlkZW50aWZpZXIgaW4gdHlwZVtuXS4KLSAqCi0gKiAJIDAsCXRoZSBlbnRyeSBpcyB2b2lkLCBpZ25vcmUgaXQuCi0gKiAJIDEsCXRoZSBlbnRyeSBpcyBhIGJpbmFyeSBudW1iZXIuCi0gKgkgMiwJdGhlIGVudHJ5IGlzIGEgcG9pbnRlciBhdCBhbiBleHByZXNzaW9uLgotICoJCVdoZXJlIGV4cHJlc3Npb24gbWF5IGJlIGFzIHNpbXBsZSBhcyBhIHNpbmdsZSAnMScsCi0gKgkJYW5kIGFzIGNvbXBsaWNhdGVkIGFzICBmb28tYmFyKzEyLAotICogCQlmb28gYW5kIGJhciBtYXkgYmUgdW5kZWZpbmVkIGJ1dCBzdWZmaXhlZCBieSA6e2J8d3xkfSB0bwotICoJCWNvbnRyb2wgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LgotICoKLSAqCSAzLAl0aGUgZW50cnkgaXMgYSBwb2ludGVyIGF0IGEgYmlnbnVtIHN0cnVjdAotICoKLSAqCi0gKiBUaGUgbG93LW9yZGVyLWJ5dGUgY29yZXNwb25kcyB0byBsb3cgcGh5c2ljYWwgbWVtb3J5LgotICogT2J2aW91c2x5IGEgRlJBR21lbnQgbXVzdCBiZSBjcmVhdGVkIGZvciBlYWNoIHZhbGlkIGRpc3AgaW4gUEFSVCB3aG9zZQotICogZGF0YWxlbmd0aCBpcyB1bmRlZmluZWQgKHRvIGJhZCkgLgotICogVGhlIGNhc2Ugd2hlcmUganVzdCB0aGUgZXhwcmVzc2lvbiBpcyB1bmRlZmluZWQgaXMgbGVzcyBzZXZlcmUgYW5kIGlzCi0gKiBoYW5kbGVkIGJ5IGZpeC4gSGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvYmplY3RmaWxlIGlzIGtub3duLgotICogV2l0aCB0aGlzIHJlcHJlc2VudGF0aW9uIHdlIHNpbXBsaWZ5IHRoZSBhc3NlbWJseSBhbmQgc2VwYXJhdGVzIHRoZQotICogbWFjaGluZSBkZXBlbmRlbnQvaW5kZXBlbmRlbnQgcGFydHMgaW4gYSBtb3JlIGNsZWFuIHdheSAoc2FpZCBPRSkKLSAqLwotDAotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQxW10gPQkJLyogcmVzdG9yZSwgZXhpdCAqLwotewotICB7InIwIiwgMHg4MCwgMHhmZn0sCi0gIHsicjEiLCAweDQwLCAweGZmfSwKLSAgeyJyMiIsIDB4MjAsIDB4ZmZ9LAotICB7InIzIiwgMHgxMCwgMHhmZn0sCi0gIHsicjQiLCAweDA4LCAweGZmfSwKLSAgeyJyNSIsIDB4MDQsIDB4ZmZ9LAotICB7InI2IiwgMHgwMiwgMHhmZn0sCi0gIHsicjciLCAweDAxLCAweGZmfSwKLSAgezAsIDB4MDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQyW10gPQkJLyogc2F2ZSwgZW50ZXIgKi8KLXsKLSAgeyJyMCIsIDB4MDEsIDB4ZmZ9LAotICB7InIxIiwgMHgwMiwgMHhmZn0sCi0gIHsicjIiLCAweDA0LCAweGZmfSwKLSAgeyJyMyIsIDB4MDgsIDB4ZmZ9LAotICB7InI0IiwgMHgxMCwgMHhmZn0sCi0gIHsicjUiLCAweDIwLCAweGZmfSwKLSAgeyJyNiIsIDB4NDAsIDB4ZmZ9LAotICB7InI3IiwgMHg4MCwgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0M1tdID0JCS8qIHNldGNmZyAqLwotewotICB7ImMiLCAweDgsIDB4ZmZ9LAotICB7Im0iLCAweDQsIDB4ZmZ9LAotICB7ImYiLCAweDIsIDB4ZmZ9LAotICB7ImkiLCAweDEsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NFtdID0JCS8qIGNpbnYgKi8KLXsKLSAgeyJhIiwgMHg0LCAweGZmfSwKLSAgeyJpIiwgMHgyLCAweGZmfSwKLSAgeyJkIiwgMHgxLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDVbXSA9CQkvKiBzdHJpbmcgaW5zdCAqLwotewotICB7ImIiLCAweDIsIDB4ZmZ9LAotICB7InUiLCAweGMsIDB4ZmZ9LAotICB7InciLCAweDQsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NltdID0JCS8qIHBsYWluIHJlZyBleHQsY3Z0cCBldGMgKi8KLXsKLSAgeyJyMCIsIDB4MDAsIDB4ZmZ9LAotICB7InIxIiwgMHgwMSwgMHhmZn0sCi0gIHsicjIiLCAweDAyLCAweGZmfSwKLSAgeyJyMyIsIDB4MDMsIDB4ZmZ9LAotICB7InI0IiwgMHgwNCwgMHhmZn0sCi0gIHsicjUiLCAweDA1LCAweGZmfSwKLSAgeyJyNiIsIDB4MDYsIDB4ZmZ9LAotICB7InI3IiwgMHgwNywgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLQotI2lmICFkZWZpbmVkKE5TMzIwMzIpICYmICFkZWZpbmVkKE5TMzI1MzIpCi0jZGVmaW5lIE5TMzI1MzIKLSNlbmRpZgotCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIGNwdXJlZ181MzJbXSA9CS8qIGxwciBzcHIgKi8KLXsKLSAgeyJ1cyIsIDB4MCwgMHhmZn0sCi0gIHsiZGNyIiwgMHgxLCAweGZmfSwKLSAgeyJicGMiLCAweDIsIDB4ZmZ9LAotICB7ImRzciIsIDB4MywgMHhmZn0sCi0gIHsiY2FyIiwgMHg0LCAweGZmfSwKLSAgeyJmcCIsIDB4OCwgMHhmZn0sCi0gIHsic3AiLCAweDksIDB4ZmZ9LAotICB7InNiIiwgMHhhLCAweGZmfSwKLSAgeyJ1c3AiLCAweGIsIDB4ZmZ9LAotICB7ImNmZyIsIDB4YywgMHhmZn0sCi0gIHsicHNyIiwgMHhkLCAweGZmfSwKLSAgeyJpbnRiYXNlIiwgMHhlLCAweGZmfSwKLSAgeyJtb2QiLCAweGYsIDB4ZmZ9LAotICB7MCwgMHgwMCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG1tdXJlZ181MzJbXSA9CS8qIGxtciBzbXIgKi8KLXsKLSAgeyJtY3IiLCAweDksIDB4ZmZ9LAotICB7Im1zciIsIDB4YSwgMHhmZn0sCi0gIHsidGVhciIsIDB4YiwgMHhmZn0sCi0gIHsicHRiMCIsIDB4YywgMHhmZn0sCi0gIHsicHRiMSIsIDB4ZCwgMHhmZn0sCi0gIHsiaXZhcjAiLCAweGUsIDB4ZmZ9LAotICB7Iml2YXIxIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci0KLXN0cnVjdCBuczMya19vcHRpb24gY3B1cmVnXzAzMltdID0JLyogbHByIHNwciAqLwotewotICB7InVwc3IiLCAweDAsIDB4ZmZ9LAotICB7ImZwIiwgMHg4LCAweGZmfSwKLSAgeyJzcCIsIDB4OSwgMHhmZn0sCi0gIHsic2IiLCAweGEsIDB4ZmZ9LAotICB7InBzciIsIDB4ZCwgMHhmZn0sCi0gIHsiaW50YmFzZSIsIDB4ZSwgMHhmZn0sCi0gIHsibW9kIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG1tdXJlZ18wMzJbXSA9CS8qIGxtciBzbXIgKi8KLXsKLSAgeyJicHIwIiwgMHgwLCAweGZmfSwKLSAgeyJicHIxIiwgMHgxLCAweGZmfSwKLSAgeyJwZjAiLCAweDQsIDB4ZmZ9LAotICB7InBmMSIsIDB4NSwgMHhmZn0sCi0gIHsic2MiLCAweDgsIDB4ZmZ9LAotICB7Im1zciIsIDB4YSwgMHhmZn0sCi0gIHsiYmNudCIsIDB4YiwgMHhmZn0sCi0gIHsicHRiMCIsIDB4YywgMHhmZn0sCi0gIHsicHRiMSIsIDB4ZCwgMHhmZn0sCi0gIHsiZWlhIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci0KLSNpZiBkZWZpbmVkKE5TMzI1MzIpCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uICpjcHVyZWcgPSBjcHVyZWdfNTMyOwotc3RydWN0IG5zMzJrX29wdGlvbiAqbW11cmVnID0gbW11cmVnXzUzMjsKLSNlbHNlCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uICpjcHVyZWcgPSBjcHVyZWdfMDMyOwotc3RydWN0IG5zMzJrX29wdGlvbiAqbW11cmVnID0gbW11cmVnXzAzMjsKLSNlbmRpZgotDAotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewkJCQkJLyogc28gZmFyIGVtcHR5ICovCi0gIHswLCAwLCAwfQotfTsKLQotI2RlZmluZSBJTkQoeCx5KQkoKCh4KTw8MikrKHkpKQotCi0vKiB0aG9zZSBhcmUgaW5kZXgncyB0byByZWxheCBncm91cHMgaW4gbWRfcmVsYXhfdGFibGUgaWUgaXQgbXVzdCBiZQotICAgbXVsdGlwbGllZCBieSA0IHRvIHBvaW50IGF0IGEgZ3JvdXAgc3RhcnQuIFZpeiBJTkQoeCx5KSBTZSBmdW5jdGlvbgotICAgcmVsYXhfc2VnbWVudCBpbiB3cml0ZS5jIGZvciBtb3JlIGluZm8gKi8KLQotI2RlZmluZSBCUkFOQ0gJCTEKLSNkZWZpbmUgUENSRUwJCTIKLQotLyogdGhvc2UgYXJlIGluZGV4J3MgdG8gZW50cmllcyBpbiBhIHJlbGF4IGdyb3VwICovCi0KLSNkZWZpbmUgQllURQkJMAotI2RlZmluZSBXT1JECQkxCi0jZGVmaW5lIERPVUJMRQkJMgotI2RlZmluZSBVTkRFRiAgICAgICAgICAgMwotLyogVGhvc2UgbGltaXRzIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRpc3BsYWNlbWVudCBzdGFydCBpbiBtZW1vcnkuCi0gICBUaGUgbnMzMmsgdXNlcyB0aGUgYmVnaW5pbmcgb2YgdGhlIGluc3RydWN0aW9uIGFzIGRpc3BsYWNlbWVudAotICAgYmFzZS4gIFRoaXMgdHlwZSBvZiBkaXNwbGFjZW1lbnRzIGNvdWxkIGJlIGhhbmRsZWQgaGVyZSBieSBtb3ZpbmcKLSAgIHRoZSBsaW1pdCB3aW5kb3cgdXAgb3IgZG93bi4gSSBjaG9vc2UgdG8gdXNlIGFuIGludGVybmFsCi0gICBkaXNwbGFjZW1lbnQgYmFzZS1hZGp1c3QgYXMgdGhlcmUgYXJlIG90aGVyIHJvdXRpbmVzIHRoYXQgbXVzdAotICAgY29uc2lkZXIgdGhpcy4gQWxzbywgYXMgd2UgaGF2ZSB0d28gdmFyaW91cyBvZmZzZXQtYWRqdXN0cyBpbiB0aGUKLSAgIG5zMzJrIChhY2IgdmVyc3VzIGJyL2Jycy9qc3IvYmNvbmQpLCB0d28gc2V0IG9mIGxpbWl0cyB3b3VsZCBoYXZlCi0gICBoYWQgdG8gYmUgdXNlZC4gIE5vdyB3ZSBkb250IGhhdmUgdG8gdGhpbmsgYWJvdXQgdGhhdC4gKi8KLQotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsoNjMpLCAoLTY0KSwgMSwgSU5EIChCUkFOQ0gsIFdPUkQpfSwKLSAgeyg4MTkyKSwgKC04MTkyKSwgMiwgSU5EIChCUkFOQ0gsIERPVUJMRSl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfQotfTsKLQotLyogQXJyYXkgdXNlZCB0byB0ZXN0IGlmIG1vZGUgY29udGFpbnMgZGlzcGxhY2VtZW50cy4KLSAgIFZhbHVlIGlzIHRydWUgaWYgbW9kZSBjb250YWlucyBkaXNwbGFjZW1lbnQuICovCi0KLWNoYXIgZGlzcF90ZXN0W10gPQotezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLAotIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OwotCi0vKiBBcnJheSB1c2VkIHRvIGNhbGN1bGF0ZSBtYXggc2l6ZSBvZiBkaXNwbGFjZW1lbnRzICovCi0KLWNoYXIgZGlzcF9zaXplW10gPQotezQsIDEsIDIsIDAsIDR9OwotDAotc3RhdGljIHZvaWQgZXZhbHVhdGVfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqIHJlc3VsdFAsIGNoYXIgKnB0cikpOwotc3RhdGljIHZvaWQgbWRfbnVtYmVyX3RvX2Rpc3AgUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIHZhbCwgaW50IG4pKTsKLXN0YXRpYyB2b2lkIG1kX251bWJlcl90b19pbW0gUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIHZhbCwgaW50IG4pKTsKLQotLyogUGFyc2VzIGEgZ2VuZXJhbCBvcGVyYW5kIGludG8gYW4gYWRkcmVzc2luZ21vZGUgc3RydWN0Ci0KLSAgIGluOiAgcG9pbnRlciBhdCBvcGVyYW5kIGluIGFzY2lpIGZvcm0KLSAgIHBvaW50ZXIgYXQgYWRkcl9tb2RlIHN0cnVjdCBmb3IgcmVzdWx0Ci0gICB0aGUgbGV2ZWwgb2YgcmVjdXJzaW9uLiAoYWx3YXlzIDAgb3IgMSkKLQotICAgb3V0OiBkYXRhIGluIGFkZHJfbW9kZSBzdHJ1Y3QKLSAgICovCi1pbnQKLWFkZHJfbW9kZSAob3BlcmFuZCwgYWRkcl9tb2RlUCwgcmVjdXJzaXZlX2xldmVsKQotICAgICBjaGFyICpvcGVyYW5kOwotICAgICByZWdpc3RlciBhZGRyX21vZGVTICphZGRyX21vZGVQOwotICAgICBpbnQgcmVjdXJzaXZlX2xldmVsOwotewotICByZWdpc3RlciBjaGFyICpzdHI7Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciBpbnQgc3RybDsKLSAgcmVnaXN0ZXIgaW50IG1vZGU7Ci0gIGludCBqOwotICBtb2RlID0gREVGQVVMVDsJCS8qIGRlZmF1bHQgKi8KLSAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSAwOwkvKiB3aHkgbm90ICovCi0gIGFkZHJfbW9kZVAtPnNjYWxlZF9yZWcgPSAwOwkvKiBpZiAwLCBub3Qgc2NhbGVkIGluZGV4ICovCi0gIGFkZHJfbW9kZVAtPmZsb2F0X2ZsYWcgPSAwOwotICBhZGRyX21vZGVQLT5hbV9zaXplID0gMDsKLSAgYWRkcl9tb2RlUC0+aW1fZGlzcCA9IDA7Ci0gIGFkZHJfbW9kZVAtPnBjcmVsID0gMDsJLyogbm90IHNldCBpbiB0aGlzIGZ1bmN0aW9uICovCi0gIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4WzBdID0gMDsKLSAgYWRkcl9tb2RlUC0+ZGlzcF9zdWZmaXhbMV0gPSAwOwotICBhZGRyX21vZGVQLT5kaXNwWzBdID0gTlVMTDsKLSAgYWRkcl9tb2RlUC0+ZGlzcFsxXSA9IE5VTEw7Ci0gIHN0ciA9IG9wZXJhbmQ7Ci0gIGlmIChzdHJbMF0gPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0JCQkJLyogd2UgZG9uJ3Qgd2FudCB0aGlzICovCi0gIHN0cmwgPSBzdHJsZW4gKHN0cik7Ci0gIHN3aXRjaCAoc3RyWzBdKQotICAgIHsKLSAgICAgIC8qIHRoZSBmb2xsb3dpbmcgdGhyZWUgY2FzZSBzdGF0ZW1lbnRzIGNvbnRyb2xzIHRoZSBtb2RlLWNoYXJzCi0JIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGVkIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVtICovCi0jaWZkZWYgQUJTT0xVVEVfUFJFRklYCi0gICAgY2FzZSBBQlNPTFVURV9QUkVGSVg6Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSA9PSAnXScpCi0JYnJlYWs7Ci0gICAgICBhZGRyX21vZGVQLT5tb2RlID0gMjE7CS8qIGFic29sdXRlICovCi0gICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgMTsKLSAgICAgIHJldHVybiAoLTEpOwotI2VuZGlmCi0jaWZkZWYgSU1NRURJQVRFX1BSRUZJWAotICAgIGNhc2UgSU1NRURJQVRFX1BSRUZJWDoKLSAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICddJykKLQlicmVhazsKLSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSAyMDsJLyogaW1tZWRpYXRlICovCi0gICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgMTsKLSAgICAgIHJldHVybiAoLTEpOwotI2VuZGlmCi0gICAgY2FzZSAnLic6Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSAhPSAnXScpCi0JewotCSAgc3dpdGNoIChzdHJbMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnLSc6Ci0JICAgIGNhc2UgJysnOgotCSAgICAgIGlmIChzdHJbMl0gIT0gJ1wwMDAnKQotCQl7Ci0JCSAgYWRkcl9tb2RlUC0+bW9kZSA9IDI3OwkvKiBwYy1yZWxhdGl2ICovCi0JCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDI7Ci0JCSAgcmV0dXJuICgtMSk7Ci0JCX0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc193YXJuIChfKCJJbnZhbGlkIHN5bnRheCBpbiBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUiKSk7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2UnOgotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gIT0gJ10nKQotCXsKLQkgIGlmICgoIXN0cm5jbXAgKHN0ciwgImV4dCgiLCA0KSkgJiYgc3RybCA+IDcpCi0JICAgIHsJCQkJLyogZXh0ZXJuYWwgKi8KLQkgICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgNDsKLQkgICAgICBpID0gMDsKLQkgICAgICBqID0gMjsKLQkgICAgICBkbwotCQl7CQkJLyogZGlzcFswXSdzIHRlcm1pbmF0aW9uIHBvaW50ICovCi0JCSAgaiArPSAxOwotCQkgIGlmIChzdHJbal0gPT0gJygnKQotCQkgICAgaSsrOwotCQkgIGlmIChzdHJbal0gPT0gJyknKQotCQkgICAgaS0tOwotCQl9Ci0JICAgICAgd2hpbGUgKGogPCBzdHJsICYmIGkgIT0gMCk7Ci0JICAgICAgaWYgKGkgIT0gMCB8fCAhKHN0cltqICsgMV0gPT0gJy0nIHx8IHN0cltqICsgMV0gPT0gJysnKSkKLQkJewotCQkgIGFzX3dhcm4gKF8oIkludmFsaWQgc3ludGF4IGluIEV4dGVybmFsIGFkZHJlc3NpbmcgbW9kZSIpKTsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgICAgc3RyW2pdID0gJ1wwMDAnOwkJLyogbnVsbCB0ZXJtaW5hdGUgZGlzcFswXSAqLwotCSAgICAgIGFkZHJfbW9kZVAtPmRpc3BbMV0gPSBzdHIgKyBqICsgMjsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gMjI7Ci0JICAgICAgcmV0dXJuICgtMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OjsKLSAgICB9Ci0gIHN0cmwgPSBzdHJsZW4gKHN0cik7Ci0gIHN3aXRjaCAoc3RybCkKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgc3dpdGNoIChzdHJbMF0pCi0JewotCWNhc2UgJ2YnOgotCSAgYWRkcl9tb2RlUC0+ZmxvYXRfZmxhZyA9IDE7Ci0JY2FzZSAncic6Ci0JICBpZiAoc3RyWzFdID49ICcwJyAmJiBzdHJbMV0gPCAnOCcpCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gc3RyWzFdIC0gJzAnOwotCSAgICAgIHJldHVybiAoLTEpOwotCSAgICB9Ci0JfQotICAgIGNhc2UgMzoKLSAgICAgIGlmICghc3RybmNtcCAoc3RyLCAidG9zIiwgMykpCi0JewotCSAgYWRkcl9tb2RlUC0+bW9kZSA9IDIzOwkvKiBUb3BPZlN0YWNrICovCi0JICByZXR1cm4gKC0xKTsKLQl9Ci0gICAgZGVmYXVsdDo7Ci0gICAgfQotICBpZiAoc3RybCA+IDQpCi0gICAgewotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gPT0gJyknKQotCXsKLQkgIGlmIChzdHJbc3RybCAtIDJdID09ICcpJykKLQkgICAgewotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNV0sICIoZnAiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAxNjsJCS8qIE1lbW9yeSBSZWxhdGl2ZSAqLwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA1XSwgIihzcCIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDE3OwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA1XSwgIihzYiIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDE4OwotCQl9Ci0JICAgICAgaWYgKG1vZGUgIT0gREVGQVVMVCkKLQkJewkJCS8qIG1lbW9yeSByZWxhdGl2ZSAqLwotCQkgIGFkZHJfbW9kZVAtPm1vZGUgPSBtb2RlOwotCQkgIGogPSBzdHJsIC0gNTsJCS8qIHRlbXAgZm9yIGVuZCBvZiBkaXNwWzBdICovCi0JCSAgaSA9IDA7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgc3RybCAtPSAxOwotCQkgICAgICBpZiAoc3RyW3N0cmxdID09ICcpJykKLQkJCWkrKzsKLQkJICAgICAgaWYgKHN0cltzdHJsXSA9PSAnKCcpCi0JCQlpLS07Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKHN0cmwgPiAtMSAmJiBpICE9IDApOwotCQkgIGlmIChpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgc3ludGF4IGluIE1lbW9yeSBSZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUiKSk7Ci0JCSAgICAgIHJldHVybiAoMCk7Ci0JCSAgICB9Ci0JCSAgYWRkcl9tb2RlUC0+ZGlzcFsxXSA9IHN0cjsKLQkJICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgc3RybCArIDE7Ci0JCSAgc3RyW2pdID0gJ1wwMDAnOwkvKiBudWxsIHRlcm1pbmF0ZSBkaXNwWzBdICovCi0JCSAgc3RyW3N0cmxdID0gJ1wwMDAnOwkvKiBudWxsIHRlcm1pbmF0ZSBkaXNwWzFdICovCi0JCSAgcmV0dXJuICgtMSk7Ci0JCX0KLQkgICAgfQotCSAgc3dpdGNoIChzdHJbc3RybCAtIDNdKQotCSAgICB7Ci0JICAgIGNhc2UgJ3InOgotCSAgICBjYXNlICdSJzoKLQkgICAgICBpZiAoc3RyW3N0cmwgLSAyXSA+PSAnMCcKLQkJICAmJiBzdHJbc3RybCAtIDJdIDwgJzgnCi0JCSAgJiYgc3RyW3N0cmwgLSA0XSA9PSAnKCcpCi0JCXsKLQkJICBhZGRyX21vZGVQLT5tb2RlID0gc3RyW3N0cmwgLSAyXSAtICcwJyArIDg7Ci0JCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0cjsKLQkJICBzdHJbc3RybCAtIDRdID0gMDsKLQkJICByZXR1cm4gKC0xKTsJCS8qIHJlZyByZWwgKi8KLQkJfQotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoZnAiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNDsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoc3AiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNTsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoc2IiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNjsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIocGMiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNzsKLQkJfQotCSAgICAgIGlmIChtb2RlICE9IERFRkFVTFQpCi0JCXsKLQkJICBhZGRyX21vZGVQLT5tb2RlID0gbW9kZTsKLQkJICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyOwotCQkgIHN0cltzdHJsIC0gNF0gPSAnXDAnOwotCQkgIHJldHVybiAoLTEpOwkJLyogbWVtb3J5IHNwYWNlICovCi0JCX0KLQkgICAgfQotCX0KLSAgICAgIC8qIG5vIHRyYWlsaW5nICcpJyBkbyB3ZSBoYXZlIGEgJ10nID8gKi8KLSAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICddJykKLQl7Ci0JICBzd2l0Y2ggKHN0cltzdHJsIC0gMl0pCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgbW9kZSA9IDI4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkgICAgICBtb2RlID0gMjk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIG1vZGUgPSAzMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncSc6Ci0JICAgICAgbW9kZSA9IDMxOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OjsKLQkgICAgICBhc193YXJuIChfKCJJbnZhbGlkIHNjYWxlZC1pbmRleGVkIG1vZGUsIHVzZSAoYix3LGQscSkiKSk7Ci0JICAgICAgaWYgKHN0cltzdHJsIC0gM10gIT0gJzonIHx8IHN0cltzdHJsIC0gNl0gIT0gJ1snCi0JCSAgfHwgc3RyW3N0cmwgLSA1XSA9PSAncicgfHwgc3RyW3N0cmwgLSA0XSA8ICcwJwotCQkgIHx8IHN0cltzdHJsIC0gNF0gPiAnNycpCi0JCXsKLQkJICBhc193YXJuIChfKCJTeW50YXggaW4gc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIFtSbjptXSB3aGVyZSBuPVswLi43XSBtPXtiLHcsZCxxfSIpKTsKLQkJfQotCSAgICB9IC8qIHNjYWxlZCBpbmRleCAqLwotCSAgewotCSAgICBpZiAocmVjdXJzaXZlX2xldmVsID4gMCkKLQkgICAgICB7Ci0JCWFzX3dhcm4gKF8oIlNjYWxlZC1pbmRleGVkIGFkZHJlc3NpbmcgbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZC1pbmRleCIpKTsKLQkJcmV0dXJuICgwKTsKLQkgICAgICB9Ci0JICAgIGFkZHJfbW9kZVAtPmFtX3NpemUgKz0gMTsJLyogc2NhbGVkIGluZGV4IGJ5dGUgKi8KLQkgICAgaiA9IHN0cltzdHJsIC0gNF0gLSAnMCc7CS8qIHN0b3JlIHRlbXBvcmFyeSAqLwotCSAgICBzdHJbc3RybCAtIDZdID0gJ1wwMDAnOwkvKiBudWxsdGVybWluYXRlIGZvciByZWN1cnNpdmUgY2FsbCAqLwotCSAgICBpID0gYWRkcl9tb2RlIChzdHIsIGFkZHJfbW9kZVAsIDEpOwotCSAgICBpZiAoIWkgfHwgYWRkcl9tb2RlUC0+bW9kZSA9PSAyMCkKLQkgICAgICB7Ci0JCWFzX3dhcm4gKF8oIkludmFsaWQgb3IgaWxsZWdhbCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiKSk7Ci0JCXJldHVybiAoMCk7Ci0JICAgICAgfQotCSAgICBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9IGFkZHJfbW9kZVAtPm1vZGU7CS8qIHN0b3JlIHRoZSBpbmZlcmlvcgotCQkJCQkJCSAgIG1vZGUgKi8KLQkgICAgYWRkcl9tb2RlUC0+bW9kZSA9IG1vZGU7Ci0JICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9yZWcgPSBqICsgMTsKLQkgICAgcmV0dXJuICgtMSk7Ci0JICB9Ci0JfQotICAgIH0KLSAgYWRkcl9tb2RlUC0+bW9kZSA9IERFRkFVTFQ7CS8qIGRlZmF1bHQgdG8gd2hhdGV2ZXIgKi8KLSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0cjsKLSAgcmV0dXJuICgtMSk7Ci19Ci0MCi0vKiBwdHIgcG9pbnRzIGF0IHN0cmluZyBhZGRyX21vZGVQIHBvaW50cyBhdCBzdHJ1Y3Qgd2l0aCByZXN1bHQgVGhpcwotICAgcm91dGluZSBjYWxscyBhZGRyX21vZGUgdG8gZGV0ZXJtaW5lIHRoZSBnZW5lcmFsIGFkZHIubW9kZSBvZiB0aGUKLSAgIG9wZXJhbmQuIFdoZW4gdGhpcyBpcyByZWFkeSBpdCBwYXJzZXMgdGhlIGRpc3BsYWNlbWVudHMgZm9yIHNpemUKLSAgIHNwZWNpZnlpbmcgc3VmZml4ZXMgYW5kIGRldGVybWluZXMgc2l6ZSBvZiBpbW1lZGlhdGUgbW9kZSB2aWEKLSAgIG5zMzJrLW9wY29kZS4gIEFsc28gYnVpbGRzIGluZGV4IGJ5dGVzIGlmIG5lZWRlZC4gICovCi1pbnQKLWdldF9hZGRyX21vZGUgKHB0ciwgYWRkcl9tb2RlUCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyX21vZGVTICphZGRyX21vZGVQOwotewotICBpbnQgdG1wOwotICBhZGRyX21vZGUgKHB0ciwgYWRkcl9tb2RlUCwgMCk7Ci0gIGlmIChhZGRyX21vZGVQLT5tb2RlID09IERFRkFVTFQgfHwgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPT0gLTEpCi0gICAgewotICAgICAgLyogcmVzb2x2ZSBhbWJpZ2lvdXMgb3BlcmFuZHMsIHRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZgotCSBvbmUgdXNlcyBzdGFuZGFyZCBOU0Mgb3BlcmFuZCBzeW50YXguIEJ1dCB0aGUgc2VxdWVudAotCSBjb21waWxlciBkb2Vzbid0ISEhICBUaGlzIGZpbmRzIGEgcHJvcGVyIGFkZHJlc3NpbmdpbmcgbW9kZQotCSBpZiBpdCBpcyBpbXBsaWNpdGx5IHN0YXRlZC4gU2VlIG5zMzJrLW9wY29kZS5oICovCi0gICAgICAodm9pZCkgZXZhbHVhdGVfZXhwciAoJmV4cHJQLCBwdHIpOyAvKiB0aGlzIGNhbGwgdGFrZXMgdGltZSBTaWdoISAqLwotICAgICAgaWYgKGFkZHJfbW9kZVAtPm1vZGUgPT0gREVGQVVMVCkKLQl7Ci0JICBpZiAoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IGRlc2MtPmRlZmF1bHRfbW9kZWw7IC8qIHdlIGhhdmUgYSBsYWJlbCAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlYzsgLyogd2UgaGF2ZSBhIGNvbnN0YW50ICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGV4cHJQLlhfYWRkX3N5bWJvbCB8fCBleHByUC5YX29wX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlbDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSBkZXNjLT5kZWZhdWx0X21vZGVjOwotCSAgICB9Ci0JfQotICAgICAgLyogbXVzdCBwdXQgdGhpcyBtZXNzIGRvd24gaW4gYWRkcl9tb2RlIHRvIGhhbmRsZSB0aGUgc2NhbGVkCi0gICAgICAgICBjYXNlIGJldHRlciAqLwotICAgIH0KLSAgLyogSXQgYXBwZWFycyBhcyB0aGUgc2VxdWVudCBjb21waWxlciB3YW50cyBhbiBhYnNvbHV0ZSB3aGVuIHdlIGhhdmUKLSAgICAgYSBsYWJlbCB3aXRob3V0IEAuIENvbnN0YW50cyBiZWNvbWVzIGltbWVkaWF0ZXMgYmVzaWRlcyB0aGUgYWRkcgotICAgICBjYXNlLiAgVGhpbmsgaXQgZG9lcyBzbyB3aXRoIGxvY2FsIGxhYmVscyB0b28sIG5vdCBvcHRpbXVtLCBwY3JlbAotICAgICBpcyBiZXR0ZXIuICBXaGVuIEkgaGF2ZSB0aW1lIEkgd2lsbCBtYWtlIGdhcyBjaGVjayB0aGlzIGFuZAotICAgICBzZWxlY3QgcGNyZWwgd2hlbiBwb3NzaWJsZSBBY3R1YWxseSB0aGF0IGlzIHRyaXZpYWwuICAqLwotICBpZiAodG1wID0gYWRkcl9tb2RlUC0+c2NhbGVkX3JlZykKLSAgICB7CQkJCS8qIGJ1aWxkIGluZGV4Ynl0ZSAqLwotICAgICAgdG1wLS07CQkJLyogcmVtZW1iZXIgcmVnbnVtYmVyIGNvbWVzIGluY3JlbWVudGVkIGZvcgotCQkJCSAgIGZsYWdwdXJwb3NlICovCi0gICAgICB0bXAgfD0gYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPDwgMzsKLSAgICAgIGFkZHJfbW9kZVAtPmluZGV4X2J5dGUgPSAoY2hhcikgdG1wOwotICAgICAgYWRkcl9tb2RlUC0+YW1fc2l6ZSArPSAxOwotICAgIH0KLSAgaWYgKGRpc3BfdGVzdFthZGRyX21vZGVQLT5tb2RlXSkKLSAgICB7CQkJCS8qIHRoZXJlIHdhcyBhIGRpc3BsYWNlbWVudCwgcHJvYmUgZm9yIGxlbmd0aAotCQkJCSAgIHNwZWNpZnlpbmcgc3VmZml4ICovCi0gICAgICB7Ci0JcmVnaXN0ZXIgY2hhciBjOwotCXJlZ2lzdGVyIGNoYXIgc3VmZml4OwotCXJlZ2lzdGVyIGNoYXIgc3VmZml4X3N1YjsKLQlyZWdpc3RlciBpbnQgaTsKLQlyZWdpc3RlciBjaGFyICp0b1A7Ci0JcmVnaXN0ZXIgY2hhciAqZnJvbVA7Ci0KLQlhZGRyX21vZGVQLT5wY3JlbCA9IDA7Ci0JaWYgKGRpc3BfdGVzdFthZGRyX21vZGVQLT5tb2RlXSkKLQkgIHsJCQkvKiB0aGVyZSBpcyBhIGRpc3BsYWNlbWVudCAqLwotCSAgICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSAyNyB8fCBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9PSAyNykKLQkgICAgICB7CQkJLyogZG8gd2UgaGF2ZSBwY3JlbC4gbW9kZSAqLwotCQlhZGRyX21vZGVQLT5wY3JlbCA9IDE7Ci0JICAgICAgfQotCSAgICBhZGRyX21vZGVQLT5pbV9kaXNwID0gMTsKLQkgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLQkgICAgICB7Ci0JCXN1ZmZpeF9zdWIgPSBzdWZmaXggPSAwOwotCQlpZiAodG9QID0gYWRkcl9tb2RlUC0+ZGlzcFtpXSkKLQkJICB7CQkvKiBzdWZmaXggb2YgZXhwcmVzc2lvbiwgdGhlIGxhcmdlc3Qgc2l6ZQotCQkJCSAgIHJ1bGVzICovCi0JCSAgICBmcm9tUCA9IHRvUDsKLQkJICAgIHdoaWxlIChjID0gKmZyb21QKyspCi0JCSAgICAgIHsKLQkJCSp0b1ArKyA9IGM7Ci0JCQlpZiAoYyA9PSAnOicpCi0JCQkgIHsKLQkJCSAgICBzd2l0Y2ggKCpmcm9tUCkKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgJ1wwJzoKLQkJCQlhc193YXJuIChfKCJQcmVtYXR1cmUgZW5kIG9mIHN1ZmZpeCAtLSBEZWZhdWx0aW5nIHRvIGQiKSk7Ci0JCQkJc3VmZml4ID0gNDsKLQkJCQljb250aW51ZTsKLQkJCSAgICAgIGNhc2UgJ2InOgotCQkJCXN1ZmZpeF9zdWIgPSAxOwotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAndyc6Ci0JCQkJc3VmZml4X3N1YiA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICdkJzoKLQkJCQlzdWZmaXhfc3ViID0gNDsKLQkJCQlicmVhazsKLQkJCSAgICAgIGRlZmF1bHQ6Ci0JCQkJYXNfd2FybiAoXygiQmFkIHN1ZmZpeCBhZnRlciAnOicgdXNlIHtifHd8ZH0gRGVmYXVsdGluZyB0byBkIikpOwotCQkJCXN1ZmZpeCA9IDQ7Ci0JCQkgICAgICB9Ci0JCQkgICAgZnJvbVArKzsKLQkJCSAgICB0b1AtLTsJLyogU28gd2Ugd3JpdGUgb3ZlciB0aGUgJzonICovCi0JCQkgICAgaWYgKHN1ZmZpeCA8IHN1ZmZpeF9zdWIpCi0JCQkgICAgICBzdWZmaXggPSBzdWZmaXhfc3ViOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgICp0b1AgPSAnXDAnOy8qIHRlcm1pbmF0ZSBwcm9wZXJseSAqLwotCQkgICAgYWRkcl9tb2RlUC0+ZGlzcF9zdWZmaXhbaV0gPSBzdWZmaXg7Ci0JCSAgICBhZGRyX21vZGVQLT5hbV9zaXplICs9IHN1ZmZpeCA/IHN1ZmZpeCA6IDQ7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSAyMCkKLQl7CQkJLyogbG9vayBpbiBuczMya19vcGNvZGUgZm9yIHNpemUgKi8KLQkgIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4WzBdID0gYWRkcl9tb2RlUC0+YW1fc2l6ZSA9IGRlc2MtPmltX3NpemU7Ci0JICBhZGRyX21vZGVQLT5pbV9kaXNwID0gMDsKLQl9Ci0gICAgfQotICByZXR1cm4gYWRkcl9tb2RlUC0+bW9kZTsKLX0KLQotCi0vKiByZWFkIGFuIG9wdGlvbmxpc3QgKi8KLXZvaWQKLW9wdGxpc3QgKHN0ciwgb3B0aW9uUCwgZGVmYXVsdF9tYXApCi0gICAgIGNoYXIgKnN0cjsJCQkvKiB0aGUgc3RyaW5nIHRvIGV4dHJhY3Qgb3B0aW9ucyBmcm9tICovCi0gICAgIHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7CS8qIGhvdyB0byBzZWFyY2ggdGhlIHN0cmluZyAqLwotICAgICB1bnNpZ25lZCBsb25nICpkZWZhdWx0X21hcDsJLyogZGVmYXVsdCBwYXR0ZXJuIGFuZCBvdXRwdXQgKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGksIGosIGssIHN0cmxlbjEsIHN0cmxlbjI7Ci0gIHJlZ2lzdGVyIGNoYXIgKnBhdHRlcm5QLCAqc3RyUDsKLSAgc3RybGVuMSA9IHN0cmxlbiAoc3RyKTsKLSAgaWYgKHN0cmxlbjEgPCAxKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJWZXJ5IHNob3J0IGluc3RyIHRvIG9wdGlvbiwgaWUgeW91IGNhbid0IGRvIGl0IG9uIGEgTlVMTHN0ciIpKTsKLSAgICB9Ci0gIGZvciAoaSA9IDA7IG9wdGlvblBbaV0ucGF0dGVybiAhPSAwOyBpKyspCi0gICAgewotICAgICAgc3RybGVuMiA9IHN0cmxlbiAob3B0aW9uUFtpXS5wYXR0ZXJuKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJsZW4xOyBqKyspCi0JewotCSAgcGF0dGVyblAgPSBvcHRpb25QW2ldLnBhdHRlcm47Ci0JICBzdHJQID0gJnN0cltqXTsKLQkgIGZvciAoayA9IDA7IGsgPCBzdHJsZW4yOyBrKyspCi0JICAgIHsKLQkgICAgICBpZiAoKihzdHJQKyspICE9ICoocGF0dGVyblArKykpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoayA9PSBzdHJsZW4yKQotCSAgICB7CQkJLyogbWF0Y2ggKi8KLQkgICAgICAqZGVmYXVsdF9tYXAgfD0gb3B0aW9uUFtpXS5vcjsKLQkgICAgICAqZGVmYXVsdF9tYXAgJj0gb3B0aW9uUFtpXS5hbmQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBzZWFyY2ggc3RydWN0IGZvciBzeW1ib2xzCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBzaG9ydCBpbnRlZ2VyIGZvcm0gb2YgcmVnIG5hbWVzIGluCi0gICB0aGUgaW5zdHJ1Y3Rpb25zIGxtciwgc21yLCBscHIsIHNwciByZXR1cm4gdHJ1ZSBpZiBzdHIgaXMgZm91bmQgaW4KLSAgIGxpc3QgKi8KLQotaW50Ci1saXN0X3NlYXJjaCAoc3RyLCBvcHRpb25QLCBkZWZhdWx0X21hcCkKLSAgICAgY2hhciAqc3RyOwkJCQkvKiB0aGUgc3RyaW5nIHRvIG1hdGNoICovCi0gICAgIHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7CS8qIGxpc3QgdG8gc2VhcmNoICovCi0gICAgIHVuc2lnbmVkIGxvbmcgKmRlZmF1bHRfbWFwOwkvKiBkZWZhdWx0IHBhdHRlcm4gYW5kIG91dHB1dCAqLwotewotICByZWdpc3RlciBpbnQgaTsKLSAgZm9yIChpID0gMDsgb3B0aW9uUFtpXS5wYXR0ZXJuICE9IDA7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXN0cm5jbXAgKG9wdGlvblBbaV0ucGF0dGVybiwgc3RyLCAyMCkpCi0JewkJCQkvKiB1c2Ugc3RybmNtcCB0byBiZSBzYWZlICovCi0JICAqZGVmYXVsdF9tYXAgfD0gb3B0aW9uUFtpXS5vcjsKLQkgICpkZWZhdWx0X21hcCAmPSBvcHRpb25QW2ldLmFuZDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBhc193YXJuIChfKCJObyBzdWNoIGVudHJ5IGluIGxpc3QuIChjcHUvbW11IHJlZ2lzdGVyKSIpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ldmFsdWF0ZV9leHByIChyZXN1bHRQLCBwdHIpCi0gICAgIGV4cHJlc3Npb25TICpyZXN1bHRQOwotICAgICBjaGFyICpwdHI7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnRtcF9saW5lOwotCi0gIHRtcF9saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwdHI7Ci0gIGV4cHJlc3Npb24gKCZleHByUCk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHRtcF9saW5lOwotfQotDAotLyogQ29udmVydCBvcGVyYW5kcyB0byBpaWYtZm9ybWF0IGFuZCBhZGRzIGJpdGZpZWxkcyB0byB0aGUgb3Bjb2RlLgotICAgT3BlcmFuZHMgYXJlIHBhcnNlZCBpbiBzdWNoIGFuIG9yZGVyIHRoYXQgdGhlIG9wY29kZSBpcyB1cGRhdGVkIGZyb20KLSAgIGl0cyBtb3N0IHNpZ25pZmljYW50IGJpdCwgdGhhdCBpcyB3aGVuIHRoZSBvcGVyYW5kIG5lZWQgdG8gYWx0ZXIgdGhlCi0gICBvcGNvZGUuCi0gICBCZSBjYXJlZnVsbCBub3QgdG8gcHV0IHRvIG9iamVjdHMgaW4gdGhlIHNhbWUgaWlmLXNsb3QuCi0gICAqLwotCi12b2lkCi1lbmNvZGVfb3BlcmFuZCAoYXJnYywgYXJndiwgb3BlcmFuZHNQLCBzdWZmaXhQLCBpbV9zaXplLCBvcGNvZGVfYml0X3B0cikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICpvcGVyYW5kc1A7Ci0gICAgIGNoYXIgKnN1ZmZpeFA7Ci0gICAgIGNoYXIgaW1fc2l6ZTsKLSAgICAgY2hhciBvcGNvZGVfYml0X3B0cjsKLXsKLSAgcmVnaXN0ZXIgaW50IGksIGo7Ci0gIGNoYXIgZDsKLSAgaW50IHBjcmVsLCB0bXAsIGIsIGxvb3AsIHBjcmVsX2FkanVzdDsKLSAgZm9yIChsb29wID0gMDsgbG9vcCA8IGFyZ2M7IGxvb3ArKykKLSAgICB7Ci0gICAgICBpID0gb3BlcmFuZHNQW2xvb3AgPDwgMV0gLSAnMSc7CS8qIHdoYXQgb3BlcmFuZCBhcmUgd2Ugc3VwcG9zZWQKLQkJCQkJICAgdG8gd29yayBvbiAqLwotICAgICAgaWYgKGkgPiAzKQotCWFzX2ZhdGFsIChfKCJJbnRlcm5hbCBjb25zaXN0ZW5jeSBlcnJvci4gIGNoZWNrIG5zMzJrLW9wY29kZS5oIikpOwotICAgICAgcGNyZWwgPSAwOwotICAgICAgcGNyZWxfYWRqdXN0ID0gMDsKLSAgICAgIHRtcCA9IDA7Ci0gICAgICBzd2l0Y2ggKChkID0gb3BlcmFuZHNQWyhsb29wIDw8IDEpICsgMV0pKQotCXsKLQljYXNlICdmJzoJCS8qIG9wZXJhbmQgb2Ygc2ZzciB0dXJucyBvdXQgdG8gYmUgYSBuYXN0eQotCQkJCSAgIHNwZWNpYWxjYXNlICovCi0JICBvcGNvZGVfYml0X3B0ciAtPSA1OwotCWNhc2UgJ1onOgkJLyogZmxvYXQgbm90IGltbWVkaWF0ZSAqLwotCWNhc2UgJ0YnOgkJLyogMzIgYml0IGZsb2F0CWdlbmVyYWwgZm9ybSAqLwotCWNhc2UgJ0wnOgkJLyogNjQgYml0IGZsb2F0CSovCi0JY2FzZSAnSSc6CQkvKiBpbnRlZ2VyIG5vdCBpbW1lZGlhdGUgKi8KLQljYXNlICdCJzoJCS8qIGJ5dGUJICovCi0JY2FzZSAnVyc6CQkvKiB3b3JkCSAqLwotCWNhc2UgJ0QnOgkJLyogZG91YmxlLXdvcmQJKi8KLQljYXNlICdBJzoJCS8qIGRvdWJsZS13b3JkCWdlbi1hZGRyZXNzLWZvcm0gaWUgbm8gcmVncwotCQkJCSAgIGFsbG93ZWQgKi8KLQkgIGdldF9hZGRyX21vZGUgKGFyZ3ZbaV0sICZhZGRyX21vZGVQKTsKLQkgIGlmKChhZGRyX21vZGVQLm1vZGUgPT0gMjApICYmCi0JICAgICAoZCA9PSAnSScgfHwgZCA9PSAnWicgfHwgZCA9PSAnQScpKSB7Ci0JICAgIGFzX2ZhdGFsKGQgPT0gJ0EnPyBfKCJBZGRyZXNzIG9mIGltbWVkaWF0ZSBvcGVyYW5kIik6Ci0JCSAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgd3JpdGUgb3BlcmFuZC4iKSk7Ci0JICB9Ci0KLQkgIGlmIChvcGNvZGVfYml0X3B0ciA9PSBkZXNjLT5vcGNvZGVfc2l6ZSkKLQkgICAgYiA9IDQ7Ci0JICBlbHNlCi0JICAgIGIgPSA2OwotCSAgZm9yIChqID0gYjsgaiA8IChiICsgMik7IGorKykKLQkgICAgewotCSAgICAgIGlmIChhZGRyX21vZGVQLmRpc3BbaiAtIGJdKQotCQl7Ci0JCSAgSUlGIChqLAotCQkgICAgICAgMiwKLQkJICAgICAgIGFkZHJfbW9kZVAuZGlzcF9zdWZmaXhbaiAtIGJdLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHJfbW9kZVAuZGlzcFtqIC0gYl0sCi0JCSAgICAgICAwLAotCQkgICAgICAgYWRkcl9tb2RlUC5wY3JlbCwKLQkJICAgICAgIGlpZi5pbnN0cl9zaXplLAotCQkgICAgICAgYWRkcl9tb2RlUC5pbV9kaXNwLAotCQkgICAgICAgSU5EIChCUkFOQ0gsIEJZVEUpLAotCQkgICAgICAgTlVMTCwKLQkJICAgICAgIChhZGRyX21vZGVQLnNjYWxlZF9yZWcgPyBhZGRyX21vZGVQLnNjYWxlZF9tb2RlCi0JCQk6IGFkZHJfbW9kZVAubW9kZSksCi0JCSAgICAgICAwKTsKLQkJfQotCSAgICB9Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA1OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9ICgobG9uZykgYWRkcl9tb2RlUC5tb2RlKSA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGlmIChhZGRyX21vZGVQLnNjYWxlZF9yZWcpCi0JICAgIHsKLQkgICAgICBqID0gYiAvIDI7Ci0JICAgICAgSUlGIChqLCAxLCAxLCAodW5zaWduZWQgbG9uZykgYWRkcl9tb2RlUC5pbmRleF9ieXRlLAotCQkgICAwLCAwLCAwLCAwLCAwLCBOVUxMLCAtMSwgMCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2InOgkJLyogbXVsdGlwbGUgaW5zdHJ1Y3Rpb24gZGlzcCAqLwotCSAgZnJlZXB0cisrOwkJLyogT1ZFOnRoaXMgaXMgYW4gdXNlZnVsIGhhY2sgKi8KLQkgIHNwcmludGYgKGZyZWVwdHIsICIoKCVzLTEpKiVkKVwwMDAiLCBhcmd2W2ldLCBkZXNjLT5pbV9zaXplKTsKLQkgIGFyZ3ZbaV0gPSBmcmVlcHRyOwotCSAgcGNyZWwgLT0gMTsJCS8qIG1ha2UgcGNyZWwgMCBpbnNwaXRlIG9mIHdoYXQgY2FzZSAncCc6Ci0JCQkJICAgd2FudHMgKi8KLQkgIC8qIGZhbGwgdGhydSAqLwotCWNhc2UgJ3AnOgkJLyogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZyAqLwotCSAgcGNyZWwgKz0gMTsKLQkgIC8qIGZhbGwgdGhydSAqLwotCWNhc2UgJ2QnOgkJLyogZGlzcGxhY2VtZW50ICovCi0JICBpaWYuaW5zdHJfc2l6ZSArPSBzdWZmaXhQW2ldID8gc3VmZml4UFtpXSA6IDQ7Ci0JICBJSUYgKDEyLCAyLCBzdWZmaXhQW2ldLCAodW5zaWduZWQgbG9uZykgYXJndltpXSwgMCwKLQkgICAgICAgcGNyZWwsIHBjcmVsX2FkanVzdCwgMSwgSU5EIChCUkFOQ0gsIEJZVEUpLCBOVUxMLCAtMSwgMCk7Ci0JICBicmVhazsKLQljYXNlICdIJzoJCS8qIHNlcXVlbnQtaGFjazogdGhlIGxpbmtlciB3YW50cyBhIGJpdCBzZXQKLQkJCQkgICB3aGVuIGJzciAqLwotCSAgcGNyZWwgPSAxOwotCSAgaWlmLmluc3RyX3NpemUgKz0gc3VmZml4UFtpXSA/IHN1ZmZpeFBbaV0gOiA0OwotCSAgSUlGICgxMiwgMiwgc3VmZml4UFtpXSwgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sIDAsCi0JICAgICAgIHBjcmVsLCBwY3JlbF9hZGp1c3QsIDEsIElORCAoQlJBTkNILCBCWVRFKSwgTlVMTCwgLTEsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6CQkvKiBxdWljayAqLwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKLQkgIElJRiAoMTEsIDIsIDQyLCAodW5zaWduZWQgbG9uZykgYXJndltpXSwgMCwgMCwgMCwgMCwgMCwKLQkgICAgICAgYml0X2ZpeF9uZXcgKDQsIG9wY29kZV9iaXRfcHRyLCAtOCwgNywgMCwgMSwgMCksIC0xLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgkJLyogcmVnaXN0ZXIgbnVtYmVyICgzIGJpdHMpICovCi0JICBsaXN0X3NlYXJjaCAoYXJndltpXSwgb3B0NiwgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSAzOwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgkJLyogc2V0Y2ZnIGluc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQzLCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6CQkvKiBjaW52IGluc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQ0LCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OyAvKiBpbnNlcnQgdGhlIHJlZ3R5cGUgaW4gb3Bjb2RlICovCi0JICBicmVhazsKLQljYXNlICdTJzoJCS8qIHN0cmluZ2luc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQ1LCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JY2FzZSAnVSc6CQkvKiByZWdpc3Rlcmxpc3QgKi8KLQkgIElJRiAoMTAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIC0xLCAwKTsKLQkgIHN3aXRjaCAob3BlcmFuZHNQWyhpIDw8IDEpICsgMV0pCi0JICAgIHsKLQkgICAgY2FzZSAndSc6CQkvKiByZXN0b3JlLCBleGl0ICovCi0JICAgICAgb3B0bGlzdCAoYXJndltpXSwgb3B0MSwgJmlpZi5paWZQWzEwXS5vYmplY3QpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdVJzoJCS8qIHNhdmUsZW50ZXIgKi8KLQkgICAgICBvcHRsaXN0IChhcmd2W2ldLCBvcHQyLCAmaWlmLmlpZlBbMTBdLm9iamVjdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlpZi5pbnN0cl9zaXplICs9IDE7Ci0JICBicmVhazsKLQljYXNlICdNJzoJCS8qIG1tdSByZWdpc3RlciAqLwotCSAgbGlzdF9zZWFyY2ggKGFyZ3ZbaV0sIG1tdXJlZywgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgkJLyogY3B1IHJlZ2lzdGVyICAqLwotCSAgbGlzdF9zZWFyY2ggKGFyZ3ZbaV0sIGNwdXJlZywgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgkJLyogaW5zcyBleHRzICovCi0JICBpaWYuaW5zdHJfc2l6ZSArPSAxOwkvKiAxIGJ5dGUgaXMgYWxsb2NhdGVkIGFmdGVyIHRoZSBvcGNvZGUgKi8KLQkgIElJRiAoMTAsIDIsIDEsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLAkvKiBpIGFsd2F5cyAyIGhlcmUgKi8KLQkgICAgICAgMCwgMCwgMCwgMCwgMCwKLQkgICAgICAgYml0X2ZpeF9uZXcgKDMsIDUsIDAsIDcsIDAsIDAsIDApLCAvKiBhIGJpdF9maXggaXMgdGFyZ2V0ZWQgdG8KLQkJCQkJCSAgICAgdGhlIGJ5dGUgKi8KLQkgICAgICAgLTEsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICBJSUYgKDExLCAyLCA0MiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sCS8qIGkgYWx3YXlzIDMgaGVyZSAqLwotCSAgICAgICAwLCAwLCAwLCAwLCAwLAotCSAgICAgICBiaXRfZml4X25ldyAoNSwgMCwgMSwgMzIsIC0xLCAwLCAtMSksIC0xLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgaWlmLmluc3RyX3NpemUgKz0gMTsKLQkgIGIgPSAyICsgaTsJCS8qIHB1dCB0aGUgZXh0ZW5zaW9uIGJ5dGUgYWZ0ZXIgb3Bjb2RlICovCi0JICBJSUYgKGIsIDIsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19mYXRhbCAoXygiQmFkIG9wY29kZS10YWJsZS1vcHRpb24sIGNoZWNrIGluIGZpbGUgbnMzMmstb3Bjb2RlLmgiKSk7Ci0JfQotICAgIH0KLX0KLQwKLS8qIGluOiAgaW5zdHJ1Y3Rpb24gbGluZQotICAgb3V0OiBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgaGFzIGJlZW4gcHJlcGFyZWQgZm9yIGRpcmVjdCBjb252ZXJzaW9uIHRvIGZyYWdtZW50KHMpIGFuZAotICAgZml4ZXMgaW4gYSBzeXN0ZW1hdGljYWwgZmFzaGlvbgotICAgUmV0dXJuLXZhbHVlID0gcmVjdXJzaXZlX2xldmVsCi0gICAqLwotLyogYnVpbGQgaWlmIG9mIG9uZSBhc3NlbWJseSB0ZXh0IGxpbmUgKi8KLWludAotcGFyc2UgKGxpbmUsIHJlY3Vyc2l2ZV9sZXZlbCkKLSAgICAgY2hhciAqbGluZTsKLSAgICAgaW50IHJlY3Vyc2l2ZV9sZXZlbDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbGluZXB0ciwgYywgc3VmZml4X3NlcGFyYXRvcjsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBhcmdjLCBhcmdfdHlwZTsKLSAgY2hhciBzcXIsIHNlcDsKLSAgY2hhciBzdWZmaXhbTUFYX0FSR1NdLCAqYXJndltNQVhfQVJHU107CS8qIG5vIG1vcmUgdGhhbiA0IG9wZXJhbmRzICovCi0gIGlmIChyZWN1cnNpdmVfbGV2ZWwgPD0gMCkKLSAgICB7CQkJCS8qIGNhbGxlZCBmcm9tIG1kX2Fzc2VtYmxlICovCi0gICAgICBmb3IgKGxpbmVwdHIgPSBsaW5lOyAoKmxpbmVwdHIpICE9ICdcMCcgJiYgKCpsaW5lcHRyKSAhPSAnICc7IGxpbmVwdHIrKyk7Ci0gICAgICBjID0gKmxpbmVwdHI7Ci0gICAgICAqbGluZXB0ciA9ICdcMCc7Ci0gICAgICBpZiAoIShkZXNjID0gKHN0cnVjdCBuczMya19vcGNvZGUgKikgaGFzaF9maW5kIChpbnN0X2hhc2hfaGFuZGxlLCBsaW5lKSkpCi0JewotCSAgYXNfZmF0YWwgKF8oIk5vIHN1Y2ggb3Bjb2RlIikpOwotCX0KLSAgICAgICpsaW5lcHRyID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsaW5lcHRyID0gbGluZTsKLSAgICB9Ci0gIGFyZ2MgPSAwOwotICBpZiAoKmRlc2MtPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGlmICgqbGluZXB0cisrICE9ICdcMCcpCi0JewotCSAgc3FyID0gJ1snOwotCSAgc2VwID0gJywnOwotCSAgd2hpbGUgKCpsaW5lcHRyICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoZGVzYy0+b3BlcmFuZHNbYXJnYyA8PCAxXSkKLQkJewotCQkgIHN1ZmZpeFthcmdjXSA9IDA7Ci0JCSAgYXJnX3R5cGUgPSBkZXNjLT5vcGVyYW5kc1soYXJnYyA8PCAxKSArIDFdOwotCQkgIHN3aXRjaCAoYXJnX3R5cGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgY2FzZSAncCc6Ci0JCSAgICBjYXNlICdIJzoJLyogdGhlIG9wZXJhbmQgaXMgc3VwcG9zZWQgdG8gYmUgYQotCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotCQkgICAgICAvKiBIYWNrd2FybmluZzogZG8gbm90IGZvcmdldCB0byB1cGRhdGUgdGhlIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlcyBhYm92ZSB3aGVuIGVkaXRpbmcgbnMzMmstb3Bjb2RlLmggKi8KLQkJICAgICAgc3VmZml4X3NlcGFyYXRvciA9ICc6JzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBzdWZmaXhfc2VwYXJhdG9yID0gJ1wyNTUnOyAvKiBpZiB0aGlzIGNoYXIgb2NjdXJzIHdlCi0JCQkJCQkgICAgbG9vc2UgKi8KLQkJICAgIH0KLQkJICBzdWZmaXhbYXJnY10gPSAwOyAvKiAwIHdoZW4gbm8gJzonIGlzIGVuY291bnRlcmVkICovCi0JCSAgYXJndlthcmdjXSA9IGZyZWVwdHI7Ci0JCSAgKmZyZWVwdHIgPSAnXDAnOwotCQkgIHdoaWxlICgoYyA9ICpsaW5lcHRyKSAhPSAnXDAnICYmIGMgIT0gc2VwKQotCQkgICAgewotCQkgICAgICBpZiAoYyA9PSBzcXIpCi0JCQl7Ci0JCQkgIGlmIChzcXIgPT0gJ1snKQotCQkJICAgIHsKLQkJCSAgICAgIHNxciA9ICddJzsKLQkJCSAgICAgIHNlcCA9ICdcMCc7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgc3FyID0gJ1snOwotCQkJICAgICAgc2VwID0gJywnOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgaWYgKGMgPT0gc3VmZml4X3NlcGFyYXRvcikKLQkJCXsJLyogJzonIC0gbGFiZWwvc3VmZml4IHNlcGFyYXRvciAqLwotCQkJICBzd2l0Y2ggKGxpbmVwdHJbMV0pCi0JCQkgICAgewotCQkJICAgIGNhc2UgJ2InOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJ3cnOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gMjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJ2QnOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gNDsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkgICAgICBhc193YXJuIChfKCJCYWQgc3VmZml4LCBkZWZhdWx0aW5nIHRvIGQiKSk7Ci0JCQkgICAgICBzdWZmaXhbYXJnY10gPSA0OwotCQkJICAgICAgaWYgKGxpbmVwdHJbMV0gPT0gJ1wwJyB8fCBsaW5lcHRyWzFdID09IHNlcCkKLQkJCQl7Ci0JCQkJICBsaW5lcHRyICs9IDE7Ci0JCQkJICBjb250aW51ZTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBsaW5lcHRyICs9IDI7Ci0JCQkgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgICAqZnJlZXB0cisrID0gYzsKLQkJICAgICAgbGluZXB0cisrOwotCQkgICAgfQotCQkgICpmcmVlcHRyKysgPSAnXDAnOwotCQkgIGFyZ2MgKz0gMTsKLQkJICBpZiAoKmxpbmVwdHIgPT0gJ1wwJykKLQkJICAgIGNvbnRpbnVlOwotCQkgIGxpbmVwdHIgKz0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2ZhdGFsIChfKCJUb28gbWFueSBvcGVyYW5kcyBwYXNzZWQgdG8gaW5zdHJ1Y3Rpb24iKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChhcmdjICE9IHN0cmxlbiAoZGVzYy0+b3BlcmFuZHMpIC8gMikKLSAgICB7Ci0gICAgICBpZiAoc3RybGVuIChkZXNjLT5kZWZhdWx0X2FyZ3MpKQotCXsJCQkvKiB3ZSBjYW4gYXBwbHkgZGVmYXVsdCwgZG9udCBnb29mICovCi0JICBpZiAocGFyc2UgKGRlc2MtPmRlZmF1bHRfYXJncywgMSkgIT0gMSkKLQkgICAgewkJCS8qIGNoZWNrIGVycm9yIGluIGRlZmF1bHQgKi8KLQkgICAgICBhc19mYXRhbCAoXygiV3JvbmcgbnVtYmVycyBvZiBvcGVyYW5kcyBpbiBkZWZhdWx0LCBjaGVjayBuczMyay1vcGNvZGVzLmgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfZmF0YWwgKF8oIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyIpKTsKLQl9Ci0KLSAgICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBJSUZfRU5UUklFUzsgaSsrKQotICAgIHsKLSAgICAgIGlpZi5paWZQW2ldLnR5cGUgPSAwOwkvKiBtYXJrIGFsbCBlbnRyaWVzIGFzIHZvaWQqLwotICAgIH0KLQotICAvKiBidWlsZCBvcGNvZGUgaWlmLWVudHJ5ICovCi0gIGlpZi5pbnN0cl9zaXplID0gZGVzYy0+b3Bjb2RlX3NpemUgLyA4OwotICBJSUYgKDEsIDEsIGlpZi5pbnN0cl9zaXplLCBkZXNjLT5vcGNvZGVfc2VlZCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDApOwotCi0gIC8qIHRoaXMgY2FsbCBlbmNvZGVzIG9wZXJhbmRzIHRvIGlpZiBmb3JtYXQgKi8KLSAgaWYgKGFyZ2MpCi0gICAgewotICAgICAgZW5jb2RlX29wZXJhbmQgKGFyZ2MsCi0JCSAgICAgIGFyZ3YsCi0JCSAgICAgICZkZXNjLT5vcGVyYW5kc1swXSwKLQkJICAgICAgJnN1ZmZpeFswXSwKLQkJICAgICAgZGVzYy0+aW1fc2l6ZSwKLQkJICAgICAgZGVzYy0+b3Bjb2RlX3NpemUpOwotICAgIH0KLSAgcmV0dXJuIHJlY3Vyc2l2ZV9sZXZlbDsKLX0KLQwKLQotLyogQ29udmVydCBpaWYgdG8gZnJhZ21lbnRzLiAgRnJvbSB0aGlzIHBvaW50IHdlIHN0YXJ0IHRvIGRyaWJibGUgd2l0aAotICogZnVuY3Rpb25zIGluIG90aGVyIGZpbGVzIHRoYW4gdGhpcyBvbmUuKEV4Y2VwdCBoYXNoLmMpIFNvLCBpZiBpdCdzCi0gKiBwb3NzaWJsZSB0byBtYWtlIGFuIGlpZiBmb3IgYW4gb3RoZXIgQ1BVLCB5b3UgZG9uJ3QgbmVlZCB0byBrbm93Ci0gKiB3aGF0IGZyYWdzLCByZWxheCwgb2JzdGFja3MsIGV0YyBpcyBpbiBvcmRlciB0byBwb3J0IHRoaXMKLSAqIGFzc2VtYmxlci4gWW91IG9ubHkgbmVlZCB0byBrbm93IGlmIGl0J3MgcG9zc2libGUgdG8gcmVkdWNlIHlvdXIKLSAqIGNwdS1pbnN0cnVjdGlvbiB0byBpaWYtZm9ybWF0ICh0YWtlcyBzb21lIHdvcmspIGFuZCBhZG9wdCB0aGUgb3RoZXIKLSAqIG1kXz8gcGFydHMgYWNjb3JkaW5nIHRvIGdpdmVuIGluc3RydWN0aW9ucyBOb3RlIHRoYXQgaWlmIHdhcwotICogaW52ZW50ZWQgZm9yIHRoZSBjbGVhbiBuczMya2BzIGFyY2hpdGVjdXJlLgotICovCi0KLS8qIEdBUyBmb3IgdGhlIG5zMzJrIGhhcyBhIHByb2JsZW0uIFBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudHMgYXJlCi0gKiByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb3Bjb2RlLCBub3QgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gKiBvcGVyYW5kLiBXZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBvcGVyYW5kCi0gKiBhbmQgdGhlIG9wY29kZSBpbiBwY3JlbF9hZGp1c3QgZm9yIGVhY2ggZnJhZyBhbmQgZWFjaCBmaXguIEhvd2V2ZXIsCi0gKiB3ZSBnZXQgaW50byB0cm91YmxlIHdoZXJlIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBwYy1yZWxhdGl2ZQotICogb3BlcmFuZHMgYW5kIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBvbmUgY2FuJ3QgYmUgZGV0ZXJtaW5lZC4gVGhlbiBpbgotICogdGhlIHJlbGF4IHBoYXNlLCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3Qgb3BlcmFuZCB3aWxsIGNoYW5nZSBhbmQKLSAqIHBjcmVsX2FkanVzdCB3aWxsIG5vIGxvbmdlciBiZSBjb3JyZWN0LiAgVGhlIGN1cnJlbnQgc29sdXRpb24gaXMKLSAqIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBmcmFnIHdpdGggdGhlIG9wY29kZSBpbiBpdCBhbmQgdGhlIG9mZnNldCBpbgotICogdGhhdCBmcmFnIGZvciBlYWNoIGZyYWcgYW5kIGVhY2ggZml4LiBUaGVuLCB3aGVuIG5lZWRlZCwgd2UgY2FuCi0gKiBhbHdheXMgZmlndXJlIG91dCBob3cgZmFyIGl0IGlzIGJldHdlZW4gdGhlIG9wY29kZSBhbmQgdGhlIHBjcmVsCi0gKiBvYmplY3QuICBTZWUgYWxzbyBtZF9wY3JlbF9hZGp1c3QgYW5kIG1kX2ZpeF9wY3JlbF9hZGp1c3QuICBGb3IKLSAqIG9iamVjdHMgbm90IHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBwb2ludGVyIHRvIHRoZSBvcGNvZGUgZnJhZwotICogaXMgYWx3YXlzIHplcm8uICAqLwotCi12b2lkCi1jb252ZXJ0X2lpZiAoKQotewotICBpbnQgaTsKLSAgYml0X2ZpeFMgKmo7Ci0gIGZyYWdTICppbnN0X2ZyYWc7Ci0gIHVuc2lnbmVkIGludCBpbnN0X29mZnNldDsKLSAgY2hhciAqaW5zdF9vcGNvZGU7Ci0gIGNoYXIgKm1lbVA7Ci0gIGludCBsOwotICBpbnQgazsKLSAgY2hhciB0eXBlOwotICBjaGFyIHNpemUgPSAwOwotICBpbnQgc2l6ZV9zb19mYXI7Ci0KLSAgbWVtUCA9IGZyYWdfbW9yZSAoMCk7Ci0gIGluc3Rfb3Bjb2RlID0gbWVtUDsKLSAgaW5zdF9vZmZzZXQgPSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKTsKLSAgaW5zdF9mcmFnID0gZnJhZ19ub3c7Ci0KLSAgZm9yIChpID0gMDsgaSA8IElJRl9FTlRSSUVTOyBpKyspCi0gICAgewotICAgICAgaWYgKHR5cGUgPSBpaWYuaWlmUFtpXS50eXBlKQotCXsJCQkvKiB0aGUgb2JqZWN0IGV4aXN0LCBzbyBoYW5kbGUgaXQgKi8KLQkgIHN3aXRjaCAoc2l6ZSA9IGlpZi5paWZQW2ldLnNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA0MjoKLQkgICAgICBzaXplID0gMDsJCS8qIGl0J3MgYSBiaXRmaXggdGhhdCBvcGVyYXRlcyBvbiBhbiBleGlzdGluZwotCQkJCSAgIG9iamVjdCovCi0JICAgICAgaWYgKGlpZi5paWZQW2ldLmJpdF9maXhQLT5meF9iaXRfYmFzZSkKLQkJewkJLyogZXhwYW5kIGZ4X2JpdF9iYXNlIHRvIHBvaW50IGF0IG9wY29kZSAqLwotCQkgIGlpZi5paWZQW2ldLmJpdF9maXhQLT5meF9iaXRfYmFzZSA9IChsb25nKSBpbnN0X29wY29kZTsKLQkJfQotCSAgICBjYXNlIDg6CQkvKiBiaWdudW0gb3IgZG91YmxlZmxvYXQgKi8KLQkgICAgY2FzZSAxOgotCSAgICBjYXNlIDI6Ci0JICAgIGNhc2UgMzoKLQkgICAgY2FzZSA0OgkJLyogdGhlIGZpbmFsIHNpemUgaW4gb2JqZWN0bWVtb3J5IGlzIGtub3duICovCi0JICAgICAgbWVtUCA9IGZyYWdfbW9yZShzaXplKTsKLQkgICAgICBqID0gaWlmLmlpZlBbaV0uYml0X2ZpeFA7Ci0JICAgICAgc3dpdGNoICh0eXBlKQotCQl7Ci0JCWNhc2UgMToJLyogdGhlIG9iamVjdCBpcyBwdXJlIGJpbmFyeSAqLwotCQkgIGlmIChqIHx8IGlpZi5paWZQW2ldLnBjcmVsKQotCQkgICAgewotCQkgICAgICBmaXhfbmV3X25zMzJrIChmcmFnX25vdywKLQkJCQkgICAgIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkgICAgIHNpemUsCi0JCQkJICAgICAwLAotCQkJCSAgICAgaWlmLmlpZlBbaV0ub2JqZWN0LAotCQkJCSAgICAgaWlmLmlpZlBbaV0ucGNyZWwsCi0JCQkJICAgICBpaWYuaWlmUFtpXS5pbV9kaXNwLAotCQkJCSAgICAgaiwKLQkJCQkgICAgIGlpZi5paWZQW2ldLmJzciwJLyogc2VxdWVudCBoYWNrICovCi0JCQkJICAgICBpbnN0X2ZyYWcsIGluc3Rfb2Zmc2V0KTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiBnb29kLCBqdXN0IHB1dCB0aGVtIGJ5dGVzIG91dCAqLwotCQkgICAgICBzd2l0Y2ggKGlpZi5paWZQW2ldLmltX2Rpc3ApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIG1kX251bWJlcl90b19jaGFycyAobWVtUCwgaWlmLmlpZlBbaV0ub2JqZWN0LCBzaXplKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkgIG1kX251bWJlcl90b19kaXNwIChtZW1QLCBpaWYuaWlmUFtpXS5vYmplY3QsIHNpemUpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGFzX2ZhdGFsIChfKCJpaWYgY29udmVydCBpbnRlcm5hbCBwY3JlbC9iaW5hcnkiKSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICAvKiB0aGUgb2JqZWN0IGlzIGEgcG9pbnRlciBhdCBhbiBleHByZXNzaW9uLCBzbwotICAgICAgICAgICAgICAgICAgICAgdW5wYWNrIGl0LCBub3RlIHRoYXQgYmlnbnVtcyBtYXkgcmVzdWx0IGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uICovCi0JCSAgZXZhbHVhdGVfZXhwciAoJmV4cHJQLCAoY2hhciAqKSBpaWYuaWlmUFtpXS5vYmplY3QpOwotCQkgIGlmIChleHByUC5YX29wID09IE9fYmlnIHx8IHNpemUgPT0gOCkKLQkJICAgIHsKLQkJICAgICAgaWYgKChrID0gZXhwclAuWF9hZGRfbnVtYmVyKSA+IDApCi0JCQl7Ci0JCQkgIC8qIHdlIGhhdmUgYSBiaWdudW0gaWUgYSBxdWFkLiBUaGlzIGNhbiBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbnMgaW4gYSBsb25nIHN1ZmZpeGVkIGluc3RydWN0aW9uICovCi0JCQkgIGlmIChrICogMiA+IHNpemUpCi0JCQkgICAgYXNfd2FybiAoXygiQmlnbnVtIHRvbyBiaWcgZm9yIGxvbmciKSk7Ci0JCQkgIGlmIChrID09IDMpCi0JCQkgICAgbWVtUCArPSAyOwotCQkJICBmb3IgKGwgPSAwOyBrID4gMDsgay0tLCBsICs9IDIpCi0JCQkgICAgewotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChtZW1QICsgbCwKLQkJCQkJCSAgZ2VuZXJpY19iaWdudW1bbCA+PiAxXSwKLQkJCQkJCSAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewkvKiBmbG9udW0gKi8KLQkJCSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0KLQkJCSAgc3dpdGNoIChzaXplKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIDQ6Ci0JCQkgICAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCAyLCA4KTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIChsb25nKSB3b3Jkc1swXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAgKyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSwKLQkJCQkJCShsb25nKSB3b3Jkc1sxXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgODoKLQkJCSAgICAgIGdlbl90b193b3JkcyAod29yZHMsIDQsIDExKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIChsb25nKSB3b3Jkc1swXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAgKyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSwKLQkJCQkJCShsb25nKSB3b3Jkc1sxXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKChtZW1QICsgMgotCQkJCQkJICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpLAotCQkJCQkJKGxvbmcpIHdvcmRzWzJdLAotCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2ltbSAoKG1lbVAgKyAzCi0JCQkJCQkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSksCi0JCQkJCQkobG9uZykgd29yZHNbM10sCi0JCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGlmIChqIHx8Ci0JCSAgICAgIGV4cHJQLlhfYWRkX3N5bWJvbCB8fAotCQkgICAgICBleHByUC5YX29wX3N5bWJvbCB8fAotCQkgICAgICBpaWYuaWlmUFtpXS5wY3JlbCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGV4cHJlc3Npb24gd2FzIHVuZGVmaW5lZCBkdWUgdG8gYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgbGFiZWwuIENyZWF0ZSBhIGZpeCBzbyB3ZSBjYW4gZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9iamVjdCBsYXRlci4gKi8KLQkJICAgICAgZXhwclAuWF9hZGRfbnVtYmVyICs9IGlpZi5paWZQW2ldLm9iamVjdF9hZGp1c3Q7Ci0JCSAgICAgIGZpeF9uZXdfbnMzMmtfZXhwIChmcmFnX25vdywKLQkJCQkJIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkJIHNpemUsCi0JCQkJCSAmZXhwclAsCi0JCQkJCSBpaWYuaWlmUFtpXS5wY3JlbCwKLQkJCQkJIGlpZi5paWZQW2ldLmltX2Rpc3AsCi0JCQkJCSBqLAotCQkJCQkgaWlmLmlpZlBbaV0uYnNyLAotCQkJCQkgaW5zdF9mcmFnLCBpbnN0X29mZnNldCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBnb29kLCBqdXN0IHB1dCB0aGVtIGJ5dGVzIG91dCAqLwotCQkgICAgICBzd2l0Y2ggKGlpZi5paWZQW2ldLmltX2Rpc3ApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIGV4cHJQLlhfYWRkX251bWJlciwgc2l6ZSk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAxOgotCQkJICBtZF9udW1iZXJfdG9fZGlzcCAobWVtUCwgZXhwclAuWF9hZGRfbnVtYmVyLCBzaXplKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBhc19mYXRhbCAoXygiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvcG9pbnRlciIpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbbl0udHlwZSIpKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDA6Ci0JICAgICAgLyogVG8gYmFkLCB0aGUgb2JqZWN0IG1heSBiZSB1bmRlZmluZWQgYXMgZmFyIGFzIGl0cwotCQkgZmluYWwgbnNpemUgaW4gb2JqZWN0IG1lbW9yeSBpcyBjb25jZXJuZWQuICBUaGUgc2l6ZQotCQkgb2YgdGhlIG9iamVjdCBpbiBvYmplY3RtZW1vcnkgaXMgbm90IGV4cGxpY2l0bHkKLQkJIGdpdmVuLiAgSWYgdGhlIG9iamVjdCBpcyBkZWZpbmVkIGl0cyBsZW5ndGggY2FuIGJlCi0JCSBkZXRlcm1pbmVkIGFuZCBhIGZpeCBjYW4gcmVwbGFjZSB0aGUgZnJhZy4gKi8KLQkgICAgICB7Ci0JCWV2YWx1YXRlX2V4cHIgKCZleHByUCwgKGNoYXIgKikgaWlmLmlpZlBbaV0ub2JqZWN0KTsKLQkJaWYgKChleHByUC5YX2FkZF9zeW1ib2wgfHwgZXhwclAuWF9vcF9zeW1ib2wpICYmCi0JCSAgICAhaWlmLmlpZlBbaV0ucGNyZWwpCi0JCSAgewotCQkgICAgLyogU2l6ZSBpcyB1bmtub3duIHVudGlsIGxpbmsgdGltZSBzbyBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGFsbG93IDQgYnl0ZXMuICovCi0JCSAgICBzaXplID0gNDsKLQkJICAgIG1lbVAgPSBmcmFnX21vcmUoc2l6ZSk7Ci0JCSAgICBmaXhfbmV3X25zMzJrX2V4cCAoZnJhZ19ub3csCi0JCQkJICAgICAgIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkgICAgICAgc2l6ZSwKLQkJCQkgICAgICAgJmV4cHJQLAotCQkJCSAgICAgICAwLCAvKiBuZXZlciBpaWYuaWlmUFtpXS5wY3JlbCwgKi8KLQkJCQkgICAgICAgMSwgLyogYWx3YXlzIGlpZi5paWZQW2ldLmltX2Rpc3AgKi8KLQkJCQkgICAgICAgKGJpdF9maXhTICopIDAsIDAsCi0JCQkJICAgICAgIGluc3RfZnJhZywKLQkJCQkgICAgICAgaW5zdF9vZmZzZXQpOwotCQkgICAgYnJlYWs7CQkvKiBleGl0IHRoaXMgYWJzb2x1dGUgaGFjayAqLwotCQkgIH0KLQotCQlpZiAoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKQotCQkgIHsJCQkvKiBmcmFnIGl0ICovCi0JCSAgICBpZiAoZXhwclAuWF9vcF9zeW1ib2wpCi0JCSAgICAgIHsJCQkvKiBXZSBjYW50IHJlbGF4IHRoaXMgY2FzZSAqLwotCQkJYXNfZmF0YWwgKF8oIkNhbid0IHJlbGF4IGRpZmZlcmVuY2UiKSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCi0JCQkvKiBTaXplIGlzIG5vdCBpbXBvcnRhbnQuIFRoaXMgZ2V0cyBmaXhlZCBieSByZWxheCwKLQkJCSAqIGJ1dCB3ZSBhc3N1bWUgMCBpbiB3aGF0IGZvbGxvd3MKLQkJCSAqLwotCQkJbWVtUCA9IGZyYWdfbW9yZSg0KTsgLyogTWF4IHNpemUgKi8KLQkJCXNpemUgPSAwOwotCi0JCQl7Ci0JCQkgIGZyYWdTICpvbGRfZnJhZyA9IGZyYWdfbm93OwotCQkJICBmcmFnX3ZhcmlhbnQgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJCQk0LCAvKiBNYXggc2l6ZSAqLwotCQkJCQkwLCAvKiBzaXplICovCi0JCQkJCUlORCAoQlJBTkNILCBVTkRFRiksIC8qIGV4cGVjdGluZyB0aGUgd29yc3QgKi8KLQkJCQkJZXhwclAuWF9hZGRfc3ltYm9sLAotCQkJCQlleHByUC5YX2FkZF9udW1iZXIsCi0JCQkJCWluc3Rfb3Bjb2RlKTsKLQkJCSAgZnJhZ19vcGNvZGVfZnJhZyhvbGRfZnJhZykgPSBpbnN0X2ZyYWc7Ci0JCQkgIGZyYWdfb3Bjb2RlX29mZnNldChvbGRfZnJhZykgPSBpbnN0X29mZnNldDsKLQkJCSAgZnJhZ19ic3Iob2xkX2ZyYWcpID0gaWlmLmlpZlBbaV0uYnNyOwotCQkJfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogVGhpcyBkdXBsaWNhdGVzIGNvZGUgaW4gbWRfbnVtYmVyX3RvX2Rpc3AgKi8KLQkJICAgIGlmICgtNjQgPD0gZXhwclAuWF9hZGRfbnVtYmVyICYmIGV4cHJQLlhfYWRkX251bWJlciA8PSA2MykKLQkJICAgICAgewotCQkJc2l6ZSA9IDE7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaWYgKC04MTkyIDw9IGV4cHJQLlhfYWRkX251bWJlcgotCQkJICAgICYmIGV4cHJQLlhfYWRkX251bWJlciA8PSA4MTkxKQotCQkJICB7Ci0JCQkgICAgc2l6ZSA9IDI7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGlmICgtMHgyMDAwMDAwMDw9ZXhwclAuWF9hZGRfbnVtYmVyICYmCi0JCQkJZXhwclAuWF9hZGRfbnVtYmVyPD0weDFmZmZmZmZmKQotCQkJICAgICAgewotCQkJCXNpemUgPSA0OwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlhc193YXJuIChfKCJEaXNwbGFjZW1lbnQgdG8gbGFyZ2UgZm9yIDpkIikpOwotCQkJCXNpemUgPSA0OwotCQkJICAgICAgfQotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIG1lbVAgPSBmcmFnX21vcmUoc2l6ZSk7Ci0JCSAgICBtZF9udW1iZXJfdG9fZGlzcCAobWVtUCwgZXhwclAuWF9hZGRfbnVtYmVyLCBzaXplKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBsb2dpYyBlcnJvciBpbiBpaWYuaWlmUFtdLnR5cGUiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotDAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIFRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgcmVhbGx5IGJlIGluIHRoZSBiZmQgbGlicmFyeSAqLwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotcmVsb2MgKGludCBzaXplLCBpbnQgcGNyZWwsIGludCB0eXBlKQotewotICBpbnQgbGVuZ3RoLCBpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jc1tdID0gewotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fOCwKLSAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2LAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMLAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwKLQotICAgIC8qIG5zMzJrIGRpc3BsYWNlbWVudHMgKi8KLSAgICBCRkRfUkVMT0NfTlMzMktfRElTUF84LAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsCi0KLSAgICAvKiBOb3JtYWwgMidzIGNvbXBsZW1lbnQgKi8KLSAgICBCRkRfUkVMT0NfOCwKLSAgICBCRkRfUkVMT0NfMTYsCi0gICAgQkZEX1JFTE9DXzMyLAotICAgIEJGRF9SRUxPQ184X1BDUkVMLAotICAgIEJGRF9SRUxPQ18xNl9QQ1JFTCwKLSAgICBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICB9OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGxlbmd0aCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbGVuZ3RoID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBsZW5ndGggPSAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgaW5kZXggPSBsZW5ndGggKyAzICogcGNyZWwgKyA2ICogdHlwZTsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplb2YocmVsb2NzKS9zaXplb2YocmVsb2NzWzBdKSkKLSAgICByZXR1cm4gcmVsb2NzW2luZGV4XTsKLSAgaWYgKHBjcmVsKQotICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIHN0b3JhZ2UgdHlwZSAlZCIpLAotCSAgICBzaXplLCB0eXBlKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24gZm9yIHN0b3JhZ2UgdHlwZSAlZCIpLAotCSAgICBzaXplLCB0eXBlKTsKLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotCi19Ci0KLSNlbmRpZgotCi12b2lkCi1tZF9hc3NlbWJsZSAobGluZSkKLSAgICAgY2hhciAqbGluZTsKLXsKLSAgZnJlZXB0ciA9IGZyZWVwdHJfc3RhdGljOwotICBwYXJzZSAobGluZSwgMCk7CQkvKiBleHBsb2RlIGxpbmUgdG8gbW9yZSBmaXggZm9ybSBpbiBpaWYgKi8KLSAgY29udmVydF9paWYgKCk7CQkvKiBjb252ZXJ0IGlpZiB0byBmcmFncywgZml4J3MgZXRjICovCi0jaWZkZWYgU0hPV19OVU0KLSAgcHJpbnRmICgiIFx0XHRcdCVzXG4iLCBsaW5lKTsKLSNlbmRpZgotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIC8qIGJ1aWxkIGEgaGFzaHRhYmxlIG9mIHRoZSBpbnN0cnVjdGlvbnMgKi8KLSAgY29uc3Qgc3RydWN0IG5zMzJrX29wY29kZSAqcHRyOwotICBjb25zdCBjaGFyICpzdGF0OwotICBpbnN0X2hhc2hfaGFuZGxlID0gaGFzaF9uZXcgKCk7Ci0gIGZvciAocHRyID0gbnMzMmtfb3Bjb2RlczsgcHRyIDwgZW5kb3A7IHB0cisrKQotICAgIHsKLSAgICAgIGlmICgoc3RhdCA9IGhhc2hfaW5zZXJ0IChpbnN0X2hhc2hfaGFuZGxlLCBwdHItPm5hbWUsIChjaGFyICopIHB0cikpKQotCXsKLQkgIGFzX2ZhdGFsIChfKCJDYW4ndCBoYXNoICVzOiAlcyIpLCBwdHItPm5hbWUsIHN0YXQpOwkvKmZhdGFsKi8KLQl9Ci0gICAgfQotICBmcmVlcHRyX3N0YXRpYyA9IChjaGFyICopIG1hbGxvYyAoUFJJVkFURV9TSVpFKTsgLyogc29tZSBwcml2YXRlIHNwYWNlCi0JCQkJCQkgICAgICBwbGVhc2UhICovCi19Ci0KLS8qIE11c3QgYmUgZXF1YWwgdG8gTUFYX1BSRUNJU09OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgbGl0UCBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzLiAgVGhlIG51bWJlciBvZgotICAgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCotLXdvcmRQKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotDAotLyogQ29udmVydCBudW1iZXIgdG8gY2hhcnMgaW4gY29ycmVjdCBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLQotLyogVGhpcyBpcyBhIHZhcmlhbnQgb2YgbWRfbnVtYmVyc190b19jaGFycy4gVGhlIHJlYXNvbiBmb3IgaXRzJwotICAgZXhpc3RlbmNlIGlzIHRoZSBmYWN0IHRoYXQgbnMzMmsgdXNlcyBIdWZmbWFuIGNvZGVkCi0gICBkaXNwbGFjZW1lbnRzLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgYml0IG9yZGVyIGlzIHJldmVyc2VkIGluCi0gICBkaXNwbGFjZW1lbnRzIGFuZCB0aGF0IHRoZXkgYXJlIHByZWZpeGVkIHdpdGggYSBzaXplLXRhZy4KLQotICAgYmluYXJ5OiBtc2IgLT4gbHNiCi0gICAweHh4eHh4eAkJCQlieXRlCi0gICAxMHh4eHh4eCB4eHh4eHh4eAkJCXdvcmQKLSAgIDExeHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4CWRvdWJsZSB3b3JkCi0KLSAgIFRoaXMgbXVzdCBiZSB0YWtlbiBjYXJlIG9mIGFuZCB3ZSBkbyBpdCBoZXJlISAgKi8KLXN0YXRpYyB2b2lkCi1tZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGNoYXIgbjsKLXsKLSAgc3dpdGNoIChuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAodmFsIDwgLTY0IHx8IHZhbCA+IDYzKQotCWFzX3dhcm4gKF8oIkJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIpKTsKLSAgICAgIHZhbCAmPSAweDdmOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHZhbCA8IC04MTkyIHx8IHZhbCA+IDgxOTEpCi0JYXNfd2FybiAoXygiV29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlLiAgbGluZSBudW1iZXIgbm90IHZhbGlkIikpOwotICAgICAgdmFsICY9IDB4M2ZmZjsKLSAgICAgIHZhbCB8PSAweDgwMDA7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiA4ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAodmFsIDwgLTB4MjAwMDAwMDAgfHwgdmFsID49IDB4MjAwMDAwMDApCi0JYXNfd2FybiAoXygiRG91YmxlIHdvcmQgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIpKTsKLSAgICAgIHZhbCB8PSAweGMwMDAwMDAwOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMjQgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiAxNiAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IuICBsaW5lICVzLCBmaWxlIFwiJXNcIiIpLAotCQlfX0xJTkVfXywgX19GSUxFX18pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBjaGFyIG47Ci17Ci0gIHN3aXRjaCAobikKLSAgICB7Ci0gICAgY2FzZSAxOgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gOCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMjQgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiAxNiAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IuIGxpbmUgJXMsIGZpbGUgXCIlc1wiIiksCi0JCV9fTElORV9fLCBfX0ZJTEVfXyk7Ci0gICAgfQotfQotCi0KLS8qIGZhc3QgYml0ZmlkZGxpbmcgc3VwcG9ydCAqLwotLyogbWFzayB1c2VkIHRvIHplcm8gYml0ZmllbGQgYmVmb3JlIG9yaW5nIGluIHRoZSB0cnVlIGZpZWxkICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxfbWFza1tdID0KLXsKLSAgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZSwgMHhmZmZmZmZmYywgMHhmZmZmZmZmOCwKLSAgMHhmZmZmZmZmMCwgMHhmZmZmZmZlMCwgMHhmZmZmZmZjMCwgMHhmZmZmZmY4MCwKLSAgMHhmZmZmZmYwMCwgMHhmZmZmZmUwMCwgMHhmZmZmZmMwMCwgMHhmZmZmZjgwMCwKLSAgMHhmZmZmZjAwMCwgMHhmZmZmZTAwMCwgMHhmZmZmYzAwMCwgMHhmZmZmODAwMCwKLSAgMHhmZmZmMDAwMCwgMHhmZmZlMDAwMCwgMHhmZmZjMDAwMCwgMHhmZmY4MDAwMCwKLSAgMHhmZmYwMDAwMCwgMHhmZmUwMDAwMCwgMHhmZmMwMDAwMCwgMHhmZjgwMDAwMCwKLSAgMHhmZjAwMDAwMCwgMHhmZTAwMDAwMCwgMHhmYzAwMDAwMCwgMHhmODAwMDAwMCwKLSAgMHhmMDAwMDAwMCwgMHhlMDAwMDAwMCwgMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwKLX07Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyByX21hc2tbXSA9Ci17Ci0gIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDcsCi0gIDB4MDAwMDAwMGYsIDB4MDAwMDAwMWYsIDB4MDAwMDAwM2YsIDB4MDAwMDAwN2YsCi0gIDB4MDAwMDAwZmYsIDB4MDAwMDAxZmYsIDB4MDAwMDAzZmYsIDB4MDAwMDA3ZmYsCi0gIDB4MDAwMDBmZmYsIDB4MDAwMDFmZmYsIDB4MDAwMDNmZmYsIDB4MDAwMDdmZmYsCi0gIDB4MDAwMGZmZmYsIDB4MDAwMWZmZmYsIDB4MDAwM2ZmZmYsIDB4MDAwN2ZmZmYsCi0gIDB4MDAwZmZmZmYsIDB4MDAxZmZmZmYsIDB4MDAzZmZmZmYsIDB4MDA3ZmZmZmYsCi0gIDB4MDBmZmZmZmYsIDB4MDFmZmZmZmYsIDB4MDNmZmZmZmYsIDB4MDdmZmZmZmYsCi0gIDB4MGZmZmZmZmYsIDB4MWZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4N2ZmZmZmZmYsCi19OwotI2RlZmluZSBNQVNLX0JJVFMgMzEKLS8qIEluc2VydCBiaXRmaWVsZCBkZXNjcmliZWQgYnkgZmllbGRfcHRyIGFuZCB2YWwgYXQgYnVmCi0gICBUaGlzIHJvdXRpbmUgaXMgd3JpdHRlbiBmb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBmaXJzdCA0IGJ5dGVzIHBvaW50ZWQKLSAgIHRvIGJ5IGJ1ZiwgdG8geWllbGQgc3BlZWQuCi0gICBUaGUgaWZkZWYgc3R1ZmYgaXMgZm9yIHNlbGVjdGlvbiBiZXR3ZWVuIGEgbnMzMmstZGVwZW5kZW50IHJvdXRpbmUKLSAgIGFuZCBhIGdlbmVyYWwgdmVyc2lvbi4gKE15IGFkdmljZTogdXNlIHRoZSBnZW5lcmFsIHZlcnNpb24hKQotICAgKi8KLQotc3RhdGljIHZvaWQKLW1kX251bWJlcl90b19maWVsZCAoYnVmLCB2YWwsIGZpZWxkX3B0cikKLSAgICAgcmVnaXN0ZXIgY2hhciAqYnVmOwotICAgICByZWdpc3RlciBsb25nIHZhbDsKLSAgICAgcmVnaXN0ZXIgYml0X2ZpeFMgKmZpZWxkX3B0cjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBvYmplY3Q7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgLyogZGVmaW5lIEVORElBTiBvbiBhIG5zMzJrIG1hY2hpbmUgKi8KLSNpZmRlZiBFTkRJQU4KLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqbWVtX3B0cjsKLSNlbHNlCi0gIHJlZ2lzdGVyIGNoYXIgKm1lbV9wdHI7Ci0jZW5kaWYKLSAgaWYgKGZpZWxkX3B0ci0+ZnhfYml0X21pbiA8PSB2YWwgJiYgdmFsIDw9IGZpZWxkX3B0ci0+ZnhfYml0X21heCkKLSAgICB7Ci0jaWZkZWYgRU5ESUFOCi0gICAgICBpZiAoZmllbGRfcHRyLT5meF9iaXRfYmFzZSkKLQl7CQkJLyogb3ZlcnJpZGUgYnVmICovCi0JICBtZW1fcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgZmllbGRfcHRyLT5meF9iaXRfYmFzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtX3B0ciA9ICh1bnNpZ25lZCBsb25nICopIGJ1ZjsKLQl9Ci0gICAgICBtZW1fcHRyID0gKCh1bnNpZ25lZCBsb25nICopCi0JCSAoKGNoYXIgKikgbWVtX3B0ciArIGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2VfYWRqKSk7Ci0jZWxzZQotICAgICAgaWYgKGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2UpCi0JewkJCS8qIG92ZXJyaWRlIGJ1ZiAqLwotCSAgbWVtX3B0ciA9IChjaGFyICopIGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbV9wdHIgPSBidWY7Ci0JfQotICAgICAgbWVtX3B0ciArPSBmaWVsZF9wdHItPmZ4X2JpdF9iYXNlX2FkajsKLSNlbmRpZgotI2lmZGVmIEVORElBTgkJCS8qIHdlIGhhdmUgYSBuaWNlIG5zMzJrIG1hY2hpbmUgd2l0aCBsb3dieXRlCi0JCQkJICAgYXQgbG93LXBoeXNpY2FsIG1lbSAqLwotICAgICAgb2JqZWN0ID0gKm1lbV9wdHI7CS8qIGdldCBzb21lIGJ5dGVzICovCi0jZWxzZSAvKiBPVkUgR29vZiEgdGhlIG1hY2hpbmUgaXMgYSBtNjhrIG9yIGRpdG8gKi8KLSAgICAgIC8qIFRoYXQgdGFrZXMgbW9yZSBieXRlIGZpZGRsaW5nICovCi0gICAgICBvYmplY3QgPSAwOwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbM10gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMl0gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMV0gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMF0gJiAweGZmOwotI2VuZGlmCi0gICAgICBtYXNrID0gMDsKLSAgICAgIG1hc2sgfD0gKHJfbWFza1tmaWVsZF9wdHItPmZ4X2JpdF9vZmZzZXRdKTsKLSAgICAgIG1hc2sgfD0gKGxfbWFza1tmaWVsZF9wdHItPmZ4X2JpdF9vZmZzZXQgKyBmaWVsZF9wdHItPmZ4X2JpdF9zaXplXSk7Ci0gICAgICBvYmplY3QgJj0gbWFzazsKLSAgICAgIHZhbCArPSBmaWVsZF9wdHItPmZ4X2JpdF9hZGQ7Ci0gICAgICBvYmplY3QgfD0gKCh2YWwgPDwgZmllbGRfcHRyLT5meF9iaXRfb2Zmc2V0KSAmIChtYXNrIF4gMHhmZmZmZmZmZikpOwotI2lmZGVmIEVORElBTgotICAgICAgKm1lbV9wdHIgPSBvYmplY3Q7Ci0jZWxzZQotICAgICAgbWVtX3B0clswXSA9IChjaGFyKSBvYmplY3Q7Ci0gICAgICBvYmplY3QgPj49IDg7Ci0gICAgICBtZW1fcHRyWzFdID0gKGNoYXIpIG9iamVjdDsKLSAgICAgIG9iamVjdCA+Pj0gODsKLSAgICAgIG1lbV9wdHJbMl0gPSAoY2hhcikgb2JqZWN0OwotICAgICAgb2JqZWN0ID4+PSA4OwotICAgICAgbWVtX3B0clszXSA9IChjaGFyKSBvYmplY3Q7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCaXQgZmllbGQgb3V0IG9mIHJhbmdlIikpOwotICAgIH0KLX0KLQotaW50IG1kX3BjcmVsX2FkanVzdCAoZnJhZ1MgKmZyYWdQKQotewotICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gIGFkZHJlc3NUIG9wY29kZV9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICBvcGNvZGVfZnJhZyA9IGZyYWdfb3Bjb2RlX2ZyYWcoZnJhZ1ApOwotICBpZiAob3Bjb2RlX2ZyYWcgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgb2Zmc2V0ID0gZnJhZ19vcGNvZGVfb2Zmc2V0KGZyYWdQKTsKLSAgb3Bjb2RlX2FkZHJlc3MgPSBvZmZzZXQgKyBvcGNvZGVfZnJhZy0+ZnJfYWRkcmVzczsKLSAgcmV0dXJuIGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIG9wY29kZV9hZGRyZXNzOwotfQotCi1pbnQgbWRfZml4X3BjcmVsX2FkanVzdCAoZml4UyAqZml4UCkKLXsKLSAgZnJhZ1MgKmZyYWdQID0gZml4UC0+ZnhfZnJhZzsKLSAgZnJhZ1MgKm9wY29kZV9mcmFnOwotICBhZGRyZXNzVCBvcGNvZGVfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgb3Bjb2RlX2ZyYWcgPSBmaXhfb3Bjb2RlX2ZyYWcoZml4UCk7Ci0gIGlmIChvcGNvZGVfZnJhZyA9PSAwKQotICAgIHJldHVybiAwOwotICBvZmZzZXQgPSBmaXhfb3Bjb2RlX29mZnNldChmaXhQKTsKLSAgb3Bjb2RlX2FkZHJlc3MgPSBvZmZzZXQgKyBvcGNvZGVfZnJhZy0+ZnJfYWRkcmVzczsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIG9wY29kZV9hZGRyZXNzOwotfQotCi0vKiBBcHBseSBhIGZpeFMgKGZpeHVwIG9mIGFuIGluc3RydWN0aW9uIG9yIGRhdGEgdGhhdCB3ZSBkaWRuJ3QgaGF2ZQotICAgZW5vdWdoIGluZm8gdG8gY29tcGxldGUgaW1tZWRpYXRlbHkpIHRvIHRoZSBkYXRhIGluIGEgZnJhZy4KLQotICAgT24gdGhlIG5zMzJrLCBldmVyeXRoaW5nIGlzIGluIGEgZGlmZmVyZW50IGZvcm1hdCwgc28gd2UgaGF2ZSBicm9rZW4KLSAgIG91dCBzZXBhcmF0ZSBmdW5jdGlvbnMgZm9yIGVhY2gga2luZCBvZiB0aGluZyB3ZSBjb3VsZCBiZSBmaXhpbmcuCi0gICBUaGV5IGFsbCBnZXQgY2FsbGVkIGZyb20gaGVyZS4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotI2Vsc2UKLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLSNlbmRpZgotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgbG9uZyB2YWwgPSAqdmFscDsKLSNlbmRpZgotICBmcmFnUyAqZnJhZ1AgPSBmaXhQLT5meF9mcmFnOwotCi0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBpZiAoZml4X2JpdF9maXhQKGZpeFApKQotICAgIHsJCQkJLyogQml0ZmllbGRzIHRvIGZpeCwgc2lnaCAqLwotICAgICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChidWYsIHZhbCwgZml4X2JpdF9maXhQKGZpeFApKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKGZpeF9pbV9kaXNwKGZpeFApKQotICAgICAgewotCi0gICAgICBjYXNlIDA6CQkJLyogSW1tZWRpYXRlIGZpZWxkICovCi0JbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIGZpeFAtPmZ4X3NpemUpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIDE6CQkJLyogRGlzcGxhY2VtZW50IGZpZWxkICovCi0JLyogQ2FsY3VsYXRlIG9mZnNldCAqLwotCXsKLQltZF9udW1iZXJfdG9fZGlzcCAoYnVmLAotCQkJICAgKGZpeFAtPmZ4X3BjcmVsID8gdmFsICsgbWRfZml4X3BjcmVsX2FkanVzdChmaXhQKQotCQkJICAgIDogdmFsKSwgZml4UC0+Znhfc2l6ZSk7Ci0JfQotCWJyZWFrOwotCi0gICAgICBjYXNlIDI6CQkJLyogUG9pbnRlciBpbiBhIGRhdGEgb2JqZWN0ICovCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0jaWZkZWYgQlNEX0FTU0VNQkxFUgotICByZXR1cm4gMTsKLSNlbmRpZgotfQotDAotLyogQ29udmVydCBhIHJlbGF4ZWQgZGlzcGxhY2VtZW50IHRvIGRpdHRvIGluIGZpbmFsIG91dHB1dCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZWxzZQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZW5kaWYKLXsKLSAgbG9uZyBkaXNwOwotICBsb25nIGV4dCA9IDA7Ci0KLSAgLyogQWRkcmVzcyBpbiBnYXMgY29yZSBvZiB0aGUgcGxhY2UgdG8gc3RvcmUgdGhlIGRpc3BsYWNlbWVudC4gICovCi0gIHJlZ2lzdGVyIGNoYXIgKmJ1ZmZlcl9hZGRyZXNzID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsOwotICAvKiBBZGRyZXNzIGluIG9iamVjdCBjb2RlIG9mIHRoZSBkaXNwbGFjZW1lbnQuICAqLwotICBpbnQgb2JqZWN0X2FkZHJlc3M7Ci0KLSAgZnJhZ1MgKm9wY29kZV9mcmFnOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgSU5EIChCUkFOQ0gsIEJZVEUpOgotICAgICAgZXh0ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU5EIChCUkFOQ0gsIFdPUkQpOgotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU5EIChCUkFOQ0gsIERPVUJMRSk6Ci0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmKGV4dCA9PSAwKQotICAgIHJldHVybjsKLQotICBrbm93IChmcmFnUC0+ZnJfc3ltYm9sKTsKLQotICBvYmplY3RfYWRkcmVzcyA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzczsKLSAgLyogVGhlIGRpc3BsYWNlbWVudCBvZiB0aGUgYWRkcmVzcywgZnJvbSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLSAgZGlzcCA9IChTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0KSAtIG9iamVjdF9hZGRyZXNzOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZGlzcCArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0gIGRpc3AgKz0gbWRfcGNyZWxfYWRqdXN0KGZyYWdQKTsKLQotICBtZF9udW1iZXJfdG9fZGlzcCAoYnVmZmVyX2FkZHJlc3MsIChsb25nKSBkaXNwLCAoaW50KSBleHQpOwotICBmcmFnUC0+ZnJfZml4ICs9IGV4dDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlc3RpbWF0ZWQgc2l6ZSBhIHZhcmlhYmxlIG9iamVjdCB3aWxsIG9jY3VweSwKLSAgIG9uZSBjYW4gc2F5IHRoYXQgd2UgdHJpZXMgdG8gZ3Vlc3MgdGhlIHNpemUgb2YgdGhlIG9iamVjdHMgYmVmb3JlIHdlCi0gICBhY3R1YWxseSBrbm93IGl0ICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgaW50IG9sZF9maXg7Ci0gIG9sZF9maXggPSBmcmFnUC0+ZnJfZml4OwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIElORCAoQlJBTkNILCBVTkRFRik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKLQl7Ci0JICAvKiB0aGUgc3ltYm9sIGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gSU5EIChCUkFOQ0gsIEJZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiB3ZSBkb24ndCByZWxheCBzeW1ib2xzIGRlZmluZWQgaW4gYW4gb3RoZXIgc2VnbWVudCB0aGUKLQkgICAgIHRoaW5nIHRvIGRvIGlzIHRvIGFzc3VtZSB0aGUgb2JqZWN0IHdpbGwgb2NjdXB5IDQgYnl0ZXMgKi8KLQkgIGZpeF9uZXdfbnMzMmsgKGZyYWdQLAotCQkJIChpbnQpIChmcmFnUC0+ZnJfZml4KSwKLQkJCSA0LAotCQkJIGZyYWdQLT5mcl9zeW1ib2wsCi0JCQkgZnJhZ1AtPmZyX29mZnNldCwKLQkJCSAxLAotCQkJIDEsCi0JCQkgMCwKLQkJCSBmcmFnX2JzcihmcmFnUCksIC8qc2VxdWVudCBoYWNrICovCi0JCQkgZnJhZ19vcGNvZGVfZnJhZyhmcmFnUCksCi0JCQkgZnJhZ19vcGNvZGVfb2Zmc2V0KGZyYWdQKSk7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAvKiBmcmFnUC0+ZnJfb3Bjb2RlWzFdPTB4ZmY7ICovCi0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQkgIGJyZWFrOwotCX0KLSAgICBjYXNlIElORCAoQlJBTkNILCBCWVRFKToKLSAgICAgIGZyYWdQLT5mcl92YXIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9maXg7Ci19Ci0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOwotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNTsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIGZyb21fYWRkcjsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4RUEsIDEpOwotICBtZF9udW1iZXJfdG9fZGlzcCAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCAyKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIGZyb21fYWRkcjsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4RUEsIDEpOwotICBtZF9udW1iZXJfdG9fZGlzcCAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJtOiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiMzIwMzIiKSkKLQl7Ci0JICBjcHVyZWcgPSBjcHVyZWdfMDMyOwotCSAgbW11cmVnID0gbW11cmVnXzAzMjsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICIzMjUzMiIpKQotCXsKLQkgIGNwdXJlZyA9IGNwdXJlZ181MzI7Ci0JICBtbXVyZWcgPSBtbXVyZWdfNTMyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIG9wdGlvbiAtbSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotTlMzMksgb3B0aW9uczpcblwKLS1tMzIwMzIgfCAtbTMyNTMyCXNlbGVjdCB2YXJpYW50IG9mIE5TMzJLIGFyY2hpdGVjdHVyZVxuIikpOwotfQotCi0MCi0vKgotICoJCQliaXRfZml4X25ldygpCi0gKgotICogQ3JlYXRlIGEgYml0X2ZpeFMgaW4gb2JzdGFjayAnbm90ZXMnLgotICogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwcm9maWxlIHRoZSBub3JtYWwgZml4LiBJZiB0aGUgYml0X2ZpeFAgaXMgYQotICogdmFsaWQgcG9pbnRlciAobm90IE5VTEwpIHRoZSBiaXRfZml4IGRhdGEgd2lsbCBiZSB1c2VkIHRvIGZvcm1hdCB0aGUgZml4LgotICovCi1iaXRfZml4UyAqCi1iaXRfZml4X25ldyAoc2l6ZSwgb2Zmc2V0LCBtaW4sIG1heCwgYWRkLCBiYXNlX3R5cGUsIGJhc2VfYWRqKQotICAgICBjaGFyIHNpemU7CQkJLyogTGVuZ3RoIG9mIGJpdGZpZWxkCQkqLwotICAgICBjaGFyIG9mZnNldDsJCS8qIEJpdCBvZmZzZXQgdG8gYml0ZmllbGQJKi8KLSAgICAgbG9uZyBtaW47CQkJLyogU2lnbmV4dGVuZGVkIG1pbiBmb3IgYml0ZmllbGQgKi8KLSAgICAgbG9uZyBtYXg7CQkJLyogU2lnbmV4dGVuZGVkIG1heCBmb3IgYml0ZmllbGQgKi8KLSAgICAgbG9uZyBhZGQ7CQkJLyogQWRkIG1hc2ssIHVzZWQgZm9yIGh1ZmZtYW4gcHJlZml4ICovCi0gICAgIGxvbmcgYmFzZV90eXBlOwkJLyogMCBvciAxLCBpZiAxIGl0J3MgZXhwbG9kZWQgdG8gb3Bjb2RlIHB0ciAqLwotICAgICBsb25nIGJhc2VfYWRqOwotewotICByZWdpc3RlciBiaXRfZml4UyAqYml0X2ZpeFA7Ci0KLSAgYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKGJpdF9maXhTKSk7Ci0KLSAgYml0X2ZpeFAtPmZ4X2JpdF9zaXplID0gc2l6ZTsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGJpdF9maXhQLT5meF9iaXRfYmFzZSA9IGJhc2VfdHlwZTsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9iYXNlX2FkaiA9IGJhc2VfYWRqOwotICBiaXRfZml4UC0+ZnhfYml0X21heCA9IG1heDsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9taW4gPSBtaW47Ci0gIGJpdF9maXhQLT5meF9iaXRfYWRkID0gYWRkOwotCi0gIHJldHVybiAoYml0X2ZpeFApOwotfQotCi12b2lkCi1maXhfbmV3X25zMzJrIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwKLQkgICAgICAgaW1fZGlzcCwgYml0X2ZpeFAsIGJzciwgb3Bjb2RlX2ZyYWcsIG9wY29kZV9vZmZzZXQpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwkvKiBYX2FkZF9zeW1ib2wuICovCi0gICAgIGxvbmcgb2Zmc2V0OwkJLyogWF9hZGRfbnVtYmVyLiAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICAgICBjaGFyIGltX2Rpc3A7CQkvKiB0cnVlIGlmIHRoZSB2YWx1ZSB0byB3cml0ZSBpcyBhCi0JCQkJICAgZGlzcGxhY2VtZW50ICovCi0gICAgIGJpdF9maXhTICpiaXRfZml4UDsJLyogcG9pbnRlciBhdCBzdHJ1Y3Qgb2YgYml0X2ZpeCdzLCBpZ25vcmVkIGlmCi0JCQkJICAgTlVMTCAqLwotICAgICBjaGFyIGJzcjsJCQkvKiBzZXF1ZW50LWxpbmtlci1oYWNrOiAxIHdoZW4gcmVsb2NvYmplY3QgaXMKLQkJCQkgICBhIGJzciAqLwotICAgICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gICAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OwotCi17Ci0gIGZpeFMgKmZpeFAgPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwKLQkJCW9mZnNldCwgcGNyZWwsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJYml0X2ZpeFA/IE5PX1JFTE9DOiByZWxvYyhzaXplLCBwY3JlbCwgaW1fZGlzcCkKLSNlbHNlCi0JCQlOT19SRUxPQwotI2VuZGlmCi0JCQkpOwotCi0gIGZpeF9vcGNvZGVfZnJhZyhmaXhQKSA9IG9wY29kZV9mcmFnOwotICBmaXhfb3Bjb2RlX29mZnNldChmaXhQKSA9IG9wY29kZV9vZmZzZXQ7Ci0gIGZpeF9pbV9kaXNwKGZpeFApID0gaW1fZGlzcDsKLSAgZml4X2JzcihmaXhQKSA9IGJzcjsKLSAgZml4X2JpdF9maXhQKGZpeFApID0gYml0X2ZpeFA7Ci19CQkJCS8qIGZpeF9uZXdfbnMzMmsoKSAqLwotCi12b2lkCi1maXhfbmV3X25zMzJrX2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsCi0JCSAgIGltX2Rpc3AsIGJpdF9maXhQLCBic3IsIG9wY29kZV9mcmFnLCBvcGNvZGVfb2Zmc2V0KQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIgIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gICAgIGNoYXIgaW1fZGlzcDsJCS8qIHRydWUgaWYgdGhlIHZhbHVlIHRvIHdyaXRlIGlzIGEKLQkJCQkgICBkaXNwbGFjZW1lbnQgKi8KLSAgICAgYml0X2ZpeFMgKmJpdF9maXhQOwkvKiBwb2ludGVyIGF0IHN0cnVjdCBvZiBiaXRfZml4J3MsIGlnbm9yZWQgaWYKLQkJCQkgICBOVUxMICovCi0gICAgIGNoYXIgYnNyOwkJCS8qIHNlcXVlbnQtbGlua2VyLWhhY2s6IDEgd2hlbiByZWxvY29iamVjdCBpcwotCQkJCSAgIGEgYnNyICovCi0gICAgIGZyYWdTICpvcGNvZGVfZnJhZzsKLSAgICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQ7Ci17Ci0gIGZpeFMgKmZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJICAgIGJpdF9maXhQPyBOT19SRUxPQzogcmVsb2Moc2l6ZSwgcGNyZWwsIGltX2Rpc3ApCi0jZWxzZQotCQkJICAgIE5PX1JFTE9DCi0jZW5kaWYKLQkJCSAgICApOwotCi0gIGZpeF9vcGNvZGVfZnJhZyhmaXhQKSA9IG9wY29kZV9mcmFnOwotICBmaXhfb3Bjb2RlX29mZnNldChmaXhQKSA9IG9wY29kZV9vZmZzZXQ7Ci0gIGZpeF9pbV9kaXNwKGZpeFApID0gaW1fZGlzcDsKLSAgZml4X2JzcihmaXhQKSA9IGJzcjsKLSAgZml4X2JpdF9maXhQKGZpeFApID0gYml0X2ZpeFA7Ci19CQkJCS8qIGZpeF9uZXdfbnMzMmsoKSAqLwotCi0vKiBUaGlzIGlzIFRDX0NPTlNfRklYX05FVywgY2FsbGVkIGJ5IGVtaXRfZXhwciBpbiByZWFkLmMuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfbnMzMmsgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBleHByZXNzaW9uUyAqZXhwOwkJLyogRXhwcmVzc2lvbi4gKi8KLXsKLSAgZml4X25ld19uczMya19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsCi0JCSAgICAgMCwgMiwgMCwgMCwgMCwgMCk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/ICBPbiB0aGUKLSAgIG5zMzJrLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBsb25nIHJlczsKLSAgcmVzID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotICBpZiAoZnJhZ19ic3IoZml4UC0+ZnhfZnJhZykpCi0gICAgcmVzICs9IDB4MTIJCQkvKiBGT08gS2x1ZGdlIGFsZXJ0ISAqLwotI2VuZGlmCi0gICAgICByZXR1cm4gcmVzOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgY29kZSA9IHJlbG9jKGZpeHAtPmZ4X3NpemUsIGZpeHAtPmZ4X3BjcmVsLCBmaXhfaW1fZGlzcChmaXhwKSk7Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbC0+YWRkZW5kID0gMDsKLQotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAoIXJlbC0+aG93dG8pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9IF8oIjx1bmtub3duPiIpOwotICAgICAgYXNfZmF0YWwgKF8oIkNhbm5vdCBmaW5kIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVkIiksCi0JCW5hbWUsIChpbnQpIGNvZGUpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgT0JKX0FPVVQKLXZvaWQKLWNvbnNfZml4X25ld19uczMyayAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3RydWN0IGZpeCAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIC8qCi0gICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KLSAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KLSAgICovCi0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotICAgICAgIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAotCQkgICAgICA0KTsKLQotICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKLQkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSArIDQsCi0JCSAgICAgICgobG9uZykgKHJfc3ltYm9sbnVtKQotCQkgICAgICAgfCAobG9uZykgKGZpeFAtPmZ4X3BjcmVsIDw8IDI0KQotCQkgICAgICAgfCAobG9uZykgKG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXSA8PCAyNSkKLQkJICAgICAgIHwgKGxvbmcpICgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCAyNykKLQkJICAgICAgIHwgKGxvbmcpIChmaXhfYnNyKGZpeFApIDw8IDI4KQotCQkgICAgICAgfCAobG9uZykgKGZpeF9pbV9kaXNwKGZpeFApIDw8IDI5KSksCi0JCSAgICAgIDQpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLSNlbmRpZiAvKiBCRkRfQVNTTUVCTEVSICovCi0KLS8qIGVuZCBvZiB0Yy1uczMyay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW5zMzJrLmggYi9nYXMvY29uZmlnL3RjLW5zMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Yzg2ZWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1uczMyay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qIHRjLW5zMzJrLmggLS0gT3Bjb2RlIHRhYmxlIGZvciBOYXRpb25hbCBTZW1pIDMyayBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX05TMzJLCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JMAotCi0jZGVmaW5lIFRDX1BDUkVMX0FESlVTVChGKSBtZF9wY3JlbF9hZGp1c3QoRikKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKLQotI2RlZmluZSBUQVJHRVRfQVJDSAkJYmZkX2FyY2hfbnMzMmsKLQotI2lmbmRlZiBUQVJHRVRfRk9STUFUCQkvKiBNYXliZSBkZWZpbmVkIGluIHRlLSouaCAqLwotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtcGM1MzItbWFjaCIKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgTk9fUkVMT0MgMAotI2VuZGlmCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgImJpdF9maXguaCIKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZGVmaW5lIERFRl9NT0RFTCAyMQotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVDCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVMCi0jZGVmaW5lIERFRl9NT0RFTCAyMAotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0FSR1MgNAotI2RlZmluZSBBUkdfTEVOIDUwCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19uczMyawotZXh0ZXJuIHZvaWQgZml4X25ld19uczMya19leHAgUEFSQU1TKChmcmFnUyAqZnJhZywKLQkJCQkgICBpbnQgd2hlcmUsCi0JCQkJICAgaW50IHNpemUsCi0JCQkJICAgZXhwcmVzc2lvblMgKmV4cCwKLQkJCQkgICBpbnQgcGNyZWwsCi0JCQkJICAgaW50IGltX2Rpc3AsCi0JCQkJICAgYml0X2ZpeFMgKmJpdF9maXhQLAkvKiByZWFsbHkgYml0X2ZpeFMgKi8KLQkJCQkgICBpbnQgYnNyLAotCQkJCSAgIGZyYWdTICpvcGNvZGVfZnJhZywKLQkJCQkgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldCkpOwotCi0KLWV4dGVybiB2b2lkIGZpeF9uZXdfbnMzMmsgUEFSQU1TICgoZnJhZ1MgKmZyYWcsCi0JCQkJICAgaW50IHdoZXJlLAotCQkJCSAgIGludCBzaXplLAotCQkJCSAgIHN5bWJvbFMgKmFkZF9zeW1ib2wsCi0JCQkJICAgbG9uZyBvZmZzZXQsCi0JCQkJICAgaW50IHBjcmVsLAotCQkJCSAgIGludCBpbV9kaXNwLAotCQkJCSAgIGJpdF9maXhTICpiaXRfZml4UCwJLyogcmVhbGx5IGJpdF9maXhTICovCi0JCQkJICAgaW50IGJzciwKLQkJCQkgICBmcmFnUyAqb3Bjb2RlX2ZyYWcsCi0JCQkJICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQpKTsKLQotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X25zMzJrIFBBUkFNUyAoKGZyYWdTICpmcmFnLAotCQkJCQlpbnQgd2hlcmUsCi0JCQkJCWludCBzaXplLAotCQkJCQlleHByZXNzaW9uUyAqZXhwKSk7Ci0KLS8qIHRoZSBOUzMyeDMyIGhhcyBhIG5vbiAwIG5vcCBpbnN0cnVjdGlvbiB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhbGlnbnMgKi8KLSNkZWZpbmUgTk9QX09QQ09ERSAweGEyCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0jZGVmaW5lIFRDX0ZSQUdfVFlQRQkJCQlcCi1zdHJ1Y3QgewkJCQkJXAotICBmcmFnUyAqZnJfb3Bjb2RlX2ZyYWdQOwkJCVwKLSAgdW5zaWduZWQgaW50IGZyX29wY29kZV9vZmZzZXQ7CQlcCi0gIGNoYXIgZnJfYnNyOwkJCQkJXAotfQotCi0jZGVmaW5lIFRDX0ZSQUdfSU5JVChYKQkJCQlcCi0gIGRvCQkJCQkJXAotICAgICB7CQkJCQkJXAotICAgICAgIGZyYWdfb3Bjb2RlX2ZyYWcgKFgpID0gTlVMTDsJCVwKLSAgICAgICBmcmFnX29wY29kZV9vZmZzZXQgKFgpID0gMDsJCVwKLSAgICAgICBmcmFnX2JzciAoWCkgPSAwOwkJCQlcCi0gICAgIH0JCQkJCQlcCi0gIHdoaWxlKDApCi0KLS8qIEFjY2Vzc29yIG1hY3JvcyBmb3IgdGhpbmdzIHdoaWNoIG1heSBtb3ZlIGFyb3VuZCAqLwotI2RlZmluZSBmcmFnX29wY29kZV9mcmFnKFgpICAgKFgpLT50Y19mcmFnX2RhdGEuZnJfb3Bjb2RlX2ZyYWdQCi0jZGVmaW5lIGZyYWdfb3Bjb2RlX29mZnNldChYKSAoWCktPnRjX2ZyYWdfZGF0YS5mcl9vcGNvZGVfb2Zmc2V0Ci0jZGVmaW5lIGZyYWdfYnNyKFgpICAgICAgICAgICAoWCktPnRjX2ZyYWdfZGF0YS5mcl9ic3IKLQotI2RlZmluZSBUQ19GSVhfVFlQRQkJCQlcCi1zdHJ1Y3QJCQkJCQlcCi17CQkJCQkJXAotICBmcmFnUyAqb3Bjb2RlX2ZyYWdQOwkJCQlcCi0gIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OwkJCVwKLSAgdW5zaWduZWQgaW50IGJzciA6IDE7CQkJCVwKLX0KLQotLyogQWNjZXNzb3IgbWFjcm9zIGZvciB0aGluZ3Mgd2hpY2ggbWF5IG1vdmUgYXJvdW5kLgotICAgU2VlIGNvbW1lbnRzIGluIHdyaXRlLmguICAqLwotI2RlZmluZSBmaXhfaW1fZGlzcChYKSAgICAgICAoWCktPmZ4X2ltX2Rpc3AKLSNkZWZpbmUgZml4X2JpdF9maXhQKFgpICAgICAgKFgpLT5meF9iaXRfZml4UAotI2RlZmluZSBmaXhfb3Bjb2RlX2ZyYWcoWCkgICAoWCktPnRjX2ZpeF9kYXRhLm9wY29kZV9mcmFnUAotI2RlZmluZSBmaXhfb3Bjb2RlX29mZnNldChYKSAoWCktPnRjX2ZpeF9kYXRhLm9wY29kZV9vZmZzZXQKLSNkZWZpbmUgZml4X2JzcihYKSAgICAgICAgICAgKFgpLT50Y19maXhfZGF0YS5ic3IKLQotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKFgpCQkJXAotICBkbwkJCQkJCVwKLSAgICAgewkJCQkJCVwKLSAgICAgICBmaXhfb3Bjb2RlX2ZyYWcoWCkgPSBOVUxMOwkJXAotICAgICAgIGZpeF9vcGNvZGVfb2Zmc2V0KFgpID0gMDsJCVwKLSAgICAgICBmaXhfYnNyKFgpID0gMDsJCQkJXAotICAgICB9CQkJCQkJXAotICB3aGlsZSgwKQotCi0jZGVmaW5lIFRDX0ZJWF9EQVRBX1BSSU5UKEZJTEUsIEZJWFApCQkJCQlcCi0gIGRvCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBmcHJpbnRmKChGSUxFKSwgIm9wY29kZV9mcmFnPSVsZCwgb3BlcmFuZCBvZmZzZXQ9JWQsIGJzcj0lZFxuIiwJXAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBmaXhfb3Bjb2RlX2ZyYWcgKEZJWFApLAkJCVwKLQkgICAgICBmaXhfb3Bjb2RlX29mZnNldCAoRklYUCksCQkJCQlcCi0JICAgICAgZml4X2JzciAoRklYUCkpOwkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1wai5jIGIvZ2FzL2NvbmZpZy90Yy1wai5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjgwMzA5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcGouYworKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKi0KLSAgIHRjLXBqLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgUGljbyBKYXZhCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBUcmFuc21ldGEsIHNhY0Bwb2JveC5jb20gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BqLmgiCi0KLQotZXh0ZXJuIGNvbnN0IHBqX29wY19pbmZvX3QgcGpfb3BjX2luZm9bNTEyXTsKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIS8iOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIvISMiOwotCi1zdGF0aWMgaW50IHBlbmRpbmdfcmVsb2M7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsKLQkJCQkJCQotCi1zdGF0aWMgdm9pZAotbGl0dGxlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotfQotCi1zdGF0aWMgdm9pZAotYmlnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotfQotCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9IHsKLSAgeyJtbCIsICAgIGxpdHRsZSwgMH0sCi0gIHsibWIiLCAgICBiaWcsICAgIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLQotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLXZvaWQKLW1kX29wZXJhbmQgKG9wKQotICAgICBleHByZXNzaW9uUyAqb3A7Ci17Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIlaGkxNiIsIDUpID09IDApCi0gICAgewotICAgICAgaWYgKHBlbmRpbmdfcmVsb2MpCi0JYXNfYmFkIChfICgiY29uZnVzaW5nIHJlbG9jYXRpb24gZXhwcmVzc2lvbnMiKSk7Ci0gICAgICBwZW5kaW5nX3JlbG9jID0gQkZEX1JFTE9DX1BKX0NPREVfSEkxNjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotICAgICAgZXhwcmVzc2lvbiAob3ApOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIiVsbzE2IiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocGVuZGluZ19yZWxvYykKLQlhc19iYWQgKF8gKCJjb25mdXNpbmcgcmVsb2NhdGlvbiBleHByZXNzaW9ucyIpKTsKLSAgICAgIHBlbmRpbmdfcmVsb2MgPSBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2OwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBleHByZXNzaW9uIChvcCk7Ci0gICAgfQotfQotCi0vKiBQYXJzZSBhbiBleHByZXNzaW9uIGFuZCB0aGVuIHJlc3RvcmUgdGhlIGlucHV0IGxpbmUgcG9pbnRlci4gKi8KLQotc3RhdGljIGNoYXIgKgotcGFyc2VfZXhwX3NhdmVfaWxwIChzLCBvcCkKLSAgICAgY2hhciAqczsKLSAgICAgZXhwcmVzc2lvblMgKm9wOwotewotICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBleHByZXNzaW9uIChvcCk7Ci0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBzOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBlbWl0X2V4cHIgdmlhIFRDX0NPTlNfRklYX05FVyB3aGVuIGNyZWF0aW5nIGEKLSAgIHJlbG9jIGZvciBhIGNvbnMuICBXZSBjb3VsZCB1c2UgdGhlIGRlZmluaXRpb24gdGhlcmUsIGV4Y2VwdCB0aGF0Ci0gICB3ZSB3YW50IHRvIGhhbmRsZSBtYWdpYyBwZW5kaW5nIHJlbG9jIGV4cHJlc3Npb25zIHNwZWNpYWxseS4gICovCi0KLXZvaWQKLXBqX2NvbnNfZml4X25ld19waiAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgbmJ5dGVzOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBzdGF0aWMgaW50IHJ2WzVdWzJdID0gCi0gIHsgeyAwLCAwIH0sCi0gICAgeyBCRkRfUkVMT0NfOCwgQkZEX1JFTE9DXzggfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0RJUjE2LCBCRkRfUkVMT0NfMTYgfSwKLSAgICB7IDAsIDAgfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyLCBCRkRfUkVMT0NfMzIgfX07Ci0KLSAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCwgMCwgCi0JICAgICAgIHBlbmRpbmdfcmVsb2MgPyBwZW5kaW5nX3JlbG9jCi0JICAgICAgIDogcnYgW25ieXRlc11bKG5vd19zZWctPmZsYWdzICYgU0VDX0NPREUpID8gMCA6IDFdKTsKLQotICBwZW5kaW5nX3JlbG9jID0gMDsKLX0KLQotCi0vKiBUdXJuIGEgcmVsb2MgZGVzY3JpcHRpb24gY2hhcmFjdGVyIGZyb20gdGhlIHBqLW9wYy5oIHRhYmxlIGludG8KLSAgIGNvZGUgd2hpY2ggQkZEIGNhbiBoYW5kbGUuICovCi0KLXN0YXRpYyBpbnQKLWNfdG9fciAoeCkKLSAgICAgY2hhciB4OwotewotICBzd2l0Y2ggKHgpCi0gICAgewotICAgIGNhc2UgT19SODoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfOF9QQ1JFTDsKLSAgICBjYXNlIE9fVTg6Ci0gICAgY2FzZSBPXzg6Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzg7Ci0gICAgY2FzZSBPX1IxNjoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNjsKLSAgICBjYXNlIE9fVTE2OgotICAgIGNhc2UgT18xNjoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNjsKLSAgICBjYXNlIE9fUjMyOgotICAgICAgcmV0dXJuIEJGRF9SRUxPQ19QSl9DT0RFX1JFTDMyOwotICAgIGNhc2UgT18zMjoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfUEpfQ09ERV9ESVIzMjsKLSAgICB9Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotCi0KLQotLyogSGFuZGxlciBmb3IgdGhlIGlwdXNoIGZha2Ugb3Bjb2RlLAotICAgdHVybnMgaXB1c2ggPGZvbz4gaW50byBzaXB1c2ggbG8xNjxmb28+LCBzZXRoaSBoaTE2PGZvbz4uICovCi0KLXN0YXRpYyB2b2lkCi1pcHVzaF9jb2RlIChvcGNvZGUsIHN0cikKLSAgICAgcGpfb3BjX2luZm9fdCAqb3Bjb2RlIEFUVFJJQlVURV9VTlVTRUQ7IAotICAgICBjaGFyICpzdHI7Ci17Ci0gIGludCBtb2QgPSAwOwotICBjaGFyICpiID0gZnJhZ19tb3JlICg2KTsKLSAgZXhwcmVzc2lvblMgYXJnOwotICBiWzBdID0gMHgxMTsKLSAgYlszXSA9IDB4ZWQ7Ci0gIHBhcnNlX2V4cF9zYXZlX2lscCAoc3RyICsgMSwgJmFyZywgJm1vZCk7Ci0gIGlmIChtb2QpCi0gICAgYXNfYmFkIChfICgiY2FuJ3QgaGF2ZSByZWxvY2F0aW9uIGZvciBpcHVzaCIpKTsKLQotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgYiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgMSwgMiwgCi0JICAgICAgICZhcmcsICAwLCBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNik7Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgYiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgNCwgMiwKLQkgICAgICAgJmFyZywgIDAsIEJGRF9SRUxPQ19QSl9DT0RFX0hJMTYpOwotfQotCi0vKiBJbnNlcnQgbmFtZXMgaW50byB0aGUgb3Bjb2RlIHRhYmxlIHdoaWNoIGFyZSByZWFsbHkgbWluaSBtYWNyb3MsCi0gICBub3Qgb3Bjb2Rlcy4gIFRoZSBmYWtlbmVzcyBpcyBpbmlkaWNhdGVkIHdpdGggYW4gb3Bjb2RlIG9mIC0xLiAqLwotCi1zdGF0aWMgdm9pZAotICAgICBmYWtlX29wY29kZSAobmFtZSwgZnVuYykgY29uc3QgY2hhciAqCi0gICAgICAgbmFtZTsKLSAgICAgdm9pZCAoKmZ1bmMpICgpOwotewotICBwal9vcGNfaW5mb190ICpmYWtlID0gKHBqX29wY19pbmZvX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChwal9vcGNfaW5mb190KSk7Ci0KLSAgZmFrZS0+b3Bjb2RlID0gLTE7Ci0gIGZha2UtPm9wY29kZV9uZXh0ID0gLTE7Ci0gIGZha2UtPm5hbWUgPSAoY29uc3QgY2hhciAqKSBmdW5jOwotICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSwgKGNoYXIgKikgZmFrZSk7Ci19Ci0KLQotLyogRW50ZXIgYW5vdGhlciBlbnRyeSBpbnRvIHRoZSBvcGNvZGUgaGFzaCB0YWJsZSBzbyB0aGUgc2FtZSBvcGNvZGUKLSAgIGNhbiBoYXZlIGFub3RoZXIgbmFtZS4gKi8KLXN0YXRpYyB2b2lkCi0gICAgIGFsaWFzIChuZXcsIG9sZCkgY29uc3QgY2hhciAqCi0gICAgICAgbmV3OwotICAgICBjb25zdCBjaGFyICpvbGQ7Ci17Ci0gIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBuZXcsCi0JICAgICAgIChjaGFyICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb2xkKSk7Ci19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNldHMKLSAgIHVwIHRoZSBoYXNoIHRhYmxlIHdpdGggYWxsIHRoZSBvcGNvZGVzIGluIGl0LCBhbmQgYWxzbyBpbml0aWFsaXplcwotICAgc29tZSBhbGlhc2VzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4gKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgcGpfb3BjX2luZm9fdCAqb3Bjb2RlOwotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IHBqX29wY19pbmZvOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0KLSAgLyogSW5zZXJ0IHRoZSBvbmx5IGZha2Ugb3Bjb2RlLiAqLwotICBmYWtlX29wY29kZSAoImlwdXNoIiwgaXB1c2hfY29kZSk7Ci0KLSAgLyogQWRkIHNvbWUgYWxpYXNlcyBmb3Igb3Bjb2RlIG5hbWVzLiAqLwotICBhbGlhcyAoImlmZXFfcyIsICJpZmVxIik7Ci0gIGFsaWFzICgiaWZuZV9zIiwgImlmbmUiKTsKLSAgYWxpYXMgKCJpZl9pY21wZ2VfcyIsICJpZl9pY21wZ2UiKTsKLSAgYWxpYXMgKCJpZl9pY21wbmVfcyIsICJpZl9pY21wbmUiKTsKLSAgYWxpYXMgKCJpZl9pY21wZXFfcyIsICJpZl9pY21wZXEiKTsKLSAgYWxpYXMgKCJpZl9pY21wZ3RfcyIsICJpZl9pY21wZ3QiKTsKLSAgYWxpYXMgKCJnb3RvX3MiLCAiZ290byIpOwotCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCAwKTsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX3N0YXJ0OwotICB1bnNpZ25lZCBjaGFyICpvcF9lbmQ7Ci0KLSAgLy8gIHBqX29wZXJhbl9pbmZvIG9wZXJhbmRbM107Ci0gIHBqX29wY19pbmZvX3QgKm9wY29kZTsKLSAgY2hhciAqb3V0cHV0OwotICBpbnQgaWR4ID0gMDsKLSAgY2hhciBwZW5kOwotCi0gIGludCBubGVuID0gMDsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopIChzdHIpOwotICAgICAgICpvcF9lbmQgJiYgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKSAKLSAgICBubGVuKys7Ci0KLSAgcGVuZCA9ICpvcF9lbmQ7Ci0gICpvcF9lbmQgPSAwOwotCi0gIGlmIChubGVuID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfICgiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLQotICBvcGNvZGUgPSAocGpfb3BjX2luZm9fdCAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wX3N0YXJ0KTsKLSAgKm9wX2VuZCA9IHBlbmQ7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXyAoInVua25vd24gb3Bjb2RlICVzIiksIG9wX3N0YXJ0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZS0+b3Bjb2RlID09IC0xKQotICAgIHsKLSAgICAgIC8qIEl0J3MgYSBmYWtlIG9wY29kZS4uIGRpZyBvdXQgdGhlIGFyZ3MgYW5kIHByZXRlbmQgdGhhdCB3YXMKLSAgICAgICAgIHdoYXQgd2Ugd2VyZSBwYXNzZWQgKi8KLSAgICAgICgodm9pZCAoKikoKSkgb3Bjb2RlLT5uYW1lKSAob3Bjb2RlLCBvcF9lbmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBhbjsKLQotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlIChvcGNvZGUtPmxlbik7Ci0gICAgICBvdXRwdXRbaWR4KytdID0gb3Bjb2RlLT5vcGNvZGU7Ci0KLSAgICAgIGlmIChvcGNvZGUtPm9wY29kZV9uZXh0ICE9IC0xKQotCW91dHB1dFtpZHgrK10gPSBvcGNvZGUtPm9wY29kZV9uZXh0OwotCi0gICAgICBmb3IgKGFuID0gMDsgb3Bjb2RlLT5hcmdbYW5dOyBhbisrKQotCXsKLQkgIGV4cHJlc3Npb25TIGFyZzsKLQotCSAgaWYgKCpvcF9lbmQgPT0gJywnICYmIGFuICE9IDApCi0JICAgIG9wX2VuZCsrOwotCi0JICBpZiAoKm9wX2VuZCA9PSAwKQotCSAgICBhc19iYWQgKCJleHBlY3RlZCBleHByZXNzc2lvbiIpOwotCi0JICBvcF9lbmQgPSBwYXJzZV9leHBfc2F2ZV9pbHAgKG9wX2VuZCwgJmFyZyk7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgCi0JCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGlkeCwKLQkJICAgICAgIEFTSVpFIChvcGNvZGUtPmFyZ1thbl0pLAotCQkgICAgICAgJmFyZywKLQkJICAgICAgIFBDUkVMIChvcGNvZGUtPmFyZ1thbl0pLCAKLQkJICAgICAgIHBlbmRpbmdfcmVsb2MgPyBwZW5kaW5nX3JlbG9jIDogY190b19yIChvcGNvZGUtPmFyZ1thbl0pKTsKLQotCSAgaWR4ICs9IEFTSVpFIChvcGNvZGUtPmFyZ1thbl0pOwotCSAgcGVuZGluZ19yZWxvYyA9IDA7Ci0JfQotCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKm9wX2VuZCkpCi0Jb3BfZW5kKys7Ci0KLSAgICAgIGlmICgqb3BfZW5kICE9IDApCi0JYXNfd2FybiAoImV4dHJhIHN0dWZmIG9uIGxpbmUgaWdub3JlZCIpOwotCi0gICAgfQotCi0gIGlmIChwZW5kaW5nX3JlbG9jKQotICAgIGFzX2JhZCAoIlNvbWV0aGluZyBmb3Jnb3QgdG8gY2xlYW4gdXBcbiIpOwotCi19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfICgiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogMjsKLQotICBpZiAoIXRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotDAotCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotCi0jZGVmaW5lIE9QVElPTl9MSVRUTEUgKE9QVElPTl9NRF9CQVNFKQotI2RlZmluZSBPUFRJT05fQklHICAgIChPUFRJT05fTElUVExFICsgMSkKLQotICB7ImxpdHRsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFfSwKLSAgeyJiaWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJR30sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnIEFUVFJJQlVURV9VTlVTRUQ7IAotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX0xJVFRMRToKLSAgICAgIGxpdHRsZSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0JJRzoKLSAgICAgIGJpZyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfICgiXAotUEogb3B0aW9uczpcblwKLS1saXR0bGUJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcblwKLS1iaWcJCQlnZW5lcmF0ZSBiaWcgZW5kaWFuIGNvZGVcbiIpKTsKLX0KLQotCi0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGxvbmcgdmFsID0gKnZhbHA7Ci0gIGxvbmcgbWF4LCBtaW47Ci0gIGludCBzaGlmdDsKLQotCi0gIC8qIGFkanVzdF9yZWxvY19zeW1zIHdvbid0IGNvbnZlcnQgYSByZWxvYyBhZ2FpbnN0IGEgd2VhayBzeW1ib2wKLSAgICAgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLCBidXQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsCi0gICAgIHNjcmV3IHVwIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc28gd2UgaGF2ZSB0byBhZGp1c3QgdmFsIGhlcmUKLSAgICAgdG8gYXZvaWQgdGhlIHNjcmV3IHVwIGxhdGVyLiAgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCAmJiBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB2YWwgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLQotICBtYXggPSBtaW4gPSAwOwotICBzaGlmdCA9IDA7Ci0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNjoKLSAgICAgIGlmICh2YWwgPCAtMHg4MDAwIHx8IHZhbCA+PSAweDdmZmYpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfICgicGNyZWwgdG9vIGZhciIpKTsKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDgpICYgMHhmZjsKLSAgICAgIGJ1ZlsxXSA9IHZhbCAmIDB4ZmY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1BKX0NPREVfSEkxNjoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAyNDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbCAmIDB4ZmZmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19QSl9DT0RFX0xPMTY6Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gODsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAwOwotCi0gICAgICBtYXggPSAweGZmZmY7Ci0gICAgICBtaW4gPSAtMHhmZmZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgbWF4ID0gMHhmZjsKLSAgICAgIG1pbiA9IC0weGZmOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyOgotICAgICAgKmJ1ZisrID0gdmFsID4+IDI0OwotICAgICAgKmJ1ZisrID0gdmFsID4+IDE2OwotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDI0OwotCSAgKmJ1ZisrID0gdmFsID4+IDE2OwotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgICpidWYrKyA9IHZhbCA+PiAwOwotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0JICAqYnVmKysgPSB2YWwgPj4gMjQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQkgICpidWYrKyA9IHZhbCA+PiAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChtYXggIT0gMCAmJiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkpCi0gICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfICgib2Zmc2V0IG91dCBvZiByYW5nZSIpKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyLiAgQWx3YXlzIHB1dCB2YWx1ZXMgaW4gYW4KLSAgIGV4ZWN1dGFibGUgc2VjdGlvbiBpbnRvIGJpZyBlbmRpYW4gb3JkZXIuICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKLSAgICAgY2hhciAqcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4gfHwgbm93X3NlZy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotCi0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWw7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgcl90eXBlID0gZml4cC0+Znhfcl90eXBlOwotICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByX3R5cGUpOwotCi0gIGlmIChyZWwtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXyAoIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocl90eXBlKSk7Ci0gICAgICAvKiBTZXQgaG93dG8gdG8gYSBnYXJiYWdlIHZhbHVlIHNvIHRoYXQgd2UgY2FuIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfMzIpOwotICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvICE9IE5VTEwpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1wai5oIGIvZ2FzL2NvbmZpZy90Yy1wai5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmJmN2I3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcGouaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qLVRoaXMgZmlsZSBpcyB0Yy1wai5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgVHJhbnNtZXRhLCBzYWNAcG9ib3guY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4sIG9mIFRyYW5zbWV0YS4gc2FjQHBvYm94LmNvbS4gKi8KLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX3BqCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImVsZjMyLXBqIiA6ICJlbGYzMi1wamwiKQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAgICAgICAgICAgICAgICAgICAgCQkJCVwKLSAgKHRhcmdldF9iaWdfZW5kaWFuICAgICAgICAgICAgICAgICAgICAgIAkJCQlcCi0gICA/ICJQaWNvIEphdmEgR0FTIEJpZyBFbmRpYW4iICAgICAgICAgICAJCQkJXAotICAgOiAiUGljbyBKYXZhIEdBUyBMaXR0bGUgRW5kaWFuIikKLQotCi12b2lkIHBqX2NvbnNfZml4X25ld19waiBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBpbnQsIGludCwgZXhwcmVzc2lvblMgKikpOwotYXJlbGVudCAqdGNfZ2VuX3JlbG9jIFBBUkFNUygoYXNlY3Rpb24gKnNlY3Rpb24sIHN0cnVjdCBmaXggKmZpeHApKTsKLQotI2RlZmluZSBtZF9zZWN0aW9uX2FsaWduKFNFR01FTlQsIFNJWkUpICAgICAoU0laRSkKLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKEIsIFMsIEYpICAgICAgICAgICAgKGFzX2ZhdGFsIChfKCJjb252ZXJ0X2ZyYWdcbiIpKSwgMCkKLSNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoQSwgQikgKGFzX2ZhdGFsIChfKCJlc3RpbWF0ZSBzaXplXG4iKSksMCkKLSNkZWZpbmUgbWRfdW5kZWZpbmVkX3N5bWJvbChOQU1FKSAgICAgICAgICAgMAotCi0vKiBQQyByZWxhdGl2ZSBvcGVyYW5kcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvcGNvZGUsIGFuZCB0aGUgb3BlcmFuZAotICAgaXMgYWx3YXlzIG9uZSBieXRlIGludG8gdGhlIG9wY29kZS4gKi8KLQotI2RlZmluZSBtZF9wY3JlbF9mcm9tKEZJWFApIAkJCQkJCVwKLQkoKEZJWFApLT5meF93aGVyZSArIChGSVhQKS0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIDEpCi0KLQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcoRlJBRywgV0hFUkUsIE5CWVRFUywgRVhQKSBcCi0JcGpfY29uc19maXhfbmV3X3BqKEZSQUcsIFdIRVJFLCBOQllURVMsIEVYUCkKLQotLyogQWx3YXlzIGxlYXZlIHZ0YWJsZSByZWxvY3MgdW50b3VjaGVkIGluIHRoZSBvdXRwdXQuICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICAgICAgICAgICgoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCAgICAgICAgICAgCVwKLQkgICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKEZJWCkgCQkJCQlcCi0gICAgICAgICAgKCEgKChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUICAgICAgICAgCVwKLQkgICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpKQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1wcGMuYyBiL2dhcy9jb25maWcvdGMtcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOGEyNzQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMjYgKzAsMCBAQAotLyogdGMtcHBjLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBQb3dlclBDIG9yIFBPV0VSIChSUy82MDAwKQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9wcGMuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIGFzc2VtYmxlciBmb3IgdGhlIFBvd2VyUEMgb3IgUE9XRVIgKFJTLzYwMDApIGNoaXBzLiAgKi8KLQotLyogVGVsbCB0aGUgbWFpbiBjb2RlIHdoYXQgdGhlIGVuZGlhbm5lc3MgaXMuICAqLwotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotLyogV2hldGhlciBvciBub3QsIHdlJ3ZlIHNldCB0YXJnZXRfYmlnX2VuZGlhbi4gICovCi1zdGF0aWMgaW50IHNldF90YXJnZXRfZW5kaWFuID0gMDsKLQotLyogV2hldGhlciB0byB1c2UgdXNlciBmcmllbmRseSByZWdpc3RlciBuYW1lcy4gICovCi0jaWZuZGVmIFRBUkdFVF9SRUdfTkFNRVNfUAotI2lmZGVmIFRFX1BFCi0jZGVmaW5lIFRBUkdFVF9SRUdfTkFNRVNfUCB0cnVlCi0jZWxzZQotI2RlZmluZSBUQVJHRVRfUkVHX05BTUVTX1AgZmFsc2UKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHJlZ19uYW1lc19wID0gVEFSR0VUX1JFR19OQU1FU19QOwotCi1zdGF0aWMgYm9vbGVhbiByZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIHBwY19zZXRfY3B1IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBwY19pbnNlcnRfb3BlcmFuZAotICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc24sIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQsCi0JICAgb2Zmc2V0VCB2YWwsIGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKSk7Ci1zdGF0aWMgdm9pZCBwcGNfbWFjcm8gUEFSQU1TICgoY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm8pKTsKLXN0YXRpYyB2b2lkIHBwY19ieXRlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCBwcGNfaXNfdG9jX3N5bSBQQVJBTVMgKChzeW1ib2xTICpzeW0pKTsKLXN0YXRpYyB2b2lkIHBwY190YyBQQVJBTVMgKChpbnQpKTsKLQotI2lmZGVmIE9CSl9YQ09GRgotc3RhdGljIHZvaWQgcHBjX2NvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmllaSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19icyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lcyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19jc2VjdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19jaGFuZ2VfY3NlY3QgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcGNfZnVuY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZXh0ZXJuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2xnbG9ibCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX25hbWVkX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfc3RhYnggUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcmVuYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3RvYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY194Y29mZl9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3ZieXRlIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHBwY19lbGZfc3VmZml4IFBBUkFNUyAoKGNoYXIgKiosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfcmRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX2xjb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl92YWxpZGF0ZV9maXggUEFSQU1TICgoZml4UyAqLCBzZWdUKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi1zdGF0aWMgdm9pZCBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7Ci1zdGF0aWMgdm9pZCBwcGNfcHJldmlvdXMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfeWRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcmVsZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19yZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY191YWxvbmcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfem5vcCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19wZV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BlX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfZnVuY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfdG9jZCBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotDAotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsCi0gICB0YXJnZXRzLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLS8qIFRoaXMgc3RyaW5nIGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gIFRoZSBtYWNybwotICAgdGNfY29tbWVudF9jaGFycyBwb2ludHMgdG8gdGhpcy4gIFdlIHVzZSB0aGlzLCByYXRoZXIgdGhhbiB0aGUKLSAgIHVzdWFsIGNvbW1lbnRfY2hhcnMsIHNvIHRoYXQgd2UgY2FuIHN3aXRjaCBmb3IgU29sYXJpcyBjb252ZW50aW9ucy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBwcGNfc29sYXJpc19jb21tZW50X2NoYXJzW10gPSAiIyEiOwotc3RhdGljIGNvbnN0IGNoYXIgcHBjX2VhYmlfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0jaWZkZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotY29uc3QgY2hhciAqcHBjX2NvbW1lbnRfY2hhcnMgPSBwcGNfc29sYXJpc19jb21tZW50X2NoYXJzOwotI2Vsc2UKLWNvbnN0IGNoYXIgKnBwY19jb21tZW50X2NoYXJzID0gcHBjX2VhYmlfY29tbWVudF9jaGFyczsKLSNlbmRpZgotI2Vsc2UKLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotI2VuZGlmCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYQotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwKLSAgIGFzIGluIDBkMS4wLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotDAotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICAvKiBQc2V1ZG8tb3BzIHdoaWNoIG11c3QgYmUgb3ZlcnJpZGRlbi4gICovCi0gIHsgImJ5dGUiLAlwcGNfYnl0ZSwJMCB9LAotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gIC8qIFBzZXVkby1vcHMgc3BlY2lmaWMgdG8gdGhlIFJTLzYwMDAgWENPRkYgZm9ybWF0LiAgU29tZSBvZiB0aGVzZQotICAgICBsZWdpdGltYXRlbHkgYmVsb25nIGluIHRoZSBvYmotKi5jIGZpbGUuICBIb3dldmVyLCBYQ09GRiBpcyBiYXNlZAotICAgICBvbiBDT0ZGLCBhbmQgaXMgb25seSBpbXBsZW1lbnRlZCBmb3IgdGhlIFJTLzYwMDAuICBXZSBqdXN0IHVzZQotICAgICBvYmotY29mZi5jLCBhbmQgYWRkIHdoYXQgd2UgbmVlZCBoZXJlLiAgKi8KLSAgeyAiY29tbSIsCXBwY19jb21tLAkwIH0sCi0gIHsgImxjb21tIiwJcHBjX2NvbW0sCTEgfSwKLSAgeyAiYmIiLAlwcGNfYmIsCQkwIH0sCi0gIHsgImJjIiwJcHBjX2JjLAkJMCB9LAotICB7ICJiZiIsCXBwY19iZiwJCTAgfSwKLSAgeyAiYmkiLAlwcGNfYmllaSwJMCB9LAotICB7ICJicyIsCXBwY19icywJCTAgfSwKLSAgeyAiY3NlY3QiLAlwcGNfY3NlY3QsCTAgfSwKLSAgeyAiZGF0YSIsCXBwY19zZWN0aW9uLAknZCcgfSwKLSAgeyAiZWIiLAlwcGNfZWIsCQkwIH0sCi0gIHsgImVjIiwJcHBjX2VjLAkJMCB9LAotICB7ICJlZiIsCXBwY19lZiwJCTAgfSwKLSAgeyAiZWkiLAlwcGNfYmllaSwJMSB9LAotICB7ICJlcyIsCXBwY19lcywJCTAgfSwKLSAgeyAiZXh0ZXJuIiwJcHBjX2V4dGVybiwJMCB9LAotICB7ICJmdW5jdGlvbiIsCXBwY19mdW5jdGlvbiwJMCB9LAotICB7ICJsZ2xvYmwiLAlwcGNfbGdsb2JsLAkwIH0sCi0gIHsgInJlbmFtZSIsCXBwY19yZW5hbWUsCTAgfSwKLSAgeyAic2VjdGlvbiIsCXBwY19uYW1lZF9zZWN0aW9uLCAwIH0sCi0gIHsgInN0YWJ4IiwJcHBjX3N0YWJ4LAkwIH0sCi0gIHsgInRleHQiLAlwcGNfc2VjdGlvbiwJJ3QnIH0sCi0gIHsgInRvYyIsCXBwY190b2MsCTAgfSwKLSAgeyAibG9uZyIsCXBwY194Y29mZl9jb25zLAkyIH0sCi0gIHsgIndvcmQiLAlwcGNfeGNvZmZfY29ucywJMSB9LAotICB7ICJzaG9ydCIsCXBwY194Y29mZl9jb25zLAkxIH0sCi0gIHsgInZieXRlIiwgICAgcHBjX3ZieXRlLAkwIH0sCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgeyAibG9uZyIsCXBwY19lbGZfY29ucywJNCB9LAotICB7ICJ3b3JkIiwJcHBjX2VsZl9jb25zLAkyIH0sCi0gIHsgInNob3J0IiwJcHBjX2VsZl9jb25zLAkyIH0sCi0gIHsgInJkYXRhIiwJcHBjX2VsZl9yZGF0YSwJMCB9LAotICB7ICJyb2RhdGEiLAlwcGNfZWxmX3JkYXRhLAkwIH0sCi0gIHsgImxjb21tIiwJcHBjX2VsZl9sY29tbSwJMCB9LAotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotICAvKiBQc2V1ZG8tb3BzIHNwZWNpZmljIHRvIHRoZSBXaW5kb3dzIE5UIFBvd2VyUEMgUEUgKGNvZmYpIGZvcm1hdCAqLwotICB7ICJwcmV2aW91cyIsIHBwY19wcmV2aW91cywgICAwIH0sCi0gIHsgInBkYXRhIiwgICAgcHBjX3BkYXRhLCAgICAgIDAgfSwKLSAgeyAieWRhdGEiLCAgICBwcGNfeWRhdGEsICAgICAgMCB9LAotICB7ICJyZWxkYXRhIiwgIHBwY19yZWxkYXRhLCAgICAwIH0sCi0gIHsgInJkYXRhIiwgICAgcHBjX3JkYXRhLCAgICAgIDAgfSwKLSAgeyAidWFsb25nIiwgICBwcGNfdWFsb25nLCAgICAgMCB9LAotICB7ICJ6bm9wIiwgICAgIHBwY196bm9wLCAgICAgICAwIH0sCi0gIHsgImNvbW0iLAlwcGNfcGVfY29tbSwJMCB9LAotICB7ICJsY29tbSIsCXBwY19wZV9jb21tLAkxIH0sCi0gIHsgInNlY3Rpb24iLCAgcHBjX3BlX3NlY3Rpb24sIDAgfSwKLSAgeyAiZnVuY3Rpb24iLAlwcGNfcGVfZnVuY3Rpb24sMCB9LAotICB7ICJ0b2NkIiwgICAgIHBwY19wZV90b2NkLCAgICAwIH0sCi0jZW5kaWYKLQotICAvKiBUaGlzIHBzZXVkby1vcCBpcyB1c2VkIGV2ZW4gd2hlbiBub3QgZ2VuZXJhdGluZyBYQ09GRiBvdXRwdXQuICAqLwotICB7ICJ0YyIsCXBwY190YywJCTAgfSwKLQotICB7IE5VTEwsCU5VTEwsCQkwIH0KLX07Ci0KLQwKLS8qIFByZWRlZmluZWQgcmVnaXN0ZXIgbmFtZXMgaWYgLW1yZWduYW1lcyAob3IgZGVmYXVsdCBmb3IgV2luZG93cyBOVCkuICAqLwotLyogSW4gZ2VuZXJhbCwgdGhlcmUgYXJlIGxvdHMgb2YgdGhlbSwgaW4gYW4gYXR0ZW1wdCB0byBiZSBjb21wYXRpYmxlICovCi0vKiB3aXRoIGEgbnVtYmVyIG9mIG90aGVyIFdpbmRvd3MgTlQgYXNzZW1ibGVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHBkX3JlZwotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgdmFsdWU7Ci0gIH07Ci0KLS8qIExpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHByZS1kZWZpbmVkOgotCi0gICBFYWNoIGdlbmVyYWwgcmVnaXN0ZXIgaGFzIHByZWRlZmluZWQgbmFtZXMgb2YgdGhlIGZvcm06Ci0gICAxLiByPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotICAgMi4gci48cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0KLQotICAgRWFjaCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBoYXMgcHJlZGVmaW5lZCBuYW1lcyBvZiB0aGUgZm9ybToKLSAgIDEuIGY8cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0gICAyLiBmLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLQotICAgRWFjaCBjb25kaXRpb24gcmVnaXN0ZXIgaGFzIHByZWRlZmluZWQgbmFtZXMgb2YgdGhlIGZvcm06Ci0gICAxLiBjcjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLSAgIDIuIGNyLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLQotICAgVGhlcmUgYXJlIGluZGl2aWR1YWwgcmVnaXN0ZXJzIGFzIHdlbGw6Ci0gICBzcCBvciByLnNwICAgICBoYXMgdGhlIHZhbHVlIDEKLSAgIHJ0b2Mgb3Igci50b2MgIGhhcyB0aGUgdmFsdWUgMgotICAgZnBzY3IgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAwCi0gICB4ZXIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDEKLSAgIGxyICAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgOAotICAgY3RyICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSA5Ci0gICBwbXIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDAKLSAgIGRhciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMTkKLSAgIGRzaXNyICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMTgKLSAgIGRlYyAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjIKLSAgIHNkcjEgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjUKLSAgIHNycjAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjYKLSAgIHNycjEgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjcKLQotICAgVGhlIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiY3IuMCIsIDAgfSwgICAgLyogQ29uZGl0aW9uIFJlZ2lzdGVycyAqLwotICB7ICJjci4xIiwgMSB9LAotICB7ICJjci4yIiwgMiB9LAotICB7ICJjci4zIiwgMyB9LAotICB7ICJjci40IiwgNCB9LAotICB7ICJjci41IiwgNSB9LAotICB7ICJjci42IiwgNiB9LAotICB7ICJjci43IiwgNyB9LAotCi0gIHsgImNyMCIsIDAgfSwKLSAgeyAiY3IxIiwgMSB9LAotICB7ICJjcjIiLCAyIH0sCi0gIHsgImNyMyIsIDMgfSwKLSAgeyAiY3I0IiwgNCB9LAotICB7ICJjcjUiLCA1IH0sCi0gIHsgImNyNiIsIDYgfSwKLSAgeyAiY3I3IiwgNyB9LAotCi0gIHsgImN0ciIsIDkgfSwKLQotICB7ICJkYXIiLCAxOSB9LCAgICAvKiBEYXRhIEFjY2VzcyBSZWdpc3RlciAqLwotICB7ICJkZWMiLCAyMiB9LCAgICAvKiBEZWNyZW1lbnRlciAqLwotICB7ICJkc2lzciIsIDE4IH0sICAvKiBEYXRhIFN0b3JhZ2UgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotCi0gIHsgImYuMCIsIDAgfSwgICAgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLwotICB7ICJmLjEiLCAxIH0sIAotICB7ICJmLjEwIiwgMTAgfSwgCi0gIHsgImYuMTEiLCAxMSB9LCAKLSAgeyAiZi4xMiIsIDEyIH0sIAotICB7ICJmLjEzIiwgMTMgfSwgCi0gIHsgImYuMTQiLCAxNCB9LCAKLSAgeyAiZi4xNSIsIDE1IH0sIAotICB7ICJmLjE2IiwgMTYgfSwgCi0gIHsgImYuMTciLCAxNyB9LCAKLSAgeyAiZi4xOCIsIDE4IH0sIAotICB7ICJmLjE5IiwgMTkgfSwgCi0gIHsgImYuMiIsIDIgfSwgCi0gIHsgImYuMjAiLCAyMCB9LCAKLSAgeyAiZi4yMSIsIDIxIH0sIAotICB7ICJmLjIyIiwgMjIgfSwgCi0gIHsgImYuMjMiLCAyMyB9LCAKLSAgeyAiZi4yNCIsIDI0IH0sIAotICB7ICJmLjI1IiwgMjUgfSwgCi0gIHsgImYuMjYiLCAyNiB9LCAKLSAgeyAiZi4yNyIsIDI3IH0sIAotICB7ICJmLjI4IiwgMjggfSwgCi0gIHsgImYuMjkiLCAyOSB9LCAKLSAgeyAiZi4zIiwgMyB9LCAKLSAgeyAiZi4zMCIsIDMwIH0sCi0gIHsgImYuMzEiLCAzMSB9LAotICB7ICJmLjQiLCA0IH0sIAotICB7ICJmLjUiLCA1IH0sIAotICB7ICJmLjYiLCA2IH0sIAotICB7ICJmLjciLCA3IH0sIAotICB7ICJmLjgiLCA4IH0sIAotICB7ICJmLjkiLCA5IH0sIAotCi0gIHsgImYwIiwgMCB9LCAKLSAgeyAiZjEiLCAxIH0sIAotICB7ICJmMTAiLCAxMCB9LCAKLSAgeyAiZjExIiwgMTEgfSwgCi0gIHsgImYxMiIsIDEyIH0sIAotICB7ICJmMTMiLCAxMyB9LCAKLSAgeyAiZjE0IiwgMTQgfSwgCi0gIHsgImYxNSIsIDE1IH0sIAotICB7ICJmMTYiLCAxNiB9LCAKLSAgeyAiZjE3IiwgMTcgfSwgCi0gIHsgImYxOCIsIDE4IH0sIAotICB7ICJmMTkiLCAxOSB9LCAKLSAgeyAiZjIiLCAyIH0sIAotICB7ICJmMjAiLCAyMCB9LCAKLSAgeyAiZjIxIiwgMjEgfSwgCi0gIHsgImYyMiIsIDIyIH0sIAotICB7ICJmMjMiLCAyMyB9LCAKLSAgeyAiZjI0IiwgMjQgfSwgCi0gIHsgImYyNSIsIDI1IH0sIAotICB7ICJmMjYiLCAyNiB9LCAKLSAgeyAiZjI3IiwgMjcgfSwgCi0gIHsgImYyOCIsIDI4IH0sIAotICB7ICJmMjkiLCAyOSB9LCAKLSAgeyAiZjMiLCAzIH0sIAotICB7ICJmMzAiLCAzMCB9LAotICB7ICJmMzEiLCAzMSB9LAotICB7ICJmNCIsIDQgfSwgCi0gIHsgImY1IiwgNSB9LCAKLSAgeyAiZjYiLCA2IH0sIAotICB7ICJmNyIsIDcgfSwgCi0gIHsgImY4IiwgOCB9LCAKLSAgeyAiZjkiLCA5IH0sIAotCi0gIHsgImZwc2NyIiwgMCB9LAotCi0gIHsgImxyIiwgOCB9LCAgICAgLyogTGluayBSZWdpc3RlciAqLwotCi0gIHsgInBtciIsIDAgfSwKLQotICB7ICJyLjAiLCAwIH0sICAgIC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlcnMgKi8KLSAgeyAici4xIiwgMSB9LAotICB7ICJyLjEwIiwgMTAgfSwKLSAgeyAici4xMSIsIDExIH0sCi0gIHsgInIuMTIiLCAxMiB9LAotICB7ICJyLjEzIiwgMTMgfSwKLSAgeyAici4xNCIsIDE0IH0sCi0gIHsgInIuMTUiLCAxNSB9LAotICB7ICJyLjE2IiwgMTYgfSwKLSAgeyAici4xNyIsIDE3IH0sCi0gIHsgInIuMTgiLCAxOCB9LAotICB7ICJyLjE5IiwgMTkgfSwKLSAgeyAici4yIiwgMiB9LAotICB7ICJyLjIwIiwgMjAgfSwKLSAgeyAici4yMSIsIDIxIH0sCi0gIHsgInIuMjIiLCAyMiB9LAotICB7ICJyLjIzIiwgMjMgfSwKLSAgeyAici4yNCIsIDI0IH0sCi0gIHsgInIuMjUiLCAyNSB9LAotICB7ICJyLjI2IiwgMjYgfSwKLSAgeyAici4yNyIsIDI3IH0sCi0gIHsgInIuMjgiLCAyOCB9LAotICB7ICJyLjI5IiwgMjkgfSwKLSAgeyAici4zIiwgMyB9LAotICB7ICJyLjMwIiwgMzAgfSwKLSAgeyAici4zMSIsIDMxIH0sCi0gIHsgInIuNCIsIDQgfSwKLSAgeyAici41IiwgNSB9LAotICB7ICJyLjYiLCA2IH0sCi0gIHsgInIuNyIsIDcgfSwKLSAgeyAici44IiwgOCB9LAotICB7ICJyLjkiLCA5IH0sCi0KLSAgeyAici5zcCIsIDEgfSwgICAvKiBTdGFjayBQb2ludGVyICovCi0KLSAgeyAici50b2MiLCAyIH0sICAvKiBQb2ludGVyIHRvIHRoZSB0YWJsZSBvZiBjb250ZW50cyAqLwotCi0gIHsgInIwIiwgMCB9LCAgICAgLyogTW9yZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJyMTYiLCAxNiB9LAotICB7ICJyMTciLCAxNyB9LAotICB7ICJyMTgiLCAxOCB9LAotICB7ICJyMTkiLCAxOSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjIwIiwgMjAgfSwKLSAgeyAicjIxIiwgMjEgfSwKLSAgeyAicjIyIiwgMjIgfSwKLSAgeyAicjIzIiwgMjMgfSwKLSAgeyAicjI0IiwgMjQgfSwKLSAgeyAicjI1IiwgMjUgfSwKLSAgeyAicjI2IiwgMjYgfSwKLSAgeyAicjI3IiwgMjcgfSwKLSAgeyAicjI4IiwgMjggfSwKLSAgeyAicjI5IiwgMjkgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInIzMCIsIDMwIH0sCi0gIHsgInIzMSIsIDMxIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0KLSAgeyAicnRvYyIsIDIgfSwgIC8qIFRhYmxlIG9mIGNvbnRlbnRzICovCi0KLSAgeyAic2RyMSIsIDI1IH0sIC8qIFN0b3JhZ2UgRGVzY3JpcHRpb24gUmVnaXN0ZXIgMSAqLwotCi0gIHsgInNwIiwgMSB9LAotCi0gIHsgInNycjAiLCAyNiB9LCAvKiBNYWNoaW5lIFN0YXR1cyBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMCAqLwotICB7ICJzcnIxIiwgMjcgfSwgLyogTWFjaGluZSBTdGF0dXMgU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDEgKi8KLQotICB7ICJ4ZXIiLCAxIH0sCi0KLX07Ci0KLSNkZWZpbmUgUkVHX05BTUVfQ05UCShzaXplb2YocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSkKLQotLyogR2l2ZW4gTkFNRSwgZmluZCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUsIHJldHVybgotICAgdGhlIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIC0xIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcGRfcmVnICosIGludCwgY29uc3QgY2hhciAqIG5hbWUpKTsKLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSkKLSAgICAgY29uc3Qgc3RydWN0IHBkX3JlZyAqcmVnczsKLSAgICAgaW50IHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjoJSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDoJQSBleHByZXNzaW9uUy4KLSAqICAgICAgVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqICAgICAgWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbiBpdHMKLSAqICAgICAgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKG5hbWVbMF0gPT0gJyUnICYmIGlzYWxwaGEgKG5hbWVbMV0pKQotICAgIG5hbWUgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBlbHNlIGlmICghcmVnX25hbWVzX3AgfHwgIWlzYWxwaGEgKG5hbWVbMF0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHByZV9kZWZpbmVkX3JlZ2lzdGVycywgUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLSAgICAgIAotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgc2VlbiBpbiBhbiBleHByZXNzaW9uLiAgSXQKLSAgIGhhbmRsZXMgdGhlIHNwZWNpYWwgcGFyc2luZyB3aGljaCBQb3dlclBDIGFzc2VtYmxlcnMgYXJlIHN1cHBvc2VkCi0gICB0byB1c2UgZm9yIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0KLS8qIFdoZXRoZXIgdG8gZG8gdGhlIHNwZWNpYWwgcGFyc2luZy4gICovCi1zdGF0aWMgYm9vbGVhbiBjcl9vcGVyYW5kOwotCi0vKiBOYW1lcyB0byByZWNvZ25pemUgaW4gYSBjb25kaXRpb24gY29kZS4gIFRoaXMgdGFibGUgaXMgc29ydGVkLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGRfcmVnIGNyX25hbWVzW10gPQotewotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLSAgeyAiZXEiLCAyIH0sCi0gIHsgImd0IiwgMSB9LAotICB7ICJsdCIsIDAgfSwKLSAgeyAic28iLCAzIH0sCi0gIHsgInVuIiwgMyB9Ci19OwotCi0vKiBQYXJzaW5nIGZ1bmN0aW9uLiAgVGhpcyByZXR1cm5zIG5vbi16ZXJvIGlmIGl0IHJlY29nbml6ZWQgYW4KLSAgIGV4cHJlc3Npb24uICAqLwotCi1pbnQKLXBwY19wYXJzZV9uYW1lIChuYW1lLCBleHByKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBleHByZXNzaW9uUyAqZXhwcjsKLXsKLSAgaW50IHZhbDsKLQotICBpZiAoISBjcl9vcGVyYW5kKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IHJlZ19uYW1lX3NlYXJjaCAoY3JfbmFtZXMsIHNpemVvZiBjcl9uYW1lcyAvIHNpemVvZiBjcl9uYW1lc1swXSwKLQkJCSBuYW1lKTsKLSAgaWYgKHZhbCA8IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgZXhwci0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHItPlhfYWRkX251bWJlciA9IHZhbDsKLQotICByZXR1cm4gMTsKLX0KLQwKLS8qIExvY2FsIHZhcmlhYmxlcy4gICovCi0KLS8qIFRoZSB0eXBlIG9mIHByb2Nlc3NvciB3ZSBhcmUgYXNzZW1ibGluZyBmb3IuICBUaGlzIGlzIG9uZSBvciBtb3JlCi0gICBvZiB0aGUgUFBDX09QQ09ERSBmbGFncyBkZWZpbmVkIGluIG9wY29kZS9wcGMuaC4gICovCi1zdGF0aWMgaW50IHBwY19jcHUgPSAwOwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yIHdlIGFyZSBhc3NlbWJsaW5nIGZvci4gIFRoaXMgaXMgZWl0aGVyCi0gICBQUENfT1BDT0RFXzMyIG9yIFBQQ19PUENPREVfNjQuICAqLwotc3RhdGljIGludCBwcGNfc2l6ZSA9IFBQQ19PUENPREVfMzI7Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwcGNfaGFzaDsKLQotLyogTWFjcm8gaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcHBjX21hY3JvX2hhc2g7Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBXaGF0IHR5cGUgb2Ygc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCB0byB1c2UgKi8KLXN0YXRpYyBlbnVtIHsgU0hMSUJfTk9ORSwgU0hMSUJfUElDLCBTSElMQl9NUkVMT0NBVEFCTEUgfSBzaGxpYiA9IFNITElCX05PTkU7Ci0KLS8qIEZsYWdzIHRvIHNldCBpbiB0aGUgZWxmIGhlYWRlciAqLwotc3RhdGljIGZsYWd3b3JkIHBwY19mbGFncyA9IDA7Ci0KLS8qIFdoZXRoZXIgdGhpcyBpcyBTb2xhcmlzIG9yIG5vdC4gICovCi0jaWZkZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotI2RlZmluZSBTT0xBUklTX1AgdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgU09MQVJJU19QIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbXNvbGFyaXMgPSBTT0xBUklTX1A7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgdXNlcyB0aGUgLmNzZWN0IHBzZXVkby1vcCB0byBnZW5lcmF0ZSBjb2RlCi0gICB1c2luZyBhIGJ1bmNoIG9mIGRpZmZlcmVudCBzZWN0aW9ucy4gIFRoZXNlIGFzc2VtYmxlciBzZWN0aW9ucywKLSAgIGhvd2V2ZXIsIGFyZSBhbGwgZW5jb21wYXNzZWQgd2l0aGluIHRoZSAudGV4dCBvciAuZGF0YSBzZWN0aW9ucyBvZgotICAgdGhlIGZpbmFsIG91dHB1dCBmaWxlLiAgV2UgaGFuZGxlIHRoaXMgYnkgdXNpbmcgZGlmZmVyZW50Ci0gICBzdWJzZWdtZW50cyB3aXRoaW4gdGhlc2UgbWFpbiBzZWdtZW50cy4gICovCi0KLS8qIE5leHQgc3Vic2VnbWVudCB0byBhbGxvY2F0ZSB3aXRoaW4gdGhlIC50ZXh0IHNlZ21lbnQuICAqLwotc3RhdGljIHN1YnNlZ1QgcHBjX3RleHRfc3Vic2VnbWVudCA9IDI7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGNzZWN0cyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfdGV4dF9jc2VjdHM7Ci0KLS8qIE5leHQgc3Vic2VnbWVudCB0byBhbGxvY2F0ZSB3aXRoaW4gdGhlIC5kYXRhIHNlZ21lbnQuICAqLwotc3RhdGljIHN1YnNlZ1QgcHBjX2RhdGFfc3Vic2VnbWVudCA9IDI7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGNzZWN0cyBpbiB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfZGF0YV9jc2VjdHM7Ci0KLS8qIFRoZSBjdXJyZW50IGNzZWN0LiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfY3VycmVudF9jc2VjdDsKLQotLyogVGhlIFJTLzYwMDAgYXNzZW1ibGVyIHVzZXMgYSBUT0Mgd2hpY2ggaG9sZHMgYWRkcmVzc2VzIG9mIGZ1bmN0aW9ucwotICAgYW5kIHZhcmlhYmxlcy4gIFN5bWJvbHMgYXJlIHB1dCBpbiB0aGUgVE9DIHdpdGggdGhlIC50YyBwc2V1ZG8tb3AuCi0gICBBIHNwZWNpYWwgcmVsb2NhdGlvbiBpcyB1c2VkIHdoZW4gYWNjZXNzaW5nIFRPQyBlbnRyaWVzLiAgV2UgaGFuZGxlCi0gICB0aGUgVE9DIGFzIGEgc3Vic2VnbWVudCB3aXRoaW4gdGhlIC5kYXRhIHNlZ21lbnQuICBXZSBzZXQgaXQgdXAgaWYKLSAgIHdlIHNlZSBhIC50b2MgcHNldWRvLW9wLCBhbmQgc2F2ZSB0aGUgY3NlY3Qgc3ltYm9sIGhlcmUuICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY190b2NfY3NlY3Q7Ci0KLS8qIFRoZSBmaXJzdCBmcmFnIGluIHRoZSBUT0Mgc3Vic2VnbWVudC4gICovCi1zdGF0aWMgZnJhZ1MgKnBwY190b2NfZnJhZzsKLQotLyogVGhlIGZpcnN0IGZyYWcgaW4gdGhlIGZpcnN0IHN1YnNlZ21lbnQgYWZ0ZXIgdGhlIFRPQyBpbiB0aGUgLmRhdGEKLSAgIHNlZ21lbnQuICBOVUxMIGlmIHRoZXJlIGFyZSBubyBzdWJzZWdtZW50cyBhZnRlciB0aGUgVE9DLiAgKi8KLXN0YXRpYyBmcmFnUyAqcHBjX2FmdGVyX3RvY19mcmFnOwotCi0vKiBUaGUgY3VycmVudCBzdGF0aWMgYmxvY2suICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY19jdXJyZW50X2Jsb2NrOwotCi0vKiBUaGUgQ09GRiBkZWJ1Z2dpbmcgc2VjdGlvbjsgc2V0IGJ5IG1kX2JlZ2luLiAgVGhpcyBpcyBub3QgdGhlCi0gICAuZGVidWcgc2VjdGlvbiwgYnV0IGlzIGluc3RlYWQgdGhlIHNlY3JldCBCRkQgc2VjdGlvbiB3aGljaCB3aWxsCi0gICBjYXVzZSBCRkQgdG8gc2V0IHRoZSBzZWN0aW9uIG51bWJlciBvZiBhIHN5bWJvbCB0byBOX0RFQlVHLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiAqcHBjX2NvZmZfZGVidWdfc2VjdGlvbjsKLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotCi0jaWZkZWYgVEVfUEUKLQotLyogVmFyaW91cyBzZWN0aW9ucyB0aGF0IHdlIG5lZWQgZm9yIFBFIGNvZmYgc3VwcG9ydC4gICovCi1zdGF0aWMgc2VnVCB5ZGF0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgcGRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHJlbGRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHJkYXRhX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCB0b2NkYXRhX3NlY3Rpb247Ci0KLS8qIFRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBTZWUgcHBjX3ByZXZpb3VzLiAqLwotc3RhdGljIHNlZ1QgcHBjX3ByZXZpb3VzX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBwcGNfY3VycmVudF9zZWN0aW9uOwotCi0jZW5kaWYgLyogVEVfUEUgKi8KLQotI2lmZGVmIE9CSl9FTEYKLXN5bWJvbFMgKkdPVF9zeW1ib2w7CQkvKiBQcmUtZGVmaW5lZCAiX0dMT0JBTF9PRkZTRVRfVEFCTEUiICovCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotDAotI2lmZGVmIE9CSl9FTEYKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJiOmw6dXNtOks6VlE6IjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAidW06IjsKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ3UnOgotICAgICAgLyogLXUgbWVhbnMgdGhhdCBhbnkgdW5kZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMKLQkgZXh0ZXJuYWwsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGZvciBnYXMgYW55aG93LiAgKi8KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgJ2wnOgotICAgICAgLyogU29sYXJpcyBhcyB0YWtlcyAtbGUgKHByZXN1bWFibHkgZm9yIGxpdHRsZSBlbmRpYW4pLiAgRm9yIGNvbXBsZXRlbmVzcwotICAgICAgICAgc2FrZSwgcmVjb2duaXplIC1iZSBhbHNvLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyZywgImUiKSA9PSAwKQotCXsKLQkgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLQkgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsICJlIikgPT0gMCkKLQl7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0JICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAwOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgICAgLyogUmVjb2duaXplIC1LIFBJQyAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiUElDIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgInBpYyIpID09IDApCi0JewotCSAgc2hsaWIgPSBTSExJQl9QSUM7Ci0JICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFX0xJQjsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlICdtJzoKLSAgICAgIC8qIC1tcHdyeCBhbmQgLW1wd3IyIG1lYW4gdG8gYXNzZW1ibGUgZm9yIHRoZSBJQk0gUE9XRVIvMgotICAgICAgICAgKFJJT1MyKS4gICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICJwd3J4IikgPT0gMCB8fCBzdHJjbXAgKGFyZywgInB3cjIiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjI7Ci0gICAgICAvKiAtbXB3ciBtZWFucyB0byBhc3NlbWJsZSBmb3IgdGhlIElCTSBQT1dFUiAoUklPUzEpLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHdyIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKLSAgICAgIC8qIC1tNjAxIG1lYW5zIHRvIGFzc2VtYmxlIGZvciB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEsIHdoaWNoIGluY2x1ZGVzCi0gICAgICAgICBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaG9sZG92ZXJzIGZyb20gdGhlIFBvd2VyLiAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICI2MDEiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxOwotICAgICAgLyogLW1wcGMsIC1tcHBjMzIsIC1tNjAzLCBhbmQgLW02MDQgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlCi0gICAgICAgICBNb3Rvcm9sYSBQb3dlclBDIDYwMy82MDQuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAicHBjMzIiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAiNDAzIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjYwMyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChhcmcsICI2MDQiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKLSAgICAgIC8qIC1tcHBjNjQgYW5kIC1tNjIwIG1lYW4gdG8gYXNzZW1ibGUgZm9yIHRoZSA2NC1iaXQgUG93ZXJQQwotICAgICAgICAgNjIwLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHBjNjQiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiNjIwIikgPT0gMCkKLQl7Ci0JICBwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEM7Ci0JICBwcGNfc2l6ZSA9IFBQQ19PUENPREVfNjQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGM2NGJyaWRnZSIpID09IDApCi0JewotCSAgcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82NF9CUklER0U7Ci0JICBwcGNfc2l6ZSA9IFBQQ19PUENPREVfNjQ7Ci0JfQotICAgICAgLyogLW1jb20gbWVhbnMgYXNzZW1ibGUgZm9yIHRoZSBjb21tb24gaW50ZXJzZWN0aW9uIGJldHdlZW4gUG93ZXIKLQkgYW5kIFBvd2VyUEMuICBBdCBwcmVzZW50LCB3ZSBqdXN0IGFsbG93IHRoZSB1bmlvbiwgcmF0aGVyCi0JIHRoYW4gdGhlIGludGVyc2VjdGlvbi4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImNvbSIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfQ09NTU9OOwotICAgICAgLyogLW1hbnkgbWVhbnMgdG8gYXNzZW1ibGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKFBXUi9QV1JYL1BQQykuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJhbnkiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX0FOWTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWduYW1lcyIpID09IDApCi0JcmVnX25hbWVzX3AgPSB0cnVlOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vLXJlZ25hbWVzIikgPT0gMCkKLQlyZWdfbmFtZXNfcCA9IGZhbHNlOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogLW1yZWxvY2F0YWJsZS8tbXJlbG9jYXRhYmxlLWxpYiAtLSB3YXJuIGFib3V0IGluaXRpYWxpemF0aW9ucyB0aGF0IHJlcXVpcmUgcmVsb2NhdGlvbiAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWxvY2F0YWJsZSIpID09IDApCi0JewotCSAgc2hsaWIgPSBTSElMQl9NUkVMT0NBVEFCTEU7Ci0JICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWxvY2F0YWJsZS1saWIiKSA9PSAwKQotCXsKLQkgIHNobGliID0gU0hJTEJfTVJFTE9DQVRBQkxFOwotCSAgcHBjX2ZsYWdzIHw9IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUI7Ci0JfQotCi0gICAgICAvKiAtbWVtYiwgc2V0IGVtYmVkZGVkIGJpdCAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJlbWIiKSA9PSAwKQotCXBwY19mbGFncyB8PSBFRl9QUENfRU1COwotCi0gICAgICAvKiAtbWxpdHRsZS8tbWJpZyBzZXQgdGhlIGVuZGlhbmVzcyAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJsaXR0bGUiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAibGl0dGxlLWVuZGlhbiIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJiaWciKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiYmlnLWVuZGlhbiIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJzb2xhcmlzIikgPT0gMCkKLQl7Ci0JICBtc29sYXJpcyA9IHRydWU7Ci0JICBwcGNfY29tbWVudF9jaGFycyA9IHBwY19zb2xhcmlzX2NvbW1lbnRfY2hhcnM7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vLXNvbGFyaXMiKSA9PSAwKQotCXsKLQkgIG1zb2xhcmlzID0gZmFsc2U7Ci0JICBwcGNfY29tbWVudF9jaGFycyA9IHBwY19lYWJpX2NvbW1lbnRfY2hhcnM7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJpbnZhbGlkIHN3aXRjaCAtbSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotICAgICAgLyogU29sYXJpcyB0YWtlcyAtcyB0byBzcGVjaWZ5IHRoYXQgLnN0YWJzIGdvIGluIGEgLnN0YWJzIHNlY3Rpb24sCi0JIHJhdGhlciB0aGFuIC5zdGFicy5leGNsLCB3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZSBsaW5rZXIuCi0JIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICAgIGNhc2UgJ3MnOgotICAgICAgaWYgKGFyZykKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotUG93ZXJQQyBvcHRpb25zOlxuXAotLXUJCQlpZ25vcmVkXG5cCi0tbXB3cngsIC1tcHdyMgkJZ2VuZXJhdGUgY29kZSBmb3IgSUJNIFBPV0VSLzIgKFJJT1MyKVxuXAotLW1wd3IJCQlnZW5lcmF0ZSBjb2RlIGZvciBJQk0gUE9XRVIgKFJJT1MxKVxuXAotLW02MDEJCQlnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYwMVxuXAotLW1wcGMsIC1tcHBjMzIsIC1tNDAzLCAtbTYwMywgLW02MDRcblwKLQkJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAzLzYwNFxuXAotLW1wcGM2NCwgLW02MjAJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjIwXG5cCi0tbXBwYzY0YnJpZGdlCQlnZW5lcmF0ZSBjb2RlIGZvciBQb3dlclBDIDY0LCBpbmNsdWRpbmcgYnJpZGdlIGluc25zXG5cCi0tbWNvbQkJCWdlbmVyYXRlIGNvZGUgUG93ZXIvUG93ZXJQQyBjb21tb24gaW5zdHJ1Y3Rpb25zXG5cCi0tbWFueQkJCWdlbmVyYXRlIGNvZGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKFBXUi9QV1JYL1BQQylcblwKLS1tcmVnbmFtZXMJCUFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcblwKLS1tbm8tcmVnbmFtZXMJCURvIG5vdCBhbGxvdyBzeW1ib2xpYyBuYW1lcyBmb3IgcmVnaXN0ZXJzXG4iKSk7Ci0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLW1yZWxvY2F0YWJsZQkJc3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlIG9wdGlvblxuXAotLW1yZWxvY2F0YWJsZS1saWIJc3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlLWxpYiBvcHRpb25cblwKLS1tZW1iCQkJc2V0IFBQQ19FTUIgYml0IGluIEVMRiBmbGFnc1xuXAotLW1saXR0bGUsIC1tbGl0dGxlLWVuZGlhblxuXAotCQkJZ2VuZXJhdGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmVcblwKLS1tYmlnLCAtbWJpZy1lbmRpYW4JZ2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcblwKLS1tc29sYXJpcwkJZ2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuXAotLW1uby1zb2xhcmlzCQlkbyBub3QgZ2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuXAotLVYJCQlwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcblwKLS1ReSwgLVFuCQlpZ25vcmVkXG4iKSk7Ci0jZW5kaWYKLX0KLQwKLS8qIFNldCBwcGNfY3B1IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfc2V0X2NwdSAoKQotewotICBjb25zdCBjaGFyICpkZWZhdWx0X29zICA9IFRBUkdFVF9PUzsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotCi0gIGlmIChwcGNfY3B1ID09IDApCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKGRlZmF1bHRfb3MsICJhaXgiLCAzKSA9PSAwCi0JICAmJiBkZWZhdWx0X29zWzNdID49ICc0JyAmJiBkZWZhdWx0X29zWzNdIDw9ICc5JykKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9DT01NT047Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChkZWZhdWx0X29zLCAiYWl4MyIsIDQpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUE9XRVI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicnM2MDAwIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGRlZmF1bHRfY3B1LCAicG93ZXJwY2xlIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEM7Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIlVua25vd24gZGVmYXVsdCBjcHUgPSAlcywgb3MgPSAlcyIpLCBkZWZhdWx0X2NwdSwgZGVmYXVsdF9vcyk7Ci0gICAgfQotfQotCi0vKiBGaWd1cmUgb3V0IHRoZSBCRkQgYXJjaGl0ZWN0dXJlIHRvIHVzZS4gICovCi0KLWVudW0gYmZkX2FyY2hpdGVjdHVyZQotcHBjX2FyY2ggKCkKLXsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotICBwcGNfc2V0X2NwdSAoKTsKLQotICBpZiAoKHBwY19jcHUgJiBQUENfT1BDT0RFX1BQQykgIT0gMCkKLSAgICByZXR1cm4gYmZkX2FyY2hfcG93ZXJwYzsKLSAgZWxzZSBpZiAoKHBwY19jcHUgJiBQUENfT1BDT0RFX1BPV0VSKSAhPSAwKQotICAgIHJldHVybiBiZmRfYXJjaF9yczYwMDA7Ci0gIGVsc2UgaWYgKChwcGNfY3B1ICYgKFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkpKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicnM2MDAwIikgPT0gMCkKLQlyZXR1cm4gYmZkX2FyY2hfcnM2MDAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjbGUiKSA9PSAwKQotCXJldHVybiBiZmRfYXJjaF9wb3dlcnBjOwotICAgIH0KLQotICBhc19mYXRhbCAoXygiTmVpdGhlciBQb3dlciBub3IgUG93ZXJQQyBvcGNvZGVzIHdlcmUgc2VsZWN0ZWQuIikpOwotICByZXR1cm4gYmZkX2FyY2hfdW5rbm93bjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN0YXJ0cyB1cC4gIEl0IGlzIGNhbGxlZAotICAgYWZ0ZXIgdGhlIG9wdGlvbnMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgdGhlIG91dHB1dCBmaWxlIGhhcyBiZWVuCi0gICBvcGVuZWQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wX2VuZDsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm9fZW5kOwotICBib29sZWFuIGR1cF9pbnNuID0gZmFsc2U7Ci0KLSAgcHBjX3NldF9jcHUgKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFNldCB0aGUgRUxGIGZsYWdzIGlmIGRlc2lyZWQuICovCi0gIGlmIChwcGNfZmxhZ3MgJiYgIW1zb2xhcmlzKQotICAgIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyAoc3Rkb3V0cHV0LCBwcGNfZmxhZ3MpOwotI2VuZGlmCi0KLSAgLyogSW5zZXJ0IHRoZSBvcGNvZGVzIGludG8gYSBoYXNoIHRhYmxlLiAgKi8KLSAgcHBjX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBvcF9lbmQgPSBwb3dlcnBjX29wY29kZXMgKyBwb3dlcnBjX251bV9vcGNvZGVzOwotICBmb3IgKG9wID0gcG93ZXJwY19vcGNvZGVzOyBvcCA8IG9wX2VuZDsgb3ArKykKLSAgICB7Ci0gICAgICBrbm93ICgob3AtPm9wY29kZSAmIG9wLT5tYXNrKSA9PSBvcC0+b3Bjb2RlKTsKLQotICAgICAgaWYgKChvcC0+ZmxhZ3MgJiBwcGNfY3B1KSAhPSAwCi0JICAmJiAoKG9wLT5mbGFncyAmIChQUENfT1BDT0RFXzMyIHwgUFBDX09QQ09ERV82NCkpID09IDAKLQkgICAgICB8fCAob3AtPmZsYWdzICYgKFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFXzY0KSkgPT0gcHBjX3NpemUKLQkgICAgICB8fCAocHBjX2NwdSAmIFBQQ19PUENPREVfNjRfQlJJREdFKSAhPSAwKSkKLQl7Ci0JICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLQkgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChwcGNfaGFzaCwgb3AtPm5hbWUsIChQVFIpIG9wKTsKLQkgIGlmIChyZXR2YWwgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIElnbm9yZSBQb3dlciBkdXBsaWNhdGVzIGZvciAtbTYwMSAqLwotCSAgICAgIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfNjAxKSAhPSAwCi0JCSAgJiYgKG9wLT5mbGFncyAmIFBQQ19PUENPREVfUE9XRVIpICE9IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBhc3NlbWJsZXIgZXJyb3IgZm9yIGluc3RydWN0aW9uICVzIiksIG9wLT5uYW1lKTsKLQkgICAgICBkdXBfaW5zbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEluc2VydCB0aGUgbWFjcm9zIGludG8gYSBoYXNoIHRhYmxlLiAgKi8KLSAgcHBjX21hY3JvX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBtYWNyb19lbmQgPSBwb3dlcnBjX21hY3JvcyArIHBvd2VycGNfbnVtX21hY3JvczsKLSAgZm9yIChtYWNybyA9IHBvd2VycGNfbWFjcm9zOyBtYWNybyA8IG1hY3JvX2VuZDsgbWFjcm8rKykKLSAgICB7Ci0gICAgICBpZiAoKG1hY3JvLT5mbGFncyAmIHBwY19jcHUpICE9IDApCi0JewotCSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0JICByZXR2YWwgPSBoYXNoX2luc2VydCAocHBjX21hY3JvX2hhc2gsIG1hY3JvLT5uYW1lLCAoUFRSKSBtYWNybyk7Ci0JICBpZiAocmV0dmFsICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgbWFjcm8gJXMiKSwgbWFjcm8tPm5hbWUpOwotCSAgICAgIGR1cF9pbnNuID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGR1cF9pbnNuKQotICAgIGFib3J0ICgpOwotCi0gIC8qIFRlbGwgdGhlIG1haW4gY29kZSB3aGF0IHRoZSBlbmRpYW5uZXNzIGlzIGlmIGl0IGlzIG5vdCBvdmVyaWRkZW4gYnkgdGhlIHVzZXIuICAqLwotICBpZiAoIXNldF90YXJnZXRfZW5kaWFuKQotICAgIHsKLSAgICAgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gUFBDX0JJR19FTkRJQU47Ci0gICAgfQotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gIHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKHN0ZG91dHB1dCwgTl9ERUJVRyk7Ci0KLSAgLyogQ3JlYXRlIGR1bW15IHN5bWJvbHMgdG8gc2VydmUgYXMgaW5pdGlhbCBjc2VjdHMuICBUaGlzIGZvcmNlcyB0aGUKLSAgICAgdGV4dCBjc2VjdHMgdG8gcHJlY2VkZSB0aGUgZGF0YSBjc2VjdHMuICBUaGVzZSBzeW1ib2xzIHdpbGwgbm90Ci0gICAgIGJlIG91dHB1dC4gICovCi0gIHBwY190ZXh0X2NzZWN0cyA9IHN5bWJvbF9tYWtlICgiZHVtbXlcMDAxIik7Ci0gIHN5bWJvbF9nZXRfdGMgKHBwY190ZXh0X2NzZWN0cyktPndpdGhpbiA9IHBwY190ZXh0X2NzZWN0czsKLSAgcHBjX2RhdGFfY3NlY3RzID0gc3ltYm9sX21ha2UgKCJkdW1teVwwMDEiKTsKLSAgc3ltYm9sX2dldF90YyAocHBjX2RhdGFfY3NlY3RzKS0+d2l0aGluID0gcHBjX2RhdGFfY3NlY3RzOwotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotCi0gIHBwY19jdXJyZW50X3NlY3Rpb24gPSB0ZXh0X3NlY3Rpb247Ci0gIHBwY19wcmV2aW91c19zZWN0aW9uID0gMDsgIAotCi0jZW5kaWYKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1wcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci17Ci0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05PUFQpICE9IDApCi0JICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIGVsc2UKLQkgICAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQotCSAgaWYgKHBwY19zaXplID09IFBQQ19PUENPREVfMzIpCi0JICAgIHsKLQkgICAgICAvKiBTb21lIHBlb3BsZSB3cml0ZSAzMiBiaXQgaGV4IGNvbnN0YW50cyB3aXRoIHRoZSBzaWduCi0JCSBleHRlbnNpb24gZG9uZSBieSBoYW5kLiAgVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGJlCi0JCSB2YWxpZCwgYnV0LCB0byBwZXJtaXQgdGhpcyBjb2RlIHRvIGFzc2VtYmxlIG9uIGEgNjQKLQkJIGJpdCBob3N0LCB3ZSBzaWduIGV4dGVuZCB0aGUgMzIgYml0IHZhbHVlLiAgKi8KLQkgICAgICBpZiAodmFsID4gMAotCQkgICYmICh2YWwgJiAweDgwMDAwMDAwKSAhPSAwCi0JCSAgJiYgKHZhbCAmIDB4ZmZmZmZmZmYpID09IHZhbCkKLQkJewotCQkgIHZhbCAtPSAweDgwMDAwMDAwOwotCQkgIHZhbCAtPSAweDgwMDAwMDAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgbWluID0gMDsKLQl9Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORUdBVElWRSkgIT0gMCkKLQl0ZXN0ID0gLSB2YWw7Ci0gICAgICBlbHNlCi0JdGVzdCA9IHZhbDsKLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotCXsKLQkgIGNvbnN0IGNoYXIgKmVyciA9Ci0JICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLQkgIGNoYXIgYnVmWzEwMF07Ci0KLQkgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKLQkgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JICAgIGFzX2JhZCAoZXJyLCBidWYsIG1pbiwgbWF4KTsKLQkgIGVsc2UKLQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0gICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCAobG9uZykgdmFsLCAmZXJybXNnKTsKLSAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQlhc19iYWQgKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkgICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotDAotI2lmZGVmIE9CSl9FTEYKLS8qIFBhcnNlIEBnb3QsIGV0Yy4gYW5kIHJldHVybiB0aGUgZGVzaXJlZCByZWxvY2F0aW9uLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLXBwY19lbGZfc3VmZml4IChzdHJfcCwgZXhwX3ApCi0gICAgIGNoYXIgKipzdHJfcDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cF9wOwotewotICBzdHJ1Y3QgbWFwX2JmZCB7Ci0gICAgY2hhciAqc3RyaW5nOwotICAgIGludCBsZW5ndGg7Ci0gICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICB9OwotCi0gIGNoYXIgaWRlbnRbMjBdOwotICBjaGFyICpzdHIgPSAqc3RyX3A7Ci0gIGNoYXIgKnN0cjI7Ci0gIGludCBjaDsKLSAgaW50IGxlbjsKLSAgc3RydWN0IG1hcF9iZmQgKnB0cjsKLQotI2RlZmluZSBNQVAoc3RyLHJlbG9jKSB7IHN0ciwgc2l6ZW9mKHN0ciktMSwgcmVsb2MgfQotCi0gIHN0YXRpYyBzdHJ1Y3QgbWFwX2JmZCBtYXBwaW5nW10gPSB7Ci0gICAgTUFQICgibCIsCQlCRkRfUkVMT0NfTE8xNiksCi0gICAgTUFQICgiaCIsCQlCRkRfUkVMT0NfSEkxNiksCi0gICAgTUFQICgiaGEiLAkJQkZEX1JFTE9DX0hJMTZfUyksCi0gICAgTUFQICgiYnJ0YWtlbiIsCUJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4pLAotICAgIE1BUCAoImJybnRha2VuIiwJQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4pLAotICAgIE1BUCAoImdvdCIsCQlCRkRfUkVMT0NfMTZfR09UT0ZGKSwKLSAgICBNQVAgKCJnb3RAbCIsCUJGRF9SRUxPQ19MTzE2X0dPVE9GRiksCi0gICAgTUFQICgiZ290QGgiLAlCRkRfUkVMT0NfSEkxNl9HT1RPRkYpLAotICAgIE1BUCAoImdvdEBoYSIsCUJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGKSwKLSAgICBNQVAgKCJmaXh1cCIsCUJGRF9SRUxPQ19DVE9SKSwJCS8qIHdhcm5pbmdzIHdpdGggLW1yZWxvY2F0YWJsZSAqLwotICAgIE1BUCAoInBsdCIsCQlCRkRfUkVMT0NfMjRfUExUX1BDUkVMKSwKLSAgICBNQVAgKCJwbHRyZWwyNCIsCUJGRF9SRUxPQ18yNF9QTFRfUENSRUwpLAotICAgIE1BUCAoImNvcHkiLAlCRkRfUkVMT0NfUFBDX0NPUFkpLAotICAgIE1BUCAoImdsb2JkYXQiLAlCRkRfUkVMT0NfUFBDX0dMT0JfREFUKSwKLSAgICBNQVAgKCJsb2NhbDI0cGMiLAlCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQyksCi0gICAgTUFQICgibG9jYWwiLAlCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQyksCi0gICAgTUFQICgicGx0cmVsIiwJQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCksCi0gICAgTUFQICgicGx0QGwiLAlCRkRfUkVMT0NfTE8xNl9QTFRPRkYpLAotICAgIE1BUCAoInBsdEBoIiwJQkZEX1JFTE9DX0hJMTZfUExUT0ZGKSwKLSAgICBNQVAgKCJwbHRAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiksCi0gICAgTUFQICgic2RhcmVsIiwJQkZEX1JFTE9DX0dQUkVMMTYpLAotICAgIE1BUCAoInNlY3RvZmYiLAlCRkRfUkVMT0NfMzJfQkFTRVJFTCksCi0gICAgTUFQICgic2VjdG9mZkBsIiwJQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCksCi0gICAgTUFQICgic2VjdG9mZkBoIiwJQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCksCi0gICAgTUFQICgic2VjdG9mZkBoYSIsCUJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCksCi0gICAgTUFQICgibmFkZHIiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyKSwKLSAgICBNQVAgKCJuYWRkcjE2IiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNiksCi0gICAgTUFQICgibmFkZHJAbCIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8pLAotICAgIE1BUCAoIm5hZGRyQGgiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJKSwKLSAgICBNQVAgKCJuYWRkckBoYSIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEpLAotICAgIE1BUCAoInNkYWkxNiIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiksCi0gICAgTUFQICgic2RhMnJlbCIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwpLAotICAgIE1BUCAoInNkYTJpMTYiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2KSwKLSAgICBNQVAgKCJzZGEyMSIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQTIxKSwKLSAgICBNQVAgKCJtcmtyZWYiLAlCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYpLAotICAgIE1BUCAoInJlbHNlY3QiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNiksCi0gICAgTUFQICgicmVsc2VjdEBsIiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8pLAotICAgIE1BUCAoInJlbHNlY3RAaCIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJKSwKLSAgICBNQVAgKCJyZWxzZWN0QGhhIiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEpLAotICAgIE1BUCAoImJpdGZsZCIsCUJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQpLAotICAgIE1BUCAoInJlbHNkYSIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQSksCi0gICAgTUFQICgieGdvdCIsCUJGRF9SRUxPQ19QUENfVE9DMTYpLAotCi0gICAgeyAoY2hhciAqKTAsCTAsCUJGRF9SRUxPQ19VTlVTRUQgfQotICB9OwotCi0gIGlmICgqc3RyKysgIT0gJ0AnKQotICAgIHJldHVybiBCRkRfUkVMT0NfVU5VU0VEOwotCi0gIGZvciAoY2ggPSAqc3RyLCBzdHIyID0gaWRlbnQ7Ci0gICAgICAgKHN0cjIgPCBpZGVudCArIHNpemVvZiAoaWRlbnQpIC0gMQotCSYmIChpc2FsbnVtIChjaCkgfHwgY2ggPT0gJ0AnKSk7Ci0gICAgICAgY2ggPSAqKytzdHIpCi0gICAgewotICAgICAgKnN0cjIrKyA9IChpc2xvd2VyIChjaCkpID8gY2ggOiB0b2xvd2VyIChjaCk7Ci0gICAgfQotCi0gICpzdHIyID0gJ1wwJzsKLSAgbGVuID0gc3RyMiAtIGlkZW50OwotCi0gIGNoID0gaWRlbnRbMF07Ci0gIGZvciAocHRyID0gJm1hcHBpbmdbMF07IHB0ci0+bGVuZ3RoID4gMDsgcHRyKyspCi0gICAgaWYgKGNoID09IHB0ci0+c3RyaW5nWzBdCi0JJiYgbGVuID09IHB0ci0+bGVuZ3RoCi0JJiYgbWVtY21wIChpZGVudCwgcHRyLT5zdHJpbmcsIHB0ci0+bGVuZ3RoKSA9PSAwKQotICAgICAgewotCWlmIChleHBfcC0+WF9hZGRfbnVtYmVyICE9IDAKLQkgICAgJiYgKHB0ci0+cmVsb2MgPT0gQkZEX1JFTE9DXzE2X0dPVE9GRgotCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19MTzE2X0dPVE9GRgotCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGKSkKLQkgIGFzX3dhcm4gKF8oImlkZW50aWZpZXIrY29uc3RhbnRAZ290IG1lYW5zIGlkZW50aWZpZXJAZ290K2NvbnN0YW50IikpOwotCi0JLyogTm93IGNoZWNrIGZvciBpZGVudGlmaWVyQHN1ZmZpeCtjb25zdGFudCAqLwotCWlmICgqc3RyID09ICctJyB8fCAqc3RyID09ICcrJykKLQkgIHsKLQkgICAgY2hhciAqb3JpZ19saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICBleHByZXNzaW9uUyBuZXdfZXhwOwotCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQkgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOwotCSAgICBpZiAobmV3X2V4cC5YX29wID09IE9fY29uc3RhbnQpCi0JICAgICAgewotCQlleHBfcC0+WF9hZGRfbnVtYmVyICs9IG5ld19leHAuWF9hZGRfbnVtYmVyOwotCQlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgfQotCi0JICAgIGlmICgmaW5wdXRfbGluZV9wb2ludGVyICE9IHN0cl9wKQotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9yaWdfbGluZTsKLQkgIH0KLQotCSpzdHJfcCA9IHN0cjsKLQlyZXR1cm4gcHRyLT5yZWxvYzsKLSAgICAgIH0KLQotICByZXR1cm4gQkZEX1JFTE9DX1VOVVNFRDsKLX0KLQotLyogTGlrZSBub3JtYWwgLmxvbmcvLnNob3J0Ly53b3JkLCBleGNlcHQgc3VwcG9ydCBAZ290LCBldGMuICovCi0vKiBjbG9iYmVycyBpbnB1dF9saW5lX3BvaW50ZXIsIGNoZWNrcyAqLwotLyogZW5kLW9mLWxpbmUuICovCi1zdGF0aWMgdm9pZAotcHBjX2VsZl9jb25zIChuYnl0ZXMpCi0gICAgIHJlZ2lzdGVyIGludCBuYnl0ZXM7CS8qIDE9LmJ5dGUsIDI9LndvcmQsIDQ9LmxvbmcgKi8KLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBleHByZXNzaW9uICgmZXhwKTsKLSAgICAgIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcKLQkgICYmIChyZWxvYyA9IHBwY19lbGZfc3VmZml4ICgmaW5wdXRfbGluZV9wb2ludGVyLCAmZXhwKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByZWxvYyk7Ci0JICBpbnQgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCi0JICBpZiAoc2l6ZSA+IG5ieXRlcykKLQkgICAgYXNfYmFkIChfKCIlcyByZWxvY2F0aW9ucyBkbyBub3QgZml0IGluICVkIGJ5dGVzXG4iKSwgcmVsb2NfaG93dG8tPm5hbWUsIG5ieXRlcyk7Ci0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlZ2lzdGVyIGNoYXIgKnAgPSBmcmFnX21vcmUgKChpbnQpIG5ieXRlcyk7Ci0JICAgICAgaW50IG9mZnNldCA9IG5ieXRlcyAtIHNpemU7Ci0KLQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwgc2l6ZSwgJmV4cCwgMCwgcmVsb2MpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWVtaXRfZXhwciAoJmV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFNvbGFyaXMgcHNlZHVvIG9wIHRvIGNoYW5nZSB0byB0aGUgLnJvZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX3JkYXRhICh4eHgpCi0gICAgIGludCB4eHg7Ci17Ci0gIGNoYXIgKnNhdmVfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgc3RhdGljIGNoYXIgc2VjdGlvbltdID0gIi5yb2RhdGFcbiI7Ci0KLSAgLyogSnVzdCBwcmV0ZW5kIHRoaXMgaXMgLnNlY3Rpb24gLnJvZGF0YSAqLwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzZWN0aW9uOwotICBvYmpfZWxmX3NlY3Rpb24gKHh4eCk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9saW5lOwotfQotCi0vKiBQc2V1ZG8gb3AgdG8gbWFrZSBmaWxlIHNjb3BlIGJzcyBpdGVtcyAqLwotc3RhdGljIHZvaWQKLXBwY19lbGZfbGNvbW0oeHh4KQotICAgICBpbnQgeHh4OwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgc2l6ZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgb2Zmc2V0VCBhbGlnbjsKLSAgc2VnVCBvbGRfc2VjOwotICBpbnQgb2xkX3N1YnNlYzsKLSAgY2hhciAqcGZyYWc7Ci0gIGludCBhbGlnbjI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKChzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSBzaXplKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAubGNvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhbGlnbiA9IDg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoYWxpZ24gPD0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgYWxpZ24gPSA4OwotCX0KLSAgICB9Ci0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLQotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJMZW5ndGggb2YgLmxjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JICAgICAgKGxvbmcpIHNpemUpOwotCi0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBhbGxvY2F0ZV9ic3M6ICovCi0gIG9sZF9zZWMgPSBub3dfc2VnOwotICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgaWYgKGFsaWduKQotICAgIHsKLSAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLwotICAgICAgZm9yIChhbGlnbjIgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKythbGlnbjIpOwotICAgICAgaWYgKGFsaWduICE9IDEpCi0JewotCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhbGlnbjIgPSAwOwotCi0gIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbjIpOwotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0gIGlmIChhbGlnbjIpCi0gICAgZnJhZ19hbGlnbiAoYWxpZ24yLCAwLCAwKTsKLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsIHNpemUsCi0JCSAgICAoY2hhciAqKSAwKTsKLSAgKnBmcmFnID0gMDsKLSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFZhbGlkYXRlIGFueSByZWxvY2F0aW9ucyBlbWl0dGVkIGZvciAtbXJlbG9jYXRhYmxlLCBwb3NzaWJseSBhZGRpbmcKLSAgIGZpeHVwcyBmb3Igd29yZCByZWxvY2F0aW9ucyBpbiB3cml0YWJsZSBzZWdtZW50cywgc28gd2UgY2FuIGFkanVzdAotICAgdGhlbSBhdCBydW50aW1lLiAgKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX3ZhbGlkYXRlX2ZpeCAoZml4cCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgaWYgKGZpeHAtPmZ4X2RvbmUgfHwgZml4cC0+ZnhfcGNyZWwpCi0gICAgcmV0dXJuOwotCi0gIHN3aXRjaCAoc2hsaWIpCi0gICAgewotICAgIGNhc2UgU0hMSUJfTk9ORToKLSAgICBjYXNlIFNITElCX1BJQzoKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgU0hJTEJfTVJFTE9DQVRBQkxFOgotICAgICAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA8PSBCRkRfUkVMT0NfVU5VU0VECi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyX0JBU0VSRUwKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xNl9CQVNFUkVMCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfQkFTRVJFTAotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZ290MiIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmR0b3JzIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuY3RvcnMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5maXh1cCIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLnN0YWIiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5nY2NfZXhjZXB0X3RhYmxlIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZWhfZnJhbWUiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5leF9zaGFyZWQiKSAhPSAwKQotCXsKLQkgIGlmICgoc2VnLT5mbGFncyAmIChTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSkpICE9IDAKLQkgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0NUT1IpCi0JICAgIHsKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiUmVsb2NhdGlvbiBjYW5ub3QgYmUgZG9uZSB3aGVuIHVzaW5nIC1tcmVsb2NhdGFibGUiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQwKLSNpZmRlZiBURV9QRQotCi0vKgotICogU3VtbWFyeSBvZiBwYXJzZV90b2NfZW50cnkoKS4KLSAqCi0gKiBpbjoJSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byB0aGUgJ1snIGluIG9uZSBvZjoKLSAqCi0gKiAgICAgICAgW3RvY10gW3RvY3ZdIFt0b2MzMl0gW3RvYzY0XQotICoKLSAqICAgICAgQW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvciBvZiBvbmUga2luZCBvciBhbm90aGVyLgotICoKLSAqIG91dDoJCi0gKiAgIHJldHVybiB2YWx1ZTogc3VjY2VzcyBvciBmYWlsdXJlCi0gKiAgIHRvY19raW5kOiAgICAga2luZCBvZiB0b2MgcmVmZXJlbmNlCi0gKiAgIGlucHV0X2xpbmVfcG9pbnRlcjoKLSAqICAgICBzdWNjZXNzOiBmaXJzdCBjaGFyIGFmdGVyIHRoZSAnXScKLSAqICAgICBmYWlsdXJlOiB1bmNoYW5nZWQKLSAqCi0gKiBzZXR0aW5nczoKLSAqCi0gKiAgICAgW3RvY10gICAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gZGVmYXVsdF90b2MKLSAqICAgICBbdG9jdl0gIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBkYXRhX2luX3RvYwotICogICAgIFt0b2MzMl0gLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IG11c3RfYmVfMzIKLSAqICAgICBbdG9jNjRdIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBtdXN0X2JlXzY0Ci0gKgotICovCi0KLWVudW0gdG9jX3NpemVfcXVhbGlmaWVyIAoteyAKLSAgZGVmYXVsdF90b2MsIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IHNpemUgKi8KLSAgZGF0YV9pbl90b2MsIC8qIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIGEgdG9jIGNlbGwgICAgICAgICAgICAgICAgICAgKi8KLSAgbXVzdF9iZV8zMiwgIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBtdXN0IGJlIDMyIGJpdHMgd2lkZSAgICAgICAgICAgICAgKi8KLSAgbXVzdF9iZV82NCAgIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBtdXN0IGJlIDY0IGJpdHMgd2lkZSAgICAgICAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX3RvY19lbnRyeSh0b2Nfa2luZCkKLSAgICAgZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgKnRvY19raW5kOwotewotICBjaGFyICpzdGFydDsKLSAgY2hhciAqdG9jX3NwZWM7Ci0gIGNoYXIgYzsKLSAgZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgdDsKLQotICAvKiBzYXZlIHRoZSBpbnB1dF9saW5lX3BvaW50ZXIgKi8KLSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogc2tpcCBvdmVyIHRoZSAnWycgLCBhbmQgd2hpdGVzcGFjZSAqLwotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICAKLSAgLyogZmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgdG9jX3NwZWMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jIikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IGRlZmF1bHRfdG9jOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jdiIpID09IDApIAotICAgIHsKLSAgICAgIHQgPSBkYXRhX2luX3RvYzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvYzMyIikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IG11c3RfYmVfMzI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2M2NCIpID09IDApIAotICAgIHsKLSAgICAgIHQgPSBtdXN0X2JlXzY0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yOiBpbnZhbGlkIHRvYyBzcGVjaWZpZXIgYCVzJyIpLCB0b2Nfc3BlYyk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogbm93IGZpbmQgdGhlICddJyAqLwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkgICAgIC8qIGxlYWRpbmcgd2hpdGVzcGFjZSBjb3VsZCBiZSB0aGVyZS4gKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsgLyogaW5wdXRfbGluZV9wb2ludGVyLT5wYXN0IGNoYXIgaW4gYy4gKi8KLQotICBpZiAoYyAhPSAnXScpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I6IGV4cGVjdGVkIGBdJywgZm91bmQgIGAlYyciKSwgYyk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgKnRvY19raW5kID0gdDsgICAgICAgICAgICAgLyogc2V0IHJldHVybiB2YWx1ZSAqLwotICByZXR1cm4gMTsKLX0KLSNlbmRpZgotDAotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFdlIGNhbid0IHNpbXBseSBnZW5lcmF0ZSB0aGVtIGFzCi0gICB3ZSBnbywgYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgdXMgdG8gZmlyc3QgY3JlYXRlIHRoZSBmcmFnLCBhbmQKLSAgIHRoYXQgd291bGQgc2NyZXcgdXAgcmVmZXJlbmNlcyB0byBgYC4nJy4gICovCi0KLXN0cnVjdCBwcGNfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLSAgaW50IHNraXBfb3B0aW9uYWw7Ci0gIGludCBuZWVkX3BhcmVuOwotICBpbnQgbmV4dF9vcGluZGV4OwotICBzdHJ1Y3QgcHBjX2ZpeHVwIGZpeHVwc1tNQVhfSU5TTl9GSVhVUFNdOwotICBpbnQgZmM7Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotI2lmZGVmIE9CSl9FTEYKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotI2VuZGlmCi0KLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIExvb2sgdXAgdGhlIG9wY29kZSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKikgaGFzaF9maW5kIChwcGNfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICopIE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotCi0gICAgICBtYWNybyA9IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqKSBoYXNoX2ZpbmQgKHBwY19tYWNyb19oYXNoLCBzdHIpOwotICAgICAgaWYgKG1hY3JvID09IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqKSBOVUxMKQotCWFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgZWxzZQotCXBwY19tYWNybyAocywgbWFjcm8pOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgLyogUG93ZXJQQyBvcGVyYW5kcyBhcmUganVzdCBleHByZXNzaW9ucy4gIFRoZSBvbmx5IHJlYWwgaXNzdWUgaXMKLSAgICAgdGhhdCBhIGZldyBvcGVyYW5kIHR5cGVzIGFyZSBvcHRpb25hbC4gIEFsbCBjYXNlcyB3aGljaCBtaWdodCB1c2UKLSAgICAgYW4gb3B0aW9uYWwgb3BlcmFuZCBzZXBhcmF0ZSB0aGUgb3BlcmFuZHMgb25seSB3aXRoIGNvbW1hcyAoaW4KLSAgICAgc29tZSBjYXNlcyBwYXJlbnRoZXNlcyBhcmUgdXNlZCwgYXMgaW4gYGBsd3ogMSwwKDEpJycgYnV0IHN1Y2gKLSAgICAgY2FzZXMgbmV2ZXIgaGF2ZSBvcHRpb25hbCBvcGVyYW5kcykuICBUaGVyZSBpcyBuZXZlciBtb3JlIHRoYW4KLSAgICAgb25lIG9wdGlvbmFsIG9wZXJhbmQgZm9yIGFuIGluc3RydWN0aW9uLiAgU28sIGJlZm9yZSB3ZSBzdGFydAotICAgICBzZXJpb3VzbHkgcGFyc2luZyB0aGUgb3BlcmFuZHMsIHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFuCi0gICAgIG9wdGlvbmFsIG9wZXJhbmQsIGFuZCwgaWYgd2UgZG8sIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIHRvCi0gICAgIHNlZSB3aGV0aGVyIHRoZSBvcGVyYW5kIHNob3VsZCBiZSBvbWl0dGVkLiAgKi8KLSAgc2tpcF9vcHRpb25hbCA9IDA7Ci0gIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotCi0gICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9PUFRJT05BTCkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgb3Bjb3VudDsKLQotCSAgLyogVGhlcmUgaXMgYW4gb3B0aW9uYWwgb3BlcmFuZC4gIENvdW50IHRoZSBudW1iZXIgb2YKLQkgICAgIGNvbW1hcyBpbiB0aGUgaW5wdXQgbGluZS4gICovCi0JICBpZiAoKnN0ciA9PSAnXDAnKQotCSAgICBvcGNvdW50ID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wY291bnQgPSAxOwotCSAgICAgIHMgPSBzdHI7Ci0JICAgICAgd2hpbGUgKChzID0gc3RyY2hyIChzLCAnLCcpKSAhPSAoY2hhciAqKSBOVUxMKQotCQl7Ci0JCSAgKytvcGNvdW50OwotCQkgICsrczsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIElmIHRoZXJlIGFyZSBmZXdlciBvcGVyYW5kcyBpbiB0aGUgbGluZSB0aGVuIGFyZSBjYWxsZWQKLQkgICAgIGZvciBieSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHdhbnQgdG8gc2tpcCB0aGUgb3B0aW9uYWwKLQkgICAgIG9wZXJhbmQuICAqLwotCSAgaWYgKG9wY291bnQgPCBzdHJsZW4gKG9wY29kZS0+b3BlcmFuZHMpKQotCSAgICBza2lwX29wdGlvbmFsID0gMTsKLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBHYXRoZXIgdGhlIG9wZXJhbmRzLiAgKi8KLSAgbmVlZF9wYXJlbiA9IDA7Ci0gIG5leHRfb3BpbmRleCA9IDA7Ci0gIGZjID0gMDsKLSAgZm9yIChvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4X3B0ciAhPSAwOyBvcGluZGV4X3B0cisrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgZXhwcmVzc2lvblMgZXg7Ci0gICAgICBjaGFyIGVuZGM7Ci0KLSAgICAgIGlmIChuZXh0X29waW5kZXggPT0gMCkKLQlvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbbmV4dF9vcGluZGV4XTsKLQkgIG5leHRfb3BpbmRleCA9IDA7Ci0JfQotCi0gICAgICBlcnJtc2cgPSBOVUxMOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgZmFrZSBvcGVyYW5kLCB0aGVuIHdlIGRvIG5vdCBleHBlY3QgYW55dGhpbmcKLQkgZnJvbSB0aGUgaW5wdXQuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZBS0UpICE9IDApCi0JewotCSAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgMEwsICZlcnJtc2cpOwotCSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCSAgICBhc19iYWQgKGVycm1zZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gb3B0aW9uYWwgb3BlcmFuZCwgYW5kIHdlIGFyZSBza2lwcGluZyBpdCwganVzdAotCSBpbnNlcnQgYSB6ZXJvLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9PUFRJT05BTCkgIT0gMAotCSAgJiYgc2tpcF9vcHRpb25hbCkKLQl7Ci0JICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotCSAgICB7Ci0JICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgMEwsICZlcnJtc2cpOwotCSAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJYXNfYmFkIChlcnJtc2cpOwotCSAgICB9Ci0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfTkVYVCkgIT0gMCkKLQkgICAgbmV4dF9vcGluZGV4ID0gKm9waW5kZXhfcHRyICsgMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAgKi8KLSAgICAgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSNpZmRlZiBURV9QRQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1snKSAKLQl7Ci0JICAvKiBXZSBhcmUgZXhwZWN0aW5nIHNvbWV0aGluZyBsaWtlIHRoZSBzZWNvbmQgYXJndW1lbnQgaGVyZToKLQotCSAgICAgICAgbHd6IHI0LFt0b2NdLkdTLjAuc3RhdGljX2ludChydG9jKQotICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KLQkgICAgIFRoZSBhcmd1bWVudCBmb2xsb3dpbmcgdGhlIGBdJyBtdXN0IGJlIGEgc3ltYm9sIG5hbWUsIGFuZCB0aGUgCi0gICAgICAgICAgICAgcmVnaXN0ZXIgbXVzdCBiZSB0aGUgdG9jIHJlZ2lzdGVyOiAncnRvYycgb3IgJzInCi0KLQkgICAgIFRoZSBlZmZlY3QgaXMgdG8gMCBhcyB0aGUgZGlzcGxhY2VtZW50IGZpZWxkCi0JICAgICBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGFuZCBpc3N1ZSBhbiBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2IChvcgotCSAgICAgdGhlIGFwcHJvcHJpYXRlIHZhcmlhdGlvbikgcmVsb2MgYWdhaW5zdCBpdCBiYXNlZCBvbiB0aGUgc3ltYm9sLgotCSAgICAgVGhlIGxpbmtlciB3aWxsIGJ1aWxkIHRoZSB0b2MsIGFuZCBpbnNlcnQgdGhlIHJlc29sdmVkIHRvYyBvZmZzZXQuCi0KLQkgICAgIE5vdGU6Ci0JICAgICBvIFRoZSBzaXplIG9mIHRoZSB0b2MgZW50cnkgaXMgY3VycmVudGx5IGFzc3VtZWQgdG8gYmUKLQkgICAgICAgMzIgYml0cy4gVGhpcyBzaG91bGQgbm90IGJlIGFzc3VtZWQgdG8gYmUgYSBoYXJkIGNvZGVkCi0JICAgICAgIG51bWJlci4KLQkgICAgIG8gSW4gYW4gZWZmb3J0IHRvIGNvcGUgd2l0aCBhIGNoYW5nZSBmcm9tIDMyIHRvIDY0IGJpdHMsCi0JICAgICAgIHRoZXJlIGFyZSBhbHNvIHRvYyBlbnRyaWVzIHRoYXQgYXJlIHNwZWNpZmllZCB0byBiZQotCSAgICAgICBlaXRoZXIgMzIgb3IgNjQgYml0czoKLSAgICAgICAgICAgICAgICAgbHd6IHI0LFt0b2MzMl0uR1MuMC5zdGF0aWNfaW50KHJ0b2MpCi0JICAgICAgICAgbHd6IHI0LFt0b2M2NF0uR1MuMC5zdGF0aWNfaW50KHJ0b2MpCi0JICAgICAgIFRoZXNlIGRlbWFuZCB0b2MgZW50cmllcyBvZiB0aGUgc3BlY2lmaWVkIHNpemUsIGFuZCB0aGUKLQkgICAgICAgaW5zdHJ1Y3Rpb24gcHJvYmFibHkgcmVxdWlyZXMgaXQuCi0gICAgICAgICAgKi8KLQotCSAgaW50IHZhbGlkX3RvYzsKLQkgIGVudW0gdG9jX3NpemVfcXVhbGlmaWVyIHRvY19raW5kOwotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHRvY19yZWxvYzsKLQotCSAgLyogZ28gcGFyc2Ugb2ZmIHRoZSBbdG9jWFhdIHBhcnQgKi8KLQkgIHZhbGlkX3RvYyA9IHBhcnNlX3RvY19lbnRyeSgmdG9jX2tpbmQpOwotCi0JICBpZiAoIXZhbGlkX3RvYykgCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkLiAgICAgKi8KLQkgICAgICAvKiBGSVhNRTogd2hhdCBzb3J0IG9mIHJlY292ZXJ5IHNob3VsZCB3ZSBkbz8gKi8KLQkgICAgICAvKiAgICAgICAgZGVtYW5kX3Jlc3Rfb2ZfbGluZSgpOyByZXR1cm47ID8gICAgKi8KLQkgICAgfQotCi0JICAvKiBOb3cgZ2V0IHRoZSBzeW1ib2wgZm9sbG93aW5nIHRoZSAnXScgKi8KLQkgIGV4cHJlc3Npb24oJmV4KTsKLQotCSAgc3dpdGNoICh0b2Nfa2luZCkKLQkgICAgewotCSAgICBjYXNlIGRlZmF1bHRfdG9jOgotCSAgICAgIC8qIEluIHRoaXMgY2FzZSwgd2UgbWF5IG5vdCBoYXZlIHNlZW4gdGhlIHN5bWJvbCB5ZXQsIHNpbmNlICAqLwotCSAgICAgIC8qIGl0IGlzIGFsbG93ZWQgdG8gYXBwZWFyIG9uIGEgLmV4dGVybiBvciAuZ2xvYmwgb3IganVzdCBiZSAqLwotCSAgICAgIC8qIGEgbGFiZWwgaW4gdGhlIC5kYXRhIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIHRvY19yZWxvYyA9IEJGRF9SRUxPQ19QUENfVE9DMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZGF0YV9pbl90b2M6Ci0JICAgICAgLyogMS4gVGhlIHN5bWJvbCBtdXN0IGJlIGRlZmluZWQgYW5kIGVpdGhlciBpbiB0aGUgdG9jICAgICAgICAqLwotCSAgICAgIC8qICAgIHNlY3Rpb24sIG9yIGEgZ2xvYmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICAvKiAyLiBUaGUgcmVsb2MgZ2VuZXJhdGVkIG11c3QgaGF2ZSB0aGUgVE9DREVGTiBmbGFnIHNldCBpbiAgICovCi0JICAgICAgLyogICAgdXBwZXIgYml0IG1lc3Mgb2YgdGhlIHJlbG9jIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIC8qIEZJWE1FOiBJdCdzIGEgbGl0dGxlIGNvbmZ1c2luZyB3aGF0IHRoZSB0b2N2IHF1YWxpZmllciBjYW4gKi8KLQkgICAgICAvKiAgICAgICAgYmUgdXNlZCBmb3IuIEF0IHRoZSB2ZXJ5IGxlYXN0LCBJJ3ZlIHNlZW4gdGhyZWUgICAgICovCi0JICAgICAgLyogICAgICAgIHVzZXMsIG9ubHkgb25lIG9mIHdoaWNoIEknbSBzdXJlIEkgY2FuIGV4cGxhaW4uICAgICAqLwotCSAgICAgIGlmIChleC5YX29wID09IE9fc3ltYm9sKSAKLQkJewkJICAKLQkJICBhc3NlcnQgKGV4LlhfYWRkX3N5bWJvbCAhPSBOVUxMKTsKLQkJICBpZiAoc3ltYm9sX2dldF9iZmRzeW0gKGV4LlhfYWRkX3N5bWJvbCktPnNlY3Rpb24KLQkJICAgICAgIT0gdG9jZGF0YV9zZWN0aW9uKQotCQkgICAgewotCQkgICAgICBhc19iYWQoXygiW3RvY3ZdIHN5bWJvbCBpcyBub3QgYSB0b2Mgc3ltYm9sIikpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIG11c3RfYmVfMzI6Ci0JICAgICAgLyogRklYTUU6IHRoZXNlIG5leHQgdHdvIHNwZWNpZmljYWxseSBzcGVjaWZ5IDMyLzY0IGJpdCB0b2MgICAqLwotCSAgICAgIC8qICAgICAgICBlbnRyaWVzLiBXZSBkb24ndCBzdXBwb3J0IHRoZW0gdG9kYXkuIElzIHRoaXMgdGhlICAgKi8KLQkgICAgICAvKiAgICAgICAgcmlnaHQgd2F5IHRvIHNheSB0aGF0PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgdG9jX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgICBhc19iYWQgKF8oIlVuaW1wbGVtZW50ZWQgdG9jMzIgZXhwcmVzc2lvbiBtb2RpZmllciIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBtdXN0X2JlXzY0OgotCSAgICAgIC8qIEZJWE1FOiBzZWUgYWJvdmUgKi8KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgIGFzX2JhZCAoXygiVW5pbXBsZW1lbnRlZCB0b2M2NCBleHByZXNzaW9uIG1vZGlmaWVyIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYoc3RkZXJyLCAKLQkJICAgICAgXygiVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgWyVkXSBmcm9tIHBhcnNlX3RvY19lbnRyeSFcbiIpLAotCQkgICAgICB0b2Nfa2luZCk7Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICBmaXh1cHNbZmNdLnJlbG9jID0gdG9jX3JlbG9jOwotCSAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgIGZpeHVwc1tmY10ub3BpbmRleCA9ICpvcGluZGV4X3B0cjsKLQkgICsrZmM7Ci0KLSAgICAgICAgICAvKiBPay4gV2UndmUgc2V0IHVwIHRoZSBmaXh1cCBmb3IgdGhlIGluc3RydWN0aW9uLiBOb3cgbWFrZSBpdAotCSAgICAgbG9vayBsaWtlIHRoZSBjb25zdGFudCAwIHdhcyBmb3VuZCBoZXJlICovCi0JICBleC5YX3Vuc2lnbmVkID0gMTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQkgIGV4LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBlbHNlCi0jZW5kaWYJCS8qIFRFX1BFICovCi0JewotCSAgaWYgKCEgcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9DUikgIT0gMCkKLQkJY3Jfb3BlcmFuZCA9IHRydWU7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4KTsKLQkgICAgICBjcl9vcGVyYW5kID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLSAgICAgIGlmIChleC5YX29wID09IE9faWxsZWdhbCkKLQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19hYnNlbnQpCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gICAgICBlbHNlIGlmIChleC5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgaW5zbiA9IHBwY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAotCQkJCSAgICAgKGNoYXIgKikgTlVMTCwgMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoZXguWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBBbGxvdyBASEEsIEBMLCBASCBvbiBjb25zdGFudHMuICovCi0JICBjaGFyICpvcmlnX3N0ciA9IHN0cjsKLQotCSAgaWYgKChyZWxvYyA9IHBwY19lbGZfc3VmZml4ICgmc3RyLCAmZXgpKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICBzd2l0Y2ggKHJlbG9jKQotCSAgICAgIHsKLQkgICAgICBkZWZhdWx0OgotCQlzdHIgPSBvcmlnX3N0cjsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCQkvKiBYX3Vuc2lnbmVkIGlzIHRoZSBkZWZhdWx0LCBzbyBpZiB0aGUgdXNlciBoYXMgZG9uZQotICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyB3aGljaCBjbGVhcmVkIGl0LCB3ZSBhbHdheXMgcHJvZHVjZSBhCi0gICAgICAgICAgICAgICAgICAgc2lnbmVkIHZhbHVlLiAgKi8KLQkJaWYgKGV4LlhfdW5zaWduZWQKLQkJICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgPT0gMCkKLQkJICBleC5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOwotCQllbHNlCi0JCSAgZXguWF9hZGRfbnVtYmVyID0gKCgoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmKQotCQkJCSAgICAgIF4gMHg4MDAwKQotCQkJCSAgICAgLSAweDgwMDApOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JCWV4LlhfYWRkX251bWJlciA9IChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkJZXguWF9hZGRfbnVtYmVyID0gKCgoKGV4LlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmYpCi0JCQkJICAgICsgKChleC5YX2FkZF9udW1iZXIgPj4gMTUpICYgMSkpCi0JCQkJICAgJiAweGZmZmYpOwotCQlicmVhazsKLQkgICAgICB9Ci0jZW5kaWYKLQkgIGluc24gPSBwcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKLQkJCQkgICAgIChjaGFyICopIE5VTEwsIDApOwotCX0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICgocmVsb2MgPSBwcGNfZWxmX3N1ZmZpeCAoJnN0ciwgJmV4KSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICAvKiBGb3IgdGhlIGFic291bHRlIGZvcm1zIG9mIGJyYW5jaHMsIGNvbnZlcnQgdGhlIFBDIHJlbGF0aXZlIGZvcm0gYmFjayBpbnRvCi0JICAgICB0aGUgYWJzb2x1dGUuICAqLwotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyZWxvYykKLQkJewotCQljYXNlIEJGRF9SRUxPQ19QUENfQjI2OgotCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTI2OwotCQkgIGJyZWFrOwotCQljYXNlIEJGRF9SRUxPQ19QUENfQjE2OgotCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTE2OwotCQkgIGJyZWFrOwotCQljYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU46Ci0JCSAgcmVsb2MgPSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTjsKLQkJICBicmVhazsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTjoKLQkJICByZWxvYyA9IEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTjsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gMDsKLQkgIGZpeHVwc1tmY10ucmVsb2MgPSByZWxvYzsKLQkgICsrZmM7Ci0JfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICArK2ZjOwotCX0KLQotICAgICAgaWYgKG5lZWRfcGFyZW4pCi0JewotCSAgZW5kYyA9ICcpJzsKLQkgIG5lZWRfcGFyZW4gPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMCkKLQl7Ci0JICBlbmRjID0gJygnOwotCSAgbmVlZF9wYXJlbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCWVuZGMgPSAnLCc7Ci0KLSAgICAgIC8qIFRoZSBjYWxsIHRvIGV4cHJlc3Npb24gc2hvdWxkIGhhdmUgYWR2YW5jZWQgc3RyIHBhc3QgYW55Ci0JIHdoaXRlc3BhY2UuICAqLwotICAgICAgaWYgKCpzdHIgIT0gZW5kYwotCSAgJiYgKGVuZGMgIT0gJywnIHx8ICpzdHIgIT0gJ1wwJykpCi0JewotCSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I7IGZvdW5kIGAlYycgYnV0IGV4cGVjdGVkIGAlYyciKSwgKnN0ciwgZW5kYyk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICgqc3RyICE9ICdcMCcpCi0JKytzdHI7Ci0gICAgfQotCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLQotICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCi0gICAgIEJGRF9SRUxPQ19VTlVTRUQgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkKLSAgICAgaGFuZGxlIGZpeHVwcyBmb3IgYW55IG9wZXJhbmQgdHlwZSwgYWx0aG91Z2ggdGhhdCBpcyBhZG1pdHRlZGx5Ci0gICAgIG5vdCBhIHZlcnkgZXhjaXRpbmcgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbgotICAgICBtZF9hcHBseV9maXguICAqLwotICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotCi0gICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOwotICAgICAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCXsKLQkgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwc1tpXS5yZWxvYyk7Ci0JICBpbnQgc2l6ZTsKLQkgIGludCBvZmZzZXQ7Ci0JICBmaXhTICpmaXhQOwotCi0JICBpZiAoIXJlbG9jX2hvd3RvKQotCSAgICBhYm9ydCAoKTsKLQotCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCSAgb2Zmc2V0ID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAoNCAtIHNpemUpIDogMDsKLQotCSAgaWYgKHNpemUgPCAxIHx8IHNpemUgPiA0KQotCSAgICBhYm9ydCgpOwotCi0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsIHNpemUsCi0JCQkgICAgICAmZml4dXBzW2ldLmV4cCwgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJICAgICAgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgLyogVHVybiBvZmYgY29tcGxhaW50cyB0aGF0IHRoZSBhZGRlbmQgaXMgdG9vIGxhcmdlIGZvciB0aGluZ3MgbGlrZQotCSAgICAgZm9vKzEwMDAwMEBoYS4gICovCi0JICBzd2l0Y2ggKGZpeHVwc1tpXS5yZWxvYykKLQkgICAgewotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCSAgICAgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJICAgICAmZml4dXBzW2ldLmV4cCwKLQkJICAgICAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9SRUxBVElWRSkgIT0gMCwKLQkJICAgICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKLQkJICAgICAgIChmaXh1cHNbaV0ub3BpbmRleCArIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpKSk7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgYSBtYWNyby4gIEdhdGhlciBhbGwgdGhlIG9wZXJhbmRzLCB0cmFuc2Zvcm0gdGhlbSBhcwotICAgZGVzY3JpYmVkIGJ5IHRoZSBtYWNybywgYW5kIGNhbGwgbWRfYXNzZW1ibGUgcmVjdXJzaXZlbHkuICBBbGwgdGhlCi0gICBvcGVyYW5kcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hczsgd2UgZG9uJ3QgYWNjZXB0IHBhcmVudGhlc2VzCi0gICBhcm91bmQgb3BlcmFuZHMgaGVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfbWFjcm8gKHN0ciwgbWFjcm8pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotewotICBjaGFyICpvcGVyYW5kc1sxMF07Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgY2hhciAqczsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY29uc3QgY2hhciAqZm9ybWF0OwotICBpbnQgYXJnOwotICBjaGFyICpzZW5kOwotICBjaGFyICpjb21wbGV0ZTsKLQotICAvKiBHYXRoZXIgdGhlIHVzZXJzIG9wZXJhbmRzIGludG8gdGhlIG9wZXJhbmRzIGFycmF5LiAgKi8KLSAgY291bnQgPSAwOwotICBzID0gc3RyOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoY291bnQgPj0gc2l6ZW9mIG9wZXJhbmRzIC8gc2l6ZW9mIG9wZXJhbmRzWzBdKQotCWJyZWFrOwotICAgICAgb3BlcmFuZHNbY291bnQrK10gPSBzOwotICAgICAgcyA9IHN0cmNociAocywgJywnKTsKLSAgICAgIGlmIChzID09IChjaGFyICopIE5VTEwpCi0JYnJlYWs7Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICB9ICAKLQotICBpZiAoY291bnQgIT0gbWFjcm8tPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygid3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXb3JrIG91dCBob3cgbGFyZ2UgdGhlIHN0cmluZyBtdXN0IGJlICh0aGUgc2l6ZSBpcyB1bmJvdW5kZWQKLSAgICAgYmVjYXVzZSBpdCBpbmNsdWRlcyB1c2VyIGlucHV0KS4gICovCi0gIGxlbiA9IDA7Ci0gIGZvcm1hdCA9IG1hY3JvLT5mb3JtYXQ7Ci0gIHdoaWxlICgqZm9ybWF0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCpmb3JtYXQgIT0gJyUnKQotCXsKLQkgICsrbGVuOwotCSAgKytmb3JtYXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFyZyA9IHN0cnRvbCAoZm9ybWF0ICsgMSwgJnNlbmQsIDEwKTsKLQkgIGtub3cgKHNlbmQgIT0gZm9ybWF0ICYmIGFyZyA+PSAwICYmIGFyZyA8IGNvdW50KTsKLQkgIGxlbiArPSBzdHJsZW4gKG9wZXJhbmRzW2FyZ10pOwotCSAgZm9ybWF0ID0gc2VuZDsKLQl9Ci0gICAgfQotCi0gIC8qIFB1dCB0aGUgc3RyaW5nIHRvZ2V0aGVyLiAgKi8KLSAgY29tcGxldGUgPSBzID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKLSAgZm9ybWF0ID0gbWFjcm8tPmZvcm1hdDsKLSAgd2hpbGUgKCpmb3JtYXQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoKmZvcm1hdCAhPSAnJScpCi0JKnMrKyA9ICpmb3JtYXQrKzsKLSAgICAgIGVsc2UKLQl7Ci0JICBhcmcgPSBzdHJ0b2wgKGZvcm1hdCArIDEsICZzZW5kLCAxMCk7Ci0JICBzdHJjcHkgKHMsIG9wZXJhbmRzW2FyZ10pOwotCSAgcyArPSBzdHJsZW4gKHMpOwotCSAgZm9ybWF0ID0gc2VuZDsKLQl9Ci0gICAgfQotICAqcyA9ICdcMCc7Ci0KLSAgLyogQXNzZW1ibGUgdGhlIGNvbnN0cnVjdGVkIGluc3RydWN0aW9uLiAgKi8KLSAgbWRfYXNzZW1ibGUgKGNvbXBsZXRlKTsKLX0gIAotDAotI2lmZGVmIE9CSl9FTEYKLS8qIEZvciBFTEYsIGFkZCBzdXBwb3J0IGZvciBTSEZfRVhDTFVERSBhbmQgU0hUX09SREVSRUQgKi8KLQotaW50Ci1wcGNfc2VjdGlvbl9sZXR0ZXIgKGxldHRlciwgcHRyX21zZykKLSAgICAgaW50IGxldHRlcjsKLSAgICAgY2hhciAqKnB0cl9tc2c7Ci17Ci0gIGlmIChsZXR0ZXIgPT0gJ2UnKQotICAgIHJldHVybiBTSEZfRVhDTFVERTsKLQotICAqcHRyX21zZyA9IF8oIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmU6IHdhbnQgYSx3LHgsZSBpbiBzdHJpbmciKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fd29yZCAoc3RyLCBsZW4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgaWYgKGxlbiA9PSA3ICYmIHN0cm5jbXAgKHN0ciwgImV4Y2x1ZGUiLCA3KSA9PSAwKQotICAgIHJldHVybiBTSEZfRVhDTFVERTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fdHlwZSAoc3RyLCBsZW4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgaWYgKGxlbiA9PSA3ICYmIHN0cm5jbXAgKHN0ciwgIm9yZGVyZWQiLCA3KSA9PSAwKQotICAgIHJldHVybiBTSFRfT1JERVJFRDsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fZmxhZ3MgKGZsYWdzLCBhdHRyLCB0eXBlKQotICAgICBpbnQgZmxhZ3M7Ci0gICAgIGludCBhdHRyOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gU0hUX09SREVSRUQpCi0gICAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfU09SVF9FTlRSSUVTOwotCi0gIGlmIChhdHRyICYgU0hGX0VYQ0xVREUpCi0gICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgcmV0dXJuIGZsYWdzOwotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotDAotLyogUHNldWRvLW9wIGhhbmRsaW5nLiAgKi8KLQotLyogVGhlIC5ieXRlIHBzZXVkby1vcC4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgbm9ybWFsIC5ieXRlCi0gICBwc2V1ZG8tb3AsIGJ1dCBpdCBjYW4gYWxzbyB0YWtlIGEgc2luZ2xlIEFTQ0lJIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYnl0ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCInKQotICAgIHsKLSAgICAgIGNvbnMgKDEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBHYXRoZXIgY2hhcmFjdGVycy4gIEEgcmVhbCBkb3VibGUgcXVvdGUgaXMgZG91YmxlZC4gIFVudXN1YWwKLSAgICAgY2hhcmFjdGVycyBhcmUgbm90IHBlcm1pdHRlZC4gICovCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgICAgIGlmIChjID09ICdcIicpCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKLQkgICAgYnJlYWs7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0KLSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0jaWZkZWYgT0JKX1hDT0ZGCi0KLS8qIFhDT0ZGIHNwZWNpZmljIHBzZXVkby1vcCBoYW5kbGluZy4gICovCi0KLS8qIFRoaXMgaXMgc2V0IGlmIHdlIGFyZSBjcmVhdGluZyBhIC5zdGFieCBzeW1ib2wsIHNpbmNlIHdlIGRvbid0IHdhbnQKLSAgIHRvIGhhbmRsZSBzeW1ib2wgc3VmZml4ZXMgZm9yIHN1Y2ggc3ltYm9scy4gICovCi1zdGF0aWMgYm9vbGVhbiBwcGNfc3RhYl9zeW1ib2w7Ci0KLS8qIFRoZSAuY29tbSBhbmQgLmxjb21tIHBzZXVkby1vcHMgZm9yIFhDT0ZGLiAgWENPRkYgcHV0cyBjb21tb24KLSAgIHN5bWJvbHMgaW4gdGhlIC5ic3Mgc2VnbWVudCBhcyB0aG91Z2ggdGhleSB3ZXJlIGxvY2FsIGNvbW1vbgotICAgc3ltYm9scywgYW5kIHVzZXMgYSBkaWZmZXJlbnQgc21jbGFzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19jb21tIChsY29tbSkKLSAgICAgaW50IGxjb21tOwotewotICBhc2VjdGlvbiAqY3VycmVudF9zZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBjaGFyICplbmRfbmFtZTsKLSAgb2Zmc2V0VCBzaXplOwotICBvZmZzZXRUIGFsaWduOwotICBzeW1ib2xTICpsY29tbV9zeW0gPSBOVUxMOwotICBzeW1ib2xTICpzeW07Ci0gIGNoYXIgKnBmcmFnOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZW5kX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICplbmRfbmFtZSA9IGVuZGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBzaXplIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKHNpemUgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibmVnYXRpdmUgc2l6ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICghIGxjb21tKQotICAgIHsKLSAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAuY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQlhbGlnbiA9IDM7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKGFsaWduIDw9IDApCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgICAgIGFsaWduID0gMzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpsY29tbV9uYW1lOwotICAgICAgY2hhciBsY29tbV9lbmRjOwotCi0gICAgICBpZiAoc2l6ZSA8PSAxKQotCWFsaWduID0gMDsKLSAgICAgIGVsc2UgaWYgKHNpemUgPD0gMikKLQlhbGlnbiA9IDE7Ci0gICAgICBlbHNlIGlmIChzaXplIDw9IDQpCi0JYWxpZ24gPSAyOwotICAgICAgZWxzZQotCWFsaWduID0gMzsKLQotICAgICAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5sY29tbSBhcHBlYXJzIHRvIGJlIHRoZSByZWFsIGxvY2FsCi0JIGNvbW1vbiBzeW1ib2wgdG8gY3JlYXRlLiAgUmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIG5hbWVkIGluCi0JIHRoZSBmaXJzdCBhcmd1bWVudCBhcmUgdHVybmVkIGludG8gcmVmZXJlbmNlcyB0byB0aGUgdGhpcmQKLQkgYXJndW1lbnQuICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyByZWFsIHN5bWJvbCBuYW1lIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgbGNvbW1fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGxjb21tX2VuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIAotICAgICAgbGNvbW1fc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobGNvbW1fbmFtZSk7Ci0KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBsY29tbV9lbmRjOwotICAgIH0KLQotICAqZW5kX25hbWUgPSAnXDAnOwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmVuZF9uYW1lID0gZW5kYzsKLQotICBpZiAoU19JU19ERUZJTkVEIChzeW0pCi0gICAgICB8fCBTX0dFVF9WQUxVRSAoc3ltKSAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byByZWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgIAotICBpZiAoISBsY29tbQotICAgICAgfHwgISBTX0lTX0RFRklORUQgKGxjb21tX3N5bSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqZGVmX3N5bTsKLSAgICAgIG9mZnNldFQgZGVmX3NpemU7Ci0KLSAgICAgIGlmICghIGxjb21tKQotCXsKLQkgIGRlZl9zeW0gPSBzeW07Ci0JICBkZWZfc2l6ZSA9IHNpemU7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sX2dldF90YyAobGNvbW1fc3ltKS0+b3V0cHV0ID0gMTsKLQkgIGRlZl9zeW0gPSBsY29tbV9zeW07Ci0JICBkZWZfc2l6ZSA9IDA7Ci0JfQotCi0gICAgICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMSk7Ci0gICAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0gIAotICAgICAgc3ltYm9sX3NldF9mcmFnIChkZWZfc3ltLCBmcmFnX25vdyk7Ci0gICAgICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIGRlZl9zeW0sCi0JCQlkZWZfc2l6ZSwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICAqcGZyYWcgPSAwOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bSwgYnNzX3NlY3Rpb24pOwotICAgICAgc3ltYm9sX2dldF90YyAoZGVmX3N5bSktPmFsaWduID0gYWxpZ247Ci0gICAgfQotICBlbHNlIGlmIChsY29tbSkKLSAgICB7Ci0gICAgICAvKiBBbGlnbiB0aGUgc2l6ZSBvZiBsY29tbV9zeW0uICAqLwotICAgICAgc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pLT5mcl9vZmZzZXQgPQotCSgoc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pLT5mcl9vZmZzZXQgKyAoMSA8PCBhbGlnbikgLSAxKQotCSAmfiAoKDEgPDwgYWxpZ24pIC0gMSkpOwotICAgICAgaWYgKGFsaWduID4gc3ltYm9sX2dldF90YyAobGNvbW1fc3ltKS0+YWxpZ24pCi0Jc3ltYm9sX2dldF90YyAobGNvbW1fc3ltKS0+YWxpZ24gPSBhbGlnbjsKLSAgICB9Ci0KLSAgaWYgKGxjb21tKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3ltIGFuIG9mZnNldCBmcm9tIGxjb21tX3N5bS4gICovCi0gICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGJzc19zZWN0aW9uKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBzeW1ib2xfZ2V0X2ZyYWcgKGxjb21tX3N5bSkpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pLT5mcl9vZmZzZXQpOwotICAgICAgc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pLT5mcl9vZmZzZXQgKz0gc2l6ZTsKLSAgICB9Ci0KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmNzZWN0IHBzZXVkby1vcC4gIFRoaXMgc3dpdGNoZXMgdXMgaW50byBhIGRpZmZlcmVudAotICAgc3Vic2VnbWVudC4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHN5bWJvbCB3aG9zZSB2YWx1ZSBpcyB0aGUKLSAgIHN0YXJ0IG9mIHRoZSAuY3NlY3QuICBJbiBDT0ZGLCBjc2VjdCBzeW1ib2xzIGdldCBzcGVjaWFsIGF1eAotICAgZW50cmllcyBkZWZpbmVkIGJ5IHRoZSB4X2NzZWN0IGZpZWxkIG9mIHVuaW9uIGludGVybmFsX2F1eGVudC4gIFRoZQotICAgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBhbGlnbm1lbnQgKHRoZSBkZWZhdWx0IGlzIDIpLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19jc2VjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIAotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBpZiAoU19HRVRfTkFNRSAoc3ltKVswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIEFuIHVubmFtZWQgY3NlY3QgaXMgYXNzdW1lZCB0byBiZSBbUFJdLiAgKi8KLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gWE1DX1BSOwotICAgIH0KLQotICBwcGNfY2hhbmdlX2NzZWN0IChzeW0pOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIENoYW5nZSB0byBhIGRpZmZlcmVudCBjc2VjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY2hhbmdlX2NzZWN0IChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSkKLSAgICBzdWJzZWdfc2V0IChTX0dFVF9TRUdNRU5UIChzeW0pLCBzeW1ib2xfZ2V0X3RjIChzeW0pLT5zdWJzZWcpOwotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUyAqKmxpc3RfcHRyOwotICAgICAgaW50IGFmdGVyX3RvYzsKLSAgICAgIGludCBob2xkX2NodW5rc2l6ZTsKLSAgICAgIHN5bWJvbFMgKmxpc3Q7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBuZXcgY3NlY3QuICBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHN5bWJvbCBjbGFzcyB0bwotCSBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgc2hvdWxkIGdvIGluIHRoZSB0ZXh0IHNlY3Rpb24gb3IgdGhlCi0JIGRhdGEgc2VjdGlvbi4gICovCi0gICAgICBhZnRlcl90b2MgPSAwOwotICAgICAgc3dpdGNoIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcykKLQl7Ci0JY2FzZSBYTUNfUFI6Ci0JY2FzZSBYTUNfUk86Ci0JY2FzZSBYTUNfREI6Ci0JY2FzZSBYTUNfR0w6Ci0JY2FzZSBYTUNfWE86Ci0JY2FzZSBYTUNfU1Y6Ci0JY2FzZSBYTUNfVEk6Ci0JY2FzZSBYTUNfVEI6Ci0JICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0JICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5zdWJzZWcgPSBwcGNfdGV4dF9zdWJzZWdtZW50OwotCSAgKytwcGNfdGV4dF9zdWJzZWdtZW50OwotCSAgbGlzdF9wdHIgPSAmcHBjX3RleHRfY3NlY3RzOwotCSAgYnJlYWs7Ci0JY2FzZSBYTUNfUlc6Ci0JY2FzZSBYTUNfVEMwOgotCWNhc2UgWE1DX1RDOgotCWNhc2UgWE1DX0RTOgotCWNhc2UgWE1DX1VBOgotCWNhc2UgWE1DX0JTOgotCWNhc2UgWE1DX1VDOgotCSAgaWYgKHBwY190b2NfY3NlY3QgIT0gTlVMTAotCSAgICAgICYmIChzeW1ib2xfZ2V0X3RjIChwcGNfdG9jX2NzZWN0KS0+c3Vic2VnICsgMQotCQkgID09IHBwY19kYXRhX3N1YnNlZ21lbnQpKQotCSAgICBhZnRlcl90b2MgPSAxOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltLCBkYXRhX3NlY3Rpb24pOwotCSAgc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnID0gcHBjX2RhdGFfc3Vic2VnbWVudDsKLQkgICsrcHBjX2RhdGFfc3Vic2VnbWVudDsKLQkgIGxpc3RfcHRyID0gJnBwY19kYXRhX2NzZWN0czsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIFdlIHNldCB0aGUgb2JzdGFjayBjaHVuayBzaXplIHRvIGEgc21hbGwgdmFsdWUgYmVmb3JlCi0gICAgICAgICBjaGFuZ2luZyBzdWJzZWdtZW50cywgc28gdGhhdCB3ZSBkb24ndCB1c2UgYSBsb3Qgb2YgbWVtb3J5Ci0gICAgICAgICBzcGFjZSBmb3Igd2hhdCBtYXkgYmUgYSBzbWFsbCBzZWN0aW9uLiAgKi8KLSAgICAgIGhvbGRfY2h1bmtzaXplID0gY2h1bmtzaXplOwotICAgICAgY2h1bmtzaXplID0gNjQ7Ci0KLSAgICAgIHN1YnNlZ19uZXcgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSksCi0JCSAgc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnKTsKLQotICAgICAgY2h1bmtzaXplID0gaG9sZF9jaHVua3NpemU7Ci0KLSAgICAgIGlmIChhZnRlcl90b2MpCi0JcHBjX2FmdGVyX3RvY19mcmFnID0gZnJhZ19ub3c7Ci0KLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCi0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5hbGlnbiA9IDI7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+d2l0aGluID0gc3ltOwotCSAgCi0gICAgICBmb3IgKGxpc3QgPSAqbGlzdF9wdHI7Ci0JICAgc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTDsKLQkgICBsaXN0ID0gc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQpCi0JOwotICAgICAgc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQgPSBzeW07Ci0JICAKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChzeW0sIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT53aXRoaW4sICZzeW1ib2xfcm9vdFAsCi0JCSAgICAgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQotCi0gIHBwY19jdXJyZW50X2NzZWN0ID0gc3ltOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIC50ZXh0IGFuZCAuZGF0YSBwc2V1ZG8tb3BzLiAgVGhlc2UKLSAgIHBzZXVkby1vcHMgYXJlbid0IHJlYWxseSB1c2VkIGJ5IFhDT0ZGOyB3ZSBpbXBsZW1lbnQgdGhlbSBmb3IgdGhlCi0gICBjb252ZW5pZW5jZSBvZiBwZW9wbGUgd2hvIGFyZW4ndCB1c2VkIHRvIFhDT0ZGLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19zZWN0aW9uICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIGlmICh0eXBlID09ICd0JykKLSAgICBuYW1lID0gIi50ZXh0W1BSXSI7Ci0gIGVsc2UgaWYgKHR5cGUgPT0gJ2QnKQotICAgIG5hbWUgPSAiLmRhdGFbUlddIjsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gIHBwY19jaGFuZ2VfY3NlY3QgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSAuc2VjdGlvbiBwc2V1ZG8tb3AuICBUaGlzIGlzIG1vc3RseSB0bwotICAgZ2l2ZSBhbiBlcnJvciwgc2luY2UgWENPRkYgb25seSBzdXBwb3J0cyAudGV4dCwgLmRhdGEgYW5kIC5ic3MsIGJ1dAotICAgd2UgZG8gcGVybWl0IHRoZSB1c2VyIHRvIG5hbWUgdGhlIHRleHQgb3IgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19uYW1lZF9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnVzZXJfbmFtZTsKLSAgY29uc3QgY2hhciAqcmVhbF9uYW1lOwotICBjaGFyIGM7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICB1c2VyX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RyY21wICh1c2VyX25hbWUsICIudGV4dCIpID09IDApCi0gICAgcmVhbF9uYW1lID0gIi50ZXh0W1BSXSI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAodXNlcl9uYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgIHJlYWxfbmFtZSA9ICIuZGF0YVtSV10iOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJUaGUgWENPRkYgZmlsZSBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMiKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKHJlYWxfbmFtZSk7Ci0KLSAgcHBjX2NoYW5nZV9jc2VjdCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmV4dGVybiBwc2V1ZG8tb3AuICBXZSBjcmVhdGUgYW4gdW5kZWZpbmVkIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZXh0ZXJuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgKHZvaWQpIHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAubGdsb2JsIHBzZXVkby1vcC4gIEtlZXAgdGhlIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19sZ2xvYmwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5yZW5hbWUgcHNldWRvLW9wLiAgVGhlIFJTLzYwMDAgYXNzZW1ibGVyIGNhbiByZW5hbWUgc3ltYm9scywKLSAgIGFsdGhvdWdoIEkgZG9uJ3Qga25vdyB3aHkgaXQgYm90aGVycy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfcmVuYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqc3ltOwotICBpbnQgbGVuOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHJlbmFtZSBzdHJpbmciKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuc3RhYnggcHNldWRvLW9wLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGEgbm9ybWFsIC5zdGFicwotICAgcHNldWRvLW9wLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50LiAgQSBzYW1wbGUgaXMKLSAgICAgICAuc3RhYnggIm1haW46Ri0xIiwubWFpbiwxNDIsMAotICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBzeW1ib2wgbmFtZSB0byBjcmVhdGUuICBUaGUgc2Vjb25kIGlzIHRoZQotICAgdmFsdWUsIGFuZCB0aGUgdGhpcmQgaXMgdGhlIHN0b3JhZ2UgY2xhc3MuICBUaGUgZm91cnRoIHNlZW1zIHRvIGJlCi0gICBhbHdheXMgemVybywgYW5kIEkgYW0gYXNzdW1pbmcgaXQgaXMgdGhlIHR5cGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3N0YWJ4IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBsZW47Ci0gIHN5bWJvbFMgKnN5bTsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHBwY19zdGFiX3N5bWJvbCA9IHRydWU7Ci0gIHN5bSA9IHN5bWJvbF9tYWtlIChuYW1lKTsKLSAgcHBjX3N0YWJfc3ltYm9sID0gZmFsc2U7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lID0gbmFtZTsKLQotICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgc3dpdGNoIChleHAuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICBjYXNlIE9fYmlnOgotICAgICAgYXNfYmFkIChfKCJpbGxlZ2FsIC5zdGFieCBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQlzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSwgJmV4cCk7Ci0gICAgICBlbHNlCi0JewotCSAgU19TRVRfVkFMVUUgKHN5bSwKLQkJICAgICAgIGV4cC5YX2FkZF9udW1iZXIgKyBTX0dFVF9WQUxVRSAoZXhwLlhfYWRkX3N5bWJvbCkpOwotCSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIHN5bWJvbF9nZXRfZnJhZyAoZXhwLlhfYWRkX3N5bWJvbCkpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBzb21lIGNvbXBsZXggZXhwcmVzc2lvbi4gIFRoaXMgd2lsbCBwcm9iYWJseQotICAgICAgICAgZmFpbCBhdCBzb21lIGxhdGVyIHBvaW50LCBidXQgdGhpcyBpcyBwcm9iYWJseSB0aGUgcmlnaHQKLSAgICAgICAgIHRoaW5nIHRvIGRvIGhlcmUuICAqLwotICAgICAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW0sICZleHApOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIFNfU0VUX1NFR01FTlQgKHN5bSwgcHBjX2NvZmZfZGVidWdfc2VjdGlvbik7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgY2xhc3MiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHR5cGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTX1NFVF9EQVRBX1RZUEUgKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19TVFNZTSkKLSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW4gPSBwcGNfY3VycmVudF9ibG9jazsKLQotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wKLSAgICAgIHx8ICEgU19JU19FWFRFUk5BTCAoZXhwLlhfYWRkX3N5bWJvbCkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpICE9IGJzc19zZWN0aW9uKQotICAgIHBwY19mcm9iX2xhYmVsIChzeW0pOwotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgZXhwLlhfYWRkX3N5bWJvbCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAocHBjX2N1cnJlbnRfY3NlY3QpLT53aXRoaW4gPT0gZXhwLlhfYWRkX3N5bWJvbCkKLQlzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbiA9IHN5bTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5mdW5jdGlvbiBwc2V1ZG8tb3AuICBUaGlzIHRha2VzIHNldmVyYWwgYXJndW1lbnRzLiAgVGhlIGZpcnN0Ci0gICBhcmd1bWVudCBzZWVtcyB0byBiZSB0aGUgZXh0ZXJuYWwgbmFtZSBvZiB0aGUgc3ltYm9sLiAgVGhlIHNlY29uZAotICAgYXJnbWVudCBzZWVtcyB0byBiZSB0aGUgbGFiZWwgZm9yIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICBnY2MKLSAgIHVzZXMgdGhlIHNhbWUgbmFtZSBmb3IgYm90aC4gIEkgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHRoaXJkIGFuZAotICAgZm91cnRoIGFyZ3VtZW50cyBhcmUgbWVhbnQgdG8gYmUuICBUaGUgb3B0aW9uYWwgZmlmdGggYXJndW1lbnQgaXMKLSAgIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbi4gIEluIENPRkYgdGhpcyBzeW1ib2wKLSAgIGdldHMgYW4gYXV4IGVudHJ5IGxpa2UgdGhhdCB1c2VkIGZvciBhIGNzZWN0LiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19mdW5jdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIGNoYXIgKnM7Ci0gIHN5bWJvbFMgKmV4dF9zeW07Ci0gIHN5bWJvbFMgKmxhYl9zeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIElnbm9yZSBhbnkgW1BSXSBzdWZmaXguICAqLwotICBuYW1lID0gcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAobmFtZSk7Ci0gIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7Ci0gIGlmIChzICE9IChjaGFyICopIE5VTEwKLSAgICAgICYmIHN0cmNtcCAocyArIDEsICJQUl0iKSA9PSAwKQotICAgICpzID0gJ1wwJzsKLQotICBleHRfc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBzeW1ib2wgbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbGFiX3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIGlmIChleHRfc3ltICE9IGxhYl9zeW0pCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgICBleHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgZXhwLlhfYWRkX3N5bWJvbCA9IGxhYl9zeW07Ci0gICAgICBleHAuWF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBleHAuWF91bnNpZ25lZCA9IDA7Ci0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4dF9zeW0sICZleHApOwotICAgIH0KLQotICBpZiAoc3ltYm9sX2dldF90YyAoZXh0X3N5bSktPmNsYXNzID09IC0xKQotICAgIHN5bWJvbF9nZXRfdGMgKGV4dF9zeW0pLT5jbGFzcyA9IFhNQ19QUjsKLSAgc3ltYm9sX2dldF90YyAoZXh0X3N5bSktPm91dHB1dCA9IDE7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGlnbm9yZTsKLQotICAgICAgLyogSWdub3JlIHRoZSB0aGlyZCBhcmd1bWVudC4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb24gKCZpZ25vcmUpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIC8qIElnbm9yZSB0aGUgZm91cnRoIGFyZ3VtZW50LiAgKi8KLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgZXhwcmVzc2lvbiAoJmlnbm9yZSk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIGZ1bmN0aW9uIHNpemUuICAqLwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIHN5bWJvbF9nZXRfdGMgKGV4dF9zeW0pLT5zaXplID0gc3ltYm9sX25ldyAoIkwwXDAwMSIsCi0JCQkJCQkJICBhYnNvbHV0ZV9zZWN0aW9uLAotCQkJCQkJCSAgKHZhbHVlVCkgMCwKLQkJCQkJCQkgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JICAgICAgcHNldWRvX3NldCAoc3ltYm9sX2dldF90YyAoZXh0X3N5bSktPnNpemUpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBTX1NFVF9EQVRBX1RZUEUgKGV4dF9zeW0sIERUX0ZDTiA8PCBOX0JUU0hGVCk7Ci0gIFNGX1NFVF9GVU5DVElPTiAoZXh0X3N5bSk7Ci0gIFNGX1NFVF9QUk9DRVNTIChleHRfc3ltKTsKLSAgY29mZl9hZGRfbGluZXN5bSAoZXh0X3N5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5iZiBwc2V1ZG8tb3AuICBUaGlzIGlzIGp1c3QgbGlrZSBhIENPRkYgQ19GQ04gc3ltYm9sIG5hbWVkCi0gICAiLmJmIi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYmYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmJmIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0ZDTik7Ci0KLSAgY29mZl9saW5lX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgY29mZl9saW5lX2Jhc2UpOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5lZiBwc2V1ZG8tb3AuICBUaGlzIGlzIGp1c3QgbGlrZSBhIENPRkYgQ19GQ04gc3ltYm9sIG5hbWVkCi0gICAiLmVmIiwgZXhjZXB0IHRoYXQgdGhlIGxpbmUgbnVtYmVyIGlzIGFic29sdXRlLCBub3QgcmVsYXRpdmUgdG8gdGhlCi0gICBtb3N0IHJlY2VudCAiLmJmIiBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2VmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lZiIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19GQ04pOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuYmkgYW5kIC5laSBwc2V1ZG8tb3BzLiAgVGhlc2UgdGFrZSBhIHN0cmluZyBhcmd1bWVudCBhbmQKLSAgIGdlbmVyYXRlcyBhIENfQklOQ0wgb3IgQ19FSU5DTCBzeW1ib2wsIHdoaWNoIGdvZXMgYXQgdGhlIHN0YXJ0IG9mCi0gICB0aGUgc3ltYm9sIGxpc3QuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JpZWkgKGVpKQotICAgICBpbnQgZWk7Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpsYXN0X2JpZWk7Ci0KLSAgY2hhciAqbmFtZTsKLSAgaW50IGxlbjsKLSAgc3ltYm9sUyAqc3ltOwotICBzeW1ib2xTICpsb29rOwotCi0gIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZXNlIHN5bWJvbHMgaXMgYWN0dWFsbHkgZmlsZSBvZmZzZXQuICBIZXJlIHdlIHNldAotICAgICB0aGUgdmFsdWUgdG8gdGhlIGluZGV4IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMuICBJbgotICAgICBwcGNfZnJvYl9zeW1ib2xzIHdlIHNldCB0aGUgZml4X2xpbmUgZmllbGQsIHdoaWNoIHdpbGwgY2F1c2UgQkZECi0gICAgIHRvIGRvIHRoZSByaWdodCB0aGluZy4gICovCi0KLSAgc3ltID0gc3ltYm9sX21ha2UgKG5hbWUpOwotICAvKiBvYmotY29mZi5jIGN1cnJlbnRseSBvbmx5IGhhbmRsZXMgbGluZSBudW1iZXJzIGNvcnJlY3RseSBpbiB0aGUKLSAgICAgLnRleHQgc2VjdGlvbi4gICovCi0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgY29mZl9uX2xpbmVfbm9zKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBlaSA/IENfRUlOQ0wgOiBDX0JJTkNMKTsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLSAgCi0gIGZvciAobG9vayA9IGxhc3RfYmllaSA/IGxhc3RfYmllaSA6IHN5bWJvbF9yb290UDsKLSAgICAgICAobG9vayAhPSAoc3ltYm9sUyAqKSBOVUxMCi0JJiYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGxvb2spID09IENfRklMRQotCSAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChsb29rKSA9PSBDX0JJTkNMCi0JICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGxvb2spID09IENfRUlOQ0wpKTsKLSAgICAgICBsb29rID0gc3ltYm9sX25leHQgKGxvb2spKQotICAgIDsKLSAgaWYgKGxvb2sgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2luc2VydCAoc3ltLCBsb29rLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIGxhc3RfYmllaSA9IHN5bTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5icyBwc2V1ZG8tb3AuICBUaGlzIGdlbmVyYXRlcyBhIENfQlNUQVQgc3ltYm9sIG5hbWVkICIuYnMiLgotICAgVGhlcmUgaXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyBhIGNzZWN0IHN5bWJvbC4gIFRoZSB2YWx1ZSBvZiB0aGUKLSAgIC5icyBzeW1ib2wgaXMgdGhlIGluZGV4IG9mIHRoaXMgY3NlY3Qgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19icyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIHN5bWJvbFMgKmNzZWN0OwotICBzeW1ib2xTICpzeW07Ci0KLSAgaWYgKHBwY19jdXJyZW50X2Jsb2NrICE9IE5VTEwpCi0gICAgYXNfYmFkIChfKCJuZXN0ZWQgLmJzIGJsb2NrcyIpKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgY3NlY3QgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5icyIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfQlNUQVQpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW4gPSBjc2VjdDsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBwcGNfY3VycmVudF9ibG9jayA9IHN5bTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmVzIHBzZXVkby1vcC4gIEdlbmVyYXRlIGEgQ19FU1RBUlQgc3ltYm9sIG5hbWVkIC5lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZXMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIGlmIChwcGNfY3VycmVudF9ibG9jayA9PSBOVUxMKQotICAgIGFzX2JhZCAoXygiLmVzIHdpdGhvdXQgcHJlY2VkaW5nIC5icyIpKTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lcyIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfRVNUQVQpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBwcGNfY3VycmVudF9ibG9jayA9IE5VTEw7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5iYiBwc2V1ZG8tb3AuICBHZW5lcmF0ZSBhIENfQkxPQ0sgc3ltYm9sIG5hbWVkIC5iYiwgd2l0aCBhCi0gICBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYmIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmJiIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0JMT0NLKTsKLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgU0ZfU0VUX1BST0NFU1MgKHN5bSk7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5lYiBwc2V1ZG8tb3AuICBHZW5lcmF0ZSBhIENfQkxPQ0sgc3ltYm9sIG5hbWVkIC5lYiwgd2l0aCBhCi0gICBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmViIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0JMT0NLKTsKLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltLCAxKTsKLSAgU0FfU0VUX1NZTV9MTk5PIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBTRl9TRVRfUFJPQ0VTUyAoc3ltKTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmJjIHBzZXVkby1vcC4gIFRoaXMganVzdCBjcmVhdGVzIGEgQ19CQ09NTSBzeW1ib2wgd2l0aCBhCi0gICBzcGVjaWZpZWQgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYmMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGxlbjsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0gIHN5bSA9IHN5bWJvbF9tYWtlIChuYW1lKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19CQ09NTSk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIDApOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZWMgcHNldWRvLW9wLiAgVGhpcyBqdXN0IGNyZWF0ZXMgYSBDX0VDT01NIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmVjIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgcHBjX2NvZmZfZGVidWdfc2VjdGlvbik7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfRUNPTU0pOwotICBTX1NFVF9WQUxVRSAoc3ltLCAwKTsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLnRvYyBwc2V1ZG8tb3AuICBTd2l0Y2ggdG8gdGhlIC50b2Mgc3Vic2VnbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfdG9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChwcGNfdG9jX2NzZWN0ICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCBzeW1ib2xfZ2V0X3RjIChwcGNfdG9jX2NzZWN0KS0+c3Vic2VnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN1YnNlZ1Qgc3Vic2VnOwotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgc3ltYm9sUyAqbGlzdDsKLSAgICAKLSAgICAgIHN1YnNlZyA9IHBwY19kYXRhX3N1YnNlZ21lbnQ7Ci0gICAgICArK3BwY19kYXRhX3N1YnNlZ21lbnQ7Ci0KLSAgICAgIHN1YnNlZ19uZXcgKHNlZ21lbnRfbmFtZSAoZGF0YV9zZWN0aW9uKSwgc3Vic2VnKTsKLSAgICAgIHBwY190b2NfZnJhZyA9IGZyYWdfbm93OwotCi0gICAgICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlICgiVE9DW1RDMF0iKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGRhdGFfc2VjdGlvbik7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnID0gc3Vic2VnOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbiA9IHN5bTsKLQotICAgICAgcHBjX3RvY19jc2VjdCA9IHN5bTsKLQkgIAotICAgICAgZm9yIChsaXN0ID0gcHBjX2RhdGFfY3NlY3RzOwotCSAgIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0ICE9IChzeW1ib2xTICopIE5VTEw7Ci0JICAgbGlzdCA9IHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0KQotCTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0ID0gc3ltOwotCi0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoc3ltLCBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+d2l0aGluLCAmc3ltYm9sX3Jvb3RQLAotCQkgICAgICZzeW1ib2xfbGFzdFApOwotICAgIH0KLQotICBwcGNfY3VycmVudF9jc2VjdCA9IHBwY190b2NfY3NlY3Q7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIEFJWCBhc3NlbWJsZXIgYXV0b21hdGljYWxseSBhbGlnbnMgdGhlIG9wZXJhbmRzIG9mIGEgLmxvbmcgb3IKLSAgIC5zaG9ydCBwc2V1ZG8tb3AsIGFuZCB3ZSB3YW50IHRvIGJlIGNvbXBhdGlibGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3hjb2ZmX2NvbnMgKGxvZ19zaXplKQotICAgICBpbnQgbG9nX3NpemU7Ci17Ci0gIGZyYWdfYWxpZ24gKGxvZ19zaXplLCAwLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbG9nX3NpemUpOwotICBjb25zICgxIDw8IGxvZ19zaXplKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwY192Ynl0ZSAoZHVtbXkpCi0gICAgIGludCBkdW1teTsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgYnl0ZV9jb3VudDsKLQotICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJub24tY29uc3RhbnQgYnl0ZSBjb3VudCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnl0ZV9jb3VudCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNvbnMgKGJ5dGVfY291bnQpOwotfQotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0MCi0vKiBUaGUgLnRjIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgZWl0aGVyIFhDT0ZGIG9yCi0gICBFTEYuICBUaGlzIHRha2VzIHR3byBvciBtb3JlIGFyZ3VtZW50cy4KLQotICAgV2hlbiBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBuYW1lIHRvCi0gICBnaXZlIHRvIHRoaXMgbG9jYXRpb24gaW4gdGhlIHRvYzsgdGhpcyB3aWxsIGJlIGEgc3ltYm9sIHdpdGggY2xhc3MKLSAgIFRDLiAgVGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhcmUgNCBieXRlIHZhbHVlcyB0byBhY3R1YWxseSBwdXQgYXQKLSAgIHRoaXMgbG9jYXRpb24gaW4gdGhlIFRPQzsgb2Z0ZW4gdGhlcmUgaXMganVzdCBvbmUgbW9yZSBhcmd1bWVudCwgYQotICAgcmVsb2NhdGVhYmxlIHN5bWJvbCByZWZlcmVuY2UuCi0KLSAgIFdoZW4gbm90IGdlbmVyYXRpbmcgWENPRkYgb3V0cHV0LCB0aGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSwgYnV0Ci0gICB0aGUgZmlyc3QgYXJndW1lbnQgaXMgc2ltcGx5IGlnbm9yZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3RjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0jaWZkZWYgT0JKX1hDT0ZGCi0KLSAgLyogRGVmaW5lIHRoZSBUT0Mgc3ltYm9sIG5hbWUuICAqLwotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBjaGFyIGVuZGM7Ci0gICAgc3ltYm9sUyAqc3ltOwotCi0gICAgaWYgKHBwY190b2NfY3NlY3QgPT0gKHN5bWJvbFMgKikgTlVMTAotCXx8IHBwY190b2NfY3NlY3QgIT0gcHBjX2N1cnJlbnRfY3NlY3QpCi0gICAgICB7Ci0JYXNfYmFkIChfKCIudGMgbm90IGluIC50b2Mgc2VjdGlvbiIpKTsKLQlpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICAgIGlmIChTX0lTX0RFRklORUQgKHN5bSkpCi0gICAgICB7Ci0Jc3ltYm9sUyAqbGFiZWw7Ci0KLQlsYWJlbCA9IHN5bWJvbF9nZXRfdGMgKHBwY19jdXJyZW50X2NzZWN0KS0+d2l0aGluOwotCWlmIChzeW1ib2xfZ2V0X3RjIChsYWJlbCktPmNsYXNzICE9IFhNQ19UQzApCi0JICB7Ci0JICAgIGFzX2JhZCAoXygiLnRjIHdpdGggbm8gbGFiZWwiKSk7Ci0JICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgIHJldHVybjsKLQkgIH0KLQotCVNfU0VUX1NFR01FTlQgKGxhYmVsLCBTX0dFVF9TRUdNRU5UIChzeW0pKTsKLQlzeW1ib2xfc2V0X2ZyYWcgKGxhYmVsLCBzeW1ib2xfZ2V0X2ZyYWcgKHN5bSkpOwotCVNfU0VUX1ZBTFVFIChsYWJlbCwgU19HRVRfVkFMVUUgKHN5bSkpOwotCi0Jd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpOwotICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcyA9IFhNQ19UQzsKLSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gICAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0gIH0KLQotI2Vsc2UgLyogISBkZWZpbmVkIChPQkpfWENPRkYpICovCi0KLSAgLyogU2tpcCB0aGUgVE9DIHN5bWJvbCBuYW1lLiAgKi8KLSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnWycKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXScKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAneycKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnfScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogQWxpZ24gdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE9CSl9YQ09GRikgKi8KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY29ucyAoNCk7Ci0gICAgfQotfQotDAotI2lmZGVmIFRFX1BFCi0KLS8qIFBzZXVkby1vcHMgc3BlY2lmaWMgdG8gdGhlIFdpbmRvd3MgTlQgUG93ZXJQQyBQRSAoY29mZikgZm9ybWF0ICovCi0KLS8qIFNldCB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wcGNfc2V0X2N1cnJlbnRfc2VjdGlvbiAobmV3KQotICAgICBzZWdUIG5ldzsKLXsKLSAgcHBjX3ByZXZpb3VzX3NlY3Rpb24gPSBwcGNfY3VycmVudF9zZWN0aW9uOwotICBwcGNfY3VycmVudF9zZWN0aW9uID0gbmV3OwotfQotCi0vKiBwc2V1ZG8tb3A6IC5wcmV2aW91cwotICAgYmVoYXZpb3VyOiB0b2dnbGVzIHRoZSBjdXJyZW50IHNlY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgc2VjdGlvbi4KLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICAiTm8gcHJldmlvdXMgc2VjdGlvbiIKLSovCi1zdGF0aWMgdm9pZAotcHBjX3ByZXZpb3VzKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqdG1wOwotCi0gIGlmIChwcGNfcHJldmlvdXNfc2VjdGlvbiA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBhc193YXJuKF8oIk5vIHByZXZpb3VzIHNlY3Rpb24gdG8gcmV0dXJuIHRvLiBEaXJlY3RpdmUgaWdub3JlZC4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN1YnNlZ19zZXQocHBjX3ByZXZpb3VzX3NlY3Rpb24sIDApOwotCi0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHBwY19wcmV2aW91c19zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAucGRhdGEKLSAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIG9ubHkgZGF0YSBzZWN0aW9uCi0gICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQKLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0gICBpbml0aWFsOiAgIC5zZWN0aW9uIC5wZGF0YSAiYWRyMyIKLSAgICAgICAgICAgICAgYSAtIGRvbid0IGtub3cgLS0gbWF5YmUgYSBtaXNwcmludAotCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCi0JICAgICAgciAtIHJlYWRhYmxlCi0JICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgNCBieXRlIGJvdW5kYXJ5KQotCi0gICBjb21tZW50YXJ5OgotICAgVGFnIGluZGV4IHRhYmxlcyAoYWxzbyBrbm93biBhcyB0aGUgZnVuY3Rpb24gdGFibGUpIGZvciBleGNlcHRpb24KLSAgIGhhbmRsaW5nLCBkZWJ1Z2dpbmcsIGV0Yy4KLQotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcGRhdGEoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAocGRhdGFfc2VjdGlvbiA9PSAwKSAKLSAgICB7Ci0gICAgICBwZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5wZGF0YSIsIDApOwotICAgICAgCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcGRhdGFfc2VjdGlvbiwKLQkJCSAgICAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOwotICAgICAgCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHBkYXRhX3NlY3Rpb24sIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3KCIucGRhdGEiLCAwKTsKLSAgICB9Ci0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHBkYXRhX3NlY3Rpb24pOwotfQotCi0vKiBwc2V1ZG8tb3A6IC55ZGF0YQotICAgYmVoYXZpb3VyOiBwcmVkZWZpbmVkIHJlYWQgb25seSBkYXRhIHNlY3Rpb24KLSAgICAgICAgICAgICAgZG91YmxlIHdvcmQgYWxpZ25lZAotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE5vbmUKLSAgIGluaXRpYWw6ICAgLnNlY3Rpb24gLnlkYXRhICJkcnczIgotICAgICAgICAgICAgICBhIC0gZG9uJ3Qga25vdyAtLSBtYXliZSBhIG1pc3ByaW50Ci0JICAgICAgZCAtIGluaXRpYWxpemVkIGRhdGEKLQkgICAgICByIC0gcmVhZGFibGUKLQkgICAgICAzIC0gZG91YmxlIHdvcmQgYWxpZ25lZCAodGhhdCB3b3VsZCBiZSA0IGJ5dGUgYm91bmRhcnkpCi0gICBjb21tZW50YXJ5OgotICAgVGFnIHRhYmxlcyAoYWxzbyBrbm93biBhcyB0aGUgc2NvcGUgdGFibGUpIGZvciBleGNlcHRpb24gaGFuZGxpbmcsCi0gICBkZWJ1Z2dpbmcsIGV0Yy4KLSovCi1zdGF0aWMgdm9pZAotcHBjX3lkYXRhKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHlkYXRhX3NlY3Rpb24gPT0gMCkgCi0gICAgewotICAgICAgeWRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIueWRhdGEiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB5ZGF0YV9zZWN0aW9uLAotCQkJIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHlkYXRhX3NlY3Rpb24sIDMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHlkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnlkYXRhIiwgMCk7Ci0gICAgfQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbih5ZGF0YV9zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAucmVsZGF0YQotICAgYmVoYXZpb3VyOiBwcmVkZWZpbmVkIHJlYWQgd3JpdGUgZGF0YSBzZWN0aW9uCi0gICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQgKDQtYnl0ZSkKLQkgICAgICBGSVhNRTogcmVsb2NhdGlvbiBpcyBhcHBsaWVkIHRvIGl0Ci0JICAgICAgRklYTUU6IHdoYXQncyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIC5kYXRhPwotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE5vbmUKLSAgIGluaXRpYWw6ICAgLnNlY3Rpb24gLnJlbGRhdGEgImRydzMiCi0JICAgICAgZCAtIGluaXRpYWxpemVkIGRhdGEKLQkgICAgICByIC0gcmVhZGFibGUKLQkgICAgICB3IC0gd3JpdGVhYmxlCi0JICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgOCBieXRlIGJvdW5kYXJ5KQotCi0gICBjb21tZW50YXJ5OgotICAgTGlrZSAuZGF0YSwgYnV0IGludGVuZGVkIHRvIGhvbGQgZGF0YSBzdWJqZWN0IHRvIHJlbG9jYXRpb24sIHN1Y2ggYXMKLSAgIGZ1bmN0aW9uIGRlc2NyaXB0b3JzLCBldGMuCi0qLwotc3RhdGljIHZvaWQKLXBwY19yZWxkYXRhKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHJlbGRhdGFfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIHJlbGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucmVsZGF0YSIsIDApOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcmVsZGF0YV9zZWN0aW9uLAotCQkJICAgICAoIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIAotCQkJICAgICAgfCBTRUNfREFUQSApKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCByZWxkYXRhX3NlY3Rpb24sIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucmVsZGF0YSIsIDApOwotICAgIH0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24ocmVsZGF0YV9zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAucmRhdGEKLSAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIG9ubHkgZGF0YSBzZWN0aW9uCi0gICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQKLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0gICBpbml0aWFsOiAgIC5zZWN0aW9uIC5yZGF0YSAiZHIzIgotCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCi0JICAgICAgciAtIHJlYWRhYmxlCi0JICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgNCBieXRlIGJvdW5kYXJ5KQotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcmRhdGEoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAocmRhdGFfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIHJkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJkYXRhIiwgMCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcmRhdGFfc2VjdGlvbiwKLQkJCSAgICAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHJkYXRhX3NlY3Rpb24sIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJkYXRhIiwgMCk7Ci0gICAgfQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihyZGF0YV9zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAudWFsb25nCi0gICBiZWhhdmlvdXI6IG11Y2ggbGlrZSAuaW50LCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBubyBhbGlnbm1lbnQgaXMgCi0gICAgICAgICAgICAgIHBlcmZvcm1lZC4KLQkgICAgICBGSVhNRTogdGVzdCB0aGUgYWxpZ25tZW50IHN0YXRlbWVudAotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE5vbmUKLSovCi1zdGF0aWMgdm9pZAotcHBjX3VhbG9uZyhpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIHRyeSBmb3IgbG9uZyAqLwotICBjb25zICggNCApOwotfQotCi0vKiBwc2V1ZG8tb3A6IC56bm9wICA8c3ltYm9sIG5hbWU+Ci0gICBiZWhhdmlvdXI6IElzc3VlIGEgbm9wIGluc3RydWN0aW9uCi0gICAgICAgICAgICAgIElzc3VlIGEgSU1BR0VfUkVMX1BQQ19JRkdMVUUgcmVsb2NhdGlvbiBhZ2FpbnN0IGl0LCB1c2luZwotCSAgICAgIHRoZSBzdXBwbGllZCBzeW1ib2wgbmFtZS4KLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBNaXNzaW5nIHN5bWJvbCBuYW1lCi0qLwotc3RhdGljIHZvaWQKLXBwY196bm9wKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGNoYXIgKmY7Ci0KLSAgc3ltYm9sUyAqc3ltOwotCi0gIC8qIFN0cmlwIG91dCB0aGUgc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqc3ltYm9sX25hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGV4cDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBuYW1lID0geG1hbGxvYyAoaW5wdXRfbGluZV9wb2ludGVyIC0gc3ltYm9sX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzeW1ib2xfbmFtZSk7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIC8qIExvb2sgdXAgdGhlIG9wY29kZSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKikgaGFzaF9maW5kIChwcGNfaGFzaCwgIm5vcCIpOwotCi0gIC8qIHN0aWNrIGluIHRoZSBub3AgKi8KLSAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLSAgZml4X25ldyAoZnJhZ19ub3csCi0JICAgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCSAgIDQsCi0JICAgc3ltLAotCSAgIDAsCi0JICAgMCwKLQkgICBCRkRfUkVMT0NfMTZfR09UX1BDUkVMKTsKLQotfQotCi0vKiBwc2V1ZG8tb3A6IAotICAgYmVoYXZpb3VyOiAKLSAgIGVycm9yczogICAgCi0gICB3YXJuaW5nczogIAotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcGVfY29tbShsY29tbSkKLSAgICAgaW50IGxjb21tOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgdGVtcDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgb2Zmc2V0VCBhbGlnbjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5DT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iKSwgKGxvbmcpIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCEgbGNvbW0pCi0gICAgewotICAgICAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5jb21tIGlzIHRoZSBhbGlnbm1lbnQuICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCWFsaWduID0gMzsKLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAoYWxpZ24gPD0gMCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIGJhZCBhbGlnbm1lbnQiKSk7Ci0JICAgICAgYWxpZ24gPSAzOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHRlbXApCi0JYXNfYmFkIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHRlbXApOwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6Ci0gKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9Ci0gKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCi0gKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQotICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0Ci0gKiBCdXQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHF1b3RlZCBzdHJpbmcsIHRyZWF0IGl0IGFzIGEKLSAqIHN1YnNlZ21lbnQgbnVtYmVyLgotICoKLSAqIEZJWE1FOiB0aGlzIGlzIGEgY29weSBvZiB0aGUgc2VjdGlvbiBwcm9jZXNzaW5nIGZyb20gb2JqLWNvZmYuYywgd2l0aAotICogYWRkaXRpb25zL2NoYW5nZXMgZm9yIHRoZSBtb3RvLXBhcyBhc3NlbWJsZXIgc3VwcG9ydC4gVGhlcmUgYXJlIHRocmVlCi0gKiBjYXRlZ29yaWVzOgotICoKLSAqIEZJWE1FOiBJIGp1c3Qgbm90aWNlZCB0aGlzLiBUaGlzIGRvZXNuJ3Qgd29yayBhdCBhbGwgcmVhbGx5LiBJdCBpdCAKLSAqICAgICAgICBzZXR0aW5nIGJpdHMgdGhhdCBiZmQgcHJvYmFibHkgbmVpdGhlciB1bmRlcnN0YW5kcyBvciB1c2VzLiBUaGUKLSAqICAgICAgICBjb3JyZWN0IGFwcHJvYWNoICg/KSB3aWxsIGhhdmUgdG8gaW5jb3Jwb3JhdGUgZXh0cmEgZmllbGRzIGF0dGFjaGVkCi0gKiAgICAgICAgdG8gdGhlIHNlY3Rpb24gdG8gaG9sZCB0aGUgc3lzdGVtIHNwZWNpZmljIHN0dWZmLiAoa3JrKQotICoKLSAqIFNlY3Rpb24gQ29udGVudHM6Ci0gKiAnYScgLSB1bmtub3duIC0gcmVmZXJyZWQgdG8gaW4gZG9jdW1lbnRhdGlvbiwgYnV0IG5vIGRlZmluaXRpb24gc3VwcGxpZWQKLSAqICdjJyAtIHNlY3Rpb24gaGFzIGNvZGUKLSAqICdkJyAtIHNlY3Rpb24gaGFzIGluaXRpYWxpemVkIGRhdGEKLSAqICd1JyAtIHNlY3Rpb24gaGFzIHVuaW5pdGlhbGl6ZWQgZGF0YQotICogJ2knIC0gc2VjdGlvbiBjb250YWlucyBkaXJlY3RpdmVzIChpbmZvKQotICogJ24nIC0gc2VjdGlvbiBjYW4gYmUgZGlzY2FyZGVkCi0gKiAnUicgLSByZW1vdmUgc2VjdGlvbiBhdCBsaW5rIHRpbWUKLSAqCi0gKiBTZWN0aW9uIFByb3RlY3Rpb246Ci0gKiAncicgLSBzZWN0aW9uIGlzIHJlYWRhYmxlCi0gKiAndycgLSBzZWN0aW9uIGlzIHdyaXRlYWJsZQotICogJ3gnIC0gc2VjdGlvbiBpcyBleGVjdXRhYmxlCi0gKiAncycgLSBzZWN0aW9uIGlzIHNoYXJhYmxlCi0gKgotICogU2VjdGlvbiBBbGlnbm1lbnQ6Ci0gKiAnMCcgLSBhbGlnbiB0byBieXRlIGJvdW5kYXJ5Ci0gKiAnMScgLSBhbGlnbiB0byBoYWxmd29yZCB1bmRhcnkKLSAqICcyJyAtIGFsaWduIHRvIHdvcmQgYm91bmRhcnkKLSAqICczJyAtIGFsaWduIHRvIGRvdWJsZXdvcmQgYm91bmRhcnkKLSAqICc0JyAtIGFsaWduIHRvIHF1YWR3b3JkIGJvdW5kYXJ5Ci0gKiAnNScgLSBhbGlnbiB0byAzMiBieXRlIGJvdW5kYXJ5Ci0gKiAnNicgLSBhbGlnbiB0byA2NCBieXRlIGJvdW5kYXJ5Ci0gKgotICovCi0KLXZvaWQKLXBwY19wZV9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCi0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBmbGFnd29yZCBmbGFnczsKLSAgc2VnVCBzZWM7Ci0gIGludCBhbGlnbjsKLQotICBzZWN0aW9uX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBuYW1lID0geG1hbGxvYyAoaW5wdXRfbGluZV9wb2ludGVyIC0gc2VjdGlvbl9uYW1lICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc2VjdGlvbl9uYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgZXhwID0gMDsKLSAgZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQyIikgPT0gMCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkMyIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDQiKSA9PSAwKQotICAgIHsKLSAgICAgIGFsaWduID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQ1IikgPT0gMCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkNiIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAxOwotICAgIH0KLSAgZWxzZQotICAgIGFsaWduID0gNDsgLyogZGVmYXVsdCBhbGlnbm1lbnQgdG8gMTYgYnl0ZSBib3VuZGFyeSAqLwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQlleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJwotCQkgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JCXsKLQkJICAvKiBTZWN0aW9uIENvbnRlbnRzICovCi0JCWNhc2UgJ2EnOiAvKiB1bmtub3duICovCi0JCSAgYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBzZWN0aW9uIGF0dHJpYnV0ZSAtLSAnYSciKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2MnOiAvKiBjb2RlIHNlY3Rpb24gKi8KLQkJICBmbGFncyB8PSBTRUNfQ09ERTsgCi0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2QnOiAvKiBzZWN0aW9uIGhhcyBpbml0aWFsaXplZCBkYXRhICovCi0JCSAgZmxhZ3MgfD0gU0VDX0RBVEE7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3UnOiAvKiBzZWN0aW9uIGhhcyB1bmluaXRpYWxpemVkIGRhdGEgKi8KLQkJICAvKiBGSVhNRTogVGhpcyBpcyBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQQotCQkgICAgIGluIHdpbm50LmggKi8KLQkJICBmbGFncyB8PSBTRUNfUk9NOwotCQkgIGJyZWFrOwotCQljYXNlICdpJzogLyogc2VjdGlvbiBjb250YWlucyBkaXJlY3RpdmVzIChpbmZvKSAqLwotCQkgIC8qIEZJWE1FOiBUaGlzIGlzIElNQUdFX1NDTl9MTktfSU5GTwotCQkgICAgIGluIHdpbm50LmggKi8KLQkJICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCQkgIGJyZWFrOwotCQljYXNlICduJzogLyogc2VjdGlvbiBjYW4gYmUgZGlzY2FyZGVkICovCi0JCSAgZmxhZ3MgJj1+IFNFQ19MT0FEOyAKLQkJICBicmVhazsKLQkJY2FzZSAnUic6IC8qIFJlbW92ZSBzZWN0aW9uIGF0IGxpbmsgdGltZSAqLwotCQkgIGZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotCQkgIGJyZWFrOwotCi0JCSAgLyogU2VjdGlvbiBQcm90ZWN0aW9uICovCi0JCWNhc2UgJ3InOiAvKiBzZWN0aW9uIGlzIHJlYWRhYmxlICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9SRUFEOwotCQkgIGJyZWFrOwotCQljYXNlICd3JzogLyogc2VjdGlvbiBpcyB3cml0ZWFibGUgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1dSSVRFOwotCQkgIGJyZWFrOwotCQljYXNlICd4JzogLyogc2VjdGlvbiBpcyBleGVjdXRhYmxlICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9FWEVDVVRFOwotCQkgIGJyZWFrOwotCQljYXNlICdzJzogLyogc2VjdGlvbiBpcyBzaGFyYWJsZSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fU0hBUkVEOwotCQkgIGJyZWFrOwotCi0JCSAgLyogU2VjdGlvbiBBbGlnbm1lbnQgKi8KLQkJY2FzZSAnMCc6IC8qIGFsaWduIHRvIGJ5dGUgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMUJZVEVTOwotCQkgIGFsaWduID0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAnMSc6ICAvKiBhbGlnbiB0byBoYWxmd29yZCBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl8yQllURVM7Ci0JCSAgYWxpZ24gPSAxOwotCQkgIGJyZWFrOwotCQljYXNlICcyJzogIC8qIGFsaWduIHRvIHdvcmQgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fNEJZVEVTOwotCQkgIGFsaWduID0gMjsKLQkJICBicmVhazsKLQkJY2FzZSAnMyc6ICAvKiBhbGlnbiB0byBkb3VibGV3b3JkIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzhCWVRFUzsKLQkJICBhbGlnbiA9IDM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzQnOiAgLyogYWxpZ24gdG8gcXVhZHdvcmQgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMTZCWVRFUzsKLQkJICBhbGlnbiA9IDQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzUnOiAgLyogYWxpZ24gdG8gMzIgYnl0ZSBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl8zMkJZVEVTOwotCQkgIGFsaWduID0gNTsKLQkJICBicmVhazsKLQkJY2FzZSAnNic6ICAvKiBhbGlnbiB0byA2NCBieXRlIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzY0QllURVM7Ci0JCSAgYWxpZ24gPSA2OwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkKF8oInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIpLAotCQkJICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKLQkgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICBzZWMgPSBzdWJzZWdfbmV3IChuYW1lLCAoc3Vic2VnVCkgZXhwKTsKLQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihzZWMpOwotCi0gIGlmIChmbGFncyAhPSBTRUNfTk9fRkxBR1MpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywgZmxhZ3MpKQotCWFzX2JhZCAoXygiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIlc1wiOiAlcyIpLAotCQliZmRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIHNlYyksCi0JCWJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICB9Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChzdGRvdXRwdXQsIHNlYywgYWxpZ24pOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1wcGNfcGVfZnVuY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBzeW1ib2xTICpleHRfc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBleHRfc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgU19TRVRfREFUQV9UWVBFIChleHRfc3ltLCBEVF9GQ04gPDwgTl9CVFNIRlQpOwotICBTRl9TRVRfRlVOQ1RJT04gKGV4dF9zeW0pOwotICBTRl9TRVRfUFJPQ0VTUyAoZXh0X3N5bSk7Ci0gIGNvZmZfYWRkX2xpbmVzeW0gKGV4dF9zeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcGNfcGVfdG9jZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAodG9jZGF0YV9zZWN0aW9uID09IDApCi0gICAgewotICAgICAgdG9jZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi50b2NkIiwgMCk7Ci0gICAgICAvKiBGSVhNRTogc2VjdGlvbiBmbGFncyB3b24ndCB3b3JrICovCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdG9jZGF0YV9zZWN0aW9uLAotCQkJICAgICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCSAgICAgIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RBVEEgKSk7Ci0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgdG9jZGF0YV9zZWN0aW9uLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi50b2NkIiwgMCk7Ci0gICAgfQotCi0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHRvY2RhdGFfc2VjdGlvbik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogRG9uJ3QgYWRqdXN0IFRPQyByZWxvY3MgdG8gdXNlIHRoZSBzZWN0aW9uIHN5bWJvbC4gICovCi0KLWludAotcHBjX3BlX2ZpeF9hZGp1c3RhYmxlIChmaXgpCi0gICAgIGZpeFMgKmZpeDsKLXsKLSAgcmV0dXJuIGZpeC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19QUENfVE9DMTY7Ci19Ci0KLSNlbmRpZgotDAotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBYQ09GRiBzcGVjaWZpYyBzeW1ib2wgYW5kIGZpbGUgaGFuZGxpbmcuICAqLwotCi0vKiBDYW5vbmljYWxpemUgdGhlIHN5bWJvbCBuYW1lLiAgV2UgdXNlIHRoZSB0byBmb3JjZSB0aGUgc3VmZml4LCBpZgotICAgYW55LCB0byB1c2Ugc3F1YXJlIGJyYWNrZXRzLCBhbmQgdG8gYmUgaW4gdXBwZXIgY2FzZS4gICovCi0KLWNoYXIgKgotcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqczsKLQotICBpZiAocHBjX3N0YWJfc3ltYm9sKQotICAgIHJldHVybiBuYW1lOwotCi0gIGZvciAocyA9IG5hbWU7ICpzICE9ICdcMCcgJiYgKnMgIT0gJ3snICYmICpzICE9ICdbJzsgcysrKQotICAgIDsKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgewotICAgICAgY2hhciBicmFjOwotCi0gICAgICBpZiAoKnMgPT0gJ1snKQotCWJyYWMgPSAnXSc7Ci0gICAgICBlbHNlCi0JewotCSAgKnMgPSAnWyc7Ci0JICBicmFjID0gJ30nOwotCX0KLQotICAgICAgZm9yIChzKys7ICpzICE9ICdcMCcgJiYgKnMgIT0gYnJhYzsgcysrKQotCWlmIChpc2xvd2VyICgqcykpCi0JICAqcyA9IHRvdXBwZXIgKCpzKTsKLQotICAgICAgaWYgKCpzID09ICdcMCcgfHwgc1sxXSAhPSAnXDAnKQotCWFzX2JhZCAoXygiYmFkIHN5bWJvbCBzdWZmaXgiKSk7Ci0KLSAgICAgICpzID0gJ10nOwotICAgIH0KLQotICByZXR1cm4gbmFtZTsKLX0KLQotLyogU2V0IHRoZSBjbGFzcyBvZiBhIHN5bWJvbCBiYXNlZCBvbiB0aGUgc3VmZml4LCBpZiBhbnkuICBUaGlzIGlzCi0gICBjYWxsZWQgd2hlbmV2ZXIgYSBuZXcgc3ltYm9sIGlzIGNyZWF0ZWQuICAqLwotCi12b2lkCi1wcGNfc3ltYm9sX25ld19ob29rIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3RydWN0IHBwY190Y19zeSAqdGM7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgdGMgPSBzeW1ib2xfZ2V0X3RjIChzeW0pOwotICB0Yy0+bmV4dCA9IE5VTEw7Ci0gIHRjLT5vdXRwdXQgPSAwOwotICB0Yy0+Y2xhc3MgPSAtMTsKLSAgdGMtPnJlYWxfbmFtZSA9IE5VTEw7Ci0gIHRjLT5zdWJzZWcgPSAwOwotICB0Yy0+YWxpZ24gPSAwOwotICB0Yy0+c2l6ZSA9IE5VTEw7Ci0gIHRjLT53aXRoaW4gPSBOVUxMOwotCi0gIGlmIChwcGNfc3RhYl9zeW1ib2wpCi0gICAgcmV0dXJuOwotCi0gIHMgPSBzdHJjaHIgKFNfR0VUX05BTUUgKHN5bSksICdbJyk7Ci0gIGlmIChzID09IChjb25zdCBjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgLyogVGhlcmUgaXMgbm8gc3VmZml4LiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytzOwotCi0gIHN3aXRjaCAoc1swXSkKLSAgICB7Ci0gICAgY2FzZSAnQic6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiQlNdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfQlM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdEJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJEQl0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19EQjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIkRTXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX0RTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRyc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiR0xdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfR0w7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdQJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJQUl0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19QUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1InOgotICAgICAgaWYgKHN0cmNtcCAocywgIlJPXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1JPOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiUlddIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfUlc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdTJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJTVl0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19TVjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1QnOgotICAgICAgaWYgKHN0cmNtcCAocywgIlRDXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1RDOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVEldIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfVEk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJUQl0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19UQjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlRDMF0iKSA9PSAwIHx8IHN0cmNtcCAocywgIlQwXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1RDMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1UnOgotICAgICAgaWYgKHN0cmNtcCAocywgIlVBXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1VBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVUNdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfVUM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdYJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJYT10iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19YTzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAodGMtPmNsYXNzID09IC0xKQotICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIHN5bWJvbCBzdWZmaXgiKSk7Ci19Ci0KLS8qIFNldCB0aGUgY2xhc3Mgb2YgYSBsYWJlbCBiYXNlZCBvbiB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgVGhpcwotICAgaGFuZGxlcyBzeW1ib2xzIHdpdGhvdXQgc3VmZml4ZXMuICBBbHNvLCBtb3ZlIHRoZSBzeW1ib2wgc28gdGhhdCBpdAotICAgZm9sbG93cyB0aGUgY3NlY3Qgc3ltYm9sLiAgKi8KLQotdm9pZAotcHBjX2Zyb2JfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAocHBjX2N1cnJlbnRfY3NlY3QgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gLTEpCi0Jc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPSBzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPmNsYXNzOwotCi0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoc3ltLCBzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbiwKLQkJICAgICAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHBwY19jdXJyZW50X2NzZWN0KS0+d2l0aGluID0gc3ltOwotICAgIH0KLX0KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgYnkgcHBjX2Zyb2Jfc3ltYm9sIGlmIGFueSBhYnNvbHV0ZSBzeW1ib2xzIGFyZQotICAgc2Vlbi4gIEl0IHRlbGxzIHBwY19hZGp1c3Rfc3ltdGFiIHdoZXRoZXIgaXQgbmVlZHMgdG8gbG9vayB0aHJvdWdoCi0gICB0aGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuIHBwY19zYXdfYWJzOwotCi0vKiBDaGFuZ2UgdGhlIG5hbWUgb2YgYSBzeW1ib2wganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBTZXQgdGhlCi0gICByZWFsIG5hbWUgaWYgdGhlIC5yZW5hbWUgcHNldWRvLW9wIHdhcyB1c2VkLiAgT3RoZXJ3aXNlLCByZW1vdmUgYW55Ci0gICBjbGFzcyBzdWZmaXguICBSZXR1cm4gMSBpZiB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICBzeW1ib2wgdGFibGUuICAqLwotCi1pbnQKLXBwY19mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpwcGNfbGFzdF9mdW5jdGlvbjsKLSAgc3RhdGljIHN5bWJvbFMgKnNldF9lbmQ7Ci0KLSAgLyogRGlzY2FyZCBzeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IHN5bWJvbAotICAgICB0YWJsZS4gICovCi0gIGlmICghIHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHN5bSkKLSAgICAgICYmICgoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0JICB8fCAoISBTX0lTX0VYVEVSTkFMIChzeW0pCi0JICAgICAgJiYgISBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQKLQkgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRklMRSkpKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBTX1NFVF9OQU1FIChzeW0sIHN5bWJvbF9nZXRfdGMgKHN5bSktPnJlYWxfbmFtZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY29uc3QgY2hhciAqczsKLQotICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKHN5bSk7Ci0gICAgICBzID0gc3RyY2hyIChuYW1lLCAnWycpOwotICAgICAgaWYgKHMgIT0gKGNoYXIgKikgTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgY2hhciAqc25ldzsKLQotCSAgbGVuID0gcyAtIG5hbWU7Ci0JICBzbmV3ID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICBtZW1jcHkgKHNuZXcsIG5hbWUsIGxlbik7Ci0JICBzbmV3W2xlbl0gPSAnXDAnOwotCi0JICBTX1NFVF9OQU1FIChzeW0sIHNuZXcpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNldF9lbmQgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBTQV9TRVRfU1lNX0VORE5EWCAoc2V0X2VuZCwgc3ltKTsKLSAgICAgIHNldF9lbmQgPSBOVUxMOwotICAgIH0KLQotICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChzeW0pKQotICAgIHsKLSAgICAgIGlmIChwcGNfbGFzdF9mdW5jdGlvbiAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCWFzX2JhZCAoXygidHdvIC5mdW5jdGlvbiBwc2V1ZG8tb3BzIHdpdGggbm8gaW50ZXJ2ZW5pbmcgLmVmIikpOwotICAgICAgcHBjX2xhc3RfZnVuY3Rpb24gPSBzeW07Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+c2l6ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5zaXplLCAxKTsKLQkgIFNBX1NFVF9TWU1fRlNJWkUgKHN5bSwKLQkJCSAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbF9nZXRfdGMgKHN5bSktPnNpemUpKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRkNOCi0JICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChzeW0pLCAiLmVmIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocHBjX2xhc3RfZnVuY3Rpb24gPT0gKHN5bWJvbFMgKikgTlVMTCkKLQlhc19iYWQgKF8oIi5lZiB3aXRoIG5vIHByZWNlZGluZyAuZnVuY3Rpb24iKSk7Ci0gICAgICBlbHNlCi0JewotCSAgc2V0X2VuZCA9IHBwY19sYXN0X2Z1bmN0aW9uOwotCSAgcHBjX2xhc3RfZnVuY3Rpb24gPSBOVUxMOwotCi0JICAvKiBXZSBkb24ndCBoYXZlIGEgQ19FRkNOIHN5bWJvbCwgYnV0IHdlIG5lZWQgdG8gZm9yY2UgdGhlCi0JICAgICBDT0ZGIGJhY2tlbmQgdG8gYmVsaWV2ZSB0aGF0IGl0IGhhcyBzZWVuIG9uZS4gICovCi0JICBjb2ZmX2xhc3RfZnVuY3Rpb24gPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgU19JU19FWFRFUk5BTCAoc3ltKQotICAgICAgJiYgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0ZJTEUKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19GQ04KLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19CTE9DSwotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0JTVEFUCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRVNUQVQKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19CSU5DTAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0VJTkNMCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24pCi0gICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0hJREVYVCk7Ci0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FWFQKLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19ISURFWFQpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmE7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGNzZWN0IGF1eC4gICovCi0gICAgICBpID0gU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltKTsKLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgaSArIDEpOwotICAgICAgYSA9ICZjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZVtpICsgMV0udS5hdXhlbnQ7Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gWE1DX1RDMCkKLQl7Ci0JICAvKiBUaGlzIGlzIHRoZSBUT0MgdGFibGUuICAqLwotCSAga25vdyAoc3RyY21wIChTX0dFVF9OQU1FIChzeW0pLCAiVE9DIikgPT0gMCk7Ci0JICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAwOwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKDIgPDwgMykgfCBYVFlfU0Q7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnICE9IDApCi0JewotCSAgLyogVGhpcyBpcyBhIGNzZWN0IHN5bWJvbC4gIHhfc2NubGVuIGlzIHRoZSBzaXplIG9mIHRoZQotCSAgICAgY3NlY3QuICAqLwotCSAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPm5leHQgPT0gKHN5bWJvbFMgKikgTlVMTCkKLQkgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwKLQkJCQkJCSAgICAgICBTX0dFVF9TRUdNRU5UIChzeW0pKQotCQkJCSAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sX2dldF90YyAoc3ltKS0+bmV4dCwgMSk7Ci0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKFNfR0VUX1ZBTFVFIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5uZXh0KQotCQkJCSAgICAgICAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgfQotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKHN5bWJvbF9nZXRfdGMgKHN5bSktPmFsaWduIDw8IDMpIHwgWFRZX1NEOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gYnNzX3NlY3Rpb24pCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCSAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gc3ltYm9sX2dldF9mcmFnIChzeW0pLT5mcl9vZmZzZXQ7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSAoc3ltYm9sX2dldF90YyAoc3ltKS0+YWxpZ24gPDwgMykgfCBYVFlfQ007Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltKSkKLQkgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPSBYTUNfUlc7Ci0JICBlbHNlCi0JICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gWE1DX0JTOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQl7Ci0JICAvKiBUaGlzIGlzIGFuIGFic29sdXRlIHN5bWJvbC4gIFRoZSBjc2VjdCB3aWxsIGJlIGNyZWF0ZWQgYnkKLSAgICAgICAgICAgICBwcGNfYWRqdXN0X3N5bXRhYi4gICovCi0JICBwcGNfc2F3X2FicyA9IHRydWU7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfTEQ7Ci0JICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gLTEpCi0JICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gWE1DX1hPOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgU19JU19ERUZJTkVEIChzeW0pKQotCXsKLQkgIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IDA7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfRVI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gWE1DX1RDKQotCXsKLQkgIHN5bWJvbFMgKm5leHQ7Ci0KLQkgIC8qIFRoaXMgaXMgYSBUT0MgZGVmaW5pdGlvbi4gIHhfc2NubGVuIGlzIHRoZSBzaXplIG9mIHRoZQotCSAgICAgVE9DIGVudHJ5LiAgKi8KLQkgIG5leHQgPSBzeW1ib2xfbmV4dCAoc3ltKTsKLQkgIHdoaWxlIChzeW1ib2xfZ2V0X3RjIChuZXh0KS0+Y2xhc3MgPT0gWE1DX1RDMCkKLQkgICAgbmV4dCA9IHN5bWJvbF9uZXh0IChuZXh0KTsKLQkgIGlmIChuZXh0ID09IChzeW1ib2xTICopIE5VTEwKLQkgICAgICB8fCBzeW1ib2xfZ2V0X3RjIChuZXh0KS0+Y2xhc3MgIT0gWE1DX1RDKQotCSAgICB7Ci0JICAgICAgaWYgKHBwY19hZnRlcl90b2NfZnJhZyA9PSAoZnJhZ1MgKikgTlVMTCkKLQkJYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwKLQkJCQkJCQkgICBkYXRhX3NlY3Rpb24pCi0JCQkJCSAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgICBlbHNlCi0JCWEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChwcGNfYWZ0ZXJfdG9jX2ZyYWctPmZyX2FkZHJlc3MKLQkJCQkJIC0gU19HRVRfVkFMVUUgKHN5bSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAobmV4dCwgMSk7Ci0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKFNfR0VUX1ZBTFVFIChuZXh0KQotCQkJCSAgICAgICAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgfQotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKDIgPDwgMykgfCBYVFlfU0Q7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKmNzZWN0OwotCi0JICAvKiBUaGlzIGlzIGEgbm9ybWFsIHN5bWJvbCBkZWZpbml0aW9uLiAgeF9zY25sZW4gaXMgdGhlCi0JICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIGNvbnRhaW5pbmcgY3NlY3QuICAqLwotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gdGV4dF9zZWN0aW9uKQotCSAgICBjc2VjdCA9IHBwY190ZXh0X2NzZWN0czsKLQkgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gZGF0YV9zZWN0aW9uKQotCSAgICBjc2VjdCA9IHBwY19kYXRhX2NzZWN0czsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIC8qIFNraXAgdGhlIGluaXRpYWwgZHVtbXkgc3ltYm9sLiAgKi8KLQkgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0OwotCi0JICBpZiAoY3NlY3QgPT0gKHN5bWJvbFMgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIndhcm5pbmc6IHN5bWJvbCAlcyBoYXMgbm8gY3NlY3QiKSwgU19HRVRfTkFNRSAoc3ltKSk7Ci0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dCAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCQl7Ci0JCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dCwgMSk7Ci0JCSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQpCi0JCSAgICAgID4gU19HRVRfVkFMVUUgKHN5bSkpCi0JCSAgICBicmVhazsKLQkJICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dDsKLQkJfQotCi0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5wID0KLQkJY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKGNzZWN0KSktPm5hdGl2ZTsKLQkgICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZVtpICsgMV0uZml4X3NjbmxlbiA9Ci0JCTE7Ci0JICAgIH0KLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9IFhUWV9MRDsKLQl9Ci0JCi0gICAgICBhLT54X2NzZWN0LnhfcGFybWhhc2ggPSAwOwotICAgICAgYS0+eF9jc2VjdC54X3NuaGFzaCA9IDA7Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gLTEpCi0JYS0+eF9jc2VjdC54X3NtY2xhcyA9IFhNQ19QUjsKLSAgICAgIGVsc2UKLQlhLT54X2NzZWN0Lnhfc21jbGFzID0gc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3M7Ci0gICAgICBhLT54X2NzZWN0Lnhfc3RhYiA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc25zdGFiID0gMDsKLQotICAgICAgLyogRG9uJ3QgbGV0IHRoZSBDT0ZGIGJhY2tlbmQgcmVzb3J0IHRoZXNlIHN5bWJvbHMuICAqLwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9OT1RfQVRfRU5EOwotICAgIH0KLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0JTVEFUKQotICAgIHsKLSAgICAgIC8qIFdlIHdhbnQgdGhlIHZhbHVlIHRvIGJlIHRoZSBzeW1ib2wgaW5kZXggb2YgdGhlIHJlZmVyZW5jZWQKLQkgY3NlY3Qgc3ltYm9sLiAgQkZEIHdpbGwgZG8gdGhhdCBmb3IgdXMgaWYgd2Ugc2V0IHRoZSByaWdodAotCSBmbGFncy4gICovCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltLAotCQkgICAoKHZhbHVlVCkKLQkJICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltCi0JCQkJKHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbikpLT5uYXRpdmUpKTsKLSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT5maXhfdmFsdWUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX1NUU1lNKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmJsb2NrOwotICAgICAgc3ltYm9sUyAqY3NlY3Q7Ci0KLSAgICAgIC8qIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuY2xvc2luZyBjc2VjdC4gICovCi0gICAgICBibG9jayA9IHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbjsKLSAgICAgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoYmxvY2spLT53aXRoaW47Ci0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoY3NlY3QsIDEpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgU19HRVRfVkFMVUUgKHN5bSkgLSBTX0dFVF9WQUxVRSAoY3NlY3QpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19CSU5DTAotCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FSU5DTCkKLSAgICB7Ci0gICAgICAvKiBXZSB3YW50IHRoZSB2YWx1ZSB0byBiZSBhIGZpbGUgb2Zmc2V0IGludG8gdGhlIGxpbmUgbnVtYmVycy4KLSAgICAgICAgIEJGRCB3aWxsIGRvIHRoYXQgZm9yIHVzIGlmIHdlIHNldCB0aGUgcmlnaHQgZmxhZ3MuICBXZSBoYXZlCi0gICAgICAgICBhbHJlYWR5IHNldCB0aGUgdmFsdWUgY29ycmVjdGx5LiAgKi8KLSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT5maXhfbGluZSA9IDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY3JlYXRlcyBjc2VjdCBzeW1ib2xzIGZvciBhbGwKLSAgIGFic29sdXRlIHN5bWJvbHMuICAqLwotCi12b2lkCi1wcGNfYWRqdXN0X3N5bXRhYiAoKQotewotICBzeW1ib2xTICpzeW07Ci0KLSAgaWYgKCEgcHBjX3Nhd19hYnMpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqY3NlY3Q7Ci0gICAgICBpbnQgaTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYTsKLQotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gYWJzb2x1dGVfc2VjdGlvbikKLQljb250aW51ZTsKLQotICAgICAgY3NlY3QgPSBzeW1ib2xfY3JlYXRlICgiLmFic1tYT10iLCBhYnNvbHV0ZV9zZWN0aW9uLAotCQkJICAgICBTX0dFVF9WQUxVRSAoc3ltKSwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChjc2VjdCktPnZhbHVlID0gU19HRVRfVkFMVUUgKHN5bSk7Ci0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChjc2VjdCwgQ19ISURFWFQpOwotICAgICAgaSA9IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGNzZWN0KTsKLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGNzZWN0LCBpICsgMSk7Ci0gICAgICBhID0gJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChjc2VjdCkpLT5uYXRpdmVbaSArIDFdLnUuYXV4ZW50OwotICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbXR5cCA9IFhUWV9TRDsKLSAgICAgIGEtPnhfY3NlY3QueF9wYXJtaGFzaCA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc25oYXNoID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfWE87Ci0gICAgICBhLT54X2NzZWN0Lnhfc3RhYiA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc25zdGFiID0gMDsKLQotICAgICAgc3ltYm9sX2luc2VydCAoY3NlY3QsIHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgICAgIGkgPSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0pOwotICAgICAgYSA9ICZjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZVtpXS51LmF1eGVudDsKLSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ucCA9IGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChjc2VjdCkpLT5uYXRpdmU7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZVtpXS5maXhfc2NubGVuID0gMTsKLSAgICB9Ci0KLSAgcHBjX3Nhd19hYnMgPSBmYWxzZTsKLX0KLQotLyogU2V0IHRoZSBWTUEgZm9yIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIG9uIGFsbCB0aGUgc2VjdGlvbnMgaW4KLSAgIHR1cm4uICAqLwotCi12b2lkCi1wcGNfZnJvYl9zZWN0aW9uIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0YXRpYyBiZmRfc2l6ZV90eXBlIHZtYSA9IDA7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWMsIHZtYSk7Ci0gIHZtYSArPSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYyk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfWENPRkYgKi8KLQwKLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRwLiAgVGhlIG51bWJlcgotICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZXAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0cDsKLSAgICAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVwID0gcHJlYyAqIDI7Ci0KLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRwICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdHAgKz0gMjsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogQWxpZ24gYSBzZWN0aW9uIChJIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgbWFjaGluZSBkZXBlbmRlbnQpLiAgKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0KLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLS8qIFdlIGRvbid0IGhhdmUgYW55IGZvcm0gb2YgcmVsYXhpbmcuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICBXZSBuZXZlciBnZW5lcmF0ZSB0aGVzZS4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLSNpZmRlZiBPQkpfWENPRkYKLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgYSBmaXh1cCBzaG91bGQgYmUgYWRqdXN0ZWQgdG8gdXNlIGEKLSAgIHNlY3Rpb24gc3ltYm9sLiAgV2UgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIGEgZml4dXAgYWdhaW5zdAotICAgYSBzeW1ib2wgaW4gdGhlIFRPQyBzdWJzZWdtZW50IGludG8gYSByZWxvYyBhZ2FpbnN0IHRoZQotICAgY29ycmVzcG9uZGluZyAudGMgc3ltYm9sLiAgKi8KLQotaW50Ci1wcGNfZml4X2FkanVzdGFibGUgKGZpeCkKLSAgICAgZml4UyAqZml4OwotewotICB2YWx1ZVQgdmFsOwotCi0gIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmaXgtPmZ4X2FkZHN5LCAxKTsKLSAgdmFsID0gU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpOwotICBpZiAocHBjX3RvY19jc2VjdCAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiBmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmIGZpeC0+ZnhfYWRkc3kgIT0gcHBjX3RvY19jc2VjdAotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgPT0gZGF0YV9zZWN0aW9uCi0gICAgICAmJiB2YWwgPj0gcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0gICAgICAmJiAocHBjX2FmdGVyX3RvY19mcmFnID09IChmcmFnUyAqKSBOVUxMCi0JICB8fCB2YWwgPCBwcGNfYWZ0ZXJfdG9jX2ZyYWctPmZyX2FkZHJlc3MpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5OwotCi0gICAgICBmb3IgKHN5ID0gc3ltYm9sX25leHQgKHBwY190b2NfY3NlY3QpOwotCSAgIHN5ICE9IChzeW1ib2xTICopIE5VTEw7Ci0JICAgc3kgPSBzeW1ib2xfbmV4dCAoc3kpKQotCXsKLQkgIGlmIChzeW1ib2xfZ2V0X3RjIChzeSktPmNsYXNzID09IFhNQ19UQzApCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5KS0+Y2xhc3MgIT0gWE1DX1RDKQotCSAgICBicmVhazsKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeSwgMSk7Ci0JICBpZiAodmFsID09IFNfR0VUX1ZBTFVFIChzeSkpCi0JICAgIHsKLQkgICAgICBmaXgtPmZ4X2FkZHN5ID0gc3k7Ci0JICAgICAgZml4LT5meF9hZGRudW1iZXIgPSB2YWwgLSBwcGNfdG9jX2ZyYWctPmZyX2FkZHJlc3M7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGFzX2JhZF93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCSAgICBfKCJzeW1ib2wgaW4gLnRvYyBkb2VzIG5vdCBtYXRjaCBhbnkgLnRjIikpOwotICAgIH0KLQotICAvKiBQb3NzaWJseSBhZGp1c3QgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QgdGhlIGNzZWN0LiAgKi8KLSAgaWYgKGZpeC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPnN1YnNlZyA9PSAwCi0gICAgICAmJiBzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+Y2xhc3MgIT0gWE1DX1RDMAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPmNsYXNzICE9IFhNQ19UQwotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgIT0gYnNzX3NlY3Rpb24KLSAgICAgIC8qIERvbid0IGFkanVzdCBpZiB0aGlzIGlzIGEgcmVsb2MgaW4gdGhlIHRvYyBzZWN0aW9uLiAgKi8KLSAgICAgICYmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSAhPSBkYXRhX3NlY3Rpb24KLQkgIHx8IHBwY190b2NfY3NlY3QgPT0gTlVMTAotCSAgfHwgdmFsIDwgcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0JICB8fCAocHBjX2FmdGVyX3RvY19mcmFnICE9IE5VTEwKLQkgICAgICAmJiB2YWwgPj0gcHBjX2FmdGVyX3RvY19mcmFnLT5mcl9hZGRyZXNzKSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqY3NlY3Q7Ci0KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSB0ZXh0X3NlY3Rpb24pCi0JY3NlY3QgPSBwcGNfdGV4dF9jc2VjdHM7Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSBkYXRhX3NlY3Rpb24pCi0JY3NlY3QgPSBwcGNfZGF0YV9jc2VjdHM7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIFNraXAgdGhlIGluaXRpYWwgZHVtbXkgc3ltYm9sLiAgKi8KLSAgICAgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0OwotCi0gICAgICBpZiAoY3NlY3QgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICB3aGlsZSAoc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0ICE9IChzeW1ib2xTICopIE5VTEwKLQkJICYmIChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dCktPmZyX2FkZHJlc3MKLQkJICAgICA8PSBzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9hZGRyZXNzKSkKLQkgICAgewotCSAgICAgIC8qIElmIHRoZSBjc2VjdCBhZGRyZXNzIGVxdWFscyB0aGUgc3ltYm9sIHZhbHVlLCB0aGVuIHdlCi0gICAgICAgICAgICAgICAgIGhhdmUgdG8gbG9vayB0aHJvdWdoIHRoZSBmdWxsIHN5bWJvbCB0YWJsZSB0byBzZWUKLSAgICAgICAgICAgICAgICAgd2hldGhlciB0aGlzIGlzIHRoZSBjc2VjdCB3ZSB3YW50LiAgTm90ZSB0aGF0IHdlIHdpbGwKLSAgICAgICAgICAgICAgICAgb25seSBnZXQgaGVyZSBpZiB0aGUgY3NlY3QgaGFzIHplcm8gbGVuZ3RoLiAgKi8KLQkgICAgICBpZiAoKHN5bWJvbF9nZXRfZnJhZyAoY3NlY3QpLT5mcl9hZGRyZXNzCi0JCSAgID09IHN5bWJvbF9nZXRfZnJhZyAoZml4LT5meF9hZGRzeSktPmZyX2FkZHJlc3MpCi0JCSAgJiYgU19HRVRfVkFMVUUgKGNzZWN0KSA9PSBTX0dFVF9WQUxVRSAoZml4LT5meF9hZGRzeSkpCi0JCXsKLQkJICBzeW1ib2xTICpzY2FuOwotCi0JCSAgZm9yIChzY2FuID0gc3ltYm9sX25leHQgKGNzZWN0KTsKLQkJICAgICAgIHNjYW4gIT0gTlVMTDsKLQkJICAgICAgIHNjYW4gPSBzeW1ib2xfbmV4dCAoc2NhbikpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzeW1ib2xfZ2V0X3RjIChzY2FuKS0+c3Vic2VnICE9IDApCi0JCQlicmVhazsKLQkJICAgICAgaWYgKHNjYW4gPT0gZml4LT5meF9hZGRzeSkKLQkJCWJyZWFrOwotCQkgICAgfQotCi0JCSAgLyogSWYgd2UgZm91bmQgdGhlIHN5bWJvbCBiZWZvcmUgdGhlIG5leHQgY3NlY3QKLSAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwgdGhlbiB0aGlzIGlzIHRoZSBjc2VjdCB3ZSB3YW50LiAgKi8KLQkJICBpZiAoc2NhbiA9PSBmaXgtPmZ4X2FkZHN5KQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0OwotCSAgICB9Ci0KLQkgIGZpeC0+Znhfb2Zmc2V0ICs9IChTX0dFVF9WQUxVRSAoZml4LT5meF9hZGRzeSkKLQkJCSAgICAgLSBzeW1ib2xfZ2V0X2ZyYWcgKGNzZWN0KS0+ZnJfYWRkcmVzcyk7Ci0JICBmaXgtPmZ4X2FkZHN5ID0gY3NlY3Q7Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3QgYSByZWxvYyBhZ2FpbnN0IGEgLmxjb21tIHN5bWJvbCB0byBiZSBhZ2FpbnN0IHRoZSBiYXNlCi0gICAgIC5sY29tbS4gICovCi0gIGlmIChmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeC0+ZnhfYWRkc3kpID09IGJzc19zZWN0aW9uCi0gICAgICAmJiAhIFNfSVNfRVhURVJOQUwgKGZpeC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9zeW1ib2wsIDEpOwotICAgICAgZml4LT5meF9vZmZzZXQgKz0KLQkoU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpCi0JIC0gU19HRVRfVkFMVUUgKHN5bWJvbF9nZXRfZnJhZyAoZml4LT5meF9hZGRzeSktPmZyX3N5bWJvbCkpOwotICAgICAgZml4LT5meF9hZGRzeSA9IHN5bWJvbF9nZXRfZnJhZyAoZml4LT5meF9hZGRzeSktPmZyX3N5bWJvbDsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEEgcmVsb2MgZnJvbSBvbmUgY3NlY3QgdG8gYW5vdGhlciBtdXN0IGJlIGtlcHQuICBUaGUgYXNzZW1ibGVyCi0gICB3aWxsLCBvZiBjb3Vyc2UsIGtlZXAgcmVsb2NzIGJldHdlZW4gc2VjdGlvbnMsIGFuZCBpdCB3aWxsIGtlZXAKLSAgIGFic29sdXRlIHJlbG9jcywgYnV0IHdlIG5lZWQgdG8gZm9yY2UgaXQgdG8ga2VlcCBQQyByZWxhdGl2ZSByZWxvY3MKLSAgIGJldHdlZW4gdHdvIGNzZWN0cyBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KLQotaW50Ci1wcGNfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICpmaXg7Ci17Ci0gIC8qIEF0IHRoaXMgcG9pbnQgZml4LT5meF9hZGRzeSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY29udmVydGVkIHRvCi0gICAgIGEgY3NlY3Qgc3ltYm9sLiAgSWYgdGhlIGNzZWN0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZyYWdtZW50LCB0aGVuCi0gICAgIHdlIG5lZWQgdG8gZm9yY2UgdGhlIHJlbG9jYXRpb24uICAqLwotICBpZiAoZml4LT5meF9wY3JlbAotICAgICAgJiYgZml4LT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiBzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+c3Vic2VnICE9IDAKLSAgICAgICYmICgoc3ltYm9sX2dldF9mcmFnIChmaXgtPmZ4X2FkZHN5KS0+ZnJfYWRkcmVzcwotCSAgID4gZml4LT5meF9mcmFnLT5mcl9hZGRyZXNzKQotCSAgfHwgKHN5bWJvbF9nZXRfdGMgKGZpeC0+ZnhfYWRkc3kpLT5uZXh0ICE9IE5VTEwKLQkgICAgICAmJiAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+bmV4dCktPmZyX2FkZHJlc3MKLQkJICA8PSBmaXgtPmZ4X2ZyYWctPmZyX2FkZHJlc3MpKSkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfWENPRkYgKi8KLQotLyogU2VlIHdoZXRoZXIgYSBzeW1ib2wgaXMgaW4gdGhlIFRPQyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcHBjX2lzX3RvY19zeW0gKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotI2lmZGVmIE9CSl9YQ09GRgotICByZXR1cm4gc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gWE1DX1RDOwotI2Vsc2UKLSAgcmV0dXJuIHN0cmNtcCAoc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKSwgIi5nb3QiKSA9PSAwOwotI2VuZGlmCi19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBjb2RlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIGZpeHVwcyB3ZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gZml4X25ld19leHAsIGFib3ZlLiAgSW4gdGhlIGNhbGwKLSAgIGFib3ZlIHdlIHVzZWQgYSByZWxvYyBjb2RlIHdoaWNoIHdhcyB0aGUgbGFyZ2VzdCBsZWdhbCByZWxvYyBjb2RlCi0gICBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgSGVyZSB3ZSB1bmRvIHRoYXQgdG8gcmVjb3ZlciB0aGUgb3BlcmFuZAotICAgaW5kZXguICBBdCB0aGlzIHBvaW50IGFsbCBzeW1ib2wgdmFsdWVzIHNob3VsZCBiZSBmdWxseSByZXNvbHZlZCwKLSAgIGFuZCB3ZSBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGUgcmVsb2MuICBJZiB3ZSBjYW4gbm90IGRvCi0gICB0aGF0LCB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVsb2MgY29kZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlCi0gICBmaXh1cC4gICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgdmFsdWVUIHZhbHVlOwotCi0jaWZkZWYgT0JKX0VMRgotICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIGAqdmFsdWVwJyBtYXkgY29udGFpbiB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBvbiB3aGljaCB0aGUgcmVsb2MKLQkgd2lsbCBiZSBiYXNlZDsgd2UgaGF2ZSB0byByZW1vdmUgaXQuICAqLwotICAgICAgaWYgKHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKGZpeHAtPmZ4X2FkZHN5KQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IGFic29sdXRlX3NlY3Rpb24KLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSB1bmRlZmluZWRfc2VjdGlvbgotCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSkpCi0JdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KTsKLQotICAgICAgLyogRklYTUU6IFdoeSAnKyc/ICBCZXR0ZXIgeWV0LCB3aGF0IGV4YWN0bHkgaXMgJyp2YWx1ZXAnCi0JIHN1cHBvc2VkIHRvIGJlPyAgSSB0aGluayB0aGlzIGlzIHJlbGF0ZWQgdG8gdmFyaW91cyBzaW1pbGFyCi0JIEZJWE1FcyBpbiB0Yy1pMzg2LmMgYW5kIHRjLXNwYXJjLmMuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXZhbHVlICs9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0jZWxzZQotICAvKiBGSVhNRSBGSVhNRSBGSVhNRTogVGhlIHZhbHVlIHdlIGFyZSBwYXNzZWQgaW4gKnZhbHVlcCBpbmNsdWRlcwotICAgICB0aGUgc3ltYm9sIHZhbHVlcy4gIFNpbmNlIHdlIGFyZSB1c2luZyBCRkRfQVNTRU1CTEVSLCBpZiB3ZSBhcmUKLSAgICAgZG9pbmcgdGhpcyByZWxvY2F0aW9uIHRoZSBjb2RlIGluIHdyaXRlLmMgaXMgZ29pbmcgdG8gY2FsbAotICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLCB3aGljaCBpcyBhbHNvIGdvaW5nIHRvIHVzZSB0aGUgc3ltYm9sCi0gICAgIHZhbHVlLiAgVGhhdCBtZWFucyB0aGF0IGlmIHRoZSByZWxvYyBpcyBmdWxseSByZXNvbHZlZCB3ZSB3YW50IHRvCi0gICAgIHVzZSAqdmFsdWVwIHNpbmNlIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gaXMgbm90IGJlaW5nIHVzZWQuCi0gICAgIEhvd2V2ZXIsIGlmIHRoZSByZWxvYyBpcyBub3QgZnVsbHkgcmVzb2x2ZWQgd2UgZG8gbm90IHdhbnQgdG8gdXNlCi0gICAgICp2YWx1ZXAsIGFuZCBtdXN0IHVzZSBmeF9vZmZzZXQgaW5zdGVhZC4gIEhvd2V2ZXIsIGlmIHRoZSByZWxvYwotICAgICBpcyBQQyByZWxhdGl2ZSwgd2UgZG8gd2FudCB0byB1c2UgKnZhbHVlcCBzaW5jZSBpdCBpbmNsdWRlcyB0aGUKLSAgICAgcmVzdWx0IG9mIG1kX3BjcmVsX2Zyb20uICBUaGlzIGlzIGNvbmZ1c2luZy4gICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgdmFsdWUgPSAqdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoKGludCkgZml4cC0+Znhfcl90eXBlID49IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaW50IG9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgY2hhciAqd2hlcmU7Ci0gICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgICAgIG9waW5kZXggPSAoaW50KSBmaXhwLT5meF9yX3R5cGUgLSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOwotCi0gICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbb3BpbmRleF07Ci0KLSNpZmRlZiBPQkpfWENPRkYKLSAgICAgIC8qIEl0IGFwcGVhcnMgdGhhdCBhbiBpbnN0cnVjdGlvbiBsaWtlCi0JICAgICBsIDksTEMuLjEoMzApCi0JIHdoZW4gTEMuLjEgaXMgbm90IGEgVE9DIHN5bWJvbCBkb2VzIG5vdCBnZW5lcmF0ZSBhIHJlbG9jLiAgSXQKLQkgdXNlcyB0aGUgb2Zmc2V0IG9mIExDLi4xIHdpdGhpbiBpdHMgY3NlY3QuICBIb3dldmVyLCAubG9uZwotCSBMQy4uMSB3aWxsIGdlbmVyYXRlIGEgcmVsb2MuICBJIGNhbid0IGZpbmQgYW55IGRvY3VtZW50YXRpb24KLQkgb24gaG93IHRoZXNlIGNhc2VzIGFyZSB0byBiZSBkaXN0aW5ndWlzaGVkLCBzbyB0aGlzIGlzIGEgd2lsZAotCSBndWVzcy4gIFRoZXNlIGNhc2VzIGFyZSBnZW5lcmF0ZWQgYnkgZ2NjIC1tbWluaW1hbC10b2MuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMAotCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgotCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMAotCSAgJiYgb3BlcmFuZC0+aW5zZXJ0ID09IE5VTEwKLQkgICYmIGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICYmIHN5bWJvbF9nZXRfdGMgKGZpeHAtPmZ4X2FkZHN5KS0+c3Vic2VnICE9IDAKLQkgICYmIHN5bWJvbF9nZXRfdGMgKGZpeHAtPmZ4X2FkZHN5KS0+Y2xhc3MgIT0gWE1DX1RDCi0JICAmJiBzeW1ib2xfZ2V0X3RjIChmaXhwLT5meF9hZGRzeSktPmNsYXNzICE9IFhNQ19UQzAKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBic3Nfc2VjdGlvbikKLQl7Ci0JICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKLQkgIGZpeHAtPmZ4X2RvbmUgPSAxOwotCX0KLSNlbmRpZgotCi0gICAgICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotCSB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KLSAgICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlCi0JaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGluc24gPSBwcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIChvZmZzZXRUKSB2YWx1ZSwKLQkJCQkgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCi0gICAgICBpZiAoZml4cC0+ZnhfZG9uZSkKLQl7Ci0JICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8gaGVyZS4gICovCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbi4KLQkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50bwotCSByZWxvY3MuCi0JIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgRFMgZmllbGQgYXQgdGhlIHZlcnkgbGVhc3QuCi0JIEZJWE1FOiBTZWxlY3RpbmcgdGhlIHJlbG9jIHR5cGUgaXMgYSBiaXQgaGFwaGF6YXJkOyBwZXJoYXBzCi0JIHRoZXJlIHNob3VsZCBiZSBhIG5ldyBmaWVsZCBpbiB0aGUgb3BlcmFuZCB0YWJsZS4gICovCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDAKLQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjYKLQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CMjY7Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9SRUxBVElWRSkgIT0gMAotCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgotCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMCkKLQlmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX0IxNjsKLSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwCi0JICAgICAgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjYKLQkgICAgICAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMCkKLQlmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX0JBMjY7Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDE2Ci0JICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CQTE2OwotICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUEFSRU5TKSAhPSAwCi0JICAgICAgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKLQkgICAgICAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5pbnNlcnQgPT0gTlVMTAotCSAgICAgICAmJiBmaXhwLT5meF9hZGRzeSAhPSBOVUxMCi0JICAgICAgICYmIHBwY19pc190b2Nfc3ltIChmaXhwLT5meF9hZGRzeSkpCi0JewotCSAgZml4cC0+Znhfc2l6ZSA9IDI7Ci0JICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgIGZpeHAtPmZ4X3doZXJlICs9IDI7Ci0JICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpzZmlsZTsKLQkgIHVuc2lnbmVkIGludCBzbGluZTsKLQotCSAgLyogVXNlIGV4cHJfc3ltYm9sX3doZXJlIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGV4cHJlc3Npb24KLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChmaXhwLT5meF9hZGRzeSwgJnNmaWxlLCAmc2xpbmUpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgIF8oInVucmVzb2x2ZWQgZXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgcmVzb2x2ZWQiKSk7Ci0JICBlbHNlCi0JICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgXygidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIikpOwotCSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmZGVmIE9CSl9FTEYKLSAgICAgIHBwY19lbGZfdmFsaWRhdGVfZml4IChmaXhwLCBzZWcpOwotI2VuZGlmCi0gICAgICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLQkgIGlmIChmaXhwLT5meF9wY3JlbCkKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCWNhc2UgQkZEX1JFTE9DX1JWQToKLQljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMjoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19MTzE2OgotCWNhc2UgQkZEX1JFTE9DXzE2OgotCWNhc2UgQkZEX1JFTE9DX0dQUkVMMTY6Ci0JY2FzZSBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzE2X0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19ISTE2X0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGOgotCWNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoKLQljYXNlIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2OgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTzoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2OgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTDoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTY6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNjoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEk6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQToKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQToKLQljYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIHsKLQkgICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQkJYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgICAgXygiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzIiksCi0JCQkgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSwKLQkJCSAgICAgIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0JICAgICAgZWxzZQotCQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgICBfKCJjYW5ub3QgZW1pdCBQQyByZWxhdGl2ZSAlcyByZWxvY2F0aW9uIiksCi0JCQkgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSk7Ci0JICAgIH0KLQotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMik7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyBjYXNlIGhhcHBlbnMgd2hlbiB5b3Ugd3JpdGUsIGZvciBleGFtcGxlLAotCSAgICAgbGlzICVyMywoTDEtTDIpQGhhCi0JICAgICB3aGVyZSBMMSBhbmQgTDIgYXJlIGRlZmluZWQgbGF0ZXIuICAqLwotCWNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSA+PiAxNiwgMik7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0JCQkgICAgICAodmFsdWUgKyAweDgwMDApID4+IDE2LCAyKTsKLQkgIGJyZWFrOwotCi0JICAvKiBCZWNhdXNlIFNEQTIxIG1vZGlmaWVzIHRoZSByZWdpc3RlciBmaWVsZCwgdGhlIHNpemUgaXMgc2V0IHRvIDQKLQkgICAgIGJ5dGVzLCByYXRoZXIgdGhhbiAyLCBzbyBvZmZzZXQgaXQgaGVyZSBhcHByb3ByaWF0ZWx5ICovCi0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMToKLQkgIGlmIChmaXhwLT5meF9wY3JlbCkKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlCi0JCQkgICAgICArICgodGFyZ2V0X2JpZ19lbmRpYW4pID8gMiA6IDApLAotCQkJICAgICAgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ184OgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMSk7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ19QUENfTE9DQUwyNFBDOgotCSAgaWYgKCFmaXhwLT5meF9wY3JlbCAmJiAhZml4cC0+ZnhfZG9uZSkKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIGlmIChmaXhwLT5meF9kb25lKQotCSAgewotCSAgICBjaGFyICp3aGVyZTsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCSAgICAKLQkgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLQkgICAgICAgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0JICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotCSAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQkgICAgZWxzZQotCSAgICAgIGluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICAgIGlmICgodmFsdWUgJiAzKSAhPSAwKQotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJtdXN0IGJyYW5jaCB0byBhbiBhZGRyZXNzIGEgbXVsdGlwbGUgb2YgNCIpKTsKLQkgICAgaWYgKChvZmZzZXRUKSB2YWx1ZSA8IC0weDQwMDAwMDAwCi0JCXx8IChvZmZzZXRUKSB2YWx1ZSA+PSAweDQwMDAwMDAwKQotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJAbG9jYWwgb3IgQHBsdCBicmFuY2ggZGVzdGluYXRpb24gaXMgdG9vIGZhciBhd2F5LCAlbGQgYnl0ZXMiKSwKLQkJCSAgICB2YWx1ZSk7Ci0JICAgIGluc24gPSBpbnNuIHwgKHZhbHVlICYgMHgwM2ZmZmZmYyk7Ci0JICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQkgICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCSAgICBlbHNlCi0JICAgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0JICBmaXhwLT5meF9kb25lID0gMDsKLQkgIGlmIChmaXhwLT5meF9hZGRzeQotCSAgICAgICYmICFTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgICYmICFTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KSkKLQkgICAgU19TRVRfV0VBSyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0JICBmaXhwLT5meF9kb25lID0gMDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGZwcmludGYoc3RkZXJyLAotCQkgIF8oIkdhcyBmYWlsdXJlLCByZWxvYyB2YWx1ZSAlZFxuIiksIGZpeHAtPmZ4X3JfdHlwZSk7Ci0JICBmZmx1c2goc3RkZXJyKTsKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIGZpeHAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotI2Vsc2UKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfUFBDX1RPQzE2KQotICAgIGZpeHAtPmZ4X2FkZG51bWJlciA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgVEVfUEUKLSAgICAgIGZpeHAtPmZ4X2FkZG51bWJlciA9IDA7Ci0jZWxzZQotICAgICAgLyogV2Ugd2FudCB0byB1c2UgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgc2VnbWVudCBvZiB0aGUKLQkgc3ltYm9sLCBub3QgdGhlIGFjdHVhbCBWTUEgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBmaXhwLT5meF9hZGRudW1iZXIgPQotCS0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkpOwotI2VuZGlmCi0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgcmVsb2MgZm9yIGEgZml4dXAuICAqLwotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtcHBjLmggYi9nYXMvY29uZmlnL3RjLXBwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZiOTc1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcHBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyogdGMtcHBjLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXBwYy5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19QUEMKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0vKiBTZXQgdGhlIGVuZGlhbm5lc3Mgd2UgYXJlIHVzaW5nLiAgRGVmYXVsdCB0byBiaWcgZW5kaWFuLiAgKi8KLSNpZm5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBQb3dlclBDIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIElmIE9CSl9DT0ZGIGlzIGRlZmluZWQsIGFuZCBURV9QRSBpcyBub3QgZGVmaW5lZCwgd2UgYXJlIGFzc2VtYmxpbmcKLSAgIFhDT0ZGIGZvciBBSVggb3IgUG93ZXJNYWMuICBJZiBURV9QRSBpcyBkZWZpbmVkLCB3ZSBhcmUgYXNzZW1ibGluZwotICAgQ09GRiBmb3IgV2luZG93cyBOVC4gICovCi0KLSNpZmRlZiBPQkpfQ09GRgotI2lmbmRlZiBURV9QRQotI2RlZmluZSBPQkpfWENPRkYKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIChwcGNfYXJjaCAoKSkKLWV4dGVybiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgcHBjX2FyY2ggUEFSQU1TICgodm9pZCkpOwotCi0vKiBXaGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGlzIGJpZyBlbmRpYW4gKi8KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLS8qIFRoZSB0YXJnZXQgQkZEIGZvcm1hdC4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJwZS1wb3dlcnBjIiA6ICJwZS1wb3dlcnBjbGUiKQotI2Vsc2UKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYWl4Y29mZi1yczYwMDAiCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBQb3dlck1hYyBoYXMgYSBCRkQgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gQUlYJ3MuICAqLwotI2lmZGVmIFRFX1BPV0VSTUFDCi0jaWZkZWYgVEFSR0VUX0ZPUk1BVAotI3VuZGVmIFRBUkdFVF9GT1JNQVQKLSNlbmRpZgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJ4Y29mZi1wb3dlcm1hYyIKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlbGYzMi1wb3dlcnBjIiA6ICJlbGYzMi1wb3dlcnBjbGUiKQotI2VuZGlmCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiAkIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24uICAqLwotI2RlZmluZSBET0xMQVJfRE9UCi0KLS8qIFN0cmluZ3MgZG8gbm90IHVzZSBiYWNrc2xhc2ggZXNjYXBlcyB1bmRlciBDT0ZGLiAgKi8KLSNpZmRlZiBPQkpfQ09GRgotI2RlZmluZSBOT19TVFJJTkdfRVNDQVBFUwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLSNlbmRpZgotCi0jaWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgUFBDX0JJR19FTkRJQU4gMQotI2Vsc2UKLSNkZWZpbmUgUFBDX0JJR19FTkRJQU4gMAotI2VuZGlmCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogV2Ugc2V0IHRoZSBmeF9kb25lIGZpZWxkIGFwcHJvcHJpYXRlbHkgaW4gbWRfYXBwbHlfZml4LiAgKi8KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0MCi0jaWZkZWYgVEVfUEUKLQotLyogUXVlc3Rpb24gbWFya3MgYXJlIHBlcm1pdHRlZCBpbiBzeW1ib2wgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfUU0gMQotCi0vKiBEb24ndCBhZGp1c3QgVE9DIHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKGZpeHApIHBwY19wZV9maXhfYWRqdXN0YWJsZSAoZml4cCkKLWV4dGVybiBpbnQgcHBjX3BlX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBEZWNsYXJhdGlvbnMgbmVlZGVkIHdoZW4gZ2VuZXJhdGluZyBYQ09GRiBjb2RlLiAgWENPRkYgaXMgYW4KLSAgIGV4dGVuc2lvbiBvZiBDT0ZGLCB1c2VkIG9ubHkgb24gdGhlIFJTLzYwMDAuICBSYXRoZXIgdGhhbiBjcmVhdGUgYW4KLSAgIG9iai14Y29mZiwgd2UganVzdCB1c2Ugb2JqLWNvZmYsIGFuZCBoYW5kbGUgdGhlIGV4dGVuc2lvbnMgaGVyZSBpbgotICAgdGMtcHBjLiAgKi8KLQotLyogV2UgbmVlZCB0byBrZWVwIHNvbWUgaW5mb3JtYXRpb24gZm9yIHN5bWJvbHMuICAqLwotc3RydWN0IHBwY190Y19zeQotewotICAvKiBXZSBrZWVwIGEgZmV3IGxpbmtlZCBsaXN0cyBvZiBzeW1ib2xzLiAgKi8KLSAgc3ltYm9sUyAqbmV4dDsKLSAgLyogTm9uLXplcm8gaWYgdGhlIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LiAgVGhlIFJTLzYwMDAgYXNzZW1ibGVyCi0gICAgIG9ubHkgb3V0cHV0cyBzeW1ib2xzIHRoYXQgYXJlIGV4dGVybmFsIG9yIGFyZSBtZW50aW9uZWQgaW4gYQotICAgICAuZ2xvYmwgb3IgLmxnbG9ibCBzdGF0ZW1lbnQuICAqLwotICBpbnQgb3V0cHV0OwotICAvKiBUaGUgc3ltYm9sIGNsYXNzLiAgKi8KLSAgaW50IGNsYXNzOwotICAvKiBUaGUgcmVhbCBuYW1lLCBpZiB0aGUgc3ltYm9sIHdhcyByZW5hbWVkLiAgKi8KLSAgY2hhciAqcmVhbF9uYW1lOwotICAvKiBGb3IgYSBjc2VjdCBzeW1ib2wsIHRoZSBzdWJzZWdtZW50IHdlIGFyZSB1c2luZy4gIFRoaXMgaXMgemVybwotICAgICBmb3Igc3ltYm9scyB0aGF0IGFyZSBub3QgY3NlY3RzLiAgKi8KLSAgc3Vic2VnVCBzdWJzZWc7Ci0gIC8qIEZvciBhIGNzZWN0IG9yIGNvbW1vbiBzeW1ib2wsIHRoZSBhbGlnbm1lbnQgdG8gdXNlLiAgKi8KLSAgaW50IGFsaWduOwotICAvKiBGb3IgYSBmdW5jdGlvbiBzeW1ib2wsIGEgc3ltYm9sIHdob3NlIHZhbHVlIGlzIHRoZSBzaXplLiAgVGhlCi0gICAgIGZpZWxkIGlzIE5VTEwgaWYgdGhlcmUgaXMgbm8gc2l6ZS4gICovCi0gIHN5bWJvbFMgKnNpemU7Ci0gIC8qIEZvciBhIGNzZWN0IHN5bWJvbCwgdGhlIGxhc3Qgc3ltYm9sIHdoaWNoIGhhcyBiZWVuIGRlZmluZWQgaW4KLSAgICAgdGhpcyBjc2VjdCwgb3IgTlVMTCBpZiBub25lIGhhdmUgYmVlbiBkZWZpbmVkIHNvIGZhci4gIEZvciBhIC5icwotICAgICBzeW1ib2wsIHRoZSByZWZlcmVuY2VkIGNzZWN0IHN5bWJvbC4gICovCi0gIHN5bWJvbFMgKndpdGhpbjsKLX07Ci0KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzdHJ1Y3QgcHBjX3RjX3N5Ci0KLS8qIFdlIG5lZWQgYW4gYWRkaXRpb25hbCBhdXhlbnQgZm9yIGZ1bmN0aW9uIHN5bWJvbHMuICAqLwotI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyAyCi0KLS8qIFNxdWFyZSBhbmQgY3VybHkgYnJhY2tldHMgYXJlIHBlcm1pdHRlZCBpbiBzeW1ib2wgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfQlIgMwotCi0vKiBDYW5vbmljYWxpemUgdGhlIHN5bWJvbCBuYW1lLiAgKi8KLSNkZWZpbmUgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKG5hbWUpIHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCi1leHRlcm4gY2hhciAqcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBQQVJBTVMgKChjaGFyICopKTsKLQotLyogR2V0IHRoZSBzeW1ib2wgY2xhc3MgZnJvbSB0aGUgbmFtZS4gICovCi0jZGVmaW5lIHRjX3N5bWJvbF9uZXdfaG9vayhzeW0pIHBwY19zeW1ib2xfbmV3X2hvb2sgKHN5bSkKLWV4dGVybiB2b2lkIHBwY19zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIFNldCB0aGUgc3ltYm9sIGNsYXNzIG9mIGEgbGFiZWwgYmFzZWQgb24gdGhlIGNzZWN0LiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIHBwY19mcm9iX2xhYmVsIChzeW0pCi1leHRlcm4gdm9pZCBwcGNfZnJvYl9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogVE9DIHJlbG9jcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoZml4cCkgcHBjX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQotZXh0ZXJuIGludCBwcGNfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIEEgcmVsb2NhdGlvbiBmcm9tIG9uZSBjc2VjdCB0byBhbm90aGVyIG11c3QgYmUga2VwdC4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgcHBjX2ZvcmNlX3JlbG9jYXRpb24gKEZJWFApCi1leHRlcm4gaW50IHBwY19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBXZSBuZWVkIHRvIHNldCB0aGUgc2VjdGlvbiBWTUEuICAqLwotI2RlZmluZSB0Y19mcm9iX3NlY3Rpb24oc2VjKSBwcGNfZnJvYl9zZWN0aW9uIChzZWMpCi1leHRlcm4gdm9pZCBwcGNfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLQotLyogRmluaXNoIHVwIHRoZSBzeW1ib2wuICAqLwotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0sIHB1bnQpIHB1bnQgPSBwcGNfZnJvYl9zeW1ib2wgKHN5bSkKLWV4dGVybiBpbnQgcHBjX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBGaW5pc2ggdXAgdGhlIGVudGlyZSBzeW10YWIuICAqLwotI2RlZmluZSB0Y19hZGp1c3Rfc3ltdGFiKCkgcHBjX2FkanVzdF9zeW10YWIgKCkKLWV4dGVybiB2b2lkIHBwY19hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogTmljbGFzIEFuZGVyc3NvbiA8bmljYW5AaWRhLmxpdS5zZT4gc2F5cyB0aGlzIGlzIG5lZWRlZC4gICovCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIEJyYW5jaCBwcmVkaWN0aW9uIHJlbG9jYXRpb25zIG11c3QgZm9yY2UgcmVsb2NhdGlvbiwgYXMgbXVzdAotICAgdGhlIHZ0YWJsZSBkZXNjcmlwdGlvbiByZWxvY3MuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApCQkJCQlcCi0oKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTgkJCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4JCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4JCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAkJCVwKLSB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTihGSVhQLFNFQykJCQkJXAotKFRDX0ZPUkNFX1JFTE9DQVRJT04gKEZJWFApCQkJCQkJXAotIHx8ICgoRklYUCktPmZ4X2FkZHN5ICYmICEoRklYUCktPmZ4X3N1YnN5CQkJCVwKLSAgICAgJiYgU19HRVRfU0VHTUVOVCAoKEZJWFApLT5meF9hZGRzeSkgIT0gU0VDKSkKLQotLyogU3VwcG9ydCBmb3IgU0hGX0VYQ0xVREUgYW5kIFNIVF9PUkRFUkVEICovCi1leHRlcm4gaW50IHBwY19zZWN0aW9uX2xldHRlciBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLWV4dGVybiBpbnQgcHBjX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjaGFyICosIHNpemVfdCkpOwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl93b3JkIFBBUkFNUyAoKGNoYXIgKiwgc2l6ZV90KSk7Ci1leHRlcm4gaW50IHBwY19zZWN0aW9uX2ZsYWdzIFBBUkFNUyAoKGludCwgaW50LCBpbnQpKTsKLQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIoTEVUVEVSLCBQVFJfTVNHKQlwcGNfc2VjdGlvbl9sZXR0ZXIgKExFVFRFUiwgUFRSX01TRykKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fdHlwZShTVFIsIExFTikJCXBwY19zZWN0aW9uX3R5cGUgKFNUUiwgTEVOKQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl93b3JkKFNUUiwgTEVOKQkJcHBjX3NlY3Rpb25fd29yZCAoU1RSLCBMRU4pCi0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2ZsYWdzKEZMQUdTLCBBVFRSLCBUWVBFKQlwcGNfc2VjdGlvbl9mbGFncyAoRkxBR1MsIEFUVFIsIFRZUEUpCi0KLS8qIEFkZCBleHRyYSBQUEMgc2VjdGlvbnMgLS0gTm90ZSwgZm9yIG5vdywgbWFrZSAuc2JzczIgYW5kIC5QUEMuRU1CLnNic3MwIGEKLSAgIG5vcm1hbCBzZWN0aW9uLCBhbmQgbm90IGEgYnNzIHNlY3Rpb24gc28gdGhhdCB0aGUgbGlua2VyIGRvZXNuJ3QgY3JhdGVyCi0gICB3aGVuIHRyeWluZyB0byBtYWtlIG1vcmUgdGhhbiAyIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIudGFncyIsCQlTSFRfT1JERVJFRCwJU0hGX0FMTE9DIH0sIFwKLSAgeyAiLnNkYXRhIiwJCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLSAgeyAiLnNic3MiLAkJU0hUX05PQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLSAgeyAiLnNkYXRhMiIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5zYnNzMiIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5QUEMuRU1CLnNkYXRhMCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DIH0sIFwKLSAgeyAiLlBQQy5FTUIuc2JzczAiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LAotCi0jZGVmaW5lIHRjX2NvbW1lbnRfY2hhcnMgcHBjX2NvbW1lbnRfY2hhcnMKLWV4dGVybiBjb25zdCBjaGFyICpwcGNfY29tbWVudF9jaGFyczsKLQotLyogS2VlcCByZWxvY2F0aW9ucyByZWxhdGl2ZSB0byB0aGUgR09ULCBvciBub24tUEMgcmVsYXRpdmUuICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgIAkJXAotICAoKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMTZfR09UT0ZGICAgICAgICAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0xPMTZfR09UT0ZGICAgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0dPVE9GRiAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0dQUkVMMTYgICAgICAgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQkJCVwKLSAgICYmICEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCQkJXAotICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICgoRklYKS0+ZnhfcGNyZWwJCQkJICAgICAgICAJCVwKLSAgICAgICB8fCAoKEZJWCktPmZ4X3N1YnN5ICE9IE5VTEwJCQkJCVwKLQkgICAmJiAoU19HRVRfU0VHTUVOVCAoKEZJWCktPmZ4X3N1YnN5KQkJCQlcCi0JICAgICAgID09IFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9hZGRzeSkpKQkJCVwKLSAgICAgICB8fCBTX0lTX0xPQ0FMICgoRklYKS0+ZnhfYWRkc3kpKSkKLQotLyogV2UgbXVzdCBuZXZlciBldmVyIHRyeSB0byByZXNvbHZlIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWxseSB2aXNpYmxlCi0gICBzeW1ib2xzIGluIHRoZSBhc3NlbWJsZXIsIGJlY2F1c2UgdGhlIC5vIGZpbGUgbWlnaHQgZ28gaW50byBhIHNoYXJlZAotICAgbGlicmFyeSwgYW5kIHNvbWUgb3RoZXIgc2hhcmVkIGxpYnJhcnkgbWlnaHQgb3ZlcnJpZGUgdGhhdCBzeW1ib2wuICAqLwotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAotICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLS8qIGNhbGwgbWRfYXBwbHlfZml4MyB3aXRoIHNlZ21lbnQgaW5zdGVhZCBvZiBtZF9hcHBseV9maXggKi8KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykKLWV4dGVybiBsb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLQotI2RlZmluZSBtZF9wYXJzZV9uYW1lKG5hbWUsIGV4cCkgcHBjX3BhcnNlX25hbWUgKG5hbWUsIGV4cCkKLWV4dGVybiBpbnQgcHBjX3BhcnNlX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zaC5jIGIvZ2FzL2NvbmZpZy90Yy1zaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjdhNmMxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc2guYworKysgL2Rldi9udWxsCkBAIC0xLDI0MzYgKzAsMCBAQAotLyogdGMtc2guYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgSGl0YWNoaSBTdXBlci1ICi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gICBXcml0dGVuIEJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICBzYWNAY3lnbnVzLmNvbQotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlICJvcGNvZGVzL3NoLW9wYy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiISMiOwotCi1zdGF0aWMgdm9pZCBzX3VzZXMgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIHNoX2NvdW50X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgc2VnVCwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBzaF9mcm9iX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAqLwotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfYWxpZ25fYnl0ZXMgKCk7Ci1zdGF0aWMgdm9pZCBzX3VhY29ucyBQQVJBTVMgKChpbnQpKTsKLQotaW50IHNobCA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1saXR0bGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc2hsID0gMTsKLSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDR9LAotICB7IndvcmQiLCBjb25zLCAyfSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsibGl0dGxlIiwgbGl0dGxlLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7InVzZXMiLCBzX3VzZXMsIDB9LAotICB7InVhd29yZCIsIHNfdWFjb25zLCAyfSwKLSAgeyJ1YWxvbmciLCBzX3VhY29ucywgNH0sCi0gIHswLCAwLCAwfQotfTsKLQotLyppbnQgbWRfcmVsb2Nfc2l6ZTsgKi8KLQotaW50IHNoX3JlbGF4OwkJLyogc2V0IGlmIC1yZWxheCBzZWVuICovCi0KLS8qIFdoZXRoZXIgLXNtYWxsIHdhcyBzZWVuLiAgKi8KLQotaW50IHNoX3NtYWxsOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotCi0jZGVmaW5lIEpSRUcgMTQJCQkvKiBSZWdpc3RlciB1c2VkIGFzIGEgdGVtcCB3aGVuIHJlbGF4aW5nICovCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgNCkgKyAobGVuZ3RoKSkKLSNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj40KSkKLQotLyogVGhlc2UgYXJlIHRoZSB0aHJlZSB0eXBlcyBvZiByZWxheGFibGUgaW5zdHJjdGlvbiAqLwotI2RlZmluZSBDT05EX0pVTVAgMQotI2RlZmluZSBDT05EX0pVTVBfREVMQVkgMgotI2RlZmluZSBVTkNPTkRfSlVNUCAgMwotI2RlZmluZSBFTkQgNAotCi0jZGVmaW5lIFVOREVGX0RJU1AgMAotI2RlZmluZSBDT05EOCAgMQotI2RlZmluZSBDT05EMTIgMgotI2RlZmluZSBDT05EMzIgMwotI2RlZmluZSBVTkNPTkQxMiAxCi0jZGVmaW5lIFVOQ09ORDMyIDIKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDQKLQotI2RlZmluZSBVTkNPTkQxMiAxCi0jZGVmaW5lIFVOQ09ORDMyIDIKLQotLyogQnJhbmNoIGRpc3BsYWNlbWVudHMgYXJlIGZyb20gdGhlIGFkZHJlc3Mgb2YgdGhlIGJyYW5jaCBwbHVzCi0gICBmb3VyLCB0aHVzIGFsbCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBoYXZlIDQgYWRkZWQgdG8gdGhlbS4gICovCi0jZGVmaW5lIENPTkQ4X0YgMjU4Ci0jZGVmaW5lIENPTkQ4X00gLTI1MgotI2RlZmluZSBDT05EOF9MRU5HVEggMgotCi0vKiBUaGVyZSBpcyBvbmUgZXh0cmEgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBicmFuY2gsIHNvIHdlIG11c3QgYWRkCi0gICB0d28gbW9yZSBieXRlcyB0byBhY2NvdW50IGZvciBpdC4gICovCi0jZGVmaW5lIENPTkQxMl9GIDQxMDAKLSNkZWZpbmUgQ09ORDEyX00gLTQwOTAKLSNkZWZpbmUgQ09ORDEyX0xFTkdUSCA2Ci0KLSNkZWZpbmUgQ09ORDEyX0RFTEFZX0xFTkdUSCA0Ci0KLS8qID8/PyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIHdyb25nLCBidXQgdGhpcyBkb2VzIG5vdCBtYXR0ZXIKLSAgIHNpbmNlIHRoaXMgcmVsb2NhdGlvbiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgKi8KLSNkZWZpbmUgQ09ORDMyX0YgKDE8PDMwKQotI2RlZmluZSBDT05EMzJfTSAtKDE8PDMwKQotI2RlZmluZSBDT05EMzJfTEVOR1RIIDE0Ci0KLSNkZWZpbmUgVU5DT05EMTJfRiA0MDk4Ci0jZGVmaW5lIFVOQ09ORDEyX00gLTQwOTIKLSNkZWZpbmUgVU5DT05EMTJfTEVOR1RIIDIKLQotLyogPz8/IFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhcmUgd3JvbmcsIGJ1dCB0aGlzIGRvZXMgbm90IG1hdHRlcgotICAgc2luY2UgdGhpcyByZWxvY2F0aW9uIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICAqLwotI2RlZmluZSBVTkNPTkQzMl9GICgxPDwzMCkKLSNkZWZpbmUgVU5DT05EMzJfTSAtKDE8PDMwKQotI2RlZmluZSBVTkNPTkQzMl9MRU5HVEggMTQKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbQyAoRU5ELCAwKV0gPSB7Ci0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotCi0gIHsgMCB9LAotICAvKiBDIChDT05EX0pVTVAsIENPTkQ4KSAqLwotICB7IENPTkQ4X0YsIENPTkQ4X00sIENPTkQ4X0xFTkdUSCwgQyAoQ09ORF9KVU1QLCBDT05EMTIpIH0sCi0gIC8qIEMgKENPTkRfSlVNUCwgQ09ORDEyKSAqLwotICB7IENPTkQxMl9GLCBDT05EMTJfTSwgQ09ORDEyX0xFTkdUSCwgQyAoQ09ORF9KVU1QLCBDT05EMzIpLCB9LAotICAvKiBDIChDT05EX0pVTVAsIENPTkQzMikgKi8KLSAgeyBDT05EMzJfRiwgQ09ORDMyX00sIENPTkQzMl9MRU5HVEgsIDAsIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0KLSAgeyAwIH0sCi0gIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDgpICovCi0gIHsgQ09ORDhfRiwgQ09ORDhfTSwgQ09ORDhfTEVOR1RILCBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMikgfSwKLSAgLyogQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpICovCi0gIHsgQ09ORDEyX0YsIENPTkQxMl9NLCBDT05EMTJfREVMQVlfTEVOR1RILCBDIChDT05EX0pVTVBfREVMQVksIENPTkQzMiksIH0sCi0gIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDMyKSAqLwotICB7IENPTkQzMl9GLCBDT05EMzJfTSwgQ09ORDMyX0xFTkdUSCwgMCwgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLQotICB7IDAgfSwKLSAgLyogQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKSAqLwotICB7IFVOQ09ORDEyX0YsIFVOQ09ORDEyX00sIFVOQ09ORDEyX0xFTkdUSCwgQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKSwgfSwKLSAgLyogQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKSAqLwotICB7IFVOQ09ORDMyX0YsIFVOQ09ORDMyX00sIFVOQ09ORDMyX0xFTkdUSCwgMCwgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKLSAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLQotICBpZiAoISBzaGwpCi0gICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IHNoX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQl7Ci0JICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBNYWtlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHN0cmluZyAqLwotCSAgb3Bjb2RlLT5uYW1lID0gcHJldl9uYW1lOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX207Ci1zdGF0aWMgaW50IHJlZ19uOwotc3RhdGljIGludCByZWdfYjsKLQotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc2hfYXJnX3R5cGUgdHlwZTsKLSAgICBpbnQgcmVnOwotICB9Ci0KLXNoX29wZXJhbmRfaW5mbzsKLQotLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLwotc3RhdGljIGludAotcGFyc2VfcmVnIChzcmMsIG1vZGUsIHJlZykKLSAgICAgY2hhciAqc3JjOwotICAgICBpbnQgKm1vZGU7Ci0gICAgIGludCAqcmVnOwotewotICAvKiBXZSB1c2UgIWlzYWxudW0gZm9yIHRoZSBuZXh0IGNoYXJhY3RlciBhZnRlciB0aGUgcmVnaXN0ZXIgbmFtZSwgdG8KLSAgICAgbWFrZSBzdXJlIHRoYXQgd2Ugd29uJ3QgYWNjaWRlbnRhbGx5IHJlY29nbml6ZSBhIHN5bWJvbCBuYW1lIHN1Y2ggYXMKLSAgICAgJ3NyYW0nIGFzIGJlaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZWdpc3RlciAnc3InLiAgKi8KLQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnICYmIHN0cm5jbXAoJnNyY1syXSwgIl9iYW5rIiwgNSkgPT0gMAotCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzddKSkKLQl7Ci0JICAqbW9kZSA9IEFfUkVHX0I7Ci0JICAqcmVnICA9IChzcmNbMV0gLSAnMCcpOwotCSAgcmV0dXJuIDc7Ci0JfQotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID09ICcxJykKLQl7Ci0JICBpZiAoc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzUnCi0JICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gQV9SRUdfTjsKLQkgICAgICAqcmVnID0gMTAgKyBzcmNbMl0gLSAnMCc7Ci0JICAgICAgcmV0dXJuIDM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzknCi0JICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotCXsKLQkgICptb2RlID0gQV9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzFdIC0gJzAnKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncycKLSAgICAgICYmIHNyY1sxXSA9PSAncycKLSAgICAgICYmIHNyY1syXSA9PSAncicgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfU1NSOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcgJiYgc3JjWzJdID09ICdjJwotICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfU1BDOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAnZycgJiYgc3JjWzJdID09ICdyJwotICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfU0dSOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ2QnICYmIHNyY1sxXSA9PSAnYicgJiYgc3JjWzJdID09ICdyJwotICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfREJSOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncicgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfU1I7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncycgJiYgc3JjWzFdID09ICdwJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9SRUdfTjsKLSAgICAgICpyZWcgPSAxNTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdwJyAmJiBzcmNbMV0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1BSOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdwJyAmJiBzcmNbMV0gPT0gJ2MnICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0RJU1BfUEM7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2cnICYmIHNyY1sxXSA9PSAnYicgJiYgc3JjWzJdID09ICdyJwotICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfR0JSOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICd2JyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1ZCUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdtJyAmJiBzcmNbMV0gPT0gJ2EnICYmIHNyY1syXSA9PSAnYycKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0gICAgewotICAgICAgaWYgKHNyY1szXSA9PSAnbCcpCi0JewotCSAgKm1vZGUgPSBBX01BQ0w7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgICBpZiAoc3JjWzNdID09ICdoJykKLQl7Ci0JICAqbW9kZSA9IEFfTUFDSDsKLQkgIHJldHVybiA0OwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1syXSA9PSAnMScpCi0JewotCSAgaWYgKHNyY1szXSA+PSAnMCcgJiYgc3JjWzNdIDw9ICc1JwotCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IEZfUkVHX047Ci0JICAgICAgKnJlZyA9IDEwICsgc3JjWzNdIC0gJzAnOwotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc5JwotCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQl7Ci0JICAqbW9kZSA9IEZfUkVHX047Ci0JICAqcmVnID0gKHNyY1syXSAtICcwJyk7Ci0JICByZXR1cm4gMzsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMl0gPT0gJzEnKQotCXsKLQkgIGlmIChzcmNbM10gPj0gJzAnICYmIHNyY1szXSA8PSAnNCcgJiYgISAoKHNyY1szXSAtICcwJykgJiAxKQotCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IERfUkVHX047Ci0JICAgICAgKnJlZyA9IDEwICsgc3JjWzNdIC0gJzAnOwotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc4JyAmJiAhICgoc3JjWzJdIC0gJzAnKSAmIDEpCi0JICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotCXsKLQkgICptb2RlID0gRF9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKTsKLQkgIHJldHVybiAzOwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ3gnICYmIHNyY1sxXSA9PSAnZCcpCi0gICAgewotICAgICAgaWYgKHNyY1syXSA9PSAnMScpCi0JewotCSAgaWYgKHNyY1szXSA+PSAnMCcgJiYgc3JjWzNdIDw9ICc0JyAmJiAhICgoc3JjWzNdIC0gJzAnKSAmIDEpCi0JICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzRdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gWF9SRUdfTjsKLQkgICAgICAqcmVnID0gMTEgKyBzcmNbM10gLSAnMCc7Ci0JICAgICAgcmV0dXJuIDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzgnICYmICEgKChzcmNbMl0gLSAnMCcpICYgMSkKLQkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JewotCSAgKm1vZGUgPSBYX1JFR19OOwotCSAgKnJlZyA9IChzcmNbMl0gLSAnMCcpICsgMTsKLQkgIHJldHVybiAzOwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAndicpCi0gICAgewotICAgICAgaWYgKHNyY1syXSA9PSAnMScmJiBzcmNbM10gPT0gJzInICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0JewotCSAgKm1vZGUgPSBWX1JFR19OOwotCSAgKnJlZyA9IDEyOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgICAgaWYgKChzcmNbMl0gPT0gJzAnIHx8IHNyY1syXSA9PSAnNCcgfHwgc3JjWzJdID09ICc4JykKLQkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JewotCSAgKm1vZGUgPSBWX1JFR19OOwotCSAgKnJlZyA9IChzcmNbMl0gLSAnMCcpOwotCSAgcmV0dXJuIDM7Ci0JfQotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJyAmJiBzcmNbMl0gPT0gJ3UnICYmIHNyY1szXSA9PSAnbCcKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0gICAgewotICAgICAgKm1vZGUgPSBGUFVMX047Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJyAmJiBzcmNbMl0gPT0gJ3MnICYmIHNyY1szXSA9PSAnYycKLSAgICAgICYmIHNyY1s0XSA9PSAncicgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzVdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEZQU0NSX047Ci0gICAgICByZXR1cm4gNTsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAneCcgJiYgc3JjWzFdID09ICdtJyAmJiBzcmNbMl0gPT0gJ3QnICYmIHNyY1szXSA9PSAncicKLSAgICAgICYmIHNyY1s0XSA9PSAneCcgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzVdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IFhNVFJYX000OwotICAgICAgcmV0dXJuIDU7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgc3ltYm9sUyAqZG90KCkKLXsKLSAgY29uc3QgY2hhciAqZmFrZTsKLQotICAvKiBKRjogJy4nIGlzIHBzZXVkbyBzeW1ib2wgd2l0aCB2YWx1ZSBvZiBjdXJyZW50IGxvY2F0aW9uCi0gICAgIGluIGN1cnJlbnQgc2VnbWVudC4gICovCi0gIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0gIHJldHVybiAgc3ltYm9sX25ldyAoZmFrZSwKLQkJICAgICAgbm93X3NlZywKLQkJICAgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkgICAgICBmcmFnX25vdyk7Ci0KLX0KLQotCi1zdGF0aWMKLWNoYXIgKgotcGFyc2VfZXhwIChzKQotICAgICBjaGFyICpzOwotewotICBjaGFyICpzYXZlOwotICBjaGFyICpuZXc7Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgZXhwcmVzc2lvbiAoJmltbWVkaWF0ZSk7Ci0gIGlmIChpbW1lZGlhdGUuWF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi0KLS8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6Ci0KLSAgIFJuICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGRpcmVjdAotICAgQFJuICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgaW5kaXJlY3QKLSAgIEBSbisgICAgICAgICAgICAgICAgIEF1dG9pbmNyZW1lbnQKLSAgIEAtUm4gICAgICAgICAgICAgICAgIEF1dG9kZWNyZW1lbnQKLSAgIEAoZGlzcDo0LFJuKQotICAgQChkaXNwOjgsR0JSKQotICAgQChkaXNwOjgsUEMpCi0KLSAgIEAoUjAsUm4pCi0gICBAKFIwLEdCUikKLQotICAgZGlzcDo4Ci0gICBkaXNwOjEyCi0gICAjaW1tOAotICAgcHIsIGdiciwgdmJyLCBtYWNsLCBtYWNoCi0KLSAqLwotCi1zdGF0aWMKLWNoYXIgKgotcGFyc2VfYXQgKHNyYywgb3ApCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgc2hfb3BlcmFuZF9pbmZvICpvcDsKLXsKLSAgaW50IGxlbjsKLSAgaW50IG1vZGU7Ci0gIHNyYysrOwotICBpZiAoc3JjWzBdID09ICctJykKLSAgICB7Ci0gICAgICAvKiBNdXN0IGJlIHByZWRlY3JlbWVudCAqLwotICAgICAgc3JjKys7Ci0KLSAgICAgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJihvcC0+cmVnKSk7Ci0gICAgICBpZiAobW9kZSAhPSBBX1JFR19OKQotCWFzX2JhZCAoXygiaWxsZWdhbCByZWdpc3RlciBhZnRlciBALSIpKTsKLQotICAgICAgb3AtPnR5cGUgPSBBX0RFQ19OOwotICAgICAgc3JjICs9IGxlbjsKLSAgICB9Ci0gIGVsc2UgaWYgKHNyY1swXSA9PSAnKCcpCi0gICAgewotICAgICAgLyogQ291bGQgYmUgQChkaXNwLCBybiksIEAoZGlzcCwgZ2JyKSwgQChkaXNwLCBwYyksICBAKHIwLCBnYnIpIG9yCi0gICAgICAgICBAKHIwLCBybikgKi8KLSAgICAgIHNyYysrOwotICAgICAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLSAgICAgIGlmIChsZW4gJiYgbW9kZSA9PSBBX1JFR19OKQotCXsKLQkgIHNyYyArPSBsZW47Ci0JICBpZiAob3AtPnJlZyAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJtdXN0IGJlIEAocjAsLi4uKSIpKTsKLQkgICAgfQotCSAgaWYgKHNyY1swXSA9PSAnLCcpCi0JICAgIHNyYysrOwotCSAgLyogTm93IGNhbiBiZSBybiBvciBnYnIgKi8KLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJihvcC0+cmVnKSk7Ci0JICBpZiAobW9kZSA9PSBBX0dCUikKLQkgICAgewotCSAgICAgIG9wLT50eXBlID0gQV9SMF9HQlI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG1vZGUgPT0gQV9SRUdfTikKLQkgICAgewotCSAgICAgIG9wLT50eXBlID0gQV9JTkRfUjBfUkVHX047Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIEAocjAsLi4uKSIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBNdXN0IGJlIGFuIEAoZGlzcCwuLiB0aGluZykgKi8KLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjKTsKLQkgIGlmIChzcmNbMF0gPT0gJywnKQotCSAgICBzcmMrKzsKLQkgIC8qIE5vdyBjYW4gYmUgcm4sIGdiciBvciBwYyAqLwotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmb3AtPnJlZyk7Ci0JICBpZiAobGVuKQotCSAgICB7Ci0JICAgICAgaWYgKG1vZGUgPT0gQV9SRUdfTikKLQkJewotCQkgIG9wLT50eXBlID0gQV9ESVNQX1JFR19OOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobW9kZSA9PSBBX0dCUikKLQkJewotCQkgIG9wLT50eXBlID0gQV9ESVNQX0dCUjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG1vZGUgPT0gQV9ESVNQX1BDKQotCQl7Ci0JCSAgLyogVHVybiBhIHBsYWluIEAoNCxwYykgaW50byBAKC4rNCxwYykgKi8KLQkJICBpZiAoaW1tZWRpYXRlLlhfb3AgPT0gT19jb25zdGFudCkgeyAKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9zeW1ib2wgPSBkb3QoKTsKLQkJICAgIGltbWVkaWF0ZS5YX29wID0gT19zeW1ib2w7Ci0JCSAgfQotCQkgIG9wLT50eXBlID0gQV9ESVNQX1BDOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gQChkaXNwLFtSbiwgZ2JyLCBwY10pIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIEAoZGlzcCxbUm4sIGdiciwgcGNdKSIpKTsKLQkgICAgfQotCX0KLSAgICAgIHNyYyArPSBsZW47Ci0gICAgICBpZiAoc3JjWzBdICE9ICcpJykKLQlhc19iYWQgKF8oImV4cGVjdGluZyApIikpOwotICAgICAgZWxzZQotCXNyYysrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNyYyArPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotICAgICAgaWYgKG1vZGUgIT0gQV9SRUdfTikKLQl7Ci0JICBhc19iYWQgKF8oImlsbGVnYWwgcmVnaXN0ZXIgYWZ0ZXIgQCIpKTsKLQl9Ci0gICAgICBpZiAoc3JjWzBdID09ICcrJykKLQl7Ci0JICBvcC0+dHlwZSA9IEFfSU5DX047Ci0JICBzcmMrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3AtPnR5cGUgPSBBX0lORF9OOwotCX0KLSAgICB9Ci0gIHJldHVybiBzcmM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZCAocHRyLCBvcCkKLSAgICAgY2hhciAqKnB0cjsKLSAgICAgc2hfb3BlcmFuZF9pbmZvICpvcDsKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IG1vZGUgPSAtMTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBpZiAoc3JjWzBdID09ICcjJykKLSAgICB7Ci0gICAgICBzcmMrKzsKLSAgICAgICpwdHIgPSBwYXJzZV9leHAgKHNyYyk7Ci0gICAgICBvcC0+dHlwZSA9IEFfSU1NOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbHNlIGlmIChzcmNbMF0gPT0gJ0AnKQotICAgIHsKLSAgICAgICpwdHIgPSBwYXJzZV9hdCAoc3JjLCBvcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotICBpZiAobGVuKQotICAgIHsKLSAgICAgICpwdHIgPSBzcmMgKyBsZW47Ci0gICAgICBvcC0+dHlwZSA9IG1vZGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTm90IGEgcmVnLCB0aGUgb25seSB0aGluZyBsZWZ0IGlzIGEgZGlzcGxhY2VtZW50ICovCi0gICAgICAqcHRyID0gcGFyc2VfZXhwIChzcmMpOwotICAgICAgb3AtPnR5cGUgPSBBX0RJU1BfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotCi1zdGF0aWMKLWNoYXIgKgotZ2V0X29wZXJhbmRzIChpbmZvLCBhcmdzLCBvcGVyYW5kKQotICAgICBzaF9vcGNvZGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYXJnczsKLSAgICAgc2hfb3BlcmFuZF9pbmZvICpvcGVyYW5kOwotCi17Ci0gIGNoYXIgKnB0ciA9IGFyZ3M7Ci0gIGlmIChpbmZvLT5hcmdbMF0pCi0gICAgewotICAgICAgcHRyKys7Ci0KLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCk7Ci0gICAgICBpZiAoaW5mby0+YXJnWzFdKQotCXsKLQkgIGlmICgqcHRyID09ICcsJykKLQkgICAgewotCSAgICAgIHB0cisrOwotCSAgICB9Ci0JICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEpOwotCSAgaWYgKGluZm8tPmFyZ1syXSkKLQkgICAgewotCSAgICAgIGlmICgqcHRyID09ICcsJykKLQkJewotCQkgIHB0cisrOwotCQl9Ci0JICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAyKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZFsyXS50eXBlID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcGVyYW5kWzFdLnR5cGUgPSAwOwotCSAgb3BlcmFuZFsyXS50eXBlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb3BlcmFuZFswXS50eXBlID0gMDsKLSAgICAgIG9wZXJhbmRbMV0udHlwZSA9IDA7Ci0gICAgICBvcGVyYW5kWzJdLnR5cGUgPSAwOwotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogUGFzc2VkIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygb3Bjb2RlcyB3aGljaCB1c2UgZGlmZmVyZW50Ci0gICBhZGRyZXNzaW5nIG1vZGVzLCByZXR1cm4gdGhlIG9wY29kZSB3aGljaCBtYXRjaGVzIHRoZSBvcGNvZGVzCi0gICBwcm92aWRlZAotICovCi0KLXN0YXRpYwotc2hfb3Bjb2RlX2luZm8gKgotZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmRzKQotICAgICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBzaF9vcGVyYW5kX2luZm8gKm9wZXJhbmRzOwotewotICBzaF9vcGNvZGVfaW5mbyAqdGhpc190cnkgPSBvcGNvZGU7Ci0gIGNoYXIgKm5hbWUgPSBvcGNvZGUtPm5hbWU7Ci0gIGludCBuID0gMDsKLSAgd2hpbGUgKG9wY29kZS0+bmFtZSkKLSAgICB7Ci0gICAgICB0aGlzX3RyeSA9IG9wY29kZSsrOwotICAgICAgaWYgKHRoaXNfdHJ5LT5uYW1lICE9IG5hbWUpCi0JewotCSAgLyogV2UndmUgbG9va2VkIHNvIGZhciBkb3duIHRoZSB0YWJsZSB0aGF0IHdlJ3ZlIHJ1biBvdXQgb2YKLQkgICAgIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lICovCi0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAvKiBsb29rIGF0IGJvdGggb3BlcmFuZHMgbmVlZGVkIGJ5IHRoZSBvcGNvZGVzIGFuZCBwcm92aWRlZCBieQotICAgICAgICAgdGhlIHVzZXIgLSBzaW5jZSBhbiBhcmcgdGVzdCB3aWxsIG9mdGVuIGZhaWwgb24gdGhlIHNhbWUgYXJnCi0gICAgICAgICBhZ2FpbiBhbmQgYWdhaW4sIHdlJ2xsIHRyeSBhbmQgdGVzdCB0aGUgbGFzdCBmYWlsaW5nIGFyZyB0aGUKLSAgICAgICAgIGZpcnN0IG9uIGVhY2ggb3Bjb2RlIHRyeSAqLwotCi0gICAgICBmb3IgKG4gPSAwOyB0aGlzX3RyeS0+YXJnW25dOyBuKyspCi0JewotCSAgc2hfb3BlcmFuZF9pbmZvICp1c2VyID0gb3BlcmFuZHMgKyBuOwotCSAgc2hfYXJnX3R5cGUgYXJnID0gdGhpc190cnktPmFyZ1tuXTsKLQkgIHN3aXRjaCAoYXJnKQotCSAgICB7Ci0JICAgIGNhc2UgQV9JTU06Ci0JICAgIGNhc2UgQV9CRElTUDEyOgotCSAgICBjYXNlIEFfQkRJU1A4OgotCSAgICBjYXNlIEFfRElTUF9HQlI6Ci0JICAgIGNhc2UgQV9ESVNQX1BDOgotCSAgICBjYXNlIEFfTUFDSDoKLQkgICAgY2FzZSBBX1BSOgotCSAgICBjYXNlIEFfTUFDTDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcpCi0JCWdvdG8gZmFpbDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwOgotCSAgICAgIC8qIG9wY29kZSBuZWVkcyByMCAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IEFfUkVHX04gfHwgdXNlci0+cmVnICE9IDApCi0JCWdvdG8gZmFpbDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwX0dCUjoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBBX1IwX0dCUiB8fCB1c2VyLT5yZWcgIT0gMCkKLQkJZ290byBmYWlsOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZfRlIwOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IEZfUkVHX04gfHwgdXNlci0+cmVnICE9IDApCi0JCWdvdG8gZmFpbDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFfUkVHX046Ci0JICAgIGNhc2UgQV9JTkNfTjoKLQkgICAgY2FzZSBBX0RFQ19OOgotCSAgICBjYXNlIEFfSU5EX046Ci0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX046Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19OOgotCSAgICBjYXNlIEZfUkVHX046Ci0JICAgIGNhc2UgRF9SRUdfTjoKLQkgICAgY2FzZSBYX1JFR19OOgotCSAgICBjYXNlIFZfUkVHX046Ci0JICAgIGNhc2UgRlBVTF9OOgotCSAgICBjYXNlIEZQU0NSX046Ci0JICAgICAgLyogT3Bjb2RlIG5lZWRzIHJuICovCi0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX24gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRkRfUkVHX046Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRl9SRUdfTiAmJiB1c2VyLT50eXBlICE9IERfUkVHX04pCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbiA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEWF9SRUdfTjoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBEX1JFR19OICYmIHVzZXItPnR5cGUgIT0gWF9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19uID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfR0JSOgotCSAgICBjYXNlIEFfU1I6Ci0JICAgIGNhc2UgQV9WQlI6Ci0JICAgIGNhc2UgQV9TU1I6Ci0JICAgIGNhc2UgQV9TUEM6Ci0JICAgIGNhc2UgQV9TR1I6Ci0JICAgIGNhc2UgQV9EQlI6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQV9SRUdfQjoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcpCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfYiA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFfUkVHX006Ci0JICAgIGNhc2UgQV9JTkNfTToKLQkgICAgY2FzZSBBX0RFQ19NOgotCSAgICBjYXNlIEFfSU5EX006Ci0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX006Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19NOgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZyAtIEFfUkVHX00gKyBBX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX20gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBGX1JFR19NOgotCSAgICBjYXNlIERfUkVHX006Ci0JICAgIGNhc2UgWF9SRUdfTToKLQkgICAgY2FzZSBWX1JFR19NOgotCSAgICBjYXNlIEZQVUxfTToKLQkgICAgY2FzZSBGUFNDUl9NOgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZyAtIEZfUkVHX00gKyBGX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX20gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX006Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRF9SRUdfTiAmJiB1c2VyLT50eXBlICE9IFhfUkVHX04pCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbSA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBYTVRSWF9NNDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBYTVRSWF9NNCkKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19tID0gNDsKLQkgICAgICBicmVhazsKLQkKLQkgICAgZGVmYXVsdDoKLQkgICAgICBwcmludGYgKF8oInVuaGFuZGxlZCAlZFxuIiksIGFyZyk7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIHRoaXNfdHJ5OwotICAgIGZhaWw6OwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1jaGVjayAob3BlcmFuZCwgbG93LCBoaWdoKQotICAgICBleHByZXNzaW9uUyAqb3BlcmFuZDsKLSAgICAgaW50IGxvdzsKLSAgICAgaW50IGhpZ2g7Ci17Ci0gIGlmIChvcGVyYW5kLT5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA8IGxvdwotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyID4gaGlnaCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQiKSwgbG93LCBoaWdoKTsKLSAgICB9Ci0gIHJldHVybiBvcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWluc2VydCAod2hlcmUsIGhvdywgcGNyZWwpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBpbnQgaG93OwotICAgICBpbnQgcGNyZWw7Ci17Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkgICAgICAgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkgICAgICAgMiwKLQkgICAgICAgJmltbWVkaWF0ZSwKLQkgICAgICAgcGNyZWwsCi0JICAgICAgIGhvdyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idWlsZF9yZWxheCAob3Bjb2RlKQotICAgICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotewotICBpbnQgaGlnaF9ieXRlID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAwIDogMTsKLSAgY2hhciAqcDsKLQotICBpZiAob3Bjb2RlLT5hcmdbMF0gPT0gQV9CRElTUDgpCi0gICAgewotICAgICAgaW50IHdoYXQgPSAob3Bjb2RlLT5uaWJibGVzWzFdICYgNCkgPyBDT05EX0pVTVBfREVMQVkgOiBDT05EX0pVTVA7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkgICAgbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQ09ORDMyKV0ucmx4X2xlbmd0aCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQ4KV0ucmx4X2xlbmd0aCwKLQkJICAgIEMgKHdoYXQsIDApLAotCQkgICAgaW1tZWRpYXRlLlhfYWRkX3N5bWJvbCwKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCi0JCSAgICAwKTsKLSAgICAgIHBbaGlnaF9ieXRlXSA9IChvcGNvZGUtPm5pYmJsZXNbMF0gPDwgNCkgfCAob3Bjb2RlLT5uaWJibGVzWzFdKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1AxMikKLSAgICB7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkgICAgbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKV0ucmx4X2xlbmd0aCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMildLnJseF9sZW5ndGgsCi0JCSAgICBDIChVTkNPTkRfSlVNUCwgMCksCi0JCSAgICBpbW1lZGlhdGUuWF9hZGRfc3ltYm9sLAotCQkgICAgaW1tZWRpYXRlLlhfYWRkX251bWJlciwKLQkJICAgIDApOwotICAgICAgcFtoaWdoX2J5dGVdID0gKG9wY29kZS0+bmliYmxlc1swXSA8PCA0KTsKLSAgICB9Ci0KLX0KLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX015dGVzIChvcGNvZGUsIG9wZXJhbmQpCi0gICAgIHNoX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBpbnQgaW5kZXg7Ci0gIGNoYXIgbmJ1Zls0XTsKLSAgY2hhciAqb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgaW50IGxvd19ieXRlID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAxIDogMDsKLSAgbmJ1ZlswXSA9IDA7Ci0gIG5idWZbMV0gPSAwOwotICBuYnVmWzJdID0gMDsKLSAgbmJ1ZlszXSA9IDA7Ci0KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBzaF9uaWJibGVfdHlwZSBpID0gb3Bjb2RlLT5uaWJibGVzW2luZGV4XTsKLSAgICAgIGlmIChpIDwgMTYpCi0JewotCSAgbmJ1ZltpbmRleF0gPSBpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSBSRUdfTjoKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19uOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19NOgotCSAgICAgIG5idWZbaW5kZXhdID0gcmVnX207Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX05NOgotCSAgICAgIG5idWZbaW5kZXhdID0gcmVnX24gfCAocmVnX20gPj4gMik7Ci0JICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJFR19COgotCSAgICAgIG5idWZbaW5kZXhdID0gcmVnX2IgfCAweDA4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1BfNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzRCWTQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTRCWTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV80QlkyOgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU00QlkyLCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzhCWTQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTThCWTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV84QlkyOgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU04QlkyLCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fODoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NOCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZMjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmIChfKCJmYWlsZWQgZm9yICVkXG4iKSwgaSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikgewotICAgIG91dHB1dFsxXSA9IChuYnVmWzBdIDw8IDQpIHwgKG5idWZbMV0pOwotICAgIG91dHB1dFswXSA9IChuYnVmWzJdIDw8IDQpIHwgKG5idWZbM10pOwotICB9Ci0gIGVsc2UgewotICAgIG91dHB1dFswXSA9IChuYnVmWzBdIDw8IDQpIHwgKG5idWZbMV0pOwotICAgIG91dHB1dFsxXSA9IChuYnVmWzJdIDw8IDQpIHwgKG5idWZbM10pOwotICB9Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICB1bnNpZ25lZCBjaGFyICpvcF9zdGFydDsKLSAgdW5zaWduZWQgY2hhciAqb3BfZW5kOwotICBzaF9vcGVyYW5kX2luZm8gb3BlcmFuZFszXTsKLSAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgY2hhciBuYW1lWzIwXTsKLSAgaW50IG5sZW4gPSAwOwotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopIChzdHIpOwotICAgICAgICpvcF9lbmQKLSAgICAgICAmJiBubGVuIDwgMjAKLSAgICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBjID0gb3Bfc3RhcnRbbmxlbl07Ci0KLSAgICAgIC8qIFRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgd2lsbCBjb252ZXJ0IENNUC9FUSBpbnRvIGNtcC9FUQotCSBiZWNhdXNlIGl0IHRoaW5rcyB0aGUgJy8nIGlzIHRoZSBlbmQgb2YgdGhlIHN5bWJvbC4gIEluc3RlYWQgb2YKLQkgaGFja2luZyB1cCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlLCB3ZSBqdXN0IGRlYWwgd2l0aCBpdAotCSBoZXJlLiAgKi8KLSAgICAgIGMgPSBpc3VwcGVyIChjKSA/IHRvbG93ZXIgKGMpIDogYzsKLSAgICAgIG5hbWVbbmxlbl0gPSBjOwotICAgICAgbmxlbisrOwotICAgIH0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0KLSAgb3Bjb2RlID0gKHNoX29wY29kZV9pbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzaF9yZWxheAotICAgICAgJiYgISBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUpCi0gICAgewotICAgICAgLyogT3V0cHV0IGEgQ09ERSByZWxvYyB0byB0ZWxsIHRoZSBsaW5rZXIgdGhhdCB0aGUgZm9sbG93aW5nCi0gICAgICAgICBieXRlcyBhcmUgaW5zdHJ1Y3Rpb25zLCBub3QgZGF0YS4gICovCi0gICAgICBmaXhfbmV3IChmcmFnX25vdywgZnJhZ19ub3dfZml4ICgpLCAyLCAmYWJzX3N5bWJvbCwgMCwgMCwKLQkgICAgICAgQkZEX1JFTE9DX1NIX0NPREUpOwotICAgICAgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlID0gMTsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1AxMgotICAgICAgfHwgb3Bjb2RlLT5hcmdbMF0gPT0gQV9CRElTUDgpCi0gICAgewotICAgICAgcGFyc2VfZXhwIChvcF9lbmQgKyAxKTsKLSAgICAgIGJ1aWxkX3JlbGF4IChvcGNvZGUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcGNvZGUtPmFyZ1swXSA9PSBBX0VORCkKLQl7Ci0JICAvKiBJZ25vcmUgdHJhaWxpbmcgd2hpdGVzcGFjZS4gIElmIHRoZXJlIGlzIGFueSwgaXQgaGFzIGFscmVhZHkKLQkgICAgIGJlZW4gY29tcHJlc3NlZCB0byBhIHNpbmdsZSBzcGFjZS4gICovCi0JICBpZiAoKm9wX2VuZCA9PSAnICcpCi0JICAgIG9wX2VuZCsrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcF9lbmQgPSBnZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLCBvcGVyYW5kKTsKLQl9Ci0gICAgICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLSAgICAgIGlmIChvcGNvZGUgPT0gMCkKLQl7Ci0JICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLwotCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDIpOwotCi0JICB3aGVyZVswXSA9IDB4MDsKLQkgIHdoZXJlWzFdID0gMHgwOwotCSAgYXNfYmFkIChfKCJpbnZhbGlkIG9wZXJhbmRzIGZvciBvcGNvZGUiKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoKm9wX2VuZCkKLQlhc19iYWQgKF8oImV4Y2VzcyBvcGVyYW5kczogJyVzJyIpLCBvcF9lbmQpOwotCi0gICAgICBidWlsZF9NeXRlcyAob3Bjb2RlLCBvcGVyYW5kKTsKLSAgICB9Ci0KLX0KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlYWNoIHRpbWUgYSBsYWJlbCBkZWZpbml0aW9uIGlzIHNlZW4uICBJdAotICAgZW1pdHMgYSBCRkRfUkVMT0NfU0hfTEFCRUwgcmVsb2MgaWYgbmVjZXNzYXJ5LiAgKi8KLQotdm9pZAotc2hfZnJvYl9sYWJlbCAoKQotewotICBzdGF0aWMgZnJhZ1MgKmxhc3RfbGFiZWxfZnJhZzsKLSAgc3RhdGljIGludCBsYXN0X2xhYmVsX29mZnNldDsKLQotICBpZiAoc2hfcmVsYXgKLSAgICAgICYmIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0OwotCi0gICAgICBvZmZzZXQgPSBmcmFnX25vd19maXggKCk7Ci0gICAgICBpZiAoZnJhZ19ub3cgIT0gbGFzdF9sYWJlbF9mcmFnCi0JICB8fCBvZmZzZXQgIT0gbGFzdF9sYWJlbF9vZmZzZXQpCi0JewkKLQkgIGZpeF9uZXcgKGZyYWdfbm93LCBvZmZzZXQsIDIsICZhYnNfc3ltYm9sLCAwLCAwLCBCRkRfUkVMT0NfU0hfTEFCRUwpOwotCSAgbGFzdF9sYWJlbF9mcmFnID0gZnJhZ19ub3c7Ci0JICBsYXN0X2xhYmVsX29mZnNldCA9IG9mZnNldDsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBpcyBhYm91dCB0byBvdXRwdXQgc29tZQotICAgZGF0YS4gIEl0IGVtaXRzIGEgQkZEX1JFTE9DX1NIX0RBVEEgcmVsb2MgaWYgbmVjZXNzYXJ5LiAgKi8KLQotdm9pZAotc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCkKLXsKLSAgaWYgKHNoX3JlbGF4Ci0gICAgICAmJiBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUpCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmFic19zeW1ib2wsIDAsIDAsCi0JICAgICAgIEJGRF9SRUxPQ19TSF9EQVRBKTsKLSAgICAgIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSA9IDA7Ci0gICAgfQotfQotCi1zeW1ib2xTICoKLURFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCi0gICAgICAgY2hhciAqbmFtZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBPQkpfQ09GRgotCi12b2lkCi1ERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi12b2lkCi1ERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0jZW5kaWYKLQotLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkgKi8KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogMjsKLQotICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBIYW5kbGUgdGhlIC51c2VzIHBzZXVkby1vcC4gIFRoaXMgcHNldWRvLW9wIGlzIHVzZWQganVzdCBiZWZvcmUgYQotICAgY2FsbCBpbnN0cnVjdGlvbi4gIEl0IHJlZmVycyB0byBhIGxhYmVsIG9mIHRoZSBpbnN0cnVjdGlvbiB3aGljaAotICAgbG9hZHMgdGhlIHJlZ2lzdGVyIHdoaWNoIHRoZSBjYWxsIHVzZXMuICBXZSB1c2UgaXQgdG8gZ2VuZXJhdGUgYQotICAgc3BlY2lhbCByZWxvYyBmb3IgdGhlIGxpbmtlci4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3VzZXMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0KLSAgaWYgKCEgc2hfcmVsYXgpCi0gICAgYXNfd2FybiAoXygiLnVzZXMgcHNldWRvLW9wIHNlZW4gd2hlbiBub3QgcmVsYXhpbmciKSk7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4KTsKLQotICBpZiAoZXguWF9vcCAhPSBPX3N5bWJvbCB8fCBleC5YX2FkZF9udW1iZXIgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCAudXNlcyBmb3JtYXQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmV4LCAxLCBCRkRfUkVMT0NfU0hfVVNFUyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotCi0jZGVmaW5lIE9QVElPTl9SRUxBWCAgKE9QVElPTl9NRF9CQVNFKQotI2RlZmluZSBPUFRJT05fTElUVExFIChPUFRJT05fTURfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TTUFMTCAoT1BUSU9OX0xJVFRMRSArIDEpCi0KLSAgeyJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVh9LAotICB7ImxpdHRsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFfSwKLSAgeyJzbWFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU01BTEx9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX1JFTEFYOgotICAgICAgc2hfcmVsYXggPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9MSVRUTEU6Ci0gICAgICBzaGwgPSAxOwotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TTUFMTDoKLSAgICAgIHNoX3NtYWxsID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1TSCBvcHRpb25zOlxuXAotLWxpdHRsZQkJCWdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gY29kZVxuXAotLXJlbGF4CQkJYWx0ZXIganVtcCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuXAotLXNtYWxsCQkJYWxpZ24gc2VjdGlvbnMgdG8gNCBieXRlIGJvdW5kYXJpZXMsIG5vdCAxNlxuIikpOwotfQotDAotdm9pZAotdGNfTm91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX05vdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGFyZ3VtZW50cyB0byBzaF9jb3VudF9yZWxvY3MgdGhyb3VnaAotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RydWN0IHNoX2NvdW50X3JlbG9jcwotewotICAvKiBTeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLSAgc3ltYm9sUyAqc3ltOwotICAvKiBDb3VudCBvZiByZWxvY3MgZm91bmQuICAqLwotICBpbnQgY291bnQ7Ci19OwotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIGZpeHVwcyBpbiBhIHNlY3Rpb24gd2hpY2ggcmVmZXIgdG8gYSBwYXJ0aWN1bGFyCi0gICBzeW1ib2wuICBXaGVuIHVzaW5nIEJGRF9BU1NFTUJMRVIsIHRoaXMgaXMgY2FsbGVkIHZpYQotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc2hfY291bnRfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzICppbmZvID0gKHN0cnVjdCBzaF9jb3VudF9yZWxvY3MgKikgZGF0YTsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gIHN5bWJvbFMgKnN5bTsKLSAgZml4UyAqZml4OwotCi0gIHNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgc3ltID0gaW5mby0+c3ltOwotICBmb3IgKGZpeCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXggIT0gTlVMTDsgZml4ID0gZml4LT5meF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChmaXgtPmZ4X2FkZHN5ID09IHN5bSkKLQl7Ci0JICArK2luZm8tPmNvdW50OwotCSAgZml4LT5meF90Y2JpdCA9IDE7Ci0JfQotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSBjb3VudCByZWxvY3MgZm9yIGEgcGFydGljdWxhciBzZWN0aW9uLiAgV2hlbiB1c2luZwotICAgQkZEX0FTU0VNQkxFUiwgdGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNoX2Zyb2Jfc2VjdGlvbiAoYWJmZCwgc2VjLCBpZ25vcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICBmaXhTICpmaXg7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKGZpeCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXggIT0gTlVMTDsgZml4ID0gZml4LT5meF9uZXh0KQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgZml4UyAqZnNjYW47Ci0gICAgICBzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzIGluZm87Ci0KLSAgICAgIGlmIChmaXgtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfVVNFUykKLQljb250aW51ZTsKLQotICAgICAgLyogVGhlIEJGRF9SRUxPQ19TSF9VU0VTIHJlbG9jIHNob3VsZCByZWZlciB0byBhIGRlZmluZWQgbG9jYWwKLQkgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24uICAqLwotICAgICAgc3ltID0gZml4LT5meF9hZGRzeTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTAotCSAgfHwgZml4LT5meF9zdWJzeSAhPSBOVUxMCi0JICB8fCBmaXgtPmZ4X2FkZG51bWJlciAhPSAwCi0JICB8fCBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHNlYwotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgZGVmaW5lZCAoT0JKX0NPRkYpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCi0jZW5kaWYKLQkgIHx8IFNfSVNfRVhURVJOQUwgKHN5bSkpCi0JewotCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCQkgXygiLnVzZXMgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBmaXh1cHMgYWdhaW4sIHRoaXMgdGltZSBsb29raW5nIGZvciBvbmUKLQkgYXQgdGhlIHNhbWUgbG9jYXRpb24gYXMgc3ltLiAgKi8KLSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW0pOwotICAgICAgZm9yIChmc2NhbiA9IHNlZ2luZm8tPmZpeF9yb290OwotCSAgIGZzY2FuICE9IE5VTEw7Ci0JICAgZnNjYW4gPSBmc2Nhbi0+ZnhfbmV4dCkKLQlpZiAodmFsID09IGZzY2FuLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZnNjYW4tPmZ4X3doZXJlCi0JICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0FMSUdOCi0JICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgICAgJiYgZnNjYW4tPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfREFUQQotCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9MQUJFTCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGZzY2FuID09IE5VTEwpCi0JewotCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCQkgXygiY2FuJ3QgZmluZCBmaXh1cCBwb2ludGVkIHRvIGJ5IC51c2VzIikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZnNjYW4tPmZ4X3RjYml0KQotCXsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgZG9uZSB0aGlzIG9uZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIGZzY2FuIHNob3VsZCBhbHNvIGJlIGEgZml4dXAgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUKLQkgc2VjdGlvbi4gICovCi0gICAgICBzeW0gPSBmc2Nhbi0+ZnhfYWRkc3k7Ci0gICAgICBpZiAoc3ltID09IE5VTEwKLQkgIHx8IGZzY2FuLT5meF9zdWJzeSAhPSBOVUxMCi0JICB8fCBmc2Nhbi0+ZnhfYWRkbnVtYmVyICE9IDAKLQkgIHx8IFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gc2VjCi0jaWYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiBkZWZpbmVkIChPQkpfQ09GRikKLQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FWFQKLSNlbmRpZgotCSAgfHwgU19JU19FWFRFUk5BTCAoc3ltKSkKLQl7Ci0JICBhc193YXJuX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwKLQkJCSBfKCIudXNlcyB0YXJnZXQgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHdlIGxvb2sgdGhyb3VnaCBhbGwgdGhlIGZpeHVwcyBvZiBhbGwgdGhlIHNlY3Rpb25zLAotCSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGZpbmQgYSByZWZlcmVuY2UgdG8gc3ltLiAgKi8KLSAgICAgIGluZm8uc3ltID0gc3ltOwotICAgICAgaW5mby5jb3VudCA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHNoX2NvdW50X3JlbG9jcywgKFBUUikgJmluZm8pOwotI2Vsc2UKLSAgICAgIHsKLQlpbnQgaXNjYW47Ci0KLQlmb3IgKGlzY2FuID0gU0VHX0UwOyBpc2NhbiA8IFNFR19VTktOT1dOOyBpc2NhbisrKQotCSAgc2hfY291bnRfcmVsb2NzICgoYmZkICopIE5VTEwsIGlzY2FuLCAoUFRSKSAmaW5mbyk7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKGluZm8uY291bnQgPCAxKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBHZW5lcmF0ZSBhIEJGRF9SRUxPQ19TSF9DT1VOVCBmaXh1cCBhdCB0aGUgbG9jYXRpb24gb2Ygc3ltLgotCSBXZSBoYXZlIGFscmVhZHkgYWRqdXN0ZWQgdGhlIHZhbHVlIG9mIHN5bSB0byBpbmNsdWRlIHRoZQotCSBmcmFnbWVudCBhZGRyZXNzLCBzbyB3ZSB1bmRvIHRoYXQgYWRqdXN0bWVudCBoZXJlLiAgKi8KLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gICAgICBmaXhfbmV3IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bSksCi0JICAgICAgIFNfR0VUX1ZBTFVFIChzeW0pIC0gc3ltYm9sX2dldF9mcmFnIChzeW0pLT5mcl9hZGRyZXNzLAotCSAgICAgICA0LCAmYWJzX3N5bWJvbCwgaW5mby5jb3VudCwgMCwgQkZEX1JFTE9DX1NIX0NPVU5UKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gY29tcGxldGVkLAotICAgYnV0IGJlZm9yZSB0aGUgcmVsb2NzIG9yIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0LgotICAgSWYgd2UgaGF2ZSBzZWVuIGFueSAudXNlcyBwc2V1ZG8tb3BzLCB0aGV5IHBvaW50IHRvIGFuIGluc3RydWN0aW9uCi0gICB3aGljaCBsb2FkcyBhIHJlZ2lzdGVyIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gIFdlIGxvb2sKLSAgIHRocm91Z2ggdGhlIGZpeHVwcyB0byBmaW5kIHdoZXJlIHRoZSBmdW5jdGlvbiBhZGRyZXNzIGlzIGJlaW5nCi0gICBsb2FkZWQgZnJvbS4gIFdlIHRoZW4gZ2VuZXJhdGUgYSBDT1VOVCByZWxvYyBnaXZpbmcgdGhlIG51bWJlciBvZgotICAgdGltZXMgdGhhdCBmdW5jdGlvbiBhZGRyZXNzIGlzIHJlZmVycmVkIHRvLiAgVGhlIGxpbmtlciB1c2VzIHRoaXMKLSAgIGluZm9ybWF0aW9uIHdoZW4gZG9pbmcgcmVsYXhpbmcsIHRvIGRlY2lkZSB3aGVuIGl0IGNhbiBlbGltaW5hdGUKLSAgIHRoZSBzdG9yZWQgZnVuY3Rpb24gYWRkcmVzcyBlbnRpcmVseS4gICovCi0KLXZvaWQKLXNoX2Zyb2JfZmlsZSAoKQotewotICBpZiAoISBzaF9yZWxheCkKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBzaF9mcm9iX3NlY3Rpb24sIChQVFIpIE5VTEwpOwotI2Vsc2UKLSAgewotICAgIGludCBpc2VnOwotCi0gICAgZm9yIChpc2VnID0gU0VHX0UwOyBpc2VnIDwgU0VHX1VOS05PV047IGlzZWcrKykKLSAgICAgIHNoX2Zyb2Jfc2VjdGlvbiAoKGJmZCAqKSBOVUxMLCBpc2VnLCAoUFRSKSBOVUxMKTsKLSAgfQotI2VuZGlmCi19Ci0KLS8qIENhbGxlZCBhZnRlciByZWxheGluZy4gIFNldCB0aGUgY29ycmVjdCBzaXplcyBvZiB0aGUgZnJhZ21lbnRzLCBhbmQKLSAgIGNyZWF0ZSByZWxvY3Mgc28gdGhhdCBtZF9hcHBseV9maXggd2lsbCBmaWxsIGluIHRoZSBjb3JyZWN0IHZhbHVlcy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZCAqaGVhZGVyczsKLSNlbHNlCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotI2VuZGlmCi0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGludCBkb25lcmVsYXggPSAwOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EOCk6Ci0gICAgY2FzZSBDIChDT05EX0pVTVBfREVMQVksIENPTkQ4KToKLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKToKLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMik6Ci0gICAgY2FzZSBDIChVTkNPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sID09IE5VTEwpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyAxMi1iaXQgZmllbGQiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzKTsKLSAgICAgIGVsc2UgaWYgKFNfSVNfREVGSU5FRCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyAxMi1iaXQgZmllbGQiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCi0JCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQotCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7Ci0KLSNpZiAwCQkJCS8qIFRoaXMgY29kZSB3b3JrcywgYnV0IGdlbmVyYXRlcyBwb29yIGNvZGUgYW5kIHRoZSBjb21waWxlcgotCQkJCSAgIHNob3VsZCBuZXZlciBwcm9kdWNlIGEgc2VxdWVuY2UgdGhhdCByZXF1aXJlcyBpdCB0byBiZSB1c2VkLiAgKi8KLQotICAgICAgLyogQSBqdW1wIHdvbnQgZml0IGluIDEyIGJpdHMsIG1ha2UgY29kZSB3aGljaCBsb29rcyBsaWtlCi0JIGJyYSBmb28KLQkgbW92LncgQCgwLCBQQyksIHIxNAotCSAubG9uZyBkaXNwCi0JIGZvbzogYnJhIEByMTQKLQkgKi8KLSAgICAgIGludCB0ID0gYnVmZmVyWzBdICYgMHgxMDsKLQotICAgICAgYnVmZmVyW2hpZ2hieXRlXSA9IDB4YTA7CS8qIGJyYW5jaCBvdmVyIG1vdmUgYW5kIGRpc3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlXSA9IDM7Ci0gICAgICBidWZmZXJbaGlnaGJ5dGUrMl0gPSAweGQwIHwgSlJFRzsJLyogQnVpbGQgbW92IGluc24gKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzJdID0gMHgwMDsKLQotICAgICAgYnVmZmVyW2hpZ2hieXRlKzRdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBqdW1wIGRpc3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzRdID0gMDsKLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs2XSA9IDA7Ci0gICAgICBidWZmZXJbbG93Ynl0ZSs2XSA9IDA7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs4XSA9IDB4NDAgfCBKUkVHOwkvKiBCdWlsZCBqbXAgQEpSRUcgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzhdID0gdCA/IDB4YiA6IDB4MmI7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSsxMF0gPSAweDIwOyAvKiBidWlsZCBub3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzEwXSA9IDB4MGI7Ci0KLSAgICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgNCwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gVU5DT05EMzJfTEVOR1RIOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBkb25lcmVsYXggPSAxOwotI2VuZGlmCi0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChDT05EX0pVTVAsIENPTkQxMik6Ci0gICAgY2FzZSBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMik6Ci0gICAgICAvKiBBIGJjb25kIHdvbid0IGZpdCwgc28gdHVybiBpdCBpbnRvIGEgYiFjb25kOyBicmEgZGlzcDsgbm9wICovCi0gICAgICAvKiBJIGZvdW5kIHRoYXQgYSByZWxheCBmYWlsdXJlIGZvciBnY2MuYy10b3J0dXJlL2V4ZWN1dGUvOTMwNjI4LTEuYwotCSB3YXMgZHVlIHRvIGdhcyBpbmNvcnJlY3RseSByZWxheGluZyBhbiBvdXQtb2YtcmFuZ2UgY29uZGl0aW9uYWwKLQkgYnJhbmNoIHdpdGggZGVsYXkgc2xvdC4gIEl0IHR1cm5lZDoKLSAgICAgICAgICAgICAgICAgICAgIGJmLnMgICAgTDYgICAgICAgICAgICAgIChzbG90IG1vdi5sICAgcjEyLEAoNDQscjApKQotICAgICAgICAgaW50bzoKLSAgIAotMmM6ICA4ZiAwMSBhMCA4YiAgICAgYmYucyAgICAzMiA8X21haW4rMzI+ICAgKHNsb3QgYnJhICAgICAgIEw2KQotMzA6ICAwMCAwOSAgICAgICAgICAgbm9wCi0zMjogIDEwIGNiICAgICAgICAgICBtb3YubCAgIHIxMixAKDQ0LHIwKQotICAgICAgICAgVGhlcmVmb3JlLCBicmFuY2hlcyB3aXRoIGRlbGF5IHNsb3RzIGhhdmUgdG8gYmUgaGFuZGxlZAotCSBkaWZmZXJlbnRseSBmcm9tIG9uZXMgd2l0aG91dCBkZWxheSBzbG90cy4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyID0KLQkgICh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotCWludCBoaWdoYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7Ci0JaW50IGxvd2J5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDEgOiAwOwotCWludCBkZWxheSA9IGZyYWdQLT5mcl9zdWJ0eXBlID09IEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDEyKTsKLQotCS8qIFRvZ2dsZSB0aGUgdHJ1ZS9mYWxzZSBiaXQgb2YgdGhlIGJjb25kLiAgKi8KLQlidWZmZXJbaGlnaGJ5dGVdIF49IDB4MjsKLQotCS8qIElmIHRoaXMgaXMgYSBkYWxheWVkIGJyYW5jaCwgd2UgbWF5IG5vdCBwdXQgdGhlIHRoZSBicmEgaW4gdGhlCi0JICAgc2xvdC4gIFNvIHdlIGNoYW5nZSBpdCB0byBhIG5vbi1kZWxheWVkIGJyYW5jaCwgbGlrZSB0aGF0OgotCSAgIGIhIGNvbmQgc2xvdF9sYWJlbDsgYnJhIGRpc3A7IHNsb3RfbGFiZWw6IHNsb3RfaW5zbgotCSAgID8/PyBXZSBzaG91bGQgdHJ5IGlmIHN3YXBwaW5nIHRoZSBjb25kaXRpb25hbCBicmFuY2ggYW5kCi0JICAgaXRzIGRlbGF5LXNsb3QgaW5zbiBhbHJlYWR5IG1ha2VzIHRoZSBicmFuY2ggcmVhY2guICAqLwotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIHRvIHNpeCAvIGZvdXIgYnl0ZXMgZmFydGhlciBvbi4gICovCi0Jc3Vic2VnX2NoYW5nZSAoc2VnLCAwKTsKLQlmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JCSBzZWN0aW9uX3N5bWJvbCAoc2VnKSwKLSNlbHNlCi0JCSBzZWdfaW5mbyAoc2VnKS0+ZG90LAotI2VuZGlmCi0JCSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggKyAoZGVsYXkgPyA0IDogNiksCi0JCSAxLCBCRkRfUkVMT0NfU0hfUENESVNQOEJZMik7Ci0KLQkvKiBTZXQgdXAgYSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLQlidWZmZXJbaGlnaGJ5dGUgKyAyXSA9IDB4YTA7Ci0JYnVmZmVyW2xvd2J5dGUgKyAyXSA9IDA7Ci0JZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyKTsKLQotCWlmIChkZWxheSkKLQkgIHsKLQkgICAgYnVmZmVyW2hpZ2hieXRlXSAmPSB+MHg0OyAvKiBSZW1vdmVzIGRlbGF5IHNsb3QgZnJvbSBicmFuY2guICAqLwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBGaWxsIGluIGEgTk9QIGluc3RydWN0aW9uLiAgKi8KLQkgICAgYnVmZmVyW2hpZ2hieXRlICsgNF0gPSAweDA7Ci0JICAgIGJ1ZmZlcltsb3dieXRlICsgNF0gPSAweDk7Ci0KLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotCSAgfQotCWZyYWdQLT5mcl92YXIgPSAwOwotCWRvbmVyZWxheCA9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMzIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMzIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wgPT0gTlVMTCkKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgb3ZlcmZsb3dzIDgtYml0IGZpZWxkIiksIAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MpOwotICAgICAgZWxzZSBpZiAoU19JU19ERUZJTkVEIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDgtYml0IGZpZWxkICIpLAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MsCQkKLQkJU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byB1bmRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCi0JCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKLQotI2lmIDAJCQkJLyogVGhpcyBjb2RlIHdvcmtzLCBidXQgZ2VuZXJhdGVzIHBvb3IgY29kZSwgYW5kIHRoZSBjb21waWxlcgotCQkJCSAgIHNob3VsZCBuZXZlciBwcm9kdWNlIGEgc2VxdWVuY2UgdGhhdCByZXF1aXJlcyBpdCB0byBiZSB1c2VkLiAgKi8KLQotICAgICAgLyogQSBiY29uZCB3b24ndCBmaXQgYW5kIGl0IHdvbid0IGdvIGludG8gYSAxMiBiaXQKLQkgZGlzcGxhY2VtZW50IGVpdGhlciwgdGhlIGNvZGUgc2VxdWVuY2UgbG9va3MgbGlrZToKLQkgYiFjb25kIGZvb3AKLQkgbW92LncgQChuLCBQQyksIHIxNAotCSBqbXAgIEByMTQKLQkgbm9wCi0JIC5sb25nIHdoZXJlCi0JIGZvb3A6Ci0JICovCi0KLSAgICAgIGJ1ZmZlclswXSBePSAweDI7CQkvKiBUb2dnbGUgVC9GIGJpdCAqLwotI2RlZmluZSBKUkVHIDE0Ci0gICAgICBidWZmZXJbMV0gPSA1OwkJLyogYnJhbmNoIG92ZXIgbW92LCBqdW1wLCBub3AgYW5kIHB0ciAqLwotICAgICAgYnVmZmVyWzJdID0gMHhkMCB8IEpSRUc7CS8qIEJ1aWxkIG1vdiBpbnNuICovCi0gICAgICBidWZmZXJbM10gPSAweDI7Ci0gICAgICBidWZmZXJbNF0gPSAweDQwIHwgSlJFRzsJLyogQnVpbGQgam1wIEBKUkVHICovCi0gICAgICBidWZmZXJbNV0gPSAweDBiOwotICAgICAgYnVmZmVyWzZdID0gMHgyMDsJCS8qIGJ1aWxkIG5vcCAqLwotICAgICAgYnVmZmVyWzddID0gMHgwYjsKLSAgICAgIGJ1ZmZlcls4XSA9IDA7CQkvKiBzcGFjZSBmb3IgMzIgYml0IGp1bXAgZGlzcCAqLwotICAgICAgYnVmZmVyWzldID0gMDsKLSAgICAgIGJ1ZmZlclsxMF0gPSAwOwotICAgICAgYnVmZmVyWzExXSA9IDA7Ci0gICAgICBidWZmZXJbMTJdID0gMDsKLSAgICAgIGJ1ZmZlclsxM10gPSAwOwotICAgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcCAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyA4LAotCSAgICAgICA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLAotCSAgICAgICBCRkRfUkVMT0NfMzIpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBDT05EMzJfTEVOR1RIOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBkb25lcmVsYXggPSAxOwotI2VuZGlmCi0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZG9uZXJlbGF4ICYmICFzaF9yZWxheCkKLSAgICBhc193YXJuX3doZXJlIChmcmFnUC0+ZnJfZmlsZSwgZnJhZ1AtPmZyX2xpbmUsCi0JCSAgIF8oIm92ZXJmbG93IGluIGJyYW5jaCB0byAlczsgY29udmVydGVkIGludG8gbG9uZ2VyIGluc3RydWN0aW9uIHNlcXVlbmNlIiksCi0JCSAgIChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwKLQkJICAgID8gU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkKLQkJICAgIDogIiIpKTsKLX0KLQotdmFsdWVUCi1ERUZVTiAobWRfc2VjdGlvbl9hbGlnbiwgKHNlZywgc2l6ZSksCi0gICAgICAgc2VnVCBzZWcgQU5ECi0gICAgICAgdmFsdWVUIHNpemUpCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE9CSl9FTEYKLSAgcmV0dXJuIHNpemU7Ci0jZWxzZSAvKiAhIE9CSl9FTEYgKi8KLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkgLSAxKQotCSAgJiAoLTEgPDwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpKSk7Ci0jZW5kaWYgLyogISBPQkpfRUxGICovCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pIC0gMSkKLQkgICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLX0KLQotLyogVGhpcyBzdGF0aWMgdmFyaWFibGUgaXMgc2V0IGJ5IHNfdWFjb25zIHRvIHRlbGwgc2hfY29uc19hbGlnbiB0aGF0Ci0gICB0aGUgZXhwZXNzaW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgYWxpZ25lZC4gICovCi0KLXN0YXRpYyBpbnQgc2hfbm9fYWxpZ25fY29ucyA9IDA7Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgdW5hbGlnbmVkIHNwYWNlIGFsbG9jYXRpb24gcHNldWRvLW9wcywgc3VjaCBhcwotICAgLnVhd29yZC4gIC51YXdvcmQgaXMganVzdCBsaWtlIC53b3JkLCBidXQgdGhlIHZhbHVlIGRvZXMgbm90IG5lZWQKLSAgIHRvIGJlIGFsaWduZWQuICAqLwotCi1zdGF0aWMgdm9pZAotc191YWNvbnMgKGJ5dGVzKQotICAgICBpbnQgYnl0ZXM7Ci17Ci0gIC8qIFRlbGwgc2hfY29uc19hbGlnbiBub3QgdG8gYWxpZ24gdGhpcyB2YWx1ZS4gICovCi0gIHNoX25vX2FsaWduX2NvbnMgPSAxOwotICBjb25zIChieXRlcyk7Ci19Ci0KLS8qIElmIGEgLndvcmQsIGV0LiBhbC4sIHBzZXVkLW9wIGlzIHNlZW4sIHdhcm4gaWYgdGhlIHZhbHVlIGlzIG5vdAotICAgYWxpZ25lZCBjb3JyZWN0bHkuICBOb3RlIHRoYXQgdGhpcyBjYW4gY2F1c2Ugd2FybmluZ3MgdG8gYmUgaXNzdWVkCi0gICB3aGVuIGFzc2VtYmxpbmcgaW5pdGlhbGl6ZWQgc3RydWN0dXJlZCB3aGljaCB3ZXJlIGRlY2xhcmVkIHdpdGggdGhlCi0gICBwYWNrZWQgYXR0cmlidXRlLiAgRklYTUU6IFBlcmhhcHMgd2Ugc2hvdWxkIHJlcXVpcmUgYW4gb3B0aW9uIHRvCi0gICBlbmFibGUgdGhpcyB3YXJuaW5nPyAgKi8KLQotdm9pZAotc2hfY29uc19hbGlnbiAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBpbnQgbmFsaWduOwotICBjaGFyICpwOwotCi0gIGlmIChzaF9ub19hbGlnbl9jb25zKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gdW5hbGlnbmVkIHBzZXVkby1vcC4gICovCi0gICAgICBzaF9ub19hbGlnbl9jb25zID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFsaWduID0gMDsKLSAgd2hpbGUgKChuYnl0ZXMgJiAxKSA9PSAwKQotICAgIHsKLSAgICAgICsrbmFsaWduOwotICAgICAgbmJ5dGVzID4+PSAxOwotICAgIH0KLQotICBpZiAobmFsaWduID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKChhYnNfc2VjdGlvbl9vZmZzZXQgJiAoKDEgPDwgbmFsaWduKSAtIDEpKSAhPSAwKQotCWFzX3dhcm4gKF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkoc3ltYm9sUyAqKSBOVUxMLCAob2Zmc2V0VCkgbmFsaWduLCAoY2hhciAqKSBOVUxMKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuYWxpZ24pOwotfQotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIG91dHB1dCBhIHJlbG9jIGZvciBhbnkgLmFsaWduIGRpcmVjdGl2ZQotICAgdGhhdCByZXF1ZXN0cyBhbGlnbm1lbnQgdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkgb3IgbGFyZ2VyLiAgVGhpcyBpcwotICAgYWxzbyB3aGVyZSB3ZSBjaGVjayBmb3IgbWlzYWxpZ25lZCBkYXRhLiAgKi8KLQotdm9pZAotc2hfaGFuZGxlX2FsaWduIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaWYgKHNoX3JlbGF4Ci0gICAgICAmJiBmcmFnLT5mcl90eXBlID09IHJzX2FsaWduCi0gICAgICAmJiBmcmFnLT5mcl9hZGRyZXNzICsgZnJhZy0+ZnJfZml4ID4gMAotICAgICAgJiYgZnJhZy0+ZnJfb2Zmc2V0ID4gMQotICAgICAgJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKLSAgICBmaXhfbmV3IChmcmFnLCBmcmFnLT5mcl9maXgsIDIsICZhYnNfc3ltYm9sLCBmcmFnLT5mcl9vZmZzZXQsIDAsCi0JICAgICBCRkRfUkVMT0NfU0hfQUxJR04pOwotCi0gIGlmIChmcmFnLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUKLSAgICAgICYmIGZyYWctPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnLT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfZml4ICE9IDApCi0gICAgYXNfd2Fybl93aGVyZSAoZnJhZy0+ZnJfZmlsZSwgZnJhZy0+ZnJfbGluZSwgXygibWlzYWxpZ25lZCBkYXRhIikpOwotfQotCi0vKiBUaGlzIG1hY3JvIGRlY2lkZXMgd2hldGhlciBhIHBhcnRpY3VsYXIgcmVsb2MgaXMgYW4gZW50cnkgaW4gYQotICAgc3dpdGNoIHRhYmxlLiAgSXQgaXMgdXNlZCB3aGVuIHJlbGF4aW5nLCBiZWNhdXNlIHRoZSBsaW5rZXIgbmVlZHMKLSAgIHRvIGtub3cgYWJvdXQgYWxsIHN1Y2ggZW50cmllcyBzbyB0aGF0IGl0IGNhbiBhZGp1c3QgdGhlbSBpZgotICAgbmVjZXNzYXJ5LiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgU1dJVENIX1RBQkxFX0NPTlMoZml4KSAoMCkKLSNlbHNlCi0jZGVmaW5lIFNXSVRDSF9UQUJMRV9DT05TKGZpeCkJCQkJXAotICAoKGZpeCktPmZ4X3JfdHlwZSA9PSAwCQkJCVwKLSAgICYmICgoZml4KS0+Znhfc2l6ZSA9PSAyCQkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfc2l6ZSA9PSAxCQkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfc2l6ZSA9PSA0KSkKLSNlbmRpZgotCi0jZGVmaW5lIFNXSVRDSF9UQUJMRShmaXgpCQkJCVwKLSAgKChmaXgpLT5meF9hZGRzeSAhPSBOVUxMCQkJCVwKLSAgICYmIChmaXgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCVwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXgpLT5meF9hZGRzeSkgPT0gdGV4dF9zZWN0aW9uCVwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXgpLT5meF9zdWJzeSkgPT0gdGV4dF9zZWN0aW9uCVwKLSAgICYmICgoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMgkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNgkJXAotICAgICAgIHx8IChmaXgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzgJCVwKLSAgICAgICB8fCBTV0lUQ0hfVEFCTEVfQ09OUyAoZml4KSkpCi0KLS8qIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxvY2F0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIG91dCBzd2l0Y2ggYW5kIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdoZW4KLSAgIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1zaF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKmZpeDsKLXsKLQotICBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIGlmICghIHNoX3JlbGF4KQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAoZml4LT5meF9wY3JlbAotCSAgfHwgU1dJVENIX1RBQkxFIChmaXgpCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQ09VTlQKLQkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9BTElHTgotCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9EQVRBCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfTEFCRUwpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotYm9vbGVhbgotc2hfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICpmaXhQOwotewotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFscDsKLSNlbHNlCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci0jZW5kaWYKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBpbnQgbG93Ynl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMSA6IDA7Ci0gIGludCBoaWdoYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBsb25nIHZhbCA9ICp2YWxwOwotI2VuZGlmCi0gIGxvbmcgbWF4LCBtaW47Ci0gIGludCBzaGlmdDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogYWRqdXN0X3JlbG9jX3N5bXMgd29uJ3QgY29udmVydCBhIHJlbG9jIGFnYWluc3QgYSB3ZWFrIHN5bWJvbAotICAgICBpbnRvIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24sIGJ1dCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdpbGwKLSAgICAgc2NyZXcgdXAgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBzbyB3ZSBoYXZlIHRvIGFkanVzdCB2YWwgaGVyZQotICAgICB0byBhdm9pZCB0aGUgc2NyZXcgdXAgbGF0ZXIuICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgdmFsIC09IFNfR0VUX1ZBTFVFICAoZml4UC0+ZnhfYWRkc3kpOwotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoZml4UC0+Znhfcl90eXBlID09IDApCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMikKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMTY7Ci0gICAgICBlbHNlIGlmIChmaXhQLT5meF9zaXplID09IDQpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyOwotICAgICAgZWxzZSBpZiAoZml4UC0+Znhfc2l6ZSA9PSAxKQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ184OwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLSNlbmRpZgotCi0gIG1heCA9IG1pbiA9IDA7Ci0gIHNoaWZ0ID0gMDsKLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTTQ6Ci0gICAgICBtYXggPSAweGY7Ci0gICAgICAqYnVmID0gKCpidWYgJiAweGYwKSB8ICh2YWwgJiAweGYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU00QlkyOgotICAgICAgbWF4ID0gMHhmOwotICAgICAgc2hpZnQgPSAxOwotICAgICAgKmJ1ZiA9ICgqYnVmICYgMHhmMCkgfCAoKHZhbCA+PiAxKSAmIDB4Zik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTTRCWTQ6Ci0gICAgICBtYXggPSAweGY7Ci0gICAgICBzaGlmdCA9IDI7Ci0gICAgICAqYnVmID0gKCpidWYgJiAweGYwKSB8ICgodmFsID4+IDIpICYgMHhmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfSU1NOEJZMjoKLSAgICAgIG1heCA9IDB4ZmY7Ci0gICAgICBzaGlmdCA9IDE7Ci0gICAgICAqYnVmID0gdmFsID4+IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTThCWTQ6Ci0gICAgICBtYXggPSAweGZmOwotICAgICAgc2hpZnQgPSAyOwotICAgICAgKmJ1ZiA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTTg6Ci0gICAgICAvKiBTb21ldGltZXMgdGhlIDggYml0IHZhbHVlIGlzIHNpZ24gZXh0ZW5kZWQgKGUuZy4sIGFkZCkgYW5kCi0gICAgICAgICBzb21ldGltZXMgaXQgaXMgbm90IChlLmcuLCBhbmQpLiAgV2UgcGVybWl0IGFueSA4IGJpdCB2YWx1ZS4KLSAgICAgICAgIE5vdGUgdGhhdCBhZGRpbmcgZnVydGhlciByZXN0cmljdGlvbnMgbWF5IGludmFsaWRhdGUKLSAgICAgICAgIHJlYXNvbmFibGUgbG9va2luZyBhc3NlbWJseSBjb2RlLCBzdWNoIGFzIGBgYW5kIC0weDEscjAnJy4gICovCi0gICAgICBtYXggPSAweGZmOwotICAgICAgbWluID0gLSAweGZmOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQ6Ci0gICAgICAvKiBUaGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlIFBDIGFyZSBjbGVhcmVkIGJlZm9yZSB0aGUKLSAgICAgICAgIGRpc3BsYWNlbWVudCBpcyBhZGRlZCBpbi4gIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgIGlzIG9uIGEgNCBieXRlIGJvdW5kYXkuICBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGFsc28gb24gYSA0Ci0gICAgICAgICBieXRlIGJvdW5kYXJ5LCB0aGVuIHdlIHdhbnQKLQkgICAodGFyZ2V0IC0gaGVyZSkgLyA0Ci0JIGFuZCB0YXJnZXQgLSBoZXJlIGlzIGEgbXVsdGlwbGUgb2YgNC4KLQkgT3RoZXJ3aXNlLCB3ZSBhcmUgb24gYSAyIGJ5dGUgYm91bmRhcnksIGFuZCB3ZSB3YW50Ci0JICAgKHRhcmdldCAtIChoZXJlIC0gMikpIC8gNAotCSBhbmQgdGFyZ2V0IC0gaGVyZSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAgQ29tcHV0aW5nCi0JICAgKHRhcmdldCAtIChoZXJlIC0gMikpIC8gNCA9PSAodGFyZ2V0IC0gaGVyZSArIDIpIC8gNAotCSB3b3JrcyBmb3IgYm90aCBjYXNlcywgc2luY2UgaW4gdGhlIGZpcnN0IGNhc2UgdGhlIGFkZGl0aW9uIG9mCi0JIDIgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBkaXZpc2lvbi4gIHRhcmdldCAtIGhlcmUgaXMgaW4gdGhlCi0JIHZhcmlhYmxlIHZhbC4gICovCi0gICAgICB2YWwgPSAodmFsICsgMikgLyA0OwotICAgICAgaWYgKHZhbCAmIH4weGZmKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygicGNyZWwgdG9vIGZhciIpKTsKLSAgICAgIGJ1Zltsb3dieXRlXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyOgotICAgICAgdmFsIC89IDI7Ci0gICAgICBpZiAodmFsICYgfjB4ZmYpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJwY3JlbCB0b28gZmFyIikpOwotICAgICAgYnVmW2xvd2J5dGVdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyOgotICAgICAgdmFsIC89IDI7Ci0gICAgICBpZiAodmFsIDwgLTB4ODAgfHwgdmFsID4gMHg3ZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInBjcmVsIHRvbyBmYXIiKSk7Ci0gICAgICBidWZbbG93Ynl0ZV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyOgotICAgICAgdmFsIC89IDI7Ci0gICAgICBpZiAodmFsIDwgLTB4ODAwIHx8IHZhbCA+PSAweDdmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInBjcmVsIHRvbyBmYXIiKSk7Ci0gICAgICBidWZbbG93Ynl0ZV0gPSB2YWwgJiAweGZmOwotICAgICAgYnVmW2hpZ2hieXRlXSB8PSAodmFsID4+IDgpICYgMHhmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKSAKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCSAgKmJ1ZisrID0gdmFsID4+IDE2OwotCSAgKmJ1ZisrID0gdmFsID4+IDI0OwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDI0OwotCSAgKmJ1ZisrID0gdmFsID4+IDE2OwotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDA7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQl9IAotICAgICAgZWxzZSAKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQkgICpidWYrKyA9IHZhbCA+PiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfVVNFUzoKLSAgICAgIC8qIFBhc3MgdGhlIHZhbHVlIGludG8gc2hfY29mZl9yZWxvY19tYW5nbGUuICAqLwotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9DT1VOVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9BTElHTjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9DT0RFOgotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0RBVEE6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU0hfTEFCRUw6Ci0gICAgICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgICByZXR1cm47Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKHNoaWZ0ICE9IDApCi0gICAgewotICAgICAgaWYgKCh2YWwgJiAoKDEgPDwgc2hpZnQpIC0gMSkpICE9IDApCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJtaXNhbGlnbmVkIG9mZnNldCIpKTsKLSAgICAgIGlmICh2YWwgPj0gMCkKLQl2YWwgPj49IHNoaWZ0OwotICAgICAgZWxzZQotCXZhbCA9ICgodmFsID4+IHNoaWZ0KQotCSAgICAgICB8ICgobG9uZykgLTEgJiB+ICgobG9uZykgLTEgPj4gc2hpZnQpKSk7Ci0gICAgfQotICBpZiAobWF4ICE9IDAgJiYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpKQotICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygib2Zmc2V0IG91dCBvZiByYW5nZSIpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyogQ2FsbGVkIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbi4gIFJldHVybiB0aGUgbGVuZ3RoCi0gICBieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDIChVTkNPTkRfSlVNUCwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLwotICAgICAgaWYgKCFmcmFnUC0+ZnJfc3ltYm9sKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBDIChDT05EX0pVTVAsIFVOREVGX0RJU1ApOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBVTkRFRl9ESVNQKToKLSAgICAgIC8qIHVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbAotCSAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGludCB3aGF0ID0gR0VUX1dIQVQgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKLQkgICAgIHNpemVkIC0gbWF5YmUgaXQgd2lsbCBmaXggdXAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgQ09ORDgpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQ4KV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlIGlmIChmcmFnUC0+ZnJfc3ltYm9sKQotCXsKLQkgIGludCB3aGF0ID0gR0VUX1dIQVQgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JICAvKiBXZSBrbm93IHRoZSBhYnMgdmFsdWUgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgQ09ORDgpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQ4KV0ucmx4X2xlbmd0aDsKLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGZyYWdQLT5mcl92YXI7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgdmFsdWVUIHVzZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyAyOwotfQotCi0jaWZkZWYgT0JKX0NPRkYKLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW2ZyYWctPmZyX3N1YnR5cGVdLnJseF9sZW5ndGg7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0vKiBXaGVuIHdlIGFsaWduIHRoZSAudGV4dCBzZWN0aW9uLCBpbnNlcnQgdGhlIGNvcnJlY3QgTk9QIHBhdHRlcm4uICAqLwotCi1pbnQKLXNoX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50IG47Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGw7Ci0gICAgIGludCBsZW47Ci0gICAgIGludCBtYXg7Ci17Ci0gIGlmIChmaWxsID09IE5VTEwKLSAgICAgICYmIHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpCi0gICAgICAmJiBuID4gMSkKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiaWdfbm9wX3BhdHRlcm5bXSA9IHsgMHgwMCwgMHgwOSB9OwotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGl0dGxlX25vcF9wYXR0ZXJuW10gPSB7IDB4MDksIDB4MDAgfTsKLQotICAgICAgLyogRmlyc3QgYWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnksIGluIGNhc2UgdGhlcmUgaXMgYW4gb2RkCi0gICAgICAgICAuYnl0ZS4gICovCi0gICAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGJpZ19ub3BfcGF0dGVybiwgc2l6ZW9mIGJpZ19ub3BfcGF0dGVybiwgbWF4KTsKLSAgICAgIGVsc2UKLQlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGxpdHRsZV9ub3BfcGF0dGVybiwgc2l6ZW9mIGxpdHRsZV9ub3BfcGF0dGVybiwKLQkJCSAgICBtYXgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfQ09GRgotCi0vKiBNYXAgQkZEIHJlbG9jcyB0byBTSCBDT0ZGIHJlbG9jcy4gICovCi0KLXN0cnVjdCByZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvYzsKLSAgaW50IHNoX3JlbG9jOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWxvY19tYXAgY29mZl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DXzMyLCBSX1NIX0lNTTMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX1NIX0lNTTE2IH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU0hfSU1NOCB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyLCBSX1NIX1BDRElTUDhCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIsIFJfU0hfUENESVNQIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTTQsIFJfU0hfSU1NNCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU00QlkyLCBSX1NIX0lNTTRCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NNEJZNCwgUl9TSF9JTU00Qlk0IH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTTgsIFJfU0hfSU1NOCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU04QlkyLCBSX1NIX0lNTThCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NOEJZNCwgUl9TSF9JTU04Qlk0IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwgUl9TSF9QQ1JFTElNTThCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX1BDUkVMSU1NOEJZNCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NIX1NXSVRDSDggfSwKLSAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMTYgfSwKLSAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMzIsIFJfU0hfU1dJVENIMzIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfVVNFUywgUl9TSF9VU0VTIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0NPVU5ULCBSX1NIX0NPVU5UIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0FMSUdOLCBSX1NIX0FMSUdOIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0NPREUsIFJfU0hfQ09ERSB9LAotICB7IEJGRF9SRUxPQ19TSF9EQVRBLCBSX1NIX0RBVEEgfSwKLSAgeyBCRkRfUkVMT0NfU0hfTEFCRUwsIFJfU0hfTEFCRUwgfSwKLSAgeyBCRkRfUkVMT0NfVU5VU0VELCAwIH0KLX07Ci0KLS8qIEFkanVzdCBhIHJlbG9jIGZvciB0aGUgU0guICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdlbmVyaWMgY29kZSwKLSAgIGJ1dCBkb2VzIHNvbWUgbWlub3IgdHdlYWtpbmcuICAqLwotCi12b2lkCi1zaF9jb2ZmX3JlbG9jX21hbmdsZSAoc2VnLCBmaXgsIGludHIsIHBhZGRyKQotICAgICBzZWdtZW50X2luZm9fdHlwZSAqc2VnOwotICAgICBmaXhTICpmaXg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgdW5zaWduZWQgaW50IHBhZGRyOwotewotICBzeW1ib2xTICpzeW1ib2xfcHRyID0gZml4LT5meF9hZGRzeTsKLSAgc3ltYm9sUyAqZG90OwotCi0gIGludHItPnJfdmFkZHIgPSBwYWRkciArIGZpeC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeC0+Znhfd2hlcmU7Ci0KLSAgaWYgKCEgU1dJVENIX1RBQkxFIChmaXgpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCByZWxvY19tYXAgKnJtOwotCi0gICAgICBmb3IgKHJtID0gY29mZl9yZWxvY19tYXA7IHJtLT5iZmRfcmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRDsgcm0rKykKLQlpZiAocm0tPmJmZF9yZWxvYyA9PSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSBmaXgtPmZ4X3JfdHlwZSkKLQkgIGJyZWFrOwotICAgICAgaWYgKHJtLT5iZmRfcmVsb2MgPT0gQkZEX1JFTE9DX1VOVVNFRCkKLQlhc19iYWRfd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkgICAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXgtPmZ4X3JfdHlwZSkpOwotICAgICAgaW50ci0+cl90eXBlID0gcm0tPnNoX3JlbG9jOwotICAgICAgaW50ci0+cl9vZmZzZXQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKHNoX3JlbGF4KTsKLQotICAgICAgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNikKLQlpbnRyLT5yX3R5cGUgPSBSX1NIX1NXSVRDSDE2OwotICAgICAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzgpCi0JaW50ci0+cl90eXBlID0gUl9TSF9TV0lUQ0g4OwotICAgICAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyKQotCWludHItPnJfdHlwZSA9IFJfU0hfU1dJVENIMzI7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIEZvciBhIHN3aXRjaCByZWxvYywgd2Ugc2V0IHJfb2Zmc2V0IHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgICAgICAgIHRoZSByZWxvYyBhZGRyZXNzIGFuZCB0aGUgc3VidHJhaGVuZC4gIFdoZW4gdGhlIGxpbmtlciBpcwotICAgICAgICAgZG9pbmcgcmVsYXhpbmcsIGl0IGNhbiB1c2UgdGhlIGRldGVybWluZSB0aGUgc3RhcnRpbmcgYW5kCi0gICAgICAgICBlbmRpbmcgcG9pbnRzIG9mIHRoZSBzd2l0Y2ggZGlmZmVyZW5jZSBleHByZXNzaW9uLiAgKi8KLSAgICAgIGludHItPnJfb2Zmc2V0ID0gaW50ci0+cl92YWRkciAtIFNfR0VUX1ZBTFVFIChmaXgtPmZ4X3N1YnN5KTsKLSAgICB9Ci0KLSAgLyogUEMgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLSAgaWYgKHN5bWJvbF9wdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZpeC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0OgotCWNhc2UgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfVVNFUzoKLQkgIHN5bWJvbF9wdHIgPSBzZWctPmRvdDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfVVNFUykKLSAgICB7Ci0gICAgICAvKiBXZSBjYW4ndCBzdG9yZSB0aGUgb2Zmc2V0IGluIHRoZSBvYmplY3QgZmlsZSwgc2luY2UgdGhpcwotCSByZWxvYyBkb2VzIG5vdCB0YWtlIHVwIGFueSBzcGFjZSwgc28gd2Ugc3RvcmUgaXQgaW4gcl9vZmZzZXQuCi0JIFRoZSBmeF9hZGRudW1iZXIgZmllbGQgd2FzIHNldCBpbiBtZF9hcHBseV9maXguICAqLwotICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X2FkZG51bWJlcjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT1VOVCkKLSAgICB7Ci0gICAgICAvKiBXZSBjYW4ndCBzdG9yZSB0aGUgY291bnQgaW4gdGhlIG9iamVjdCBmaWxlLCBzaW5jZSB0aGlzIHJlbG9jCi0gICAgICAgICBkb2VzIG5vdCB0YWtlIHVwIGFueSBzcGFjZSwgc28gd2Ugc3RvcmUgaXQgaW4gcl9vZmZzZXQuICBUaGUKLSAgICAgICAgIGZ4X29mZnNldCBmaWVsZCB3YXMgc2V0IHdoZW4gdGhlIGZpeHVwIHdhcyBjcmVhdGVkIGluCi0gICAgICAgICBzaF9jb2ZmX2Zyb2JfZmlsZS4gICovCi0gICAgICBpbnRyLT5yX29mZnNldCA9IGZpeC0+Znhfb2Zmc2V0OwotICAgICAgLyogVGhpcyByZWxvYyBpcyBhbHdheXMgYWJzb2x1dGUuICAqLwotICAgICAgc3ltYm9sX3B0ciA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04pCi0gICAgewotICAgICAgLyogU3RvcmUgdGhlIGFsaWdubWVudCBpbiB0aGUgcl9vZmZzZXQgZmllbGQuICAqLwotICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X29mZnNldDsKLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWx3YXlzIGFic29sdXRlLiAgKi8KLSAgICAgIHN5bWJvbF9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfREFUQQotCSAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9MQUJFTCkKLSAgICB7Ci0gICAgICAvKiBUaGVzZSByZWxvY3MgYXJlIGFsd2F5cyBhYnNvbHV0ZS4gICovCi0gICAgICBzeW1ib2xfcHRyID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVHVybiB0aGUgc2VnbWVudCBvZiB0aGUgc3ltYm9sIGludG8gYW4gb2Zmc2V0LiAgKi8KLSAgaWYgKHN5bWJvbF9wdHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkb3QgPSBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cildLmRvdDsKLSAgICAgIGlmIChkb3QgIT0gTlVMTCkKLQlpbnRyLT5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOwotICAgICAgZWxzZQotCWludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBDcmVhdGUgYSByZWxvYy4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIHJfdHlwZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLQotICBpZiAoU1dJVENIX1RBQkxFIChmaXhwKSkKLSAgICB7Ci0gICAgICByZWwtPmFkZGVuZCA9IHJlbC0+YWRkcmVzcyAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBpZiAocl90eXBlID09IEJGRF9SRUxPQ18xNikKLQlyX3R5cGUgPSBCRkRfUkVMT0NfU0hfU1dJVENIMTY7Ci0gICAgICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzgpCi0Jcl90eXBlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0gICAgICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzMyKQotCXJfdHlwZSA9IEJGRF9SRUxPQ19TSF9TV0lUQ0gzMjsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfU0hfVVNFUykKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ19TSF9DT1VOVCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ19TSF9BTElHTikKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgICAgICB8fCByX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByX3R5cGUpOwotICBpZiAocmVsLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocl90eXBlKSk7Ci0gICAgICAvKiBTZXQgaG93dG8gdG8gYSBnYXJiYWdlIHZhbHVlIHNvIHRoYXQgd2UgY2FuIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfMzIpOwotICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvICE9IE5VTEwpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zaC5oIGIvZ2FzL2NvbmZpZy90Yy1zaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI3OGMyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtc2guaAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfU0gKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfc2gKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IHNlZ21lbnRfaW5mb19zdHJ1Y3Q7Ci1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7Ci0jZW5kaWYKLQotLyogV2hldGhlciBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuICAqLwotZXh0ZXJuIGludCBzaGw7Ci0KLS8qIFdoZXRoZXIgLXJlbGF4IHdhcyB1c2VkLiAgKi8KLWV4dGVybiBpbnQgc2hfcmVsYXg7Ci0KLS8qIFdoZXRoZXIgLXNtYWxsIHdhcyB1c2VkLiAgKi8KLWV4dGVybiBpbnQgc2hfc21hbGw7Ci0KLS8qIERvbid0IHRyeSB0byBicmVhayB3b3Jkcy4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogV2UgcmVxdWlyZSAubG9uZywgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgc2hfY29uc19hbGlnbiAobmJ5dGVzKQotZXh0ZXJuIHZvaWQgc2hfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBnZW5lcmF0ZSByZWxvY2F0aW9ucyBmb3IgYWxpZ25tZW50Ci0gICBkaXJlY3RpdmVzLiAgKi8KLSNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWcpIHNoX2hhbmRsZV9hbGlnbiAoZnJhZykKLWV4dGVybiB2b2lkIHNoX2hhbmRsZV9hbGlnbiBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLS8qIFdlIG5lZWQgdG8gZm9yY2Ugb3V0IHNvbWUgcmVsb2NhdGlvbnMgd2hlbiByZWxheGluZy4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBzaF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IHNoX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBzaF9maXhfYWRqdXN0YWJsZShmaXhQKQotc3RydWN0IGZpeDsKLWV4dGVybiBib29sZWFuIHNoX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAoc2hsID8gIkhpdGFjaGkgU3VwZXItSCBHQVMgTGl0dGxlIEVuZGlhbiIgOiAiSGl0YWNoaSBTdXBlci1IIEdBUyBCaWcgRW5kaWFuIikKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLS8qIFdlIHVzZSBhIHNwZWNpYWwgYWxpZ25tZW50IGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgY29ycmVjdCBub3AKLSAgIHBhdHRlcm4uICAqLwotZXh0ZXJuIGludCBzaF9kb19hbGlnbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLSNkZWZpbmUgbWRfZG9fYWxpZ24obixmaWxsLGxlbixtYXgsbCkgaWYgKHNoX2RvX2FsaWduIChuLGZpbGwsbGVuLG1heCkpIGdvdG8gbAotCi0vKiBXZSByZWNvcmQsIGZvciBlYWNoIHNlY3Rpb24sIHdoZXRoZXIgd2UgaGF2ZSBtb3N0IHJlY2VudGx5IG91dHB1dCBhCi0gICBDT0RFIHJlbG9jIG9yIGEgREFUQSByZWxvYy4gICovCi1zdHJ1Y3Qgc2hfc2VnbWVudF9pbmZvX3R5cGUKLXsKLSAgaW50IGluX2NvZGUgOiAxOwotfTsKLSNkZWZpbmUgVENfU0VHTUVOVF9JTkZPX1RZUEUgc3RydWN0IHNoX3NlZ21lbnRfaW5mb190eXBlCi0KLS8qIFdlIGNhbGwgYSByb3V0aW5lIHRvIGVtaXQgYSByZWxvYyBmb3IgYSBsYWJlbCwgc28gdGhhdCB0aGUgbGlua2VyCi0gICBjYW4gYWxpZ24gbG9hZHMgYW5kIHN0b3JlcyB3aXRob3V0IGNyb3NzaW5nIGEgbGFiZWwuICAqLwotZXh0ZXJuIHZvaWQgc2hfZnJvYl9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBzaF9mcm9iX2xhYmVsICgpCi0KLS8qIFdlIGNhbGwgYSByb3V0aW5lIHRvIGZsdXNoIHBlbmRpbmcgb3V0cHV0IGluIG9yZGVyIHRvIG91dHB1dCBhIERBVEEKLSAgIHJlbG9jIHdoZW4gcmVxdWlyZWQuICAqLwotZXh0ZXJuIHZvaWQgc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCgpIHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IHNoX2Zyb2JfZmlsZQotI2Vsc2UKLSNkZWZpbmUgdGNfZnJvYl9maWxlIHNoX2Zyb2JfZmlsZQotI2VuZGlmCi1leHRlcm4gdm9pZCBzaF9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0jaWZkZWYgT0JKX0NPRkYKLS8qIENPRkYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeCkgKChmaXgpLT5meF9yX3R5cGUpCi0KLSNkZWZpbmUgQkZEX0FSQ0ggVEFSR0VUX0FSQ0gKLQotI2RlZmluZSBDT0ZGX01BR0lDIChzaGwgPyBTSF9BUkNIX01BR0lDX0xJVFRMRSA6IFNIX0FSQ0hfTUFHSUNfQklHKQotCi0vKiBXZSBuZWVkIHRvIHdyaXRlIG91dCByZWxvY3Mgd2hpY2ggaGF2ZSBub3QgYmVlbiBjb21wbGV0ZWQuICAqLwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhmaXgpICgoZml4KS0+ZnhfYWRkc3kgIT0gTlVMTCkKLQotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUoc2VnLCBmaXgsIGludCwgcGFkZHIpIFwKLSAgc2hfY29mZl9yZWxvY19tYW5nbGUgKChzZWcpLCAoZml4KSwgKGludCksIChwYWRkcikpCi1leHRlcm4gdm9pZCBzaF9jb2ZmX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3Qgc2VnbWVudF9pbmZvX3N0cnVjdCAqLCBzdHJ1Y3QgZml4ICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHVuc2lnbmVkIGludCkpOwotCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKSA7IC8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotCi0jZGVmaW5lIFRDX0tFRVBfRlhfT0ZGU0VUIDEKLQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKLWV4dGVybiBpbnQgdGNfY29mZl9zaXplbWFjaGRlcCBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLS8qIFdlIGFsaWduIG1vc3Qgc2VjdGlvbnMgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LiAgKi8KLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQkJCQkJXAotICAoc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5zdGFic3RyIiwgOCkgPT0gMAkJXAotICAgPyAwCQkJCQkJCQlcCi0gICA6ICgoc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5zdGFiIiwgNSkgPT0gMAlcCi0gICAgICAgfHwgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmN0b3JzIikgPT0gMAlcCi0gICAgICAgfHwgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmR0b3JzIikgPT0gMCkJXAotICAgICAgPyAyCQkJCQkJCVwKLSAgICAgIDogKHNoX3NtYWxsID8gMiA6IDQpKSkKLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSNpZmRlZiBPQkpfRUxGCi0vKiBFTEYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotCi0vKiBXaGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGlzIGJpZyBlbmRpYW4gKi8KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAoc2hsID8gImVsZjMyLXNobCIgOiAiZWxmMzItc2giKQotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0vKiBlbmQgb2YgdGMtc2guaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5jIGIvZ2FzL2NvbmZpZy90Yy1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWQ3YjVjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMDggKzAsMCBAQAotLyogdGMtc3BhcmMuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFNQQVJDCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLTk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9zcGFyYy5oIgotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3Qgc3BhcmNfYXJjaCAqbG9va3VwX2FyY2ggUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpbml0X2RlZmF1bHRfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHNwYXJjX2lwIFBBUkFNUyAoKGNoYXIgKiwgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKikpOwotc3RhdGljIGludCBpbl9zaWduZWRfcmFuZ2UgUEFSQU1TICgoYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgaW50IGluX3Vuc2lnbmVkX3JhbmdlIFBBUkFNUyAoKGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBpbnQgaW5fYml0ZmllbGRfcmFuZ2UgUEFSQU1TICgoYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgaW50IHNwYXJjX2ZmcyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHN5bnRoZXRpemVfc2V0dXcgUEFSQU1TICgoY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKSk7Ci1zdGF0aWMgdm9pZCBzeW50aGV0aXplX3NldHN3IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotc3RhdGljIHZvaWQgc3ludGhldGl6ZV9zZXR4IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotc3RhdGljIGJmZF92bWEgQlNSIFBBUkFNUyAoKGJmZF92bWEsIGludCkpOwotc3RhdGljIGludCBjbXBfcmVnX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgaW50IHBhcnNlX2tleXdvcmRfYXJnIFBBUkFNUyAoKGludCAoKikgKGNvbnN0IGNoYXIgKiksIGNoYXIgKiosIGludCAqKSk7Ci1zdGF0aWMgaW50IHBhcnNlX2NvbnN0X2V4cHJfYXJnIFBBUkFNUyAoKGNoYXIgKiosIGludCAqKSk7Ci1zdGF0aWMgaW50IGdldF9leHByZXNzaW9uIFBBUkFNUyAoKGNoYXIgKnN0cikpOwotCi0vKiBEZWZhdWx0IGFyY2hpdGVjdHVyZS4gICovCi0vKiA/Pz8gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIFY4LCBidXQgc3BhcmNsaXRlIHN1cHBvcnQgd2FzIGFkZGVkCi0gICBieSBtYWtpbmcgaXQgdGhlIGRlZmF1bHQuICBHQ0Mgbm93IHBhc3NlcyAtQXNwYXJjbGl0ZSwgc28gbWF5YmUgc29tZXRpbWUgaW4KLSAgIHRoZSBmdXR1cmUgd2UgY2FuIHNldCB0aGlzIHRvIFY4LiAgKi8KLSNpZm5kZWYgREVGQVVMVF9BUkNICi0jZGVmaW5lIERFRkFVTFRfQVJDSCAic3BhcmNsaXRlIgotI2VuZGlmCi1zdGF0aWMgY2hhciAqZGVmYXVsdF9hcmNoID0gREVGQVVMVF9BUkNIOwotCi0vKiBOb24temVybyBpZiB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgYG1heF9hcmNoaXRlY3R1cmUnIGFuZCBgc3BhcmNfYXJjaF9zaXplJwotICAgaGF2ZSBiZWVuIHNldC4gICovCi1zdGF0aWMgaW50IGRlZmF1bHRfaW5pdF9wOwotCi0vKiBDdXJyZW50IGFyY2hpdGVjdHVyZS4gIFdlIGRvbid0IGJ1bXAgdXAgdW5sZXNzIG5lY2Vzc2FyeS4gICovCi1zdGF0aWMgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgY3VycmVudF9hcmNoaXRlY3R1cmUgPSBTUEFSQ19PUENPREVfQVJDSF9WNjsKLQotLyogVGhlIG1heGltdW0gYXJjaGl0ZWN0dXJlIGxldmVsIHdlIGNhbiBidW1wIHVwIHRvLgotICAgSW4gYSAzMiBiaXQgZW52aXJvbm1lbnQsIGRvbid0IGFsbG93IGJ1bXBpbmcgdXAgdG8gdjkgYnkgZGVmYXVsdC4KLSAgIFRoZSBuYXRpdmUgYXNzZW1ibGVyIHdvcmtzIHRoaXMgd2F5LiAgVGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gcGFzcwotICAgYW4gZXhwbGljaXQgYXJndW1lbnQgYmVmb3JlIHdlJ2xsIGNyZWF0ZSB2OSBvYmplY3QgZmlsZXMuICBIb3dldmVyLCBpZgotICAgd2UgZG9uJ3Qgc2VlIGFueSB2OSBpbnNucywgYSB2OHBsdXMgb2JqZWN0IGZpbGUgaXMgbm90IGNyZWF0ZWQuICAqLwotc3RhdGljIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIG1heF9hcmNoaXRlY3R1cmU7Ci0KLS8qIEVpdGhlciAzMiBvciA2NCwgc2VsZWN0cyBmaWxlIGZvcm1hdC4gICovCi1zdGF0aWMgaW50IHNwYXJjX2FyY2hfc2l6ZTsKLS8qIEluaXRpYWwgKGRlZmF1bHQpIHZhbHVlLCByZWNvcmRlZCBzZXBhcmF0ZWx5IGluIGNhc2UgYSB1c2VyIG9wdGlvbgotICAgY2hhbmdlcyB0aGUgdmFsdWUgYmVmb3JlIG1kX3Nob3dfdXNhZ2UgaXMgY2FsbGVkLiAgKi8KLXN0YXRpYyBpbnQgZGVmYXVsdF9hcmNoX3NpemU7Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHY5IG1lbW9yeSBtb2RlbC4gIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yCi0gICBFTEYuICAqLwotc3RhdGljIGVudW0geyBNTV9UU08sIE1NX1BTTywgTU1fUk1PIH0gc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fUk1POwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZDsKLXN0YXRpYyBpbnQgd2Fybl9vbl9idW1wOwotCi0vKiBJZiB3YXJuX29uX2J1bXAgYW5kIHRoZSBuZWVkZWQgYXJjaGl0ZWN0dXJlIGlzIGhpZ2hlciB0aGFuIHRoaXMKLSAgIGFyY2hpdGVjdHVyZSwgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLXN0YXRpYyBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZTsKLQotLyogTm9uLXplcm8gaWYgYXMgc2hvdWxkIGdlbmVyYXRlIGVycm9yIGlmIGFuIHVuZGVjbGFyZWQgZ1syM10gcmVnaXN0ZXIKLSAgIGhhcyBiZWVuIHVzZWQgaW4gLTY0LiAgKi8KLXN0YXRpYyBpbnQgbm9fdW5kZWNsYXJlZF9yZWdzOwotCi0vKiBOb24temVybyBpZiB3ZSBhcmUgZ2VuZXJhdGluZyBQSUMgY29kZS4gICovCi1pbnQgc3BhcmNfcGljX2NvZGU7Ci0KLS8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBnaXZlIGFuIGVycm9yIHdoZW4gbWlzYWxpZ25lZCBkYXRhIGlzIHNlZW4uICAqLwotc3RhdGljIGludCBlbmZvcmNlX2FsaWduZWRfZGF0YTsKLQotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotc3RhdGljIGludCB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhOwotCi0vKiBTeW1ib2xzIGZvciBnbG9iYWwgcmVnaXN0ZXJzIG9uIHY5LiAgKi8KLXN0YXRpYyBzeW1ib2xTICpnbG9iYWxzWzhdOwotCi0vKiBWOSBhbmQgODZ4IGhhdmUgYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGRhdGEsIGJ1dCBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBiaWcKLSAgIGVuZGlhbi4gIFRoZSBzcGFyY2xldCBoYXMgYmktZW5kaWFuIHN1cHBvcnQgYnV0IGJvdGggZGF0YSBhbmQgaW5zbnMgaGF2ZQotICAgdGhlIHNhbWUgZW5kaWFubmVzcy4gIEdsb2JhbCBgdGFyZ2V0X2JpZ19lbmRpYW4nIGlzIHVzZWQgZm9yIGRhdGEuCi0gICBUaGUgZm9sbG93aW5nIG1hY3JvIGlzIHVzZWQgZm9yIGluc3RydWN0aW9ucy4gICovCi0jaWZuZGVmIElOU05fQklHX0VORElBTgotI2RlZmluZSBJTlNOX0JJR19FTkRJQU4gKHRhcmdldF9iaWdfZW5kaWFuIFwKLQkJCSB8fCBkZWZhdWx0X2FyY2hfdHlwZSA9PSBzcGFyYzg2eCBcCi0JCQkgfHwgU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkpCi0jZW5kaWYKLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0KLXN0YXRpYyBpbnQgbG9nMiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZGF0YTEgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc19zZWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3Byb2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3Jlc2VydmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZW1wdHkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3VhY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbmNvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3JlZ2lzdGVyIFBBUkFNUyAoKGludCkpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCS8qIERlZmF1bHRpbmcgaXMgaW52YWxpZCAoMCkgKi8KLSAgeyJjb21tb24iLCBzX2NvbW1vbiwgMH0sCi0gIHsiZW1wdHkiLCBzX2VtcHR5LCAwfSwKLSAgeyJnbG9iYWwiLCBzX2dsb2JsLCAwfSwKLSAgeyJoYWxmIiwgY29ucywgMn0sCi0gIHsibndvcmQiLCBzX25jb25zLCAwfSwKLSAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJwcm9jIiwgc19wcm9jLCAwfSwKLSAgeyJyZXNlcnZlIiwgc19yZXNlcnZlLCAwfSwKLSAgeyJzZWciLCBzX3NlZywgMH0sCi0gIHsic2tpcCIsIHNfc3BhY2UsIDB9LAotICB7IndvcmQiLCBjb25zLCA0fSwKLSAgeyJ4d29yZCIsIGNvbnMsIDh9LAotICB7InVhaGFsZiIsIHNfdWFjb25zLCAyfSwKLSAgeyJ1YXdvcmQiLCBzX3VhY29ucywgNH0sCi0gIHsidWF4d29yZCIsIHNfdWFjb25zLCA4fSwKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBzcGFyYy9zdnI0ICovCi0gIHsiMmJ5dGUiLCBzX3VhY29ucywgMn0sCi0gIHsiNGJ5dGUiLCBzX3VhY29ucywgNH0sCi0gIHsiOGJ5dGUiLCBzX3VhY29ucywgOH0sCi0gIHsicmVnaXN0ZXIiLCBzX3JlZ2lzdGVyLCAwfSwKLSNlbmRpZgotICB7TlVMTCwgMCwgMH0sCi19OwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDEyOwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhIjsJLyogSkYgcmVtb3ZlZCAnfCcgZnJvbSBjb21tZW50X2NoYXJzICovCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMKLSAgIHdvcmsgaWYgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLSNkZWZpbmUgaXNvY3RhbChjKSAgKCh1bnNpZ25lZCkoKGMpIC0gJzAnKSA8ICc4JykKLQotc3RydWN0IHNwYXJjX2l0Ci0gIHsKLSAgICBjaGFyICplcnJvcjsKLSAgICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgICBzdHJ1Y3Qgbmxpc3QgKm5saXN0cDsKLSAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgZXhwcmVzc2lvblMgZXhwMjsKLSAgICBpbnQgcGNyZWw7Ci0gICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICB9OwotCi1zdHJ1Y3Qgc3BhcmNfaXQgdGhlX2luc24sIHNldF9pbnNuOwotCi1zdGF0aWMgdm9pZCBvdXRwdXRfaW5zbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICosIHN0cnVjdCBzcGFyY19pdCAqKSk7Ci0MCi0vKiBUYWJsZSBvZiBhcmd1bWVudHMgdG8gLUEuCi0gICBUaGUgc3BhcmNfb3Bjb2RlX2FyY2ggdGFibGUgaW4gc3BhcmMtb3BjLmMgaXMgaW5zdWZmaWNpZW50IGFuZCBpbmNvcnJlY3QKLSAgIGZvciB0aGlzIHVzZS4gIFRoYXQgdGFibGUgaXMgZm9yIG9wY29kZXMgb25seS4gIFRoaXMgdGFibGUgaXMgZm9yIG9wY29kZXMKLSAgIGFuZCBmaWxlIGZvcm1hdHMuICAqLwotCi1lbnVtIHNwYXJjX2FyY2hfdHlwZXMge3Y2LCB2NywgdjgsIHNwYXJjbGV0LCBzcGFyY2xpdGUsIHNwYXJjODZ4LCB2OHBsdXMsCi0JCSAgICAgICB2OHBsdXNhLCB2OSwgdjlhLCB2OV82NH07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BhcmNfYXJjaCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKm9wY29kZV9hcmNoOwotICBlbnVtIHNwYXJjX2FyY2hfdHlwZXMgYXJjaF90eXBlOwotICAvKiBEZWZhdWx0IHdvcmQgc2l6ZSwgYXMgc3BlY2lmaWVkIGR1cmluZyBjb25maWd1cmF0aW9uLgotICAgICBBIHZhbHVlIG9mIHplcm8gbWVhbnMgY2FuJ3QgYmUgdXNlZCB0byBzcGVjaWZ5IGRlZmF1bHQgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgaW50IGRlZmF1bHRfYXJjaF9zaXplOwotICAvKiBBbGxvd2FibGUgYXJnIHRvIC1BPyAgKi8KLSAgaW50IHVzZXJfb3B0aW9uX3A7Ci19IHNwYXJjX2FyY2hfdGFibGVbXSA9IHsKLSAgeyAidjYiLCAidjYiLCB2NiwgMCwgMSB9LAotICB7ICJ2NyIsICJ2NyIsIHY3LCAwLCAxIH0sCi0gIHsgInY4IiwgInY4IiwgdjgsIDMyLCAxIH0sCi0gIHsgInNwYXJjbGV0IiwgInNwYXJjbGV0Iiwgc3BhcmNsZXQsIDMyLCAxIH0sCi0gIHsgInNwYXJjbGl0ZSIsICJzcGFyY2xpdGUiLCBzcGFyY2xpdGUsIDMyLCAxIH0sCi0gIHsgInNwYXJjODZ4IiwgInNwYXJjbGl0ZSIsIHNwYXJjODZ4LCAzMiwgMSB9LAotICB7ICJ2OHBsdXMiLCAidjkiLCB2OSwgMCwgMSB9LAotICB7ICJ2OHBsdXNhIiwgInY5YSIsIHY5LCAwLCAxIH0sCi0gIHsgInY5IiwgInY5IiwgdjksIDAsIDEgfSwKLSAgeyAidjlhIiwgInY5YSIsIHY5LCAwLCAxIH0sCi0gIC8qIFRoaXMgZXhpc3RzIHRvIGFsbG93IGNvbmZpZ3VyZS5pbi9NYWtlZmlsZS5pbiB0byBwYXNzIG9uZQotICAgICB2YWx1ZSB0byBzcGVjaWZ5IGJvdGggdGhlIGRlZmF1bHQgbWFjaGluZSBhbmQgZGVmYXVsdCB3b3JkIHNpemUuICAqLwotICB7ICJ2OS02NCIsICJ2OSIsIHY5LCA2NCwgMCB9LAotICB7IE5VTEwsIE5VTEwsIHY4LCAwLCAwIH0KLX07Ci0KLS8qIFZhcmlhbnQgb2YgZGVmYXVsdF9hcmNoICovCi1zdGF0aWMgZW51bSBzcGFyY19hcmNoX3R5cGVzIGRlZmF1bHRfYXJjaF90eXBlOwotCi1zdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggKgotbG9va3VwX2FyY2ggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzcGFyY19hcmNoICpzYTsKLQotICBmb3IgKHNhID0gJnNwYXJjX2FyY2hfdGFibGVbMF07IHNhLT5uYW1lICE9IE5VTEw7IHNhKyspCi0gICAgaWYgKHN0cmNtcCAoc2EtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBicmVhazsKLSAgaWYgKHNhLT5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBzYTsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBvcGNvZGUgYXJjaCBhbmQgd29yZCBzaXplIGZyb20gdGhlIGRlZmF1bHQKLSAgIGFyY2hpdGVjdHVyZSBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfZGVmYXVsdF9hcmNoICgpCi17Ci0gIHN0cnVjdCBzcGFyY19hcmNoICpzYSA9IGxvb2t1cF9hcmNoIChkZWZhdWx0X2FyY2gpOwotCi0gIGlmIChzYSA9PSBOVUxMCi0gICAgICB8fCBzYS0+ZGVmYXVsdF9hcmNoX3NpemUgPT0gMCkKLSAgICBhc19mYXRhbCAoXygiSW52YWxpZCBkZWZhdWx0IGFyY2hpdGVjdHVyZSwgYnJva2VuIGFzc2VtYmxlci4iKSk7Ci0KLSAgbWF4X2FyY2hpdGVjdHVyZSA9IHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAoc2EtPm9wY29kZV9hcmNoKTsKLSAgaWYgKG1heF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfQkFEKQotICAgIGFzX2ZhdGFsIChfKCJCYWQgb3Bjb2RlIHRhYmxlLCBicm9rZW4gYXNzZW1ibGVyLiIpKTsKLSAgZGVmYXVsdF9hcmNoX3NpemUgPSBzcGFyY19hcmNoX3NpemUgPSBzYS0+ZGVmYXVsdF9hcmNoX3NpemU7Ci0gIGRlZmF1bHRfaW5pdF9wID0gMTsKLSAgZGVmYXVsdF9hcmNoX3R5cGUgPSBzYS0+YXJjaF90eXBlOwotfQotCi0vKiBDYWxsZWQgYnkgVEFSR0VUX0ZPUk1BVC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfdGFyZ2V0X2Zvcm1hdCAoKQotewotICAvKiBXZSBkb24ndCBnZXQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZyBiZWZvcmUgd2UncmUgY2FsbGVkLAotICAgICBzbyBoYW5kbGUgdGhhdCBub3cuICAqLwotICBpZiAoISBkZWZhdWx0X2luaXRfcCkKLSAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKLQotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgVEVfTmV0QlNECi0gIHJldHVybiAiYS5vdXQtc3BhcmMtbmV0YnNkIjsKLSNlbHNlCi0jaWZkZWYgVEVfU1BBUkNBT1VUCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICByZXR1cm4gImEub3V0LXN1bm9zLWJpZyI7Ci0gIGVsc2UgaWYgKGRlZmF1bHRfYXJjaF90eXBlID09IHNwYXJjODZ4ICYmIHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEpCi0gICAgcmV0dXJuICJhLm91dC1zdW5vcy1iaWciOwotICBlbHNlIHJldHVybiAiYS5vdXQtc3BhcmMtbGl0dGxlIjsKLSNlbHNlCi0gIHJldHVybiAiYS5vdXQtc3Vub3MtYmlnIjsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9CT1VUCi0gIHJldHVybiAiYi5vdXQuYmlnIjsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0NPRkYKLSNpZmRlZiBURV9MWU5YCi0gIHJldHVybiAiY29mZi1zcGFyYy1seW54IjsKLSNlbHNlCi0gIHJldHVybiAiY29mZi1zcGFyYyI7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotICByZXR1cm4gc3BhcmNfYXJjaF9zaXplID09IDY0ID8gImVsZjY0LXNwYXJjIiA6ICJlbGYzMi1zcGFyYyI7Ci0jZW5kaWYKLQotICBhYm9ydCAoKTsKLX0KLQwKLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gKglTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBUaGVzZSBhcmU6Ci0gKgotICoJLWJ1bXAKLSAqCQlXYXJuIG9uIGFyY2hpdGVjdHVyZSBidW1wcy4gIFNlZSBhbHNvIC1BLgotICoKLSAqCS1BdjYsIC1BdjcsIC1BdjgsIC1Bc3BhcmNsaXRlLCAtQXNwYXJjbGV0Ci0gKgkJU3RhbmRhcmQgMzIgYml0IGFyY2hpdGVjdHVyZXMuCi0gKgktQXY4cGx1cywgLUF2OHBsdXNhCi0gKgkJU3BhcmM2NCBpbiBhIDMyIGJpdCB3b3JsZC4KLSAqCS1BdjksIC1BdjlhCi0gKgkJU3BhcmM2NCBpbiBlaXRoZXIgYSAzMiBvciA2NCBiaXQgd29ybGQgKC0zMi8tNjQgc2F5cyB3aGljaCkuCi0gKgkJVGhpcyB1c2VkIHRvIG9ubHkgbWVhbiA2NCBiaXRzLCBidXQgcHJvcGVybHkgc3BlY2lmeWluZyBpdAotICoJCWNvbXBsaWNhdGVkIGdjYydzIEFTTV9TUEVDcywgc28gbm93IG9wY29kZSBzZWxlY3Rpb24gaXMKLSAqCQlzcGVjaWZpZWQgb3J0aG9nb25hbGx5IHRvIHdvcmQgc2l6ZSAoZXhjZXB0IHdoZW4gc3BlY2lmeWluZwotICoJCXRoZSBkZWZhdWx0LCBidXQgdGhhdCBpcyBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwpLgotICoJLXhhcmNoPXY4cGx1cywgLXhhcmNoPXY4cGx1c2EKLSAqCQlTYW1lIGFzIC1BdjhwbHVzeyxhfSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTdW4ncyBhc3NlbWJsZXIuCi0gKgotICoJCVNlbGVjdCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBwb3NzaWJseSB0aGUgZmlsZSBmb3JtYXQuCi0gKgkJSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkCi0gKgkJYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsIGVycm9ycy4KLSAqCi0gKgkJVGhlIGRlZmF1bHQgaXMgdG8gc3RhcnQgYXQgdjYsIGFuZCBidW1wIHRoZSBhcmNoaXRlY3R1cmUgdXAKLSAqCQl3aGVuZXZlciBhbiBpbnN0cnVjdGlvbiBpcyBzZWVuIGF0IGEgaGlnaGVyIGxldmVsLiAgSW4gMzIgYml0Ci0gKgkJZW52aXJvbm1lbnRzLCB2OSBpcyBub3QgYnVtcGVkIHVwIHRvLCB0aGUgdXNlciBtdXN0IHBhc3MKLSAqIAkJLUF2OHBsdXN7LGF9LgotICoKLSAqCQlJZiAtYnVtcCBpcyBzcGVjaWZpZWQsIGEgd2FybmluZyBpcyBwcmludGluZyB3aGVuIGJ1bXBpbmcgdG8KLSAqCQloaWdoZXIgbGV2ZWxzLgotICoKLSAqCQlJZiBhbiBhcmNoaXRlY3R1cmUgaXMgc3BlY2lmaWVkLCBhbGwgaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2gKLSAqCQl0aGF0IGFyY2hpdGVjdHVyZS4gIEFueSBoaWdoZXIgbGV2ZWwgaW5zdHJ1Y3Rpb25zIGFyZSBmbGFnZ2VkCi0gKgkJYXMgZXJyb3JzLiAgTm90ZSB0aGF0IGluIHRoZSAzMiBiaXQgZW52aXJvbm1lbnQgc3BlY2lmeWluZwotICoJCS1BdjhwbHVzIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgdjhwbHVzIG9iamVjdCBmaWxlLCBhCi0gKgkJdjkgaW5zbiBtdXN0IGJlIHNlZW4uCi0gKgotICoJCUlmIGJvdGggYW4gYXJjaGl0ZWN0dXJlIGFuZCAtYnVtcCBhcmUgc3BlY2lmaWVkLCB0aGUKLSAqCQlhcmNoaXRlY3R1cmUgc3RhcnRzIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwsIGJ1dCBidW1wcyBhcmUKLSAqCQl3YXJuaW5ncy4gIE5vdGUgdGhhdCB3ZSBjYW4ndCBzZXQgYGN1cnJlbnRfYXJjaGl0ZWN0dXJlJyB0bwotICoJCXRoZSByZXF1ZXN0ZWQgbGV2ZWwgaW4gdGhpcyBjYXNlOiBpbiB0aGUgMzIgYml0IGVudmlyb25tZW50LAotICoJCXdlIHN0aWxsIG11c3QgYXZvaWQgY3JlYXRpbmcgdjhwbHVzIG9iamVjdCBmaWxlcyB1bmxlc3MgdjkKLSAqIAkJaW5zbnMgYXJlIHNlZW4uCi0gKgotICogTm90ZToKLSAqCQlCdW1waW5nIGJldHdlZW4gaW5jb21wYXRpYmxlIGFyY2hpdGVjdHVyZXMgaXMgYWx3YXlzIGFuCi0gKgkJZXJyb3IuICBGb3IgZXhhbXBsZSwgZnJvbSBzcGFyY2xpdGUgdG8gdjkuCi0gKi8KLQotI2lmZGVmIE9CSl9FTEYKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOks6VlE6c3EiOwotI2Vsc2UKLSNpZmRlZiBPQkpfQU9VVAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkE6ayI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkE6IjsKLSNlbmRpZgotI2VuZGlmCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl9CVU1QIChPUFRJT05fTURfQkFTRSkKLSAgeyJidW1wIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CVU1QfSwKLSNkZWZpbmUgT1BUSU9OX1NQQVJDIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsic3BhcmMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NQQVJDfSwKLSNkZWZpbmUgT1BUSU9OX1hBUkNIIChPUFRJT05fTURfQkFTRSArIDIpCi0gIHsieGFyY2giLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1hBUkNIfSwKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIE9QVElPTl8zMiAoT1BUSU9OX01EX0JBU0UgKyAzKQotICB7IjMyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl8zMn0sCi0jZGVmaW5lIE9QVElPTl82NCAoT1BUSU9OX01EX0JBU0UgKyA0KQotICB7IjY0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl82NH0sCi0jZGVmaW5lIE9QVElPTl9UU08gKE9QVElPTl9NRF9CQVNFICsgNSkKLSAgeyJUU08iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RTT30sCi0jZGVmaW5lIE9QVElPTl9QU08gKE9QVElPTl9NRF9CQVNFICsgNikKLSAgeyJQU08iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BTT30sCi0jZGVmaW5lIE9QVElPTl9STU8gKE9QVElPTl9NRF9CQVNFICsgNykKLSAgeyJSTU8iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JNT30sCi0jZW5kaWYKLSNpZmRlZiBTUEFSQ19CSUVORElBTgotI2RlZmluZSBPUFRJT05fTElUVExFX0VORElBTiAoT1BUSU9OX01EX0JBU0UgKyA4KQotICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVRUTEVfRU5ESUFOfSwKLSNkZWZpbmUgT1BUSU9OX0JJR19FTkRJQU4gKE9QVElPTl9NRF9CQVNFICsgOSkKLSAgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQklHX0VORElBTn0sCi0jZW5kaWYKLSNkZWZpbmUgT1BUSU9OX0VORk9SQ0VfQUxJR05FRF9EQVRBIChPUFRJT05fTURfQkFTRSArIDEwKQotICB7ImVuZm9yY2UtYWxpZ25lZC1kYXRhIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTkZPUkNFX0FMSUdORURfREFUQX0sCi0jZGVmaW5lIE9QVElPTl9MSVRUTEVfRU5ESUFOX0RBVEEgKE9QVElPTl9NRF9CQVNFICsgMTEpCi0gIHsibGl0dGxlLWVuZGlhbi1kYXRhIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVRUTEVfRU5ESUFOX0RBVEF9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OX05PX1VOREVDTEFSRURfUkVHUyAoT1BUSU9OX01EX0JBU0UgKyAxMikKLSAgeyJuby11bmRlY2xhcmVkLXJlZ3MiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1VOREVDTEFSRURfUkVHU30sCi0jZW5kaWYKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIHdlJ3JlIGNhbGxlZCwKLSAgICAgc28gaGFuZGxlIHRoYXQgbm93LiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9CVU1QOgotICAgICAgd2Fybl9vbl9idW1wID0gMTsKLSAgICAgIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlID0gU1BBUkNfT1BDT0RFX0FSQ0hfVjY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1hBUkNIOgotICAgICAgLyogVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFN1bidzIGFzc2VtYmxlci4gICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICJ2OHBsdXMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFyZywgInY4cGx1c2EiKSAhPSAwKQotCXsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgLXhhcmNoPSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICB7Ci0Jc3RydWN0IHNwYXJjX2FyY2ggKnNhOwotCWVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIG9wY29kZV9hcmNoOwotCi0Jc2EgPSBsb29rdXBfYXJjaCAoYXJnKTsKLQlpZiAoc2EgPT0gTlVMTAotCSAgICB8fCAhIHNhLT51c2VyX29wdGlvbl9wKQotCSAgewotCSAgICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC1BJXMiKSwgYXJnKTsKLQkgICAgcmV0dXJuIDA7Ci0JICB9Ci0KLQlvcGNvZGVfYXJjaCA9IHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAoc2EtPm9wY29kZV9hcmNoKTsKLQlpZiAob3Bjb2RlX2FyY2ggPT0gU1BBUkNfT1BDT0RFX0FSQ0hfQkFEKQotCSAgYXNfZmF0YWwgKF8oIkJhZCBvcGNvZGUgdGFibGUsIGJyb2tlbiBhc3NlbWJsZXIuIikpOwotCi0JbWF4X2FyY2hpdGVjdHVyZSA9IG9wY29kZV9hcmNoOwotCWFyY2hpdGVjdHVyZV9yZXF1ZXN0ZWQgPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TUEFSQzoKLSAgICAgIC8qIElnbm9yZSAtc3BhcmMsIHVzZWQgYnkgU3VuT1MgbWFrZSBkZWZhdWx0IC5zLm8gcnVsZS4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VORk9SQ0VfQUxJR05FRF9EQVRBOgotICAgICAgZW5mb3JjZV9hbGlnbmVkX2RhdGEgPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBTUEFSQ19CSUVORElBTgotICAgIGNhc2UgT1BUSU9OX0xJVFRMRV9FTkRJQU46Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBpZiAoZGVmYXVsdF9hcmNoX3R5cGUgIT0gc3BhcmNsZXQpCi0JYXNfZmF0YWwgKCJUaGlzIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IC1FTCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTElUVExFX0VORElBTl9EQVRBOgotICAgICAgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSA9IDE7Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBpZiAoZGVmYXVsdF9hcmNoX3R5cGUgIT0gc3BhcmM4NngKLQkgICYmIGRlZmF1bHRfYXJjaF90eXBlICE9IHY5KQotCWFzX2ZhdGFsICgiVGhpcyB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCAtLWxpdHRsZS1lbmRpYW4tZGF0YSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fQklHX0VORElBTjoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQU9VVAotICAgIGNhc2UgJ2snOgotICAgICAgc3BhcmNfcGljX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIE9QVElPTl8zMjoKLSAgICBjYXNlIE9QVElPTl82NDoKLSAgICAgIHsKLQljb25zdCBjaGFyICoqbGlzdCwgKipsOwotCi0Jc3BhcmNfYXJjaF9zaXplID0gYyA9PSBPUFRJT05fMzIgPyAzMiA6IDY0OwotCWxpc3QgPSBiZmRfdGFyZ2V0X2xpc3QgKCk7Ci0JZm9yIChsID0gbGlzdDsgKmwgIT0gTlVMTDsgbCsrKQotCSAgewotCSAgICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDMyKQotCSAgICAgIHsKLQkJaWYgKHN0cmNtcCAoKmwsICJlbGYzMi1zcGFyYyIpID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoc3RyY21wICgqbCwgImVsZjY0LXNwYXJjIikgPT0gMCkKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKCpsID09IE5VTEwpCi0JICBhc19mYXRhbCAoXygiTm8gY29tcGlsZWQgaW4gc3VwcG9ydCBmb3IgJWQgYml0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgc3BhcmNfYXJjaF9zaXplKTsKLQlmcmVlIChsaXN0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFNPOgotICAgICAgc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fVFNPOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QU086Ci0gICAgICBzcGFyY19tZW1vcnlfbW9kZWwgPSBNTV9QU087Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1JNTzoKLSAgICAgIHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1JNTzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICBwcmludF92ZXJzaW9uX2lkICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdRJzoKLSAgICAgIC8qIFF5IC0gZG8gZW1pdCAuY29tbWVudAotCSBRbiAtIGRvIG5vdCBlbWl0IC5jb21tZW50ICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgLyogdXNlIC5zdGFiIGluc3RlYWQgb2YgLnN0YWIuZXhjbCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdxJzoKLSAgICAgIC8qIHF1aWNrIC0tIG5hdGl2ZSBhc3NlbWJsZXIgZG9lcyBmZXdlciBjaGVja3MgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSyc6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsICJQSUMiKSAhPSAwKQotCWFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBvcHRpb24gZm9sbG93aW5nIC1LIikpOwotICAgICAgZWxzZQotCXNwYXJjX3BpY19jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fVU5ERUNMQVJFRF9SRUdTOgotICAgICAgbm9fdW5kZWNsYXJlZF9yZWdzID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX2FyY2ggKmFyY2g7Ci0KLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIHdlJ3JlIGNhbGxlZCwKLSAgICAgc28gaGFuZGxlIHRoYXQgbm93LiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSAgZnByaW50ZihzdHJlYW0sIF8oIlNQQVJDIG9wdGlvbnM6XG4iKSk7Ci0gIGZvciAoYXJjaCA9ICZzcGFyY19hcmNoX3RhYmxlWzBdOyBhcmNoLT5uYW1lOyBhcmNoKyspCi0gICAgewotICAgICAgaWYgKGFyY2ggIT0gJnNwYXJjX2FyY2hfdGFibGVbMF0pCi0JZnByaW50ZiAoc3RyZWFtLCAiIHwgIik7Ci0gICAgICBpZiAoYXJjaC0+dXNlcl9vcHRpb25fcCkKLQlmcHJpbnRmIChzdHJlYW0sICItQSVzIiwgYXJjaC0+bmFtZSk7Ci0gICAgfQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIFNQQVJDIGFyY2hpdGVjdHVyZVxuXAotLWJ1bXAJCQl3YXJuIHdoZW4gYXNzZW1ibGVyIHN3aXRjaGVzIGFyY2hpdGVjdHVyZXNcblwKLS1zcGFyYwkJCWlnbm9yZWRcblwKLS0tZW5mb3JjZS1hbGlnbmVkLWRhdGEJZm9yY2UgLmxvbmcsIGV0Yy4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5XG4iKSk7Ci0jaWZkZWYgT0JKX0FPVVQKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tawkJCWdlbmVyYXRlIFBJQ1xuIikpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS0zMgkJCWNyZWF0ZSAzMiBiaXQgb2JqZWN0IGZpbGVcblwKLS02NAkJCWNyZWF0ZSA2NCBiaXQgb2JqZWN0IGZpbGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0JCQlbZGVmYXVsdCBpcyAlZF1cbiIpLCBkZWZhdWx0X2FyY2hfc2l6ZSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLVRTTwkJCXVzZSBUb3RhbCBTdG9yZSBPcmRlcmluZ1xuXAotLVBTTwkJCXVzZSBQYXJ0aWFsIFN0b3JlIE9yZGVyaW5nXG5cCi0tUk1PCQkJdXNlIFJlbGF4ZWQgTWVtb3J5IE9yZGVyaW5nXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotCQkJW2RlZmF1bHQgaXMgJXNdXG4iKSwgKGRlZmF1bHRfYXJjaF9zaXplID09IDY0KSA/ICJSTU8iIDogIlRTTyIpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1LUElDCQkJZ2VuZXJhdGUgUElDXG5cCi0tVgkJCXByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlclxuXAotLXEJCQlpZ25vcmVkXG5cCi0tUXksIC1RbgkJaWdub3JlZFxuXAotLXMJCQlpZ25vcmVkXG4iKSk7Ci0jZW5kaWYKLSNpZmRlZiBTUEFSQ19CSUVORElBTgotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1FTAkJCWdlbmVyYXRlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lXG5cCi0tRUIJCQlnZW5lcmF0ZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZVxuXAotLS1saXR0bGUtZW5kaWFuLWRhdGEJZ2VuZXJhdGUgY29kZSBmb3IgYSBtYWNoaW5lIGhhdmluZyBiaWcgZW5kaWFuXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMgYW5kIGxpdHRsZSBlbmRpYW4gZGF0YS4iKSk7Ci0jZW5kaWYKLX0KLQwKLS8qIG5hdGl2ZSBvcGVyYW5kIHNpemUgb3Bjb2RlIHRyYW5zbGF0aW9uICovCi1zdHJ1Y3QKLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgY2hhciAqbmFtZTMyOwotICAgIGNoYXIgKm5hbWU2NDsKLSAgfSBuYXRpdmVfb3BfdGFibGVbXSA9Ci17Ci0gIHsibGRuIiwgImxkIiwgImxkeCJ9LAotICB7ImxkbmEiLCAibGRhIiwgImxkeGEifSwKLSAgeyJzdG4iLCAic3QiLCAic3R4In0sCi0gIHsic3RuYSIsICJzdGEiLCAic3R4YSJ9LAotICB7InNsbG4iLCAic2xsIiwgInNsbHgifSwKLSAgeyJzcmxuIiwgInNybCIsICJzcmx4In0sCi0gIHsic3JhbiIsICJzcmEiLCAic3JheCJ9LAotICB7ImNhc24iLCAiY2FzIiwgImNhc3gifSwKLSAgeyJjYXNuYSIsICJjYXNhIiwgImNhc3hhIn0sCi0gIHsiY2xybiIsICJjbHIiLCAiY2xyeCJ9LAotICB7TlVMTCwgTlVMTCwgTlVMTH0sCi19OwotDAotLyogc3BhcmM2NCBwcml2aWxlZGdlZCByZWdpc3RlcnMgKi8KLQotc3RydWN0IHByaXZfcmVnX2VudHJ5Ci0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCByZWdudW07Ci0gIH07Ci0KLXN0cnVjdCBwcml2X3JlZ19lbnRyeSBwcml2X3JlZ190YWJsZVtdID0KLXsKLSAgeyJ0cGMiLCAwfSwKLSAgeyJ0bnBjIiwgMX0sCi0gIHsidHN0YXRlIiwgMn0sCi0gIHsidHQiLCAzfSwKLSAgeyJ0aWNrIiwgNH0sCi0gIHsidGJhIiwgNX0sCi0gIHsicHN0YXRlIiwgNn0sCi0gIHsidGwiLCA3fSwKLSAgeyJwaWwiLCA4fSwKLSAgeyJjd3AiLCA5fSwKLSAgeyJjYW5zYXZlIiwgMTB9LAotICB7ImNhbnJlc3RvcmUiLCAxMX0sCi0gIHsiY2xlYW53aW4iLCAxMn0sCi0gIHsib3RoZXJ3aW4iLCAxM30sCi0gIHsid3N0YXRlIiwgMTR9LAotICB7ImZxIiwgMTV9LAotICB7InZlciIsIDMxfSwKLSAgeyIiLCAtMX0sCQkJLyogZW5kIG1hcmtlciAqLwotfTsKLQotLyogdjlhIHNwZWNpZmljIGFzcnMgKi8KLQotc3RydWN0IHByaXZfcmVnX2VudHJ5IHY5YV9hc3JfdGFibGVbXSA9Ci17Ci0gIHsidGlja19jbXByIiwgMjN9LAotICB7InNvZnRpbnQiLCAyMn0sCi0gIHsic2V0X3NvZnRpbnQiLCAyMH0sCi0gIHsicGljIiwgMTd9LAotICB7InBjciIsIDE2fSwKLSAgeyJnc3IiLCAxOX0sCi0gIHsiZGNyIiwgMTh9LAotICB7ImNsZWFyX3NvZnRpbnQiLCAyMX0sCi0gIHsiIiwgLTF9LAkJCS8qIGVuZCBtYXJrZXIgKi8KLX07Ci0KLXN0YXRpYyBpbnQKLWNtcF9yZWdfZW50cnkgKHBhcmcsIHFhcmcpCi0gICAgIGNvbnN0IFBUUiBwYXJnOwotICAgICBjb25zdCBQVFIgcWFyZzsKLXsKLSAgY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gKGNvbnN0IHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqKSBwYXJnOwotICBjb25zdCBzdHJ1Y3QgcHJpdl9yZWdfZW50cnkgKnEgPSAoY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICopIHFhcmc7Ci0KLSAgcmV0dXJuIHN0cmNtcCAocS0+bmFtZSwgcC0+bmFtZSk7Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgaW50IGxvc2UgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIG1kX3BhcnNlX29wdGlvbgotICAgICBpcyBjYWxsZWQsIGFuZCBpdCBtYXkgbm90IGJlIGNhbGxlZCwgc28gaGFuZGxlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24KLSAgICAgbm93IGlmIG5vdCBhbHJlYWR5IGRvbmUuICAqLwotICBpZiAoISBkZWZhdWx0X2luaXRfcCkKLSAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgd2hpbGUgKGkgPCAodW5zaWduZWQgaW50KSBzcGFyY19udW1fb3Bjb2RlcykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChQVFIpICZzcGFyY19vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIkludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKLQkJICBzcGFyY19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICBsb3NlID0gMTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmIChzcGFyY19vcGNvZGVzW2ldLm1hdGNoICYgc3BhcmNfb3Bjb2Rlc1tpXS5sb3NlKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIpLAotCQkgICAgICBzcGFyY19vcGNvZGVzW2ldLm5hbWUsIHNwYXJjX29wY29kZXNbaV0uYXJncyk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoaSA8ICh1bnNpZ25lZCBpbnQpIHNwYXJjX251bV9vcGNvZGVzCi0JICAgICAmJiAhc3RyY21wIChzcGFyY19vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgbmF0aXZlX29wX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICAgICAgY2hhciAqbmFtZSA9IHNwYXJjX2FyY2hfc2l6ZSA9PSAzMiA/IG5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lMzIgOgotCQkJbmF0aXZlX29wX3RhYmxlW2ldLm5hbWU2NDsKLSAgICAgIGluc24gPSAoc3RydWN0IHNwYXJjX29wY29kZSAqKWhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7Ci0gICAgICBpZiAoaW5zbiA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgZmluZCBvcGNvZGUgYCVzJyBmb3IgYCVzJ1xuIiksCi0gICAgICAgICAgCSAgbmFtZSwgbmF0aXZlX29wX3RhYmxlW2ldLm5hbWUpOwotICAgICAgICAgIGxvc2UgPSAxOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0JewotCSAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lLCAoUFRSKSBpbnNuKTsKLQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLAotCQkgICAgICBzcGFyY19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChsb3NlKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotICBxc29ydCAocHJpdl9yZWdfdGFibGUsIHNpemVvZiAocHJpdl9yZWdfdGFibGUpIC8gc2l6ZW9mIChwcml2X3JlZ190YWJsZVswXSksCi0JIHNpemVvZiAocHJpdl9yZWdfdGFibGVbMF0pLCBjbXBfcmVnX2VudHJ5KTsKLQotICAvKiBJZiAtYnVtcCwgcmVjb3JkIHRoZSBhcmNoaXRlY3R1cmUgbGV2ZWwgYXQgd2hpY2ggd2Ugc3RhcnQgaXNzdWluZwotICAgICB3YXJuaW5ncy4gIFRoZSBiZWhhdmlvdXIgaXMgZGlmZmVyZW50IGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgYW4KLSAgICAgYXJjaGl0ZWN0dXJlIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4gIElmIGl0IHdhc24ndCwgd2UgaXNzdWUgd2FybmluZ3MKLSAgICAgZm9yIGFsbCB1cHdhcmRzIGJ1bXBzLiAgSWYgaXQgd2FzLCB3ZSBkb24ndCBzdGFydCBpc3N1aW5nIHdhcm5pbmdzIHVudGlsCi0gICAgIHdlIG5lZWQgdG8gYnVtcCBiZXlvbmQgdGhlIHJlcXVlc3RlZCBhcmNoaXRlY3R1cmUgb3Igd2hlbiB3ZSBidW1wIGJldHdlZW4KLSAgICAgY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcy4gICovCi0KLSAgaWYgKHdhcm5fb25fYnVtcAotICAgICAgJiYgYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZCkKLSAgICB7Ci0gICAgICAvKiBgbWF4X2FyY2hpdGVjdHVyZScgcmVjb3JkcyB0aGUgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZS4KLQkgSXNzdWUgd2FybmluZ3MgaWYgd2UgZ28gYWJvdmUgaXQuICAqLwotICAgICAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUgPSBtYXhfYXJjaGl0ZWN0dXJlOwotCi0gICAgICAvKiBGaW5kIHRoZSBoaWdoZXN0IGFyY2hpdGVjdHVyZSBsZXZlbCB0aGF0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aAotCSB0aGUgcmVxdWVzdGVkIG9uZS4gICovCi0gICAgICBmb3IgKG1heF9hcmNoaXRlY3R1cmUgPSBTUEFSQ19PUENPREVfQVJDSF9NQVg7Ci0JICAgbWF4X2FyY2hpdGVjdHVyZSA+IHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlOwotCSAgIC0tbWF4X2FyY2hpdGVjdHVyZSkKLQlpZiAoISBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCAobWF4X2FyY2hpdGVjdHVyZSwKLQkJCQkgICAgICAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUpKQotCSAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgYWxsIGFzc2VtYmx5IGhhcyBiZWVuIGRvbmUuICAqLwotCi12b2lkCi1zcGFyY19tZF9lbmQgKCkKLXsKLSAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OWEpOwotICAgICAgZWxzZQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OHBsdXMpOwotICAgICAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OHBsdXNhKTsKLSAgICAgIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCk7Ci0gICAgICBlbHNlIGlmIChkZWZhdWx0X2FyY2hfdHlwZSA9PSBzcGFyYzg2eCAmJiB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhKQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBzcGFyY2xpdGUgaXMgdHJlYXRlZCBsaWtlIGEgbm9ybWFsIHNwYXJjLiAgUGVyaGFwcyBpdCBzaG91bGRuJ3QKLQkgICAgIGJlIGJ1dCBmb3Igbm93IGl0IGlzIChzaW5jZSB0aGF0J3MgdGhlIHdheSBpdCdzIGFsd2F5cyBiZWVuCi0JICAgICB0cmVhdGVkKS4gICovCi0JICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmMpOwotCX0KLSAgICB9Ci19Ci0MCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAtKE1BWCsxKSB0byBNQVguICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaW5fc2lnbmVkX3JhbmdlICh2YWwsIG1heCkKLSAgICAgYmZkX3NpZ25lZF92bWEgdmFsLCBtYXg7Ci17Ci0gIGlmIChtYXggPD0gMCkKLSAgICBhYm9ydCAoKTsKLSAgLyogU2lnbi1leHRlbmQgdGhlIHZhbHVlIGZyb20gdGhlIGFyY2hpdGVjdHVyZSB3b3JkIHNpemUsIHNvIHRoYXQKLSAgICAgMHhmZmZmZmZmZiBpcyBhbHdheXMgY29uc2lkZXJlZCAtMSBvbiBzcGFyYzMyLiAgKi8KLSAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSAzMikKLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBzaWduID0gKGJmZF9zaWduZWRfdm1hKTEgPDwgMzE7Ci0gICAgICB2YWwgPSAoKHZhbCAmIDB4ZmZmZmZmZmYpIF4gc2lnbikgLSBzaWduOwotICAgIH0KLSAgaWYgKHZhbCA+IG1heCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHZhbCA8IH5tYXgpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAwIHRvIE1BWC4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1pbl91bnNpZ25lZF9yYW5nZSAodmFsLCBtYXgpCi0gICAgIGJmZF92bWEgdmFsLCBtYXg7Ci17Ci0gIGlmICh2YWwgPiBtYXgpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAtKE1BWC8yKzEpIHRvIE1BWC4KLSAgIChlLmcuIC0xNSB0byArMzEpLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWluX2JpdGZpZWxkX3JhbmdlICh2YWwsIG1heCkKLSAgICAgYmZkX3NpZ25lZF92bWEgdmFsLCBtYXg7Ci17Ci0gIGlmIChtYXggPD0gMCkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHZhbCA+IG1heCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHZhbCA8IH4obWF4ID4+IDEpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotc3BhcmNfZmZzIChtYXNrKQotICAgICB1bnNpZ25lZCBpbnQgbWFzazsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKG1hc2sgPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZm9yIChpID0gMDsgKG1hc2sgJiAxKSA9PSAwOyArK2kpCi0gICAgbWFzayA+Pj0gMTsKLSAgcmV0dXJuIGk7Ci19Ci0KLS8qIEltcGxlbWVudCBiaWcgc2hpZnQgcmlnaHQuICAqLwotc3RhdGljIGJmZF92bWEKLUJTUiAodmFsLCBhbW91bnQpCi0gICAgIGJmZF92bWEgdmFsOwotICAgICBpbnQgYW1vdW50OwotewotICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA8PSA0ICYmIGFtb3VudCA+PSAzMikKLSAgICBhc19mYXRhbCAoXygiU3VwcG9ydCBmb3IgNjQtYml0IGFyaXRobWV0aWMgbm90IGNvbXBpbGVkIGluLiIpKTsKLSAgcmV0dXJuIHZhbCA+PiBhbW91bnQ7Ci19Ci0MCi0vKiBGb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHNwYXJjX2lwIGFuZCBnZXRfZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci0KLS8qIFZhbHVlcyBmb3IgYHNwZWNpYWxfY2FzZScuCi0gICBJbnN0cnVjdGlvbnMgdGhhdCByZXF1aXJlIHdpZXJkIGhhbmRsaW5nIGJlY2F1c2UgdGhleSdyZSBsb25nZXIgdGhhbgotICAgNCBieXRlcy4gICovCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9OT05FCTAKLSNkZWZpbmUJU1BFQ0lBTF9DQVNFX1NFVAkxCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9TRVRTVwkyCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9TRVRYCTMKLS8qIEZJWE1FOiBzcGFyYy1vcGMuYyBkb2Vzbid0IGhhdmUgbmVjZXNzYXJ5ICJTIiB0cmlnZ2VyIHRvIGVuYWJsZSB0aGlzLiAgKi8KLSNkZWZpbmUJU1BFQ0lBTF9DQVNFX0ZESVYJNAotCi0vKiBCaXQgbWFza3Mgb2YgdmFyaW91cyBpbnNucy4gICovCi0jZGVmaW5lIE5PUF9JTlNOIDB4MDEwMDAwMDAKLSNkZWZpbmUgT1JfSU5TTiAweDgwMTAwMDAwCi0jZGVmaW5lIFhPUl9JTlNOIDB4ODAxODAwMDAKLSNkZWZpbmUgRk1PVlNfSU5TTiAweDgxQTAwMDIwCi0jZGVmaW5lIFNFVEhJX0lOU04gMHgwMTAwMDAwMAotI2RlZmluZSBTTExYX0lOU04gMHg4MTI4MTAwMAotI2RlZmluZSBTUkFfSU5TTiAweDgxMzgwMDAwCi0KLS8qIFRoZSBsYXN0IGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqbGFzdF9pbnNuOwotLyogVGhlIGFzc2VtYmxlZCBvcGNvZGUgb2YgYGxhc3RfaW5zbicuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9vcGNvZGU7Ci0MCi0vKiBIYW5kbGUgdGhlIHNldCBhbmQgc2V0dXcgc3ludGhldGljIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgdm9pZAotc3ludGhldGl6ZV9zZXR1dyAoaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLXsKLSAgaW50IG5lZWRfaGkyMl9wID0gMDsKLSAgaW50IHJkID0gKHRoZV9pbnNuLm9wY29kZSAmIFJEICh+MCkpID4+IDI1OwotCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQl7Ci0JICBpZiAoc2l6ZW9mKG9mZnNldFQpID4gNAotCSAgICAgICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgMAotCQkgIHx8IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPiAob2Zmc2V0VCkgMHhmZmZmZmZmZikpCi0JICAgIGFzX3dhcm4gKF8oInNldDogbnVtYmVyIG5vdCBpbiAwLi40Mjk0OTY3Mjk1IHJhbmdlIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc2l6ZW9mKG9mZnNldFQpID4gNAotCSAgICAgICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgLShvZmZzZXRUKSAweDgwMDAwMDAwCi0JCSAgfHwgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+IChvZmZzZXRUKSAweGZmZmZmZmZmKSkKLQkgICAgYXNfd2FybiAoXygic2V0OiBudW1iZXIgbm90IGluIC0yMTQ3NDgzNjQ4Li40Mjk0OTY3Mjk1IHJhbmdlIikpOwotCSAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA9IChpbnQpdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKLQl9Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBvcGVyYW5kIGlzIGFic29sdXRlIGFuZCBzbWFsbDsgc2tpcCBzZXRoaSBpZiBzby4gICovCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49ICgxIDw8IDEyKQotICAgICAgfHwgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8IC0oMSA8PCAxMikpCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKFNFVEhJX0lOU04gfCBSRCAocmQpCi0JCQkgfCAoKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj4gMTApCi0JCQkgICAgJiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCA/IDB4M2ZmZmZmIDogMCkpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCT8gQkZEX1JFTE9DX0hJMjIKLQkJCTogQkZEX1JFTE9DX05PTkUpOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgICBuZWVkX2hpMjJfcCA9IDE7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBvcGVyYW5kIGhhcyBubyBsb3ctb3JkZXIgYml0czsgc2tpcCBPUiBpZiBzby4gICovCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCAobmVlZF9oaTIyX3AgJiYgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgJiAweDNGRikgIT0gMCkKLSAgICAgIHx8ICEgbmVlZF9oaTIyX3ApCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKE9SX0lOU04gfCAobmVlZF9oaTIyX3AgPyBSUzEgKHJkKSA6IDApCi0JCQkgfCBSRCAocmQpIHwgSU1NRUQKLQkJCSB8ICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyCi0JCQkgICAgJiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCA/IDAgOgotCQkJICAgICAgIG5lZWRfaGkyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQk/IEJGRF9SRUxPQ19MTzEwCi0JCQk6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLX0KLSAgICAKLS8qIEhhbmRsZSB0aGUgc2V0c3cgc3ludGhldGljIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1zeW50aGV0aXplX3NldHN3IChpbnNuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotewotICBpbnQgbG93MzIsIHJkLCBvcGM7Ci0KLSAgcmQgPSAodGhlX2luc24ub3Bjb2RlICYgUkQgKH4wKSkgPj4gMjU7Ci0KLSAgaWYgKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgc3ludGhldGl6ZV9zZXR1dyAoaW5zbik7Ci0KLSAgICAgIC8qIE5lZWQgdG8gc2lnbiBleHRlbmQgaXQuICAqLwotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKFNSQV9JTlNOIHwgUlMxIChyZCkgfCBSRCAocmQpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNpemVvZihvZmZzZXRUKSA+IDQKLSAgICAgICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgLShvZmZzZXRUKSAweDgwMDAwMDAwCi0JICB8fCB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpKQotICAgIGFzX3dhcm4gKF8oInNldHN3OiBudW1iZXIgbm90IGluIC0yMTQ3NDgzNjQ4Li40Mjk0OTY3Mjk1IHJhbmdlIikpOwotCi0gIGxvdzMyID0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsJCi0JICAgICAgCi0gIGlmIChsb3czMiA+PSAwKQotICAgIHsKLSAgICAgIHN5bnRoZXRpemVfc2V0dXcgKGluc24pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvcGMgPSBPUl9JTlNOOwotICAgIAotICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotICAvKiBTZWUgaWYgb3BlcmFuZCBpcyBhYnNvbHV0ZSBhbmQgc21hbGw7IHNraXAgc2V0aGkgaWYgc28uICAqLwotICBpZiAobG93MzIgPCAtKDEgPDwgMTIpKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKHJkKQotCQkJIHwgKCgofnRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIpID4+IDEwKSAmIDB4M2ZmZmZmKSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICAgIGxvdzMyID0gMHgxYzAwIHwgKGxvdzMyICYgMHgzZmYpOwotICAgICAgb3BjID0gUlMxIChyZCkgfCBYT1JfSU5TTjsKLSAgICB9Ci0KLSAgdGhlX2luc24ub3Bjb2RlID0gKG9wYyB8IFJEIChyZCkgfCBJTU1FRAotCQkgICAgIHwgKGxvdzMyICYgMHgxZmZmKSk7Ci0gIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotfQotCi0vKiBIYW5kbGUgdGhlIHNldHN3IHN5bnRoZXRpYyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotc3ludGhldGl6ZV9zZXR4IChpbnNuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotewotICBpbnQgdXBwZXIzMiwgbG93ZXIzMjsKLSAgaW50IHRtcHJlZyA9ICh0aGVfaW5zbi5vcGNvZGUgJiBSUzEgKH4wKSkgPj4gMTQ7Ci0gIGludCBkc3RyZWcgPSAodGhlX2luc24ub3Bjb2RlICYgUkQgKH4wKSkgPj4gMjU7Ci0gIGludCB1cHBlcl9kc3RyZWc7Ci0gIGludCBuZWVkX2hoMjJfcCA9IDAsIG5lZWRfaG0xMF9wID0gMCwgbmVlZF9oaTIyX3AgPSAwLCBuZWVkX2xvMTBfcCA9IDA7Ci0gIGludCBuZWVkX3hvcjEwX3AgPSAwOwotICAgIAotI2RlZmluZSBTSUdORVhUMzIoeCkgKCgoKHgpICYgMHhmZmZmZmZmZikgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDApCi0gIGxvd2VyMzIgPSBTSUdORVhUMzIgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIpOwotICB1cHBlcjMyID0gU0lHTkVYVDMyIChCU1IgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIsIDMyKSk7Ci0jdW5kZWYgU0lHTkVYVDMyCi0KLSAgdXBwZXJfZHN0cmVnID0gdG1wcmVnOwotICAvKiBUaGUgdG1wIHJlZyBzaG91bGQgbm90IGJlIHRoZSBkc3QgcmVnLiAgKi8KLSAgaWYgKHRtcHJlZyA9PSBkc3RyZWcpCi0gICAgYXNfd2FybiAoXygic2V0eDogdGVtcG9yYXJ5IHJlZ2lzdGVyIHNhbWUgYXMgZGVzdGluYXRpb24gcmVnaXN0ZXIiKSk7Ci0KLSAgLyogPz8/IE9idmlvdXNseSB0aGVyZSBhcmUgb3RoZXIgb3B0aW1pemF0aW9ucyB3ZSBjYW4gZG8KLSAgICAgKGUuZy4gc2V0aGkrc2hpZnQgZm9yIDB4MWYwMDAwMDAwKSBhbmQgcGVyaGFwcyB3ZSBzaG91bGRuJ3QgYmUKLSAgICAgZG9pbmcgc29tZSBvZiB0aGVzZS4gIExhdGVyLiAgSWYgeW91IGRvIGNoYW5nZSB0aGluZ3MsIHRyeSB0bwotICAgICBjaGFuZ2UgYWxsIG9mIHRoaXMgdG8gYmUgdGFibGUgZHJpdmVuIGFzIHdlbGwuICAqLwotICAvKiBXaGF0IHRvIG91dHB1dCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgaWYgaXQncyBjb25zdGFudC4KLSAgICAgQ29tcHV0ZSB0aGF0IGZpcnN0LCB0aGVuIG91dHB1dCB3aGF0IHdlJ3ZlIGRlY2lkZWQgdXBvbi4gICovCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGlmIChzcGFyY19hcmNoX3NpemUgPT0gMzIpCi0JewotCSAgLyogV2hlbiBhcmNoIHNpemUgaXMgMzIsIHdlIHdhbnQgc2V0eCB0byBiZSBlcXVpdmFsZW50Ci0JICAgICB0byBzZXR1dyBmb3IgYW55dGhpbmcgYnV0IGNvbnN0YW50cy4gICovCi0JICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICY9IDB4ZmZmZmZmZmY7Ci0JICBzeW50aGV0aXplX3NldHV3IChpbnNuKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBuZWVkX2hoMjJfcCA9IG5lZWRfaG0xMF9wID0gbmVlZF9oaTIyX3AgPSBuZWVkX2xvMTBfcCA9IDE7Ci0gICAgICBsb3dlcjMyID0gMDsgdXBwZXIzMiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogUmVzZXQgWF9hZGRfbnVtYmVyLCB3ZSd2ZSBleHRyYWN0ZWQgaXQgYXMgdXBwZXIzMi9sb3dlcjMyLgotCSBPdGhlcndpc2UgZml4dXBfc2VnbWVudCB3aWxsIGNvbXBsYWluIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvCi0JIHdyaXRlIGFuIDggYnl0ZSBudW1iZXIgaW4gYSA0IGJ5dGUgZmllbGQuICAqLwotICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgCi0gICAgICAvKiBPbmx5IG5lZWQgaGgyMiBpZiBgb3InIGluc24gY2FuJ3QgaGFuZGxlIGNvbnN0YW50LiAgKi8KLSAgICAgIGlmICh1cHBlcjMyIDwgLSgxIDw8IDEyKSB8fCB1cHBlcjMyID49ICgxIDw8IDEyKSkKLQluZWVkX2hoMjJfcCA9IDE7Ci0gICAgCi0gICAgICAvKiBEb2VzIGJvdHRvbSBwYXJ0IChhZnRlciBzZXRoaSkgaGF2ZSBiaXRzPyAgKi8KLSAgICAgIGlmICgobmVlZF9oaDIyX3AgJiYgKHVwcGVyMzIgJiAweDNmZikgIT0gMCkKLQkgIC8qIE5vIGhoMjIsIGJ1dCBkb2VzIHVwcGVyMzIgc3RpbGwgaGF2ZSBiaXRzIHdlIGNhbid0IHNldAotCSAgICAgZnJvbSBsb3dlcjMyPyAgKi8KLQkgIHx8ICghIG5lZWRfaGgyMl9wICYmIHVwcGVyMzIgIT0gMCAmJiB1cHBlcjMyICE9IC0xKSkKLQluZWVkX2htMTBfcCA9IDE7Ci0gICAgCi0gICAgICAvKiBJZiB0aGUgbG93ZXIgaGFsZiBpcyBhbGwgemVybywgd2UgYnVpbGQgdGhlIHVwcGVyIGhhbGYgZGlyZWN0bHkKLQkgaW50byB0aGUgZHN0IHJlZy4gICovCi0gICAgICBpZiAobG93ZXIzMiAhPSAwCi0JICAvKiBOZWVkIGxvd2VyIGhhbGYgaWYgbnVtYmVyIGlzIHplcm8gb3IgMHhmZmZmZmZmZjAwMDAwMDAwLiAgKi8KLQkgIHx8ICghIG5lZWRfaGgyMl9wICYmICEgbmVlZF9obTEwX3ApKQotCXsKLQkgIC8qIE5vIG5lZWQgZm9yIHNldGhpIGlmIGBvcicgaW5zbiBjYW4gaGFuZGxlIGNvbnN0YW50LiAgKi8KLQkgIGlmIChsb3dlcjMyIDwgLSgxIDw8IDEyKSB8fCBsb3dlcjMyID49ICgxIDw8IDEyKQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgYSBuZWdhdGl2ZSBjb25zdGFudCBpbiB0aGUgYG9yJwotCQkgaW5zbiB1bmxlc3MgdGhlIHVwcGVyIDMyIGJpdHMgYXJlIGFsbCBvbmVzLiAgKi8KLQkgICAgICB8fCAobG93ZXIzMiA8IDAgJiYgdXBwZXIzMiAhPSAtMSkKLQkgICAgICB8fCAobG93ZXIzMiA+PSAwICYmIHVwcGVyMzIgPT0gLTEpKQotCSAgICBuZWVkX2hpMjJfcCA9IDE7Ci0JCSAgICAgIAotCSAgaWYgKG5lZWRfaGkyMl9wICYmIHVwcGVyMzIgPT0gLTEpCi0JICAgIG5lZWRfeG9yMTBfcCA9IDE7Ci0KLQkgIC8qIERvZXMgYm90dG9tIHBhcnQgKGFmdGVyIHNldGhpKSBoYXZlIGJpdHM/ICAqLwotCSAgZWxzZSBpZiAoKG5lZWRfaGkyMl9wICYmIChsb3dlcjMyICYgMHgzZmYpICE9IDApCi0JCSAgIC8qIE5vIHNldGhpLiAgKi8KLQkJICAgfHwgKCEgbmVlZF9oaTIyX3AgJiYgKGxvd2VyMzIgJiAweDFmZmYpICE9IDApCi0JCSAgIC8qIE5lZWQgYG9yJyBpZiB3ZSBkaWRuJ3Qgc2V0IGFueXRoaW5nIGVsc2UuICAqLwotCQkgICB8fCAoISBuZWVkX2hpMjJfcCAmJiAhIG5lZWRfaGgyMl9wICYmICEgbmVlZF9obTEwX3ApKQotCSAgICBuZWVkX2xvMTBfcCA9IDE7Ci0JfQotICAgICAgZWxzZQotCS8qIE91dHB1dCBkaXJlY3RseSB0byBkc3QgcmVnIGlmIGxvd2VyIDMyIGJpdHMgYXJlIGFsbCB6ZXJvLiAgKi8KLQl1cHBlcl9kc3RyZWcgPSBkc3RyZWc7Ci0gICAgfQotICAgIAotICBpZiAoIXVwcGVyX2RzdHJlZyAmJiBkc3RyZWcpCi0gICAgYXNfd2FybiAoXygic2V0eDogaWxsZWdhbCB0ZW1wb3JhcnkgcmVnaXN0ZXIgZzAiKSk7Ci0KLSAgaWYgKG5lZWRfaGgyMl9wKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKHVwcGVyX2RzdHJlZykKLQkJCSB8ICgodXBwZXIzMiA+PiAxMCkgJiAweDNmZmZmZikpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJPyBCRkRfUkVMT0NfU1BBUkNfSEgyMiA6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLSAgICAKLSAgaWYgKG5lZWRfaGkyMl9wKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKGRzdHJlZykKLQkJCSB8ICgoKG5lZWRfeG9yMTBfcCA/IH5sb3dlcjMyIDogbG93ZXIzMikKLQkJCSAgICA+PiAxMCkgJiAweDNmZmZmZikpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJPyBCRkRfUkVMT0NfU1BBUkNfTE0yMiA6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLQotICBpZiAobmVlZF9obTEwX3ApCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKE9SX0lOU04KLQkJCSB8IChuZWVkX2hoMjJfcCA/IFJTMSAodXBwZXJfZHN0cmVnKSA6IDApCi0JCQkgfCBSRCAodXBwZXJfZHN0cmVnKQotCQkJIHwgSU1NRUQKLQkJCSB8ICh1cHBlcjMyICYgKG5lZWRfaGgyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQk/IEJGRF9SRUxPQ19TUEFSQ19ITTEwIDogQkZEX1JFTE9DX05PTkUpOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgfQotICAgIAotICBpZiAobmVlZF9sbzEwX3ApCi0gICAgewotICAgICAgLyogRklYTUU6IE9uZSBuaWNlIG9wdGltaXphdGlvbiB0byBkbyBoZXJlIGlzIHRvIE9SIHRoZSBsb3cgcGFydAotCSB3aXRoIHRoZSBoaWdocGFydCBpZiBoaTIyIGlzbid0IG5lZWRlZCBhbmQgdGhlIGxvdyBwYXJ0IGlzCi0JIHBvc2l0aXZlLiAgKi8KLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOIHwgKG5lZWRfaGkyMl9wID8gUlMxIChkc3RyZWcpIDogMCkKLQkJCSB8IFJEIChkc3RyZWcpCi0JCQkgfCBJTU1FRAotCQkJIHwgKGxvd2VyMzIgJiAobmVlZF9oaTIyX3AgPyAweDNmZiA6IDB4MWZmZikpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCT8gQkZEX1JFTE9DX0xPMTAgOiBCRkRfUkVMT0NfTk9ORSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci0gICAgCi0gIC8qIElmIHdlIG5lZWRlZCB0byBidWlsZCB0aGUgdXBwZXIgcGFydCwgc2hpZnQgaXQgaW50byBwbGFjZS4gICovCi0gIGlmIChuZWVkX2hoMjJfcCB8fCBuZWVkX2htMTBfcCkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0xMWF9JTlNOIHwgUlMxICh1cHBlcl9kc3RyZWcpIHwgUkQgKHVwcGVyX2RzdHJlZykKLQkJCSB8IElNTUVEIHwgMzIpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLSAgICAKLSAgLyogVG8gZ2V0IC0xIGluIHVwcGVyMzIsIHdlIGRvIHNldGhpICVoaSh+eCksIHI7IHhvciByLCAtMHg0MDAgfCB4LCByLiAgKi8KLSAgaWYgKG5lZWRfeG9yMTBfcCkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoWE9SX0lOU04gfCBSUzEgKGRzdHJlZykgfCBSRCAoZHN0cmVnKSB8IElNTUVECi0JCQkgfCAweDFjMDAgfCAobG93ZXIzMiAmIDB4M2ZmKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgfQotCi0gIC8qIElmIHdlIG5lZWRlZCB0byBidWlsZCBib3RoIHVwcGVyIGFuZCBsb3dlciBwYXJ0cywgT1IgdGhlbSB0b2dldGhlci4gICovCi0gIGVsc2UgaWYgKChuZWVkX2hoMjJfcCB8fCBuZWVkX2htMTBfcCkgJiYgKG5lZWRfaGkyMl9wIHx8IG5lZWRfbG8xMF9wKSkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoT1JfSU5TTiB8IFJTMSAoZHN0cmVnKSB8IFJTMiAodXBwZXJfZHN0cmVnKQotCQkJIHwgUkQgKGRzdHJlZykpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLX0KLQwKLS8qIE1haW4gZW50cnkgcG9pbnQgdG8gYXNzZW1ibGUgb25lIGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICBpbnQgc3BlY2lhbF9jYXNlOwotCi0gIGtub3cgKHN0cik7Ci0gIHNwZWNpYWxfY2FzZSA9IHNwYXJjX2lwIChzdHIsICZpbnNuKTsKLQotICAvKiBXZSB3YXJuIGFib3V0IGF0dGVtcHRzIHRvIHB1dCBhIGZsb2F0aW5nIHBvaW50IGJyYW5jaCBpbiBhIGRlbGF5IHNsb3QsCi0gICAgIHVubGVzcyB0aGUgZGVsYXkgc2xvdCBoYXMgYmVlbiBhbm51bGxlZC4gICovCi0gIGlmIChpbnNuICE9IE5VTEwKLSAgICAgICYmIGxhc3RfaW5zbiAhPSBOVUxMCi0gICAgICAmJiAoaW5zbi0+ZmxhZ3MgJiBGX0ZCUikgIT0gMAotICAgICAgJiYgKGxhc3RfaW5zbi0+ZmxhZ3MgJiBGX0RFTEFZRUQpICE9IDAKLSAgICAgIC8qID8/PyBUaGlzIHRlc3QgaXNuJ3QgY29tcGxldGVseSBhY2N1cmF0ZS4gIFdlIGFzc3VtZSBhbnl0aGluZyB3aXRoCi0JIEZfe1VOQlIsQ09OREJSLEZCUn0gc2V0IGlzIGFubnVsbGFibGUuICAqLwotICAgICAgJiYgKChsYXN0X2luc24tPmZsYWdzICYgKEZfVU5CUiB8IEZfQ09OREJSIHwgRl9GQlIpKSA9PSAwCi0JICB8fCAobGFzdF9vcGNvZGUgJiBBTk5VTCkgPT0gMCkpCi0gICAgYXNfd2FybiAoXygiRlAgYnJhbmNoIGluIGRlbGF5IHNsb3QiKSk7Ci0KLSAgLyogU1BBUkMgYmVmb3JlIHY5IHJlcXVpcmVzIGEgbm9wIGluc3RydWN0aW9uIGJldHdlZW4gYSBmbG9hdGluZwotICAgICBwb2ludCBpbnN0cnVjdGlvbiBhbmQgYSBmbG9hdGluZyBwb2ludCBicmFuY2guICBXZSBpbnNlcnQgb25lCi0gICAgIGF1dG9tYXRpY2FsbHksIHdpdGggYSB3YXJuaW5nLiAgKi8KLSAgaWYgKG1heF9hcmNoaXRlY3R1cmUgPCBTUEFSQ19PUENPREVfQVJDSF9WOQotICAgICAgJiYgaW5zbiAhPSBOVUxMCi0gICAgICAmJiBsYXN0X2luc24gIT0gTlVMTAotICAgICAgJiYgKGluc24tPmZsYWdzICYgRl9GQlIpICE9IDAKLSAgICAgICYmIChsYXN0X2luc24tPmZsYWdzICYgRl9GTE9BVCkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3BhcmNfaXQgbm9wX2luc247Ci0KLSAgICAgIG5vcF9pbnNuLm9wY29kZSA9IE5PUF9JTlNOOwotICAgICAgbm9wX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmbm9wX2luc24pOwotICAgICAgYXNfd2FybiAoXygiRlAgYnJhbmNoIHByZWNlZGVkIGJ5IEZQIGluc3RydWN0aW9uOyBOT1AgaW5zZXJ0ZWQiKSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoc3BlY2lhbF9jYXNlKQotICAgIHsKLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9OT05FOgotICAgICAgLyogbm9ybWFsIGluc24gKi8KLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9TRVRTVzoKLSAgICAgIHN5bnRoZXRpemVfc2V0c3cgKGluc24pOwotICAgICAgYnJlYWs7Ci0JICAKLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9TRVQ6Ci0gICAgICBzeW50aGV0aXplX3NldHV3IChpbnNuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTUEVDSUFMX0NBU0VfU0VUWDoKLSAgICAgIHN5bnRoZXRpemVfc2V0eCAoaW5zbik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU1BFQ0lBTF9DQVNFX0ZESVY6Ci0gICAgICB7Ci0JaW50IHJkID0gKHRoZV9pbnNuLm9wY29kZSA+PiAyNSkgJiAweDFmOwotICAgIAotCW91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIAotCS8qIEFjY29yZGluZyB0byBpbmZvcm1hdGlvbiBsZWFrZWQgZnJvbSBTdW4sIHRoZSAiZmRpdiIgaW5zdHJ1Y3Rpb25zCi0JICAgb24gZWFybHkgU1BBUkMgbWFjaGluZXMgd291bGQgcHJvZHVjZSBpbmNvcnJlY3QgcmVzdWx0cyBzb21ldGltZXMuCi0JICAgVGhlIHdvcmthcm91bmQgaXMgdG8gYWRkIGFuIGZtb3ZzIG9mIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciB0bwotCSAgIGl0c2VsZiBqdXN0IGFmdGVyIHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgd2FzIHRydWUgb24gbWFjaGluZXMKLQkgICB3aXRoIFdlaXRlayAxMTY1IGZsb2F0IGNoaXBzLCBzdWNoIGFzIHRoZSBTdW4tNC8yNjAgYW5kIC8yODAuICovCi0JYXNzZXJ0ICh0aGVfaW5zbi5yZWxvYyA9PSBCRkRfUkVMT0NfTk9ORSk7Ci0JdGhlX2luc24ub3Bjb2RlID0gRk1PVlNfSU5TTiB8IHJkIHwgUkQgKHJkKTsKLQlvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc3BlY2lhbCBjYXNlIGluc24gc2FuaXR5IGNoZWNrIikpOwotICAgIH0KLX0KLQotLyogU3Vicm91dGluZSBvZiBtZF9hc3NlbWJsZSB0byBkbyB0aGUgYWN0dWFsIHBhcnNpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1zcGFyY19pcCAoc3RyLCBwaW5zbikKLSAgICAgY2hhciAqc3RyOwotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqcGluc247Ci17Ci0gIGNoYXIgKmVycm9yX21lc3NhZ2UgPSAiIjsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICBjaGFyICphcmdzU3RhcnQ7Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0gIGludCBtYXRjaCA9IDA7Ci0gIGludCBjb21tYSA9IDA7Ci0gIGludCB2OV9hcmdfcDsKLSAgaW50IHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9OT05FOwotCi0gIHMgPSBzdHI7Ci0gIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgIHsKLSAgICAgIGRvCi0JKytzOwotICAgICAgd2hpbGUgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykgfHwgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoKnMpCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLCc6Ci0gICAgICBjb21tYSA9IDE7Ci0KLSAgICAgIC8qRkFMTFRIUk9VR0ggKi8KLQotICAgIGNhc2UgJyAnOgotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICB9Ci0gIGluc24gPSAoc3RydWN0IHNwYXJjX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cik7Ci0gICpwaW5zbiA9IGluc247Ci0gIGlmIChpbnNuID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLSAgICB9Ci0gIGlmIChjb21tYSkKLSAgICB7Ci0gICAgICAqLS1zID0gJywnOwotICAgIH0KLQotICBhcmdzU3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIG9wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICB2OV9hcmdfcCA9IDA7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlCi0gICAgICAgKiBzdXJlIHRoYXQgdGhlIG9wZXJhbmRzIG1hdGNoCi0gICAgICAgKi8KLSAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7OyArK2FyZ3MpCi0JewotCSAgc3dpdGNoICgqYXJncykKLQkgICAgewotCSAgICBjYXNlICdLJzoKLQkgICAgICB7Ci0JCWludCBrbWFzayA9IDA7Ci0KLQkJLyogUGFyc2UgYSBzZXJpZXMgb2YgbWFza3MuICAqLwotCQlpZiAoKnMgPT0gJyMnKQotCQkgIHsKLQkJICAgIHdoaWxlICgqcyA9PSAnIycpCi0JCSAgICAgIHsKLQkJCWludCBtYXNrOwotCi0JCQlpZiAoISBwYXJzZV9rZXl3b3JkX2FyZyAoc3BhcmNfZW5jb2RlX21lbWJhciwgJnMsCi0JCQkJCQkgJm1hc2spKQotCQkJICB7Ci0JCQkgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBtZW1iYXIgbWFzayBuYW1lIik7Ci0JCQkgICAgZ290byBlcnJvcjsKLQkJCSAgfQotCQkJa21hc2sgfD0gbWFzazsKLQkJCXdoaWxlICgqcyA9PSAnICcpIHsgKytzOyBjb250aW51ZTsgfQotCQkJaWYgKCpzID09ICd8JyB8fCAqcyA9PSAnKycpCi0JCQkgICsrczsKLQkJCXdoaWxlICgqcyA9PSAnICcpIHsgKytzOyBjb250aW51ZTsgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2VfY29uc3RfZXhwcl9hcmcgKCZzLCAma21hc2spKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIG1lbWJhciBtYXNrIGV4cHJlc3Npb24iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChrbWFzayA8IDAgfHwga21hc2sgPiAxMjcpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgbWVtYmFyIG1hc2sgbnVtYmVyIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCW9wY29kZSB8PSBNRU1CQVIgKGttYXNrKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGNhc2UgJyonOgotCSAgICAgIHsKLQkJaW50IGZjbiA9IDA7Ci0KLQkJLyogUGFyc2UgYSBwcmVmZXRjaCBmdW5jdGlvbi4gICovCi0JCWlmICgqcyA9PSAnIycpCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9wcmVmZXRjaCwgJnMsICZmY24pKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG5hbWUiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAoISBwYXJzZV9jb25zdF9leHByX2FyZyAoJnMsICZmY24pKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIGV4cHJlc3Npb24iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChmY24gPCAwIHx8IGZjbiA+IDMxKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlciIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQkJb3Bjb2RlIHw9IFJEIChmY24pOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgY2FzZSAnISc6Ci0JICAgIGNhc2UgJz8nOgotCSAgICAgIC8qIFBhcnNlIGEgc3BhcmM2NCBwcml2aWxlZ2VkIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoKnMgPT0gJyUnKQotCQl7Ci0JCSAgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gcHJpdl9yZWdfdGFibGU7Ci0JCSAgdW5zaWduZWQgaW50IGxlbiA9IDk5OTk5OTk7IC8qIGluaXQgdG8gbWFrZSBnY2MgaGFwcHkgKi8KLQotCQkgIHMgKz0gMTsKLQkJICB3aGlsZSAocC0+bmFtZVswXSA+IHNbMF0pCi0JCSAgICBwKys7Ci0JCSAgd2hpbGUgKHAtPm5hbWVbMF0gPT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgbGVuID0gc3RybGVuIChwLT5uYW1lKTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKHAtPm5hbWUsIHMsIGxlbikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgICBwKys7Ci0JCSAgICB9Ci0JCSAgaWYgKHAtPm5hbWVbMF0gIT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgcHJpdmlsZWdlZCByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGlmICgqYXJncyA9PSAnPycpCi0JCSAgICBvcGNvZGUgfD0gKHAtPnJlZ251bSA8PCAxNCk7Ci0JCSAgZWxzZQotCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMjUpOwotCQkgIHMgKz0gbGVuOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgcHJpdmlsZWdlZCByZWdpc3RlciIpOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICBjYXNlICdfJzoKLQkgICAgY2FzZSAnLyc6Ci0JICAgICAgLyogUGFyc2UgYSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoKnMgPT0gJyUnKQotCQl7Ci0JCSAgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gdjlhX2Fzcl90YWJsZTsKLQkJICB1bnNpZ25lZCBpbnQgbGVuID0gOTk5OTk5OTsgLyogaW5pdCB0byBtYWtlIGdjYyBoYXBweSAqLwotCi0JCSAgcyArPSAxOwotCQkgIHdoaWxlIChwLT5uYW1lWzBdID4gc1swXSkKLQkJICAgIHArKzsKLQkJICB3aGlsZSAocC0+bmFtZVswXSA9PSBzWzBdKQotCQkgICAgewotCQkgICAgICBsZW4gPSBzdHJsZW4gKHAtPm5hbWUpOwotCQkgICAgICBpZiAoc3RybmNtcCAocC0+bmFtZSwgcywgbGVuKSA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICAgIHArKzsKLQkJICAgIH0KLQkJICBpZiAocC0+bmFtZVswXSAhPSBzWzBdKQotCQkgICAgewotCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaWYgKCphcmdzID09ICcvJyAmJiAocC0+cmVnbnVtID09IDIwIHx8IHAtPnJlZ251bSA9PSAyMSkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHJkIG9uIHdyaXRlIG9ubHkgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9CQkgICAgICAKLQkJICBpZiAoKmFyZ3MgPT0gJy8nKQotCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMTQpOwotCQkgIGVsc2UKLQkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDI1KTsKLQkJICBzICs9IGxlbjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHY5YSBhbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIiKTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgY2FzZSAnTSc6Ci0JICAgIGNhc2UgJ20nOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWFzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0KLQkJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgIHsKLQkJICAgICAgbG9uZyBudW0gPSAwOwotCi0JCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkJewotCQkJICBudW0gPSBudW0gKiAxMCArICpzIC0gJzAnOwotCQkJICArK3M7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCQkJewotCQkJICBpZiAobnVtIDwgMTYgfHwgMzEgPCBudW0pCi0JCQkgICAgewotCQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogYXNyIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMTYgYW5kIDMxIik7Ci0JCQkgICAgICBnb3RvIGVycm9yOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAobnVtIDwgMCB8fCAzMSA8IG51bSkKLQkJCSAgICB7Ci0JCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBhc3IgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMSIpOwotCQkJICAgICAgZ290byBlcnJvcjsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgb3Bjb2RlIHw9ICgqYXJncyA9PSAnTScgPyBSUzEgKG51bSkgOiBSRCAobnVtKSk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogZXhwZWN0aW5nICVhc3JOIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCX0gLyogaWYgJWFzciAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDXzExOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2onOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDXzEwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ1gnOgotCSAgICAgIC8qIFY4IHN5c3RlbXMgZG9uJ3QgdW5kZXJzdGFuZCBCRkRfUkVMT0NfU1BBUkNfNS4gICovCi0JICAgICAgaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQl0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ181OwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMxMzsKLQkgICAgICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVuc2lnbmVkLCBidXQgZm9yIHVwd2FyZCBjb21wYXRpYmlsaXR5LAotCQkgYWxsb3cgbmVnYXRpdmUgdmFsdWVzIGFzIHdlbGwuICAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ1knOgotCSAgICAgIC8qIFY4IHN5c3RlbXMgZG9uJ3QgdW5kZXJzdGFuZCBCRkRfUkVMT0NfU1BBUkNfNi4gICovCi0JICAgICAgaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQl0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ182OwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMxMzsKLQkgICAgICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVuc2lnbmVkLCBidXQgZm9yIHVwd2FyZCBjb21wYXRpYmlsaXR5LAotCQkgYWxsb3cgbmVnYXRpdmUgdmFsdWVzIGFzIHdlbGwuICAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2snOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gLyogUkVMT0NfV0RJU1AyXzE0ICovIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2OwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdHJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5OwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdOJzoKLQkgICAgICBpZiAoKnMgPT0gJ3AnICYmIHNbMV0gPT0gJ24nKQotCQl7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVCc6Ci0JICAgICAgaWYgKCpzID09ICdwJyAmJiBzWzFdID09ICd0JykKLQkJewotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3onOgotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCXsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVpY2MiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWic6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXhjYyIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc2JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMCIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc3JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMSIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc4JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMiIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc5JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMyIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdQJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVwYyIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdXJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV0aWNrIiwgNSkgPT0gMCkKLQkJewotCQkgIHMgKz0gNTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXsKLQkJICBtYXRjaCA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcrJzoKLQkgICAgICBpZiAoKnMgPT0gJysnKQotCQl7Ci0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKCpzID09ICctJykKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWyc6CQkvKiB0aGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KLQkgICAgY2FzZSAnXSc6Ci0JICAgIGNhc2UgJywnOgotCSAgICBjYXNlICcgJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnIyc6CQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCAqLwotCSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMrKykpCi0JCXsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgIHsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnQyc6CQkvKiBjb3Byb2Nlc3NvciBzdGF0ZSByZWdpc3RlciAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWNzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdiJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ2MnOgotCSAgICBjYXNlICdEJzoKLQkgICAgICBpZiAoKnMrKyA9PSAnJScgJiYgKnMrKyA9PSAnYycgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJewotCQkgIG1hc2sgPSAqcysrOwotCQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMTAgKiAobWFzayAtICcwJykgKyAoKnMrKyAtICcwJyk7Ci0JCSAgICAgIGlmIChtYXNrID49IDMyKQotCQkJewotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgLT0gJzAnOwotCQkgICAgfQotCQkgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICB7Ci0KLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxNDsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzazsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ0QnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAyNTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdyJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgIGNhc2UgJzEnOgotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgaWYgKCpzKysgPT0gJyUnKQotCQl7Ci0JCSAgc3dpdGNoIChjID0gKnMrKykKLQkJICAgIHsKLQotCQkgICAgY2FzZSAnZic6CS8qIGZyYW1lIHBvaW50ZXIgKi8KLQkJICAgICAgaWYgKCpzKysgPT0gJ3AnKQotCQkJewotCQkJICBtYXNrID0gMHgxZTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ2cnOgkvKiBnbG9iYWwgcmVnaXN0ZXIgKi8KLQkJICAgICAgYyA9ICpzKys7Ci0JCSAgICAgIGlmIChpc29jdGFsIChjKSkKLQkJCXsKLQkJCSAgbWFzayA9IGMgLSAnMCc7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdpJzoJLyogaW4gcmVnaXN0ZXIgKi8KLQkJICAgICAgYyA9ICpzKys7Ci0JCSAgICAgIGlmIChpc29jdGFsIChjKSkKLQkJCXsKLQkJCSAgbWFzayA9IGMgLSAnMCcgKyAyNDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ2wnOgkvKiBsb2NhbCByZWdpc3RlciAqLwotCQkgICAgICBjID0gKnMrKzsKLQkJICAgICAgaWYgKGlzb2N0YWwgKGMpKQotCQkJewotCQkJICBtYXNrID0gKGMgLSAnMCcgKyAxNik7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdvJzoJLyogb3V0IHJlZ2lzdGVyICovCi0JCSAgICAgIGMgPSAqcysrOwotCQkgICAgICBpZiAoaXNvY3RhbCAoYykpCi0JCQl7Ci0JCQkgIG1hc2sgPSAoYyAtICcwJyArIDgpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAncyc6CS8qIHN0YWNrIHBvaW50ZXIgKi8KLQkJICAgICAgaWYgKCpzKysgPT0gJ3AnKQotCQkJewotCQkJICBtYXNrID0gMHhlOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAncic6CS8qIGFueSByZWdpc3RlciAqLwotCQkgICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAoYyA9ICpzKyspKSkKLQkJCXsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLQkJICAgIGNhc2UgJzAnOgotCQkgICAgY2FzZSAnMSc6Ci0JCSAgICBjYXNlICcyJzoKLQkJICAgIGNhc2UgJzMnOgotCQkgICAgY2FzZSAnNCc6Ci0JCSAgICBjYXNlICc1JzoKLQkJICAgIGNhc2UgJzYnOgotCQkgICAgY2FzZSAnNyc6Ci0JCSAgICBjYXNlICc4JzoKLQkJICAgIGNhc2UgJzknOgotCQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJCXsKLQkJCSAgaWYgKChjID0gMTAgKiAoYyAtICcwJykgKyAoKnMrKyAtICcwJykpID49IDMyKQotCQkJICAgIHsKLQkJCSAgICAgIGdvdG8gZXJyb3I7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGMgLT0gJzAnOwotCQkJfQotCQkgICAgICBtYXNrID0gYzsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0KLQkJICBpZiAoKG1hc2sgJiB+MSkgPT0gMiAmJiBzcGFyY19hcmNoX3NpemUgPT0gNjQKLQkJICAgICAgJiYgbm9fdW5kZWNsYXJlZF9yZWdzICYmICEgZ2xvYmFscyBbbWFza10pCi0JCSAgICBhc19iYWQgKF8oImRldGVjdGVkIGdsb2JhbCByZWdpc3RlciB1c2Ugbm90ICIKLQkJCSAgICAgICJjb3ZlcmVkIGJ5IC5yZWdpc3RlciBwc2V1ZG8tb3AiKSk7Ci0KLQkJICAvKiBHb3QgdGhlIHJlZ2lzdGVyLCBub3cgZmlndXJlIG91dCB3aGVyZQotCQkgICAgIGl0IGdvZXMgaW4gdGhlIG9wY29kZS4gICovCi0JCSAgc3dpdGNoICgqYXJncykKLQkJICAgIHsKLQkJICAgIGNhc2UgJzEnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxNDsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJzInOgotCQkgICAgICBvcGNvZGUgfD0gbWFzazsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAyNTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ3InOgotCQkgICAgICBvcGNvZGUgfD0gKG1hc2sgPDwgMjUpIHwgKG1hc2sgPDwgMTQpOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnTyc6Ci0JCSAgICAgIG9wY29kZSB8PSAobWFzayA8PCAyNSkgfCAobWFzayA8PCAwKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdlJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ3YnOgotCSAgICBjYXNlICdWJzoKLQotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnQic6Ci0JICAgIGNhc2UgJ1InOgotCi0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdIJzoKLQkgICAgY2FzZSAnSic6Ci0JICAgICAgewotCQljaGFyIGZvcm1hdDsKLQotCQlpZiAoKnMrKyA9PSAnJScKLQkJICAgICYmICgoZm9ybWF0ID0gKnMpID09ICdmJykKLQkJICAgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKytzKSkKLQkJICB7Ci0JCSAgICBmb3IgKG1hc2sgPSAwOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpOyArK3MpCi0JCSAgICAgIHsKLQkJCW1hc2sgPSAxMCAqIG1hc2sgKyAoKnMgLSAnMCcpOwotCQkgICAgICB9CQkvKiByZWFkIHRoZSBudW1iZXIgKi8KLQotCQkgICAgaWYgKCgqYXJncyA9PSAndicKLQkJCSB8fCAqYXJncyA9PSAnQicKLQkJCSB8fCAqYXJncyA9PSAnSCcpCi0JCQkmJiAobWFzayAmIDEpKQotCQkgICAgICB7Ci0JCQlicmVhazsKLQkJICAgICAgfQkJLyogcmVnaXN0ZXIgbXVzdCBiZSBldmVuIG51bWJlcmVkICovCi0KLQkJICAgIGlmICgoKmFyZ3MgPT0gJ1YnCi0JCQkgfHwgKmFyZ3MgPT0gJ1InCi0JCQkgfHwgKmFyZ3MgPT0gJ0onKQotCQkJJiYgKG1hc2sgJiAzKSkKLQkJICAgICAgewotCQkJYnJlYWs7Ci0JCSAgICAgIH0JCS8qIHJlZ2lzdGVyIG11c3QgYmUgbXVsdGlwbGUgb2YgNCAqLwotCi0JCSAgICBpZiAobWFzayA+PSA2NCkKLQkJICAgICAgewotCQkJaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSA2NCBmIHJlZ2lzdGVyczsgWzAtNjNdIik7Ci0JCQllbHNlCi0JCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFRoZXJlIGFyZSBvbmx5IDMyIGYgcmVnaXN0ZXJzOyBbMC0zMV0iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0JLyogb24gZXJyb3IgKi8KLQkJICAgIGVsc2UgaWYgKG1hc2sgPj0gMzIpCi0JCSAgICAgIHsKLQkJCWlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJCSAgewotCQkJICAgIHY5X2FyZ19wID0gMTsKLQkJCSAgICBtYXNrIC09IDMxOwkvKiB3cmFwIGhpZ2ggYml0ICovCi0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFRoZXJlIGFyZSBvbmx5IDMyIGYgcmVnaXN0ZXJzOyBbMC0zMV0iKTsKLQkJCSAgICBnb3RvIGVycm9yOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBicmVhazsKLQkJICB9CS8qIGlmIG5vdCBhbiAnZicgcmVnaXN0ZXIuICovCi0KLQkJc3dpdGNoICgqYXJncykKLQkJICB7Ci0JCSAgY2FzZSAndic6Ci0JCSAgY2FzZSAnVic6Ci0JCSAgY2FzZSAnZSc6Ci0JCSAgICBvcGNvZGUgfD0gUlMxIChtYXNrKTsKLQkJICAgIGNvbnRpbnVlOwotCi0KLQkJICBjYXNlICdmJzoKLQkJICBjYXNlICdCJzoKLQkJICBjYXNlICdSJzoKLQkJICAgIG9wY29kZSB8PSBSUzIgKG1hc2spOwotCQkgICAgY29udGludWU7Ci0KLQkJICBjYXNlICdnJzoKLQkJICBjYXNlICdIJzoKLQkJICBjYXNlICdKJzoKLQkJICAgIG9wY29kZSB8PSBSRCAobWFzayk7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9CQkvKiBwYWNrIGl0IGluLiAqLwotCi0JCWtub3cgKDApOwotCQlicmVhazsKLQkgICAgICB9CQkJLyogZmxvYXQgYXJnICovCi0KLQkgICAgY2FzZSAnRic6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnNyIiwgNCkgPT0gMCkKLQkJewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzAnOgkJLyogNjQgYml0IGltbWVkaWF0ZSAoc2V0LCBzZXRzdywgc2V0eCBpbnNuKSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7IC8qIHJlbG9jIGhhbmRsZWQgZWxzZXdoZXJlICovCi0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnbCc6CQkvKiAyMiBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMjsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnTCc6CQkvKiAzMCBiaXQgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfMzJfUENSRUxfUzI7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2gnOgotCSAgICBjYXNlICduJzoJCS8qIDIyIGJpdCBpbW1lZGlhdGUgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQzIyOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2knOgkJLyogMTMgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7Ci0KLQkgICAgICAvKiBmYWxsdGhyb3VnaCAqLwotCi0JICAgIGltbWVkaWF0ZToKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQlzKys7Ci0KLQkgICAgICB7Ci0JCWNoYXIgKnMxOwotCQljaGFyICpvcF9hcmcgPSBOVUxMOwotCQlleHByZXNzaW9uUyBvcF9leHA7Ci0JCWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBvbGRfcmVsb2MgPSB0aGVfaW5zbi5yZWxvYzsKLQotCQkvKiBDaGVjayBmb3IgJWhpLCBldGMuICAqLwotCQlpZiAoKnMgPT0gJyUnKQotCQkgIHsKLQkJICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BzIHsKLQkJICAgICAgLyogVGhlIG5hbWUgYXMgaXQgYXBwZWFycyBpbiBhc3NlbWJsZXIuICAqLwotCQkgICAgICBjaGFyICpuYW1lOwotCQkgICAgICAvKiBzdHJsZW4gKG5hbWUpLCBwcmVjb21wdXRlZCBmb3Igc3BlZWQgKi8KLQkJICAgICAgaW50IGxlbjsKLQkJICAgICAgLyogVGhlIHJlbG9jIHRoaXMgcHNldWRvLW9wIHRyYW5zbGF0ZXMgdG8uICAqLwotCQkgICAgICBpbnQgcmVsb2M7Ci0JCSAgICAgIC8qIE5vbi16ZXJvIGlmIGZvciB2OSBvbmx5LiAgKi8KLQkJICAgICAgaW50IHY5X3A7Ci0JCSAgICAgIC8qIE5vbi16ZXJvIGlmIGNhbiBiZSB1c2VkIGluIHBjLXJlbGF0aXZlIGNvbnRleHRzLiAgKi8KLQkJICAgICAgaW50IHBjcmVsX3A7LypGSVhNRTp3aXAqLwotCQkgICAgfSBvcHNbXSA9IHsKLQkJICAgICAgLyogaGl4L2xveCBtdXN0IGFwcGVhciBiZWZvcmUgaGkvbG8gc28gJWhpeCB3b24ndCBiZQotCQkJIG1pc3Rha2VuIGZvciAlaGkuICAqLwotCQkgICAgICB7ICJoaXgiLCAzLCBCRkRfUkVMT0NfU1BBUkNfSElYMjIsIDEsIDAgfSwKLQkJICAgICAgeyAibG94IiwgMywgQkZEX1JFTE9DX1NQQVJDX0xPWDEwLCAxLCAwIH0sCi0JCSAgICAgIHsgImhpIiwgMiwgQkZEX1JFTE9DX0hJMjIsIDAsIDEgfSwKLQkJICAgICAgeyAibG8iLCAyLCBCRkRfUkVMT0NfTE8xMCwgMCwgMSB9LAotCQkgICAgICB7ICJoaCIsIDIsIEJGRF9SRUxPQ19TUEFSQ19ISDIyLCAxLCAxIH0sCi0JCSAgICAgIHsgImhtIiwgMiwgQkZEX1JFTE9DX1NQQVJDX0hNMTAsIDEsIDEgfSwKLQkJICAgICAgeyAibG0iLCAyLCBCRkRfUkVMT0NfU1BBUkNfTE0yMiwgMSwgMSB9LAotCQkgICAgICB7ICJoNDQiLCAzLCBCRkRfUkVMT0NfU1BBUkNfSDQ0LCAxLCAwIH0sCi0JCSAgICAgIHsgIm00NCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19NNDQsIDEsIDAgfSwKLQkJICAgICAgeyAibDQ0IiwgMywgQkZEX1JFTE9DX1NQQVJDX0w0NCwgMSwgMCB9LAotCQkgICAgICB7ICJ1aGkiLCAzLCBCRkRfUkVMT0NfU1BBUkNfSEgyMiwgMSwgMCB9LAotCQkgICAgICB7ICJ1bG8iLCAzLCBCRkRfUkVMT0NfU1BBUkNfSE0xMCwgMSwgMCB9LAotCQkgICAgICB7IE5VTEwgfQotCQkgICAgfTsKLQkJICAgIGNvbnN0IHN0cnVjdCBvcHMgKm87Ci0gIAotCQkgICAgZm9yIChvID0gb3BzOyBvLT5uYW1lOyBvKyspCi0JCSAgICAgIGlmIChzdHJuY21wIChzICsgMSwgby0+bmFtZSwgby0+bGVuKSA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICBpZiAoby0+bmFtZSA9PSBOVUxMKQotCQkgICAgICBicmVhazsKLQkJICAgICAgCi0JCSAgICBpZiAoc1tvLT5sZW4gKyAxXSAhPSAnKCcpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kczogJSUlcyByZXF1aXJlcyBhcmd1bWVudHMgaW4gKCkiKSwgby0+bmFtZSk7Ci0JCQlyZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkgICAgICB9Ci0KLQkJICAgIG9wX2FyZyA9IG8tPm5hbWU7Ci0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IG8tPnJlbG9jOwotCQkgICAgcyArPSBvLT5sZW4gKyAyOwotCQkgICAgdjlfYXJnX3AgPSBvLT52OV9wOwotCQkgIH0KLQotCQkvKiBOb3RlIHRoYXQgaWYgdGhlIGdldF9leHByZXNzaW9uKCkgZmFpbHMsIHdlIHdpbGwgc3RpbGwKLQkJICAgaGF2ZSBjcmVhdGVkIFUgZW50cmllcyBpbiB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUKLQkJICAgJ3N5bWJvbHMnIGluIHRoZSBpbnB1dCBzdHJpbmcuICBUcnkgbm90IHRvIGNyZWF0ZSBVCi0JCSAgIHN5bWJvbHMgZm9yIHJlZ2lzdGVycywgZXRjLiAgKi8KLQotCQkvKiBUaGlzIHN0dWZmIGNoZWNrcyB0byBzZWUgaWYgdGhlIGV4cHJlc3Npb24gZW5kcyBpbgotCQkgICArJXJlZy4gIElmIGl0IGRvZXMsIGl0IHJlbW92ZXMgdGhlIHJlZ2lzdGVyIGZyb20KLQkJICAgdGhlIGV4cHJlc3Npb24sIGFuZCByZS1zZXRzICdzJyB0byBwb2ludCB0byB0aGUKLQkJICAgcmlnaHQgcGxhY2UuICAqLwotCi0JCWlmIChvcF9hcmcpCi0JCSAgewotCQkgICAgaW50IG5wYXIgPSAwOwotCi0JCSAgICBmb3IgKHMxID0gczsgKnMxICYmICpzMSAhPSAnLCcgJiYgKnMxICE9ICddJzsgczErKykKLQkJICAgICAgaWYgKCpzMSA9PSAnKCcpCi0JCQlucGFyKys7Ci0JCSAgICAgIGVsc2UgaWYgKCpzMSA9PSAnKScpCi0JCQl7Ci0JCQkgIGlmICghbnBhcikKLQkJCSAgICBicmVhazsKLQkJCSAgbnBhci0tOwotCQkJfQotCi0JCSAgICBpZiAoKnMxICE9ICcpJykKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzOiAlJSVzIHJlcXVpcmVzIGFyZ3VtZW50cyBpbiAoKSIpLCBvcF9hcmcpOwotCQkJcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICAqczEgPSAnXDAnOwotCQkgICAgKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJICAgICpzMSA9ICcpJzsKLQkJICAgIHMgPSBzMSArIDE7Ci0JCSAgICBpZiAoKnMgPT0gJywnIHx8ICpzID09ICddJyB8fCAhKnMpCi0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgaWYgKCpzICE9ICcrJyAmJiAqcyAhPSAnLScpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kczogQ2FuJ3QgZG8gYXJpdGhtZXRpY3Mgb3RoZXIgdGhhbiArIGFuZCAtIGludm9sdmluZyAlJSVzKCkiKSwgb3BfYXJnKTsKLQkJCXJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JCSAgICAgIH0KLQkJICAgICpzMSA9ICcwJzsKLQkJICAgIHMgPSBzMTsKLQkJICAgIG9wX2V4cCA9IHRoZV9pbnNuLmV4cDsKLQkJICAgIG1lbXNldCAoJnRoZV9pbnNuLmV4cCwgMCwgc2l6ZW9mKHRoZV9pbnNuLmV4cCkpOwotCQkgIH0KLQotCQlmb3IgKHMxID0gczsgKnMxICYmICpzMSAhPSAnLCcgJiYgKnMxICE9ICddJzsgczErKykgOwotCi0JCWlmIChzMSAhPSBzICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzMVstMV0pKQotCQkgIHsKLQkJICAgIGlmIChzMVstMl0gPT0gJyUnICYmIHMxWy0zXSA9PSAnKycpCi0JCSAgICAgIHMxIC09IDM7Ci0JCSAgICBlbHNlIGlmIChzdHJjaHIgKCJnb2xpMDEyMzQ1Njc4OSIsIHMxWy0yXSkgJiYgczFbLTNdID09ICclJyAmJiBzMVstNF0gPT0gJysnKQotCQkgICAgICBzMSAtPSA0OwotCQkgICAgZWxzZQotCQkgICAgICBzMSA9IE5VTEw7Ci0JCSAgICBpZiAoczEpCi0JCSAgICAgIHsKLQkJCSpzMSA9ICdcMCc7Ci0JCQlpZiAob3BfYXJnICYmIHMxID09IHMgKyAxKQotCQkJICB0aGVfaW5zbi5leHAuWF9vcCA9IE9fYWJzZW50OwotCQkJZWxzZQotCQkJICAodm9pZCkgZ2V0X2V4cHJlc3Npb24gKHMpOwotCQkJKnMxID0gJysnOwotCQkJaWYgKG9wX2FyZykKLQkJCSAgKnMgPSAnKSc7Ci0JCQlzID0gczE7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICBzMSA9IE5VTEw7Ci0KLQkJaWYgKCFzMSkKLQkJICB7Ci0JCSAgICAodm9pZCkgZ2V0X2V4cHJlc3Npb24gKHMpOwotCQkgICAgaWYgKG9wX2FyZykKLQkJICAgICAgKnMgPSAnKSc7Ci0JCSAgICBzID0gZXhwcl9lbmQ7Ci0JCSAgfQotCi0JCWlmIChvcF9hcmcpCi0JCSAgewotCQkgICAgdGhlX2luc24uZXhwMiA9IHRoZV9pbnNuLmV4cDsKLQkJICAgIHRoZV9pbnNuLmV4cCA9IG9wX2V4cDsKLQkJICAgIGlmICh0aGVfaW5zbi5leHAyLlhfb3AgPT0gT19hYnNlbnQpCi0JCSAgICAgIHRoZV9pbnNuLmV4cDIuWF9vcCA9IE9faWxsZWdhbDsKLQkJICAgIGVsc2UgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fYWJzZW50KQotCQkgICAgICB7Ci0JCQl0aGVfaW5zbi5leHAgPSB0aGVfaW5zbi5leHAyOwotCQkJdGhlX2luc24uZXhwMi5YX29wID0gT19pbGxlZ2FsOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgICB7Ci0JCQl2YWx1ZVQgdmFsID0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKLQkJCXN3aXRjaCAodGhlX2luc24ucmVsb2MpCi0JCQkgIHsKLQkJCSAgZGVmYXVsdDoKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISDIyOgotCQkJICAgIHZhbCA9IEJTUiAodmFsLCAzMik7Ci0JCQkgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MTTIyOgotCQkJICBjYXNlIEJGRF9SRUxPQ19ISTIyOgotCQkJICAgIHZhbCA9ICh2YWwgPj4gMTApICYgMHgzZmZmZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSE0xMDoKLQkJCSAgICB2YWwgPSBCU1IgKHZhbCwgMzIpOwotCQkJICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfTE8xMDoKLQkJCSAgICB2YWwgJj0gMHgzZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSDQ0OgotCQkJICAgIHZhbCA+Pj0gMjI7Ci0JCQkgICAgdmFsICY9IDB4M2ZmZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX000NDoKLQkJCSAgICB2YWwgPj49IDEyOwotCQkJICAgIHZhbCAmPSAweDNmZjsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MNDQ6Ci0JCQkgICAgdmFsICY9IDB4ZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hJWDIyOgotCQkJICAgIHZhbCA9IH4gdmFsOwotCQkJICAgIHZhbCA9ICh2YWwgPj4gMTApICYgMHgzZmZmZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE9YMTA6Ci0JCQkgICAgdmFsID0gKHZhbCAmIDB4M2ZmKSB8IDB4MWMwMDsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkJdGhlX2luc24uZXhwID0gdGhlX2luc24uZXhwMjsKLQkJCXRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgKz0gdmFsOwotCQkJdGhlX2luc24uZXhwMi5YX29wID0gT19pbGxlZ2FsOwotCQkJdGhlX2luc24ucmVsb2MgPSBvbGRfcmVsb2M7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHRoZV9pbnNuLmV4cDIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6IENhbid0IGFkZCBub24tY29uc3RhbnQgZXhwcmVzc2lvbiB0byAlJSVzKCkiKSwgb3BfYXJnKTsKLQkJCXJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaWYgKG9sZF9yZWxvYyAhPSBCRkRfUkVMT0NfU1BBUkMxMwotCQkJICAgIHx8IHRoZV9pbnNuLnJlbG9jICE9IEJGRF9SRUxPQ19MTzEwCi0JCQkgICAgfHwgc3BhcmNfYXJjaF9zaXplICE9IDY0Ci0JCQkgICAgfHwgc3BhcmNfcGljX2NvZGUpCi0JCQkgIHsKLQkJCSAgICBhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6IENhbid0IGRvIGFyaXRobWV0aWNzIGludm9sdmluZyAlJSVzKCkgb2YgYSByZWxvY2F0YWJsZSBzeW1ib2wiKSwgb3BfYXJnKTsKLQkJCSAgICByZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkJICB9Ci0JCQl0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ19PTE8xMDsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgLyogQ2hlY2sgZm9yIGNvbnN0YW50cyB0aGF0IGRvbid0IHJlcXVpcmUgZW1pdHRpbmcgYSByZWxvYy4gICovCi0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkJICAmJiB0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IDAKLQkJICAmJiB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gMCkKLQkJewotCQkgIC8qIEZvciBwYy1yZWxhdGl2ZSBjYWxsIGluc3RydWN0aW9ucywgd2UgcmVqZWN0Ci0JCSAgICAgY29uc3RhbnRzIHRvIGdldCBiZXR0ZXIgY29kZS4gICovCi0JCSAgaWYgKHRoZV9pbnNuLnBjcmVsCi0JCSAgICAgICYmIHRoZV9pbnNuLnJlbG9jID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotCQkgICAgICAmJiBpbl9zaWduZWRfcmFuZ2UgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIsIDB4M2ZmZikpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFBDLXJlbGF0aXZlIG9wZXJhbmQgY2FuJ3QgYmUgYSBjb25zdGFudCIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCi0JCSAgLyogQ29uc3RhbnRzIHRoYXQgd29uJ3QgZml0IGFyZSBjaGVja2VkIGluIG1kX2FwcGx5X2ZpeDMKLQkJICAgICBhbmQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4KLQkJICAgICA/Pz8gSXQgd291bGQgYmUgcHJlZmVyYWJsZSB0byBpbnN0YWxsIHRoZSBjb25zdGFudHMKLQkJICAgICBpbnRvIHRoZSBpbnNuIGhlcmUgYW5kIHNhdmUgaGF2aW5nIHRvIGNyZWF0ZSBhIGZpeFMKLQkJICAgICBmb3IgZWFjaCBvbmUuICBUaGVyZSBhbHJlYWR5IGV4aXN0cyBjb2RlIHRvIGhhbmRsZQotCQkgICAgIGFsbCB0aGUgdmFyaW91cyBjYXNlcyAoZS5nLiBpbiBtZF9hcHBseV9maXgzIGFuZAotCQkgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pIHNvIGR1cGxpY2F0aW5nIGFsbCB0aGF0IGNvZGUKLQkJICAgICBoZXJlIGlzbid0IHJpZ2h0LiAgKi8KLQkJfQotCi0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgaWYgKCpzKysgPT0gJ2EnKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IEFOTlVMOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgewotCQlpbnQgYXNpID0gMDsKLQotCQkvKiBQYXJzZSBhbiBhc2kuICAqLwotCQlpZiAoKnMgPT0gJyMnKQotCQkgIHsKLQkJICAgIGlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfYXNpLCAmcywgJmFzaSkpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgQVNJIG5hbWUiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAoISBwYXJzZV9jb25zdF9leHByX2FyZyAoJnMsICZhc2kpKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIEFTSSBleHByZXNzaW9uIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgICBpZiAoYXNpIDwgMCB8fCBhc2kgPiAyNTUpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgQVNJIG51bWJlciIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQkJb3Bjb2RlIHw9IEFTSSAoYXNpKTsKLQkJY29udGludWU7Ci0JICAgICAgfQkJCS8qIGFsdGVybmF0ZSBzcGFjZSAqLwotCi0JICAgIGNhc2UgJ3AnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXBzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdxJzoJCS8qIGZsb2F0aW5nIHBvaW50IHF1ZXVlICovCi0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnEiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUSc6CQkvKiBjb3Byb2Nlc3NvciBxdWV1ZSAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWNxIiwgMykgPT0gMCkKLQkJewotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIGlmIChzdHJjbXAgKHN0ciwgInNldCIpID09IDAKLQkJICB8fCBzdHJjbXAgKHN0ciwgInNldHV3IikgPT0gMCkKLQkJewotCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9TRVQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgInNldHN3IikgPT0gMCkKLQkJewotCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9TRVRTVzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAic2V0eCIpID09IDApCi0JCXsKLQkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfU0VUWDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHN0ciwgImZkaXYiLCA0KSA9PSAwKQotCQl7Ci0JCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX0ZESVY7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdvJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVhc2kiLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAncyc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnBycyIsIDUpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNTsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdFJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVjY3IiLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAndCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIldGJyIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3cnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXdpbSIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd4JzoKLQkgICAgICB7Ci0JCWNoYXIgKnB1c2ggPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCWV4cHJlc3Npb25TIGU7Ci0KLQkJaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQkJZXhwcmVzc2lvbiAoJmUpOwotCQlpZiAoZS5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgewotCQkgICAgaW50IG4gPSBlLlhfYWRkX251bWJlcjsKLQkJICAgIGlmIChuICE9IGUuWF9hZGRfbnVtYmVyIHx8IChuICYgfjB4MWZmKSAhPSAwKQotCQkgICAgICBhc19iYWQgKF8oIk9QRiBpbW1lZGlhdGUgb3BlcmFuZCBvdXQgb2YgcmFuZ2UgKDAtMHgxZmYpIikpOwotCQkgICAgZWxzZQotCQkgICAgICBvcGNvZGUgfD0gZS5YX2FkZF9udW1iZXIgPDwgNTsKLQkJICB9Ci0JCWVsc2UKLQkJICBhc19iYWQgKF8oIm5vbi1pbW1lZGlhdGUgT1BGIG9wZXJhbmQsIGlnbm9yZWQiKSk7Ci0JCXMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCWlucHV0X2xpbmVfcG9pbnRlciA9IHB1c2g7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICBjYXNlICd5JzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV5IiwgMikgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSAyOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3UnOgotCSAgICBjYXNlICdVJzoKLQkgICAgICB7Ci0JCS8qIFBhcnNlIGEgc3BhcmNsZXQgY3ByZWcuICAqLwotCQlpbnQgY3ByZWc7Ci0JCWlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcsICZzLCAmY3ByZWcpKQotCQkgIHsKLQkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgY3ByZWcgbmFtZSIpOwotCQkgICAgZ290byBlcnJvcjsKLQkJICB9Ci0JCW9wY29kZSB8PSAoKmFyZ3MgPT0gJ1UnID8gUlMxIChjcHJlZykgOiBSRCAoY3ByZWcpKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCSAgICB9CQkJLyogc3dpdGNoIG9uIGFyZyBjb2RlICovCi0KLQkgIC8qIEJyZWFrIG91dCBvZiBmb3IoKSBsb29wLiAgKi8KLQkgIGJyZWFrOwotCX0JCQkvKiBmb3IgZWFjaCBhcmcgdGhhdCB3ZSBleHBlY3QgKi8KLQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0JewotCSAgLyogQXJncyBkb24ndCBtYXRjaC4gKi8KLQkgIGlmICgmaW5zblsxXSAtIHNwYXJjX29wY29kZXMgPCBzcGFyY19udW1fb3Bjb2RlcwotCSAgICAgICYmIChpbnNuLT5uYW1lID09IGluc25bMV0ubmFtZQotCQkgIHx8ICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIHMgPSBhcmdzU3RhcnQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kcyVzIiksIGVycm9yX21lc3NhZ2UpOwotCSAgICAgIHJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgaGF2ZSBhIG1hdGNoLiAgTm93IHNlZSBpZiB0aGUgYXJjaGl0ZWN0dXJlIGlzIG9rLiAgKi8KLQkgIGludCBuZWVkZWRfYXJjaF9tYXNrID0gaW5zbi0+YXJjaGl0ZWN0dXJlOwotCi0JICBpZiAodjlfYXJnX3ApCi0JICAgIHsKLQkgICAgICBuZWVkZWRfYXJjaF9tYXNrICY9IH4gKCgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCQkJCSAgICAgfCAoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOUEpKTsKLQkgICAgICBuZWVkZWRfYXJjaF9tYXNrIHw9ICgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5KTsKLQkgICAgfQotCi0JICBpZiAobmVlZGVkX2FyY2hfbWFzayAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkgICAgOyAvKiBvayAqLwotCSAgLyogQ2FuIHdlIGJ1bXAgdXAgdGhlIGFyY2hpdGVjdHVyZT8gICovCi0JICBlbHNlIGlmIChuZWVkZWRfYXJjaF9tYXNrICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAobWF4X2FyY2hpdGVjdHVyZSkpCi0JICAgIHsKLQkgICAgICBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBuZWVkZWRfYXJjaGl0ZWN0dXJlID0KLQkJc3BhcmNfZmZzIChTUEFSQ19PUENPREVfU1VQUE9SVEVEIChtYXhfYXJjaGl0ZWN0dXJlKQotCQkJICAgJiBuZWVkZWRfYXJjaF9tYXNrKTsKLQotCSAgICAgIGFzc2VydCAobmVlZGVkX2FyY2hpdGVjdHVyZSA8PSBTUEFSQ19PUENPREVfQVJDSF9NQVgpOwotCSAgICAgIGlmICh3YXJuX29uX2J1bXAKLQkJICAmJiBuZWVkZWRfYXJjaGl0ZWN0dXJlID4gd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUpCi0JCXsKLQkJICBhc193YXJuIChfKCJhcmNoaXRlY3R1cmUgYnVtcGVkIGZyb20gXCIlc1wiIHRvIFwiJXNcIiBvbiBcIiVzXCIiKSwKLQkJCSAgIHNwYXJjX29wY29kZV9hcmNoc1tjdXJyZW50X2FyY2hpdGVjdHVyZV0ubmFtZSwKLQkJCSAgIHNwYXJjX29wY29kZV9hcmNoc1tuZWVkZWRfYXJjaGl0ZWN0dXJlXS5uYW1lLAotCQkJICAgc3RyKTsKLQkJICB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSA9IG5lZWRlZF9hcmNoaXRlY3R1cmU7Ci0JCX0KLQkgICAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IG5lZWRlZF9hcmNoaXRlY3R1cmU7Ci0JICAgIH0KLQkgIC8qIENvbmZsaWN0LiAgKi8KLQkgIC8qID8/PyBUaGlzIHNlZW1zIHRvIGJlIGEgYml0IGZyYWdpbGUuICBXaGF0IGlmIHRoZSBuZXh0IGVudHJ5IGluCi0JICAgICB0aGUgb3Bjb2RlIHRhYmxlIGlzIHRoZSBvbmUgd2Ugd2FudCBhbmQgaXQgaXMgc3VwcG9ydGVkPwotCSAgICAgSXQgaXMgcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgdGFibGUgdG9kYXkgc28gdGhhdCB0aGlzIGNhbid0Ci0JICAgICBoYXBwZW4gYnV0IHdoYXQgYWJvdXQgdG9tb3Jyb3c/ICAqLwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGFyY2gscHJpbnRlZF9vbmVfcCA9IDA7Ci0JICAgICAgY2hhciAqcDsKLQkgICAgICBjaGFyIHJlcXVpcmVkX2FyY2hzW1NQQVJDX09QQ09ERV9BUkNIX01BWCAqIDE2XTsKLQotCSAgICAgIC8qIENyZWF0ZSBhIGxpc3Qgb2YgdGhlIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IHRoZSBpbnNuLiAgKi8KLQkgICAgICBuZWVkZWRfYXJjaF9tYXNrICY9IH4gU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAobWF4X2FyY2hpdGVjdHVyZSk7Ci0JICAgICAgcCA9IHJlcXVpcmVkX2FyY2hzOwotCSAgICAgIGFyY2ggPSBzcGFyY19mZnMgKG5lZWRlZF9hcmNoX21hc2spOwotCSAgICAgIHdoaWxlICgoMSA8PCBhcmNoKSA8PSBuZWVkZWRfYXJjaF9tYXNrKQotCQl7Ci0JCSAgaWYgKCgxIDw8IGFyY2gpICYgbmVlZGVkX2FyY2hfbWFzaykKLQkJICAgIHsKLQkJICAgICAgaWYgKHByaW50ZWRfb25lX3ApCi0JCQkqcCsrID0gJ3wnOwotCQkgICAgICBzdHJjcHkgKHAsIHNwYXJjX29wY29kZV9hcmNoc1thcmNoXS5uYW1lKTsKLQkJICAgICAgcCArPSBzdHJsZW4gKHApOwotCQkgICAgICBwcmludGVkX29uZV9wID0gMTsKLQkJICAgIH0KLQkJICArK2FyY2g7Ci0JCX0KLQotCSAgICAgIGFzX2JhZCAoXygiQXJjaGl0ZWN0dXJlIG1pc21hdGNoIG9uIFwiJXNcIi4iKSwgc3RyKTsKLQkgICAgICBhc190c2t0c2sgKF8oIiAoUmVxdWlyZXMgJXM7IHJlcXVlc3RlZCBhcmNoaXRlY3R1cmUgaXMgJXMuKSIpLAotCQkJIHJlcXVpcmVkX2FyY2hzLAotCQkJIHNwYXJjX29wY29kZV9hcmNoc1ttYXhfYXJjaGl0ZWN0dXJlXS5uYW1lKTsKLQkgICAgICByZXR1cm4gc3BlY2lhbF9jYXNlOwotCSAgICB9Ci0JfSAvKiBpZiBubyBtYXRjaCAqLwotCi0gICAgICBicmVhazsKLSAgICB9IC8qIGZvcmV2ZXIgbG9va2luZyBmb3IgYSBtYXRjaCAqLwotCi0gIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKLSAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLX0KLQotLyogUGFyc2UgYW4gYXJndW1lbnQgdGhhdCBjYW4gYmUgZXhwcmVzc2VkIGFzIGEga2V5d29yZC4KLSAgIChlZzogI1N0b3JlU3RvcmUgb3IgJWNjZnIpLgotICAgVGhlIHJlc3VsdCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLgotICAgSWYgc3VjY2Vzc2Z1bCwgSU5QVVRfUE9JTlRFUiBpcyB1cGRhdGVkLiAgKi8KLQotc3RhdGljIGludAotcGFyc2Vfa2V5d29yZF9hcmcgKGxvb2t1cF9mbiwgaW5wdXRfcG9pbnRlclAsIHZhbHVlUCkKLSAgICAgaW50ICgqbG9va3VwX2ZuKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLSAgICAgY2hhciAqKmlucHV0X3BvaW50ZXJQOwotICAgICBpbnQgKnZhbHVlUDsKLXsKLSAgaW50IHZhbHVlOwotICBjaGFyIGMsICpwLCAqcTsKLQotICBwID0gKmlucHV0X3BvaW50ZXJQOwotICBmb3IgKHEgPSBwICsgKCpwID09ICcjJyB8fCAqcCA9PSAnJScpOwotICAgICAgIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcSkgfHwgKnEgPT0gJ18nOwotICAgICAgICsrcSkKLSAgICBjb250aW51ZTsKLSAgYyA9ICpxOwotICAqcSA9IDA7Ci0gIHZhbHVlID0gKCpsb29rdXBfZm4pIChwKTsKLSAgKnEgPSBjOwotICBpZiAodmFsdWUgPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gICp2YWx1ZVAgPSB2YWx1ZTsKLSAgKmlucHV0X3BvaW50ZXJQID0gcTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFBhcnNlIGFuIGFyZ3VtZW50IHRoYXQgaXMgYSBjb25zdGFudCBleHByZXNzaW9uLgotICAgVGhlIHJlc3VsdCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGludAotcGFyc2VfY29uc3RfZXhwcl9hcmcgKGlucHV0X3BvaW50ZXJQLCB2YWx1ZVApCi0gICAgIGNoYXIgKippbnB1dF9wb2ludGVyUDsKLSAgICAgaW50ICp2YWx1ZVA7Ci17Ci0gIGNoYXIgKnNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqaW5wdXRfcG9pbnRlclA7Ci0gIC8qIFRoZSBuZXh0IGV4cHJlc3Npb24gbWF5IGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgY29uc3RhbnQKLSAgICAgKHNheSBpZiB3ZSdyZSBub3QgcHJvY2Vzc2luZyB0aGUgcmlnaHQgdmFyaWFudCBvZiB0aGUgaW5zbikuCi0gICAgIERvbid0IGNhbGwgZXhwcmVzc2lvbiB1bmxlc3Mgd2UncmUgc3VyZSBpdCB3aWxsIHN1Y2NlZWQgYXMgaXQgd2lsbAotICAgICBzaWduYWwgYW4gZXJyb3IgKHdoaWNoIHdlIHdhbnQgdG8gZGVmZXIgdW50aWwgbGF0ZXIpLiAgKi8KLSAgLyogRklYTUU6IEl0IG1pZ2h0IGJlIGJldHRlciB0byBkZWZpbmUgbWRfb3BlcmFuZCBhbmQgaGF2ZSBpdCByZWNvZ25pemUKLSAgICAgdGhpbmdzIGxpa2UgJWFzaSwgZXRjLiBidXQgY29udGludWluZyB0aGF0IHJvdXRlIHRocm91Z2ggdG8gdGhlIGVuZAotICAgICBpcyBhIGxvdCBvZiB3b3JrLiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyUnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGV4cHJlc3Npb24gKCZleHApOwotICAqaW5wdXRfcG9pbnRlclAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHJldHVybiAwOwotICAqdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2Ygc3BhcmNfaXAgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9leHByZXNzaW9uIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc2F2ZV9pbjsKLSAgc2VnVCBzZWc7Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBzZWcgPSBleHByZXNzaW9uICgmdGhlX2luc24uZXhwKTsKLSAgaWYgKHNlZyAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdGV4dF9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gZGF0YV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gYnNzX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5lcnJvciA9IF8oImJhZCBzZWdtZW50Iik7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtZF9hc3NlbWJsZSB0byBvdXRwdXQgb25lIGluc24uICAqLwotCi1zdGF0aWMgdm9pZAotb3V0cHV0X2luc24gKGluc24sIHRoZV9pbnNuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICAgICBzdHJ1Y3Qgc3BhcmNfaXQgKnRoZV9pbnNuOwotewotICBjaGFyICp0b1AgPSBmcmFnX21vcmUgKDQpOwotCi0gIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHRvUCwgKHZhbHVlVCkgdGhlX2luc24tPm9wY29kZSwgNCk7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuICh0b1AsICh2YWx1ZVQpIHRoZV9pbnNuLT5vcGNvZGUsIDQpOwotCi0gIC8qIHB1dCBvdXQgdGhlIHN5bWJvbC1kZXBlbmRlbnQgc3R1ZmYgKi8KLSAgaWYgKHRoZV9pbnNuLT5yZWxvYyAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICBmaXhTICpmaXhQID0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywJLyogd2hpY2ggZnJhZyAqLwotCQkJCSAodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLAkvKiB3aGVyZSAqLwotCQkJCSA0LAkJLyogc2l6ZSAqLwotCQkJCSAmdGhlX2luc24tPmV4cCwKLQkJCQkgdGhlX2luc24tPnBjcmVsLAotCQkJCSB0aGVfaW5zbi0+cmVsb2MpOwotICAgICAgLyogVHVybiBvZmYgb3ZlcmZsb3cgY2hlY2tpbmcgaW4gZml4dXBfc2VnbWVudC4gIFdlJ2xsIGRvIG91cgotCSBvd24gb3ZlcmZsb3cgY2hlY2tpbmcgaW4gbWRfYXBwbHlfZml4My4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKLQkgdGhlIGluc24gc2l6ZSBpcyA0IGFuZCBmaXh1cF9zZWdtZW50IHdpbGwgc2lnbmFsIGFuIG92ZXJmbG93IGZvcgotCSBsYXJnZSA4IGJ5dGUgcXVhbnRpdGllcy4gICovCi0gICAgICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0gICAgICBpZiAodGhlX2luc24tPnJlbG9jID09IEJGRF9SRUxPQ19TUEFSQ19PTE8xMCkKLQlmaXhQLT50Y19maXhfZGF0YSA9IHRoZV9pbnNuLT5leHAyLlhfYWRkX251bWJlcjsKLSAgICB9Ci0KLSAgbGFzdF9pbnNuID0gaW5zbjsKLSAgbGFzdF9vcGNvZGUgPSB0aGVfaW5zbi0+b3Bjb2RlOwotfQotDAotLyoKLSAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG1kX2F0b2YgaW4gbTY4ay5jLiAgSSB0aGluayB0aGlzIGlzIHJpZ2h0LAotICBidXQgSSdtIG5vdCBzdXJlLgotCi0gIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gICovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBpLHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gICAgIAotICByZXR1cm4gMDsKLX0KLQotLyogV3JpdGUgYSB2YWx1ZSBvdXQgdG8gdGhlIG9iamVjdCBmaWxlLCB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgIGVuZGlhbm5lc3MuICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlIGlmICh0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhCi0JICAgJiYgKChuID09IDQgfHwgbiA9PSAyKSAmJiB+bm93X3NlZy0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQotICAgIC8qIE91dHB1dCBkZWJ1ZyB3b3Jkcywgd2hpY2ggYXJlIG5vdCBpbiBhbGxvY2F0ZWQgc2VjdGlvbnMsIGFzIGJpZyBlbmRpYW4gKi8KLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UgaWYgKHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEgfHwgISB0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0MCi0vKiBBcHBseSBhIGZpeFMgdG8gdGhlIGZyYWdzLCBub3cgdGhhdCB3ZSBrbm93IHRoZSB2YWx1ZSBpdCBvdWdodCB0bwotICAgaG9sZC4gKi8KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWx1ZSwgc2VnbWVudCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWx1ZTsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIG9mZnNldFQgdmFsOwotICBsb25nIGluc247Ci0KLSAgdmFsID0gKnZhbHVlOwotCi0gIGFzc2VydCAoZml4UC0+Znhfcl90eXBlIDwgQkZEX1JFTE9DX1VOVVNFRCk7Ci0KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgZW1pdF9yZWxvYyAqLwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBGSVhNRTogU1BBUkMgRUxGIHJlbG9jYXRpb25zIGRvbid0IHVzZSBhbiBhZGRlbmQgaW4gdGhlIGRhdGEKLSAgICAgZmllbGQgaXRzZWxmLiAgVGhpcyB3aG9sZSBhcHByb2FjaCBzaG91bGQgYmUgc29tZWhvdyBjb21iaW5lZAotICAgICB3aXRoIHRoZSBjYWxscyB0byBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgQWxzbywgdGhlIHZhbHVlIHBhc3NlZAotICAgICBpbiBieSBmaXh1cF9zZWdtZW50IGluY2x1ZGVzIHRoZSB2YWx1ZSBvZiBhIGRlZmluZWQgc3ltYm9sLiAgV2UKLSAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSB2YWx1ZSBvZiBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgfHwgKHNwYXJjX3BpY19jb2RlICYmICEgZml4UC0+ZnhfcGNyZWwpCi0JICAgICAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWdtZW50Ci0JCSAgJiYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCQkJICAgICAgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKQotCQkgICAgICAgJiBTRUNfTElOS19PTkNFKSAhPSAwCi0JCSAgICAgIHx8IHN0cm5jbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKSwKLQkJCQkgICIuZ251LmxpbmtvbmNlIiwKLQkJCQkgIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKSkpCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gYWJzb2x1dGVfc2VjdGlvbgotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JICAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKSkKLQlmaXhQLT5meF9hZGRudW1iZXIgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFRoaXMgaXMgYSBoYWNrLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSB0bwotICAgICBoYW5kbGUgdGhpcy4gIFByb2JhYmx5IGluIHRlcm1zIG9mIGhvd3RvIGZpZWxkcywgb25jZQotICAgICB3ZSBjYW4gbG9vayBhdCB0aGVzZSBmaXh1cHMgaW4gdGVybXMgb2YgaG93dG9zLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgdmFsICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLQotI2lmZGVmIE9CSl9BT1VUCi0gIC8qIEZJWE1FOiBNb3JlIHJpZGljdWxvdXMgZ2FzIHJlbG9jIGhhY2tpbmcuICBJZiB3ZSBhcmUgZ29pbmcgdG8KLSAgICAgZ2VuZXJhdGUgYSByZWxvYywgdGhlbiB3ZSBqdXN0IHdhbnQgdG8gbGV0IHRoZSByZWxvYyBhZGRlbmQgc2V0Ci0gICAgIHRoZSB2YWx1ZS4gIFdlIGRvIG5vdCB3YW50IHRvIGFsc28gc3R1ZmYgdGhlIGFkZGVuZCBpbnRvIHRoZQotICAgICBvYmplY3QgZmlsZS4gIEluY2x1ZGluZyB0aGUgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZSB3b3JrcyB3aGVuCi0gICAgIGRvaW5nIGEgc3RhdGljIGxpbmssIGJlY2F1c2UgdGhlIGxpbmtlciB3aWxsIGlnbm9yZSB0aGUgb2JqZWN0Ci0gICAgIGZpbGUgY29udGVudHMuICBIb3dldmVyLCB0aGUgZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgaWdub3JlIHRoZQotICAgICBvYmplY3QgZmlsZSBjb250ZW50cy4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiBmaXhQLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyKQotICAgIHZhbCA9IDA7Ci0KLSAgLyogV2hlbiBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBkbyBub3Qgd2FudCBhbiBhZGRlbmQgZm9yIGEgcmVsb2MKLSAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gIFdlIGFkanVzdCBmeF9hZGRudW1iZXIgdG8gY2FuY2VsIG91dCB0aGUKLSAgICAgdmFsdWUgYWxyZWFkeSBpbmNsdWRlZCBpbiB2YWwsIGFuZCB0byBhbHNvIGNhbmNlbCBvdXQgdGhlCi0gICAgIGFkanVzdG1lbnQgd2hpY2ggYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGNyZWF0ZS4gICovCi0gIGlmIChzcGFyY19waWNfY29kZQotICAgICAgJiYgZml4UC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgISBTX0lTX0NPTU1PTiAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiBzeW1ib2xfc2VjdGlvbl9wIChmaXhQLT5meF9hZGRzeSkpCi0gICAgZml4UC0+ZnhfYWRkbnVtYmVyIC09IDIgKiBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpOwotCi0gIC8qIFdoZW4gZ2VuZXJhdGluZyBQSUMgY29kZSwgd2UgbmVlZCB0byBmaWRkbGUgdG8gZ2V0Ci0gICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBhIFBDIHJlbGF0aXZlCi0gICAgIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIGtlZXAuICAqLwotICBpZiAoc3BhcmNfcGljX2NvZGUKLSAgICAgICYmIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmIChTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgICAgJiYgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICYmICEgU19JU19DT01NT04gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICB2YWwgPSAwOwotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyIC09IDIgKiBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElmIHRoaXMgaXMgYSBkYXRhIHJlbG9jYXRpb24sIGp1c3Qgb3V0cHV0IFZBTC4gICovCi0KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMTYpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgMik7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyCi0JICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TUEFSQ19SRVYzMikKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCA0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfNjQpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgOCk7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIAotICAgICAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEl0J3MgYSByZWxvY2F0aW9uIGFnYWluc3QgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi0gICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotCWluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgIAotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMX1MyOgotCSAgdmFsID0gdmFsID4+IDI7Ci0JICAvKiBGSVhNRTogVGhpcyBpbmNyZW1lbnQtYnktb25lIGRlc2VydmVzIGEgY29tbWVudCBvZiB3aHkgaXQncwotCSAgICAgYmVpbmcgZG9uZSEgICovCi0JICBpZiAoISBzcGFyY19waWNfY29kZQotCSAgICAgIHx8IGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwKLQkgICAgICB8fCBzeW1ib2xfc2VjdGlvbl9wIChmaXhQLT5meF9hZGRzeSkpCi0JICAgICsrdmFsOwotCSAgaW5zbiB8PSB2YWwgJiAweDNmZmZmZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ18xMToKLQkgIGlmICghIGluX3NpZ25lZF9yYW5nZSAodmFsLCAweDdmZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHg3ZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzEwOgotCSAgaWYgKCEgaW5fc2lnbmVkX3JhbmdlICh2YWwsIDB4M2ZmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDNmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfNzoKLQkgIGlmICghIGluX2JpdGZpZWxkX3JhbmdlICh2YWwsIDB4N2YpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4N2Y7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzY6Ci0JICBpZiAoISBpbl9iaXRmaWVsZF9yYW5nZSAodmFsLCAweDNmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDNmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ181OgotCSAgaWYgKCEgaW5fYml0ZmllbGRfcmFuZ2UgKHZhbCwgMHgxZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgxZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNjoKLQkgIC8qIEZJWE1FOiBzaW1wbGlmeSAqLwotCSAgaWYgKCgodmFsID4gMCkgJiYgKHZhbCAmIH4weDNmZmZjKSkKLQkgICAgICB8fCAoKHZhbCA8IDApICYmICh+KHZhbCAtIDEpICYgfjB4M2ZmZmMpKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgLyogRklYTUU6IFRoZSArMSBkZXNlcnZlcyBhIGNvbW1lbnQuICAqLwotCSAgdmFsID0gKHZhbCA+PiAyKSArIDE7Ci0JICBpbnNuIHw9ICgodmFsICYgMHhjMDAwKSA8PCA2KSB8ICh2YWwgJiAweDNmZmYpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5OgotCSAgLyogRklYTUU6IHNpbXBsaWZ5ICovCi0JICBpZiAoKCh2YWwgPiAwKSAmJiAodmFsICYgfjB4MWZmZmZjKSkKLQkgICAgICB8fCAoKHZhbCA8IDApICYmICh+KHZhbCAtIDEpICYgfjB4MWZmZmZjKSkpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIC8qIEZJWE1FOiBUaGUgKzEgZGVzZXJ2ZXMgYSBjb21tZW50LiAgKi8KLQkgIHZhbCA9ICh2YWwgPj4gMikgKyAxOwotCSAgaW5zbiB8PSB2YWwgJiAweDdmZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19ISDIyOgotCSAgdmFsID0gQlNSICh2YWwsIDMyKTsKLQkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19MTTIyOgotCWNhc2UgQkZEX1JFTE9DX0hJMjI6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgaW5zbiB8PSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogTmVlZCBjb21tZW50IGV4cGxhaW5pbmcgd2h5IHdlIGRvIHRoaXMuICAqLwotCSAgICAgIGluc24gJj0gfjB4ZmZmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQzIyOgotCSAgaWYgKHZhbCAmIH4weDAwM2ZmZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9ICh2YWwgJiAweDNmZmZmZik7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0hNMTA6Ci0JICB2YWwgPSBCU1IgKHZhbCwgMzIpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgaW5zbiB8PSB2YWwgJiAweDNmZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IE5lZWQgY29tbWVudCBleHBsYWluaW5nIHdoeSB3ZSBkbyB0aGlzLiAgKi8KLQkgICAgICBpbnNuICY9IH4weGZmOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX09MTzEwOgotCSAgdmFsICY9IDB4M2ZmOwotCSAgdmFsICs9IGZpeFAtPnRjX2ZpeF9kYXRhOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDMTM6Ci0JICBpZiAoISBpbl9zaWduZWRfcmFuZ2UgKHZhbCwgMHgxZmZmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDFmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI6Ci0JICB2YWwgPSAodmFsID4+IDIpICsgMTsKLQkgIC8qIEZBTExUSFJPVUdIICovCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyOgotCSAgaW5zbiB8PSB2YWwgJiAweDNmZmZmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfSDQ0OgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdHZhbCA9IHZhbDsKLQkgICAgICB0dmFsID4+PSAyMjsKLQkgICAgICBpbnNuIHw9IHR2YWwgJiAweDNmZmZmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICBpbnNuIHw9ICh2YWwgPj4gMTIpICYgMHgzZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0w0NDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIGluc24gfD0gdmFsICYgMHhmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0hJWDIyOgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIHZhbCBePSB+IChvZmZzZXRUKSAwOwotCSAgICAgIGluc24gfD0gKHZhbCA+PiAxMCkgJiAweDNmZmZmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19MT1gxMDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIGluc24gfD0gMHgxYzAwIHwgKHZhbCAmIDB4M2ZmKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfTk9ORToKLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygiYmFkIG9yIHVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIpLAotCQkJZml4UC0+Znhfcl90eXBlKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKElOU05fQklHX0VORElBTikKLQliZmRfcHV0YjMyIChpbnNuLCAodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKGluc24sICh1bnNpZ25lZCBjaGFyICopIGJ1Zik7Ci0gICAgfQotCi0gIC8qIEFyZSB3ZSBmaW5pc2hlZCB3aXRoIHRoaXMgcmVsb2NhdGlvbiBub3c/ICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiAhZml4UC0+ZnhfcGNyZWwpCi0gICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLWFyZWxlbnQgKioKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0YXRpYyBhcmVsZW50ICpyZWxvY3NbM107Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLQotICByZWxvY3NbMF0gPSByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWxvY3NbMV0gPSBOVUxMOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0hJMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQzEzOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOToKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyOgotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzU6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ183OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzExOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hIMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSE0xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MTTIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUENfSE0xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTDQ0OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hJWDIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0xPWDEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1JFVjMyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX09MTzEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQU9VVCkKLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQKLSAgICAgc2V0IG9mIHJlbG9jcy4gICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIEdPVF9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZWxzZQotI2RlZmluZSBHT1RfTkFNRSAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbmRpZgotCi0gIC8qIFRoaXMgY29kZSBtdXN0IGJlIHBhcmFsbGVsIHRvIHRoZSBPQkpfRUxGIHRjX2ZpeF9hZGp1c3RhYmxlLiAgKi8KLQotICBpZiAoc3BhcmNfcGljX2NvZGUpCi0gICAgewotICAgICAgc3dpdGNoIChjb2RlKQotCXsKLQljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMjoKLQkgIGlmICghIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgfHwgU19JU19DT01NT04gKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfRVhURVJOQUwgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQotCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX1dQTFQzMDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DX0hJMjI6Ci0JICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpLCBHT1RfTkFNRSkgPT0gMCkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19QQzIyOwotCSAgZWxzZQotCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX0dPVDIyOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfTE8xMDoKLQkgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSksIEdPVF9OQU1FKSA9PSAwKQotCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX1BDMTA7Ci0JICBlbHNlCi0JICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfR09UMTA7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ19TUEFSQzEzOgotCSAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19HT1QxMzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmIC8qIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9BT1VUKSAqLwotCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19PTE8xMCkKLSAgICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DX0xPMTApOwotICBlbHNlCi0gICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IDApCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGV4cG9ydCByZWxvYyB0eXBlICVkIChgJXMnKSIpLAotCQkgICAgZml4cC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgeGZyZWUgKHJlbG9jKTsKLSAgICAgIHJlbG9jc1swXSA9IE5VTEw7Ci0gICAgICByZXR1cm4gcmVsb2NzOwotICAgIH0KLQotICAvKiBAQCBXaHkgZnhfYWRkbnVtYmVyIHNvbWV0aW1lcyBhbmQgZnhfb2Zmc2V0IG90aGVyIHRpbWVzPyAgKi8KLSNpZmRlZiBPQkpfQU9VVAotCi0gIGlmIChyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlID09IDAKLSAgICAgIHx8IGNvZGUgPT0gQkZEX1JFTE9DX1NQQVJDX1BDMTAKLSAgICAgIHx8IGNvZGUgPT0gQkZEX1JFTE9DX1NQQVJDX1BDMjIpCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZSBpZiAoc3BhcmNfcGljX2NvZGUKLQkgICAmJiBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi0JICAgJiYgZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICYmIChTX0lTX0VYVEVSTkFMIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICAgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCi0JICAgJiYgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKLQkgICAmJiAhIFNfSVNfQ09NTU9OIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQgLSByZWxvYy0+YWRkcmVzczsKLQotI2Vsc2UgLyogZWxmIG9yIGNvZmYgKi8KLQotICBpZiAocmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSA9PSAwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzEwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzIyKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKGZpeHAtPmZ4X2FkZHN5KSkKLSAgICByZWxvYy0+YWRkZW5kID0gKHNlY3Rpb24tPnZtYQotCQkgICAgICsgZml4cC0+ZnhfYWRkbnVtYmVyCi0JCSAgICAgKyBtZF9wY3JlbF9mcm9tIChmaXhwKSk7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotI2VuZGlmCi0KLSAgLyogV2UgZXhwYW5kIFJfU1BBUkNfT0xPMTAgdG8gUl9TUEFSQ19MTzEwIGFuZCBSX1NQQVJDXzEzCi0gICAgIG9uIHRoZSBzYW1lIGxvY2F0aW9uLiAgKi8KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX1NQQVJDX09MTzEwKQotICAgIHsKLSAgICAgIHJlbG9jc1sxXSA9IHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICByZWxvY3NbMl0gPSBOVUxMOwotCi0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pKTsKLSAgICAgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICAgICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ19TUEFSQzEzKTsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT50Y19maXhfZGF0YTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbG9jczsKLX0KLQwKLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0JCQkJLyogbWRfdW5kZWZpbmVkX3N5bWJvbCgpICovCi0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZm5kZWYgT0JKX0VMRgotICAvKiBUaGlzIGlzIG5vdCByaWdodCBmb3IgRUxGOyBhLm91dCB3YW50cyBpdCwgYW5kIENPRkYgd2lsbCBmb3JjZQotICAgICB0aGUgYWxpZ25tZW50IGFueXdheXMuICAqLwotICB2YWx1ZVQgYWxpZ24gPSAoKHZhbHVlVCkgMQotCQkgIDw8ICh2YWx1ZVQpIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCkpOwotICB2YWx1ZVQgbmV3c2l6ZTsKLSAgLyogdHVybiBhbGlnbm1lbnQgdmFsdWUgaW50byBhIG1hc2sgKi8KLSAgYWxpZ24tLTsKLSAgbmV3c2l6ZSA9IChzaXplICsgYWxpZ24pICYgfmFsaWduOwotICByZXR1cm4gbmV3c2l6ZTsKLSNlbHNlCi0gIHJldHVybiBzaXplOwotI2VuZGlmCi19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBzcGFyYywgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCi0gICBpdHMgc2l6ZS4gIFRoaXMgZ2V0cyB1cyB0byB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLgotICAgKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTikgKi8KLWxvbmcgCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBsb25nIHJldDsKLQotICByZXQgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0gIGlmICghIHNwYXJjX3BpY19jb2RlCi0gICAgICB8fCBmaXhQLT5meF9hZGRzeSA9PSBOVUxMCi0gICAgICB8fCBzeW1ib2xfc2VjdGlvbl9wIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0ICs9IGZpeFAtPmZ4X3NpemU7Ci0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBSZXR1cm4gbG9nMiAoVkFMVUUpLCBvciAtMSBpZiBWQUxVRSBpcyBub3QgYW4gZXhhY3QgcG9zaXRpdmUgcG93ZXIKLSAgIG9mIHR3by4gICovCi0KLXN0YXRpYyBpbnQKLWxvZzIgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGludCBzaGlmdDsKLQotICBpZiAodmFsdWUgPD0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZm9yIChzaGlmdCA9IDA7ICh2YWx1ZSAmIDEpID09IDA7IHZhbHVlID4+PSAxKQotICAgICsrc2hpZnQ7Ci0KLSAgcmV0dXJuICh2YWx1ZSA9PSAxKSA/IHNoaWZ0IDogLTE7Ci19Ci0KLS8qCi0gKiBzb3J0IG9mIGxpa2Ugc19sY29tbQotICovCi0KLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIGludCBtYXhfYWxpZ25tZW50ID0gMTU7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXNfcmVzZXJ2ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyICpwOwotICBjaGFyIGM7Ci0gIGludCBhbGlnbjsKLSAgaW50IHNpemU7Ci0gIGludCB0ZW1wOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmICgoc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCBzaXplKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBiYWQgbGVuZ3RoICovCi0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLFwiYnNzXCIiLCA2KSAhPSAwCi0gICAgICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIsXCIuYnNzXCIiLCA3KSAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIC5yZXNlcnZlIHNlZ21lbnQgLS0gZXhwZWN0ZWQgQlNTIHNlZ21lbnQiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMl0gPT0gJy4nKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA3OwotICBlbHNlCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIGFsaWdubWVudCIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBhbGlnbiA9IChpbnQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCi0JewotCSAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OwotCSAgYXNfd2FybiAoXygiYWxpZ25tZW50IHRvbyBsYXJnZTsgYXNzdW1pbmcgJWQiKSwgYWxpZ24pOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoYWxpZ24gPCAwKQotCXsKLQkgIGFzX2JhZCAoXygibmVnYXRpdmUgYWxpZ25tZW50IikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChhbGlnbiAhPSAwKQotCXsKLQkgIHRlbXAgPSBsb2cyIChhbGlnbik7Ci0JICBpZiAodGVtcCA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGFsaWduID0gdGVtcDsKLQl9Ci0KLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0gICAgfQotICBlbHNlCi0gICAgYWxpZ24gPSAwOwotCi0gIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKQotI2lmZGVmIE9CSl9BT1VUCi0gICAgICAmJiBTX0dFVF9PVEhFUiAoc3ltYm9sUCkgPT0gMAotICAgICAgJiYgU19HRVRfREVTQyAoc3ltYm9sUCkgPT0gMAotI2VuZGlmCi0gICAgICApCi0gICAgewotICAgICAgaWYgKCEgbmVlZF9wYXNzXzIpCi0JewotCSAgY2hhciAqcGZyYWc7Ci0JICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLQkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMSk7IC8qIHN3aXRjaCB0byBic3MgKi8KLQotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7IC8qIGRvIGFsaWdubWVudCAqLwotCi0JICAvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZyAqLwotCSAgaWYgKFNfR0VUX1NFR01FTlQoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IE5VTEw7Ci0KLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCQkgICAgKG9mZnNldFQpIHNpemUsIChjaGFyICopMCk7Ci0JICAqcGZyYWcgPSAwOwotCi0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0KLQkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgJXMiLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICB9CQkJCS8qIGlmIG5vdCByZWRlZmluaW5nICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY29tbW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgaW50IHRlbXAsIHNpemU7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5DT01Nb24gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzaXplID0gdGVtcDsKLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgc2l6ZSkKLQl7Ci0JICBhc193YXJuIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iKSwKLQkJICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSNlbmRpZgotICAgIH0KLSAga25vdyAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBjb21tb24gbGVuZ3RoIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSNpZm5kZWYgT0JKX0VMRgotICAgICAgaWYgKHRlbXAgPiBtYXhfYWxpZ25tZW50KQotCXsKLQkgIHRlbXAgPSBtYXhfYWxpZ25tZW50OwotCSAgYXNfd2FybiAoXygiYWxpZ25tZW50IHRvbyBsYXJnZTsgYXNzdW1pbmcgJWQiKSwgdGVtcCk7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmICh0ZW1wIDwgMCkKLQl7Ci0JICBhc19iYWQgKF8oIm5lZ2F0aXZlIGFsaWdubWVudCIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwpCi0JewotCSAgc2VnVCBvbGRfc2VjOwotCSAgaW50IG9sZF9zdWJzZWM7Ci0JICBjaGFyICpwOwotCSAgaW50IGFsaWduOwotCi0JICBvbGRfc2VjID0gbm93X3NlZzsKLQkgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotCi0JICBpZiAodGVtcCA9PSAwKQotCSAgICBhbGlnbiA9IDA7Ci0JICBlbHNlCi0JICAgIGFsaWduID0gbG9nMiAodGVtcCk7Ci0KLQkgIGlmIChhbGlnbiA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkgICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCi0JCQkob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7Ci0JICAqcCA9IDA7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQl7Ci0JYWxsb2NhdGVfY29tbW9uOgotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotI2lmZGVmIE9CSl9FTEYKLQkgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCB0ZW1wKTsKLQkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotI2VuZGlmCi0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQotCXsKLQkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCSAgICA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotLyogSGFuZGxlIHRoZSAuZW1wdHkgcHNldWRvLW9wLiAgVGhpcyBzdXByZXNzZXMgdGhlIHdhcm5pbmdzIGFib3V0Ci0gICBpbnZhbGlkIGRlbGF5IHNsb3QgdXNhZ2UuICAqLwotCi1zdGF0aWMgdm9pZAotc19lbXB0eSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBUaGUgZWFzeSB3YXkgdG8gaW1wbGVtZW50IGlzIHRvIGp1c3QgZm9yZ2V0IGFib3V0IHRoZSBsYXN0Ci0gICAgIGluc3RydWN0aW9uLiAgKi8KLSAgbGFzdF9pbnNuID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXNfc2VnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlwidGV4dFwiIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfdGV4dCAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJkYXRhXCIiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotICAgICAgc19kYXRhICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcImRhdGExXCIiLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA3OwotICAgICAgc19kYXRhMSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcImJzc1wiIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIC8qIFdlIG9ubHkgc3VwcG9ydCAyIHNlZ21lbnRzIC0tIHRleHQgYW5kIGRhdGEgLS0gZm9yIG5vdywgc28KLQkgdGhpbmdzIGluIHRoZSAiYnNzIHNlZ21lbnQiIHdpbGwgaGF2ZSB0byBnbyBpbnRvIGRhdGEgZm9yIG5vdy4KLQkgWW91IGNhbiBzdGlsbCBhbGxvY2F0ZSBTRUdfQlNTIHN0dWZmIHdpdGggLmxjb21tIG9yIC5yZXNlcnZlLiAqLwotICAgICAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAyNTUpOwkvKiBGSVhNRS1TT01FREFZICovCi0gICAgICByZXR1cm47Ci0gICAgfQotICBhc19iYWQgKF8oIlVua25vd24gc2VnbWVudCB0eXBlIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19kYXRhMSAoKQotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19wcm9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGlzIHNldCBieSBzX3VhY29ucyB0byB0ZWxsIHNwYXJjX2NvbnNfYWxpZ24KLSAgIHRoYXQgdGhlIGV4cGVzc2lvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsaWduZWQuICAqLwotCi1zdGF0aWMgaW50IHNwYXJjX25vX2FsaWduX2NvbnMgPSAwOwotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIHVuYWxpZ25lZCBzcGFjZSBhbGxvY2F0aW9uIHBzZXVkby1vcHMsIHN1Y2ggYXMKLSAgIC51YXdvcmQuICAudWF3b3JkIGlzIGp1c3QgbGlrZSAud29yZCwgYnV0IHRoZSB2YWx1ZSBkb2VzIG5vdCBuZWVkCi0gICB0byBiZSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfdWFjb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICAvKiBUZWxsIHNwYXJjX2NvbnNfYWxpZ24gbm90IHRvIGFsaWduIHRoaXMgdmFsdWUuICAqLwotICBzcGFyY19ub19hbGlnbl9jb25zID0gMTsKLSAgY29ucyAoYnl0ZXMpOwotfQotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIG5hdGl2ZSB3b3JkIGFsbG9jYXRpb24gcHNldWRvLW9wIC5ud29yZC4KLSAgIEZvciBzcGFyY19hcmNoX3NpemUgMzIgaXQgaXMgZXF1aXZhbGVudCB0byAud29yZCwgIGZvcgotICAgc3BhcmNfYXJjaF9zaXplIDY0IGl0IGlzIGVxdWl2YWxlbnQgdG8gLnh3b3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbmNvbnMgKGJ5dGVzKQotICAgICBpbnQgYnl0ZXM7Ci17Ci0gIGNvbnMgKHNwYXJjX2FyY2hfc2l6ZSA9PSAzMiA/IDQgOiA4KTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLS8qIEhhbmRsZSB0aGUgU1BBUkMgRUxGIC5yZWdpc3RlciBwc2V1ZG8tb3AuICBUaGlzIHNldHMgdGhlIGJpbmRpbmcgb2YgYQotICAgZ2xvYmFsIHJlZ2lzdGVyLgotICAgVGhlIHN5bnRheCBpczoKLSAgIAotICAgLnJlZ2lzdGVyICVnWzIzNjddLHsjc2NyYXRjaHxzeW1ib2xuYW1lfCNpZ25vcmV9Ci0gICAqLwotCi1zdGF0aWMgdm9pZAotc19yZWdpc3RlciAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyIGM7Ci0gIGludCByZWc7Ci0gIGludCBmbGFnczsKLSAgY29uc3QgY2hhciAqcmVnbmFtZTsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdICE9ICclJwotICAgICAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdnJwotICAgICAgfHwgKChpbnB1dF9saW5lX3BvaW50ZXJbMl0gJiB+MSkgIT0gJzInCi0JICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzJdICYgfjEpICE9ICc2JykKLSAgICAgIHx8IGlucHV0X2xpbmVfcG9pbnRlclszXSAhPSAnLCcpCi0gICAgYXNfYmFkIChfKCJyZWdpc3RlciBzeW50YXggaXMgLnJlZ2lzdGVyICUlZ1syMzY3XSx7I3NjcmF0Y2h8c3ltYm9sbmFtZXwjaWdub3JlfSIpKTsKLSAgcmVnID0gaW5wdXRfbGluZV9wb2ludGVyWzJdIC0gJzAnOwotICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZWduYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKHN0cmNtcCAocmVnbmFtZSwgInNjcmF0Y2giKSAmJiBzdHJjbXAgKHJlZ25hbWUsICJpZ25vcmUiKSkKLQlhc19iYWQgKF8oInJlZ2lzdGVyIHN5bnRheCBpcyAucmVnaXN0ZXIgJSVnWzIzNjddLHsjc2NyYXRjaHxzeW1ib2xuYW1lfCNpZ25vcmV9IikpOwotICAgICAgaWYgKHJlZ25hbWUgWzBdID09ICdpJykKLQlyZWduYW1lID0gTlVMTDsKLSAgICAgIGVsc2UKLQlyZWduYW1lID0gIiI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICB9Ci0gIGlmIChzcGFyY19hcmNoX3NpemUgPT0gNjQpCi0gICAgewotICAgICAgaWYgKGdsb2JhbHMgW3JlZ10pCi0JewotCSAgaWYgKChyZWduYW1lICYmIGdsb2JhbHMgW3JlZ10gIT0gKHN5bWJvbFMgKikxCi0JICAgICAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoZ2xvYmFscyBbcmVnXSksIHJlZ25hbWUpKQotCSAgICAgIHx8ICgocmVnbmFtZSAhPSBOVUxMKSBeIChnbG9iYWxzIFtyZWddICE9IChzeW1ib2xTICopMSkpKQotCSAgICBhc19iYWQgKF8oInJlZGVmaW5pdGlvbiBvZiBnbG9iYWwgcmVnaXN0ZXIiKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChyZWduYW1lID09IE5VTEwpCi0JICAgIGdsb2JhbHMgW3JlZ10gPSAoc3ltYm9sUyAqKTE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoKnJlZ25hbWUpCi0JCXsKLQkJICBpZiAoc3ltYm9sX2ZpbmQgKHJlZ25hbWUpKQotCQkgICAgYXNfYmFkIChfKCJSZWdpc3RlciBzeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkLiIpLAotCQkJICAgIHJlZ25hbWUpOwotCQl9Ci0JICAgICAgZ2xvYmFscyBbcmVnXSA9IHN5bWJvbF9tYWtlIChyZWduYW1lKTsKLQkgICAgICBmbGFncyA9IHN5bWJvbF9nZXRfYmZkc3ltIChnbG9iYWxzIFtyZWddKS0+ZmxhZ3M7Ci0JICAgICAgaWYgKCEgKnJlZ25hbWUpCi0JCWZsYWdzID0gZmxhZ3MgJiB+KEJTRl9HTE9CQUx8QlNGX0xPQ0FMfEJTRl9XRUFLKTsKLQkgICAgICBpZiAoISAoZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfTE9DQUx8QlNGX1dFQUspKSkKLQkJZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkgICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoZ2xvYmFscyBbcmVnXSktPmZsYWdzID0gZmxhZ3M7Ci0JICAgICAgU19TRVRfVkFMVUUgKGdsb2JhbHMgW3JlZ10sICh2YWx1ZVQpcmVnKTsKLQkgICAgICBTX1NFVF9BTElHTiAoZ2xvYmFscyBbcmVnXSwgcmVnKTsKLQkgICAgICBTX1NFVF9TSVpFIChnbG9iYWxzIFtyZWddLCAwKTsKLQkgICAgICAvKiBBbHRob3VnaCB3ZSBhY3R1YWxseSB3YW50IHVuZGVmaW5lZF9zZWN0aW9uIGhlcmUsCi0JCSB3ZSBoYXZlIHRvIHVzZSBhYnNvbHV0ZV9zZWN0aW9uLCBiZWNhdXNlIG90aGVyd2lzZQotCQkgZ2VuZXJpYyBhcyBjb2RlIHdpbGwgbWFrZSBpdCBhIENPTSBzZWN0aW9uLgotCQkgV2UgZml4IHRoaXMgdXAgaW4gc3BhcmNfYWRqdXN0X3N5bXRhYi4gICovCi0JICAgICAgU19TRVRfU0VHTUVOVCAoZ2xvYmFscyBbcmVnXSwgYWJzb2x1dGVfc2VjdGlvbik7Ci0JICAgICAgU19TRVRfT1RIRVIgKGdsb2JhbHMgW3JlZ10sIDApOwotCSAgICAgIGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChnbG9iYWxzIFtyZWddKSkKLQkJLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8gPQotCQkgIEVMRl9TVF9JTkZPKFNUQl9HTE9CQUwsIFNUVF9SRUdJU1RFUik7Ci0JICAgICAgZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKGdsb2JhbHMgW3JlZ10pKQotCQktPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9sIHRhYmxlLiAgV2Ugc2V0IHVuZGVmaW5lZCBzZWN0aW9ucyBmb3IgU1RUX1JFR0lTVEVSCi0gICBzeW1ib2xzIHdoaWNoIG5lZWQgaXQuICAqLwotICAgCi12b2lkCi1zcGFyY19hZGp1c3Rfc3ltdGFiICgpCi17Ci0gIHN5bWJvbFMgKnN5bTsKLSAgICAgCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKEVMRl9TVF9UWVBFIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSkKLQkJICAgICAgIC0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSAhPSBTVFRfUkVHSVNURVIpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChFTEZfU1RfVFlQRSAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpCi0JCSAgICAgICAtPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGKSkKLQljb250aW51ZTsKLQotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCB1bmRlZmluZWRfc2VjdGlvbik7Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qIElmIHRoZSAtLWVuZm9yY2UtYWxpZ25lZC1kYXRhIG9wdGlvbiBpcyB1c2VkLCB3ZSByZXF1aXJlIC53b3JkLAotICAgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICBXZSBkbyBpdCBieSBzZXR0aW5nIHVwIGFuCi0gICByc19hbGlnbl9jb2RlIGZyYWcsIGFuZCBjaGVja2luZyBpbiBIQU5ETEVfQUxJR04gdG8gbWFrZSBzdXJlIHRoYXQKLSAgIG5vIHVuZXhwZWN0ZWQgYWxpZ25tZW50IHdhcyBpbnRyb2R1Y2VkLgotCi0gICBUaGUgU3VuT1MgYW5kIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlcnMgZW5mb3JjZSBhbGlnbmVkIGRhdGEgYnkKLSAgIGRlZmF1bHQuICBXZSBkb24ndCB3YW50IHRvIGRvIHRoYXQsIGJlY2F1c2UgZ2NjIGNhbiBkZWxpYmVyYXRlbHkKLSAgIGdlbmVyYXRlIG1pc2FsaWduZWQgZGF0YSBpZiB0aGUgcGFja2VkIGF0dHJpYnV0ZSBpcyB1c2VkLiAgSW5zdGVhZCwKLSAgIHdlIHBlcm1pdCBtaXNhbGlnbmVkIGRhdGEgYnkgZGVmYXVsdCwgYW5kIHBlcm1pdCB0aGUgdXNlciB0byBzZXQgYW4KLSAgIG9wdGlvbiB0byBjaGVjayBmb3IgaXQuICAqLwotCi12b2lkCi1zcGFyY19jb25zX2FsaWduIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGludCBuYWxpZ247Ci0gIGNoYXIgKnA7Ci0KLSAgLyogT25seSBkbyB0aGlzIGlmIHdlIGFyZSBlbmZvcmNpbmcgYWxpZ25lZCBkYXRhLiAgKi8KLSAgaWYgKCEgZW5mb3JjZV9hbGlnbmVkX2RhdGEpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzcGFyY19ub19hbGlnbl9jb25zKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gdW5hbGlnbmVkIHBzZXVkby1vcC4gICovCi0gICAgICBzcGFyY19ub19hbGlnbl9jb25zID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFsaWduID0gbG9nMiAobmJ5dGVzKTsKLSAgaWYgKG5hbGlnbiA9PSAwKQotICAgIHJldHVybjsKLQotICBhc3NlcnQgKG5hbGlnbiA+IDApOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKChhYnNfc2VjdGlvbl9vZmZzZXQgJiAoKDEgPDwgbmFsaWduKSAtIDEpKSAhPSAwKQotCWFzX2JhZCAoXygibWlzYWxpZ25lZCBkYXRhIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsCi0JCShzeW1ib2xTICopIE5VTEwsIChvZmZzZXRUKSBuYWxpZ24sIChjaGFyICopIE5VTEwpOwotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIG5hbGlnbik7Ci19Ci0KLS8qIFRoaXMgaXMgd2hlcmUgd2UgZG8gdGhlIHVuZXhwZWN0ZWQgYWxpZ25tZW50IGNoZWNrLgotICAgVGhpcyBpcyBjYWxsZWQgZnJvbSBIQU5ETEVfQUxJR04gaW4gdGMtc3BhcmMuaC4gICovCi0KLXZvaWQKLXNwYXJjX2hhbmRsZV9hbGlnbiAoZnJhZ3ApCi0gICAgIGZyYWdTICpmcmFncDsKLXsKLSAgaWYgKGZyYWdwLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUgJiYgIWZyYWdwLT5mcl9zdWJ0eXBlCi0gICAgICAmJiBmcmFncC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2ZpeCAhPSAwKQotICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLCBfKCJtaXNhbGlnbmVkIGRhdGEiKSk7Ci0gIGlmIChmcmFncC0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlICYmIGZyYWdwLT5mcl9zdWJ0eXBlID09IDEwMjQpCi0gICAgewotICAgICAgaW50IGNvdW50ID0gZnJhZ3AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9maXg7Ci0gICAgICAKLSAgICAgIGlmIChjb3VudCA+PSA0Ci0JICAmJiAhKGNvdW50ICYgMykKLQkgICYmIGNvdW50IDw9IDEwMjQKLQkgICYmICEoKGxvbmcpKGZyYWdwLT5mcl9saXRlcmFsICsgZnJhZ3AtPmZyX2ZpeCkgJiAzKSkKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkICpwID0gKHVuc2lnbmVkICopKGZyYWdwLT5mcl9saXRlcmFsICsgZnJhZ3AtPmZyX2ZpeCk7Ci0gICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgCi0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDQsIHArKykKLSAgICAgICAgICAgIGlmIChJTlNOX0JJR19FTkRJQU4pCi0gICAgICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKChjaGFyICopcCwgMHgwMTAwMDAwMCwgNCk7IC8qIGVtaXQgbm9wcyAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuICgoY2hhciAqKXAsIDB4MTAwMDAwMDAsIDQpOwotCi0gICAgICAgICAgaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpICYmIGNvdW50ID4gOCkKLSAgICAgICAgICAgIHsKLQkgICAgICBjaGFyICp3YWRkciA9ICZmcmFncC0+ZnJfbGl0ZXJhbFtmcmFncC0+ZnJfZml4XTsKLQkgICAgICB1bnNpZ25lZCB3dmFsID0gKDB4MzA2ODAwMDAgfCBjb3VudCA+PiAyKTsgLyogYmEsYSxwdCAleGNjLCAxZiAqLwotCSAgICAgIGlmIChJTlNOX0JJR19FTkRJQU4pCi0JCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHdhZGRyLCB3dmFsLCA0KTsKLQkgICAgICBlbHNlCi0JCW51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHdhZGRyLCB3dmFsLCA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBmcmFncC0+ZnJfdmFyID0gY291bnQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBTb21lIHNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgYSBTcGFyYyBFTEYgZmlsZS4gICovCi0KLXZvaWQKLXNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nICgpCi17Ci0gIC8qIFNldCB0aGUgU3BhcmMgRUxGIGZsYWcgYml0cy4gIEZJWE1FOiBUaGVyZSBzaG91bGQgcHJvYmFibHkgYmUgc29tZQotICAgICBzb3J0IG9mIEJGRCBpbnRlcmZhY2UgZm9yIHRoaXMuICAqLwotICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDY0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3BhcmNfbWVtb3J5X21vZGVsKQotCXsKLQljYXNlIE1NX1JNTzoKLQkgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNWOV9STU87Ci0JICBicmVhazsKLQljYXNlIE1NX1BTTzoKLQkgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNWOV9QU087Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPj0gU1BBUkNfT1BDT0RFX0FSQ0hfVjkpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9TUEFSQ18zMlBMVVM7Ci0gIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9WOUEpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9TUEFSQ19TVU5fVVMxOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IGVtaXRfZXhwciB2aWEgVENfQ09OU19GSVhfTkVXIHdoZW4gY3JlYXRpbmcgYQotICAgcmVsb2MgZm9yIGEgY29ucy4gIFdlIGNvdWxkIHVzZSB0aGUgZGVmaW5pdGlvbiB0aGVyZSwgZXhjZXB0IHRoYXQKLSAgIHdlIHdhbnQgdG8gaGFuZGxlIGxpdHRsZSBlbmRpYW4gcmVsb2NzIHNwZWNpYWxseS4gICovCi0KLXZvaWQKLWNvbnNfZml4X25ld19zcGFyYyAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLQotICByID0gKG5ieXRlcyA9PSAxID8gQkZEX1JFTE9DXzggOgotICAgICAgIChuYnl0ZXMgPT0gMiA/IEJGRF9SRUxPQ18xNiA6Ci0JKG5ieXRlcyA9PSA0ID8gQkZEX1JFTE9DXzMyIDogQkZEX1JFTE9DXzY0KSkpOwotCi0gIGlmICh0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhICYmIG5ieXRlcyA9PSA0Ci0gICAgICAmJiBub3dfc2VnLT5mbGFncyAmIFNFQ19BTExPQykgIAotICAgIHIgPSBCRkRfUkVMT0NfU1BBUkNfUkVWMzI7Ci0gIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgKGludCkgbmJ5dGVzLCBleHAsIDAsIHIpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotaW50Ci1lbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICAgc3RydWN0IGZpeCAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotIAotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXNwYXJjLmggYi9nYXMvY29uZmlnL3RjLXNwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZmRhMjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIHRjLXNwYXJjLmggLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5lcyBmb3IgdGhlIHNwYXJjLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MC05NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRDX1NQQVJDCi0jZGVmaW5lIFRDX1NQQVJDIDEKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZyYWc7Ci0jZW5kaWYKLQotLyogVGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYHRhcmdldF9iaWdfZW5kaWFuJy4gICovCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0KLWV4dGVybiBjb25zdCBjaGFyICpzcGFyY190YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCBzcGFyY190YXJnZXRfZm9ybWF0ICgpCi0KLSNkZWZpbmUgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi0jZGVmaW5lIE1BWF9SRUxPQ19FWFBBTlNJT04gMgotCi0jaWYgMAotI2lmZGVmIFRFX1NQQVJDQU9VVAotLyogQmktZW5kaWFuIHN1cHBvcnQgbWF5IGV2ZW50dWFsbHkgYmUgdW5jb25kaXRpb25hbCwgYnV0IHVudGlsIHRoaW5ncyBhcmUKLSAgIHdvcmtpbmcgd2VsbCBpdCdzIG9ubHkgcHJvdmlkZWQgZm9yIHRhcmdldHMgdGhhdCBuZWVkIGl0LiAgKi8KLSNkZWZpbmUgU1BBUkNfQklFTkRJQU4KLSNlbmRpZgotI2VuZGlmCi0vKiBNYWtlIGl0IHVuY29uZGl0aW9uYWwgYW5kIGNoZWNrIGlmIC1FTCBpcyB2YWxpZCBhZnRlciBvcHRpb24gcGFyc2luZyAqLwotI2RlZmluZSBTUEFSQ19CSUVORElBTgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQl7YXNfZmF0YWwgKF8oInNwYXJjIGNvbnZlcnRfZnJhZ1xuIikpO30KLSNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoZixzKSBcCi0JCQkoYXNfZmF0YWwoXygiZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggY2FsbGVkIikpLDEpCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIlNQQVJDIEdBUyAiCi0KLWV4dGVybiBpbnQgc3BhcmNfcGljX2NvZGU7Ci0KLSNkZWZpbmUgbWRfZG9fYWxpZ24obiwgZmlsbCwgbGVuLCBtYXgsIGFyb3VuZCkJCQkJXAotaWYgKChuKSAmJiAobikgPD0gMTAgJiYgIW5lZWRfcGFzc18yICYmICEoZmlsbCkJCQkJXAotICAgICYmIHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpKQkJCQkJCVwKLSAgewkJCQkJCQkJCVwKLSAgICBjaGFyICpwOwkJCQkJCQkJXAotICAgIHAgPSBmcmFnX3ZhciAocnNfYWxpZ25fY29kZSwgMSA8PCBuLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAxMDI0LAlcCi0gICAgICAgICAgICAgICAgICAoc3ltYm9sUyAqKSAwLCAob2Zmc2V0VCkgKG4pLCAoY2hhciAqKSAwKTsJCVwKLSAgICAqcCA9IDB4MDA7CQkJCQkJCQlcCi0gICAgZ290byBhcm91bmQ7CQkJCQkJCVwKLSAgfQotCi0vKiBXZSByZXF1aXJlIC53b3JkLCBldC4gYWwuLCB0byBiZSBhbGlnbmVkIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIG1kX2NvbnNfYWxpZ24obmJ5dGVzKSBzcGFyY19jb25zX2FsaWduIChuYnl0ZXMpCi1leHRlcm4gdm9pZCBzcGFyY19jb25zX2FsaWduIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBIQU5ETEVfQUxJR04oZnJhZ3ApIHNwYXJjX2hhbmRsZV9hbGlnbiAoZnJhZ3ApCi1leHRlcm4gdm9pZCBzcGFyY19oYW5kbGVfYWxpZ24gUEFSQU1TICgoc3RydWN0IGZyYWcgKikpOwotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX0FPVVQpCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwKLSAgIG9iamVjdCBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLgotICAgVHJ1ZSBpZiB3ZSBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZwotICAgdGhlIC5vIGZpbGUuCi0KLSAgIElmIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2wsIHRoZW4gdGhlCi0gICBhLm91dCBhc3NlbWJsZXIgc2hvdWxkIG5vdCBkbyB0aGUgcmVsb2NhdGlvbiBpZiBnZW5lcmF0aW5nIFBJQywgYW5kCi0gICB0aGUgRUxGIGFzc2VtYmxlciBzaG91bGQgbmV2ZXIgZG8gdGhlIHJlbG9jYXRpb24uICAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBvYmpfcmVsb2NhdGVfZXh0ZXJuIDAKLSNlbHNlCi0jZGVmaW5lIG9ial9yZWxvY2F0ZV9leHRlcm4gKCEgc3BhcmNfcGljX2NvZGUpCi0jZW5kaWYKLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAotICAob2JqX3JlbG9jYXRlX2V4dGVybiBcCi0gICB8fCAoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTCBcCi0gICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKLSNlbmRpZgotCi0vKiBJIGtub3cgdGhhdCAiY2FsbCAwIiBmYWlscyBpbiBzcGFyYy1jb2ZmIGlmIHRoaXMgZG9lc24ndCByZXR1cm4gMS4gIEkKLSAgIGRvbid0IGtub3cgYWJvdXQgb3RoZXIgcmVsb2NhdGlvbiB0eXBlcywgb3Igb3RoZXIgZm9ybWF0cywgeWV0LiAgKi8KLSNpZmRlZiBPQkpfQ09GRgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApCVwKLQkoKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyIFwKLQkgJiYgKChGSVhQKS0+ZnhfYWRkc3kgPT0gMCBcCi0JICAgICB8fCBTX0dFVF9TRUdNRU5UICgoRklYUCktPmZ4X2FkZHN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLSNkZWZpbmUgUkVMT0NfUkVRVUlSRVNfU1lNQk9MCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSBlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uKGZpeHApCi1leHRlcm4gaW50IGVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jaWZkZWYgT0JKX0VMRgotLyogS2VlcCByZWxvY2F0aW9ucyBhZ2FpbnN0IGdsb2JhbCBzeW1ib2xzLiAgRG9uJ3QgdHVybiB0aGVtIGludG8KLSAgIHJlbG9jYXRpb25zIGFnYWluc3Qgc2VjdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYwotICAgbGlua2VyIHRvIG9wZXJhdGUgcHJvcGVybHkuICBXaGVuIGdlbmVyYXRpbmcgUElDLCB3ZSBuZWVkIHRvIGtlZXAKLSAgIGFueSBub24gUEMgcmVsYXRpdmUgcmVsb2MuICBUaGUgUElDIHBhcnQgb2YgdGhpcyB0ZXN0IG11c3QgYmUKLSAgIHBhcmFsbGVsIHRvIHRoZSBjb2RlIGluIHRjX2dlbl9yZWxvYyB3aGljaCBjb252ZXJ0cyByZWxvY2F0aW9ucyB0bwotICAgR09UIHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKQkJCQkJCVwKLSAgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCQkJXAotICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCQkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCQkJXAotICAgJiYgKCEgc3BhcmNfcGljX2NvZGUJCQkJCQkJXAotICAgICAgIHx8ICgoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTIyCQkJCVwKLQkgICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzEwCQkJXAotCSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NQQVJDMTMJCQlcCi0JICAgJiYgKChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyCQlcCi0JICAgICAgIHx8IChTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JCSAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JCSAgICYmICEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkJICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkpKQkJCVwKLQkgICAmJiAoKEZJWCktPmZ4X3BjcmVsCQkJCQkJXAotCSAgICAgICB8fCAoKEZJWCktPmZ4X3N1YnN5ICE9IE5VTEwJCQkJXAotCQkgICAmJiAoU19HRVRfU0VHTUVOVCAoKEZJWCktPmZ4X3N1YnN5KQkJCVwKLQkJICAgICAgID09IFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9hZGRzeSkpKQkJXAotCSAgICAgICB8fCBTX0lTX0xPQ0FMICgoRklYKS0+ZnhfYWRkc3kpKSkpKQotCi0vKiBGaW5pc2ggdXAgdGhlIGVudGlyZSBzeW10YWIuICAqLwotI2RlZmluZSB0Y19hZGp1c3Rfc3ltdGFiKCkgc3BhcmNfYWRqdXN0X3N5bXRhYiAoKQotZXh0ZXJuIHZvaWQgc3BhcmNfYWRqdXN0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9BT1VUCi0vKiBXaGVuIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG11c3Qgbm90IGFkanVzdCBhbnkgcmVsb2Mgd2hpY2ggd2lsbAotICAgdHVybiBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgbm9yIGFueSByZWxvYwotICAgd2hpY2ggd2Ugd2lsbCBuZWVkIGlmIGEgc3ltYm9sIGlzIG92ZXJyaWRkZW4uICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpCQkJCQkJXAotICAoISBzcGFyY19waWNfY29kZQkJCQkJCQlcCi0gICB8fCAoKEZJWCktPmZ4X3BjcmVsCQkJCQkJCVwKLSAgICAgICAmJiAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLQkgICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KSkpKQkJCVwKLSAgIHx8IChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2CQkJCQlcCi0gICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMikKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nCi1leHRlcm4gdm9pZCBzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gdm9pZCBzcGFyY19tZF9lbmQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9lbmQoKSBzcGFyY19tZF9lbmQgKCkKLQotI2VuZGlmCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19zcGFyYwotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X3NwYXJjCi0gIFBBUkFNUyAoKHN0cnVjdCBmcmFnICosIGludCwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOwotCi0jZGVmaW5lIFRDX0ZJWF9UWVBFCXZhbHVlVAotCi0jZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoWCkJCQlcCi0gIGRvCQkJCQkJXAotICAgICB7CQkJCQkJXAotICAgICAgIChYKS0+dGNfZml4X2RhdGEgPSAwOwkJCVwKLSAgICAgfQkJCQkJCVwKLSAgd2hpbGUoMCkKLQotI2RlZmluZSBUQ19GSVhfREFUQV9QUklOVChGSUxFLCBGSVhQKQkJCQkJXAotICBkbwkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZnByaW50ZigoRklMRSksICJhZGRlbmQyPSVsZFxuIiwgICAJCQkJXAotCSAgICAgICh1bnNpZ25lZCBsb25nKSAoRklYUCktPnRjX2ZpeF9kYXRhKTsJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgd2hpbGUoMCkKLQotLyogZW5kIG9mIHRjLXNwYXJjLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGFob2UuYyBiL2dhcy9jb25maWcvdGMtdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhNzUyNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRhaG9lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDI3ICswLDAgQEAKLS8qIHRjLXRhaG9lLmMKLSAgIE5vdCBwYXJ0IG9mIEdBUyB5ZXQuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogdGhpcyBiaXQgZ2xvbW1lZCBmcm9tIHRhaG9lLWluc3QuaCAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZTsKLXR5cGVkZWYgYnl0ZSB0YWhvZV9vcGNvZGVUOwotCi0vKgotICogVGhpcyBpcyBwYXJ0IG9mIHRhaG9lLWlucy1wYXJzZS5jICYgZnJpZW5kcy4KLSAqIFdlIHdhbnQgdG8gcGFyc2UgYSB0YWhvZSBpbnN0cnVjdGlvbiB0ZXh0IGludG8gYSB0cmVlIGRlZmluZWQgaGVyZS4KLSAqLwotCi0jZGVmaW5lIFRJVF9NQVhfT1BFUkFORFMgKDQpCS8qIG1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGluIG9uZQotCQkJCSAgIHNpbmdsZSB0YWhvZSBpbnN0cnVjdGlvbiAqLwotCi1zdHJ1Y3QgdG9wCQkJLyogdGFob2UgaW5zdHJ1Y3Rpb24gb3BlcmFuZCAqLwotewotICBpbnQgdG9wX25keDsJCQkvKiAtMSwgb3IgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XSAqLwotICBpbnQgdG9wX3JlZzsJCQkvKiAtMSwgb3IgcmVnaXN0ZXIgbnVtYmVyLiBlZyA3ID0gUjcgb3IgKFI3KSAqLwotICBieXRlIHRvcF9tb2RlOwkJLyogQWRkcmVzc2luZyBtb2RlIGJ5dGUuIFRoaXMgYnl0ZSwgZGVmaW5lcwotCQkJCSAgIHdoaWNoIG9mIHRoZSAxMSBtb2RlcyBvcGNvZGUgaXMuICovCi0KLSAgY2hhciB0b3BfYWNjZXNzOwkJLyogQWNjZXNzIHR5cGUgd2FudGVkIGZvciB0aGlzIG9wcGVyYW5kCi0JCQkJICAgJ2InYnJhbmNoICcgJ25vLWluc3RydWN0aW9uICdhbXJ2dycgKi8KLSAgY2hhciB0b3Bfd2lkdGg7CQkvKiBPcGVyYW5kIHdpZHRoIGV4cGVjdGVkLCBvbmUgb2YgImJ3bHE/LTohIiAqLwotCi0gIGNoYXIgKnRvcF9lcnJvcjsJCS8qIFNheSBpZiBvcGVyYW5kIGlzIGluYXBwcm9wcmlhdGUgICAgICAgICAqLwotCi0gIHNlZ1Qgc2VnX29mX29wZXJhbmQ7CQkvKiBzZWdtZW50IGFzIHJldHVybmVkIGJ5IGV4cHJlc3Npb24oKSovCi0KLSAgZXhwcmVzc2lvblMgZXhwX29mX29wZXJhbmQ7CS8qIFRoZSBleHByZXNzaW9uIGFzIHBhcnNlZCBieSBleHByZXNzaW9uKCkqLwotCi0gIGJ5dGUgdG9wX2Rpc3BzaXplOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBkaXNwbGFjZW1lbnQgaWYgd2UKLQkJCQkgICBjYW4gZmlndXJlIGl0IG91dCAqLwotfTsKLQotLyogVGhlIGFkZHJlc3NpbmcgbW9kZXMgZm9yIGFuIG9wZXJhbmQuIFRoZXNlIG51bWJlcnMgYXJlIHRoZSBhY3V0YWwgdmFsdWVzCi0gICBmb3IgY2VydGFpbiBtb2Rlcywgc28gYmUgY2FyZWZ1bGwgaWYgeW91IHNjcmV3IHdpdGggdGhlbS4gKi8KLSNkZWZpbmUgVEFIT0VfRElSRUNUX1JFRyAoMHg1MCkKLSNkZWZpbmUgVEFIT0VfUkVHX0RFRkVSUkVEICgweDYwKQotCi0jZGVmaW5lIFRBSE9FX1JFR19ESVNQICgweEUwKQotI2RlZmluZSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRCAoMHhGMCkKLQotI2RlZmluZSBUQUhPRV9JTU1FRElBVEUgKDB4OEYpCi0jZGVmaW5lIFRBSE9FX0lNTUVESUFURV9CWVRFICgweDg4KQotI2RlZmluZSBUQUhPRV9JTU1FRElBVEVfV09SRCAoMHg4OSkKLSNkZWZpbmUgVEFIT0VfSU1NRURJQVRFX0xPTkdXT1JEICgweDhGKQotI2RlZmluZSBUQUhPRV9BQlNPTFVURV9BRERSICgweDlGKQotCi0jZGVmaW5lIFRBSE9FX0RJU1BMQUNFRF9SRUxBVElWRSAoMHhFRikKLSNkZWZpbmUgVEFIT0VfRElTUF9SRUxfREVGRVJSRUQgKDB4RkYpCi0KLSNkZWZpbmUgVEFIT0VfQVVUT19ERUMgKDB4N0UpCi0jZGVmaW5lIFRBSE9FX0FVVE9fSU5DICgweDhFKQotI2RlZmluZSBUQUhPRV9BVVRPX0lOQ19ERUZFUlJFRCAoMHg5RSkKLS8qIElOREVYRURfUkVHIGlzIGRlY2lkZWQgYnkgdGhlIGV4aXN0YW5jZSBvciBsYWNrIG9mIGEgW3JlZ10gKi8KLQotLyogVGhlc2UgYXJlIGVuY29kZWQgaW50byB0b3Bfd2lkdGggd2hlbiB0b3BfYWNjZXNzPT0nYicKLSAgIGFuZCBpdCdzIGEgcHN1ZWRvIG9wLiovCi0jZGVmaW5lIFRBSE9FX1dJRFRIX0FMV0FZU19KVU1QICAgICAgJy0nCi0jZGVmaW5lIFRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVAgJz8nCi0jZGVmaW5lIFRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUCAgICAgJyEnCi0jZGVmaW5lIFRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVAgJzonCi0KLS8qIFRoZSBoZXggY29kZSBmb3IgY2VydGFpbiB0YWhvZSBjb21tYW5kcyBhbmQgbW9kZXMuCi0gICBUaGlzIGlzIGp1c3QgZm9yIHJlYWRhYmlsaXR5LiAqLwotI2RlZmluZSBUQUhPRV9KTVAgKDB4NzEpCi0jZGVmaW5lIFRBSE9FX1BDX1JFTF9MT05HICgweEVGKQotI2RlZmluZSBUQUhPRV9CUkIgKDB4MTEpCi0jZGVmaW5lIFRBSE9FX0JSVyAoMHgxMykKLS8qIFRoZXNlLCB3aGVuICdvcmVkJyB3aXRoLCBvciBhZGRlZCB0bywgYSByZWdpc3RlciBudW1iZXIsCi0gICBzZXQgdXAgdGhlIG51bWJlciBmb3IgdGhlIGRpc3BsYWNlbWVudCBtb2RlLiAqLwotI2RlZmluZSBUQUhPRV9QQ19PUl9CWVRFICgweEEwKQotI2RlZmluZSBUQUhPRV9QQ19PUl9XT1JEICgweEMwKQotI2RlZmluZSBUQUhPRV9QQ19PUl9MT05HICgweEUwKQotCi1zdHJ1Y3QgdGl0CQkJLyogZ2V0IGl0IG91dCBvZiB0aGUgc2V3ZXIsIGl0IHN0YW5kcyBmb3IKLQkJCQkgICB0YWhvZSBpbnN0cnVjdGlvbiB0cmVlIChHZWV6ZSEpICovCi17Ci0gIHRhaG9lX29wY29kZVQgdGl0X29wY29kZTsJLyogVGhlIG9wY29kZS4gKi8KLSAgYnl0ZSB0aXRfb3BlcmFuZHM7CQkvKiBIb3cgbWFueSBvcGVyYW5kcyBhcmUgaGVyZS4gKi8KLSAgc3RydWN0IHRvcCB0aXRfb3BlcmFuZFtUSVRfTUFYX09QRVJBTkRTXTsJLyogT3BlcmFuZHMgKi8KLSAgY2hhciAqdGl0X2Vycm9yOwkJLyogIiIgb3IgZmF0YWwgZXJyb3IgdGV4dCAqLwotfTsKLQotLyogZW5kOiB0YWhvZS1pbnN0LmggKi8KLQotLyogdGFob2UuYyAtIHRhaG9lLXNwZWNpZmljIC0KLSAgIE5vdCBwYXJ0IG9mIGdhcyB5ZXQuCi0gICAqLwotCi0jaW5jbHVkZSAib3Bjb2RlL3RhaG9lLmgiCi0KLS8qIFRoaXMgaXMgdGhlIG51bWJlciB0byBwdXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYS5vdXQgZmlsZSAqLwotbG9uZyBvbWFnaWMgPSBPTUFHSUM7Ci0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgb3IgYSBxdW90ZWQgc3RyaW5nLiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIzsiOwotCi0vKiBUaGVzZSBjaGFycyBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIGFzIGluIDBmMTIzLjQ1NgotICAgb3IgICAgMGQxLjIzNEUtMTIgKHNlZSBleHAgY2hhcnMgYWJvdmUpCi0gICBOb3RlOiBUaGUgVGFob2UgcG9ydCBkb2Vzbid0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLiBUaGlzIGlzCi0gICAgICAgICBjb25zaXN0YW50IHdpdGggJ2FzJyBJZiBpdCdzIG5lZWRlZCwgSSBjYW4gYWx3YXlzIGFkZCBpdCBsYXRlci4gKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZGYiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuCi0gICAoVGhlIHRhaG9lIGhhcyBwbGVudHkgb2Ygcm9vbSwgc28gdGhlIGNoYW5nZSBjdXJyZW50bHkgaXNuJ3QgbmVlZGVkLikKLSAgICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGl0IHQ7CQkvKiBBIHRhaG9lIGluc3RydWN0aW9uIGFmdGVyIGRlY29kaW5nLiAqLwotCi12b2lkIGZsb2F0X2NvbnMgKCk7Ci0vKiBBIHRhYmxlIG9mIHBzZXVkbyBvcHMgKHNhbnMgLiksIHRoZSBmdW5jdGlvbiBjYWxsZWQsIGFuZCBhbiBpbnRlZ2VyIG9wCi0gICB0aGF0IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aC4gKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHswfQotfTsKLQwKLS8qCi0gKiBGb3IgVGFob2UsIHJlbGF0aXZlIGFkZHJlc3NlcyBvZiAianVzdCB0aGUgcmlnaHQgbGVuZ3RoIiBhcmUgcHJldHR5IGVhc3kuCi0gKiBUaGUgYnJhbmNoIGRpc3BsYWNlbWVudCBpcyBhbHdheXMgdGhlIGxhc3Qgb3BlcmFuZCwgZXZlbiBpbgotICogc3ludGhldGljIGluc3RydWN0aW9ucy4KLSAqIEZvciBUYWhvZSwgd2UgZW5jb2RlIHRoZSByZWxheF9zdWJzdGF0ZVRzIChpbiBlLmcuIGZyX3N1YnN0YXRlKSBhczoKLSAqCi0gKgkJICAgIDQgICAgICAgMyAgICAgICAyICAgICAgIDEgICAgICAgMAkgICAgIGJpdCBudW1iZXIKLSAqCS0tLS8gLy0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAqCQl8ICAgICB3aGF0IHN0YXRlID8JfCAgaG93IGxvbmcgPwl8Ci0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgotICogVGhlICJob3cgbG9uZyIgYml0cyBhcmUgMDA9Ynl0ZSwgMDE9d29yZCwgMTA9bG9uZy4KLSAqIFRoaXMgaXMgYSBVbip4IGNvbnZlbnRpb24uCi0gKiBOb3QgYWxsIGxlbmd0aHMgYXJlIGxlZ2l0IGZvciBhIGdpdmVuIHZhbHVlIG9mICh3aGF0IHN0YXRlKS4KLSAqIFRoZSBmb3VyIHN0YXRlcyBhcmUgbGlzdGVkIGJlbG93LgotICogVGhlICJob3cgbG9uZyIgcmVmZXJzIG1lcmVseSB0byB0aGUgZGlzcGxhY2VtZW50IGxlbmd0aC4KLSAqIFRoZSBhZGRyZXNzIHVzdWFsbHkgaGFzIHNvbWUgY29uc3RhbnQgYnl0ZXMgaW4gaXQgYXMgd2VsbC4KLSAqCi0KLVN0YXRlcyBmb3IgVGFob2UgYWRkcmVzcyByZWxheGluZy4KLTEuCVRBSE9FX1dJRFRIX0FMV0FZU19KVU1QICgtKQotCUZvcm1hdDogImItIgotCVRhaG9lIG9wY29kZXMgYXJlOgkoSGV4KQotCQlqcgkJMTEKLQkJamJyCQkxMQotCVNpbXBsZSBicmFuY2guCi0JQWx3YXlzLCAxIGJ5dGUgb3Bjb2RlLCB0aGVuIGRpc3BsYWNlbWVudC9hYnNvbHV0ZS4KLQlJZiB3b3JkIG9yIGxvbmd3b3JkLCBjaGFuZ2Ugb3Bjb2RlIHRvIGJydyBvciBqbXAuCi0KLQkKLTIuCVRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVAgKD8pCi0JSjxjb25kPiB3aGVyZSA8Y29uZD4gaXMgYSBzaW1wbGUgZmxhZyB0ZXN0LgotCUZvcm1hdDogImI/IgotCVRhaG9lIG9wY29kZXMgYXJlOgkoSGV4KQotCQlqbmVxL2puZXF1CTIxCi0JCWplcWwvamVxbHUJMzEKLQkJamd0cgkJNDEKLQkJamxlcQkJNTEKLQkJamdlcQkJODEKLQkJamxzcwkJOTEKLQkJamd0cnUJCWExCi0JCWpsZXF1CQliMQotCQlqdmMJCWMxCi0JCWp2cwkJZDEKLQkJamxzc3UvamNzCWUxCi0JCWpnZXF1L2pjYwlmMQotCUFsd2F5cywgeW91IGNvbXBsZW1lbnQgNHRoIGJpdCB0byByZXZlcnNlIHRoZSBjb25kaXRpb24uCi0JQWx3YXlzLCAxLWJ5dGUgb3Bjb2RlLCB0aGVuIDEtYnl0ZSBkaXNwbGFjZW1lbnQuCi0KLTMuCVRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUCAoISkKLQlKYmMvSmJzIHdoZXJlIGNvbmQgdGVzdHMgYSBtZW1vcnkgYml0LgotCUZvcm1hdDogInJsdmxiISIKLQlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKLQkJamJzCQkwZQotCQlqYmMJCTFlCi0JQWx3YXlzLCB5b3UgY29tcGxlbWVudCA0dGggYml0IHRvIHJldmVyc2UgdGhlIGNvbmRpdGlvbi4KLQlBbHdheXMsIDEtYnl0ZSBvcGNkZSwgbG9uZ3dvcmQsIGxvbmd3b3JkLWFkZHJlc3MsIDEtd29yZC1kaXNwbGFjZW1lbnQKLQotNC4JVEFIT0VfV0lEVEhfQklHX05PTl9SRVZfSlVNUCAoOikKLQlKYW9ibFhYL0pic3NpCi0JRm9ybWF0OiAicmxtbGI6IgotCVRhaG9lIG9wY29kZXMgYXJlOgkoSGV4KQotCQlhb2psc3MJCTJmCi0JCWphb2Jsc3MJCTJmCi0JCWFvamxlcQkJM2YKLQkJamFvYmxlcQkJM2YKLQkJamJzc2kJCTVmCi0JQWx3YXlzLCB3ZSBjYW5ub3QgcmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIGJyYW5jaDsgd2UgaGF2ZSBhIHdvcmQKLQlkaXNwbGFjZW1lbnQuCi0KLVdlIG5lZWQgdG8gbW9kaWZ5IHRoZSBvcGNvZGUgaXMgZm9yIGNsYXNzIDEsIDIgYW5kIDMgaW5zdHJ1Y3Rpb25zLgotQWZ0ZXIgcmVsYXgoKSB3ZSBtYXkgY29tcGxlbWVudCB0aGUgNHRoIGJpdCBvZiAyIG9yIDMgdG8gcmV2ZXJzZSBzZW5zZSBvZgotYnJhbmNoLgotCi1XZSBzb21ldGltZXMgc3RvcmUgY29udGV4dCBpbiB0aGUgb3BlcmFuZCBsaXRlcmFsLiBUaGlzIHdheSB3ZSBjYW4gZmlndXJlIG91dAotYWZ0ZXIgcmVsYXgoKSB3aGF0IHRoZSBvcmlnaW5hbCBhZGRyZXNzaW5nIG1vZGUgd2FzLiAoV2FzIGlzIHBjX3JlbCwgb3IKLXBjX3JlbF9kaXNwPyBUaGF0IHNvcnQgb2YgdGhpbmcuKSAqLwotDAotLyogVGhlc2UgZGlzcGxhY2VtZW50cyBhcmUgcmVsYXRpdmUgdG8gdGhlIFNUQVJUIGFkZHJlc3Mgb2YgdGhlCi0gICBkaXNwbGFjZW1lbnQgd2hpY2ggaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkaXNwbGFjZW1lbnQsIG5vdCB0aGUgZW5kIG9mCi0gICB0aGUgaW5zdHJ1Y3Rpb24uIFRoZSBoYXJkd2FyZSBwY19yZWwgaXMgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb25zLgotICAgVGhhdCdzIHdoeSBhbGwgdGhlIGRpc3BsYWNlbWVudHMgaGF2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBkaXNwbGFjZW1lbnQgYWRkZWQKLSAgIHRvIHRoZW0uIChXRiArIGxlbmd0aCh3b3JkKSkKLQotICAgVGhlIGZpcnN0IGxldHRlciBpcyBCeXRlLCBXb3JkLgotICAgMm5kIGxldHRlciBpcyBGb3J3YXJkLCBCYWNrd2FyZC4gKi8KLSNkZWZpbmUgQkYgKDErIDEyNykKLSNkZWZpbmUgQkIgKDErLTEyOCkKLSNkZWZpbmUgV0YgKDIrIDMyNzY3KQotI2RlZmluZSBXQiAoMistMzI3NjgpCi0vKiBEb250IG5lZWQgTEYsIExCIGJlY2F1c2UgdGhleSBhbHdheXMgcmVhY2guIFtUaGV5IGFyZSBjb2RlZCBhcyAwLl0gKi8KLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLS8qIFRoaXMgbWFjcm8gaGFzIG5vIHNpZGUtZWZmZWN0cy4gKi8KLSNkZWZpbmUgRU5DT0RFX1JFTEFYKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQotI2RlZmluZSBSRUxBWF9TVEFURSh3aGF0KSAoKHdoYXQpID4+IDIpCi0jZGVmaW5lIFJFTEFYX0xFTkdUSChsZW5ndGgpICgobGVuZ3RoKSAmJiAzKQotCi0jZGVmaW5lIFNUQVRFX0FMV0FZU19CUkFOQ0ggICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCAgICAgICAgKDIpCi0jZGVmaW5lIFNUQVRFX0JJR19SRVZfQlJBTkNIICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCAgICAgICAgKDQpCi0jZGVmaW5lIFNUQVRFX1BDX1JFTEFUSVZFCQkoNSkKLQotI2RlZmluZSBTVEFURV9CWVRFICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBTVEFURV9XT1JEICAgICAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBTVEFURV9MT05HICAgICAgICAgICAgICAgICAgICAgICgyKQotI2RlZmluZSBTVEFURV9VTkRGICAgICAgICAgICAgICAgICAgICAgICgzKQkvKiBTeW1ib2wgdW5kZWZpbmVkIGluIHBhc3MxICovCi0KLS8qIFRoaXMgaXMgdGhlIHRhYmxlIHVzZWQgYnkgZ2FzIHRvIGZpZ3VyZSBvdXQgcmVsYXhpbmcgbW9kZXMuIFRoZSBmaWVsZHMgYXJlCi0gICBmb3J3YXJkX2JyYW5jaCByZWFjaCwgYmFja3dhcmRfYnJhbmNoIHJlYWNoLCBudW1iZXIgb2YgYnl0ZXMgaXQgd291bGQgdGFrZSwKLSAgIHdoZXJlIHRoZSBuZXh0IGJpZ2dlc3QgYnJhbmNoIGlzLiAqLwotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIGVycm9yIHNlbnRpbmVsICAgMCwwCSovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMCwxCSovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMCwyCSovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMCwzCSovCi0vKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCBjYXNlcyAianJiIgotICAgICBUaGUgcmVsYXggcGFydCBpcyB0aGUgYWN0dWFsIGRpc3BsYWNlbWVudCAqLwotICB7Ci0gICAgQkYsIEJCLCAxLCBDICgxLCAxKQotICB9LAkJCQkvKiBicmIgQmBmb28JICAgIDEsMCAqLwotICB7Ci0gICAgV0YsIFdCLCAyLCBDICgxLCAyKQotICB9LAkJCQkvKiBicncgV2Bmb28JICAgIDEsMSAqLwotICB7Ci0gICAgMCwgMCwgNSwgMAotICB9LAkJCQkvKiBKbXAgTGBmb28JICAgIDEsMiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDEsMyAqLwotLyogUmV2ZXJzaWJsZSBDb25kaXRpb25hbCBCcmFuY2guIElmIHRoZSBicmFuY2ggd29uJ3QgcmVhY2gsIHJldmVyc2UKLSAgICAgaXQsIGFuZCBqdW1wIG92ZXIgYSBicncgb3IgYSBqbXAgdGhhdCB3aWxsIHJlYWNoLiBUaGUgcmVsYXggcGFydCBpcyB0aGUKLSAgICAgYWN0dWFsIGFkZHJlc3MuICovCi0gIHsKLSAgICBCRiwgQkIsIDEsIEMgKDIsIDEpCi0gIH0sCQkJCS8qIGI8Y29uZD4gQmBmb28gICAgMiwwICovCi0gIHsKLSAgICBXRiArIDIsIFdCICsgMiwgNCwgQyAoMiwgMikKLSAgfSwJCQkJLyogYnJldiBvdmVyLCBicncgV2Bmb28sIG92ZXI6IDIsMSAqLwotICB7Ci0gICAgMCwgMCwgNywgMAotICB9LAkJCQkvKiBicmV2IG92ZXIsIGptcCBMYGZvbywgb3ZlcjogMiwyICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMiwzICovCi0vKiBBbm90aGVyIHR5cGUgb2YgcmV2ZXJzYWJsZSBicmFuY2guIEJ1dCB0aGlzIG9ubHkgaGFzIGEgd29yZAotICAgICBkaXNwbGFjZW1lbnQuICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMywwICovCi0gIHsKLSAgICBXRiwgV0IsIDIsIEMgKDMsIDIpCi0gIH0sCQkJCS8qIGpiWCBXYGZvbwkgICAgMywxICovCi0gIHsKLSAgICAwLCAwLCA4LCAwCi0gIH0sCQkJCS8qIGpyZXZYIG92ZXIsIGptcCBMYGZvbywgb3ZlcjogIDMsMiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDMsMyAqLwotLyogVGhlc2UgYXJlIHRoZSBub24gcmV2ZXJzYWJsZSBicmFuY2hlcywgYWxsIG9mIHdoaWNoIGhhdmUgYSB3b3JkCi0gICAgIGRpc3BsYWNlbWVudC4gSWYgSSBjYW4ndCByZWFjaCwgYnJhbmNoIG92ZXIgYSBieXRlIGJyYW5jaCwgdG8gYQotICAgICBqdW1wIHRoYXQgd2lsbCByZWFjaC4gVGhlIGp1bXBlZCBicmFuY2gganVtcHMgb3ZlciB0aGUgcmVhY2hpbmcKLSAgICAgYnJhbmNoLCB0byBjb250aW51ZSB3aXRoIHRoZSBmbG93IG9mIHRoZSBwcm9ncmFtLiBJdCdzIGxpa2UgcGxheWluZwotICAgICBsZWFwIGZyb2cuICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgNCwwICovCi0gIHsKLSAgICBXRiwgV0IsIDIsIEMgKDQsIDIpCi0gIH0sCQkJCS8qIGFvYmxfIFdgZm9vCSAgICA0LDEgKi8KLSAgewotICAgIDAsIDAsIDEwLCAwCi0gIH0sCQkJCS8qYW9ibF8gV2Bob3AsYnIgb3Zlcixob3A6IGptcCBMXmZvbyxvdmVyIDQsMiovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgNCwzICovCi0vKiBOb3JtYWwgZGlzcGxhY2VtZW50IG1vZGUsIG5vIGp1bXBpbmcgb3IgYW55dGhpbmcgbGlrZSB0aGF0LgotICAgICBUaGUgcmVsYXggcG9pbnRzIHRvIG9uZSBieXRlIGJlZm9yZSB0aGUgYWRkcmVzcywgdGhhdHMgd2h5IGFsbAotICAgICB0aGUgbnVtYmVycyBhcmUgdXAgYnkgb25lLiAqLwotICB7Ci0gICAgQkYgKyAxLCBCQiArIDEsIDIsIEMgKDUsIDEpCi0gIH0sCQkJCS8qIEJeImZvbyIJICAgIDUsMCAqLwotICB7Ci0gICAgV0YgKyAxLCBXQiArIDEsIDMsIEMgKDUsIDIpCi0gIH0sCQkJCS8qIFdeImZvbyIJICAgIDUsMSAqLwotICB7Ci0gICAgMCwgMCwgNSwgMAotICB9LAkJCQkvKiBMXiJmb28iCSAgICA1LDIgKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICA1LDMgKi8KLX07Ci0KLSN1bmRlZiBDCi0jdW5kZWYgQkYKLSN1bmRlZiBCQgotI3VuZGVmIFdGCi0jdW5kZWYgV0IKLS8qIEVuZCByZWxheCBzdHVmZiAqLwotDAotLyogSGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZS4gIE5VTEwgbWVhbnMgYW55IHVzZSBiZWZvcmUKLSAgIG1kX2JlZ2luKCkgd2lsbCBjcmFzaC4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLQotLyogSW5pdCBmdW5jdGlvbi4gQnVpbGQgdGhlIGhhc2ggdGFibGUuICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBzdHJ1Y3QgdG90ICp0UDsKLSAgY2hhciAqZXJyb3J2YWwgPSAwOwotICBpbnQgc3ludGhldGljX3RvbyA9IDE7CS8qIElmIDAsIGp1c3QgdXNlIHJlYWwgb3Bjb2Rlcy4gKi8KLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgZm9yICh0UCA9IHRvdHN0cnM7ICp0UC0+bmFtZSAmJiAhZXJyb3J2YWw7IHRQKyspCi0gICAgZXJyb3J2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgdFAtPm5hbWUsICZ0UC0+ZGV0YWlsKTsKLQotICBpZiAoc3ludGhldGljX3RvbykKLSAgICBmb3IgKHRQID0gc3ludGhldGljX3RvdHN0cnM7ICp0UC0+bmFtZSAmJiAhZXJyb3J2YWw7IHRQKyspCi0gICAgICBlcnJvcnZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB0UC0+bmFtZSwgJnRQLT5kZXRhaWwpOwotCi0gIGlmIChlcnJvcnZhbCkKLSAgICBhc19mYXRhbCAoZXJyb3J2YWwpOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImFkOlNUdDpWIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdhJzoKLSAgICAgIGFzX3dhcm4gKF8oIlRoZSAtYSBvcHRpb24gZG9lc24ndCBleGlzdC4gKERlc3BpdGUgd2hhdCB0aGUgbWFuIHBhZ2Ugc2F5cyEiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgYXNfd2FybiAoXygiRGlzcGxhY2VtZW50IGxlbmd0aCAlcyBpZ25vcmVkISIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgIGFzX3dhcm4gKF8oIlNZTUJPTCBUQUJMRSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgYXNfd2FybiAoXygiVE9LRU4gVFJBQ0Ugbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgbmVlZCBvciB1c2UgdGVtcC4gZmlsZSBcIiVzXCIuIiksIGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgYXNfd2FybiAoXygiSSBkb24ndCB1c2UgYW4gaW50ZXJwYXNzIGZpbGUhIC1WIGlnbm9yZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotVGFob2Ugb3B0aW9uczpcblwKLS1hCQkJaWdub3JlZFxuXAotLWQgTEVOR1RICQlpZ25vcmVkXG5cCi0tSgkJCWlnbm9yZWRcblwKLS1TCQkJaWdub3JlZFxuXAotLXQgRklMRQkJCWlnbm9yZWRcblwKLS1UCQkJaWdub3JlZFxuXAotLVYJCQlpZ25vcmVkXG4iKSk7Ci19Ci0MCi0vKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiB0YWtlIG51bWJlcnMgaW4gdGhlIG1hY2hpbmUgZm9ybWF0LCBhbmQKLSAgIG11bmdlcyB0aGVtIGludG8gVGFob2UgYnl0ZSBvcmRlci4KLSAgIFRoZXkgZXhpc3QgcHJpbWFyaWx5IGZvciBjcm9zcyBhc3NlbWJseSBwdXJwb3NlLiAqLwotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgdmFsdWVUIHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLSNpZmRlZiBjb21tZW50Ci12b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCi1tZF9udW1iZXJfdG9faW1tIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgbG9uZyBpbnQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpOwotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi12b2lkCi10Y19hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIC8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgKi8KLSAga25vdyAoMCk7Ci19Ci0KLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX251bWJlcl90b19kaXNwIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgbG9uZyBpbnQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpOwotfQotCi12b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCi1tZF9udW1iZXJfdG9fZmllbGQgKGNvbiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciBjb25bXTsJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICBsb25nIGludCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLS8qIFB1dCB0aGUgYml0cyBpbiBhbiBvcmRlciB0aGF0IGEgdGFob2Ugd2lsbCB1bmRlcnN0YW5kLCBkZXNwaXRlIHRoZSBvcmRlcmluZwotICAgb2YgdGhlIG5hdGl2ZSBtYWNoaW5lLgotICAgT24gVGFob2U6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBiaWcgZW5kaWFuIGxvbmcsCi0gICBuZXh0IHRocmVlIGJ5dGVzIGFyZSBzeW1ib2xudW0sIGluIGtpbmQgb2YgMyBieXRlIGJpZyBlbmRpYW4gKGxlYXN0IHNpZy4gYnl0ZSBsYXN0KS4KLSAgIFRoZSBsYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGggYml0IDcgYXMgcGNyZWwsCi0gICAJYml0cyA2ICYgNSBhcyBsZW5ndGgsCi0JYml0IDQgYXMgZXh0ZXJuIGFuZCB0aGUgbGFzdCBuaWJibGUgYXMgJ3VuZGVmaW5lZCcuICovCi0KLSNpZiBjb21tZW50Ci12b2lkCi1tZF9yaV90b19jaGFycyAocmlfcCwgcmkpCi0gICAgIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJpX3AsIHJpOwotewotICBieXRlIHRoZV9ieXRlc1tzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pXTsKLSAgLyogVGhlIHJlYXNvbiBJIGNhbid0IGp1c3QgZW5jb2RlIHRoZXNlIGRpcmVjdGx5IGludG8gcmlfcCBpcyB0aGF0Ci0gICAgIHJpX3AgbWF5IHBvaW50IHRvIHJpLiAqLwotCi0gIC8qIFRoaXMgaXMgZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkucl9hZGRyZXNzLCBzaXplb2YgKHJpLnJfYWRkcmVzcykpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIHRoZV9ieXRlc1s0XSA9IChyaS5yX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzVdID0gKHJpLnJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s2XSA9IHJpLnJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s3XSA9ICgoKHJpLnJfZXh0ZXJuIDw8IDQpICYgMHgxMCkgfCAoKHJpLnJfbGVuZ3RoIDw8IDUpICYgMHg2MCkgfAotCQkgICgocmkucl9wY3JlbCA8PCA3KSAmIDB4ODApKSAmIDB4ZjA7Ci0KLSAgYmNvcHkgKHRoZV9ieXRlcywgKGNoYXIgKikgcmlfcCwgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLS8qIFB1dCB0aGUgYml0cyBpbiBhbiBvcmRlciB0aGF0IGEgdGFob2Ugd2lsbCB1bmRlcnN0YW5kLCBkZXNwaXRlIHRoZSBvcmRlcmluZwotICAgb2YgdGhlIG5hdGl2ZSBtYWNoaW5lLgotICAgT24gVGFob2U6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBiaWcgZW5kaWFuIGxvbmcsCi0gICBuZXh0IHRocmVlIGJ5dGVzIGFyZSBzeW1ib2xudW0sIGluIGtpbmQgb2YgMyBieXRlIGJpZyBlbmRpYW4gKGxlYXN0IHNpZy4gYnl0ZSBsYXN0KS4KLSAgIFRoZSBsYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGggYml0IDcgYXMgcGNyZWwsCi0gICAJYml0cyA2ICYgNSBhcyBsZW5ndGgsCi0JYml0IDQgYXMgZXh0ZXJuIGFuZCB0aGUgbGFzdCBuaWJibGUgYXMgJ3VuZGVmaW5lZCcuICovCi0KLXZvaWQgCi10Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoaXNfcGNyZWwgKGZpeFApIDw8IDcpICYgMHg4MCkKLQkgICAgICB8ICgoKChmaXhQLT5meF90eXBlID09IEZYXzggfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDgKLQkJICAgID8gMAotCQkgICAgOiAoZml4UC0+ZnhfdHlwZSA9PSBGWF8xNiB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMMTYKLQkJICAgICAgID8gMQotCQkgICAgOiAoZml4UC0+ZnhfdHlwZSA9PSBGWF8zMiB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMMzIKLQkJICAgICAgID8gMgotCQkgICAgICAgOiA0MikpKSkgPDwgNSkgJiAweDYwKQotCSAgICAgIHwgKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkgPDwgNCkgJiAweDEwKSk7Ci19Ci0KLS8qIFJlbG9jYXRlIGJ5dGUgc3R1ZmYgKi8KLQwKLS8qIFRoaXMgaXMgZm9yIGJyb2tlbiB3b3JkLiAqLwotY29uc3QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDM7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDEpOwotICAqcHRyKysgPSBUQUhPRV9CUlc7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCBvZmZzZXQsIDIpOwotfQotCi1jb25zdCBpbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA2OwotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgNCk7Ci0gICpwdHIrKyA9IFRBSE9FX0pNUDsKLSAgKnB0cisrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCBvZmZzZXQsIDQpOwotfQotDAotLyoKLSAqCQkJbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKQotICoKLSAqIENhbGxlZCBqdXN0IGJlZm9yZSByZWxheCgpLgotICogQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQsIHNvIHdlIGFzc3VtZWQKLSAqIHRoYXQgaXQgd2lsbCBiZSByZXNvbHZlZCBieSB0aGUgbGlua2VyLgotICogUmV0dXJuIHRoZSBjb3JyZWN0IGZyX3N1YnR5cGUgaW4gdGhlIGZyYWcsIGZvciByZWxheCgpCi0gKiBSZXR1cm4gdGhlIGluaXRpYWwgImd1ZXNzIGZvciBmcl92YXIiIHRvIGNhbGxlci4gKEhvdyBiaWcgSSB0aGluayB0aGlzCi0gKiB3aWxsIGJlLikKLSAqIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KLSAqIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCi0gKiBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCi0gKiAwIHZhbHVlLgotICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudF90eXBlOwkJLyogTl9EQVRBIG9yIE5fVEVYVC4gKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgaW50IG9sZF9mcl9maXg7Ci0gIC8qICBpbnQgcGNfcmVsOyBGSVhNRTogcmVtb3ZlIHRoaXMgKi8KLQotICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgLyogVGhlIHN5bWJvbCB3YXMgaW4gdGhlIHNhbWUgc2VnbWVudCBhcyB0aGUgb3Bjb2RlLCBhbmQgaXQncwotCSBhIHJlYWwgcGNfcmVsIGNhc2Ugc28gaXQncyBhIHJlbGF4YWJsZSBjYXNlLiAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBjYXNlIGlzIHN0aWxsIHVuZGVmaW5lZCwgc28gYXN1bWUgaXQncyBhIGxvbmcgd29yZCBmb3IgdGhlCi0JIGxpbmtlciB0byBmaXguICovCi0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKnAgfD0gVEFIT0VfUENfT1JfTE9ORzsKLQkgIC8qIFdlIG5vdyBrbm93IGhvdyBiaWcgaXQgd2lsbCBiZSwgb25lIGxvbmcgd29yZC4gKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSBePSAweDEwOwkvKiBSZXZlcnNlIHNlbnNlIG9mIGJyYW5jaC4gKi8KLQkgICpwKysgPSA2OwotCSAgKnArKyA9IFRBSE9FX0pNUDsKLQkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDEgKyAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMywgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0KLQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSBePSAweDEwOwkvKiBSZXZlcnNlIHNlbnNlIG9mIGJyYW5jaC4gKi8KLQkgICpwKysgPSAwOwotCSAgKnArKyA9IDY7Ci0JICAqcCsrID0gVEFIT0VfSk1QOwotCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAyICsgMiArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqcCsrID0gMjsKLQkgICpwKysgPSAwOwotCSAgKnArKyA9IFRBSE9FX0JSQjsKLQkgICpwKysgPSA2OwotCSAgKnArKyA9IFRBSE9FX0pNUDsKLQkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLQkgIGZyYWdQLT5mcl9maXggKz0gMiArIDIgKyAyICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgNiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgPSBUQUhPRV9KTVA7Ci0JICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0MCi0vKgotICoJCQltZF9jb252ZXJ0X2ZyYWcoKTsKLSAqCi0gKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KLSAqIEluOglBZGRyZXNzIG9mIGZyYWcuCi0gKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCi0gKgotICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgotICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICByZWdpc3RlciBjaGFyICphZGRyZXNzUDsJLyogLT4gX3ZhciB0byBjaGFuZ2UuICovCi0gIHJlZ2lzdGVyIGNoYXIgKm9wY29kZVA7CS8qIC0+IG9wY29kZSBjaGFyKHMpIHRvIGNoYW5nZS4gKi8KLSAgcmVnaXN0ZXIgc2hvcnQgaW50IGxlbmd0aF9jb2RlOwkvKiAyPWxvbmcgMT13b3JkIDA9Ynl0ZSAqLwotICByZWdpc3RlciBzaG9ydCBpbnQgZXh0ZW5zaW9uID0gMDsJLyogU2l6ZSBvZiByZWxheGVkIGFkZHJlc3MuCi0JCQkJICAgQWRkZWQgdG8gZnJfZml4OiBpbmNsLiBBTEwgdmFyIGNoYXJzLiAqLwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICByZWdpc3RlciBsb25nIGludCB3aGVyZTsKLSAgcmVnaXN0ZXIgbG9uZyBpbnQgYWRkcmVzc19vZl92YXI7Ci0gIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBpcyBfdmFyIG9mICpmcmFnUD8gKi8KLSAgcmVnaXN0ZXIgbG9uZyBpbnQgdGFyZ2V0X2FkZHJlc3M7Ci0gIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBkb2VzIGFkZHIgcG9pbnQ/ICovCi0KLSAga25vdyAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQpOwotICBsZW5ndGhfY29kZSA9IFJFTEFYX0xFTkdUSCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotICBrbm93IChsZW5ndGhfY29kZSA+PSAwICYmIGxlbmd0aF9jb2RlIDwgMyk7Ci0gIHdoZXJlID0gZnJhZ1AtPmZyX2ZpeDsKLSAgYWRkcmVzc1AgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICBvcGNvZGVQID0gZnJhZ1AtPmZyX29wY29kZTsKLSAgc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0gIGtub3cgKHN5bWJvbFApOwotICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gIGFkZHJlc3Nfb2ZfdmFyID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZTsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKToKLSAgICAgIC8qICphZGRyZXNzUCBob2xkcyB0aGUgcmVnaXN0ZXJzIG51bWJlciwgcGx1cyAweDEwLCBpZiBpdCdzIGRlZmVycmVkCi0gICAgICAgbW9kZS4gVG8gc2V0IHVwIHRoZSByaWdodCBtb2RlLCBqdXN0IE9SIHRoZSBzaXplIG9mIHRoaXMgZGlzcGxhY2VtZW50ICovCi0gICAgICAvKiBCeXRlIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgICphZGRyZXNzUCsrIHw9IFRBSE9FX1BDX09SX0JZVEU7Ci0gICAgICAqYWRkcmVzc1AgPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9XT1JEKToKLSAgICAgIC8qIFdvcmQgZGlzcGxhY2VtZW50LiAqLwotICAgICAgKmFkZHJlc3NQKysgfD0gVEFIT0VfUENfT1JfV09SRDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMyksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9MT05HKToKLSAgICAgIC8qIExvbmcgd29yZCBkaXNwbGFjZW1lbnQuICovCi0gICAgICAqYWRkcmVzc1ArKyB8PSBUQUhPRV9QQ19PUl9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA1KSwgNCk7Ci0gICAgICBleHRlbnNpb24gPSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9CWVRFKToKLSAgICAgICphZGRyZXNzUCA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7Ci0gICAgICBleHRlbnNpb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgICpvcGNvZGVQIF49IDB4MTA7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCi0gICAgICAqYWRkcmVzc1ArKyA9IDM7CQkvKiBKdW1wIG92ZXIgd29yZCBicmFuY2ggKi8KLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfQlJXOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA0KSwgMik7Ci0gICAgICBleHRlbnNpb24gPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9MT05HKToKLSAgICAgICpvcGNvZGVQIF49IDB4MTA7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCi0gICAgICAqYWRkcmVzc1ArKyA9IDY7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0pNUDsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSA3OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk6Ci0gICAgICAqYWRkcmVzc1AgPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOwotICAgICAgZXh0ZW5zaW9uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgKm9wY29kZVAgPSBUQUhPRV9CUlc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9MT05HKToKLSAgICAgICpvcGNvZGVQID0gVEFIT0VfSk1QOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNSksIDQpOwotICAgICAgZXh0ZW5zaW9uID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMiksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILCBTVEFURV9MT05HKToKLSAgICAgICpvcGNvZGVQIF49IDB4MTA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IDA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IDY7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0pNUDsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMiksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICAqYWRkcmVzc1ArKyA9IDA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IDI7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0JSQjsKLSAgICAgICphZGRyZXNzUCsrID0gNjsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfSk1QOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19CQkJCS8qIG1kX2NvbnZlcnRfZnJhZyAqLwotDAotCi0vKiBUaGlzIGlzIHRoZSBzdHVmZiBmb3IgbWRfYXNzZW1ibGUuICovCi0jZGVmaW5lIEZQX1JFRyAxMwotI2RlZmluZSBTUF9SRUcgMTQKLSNkZWZpbmUgUENfUkVHIDE1Ci0jZGVmaW5lIEJJR0dFU1RSRUcgUENfUkVHCi0KLS8qCi0gKiBQYXJzZSB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgU1RBUlQKLSAqIElmIGl0IHJlcHJlc2VudHMgYSB2YWxpZCByZWdpc3RlciwgcG9pbnQgU1RBUlQgdG8gdGhlIGNoYXJhY3RlciBhZnRlcgotICogdGhlIGxhc3QgdmFsaWQgcmVnaXN0ZXIgY2hhciwgYW5kIHJldHVybiB0aGUgcmVnaXN0ZXIgbnVtYmVyICgwLTE1KS4KLSAqIElmIGludmFsaWQsIGxlYXZlIFNUQVJUIGFsb25lLCByZXR1cm4gLTEuCi0gKiBUaGUgZm9ybWF0IGhhcyB0byBiZSBleGFjdC4gSSBkb24ndCBkbyB0aGluZ3MgbGlrZSBlYXQgbGVhZGluZyB6ZXJvcwotICogb3IgdGhlIGxpa2UuCi0gKiBOb3RlOiBUaGlzIGRvZXNuJ3QgY2hlY2sgZm9yIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIG1ha2luZwotICogdGhpcyBpbnZhbGlkLiBFeDogUjEyMyB3b3VsZCByZXR1cm4gMTIsIGl0J3MgdGhlIGNhbGxlcnMgam9iIHRvIGNoZWNrCi0gKiB3aGF0IHN0YXJ0IGlzIHBvaW50IHRvIGFwb24gcmV0dXJuLgotICoKLSAqIFZhbGlkIHJlZ2lzdGVycyBhcmUgUjEtUjE1LCAlMS0lMTUsIEZQICgxMyksIFNQICgxNCksIFBDICgxNSkKLSAqIENhc2UgZG9lc24ndCBtYXR0ZXIuCi0gKi8KLWludAotdGFob2VfcmVnX3BhcnNlIChzdGFydCkKLSAgICAgY2hhciAqKnN0YXJ0OwkJLyogQSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gcGFyc2UuICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJlZ3BvaW50ID0gKnN0YXJ0OwotICByZWdpc3RlciBpbnQgcmVnbnVtID0gLTE7Ci0KLSAgc3dpdGNoICgqcmVncG9pbnQrKykKLSAgICB7Ci0gICAgY2FzZSAnJSc6CQkJLyogUmVnaXN0ZXJzIGNhbiBzdGFydCB3aXRoIGEgJSwKLQkJCQkgICBSIG9yIHIsIGFuZCB0aGVuIGEgbnVtYmVyLiAqLwotICAgIGNhc2UgJ1InOgotICAgIGNhc2UgJ3InOgotICAgICAgaWYgKGlzZGlnaXQgKCpyZWdwb2ludCkpCi0JewotCSAgLyogR290IHRoZSBmaXJzdCBkaWdpdC4gKi8KLQkgIHJlZ251bSA9ICpyZWdwb2ludCsrIC0gJzAnOwotCSAgaWYgKChyZWdudW0gPT0gMSkgJiYgaXNkaWdpdCAoKnJlZ3BvaW50KSkKLQkgICAgewotCSAgICAgIC8qIEl0cyBhIHR3byBkaWdpdCBudW1iZXIuICovCi0JICAgICAgcmVnbnVtID0gMTAgKyAoKnJlZ3BvaW50KysgLSAnMCcpOwotCSAgICAgIGlmIChyZWdudW0gPiBCSUdHRVNUUkVHKQotCQl7CQkvKiBOdW1iZXIgdG9vIGJpZz8gKi8KLQkJICByZWdudW0gPSAtMTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRic6CQkJLyogSXMgaXQgdGhlIEZQICovCi0gICAgY2FzZSAnZic6Ci0gICAgICBzd2l0Y2ggKCpyZWdwb2ludCsrKQotCXsKLQljYXNlICdwJzoKLQljYXNlICdQJzoKLQkgIHJlZ251bSA9IEZQX1JFRzsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoJCQkvKiBIb3cgYWJvdXQgdGhlIFNQICovCi0gICAgY2FzZSAnUyc6Ci0gICAgICBzd2l0Y2ggKCpyZWdwb2ludCsrKQotCXsKLQljYXNlICdwJzoKLQljYXNlICdQJzoKLQkgIHJlZ251bSA9IFNQX1JFRzsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdwJzoJCQkvKiBPUiB0aGUgUEMgZXZlbiAqLwotICAgIGNhc2UgJ1AnOgotICAgICAgc3dpdGNoICgqcmVncG9pbnQrKykKLQl7Ci0JY2FzZSAnYyc6Ci0JY2FzZSAnQyc6Ci0JICByZWdudW0gPSBQQ19SRUc7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChyZWdudW0gIT0gLTEpCi0gICAgewkJCQkvKiBObyBlcnJvciwgc28gbW92ZSBzdHJpbmcgcG9pbnRlciAqLwotICAgICAgKnN0YXJ0ID0gcmVncG9pbnQ7Ci0gICAgfQotICByZXR1cm4gcmVnbnVtOwkJLyogUmV0dXJuIHJlc3VsdHMgKi8KLX0JCQkJLyogdGFob2VfcmVnX3BhcnNlICovCi0MCi0vKgotICogVGhpcyBjaG9wcyB1cCBhbiBvcGVyYW5kIGFuZCBmaWd1cmVzIG91dCBpdHMgbW9kZXMgYW5kIHN0dWZmLgotICogSXQncyBhIGxpdHRsZSB0b3VjaHkgYWJvdXQgZXh0cmEgY2hhcmFjdGVycy4KLSAqIE9wdGV4IHRvIHN0YXJ0IHdpdGggb25lIGV4dHJhIGNoYXJhY3RlciBzbyBpdCBjYW4gYmUgb3ZlcndyaXR0ZW4gZm9yCi0gKiB0aGUgYmFja3dhcmQgcGFydCBvZiB0aGUgcGFyc2luZy4KLSAqIFlvdSBjYW4ndCBwdXQgYSBidW5jaCBvZiBleHRyYSBjaGFyYWN0ZXJzIGluIHNpZGUgdG8KLSAqIG1ha2UgdGhlIGNvbW1hbmQgbG9vayBjdXRlLiBpZTogKiBmb28gKCByMSApIFsgIHIwIF0KLSAqIElmIHlvdSBsaWtlIGRvaW5nIGEgbG90IG9mIHR5cGluZywgdHJ5IENPQk9MIQotICogQWN0dWFsbHksIHRoaXMgcGFyc2VyIGlzIGEgbGl0dGxlIHdlYWsgYWxsIGFyb3VuZC4gSXQncyBkZXNpZ25lZCB0byBiZQotICogdXNlZCB3aXRoIGNvbXBsaWVycywgc28gSSBlbXBoaXNpc2UgY29ycmVjdCBkZWNvZGluZyBvZiB2YWxpZCBjb2RlIHF1aWNrbHkKLSAqIHJhdGhlciB0aGF0IGNhdGNoaW5nIGV2ZXJ5IHBvc3NhYmxlIGVycm9yLgotICogTm90ZTogVGhpcyB1c2VzIHRoZSBleHByZXNzaW9uIGZ1bmN0aW9uLCBzbyBzYXZlIGlucHV0X2xpbmVfcG9pbnRlciBiZWZvcmUKLSAqIGNhbGxpbmcuCi0gKgotICogU3BlcnJ5IGRlZmluZXMgdGhlIHNlbWFudGljcyBvZiBhZGRyZXNzIG1vZGVzIChhbmQgdmFsdWVzKQotICogYnkgYSB0d28tbGV0dGVyIGNvZGUsIGV4cGxhaW5lZCBoZXJlLgotICoKLSAqICAgbGV0dGVyIDE6ICAgYWNjZXNzIHR5cGUKLSAqCi0gKiAgICAgYSAgICAgICAgIGFkZHJlc3MgY2FsY3VsYXRpb24gLSBubyBkYXRhIGFjY2VzcywgcmVnaXN0ZXJzIGZvcmJpZGRlbgotICogICAgIGIgICAgICAgICBicmFuY2ggZGlzcGxhY2VtZW50Ci0gKiAgICAgbSAgICAgICAgIHJlYWQgLSBsZXQgZ28gb2YgYnVzIC0gd3JpdGUgYmFjayAibW9kaWZ5IgotICogICAgIHIgICAgICAgICByZWFkCi0gKiAgICAgdyAgICAgICAgIHdyaXRlCi0gKiAgICAgdiAgICAgICAgIGJpdCBmaWVsZCBhZGRyZXNzOiBsaWtlICdhJyBidXQgcmVnaXN0ZXJzIGFyZSBPSwotICoKLSAqICAgbGV0dGVyIDI6ICAgZGF0YSB0eXBlIChpLmUuIHdpZHRoLCBhbGlnbm1lbnQpCi0gKgotICogICAgIGIgICAgICAgICBieXRlCi0gKiAgICAgdyAgICAgICAgIHdvcmQKLSAqICAgICBsICAgICAgICAgbG9uZ3dvcmQKLSAqICAgICBxICAgICAgICAgcXVhZHdvcmQgKEV2ZW4gcmVncyA8IDE0IGFsbG93ZWQpIChpZiAxMiwgeW91IGdldCBhIHdhcm5pbmcpCi0gKiAgICAgLQkgdW5jb25kaXRpb25hbCBzeW50aGV0aWMgamJyIG9wZXJhbmQKLSAqICAgICA/CSBzaW1wbGUgc3ludGhldGljIHJldmVyc2FibGUgYnJhbmNoIG9wZXJhbmQKLSAqICAgICAhCSBjb21wbGV4IHN5bnRoZXRpYyByZXZlcnNhYmxlIGJyYW5jaCBvcGVyYW5kCi0gKiAgICAgOgkgY29tcGxleCBzeW50aGV0aWMgbm9uLXJldmVyc2FibGUgYnJhbmNoIG9wZXJhbmQKLSAqCi0gKiBUaGUgJy0/ITonIGxldHRlciAyJ3MgYXJlIG5vdCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24uIFRoZXkgYXJlIHVzZWQKLSAqIGJ5IEdBUyBmb3IgcHN1ZWRvIG9wcyByZWxheGluZyBjb2RlLgotICoKLSAqIEFmdGVyIHBhcnNpbmcgdG9wUCBoYXM6Ci0gKgotICogICB0b3BfbmR4OiAgICAgICAgLTEsIG9yIHRoZSBpbmRleCByZWdpc3Rlci4gZWcgNz1bUjddCi0gKiAgIHRvcF9yZWc6ICAgICAgICAtMSwgb3IgcmVnaXN0ZXIgbnVtYmVyLiBlZyA3ID0gUjcgb3IgKFI3KQotICogICB0b3BfbW9kZTogICAgICAgVGhlIGFkZHJlc3NpbmcgbW9kZSBieXRlLiBUaGlzIGJ5dGUsIGRlZmluZXMgd2hpY2ggb2YKLSAqICAgICAgICAgICAgICAgICAgIHRoZSAxMSBtb2RlcyBvcGNvZGUgaXMuCi0gKiAgIHRvcF9hY2Nlc3M6ICAgICBBY2Nlc3MgdHlwZSB3YW50ZWQgZm9yIHRoaXMgb3BwZXJhbmQgJ2InYnJhbmNoICcgJwotICogICAgICAgICAgICAgICAgICAgbm8taW5zdHJ1Y3Rpb24gJ2FtcnZ3JwotICogICB0b3Bfd2lkdGg6ICAgICAgT3BlcmFuZCB3aWR0aCBleHBlY3RlZCwgb25lIG9mICJid2xxPy06ISIKLSAqICAgZXhwX29mX29wZXJhbmQ6IFRoZSBleHByZXNzaW9uIGFzIHBhcnNlZCBieSBleHByZXNzaW9uKCkKLSAqICAgdG9wX2Rpc3BzaXplOiAgIE51bWJlciBvZiBieXRlcyBpbiB0aGUgZGlzcGxhY2VtZW50IGlmIHdlIGNhbiBmaWd1cmUgaXQKLSAqICAgICAgICAgICAgICAgICAgIG91dCBhbmQgaXQncyByZWxhdmVudC4KLSAqCi0gKiBOZWVkIHN5bnRheCBjaGVja3MgYnVpbHQuCi0gKi8KLQotdm9pZAotdGlwX29wIChvcHRleCwgdG9wUCkKLSAgICAgY2hhciAqb3B0ZXg7CQkvKiBUaGUgdXNlcnMgdGV4dCBpbnB1dCwgd2l0aCBvbmUgbGVhZGluZyBjaGFyYWN0ZXIgKi8KLSAgICAgc3RydWN0IHRvcCAqdG9wUDsJCS8qIFRoZSB0YWhvZSBpbnN0cnVjdGlvbiB3aXRoIHNvbWUgZmllbGRzIGFscmVhZHkgc2V0OgotCQkJIGluOiBhY2Nlc3MsIHdpZHRoCi0JCQkgb3V0OiBuZHgsIHJlZywgbW9kZSwgZXJyb3IsIGRpc3BzaXplICovCi0KLXsKLSAgaW50IG1vZGUgPSAwOwkJCS8qIFRoaXMgb3BlcmFuZCdzIG1vZGUuICovCi0gIGNoYXIgc2VnZmF1bHQgPSAqb3B0ZXg7CS8qIFRvIGtlZXAgdGhlIGJhY2sgcGFyc2luZyBmcm9tIGZyZWFraW5nLiAqLwotICBjaGFyICpwb2ludCA9IG9wdGV4ICsgMTsJLyogUGFyc2luZyBmcm9tIGZyb250IHRvIGJhY2suICovCi0gIGNoYXIgKmVuZDsJCQkvKiBQYXJzaW5nIGZyb20gYmFjayB0byBmcm9udC4gKi8KLSAgaW50IHJlZyA9IC0xOwkJCS8qIG1ham9yIHJlZ2lzdGVyLCAtMSBtZWFucyBhYnNlbnQgKi8KLSAgaW50IGltcmVnID0gLTE7CQkvKiBNYWpvciByZWdpc3RlciBpbiBpbW1lZGlhdGUgbW9kZSAqLwotICBpbnQgbmR4ID0gLTE7CQkJLyogaW5kZXggcmVnaXN0ZXIgbnVtYmVyLCAtMSBtZWFucyBhYnNlbnQgKi8KLSAgY2hhciBkZWNfaW5jID0gJyAnOwkJLyogSXMgdGhlIFNQIGF1dG8taW5jcmVtZW50ZWQgJysnIG9yCi0JCQkJICAgYXV0by1kZWNyZW1lbnRlZCAnLScgb3IgbmVpdGhlciAnICcuICovCi0gIGludCBpbW1lZGlhdGUgPSAwOwkJLyogMSBpZiAnJCcgaW1tZWRpYXRlIG1vZGUgKi8KLSAgaW50IGNhbGxfd2lkdGggPSAwOwkJLyogSWYgdGhlIGNhbGxlciBjYXN0cyB0aGUgZGlzcGxhY2VtZW50ICovCi0gIGludCBhYnNfd2lkdGggPSAwOwkJLyogVGhlIHdpZHRoIG9mIHRoZSBhYnNvbHV0ZSBkaXNwbGFjbWVudCAqLwotICBpbnQgY29tX3dpZHRoID0gMDsJCS8qIERpc3BsYWNlbWVudCB3aWR0aCByZXF1aXJlZCBieSBicmFuY2ggKi8KLSAgaW50IGRlZmVycmVkID0gMDsJCS8qIDEgaWYgJyonIGRlZmVycmFsIGlzIHVzZWQgKi8KLSAgYnl0ZSBkaXNwX3NpemUgPSAwOwkJLyogSG93IGJpZyBpcyB0aGlzIG9wZXJhbmQuIDAgPT0gZG9uJ3Qga25vdyAqLwotICBjaGFyICpvcF9iYWQgPSAiIjsJCS8qIEJhZCBvcGVyYW5kIGVycm9yICovCi0KLSAgY2hhciAqdHAsICp0ZW1wLCBjOwkJLyogVGVtcG9yYXJ5IGhvbGRlcnMgKi8KLQotICBjaGFyIGFjY2VzcyA9IHRvcFAtPnRvcF9hY2Nlc3M7CS8qIFNhdmUgb24gYSBkZXJlZi4gKi8KLSAgY2hhciB3aWR0aCA9IHRvcFAtPnRvcF93aWR0aDsKLQotICBpbnQgcmVhbGx5X25vbmUgPSAwOwkJLyogRW1wdHkgZXhwcmVzc2lvbnMgZXZhbHVhdGUgdG8gMAotCQkJCSAgIGJ1dCBJIG5lZWQgdG8ga25vdyBpZiBpdCdzIHRoZXJlIG9yIG5vdCAqLwotICBleHByZXNzaW9uUyAqZXhwUDsJCS8qIC0+IGV4cHJlc3Npb24gdmFsdWVzIGZvciB0aGlzIG9wZXJhbmQgKi8KLQotICAvKiBEb2VzIHRoaXMgY29tbWFuZCByZXN0cmljdCB0aGUgZGlzcGxhY2VtZW50IHNpemUuICovCi0gIGlmIChhY2Nlc3MgPT0gJ2InKQotICAgIGNvbV93aWR0aCA9ICh3aWR0aCA9PSAnYicgPyAxIDoKLQkJICh3aWR0aCA9PSAndycgPyAyIDoKLQkJICAod2lkdGggPT0gJ2wnID8gNCA6IDApKSk7Ci0KLSAgKm9wdGV4ID0gJ1wwJzsJCS8qIFRoaXMgaXMga2luZCBvZiBhIGJhY2sgc3RvcCBmb3IgYWxsCi0JCQkJICAgdGhlIHNlYXJjaGVzIHRvIGZhaWwgb24gaWYgbmVlZGVkLiovCi0gIGlmICgqcG9pbnQgPT0gJyonKQotICAgIHsJCQkJLyogQSBkZXJlZmVyZW5jZT8gKi8KLSAgICAgIGRlZmVycmVkID0gMTsKLSAgICAgIHBvaW50Kys7Ci0gICAgfQotCi0gIC8qIEZvcmNlIHdvcmRzIGludG8gYSBjZXJ0YWluIG1vZGUgKi8KLSAgLyogQml0Y2gsIEJpdGNoLCBCaXRjaCEgKi8KLSAgLyoKLSAgICogVXNpbmcgdGhlIF4gb3BlcmF0b3IgaXMgYW1iaWdvdXMuIElmIEkgaGF2ZSBhbiBhYnNvbHV0ZSBsYWJlbAotICAgKiBjYWxsZWQgJ3cnIHNldCB0bywgc2F5IDIsIGFuZCBJIGhhdmUgdGhlIGV4cHJlc3Npb24gJ3deMScsIGRvIEkgZ2V0Ci0gICAqIDEsIGZvcmNlZCB0byBiZSBpbiB3b3JkIGRpc3BsYWNlbWVudCBtb2RlLCBvciBkbyBJIGdldCB0aGUgdmFsdWUgb2YKLSAgICogJ3cnIG9yJ2VkIHdpdGggMSAoMyBpbiB0aGlzIGNhc2UpLgotICAgKiBUaGUgZGVmYXVsdCBpcyAndycgYXMgYW4gb2Zmc2V0LCBzbyB0aGF0J3Mgd2hhdCBJIHVzZS4KLSAgICogU3RpY2sgd2l0aCBgLCBpdCBkb2VzIHRoZSBzYW1lLCBhbmQgaXNuJ3QgYW1iaWcuCi0gICAqLwotCi0gIGlmICgqcG9pbnQgIT0gJ1wwJyAmJiAoKHBvaW50WzFdID09ICdeJykgfHwgKHBvaW50WzFdID09ICdgJykpKQotICAgIHN3aXRjaCAoKnBvaW50KQotICAgICAgewotICAgICAgY2FzZSAnYic6Ci0gICAgICBjYXNlICdCJzoKLSAgICAgIGNhc2UgJ3cnOgotICAgICAgY2FzZSAnVyc6Ci0gICAgICBjYXNlICdsJzoKLSAgICAgIGNhc2UgJ0wnOgotCWlmIChjb21fd2lkdGgpCi0JICBhc193YXJuIChfKCJDYXN0aW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCBpcyBiYWQgZm9ybSwgYW5kIGlzIGlnbm9yZWQuIikpOwotCWVsc2UKLQkgIHsKLQkgICAgYyA9IChpc3VwcGVyICgqcG9pbnQpID8gdG9sb3dlciAoKnBvaW50KSA6ICpwb2ludCk7Ci0JICAgIGNhbGxfd2lkdGggPSAoKGMgPT0gJ2InKSA/IDEgOgotCQkJICAoKGMgPT0gJ3cnKSA/IDIgOiA0KSk7Ci0JICB9Ci0JcG9pbnQgKz0gMjsKLQlicmVhazsKLSAgICAgIH0KLQotICAvKiBTZXR0aW5nIGltbWVkaWF0ZSBtb2RlICovCi0gIGlmICgqcG9pbnQgPT0gJyQnKQotICAgIHsKLSAgICAgIGltbWVkaWF0ZSA9IDE7Ci0gICAgICBwb2ludCsrOwotICAgIH0KLQotICAvKgotICAgKiBJJ3ZlIHB1bGxlZCBvZmYgYWxsIHRoZSBlYXN5IHN0dWZmIG9mZiB0aGUgZnJvbnQsIG1vdmUgdG8gdGhlIGVuZCBhbmQKLSAgICogeWFuay4KLSAgICovCi0KLSAgZm9yIChlbmQgPSBwb2ludDsgKmVuZCAhPSAnXDAnOyBlbmQrKykJLyogTW92ZSB0byB0aGUgZW5kLiAqLwotICAgIDsKLQotICBpZiAoZW5kICE9IHBvaW50KQkJLyogTnVsbCBzdHJpbmc/ICovCi0gICAgZW5kLS07Ci0KLSAgaWYgKGVuZCA+IHBvaW50ICYmICplbmQgPT0gJyAnICYmIGVuZFstMV0gIT0gJ1wnJykKLSAgICBlbmQtLTsJCQkvKiBIb3Agd2hpdGUgc3BhY2UgKi8KLQotICAvKiBJcyB0aGlzIGFuIGluZGV4IHJlZy4gKi8KLSAgaWYgKCgqZW5kID09ICddJykgJiYgKGVuZFstMV0gIT0gJ1wnJykpCi0gICAgewotICAgICAgdGVtcCA9IGVuZDsKLQotICAgICAgLyogRmluZCBvcGVuaW5nIGJyYWNlLiAqLwotICAgICAgZm9yICgtLWVuZDsgKCplbmQgIT0gJ1snICYmIGVuZCAhPSBwb2ludCk7IGVuZC0tKQotCTsKLQotICAgICAgLyogSWYgSSBmb3VuZCB0aGUgb3BlbmluZyBicmFjZSwgZ2V0IHRoZSBpbmRleCByZWdpc3RlciBudW1iZXIuICovCi0gICAgICBpZiAoKmVuZCA9PSAnWycpCi0JewotCSAgdHAgPSBlbmQgKyAxOwkJLyogdHAgc2hvdWxkIHBvaW50IHRvIHRoZSBzdGFydCBvZiBhIHJlZy4gKi8KLQkgIG5keCA9IHRhaG9lX3JlZ19wYXJzZSAoJnRwKTsKLQkgIGlmICh0cCAhPSB0ZW1wKQotCSAgICB7CQkJLyogUmVnLiBwYXJzZSBlcnJvci4gKi8KLQkgICAgICBuZHggPSAtMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZW5kLS07CQkvKiBGb3VuZCBpdCwgbW92ZSBwYXN0IGJyYWNlLiAqLwotCSAgICB9Ci0JICBpZiAobmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgb3BfYmFkID0gXygiQ291bGRuJ3QgcGFyc2UgdGhlIFtpbmRleF0gaW4gdGhpcyBvcGVyYW5kLiIpOwotCSAgICAgIGVuZCA9IHBvaW50OwkvKiBGb3JjZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHRvIGZhaWwuICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BfYmFkID0gXygiQ291bGRuJ3QgZmluZCB0aGUgb3BlbmluZyAnWycgZm9yIHRoZSBpbmRleCBvZiB0aGlzIG9wZXJhbmQuIik7Ci0JICBlbmQgPSBwb2ludDsJCS8qIEZvcmNlIGFsbCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgdG8gZmFpbC4gKi8KLQl9Ci0gICAgfQotCi0gIC8qIFBvc3QgaW5jcmVtZW50PyAqLwotICBpZiAoKmVuZCA9PSAnKycpCi0gICAgewotICAgICAgZGVjX2luYyA9ICcrJzsKLSAgICAgIC8qIHdhczogICAgKmVuZC0tOyAqLwotICAgICAgZW5kLS07Ci0gICAgfQotCi0gIC8qIHJlZ2lzdGVyIGluIHBhcmVucz8gKi8KLSAgaWYgKCgqZW5kID09ICcpJykgJiYgKGVuZFstMV0gIT0gJ1wnJykpCi0gICAgewotICAgICAgdGVtcCA9IGVuZDsKLQotICAgICAgLyogRmluZCBvcGVuaW5nIHBhcmVuLiAqLwotICAgICAgZm9yICgtLWVuZDsgKCplbmQgIT0gJygnICYmIGVuZCAhPSBwb2ludCk7IGVuZC0tKQotCTsKLQotICAgICAgLyogSWYgSSBmb3VuZCB0aGUgb3BlbmluZyBwYXJlbiwgZ2V0IHRoZSByZWdpc3RlciBudW1iZXIuICovCi0gICAgICBpZiAoKmVuZCA9PSAnKCcpCi0JewotCSAgdHAgPSBlbmQgKyAxOwotCSAgcmVnID0gdGFob2VfcmVnX3BhcnNlICgmdHApOwotCSAgaWYgKHRwICE9IHRlbXApCi0JICAgIHsKLQkgICAgICAvKiBOb3QgYSByZWdpc3RlciwgYnV0IGNvdWxkIGJlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24uICovCi0JICAgICAgcmVnID0gLTE7Ci0JICAgICAgZW5kID0gdGVtcDsJLyogUmVzdCB0aGUgcG9pbnRlciBiYWNrICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVuZC0tOwkJLyogRm91bmQgdGhlIHJlZy4gbW92ZSBiZWZvcmUgb3BlbmluZyBwYXJlbi4gKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcF9iYWQgPSBfKCJDb3VsZG4ndCBmaW5kIHRoZSBvcGVuaW5nICcoJyBmb3IgdGhlIGRlcmVmIG9mIHRoaXMgb3BlcmFuZC4iKTsKLQkgIGVuZCA9IHBvaW50OwkJLyogRm9yY2UgYWxsIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB0byBmYWlsLiAqLwotCX0KLSAgICB9Ci0KLSAgLyogUHJlIGRlY3JlbWVudD8gKi8KLSAgaWYgKCplbmQgPT0gJy0nKQotICAgIHsKLSAgICAgIGlmIChkZWNfaW5jICE9ICcgJykKLQl7Ci0JICBvcF9iYWQgPSBfKCJPcGVyYW5kIGNhbid0IGJlIGJvdGggcHJlLWluYyBhbmQgcG9zdC1kZWMuIik7Ci0JICBlbmQgPSBwb2ludDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZGVjX2luYyA9ICctJzsKLQkgIC8qIHdhczogICAgICAqZW5kLS07ICovCi0JICBlbmQtLTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIEV2ZXJ5dGhpbmcgYmV0d2VlbiBwb2ludCBhbmQgZW5kIGlzIHRoZSAnZXhwcmVzc2lvbicsIHVubGVzcyBpdCdzCi0gICAqIGEgcmVnaXN0ZXIgbmFtZS4KLSAgICovCi0KLSAgYyA9IGVuZFsxXTsKLSAgZW5kWzFdID0gJ1wwJzsKLQotICB0cCA9IHBvaW50OwotICBpbXJlZyA9IHRhaG9lX3JlZ19wYXJzZSAoJnBvaW50KTsJLyogR2V0IHRoZSBpbW1lZGlhdGUgcmVnaXN0ZXIKLQkJCQkgICAgICBpZiBpdCBpcyB0aGVyZS4qLwotICBpZiAoKnBvaW50ICE9ICdcMCcpCi0gICAgewotICAgICAgLyogSWYgdGhlcmUgaXMganVuayBhZnRlciBwb2ludCwgdGhlbiB0aGUgaXQncyBub3QgaW1tZWRpYXRlIHJlZy4gKi8KLSAgICAgIHBvaW50ID0gdHA7Ci0gICAgICBpbXJlZyA9IC0xOwotICAgIH0KLQotICBpZiAoaW1yZWcgIT0gLTEgJiYgcmVnICE9IC0xKQotICAgIG9wX2JhZCA9IF8oIkkgcGFyc2VkIDIgcmVnaXN0ZXJzIGluIHRoaXMgb3BlcmFuZC4iKTsKLQotICAvKgotICAgKiBFdmFsdWF0ZSB3aGF0cyBsZWZ0IG9mIHRoZSBleHByZXNzaW9uIHRvIHNlZSBpZiBpdCdzIHZhbGlkLgotICAgKiBOb3RlIGFnYWluOiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY2FsbGluZyBleHByZXNzaW9uIGhhcyBzYXZlZAotICAgKiBpbnB1dF9saW5lX3BvaW50ZXIuIChOYWcsIG5hZywgbmFnISkKLSAgICovCi0KLSAgaWYgKCpvcF9iYWQgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBzdGF0ZW1lbnQgaGFzIG5vIHN5bnRheCBnb29mcyB5ZXQ6IGxldHMgc25pZmYgdGhlIGV4cHJlc3Npb24gKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBvaW50OwotICAgICAgZXhwUCA9ICYodG9wUC0+ZXhwX29mX29wZXJhbmQpOwotICAgICAgdG9wUC0+c2VnX29mX29wZXJhbmQgPSBleHByZXNzaW9uIChleHBQKTsKLSAgICAgIHN3aXRjaCAoZXhwUC0+WF9vcCkKLQl7Ci0JY2FzZSBPX2Fic2VudDoKLQkgIC8qIE5vIGV4cHJlc3Npb24uIEZvciBCU0Q0LjIgY29tcGF0aWJpbGl0eSwgbWlzc2luZyBleHByZXNzaW9uIGlzCi0JICAgICBhYnNvbHV0ZSAwICovCi0JICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLQkgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0JICByZWFsbHlfbm9uZSA9IDE7Ci0JY2FzZSBPX2NvbnN0YW50OgotCSAgLyogZm9yIFNFR19BQlNPTFVURSwgd2Ugc2hvdWxkbnQgbmVlZCB0byBzZXQgWF9vcF9zeW1ib2wsCi0JICAgICBYX2FkZF9zeW1ib2wgdG8gYW55IHBhcnRpY3VsYXIgdmFsdWUuICovCi0JICAvKiBCdXQsIHdlIHdpbGwgcHJvZ3JhbSBkZWZlbnNpdmVseS4gU2luY2UgdGhpcyBzaXR1YXRpb24gb2NjdXJzCi0JICAgICByYXJlbHkgc28gaXQgY29zdHMgdXMgbGl0dGxlIHRvIGRvIHNvLiAqLwotCSAgZXhwUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIGV4cFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIC8qIEhvdyBtYW55IGJ5dGVzIGFyZSBuZWVkZWQgdG8gZXhwcmVzcyB0aGlzIGFicyB2YWx1ZT8gKi8KLQkgIGFic193aWR0aCA9Ci0JICAgICgoKChleHBQLT5YX2FkZF9udW1iZXIgJiAweEZGRkZGRjgwKSA9PSAwKSB8fAotCSAgICAgICgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGRkY4MCkgPT0gMHhGRkZGRkY4MCkpID8gMSA6Ci0JICAgICAoKChleHBQLT5YX2FkZF9udW1iZXIgJiAweEZGRkY4MDAwKSA9PSAwKSB8fAotCSAgICAgICgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGODAwMCkgPT0gMHhGRkZGODAwMCkpID8gMiA6IDQpOwotCi0JY2FzZSBPX3N5bWJvbDoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIC8qCi0JICAgKiBNYWpvciBidWcuIFdlIGNhbid0IGhhbmRsZSB0aGUgY2FzZSBvZiBhIG9wZXJhdG9yCi0JICAgKiBleHByZXNzaW9uIGluIGEgc3ludGhldGljIG9wY29kZSB2YXJpYWJsZS1sZW5ndGgKLQkgICAqIGluc3RydWN0aW9uLiAgV2UgZG9uJ3QgaGF2ZSBhIGZyYWcgdHlwZSB0aGF0IGlzIHNtYXJ0Ci0JICAgKiBlbm91Z2ggdG8gcmVsYXggYSBvcGVyYXRvciwgYW5kIHNvIHdlIGp1c3QgZm9yY2UgYWxsCi0JICAgKiBvcGVyYXRvcnMgdG8gYmVoYXZlIGxpa2UgU0VHX1BBU1Mxcy4gIENsZWFybHksIGlmIHRoZXJlIGlzCi0JICAgKiBhIGRlbWFuZCB3ZSBjYW4gaW52ZW50IGEgbmV3IG9yIG1vZGlmaWVkIGZyYWcgdHlwZSBhbmQKLQkgICAqIHRoZW4gY29kaW5nIHVwIGEgZnJhZyBmb3IgdGhpcyBjYXNlIHdpbGwgYmUgZWFzeS4KLQkgICAqLwotCSAgbmVlZF9wYXNzXzIgPSAxOwotCSAgb3BfYmFkID0gXygiQ2FuJ3QgcmVsb2NhdGUgZXhwcmVzc2lvbiBlcnJvci4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2JpZzoKLQkgIC8qIFRoaXMgaXMgYW4gZXJyb3IuIFRhaG9lIGRvZXNuJ3QgYWxsb3cgYW55IGV4cHJlc3Npb25zCi0JICAgICBiaWdnZXIgdGhhdCBhIDMyIGJpdCBsb25nIHdvcmQuIEFueSBiaWdnZXIgaGFzIHRvIGJlIHJlZmVyZW5jZWQKLQkgICAgIGJ5IGFkZHJlc3MuICovCi0JICBvcF9iYWQgPSBfKCJFeHByZXNzaW9uIGlzIHRvbyBsYXJnZSBmb3IgYSAzMiBiaXRzLiIpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wwJykKLQl7Ci0JICBvcF9iYWQgPSBfKCJKdW5rIGF0IGVuZCBvZiBleHByZXNzaW9uLiIpOwotCX0KLSAgICB9Ci0KLSAgZW5kWzFdID0gYzsKLQotICAvKiBJJ20gZG9uZSwgc28gcmVzdG9yZSBvcHRleCAqLwotICAqb3B0ZXggPSBzZWdmYXVsdDsKLQotCi0gIC8qCi0gICAqIEF0IHRoaXMgcG9pbnQgaW4gdGhlIGdhbWUsIHdlIChpbiB0aGVvcnkpIGhhdmUgYWxsIHRoZSBjb21wb25lbnRzIG9mCi0gICAqIHRoZSBvcGVyYW5kIGF0IGxlYXN0IHBhcnNlZC4gTm93IGl0J3MgdGltZSB0byBjaGVjayBmb3Igc3ludGF4L3NlbWFudGljCi0gICAqIGVycm9ycywgYW5kIGJ1aWxkIHRoZSBtb2RlLgotICAgKiBUaGlzIGlzIHdoYXQgSSBoYXZlOgotICAgKiAgIGRlZmVycmVkID0gMSBpZiAnKicKLSAgICogICBjYWxsX3dpZHRoID0gMCwxLDIsNAotICAgKiAgIGFic193aWR0aCA9IDAsMSwyLDQKLSAgICogICBjb21fd2lkdGggPSAwLDEsMiw0Ci0gICAqICAgaW1tZWRpYXRlID0gMSBpZiAnJCcKLSAgICogICBuZHggPSAtMSBvciByZWcgbnVtCi0gICAqICAgZGVjX2luYyA9ICctJyBvciAnKycgb3IgJyAnCi0gICAqICAgcmVnID0gLTEgb3IgcmVnIG51bQotICAgKiAgIGltcmVnID0gLTEgb3IgcmVnIG51bQotICAgKiAgIHRvcFAtPmV4cF9vZl9vcGVyYW5kCi0gICAqICAgcmVhbGx5X25vbmUKLSAgICovCi0gIC8qIElzIHRoZXJlIGEgZGlzcGxhY2VtZW50IHNpemU/ICovCi0gIGRpc3Bfc2l6ZSA9IChjYWxsX3dpZHRoID8gY2FsbF93aWR0aCA6Ci0JICAgICAgIChjb21fd2lkdGggPyBjb21fd2lkdGggOgotCQlhYnNfd2lkdGggPyBhYnNfd2lkdGggOiAwKSk7Ci0KLSAgaWYgKCpvcF9iYWQgPT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoaW1yZWcgIT0gLTEpCi0JewotCSAgLyogUm4gKi8KLQkgIG1vZGUgPSBUQUhPRV9ESVJFQ1RfUkVHOwotCSAgaWYgKGRlZmVycmVkIHx8IGltbWVkaWF0ZSB8fCAoZGVjX2luYyAhPSAnICcpIHx8Ci0JICAgICAgKHJlZyAhPSAtMSkgfHwgIXJlYWxseV9ub25lKQotCSAgICBvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gZGlyZWN0IHJlZ2lzdGVyIG1vZGUuIik7Ci0JICBlbHNlIGlmIChuZHggIT0gLTEpCi0JICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBpbmRleCBhIHJlZ2lzdGVyIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIpOwotCSAgZWxzZSBpZiAoaW1yZWcgPT0gU1BfUkVHICYmIGFjY2VzcyA9PSAncicpCi0JICAgIG9wX2JhZCA9Ci0JICAgICAgXygiU1AgY2FuJ3QgYmUgdGhlIHNvdXJjZSBvcGVyYW5kIHdpdGggZGlyZWN0IHJlZ2lzdGVyIGFkZHJlc3NpbmcuIik7Ci0JICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2EnKQotCSAgICBvcF9iYWQgPSBfKCJDYW4ndCB0YWtlIHRoZSBhZGRyZXNzIG9mIGEgcmVnaXN0ZXIuIik7Ci0JICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQotCSAgICBvcF9iYWQgPSBfKCJEaXJlY3QgUmVnaXN0ZXIgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iKTsKLQkgIGVsc2UgaWYgKHdpZHRoID09ICdxJyAmJiAoKGltcmVnICUgMikgfHwgKGltcmVnID4gMTMpKSkKLQkgICAgb3BfYmFkID0gXygiRm9yIHF1YWQgYWNjZXNzLCB0aGUgcmVnaXN0ZXIgbXVzdCBiZSBldmVuIGFuZCA8IDE0LiIpOwotCSAgZWxzZSBpZiAoY2FsbF93aWR0aCkKLQkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGNhc3QgYSBkaXJlY3QgcmVnaXN0ZXIuIik7Ci0KLQkgIGlmICgqb3BfYmFkID09ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiBObyBlcnJvcnMsIGNoZWNrIGZvciB3YXJuaW5ncyAqLwotCSAgICAgIGlmICh3aWR0aCA9PSAncScgJiYgaW1yZWcgPT0gMTIpCi0JCWFzX3dhcm4gKF8oIlVzaW5nIHJlZyAxNCBmb3IgcXVhZHdvcmRzIGNhbiB0cm9tcCB0aGUgRlAgcmVnaXN0ZXIuIikpOwotCi0JICAgICAgcmVnID0gaW1yZWc7Ci0JICAgIH0KLQotCSAgLyogV2Uga25vdzogaW1tID0gLTEgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChkZWNfaW5jID09ICctJykKLQl7Ci0JICAvKiAtKFNQKSAqLwotCSAgbW9kZSA9IFRBSE9FX0FVVE9fREVDOwotCSAgaWYgKGRlZmVycmVkIHx8IGltbWVkaWF0ZSB8fCAhcmVhbGx5X25vbmUpCi0JICAgIG9wX2JhZCA9IF8oIlN5bnRheCBlcnJvciBpbiBhdXRvLWRlYyBtb2RlLiIpOwotCSAgZWxzZSBpZiAobmR4ICE9IC0xKQotCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGRlYyBtb2RlLiIpOwotCSAgZWxzZSBpZiAoYWNjZXNzID09ICdyJykKLQkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgbW9kZSBjYW50IGJlIHVzZWQgZm9yIHJlYWRpbmcuIik7Ci0JICBlbHNlIGlmIChyZWcgIT0gU1BfUkVHKQotCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iKTsKLQkgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCi0JICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7Ci0JICBlbHNlIGlmICh3aWR0aCA9PSAncScpCi0JICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIHdvbid0IHdvcmsgd2l0aCBxdWFkd29yZHMuIik7Ci0KLQkgIC8qIFdlIGtub3c6IGltbSA9IC0xLCBkZWNfaW5jICE9ICctJyAqLwotCX0KLSAgICAgIGVsc2UgaWYgKGRlY19pbmMgPT0gJysnKQotCXsKLQkgIGlmIChpbW1lZGlhdGUgfHwgIXJlYWxseV9ub25lKQotCSAgICBvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gb25lIG9mIHRoZSBhdXRvLWluYyBtb2Rlcy4iKTsKLQkgIGVsc2UgaWYgKGRlZmVycmVkKQotCSAgICB7Ci0JICAgICAgLyogKihTUCkrICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0FVVE9fSU5DX0RFRkVSUkVEOwotCSAgICAgIGlmIChyZWcgIT0gU1BfUkVHKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBkZWZlcnJlZCBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iKTsKLQkgICAgICBlbHNlIGlmIChuZHggIT0gLTEpCi0JCW9wX2JhZCA9IF8oIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGF1dG8gaW5jIGRlZmVycmVkIG1vZGUuIik7Ci0JICAgICAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogKFNQKSsgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfQVVUT19JTkM7Ci0JICAgICAgaWYgKGFjY2VzcyA9PSAnbScgfHwgYWNjZXNzID09ICd3JykKLQkJb3BfYmFkID0gXygiWW91IGNhbid0IHdyaXRlIHRvIGFuIGF1dG8gaW5jIHJlZ2lzdGVyLiIpOwotCSAgICAgIGVsc2UgaWYgKHJlZyAhPSBTUF9SRUcpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIpOwotCSAgICAgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7Ci0JICAgICAgZWxzZSBpZiAod2lkdGggPT0gJ3EnKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIpOwotCSAgICAgIGVsc2UgaWYgKG5keCAhPSAtMSkKLQkJb3BfYmFkID0gXygiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggaW4gYXV0byBpbmMgbW9kZS4iKTsKLQkgICAgfQotCi0JICAvKiBXZSBrbm93OiBpbW0gPSAtMSwgZGVjX2luYyA9PSAnICcgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChyZWcgIT0gLTEpCi0JewotCSAgaWYgKChuZHggIT0gLTEpICYmIChyZWcgPT0gU1BfUkVHKSkKLQkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGluZGV4IHRoZSBzcCByZWdpc3Rlci4iKTsKLQkgIGlmIChkZWZlcnJlZCkKLQkgICAgewotCSAgICAgIC8qICo8ZGlzcD4oUm4pICovCi0JICAgICAgbW9kZSA9IFRBSE9FX1JFR19ESVNQX0RFRkVSUkVEOwotCSAgICAgIGlmIChpbW1lZGlhdGUpCi0JCW9wX2JhZCA9IF8oIlN5bnRheCBlcnJvciBpbiByZWdpc3RlciBkaXNwbGFjZWQgbW9kZS4iKTsKLQkgICAgfQotCSAgZWxzZSBpZiAocmVhbGx5X25vbmUpCi0JICAgIHsKLQkgICAgICAvKiAoUm4pICovCi0JICAgICAgbW9kZSA9IFRBSE9FX1JFR19ERUZFUlJFRDsKLQkgICAgICAvKiBpZiByZWcgPSBTUCB0aGVuIGNhbnQgYmUgaW5kZXhlZCAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiA8ZGlzcD4oUm4pICovCi0JICAgICAgbW9kZSA9IFRBSE9FX1JFR19ESVNQOwotCSAgICB9Ci0KLQkgIC8qIFdlIGtub3c6IGltbSA9IC0xLCBkZWNfaW5jID09ICcgJywgUmVnID0gLTEgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJlYWxseV9ub25lKQotCSAgICBvcF9iYWQgPSBfKCJBbiBvZmZlc3QgaXMgbmVlZGVkIGZvciB0aGlzIG9wZXJhbmQuIik7Ci0JICBpZiAoZGVmZXJyZWQgJiYgaW1tZWRpYXRlKQotCSAgICB7Ci0JICAgICAgLyogKiQ8QUREUj4gKi8KLQkgICAgICBtb2RlID0gVEFIT0VfQUJTT0xVVEVfQUREUjsKLQkgICAgICBkaXNwX3NpemUgPSA0OwotCSAgICB9Ci0JICBlbHNlIGlmIChpbW1lZGlhdGUpCi0JICAgIHsKLQkgICAgICAvKiAkPGRpc3A+ICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0lNTUVESUFURTsKLQkgICAgICBpZiAobmR4ICE9IC0xKQotCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaW5kZXggYSByZWdpc3RlciBpbiBpbW1lZGlhdGUgbW9kZS4iKTsKLQkgICAgICBpZiAoYWNjZXNzID09ICdhJykKLQkJb3BfYmFkID0gXygiSW1tZWRpYXRlIGFjY2VzcyBjYW4ndCBiZSB1c2VkIGFzIGFuIGFkZHJlc3MuIik7Ci0JICAgICAgLyogcG9uZGVyIHRoZSB3aXNkb20gb2YgYSBjYXN0IGJlY2F1c2UgaXQgZG9lc24ndCBkbyBhbnkgZ29vZC4gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoZGVmZXJyZWQpCi0JICAgIHsKLQkgICAgICAvKiAqPGRpc3A+ICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiA8ZGlzcD4gKi8KLQkgICAgICBtb2RlID0gVEFIT0VfRElTUExBQ0VEX1JFTEFUSVZFOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBBdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9ycyB3ZSBjYW4gZG8gaGF2ZSBiZSBjaGVja2VkIGZvci4KLSAgICogV2UgY2FuIGJ1aWxkIHRoZSAndG9wJy4gKi8KLQotICB0b3BQLT50b3BfbmR4ID0gbmR4OwotICB0b3BQLT50b3BfcmVnID0gcmVnOwotICB0b3BQLT50b3BfbW9kZSA9IG1vZGU7Ci0gIHRvcFAtPnRvcF9lcnJvciA9IG9wX2JhZDsKLSAgdG9wUC0+dG9wX2Rpc3BzaXplID0gZGlzcF9zaXplOwotfQkJCQkvKiB0aXBfb3AgKi8KLQwKLS8qCi0gKiAgICAgICAgICAgICAgICAgIHQgaSBwICggKQotICoKLSAqIFRoaXMgY29udmVydHMgYSBzdHJpbmcgaW50byBhIHRhaG9lIGluc3RydWN0aW9uLgotICogVGhlIHN0cmluZyBtdXN0IGJlIGEgYmFyZSBzaW5nbGUgaW5zdHJ1Y3Rpb24gaW4gdGFob2UgKHdpdGggQlNENCBmcm9icykKLSAqIGZvcm1hdC4KLSAqIEl0IHByb3ZpZGVzIGF0IG1vc3Qgb25lIGZhdGFsIGVycm9yIG1lc3NhZ2UgKHdoaWNoIHN0b3BzIHRoZSBzY2FuKQotICogc29tZSB3YXJuaW5nIG1lc3NhZ2VzIGFzIGl0IGZpbmRzIHRoZW0uCi0gKiBUaGUgdGFob2UgaW5zdHJ1Y3Rpb24gaXMgcmV0dXJuZWQgaW4gZXhwbG9kZWQgZm9ybS4KLSAqCi0gKiBUaGUgZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaXMgcmV0dXJuZWQgdG8gYSBzdHJ1Y3QgdGl0IG9mIHlvdXIgY2hvaWNlLgotICogI2luY2x1ZGUgInRhaG9lLWluc3QuaCIgdG8ga25vdyB3aGF0IGEgc3RydWN0IHRpdCBpcy4KLSAqCi0gKi8KLQotc3RhdGljIHZvaWQKLXRpcCAodGl0UCwgaW5zdHJpbmcpCi0gICAgIHN0cnVjdCB0aXQgKnRpdFA7CQkvKiBXZSBidWlsZCBhbiBleHBsb2RlZCBpbnN0cnVjdGlvbiBoZXJlLiAqLwotICAgICBjaGFyICppbnN0cmluZzsJCS8qIFRleHQgb2YgYSB2YXggaW5zdHJ1Y3Rpb246IHdlIG1vZGlmeS4gKi8KLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHRvdF93b3QgKnR3UCA9IE5VTEw7CS8qIEhvdyB0byBiaXQtZW5jb2RlIHRoaXMgb3Bjb2RlLiAqLwotICByZWdpc3RlciBjaGFyICpwOwkJLyogMS9za2lwIHdoaXRlc3BhY2UuMi9zY2FuIHZvdF9ob3cgKi8KLSAgcmVnaXN0ZXIgY2hhciAqcTsJCS8qICAqLwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGNvdW50OwkvKiBjb3VudHMgbnVtYmVyIG9mIG9wZXJhbmRzIHNlZW4gKi8KLSAgcmVnaXN0ZXIgc3RydWN0IHRvcCAqb3BlcmFuZHA7Lyogc2NhbiBvcGVyYW5kcyBpbiBzdHJ1Y3QgdGl0ICovCi0gIHJlZ2lzdGVyIGNoYXIgKmFsbG9wZXJyID0gIiI7CS8qIGVycm9yIG92ZXIgYWxsIG9wZXJhbmRzICovCi0gIHJlZ2lzdGVyIGNoYXIgYzsJCS8qIFJlbWVtYmVyIGNoYXIsICh3ZSBjbG9iYmVyIGl0Ci0JCQkJICAgd2l0aCAnXDAnIHRlbXBvcmFyaWx5KS4gKi8KLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0gICAgKytpbnN0cmluZzsJCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLSAgZm9yIChwID0gaW5zdHJpbmc7ICpwICYmICpwICE9ICcgJzsgcCsrKQotICAgIDsJCQkJLyogTVVTVCBlbmQgaW4gZW5kLW9mLXN0cmluZyBvcgotCQkJCSAgIGV4YWN0bHkgMSBzcGFjZS4gKi8KLSAgLyogU2Nhbm5lZCB1cCB0byBlbmQgb2Ygb3BlcmF0aW9uLWNvZGUuICovCi0gIC8qIE9wZXJhdGlvbi1jb2RlIGlzIGVuZGVkIHdpdGggd2hpdGVzcGFjZS4gKi8KLSAgaWYgKHAgPT0gaW5zdHJpbmcpCi0gICAgewotICAgICAgdGl0UC0+dGl0X2Vycm9yID0gXygiTm8gb3BlcmF0b3IiKTsKLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIHRpdFAtPnRpdF9vcGNvZGUgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAqcDsKLSAgICAgICpwID0gJ1wwJzsKLSAgICAgIC8qCi0gICAgICogSGVyZSB3aXRoIGluc3RyaW5nIHBvaW50aW5nIHRvIHdoYXQgYmV0dGVyIGJlIGFuIG9wLW5hbWUsIGFuZCBwCi0gICAgICogcG9pbnRpbmcgdG8gY2hhcmFjdGVyIGp1c3QgcGFzdCB0aGF0LgotICAgICAqIFdlIHRydXN0IGluc3RyaW5nIHBvaW50cyB0byBhbiBvcC1uYW1lLCB3aXRoIG5vIHdoaXRlc3BhY2UuCi0gICAgICovCi0gICAgICB0d1AgPSAoc3RydWN0IHRvdF93b3QgKikgaGFzaF9maW5kIChvcF9oYXNoLCBpbnN0cmluZyk7Ci0gICAgICAqcCA9IGM7CQkJLyogUmVzdG9yZSBjaGFyIGFmdGVyIG9wLWNvZGUuICovCi0gICAgICBpZiAodHdQID09IDApCi0JewotCSAgdGl0UC0+dGl0X2Vycm9yID0gXygiVW5rbm93biBvcGVyYXRvciIpOwotCSAgY291bnQgPSAwOwotCSAgdGl0UC0+dGl0X29wY29kZSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0gICAgICAgKiBXZSBmb3VuZCBhIG1hdGNoISBTbyBsZXRzIHBpY2sgdXAgYXMgbWFueSBvcGVyYW5kcyBhcyB0aGUKLSAgICAgICAqIGluc3RydWN0aW9uIHdhbnRzLCBhbmQgZXZlbiBncmlwZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkuCi0gICAgICAgKiBXZSBleHBlY3QgY29tbWEgdG8gc2VwZXJhdGUgZWFjaCBvcGVyYW5kLgotICAgICAgICogV2UgbGV0IGluc3RyaW5nIHRyYWNrIHRoZSB0ZXh0LCB3aGlsZSBwIHRyYWNrcyBhIHBhcnQgb2YgdGhlCi0gICAgICAgKiBzdHJ1Y3QgdG90LgotICAgICAgICovCi0KLQkgIGNvdW50ID0gMDsJCS8qIG5vIG9wZXJhbmRzIHNlZW4geWV0ICovCi0JICBpbnN0cmluZyA9IHAgKyAoKnAgIT0gJ1wwJyk7CS8qIHBvaW50IHBhc3QgdGhlIG9wZXJhdGlvbiBjb2RlICovCi0JICAvKiB0aXBfb3AoKSBzY3Jld3Mgd2l0aCB0aGUgaW5wdXRfbGluZV9wb2ludGVyLCBzbyBzYXZlIGl0IGJlZm9yZQotCSBJIGp1bXAgaW4gKi8KLQkgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgZm9yIChwID0gdHdQLT5hcmdzLCBvcGVyYW5kcCA9IHRpdFAtPnRpdF9vcGVyYW5kOwotCSAgICAgICAhKmFsbG9wZXJyICYmICpwOwotCSAgICAgICBvcGVyYW5kcCsrLCBwICs9IDIpCi0JICAgIHsKLQkgICAgICAvKgotCSAqIEhlcmUgdG8gcGFyc2Ugb25lIG9wZXJhbmQuIExlYXZlIGluc3RyaW5nIHBvaW50aW5nIGp1c3QKLQkgKiBwYXN0IGFueSBvbmUgJywnIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGlzIG9wZXJhbmQuCi0JICovCi0JICAgICAgaWYgKCFwWzFdKQotCQlhc19mYXRhbCAoXygiQ29tcGlsZXIgYnVnOiBPREQgbnVtYmVyIG9mIGJ5dGVzIGluIGFyZyBzdHJ1Y3R1cmUgJXMuIiksCi0JCQkgIHR3UC0+YXJncyk7Ci0JICAgICAgZWxzZSBpZiAoKmluc3RyaW5nKQotCQl7Ci0JCSAgZm9yIChxID0gaW5zdHJpbmc7ICgqcSAhPSAnLCcgJiYgKnEgIT0gJ1wwJyk7IHErKykKLQkJICAgIHsKLQkJICAgICAgaWYgKCpxID09ICdcJycgJiYgcVsxXSAhPSAnXDAnKQkvKiBKdW1wIHF1b3RlZCBjaGFyYWN0ZXJzICovCi0JCQlxKys7Ci0JCSAgICB9Ci0JCSAgYyA9ICpxOwotCQkgIC8qCi0JICAgKiBRIHBvaW50cyB0byAnLCcgb3IgJ1wwJyB0aGF0IGVuZHMgYXJndW1lbnQuIEMgaXMgdGhhdAotCSAgICogY2hhcmFjdGVyLgotCSAgICovCi0JCSAgKnEgPSAnXDAnOwotCQkgIG9wZXJhbmRwLT50b3BfYWNjZXNzID0gcFswXTsKLQkJICBvcGVyYW5kcC0+dG9wX3dpZHRoID0gcFsxXTsKLQkJICB0aXBfb3AgKGluc3RyaW5nIC0gMSwgb3BlcmFuZHApOwotCQkgICpxID0gYzsJLyogUmVzdG9yZSBpbnB1dCB0ZXh0LiAqLwotCQkgIGlmICgqKG9wZXJhbmRwLT50b3BfZXJyb3IpKQotCQkgICAgewotCQkgICAgICBhbGxvcGVyciA9IG9wZXJhbmRwLT50b3BfZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaW5zdHJpbmcgPSBxICsgKGMgPyAxIDogMCk7CS8qIG5leHQgb3BlcmFuZCAoaWYgYW55KSAqLwotCQkgIGNvdW50Kys7CS8qICB3b24gYW5vdGhlciBhcmd1bWVudCwgbWF5IGhhdmUgYW4gb3BlcnIgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJYWxsb3BlcnIgPSBfKCJOb3QgZW5vdWdoIG9wZXJhbmRzIik7Ci0JICAgIH0KLQkgIC8qIFJlc3RvcmUgdGhlIHBvaW50ZXIuICovCi0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotCSAgaWYgKCEqYWxsb3BlcnIpCi0JICAgIHsKLQkgICAgICBpZiAoKmluc3RyaW5nID09ICcgJykKLQkJaW5zdHJpbmcrKzsJLyogU2tpcCB3aGl0ZXNwYWNlLiAqLwotCSAgICAgIGlmICgqaW5zdHJpbmcpCi0JCWFsbG9wZXJyID0gXygiVG9vIG1hbnkgb3BlcmFuZHMiKTsKLQkgICAgfQotCSAgdGl0UC0+dGl0X2Vycm9yID0gYWxsb3BlcnI7Ci0JfQotICAgIH0KLQotICB0aXRQLT50aXRfb3Bjb2RlID0gdHdQLT5jb2RlOwkvKiBUaGUgb3AtY29kZS4gKi8KLSAgdGl0UC0+dGl0X29wZXJhbmRzID0gY291bnQ7Ci19CQkJCS8qIHRpcCAqLwotDAotLyogbWRfYXNzZW1ibGUoKSBlbWl0IGZyYWdzIGZvciAxIGluc3RydWN0aW9uICovCi12b2lkCi1tZF9hc3NlbWJsZSAoaW5zdHJ1Y3Rpb25fc3RyaW5nKQotICAgICBjaGFyICppbnN0cnVjdGlvbl9zdHJpbmc7CS8qIEEgc3RyaW5nOiBhc3NlbWJsZSAxIGluc3RydWN0aW9uLiAqLwotewotICBjaGFyICpwOwotICByZWdpc3RlciBzdHJ1Y3QgdG9wICpvcGVyYW5kUDsvKiBBbiBvcGVyYW5kLiBTY2FucyBhbGwgb3BlcmFuZHMuICovCi0gIC8qICBjaGFyIGNfc2F2ZTsJZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBXaGF0IHVzZWQgdG8gbGl2ZSBhZnRlciBhbiBleHByZXNzaW9uLiAqLwotICAvKiAgc3RydWN0IGZyYWcgKmZyYWdQOwlmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIEZyYWdtZW50IG9mIGNvZGUgd2UganVzdCBtYWRlLiAqLwotICAvKiAgcmVnaXN0ZXIgc3RydWN0IHRvcCAqZW5kX29wZXJhbmRQOyBmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIC0+IHNsb3QganVzdCBhZnRlciBsYXN0IG9wZXJhbmQKLQkJCQkJTGltaXQgb2YgdGhlIGZvciAoZWFjaCBvcGVyYW5kKS4gKi8KLSAgcmVnaXN0ZXIgZXhwcmVzc2lvblMgKmV4cFA7CS8qIC0+IGV4cHJlc3Npb24gdmFsdWVzIGZvciB0aGlzIG9wZXJhbmQgKi8KLQotICAvKiBUaGVzZSByZWZlciB0byBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kIGV4cHJlc3Npb24uICovCi0gIHNlZ1QgdG9fc2VnOwkJCS8qIFRhcmdldCBzZWdtZW50IG9mIHRoZSBhZGRyZXNzLgkgKi8KLQotICByZWdpc3RlciB2YWx1ZVQgdGhpc19hZGRfbnVtYmVyOwotICByZWdpc3RlciBzeW1ib2xTICp0aGlzX2FkZF9zeW1ib2w7CS8qICt2ZSAobWludWVuZCkgc3ltYm9sLiAqLwotCi0gIC8qICB0YWhvZV9vcGNvZGVUIG9wY29kZV9hc19udW1iZXI7IGZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogVGhlIG9wY29kZSBhcyBhIG51bWJlci4gKi8KLSAgY2hhciAqb3Bjb2RlUDsJCS8qIFdoZXJlIGl0IGlzIGluIGEgZnJhZy4gKi8KLSAgLyogIGNoYXIgKm9wbW9kZVA7CWZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogV2hlcmUgb3Bjb2RlIHR5cGUgaXMsIGluIGEgZnJhZy4gKi8KLQotICBpbnQgZGlzcHNpemU7CQkJLyogRnJvbSB0b3BfZGlzcHNpemU6IHRhaG9lX29wZXJhbmRfd2lkdGgKLQkJCQkgICAoaW4gYnl0ZXMpICovCi0gIGludCBpc191bmRlZmluZWQ7CQkvKiAxIGlmIG9wZXJhbmQgZXhwcmVzc2lvbidzCi0JCQkJICAgc2VnbWVudCBub3Qga25vd24geWV0LiAqLwotICBpbnQgcGNfcmVsOwkJCS8qIElzIHRoaXMgb3BlcmFuZCBwYyByZWxhdGl2ZT8gKi8KLQotICAvKiBEZWNvZGUgdGhlIG9wZXJhbmQuICovCi0gIHRpcCAoJnQsIGluc3RydWN0aW9uX3N0cmluZyk7Ci0KLSAgLyoKLSAgICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgb3BlcmFuZCBkZWNvZGUgcHJvcGVybHkuCi0gICAqIE5vdGljZSB0aGF0IHdlIGhhdmVuJ3QgbWFkZSBhbnkgZnJhZ3MgeWV0LgotICAgKiBJZiBpdCBnb29mZWQsIHRoZW4gdGhpcyBpbnN0cnVjdGlvbiB3aWxsIHdlZGdlIGluIGFueSBwYXNzLAotICAgKiBhbmQgd2UgY2FuIHNhZmVseSBmbHVzaCBpdCwgd2l0aG91dCBjYXVzaW5nIGludGVycGFzcyBzeW1ib2wgcGhhc2UKLSAgICogZXJyb3JzLiBUaGF0IGlzLCB3aXRob3V0IGNoYW5naW5nIGxhYmVsIHZhbHVlcyBpbiBkaWZmZXJlbnQgcGFzc2VzLgotICAgKi8KLSAgaWYgKCp0LnRpdF9lcnJvcikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgZHVlIHRvIFwiJXNcIiIpLCB0LnRpdF9lcnJvcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2Ugc2F3IG5vIGVycm9ycyBpbiBhbnkgb3BlcmFuZHMgLSB0cnkgdG8gbWFrZSBmcmFnKHMpICovCi0gICAgICAvKiBFbWl0IG9wLWNvZGUuICovCi0gICAgICAvKiBSZW1lbWJlciB3aGVyZSBpdCBpcywgaW4gY2FzZSB3ZSB3YW50IHRvIG1vZGlmeSB0aGUgb3AtY29kZSBsYXRlci4gKi8KLSAgICAgIG9wY29kZVAgPSBmcmFnX21vcmUgKDEpOwotICAgICAgKm9wY29kZVAgPSB0LnRpdF9vcGNvZGU7Ci0gICAgICAvKiBOb3cgZG8gZWFjaCBvcGVyYW5kLiAqLwotICAgICAgZm9yIChvcGVyYW5kUCA9IHQudGl0X29wZXJhbmQ7Ci0JICAgb3BlcmFuZFAgPCB0LnRpdF9vcGVyYW5kICsgdC50aXRfb3BlcmFuZHM7Ci0JICAgb3BlcmFuZFArKykKLQl7CQkJLyogZm9yIGVhY2ggb3BlcmFuZCAqLwotCSAgZXhwUCA9ICYob3BlcmFuZFAtPmV4cF9vZl9vcGVyYW5kKTsKLQkgIGlmIChvcGVyYW5kUC0+dG9wX25keCA+PSAwKQotCSAgICB7Ci0JICAgICAgLyogSW5kZXhlZCBhZGRyZXNzaW5nIGJ5dGUKLQkgICBMZWdhbGl0eSBvZiBpbmRleGVkIG1vZGUgYWxyZWFkeSBjaGVja2VkOiBpdCBpcyBPSyAqLwotCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoMHg0MCArIG9wZXJhbmRQLT50b3BfbmR4KTsKLQkgICAgfQkJCS8qIGlmKHRvcF9uZHg+PTApICovCi0KLQkgIC8qIEhlcmUgdG8gbWFrZSBtYWluIG9wZXJhbmQgZnJhZyhzKS4gKi8KLQkgIHRoaXNfYWRkX251bWJlciA9IGV4cFAtPlhfYWRkX251bWJlcjsKLQkgIHRoaXNfYWRkX3N5bWJvbCA9IGV4cFAtPlhfYWRkX3N5bWJvbDsKLQkgIHRvX3NlZyA9IG9wZXJhbmRQLT5zZWdfb2Zfb3BlcmFuZDsKLQkgIGtub3cgKHRvX3NlZyA9PSBTRUdfVU5LTk9XTiB8fCBcCi0JCXRvX3NlZyA9PSBTRUdfQUJTT0xVVEUgfHwgXAotCQl0b19zZWcgPT0gU0VHX0RBVEEgfHwgXAotCQl0b19zZWcgPT0gU0VHX1RFWFQgfHwgXAotCQl0b19zZWcgPT0gU0VHX0JTUyk7Ci0JICBpc191bmRlZmluZWQgPSAodG9fc2VnID09IFNFR19VTktOT1dOKTsKLQkgIC8qIERvIHdlIGtub3cgaG93IGJpZyB0aGlzIG9wcGVyYW5kIGlzPyAqLwotCSAgZGlzcHNpemUgPSBvcGVyYW5kUC0+dG9wX2Rpc3BzaXplOwotCSAgcGNfcmVsID0gMDsKLQkgIC8qIERlYWwgd2l0aCB0aGUgYnJhbmNoIHBvc3NhYmlsaXRpZXMuIChOb3RlLCB0aGlzIGRvZXNuJ3QgaW5jbHVkZQotCSBqdW1wcy4pKi8KLQkgIGlmIChvcGVyYW5kUC0+dG9wX2FjY2VzcyA9PSAnYicpCi0JICAgIHsKLQkgICAgICAvKiBCcmFuY2hlcyBtdXN0IGJlIGV4cHJlc3Npb25zLiBBIHBzdWVkbyBicmFuY2ggY2FuIGFsc28ganVtcCB0bwotCSAgIGFuIGFic29sdXRlIGFkZHJlc3MuICovCi0JICAgICAgaWYgKHRvX3NlZyA9PSBub3dfc2VnIHx8IGlzX3VuZGVmaW5lZCkKLQkJewotCQkgIC8qIElmIGlzX3VuZGVmaW5lZCwgdGhlbiBpdCBtaWdodCBCRUNPTUUgbm93X3NlZyBieSByZWxheCB0aW1lLiAqLwotCQkgIGlmIChkaXNwc2l6ZSkKLQkJICAgIHsKLQkJICAgICAgLyogSSBrbm93IGhvdyBiaWcgdGhlIGJyYW5jaCBpcyBzdXBwb3NlZCB0byBiZSAoaXQncyBhIG5vcm1hbAotCSAgICAgICBicmFuY2gpLCBzbyBJIHNldCB1cCB0aGUgZnJhZywgYW5kIGxldCBHQVMgZG8gdGhlIHJlc3QuICovCi0JCSAgICAgIHAgPSBmcmFnX21vcmUgKGRpc3BzaXplKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCSAgICAgICBzaXplX3RvX2Z4IChkaXNwc2l6ZSwgMSksCi0JCQkgICAgICAgTlVMTCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiAodG9fc2VnPT1ub3dfc2VnIHx8IHRvX3NlZyA9PSBTRUdfVU5LTk9XTikgJiYgZGlzcHNpemU9PTAgKi8KLQkJICAgICAgLyogSWYgd2UgZG9uJ3Qga25vdyBob3cgYmlnIGl0IGlzLCB0aGVuIGl0cyBhIHN5bnRoZXRpYyBicmFuY2gsCi0JICAgICAgIHNvIHdlIHNldCB1cCBhIHNpbXBsZSByZWxheCBzdGF0ZS4gKi8KLQkJICAgICAgc3dpdGNoIChvcGVyYW5kUC0+dG9wX3dpZHRoKQotCQkJewotCQkJY2FzZSBUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QOgotCQkJICAvKiBTaW1wbGUgKGNvbmRpdGlvbmFsKSBqdW1wLiBJIG1heSBoYXZlIHRvIHJldmVyc2UgdGhlCi0JCSBjb25kaXRpb24gb2Ygb3Bjb2RlUCwgYW5kIHRoZW4ganVtcCB0byBteSBkZXN0aW5hdGlvbi4KLQkJIEkgc2V0IDEgYnl0ZSBhc2lkZSBmb3IgdGhlIGJyYW5jaCBvZmYgc2V0LCBhbmQgY291bGQgbmVlZCA2Ci0JCSBtb3JlIGJ5dGVzIGZvciB0aGUgcGNfcmVsIGp1bXAgKi8KLQkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA3LCAxLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEUpLAotCQkJCSB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgb3Bjb2RlUCk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSBUQUhPRV9XSURUSF9BTFdBWVNfSlVNUDoKLQkJCSAgLyogU2ltcGxlICh1bmNvbmRpdGlvbmFsKSBqdW1wLiBJIG1heSBoYXZlIHRvIGNvbnZlcnQgdGhpcyB0bwotCQkgYSB3b3JkIGJyYW5jaCwgb3IgYW4gYWJzb2x1dGUganVtcC4gKi8KLQkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA1LCAxLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9CWVRFKSwKLQkJCQkgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIG9wY29kZVApOwotCQkJICBicmVhazsKLQkJCSAgLyogVGhlIHNtYWxsZXN0IHNpemUgZm9yIHRoZSBuZXh0IDIgY2FzZXMgaXMgd29yZC4gKi8KLQkJCWNhc2UgVEFIT0VfV0lEVEhfQklHX1JFVl9KVU1QOgotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDIsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9XT1JEKSwKLQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJICAgIG9wY29kZVApOwotCQkJICBicmVhazsKLQkJCWNhc2UgVEFIT0VfV0lEVEhfQklHX05PTl9SRVZfSlVNUDoKLQkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMiwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9XT1JEKSwKLQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJICAgIG9wY29kZVApOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGFzX2ZhdGFsIChfKCJDb21wbGlsZXIgYnVnOiBHb3QgYSBjYXNlICglZCkgSSB3YXNuJ3QgZXhwZWN0aW5nLiIpLAotCQkJCSAgICBvcGVyYW5kUC0+dG9wX3dpZHRoKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIHRvX3NlZyAhPSBub3dfc2VnICYmIHRvX3NlZyAhPSBzZWdfdW5rbm93biAoc3RpbGwgaW4gYnJhbmNoKQotCSAgICAgSW4gb3RoZXIgd29yZHMsIEknbSBqdW1waW5nIG91dCBvZiBteSBzZWdtZW50IHNvIGV4dGVuZCB0aGUKLQkgICAgIGJyYW5jaGVzIHRvIGp1bXBzLCBhbmQgbGV0IEdBUyBmaXggdGhlbS4gKi8KLQotCQkgIC8qIFRoZXNlIGFyZSAiYnJhbmNoZXMiIHdoYXQgd2lsbCBhbHdheXMgYmUgYnJhbmNoZXMgYXJvdW5kIGEganVtcAotCSAgICAgdG8gdGhlIGNvcnJlY3QgYWRkcmVzc3MgaW4gcmVhbCBsaWZlLgotCSAgICAgSWYgdG9fc2VnIGlzIFNFR19BQlNPTFVURSwganVzdCBlbmNvZGUgdGhlIGJyYW5jaCBpbiwKLQkgICAgIGVsc2UgbGV0IEdBUyBmaXggdGhlIGFkZHJlc3MuICovCi0KLQkJICBzd2l0Y2ggKG9wZXJhbmRQLT50b3Bfd2lkdGgpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSB0aGVvcnk6Ci0JICAgICAgIEZvciBTRUdfQUJTT0xVVEUsIHRoZW4gbW9kZSBpcyBBQlNPTFVURV9BRERSLCBqdW1wCi0JICAgICAgIHRvIHRoYXQgYWRkcmVzc3MgKG5vdCBwY19yZWwpLgotCSAgICAgICBGb3Igb3RoZXIgc2VncywgYWRkcmVzcyBpcyBhIGxvbmcgd29yZCBQQyByZWwganVtcC4gKi8KLQkJICAgIGNhc2UgVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUDoKLQkJICAgICAgLyogYjxjb25kPiAqLwotCQkgICAgICAvKiBUbyByZXZlcnNlIHRoZSBjb25kaXRpb24gaW4gYSBUQUhPRSBicmFuY2gsCi0JICAgICAgIGNvbXBsZW1lbnQgYml0IDQgKi8KLQkJICAgICAgKm9wY29kZVAgXj0gMHgxMDsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNyk7Ci0JCSAgICAgICpwKysgPSA2OwotCQkgICAgICAqcCsrID0gVEFIT0VfSk1QOwotCQkgICAgICAqcCsrID0gKG9wZXJhbmRQLT50b3BfbW9kZSA9PQotCQkJICAgICAgVEFIT0VfQUJTT0xVVEVfQUREUiA/IFRBSE9FX0FCU09MVVRFX0FERFIgOgotCQkJICAgICAgVEFIT0VfUENfUkVMX0xPTkcpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkgICAgICAgKHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpID8gRlhfUENSRUwzMiA6IEZYXzMyLCBOVUxMKTsKLQkJICAgICAgLyoKLQkgICAgICogTm93IChlZykJQkxFUQkxZgotCSAgICAgKgkJSk1QCWZvbwotCSAgICAgKgkxOgotCSAgICAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFRBSE9FX1dJRFRIX0FMV0FZU19KVU1QOgotCQkgICAgICAvKiBiciwganVzdCB0dXJuIGl0IGludG8gYSBqdW1wICovCi0JCSAgICAgICpvcGNvZGVQID0gVEFIT0VfSk1QOwotCQkgICAgICBwID0gZnJhZ19tb3JlICg1KTsKLQkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KLQkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKLQkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7Ci0JCSAgICAgIC8qIE5vdyAoZWcpIEpNUCBmb28gKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUDoKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0JCSAgICAgICpvcGNvZGVQIF49IDB4MTA7Ci0JCSAgICAgICpwKysgPSAwOwotCQkgICAgICAqcCsrID0gNjsKLQkJICAgICAgKnArKyA9IFRBSE9FX0pNUDsKLQkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KLQkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKLQkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7Ci0JCSAgICAgIC8qCi0JICAgICAqIE5vdyAoZWcpCUFDQngJMWYKLQkgICAgICoJCUpNUCAgICAgZm9vCi0JICAgICAqCTE6Ci0JICAgICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVEFIT0VfV0lEVEhfQklHX05PTl9SRVZfSlVNUDoKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoMTApOwotCQkgICAgICAqcCsrID0gMDsKLQkJICAgICAgKnArKyA9IDI7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9CUkI7Ci0JCSAgICAgICpwKysgPSA2OwotCQkgICAgICAqcCsrID0gVEFIT0VfSk1QOwotCQkgICAgICAqcCsrID0gKG9wZXJhbmRQLT50b3BfbW9kZSA9PQotCQkJICAgICAgVEFIT0VfQUJTT0xVVEVfQUREUiA/IFRBSE9FX0FCU09MVVRFX0FERFIgOgotCQkJICAgICAgVEFIT0VfUENfUkVMX0xPTkcpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkgICAgICAgKHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpID8gRlhfUENSRUwzMiA6IEZYXzMyLCBOVUxMKTsKLQkJICAgICAgLyoKLQkgICAgICogTm93IChlZykJeE9CeHh4CTFmCi0JICAgICAqCQlCUkIJMmYKLQkgICAgICoJMToJSk1QCUAjZm9vCi0JICAgICAqCTI6Ci0JICAgICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgY2FzZSAndyc6Ci0JCSAgICAgIGFzX3dhcm4gKF8oIlJlYWwgYnJhbmNoIGRpc3BsYWNlbWVudHMgbXVzdCBiZSBleHByZXNzaW9ucy4iKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYXNfZmF0YWwgKF8oIkNvbXBsaWVyIGVycm9yOiBJIGdvdCBhbiB1bmtub3duIHN5bnRoZXRpYyBicmFuY2ggOiVjIiksCi0JCQkJb3BlcmFuZFAtPnRvcF93aWR0aCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEl0IGFpbid0IGEgYnJhbmNoIG9wZXJhbmQuICovCi0JICAgICAgc3dpdGNoIChvcGVyYW5kUC0+dG9wX21vZGUpCi0JCXsKLQkJICAvKiBBdXRvLWZvbyBhY2Nlc3MsIG9ubHkgd29ya3MgZm9yIG9uZSByZWcgKFNQKQotCSAgICAgc28gdGhlIG9ubHkgdGhpbmcgbmVlZGVkIGlzIHRoZSBtb2RlLiAqLwotCQljYXNlIFRBSE9FX0FVVE9fREVDOgotCQljYXNlIFRBSE9FX0FVVE9fSU5DOgotCQljYXNlIFRBSE9FX0FVVE9fSU5DX0RFRkVSUkVEOgotCQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAob3BlcmFuZFAtPnRvcF9tb2RlKTsKLQkJICBicmVhazsKLQotCQkgIC8qIE51bWJlcmVkIFJlZ2lzdGVyIG9ubHkgYWNjZXNzLiBPbmx5IHRoaW5nIG5lZWRlZCBpcyB0aGUKLQkgICAgIG1vZGUgKyBSZWdpc3RlciBudW1iZXIgKi8KLQkJY2FzZSBUQUhPRV9ESVJFQ1RfUkVHOgotCQljYXNlIFRBSE9FX1JFR19ERUZFUlJFRDoKLQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKG9wZXJhbmRQLT50b3BfbW9kZSArIG9wZXJhbmRQLT50b3BfcmVnKTsKLQkJICBicmVhazsKLQotCQkgIC8qIEFuIGFic29sdXRlIGFkZHJlc3MuIEl0J3Mgc2l6ZSBpcyBhbHdheXMgNSBieXRlcy4KLQkgICAgIChtb2RlX3R5cGUgKyA0IGJ5dGUgYWRkcmVzcykuICovCi0JCWNhc2UgVEFIT0VfQUJTT0xVVEVfQUREUjoKLQkJICBrbm93ICgodGhpc19hZGRfc3ltYm9sID09IE5VTEwpKTsKLQkJICBwID0gZnJhZ19tb3JlICg1KTsKLQkJICAqcCA9IFRBSE9FX0FCU09MVVRFX0FERFI7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJICBicmVhazsKLQotCQkgIC8qIEltbWVkaWF0ZSBkYXRhLiBJZiB0aGUgc2l6ZSBpc24ndCBrbm93biwgdGhlbiBpdCdzIGFuIGFkZHJlc3MKLQkgICAgICsgYW5kIG9mZnNldCwgd2hpY2ggaXMgNCBieXRlcyBiaWcuICovCi0JCWNhc2UgVEFIT0VfSU1NRURJQVRFOgotCQkgIGlmICh0aGlzX2FkZF9zeW1ib2wgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfTE9OR1dPUkQ7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkgICAgICAgRlhfMzIsIE5VTEwpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogSXQncyBhIGludGVnZXIsIGFuZCBJIGtub3cgaXQncyBzaXplLiAqLwotCQkgICAgICBpZiAoKHVuc2lnbmVkKSB0aGlzX2FkZF9udW1iZXIgPCAweDQwKQotCQkJewotCQkJICAvKiBXaWxsIGl0IGZpdCBpbiBhIGxpdGVyYWw/ICovCi0JCQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoKGJ5dGUpIHRoaXNfYWRkX251bWJlcik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgcCA9IGZyYWdfbW9yZSAoZGlzcHNpemUgKyAxKTsKLQkJCSAgc3dpdGNoIChkaXNwc2l6ZSkKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSAxOgotCQkJICAgICAgKnArKyA9IFRBSE9FX0lNTUVESUFURV9CWVRFOwotCQkJICAgICAgKnAgPSAoYnl0ZSkgdGhpc19hZGRfbnVtYmVyOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSAyOgotCQkJICAgICAgKnArKyA9IFRBSE9FX0lNTUVESUFURV9XT1JEOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB0aGlzX2FkZF9udW1iZXIsIDIpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSA0OgotCQkJICAgICAgKnArKyA9IFRBSE9FX0lNTUVESUFURV9MT05HV09SRDsKLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQotCQkgIC8qIERpc3RhbmNlIGZyb20gdGhlIFBDLiBJZiB0aGUgc2l6ZSBpc24ndCBrbm93biwgd2UgaGF2ZSB0byByZWxheAotCSAgICAgaW50byBpdC4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBkaXNwKHNwKSBpcyB0aGF0Ci0JICAgICB0aGlzIG9mZnNldCBpcyBwY19yZWwsIGFuZCBkaXNwKHNwKSBpc24ndC4KLQkgICAgIE5vdGUgdGhlIGRyb3AgdGhyb3VnaCBjb2RlLiAqLwotCi0JCWNhc2UgVEFIT0VfRElTUExBQ0VEX1JFTEFUSVZFOgotCQljYXNlIFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEOgotCQkgIG9wZXJhbmRQLT50b3BfcmVnID0gUENfUkVHOwotCQkgIHBjX3JlbCA9IDE7Ci0KLQkJICAvKiBSZWdpc3RlciwgcGx1cyBhIGRpc3BsYWNlbWVudCBtb2RlLiBTYXZlIHRoZSByZWdpc3RlciBudW1iZXIsCi0JICAgICBhbmQgd2VhdGhlciBpdHMgZGVmZmVyZWQgb3Igbm90LCBhbmQgcmVsYXggdGhlIHNpemUgaWYgaXQgaXNuJ3QKLQkgICAgIGtub3duLiAqLwotCQljYXNlIFRBSE9FX1JFR19ESVNQOgotCQljYXNlIFRBSE9FX1JFR19ESVNQX0RFRkVSUkVEOgotCQkgIGlmIChvcGVyYW5kUC0+dG9wX21vZGUgPT0gVEFIT0VfRElTUF9SRUxfREVGRVJSRUQgfHwKLQkJICAgICAgb3BlcmFuZFAtPnRvcF9tb2RlID09IFRBSE9FX1JFR19ESVNQX0RFRkVSUkVEKQotCQkgICAgb3BlcmFuZFAtPnRvcF9yZWcgKz0gMHgxMDsJLyogZGVmZmVyZWQgbW9kZSBpcyBhbHdheXMgMHgxMCBoaWdoZXIKLQkJCQkJICB0aGFuIGl0J3Mgbm9uLWRlZmZlcmVkIHNpYmxpbmcuICovCi0KLQkJICAvKiBJcyB0aGlzIGEgdmFsdWUgb3V0IG9mIHRoaXMgc2VnbWVudD8KLQkgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgY29uZGl0aW9uYWwgaXMgYSBjbHVkZ2UgdG8gbWFrZSBnYXMKLQkgICAgIHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0IGFzICdhcycgd2hlbiB0aGVyZSBpcyBhIGxhYmxlLCBpbgotCSAgICAgdGhlIGN1cnJlbnQgc2VnbWVudCwgZGlzcGxhY2VpbmcgYSByZWdpc3Rlci4gSXQncyBzdHJhbmdlLAotCSAgICAgYW5kIG5vIG9uZSBpbiB0aGVpciByaWdodCBtaW5kIHdvdWxkIGRvIGl0LCBidXQgaXQncyBlYXN5Ci0JICAgICB0byBjbHVkZ2UuICovCi0JCSAgaWYgKChkaXNwc2l6ZSA9PSAwICYmICFwY19yZWwpIHx8Ci0JCSAgICAgICh0b19zZWcgIT0gbm93X3NlZyAmJiAhaXNfdW5kZWZpbmVkICYmIHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpKQotCQkgICAgZGlzcHNpemUgPSA0OwotCi0JCSAgaWYgKGRpc3BzaXplID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JICAgICAqIFdlIGhhdmUgYSBTRUdfVU5LTk9XTiBzeW1ib2wsIG9yIHRoZSBzaXplIGlzbid0IGNhc3QuCi0JICAgICAqIEl0IG1pZ2h0IHR1cm4gb3V0IHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMKLQkgICAgICogdGhlIGluc3RydWN0aW9uLCBwZXJtaXR0aW5nIHJlbGF4YXRpb24uCi0JICAgICAqLwotCQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA1LCAyLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURSksCi0JCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLCAwKTsKLQkJICAgICAgKnAgPSBvcGVyYW5kUC0+dG9wX3JlZzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIEVpdGhlciB0aGlzIGlzIGFuIGFicywgb3IgYSBjYXN0LiAqLwotCQkgICAgICBwID0gZnJhZ19tb3JlIChkaXNwc2l6ZSArIDEpOwotCQkgICAgICBzd2l0Y2ggKGRpc3BzaXplKQotCQkJewotCQkJY2FzZSAxOgotCQkJICAqcCA9IFRBSE9FX1BDX09SX0JZVEUgKyBvcGVyYW5kUC0+dG9wX3JlZzsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkgICpwID0gVEFIT0VfUENfT1JfV09SRCArIG9wZXJhbmRQLT50b3BfcmVnOwotCQkJICBicmVhazsKLQkJCWNhc2UgNDoKLQkJCSAgKnAgPSBUQUhPRV9QQ19PUl9MT05HICsgb3BlcmFuZFAtPnRvcF9yZWc7Ci0JCQkgIGJyZWFrOwotCQkJfTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkgICAgICAgc2l6ZV90b19meCAoZGlzcHNpemUsIHBjX3JlbCksIE5VTEwpOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFzX2ZhdGFsIChfKCJCYXJmLCBiYWQgbW9kZSAleFxuIiksIG9wZXJhbmRQLT50b3BfbW9kZSk7Ci0JCX0KLQkgICAgfQotCX0JCQkvKiBmb3Iob3BlcmFuZFApICovCi0gICAgfQkJCQkvKiBpZighbmVlZF9wYXNzXzIgJiYgIWdvb2ZlZCkgKi8KLX0JCQkJLyogdGFob2VfYXNzZW1ibGUoKSAqLwotCi0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0JCQkJLyogbWRfdW5kZWZpbmVkX3N5bWJvbCgpICovCi0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuICgoc2l6ZSArIDcpICYgfjcpOwkvKiBSb3VuZCBhbGwgc2VjdHMgdG8gbXVsdGlwbGUgb2YgOCAqLwotfQkJCQkvKiBtZF9zZWN0aW9uX2FsaWduKCkgKi8KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIHNwYXJjLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQsIHBsdXMKLSAgIGl0cyBzaXplLiAgVGhpcyBnZXRzIHVzIHRvIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uCi0gICAoPz8/IElzIHRoaXMgcmlnaHQ/ICBGSVhNRS1TT09OKSAqLwotbG9uZyAKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiAoKChmaXhQLT5meF90eXBlID09IEZYXzgKLQkgICAgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDgpCi0JICAgPyAxCi0JICAgOiAoKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMTYKLQkgICAgICAgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDE2KQotCSAgICAgID8gMgotCSAgICAgIDogKChmaXhQLT5meF90eXBlID09IEZYXzMyCi0JCSAgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDMyKQotCQkgPyA0Ci0JCSA6IDApKSkgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MpOwotfQkJCQkvKiBtZF9wY3JlbF9mcm9tKCkgKi8KLQotaW50IAotdGNfaXNfcGNyZWwgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIC8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgKi8KLSAga25vdyAoMCk7Ci0gIHJldHVybiAoMCk7Ci19CQkJCS8qIHRjX2lzX3BjcmVsKCkgKi8KLQotLyogZW5kIG9mIHRjLXRhaG9lLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGFob2UuaCBiL2dhcy9jb25maWcvdGMtdGFob2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4YTViZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtdGFob2UuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX1RBSE9FIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgTk9fTElTVElORwotCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIGRvbid0IG5lZWQgaXQuICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogZG9uJ3QgbmVlZCBpdC4gKi8KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayhhKQl7O30KLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy10YWhvZS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzMwLmMgYi9nYXMvY29uZmlnL3RjLXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NWMwNmEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg4OCArMCwwIEBACi0vKiB0Yy1jMzAuYyAtLSBBc3NlbWJseSBjb2RlIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCBtYWNoaW5lIHNwZWNpZmljIGdhcy4KLSAgIFdyaXR0ZW4gYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkuCi0gICBCdWdzICYgc3VnZ2VzdGlvbnMgYXJlIGNvbXBsZXRlbHkgd2VsY29tZS4gIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4KLSAgIFBsZWFzZSBoZWxwIHVzIG1ha2UgaXQgYmV0dGVyLgotICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9wY29kZS90aWMzMC5oIgotCi0vKiBwdXQgaGVyZSBhbGwgbm9uLWRpZ2l0IG5vbi1sZXR0ZXIgY2hhcmN0ZXJzIHRoYXQgbWF5IG9jY3VyIGluIGFuIG9wZXJhbmQgKi8KLXN0YXRpYyBjaGFyIG9wZXJhbmRfc3BlY2lhbF9jaGFyc1tdID0gIiUkLSsoLCkqLl9+Lzw+Jl4hOltAXSI7Ci1zdGF0aWMgY2hhciAqb3JkaW5hbF9uYW1lc1tdID0KLXsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIiwgImZvdXJ0aCIsICJmaWZ0aCJ9OwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDA7Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIqIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkZkRHhYIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiB0YWJsZXMgZm9yIGxleGljYWwgYW5hbHlzaXMgKi8KLXN0YXRpYyBjaGFyIG9wY29kZV9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgcmVnaXN0ZXJfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIG9wZXJhbmRfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIHNwYWNlX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBpZGVudGlmaWVyX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBkaWdpdF9jaGFyc1syNTZdOwotCi0vKiBsZXhpY2FsIG1hY3JvcyAqLwotI2RlZmluZSBpc19vcGNvZGVfY2hhcih4KSAob3Bjb2RlX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfb3BlcmFuZF9jaGFyKHgpIChvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfcmVnaXN0ZXJfY2hhcih4KSAocmVnaXN0ZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19zcGFjZV9jaGFyKHgpIChzcGFjZV9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX2lkZW50aWZpZXJfY2hhcih4KSAoaWRlbnRpZmllcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX2RpZ2l0X2NoYXIoeCkgKGRpZ2l0X2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgezAsIDAsIDB9Ci19OwotCi0jdW5kZWYgVVNFX1NURE9VVAotI2RlZmluZSBVU0VfU1RET1VUIDEKLQotI2lmZGVmIFVTRV9TVERBUkcKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi1pbnQKLWRlYnVnIChjb25zdCBjaGFyICpzdHJpbmcsLi4uKQotewotICBpZiAoZmxhZ19kZWJ1ZykKLSAgICB7Ci0gICAgICB2YV9saXN0IGFyZ3B0cjsKLSAgICAgIGNoYXIgc3RyWzEwMF07Ci0KLSAgICAgIHZhX3N0YXJ0IChhcmdwdHIsIHN0cmluZyk7Ci0gICAgICB2c3ByaW50ZiAoc3RyLCBzdHJpbmcsIGFyZ3B0cik7Ci0gICAgICBpZiAoc3RyWzBdID09ICdcMCcpCi0JcmV0dXJuICgwKTsKLSAgICAgIHZhX2VuZCAoYXJncHRyKTsKLSAgICAgIGZwdXRzIChzdHIsIFVTRV9TVERPVVQgPyBzdGRvdXQgOiBzdGRlcnIpOwotICAgICAgcmV0dXJuIHN0cmxlbiAoc3RyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLSNlbHNlCi1pbnQKLWRlYnVnIChzdHJpbmcsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIHZhX2RjbAotewotICBpZiAoZmxhZ19kZWJ1ZykKLSAgICB7Ci0gICAgICB2YV9saXN0IGFyZ3B0cjsKLSAgICAgIGNoYXIgc3RyWzEwMF07Ci0gICAgICBpbnQgY250OwotCi0gICAgICB2YV9zdGFydCAoYXJncHRyLCBzdHJpbmcpOwotICAgICAgY250ID0gdnNwcmludGYgKHN0ciwgc3RyaW5nLCBhcmdwdHIpOwotICAgICAgaWYgKHN0clswXSA9PSBOVUxMKQotCXJldHVybiAoMCk7Ci0gICAgICB2YV9lbmQgKGFyZ3B0cik7Ci0gICAgICBmcHV0cyAoc3RyLCBVU0VfU1RET1VUID8gc3Rkb3V0IDogc3RkZXJyKTsKLSAgICAgIHJldHVybiAoY250KTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiBoYXNoIHRhYmxlIGZvciBvcGNvZGUgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLS8qIGhhc2ggdGFibGUgZm9yIHBhcmFsbGVsIG9wY29kZSBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwYXJvcF9oYXNoOwotLyogaGFzaCB0YWJsZSBmb3IgcmVnaXN0ZXIgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcmVnX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmluZF9oYXNoOwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpoYXNoX2VycjsKLSAgZGVidWcgKCJJbiBtZF9iZWdpbigpXG4iKTsKLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgY29uc3QgdGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSB0aWMzMF9vcHRhYjsKLSAgICBmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX29wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIGN1cnJlbnRfb3B0YWItPm5hbWUsIChjaGFyICopIGN1cnJlbnRfb3B0YWIpOwotCWlmIChoYXNoX2VycikKLQkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9vcHRhYi0+bmFtZSwgaGFzaF9lcnIpOwotICAgICAgfQotICB9Ci0gIHBhcm9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIGNvbnN0IHBhcnRlbXBsYXRlICpjdXJyZW50X3Bhcm9wID0gdGljMzBfcGFyb3B0YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfcGFyb3AgPCB0aWMzMF9wYXJvcHRhYl9lbmQ7IGN1cnJlbnRfcGFyb3ArKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChwYXJvcF9oYXNoLCBjdXJyZW50X3Bhcm9wLT5uYW1lLCAoY2hhciAqKSBjdXJyZW50X3Bhcm9wKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBhc19mYXRhbCAoIkludGVybmFsIEVycm9yOiBDYW4ndCBIYXNoICVzOiAlcyIsIGN1cnJlbnRfcGFyb3AtPm5hbWUsIGhhc2hfZXJyKTsKLSAgICAgIH0KLSAgfQotICByZWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgY29uc3QgcmVnICpjdXJyZW50X3JlZyA9IHRpYzMwX3JlZ3RhYjsKLSAgICBmb3IgKDsgY3VycmVudF9yZWcgPCB0aWMzMF9yZWd0YWJfZW5kOyBjdXJyZW50X3JlZysrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKHJlZ19oYXNoLCBjdXJyZW50X3JlZy0+bmFtZSwgKGNoYXIgKikgY3VycmVudF9yZWcpOwotCWlmIChoYXNoX2VycikKLQkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9yZWctPm5hbWUsIGhhc2hfZXJyKTsKLSAgICAgIH0KLSAgfQotICBpbmRfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgY29uc3QgaW5kX2FkZHJfdHlwZSAqY3VycmVudF9pbmQgPSB0aWMzMF9pbmRhZGRyX3RhYjsKLSAgICBmb3IgKDsgY3VycmVudF9pbmQgPCB0aWMzMF9pbmRhZGRydGFiX2VuZDsgY3VycmVudF9pbmQrKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChpbmRfaGFzaCwgY3VycmVudF9pbmQtPnN5bnRheCwgKGNoYXIgKikgY3VycmVudF9pbmQpOwotCWlmIChoYXNoX2VycikKLQkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9pbmQtPnN5bnRheCwgaGFzaF9lcnIpOwotICAgICAgfQotICB9Ci0gIC8qIGZpbGwgaW4gbGV4aWNhbCB0YWJsZXM6ICBvcGNvZGVfY2hhcnMsIG9wZXJhbmRfY2hhcnMsIHNwYWNlX2NoYXJzICovCi0gIHsKLSAgICByZWdpc3RlciBpbnQgYzsKLSAgICByZWdpc3RlciBjaGFyICpwOwotCi0gICAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKQotICAgICAgewotCWlmIChpc2xvd2VyIChjKSB8fCBpc2RpZ2l0IChjKSkKLQkgIHsKLQkgICAgb3Bjb2RlX2NoYXJzW2NdID0gYzsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOwotCSAgfQotCWVsc2UgaWYgKGlzdXBwZXIgKGMpKQotCSAgewotCSAgICBvcGNvZGVfY2hhcnNbY10gPSB0b2xvd2VyIChjKTsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBvcGNvZGVfY2hhcnNbY107Ci0JICB9Ci0JZWxzZSBpZiAoYyA9PSAnKScgfHwgYyA9PSAnKCcpCi0JICB7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gYzsKLQkgIH0KLQlpZiAoaXN1cHBlciAoYykgfHwgaXNsb3dlciAoYykgfHwgaXNkaWdpdCAoYykpCi0JICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQlpZiAoaXNkaWdpdCAoYykgfHwgYyA9PSAnLScpCi0JICBkaWdpdF9jaGFyc1tjXSA9IGM7Ci0JaWYgKGlzYWxwaGEgKGMpIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy4nIHx8IGlzZGlnaXQgKGMpKQotCSAgaWRlbnRpZmllcl9jaGFyc1tjXSA9IGM7Ci0JaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKLQkgIHNwYWNlX2NoYXJzW2NdID0gYzsKLQlpZiAoYyA9PSAnXycpCi0JICBvcGNvZGVfY2hhcnNbY10gPSBjOwotICAgICAgfQotICAgIGZvciAocCA9IG9wZXJhbmRfc3BlY2lhbF9jaGFyczsgKnAgIT0gJ1wwJzsgcCsrKQotICAgICAgb3BlcmFuZF9jaGFyc1sodW5zaWduZWQgY2hhcikgKnBdID0gKnA7Ci0gIH0KLX0KLQotLyogQWRkcmVzcyBNb2RlIE9SIHZhbHVlcyAqLwotI2RlZmluZSBBTV9SZWdpc3RlciAgMHgwMDAwMDAwMAotI2RlZmluZSBBTV9EaXJlY3QgICAgMHgwMDIwMDAwMAotI2RlZmluZSBBTV9JbmRpcmVjdCAgMHgwMDQwMDAwMAotI2RlZmluZSBBTV9JbW1lZGlhdGUgMHgwMDYwMDAwMAotI2RlZmluZSBBTV9Ob3RSZXEgICAgMHhGRkZGRkZGRgotCi0vKiBQQyBSZWxhdGl2ZSBPUiB2YWx1ZXMgKi8KLSNkZWZpbmUgUENfUmVnaXN0ZXIgMHgwMDAwMDAwMAotI2RlZmluZSBQQ19SZWxhdGl2ZSAweDAyMDAwMDAwCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIG9wX3R5cGU7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCByZXNvbHZlZDsKLSAgICAgIHVuc2lnbmVkIGFkZHJlc3M7Ci0gICAgICBjaGFyICpsYWJlbDsKLSAgICAgIGV4cHJlc3Npb25TIGRpcmVjdF9leHByOwotICAgIH0KLSAgZGlyZWN0OwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBtb2Q7Ci0gICAgICBpbnQgQVJudW07Ci0gICAgICB1bnNpZ25lZCBjaGFyIGRpc3A7Ci0gICAgfQotICBpbmRpcmVjdDsKLSAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgb3Bjb2RlOwotICAgIH0KLSAgcmVnOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgcmVzb2x2ZWQ7Ci0gICAgICBpbnQgZGVjaW1hbF9mb3VuZDsKLSAgICAgIGZsb2F0IGZfbnVtYmVyOwotICAgICAgaW50IHNfbnVtYmVyOwotICAgICAgdW5zaWduZWQgaW50IHVfbnVtYmVyOwotICAgICAgY2hhciAqbGFiZWw7Ci0gICAgICBleHByZXNzaW9uUyBpbW1fZXhwcjsKLSAgICB9Ci0gIGltbWVkaWF0ZTsKLX0KLW9wZXJhbmQ7Ci0KLWludCB0aWMzMF9wYXJhbGxlbF9pbnNuIFBBUkFNUyAoKGNoYXIgKikpOwotb3BlcmFuZCAqdGljMzBfb3BlcmFuZCBQQVJBTVMgKChjaGFyICopKTsKLWNoYXIgKnRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbiBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOwotCi10ZW1wbGF0ZSAqb3Bjb2RlOwotCi1zdHJ1Y3QgdGljMzBfaW5zbgotICB7Ci0gICAgdGVtcGxhdGUgKnRtOwkJLyogVGVtcGxhdGUgb2YgY3VycmVudCBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIG9wY29kZTsJCS8qIEZpbmFsIG9wY29kZSAqLwotICAgIGludCBvcGVyYW5kczsJCS8qIE51bWJlciBvZiBnaXZlbiBvcGVyYW5kcyAqLwotICAgIC8qIFR5cGUgb2Ygb3BlcmFuZCBnaXZlbiBpbiBpbnN0cnVjdGlvbiAqLwotICAgIG9wZXJhbmQgKm9wZXJhbmRfdHlwZVtNQVhfT1BFUkFORFNdOwotICAgIHVuc2lnbmVkIGFkZHJlc3NpbmdfbW9kZTsJLyogRmluYWwgYWRkcmVzc2luZyBtb2RlIG9mIGluc3RydWN0aW9uICovCi0gIH07Ci0KLXN0cnVjdCB0aWMzMF9pbnNuIGluc247Ci1zdGF0aWMgaW50IGZvdW5kX3BhcmFsbGVsX2luc247Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChsaW5lKQotICAgICBjaGFyICpsaW5lOwotewotICB0ZW1wbGF0ZSAqb3Bjb2RlOwotICBjaGFyICpjdXJyZW50X3Bvc247Ci0gIGNoYXIgKnRva2VuX3N0YXJ0OwotICBjaGFyIHNhdmVfY2hhcjsKLSAgaW50IGNvdW50OwotCi0gIGRlYnVnICgiSW4gbWRfYXNzZW1ibGUoKSB3aXRoIGFyZ3VtZW50ICVzXG4iLCBsaW5lKTsKLSAgbWVtc2V0ICgmaW5zbiwgJ1wwJywgc2l6ZW9mIChpbnNuKSk7Ci0gIGlmIChmb3VuZF9wYXJhbGxlbF9pbnNuKQotICAgIHsKLSAgICAgIGRlYnVnICgiTGluZSBpcyBzZWNvbmQgcGFydCBvZiBwYXJhbGxlbCBpbnN0cnVjdGlvblxuXG4iKTsKLSAgICAgIGZvdW5kX3BhcmFsbGVsX2luc24gPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKChjdXJyZW50X3Bvc24gPSB0aWMzMF9maW5kX3BhcmFsbGVsX2luc24gKGxpbmUsIGlucHV0X2xpbmVfcG9pbnRlciArIDEpKSA9PSBOVUxMKQotICAgIGN1cnJlbnRfcG9zbiA9IGxpbmU7Ci0gIGVsc2UKLSAgICBmb3VuZF9wYXJhbGxlbF9pbnNuID0gMTsKLSAgd2hpbGUgKGlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotICAgIGN1cnJlbnRfcG9zbisrOwotICB0b2tlbl9zdGFydCA9IGN1cnJlbnRfcG9zbjsKLSAgaWYgKCFpc19vcGNvZGVfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0gICAgewotICAgICAgYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gb3Bjb2RlIiwgb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qIENoZWNrIGlmIGluc3RydWN0aW9uIGlzIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gYnkgc2VlaW5nIGlmIHRoZSBmaXJzdAotICAgICBjaGFyYWN0ZXIgaXMgYSBxLiAqLwotICBpZiAoKnRva2VuX3N0YXJ0ID09ICdxJykKLSAgICB7Ci0gICAgICBpZiAodGljMzBfcGFyYWxsZWxfaW5zbiAodG9rZW5fc3RhcnQpKQotCXsKLQkgIGlmIChmb3VuZF9wYXJhbGxlbF9pbnNuKQotCSAgICBmcmVlICh0b2tlbl9zdGFydCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgd2hpbGUgKGlzX29wY29kZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLSAgICBjdXJyZW50X3Bvc24rKzsKLSAgewkJCQkvKiBGaW5kIGluc3RydWN0aW9uICovCi0gICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKLSAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKLSAgICBvcGNvZGUgPSAodGVtcGxhdGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCB0b2tlbl9zdGFydCk7Ci0gICAgaWYgKG9wY29kZSkKLSAgICAgIHsKLQlkZWJ1ZyAoIkZvdW5kIGluc3RydWN0aW9uICVzXG4iLCBvcGNvZGUtPm5hbWUpOwotCWluc24udG0gPSBvcGNvZGU7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWRlYnVnICgiRGlkbid0IGZpbmQgaW5zblxuIik7Ci0JYXNfYmFkICgiVW5rbm93biBUTVMzMjBDMzAgaW5zdHJ1Y3Rpb246ICVzIiwgdG9rZW5fc3RhcnQpOwotCXJldHVybjsKLSAgICAgIH0KLSAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOwotICB9Ci0gIGlmICgqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKQotICAgIHsJCQkJLyogRmluZCBvcGVyYW5kcyAqLwotICAgICAgaW50IHBhcmVuX25vdF9iYWxhbmNlZDsKLSAgICAgIGludCBleHBlY3Rpbmdfb3BlcmFuZCA9IDA7Ci0gICAgICBpbnQgdGhpc19vcGVyYW5kOwotICAgICAgZG8KLQl7Ci0JICAvKiBza2lwIG9wdGlvbmFsIHdoaXRlIHNwYWNlIGJlZm9yZSBvcGVyYW5kICovCi0JICB3aGlsZSAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTikKLQkgICAgewotCSAgICAgIGlmICghaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0JCXsKLQkJICBhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBiZWZvcmUgJXMgb3BlcmFuZCIsCi0JCQkgIG91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKLQkJCSAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgY3VycmVudF9wb3NuKys7Ci0JICAgIH0KLQkgIHRva2VuX3N0YXJ0ID0gY3VycmVudF9wb3NuOwkvKiBhZnRlciB3aGl0ZSBzcGFjZSAqLwotCSAgcGFyZW5fbm90X2JhbGFuY2VkID0gMDsKLQkgIHdoaWxlIChwYXJlbl9ub3RfYmFsYW5jZWQgfHwgKmN1cnJlbnRfcG9zbiAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSBFTkRfT0ZfSU5TTikKLQkJewotCQkgIGlmIChwYXJlbl9ub3RfYmFsYW5jZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoIlVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gJXMgb3BlcmFuZC4iLAotCQkJICAgICAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsJLyogd2UgYXJlIGRvbmUgKi8KLQkJfQotCSAgICAgIGVsc2UgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLQkJewotCQkgIGFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGluICVzIG9wZXJhbmQiLAotCQkJICBvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbiksCi0JCQkgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09ICcoJykKLQkJKytwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJyknKQotCQktLXBhcmVuX25vdF9iYWxhbmNlZDsKLQkgICAgICBjdXJyZW50X3Bvc24rKzsKLQkgICAgfQotCSAgaWYgKGN1cnJlbnRfcG9zbiAhPSB0b2tlbl9zdGFydCkKLQkgICAgewkJCS8qIHllcywgd2UndmUgcmVhZCBpbiBhbm90aGVyIG9wZXJhbmQgKi8KLQkgICAgICB0aGlzX29wZXJhbmQgPSBpbnNuLm9wZXJhbmRzKys7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZHMgPiBNQVhfT1BFUkFORFMpCi0JCXsKLQkJICBhc19iYWQgKCJTcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiLAotCQkJICBNQVhfT1BFUkFORFMpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIC8qIG5vdyBwYXJzZSBvcGVyYW5kIGFkZGluZyBpbmZvIHRvICdpbnNuJyBhcyB3ZSBnbyBhbG9uZyAqLwotCSAgICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247Ci0JICAgICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7Ci0JICAgICAgaW5zbi5vcGVyYW5kX3R5cGVbdGhpc19vcGVyYW5kXSA9IHRpYzMwX29wZXJhbmQgKHRva2VuX3N0YXJ0KTsKLQkgICAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVt0aGlzX29wZXJhbmRdID09IE5VTEwpCi0JCXJldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGV4cGVjdGluZ19vcGVyYW5kKQotCQl7Ci0JCSAgYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09ICcsJykKLQkJewotCQkgIGFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQkgIC8qIG5vdyAqY3VycmVudF9wb3NuIG11c3QgYmUgZWl0aGVyICcsJyBvciBFTkRfT0ZfSU5TTiAqLwotCSAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQotCSAgICB7Ci0JICAgICAgaWYgKCorK2N1cnJlbnRfcG9zbiA9PSBFTkRfT0ZfSU5TTikKLQkJewkJLyoganVzdCBza2lwIGl0LCBpZiBpdCdzIFxuIGNvbXBsYWluICovCi0JCSAgYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4cGVjdGluZ19vcGVyYW5kID0gMTsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlICgqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKTsJLyogdW50aWwgd2UgZ2V0IGVuZCBvZiBpbnNuICovCi0gICAgfQotICBkZWJ1ZyAoIk51bWJlciBvZiBvcGVyYW5kcyBmb3VuZDogJWRcbiIsIGluc24ub3BlcmFuZHMpOwotICAvKiBDaGVjayB0aGF0IG51bWJlciBvZiBvcGVyYW5kcyBpcyBjb3JyZWN0ICovCi0gIGlmIChpbnNuLm9wZXJhbmRzICE9IGluc24udG0tPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgaW50IG51bW9wcyA9IGluc24udG0tPm9wZXJhbmRzOwotICAgICAgLyogSWYgb3BlcmFuZHMgYXJlIG5vdCB0aGUgc2FtZSwgdGhlbiBzZWUgaWYgYW55IG9mIHRoZSBvcGVyYW5kcyBhcmUgbm90Ci0gICAgICAgICByZXF1aXJlZC4gIFRoZW4gcmVjaGVjayB3aXRoIG51bWJlciBvZiBnaXZlbiBvcGVyYW5kcy4gIElmIHRoZXkgYXJlIHN0aWxsIG5vdAotICAgICAgICAgdGhlIHNhbWUsIHRoZW4gZ2l2ZSBhbiBlcnJvciwgb3RoZXJ3aXNlIGNhcnJ5IG9uLiAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGluc24udG0tPm9wZXJhbmRzOyBpKyspCi0JaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbaV0gJiBOb3RSZXEpCi0JICBudW1vcHMtLTsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRzICE9IG51bW9wcykKLQl7Ci0JICBhc19iYWQgKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG9wZXJhbmRzIGdpdmVuIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9Ob3RSZXE7Ci0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGluc24ub3BlcmFuZHM7IGNvdW50KyspCi0gICAgewotICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW2NvdW50XS0+b3BfdHlwZSAmIGluc24udG0tPm9wZXJhbmRfdHlwZXNbY291bnRdKQotCXsKLQkgIGRlYnVnICgiT3BlcmFuZCAlZCBtYXRjaGVzXG4iLCBjb3VudCArIDEpOwotCSAgLyogSWYgaW5zdHJ1Y3Rpb24gaGFzIHR3byBvcGVyYW5kcyBhbmQgaGFzIGFuIEFkZHJlc3NNb2RlIG1vZGlmaWVyIHRoZW4gc2V0Ci0JICAgICBhZGRyZXNzaW5nIG1vZGUgdHlwZSBmb3IgaW5zdHJ1Y3Rpb24gKi8KLQkgIGlmIChpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gQWRkcmVzc01vZGUpCi0JICAgIHsKLQkgICAgICBpbnQgYWRkcl9pbnNuID0gMDsKLQkgICAgICAvKiBTdG9yZSBpbnN0cnVjdGlvbiB1c2VzIHRoZSBzZWNvbmQgb3BlcmFuZCBmb3IgdGhlIGFkZHJlc3MgbW9kZS4gKi8KLQkgICAgICBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMV0gJiAoSW5kaXJlY3QgfCBEaXJlY3QpKSA9PSAoSW5kaXJlY3QgfCBEaXJlY3QpKQotCQlhZGRyX2luc24gPSAxOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthZGRyX2luc25dLT5vcF90eXBlICYgKEFsbFJlZykpCi0JCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fUmVnaXN0ZXI7Ci0JICAgICAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbYWRkcl9pbnNuXS0+b3BfdHlwZSAmIERpcmVjdCkKLQkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9EaXJlY3Q7Ci0JICAgICAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbYWRkcl9pbnNuXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0luZGlyZWN0OwotCSAgICAgIGVsc2UKLQkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbW1lZGlhdGU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkICgiVGhlICVzIG9wZXJhbmQgZG9lc24ndCBtYXRjaCIsIG9yZGluYWxfbmFtZXNbY291bnRdKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICAvKiBOb3cgc2V0IHRoZSBhZGRyZXNzaW5nIG1vZGUgZm9yIDMgb3BlcmFuZCBpbnN0cnVjdGlvbnMuICovCi0gIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIG9wM1QxKSAmJiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1sxXSAmIG9wM1QyKSkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGFkZHJlc3NpbmcgbW9kZSB0byB0aGUgdmFsdWVzIHVzZWQgZm9yIDIgb3BlcmFuZCBpbnN0cnVjdGlvbnMgaW4gdGhlCi0gICAgICAgICBHIGFkZHJlc3NpbmcgZmllbGQgb2YgdGhlIG9wY29kZS4gKi8KLSAgICAgIGNoYXIgKnA7Ci0gICAgICBzd2l0Y2ggKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlKQotCXsKLQljYXNlIFJuOgotCWNhc2UgQVJuOgotCWNhc2UgRFBSZWc6Ci0JY2FzZSBPdGhlclJlZzoKLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX1JlZ2lzdGVyOwotCSAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9EaXJlY3Q7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTaG91bGRuJ3QgbWFrZSBpdCB0byB0aGlzIHN0YWdlICovCi0JICAgICAgYXNfYmFkICgiSW5jb21wYXRpYmxlIGZpcnN0IGFuZCBzZWNvbmQgb3BlcmFuZHMgaW4gaW5zdHJ1Y3Rpb24iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgSW5kaXJlY3Q6Ci0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbmRpcmVjdDsKLQkgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW1tZWRpYXRlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2hvdWxkbid0IG1ha2UgaXQgdG8gdGhpcyBzdGFnZSAqLwotCSAgICAgIGFzX2JhZCAoIkluY29tcGF0aWJsZSBmaXJzdCBhbmQgc2Vjb25kIG9wZXJhbmRzIGluIGluc3RydWN0aW9uIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBOb3cgbWFrZSB1cCB0aGUgb3Bjb2RlIGZvciB0aGUgMyBvcGVyYW5kIGluc3RydWN0aW9ucy4gIEFzIGluIHBhcmFsbGVsCi0gICAgICAgICBpbnN0cnVjdGlvbnMsIHRoZXJlIHdpbGwgYmUgbm8gdW5yZXNvbHZlZCB2YWx1ZXMsIHNvIHRoZXkgY2FuIGJlIGZ1bGx5IGZvcm1lZAotICAgICAgICAgYW5kIGFkZGVkIHRvIHRoZSBmcmFnIHRhYmxlLiAqLwotICAgICAgaW5zbi5vcGNvZGUgPSBpbnNuLnRtLT5iYXNlX29wY29kZTsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCXsKLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JfQotICAgICAgZWxzZQotCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSk7Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQl7Ci0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCX0KLSAgICAgIGVsc2UKLQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUgPDwgOCk7Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kcyA9PSAzKQotCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsyXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0gICAgICBpbnNuLm9wY29kZSB8PSBpbnNuLmFkZHJlc3NpbmdfbW9kZTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKElOU05fU0laRSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotICAgIH0KLSAgZWxzZQotICAgIHsJCQkJLyogTm90IGEgdGhyZWUgb3BlcmFuZCBpbnN0cnVjdGlvbiAqLwotICAgICAgY2hhciAqcDsKLSAgICAgIGludCBhbV9pbnNuID0gLTE7Ci0gICAgICBpbnNuLm9wY29kZSA9IGluc24udG0tPmJhc2Vfb3Bjb2RlOwotICAgICAgLyogQ3JlYXRlIGZyYWcgZm9yIGluc3RydWN0aW9uIC0gYWxsIGluc3RydWN0aW9ucyBhcmUgNCBieXRlcyBsb25nLiAqLwotICAgICAgcCA9IGZyYWdfbW9yZSAoSU5TTl9TSVpFKTsKLSAgICAgIGlmICgoaW5zbi5vcGVyYW5kcyA+IDApICYmIChpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gQWRkcmVzc01vZGUpKQotCXsKLQkgIGluc24ub3Bjb2RlIHw9IGluc24uYWRkcmVzc2luZ19tb2RlOwotCSAgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX0luZGlyZWN0KQotCSAgICB7Ci0JICAgICAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmQgZ2l2ZXMgdGhlIGFkZHJlc3NpbmcgbW9kZSAqLwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCQlhbV9pbnNuID0gMDsKLQkgICAgICBpZiAoKGluc24ub3BlcmFuZHMgPiAxKSAmJiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkpCi0JCWFtX2luc24gPSAxOwotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+aW5kaXJlY3QuZGlzcCk7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbIWFtX2luc25dLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnNuLmFkZHJlc3NpbmdfbW9kZSA9PSBBTV9SZWdpc3RlcikKLQkgICAgewotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSk7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX0RpcmVjdCkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIERpcmVjdCkKLQkJYW1faW5zbiA9IDA7Ci0JICAgICAgaWYgKChpbnNuLm9wZXJhbmRzID4gMSkgJiYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgRGlyZWN0KSkKLQkJYW1faW5zbiA9IDE7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbIWFtX2luc25dLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmRpcmVjdC5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgLyogUmVzb2x2ZWQgdmFsdWVzIGNhbiBiZSBwbGFjZWQgc3RyYWlnaHQgaW50byBpbnN0cnVjdGlvbiB3b3JkLCBhbmQgb3V0cHV0ICovCi0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5kaXJlY3QuYWRkcmVzcyAmIDB4MDAwMEZGRkYpOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsJCS8qIFVucmVzb2x2ZWQgZGlyZWN0IGFkZHJlc3NpbmcgbW9kZSBpbnN0cnVjdGlvbiAqLwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMiAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDIsICZpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+ZGlyZWN0LmRpcmVjdF9leHByLCAwLCAwKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChpbnNuLmFkZHJlc3NpbmdfbW9kZSA9PSBBTV9JbW1lZGlhdGUpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgY2hhciAqa2VlcGxvYzsKLQkJICBpbnQgc2l6ZTsKLQkJICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCSAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCQkgIHN3aXRjaCAoaW5zbi50bS0+aW1tX2FyZ190eXBlKQotCQkgICAgewotCQkgICAgY2FzZSBJbW1fRmxvYXQ6Ci0JCSAgICAgIGRlYnVnICgiRmxvYXRpbmcgcG9pbnQgZmlyc3Qgb3BlcmFuZFxuIik7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICAgIGtlZXBsb2MgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUubGFiZWw7Ci0JCSAgICAgIGlmIChtZF9hdG9mICgnZicsIHAgKyAyLCAmc2l6ZSkgIT0gMCkKLQkJCXsKLQkJCSAgYXNfYmFkICgiaW52YWxpZCBzaG9ydCBmb3JtIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBvcGVyYW5kIik7Ci0JCQkgIHJldHVybjsKLQkJCX0KLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0ga2VlcGxvYzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEltbV9VSW50OgotCQkgICAgICBkZWJ1ZyAoIlVuc2lnbmVkIGludCBmaXJzdCBvcGVyYW5kXG4iKTsKLQkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuZGVjaW1hbF9mb3VuZCkKLQkJCWFzX3dhcm4gKCJyb3VuZGluZyBkb3duIGZpcnN0IG9wZXJhbmQgZmxvYXQgdG8gdW5zaWduZWQgaW50Iik7Ci0JCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyID4gMHhGRkZGKQotCQkJYXNfd2FybiAoIm9ubHkgbG93ZXIgMTYtYml0cyBvZiBmaXJzdCBvcGVyYW5kIGFyZSB1c2VkIik7Ci0JCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyICYgMHgwMDAwRkZGRkwpOwotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgSW1tX1NJbnQ6Ci0JCSAgICAgIGRlYnVnICgiSW50IGZpcnN0IG9wZXJhbmRcbiIpOwotCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kKQotCQkJYXNfd2FybiAoInJvdW5kaW5nIGRvd24gZmlyc3Qgb3BlcmFuZCBmbG9hdCB0byBzaWduZWQgaW50Iik7Ci0JCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyIDwgLTMyNzY4IHx8Ci0JCQkgIGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPiAzMjc2NykKLQkJCXsKLQkJCSAgYXNfYmFkICgiZmlyc3Qgb3BlcmFuZCBpcyB0b28gbGFyZ2UgZm9yIDE2LWJpdCBzaWduZWQgaW50Iik7Ci0JCQkgIHJldHVybjsKLQkJCX0KLQkJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgJiAweDAwMDBGRkZGTCk7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiBVbnJlc29sdmVkIGltbWVkaWF0ZSBsYWJlbCAqLwotCQkgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMiwgJmluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDAsIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gUENSZWwpCi0JewotCSAgLyogQ29uZGl0aW9uYWwgQnJhbmNoIGFuZCBDYWxsIGluc3RydWN0aW9ucyAqLwotCSAgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgKEFsbFJlZyB8IERpc3ApKSA9PSAoQWxsUmVnIHwgRGlzcCkpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkJewotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSk7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVnaXN0ZXI7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlbGF0aXZlOwotCQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JCSAgICB7Ci0JCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyICYgMHgwMDAwRkZGRik7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMiwgJmluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDEsIDApOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgQVJuKSA9PSBBUm4pCi0JICAgIHsKLQkgICAgICAvKiBEZWNyZW1lbnQgYW5kIEJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLQkgICAgICBpbnNuLm9wY29kZSB8PSAoKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlIC0gMHgwOCkgPDwgMjIpOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCQl7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlKTsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWdpc3RlcjsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuZGVjaW1hbF9mb3VuZCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiZmlyc3Qgb3BlcmFuZCBpcyBmbG9hdGluZyBwb2ludCIpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPCAtMzI3NjggfHwKLQkJICAgICAgaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA+IDMyNzY3KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJmaXJzdCBvcGVyYW5kIGlzIHRvbyBsYXJnZSBmb3IgMTYtYml0IHNpZ25lZCBpbnQiKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW1tZWRpYXRlLnNfbnVtYmVyKTsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWxhdGl2ZTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVsYXRpdmU7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsICZpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW1tZWRpYXRlLmltbV9leHByLCAxLCAwKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSA9PSBJVmVjdG9yKQotCXsKLQkgIC8qIFRyYXAgaW5zdHJ1Y3Rpb25zICovCi0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBJVmVjdG9yKQotCSAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlcik7Ci0JICBlbHNlCi0JICAgIHsJCQkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8KLQkgICAgICBhc19iYWQgKCJpbnRlcnJ1cHQgdmVjdG9yIGZvciB0cmFwIGluc3RydWN0aW9uIG91dCBvZiByYW5nZSIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gU3RhY2tPcCB8fCBpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gUm90YXRlKQotCXsKLQkgIC8qIFB1c2gsIFBvcCBhbmQgUm90YXRlIGluc3RydWN0aW9ucyAqLwotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JfQotICAgICAgZWxzZSBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiAoQWJzMjQgfCBEaXJlY3QpKSA9PSAoQWJzMjQgfCBEaXJlY3QpKQotCXsKLQkgIC8qIExEUCBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSB0ZXN0ZWQgZm9yIGJlZm9yZSB0aGUgbmV4dCBzZWN0aW9uICovCi0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBEaXJlY3QpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmRpcmVjdC5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgLyogRGlyZWN0IGFkZHJlc3NpbmcgdXNlcyBsb3dlciA4IGJpdHMgb2YgZGlyZWN0IGFkZHJlc3MgKi8KLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmRpcmVjdC5hZGRyZXNzICYgMHgwMEZGMDAwMCkgPj4gMTY7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZpeFMgKmZpeDsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDMgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAxLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmRpcmVjdC5kaXJlY3RfZXhwciwgMCwgMCk7Ci0JCSAgLyogRW5zdXJlIHRoYXQgdGhlIGFzc2VtYmxlciBkb2Vzbid0IGNvbXBsYWluIGFib3V0IGZpdHRpbmcgYSAyNC1iaXQKLQkJICAgICBhZGRyZXNzIGludG8gOCBiaXRzLiAqLwotCQkgIGZpeC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JCXsKLQkJICAvKiBJbW1lZGlhdGUgYWRkcmVzc2luZyB1c2VzIHVwcGVyIDggYml0cyBvZiBhZGRyZXNzICovCi0JCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgPiAweDAwRkZGRkZGKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJMRFAgaW5zdHJ1Y3Rpb24gbmVlZHMgYSAyNC1iaXQgb3BlcmFuZCIpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgaW5zbi5vcGNvZGUgfD0gKChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyICYgMHgwMEZGMDAwMCkgPj4gMTYpOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaXhTICpmaXg7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXggPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAzIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMSwgJmluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDAsIDApOwotCQkgIGZpeC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgKEltbTI0KSkKLQl7Ci0JICAvKiBVbmNvbmRpdGlvbmFsIEJyYW5jaCBhbmQgQ2FsbCBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciA+IDB4MDBGRkZGRkYpCi0JCWFzX3dhcm4gKCJmaXJzdCBvcGVyYW5kIGlzIHRvbyBsYXJnZSBmb3IgYSAyNC1iaXQgZGlzcGxhY2VtZW50Iik7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgJiAweDAwRkZGRkZGKTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDEgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAzLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgTm90UmVxKQotCXsKLQkgIC8qIENoZWNrIGZvciBOT1AgaW5zdHJ1Y3Rpb24gd2l0aG91dCBhcmd1bWVudHMuICovCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRzID09IDApCi0JewotCSAgLyogQ2hlY2sgZm9yIGluc3RydWN0aW9ucyB3aXRob3V0IG9wZXJhbmRzLiAqLwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgfQotICBkZWJ1ZyAoIkFkZHJlc3NpbmcgbW9kZTogJTA4WFxuIiwgaW5zbi5hZGRyZXNzaW5nX21vZGUpOwotICB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluc24ub3BlcmFuZHM7IGkrKykKLSAgICAgIHsKLQlpZiAoaW5zbi5vcGVyYW5kX3R5cGVbaV0tPmltbWVkaWF0ZS5sYWJlbCkKLQkgIGZyZWUgKGluc24ub3BlcmFuZF90eXBlW2ldLT5pbW1lZGlhdGUubGFiZWwpOwotCWZyZWUgKGluc24ub3BlcmFuZF90eXBlW2ldKTsKLSAgICAgIH0KLSAgfQotICBkZWJ1ZyAoIkZpbmFsIG9wY29kZTogJTA4WFxuIiwgaW5zbi5vcGNvZGUpOwotICBkZWJ1ZyAoIlxuIik7Ci19Ci0KLXN0cnVjdCB0aWMzMF9wYXJfaW5zbgotewotICBwYXJ0ZW1wbGF0ZSAqdG07CQkvKiBUZW1wbGF0ZSBvZiBjdXJyZW50IHBhcmFsbGVsIGluc3RydWN0aW9uICovCi0gIGludCBvcGVyYW5kc1syXTsJCS8qIE51bWJlciBvZiBnaXZlbiBvcGVyYW5kcyBmb3IgZWFjaCBpbnNuICovCi0gIC8qIFR5cGUgb2Ygb3BlcmFuZCBnaXZlbiBpbiBpbnN0cnVjdGlvbiAqLwotICBvcGVyYW5kICpvcGVyYW5kX3R5cGVbMl1bTUFYX09QRVJBTkRTXTsKLSAgaW50IHN3YXBfb3BlcmFuZHM7CQkvKiBXaGV0aGVyIHRvIHN3YXAgb3BlcmFuZHMgYXJvdW5kLiAqLwotICB1bnNpZ25lZCBwX2ZpZWxkOwkJLyogVmFsdWUgb2YgcCBmaWVsZCBpbiBtdWx0aXBseSBhZGQvc3ViIGluc3RydWN0aW9ucyAqLwotICB1bnNpZ25lZCBvcGNvZGU7CQkvKiBGaW5hbCBvcGNvZGUgKi8KLX07Ci0KLXN0cnVjdCB0aWMzMF9wYXJfaW5zbiBwX2luc247Ci0KLWludAotdGljMzBfcGFyYWxsZWxfaW5zbiAoY2hhciAqdG9rZW4pCi17Ci0gIHN0YXRpYyBwYXJ0ZW1wbGF0ZSAqcF9vcGNvZGU7Ci0gIGNoYXIgKmN1cnJlbnRfcG9zbiA9IHRva2VuOwotICBjaGFyICp0b2tlbl9zdGFydDsKLSAgY2hhciBzYXZlX2NoYXI7Ci0KLSAgZGVidWcgKCJJbiB0aWMzMF9wYXJhbGxlbF9pbnNuIHdpdGggJXNcbiIsIHRva2VuKTsKLSAgbWVtc2V0ICgmcF9pbnNuLCAnXDAnLCBzaXplb2YgKHBfaW5zbikpOwotICB3aGlsZSAoaXNfb3Bjb2RlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotICAgIGN1cnJlbnRfcG9zbisrOwotICB7CQkJCS8qIEZpbmQgaW5zdHJ1Y3Rpb24gKi8KLSAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOwotICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOwotICAgIHBfb3Bjb2RlID0gKHBhcnRlbXBsYXRlICopIGhhc2hfZmluZCAocGFyb3BfaGFzaCwgdG9rZW4pOwotICAgIGlmIChwX29wY29kZSkKLSAgICAgIHsKLQlkZWJ1ZyAoIkZvdW5kIGluc3RydWN0aW9uICVzXG4iLCBwX29wY29kZS0+bmFtZSk7Ci0JcF9pbnNuLnRtID0gcF9vcGNvZGU7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWNoYXIgZmlyc3Rfb3Bjb2RlWzZdID0KLQl7MH07Ci0JY2hhciBzZWNvbmRfb3Bjb2RlWzZdID0KLQl7MH07Ci0JaW50IGk7Ci0JaW50IGN1cnJlbnRfb3Bjb2RlID0gLTE7Ci0JaW50IGNoYXJfcHRyID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4gKHRva2VuKTsgaSsrKQotCSAgewotCSAgICBjaGFyIGNoID0gKih0b2tlbiArIGkpOwotCSAgICBpZiAoY2ggPT0gJ18nICYmIGN1cnJlbnRfb3Bjb2RlID09IC0xKQotCSAgICAgIHsKLQkJY3VycmVudF9vcGNvZGUgPSAwOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIGlmIChjaCA9PSAnXycgJiYgY3VycmVudF9vcGNvZGUgPT0gMCkKLQkgICAgICB7Ci0JCWN1cnJlbnRfb3Bjb2RlID0gMTsKLQkJY2hhcl9wdHIgPSAwOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIHN3aXRjaCAoY3VycmVudF9vcGNvZGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgMDoKLQkJZmlyc3Rfb3Bjb2RlW2NoYXJfcHRyKytdID0gY2g7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMToKLQkJc2Vjb25kX29wY29kZVtjaGFyX3B0cisrXSA9IGNoOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JZGVidWcgKCJmaXJzdF9vcGNvZGUgPSAlc1xuIiwgZmlyc3Rfb3Bjb2RlKTsKLQlkZWJ1ZyAoInNlY29uZF9vcGNvZGUgPSAlc1xuIiwgc2Vjb25kX29wY29kZSk7Ci0Jc3ByaW50ZiAodG9rZW4sICJxXyVzXyVzIiwgc2Vjb25kX29wY29kZSwgZmlyc3Rfb3Bjb2RlKTsKLQlwX29wY29kZSA9IChwYXJ0ZW1wbGF0ZSAqKSBoYXNoX2ZpbmQgKHBhcm9wX2hhc2gsIHRva2VuKTsKLQlpZiAocF9vcGNvZGUpCi0JICB7Ci0JICAgIGRlYnVnICgiRm91bmQgaW5zdHJ1Y3Rpb24gJXNcbiIsIHBfb3Bjb2RlLT5uYW1lKTsKLQkgICAgcF9pbnNuLnRtID0gcF9vcGNvZGU7Ci0JICAgIHBfaW5zbi5zd2FwX29wZXJhbmRzID0gMTsKLQkgIH0KLQllbHNlCi0JICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOwotICB9Ci0gIHsJCQkJLyogRmluZCBvcGVyYW5kcyAqLwotICAgIGludCBwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0gICAgaW50IGV4cGVjdGluZ19vcGVyYW5kID0gMDsKLSAgICBpbnQgZm91bmRfc2VwYXJhdG9yID0gMDsKLSAgICBkbwotICAgICAgewotCS8qIHNraXAgb3B0aW9uYWwgd2hpdGUgc3BhY2UgYmVmb3JlIG9wZXJhbmQgKi8KLQl3aGlsZSAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTikKLQkgIHsKLQkgICAgaWYgKCFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAqY3VycmVudF9wb3NuICE9IFBBUkFMTEVMX1NFUEFSQVRPUikKLQkgICAgICB7Ci0JCWFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSAlcyBvcGVyYW5kIiwKLQkJCW91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKLQkJCW9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09IFBBUkFMTEVMX1NFUEFSQVRPUikKLQkgICAgICBmb3VuZF9zZXBhcmF0b3IgPSAxOwotCSAgICBjdXJyZW50X3Bvc24rKzsKLQkgIH0KLQl0b2tlbl9zdGFydCA9IGN1cnJlbnRfcG9zbjsJLyogYWZ0ZXIgd2hpdGUgc3BhY2UgKi8KLQlwYXJlbl9ub3RfYmFsYW5jZWQgPSAwOwotCXdoaWxlIChwYXJlbl9ub3RfYmFsYW5jZWQgfHwgKmN1cnJlbnRfcG9zbiAhPSAnLCcpCi0JICB7Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQotCSAgICAgIHsKLQkJaWYgKHBhcmVuX25vdF9iYWxhbmNlZCkKLQkJICB7Ci0JCSAgICBhc19iYWQgKCJVbmJhbGFuY2VkIHBhcmVudGhlc2lzIGluICVzIG9wZXJhbmQuIiwKLQkJCSAgICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJICAgIHJldHVybiAxOwotCQkgIH0KLQkJZWxzZQotCQkgIGJyZWFrOwkvKiB3ZSBhcmUgZG9uZSAqLwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKmN1cnJlbnRfcG9zbiA9PSBQQVJBTExFTF9TRVBBUkFUT1IpCi0JICAgICAgewotCQl3aGlsZSAoaXNfc3BhY2VfY2hhciAoKihjdXJyZW50X3Bvc24gLSAxKSkpCi0JCSAgY3VycmVudF9wb3NuLS07Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotCSAgICAgIHsKLQkJYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gJXMgb3BlcmFuZCIsCi0JCQlvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbiksCi0JCQlvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKCcpCi0JICAgICAgKytwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09ICcpJykKLQkgICAgICAtLXBhcmVuX25vdF9iYWxhbmNlZDsKLQkgICAgY3VycmVudF9wb3NuKys7Ci0JICB9Ci0JaWYgKGN1cnJlbnRfcG9zbiAhPSB0b2tlbl9zdGFydCkKLQkgIHsJCQkvKiB5ZXMsIHdlJ3ZlIHJlYWQgaW4gYW5vdGhlciBvcGVyYW5kICovCi0JICAgIHBfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdKys7Ci0JICAgIGlmIChwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSA+IE1BWF9PUEVSQU5EUykKLQkgICAgICB7Ci0JCWFzX2JhZCAoIlNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIsCi0JCQlNQVhfT1BFUkFORFMpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIC8qIG5vdyBwYXJzZSBvcGVyYW5kIGFkZGluZyBpbmZvIHRvICdpbnNuJyBhcyB3ZSBnbyBhbG9uZyAqLwotCSAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOwotCSAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKLQkgICAgcF9pbnNuLm9wZXJhbmRfdHlwZVtmb3VuZF9zZXBhcmF0b3JdW3BfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdIC0gMV0gPQotCSAgICAgIHRpYzMwX29wZXJhbmQgKHRva2VuX3N0YXJ0KTsKLQkgICAgKmN1cnJlbnRfcG9zbiA9IHNhdmVfY2hhcjsKLQkgICAgaWYgKCFwX2luc24ub3BlcmFuZF90eXBlW2ZvdW5kX3NlcGFyYXRvcl1bcF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0gLSAxXSkKLQkgICAgICByZXR1cm4gMTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChleHBlY3Rpbmdfb3BlcmFuZCkKLQkgICAgICB7Ci0JCWFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCi0JICAgICAgewotCQlhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICB9Ci0JLyogbm93ICpjdXJyZW50X3Bvc24gbXVzdCBiZSBlaXRoZXIgJywnIG9yIEVORF9PRl9JTlNOICovCi0JaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQotCSAgewotCSAgICBpZiAoKisrY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQotCSAgICAgIHsJCQkvKiBqdXN0IHNraXAgaXQsIGlmIGl0J3MgXG4gY29tcGxhaW4gKi8KLQkJYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIGV4cGVjdGluZ19vcGVyYW5kID0gMTsKLQkgIH0KLSAgICAgIH0KLSAgICB3aGlsZSAoKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTik7CS8qIHVudGlsIHdlIGdldCBlbmQgb2YgaW5zbiAqLwotICB9Ci0gIGlmIChwX2luc24uc3dhcF9vcGVyYW5kcykKLSAgICB7Ci0gICAgICBpbnQgdGVtcF9udW0sIGk7Ci0gICAgICBvcGVyYW5kICp0ZW1wX29wOwotCi0gICAgICB0ZW1wX251bSA9IHBfaW5zbi5vcGVyYW5kc1swXTsKLSAgICAgIHBfaW5zbi5vcGVyYW5kc1swXSA9IHBfaW5zbi5vcGVyYW5kc1sxXTsKLSAgICAgIHBfaW5zbi5vcGVyYW5kc1sxXSA9IHRlbXBfbnVtOwotICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9PUEVSQU5EUzsgaSsrKQotCXsKLQkgIHRlbXBfb3AgPSBwX2luc24ub3BlcmFuZF90eXBlWzBdW2ldOwotCSAgcF9pbnNuLm9wZXJhbmRfdHlwZVswXVtpXSA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1baV07Ci0JICBwX2luc24ub3BlcmFuZF90eXBlWzFdW2ldID0gdGVtcF9vcDsKLQl9Ci0gICAgfQotICBpZiAocF9pbnNuLm9wZXJhbmRzWzBdICE9IHBfaW5zbi50bS0+b3BlcmFuZHNfMSkKLSAgICB7Ci0gICAgICBhc19iYWQgKCJpbmNvcnJlY3QgbnVtYmVyIG9mIG9wZXJhbmRzIGdpdmVuIGluIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAocF9pbnNuLm9wZXJhbmRzWzFdICE9IHBfaW5zbi50bS0+b3BlcmFuZHNfMikKLSAgICB7Ci0gICAgICBhc19iYWQgKCJpbmNvcnJlY3QgbnVtYmVyIG9mIG9wZXJhbmRzIGdpdmVuIGluIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24iKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZGVidWcgKCJOdW1iZXIgb2Ygb3BlcmFuZHMgaW4gZmlyc3QgaW5zbjogJWRcbiIsIHBfaW5zbi5vcGVyYW5kc1swXSk7Ci0gIGRlYnVnICgiTnVtYmVyIG9mIG9wZXJhbmRzIGluIHNlY29uZCBpbnNuOiAlZFxuIiwgcF9pbnNuLm9wZXJhbmRzWzFdKTsKLSAgewkJCQkvKiBOb3cgY2hlY2sgaWYgb3BlcmFuZHMgYXJlIGNvcnJlY3QgKi8KLSAgICBpbnQgY291bnQ7Ci0gICAgaW50IG51bV9ybiA9IDA7Ci0gICAgaW50IG51bV9pbmQgPSAwOwotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDI7IGNvdW50KyspCi0gICAgICB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IHBfaW5zbi5vcGVyYW5kc1tjb3VudF07IGkrKykKLQkgIHsKLQkgICAgaWYgKChwX2luc24ub3BlcmFuZF90eXBlW2NvdW50XVtpXS0+b3BfdHlwZSAmCi0JCSBwX2luc24udG0tPm9wZXJhbmRfdHlwZXNbY291bnRdW2ldKSA9PSAwKQotCSAgICAgIHsKLQkJYXNfYmFkICgiJXMgaW5zdHJ1Y3Rpb24sIG9wZXJhbmQgJWQgZG9lc24ndCBtYXRjaCIsIG9yZGluYWxfbmFtZXNbY291bnRdLCBpICsgMSk7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgLyogR2V0IG51bWJlciBvZiBSIHJlZ2lzdGVyIGFuZCBpbmRpcmVjdCByZWZlcmVuY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgZmlyc3QKLQkgICAgICAgdHdvIG9wZXJhbmRzIG9mIGVhY2ggaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgbXVsdGlwbHkKLQkgICAgICAgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIHdoaWNoIHJlcXVpcmUgdHdvIFIgcmVnaXN0ZXJzIGFuZCB0d28gaW5kaXJlY3QKLQkgICAgICAgcmVmZXJlbmNlcywgYnV0IG5vdCBpbiBhbnkgcGFydGljdWxhciBwbGFjZS4gKi8KLQkgICAgaWYgKChwX2luc24ub3BlcmFuZF90eXBlW2NvdW50XVtpXS0+b3BfdHlwZSAmIFJuKSAmJiBpIDwgMikKLQkgICAgICBudW1fcm4rKzsKLQkgICAgZWxzZSBpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdW2ldLT5vcF90eXBlICYgSW5kaXJlY3QpICYmIGkgPCAyKQotCSAgICAgIG51bV9pbmQrKzsKLQkgIH0KLSAgICAgIH0KLSAgICBpZiAoKHBfaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXVswXSAmIChJbmRpcmVjdCB8IFJuKSkgPT0gKEluZGlyZWN0IHwgUm4pKQotICAgICAgewotCS8qIENoZWNrIGZvciB0aGUgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zICovCi0JaWYgKG51bV9ybiAhPSAyKQotCSAgewotCSAgICBhc19iYWQgKCJpbmNvcnJlY3QgZm9ybWF0IGZvciBtdWx0aXBseSBwYXJhbGxlbCBpbnN0cnVjdGlvbiIpOwotCSAgICByZXR1cm4gMTsKLQkgIH0KLQlpZiAobnVtX2luZCAhPSAyKQotCSAgewkJCS8qIFNob3VsZG4ndCBnZXQgaGVyZSAqLwotCSAgICBhc19iYWQgKCJpbmNvcnJlY3QgZm9ybWF0IGZvciBtdWx0aXBseSBwYXJhbGxlbCBpbnN0cnVjdGlvbiIpOwotCSAgICByZXR1cm4gMTsKLQkgIH0KLQlpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgIT0gMHgwMCkgJiYKLQkgICAgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgIT0gMHgwMSkpCi0JICB7Ci0JICAgIGFzX2JhZCAoImRlc3RpbmF0aW9uIGZvciBtdWx0aXBseSBjYW4gb25seSBiZSBSMCBvciBSMSIpOwotCSAgICByZXR1cm4gMTsKLQkgIH0KLQlpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMl0tPnJlZy5vcGNvZGUgIT0gMHgwMikgJiYKLQkgICAgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMl0tPnJlZy5vcGNvZGUgIT0gMHgwMykpCi0JICB7Ci0JICAgIGFzX2JhZCAoImRlc3RpbmF0aW9uIGZvciBhZGQvc3VidHJhY3QgY2FuIG9ubHkgYmUgUjIgb3IgUjMiKTsKLQkgICAgcmV0dXJuIDE7Ci0JICB9Ci0JLyogTm93IGRldGVybWluZSB0aGUgUCBmaWVsZCBmb3IgdGhlIGluc3RydWN0aW9uICovCi0JaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgIHsKLQkgICAgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDAwMDAwMDA7CS8qIEluZCAqIEluZCwgUm4gICsvLSBSbiAgKi8KLQkgICAgZWxzZSBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMTAwMDAwMDsJLyogSW5kICogUm4sICBJbmQgKy8tIFJuICAqLwotCSAgICBlbHNlCi0JICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAzMDAwMDAwOwkvKiBJbmQgKiBSbiwgIFJuICArLy0gSW5kICovCi0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+b3BfdHlwZSAmIFJuKQotCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMjAwMDAwMDsJLyogUm4gICogUm4sICBJbmQgKy8tIEluZCAqLwotCSAgICBlbHNlIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgICAgewotCQlvcGVyYW5kICp0ZW1wOwotCQlwX2luc24ucF9maWVsZCA9IDB4MDEwMDAwMDA7CS8qIFJuICAqIEluZCwgSW5kICsvLSBSbiAgKi8KLQkJLyogTmVlZCB0byBzd2FwIHRoZSB0d28gbXVsdGlwbHkgb3BlcmFuZHMgYXJvdW5kIHNvIHRoYXQgZXZlcnl0aGluZyBpcyBpbgotCQkgICBpdHMgcGxhY2UgZm9yIHRoZSBvcGNvZGUgbWFrZXVwIGllIHNvIEluZCAqIFJuLCBJbmQgKy8tIFJuICovCi0JCXRlbXAgPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdOwotCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXTsKLQkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXSA9IHRlbXA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlvcGVyYW5kICp0ZW1wOwotCQlwX2luc24ucF9maWVsZCA9IDB4MDMwMDAwMDA7CS8qIFJuICAqIEluZCwgUm4gICsvLSBJbmQgKi8KLQkJdGVtcCA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF07Ci0JCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0gPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdOwotCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdID0gdGVtcDsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSAgZGVidWcgKCJQIGZpZWxkOiAlMDhYXG4iLCBwX2luc24ucF9maWVsZCk7Ci0gIC8qIEZpbmFsaXNlIG9wY29kZS4gIFRoaXMgaXMgZWFzaWVyIGZvciBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgYXMgdGhleSBoYXZlIHRvIGJlCi0gICAgIGZ1bGx5IHJlc29sdmVkLCB0aGVyZSBhcmUgbm8gbWVtb3J5IGFkZHJlc3NlcyBhbGxvd2VkLCBleGNlcHQgdGhyb3VnaCBpbmRpcmVjdAotICAgICBhZGRyZXNzaW5nLCBzbyB0aGVyZSBhcmUgbm8gbGFiZWxzIHRvIHJlc29sdmUuICovCi0gIHsKLSAgICBwX2luc24ub3Bjb2RlID0gcF9pbnNuLnRtLT5iYXNlX29wY29kZTsKLSAgICBzd2l0Y2ggKHBfaW5zbi50bS0+b3BvcmRlcikKLSAgICAgIHsKLSAgICAgIGNhc2UgT09fNG9wMToKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PXzRvcDI6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlID09IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUpCi0JICBhc193YXJuICgibG9hZGluZyB0aGUgc2FtZSByZWdpc3RlciBpbiBwYXJhbGxlbCBvcGVyYXRpb24iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fNG9wMzoKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PXzVvcDE6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT181b3AyOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fUEZpZWxkOgotCXBfaW5zbi5vcGNvZGUgfD0gcF9pbnNuLnBfZmllbGQ7Ci0JaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgPT0gMHgwMSkKLQkgIHBfaW5zbi5vcGNvZGUgfD0gMHgwMDgwMDAwMDsKLQlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsyXS0+cmVnLm9wY29kZSA9PSAweDAzKQotCSAgcF9pbnNuLm9wY29kZSB8PSAweDAwNDAwMDAwOwotCXN3aXRjaCAocF9pbnNuLnBfZmllbGQpCi0JICB7Ci0JICBjYXNlIDB4MDAwMDAwMDA6Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMHgwMTAwMDAwMDoKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAweDAyMDAwMDAwOgotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDB4MDMwMDAwMDA6Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCSAgICBicmVhazsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0KLSAgfQkJCQkvKiBPcGNvZGUgaXMgZmluYWxpc2VkIGF0IHRoaXMgcG9pbnQgZm9yIGFsbCBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuICovCi0gIHsJCQkJLyogT3V0cHV0IG9wY29kZSAqLwotICAgIGNoYXIgKnA7Ci0gICAgcCA9IGZyYWdfbW9yZSAoSU5TTl9TSVpFKTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIHBfaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0gIH0KLSAgewotICAgIGludCBpLCBqOwotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICBmb3IgKGogPSAwOyBqIDwgcF9pbnNuLm9wZXJhbmRzW2ldOyBqKyspCi0JZnJlZSAocF9pbnNuLm9wZXJhbmRfdHlwZVtpXVtqXSk7Ci0gIH0KLSAgZGVidWcgKCJGaW5hbCBvcGNvZGU6ICUwOFhcbiIsIHBfaW5zbi5vcGNvZGUpOwotICBkZWJ1ZyAoIlxuIik7Ci0gIHJldHVybiAxOwotfQotCi1vcGVyYW5kICoKLXRpYzMwX29wZXJhbmQgKHRva2VuKQotICAgICBjaGFyICp0b2tlbjsKLXsKLSAgaW50IGNvdW50OwotICBjaGFyIGluZF9idWZmZXJbc3RybGVuICh0b2tlbildOwotICBvcGVyYW5kICpjdXJyZW50X29wOwotCi0gIGRlYnVnICgiSW4gdGljMzBfb3BlcmFuZCB3aXRoICVzXG4iLCB0b2tlbik7Ci0gIGN1cnJlbnRfb3AgPSAob3BlcmFuZCAqKSBtYWxsb2MgKHNpemVvZiAob3BlcmFuZCkpOwotICBtZW1zZXQgKGN1cnJlbnRfb3AsICdcMCcsIHNpemVvZiAob3BlcmFuZCkpOwotICBpZiAoKnRva2VuID09IERJUkVDVF9SRUZFUkVOQ0UpCi0gICAgewotICAgICAgY2hhciAqdG9rZW5fcG9zbiA9IHRva2VuICsgMTsKLSAgICAgIGludCBkaXJlY3RfbGFiZWwgPSAwOwotICAgICAgZGVidWcgKCJGb3VuZCBkaXJlY3QgcmVmZXJlbmNlXG4iKTsKLSAgICAgIHdoaWxlICgqdG9rZW5fcG9zbikKLQl7Ci0JICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCp0b2tlbl9wb3NuKSkKLQkgICAgZGlyZWN0X2xhYmVsID0gMTsKLQkgIHRva2VuX3Bvc24rKzsKLQl9Ci0gICAgICBpZiAoZGlyZWN0X2xhYmVsKQotCXsKLQkgIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgc2VnVCByZXR2YWw7Ci0JICBkZWJ1ZyAoIkRpcmVjdCByZWZlcmVuY2UgaXMgYSBsYWJlbFxuIik7Ci0JICBjdXJyZW50X29wLT5kaXJlY3QubGFiZWwgPSB0b2tlbiArIDE7Ci0JICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRva2VuICsgMTsKLQkgIGRlYnVnICgiQ3VycmVudCBpbnB1dF9saW5lX3BvaW50ZXI6ICVzXG4iLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgcmV0dmFsID0gZXhwcmVzc2lvbiAoJmN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwcik7Ci0JICBkZWJ1ZyAoIkV4cHJlc3Npb24gdHlwZTogJWRcbiIsIGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX29wKTsKLQkgIGRlYnVnICgiRXhwcmVzc2lvbiBhZGRudW06ICVkXG4iLCBjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkgIGRlYnVnICgiU2VnbWVudDogJWRcbiIsIHJldHZhbCk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlmIChjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgY3VycmVudF9vcC0+ZGlyZWN0LmFkZHJlc3MgPSBjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgICAgIGN1cnJlbnRfb3AtPmRpcmVjdC5yZXNvbHZlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZGVidWcgKCJEaXJlY3QgcmVmZXJlbmNlIGlzIGEgbnVtYmVyXG4iKTsKLQkgIGN1cnJlbnRfb3AtPmRpcmVjdC5hZGRyZXNzID0gYXRvaSAodG9rZW4gKyAxKTsKLQkgIGN1cnJlbnRfb3AtPmRpcmVjdC5yZXNvbHZlZCA9IDE7Ci0JfQotICAgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IERpcmVjdDsKLSAgICB9Ci0gIGVsc2UgaWYgKCp0b2tlbiA9PSBJTkRJUkVDVF9SRUZFUkVOQ0UpCi0gICAgewkJCQkvKiBJbmRpcmVjdCByZWZlcmVuY2Ugb3BlcmFuZCAqLwotICAgICAgaW50IGZvdW5kX2FyID0gMDsKLSAgICAgIGludCBmb3VuZF9kaXNwID0gMDsKLSAgICAgIGludCBhcl9udW1iZXIgPSAtMTsKLSAgICAgIGludCBkaXNwX251bWJlciA9IDA7Ci0gICAgICBpbnQgYnVmZmVyX3Bvc24gPSAxOwotICAgICAgaW5kX2FkZHJfdHlwZSAqaW5kX2FkZHJfb3A7Ci0gICAgICBkZWJ1ZyAoIkZvdW5kIGluZGlyZWN0IHJlZmVyZW5jZVxuIik7Ci0gICAgICBpbmRfYnVmZmVyWzBdID0gKnRva2VuOwotICAgICAgZm9yIChjb3VudCA9IDE7IGNvdW50IDwgc3RybGVuICh0b2tlbik7IGNvdW50KyspCi0JewkJCS8qIFN0cmlwIG9wZXJhbmQgKi8KLQkgIGluZF9idWZmZXJbYnVmZmVyX3Bvc25dID0gdG9sb3dlciAoKih0b2tlbiArIGNvdW50KSk7Ci0JICBpZiAoKCoodG9rZW4gKyBjb3VudCAtIDEpID09ICdhJyB8fCAqKHRva2VuICsgY291bnQgLSAxKSA9PSAnQScpICYmCi0JICAgICAgKCoodG9rZW4gKyBjb3VudCkgPT0gJ3InIHx8ICoodG9rZW4gKyBjb3VudCkgPT0gJ1InKSkKLQkgICAgewotCSAgICAgIC8qIEFSIHJlZmVyZW5jZSBpcyBmb3VuZCwgc28gZ2V0IGl0cyBudW1iZXIgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBidWZmZXIKLQkgICAgICAgICBzbyBpdCBjYW4gcGFzcyB0aHJvdWdoIGhhc2hfZmluZCgpICovCi0JICAgICAgaWYgKGZvdW5kX2FyKQotCQl7Ci0JCSAgYXNfYmFkICgiTW9yZSB0aGFuIG9uZSBBUiByZWdpc3RlciBmb3VuZCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkJICByZXR1cm4gTlVMTDsKLQkJfQotCSAgICAgIGlmICgqKHRva2VuICsgY291bnQgKyAxKSA8ICcwJyB8fCAqKHRva2VuICsgY291bnQgKyAxKSA+ICc3JykKLQkJewotCQkgIGFzX2JhZCAoIklsbGVnYWwgQVIgcmVnaXN0ZXIgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JCSAgcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgICBhcl9udW1iZXIgPSAqKHRva2VuICsgY291bnQgKyAxKSAtICcwJzsKLQkgICAgICBmb3VuZF9hciA9IDE7Ci0JICAgICAgY291bnQrKzsKLQkgICAgfQotCSAgaWYgKCoodG9rZW4gKyBjb3VudCkgPT0gJygnKQotCSAgICB7Ci0JICAgICAgLyogUGFyZW50aGVzaXMgZm91bmQsIHNvIGNoZWNrIGlmIGEgZGlzcGxhY2VtZW50IHZhbHVlIGlzIGluc2lkZS4gIElmIHNvLCBnZXQKLQkgICAgICAgICB0aGUgdmFsdWUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBidWZmZXIuICovCi0JICAgICAgaWYgKGlzX2RpZ2l0X2NoYXIgKCoodG9rZW4gKyBjb3VudCArIDEpKSkKLQkJewotCQkgIGNoYXIgZGlzcFsxMF07Ci0JCSAgaW50IGRpc3BfcG9zbiA9IDA7Ci0KLQkJICBpZiAoZm91bmRfZGlzcCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiTW9yZSB0aGFuIG9uZSBkaXNwbGFjZW1lbnQgZm91bmQgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JCSAgICAgIHJldHVybiBOVUxMOwotCQkgICAgfQotCQkgIGNvdW50Kys7Ci0JCSAgd2hpbGUgKCoodG9rZW4gKyBjb3VudCkgIT0gJyknKQotCQkgICAgewotCQkgICAgICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCoodG9rZW4gKyBjb3VudCkpKQotCQkJewotCQkJICBhc19iYWQgKCJJbnZhbGlkIGRpc3BsYWNlbWVudCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkJCSAgcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCSAgICAgIGRpc3BbZGlzcF9wb3NuKytdID0gKih0b2tlbiArIChjb3VudCsrKSk7Ci0JCSAgICB9Ci0JCSAgZGlzcFtkaXNwX3Bvc25dID0gJ1wwJzsKLQkJICBkaXNwX251bWJlciA9IGF0b2kgKGRpc3ApOwotCQkgIGNvdW50LS07Ci0JCSAgZm91bmRfZGlzcCA9IDE7Ci0JCX0KLQkgICAgfQotCSAgYnVmZmVyX3Bvc24rKzsKLQl9Ci0gICAgICBpbmRfYnVmZmVyW2J1ZmZlcl9wb3NuXSA9ICdcMCc7Ci0gICAgICBpZiAoIWZvdW5kX2FyKQotCXsKLQkgIGFzX2JhZCAoIkFSIHJlZ2lzdGVyIG5vdCBmb3VuZCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGluZF9hZGRyX29wID0gKGluZF9hZGRyX3R5cGUgKikgaGFzaF9maW5kIChpbmRfaGFzaCwgaW5kX2J1ZmZlcik7Ci0gICAgICBpZiAoaW5kX2FkZHJfb3ApCi0JewotCSAgZGVidWcgKCJGb3VuZCBpbmRpcmVjdCByZWZlcmVuY2U6ICVzXG4iLCBpbmRfYWRkcl9vcC0+c3ludGF4KTsKLQkgIGlmIChpbmRfYWRkcl9vcC0+ZGlzcGxhY2VtZW50ID09IElNUExJRURfRElTUCkKLQkgICAgewotCSAgICAgIGZvdW5kX2Rpc3AgPSAxOwotCSAgICAgIGRpc3BfbnVtYmVyID0gMTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKGluZF9hZGRyX29wLT5kaXNwbGFjZW1lbnQgPT0gRElTUF9SRVFVSVJFRCkgJiYgIWZvdW5kX2Rpc3ApCi0JICAgIHsKLQkgICAgICAvKiBNYXliZSBhbiBpbXBsaWVkIGRpc3BsYWNlbWVudCBvZiAxIGFnYWluICovCi0JICAgICAgYXNfYmFkICgicmVxdWlyZWQgZGlzcGxhY2VtZW50IHdhc24ndCBnaXZlbiBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKCJpbGxlZ2FsIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgaWYgKGZvdW5kX2Rpc3AgJiYgKGRpc3BfbnVtYmVyIDwgMCB8fCBkaXNwX251bWJlciA+IDI1NSkpCi0JewotCSAgYXNfYmFkICgiZGlzcGxhY2VtZW50IG11c3QgYmUgYW4gdW5zaWduZWQgOC1iaXQgbnVtYmVyIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBjdXJyZW50X29wLT5pbmRpcmVjdC5tb2QgPSBpbmRfYWRkcl9vcC0+bW9kZmllbGQ7Ci0gICAgICBjdXJyZW50X29wLT5pbmRpcmVjdC5kaXNwID0gZGlzcF9udW1iZXI7Ci0gICAgICBjdXJyZW50X29wLT5pbmRpcmVjdC5BUm51bSA9IGFyX251bWJlcjsKLSAgICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBJbmRpcmVjdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWcgKnJlZ29wID0gKHJlZyAqKSBoYXNoX2ZpbmQgKHJlZ19oYXNoLCB0b2tlbik7Ci0gICAgICBpZiAocmVnb3ApCi0JewotCSAgZGVidWcgKCJGb3VuZCByZWdpc3RlciBvcGVyYW5kOiAlc1xuIiwgcmVnb3AtPm5hbWUpOwotCSAgaWYgKHJlZ29wLT5yZWd0eXBlID09IFJFR19BUm4pCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBBUm47Ci0JICBlbHNlIGlmIChyZWdvcC0+cmVndHlwZSA9PSBSRUdfUm4pCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBSbjsKLQkgIGVsc2UgaWYgKHJlZ29wLT5yZWd0eXBlID09IFJFR19EUCkKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IERQUmVnOwotCSAgZWxzZQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gT3RoZXJSZWc7Ci0JICBjdXJyZW50X29wLT5yZWcub3Bjb2RlID0gcmVnb3AtPm9wY29kZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCFpc19kaWdpdF9jaGFyICgqdG9rZW4pIHx8ICoodG9rZW4gKyAxKSA9PSAneCcgfHwgc3RyY2hyICh0b2tlbiwgJ2gnKSkKLQkgICAgewotCSAgICAgIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIHNlZ1QgcmV0dmFsOwotCSAgICAgIGRlYnVnICgiUHJvYmFibHkgYSBsYWJlbDogJXNcbiIsIHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWwgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAodG9rZW4pICsgMSk7Ci0JICAgICAgc3RyY3B5IChjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWwsIHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWxbc3RybGVuICh0b2tlbildID0gJ1wwJzsKLQkgICAgICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0b2tlbjsKLQkgICAgICBkZWJ1ZyAoIkN1cnJlbnQgaW5wdXRfbGluZV9wb2ludGVyOiAlc1xuIiwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICByZXR2YWwgPSBleHByZXNzaW9uICgmY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByKTsKLQkgICAgICBkZWJ1ZyAoIkV4cHJlc3Npb24gdHlwZTogJWRcbiIsIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX29wKTsKLQkgICAgICBkZWJ1ZyAoIkV4cHJlc3Npb24gYWRkbnVtOiAlZFxuIiwgY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfYWRkX251bWJlcik7Ci0JICAgICAgZGVidWcgKCJTZWdtZW50OiAlZFxuIiwgcmV0dmFsKTsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5zX251bWJlciA9IGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyID0gKHVuc2lnbmVkIGludCkgY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfYWRkX251bWJlcjsKLQkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUucmVzb2x2ZWQgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNvdW50OwotCSAgICAgIGRlYnVnICgiRm91bmQgYSBudW1iZXIgb3IgZGlzcGxhY2VtZW50XG4iKTsKLQkgICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzdHJsZW4gKHRva2VuKTsgY291bnQrKykKLQkJaWYgKCoodG9rZW4gKyBjb3VudCkgPT0gJy4nKQotCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kID0gMTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWwgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAodG9rZW4pICsgMSk7Ci0JICAgICAgc3RyY3B5IChjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWwsIHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWxbc3RybGVuICh0b2tlbildID0gJ1wwJzsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUuZl9udW1iZXIgPSAoZmxvYXQpIGF0b2YgKHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUuc19udW1iZXIgPSAoaW50KSBhdG9pICh0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyID0gKHVuc2lnbmVkIGludCkgYXRvaSAodG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5yZXNvbHZlZCA9IDE7Ci0JICAgIH0KLQkgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBEaXNwIHwgQWJzMjQgfCBJbW0xNiB8IEltbTI0OwotCSAgaWYgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS51X251bWJlciA+PSAwICYmIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS51X251bWJlciA8PSAzMSkKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSB8PSBJVmVjdG9yOwotCX0KLSAgICB9Ci0gIHJldHVybiBjdXJyZW50X29wOwotfQotCi0vKiBuZXh0X2xpbmUgcG9pbnRzIHRvIHRoZSBuZXh0IGxpbmUgYWZ0ZXIgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKGN1cnJlbnRfbGluZSkuCi0gICBTZWFyY2ggZm9yIHRoZSBwYXJhbGxlbCBiYXJzLCBhbmQgaWYgZm91bmQsIG1lcmdlIHR3byBsaW5lcyBpbnRvIGludGVybmFsIHN5bnRheAotICAgZm9yIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb246Ci0gICBxX1tJTlNOMV1fW0lOU04yXSBbT1BFUkFORFMxXSB8IFtPUEVSQU5EUzJdCi0gICBCeSB0aGlzIHN0YWdlLCBhbGwgY29tbWVudHMgYXJlIHNjcnViYmVkLCBhbmQgb25seSB0aGUgYmFyZSBsaW5lcyBhcmUgZ2l2ZW4uCi0gKi8KLQotI2RlZmluZSBOT05FICAgICAgICAgICAwCi0jZGVmaW5lIFNUQVJUX09QQ09ERSAgIDEKLSNkZWZpbmUgRU5EX09QQ09ERSAgICAgMgotI2RlZmluZSBTVEFSVF9PUEVSQU5EUyAzCi0jZGVmaW5lIEVORF9PUEVSQU5EUyAgIDQKLQotY2hhciAqCi10aWMzMF9maW5kX3BhcmFsbGVsX2luc24gKGN1cnJlbnRfbGluZSwgbmV4dF9saW5lKQotICAgICBjaGFyICpjdXJyZW50X2xpbmU7Ci0gICAgIGNoYXIgKm5leHRfbGluZTsKLXsKLSAgaW50IGZvdW5kX3BhcmFsbGVsID0gMDsKLSAgY2hhciBmaXJzdF9vcGNvZGVbMjU2XTsKLSAgY2hhciBzZWNvbmRfb3Bjb2RlWzI1Nl07Ci0gIGNoYXIgZmlyc3Rfb3BlcmFuZHNbMjU2XTsKLSAgY2hhciBzZWNvbmRfb3BlcmFuZHNbMjU2XTsKLSAgY2hhciAqcGFyYWxsZWxfaW5zbjsKLQotICBkZWJ1ZyAoIkluIHRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbigpXG4iKTsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsoaW50KSAqbmV4dF9saW5lXSkKLSAgICB7Ci0gICAgICBpZiAoKm5leHRfbGluZSA9PSBQQVJBTExFTF9TRVBBUkFUT1IgJiYgKihuZXh0X2xpbmUgKyAxKSA9PSBQQVJBTExFTF9TRVBBUkFUT1IpCi0JewotCSAgZm91bmRfcGFyYWxsZWwgPSAxOwotCSAgbmV4dF9saW5lKys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBuZXh0X2xpbmUrKzsKLSAgICB9Ci0gIGlmICghZm91bmRfcGFyYWxsZWwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGRlYnVnICgiRm91bmQgYSBwYXJhbGxlbCBpbnN0cnVjdGlvblxuIik7Ci0gIHsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpvcGNvZGUsICpvcGVyYW5kcywgKmxpbmU7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgewotCWlmIChpID09IDApCi0JICB7Ci0JICAgIG9wY29kZSA9ICZmaXJzdF9vcGNvZGVbMF07Ci0JICAgIG9wZXJhbmRzID0gJmZpcnN0X29wZXJhbmRzWzBdOwotCSAgICBsaW5lID0gY3VycmVudF9saW5lOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgb3Bjb2RlID0gJnNlY29uZF9vcGNvZGVbMF07Ci0JICAgIG9wZXJhbmRzID0gJnNlY29uZF9vcGVyYW5kc1swXTsKLQkgICAgbGluZSA9IG5leHRfbGluZTsKLQkgIH0KLQl7Ci0JICBpbnQgc2VhcmNoX3N0YXR1cyA9IE5PTkU7Ci0JICBpbnQgY2hhcl9wdHIgPSAwOwotCSAgY2hhciBjOwotCi0JICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyhpbnQpIChjID0gKmxpbmUpXSAmJiAqbGluZSkKLQkgICAgewotCSAgICAgIGlmIChpc19vcGNvZGVfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBOT05FKQotCQl7Ci0JCSAgb3Bjb2RlW2NoYXJfcHRyKytdID0gdG9sb3dlciAoYyk7Ci0JCSAgc2VhcmNoX3N0YXR1cyA9IFNUQVJUX09QQ09ERTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGlzX29wY29kZV9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IFNUQVJUX09QQ09ERSkKLQkJewotCQkgIG9wY29kZVtjaGFyX3B0cisrXSA9IHRvbG93ZXIgKGMpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoIWlzX29wY29kZV9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IFNUQVJUX09QQ09ERSkKLQkJewotCQkgIG9wY29kZVtjaGFyX3B0cl0gPSAnXDAnOwotCQkgIGNoYXJfcHRyID0gMDsKLQkJICBzZWFyY2hfc3RhdHVzID0gRU5EX09QQ09ERTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGlzX29wZXJhbmRfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBTVEFSVF9PUEVSQU5EUykKLQkJewotCQkgIG9wZXJhbmRzW2NoYXJfcHRyKytdID0gYzsKLQkJfQotCSAgICAgIGlmIChpc19vcGVyYW5kX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gRU5EX09QQ09ERSkKLQkJewotCQkgIG9wZXJhbmRzW2NoYXJfcHRyKytdID0gYzsKLQkJICBzZWFyY2hfc3RhdHVzID0gU1RBUlRfT1BFUkFORFM7Ci0JCX0KLQkgICAgICBsaW5lKys7Ci0JICAgIH0KLQkgIGlmIChzZWFyY2hfc3RhdHVzICE9IFNUQVJUX09QRVJBTkRTKQotCSAgICByZXR1cm4gTlVMTDsKLQkgIG9wZXJhbmRzW2NoYXJfcHRyXSA9ICdcMCc7Ci0JfQotICAgICAgfQotICB9Ci0gIHBhcmFsbGVsX2luc24gPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAoZmlyc3Rfb3Bjb2RlKSArIHN0cmxlbiAoZmlyc3Rfb3BlcmFuZHMpICsKLQkJICAgICBzdHJsZW4gKHNlY29uZF9vcGNvZGUpICsgc3RybGVuIChzZWNvbmRfb3BlcmFuZHMpICsgOCk7Ci0gIHNwcmludGYgKHBhcmFsbGVsX2luc24sICJxXyVzXyVzICVzIHwgJXMiLCBmaXJzdF9vcGNvZGUsIHNlY29uZF9vcGNvZGUsIGZpcnN0X29wZXJhbmRzLCBzZWNvbmRfb3BlcmFuZHMpOwotICBkZWJ1ZyAoInBhcmFsbGVsIGluc24gPSAlc1xuIiwgcGFyYWxsZWxfaW5zbik7Ci0gIHJldHVybiBwYXJhbGxlbF9pbnNuOwotfQotCi0jdW5kZWYgTk9ORQotI3VuZGVmIFNUQVJUX09QQ09ERQotI3VuZGVmIEVORF9PUENPREUKLSN1bmRlZiBTVEFSVF9PUEVSQU5EUwotI3VuZGVmIEVORF9PUEVSQU5EUwotCi0vKiBJbiBvcmRlciB0byBnZXQgZ2FzIHRvIGlnbm9yZSBhbnkgfCBjaGFycyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLAotICAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgYSB8IGlzIGZvdW5kIGluIGEgbGluZS4gKi8KLQotaW50Ci10aWMzMF91bnJlY29nbml6ZWRfbGluZSAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGRlYnVnICgiSW4gdGNfdW5yZWNvZ25pemVkX2xpbmVcbiIpOwotICByZXR1cm4gKGMgPT0gUEFSQUxMRUxfU0VQQVJBVE9SKTsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBkZWJ1ZyAoIkluIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KClcbiIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGRlYnVnICgiSW4gbWRfY29udmVydF9mcmFnKClcbiIpOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsUCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxQOwotewotICB2YWx1ZVQgdmFsdWUgPSAqdmFsUDsKLQotICBkZWJ1ZyAoIkluIG1kX2FwcGx5X2ZpeCgpIHdpdGggdmFsdWUgPSAlbGRcbiIsIChsb25nKSB2YWx1ZSk7Ci0gIGRlYnVnICgiVmFsdWVzIGluIGZpeFBcbiIpOwotICBkZWJ1ZyAoImZ4X3NpemUgPSAlZFxuIiwgZml4UC0+Znhfc2l6ZSk7Ci0gIGRlYnVnICgiZnhfcGNyZWwgPSAlZFxuIiwgZml4UC0+ZnhfcGNyZWwpOwotICBkZWJ1ZyAoImZ4X3doZXJlID0gJWRcbiIsIGZpeFAtPmZ4X3doZXJlKTsKLSAgZGVidWcgKCJmeF9vZmZzZXQgPSAlZFxuIiwgKGludCkgZml4UC0+Znhfb2Zmc2V0KTsKLSAgewotICAgIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKLSAgICB2YWx1ZSAvPSBJTlNOX1NJWkU7Ci0gICAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSkKLSAgICAgIHsJCQkJLyogU3BlY2lhbCBmaXggZm9yIExEUCBpbnN0cnVjdGlvbi4gKi8KLQl2YWx1ZSA9ICh2YWx1ZSAmIDB4MDBGRjAwMDApID4+IDE2OwotICAgICAgfQotICAgIGRlYnVnICgibmV3IHZhbHVlID0gJWxkXG4iLCAobG9uZykgdmFsdWUpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgZml4UC0+Znhfc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIGludCBpOwotCi0gIGRlYnVnICgiSW4gbWRfcGFyc2Vfb3B0aW9uKClcbiIpOwotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVjXG4iLCBhcmdbY10pOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBkZWJ1ZyAoIkluIG1kX3Nob3dfdXNhZ2UoKVxuIik7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgZGVidWcgKCJJbiBtZF91bmRlZmluZWRfc3ltYm9sKClcbiIpOwotICByZXR1cm4gKHN5bWJvbFMgKikgMDsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBkZWJ1ZyAoIkluIG1kX3NlY3Rpb25fYWxpZ24oKSBzZWdtZW50ID0gJWQgYW5kIHNpemUgPSAlZFxuIiwgc2VnbWVudCwgc2l6ZSk7Ci0gIHNpemUgPSAoc2l6ZSArIDMpIC8gNDsKLSAgc2l6ZSAqPSA0OwotICBkZWJ1ZyAoIk5ldyBzaXplIHZhbHVlID0gJWRcbiIsIHNpemUpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaW50IG9mZnNldDsKLQotICBkZWJ1ZyAoIkluIG1kX3BjcmVsX2Zyb20oKVxuIik7Ci0gIGRlYnVnICgiZnhfd2hlcmUgPSAlZFxuIiwgZml4UC0+Znhfd2hlcmUpOwotICBkZWJ1ZyAoImZ4X3NpemUgPSAlZFxuIiwgZml4UC0+Znhfc2l6ZSk7Ci0gIC8qIEZpbmQgdGhlIG9wY29kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGZyX2xpdGVyYWwKLSAgICAgc3RvcmFnZSBhcmVhLCBhbmQgY2hlY2sgYml0IDIxLiAgQml0IDIxIGNvbnRhaW5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KLSAgICAgaXMgYSBkZWxheWVkIG9uZSBvciBub3QsIGFuZCB0aGVuIHNldCB0aGUgb2Zmc2V0IHZhbHVlIGFwcHJvcHJpYXRlbHkuICovCi0gIGlmIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsW2ZpeFAtPmZ4X3doZXJlIC0gZml4UC0+Znhfc2l6ZSArIDFdICYgMHgyMCkKLSAgICBvZmZzZXQgPSAzOwotICBlbHNlCi0gICAgb2Zmc2V0ID0gMTsKLSAgZGVidWcgKCJvZmZzZXQgPSAlZFxuIiwgb2Zmc2V0KTsKLSAgLyogUEMgUmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIGhhdmUgYSBmb3JtYXQ6Ci0gICAgIGRpc3BsYWNlbWVudCA9IExhYmVsIC0gKFBDICsgb2Zmc2V0KQotICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgUEMgKyBvZmZzZXQgd2hlcmU6Ci0gICAgIGZ4X3doZXJlIC0gZnhfc2l6ZSA9IFBDCi0gICAgIElOU05fU0laRSAqIG9mZnNldCA9IG9mZnNldCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCi0gICAqLwotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgLSBmaXhQLT5meF9zaXplICsgKElOU05fU0laRSAqIG9mZnNldCk7Ci19Ci0KLWNoYXIgKgotbWRfYXRvZiAod2hhdF9zdGF0ZW1lbnRfdHlwZSwgbGl0ZXJhbFAsIHNpemVQKQotICAgICBpbnQgd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgY2hhciAqbGl0ZXJhbFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBjaGFyICp0b2tlbjsKLSAgY2hhciBrZWVwdmFsOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAvKiAgY2hhciAqYXRvZl9pZWVlICgpOyAqLwotICBmbG9hdCBmbG9hdF92YWx1ZTsKLSAgZGVidWcgKCJJbiBtZF9hdG9mKClcbiIpOwotICBkZWJ1ZyAoInByZWNpc2lvbiA9ICVjXG4iLCB3aGF0X3N0YXRlbWVudF90eXBlKTsKLSAgZGVidWcgKCJsaXRlcmFsID0gJXNcbiIsIGxpdGVyYWxQKTsKLSAgZGVidWcgKCJsaW5lID0gIik7Ci0gIHRva2VuID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCkgKmlucHV0X2xpbmVfcG9pbnRlcl0gJiYgKCppbnB1dF9saW5lX3BvaW50ZXIpICYmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykpCi0gICAgewotICAgICAgZGVidWcgKCIlYyIsICppbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBrZWVwdmFsID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0gIGRlYnVnICgiXG4iKTsKLSAgZmxvYXRfdmFsdWUgPSAoZmxvYXQpIGF0b2YgKHRva2VuKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGtlZXB2YWw7Ci0gIGRlYnVnICgiZmxvYXRfdmFsdWUgPSAlZlxuIiwgZmxvYXRfdmFsdWUpOwotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuICJCYWQgY2FsbCB0byBNRF9BVE9GKCkiOwotICAgIH0KLSAgaWYgKGZsb2F0X3ZhbHVlID09IDAuMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IChwcmVjID09IDIpID8gMHgwMDAwODAwMEwgOiAweDgwMDAwMDAwTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGV4cCwgc2lnbiwgbWFudCwgdG1zZmxvYXQ7Ci0gICAgICB0bXNmbG9hdCA9ICooKGxvbmcgKikgJmZsb2F0X3ZhbHVlKTsKLSAgICAgIHNpZ24gPSB0bXNmbG9hdCAmIDB4ODAwMDAwMDA7Ci0gICAgICBtYW50ID0gdG1zZmxvYXQgJiAweDAwN0ZGRkZGOwotICAgICAgZXhwID0gdG1zZmxvYXQgJiAweDdGODAwMDAwOwotICAgICAgZXhwIDw8PSAxOwotICAgICAgaWYgKGV4cCA9PSAweEZGMDAwMDAwKQotCXsKLQkgIGlmIChtYW50ID09IDApCi0JICAgIHZhbHVlID0gMHg3RjdGRkZGRjsKLQkgIGVsc2UgaWYgKHNpZ24gPT0gMCkKLQkgICAgdmFsdWUgPSAweDdGN0ZGRkZGOwotCSAgZWxzZQotCSAgICB2YWx1ZSA9IDB4N0Y4MDAwMDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cCAtPSAweDdGMDAwMDAwOwotCSAgaWYgKHNpZ24pCi0JICAgIHsKLQkgICAgICBtYW50ID0gbWFudCAmIDB4MDA3RkZGRkY7Ci0JICAgICAgbWFudCA9IC1tYW50OwotCSAgICAgIG1hbnQgPSBtYW50ICYgMHgwMEZGRkZGRjsKLQkgICAgICBpZiAobWFudCA9PSAwKQotCQl7Ci0JCSAgbWFudCB8PSAweDAwODAwMDAwOwotCQkgIGV4cCA9IChsb25nKSBleHAgLSAweDAxMDAwMDAwOwotCQl9Ci0JICAgIH0KLQkgIHRtc2Zsb2F0ID0gZXhwIHwgbWFudDsKLQkgIHZhbHVlID0gdG1zZmxvYXQ7Ci0JfQotICAgICAgaWYgKHByZWMgPT0gMikKLQl7Ci0JICBsb25nIGV4cCwgbWFudDsKLQotCSAgaWYgKHRtc2Zsb2F0ID09IDB4ODAwMDAwMDApCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IDB4ODAwMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAwOwotCSAgICAgIGV4cCA9ICh0bXNmbG9hdCAmIDB4RkYwMDAwMDApOwotCSAgICAgIGV4cCA+Pj0gMjQ7Ci0JICAgICAgbWFudCA9IHRtc2Zsb2F0ICYgMHgwMDdGRkZGRjsKLQkgICAgICBpZiAodG1zZmxvYXQgJiAweDAwODAwMDAwKQotCQl7Ci0JCSAgbWFudCB8PSAweEZGMDAwMDAwOwotCQkgIG1hbnQgKz0gMHgwMDAwMDgwMDsKLQkJICBtYW50ID4+PSAxMjsKLQkJICBtYW50IHw9IDB4MDAwMDA4MDA7Ci0JCSAgbWFudCAmPSAweDBGRkY7Ci0JCSAgaWYgKGV4cCA+IDcpCi0JCSAgICB2YWx1ZSA9IDB4NzgwMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG1hbnQgfD0gMHgwMDgwMDAwMDsKLQkJICBtYW50ICs9IDB4MDAwMDA4MDA7Ci0JCSAgZXhwICs9IChtYW50ID4+IDI0KTsKLQkJICBtYW50ID4+PSAxMjsKLQkJICBtYW50ICY9IDB4MDdGRjsKLQkJICBpZiAoZXhwID4gNykKLQkJICAgIHZhbHVlID0gMHg3N0ZGOwotCQl9Ci0JICAgICAgaWYgKGV4cCA8IC04KQotCQl2YWx1ZSA9IDB4ODAwMDsKLQkgICAgICBpZiAodmFsdWUgPT0gMCkKLQkJewotCQkgIG1hbnQgPSAoZXhwIDw8IDEyKSB8IG1hbnQ7Ci0JCSAgdmFsdWUgPSBtYW50ICYgMHhGRkZGOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdGVyYWxQLCB2YWx1ZSwgcHJlYyk7Ci0gICpzaXplUCA9IHByZWM7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBkZWJ1ZyAoIkluIG1kX251bWJlcl90b19jaGFycygpXG4iKTsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICAvKiAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbihidWYsdmFsLG4pOyAqLwotfQotCi0jZGVmaW5lIEYoU1osUENSRUwpCQkoKChTWikgPDwgMSkgKyAoUENSRUwpKQotI2RlZmluZSBNQVAoU1osUENSRUwsVFlQRSkJY2FzZSBGKFNaLFBDUkVMKTogY29kZSA9IChUWVBFKTsgYnJlYWsKLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeFApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhQOwotewotICBhcmVsZW50ICpyZWw7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlID0gMDsKLQotICBkZWJ1ZyAoIkluIHRjX2dlbl9yZWxvYygpXG4iKTsKLSAgZGVidWcgKCJmaXhQLnNpemUgPSAlZFxuIiwgZml4UC0+Znhfc2l6ZSk7Ci0gIGRlYnVnICgiZml4UC5wY3JlbCA9ICVkXG4iLCBmaXhQLT5meF9wY3JlbCk7Ci0gIGRlYnVnICgiYWRkc3kubmFtZSA9ICVzXG4iLCBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSkpOwotICBzd2l0Y2ggKEYgKGZpeFAtPmZ4X3NpemUsIGZpeFAtPmZ4X3BjcmVsKSkKLSAgICB7Ci0gICAgICBNQVAgKDEsIDAsIEJGRF9SRUxPQ19USUMzMF9MRFApOwotICAgICAgTUFQICgyLCAwLCBCRkRfUkVMT0NfMTYpOwotICAgICAgTUFQICgzLCAwLCBCRkRfUkVMT0NfMjQpOwotICAgICAgTUFQICgyLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgTUFQICg0LCAwLCBCRkRfUkVMT0NfMzIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKCJDYW4gbm90IGRvICVkIGJ5dGUgJXNyZWxvY2F0aW9uIiwgZml4UC0+Znhfc2l6ZSwKLQkgICAgICBmaXhQLT5meF9wY3JlbCA/ICJwYy1yZWxhdGl2ZSAiIDogIiIpOwotICAgIH0KLSN1bmRlZiBNQVAKLSN1bmRlZiBGCi0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIGFzc2VydCAocmVsICE9IDApOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KTsKLSAgcmVsLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWwtPmFkZGVuZCA9IDA7Ci0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIGlmICghcmVsLT5ob3d0bykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9ICI8dW5rbm93bj4iOwotICAgICAgYXNfZmF0YWwgKCJDYW5ub3QgZ2VuZXJhdGUgcmVsb2NhdGlvbiB0eXBlIGZvciBzeW1ib2wgJXMsIGNvZGUgJXMiLCBuYW1lLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgIH0KLSAgcmV0dXJuIHJlbDsKLX0KLQotdm9pZAotdGNfYW91dF9wcmVfd3JpdGVfaG9vayAoKQotewotICBkZWJ1ZyAoIkluIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soKVxuIik7Ci19Ci0KLXZvaWQKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGRlYnVnICgiSW4gbWRfb3BlcmFuZCgpXG4iKTsKLX0KLQotY2hhciBvdXRwdXRfaW52YWxpZF9idWZbOF07Ci0KLWNoYXIgKgotb3V0cHV0X2ludmFsaWQgKGMpCi0gICAgIGNoYXIgYzsKLXsKLSAgaWYgKGlzcHJpbnQgKGMpKQotICAgIHNwcmludGYgKG91dHB1dF9pbnZhbGlkX2J1ZiwgIiclYyciLCBjKTsKLSAgZWxzZQotICAgIHNwcmludGYgKG91dHB1dF9pbnZhbGlkX2J1ZiwgIigweCV4KSIsICh1bnNpZ25lZCkgYyk7Ci0gIHJldHVybiBvdXRwdXRfaW52YWxpZF9idWY7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzMwLmggYi9nYXMvY29uZmlnL3RjLXRpYzMwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzJkMmUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogdGMtdGljMzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtdGljMzAuYwotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1RDX1RJQzMwX0hfCi0jZGVmaW5lIF9UQ19USUMzMF9IXwotCi0jZGVmaW5lIFRDX1RJQzMwIDEKLQotI2lmZGVmIE9CSl9BT1VUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LXRpYzMwIgotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX3RpYzMwCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLWNoYXIgKm91dHB1dF9pbnZhbGlkIFBBUkFNUyAoKGludCBjKSk7Ci0KLSNkZWZpbmUgRU5EX09GX0lOU04gJ1wwJwotI2RlZmluZSBNQVhfT1BFUkFORFMgNgotI2RlZmluZSBESVJFQ1RfUkVGRVJFTkNFICdAJwotI2RlZmluZSBJTkRJUkVDVF9SRUZFUkVOQ0UgJyonCi0jZGVmaW5lIFBBUkFMTEVMX1NFUEFSQVRPUiAnfCcKLSNkZWZpbmUgSU5TTl9TSVpFIDQKLQotLyogRGVmaW5lIHRoaXMgdG8gMSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgb3V0cHV0IHRvIGJlIG9uIHN0ZG91dCwKLSAgIG90aGVyd2lzZSBzdGRlcnIgd2lsbCBiZSB1c2VkLiAgSWYgc3RkZXJyIGlzIHVzZWQsIHRoZXJlIHdpbGwgYmUgYQotICAgYmV0dGVyIHN5bmNocm9uaXNhdGlvbiB3aXRoIHRoZSBhc19iYWQgb3V0cHV0cywgYnV0IHlvdSBjYW4ndAotICAgY2FwdHVyZSB0aGUgb3V0cHV0LiAqLwotI2RlZmluZSBVU0VfU1RET1VUIDAKLQotI2RlZmluZSB0Y191bnJlY29nbml6ZWRfbGluZSB0aWMzMF91bnJlY29nbml6ZWRfbGluZQotCi1leHRlcm4gaW50IHRpYzMwX3VucmVjb2duaXplZF9saW5lIFBBUkFNUyAoKGludCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGljODAuYyBiL2dhcy9jb25maWcvdGMtdGljODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxZGJhMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRpYzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLS8qIHRjLXRpYzgwLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBUSSBUTVMzMjBDODAgKE1WKQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKLQotI2RlZmluZSBpbnRlcm5hbF9lcnJvcih3aGF0KSBcCi0gIGFzX2ZhdGFsKF8oImludGVybmFsIGVycm9yOiVzOiVkOiAlc1xuIiksX19GSUxFX18sX19MSU5FX18sd2hhdCkKLSNkZWZpbmUgaW50ZXJuYWxfZXJyb3JfYSh3aGF0LGFyZykgXAotICBhc19mYXRhbChfKCJpbnRlcm5hbCBlcnJvcjolczolZDogJXMgJWRcbiIpLF9fRklMRV9fLF9fTElORV9fLHdoYXQsYXJnKQotCi0MCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyojIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIHNpbmdsZQotICAgbGluZS4gVGhlIHNlbWljb2xvbiBpcyBzdWNoIGEgY2hhcmFjdGVyIGJ5IGRlZmF1bHQgYW5kIHNob3VsZCBub3QgYmUKLSAgIGV4cGxpY2l0bHkgbGlzdGVkLiAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZjEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZGIjsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLQotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgaW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gKi8KLQotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfc2VjdGlvbiAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYWxpZ24iLAlzX2FsaWduX2J5dGVzLAkJNCB9LAkvKiBEbyBieXRlIGFsaWdubWVudCwgZGVmYXVsdCBpcyBhIDQgYnl0ZSBib3VuZGFyeSAqLwotICB7ICJ3b3JkIiwJY29ucywJCQk0IH0sCS8qIEZJWE1FOiBTaG91bGQgdGhpcyBiZSBtYWNoaW5lIGluZGVwZW5kZW50PyAqLwotICB7ICJic3MiLAlzX2xjb21tX2J5dGVzLAkJMSB9LAotICB7ICJzZWN0IiwJb2JqX2NvZmZfc2VjdGlvbiwJMH0sCS8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggVEkgdG9vbHMgKi8KLSAgeyAic2VjdGlvbiIsCW9ial9jb2ZmX3NlY3Rpb24sCTB9LAkvKiBTdGFuZGFyZCBDT0ZGIC5zZWN0aW9uIHBzZXVkby1vcCAqLwotICB7IE5VTEwsCU5VTEwsCQkJMCB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqdGljODBfaGFzaDsKLQotc3RhdGljIHN0cnVjdCB0aWM4MF9vcGNvZGUgKiBmaW5kX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgdGljODBfb3Bjb2RlICosIGV4cHJlc3Npb25TIFtdKSk7Ci1zdGF0aWMgdm9pZCBidWlsZF9pbnNuIFBBUkFNUyAoKHN0cnVjdCB0aWM4MF9vcGNvZGUgKiwgZXhwcmVzc2lvblMgKikpOwotc3RhdGljIGludCBnZXRfb3BlcmFuZHMgUEFSQU1TICgoZXhwcmVzc2lvblMgZXhwW10pKTsKLXN0YXRpYyBpbnQgY29uc3Rfb3ZlcmZsb3cgUEFSQU1TICgodW5zaWduZWQgbG9uZyBudW0sIGludCBiaXRzLCBpbnQgZmxhZ3MpKTsKLQotLyogUmVwbGFjZSBzaG9ydCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgd2l0aCBsb25nIGZvcm0gd2hlbiBuZWNlc3NhcnkuICBDdXJyZW50bHkKLSAgIHRoaXMgaXMgb2ZmIGJ5IGRlZmF1bHQgb3Igd2hlbiBnaXZlbiB0aGUgLW5vLXJlbGF4IG9wdGlvbi4gIFR1cm5pbmcgaXQgb24gYnkgdXNpbmcKLSAgIHRoZSAtcmVsYXggb3B0aW9uIGZvcmNlcyBhbGwgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIHRvIHVzZSB0aGUgbG9uZyBmb3JtLCB3aGljaAotICAgaXMgd2h5IGl0IGlzIGN1cnJlbnRseSBub3QgdGhlIGRlZmF1bHQuICovCi1zdGF0aWMgaW50IHRpYzgwX3JlbGF4ID0gMDsKLQotDAotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgaW50ZXJuYWxfZXJyb3IgKF8oIlJlbGF4YXRpb24gaXMgYSBsdXh1cnkgd2UgY2FuJ3QgYWZmb3JkIikpOwotICByZXR1cm4gKC0xKTsKLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNAotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0gIAotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YgKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICAgfQotICAKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgY29uc3RhbnQgdmFsdWUgaW4gTlVNIHdpbGwgZml0IGluIGEgZmllbGQgb2YKLSAgIHdpZHRoIEJJVFMgaWYgaXQgaGFzIGZsYWdzIEZMQUdTLiAqLwotCi1zdGF0aWMgaW50Ci1jb25zdF9vdmVyZmxvdyAobnVtLCBiaXRzLCBmbGFncykKLSAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0gICAgIGludCBiaXRzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGxvbmcgbWluLCBtYXg7Ci0gIGludCByZXR2YWwgPSAwOwotCi0gIC8qIE9ubHkgbmVlZCB0byBjaGVjayBmaWVsZHMgbGVzcyB0aGFuIDMyIGJpdHMgd2lkZSAqLwotICBpZiAoYml0cyA8IDMyKQotICAgIGlmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKQotICAgICAgewotCW1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsgCi0JbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsgIAotCXJldHZhbCA9ICgobG9uZykgbnVtID4gbWF4KSB8fCAoKGxvbmcpIG51bSA8IG1pbik7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCW1heCA9ICgxIDw8IGJpdHMpIC0gMTsKLQltaW4gPSAwOwotCXJldHZhbCA9IChudW0gPiBtYXgpIHx8IChudW0gPCBtaW4pOwotICAgICAgfQotICByZXR1cm4gKHJldHZhbCk7Ci19Ci0KLS8qIGdldF9vcGVyYW5kcygpIHBhcnNlcyBhIHN0cmluZyBvZiBvcGVyYW5kcyBhbmQgZmlsbHMgaW4gYSBwYXNzZWQgYXJyYXkgb2YKLSAgIGV4cHJlc3Npb25zIGluIEVYUC4KLQotICAgTm90ZSB0aGF0IHdlIHVzZSBPX2Fic2VudCBleHByZXNzaW9ucyB0byByZWNvcmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgYWJvdXQgdGhlIHByZXZpb3VzIG5vbi1PX2Fic2VudCBleHByZXNzaW9uLCBzdWNoIGFzICI6bSIgb3IgIjpzIgotICAgbW9kaWZpZXJzIG9yIHJlZ2lzdGVyIG51bWJlcnMgZW5jbG9zZWQgaW4gcGFyZW5zIGxpa2UgIihyMTApIi4KLQotICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIHRoYXQgd2VyZSBwbGFjZWQgaW4gRVhQLgotCi0gICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfb3BlcmFuZHMgKGV4cCkgCi0gICAgIGV4cHJlc3Npb25TIGV4cFtdOwotewotICBjaGFyICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnQgbnVtZXhwID0gMDsKLSAgaW50IG1mbGFnID0gMDsKLSAgaW50IHNmbGFnID0gMDsKLSAgaW50IHBhcmVucyA9IDA7Ci0KLSAgd2hpbGUgKCpwKSAgCi0gICAgewotICAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnLCcpIAotCXsKLQkgIHArKzsKLQl9Ci0KLSAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFueSBvcGVyYW5kcyBsZWZ0IHRvIHBhcnNlICovCi0gICAgICBpZiAoKnAgPT0gMCB8fCAqcCA9PSAnXG4nIHx8ICpwID09ICdccicpIAotCXsKLQkgIGJyZWFrOwotCX0KLSAgICAgIAotICAgICAgLyogTm90aWNlIHNjYWxpbmcgb3IgZGlyZWN0IG1lbW9yeSBvcGVyYW5kIG1vZGlmaWVycyBhbmQgc2F2ZSB0aGVtIGluCi0JIGFuIE9fYWJzZW50IGV4cHJlc3Npb24gYWZ0ZXIgdGhlIGV4cHJlc3Npb24gdGhhdCB0aGV5IG1vZGlmeS4gKi8KLQotICAgICAgaWYgKCpwID09ICc6JykgCi0JewotCSAgcCsrOwotCSAgZXhwW251bWV4cF0uWF9vcCA9IE9fYWJzZW50OwotCSAgaWYgKCpwID09ICdtJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgLyogVGhpcyBpcyBhICI6bSIgbW9kaWZpZXIgKi8KLQkgICAgICBleHBbbnVtZXhwXS5YX2FkZF9udW1iZXIgPSBUSUM4MF9PUEVSQU5EX01fU0kgfCBUSUM4MF9PUEVSQU5EX01fTEk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICdzJykKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICAvKiBUaGlzIGlzIGEgIjpzIiBtb2RpZmllciAqLwotCSAgICAgIGV4cFtudW1leHBdLlhfYWRkX251bWJlciA9IFRJQzgwX09QRVJBTkRfU0NBTEVEOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIic6JyBub3QgZm9sbG93ZWQgYnkgJ20nIG9yICdzJyIpKTsKLQkgICAgfQotCSAgbnVtZXhwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEhhbmRsZSBsZWFkaW5nICcoJyBvbiBvcGVyYW5kcyB0aGF0IHVzZSB0aGVtLCBieSByZWNvcmRpbmcgdGhhdCB3ZQotCSBoYXZlIGVudGVyZWQgYSBwYXJlbiBuZXN0aW5nIGxldmVsIGFuZCB0aGVuIGNvbnRpbnVpbmcuICBXZSBjb21wbGFpbgotCSBhYm91dCBtdWx0aXBsZSBuZXN0aW5nLiAqLwotCi0gICAgICBpZiAoKnAgPT0gJygnKQotCXsKLQkgIGlmICgrK3BhcmVucyAhPSAxKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJwYXJlbiBuZXN0aW5nIikpOwotCSAgICB9Ci0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEhhbmRsZSB0cmFpbGluZyAnKScgb24gb3BlcmFuZHMgdGhhdCB1c2UgdGhlbSwgYnkgcmVkdWNpbmcgdGhlCi0JIG5lc3RpbmcgbGV2ZWwgYW5kIHRoZW4gY29udGludWluZy4gIFdlIGNvbXBsYWluIGlmIHRoZXJlIHdlcmUgdG9vCi0JIG1hbnkgY2xvc3VyZXMuICovCi0KLSAgICAgIGlmICgqcCA9PSAnKScpIAotCXsKLQkgIC8qIFJlY29yZCB0aGF0IHdlIGhhdmUgbGVmdCBhIHBhcmVuIGdyb3VwIGFuZCBjb250aW51ZSAqLwotCSAgaWYgKC0tcGFyZW5zIDwgMCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygibWlzbWF0Y2hlZCBwYXJlbnRoZXNpcyIpKTsKLQkgICAgfQotCSAgcCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBCZWdpbiBvcGVyYW5kIHBhcnNpbmcgYXQgdGhlIGN1cnJlbnQgc2NhbiBwb2ludC4gKi8KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICAgIGV4cHJlc3Npb24gKCZleHBbbnVtZXhwXSk7Ci0KLSAgICAgIGlmIChleHBbbnVtZXhwXS5YX29wID09IE9faWxsZWdhbCkKLQl7Ci0JICBhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChleHBbbnVtZXhwXS5YX29wID09IE9fYWJzZW50KQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCX0KLQotICAgICAgbnVtZXhwKys7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBpZiAocGFyZW5zKQotICAgIHsKLSAgICAgIGV4cFtudW1leHBdLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGV4cFtudW1leHArK10uWF9hZGRfbnVtYmVyID0gVElDODBfT1BFUkFORF9QQVJFTlM7Ci0gICAgfQotCi0gIC8qIE1hcmsgdGhlIGVuZCBvZiB0aGUgdmFsaWQgb3BlcmFuZHMgd2l0aCBhbiBpbGxlZ2FsIGV4cHJlc3Npb24uICovCi0gIGV4cFtudW1leHBdLlhfb3AgPSBPX2lsbGVnYWw7Ci0KLSAgcmV0dXJuIChudW1leHApOwotfQotCi0vKiBmaW5kX29wY29kZSgpIGdldHMgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlIHRoYXQKLSAgIG1hdGNoZXMgdGhlIGluc3RydWN0aW9uIGJlaW5nIGFzc2VtYmxlZCwgb3IgcmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggbWF0Y2gKLSAgIGlzIGZvdW5kLgotCi0gICBGaXJzdCBpdCBwYXJzZXMgYWxsIHRoZSBvcGVyYW5kcyBhbmQgc2F2ZSB0aGVtIGFzIGV4cHJlc3Npb25zLiAgTm90ZSB0aGF0Ci0gICB3ZSB1c2UgT19hYnNlbnQgZXhwcmVzc2lvbnMgdG8gcmVjb3JkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICBwcmV2aW91cyBub24tT19hYnNlbnQgZXhwcmVzc2lvbiwgc3VjaCBhcyAiOm0iIG9yICI6cyIgbW9kaWZpZXJzIG9yCi0gICByZWdpc3RlciBudW1iZXJzIGVuY2xvc2VkIGluIHBhcmVucyBsaWtlICIocjEwKSIuCi0KLSAgIEl0IHRoZW4gbG9va3MgYXQgYWxsIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCB1c2VzIHRoZSBvcGVyYW5kcyB0bwotICAgY2hvb3NlIHRoZSBjb3JyZWN0IG9wY29kZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGljODBfb3Bjb2RlICoKLWZpbmRfb3Bjb2RlIChvcGNvZGUsIG15b3BzKQotICAgICBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TIG15b3BzW107Ci17Ci0gIGludCBudW1leHA7CQkJCS8qIE51bWJlciBvZiBleHByZXNzaW9ucyBmcm9tIHBhcnNpbmcgb3BlcmFuZHMgKi8KLSAgaW50IGV4cGk7CQkJCS8qIEluZGV4IG9mIGN1cnJlbnQgZXhwcmVzc2lvbiB0byBtYXRjaCAqLwotICBpbnQgb3BpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IG9wZXJhbmQgdG8gbWF0Y2ggKi8KLSAgaW50IG1hdGNoID0gMDsJCQkvKiBTZXQgdG8gMSB3aGVuIGFuIG9wZXJhbmQgbWF0Y2ggaXMgZm91bmQgKi8KLSAgc3RydWN0IHRpYzgwX29wY29kZSAqb3BjID0gb3Bjb2RlOwkvKiBQb2ludGVyIHRvIGN1cnJlbnQgb3Bjb2RlIHRhYmxlIGVudHJ5ICovCi0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKmVuZDsJLyogUG9pbnRlciB0byBlbmQgb2Ygb3Bjb2RlIHRhYmxlICovCi0KLSAgLyogRmlyc3QgcGFyc2UgYWxsIHRoZSBvcGVyYW5kcyBzbyB3ZSBvbmx5IGhhdmUgdG8gZG8gaXQgb25jZS4gIFRoZXJlIG1heQotICAgICBiZSBtb3JlIGV4cHJlc3Npb25zIGdlbmVyYXRlZCB0aGFuIHRoZXJlIGFyZSBvcGVyYW5kcy4gKi8KLQotICBudW1leHAgPSBnZXRfb3BlcmFuZHMgKG15b3BzKTsKLQotICAvKiBGb3IgZWFjaCBvcGNvZGUgd2l0aCB0aGUgc2FtZSBuYW1lLCB0cnkgdG8gbWF0Y2ggaXQgYWdhaW5zdCB0aGUgcGFyc2VkCi0gICAgIG9wZXJhbmRzLiAqLwotCi0gIGVuZCA9IHRpYzgwX29wY29kZXMgKyB0aWM4MF9udW1fb3Bjb2RlczsKLSAgd2hpbGUgKCFtYXRjaCAmJiAob3BjIDwgZW5kKSAmJiAoc3RyY21wIChvcGMgLT4gbmFtZSwgb3Bjb2RlIC0+IG5hbWUpID09IDApKQotICAgIHsKLSAgICAgIC8qIFN0YXJ0IG9mZiBhc3N1bWluZyBhIG1hdGNoLiAgSWYgd2UgZmluZCBhIG1pc21hdGNoLCB0aGVuIHRoaXMgaXMKLQkgcmVzZXQgYW5kIHRoZSBvcGVyYW5kL2V4cHIgbWF0Y2hpbmcgbG9vcCB0ZXJtaW5hdGVzIHdpdGggbWF0Y2gKLQkgZXF1YWwgdG8gemVybywgd2hpY2ggYWxsb3dzIHVzIHRvIHRyeSB0aGUgbmV4dCBvcGNvZGUuICovCi0KLSAgICAgIG1hdGNoID0gMTsKLQotICAgICAgLyogRm9yIGVhY2ggZXhwcmVzc2lvbiwgdHJ5IHRvIG1hdGNoIGl0IGFnYWluc3QgdGhlIGN1cnJlbnQgb3BlcmFuZAotCSBmb3IgdGhlIGN1cnJlbnQgb3Bjb2RlLiAgVXBvbiBhbnkgbWlzbWF0Y2gsIHdlIGFiYW5kb24gZnVydGhlcgotCSBtYXRjaGluZyBmb3IgdGhlIGN1cnJlbnQgb3Bjb2RlIHRhYmxlIGVudHJ5LiAgKi8KLQotICAgICAgZm9yIChleHBpID0gMCwgb3BpID0gLTE7IChleHBpIDwgbnVtZXhwKSAmJiBtYXRjaDsgZXhwaSsrKQotCXsKLQkgIGludCBiaXRzLCBmbGFncywgWF9vcCwgbnVtOwotCi0JICBYX29wID0gbXlvcHNbZXhwaV0uWF9vcDsKLQkgIG51bSA9IG15b3BzW2V4cGldLlhfYWRkX251bWJlcjsKLQotCSAgLyogVGhlIE9fYWJzZW50IGV4cHJlc3Npb25zIGFwcGx5IHRvIHRoZSBzYW1lIG9wZXJhbmQgYXMgdGhlIG1vc3QKLQkgICAgIHJlY2VudCBub24gT19hYnNlbnQgZXhwcmVzc2lvbi4gIFNvIG9ubHkgaW5jcmVtZW50IHRoZSBvcGVyYW5kCi0JICAgICBpbmRleCB3aGVuIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgbm90IG9uZSBvZiB0aGVzZSBzcGVjaWFsCi0JICAgICBleHByZXNzaW9ucy4gKi8KLQotCSAgaWYgKFhfb3AgIT0gT19hYnNlbnQpCi0JICAgIHsKLQkgICAgICBvcGkrKzsKLQkgICAgfQotCi0JICBmbGFncyA9IHRpYzgwX29wZXJhbmRzW29wYyAtPiBvcGVyYW5kc1tvcGldXS5mbGFnczsKLQkgIGJpdHMgPSB0aWM4MF9vcGVyYW5kc1tvcGMgLT4gb3BlcmFuZHNbb3BpXV0uYml0czsKLQotCSAgc3dpdGNoIChYX29wKQotCSAgICB7Ci0JICAgIGNhc2UgT19yZWdpc3RlcjoKLQkgICAgICAvKiBBbHNvIGNoZWNrIHRoYXQgcmVnaXN0ZXJzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGV2ZW4gYWN0dWFsbHkKLQkJIGFyZSBldmVuLiAqLwotCSAgICAgIGlmICgoKGZsYWdzICYgVElDODBfT1BFUkFORF9HUFIpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0dQUikpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRlBBKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9GUEEpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9DUikpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRVZFTikgJiYgKG51bSAmIDEpKSB8fAotCQkgIGNvbnN0X292ZXJmbG93IChudW0gJiB+VElDODBfT1BFUkFORF9NQVNLLCBiaXRzLCBmbGFncykpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2NvbnN0YW50OgotCSAgICAgIGlmICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VORE1BU0spICYmIChudW0gPT0gMzIpKQotCQl7Ci0JCSAgLyogRW5kbWFzayB2YWx1ZXMgb2YgMCBhbmQgMzIgZ2l2ZSBpZGVudGljYWwgcmVzdWx0cyAqLwotCQkgIG51bSA9IDA7Ci0JCX0KLQkgICAgICBpZiAoKGZsYWdzICYgKFRJQzgwX09QRVJBTkRfRlBBIHwgVElDODBfT1BFUkFORF9HUFIpKSB8fAotCQkgIGNvbnN0X292ZXJmbG93IChudW0sIGJpdHMsIGZsYWdzKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fc3ltYm9sOgotCSAgICAgIGlmICgoYml0cyA8IDMyKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKSAmJiAhdGljODBfcmVsYXgpCi0JCXsKLQkJICAvKiBUaGUgZGVmYXVsdCBpcyB0byBwcmVmZXIgdGhlIHNob3J0IGZvcm0gb2YgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JCSAgICAgVGhpcyBpcyB0aGUgb25seSBmb3JtIHRoYXQgdGhlIFRJIGFzc2VtYmxlciBzdXBwb3J0cy4KLQkJICAgICBJZiB0aGUgLXJlbGF4IG9wdGlvbiBpcyBnaXZlbiwgd2UgbmV2ZXIgdXNlIHRoZSBzaG9ydCBmb3Jtcy4KLQkJICAgICBGSVhNRTogU2hvdWxkIGJlIGFibGUgdG8gY2hvb3NlICJiZXN0LWZpdCIuICovCi0JCX0KLQkgICAgICBlbHNlIGlmICgoYml0cyA9PSAzMikgLyogJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9CQVNFUkVMKSAqLykKLQkJewotCQkgIC8qIFRoZSBkZWZhdWx0IGlzIHRvIHByZWZlciB0aGUgbG9uZyBmb3JtIG9mIGJhc2UgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JCSAgICAgVGhpcyBpcyB0aGUgb25seSBmb3JtIHRoYXQgdGhlIFRJIGFzc2VtYmxlciBzdXBwb3J0cy4KLQkJICAgICBJZiB0aGUgLW5vLXJlbGF4IG9wdGlvbiBpcyBnaXZlbiwgd2UgYWx3YXlzIHVzZSB0aGUgbG9uZyBmb3JtIG9mCi0JCSAgICAgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JCSAgICAgRklYTUU6IFNob3VsZCBiZSBhYmxlIHRvIGNob29zZSAiYmVzdC1maXQiLiAqLwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogU3ltYm9scyB0aGF0IGRvbid0IG1hdGNoIG9uZSBvZiB0aGUgYWJvdmUgY2FzZXMgYXJlCi0JCSAgICAgcmVqZWN0ZWQgYXMgYW4gb3BlcmFuZC4gKi8KLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2Fic2VudDoKLQkgICAgICAvKiBJZiB0aGlzIGlzIGFuIE9fYWJzZW50IGV4cHJlc3Npb24sIHRoZW4gaXQgbWF5IGJlIGFuIGV4cHJlc3Npb24gdGhhdAotCQkgc3VwcGxpZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3BlcmFuZCwgc3VjaCBhcyAiOm0iIG9yCi0JCSAiOnMiIG1vZGlmaWVycy4gQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIG9wZXJhbmQgbWF0Y2hlcyB0aGlzIHJlcXVpcmVtZW50LiAqLwotCSAgICAgIGlmICghKChudW0gJiBUSUM4MF9PUEVSQU5EX01fU0kpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9TSSkgfHwKLQkJICAgIChudW0gJiBUSUM4MF9PUEVSQU5EX01fTEkpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkgfHwKLQkJICAgIChudW0gJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9TQ0FMRUQpKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fYmlnOgotCSAgICAgIGlmICgobnVtID4gMCkgfHwgIShmbGFncyAmIFRJQzgwX09QRVJBTkRfRkxPQVQpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19pbGxlZ2FsOgotCSAgICBjYXNlIE9fc3ltYm9sX3J2YToKLQkgICAgY2FzZSBPX3VtaW51czoKLQkgICAgY2FzZSBPX2JpdF9ub3Q6Ci0JICAgIGNhc2UgT19sb2dpY2FsX25vdDoKLQkgICAgY2FzZSBPX211bHRpcGx5OgotCSAgICBjYXNlIE9fZGl2aWRlOgotCSAgICBjYXNlIE9fbW9kdWx1czoKLQkgICAgY2FzZSBPX2xlZnRfc2hpZnQ6Ci0JICAgIGNhc2UgT19yaWdodF9zaGlmdDoKLQkgICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6Ci0JICAgIGNhc2UgT19iaXRfb3Jfbm90OgotCSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoKLQkgICAgY2FzZSBPX2JpdF9hbmQ6Ci0JICAgIGNhc2UgT19hZGQ6Ci0JICAgIGNhc2UgT19zdWJ0cmFjdDoKLQkgICAgY2FzZSBPX2VxOgotCSAgICBjYXNlIE9fbmU6Ci0JICAgIGNhc2UgT19sdDoKLQkgICAgY2FzZSBPX2xlOgotCSAgICBjYXNlIE9fZ2U6Ci0JICAgIGNhc2UgT19ndDoKLQkgICAgY2FzZSBPX2xvZ2ljYWxfYW5kOgotCSAgICBjYXNlIE9fbG9naWNhbF9vcjoKLQkgICAgY2FzZSBPX21heDoKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgZXhwcmVzc2lvbiB0eXBlIiksIFhfb3ApOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCFtYXRjaCkKLQl7Ci0JICBvcGMrKzsKLQl9Ci0gICAgfSAgCi0KLSAgcmV0dXJuIChtYXRjaCA/IG9wYyA6IE5VTEwpOwotCi0jaWYgMAotCi0gIC8qIE5vdyBzZWFyY2ggdGhlIG9wY29kZSB0YWJsZSB0YWJsZSBmb3Igb25lIHdpdGggb3BlcmFuZHMgdGhhdAotICAgICBtYXRjaGVzIHdoYXQgd2UndmUgZ290LiAqLwotCi0gIHdoaWxlICghbWF0Y2gpCi0gICAgewotICAgICAgbWF0Y2ggPSAxOwotICAgICAgZm9yIChpID0gMDsgb3Bjb2RlIC0+IG9wZXJhbmRzW2ldOyBpKyspIAotCXsKLQkgIGludCBmbGFncyA9IHRpYzgwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgaW50IFhfb3AgPSBteW9wc1tpXS5YX29wOwotCSAgaW50IG51bSA9IG15b3BzW2ldLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKFhfb3AgPT0gMCkgCi0JICAgIHsKLQkgICAgICBtYXRjaCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgICAKLQkgIGlmIChmbGFncyAmIChUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRlBBIHwgVElDODBfT1BFUkFORF9DUikpIAotCSAgICB7Ci0JICAgICAgaWYgKChYX29wICE9IE9fcmVnaXN0ZXIpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfR1BSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9HUFIpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZQQSkgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfRlBBKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfQ1IpKSkKLQkJewotCQkgIG1hdGNoPTA7Ci0JCSAgYnJlYWs7Ci0JCX0JICAKLQkgICAgfQotCSAgICAgIAotCSAgaWYgKCgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01JTlVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9NSU5VUykpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BMVVMpICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX1BMVVMpKSkgfHwKLQkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9BVE1JTlVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9BVE1JTlVTKSkpIHx8Ci0JICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQVRQQVIpICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX0FUUEFSKSkpIHx8Ci0JICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQVRTSUdOKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9BVFNJR04pKSkpIAotCSAgICB7Ci0JICAgICAgbWF0Y2g9MDsKLQkgICAgICBicmVhazsKLQkgICAgfQkgICAgICAKLQl9Ci0gICAgICAvKiB3ZSdyZSBvbmx5IGRvbmUgaWYgdGhlIG9wZXJhbmRzIG1hdGNoZWQgc28gZmFyIEFORCB0aGVyZQotCSBhcmUgbm8gbW9yZSB0byBjaGVjayAqLwotICAgICAgaWYgKG1hdGNoICYmIG15b3BzW2ldLlhfb3A9PTApIAotCWJyZWFrOwotICAgICAgZWxzZQotCW1hdGNoID0gMDsKLQotICAgICAgbmV4dF9vcGNvZGUgPSBvcGNvZGUrMTsKLSAgICAgIGlmIChuZXh0X29wY29kZS0+b3Bjb2RlID09IDApIAotCWJyZWFrOwotICAgICAgaWYgKHN0cmNtcChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQlicmVhazsKLSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotICAgIH0KLQotICBpZiAoIW1hdGNoKSAgCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCBhbGwgcmVnaXN0ZXJzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIGV2ZW4gYXJlLiAqLwotICAvKiBBbHNvLCBpZiBhbnkgb3BlcmFuZHMgd2VyZSBtYXJrZWQgYXMgcmVnaXN0ZXJzLCBidXQgd2VyZSByZWFsbHkgc3ltYm9scyAqLwotICAvKiBmaXggdGhhdCBoZXJlLiAqLwotICBmb3IgKGk9MDsgb3Bjb2RlLT5vcGVyYW5kc1tpXTsgaSsrKSAKLSAgICB7Ci0gICAgICBpZiAoKHRpYzgwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgVElDODBfT1BFUkFORF9FVkVOKSAmJgotCSAgKG15b3BzW2ldLlhfYWRkX251bWJlciAmIDEpKSAKLQlhc19mYXRhbCAoXygiUmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgRVZFTiIpKTsKLSAgICAgIGlmIChteW9wc1tpXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgaWYgKCEodGljODBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1JFRykpIAotCSAgICB7Ci0JICAgICAgbXlvcHNbaV0uWF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIG15b3BzW2ldLlhfYWRkX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjaGFyICopbXlvcHNbaV0uWF9vcF9zeW1ib2wpOwotCSAgICAgIG15b3BzW2ldLlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgbXlvcHNbaV0uWF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2VuZGlmCi19Ci0KLS8qIGJ1aWxkX2luc24gdGFrZXMgYSBwb2ludGVyIHRvIHRoZSBvcGNvZGUgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZQotICAgYW5kIHRoZSBhcnJheSBvZiBvcGVyYW5kIGV4cHJlc3Npb25zIGFuZCB3cml0ZXMgb3V0IHRoZSBpbnN0cnVjdGlvbi4KLQotICAgTm90ZSB0aGF0IHRoZSBvcGNvZGUgd29yZCBhbmQgZXh0ZW5kZWQgd29yZCBtYXkgYmUgd3JpdHRlbiB0byBkaWZmZXJlbnQKLSAgIGZyYWdzLCB3aXRoIHRoZSBvcGNvZGUgYXQgdGhlIGVuZCBvZiBvbmUgZnJhZyBhbmQgdGhlIGV4dGVuc2lvbiBhdCB0aGUKLSAgIGJlZ2lubmluZyBvZiB0aGUgbmV4dC4gKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2luc24gKG9wY29kZSwgb3BlcnMpIAotICAgICBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyczsKLXsKLSAgaW50IGV4cGk7CQkJCS8qIEluZGV4IG9mIGN1cnJlbnQgZXhwcmVzc2lvbiB0byBtYXRjaCAqLwotICBpbnQgb3BpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IG9wZXJhbmQgdG8gbWF0Y2ggKi8KLSAgdW5zaWduZWQgbG9uZyBpbnNuWzJdOwkJLyogSW5zdHJ1Y3Rpb24gYW5kIGxvbmcgaW1tZWRpYXRlIChpZiBhbnkpICovCi0gIGNoYXIgKmY7CQkJCS8qIFBvaW50ZXIgdG8gZnJhZyBsb2NhdGlvbiBmb3IgaW5zblswXSAqLwotICBmcmFnUyAqZmZyYWc7CQkJCS8qIEZyYWcgY29udGFpbmluZyBsb2NhdGlvbiBmICovCi0gIGNoYXIgKmZ4ID0gTlVMTDsJCQkvKiBQb2ludGVyIHRvIGZyYWcgbG9jYXRpb24gZm9yIGluc25bMV0gKi8KLSAgZnJhZ1MgKmZ4ZnJhZzsJCQkvKiBGcmFnIGNvbnRhaW5pbmcgbG9jYXRpb24gZnggKi8KLQotICAvKiBTdGFydCB3aXRoIHRoZSByYXcgb3Bjb2RlIGJpdHMgZnJvbSB0aGUgb3Bjb2RlIHRhYmxlLiAqLwotICBpbnNuWzBdID0gb3Bjb2RlIC0+IG9wY29kZTsKLQotICAvKiBXZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGF0IGxlYXN0IG9uZSAzMiBiaXQgb3Bjb2RlIHNvIGdldCB0aGUKLSAgICAgZnJhZyBub3cuICovCi0KLSAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gIGZmcmFnID0gZnJhZ19ub3c7Ci0KLSAgLyogRm9yIGVhY2ggb3BlcmFuZCBleHByZXNzaW9uLCBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW50byB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gLiAqLwotICBmb3IgKGV4cGkgPSAwLCBvcGkgPSAtMTsgb3BlcnNbZXhwaV0uWF9vcCAhPSBPX2lsbGVnYWw7IGV4cGkrKykKLSAgICB7Ci0gICAgICBpbnQgYml0cywgc2hpZnQsIGZsYWdzLCBYX29wLCBudW07Ci0KLSAgICAgIFhfb3AgPSBvcGVyc1tleHBpXS5YX29wOwotICAgICAgbnVtID0gb3BlcnNbZXhwaV0uWF9hZGRfbnVtYmVyOwotCi0gICAgICAvKiBUaGUgT19hYnNlbnQgZXhwcmVzc2lvbnMgYXBwbHkgdG8gdGhlIHNhbWUgb3BlcmFuZCBhcyB0aGUgbW9zdAotCSByZWNlbnQgbm9uIE9fYWJzZW50IGV4cHJlc3Npb24uICBTbyBvbmx5IGluY3JlbWVudCB0aGUgb3BlcmFuZAotCSBpbmRleCB3aGVuIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgbm90IG9uZSBvZiB0aGVzZSBzcGVjaWFsCi0JIGV4cHJlc3Npb25zLiAqLwotCi0gICAgICBpZiAoWF9vcCAhPSBPX2Fic2VudCkKLQl7Ci0JICBvcGkrKzsKLQl9Ci0KLSAgICAgIGZsYWdzID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlIC0+IG9wZXJhbmRzW29waV1dLmZsYWdzOwotICAgICAgYml0cyA9IHRpYzgwX29wZXJhbmRzW29wY29kZSAtPiBvcGVyYW5kc1tvcGldXS5iaXRzOwotICAgICAgc2hpZnQgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUgLT4gb3BlcmFuZHNbb3BpXV0uc2hpZnQ7Ci0KLSAgICAgIHN3aXRjaCAoWF9vcCkKLQl7Ci0JY2FzZSBPX3JlZ2lzdGVyOgotCSAgbnVtICY9IH5USUM4MF9PUEVSQU5EX01BU0s7Ci0JICBpbnNuWzBdID0gaW5zblswXSB8IChudW0gPDwgc2hpZnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBPX2NvbnN0YW50OgotCSAgaWYgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRU5ETUFTSykgJiYgKG51bSA9PSAzMikpCi0JICAgIHsKLQkgICAgICAvKiBFbmRtYXNrIHZhbHVlcyBvZiAwIGFuZCAzMiBnaXZlIGlkZW50aWNhbCByZXN1bHRzICovCi0JICAgICAgbnVtID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoKGZsYWdzICYgVElDODBfT1BFUkFORF9CSVROVU0pKQotCSAgICB7Ci0JICAgICAgLyogQklUTlVNIHZhbHVlcyBhcmUgc3RvcmVkIGluIG9uZSdzIGNvbXBsZW1lbnQgZm9ybSAqLwotCSAgICAgIG51bSA9ICh+bnVtICYgMHgxRik7Ci0JICAgIH0KLQkgIC8qIE1hc2sgb2ZmIHVwcGVyIGJpdHMsIGp1c3QgaXQgY2FzZSBpdCBpcyBzaWduZWQgYW5kIGlzIG5lZ2F0aXZlICovCi0JICBpZiAoYml0cyA8IDMyKQotCSAgICB7Ci0JICAgICAgbnVtICY9ICgxIDw8IGJpdHMpIC0gMTsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8IChudW0gPDwgc2hpZnQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmeCA9IGZyYWdfbW9yZSAoNCk7Ci0JICAgICAgZnhmcmFnID0gZnJhZ19ub3c7Ci0JICAgICAgaW5zblsxXSA9IG51bTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX3N5bWJvbDoKLQkgIGlmIChiaXRzID09IDMyKQotCSAgICB7Ci0JICAgICAgZnggPSBmcmFnX21vcmUgKDQpOwotCSAgICAgIGZ4ZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIGluc25bMV0gPSAwOwotCSAgICAgIGlmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUENSRUwpCi0JCXsKLQkJICBmaXhfbmV3X2V4cCAoZnhmcmFnLAotCQkJICAgICAgIGZ4IC0gKGZ4ZnJhZyAtPiBmcl9saXRlcmFsKSwKLQkJCSAgICAgICA0LAotCQkJICAgICAgICZvcGVyc1tleHBpXSwgCi0JCQkgICAgICAgMSwKLQkJCSAgICAgICBSX01QUENSKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZpeF9uZXdfZXhwIChmeGZyYWcsCi0JCQkgICAgICAgZnggLSAoZnhmcmFnIC0+IGZyX2xpdGVyYWwpLAotCQkJICAgICAgIDQsCi0JCQkgICAgICAgJm9wZXJzW2V4cGldLCAKLQkJCSAgICAgICAwLAotCQkJICAgICAgIFJfUkVMTE9OR1gpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkKLQkgICAgewotCSAgICAgIGZpeF9uZXdfZXhwIChmZnJhZywKLQkJCSAgIGYgLSAoZmZyYWcgLT4gZnJfbGl0ZXJhbCksCi0JCQkgICA0LAkJCS8qIEZJWE1FISBob3cgaXMgdGhpcyB1c2VkPyAqLwotCQkJICAgJm9wZXJzW2V4cGldLAotCQkJICAgMSwKLQkJCSAgIFJfTVBQQ1IxNVcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnRlcm5hbF9lcnJvciAoXygic3ltYm9sIHJlbG9jIHRoYXQgaXMgbm90IFBDIHJlbGF0aXZlIG9yIDMyIGJpdHMiKSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT19hYnNlbnQ6Ci0JICAvKiBFYWNoIE9fYWJzZW50IGV4cHJlc3Npb24gY2FuIGluZGljYXRlIGV4YWN0bHkgb25lIHBvc3NpYmxlIG1vZGlmaWVyLiAqLwotCSAgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX01fU0kpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9TSSkpCi0JICAgIHsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8ICgxIDw8IDE3KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfTV9MSSkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9NX0xJKSkKLQkgICAgewotCSAgICAgIGluc25bMF0gPSBpbnNuWzBdIHwgKDEgPDwgMTUpOwotCSAgICB9Ci0JICBlbHNlIGlmICgobnVtICYgVElDODBfT1BFUkFORF9TQ0FMRUQpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSkKLQkgICAgewotCSAgICAgIGluc25bMF0gPSBpbnNuWzBdIHwgKDEgPDwgMTEpOwotCSAgICB9Ci0JICBlbHNlIGlmICgobnVtICYgVElDODBfT1BFUkFORF9QQVJFTlMpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUEFSRU5TKSkKLQkgICAgewotCSAgICAgIC8qIE5vIGNvZGUgdG8gZ2VuZXJhdGUsIGp1c3QgYWNjZXB0IGFuZCBkaXNjYXJkIHRoaXMgZXhwcmVzc2lvbiAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgb3BlcmFuZCBtb2RpZmllciIpLCBvcGVyc1tleHBpXS5YX2FkZF9udW1iZXIpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9fYmlnOgotCSAgZnggPSBmcmFnX21vcmUgKDQpOwotCSAgZnhmcmFnID0gZnJhZ19ub3c7Ci0JICB7Ci0JICAgIGludCBwcmVjaXNpb24gPSAyOwotCSAgICBsb25nIGV4cG9uZW50X2JpdHMgPSA4TDsKLQkgICAgTElUVExFTlVNX1RZUEUgd29yZHNbMl07Ci0JICAgIC8qIFZhbHVlIGlzIHN0aWxsIGluIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICovCi0JICAgIGdlbl90b193b3JkcyAod29yZHMsIHByZWNpc2lvbiwgZXhwb25lbnRfYml0cyk7Ci0JICAgIGluc25bMV0gPSAod29yZHNbMF0gPDwgMTYpIHwgd29yZHNbMV07Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9faWxsZWdhbDoKLQljYXNlIE9fc3ltYm9sX3J2YToKLQljYXNlIE9fdW1pbnVzOgotCWNhc2UgT19iaXRfbm90OgotCWNhc2UgT19sb2dpY2FsX25vdDoKLQljYXNlIE9fbXVsdGlwbHk6Ci0JY2FzZSBPX2RpdmlkZToKLQljYXNlIE9fbW9kdWx1czoKLQljYXNlIE9fbGVmdF9zaGlmdDoKLQljYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6Ci0JY2FzZSBPX2JpdF9vcl9ub3Q6Ci0JY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0JY2FzZSBPX2JpdF9hbmQ6Ci0JY2FzZSBPX2FkZDoKLQljYXNlIE9fc3VidHJhY3Q6Ci0JY2FzZSBPX2VxOgotCWNhc2UgT19uZToKLQljYXNlIE9fbHQ6Ci0JY2FzZSBPX2xlOgotCWNhc2UgT19nZToKLQljYXNlIE9fZ3Q6Ci0JY2FzZSBPX2xvZ2ljYWxfYW5kOgotCWNhc2UgT19sb2dpY2FsX29yOgotCWNhc2UgT19tYXg6Ci0JZGVmYXVsdDoKLQkgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCBleHByZXNzaW9uIiksIFhfb3ApOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLCBlaXRoZXIgNCBvciA4IGJ5dGVzLiAgKi8KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc25bMF0sIDQpOwotICBpZiAoZnggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZ4LCBpbnNuWzFdLCA0KTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBHYXMKLSAgIGNhbGxzIHRoaXMgZnVuY3Rpb24gZm9yIGVhY2ggaW5wdXQgbGluZSB3aGljaCBkb2VzIG5vdCBjb250YWluIGEKLSAgIHBzZXVkb29wLgotCi0gIFNUUiBwb2ludHMgdG8gYSBOVUxMIHRlcm1pbmF0ZWQgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzCi0gIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc2NhbjsKLSAgdW5zaWduZWQgY2hhciAqaW5wdXRfbGluZV9zYXZlOwotICBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gIGV4cHJlc3Npb25TIG15b3BzWzE2XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gIC8qIEVuc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUgdG8gYXNzZW1ibGUuICovCi0gIGFzc2VydCAoc3RyKTsKLQotICAvKiBEcm9wIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICB7Ci0gICAgICBzdHIrKzsKLSAgICB9Ci0KLSAgLyogSXNvbGF0ZSB0aGUgbW5lbW9uaWMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIGJ5IGZpbmRpbmcgdGhlIGZpcnN0Ci0gICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGFuZCB6YXBwaW5nIGl0IHRvIGEgbnVsbCBieXRlLiAqLwotICBmb3IgKHNjYW4gPSBzdHI7ICpzY2FuICE9ICdcMDAwJyAmJiAhaXNzcGFjZSAoKnNjYW4pOyBzY2FuKyspIHs7fQotICBpZiAoKnNjYW4gIT0gJ1wwMDAnKQotICAgIHsKLSAgICAgICpzY2FuKysgPSAnXDAwMCc7Ci0gICAgfQotCi0gIC8qIFRyeSB0byBmaW5kIHRoaXMgbW5lbW9uaWMgaW4gdGhlIGhhc2ggdGFibGUgKi8KLSAgaWYgKChvcGNvZGUgPSAoc3RydWN0IHRpYzgwX29wY29kZSAqKSBoYXNoX2ZpbmQgKHRpYzgwX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG1uZW1vbmljOiAnJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ciA9IHNjYW47Ci0gIHdoaWxlIChpc3NwYWNlICgqc2NhbikpCi0gICAgewotICAgICAgc2NhbisrOwotICAgIH0KLQotICBpbnB1dF9saW5lX3NhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICBvcGNvZGUgPSBmaW5kX29wY29kZSAob3Bjb2RlLCBteW9wcyk7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkludmFsaWQgb3BlcmFuZHM6ICclcyciKSwgaW5wdXRfbGluZV9zYXZlKTsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9zYXZlOwotICBidWlsZF9pbnNuIChvcGNvZGUsIG15b3BzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhdCB0aGUgc3RhcnQgb2YgYXNzZW1ibHksIGFmdGVyIHRoZSBjb21tYW5kCi0gICBsaW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIGFuZCBhbGwgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQKLSAgIGluaXRpYWxpemF0aW9ucyBoYXZlIGJlZW4gY29tcGxldGVkLgotCi0gICBJdCBzaG91bGQgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuLCB0aGF0IHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwYXJ0IG9mCi0gICB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcDsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3BfZW5kOwotICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7Ci0gIGV4dGVybiBpbnQgY29mZl9mbGFnczsJCQkvKiBEZWZpbmVkIGluIG9iai1jb2ZmLmMgKi8KLQotICAvKiBTZXQgRl9BUjMyV1IgaW4gY29mZl9mbGFncywgd2hpY2ggd2lsbCBlbmQgdXAgaW4gdGhlIGZpbGUgaGVhZGVyCi0gICAgIGZfZmxhZ3MgZmllbGQuICovCi0KLSAgY29mZl9mbGFncyB8PSBGX0FSMzJXUjsJLyogVEljODAgaXMgMzIgYml0IGxpdHRsZSBlbmRpYW4gKi8KLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBUSWM4MCBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgdGljODBfaGFzaCA9IGhhc2hfbmV3ICgpOwotICBvcF9lbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7Ci0gIGZvciAob3AgPSB0aWM4MF9vcGNvZGVzOyBvcCA8IG9wX2VuZDsgb3ArKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wIC0+IG5hbWUpICE9IDApIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wIC0+IG5hbWU7Ci0JICBoYXNoX2luc2VydCAodGljODBfaGFzaCwgb3AgLT4gbmFtZSwgKGNoYXIgKikgb3ApOwotCX0KLSAgICB9Ci0KLSAgLyogSW5zZXJ0IHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgV2UgdXNlIHN5bWJvbF9jcmVhdGUKLSAgICAgcmF0aGVyIHRoYW4gc3ltYm9sX25ldyBzbyB0aGF0IHRoZXNlIHN5bWJvbHMgZG9uJ3QgZW5kIHVwIGluIHRoZSBvYmplY3QKLSAgICAgZmlsZXMnIHN5bWJvbCB0YWJsZS4gIE5vdGUgdGhhdCB0aGUgdmFsdWVzIG9mIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgaW5jbHVkZQotICAgICBzb21lIHVwcGVyIGJpdHMgdGhhdCBkaXN0aW5ndWlzaCB0aGUgdHlwZSBvZiB0aGUgc3ltYm9sIChyZWdpc3RlciwgYml0bnVtLAotICAgICBjb25kaXRpb24gY29kZSwgZXRjKSBhbmQgdGhlc2UgYml0cyBtdXN0IGJlIG1hc2tlZCBhd2F5IGJlZm9yZSBhY3R1YWxseQotICAgICBpbnNlcnRpbmcgdGhlIHZhbHVlcyBpbnRvIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uICBGb3IgcmVnaXN0ZXJzIHdlIHB1dAotICAgICB0aGVzZSBiaXRzIGluIHRoZSBzeW1ib2wgdGFibGUgc2luY2Ugd2UgdXNlIHRoZW0gbGF0ZXIgYW5kIHRoZXJlIGlzIG5vCi0gICAgIHF1ZXN0aW9uIHRoYXQgdGhleSBhcmVuJ3QgcGFydCBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgRm9yIGNvbnN0YW50cyB3ZQotICAgICBjYW4ndCBkbyB0aGF0IHNpbmNlIHRoZSBjb25zdGFudCBjYW4gYmUgYW55IHZhbHVlLCBzbyB0aGV5IGFyZSBtYXNrZWQgb2ZmCi0gICAgIGJlZm9yZSBwdXR0aW5nIHRoZW0gaW50byB0aGUgc3ltYm9sIHRhYmxlLiAqLwotCi0gIHBkc3AgPSBOVUxMOwotICB3aGlsZSAoKHBkc3AgPSB0aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sIChwZHNwKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgICB2YWx1ZVQgdmFsdTsKLSAgICAgIGludCBzeW10eXBlOwotCi0gICAgICBzeW10eXBlID0gUERTX1ZBTFVFIChwZHNwKSAmIFRJQzgwX09QRVJBTkRfTUFTSzsKLSAgICAgIHN3aXRjaCAoc3ltdHlwZSkKLQl7Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0dQUjoKLQljYXNlIFRJQzgwX09QRVJBTkRfRlBBOgotCWNhc2UgVElDODBfT1BFUkFORF9DUjoKLQkgIHNlZ21lbnQgPSByZWdfc2VjdGlvbjsKLQkgIHZhbHUgPSBQRFNfVkFMVUUgKHBkc3ApOwotCSAgYnJlYWs7Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0NDOgotCWNhc2UgVElDODBfT1BFUkFORF9CSVROVU06Ci0JICBzZWdtZW50ID0gYWJzb2x1dGVfc2VjdGlvbjsKLQkgIHZhbHUgPSBQRFNfVkFMVUUgKHBkc3ApICYgflRJQzgwX09QRVJBTkRfTUFTSzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgcHJlZGVmaW5lZCBzeW1ib2wgYml0cyIpLCBzeW10eXBlKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKFBEU19OQU1FIChwZHNwKSwgc2VnbWVudCwgdmFsdSwKLQkJCQkJICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgICB9Ci19Ci0KLQwKLQotLyogVGhlIGFzc2VtYmxlciBhZGRzIG1kX3Nob3J0b3B0cyB0byB0aGUgc3RyaW5nIHBhc3NlZCB0byBnZXRvcHQuICovCi0KLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotCi0vKiBUaGUgYXNzZW1ibGVyIGFkZHMgbWRfbG9uZ29wdHMgdG8gdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgbG9uZyBvcHRpb25zCi0gICB0aGF0IGFyZSBwYXNzZWQgdG8gZ2V0b3B0LiAqLwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0KLSNkZWZpbmUgT1BUSU9OX1JFTEFYCShPUFRJT05fTURfQkFTRSkKLSAgeyJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVh9LAotCi0jZGVmaW5lIE9QVElPTl9OT19SRUxBWAkoT1BUSU9OX1JFTEFYICsgMSkKLSAgeyJuby1yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fUkVMQVh9LAotCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotLyogVGhlIG1kX3BhcnNlX29wdGlvbiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBnZXRvcHQgcmV0dXJucyBhbgotICAgdW5yZWNvZ25pemVkIGNvZGUsIHByZXN1bWFibHkgaW5kaWNhdGluZyBhIHNwZWNpYWwgY29kZSB2YWx1ZSB3aGljaAotICAgYXBwZWFycyBpbiBtZF9sb25nb3B0cyBmb3IgbWFjaGluZSBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9ucy4gKi8KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIHRpYzgwX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX05PX1JFTEFYOgotICAgICAgdGljODBfcmVsYXggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICByZXR1cm4gKDEpOwotfQotCi0vKiBUaGUgbWRfc2hvd191c2FnZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIHVzYWdlIG1lc3NhZ2UgaXMKLSAgIHByaW50ZWQuICBJdCBzaG91bGQgcHJpbnQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjaGluZSBzcGVjaWZpYyBvcHRpb25zCi0gICBmb3VuZCBpbiBtZF9sb25nb3B0cy4gKi8KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgIlwKLVRJYzgwIG9wdGlvbnM6XG5cCi0tcmVsYXgJCQlhbHRlciBQQyByZWxhdGl2ZSBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRvIHVzZSBsb25nIGZvcm0gd2hlbiBuZWVkZWRcblwKLS1uby1yZWxheAkJYWx3YXlzIHVzZSBzaG9ydCBQQyByZWxhdGl2ZSBicmFuY2ggaW5zdHJ1Y3Rpb25zLCBlcnJvciBvbiBvdmVyZmxvd1xuIik7Ci19Ci0KLQwKLS8qIEF0dGVtcHQgdG8gc2ltcGxpZnkgb3IgZXZlbiBlbGltaW5hdGUgYSBmaXh1cC4gIFRoZSByZXR1cm4gdmFsdWUgaXMKLSAgIGlnbm9yZWQ7IHBlcmhhcHMgaXQgd2FzIG9uY2UgbWVhbmluZ2Z1bCwgYnV0IG5vdyBpdCBpcyBoaXN0b3JpY2FsLgotICAgVG8gaW5kaWNhdGUgdGhhdCBhIGZpeHVwIGhhcyBiZWVuIGVsaW1pbmF0ZWQsIHNldCBmaXhQLT5meF9kb25lLgotICAgKi8KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpkZXN0ID0gIGZpeFAgLT4gZnhfZnJhZyAtPiBmcl9saXRlcmFsICsgZml4UCAtPiBmeF93aGVyZTsKLSAgaW50IG92ZXJmbG93OwotCi0gIHN3aXRjaCAoZml4UCAtPiBmeF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9SRUxMT05HWDoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZGVzdCwgKHZhbHVlVCkgdmFsLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NUFBDUjoKLSAgICAgIHZhbCA+Pj0gMjsKLSAgICAgIHZhbCArPSAxOwkgIC8qIFRhcmdldCBhZGRyZXNzIGNvbXB1dGVkIGZyb20gaW5zdCBzdGFydCAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChkZXN0LCAodmFsdWVUKSB2YWwsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01QUENSMTVXOgotICAgICAgb3ZlcmZsb3cgPSAodmFsIDwgLTY1NTM2TCkgfHwgKHZhbCA+IDY1NTMyTCk7Ci0gICAgICBpZiAob3ZlcmZsb3cpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQIC0+IGZ4X2ZpbGUsIGZpeFAgLT4gZnhfbGluZSwKLQkJCV8oIlBDIG9mZnNldCAweCVseCBvdXRzaWRlIHJhbmdlIDB4JWx4LTB4JWx4IiksCi0JCQl2YWwsIC02NTUzNkwsIDY1NTMyTCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHZhbCA+Pj0gMjsKLQkgICpkZXN0KysgPSB2YWwgJiAweEZGOwotCSAgdmFsID4+PSA4OwotCSAgKmRlc3QgPSAoKmRlc3QgJiAweDgwKSB8ICh2YWwgJiAweDdGKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfQUJTOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChkZXN0LCAodmFsdWVUKSB2YWwsIGZpeFAgLT4gZnhfc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZSBpbiBmaXh1cCIpLCBmaXhQIC0+IGZ4X3JfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuCi0KLSAgIEZvciB0aGUgVEljODAsIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIDMyIGJpdCBvcGNvZGUgY29udGFpbmluZwotICAgdGhlIFBDIHJlbGF0aXZlIGZpZWxkLiAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gKGZpeFAgLT4gZnhfZnJhZyAtPiBmcl9hZGRyZXNzICsgZml4UCAtPiBmeF93aGVyZSkgOwotfQotCi0vKgotICogQ2FsbGVkIGFmdGVyIHJlbGF4KCkgaXMgZmluaXNoZWQuCi0gKiBJbjoJQWRkcmVzcyBvZiBmcmFnLgotICoJZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAqCWZyX3N1YnR5cGUgaXMgd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLgotICoKLSAqIE91dDoJQW55IGZpeFNzIGFuZCBjb25zdGFudHMgYXJlIHNldCB1cC4KLSAqCUNhbGxlciB3aWxsIHR1cm4gZnJhZyBpbnRvIGEgIi5zcGFjZSAwIi4KLSAqLwotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBpbnRlcm5hbF9lcnJvciAoXygibWRfY29udmVydF9mcmFnKCkgbm90IGltcGxlbWVudGVkIHlldCIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLQwKLS8qQVJHU1VTRUQqLwotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChpZ25vcmUpCi0gICAgIHN5bWJvbFMgKmlnbm9yZTsKLXsKLX0KLQotI2lmIGRlZmluZWQgT0JKX0NPRkYKLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gKGZpeFAgLT4gZnhfcl90eXBlKTsKLX0KLQotI2VuZGlmCS8qIE9CSl9DT0ZGICovCi0KLS8qIGVuZCBvZiB0Yy10aWM4MC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzgwLmggYi9nYXMvY29uZmlnL3RjLXRpYzgwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZmYyNDkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXRpYzgwLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19USUM4MAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBUQVJHRVRfQVJDSAliZmRfYXJjaF90aWM4MAotI2RlZmluZSBUQVJHRVRfRk9STUFUCSJjb2ZmLXRpYzgwIgotI2RlZmluZSBCRkRfQVJDSAlUQVJHRVRfQVJDSAotCi0vKiBXZSBuZWVkIHRoZSBleHRyYSBmaWVsZCBpbiB0aGUgZml4dXAgc3RydWN0IHRvIHB1dCB0aGUgcmVsb2NhdGlvbiBpbi4gKi8KLQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotCi0vKiBEZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIGFzIHRoZSBhcHByb3ByaWF0ZSBzdGFuZGFyZCBiaWcgZW5kaWFuIG9yCi0gICBsaXR0bGUgZW5kaWFuIGZ1bmN0aW9uLiAgU2hvdWxkIHdlIHNvbWVkYXkgc3VwcG9ydCBlbmRpYW5uZXNzIGFzIGEKLSAgIHJ1bnRpbWUgZGVjaXNpb24sIHRoaXMgd2lsbCBuZWVkIHRvIGNoYW5nZS4gKi8KLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0vKiBEZWZpbmUgYXdheSB0aGUgY2FsbCB0byBtZF9vcGVyYW5kIGluIHRoZSBleHByZXNzaW9uIHBhcnNpbmcgY29kZS4KLSAgIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBleHByZXNzaW9uIHBhcnNlciBjYW4ndCBwYXJzZSB0aGUgaW5wdXQKLSAgIGFuZCBnaXZlcyB0aGUgYXNzZW1ibGVyIGJhY2tlbmQgYSBjaGFuY2UgdG8gZGVhbCB3aXRoIGl0IGluc3RlYWQuICovCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jaWZkZWYgT0JKX0NPRkYKLQotLyogQ09GRiBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCi0KLSNkZWZpbmUgQ09GRl9NQUdJQwlUSUM4MF9BUkNIX01BR0lDCi0KLS8qIFdoZXRoZXIgYSByZWxvYyBzaG91bGQgYmUgb3V0cHV0LiAgKi8KLQotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhmaXhwKSAoKGZpeHApIC0+IGZ4X2FkZHN5ICE9IE5VTEwpCi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLQotZXh0ZXJuIHNob3J0IHRjX2NvZmZfZml4MnJ0eXBlICgpOwotCi0jZW5kaWYJLyogT0JKX0NPRkYgKi8KLQotLyogZW5kIG9mIHRjLXRpYzgwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdjg1MC5jIGIvZ2FzL2NvbmZpZy90Yy12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MzA1NGQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDgyICswLDAgQEAKLS8qIHRjLXY4NTAuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE5FQyBWODUwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIKLQotI2RlZmluZSBBUkVBX1pEQSAwCi0jZGVmaW5lIEFSRUFfU0RBIDEKLSNkZWZpbmUgQVJFQV9UREEgMgotCi0vKiBzaWduLWV4dGVuZCBhIDE2LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDE2KHgpCSgoKCh4KSAmIDB4ZmZmZikgXiAofiAweDdmZmYpKSArIDB4ODAwMCkKLQotLyogVGVtcG9yYXJpbHkgaG9sZHMgdGhlIHJlbG9jIGluIGEgY29ucyBleHByZXNzaW9uLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgaG9sZF9jb25zX3JlbG9jOwotCi0vKiBTZXQgdG8gVFJVRSBpZiB3ZSB3YW50IHRvIGJlIHBlZGFudGljIGFib3V0IHNpZ25lZCBvdmVyZmxvd3MuICAqLwotc3RhdGljIGJvb2xlYW4gd2Fybl9zaWduZWRfb3ZlcmZsb3dzICAgPSBGQUxTRTsKLXN0YXRpYyBib29sZWFuIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzID0gRkFMU0U7Ci0KLS8qIEluZGljYXRlcyB0aGUgdGFyZ2V0IEJGRCBtYWNoaW5lIG51bWJlci4gICovCi1zdGF0aWMgaW50ICAgICBtYWNoaW5lID0gLTE7Ci0KLS8qIEluZGljYXRlcyB0aGUgdGFyZ2V0IHByb2Nlc3NvcihzKSBmb3IgdGhlIGFzc2VtYmxlLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQJcHJvY2Vzc29yX21hc2sgPSAtMTsKLQotDAotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHJlZ19uYW1lCi17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lOwotICBpbnQgICAgICAgICAgdmFsdWU7Ci19OwotCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIC8qIENvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKi8KLSAgezB4ZmYsICAgICAtMHgxMDAsICAgIDIsIDF9LAotICB7MHgxZmZmZmYsIC0weDIwMDAwMCwgNiwgMH0sCi0gIC8qIFVuY29uZGl0aW9uYWwgYnJhbmNoZXMuICAqLwotICB7MHhmZiwgICAgIC0weDEwMCwgICAgMiwgM30sCi0gIHsweDFmZmZmZiwgLTB4MjAwMDAwLCA0LCAwfSwKLX07Ci0KLQotc3RhdGljIHNlZ1Qgc2RhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB0ZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHpkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1Qgc2Jzc19zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHRic3Nfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB6YnNzX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1Qgcm9zZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHJvemRhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCBzY29tbW9uX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgdGNvbW1vbl9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHpjb21tb25fc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCBjYWxsX3RhYmxlX2RhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCBjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiA9IE5VTEw7Ci0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3Qgdjg1MF9maXh1cAotewotICBleHByZXNzaW9uUyAgICAgICAgICAgICAgZXhwOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotc3RydWN0IHY4NTBfZml4dXAgZml4dXBzIFtNQVhfSU5TTl9GSVhVUFNdOwotc3RhdGljIGludCBmYzsKLQotDAotdm9pZAotdjg1MF9zZGF0YSAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChzZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfdGRhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAodGRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfemRhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoemRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfc2JzcyAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChzYnNzX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3Ric3MgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAodGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF96YnNzIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHpic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfcm9zZGF0YSAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChyb3NkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3JvemRhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAocm96ZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9jYWxsX3RhYmxlX2RhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX2NhbGxfdGFibGVfdGV4dCAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfYnNzIChpbnQgaWdub3JlKQotewotICByZWdpc3RlciBpbnQgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKLSAgIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX29mZnNldCAoaW50IGlnbm9yZSkKLXsKLSAgaW50IHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgCi0gIHRlbXAgLT0gZnJhZ19ub3dfZml4KCk7Ci0gIAotICBpZiAodGVtcCA+IDApCi0gICAgKHZvaWQpIGZyYWdfbW9yZSAodGVtcCk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBDb3BpZWQgZnJvbSBvYmpfZWxmX2NvbW1vbigpIGluIGdhcy9jb25maWcvb2JqLWVsZi5jICovCi1zdGF0aWMgdm9pZAotdjg1MF9jb21tIChhcmVhKQotICAgICBpbnQgYXJlYTsKLXsKLSAgY2hhciAqICAgIG5hbWU7Ci0gIGNoYXIgICAgICBjOwotICBjaGFyICogICAgcDsKLSAgaW50ICAgICAgIHRlbXA7Ci0gIGludCAgICAgICBzaXplOwotICBzeW1ib2xTICogc3ltYm9sUDsKLSAgaW50ICAgICAgIGhhdmVfYWxpZ247Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpbnB1dF9saW5lX3BvaW50ZXIgKys7CQkvKiBza2lwICcsJyAqLwotICAKLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8IDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBzaXplID0gdGVtcDsKLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSBzaXplKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBhc193YXJuIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iKSwKLQkJICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemUpOwotCX0KLSAgICB9Ci0gIAotICBrbm93IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApID09ICYgemVyb19hZGRyZXNzX2ZyYWcpOwotICAKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGhhdmVfYWxpZ24gPSAwOwotICBlbHNlCi0gICAgewotICAgICAgaGF2ZV9hbGlnbiA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIAotICBpZiAoISBoYXZlX2FsaWduIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotICAgIHsKLSAgICAgIGlmICghIGhhdmVfYWxpZ24pCi0JdGVtcCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgCi0JICBpZiAodGVtcCA8IDApCi0JICAgIHsKLQkgICAgICB0ZW1wID0gMDsKLQkgICAgICBhc193YXJuIChfKCJDb21tb24gYWxpZ25tZW50IG5lZ2F0aXZlOyAwIGFzc3VtZWQiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsKQotCXsKLQkgIHNlZ1QgICBvbGRfc2VjOwotCSAgaW50ICAgIG9sZF9zdWJzZWM7Ci0JICBjaGFyICogcGZyYWc7Ci0JICBpbnQgICAgYWxpZ247Ci0JICBmbGFnd29yZAlhcHBsaWNhYmxlOwotCi0JICBvbGRfc2VjID0gbm93X3NlZzsKLQkgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICAgICAgCi0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkJICAKLQkgIGFwcGxpY2FibGUgJj0gU0VDX0FMTE9DOwotCSAgCi0JICBzd2l0Y2ggKGFyZWEpCi0JICAgIHsKLQkgICAgY2FzZSBBUkVBX1NEQToKLQkgICAgICBpZiAoc2Jzc19zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICBzYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnNic3MiLCAwKTsKLQkgICAgICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2Jzc19zZWN0aW9uLCBhcHBsaWNhYmxlKTsKLQkgICAgICAKLQkJICBzZWdfaW5mbyAoc2Jzc19zZWN0aW9uKS0+YnNzID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgCi0JICAgIGNhc2UgQVJFQV9aREE6Ci0JICAgICAgaWYgKHpic3Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgemJzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi56YnNzIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSk7Ci0JICAgICAgCi0JCSAgc2VnX2luZm8gKHpic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgIAotCSAgICBjYXNlIEFSRUFfVERBOgotCSAgICAgIGlmICh0YnNzX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIHRic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudGJzcyIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0YnNzX3NlY3Rpb24sIGFwcGxpY2FibGUpOwotCQkgIAotCQkgIHNlZ19pbmZvICh0YnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHRlbXApCi0JICAgIHsKLQkgICAgICAvKiBjb252ZXJ0IHRvIGEgcG93ZXIgb2YgMiBhbGlnbm1lbnQgKi8KLQkgICAgICBmb3IgKGFsaWduID0gMDsgKHRlbXAgJiAxKSA9PSAwOyB0ZW1wID4+PSAxLCArK2FsaWduKQotCQk7Ci0JICAgICAgCi0JICAgICAgaWYgKHRlbXAgIT0gMSkKLQkJewotCQkgIGFzX2JhZCAoXygiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYWxpZ24gPSAwOwotCSAgCi0JICBzd2l0Y2ggKGFyZWEpCi0JICAgIHsKLQkgICAgY2FzZSBBUkVBX1NEQToKLQkgICAgICByZWNvcmRfYWxpZ25tZW50IChzYnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgICAgICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLQkgICAgICBzdWJzZWdfc2V0IChzYnNzX3NlY3Rpb24sIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQVJFQV9aREE6Ci0JICAgICAgcmVjb3JkX2FsaWdubWVudCAoemJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICAgICAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0JICAgICAgc3Vic2VnX3NldCAoemJzc19zZWN0aW9uLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFSRUFfVERBOgotCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHRic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgICAgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotCSAgICAgIHN1YnNlZ19zZXQgKHRic3Nfc2VjdGlvbiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JICAKLQkgIGlmIChhbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCi0JICBzd2l0Y2ggKGFyZWEpCi0JICAgIHsKLQkgICAgY2FzZSBBUkVBX1NEQToKLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gc2Jzc19zZWN0aW9uKQotCQlzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQVJFQV9aREE6Ci0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHpic3Nfc2VjdGlvbikKLQkJc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFSRUFfVERBOgotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB0YnNzX3NlY3Rpb24pCi0JCXN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwKLQkJCSAgICAob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7Ci0JICAqcGZyYWcgPSAwOwotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0JICAKLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNic3Nfc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJFQV9aREE6Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgemJzc19zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCB0YnNzX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQkgICAgCi0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQlhbGxvY2F0ZV9jb21tb246Ci0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICAKLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIGlmIChzY29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7Ci0JCSAgCi0JCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JCSAgc2NvbW1vbl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5zY29tbW9uIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNjb21tb25fc2VjdGlvbiwgYXBwbGljYWJsZQotCQkgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0RBVEEKLQkJCXwgU0VDX0hBU19DT05URU5UUykgfCBTRUNfSVNfQ09NTU9OKTsKLQkJfQotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNjb21tb25fc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJFQV9aREE6Ci0JICAgICAgaWYgKHpjb21tb25fc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQkJICAKLQkJICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkJICAKLQkJICB6Y29tbW9uX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnpjb21tb24iLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgemNvbW1vbl9zZWN0aW9uLCBhcHBsaWNhYmxlCi0JCSAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfREFUQQotCQkJfCBTRUNfSEFTX0NPTlRFTlRTKSB8IFNFQ19JU19DT01NT04pOwotCQl9Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgemNvbW1vbl9zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBpZiAodGNvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZAlhcHBsaWNhYmxlOwotCQkgIAotCQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCQkgIAotCQkgIHRjb21tb25fc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudGNvbW1vbiIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0Y29tbW9uX3NlY3Rpb24sIGFwcGxpY2FibGUKLQkJICAgICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19EQVRBCi0JCQl8IFNFQ19IQVNfQ09OVEVOVFMpIHwgU0VDX0lTX0NPTU1PTik7Ci0JCX0KLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCB0Y29tbW9uX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQotCXsKLQkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCSAgICA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZAotc2V0X21hY2hpbmUgKGludCBudW1iZXIpCi17Ci0gIG1hY2hpbmUgPSBudW1iZXI7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoaW5lKTsKLQotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgMDogcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZTogIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOyBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsic2RhdGEiLCAgIHY4NTBfc2RhdGEsICAgMH0sCi0gIHsidGRhdGEiLCAgIHY4NTBfdGRhdGEsICAgMH0sCi0gIHsiemRhdGEiLCAgIHY4NTBfemRhdGEsICAgMH0sCi0gIHsic2JzcyIsICAgIHY4NTBfc2JzcywgICAgMH0sCi0gIHsidGJzcyIsICAgIHY4NTBfdGJzcywgICAgMH0sCi0gIHsiemJzcyIsICAgIHY4NTBfemJzcywgICAgMH0sCi0gIHsicm9zZGF0YSIsIHY4NTBfcm9zZGF0YSwgMH0sCi0gIHsicm96ZGF0YSIsIHY4NTBfcm96ZGF0YSwgMH0sCi0gIHsiYnNzIiwgICAgIHY4NTBfYnNzLCAgICAgMH0sCi0gIHsib2Zmc2V0IiwgIHY4NTBfb2Zmc2V0LCAgMH0sCi0gIHsid29yZCIsICAgIGNvbnMsICAgICAgICAgNH0sCi0gIHsiemNvbW0iLCAgIHY4NTBfY29tbSwgICAgQVJFQV9aREF9LAotICB7InNjb21tIiwgICB2ODUwX2NvbW0sICAgIEFSRUFfU0RBfSwKLSAgeyJ0Y29tbSIsICAgdjg1MF9jb21tLCAgICBBUkVBX1REQX0sCi0gIHsidjg1MCIsICAgIHNldF9tYWNoaW5lLCAgMH0sCi0gIHsiY2FsbF90YWJsZV9kYXRhIiwgdjg1MF9jYWxsX3RhYmxlX2RhdGEsIDB9LAotICB7ImNhbGxfdGFibGVfdGV4dCIsIHY4NTBfY2FsbF90YWJsZV90ZXh0LCAwfSwKLSAgeyJ2ODUwZSIsICAgICAgICAgICBzZXRfbWFjaGluZSwgICAgICAgICAgYmZkX21hY2hfdjg1MGV9LAotICB7InY4NTBlYSIsICAgICAgICAgIHNldF9tYWNoaW5lLCAgICAgICAgICBiZmRfbWFjaF92ODUwZWF9LAotICB7IE5VTEwsICAgICBOVUxMLCAgICAgICAgIDB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqdjg1MF9oYXNoOwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiZXAiLCAgMzAgfSwJCS8qIGVwIC0gZWxlbWVudCBwdHIgKi8KLSAgeyAiZ3AiLCAgIDQgfSwJCS8qIGdwIC0gZ2xvYmFsIHB0ciAqLwotICB7ICJocCIsICAgMiB9LAkJLyogaHAgLSBoYW5kbGVyIHN0YWNrIHB0ciAqLwotICB7ICJscCIsICAzMSB9LAkJLyogbHAgLSBsaW5rIHB0ciAqLwotICB7ICJyMCIsICAgMCB9LAotICB7ICJyMSIsICAgMSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJyMTYiLCAxNiB9LAotICB7ICJyMTciLCAxNyB9LAotICB7ICJyMTgiLCAxOCB9LAotICB7ICJyMTkiLCAxOSB9LAotICB7ICJyMiIsICAgMiB9LAotICB7ICJyMjAiLCAyMCB9LAotICB7ICJyMjEiLCAyMSB9LAotICB7ICJyMjIiLCAyMiB9LAotICB7ICJyMjMiLCAyMyB9LAotICB7ICJyMjQiLCAyNCB9LAotICB7ICJyMjUiLCAyNSB9LAotICB7ICJyMjYiLCAyNiB9LAotICB7ICJyMjciLCAyNyB9LAotICB7ICJyMjgiLCAyOCB9LAotICB7ICJyMjkiLCAyOSB9LAotICB7ICJyMyIsICAgMyB9LAotICB7ICJyMzAiLCAzMCB9LAotICB7ICJyMzEiLCAzMSB9LAotICB7ICJyNCIsICAgNCB9LAotICB7ICJyNSIsICAgNSB9LAotICB7ICJyNiIsICAgNiB9LAotICB7ICJyNyIsICAgNyB9LAotICB7ICJyOCIsICAgOCB9LAotICB7ICJyOSIsICAgOSB9LAotICB7ICJzcCIsICAgMyB9LAkJLyogc3AgLSBzdGFjayBwdHIgKi8KLSAgeyAidHAiLCAgIDUgfSwJCS8qIHRwIC0gdGV4dCBwdHIgKi8KLSAgeyAiemVybyIsIDAgfSwKLX07Ci0jZGVmaW5lIFJFR19OQU1FX0NOVAkoc2l6ZW9mIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgc3lzdGVtX3JlZ2lzdGVyc1tdID0gCi17Ci0gIHsgImN0YnAiLCAgMjAgfSwKLSAgeyAiY3RwYyIsICAxNiB9LAotICB7ICJjdHBzdyIsIDE3IH0sCi0gIHsgImRicGMiLCAgMTggfSwKLSAgeyAiZGJwc3ciLCAxOSB9LAotICB7ICJlY3IiLCAgICA0IH0sCi0gIHsgImVpcGMiLCAgIDAgfSwKLSAgeyAiZWlwc3ciLCAgMSB9LAotICB7ICJmZXBjIiwgICAyIH0sCi0gIHsgImZlcHN3IiwgIDMgfSwKLSAgeyAicHN3IiwgICAgNSB9LAotfTsKLSNkZWZpbmUgU1lTUkVHX05BTUVfQ05UCShzaXplb2YgKHN5c3RlbV9yZWdpc3RlcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHN5c3RlbV9saXN0X3JlZ2lzdGVyc1tdID0KLXsKLSAgeyJQUyIsICAgICAgNSB9LAotICB7IlNSIiwgICAgICAwICsgMX0KLX07Ci0jZGVmaW5lIFNZU1JFR0xJU1RfTkFNRV9DTlQJKHNpemVvZiAoc3lzdGVtX2xpc3RfcmVnaXN0ZXJzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBjY19uYW1lc1tdID0KLXsKLSAgeyAiYyIsICAweDEgfSwKLSAgeyAiZSIsICAweDIgfSwKLSAgeyAiZ2UiLCAweGUgfSwKLSAgeyAiZ3QiLCAweGYgfSwKLSAgeyAiaCIsICAweGIgfSwKLSAgeyAibCIsICAweDEgfSwKLSAgeyAibGUiLCAweDcgfSwKLSAgeyAibHQiLCAweDYgfSwKLSAgeyAibiIsICAweDQgfSwKLSAgeyAibmMiLCAweDkgfSwKLSAgeyAibmUiLCAweGEgfSwKLSAgeyAibmgiLCAweDMgfSwKLSAgeyAibmwiLCAweDkgfSwKLSAgeyAibnMiLCAweGMgfSwKLSAgeyAibnYiLCAweDggfSwKLSAgeyAibnoiLCAweGEgfSwKLSAgeyAicCIsICAweGMgfSwKLSAgeyAicyIsICAweDQgfSwKLSAgeyAic2EiLCAweGQgfSwKLSAgeyAidCIsICAweDUgfSwKLSAgeyAidiIsICAweDAgfSwKLSAgeyAieiIsICAweDIgfSwKLX07Ci0jZGVmaW5lIENDX05BTUVfQ05UCShzaXplb2YgKGNjX25hbWVzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBnaXZlbiByZWdpc3RlciB0YWJsZQotICAgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSwgYWNjZXB0X251bWJlcnMpCi0gICAgIGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqIHJlZ3M7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgICBuYW1lOwotICAgICBib29sZWFuICAgICAgICAgICAgICAgICBhY2NlcHRfbnVtYmVyczsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotICBzeW1ib2xTICogc3ltYm9sUDsKLQotICAvKiBJZiB0aGUgcmVnaXN0ZXIgbmFtZSBpcyBhIHN5bWJvbCwgdGhlbiBldmFsdWF0ZSBpdC4gICovCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGFuIGFsaWFzIGZvciBhbm90aGVyIG5hbWUgdGhlbiB1c2UgdGhhdC4KLQkgSWYgdGhlIHN5bWJvbCBpcyBhbiBhbGlhcyBmb3IgYSBudW1iZXIsIHRoZW4gcmV0dXJuIHRoZSBudW1iZXIuICAqLwotICAgICAgaWYgKHN5bWJvbF9lcXVhdGVkX3AgKHN5bWJvbFApKQotCXsKLQkgIG5hbWUgPSBTX0dFVF9OQU1FIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFApLT5YX2FkZF9zeW1ib2wpOwotCX0KLSAgICAgIGVsc2UgaWYgKGFjY2VwdF9udW1iZXJzKQotCXsKLQkgIGludCByZWcgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAKLQkgIGlmIChyZWcgPj0gMCAmJiByZWcgPD0gMzEpCi0JICAgIHJldHVybiByZWc7Ci0JfQotCi0gICAgICAvKiBPdGhlcndpc2UgZHJvcCB0aHJvdWdoIGFuZCB0cnkgcGFyc2luZyBuYW1lIG5vcm1hbGx5LiAgKi8KLSAgICB9Ci0gIAotICBsb3cgPSAwOwotICBoaWdoID0gcmVnY291bnQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZQotCXJldHVybiByZWdzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGludCAgICByZWdfbnVtYmVyOwotICBjaGFyICogbmFtZTsKLSAgY2hhciAqIHN0YXJ0OwotICBjaGFyICAgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHByZV9kZWZpbmVkX3JlZ2lzdGVycywgUkVHX05BTUVfQ05ULAotCQkJCW5hbWUsIEZBTFNFKTsKLQotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wICAgICAgICAgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgID0gTlVMTDsKLSAgICAgIAotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKLSAgICAgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiBzeXN0ZW1fcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiAgSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICogICAgICBleHByZXNzaW9uUCBwb2ludHMgdG8gYW4gZXhwcmVzc2lvbiBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGluLgotICogICAgICBhY2NlcHRfbnVtYmVycyBpcyB0cnVlIGlmZiBudW1lcmljYWwgcmVnaXN0ZXIgbmFtZXMgbWF5IGJlIHVzZWQuCi0gKiAgICAgIGFjY2VwdF9saXN0X25hbWVzIGlzIHRydWUgaWZmIHRoZSBzcGVjaWFsIG5hbWVzIFBTIGFuZCBTUiBtYXkgYmUgCi0gKiAgICAgIGFjY2VwdGVkLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUyBzdHJ1Y3R1cmUgaW4gZXhwcmVzc2lvblAuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotc3lzdGVtX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QLCBhY2NlcHRfbnVtYmVycywgYWNjZXB0X2xpc3RfbmFtZXMpCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci0gICAgIGJvb2xlYW4gICAgICAgYWNjZXB0X251bWJlcnM7Ci0gICAgIGJvb2xlYW4gICAgICAgYWNjZXB0X2xpc3RfbmFtZXM7Ci17Ci0gIGludCAgICByZWdfbnVtYmVyOwotICBjaGFyICogbmFtZTsKLSAgY2hhciAqIHN0YXJ0OwotICBjaGFyICAgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChzeXN0ZW1fcmVnaXN0ZXJzLCBTWVNSRUdfTkFNRV9DTlQsIG5hbWUsCi0JCQkJYWNjZXB0X251bWJlcnMpOwotCi0gICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gIAotICBpZiAocmVnX251bWJlciA8IDAKLSAgICAgICYmIGFjY2VwdF9udW1iZXJzKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciAgID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotCi0gICAgICBpZiAoaXNkaWdpdCAoKiBpbnB1dF9saW5lX3BvaW50ZXIpKQotCXsKLQkgIHJlZ19udW1iZXIgPSBzdHJ0b2wgKGlucHV0X2xpbmVfcG9pbnRlciwgJiBpbnB1dF9saW5lX3BvaW50ZXIsIDEwKTsKLQotCSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHJlZ2lzdGVyIG51bWJlciBpcyBhbGxvd2FibGUuICovCi0JICBpZiAoICAgcmVnX251bWJlciA8IDAKLQkJIHx8IHJlZ19udW1iZXIgPiA1Ci0JCSAmJiByZWdfbnVtYmVyIDwgMTYKLQkJIHx8IHJlZ19udW1iZXIgPiAyMAotCQkgKQotCSAgICB7Ci0JICAgICAgcmVnX251bWJlciA9IC0xOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYWNjZXB0X2xpc3RfbmFtZXMpCi0JewotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoc3lzdGVtX2xpc3RfcmVnaXN0ZXJzLAotCQkJCQlTWVNSRUdMSVNUX05BTUVfQ05ULCBuYW1lLCBGQUxTRSk7Ci0KLQkgICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0JfQotICAgIH0KLSAgCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wICAgICAgICAgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgID0gTlVMTDsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKLSAgICAgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiBjY19uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotY2NfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGludCAgICByZWdfbnVtYmVyOwotICBjaGFyICogbmFtZTsKLSAgY2hhciAqIHN0YXJ0OwotICBjaGFyICAgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChjY19uYW1lcywgQ0NfTkFNRV9DTlQsIG5hbWUsIEZBTFNFKTsKLQotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAKLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgICAgICAgICA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCAgPSBOVUxMOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwotICAgICAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc2tpcF93aGl0ZV9zcGFjZSAodm9pZCkKLXsKLSAgd2hpbGUgKCAgICogaW5wdXRfbGluZV9wb2ludGVyID09ICcgJwotCSB8fCAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnXHQnKQotICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotLyogU3VtbWFyeSBvZiBwYXJzZV9yZWdpc3Rlcl9saXN0ICgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgIHBvaW50cyB0byAxc3QgY2hhciBvZiBhIGxpc3Qgb2YgcmVnaXN0ZXJzLgotICogICAgIGluc24gICAgICAgICAgICAgICAgaXMgdGhlIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBpbnN0cnVjdGlvbi4KLSAqICAgICBvcGVyYW5kICAgICAgICAgICAgIGlzIHRoZSBvcGVyYW5kIGJlaW5nIGluc2VydGVkLgotICoKLSAqIG91dDogTlVMTCBpZiB0aGUgcGFyc2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIGEKLSAqICAgICAgcG9pbnRlciB0byBhbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLiAgSWYgdGhlIHBhcnNlCi0gKiAgICAgIGNvbXBsZXRlcyB0aGUgY29ycmVjdCBiaXQgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbgotICogICAgICB3aWxsIGJlIGZpbGxlZCBpbi4KLSAqCi0gKiBQYXJzZXMgcmVnaXN0ZXIgbGlzdHMgd2l0aCB0aGUgc3ludGF4OgotICoKLSAqICAgeyByWCB9Ci0gKiAgIHsgclgsIHJZIH0KLSAqICAgeyByWCAtIHJZIH0KLSAqICAgeyByWCAtIHJZLCByWiB9Ci0gKiAgIGV0YwotICoKLSAqIGFuZCBhbHNvIHBhcnNlcyBjb25zdGFudCBlcHhyZXNzaW9ucyB3aG9lcyBiaXRzIGluZGljYXRlIHRoZQotICogcmVnaXN0ZXJzIGluIHRoZSBsaXN0cy4gIFRoZSBMU0IgaW4gdGhlIGV4cHJlc3Npb24gcmVmZXJzIHRvCi0gKiB0aGUgbG93ZXN0IG51bWJlcmVkIHBlcm1pc3NhYmxlIHJlZ2lzdGVyIGluIHRoZSByZWdpc3RlciBsaXN0LAotICogYW5kIHNvIG9uIHVwd2FyZHMuICBTeXN0ZW0gcmVnaXN0ZXJzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHZlcnkKLSAqIGhpZ2ggbnVtYmVycy4KLSAqIAotICovCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9yZWdpc3Rlcl9saXN0Ci0oCi0gIHVuc2lnbmVkIGxvbmcgKiAgICAgICAgICAgICBpbnNuLAotICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZAotKQotewotICBzdGF0aWMgaW50ICB0eXBlMV9yZWdzWyAzMiBdID0geyAzMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotICBzdGF0aWMgaW50ICB0eXBlMl9yZWdzWyAzMiBdID0geyAxOSwgMTgsIDE3LCAxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMzAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotICBzdGF0aWMgaW50ICB0eXBlM19yZWdzWyAzMiBdID0geyAgMywgIDIsICAxLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTQsIDE1LCAxMywgMTIsICA3LCAgNiwgIDUsICA0LCAxMSwgMTAsICA5LCAgOCB9OwotICBpbnQgKiAgICAgICByZWdzOwotICBleHByZXNzaW9uUyBleHA7Ci0KLQotICAvKiBTZWxlY3QgYSByZWdpc3RlciBhcnJheSB0byBwYXJzZS4gKi8KLSAgc3dpdGNoIChvcGVyYW5kLT5zaGlmdCkKLSAgICB7Ci0gICAgY2FzZSAweGZmZTAwMDAxOiByZWdzID0gdHlwZTFfcmVnczsgYnJlYWs7Ci0gICAgY2FzZSAweGZmZjgwMDBmOiByZWdzID0gdHlwZTJfcmVnczsgYnJlYWs7Ci0gICAgY2FzZSAweGZmZjgwMDFmOiByZWdzID0gdHlwZTNfcmVnczsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIiksIG9wZXJhbmQtPnNoaWZ0KTsKLSAgICAgIHJldHVybiBfKCJpbnRlcm5hbCBmYWlsdXJlIGluIHBhcnNlX3JlZ2lzdGVyX2xpc3QiKTsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZV9zcGFjZSAoKTsKLQotICAvKiBJZiB0aGUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCBhIGN1cmx5IGJyYWNlIGl0IGlzIGEgcmVnaXN0ZXIgbGlzdC4KLSAgICAgT3RoZXJ3aXNlIGl0IGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgd2hvZXMgYml0cyBpbmRpY2F0ZSB3aGljaAotICAgICByZWdpc3RlcnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0LiAgKi8KLSAgCi0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciAhPSAneycpCi0gICAgewotICAgICAgaW50IGJpdHM7Ci0gICAgICBpbnQgcmVnOwotICAgICAgaW50IGk7Ci0JCQotICAgICAgZXhwcmVzc2lvbiAoJiBleHApOwotICAgICAgCi0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQlyZXR1cm4gXygiY29uc3RhbnQgZXhwcmVzc2lvbiBvciByZWdpc3RlciBsaXN0IGV4cGVjdGVkIik7Ci0KLSAgICAgIGlmIChyZWdzID09IHR5cGUxX3JlZ3MpCi0JewotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAweEZGRkZGMDAwKQotCSAgICByZXR1cm4gXygiaGlnaCBiaXRzIHNldCBpbiByZWdpc3RlciBsaXN0IGV4cHJlc3Npb24iKTsKLQkgIAotCSAgZm9yIChyZWcgPSAyMDsgcmVnIDwgMzI7IHJlZyArKykKLQkgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAocmVnIC0gMjApKSkKLQkgICAgICB7Ci0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkgIGlmIChyZWdzW2ldID09IHJlZykKLQkJICAgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkgICAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAocmVncyA9PSB0eXBlMl9yZWdzKQotCXsKLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgMHhGRkZFMDAwMCkKLQkgICAgcmV0dXJuIF8oImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIik7Ci0JICAKLQkgIGZvciAocmVnID0gMTsgcmVnIDwgMTY7IHJlZyArKykKLQkgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAocmVnIC0gMSkpKQotCSAgICAgIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCSAgaWYgKHJlZ3NbaV0gPT0gcmVnKQotCQkgICAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCSAgICAgIH0KLQotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAxNSkpCi0JICAgICogaW5zbiB8PSAoMSA8PCAzKTsKLQkgIAotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAxNikpCi0JICAgICogaW5zbiB8PSAoMSA8PCAxOSk7Ci0JfQotICAgICAgZWxzZSAvKiByZWdzID09IHR5cGUzX3JlZ3MgKi8KLQl7Ci0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmIDB4RkZGRTAwMDApCi0JICAgIHJldHVybiBfKCJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIpOwotCSAgCi0JICBmb3IgKHJlZyA9IDE2OyByZWcgPCAzMjsgcmVnICsrKQotCSAgICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IChyZWcgLSAxNikpKQotCSAgICAgIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCSAgaWYgKHJlZ3NbaV0gPT0gcmVnKQotCQkgICAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCSAgICAgIH0KLQotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAxNikpCi0JICAgICogaW5zbiB8PSAoMSA8PCAxOSk7Ci0JfQotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotCi0gIC8qIFBhcnNlIHRoZSByZWdpc3RlciBsaXN0IHVudGlsIGEgdGVybWluYXRvciAoY2xvc2luZyBjdXJseSBicmFjZSBvcgotICAgICBuZXctbGluZSkgaXMgZm91bmQuICAqLwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmIChyZWdpc3Rlcl9uYW1lICgmIGV4cCkpCi0JewotCSAgaW50ICBpOwotCSAgCi0JICAvKiBMb2NhdGUgdGhlIGdpdmVuIHJlZ2lzdGVyIGluIHRoZSBsaXN0LCBhbmQgaWYgaXQgaXMgdGhlcmUsCi0JICAgICBpbnNlcnQgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHJlZ3NbIGkgXSA9PSBleHAuWF9hZGRfbnVtYmVyKQotCQl7Ci0JCSAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGkgPT0gMzIpCi0JICAgIHsKLQkgICAgICByZXR1cm4gXygiaWxsZWdhbCByZWdpc3RlciBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzeXN0ZW1fcmVnaXN0ZXJfbmFtZSAoJiBleHAsIHRydWUsIHRydWUpKQotCXsKLQkgIGlmIChyZWdzID09IHR5cGUxX3JlZ3MpCi0JICAgIHsKLQkgICAgICByZXR1cm4gXygic3lzdGVtIHJlZ2lzdGVycyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChleHAuWF9hZGRfbnVtYmVyID09IDUpCi0JICAgIHsKLQkgICAgICBpZiAocmVncyA9PSB0eXBlMl9yZWdzKQotCQlyZXR1cm4gXygiUFNXIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JICAgICAgZWxzZQotCQkqIGluc24gfD0gMHg4OwotCSAgICB9Ci0JICBlbHNlIGlmIChleHAuWF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgKiBpbnNuIHw9IDB4ODAwMDA7Ci0JICBlbHNlCi0JICAgIHJldHVybiBfKCJIaWdoIHZhbHVlIHN5c3RlbSByZWdpc3RlcnMgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiKTsKLQl9Ci0gICAgICBlbHNlIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnfScpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLQl7Ci0JICAvKiBXZSBoYXZlIGVuY291bnRlcmVkIGEgcmFuZ2Ugb2YgcmVnaXN0ZXJzOiByWCAtIHJZICovCi0JICBpbnQgICAgICAgICBqOwotCSAgZXhwcmVzc2lvblMgZXhwMjsKLQotCSAgLyogU2tpcCB0aGUgZGFzaC4gICovCi0JICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgIC8qIEdldCB0aGUgc2Vjb25kIHJlZ2lzdGVyIGluIHRoZSByYW5nZS4gICovCi0JICBpZiAoISByZWdpc3Rlcl9uYW1lICgmIGV4cDIpKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIF8oInNlY29uZCByZWdpc3RlciBzaG91bGQgZm9sbG93IGRhc2ggaW4gcmVnaXN0ZXIgbGlzdCIpOwotCSAgICAgIGV4cDIuWF9hZGRfbnVtYmVyID0gZXhwLlhfYWRkX251bWJlcjsKLQkgICAgfQotCi0JICAvKiBBZGQgdGhlIHJlc3Qgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGUgcmFuZ2UuICAqLwotCSAgZm9yIChqID0gZXhwLlhfYWRkX251bWJlciArIDE7IGogPD0gZXhwMi5YX2FkZF9udW1iZXI7IGorKykKLQkgICAgewotCSAgICAgIGludCAgaTsKLQkgIAotCSAgICAgIC8qIExvY2F0ZSB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdGhlIGxpc3QsIGFuZCBpZiBpdCBpcyB0aGVyZSwKLQkJIGluc2VydCB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQl7Ci0JCSAgaWYgKHJlZ3NbIGkgXSA9PSBqKQotCQkgICAgewotCQkgICAgICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoaSA9PSAzMikKLQkJcmV0dXJuIF8oImlsbGVnYWwgcmVnaXN0ZXIgaW5jbHVkZWQgaW4gbGlzdCIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc2tpcF93aGl0ZV9zcGFjZSAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUNPTlNUIGNoYXIgKiBtZF9zaG9ydG9wdHMgPSAibToiOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgbWRfbG9uZ29wdHM7IAotCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqIHN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgVjg1MCBvcHRpb25zOlxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW13YXJuLXNpZ25lZC1vdmVyZmxvdyAgICBXYXJuIGlmIHNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXdhcm4tdW5zaWduZWQtb3ZlcmZsb3cgIFdhcm4gaWYgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvd1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW12ODUwICAgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW12ODUwZSAgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MGVhICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBlYVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW12ODUwYW55ICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyBnZW5lcmljLCBkZXNwaXRlIGFueSBwcm9jZXNzb3Igc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zXG4iKSk7Ci19Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCAgICBjOwotICAgICBjaGFyICogYXJnOwotewotICBpZiAoYyAhPSAnbScpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBjb21tYW5kIGxpbmUgb3B0aW9uOiAtJWMlc1xuIiksIGMsIGFyZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHN0cmNtcCAoYXJnLCAid2Fybi1zaWduZWQtb3ZlcmZsb3ciKSA9PSAwKQotICAgIHsKLSAgICAgIHdhcm5fc2lnbmVkX292ZXJmbG93cyA9IFRSVUU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIndhcm4tdW5zaWduZWQtb3ZlcmZsb3ciKSA9PSAwKQotICAgIHsKLSAgICAgIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzID0gVFJVRTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MCIpID09IDApCi0gICAgewotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwZSIpID09IDApCi0gICAgewotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX3Y4NTBlOwotICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTBlYSIpID09IDApCi0gICAgewotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX3Y4NTBlYTsKLSAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MGFueSIpID09IDApCi0gICAgewotICAgICAgbWFjaGluZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBUZWxsIHRoZSB3b3JsZCB0aGF0IHRoaXMgaXMgZm9yIGFueSB2ODUwIGNoaXAuICAqLwotICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOyAvKiBCdXQgc3VwcG9ydCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBleHRlbmRlZCB2ZXJzaW9ucy4gICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBjb21tYW5kIGxpbmUgb3B0aW9uOiAtJWMlc1xuIiksIGMsIGFyZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICogbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0cCwgc2l6ZXApCi0gIGludCAgICB0eXBlOwotICBjaGFyICogbGl0cDsKLSAgaW50ICogIHNpemVwOwotewotICBpbnQgICAgICAgICAgICBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqICAgICAgICAgdDsKLSAgaW50ICAgICAgICAgICAgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZXAgPSBwcmVjICogMjsKLQotICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLS8qIFZlcnkgZ3Jvc3MuICAqLwotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKiAgICAgIGFiZmQ7Ci0gIGFzZWN0aW9uICogc2VjOwotICBmcmFnUyAqICAgIGZyYWdQOwotewotICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOwotICAKLSAgLyogSW4gcmFuZ2UgY29uZGl0aW9uYWwgb3IgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCB8fCBmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfVU5VU0VEICsgKGludClmcmFnUC0+ZnJfb3Bjb2RlKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgIH0KLSAgLyogT3V0IG9mIHJhbmdlIGNvbmRpdGlvbmFsIGJyYW5jaC4gIEVtaXQgYSBicmFuY2ggYXJvdW5kIGEganVtcC4gICovCi0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gCi0JKHVuc2lnbmVkIGNoYXIgKikgKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbCk7Ci0KLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGJ1ZmZlclswXSBePSAweDA4OwotICAgICAgLyogTWFzayBvZmYgYWxsIHRoZSBkaXNwbGFjZW1lbnQgYml0cy4gICovCi0gICAgICBidWZmZXJbMF0gJj0gMHg4ZjsKLSAgICAgIGJ1ZmZlclsxXSAmPSAweDA3OwotICAgICAgLyogTm93IHNldCB0aGUgZGlzcGxhY2VtZW50IGJpdHMgc28gdGhhdCB3ZSBicmFuY2gKLQkgYXJvdW5kIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBidWZmZXJbMF0gfD0gMHgzMDsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUgZmluYWwKLQkgdGFyZ2V0LiAgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyICsgMiwgMHgwMDAwMDc4MCwgNCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19VTlVTRUQgKwotCSAgICAgICAoaW50KSBmcmFnUC0+ZnJfb3Bjb2RlICsgMSk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLSAgICB9Ci0gIC8qIE91dCBvZiByYW5nZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gIEVtaXQgYSBqdW1wLiAgKi8KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbCwgMHgwMDAwMDc4MCwgNCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1VOVVNFRCArCi0JICAgICAgIChpbnQpIGZyYWdQLT5mcl9vcGNvZGUgKyAxKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKiBzZWc7Ci0gICAgIHZhbHVlVCAgICAgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9uYW1lID0gIiI7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB2ODUwX29wY29kZSAqIG9wOwotICBmbGFnd29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhYmxlOwotCi0gIGlmIChzdHJuY21wIChUQVJHRVRfQ1BVLCAidjg1MGVhIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWFjaGluZSA9PSAtMSkKLQltYWNoaW5lID0gYmZkX21hY2hfdjg1MGVhOwotICAgICAgCi0gICAgICBpZiAocHJvY2Vzc29yX21hc2sgPT0gLTEpCi0JcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgInY4NTBlIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWFjaGluZSA9PSAtMSkKLQltYWNoaW5lICAgICAgICA9IGJmZF9tYWNoX3Y4NTBlOwotICAgICAgCi0gICAgICBpZiAocHJvY2Vzc29yX21hc2sgPT0gLTEpCi0JcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEU7Ci0gICAgfQotICBlbHNlCi0gIGlmIChzdHJuY21wIChUQVJHRVRfQ1BVLCAidjg1MCIsIDQpID09IDApCi0gICAgewotICAgICAgaWYgKG1hY2hpbmUgPT0gLTEpCi0JbWFjaGluZSAgICAgICAgPSAwOwotICAgICAgCi0gICAgICBpZiAocHJvY2Vzc29yX21hc2sgPT0gLTEpCi0JcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MDsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGFzX2JhZCAoXygiVW5hYmxlIHRvIGRldGVybWluZSBkZWZhdWx0IHRhcmdldCBwcm9jZXNzb3IgZnJvbSBzdHJpbmc6ICVzIiksIAotICAgICAgICAgICAgVEFSR0VUX0NQVSk7Ci0KLSAgdjg1MF9oYXNoID0gaGFzaF9uZXcoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBWODUwIGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICBvcCA9IHY4NTBfb3Bjb2RlczsKLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3AtPm5hbWUpKSAKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcC0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0ICh2ODUwX2hhc2gsIG9wLT5uYW1lLCAoY2hhciAqKSBvcCk7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIG1hY2hpbmUpOwotCi0gIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotICAKLSAgY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLmNhbGxfdGFibGVfZGF0YSIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUykpOwotICAKLSAgY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLmNhbGxfdGFibGVfdGV4dCIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgICB8IFNFQ19DT0RFKSk7Ci0gIAotICAvKiBSZXN0b3JlIHRleHQgc2VjdGlvbiBhcyB0aGUgY3VycmVudCBkZWZhdWx0LiAgKi8KLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1oYW5kbGVfY3RvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZCA9PSBOVUxMKQotICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ7Ci0KLSAgaWYgKCAgIG9wZXJhbmQtPmJpdHMgICE9IDYKLSAgICAgIHx8IG9wZXJhbmQtPnNoaWZ0ICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjdG9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IikpOwotICAgICAgcmV0dXJuIEJGRF9SRUxPQ182NDsgIC8qIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLSAgICB9Ci0gICAgICAKLSAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQ7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWhhbmRsZV9zZGFvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQ7Ci0gIGlmIChvcGVyYW5kLT5iaXRzID09IDE1ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDE3KSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVDsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOwotICAKLSAgaWYgKCAgIG9wZXJhbmQtPmJpdHMgICE9IDE2Ci0gICAgICB8fCBvcGVyYW5kLT5zaGlmdCAhPSAxNikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInNkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IikpOwotICAgICAgcmV0dXJuIEJGRF9SRUxPQ182NDsgIC8qIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLSAgICB9Ci0gIAotICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotaGFuZGxlX3pkYW9mZiAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMTUgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMTcpIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ7Ci0KLSAgaWYgKCAgIG9wZXJhbmQtPmJpdHMgICE9IDE2Ci0gICAgICB8fCBvcGVyYW5kLT5zaGlmdCAhPSAxNikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInpkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IikpOwotICAgICAgcmV0dXJuIEJGRF9SRUxPQ182NDsgIC8qIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLSAgICB9Ci0gIAotICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotaGFuZGxlX3RkYW9mZiAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVDsgIC8qIGRhdGEgaXRlbSwgbm90IGFuIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gNiAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxKSAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VUOyAgLyogc2xkLncvc3N0LncsIG9wZXJhbmQ6IEQ4XzYgICovCi0gIGlmIChvcGVyYW5kLT5iaXRzID09IDQgJiYgb3BlcmFuZC0+aW5zZXJ0ICE9IE5VTEwpIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVDsgIC8qIHNsZC5odSwgb3BlcmFuZDogRDUtNCAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSA0ICYmIG9wZXJhbmQtPmluc2VydCA9PSBOVUxMKSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQ7ICAvKiBzbGQuYnUsIG9wZXJhbmQ6IEQ0ICAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMTYgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMTYpICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQ7IC8qIHNldDEgJiBjaHVtcywgb3BlcmFuZHM6IEQxNiAqLwotICAKLSAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gNykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInRkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IikpOwotICAgICAgcmV0dXJuIEJGRF9SRUxPQ182NDsgIC8qIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLSAgICB9Ci0gIAotICByZXR1cm4gIG9wZXJhbmQtPmluc2VydCAhPSBOVUxMCi0gICAgPyBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVCAgICAgLyogc2xkLmgvc3N0LmgsIG9wZXJhbmQ6IEQ4XzcgKi8KLSAgICA6IEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUOyAgICAvKiBzbGQuYi9zc3QuYiwgb3ByZWFuZDogRDcgICAqLwotfQotCi0vKiBXYXJuaW5nOiBUaGUgY29kZSBpbiB0aGlzIGZ1bmN0aW9uIHJlbGllcyB1cG9uIHRoZSBkZWZpbml0aW9ucwotICAgaW4gdGhlIHY4NTBfb3BlcmFuZHNbXSBhcnJheSAoZGVmaW5lZCBpbiBvcGNvZGVzL3Y4NTAtb3BjLmMpCi0gICBtYXRjaGluZyB0aGUgaGFyZCBjb2RlZCB2YWx1ZXMgY29udGFpbmVkIGhlcmVpbi4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLXY4NTBfcmVsb2NfcHJlZml4IChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgYm9vbGVhbiBwYXJlbl9za2lwcGVkID0gZmFsc2U7Ci0KLQotICAvKiBTa2lwIGxlYWRpbmcgb3BlbmluZyBwYXJlbnRoZXNpcy4gICovCi0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnKCcpCi0gICAgewotICAgICAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcGFyZW5fc2tpcHBlZCA9IHRydWU7Ci0gICAgfQotCi0jZGVmaW5lIENIRUNLXyhuYW1lLCByZWxvYykgCQkJCQkJXAotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCBuYW1lIyMiKCIsIHN0cmxlbiAobmFtZSkgKyAxKSA9PSAwKQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSBzdHJsZW4gKG5hbWUpOwkJCQlcCi0gICAgICByZXR1cm4gcmVsb2M7CQkJCQkJCVwKLSAgICB9Ci0gIAotICBDSEVDS18gKCJoaTAiLCAgICBCRkRfUkVMT0NfSEkxNik7Ci0gIENIRUNLXyAoImhpIiwgICAgIEJGRF9SRUxPQ19ISTE2X1MpOwotICBDSEVDS18gKCJsbyIsICAgICBCRkRfUkVMT0NfTE8xNik7Ci0gIENIRUNLXyAoInNkYW9mZiIsIGhhbmRsZV9zZGFvZmYgKG9wZXJhbmQpKTsKLSAgQ0hFQ0tfICgiemRhb2ZmIiwgaGFuZGxlX3pkYW9mZiAob3BlcmFuZCkpOwotICBDSEVDS18gKCJ0ZGFvZmYiLCBoYW5kbGVfdGRhb2ZmIChvcGVyYW5kKSk7Ci0gIENIRUNLXyAoImhpbG8iLCAgIEJGRF9SRUxPQ18zMik7Ci0gIENIRUNLXyAoImN0b2ZmIiwgIGhhbmRsZV9jdG9mZiAob3BlcmFuZCkpOwotICAKLSAgLyogUmVzdG9yZSBza2lwcGVkIHBhcmVudGhlc2lzLiAgKi8KLSAgaWYgKHBhcmVuX3NraXBwZWQpCi0gICAgLS0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgcmV0dXJuIEJGRF9SRUxPQ19VTlVTRUQ7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotdjg1MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzdHIpCi0gICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCAgICAgICAgICAgICAgICAgICAgIHZhbDsKLSAgICAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBsaW5lOwotICAgICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgc3RyOwotewotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlID0gTlVMTDsKLSAgICAgIAotICAgICAgaW5zbiA9IG9wZXJhbmQtPmluc2VydCAoaW5zbiwgdmFsLCAmIG1lc3NhZ2UpOwotICAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKLQl7Ci0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKLQkgICAgICAmJiAhIHdhcm5fc2lnbmVkX292ZXJmbG93cwotCSAgICAgICYmIHN0cnN0ciAobWVzc2FnZSwgIm91dCBvZiByYW5nZSIpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBza2lwIHdhcm5pbmcuLi4gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkgPT0gMAotCQkgICAmJiAhIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzCi0JCSAgICYmIHN0cnN0ciAobWVzc2FnZSwgIm91dCBvZiByYW5nZSIpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBza2lwIHdhcm5pbmcuLi4gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyKQotCSAgICB7Ci0JICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLQkJYXNfd2FybiAoIiVzOiAlcyIsIHN0ciwgbWVzc2FnZSk7Ci0JICAgICAgZWxzZQotCQlhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCAiJXM6ICVzIiwgc3RyLCBtZXNzYWdlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLQkJYXNfd2FybiAobWVzc2FnZSk7Ci0JICAgICAgZWxzZQotCQlhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBtZXNzYWdlKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMikKLQl7Ci0JICBsb25nICAgIG1pbiwgbWF4OwotCSAgb2Zmc2V0VCB0ZXN0OwotCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIHdhcm5fc2lnbmVkX292ZXJmbG93cykKLQkJbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgICAgIGVsc2UKLQkJbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgICAgIAotCSAgICAgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgICAgICAKLQkgICAgICBpZiAoISB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cykKLQkJbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQkgICAgICBlbHNlCi0JCW1pbiA9IDA7Ci0JICAgIH0KLQkgIAotCSAgaWYgKHZhbCA8IChvZmZzZXRUKSBtaW4gfHwgdmFsID4gKG9mZnNldFQpIG1heCkKLQkgICAgewotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgY29uc3QgY2hhciAqIGVyciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLQkgICAgICBjaGFyICAgICAgICAgYnVmWzEwMF07Ci0JICAgICAgCi0JICAgICAgLyogUmVzdG9yZSBtaW4gYW5kIG1peCB0byBleHBlY3RlZCB2YWx1ZXMgZm9yIGRlY2ltYWwgcmFuZ2VzLiAgKi8KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKLQkJICAmJiAhIHdhcm5fc2lnbmVkX292ZXJmbG93cykKLQkJbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCi0JICAgICAgaWYgKCEgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKLQkJICAmJiAhIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzKQotCQltaW4gPSAwOwotCi0JICAgICAgaWYgKHN0cikKLQkJewotCQkgIHNwcmludGYgKGJ1ZiwgIiVzOiAiLCBzdHIpOwotCQkgIAotCQkgIHNwcmludF92YWx1ZSAoYnVmICsgc3RybGVuIChidWYpLCB2YWwpOwotCQl9Ci0JICAgICAgZWxzZQotCQlzcHJpbnRfdmFsdWUgKGJ1ZiwgdmFsKTsKLQkgICAgICAKLQkgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCQlhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgICAgIGVsc2UKLQkJYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLQkgICAgfQotCX0KLQotICAgICAgaW5zbiB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQpOwotICAgIH0KLSAgCi0gIHJldHVybiBpbnNuOwotfQotCi0MCi1zdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgY29weV9vZl9pbnN0cnVjdGlvbiBbMTI4XTsKLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikgCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgczsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICBzdGFydF9vZl9vcGVyYW5kczsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICogICAgICBvcGNvZGU7Ci0gIHN0cnVjdCB2ODUwX29wY29kZSAqICAgICAgbmV4dF9vcGNvZGU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiAgICAgb3BpbmRleF9wdHI7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9vcGluZGV4OwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHJlbGF4YWJsZTsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBpbnNuOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgIGluc25fc2l6ZTsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICBmOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g7Ci0gIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gZmFsc2U7Ci0gIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgZXh0cmFfZGF0YV9sZW47Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgZXh0cmFfZGF0YTsKLSAgY2hhciAqCQkgICAgc2F2ZWRfaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIAotICBzdHJuY3B5IChjb3B5X29mX2luc3RydWN0aW9uLCBzdHIsIHNpemVvZiAoY29weV9vZl9pbnN0cnVjdGlvbikgLSAxKTsKLSAgCi0gIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICEgaXNzcGFjZSAoKnMpOyBzKyspCi0gICAgY29udGludWU7Ci0gIAotICBpZiAoKnMgIT0gJ1wwJykKLSAgICAqcysrID0gJ1wwJzsKLQotICAvKiBmaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUgKi8KLSAgb3Bjb2RlID0gKHN0cnVjdCB2ODUwX29wY29kZSAqKSBoYXNoX2ZpbmQgKHY4NTBfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ciA9IHM7Ci0gIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0gICAgKysgc3RyOwotCi0gIHN0YXJ0X29mX29wZXJhbmRzID0gc3RyOwotCi0gIHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgCi0gIGZvciAoOzspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIGVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIAotICAgICAgaWYgKChvcGNvZGUtPnByb2Nlc3NvcnMgJiBwcm9jZXNzb3JfbWFzaykgPT0gMCkKLQl7Ci0JICBlcnJtc2cgPSBfKCJUYXJnZXQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpbnN0cnVjdGlvbi4iKTsKLQkgIGdvdG8gZXJyb3I7Ci0JfQotICAgICAgCi0gICAgICByZWxheGFibGUgPSAwOwotICAgICAgZmMgPSAwOwotICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLSAgICAgIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLSAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IGZhbHNlOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHIgPSBzdGFydF9vZl9vcGVyYW5kczsKLQotICAgICAgZm9yIChvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4X3B0ciAhPSAwOyBvcGluZGV4X3B0ciArKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZDsKLQkgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBob2xkOwotCSAgZXhwcmVzc2lvblMgICAgICAgICAgICAgICAgIGV4OwotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICAgIHJlbG9jOwotCi0JICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyAqIG9waW5kZXhfcHRyIF07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wZXJhbmQgICAgICA9ICYgdjg1MF9vcGVyYW5kc1sgbmV4dF9vcGluZGV4IF07Ci0JICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLQkgICAgfQotCi0JICBlcnJtc2cgPSBOVUxMOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcgfHwgKnN0ciA9PSAnWycgfHwgKnN0ciA9PSAnXScpCi0JICAgICsrIHN0cjsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFTEFYKQotCSAgICByZWxheGFibGUgPSAxOwotCi0JICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICovCi0JICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCSAgCi0JICAvKiBsbygpLCBoaSgpLCBoaTAoKSwgZXRjLi4uICovCi0JICBpZiAoKHJlbG9jID0gdjg1MF9yZWxvY19wcmVmaXggKG9wZXJhbmQpKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGZha2UgcmVsb2MsIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLQkgICAgICBpZiAocmVsb2MgPT0gQkZEX1JFTE9DXzY0KQotCQl7Ci0JCSAgbWF0Y2ggPSAxOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkJIAotCSAgICAgIGV4cHJlc3Npb24gKCYgZXgpOwotCi0JICAgICAgaWYgKGV4Llhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIHN3aXRjaCAocmVsb2MpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0JCSAgICAgIC8qIFRvIGNvcGUgd2l0aCAibm90MSA3LCB6ZGFvZmYoMHhmZmZmZjAwNilbcjBdIgotCQkJIGFuZCB0aGUgbGlrZS4gICovCi0JCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCSAgICAgIAotCQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkJICAgICAgewotCQkJLyogVHJ1bmNhdGUsIHRoZW4gc2lnbiBleHRlbmQgdGhlIHZhbHVlLiAgKi8KLQkJCWV4LlhfYWRkX251bWJlciA9IFNFWFQxNiAoZXguWF9hZGRfbnVtYmVyKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JCSAgICAgIHsKLQkJCS8qIFRydW5jYXRlLCB0aGVuIHNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4gICovCi0JCQlleC5YX2FkZF9udW1iZXIgPSBTRVhUMTYgKGV4LlhfYWRkX251bWJlciA+PiAxNik7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCi0JCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0JCSAgICAgIHsKLQkJCS8qIFRydW5jYXRlLCB0aGVuIHNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4gICovCi0JCSAgICAgICAgaW50IHRlbXAgPSAoZXguWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQotCQkJdGVtcCArPSAoZXguWF9hZGRfbnVtYmVyID4+IDE1KSAmIDE7Ci0KLQkJCWV4LlhfYWRkX251bWJlciA9IFNFWFQxNiAodGVtcCk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLQkJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX0lNTUVESUFURTMyKSA9PSAwKQotCQkJewotCQkJICBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgb3BlcmFuZCBpcyB0b28gbGFyZ2UiKTsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgICAgCi0JCSAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7Ci0JCSAgICAgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDQ7Ci0JCSAgICAgIGV4dHJhX2RhdGEgICAgICAgICAgICA9IGV4LlhfYWRkX251bWJlcjsKLQkJICAgICAgZXguWF9hZGRfbnVtYmVyICAgICAgID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICAgIAotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLCAicmVsb2M6ICVkXG4iLCByZWxvYyk7Ci0JCSAgICAgIGFzX2JhZCAoXygiQUFBUkcgLT4gdW5oYW5kbGVkIGNvbnN0YW50IHJlbG9jIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgIGlmIChmYyA+IE1BWF9JTlNOX0ZJWFVQUykKLQkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JCSAgCi0JCSAgZml4dXBzWyBmYyBdLmV4cCAgICAgPSBleDsKLQkJICBmaXh1cHNbIGZjIF0ub3BpbmRleCA9ICogb3BpbmRleF9wdHI7Ci0JCSAgZml4dXBzWyBmYyBdLnJlbG9jICAgPSByZWxvYzsKLQkJICBmYysrOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJlbG9jID09IEJGRF9SRUxPQ18zMikKLQkJICAgIHsKLQkJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX0lNTUVESUFURTMyKSA9PSAwKQotCQkJewotCQkJICBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgb3BlcmFuZCBpcyB0b28gbGFyZ2UiKTsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgICAgCi0JCSAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7Ci0JCSAgICAgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDQ7Ci0JCSAgICAgIGV4dHJhX2RhdGEgICAgICAgICAgICA9IGV4LlhfYWRkX251bWJlcjsKLQkJICAgIH0KLQkJICAgICAgCi0JCSAgaWYgKGZjID4gTUFYX0lOU05fRklYVVBTKQotCQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCQkgIGZpeHVwc1sgZmMgXS5leHAgICAgID0gZXg7Ci0JCSAgZml4dXBzWyBmYyBdLm9waW5kZXggPSAqIG9waW5kZXhfcHRyOwotCQkgIGZpeHVwc1sgZmMgXS5yZWxvYyAgID0gcmVsb2M7Ci0JCSAgZmMrKzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlcnJtc2cgPSBOVUxMOwotCSAgICAgIAotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSAhPSAwKSAKLQkJewotCQkgIGlmICghcmVnaXN0ZXJfbmFtZSAoJiBleCkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oImludmFsaWQgcmVnaXN0ZXIgbmFtZSIpOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfTk9UX1IwKQotCQkgICAgICAmJiBleC5YX2FkZF9udW1iZXIgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygicmVnaXN0ZXIgcjAgY2Fubm90IGJlIHVzZWQgaGVyZSIpOwotCQkgICAgICAKLQkJICAgICAgLyogRm9yY2UgYW4gZXJyb3IgbWVzc2FnZSB0byBiZSBnZW5lcmF0ZWQgYnkKLQkJCSBza2lwcGluZyBvdmVyIGFueSBmb2xsb3dpbmcgcG90ZW50aWFsIG1hdGNoZXMKLQkJCSBmb3IgdGhpcyBvcGNvZGUuICAqLwotCQkgICAgICBvcGNvZGUgKz0gMzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TUkcpICE9IDApIAotCQl7Ci0JCSAgaWYgKCFzeXN0ZW1fcmVnaXN0ZXJfbmFtZSAoJiBleCwgdHJ1ZSwgZmFsc2UpKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIHN5c3RlbSByZWdpc3RlciBuYW1lIik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfRVApICE9IDApCi0JCXsKLQkJICBjaGFyICogc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgY2hhciAgIGMgICAgID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JCSAgCi0JCSAgaWYgKHN0cmNtcCAoc3RhcnQsICJlcCIpICE9IDAgJiYgc3RyY21wIChzdGFydCwgInIzMCIpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFB1dCB0aGluZ3MgYmFjayB0aGUgd2F5IHdlIGZvdW5kIHRoZW0uICAqLwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7Ci0JCSAgICAgIGVycm1zZyA9IF8oImV4cGVjdGVkIEVQIHJlZ2lzdGVyIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgCi0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgCi0JCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnIHx8ICpzdHIgPT0gJ1snIHx8ICpzdHIgPT0gJ10nKQotCQkgICAgKysgc3RyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX0NDKSAhPSAwKSAKLQkJewotCQkgIGlmICghY2NfbmFtZSAoJiBleCkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oImludmFsaWQgY29uZGl0aW9uIGNvZGUgbmFtZSIpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9QVVNIX1BPUCkgCi0JCXsKLQkJICBlcnJtc2cgPSBwYXJzZV9yZWdpc3Rlcl9saXN0ICgmIGluc24sIG9wZXJhbmQpOwotCQkgIAotCQkgIC8qIFRoZSBwYXJzZV9yZWdpc3Rlcl9saXN0KCkgZnVuY3Rpb24gaGFzIGFscmVhZHkgZG9uZQotCQkgICAgIGV2ZXJ5dGhpbmcsIHNvIGZha2UgYSBkdW1teSBleHByZXNzaW9uLiAgKi8KLQkJICBleC5YX29wICAgICAgICAgPSBPX2NvbnN0YW50OwotCQkgIGV4LlhfYWRkX251bWJlciA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX0lNTUVESUFURTE2KSAKLQkJewotCQkgIGV4cHJlc3Npb24gKCYgZXgpOwotCi0JCSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIGVycm1zZyA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkJICBlbHNlIGlmIChleC5YX2FkZF9udW1iZXIgJiAweGZmZmYwMDAwKQotCQkgICAgewotCQkgICAgICBpZiAoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmKQotCQkJZXJybXNnID0gXygiY29uc3RhbnQgdG9vIGJpZyB0byBmaXQgaW50byBpbnN0cnVjdGlvbiIpOwotCQkgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4MDAxZmZmYzApID09IDB4MDAxMzA3ODApCi0JCQlleC5YX2FkZF9udW1iZXIgPj49IDE2OwotCQkgICAgICBlbHNlCi0JCQllcnJtc2cgPSBfKCJjb25zdGFudCB0b28gYmlnIHRvIGZpdCBpbnRvIGluc3RydWN0aW9uIik7Ci0JCSAgICB9Ci0JCSAgCi0JCSAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gdHJ1ZTsKLQkJICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSAyOwotCQkgIGV4dHJhX2RhdGEgICAgICAgICAgICA9IGV4LlhfYWRkX251bWJlcjsKLQkJICBleC5YX2FkZF9udW1iZXIgICAgICAgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUzMikgCi0JCXsKLQkJICBleHByZXNzaW9uICgmIGV4KTsKLQkJICAKLQkJICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgZXJybXNnID0gXygiY29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCQkgIAotCQkgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7Ci0JCSAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gNDsKLQkJICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7Ci0JCSAgZXguWF9hZGRfbnVtYmVyICAgICAgID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHJlZ2lzdGVyX25hbWUgKCYgZXgpCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSA9PSAwKQotCQl7Ci0JCSAgY2hhciBjOwotCQkgIGludCAgZXhpc3RzID0gMDsKLQkJICAKLQkJICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGFuIGFsaWFzIGhhcyBiZWVuIGRlZmluZWQgdGhhdAotCQkgICAgIG1hdGNoZXMgYSByZWdpc3RlciBuYW1lLiAgRm9yIGV4YW1wbGUgdGhlIGNvZGUgbWF5Ci0JCSAgICAgaW5jbHVkZSBhICIuc2V0IFpFUk8sIDAiIGRpcmVjdGl2ZSwgd2hpY2ggbWF0Y2hlcwotCQkgICAgIHRoZSByZWdpc3RlciBuYW1lICJ6ZXJvIi4gIEF0dGVtcHQgdG8gcmVwYXJzZSB0aGUKLQkJICAgICBmaWVsZCBhcyBhbiBleHByZXNzaW9uLCBhbmQgb25seSBjb21wbGFpbiBpZiB3ZQotCQkgICAgIGNhbm5vdCBnZW5lcmF0ZSBhIGNvbnN0YW50LiAgKi8KLQotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotCQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkJICAKLQkJICBpZiAoc3ltYm9sX2ZpbmQgKHN0cikgIT0gTlVMTCkKLQkJICAgIGV4aXN0cyA9IDE7Ci0JCSAgCi0JCSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQkJICAKLQkJICBleHByZXNzaW9uICgmIGV4KTsKLQotCQkgIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHRoaXMgcmVnaXN0ZXIgaXMgYWN0dWFsbHkgb2NjdXJpbmcgdG9vIGVhcmx5IG9uCi0JCQkgdGhlIHBhcnNpbmcgb2YgdGhlIGluc3RydWN0aW9uLCAoYmVjYXVzZSBhbm90aGVyCi0JCQkgZmllbGQgaXMgbWlzc2luZykgdGhlbiByZXBvcnQgdGhpcy4gICovCi0JCSAgICAgIGlmIChvcGluZGV4X3B0clsxXSAhPSAwCi0JCQkgICYmICh2ODUwX29wZXJhbmRzIFtvcGluZGV4X3B0ciBbMV1dLmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykpCi0JCQllcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IHZhbHVlIGlzIG1pc3NpbmcgYmVmb3JlIHRoZSByZWdpc3RlciBuYW1lIik7Ci0JCSAgICAgIGVsc2UKLQkJCWVycm1zZyA9IF8oInN5bnRheCBlcnJvcjogcmVnaXN0ZXIgbm90IGV4cGVjdGVkIik7Ci0KLQkJICAgICAgLyogSWYgd2UgY3JlYXRlZCBhIHN5bWJvbCBpbiB0aGUgcHJvY2VzcyBvZiB0aGlzIHRlc3QgdGhlbgotCQkJIGRlbGV0ZSBpdCBub3csIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgb3V0cHV0IHdpdGggdGhlIHJlYWwKLQkJCSBzeW1ib2xzLi4uICovCi0JCSAgICAgIGlmIChleGlzdHMgPT0gMAotCQkJICAmJiBleC5YX29wID09IE9fc3ltYm9sKQotCQkJc3ltYm9sX3JlbW92ZSAoZXguWF9hZGRfc3ltYm9sLAotCQkJCSAgICAgICAmIHN5bWJvbF9yb290UCwgJiBzeW1ib2xfbGFzdFApOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3lzdGVtX3JlZ2lzdGVyX25hbWUgKCYgZXgsIGZhbHNlLCBmYWxzZSkKLQkJICAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TUkcpID09IDApCi0JCXsKLQkJICBlcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IHN5c3RlbSByZWdpc3RlciBub3QgZXhwZWN0ZWQiKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGNjX25hbWUgKCZleCkKLQkJICAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9DQykgPT0gMCkKLQkJewotCQkgIGVycm1zZyA9IF8oInN5bnRheCBlcnJvcjogY29uZGl0aW9uIGNvZGUgbm90IGV4cGVjdGVkIik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBleHByZXNzaW9uICgmIGV4KTsKLQkJICAvKiBTcGVjaWFsIGNhc2U6Ci0JCSAgICAgSWYgd2UgYXJlIGFzc2VtYmxpbmcgYSBNT1YgaW5zdHJ1Y3Rpb24gKG9yIGEgQ0FMTFQuLi4uIDotKQotCQkgICAgIGFuZCB0aGUgaW1tZWRpYXRlIHZhbHVlIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBiaXRzCi0JCSAgICAgYXZhaWxhYmxlIHRoZW4gY3JlYXRlIGEgZmFrZSBlcnJvciBzbyB0aGF0IHRoZSBuZXh0IE1PVgotCQkgICAgIGluc3RydWN0aW9uIHdpbGwgYmUgc2VsZWN0ZWQuICBUaGlzIG9uZSBoYXMgYSAzMiBiaXQKLQkJICAgICBpbW1lZGlhdGUgZmllbGQuICAqLwotCi0JCSAgaWYgKCgoaW5zbiAmIDB4MDdlMCkgPT0gMHgwMjAwKQotCQkgICAgICAmJiBleC5YX29wID09IE9fY29uc3RhbnQKLQkJICAgICAgJiYgKGV4LlhfYWRkX251bWJlciA8ICgtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKQotCQkJICB8fCBleC5YX2FkZF9udW1iZXIgPiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkpCi0JCSAgICBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgb3BlcmFuZCBpcyB0b28gbGFyZ2UiKTsKLQkJfQotCi0JICAgICAgaWYgKGVycm1zZykKLQkJZ290byBlcnJvcjsKLQkgICAgICAKLS8qIGZwcmludGYgKHN0ZGVyciwgIiBpbnNuOiAleCwgb3BlcmFuZCAlZCwgb3A6ICVkLCBhZGRfbnVtYmVyOiAlZFxuIiwKLSAgIGluc24sIG9waW5kZXhfcHRyIC0gb3Bjb2RlLT5vcGVyYW5kcywgZXguWF9vcCwgZXguWF9hZGRfbnVtYmVyKTsgKi8KLQotCSAgICAgIHN3aXRjaCAoZXguWF9vcCkgCi0JCXsKLQkJY2FzZSBPX2lsbGVnYWw6Ci0JCSAgZXJybXNnID0gXygiaWxsZWdhbCBvcGVyYW5kIik7Ci0JCSAgZ290byBlcnJvcjsKLQkJY2FzZSBPX2Fic2VudDoKLQkJICBlcnJtc2cgPSBfKCJtaXNzaW5nIG9wZXJhbmQiKTsKLQkJICBnb3RvIGVycm9yOwotCQljYXNlIE9fcmVnaXN0ZXI6Ci0JCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIChWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9PUEVSQU5EX1NSRykpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oImludmFsaWQgb3BlcmFuZCIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGluc24gPSB2ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCi0JCQkJCSAgICAgIChjaGFyICopIE5VTEwsIDAsCi0JCQkJCSAgICAgIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgT19jb25zdGFudDoKLQkJICBpbnNuID0gdjg1MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAotCQkJCQkgICAgICAoY2hhciAqKSBOVUxMLCAwLAotCQkJCQkgICAgICBjb3B5X29mX2luc3RydWN0aW9uKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkJICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCQkgIGZpeHVwc1sgZmMgXS5leHAgICAgID0gZXg7Ci0JCSAgZml4dXBzWyBmYyBdLm9waW5kZXggPSAqIG9waW5kZXhfcHRyOwotCQkgIGZpeHVwc1sgZmMgXS5yZWxvYyAgID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkJICArK2ZjOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnIHx8ICpzdHIgPT0gJ1snIHx8ICpzdHIgPT0gJ10nCi0JCSB8fCAqc3RyID09ICcpJykKLQkgICAgKytzdHI7Ci0JfQotICAgICAgbWF0Y2ggPSAxOwotCi0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLSAgICAgICAgewotCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOwotCSAgaWYgKG5leHRfb3Bjb2RlLT5uYW1lICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLQotCSAgICAgIC8qIFNraXAgdmVyc2lvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0Ci0JCSBwcm9jZXNzb3IuICAqLwotCSAgICAgIGlmICgob3Bjb2RlLT5wcm9jZXNzb3JzICYgcHJvY2Vzc29yX21hc2spID09IDApCi0JCWdvdG8gZXJyb3I7Ci0JICAgICAgCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIAotCSAgYXNfYmFkICgiJXM6ICVzIiwgY29weV9vZl9pbnN0cnVjdGlvbiwgZXJybXNnKTsKLQkgIAotCSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICddJykKLQkgICAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotCSAgCi0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZWRfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgICAKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlmICgqc3RyICE9ICdcMCcpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgCi0gIGlmIChyZWxheGFibGUgJiYgZmMgPiAwKQotICAgIHsKLSAgICAgIGluc25fc2l6ZSA9IDI7Ci0gICAgICBmYyA9IDA7Ci0KLSAgICAgIGlmICghc3RyY21wIChvcGNvZGUtPm5hbWUsICJiciIpKQotCXsKLQkgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDIsIDIsCi0JCQlmaXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCwKLQkJCWZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyLAotCQkJKGNoYXIgKilmaXh1cHNbMF0ub3BpbmRleCk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIGluc25fc2l6ZSk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYgKyAyLCAwLCAyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZiA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNiwgNCwgMCwKLQkJCWZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCQkoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgaW5zbl9zaXplKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiArIDIsIDAsIDQpOwotCX0KLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgLyogRm91ciBieXRlIGluc25zIGhhdmUgYW4gb3Bjb2RlIHdpdGggdGhlIHR3byBoaWdoIGJpdHMgb24uICAqLwotICAgICAgaWYgKChpbnNuICYgMHgwNjAwKSA9PSAweDA2MDApCi0JaW5zbl9zaXplID0gNDsKLSAgICAgIGVsc2UKLQlpbnNuX3NpemUgPSAyOwotCi0gICAgICAvKiBTcGVjaWFsIGNhc2U6IDMyIGJpdCBNT1YgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZmZlMCkgPT0gMHgwNjIwKQotCWluc25fc2l6ZSA9IDI7Ci0gICAgICAKLSAgICAgIGYgPSBmcmFnX21vcmUgKGluc25fc2l6ZSk7Ci0gICAgICAKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgaW5zbl9zaXplKTsKLQotICAgICAgaWYgKGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbikKLQl7Ci0JICBmID0gZnJhZ19tb3JlIChleHRyYV9kYXRhX2xlbik7Ci0JICAKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiwgZXh0cmFfZGF0YSwgZXh0cmFfZGF0YV9sZW4pOwotCi0JICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLSAgICAgQkZEX1JFTE9DX1VOVVNFRCBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgVGhpcyBsZXRzIHVzIGVhc2lseQotICAgICBoYW5kbGUgZml4dXBzIGZvciBhbnkgb3BlcmFuZCB0eXBlLCBhbHRob3VnaCB0aGF0IGlzIGFkbWl0dGVkbHkKLSAgICAgbm90IGEgdmVyeSBleGNpdGluZyBmZWF0dXJlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluCi0gICAgIG1kX2FwcGx5X2ZpeC4gICovICAKLSAgZm9yIChpID0gMDsgaSA8IGZjOyBpKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgICAgcmVsb2M7Ci0gICAgICAKLSAgICAgIG9wZXJhbmQgPSAmIHY4NTBfb3BlcmFuZHNbIGZpeHVwc1tpXS5vcGluZGV4IF07Ci0KLSAgICAgIHJlbG9jID0gZml4dXBzW2ldLnJlbG9jOwotICAgICAgCi0gICAgICBpZiAocmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICogcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwKLQkJCQkJCQkJICByZWxvYyk7Ci0JICBpbnQgICAgICAgICAgICAgICAgc2l6ZTsKLQkgIGludCAgICAgICAgICAgICAgICBhZGRyZXNzOwotCSAgZml4UyAqICAgICAgICAgICAgIGZpeFA7Ci0KLQkgIGlmICghcmVsb2NfaG93dG8pCi0JICAgIGFib3J0KCk7Ci0JICAKLQkgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgLyogWFhYIFRoaXMgd2lsbCBhYm9ydCBvbiBhbiBSX1Y4NTBfOCByZWxvYyAtCi0JICAgICBpcyB0aGlzIHJlbG9jIGFjdHVhbGx5IHVzZWQgPyAqLwotCSAgaWYgKHNpemUgIT0gMiAmJiBzaXplICE9IDQpIAotCSAgICBhYm9ydCAoKTsKLQotCSAgYWRkcmVzcyA9IChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpICsgaW5zbl9zaXplIC0gc2l6ZTsKLQotCSAgaWYgKHJlbG9jID09IEJGRF9SRUxPQ18zMikKLQkgICAgewotCSAgICAgIGFkZHJlc3MgKz0gMjsKLQkgICAgfQotCSAgCi0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBhZGRyZXNzLCBzaXplLAotCQkJICAgICAgJiBmaXh1cHNbaV0uZXhwLCAKLQkJCSAgICAgIHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCSAgICAgIHJlbG9jKTsKLQotCSAgc3dpdGNoIChyZWxvYykKLQkgICAgewotCSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0JICAgICAgZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZpeF9uZXdfZXhwICgKLQkJICAgICAgIGZyYWdfbm93LAotCQkgICAgICAgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQkgICAgICAgJiBmaXh1cHNbaV0uZXhwLAotCQkgICAgICAgMSAvKiBGSVhNRTogVjg1MF9PUEVSQU5EX1JFTEFUSVZFID8/PyAqLywKLQkJICAgICAgIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIChmaXh1cHNbaV0ub3BpbmRleAotCQkJCQkJICAgKyAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotCQkgICAgICAgKTsKLQl9Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotCi0vKiBJZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlLiAgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqIHNlZzsKLSAgICAgZml4UyAqICAgICBmaXhwOwotewotICBhcmVsZW50ICogcmVsb2M7Ci0gIAotICByZWxvYyAgICAgICAgICAgICAgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHI9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzICAgICA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvICAgICAgID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0KLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAoaW50KSBmaXhwLT5meF9yX3R5cGUpOwotCi0gICAgICB4ZnJlZSAocmVsb2MpOwotICAgICAgCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBpZiAoICAgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQpCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIAotICByZXR1cm4gcmVsb2M7Ci19Ci0KLS8qIEFzc3VtZSBldmVyeXRoaW5nIHdpbGwgZml0IGluIHR3byBieXRlcywgdGhlbiBleHBhbmQgYXMgbmVjZXNzYXJ5LiAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCi0gICAgIGZyYWdTICogZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICogc2VnOwotewotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMCkKLSAgICBmcmFncC0+ZnJfdmFyID0gNDsKLSAgZWxzZSBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMikKLSAgICBmcmFncC0+ZnJfdmFyID0gMjsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotICByZXR1cm4gMjsKLX0gCi0KLWxvbmcKLXY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWN0aW9uKQotICAgICBmaXhTICogZml4cDsKLSAgICAgc2VnVCAgIHNlY3Rpb247Ci17Ci0gIC8qIElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBvciBpbiBhIHNlY3Rpb24gb3RoZXIgdGhhbiBvdXIgb3duLAotICAgICBvciBpdCBpcyB3ZWFrIChpbiB3aGljaCBjYXNlIGl0IG1heSB3ZWxsIGJlIGluIGFub3RoZXIgc2VjdGlvbiwKLSAgICAgdGhlbiBsZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICB8fCBTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KQotCSAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWN0aW9uKSkpCi0gICAgcmV0dXJuIDA7Ci0gIAotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICogICBmaXhwOwotICAgICB2YWx1ZVQgKiB2YWx1ZXA7Ci0gICAgIHNlZ1QgICAgIHNlZzsKLXsKLSAgdmFsdWVUIHZhbHVlOwotICBjaGFyICogd2hlcmU7Ci0KLSAgaWYgKCAgIGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKiB2YWx1ZXA7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKiB2YWx1ZXA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKLSAgICAgIGlmIChmaXhwLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoKGludCkgZml4cC0+Znhfcl90eXBlID49IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBpbnNuOwotCi0gICAgICBvcGluZGV4ID0gKGludCkgZml4cC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLSAgICAgIG9wZXJhbmQgPSAmIHY4NTBfb3BlcmFuZHNbIG9waW5kZXggXTsKLQotICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLSAgICAgICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uCi0KLQkgTm90ZSB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gc3RvcmVkIGluIGxpdHRsZSBlbmRpYW4KLQkgZm9ybWF0ISAgKi8KLSAgICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotCi0gICAgICBpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgaW5zbiA9IHY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIChvZmZzZXRUKSB2YWx1ZSwKLQkJCQkgIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIE5VTEwpOwotICAgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgLyogTm90aGluZyBlbHNlIHRvIGRvIGhlcmUuICovCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbi4gIAotCSBXZSBhcmUgb25seSBwcmVwYXJlZCB0byB0dXJuIGEgZmV3IG9mIHRoZSBvcGVyYW5kcyBpbnRvIHJlbG9jcy4gKi8KLQotICAgICAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMjIpCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUw7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5iaXRzID09IDkpCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBmcHJpbnRmIChzdGRlcnIsICJiaXRzOiAlZCwgaW5zbjogJXhcbiIsIG9wZXJhbmQtPmJpdHMsIGluc24pOyAqLwotCSAgCi0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAgICBfKCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIikpOwotCSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9kb25lKQotICAgIHsKLSAgICAgIC8qIFdlIHN0aWxsIGhhdmUgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBpbnRvIG1lbW9yeSEgICovCi0gICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMSkKLQkqIHdoZXJlID0gdmFsdWUgJiAweGZmOwotICAgICAgZWxzZSBpZiAoZml4cC0+Znhfc2l6ZSA9PSAyKQotCWJmZF9wdXRsMTYgKHZhbHVlICYgMHhmZmZmLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlIGlmIChmaXhwLT5meF9zaXplID09IDQpCi0JYmZkX3B1dGwzMiAodmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICB9Ci0gIAotICBmaXhwLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQwKLS8qIFBhcnNlIGEgY29ucyBleHByZXNzaW9uLiAgV2UgaGF2ZSB0byBoYW5kbGUgaGkoKSwgbG8oKSwgZXRjCi0gICBvbiB0aGUgdjg1MC4gICovCi12b2lkCi1wYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MCAoZXhwKQotICBleHByZXNzaW9uUyAqIGV4cDsKLXsKLSAgLyogU2VlIGlmIHRoZXJlJ3MgYSByZWxvYyBwcmVmaXggbGlrZSBoaSgpIHdlIGhhdmUgdG8gaGFuZGxlLiAgKi8KLSAgaG9sZF9jb25zX3JlbG9jID0gdjg1MF9yZWxvY19wcmVmaXggKE5VTEwpOwotCi0gIC8qIERvIG5vcm1hbCBleHByZXNzaW9uIHBhcnNpbmcuICAqLwotICBleHByZXNzaW9uIChleHApOwotfQotCi0vKiBDcmVhdGUgYSBmaXh1cCBmb3IgYSBjb25zIGV4cHJlc3Npb24uICBJZiBwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MAotICAgZm91bmQgYSByZWxvYyBwcmVmaXgsIHRoZW4gd2UgdXNlIHRoYXQgcmVsb2MsIGVsc2Ugd2UgY2hvb3NlIGFuCi0gICBhcHByb3ByaWF0ZSBvbmUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGV4cHJlc3Npb24uICAqLwotdm9pZAotY29uc19maXhfbmV3X3Y4NTAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICogZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgc2l6ZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaWYgKGhvbGRfY29uc19yZWxvYyA9PSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGlmIChzaXplID09IDQpCi0JaG9sZF9jb25zX3JlbG9jID0gQkZEX1JFTE9DXzMyOwotICAgICAgaWYgKHNpemUgPT0gMikKLQlob2xkX2NvbnNfcmVsb2MgPSBCRkRfUkVMT0NfMTY7Ci0gICAgICBpZiAoc2l6ZSA9PSAxKQotCWhvbGRfY29uc19yZWxvYyA9IEJGRF9SRUxPQ184OwotICAgIH0KLQotICBpZiAoZXhwICE9IE5VTEwpCi0gICAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIDAsIGhvbGRfY29uc19yZWxvYyk7Ci0gIGVsc2UKLSAgICBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgTlVMTCwgMCwgMCwgaG9sZF9jb25zX3JlbG9jKTsKLX0KLQotYm9vbGVhbgotdjg1MF9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgICBmaXhTICogZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIC8qIERvbid0IGFkanVzdCBmdW5jdGlvbiBuYW1lcyAqLwotICBpZiAoU19JU19GVU5DVElPTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotICAKLSAgcmV0dXJuIDE7Ci19Ci0gCi1pbnQKLXY4NTBfZm9yY2VfcmVsb2NhdGlvbiAoZml4UCkKLSAgICAgIHN0cnVjdCBmaXggKiBmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgJiYgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDE7Ci0gIAotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0gCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12ODUwLmggYi9nYXMvY29uZmlnL3RjLXY4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkNGQxYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXY4NTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qIHRjLXY4NTAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtdjg1MC5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfVjg1MAotCi0jaW5jbHVkZSA8ZWxmL3Y4NTAuaD4KLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBWODUwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIAkJYmZkX2FyY2hfdjg1MAotCi0vKiBUaGUgdGFyZ2V0IEJGRCBmb3JtYXQuICAqLwotI2RlZmluZSBUQVJHRVRfRk9STUFUIAkJImVsZjMyLXY4NTAiCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIHY4NTBfZml4X2FkanVzdGFibGUoZml4UCkKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSB2ODUwX2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKLWV4dGVybiBpbnQgdjg1MF9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotICAgICAKLS8qIFdlIG5lZWQgdG8gaGFuZGxlIGxvKCksIGhpKCksIGV0YyBldGMgaW4gLmh3b3JkLCAud29yZCwgZXRjCi0gICBkaXJlY3RpdmVzLCBzbyB3ZSBoYXZlIHRvIHBhcnNlICJjb25zIiBleHByZXNzaW9ucyBvdXJzZWx2ZXMuICAqLwotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwIChFWFApCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfdjg1MAotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgc21hbGwgZGF0YSBhcmVhIChwb2ludGVkIHRvIGJ5IEdQKS4gICovCi0jZGVmaW5lIFNIRl9WODUwX0dQUkVMCQkweDEwMDAwMDAwCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgdGlueSBkYXRhIGFyZWEgKHBvaW50ZWQgdG8gYnkgRVApLiAgKi8KLSNkZWZpbmUgU0hGX1Y4NTBfRVBSRUwJCTB4MjAwMDAwMDAKLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSB6ZXJvIGRhdGEgYXJlYSAocG9pbnRlZCB0byBieSBSMCkuICAqLwotI2RlZmluZSBTSEZfVjg1MF9SMFJFTAkJMHg0MDAwMDAwMAotCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnNkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfR1BSRUwJfSwgXAotICB7ICIucm9zZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArICAgICAgICAgICAgIFNIRl9WODUwX0dQUkVMCX0sIFwKLSAgeyAiLnNic3MiLAlTSFRfTk9CSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfR1BSRUwJfSwgXAotICB7ICIuc2NvbW1vbiIsCVNIVF9WODUwX1NDT01NT04sIAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9HUFJFTAl9LCBcCi0gIHsgIi50ZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0VQUkVMCX0sIFwKLSAgeyAiLnRic3MiLAlTSFRfTk9CSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfRVBSRUwJfSwgXAotICB7ICIudGNvbW1vbiIsCVNIVF9WODUwX1RDT01NT04sCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLnpkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfUjBSRUwJfSwgXAotICB7ICIucm96ZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArICAgICAgICAgICAgIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLnpic3MiLAlTSFRfTk9CSVRTLAkgIAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi56Y29tbW9uIiwJU0hUX1Y4NTBfWkNPTU1PTiwgCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLmNhbGxfdGFibGVfZGF0YSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sCSAgIFwKLSAgeyAiLmNhbGxfdGFibGVfdGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX0VYRUNJTlNUUiB9LAotCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihmaXhQLHNlY3Rpb24pIHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWN0aW9uKQotZXh0ZXJuIGxvbmcgdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24gKCk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXZheC5jIGIvZ2FzL2NvbmZpZy90Yy12YXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyNWNjYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI0MyArMCwwIEBACi0vKiB0Yy12YXguYyAtIHZheC1zcGVjaWZpYyAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgInZheC1pbnN0LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgkJLyogRm9yIEZSQUdfQVBQRU5EXzFfQ0hBUiBtYWNybyBpbiAiZnJhZ3MuaCIgKi8KLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLwotLyogTm90ZSB0aGF0IGZvciB0aGUgVkFYIHRoZSBhcmUgdGhlIHNhbWUgYXMgY29tbWVudF9jaGFycyBhYm92ZS4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBhcyBpbiAwZjEyMy40NTYgKi8KLS8qIG9yICAgIDBIMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKSAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRGZGZ0doSCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLS8qIEhvbGQgZGV0YWlscyBvZiBhbiBvcGVyYW5kIGV4cHJlc3Npb24gKi8KLXN0YXRpYyBleHByZXNzaW9uUyBleHBfb2Zfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsKLXN0YXRpYyBzZWdUIHNlZ19vZl9vcGVyYW5kW1ZJVF9NQVhfT1BFUkFORFNdOwotCi0vKiBBIHZheCBpbnN0cnVjdGlvbiBhZnRlciBkZWNvZGluZy4gKi8KLXN0YXRpYyBzdHJ1Y3Qgdml0IHY7Ci0KLS8qIEhvbGQgZGV0YWlscyBvZiBiaWcgb3BlcmFuZHMuICovCi1MSVRUTEVOVU1fVFlQRSBiaWdfb3BlcmFuZF9iaXRzW1ZJVF9NQVhfT1BFUkFORFNdW1NJWkVfT0ZfTEFSR0VfTlVNQkVSXTsKLUZMT05VTV9UWVBFIGZsb2F0X29wZXJhbmRbVklUX01BWF9PUEVSQU5EU107Ci0vKiBBYm92ZSBpcyBtYWRlIHRvIHBvaW50IGludG8gYmlnX29wZXJhbmRfYml0cyBieSBtZF9iZWdpbigpLiAqLwotCi1pbnQgZmxhZ19oYXNoX2xvbmdfbmFtZXM7CS8qIC0rICovCi1pbnQgZmxhZ19vbmU7CQkJLyogLTEgKi8KLWludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1IICovCi1pbnQgZmxhZ19ub19oYXNoX21peGVkX2Nhc2U7CS8qIC1oIE5VTSAqLwotDAotLyoKLSAqIEZvciBWQVgsIHJlbGF0aXZlIGFkZHJlc3NlcyBvZiAianVzdCB0aGUgcmlnaHQgbGVuZ3RoIiBhcmUgZWFzeS4KLSAqIFRoZSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGFsd2F5cyB0aGUgbGFzdCBvcGVyYW5kLCBldmVuIGluCi0gKiBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLgotICogRm9yIFZBWCwgd2UgZW5jb2RlIHRoZSByZWxheF9zdWJzdGF0ZVRzIChpbiBlLmcuIGZyX3N1YnN0YXRlKSBhczoKLSAqCi0gKgkJICAgIDQgICAgICAgMyAgICAgICAyICAgICAgIDEgICAgICAgMAkgICAgIGJpdCBudW1iZXIKLSAqCS0tLS8gLy0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAqCQl8ICAgICB3aGF0IHN0YXRlID8JfCAgaG93IGxvbmcgPwl8Ci0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgotICogVGhlICJob3cgbG9uZyIgYml0cyBhcmUgMDA9Ynl0ZSwgMDE9d29yZCwgMTA9bG9uZy4KLSAqIFRoaXMgaXMgYSBVbip4IGNvbnZlbnRpb24uCi0gKiBOb3QgYWxsIGxlbmd0aHMgYXJlIGxlZ2l0IGZvciBhIGdpdmVuIHZhbHVlIG9mICh3aGF0IHN0YXRlKS4KLSAqIFRoZSAiaG93IGxvbmciIHJlZmVycyBtZXJlbHkgdG8gdGhlIGRpc3BsYWNlbWVudCBsZW5ndGguCi0gKiBUaGUgYWRkcmVzcyB1c3VhbGx5IGhhcyBzb21lIGNvbnN0YW50IGJ5dGVzIGluIGl0IGFzIHdlbGwuCi0gKgotCi0gZ3JvdXBzIGZvciBWQVggYWRkcmVzcyByZWxheGluZy4KLQotIDEuCSJmb28iIHBjLXJlbGF0aXZlLgotIGxlbmd0aCBvZiBieXRlLCB3b3JkLCBsb25nCi0KLSAyYS4JSjxjb25kPiB3aGVyZSA8Y29uZD4gaXMgYSBzaW1wbGUgZmxhZyB0ZXN0LgotIGxlbmd0aCBvZiBieXRlLCB3b3JkLCBsb25nLgotIFZBWCBvcGNvZGVzIGFyZToJKEhleCkKLSBibmVxL2JuZXF1CTEyCi0gYmVxbC9iZXFsdQkxMwotIGJndHIJCTE0Ci0gYmxlcQkJMTUKLSBiZ2VxCQkxOAotIGJsc3MJCTE5Ci0gYmd0cnUJCTFhCi0gYmxlcXUJCTFiCi0gYnZjCQkxYwotIGJ2cwkJMWQKLSBiZ2VxdS9iY2MJMWUKLSBibHNzdS9iY3MJMWYKLSBBbHdheXMsIHlvdSBjb21wbGVtZW50IDB0aCBiaXQgdG8gcmV2ZXJzZSBjb25kaXRpb24uCi0gQWx3YXlzLCAxLWJ5dGUgb3Bjb2RlLCB0aGVuIDEtYnl0ZSBkaXNwbGFjZW1lbnQuCi0KLSAyYi4JSjxjb25kPiB3aGVyZSBjb25kIHRlc3RzIGEgbWVtb3J5IGJpdC4KLSBsZW5ndGggb2YgYnl0ZSwgd29yZCwgbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYmJzCQllMAotIGJiYwkJZTEKLSBiYnNzCQllMgotIGJiY3MJCWUzCi0gYmJzYwkJZTQKLSBiYmNjCQllNQotIGJic3NpCQllNgotIGJiY2NpCQllNwotIEFsd2F5cywgeW91IGNvbXBsZW1lbnQgMHRoIGJpdCB0byByZXZlcnNlIGNvbmRpdGlvbi4KLSBBbHdheXMsIDEtYnl0ZSBvcGNkZSwgbG9uZ3dvcmQtYWRkcmVzcywgYnl0ZS1hZGRyZXNzLCAxLWJ5dGUtZGlzcGxhY2VtZW50Ci0KLSAyYy4JSjxjb25kPiB3aGVyZSBjb25kIHRlc3RzIGxvdy1vcmRlciBtZW1vcnkgYml0Ci0gbGVuZ3RoIG9mIGJ5dGUsd29yZCxsb25nLgotIFZheCBvcGNvZGVzIGFyZToJKEhleCkKLSBibGJzCQllOAotIGJsYmMJCWU5Ci0gQWx3YXlzLCB5b3UgY29tcGxlbWVudCAwdGggYml0IHRvIHJldmVyc2UgY29uZGl0aW9uLgotIEFsd2F5cywgMS1ieXRlIG9wY29kZSwgbG9uZ3dvcmQtYWRkcmVzcywgMS1ieXRlIGRpc3BsYWNlbWVudC4KLQotIDMuCUpicy9KYnIuCi0gbGVuZ3RoIG9mIGJ5dGUsd29yZCxsb25nLgotIFZheCBvcGNvZGVzIGFyZToJKEhleCkKLSBic2JiCQkxMAotIGJyYgkJMTEKLSBUaGVzZSBhcmUgbGlrZSAoMikgYnV0IHRoZXJlIGlzIG5vIGNvbmRpdGlvbiB0byByZXZlcnNlLgotIEFsd2F5cywgMSBieXRlIG9wY29kZSwgdGhlbiBkaXNwbGFjZW1lbnQvYWJzb2x1dGUuCi0KLSA0YS4JSmFjYlgKLSBsZW5ndGggb2Ygd29yZCwgbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYWNidwkJM2QKLSBhY2JmCQk0ZgotIGFjYmQJCTZmCi0gYWJjYgkJOWQKLSBhY2JsCQlmMQotIGFjYmcJICAgICAgNGZmZAotIGFjYmgJICAgICAgNmZmZAotIEFsd2F5cywgd2UgY2Fubm90IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2g7IHdlIGhhdmUgYSB3b3JkCi0gZGlzcGxhY2VtZW50LgotIFRoZSBkb3VibGUtYnl0ZSBvcC1jb2RlcyBkb24ndCBodXJ0OiB3ZSBuZXZlciB3YW50IHRvIG1vZGlmeSB0aGUKLSBvcGNvZGUsIHNvIHdlIGRvbid0IGNhcmUgaG93IG1hbnkgYnl0ZXMgYXJlIGJldHdlZW4gdGhlIG9wY29kZSBhbmQKLSB0aGUgb3BlcmFuZC4KLQotIDRiLglKWG9iWFhYCi0gbGVuZ3RoIG9mIGxvbmcsIGxvbmcsIGJ5dGUuCi0gVmF4IG9wY29kZXMgYXJlOgkoSGV4KQotIGFvYmxzcwkJZjIKLSBhb2JsZXEJCWYzCi0gc29iZ2VxCQlmNAotIHNvYmd0cgkJZjUKLSBBbHdheXMsIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoOyB3ZSBoYXZlIGEgYnl0ZQotIGRpc3BsYWNlbWVudC4KLQotIFRoZSBvbmx5IHRpbWUgd2UgbmVlZCB0byBtb2RpZnkgdGhlIG9wY29kZSBpcyBmb3IgY2xhc3MgMiBpbnN0cnVjdGlvbnMuCi0gQWZ0ZXIgcmVsYXgoKSB3ZSBtYXkgY29tcGxlbWVudCB0aGUgbG93ZXN0IG9yZGVyIGJpdCBvZiBzdWNoIGluc3RydWN0aW9uCi0gdG8gcmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guCi0KLSBGb3IgY2xhc3MgMiBpbnN0cnVjdGlvbnMsIHdlIHN0b3JlIGNvbnRleHQgb2YgIndoZXJlIGlzIHRoZSBvcGNvZGUgbGl0ZXJhbCIuCi0gV2UgY2FuIGNoYW5nZSBhbiBvcGNvZGUncyBsb3dlc3Qgb3JkZXIgYml0IHdpdGhvdXQgYnJlYWtpbmcgYW55dGhpbmcgZWxzZS4KLQotIFdlIHNvbWV0aW1lcyBzdG9yZSBjb250ZXh0IGluIHRoZSBvcGVyYW5kIGxpdGVyYWwuIFRoaXMgd2F5IHdlIGNhbiBmaWd1cmUgb3V0Ci0gYWZ0ZXIgcmVsYXgoKSB3aGF0IHRoZSBvcmlnaW5hbCBhZGRyZXNzaW5nIG1vZGUgd2FzLgotICovCi0MCi0vKiBUaGVzZSBkaXNwbGFjZW1lbnRzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKLSAgIGRpc3BsYWNlbWVudC4gIFRoZSBmaXJzdCBsZXR0ZXIgaXMgQnl0ZSwgV29yZC4gIDJuZCBsZXR0ZXIgaXMKLSAgIEZvcndhcmQsIEJhY2t3YXJkLiAqLwotI2RlZmluZSBCRiAoMSsgMTI3KQotI2RlZmluZSBCQiAoMSstMTI4KQotI2RlZmluZSBXRiAoMisgMzI3NjcpCi0jZGVmaW5lIFdCICgyKy0zMjc2OCkKLS8qIERvbnQgbmVlZCBMRiwgTEIgYmVjYXVzZSB0aGV5IGFsd2F5cyByZWFjaC4gW1RoZXkgYXJlIGNvZGVkIGFzIDAuXSAqLwotCi0KLSNkZWZpbmUgQyhhLGIpIEVOQ09ERV9SRUxBWChhLGIpCi0vKiBUaGlzIG1hY3JvIGhhcyBubyBzaWRlLWVmZmVjdHMuICovCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHsxLCAxLCAwLCAwfSwJCQkvKiBlcnJvciBzZW50aW5lbCAgIDAsMAkqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAwLDEJKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMCwyCSovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDAsMwkqLwotICB7QkYgKyAxLCBCQiArIDEsIDIsIEMgKDEsIDEpfSwvKiBCXiJmb28iCSAgICAxLDAgKi8KLSAge1dGICsgMSwgV0IgKyAxLCAzLCBDICgxLCAyKX0sLyogV14iZm9vIgkgICAgMSwxICovCi0gIHswLCAwLCA1LCAwfSwJCQkvKiBMXiJmb28iCSAgICAxLDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMSwzICovCi0gIHtCRiwgQkIsIDEsIEMgKDIsIDEpfSwJLyogYjxjb25kPiBCXiJmb28iICAyLDAgKi8KLSAge1dGICsgMiwgV0IgKyAyLCA0LCBDICgyLCAyKX0sLyogYnIuKz8gYnJ3IFgJICAgIDIsMSAqLwotICB7MCwgMCwgNywgMH0sCQkJLyogYnIuKz8gam1wIFgJICAgIDIsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAyLDMgKi8KLSAge0JGLCBCQiwgMSwgQyAoMywgMSl9LAkvKiBicmIgQl5mb28JICAgIDMsMCAqLwotICB7V0YsIFdCLCAyLCBDICgzLCAyKX0sCS8qIGJydyBXXmZvbwkgICAgMywxICovCi0gIHswLCAwLCA1LCAwfSwJCQkvKiBKbXAgTF5mb28JICAgIDMsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAzLDMgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgNCwwICovCi0gIHtXRiwgV0IsIDIsIEMgKDQsIDIpfSwJLyogYWNiXyBeV2ZvbwkgICAgNCwxICovCi0gIHswLCAwLCAxMCwgMH0sCQkvKiBhY2JfLGJyLGptcCBMXmZvbzQsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICA0LDMgKi8KLSAge0JGLCBCQiwgMSwgQyAoNSwgMSl9LAkvKiBYb2JfX18sLGZvbyAgICAgIDUsMCAqLwotICB7V0YgKyA0LCBXQiArIDQsIDYsIEMgKDUsIDIpfSwvKiBYb2IuKzIsYnJiLiszLGJydzUsMSAqLwotICB7MCwgMCwgOSwgMH0sCQkJLyogWG9iLisyLGJyYi4rNixqbXA1LDIgKi8KLX07Ci0KLSN1bmRlZiBDCi0jdW5kZWYgQkYKLSN1bmRlZiBCQgotI3VuZGVmIFdGCi0jdW5kZWYgV0IKLQotdm9pZCBmbG9hdF9jb25zICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJnZmxvYXQiLCBmbG9hdF9jb25zLCAnZyd9LAotICB7ImhmbG9hdCIsIGZsb2F0X2NvbnMsICdoJ30sCi0gIHswfSwKLX07Ci0KLSNkZWZpbmUgU1RBVEVfUENfUkVMQVRJVkUJCSgxKQotI2RlZmluZSBTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gJKDIpCi0jZGVmaW5lIFNUQVRFX0FMV0FZU19CUkFOQ0gJCSgzKQkvKiBpbmNsdWRlcyBCU0IuLi4gKi8KLSNkZWZpbmUgU1RBVEVfQ09NUExFWF9CUkFOQ0gJICAgICAgICAoNCkKLSNkZWZpbmUgU1RBVEVfQ09NUExFWF9IT1AJCSg1KQotCi0jZGVmaW5lIFNUQVRFX0JZVEUJCQkoMCkKLSNkZWZpbmUgU1RBVEVfV09SRAkJCSgxKQotI2RlZmluZSBTVEFURV9MT05HCQkJKDIpCi0jZGVmaW5lIFNUQVRFX1VOREYJCQkoMykJLyogU3ltYm9sIHVuZGVmaW5lZCBpbiBwYXNzMSAqLwotCi0KLSNkZWZpbmUgbWluKGEsIGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0KLWludCBmbG9udW1fZ2VuMnZheCBQQVJBTVMgKChjaGFyIGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKLQkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqdmlwX2JlZ2luIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB2aXBfb3BfZGVmYXVsdHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgdmlwX29wIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IHZvcCAqKSk7Ci1zdGF0aWMgdm9pZCB2aXAgUEFSQU1TICgoc3RydWN0IHZpdCAqLCBjaGFyICopKTsKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqZXJydHh0OwotICBGTE9OVU1fVFlQRSAqZlA7Ci0gIGludCBpOwotCi0gIGlmICgoZXJydHh0ID0gdmlwX2JlZ2luICgxLCAiJCIsICIqIiwgImAiKSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiVklQX0JFR0lOIGVycm9yOiVzIiksIGVycnR4dCk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGZQID0gZmxvYXRfb3BlcmFuZDsKLSAgICAgICBmUCA8IGZsb2F0X29wZXJhbmQgKyBWSVRfTUFYX09QRVJBTkRTOwotICAgICAgIGkrKywgZlArKykKLSAgICB7Ci0gICAgICBmUC0+bG93ID0gJmJpZ19vcGVyYW5kX2JpdHNbaV1bMF07Ci0gICAgICBmUC0+aGlnaCA9ICZiaWdfb3BlcmFuZF9iaXRzW2ldW1NJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMV07Ci0gICAgfQotfQotDAotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotLyogRml4IHVwIHNvbWUgZGF0YSBvciBpbnN0cnVjdGlvbnMgYWZ0ZXIgd2UgZmluZCBvdXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sCi0gICB0aGF0IHRoZXkgcmVmZXJlbmNlLiAgKi8KLQotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfYXBwbHlfZml4IChmaXhQLCB2YWx1ZSkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsLAotCQkJCSh2YWx1ZVQpIHZhbHVlLCBmaXhQLT5meF9zaXplKTsKLX0KLQotbG9uZwotbWRfY2hhcnNfdG9fbnVtYmVyIChjb24sIG5ieXRlcykKLSAgICAgdW5zaWduZWQgY2hhciBjb25bXTsJLyogTG93IG9yZGVyIGJ5dGUgMXN0LiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dC4gKi8KLXsKLSAgbG9uZyByZXR2YWw7Ci0gIGZvciAocmV0dmFsID0gMCwgY29uICs9IG5ieXRlcyAtIDE7IG5ieXRlcy0tOyBjb24tLSkKLSAgICB7Ci0gICAgICByZXR2YWwgPDw9IEJJVFNfUEVSX0NIQVI7Ci0gICAgICByZXR2YWwgfD0gKmNvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi0vKiB2YXg6bWRfYXNzZW1ibGUoKSBlbWl0IGZyYWdzIGZvciAxIGluc3RydWN0aW9uICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChpbnN0cnVjdGlvbl9zdHJpbmcpCi0gICAgIGNoYXIgKmluc3RydWN0aW9uX3N0cmluZzsJLyogQSBzdHJpbmc6IGFzc2VtYmxlIDEgaW5zdHJ1Y3Rpb24uICovCi17Ci0gIC8qIE5vbi16ZXJvIGlmIG9wZXJhbmQgZXhwcmVzc2lvbidzIHNlZ21lbnQgaXMgbm90IGtub3duIHlldC4gKi8KLSAgaW50IGlzX3VuZGVmaW5lZDsKLQotICBpbnQgbGVuZ3RoX2NvZGU7Ci0gIGNoYXIgKnA7Ci0gIC8qIEFuIG9wZXJhbmQuIFNjYW5zIGFsbCBvcGVyYW5kcy4gKi8KLSAgc3RydWN0IHZvcCAqb3BlcmFuZFA7Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCQkJLyogV2hhdCB1c2VkIHRvIGxpdmUgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4gKi8KLSAgY2hhciBjX3NhdmU7Ci0gIC8qIDE6IGluc3RydWN0aW9uX3N0cmluZyBiYWQgZm9yIGFsbCBwYXNzZXMuICovCi0gIGludCBnb29mZWQ7Ci0gIC8qIFBvaW50cyB0byBzbG90IGp1c3QgYWZ0ZXIgbGFzdCBvcGVyYW5kLiAgKi8KLSAgc3RydWN0IHZvcCAqZW5kX29wZXJhbmRQOwotICAvKiBQb2ludHMgdG8gZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIHRoaXMgb3BlcmFuZC4gICovCi0gIGV4cHJlc3Npb25TICpleHBQOwotICBzZWdUICpzZWdQOwotCi0gIC8qIFRoZXNlIHJlZmVyIHRvIGFuIGluc3RydWN0aW9uIG9wZXJhbmQgZXhwcmVzc2lvbi4gKi8KLSAgLyogVGFyZ2V0IHNlZ21lbnQgb2YgdGhlIGFkZHJlc3MuCSAqLwotICBzZWdUIHRvX3NlZzsKLSAgdmFsdWVUIHRoaXNfYWRkX251bWJlcjsKLSAgLyogUG9zaXRpdmUgKG1pbnVlbmQpIHN5bWJvbC4gKi8KLSAgc3ltYm9sUyAqdGhpc19hZGRfc3ltYm9sOwotICAvKiBBcyBhIG51bWJlci4gKi8KLSAgbG9uZyBvcGNvZGVfYXNfbnVtYmVyOwotICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIDFzdC4gKi8KLSAgY2hhciAqb3Bjb2RlX2FzX2NoYXJzOwotICAvKiBBcyBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAqLwotICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIDFzdCAqLwotICBjaGFyICpvcGNvZGVfbG93X2J5dGVQOwotICAvKiBsZW5ndGggKGJ5dGVzKSBtZWFudCBieSB2b3Bfc2hvcnQuICovCi0gIGludCBsZW5ndGg7Ci0gIC8qIDAsIG9yIDEgaWYgJ0AnIGlzIGluIGFkZHJlc3NpbmcgbW9kZS4gKi8KLSAgaW50IGF0OwotICAvKiBGcm9tIHZvcF9uYnl0ZXM6IHZheF9vcGVyYW5kX3dpZHRoIChpbiBieXRlcykgKi8KLSAgaW50IG5ieXRlczsKLSAgRkxPTlVNX1RZUEUgKmZsb2F0UDsKLSAgTElUVExFTlVNX1RZUEUgbGl0ZXJhbF9mbG9hdFs4XTsKLSAgLyogQmlnIGVub3VnaCBmb3IgYW55IGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuICovCi0KLSAgdmlwICgmdiwgaW5zdHJ1Y3Rpb25fc3RyaW5nKTsKLQotICAvKgotICAgKiBOb3cgd2UgdHJ5IHRvIGZpbmQgYXMgbWFueSBhc193YXJuKClzIGFzIHdlIGNhbi4gSWYgd2UgZG8gYW55IGFzX3dhcm4oKXMKLSAgICogdGhlbiBnb29mZWQ9MS4gTm90aWNlIHRoYXQgd2UgZG9uJ3QgbWFrZSBhbnkgZnJhZ3MgeWV0LgotICAgKiBTaG91bGQgZ29vZmVkIGJlIDEsIHRoZW4gdGhpcyBpbnN0cnVjdGlvbiB3aWxsIHdlZGdlIGluIGFueSBwYXNzLAotICAgKiBhbmQgd2UgY2FuIHNhZmVseSBmbHVzaCBpdCwgd2l0aG91dCBjYXVzaW5nIGludGVycGFzcyBzeW1ib2wgcGhhc2UKLSAgICogZXJyb3JzLiBUaGF0IGlzLCB3aXRob3V0IGNoYW5naW5nIGxhYmVsIHZhbHVlcyBpbiBkaWZmZXJlbnQgcGFzc2VzLgotICAgKi8KLSAgaWYgKChnb29mZWQgPSAoKnYudml0X2Vycm9yKSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgZHVlIHRvIFwiJXNcIiIpLCB2LnZpdF9lcnJvcik7Ci0gICAgfQotICAvKgotICAgKiBXZSBuZWVkIHRvIHVzZSBleHByZXNzaW9uKCkgYW5kIGZyaWVuZHMsIHdoaWNoIHJlcXVpcmUgdXMgdG8gZGlkZGxlCi0gICAqIGlucHV0X2xpbmVfcG9pbnRlci4gU28gd2Ugc2F2ZSBpdCBhbmQgcmVzdG9yZSBpdCBsYXRlci4KLSAgICovCi0gIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBmb3IgKG9wZXJhbmRQID0gdi52aXRfb3BlcmFuZCwKLSAgICAgICBleHBQID0gZXhwX29mX29wZXJhbmQsCi0gICAgICAgc2VnUCA9IHNlZ19vZl9vcGVyYW5kLAotICAgICAgIGZsb2F0UCA9IGZsb2F0X29wZXJhbmQsCi0gICAgICAgZW5kX29wZXJhbmRQID0gdi52aXRfb3BlcmFuZCArIHYudml0X29wZXJhbmRzOwotCi0gICAgICAgb3BlcmFuZFAgPCBlbmRfb3BlcmFuZFA7Ci0KLSAgICAgICBvcGVyYW5kUCsrLCBleHBQKyssIHNlZ1ArKywgZmxvYXRQKyspCi0gICAgewkJCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCi0gICAgICBpZiAob3BlcmFuZFAtPnZvcF9lcnJvcikKLQl7Ci0JICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgYmVjYXVzZSBcIiVzXCIiKSwgb3BlcmFuZFAtPnZvcF9lcnJvcik7Ci0JICBnb29mZWQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzdGF0ZW1lbnQgaGFzIG5vIHN5bnRheCBnb29mczogbGV0cyBzbmlmZiB0aGUgZXhwcmVzc2lvbiAqLwotCSAgaW50IGNhbl9iZV9zaG9ydCA9IDA7CS8qIDEgaWYgYSBiaWdudW0gY2FuIGJlIHJlZHVjZWQgdG8gYSBzaG9ydCBsaXRlcmFsLiAqLwotCi0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcGVyYW5kUC0+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/ICBGSVhNRS1TT09OKSAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLS8qIGVuZCBvZiB0Yy12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12YXguaCBiL2dhcy9jb25maWcvdGMtdmF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzkxZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12YXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIHRjLXZheC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy12YXguYy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfVkFYIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgTk9fUkVMT0MgMAotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDEKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotbG9uZyBtZF9jaGFyc190b19udW1iZXIgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLXZheC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXc2NS5jIGIvZ2FzL2NvbmZpZy90Yy13NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3ZWIwZi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0vKiB0Yy13NjUuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgVzY1ODE2Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICAgc2FjQGN5Z251cy5jb20KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiLi4vb3Bjb2Rlcy93NjUtb3BjLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7Ci1DT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiEjIjsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gKi8KLQotI2RlZmluZSBPUF9CQ0MJMHg5MAotI2RlZmluZSBPUF9CQ1MJMHhCMAotI2RlZmluZSBPUF9CRVEJMHhGMAotI2RlZmluZSBPUF9CTUkJMHgzMAotI2RlZmluZSBPUF9CTkUJMHhEMAotI2RlZmluZSBPUF9CUEwJMHgxMAotI2RlZmluZSBPUF9CUkEJMHg4MAotI2RlZmluZSBPUF9CUkwJMHg4MgotI2RlZmluZSBPUF9CVkMJMHg1MAotI2RlZmluZSBPUF9CVlMJMHg3MAotCi12b2lkIHNfbG9uZ2EgKCk7Ci1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDJ9LAotICB7IndvcmQiLCBjb25zLCAyfSwKLSAgeyJsb25nYSIsIHNfbG9uZ2EsIDB9LAotICB7ImxvbmdpIiwgc19sb25nYSwgMX0sCi0gIHswLCAwLCAwfQotfTsKLQotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfYWxpZ25fYnl0ZXMgKCk7Ci0KLQotLyppbnQgbWRfcmVsb2Nfc2l6ZTsgKi8KLQotc3RhdGljIGludCByZWxheDsJCS8qIHNldCBpZiAtcmVsYXggc2VlbiAqLwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0KLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotaW50IE07CQkJCS8qIE0gZmxhZyAqLwotaW50IFg7CQkJCS8qIFggZmxhZyAqLwotCi0KLQotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0KLSNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj4yKSkKLQotI2RlZmluZSBCWVRFX0RJU1AgMQotI2RlZmluZSBXT1JEX0RJU1AgMgotI2RlZmluZSBVTkRFRl9CWVRFX0RJU1AgMAotI2RlZmluZSBVTkRFRl9XT1JEX0RJU1AgMwotCi0jZGVmaW5lIENPTkRfQlJBTkNIIAkxCi0jZGVmaW5lIFVOQ09ORF9CUkFOQ0ggICAyCi0jZGVmaW5lIEVORCAJMwotCi0jZGVmaW5lIEJZVEVfRiAxMjcJCS8qIEhvdyBmYXIgd2UgY2FuIGJyYW5jaCBmb3J3YXJkcyAqLwotI2RlZmluZSBCWVRFX0IgLTEyNgkJLyogSG93IGZhciB3ZSBjYW4gYnJhbmNoIGJhY2t3YXJkcyAqLwotI2RlZmluZSBXT1JEX0YgMzI3NjcKLSNkZWZpbmUgV09SRF9CIDMyNzY4Ci0KLXJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldOwotCi0vKgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKLSAqLwotCi0KLXZvaWQKLXNfbG9uZ2EgKHhtb2RlKQotewotICBpbnQgKnAgPSB4bW9kZSA/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+ZnJfYWRkcmVzcyAtIDE7Ci0gIHJldHVybiBnYXA7Ci19Ci0KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoeCkKLSAgICBzeW1ib2xTICp4OwotewotfQotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeF9wdHIpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci17Ci0gIHJldHVybiBmaXhfcHRyLT5meF9yX3R5cGU7Ci19Ci0KLXZvaWQKLXRjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKLSAgICAgZml4UyAqZml4X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOwotICAgICBiZmRfdm1hIGJhc2U7Ci0KLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKLQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU04OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZml4X3B0ci0+Znhfc2l6ZSA9PSA0KQotCWludHItPnJfdHlwZSA9IFJfVzY1X0FCUzI0OwotICAgICAgZWxzZQotCWludHItPnJfdHlwZSA9IGZpeF9wdHItPmZ4X3JfdHlwZTsKLSAgICB9Ci0KLSAgaW50ci0+cl92YWRkciA9IGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZSArIGJhc2U7Ci0gIGludHItPnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotCi0gIC8qIFR1cm4gdGhlIHNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpbnRvIGFuIG9mZnNldC4gICovCi0gIGlmIChzeW1ib2xfcHRyKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmRvdDsKLQotICAgICAgZG90ID0gc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpXS5kb3Q7Ci0gICAgICBpZiAoZG90KQotCXsKLQkgIGludHItPnJfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW1ib2xfcHRyKTsKLQkgIGludHItPnJfc3ltbmR4ID0gZG90LT5zeV9udW1iZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotICAgIH0KLX0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW2ZyYWctPmZyX3N1YnR5cGVdLnJseF9sZW5ndGg7Ci19Ci0KLQotCi0KLQotLyoKLWNhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24sIHJldHVybiB0aGUgbGVuZ3RoCi1ieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uCi0qLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBVTkRFRl9CWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoVU5DT05EX0JSQU5DSCwgVU5ERUZfQllURV9ESVNQKToKLSAgICAgIC8qIHVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duICovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKLQkgc2l6ZWQgLSBtYXliZSBpdCB3aWxsIGZpeCB1cCAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBCWVRFX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIEJZVEVfRElTUCldLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoOwotCX0KLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0KLQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl9SRUxBWCAoT1BUSU9OX01EX0JBU0UpCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotCi19Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdzY1LmggYi9nYXMvY29uZmlnL3RjLXc2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzk0YWQyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdzY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtdzY1LmgKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIFRDX1c2NQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQotCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX3c2NQotI2RlZmluZSBDT0ZGX01BR0lDIDB4NjUwMAotCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIlc2NTgxNiBHQVMgIgotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0jZGVmaW5lIFJFTE9DXzMyIDEyMzQKLQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSB3NjVfZXhwcmVzc2lvbiAoRVhQLCBOQllURVMpCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQotI2RlZmluZSBUQ19DT05TX1JFTE9DIHRjX2NvbnNfcmVsb2MKLSNkZWZpbmUgRE9OVF9PVkVSRkxPVwotaW50IHRjX2NvbnNfcmVsb2M7Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBlbmQgb2YgdGMtdzY1LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtejhrLmMgYi9nYXMvY29uZmlnL3RjLXo4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODliMTRiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtejhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg5ICswLDAgQEAKLS8qIHRjLXo4ay5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBaaWxvZyBaODAwbgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICBzYWNAY3lnbnVzLmNvbQotICAqLwotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAib3Bjb2Rlcy96OGstb3BjLmgiCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0KLXsnIScsIDB9OwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0KLXsnOycsIDB9OwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9Ci17JyMnLCAwfTsKLQotZXh0ZXJuIGludCBtYWNoaW5lOwotZXh0ZXJuIGludCBjb2ZmX2ZsYWdzOwotaW50IHNlZ21lbnRlZF9tb2RlOwotY29uc3QgaW50IG1kX3JlbG9jX3NpemU7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotdm9pZCBjb25zICgpOwotCi12b2lkCi1zX3NlZ20gKCkKLXsKLSAgc2VnbWVudGVkX21vZGUgPSAxOwotICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDE7Ci0gIGNvZmZfZmxhZ3MgPSBGX1o4MDAxOwotfQotCi12b2lkCi1zX3Vuc2VnICgpCi17Ci0gIHNlZ21lbnRlZF9tb2RlID0gMDsKLSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAyOwotICBjb2ZmX2ZsYWdzID0gRl9aODAwMjsKLX0KLQotc3RhdGljCi12b2lkCi1ldmVuICgpCi17Ci0gIGZyYWdfYWxpZ24gKDEsIDAsIDApOwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLX0KLQotdm9pZCBvYmpfY29mZl9zZWN0aW9uICgpOwotCi1pbnQKLXRvaGV4IChjKQotICAgICBpbnQgYzsKLXsKLSAgaWYgKGlzZGlnaXQgKGMpKQotICAgIHJldHVybiBjIC0gJzAnOwotICBpZiAoaXNsb3dlciAoYykpCi0gICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKLSAgcmV0dXJuIGMgLSAnQScgKyAxMDsKLX0KLQotdm9pZAotc3ZhbCAoKQotewotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLSAgICB7Ci0gICAgICBpbnQgYzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHdoaWxlIChjICE9ICdcJycpCi0JewotCSAgaWYgKGMgPT0gJyUnKQotCSAgICB7Ci0JICAgICAgYyA9ICh0b2hleCAoaW5wdXRfbGluZV9wb2ludGVyWzBdKSA8PCA0KQotCQl8IHRvaGV4IChpbnB1dF9saW5lX3BvaW50ZXJbMV0pOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgICB9Ci0JICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotCSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLQotfQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCAyfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ6ODAwMSIsIHNfc2VnbSwgMH0sCi0gIHsiejgwMDIiLCBzX3Vuc2VnLCAwfSwKLQotCi0gIHsic2VnbSIsIHNfc2VnbSwgMH0sCi0gIHsidW5zZWdtIiwgc191bnNlZywgMH0sCi0gIHsidW5zZWciLCBzX3Vuc2VnLCAwfSwKLSAgeyJuYW1lIiwgc19hcHBfZmlsZSwgMH0sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsid3ZhbCIsIGNvbnMsIDJ9LAotICB7Imx2YWwiLCBjb25zLCA0fSwKLSAgeyJidmFsIiwgY29ucywgMX0sCi0gIHsic3ZhbCIsIHN2YWwsIDB9LAotICB7InJzZWN0Iiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7ImJsb2NrIiwgc19zcGFjZSwgMH0sCi0gIHsiZXZlbiIsIGV2ZW4sIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIG9wY29kZV9lbnRyeV90eXBlICpvcGNvZGU7Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICBpbnQgaWR4ID0gMDsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgZm9yIChvcGNvZGUgPSB6OGtfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgLyogT25seSBlbnRlciB1bmlxdWUgY29kZXMgaW50byB0aGUgdGFibGUgKi8KLSAgICAgIGNoYXIgKnNyYyA9IG9wY29kZS0+bmFtZTsKLQotICAgICAgaWYgKHN0cmNtcCAob3Bjb2RlLT5uYW1lLCBwcmV2X25hbWUpKQotCXsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0JICBpZHgrKzsKLQl9Ci0gICAgICBvcGNvZGUtPmlkeCA9IGlkeDsKLSAgICAgIHByZXZfbmFtZSA9IG9wY29kZS0+bmFtZTsKLSAgICB9Ci0KLSAgLyogZGVmYXVsdCB0byB6ODAwMiAqLwotICBzX3Vuc2VnICgpOwotCi0gIC8qIGluc2VydCB0aGUgcHNldWRvIG9wcyB0b28gKi8KLSAgZm9yIChpZHggPSAwOyBtZF9wc2V1ZG9fdGFibGVbaWR4XS5wb2NfbmFtZTsgaWR4KyspCi0gICAgewotICAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKmZha2Vfb3Bjb2RlOwotICAgICAgZmFrZV9vcGNvZGUgPSAob3Bjb2RlX2VudHJ5X3R5cGUgKikgbWFsbG9jIChzaXplb2YgKG9wY29kZV9lbnRyeV90eXBlKSk7Ci0gICAgICBmYWtlX29wY29kZS0+bmFtZSA9IG1kX3BzZXVkb190YWJsZVtpZHhdLnBvY19uYW1lLAotCWZha2Vfb3Bjb2RlLT5mdW5jID0gKHZvaWQgKikgKG1kX3BzZXVkb190YWJsZSArIGlkeCk7Ci0gICAgICBmYWtlX29wY29kZS0+b3Bjb2RlID0gMjUwOwotICAgICAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIGZha2Vfb3Bjb2RlLT5uYW1lLCBmYWtlX29wY29kZSk7Ci0gICAgfQotCi0gIGxpbmtyZWxheCA9IDE7Ci19Ci0KLXN0cnVjdCB6OGtfZXhwCi17Ci0gIGNoYXIgKmVfYmVnOwotICBjaGFyICplX2VuZDsKLSAgZXhwcmVzc2lvblMgZV9leHA7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgejhrX29wCi17Ci0gIGNoYXIgcmVnc2l6ZTsJCQkvKiAnYicsJ3cnLCdyJywncScgKi8KLSAgdW5zaWduZWQgaW50IHJlZzsJCS8qIDAuLjE1ICovCi0KLSAgaW50IG1vZGU7Ci0KLSAgdW5zaWduZWQgaW50IHhfcmVnOwkJLyogYW55IG90aGVyIHJlZ2lzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZSAqLwotICBleHByZXNzaW9uUyBleHA7CQkvKiBhbnkgZXhwcmVzc2lvbiAqLwotfQotCi1vcF90eXBlOwotCi1zdGF0aWMgZXhwcmVzc2lvblMgKmRhX29wZXJhbmQ7Ci1zdGF0aWMgZXhwcmVzc2lvblMgKmltbV9vcGVyYW5kOwotCi1pbnQgcmVnWzE2XTsKLWludCB0aGVfY2M7Ci1pbnQgdGhlX2N0cmw7Ci1pbnQgdGhlX2ZsYWdzOwotaW50IHRoZV9pbnRlcnJ1cHQ7Ci0KLWNoYXIgKgotREVGVU4gKHdoYXRyZWcsIChyZWcsIHNyYyksCi0gICAgICAgaW50ICpyZWcgQU5ECi0gICAgICAgY2hhciAqc3JjKQotewotICBpZiAoaXNkaWdpdCAoc3JjWzFdKSkKLSAgICB7Ci0gICAgICAqcmVnID0gKHNyY1swXSAtICcwJykgKiAxMCArIHNyY1sxXSAtICcwJzsKLSAgICAgIHJldHVybiBzcmMgKyAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyZWcgPSAoc3JjWzBdIC0gJzAnKTsKLSAgICAgIHJldHVybiBzcmMgKyAxOwotICAgIH0KLX0KLQotLyoKLSAgcGFyc2Ugb3BlcmFuZHMKLQotICByaDAtcmg3LCBybDAtcmw3Ci0gIHIwLXIxNQotICBycjAtcnIxNAotICBycTAtLXJxMTIKLSAgV1JFRyByMCxyMSxyMixyMyxyNCxyNSxyNixyNyxmcCxzcAotICByMGwscjBoLC4ucjdsLHI3aAotICBAV1JFRwotICBAV1JFRysKLSAgQC1XUkVHCi0gICNjb25zdAotCi0gICovCi0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLWNoYXIgKgotREVGVU4gKHBhcnNlX3JlZywgKHNyYywgbW9kZSwgcmVnKSwKLSAgICAgICBjaGFyICpzcmMgQU5ECi0gICAgICAgaW50ICptb2RlIEFORAotICAgICAgIHVuc2lnbmVkIGludCAqcmVnKQotewotICBjaGFyICpyZXMgPSAwOwotICBjaGFyIHJlZ25vOwotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgaWYgKHNlZ21lbnRlZF9tb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfTE9ORzsKLSAgICAgICAgICAqcmVnID0gMTQ7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX1dPUkQ7Ci0gICAgICAgICAgKnJlZyA9IDE1OwotICAgICAgICB9Ci0gICAgICByZXR1cm4gc3JjICsgMjsKLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMV0gPT0gJ3InKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfTE9ORzsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gMTQpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJyJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNyY1sxXSA9PSAnaCcpCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19CWVRFOwotICAgICAgICAgIHJlcyA9IHdoYXRyZWcgKHJlZywgc3JjICsgMik7Ci0JICByZWdubyA9ICpyZWc7Ci0JICBpZiAocmVnbm8gPiA3KQotICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciByaCVkLCBvdXQgb2YgcmFuZ2UuIikscmVnbm8pOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChzcmNbMV0gPT0gJ2wnKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfQllURTsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gNykKLSAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgcmwlZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgICAqcmVnICs9IDg7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNyY1sxXSA9PSAncScpCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19RVUFEOwotICAgICAgICAgIHJlcyA9IHdoYXRyZWcgKHJlZywgc3JjICsgMik7Ci0JICByZWdubyA9ICpyZWc7Ci0JICBpZiAocmVnbm8gPiAxMikKLSAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgcnElZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfV09SRDsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDEpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gMTUpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHIlZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHJlczsKLQotfQotCi1jaGFyICoKLURFRlVOIChwYXJzZV9leHAsIChzLCBvcCksCi0gICAgICAgY2hhciAqcyBBTkQKLSAgICAgICBleHByZXNzaW9uUyAqIG9wKQotewotICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyICpuZXc7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgZXhwcmVzc2lvbiAob3ApOwotICBpZiAob3AtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogVGhlIG1hbnkgZm9ybXMgb2Ygb3BlcmFuZDoKLQotICAgPHJiPgotICAgPHI+Ci0gICA8cnI+Ci0gICA8cnE+Ci0gICBAcgotICAgI2V4cAotICAgZXhwCi0gICBleHAocikKLSAgIHIoI2V4cCkKLSAgIHIocikKLQotCi0KLSAgICovCi0KLXN0YXRpYwotY2hhciAqCi1ERUZVTiAoY2hlY2tmb3IsIChwdHIsIHdoYXQpLAotICAgICAgIGNoYXIgKnB0ciBBTkQKLSAgICAgICBjaGFyIHdoYXQpCi17Ci0gIGlmICgqcHRyID09IHdoYXQpCi0gICAgcHRyKys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkICVjIiksIHdoYXQpOwotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogTWFrZSBzdXJlIHRoZSBtb2RlIHN1cHBsaWVkIGlzIHRoZSBzaXplIG9mIGEgd29yZCAqLwotc3RhdGljIHZvaWQKLURFRlVOIChyZWd3b3JkLCAobW9kZSwgc3RyaW5nKSwKLSAgICAgICBpbnQgbW9kZSBBTkQKLSAgICAgICBjaGFyICpzdHJpbmcpCi17Ci0gIGludCBvazsKLQotICBvayA9IENMQVNTX1JFR19XT1JEOwotICBpZiAob2sgIT0gbW9kZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGEgd29yZCAlcyIpLCBzdHJpbmcpOwotICAgIH0KLX0KLQotLyogTWFrZSBzdXJlIHRoZSBtb2RlIHN1cHBsaWVkIGlzIHRoZSBzaXplIG9mIGFuIGFkZHJlc3MgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocmVnYWRkciwgKG1vZGUsIHN0cmluZyksCi0gICAgICAgaW50IG1vZGUgQU5ECi0gICAgICAgY2hhciAqc3RyaW5nKQotewotICBpbnQgb2s7Ci0KLSAgb2sgPSBzZWdtZW50ZWRfbW9kZSA/IENMQVNTX1JFR19MT05HIDogQ0xBU1NfUkVHX1dPUkQ7Ci0gIGlmIChvayAhPSBtb2RlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygicmVnaXN0ZXIgaXMgd3Jvbmcgc2l6ZSBmb3IgYWRkcmVzcyAlcyIpLCBzdHJpbmcpOwotICAgIH0KLX0KLQotc3RydWN0IGN0cmxfbmFtZXMKLXsKLSAgIGludCB2YWx1ZTsKLSAgIGNoYXIgKm5hbWU7Ci19OwotCi1zdHJ1Y3QgY3RybF9uYW1lcyBjdHJsX3RhYmxlW10gPQotewotICAgMHgyLCAiZmN3IiwKLSAgIDBYMywgInJlZnJlc2giLAotICAgMHg0LCAicHNhcHNlZyIsCi0gICAweDUsICJwc2Fwb2ZmIiwKLSAgIDB4NSwgInBzYXAiLAotICAgMHg2LCAibnNwc2VnIiwKLSAgIDB4NywgIm5zcG9mZiIsCi0gICAweDcsICJuc3AiLAotICAgMCwgMAotfTsKLSAgIAotc3RhdGljIHZvaWQKLURFRlVOIChnZXRfY3RybF9vcGVyYW5kLCAocHRyLCBtb2RlLCBkc3QpLAotICAgICAgIGNoYXIgKipwdHIgQU5ECi0gICAgICAgc3RydWN0IHo4a19vcCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgZHN0KQotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgcjsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKCpzcmMgPT0gJyAnKQotICAgIHNyYysrOwotCi0gIG1vZGUtPm1vZGUgPSBDTEFTU19DVFJMOwotICBmb3IgKGkgPSAwOyBjdHJsX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgY3RybF90YWJsZVtpXS5uYW1lW2pdOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3RybF90YWJsZVtpXS5uYW1lW2pdICE9IHNyY1tqXSkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgdGhlX2N0cmwgPSBjdHJsX3RhYmxlW2ldLnZhbHVlOwotICAgICAgKnB0ciA9IHNyYyArIGo7Ci0gICAgICByZXR1cm47Ci0gICAgZmFpbDo7Ci0gICAgfQotICB0aGVfY3RybCA9IDA7Ci0gIHJldHVybjsKLX0KLQotc3RydWN0IGZsYWdfbmFtZXMKLXsKLSAgaW50IHZhbHVlOwotICBjaGFyICpuYW1lOwotCi19OwotCi1zdHJ1Y3QgZmxhZ19uYW1lcyBmbGFnX3RhYmxlW10gPQotewotICAweDEsICJwIiwKLSAgMHgxLCAidiIsCi0gIDB4MiwgInMiLAotICAweDQsICJ6IiwKLSAgMHg4LCAiYyIsCi0gIDB4MCwgIisiLAotICAwLCAwCi19OwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGdldF9mbGFnc19vcGVyYW5kLCAocHRyLCBtb2RlLCBkc3QpLAotICAgICAgIGNoYXIgKipwdHIgQU5ECi0gICAgICAgc3RydWN0IHo4a19vcCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgZHN0KQotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgcjsKLSAgaW50IGk7Ci0gIGludCBqOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLQotICBtb2RlLT5tb2RlID0gQ0xBU1NfRkxBR1M7Ci0gIHRoZV9mbGFncyA9IDA7Ci0gIGZvciAoaiA9IDA7IGogPD0gOTsgaisrKQotICAgIHsKLSAgICAgaWYgKCFzcmNbal0pCi0JZ290byBkb25lOwotICAgICBmb3IgKGkgPSAwOyBmbGFnX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChmbGFnX3RhYmxlW2ldLm5hbWVbMF0gPT0gc3JjW2pdKQotCQl7Ci0JICAgICAgICB0aGVfZmxhZ3MgPSB0aGVfZmxhZ3MgfCBmbGFnX3RhYmxlW2ldLnZhbHVlOwotCQlnb3RvIG1hdGNoOwotCQl9Ci0gICAgICAgIH0KLSAgICAgIGdvdG8gZG9uZTsKLSAgICBtYXRjaDoKLSAgICAgOwotICAgIH0KLSAgZG9uZToKLSAgKnB0ciA9IHNyYyArIGo7Ci0gIHJldHVybjsKLX0KLQotCi1zdHJ1Y3QgaW50ZXJydXB0X25hbWVzCi17Ci0gIGludCB2YWx1ZTsKLSAgY2hhciAqbmFtZTsKLQotfTsKLQotc3RydWN0IGludGVycnVwdF9uYW1lcyBpbnRyX3RhYmxlW10gPQotewotICAweDEsICJudmkiLAotICAweDIsICJ2aSIsCi0gIDB4MywgImJvdGgiLAotICAweDMsICJhbGwiLAotICAwLCAwCi19OwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGdldF9pbnRlcnJ1cHRfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKLSAgICAgICBjaGFyICoqcHRyIEFORAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGRzdCkKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IHI7Ci0gIGludCBpOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLQotICBtb2RlLT5tb2RlID0gQ0xBU1NfSU1NOwotICBmb3IgKGkgPSAwOyBpbnRyX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgaW50cl90YWJsZVtpXS5uYW1lW2pdOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW50cl90YWJsZVtpXS5uYW1lW2pdICE9IHNyY1tqXSkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgdGhlX2ludGVycnVwdCA9IGludHJfdGFibGVbaV0udmFsdWU7Ci0gICAgICAqcHRyID0gc3JjICsgajsKLSAgICAgIHJldHVybjsKLSAgICBmYWlsOjsKLSAgICB9Ci0gIHRoZV9pbnRlcnJ1cHQgPSAweDA7Ci0gIHJldHVybjsKLX0KLQotc3RydWN0IGNjX25hbWVzCi17Ci0gIGludCB2YWx1ZTsKLSAgY2hhciAqbmFtZTsKLQotfTsKLQotc3RydWN0IGNjX25hbWVzIHRhYmxlW10gPQotewotICAweDAsICJmIiwKLSAgMHgxLCAibHQiLAotICAweDIsICJsZSIsCi0gIDB4MywgInVsZSIsCi0gIDB4NCwgIm92IiwKLSAgMHg0LCAicGUiLAotICAweDUsICJtaSIsCi0gIDB4NiwgImVxIiwKLSAgMHg2LCAieiIsCi0gIDB4NywgImMiLAotICAweDcsICJ1bHQiLAotICAweDgsICJ0IiwKLSAgMHg5LCAiZ2UiLAotICAweGEsICJndCIsCi0gIDB4YiwgInVndCIsCi0gIDB4YywgIm5vdiIsCi0gIDB4YywgInBvIiwKLSAgMHhkLCAicGwiLAotICAweGUsICJuZSIsCi0gIDB4ZSwgIm56IiwKLSAgMHhmLCAibmMiLAotICAweGYsICJ1Z2UiLAotICAwLCAwCi19OwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGdldF9jY19vcGVyYW5kLCAocHRyLCBtb2RlLCBkc3QpLAotICAgICAgIGNoYXIgKipwdHIgQU5ECi0gICAgICAgc3RydWN0IHo4a19vcCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgZHN0KQotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgcjsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKCpzcmMgPT0gJyAnKQotICAgIHNyYysrOwotCi0gIG1vZGUtPm1vZGUgPSBDTEFTU19DQzsKLSAgZm9yIChpID0gMDsgdGFibGVbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGludCBqOwotCi0gICAgICBmb3IgKGogPSAwOyB0YWJsZVtpXS5uYW1lW2pdOyBqKyspCi0JewotCSAgaWYgKHRhYmxlW2ldLm5hbWVbal0gIT0gc3JjW2pdKQotCSAgICBnb3RvIGZhaWw7Ci0JfQotICAgICAgdGhlX2NjID0gdGFibGVbaV0udmFsdWU7Ci0gICAgICAqcHRyID0gc3JjICsgajsKLSAgICAgIHJldHVybjsKLSAgICBmYWlsOjsKLSAgICB9Ci0gIHRoZV9jYyA9IDB4ODsKLX0KLQotc3RhdGljIHZvaWQKLWdldF9vcGVyYW5kIChwdHIsIG1vZGUsIGRzdCkKLSAgICAgY2hhciAqKnB0cjsKLSAgICAgc3RydWN0IHo4a19vcCAqbW9kZTsKLSAgICAgdW5zaWduZWQgaW50IGRzdDsKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgY2hhciAqZW5kOwotICB1bnNpZ25lZCBpbnQgbnVtOwotICB1bnNpZ25lZCBpbnQgbGVuOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotICBtb2RlLT5tb2RlID0gMDsKLQotICB3aGlsZSAoKnNyYyA9PSAnICcpCi0gICAgc3JjKys7Ci0gIGlmICgqc3JjID09ICcjJykKLSAgICB7Ci0gICAgICBtb2RlLT5tb2RlID0gQ0xBU1NfSU1NOwotICAgICAgaW1tX29wZXJhbmQgPSAmKG1vZGUtPmV4cCk7Ci0gICAgICBzcmMgPSBwYXJzZV9leHAgKHNyYyArIDEsICYobW9kZS0+ZXhwKSk7Ci0gICAgfQotICBlbHNlIGlmICgqc3JjID09ICdAJykKLSAgICB7Ci0gICAgICBpbnQgZDsKLQotICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX0lSOwotICAgICAgc3JjID0gcGFyc2VfcmVnIChzcmMgKyAxLCAmZCwgJm1vZGUtPnJlZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IHJlZ247Ci0KLSAgICAgIGVuZCA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZS0+bW9kZSwgJnJlZ24pOwotCi0gICAgICBpZiAoZW5kKQotCXsKLQkgIGludCBudywgbnI7Ci0KLQkgIHNyYyA9IGVuZDsKLQkgIGlmICgqc3JjID09ICcoJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIGVuZCA9IHBhcnNlX3JlZyAoc3JjLCAmbncsICZucik7Ci0JICAgICAgaWYgKGVuZCkKLQkJewotCQkgIC8qIEdvdCBSYShSYikgKi8KLQkJICBzcmMgPSBlbmQ7Ci0KLQkJICBpZiAoKnNyYyAhPSAnKScpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiTWlzc2luZyApIGluIHJhKHJiKSIpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHNyYysrOwotCQkgICAgfQotCi0JCSAgcmVnYWRkciAobW9kZS0+bW9kZSwgInJhKHJiKSByYSIpOwotLyoJCSAgcmVnd29yZCAobW9kZS0+bW9kZSwgInJhKHJiKSByYiIpOyovCi0JCSAgbW9kZS0+bW9kZSA9IENMQVNTX0JYOwotCQkgIG1vZGUtPnJlZyA9IHJlZ247Ci0JCSAgbW9kZS0+eF9yZWcgPSBucjsKLQkJICByZWdbQVJHX1JYXSA9IG5yOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR290IFJhKGRpc3ApICovCi0JCSAgaWYgKCpzcmMgPT0gJyMnKQotCQkgICAgc3JjKys7Ci0JCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICYobW9kZS0+ZXhwKSk7Ci0JCSAgc3JjID0gY2hlY2tmb3IgKHNyYywgJyknKTsKLQkJICBtb2RlLT5tb2RlID0gQ0xBU1NfQkE7Ci0JCSAgbW9kZS0+cmVnID0gcmVnbjsKLQkJICBtb2RlLT54X3JlZyA9IDA7Ci0JCSAgaW1tX29wZXJhbmQgPSAmKG1vZGUtPmV4cCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbW9kZS0+cmVnID0gcmVnbjsKLQkgICAgICBtb2RlLT54X3JlZyA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gaW5pdGlhbCByZWcgKi8KLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmKG1vZGUtPmV4cCkpOwotCSAgaWYgKCpzcmMgPT0gJygnKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgZW5kID0gcGFyc2VfcmVnIChzcmMsICYobW9kZS0+bW9kZSksICZyZWduKTsKLQkgICAgICByZWd3b3JkIChtb2RlLT5tb2RlLCAiYWRkcihSYSkgcmEiKTsKLQkgICAgICBtb2RlLT5tb2RlID0gQ0xBU1NfWDsKLQkgICAgICBtb2RlLT5yZWcgPSByZWduOwotCSAgICAgIG1vZGUtPnhfcmVnID0gMDsKLQkgICAgICBkYV9vcGVyYW5kID0gJihtb2RlLT5leHApOwotCSAgICAgIHNyYyA9IGNoZWNrZm9yIChlbmQsICcpJyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEp1c3QgYW4gYWRkcmVzcyAqLwotCSAgICAgIG1vZGUtPm1vZGUgPSBDTEFTU19EQTsKLQkgICAgICBtb2RlLT5yZWcgPSAwOwotCSAgICAgIG1vZGUtPnhfcmVnID0gMDsKLQkgICAgICBkYV9vcGVyYW5kID0gJihtb2RlLT5leHApOwotCSAgICB9Ci0JfQotICAgIH0KLSAgKnB0ciA9IHNyYzsKLX0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAob3Bjb2RlLCBvcF9lbmQsIG9wZXJhbmQpCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpvcGNvZGU7Ci0gICAgIGNoYXIgKm9wX2VuZDsKLSAgICAgb3BfdHlwZSAqb3BlcmFuZDsKLXsKLSAgY2hhciAqcHRyID0gb3BfZW5kOwotY2hhciAqc2F2cHRyOwotICBzd2l0Y2ggKG9wY29kZS0+bm9wZXJhbmRzKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBvcGVyYW5kWzBdLm1vZGUgPSAwOwotICAgICAgb3BlcmFuZFsxXS5tb2RlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgcHRyKys7Ci0gICAgICBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSBDTEFTU19DQykKLSAgICAgICAgewotICAgICAgICAgIGdldF9jY19vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gQ0xBU1NfRkxBR1MpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfZmxhZ3Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IChDTEFTU19JTU0gKyhBUkdfSU1NMikpKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X2ludGVycnVwdF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIG9wZXJhbmRbMV0ubW9kZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIHB0cisrOwotICAgICAgc2F2cHRyID0gcHRyOwotICAgICAgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gQ0xBU1NfQ0MpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfY2Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0NUUkwpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZ2V0X2N0cmxfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICAgICAgICAgaWYgKHRoZV9jdHJsID09IDApCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBwdHIgPSBzYXZwdHI7Ci0gICAgICAgICAgICAgICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICBpZiAocHRyID09IDApCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgaWYgKCpwdHIgPT0gJywnKQotICAgICAgICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgICAgZ2V0X2N0cmxfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEpOwotICAgICAgICAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBpZiAocHRyID09IDApCi0gICAgICAgIHJldHVybjsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLSAgICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAyLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMiwgMik7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfY2Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDMsIDMpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gICAqLwotCi1zdGF0aWMKLW9wY29kZV9lbnRyeV90eXBlICoKLURFRlVOIChnZXRfc3BlY2lmaWMsIChvcGNvZGUsIG9wZXJhbmRzKSwKLSAgICAgICBvcGNvZGVfZW50cnlfdHlwZSAqIG9wY29kZSBBTkQKLSAgICAgICBvcF90eXBlICogb3BlcmFuZHMpCi0KLXsKLSAgb3Bjb2RlX2VudHJ5X3R5cGUgKnRoaXNfdHJ5ID0gb3Bjb2RlOwotICBpbnQgZm91bmQgPSAwOwotICB1bnNpZ25lZCBpbnQgbm9wZXJhbmRzID0gb3Bjb2RlLT5ub3BlcmFuZHM7Ci0KLSAgdW5zaWduZWQgaW50IGRpc3ByZWc7Ci0gIHVuc2lnbmVkIGludCB0aGlzX2luZGV4ID0gb3Bjb2RlLT5pZHg7Ci0KLSAgd2hpbGUgKHRoaXNfaW5kZXggPT0gb3Bjb2RlLT5pZHggJiYgIWZvdW5kKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICB0aGlzX3RyeSA9IG9wY29kZSsrOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5vcGVyYW5kczsgaSsrKQotCXsKLQkgIGludCBtb2RlID0gb3BlcmFuZHNbaV0ubW9kZTsKLQotCSAgaWYgKChtb2RlICYgQ0xBU1NfTUFTSykgIT0gKHRoaXNfdHJ5LT5hcmdfaW5mb1tpXSAmIENMQVNTX01BU0spKQotCSAgICB7Ci0JICAgICAgLyogaXQgY291bGQgYmUgYW4gcGMgcmVsIG9wZXJhbmQsIGlmIHRoaXMgaXMgYSBkYSBtb2RlIGFuZAotCSAgIHdlIGxpa2UgZGlzcHMsIHRoZW4gaW5zZXJ0IGl0ICovCi0KLQkgICAgICBpZiAobW9kZSA9PSBDTEFTU19EQSAmJiB0aGlzX3RyeS0+YXJnX2luZm9baV0gPT0gQ0xBU1NfRElTUCkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGNhc2UgKi8KLQkJICBvcGVyYW5kc1tpXS5tb2RlID0gQ0xBU1NfRElTUDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG1vZGUgPT0gQ0xBU1NfQkEgJiYgdGhpc190cnktPmFyZ19pbmZvW2ldKQotCQl7Ci0JCSAgLyogQ2FuJ3QgdGhpbmsgb2YgYSB3YXkgdG8gdHVybiB3aGF0IHdlJ3ZlIGJlZW4gZ2l2ZW4gaW50bwotCSAgICAgc29tZXRoaW5nIHRoYXQncyBvayAqLwotCQkgIGdvdG8gZmFpbDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHRoaXNfdHJ5LT5hcmdfaW5mb1tpXSAmIENMQVNTX1BSKQotCQl7Ci0JCSAgaWYgKG1vZGUgPT0gQ0xBU1NfUkVHX0xPTkcgJiYgc2VnbWVudGVkX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIG9rICovCi0JCSAgICB9Ci0JCSAgZWxzZSBpZiAobW9kZSA9PSBDTEFTU19SRUdfV09SRCAmJiAhc2VnbWVudGVkX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIG9rICovCi0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZ290byBmYWlsOwotCQl9Ci0JICAgICAgZWxzZQotCQlnb3RvIGZhaWw7Ci0JICAgIH0KLQkgIHN3aXRjaCAobW9kZSAmIENMQVNTX01BU0spCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU19YOgotCSAgICBjYXNlIENMQVNTX0lSOgotCSAgICBjYXNlIENMQVNTX0JBOgotCSAgICBjYXNlIENMQVNTX0JYOgotCSAgICBjYXNlIENMQVNTX0RJU1A6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHOgotCSAgICBjYXNlIENMQVNTX1JFR19XT1JEOgotCSAgICBjYXNlIENMQVNTX1JFR19CWVRFOgotCSAgICBjYXNlIENMQVNTX1JFR19RVUFEOgotCSAgICBjYXNlIENMQVNTX1JFR19MT05HOgotCSAgICBjYXNlIENMQVNTX1JFR04wOgotCSAgICAgIHJlZ1t0aGlzX3RyeS0+YXJnX2luZm9baV0gJiBBUkdfTUFTS10gPSBvcGVyYW5kc1tpXS5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZvdW5kID0gMTsKLSAgICBmYWlsOjsKLSAgICB9Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdGhpc190cnk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLURFRlVOIChjaGVja19vcGVyYW5kLCAob3BlcmFuZCwgd2lkdGgsIHN0cmluZyksCi0gICAgICAgc3RydWN0IHo4a19vcCAqb3BlcmFuZCBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGggQU5ECi0gICAgICAgY2hhciAqc3RyaW5nKQotewotICBpZiAob3BlcmFuZC0+ZXhwLlhfYWRkX3N5bWJvbCA9PSAwCi0gICAgICAmJiBvcGVyYW5kLT5leHAuWF9vcF9zeW1ib2wgPT0gMCkKLSAgICB7Ci0KLSAgICAgIC8qIE5vIHN5bWJvbCBpbnZvbHZlZCwgbGV0J3MgbG9vayBhdCBvZmZzZXQsIGl0J3MgZGFuZ2Vyb3VzIGlmIGFueSBvZgotICAgICAgIHRoZSBoaWdoIGJpdHMgYXJlIG5vdCAwIG9yIGZmJ3MsIGZpbmQgb3V0IGJ5IG9yaW5nIG9yIGFuZGluZyB3aXRoCi0gICAgICAgdGhlIHdpZHRoIGFuZCBzZWVpbmcgaWYgdGhlIGFuc3dlciBpcyAwIG9yIGFsbCBmcyovCi0gICAgICBpZiAoKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJiB+d2lkdGgpICE9IDAgJiYKLQkgIChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyIHwgd2lkdGgpICE9ICh+MCkpCi0JewotCSAgYXNfd2FybiAoXygib3BlcmFuZCAlczB4JXggb3V0IG9mIHJhbmdlLiIpLCBzdHJpbmcsIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpOwotCX0KLSAgICB9Ci0KLX0KLQotc3RhdGljIGNoYXIgYnVmZmVyWzIwXTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChuZXdmaXgsIChwdHIsIHR5cGUsIG9wZXJhbmQpLAotICAgICAgIGludCBwdHIgQU5ECi0gICAgICAgaW50IHR5cGUgQU5ECi0gICAgICAgZXhwcmVzc2lvblMgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZC0+WF9hZGRfc3ltYm9sCi0gICAgICB8fCBvcGVyYW5kLT5YX29wX3N5bWJvbAotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyKQotICAgIHsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgcHRyLAotCQkgICAxLAotCQkgICBvcGVyYW5kLAotCQkgICAwLAotCQkgICB0eXBlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLURFRlVOIChhcHBseV9maXgsIChwdHIsIHR5cGUsIG9wZXJhbmQsIHNpemUpLAotICAgICAgIGNoYXIgKnB0ciBBTkQKLSAgICAgICBpbnQgdHlwZSBBTkQKLSAgICAgICBleHByZXNzaW9uUyAqIG9wZXJhbmQgQU5ECi0gICAgICAgaW50IHNpemUpCi17Ci0gIGludCBuID0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotCi0gIG9wZXJhbmQtPlhfYWRkX251bWJlciA9IG47Ci0gIG5ld2ZpeCAoKHB0ciAtIGJ1ZmZlcikgLyAyLCB0eXBlLCBvcGVyYW5kKTsKLSNpZiAxCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA4OgkJCS8qIDggbmliYmxlcyA9PSAzMiBiaXRzICovCi0gICAgICAqcHRyKysgPSBuID4+IDI4OwotICAgICAgKnB0cisrID0gbiA+PiAyNDsKLSAgICAgICpwdHIrKyA9IG4gPj4gMjA7Ci0gICAgICAqcHRyKysgPSBuID4+IDE2OwotICAgIGNhc2UgNDoJCQkvKiA0IG5pYmxsZXMgPT0gMTYgYml0cyAqLwotICAgICAgKnB0cisrID0gbiA+PiAxMjsKLSAgICAgICpwdHIrKyA9IG4gPj4gODsKLSAgICBjYXNlIDI6Ci0gICAgICAqcHRyKysgPSBuID4+IDQ7Ci0gICAgY2FzZSAxOgotICAgICAgKnB0cisrID0gbiA+PiAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmCi0gIHJldHVybiBwdHI7Ci0KLX0KLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotI2RlZmluZSBJTlNFUlQoeCx5KSAqeCsrID0geT4+MjQ7ICp4KysgPSB5Pj4gMTY7ICp4Kys9eT4+ODsgKngrKyA9eTsKLXN0YXRpYyB2b2lkCi1idWlsZF9ieXRlcyAodGhpc190cnksIG9wZXJhbmQpCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICogdGhpc190cnk7Ci0gICAgIHN0cnVjdCB6OGtfb3AgKm9wZXJhbmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGludCBsZW5ndGg7Ci0gIGNoYXIgKm91dHB1dDsKLSAgY2hhciAqb3V0cHV0X3B0ciA9IGJ1ZmZlcjsKLSAgY2hhciBwYXJ0OwotICBpbnQgYzsKLSAgY2hhciBoaWdoOwotICBpbnQgbmliOwotICBpbnQgbmliYmxlOwotICB1bnNpZ25lZCBpbnQgKmNsYXNzX3B0cjsKLQotICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgZnJhZ19uZXcgKDApOwotCi0gIG1lbXNldCAoYnVmZmVyLCAyMCwgMCk7Ci0gIGNsYXNzX3B0ciA9IHRoaXNfdHJ5LT5ieXRlX2luZm87Ci10b3A6OwotCi0gIGZvciAobmliYmxlID0gMDsgYyA9ICpjbGFzc19wdHIrKzsgbmliYmxlKyspCi0gICAgewotCi0gICAgICBzd2l0Y2ggKGMgJiBDTEFTU19NQVNLKQotCXsKLQlkZWZhdWx0OgotCi0JICBhYm9ydCAoKTsKLQljYXNlIENMQVNTX0FERFJFU1M6Ci0JICAvKiBEaXJlY3QgYWRkcmVzcywgd2UgZG9uJ3QgY29wZSB3aXRoIHRoZSBTUyBtb2RlIHJpZ2h0IG5vdyAqLwotCSAgaWYgKHNlZ21lbnRlZF9tb2RlKQotCSAgICB7Ci0JICAgICAgZGFfb3BlcmFuZC0+WF9hZGRfbnVtYmVyIHw9IDB4ODAwMDAwMDA7Ci0JICAgICAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0zMiwgZGFfb3BlcmFuZCwgOCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMTYsIGRhX29wZXJhbmQsIDQpOwotCSAgICB9Ci0JICBkYV9vcGVyYW5kID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRElTUDg6Ci0JICAvKiBwYyByZWwgOCBiaXQgKi8KLQkgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSlIsIGRhX29wZXJhbmQsIDIpOwotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgQ0xBU1NfMERJU1A3OgotCSAgLyogcGMgcmVsIDcgYml0ICovCi0JICAqb3V0cHV0X3B0ciA9IDA7Ci0JICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0RJU1A3LCBkYV9vcGVyYW5kLCAyKTsKLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENMQVNTXzFESVNQNzoKLQkgIC8qIHBjIHJlbCA3IGJpdCAqLwotCSAgKm91dHB1dF9wdHIgPSAweDgwOwotCSAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9ESVNQNywgZGFfb3BlcmFuZCwgMik7Ci0gICAgICAgICAgb3V0cHV0X3B0clstMl0gPSAgMHg4OwotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgQ0xBU1NfQklUXzFPUjI6Ci0JICAqb3V0cHV0X3B0ciA9IGMgJiAweGY7Ci0JICBpZiAoaW1tX29wZXJhbmQpCi0JICAgIHsKLQkgICAgICBpZiAoaW1tX29wZXJhbmQtPlhfYWRkX251bWJlciA9PSAyKQotCQl7Ci0JCSAgKm91dHB1dF9wdHIgfD0gMjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgIT0gMSkKLQkJewotCQkgIGFzX2JhZCAoXygiaW1tZWRpYXRlIG11c3QgYmUgMSBvciAyIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiaW1tZWRpYXRlIDEgb3IgMiBleHBlY3RlZCIpKTsKLQkgICAgfQotCSAgb3V0cHV0X3B0cisrOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DQzoKLQkgICpvdXRwdXRfcHRyKysgPSB0aGVfY2M7Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU18wQ0NDOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSB0aGVfY3RybDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU18xQ0NDOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSB0aGVfY3RybCB8IDB4ODsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU18wMElJOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSAofnRoZV9pbnRlcnJ1cHQgJiAweDMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENMQVNTXzAxSUk6Ci0gICAgICAgICAgKm91dHB1dF9wdHIrKyA9ICh+dGhlX2ludGVycnVwdCAmIDB4MykgfCAweDQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfRkxBR1M6Ci0gICAgICAgICAgKm91dHB1dF9wdHIrKyA9IHRoZV9mbGFnczsKLSAgICAgICAgICBicmVhazsKLQljYXNlIENMQVNTX0JJVDoKLQkgICpvdXRwdXRfcHRyKysgPSBjICYgMHhmOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdOMDoKLQkgIGlmIChyZWdbYyAmIDB4Zl0gPT0gMCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgdXNlIFIwIGhlcmUiKSk7Ci0JICAgIH0KLQljYXNlIENMQVNTX1JFRzoKLQljYXNlIENMQVNTX1JFR19CWVRFOgotCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6Ci0JY2FzZSBDTEFTU19SRUdfTE9ORzoKLQljYXNlIENMQVNTX1JFR19RVUFEOgotCSAgLyogSW5zZXJ0IGJpdCBtYXR0ZXJuIG9mCi0JIHJpZ2h0IHJlZyAqLwotCSAgKm91dHB1dF9wdHIrKyA9IHJlZ1tjICYgMHhmXTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRElTUDoKLQkgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMTYsIGRhX29wZXJhbmQsIDQpOwotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgQ0xBU1NfSU1NOgotCSAgewotCSAgICBuaWIgPSAwOwotCSAgICBzd2l0Y2ggKGMgJiBBUkdfTUFTSykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBBUkdfSU1NNDoKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU00TCwgaW1tX29wZXJhbmQsIDEpOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19JTU00TTE6Ci0JCWltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXItLTsKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU00TCwgaW1tX29wZXJhbmQsIDEpOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19JTU1OTUlOVVMxOgotCQlpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyLS07Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NNEwsIGltbV9vcGVyYW5kLCAxKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfTklNODoKLQkJaW1tX29wZXJhbmQtPlhfYWRkX251bWJlciA9IC1pbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotCSAgICAgIGNhc2UgQVJHX0lNTTg6Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NOCwgaW1tX29wZXJhbmQsIDIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19JTU0xNjoKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0xNiwgaW1tX29wZXJhbmQsIDQpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQVJHX0lNTTMyOgotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTMyLCBpbW1fb3BlcmFuZCwgOCk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJYWJvcnQgKCk7Ci0JICAgICAgfQotCSAgfQotCX0KLSAgICB9Ci0KLSAgLyogQ29weSBmcm9tIHRoZSBuaWJibGUgYnVmZmVyIGludG8gdGhlIGZyYWcgKi8KLQotICB7Ci0gICAgaW50IGxlbmd0aCA9IChvdXRwdXRfcHRyIC0gYnVmZmVyKSAvIDI7Ci0gICAgY2hhciAqc3JjID0gYnVmZmVyOwotICAgIGNoYXIgKmZyYWdwID0gZnJhZ19tb3JlIChsZW5ndGgpOwotCi0gICAgd2hpbGUgKHNyYyA8IG91dHB1dF9wdHIpCi0gICAgICB7Ci0JKmZyYWdwID0gKHNyY1swXSA8PCA0KSB8IHNyY1sxXTsKLQlzcmMgKz0gMjsKLQlmcmFncCsrOwotICAgICAgfQotCi0gIH0KLQotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jaXRvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotdm9pZAotREVGVU4gKG1kX2Fzc2VtYmxlLCAoc3RyKSwKLSAgICAgICBjaGFyICpzdHIpCi17Ci0gIGNoYXIgKm9wX3N0YXJ0OwotICBjaGFyICpvcF9lbmQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdHJ1Y3QgejhrX29wIG9wZXJhbmRbM107Ci0gIG9wY29kZV9lbnRyeV90eXBlICpvcGNvZGU7Ci0gIG9wY29kZV9lbnRyeV90eXBlICpwcmV2X29wY29kZTsKLQotICBjaGFyICpkb3QgPSAwOwotICBjaGFyIGM7Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSBzdHI7Ci0gICAgICAgKm9wX2VuZCAhPSAwICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICB9Ci0KLSAgOwotCi0gIGlmIChvcF9lbmQgPT0gb3Bfc3RhcnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0gICAgfQotICBjID0gKm9wX2VuZDsKLQotICAqb3BfZW5kID0gMDsKLQotICBvcGNvZGUgPSAob3Bjb2RlX2VudHJ5X3R5cGUgKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLAotCQkJCQkgICAgb3Bfc3RhcnQpOwotCi0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChvcGNvZGUtPm9wY29kZSA9PSAyNTApCi0gICAgewotICAgICAgLyogd2FzIHJlYWxseSBhIHBzZXVkbyBvcCAqLwotCi0gICAgICBwc2V1ZG9fdHlwZVMgKnA7Ci0gICAgICBjaGFyIG9jOwotCi0gICAgICBjaGFyICpvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqb3BfZW5kID0gYzsKLQotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcF9lbmQ7Ci0KLSAgICAgIG9jID0gKm9sZDsKLSAgICAgICpvbGQgPSAnXG4nOwotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgcCA9IChwc2V1ZG9fdHlwZVMgKikgKG9wY29kZS0+ZnVuYyk7Ci0KLSAgICAgIChwLT5wb2NfaGFuZGxlcikgKHAtPnBvY192YWwpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkOwotICAgICAgKm9sZCA9IG9jOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGdldF9vcGVyYW5kcyAob3Bjb2RlLCBvcF9lbmQsCi0JCQkJCSBvcGVyYW5kKTsKLSAgICAgIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotCi0gICAgICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLSAgICAgIGlmIChvcGNvZGUgPT0gMCkKLQl7Ci0JICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLwotCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDIpOwotCi0JICB3aGVyZVswXSA9IDB4MDsKLQkgIHdoZXJlWzFdID0gMHgwOwotCi0JICBhc19iYWQgKF8oIkNhbid0IGZpbmQgb3Bjb2RlIHRvIG1hdGNoIG9wZXJhbmRzIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0gICAgfQotfQotCi12b2lkCi1ERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi1zeW1ib2xTICoKLURFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCi0gICAgICAgY2hhciAqbmFtZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLURFRlVOICh0Y19oZWFkZXJzX2hvb2ssIChoZWFkZXJzKSwKLSAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJ6OiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAneic6Ci0gICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiODAwMSIpKQotCXNfc2VnbSAoKTsKLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIjgwMDIiKSkKLQlzX3Vuc2VnICgpOwotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgLXolcyIpLCBhcmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLVo4SyBvcHRpb25zOlxuXAotLXo4MDAxCQkJZ2VuZXJhdGUgc2VnbWVudGVkIGNvZGVcblwKLS16ODAwMgkJCWdlbmVyYXRlIHVuc2VnbWVudGVkIGNvZGVcbiIpKTsKLX0KLQwKLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19hb3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0byBtZF9jb252ZXJ0X2ZyYWcgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi12YWx1ZVQKLURFRlVOIChtZF9zZWN0aW9uX2FsaWduLCAoc2VnLCBzaXplKSwKLSAgICAgICBzZWdUIHNlZyBBTkQKLSAgICAgICB2YWx1ZVQgc2l6ZSkKLXsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pIC0gMSkgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOwotCi19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSU1NNEw6Ci0gICAgICBidWZbMF0gPSAoYnVmWzBdICYgMHhmMCkgfCAoKGJ1ZlswXSArIHZhbCkgJiAweGYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSlI6Ci0KLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIC8qICAgIGlmICh2YWwgIT0gMCkgYWJvcnQoKTsqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRElTUDc6Ci0KLSAgICAgICpidWYrKyArPSB2YWw7Ci0gICAgICAvKiAgICBpZiAodmFsICE9IDApIGFib3J0KCk7Ki8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTg6Ci0gICAgICBidWZbMF0gKz0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTE2OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU0zMjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0jaWYgMAotICAgIGNhc2UgUl9EQSB8IFJfU0VHOgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAweDAwOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIDA6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBmaXhQLT5meF9zaXplKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgfQotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBwcmludGYgKF8oImNhbGwgdG9tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi12b2lkCi1ERUZVTiAobWRfbnVtYmVyX3RvX2NoYXJzLCAocHRyLCB1c2UsIG5ieXRlcyksCi0gICAgICAgY2hhciAqcHRyIEFORAotICAgICAgIHZhbHVlVCB1c2UgQU5ECi0gICAgICAgaW50IG5ieXRlcykKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBhYm9ydCAoKTsKLX0KLQotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChzKQotICAgICBzeW1ib2xTICpzOwotewotfQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgaWYgKGZpeF9wdHItPmZ4X2FkZHN5ICYmCi0gICAgICBmaXhfcHRyLT5meF9zdWJzeSkgCi0gICAgewotICAgICAgc3ltYm9sUyAqYWRkID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0gICAgICBzeW1ib2xTICpzdWIgPSBmaXhfcHRyLT5meF9zdWJzeTsKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UKGFkZCkgIT0gU19HRVRfU0VHTUVOVChzdWIpKQotCXsKLQkgIGFzX2JhZChfKCJDYW4ndCBzdWJ0cmFjdCBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyAlcyAlcyIpLAotCQkgU19HRVRfTkFNRShhZGQpLCBTX0dFVF9OQU1FKHN1YikpOwotCX0KLSAgICAgIGVsc2UgewotCWludCBkaWZmID0gU19HRVRfVkFMVUUoYWRkKSAtIFNfR0VUX1ZBTFVFKHN1Yik7Ci0JZml4X3B0ci0+ZnhfYWRkc3kgPSAwOwotCWZpeF9wdHItPmZ4X3N1YnN5ID0gMDsKLQlmaXhfcHRyLT5meF9vZmZzZXQgKz0gZGlmZjsKLSAgICAgIH0KLSAgICB9Ci0gIHN5bWJvbF9wdHIgPSBmaXhfcHRyLT5meF9hZGRzeTsKLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgYXR0YWNoZWQgdG8gYSBzeW1ib2wgdGhlbiBpdCdzIG9rCi0gICAgIHRvIG91dHB1dCBpdCAqLwotICBpZiAoZml4X3B0ci0+Znhfcl90eXBlID09IDApCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uICovCi0gICAgICBzd2l0Y2ggKGZpeF9wdHItPmZ4X3NpemUpCi0JewotCWNhc2UgMjoKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NMTY7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTg7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTMyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludHItPnJfdHlwZSA9IGZpeF9wdHItPmZ4X3JfdHlwZTsKLSAgICB9Ci0KLSAgaW50ci0+cl92YWRkciA9IGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZSArIGJhc2U7Ci0gIGludHItPnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotCi0gIGlmIChzeW1ib2xfcHRyKQotICAgIGludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotICBlbHNlCi0gICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy16OGsuaCBiL2dhcy9jb25maWcvdGMtejhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGI2NTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy16OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy16OGsuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIsIDkzLCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBUQ19aOEsKLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7Ci0jZW5kaWYKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTCh4KSAwCi0jZW5kaWYKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgYWJvcnQoKTsKLQotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF96OGsKLSNkZWZpbmUgQ09GRl9NQUdJQyAweDgwMDAKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKDEpCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIlppbG9nIFo4MDAwIEdBUyAiCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLSNkZWZpbmUgUkVMT0NfMzIgMTIzNAotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogZW5kIG9mIHRjLXo4ay5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLTM4NmJzZC5oIGIvZ2FzL2NvbmZpZy90ZS0zODZic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmZjk5MC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLTM4NmJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogdGUtMzg2YnNkLmggLS0gMzg2QlNEIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBURV8zODZCU0QJMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGUtc3VuMy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWF1eC5oIGIvZ2FzL2NvbmZpZy90ZS1hdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZmEwMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWF1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI2RlZmluZSBURV9BVVgKLQotLyogRnJvbSBvYmotY29mZi5oOgotICAgVGhpcyBpbnRlcm5hbF9saW5lbm8gY3JhcCBpcyB0byBzdG9wIG5hbWVzcGFjZSBwb2xsdXRpb24gZnJvbSB0aGUKLSAgIGJmZCBpbnRlcm5hbCBjb2ZmIGhlYWRlcmZpbGUuICovCi0jZGVmaW5lIGludGVybmFsX2xpbmVubyBiZmRfaW50ZXJuYWxfbGluZW5vCi0jaW5jbHVkZSAiY29mZi9hdXgtY29mZi5oIgkvKiBvdmVycmlkZSBiaXRzIGluIGNvZmYvaW50ZXJuYWwuaCAqLwotI3VuZGVmIGludGVybmFsX2xpbmVubwotCi0jZGVmaW5lIENPRkZfTk9MT0FEX1BST0JMRU0KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLSNpZm5kZWYgTE9DQUxfTEFCRUxTX0ZCCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZGVsdDg4LmggYi9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNkNmI3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZGVsdDg4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGUtZGVsdGE4OC5oLiAgKi8KLQotI2RlZmluZSBURV9ERUxUQTg4IDEKLQotI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCTEKLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIJMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIJCTEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZGVsdGEuaCBiL2dhcy9jb25maWcvdGUtZGVsdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2YzYyYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWRlbHRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jZGVmaW5lIFRFX0RFTFRBCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLSNkZWZpbmUgQ09GRl9OT0xPQURfUFJPQkxFTQkxCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAkxCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSCTEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCCQkxCi0KLS8qIGVuZCBvZiB0ZS1kZWx0YS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRweDIuaCBiL2dhcy9jb25maWcvdGUtZHB4Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTM0MWNhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZHB4Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLyogTWFjaGluZSBzcGVjaWZpYyBkZWZpbmVzIGZvciB0aGUgZHB4MiBtYWNoaW5lICovCi0KLS8qIFRoZSBtYWdpYyBudW1iZXIgaXMgbm90IHRoZSB1c3VhbCBNQzY4TUFHSUMuICovCi0jZGVmaW5lIENPRkZfTUFHSUMgICAgICAgTUM2OEtCQ1NNQUdJQwotCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCAxCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1tNjhrLXVuIgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtZHB4Mi5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWR5bml4LmggYi9nYXMvY29uZmlnL3RlLWR5bml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllN2IzMGYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1keW5peC5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vKiBUaGlzIGlzIGZvciBpMzg2LXNlcXVlbnQtYnNkLiAgVGhlIGFzc2VtYmxlciBwcm9iYWJseSBkb2VzIG5vdAotICAgYWN0dWFsbHkgd29yaywgYXMgdGhlIHN1cHBvcnQgaW4gQkZEIGlzIG5vdCBjb21wbGV0ZSBhcyBvZiB0aGlzCi0gICB3cml0aW5nLiAgU2VlIGJmZC9pMzg2LWR5bml4LmMuICAqLwotCi0jZGVmaW5lIFRFX0RZTklYIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oIGIvZ2FzL2NvbmZpZy90ZS1lcG9jLXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNWY5MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1lcG9jLXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNkZWZpbmUgVEVfUEUKLSNkZWZpbmUgVEVfRVBPQwotI2RlZmluZSBMRVhfQVQgMSAvKiBjYW4gaGF2ZSBAJ3MgaW5zaWRlIGxhYmVscyAqLwotCi0vKiBUaGUgUEUgZm9ybWF0IHN1cHBvcnRzIGxvbmcgc2VjdGlvbiBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWdlbmVyaWMuaCBiL2dhcy9jb25maWcvdGUtZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGVkYTQ1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZ2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gKiB0YXJnZXQgZW52aXJvbm1lbnQgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotICoKLSAqIEl0IGlzIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSB3aWxsIGV2b2x2ZSBpbnRvIGEgZmlsZSBzdWl0YWJsZSBmb3IgY29uZmlnLAotICogY29tcGlsZSwgYW5kIGNvcHlpbmcgYXMgYW4gYWlkIGZvciB0ZXN0aW5nIGFuZCBwb3J0aW5nLiAgeG94b3JpY2guCi0gKi8KLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLwotI2lmZGVmIE9CSl9IRUFERVIKLSNpbmNsdWRlIE9CSl9IRUFERVIKLSNlbHNlCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotI2VuZGlmCi0KLS8qIGVuZCBvZiB0ZS1nZW5lcmljLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZ28zMi5oIGIvZ2FzL2NvbmZpZy90ZS1nbzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NWM5NTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1nbzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWdvMzIuaAotICovCi0KLSNkZWZpbmUgVEVfR08zMgotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtZ28zMiIKLQotLyogR0FTIHNob3VsZCB0cmVhdCAnLmFsaWduIHZhbHVlJyBhcyBhbiBhbGlnbm1lbnQgb2YgMioqdmFsdWUgKi8KLSNkZWZpbmUgVVNFX0FMSUdOX1BUV08KLQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0vKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLwotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtaHAzMDAuaCBiL2dhcy9jb25maWcvdGUtaHAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5NGFiNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWhwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiB0ZS1ocDMwMC5oIC0tIGhwdXggOTAwMC8zMDAgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtaHAzMDAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1ocHBhLmggYi9nYXMvY29uZmlnL3RlLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjNGZhNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIE1hY2hpbmUgc3BlY2lmaWMgZGVmaW5lcyBmb3IgdGhlIFBBIG1hY2hpbmUKLSAgIENvcHlyaWdodCAxOTg3LCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0JSFAgUEEtUklTQyBhbmQgT1NGLzEgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IKLQlTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguCi0gKi8KLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWkzODZhaXguaCBiL2dhcy9jb25maWcvdGUtaTM4NmFpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGYwOTQ1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtaTM4NmFpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1pMzg2YWl4LmggYW5kIGlzIGJ1aWx0IGZyb20gcGllY2VzIG9mIGNvZGUgZnJvbSBNaW5oIFRyYW4tTGUKLSAqIDxUUkFOTEVASU5URUxMSUNPUlAuQ09NPiBieSByaWNoQGN5Z251cy5jb20uCi0gKi8KLQotI2RlZmluZSBURV9JMzg2QUlYIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyoKLSAqIFVuZGVmaW5lIFJFVkVSU0VfU09SVF9SRUxPQ1MgdG8ga2VlcCB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIHNvcnRlZAotICogaW4gYXNjZW5kaW5nIHZhZGRyLgotICovCi0jdW5kZWYgUkVWRVJTRV9TT1JUX1JFTE9DUwotCi0vKgotICogRGVmaW5lIEtFRVBfUkVMT0NfSU5GTyBzbyB0aGF0IHRoZSBzdHJpcCByZWxvYyBpbmZvIGZsYWcgRl9SRUxGTEcKLSAqIGlzIG5vdCB1c2VkIGluIHRoZSBmaWxlaGRyIGZvciBDT0ZGIG91dHB1dC4KLSAqLwotI2RlZmluZSBLRUVQX1JFTE9DX0lORk8KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogNzkKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGUtaTM4NmFpeC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWljOTYwLmggYi9nYXMvY29uZmlnL3RlLWljOTYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzFmYjkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRlLWljOTYwLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtaWM5NjAuaCBhbmQgaXMgaW50ZW5kZWQgdG8gZGVmaW5lIGljOTYwIGVudmlyb25tZW50Ci0gKiBzcGVjaWZpYyBkaWZmZXJlbmNlcy4KLSAqLwotCi0jZGVmaW5lIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAoKG5hbWVbMF0gPT0nTCcpIFwKLQkJCSAgIHx8IChuYW1lWzBdID09Jy4nIFwKLQkJCSAgICAgICAmJiAobmFtZVsxXT09J0MnIFwKLQkJCQkgICB8fCBuYW1lWzFdPT0nSScgXAotCQkJCSAgIHx8IG5hbWVbMV09PScuJykpKQotI2VuZGlmCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGVuZCBvZiB0ZS1pYzk2MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWludGVyaXguaCBiL2dhcy9jb25maWcvdGUtaW50ZXJpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzNhZDI0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtaW50ZXJpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI2RlZmluZSBURV9QRV9EWU4gLyogUEUgd2l0aCBkeW5hbWljIGxpbmtpbmcgKFVOSVggc2hhcmVkIGxpYikgc3VwcG9ydCAqLwotI2RlZmluZSBURV9QRQotI2RlZmluZSBMRVhfQVQgMSAvKiBjYW4gaGF2ZSBAJ3MgaW5zaWRlIGxhYmVscyAqLwotI2RlZmluZSBMRVhfUU0gMyAvKiBjYW4gaGF2ZSA/J3MgaW4gb3IgYmVnaW4gbGFiZWxzICovCi0KLS8qIFRoZSBQRSBmb3JtYXQgc3VwcG9ydHMgbG9uZyBzZWN0aW9uIG5hbWVzLiAgKi8KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2RlZmluZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0KLS8qIEJvdGggYXJjaGl0ZWN0dXJlcyB1c2UgdGhlc2UgKi8KLSNpZm5kZWYgTE9DQUxfTEFCRUxTX0ZCCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0jZW5kaWYKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbGludXguaCBiL2dhcy9jb25maWcvdGUtbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzNWE3YS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWxpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNkZWZpbmUgVEVfTElOVVgKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbG5ld3MuaCBiL2dhcy9jb25maWcvdGUtbG5ld3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiY2M1YS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWxuZXdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qIHRlLWxuZXdzLmggLS0gbGl0dGxlLWVuZGlhbiBORVdTIGVtdWxhdGlvbi4gICovCi0KLSNkZWZpbmUgRUNPRkZfTElUVExFX0ZPUk1BVCAiZWNvZmYtYmlnbGl0dGxlbWlwcyIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbHlueC5oIGIvZ2FzL2NvbmZpZy90ZS1seW54LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODUxNWQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1seW54LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNkZWZpbmUgVEVfTFlOWAotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW1hY2guaCBiL2dhcy9jb25maWcvdGUtbWFjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzU0N2Y4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbWFjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jZGVmaW5lIFRFX01hY2gKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW1hY29zLmggYi9nYXMvY29uZmlnL3RlLW1hY29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDhkYzQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1tYWNvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRlLW1hY29zLmguICAqLwotCi0jZGVmaW5lIFRFX1BPV0VSTUFDIDEKLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tdWx0aS5oIGIvZ2FzL2NvbmZpZy90ZS1tdWx0aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGVkYTQ1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbXVsdGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogdGFyZ2V0IGVudmlyb25tZW50IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBJdCBpcyBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgd2lsbCBldm9sdmUgaW50byBhIGZpbGUgc3VpdGFibGUgZm9yIGNvbmZpZywKLSAqIGNvbXBpbGUsIGFuZCBjb3B5aW5nIGFzIGFuIGFpZCBmb3IgdGVzdGluZyBhbmQgcG9ydGluZy4gIHhveG9yaWNoLgotICovCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpZmRlZiBPQkpfSEVBREVSCi0jaW5jbHVkZSBPQkpfSEVBREVSCi0jZWxzZQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLSNlbmRpZgotCi0vKiBlbmQgb2YgdGUtZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW5ic2QuaCBiL2dhcy9jb25maWcvdGUtbmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWU0NjAwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbmJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogdGUtbmJzZC5oIC0tIE5ldEJTRCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEVfTmV0QlNECTEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW5ic2Q1MzIuaCBiL2dhcy9jb25maWcvdGUtbmJzZDUzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2Y5ZTVmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbmJzZDUzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1uZXRic2Q1MzIuaAotICoKLSAqIFdyaXR0ZW4gYnkgSWFuIERhbGwgPGlkYWxsQGVsZWNlbmcuYWRlbGFpZGUuZWR1LmF1PgotICogCi0gKiAxOS1KdW4tOTQKLSAqIAotICovCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LW5zMzJrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogTWF5YmUgdGhlc2Ugc2hvdWxkIGJlIG1vcmUgbGlrZSBUQ19OUzMyNTMyIGFuZCBUQ19OUzMyMzgxIGluIGNhc2UKLSAqIG9mIGNvbmZsaWN0cy4gTlMzMjM4MSBpcyB1c2VkIGluIG9wY29kZS9uczMyay5oIGFuZCB0aGF0IGlzIGFsc28KLSAqIHVzZWQgYnkgR0RCLiBOZWVkIHRvIGNoZWNrLgotICovCi0jZGVmaW5lIE5TMzI1MzIKLSNkZWZpbmUgTlMzMjM4MQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wYzUzMm1hY2guaCBiL2dhcy9jb25maWcvdGUtcGM1MzJtYWNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTdmZjguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1wYzUzMm1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtcGM1MzIuaAotICoKLSAqIFdyaXR0ZW4gYnkgSWFuIERhbGwgPGlkYWxsQGVsZWNlbmcuYWRlbGFpZGUuZWR1LmF1PgotICogCi0gKiAyNC1NYXktOTQKLSAqIAotICovCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LXBjNTMyLW1hY2giCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIE1heWJlIHRoZXNlIHNob3VsZCBiZSBtb3JlIGxpa2UgVENfTlMzMjUzMiBhbmQgVENfTlMzMjM4MSBpbiBjYXNlCi0gKiBvZiBjb25mbGljdHMuIE5TMzIzODEgaXMgdXNlZCBpbiBvcGNvZGUvbnMzMmsuaCBhbmQgdGhhdCBpcyBhbHNvCi0gKiB1c2VkIGJ5IEdEQi4gTmVlZCB0byBjaGVjay4KLSAqLwotI2RlZmluZSBOUzMyNTMyCi0jZGVmaW5lIE5TMzIzODEKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcGUuaCBiL2dhcy9jb25maWcvdGUtcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxZjBiMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNkZWZpbmUgVEVfUEUKLSNkZWZpbmUgTEVYX0FUIDEgLyogY2FuIGhhdmUgQCdzIGluc2lkZSBsYWJlbHMgKi8KLQotLyogVGhlIFBFIGZvcm1hdCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMuICAqLwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wcGNudy5oIGIvZ2FzL2NvbmZpZy90ZS1wcGNudy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRmMDUwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcHBjbncuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIHRlLXBwY253LmggLS0gUG93ZXIgUEMgcnVubmluZyBOZXR3YXJlIGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBnY2MgdXNlcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBwcGMvbmV0d2FyZSAqLwotCi0jdW5kZWYgTk9fU1RSSU5HX0VTQ0FQRVMKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcHNvcy5oIGIvZ2FzL2NvbmZpZy90ZS1wc29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDQxNTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1wc29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLXBzb3MuaCBmb3IgZW1iZWRkZWQgc3lzdGVtcyBydW5uaW5nIHBTT1MuCi0gKiBDb250cmlidXRlZCBieSBNYXJ0aW4gQW5hbnRoYXJhbWFuIChtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGUpCi0gKi8KLQotI2RlZmluZSBURV9QU09TCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBUaGlzIG1ha2VzIEdBUyBtb3JlIHZlcnNhdGlsZSBhbmQgYmxvY2tzIHNvbWUgRUxGJ2lzbXMgaW4KLSAgIHRjLW02OGsuaC4gKi8KLQotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtcHNvcy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXJpc2NpeC5oIGIvZ2FzL2NvbmZpZy90ZS1yaXNjaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3MjUzZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXJpc2NpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jZGVmaW5lIFRFX1JJU0NJWAotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zcGFyY2FvdXQuaCBiL2dhcy9jb25maWcvdGUtc3BhcmNhb3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTAxODQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1zcGFyY2FvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIHRlLXNwYXJjYW91dC5oIC0tIGVtYmVkZGVkIHNwYXJjLWFvdXQgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRFX1NQQVJDQU9VVAkxCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zdW4zLmggYi9nYXMvY29uZmlnL3RlLXN1bjMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZDQyYi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXN1bjMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIHRlLXN1bjMuaCAtLSBTdW4tMyB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlICNkZWZpbmVzIHNwZWNpZmljCi0gICB0byBTVU4gY29tcHV0ZXIgU1VOIDMgc2VyaWVzIGNvbXB1dGVycy4gIChUaGUgb25seSBraW5kCi0gICB3ZSBoYXZlIGFyb3VuZCBoZXJlLCB1bmZvcnR1bmF0bHkuKQotCi0gICBSdW1vciBoYXMgaXQgdGhhdCB0aGlzIGZpbGUgd2lsbCB3b3JrIG9uIHRoZSBTdW4tMiBpZiB0aGUgYXNzZW1ibGVyCi0gICBpcyBjYWxsZWQgd2l0aCAtbTY4MDEwICBUaGlzIGlzIG5vdCB0ZXN0ZWQuICAqLwotCi0KLSNkZWZpbmUgVEVfU1VOMwkxCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIENvdWxkIGFsc28gYmUgOgotICAgI2RlZmluZSBTX0xPQ0FMX05BTUUocykJKFNfR0VUX05BTUUocylbMF0gPT0gJy4nICYmCi0gICBTX0dFVF9OQU1FKHMpWzFdID09ICdMJyB8fAotICAgU19HRVRfTkFNRShzKVsxXSA9PSAnLicpCi0gICAqLwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGUtc3VuMy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXN2cjQuaCBiL2dhcy9jb25maWcvdGUtc3ZyNC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE3ZWUxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtc3ZyNC5oCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jZGVmaW5lIFRFX1NWUjQKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3lzdjMyLmggYi9nYXMvY29uZmlnL3RlLXN5c3YzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlNmU1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtc3lzdjMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qIFJlbW92ZSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSB0aGUgZ2NjIGdlbmVyYXRlZCBzeW1ib2wgbmFtZXMgKi8KLSNkZWZpbmUgU1RSSVBfVU5ERVJTQ09SRQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtc3lzdjMyLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdmF4LWluc3QuaCBiL2dhcy9jb25maWcvdmF4LWluc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkOGY5OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3ZheC1pbnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKiB2YXgtaW5zdC5oIC0gR05VIC0gUGFydCBvZiB2YXguYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGlzIHBhcnQgb2YgdmF4LWlucy1wYXJzZS5jICYgZnJpZW5kcy4KLSAqIFdlIHdhbnQgdG8gcGFyc2UgYSB2YXggaW5zdHJ1Y3Rpb24gdGV4dCBpbnRvIGEgdHJlZSBkZWZpbmVkIGhlcmUuCi0gKi8KLQotI2RlZmluZSBWSVRfTUFYX09QRVJBTkRTICg2KQkvKiBtYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBpbiBvbmUgICAgICAgKi8KLS8qIHNpbmdsZSB2YXggaW5zdHJ1Y3Rpb24gKi8KLQotc3RydWN0IHZvcAkJCS8qIHZheCBpbnN0cnVjdGlvbiBvcGVyYW5kICAgICAgICAgICAgICAgICAqLwotewotICBzaG9ydCBpbnQgdm9wX25keDsJCS8qIC0xLCBvciBpbmRleCByZWdpc3Rlci4gZWcgNz1bUjddCSAgICovCi0gIHNob3J0IGludCB2b3BfcmVnOwkJLyogLTEsIG9yIHJlZ2lzdGVyIG51bWJlci4gZWcgQEleIz0weEYgICAgICovCi0gIC8qIEhlbHBzIGRpc3Rpbmd1aXNoICJhYnMiIGZyb20gImFicyhQQykiLiAqLwotICBzaG9ydCBpbnQgdm9wX21vZGU7CQkvKiBhZGRyZXNzaW5nIG1vZGUgNCBiaXRzLiBlZyBJXiM9MHg5CSAgICovCi0gIGNoYXIgdm9wX3Nob3J0OwkJLyogb3BlcmFuZCBkaXNwbGFjZW1lbnQgbGVuZ3RoIGFzIHdyaXR0ZW4gICovCi0gIC8qICcgJz1ub25lLCAiYmlsc3ciPUJeSV5MXlNeV14uICAgICAgICAgICAqLwotICBjaGFyIHZvcF9hY2Nlc3M7CQkvKiAnYidicmFuY2ggJyAnbm8taW5zdHJ1Y3Rpb24gJ2FtcnZ3J25vcm0gKi8KLSAgY2hhciB2b3Bfd2lkdGg7CQkvKiBPcGVyYW5kIHdpZHRoLCBvbmUgb2YgImJkZmdobG9xdyIJICAgKi8KLSAgY29uc3QgY2hhciAqdm9wX3dhcm47CQkvKiB3YXJuaW5nIG1lc3NhZ2Ugb2YgdGhpcyBvcGVyYW5kLCBpZiBhbnkgKi8KLSAgY29uc3QgY2hhciAqdm9wX2Vycm9yOwkvKiBzYXkgaWYgb3BlcmFuZCBpcyBpbmFwcHJvcHJpYXRlICAgICAgICAgKi8KLSAgY2hhciAqdm9wX2V4cHJfYmVnaW47CQkvKiBVbnBhcnNlZCBleHByZXNzaW9uLCAxc3QgY2hhciAuLi4JICAgKi8KLSAgY2hhciAqdm9wX2V4cHJfZW5kOwkJLyogLi4uIGxhc3QgY2hhci4JCQkgICAqLwotICB1bnNpZ25lZCBjaGFyIHZvcF9uYnl0ZXM7CS8qIG51bWJlciBvZiBieXRlcyBpbiBkYXR1bQkJICAgKi8KLX07Ci0KLQotdHlwZWRlZiBsb25nIHZheF9vcGNvZGVUOwkvKiBGb3IgaW5pdGlhbGlzaW5nIGFycmF5IG9mIG9wY29kZXMJICAgKi8KLS8qIFNvbWUgc3ludGhldGljIG9wY29kZXMgPiAxNiBiaXRzISAgICAgICAqLwotCi0jZGVmaW5lIFZJVF9PUENPREVfU1lOVEhFVElDIDB4ODAwMDAwMDAJLyogTm90IHJlYWwgaGFyZHdhcmUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBWSVRfT1BDT0RFX1NQRUNJQUwgICAweDQwMDAwMDAwCS8qIE5vdCBub3JtYWwgYnJhbmNoIG9wdGltaXNpbmcuICAgKi8KLS8qIE5ldmVyIHNldCB3aXRob3V0IC4uLl9TWU5USEVUSUMgKi8KLQotI2RlZmluZSBWQVhfV0lEVEhfVU5DT05ESVRJT05BTF9KVU1QICctJwkvKiBUaGVzZSBhcmUgZW5jb2RlZCBpbnRvICAgICAgICAgKi8KLSNkZWZpbmUgVkFYX1dJRFRIX0NPTkRJVElPTkFMX0pVTVAgICAnPycJLyogdm9wX3dpZHRoIHdoZW4gdm9wX2FjY2Vzcz09J2InICovCi0jZGVmaW5lIFZBWF9XSURUSF9XT1JEX0pVTVAgICAgICAgICAgJyEnCS8qIGFuZCBWSVRfT1BDT0RFX1NZTlRIRVRJQyBzZXQuICAqLwotI2RlZmluZSBWQVhfV0lEVEhfQllURV9KVU1QCSAgICAgJzonCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFZBWF9KTVAgKDB4MTcpCQkvKiBVc2VmdWwgZm9yIGJyYW5jaCBvcHRpbWlzaW5nLiBKdW1wIGluc3RyKi8KLSNkZWZpbmUgVkFYX1BDX1JFTEFUSVZFX01PREUgKDB4ZWYpCS8qIFVzZSBpdCBhZnRlciBWQVhfSk1QCQkgICAqLwotI2RlZmluZSBWQVhfQUJTT0xVVEVfTU9ERSAoMHg5RikvKiBVc2UgYXMgQCMuLi4JCQkgICAqLwotI2RlZmluZSBWQVhfQlJCICgweDExKQkJLyogQ2Fub25pY2FsIGJyYW5jaC4JCQkgICAqLwotI2RlZmluZSBWQVhfQlJXICgweDMxKQkJLyogQW5vdGhlciBjYW5vbmljYWwgYnJhbmNoCQkgICAqLwotI2RlZmluZSBWQVhfV0lERU5fV09SRCAoMHgyMCkJLyogQWRkIHRoaXMgdG8gYnl0ZSBicmFuY2ggdG8gZ2V0IHdvcmQgYnIuICovCi0jZGVmaW5lIFZBWF9XSURFTl9MT05HICgweDYpCS8qIEFkZCB0aGlzIHRvIGJ5dGUgYnJhbmNoIHRvIGdldCBsb25nIGptcC4qLwotLyogTmVlZHMgVkFYX1BDX1JFTEFUSVZFX01PREUgYnl0ZSBhZnRlciBpdCovCi0KLXN0cnVjdCB2aXQJCQkvKiB2YXggaW5zdHJ1Y3Rpb24gdHJlZSAgICAgICAgICAgICAgICAgICAgKi8KLXsKLSAgLyogdml0X29wY29kZSBpcyBjaGFyW10gZm9yIHBvcnRhYmlsaXR5LiAgICovCi0gIGNoYXIgdml0X29wY29kZVtzaXplb2YgKHZheF9vcGNvZGVUKV07Ci0gIHVuc2lnbmVkIGNoYXIgdml0X29wY29kZV9uYnl0ZXM7CS8qIEhvdyBsb25nIGlzIF9vcGNvZGU/IChjaGFycykJICAgKi8KLSAgdW5zaWduZWQgY2hhciB2aXRfb3BlcmFuZHM7CS8qCQkJCQkgICAqLwotICBzdHJ1Y3Qgdm9wIHZpdF9vcGVyYW5kW1ZJVF9NQVhfT1BFUkFORFNdOwkvKiBvcGVyYW5kcyAgICAgICAgICAgICAqLwotICBjb25zdCBjaGFyICp2aXRfZXJyb3I7CS8qICIiIG9yIGVycm9yIHRleHQgKi8KLX07Ci0KLS8qIGVuZCBvZiB2YXgtaW5zdC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaCBiL2dhcy9jb25maWcvdm1zLWEtY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODhmYzY4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdm1zLWEtY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIHZtcy1hbHBoYS1jb25mLmguICBHZW5lcmF0ZWQgbWFudWFsbHkgZnJvbSBjb25mLmluLAotICAgYW5kIHVzZWQgYnkgY29uZmlnLWdhcy1hbHBoYS5jb20gd2hlbiBjb25zdHJ1Y3RpbmcgY29uZmlnLmguICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgQ19BTExPQ0EKLSNlbHNlCi0jZGVmaW5lIENfQUxMT0NBCi0jZW5kaWYKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIGlubGluZQotI2VuZGlmCi0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0JU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotCVNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotCVNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICgtMSkKLQotLyogU2hvdWxkIGdhcyB1c2UgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlcz8gICovCi0jZGVmaW5lIEJGRF9BU1NFTUJMRVIKLQotLyogU29tZSBhc3NlcnQvcHJlcHJvY2Vzc29yIGNvbWJpbmF0aW9ucyBhcmUgaW5jYXBhYmxlIG9mIGhhbmRsaW5nCi0gICBjZXJ0YWluIGtpbmRzIG9mIGNvbnN0cnVjdHMgaW4gdGhlIGFyZ3VtZW50IG9mIGFzc2VydC4gIEZvciBleGFtcGxlLAotICAgcXVvdGVkIHN0cmluZ3MgKGlmIHJlcXVvdGluZyBpc24ndCBkb25lIHJpZ2h0KSBvciBuZXdsaW5lcy4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0jZWxzZQotI2RlZmluZSBCUk9LRU5fQVNTRVJUCi0jZW5kaWYKLQotLyogSWYgd2UgYXJlbid0IGRvaW5nIGNyb3NzLWFzc2VtYmxpbmcsIHNvbWUgb3BlcmF0aW9ucyBjYW4gYmUgb3B0aW1pemVkLAotICAgc2luY2UgYnl0ZSBvcmRlcnMgYW5kIHZhbHVlIHNpemVzIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogU29tZSBnYXMgY29kZSB3YW50cyB0byBrbm93IHRoZXNlIHBhcmFtZXRlcnMuICAqLwotI2RlZmluZSBUQVJHRVRfQUxJQVMJImFscGhhLXZtcyIKLSNkZWZpbmUgVEFSR0VUX0NQVQkiYWxwaGEiCi0jZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwJImFscGhhLWRlYy12bXMiCi0jZGVmaW5lIFRBUkdFVF9PUwkib3BlblZNUy9BbHBoYSIKLSNkZWZpbmUgVEFSR0VUX1ZFTkRPUgkiZGVjIgotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBtYWxsb2MgYW5kIHJlYWxsb2MuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIGZyZWUuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBTb21ldGltZXMgZXJybm8uaCBkb2Vzbid0IGRlY2xhcmUgZXJybm8gaXRzZWxmLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PCi0KLSN1bmRlZiBNQU5ZX1NFR01FTlRTCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBzcGFyYyBjb25maWd1cmF0aW9uICovCi0jdW5kZWYgc3BhcmN2OQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfUkVNT1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRVJSTk9fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUVNT1JZX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBIQVZFX1NZU19UWVBFU19ICi0jZWxzZQotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNlbmRpZgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9ICS8qIGNvbmZpZy1nYXMuY29tIHdpbGwgbWFrZSBvbmUgaWYgbmVjZXNzYXJ5ICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFSQVJHU19ICi0KLS8qIFZNUy1zcGVjaWZpYzogIHdlIG5lZWQgdG8gc2V0IHVwIEVYSVRfeHh4IGhlcmUgYmVjYXVzZSB0aGUgZGVmYXVsdAotICAgdmFsdWVzIGluIGFzLmggYXJlIGluYXBwcm9wcmlhdGUgZm9yIFZNUywgYnV0IHdlIGFsc28gd2FudCB0byBwcmV2ZW50Ci0gICBhcy5oJ3MgaW5jbHVzaW9uIG9mIDxzdGRsaWIuaD4gZnJvbSB0cmlnZ2VyaW5nIHJlZGVmaW5pdGlvbiB3YXJuaW5ncy4KLSAgIDxzdGRsaWIuaD4gZ3VhcmRzIGl0c2VsZiBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiwgc28gaW5jbHVkaW5nIGl0Ci0gICBoZXJlIHR1cm5zIGFzLmgncyBsYXRlciAjaW5jbHVkZSBpbnRvIGEgbm8tb3AuICAoV2UgY2FuJ3Qgc2ltcGx5IHVzZQotICAgI2lmbmRlZiBIQVZFX1NURExJQl9IIGhlcmUsIGJlY2F1c2UgdGhlIDxzdGRsaWIuaD4gaW4gc2V2ZXJhbCBvbGRlcgotICAgZ2NjLXZtcyBkaXN0cmlidXRpb25zIG5lZ2xlY3RzIHRvIGRlZmluZSB0aGVzZSB0d28gcmVxdWlyZWQgbWFjcm9zLikgICovCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWYgX19ERUNDCi0jdW5kZWYgRVhJVF9TVUNDRVNTCi0jdW5kZWYgRVhJVF9GQUlMVVJFCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAxCQkJLyogU1MkX05PUk1BTCwgU1RTJEtfU1VDQ0VTUyAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgMHgxMDAwMDAwMgkJLyogKFNUUyRLX0VSUk9SIHwgU1RTJE1fSU5ISUJfTVNHKSAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jaWYgX19ERUNDCi1leHRlcm4gaW50IHN0cmNhc2VjbXAgKCk7Ci1leHRlcm4gaW50IHN0cm5jYXNlY21wICgpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3Ztcy1jb25mLmggYi9nYXMvY29uZmlnL3Ztcy1jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMjVjZmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy92bXMtY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qIHZtcy1jb25mLmguICBHZW5lcmF0ZWQgbWFudWFsbHkgZnJvbSBjb25mLmluLAotICAgYW5kIHVzZWQgYnkgY29uZmlnLWdhcy5jb20gd2hlbiBjb25zdHJ1Y3RpbmcgY29uZmlnLmguICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgQ19BTExPQ0EKLSNlbHNlCi0jZGVmaW5lIENfQUxMT0NBCi0jZW5kaWYKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIGlubGluZQotI2VuZGlmCi0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICgtMSkKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBOYW1lIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBvZiBwYWNrYWdlLiAgKi8KLS8qIERlZmluZSBpbiBieSBjb25maWctZ2FzLmNvbSAqLwotLyogI3VuZGVmIFZFUlNJT04gKi8KLQotLyogU2hvdWxkIGdhcyB1c2UgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlcz8gICovCi0jdW5kZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBTb21lIGFzc2VydC9wcmVwcm9jZXNzb3IgY29tYmluYXRpb25zIGFyZSBpbmNhcGFibGUgb2YgaGFuZGxpbmcKLSAgIGNlcnRhaW4ga2luZHMgb2YgY29uc3RydWN0cyBpbiB0aGUgYXJndW1lbnQgb2YgYXNzZXJ0LiAgRm9yIGV4YW1wbGUsCi0gICBxdW90ZWQgc3RyaW5ncyAoaWYgcmVxdW90aW5nIGlzbid0IGRvbmUgcmlnaHQpIG9yIG5ld2xpbmVzLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIEJST0tFTl9BU1NFUlQKLSNlbHNlCi0jZGVmaW5lIEJST0tFTl9BU1NFUlQKLSNlbmRpZgotCi0vKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgY3Jvc3MtYXNzZW1ibGluZywgc29tZSBvcGVyYXRpb25zIGNhbiBiZSBvcHRpbWl6ZWQsCi0gICBzaW5jZSBieXRlIG9yZGVycyBhbmQgdmFsdWUgc2l6ZXMgZG9uJ3QgbmVlZCB0byBiZSBhZGp1c3RlZC4gICovCi0jdW5kZWYgQ1JPU1NfQ09NUElMRQotCi0vKiBTb21lIGdhcyBjb2RlIHdhbnRzIHRvIGtub3cgdGhlc2UgcGFyYW1ldGVycy4gICovCi0jZGVmaW5lIFRBUkdFVF9BTElBUwkidm1zIgotI2RlZmluZSBUQVJHRVRfQ1BVCSJ2YXgiCi0jZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwJInZheC1kZWMtdm1zIgotI2RlZmluZSBUQVJHRVRfT1MJInZtcyIKLSNkZWZpbmUgVEFSR0VUX1ZFTkRPUgkiZGVjIgotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBzdHJzdHIuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIG1hbGxvYyBhbmQgcmVhbGxvYy4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgZnJlZS4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIHNicmsuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotCi0vKiBTb21ldGltZXMgZXJybm8uaCBkb2Vzbid0IGRlY2xhcmUgZXJybm8gaXRzZWxmLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PCi0KLSN1bmRlZiBNQU5ZX1NFR01FTlRTCi0KLS8qIFRoZSBjb25maWd1cmUgc2NyaXB0IGRlZmluZXMgdGhpcyBmb3Igc29tZSB0YXJnZXRzIGJhc2VkIG9uIHRoZQotICAgdGFyZ2V0IG5hbWUgdXNlZC4gIEl0IGlzIG5vdCBhbHdheXMgZGVmaW5lZC4gICovCi0jdW5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLQotLyogTmVlZGVkIG9ubHkgZm9yIHNvbWUgY29uZmlndXJhdGlvbnMgdGhhdCBjYW4gcHJvZHVjZSBtdWx0aXBsZSBvdXRwdXQKLSAgIGZvcm1hdHMuICAqLwotI3VuZGVmIERFRkFVTFRfRU1VTEFUSU9OCi0jdW5kZWYgRU1VTEFUSU9OUwotI3VuZGVmIFVTRV9FTVVMQVRJT05TCi0jdW5kZWYgT0JKX01BWUJFX0FPVVQKLSN1bmRlZiBPQkpfTUFZQkVfQk9VVAotI3VuZGVmIE9CSl9NQVlCRV9DT0ZGCi0jdW5kZWYgT0JKX01BWUJFX0VDT0ZGCi0jdW5kZWYgT0JKX01BWUJFX0VMRgotI3VuZGVmIE9CSl9NQVlCRV9HRU5FUklDCi0jdW5kZWYgT0JKX01BWUJFX0hQMzAwCi0jdW5kZWYgT0JKX01BWUJFX0lFRUUKLSN1bmRlZiBPQkpfTUFZQkVfU09NCi0jdW5kZWYgT0JKX01BWUJFX1ZNUwotCi0vKiBVc2VkIGZvciBzb21lIG9mIHRoZSBDT0ZGIGNvbmZpZ3VyYXRpb25zLCB3aGVuIHRoZSBDT0ZGIGNvZGUgbmVlZHMKLSAgIHRvIHNlbGVjdCBzb21ldGhpbmcgYmFzZWQgb24gdGhlIENQVSB0eXBlIGJlZm9yZSBpdCBrbm93cyBpdC4uLiAqLwotI3VuZGVmIEkzODZDT0ZGCi0jdW5kZWYgTTY4S0NPRkYKLSN1bmRlZiBNODhLQ09GRgotCi0vKiBVc2luZyBjZ2VuIGNvZGU/ICAqLwotI3VuZGVmIFVTSU5HX0NHRU4KLQotLyogTmVlZGVkIG9ubHkgZm9yIHNwYXJjIGNvbmZpZ3VyYXRpb24uICAqLwotI3VuZGVmIERFRkFVTFRfQVJDSAotCi0vKiBOZWVkZWQgb25seSBmb3IgUG93ZXJQQyBTb2xhcmlzLiAgKi8KLSN1bmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBTQ08gNS4gICovCi0jdW5kZWYgU0NPX0VMRgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfUkVNT1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0vKiBzYnJrKCkgaXMgYXZhaWxhYmxlLCBidXQgd2UgZG9uJ3Qgd2FudCBnYXMgdG8gdXNlIGl0LiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1bmxpbmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVU5MSU5LCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUREFSR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0gKLSNlbHNlCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotI2VuZGlmCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfVU5JU1REX0gJLyogY29uZmlnLWdhcy5jb20gd2lsbCBtYWtlIG9uZSBpZiBuZWNlc3NhcnkgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFyYXJncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQVJBUkdTX0gKLQotLyogVk1TLXNwZWNpZmljOiAgd2UgbmVlZCB0byBzZXQgdXAgRVhJVF94eHggaGVyZSBiZWNhdXNlIHRoZSBkZWZhdWx0Ci0gICB2YWx1ZXMgaW4gYXMuaCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgVk1TLCBidXQgd2UgYWxzbyB3YW50IHRvIHByZXZlbnQKLSAgIGFzLmgncyBpbmNsdXNpb24gb2YgPHN0ZGxpYi5oPiBmcm9tIHRyaWdnZXJpbmcgcmVkZWZpbml0aW9uIHdhcm5pbmdzLgotICAgPHN0ZGxpYi5oPiBndWFyZHMgaXRzZWxmIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLCBzbyBpbmNsdWRpbmcgaXQKLSAgIGhlcmUgdHVybnMgYXMuaCdzIGxhdGVyICNpbmNsdWRlIGludG8gYSBuby1vcC4gIChXZSBjYW4ndCBzaW1wbHkgdXNlCi0gICAjaWZuZGVmIEhBVkVfU1RETElCX0ggaGVyZSwgYmVjYXVzZSB0aGUgPHN0ZGxpYi5oPiBpbiBzZXZlcmFsIG9sZGVyCi0gICBnY2Mtdm1zIGRpc3RyaWJ1dGlvbnMgbmVnbGVjdHMgdG8gZGVmaW5lIHRoZXNlIHR3byByZXF1aXJlZCBtYWNyb3MuKSAgKi8KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jdW5kZWYgRVhJVF9TVUNDRVNTCi0jdW5kZWYgRVhJVF9GQUlMVVJFCi0jZW5kaWYKLSNkZWZpbmUgRVhJVF9TVUNDRVNTIDEJCQkvKiBTUyRfTk9STUFMLCBTVFMkS19TVUNDRVNTICovCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAweDEwMDAwMDAyCQkvKiAoU1RTJEtfRVJST1IgfCBTVFMkTV9JTkhJQl9NU0cpICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlndXJlIGIvZ2FzL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZjNDRmMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNjE0NCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtYmZkLWFzc2VtYmxlciAgdXNlIEJGRCBiYWNrIGVuZCBmb3Igd3JpdGluZyBvYmplY3QgZmlsZXMiCi1hY19oZWxwPSIkYWNfaGVscAotICAgIHRhcmdldHMgICAgICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMgYmVzaWRlcyB0aGUgcHJpbWFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9YXMuaAotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDc6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI4OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDY6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjgxOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczNDogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3OTE6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWdhcwotCi1WRVJTSU9OPTIuOS41Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODM3OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NjM6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzY6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODg5OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTc1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDA1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDM1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTEyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE2MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjU6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5MzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzY6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI2MDogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjYzOiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5OTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxNTogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNTM6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MjA6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ3MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1lY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUxODogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTMwOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2Ci1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NTY6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE1OTggImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyMDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfY2NfbmVlZHNfYmVsZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjU1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIERMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzIyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgbmVlZF9sb2Nrcz0kZW5hYmxldmFsCi1lbHNlCi0gIG5lZWRfbG9ja3M9eWVzCi1maQotCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLXVzZXJfYmZkX2dhcz0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyIG9yIC0tZGlzYWJsZS1iZmQtYXNzZW1ibGVyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2JmZF9hc3NlbWJsZXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2JmZF9hc3NlbWJsZXIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBuZWVkX2JmZD15ZXMgdXNlcl9iZmRfZ2FzPXllcyA7OwotICBubykgIHVzZXJfYmZkX2dhcz1ubyA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgYmZkLWFzc2VtYmxlciBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotCSAgICA7OwotICBubykJICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKQkgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi11c2luZ19jZ2VuPW5vCi0KLSMgR2VuZXJhdGUgYSBoZWFkZXIgZmlsZQotCi0KLQotCi0jIElmIHdlIGFyZSBvbiBhIERPUyBmaWxlc3lzdGVtLCB3ZSBtdXN0IHVzZSBnZGIuaW5pIHJhdGhlciB0aGFuCi0jIC5nZGJpbml0LgotR0RCSU5JVD0iLmdkYmluaXQiCi1jYXNlICIke2hvc3R9IiBpbgotICAqLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cyopCi0gICAgR0RCSU5JVD0iZ2RiLmluaSIKLSAgICA7OwotZXNhYwotCi0KLXRlX2ZpbGU9Z2VuZXJpYwotCi0jIE1ha2VmaWxlIHRhcmdldCBmb3IgaW5zdGFsbGluZyBnYXMgaW4gJCh0b29sZGlyKS9iaW4uCi1pbnN0YWxsX3Rvb2xkaXI9aW5zdGFsbC1leGVjLXRvb2xkaXIKLQotY2Fub25fdGFyZ2V0cz0iIgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgZm9yIHQgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2A7IGRvCi0gICAgcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdCAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLSAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0jICAgIGVsc2UKLSMgICAgICAjIFBlcm1pdCAiYWxsIiwgZXRjLiAgV2UgZG9uJ3Qgc3VwcG9ydCBpdCB5ZXQgdGhvdWdoLgotIyAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0IgotICAgIGZpCi0gIGRvbmUKLSAgX2dhc191bmlxX2xpc3Q9IiRjYW5vbl90YXJnZXRzIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgJF9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSAkX2dhc191bmlxX2kgaW4KLSAgX2dhc191bmlxX2R1bW15KSA7OwotICAqKSBjYXNlICIgJF9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiAkX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IiRfZ2FzX3VuaXFfbmV3bGlzdCAkX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotY2Fub25fdGFyZ2V0cz0kX2dhc191bmlxX25ld2xpc3QKLQotZmkKLQotZW11bGF0aW9ucz0iIgotCi1mb3IgdGhpc190YXJnZXQgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cyA7IGRvCi0KLSAgICBldmFsIGBlY2hvICR0aGlzX3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL2NwdT1cMSB2ZW5kb3I9XDIgb3M9XDMvJ2AKLQotICAgICMgY2hlY2sgZm9yIGFyY2hpdGVjdHVyZSB2YXJpYW50cwotICAgIGFyY2g9Ci0gICAgZW5kaWFuPQotICAgIGNhc2UgJHtjcHV9IGluCi0gICAgICBhbHBoYSopCQljcHVfdHlwZT1hbHBoYSA7OwotICAgICAgYXJtZWIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgYXJtKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmwpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtdipiKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKLSAgICAgIHN0cm9uZ2FybSopCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICB0aHVtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgaHBwYSopCQljcHVfdHlwZT1ocHBhIDs7Ci0gICAgICBpWzQ1Nl04NikJCWNwdV90eXBlPWkzODYgOzsKLSAgICAgIG02ODBbMDEyMzQ2XTApCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODAwOCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODM/PykJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG01MjAwKQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTgqKQkJY3B1X3R5cGU9bTg4ayA7OwotICAgICAgbWlwcyplbCkJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcyopCQljcHVfdHlwZT1taXBzIGVuZGlhbj1iaWcgOzsKLSAgICAgIHBqbCopCQljcHVfdHlwZT1waiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBwaiopCQljcHVfdHlwZT1waiBlbmRpYW49YmlnIDs7Ci0gICAgICBwb3dlcnBjbGUqKQljcHVfdHlwZT1wcGMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgcG93ZXJwYyopCQljcHVfdHlwZT1wcGMgZW5kaWFuPWJpZyA7OwotICAgICAgcnM2MDAwKikJCWNwdV90eXBlPXBwYyA7OwotICAgICAgc3BhcmNsaXRlKikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsKLSAgICAgIHNwYXJjbGV0KikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xldCA7OwotICAgICAgc3BhcmM2NCopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXY5LTY0IDs7Ci0gICAgICBzcGFyYzg2eCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmM4NnggIDs7Ci0gICAgICBzcGFyYyopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGl0ZSA7OyAjID8/PyBTZWUgdGMtc3BhcmMuYy4KLSAgICAgIHY4NTAqKQkJY3B1X3R5cGU9djg1MCA7OwotICAgICAgKikJCWNwdV90eXBlPSR7Y3B1fSA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgdGFyZ2V0X2NwdV90eXBlPSR7Y3B1X3R5cGV9Ci0gICAgZWxpZiB0ZXN0ICR7dGFyZ2V0X2NwdV90eXBlfSAhPSAke2NwdV90eXBlfSA7IHRoZW4KLSAgICAgIGNvbnRpbnVlCi0gICAgZmkKLQotICAgIGdlbmVyaWNfdGFyZ2V0PSR7Y3B1X3R5cGV9LSR2ZW5kb3ItJG9zCi0gICAgZGV2PW5vCi0gICAgYmZkX2dhcz1ubwotICAgIGVtPWdlbmVyaWMKLQotICAgICMgYXNzaWduIG9iamVjdCBmb3JtYXQKLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9IGluCi0gICAgICBhMjlrLSotY29mZikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLXVkaSkgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1hbWQtZWJtb24pICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLW55dS1zeW0xKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstKi12eHdvcmtzKikgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBhbHBoYSotKi0qdm1zKikJICAgIGZtdD1ldmF4IDs7Ci0gICAgICBhbHBoYSotKi1uZXR3YXJlKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vcGVuYnNkKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vc2YqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eGVjb2ZmKikgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eC1nbnUqKSAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgYWxwaGEqLSotbmV0YnNkKikgICAgIGZtdD1lbGYgZW09bmJzZCA7OwotCi0gICAgICBhcmMtKi1lbGYqKSAgICAgICAgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBhcm0tKi1hb3V0KQkgICAgICAgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGFybS0qLWNvZmYgfCB0aHVtYi0qLWNvZmYpICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYXJtLSotZWxmIHwgdGh1bWItKi1lbGYpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybS0qLWxpbnV4KmFvdXQqKQkgICAgICAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBhcm0tKi1saW51eCogfCBhcm12Ki0qLWxpbnV4LWdudSkJZm10PWVsZiAgZW09bGludXggOzsKLSAgICAgIGFybS0qLW5ldGJzZCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKi1vYWJpIHwgdGh1bWItKi1vYWJpKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgYXJtLWVwb2MtcGUgfCB0aHVtYi1lcG9jLXBlKSAgICAgIGZtdD1jb2ZmIGVtPWVwb2MtcGUgOzsKLSAgICAgIGFybS0qLXBlIHwgdGh1bWItKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgYXJtLSotcmlzY2l4KikJICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPXJpc2NpeCA7OwotCi0gICAgICBkMTB2LSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBkMzB2LSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLQotICAgICAgZnIzMC0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBocHBhLSotKmVsZiopICAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbGl0ZXMqKSAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotb3NmKikgICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotcnRlbXMqKSAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotaHB1eCopICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbXBlaXgqKSAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotYnNkKikgICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotaGl1eCopICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0KLSAgICAgIGg4MzAwLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBpMzg2LWlibS1haXgqKSAgICAgICAgZm10PWNvZmYgZW09aTM4NmFpeCA7OwotICAgICAgaTM4Ni1zZXF1ZW50LWJzZCopICAgIGZtdD1hb3V0IGVtPWR5bml4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc3BlKikgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1iZW9zZWxmKiB8IGkzODYtKi1iZW9zKikgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJzZCopICAgICAgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLW5ldGJzZDAuOCkgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXM7OwotICAgICAgaTM4Ni0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXM7OwotICAgICAgaTM4Ni0qLWxpbnV4KmFvdXQqIHwgaTM4Ni0qLWxpbnV4b2xkbGQpICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eCpjb2ZmKikgICBmbXQ9Y29mZiBlbT1saW51eCA7OwotICAgICAgaTM4Ni0qLWxpbnV4LWdudSopICAgIGZtdD1lbGYgZW09bGludXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBpMzg2LSotc3lzdjQqIHwgaTM4Ni0qLXNvbGFyaXMqIHwgaTM4Ni0qLWVsZikKLQkJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotZnJlZWJzZGFvdXQqIHwgaTM4Ni0qLWZyZWVic2QxMi4qIHwgaTM4Ni0qLWZyZWVic2QxMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1mcmVlYnNkKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1jb2ZmIHwgaTM4Ni0qLXN5c3YqIHwgaTM4Ni0qLXNjbzMuMnY1KmNvZmYgfCBpMzg2LSotaXNjKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1zY28zLjJ2NSopICAgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNDT19FTEYgMQotRU9GCi0KLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBpMzg2LSotc2NvMy4yKikgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi12c3RhKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1zZG9zZGpncHAqIHwgaTM4Ni0qLWdvMzIqIHwgaTM4Ni1nbzMyLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiBlbT1nbzMyOzsKLSAgICAgIGkzODYtKi1ydGVtc2VsZiopICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1nbnUqKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotbWFjaCopCi0JCQkgICAgZm10PWFvdXQgZW09bWFjaCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1zZG9zKikgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpMzg2LSotbW9zcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGkzODYtKi1jeWd3aW4qKSAgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWludGVyaXgqKQkgICAgZm10PWNvZmYgZW09aW50ZXJpeCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1pbmd3MzIqKSAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotKm50KikgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGkzODYtKi12eHdvcmtzKikgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTk2MC0qLWJvdXQpICAgICAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotY29mZikgICAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLW5pbmR5KikgICAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczQqKSAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4wKSAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M1LiopICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotdnh3b3JrcyopICAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi1lbGYqKQkgICAgZm10PWVsZiA7OwotCi0gICAgICBtMzJyLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIG02OGstKi12eHdvcmtzKiB8IG02OGstZXJpY3Nzb24tb3NlIHwgbTY4ay0qLXN1bm9zKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICBtNjhrLW1vdG9yb2xhLXN5c3YqKSAgZm10PWNvZmYgZW09ZGVsdGEgOzsKLSAgICAgIG02OGstYnVsbC1zeXN2MyopICAgICBmbXQ9Y29mZiBlbT1kcHgyIDs7Ci0gICAgICBtNjhrLWFwb2xsby0qKSAgICAgICAgZm10PWNvZmYgZW09YXBvbGxvIDs7Ci0gICAgICBtNjhrLSotc3lzdjQqKSAjIG11c3QgYmUgYmVmb3JlIC1zeXN2KgotCQkJICAgIGZtdD1lbGYgZW09c3ZyNCA7OwotICAgICAgbTY4ay0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtNjhrLSotY29mZiB8IG02OGstKi1zeXN2KiB8IG02OGstKi1ydGVtcyopCi0JCQkgICAgZm10PWNvZmYgOzsKLSAgICAgIG02OGstKi1ocHV4KikgICAgICAgICBmbXQ9aHAzMDAgZW09aHAzMDAgOzsKLSAgICAgIG02OGstKi1saW51eCphb3V0KikgICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgbTY4ay0qLWxpbnV4LWdudSopICAgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIG02OGstKi1nbnUqKQkgICAgZm10PWVsZiA7OwotICAgICAgbTY4ay0qLWx5bnhvcyopICAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIG02OGstKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtNjhrLSotb3BlbmJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgbTY4ay1hcHBsZS1hdXgqKSAgICAgIGZtdD1jb2ZmIGVtPWF1eCA7OwotICAgICAgbTY4ay0qLXBzb3MqKSAgICAgICAgIGZtdD1lbGYgZW09cHNvczs7Ci0KLSAgICAgIG04OGstbW90b3JvbGEtc3lzdjMqKSBmbXQ9Y29mZiBlbT1kZWx0ODggOzsKLSAgICAgIG04OGstKi1jb2ZmKikgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBtY29yZS0qLWVsZikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG1jb3JlLSotcGUpCSAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotCi0gICAgICAjIGRvbid0IGNoYW5nZSBlbSBsaWtlICotKi1ic2QgZG9lcwotICAgICAgbWlwcy1kZWMtbmV0YnNkKikJICAgIGZtdD1lbGYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1kZWMtb3BlbmJzZCopICAgIGZtdD1lbGYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1kZWMtYnNkKikgICAgICAgIGZtdD1hb3V0IGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtc29ueS1ic2QqKSAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1ic2QqKSAgICAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVua25vd24gdmVuZG9yIGZvciBtaXBzLWJzZCBjb25maWd1cmF0aW9uLiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci0gICAgICBtaXBzLSotdWx0cml4KikgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1vc2YqKSAgICAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWlyaXg2KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4NSopICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotaXJpeCopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotbG5ld3MqKSAgICAgICAgZm10PWVjb2ZmIGVtPWxuZXdzIDs7Ci0gICAgICBtaXBzLSotcmlzY29zKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotc3lzdiopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotZWxmKiB8IG1pcHMtKi1ydGVtcyogfCBtaXBzLSotbGludXgtZ251KiB8IG1pcHMtKi1nbnUqIHwgbWlwcy0qLW9wZW5ic2QqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi12eHdvcmtzKikgICAgICBmbXQ9ZWxmCi0JCQkgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE1JUFNfU1RBQlNfRUxGIDEKLUVPRgotCi0JCQkgICAgOzsKLSAgICAgIG1uMTAyMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbW4xMDMwMC0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBwaiopCQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotcGUgfCBwcGMtKi1jeWd3aW4qIHwgcHBjLSotd2lubnQqKQotCQkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgcHBjLSotYWl4KikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBwcGMtKi1iZW9zKikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLSpic2QqIHwgcHBjLSotZWxmKiB8IHBwYy0qLWVhYmkqIHwgcHBjLSotc3lzdjQqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLWxpbnV4LWdudSopCSAgICBmbXQ9ZWxmCi0JCQkgICAgY2FzZSAiJGVuZGlhbiIgaW4KLQkJCSAgICBiaWcpICA7OwotCQkJICAgICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR05VL0xpbnV4IG11c3QgYmUgY29uZmlndXJlZCBiaWcgZW5kaWFuIiAxPiYyOyBleGl0IDE7IH0gOzsKLQkJCSAgICBlc2FjCi0JCQkgICAgOzsKLSAgICAgIHBwYy0qLXNvbGFyaXMqKQkgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQgMQotRU9GCi0KLQkJCSAgICBmaQotCQkJICAgIGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhiaWc7IHRoZW4KLQkJCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFNvbGFyaXMgbXVzdCBiZSBjb25maWd1cmVkIGxpdHRsZSBlbmRpYW4iIDE+JjI7IGV4aXQgMTsgfQotCQkJICAgIGZpCi0JCQkgICAgOzsKLSAgICAgIHBwYy0qLXJ0ZW1zKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLW1hY29zKiB8IHBwYy0qLW1wdyopCi0JCQkgICAgZm10PWNvZmYgZW09bWFjb3MgOzsKLSAgICAgIHBwYy0qLW5ldHdhcmUqKSAgICAgICBmbXQ9ZWxmIGVtPXBwY253IDs7Ci0gICAgICBwcGMtKi12eHdvcmtzKikgICAgICAgZm10PWVsZiA7OwotCi0gICAgICBzaC0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLWNvZmYqKSAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHNoLSotcnRlbXNlbGYqKSAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLXJ0ZW1zKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG5zMzJrLXBjNTMyLW1hY2gqIHwgbnMzMmstcGM1MzItdXgqKSAgICBmbXQ9YW91dCBlbT1wYzUzMm1hY2ggOzsKLSAgICAgIG5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopICBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0gICAgICBuczMyay1wYzUzMi1vcGVuYnNkKikgZm10PWFvdXQgZW09bmJzZDUzMiA7OwotCi0gICAgICBzcGFyYy0qLXJ0ZW1zKikgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIHNwYXJjLSotc3Vub3M0KikgICAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICBzcGFyYy0qLWFvdXQgfCBzcGFyYyotKi12eHdvcmtzKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zcGFyY2FvdXQgOzsKLSAgICAgIHNwYXJjLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3BhcmMtKi1saW51eCphb3V0KikgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4LWdudSopICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgc3BhcmMtKi1seW54b3MqKSAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIHNwYXJjLWZ1aml0c3Utbm9uZSkgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1lbGYgfCBzcGFyYy0qLXN5c3Y0KiB8IHNwYXJjLSotc29sYXJpcyopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgc3BhcmMtKi1uZXRic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLSAgICAgIHNwYXJjLSotb3BlbmJzZCopICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7Ci0KLSAgICAgIHN0cm9uZ2FybS0qLWNvZmYpICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3Ryb25nYXJtLSotZWxmKSAgICAgIGZtdD1lbGYgOzsKLQotICAgICAgdGljMzAtKi0qYW91dCopCSAgICBmbXQ9YW91dCBiZmRfZ2FzPXllcyA7OwotICAgICAgdGljMzAtKi0qY29mZiopICAgICAgIGZtdD1jb2ZmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWM4MC0qLSopCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICB2ODUwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZWEtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICB2YXgtKi1ic2QqIHwgdmF4LSotdWx0cml4KikKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgdmF4LSotdm1zKSAgICAgICAgICAgIGZtdD12bXMgOzsKLQotCi0gICAgICB6OGstKi1jb2ZmIHwgejhrLSotc2ltKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHc2NS0qLSopICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICAqLSotYW91dCB8ICotKi1zY291dCkKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5pbmR5KikKLQkJCSAgICBmbXQ9Ym91dCA7OwotICAgICAgKi0qLWJzZCopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgKi0qLWdlbmVyaWMpICAgICAgICAgIGZtdD1nZW5lcmljIDs7Ci0gICAgICAqLSoteHJheSB8ICotKi1obXMpICAgZm10PWNvZmYgOzsKLSAgICAgICotKi1zaW0pICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLWVsZiB8ICotKi1zeXN2NCogfCAqLSotc29sYXJpcyopCi0JCQkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBHQVMgc3VwcG9ydCBmb3IgJHtnZW5lcmljX3RhcmdldH0gaXMgaW5jb21wbGV0ZS4iIDE+JjIKLQkJCSAgICBmbXQ9ZWxmIGRldj15ZXMgOzsKLSAgICAgICotKi12eHdvcmtzKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5ldHdhcmUpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIGVuZGlhbl9kZWY9Ci0gICAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JZW5kaWFuX2RlZj0xCi0gICAgICBlbGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhsaXR0bGU7IHRoZW4KLQllbmRpYW5fZGVmPTAKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IHgke2VuZGlhbl9kZWZ9ICE9IHg7IHRoZW4KLQljYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAkZW5kaWFuX2RlZgotRU9GCi0KLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGNhc2UgJHtjcHVfdHlwZX0tJHtmbXR9IGluCi0gICAgICBhbHBoYSotKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIGFybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICMgbm90IHlldAotICAgICMgaTM4Ni1hb3V0KQliZmRfZ2FzPXByZWZlcnJlZCA7OwotICAgICAgbWlwcy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgbnMzMmstKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBwYy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgc3BhcmMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHN0cm9uZ2FybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lbGYpCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLWVjb2ZmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1zb20pCWJmZF9nYXM9eWVzIDs7Ci0gICAgI2VuYWJsZSBiZmQgZm9yIGNvZmYgdG8gYWxsb3cgdGVzdGluZyBpZiBhIGJmZCB0YXJnZXQgaXMgdGhlIHByaW1hcnkgdGFyZ2V0LAotICAgICNidXQgbm90IGZvciBjb2ZmIGFzIHRoZSBwcmltYXJ5IHRhcmdldAotICAgICAgaTM4Ni1jb2ZmKQlpZiB0ZXN0IHgke3ByaW1hcnlfYmZkX2dhc30gPSB4eWVzOyB0aGVuIGJmZF9nYXM9eWVzOyBmaSA7OwotICAgICAgKikJCTs7Ci0gICAgZXNhYwotCi0jIE90aGVyIHJhbmRvbSBzdHVmZi4KLQotICAgICMgRG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIHZheCB8IGkzODYgfCB0aWMzMCkKLQk7OwotCi0gICAgICAqKQotCW5lZWRfb3Bjb2Rlcz15ZXMKLQotCWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0JeWVzKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7Ci0JKm9wY29kZXMqKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7Ci0JKikgc2hhcmVkX29wY29kZXM9ZmFsc2UgOzsKLQllc2FjCi0JaWYgdGVzdCAiJHtzaGFyZWRfb3Bjb2Rlc30iID0gInRydWUiOyB0aGVuCi0JICAjIEEgc2hhcmVkIGxpYm9wY29kZXMgbXVzdCBiZSBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuCi0JICBuZWVkX2JmZD15ZXMKLQlmaQotCTs7Ci0gICAgZXNhYwotCi0gICAgIyBBbnkgb3RoZXIgc3BlY2lhbCBvYmplY3QgZmlsZXMgbmVlZGVkID8KLSAgICBjYXNlICR7Y3B1X3R5cGV9IGluCi0gICAgICBmcjMwIHwgbTMycikKLQl1c2luZ19jZ2VuPXllcwotCTs7Ci0KLSAgICAgIG02OGspCi0JY2FzZSAke2V4dHJhX29iamVjdHN9IGluCi0JKm02OGstcGFyc2UubyopIDs7Ci0JKikgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgbTY4ay1wYXJzZS5vIiA7OwotCWVzYWMKLQk7OwotCi0gICAgICBtaXBzKQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0YmwtcGFyc2UubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtcGFyc2UubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1sZXgubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtbGV4Lm8iCi0JZmkKLQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0Ymwtb3BzLm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLW9wcy5vIgotCWZpCi0JOzsKLQotICAgICAgc3BhcmMpCi0JaWYgdGVzdCAkdGhpc190YXJnZXQgPSAkdGFyZ2V0IDsgdGhlbgotCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgREVGQVVMVF9BUkNIICIke2FyY2h9IgotRU9GCi0KLQlmaQotCTs7Ci0gICAgICAqKQotCTs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLQljYXNlICJ4JHtleHRyYV9vYmplY3RzfSIgaW4KLQkqY2dlbi5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBjZ2VuLm8iIDs7Ci0JZXNhYwotICAgIGZpCi0KLSMgU2VlIGlmIHdlIHJlYWxseSBjYW4gc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZW11bGF0aW9uIGNvZGUuCi0KLSAgICBpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICBwcmltYXJ5X2JmZF9nYXM9JGJmZF9nYXMKLSAgICAgIG9ial9mb3JtYXQ9JGZtdAotICAgICAgdGVfZmlsZT0kZW0KLQotICAgICAgaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotCSMgQ2FuJ3Qgc3VwcG9ydCBvdGhlciBjb25maWd1cmF0aW9ucyB0aGlzIHdheS4KLQlicmVhawotICAgICAgZmkKLSAgICBlbGlmIHRlc3QgJGJmZF9nYXMgPSBubyA7IHRoZW4KLSAgICAgICMgQ2FuJ3Qgc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAgICBicmVhawotICAgIGZpCi0KLSMgRnJvbSB0YXJnZXQgbmFtZSBhbmQgZm9ybWF0LCBwcm9kdWNlIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KLQotICAgIGNhc2UgJHtnZW5lcmljX3RhcmdldH0tJHtmbXR9IGluCi0gICAgICBtaXBzLSotaXJpeDUqLSopCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiBtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotICAgICAgbWlwcy0qLWxpbnV4LWdudSotKikgY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYgbWlwc2xlY29mZiBtaXBzYmVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCWVzYWMgOzsKLSAgICAgIG1pcHMtKi1sbmV3cyotZWNvZmYpIDs7Ci0gICAgICBtaXBzLSotKi1lY29mZikJY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLSotZWxmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBpMzg2LSotZWxmKQllbXVsYXRpb249ImkzODZlbGYiIDs7Ci0gICAgICBpMzg2LSotY29mZikJZW11bGF0aW9uPSJpMzg2Y29mZiIgOzsKLSAgICAgICMgVW5jb21tZW50aW5nIHRoZSBuZXh0IGxpbmUgd2lsbCB0dXJuIG9uIHN1cHBvcnQgZm9yIGkzODYgQ09GRgotICAgICAgIyBpbiBhbnkgaTM4NiBFTEYgY29uZmlndXJhdGlvbi4KLSAgICAgICMgaTM4Ni0qLSotZWxmKQllbXVsYXRpb249ImkzODZlbGYgaTM4NmNvZmYiIDs7Ci0gICAgZXNhYwotCi0gICAgZW11bGF0aW9ucz0iJGVtdWxhdGlvbnMgJGVtdWxhdGlvbiIKLQotZG9uZQotCi0jIEFzc2lnbiBmbG9hdGluZyBwb2ludCB0eXBlLiAgTW9zdCBwcm9jZXNzb3JzIHdpdGggRlAgc3VwcG9ydAotIyBJRUVFIEZQLiAgT24gdGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IEZQIGF0IGFsbCwgdXN1YWxseSBJRUVFCi0jIGlzIGVtdWxhdGVkLgotY2FzZSAke3RhcmdldF9jcHV9IGluCi0gIHZheCB8IHRhaG9lICkJYXRvZj0ke3RhcmdldF9jcHV9IDs7Ci0gICopCQlhdG9mPWllZWUgOzsKLWVzYWMKLQotY2FzZSAiJHtvYmpfZm9ybWF0fSIgaW4KLSAgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IGtub3cgd2hhdCBmb3JtYXQgdG8gdXNlIGZvciB0YXJnZXQgJHt0YXJnZXR9IiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotIyBVbmZvcnR1bmF0ZWx5IHRoZSBjcHUgaW4gY3B1LW9wYy5oIGZpbGUgaXNuJ3QgYWx3YXlzICQoVEFSR0VUX0NQVSkuCi1jZ2VuX2NwdV9wcmVmaXg9IiIKLWlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0gIGNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICAgICopIGNnZW5fY3B1X3ByZWZpeD0ke3RhcmdldF9jcHV9IDs7Ci0gIGVzYWMKLSAgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0lOR19DR0VOIDEKLUVPRgotCi1maQotCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL3RjLSR7dGFyZ2V0X2NwdV90eXBlfS5jOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0IENQVSAke3RhcmdldF9jcHVfdHlwZX0iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotaWYgdGVzdCAhIC1yICR7c3JjZGlyfS9jb25maWcvb2JqLSR7b2JqX2Zvcm1hdH0uYzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdCAke29ial9mb3JtYXR9IiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWNhc2UgJHt1c2VyX2JmZF9nYXN9LSR7cHJpbWFyeV9iZmRfZ2FzfSBpbgotICB5ZXMteWVzIHwgbm8tbm8pCi0gICAgIyBXZSBkaWRuJ3Qgb3ZlcnJpZGUgdXNlcidzIGNob2ljZS4KLSAgICA7OwotICBuby15ZXMpCi0gICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBVc2Ugb2YgQkZEIGlzIHJlcXVpcmVkIGZvciAke3RhcmdldH07IG92ZXJyaWRpbmcgY29uZmlnIG9wdGlvbnMuIiAxPiYyCi0gICAgOzsKLSAgbm8tcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz1ubwotICAgIDs7Ci0gICotcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKLSAgICA7OwotICB5ZXMtKikKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgLSopCi0gICAgIyBVc2VyIHNwZWNpZmllZCBub3RoaW5nLgotICAgIDs7Ci1lc2FjCi0KLSMgU29tZSBDT0ZGIGNvbmZpZ3VyYXRpb25zIHdhbnQgdGhlc2UgcmFuZG9tIG90aGVyIGZsYWdzIHNldC4KLWNhc2UgJHtvYmpfZm9ybWF0fSBpbgotICBjb2ZmKQotICAgIGNhc2UgJHt0YXJnZXRfY3B1X3R5cGV9IGluCi0gICAgICBpMzg2KSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSTM4NkNPRkYgMQotRU9GCi0gOzsKLSAgICAgIG02OGspIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNNjhLQ09GRiAxCi1FT0YKLSA7OwotICAgICAgbTg4aykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE04OEtDT0ZGIDEKLUVPRgotIDs7Ci0gICAgZXNhYwotICAgIDs7Ci1lc2FjCi0KLSMgR2V0dGluZyB0aGlzIGRvbmUgcmlnaHQgaXMgZ29pbmcgdG8gYmUgYSBiaXRjaC4gIEVhY2ggY29uZmlndXJhdGlvbiBzcGVjaWZpZWQKLSMgd2l0aCAtLWVuYWJsZS10YXJnZXRzPS4uLiBzaG91bGQgYmUgY2hlY2tlZCBmb3IgZW52aXJvbm1lbnQsIGZvcm1hdCwgY3B1LCBhbmQKLSMgYmZkX2dhcyBzZXR0aW5nLgotIwotIyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB0aGUgbmVjZXNzYXJ5IG9iamVjdCBmaWxlIHN1cHBvcnQgY29kZSBtdXN0IGJlIGxpbmtlZAotIyBpbi4gIFRoaXMgbWlnaHQgYmUgb25seSBvbmUsIGl0IG1pZ2h0IGJlIHVwIHRvIGZvdXIuICBUaGUgbmVjZXNzYXJ5IGVtdWxhdGlvbgotIyBjb2RlIG5lZWRzIHRvIGJlIHByb3ZpZGVkLCB0b28uCi0jCi0jIEFuZCB0aGVuIHRoZXJlJ3MgIi0tZW5hYmxlLXRhcmdldHM9YWxsIi4uLi4KLSMKLSMgRm9yIG5vdywganVzdCBhbHdheXMgZG8gaXQgZm9yIE1JUFMgRUxGIG9yIEVDT0ZGIGNvbmZpZ3VyYXRpb25zLiAgU2lnaC4KLQotZm9ybWF0cz0iJHtvYmpfZm9ybWF0fSIKLWVtZmlsZXM9IiIKLUVNVUxBVElPTlM9IiIKLV9nYXNfdW5pcV9saXN0PSIkZW11bGF0aW9ucyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWVtdWxhdGlvbnM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWZvciBlbSBpbiAuICRlbXVsYXRpb25zIDsgZG8KLSAgY2FzZSAkZW0gaW4KLSAgICAuKQljb250aW51ZSA7OwotICAgIG1pcHNiZWxmIHwgbWlwc2xlbGYpCi0JZm10PWVsZiAgIGZpbGU9bWlwc2VsZiA7OwotICAgIG1pcHNiZWNvZmYgfCBtaXBzbGVjb2ZmKQotCWZtdD1lY29mZiBmaWxlPW1pcHNlY29mZiA7OwotICAgIGkzODZjb2ZmKQotCWZtdD1jb2ZmICBmaWxlPWkzODZjb2ZmIDs7Ci0gICAgaTM4NmVsZikKLQlmbXQ9ZWxmICAgZmlsZT1pMzg2ZWxmIDs7Ci0gIGVzYWMKLSAgZm9ybWF0cz0iJGZvcm1hdHMgJGZtdCIKLSAgZW1maWxlcz0iJGVtZmlsZXMgZS0kZmlsZS5vIgotICBFTVVMQVRJT05TPSIkRU1VTEFUSU9OUyAmJGVtLCIKLWRvbmUKLV9nYXNfdW5pcV9saXN0PSIkZm9ybWF0cyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWZvcm1hdHM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLV9nYXNfdW5pcV9saXN0PSIkZW1maWxlcyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWVtZmlsZXM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWlmIHRlc3QgYHNldCAuICRmb3JtYXRzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMSA7IHRoZW4KLSAgZm9yIGZtdCBpbiAkZm9ybWF0cyA7IGRvCi0gICAgY2FzZSAkZm10IGluCi0gICAgICBhb3V0KQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0FPVVQgMQotRU9GCi0gICA7OwotICAgICAgYm91dCkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9CT1VUIDEKLUVPRgotICAgOzsKLSAgICAgIGNvZmYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfQ09GRiAxCi1FT0YKLSAgICA7OwotICAgICAgZWNvZmYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfRUNPRkYgMQotRU9GCi0gICA7OwotICAgICAgZWxmKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0VMRiAxCi1FT0YKLSAgICAgOzsKLSAgICAgIGdlbmVyaWMpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfR0VORVJJQyAxCi1FT0YKLSA7OwotICAgICAgaHAzMDApCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfSFAzMDAgMQotRU9GCi0gICA7OwotICAgICAgaWVlZSkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9JRUVFIDEKLUVPRgotICAgIDs7Ci0gICAgICBzb20pCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfU09NIDEKLUVPRgotICAgICA7OwotICAgICAgdm1zKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX1ZNUyAxCi1FT0YKLSAgICAgOzsKLSAgICBlc2FjCi0gICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgb2JqLSRmbXQubyIKLSAgZG9uZQotICBvYmpfZm9ybWF0PW11bHRpCi1maQotaWYgdGVzdCBgc2V0IC4gJGVtZmlsZXMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAwIDsgdGhlbgotICBERUZBVUxUX0VNVUxBVElPTj1gc2V0IC4gJGVtdWxhdGlvbnMgOyBlY2hvICQyYAotICAjIGUtbWlwcyogaGFzIG1vcmUgdGhhbiBvbmUgZW11bGF0aW9uIHBlciBmaWxlLCBlLWkzODYqIGhhcyBqdXN0IG9uZSBhdCB0aGUKLSAgIyBtb21lbnQuICBJZiBvbmx5IG9uZSBlbXVsYXRpb24gaXMgc3BlY2lmaWVkLCB0aGVuIGRvbid0IGRlZmluZQotICAjIFVTRV9FTVVMQVRJT05TIG9yIGluY2x1ZGUgYW55IG9mIHRoZSBlLWZpbGVzIGFzIHRoZXkgd2lsbCBvbmx5IGJlIGJsb2F0LgotICBjYXNlICIke29ial9mb3JtYXR9JHtlbWZpbGVzfSIgaW4KLSAgICBtdWx0aSogfCAqbWlwcyopCi0gICAgICB0ZV9maWxlPW11bHRpCi0gICAgICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyAkZW1maWxlcyIKLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfRU1VTEFUSU9OUyAxCi1FT0YKLSA7OwotICBlc2FjCi1maQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBFTVVMQVRJT05TICRFTVVMQVRJT05TCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgREVGQVVMVF9FTVVMQVRJT04gIiRERUZBVUxUX0VNVUxBVElPTiIKLUVPRgotCi0KLWNhc2UgJHtwcmltYXJ5X2JmZF9nYXN9LSR7dGFyZ2V0X2NwdV90eXBlfS0ke29ial9mb3JtYXR9IGluCi0gIHllcy0qLWNvZmYpCW5lZWRfYmZkPXllcyA7OwotICBuby0qLWNvZmYpCW5lZWRfYmZkPXllcwotCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTUFOWV9TRUdNRU5UUyAxCi1FT0YKLSA7OwotZXNhYwotCi1yZWplY3RfZGV2X2NvbmZpZ3M9eWVzCi0KLWNhc2UgJHtyZWplY3RfZGV2X2NvbmZpZ3N9LSR7ZGV2fSBpbgotICB5ZXMteWVzKSAjIE9vcHMuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHQVMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgJHtnZW5lcmljX3RhcmdldH0gY29uZmlndXJhdGlvbi4iIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci1lc2FjCi0KLQotCi0KLQotCi0KLWNhc2UgIiR7cHJpbWFyeV9iZmRfZ2FzfSIgaW4KLSAgeWVzKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQkZEX0FTU0VNQkxFUiAxCi1FT0YKLQotCW5lZWRfYmZkPXllcyA7OwotZXNhYwotCi0jIGRvIHdlIG5lZWQgdGhlIG9wY29kZXMgbGlicmFyeT8KLWNhc2UgIiR7bmVlZF9vcGNvZGVzfSIgaW4KLXllcykKLSAgT1BDT0RFU19MSUI9Li4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhCi0gIDs7Ci1lc2FjCi0KLWNhc2UgIiR7bmVlZF9iZmR9IiBpbgoteWVzKQotICBCRkRMSUI9Li4vYmZkL2xpYmJmZC5sYQotICBBTExfT0JKX0RFUFM9IiRBTExfT0JKX0RFUFMgLi4vYmZkL2JmZC5oIgotICA7OwotZXNhYwotCi0KLQotCi0KLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX0FMSUFTICIke3RhcmdldF9hbGlhc30iCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTCAiJHt0YXJnZXR9IgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9DUFUgIiR7dGFyZ2V0X2NwdX0iCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX1ZFTkRPUiAiJHt0YXJnZXRfdmVuZG9yfSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfT1MgIiR7dGFyZ2V0X29zfSIKLUVPRgotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcwMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjczMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3ODI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4MTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDI4MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODMwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4NTY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODYxOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODcwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4ODk6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYwotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MjY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ZQUNDPSIkYWNfY3ZfcHJvZ19ZQUNDIgotaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWUFDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRZQUNDIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTU3OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5Nzg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5ODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5OTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWZvciBhY19wcm9nIGluIGZsZXggbGV4Ci1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJExFWCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRMRVgiIHx8IExFWD0iIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImZsZXgiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA3NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9ImZsZXgiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0xFWCIgJiYgYWNfY3ZfcHJvZ19MRVg9ImxleCIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRMRVhMSUIiCi10aGVuCi0gIGNhc2UgIiRMRVgiIGluCi0gIGZsZXgqKSBhY19saWI9ZmwgOzsKLSAgKikgYWNfbGliPWwgOzsKLSAgZXNhYwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEwOTogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQotYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbCRhY19saWIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzExNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHl5d3JhcCgpOwotCi1pbnQgbWFpbigpIHsKLXl5d3JhcCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTEVYTElCPSItbCRhY19saWIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNTE6IGNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF9yb290JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGUgbWluaW1hbCBsZXggcHJvZ3JhbSBpcyBqdXN0IGEgc2luZ2xlIGxpbmU6ICUlLiAgQnV0IHNvbWUgYnJva2VuIGxleGVzCi0jIChTb2xhcmlzLCBJIHRoaW5rIGl0IHdhcykgd2FudCB0d28gJSUgbGluZXMsIHNvIGFjY29tbW9kYXRlIHRoZW0uCi1lY2hvICclJQotJSUnIHwgJExFWAotaWYgdGVzdCAtZiBsZXgueXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleC55eQotZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXh5eQotZWxzZQotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF9yb290IiAxPiY2Ci1MRVhfT1VUUFVUX1JPT1Q9JGFjX2N2X3Byb2dfbGV4X3Jvb3QKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTcyOiBjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBQT1NJWCBzYXlzIGxleCBjYW4gZGVjbGFyZSB5eXRleHQgZWl0aGVyIGFzIGEgcG9pbnRlciBvciBhbiBhcnJheTsgdGhlCi0jIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBGaWd1cmUgb3V0IHdoaWNoIGl0IGlzLCBzaW5jZQotIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KLWFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPW5vCi1lY2hvICdleHRlcm4gY2hhciAqeXl0ZXh0OycgPj4kTEVYX09VVFBVVF9ST09ULmMKLWFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSIkTElCUyAkTEVYTElCIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1gY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2AKLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLXJtIC1mICIke0xFWF9PVVRQVVRfUk9PVH0uYyIKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKLUVPRgotCi1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMTU6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMzY6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMyNDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjg0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzQwOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM5NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDE1OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDI5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ1NTogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDg4OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MjM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTU2OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MjE6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY1MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY1NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MDY6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzE0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc1ODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3NjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM3Njg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc5NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgwMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODUwOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzODU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTk4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAyNjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQwMzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDY2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwOTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMjM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxMjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE1MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTg1OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxOTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIxODogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjM4OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyNTc6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI2NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyODQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDI4OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzEyOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDMyMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNDc6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM1MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Mzg3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDIxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0NzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTEyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1NDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTg0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYxODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2NTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3NDQ6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3NzI6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3NzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc4MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODQ1OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDg2ODogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDg3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg4NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDkwMTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDkxMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTMyOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTQyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1mb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0ZGxpYi5oIG1lbW9yeS5oIHN0cmluZ3MuaCB1bmlzdGQuaCBzdGRhcmcuaCB2YXJhcmdzLmggZXJybm8uaCBzeXMvdHlwZXMuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5Njc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTc3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0jIFB1dCB0aGlzIGhlcmUgc28gdGhhdCBhdXRvY29uZidzICJjcm9zcy1jb21waWxpbmciIG1lc3NhZ2UgZG9lc24ndCBjb25mdXNlCi0jIHBlb3BsZSB3aG8gYXJlIG5vdCBjcm9zcy1jb21waWxpbmcgYnV0IGFyZSBjb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVycy4KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgY29tcGlsaW5nIGEgY3Jvc3MtYXNzZW1ibGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDA3OiBjaGVja2luZyB3aGV0aGVyIGNvbXBpbGluZyBhIGNyb3NzLWFzc2VtYmxlciIgPiY1Ci1pZiB0ZXN0ICIke2hvc3R9IiA9ICIke3RhcmdldH0iOyB0aGVuCi0gIGNyb3NzX2dhcz1ubwotZWxzZQotICBjcm9zc19nYXM9eWVzCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDUk9TU19DT01QSUxFIDEKLUVPRgotCi1maQotZWNobyAiJGFjX3QiIiRjcm9zc19nYXMiIDE+JjYKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAyMjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwMjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTAzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwNTU6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTA2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTEyMDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUxMjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTUwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTIwNTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyMTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTIzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyNTQ6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTI2MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyNjg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotCi0jIFZNUyBkb2Vzbid0IGhhdmUgdW5saW5rLgotZm9yIGFjX2Z1bmMgaW4gdW5saW5rIHJlbW92ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTI5ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTMwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBTb21lIHN5c3RlbXMgZG9uJ3QgaGF2ZSBzYnJrKCkuCi1mb3IgYWNfZnVuYyBpbiBzYnJrCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MzU1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MzYwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAotIyBlbm91Z2gsIGJ1dCBvbiBzb21lIG9mIHRob3NlIHN5c3RlbXMsIHRoZSBhc3NlcnQgbWFjcm8gcmVsaWVzIG9uIHJlcXVvdGluZwotIyB3b3JraW5nIHByb3Blcmx5IQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDEyOiBjaGVja2luZyBmb3Igd29ya2luZyBhc3NlcnQgbWFjcm8iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9hc3NlcnRfb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDE3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotaW50IG1haW4oKSB7Ci0KLS8qIGNoZWNrIGZvciByZXF1b3RpbmcgcHJvYmxlbXMgKi8KLXN0YXRpYyBpbnQgYSwgYiwgYywgZDsKLXN0YXRpYyBjaGFyICpzOwotYXNzZXJ0ICghc3RyY21wKHMsICJmb28gYmFyIGJheiBxdXV4IikpOwotLyogY2hlY2sgZm9yIG5ld2xpbmUgaGFuZGxpbmcgKi8KLWFzc2VydCAoYSA9PSBiCi0gICAgICAgIHx8IGMgPT0gZCk7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfYXNzZXJ0X29rPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfYXNzZXJ0X29rPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfYXNzZXJ0X29rIiAxPiY2Ci10ZXN0ICRnYXNfY3ZfYXNzZXJ0X29rID0geWVzIHx8IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBCUk9LRU5fQVNTRVJUIDEKLUVPRgotCi0KLQotIyBPbiBzb21lIHN5c3RlbXMsIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIG1heSBub3QgZGVjbGFyZSBtYWxsb2MsIHJlYWxsb2MsCi0jIGFuZCBmcmVlLiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSBnYXMgbmVlZHMgdGhlc2UgZnVuY3Rpb25zIHRvIGhhdmUgYmVlbgotIyBkZWNsYXJlZCAtLSBzdWNoIGFzIHdoZW4gdGFraW5nIHRoZWlyIGFkZHJlc3Nlcy4KLWdhc190ZXN0X2hlYWRlcnM9IgotI2lmZGVmIEhBVkVfTUVNT1JZX0gKLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzdHJzdHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU0NzQ6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIHN0cnN0ciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0cicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU0NzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKigqZikoKTsKLWYgeDsKLXggPSAoZikgc3Ryc3RyOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQ5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciA9IHllczsgdGhlbgotIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBtYWxsb2MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU1MTE6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIG1hbGxvYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU1MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKigqZikoKTsKLWYgeDsKLXggPSAoZikgbWFsbG9jOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTUyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYyIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYyA9IHllczsgdGhlbgotIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBmcmVlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTQ4OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBmcmVlIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfZnJlZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU1NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIHZvaWQgKCpmKSgpOwotZiB4OwoteCA9IChmKSBmcmVlOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTU2NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLUVPRgotCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIHNicmsiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU1ODU6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIHNicmsiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9zYnJrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTU5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0kZ2FzX3Rlc3RfaGVhZGVycwotaW50IG1haW4oKSB7Ci0KLXR5cGVkZWYgY2hhciAqKCpmKSgpOwotZiB4OwoteCA9IChmKSBzYnJrOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTYwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX3Nicms9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX3Nicms9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfc2JyayIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX3NicmsgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TQlJLIDEKLUVPRgotCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGVudmlyb24iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2MjI6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGVudmlyb24iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTYyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0kZ2FzX3Rlc3RfaGVhZGVycwotaW50IG1haW4oKSB7Ci0KLXR5cGVkZWYgY2hhciAqKmY7Ci1mIHg7Ci14ID0gKGYpIGVudmlyb247Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9lbnZpcm9uIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiA9IHllczsgdGhlbgotIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04gMQotRU9GCi0KLWZpCi0KLQotIyBEb2VzIGVycm5vLmggZGVjbGFyZSBlcnJubywgb3IgZG8gd2UgaGF2ZSB0byBhZGQgYSBzZXBhcmF0ZSBkZWNsYXJhdGlvbgotIyBmb3IgaXQ/Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGVycm5vIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjYyOiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlcnJubyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTY2NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBIQVZFX0VSUk5PX0gKLSNpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi0KLWludCBtYWluKCkgewotCi10eXBlZGVmIGludCBmOwotZiB4OwoteCA9IChmKSBlcnJubzsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2ODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9lcnJubz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm89eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm8iIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9lcnJubyA9IHllczsgdGhlbgotIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PIDEKLUVPRgotCi1maQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgZG9jL01ha2VmaWxlICR7R0RCSU5JVH06Z2RiaW5pdC5pbiBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQEdEQklOSVRAJSRHREJJTklUJWcKLXMlQGNnZW5fY3B1X3ByZWZpeEAlJGNnZW5fY3B1X3ByZWZpeCVnCi1zJUBleHRyYV9vYmplY3RzQCUkZXh0cmFfb2JqZWN0cyVnCi1zJUB0YXJnZXRfY3B1X3R5cGVAJSR0YXJnZXRfY3B1X3R5cGUlZwotcyVAb2JqX2Zvcm1hdEAlJG9ial9mb3JtYXQlZwotcyVAdGVfZmlsZUAlJHRlX2ZpbGUlZwotcyVAaW5zdGFsbF90b29sZGlyQCUkaW5zdGFsbF90b29sZGlyJWcKLXMlQGF0b2ZAJSRhdG9mJWcKLXMlQEJGRExJQkAlJEJGRExJQiVnCi1zJUBPUENPREVTX0xJQkAlJE9QQ09ERVNfTElCJWcKLXMlQEFMTF9PQkpfREVQU0AlJEFMTF9PQkpfREVQUyVnCi1zJUBZQUNDQCUkWUFDQyVnCi1zJUBMRVhAJSRMRVglZwotcyVATEVYTElCQCUkTEVYTElCJWcKLXMlQENQUEAlJENQUCVnCi1zJUBMRVhfT1VUUFVUX1JPT1RAJSRMRVhfT1VUUFVUX1JPT1QlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgZG9jL01ha2VmaWxlICR7R0RCSU5JVH06Z2RiaW5pdC5pbiBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi10YXJnZXRfY3B1X3R5cGU9JHt0YXJnZXRfY3B1X3R5cGV9Ci0gY2dlbl9jcHVfcHJlZml4PSR7Y2dlbl9jcHVfcHJlZml4fQotIG9ial9mb3JtYXQ9JHtvYmpfZm9ybWF0fQotIHRlX2ZpbGU9JHt0ZV9maWxlfQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotcm0gLWYgdGFyZy1jcHUuYyB0YXJnLWNwdS5oIG9iai1mb3JtYXQuaCBvYmotZm9ybWF0LmMgdGFyZy1lbnYuaCBhdG9mLXRhcmcuYyBpdGJsLWNwdS5oCi0gZWNobyAnI2luY2x1ZGUgInRjLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gdGFyZy1jcHUuaAotIGVjaG8gJyNpbmNsdWRlICJvYmotJyIke29ial9mb3JtYXR9IicuaCInID4gb2JqLWZvcm1hdC5oCi0gZWNobyAnI2luY2x1ZGUgInRlLSciJHt0ZV9maWxlfSInLmgiJyA+IHRhcmctZW52LmgKLSBlY2hvICcjaW5jbHVkZSAiaXRibC0nIiR7dGFyZ2V0X2NwdV90eXBlfSInLmgiJyA+IGl0YmwtY3B1LmgKLSBpZiB0ZXN0ICJ4JGNnZW5fY3B1X3ByZWZpeCIgIT0geCA7IHRoZW4KLSAgIGVjaG8gJyNpbmNsdWRlICJvcGNvZGVzLyciJHtjZ2VuX2NwdV9wcmVmaXh9IictZGVzYy5oIicgPiBjZ2VuLWRlc2MuaAotIGZpCi0KLSBzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlndXJlLmluIGIvZ2FzL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3MjExYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzk3ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi1kbmwgQW5kIGJlIGNhcmVmdWwgd2hlbiBjaGFuZ2luZyBpdCEgIElmIHlvdSBtdXN0IGFkZCB0ZXN0cyB3aXRoIHNxdWFyZQotZG5sIGJyYWNrZXRzLCBiZSBzdXJlIGNoYW5nZXF1b3RlIGludm9jYXRpb25zIHN1cnJvdW5kIGl0LgotZG5sCi1kbmwKLWRubCB2Mi41IG5lZWRlZCBmb3IgLS1iaW5kaXIgZXQgYWwKLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChhcy5oKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UoZ2FzLCAyLjkuNSkKLQotQU1fUFJPR19MSUJUT09MCi0KLXVzZXJfYmZkX2dhcz0KLUFDX0FSR19FTkFCTEUoYmZkLWFzc2VtYmxlciwKLVsgIC0tZW5hYmxlLWJmZC1hc3NlbWJsZXIgIHVzZSBCRkQgYmFjayBlbmQgZm9yIHdyaXRpbmcgb2JqZWN0IGZpbGVzXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgbmVlZF9iZmQ9eWVzIHVzZXJfYmZkX2dhcz15ZXMgOzsKLSAgbm8pICB1c2VyX2JmZF9nYXM9bm8gOzsKLSAgKikgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgYmZkLWFzc2VtYmxlciBvcHRpb24pIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgICAgdGFyZ2V0cyAgICAgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyBiZXNpZGVzIHRoZSBwcmltYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLQkgICAgOzsKLSAgbm8pCSAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikJICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLXVzaW5nX2NnZW49bm8KLQotIyBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotIyBJZiB3ZSBhcmUgb24gYSBET1MgZmlsZXN5c3RlbSwgd2UgbXVzdCB1c2UgZ2RiLmluaSByYXRoZXIgdGhhbgotIyAuZ2RiaW5pdC4KLUdEQklOSVQ9Ii5nZGJpbml0IgotY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotICAgIEdEQklOSVQ9ImdkYi5pbmkiCi0gICAgOzsKLWVzYWMKLUFDX1NVQlNUKEdEQklOSVQpCi0KLXRlX2ZpbGU9Z2VuZXJpYwotCi0jIE1ha2VmaWxlIHRhcmdldCBmb3IgaW5zdGFsbGluZyBnYXMgaW4gJCh0b29sZGlyKS9iaW4uCi1pbnN0YWxsX3Rvb2xkaXI9aW5zdGFsbC1leGVjLXRvb2xkaXIKLQotY2Fub25fdGFyZ2V0cz0iIgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgZm9yIHQgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2A7IGRvCi0gICAgcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdCAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLSAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0jICAgIGVsc2UKLSMgICAgICAjIFBlcm1pdCAiYWxsIiwgZXRjLiAgV2UgZG9uJ3Qgc3VwcG9ydCBpdCB5ZXQgdGhvdWdoLgotIyAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0IgotICAgIGZpCi0gIGRvbmUKLSAgR0FTX1VOSVEoY2Fub25fdGFyZ2V0cykKLWZpCi0KLWVtdWxhdGlvbnM9IiIKLQotZm9yIHRoaXNfdGFyZ2V0IGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMgOyBkbwotCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIGV2YWwgYGVjaG8gJHRoaXNfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvY3B1PVwxIHZlbmRvcj1cMiBvcz1cMy8nYAotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0gICAgIyBjaGVjayBmb3IgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzCi0gICAgYXJjaD0KLSAgICBlbmRpYW49Ci0gICAgY2FzZSAke2NwdX0gaW4KLSAgICAgIGFscGhhKikJCWNwdV90eXBlPWFscGhhIDs7Ci0gICAgICBhcm1lYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7Ci0gICAgICBhcm0qKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybXYqbCkJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgc3Ryb25nYXJtKikJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIHRodW1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBocHBhKikJCWNwdV90eXBlPWhwcGEgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgICBpWzQ1Nl04NikJCWNwdV90eXBlPWkzODYgOzsKLSAgICAgIG02ODBbMDEyMzQ2XTApCWNwdV90eXBlPW02OGsgOzsKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgIG02ODAwOCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODM/PykJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG01MjAwKQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTgqKQkJY3B1X3R5cGU9bTg4ayA7OwotICAgICAgbWlwcyplbCkJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcyopCQljcHVfdHlwZT1taXBzIGVuZGlhbj1iaWcgOzsKLSAgICAgIHBqbCopCQljcHVfdHlwZT1waiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBwaiopCQljcHVfdHlwZT1waiBlbmRpYW49YmlnIDs7Ci0gICAgICBwb3dlcnBjbGUqKQljcHVfdHlwZT1wcGMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgcG93ZXJwYyopCQljcHVfdHlwZT1wcGMgZW5kaWFuPWJpZyA7OwotICAgICAgcnM2MDAwKikJCWNwdV90eXBlPXBwYyA7OwotICAgICAgc3BhcmNsaXRlKikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsKLSAgICAgIHNwYXJjbGV0KikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xldCA7OwotICAgICAgc3BhcmM2NCopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXY5LTY0IDs7Ci0gICAgICBzcGFyYzg2eCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmM4NnggIDs7Ci0gICAgICBzcGFyYyopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGl0ZSA7OyAjID8/PyBTZWUgdGMtc3BhcmMuYy4KLSAgICAgIHY4NTAqKQkJY3B1X3R5cGU9djg1MCA7OwotICAgICAgKikJCWNwdV90eXBlPSR7Y3B1fSA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgdGFyZ2V0X2NwdV90eXBlPSR7Y3B1X3R5cGV9Ci0gICAgZWxpZiB0ZXN0ICR7dGFyZ2V0X2NwdV90eXBlfSAhPSAke2NwdV90eXBlfSA7IHRoZW4KLSAgICAgIGNvbnRpbnVlCi0gICAgZmkKLQotICAgIGdlbmVyaWNfdGFyZ2V0PSR7Y3B1X3R5cGV9LSR2ZW5kb3ItJG9zCi0gICAgZGV2PW5vCi0gICAgYmZkX2dhcz1ubwotICAgIGVtPWdlbmVyaWMKLQotICAgICMgYXNzaWduIG9iamVjdCBmb3JtYXQKLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9IGluCi0gICAgICBhMjlrLSotY29mZikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLXVkaSkgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1hbWQtZWJtb24pICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLW55dS1zeW0xKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstKi12eHdvcmtzKikgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBhbHBoYSotKi0qdm1zKikJICAgIGZtdD1ldmF4IDs7Ci0gICAgICBhbHBoYSotKi1uZXR3YXJlKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vcGVuYnNkKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vc2YqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eGVjb2ZmKikgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eC1nbnUqKSAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgYWxwaGEqLSotbmV0YnNkKikgICAgIGZtdD1lbGYgZW09bmJzZCA7OwotCi0gICAgICBhcmMtKi1lbGYqKSAgICAgICAgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBhcm0tKi1hb3V0KQkgICAgICAgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGFybS0qLWNvZmYgfCB0aHVtYi0qLWNvZmYpICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYXJtLSotZWxmIHwgdGh1bWItKi1lbGYpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybS0qLWxpbnV4KmFvdXQqKQkgICAgICAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBhcm0tKi1saW51eCogfCBhcm12Ki0qLWxpbnV4LWdudSkJZm10PWVsZiAgZW09bGludXggOzsKLSAgICAgIGFybS0qLW5ldGJzZCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKi1vYWJpIHwgdGh1bWItKi1vYWJpKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgYXJtLWVwb2MtcGUgfCB0aHVtYi1lcG9jLXBlKSAgICAgIGZtdD1jb2ZmIGVtPWVwb2MtcGUgOzsKLSAgICAgIGFybS0qLXBlIHwgdGh1bWItKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgYXJtLSotcmlzY2l4KikJICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPXJpc2NpeCA7OwotCi0gICAgICBkMTB2LSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBkMzB2LSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLQotICAgICAgZnIzMC0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBocHBhLSotKmVsZiopICAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbGl0ZXMqKSAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotb3NmKikgICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotcnRlbXMqKSAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotaHB1eCopICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbXBlaXgqKSAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotYnNkKikgICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotaGl1eCopICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0KLSAgICAgIGg4MzAwLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBpMzg2LWlibS1haXgqKSAgICAgICAgZm10PWNvZmYgZW09aTM4NmFpeCA7OwotICAgICAgaTM4Ni1zZXF1ZW50LWJzZCopICAgIGZtdD1hb3V0IGVtPWR5bml4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc3BlKikgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1iZW9zZWxmKiB8IGkzODYtKi1iZW9zKikgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJzZCopICAgICAgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLW5ldGJzZDAuOCkgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXM7OwotICAgICAgaTM4Ni0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXM7OwotICAgICAgaTM4Ni0qLWxpbnV4KmFvdXQqIHwgaTM4Ni0qLWxpbnV4b2xkbGQpICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eCpjb2ZmKikgICBmbXQ9Y29mZiBlbT1saW51eCA7OwotICAgICAgaTM4Ni0qLWxpbnV4LWdudSopICAgIGZtdD1lbGYgZW09bGludXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBpMzg2LSotc3lzdjQqIHwgaTM4Ni0qLXNvbGFyaXMqIHwgaTM4Ni0qLWVsZikKLQkJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotZnJlZWJzZGFvdXQqIHwgaTM4Ni0qLWZyZWVic2RbMTJdLiogfCBpMzg2LSotZnJlZWJzZFsxMl0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09Mzg2YnNkIDs7Ci0gICAgICBpMzg2LSotZnJlZWJzZCopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotY29mZiB8IGkzODYtKi1zeXN2KiB8IGkzODYtKi1zY28zLjJ2NSpjb2ZmIHwgaTM4Ni0qLWlzYyopCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotc2NvMy4ydjUqKSAgICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCUFDX0RFRklORShTQ09fRUxGLCAxLAotCQkJCSAgICBbRGVmaW5lIGlmIGRlZmF1bHRpbmcgdG8gRUxGIG9uIFNDTyA1Ll0pCi0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgaTM4Ni0qLXNjbzMuMiopICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotdnN0YSkgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGkzODYtKi1tc2Rvc2RqZ3BwKiB8IGkzODYtKi1nbzMyKiB8IGkzODYtZ28zMi1ydGVtcyopCi0JCQkgICAgZm10PWNvZmYgZW09Z28zMjs7Ci0gICAgICBpMzg2LSotcnRlbXNlbGYqKSAgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLXJ0ZW1zKikgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotZ251KikgICAgICAgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLW1hY2gqKQotCQkJICAgIGZtdD1hb3V0IGVtPW1hY2ggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1tc2RvcyopICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1vc3MqKQkgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLXBlKSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBpMzg2LSotY3lnd2luKikgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1pbnRlcml4KikJICAgIGZtdD1jb2ZmIGVtPWludGVyaXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1taW5ndzMyKikgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLSpudCopICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBpMzg2LSotdnh3b3JrcyopICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGk5NjAtKi1ib3V0KSAgICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1uaW5keSopICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M0KikgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuMCkgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4qKSAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3MqKSAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLQotICAgICAgbTMyci0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBtNjhrLSotdnh3b3JrcyogfCBtNjhrLWVyaWNzc29uLW9zZSB8IG02OGstKi1zdW5vcyopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgbTY4ay1tb3Rvcm9sYS1zeXN2KikgIGZtdD1jb2ZmIGVtPWRlbHRhIDs7Ci0gICAgICBtNjhrLWJ1bGwtc3lzdjMqKSAgICAgZm10PWNvZmYgZW09ZHB4MiA7OwotICAgICAgbTY4ay1hcG9sbG8tKikgICAgICAgIGZtdD1jb2ZmIGVtPWFwb2xsbyA7OwotICAgICAgbTY4ay0qLXN5c3Y0KikgIyBtdXN0IGJlIGJlZm9yZSAtc3lzdioKLQkJCSAgICBmbXQ9ZWxmIGVtPXN2cjQgOzsKLSAgICAgIG02OGstKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbTY4ay0qLWNvZmYgfCBtNjhrLSotc3lzdiogfCBtNjhrLSotcnRlbXMqKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBtNjhrLSotaHB1eCopICAgICAgICAgZm10PWhwMzAwIGVtPWhwMzAwIDs7Ci0gICAgICBtNjhrLSotbGludXgqYW91dCopICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIG02OGstKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotZ251KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBtNjhrLSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgbTY4ay0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstYXBwbGUtYXV4KikgICAgICBmbXQ9Y29mZiBlbT1hdXggOzsKLSAgICAgIG02OGstKi1wc29zKikgICAgICAgICBmbXQ9ZWxmIGVtPXBzb3M7OwotCi0gICAgICBtODhrLW1vdG9yb2xhLXN5c3YzKikgZm10PWNvZmYgZW09ZGVsdDg4IDs7Ci0gICAgICBtODhrLSotY29mZiopICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgbWNvcmUtKi1lbGYpCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtY29yZS0qLXBlKQkgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgIyBkb24ndCBjaGFuZ2UgZW0gbGlrZSAqLSotYnNkIGRvZXMKLSAgICAgIG1pcHMtZGVjLW5ldGJzZCopCSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLW9wZW5ic2QqKSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLWJzZCopICAgICAgICBmbXQ9YW91dCBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLXNvbnktYnNkKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotYnNkKikgICAgICAgICAgQUNfTVNHX0VSUk9SKFVua25vd24gdmVuZG9yIGZvciBtaXBzLWJzZCBjb25maWd1cmF0aW9uLikgOzsKLSAgICAgIG1pcHMtKi11bHRyaXgqKSAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLW9zZiopICAgICAgICAgIGZtdD1lY29mZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLSotZWNvZmYqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotZWNvZmYqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotaXJpeDYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLWlyaXg1KikgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1sbmV3cyopICAgICAgICBmbXQ9ZWNvZmYgZW09bG5ld3MgOzsKLSAgICAgIG1pcHMtKi1yaXNjb3MqKSAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1zeXN2KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1lbGYqIHwgbWlwcy0qLXJ0ZW1zKiB8IG1pcHMtKi1saW51eC1nbnUqIHwgbWlwcy0qLWdudSogfCBtaXBzLSotb3BlbmJzZCopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLXZ4d29ya3MqKSAgICAgIGZtdD1lbGYKLQkJCSAgICBBQ19ERUZJTkUoTUlQU19TVEFCU19FTEYsIDEsCi0JCQkJW1VzZSBFTEYgc3RhYnMgZm9yIE1JUFMsIG5vdCBFQ09GRiBzdGFic10pCi0JCQkgICAgOzsKLSAgICAgIG1uMTAyMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbW4xMDMwMC0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBwaiopCQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotcGUgfCBwcGMtKi1jeWd3aW4qIHwgcHBjLSotd2lubnQqKQotCQkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgcHBjLSotYWl4KikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBwcGMtKi1iZW9zKikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLSpic2QqIHwgcHBjLSotZWxmKiB8IHBwYy0qLWVhYmkqIHwgcHBjLSotc3lzdjQqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLWxpbnV4LWdudSopCSAgICBmbXQ9ZWxmCi0JCQkgICAgY2FzZSAiJGVuZGlhbiIgaW4KLQkJCSAgICBiaWcpICA7OwotCQkJICAgICopICAgIEFDX01TR19FUlJPUihHTlUvTGludXggbXVzdCBiZSBjb25maWd1cmVkIGJpZyBlbmRpYW4pIDs7Ci0JCQkgICAgZXNhYwotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1zb2xhcmlzKikJICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCUFDX0RFRklORShUQVJHRVRfU09MQVJJU19DT01NRU5ULCAxLAotCQkJCVtEZWZpbmUgaWYgZGVmYXVsdCB0YXJnZXQgaXMgUG93ZXJQQyBTb2xhcmlzLl0pCi0JCQkgICAgZmkKLQkJCSAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JCQkJQUNfTVNHX0VSUk9SKFNvbGFyaXMgbXVzdCBiZSBjb25maWd1cmVkIGxpdHRsZSBlbmRpYW4pCi0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgcHBjLSotcnRlbXMqKQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbWFjb3MqIHwgcHBjLSotbXB3KikKLQkJCSAgICBmbXQ9Y29mZiBlbT1tYWNvcyA7OwotICAgICAgcHBjLSotbmV0d2FyZSopICAgICAgIGZtdD1lbGYgZW09cHBjbncgOzsKLSAgICAgIHBwYy0qLXZ4d29ya3MqKSAgICAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIHNoLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIHNoLSotY29mZiopICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc2gtKi1ydGVtc2VsZiopICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIHNoLSotcnRlbXMqKQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopICAgIGZtdD1hb3V0IGVtPXBjNTMybWFjaCA7OwotICAgICAgbnMzMmstcGM1MzItbmV0YnNkKiB8IG5zMzJrLXBjNTMyLWxpdGVzKikgIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKLSAgICAgIG5zMzJrLXBjNTMyLW9wZW5ic2QqKSBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0KLSAgICAgIHNwYXJjLSotcnRlbXMqKSAgICAgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1zdW5vczQqKSAgICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIHNwYXJjLSotYW91dCB8IHNwYXJjKi0qLXZ4d29ya3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXNwYXJjYW91dCA7OwotICAgICAgc3BhcmMtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4KmFvdXQqKSAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIHNwYXJjLSotbGludXgtZ251KikgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWx5bnhvcyopICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgc3BhcmMtZnVqaXRzdS1ub25lKSAgIGZtdD1hb3V0IDs7Ci0gICAgICBzcGFyYy0qLWVsZiB8IHNwYXJjLSotc3lzdjQqIHwgc3BhcmMtKi1zb2xhcmlzKikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzcGFyYy0qLW5ldGJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCA7OwotICAgICAgc3BhcmMtKi1vcGVuYnNkKikgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLQotICAgICAgc3Ryb25nYXJtLSotY29mZikgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzdHJvbmdhcm0tKi1lbGYpICAgICAgZm10PWVsZiA7OwotCi0gICAgICB0aWMzMC0qLSphb3V0KikJICAgIGZtdD1hb3V0IGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWMzMC0qLSpjb2ZmKikgICAgICAgZm10PWNvZmYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHRpYzgwLSotKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHY4NTAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHY4NTBlLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHY4NTBlYS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIHZheC0qLWJzZCogfCB2YXgtKi11bHRyaXgqKQotCQkJICAgIGZtdD1hb3V0IDs7Ci0gICAgICB2YXgtKi12bXMpICAgICAgICAgICAgZm10PXZtcyA7OwotCi0KLSAgICAgIHo4ay0qLWNvZmYgfCB6OGstKi1zaW0pCi0JCQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgdzY1LSotKikgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgICotKi1hb3V0IHwgKi0qLXNjb3V0KQotCQkJICAgIGZtdD1hb3V0IDs7Ci0gICAgICAqLSotbmluZHkqKQotCQkJICAgIGZtdD1ib3V0IDs7Ci0gICAgICAqLSotYnNkKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICAqLSotZ2VuZXJpYykgICAgICAgICAgZm10PWdlbmVyaWMgOzsKLSAgICAgICotKi14cmF5IHwgKi0qLWhtcykgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLXNpbSkgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICAqLSotZWxmIHwgKi0qLXN5c3Y0KiB8ICotKi1zb2xhcmlzKikKLQkJCSAgICBBQ19NU0dfV0FSTihHQVMgc3VwcG9ydCBmb3IgJHtnZW5lcmljX3RhcmdldH0gaXMgaW5jb21wbGV0ZS4pCi0JCQkgICAgZm10PWVsZiBkZXY9eWVzIDs7Ci0gICAgICAqLSotdnh3b3JrcykgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgICotKi1uZXR3YXJlKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICBlbmRpYW5fZGVmPQotICAgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgotCWVuZGlhbl9kZWY9MQotICAgICAgZWxpZiB0ZXN0IHgke2VuZGlhbn0gPSB4bGl0dGxlOyB0aGVuCi0JZW5kaWFuX2RlZj0wCi0gICAgICBmaQotICAgICAgaWYgdGVzdCB4JHtlbmRpYW5fZGVmfSAhPSB4OyB0aGVuCi0JQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCAkZW5kaWFuX2RlZiwKLQkJCSAgIFtEZWZpbmUgYXMgMSBpZiBiaWcgZW5kaWFuLl0pCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBjYXNlICR7Y3B1X3R5cGV9LSR7Zm10fSBpbgotICAgICAgYWxwaGEqLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKikJYmZkX2dhcz15ZXMgOzsKLSAgICAjIG5vdCB5ZXQKLSAgICAjIGkzODYtYW91dCkJYmZkX2dhcz1wcmVmZXJyZWQgOzsKLSAgICAgIG1pcHMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIG5zMzJrLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBwcGMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHNwYXJjLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBzdHJvbmdhcm0tKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotZWxmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lY29mZikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotc29tKQliZmRfZ2FzPXllcyA7OwotICAgICNlbmFibGUgYmZkIGZvciBjb2ZmIHRvIGFsbG93IHRlc3RpbmcgaWYgYSBiZmQgdGFyZ2V0IGlzIHRoZSBwcmltYXJ5IHRhcmdldCwKLSAgICAjYnV0IG5vdCBmb3IgY29mZiBhcyB0aGUgcHJpbWFyeSB0YXJnZXQKLSAgICAgIGkzODYtY29mZikJaWYgdGVzdCB4JHtwcmltYXJ5X2JmZF9nYXN9ID0geHllczsgdGhlbiBiZmRfZ2FzPXllczsgZmkgOzsKLSAgICAgICopCQk7OwotICAgIGVzYWMKLQotIyBPdGhlciByYW5kb20gc3R1ZmYuCi0KLSAgICAjIERvIHdlIG5lZWQgdGhlIG9wY29kZXMgbGlicmFyeT8KLSAgICBjYXNlICR7Y3B1X3R5cGV9IGluCi0gICAgICB2YXggfCBpMzg2IHwgdGljMzApCi0JOzsKLQotICAgICAgKikKLQluZWVkX29wY29kZXM9eWVzCi0KLQljYXNlICIke2VuYWJsZV9zaGFyZWR9IiBpbgotCXllcykgc2hhcmVkX29wY29kZXM9dHJ1ZSA7OwotCSpvcGNvZGVzKikgc2hhcmVkX29wY29kZXM9dHJ1ZSA7OwotCSopIHNoYXJlZF9vcGNvZGVzPWZhbHNlIDs7Ci0JZXNhYwotCWlmIHRlc3QgIiR7c2hhcmVkX29wY29kZXN9IiA9ICJ0cnVlIjsgdGhlbgotCSAgIyBBIHNoYXJlZCBsaWJvcGNvZGVzIG11c3QgYmUgbGlua2VkIGFnYWluc3QgbGliYmZkLgotCSAgbmVlZF9iZmQ9eWVzCi0JZmkKLQk7OwotICAgIGVzYWMKLQotICAgICMgQW55IG90aGVyIHNwZWNpYWwgb2JqZWN0IGZpbGVzIG5lZWRlZCA/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgZnIzMCB8IG0zMnIpCi0JdXNpbmdfY2dlbj15ZXMKLQk7OwotCi0gICAgICBtNjhrKQotCWNhc2UgJHtleHRyYV9vYmplY3RzfSBpbgotCSptNjhrLXBhcnNlLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG02OGstcGFyc2UubyIgOzsKLQllc2FjCi0JOzsKLQotICAgICAgbWlwcykKLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLXBhcnNlLm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLXBhcnNlLm8iCi0JZmkKLQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0YmwtbGV4Lm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLWxleC5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLW9wcy5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1vcHMubyIKLQlmaQotCTs7Ci0KLSAgICAgIHNwYXJjKQotCWlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLQkgIEFDX0RFRklORV9VTlFVT1RFRChERUZBVUxUX0FSQ0gsICIke2FyY2h9IiwgW0RlZmF1bHQgYXJjaGl0ZWN0dXJlLl0pCi0JZmkKLQk7OwotICAgICAgKikKLQk7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JY2FzZSAieCR7ZXh0cmFfb2JqZWN0c30iIGluCi0JKmNnZW4ubyopIDs7Ci0JKikgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgY2dlbi5vIiA7OwotCWVzYWMKLSAgICBmaQotCi0jIFNlZSBpZiB3ZSByZWFsbHkgY2FuIHN1cHBvcnQgdGhpcyBjb25maWd1cmF0aW9uIHdpdGggdGhlIGVtdWxhdGlvbiBjb2RlLgotCi0gICAgaWYgdGVzdCAkdGhpc190YXJnZXQgPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgcHJpbWFyeV9iZmRfZ2FzPSRiZmRfZ2FzCi0gICAgICBvYmpfZm9ybWF0PSRmbXQKLSAgICAgIHRlX2ZpbGU9JGVtCi0KLSAgICAgIGlmIHRlc3QgJGJmZF9nYXMgPSBubyA7IHRoZW4KLQkjIENhbid0IHN1cHBvcnQgb3RoZXIgY29uZmlndXJhdGlvbnMgdGhpcyB3YXkuCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZWxpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0gICAgICAjIENhbid0IHN1cHBvcnQgdGhpcyBjb25maWd1cmF0aW9uLgotICAgICAgYnJlYWsKLSAgICBmaQotCi0jIEZyb20gdGFyZ2V0IG5hbWUgYW5kIGZvcm1hdCwgcHJvZHVjZSBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9LSR7Zm10fSBpbgotICAgICAgbWlwcy0qLWlyaXg1Ki0qKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLSAgICAgIG1pcHMtKi1saW51eC1nbnUqLSopIGNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiBtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVsZiBtaXBzYmVsZiBtaXBzZWxmIG1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotbG5ld3MqLWVjb2ZmKSA7OwotICAgICAgbWlwcy0qLSotZWNvZmYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlY29mZiBtaXBzYmVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCWVzYWMgOzsKLSAgICAgIG1pcHMtKi0qLWVsZikJY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVsZiBtaXBzYmVsZiBtaXBzZWxmIiA7OwotCQkJZXNhYyA7OwotICAgICAgaTM4Ni0qLWVsZikJZW11bGF0aW9uPSJpMzg2ZWxmIiA7OwotICAgICAgaTM4Ni0qLWNvZmYpCWVtdWxhdGlvbj0iaTM4NmNvZmYiIDs7Ci0gICAgICAjIFVuY29tbWVudGluZyB0aGUgbmV4dCBsaW5lIHdpbGwgdHVybiBvbiBzdXBwb3J0IGZvciBpMzg2IENPRkYKLSAgICAgICMgaW4gYW55IGkzODYgRUxGIGNvbmZpZ3VyYXRpb24uCi0gICAgICAjIGkzODYtKi0qLWVsZikJZW11bGF0aW9uPSJpMzg2ZWxmIGkzODZjb2ZmIiA7OwotICAgIGVzYWMKLQotICAgIGVtdWxhdGlvbnM9IiRlbXVsYXRpb25zICRlbXVsYXRpb24iCi0KLWRvbmUKLQotIyBBc3NpZ24gZmxvYXRpbmcgcG9pbnQgdHlwZS4gIE1vc3QgcHJvY2Vzc29ycyB3aXRoIEZQIHN1cHBvcnQKLSMgSUVFRSBGUC4gIE9uIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBGUCBhdCBhbGwsIHVzdWFsbHkgSUVFRQotIyBpcyBlbXVsYXRlZC4KLWNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICB2YXggfCB0YWhvZSApCWF0b2Y9JHt0YXJnZXRfY3B1fSA7OwotICAqKQkJYXRvZj1pZWVlIDs7Ci1lc2FjCi0KLWNhc2UgIiR7b2JqX2Zvcm1hdH0iIGluCi0gICIiKSBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IGtub3cgd2hhdCBmb3JtYXQgdG8gdXNlIGZvciB0YXJnZXQgJHt0YXJnZXR9KSA7OwotZXNhYwotCi0jIFVuZm9ydHVuYXRlbHkgdGhlIGNwdSBpbiBjcHUtb3BjLmggZmlsZSBpc24ndCBhbHdheXMgJChUQVJHRVRfQ1BVKS4KLWNnZW5fY3B1X3ByZWZpeD0iIgotaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLSAgY2FzZSAke3RhcmdldF9jcHV9IGluCi0gICAgKikgY2dlbl9jcHVfcHJlZml4PSR7dGFyZ2V0X2NwdX0gOzsKLSAgZXNhYwotICBBQ19TVUJTVChjZ2VuX2NwdV9wcmVmaXgpCi0gIEFDX0RFRklORShVU0lOR19DR0VOLCAxLCBbVXNpbmcgY2dlbiBjb2RlP10pCi1maQotCi1kbmwKLWRubCBNYWtlIHN1cmUgdGhlIGRlc2lyZWQgc3VwcG9ydCBmaWxlcyBleGlzdC4KLWRubAotCi1pZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy90Yy0ke3RhcmdldF9jcHVfdHlwZX0uYzsgdGhlbgotICBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0IENQVSAke3RhcmdldF9jcHVfdHlwZX0pCi1maQotCi1pZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy9vYmotJHtvYmpfZm9ybWF0fS5jOyB0aGVuCi0gIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBvYmplY3QgZmlsZSBmb3JtYXQgJHtvYmpfZm9ybWF0fSkKLWZpCi0KLWNhc2UgJHt1c2VyX2JmZF9nYXN9LSR7cHJpbWFyeV9iZmRfZ2FzfSBpbgotICB5ZXMteWVzIHwgbm8tbm8pCi0gICAgIyBXZSBkaWRuJ3Qgb3ZlcnJpZGUgdXNlcidzIGNob2ljZS4KLSAgICA7OwotICBuby15ZXMpCi0gICAgQUNfTVNHX1dBUk4oVXNlIG9mIEJGRCBpcyByZXF1aXJlZCBmb3IgJHt0YXJnZXR9OyBvdmVycmlkaW5nIGNvbmZpZyBvcHRpb25zLikKLSAgICA7OwotICBuby1wcmVmZXJyZWQpCi0gICAgcHJpbWFyeV9iZmRfZ2FzPW5vCi0gICAgOzsKLSAgKi1wcmVmZXJyZWQpCi0gICAgcHJpbWFyeV9iZmRfZ2FzPXllcwotICAgIDs7Ci0gIHllcy0qKQotICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKLSAgICA7OwotICAtKikKLSAgICAjIFVzZXIgc3BlY2lmaWVkIG5vdGhpbmcuCi0gICAgOzsKLWVzYWMKLQotIyBTb21lIENPRkYgY29uZmlndXJhdGlvbnMgd2FudCB0aGVzZSByYW5kb20gb3RoZXIgZmxhZ3Mgc2V0LgotY2FzZSAke29ial9mb3JtYXR9IGluCi0gIGNvZmYpCi0gICAgY2FzZSAke3RhcmdldF9jcHVfdHlwZX0gaW4KLSAgICAgIGkzODYpIEFDX0RFRklORShJMzg2Q09GRiwgMSwgW1VzaW5nIGkzODYgQ09GRj9dKSA7OwotICAgICAgbTY4aykgQUNfREVGSU5FKE02OEtDT0ZGLCAxLCBbVXNpbmcgbTY4ayBDT0ZGP10pIDs7Ci0gICAgICBtODhrKSBBQ19ERUZJTkUoTTg4S0NPRkYsIDEsIFtVc2luZyBtODhrIENPRkY/XSkgOzsKLSAgICBlc2FjCi0gICAgOzsKLWVzYWMKLQotIyBHZXR0aW5nIHRoaXMgZG9uZSByaWdodCBpcyBnb2luZyB0byBiZSBhIGJpdGNoLiAgRWFjaCBjb25maWd1cmF0aW9uIHNwZWNpZmllZAotIyB3aXRoIC0tZW5hYmxlLXRhcmdldHM9Li4uIHNob3VsZCBiZSBjaGVja2VkIGZvciBlbnZpcm9ubWVudCwgZm9ybWF0LCBjcHUsIGFuZAotIyBiZmRfZ2FzIHNldHRpbmcuCi0jCi0jIEZvciBlYWNoIGNvbmZpZ3VyYXRpb24sIHRoZSBuZWNlc3Nhcnkgb2JqZWN0IGZpbGUgc3VwcG9ydCBjb2RlIG11c3QgYmUgbGlua2VkCi0jIGluLiAgVGhpcyBtaWdodCBiZSBvbmx5IG9uZSwgaXQgbWlnaHQgYmUgdXAgdG8gZm91ci4gIFRoZSBuZWNlc3NhcnkgZW11bGF0aW9uCi0jIGNvZGUgbmVlZHMgdG8gYmUgcHJvdmlkZWQsIHRvby4KLSMKLSMgQW5kIHRoZW4gdGhlcmUncyAiLS1lbmFibGUtdGFyZ2V0cz1hbGwiLi4uLgotIwotIyBGb3Igbm93LCBqdXN0IGFsd2F5cyBkbyBpdCBmb3IgTUlQUyBFTEYgb3IgRUNPRkYgY29uZmlndXJhdGlvbnMuICBTaWdoLgotCi1mb3JtYXRzPSIke29ial9mb3JtYXR9IgotZW1maWxlcz0iIgotRU1VTEFUSU9OUz0iIgotR0FTX1VOSVEoZW11bGF0aW9ucykKLWZvciBlbSBpbiAuICRlbXVsYXRpb25zIDsgZG8KLSAgY2FzZSAkZW0gaW4KLSAgICAuKQljb250aW51ZSA7OwotICAgIG1pcHNiZWxmIHwgbWlwc2xlbGYpCi0JZm10PWVsZiAgIGZpbGU9bWlwc2VsZiA7OwotICAgIG1pcHNiZWNvZmYgfCBtaXBzbGVjb2ZmKQotCWZtdD1lY29mZiBmaWxlPW1pcHNlY29mZiA7OwotICAgIGkzODZjb2ZmKQotCWZtdD1jb2ZmICBmaWxlPWkzODZjb2ZmIDs7Ci0gICAgaTM4NmVsZikKLQlmbXQ9ZWxmICAgZmlsZT1pMzg2ZWxmIDs7Ci0gIGVzYWMKLSAgZm9ybWF0cz0iJGZvcm1hdHMgJGZtdCIKLSAgZW1maWxlcz0iJGVtZmlsZXMgZS0kZmlsZS5vIgotICBFTVVMQVRJT05TPSIkRU1VTEFUSU9OUyAmJGVtLCIKLWRvbmUKLUdBU19VTklRKGZvcm1hdHMpCi1HQVNfVU5JUShlbWZpbGVzKQotaWYgdGVzdCBgc2V0IC4gJGZvcm1hdHMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAxIDsgdGhlbgotICBmb3IgZm10IGluICRmb3JtYXRzIDsgZG8KLSAgICBjYXNlICRmbXQgaW4KLSAgICAgIGFvdXQpCUFDX0RFRklORShPQkpfTUFZQkVfQU9VVCwgMSwgICAgW2Eub3V0IHN1cHBvcnQ/XSkgICA7OwotICAgICAgYm91dCkJQUNfREVGSU5FKE9CSl9NQVlCRV9CT1VULCAxLCAgICBbYi5vdXQgc3VwcG9ydD9dKSAgIDs7Ci0gICAgICBjb2ZmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0NPRkYsIDEsICAgIFtDT0ZGIHN1cHBvcnQ/XSkgICAgOzsKLSAgICAgIGVjb2ZmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0VDT0ZGLCAxLCAgIFtFQ09GRiBzdXBwb3J0P10pICAgOzsKLSAgICAgIGVsZikJQUNfREVGSU5FKE9CSl9NQVlCRV9FTEYsIDEsICAgICBbRUxGIHN1cHBvcnQ/XSkgICAgIDs7Ci0gICAgICBnZW5lcmljKQlBQ19ERUZJTkUoT0JKX01BWUJFX0dFTkVSSUMsIDEsIFtnZW5lcmljIHN1cHBvcnQ/XSkgOzsKLSAgICAgIGhwMzAwKQlBQ19ERUZJTkUoT0JKX01BWUJFX0hQMzAwLCAxLCAgIFtIUDMwMCBzdXBwb3J0P10pICAgOzsKLSAgICAgIGllZWUpCUFDX0RFRklORShPQkpfTUFZQkVfSUVFRSwgMSwgICAgW0lFRUUgc3VwcG9ydD9dKSAgICA7OwotICAgICAgc29tKQlBQ19ERUZJTkUoT0JKX01BWUJFX1NPTSwgMSwgICAgIFtTT00gc3VwcG9ydD9dKSAgICAgOzsKLSAgICAgIHZtcykJQUNfREVGSU5FKE9CSl9NQVlCRV9WTVMsIDEsICAgICBbVk1TIHN1cHBvcnQ/XSkgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG9iai0kZm10Lm8iCi0gIGRvbmUKLSAgb2JqX2Zvcm1hdD1tdWx0aQotZmkKLWlmIHRlc3QgYHNldCAuICRlbWZpbGVzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMCA7IHRoZW4KLSAgREVGQVVMVF9FTVVMQVRJT049YHNldCAuICRlbXVsYXRpb25zIDsgZWNobyAkMmAKLSAgIyBlLW1pcHMqIGhhcyBtb3JlIHRoYW4gb25lIGVtdWxhdGlvbiBwZXIgZmlsZSwgZS1pMzg2KiBoYXMganVzdCBvbmUgYXQgdGhlCi0gICMgbW9tZW50LiAgSWYgb25seSBvbmUgZW11bGF0aW9uIGlzIHNwZWNpZmllZCwgdGhlbiBkb24ndCBkZWZpbmUKLSAgIyBVU0VfRU1VTEFUSU9OUyBvciBpbmNsdWRlIGFueSBvZiB0aGUgZS1maWxlcyBhcyB0aGV5IHdpbGwgb25seSBiZSBibG9hdC4KLSAgY2FzZSAiJHtvYmpfZm9ybWF0fSR7ZW1maWxlc30iIGluCi0gICAgbXVsdGkqIHwgKm1pcHMqKQotICAgICAgdGVfZmlsZT1tdWx0aQotICAgICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgJGVtZmlsZXMiCi0gICAgICBBQ19ERUZJTkUoVVNFX0VNVUxBVElPTlMsIDEsIFtVc2UgZW11bGF0aW9uIHN1cHBvcnQ/XSkgOzsKLSAgZXNhYwotZmkKLUFDX1NVQlNUKGV4dHJhX29iamVjdHMpCi1BQ19ERUZJTkVfVU5RVU9URUQoRU1VTEFUSU9OUywgJEVNVUxBVElPTlMsIFtTdXBwb3J0ZWQgZW11bGF0aW9ucy5dKQotQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfRU1VTEFUSU9OLCAiJERFRkFVTFRfRU1VTEFUSU9OIiwKLQkJICAgW0RlZmF1bHQgZW11bGF0aW9uLl0pCi0KLWNhc2UgJHtwcmltYXJ5X2JmZF9nYXN9LSR7dGFyZ2V0X2NwdV90eXBlfS0ke29ial9mb3JtYXR9IGluCi0gIHllcy0qLWNvZmYpCW5lZWRfYmZkPXllcyA7OwotICBuby0qLWNvZmYpCW5lZWRfYmZkPXllcwotCQlBQ19ERUZJTkUoTUFOWV9TRUdNRU5UUywgMSwgW29sZCBDT0ZGIHN1cHBvcnQ/XSkgOzsKLWVzYWMKLQotcmVqZWN0X2Rldl9jb25maWdzPXllcwotCi1jYXNlICR7cmVqZWN0X2Rldl9jb25maWdzfS0ke2Rldn0gaW4KLSAgeWVzLXllcykgIyBPb3BzLgotICAgIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgJHtnZW5lcmljX3RhcmdldH0gY29uZmlndXJhdGlvbi4pCi0gICAgOzsKLWVzYWMKLQotQUNfU1VCU1QodGFyZ2V0X2NwdV90eXBlKQotQUNfU1VCU1Qob2JqX2Zvcm1hdCkKLUFDX1NVQlNUKHRlX2ZpbGUpCi1BQ19TVUJTVChpbnN0YWxsX3Rvb2xkaXIpCi1BQ19TVUJTVChhdG9mKQotZG5sIEFDX1NVQlNUKGVtdWxhdGlvbikKLQotY2FzZSAiJHtwcmltYXJ5X2JmZF9nYXN9IiBpbgotICB5ZXMpCUFDX0RFRklORShCRkRfQVNTRU1CTEVSLCAxLCBbVXNlIEJGRCBpbnRlcmZhY2U/XSkKLQluZWVkX2JmZD15ZXMgOzsKLWVzYWMKLQotIyBkbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci1jYXNlICIke25lZWRfb3Bjb2Rlc30iIGluCi15ZXMpCi0gIE9QQ09ERVNfTElCPS4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotICA7OwotZXNhYwotCi1jYXNlICIke25lZWRfYmZkfSIgaW4KLXllcykKLSAgQkZETElCPS4uL2JmZC9saWJiZmQubGEKLSAgQUxMX09CSl9ERVBTPSIkQUxMX09CSl9ERVBTIC4uL2JmZC9iZmQuaCIKLSAgOzsKLWVzYWMKLQotQUNfU1VCU1QoQkZETElCKQotQUNfU1VCU1QoT1BDT0RFU19MSUIpCi0KLUFDX1NVQlNUKEFMTF9PQkpfREVQUykKLQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9BTElBUywJIiR7dGFyZ2V0X2FsaWFzfSIsIFtUYXJnZXQgYWxpYXMuXSkKLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfQ0FOT05JQ0FMLAkiJHt0YXJnZXR9IiwgICAgICAgW0Nhbm9uaWNhbCB0YXJnZXQuXSkKLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfQ1BVLAkJIiR7dGFyZ2V0X2NwdX0iLCAgIFtUYXJnZXQgQ1BVLl0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX1ZFTkRPUiwJIiR7dGFyZ2V0X3ZlbmRvcn0iLCBbVGFyZ2V0IHZlbmRvci5dKQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9PUywJCSIke3RhcmdldF9vc30iLCAgICBbVGFyZ2V0IE9TLl0pCi0KLUFDX1BST0dfQ0MKLQotQUNfUFJPR19ZQUNDCi1BTV9QUk9HX0xFWAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RkbGliLmggbWVtb3J5Lmggc3RyaW5ncy5oIHVuaXN0ZC5oIHN0ZGFyZy5oIHZhcmFyZ3MuaCBlcnJuby5oIHN5cy90eXBlcy5oKQotCi0jIFB1dCB0aGlzIGhlcmUgc28gdGhhdCBhdXRvY29uZidzICJjcm9zcy1jb21waWxpbmciIG1lc3NhZ2UgZG9lc24ndCBjb25mdXNlCi0jIHBlb3BsZSB3aG8gYXJlIG5vdCBjcm9zcy1jb21waWxpbmcgYnV0IGFyZSBjb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVycy4KLUFDX01TR19DSEVDS0lORyh3aGV0aGVyIGNvbXBpbGluZyBhIGNyb3NzLWFzc2VtYmxlcikKLWlmIHRlc3QgIiR7aG9zdH0iID0gIiR7dGFyZ2V0fSI7IHRoZW4KLSAgY3Jvc3NfZ2FzPW5vCi1lbHNlCi0gIGNyb3NzX2dhcz15ZXMKLSAgQUNfREVGSU5FKENST1NTX0NPTVBJTEUsIDEsIFtDb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVyP10pCi1maQotQUNfTVNHX1JFU1VMVCgkY3Jvc3NfZ2FzKQotCi1kbmwgYW5zaWRlY2wuaCB3aWxsIGRlYWwgd2l0aCBjb25zdAotZG5sIEFDX0NPTlNUCi1BQ19GVU5DX0FMTE9DQQotQUNfQ19JTkxJTkUKLQotIyBWTVMgZG9lc24ndCBoYXZlIHVubGluay4KLUFDX0NIRUNLX0ZVTkNTKHVubGluayByZW1vdmUsIGJyZWFrKQotCi0jIFNvbWUgc3lzdGVtcyBkb24ndCBoYXZlIHNicmsoKS4KLUFDX0NIRUNLX0ZVTkNTKHNicmspCi0KLSMgU29tZSBub24tQU5TSSBwcmVwcm9jZXNzb3JzIGJvdGNoIHJlcXVvdGluZyBpbnNpZGUgc3RyaW5ncy4gIFRoYXQncyBiYWQKLSMgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLSMgd29ya2luZyBwcm9wZXJseSEKLUdBU19XT1JLSU5HX0FTU0VSVAotCi0jIE9uIHNvbWUgc3lzdGVtcywgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgbWF5IG5vdCBkZWNsYXJlIG1hbGxvYywgcmVhbGxvYywKLSMgYW5kIGZyZWUuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIGdhcyBuZWVkcyB0aGVzZSBmdW5jdGlvbnMgdG8gaGF2ZSBiZWVuCi0jIGRlY2xhcmVkIC0tIHN1Y2ggYXMgd2hlbiB0YWtpbmcgdGhlaXIgYWRkcmVzc2VzLgotZ2FzX3Rlc3RfaGVhZGVycz0iCi0jaWZkZWYgSEFWRV9NRU1PUllfSAotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0iCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoc3Ryc3RyLCBmLCBjaGFyICooKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKG1hbGxvYywgZiwgY2hhciAqKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKLUdBU19DSEVDS19ERUNMX05FRURFRChmcmVlLCBmLCB2b2lkICgqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoc2JyaywgZiwgY2hhciAqKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKLUdBU19DSEVDS19ERUNMX05FRURFRChlbnZpcm9uLCBmLCBjaGFyICoqZiwgJGdhc190ZXN0X2hlYWRlcnMpCi0KLSMgRG9lcyBlcnJuby5oIGRlY2xhcmUgZXJybm8sIG9yIGRvIHdlIGhhdmUgdG8gYWRkIGEgc2VwYXJhdGUgZGVjbGFyYXRpb24KLSMgZm9yIGl0PwotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKGVycm5vLCBmLCBpbnQgZiwgWwotI2lmZGVmIEhBVkVfRVJSTk9fSAotI2luY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKLV0pCi0KLWRubCBUaGlzIG11c3QgY29tZSBsYXN0LgotCi1kbmwgV2UgdXNlZCB0byBtYWtlIHN5bWxpbmtzIHRvIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBidXQgbm93Ci1kbmwgd2UganVzdCB1c2UgdGhlIHJpZ2h0IG5hbWUgZm9yIC5jIGZpbGVzLCBhbmQgY3JlYXRlIC5oIGZpbGVzIGluCi1kbmwgdGhlIGJ1aWxkIGRpcmVjdG9yeSB3aGljaCBpbmNsdWRlIHRoZSByaWdodCAuaCBmaWxlLiAgTWFrZSBzdXJlCi1kbmwgdGhlIG9sZCBzeW1saW5rcyBkb24ndCBleGlzdCwgc28gdGhhdCBhIHJlY29uZmlndXJlIGluIGFuIGV4aXN0aW5nCi1kbmwgZGlyZWN0b3J5IGJlaGF2ZXMgcmVhc29uYWJseS4KLQotQUNfT1VUUFVUKE1ha2VmaWxlIGRvYy9NYWtlZmlsZSAke0dEQklOSVR9OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtybSAtZiB0YXJnLWNwdS5jIHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIG9iai1mb3JtYXQuYyB0YXJnLWVudi5oIGF0b2YtdGFyZy5jIGl0YmwtY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAidGMtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiB0YXJnLWNwdS5oCi0gZWNobyAnI2luY2x1ZGUgIm9iai0nIiR7b2JqX2Zvcm1hdH0iJy5oIicgPiBvYmotZm9ybWF0LmgKLSBlY2hvICcjaW5jbHVkZSAidGUtJyIke3RlX2ZpbGV9IicuaCInID4gdGFyZy1lbnYuaAotIGVjaG8gJyNpbmNsdWRlICJpdGJsLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gaXRibC1jcHUuaAotIGlmIHRlc3QgIngkY2dlbl9jcHVfcHJlZml4IiAhPSB4IDsgdGhlbgotICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIke2NnZW5fY3B1X3ByZWZpeH0iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oCi0gZmkKLQotIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0sCi1bdGFyZ2V0X2NwdV90eXBlPSR7dGFyZ2V0X2NwdV90eXBlfQotIGNnZW5fY3B1X3ByZWZpeD0ke2NnZW5fY3B1X3ByZWZpeH0KLSBvYmpfZm9ybWF0PSR7b2JqX2Zvcm1hdH0KLSB0ZV9maWxlPSR7dGVfZmlsZX1dKQpkaWZmIC0tZ2l0IGEvZ2FzL2RlYnVnLmMgYi9nYXMvZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5ZjIzZi4uMDAwMDAwMAotLS0gYS9nYXMvZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgZGVidWcuYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFJvdXRpbmVzIGZvciBkZWJ1ZyB1c2Ugb25seS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotZG1wX2ZyYWdzICgpCi17Ci0gIGZyY2hhaW5TICpjaHA7Ci0gIGNoYXIgKnA7Ci0KLSAgZm9yIChjaHAgPSBmcmNoYWluX3Jvb3Q7IGNocDsgY2hwID0gY2hwLT5mcmNoX25leHQpCi0gICAgewotICAgICAgc3dpdGNoIChjaHAtPmZyY2hfc2VnKQotCXsKLQljYXNlIFNFR19EQVRBOgotCSAgcCA9ICJEYXRhIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VHX1RFWFQ6Ci0JICBwID0gIlRleHQiOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHAgPSAiPz8/IjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIlxuU0VHTUVOVCAlcyAlZFxuIiwgcCwgY2hwLT5mcmNoX3N1YnNlZyk7Ci0gICAgICBkbXBfZnJhZyAoY2hwLT5mcmNoX3Jvb3QsICJcdCIpOwotICAgIH0KLX0KLQotZG1wX2ZyYWcgKGZwLCBpbmRlbnQpCi0gICAgIHN0cnVjdCBmcmFnICpmcDsKLSAgICAgY2hhciAqaW5kZW50OwotewotICBmb3IgKDsgZnA7IGZwID0gZnAtPmZyX25leHQpCi0gICAgewotICAgICAgcHJpbnRmICgiJXNGUkFHTUVOVCBAIDB4JXhcbiIsIGluZGVudCwgZnApOwotICAgICAgc3dpdGNoIChmcC0+ZnJfdHlwZSkKLQl7Ci0JY2FzZSByc19hbGlnbjoKLQkgIHByaW50ZiAoIiVzcnNfYWxpZ24oJWQpXG4iLCBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19maWxsOgotCSAgcHJpbnRmICgiJXNyc19maWxsKCVkKVxuIiwgaW5kZW50LCBmcC0+ZnJfb2Zmc2V0KTsKLQkgIHByaW50ZiAoIiVzIiwgaW5kZW50KTsKLQkgIHZhcl9jaGFycyAoZnAsIGZwLT5mcl92YXIgKyBmcC0+ZnJfZml4KTsKLQkgIHByaW50ZiAoIiVzXHQgcmVwZWF0ZWQgJWQgdGltZXMsIiwKLQkJICBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotCSAgcHJpbnRmICgiIGZpeGVkIGxlbmd0aCBpZiAjIGNoYXJzID09IDApXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfb3JnOgotCSAgcHJpbnRmICgiJXNyc19vcmcoJWQrc3ltIEAweCV4KVxuIiwgaW5kZW50LAotCQkgIGZwLT5mcl9vZmZzZXQsIGZwLT5mcl9zeW1ib2wpOwotCSAgcHJpbnRmICgiJXNmaWxsIHdpdGggIiwgaW5kZW50KTsKLQkgIHZhcl9jaGFycyAoZnAsIDEpOwotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBwcmludGYgKCIlc21hY2hpbmVfZGVwXG4iLCBpbmRlbnQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIiVzdW5rbm93biB0eXBlXG4iLCBpbmRlbnQpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJpbnRmICgiJXNhZGRyPSVkKDB4JXgpXG4iLCBpbmRlbnQsIGZwLT5mcl9hZGRyZXNzLCBmcC0+ZnJfYWRkcmVzcyk7Ci0gICAgICBwcmludGYgKCIlc2ZyX2ZpeD0lZFxuIiwgaW5kZW50LCBmcC0+ZnJfZml4KTsKLSAgICAgIHByaW50ZiAoIiVzZnJfdmFyPSVkXG4iLCBpbmRlbnQsIGZwLT5mcl92YXIpOwotICAgICAgcHJpbnRmICgiJXNmcl9vZmZzZXQ9JWRcbiIsIGluZGVudCwgZnAtPmZyX29mZnNldCk7Ci0gICAgICBwcmludGYgKCIlc2NoYXJzIEAgMHgleFxuIiwgaW5kZW50LCBmcC0+ZnJfbGl0ZXJhbCk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotdmFyX2NoYXJzIChmcCwgbikKLSAgICAgc3RydWN0IGZyYWcgKmZwOwotICAgICBpbnQgbjsKLXsKLSAgdW5zaWduZWQgY2hhciAqcDsKLQotICBmb3IgKHAgPSAodW5zaWduZWQgY2hhciAqKSBmcC0+ZnJfbGl0ZXJhbDsgbjsgbi0tLCBwKyspCi0gICAgewotICAgICAgcHJpbnRmICgiJTAyeCAiLCAqcCk7Ci0gICAgfQotfQotCi0vKiBlbmQgb2YgZGVidWcuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2RlcC1pbi5zZWQgYi9nYXMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3MWYwZi4uMDAwMDAwMAotLS0gYS9nYXMvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTpsb29wCi0vXFwkL04KLS9cXCQvYiBsb29wCi0KLXMhIC4uL2NvbmZpZy5oISFnCi1zISAuLi8uLi9iZmQvYmZkLmghIWcKLXMhIC4uL2l0YmwtcGFyc2UuaCEhZwotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC9jb25maWchJChzcmNkaXIpL2NvbmZpZyFnCi1zIUBTUkNESVJALy4uL29wY29kZXMhJChzcmNkaXIpLy4uL29wY29kZXMhZwotcyFAU1JDRElSQC8hIWcKLXMhIGNvbmZpZy5oISFnCi1zISBhcy5oISFnCi1zISBhc2ludGwuaCEhZwotcyEgdGFyZy1lbnYuaCEhZwotcyEgb2JqLWZvcm1hdC5oISFnCi1zISB0YXJnLWNwdS5oISFnCi1zISBmbG9udW0uaCEhZwotcyEgZXhwci5oISFnCi1zISB3cml0ZS5oISFnCi1zISBmcmFncy5oISFnCi1zISBoYXNoLmghIWcKLXMhIHJlYWQuaCEhZwotcyEgc3ltYm9scy5oISFnCi1zISB0Yy5oISFnCi1zISBvYmouaCEhZwotcyEgbGlzdGluZy5oISFnCi1zISBiaWdudW0uaCEhZwotcyEgYml0X2ZpeC5oISFnCi1zISBpdGJsLWNwdS5oISFnCi1zISBcJChzcmNkaXIpL2NvbmZpZy90ZS1nZW5lcmljLmghIWcKLXMhIFwkKElOQ0RJUikvbGliaWJlcnR5LmghIWcKLXMhIFwkKElOQ0RJUikvYW5zaWRlY2wuaCEhZwotcyEgXCQoSU5DRElSKS9mb3Blbi1zYW1lLmghIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2dhcy9kZXBlbmQuYyBiL2dhcy9kZXBlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YzdjOC4uMDAwMDAwMAotLS0gYS9nYXMvZGVwZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogZGVwZW5kLmMgLSBIYW5kbGUgZGVwZW5kZW5jeSB0cmFja2luZy4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qIFRoZSBmaWxlIHRvIHdyaXRlIHRvLCBvciBOVUxMIGlmIG5vIGRlcGVuZGVuY2llcyBiZWluZyBrZXB0LiAgKi8KLXN0YXRpYyBjaGFyICpkZXBfZmlsZSA9IE5VTEw7Ci0KLXN0cnVjdCBkZXBlbmRlbmN5Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHN0cnVjdCBkZXBlbmRlbmN5ICpuZXh0OwotfTsKLQotLyogQWxsIHRoZSBmaWxlcyB3ZSBkZXBlbmQgb24uICAqLwotc3RhdGljIHN0cnVjdCBkZXBlbmRlbmN5ICpkZXBfY2hhaW4gPSBOVUxMOwotCi0vKiBDdXJyZW50IGNvbHVtbiBpbiBvdXRwdXQgZmlsZS4gICovCi1zdGF0aWMgaW50IGNvbHVtbiA9IDA7Ci0KLXN0YXRpYyBpbnQgcXVvdGVfc3RyaW5nX2Zvcl9tYWtlIFBBUkFNUyAoKEZJTEUgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cmFwX291dHB1dCBQQVJBTVMgKChGSUxFICosIGNoYXIgKiwgaW50KSk7Ci0KLS8qIE51bWJlciBvZiBjb2x1bW5zIGFsbG93YWJsZS4gICovCi0jZGVmaW5lIE1BWF9DT0xVTU5TIDcyCi0KLQwKLQotLyogU3RhcnQgc2F2aW5nIGRlcGVuZGVuY2llcywgdG8gYmUgd3JpdHRlbiB0byBGSUxFTkFNRS4gIElmIHRoaXMgaXMKLSAgIG5ldmVyIGNhbGxlZCwgdGhlbiBkZXBlbmRlbmN5IHRyYWNraW5nIGlzIHNpbXBseSBza2lwcGVkLiAgKi8KLQotdm9pZAotc3RhcnRfZGVwZW5kZW5jaWVzIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGRlcF9maWxlID0gZmlsZW5hbWU7Ci19Ci0KLS8qIE5vdGljZWQgYSBuZXcgZmlsZW5hbWUsIHNvIHRyeSB0byByZWdpc3RlciBpdC4gICovCi0KLXZvaWQKLXJlZ2lzdGVyX2RlcGVuZGVuY3kgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKmRlcDsKLQotICBpZiAoZGVwX2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChkZXAgPSBkZXBfY2hhaW47IGRlcCAhPSBOVUxMOyBkZXAgPSBkZXAtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgc3RyY21wIChmaWxlbmFtZSwgZGVwLT5maWxlKSkKLQlyZXR1cm47Ci0gICAgfQotCi0gIGRlcCA9IChzdHJ1Y3QgZGVwZW5kZW5jeSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBkZXBlbmRlbmN5KSk7Ci0gIGRlcC0+ZmlsZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgZGVwLT5uZXh0ID0gZGVwX2NoYWluOwotICBkZXBfY2hhaW4gPSBkZXA7Ci19Ci0KLS8qIFF1b3RlIGEgZmlsZSBuYW1lIHRoZSB3YXkgYG1ha2UnIHdhbnRzIGl0LCBhbmQgcHJpbnQgaXQgdG8gRklMRS4KLSAgIElmIEZJTEUgaXMgTlVMTCwgZG8gbm8gcHJpbnRpbmcsIGJ1dCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUKLSAgIHF1b3RlZCBzdHJpbmcuCi0KLSAgIFRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIGdjYyB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBpbnQKLXF1b3RlX3N0cmluZ19mb3JfbWFrZSAoZmlsZSwgc3JjKQotICAgICBGSUxFICpmaWxlOwotICAgICBjaGFyICpzcmM7Ci17Ci0gIGNoYXIgKnAgPSBzcmM7Ci0gIGludCBpID0gMDsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSAqcCsrOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdcMCc6Ci0JY2FzZSAnICc6Ci0JY2FzZSAnXHQnOgotCSAgewotCSAgICAvKiBHTlUgbWFrZSB1c2VzIGEgd2VpcmQgcXVvdGluZyBzY2hlbWUgZm9yIHdoaXRlIHNwYWNlLgotCSAgICAgICBBIHNwYWNlIG9yIHRhYiBwcmVjZWRlZCBieSAyTisxIGJhY2tzbGFzaGVzIHJlcHJlc2VudHMKLQkgICAgICAgTiBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieSBzcGFjZTsgYSBzcGFjZSBvciB0YWIKLQkgICAgICAgcHJlY2VkZWQgYnkgMk4gYmFja3NsYXNoZXMgcmVwcmVzZW50cyBOIGJhY2tzbGFzaGVzIGF0Ci0JICAgICAgIHRoZSBlbmQgb2YgYSBmaWxlIG5hbWU7IGFuZCBiYWNrc2xhc2hlcyBpbiBvdGhlcgotCSAgICAgICBjb250ZXh0cyBzaG91bGQgbm90IGJlIGRvdWJsZWQuICAqLwotCSAgICBjaGFyICpxOwotCSAgICBmb3IgKHEgPSBwIC0gMTsgc3JjIDwgcSAmJiBxWy0xXSA9PSAnXFwnOyAgcS0tKQotCSAgICAgIHsKLQkJaWYgKGZpbGUpCi0JCSAgcHV0YyAoJ1xcJywgZmlsZSk7Ci0JCWkrKzsKLQkgICAgICB9Ci0JICB9Ci0JICBpZiAoIWMpCi0JICAgIHJldHVybiBpOwotCSAgaWYgKGZpbGUpCi0JICAgIHB1dGMgKCdcXCcsIGZpbGUpOwotCSAgaSsrOwotCSAgZ290byBvcmRpbmFyeV9jaGFyOwotCSAgCi0JY2FzZSAnJCc6Ci0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoYywgZmlsZSk7Ci0JICBpKys7Ci0JICAvKiBGYWxsIHRocm91Z2guICBUaGlzIGNhbiBtaXNoYW5kbGUgdGhpbmdzIGxpa2UgIiQoIiBidXQKLQkgICAgIHRoZXJlJ3Mgbm8gZWFzeSBmaXguICAqLwotCWRlZmF1bHQ6Ci0Jb3JkaW5hcnlfY2hhcjoKLQkgIC8qIFRoaXMgY2FuIG1pc2hhbmRsZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgIlwwXG4lKj9bXFx+IjsKLQkgICAgIGV4YWN0bHkgd2hpY2ggY2hhcnMgYXJlIG1pc2hhbmRsZWQgZGVwZW5kcyBvbiB0aGUgYG1ha2UnIHZlcnNpb24uCi0JICAgICBXZSBrbm93IG9mIG5vIHBvcnRhYmxlIHNvbHV0aW9uIGZvciB0aGlzOwotCSAgICAgZXZlbiBHTlUgbWFrZSAzLjc2LjEgZG9lc24ndCBzb2x2ZSB0aGUgcHJvYmxlbSBlbnRpcmVseS4KLQkgICAgIChBbHNvLCAnXDAnIGlzIG1pc2hhbmRsZWQgZHVlIHRvIG91ciBjYWxsaW5nIGNvbnZlbnRpb25zLikgICovCi0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoYywgZmlsZSk7Ci0JICBpKys7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBBcHBlbmQgc29tZSBvdXRwdXQgdG8gdGhlIGZpbGUsIGtlZXBpbmcgdHJhY2sgb2YgY29sdW1ucyBhbmQgZG9pbmcKLSAgIHdyYXBwaW5nIGFzIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyB2b2lkCi13cmFwX291dHB1dCAoZiwgc3RyaW5nLCBzcGFjZXIpCi0gICAgIEZJTEUgKmY7Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHNwYWNlcjsKLXsKLSAgaW50IGxlbiA9IHF1b3RlX3N0cmluZ19mb3JfbWFrZSAoTlVMTCwgc3RyaW5nKTsKLQotICBpZiAobGVuID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChjb2x1bW4gJiYgTUFYX0NPTFVNTlMgLSAxIC8qc3BhY2VyKi8gLSAyIC8qYCBcJyovIDwgY29sdW1uICsgbGVuKQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICIgXFxcbiAiKTsKLSAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICBpZiAoc3BhY2VyID09ICcgJykKLQlzcGFjZXIgPSAnXDAnOwotICAgIH0KLQotICBpZiAoc3BhY2VyID09ICcgJykKLSAgICB7Ci0gICAgICBwdXRjIChzcGFjZXIsIGYpOwotICAgICAgKytjb2x1bW47Ci0gICAgfQotCi0gIHF1b3RlX3N0cmluZ19mb3JfbWFrZSAoZiwgc3RyaW5nKTsKLSAgY29sdW1uICs9IGxlbjsKLQotICBpZiAoc3BhY2VyID09ICc6JykKLSAgICB7Ci0gICAgICBwdXRjIChzcGFjZXIsIGYpOwotICAgICAgKytjb2x1bW47Ci0gICAgfQotfQotCi0vKiBQcmludCBkZXBlbmRlbmN5IGZpbGUuICAqLwotCi12b2lkCi1wcmludF9kZXBlbmRlbmNpZXMgKCkKLXsKLSAgRklMRSAqZjsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKmRlcDsKLQotICBpZiAoZGVwX2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZiA9IGZvcGVuIChkZXBfZmlsZSwgInciKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJDYW4ndCBvcGVuIGAlcycgZm9yIHdyaXRpbmciKSwgZGVwX2ZpbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2x1bW4gPSAwOwotICB3cmFwX291dHB1dCAoZiwgb3V0X2ZpbGVfbmFtZSwgJzonKTsKLSAgZm9yIChkZXAgPSBkZXBfY2hhaW47IGRlcCAhPSBOVUxMOyBkZXAgPSBkZXAtPm5leHQpCi0gICAgd3JhcF9vdXRwdXQgKGYsIGRlcC0+ZmlsZSwgJyAnKTsKLQotICBwdXRjICgnXG4nLCBmKTsKLQotICBpZiAoZmNsb3NlIChmKSkKLSAgICBhc193YXJuIChfKCJDYW4ndCBjbG9zZSBgJXMnIiksIGRlcF9maWxlKTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvTWFrZWZpbGUuYW0gYi9nYXMvZG9jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNThlYzEzLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZwotQ09ORklHPWFsbAotCi1tYW5fTUFOUyA9IGFzLjEKLQotaW5mb19URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCi0KLWFzY29uZmlnLnRleGk6ICQoQ09ORklHKS50ZXhpCi0Jcm0gLWYgYXNjb25maWcudGV4aQotCWxuIC1zICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkKLQotQ1BVX0RPQ1MgPSBcCi0JYy1hMjlrLnRleGkgXAotCWMtYXJtLnRleGkgXAotCWMtZDEwdi50ZXhpIFwKLQljLWg4MzAwLnRleGkgXAotCWMtaDg1MDAudGV4aSBcCi0JYy1ocHBhLnRleGkgXAotCWMtaTM4Ni50ZXhpIFwKLQljLWk5NjAudGV4aSBcCi0JYy1tNjhrLnRleGkgXAotCWMtbWlwcy50ZXhpIFwKLQljLW5zMzJrLnRleGkgXAotCWMtcGoudGV4aSBcCi0JYy1zaC50ZXhpIFwKLQljLXNwYXJjLnRleGkgXAotCWMtdmF4LnRleGkgXAotCWMtdjg1MC50ZXhpIFwKLQljLXo4ay50ZXhpCi0KLWdhc3Zlci50ZXhpOiBNYWtlZmlsZQotCXJtIC1mICRACi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gJEAKLQotYXMuaW5mbzogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotYXMuZHZpOiAkKHNyY2RpcikvYXMudGV4aW5mbyBhc2NvbmZpZy50ZXhpIGdhc3Zlci50ZXhpICQoQ1BVX0RPQ1MpCi0KLSMgVGhpcyBvbmUgaXNuJ3QgcmVhZHkgZm9yIHByaW1lIHRpbWUgeWV0LiAgTm90IGV2ZW4gYSBsaXR0bGUgYml0LgotCi1ub2luc3RfVEVYSU5GT1MgPSBpbnRlcm5hbHMudGV4aQotCi1ESVNUQ0xFQU5GSUxFUyA9IGFzY29uZmlnLnRleGkKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBnYXN2ZXIudGV4aQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9NYWtlZmlsZS5pbiBiL2dhcy9kb2MvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwM2M4MjAuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4uCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQUxMX09CSl9ERVBTID0gQEFMTF9PQkpfREVQU0AKLUFTID0gQEFTQAotQkZETElCID0gQEJGRExJQkAKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotR0RCSU5JVCA9IEBHREJJTklUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxFWCA9IEBMRVhACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotT1BDT0RFU19MSUIgPSBAT1BDT0RFU19MSUJACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRSA9IEBVU0VfU1lNQk9MX1VOREVSU0NPUkVACi1WRVJTSU9OID0gQFZFUlNJT05ACi1ZQUNDID0gQFlBQ0NACi1hdG9mID0gQGF0b2ZACi1jZ2VuX2NwdV9wcmVmaXggPSBAY2dlbl9jcHVfcHJlZml4QAotZXh0cmFfb2JqZWN0cyA9IEBleHRyYV9vYmplY3RzQAotaW5zdGFsbF90b29sZGlyID0gQGluc3RhbGxfdG9vbGRpckAKLWwgPSBAbEAKLW9ial9mb3JtYXQgPSBAb2JqX2Zvcm1hdEAKLXRhcmdldF9jcHVfdHlwZSA9IEB0YXJnZXRfY3B1X3R5cGVACi10ZV9maWxlID0gQHRlX2ZpbGVACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZwotQ09ORklHID0gYWxsCi0KLW1hbl9NQU5TID0gYXMuMQotCi1pbmZvX1RFWElORk9TID0gYXMudGV4aW5mbyBnYXNwLnRleGkKLQotQ1BVX0RPQ1MgPSBcCi0JYy1hMjlrLnRleGkgXAotCWMtYXJtLnRleGkgXAotCWMtZDEwdi50ZXhpIFwKLQljLWg4MzAwLnRleGkgXAotCWMtaDg1MDAudGV4aSBcCi0JYy1ocHBhLnRleGkgXAotCWMtaTM4Ni50ZXhpIFwKLQljLWk5NjAudGV4aSBcCi0JYy1tNjhrLnRleGkgXAotCWMtbWlwcy50ZXhpIFwKLQljLW5zMzJrLnRleGkgXAotCWMtcGoudGV4aSBcCi0JYy1zaC50ZXhpIFwKLQljLXNwYXJjLnRleGkgXAotCWMtdmF4LnRleGkgXAotCWMtdjg1MC50ZXhpIFwKLQljLXo4ay50ZXhpCi0KLQotIyBUaGlzIG9uZSBpc24ndCByZWFkeSBmb3IgcHJpbWUgdGltZSB5ZXQuICBOb3QgZXZlbiBhIGxpdHRsZSBiaXQuCi0KLW5vaW5zdF9URVhJTkZPUyA9IGludGVybmFscy50ZXhpCi0KLURJU1RDTEVBTkZJTEVTID0gYXNjb25maWcudGV4aQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGdhc3Zlci50ZXhpCi1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gLi4vY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGFzLmluZm8gZ2FzcC5pbmZvCi1EVklTID0gYXMuZHZpIGdhc3AuZHZpCi1URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLU1BTlMgPSAkKG1hbl9NQU5TKQotCi1OUk9GRiA9IG5yb2ZmCi1ESVNUX0NPTU1PTiA9ICBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuZHZpIC5pbmZvIC5wcyAudGV4aSAudGV4aW5mbyAudHhpCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIGRvYy9NYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotCi1hcy5pbmZvOiBhcy50ZXhpbmZvCi1hcy5kdmk6IGFzLnRleGluZm8KLQotCi1nYXNwLmluZm86IGdhc3AudGV4aQotZ2FzcC5kdmk6IGdhc3AudGV4aQotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBhcy5hdXggYXMuY3AgYXMuY3BzIGFzLmR2aSBhcy5mbiBhcy5mbnMgYXMua3kgYXMua3lzIGFzLnBzIFwKLQkgIGFzLmxvZyBhcy5wZyBhcy50b2MgYXMudHAgYXMudHBzIGFzLnZyIGFzLnZycyBhcy5vcCBhcy50ciBcCi0JICBhcy5jdiBhcy5jbiBnYXNwLmF1eCBnYXNwLmNwIGdhc3AuY3BzIGdhc3AuZHZpIGdhc3AuZm4gXAotCSAgZ2FzcC5mbnMgZ2FzcC5reSBnYXNwLmt5cyBnYXNwLnBzIGdhc3AubG9nIGdhc3AucGcgZ2FzcC50b2MgXAotCSAgZ2FzcC50cCBnYXNwLnRwcyBnYXNwLnZyIGdhc3AudnJzIGdhc3Aub3AgZ2FzcC50ciBnYXNwLmN2IFwKLQkgIGdhc3AuY24KLQotY2xlYW4tYW1pbmZvOgotCi1kaXN0Y2xlYW4tYW1pbmZvOgotCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKLQlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKLQkgIHJtIC1mICQkaTsgXAotCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCi0JICAgIHJtIC1mICQkaS1bMC05XSo7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCi0KLWluc3RhbGwtbWFuMToKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbjFkaXIpCi0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKLQkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLQotdW5pbnN0YWxsLW1hbjE6Ci0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi1pbnN0YWxsLW1hbjogJChNQU5TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtbWFuMQotdW5pbnN0YWxsLW1hbjoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1tYW4xCi10YWdzOiBUQUdTCi1UQUdTOgotCi0KLWRpc3RkaXIgPSAkKHRvcF9idWlsZGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotCi1zdWJkaXIgPSBkb2MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tYW0KLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktYW0KLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLWFtCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi1pbnN0YWxsLWV4ZWMtYW06Ci1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1hbQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotYWxsLWFtOiBNYWtlZmlsZSAkKE1BTlMpCi1hbGwtcmVkaXJlY3Q6IGFsbC1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1jbGVhbi1hbTogIGNsZWFuLWFtaW5mbyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1hbQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0KLS5QSE9OWTogaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIG1vc3RseWNsZWFuLWFtaW5mbyBcCi1kaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgXAotdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gdW5pbnN0YWxsLW1hbiB0YWdzIGRpc3RkaXIgaW5mby1hbSBpbmZvIFwKLWR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBpbnN0YWxsLWluZm8tYW0gXAotaW5zdGFsbC1pbmZvIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBcCi1pbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBhbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBcCi1pbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgXAotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIG1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotYXNjb25maWcudGV4aTogJChDT05GSUcpLnRleGkKLQlybSAtZiBhc2NvbmZpZy50ZXhpCi0JbG4gLXMgJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgbG4gJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aQotCi1nYXN2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWFzLmluZm86ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLWFzLmR2aTogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9nYXMvZG9jL2FsbC50ZXhpIGIvZ2FzL2RvYy9hbGwudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2YjJkYy4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FsbC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotQGMgQ29weXJpZ2h0IDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEdBUyBtYW51YWwKLQotQGMgQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYWxsLWluY2x1c2l2ZSB2ZXJzaW9uIG9mIG1hbnVhbAotCi1AYyBzd2l0Y2hlczotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBjIFByb3BlcnRpZXMgb2YgdGhlIG1hbnVhbAotQGMgPT09PT09PT09PT09PT09PT09PT09PT09Ci1AYyBEaXNjdXNzIGFsbCBhcmNoaXRlY3R1cmVzPwotQHNldCBBTEwtQVJDSAotQGMgQSBnZW5lcmljIGZvcm0gb2YgbWFudWFsIChub3QgdGFpbG9yZWQgdG8gc3BlY2lmaWMgdGFyZ2V0KT8KLUBzZXQgR0VORVJJQwotQGMgSW5jbHVkZSB0ZXh0IG9uIGFzc2VtYmxlciBpbnRlcm5hbHM/Ci1AY2xlYXIgSU5URVJOQUxTCi1AYyBNYW55IG9iamVjdCBmb3JtYXRzIHN1cHBvcnRlZCBpbiB0aGlzIGNvbmZpZz8KLUBzZXQgTVVMVEktT0JKCi0KLUBjIE9iamVjdCBmb3JtYXRzIG9mIGludGVyZXN0Ci1AYyA9PT09PT09PT09PT09PT09PT09PT09PT09PQotQHNldCBBT1VUCi1Ac2V0IEJPVVQKLUBzZXQgQ09GRgotQHNldCBFTEYKLUBzZXQgU09NCi0KLUBjIENQVXMgb2YgaW50ZXJlc3QKLUBjID09PT09PT09PT09PT09PT0KLUBzZXQgQTI5SwotQHNldCBBUkMKLUBzZXQgQVJNCi1Ac2V0IEQxMFYKLUBzZXQgRDMwVgotQHNldCBIOC8zMDAKLUBzZXQgSDgvNTAwCi1Ac2V0IEhQUEEKLUBzZXQgSTgwMzg2Ci1Ac2V0IEk5NjAKLUBzZXQgTTMyUgotQHNldCBNNjgwWDAKLUBzZXQgTUNPUkUKLUBzZXQgTUlQUwotQHNldCBQSgotQHNldCBTSAotQHNldCBTUEFSQwotQHNldCBWODUwCi1Ac2V0IFZBWAotQHNldCBWWFdPUktTCi1Ac2V0IFo4MDAwCi0KLUBjIERvZXMgdGhpcyB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgdXNlIHRoZSBkaWZmZXJlbmNlLXRhYmxlIGtsdWdlPwotQHNldCBESUZGLVRCTC1LTFVHRQotCi1AYyBEbyBhbGwgbWFjaGluZXMgZGVzY3JpYmVkIHVzZSBJRUVFIGZsb2F0aW5nIHBvaW50PwotQGNsZWFyIElFRUVGTE9BVAotCi1AYyBJcyBhIHdvcmQgMzIgYml0cywgb3IgMTY/Ci1AY2xlYXIgVzMyCi1Ac2V0IFcxNgotCi1AYyBEbyBzeW1ib2xzIGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcnMgdGhhbiB1c3VhbD8KLUBjbGVhciBTUEVDSUFMLVNZTVMKLQotQGMgc3RyaW5nczotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBjIE5hbWUgb2YgdGhlIGFzc2VtYmxlcjoKLUBzZXQgQVMgYXMKLUBjIE5hbWUgb2YgQyBjb21waWxlcjoKLUBzZXQgR0NDIGdjYwotQGMgTmFtZSBvZiBsaW5rZXI6Ci1Ac2V0IExEIGxkCi1AYyBUZXh0IGZvciB0YXJnZXQgbWFjaGluZSAoYmVzdCBub3QgdXNlZCBpbiBnZW5lcmljIGNhc2U7IGJ1dCBqdXN0IGluIGNhc2UuLi4pCi1Ac2V0IFRBUkdFVCBtYWNoaW5lIHNwZWNpZmljCi1AYyBOYW1lIG9mIG9iamVjdCBmb3JtYXQgTk9UIFNFVCBpbiBnZW5lcmljIHZlcnNpb24KLUBjbGVhciBPQkotTkFNRQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9hcy4xIGIvZ2FzL2RvYy9hcy4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ1ODA1Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYXMuMQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggYXMgMSAiMjkgTWFyY2ggMTk5NiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotCi0uU0ggTkFNRQotR05VIGFzIFwtIHRoZSBwb3J0YWJsZSBHTlUgYXNzZW1ibGVyLgotCi0uU0ggU1lOT1BTSVMKLS5uYQotLkIgYXMKLS5SQiAiW1x8IiBcLWEgIltcfCIgZGhsbnMgIlx8XSIgXGMKLVwmXFtcfFw9XGMKLS5JIGZpbGVcYwotXCZcfF1cfF0KLS5SQiAiW1x8IiBcLUQgIlx8XSIKLS5SQiAiW1x8IiBcLVwtZGVmc3ltXCBTWU09VkFMICJcfF0iCi0uUkIgIltcfCIgXC1mICJcfF0iCi0uUkIgIltcfCIgXC1cLWdzdGFicyAiXHxdIgotLlJCICJbXHwiIFwtSQotLkkgcGF0aFxjCi1cJlx8XQotLlJCICJbXHwiIFwtSyAiXHxdIgotLlJCICJbXHwiIFwtTCAiXHxdIgotLlJCICJbXHwiIFwtTVwgfFwgXC1cLW1yaSAiXHxdIgotLlJCICJbXHwiIFwtbyAKLS5JIG9iamZpbGVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtdHJhZGl0aW9uYWxcLWZvcm1hdCAiXHxdIgotLlJCICJbXHwiIFwtdiAiXHxdIgotLlJCICJbXHwiIFwtdyAiXHxdIgotLlJCICJbXHwiIFwtXF5cLSAiXCB8XCAiIFxjCi0uSSBmaWxlc1xjCi1cJlx8Llx8Llx8Llx8XQotCi0uSSBpOTYwLW9ubHkgb3B0aW9uczoKLS5icgotLlJCICJbXHwiIFwtQUNBICJcfHxcfCIgXC1BQ0FfQSAiXHx8XHwiIFwtQUNCXGMKLS5SQiAiXHx8XHwiIFwtQUNDICJcfHxcfCIgXC1BS0EgIlx8fFx8IiBcLUFLQlxjCi0uUkIgIlx8fFx8IiBcLUFLQyAiXHx8XHwiIFwtQU1DICJcfF0iCi0uUkIgIltcfCIgXC1iICJcfF0iCi0uUkIgIltcfCIgXC1uby1yZWxheCAiXHxdIgotCi0uSSBtNjgweDAtb25seSBvcHRpb25zOgotLmJyCi0uUkIgIltcfCIgXC1sICJcfF0iCi0uUkIgIltcfCIgXC1tYzY4MDAwICJcfHxcfCIgXC1tYzY4MDEwICJcfHxcfCIgXC1tYzY4MDIwICJcfF0iCi0uYWQgYgotCi0uU0ggREVTQ1JJUFRJT04KLUdOVSBcYwotLkIgYXNcYwotXCYgaXMgcmVhbGx5IGEgZmFtaWx5IG9mIGFzc2VtYmxlcnMuICAKLUlmIHlvdSB1c2UgKG9yIGhhdmUgdXNlZCkgdGhlIEdOVSBhc3NlbWJsZXIgb24gb25lIGFyY2hpdGVjdHVyZSwgeW91Ci1zaG91bGQgZmluZCBhIGZhaXJseSBzaW1pbGFyIGVudmlyb25tZW50IHdoZW4geW91IHVzZSBpdCBvbiBhbm90aGVyCi1hcmNoaXRlY3R1cmUuICBFYWNoIHZlcnNpb24gaGFzIG11Y2ggaW4gY29tbW9uIHdpdGggdGhlIG90aGVycywKLWluY2x1ZGluZyBvYmplY3QgZmlsZSBmb3JtYXRzLCBtb3N0IGFzc2VtYmxlciBkaXJlY3RpdmVzIChvZnRlbiBjYWxsZWQKLVxjCi0uSSBwc2V1ZG8tb3BzKVxjCi1cJiBhbmQgYXNzZW1ibGVyIHN5bnRheC4gIAotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wcyB1c2VkIGJ5IEdOVSBcYwotLkIgYXNcYwotXCYsIHNlZSBgXHxcYwotLkIgYXNcYwotXHwnIGVudHJ5IGluIFxjCi0uQiBpbmZvIFxjCi0ob3IgdGhlIG1hbnVhbCBcYwotLkkKLS5JCi1Vc2luZyBhczogVGhlIEdOVSBBc3NlbWJsZXJcYwotXCYpLgotCi1cYwotLkIgYXNcYwotXCYgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YgdGhlIEdOVSBDCi1jb21waWxlciBcYwotLkIgZ2NjXGMKLVwmIGZvciB1c2UgYnkgdGhlIGxpbmtlciBcYwotLkIgbGRcYwotXCYuICBOZXZlcnRoZWxlc3MsCi13ZSd2ZSB0cmllZCB0byBtYWtlIFxjCi0uQiBhc1xjCi1cJiBhc3NlbWJsZSBjb3JyZWN0bHkgZXZlcnl0aGluZyB0aGF0IHRoZSBuYXRpdmUKLWFzc2VtYmxlciB3b3VsZC4KLVRoaXMgZG9lc24ndCBtZWFuIFxjCi0uQiBhc1xjCi1cJiBhbHdheXMgdXNlcyB0aGUgc2FtZSBzeW50YXggYXMgYW5vdGhlcgotYXNzZW1ibGVyIGZvciB0aGUgc2FtZSBhcmNoaXRlY3R1cmU7IGZvciBleGFtcGxlLCB3ZSBrbm93IG9mIHNldmVyYWwKLWluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiA2ODB4MCBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXguCi0KLUVhY2ggdGltZSB5b3UgcnVuIFxjCi0uQiBhc1xjCi1cJiBpdCBhc3NlbWJsZXMgZXhhY3RseSBvbmUgc291cmNlCi1wcm9ncmFtLiAgVGhlIHNvdXJjZSBwcm9ncmFtIGlzIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUgZmlsZXMuCi0oVGhlIHN0YW5kYXJkIGlucHV0IGlzIGFsc28gYSBmaWxlLikKLQotSWYgXGMKLS5CIGFzXGMKLVwmIGlzIGdpdmVuIG5vIGZpbGUgbmFtZXMgaXQgYXR0ZW1wdHMgdG8gcmVhZCBvbmUgaW5wdXQgZmlsZQotZnJvbSB0aGUgXGMKLS5CIGFzXGMKLVwmIHN0YW5kYXJkIGlucHV0LCB3aGljaCBpcyBub3JtYWxseSB5b3VyIHRlcm1pbmFsLiAgWW91Ci1tYXkgaGF2ZSB0byB0eXBlIFxjCi0uQiBjdGwtRFxjCi1cJiB0byB0ZWxsIFxjCi0uQiBhc1xjCi1cJiB0aGVyZSBpcyBubyBtb3JlIHByb2dyYW0KLXRvIGFzc2VtYmxlLiAgVXNlIGBcfFxjCi0uQiBcLVxeXC1cYwotXHwnIGlmIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgbmFtZSB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotaW4geW91ciBjb21tYW5kIGxpbmUuCi0KLS5CIGFzXGMKLVwmIG1heSB3cml0ZSB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkIGVycm9yCi1maWxlICh1c3VhbGx5IHlvdXIgdGVybWluYWwpLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aGVuIFxjCi0uQiBhc1xjCi1cJiBpcwotcnVuIGF1dG9tYXRpY2FsbHkgYnkgYSBjb21waWxlci4gIFdhcm5pbmdzIHJlcG9ydCBhbiBhc3N1bXB0aW9uIG1hZGUgc28KLXRoYXQgXGMKLS5CIGFzXGMKLVwmIGNvdWxkIGtlZXAgYXNzZW1ibGluZyBhIGZsYXdlZCBwcm9ncmFtOyBlcnJvcnMgcmVwb3J0IGEKLWdyYXZlIHByb2JsZW0gdGhhdCBzdG9wcyB0aGUgYXNzZW1ibHkuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CUiBcLWEKLVR1cm4gb24gYXNzZW1ibHkgbGlzdGluZ3MuICBUaGVyZSBhcmUgdmFyaW91cyBzdWJvcHRpb25zLgotLkIgZAotb21pdHMgZGVidWdnaW5nIGRpcmVjdGl2ZXMuCi0uQiBoCi1pbmNsdWRlcyB0aGUgaGlnaCBsZXZlbCBzb3VyY2UgY29kZTsgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUKLXNvdXJjZSBmaWxlIGNhbiBiZSBmb3VuZCwgYW5kIHRoZSBjb2RlIHdhcyBjb21waWxlZCB3aXRoCi0uQiBcLWcuCi0uQiBsCi1pbmNsdWRlcyBhbiBhc3NlbWJseSBsaXN0aW5nLgotLkIgbgotb21pdHMgZm9ybXMgcHJvY2Vzc2luZy4KLS5CIHMKLWluY2x1ZGVzIGEgc3ltYm9sIGxpc3RpbmcuCi0uQiA9Ci0uSSBmaWxlCi1zZXRzIHRoZSBsaXN0aW5nIGZpbGUgbmFtZTsgdGhpcyBtdXN0IGJlIHRoZSBsYXN0IHN1Ym9wdGlvbi4KLVRoZSBkZWZhdWx0IHN1Ym9wdGlvbnMgYXJlCi0uQiBobHMuCi0uVFAKLS5CIFwtRAotVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgb25seSBmb3Igc2NyaXB0IGNvbXBhdGliaWxpdHkgd2l0aCBjYWxscyB0bwotb3RoZXIgYXNzZW1ibGVyczsgaXQgaGFzIG5vIGVmZmVjdCBvbiBcYwotLkIgYXNcYwotXCYuCi0uVFAKLS5CIFwtXC1kZWZzeW0gU1lNPVZBTFVFCi1EZWZpbmUgdGhlIHN5bWJvbCBTWU0gdG8gYmUgVkFMVUUgYmVmb3JlIGFzc2VtYmxpbmcgdGhlIGlucHV0IGZpbGUuCi1WQUxVRSBtdXN0IGJlIGFuIGludGVnZXIgY29uc3RhbnQuICBBcyBpbiBDLCBhIGxlYWRpbmcgMHggaW5kaWNhdGVzIGEKLWhleGFkZWNpbWFsIHZhbHVlLCBhbmQgYSBsZWFkaW5nIDAgaW5kaWNhdGVzIGFuIG9jdGFsIHZhbHVlLgotLlRQCi0uQiBcLWYKLWBgZmFzdCcnLS1za2lwIHByZXByb2Nlc3NpbmcgKGFzc3VtZSBzb3VyY2UgaXMgY29tcGlsZXIgb3V0cHV0KS4KLS5UUAotLkJJICJcLUlcICIgcGF0aAotQWRkIAotLkkgcGF0aAotdG8gdGhlIHNlYXJjaCBsaXN0IGZvciAKLS5CIC5pbmNsdWRlCi1kaXJlY3RpdmVzLgotLlRQCi0uQiBcLVwtZ3N0YWJzCi1HZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggYXNzZW1ibGVyIGxpbmUuICBUaGlzCi1tYXkgaGVscCBkZWJ1Z2dpbmcgYXNzZW1ibGVyIGNvZGUsIGlmIHRoZSBkZWJ1Z2dlciBjYW4gaGFuZGxlIGl0LgotLlRQCi0uQiBcLUsKLUlzc3VlIHdhcm5pbmdzIHdoZW4gZGlmZmVyZW5jZSB0YWJsZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgotLlRQCi0uQiBcLUwKLUtlZXAgKGluIHN5bWJvbCB0YWJsZSkgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgd2l0aCBgXHxcYwotLkIgTFxjCi1cfCcKLS5UUAotLkIgXC1NLCBcLVwtbXJpCi1Bc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotLlRQCi0uQkkgIlwtb1wgIiBvYmpmaWxlCi1OYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgZnJvbSBcYwotLkIgYXMKLS5UUAotLkIgXC1SCi1Gb2xkIGRhdGEgc2VjdGlvbiBpbnRvIHRleHQgc2VjdGlvbgotLlRQCi0uQiBcLVwtdHJhZGl0aW9uYWxcLWZvcm1hdAotVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBhc3NlbWJsZXIsIHdoZW4gcG9zc2libGUuCi0uVFAKLS5CIFwtdgotQW5ub3VuY2UgXGMKLS5CIGFzXGMKLVwmIHZlcnNpb24KLS5UUAotLkIgXC1XLCBcLVwtbm8td2FybgotU3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcy4KLS5UUAotLkIgXC1cLWZhdGFsXC13YXJuaW5ncwotQ29uc2lkZXIgd2FybmluZ3MgdG8gYmUgZmF0YWwuCi0uVFAKLS5CIFwtXC13YXJuCi1KdXN0IHdhcm4gb24gd2FybmluZ3MuCi0uVFAKLS5JUiAiXC1cXlwtIiAiXCB8XCAiICJmaWxlc1x8Llx8Llx8LiIKLVNvdXJjZSBmaWxlcyB0byBhc3NlbWJsZSwgb3Igc3RhbmRhcmQgaW5wdXQgKFxjCi0uQlIgIlwtXF5cLSIgIikiCi0uVFAKLS5CSSBcLUEgdmFyCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLVNwZWNpZnkgd2hpY2ggdmFyaWFudCBvZiB0aGUgOTYwIGFyY2hpdGVjdHVyZSBpcyB0aGUgdGFyZ2V0LgotLlRQCi0uQiBcLWIKLS5JCi0oV2hlbiBjb25maWd1cmVkIGZvciBJbnRlbCA5NjAuKQotQWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuLgotLlRQCi0uQiBcLW5vLXJlbGF4Ci0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLURvIG5vdCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHM7Ci1lcnJvciBpZiBuZWNlc3NhcnkuCi0uVFAKLS5CIFwtbAotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIE1vdG9yb2xhIDY4MDAwKS4gIAotLmJyCi1TaG9ydGVuIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkIHN5bWJvbHMsIHRvIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvLgotLlRQCi0uQlIgIlwtbWM2ODAwMCIgIlx8fFx8IiAiXC1tYzY4MDEwIiAiXHx8XHwiICJcLW1jNjgwMjAiCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgTW90b3JvbGEgNjgwMDApLiAgCi0uYnIKLVNwZWNpZnkgd2hhdCBwcm9jZXNzb3IgaW4gdGhlIDY4MDAwIGZhbWlseSBpcyB0aGUgdGFyZ2V0IChkZWZhdWx0IDY4MDIwKQotCi0uUFAKLU9wdGlvbnMgbWF5IGJlIGluIGFueSBvcmRlciwgYW5kIG1heSBiZQotYmVmb3JlLCBhZnRlciwgb3IgYmV0d2VlbiBmaWxlIG5hbWVzLiAgVGhlIG9yZGVyIG9mIGZpbGUgbmFtZXMgaXMKLXNpZ25pZmljYW50LgotCi1gXHxcYwotLkIgXC1cXlwtXGMKLVx8JyAodHdvIGh5cGhlbnMpIGJ5IGl0c2VsZiBuYW1lcyB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotZXhwbGljaXRseSwgYXMgb25lIG9mIHRoZSBmaWxlcyBmb3IgXGMKLS5CIGFzXGMKLVwmIHRvIGFzc2VtYmxlLgotCi1FeGNlcHQgZm9yIGBcfFxjCi0uQiBcLVxeXC1cYwotXHwnIGFueSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdGhhdCBiZWdpbnMgd2l0aCBhCi1oeXBoZW4gKGBcfFxjCi0uQiBcLVxjCi1cfCcpIGlzIGFuIG9wdGlvbi4gIEVhY2ggb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCi1cYwotLkIgYXNcYwotXCYuICBObyBvcHRpb24gY2hhbmdlcyB0aGUgd2F5IGFub3RoZXIgb3B0aW9uIHdvcmtzLiAgQW4KLW9wdGlvbiBpcyBhIGBcfFxjCi0uQiBcLVxjCi1cfCcgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbGV0dGVyczsgdGhlIGNhc2Ugb2YKLXRoZSBsZXR0ZXIgaXMgaW1wb3J0YW50LiAgIEFsbCBvcHRpb25zIGFyZSBvcHRpb25hbC4KLQotVGhlIGBcfFxjCi0uQiBcLW9cYwotXHwnIG9wdGlvbiBleHBlY3RzIGV4YWN0bHkgb25lIGZpbGUgbmFtZSB0byBmb2xsb3cuICBUaGUgZmlsZQotbmFtZSBtYXkgZWl0aGVyIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgb3B0aW9uJ3MgbGV0dGVyIChjb21wYXRpYmxlCi13aXRoIG9sZGVyIGFzc2VtYmxlcnMpIG9yIGl0IG1heSBiZSB0aGUgbmV4dCBjb21tYW5kIGFyZ3VtZW50IChHTlUKLXN0YW5kYXJkKS4gIAotCi1UaGVzZSB0d28gY29tbWFuZCBsaW5lcyBhcmUgZXF1aXZhbGVudDoKLS5icgotLkIKLWFzXCBcIFwtb1wgXCBteVwtb2JqZWN0XC1maWxlLm9cIFwgbXVtYmxlLnMKLS5icgotLkIKLWFzXCBcIFwtb215XC1vYmplY3RcLWZpbGUub1wgXCBtdW1ibGUucwotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGFzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1Vc2luZyBhczogVGhlIEdOVSBBc3NlbWJsZXJcYwotXCY7Ci0uQlIgZ2NjICIoIiAxICIpLCIKLS5CUiBsZCAiKCIgMSAiKS4iCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYXMudGV4aW5mbyBiL2dhcy9kb2MvYXMudGV4aW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwYThiMi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FzLnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1Mzk3ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvIEBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLVRleGluZm8tKi0KLUBjICBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLUBjICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFVQREFURSEhICBPbiBmdXR1cmUgdXBkYXRlcy0tCi1AYyAgICgxKSAgIGNoZWNrIGZvciBuZXcgbWFjaGluZS1kZXAgY21kbGluZSBvcHRpb25zIGluCi1AYyAgICAgICAgIG1kX3BhcnNlX29wdGlvbiBkZWZpbml0aW9ucyBpbiBjb25maWcvdGMtKi5jCi1AYyAgICgyKSAgIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXJlY3RpdmVzLCBleGFtaW5lIG1kX3BzZXVkb19vcAotQGMgICAgICAgICBpbiBjb25maWcvdGMtKi5jCi1AYyAgICgzKSAgIGZvciBvYmplY3QtZm9ybWF0IHNwZWNpZmljIGRpcmVjdGl2ZXMsIGV4YW1pbmUgb2JqX3BzZXVkb19vcAotQGMgICAgICAgICBpbiBjb25maWcvb2JqLSouYyAgICAgICAKLUBjICAgKDQpICAgcG9ydGFibGUgZGlyZWN0aXZlcyBpbiBwb3RhYmxlW10gaW4gcmVhZC5jCi1AYyAlKipzdGFydCBvZiBoZWFkZXIKLUBzZXRmaWxlbmFtZSBhcy5pbmZvCi1AYyAtLS1jb25maWctLS0KLUBjIGRlZmF1bHRzLCBjb25maWcgZmlsZSBtYXkgb3ZlcnJpZGU6Ci1Ac2V0IGhhdmUtc3RhYnMKLUBjIC0tLQotQGluY2x1ZGUgYXNjb25maWcudGV4aQotQGluY2x1ZGUgZ2FzdmVyLnRleGkKLUBjIC0tLQotQGMgY29tbW9uIE9SIGNvbWJpbmF0aW9ucyBvZiBjb25kaXRpb25zCi1AaWZzZXQgQU9VVAotQHNldCBhb3V0LWJvdXQKLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0vVGh1bWIKLUBzZXQgQVJNCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQk9VVAotQHNldCBhb3V0LWJvdXQKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC8zMDAKLUBzZXQgSDgKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLUBzZXQgSDgKLUBlbmQgaWZzZXQKLUBpZnNldCBTSAotQHNldCBIOAotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUBzZXQgYWJub3JtYWwtc2VwYXJhdG9yCi1AZW5kIGlmc2V0Ci1AYyAtLS0tLS0tLS0tLS0KLUBpZnNldCBHRU5FUklDCi1Ac2V0dGl0bGUgVXNpbmcgQHZhbHVle0FTfQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQHNldHRpdGxlIFVzaW5nIEB2YWx1ZXtBU30gKEB2YWx1ZXtUQVJHRVR9KQotQGVuZCBpZmNsZWFyCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLUBjIEBzbWFsbGJvb2sKLUBjIEBzZXQgU01BTEwKLUBjIFdBUkUhIFNvbWUgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IHNlY3Rpb25zIGNvbnRhaW4gdGFibGVzIG9mIG1hY2hpbmUKLUBjIGluc3RydWN0aW9ucy4gIEV4Y2VwdCBpbiBtdWx0aS1jb2x1bW4gZm9ybWF0LCB0aGVzZSB0YWJsZXMgbG9vayBzaWxseS4KLUBjIFVuZm9ydHVuYXRlbHksIFRleGluZm8gZG9lc24ndCBoYXZlIGEgZ2VuZXJhbC1wdXJwb3NlIG11bHRpLWNvbCBmb3JtYXQsIHNvCi1AYyB0aGUgbXVsdGktY29sIGZvcm1hdCBpcyBmYWtlZCB3aXRoaW4gQGV4YW1wbGUgc2VjdGlvbnMuCi1AYyAKLUBjIEFnYWluIHVuZm9ydHVuYXRlbHksIHRoZSBuYXR1cmFsIHNpemUgdGhhdCBmaXRzIG9uIGEgcGFnZSwgZm9yIHRoZXNlIHRhYmxlcywKLUBjIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3Qgc21hbGxib29rIGlzIHR1cm5lZCBvbi4KLUBjIFRoaXMgbWF0dGVycywgYmVjYXVzZSBvZiBvcmRlcjogdGV4dCBmbG93IHN3aXRjaGVzIGNvbHVtbnMgYXQgZWFjaCBwYWdlCi1AYyBicmVhay4KLUBjIAotQGMgVGhlIGZvcm1hdCBmYWtlZCBpbiB0aGlzIHNvdXJjZSB3b3JrcyByZWFzb25hYmx5IHdlbGwgZm9yIHNtYWxsYm9vaywKLUBjIG5vdCB3ZWxsIGZvciB0aGUgZGVmYXVsdCBsYXJnZS1wYWdlIGZvcm1hdC4gIFRoaXMgbWFudWFsIGV4cGVjdHMgdGhhdCBpZiB5b3UKLUBjIHR1cm4gb24gQHNtYWxsYm9vaywgeW91IHdpbGwgYWxzbyB1bmNvbW1lbnQgdGhlICJAc2V0IFNNQUxMIiB0byBlbmFibGUgdGhlCi1AYyB0YWJsZXMgaW4gcXVlc3Rpb24uICBZb3UgY2FuIHR1cm4gb24gb25lIHdpdGhvdXQgdGhlIG90aGVyIGF0IHlvdXIKLUBjIGRpc2NyZXRpb24sIG9mIGNvdXJzZS4gCi1AaWZpbmZvCi1Ac2V0IFNNQUxMCi1AYyB0aGUgaW5zbiB0YWJsZXMgbG9vayBqdXN0IGFzIHNpbGx5IGluIGluZm8gZmlsZXMgcmVnYXJkbGVzcyBvZiBzbWFsbGJvb2ssCi1AYyBtaWdodCBhcyB3ZWxsIHNob3cgJ2VtIGFueXdheXMuCi1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBBczogKGFzKS4gICAgICAgICAgICAgICAgICAgICBUaGUgR05VIGFzc2VtYmxlci4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBmaW5hbG91dAotQHN5bmNvZGVpbmRleCBreSBjcAotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBHTlUgQXNzZW1ibGVyICJAdmFsdWV7QVN9Ii4KLQotQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzIG1hbnVhbAotdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZSByZXN1bHRpbmcKLWRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8KLXRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCBpZmluZm8KLQotQHRpdGxlcGFnZQotQHRpdGxlIFVzaW5nIEB2YWx1ZXtBU30KLUBzdWJ0aXRsZSBUaGUgQHNje2dudX0gQXNzZW1ibGVyCi1AaWZjbGVhciBHRU5FUklDCi1Ac3VidGl0bGUgZm9yIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHkKLUBlbmQgaWZjbGVhcgotQHNwIDEKLUBzdWJ0aXRsZSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfQotQHNwIDEKLUBzcCAxMwotVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBJbmMuICB0aGFua3MgVGhlIE5pY2UgQ29tcHV0ZXIKLUNvbXBhbnkgb2YgQXVzdHJhbGlhIGZvciBsb2FuaW5nIERlYW4gRWxzbmVyIHRvIHdyaXRlIHRoZQotZmlyc3QgKFZheCkgdmVyc2lvbiBvZiBAY29kZXthc30gZm9yIFByb2plY3QgQHNje2dudX0uCi1UaGUgcHJvcHJpZXRvcnMsIG1hbmFnZW1lbnQgYW5kIHN0YWZmIG9mIFROQ0NBIHRoYW5rIEZTRiBmb3IKLWRpc3RyYWN0aW5nIHRoZSBib3NzIHdoaWxlIHRoZXkgZ290IHNvbWUgd29yawotZG9uZS4KLUBzcCAzCi1AYXV0aG9yIERlYW4gRWxzbmVyLCBKYXkgRmVubGFzb24gJiBmcmllbmRzCi1AcGFnZQotQHRleAote1xwYXJza2lwPTBwdAotXGhmaWxsIHtcaXQgVXNpbmcge1x0dCBAdmFsdWV7QVN9fX1ccGFyCi1caGZpbGwgRWRpdGVkIGJ5IEN5Z251cyBTdXBwb3J0XHBhcgotfQotJSJib3hpdCIgbWFjcm8gZm9yIGZpZ3VyZXM6Ci0lTW9kaWZpZWQgZnJvbSBLbnV0aCdzIGBgYm94aXQnJyBtYWNybyBmcm9tIFRlWGJvb2sgKGFuc3dlciB0byBleGVyY2lzZSAyMS4zKQotXGdkZWZcYm94aXQjMSMye1x2Ym94e1xocnVsZVxoYm94e1x2cnVsZVxrZXJuM3B0Ci0gICAgIFx2Ym94e1xwYXJpbmRlbnQ9MHB0XHBhcnNraXA9MHB0XGhzaXplPSMxXGtlcm4zcHRcc3RydXRcaGZpbAotIzJcaGZpbFxzdHJ1dFxrZXJuM3B0fVxrZXJuM3B0XHZydWxlfVxocnVsZX19JWJveCB3aXRoIHZpc2libGUgb3V0bGluZQotXGdkZWZcaWJveCMxIzJ7XGhib3ggdG8gIzF7IzJcaGZpbH1ca2VybjhwdH0lIGludmlzaWJsZSBib3gKLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzIG1hbnVhbAotdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZSByZXN1bHRpbmcKLWRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8KLXRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFVzaW5nIEB2YWx1ZXtBU30KLQotVGhpcyBmaWxlIGlzIGEgdXNlciBndWlkZSB0byB0aGUgQHNje2dudX0gYXNzZW1ibGVyIEBjb2Rle0B2YWx1ZXtBU319IHZlcnNpb24KLUB2YWx1ZXtWRVJTSU9OfS4KLUBpZmNsZWFyIEdFTkVSSUMKLVRoaXMgdmVyc2lvbiBvZiB0aGUgZmlsZSBkZXNjcmliZXMgQGNvZGV7QHZhbHVle0FTfX0gY29uZmlndXJlZCB0byBnZW5lcmF0ZQotY29kZSBmb3IgQHZhbHVle1RBUkdFVH0gYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZjbGVhcgotQG1lbnUKLSogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXcKLSogSW52b2tpbmc6OiAgICAgICAgICAgICAgICAgICAgQ29tbWFuZC1MaW5lIE9wdGlvbnMKLSogU3ludGF4OjogICAgICAgICAgICAgICAgICAgICAgU3ludGF4Ci0qIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgICAgIFNlY3Rpb25zIGFuZCBSZWxvY2F0aW9uCi0qIFN5bWJvbHM6OiAgICAgICAgICAgICAgICAgICAgIFN5bWJvbHMKLSogRXhwcmVzc2lvbnM6OiAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbnMKLSogUHNldWRvIE9wczo6ICAgICAgICAgICAgICAgICAgQXNzZW1ibGVyIERpcmVjdGl2ZXMKLSogTWFjaGluZSBEZXBlbmRlbmNpZXM6OiAgICAgICAgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLSogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKLSogQWNrbm93bGVkZ2VtZW50czo6ICAgICAgICAgICAgV2hvIERpZCBXaGF0Ci0qIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ci1AZW5kIG1lbnUKLUBlbmQgaWZpbmZvCi0KLUBub2RlIE92ZXJ2aWV3Ci1AY2hhcHRlciBPdmVydmlldwotQGlmdGV4Ci1UaGlzIG1hbnVhbCBpcyBhIHVzZXIgZ3VpZGUgdG8gdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBAY29kZXtAdmFsdWV7QVN9fS4KLUBpZmNsZWFyIEdFTkVSSUMKLVRoaXMgdmVyc2lvbiBvZiB0aGUgbWFudWFsIGRlc2NyaWJlcyBAY29kZXtAdmFsdWV7QVN9fSBjb25maWd1cmVkIHRvIGdlbmVyYXRlCi1jb2RlIGZvciBAdmFsdWV7VEFSR0VUfSBhcmNoaXRlY3R1cmVzLgotQGVuZCBpZmNsZWFyCi1AZW5kIGlmdGV4Ci0KLUBjaW5kZXggaW52b2NhdGlvbiBzdW1tYXJ5Ci1AY2luZGV4IG9wdGlvbiBzdW1tYXJ5Ci1AY2luZGV4IHN1bW1hcnkgb2Ygb3B0aW9ucwotSGVyZSBpcyBhIGJyaWVmIHN1bW1hcnkgb2YgaG93IHRvIGludm9rZSBAY29kZXtAdmFsdWV7QVN9fS4gIEZvciBkZXRhaWxzLAotQHB4cmVme0ludm9raW5nLCxDb21hbmQtTGluZSBPcHRpb25zfS4KLQotQGMgV2UgZG9uJ3QgdXNlIGRlZmZuIGFuZCBmcmllbmRzIGZvciB0aGUgZm9sbG93aW5nIGJlY2F1c2UgdGhleSBzZWVtCi1AYyB0byBiZSBsaW1pdGVkIHRvIG9uZSBsaW5lIGZvciB0aGUgaGVhZGVyLgotQHNtYWxsZXhhbXBsZQotQHZhbHVle0FTfSBbIC1hW2NkaGxuc11bPWZpbGVdIF0gWyAtRCBdICBbIC0tZGVmc3ltIEB2YXJ7c3ltfT1AdmFye3ZhbH0gXQotIFsgLWYgXSBbIC0tZ3N0YWJzIF0gWyAtLWdkd2FyZjIgXSBbIC0taGVscCBdIFsgLUkgQHZhcntkaXJ9IF0gWyAtSiBdIFsgLUsgXSBbIC1MIF0KLSBbIC0ta2VlcC1sb2NhbHMgXSBbIC1vIEB2YXJ7b2JqZmlsZX0gXSBbIC1SIF0gWyAtLXN0YXRpc3RpY3MgXSBbIC12IF0KLSBbIC12ZXJzaW9uIF0gWyAtLXZlcnNpb24gXSBbIC1XIF0gWyAtLXdhcm4gXSBbIC0tZmF0YWwtd2FybmluZ3MgXSAKLSBbIC13IF0gWyAteCBdIFsgLVogXQotQGlmc2V0IEEyOUsKLUBjIGFtMjlrIGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucwotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotIFsgLW1iaWctZW5kaWFuIHwgLW1saXR0bGUtZW5kaWFuIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0KLSBbIC1tW2FybV0xIHwgLW1bYXJtXTIgfCAtbVthcm1dMjUwIHwgLW1bYXJtXTMgfCAtbVthcm1dNiB8IC1tW2FybV02MCB8Ci0gICAtbVthcm1dNjAwIHwgLW1bYXJtXTYxMCB8IC1tW2FybV02MjAgfCAtbVthcm1dN1t0XVtbZF1tW2ldXVtmZV0gfCAtbVthcm1dNzAgfAotICAgLW1bYXJtXTcwMCB8IC1tW2FybV03MTBbY10gfCAtbVthcm1dNzEwMCB8IC1tW2FybV03NTAwIHwgLW1bYXJtXTggfAotICAgLW1bYXJtXTgxMCB8IC1tW2FybV05IHwgLW1bYXJtXTkyMCB8IC1tW2FybV05MjB0IHwgLW1bYXJtXTl0ZG1pIHwKLSAgIC1tc3Ryb25nYXJtIHwgLW1zdHJvbmdhcm0xMTAgfCAtbXN0cm9uZ2FybTExMDAgXQotIFsgLW1bYXJtXXYyIHwgLW1bYXJtXXYyYSB8IC1tW2FybV12MyB8IC1tW2FybV12M20gfCAtbVthcm1ddjQgfCAtbVthcm1ddjR0IHwKLSAgIC1tW2FybV12NSB8IC1bYXJtXXY1dCBdCi0gWyAtbXRodW1iIHwgLW1hbGwgXQotIFsgLW1mcGExMCB8IC1tZnBhMTEgfCAtbWZwZS1vbGQgfCAtbW5vLWZwdSBdCi0gWyAtRUIgfCAtRUwgXQotIFsgLW1hcGNzLTMyIHwgLW1hcGNzLTI2IHwgLW1hcGNzLWZsb2F0IHwgLW1hcGNzLXJlZW50cmFudCBdCi0gWyAtbXRodW1iLWludGVyd29yayBdCi0gWyAtbW9hYmkgXQotIFsgLWsgXQotQGVuZCBpZnNldAotQGlmc2V0IEQxMFYKLSBbIC1PIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBEMzBWCi0gWyAtTyB8IC1uIHwgLU4gXQotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci1AYyBIaXRhY2hpIGZhbWlseSBjaGlwcyBoYXZlIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotQGMgSFBQQSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMgKHlldCkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgUEoKLSBbIC1tYiB8IC1tZSBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU1BBUkMKLUBjIFRoZSBvcmRlciBoZXJlIGlzIGltcG9ydGFudC4gIFNlZSBjLXNwYXJjLnRleGkuCi0gWyAtQXY2IHwgLUF2NyB8IC1BdjggfCAtQXNwYXJjbGV0IHwgLUFzcGFyY2xpdGUKLSAgIC1BdjhwbHVzIHwgLUF2OHBsdXNhIHwgLUF2OSB8IC1BdjlhIF0KLSBbIC14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYSBdIFsgLWJ1bXAgXSBbIC0zMiB8IC02NCBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLUBjIFo4MDAwIGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUBjIHNlZSBtZF9wYXJzZV9vcHRpb24gaW4gdGMtaTk2MC5jCi0gWyAtQUNBIHwgLUFDQV9BIHwgLUFDQiB8IC1BQ0MgfCAtQUtBIHwgLUFLQiB8IC1BS0MgfCAtQU1DIF0KLSBbIC1iIF0gWyAtbm8tcmVsYXggXQotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotIFsgLWwgXSBbIC1tNjgwMDAgfCAtbTY4MDEwIHwgLW02ODAyMCB8IC4uLiBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTUNPUkUKLSBbIC1qc3JpMmJzciBdIFsgLXNpZmlsdGVyIF0gWyAtcmVsYXggXQotQGVuZCBpZnNldAotQGlmc2V0IE1JUFMKLSBbIC1ub2NwcCBdIFsgLUVMIF0gWyAtRUIgXSBbIC1HIEB2YXJ7bnVtfSBdIFsgLW1jcHU9QHZhcntDUFV9IF0KLSBbIC1taXBzMSBdIFsgLW1pcHMyIF0gWyAtbWlwczMgXSBbIC1tNDY1MCBdIFsgLW5vLW00NjUwIF0KLSBbIC0tdHJhcCBdIFsgLS1icmVhayBdCi0gWyAtLWVtdWxhdGlvbj1AdmFye25hbWV9IF0KLUBlbmQgaWZzZXQKLSBbIC0tIHwgQHZhcntmaWxlc30gQGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hW2NkaGxtbnNdCi1UdXJuIG9uIGxpc3RpbmdzLCBpbiBhbnkgb2YgYSB2YXJpZXR5IG9mIHdheXM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWFjCi1vbWl0IGZhbHNlIGNvbmRpdGlvbmFscwotCi1AaXRlbSAtYWQKLW9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXMKLQotQGl0ZW0gLWFoCi1pbmNsdWRlIGhpZ2gtbGV2ZWwgc291cmNlCi0KLUBpdGVtIC1hbAotaW5jbHVkZSBhc3NlbWJseQotCi1AaXRlbSAtYW0KLWluY2x1ZGUgbWFjcm8gZXhwYW5zaW9ucwotCi1AaXRlbSAtYW4KLW9taXQgZm9ybXMgcHJvY2Vzc2luZwotCi1AaXRlbSAtYXMKLWluY2x1ZGUgc3ltYm9scwotCi1AaXRlbSA9ZmlsZQotc2V0IHRoZSBuYW1lIG9mIHRoZSBsaXN0aW5nIGZpbGUKLUBlbmQgdGFibGUKLQotWW91IG1heSBjb21iaW5lIHRoZXNlIG9wdGlvbnM7IGZvciBleGFtcGxlLCB1c2UgQHNhbXB7LWFsbn0gZm9yIGFzc2VtYmx5Ci1saXN0aW5nIHdpdGhvdXQgZm9ybXMgcHJvY2Vzc2luZy4gIFRoZSBAc2FtcHs9ZmlsZX0gb3B0aW9uLCBpZiB1c2VkLCBtdXN0IGJlCi10aGUgbGFzdCBvbmUuICBCeSBpdHNlbGYsIEBzYW1wey1hfSBkZWZhdWx0cyB0byBAc2FtcHstYWhsc30uCi0KLUBpdGVtIC1ECi1JZ25vcmVkLiAgVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgZm9yIHNjcmlwdCBjb21wYXRpYmlsaXR5IHdpdGggY2FsbHMgdG8KLW90aGVyIGFzc2VtYmxlcnMuCi0KLUBpdGVtIC0tZGVmc3ltIEB2YXJ7c3ltfT1AdmFye3ZhbHVlfQotRGVmaW5lIHRoZSBzeW1ib2wgQHZhcntzeW19IHRvIGJlIEB2YXJ7dmFsdWV9IGJlZm9yZSBhc3NlbWJsaW5nIHRoZSBpbnB1dCBmaWxlLgotQHZhcnt2YWx1ZX0gbXVzdCBiZSBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgQXMgaW4gQywgYSBsZWFkaW5nIEBzYW1wezB4fQotaW5kaWNhdGVzIGEgaGV4YWRlY2ltYWwgdmFsdWUsIGFuZCBhIGxlYWRpbmcgQHNhbXB7MH0gaW5kaWNhdGVzIGFuIG9jdGFsIHZhbHVlLgotCi1AaXRlbSAtZgotYGBmYXN0JyctLS1za2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZyAoYXNzdW1lIHNvdXJjZSBpcwotY29tcGlsZXIgb3V0cHV0KS4KLQotQGl0ZW0gLS1nc3RhYnMKLUdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhc3NlbWJsZXIgbGluZS4gIFRoaXMKLW1heSBoZWxwIGRlYnVnZ2luZyBhc3NlbWJsZXIgY29kZSwgaWYgdGhlIGRlYnVnZ2VyIGNhbiBoYW5kbGUgaXQuCi0KLUBpdGVtIC0tZ2R3YXJmMgotR2VuZXJhdGUgRFdBUkYyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhc3NlbWJsZXIgbGluZS4gIFRoaXMKLW1heSBoZWxwIGRlYnVnZ2luZyBhc3NlbWJsZXIgY29kZSwgaWYgdGhlIGRlYnVnZ2VyIGNhbiBoYW5kbGUgaXQuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgZXhpdC4KLQotQGl0ZW0gLUkgQHZhcntkaXJ9Ci1BZGQgZGlyZWN0b3J5IEB2YXJ7ZGlyfSB0byB0aGUgc2VhcmNoIGxpc3QgZm9yIEBjb2Rley5pbmNsdWRlfSBkaXJlY3RpdmVzLgotCi1AaXRlbSAtSgotRG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3cuCi0KLUBpdGVtIC1LCi1AaWZjbGVhciBESUZGLVRCTC1LTFVHRQotVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgYnV0IGhhcyBubyBlZmZlY3Qgb24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi1Jc3N1ZSB3YXJuaW5ncyB3aGVuIGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50cy4KLUBlbmQgaWZzZXQKLQotQGl0ZW0gLUwKLUBpdGVteCAtLWtlZXAtbG9jYWxzCi1LZWVwIChpbiB0aGUgc3ltYm9sIHRhYmxlKSBsb2NhbCBzeW1ib2xzLiAgT24gdHJhZGl0aW9uYWwgYS5vdXQgc3lzdGVtcwotdGhlc2Ugc3RhcnQgd2l0aCBAc2FtcHtMfSwgYnV0IGRpZmZlcmVudCBzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IGxvY2FsCi1sYWJlbCBwcmVmaXhlcy4KLQotQGl0ZW0gLW8gQHZhcntvYmpmaWxlfQotTmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IGZyb20gQGNvZGV7QHZhbHVle0FTfX0gQHZhcntvYmpmaWxlfS4KLQotQGl0ZW0gLVIKLUZvbGQgdGhlIGRhdGEgc2VjdGlvbiBpbnRvIHRoZSB0ZXh0IHNlY3Rpb24uCi0KLUBpdGVtIC0tc3RhdGlzdGljcwotUHJpbnQgdGhlIG1heGltdW0gc3BhY2UgKGluIGJ5dGVzKSBhbmQgdG90YWwgdGltZSAoaW4gc2Vjb25kcykgdXNlZCBieQotYXNzZW1ibHkuCi0KLUBpdGVtIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUKLVJlbW92ZSBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzIGZyb20gdGhlIG91dGdvaW5nIHN5bWJvbCB0YWJsZS4KLQotQGl0ZW0gLXYKLUBpdGVteCAtdmVyc2lvbgotUHJpbnQgdGhlIEBjb2Rle2FzfSB2ZXJzaW9uLgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50IHRoZSBAY29kZXthc30gdmVyc2lvbiBhbmQgZXhpdC4KLQotQGl0ZW0gLVcKLUBpdGVteCAtLW5vLXdhcm4KLVN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMuCi0KLUBpdGVtIC0tZmF0YWwtd2FybmluZ3MKLVRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycy4KLQotQGl0ZW0gLS13YXJuCi1Eb24ndCBzdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzIG9yIHRyZWF0IHRoZW0gYXMgZXJyb3JzLgotCi1AaXRlbSAtdwotSWdub3JlZC4KLQotQGl0ZW0gLXgKLUlnbm9yZWQuCi0KLUBpdGVtIC1aCi1HZW5lcmF0ZSBhbiBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9ycy4KLQotQGl0ZW0gLS0gfCBAdmFye2ZpbGVzfSBAZG90c3t9Ci1TdGFuZGFyZCBpbnB1dCwgb3Igc291cmNlIGZpbGVzIHRvIGFzc2VtYmxlLgotCi1AZW5kIHRhYmxlCi0KLUBpZnNldCBBUkMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYW4gQVJDIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQVJDIGVuZGlhbm5lc3MKLUBjaW5kZXggZW5kaWFubmVzcywgQVJDCi1AY2luZGV4IGJpZyBlbmRpYW4gb3V0cHV0LCBBUkMKLUBpdGVtIC1tYmlnLWVuZGlhbgotR2VuZXJhdGUgYGBiaWcgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGNpbmRleCBsaXR0bGUgZW5kaWFuIG91dHB1dCwgQVJDCi1AaXRlbSAtbWxpdHRsZS1lbmRpYW4KLUdlbmVyYXRlIGBgbGl0dGxlIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEFSTQotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBBUk0KLXByb2Nlc3NvciBmYW1pbHkuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLW1bYXJtXVsxfDJ8M3w2fDd8OHw5XVsuLi5dIAotU3BlY2lmeSB3aGljaCBBUk0gcHJvY2Vzc29yIHZhcmlhbnQgaXMgdGhlIHRhcmdldC4KLUBpdGVtIC1tW2FybV12WzJ8MmF8M3wzbXw0fDR0fDV8NXRdCi1TcGVjaWZ5IHdoaWNoIEFSTSBhcmNoaXRlY3R1cmUgdmFyaWFudCBpcyB1c2VkIGJ5IHRoZSB0YXJnZXQuCi1AaXRlbSAtbXRodW1iIHwgLW1hbGwKLUVuYWJsZSBvciBkaXNhYmxlIFRodW1iIG9ubHkgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcuCi1AaXRlbSAtbWZwYTEwIHwgLW1mcGExMSB8IC1tZnBlLW9sZCB8IC1tbm8tZnB1Ci1TZWxlY3Qgd2hpY2ggRmxvYXRpbmcgUG9pbnQgYXJjaGl0Y3R1cmUgaXMgdGhlIHRhcmdldC4KLUBpdGVtIC1tYXBjcy0zMiB8IC1tYXBjcy0yNiB8IC1tYXBjcy1mbG9hdCB8IC1tYXBjcy1yZWVudHJhbnQgfCAtbW9hYmkKLVNlbGVjdCB3aGljaCBwcm9jZWR1cmUgY2FsbGluZyBjb252ZW50aW9uIGlzIGluIHVzZS4KLUBpdGVtIC1FQiB8IC1FTAotU2VsZWN0IGVpdGhlciBiaWctZW5kaWFuICgtRUIpIG9yIGxpdHRsZS1lbmRpYW4gKC1FTCkgb3V0cHV0LgotQGl0ZW0gLW10aHVtYi1pbnRlcndvcmsKLVNwZWNpZnkgdGhhdCB0aGUgY29kZSBoYXMgYmVlbiBnZW5lcmF0ZWQgd2l0aCBpbnRlcndvcmtpbmcgYmV0d2VlbiBUaHVtYiBhbmQKLUFSTSBjb2RlIGluIG1pbmQuCi1AaXRlbSAtawotU3BlY2lmeSB0aGF0IFBJQyBjb2RlIGhhcyBiZWVuIGdlbmVyYXRlZC4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQxMFYKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYSBEMTBWIHByb2Nlc3Nvci4KLUB0YWJsZSBAY29kZQotQGNpbmRleCBEMTBWIG9wdGltaXphdGlvbgotQGNpbmRleCBvcHRpbWl6YXRpb24sIEQxMFYKLUBpdGVtIC1PCi1PcHRpbWl6ZSBvdXRwdXQgYnkgcGFyYWxsZWxpemluZyBpbnN0cnVjdGlvbnMuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBEMzBWCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgYSBEMzBWCi1wcm9jZXNzb3IuCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggRDMwViBvcHRpbWl6YXRpb24KLUBjaW5kZXggb3B0aW1pemF0aW9uLCBEMzBWCi1AaXRlbSAtTwotT3B0aW1pemUgb3V0cHV0IGJ5IHBhcmFsbGVsaXppbmcgaW5zdHJ1Y3Rpb25zLgotCi1AY2luZGV4IEQzMFYgbm9wcwotQGl0ZW0gLW4KLVdhcm4gd2hlbiBub3BzIGFyZSBnZW5lcmF0ZWQuCi0KLUBjaW5kZXggRDMwViBub3BzIGFmdGVyIDMyLWJpdCBtdWx0aXBseQotQGl0ZW0gLU4KLVdhcm4gd2hlbiBhIG5vcCBhZnRlciBhIDMyLWJpdCBtdWx0aXBseSBpbnN0cnVjdGlvbiBpcyBnZW5lcmF0ZWQuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBJOTYwCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgdGhlCi1JbnRlbCA4MDk2MCBwcm9jZXNzb3IuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUFDQSB8IC1BQ0FfQSB8IC1BQ0IgfCAtQUNDIHwgLUFLQSB8IC1BS0IgfCAtQUtDIHwgLUFNQwotU3BlY2lmeSB3aGljaCB2YXJpYW50IG9mIHRoZSA5NjAgYXJjaGl0ZWN0dXJlIGlzIHRoZSB0YXJnZXQuCi0KLUBpdGVtIC1iCi1BZGQgY29kZSB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQgYnJhbmNoZXMgdGFrZW4uCi0KLUBpdGVtIC1uby1yZWxheAotRG8gbm90IGFsdGVyIGNvbXBhcmUtYW5kLWJyYW5jaCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50czsKLWVycm9yIGlmIG5lY2Vzc2FyeS4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi0KLUBpZnNldCBNNjgwWDAKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciB0aGUKLU1vdG9yb2xhIDY4MDAwIHNlcmllcy4KLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1sCi1TaG9ydGVuIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkIHN5bWJvbHMsIHRvIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvLgotCi1AaXRlbSAtbTY4MDAwIHwgLW02ODAwOCB8IC1tNjgwMTAgfCAtbTY4MDIwIHwgLW02ODAzMCB8IC1tNjgwNDAgfCAtbTY4MDYwCi1AaXRlbXggfCAtbTY4MzAyIHwgLW02ODMzMSB8IC1tNjgzMzIgfCAtbTY4MzMzIHwgLW02ODM0MCB8IC1tY3B1MzIgfCAtbTUyMDAKLVNwZWNpZnkgd2hhdCBwcm9jZXNzb3IgaW4gdGhlIDY4MDAwIGZhbWlseSBpcyB0aGUgdGFyZ2V0LiAgVGhlIGRlZmF1bHQKLWlzIG5vcm1hbGx5IHRoZSA2ODAyMCwgYnV0IHRoaXMgY2FuIGJlIGNoYW5nZWQgYXQgY29uZmlndXJhdGlvbiB0aW1lLgotCi1AaXRlbSAtbTY4ODgxIHwgLW02ODg4MiB8IC1tbm8tNjg4ODEgfCAtbW5vLTY4ODgyCi1UaGUgdGFyZ2V0IG1hY2hpbmUgZG9lcyAob3IgZG9lcyBub3QpIGhhdmUgYSBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3Nvci4KLVRoZSBkZWZhdWx0IGlzIHRvIGFzc3VtZSBhIGNvcHJvY2Vzc29yIGZvciA2ODAyMCwgNjgwMzAsIGFuZCBjcHUzMi4gIEFsdGhvdWdoCi10aGUgYmFzaWMgNjgwMDAgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgNjg4ODEsIGEgY29tYmluYXRpb24gb2YgdGhlCi10d28gY2FuIGJlIHNwZWNpZmllZCwgc2luY2UgaXQncyBwb3NzaWJsZSB0byBkbyBlbXVsYXRpb24gb2YgdGhlCi1jb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgbWFpbiBwcm9jZXNzb3IuCi0KLUBpdGVtIC1tNjg4NTEgfCAtbW5vLTY4ODUxCi1UaGUgdGFyZ2V0IG1hY2hpbmUgZG9lcyAob3IgZG9lcyBub3QpIGhhdmUgYSBtZW1vcnktbWFuYWdlbWVudAotdW5pdCBjb3Byb2Nlc3Nvci4gIFRoZSBkZWZhdWx0IGlzIHRvIGFzc3VtZSBhbiBNTVUgZm9yIDY4MDIwIGFuZCB1cC4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgUEoKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYSBwaWNvSmF2YSBwcm9jZXNzb3IuCi0KLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IFBKIGVuZGlhbm5lc3MKLUBjaW5kZXggZW5kaWFubmVzcywgUEoKLUBjaW5kZXggYmlnIGVuZGlhbiBvdXRwdXQsIFBKCi1AaXRlbSAtbWIKLUdlbmVyYXRlIGBgYmlnIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBjaW5kZXggbGl0dGxlIGVuZGlhbiBvdXRwdXQsIFBKCi1AaXRlbSAtbWwKLUdlbmVyYXRlIGBgbGl0dGxlIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotCi1AaWZzZXQgU1BBUkMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZAotZm9yIHRoZSBTUEFSQyBhcmNoaXRlY3R1cmU6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUF2NiB8IC1BdjcgfCAtQXY4IHwgLUFzcGFyY2xldCB8IC1Bc3BhcmNsaXRlCi1AaXRlbXggLUF2OHBsdXMgfCAtQXY4cGx1c2EgfCAtQXY5IHwgLUF2OWEKLUV4cGxpY2l0bHkgc2VsZWN0IGEgdmFyaWFudCBvZiB0aGUgU1BBUkMgYXJjaGl0ZWN0dXJlLgotCi1Ac2FtcHstQXY4cGx1c30gYW5kIEBzYW1wey1BdjhwbHVzYX0gc2VsZWN0IGEgMzIgYml0IGVudmlyb25tZW50LgotQHNhbXB7LUF2OX0gYW5kIEBzYW1wey1BdjlhfSBzZWxlY3QgYSA2NCBiaXQgZW52aXJvbm1lbnQuCi0KLUBzYW1wey1BdjhwbHVzYX0gYW5kIEBzYW1wey1BdjlhfSBlbmFibGUgdGhlIFNQQVJDIFY5IGluc3RydWN0aW9uIHNldCB3aXRoCi1VbHRyYVNQQVJDIGV4dGVuc2lvbnMuCi0KLUBpdGVtIC14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyB2OSBhc3NlbWJsZXIuICBUaGVzZSBvcHRpb25zIGFyZQotZXF1aXZhbGVudCB0byAtQXY4cGx1cyBhbmQgLUF2OHBsdXNhLCByZXNwZWN0aXZlbHkuCi0KLUBpdGVtIC1idW1wCi1XYXJuIHdoZW4gdGhlIGFzc2VtYmxlciBzd2l0Y2hlcyB0byBhbm90aGVyIGFyY2hpdGVjdHVyZS4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IE1JUFMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYSBNSVBTIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtRyBAdmFye251bX0KLVRoaXMgb3B0aW9uIHNldHMgdGhlIGxhcmdlc3Qgc2l6ZSBvZiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZAotaW1wbGljaXRseSB3aXRoIHRoZSBAY29kZXtncH0gcmVnaXN0ZXIuICBJdCBpcyBvbmx5IGFjY2VwdGVkIGZvciB0YXJnZXRzIHRoYXQKLXVzZSBFQ09GRiBmb3JtYXQsIHN1Y2ggYXMgYSBERUNzdGF0aW9uIHJ1bm5pbmcgVWx0cml4LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4KLQotQGNpbmRleCBNSVBTIGVuZGlhbm5lc3MKLUBjaW5kZXggZW5kaWFubmVzcywgTUlQUwotQGNpbmRleCBiaWcgZW5kaWFuIG91dHB1dCwgTUlQUwotQGl0ZW0gLUVCCi1HZW5lcmF0ZSBgYGJpZyBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AY2luZGV4IGxpdHRsZSBlbmRpYW4gb3V0cHV0LCBNSVBTCi1AaXRlbSAtRUwKLUdlbmVyYXRlIGBgbGl0dGxlIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBjaW5kZXggTUlQUyBJU0EKLUBpdGVtIC1taXBzMQotQGl0ZW14IC1taXBzMgotQGl0ZW14IC1taXBzMwotR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbC4KLUBzYW1wey1taXBzMX0gY29ycmVzcG9uZHMgdG8gdGhlIEBzY3tyMjAwMH0gYW5kIEBzY3tyMzAwMH0gcHJvY2Vzc29ycywKLUBzYW1wey1taXBzMn0gdG8gdGhlIEBzY3tyNjAwMH0gcHJvY2Vzc29yLCBhbmQgQHNhbXB7LW1pcHMzfSB0byB0aGUgQHNje3I0MDAwfQotcHJvY2Vzc29yLgotCi1AaXRlbSAtbTQ2NTAKLUBpdGVteCAtbm8tbTQ2NTAKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTIEBzY3tyNDY1MH0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQKLXRoZSBAc2FtcHttYWR9IGFuZCBAc2FtcHttYWR1fSBpbnN0cnVjdGlvbiwgYW5kIHRvIG5vdCBzY2hlZHVsZSBAc2FtcHtub3B9Ci1pbnN0cnVjdGlvbnMgYXJvdW5kIGFjY2Vzc2VzIHRvIHRoZSBAc2FtcHtISX0gYW5kIEBzYW1we0xPfSByZWdpc3RlcnMuCi1Ac2FtcHstbm8tbTQ2NTB9IHR1cm5zIG9mZiB0aGlzIG9wdGlvbi4KLQotQGl0ZW0gLW1jcHU9QHZhcntDUFV9Ci1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBjcHUuICBUaGlzIGhhcyBsaXR0bGUgZWZmZWN0IG9uIHRoZQotYXNzZW1ibGVyLCBidXQgaXQgaXMgcGFzc2VkIGJ5IEBjb2Rle0B2YWx1ZXtHQ0N9fS4KLQotQGNpbmRleCBlbXVsYXRpb24KLUBpdGVtIC0tZW11bGF0aW9uPUB2YXJ7bmFtZX0KLVRoaXMgb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byBlbXVsYXRlIEBjb2Rle0B2YWx1ZXtBU319IGNvbmZpZ3VyZWQKLWZvciBzb21lIG90aGVyIHRhcmdldCwgaW4gYWxsIHJlc3BlY3RzLCBpbmNsdWRpbmcgb3V0cHV0IGZvcm1hdCAoY2hvb3NpbmcKLWJldHdlZW4gRUxGIGFuZCBFQ09GRiBvbmx5KSwgaGFuZGxpbmcgb2YgcHNldWRvLW9wY29kZXMgd2hpY2ggbWF5IGdlbmVyYXRlCi1kZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3Igc3RvcmUgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uLCBhbmQgZGVmYXVsdAotZW5kaWFubmVzcy4gIFRoZSBhdmFpbGFibGUgY29uZmlndXJhdGlvbiBuYW1lcyBhcmU6IEBzYW1we21pcHNlY29mZn0sCi1Ac2FtcHttaXBzZWxmfSwgQHNhbXB7bWlwc2xlY29mZn0sIEBzYW1we21pcHNiZWNvZmZ9LCBAc2FtcHttaXBzbGVsZn0sCi1Ac2FtcHttaXBzYmVsZn0uICBUaGUgZmlyc3QgdHdvIGRvIG5vdCBhbHRlciB0aGUgZGVmYXVsdCBlbmRpYW5uZXNzIGZyb20gdGhhdAotb2YgdGhlIHByaW1hcnkgdGFyZ2V0IGZvciB3aGljaCB0aGUgYXNzZW1ibGVyIHdhcyBjb25maWd1cmVkOyB0aGUgb3RoZXJzIGNoYW5nZQotdGhlIGRlZmF1bHQgdG8gbGl0dGxlLSBvciBiaWctZW5kaWFuIGFzIGluZGljYXRlZCBieSB0aGUgQHNhbXB7Yn0gb3IgQHNhbXB7bH0KLWluIHRoZSBuYW1lLiAgVXNpbmcgQHNhbXB7LUVCfSBvciBAc2FtcHstRUx9IHdpbGwgb3ZlcnJpZGUgdGhlIGVuZGlhbm5lc3MKLXNlbGVjdGlvbiBpbiBhbnkgY2FzZS4KLQotVGhpcyBvcHRpb24gaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IHdoZW4gdGhlIHByaW1hcnkgdGFyZ2V0Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciBpcyBhIE1JUFMgRUxGIG9yIEVDT0ZGIHRhcmdldC4KLUZ1cnRoZXJtb3JlLCB0aGUgcHJpbWFyeSB0YXJnZXQgb3Igb3RoZXJzIHNwZWNpZmllZCB3aXRoCi1Ac2FtcHstLWVuYWJsZS10YXJnZXRzPUBkb3Rze319IGF0IGNvbmZpZ3VyYXRpb24gdGltZSBtdXN0IGluY2x1ZGUgc3VwcG9ydCBmb3IKLXRoZSBvdGhlciBmb3JtYXQsIGlmIGJvdGggYXJlIHRvIGJlIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlLCB0aGUgSXJpeCA1Ci1jb25maWd1cmF0aW9uIGluY2x1ZGVzIHN1cHBvcnQgZm9yIGJvdGguCi0KLUV2ZW50dWFsbHksIHRoaXMgb3B0aW9uIHdpbGwgc3VwcG9ydCBtb3JlIGNvbmZpZ3VyYXRpb25zLCB3aXRoIG1vcmUKLWZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIGFzc2VtYmxlcidzIGJlaGF2aW9yLCBhbmQgd2lsbCBiZSBzdXBwb3J0ZWQgZm9yCi1tb3JlIHByb2Nlc3NvcnMuCi0KLUBpdGVtIC1ub2NwcAotQGNvZGV7QHZhbHVle0FTfX0gaWdub3JlcyB0aGlzIG9wdGlvbi4gIEl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLXRoZSBuYXRpdmUgdG9vbHMuCi0KLUBuZWVkIDkwMAotQGl0ZW0gLS10cmFwCi1AaXRlbXggLS1uby10cmFwCi1AaXRlbXggLS1icmVhawotQGl0ZW14IC0tbm8tYnJlYWsKLUNvbnRyb2wgaG93IHRvIGRlYWwgd2l0aCBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBhbmQgZGl2aXNpb24gYnkgemVyby4KLUBzYW1wey0tdHJhcH0gb3IgQHNhbXB7LS1uby1icmVha30gKHdoaWNoIGFyZSBzeW5vbnltcykgdGFrZSBhIHRyYXAgZXhjZXB0aW9uCi0oYW5kIG9ubHkgd29yayBmb3IgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbCAyIGFuZCBoaWdoZXIpOwotQHNhbXB7LS1icmVha30gb3IgQHNhbXB7LS1uby10cmFwfSAoYWxzbyBzeW5vbnltcywgYW5kIHRoZSBkZWZhdWx0KSB0YWtlIGEKLWJyZWFrIGV4Y2VwdGlvbi4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IE1DT1JFCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKLWFuIE1Db3JlIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtanNyaTJic3IKLUBpdGVteCAtbm9qc3JpMmJzcgotRW5hYmxlIG9yIGRpc2FibGUgdGhlIEpTUkkgdG8gQlNSIHRyYW5zZm9ybWF0aW9uLiAgQnkgZGVmYXVsdCB0aGlzIGlzIGVuYWJsZWQuCi1UaGUgY29tbWFuZCBsaW5lIG9wdGlvbiBAc2FtcHstbm9qc3JpMmJzcn0gY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBpdC4KLQotQGl0ZW0gLXNpZmlsdGVyCi1AaXRlbXggLW5vc2lmaWx0ZXIKLUVuYWJsZSBvciBkaXNhYmxlIHRoZSBzaWxpY29uIGZpbHRlciBiZWhhdmlvdXIuICBCeSBkZWZhdWx0IHRoaXMgaXMgZGlzYWJsZWQuCi1UaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcmlkZGVuIGJ5IHRoZSBAc2FtcHstc2lmaWx0ZXJ9IGNvbW1hbmQgbGluZSBvcHRpb24uCi0KLUBpdGVtIC1yZWxheAotQWx0ZXIganVtcCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50cy4KLQotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBtZW51Ci0qIE1hbnVhbDo6ICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBvZiB0aGlzIE1hbnVhbAotKiBHTlUgQXNzZW1ibGVyOjogICAgICAgICAgICAgICBUaGUgR05VIEFzc2VtYmxlcgotKiBPYmplY3QgRm9ybWF0czo6ICAgICAgICAgICAgICBPYmplY3QgRmlsZSBGb3JtYXRzCi0qIENvbW1hbmQgTGluZTo6ICAgICAgICAgICAgICAgIENvbW1hbmQgTGluZQotKiBJbnB1dCBGaWxlczo6ICAgICAgICAgICAgICAgICBJbnB1dCBGaWxlcwotKiBPYmplY3Q6OiAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgKE9iamVjdCkgRmlsZQotKiBFcnJvcnM6OiAgICAgICAgICAgICAgICAgICAgICBFcnJvciBhbmQgV2FybmluZyBNZXNzYWdlcwotQGVuZCBtZW51Ci0KLUBub2RlIE1hbnVhbAotQHNlY3Rpb24gU3RydWN0dXJlIG9mIHRoaXMgTWFudWFsCi0KLUBjaW5kZXggbWFudWFsLCBzdHJ1Y3R1cmUgYW5kIHB1cnBvc2UKLVRoaXMgbWFudWFsIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHdoYXQgeW91IG5lZWQgdG8ga25vdyB0byB1c2UKLUBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319LiAgV2UgY292ZXIgdGhlIHN5bnRheCBleHBlY3RlZCBpbiBzb3VyY2UgZmlsZXMsIGluY2x1ZGluZwotbm90YXRpb24gZm9yIHN5bWJvbHMsIGNvbnN0YW50cywgYW5kIGV4cHJlc3Npb25zOyB0aGUgZGlyZWN0aXZlcyB0aGF0Ci1AY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kczsgYW5kIG9mIGNvdXJzZSBob3cgdG8gaW52b2tlIEBjb2Rle0B2YWx1ZXtBU319LgotCi1AaWZjbGVhciBHRU5FUklDCi1XZSBhbHNvIGNvdmVyIHNwZWNpYWwgZmVhdHVyZXMgaW4gdGhlIEB2YWx1ZXtUQVJHRVR9Ci1jb25maWd1cmF0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319LCBpbmNsdWRpbmcgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi1UaGlzIG1hbnVhbCBhbHNvIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBmZWF0dXJlcyBvZgotdmFyaW91cyBmbGF2b3JzIG9mIHRoZSBhc3NlbWJsZXIuCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggbWFjaGluZSBpbnN0cnVjdGlvbnMgKG5vdCBjb3ZlcmVkKQotT24gdGhlIG90aGVyIGhhbmQsIHRoaXMgbWFudWFsIGlzIEBlbXBoe25vdH0gaW50ZW5kZWQgYXMgYW4gaW50cm9kdWN0aW9uCi10byBwcm9ncmFtbWluZyBpbiBhc3NlbWJseSBsYW5ndWFnZS0tLWxldCBhbG9uZSBwcm9ncmFtbWluZyBpbiBnZW5lcmFsIQotSW4gYSBzaW1pbGFyIHZlaW4sIHdlIG1ha2Ugbm8gYXR0ZW1wdCB0byBpbnRyb2R1Y2UgdGhlIG1hY2hpbmUKLWFyY2hpdGVjdHVyZTsgd2UgZG8gQGVtcGh7bm90fSBkZXNjcmliZSB0aGUgaW5zdHJ1Y3Rpb24gc2V0LCBzdGFuZGFyZAotbW5lbW9uaWNzLCByZWdpc3RlcnMgb3IgYWRkcmVzc2luZyBtb2RlcyB0aGF0IGFyZSBzdGFuZGFyZCB0byBhCi1wYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZS4KLUBpZnNldCBHRU5FUklDCi1Zb3UgbWF5IHdhbnQgdG8gY29uc3VsdCB0aGUgbWFudWZhY3R1cmVyJ3MKLW1hY2hpbmUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOC8zMDAKLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgSDgvMzAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7SDgvMzAwCi1TZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSBBREUtLTYwMi0tMDI1KS4gIEZvciB0aGUgSDgvMzAwSCwKLXNlZSBAY2l0ZXtIOC8zMDBIIFNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgSDgvNTAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7SDgvNTAwCi1TZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSBNMjFUMDAxKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBTSAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBIaXRhY2hpIFNIIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle1NILU1pY3JvY29tcHV0ZXIgVXNlcidzIE1hbnVhbH0gKEhpdGFjaGkgTWljcm8gU3lzdGVtcywgSW5jLikuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgWjgwMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtaODAwMCBDUFUgVGVjaG5pY2FsIE1hbnVhbH0KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1AYyBJIHRoaW5rIHRoaXMgaXMgcHJlbWF0dXJlLS0tZG9jQGN5Z251cy5jb20sIDE3amFuMTk5MQotQGlnbm9yZQotVGhyb3VnaG91dCB0aGlzIG1hbnVhbCwgd2UgYXNzdW1lIHRoYXQgeW91IGFyZSBydW5uaW5nIEBkZm57R05VfSwKLXRoZSBwb3J0YWJsZSBvcGVyYXRpbmcgc3lzdGVtIGZyb20gdGhlIEBkZm57RnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLn0uICBUaGlzIHJlc3RyaWN0cyBvdXIgYXR0ZW50aW9uIHRvIGNlcnRhaW4ga2luZHMgb2YKLWNvbXB1dGVyIChpbiBwYXJ0aWN1bGFyLCB0aGUga2luZHMgb2YgY29tcHV0ZXJzIHRoYXQgQHNje2dudX0gY2FuIHJ1biBvbik7Ci1vbmNlIHRoaXMgYXNzdW1wdGlvbiBpcyBncmFudGVkIGV4YW1wbGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkIGxlc3MKLXF1YWxpZmljYXRpb24uCi0KLUBjb2Rle0B2YWx1ZXtBU319IGlzIHBhcnQgb2YgYSB0ZWFtIG9mIHByb2dyYW1zIHRoYXQgdHVybiBhIGhpZ2gtbGV2ZWwKLWh1bWFuLXJlYWRhYmxlIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMgaW50byBhIGxvdy1sZXZlbAotY29tcHV0ZXItcmVhZGFibGUgc2VyaWVzIG9mIGluc3RydWN0aW9ucy4gIERpZmZlcmVudCB2ZXJzaW9ucyBvZgotQGNvZGV7QHZhbHVle0FTfX0gYXJlIHVzZWQgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBjb21wdXRlci4KLUBlbmQgaWdub3JlCi0KLUBjIFRoZXJlIHVzZWQgdG8gYmUgYSBzZWN0aW9uICJUZXJtaW5vbG9neSIgaGVyZSwgd2hpY2ggZGVmaW5lZAotQGMgImNvbnRlbnRzIiwgImJ5dGUiLCAid29yZCIsIGFuZCAibG9uZyIuICBEZWZpbmluZyAid29yZCIgdG8gYW55Ci1AYyBwYXJ0aWN1bGFyIHNpemUgaXMgY29uZnVzaW5nIHdoZW4gdGhlIC53b3JkIGRpcmVjdGl2ZSBtYXkgZ2VuZXJhdGUgMTYKLUBjIGJpdHMgb24gb25lIG1hY2hpbmUgYW5kIDMyIGJpdHMgb24gYW5vdGhlcjsgaW4gZ2VuZXJhbCwgZm9yIHRoZSB1c2VyCi1AYyB2ZXJzaW9uIG9mIHRoaXMgbWFudWFsLCBub25lIG9mIHRoZXNlIHRlcm1zIHNlZW0gZXNzZW50aWFsIHRvIGRlZmluZS4KLUBjIFRoZXkgd2VyZSB1c2VkIHZlcnkgbGl0dGxlIGV2ZW4gaW4gdGhlIGZvcm1lciBkcmFmdCBvZiB0aGUgbWFudWFsOwotQGMgdGhpcyBkcmFmdCBtYWtlcyBhbiBlZmZvcnQgdG8gYXZvaWQgdGhlbSAoZXhjZXB0IGluIG5hbWVzIG9mCi1AYyBkaXJlY3RpdmVzKS4KLQotQG5vZGUgR05VIEFzc2VtYmxlcgotQHNlY3Rpb24gVGhlIEdOVSBBc3NlbWJsZXIKLQotQHNje2dudX0gQGNvZGV7YXN9IGlzIHJlYWxseSBhIGZhbWlseSBvZiBhc3NlbWJsZXJzLgotQGlmY2xlYXIgR0VORVJJQwotVGhpcyBtYW51YWwgZGVzY3JpYmVzIEBjb2Rle0B2YWx1ZXtBU319LCBhIG1lbWJlciBvZiB0aGF0IGZhbWlseSB3aGljaCBpcwotY29uZmlndXJlZCBmb3IgdGhlIEB2YWx1ZXtUQVJHRVR9IGFyY2hpdGVjdHVyZXMuCi1AZW5kIGlmY2xlYXIKLUlmIHlvdSB1c2UgKG9yIGhhdmUgdXNlZCkgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBvbiBvbmUgYXJjaGl0ZWN0dXJlLCB5b3UKLXNob3VsZCBmaW5kIGEgZmFpcmx5IHNpbWlsYXIgZW52aXJvbm1lbnQgd2hlbiB5b3UgdXNlIGl0IG9uIGFub3RoZXIKLWFyY2hpdGVjdHVyZS4gIEVhY2ggdmVyc2lvbiBoYXMgbXVjaCBpbiBjb21tb24gd2l0aCB0aGUgb3RoZXJzLAotaW5jbHVkaW5nIG9iamVjdCBmaWxlIGZvcm1hdHMsIG1vc3QgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgKG9mdGVuIGNhbGxlZAotQGRmbntwc2V1ZG8tb3BzfSkgYW5kIGFzc2VtYmxlciBzeW50YXguQHJlZmlsbAotCi1AY2luZGV4IHB1cnBvc2Ugb2YgQHNje2dudX0gYXNzZW1ibGVyCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYXNzZW1ibGUgdGhlIG91dHB1dCBvZiB0aGUKLUBzY3tnbnV9IEMgY29tcGlsZXIgQGNvZGV7QHZhbHVle0dDQ319IGZvciB1c2UgYnkgdGhlIGxpbmtlcgotQGNvZGV7QHZhbHVle0xEfX0uICBOZXZlcnRoZWxlc3MsIHdlJ3ZlIHRyaWVkIHRvIG1ha2UgQGNvZGV7QHZhbHVle0FTfX0KLWFzc2VtYmxlIGNvcnJlY3RseSBldmVyeXRoaW5nIHRoYXQgb3RoZXIgYXNzZW1ibGVycyBmb3IgdGhlIHNhbWUKLW1hY2hpbmUgd291bGQgYXNzZW1ibGUuCi1AaWZzZXQgVkFYCi1BbnkgZXhjZXB0aW9ucyBhcmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5IChAcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9KS4KLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLUBjIFRoaXMgcmVtYXJrIHNob3VsZCBhcHBlYXIgaW4gZ2VuZXJpYyB2ZXJzaW9uIG9mIG1hbnVhbDsgYXNzdW1wdGlvbgotQGMgaGVyZSBpcyB0aGF0IGdlbmVyaWMgdmVyc2lvbiBzZXRzIE02ODB4MC4KLVRoaXMgZG9lc24ndCBtZWFuIEBjb2Rle0B2YWx1ZXtBU319IGFsd2F5cyB1c2VzIHRoZSBzYW1lIHN5bnRheCBhcyBhbm90aGVyCi1hc3NlbWJsZXIgZm9yIHRoZSBzYW1lIGFyY2hpdGVjdHVyZTsgZm9yIGV4YW1wbGUsIHdlIGtub3cgb2Ygc2V2ZXJhbAotaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIDY4MHgwIGFzc2VtYmx5IGxhbmd1YWdlIHN5bnRheC4KLUBlbmQgaWZzZXQKLQotVW5saWtlIG9sZGVyIGFzc2VtYmxlcnMsIEBjb2Rle0B2YWx1ZXtBU319IGlzIGRlc2lnbmVkIHRvIGFzc2VtYmxlIGEgc291cmNlCi1wcm9ncmFtIGluIG9uZSBwYXNzIG9mIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgaGFzIGEgc3VidGxlIGltcGFjdCBvbiB0aGUKLUBrYmR7Lm9yZ30gZGlyZWN0aXZlIChAcHhyZWZ7T3JnLCxAY29kZXsub3JnfX0pLgotCi1Abm9kZSBPYmplY3QgRm9ybWF0cwotQHNlY3Rpb24gT2JqZWN0IEZpbGUgRm9ybWF0cwotCi1AY2luZGV4IG9iamVjdCBmaWxlIGZvcm1hdAotVGhlIEBzY3tnbnV9IGFzc2VtYmxlciBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIHNldmVyYWwgYWx0ZXJuYXRpdmUKLW9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgdGhlIG1vc3QgcGFydCwgdGhpcyBkb2VzIG5vdCBhZmZlY3QgaG93IHlvdQotd3JpdGUgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbXM7IGJ1dCBkaXJlY3RpdmVzIGZvciBkZWJ1Z2dpbmcgc3ltYm9scwotYXJlIHR5cGljYWxseSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGZpbGUgZm9ybWF0cy4gIEB4cmVme1N5bWJvbAotQXR0cmlidXRlcywsU3ltYm9sIEF0dHJpYnV0ZXN9LgotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgTVVMVEktT0JKCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZQotQHZhbHVle09CSi1OQU1FfSBmb3JtYXQgb2JqZWN0IGZpbGVzLgotQGVuZCBpZmNsZWFyCi1AYyBUaGUgZm9sbG93aW5nIHNob3VsZCBleGhhdXN0IGFsbCBjb25maWdzIHRoYXQgc2V0IE1VTFRJLU9CSiwgaWRlYWxseQotQGlmc2V0IEEyOUsKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBlaXRoZXIKLUBjb2Rle2Eub3V0fSBvciBDT0ZGIGZvcm1hdCBvYmplY3QgZmlsZXMuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGVpdGhlcgotQGNvZGV7Yi5vdXR9IG9yIENPRkYgZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2UgZWl0aGVyCi1TT00gb3IgRUxGIGZvcm1hdCBvYmplY3QgZmlsZXMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgQ29tbWFuZCBMaW5lCi1Ac2VjdGlvbiBDb21tYW5kIExpbmUKLQotQGNpbmRleCBjb21tYW5kIGxpbmUgY29udmVudGlvbnMKLUFmdGVyIHRoZSBwcm9ncmFtIG5hbWUgQGNvZGV7QHZhbHVle0FTfX0sIHRoZSBjb21tYW5kIGxpbmUgbWF5IGNvbnRhaW4KLW9wdGlvbnMgYW5kIGZpbGUgbmFtZXMuICBPcHRpb25zIG1heSBhcHBlYXIgaW4gYW55IG9yZGVyLCBhbmQgbWF5IGJlCi1iZWZvcmUsIGFmdGVyLCBvciBiZXR3ZWVuIGZpbGUgbmFtZXMuICBUaGUgb3JkZXIgb2YgZmlsZSBuYW1lcyBpcwotc2lnbmlmaWNhbnQuCi0KLUBjaW5kZXggc3RhbmRhcmQgaW5wdXQsIGFzIGlucHV0IGZpbGUKLUBraW5kZXggLS0KLUBmaWxley0tfSAodHdvIGh5cGhlbnMpIGJ5IGl0c2VsZiBuYW1lcyB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotZXhwbGljaXRseSwgYXMgb25lIG9mIHRoZSBmaWxlcyBmb3IgQGNvZGV7QHZhbHVle0FTfX0gdG8gYXNzZW1ibGUuCi0KLUBjaW5kZXggb3B0aW9ucywgY29tbWFuZCBsaW5lCi1FeGNlcHQgZm9yIEBzYW1wey0tfSBhbnkgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRoYXQgYmVnaW5zIHdpdGggYQotaHlwaGVuIChAc2FtcHstfSkgaXMgYW4gb3B0aW9uLiAgRWFjaCBvcHRpb24gY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YKLUBjb2Rle0B2YWx1ZXtBU319LiAgTm8gb3B0aW9uIGNoYW5nZXMgdGhlIHdheSBhbm90aGVyIG9wdGlvbiB3b3Jrcy4gIEFuCi1vcHRpb24gaXMgYSBAc2FtcHstfSBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBsZXR0ZXJzOyB0aGUgY2FzZSBvZgotdGhlIGxldHRlciBpcyBpbXBvcnRhbnQuICAgQWxsIG9wdGlvbnMgYXJlIG9wdGlvbmFsLgotCi1Tb21lIG9wdGlvbnMgZXhwZWN0IGV4YWN0bHkgb25lIGZpbGUgbmFtZSB0byBmb2xsb3cgdGhlbS4gIFRoZSBmaWxlCi1uYW1lIG1heSBlaXRoZXIgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBvcHRpb24ncyBsZXR0ZXIgKGNvbXBhdGlibGUKLXdpdGggb2xkZXIgYXNzZW1ibGVycykgb3IgaXQgbWF5IGJlIHRoZSBuZXh0IGNvbW1hbmQgYXJndW1lbnQgKEBzY3tnbnV9Ci1zdGFuZGFyZCkuICBUaGVzZSB0d28gY29tbWFuZCBsaW5lcyBhcmUgZXF1aXZhbGVudDoKLQotQHNtYWxsZXhhbXBsZQotQHZhbHVle0FTfSAtbyBteS1vYmplY3QtZmlsZS5vIG11bWJsZS5zCi1AdmFsdWV7QVN9IC1vbXktb2JqZWN0LWZpbGUubyBtdW1ibGUucwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgSW5wdXQgRmlsZXMKLUBzZWN0aW9uIElucHV0IEZpbGVzCi0KLUBjaW5kZXggaW5wdXQKLUBjaW5kZXggc291cmNlIHByb2dyYW0KLUBjaW5kZXggZmlsZXMsIGlucHV0Ci1XZSB1c2UgdGhlIHBocmFzZSBAZGZue3NvdXJjZSBwcm9ncmFtfSwgYWJicmV2aWF0ZWQgQGRmbntzb3VyY2V9LCB0bwotZGVzY3JpYmUgdGhlIHByb2dyYW0gaW5wdXQgdG8gb25lIHJ1biBvZiBAY29kZXtAdmFsdWV7QVN9fS4gIFRoZSBwcm9ncmFtIG1heQotYmUgaW4gb25lIG9yIG1vcmUgZmlsZXM7IGhvdyB0aGUgc291cmNlIGlzIHBhcnRpdGlvbmVkIGludG8gZmlsZXMKLWRvZXNuJ3QgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBzb3VyY2UuCi0KLUBjIEkgYWRkZWQgImNvbiIgcHJlZml4IHRvICJjYXRlbmF0aW9uIiBqdXN0IHRvIHByb3ZlIEkgY2FuIG92ZXJjb21lIG15Ci1AYyBBUEwgdHJhaW5pbmcuLi4gICBkb2NAY3lnbnVzLmNvbQotVGhlIHNvdXJjZSBwcm9ncmFtIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdGV4dCBpbiBhbGwgdGhlIGZpbGVzLCBpbiB0aGUKLW9yZGVyIHNwZWNpZmllZC4KLQotRWFjaCB0aW1lIHlvdSBydW4gQGNvZGV7QHZhbHVle0FTfX0gaXQgYXNzZW1ibGVzIGV4YWN0bHkgb25lIHNvdXJjZQotcHJvZ3JhbS4gIFRoZSBzb3VyY2UgcHJvZ3JhbSBpcyBtYWRlIHVwIG9mIG9uZSBvciBtb3JlIGZpbGVzLgotKFRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhbHNvIGEgZmlsZS4pCi0KLVlvdSBnaXZlIEBjb2Rle0B2YWx1ZXtBU319IGEgY29tbWFuZCBsaW5lIHRoYXQgaGFzIHplcm8gb3IgbW9yZSBpbnB1dCBmaWxlCi1uYW1lcy4gIFRoZSBpbnB1dCBmaWxlcyBhcmUgcmVhZCAoZnJvbSBsZWZ0IGZpbGUgbmFtZSB0byByaWdodCkuICBBCi1jb21tYW5kIGxpbmUgYXJndW1lbnQgKGluIGFueSBwb3NpdGlvbikgdGhhdCBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nCi1pcyB0YWtlbiB0byBiZSBhbiBpbnB1dCBmaWxlIG5hbWUuCi0KLUlmIHlvdSBnaXZlIEBjb2Rle0B2YWx1ZXtBU319IG5vIGZpbGUgbmFtZXMgaXQgYXR0ZW1wdHMgdG8gcmVhZCBvbmUgaW5wdXQgZmlsZQotZnJvbSB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc3RhbmRhcmQgaW5wdXQsIHdoaWNoIGlzIG5vcm1hbGx5IHlvdXIgdGVybWluYWwuICBZb3UKLW1heSBoYXZlIHRvIHR5cGUgQGtleXtjdGwtRH0gdG8gdGVsbCBAY29kZXtAdmFsdWV7QVN9fSB0aGVyZSBpcyBubyBtb3JlIHByb2dyYW0KLXRvIGFzc2VtYmxlLgotCi1Vc2UgQHNhbXB7LS19IGlmIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgbmFtZSB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotaW4geW91ciBjb21tYW5kIGxpbmUuCi0KLUlmIHRoZSBzb3VyY2UgaXMgZW1wdHksIEBjb2Rle0B2YWx1ZXtBU319IHByb2R1Y2VzIGEgc21hbGwsIGVtcHR5IG9iamVjdAotZmlsZS4KLQotQHN1YmhlYWRpbmcgRmlsZW5hbWVzIGFuZCBMaW5lLW51bWJlcnMKLQotQGNpbmRleCBpbnB1dCBmaWxlIGxpbmVudW1iZXJzCi1AY2luZGV4IGxpbmUgbnVtYmVycywgaW4gaW5wdXQgZmlsZXMKLVRoZXJlIGFyZSB0d28gd2F5cyBvZiBsb2NhdGluZyBhIGxpbmUgaW4gdGhlIGlucHV0IGZpbGUgKG9yIGZpbGVzKSBhbmQKLWVpdGhlciBtYXkgYmUgdXNlZCBpbiByZXBvcnRpbmcgZXJyb3IgbWVzc2FnZXMuICBPbmUgd2F5IHJlZmVycyB0byBhIGxpbmUKLW51bWJlciBpbiBhIHBoeXNpY2FsIGZpbGU7IHRoZSBvdGhlciByZWZlcnMgdG8gYSBsaW5lIG51bWJlciBpbiBhCi1gYGxvZ2ljYWwnJyBmaWxlLiAgQHhyZWZ7RXJyb3JzLCAsRXJyb3IgYW5kIFdhcm5pbmcgTWVzc2FnZXN9LgotCi1AZGZue1BoeXNpY2FsIGZpbGVzfSBhcmUgdGhvc2UgZmlsZXMgbmFtZWQgaW4gdGhlIGNvbW1hbmQgbGluZSBnaXZlbgotdG8gQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBkZm57TG9naWNhbCBmaWxlc30gYXJlIHNpbXBseSBuYW1lcyBkZWNsYXJlZCBleHBsaWNpdGx5IGJ5IGFzc2VtYmxlcgotZGlyZWN0aXZlczsgdGhleSBiZWFyIG5vIHJlbGF0aW9uIHRvIHBoeXNpY2FsIGZpbGVzLiAgTG9naWNhbCBmaWxlIG5hbWVzIGhlbHAKLWVycm9yIG1lc3NhZ2VzIHJlZmxlY3QgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IHNvdXJjZQotaXMgaXRzZWxmIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgZmlsZXMuICBAY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUKLUBzYW1weyN9IGRpcmVjdGl2ZXMgZW1pdHRlZCBieSB0aGUgQGNvZGV7QHZhbHVle0dDQ319IHByZXByb2Nlc3Nvci4gIFNlZSBhbHNvCi1AcmVme0ZpbGUsLEBjb2Rley5maWxlfX0uCi0KLUBub2RlIE9iamVjdAotQHNlY3Rpb24gT3V0cHV0IChPYmplY3QpIEZpbGUKLQotQGNpbmRleCBvYmplY3QgZmlsZQotQGNpbmRleCBvdXRwdXQgZmlsZQotQGtpbmRleCBhLm91dAotQGtpbmRleCAubwotRXZlcnkgdGltZSB5b3UgcnVuIEBjb2Rle0B2YWx1ZXtBU319IGl0IHByb2R1Y2VzIGFuIG91dHB1dCBmaWxlLCB3aGljaCBpcwoteW91ciBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtIHRyYW5zbGF0ZWQgaW50byBudW1iZXJzLiAgVGhpcyBmaWxlCi1pcyB0aGUgb2JqZWN0IGZpbGUuICBJdHMgZGVmYXVsdCBuYW1lIGlzCi1AaWZjbGVhciBCT1VUCi1AY29kZXthLm91dH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBCT1VUCi1AaWZzZXQgR0VORVJJQwotQGNvZGV7YS5vdXR9LCBvciAKLUBlbmQgaWZzZXQKLUBjb2Rle2Iub3V0fSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBJbnRlbCA4MDk2MC4KLUBlbmQgaWZzZXQKLVlvdSBjYW4gZ2l2ZSBpdCBhbm90aGVyIG5hbWUgYnkgdXNpbmcgdGhlIEBjb2Rley1vfSBvcHRpb24uICBDb252ZW50aW9uYWxseSwKLW9iamVjdCBmaWxlIG5hbWVzIGVuZCB3aXRoIEBmaWxley5vfS4gIFRoZSBkZWZhdWx0IG5hbWUgaXMgdXNlZCBmb3IgaGlzdG9yaWNhbAotcmVhc29uczogb2xkZXIgYXNzZW1ibGVycyB3ZXJlIGNhcGFibGUgb2YgYXNzZW1ibGluZyBzZWxmLWNvbnRhaW5lZCBwcm9ncmFtcwotZGlyZWN0bHkgaW50byBhIHJ1bm5hYmxlIHByb2dyYW0uICAoRm9yIHNvbWUgZm9ybWF0cywgdGhpcyBpc24ndCBjdXJyZW50bHkKLXBvc3NpYmxlLCBidXQgaXQgY2FuIGJlIGRvbmUgZm9yIHRoZSBAY29kZXthLm91dH0gZm9ybWF0LikKLQotQGNpbmRleCBsaW5rZXIKLUBraW5kZXggbGQKLVRoZSBvYmplY3QgZmlsZSBpcyBtZWFudCBmb3IgaW5wdXQgdG8gdGhlIGxpbmtlciBAY29kZXtAdmFsdWV7TER9fS4gIEl0IGNvbnRhaW5zCi1hc3NlbWJsZWQgcHJvZ3JhbSBjb2RlLCBpbmZvcm1hdGlvbiB0byBoZWxwIEBjb2Rle0B2YWx1ZXtMRH19IGludGVncmF0ZQotdGhlIGFzc2VtYmxlZCBwcm9ncmFtIGludG8gYSBydW5uYWJsZSBmaWxlLCBhbmQgKG9wdGlvbmFsbHkpIHN5bWJvbGljCi1pbmZvcm1hdGlvbiBmb3IgdGhlIGRlYnVnZ2VyLgotCi1AYyBsaW5rIGFib3ZlIHRvIHNvbWUgaW5mbyBmaWxlKHMpIGxpa2UgdGhlIGRlc2NyaXB0aW9uIG9mIGEub3V0LgotQGMgZG9uJ3QgZm9yZ2V0IHRvIGRlc2NyaWJlIEBzY3tnbnV9IGluZm8gYXMgd2VsbCBhcyBVbml4IGxvc3NhZ2UuCi0KLUBub2RlIEVycm9ycwotQHNlY3Rpb24gRXJyb3IgYW5kIFdhcm5pbmcgTWVzc2FnZXMKLQotQGNpbmRleCBlcnJvciBtZXNzc2FnZXMKLUBjaW5kZXggd2FybmluZyBtZXNzYWdlcwotQGNpbmRleCBtZXNzYWdlcyBmcm9tIGFzc2VtYmxlcgotQGNvZGV7QHZhbHVle0FTfX0gbWF5IHdyaXRlIHdhcm5pbmdzIGFuZCBlcnJvciBtZXNzYWdlcyB0byB0aGUgc3RhbmRhcmQgZXJyb3IKLWZpbGUgKHVzdWFsbHkgeW91ciB0ZXJtaW5hbCkuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdoZW4gIGEgY29tcGlsZXIKLXJ1bnMgQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseS4gIFdhcm5pbmdzIHJlcG9ydCBhbiBhc3N1bXB0aW9uIG1hZGUgc28KLXRoYXQgQGNvZGV7QHZhbHVle0FTfX0gY291bGQga2VlcCBhc3NlbWJsaW5nIGEgZmxhd2VkIHByb2dyYW07IGVycm9ycyByZXBvcnQgYQotZ3JhdmUgcHJvYmxlbSB0aGF0IHN0b3BzIHRoZSBhc3NlbWJseS4KLQotQGNpbmRleCBmb3JtYXQgb2Ygd2FybmluZyBtZXNzYWdlcwotV2FybmluZyBtZXNzYWdlcyBoYXZlIHRoZSBmb3JtYXQKLQotQHNtYWxsZXhhbXBsZQotZmlsZV9uYW1lOkBie05OTn06V2FybmluZyBNZXNzYWdlIFRleHQKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotQGNpbmRleCBsaW5lIG51bWJlcnMsIGluIHdhcm5pbmdzL2Vycm9ycwotKHdoZXJlIEBie05OTn0gaXMgYSBsaW5lIG51bWJlcikuICBJZiBhIGxvZ2ljYWwgZmlsZSBuYW1lIGhhcyBiZWVuIGdpdmVuCi0oQHB4cmVme0ZpbGUsLEBjb2Rley5maWxlfX0pIGl0IGlzIHVzZWQgZm9yIHRoZSBmaWxlbmFtZSwgb3RoZXJ3aXNlIHRoZSBuYW1lIG9mCi10aGUgY3VycmVudCBpbnB1dCBmaWxlIGlzIHVzZWQuICBJZiBhIGxvZ2ljYWwgbGluZSBudW1iZXIgd2FzIGdpdmVuCi1AaWZzZXQgR0VORVJJQwotKEBweHJlZntMaW5lLCxAY29kZXsubGluZX19KQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgQTI5SwotKEBweHJlZntMaW5lLCxAY29kZXsubGluZX19KQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgQTI5SwotKEBweHJlZntMbiwsQGNvZGV7LmxufX0pCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLXRoZW4gaXQgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBwcmludGVkLAotb3RoZXJ3aXNlIHRoZSBhY3R1YWwgbGluZSBpbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBpcyBwcmludGVkLiAgVGhlCi1tZXNzYWdlIHRleHQgaXMgaW50ZW5kZWQgdG8gYmUgc2VsZiBleHBsYW5hdG9yeSAoaW4gdGhlIGdyYW5kIFVuaXgKLXRyYWRpdGlvbikuCi0KLUBjaW5kZXggZm9ybWF0IG9mIGVycm9yIG1lc3NhZ2VzCi1FcnJvciBtZXNzYWdlcyBoYXZlIHRoZSBmb3JtYXQKLUBzbWFsbGV4YW1wbGUKLWZpbGVfbmFtZTpAYntOTk59OkZBVEFMOkVycm9yIE1lc3NhZ2UgVGV4dAotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZSBkZXJpdmVkIGFzIGZvciB3YXJuaW5nCi1tZXNzYWdlcy4gIFRoZSBhY3R1YWwgbWVzc2FnZSB0ZXh0IG1heSBiZSByYXRoZXIgbGVzcyBleHBsYW5hdG9yeQotYmVjYXVzZSBtYW55IG9mIHRoZW0gYXJlbid0IHN1cHBvc2VkIHRvIGhhcHBlbi4KLQotQG5vZGUgSW52b2tpbmcKLUBjaGFwdGVyIENvbW1hbmQtTGluZSBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucywgYWxsIHZlcnNpb25zIG9mIGFzc2VtYmxlcgotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBjb21tYW5kLWxpbmUgb3B0aW9ucyBhdmFpbGFibGUgaW4gQGVtcGh7YWxsfQotdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlcjsgQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSwgZm9yIG9wdGlvbnMgc3BlY2lmaWMKLUBpZmNsZWFyIEdFTkVSSUMKLXRvIHRoZSBAdmFsdWV7VEFSR0VUfS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLXRvIHBhcnRpY3VsYXIgbWFjaGluZSBhcmNoaXRlY3R1cmVzLgotQGVuZCBpZnNldAotCi1JZiB5b3UgYXJlIGludm9raW5nIEBjb2Rle0B2YWx1ZXtBU319IHZpYSB0aGUgQHNje2dudX0gQyBjb21waWxlciAodmVyc2lvbiAyKSwKLXlvdSBjYW4gdXNlIHRoZSBAc2FtcHstV2F9IG9wdGlvbiB0byBwYXNzIGFyZ3VtZW50cyB0aHJvdWdoIHRvIHRoZSBhc3NlbWJsZXIuCi1UaGUgYXNzZW1ibGVyIGFyZ3VtZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgKGFuZCB0aGUgQHNhbXB7LVdhfSkKLWJ5IGNvbW1hcy4gIEZvciBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi1nY2MgLWMgLWcgLU8gLVdhLC1hbGgsLUwgZmlsZS5jCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgcGFzc2VzIHR3byBvcHRpb25zIHRvIHRoZSBhc3NlbWJsZXI6IEBzYW1wey1hbGh9IChlbWl0IGEgbGlzdGluZyB0bwotc3RhbmRhcmQgb3V0cHV0IHdpdGggd2l0aCBoaWdoLWxldmVsIGFuZCBhc3NlbWJseSBzb3VyY2UpIGFuZCBAc2FtcHstTH0gKHJldGFpbgotbG9jYWwgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlKS4KLQotVXN1YWxseSB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgQHNhbXB7LVdhfSBtZWNoYW5pc20sIHNpbmNlIG1hbnkgY29tcGlsZXIKLWNvbW1hbmQtbGluZSBvcHRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IHBhc3NlZCB0byB0aGUgYXNzZW1ibGVyIGJ5IHRoZSBjb21waWxlci4KLShZb3UgY2FuIGNhbGwgdGhlIEBzY3tnbnV9IGNvbXBpbGVyIGRyaXZlciB3aXRoIHRoZSBAc2FtcHstdn0gb3B0aW9uIHRvIHNlZQotcHJlY2lzZWx5IHdoYXQgb3B0aW9ucyBpdCBwYXNzZXMgdG8gZWFjaCBjb21waWxhdGlvbiBwYXNzLCBpbmNsdWRpbmcgdGhlCi1hc3NlbWJsZXIuKQotCi1AbWVudQotKiBhOjogICAgICAgICAgICAgLWFbY2RobG5zXSBlbmFibGUgbGlzdGluZ3MKLSogRDo6ICAgICAgICAgICAgIC1EIGZvciBjb21wYXRpYmlsaXR5Ci0qIGY6OiAgICAgICAgICAgICAtZiB0byB3b3JrIGZhc3RlcgotKiBJOjogICAgICAgICAgICAgLUkgZm9yIC5pbmNsdWRlIHNlYXJjaCBwYXRoCi1AaWZjbGVhciBESUZGLVRCTC1LTFVHRQotKiBLOjogICAgICAgICAgICAgLUsgZm9yIGNvbXBhdGliaWxpdHkKLUBlbmQgaWZjbGVhcgotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi0qIEs6OiAgICAgICAgICAgICAtSyBmb3IgZGlmZmVyZW5jZSB0YWJsZXMKLUBlbmQgaWZzZXQKLQotKiBMOjogICAgICAgICAgICAgLUwgdG8gcmV0YWluIGxvY2FsIGxhYmVscwotKiBNOjoJCSAgLU0gb3IgLS1tcmkgdG8gYXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZQotKiBNRDo6ICAgICAgICAgICAgLS1NRCBmb3IgZGVwZW5kZW5jeSB0cmFja2luZwotKiBvOjogICAgICAgICAgICAgLW8gdG8gbmFtZSB0aGUgb2JqZWN0IGZpbGUKLSogUjo6ICAgICAgICAgICAgIC1SIHRvIGpvaW4gZGF0YSBhbmQgdGV4dCBzZWN0aW9ucwotKiBzdGF0aXN0aWNzOjogICAgLS1zdGF0aXN0aWNzIHRvIHNlZSBzdGF0aXN0aWNzIGFib3V0IGFzc2VtYmx5Ci0qIHRyYWRpdGlvbmFsLWZvcm1hdDo6IC0tdHJhZGl0aW9uYWwtZm9ybWF0IGZvciBjb21wYXRpYmxlIG91dHB1dAotKiB2OjogICAgICAgICAgICAgLXYgdG8gYW5ub3VuY2UgdmVyc2lvbgotKiBXOjogICAgICAgICAgICAgLVcsIC0tbm8td2FybiwgLS13YXJuLCAtLWZhdGFsLXdhcm5pbmdzIHRvIGNvbnRyb2wgd2FybmluZ3MKLSogWjo6ICAgICAgICAgICAgIC1aIHRvIG1ha2Ugb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnMKLUBlbmQgbWVudQotCi1Abm9kZSBhCi1Ac2VjdGlvbiBFbmFibGUgTGlzdGluZ3M6IEBjb2Rley1hW2NkaGxuc119Ci0KLUBraW5kZXggLWEKLUBraW5kZXggLWFjCi1Aa2luZGV4IC1hZAotQGtpbmRleCAtYWgKLUBraW5kZXggLWFsCi1Aa2luZGV4IC1hbgotQGtpbmRleCAtYXMKLUBjaW5kZXggbGlzdGluZ3MsIGVuYWJsaW5nCi1AY2luZGV4IGFzc2VtYmx5IGxpc3RpbmdzLCBlbmFibGluZwotCi1UaGVzZSBvcHRpb25zIGVuYWJsZSBsaXN0aW5nIG91dHB1dCBmcm9tIHRoZSBhc3NlbWJsZXIuICBCeSBpdHNlbGYsCi1Ac2FtcHstYX0gcmVxdWVzdHMgaGlnaC1sZXZlbCwgYXNzZW1ibHksIGFuZCBzeW1ib2xzIGxpc3RpbmcuCi1Zb3UgY2FuIHVzZSBvdGhlciBsZXR0ZXJzIHRvIHNlbGVjdCBzcGVjaWZpYyBvcHRpb25zIGZvciB0aGUgbGlzdDoKLUBzYW1wey1haH0gcmVxdWVzdHMgYSBoaWdoLWxldmVsIGxhbmd1YWdlIGxpc3RpbmcsCi1Ac2FtcHstYWx9IHJlcXVlc3RzIGFuIG91dHB1dC1wcm9ncmFtIGFzc2VtYmx5IGxpc3RpbmcsIGFuZAotQHNhbXB7LWFzfSByZXF1ZXN0cyBhIHN5bWJvbCB0YWJsZSBsaXN0aW5nLgotSGlnaC1sZXZlbCBsaXN0aW5ncyByZXF1aXJlIHRoYXQgYSBjb21waWxlciBkZWJ1Z2dpbmcgb3B0aW9uIGxpa2UKLUBzYW1wey1nfSBiZSB1c2VkLCBhbmQgdGhhdCBhc3NlbWJseSBsaXN0aW5ncyAoQHNhbXB7LWFsfSkgYmUgcmVxdWVzdGVkCi1hbHNvLgotCi1Vc2UgdGhlIEBzYW1wey1hY30gb3B0aW9uIHRvIG9taXQgZmFsc2UgY29uZGl0aW9uYWxzIGZyb20gYSBsaXN0aW5nLiAgQW55IGxpbmVzCi13aGljaCBhcmUgbm90IGFzc2VtYmxlZCBiZWNhdXNlIG9mIGEgZmFsc2UgQGNvZGV7LmlmfSAob3IgQGNvZGV7LmlmZGVmfSwgb3IgYW55Ci1vdGhlciBjb25kaXRpb25hbCksIG9yIGEgdHJ1ZSBAY29kZXsuaWZ9IGZvbGxvd2VkIGJ5IGFuIEBjb2Rley5lbHNlfSwgd2lsbCBiZQotb21pdHRlZCBmcm9tIHRoZSBsaXN0aW5nLgotCi1Vc2UgdGhlIEBzYW1wey1hZH0gb3B0aW9uIHRvIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXMgZnJvbSB0aGUKLWxpc3RpbmcuCi0KLU9uY2UgeW91IGhhdmUgc3BlY2lmaWVkIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGZ1cnRoZXIgY29udHJvbAotbGlzdGluZyBvdXRwdXQgYW5kIGl0cyBhcHBlYXJhbmNlIHVzaW5nIHRoZSBkaXJlY3RpdmVzIEBjb2Rley5saXN0fSwKLUBjb2Rley5ub2xpc3R9LCBAY29kZXsucHNpemV9LCBAY29kZXsuZWplY3R9LCBAY29kZXsudGl0bGV9LCBhbmQKLUBjb2Rley5zYnR0bH0uCi1UaGUgQHNhbXB7LWFufSBvcHRpb24gdHVybnMgb2ZmIGFsbCBmb3JtcyBwcm9jZXNzaW5nLgotSWYgeW91IGRvIG5vdCByZXF1ZXN0IGxpc3Rpbmcgb3V0cHV0IHdpdGggb25lIG9mIHRoZSBAc2FtcHstYX0gb3B0aW9ucywgdGhlCi1saXN0aW5nLWNvbnRyb2wgZGlyZWN0aXZlcyBoYXZlIG5vIGVmZmVjdC4KLQotVGhlIGxldHRlcnMgYWZ0ZXIgQHNhbXB7LWF9IG1heSBiZSBjb21iaW5lZCBpbnRvIG9uZSBvcHRpb24sCi1AZW1waHtlLmcufSwgQHNhbXB7LWFsbn0uCi0KLUBub2RlIEQKLUBzZWN0aW9uIEBjb2Rley1EfQotCi1Aa2luZGV4IC1ECi1UaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IHdoYXRzb2V2ZXIsIGJ1dCBpdCBpcyBhY2NlcHRlZCB0byBtYWtlIGl0IG1vcmUKLWxpa2VseSB0aGF0IHNjcmlwdHMgd3JpdHRlbiBmb3Igb3RoZXIgYXNzZW1ibGVycyBhbHNvIHdvcmsgd2l0aAotQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBub2RlIGYKLUBzZWN0aW9uIFdvcmsgRmFzdGVyOiBAY29kZXstZn0KLQotQGtpbmRleCAtZgotQGNpbmRleCB0cnVzdGVkIGNvbXBpbGVyCi1AY2luZGV4IGZhc3RlciBwcm9jZXNzaW5nIChAY29kZXstZn0pCi1Ac2FtcHstZn0gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGFzc2VtYmxpbmcgcHJvZ3JhbXMgd3JpdHRlbiBieSBhCi0odHJ1c3RlZCkgY29tcGlsZXIuICBAc2FtcHstZn0gc3RvcHMgdGhlIGFzc2VtYmxlciBmcm9tIGRvaW5nIHdoaXRlc3BhY2UKLWFuZCBjb21tZW50IHByZXByb2Nlc3Npbmcgb24KLXRoZSBpbnB1dCBmaWxlKHMpIGJlZm9yZSBhc3NlbWJsaW5nIHRoZW0uICBAeHJlZntQcmVwcm9jZXNzaW5nLAotLFByZXByb2Nlc3Npbmd9LgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gaWYgeW91IHVzZSBAc2FtcHstZn0gd2hlbiB0aGUgZmlsZXMgYWN0dWFsbHkgbmVlZCB0byBiZQotcHJlcHJvY2Vzc2VkIChpZiB0aGV5IGNvbnRhaW4gY29tbWVudHMsIGZvciBleGFtcGxlKSwgQGNvZGV7QHZhbHVle0FTfX0gZG9lcwotbm90IHdvcmsgY29ycmVjdGx5LgotQGVuZCBxdW90YXRpb24KLQotQG5vZGUgSQotQHNlY3Rpb24gQGNvZGV7LmluY2x1ZGV9IHNlYXJjaCBwYXRoOiBAY29kZXstSX0gQHZhcntwYXRofQotCi1Aa2luZGV4IC1JIEB2YXJ7cGF0aH0KLUBjaW5kZXggcGF0aHMgZm9yIEBjb2Rley5pbmNsdWRlfQotQGNpbmRleCBzZWFyY2ggcGF0aCBmb3IgQGNvZGV7LmluY2x1ZGV9Ci1AY2luZGV4IEBjb2Rle2luY2x1ZGV9IGRpcmVjdGl2ZSBzZWFyY2ggcGF0aAotVXNlIHRoaXMgb3B0aW9uIHRvIGFkZCBhIEB2YXJ7cGF0aH0gdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMKLUBjb2Rle0B2YWx1ZXtBU319IHNlYXJjaGVzIGZvciBmaWxlcyBzcGVjaWZpZWQgaW4gQGNvZGV7LmluY2x1ZGV9Ci1kaXJlY3RpdmVzIChAcHhyZWZ7SW5jbHVkZSwsQGNvZGV7LmluY2x1ZGV9fSkuICBZb3UgbWF5IHVzZSBAY29kZXstSX0gYXMKLW1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5IHRvIGluY2x1ZGUgYSB2YXJpZXR5IG9mIHBhdGhzLiAgVGhlIGN1cnJlbnQKLXdvcmtpbmcgZGlyZWN0b3J5IGlzIGFsd2F5cyBzZWFyY2hlZCBmaXJzdDsgYWZ0ZXIgdGhhdCwgQGNvZGV7QHZhbHVle0FTfX0KLXNlYXJjaGVzIGFueSBAc2FtcHstSX0gZGlyZWN0b3JpZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSB3ZXJlCi1zcGVjaWZpZWQgKGxlZnQgdG8gcmlnaHQpIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBub2RlIEsKLUBzZWN0aW9uIERpZmZlcmVuY2UgVGFibGVzOiBAY29kZXstS30KLQotQGtpbmRleCAtSwotQGlmY2xlYXIgRElGRi1UQkwtS0xVR0UKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHksIHRoaXMgb3B0aW9uIGlzIGFsbG93ZWQsIGJ1dCBoYXMgbm8gZWZmZWN0LiAgSXQgaXMKLXBlcm1pdHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgb24gb3RoZXIgcGxhdGZvcm1zLAotd2hlcmUgaXQgY2FuIGJlIHVzZWQgdG8gd2FybiB3aGVuIHRoZSBhc3NlbWJsZXIgYWx0ZXJzIHRoZSBtYWNoaW5lIGNvZGUKLWdlbmVyYXRlZCBmb3IgQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMgaW4gZGlmZmVyZW5jZSB0YWJsZXMuICBUaGUgQHZhbHVle1RBUkdFVH0KLWZhbWlseSBkb2VzIG5vdCBoYXZlIHRoZSBhZGRyZXNzaW5nIGxpbWl0YXRpb25zIHRoYXQgc29tZXRpbWVzIGxlYWQgdG8gdGhpcwotYWx0ZXJhdGlvbiBvbiBvdGhlciBwbGF0Zm9ybXMuCi1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi1AY2luZGV4IGRpZmZlcmVuY2UgdGFibGVzLCB3YXJuaW5nCi1AY2luZGV4IHdhcm5pbmcgZm9yIGFsdGVyZWQgZGlmZmVyZW5jZSB0YWJsZXMKLUBjb2Rle0B2YWx1ZXtBU319IHNvbWV0aW1lcyBhbHRlcnMgdGhlIGNvZGUgZW1pdHRlZCBmb3IgZGlyZWN0aXZlcyBvZiB0aGUgZm9ybQotQHNhbXB7LndvcmQgQHZhcntzeW0xfS1AdmFye3N5bTJ9fTsgQHB4cmVme1dvcmQsLEBjb2Rley53b3JkfX0uCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LUt9IG9wdGlvbiBpZiB5b3Ugd2FudCBhIHdhcm5pbmcgaXNzdWVkIHdoZW4gdGhpcwotaXMgZG9uZS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgTAotQHNlY3Rpb24gSW5jbHVkZSBMb2NhbCBMYWJlbHM6IEBjb2Rley1MfQotCi1Aa2luZGV4IC1MCi1AY2luZGV4IGxvY2FsIGxhYmVscywgcmV0YWluaW5nIGluIG91dHB1dAotTGFiZWxzIGJlZ2lubmluZyB3aXRoIEBzYW1we0x9ICh1cHBlciBjYXNlIG9ubHkpIGFyZSBjYWxsZWQgQGRmbntsb2NhbAotbGFiZWxzfS4gQHhyZWZ7U3ltYm9sIE5hbWVzfS4gIE5vcm1hbGx5IHlvdSBkbyBub3Qgc2VlIHN1Y2ggbGFiZWxzIHdoZW4KLWRlYnVnZ2luZywgYmVjYXVzZSB0aGV5IGFyZSBpbnRlbmRlZCBmb3IgdGhlIHVzZSBvZiBwcm9ncmFtcyAobGlrZQotY29tcGlsZXJzKSB0aGF0IGNvbXBvc2UgYXNzZW1ibGVyIHByb2dyYW1zLCBub3QgZm9yIHlvdXIgbm90aWNlLgotTm9ybWFsbHkgYm90aCBAY29kZXtAdmFsdWV7QVN9fSBhbmQgQGNvZGV7QHZhbHVle0xEfX0gZGlzY2FyZCBzdWNoIGxhYmVscywgc28geW91IGRvIG5vdAotbm9ybWFsbHkgZGVidWcgd2l0aCB0aGVtLgotCi1UaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byByZXRhaW4gdGhvc2UgQHNhbXB7TEBkb3Rze319IHN5bWJvbHMKLWluIHRoZSBvYmplY3QgZmlsZS4gIFVzdWFsbHkgaWYgeW91IGRvIHRoaXMgeW91IGFsc28gdGVsbCB0aGUgbGlua2VyCi1AY29kZXtAdmFsdWV7TER9fSB0byBwcmVzZXJ2ZSBzeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggQHNhbXB7TH0uCi0KLUJ5IGRlZmF1bHQsIGEgbG9jYWwgbGFiZWwgaXMgYW55IGxhYmVsIGJlZ2lubmluZyB3aXRoIEBzYW1we0x9LCBidXQgZWFjaAotdGFyZ2V0IGlzIGFsbG93ZWQgdG8gcmVkZWZpbmUgdGhlIGxvY2FsIGxhYmVsIHByZWZpeC4KLUBpZnNldCBIUFBBCi1PbiB0aGUgSFBQQSBsb2NhbCBsYWJlbHMgYmVnaW4gd2l0aCBAc2FtcHtMJH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJNCi1Ac2FtcHs7fSBmb3IgdGhlIEFSTSBmYW1pbHk7Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIE0KLUBzZWN0aW9uIEFzc2VtYmxlIGluIE1SSSBDb21wYXRpYmlsaXR5IE1vZGU6IEBjb2Rley1NfQotCi1Aa2luZGV4IC1NCi1AY2luZGV4IE1SSSBjb21wYXRpYmlsaXR5IG1vZGUKLVRoZSBAY29kZXstTX0gb3IgQGNvZGV7LS1tcml9IG9wdGlvbiBzZWxlY3RzIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuICBUaGlzCi1jaGFuZ2VzIHRoZSBzeW50YXggYW5kIHBzZXVkby1vcCBoYW5kbGluZyBvZiBAY29kZXtAdmFsdWV7QVN9fSB0byBtYWtlIGl0Ci1jb21wYXRpYmxlIHdpdGggdGhlIEBjb2Rle0FTTTY4S30gb3IgdGhlIEBjb2Rle0FTTTk2MH0gKGRlcGVuZGluZyB1cG9uIHRoZQotY29uZmlndXJlZCB0YXJnZXQpIGFzc2VtYmxlciBmcm9tIE1pY3JvdGVjIFJlc2VhcmNoLiAgVGhlIGV4YWN0IG5hdHVyZSBvZiB0aGUKLU1SSSBzeW50YXggd2lsbCBub3QgYmUgZG9jdW1lbnRlZCBoZXJlOyBzZWUgdGhlIE1SSSBtYW51YWxzIGZvciBtb3JlCi1pbmZvcm1hdGlvbi4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IHRoZSBoYW5kbGluZyBvZiBtYWNyb3MgYW5kIG1hY3JvCi1hcmd1bWVudHMgaXMgc29tZXdoYXQgZGlmZmVyZW50LiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBvcHRpb24gaXMgdG8gcGVybWl0Ci1hc3NlbWJsaW5nIGV4aXN0aW5nIE1SSSBhc3NlbWJsZXIgY29kZSB1c2luZyBAY29kZXtAdmFsdWV7QVN9fS4KLQotVGhlIE1SSSBjb21wYXRpYmlsaXR5IGlzIG5vdCBjb21wbGV0ZS4gIENlcnRhaW4gb3BlcmF0aW9ucyBvZiB0aGUgTVJJIGFzc2VtYmxlcgotZGVwZW5kIHVwb24gaXRzIG9iamVjdCBmaWxlIGZvcm1hdCwgYW5kIGNhbiBub3QgYmUgc3VwcG9ydGVkIHVzaW5nIG90aGVyIG9iamVjdAotZmlsZSBmb3JtYXRzLiAgU3VwcG9ydGluZyB0aGVzZSB3b3VsZCByZXF1aXJlIGVuaGFuY2luZyBlYWNoIG9iamVjdCBmaWxlIGZvcm1hdAotaW5kaXZpZHVhbGx5LiAgVGhlc2UgYXJlOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSBnbG9iYWwgc3ltYm9scyBpbiBjb21tb24gc2VjdGlvbgotCi1UaGUgbTY4ayBNUkkgYXNzZW1ibGVyIHN1cHBvcnRzIGNvbW1vbiBzZWN0aW9ucyB3aGljaCBhcmUgbWVyZ2VkIGJ5IHRoZSBsaW5rZXIuCi1PdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzIGRvIG5vdCBzdXBwb3J0IHRoaXMuICBAY29kZXtAdmFsdWV7QVN9fSBoYW5kbGVzCi1jb21tb24gc2VjdGlvbnMgYnkgdHJlYXRpbmcgdGhlbSBhcyBhIHNpbmdsZSBjb21tb24gc3ltYm9sLiAgSXQgcGVybWl0cyBsb2NhbAotc3ltYm9scyB0byBiZSBkZWZpbmVkIHdpdGhpbiBhIGNvbW1vbiBzZWN0aW9uLCBidXQgaXQgY2FuIG5vdCBzdXBwb3J0IGdsb2JhbAotc3ltYm9scywgc2luY2UgaXQgaGFzIG5vIHdheSB0byBkZXNjcmliZSB0aGVtLgotCi1AaXRlbSBjb21wbGV4IHJlbG9jYXRpb25zCi0KLVRoZSBNUkkgYXNzZW1ibGVycyBzdXBwb3J0IHJlbG9jYXRpb25zIGFnYWluc3QgYSBuZWdhdGVkIHNlY3Rpb24gYWRkcmVzcywgYW5kCi1yZWxvY2F0aW9ucyB3aGljaCBjb21iaW5lIHRoZSBzdGFydCBhZGRyZXNzZXMgb2YgdHdvIG9yIG1vcmUgc2VjdGlvbnMuICBUaGVzZQotYXJlIG5vdCBzdXBwb3J0IGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUBpdGVtIEBjb2Rle0VORH0gcHNldWRvLW9wIHNwZWNpZnlpbmcgc3RhcnQgYWRkcmVzcwotCi1UaGUgTVJJIEBjb2Rle0VORH0gcHNldWRvLW9wIHBlcm1pdHMgdGhlIHNwZWNpZmljYXRpb24gb2YgYSBzdGFydCBhZGRyZXNzLgotVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuICBUaGUgc3RhcnQgYWRkcmVzcyBtYXkKLWluc3RlYWQgYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBAY29kZXstZX0gb3B0aW9uIHRvIHRoZSBsaW5rZXIsIG9yIGluIGEgbGlua2VyCi1zY3JpcHQuCi0KLUBpdGVtIEBjb2Rle0lETlR9LCBAY29kZXsuaWRlbnR9IGFuZCBAY29kZXtOQU1FfSBwc2V1ZG8tb3BzCi0KLVRoZSBNUkkgQGNvZGV7SUROVH0sIEBjb2Rley5pZGVudH0gYW5kIEBjb2Rle05BTUV9IHBzZXVkby1vcHMgYXNzaWduIGEgbW9kdWxlCi1uYW1lIHRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AaXRlbSBAY29kZXtPUkd9IHBzZXVkby1vcAotCi1UaGUgbTY4ayBNUkkgQGNvZGV7T1JHfSBwc2V1ZG8tb3AgYmVnaW5zIGFuIGFic29sdXRlIHNlY3Rpb24gYXQgYSBnaXZlbgotYWRkcmVzcy4gIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB1c3VhbCBAY29kZXtAdmFsdWV7QVN9fSBAY29kZXsub3JnfSBwc2V1ZG8tb3AsCi13aGljaCBjaGFuZ2VzIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgc2VjdGlvbi4gIEFic29sdXRlIHNlY3Rpb25zIGFyZQotbm90IHN1cHBvcnRlZCBieSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLiAgVGhlIGFkZHJlc3Mgb2YgYSBzZWN0aW9uIG1heSBiZQotYXNzaWduZWQgd2l0aGluIGEgbGlua2VyIHNjcmlwdC4KLUBlbmQgaXRlbWl6ZQotCi1UaGVyZSBhcmUgc29tZSBvdGhlciBmZWF0dXJlcyBvZiB0aGUgTVJJIGFzc2VtYmxlciB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieQotQGNvZGV7QHZhbHVle0FTfX0sIHR5cGljYWxseSBlaXRoZXIgYmVjYXVzZSB0aGV5IGFyZSBkaWZmaWN1bHQgb3IgYmVjYXVzZSB0aGV5Ci1zZWVtIG9mIGxpdHRsZSBjb25zZXF1ZW5jZS4gIFNvbWUgb2YgdGhlc2UgbWF5IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgcmVsZWFzZXMuCi0KLUBpdGVtaXplIEBidWxsZXQKLQotQGl0ZW0gRUJDRElDIHN0cmluZ3MKLQotRUJDRElDIHN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIHBhY2tlZCBiaW5hcnkgY29kZWQgZGVjaW1hbAotCi1QYWNrZWQgYmluYXJ5IGNvZGVkIGRlY2ltYWwgaXMgbm90IHN1cHBvcnRlZC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgQGNvZGV7REMuUH0KLWFuZCBAY29kZXtEQ0IuUH0gcHNldWRvLW9wcyBhcmUgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7RkVRVX0gcHNldWRvLW9wCi0KLVRoZSBtNjhrIEBjb2Rle0ZFUVV9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXtOT09CSn0gcHNldWRvLW9wCi0KLVRoZSBtNjhrIEBjb2Rle05PT0JKfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7T1BUfSBicmFuY2ggY29udHJvbCBvcHRpb25zCi0KLVRoZSBtNjhrIEBjb2Rle09QVH0gYnJhbmNoIGNvbnRyb2wgb3B0aW9ucy0tLUBjb2Rle0J9LCBAY29kZXtCUlN9LCBAY29kZXtCUkJ9LAotQGNvZGV7QlJMfSwgYW5kIEBjb2Rle0JSV30tLS1hcmUgaWdub3JlZC4gIEBjb2Rle0B2YWx1ZXtBU319IGF1dG9tYXRpY2FsbHkKLXJlbGF4ZXMgYWxsIGJyYW5jaGVzLCB3aGV0aGVyIGZvcndhcmQgb3IgYmFja3dhcmQsIHRvIGFuIGFwcHJvcHJpYXRlIHNpemUsIHNvCi10aGVzZSBvcHRpb25zIHNlcnZlIG5vIHB1cnBvc2UuCi0KLUBpdGVtIEBjb2Rle09QVH0gbGlzdCBjb250cm9sIG9wdGlvbnMKLQotVGhlIGZvbGxvd2luZyBtNjhrIEBjb2Rle09QVH0gbGlzdCBjb250cm9sIG9wdGlvbnMgYXJlIGlnbm9yZWQ6IEBjb2Rle0N9LAotQGNvZGV7Q0VYfSwgQGNvZGV7Q0x9LCBAY29kZXtDUkV9LCBAY29kZXtFfSwgQGNvZGV7R30sIEBjb2Rle0l9LCBAY29kZXtNfSwKLUBjb2Rle01FWH0sIEBjb2Rle01DfSwgQGNvZGV7TUR9LCBAY29kZXtYfS4KLQotQGl0ZW0gb3RoZXIgQGNvZGV7T1BUfSBvcHRpb25zCi0KLVRoZSBmb2xsb3dpbmcgbTY4ayBAY29kZXtPUFR9IG9wdGlvbnMgYXJlIGlnbm9yZWQ6IEBjb2Rle05FU1R9LCBAY29kZXtPfSwKLUBjb2Rle09MRH0sIEBjb2Rle09QfSwgQGNvZGV7UH0sIEBjb2Rle1BDT30sIEBjb2Rle1BDUn0sIEBjb2Rle1BDU30sIEBjb2Rle1J9LgotCi1AaXRlbSBAY29kZXtPUFR9IEBjb2Rle0R9IG9wdGlvbiBpcyBkZWZhdWx0Ci0KLVRoZSBtNjhrIEBjb2Rle09QVH0gQGNvZGV7RH0gb3B0aW9uIGlzIHRoZSBkZWZhdWx0LCB1bmxpa2UgdGhlIE1SSSBhc3NlbWJsZXIuCi1AY29kZXtPUFQgTk9EfSBtYXkgYmUgdXNlZCB0byB0dXJuIGl0IG9mZi4KLQotQGl0ZW0gQGNvZGV7WFJFRn0gcHNldWRvLW9wLgotCi1UaGUgbTY4ayBAY29kZXtYUkVGfSBwc2V1ZG8tb3AgaXMgaWdub3JlZC4KLQotQGl0ZW0gQGNvZGV7LmRlYnVnfSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7LmRlYnVnfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7LmV4dGVuZGVkfSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7LmV4dGVuZGVkfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7Lmxpc3R9IHBzZXVkby1vcC4KLQotVGhlIHZhcmlvdXMgb3B0aW9ucyBvZiB0aGUgaTk2MCBAY29kZXsubGlzdH0gcHNldWRvLW9wIGFyZSBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsub3B0aW1pemV9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsub3B0aW1pemV9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsub3V0cHV0fSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7Lm91dHB1dH0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5zZXRyZWFsfSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7LnNldHJlYWx9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgTUQKLUBzZWN0aW9uIERlcGVuZGVuY3kgdHJhY2tpbmc6IEBjb2Rley0tTUR9Ci0KLUBraW5kZXggLS1NRAotQGNpbmRleCBkZXBlbmRlbmN5IHRyYWNraW5nCi1AY2luZGV4IG1ha2UgcnVsZXMKLQotQGNvZGV7QHZhbHVle0FTfX0gY2FuIGdlbmVyYXRlIGEgZGVwZW5kZW5jeSBmaWxlIGZvciB0aGUgZmlsZSBpdCBjcmVhdGVzLiAgVGhpcwotZmlsZSBjb25zaXN0cyBvZiBhIHNpbmdsZSBydWxlIHN1aXRhYmxlIGZvciBAY29kZXttYWtlfSBkZXNjcmliaW5nIHRoZQotZGVwZW5kZW5jaWVzIG9mIHRoZSBtYWluIHNvdXJjZSBmaWxlLgotCi1UaGUgcnVsZSBpcyB3cml0dGVuIHRvIHRoZSBmaWxlIG5hbWVkIGluIGl0cyBhcmd1bWVudC4KLQotVGhpcyBmZWF0dXJlIGlzIHVzZWQgaW4gdGhlIGF1dG9tYXRpYyB1cGRhdGluZyBvZiBtYWtlZmlsZXMuCi0KLUBub2RlIG8KLUBzZWN0aW9uIE5hbWUgdGhlIE9iamVjdCBGaWxlOiBAY29kZXstb30KLQotQGtpbmRleCAtbwotQGNpbmRleCBuYW1pbmcgb2JqZWN0IGZpbGUKLUBjaW5kZXggb2JqZWN0IGZpbGUgbmFtZQotVGhlcmUgaXMgYWx3YXlzIG9uZSBvYmplY3QgZmlsZSBvdXRwdXQgd2hlbiB5b3UgcnVuIEBjb2Rle0B2YWx1ZXtBU319LiAgQnkKLWRlZmF1bHQgaXQgaGFzIHRoZSBuYW1lCi1AaWZzZXQgR0VORVJJQwotQGlmc2V0IEk5NjAKLUBmaWxle2Eub3V0fSAob3IgQGZpbGV7Yi5vdXR9LCBmb3IgSW50ZWwgOTYwIHRhcmdldHMgb25seSkuCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBJOTYwCi1AZmlsZXthLm91dH0uCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJOTYwCi1AZmlsZXtiLm91dH0uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBJOTYwCi1AZmlsZXthLm91dH0uCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZjbGVhcgotWW91IHVzZSB0aGlzIG9wdGlvbiAod2hpY2ggdGFrZXMgZXhhY3RseSBvbmUgZmlsZW5hbWUpIHRvIGdpdmUgdGhlCi1vYmplY3QgZmlsZSBhIGRpZmZlcmVudCBuYW1lLgotCi1XaGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUgaXMgY2FsbGVkLCBAY29kZXtAdmFsdWV7QVN9fSBvdmVyd3JpdGVzIGFueQotZXhpc3RpbmcgZmlsZSBvZiB0aGUgc2FtZSBuYW1lLgotCi1Abm9kZSBSCi1Ac2VjdGlvbiBKb2luIERhdGEgYW5kIFRleHQgU2VjdGlvbnM6IEBjb2Rley1SfQotCi1Aa2luZGV4IC1SCi1AY2luZGV4IGRhdGEgYW5kIHRleHQgc2VjdGlvbnMsIGpvaW5pbmcKLUBjaW5kZXggdGV4dCBhbmQgZGF0YSBzZWN0aW9ucywgam9pbmluZwotQGNpbmRleCBqb2luaW5nIHRleHQgYW5kIGRhdGEgc2VjdGlvbnMKLUBjaW5kZXggbWVyZ2luZyB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zCi1AY29kZXstUn0gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gd3JpdGUgdGhlIG9iamVjdCBmaWxlIGFzIGlmIGFsbAotZGF0YS1zZWN0aW9uIGRhdGEgbGl2ZXMgaW4gdGhlIHRleHQgc2VjdGlvbi4gIFRoaXMgaXMgb25seSBkb25lIGF0Ci10aGUgdmVyeSBsYXN0IG1vbWVudDogIHlvdXIgYmluYXJ5IGRhdGEgYXJlIHRoZSBzYW1lLCBidXQgZGF0YQotc2VjdGlvbiBwYXJ0cyBhcmUgcmVsb2NhdGVkIGRpZmZlcmVudGx5LiAgVGhlIGRhdGEgc2VjdGlvbiBwYXJ0IG9mCi15b3VyIG9iamVjdCBmaWxlIGlzIHplcm8gYnl0ZXMgbG9uZyBiZWNhdXNlIGFsbCBpdHMgYnl0ZXMgYXJlCi1hcHBlbmRlZCB0byB0aGUgdGV4dCBzZWN0aW9uLiAgKEB4cmVme1NlY3Rpb25zLCxTZWN0aW9ucyBhbmQgUmVsb2NhdGlvbn0uKQotCi1XaGVuIHlvdSBzcGVjaWZ5IEBjb2Rley1SfSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBnZW5lcmF0ZSBzaG9ydGVyCi1hZGRyZXNzIGRpc3BsYWNlbWVudHMgKGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgdG8gY3Jvc3MgYmV0d2VlbiB0ZXh0IGFuZAotZGF0YSBzZWN0aW9uKS4gIFdlIHJlZnJhaW4gZnJvbSBkb2luZyB0aGlzIHNpbXBseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi1vbGRlciB2ZXJzaW9ucyBvZiBAY29kZXtAdmFsdWV7QVN9fS4gIEluIGZ1dHVyZSwgQGNvZGV7LVJ9IG1heSB3b3JrIHRoaXMgd2F5LgotCi1AaWZzZXQgQ09GRgotV2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciBDT0ZGIG91dHB1dCwKLXRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSB1c2Ugc2VjdGlvbnMgbmFtZWQgQHNhbXB7LnRleHR9IGFuZAotQHNhbXB7LmRhdGF9LgotQGVuZCBpZnNldAotCi1AaWZzZXQgSFBQQQotQGNvZGV7LVJ9IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFueSBvZiB0aGUgSFBQQSB0YXJnZXRzLiAgVXNpbmcKLUBjb2Rley1SfSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gQGNvZGV7QHZhbHVle0FTfX0uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIHN0YXRpc3RpY3MKLUBzZWN0aW9uIERpc3BsYXkgQXNzZW1ibHkgU3RhdGlzdGljczogQGNvZGV7LS1zdGF0aXN0aWNzfQotCi1Aa2luZGV4IC0tc3RhdGlzdGljcwotQGNpbmRleCBzdGF0aXN0aWNzLCBhYm91dCBhc3NlbWJseQotQGNpbmRleCB0aW1lLCB0b3RhbCBmb3IgYXNzZW1ibHkKLUBjaW5kZXggc3BhY2UgdXNlZCwgbWF4aW11bSBmb3IgYXNzZW1ibHkKLVVzZSBAc2FtcHstLXN0YXRpc3RpY3N9IHRvIGRpc3BsYXkgdHdvIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHJlc291cmNlcyB1c2VkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fTogdGhlIG1heGltdW0gYW1vdW50IG9mIHNwYWNlIGFsbG9jYXRlZCBkdXJpbmcgdGhlIGFzc2VtYmx5Ci0oaW4gYnl0ZXMpLCBhbmQgdGhlIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIHRha2VuIGZvciB0aGUgYXNzZW1ibHkgKGluIEBzY3tjcHV9Ci1zZWNvbmRzKS4KLQotQG5vZGUgdHJhZGl0aW9uYWwtZm9ybWF0Ci1Ac2VjdGlvbiBDb21wYXRpYmxlIG91dHB1dDogQGNvZGV7LS10cmFkaXRpb25hbC1mb3JtYXR9Ci0KLUBraW5kZXggLS10cmFkaXRpb25hbC1mb3JtYXQKLUZvciBzb21lIHRhcmdldHMsIHRoZSBvdXRwdXQgb2YgQGNvZGV7QHZhbHVle0FTfX0gaXMgZGlmZmVyZW50IGluIHNvbWUgd2F5cwotZnJvbSB0aGUgb3V0cHV0IG9mIHNvbWUgZXhpc3RpbmcgYXNzZW1ibGVyLiAgVGhpcyBzd2l0Y2ggcmVxdWVzdHMKLUBjb2Rle0B2YWx1ZXtBU319IHRvIHVzZSB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0IGluc3RlYWQuCi0KLUZvciBleGFtcGxlLCBpdCBkaXNhYmxlcyB0aGUgZXhjZXB0aW9uIGZyYW1lIG9wdGltaXphdGlvbnMgd2hpY2gKLUBjb2Rle0B2YWx1ZXtBU319IG5vcm1hbGx5IGRvZXMgYnkgZGVmYXVsdCBvbiBAY29kZXtAdmFsdWV7R0NDfX0gb3V0cHV0LgotCi1Abm9kZSB2Ci1Ac2VjdGlvbiBBbm5vdW5jZSBWZXJzaW9uOiBAY29kZXstdn0KLQotQGtpbmRleCAtdgotQGtpbmRleCAtdmVyc2lvbgotQGNpbmRleCBhc3NlbWJsZXIgdmVyc2lvbgotQGNpbmRleCB2ZXJzaW9uIG9mIGFzc2VtYmxlcgotWW91IGNhbiBmaW5kIG91dCB3aGF0IHZlcnNpb24gb2YgYXMgaXMgcnVubmluZyBieSBpbmNsdWRpbmcgdGhlCi1vcHRpb24gQHNhbXB7LXZ9ICh3aGljaCB5b3UgY2FuIGFsc28gc3BlbGwgYXMgQHNhbXB7LXZlcnNpb259KSBvbiB0aGUKLWNvbW1hbmQgbGluZS4KLQotQG5vZGUgVwotQHNlY3Rpb24gQ29udHJvbCBXYXJuaW5nczogQGNvZGV7LVd9LCBAY29kZXstLXdhcm59LCBAY29kZXstLW5vLXdhcm59LCBAY29kZXstLWZhdGFsLXdhcm5pbmdzfQotCi1AY29kZXtAdmFsdWV7QVN9fSBzaG91bGQgbmV2ZXIgZ2l2ZSBhIHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSB3aGVuCi1hc3NlbWJsaW5nIGNvbXBpbGVyIG91dHB1dC4gIEJ1dCBwcm9ncmFtcyB3cml0dGVuIGJ5IHBlb3BsZSBvZnRlbgotY2F1c2UgQGNvZGV7QHZhbHVle0FTfX0gdG8gZ2l2ZSBhIHdhcm5pbmcgdGhhdCBhIHBhcnRpY3VsYXIgYXNzdW1wdGlvbiB3YXMKLW1hZGUuICBBbGwgc3VjaCB3YXJuaW5ncyBhcmUgZGlyZWN0ZWQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIGZpbGUuCi0KLUBraW5kZXggQHNhbXB7LVd9Ci1Aa2luZGV4IEBzYW1wey0tbm8td2Fybn0KLUBjaW5kZXggc3VwcHJlc3Npbmcgd2FybmluZ3MKLUBjaW5kZXggd2FybmluZ3MsIHN1cHByZXNzaW5nCi1JZiB5b3UgdXNlIHRoZSBAY29kZXstV30gYW5kIEBjb2Rley0tbm8td2Fybn0gb3B0aW9ucywgbm8gd2FybmluZ3MgYXJlIGlzc3VlZC4KLVRoaXMgb25seSBhZmZlY3RzIHRoZSB3YXJuaW5nIG1lc3NhZ2VzOiBpdCBkb2VzIG5vdCBjaGFuZ2UgYW55IHBhcnRpY3VsYXIgb2YKLWhvdyBAY29kZXtAdmFsdWV7QVN9fSBhc3NlbWJsZXMgeW91ciBmaWxlLiAgRXJyb3JzLCB3aGljaCBzdG9wIHRoZSBhc3NlbWJseSwKLWFyZSBzdGlsbCByZXBvcnRlZC4KLQotQGtpbmRleCBAc2FtcHstLWZhdGFsLXdhcm5pbmdzfQotQGNpbmRleCBlcnJvcnMsIGNhdXNlZCBieSB3YXJuaW5ncwotQGNpbmRleCB3YXJuaW5ncywgY2F1c2luZyBlcnJvcgotSWYgeW91IHVzZSB0aGUgQGNvZGV7LS1mYXRhbC13YXJuaW5nc30gb3B0aW9uLCBAY29kZXtAdmFsdWV7QVN9fSBjb25zaWRlcnMKLWZpbGVzIHRoYXQgZ2VuZXJhdGUgd2FybmluZ3MgdG8gYmUgaW4gZXJyb3IuCi0KLUBraW5kZXggQHNhbXB7LS13YXJufQotQGNpbmRleCB3YXJuaW5ncywgc3dpdGNoaW5nIG9uCi1Zb3UgY2FuIHN3aXRjaCB0aGVzZSBvcHRpb25zIG9mZiBhZ2FpbiBieSBzcGVjaWZ5aW5nIEBjb2Rley0td2Fybn0sIHdoaWNoCi1jYXVzZXMgd2FybmluZ3MgdG8gYmUgb3V0cHV0IGFzIHVzdWFsLgotCi1Abm9kZSBaCi1Ac2VjdGlvbiBHZW5lcmF0ZSBPYmplY3QgRmlsZSBpbiBTcGl0ZSBvZiBFcnJvcnM6IEBjb2Rley1afQotQGNpbmRleCBvYmplY3QgZmlsZSwgYWZ0ZXIgZXJyb3JzCi1AY2luZGV4IGVycm9ycywgY29udGludWluZyBhZnRlcgotQWZ0ZXIgYW4gZXJyb3IgbWVzc2FnZSwgQGNvZGV7QHZhbHVle0FTfX0gbm9ybWFsbHkgcHJvZHVjZXMgbm8gb3V0cHV0LiAgSWYgZm9yCi1zb21lIHJlYXNvbiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gb2JqZWN0IGZpbGUgb3V0cHV0IGV2ZW4gYWZ0ZXIKLUBjb2Rle0B2YWx1ZXtBU319IGdpdmVzIGFuIGVycm9yIG1lc3NhZ2Ugb24geW91ciBwcm9ncmFtLCB1c2UgdGhlIEBzYW1wey1afQotb3B0aW9uLiAgSWYgdGhlcmUgYXJlIGFueSBlcnJvcnMsIEBjb2Rle0B2YWx1ZXtBU319IGNvbnRpbnVlcyBhbnl3YXlzLCBhbmQKLXdyaXRlcyBhbiBvYmplY3QgZmlsZSBhZnRlciBhIGZpbmFsIHdhcm5pbmcgbWVzc2FnZSBvZiB0aGUgZm9ybSBAc2FtcHtAdmFye259Ci1lcnJvcnMsIEB2YXJ7bX0gd2FybmluZ3MsIGdlbmVyYXRpbmcgYmFkIG9iamVjdCBmaWxlLn0KLQotQG5vZGUgU3ludGF4Ci1AY2hhcHRlciBTeW50YXgKLQotQGNpbmRleCBtYWNoaW5lLWluZGVwZW5kZW50IHN5bnRheAotQGNpbmRleCBzeW50YXgsIG1hY2hpbmUtaW5kZXBlbmRlbnQKLVRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIG1hY2hpbmUtaW5kZXBlbmRlbnQgc3ludGF4IGFsbG93ZWQgaW4gYQotc291cmNlIGZpbGUuICBAY29kZXtAdmFsdWV7QVN9fSBzeW50YXggaXMgc2ltaWxhciB0byB3aGF0IG1hbnkgb3RoZXIKLWFzc2VtYmxlcnMgdXNlOyBpdCBpcyBpbnNwaXJlZCBieSB0aGUgQlNEIDQuMgotQGlmY2xlYXIgVkFYCi1hc3NlbWJsZXIuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBWQVgKLWFzc2VtYmxlciwgZXhjZXB0IHRoYXQgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgYXNzZW1ibGUgVmF4IGJpdC1maWVsZHMuCi1AZW5kIGlmc2V0Ci0KLUBtZW51Ci0qIFByZXByb2Nlc3Npbmc6OiAgICAgICAgICAgICAgUHJlcHJvY2Vzc2luZwotKiBXaGl0ZXNwYWNlOjogICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlCi0qIENvbW1lbnRzOjogICAgICAgICAgICAgICAgICAgIENvbW1lbnRzCi0qIFN5bWJvbCBJbnRybzo6ICAgICAgICAgICAgICAgIFN5bWJvbHMKLSogU3RhdGVtZW50czo6ICAgICAgICAgICAgICAgICAgU3RhdGVtZW50cwotKiBDb25zdGFudHM6OiAgICAgICAgICAgICAgICAgICBDb25zdGFudHMKLUBlbmQgbWVudQotCi1Abm9kZSBQcmVwcm9jZXNzaW5nCi1Ac2VjdGlvbiBQcmVwcm9jZXNzaW5nCi0KLUBjaW5kZXggcHJlcHJvY2Vzc2luZwotVGhlIEBjb2Rle0B2YWx1ZXtBU319IGludGVybmFsIHByZXByb2Nlc3NvcjoKLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggd2hpdGVzcGFjZSwgcmVtb3ZlZCBieSBwcmVwcm9jZXNzb3IKLUBpdGVtCi1hZGp1c3RzIGFuZCByZW1vdmVzIGV4dHJhIHdoaXRlc3BhY2UuICBJdCBsZWF2ZXMgb25lIHNwYWNlIG9yIHRhYiBiZWZvcmUKLXRoZSBrZXl3b3JkcyBvbiBhIGxpbmUsIGFuZCB0dXJucyBhbnkgb3RoZXIgd2hpdGVzcGFjZSBvbiB0aGUgbGluZSBpbnRvCi1hIHNpbmdsZSBzcGFjZS4KLQotQGNpbmRleCBjb21tZW50cywgcmVtb3ZlZCBieSBwcmVwcm9jZXNzb3IKLUBpdGVtCi1yZW1vdmVzIGFsbCBjb21tZW50cywgcmVwbGFjaW5nIHRoZW0gd2l0aCBhIHNpbmdsZSBzcGFjZSwgb3IgYW4KLWFwcHJvcHJpYXRlIG51bWJlciBvZiBuZXdsaW5lcy4KLQotQGNpbmRleCBjb25zdGFudHMsIGNvbnZlcnRlZCBieSBwcmVwcm9jZXNzb3IKLUBpdGVtCi1jb252ZXJ0cyBjaGFyYWN0ZXIgY29uc3RhbnRzIGludG8gdGhlIGFwcHJvcHJpYXRlIG51bWVyaWMgdmFsdWVzLgotQGVuZCBpdGVtaXplCi0KLUl0IGRvZXMgbm90IGRvIG1hY3JvIHByb2Nlc3NpbmcsIGluY2x1ZGUgZmlsZSBoYW5kbGluZywgb3IKLWFueXRoaW5nIGVsc2UgeW91IG1heSBnZXQgZnJvbSB5b3VyIEMgY29tcGlsZXIncyBwcmVwcm9jZXNzb3IuICBZb3UgY2FuCi1kbyBpbmNsdWRlIGZpbGUgcHJvY2Vzc2luZyB3aXRoIHRoZSBAY29kZXsuaW5jbHVkZX0gZGlyZWN0aXZlCi0oQHB4cmVme0luY2x1ZGUsLEBjb2Rley5pbmNsdWRlfX0pLiAgWW91IGNhbiB1c2UgdGhlIEBzY3tnbnV9IEMgY29tcGlsZXIgZHJpdmVyCi10byBnZXQgb3RoZXIgYGBDUFAnJyBzdHlsZSBwcmVwcm9jZXNzaW5nLCBieSBnaXZpbmcgdGhlIGlucHV0IGZpbGUgYQotQHNhbXB7LlN9IHN1ZmZpeC4gIEB4cmVme092ZXJhbGwgT3B0aW9ucywsIE9wdGlvbnMgQ29udHJvbGxpbmcgdGhlIEtpbmQgb2YKLU91dHB1dCwgZ2NjLmluZm8sIFVzaW5nIEdOVSBDQ30uCi0KLUV4Y2VzcyB3aGl0ZXNwYWNlLCBjb21tZW50cywgYW5kIGNoYXJhY3RlciBjb25zdGFudHMKLWNhbm5vdCBiZSB1c2VkIGluIHRoZSBwb3J0aW9ucyBvZiB0aGUgaW5wdXQgdGV4dCB0aGF0IGFyZSBub3QKLXByZXByb2Nlc3NlZC4KLQotQGNpbmRleCB0dXJuaW5nIHByZXByb2Nlc3Npbmcgb24gYW5kIG9mZgotQGNpbmRleCBwcmVwcm9jZXNzaW5nLCB0dXJuaW5nIG9uIGFuZCBvZmYKLUBraW5kZXggI05PX0FQUAotQGtpbmRleCAjQVBQCi1JZiB0aGUgZmlyc3QgbGluZSBvZiBhbiBpbnB1dCBmaWxlIGlzIEBjb2RleyNOT19BUFB9IG9yIGlmIHlvdSB1c2UgdGhlCi1Ac2FtcHstZn0gb3B0aW9uLCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLVdpdGhpbiBhbiBpbnB1dCBmaWxlLCB5b3UgY2FuIGFzayBmb3Igd2hpdGVzcGFjZSBhbmQgY29tbWVudCByZW1vdmFsIGluCi1zcGVjaWZpYyBwb3J0aW9ucyBvZiB0aGUgYnkgcHV0dGluZyBhIGxpbmUgdGhhdCBzYXlzIEBjb2RleyNBUFB9IGJlZm9yZSB0aGUKLXRleHQgdGhhdCBtYXkgY29udGFpbiB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzLCBhbmQgcHV0dGluZyBhIGxpbmUgdGhhdCBzYXlzCi1AY29kZXsjTk9fQVBQfSBhZnRlciB0aGlzIHRleHQuICBUaGlzIGZlYXR1cmUgaXMgbWFpbmx5IGludGVuZCB0byBzdXBwb3J0Ci1AY29kZXthc219IHN0YXRlbWVudHMgaW4gY29tcGlsZXJzIHdob3NlIG91dHB1dCBpcyBvdGhlcndpc2UgZnJlZSBvZiBjb21tZW50cwotYW5kIHdoaXRlc3BhY2UuCi0KLUBub2RlIFdoaXRlc3BhY2UKLUBzZWN0aW9uIFdoaXRlc3BhY2UKLQotQGNpbmRleCB3aGl0ZXNwYWNlCi1AZGZue1doaXRlc3BhY2V9IGlzIG9uZSBvciBtb3JlIGJsYW5rcyBvciB0YWJzLCBpbiBhbnkgb3JkZXIuCi1XaGl0ZXNwYWNlIGlzIHVzZWQgdG8gc2VwYXJhdGUgc3ltYm9scywgYW5kIHRvIG1ha2UgcHJvZ3JhbXMgbmVhdGVyIGZvcgotcGVvcGxlIHRvIHJlYWQuICBVbmxlc3Mgd2l0aGluIGNoYXJhY3RlciBjb25zdGFudHMKLShAcHhyZWZ7Q2hhcmFjdGVycywsQ2hhcmFjdGVyIENvbnN0YW50c30pLCBhbnkgd2hpdGVzcGFjZSBtZWFucyB0aGUgc2FtZQotYXMgZXhhY3RseSBvbmUgc3BhY2UuCi0KLUBub2RlIENvbW1lbnRzCi1Ac2VjdGlvbiBDb21tZW50cwotCi1AY2luZGV4IGNvbW1lbnRzCi1UaGVyZSBhcmUgdHdvIHdheXMgb2YgcmVuZGVyaW5nIGNvbW1lbnRzIHRvIEBjb2Rle0B2YWx1ZXtBU319LiAgSW4gYm90aAotY2FzZXMgdGhlIGNvbW1lbnQgaXMgZXF1aXZhbGVudCB0byBvbmUgc3BhY2UuCi0KLUFueXRoaW5nIGZyb20gQHNhbXB7Lyp9IHRocm91Z2ggdGhlIG5leHQgQHNhbXB7Ki99IGlzIGEgY29tbWVudC4KLVRoaXMgbWVhbnMgeW91IG1heSBub3QgbmVzdCB0aGVzZSBjb21tZW50cy4KLQotQHNtYWxsZXhhbXBsZQotLyoKLSAgVGhlIG9ubHkgd2F5IHRvIGluY2x1ZGUgYSBuZXdsaW5lICgnXG4nKSBpbiBhIGNvbW1lbnQKLSAgaXMgdG8gdXNlIHRoaXMgc29ydCBvZiBjb21tZW50LgotKi8KLQotLyogVGhpcyBzb3J0IG9mIGNvbW1lbnQgZG9lcyBub3QgbmVzdC4gKi8KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlcgotQW55dGhpbmcgZnJvbSB0aGUgQGRmbntsaW5lIGNvbW1lbnR9IGNoYXJhY3RlciB0byB0aGUgbmV4dCBuZXdsaW5lCi1pcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgaWdub3JlZC4gIFRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIGlzCi1AaWZzZXQgQTI5SwotQHNhbXB7O30gZm9yIHRoZSBBTUQgMjlLIGZhbWlseTsKLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLUBzYW1wezt9IG9uIHRoZSBBUkM7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvMzAwCi1Ac2FtcHs7fSBmb3IgdGhlIEg4LzMwMCBmYW1pbHk7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvNTAwCi1Ac2FtcHshfSBmb3IgdGhlIEg4LzUwMCBmYW1pbHk7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotQHNhbXB7O30gZm9yIHRoZSBIUFBBOwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUBzYW1weyN9IG9uIHRoZSBpOTYwOwotQGVuZCBpZnNldAotQGlmc2V0IFBKCi1Ac2FtcHs7fSBmb3IgcGljb0phdmE7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgU0gKLUBzYW1weyF9IGZvciB0aGUgSGl0YWNoaSBTSDsKLUBlbmQgaWZzZXQKLUBpZnNldCBTUEFSQwotQHNhbXB7IX0gb24gdGhlIFNQQVJDOwotQGVuZCBpZnNldAotQGlmc2V0IE0zMlIKLUBzYW1weyN9IG9uIHRoZSBtMzJyOwotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotQHNhbXB7fH0gb24gdGhlIDY4MHgwOwotQGVuZCBpZnNldAotQGlmc2V0IFZBWAotQHNhbXB7I30gb24gdGhlIFZheDsKLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotQHNhbXB7IX0gZm9yIHRoZSBaODAwMDsKLUBlbmQgaWZzZXQKLUBpZnNldCBWODUwCi1Ac2FtcHsjfSBvbiB0aGUgVjg1MDsKLUBlbmQgaWZzZXQKLXNlZSBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4gIEByZWZpbGwKLUBjIEZJWE1FIFdoYXQgYWJvdXQgaTM4NiwgbTg4aywgaTg2MD8KLQotQGlmc2V0IEdFTkVSSUMKLU9uIHNvbWUgbWFjaGluZXMgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgbGluZSBjb21tZW50IGNoYXJhY3RlcnMuICBPbmUKLWNoYXJhY3RlciBvbmx5IGJlZ2lucyBhIGNvbW1lbnQgaWYgaXQgaXMgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBvbgotYSBsaW5lLCB3aGlsZSB0aGUgb3RoZXIgYWx3YXlzIGJlZ2lucyBhIGNvbW1lbnQuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBWODUwCi1UaGUgVjg1MCBhc3NlbWJsZXIgYWxzbyBzdXBwb3J0cyBhIGRvdWJsZSBkYXNoIGFzIHN0YXJ0aW5nIGEgY29tbWVudCB0aGF0Ci1leHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCi0KLUBzYW1wey0tfTsKLUBlbmQgaWZzZXQKLQotQGtpbmRleCAjCi1AY2luZGV4IGxpbmVzIHN0YXJ0aW5nIHdpdGggQGNvZGV7I30KLUBjaW5kZXggbG9naWNhbCBsaW5lIG51bWJlcnMKLVRvIGJlIGNvbXBhdGlibGUgd2l0aCBwYXN0IGFzc2VtYmxlcnMsIGxpbmVzIHRoYXQgYmVnaW4gd2l0aCBAc2FtcHsjfSBoYXZlIGEKLXNwZWNpYWwgaW50ZXJwcmV0YXRpb24uICBGb2xsb3dpbmcgdGhlIEBzYW1weyN9IHNob3VsZCBiZSBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbiAoQHB4cmVme0V4cHJlc3Npb25zfSk6IHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyIG9mIHRoZSBAZW1waHtuZXh0fQotbGluZS4gIFRoZW4gYSBzdHJpbmcgKEBweHJlZntTdHJpbmdzLCwgU3RyaW5nc30pIGlzIGFsbG93ZWQ6IGlmIHByZXNlbnQgaXQgaXMgYQotbmV3IGxvZ2ljYWwgZmlsZSBuYW1lLiAgVGhlIHJlc3Qgb2YgdGhlIGxpbmUsIGlmIGFueSwgc2hvdWxkIGJlIHdoaXRlc3BhY2UuCi0KLUlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIG9uIHRoZSBsaW5lIGFyZSBub3QgbnVtZXJpYywKLXRoZSBsaW5lIGlzIGlnbm9yZWQuICAoSnVzdCBsaWtlIGEgY29tbWVudC4pCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIG9yZGluYXJ5IGNvbW1lbnQuCi0jIDQyLTYgIm5ld19maWxlX25hbWUiICAgICMgTmV3IGxvZ2ljYWwgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBsb2dpY2FsIGxpbmUgIyAzNi4KLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIGZlYXR1cmUgaXMgZGVwcmVjYXRlZCwgYW5kIG1heSBkaXNhcHBlYXIgZnJvbSBmdXR1cmUgdmVyc2lvbnMKLW9mIEBjb2Rle0B2YWx1ZXtBU319LgotCi1Abm9kZSBTeW1ib2wgSW50cm8KLUBzZWN0aW9uIFN5bWJvbHMKLQotQGNpbmRleCBjaGFyYWN0ZXJzIHVzZWQgaW4gc3ltYm9scwotQGlmY2xlYXIgU1BFQ0lBTC1TWU1TCi1BIEBkZm57c3ltYm9sfSBpcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGNob3NlbiBmcm9tIHRoZSBzZXQgb2YgYWxsCi1sZXR0ZXJzIChib3RoIHVwcGVyIGFuZCBsb3dlciBjYXNlKSwgZGlnaXRzIGFuZCB0aGUgdGhyZWUgY2hhcmFjdGVycwotQHNhbXB7Xy4kfS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IFNQRUNJQUwtU1lNUwotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4Ci1BIEBkZm57c3ltYm9sfSBpcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGNob3NlbiBmcm9tIHRoZSBzZXQgb2YgYWxsCi1sZXR0ZXJzIChib3RoIHVwcGVyIGFuZCBsb3dlciBjYXNlKSwgZGlnaXRzIGFuZCB0aGUgdGhyZWUgY2hhcmFjdGVycwotQHNhbXB7Ll8kfS4gIChTYXZlIHRoYXQsIG9uIHRoZSBIOC8zMDAgb25seSwgeW91IG1heSBub3QgdXNlIEBzYW1weyR9IGluCi1zeW1ib2wgbmFtZXMuKQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci1AaWZzZXQgR0VORVJJQwotT24gbW9zdCBtYWNoaW5lcywgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXM7IGV4Y2VwdGlvbnMKLWFyZSBub3RlZCBpbiBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLU5vIHN5bWJvbCBtYXkgYmVnaW4gd2l0aCBhIGRpZ2l0LiAgQ2FzZSBpcyBzaWduaWZpY2FudC4KLVRoZXJlIGlzIG5vIGxlbmd0aCBsaW1pdDogYWxsIGNoYXJhY3RlcnMgYXJlIHNpZ25pZmljYW50LiAgU3ltYm9scyBhcmUKLWRlbGltaXRlZCBieSBjaGFyYWN0ZXJzIG5vdCBpbiB0aGF0IHNldCwgb3IgYnkgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUKLShzaW5jZSB0aGUgc291cmNlIHByb2dyYW0gbXVzdCBlbmQgd2l0aCBhIG5ld2xpbmUsIHRoZSBlbmQgb2YgYSBmaWxlIGlzCi1ub3QgYSBwb3NzaWJsZSBzeW1ib2wgZGVsaW1pdGVyKS4gIEB4cmVme1N5bWJvbHN9LgotQGNpbmRleCBsZW5ndGggb2Ygc3ltYm9scwotCi1Abm9kZSBTdGF0ZW1lbnRzCi1Ac2VjdGlvbiBTdGF0ZW1lbnRzCi0KLUBjaW5kZXggc3RhdGVtZW50cywgc3RydWN0dXJlIG9mCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yIGNoYXJhY3RlcgotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yIGNoYXJhY3RlcgotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYWJub3JtYWwtc2VwYXJhdG9yCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYXQgYQotc2VtaWNvbG9uIChAc2FtcHs7fSkuICBUaGUgbmV3bGluZSBvciBzZW1pY29sb24gaXMgY29uc2lkZXJlZCBwYXJ0IG9mCi10aGUgcHJlY2VkaW5nIHN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBzZW1pY29sb25zIHdpdGhpbiBjaGFyYWN0ZXIKLWNvbnN0YW50cyBhcmUgYW4gZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IGFibm9ybWFsLXNlcGFyYXRvcgotQGlmc2V0IEEyOUsKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KSBvciBhbiBgYGF0JycKLXNpZ24gKEBzYW1we0BAfSkuICBUaGUgbmV3bGluZSBvciBhdCBzaWduIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUKLXByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgYXQgc2lnbnMgd2l0aGluIGNoYXJhY3RlciBjb25zdGFudHMKLWFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KSBvciBhbiBleGNsYW1hdGlvbiAKLXBvaW50IChAc2FtcHshfSkuICBUaGUgbmV3bGluZSBvciBleGNsYW1hdGlvbiBwb2ludCBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCi1wcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIGV4Y2xhbWF0aW9uIHBvaW50cyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KTsgb3IgKGZvciB0aGUKLUg4LzMwMCkgYSBkb2xsYXIgc2lnbiAoQHNhbXB7JH0pOyBvciAoZm9yIHRoZQotSGl0YWNoaS1TSCBvciB0aGUKLUg4LzUwMCkgYSBzZW1pY29sb24KLShAc2FtcHs7fSkuICBUaGUgbmV3bGluZSBvciBzZXBhcmF0b3IgY2hhcmFjdGVyIGlzIGNvbnNpZGVyZWQgcGFydCBvZgotdGhlIHByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgc2VwYXJhdG9ycyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgbGluZQotc2VwYXJhdG9yIGNoYXJhY3Rlci4gIChUaGUgbGluZSBzZXBhcmF0b3IgaXMgdXN1YWxseSBAc2FtcHs7fSwgdW5sZXNzCi10aGlzIGNvbmZsaWN0cyB3aXRoIHRoZSBjb21tZW50IGNoYXJhY3RlcjsgQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4pICBUaGUKLW5ld2xpbmUgb3Igc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByZWNlZGluZwotc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIHNlcGFyYXRvcnMgd2l0aGluIGNoYXJhY3RlciBjb25zdGFudHMgYXJlIGFuCi1leGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotCi1AY2luZGV4IG5ld2xpbmUsIHJlcXVpcmVkIGF0IGZpbGUgZW5kCi1AY2luZGV4IEVPRiwgbmV3bGluZSBtdXN0IHByZWNlZGUKLUl0IGlzIGFuIGVycm9yIHRvIGVuZCBhbnkgc3RhdGVtZW50IHdpdGggZW5kLW9mLWZpbGU6ICB0aGUgbGFzdAotY2hhcmFjdGVyIG9mIGFueSBpbnB1dCBmaWxlIHNob3VsZCBiZSBhIG5ld2xpbmUuQHJlZmlsbAotCi1BbiBlbXB0eSBzdGF0ZW1lbnQgaXMgYWxsb3dlZCwgYW5kIG1heSBpbmNsdWRlIHdoaXRlc3BhY2UuICBJdCBpcyBpZ25vcmVkLgotCi1AY2luZGV4IGluc3RydWN0aW9ucyBhbmQgZGlyZWN0aXZlcwotQGNpbmRleCBkaXJlY3RpdmVzIGFuZCBpbnN0cnVjdGlvbnMKLUBjICJrZXkgc3ltYm9sIiBpcyBub3QgdXNlZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50OyBzZWVtcyBwZWRhbnRpYyB0bwotQGMgQGRlZm57fSBpdCBpbiB0aGF0IGNhc2UsIGFzIHdhcyBkb25lIHByZXZpb3VzbHkuLi4gIGRvY0BjeWdudXMuY29tLAotQGMgMTNmZWI5MS4KLUEgc3RhdGVtZW50IGJlZ2lucyB3aXRoIHplcm8gb3IgbW9yZSBsYWJlbHMsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYQota2V5IHN5bWJvbCB3aGljaCBkZXRlcm1pbmVzIHdoYXQga2luZCBvZiBzdGF0ZW1lbnQgaXQgaXMuICBUaGUga2V5Ci1zeW1ib2wgZGV0ZXJtaW5lcyB0aGUgc3ludGF4IG9mIHRoZSByZXN0IG9mIHRoZSBzdGF0ZW1lbnQuICBJZiB0aGUKLXN5bWJvbCBiZWdpbnMgd2l0aCBhIGRvdCBAc2FtcHsufSB0aGVuIHRoZSBzdGF0ZW1lbnQgaXMgYW4gYXNzZW1ibGVyCi1kaXJlY3RpdmU6IHR5cGljYWxseSB2YWxpZCBmb3IgYW55IGNvbXB1dGVyLiAgSWYgdGhlIHN5bWJvbCBiZWdpbnMgd2l0aAotYSBsZXR0ZXIgdGhlIHN0YXRlbWVudCBpcyBhbiBhc3NlbWJseSBsYW5ndWFnZSBAZGZue2luc3RydWN0aW9ufTogaXQKLWFzc2VtYmxlcyBpbnRvIGEgbWFjaGluZSBsYW5ndWFnZSBpbnN0cnVjdGlvbi4KLUBpZnNldCBHRU5FUklDCi1EaWZmZXJlbnQgdmVyc2lvbnMgb2YgQGNvZGV7QHZhbHVle0FTfX0gZm9yIGRpZmZlcmVudCBjb21wdXRlcnMKLXJlY29nbml6ZSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zLiAgSW4gZmFjdCwgdGhlIHNhbWUgc3ltYm9sIG1heQotcmVwcmVzZW50IGEgZGlmZmVyZW50IGluc3RydWN0aW9uIGluIGEgZGlmZmVyZW50IGNvbXB1dGVyJ3MgYXNzZW1ibHkKLWxhbmd1YWdlLkByZWZpbGwKLUBlbmQgaWZzZXQKLQotQGNpbmRleCBAY29kZXs6fSAobGFiZWwpCi1AY2luZGV4IGxhYmVsIChAY29kZXs6fSkKLUEgbGFiZWwgaXMgYSBzeW1ib2wgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb2xvbiAoQGNvZGV7On0pLgotV2hpdGVzcGFjZSBiZWZvcmUgYSBsYWJlbCBvciBhZnRlciBhIGNvbG9uIGlzIHBlcm1pdHRlZCwgYnV0IHlvdSBtYXkgbm90Ci1oYXZlIHdoaXRlc3BhY2UgYmV0d2VlbiBhIGxhYmVsJ3Mgc3ltYm9sIGFuZCBpdHMgY29sb24uIEB4cmVme0xhYmVsc30uCi0KLUBpZnNldCBIUFBBCi1Gb3IgSFBQQSB0YXJnZXRzLCBsYWJlbHMgbmVlZCBub3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb2xvbiwgYnV0IAotdGhlIGRlZmluaXRpb24gb2YgYSBsYWJlbCBtdXN0IGJlZ2luIGluIGNvbHVtbiB6ZXJvLiAgVGhpcyBhbHNvIGltcGxpZXMgdGhhdAotb25seSBvbmUgbGFiZWwgbWF5IGJlIGRlZmluZWQgb24gZWFjaCBsaW5lLgotQGVuZCBpZnNldAotCi1Ac21hbGxleGFtcGxlCi1sYWJlbDogICAgIC5kaXJlY3RpdmUgICAgZm9sbG93ZWQgYnkgc29tZXRoaW5nCi1hbm90aGVyX2xhYmVsOiAgICAgICAgICAgIyBUaGlzIGlzIGFuIGVtcHR5IHN0YXRlbWVudC4KLSAgICAgICAgICAgaW5zdHJ1Y3Rpb24gICBvcGVyYW5kXzEsIG9wZXJhbmRfMiwgQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgQ29uc3RhbnRzCi1Ac2VjdGlvbiBDb25zdGFudHMKLQotQGNpbmRleCBjb25zdGFudHMKLUEgY29uc3RhbnQgaXMgYSBudW1iZXIsIHdyaXR0ZW4gc28gdGhhdCBpdHMgdmFsdWUgaXMga25vd24gYnkKLWluc3BlY3Rpb24sIHdpdGhvdXQga25vd2luZyBhbnkgY29udGV4dC4gIExpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotLmJ5dGUgIDc0LCAwMTEyLCAwOTIsIDB4NEEsIDBYNGEsICdKLCAnXEogIyBBbGwgdGhlIHNhbWUgdmFsdWUuCi0uYXNjaWkgIlJpbmcgdGhlIGJlbGxcNyIgICAgICAgICAgICAgICAgICAjIEEgc3RyaW5nIGNvbnN0YW50LgotLm9jdGEgIDB4MTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OUFCQ0RFRjAgIyBBIGJpZ251bS4KLS5mbG9hdCAwZi0zMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjdcCi05NTAyODg0MTk3MS42OTM5OTM3NTFFLTQwICAgICAgICAgICAgICAgICAjIC0gcGksIGEgZmxvbnVtLgotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG1lbnUKLSogQ2hhcmFjdGVyczo6ICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyIENvbnN0YW50cwotKiBOdW1iZXJzOjogICAgICAgICAgICAgICAgICAgICBOdW1iZXIgQ29uc3RhbnRzCi1AZW5kIG1lbnUKLQotQG5vZGUgQ2hhcmFjdGVycwotQHN1YnNlY3Rpb24gQ2hhcmFjdGVyIENvbnN0YW50cwotCi1AY2luZGV4IGNoYXJhY3RlciBjb25zdGFudHMKLUBjaW5kZXggY29uc3RhbnRzLCBjaGFyYWN0ZXIKLVRoZXJlIGFyZSB0d28ga2luZHMgb2YgY2hhcmFjdGVyIGNvbnN0YW50cy4gIEEgQGRmbntjaGFyYWN0ZXJ9IHN0YW5kcwotZm9yIG9uZSBjaGFyYWN0ZXIgaW4gb25lIGJ5dGUgYW5kIGl0cyB2YWx1ZSBtYXkgYmUgdXNlZCBpbgotbnVtZXJpYyBleHByZXNzaW9ucy4gIFN0cmluZyBjb25zdGFudHMgKHByb3Blcmx5IGNhbGxlZCBzdHJpbmcKLUBlbXBoe2xpdGVyYWxzfSkgYXJlIHBvdGVudGlhbGx5IG1hbnkgYnl0ZXMgYW5kIHRoZWlyIHZhbHVlcyBtYXkgbm90IGJlCi11c2VkIGluIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMuCi0KLUBtZW51Ci0qIFN0cmluZ3M6OiAgICAgICAgICAgICAgICAgICAgIFN0cmluZ3MKLSogQ2hhcnM6OiAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVycwotQGVuZCBtZW51Ci0KLUBub2RlIFN0cmluZ3MKLUBzdWJzdWJzZWN0aW9uIFN0cmluZ3MKLQotQGNpbmRleCBzdHJpbmcgY29uc3RhbnRzCi1AY2luZGV4IGNvbnN0YW50cywgc3RyaW5nCi1BIEBkZm57c3RyaW5nfSBpcyB3cml0dGVuIGJldHdlZW4gZG91YmxlLXF1b3Rlcy4gIEl0IG1heSBjb250YWluCi1kb3VibGUtcXVvdGVzIG9yIG51bGwgY2hhcmFjdGVycy4gIFRoZSB3YXkgdG8gZ2V0IHNwZWNpYWwgY2hhcmFjdGVycwotaW50byBhIHN0cmluZyBpcyB0byBAZGZue2VzY2FwZX0gdGhlc2UgY2hhcmFjdGVyczogcHJlY2VkZSB0aGVtIHdpdGgKLWEgYmFja3NsYXNoIEBzYW1we1x9IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlIEBzYW1we1xcfSByZXByZXNlbnRzCi1vbmUgYmFja3NsYXNoOiAgdGhlIGZpcnN0IEBjb2Rle1x9IGlzIGFuIGVzY2FwZSB3aGljaCB0ZWxscwotQGNvZGV7QHZhbHVle0FTfX0gdG8gaW50ZXJwcmV0IHRoZSBzZWNvbmQgY2hhcmFjdGVyIGxpdGVyYWxseSBhcyBhIGJhY2tzbGFzaAotKHdoaWNoIHByZXZlbnRzIEBjb2Rle0B2YWx1ZXtBU319IGZyb20gcmVjb2duaXppbmcgdGhlIHNlY29uZCBAY29kZXtcfSBhcyBhbgotZXNjYXBlIGNoYXJhY3RlcikuICBUaGUgY29tcGxldGUgbGlzdCBvZiBlc2NhcGVzIGZvbGxvd3MuCi0KLUBjaW5kZXggZXNjYXBlIGNvZGVzLCBjaGFyYWN0ZXIKLUBjaW5kZXggY2hhcmFjdGVyIGVzY2FwZSBjb2RlcwotQHRhYmxlIEBrYmQKLUBjICAgICAgQGl0ZW0gXGEKLUBjICAgICAgTW5lbW9uaWMgZm9yIEFDS25vd2xlZGdlOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAwNy4KLUBjCi1AY2luZGV4IEBjb2Rle1xifSAoYmFja3NwYWNlIGNoYXJhY3RlcikKLUBjaW5kZXggYmFja3NwYWNlIChAY29kZXtcYn0pCi1AaXRlbSBcYgotTW5lbW9uaWMgZm9yIGJhY2tzcGFjZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTAuCi0KLUBjICAgICAgQGl0ZW0gXGUKLUBjICAgICAgTW5lbW9uaWMgZm9yIEVPVGV4dDsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMDQuCi1AYwotQGNpbmRleCBAY29kZXtcZn0gKGZvcm1mZWVkIGNoYXJhY3RlcikKLUBjaW5kZXggZm9ybWZlZWQgKEBjb2Rle1xmfSkKLUBpdGVtIFxmCi1NbmVtb25pYyBmb3IgRm9ybUZlZWQ7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDE0LgotCi1AY2luZGV4IEBjb2Rle1xufSAobmV3bGluZSBjaGFyYWN0ZXIpCi1AY2luZGV4IG5ld2xpbmUgKEBjb2Rle1xufSkKLUBpdGVtIFxuCi1NbmVtb25pYyBmb3IgbmV3bGluZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTIuCi0KLUBjICAgICAgQGl0ZW0gXHAKLUBjICAgICAgTW5lbW9uaWMgZm9yIHByZWZpeDsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMzMsIHVzdWFsbHkga25vd24gYXMgQGNvZGV7ZXNjYXBlfS4KLUBjCi1AY2luZGV4IEBjb2Rle1xyfSAoY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlcikKLUBjaW5kZXggY2FycmlhZ2UgcmV0dXJuIChAY29kZXtccn0pCi1AaXRlbSBccgotTW5lbW9uaWMgZm9yIGNhcnJpYWdlLVJldHVybjsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTUuCi0KLUBjICAgICAgQGl0ZW0gXHMKLUBjICAgICAgTW5lbW9uaWMgZm9yIHNwYWNlOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDA0MC4gIEluY2x1ZGVkIGZvciBjb21wbGlhbmNlIHdpdGgKLUBjICAgICAgb3RoZXIgYXNzZW1ibGVycy4KLUBjCi1AY2luZGV4IEBjb2Rle1x0fSAodGFiKQotQGNpbmRleCB0YWIgKEBjb2Rle1x0fSkKLUBpdGVtIFx0Ci1NbmVtb25pYyBmb3IgaG9yaXpvbnRhbCBUYWI7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDExLgotCi1AYyAgICAgIEBpdGVtIFx2Ci1AYyAgICAgIE1uZW1vbmljIGZvciBWZXJ0aWNhbCB0YWI7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEzLgotQGMgICAgICBAaXRlbSBceCBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fQotQGMgICAgICBBIGhleGFkZWNpbWFsIGNoYXJhY3RlciBjb2RlLiAgVGhlIG51bWVyaWMgY29kZSBpcyAzIGhleGFkZWNpbWFsIGRpZ2l0cy4KLUBjCi1AY2luZGV4IEBjb2Rle1xAdmFye2RkZH19IChvY3RhbCBjaGFyYWN0ZXIgY29kZSkKLUBjaW5kZXggb2N0YWwgY2hhcmFjdGVyIGNvZGUgKEBjb2Rle1xAdmFye2RkZH19KQotQGl0ZW0gXCBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fQotQW4gb2N0YWwgY2hhcmFjdGVyIGNvZGUuICBUaGUgbnVtZXJpYyBjb2RlIGlzIDMgb2N0YWwgZGlnaXRzLgotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBVbml4IHN5c3RlbXMsIDggYW5kIDkgYXJlIGFjY2VwdGVkIGFzIGRpZ2l0czoKLWZvciBleGFtcGxlLCBAY29kZXtcMDA4fSBoYXMgdGhlIHZhbHVlIDAxMCwgYW5kIEBjb2Rle1wwMDl9IHRoZSB2YWx1ZSAwMTEuCi0KLUBjaW5kZXggQGNvZGV7XEB2YXJ7eGQuLi59fSAoaGV4IGNoYXJhY3RlciBjb2RlKQotQGNpbmRleCBoZXggY2hhcmFjdGVyIGNvZGUgKEBjb2Rle1xAdmFye3hkLi4ufX0pCi1AaXRlbSBcQGNvZGV7eH0gQHZhcntoZXgtZGlnaXRzLi4ufQotQSBoZXggY2hhcmFjdGVyIGNvZGUuICBBbGwgdHJhaWxpbmcgaGV4IGRpZ2l0cyBhcmUgY29tYmluZWQuICBFaXRoZXIgdXBwZXIgb3IKLWxvd2VyIGNhc2UgQGNvZGV7eH0gd29ya3MuCi0KLUBjaW5kZXggQGNvZGV7XFx9IChAc2FtcHtcfSBjaGFyYWN0ZXIpCi1AY2luZGV4IGJhY2tzbGFzaCAoQGNvZGV7XFx9KQotQGl0ZW0gXFwKLVJlcHJlc2VudHMgb25lIEBzYW1we1x9IGNoYXJhY3Rlci4KLQotQGMgICAgICBAaXRlbSBcJwotQGMgICAgICBSZXByZXNlbnRzIG9uZSBAc2FtcHsnfSAoYWNjZW50IGFjdXRlKSBjaGFyYWN0ZXIuCi1AYyAgICAgIFRoaXMgaXMgbmVlZGVkIGluIHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbHMKLUBjICAgICAgKEB4cmVme0NoYXJhY3RlcnMsLENoYXJhY3RlciBDb25zdGFudHN9LikgdG8gcmVwcmVzZW50Ci1AYyAgICAgIGEgQHNhbXB7J30uCi1AYwotQGNpbmRleCBAY29kZXtcIn0gKGRvdWJsZXF1b3RlIGNoYXJhY3RlcikKLUBjaW5kZXggZG91YmxlcXVvdGUgKEBjb2Rle1wifSkKLUBpdGVtIFwiCi1SZXByZXNlbnRzIG9uZSBAc2FtcHsifSBjaGFyYWN0ZXIuICBOZWVkZWQgaW4gc3RyaW5ncyB0byByZXByZXNlbnQKLXRoaXMgY2hhcmFjdGVyLCBiZWNhdXNlIGFuIHVuZXNjYXBlZCBAc2FtcHsifSB3b3VsZCBlbmQgdGhlIHN0cmluZy4KLQotQGl0ZW0gXCBAdmFye2FueXRoaW5nLWVsc2V9Ci1Bbnkgb3RoZXIgY2hhcmFjdGVyIHdoZW4gZXNjYXBlZCBieSBAa2Jke1x9IGdpdmVzIGEgd2FybmluZywgYnV0Ci1hc3NlbWJsZXMgYXMgaWYgdGhlIEBzYW1we1x9IHdhcyBub3QgcHJlc2VudC4gIFRoZSBpZGVhIGlzIHRoYXQgaWYKLXlvdSB1c2VkIGFuIGVzY2FwZSBzZXF1ZW5jZSB5b3UgY2xlYXJseSBkaWRuJ3Qgd2FudCB0aGUgbGl0ZXJhbAotaW50ZXJwcmV0YXRpb24gb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIuICBIb3dldmVyIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBubwotb3RoZXIgaW50ZXJwcmV0YXRpb24sIHNvIEBjb2Rle0B2YWx1ZXtBU319IGtub3dzIGl0IGlzIGdpdmluZyB5b3UgdGhlIHdyb25nCi1jb2RlIGFuZCB3YXJucyB5b3Ugb2YgdGhlIGZhY3QuCi1AZW5kIHRhYmxlCi0KLVdoaWNoIGNoYXJhY3RlcnMgYXJlIGVzY2FwYWJsZSwgYW5kIHdoYXQgdGhvc2UgZXNjYXBlcyByZXByZXNlbnQsCi12YXJpZXMgd2lkZWx5IGFtb25nIGFzc2VtYmxlcnMuICBUaGUgY3VycmVudCBzZXQgaXMgd2hhdCB3ZSB0aGluawotdGhlIEJTRCA0LjIgYXNzZW1ibGVyIHJlY29nbml6ZXMsIGFuZCBpcyBhIHN1YnNldCBvZiB3aGF0IG1vc3QgQwotY29tcGlsZXJzIHJlY29nbml6ZS4gIElmIHlvdSBhcmUgaW4gZG91YnQsIGRvIG5vdCB1c2UgYW4gZXNjYXBlCi1zZXF1ZW5jZS4KLQotQG5vZGUgQ2hhcnMKLUBzdWJzdWJzZWN0aW9uIENoYXJhY3RlcnMKLQotQGNpbmRleCBzaW5nbGUgY2hhcmFjdGVyIGNvbnN0YW50Ci1AY2luZGV4IGNoYXJhY3Rlciwgc2luZ2xlCi1AY2luZGV4IGNvbnN0YW50LCBzaW5nbGUgY2hhcmFjdGVyCi1BIHNpbmdsZSBjaGFyYWN0ZXIgbWF5IGJlIHdyaXR0ZW4gYXMgYSBzaW5nbGUgcXVvdGUgaW1tZWRpYXRlbHkKLWZvbGxvd2VkIGJ5IHRoYXQgY2hhcmFjdGVyLiAgVGhlIHNhbWUgZXNjYXBlcyBhcHBseSB0byBjaGFyYWN0ZXJzIGFzCi10byBzdHJpbmdzLiAgU28gaWYgeW91IHdhbnQgdG8gd3JpdGUgdGhlIGNoYXJhY3RlciBiYWNrc2xhc2gsIHlvdQotbXVzdCB3cml0ZSBAa2JkeydcXH0gd2hlcmUgdGhlIGZpcnN0IEBjb2Rle1x9IGVzY2FwZXMgdGhlIHNlY29uZAotQGNvZGV7XH0uICBBcyB5b3UgY2FuIHNlZSwgdGhlIHF1b3RlIGlzIGFuIGFjdXRlIGFjY2VudCwgbm90IGEKLWdyYXZlIGFjY2VudC4gIEEgbmV3bGluZQotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYWJub3JtYWwtc2VwYXJhdG9yCi0ob3Igc2VtaWNvbG9uIEBzYW1wezt9KQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgYWJub3JtYWwtc2VwYXJhdG9yCi1AaWZzZXQgQTI5SwotKG9yIGF0IHNpZ24gQHNhbXB7QEB9KQotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci0ob3IgZG9sbGFyIHNpZ24gQHNhbXB7JH0sIGZvciB0aGUgSDgvMzAwOyBvciBzZW1pY29sb24gQHNhbXB7O30gZm9yIHRoZQotSGl0YWNoaSBTSCBvcgotSDgvNTAwKQotQGVuZCBpZnNldAotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1pbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gYWN1dGUgYWNjZW50IGlzIHRha2VuIGFzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIKLWFuZCBkb2VzIG5vdCBjb3VudCBhcyB0aGUgZW5kIG9mIGEgc3RhdGVtZW50LiAgVGhlIHZhbHVlIG9mIGEgY2hhcmFjdGVyCi1jb25zdGFudCBpbiBhIG51bWVyaWMgZXhwcmVzc2lvbiBpcyB0aGUgbWFjaGluZSdzIGJ5dGUtd2lkZSBjb2RlIGZvcgotdGhhdCBjaGFyYWN0ZXIuICBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIHlvdXIgY2hhcmFjdGVyIGNvZGUgaXMgQVNDSUk6Ci1Aa2JkeydBfSBtZWFucyA2NSwgQGtiZHsnQn0gbWVhbnMgNjYsIGFuZCBzbyBvbi4gQHJlZmlsbAotCi1Abm9kZSBOdW1iZXJzCi1Ac3Vic2VjdGlvbiBOdW1iZXIgQ29uc3RhbnRzCi0KLUBjaW5kZXggY29uc3RhbnRzLCBudW1iZXIKLUBjaW5kZXggbnVtYmVyIGNvbnN0YW50cwotQGNvZGV7QHZhbHVle0FTfX0gZGlzdGluZ3Vpc2hlcyB0aHJlZSBraW5kcyBvZiBudW1iZXJzIGFjY29yZGluZyB0byBob3cgdGhleQotYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBAZW1waHtJbnRlZ2Vyc30gYXJlIG51bWJlcnMgdGhhdAotd291bGQgZml0IGludG8gYW4gQGNvZGV7aW50fSBpbiB0aGUgQyBsYW5ndWFnZS4gIEBlbXBoe0JpZ251bXN9IGFyZQotaW50ZWdlcnMsIGJ1dCB0aGV5IGFyZSBzdG9yZWQgaW4gbW9yZSB0aGFuIDMyIGJpdHMuICBAZW1waHtGbG9udW1zfQotYXJlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGRlc2NyaWJlZCBiZWxvdy4KLQotQG1lbnUKLSogSW50ZWdlcnM6OiAgICAgICAgICAgICAgICAgICAgSW50ZWdlcnMKLSogQmlnbnVtczo6ICAgICAgICAgICAgICAgICAgICAgQmlnbnVtcwotKiBGbG9udW1zOjogICAgICAgICAgICAgICAgICAgICBGbG9udW1zCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSTk2MAotKiBCaXQgRmllbGRzOjogICAgICAgICAgICAgICAgICBCaXQgRmllbGRzCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBlbmQgbWVudQotCi1Abm9kZSBJbnRlZ2VycwotQHN1YnN1YnNlY3Rpb24gSW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMKLUBjaW5kZXggY29uc3RhbnRzLCBpbnRlZ2VyCi0KLUBjaW5kZXggYmluYXJ5IGludGVnZXJzCi1AY2luZGV4IGludGVnZXJzLCBiaW5hcnkKLUEgYmluYXJ5IGludGVnZXIgaXMgQHNhbXB7MGJ9IG9yIEBzYW1wezBCfSBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgb2YKLXRoZSBiaW5hcnkgZGlnaXRzIEBzYW1wezAxfS4KLQotQGNpbmRleCBvY3RhbCBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2Vycywgb2N0YWwKLUFuIG9jdGFsIGludGVnZXIgaXMgQHNhbXB7MH0gZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIG9mIHRoZSBvY3RhbAotZGlnaXRzIChAc2FtcHswMTIzNDU2N30pLgotCi1AY2luZGV4IGRlY2ltYWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIGRlY2ltYWwKLUEgZGVjaW1hbCBpbnRlZ2VyIHN0YXJ0cyB3aXRoIGEgbm9uLXplcm8gZGlnaXQgZm9sbG93ZWQgYnkgemVybyBvcgotbW9yZSBkaWdpdHMgKEBzYW1wezAxMjM0NTY3ODl9KS4KLQotQGNpbmRleCBoZXhhZGVjaW1hbCBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2VycywgaGV4YWRlY2ltYWwKLUEgaGV4YWRlY2ltYWwgaW50ZWdlciBpcyBAc2FtcHsweH0gb3IgQHNhbXB7MFh9IGZvbGxvd2VkIGJ5IG9uZSBvcgotbW9yZSBoZXhhZGVjaW1hbCBkaWdpdHMgY2hvc2VuIGZyb20gQHNhbXB7MDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRn0uCi0KLUludGVnZXJzIGhhdmUgdGhlIHVzdWFsIHZhbHVlcy4gIFRvIGRlbm90ZSBhIG5lZ2F0aXZlIGludGVnZXIsIHVzZQotdGhlIHByZWZpeCBvcGVyYXRvciBAc2FtcHstfSBkaXNjdXNzZWQgdW5kZXIgZXhwcmVzc2lvbnMKLShAcHhyZWZ7UHJlZml4IE9wcywsUHJlZml4IE9wZXJhdG9yc30pLgotCi1Abm9kZSBCaWdudW1zCi1Ac3Vic3Vic2VjdGlvbiBCaWdudW1zCi0KLUBjaW5kZXggYmlnbnVtcwotQGNpbmRleCBjb25zdGFudHMsIGJpZ251bQotQSBAZGZue2JpZ251bX0gaGFzIHRoZSBzYW1lIHN5bnRheCBhbmQgc2VtYW50aWNzIGFzIGFuIGludGVnZXIKLWV4Y2VwdCB0aGF0IHRoZSBudW1iZXIgKG9yIGl0cyBuZWdhdGl2ZSkgdGFrZXMgbW9yZSB0aGFuIDMyIGJpdHMgdG8KLXJlcHJlc2VudCBpbiBiaW5hcnkuICBUaGUgZGlzdGluY3Rpb24gaXMgbWFkZSBiZWNhdXNlIGluIHNvbWUgcGxhY2VzCi1pbnRlZ2VycyBhcmUgcGVybWl0dGVkIHdoaWxlIGJpZ251bXMgYXJlIG5vdC4KLQotQG5vZGUgRmxvbnVtcwotQHN1YnN1YnNlY3Rpb24gRmxvbnVtcwotQGNpbmRleCBmbG9udW1zCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMKLUBjaW5kZXggY29uc3RhbnRzLCBmbG9hdGluZyBwb2ludAotCi1AY2luZGV4IHByZWNpc2lvbiwgZmxvYXRpbmcgcG9pbnQKLUEgQGRmbntmbG9udW19IHJlcHJlc2VudHMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICBUaGUgdHJhbnNsYXRpb24gaXMKLWluZGlyZWN0OiBhIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGZyb20gdGhlIHRleHQgaXMgY29udmVydGVkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fSB0byBhIGdlbmVyaWMgYmluYXJ5IGZsb2F0aW5nIHBvaW50IG51bWJlciBvZiBtb3JlIHRoYW4KLXN1ZmZpY2llbnQgcHJlY2lzaW9uLiAgVGhpcyBnZW5lcmljIGZsb2F0aW5nIHBvaW50IG51bWJlciBpcyBjb252ZXJ0ZWQKLXRvIGEgcGFydGljdWxhciBjb21wdXRlcidzIGZsb2F0aW5nIHBvaW50IGZvcm1hdCAob3IgZm9ybWF0cykgYnkgYQotcG9ydGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBzcGVjaWFsaXplZCB0byB0aGF0IGNvbXB1dGVyLgotCi1BIGZsb251bSBpcyB3cml0dGVuIGJ5IHdyaXRpbmcgKGluIG9yZGVyKQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBkaWdpdCBAc2FtcHswfS4KLUBpZnNldCBIUFBBCi0oQHNhbXB7MH0gaXMgb3B0aW9uYWwgb24gdGhlIEhQUEEuKQotQGVuZCBpZnNldAotCi1AaXRlbQotQSBsZXR0ZXIsIHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0gdGhlIHJlc3Qgb2YgdGhlIG51bWJlciBpcyBhIGZsb251bS4KLUBpZnNldCBHRU5FUklDCi1Aa2Jke2V9IGlzIHJlY29tbWVuZGVkLiAgQ2FzZSBpcyBub3QgaW1wb3J0YW50LgotQGlnbm9yZQotQGMgRklYTUU6IHZlcmlmeSBpZiBmbG9udW0gc3ludGF4IHJlYWxseSB0aGlzIHZhZ3VlIGZvciBtb3N0IGNhc2VzCi0oQW55IG90aGVyd2lzZSBpbGxlZ2FsIGxldHRlciB3b3JrcyBoZXJlLCBidXQgdGhhdCBtaWdodCBiZSBjaGFuZ2VkLiAgVmF4IEJTRAotNC4yIGFzc2VtYmxlciBzZWVtcyB0byBhbGxvdyBhbnkgb2YgQHNhbXB7ZGVmZ2hERUZHSH0uKQotQGVuZCBpZ25vcmUKLQotT24gdGhlIEg4LzMwMCwgSDgvNTAwLAotSGl0YWNoaSBTSCwKLWFuZCBBTUQgMjlLIGFyY2hpdGVjdHVyZXMsIHRoZSBsZXR0ZXIgbXVzdCBiZQotb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotCi1PbiB0aGUgQVJDLCB0aGUgbGV0dGVyIG11c3QgYmUgb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUlN9Ci0oaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi0KLU9uIHRoZSBJbnRlbCA5NjAgYXJjaGl0ZWN0dXJlLCB0aGUgbGV0dGVyIG11c3QgYmUKLW9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlR9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLQotT24gdGhlIEhQUEEgYXJjaGl0ZWN0dXJlLCB0aGUgbGV0dGVyIG11c3QgYmUgQHNhbXB7RX0gKHVwcGVyIGNhc2Ugb25seSkuCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgQTI5SwotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUlN9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBIOAotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLVRoZSBsZXR0ZXIgQHNhbXB7RX0gKHVwcGVyIGNhc2Ugb25seSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGVH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBzaWduOiBlaXRoZXIgQHNhbXB7K30gb3IgQHNhbXB7LX0uCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBAZGZue2ludGVnZXIgcGFydH06IHplcm8gb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLQotQGl0ZW0KLUFuIG9wdGlvbmFsIEBkZm57ZnJhY3Rpb25hbCBwYXJ0fTogQHNhbXB7Ln0gZm9sbG93ZWQgYnkgemVybwotb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLQotQGl0ZW0KLUFuIG9wdGlvbmFsIGV4cG9uZW50LCBjb25zaXN0aW5nIG9mOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQW4gQHNhbXB7RX0gb3IgQHNhbXB7ZX0uCi1AYyBJIGNhbid0IGZpbmQgYSBjb25maWcgd2hlcmUgIkVYUF9DSEFSUyIgaXMgb3RoZXIgdGhhbiAnZUUnLCBidXQgaW4KLUBjIHByaW5jaXBsZSB0aGlzIGNhbiBwZXJmZWN0bHkgd2VsbCBiZSBkaWZmZXJlbnQgb24gZGlmZmVyZW50IHRhcmdldHMuCi1AaXRlbQotT3B0aW9uYWwgc2lnbjogZWl0aGVyIEBzYW1weyt9IG9yIEBzYW1wey19LgotQGl0ZW0KLU9uZSBvciBtb3JlIGRlY2ltYWwgZGlnaXRzLgotQGVuZCBpdGVtaXplCi0KLUBlbmQgaXRlbWl6ZQotCi1BdCBsZWFzdCBvbmUgb2YgdGhlIGludGVnZXIgcGFydCBvciB0aGUgZnJhY3Rpb25hbCBwYXJ0IG11c3QgYmUKLXByZXNlbnQuICBUaGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGhhcyB0aGUgdXN1YWwgYmFzZS0xMCB2YWx1ZS4KLQotQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBhbGwgcHJvY2Vzc2luZyB1c2luZyBpbnRlZ2Vycy4gIEZsb251bXMgYXJlIGNvbXB1dGVkCi1pbmRlcGVuZGVudGx5IG9mIGFueSBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSBpbiB0aGUgY29tcHV0ZXIgcnVubmluZwotQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJOTYwCi1AYyBCaXQgZmllbGRzIGFyZSB3cml0dGVuIGFzIGEgZ2VuZXJhbCBmYWNpbGl0eSBidXQgYXJlIGFsc28gY29udHJvbGxlZAotQGMgYnkgYSBjb25kaXRpb25hbC1jb21waWxhdGlvbiBmbGFnLS0td2hpY2ggaXMgYXMgb2Ygbm93ICgyMW1hcjkxKQotQGMgdHVybmVkIG9uIG9ubHkgYnkgdGhlIGk5NjAgY29uZmlnIG9mIEdBUy4KLUBub2RlIEJpdCBGaWVsZHMKLUBzdWJzdWJzZWN0aW9uIEJpdCBGaWVsZHMKLQotQGNpbmRleCBiaXQgZmllbGRzCi1AY2luZGV4IGNvbnN0YW50cywgYml0IGZpZWxkCi1Zb3UgY2FuIGFsc28gZGVmaW5lIG51bWVyaWMgY29uc3RhbnRzIGFzIEBkZm57Yml0IGZpZWxkc30uCi1zcGVjaWZ5IHR3byBudW1iZXJzIHNlcGFyYXRlZCBieSBhIGNvbG9uLS0tCi1AZXhhbXBsZQotQHZhcnttYXNrfTpAdmFye3ZhbHVlfQotQGVuZCBleGFtcGxlCi1Abm9pbmRlbnQKLUBjb2Rle0B2YWx1ZXtBU319IGFwcGxpZXMgYSBiaXR3aXNlIEBzY3thbmR9IGJldHdlZW4gQHZhcnttYXNrfSBhbmQKLUB2YXJ7dmFsdWV9LgotCi1UaGUgcmVzdWx0aW5nIG51bWJlciBpcyB0aGVuIHBhY2tlZAotQGlmc2V0IEdFTkVSSUMKLUBjIHRoaXMgY29uZGl0aW9uYWwgcGFyZW4gaW4gY2FzZSBiaXQgZmllbGRzIHR1cm5lZCBvbiBlbHNld2hlcmUgdGhhbiA5NjAKLShpbiBob3N0LWRlcGVuZGVudCBieXRlIG9yZGVyKQotQGVuZCBpZnNldAotaW50byBhIGZpZWxkIHdob3NlIHdpZHRoIGRlcGVuZHMgb24gd2hpY2ggYXNzZW1ibGVyIGRpcmVjdGl2ZSBoYXMgdGhlCi1iaXQtZmllbGQgYXMgaXRzIGFyZ3VtZW50LiAgT3ZlcmZsb3cgKGEgcmVzdWx0IGZyb20gdGhlIGJpdHdpc2UgYW5kCi1yZXF1aXJpbmcgbW9yZSBiaW5hcnkgZGlnaXRzIHRvIHJlcHJlc2VudCkgaXMgbm90IGFuIGVycm9yOyBpbnN0ZWFkLAotbW9yZSBjb25zdGFudHMgYXJlIGdlbmVyYXRlZCwgb2YgdGhlIHNwZWNpZmllZCB3aWR0aCwgYmVnaW5uaW5nIHdpdGggdGhlCi1sZWFzdCBzaWduaWZpY2FudCBkaWdpdHMuQHJlZmlsbAotCi1UaGUgZGlyZWN0aXZlcyBAY29kZXsuYnl0ZX0sIEBjb2Rley5od29yZH0sIEBjb2Rley5pbnR9LCBAY29kZXsubG9uZ30sCi1AY29kZXsuc2hvcnR9LCBhbmQgQGNvZGV7LndvcmR9IGFjY2VwdCBiaXQtZmllbGQgYXJndW1lbnRzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIFNlY3Rpb25zCi1AY2hhcHRlciBTZWN0aW9ucyBhbmQgUmVsb2NhdGlvbgotQGNpbmRleCBzZWN0aW9ucwotQGNpbmRleCByZWxvY2F0aW9uCi0KLUBtZW51Ci0qIFNlY3MgQmFja2dyb3VuZDo6ICAgICAgICAgICAgIEJhY2tncm91bmQKLSogTGQgU2VjdGlvbnM6OiAgICAgICAgICAgICAgICAgTGlua2VyIFNlY3Rpb25zCi0qIEFzIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgIEFzc2VtYmxlciBJbnRlcm5hbCBTZWN0aW9ucwotKiBTdWItU2VjdGlvbnM6OiAgICAgICAgICAgICAgICBTdWItU2VjdGlvbnMKLSogYnNzOjogICAgICAgICAgICAgICAgICAgICAgICAgYnNzIFNlY3Rpb24KLUBlbmQgbWVudQotCi1Abm9kZSBTZWNzIEJhY2tncm91bmQKLUBzZWN0aW9uIEJhY2tncm91bmQKLQotUm91Z2hseSwgYSBzZWN0aW9uIGlzIGEgcmFuZ2Ugb2YgYWRkcmVzc2VzLCB3aXRoIG5vIGdhcHM7IGFsbCBkYXRhCi1gYGluJycgdGhvc2UgYWRkcmVzc2VzIGlzIHRyZWF0ZWQgdGhlIHNhbWUgZm9yIHNvbWUgcGFydGljdWxhciBwdXJwb3NlLgotRm9yIGV4YW1wbGUgdGhlcmUgbWF5IGJlIGEgYGByZWFkIG9ubHknJyBzZWN0aW9uLgotCi1AY2luZGV4IGxpbmtlciwgYW5kIGFzc2VtYmxlcgotQGNpbmRleCBhc3NlbWJsZXIsIGFuZCBsaW5rZXIKLVRoZSBsaW5rZXIgQGNvZGV7QHZhbHVle0xEfX0gcmVhZHMgbWFueSBvYmplY3QgZmlsZXMgKHBhcnRpYWwgcHJvZ3JhbXMpIGFuZAotY29tYmluZXMgdGhlaXIgY29udGVudHMgdG8gZm9ybSBhIHJ1bm5hYmxlIHByb2dyYW0uICBXaGVuIEBjb2Rle0B2YWx1ZXtBU319Ci1lbWl0cyBhbiBvYmplY3QgZmlsZSwgdGhlIHBhcnRpYWwgcHJvZ3JhbSBpcyBhc3N1bWVkIHRvIHN0YXJ0IGF0IGFkZHJlc3MgMC4KLUBjb2Rle0B2YWx1ZXtMRH19IGFzc2lnbnMgdGhlIGZpbmFsIGFkZHJlc3NlcyBmb3IgdGhlIHBhcnRpYWwgcHJvZ3JhbSwgc28gdGhhdAotZGlmZmVyZW50IHBhcnRpYWwgcHJvZ3JhbXMgZG8gbm90IG92ZXJsYXAuICBUaGlzIGlzIGFjdHVhbGx5IGFuCi1vdmVyc2ltcGxpZmljYXRpb24sIGJ1dCBpdCBzdWZmaWNlcyB0byBleHBsYWluIGhvdyBAY29kZXtAdmFsdWV7QVN9fSB1c2VzCi1zZWN0aW9ucy4KLQotQGNvZGV7QHZhbHVle0xEfX0gbW92ZXMgYmxvY2tzIG9mIGJ5dGVzIG9mIHlvdXIgcHJvZ3JhbSB0byB0aGVpciBydW4tdGltZQotYWRkcmVzc2VzLiAgVGhlc2UgYmxvY2tzIHNsaWRlIHRvIHRoZWlyIHJ1bi10aW1lIGFkZHJlc3NlcyBhcyByaWdpZAotdW5pdHM7IHRoZWlyIGxlbmd0aCBkb2VzIG5vdCBjaGFuZ2UgYW5kIG5laXRoZXIgZG9lcyB0aGUgb3JkZXIgb2YgYnl0ZXMKLXdpdGhpbiB0aGVtLiAgU3VjaCBhIHJpZ2lkIHVuaXQgaXMgY2FsbGVkIGEgQGVtcGh7c2VjdGlvbn0uICBBc3NpZ25pbmcKLXJ1bi10aW1lIGFkZHJlc3NlcyB0byBzZWN0aW9ucyBpcyBjYWxsZWQgQGRmbntyZWxvY2F0aW9ufS4gIEl0IGluY2x1ZGVzCi10aGUgdGFzayBvZiBhZGp1c3RpbmcgbWVudGlvbnMgb2Ygb2JqZWN0LWZpbGUgYWRkcmVzc2VzIHNvIHRoZXkgcmVmZXIgdG8KLXRoZSBwcm9wZXIgcnVuLXRpbWUgYWRkcmVzc2VzLgotQGlmc2V0IEg4Ci1Gb3IgdGhlIEg4LzMwMCBhbmQgSDgvNTAwLAotYW5kIGZvciB0aGUgSGl0YWNoaSBTSCwKLUBjb2Rle0B2YWx1ZXtBU319IHBhZHMgc2VjdGlvbnMgaWYgbmVlZGVkIHRvCi1lbnN1cmUgdGhleSBlbmQgb24gYSB3b3JkIChzaXh0ZWVuIGJpdCkgYm91bmRhcnkuCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggc3RhbmRhcmQgYXNzZW1ibGVyIHNlY3Rpb25zCi1BbiBvYmplY3QgZmlsZSB3cml0dGVuIGJ5IEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhdCBsZWFzdCB0aHJlZSBzZWN0aW9ucywgYW55Ci1vZiB3aGljaCBtYXkgYmUgZW1wdHkuICBUaGVzZSBhcmUgbmFtZWQgQGRmbnt0ZXh0fSwgQGRmbntkYXRhfSBhbmQKLUBkZm57YnNzfSBzZWN0aW9ucy4KLQotQGlmc2V0IENPRkYKLUBpZnNldCBHRU5FUklDCi1XaGVuIGl0IGdlbmVyYXRlcyBDT0ZGIG91dHB1dCwKLUBlbmQgaWZzZXQKLUBjb2Rle0B2YWx1ZXtBU319IGNhbiBhbHNvIGdlbmVyYXRlIHdoYXRldmVyIG90aGVyIG5hbWVkIHNlY3Rpb25zIHlvdSBzcGVjaWZ5Ci11c2luZyB0aGUgQHNhbXB7LnNlY3Rpb259IGRpcmVjdGl2ZSAoQHB4cmVme1NlY3Rpb24sLEBjb2Rley5zZWN0aW9ufX0pLgotSWYgeW91IGRvIG5vdCB1c2UgYW55IGRpcmVjdGl2ZXMgdGhhdCBwbGFjZSBvdXRwdXQgaW4gdGhlIEBzYW1wey50ZXh0fQotb3IgQHNhbXB7LmRhdGF9IHNlY3Rpb25zLCB0aGVzZSBzZWN0aW9ucyBzdGlsbCBleGlzdCwgYnV0IGFyZSBlbXB0eS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLUBpZnNldCBHRU5FUklDCi1XaGVuIEBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBTT00gb3IgRUxGIG91dHB1dCBmb3IgdGhlIEhQUEEsCi1AZW5kIGlmc2V0Ci1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYWxzbyBnZW5lcmF0ZSB3aGF0ZXZlciBvdGhlciBuYW1lZCBzZWN0aW9ucyB5b3UKLXNwZWNpZnkgdXNpbmcgdGhlIEBzYW1wey5zcGFjZX0gYW5kIEBzYW1wey5zdWJzcGFjZX0gZGlyZWN0aXZlcy4gIFNlZQotQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAgQXNzZW1ibHkgTGFuZ3VhZ2UgUmVmZXJlbmNlIE1hbnVhbH0KLShIUCA5MjQzMi05MDAwMSkgZm9yIGRldGFpbHMgb24gdGhlIEBzYW1wey5zcGFjZX0gYW5kIEBzYW1wey5zdWJzcGFjZX0KLWFzc2VtYmxlciBkaXJlY3RpdmVzLgotCi1AaWZzZXQgU09NCi1BZGRpdGlvbmFsbHksIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgc3RhbmRhcmQKLXRleHQsIGRhdGEsIGFuZCBic3Mgc2VjdGlvbnMgd2hlbiBnZW5lcmF0aW5nIFNPTSBvdXRwdXQuICBQcm9ncmFtIHRleHQKLWlzIHBsYWNlZCBpbnRvIHRoZSBAc2FtcHskQ09ERSR9IHNlY3Rpb24sIGRhdGEgaW50byBAc2FtcHskREFUQSR9LCBhbmQKLUJTUyBpbnRvIEBzYW1weyRCU1MkfS4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotV2l0aGluIHRoZSBvYmplY3QgZmlsZSwgdGhlIHRleHQgc2VjdGlvbiBzdGFydHMgYXQgYWRkcmVzcyBAY29kZXswfSwgdGhlCi1kYXRhIHNlY3Rpb24gZm9sbG93cywgYW5kIHRoZSBic3Mgc2VjdGlvbiBmb2xsb3dzIHRoZSBkYXRhIHNlY3Rpb24uCi0KLUBpZnNldCBIUFBBCi1XaGVuIGdlbmVyYXRpbmcgZWl0aGVyIFNPTSBvciBFTEYgb3V0cHV0IGZpbGVzIG9uIHRoZSBIUFBBLCB0aGUgdGV4dAotc2VjdGlvbiBzdGFydHMgYXQgYWRkcmVzcyBAY29kZXswfSwgdGhlIGRhdGEgc2VjdGlvbiBhdCBhZGRyZXNzCi1AY29kZXsweDQwMDAwMDB9LCBhbmQgdGhlIGJzcyBzZWN0aW9uIGZvbGxvd3MgdGhlIGRhdGEgc2VjdGlvbi4KLUBlbmQgaWZzZXQKLQotVG8gbGV0IEBjb2Rle0B2YWx1ZXtMRH19IGtub3cgd2hpY2ggZGF0YSBjaGFuZ2VzIHdoZW4gdGhlIHNlY3Rpb25zIGFyZQotcmVsb2NhdGVkLCBhbmQgaG93IHRvIGNoYW5nZSB0aGF0IGRhdGEsIEBjb2Rle0B2YWx1ZXtBU319IGFsc28gd3JpdGVzIHRvIHRoZQotb2JqZWN0IGZpbGUgZGV0YWlscyBvZiB0aGUgcmVsb2NhdGlvbiBuZWVkZWQuICBUbyBwZXJmb3JtIHJlbG9jYXRpb24KLUBjb2Rle0B2YWx1ZXtMRH19IG11c3Qga25vdywgZWFjaCB0aW1lIGFuIGFkZHJlc3MgaW4gdGhlIG9iamVjdAotZmlsZSBpcyBtZW50aW9uZWQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotV2hlcmUgaW4gdGhlIG9iamVjdCBmaWxlIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyByZWZlcmVuY2UgdG8KLWFuIGFkZHJlc3M/Ci1AaXRlbQotSG93IGxvbmcgKGluIGJ5dGVzKSBpcyB0aGlzIHJlZmVyZW5jZT8KLUBpdGVtCi1XaGljaCBzZWN0aW9uIGRvZXMgdGhlIGFkZHJlc3MgcmVmZXIgdG8/ICBXaGF0IGlzIHRoZSBudW1lcmljIHZhbHVlIG9mCi1AZGlzcGxheQotKEB2YXJ7YWRkcmVzc30pIEBtaW51c3t9IChAdmFye3N0YXJ0LWFkZHJlc3Mgb2Ygc2VjdGlvbn0pPwotQGVuZCBkaXNwbGF5Ci1AaXRlbQotSXMgdGhlIHJlZmVyZW5jZSB0byBhbiBhZGRyZXNzIGBgUHJvZ3JhbS1Db3VudGVyIHJlbGF0aXZlJyc/Ci1AZW5kIGl0ZW1pemUKLQotQGNpbmRleCBhZGRyZXNzZXMsIGZvcm1hdCBvZgotQGNpbmRleCBzZWN0aW9uLXJlbGF0aXZlIGFkZHJlc3NpbmcKLUluIGZhY3QsIGV2ZXJ5IGFkZHJlc3MgQGNvZGV7QHZhbHVle0FTfX0gZXZlciB1c2VzIGlzIGV4cHJlc3NlZCBhcwotQGRpc3BsYXkKLShAdmFye3NlY3Rpb259KSArIChAdmFye29mZnNldCBpbnRvIHNlY3Rpb259KQotQGVuZCBkaXNwbGF5Ci1Abm9pbmRlbnQKLUZ1cnRoZXIsIG1vc3QgZXhwcmVzc2lvbnMgQGNvZGV7QHZhbHVle0FTfX0gY29tcHV0ZXMgaGF2ZSB0aGlzIHNlY3Rpb24tcmVsYXRpdmUKLW5hdHVyZS4KLUBpZnNldCBTT00KLShGb3Igc29tZSBvYmplY3QgZm9ybWF0cywgc3VjaCBhcyBTT00gZm9yIHRoZSBIUFBBLCBzb21lIGV4cHJlc3Npb25zIGFyZQotc3ltYm9sLXJlbGF0aXZlIGluc3RlYWQuKQotQGVuZCBpZnNldAotCi1JbiB0aGlzIG1hbnVhbCB3ZSB1c2UgdGhlIG5vdGF0aW9uIEB7QHZhcntzZWNuYW1lfSBAdmFye059QH0gdG8gbWVhbiBgYG9mZnNldAotQHZhcntOfSBpbnRvIHNlY3Rpb24gQHZhcntzZWNuYW1lfS4nJwotCi1BcGFydCBmcm9tIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB5b3UgbmVlZCB0byBrbm93IGFib3V0IHRoZQotQGRmbnthYnNvbHV0ZX0gc2VjdGlvbi4gIFdoZW4gQGNvZGV7QHZhbHVle0xEfX0gbWl4ZXMgcGFydGlhbCBwcm9ncmFtcywKLWFkZHJlc3NlcyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiByZW1haW4gdW5jaGFuZ2VkLiAgRm9yIGV4YW1wbGUsIGFkZHJlc3MKLUBjb2Rle0B7YWJzb2x1dGUgMEB9fSBpcyBgYHJlbG9jYXRlZCcnIHRvIHJ1bi10aW1lIGFkZHJlc3MgMCBieQotQGNvZGV7QHZhbHVle0xEfX0uICBBbHRob3VnaCB0aGUgbGlua2VyIG5ldmVyIGFycmFuZ2VzIHR3byBwYXJ0aWFsIHByb2dyYW1zJwotZGF0YSBzZWN0aW9ucyB3aXRoIG92ZXJsYXBwaW5nIGFkZHJlc3NlcyBhZnRlciBsaW5raW5nLCBAZW1waHtieSBkZWZpbml0aW9ufQotdGhlaXIgYWJzb2x1dGUgc2VjdGlvbnMgbXVzdCBvdmVybGFwLiAgQWRkcmVzcyBAY29kZXtAe2Fic29sdXRlQCAyMzlAfX0gaW4gb25lCi1wYXJ0IG9mIGEgcHJvZ3JhbSBpcyBhbHdheXMgdGhlIHNhbWUgYWRkcmVzcyB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcgYXMKLWFkZHJlc3MgQGNvZGV7QHthYnNvbHV0ZUAgMjM5QH19IGluIGFueSBvdGhlciBwYXJ0IG9mIHRoZSBwcm9ncmFtLgotCi1UaGUgaWRlYSBvZiBzZWN0aW9ucyBpcyBleHRlbmRlZCB0byB0aGUgQGRmbnt1bmRlZmluZWR9IHNlY3Rpb24uICBBbnkKLWFkZHJlc3Mgd2hvc2Ugc2VjdGlvbiBpcyB1bmtub3duIGF0IGFzc2VtYmx5IHRpbWUgaXMgYnkgZGVmaW5pdGlvbgotcmVuZGVyZWQgQHt1bmRlZmluZWQgQHZhcntVfUB9LS0td2hlcmUgQHZhcntVfSBpcyBmaWxsZWQgaW4gbGF0ZXIuCi1TaW5jZSBudW1iZXJzIGFyZSBhbHdheXMgZGVmaW5lZCwgdGhlIG9ubHkgd2F5IHRvIGdlbmVyYXRlIGFuIHVuZGVmaW5lZAotYWRkcmVzcyBpcyB0byBtZW50aW9uIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBBIHJlZmVyZW5jZSB0byBhIG5hbWVkCi1jb21tb24gYmxvY2sgd291bGQgYmUgc3VjaCBhIHN5bWJvbDogaXRzIHZhbHVlIGlzIHVua25vd24gYXQgYXNzZW1ibHkKLXRpbWUgc28gaXQgaGFzIHNlY3Rpb24gQGVtcGh7dW5kZWZpbmVkfS4KLQotQnkgYW5hbG9neSB0aGUgd29yZCBAZW1waHtzZWN0aW9ufSBpcyB1c2VkIHRvIGRlc2NyaWJlIGdyb3VwcyBvZiBzZWN0aW9ucyBpbgotdGhlIGxpbmtlZCBwcm9ncmFtLiAgQGNvZGV7QHZhbHVle0xEfX0gcHV0cyBhbGwgcGFydGlhbCBwcm9ncmFtcycgdGV4dAotc2VjdGlvbnMgaW4gY29udGlndW91cyBhZGRyZXNzZXMgaW4gdGhlIGxpbmtlZCBwcm9ncmFtLiAgSXQgaXMKLWN1c3RvbWFyeSB0byByZWZlciB0byB0aGUgQGVtcGh7dGV4dCBzZWN0aW9ufSBvZiBhIHByb2dyYW0sIG1lYW5pbmcgYWxsCi10aGUgYWRkcmVzc2VzIG9mIGFsbCBwYXJ0aWFsIHByb2dyYW1zJyB0ZXh0IHNlY3Rpb25zLiAgTGlrZXdpc2UgZm9yCi1kYXRhIGFuZCBic3Mgc2VjdGlvbnMuCi0KLVNvbWUgc2VjdGlvbnMgYXJlIG1hbmlwdWxhdGVkIGJ5IEBjb2Rle0B2YWx1ZXtMRH19OyBvdGhlcnMgYXJlIGludmVudGVkIGZvcgotdXNlIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFuZCBoYXZlIG5vIG1lYW5pbmcgZXhjZXB0IGR1cmluZyBhc3NlbWJseS4KLQotQG5vZGUgTGQgU2VjdGlvbnMKLUBzZWN0aW9uIExpbmtlciBTZWN0aW9ucwotQGNvZGV7QHZhbHVle0xEfX0gZGVhbHMgd2l0aCBqdXN0IGZvdXIga2luZHMgb2Ygc2VjdGlvbnMsIHN1bW1hcml6ZWQgYmVsb3cuCi0KLUB0YWJsZSBAc3Ryb25nCi0KLUBpZnNldCBDT0ZGCi1AY2luZGV4IG5hbWVkIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zLCBuYW1lZAotQGl0ZW0gbmFtZWQgc2VjdGlvbnMKLUBlbmQgaWZzZXQKLUBpZnNldCBhb3V0LWJvdXQKLUBjaW5kZXggdGV4dCBzZWN0aW9uCi1AY2luZGV4IGRhdGEgc2VjdGlvbgotQGl0ZW14IHRleHQgc2VjdGlvbgotQGl0ZW14IGRhdGEgc2VjdGlvbgotQGVuZCBpZnNldAotVGhlc2Ugc2VjdGlvbnMgaG9sZCB5b3VyIHByb2dyYW0uICBAY29kZXtAdmFsdWV7QVN9fSBhbmQgQGNvZGV7QHZhbHVle0xEfX0gdHJlYXQgdGhlbSBhcwotc2VwYXJhdGUgYnV0IGVxdWFsIHNlY3Rpb25zLiAgQW55dGhpbmcgeW91IGNhbiBzYXkgb2Ygb25lIHNlY3Rpb24gaXMKLXRydWUgYW5vdGhlci4KLUBpZnNldCBhb3V0LWJvdXQKLVdoZW4gdGhlIHByb2dyYW0gaXMgcnVubmluZywgaG93ZXZlciwgaXQgaXMKLWN1c3RvbWFyeSBmb3IgdGhlIHRleHQgc2VjdGlvbiB0byBiZSB1bmFsdGVyYWJsZS4gIFRoZQotdGV4dCBzZWN0aW9uIGlzIG9mdGVuIHNoYXJlZCBhbW9uZyBwcm9jZXNzZXM6IGl0IGNvbnRhaW5zCi1pbnN0cnVjdGlvbnMsIGNvbnN0YW50cyBhbmQgdGhlIGxpa2UuICBUaGUgZGF0YSBzZWN0aW9uIG9mIGEgcnVubmluZwotcHJvZ3JhbSBpcyB1c3VhbGx5IGFsdGVyYWJsZTogZm9yIGV4YW1wbGUsIEMgdmFyaWFibGVzIHdvdWxkIGJlIHN0b3JlZAotaW4gdGhlIGRhdGEgc2VjdGlvbi4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBic3Mgc2VjdGlvbgotQGl0ZW0gYnNzIHNlY3Rpb24KLVRoaXMgc2VjdGlvbiBjb250YWlucyB6ZXJvZWQgYnl0ZXMgd2hlbiB5b3VyIHByb2dyYW0gYmVnaW5zIHJ1bm5pbmcuICBJdAotaXMgdXNlZCB0byBob2xkIHVuaXRpYWxpemVkIHZhcmlhYmxlcyBvciBjb21tb24gc3RvcmFnZS4gIFRoZSBsZW5ndGggb2YKLWVhY2ggcGFydGlhbCBwcm9ncmFtJ3MgYnNzIHNlY3Rpb24gaXMgaW1wb3J0YW50LCBidXQgYmVjYXVzZSBpdCBzdGFydHMKLW91dCBjb250YWluaW5nIHplcm9lZCBieXRlcyB0aGVyZSBpcyBubyBuZWVkIHRvIHN0b3JlIGV4cGxpY2l0IHplcm8KLWJ5dGVzIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBic3Mgc2VjdGlvbiB3YXMgaW52ZW50ZWQgdG8gZWxpbWluYXRlCi10aG9zZSBleHBsaWNpdCB6ZXJvcyBmcm9tIG9iamVjdCBmaWxlcy4KLQotQGNpbmRleCBhYnNvbHV0ZSBzZWN0aW9uCi1AaXRlbSBhYnNvbHV0ZSBzZWN0aW9uCi1BZGRyZXNzIDAgb2YgdGhpcyBzZWN0aW9uIGlzIGFsd2F5cyBgYHJlbG9jYXRlZCcnIHRvIHJ1bnRpbWUgYWRkcmVzcyAwLgotVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmVmZXIgdG8gYW4gYWRkcmVzcyB0aGF0IEBjb2Rle0B2YWx1ZXtMRH19IG11c3QKLW5vdCBjaGFuZ2Ugd2hlbiByZWxvY2F0aW5nLiAgSW4gdGhpcyBzZW5zZSB3ZSBzcGVhayBvZiBhYnNvbHV0ZQotYWRkcmVzc2VzIGJlaW5nIGBgdW5yZWxvY2F0YWJsZScnOiB0aGV5IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHJlbG9jYXRpb24uCi0KLUBjaW5kZXggdW5kZWZpbmVkIHNlY3Rpb24KLUBpdGVtIHVuZGVmaW5lZCBzZWN0aW9uCi1UaGlzIGBgc2VjdGlvbicnIGlzIGEgY2F0Y2gtYWxsIGZvciBhZGRyZXNzIHJlZmVyZW5jZXMgdG8gb2JqZWN0cyBub3QgaW4KLXRoZSBwcmVjZWRpbmcgc2VjdGlvbnMuCi1AYyBGSVhNRTogcmVmIHRvIHNvbWUgb3RoZXIgZG9jIG9uIG9iai1maWxlIGZvcm1hdHMgY291bGQgZ28gaGVyZS4KLUBlbmQgdGFibGUKLQotQGNpbmRleCByZWxvY2F0aW9uIGV4YW1wbGUKLUFuIGlkZWFsaXplZCBleGFtcGxlIG9mIHRocmVlIHJlbG9jYXRhYmxlIHNlY3Rpb25zIGZvbGxvd3MuCi1AaWZzZXQgQ09GRgotVGhlIGV4YW1wbGUgdXNlcyB0aGUgdHJhZGl0aW9uYWwgc2VjdGlvbiBuYW1lcyBAc2FtcHsudGV4dH0gYW5kIEBzYW1wey5kYXRhfS4KLUBlbmQgaWZzZXQKLU1lbW9yeSBhZGRyZXNzZXMgYXJlIG9uIHRoZSBob3Jpem9udGFsIGF4aXMuCi0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgICAgICArLS0tLS0rLS0tLSstLSsKLXBhcnRpYWwgcHJvZ3JhbSAjIDE6ICB8dHR0dHR8ZGRkZHwwMHwKLSAgICAgICAgICAgICAgICAgICAgICArLS0tLS0rLS0tLSstLSsKLQotICAgICAgICAgICAgICAgICAgICAgIHRleHQgICBkYXRhIGJzcwotICAgICAgICAgICAgICAgICAgICAgIHNlZy4gICBzZWcuIHNlZy4KLQotICAgICAgICAgICAgICAgICAgICAgICstLS0rLS0tKy0tLSsKLXBhcnRpYWwgcHJvZ3JhbSAjIDI6ICB8VFRUfERERHwwMDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tLSstLS0rLS0tKwotCi0gICAgICAgICAgICAgICAgICAgICAgKy0tKy0tLSstLS0tLSstLSstLS0tKy0tLSstLS0tLSt+fgotbGlua2VkIHByb2dyYW06ICAgICAgIHwgIHxUVFR8dHR0dHR8ICB8ZGRkZHxERER8MDAwMDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tKy0tLSstLS0tLSstLSstLS0tKy0tLSstLS0tLSt+fgotCi0gICAgYWRkcmVzc2VzOiAgICAgICAgMCBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AbmVlZCA1MDAwCi1AdGV4Ci0KLVxsaW5le1xpdCBQYXJ0aWFsIHByb2dyYW0gXCMxOiBcaGZpbH0KLVxsaW5le1xpYm94ezIuNWNtfXtcdHQgdGV4dH1caWJveHsyY219e1x0dCBkYXRhfVxpYm94ezFjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsyLjVjbX17XHR0IHR0dHR0fVxib3hpdHsyY219e1x0dCBkZGRkfVxib3hpdHsxY219e1x0dCAwMH1caGZpbH0KLQotXGxpbmV7XGl0IFBhcnRpYWwgcHJvZ3JhbSBcIzI6IFxoZmlsfQotXGxpbmV7XGlib3h7MWNtfXtcdHQgdGV4dH1caWJveHsxLjVjbX17XHR0IGRhdGF9XGlib3h7MWNtfXtcdHQgYnNzfVxoZmlsfQotXGxpbmV7XGJveGl0ezFjbX17XHR0IFRUVH1cYm94aXR7MS41Y219e1x0dCBEREREfVxib3hpdHsxY219e1x0dCAwMDB9XGhmaWx9Ci0KLVxsaW5le1xpdCBsaW5rZWQgcHJvZ3JhbTogXGhmaWx9Ci1cbGluZXtcaWJveHsuNWNtfXt9XGlib3h7MWNtfXtcdHQgdGV4dH1caWJveHsyLjVjbX17fVxpYm94ey43NWNtfXt9XGlib3h7MmNtfXtcdHQgZGF0YX1caWJveHsxLjVjbX17fVxpYm94ezJjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsuNWNtfXt9XGJveGl0ezFjbX17XHR0IFRUVH1cYm94aXR7Mi41Y219e1x0dAotdHR0dHR9XGJveGl0ey43NWNtfXt9XGJveGl0ezJjbX17XHR0IGRkZGR9XGJveGl0ezEuNWNtfXtcdHQKLURERER9XGJveGl0ezJjbX17XHR0IDAwMDAwfVwgXGRvdHNcaGZpbH0KLQotXGxpbmV7XGl0IGFkZHJlc3NlczogXGhmaWx9Ci1cbGluZXswXGRvdHNcaGZpbH0KLQotQGVuZCB0ZXgKLUBjIEVORCBURVhJMlJPRkYtS0lMTAotCi1Abm9kZSBBcyBTZWN0aW9ucwotQHNlY3Rpb24gQXNzZW1ibGVyIEludGVybmFsIFNlY3Rpb25zCi0KLUBjaW5kZXggaW50ZXJuYWwgYXNzZW1ibGVyIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zIGluIG1lc3NhZ2VzLCBpbnRlcm5hbAotVGhlc2Ugc2VjdGlvbnMgYXJlIG1lYW50IG9ubHkgZm9yIHRoZSBpbnRlcm5hbCB1c2Ugb2YgQGNvZGV7QHZhbHVle0FTfX0uICBUaGV5Ci1oYXZlIG5vIG1lYW5pbmcgYXQgcnVuLXRpbWUuICBZb3UgZG8gbm90IHJlYWxseSBuZWVkIHRvIGtub3cgYWJvdXQgdGhlc2UKLXNlY3Rpb25zIGZvciBtb3N0IHB1cnBvc2VzOyBidXQgdGhleSBjYW4gYmUgbWVudGlvbmVkIGluIEBjb2Rle0B2YWx1ZXtBU319Ci13YXJuaW5nIG1lc3NhZ2VzLCBzbyBpdCBtaWdodCBiZSBoZWxwZnVsIHRvIGhhdmUgYW4gaWRlYSBvZiB0aGVpcgotbWVhbmluZ3MgdG8gQGNvZGV7QHZhbHVle0FTfX0uICBUaGVzZSBzZWN0aW9ucyBhcmUgdXNlZCB0byBwZXJtaXQgdGhlCi12YWx1ZSBvZiBldmVyeSBleHByZXNzaW9uIGluIHlvdXIgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbSB0byBiZSBhCi1zZWN0aW9uLXJlbGF0aXZlIGFkZHJlc3MuCi0KLUB0YWJsZSBAYgotQGNpbmRleCBhc3NlbWJsZXIgaW50ZXJuYWwgbG9naWMgZXJyb3IKLUBpdGVtIEFTU0VNQkxFUi1JTlRFUk5BTC1MT0dJQy1FUlJPUiEKLUFuIGludGVybmFsIGFzc2VtYmxlciBsb2dpYyBlcnJvciBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgbWVhbnMgdGhlcmUgaXMgYQotYnVnIGluIHRoZSBhc3NlbWJsZXIuCi0KLUBjaW5kZXggZXhwciAoaW50ZXJuYWwgc2VjdGlvbikKLUBpdGVtIGV4cHIgc2VjdGlvbgotVGhlIGFzc2VtYmxlciBzdG9yZXMgY29tcGxleCBleHByZXNzaW9uIGludGVybmFsbHkgYXMgY29tYmluYXRpb25zIG9mCi1zeW1ib2xzLiAgV2hlbiBpdCBuZWVkcyB0byByZXByZXNlbnQgYW4gZXhwcmVzc2lvbiBhcyBhIHN5bWJvbCwgaXQgcHV0cwotaXQgaW4gdGhlIGV4cHIgc2VjdGlvbi4KLUBjIEZJWE1FIGl0ZW0gZGVidWcKLUBjIEZJWE1FIGl0ZW0gdHJhbnNmZXJbdF0gdmVjdG9yIHByZWxvYWQKLUBjIEZJWE1FIGl0ZW0gdHJhbnNmZXJbdF0gdmVjdG9yIHBvc3Rsb2FkCi1AYyBGSVhNRSBpdGVtIHJlZ2lzdGVyCi1AZW5kIHRhYmxlCi0KLUBub2RlIFN1Yi1TZWN0aW9ucwotQHNlY3Rpb24gU3ViLVNlY3Rpb25zCi0KLUBjaW5kZXggbnVtYmVyZWQgc3Vic2VjdGlvbnMKLUBjaW5kZXggZ3JvdXBpbmcgZGF0YQotQGlmc2V0IGFvdXQtYm91dAotQXNzZW1ibGVkIGJ5dGVzCi1AaWZzZXQgQ09GRgotY29udmVudGlvbmFsbHkKLUBlbmQgaWZzZXQKLWZhbGwgaW50byB0d28gc2VjdGlvbnM6IHRleHQgYW5kIGRhdGEuCi1AZW5kIGlmc2V0Ci1Zb3UgbWF5IGhhdmUgc2VwYXJhdGUgZ3JvdXBzIG9mCi1AaWZzZXQgR0VORVJJQwotZGF0YSBpbiBuYW1lZCBzZWN0aW9ucwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYW91dC1ib3V0Ci1kYXRhIGluIG5hbWVkIHNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBhb3V0LWJvdXQKLXRleHQgb3IgZGF0YQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi10aGF0IHlvdSB3YW50IHRvIGVuZCB1cCBuZWFyIHRvIGVhY2ggb3RoZXIgaW4gdGhlIG9iamVjdCBmaWxlLCBldmVuIHRob3VnaCB0aGV5Ci1hcmUgbm90IGNvbnRpZ3VvdXMgaW4gdGhlIGFzc2VtYmxlciBzb3VyY2UuICBAY29kZXtAdmFsdWV7QVN9fSBhbGxvd3MgeW91IHRvCi11c2UgQGRmbntzdWJzZWN0aW9uc30gZm9yIHRoaXMgcHVycG9zZS4gIFdpdGhpbiBlYWNoIHNlY3Rpb24sIHRoZXJlIGNhbiBiZQotbnVtYmVyZWQgc3Vic2VjdGlvbnMgd2l0aCB2YWx1ZXMgZnJvbSAwIHRvIDgxOTIuICBPYmplY3RzIGFzc2VtYmxlZCBpbnRvIHRoZQotc2FtZSBzdWJzZWN0aW9uIGdvIGludG8gdGhlIG9iamVjdCBmaWxlIHRvZ2V0aGVyIHdpdGggb3RoZXIgb2JqZWN0cyBpbiB0aGUgc2FtZQotc3Vic2VjdGlvbi4gIEZvciBleGFtcGxlLCBhIGNvbXBpbGVyIG1pZ2h0IHdhbnQgdG8gc3RvcmUgY29uc3RhbnRzIGluIHRoZSB0ZXh0Ci1zZWN0aW9uLCBidXQgbWlnaHQgbm90IHdhbnQgdG8gaGF2ZSB0aGVtIGludGVyc3BlcnNlZCB3aXRoIHRoZSBwcm9ncmFtIGJlaW5nCi1hc3NlbWJsZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBjb21waWxlciBjb3VsZCBpc3N1ZSBhIEBzYW1wey50ZXh0IDB9IGJlZm9yZSBlYWNoCi1zZWN0aW9uIG9mIGNvZGUgYmVpbmcgb3V0cHV0LCBhbmQgYSBAc2FtcHsudGV4dCAxfSBiZWZvcmUgZWFjaCBncm91cCBvZgotY29uc3RhbnRzIGJlaW5nIG91dHB1dC4KLQotU3Vic2VjdGlvbnMgYXJlIG9wdGlvbmFsLiAgSWYgeW91IGRvIG5vdCB1c2Ugc3Vic2VjdGlvbnMsIGV2ZXJ5dGhpbmcKLWdvZXMgaW4gc3Vic2VjdGlvbiBudW1iZXIgemVyby4KLQotQGlmc2V0IEdFTkVSSUMKLUVhY2ggc3Vic2VjdGlvbiBpcyB6ZXJvLXBhZGRlZCB1cCB0byBhIG11bHRpcGxlIG9mIGZvdXIgYnl0ZXMuCi0oU3Vic2VjdGlvbnMgbWF5IGJlIHBhZGRlZCBhIGRpZmZlcmVudCBhbW91bnQgb24gZGlmZmVyZW50IGZsYXZvcnMKLW9mIEBjb2Rle0B2YWx1ZXtBU319LikKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOAotT24gdGhlIEg4LzMwMCBhbmQgSDgvNTAwIHBsYXRmb3JtcywgZWFjaCBzdWJzZWN0aW9uIGlzIHplcm8tcGFkZGVkIHRvIGEgd29yZAotYm91bmRhcnkgKHR3byBieXRlcykuCi1UaGUgc2FtZSBpcyB0cnVlIG9uIHRoZSBIaXRhY2hpIFNILgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUBjIEZJWE1FIHNlY3Rpb24gcGFkZGluZyAoYWxpZ25tZW50KT8KLUBjIFJpY2ggUGl4bGV5IHNheXMgcGFkZGluZyBoZXJlIGRlcGVuZHMgb24gdGFyZ2V0IG9iaiBjb2RlIGZvcm1hdDsgdGhhdAotQGMgZG9lc24ndCBzZWVtIHBhcnRpY3VsYXJseSB1c2VmdWwgdG8gc2F5IHdpdGhvdXQgZnVydGhlciBlbGFib3JhdGlvbiwKLUBjIHNvIGZvciBub3cgSSBzYXkgbm90aGluZyBhYm91dCBpdC4gIElmIHRoaXMgaXMgYSBnZW5lcmljIEJGRCBpc3N1ZSwKLUBjIHRoZXNlIHBhcmFncmFwaHMgbWlnaHQgbmVlZCB0byB2YW5pc2ggZnJvbSB0aGlzIG1hbnVhbCwgYW5kIGJlCi1AYyBkaXNjdXNzZWQgaW4gQkZEIGNoYXB0ZXIgb2YgYmludXRpbHMgKG9yIHNvbWUgc3VjaCkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQTI5SwotT24gdGhlIEFNRCAyOUsgZmFtaWx5LCBubyBwYXJ0aWN1bGFyIHBhZGRpbmcgaXMgYWRkZWQgdG8gc2VjdGlvbiBvcgotc3Vic2VjdGlvbiBzaXplczsgQHZhbHVle0FTfSBmb3JjZXMgbm8gYWxpZ25tZW50IG9uIHRoaXMgcGxhdGZvcm0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotU3Vic2VjdGlvbnMgYXBwZWFyIGluIHlvdXIgb2JqZWN0IGZpbGUgaW4gbnVtZXJpYyBvcmRlciwgbG93ZXN0IG51bWJlcmVkCi10byBoaWdoZXN0LiAgKEFsbCB0aGlzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLikKLVRoZSBvYmplY3QgZmlsZSBjb250YWlucyBubyByZXByZXNlbnRhdGlvbiBvZiBzdWJzZWN0aW9uczsgQGNvZGV7QHZhbHVle0xEfX0gYW5kCi1vdGhlciBwcm9ncmFtcyB0aGF0IG1hbmlwdWxhdGUgb2JqZWN0IGZpbGVzIHNlZSBubyB0cmFjZSBvZiB0aGVtLgotVGhleSBqdXN0IHNlZSBhbGwgeW91ciB0ZXh0IHN1YnNlY3Rpb25zIGFzIGEgdGV4dCBzZWN0aW9uLCBhbmQgYWxsIHlvdXIKLWRhdGEgc3Vic2VjdGlvbnMgYXMgYSBkYXRhIHNlY3Rpb24uCi0KLVRvIHNwZWNpZnkgd2hpY2ggc3Vic2VjdGlvbiB5b3Ugd2FudCBzdWJzZXF1ZW50IHN0YXRlbWVudHMgYXNzZW1ibGVkCi1pbnRvLCB1c2UgYSBudW1lcmljIGFyZ3VtZW50IHRvIHNwZWNpZnkgaXQsIGluIGEgQHNhbXB7LnRleHQKLUB2YXJ7ZXhwcmVzc2lvbn19IG9yIGEgQHNhbXB7LmRhdGEgQHZhcntleHByZXNzaW9ufX0gc3RhdGVtZW50LgotQGlmc2V0IENPRkYKLUBpZnNldCBHRU5FUklDCi1XaGVuIGdlbmVyYXRpbmcgQ09GRiBvdXRwdXQsIHlvdQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotWW91Ci1AZW5kIGlmY2xlYXIKLWNhbiBhbHNvIHVzZSBhbiBleHRyYSBzdWJzZWN0aW9uCi1hcmd1bWVudCB3aXRoIGFyYml0cmFyeSBuYW1lZCBzZWN0aW9uczogQHNhbXB7LnNlY3Rpb24gQHZhcntuYW1lfSwKLUB2YXJ7ZXhwcmVzc2lvbn19LgotQGVuZCBpZnNldAotQHZhcntFeHByZXNzaW9ufSBzaG91bGQgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4KLShAeHJlZntFeHByZXNzaW9uc30uKSAgSWYgeW91IGp1c3Qgc2F5IEBzYW1wey50ZXh0fSB0aGVuIEBzYW1wey50ZXh0IDB9Ci1pcyBhc3N1bWVkLiAgTGlrZXdpc2UgQHNhbXB7LmRhdGF9IG1lYW5zIEBzYW1wey5kYXRhIDB9LiAgQXNzZW1ibHkKLWJlZ2lucyBpbiBAY29kZXt0ZXh0IDB9LiAgRm9yIGluc3RhbmNlOgotQHNtYWxsZXhhbXBsZQotLnRleHQgMCAgICAgIyBUaGUgZGVmYXVsdCBzdWJzZWN0aW9uIGlzIHRleHQgMCBhbnl3YXkuCi0uYXNjaWkgIlRoaXMgbGl2ZXMgaW4gdGhlIGZpcnN0IHRleHQgc3Vic2VjdGlvbi4gKiIKLS50ZXh0IDEKLS5hc2NpaSAiQnV0IHRoaXMgbGl2ZXMgaW4gdGhlIHNlY29uZCB0ZXh0IHN1YnNlY3Rpb24uIgotLmRhdGEgMAotLmFzY2lpICJUaGlzIGxpdmVzIGluIHRoZSBkYXRhIHNlY3Rpb24sIgotLmFzY2lpICJpbiB0aGUgZmlyc3QgZGF0YSBzdWJzZWN0aW9uLiIKLS50ZXh0IDAKLS5hc2NpaSAiVGhpcyBsaXZlcyBpbiB0aGUgZmlyc3QgdGV4dCBzZWN0aW9uLCIKLS5hc2NpaSAiaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBhc3RlcmlzayAoKikuIgotQGVuZCBzbWFsbGV4YW1wbGUKLQotRWFjaCBzZWN0aW9uIGhhcyBhIEBkZm57bG9jYXRpb24gY291bnRlcn0gaW5jcmVtZW50ZWQgYnkgb25lIGZvciBldmVyeSBieXRlCi1hc3NlbWJsZWQgaW50byB0aGF0IHNlY3Rpb24uICBCZWNhdXNlIHN1YnNlY3Rpb25zIGFyZSBtZXJlbHkgYSBjb252ZW5pZW5jZQotcmVzdHJpY3RlZCB0byBAY29kZXtAdmFsdWV7QVN9fSB0aGVyZSBpcyBubyBjb25jZXB0IG9mIGEgc3Vic2VjdGlvbiBsb2NhdGlvbgotY291bnRlci4gIFRoZXJlIGlzIG5vIHdheSB0byBkaXJlY3RseSBtYW5pcHVsYXRlIGEgbG9jYXRpb24gY291bnRlci0tLWJ1dCB0aGUKLUBjb2Rley5hbGlnbn0gZGlyZWN0aXZlIGNoYW5nZXMgaXQsIGFuZCBhbnkgbGFiZWwgZGVmaW5pdGlvbiBjYXB0dXJlcyBpdHMKLWN1cnJlbnQgdmFsdWUuICBUaGUgbG9jYXRpb24gY291bnRlciBvZiB0aGUgc2VjdGlvbiB3aGVyZSBzdGF0ZW1lbnRzIGFyZSBiZWluZwotYXNzZW1ibGVkIGlzIHNhaWQgdG8gYmUgdGhlIEBkZm57YWN0aXZlfSBsb2NhdGlvbiBjb3VudGVyLgotCi1Abm9kZSBic3MKLUBzZWN0aW9uIGJzcyBTZWN0aW9uCi0KLUBjaW5kZXggYnNzIHNlY3Rpb24KLUBjaW5kZXggY29tbW9uIHZhcmlhYmxlIHN0b3JhZ2UKLVRoZSBic3Mgc2VjdGlvbiBpcyB1c2VkIGZvciBsb2NhbCBjb21tb24gdmFyaWFibGUgc3RvcmFnZS4KLVlvdSBtYXkgYWxsb2NhdGUgYWRkcmVzcyBzcGFjZSBpbiB0aGUgYnNzIHNlY3Rpb24sIGJ1dCB5b3UgbWF5Ci1ub3QgZGljdGF0ZSBkYXRhIHRvIGxvYWQgaW50byBpdCBiZWZvcmUgeW91ciBwcm9ncmFtIGV4ZWN1dGVzLiAgV2hlbgoteW91ciBwcm9ncmFtIHN0YXJ0cyBydW5uaW5nLCBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBic3MKLXNlY3Rpb24gYXJlIHplcm9lZCBieXRlcy4KLQotVGhlIEBjb2Rley5sY29tbX0gcHNldWRvLW9wIGRlZmluZXMgYSBzeW1ib2wgaW4gdGhlIGJzcyBzZWN0aW9uOyBzZWUKLUByZWZ7TGNvbW0sLEBjb2Rley5sY29tbX19LgotCi1UaGUgQGNvZGV7LmNvbW19IHBzZXVkby1vcCBtYXkgYmUgdXNlZCB0byBkZWNsYXJlIGEgY29tbW9uIHN5bWJvbCwgd2hpY2ggaXMKLWFub3RoZXIgZm9ybSBvZiB1bmluaXRpYWxpemVkIHN5bWJvbDsgc2VlIEB4cmVme0NvbW0sLEBjb2Rley5jb21tfX0uCi0KLUBpZnNldCBHRU5FUklDCi1XaGVuIGFzc2VtYmxpbmcgZm9yIGEgdGFyZ2V0IHdoaWNoIHN1cHBvcnRzIG11bHRpcGxlIHNlY3Rpb25zLCBzdWNoIGFzIEVMRiBvcgotQ09GRiwgeW91IG1heSBzd2l0Y2ggaW50byB0aGUgQGNvZGV7LmJzc30gc2VjdGlvbiBhbmQgZGVmaW5lIHN5bWJvbHMgYXMgdXN1YWw7Ci1zZWUgQHJlZntTZWN0aW9uLCxAY29kZXsuc2VjdGlvbn19LiAgWW91IG1heSBvbmx5IGFzc2VtYmxlIHplcm8gdmFsdWVzIGludG8gdGhlCi1zZWN0aW9uLiAgVHlwaWNhbGx5IHRoZSBzZWN0aW9uIHdpbGwgb25seSBjb250YWluIHN5bWJvbCBkZWZpbml0aW9ucyBhbmQKLUBjb2Rley5za2lwfSBkaXJlY3RpdmVzIChAcHhyZWZ7U2tpcCwsQGNvZGV7LnNraXB9fSkuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFN5bWJvbHMKLUBjaGFwdGVyIFN5bWJvbHMKLQotQGNpbmRleCBzeW1ib2xzCi1TeW1ib2xzIGFyZSBhIGNlbnRyYWwgY29uY2VwdDogdGhlIHByb2dyYW1tZXIgdXNlcyBzeW1ib2xzIHRvIG5hbWUKLXRoaW5ncywgdGhlIGxpbmtlciB1c2VzIHN5bWJvbHMgdG8gbGluaywgYW5kIHRoZSBkZWJ1Z2dlciB1c2VzIHN5bWJvbHMKLXRvIGRlYnVnLgotCi1AcXVvdGF0aW9uCi1AY2luZGV4IGRlYnVnZ2VycywgYW5kIHN5bWJvbCBvcmRlcgotQGVtcGh7V2FybmluZzp9IEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHBsYWNlIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlIGluCi10aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZGVjbGFyZWQuICBUaGlzIG1heSBicmVhayBzb21lIGRlYnVnZ2Vycy4KLUBlbmQgcXVvdGF0aW9uCi0KLUBtZW51Ci0qIExhYmVsczo6ICAgICAgICAgICAgICAgICAgICAgIExhYmVscwotKiBTZXR0aW5nIFN5bWJvbHM6OiAgICAgICAgICAgICBHaXZpbmcgU3ltYm9scyBPdGhlciBWYWx1ZXMKLSogU3ltYm9sIE5hbWVzOjogICAgICAgICAgICAgICAgU3ltYm9sIE5hbWVzCi0qIERvdDo6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBTcGVjaWFsIERvdCBTeW1ib2wKLSogU3ltYm9sIEF0dHJpYnV0ZXM6OiAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBMYWJlbHMKLUBzZWN0aW9uIExhYmVscwotCi1AY2luZGV4IGxhYmVscwotQSBAZGZue2xhYmVsfSBpcyB3cml0dGVuIGFzIGEgc3ltYm9sIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24KLUBzYW1wezp9LiAgVGhlIHN5bWJvbCB0aGVuIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCi1hY3RpdmUgbG9jYXRpb24gY291bnRlciwgYW5kIGlzLCBmb3IgZXhhbXBsZSwgYSBzdWl0YWJsZSBpbnN0cnVjdGlvbgotb3BlcmFuZC4gIFlvdSBhcmUgd2FybmVkIGlmIHlvdSB1c2UgdGhlIHNhbWUgc3ltYm9sIHRvIHJlcHJlc2VudCB0d28KLWRpZmZlcmVudCBsb2NhdGlvbnM6IHRoZSBmaXJzdCBkZWZpbml0aW9uIG92ZXJyaWRlcyBhbnkgb3RoZXIKLWRlZmluaXRpb25zLgotCi1AaWZzZXQgSFBQQQotT24gdGhlIEhQUEEsIHRoZSB1c3VhbCBmb3JtIGZvciBhIGxhYmVsIG5lZWQgbm90IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEKLWNvbG9uLCBidXQgaW5zdGVhZCBtdXN0IHN0YXJ0IGluIGNvbHVtbiB6ZXJvLiAgT25seSBvbmUgbGFiZWwgbWF5IGJlIGRlZmluZWQgb24KLWEgc2luZ2xlIGxpbmUuICBUbyB3b3JrIGFyb3VuZCB0aGlzLCB0aGUgSFBQQSB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFsc28KLXByb3ZpZGVzIGEgc3BlY2lhbCBkaXJlY3RpdmUgQGNvZGV7LmxhYmVsfSBmb3IgZGVmaW5pbmcgbGFiZWxzIG1vcmUgZmxleGlibHkuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFNldHRpbmcgU3ltYm9scwotQHNlY3Rpb24gR2l2aW5nIFN5bWJvbHMgT3RoZXIgVmFsdWVzCi0KLUBjaW5kZXggYXNzaWduaW5nIHZhbHVlcyB0byBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbCB2YWx1ZXMsIGFzc2lnbmluZwotQSBzeW1ib2wgY2FuIGJlIGdpdmVuIGFuIGFyYml0cmFyeSB2YWx1ZSBieSB3cml0aW5nIGEgc3ltYm9sLCBmb2xsb3dlZAotYnkgYW4gZXF1YWxzIHNpZ24gQHNhbXB7PX0sIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24KLShAcHhyZWZ7RXhwcmVzc2lvbnN9KS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB1c2luZyB0aGUgQGNvZGV7LnNldH0KLWRpcmVjdGl2ZS4gIEB4cmVme1NldCwsQGNvZGV7LnNldH19LgotCi1Abm9kZSBTeW1ib2wgTmFtZXMKLUBzZWN0aW9uIFN5bWJvbCBOYW1lcwotCi1AY2luZGV4IHN5bWJvbCBuYW1lcwotQGNpbmRleCBuYW1lcywgc3ltYm9sCi1AaWZjbGVhciBTUEVDSUFMLVNZTVMKLVN5bWJvbCBuYW1lcyBiZWdpbiB3aXRoIGEgbGV0dGVyIG9yIHdpdGggb25lIG9mIEBzYW1wey5ffS4gIE9uIG1vc3QKLW1hY2hpbmVzLCB5b3UgY2FuIGFsc28gdXNlIEBjb2RleyR9IGluIHN5bWJvbCBuYW1lczsgZXhjZXB0aW9ucyBhcmUKLW5vdGVkIGluIEByZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LiAgVGhhdCBjaGFyYWN0ZXIgbWF5IGJlIGZvbGxvd2VkIGJ5IGFueQotc3RyaW5nIG9mIGRpZ2l0cywgbGV0dGVycywgZG9sbGFyIHNpZ25zICh1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkIGluCi1AcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSksIGFuZCB1bmRlcnNjb3Jlcy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEEyOUsKLUZvciB0aGUgQU1EIDI5SyBmYW1pbHksIEBzYW1wez99IGlzIGFsc28gYWxsb3dlZCBpbiB0aGUKLWJvZHkgb2YgYSBzeW1ib2wgbmFtZSwgdGhvdWdoIG5vdCBhdCBpdHMgYmVnaW5uaW5nLgotQGVuZCBpZnNldAotCi1AaWZzZXQgU1BFQ0lBTC1TWU1TCi1AaWZzZXQgSDgKLVN5bWJvbCBuYW1lcyBiZWdpbiB3aXRoIGEgbGV0dGVyIG9yIHdpdGggb25lIG9mIEBzYW1wey5ffS4gIE9uIHRoZQotSGl0YWNoaSBTSCBvciB0aGUKLUg4LzUwMCwgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMuICBUaGF0IGNoYXJhY3RlciBtYXkKLWJlIGZvbGxvd2VkIGJ5IGFueSBzdHJpbmcgb2YgZGlnaXRzLCBsZXR0ZXJzLCBkb2xsYXIgc2lnbnMgKHNhdmUgb24gdGhlCi1IOC8zMDApLCBhbmQgdW5kZXJzY29yZXMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUNhc2Ugb2YgbGV0dGVycyBpcyBzaWduaWZpY2FudDogQGNvZGV7Zm9vfSBpcyBhIGRpZmZlcmVudCBzeW1ib2wgbmFtZQotdGhhbiBAY29kZXtGb299LgotCi1FYWNoIHN5bWJvbCBoYXMgZXhhY3RseSBvbmUgbmFtZS4gIEVhY2ggbmFtZSBpbiBhbiBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtCi1yZWZlcnMgdG8gZXhhY3RseSBvbmUgc3ltYm9sLiAgWW91IG1heSB1c2UgdGhhdCBzeW1ib2wgbmFtZSBhbnkgbnVtYmVyIG9mIHRpbWVzCi1pbiBhIHByb2dyYW0uCi0KLUBzdWJoZWFkaW5nIExvY2FsIFN5bWJvbCBOYW1lcwotCi1AY2luZGV4IGxvY2FsIHN5bWJvbCBuYW1lcwotQGNpbmRleCBzeW1ib2wgbmFtZXMsIGxvY2FsCi1AY2luZGV4IHRlbXBvcmFyeSBzeW1ib2wgbmFtZXMKLUBjaW5kZXggc3ltYm9sIG5hbWVzLCB0ZW1wb3JhcnkKLUxvY2FsIHN5bWJvbHMgaGVscCBjb21waWxlcnMgYW5kIHByb2dyYW1tZXJzIHVzZSBuYW1lcyB0ZW1wb3JhcmlseS4KLVRoZXJlIGFyZSB0ZW4gbG9jYWwgc3ltYm9sIG5hbWVzLCB3aGljaCBhcmUgcmUtdXNlZCB0aHJvdWdob3V0IHRoZQotcHJvZ3JhbS4gIFlvdSBtYXkgcmVmZXIgdG8gdGhlbSB1c2luZyB0aGUgbmFtZXMgQHNhbXB7MH0gQHNhbXB7MX0KLUBkb3Rze30gQHNhbXB7OX0uICBUbyBkZWZpbmUgYSBsb2NhbCBzeW1ib2wsIHdyaXRlIGEgbGFiZWwgb2YgdGhlIGZvcm0KLUBzYW1we0Bie059On0gKHdoZXJlIEBie059IHJlcHJlc2VudHMgYW55IGRpZ2l0KS4gIFRvIHJlZmVyIHRvIHRoZSBtb3N0Ci1yZWNlbnQgcHJldmlvdXMgZGVmaW5pdGlvbiBvZiB0aGF0IHN5bWJvbCB3cml0ZSBAc2FtcHtAYntOfWJ9LCB1c2luZyB0aGUKLXNhbWUgZGlnaXQgYXMgd2hlbiB5b3UgZGVmaW5lZCB0aGUgbGFiZWwuICBUbyByZWZlciB0byB0aGUgbmV4dAotZGVmaW5pdGlvbiBvZiBhIGxvY2FsIGxhYmVsLCB3cml0ZSBAc2FtcHtAYntOfWZ9LS0td2hlcmUgQGJ7Tn0gZ2l2ZXMgeW91Ci1hIGNob2ljZSBvZiAxMCBmb3J3YXJkIHJlZmVyZW5jZXMuICBUaGUgQHNhbXB7Yn0gc3RhbmRzIGZvcgotYGBiYWNrd2FyZHMnJyBhbmQgdGhlIEBzYW1we2Z9IHN0YW5kcyBmb3IgYGBmb3J3YXJkcycnLgotCi1Mb2NhbCBzeW1ib2xzIGFyZSBub3QgZW1pdHRlZCBieSB0aGUgY3VycmVudCBAc2N7Z251fSBDIGNvbXBpbGVyLgotCi1UaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBob3cgeW91IGNhbiB1c2UgdGhlc2UgbGFiZWxzLCBidXQKLXJlbWVtYmVyIHRoYXQgYXQgYW55IHBvaW50IGluIHRoZSBhc3NlbWJseSB5b3UgY2FuIHJlZmVyIHRvIGF0IG1vc3QKLTEwIHByaW9yIGxvY2FsIGxhYmVscyBhbmQgdG8gYXQgbW9zdCAxMCBmb3J3YXJkIGxvY2FsIGxhYmVscy4KLQotTG9jYWwgc3ltYm9sIG5hbWVzIGFyZSBvbmx5IGEgbm90YXRpb24gZGV2aWNlLiAgVGhleSBhcmUgaW1tZWRpYXRlbHkKLXRyYW5zZm9ybWVkIGludG8gbW9yZSBjb252ZW50aW9uYWwgc3ltYm9sIG5hbWVzIGJlZm9yZSB0aGUgYXNzZW1ibGVyCi11c2VzIHRoZW0uICBUaGUgc3ltYm9sIG5hbWVzIHN0b3JlZCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBhcHBlYXJpbmcgaW4KLWVycm9yIG1lc3NhZ2VzIGFuZCBvcHRpb25hbGx5IGVtaXR0ZWQgdG8gdGhlIG9iamVjdCBmaWxlIGhhdmUgdGhlc2UKLXBhcnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEwKLUFsbCBsb2NhbCBsYWJlbHMgYmVnaW4gd2l0aCBAc2FtcHtMfS4gTm9ybWFsbHkgYm90aCBAY29kZXtAdmFsdWV7QVN9fSBhbmQKLUBjb2Rle0B2YWx1ZXtMRH19IGZvcmdldCBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCBAc2FtcHtMfS4gVGhlc2UgbGFiZWxzIGFyZQotdXNlZCBmb3Igc3ltYm9scyB5b3UgYXJlIG5ldmVyIGludGVuZGVkIHRvIHNlZS4gIElmIHlvdSB1c2UgdGhlCi1Ac2FtcHstTH0gb3B0aW9uIHRoZW4gQGNvZGV7QHZhbHVle0FTfX0gcmV0YWlucyB0aGVzZSBzeW1ib2xzIGluIHRoZQotb2JqZWN0IGZpbGUuIElmIHlvdSBhbHNvIGluc3RydWN0IEBjb2Rle0B2YWx1ZXtMRH19IHRvIHJldGFpbiB0aGVzZSBzeW1ib2xzLAoteW91IG1heSB1c2UgdGhlbSBpbiBkZWJ1Z2dpbmcuCi0KLUBpdGVtIEB2YXJ7ZGlnaXR9Ci1JZiB0aGUgbGFiZWwgaXMgd3JpdHRlbiBAc2FtcHswOn0gdGhlbiB0aGUgZGlnaXQgaXMgQHNhbXB7MH0uCi1JZiB0aGUgbGFiZWwgaXMgd3JpdHRlbiBAc2FtcHsxOn0gdGhlbiB0aGUgZGlnaXQgaXMgQHNhbXB7MX0uCi1BbmQgc28gb24gdXAgdGhyb3VnaCBAc2FtcHs5On0uCi0KLUBpdGVtIEBrYmR7Qy1BfQotVGhpcyB1bnVzdWFsIGNoYXJhY3RlciBpcyBpbmNsdWRlZCBzbyB5b3UgZG8gbm90IGFjY2lkZW50YWxseSBpbnZlbnQKLWEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICBUaGUgY2hhcmFjdGVyIGhhcyBBU0NJSSB2YWx1ZQotQHNhbXB7XDAwMX0uCi0KLUBpdGVtIEBlbXBoe29yZGluYWwgbnVtYmVyfQotVGhpcyBpcyBhIHNlcmlhbCBudW1iZXIgdG8ga2VlcCB0aGUgbGFiZWxzIGRpc3RpbmN0LiAgVGhlIGZpcnN0Ci1Ac2FtcHswOn0gZ2V0cyB0aGUgbnVtYmVyIEBzYW1wezF9OyBUaGUgMTV0aCBAc2FtcHswOn0gZ2V0cyB0aGUKLW51bWJlciBAc2FtcHsxNX07IEBlbXBoe2V0Yy59LiAgTGlrZXdpc2UgZm9yIHRoZSBvdGhlciBsYWJlbHMgQHNhbXB7MTp9Ci10aHJvdWdoIEBzYW1wezk6fS4KLUBlbmQgdGFibGUKLQotRm9yIGluc3RhbmNlLCB0aGUgZmlyc3QgQGNvZGV7MTp9IGlzIG5hbWVkIEBjb2Rle0wxQGtiZHtDLUF9MX0sIHRoZSA0NHRoCi1AY29kZXszOn0gaXMgbmFtZWQgQGNvZGV7TDNAa2Jke0MtQX00NH0uCi0KLUBub2RlIERvdAotQHNlY3Rpb24gVGhlIFNwZWNpYWwgRG90IFN5bWJvbAotCi1AY2luZGV4IGRvdCAoc3ltYm9sKQotQGNpbmRleCBAY29kZXsufSAoc3ltYm9sKQotQGNpbmRleCBjdXJyZW50IGFkZHJlc3MKLUBjaW5kZXggbG9jYXRpb24gY291bnRlcgotVGhlIHNwZWNpYWwgc3ltYm9sIEBzYW1wey59IHJlZmVycyB0byB0aGUgY3VycmVudCBhZGRyZXNzIHRoYXQKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGFzc2VtYmxpbmcgaW50by4gIFRodXMsIHRoZSBleHByZXNzaW9uIEBzYW1we21lbHZpbjoKLS5sb25nIC59IGRlZmluZXMgQGNvZGV7bWVsdmlufSB0byBjb250YWluIGl0cyBvd24gYWRkcmVzcy4KLUFzc2lnbmluZyBhIHZhbHVlIHRvIEBjb2Rley59IGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSBAY29kZXsub3JnfQotZGlyZWN0aXZlLiAgVGh1cywgdGhlIGV4cHJlc3Npb24gQHNhbXB7Lj0uKzR9IGlzIHRoZSBzYW1lIGFzIHNheWluZwotQGlmY2xlYXIgbm8tc3BhY2UtZGlyCi1Ac2FtcHsuc3BhY2UgNH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBuby1zcGFjZS1kaXIKLUBpZnNldCBBMjlLCi1Ac2FtcHsuYmxvY2sgNH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFN5bWJvbCBBdHRyaWJ1dGVzCi1Ac2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcwotCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IGF0dHJpYnV0ZXMsIHN5bWJvbAotRXZlcnkgc3ltYm9sIGhhcywgYXMgd2VsbCBhcyBpdHMgbmFtZSwgdGhlIGF0dHJpYnV0ZXMgYGBWYWx1ZScnIGFuZAotYGBUeXBlJycuICBEZXBlbmRpbmcgb24gb3V0cHV0IGZvcm1hdCwgc3ltYm9scyBjYW4gYWxzbyBoYXZlIGF1eGlsaWFyeQotYXR0cmlidXRlcy4KLUBpZnNldCBJTlRFUk5BTFMKLVRoZSBkZXRhaWxlZCBkZWZpbml0aW9ucyBhcmUgaW4gQGZpbGV7YS5vdXQuaH0uCi1AZW5kIGlmc2V0Ci0KLUlmIHlvdSB1c2UgYSBzeW1ib2wgd2l0aG91dCBkZWZpbmluZyBpdCwgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB6ZXJvIGZvcgotYWxsIHRoZXNlIGF0dHJpYnV0ZXMsIGFuZCBwcm9iYWJseSB3b24ndCB3YXJuIHlvdS4gIFRoaXMgbWFrZXMgdGhlCi1zeW1ib2wgYW4gZXh0ZXJuYWxseSBkZWZpbmVkIHN5bWJvbCwgd2hpY2ggaXMgZ2VuZXJhbGx5IHdoYXQgeW91Ci13b3VsZCB3YW50LgotCi1AbWVudQotKiBTeW1ib2wgVmFsdWU6OiAgICAgICAgICAgICAgICBWYWx1ZQotKiBTeW1ib2wgVHlwZTo6ICAgICAgICAgICAgICAgICBUeXBlCi1AaWZzZXQgYW91dC1ib3V0Ci1AaWZzZXQgR0VORVJJQwotKiBhLm91dCBTeW1ib2xzOjogICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBCT1VUCi0qIGEub3V0IFN5bWJvbHM6OiAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEJPVVQKLSogYS5vdXQgU3ltYm9sczo6ICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fSwgQGNvZGV7Yi5vdXR9Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLUBpZnNldCBDT0ZGCi0qIENPRkYgU3ltYm9sczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBDT0ZGCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU09NCi0qIFNPTSBTeW1ib2xzOjogICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXMgZm9yIFNPTQotQGVuZCBpZnNldAotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbCBWYWx1ZQotQHN1YnNlY3Rpb24gVmFsdWUKLQotQGNpbmRleCB2YWx1ZSBvZiBhIHN5bWJvbAotQGNpbmRleCBzeW1ib2wgdmFsdWUKLVRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBpcyAodXN1YWxseSkgMzIgYml0cy4gIEZvciBhIHN5bWJvbCB3aGljaCBsYWJlbHMgYQotbG9jYXRpb24gaW4gdGhlIHRleHQsIGRhdGEsIGJzcyBvciBhYnNvbHV0ZSBzZWN0aW9ucyB0aGUgdmFsdWUgaXMgdGhlCi1udW1iZXIgb2YgYWRkcmVzc2VzIGZyb20gdGhlIHN0YXJ0IG9mIHRoYXQgc2VjdGlvbiB0byB0aGUgbGFiZWwuCi1OYXR1cmFsbHkgZm9yIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgY2hhbmdlcwotYXMgQGNvZGV7QHZhbHVle0xEfX0gY2hhbmdlcyBzZWN0aW9uIGJhc2UgYWRkcmVzc2VzIGR1cmluZyBsaW5raW5nLiAgQWJzb2x1dGUKLXN5bWJvbHMnIHZhbHVlcyBkbyBub3QgY2hhbmdlIGR1cmluZyBsaW5raW5nOiB0aGF0IGlzIHdoeSB0aGV5IGFyZQotY2FsbGVkIGFic29sdXRlLgotCi1UaGUgdmFsdWUgb2YgYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuICBJZiBpdCBpcwotMCB0aGVuIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBhc3NlbWJsZXIgc291cmNlIGZpbGUsIGFuZAotQGNvZGV7QHZhbHVle0xEfX0gdHJpZXMgdG8gZGV0ZXJtaW5lIGl0cyB2YWx1ZSBmcm9tIG90aGVyIGZpbGVzIGxpbmtlZCBpbnRvIHRoZQotc2FtZSBwcm9ncmFtLiAgWW91IG1ha2UgdGhpcyBraW5kIG9mIHN5bWJvbCBzaW1wbHkgYnkgbWVudGlvbmluZyBhIHN5bWJvbAotbmFtZSB3aXRob3V0IGRlZmluaW5nIGl0LiAgQSBub24temVybyB2YWx1ZSByZXByZXNlbnRzIGEgQGNvZGV7LmNvbW19Ci1jb21tb24gZGVjbGFyYXRpb24uICBUaGUgdmFsdWUgaXMgaG93IG11Y2ggY29tbW9uIHN0b3JhZ2UgdG8gcmVzZXJ2ZSwgaW4KLWJ5dGVzIChhZGRyZXNzZXMpLiAgVGhlIHN5bWJvbCByZWZlcnMgdG8gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgdGhlCi1hbGxvY2F0ZWQgc3RvcmFnZS4KLQotQG5vZGUgU3ltYm9sIFR5cGUKLUBzdWJzZWN0aW9uIFR5cGUKLQotQGNpbmRleCB0eXBlIG9mIGEgc3ltYm9sCi1AY2luZGV4IHN5bWJvbCB0eXBlCi1UaGUgdHlwZSBhdHRyaWJ1dGUgb2YgYSBzeW1ib2wgY29udGFpbnMgcmVsb2NhdGlvbiAoc2VjdGlvbikKLWluZm9ybWF0aW9uLCBhbnkgZmxhZyBzZXR0aW5ncyBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgaXMgZXh0ZXJuYWwsIGFuZAotKG9wdGlvbmFsbHkpLCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgbGlua2VycyBhbmQgZGVidWdnZXJzLiAgVGhlIGV4YWN0Ci1mb3JtYXQgZGVwZW5kcyBvbiB0aGUgb2JqZWN0LWNvZGUgb3V0cHV0IGZvcm1hdCBpbiB1c2UuCi0KLUBpZnNldCBhb3V0LWJvdXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBCT1VUCi1AYyBUaGUgZm9sbG93aW5nIGF2b2lkcyBhICJ3aWRvdyIgc3Vic2VjdGlvbiB0aXRsZS4gIEBncm91cCB3b3VsZCBiZQotQGMgYmV0dGVyIGlmIGl0IHdlcmUgYXZhaWxhYmxlIG91dHNpZGUgZXhhbXBsZXMuCi1AbmVlZCAxMDAwCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9LCBAY29kZXtiLm91dH0KLQotQGNpbmRleCBAY29kZXtiLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Iub3V0fQotVGhlc2Ugc3ltYm9sIGF0dHJpYnV0ZXMgYXBwZWFyIG9ubHkgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvcgotb25lIG9mIHRoZSBCZXJrZWxleS1kZXNjZW5kZWQgb2JqZWN0IG91dHB1dCBmb3JtYXRzLS0tQGNvZGV7YS5vdXR9IG9yCi1AY29kZXtiLm91dH0uCi0KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEJPVVQKLUBub2RlIGEub3V0IFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLQotQGNpbmRleCBAY29kZXthLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Eub3V0fQotCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLUBub2RlIGEub3V0IFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLQotQGNpbmRleCBAY29kZXthLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Eub3V0fQotCi1AZW5kIGlmc2V0Ci1AbWVudQotKiBTeW1ib2wgRGVzYzo6ICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yCi0qIFN5bWJvbCBPdGhlcjo6ICAgICAgICAgICAgICAgIE90aGVyCi1AZW5kIG1lbnUKLQotQG5vZGUgU3ltYm9sIERlc2MKLUBzdWJzdWJzZWN0aW9uIERlc2NyaXB0b3IKLQotQGNpbmRleCBkZXNjcmlwdG9yLCBvZiBAY29kZXthLm91dH0gc3ltYm9sCi1UaGlzIGlzIGFuIGFyYml0cmFyeSAxNi1iaXQgdmFsdWUuICBZb3UgbWF5IGVzdGFibGlzaCBhIHN5bWJvbCdzCi1kZXNjcmlwdG9yIHZhbHVlIGJ5IHVzaW5nIGEgQGNvZGV7LmRlc2N9IHN0YXRlbWVudAotKEBweHJlZntEZXNjLCxAY29kZXsuZGVzY319KS4gIEEgZGVzY3JpcHRvciB2YWx1ZSBtZWFucyBub3RoaW5nIHRvCi1AY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgU3ltYm9sIE90aGVyCi1Ac3Vic3Vic2VjdGlvbiBPdGhlcgotCi1AY2luZGV4IG90aGVyIGF0dHJpYnV0ZSwgb2YgQGNvZGV7YS5vdXR9IHN5bWJvbAotVGhpcyBpcyBhbiBhcmJpdHJhcnkgOC1iaXQgdmFsdWUuICBJdCBtZWFucyBub3RoaW5nIHRvIEBjb2Rle0B2YWx1ZXtBU319LgotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgQ09GRiBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcyBmb3IgQ09GRgotCi1AY2luZGV4IENPRkYgc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIENPRkYKLQotVGhlIENPRkYgZm9ybWF0IHN1cHBvcnRzIGEgbXVsdGl0dWRlIG9mIGF1eGlsaWFyeSBzeW1ib2wgYXR0cmlidXRlczsKLWxpa2UgdGhlIHByaW1hcnkgc3ltYm9sIGF0dHJpYnV0ZXMsIHRoZXkgYXJlIHNldCBiZXR3ZWVuIEBjb2Rley5kZWZ9IGFuZAotQGNvZGV7LmVuZGVmfSBkaXJlY3RpdmVzLgotCi1Ac3Vic3Vic2VjdGlvbiBQcmltYXJ5IEF0dHJpYnV0ZXMKLQotQGNpbmRleCBwcmltYXJ5IGF0dHJpYnV0ZXMsIENPRkYgc3ltYm9scwotVGhlIHN5bWJvbCBuYW1lIGlzIHNldCB3aXRoIEBjb2Rley5kZWZ9OyB0aGUgdmFsdWUgYW5kIHR5cGUsCi1yZXNwZWN0aXZlbHksIHdpdGggQGNvZGV7LnZhbH0gYW5kIEBjb2Rley50eXBlfS4KLQotQHN1YnN1YnNlY3Rpb24gQXV4aWxpYXJ5IEF0dHJpYnV0ZXMKLQotQGNpbmRleCBhdXhpbGlhcnkgYXR0cmlidXRlcywgQ09GRiBzeW1ib2xzCi1UaGUgQGNvZGV7QHZhbHVle0FTfX0gZGlyZWN0aXZlcyBAY29kZXsuZGltfSwgQGNvZGV7LmxpbmV9LCBAY29kZXsuc2NsfSwKLUBjb2Rley5zaXplfSwgYW5kIEBjb2Rley50YWd9IGNhbiBnZW5lcmF0ZSBhdXhpbGlhcnkgc3ltYm9sIHRhYmxlCi1pbmZvcm1hdGlvbiBmb3IgQ09GRi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNPTQotQG5vZGUgU09NIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBTT00KLQotQGNpbmRleCBTT00gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIFNPTQotCi1UaGUgU09NIGZvcm1hdCBmb3IgdGhlIEhQUEEgc3VwcG9ydHMgYSBtdWx0aXR1ZGUgb2Ygc3ltYm9sIGF0dHJpYnV0ZXMgc2V0IHdpdGgKLXRoZSBAY29kZXsuRVhQT1JUfSBhbmQgQGNvZGV7LklNUE9SVH0gZGlyZWN0aXZlcy4KLQotVGhlIGF0dHJpYnV0ZXMgYXJlIGRlc2NyaWJlZCBpbiBAY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMCBBc3NlbWJseSAKLUxhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9IChIUCA5MjQzMi05MDAwMSkgdW5kZXIgdGhlIEBjb2Rle0lNUE9SVH0gYW5kCi1AY29kZXtFWFBPUlR9IGFzc2VtYmxlciBkaXJlY3RpdmUgZG9jdW1lbnRhdGlvbi4KLUBlbmQgaWZzZXQKLQotQG5vZGUgRXhwcmVzc2lvbnMKLUBjaGFwdGVyIEV4cHJlc3Npb25zCi0KLUBjaW5kZXggZXhwcmVzc2lvbnMKLUBjaW5kZXggYWRkcmVzc2VzCi1AY2luZGV4IG51bWVyaWMgdmFsdWVzCi1BbiBAZGZue2V4cHJlc3Npb259IHNwZWNpZmllcyBhbiBhZGRyZXNzIG9yIG51bWVyaWMgdmFsdWUuCi1XaGl0ZXNwYWNlIG1heSBwcmVjZWRlIGFuZC9vciBmb2xsb3cgYW4gZXhwcmVzc2lvbi4KLQotVGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIG11c3QgYmUgYW4gYWJzb2x1dGUgbnVtYmVyLCBvciBlbHNlIGFuIG9mZnNldCBpbnRvCi1hIHBhcnRpY3VsYXIgc2VjdGlvbi4gIElmIGFuIGV4cHJlc3Npb24gaXMgbm90IGFic29sdXRlLCBhbmQgdGhlcmUgaXMgbm90Ci1lbm91Z2ggaW5mb3JtYXRpb24gd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBzZWVzIHRoZSBleHByZXNzaW9uIHRvIGtub3cgaXRzCi1zZWN0aW9uLCBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIHNvdXJjZSBwcm9ncmFtIG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBpbnRlcnByZXQKLXRoZSBleHByZXNzaW9uLS0tYnV0IHRoZSBzZWNvbmQgcGFzcyBpcyBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkLgotQGNvZGV7QHZhbHVle0FTfX0gYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIHNpdHVhdGlvbi4KLQotQG1lbnUKLSogRW1wdHkgRXhwcnM6OiAgICAgICAgICAgICAgICAgRW1wdHkgRXhwcmVzc2lvbnMKLSogSW50ZWdlciBFeHByczo6ICAgICAgICAgICAgICAgSW50ZWdlciBFeHByZXNzaW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIEVtcHR5IEV4cHJzCi1Ac2VjdGlvbiBFbXB0eSBFeHByZXNzaW9ucwotCi1AY2luZGV4IGVtcHR5IGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBlbXB0eQotQW4gZW1wdHkgZXhwcmVzc2lvbiBoYXMgbm8gdmFsdWU6IGl0IGlzIGp1c3Qgd2hpdGVzcGFjZSBvciBudWxsLgotV2hlcmV2ZXIgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBpcyByZXF1aXJlZCwgeW91IG1heSBvbWl0IHRoZQotZXhwcmVzc2lvbiwgYW5kIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgYSB2YWx1ZSBvZiAoYWJzb2x1dGUpIDAuICBUaGlzCi1pcyBjb21wYXRpYmxlIHdpdGggb3RoZXIgYXNzZW1ibGVycy4KLQotQG5vZGUgSW50ZWdlciBFeHBycwotQHNlY3Rpb24gSW50ZWdlciBFeHByZXNzaW9ucwotCi1AY2luZGV4IGludGVnZXIgZXhwcmVzc2lvbnMKLUBjaW5kZXggZXhwcmVzc2lvbnMsIGludGVnZXIKLUFuIEBkZm57aW50ZWdlciBleHByZXNzaW9ufSBpcyBvbmUgb3IgbW9yZSBAZW1waHthcmd1bWVudHN9IGRlbGltaXRlZAotYnkgQGVtcGh7b3BlcmF0b3JzfS4KLQotQG1lbnUKLSogQXJndW1lbnRzOjogICAgICAgICAgICAgICAgICAgQXJndW1lbnRzCi0qIE9wZXJhdG9yczo6ICAgICAgICAgICAgICAgICAgIE9wZXJhdG9ycwotKiBQcmVmaXggT3BzOjogICAgICAgICAgICAgICAgICBQcmVmaXggT3BlcmF0b3JzCi0qIEluZml4IE9wczo6ICAgICAgICAgICAgICAgICAgIEluZml4IE9wZXJhdG9ycwotQGVuZCBtZW51Ci0KLUBub2RlIEFyZ3VtZW50cwotQHN1YnNlY3Rpb24gQXJndW1lbnRzCi0KLUBjaW5kZXggZXhwcmVzc2lvbiBhcmd1bWVudHMKLUBjaW5kZXggYXJndW1lbnRzIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IG9wZXJhbmRzIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IGFyaXRobWV0aWMgb3BlcmFuZHMKLUBkZm57QXJndW1lbnRzfSBhcmUgc3ltYm9scywgbnVtYmVycyBvciBzdWJleHByZXNzaW9ucy4gIEluIG90aGVyCi1jb250ZXh0cyBhcmd1bWVudHMgYXJlIHNvbWV0aW1lcyBjYWxsZWQgYGBhcml0aG1ldGljIG9wZXJhbmRzJycuICBJbgotdGhpcyBtYW51YWwsIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGVtIHdpdGggdGhlIGBgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMnJyBvZgotdGhlIG1hY2hpbmUgbGFuZ3VhZ2UsIHdlIHVzZSB0aGUgdGVybSBgYGFyZ3VtZW50JycgdG8gcmVmZXIgdG8gcGFydHMgb2YKLWV4cHJlc3Npb25zIG9ubHksIHJlc2VydmluZyB0aGUgd29yZCBgYG9wZXJhbmQnJyB0byByZWZlciBvbmx5IHRvIG1hY2hpbmUKLWluc3RydWN0aW9uIG9wZXJhbmRzLgotCi1TeW1ib2xzIGFyZSBldmFsdWF0ZWQgdG8geWllbGQgQHtAdmFye3NlY3Rpb259IEB2YXJ7Tk5OfUB9IHdoZXJlCi1AdmFye3NlY3Rpb259IGlzIG9uZSBvZiB0ZXh0LCBkYXRhLCBic3MsIGFic29sdXRlLAotb3IgdW5kZWZpbmVkLiAgQHZhcntOTk59IGlzIGEgc2lnbmVkLCAyJ3MgY29tcGxlbWVudCAzMiBiaXQKLWludGVnZXIuCi0KLU51bWJlcnMgYXJlIHVzdWFsbHkgaW50ZWdlcnMuCi0KLUEgbnVtYmVyIGNhbiBiZSBhIGZsb251bSBvciBiaWdudW0uICBJbiB0aGlzIGNhc2UsIHlvdSBhcmUgd2FybmVkCi10aGF0IG9ubHkgdGhlIGxvdyBvcmRlciAzMiBiaXRzIGFyZSB1c2VkLCBhbmQgQGNvZGV7QHZhbHVle0FTfX0gcHJldGVuZHMKLXRoZXNlIDMyIGJpdHMgYXJlIGFuIGludGVnZXIuICBZb3UgbWF5IHdyaXRlIGludGVnZXItbWFuaXB1bGF0aW5nCi1pbnN0cnVjdGlvbnMgdGhhdCBhY3Qgb24gZXhvdGljIGNvbnN0YW50cywgY29tcGF0aWJsZSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzLgotCi1AY2luZGV4IHN1YmV4cHJlc3Npb25zCi1TdWJleHByZXNzaW9ucyBhcmUgYSBsZWZ0IHBhcmVudGhlc2lzIEBzYW1weyh9IGZvbGxvd2VkIGJ5IGFuIGludGVnZXIKLWV4cHJlc3Npb24sIGZvbGxvd2VkIGJ5IGEgcmlnaHQgcGFyZW50aGVzaXMgQHNhbXB7KX07IG9yIGEgcHJlZml4Ci1vcGVyYXRvciBmb2xsb3dlZCBieSBhbiBhcmd1bWVudC4KLQotQG5vZGUgT3BlcmF0b3JzCi1Ac3Vic2VjdGlvbiBPcGVyYXRvcnMKLQotQGNpbmRleCBvcGVyYXRvcnMsIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IGFyaXRobWV0aWMgZnVuY3Rpb25zCi1AY2luZGV4IGZ1bmN0aW9ucywgaW4gZXhwcmVzc2lvbnMKLUBkZm57T3BlcmF0b3JzfSBhcmUgYXJpdGhtZXRpYyBmdW5jdGlvbnMsIGxpa2UgQGNvZGV7K30gb3IgQGNvZGV7JX0uICBQcmVmaXgKLW9wZXJhdG9ycyBhcmUgZm9sbG93ZWQgYnkgYW4gYXJndW1lbnQuICBJbmZpeCBvcGVyYXRvcnMgYXBwZWFyCi1iZXR3ZWVuIHRoZWlyIGFyZ3VtZW50cy4gIE9wZXJhdG9ycyBtYXkgYmUgcHJlY2VkZWQgYW5kL29yIGZvbGxvd2VkIGJ5Ci13aGl0ZXNwYWNlLgotCi1Abm9kZSBQcmVmaXggT3BzCi1Ac3Vic2VjdGlvbiBQcmVmaXggT3BlcmF0b3IKLQotQGNpbmRleCBwcmVmaXggb3BlcmF0b3JzCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgdGhlIGZvbGxvd2luZyBAZGZue3ByZWZpeCBvcGVyYXRvcnN9LiAgVGhleSBlYWNoIHRha2UKLW9uZSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhYnNvbHV0ZS4KLQotQGMgdGhlIHRleC9lbmQgdGV4IHN0dWZmIHN1cnJvdW5kaW5nIHRoaXMgc21hbGwgdGFibGUgaXMgbWVhbnQgdG8gbWFrZQotQGMgaXQgYWxpZ24sIG9uIHRoZSBwcmludGVkIHBhZ2UsIHdpdGggdGhlIHNpbWlsYXIgdGFibGUgaW4gdGhlIG5leHQKLUBjIHNlY3Rpb24gKHdoaWNoIGlzIGluc2lkZSBhbiBlbnVtZXJhdGUpLgotQHRleAotXGdsb2JhbFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxpdGVtaW5kZW50Ci1AZW5kIHRleAotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC0KLUBkZm57TmVnYXRpb259LiAgVHdvJ3MgY29tcGxlbWVudCBuZWdhdGlvbi4KLUBpdGVtIH4KLUBkZm57Q29tcGxlbWVudGF0aW9ufS4gIEJpdHdpc2Ugbm90LgotQGVuZCB0YWJsZQotCi1AdGV4Ci1cZ2xvYmFsXGFkdmFuY2VcbGVmdHNraXAgYnkgLVxpdGVtaW5kZW50Ci1AZW5kIHRleAotCi1Abm9kZSBJbmZpeCBPcHMKLUBzdWJzZWN0aW9uIEluZml4IE9wZXJhdG9ycwotCi1AY2luZGV4IGluZml4IG9wZXJhdG9ycwotQGNpbmRleCBvcGVyYXRvcnMsIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBkZm57SW5maXggb3BlcmF0b3JzfSB0YWtlIHR3byBhcmd1bWVudHMsIG9uZSBvbiBlaXRoZXIgc2lkZS4gIE9wZXJhdG9ycwotaGF2ZSBwcmVjZWRlbmNlLCBidXQgb3BlcmF0aW9ucyB3aXRoIGVxdWFsIHByZWNlZGVuY2UgYXJlIHBlcmZvcm1lZCBsZWZ0Ci10byByaWdodC4gIEFwYXJ0IGZyb20gQGNvZGV7K30gb3IgQGNvZGV7LX0sIGJvdGggYXJndW1lbnRzIG11c3QgYmUKLWFic29sdXRlLCBhbmQgdGhlIHJlc3VsdCBpcyBhYnNvbHV0ZS4KLQotQGVudW1lcmF0ZQotQGNpbmRleCBvcGVyYXRvciBwcmVjZWRlbmNlCi1AY2luZGV4IHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzCi0KLUBpdGVtCi1IaWdoZXN0IFByZWNlZGVuY2UKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAqCi1AZGZue011bHRpcGxpY2F0aW9ufS4KLQotQGl0ZW0gLwotQGRmbntEaXZpc2lvbn0uICBUcnVuY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBDIG9wZXJhdG9yIEBzYW1wey99Ci0KLUBpdGVtICUKLUBkZm57UmVtYWluZGVyfS4KLQotQGl0ZW0gPAotQGl0ZW14IDw8Ci1AZGZue1NoaWZ0IExlZnR9LiAgU2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHs8PH0uCi0KLUBpdGVtID4KLUBpdGVteCA+PgotQGRmbntTaGlmdCBSaWdodH0uICBTYW1lIGFzIHRoZSBDIG9wZXJhdG9yIEBzYW1wez4+fS4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLUludGVybWVkaWF0ZSBwcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gfAotCi1AZGZue0JpdHdpc2UgSW5jbHVzaXZlIE9yfS4KLQotQGl0ZW0gJgotQGRmbntCaXR3aXNlIEFuZH0uCi0KLUBpdGVtIF4KLUBkZm57Qml0d2lzZSBFeGNsdXNpdmUgT3J9LgotCi1AaXRlbSAhCi1AZGZue0JpdHdpc2UgT3IgTm90fS4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLUxvd2VzdCBQcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBhZGRpdGlvbiwgcGVybWl0dGVkIGFyZ3VtZW50cwotQGNpbmRleCBwbHVzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBmb3IgYWRkaXRpb24KLUBpdGVtICsKLUBkZm57QWRkaXRpb259LiAgSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGFic29sdXRlLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2VjdGlvbiBvZgotdGhlIG90aGVyIGFyZ3VtZW50LiAgWW91IG1heSBub3QgYWRkIHRvZ2V0aGVyIGFyZ3VtZW50cyBmcm9tIGRpZmZlcmVudAotc2VjdGlvbnMuCi0KLUBjaW5kZXggc3VidHJhY3Rpb24sIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggbWludXMsIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggYXJndW1lbnRzIGZvciBzdWJ0cmFjdGlvbgotQGl0ZW0gLQotQGRmbntTdWJ0cmFjdGlvbn0uICBJZiB0aGUgcmlnaHQgYXJndW1lbnQgaXMgYWJzb2x1dGUsIHRoZQotcmVzdWx0IGhhcyB0aGUgc2VjdGlvbiBvZiB0aGUgbGVmdCBhcmd1bWVudC4KLUlmIGJvdGggYXJndW1lbnRzIGFyZSBpbiB0aGUgc2FtZSBzZWN0aW9uLCB0aGUgcmVzdWx0IGlzIGFic29sdXRlLgotWW91IG1heSBub3Qgc3VidHJhY3QgYXJndW1lbnRzIGZyb20gZGlmZmVyZW50IHNlY3Rpb25zLgotQGMgRklYTUUgaXMgdGhlcmUgc3RpbGwgc29tZXRoaW5nIHVzZWZ1bCB0byBzYXkgYWJvdXQgdW5kZWZpbmVkIC0gdW5kZWZpbmVkID8KLUBlbmQgdGFibGUKLUBlbmQgZW51bWVyYXRlCi0KLUluIHNob3J0LCBpdCdzIG9ubHkgbWVhbmluZ2Z1bCB0byBhZGQgb3Igc3VidHJhY3QgdGhlIEBlbXBoe29mZnNldHN9IGluIGFuCi1hZGRyZXNzOyB5b3UgY2FuIG9ubHkgaGF2ZSBhIGRlZmluZWQgc2VjdGlvbiBpbiBvbmUgb2YgdGhlIHR3byBhcmd1bWVudHMuCi0KLUBub2RlIFBzZXVkbyBPcHMKLUBjaGFwdGVyIEFzc2VtYmxlciBEaXJlY3RpdmVzCi0KLUBjaW5kZXggZGlyZWN0aXZlcywgbWFjaGluZSBpbmRlcGVuZGVudAotQGNpbmRleCBwc2V1ZG8tb3BzLCBtYWNoaW5lIGluZGVwZW5kZW50Ci1AY2luZGV4IG1hY2hpbmUgaW5kZXBlbmRlbnQgZGlyZWN0aXZlcwotQWxsIGFzc2VtYmxlciBkaXJlY3RpdmVzIGhhdmUgbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgcGVyaW9kIChAc2FtcHsufSkuCi1UaGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBsZXR0ZXJzLCB1c3VhbGx5IGluIGxvd2VyIGNhc2UuCi0KLVRoaXMgY2hhcHRlciBkaXNjdXNzZXMgZGlyZWN0aXZlcyB0aGF0IGFyZSBhdmFpbGFibGUgcmVnYXJkbGVzcyBvZiB0aGUKLXRhcmdldCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIuCi1AaWZzZXQgR0VORVJJQwotU29tZSBtYWNoaW5lIGNvbmZpZ3VyYXRpb25zIHByb3ZpZGUgYWRkaXRpb25hbCBkaXJlY3RpdmVzLgotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IG1hY2hpbmUtZGlyZWN0aXZlcwotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9IGZvciBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG1lbnUKLSogQWJvcnQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFib3J0fQotQGlmc2V0IENPRkYKLSogQUJPUlQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LkFCT1JUfQotQGVuZCBpZnNldAotCi0qIEFsaWduOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5hbGlnbiBAdmFye2Ficy1leHByfSAsIEB2YXJ7YWJzLWV4cHJ9fQotKiBBc2NpaTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYXNjaWkgIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotKiBBc2Npejo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYXNjaXogIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotKiBCYWxpZ246OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYmFsaWduIEB2YXJ7YWJzLWV4cHJ9ICwgQHZhcnthYnMtZXhwcn19Ci0qIEJ5dGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5ieXRlIEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBDb21tOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH0gfQotKiBEYXRhOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZGF0YSBAdmFye3N1YnNlY3Rpb259fQotQGlmc2V0IENPRkYKLSogRGVmOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRlZiBAdmFye25hbWV9fQotQGVuZCBpZnNldAotQGlmc2V0IGFvdXQtYm91dAotKiBEZXNjOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZGVzYyBAdmFye3N5bWJvbH0sIEB2YXJ7YWJzLWV4cHJlc3Npb259fQotQGVuZCBpZnNldAotQGlmc2V0IENPRkYKLSogRGltOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRpbX0KLUBlbmQgaWZzZXQKLQotKiBEb3VibGU6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZG91YmxlIEB2YXJ7ZmxvbnVtc319Ci0qIEVqZWN0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lamVjdH0KLSogRWxzZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVsc2V9Ci0qIEVuZDo6CQkJCUBjb2Rley5lbmR9Ci1AaWZzZXQgQ09GRgotKiBFbmRlZjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZW5kZWZ9Ci1AZW5kIGlmc2V0Ci0KLSogRW5kZnVuYzo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVuZGZ1bmN9Ci0qIEVuZGlmOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbmRpZn0KLSogRXF1OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVxdSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIEVxdWl2OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lcXVpdiBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIEVycjo6CQkJCUBjb2Rley5lcnJ9Ci0qIEV4aXRtOjoJCQlAY29kZXsuZXhpdG19Ci0qIEV4dGVybjo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5leHRlcm59Ci0qIEZhaWw6OgkJCUBjb2Rley5mYWlsfQotQGlmY2xlYXIgbm8tZmlsZS1kaXIKLSogRmlsZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZpbGUgQHZhcntzdHJpbmd9fQotQGVuZCBpZmNsZWFyCi0KLSogRmlsbDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZpbGwgQHZhcntyZXBlYXR9ICwgQHZhcntzaXplfSAsIEB2YXJ7dmFsdWV9fQotKiBGbG9hdDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZmxvYXQgQHZhcntmbG9udW1zfX0KLSogRnVuYzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZ1bmN9ICAKLSogR2xvYmFsOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lmdsb2JhbCBAdmFye3N5bWJvbH19LCBAY29kZXsuZ2xvYmwgQHZhcntzeW1ib2x9fQotKiBod29yZDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuaHdvcmQgQHZhcntleHByZXNzaW9uc319Ci0qIElkZW50OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pZGVudH0KLSogSWY6OiAgICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmlmIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn19Ci0qIEluY2x1ZGU6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pbmNsdWRlICJAdmFye2ZpbGV9In0KLSogSW50OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmludCBAdmFye2V4cHJlc3Npb25zfX0KLSogSXJwOjoJCQkJQGNvZGV7LmlycCBAdmFye3N5bWJvbH0sQHZhcnt2YWx1ZXN9fUBkb3Rze30KLSogSXJwYzo6CQkJQGNvZGV7LmlycGMgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0qIExjb21tOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH19Ci0qIExmbGFnczo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sZmxhZ3N9Ci1AaWZjbGVhciBuby1saW5lLWRpcgotKiBMaW5lOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGluZSBAdmFye2xpbmUtbnVtYmVyfX0KLUBlbmQgaWZjbGVhcgotCi0qIExuOjogICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sbiBAdmFye2xpbmUtbnVtYmVyfX0KLSogTGlua29uY2U6OgkJCUBjb2Rley5saW5rb25jZSBbQHZhcnt0eXBlfV19Ci0qIExpc3Q6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5saXN0fQotKiBMb25nOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubG9uZyBAdmFye2V4cHJlc3Npb25zfX0KLUBpZ25vcmUKLSogTHN5bTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxzeW0gQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotQGVuZCBpZ25vcmUKLQotKiBNYWNybzo6CQkJQGNvZGV7Lm1hY3JvIEB2YXJ7bmFtZX0gQHZhcnthcmdzfX1AZG90c3t9Ci0qIE1SSTo6CQkJCUBjb2Rley5tcmkgQHZhcnt2YWx9fQotCi0qIE5vbGlzdDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5ub2xpc3R9Ci0qIE9jdGE6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5vY3RhIEB2YXJ7YmlnbnVtc319Ci0qIE9yZzo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5vcmcgQHZhcntuZXctbGN9ICwgQHZhcntmaWxsfX0KLSogUDJhbGlnbjo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnAyYWxpZ24gQHZhcnthYnMtZXhwcn0gLCBAdmFye2Ficy1leHByfX0KLSogUHJpbnQ6OgkJCUBjb2Rley5wcmludCBAdmFye3N0cmluZ319Ci0qIFBzaXplOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5wc2l6ZSBAdmFye2xpbmVzfSwgQHZhcntjb2x1bW5zfX0KLSogUHVyZ2VtOjoJCQlAY29kZXsucHVyZ2VtIEB2YXJ7bmFtZX19Ci0qIFF1YWQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5xdWFkIEB2YXJ7YmlnbnVtc319Ci0qIFJlcHQ6OgkJCUBjb2Rley5yZXB0IEB2YXJ7Y291bnR9fQotKiBTYnR0bDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2J0dGwgIkB2YXJ7c3ViaGVhZGluZ30ifQotQGlmc2V0IENPRkYKLSogU2NsOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNjbCBAdmFye2NsYXNzfX0KLSogU2VjdGlvbjo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNlY3Rpb24gQHZhcntuYW1lfSwgQHZhcntzdWJzZWN0aW9ufX0KLUBlbmQgaWZzZXQKLQotKiBTZXQ6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2V0IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLSogU2hvcnQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNob3J0IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBTaW5nbGU6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2luZ2xlIEB2YXJ7ZmxvbnVtc319Ci1AaWZzZXQgQ09GRgotKiBTaXplOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2l6ZX0KLUBlbmQgaWZzZXQKLQotKiBTa2lwOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2tpcCBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLSogU2xlYjEyODo6CQkJQGNvZGV7LnNsZWIxMjggQHZhcntleHByZXNzaW9uc319Ci0qIFNwYWNlOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zcGFjZSBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLUBpZnNldCBoYXZlLXN0YWJzCi0qIFN0YWI6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zdGFiZCwgLnN0YWJuLCAuc3RhYnN9Ci1AZW5kIGlmc2V0Ci0KLSogU3RyaW5nOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnN0cmluZyAiQHZhcntzdHJ9In0KLSogU3RydWN0OjoJCQlAY29kZXsuc3RydWN0IEB2YXJ7ZXhwcmVzc2lvbn19Ci1AaWZzZXQgRUxGCi0qIFN5bXZlcjo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zeW12ZXIgQHZhcntuYW1lfSxAdmFye25hbWUyQEBub2RlbmFtZX19Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgQ09GRgotKiBUYWc6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudGFnIEB2YXJ7c3RydWN0bmFtZX19Ci1AZW5kIGlmc2V0Ci0KLSogVGV4dDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRleHQgQHZhcntzdWJzZWN0aW9ufX0KLSogVGl0bGU6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRpdGxlICJAdmFye2hlYWRpbmd9In0KLUBpZnNldCBDT0ZGCi0qIFR5cGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50eXBlIEB2YXJ7aW50fX0KLSogVmFsOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnZhbCBAdmFye2FkZHJ9fQotQGVuZCBpZnNldAotCi0qIFVsZWIxMjg6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley51bGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBXb3JkOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsud29yZCBAdmFye2V4cHJlc3Npb25zfX0KLSogRGVwcmVjYXRlZDo6ICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZCBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQWJvcnQKLUBzZWN0aW9uIEBjb2Rley5hYm9ydH0KLQotQGNpbmRleCBAY29kZXthYm9ydH0gZGlyZWN0aXZlCi1AY2luZGV4IHN0b3BwaW5nIHRoZSBhc3NlbWJseQotVGhpcyBkaXJlY3RpdmUgc3RvcHMgdGhlIGFzc2VtYmx5IGltbWVkaWF0ZWx5LiAgSXQgaXMgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4gIFRoZSBvcmlnaW5hbCBpZGVhIHdhcyB0aGF0IHRoZQotYXNzZW1ibHkgbGFuZ3VhZ2Ugc291cmNlIHdvdWxkIGJlIHBpcGVkIGludG8gdGhlIGFzc2VtYmxlci4gIElmIHRoZSBzZW5kZXIKLW9mIHRoZSBzb3VyY2UgcXVpdCwgaXQgY291bGQgdXNlIHRoaXMgZGlyZWN0aXZlIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvCi1xdWl0IGFsc28uICBPbmUgZGF5IEBjb2Rley5hYm9ydH0gd2lsbCBub3QgYmUgc3VwcG9ydGVkLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgQUJPUlQKLUBzZWN0aW9uIEBjb2Rley5BQk9SVH0KLQotQGNpbmRleCBAY29kZXtBQk9SVH0gZGlyZWN0aXZlCi1XaGVuIHByb2R1Y2luZyBDT0ZGIG91dHB1dCwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBhcyBhCi1zeW5vbnltIGZvciBAc2FtcHsuYWJvcnR9LgotCi1AaWZzZXQgQk9VVAotV2hlbiBwcm9kdWNpbmcgQGNvZGV7Yi5vdXR9IG91dHB1dCwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwKLWJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBBbGlnbgotQHNlY3Rpb24gQGNvZGV7LmFsaWduIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn19Ci0KLUBjaW5kZXggcGFkZGluZyB0aGUgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBAY29kZXthbGlnbn0gZGlyZWN0aXZlCi1QYWQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgKGluIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIHRvIGEgcGFydGljdWxhciBzdG9yYWdlCi1ib3VuZGFyeS4gIFRoZSBmaXJzdCBleHByZXNzaW9uICh3aGljaCBtdXN0IGJlIGFic29sdXRlKSBpcyB0aGUgYWxpZ25tZW50Ci1yZXF1aXJlZCwgYXMgZGVzY3JpYmVkIGJlbG93LgotCi1UaGUgc2Vjb25kIGV4cHJlc3Npb24gKGFsc28gYWJzb2x1dGUpIGdpdmVzIHRoZSBmaWxsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKLXBhZGRpbmcgYnl0ZXMuICBJdCAoYW5kIHRoZSBjb21tYSkgbWF5IGJlIG9taXR0ZWQuICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUKLXBhZGRpbmcgYnl0ZXMgYXJlIG5vcm1hbGx5IHplcm8uICBIb3dldmVyLCBvbiBzb21lIHN5c3RlbXMsIGlmIHRoZSBzZWN0aW9uIGlzCi1tYXJrZWQgYXMgY29udGFpbmluZyBjb2RlIGFuZCB0aGUgZmlsbCB2YWx1ZSBpcyBvbWl0dGVkLCB0aGUgc3BhY2UgaXMgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucy4KLQotVGhlIHRoaXJkIGV4cHJlc3Npb24gaXMgYWxzbyBhYnNvbHV0ZSwgYW5kIGlzIGFsc28gb3B0aW9uYWwuICBJZiBpdCBpcyBwcmVzZW50LAotaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYnkgdGhpcyBhbGlnbm1lbnQKLWRpcmVjdGl2ZS4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gdGhlCi1zcGVjaWZpZWQgbWF4aW11bSwgdGhlbiB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4gIFlvdSBjYW4gb21pdCB0aGUKLWZpbGwgdmFsdWUgKHRoZSBzZWNvbmQgYXJndW1lbnQpIGVudGlyZWx5IGJ5IHNpbXBseSB1c2luZyB0d28gY29tbWFzIGFmdGVyIHRoZQotcmVxdWlyZWQgYWxpZ25tZW50OyB0aGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGFsaWdubWVudCB0byBiZSBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVRoZSB3YXkgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBpcyBzcGVjaWZpZWQgdmFyaWVzIGZyb20gc3lzdGVtIHRvIHN5c3RlbS4KLUZvciB0aGUgYTI5aywgaHBwYSwgbTY4aywgbTg4aywgdzY1LCBzcGFyYywgYW5kIEhpdGFjaGkgU0gsIGFuZCBpMzg2IHVzaW5nIEVMRgotZm9ybWF0LAotdGhlIGZpcnN0IGV4cHJlc3Npb24gaXMgdGhlCi1hbGlnbm1lbnQgcmVxdWVzdCBpbiBieXRlcy4gIEZvciBleGFtcGxlIEBzYW1wey5hbGlnbiA4fSBhZHZhbmNlcwotdGhlIGxvY2F0aW9uIGNvdW50ZXIgdW50aWwgaXQgaXMgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIKLWlzIGFscmVhZHkgYSBtdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1Gb3Igb3RoZXIgc3lzdGVtcywgaW5jbHVkaW5nIHRoZSBpMzg2IHVzaW5nIGEub3V0IGZvcm1hdCwgaXQgaXMgdGhlCi1udW1iZXIgb2YgbG93LW9yZGVyIHplcm8gYml0cyB0aGUgbG9jYXRpb24gY291bnRlciBtdXN0IGhhdmUgYWZ0ZXIKLWFkdmFuY2VtZW50LiAgRm9yIGV4YW1wbGUgQHNhbXB7LmFsaWduIDN9IGFkdmFuY2VzIHRoZSBsb2NhdGlvbgotY291bnRlciB1bnRpbCBpdCBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlciBpcyBhbHJlYWR5IGEKLW11bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCi0KLVRoaXMgaW5jb25zaXN0ZW5jeSBpcyBkdWUgdG8gdGhlIGRpZmZlcmVudCBiZWhhdmlvcnMgb2YgdGhlIHZhcmlvdXMKLW5hdGl2ZSBhc3NlbWJsZXJzIGZvciB0aGVzZSBzeXN0ZW1zIHdoaWNoIEdBUyBtdXN0IGVtdWxhdGUuCi1HQVMgYWxzbyBwcm92aWRlcyBAY29kZXsuYmFsaWdufSBhbmQgQGNvZGV7LnAyYWxpZ259IGRpcmVjdGl2ZXMsCi1kZXNjcmliZWQgbGF0ZXIsIHdoaWNoIGhhdmUgYSBjb25zaXN0ZW50IGJlaGF2aW9yIGFjcm9zcyBhbGwKLWFyY2hpdGVjdHVyZXMgKGJ1dCBhcmUgc3BlY2lmaWMgdG8gR0FTKS4KLQotQG5vZGUgQXNjaWkKLUBzZWN0aW9uIEBjb2Rley5hc2NpaSAiQHZhcntzdHJpbmd9In1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7YXNjaWl9IGRpcmVjdGl2ZQotQGNpbmRleCBzdHJpbmcgbGl0ZXJhbHMKLUBjb2Rley5hc2NpaX0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgc3RyaW5nIGxpdGVyYWxzIChAcHhyZWZ7U3RyaW5nc30pCi1zZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQgYXNzZW1ibGVzIGVhY2ggc3RyaW5nICh3aXRoIG5vIGF1dG9tYXRpYwotdHJhaWxpbmcgemVybyBieXRlKSBpbnRvIGNvbnNlY3V0aXZlIGFkZHJlc3Nlcy4KLQotQG5vZGUgQXNjaXoKLUBzZWN0aW9uIEBjb2Rley5hc2NpeiAiQHZhcntzdHJpbmd9In1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7YXNjaXp9IGRpcmVjdGl2ZQotQGNpbmRleCB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncwotQGNpbmRleCBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncwotQGNvZGV7LmFzY2l6fSBpcyBqdXN0IGxpa2UgQGNvZGV7LmFzY2lpfSwgYnV0IGVhY2ggc3RyaW5nIGlzIGZvbGxvd2VkIGJ5Ci1hIHplcm8gYnl0ZS4gIFRoZSBgYHonJyBpbiBAc2FtcHsuYXNjaXp9IHN0YW5kcyBmb3IgYGB6ZXJvJycuCi0KLUBub2RlIEJhbGlnbgotQHNlY3Rpb24gQGNvZGV7LmJhbGlnblt3bF0gQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfX0KLQotQGNpbmRleCBwYWRkaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGdpdmVuIG51bWJlciBvZiBieXRlcwotQGNpbmRleCBAY29kZXtiYWxpZ259IGRpcmVjdGl2ZQotUGFkIHRoZSBsb2NhdGlvbiBjb3VudGVyIChpbiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSB0byBhIHBhcnRpY3VsYXIKLXN0b3JhZ2UgYm91bmRhcnkuICBUaGUgZmlyc3QgZXhwcmVzc2lvbiAod2hpY2ggbXVzdCBiZSBhYnNvbHV0ZSkgaXMgdGhlCi1hbGlnbm1lbnQgcmVxdWVzdCBpbiBieXRlcy4gIEZvciBleGFtcGxlIEBzYW1wey5iYWxpZ24gOH0gYWR2YW5jZXMKLXRoZSBsb2NhdGlvbiBjb3VudGVyIHVudGlsIGl0IGlzIGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyCi1pcyBhbHJlYWR5IGEgbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KLQotVGhlIHNlY29uZCBleHByZXNzaW9uIChhbHNvIGFic29sdXRlKSBnaXZlcyB0aGUgZmlsbCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1wYWRkaW5nIGJ5dGVzLiAgSXQgKGFuZCB0aGUgY29tbWEpIG1heSBiZSBvbWl0dGVkLiAgSWYgaXQgaXMgb21pdHRlZCwgdGhlCi1wYWRkaW5nIGJ5dGVzIGFyZSBub3JtYWxseSB6ZXJvLiAgSG93ZXZlciwgb24gc29tZSBzeXN0ZW1zLCBpZiB0aGUgc2VjdGlvbiBpcwotbWFya2VkIGFzIGNvbnRhaW5pbmcgY29kZSBhbmQgdGhlIGZpbGwgdmFsdWUgaXMgb21pdHRlZCwgdGhlIHNwYWNlIGlzIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMuCi0KLVRoZSB0aGlyZCBleHByZXNzaW9uIGlzIGFsc28gYWJzb2x1dGUsIGFuZCBpcyBhbHNvIG9wdGlvbmFsLiAgSWYgaXQgaXMgcHJlc2VudCwKLWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoaXMgYWxpZ25tZW50Ci1kaXJlY3RpdmUuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIHRoZQotc3BlY2lmaWVkIG1heGltdW0sIHRoZW4gdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuICBZb3UgY2FuIG9taXQgdGhlCi1maWxsIHZhbHVlICh0aGUgc2Vjb25kIGFyZ3VtZW50KSBlbnRpcmVseSBieSBzaW1wbHkgdXNpbmcgdHdvIGNvbW1hcyBhZnRlciB0aGUKLXJlcXVpcmVkIGFsaWdubWVudDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBhbGlnbm1lbnQgdG8gYmUgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlLgotCi1AY2luZGV4IEBjb2Rle2JhbGlnbnd9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtiYWxpZ25sfSBkaXJlY3RpdmUKLVRoZSBAY29kZXsuYmFsaWdud30gYW5kIEBjb2Rley5iYWxpZ25sfSBkaXJlY3RpdmVzIGFyZSB2YXJpYW50cyBvZiB0aGUKLUBjb2Rley5iYWxpZ259IGRpcmVjdGl2ZS4gIFRoZSBAY29kZXsuYmFsaWdud30gZGlyZWN0aXZlIHRyZWF0cyB0aGUgZmlsbAotcGF0dGVybiBhcyBhIHR3byBieXRlIHdvcmQgdmFsdWUuICBUaGUgQGNvZGV7LmJhbGlnbmx9IGRpcmVjdGl2ZXMgdHJlYXRzIHRoZQotZmlsbCBwYXR0ZXJuIGFzIGEgZm91ciBieXRlIGxvbmd3b3JkIHZhbHVlLiAgRm9yIGV4YW1wbGUsIEBjb2Rley5iYWxpZ253Ci00LDB4MzY4ZH0gd2lsbCBhbGlnbiB0byBhIG11bHRpcGxlIG9mIDQuICBJZiBpdCBza2lwcyB0d28gYnl0ZXMsIHRoZXkgd2lsbCBiZQotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIDB4MzY4ZCAodGhlIGV4YWN0IHBsYWNlbWVudCBvZiB0aGUgYnl0ZXMgZGVwZW5kcyB1cG9uCi10aGUgZW5kaWFubmVzcyBvZiB0aGUgcHJvY2Vzc29yKS4gIElmIGl0IHNraXBzIDEgb3IgMyBieXRlcywgdGhlIGZpbGwgdmFsdWUgaXMKLXVuZGVmaW5lZC4KLQotQG5vZGUgQnl0ZQotQHNlY3Rpb24gQGNvZGV7LmJ5dGUgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7Ynl0ZX0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXJzLCBvbmUgYnl0ZQotQGNvZGV7LmJ5dGV9IGV4cGVjdHMgemVybyBvciBtb3JlIGV4cHJlc3Npb25zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgotRWFjaCBleHByZXNzaW9uIGlzIGFzc2VtYmxlZCBpbnRvIHRoZSBuZXh0IGJ5dGUuCi0KLUBub2RlIENvbW0KLUBzZWN0aW9uIEBjb2Rley5jb21tIEB2YXJ7c3ltYm9sfSAsIEB2YXJ7bGVuZ3RofSB9Ci0KLUBjaW5kZXggQGNvZGV7Y29tbX0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCwgY29tbW9uCi1AY29kZXsuY29tbX0gZGVjbGFyZXMgYSBjb21tb24gc3ltYm9sIG5hbWVkIEB2YXJ7c3ltYm9sfS4gIFdoZW4gbGlua2luZywgYQotY29tbW9uIHN5bWJvbCBpbiBvbmUgb2JqZWN0IGZpbGUgbWF5IGJlIG1lcmdlZCB3aXRoIGEgZGVmaW5lZCBvciBjb21tb24gc3ltYm9sCi1vZiB0aGUgc2FtZSBuYW1lIGluIGFub3RoZXIgb2JqZWN0IGZpbGUuICBJZiBAY29kZXtAdmFsdWV7TER9fSBkb2VzIG5vdCBzZWUgYQotZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbC0tanVzdCBvbmUgb3IgbW9yZSBjb21tb24gc3ltYm9scy0tdGhlbiBpdCB3aWxsCi1hbGxvY2F0ZSBAdmFye2xlbmd0aH0gYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuICBAdmFye2xlbmd0aH0gbXVzdCBiZSBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbi4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IHNlZXMgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgd2l0aAotdGhlIHNhbWUgbmFtZSwgYW5kIHRoZXkgZG8gbm90IGFsbCBoYXZlIHRoZSBzYW1lIHNpemUsIGl0IHdpbGwgYWxsb2NhdGUgc3BhY2UKLXVzaW5nIHRoZSBsYXJnZXN0IHNpemUuCi0KLUBpZnNldCBFTEYKLVdoZW4gdXNpbmcgRUxGLCB0aGUgQGNvZGV7LmNvbW19IGRpcmVjdGl2ZSB0YWtlcyBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudC4KLVRoaXMgaXMgdGhlIGRlc2lyZWQgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wsIHNwZWNpZmllZCBhcyBhIGJ5dGUgYm91bmRhcnkgKGZvcgotZXhhbXBsZSwgYW4gYWxpZ25tZW50IG9mIDE2IG1lYW5zIHRoYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IDQgYml0cyBvZiB0aGUKLWFkZHJlc3Mgc2hvdWxkIGJlIHplcm8pLiAgVGhlIGFsaWdubWVudCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24sIGFuZCBpdAotbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IGFsbG9jYXRlcyB1bmluaXRpYWxpemVkIG1lbW9yeQotZm9yIHRoZSBjb21tb24gc3ltYm9sLCBpdCB3aWxsIHVzZSB0aGUgYWxpZ25tZW50IHdoZW4gcGxhY2luZyB0aGUgc3ltYm9sLiAgSWYKLW5vIGFsaWdubWVudCBpcyBzcGVjaWZpZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgc2V0IHRoZSBhbGlnbm1lbnQgdG8gdGhlCi1sYXJnZXN0IHBvd2VyIG9mIHR3byBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHN5bWJvbCwgdXAgdG8gYQotbWF4aW11bSBvZiAxNi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rley5jb21tfSBkaWZmZXJzIHNsaWdodGx5IG9uIHRoZSBIUFBBLiAgVGhlIHN5bnRheCBpcwotQHNhbXB7QHZhcntzeW1ib2x9IC5jb21tLCBAdmFye2xlbmd0aH19OyBAdmFye3N5bWJvbH0gaXMgb3B0aW9uYWwuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIERhdGEKLUBzZWN0aW9uIEBjb2Rley5kYXRhIEB2YXJ7c3Vic2VjdGlvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZGF0YX0gZGlyZWN0aXZlCi1AY29kZXsuZGF0YX0gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIG9udG8gdGhlCi1lbmQgb2YgdGhlIGRhdGEgc3Vic2VjdGlvbiBudW1iZXJlZCBAdmFye3N1YnNlY3Rpb259ICh3aGljaCBpcyBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbikuICBJZiBAdmFye3N1YnNlY3Rpb259IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzCi10byB6ZXJvLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgRGVmCi1Ac2VjdGlvbiBAY29kZXsuZGVmIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7ZGVmfSBkaXJlY3RpdmUKLUBjaW5kZXggQ09GRiBzeW1ib2xzLCBkZWJ1Z2dpbmcKLUBjaW5kZXggZGVidWdnaW5nIENPRkYgc3ltYm9scwotQmVnaW4gZGVmaW5pbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbCBAdmFye25hbWV9OyB0aGUKLWRlZmluaXRpb24gZXh0ZW5kcyB1bnRpbCB0aGUgQGNvZGV7LmVuZGVmfSBkaXJlY3RpdmUgaXMgZW5jb3VudGVyZWQuCi1AaWZzZXQgQk9VVAotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IG9ic2VydmVkIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgQ09GRgotZm9ybWF0IG91dHB1dDsgd2hlbiBwcm9kdWNpbmcgQGNvZGV7Yi5vdXR9LCBAc2FtcHsuZGVmfSBpcyByZWNvZ25pemVkLAotYnV0IGlnbm9yZWQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBpZnNldCBhb3V0LWJvdXQKLUBub2RlIERlc2MKLUBzZWN0aW9uIEBjb2Rley5kZXNjIEB2YXJ7c3ltYm9sfSwgQHZhcnthYnMtZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZGVzY30gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgc3ltYm9sIGRlc2NyaXB0b3IKLUBjaW5kZXggc3ltYm9sIGRlc2NyaXB0b3IsIENPRkYKLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHN5bWJvbCAoQHB4cmVme1N5bWJvbCBBdHRyaWJ1dGVzfSkKLXRvIHRoZSBsb3cgMTYgYml0cyBvZiBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLgotCi1AaWZzZXQgQ09GRgotVGhlIEBzYW1wey5kZXNjfSBkaXJlY3RpdmUgaXMgbm90IGF2YWlsYWJsZSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBDT0ZGIG91dHB1dDsgaXQgaXMgb25seSBmb3IgQGNvZGV7YS5vdXR9IG9yIEBjb2Rle2Iub3V0fQotb2JqZWN0IGZvcm1hdC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXRpYmlsaXR5LCBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzCi1pdCwgYnV0IHByb2R1Y2VzIG5vIG91dHB1dCwgd2hlbiBjb25maWd1cmVkIGZvciBDT0ZGLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgRGltCi1Ac2VjdGlvbiBAY29kZXsuZGltfQotCi1AY2luZGV4IEBjb2Rle2RpbX0gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgYXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbgotQGNpbmRleCBhdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey5kaW19IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIERvdWJsZQotQHNlY3Rpb24gQGNvZGV7LmRvdWJsZSBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKGRvdWJsZSkKLUBjb2Rley5kb3VibGV9IGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotYXNzZW1ibGVzIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSBAc2FtcHsuZG91YmxlfSBlbWl0cyA2NC1iaXQgZmxvYXRpbmctcG9pbnQgbnVtYmVycwotaW4gQHNje2llZWV9IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBFamVjdAotQHNlY3Rpb24gQGNvZGV7LmVqZWN0fQotCi1AY2luZGV4IEBjb2Rle2VqZWN0fSBkaXJlY3RpdmUKLUBjaW5kZXggbmV3IHBhZ2UsIGluIGxpc3RpbmdzCi1AY2luZGV4IHBhZ2UsIGluIGxpc3RpbmdzCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogbmV3IHBhZ2UKLUZvcmNlIGEgcGFnZSBicmVhayBhdCB0aGlzIHBvaW50LCB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLUBub2RlIEVsc2UKLUBzZWN0aW9uIEBjb2Rley5lbHNlfQotCi1AY2luZGV4IEBjb2Rle2Vsc2V9IGRpcmVjdGl2ZQotQGNvZGV7LmVsc2V9IGlzIHBhcnQgb2YgdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsCi1hc3NlbWJseTsgQHB4cmVme0lmLCxAY29kZXsuaWZ9fS4gIEl0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uCi1vZiBjb2RlIHRvIGJlIGFzc2VtYmxlZCBpZiB0aGUgY29uZGl0aW9uIGZvciB0aGUgcHJlY2VkaW5nIEBjb2Rley5pZn0KLXdhcyBmYWxzZS4KLQotQG5vZGUgRW5kCi1Ac2VjdGlvbiBAY29kZXsuZW5kfQotCi1AY2luZGV4IEBjb2Rle2VuZH0gZGlyZWN0aXZlCi1AY29kZXsuZW5kfSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSBmaWxlLiAgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QKLXByb2Nlc3MgYW55dGhpbmcgaW4gdGhlIGZpbGUgcGFzdCB0aGUgQGNvZGV7LmVuZH0gZGlyZWN0aXZlLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgRW5kZWYKLUBzZWN0aW9uIEBjb2Rley5lbmRlZn0KLQotQGNpbmRleCBAY29kZXtlbmRlZn0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBmbGFncyB0aGUgZW5kIG9mIGEgc3ltYm9sIGRlZmluaXRpb24gYmVndW4gd2l0aAotQGNvZGV7LmRlZn0uCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsuZW5kZWZ9IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyBpZgotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCB0byBnZW5lcmF0ZSBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcwotZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBFbmRmdW5jCi1Ac2VjdGlvbiBAY29kZXsuZW5kZnVuY30KLUBjaW5kZXggQGNvZGV7ZW5kZnVuY30gZGlyZWN0aXZlCi1AY29kZXsuZW5kZnVuY30gbWFya3MgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIHNwZWNpZmllZCB3aXRoIEBjb2Rley5mdW5jfS4KLQotQG5vZGUgRW5kaWYKLUBzZWN0aW9uIEBjb2Rley5lbmRpZn0KLQotQGNpbmRleCBAY29kZXtlbmRpZn0gZGlyZWN0aXZlCi1AY29kZXsuZW5kaWZ9IGlzIHBhcnQgb2YgdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsIGFzc2VtYmx5OwotaXQgbWFya3MgdGhlIGVuZCBvZiBhIGJsb2NrIG9mIGNvZGUgdGhhdCBpcyBvbmx5IGFzc2VtYmxlZAotY29uZGl0aW9uYWxseS4gIEB4cmVme0lmLCxAY29kZXsuaWZ9fS4KLQotQG5vZGUgRXF1Ci1Ac2VjdGlvbiBAY29kZXsuZXF1IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLQotQGNpbmRleCBAY29kZXtlcXV9IGRpcmVjdGl2ZQotQGNpbmRleCBhc3NpZ25pbmcgdmFsdWVzIHRvIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgYXNzaWduaW5nIHZhbHVlcyB0bwotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgdmFsdWUgb2YgQHZhcntzeW1ib2x9IHRvIEB2YXJ7ZXhwcmVzc2lvbn0uCi1JdCBpcyBzeW5vbnltb3VzIHdpdGggQHNhbXB7LnNldH07IEBweHJlZntTZXQsLEBjb2Rley5zZXR9fS4KLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rle2VxdX0gb24gdGhlIEhQUEEgaXMgCi1Ac2FtcHtAdmFye3N5bWJvbH0gLmVxdSBAdmFye2V4cHJlc3Npb259fS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgRXF1aXYKLUBzZWN0aW9uIEBjb2Rley5lcXVpdiBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci1AY2luZGV4IEBjb2Rle2VxdWl2fSBkaXJlY3RpdmUKLVRoZSBAY29kZXsuZXF1aXZ9IGRpcmVjdGl2ZSBpcyBsaWtlIEBjb2Rley5lcXV9IGFuZCBAY29kZXsuc2V0fSwgZXhjZXB0IHRoYXQKLXRoZSBhc3NlbWJsZXIgd2lsbCBzaWduYWwgYW4gZXJyb3IgaWYgQHZhcntzeW1ib2x9IGlzIGFscmVhZHkgZGVmaW5lZC4KLQotRXhjZXB0IGZvciB0aGUgY29udGVudHMgb2YgdGhlIGVycm9yIG1lc3NhZ2UsIHRoaXMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIAotQHNtYWxsZXhhbXBsZQotLmlmZGVmIFNZTQotLmVycgotLmVuZGlmCi0uZXF1IFNZTSxWQUwKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEVycgotQHNlY3Rpb24gQGNvZGV7LmVycn0KLUBjaW5kZXggQGNvZGV7ZXJyfSBkaXJlY3RpdmUKLUlmIEBjb2Rle0B2YWx1ZXtBU319IGFzc2VtYmxlcyBhIEBjb2Rley5lcnJ9IGRpcmVjdGl2ZSwgaXQgd2lsbCBwcmludCBhbiBlcnJvcgotbWVzc2FnZSBhbmQsIHVubGVzcyB0aGUgQGNvZGV7LVp9IG9wdGlvbiB3YXMgdXNlZCwgaXQgd2lsbCBub3QgZ2VuZXJhdGUgYW4KLW9iamVjdCBmaWxlLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzaWduYWwgZXJyb3IgYW4gY29uZGl0aW9uYWxseSBjb21waWxlZCBjb2RlLgotCi1Abm9kZSBFeGl0bQotQHNlY3Rpb24gQGNvZGV7LmV4aXRtfQotRXhpdCBlYXJseSBmcm9tIHRoZSBjdXJyZW50IG1hY3JvIGRlZmluaXRpb24uICBAeHJlZntNYWNyb30uCi0KLUBub2RlIEV4dGVybgotQHNlY3Rpb24gQGNvZGV7LmV4dGVybn0KLQotQGNpbmRleCBAY29kZXtleHRlcm59IGRpcmVjdGl2ZQotQGNvZGV7LmV4dGVybn0gaXMgYWNjZXB0ZWQgaW4gdGhlIHNvdXJjZSBwcm9ncmFtLS0tZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgYXNzZW1ibGVycy0tLWJ1dCBpdCBpcyBpZ25vcmVkLiAgQGNvZGV7QHZhbHVle0FTfX0gdHJlYXRzCi1hbGwgdW5kZWZpbmVkIHN5bWJvbHMgYXMgZXh0ZXJuYWwuCi0KLUBub2RlIEZhaWwKLUBzZWN0aW9uIEBjb2Rley5mYWlsIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZmFpbH0gZGlyZWN0aXZlCi1HZW5lcmF0ZXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLiAgSWYgdGhlIHZhbHVlIG9mIHRoZSBAdmFye2V4cHJlc3Npb259IGlzIDUwMAotb3IgbW9yZSwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBwcmludCBhIHdhcm5pbmcgbWVzc2FnZS4gIElmIHRoZSB2YWx1ZSBpcyBsZXNzCi10aGFuIDUwMCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBwcmludCBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIG1lc3NhZ2Ugd2lsbAotaW5jbHVkZSB0aGUgdmFsdWUgb2YgQHZhcntleHByZXNzaW9ufS4gIFRoaXMgY2FuIG9jY2FzaW9uYWxseSBiZSB1c2VmdWwgaW5zaWRlCi1jb21wbGV4IG5lc3RlZCBtYWNyb3Mgb3IgY29uZGl0aW9uYWwgYXNzZW1ibHkuCi0KLUBpZmNsZWFyIG5vLWZpbGUtZGlyCi1Abm9kZSBGaWxlCi1Ac2VjdGlvbiBAY29kZXsuZmlsZSBAdmFye3N0cmluZ319Ci0KLUBjaW5kZXggQGNvZGV7ZmlsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGxvZ2ljYWwgZmlsZSBuYW1lCi1AY2luZGV4IGZpbGUgbmFtZSwgbG9naWNhbAotQGNvZGV7LmZpbGV9IHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRoYXQgd2UgYXJlIGFib3V0IHRvIHN0YXJ0IGEgbmV3IGxvZ2ljYWwKLWZpbGUuICBAdmFye3N0cmluZ30gaXMgdGhlIG5ldyBmaWxlIG5hbWUuICBJbiBnZW5lcmFsLCB0aGUgZmlsZW5hbWUgaXMKLXJlY29nbml6ZWQgd2hldGhlciBvciBub3QgaXQgaXMgc3Vycm91bmRlZCBieSBxdW90ZXMgQHNhbXB7In07IGJ1dCBpZiB5b3Ugd2lzaAotdG8gc3BlY2lmeSBhbiBlbXB0eSBmaWxlIG5hbWUsIHlvdSBtdXN0IGdpdmUgdGhlIHF1b3Rlcy0tQGNvZGV7IiJ9LiAgVGhpcwotc3RhdGVtZW50IG1heSBnbyBhd2F5IGluIGZ1dHVyZTogaXQgaXMgb25seSByZWNvZ25pemVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aAotb2xkIEBjb2Rle0B2YWx1ZXtBU319IHByb2dyYW1zLgotQGlmc2V0IEEyOUsKLUluIHNvbWUgY29uZmlndXJhdGlvbnMgb2YgQGNvZGV7QHZhbHVle0FTfX0sIEBjb2Rley5maWxlfSBoYXMgYWxyZWFkeSBiZWVuCi1yZW1vdmVkIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIGFzc2VtYmxlcnMuICBAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgRmlsbAotQHNlY3Rpb24gQGNvZGV7LmZpbGwgQHZhcntyZXBlYXR9ICwgQHZhcntzaXplfSAsIEB2YXJ7dmFsdWV9fQotCi1AY2luZGV4IEBjb2Rle2ZpbGx9IGRpcmVjdGl2ZQotQGNpbmRleCB3cml0aW5nIHBhdHRlcm5zIGluIG1lbW9yeQotQGNpbmRleCBwYXR0ZXJucywgd3JpdGluZyBpbiBtZW1vcnkKLUB2YXJ7cmVzdWx0fSwgQHZhcntzaXplfSBhbmQgQHZhcnt2YWx1ZX0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLgotVGhpcyBlbWl0cyBAdmFye3JlcGVhdH0gY29waWVzIG9mIEB2YXJ7c2l6ZX0gYnl0ZXMuICBAdmFye1JlcGVhdH0KLW1heSBiZSB6ZXJvIG9yIG1vcmUuICBAdmFye1NpemV9IG1heSBiZSB6ZXJvIG9yIG1vcmUsIGJ1dCBpZiBpdCBpcwotbW9yZSB0aGFuIDgsIHRoZW4gaXQgaXMgZGVlbWVkIHRvIGhhdmUgdGhlIHZhbHVlIDgsIGNvbXBhdGlibGUgd2l0aAotb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4gIFRoZSBjb250ZW50cyBvZiBlYWNoIEB2YXJ7cmVwZWF0fSBieXRlcwotaXMgdGFrZW4gZnJvbSBhbiA4LWJ5dGUgbnVtYmVyLiAgVGhlIGhpZ2hlc3Qgb3JkZXIgNCBieXRlcyBhcmUKLXplcm8uICBUaGUgbG93ZXN0IG9yZGVyIDQgYnl0ZXMgYXJlIEB2YXJ7dmFsdWV9IHJlbmRlcmVkIGluIHRoZQotYnl0ZS1vcmRlciBvZiBhbiBpbnRlZ2VyIG9uIHRoZSBjb21wdXRlciBAY29kZXtAdmFsdWV7QVN9fSBpcyBhc3NlbWJsaW5nIGZvci4KLUVhY2ggQHZhcntzaXplfSBieXRlcyBpbiBhIHJlcGV0aXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgbG93ZXN0IG9yZGVyCi1AdmFye3NpemV9IGJ5dGVzIG9mIHRoaXMgbnVtYmVyLiAgQWdhaW4sIHRoaXMgYml6YXJyZSBiZWhhdmlvciBpcwotY29tcGF0aWJsZSB3aXRoIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuCi0KLUB2YXJ7c2l6ZX0gYW5kIEB2YXJ7dmFsdWV9IGFyZSBvcHRpb25hbC4KLUlmIHRoZSBzZWNvbmQgY29tbWEgYW5kIEB2YXJ7dmFsdWV9IGFyZSBhYnNlbnQsIEB2YXJ7dmFsdWV9IGlzCi1hc3N1bWVkIHplcm8uICBJZiB0aGUgZmlyc3QgY29tbWEgYW5kIGZvbGxvd2luZyB0b2tlbnMgYXJlIGFic2VudCwKLUB2YXJ7c2l6ZX0gaXMgYXNzdW1lZCB0byBiZSAxLgotCi1Abm9kZSBGbG9hdAotQHNlY3Rpb24gQGNvZGV7LmZsb2F0IEB2YXJ7ZmxvbnVtc319Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoc2luZ2xlKQotQGNpbmRleCBAY29kZXtmbG9hdH0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBhc3NlbWJsZXMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBAY29kZXsuc2luZ2xlfS4KLUBpZnNldCBHRU5FUklDCi1UaGUgZXhhY3Qga2luZCBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzIGVtaXR0ZWQgZGVwZW5kcyBvbiBob3cKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQuCi1AeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSUVFRUZMT0FUCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LCBAY29kZXsuZmxvYXR9IGVtaXRzIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXJzCi1pbiBAc2N7aWVlZX0gZm9ybWF0LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIEZ1bmMKLUBzZWN0aW9uIEBjb2Rley5mdW5jIEB2YXJ7bmFtZX1bLEB2YXJ7bGFiZWx9XX0KLUBjaW5kZXggQGNvZGV7ZnVuY30gZGlyZWN0aXZlCi1AY29kZXsuZnVuY30gZW1pdHMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSBmdW5jdGlvbiBAdmFye25hbWV9LCBhbmQKLWlzIGlnbm9yZWQgdW5sZXNzIHRoZSBmaWxlIGlzIGFzc2VtYmxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLgotT25seSBAc2FtcHstLWdzdGFic30gaXMgY3VycmVudGx5IHN1cHBvcnRlZC4KLUB2YXJ7bGFiZWx9IGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgZnVuY3Rpb24gYW5kIGlmIG9taXR0ZWQgQHZhcntuYW1lfQotcHJlcGVuZGVkIHdpdGggdGhlIEBzYW1we2xlYWRpbmcgY2hhcn0gaXMgdXNlZC4KLUBzYW1we2xlYWRpbmcgY2hhcn0gaXMgdXN1YWxseSBAY29kZXtffSBvciBub3RoaW5nLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KLUFsbCBmdW5jdGlvbnMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIHRvIGhhdmUgQGNvZGV7dm9pZH0gcmV0dXJuIHR5cGUuCi1UaGUgZnVuY3Rpb24gbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggQGNvZGV7LmVuZGZ1bmN9LgotCi1Abm9kZSBHbG9iYWwKLUBzZWN0aW9uIEBjb2Rley5nbG9iYWwgQHZhcntzeW1ib2x9fSwgQGNvZGV7Lmdsb2JsIEB2YXJ7c3ltYm9sfX0KLQotQGNpbmRleCBAY29kZXtnbG9iYWx9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wsIG1ha2luZyB2aXNpYmxlIHRvIGxpbmtlcgotQGNvZGV7Lmdsb2JhbH0gbWFrZXMgdGhlIHN5bWJvbCB2aXNpYmxlIHRvIEBjb2Rle0B2YWx1ZXtMRH19LiAgSWYgeW91IGRlZmluZQotQHZhcntzeW1ib2x9IGluIHlvdXIgcGFydGlhbCBwcm9ncmFtLCBpdHMgdmFsdWUgaXMgbWFkZSBhdmFpbGFibGUgdG8KLW90aGVyIHBhcnRpYWwgcHJvZ3JhbXMgdGhhdCBhcmUgbGlua2VkIHdpdGggaXQuICBPdGhlcndpc2UsCi1AdmFye3N5bWJvbH0gdGFrZXMgaXRzIGF0dHJpYnV0ZXMgZnJvbSBhIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lCi1mcm9tIGFub3RoZXIgZmlsZSBsaW5rZWQgaW50byB0aGUgc2FtZSBwcm9ncmFtLgotCi1Cb3RoIHNwZWxsaW5ncyAoQHNhbXB7Lmdsb2JsfSBhbmQgQHNhbXB7Lmdsb2JhbH0pIGFyZSBhY2NlcHRlZCwgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4KLQotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBLCBAY29kZXsuZ2xvYmFsfSBpcyBub3QgYWx3YXlzIGVub3VnaCB0byBtYWtlIGl0IGFjY2Vzc2libGUgdG8gb3RoZXIKLXBhcnRpYWwgcHJvZ3JhbXMuICBZb3UgbWF5IG5lZWQgdGhlIEhQUEEtb25seSBAY29kZXsuRVhQT1JUfSBkaXJlY3RpdmUgYXMgd2VsbC4KLUB4cmVme0hQUEEgRGlyZWN0aXZlcywsIEhQUEEgQXNzZW1ibGVyIERpcmVjdGl2ZXN9LgotQGVuZCBpZnNldAotCi1Abm9kZSBod29yZAotQHNlY3Rpb24gQGNvZGV7Lmh3b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle2h3b3JkfSBkaXJlY3RpdmUKLUBjaW5kZXggaW50ZWdlcnMsIDE2LWJpdAotQGNpbmRleCBudW1iZXJzLCAxNi1iaXQKLUBjaW5kZXggc2l4dGVlbiBiaXQgaW50ZWdlcnMKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIGFuZCBlbWl0cwotYSAxNiBiaXQgbnVtYmVyIGZvciBlYWNoLgotCi1AaWZzZXQgR0VORVJJQwotVGhpcyBkaXJlY3RpdmUgaXMgYSBzeW5vbnltIGZvciBAc2FtcHsuc2hvcnR9OyBkZXBlbmRpbmcgb24gdGhlIHRhcmdldAotYXJjaGl0ZWN0dXJlLCBpdCBtYXkgYWxzbyBiZSBhIHN5bm9ueW0gZm9yIEBzYW1wey53b3JkfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMzIKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgQHNhbXB7LnNob3J0fS4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMTYKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgYm90aCBAc2FtcHsuc2hvcnR9IGFuZCBAc2FtcHsud29yZH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSWRlbnQKLUBzZWN0aW9uIEBjb2Rley5pZGVudH0KLQotQGNpbmRleCBAY29kZXtpZGVudH0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBpcyB1c2VkIGJ5IHNvbWUgYXNzZW1ibGVycyB0byBwbGFjZSB0YWdzIGluIG9iamVjdCBmaWxlcy4KLUBjb2Rle0B2YWx1ZXtBU319IHNpbXBseSBhY2NlcHRzIHRoZSBkaXJlY3RpdmUgZm9yIHNvdXJjZS1maWxlCi1jb21wYXRpYmlsaXR5IHdpdGggc3VjaCBhc3NlbWJsZXJzLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgZW1pdCBhbnl0aGluZwotZm9yIGl0LgotCi1Abm9kZSBJZgotQHNlY3Rpb24gQGNvZGV7LmlmIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggY29uZGl0aW9uYWwgYXNzZW1ibHkKLUBjaW5kZXggQGNvZGV7aWZ9IGRpcmVjdGl2ZQotQGNvZGV7LmlmfSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2VjdGlvbiBvZiBjb2RlIHdoaWNoIGlzIG9ubHkKLWNvbnNpZGVyZWQgcGFydCBvZiB0aGUgc291cmNlIHByb2dyYW0gYmVpbmcgYXNzZW1ibGVkIGlmIHRoZSBhcmd1bWVudAotKHdoaWNoIG11c3QgYmUgYW4gQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufSkgaXMgbm9uLXplcm8uICBUaGUgZW5kIG9mCi10aGUgY29uZGl0aW9uYWwgc2VjdGlvbiBvZiBjb2RlIG11c3QgYmUgbWFya2VkIGJ5IEBjb2Rley5lbmRpZn0KLShAcHhyZWZ7RW5kaWYsLEBjb2Rley5lbmRpZn19KTsgb3B0aW9uYWxseSwgeW91IG1heSBpbmNsdWRlIGNvZGUgZm9yIHRoZQotYWx0ZXJuYXRpdmUgY29uZGl0aW9uLCBmbGFnZ2VkIGJ5IEBjb2Rley5lbHNlfSAoQHB4cmVme0Vsc2UsLEBjb2Rley5lbHNlfX0pLgotCi1UaGUgZm9sbG93aW5nIHZhcmlhbnRzIG9mIEBjb2Rley5pZn0gYXJlIGFsc28gc3VwcG9ydGVkOgotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2lmZGVmfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmRlZiBAdmFye3N5bWJvbH0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgc3BlY2lmaWVkIEB2YXJ7c3ltYm9sfQotaGFzIGJlZW4gZGVmaW5lZC4KLQotQGNpbmRleCBAY29kZXtpZmN9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmYyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIHRoZSBzYW1lLiAgVGhlCi1zdHJpbmdzIG1heSBiZSBvcHRpb25hbGx5IHF1b3RlZCB3aXRoIHNpbmdsZSBxdW90ZXMuICBJZiB0aGV5IGFyZSBub3QgcXVvdGVkLAotdGhlIGZpcnN0IHN0cmluZyBzdG9wcyBhdCB0aGUgZmlyc3QgY29tbWEsIGFuZCB0aGUgc2Vjb25kIHN0cmluZyBzdG9wcyBhdCB0aGUKLWVuZCBvZiB0aGUgbGluZS4gIFN0cmluZ3Mgd2hpY2ggY29udGFpbiB3aGl0ZXNwYWNlIHNob3VsZCBiZSBxdW90ZWQuICBUaGUKLXN0cmluZyBjb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLgotCi1AY2luZGV4IEBjb2Rle2lmZXF9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmZXEgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmZXFzfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmVxcyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUFub3RoZXIgZm9ybSBvZiBAY29kZXsuaWZjfS4gIFRoZSBzdHJpbmdzIG11c3QgYmUgcXVvdGVkIHVzaW5nIGRvdWJsZSBxdW90ZXMuCi0KLUBjaW5kZXggQGNvZGV7aWZnZX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZnZSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiBvcgotZXF1YWwgdG8gemVyby4KLQotQGNpbmRleCBAY29kZXtpZmd0fSBkaXJlY3RpdmUKLUBpdGVtIC5pZmd0IEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZsZX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZsZSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbAotdG8gemVyby4KLQotQGNpbmRleCBAY29kZXtpZmx0fSBkaXJlY3RpdmUKLUBpdGVtIC5pZmx0IEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZuY30gZGlyZWN0aXZlCi1AaXRlbSAuaWZuYyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0uCi1MaWtlIEBjb2Rley5pZmN9LCBidXQgdGhlIHNlbnNlIG9mIHRoZSB0ZXN0IGlzIHJldmVyc2VkOiB0aGlzIGFzc2VtYmxlcyB0aGUKLWZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUuCi0KLUBjaW5kZXggQGNvZGV7aWZuZGVmfSBkaXJlY3RpdmUKLUBjaW5kZXggQGNvZGV7aWZub3RkZWZ9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbmRlZiBAdmFye3N5bWJvbH0KLUBpdGVteCAuaWZub3RkZWYgQHZhcntzeW1ib2x9Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHNwZWNpZmllZCBAdmFye3N5bWJvbH0KLWhhcyBub3QgYmVlbiBkZWZpbmVkLiAgQm90aCBzcGVsbGluZyB2YXJpYW50cyBhcmUgZXF1aXZhbGVudC4KLQotQGNpbmRleCBAY29kZXtpZm5lfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5lIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGVxdWFsIHRvIHplcm8KLShpbiBvdGhlciB3b3JkcywgdGhpcyBpcyBlcXVpdmFsZW50IHRvIEBjb2Rley5pZn0pLgotCi1AY2luZGV4IEBjb2Rle2lmbmVzfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5lcyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUxpa2UgQGNvZGV7LmlmZXFzfSwgYnV0IHRoZSBzZW5zZSBvZiB0aGUgdGVzdCBpcyByZXZlcnNlZDogdGhpcyBhc3NlbWJsZXMgdGhlCi1mb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmNsdWRlCi1Ac2VjdGlvbiBAY29kZXsuaW5jbHVkZSAiQHZhcntmaWxlfSJ9Ci0KLUBjaW5kZXggQGNvZGV7aW5jbHVkZX0gZGlyZWN0aXZlCi1AY2luZGV4IHN1cHBvcnRpbmcgZmlsZXMsIGluY2x1ZGluZwotQGNpbmRleCBmaWxlcywgaW5jbHVkaW5nCi1UaGlzIGRpcmVjdGl2ZSBwcm92aWRlcyBhIHdheSB0byBpbmNsdWRlIHN1cHBvcnRpbmcgZmlsZXMgYXQgc3BlY2lmaWVkCi1wb2ludHMgaW4geW91ciBzb3VyY2UgcHJvZ3JhbS4gIFRoZSBjb2RlIGZyb20gQHZhcntmaWxlfSBpcyBhc3NlbWJsZWQgYXMKLWlmIGl0IGZvbGxvd2VkIHRoZSBwb2ludCBvZiB0aGUgQGNvZGV7LmluY2x1ZGV9OyB3aGVuIHRoZSBlbmQgb2YgdGhlCi1pbmNsdWRlZCBmaWxlIGlzIHJlYWNoZWQsIGFzc2VtYmx5IG9mIHRoZSBvcmlnaW5hbCBmaWxlIGNvbnRpbnVlcy4gIFlvdQotY2FuIGNvbnRyb2wgdGhlIHNlYXJjaCBwYXRocyB1c2VkIHdpdGggdGhlIEBzYW1wey1JfSBjb21tYW5kLWxpbmUgb3B0aW9uCi0oQHB4cmVme0ludm9raW5nLCxDb21tYW5kLUxpbmUgT3B0aW9uc30pLiAgUXVvdGF0aW9uIG1hcmtzIGFyZSByZXF1aXJlZAotYXJvdW5kIEB2YXJ7ZmlsZX0uCi0KLUBub2RlIEludAotQHNlY3Rpb24gQGNvZGV7LmludCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZQotQGNpbmRleCBpbnRlZ2VycywgMzItYml0Ci1FeHBlY3QgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBvZiBhbnkgc2VjdGlvbiwgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLUZvciBlYWNoIGV4cHJlc3Npb24sIGVtaXQgYSBudW1iZXIgdGhhdCwgYXQgcnVuIHRpbWUsIGlzIHRoZSB2YWx1ZSBvZiB0aGF0Ci1leHByZXNzaW9uLiAgVGhlIGJ5dGUgb3JkZXIgYW5kIGJpdCBzaXplIG9mIHRoZSBudW1iZXIgZGVwZW5kcyBvbiB3aGF0IGtpbmQKLW9mIHRhcmdldCB0aGUgYXNzZW1ibHkgaXMgZm9yLgotCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgKLU9uIHRoZSBIOC81MDAgYW5kIG1vc3QgZm9ybXMgb2YgdGhlIEg4LzMwMCwgQGNvZGV7LmludH0gZW1pdHMgMTYtYml0Ci1pbnRlZ2Vycy4gIE9uIHRoZSBIOC8zMDBIIGFuZCB0aGUgSGl0YWNoaSBTSCwgaG93ZXZlciwgQGNvZGV7LmludH0gZW1pdHMKLTMyLWJpdCBpbnRlZ2Vycy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBJcnAKLUBzZWN0aW9uIEBjb2Rley5pcnAgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7aXJwfSBkaXJlY3RpdmUKLUV2YWx1YXRlIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBhc3NpZ25pbmcgZGlmZmVyZW50IHZhbHVlcyB0byBAdmFye3N5bWJvbH0uCi1UaGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBzdGFydHMgYXQgdGhlIEBjb2Rley5pcnB9IGRpcmVjdGl2ZSwgYW5kIGlzCi10ZXJtaW5hdGVkIGJ5IGFuIEBjb2Rley5lbmRyfSBkaXJlY3RpdmUuICBGb3IgZWFjaCBAdmFye3ZhbHVlfSwgQHZhcntzeW1ib2x9IGlzCi1zZXQgdG8gQHZhcnt2YWx1ZX0sIGFuZCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcyBhc3NlbWJsZWQuICBJZiBubwotQHZhcnt2YWx1ZX0gaXMgbGlzdGVkLCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcyBhc3NlbWJsZWQgb25jZSwgd2l0aAotQHZhcntzeW1ib2x9IHNldCB0byB0aGUgbnVsbCBzdHJpbmcuICBUbyByZWZlciB0byBAdmFye3N5bWJvbH0gd2l0aGluIHRoZQotc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgdXNlIEB2YXJ7XHN5bWJvbH0uCi0KLUZvciBleGFtcGxlLCBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5pcnAgICAgcGFyYW0sMSwyLDMKLSAgICAgICAgbW92ZSAgICBkXHBhcmFtLHNwQEAtCi0gICAgICAgIC5lbmRyCi1AZW5kIGV4YW1wbGUKLQotaXMgZXF1aXZhbGVudCB0byBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIG1vdmUgICAgZDEsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMixzcEBALQotICAgICAgICBtb3ZlICAgIGQzLHNwQEAtCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgSXJwYwotQHNlY3Rpb24gQGNvZGV7LmlycGMgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7aXJwY30gZGlyZWN0aXZlCi1FdmFsdWF0ZSBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgYXNzaWduaW5nIGRpZmZlcmVudCB2YWx1ZXMgdG8gQHZhcntzeW1ib2x9LgotVGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgc3RhcnRzIGF0IHRoZSBAY29kZXsuaXJwY30gZGlyZWN0aXZlLCBhbmQgaXMKLXRlcm1pbmF0ZWQgYnkgYW4gQGNvZGV7LmVuZHJ9IGRpcmVjdGl2ZS4gIEZvciBlYWNoIGNoYXJhY3RlciBpbiBAdmFye3ZhbHVlfSwKLUB2YXJ7c3ltYm9sfSBpcyBzZXQgdG8gdGhlIGNoYXJhY3RlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzCi1hc3NlbWJsZWQuICBJZiBubyBAdmFye3ZhbHVlfSBpcyBsaXN0ZWQsIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzCi1hc3NlbWJsZWQgb25jZSwgd2l0aCBAdmFye3N5bWJvbH0gc2V0IHRvIHRoZSBudWxsIHN0cmluZy4gIFRvIHJlZmVyIHRvCi1AdmFye3N5bWJvbH0gd2l0aGluIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLCB1c2UgQHZhcntcc3ltYm9sfS4KLQotRm9yIGV4YW1wbGUsIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgLmlycGMgICAgcGFyYW0sMTIzCi0gICAgICAgIG1vdmUgICAgZFxwYXJhbSxzcEBALQotICAgICAgICAuZW5kcgotQGVuZCBleGFtcGxlCi0KLWlzIGVxdWl2YWxlbnQgdG8gYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICBtb3ZlICAgIGQxLHNwQEAtCi0gICAgICAgIG1vdmUgICAgZDIsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMyxzcEBALQotQGVuZCBleGFtcGxlCi0KLUBub2RlIExjb21tCi1Ac2VjdGlvbiBAY29kZXsubGNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9fQotCi1AY2luZGV4IEBjb2Rle2xjb21tfSBkaXJlY3RpdmUKLUBjaW5kZXggbG9jYWwgY29tbW9uIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgbG9jYWwgY29tbW9uCi1SZXNlcnZlIEB2YXJ7bGVuZ3RofSAoYW4gYWJzb2x1dGUgZXhwcmVzc2lvbikgYnl0ZXMgZm9yIGEgbG9jYWwgY29tbW9uCi1kZW5vdGVkIGJ5IEB2YXJ7c3ltYm9sfS4gIFRoZSBzZWN0aW9uIGFuZCB2YWx1ZSBvZiBAdmFye3N5bWJvbH0gYXJlCi10aG9zZSBvZiB0aGUgbmV3IGxvY2FsIGNvbW1vbi4gIFRoZSBhZGRyZXNzZXMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgYnNzCi1zZWN0aW9uLCBzbyB0aGF0IGF0IHJ1bi10aW1lIHRoZSBieXRlcyBzdGFydCBvZmYgemVyb2VkLiAgQHZhcntTeW1ib2x9Ci1pcyBub3QgZGVjbGFyZWQgZ2xvYmFsIChAcHhyZWZ7R2xvYmFsLCxAY29kZXsuZ2xvYmFsfX0pLCBzbyBpcyBub3JtYWxseQotbm90IHZpc2libGUgdG8gQGNvZGV7QHZhbHVle0xEfX0uCi0KLUBpZnNldCBHRU5FUklDCi1Tb21lIHRhcmdldHMgcGVybWl0IGEgdGhpcmQgYXJndW1lbnQgdG8gYmUgdXNlZCB3aXRoIEBjb2Rley5sY29tbX0uICBUaGlzCi1hcmd1bWVudCBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wgaW4gdGhlIGJzcyBzZWN0aW9uLgotQGVuZCBpZnNldAotCi1AaWZzZXQgSFBQQQotVGhlIHN5bnRheCBmb3IgQGNvZGV7Lmxjb21tfSBkaWZmZXJzIHNsaWdodGx5IG9uIHRoZSBIUFBBLiAgVGhlIHN5bnRheCBpcwotQHNhbXB7QHZhcntzeW1ib2x9IC5sY29tbSwgQHZhcntsZW5ndGh9fTsgQHZhcntzeW1ib2x9IGlzIG9wdGlvbmFsLgotQGVuZCBpZnNldAotCi1Abm9kZSBMZmxhZ3MKLUBzZWN0aW9uIEBjb2Rley5sZmxhZ3N9Ci0KLUBjaW5kZXggQGNvZGV7bGZsYWdzfSBkaXJlY3RpdmUgKGlnbm9yZWQpCi1AY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzLCBidXQgaWdub3JlcyBpdC4KLQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLUBub2RlIExpbmUKLUBzZWN0aW9uIEBjb2Rley5saW5lIEB2YXJ7bGluZS1udW1iZXJ9fQotCi1AY2luZGV4IEBjb2Rle2xpbmV9IGRpcmVjdGl2ZQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgbm8tbGluZS1kaXIKLUBub2RlIExuCi1Ac2VjdGlvbiBAY29kZXsubG4gQHZhcntsaW5lLW51bWJlcn19Ci0KLUBjaW5kZXggQGNvZGV7bG59IGRpcmVjdGl2ZQotQGVuZCBpZnNldAotQGNpbmRleCBsb2dpY2FsIGxpbmUgbnVtYmVyCi1AaWZzZXQgYW91dC1ib3V0Ci1DaGFuZ2UgdGhlIGxvZ2ljYWwgbGluZSBudW1iZXIuICBAdmFye2xpbmUtbnVtYmVyfSBtdXN0IGJlIGFuIGFic29sdXRlCi1leHByZXNzaW9uLiAgVGhlIG5leHQgbGluZSBoYXMgdGhhdCBsb2dpY2FsIGxpbmUgbnVtYmVyLiAgVGhlcmVmb3JlIGFueSBvdGhlcgotc3RhdGVtZW50cyBvbiB0aGUgY3VycmVudCBsaW5lIChhZnRlciBhIHN0YXRlbWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyKSBhcmUKLXJlcG9ydGVkIGFzIG9uIGxvZ2ljYWwgbGluZSBudW1iZXIgQHZhcntsaW5lLW51bWJlcn0gQG1pbnVze30gMS4gIE9uZSBkYXkKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgbm8gbG9uZ2VyIHN1cHBvcnQgdGhpcyBkaXJlY3RpdmU6IGl0IGlzIHJlY29nbml6ZWQgb25seQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhc3NlbWJsZXIgcHJvZ3JhbXMuCi0KLUBpZnNldCBHRU5FUklDCi1AaWZzZXQgQTI5SwotQGVtcGh7V2FybmluZzp9IEluIHRoZSBBTUQyOUsgY29uZmlndXJhdGlvbiBvZiBAdmFsdWV7QVN9LCB0aGlzIGNvbW1hbmQgaXMKLW5vdCBhdmFpbGFibGU7IHVzZSB0aGUgc3lub255bSBAY29kZXsubG59IGluIHRoYXQgY29udGV4dC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLUV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBkaXJlY3RpdmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBAY29kZXthLm91dH0gb3IKLUBjb2Rle2Iub3V0fSBvYmplY3QtY29kZSBmb3JtYXRzLCBAY29kZXtAdmFsdWV7QVN9fSBzdGlsbCByZWNvZ25pemVzIGl0Ci13aGVuIHByb2R1Y2luZyBDT0ZGIG91dHB1dCwgYW5kIHRyZWF0cyBAc2FtcHsubGluZX0gYXMgdGhvdWdoIGl0Ci13ZXJlIHRoZSBDT0ZGIEBzYW1wey5sbn0gQGVtcGh7aWZ9IGl0IGlzIGZvdW5kIG91dHNpZGUgYQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlyLgotCi1JbnNpZGUgYSBAY29kZXsuZGVmfSwgQHNhbXB7LmxpbmV9IGlzLCBpbnN0ZWFkLCBvbmUgb2YgdGhlIGRpcmVjdGl2ZXMKLXVzZWQgYnkgY29tcGlsZXJzIHRvIGdlbmVyYXRlIGF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24gZm9yCi1kZWJ1Z2dpbmcuCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgTGlua29uY2UKLUBzZWN0aW9uIEBjb2Rley5saW5rb25jZSBbQHZhcnt0eXBlfV19Ci1AY2luZGV4IENPTURBVAotQGNpbmRleCBAY29kZXtsaW5rb25jZX0gZGlyZWN0aXZlCi1AY2luZGV4IGNvbW1vbiBzZWN0aW9ucwotTWFyayB0aGUgY3VycmVudCBzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBvbmx5IGluY2x1ZGVzIGEgc2luZ2xlIGNvcHkgb2YgaXQuCi1UaGlzIG1heSBiZSB1c2VkIHRvIGluY2x1ZGUgdGhlIHNhbWUgc2VjdGlvbiBpbiBzZXZlcmFsIGRpZmZlcmVudCBvYmplY3QgZmlsZXMsCi1idXQgZW5zdXJlIHRoYXQgdGhlIGxpbmtlciB3aWxsIG9ubHkgaW5jbHVkZSBpdCBvbmNlIGluIHRoZSBmaW5hbCBvdXRwdXQgZmlsZS4KLVRoZSBAY29kZXsubGlua29uY2V9IHBzZXVkby1vcCBtdXN0IGJlIHVzZWQgZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIHNlY3Rpb24uCi1EdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGRldGVjdGVkIGJhc2VkIG9uIHRoZSBzZWN0aW9uIG5hbWUsIHNvIGl0IHNob3VsZCBiZQotdW5pcXVlLgotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBhIGZldyBvYmplY3QgZmlsZSBmb3JtYXRzOyBhcyBvZiB0aGlzCi13cml0aW5nLCB0aGUgb25seSBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgaXQgaXMgdGhlIFBvcnRhYmxlCi1FeGVjdXRhYmxlIGZvcm1hdCB1c2VkIG9uIFdpbmRvd3MgTlQuCi0KLVRoZSBAdmFye3R5cGV9IGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIG9uZSBvZiB0aGUKLWZvbGxvd2luZyBzdHJpbmdzLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0ubGlua29uY2Ugc2FtZV9zaXplCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90IGFsbCB0eXBlcyBtYXkgYmUgc3VwcG9ydGVkIG9uIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGRpc2NhcmQKLVNpbGVudGx5IGRpc2NhcmQgZHVwbGljYXRlIHNlY3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLQotQGl0ZW0gb25lX29ubHkKLVdhcm4gaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBzZWN0aW9ucywgYnV0IHN0aWxsIGtlZXAgb25seSBvbmUgY29weS4KLQotQGl0ZW0gc2FtZV9zaXplCi1XYXJuIGlmIGFueSBvZiB0aGUgZHVwbGljYXRlcyBoYXZlIGRpZmZlcmVudCBzaXplcy4KLQotQGl0ZW0gc2FtZV9jb250ZW50cwotV2FybiBpZiBhbnkgb2YgdGhlIGR1cGxpY2F0ZXMgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBjb250ZW50cy4KLUBlbmQgdGFibGUKLQotQG5vZGUgTG4KLUBzZWN0aW9uIEBjb2Rley5sbiBAdmFye2xpbmUtbnVtYmVyfX0KLQotQGNpbmRleCBAY29kZXtsbn0gZGlyZWN0aXZlCi1AaWZjbGVhciBuby1saW5lLWRpcgotQHNhbXB7LmxufSBpcyBhIHN5bm9ueW0gZm9yIEBzYW1wey5saW5lfS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IG5vLWxpbmUtZGlyCi1UZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRvIGNoYW5nZSB0aGUgbG9naWNhbCBsaW5lIG51bWJlci4gIEB2YXJ7bGluZS1udW1iZXJ9Ci1tdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgbmV4dCBsaW5lIGhhcyB0aGF0IGxvZ2ljYWwKLWxpbmUgbnVtYmVyLCBzbyBhbnkgb3RoZXIgc3RhdGVtZW50cyBvbiB0aGUgY3VycmVudCBsaW5lIChhZnRlciBhCi1zdGF0ZW1lbnQgc2VwYXJhdG9yIGNoYXJhY3RlciBAY29kZXs7fSkgYXJlIHJlcG9ydGVkIGFzIG9uIGxvZ2ljYWwKLWxpbmUgbnVtYmVyIEB2YXJ7bGluZS1udW1iZXJ9IEBtaW51c3t9IDEuCi1AaWZzZXQgQk9VVAotCi1UaGlzIGRpcmVjdGl2ZSBpcyBhY2NlcHRlZCwgYnV0IGlnbm9yZWQsIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMKLWNvbmZpZ3VyZWQgZm9yIEBjb2Rle2Iub3V0fTsgaXRzIGVmZmVjdCBpcyBvbmx5IGFzc29jaWF0ZWQgd2l0aCBDT0ZGCi1vdXRwdXQgZm9ybWF0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBNUkkKLUBzZWN0aW9uIEBjb2Rley5tcmkgQHZhcnt2YWx9fQotCi1AY2luZGV4IEBjb2Rle21yaX0gZGlyZWN0aXZlCi1AY2luZGV4IE1SSSBtb2RlLCB0ZW1wb3JhcmlseQotSWYgQHZhcnt2YWx9IGlzIG5vbi16ZXJvLCB0aGlzIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGVudGVyIE1SSSBtb2RlLiAgSWYKLUB2YXJ7dmFsfSBpcyB6ZXJvLCB0aGlzIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGV4aXQgTVJJIG1vZGUuICBUaGlzIGNoYW5nZQotYWZmZWN0cyBjb2RlIGFzc2VtYmxlZCB1bnRpbCB0aGUgbmV4dCBAY29kZXsubXJpfSBkaXJlY3RpdmUsIG9yIHVudGlsIHRoZSBlbmQKLW9mIHRoZSBmaWxlLiAgQHhyZWZ7TSwgTVJJIG1vZGUsIE1SSSBtb2RlfS4KLQotQG5vZGUgTGlzdAotQHNlY3Rpb24gQGNvZGV7Lmxpc3R9Ci0KLUBjaW5kZXggQGNvZGV7bGlzdH0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbCwgdHVybmluZyBvbgotQ29udHJvbCAoaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQGNvZGV7Lm5vbGlzdH0gZGlyZWN0aXZlKSB3aGV0aGVyIG9yCi1ub3QgYXNzZW1ibHkgbGlzdGluZ3MgYXJlIGdlbmVyYXRlZC4gIFRoZXNlIHR3byBkaXJlY3RpdmVzIG1haW50YWluIGFuCi1pbnRlcm5hbCBjb3VudGVyICh3aGljaCBpcyB6ZXJvIGluaXRpYWxseSkuICAgQGNvZGV7Lmxpc3R9IGluY3JlbWVudHMgdGhlCi1jb3VudGVyLCBhbmQgQGNvZGV7Lm5vbGlzdH0gZGVjcmVtZW50cyBpdC4gIEFzc2VtYmx5IGxpc3RpbmdzIGFyZQotZ2VuZXJhdGVkIHdoZW5ldmVyIHRoZSBjb3VudGVyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi1CeSBkZWZhdWx0LCBsaXN0aW5ncyBhcmUgZGlzYWJsZWQuICBXaGVuIHlvdSBlbmFibGUgdGhlbSAod2l0aCB0aGUKLUBzYW1wey1hfSBjb21tYW5kIGxpbmUgb3B0aW9uOyBAcHhyZWZ7SW52b2tpbmcsLENvbW1hbmQtTGluZSBPcHRpb25zfSksCi10aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgbGlzdGluZyBjb3VudGVyIGlzIG9uZS4KLQotQG5vZGUgTG9uZwotQHNlY3Rpb24gQGNvZGV7LmxvbmcgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7bG9uZ30gZGlyZWN0aXZlCi1AY29kZXsubG9uZ30gaXMgdGhlIHNhbWUgYXMgQHNhbXB7LmludH0sIEBweHJlZntJbnQsLEBjb2Rley5pbnR9fS4KLQotQGlnbm9yZQotQGMgbm8gb25lIHNlZW1zIHRvIGtub3cgd2hhdCB0aGlzIGlzIGZvciBvciB3aGV0aGVyIHRoaXMgZGVzY3JpcHRpb24gaXMKLUBjIHdoYXQgaXQgcmVhbGx5IG91Z2h0IHRvIGRvCi1Abm9kZSBMc3ltCi1Ac2VjdGlvbiBAY29kZXsubHN5bSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7bHN5bX0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCwgbm90IHJlZmVyZW5jZWQgaW4gYXNzZW1ibHkKLUBjb2Rley5sc3ltfSBjcmVhdGVzIGEgbmV3IHN5bWJvbCBuYW1lZCBAdmFye3N5bWJvbH0sIGJ1dCBkb2VzIG5vdCBwdXQgaXQgaW4KLXRoZSBoYXNoIHRhYmxlLCBlbnN1cmluZyBpdCBjYW5ub3QgYmUgcmVmZXJlbmNlZCBieSBuYW1lIGR1cmluZyB0aGUKLXJlc3Qgb2YgdGhlIGFzc2VtYmx5LiAgVGhpcyBzZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzeW1ib2wgdG8gYmUKLXRoZSBzYW1lIGFzIHRoZSBleHByZXNzaW9uIHZhbHVlOgotQHNtYWxsZXhhbXBsZQotQHZhcntvdGhlcn0gPSBAdmFye2Rlc2NyaXB0b3J9ID0gMAotQHZhcnt0eXBlfSA9IEByeyhzZWN0aW9uIG9mIEB2YXJ7ZXhwcmVzc2lvbn0pfQotQHZhcnt2YWx1ZX0gPSBAdmFye2V4cHJlc3Npb259Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGUgbmV3IHN5bWJvbCBpcyBub3QgZmxhZ2dlZCBhcyBleHRlcm5hbC4KLUBlbmQgaWdub3JlCi0KLUBub2RlIE1hY3JvCi1Ac2VjdGlvbiBAY29kZXsubWFjcm99Ci0KLUBjaW5kZXggbWFjcm9zCi1UaGUgY29tbWFuZHMgQGNvZGV7Lm1hY3JvfSBhbmQgQGNvZGV7LmVuZG19IGFsbG93IHlvdSB0byBkZWZpbmUgbWFjcm9zIHRoYXQKLWdlbmVyYXRlIGFzc2VtYmx5IG91dHB1dC4gIEZvciBleGFtcGxlLCB0aGlzIGRlZmluaXRpb24gc3BlY2lmaWVzIGEgbWFjcm8KLUBjb2Rle3N1bX0gdGhhdCBwdXRzIGEgc2VxdWVuY2Ugb2YgbnVtYmVycyBpbnRvIG1lbW9yeToKLQotQGV4YW1wbGUKLSAgICAgICAgLm1hY3JvICBzdW0gZnJvbT0wLCB0bz01Ci0gICAgICAgIC5sb25nICAgXGZyb20KLSAgICAgICAgLmlmICAgICBcdG8tXGZyb20KLSAgICAgICAgc3VtICAgICAiKFxmcm9tKzEpIixcdG8KLSAgICAgICAgLmVuZGlmCi0gICAgICAgIC5lbmRtCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1XaXRoIHRoYXQgZGVmaW5pdGlvbiwgQHNhbXB7U1VNIDAsNX0gaXMgZXF1aXZhbGVudCB0byB0aGlzIGFzc2VtYmx5IGlucHV0OgotCi1AZXhhbXBsZQotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmxvbmcgICAxCi0gICAgICAgIC5sb25nICAgMgotICAgICAgICAubG9uZyAgIDMKLSAgICAgICAgLmxvbmcgICA0Ci0gICAgICAgIC5sb25nICAgNQotQGVuZCBleGFtcGxlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5tYWNybyBAdmFye21hY25hbWV9Ci1AaXRlbXggLm1hY3JvIEB2YXJ7bWFjbmFtZX0gQHZhcnttYWNhcmdzfSBAZG90c3t9Ci1AY2luZGV4IEBjb2Rle21hY3JvfSBkaXJlY3RpdmUKLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEB2YXJ7bWFjbmFtZX0uICBJZiB5b3VyIG1hY3JvCi1kZWZpbml0aW9uIHJlcXVpcmVzIGFyZ3VtZW50cywgc3BlY2lmeSB0aGVpciBuYW1lcyBhZnRlciB0aGUgbWFjcm8gbmFtZSwKLXNlcGFyYXRlZCBieSBjb21tYXMgb3Igc3BhY2VzLiAgWW91IGNhbiBzdXBwbHkgYSBkZWZhdWx0IHZhbHVlIGZvciBhbnkKLW1hY3JvIGFyZ3VtZW50IGJ5IGZvbGxvd2luZyB0aGUgbmFtZSB3aXRoIEBzYW1wez1AdmFye2RlZmx0fX0uICBGb3IKLWV4YW1wbGUsIHRoZXNlIGFyZSBhbGwgdmFsaWQgQGNvZGV7Lm1hY3JvfSBzdGF0ZW1lbnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5tYWNybyBjb21tCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtjb21tfSwgd2hpY2ggdGFrZXMgbm8KLWFyZ3VtZW50cy4KLQotQGl0ZW0gLm1hY3JvIHBsdXMxIHAsIHAxCi1AaXRlbXggLm1hY3JvIHBsdXMxIHAgcDEKLUVpdGhlciBzdGF0ZW1lbnQgYmVnaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle3BsdXMxfSwKLXdoaWNoIHRha2VzIHR3byBhcmd1bWVudHM7IHdpdGhpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgd3JpdGUKLUBzYW1we1xwfSBvciBAc2FtcHtccDF9IHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMuCi0KLUBpdGVtIC5tYWNybyByZXNlcnZlX3N0ciBwMT0wIHAyCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtyZXNlcnZlX3N0cn0sIHdpdGggdHdvCi1hcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYnV0IG5vdCB0aGUgc2Vjb25kLgotQWZ0ZXIgdGhlIGRlZmluaXRpb24gaXMgY29tcGxldGUsIHlvdSBjYW4gY2FsbCB0aGUgbWFjcm8gZWl0aGVyIGFzCi1Ac2FtcHtyZXNlcnZlX3N0ciBAdmFye2F9LEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xwMX0gZXZhbHVhdGluZyB0bwotQHZhcnthfSBhbmQgQHNhbXB7XHAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLCBvciBhcyBAc2FtcHtyZXNlcnZlX3N0cgotLEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xwMX0gZXZhbHVhdGluZyBhcyB0aGUgZGVmYXVsdCwgaW4gdGhpcyBjYXNlCi1Ac2FtcHswfSwgYW5kIEBzYW1we1xwMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KS4KLUBlbmQgdGFibGUKLQotV2hlbiB5b3UgY2FsbCBhIG1hY3JvLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHZhbHVlcyBlaXRoZXIgYnkKLXBvc2l0aW9uLCBvciBieSBrZXl3b3JkLiAgRm9yIGV4YW1wbGUsIEBzYW1we3N1bSA5LDE3fSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHtzdW0gdG89MTcsIGZyb209OX0uCi0KLUBpdGVtIC5lbmRtCi1AY2luZGV4IEBjb2Rle2VuZG19IGRpcmVjdGl2ZQotTWFyayB0aGUgZW5kIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotQGl0ZW0gLmV4aXRtCi1AY2luZGV4IEBjb2Rle2V4aXRtfSBkaXJlY3RpdmUKLUV4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLgotCi1AY2luZGV4IG51bWJlciBvZiBtYWNyb3MgZXhlY3V0ZWQKLUBjaW5kZXggbWFjcm9zLCBjb3VudCBleGVjdXRlZAotQGl0ZW0gXEBACi1AY29kZXtAdmFsdWV7QVN9fSBtYWludGFpbnMgYSBjb3VudGVyIG9mIGhvdyBtYW55IG1hY3JvcyBpdCBoYXMKLWV4ZWN1dGVkIGluIHRoaXMgcHNldWRvLXZhcmlhYmxlOyB5b3UgY2FuIGNvcHkgdGhhdCBudW1iZXIgdG8geW91cgotb3V0cHV0IHdpdGggQHNhbXB7XEBAfSwgYnV0IEBlbXBoe29ubHkgd2l0aGluIGEgbWFjcm8gZGVmaW5pdGlvbn0uCi0KLUBpZ25vcmUKLUBpdGVtIExPQ0FMIEB2YXJ7bmFtZX0gWyAsIEBkb3Rze30gXQotQGVtcGh7V2FybmluZzogQGNvZGV7TE9DQUx9IGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3QgYGBhbHRlcm5hdGUKLW1hY3JvIHN5bnRheCcnIHdpdGggQHNhbXB7LWF9IG9yIEBzYW1wey0tYWx0ZXJuYXRlfS59ICBAeHJlZntBbHRlcm5hdGUsLAotQWx0ZXJuYXRlIG1hY3JvIHN5bnRheH0uCi0KLUdlbmVyYXRlIGEgc3RyaW5nIHJlcGxhY2VtZW50IGZvciBlYWNoIG9mIHRoZSBAdmFye25hbWV9IGFyZ3VtZW50cywgYW5kCi1yZXBsYWNlIGFueSBpbnN0YW5jZXMgb2YgQHZhcntuYW1lfSBpbiBlYWNoIG1hY3JvIGV4cGFuc2lvbi4gIFRoZQotcmVwbGFjZW1lbnQgc3RyaW5nIGlzIHVuaXF1ZSBpbiB0aGUgYXNzZW1ibHksIGFuZCBkaWZmZXJlbnQgZm9yIGVhY2gKLXNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbi4gIEBjb2Rle0xPQ0FMfSBhbGxvd3MgeW91IHRvIHdyaXRlIG1hY3JvcyB0aGF0Ci1kZWZpbmUgc3ltYm9scywgd2l0aG91dCBmZWFyIG9mIGNvbmZsaWN0IGJldHdlZW4gc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9ucy4KLUBlbmQgaWdub3JlCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBOb2xpc3QKLUBzZWN0aW9uIEBjb2Rley5ub2xpc3R9Ci0KLUBjaW5kZXggQGNvZGV7bm9saXN0fSBkaXJlY3RpdmUKLUBjaW5kZXggbGlzdGluZyBjb250cm9sLCB0dXJuaW5nIG9mZgotQ29udHJvbCAoaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQGNvZGV7Lmxpc3R9IGRpcmVjdGl2ZSkgd2hldGhlciBvcgotbm90IGFzc2VtYmx5IGxpc3RpbmdzIGFyZSBnZW5lcmF0ZWQuICBUaGVzZSB0d28gZGlyZWN0aXZlcyBtYWludGFpbiBhbgotaW50ZXJuYWwgY291bnRlciAod2hpY2ggaXMgemVybyBpbml0aWFsbHkpLiAgIEBjb2Rley5saXN0fSBpbmNyZW1lbnRzIHRoZQotY291bnRlciwgYW5kIEBjb2Rley5ub2xpc3R9IGRlY3JlbWVudHMgaXQuICBBc3NlbWJseSBsaXN0aW5ncyBhcmUKLWdlbmVyYXRlZCB3aGVuZXZlciB0aGUgY291bnRlciBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotQG5vZGUgT2N0YQotQHNlY3Rpb24gQGNvZGV7Lm9jdGEgQHZhcntiaWdudW1zfX0KLQotQGMgRklYTUU6IGRvdWJsZSBzaXplIGVtaXR0ZWQgZm9yICJvY3RhIiBvbiBpOTYwLCBvdGhlcnM/ICBPciB3YXJuPwotQGNpbmRleCBAY29kZXtvY3RhfSBkaXJlY3RpdmUKLUBjaW5kZXggaW50ZWdlciwgMTYtYnl0ZQotQGNpbmRleCBzaXh0ZWVuIGJ5dGUgaW50ZWdlcgotVGhpcyBkaXJlY3RpdmUgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgYmlnbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEZvciBlYWNoCi1iaWdudW0sIGl0IGVtaXRzIGEgMTYtYnl0ZSBpbnRlZ2VyLgotCi1UaGUgdGVybSBgYG9jdGEnJyBjb21lcyBmcm9tIGNvbnRleHRzIGluIHdoaWNoIGEgYGB3b3JkJycgaXMgdHdvIGJ5dGVzOwotaGVuY2UgQGVtcGh7b2N0YX0td29yZCBmb3IgMTYgYnl0ZXMuCi0KLUBub2RlIE9yZwotQHNlY3Rpb24gQGNvZGV7Lm9yZyBAdmFye25ldy1sY30gLCBAdmFye2ZpbGx9fQotCi1AY2luZGV4IEBjb2Rle29yZ30gZGlyZWN0aXZlCi1AY2luZGV4IGxvY2F0aW9uIGNvdW50ZXIsIGFkdmFuY2luZwotQGNpbmRleCBhZHZhbmNpbmcgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBjdXJyZW50IGFkZHJlc3MsIGFkdmFuY2luZwotQWR2YW5jZSB0aGUgbG9jYXRpb24gY291bnRlciBvZiB0aGUgY3VycmVudCBzZWN0aW9uIHRvCi1AdmFye25ldy1sY30uICBAdmFye25ldy1sY30gaXMgZWl0aGVyIGFuIGFic29sdXRlIGV4cHJlc3Npb24gb3IgYW4KLWV4cHJlc3Npb24gd2l0aCB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24uICBUaGF0IGlzLAoteW91IGNhbid0IHVzZSBAY29kZXsub3JnfSB0byBjcm9zcyBzZWN0aW9uczogaWYgQHZhcntuZXctbGN9IGhhcyB0aGUKLXdyb25nIHNlY3Rpb24sIHRoZSBAY29kZXsub3JnfSBkaXJlY3RpdmUgaXMgaWdub3JlZC4gIFRvIGJlIGNvbXBhdGlibGUKLXdpdGggZm9ybWVyIGFzc2VtYmxlcnMsIGlmIHRoZSBzZWN0aW9uIG9mIEB2YXJ7bmV3LWxjfSBpcyBhYnNvbHV0ZSwKLUBjb2Rle0B2YWx1ZXtBU319IGlzc3VlcyBhIHdhcm5pbmcsIHRoZW4gcHJldGVuZHMgdGhlIHNlY3Rpb24gb2YgQHZhcntuZXctbGN9Ci1pcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzdWJzZWN0aW9uLgotCi1AY29kZXsub3JnfSBtYXkgb25seSBpbmNyZWFzZSB0aGUgbG9jYXRpb24gY291bnRlciwgb3IgbGVhdmUgaXQKLXVuY2hhbmdlZDsgeW91IGNhbm5vdCB1c2UgQGNvZGV7Lm9yZ30gdG8gbW92ZSB0aGUgbG9jYXRpb24gY291bnRlcgotYmFja3dhcmRzLgotCi1AYyBkb3VibGUgbmVnYXRpdmUgdXNlZCBiZWxvdyAibm90IHVuZGVmaW5lZCIgYmVjYXVzZSB0aGlzIGlzIGEgc3BlY2lmaWMKLUBjIHJlZmVyZW5jZSB0byAidW5kZWZpbmVkIiAoYXMgU0VHX1VOS05PV04gaXMgY2FsbGVkIGluIHRoaXMgbWFudWFsKQotQGMgc2VjdGlvbi4gZG9jQGN5Z251cy5jb20gMThmZWI5MQotQmVjYXVzZSBAY29kZXtAdmFsdWV7QVN9fSB0cmllcyB0byBhc3NlbWJsZSBwcm9ncmFtcyBpbiBvbmUgcGFzcywgQHZhcntuZXctbGN9Ci1tYXkgbm90IGJlIHVuZGVmaW5lZC4gIElmIHlvdSByZWFsbHkgZGV0ZXN0IHRoaXMgcmVzdHJpY3Rpb24gd2UgZWFnZXJseSBhd2FpdAotYSBjaGFuY2UgdG8gc2hhcmUgeW91ciBpbXByb3ZlZCBhc3NlbWJsZXIuCi0KLUJld2FyZSB0aGF0IHRoZSBvcmlnaW4gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBub3QKLXRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic2VjdGlvbi4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyCi1wZW9wbGUncyBhc3NlbWJsZXJzLgotCi1XaGVuIHRoZSBsb2NhdGlvbiBjb3VudGVyIChvZiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSBpcyBhZHZhbmNlZCwgdGhlCi1pbnRlcnZlbmluZyBieXRlcyBhcmUgZmlsbGVkIHdpdGggQHZhcntmaWxsfSB3aGljaCBzaG91bGQgYmUgYW4KLWFic29sdXRlIGV4cHJlc3Npb24uICBJZiB0aGUgY29tbWEgYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsCi1AdmFye2ZpbGx9IGRlZmF1bHRzIHRvIHplcm8uCi0KLUBub2RlIFAyYWxpZ24KLUBzZWN0aW9uIEBjb2Rley5wMmFsaWduW3dsXSBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9fQotCi1AY2luZGV4IHBhZGRpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIgZ2l2ZW4gYSBwb3dlciBvZiB0d28KLUBjaW5kZXggQGNvZGV7cDJhbGlnbn0gZGlyZWN0aXZlCi1QYWQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgKGluIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIHRvIGEgcGFydGljdWxhcgotc3RvcmFnZSBib3VuZGFyeS4gIFRoZSBmaXJzdCBleHByZXNzaW9uICh3aGljaCBtdXN0IGJlIGFic29sdXRlKSBpcyB0aGUKLW51bWJlciBvZiBsb3ctb3JkZXIgemVybyBiaXRzIHRoZSBsb2NhdGlvbiBjb3VudGVyIG11c3QgaGF2ZSBhZnRlcgotYWR2YW5jZW1lbnQuICBGb3IgZXhhbXBsZSBAc2FtcHsucDJhbGlnbiAzfSBhZHZhbmNlcyB0aGUgbG9jYXRpb24KLWNvdW50ZXIgdW50aWwgaXQgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgYWxyZWFkeSBhCi1tdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1UaGUgc2Vjb25kIGV4cHJlc3Npb24gKGFsc28gYWJzb2x1dGUpIGdpdmVzIHRoZSBmaWxsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKLXBhZGRpbmcgYnl0ZXMuICBJdCAoYW5kIHRoZSBjb21tYSkgbWF5IGJlIG9taXR0ZWQuICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUKLXBhZGRpbmcgYnl0ZXMgYXJlIG5vcm1hbGx5IHplcm8uICBIb3dldmVyLCBvbiBzb21lIHN5c3RlbXMsIGlmIHRoZSBzZWN0aW9uIGlzCi1tYXJrZWQgYXMgY29udGFpbmluZyBjb2RlIGFuZCB0aGUgZmlsbCB2YWx1ZSBpcyBvbWl0dGVkLCB0aGUgc3BhY2UgaXMgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucy4KLQotVGhlIHRoaXJkIGV4cHJlc3Npb24gaXMgYWxzbyBhYnNvbHV0ZSwgYW5kIGlzIGFsc28gb3B0aW9uYWwuICBJZiBpdCBpcyBwcmVzZW50LAotaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYnkgdGhpcyBhbGlnbm1lbnQKLWRpcmVjdGl2ZS4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gdGhlCi1zcGVjaWZpZWQgbWF4aW11bSwgdGhlbiB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4gIFlvdSBjYW4gb21pdCB0aGUKLWZpbGwgdmFsdWUgKHRoZSBzZWNvbmQgYXJndW1lbnQpIGVudGlyZWx5IGJ5IHNpbXBseSB1c2luZyB0d28gY29tbWFzIGFmdGVyIHRoZQotcmVxdWlyZWQgYWxpZ25tZW50OyB0aGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGFsaWdubWVudCB0byBiZSBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCi0KLUBjaW5kZXggQGNvZGV7cDJhbGlnbnd9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtwMmFsaWdubH0gZGlyZWN0aXZlCi1UaGUgQGNvZGV7LnAyYWxpZ253fSBhbmQgQGNvZGV7LnAyYWxpZ25sfSBkaXJlY3RpdmVzIGFyZSB2YXJpYW50cyBvZiB0aGUKLUBjb2Rley5wMmFsaWdufSBkaXJlY3RpdmUuICBUaGUgQGNvZGV7LnAyYWxpZ253fSBkaXJlY3RpdmUgdHJlYXRzIHRoZSBmaWxsCi1wYXR0ZXJuIGFzIGEgdHdvIGJ5dGUgd29yZCB2YWx1ZS4gIFRoZSBAY29kZXsucDJhbGlnbmx9IGRpcmVjdGl2ZXMgdHJlYXRzIHRoZQotZmlsbCBwYXR0ZXJuIGFzIGEgZm91ciBieXRlIGxvbmd3b3JkIHZhbHVlLiAgRm9yIGV4YW1wbGUsIEBjb2Rley5wMmFsaWdudwotMiwweDM2OGR9IHdpbGwgYWxpZ24gdG8gYSBtdWx0aXBsZSBvZiA0LiAgSWYgaXQgc2tpcHMgdHdvIGJ5dGVzLCB0aGV5IHdpbGwgYmUKLWZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSAweDM2OGQgKHRoZSBleGFjdCBwbGFjZW1lbnQgb2YgdGhlIGJ5dGVzIGRlcGVuZHMgdXBvbgotdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHByb2Nlc3NvcikuICBJZiBpdCBza2lwcyAxIG9yIDMgYnl0ZXMsIHRoZSBmaWxsIHZhbHVlIGlzCi11bmRlZmluZWQuCi0KLUBub2RlIFByaW50Ci1Ac2VjdGlvbiBAY29kZXsucHJpbnQgQHZhcntzdHJpbmd9fQotCi1AY2luZGV4IEBjb2Rle3ByaW50fSBkaXJlY3RpdmUKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgQHZhcntzdHJpbmd9IG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgZHVyaW5nCi1hc3NlbWJseS4gIFlvdSBtdXN0IHB1dCBAdmFye3N0cmluZ30gaW4gZG91YmxlIHF1b3Rlcy4KLQotQG5vZGUgUHNpemUKLUBzZWN0aW9uIEBjb2Rley5wc2l6ZSBAdmFye2xpbmVzfSAsIEB2YXJ7Y29sdW1uc319Ci0KLUBjaW5kZXggQGNvZGV7cHNpemV9IGRpcmVjdGl2ZQotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IHBhcGVyIHNpemUKLUBjaW5kZXggcGFwZXIgc2l6ZSwgZm9yIGxpc3RpbmdzCi1Vc2UgdGhpcyBkaXJlY3RpdmUgdG8gZGVjbGFyZSB0aGUgbnVtYmVyIG9mIGxpbmVzLS0tYW5kLCBvcHRpb25hbGx5LCB0aGUKLW51bWJlciBvZiBjb2x1bW5zLS0tdG8gdXNlIGZvciBlYWNoIHBhZ2UsIHdoZW4gZ2VuZXJhdGluZyBsaXN0aW5ncy4KLQotSWYgeW91IGRvIG5vdCB1c2UgQGNvZGV7LnBzaXplfSwgbGlzdGluZ3MgdXNlIGEgZGVmYXVsdCBsaW5lLWNvdW50Ci1vZiA2MC4gIFlvdSBtYXkgb21pdCB0aGUgY29tbWEgYW5kIEB2YXJ7Y29sdW1uc30gc3BlY2lmaWNhdGlvbjsgdGhlCi1kZWZhdWx0IHdpZHRoIGlzIDIwMCBjb2x1bW5zLgotCi1AY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgZm9ybWZlZWRzIHdoZW5ldmVyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCi1saW5lcyBpcyBleGNlZWRlZCAob3Igd2hlbmV2ZXIgeW91IGV4cGxpY2l0bHkgcmVxdWVzdCBvbmUsIHVzaW5nCi1AY29kZXsuZWplY3R9KS4KLQotSWYgeW91IHNwZWNpZnkgQHZhcntsaW5lc30gYXMgQGNvZGV7MH0sIG5vIGZvcm1mZWVkcyBhcmUgZ2VuZXJhdGVkIHNhdmUKLXRob3NlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHdpdGggQGNvZGV7LmVqZWN0fS4KLQotQG5vZGUgUHVyZ2VtCi1Ac2VjdGlvbiBAY29kZXsucHVyZ2VtIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7cHVyZ2VtfSBkaXJlY3RpdmUKLVVuZGVmaW5lIHRoZSBtYWNybyBAdmFye25hbWV9LCBzbyB0aGF0IGxhdGVyIHVzZXMgb2YgdGhlIHN0cmluZyB3aWxsIG5vdCBiZQotZXhwYW5kZWQuICBAeHJlZntNYWNyb30uCi0KLUBub2RlIFF1YWQKLUBzZWN0aW9uIEBjb2Rley5xdWFkIEB2YXJ7YmlnbnVtc319Ci0KLUBjaW5kZXggQGNvZGV7cXVhZH0gZGlyZWN0aXZlCi1AY29kZXsucXVhZH0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgYmlnbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEZvcgotZWFjaCBiaWdudW0sIGl0IGVtaXRzCi1AaWZjbGVhciBiaWdudW0tMTYKLWFuIDgtYnl0ZSBpbnRlZ2VyLiAgSWYgdGhlIGJpZ251bSB3b24ndCBmaXQgaW4gOCBieXRlcywgaXQgcHJpbnRzIGEKLXdhcm5pbmcgbWVzc2FnZTsgYW5kIGp1c3QgdGFrZXMgdGhlIGxvd2VzdCBvcmRlciA4IGJ5dGVzIG9mIHRoZSBiaWdudW0uCi1AY2luZGV4IGVpZ2h0LWJ5dGUgaW50ZWdlcgotQGNpbmRleCBpbnRlZ2VyLCA4LWJ5dGUKLQotVGhlIHRlcm0gYGBxdWFkJycgY29tZXMgZnJvbSBjb250ZXh0cyBpbiB3aGljaCBhIGBgd29yZCcnIGlzIHR3byBieXRlczsKLWhlbmNlIEBlbXBoe3F1YWR9LXdvcmQgZm9yIDggYnl0ZXMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBiaWdudW0tMTYKLWEgMTYtYnl0ZSBpbnRlZ2VyLiAgSWYgdGhlIGJpZ251bSB3b24ndCBmaXQgaW4gMTYgYnl0ZXMsIGl0IHByaW50cyBhCi13YXJuaW5nIG1lc3NhZ2U7IGFuZCBqdXN0IHRha2VzIHRoZSBsb3dlc3Qgb3JkZXIgMTYgYnl0ZXMgb2YgdGhlIGJpZ251bS4KLUBjaW5kZXggc2l4dGVlbi1ieXRlIGludGVnZXIKLUBjaW5kZXggaW50ZWdlciwgMTYtYnl0ZQotQGVuZCBpZnNldAotCi1Abm9kZSBSZXB0Ci1Ac2VjdGlvbiBAY29kZXsucmVwdCBAdmFye2NvdW50fX0KLQotQGNpbmRleCBAY29kZXtyZXB0fSBkaXJlY3RpdmUKLVJlcGVhdCB0aGUgc2VxdWVuY2Ugb2YgbGluZXMgYmV0d2VlbiB0aGUgQGNvZGV7LnJlcHR9IGRpcmVjdGl2ZSBhbmQgdGhlIG5leHQKLUBjb2Rley5lbmRyfSBkaXJlY3RpdmUgQHZhcntjb3VudH0gdGltZXMuCi0KLUZvciBleGFtcGxlLCBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5yZXB0ICAgMwotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmVuZHIKLUBlbmQgZXhhbXBsZQotCi1pcyBlcXVpdmFsZW50IHRvIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgLmxvbmcgICAwCi0gICAgICAgIC5sb25nICAgMAotICAgICAgICAubG9uZyAgIDAKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBTYnR0bAotQHNlY3Rpb24gQGNvZGV7LnNidHRsICJAdmFye3N1YmhlYWRpbmd9In0KLQotQGNpbmRleCBAY29kZXtzYnR0bH0gZGlyZWN0aXZlCi1AY2luZGV4IHN1YnRpdGxlcyBmb3IgbGlzdGluZ3MKLUBjaW5kZXggbGlzdGluZyBjb250cm9sOiBzdWJ0aXRsZQotVXNlIEB2YXJ7c3ViaGVhZGluZ30gYXMgdGhlIHRpdGxlICh0aGlyZCBsaW5lLCBpbW1lZGlhdGVseSBhZnRlciB0aGUKLXRpdGxlIGxpbmUpIHdoZW4gZ2VuZXJhdGluZyBhc3NlbWJseSBsaXN0aW5ncy4KLQotVGhpcyBkaXJlY3RpdmUgYWZmZWN0cyBzdWJzZXF1ZW50IHBhZ2VzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBhZ2UgaWYKLWl0IGFwcGVhcnMgd2l0aGluIHRlbiBsaW5lcyBvZiB0aGUgdG9wIG9mIGEgcGFnZS4KLQotQGlmc2V0IENPRkYKLUBub2RlIFNjbAotQHNlY3Rpb24gQGNvZGV7LnNjbCBAdmFye2NsYXNzfX0KLQotQGNpbmRleCBAY29kZXtzY2x9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgc3RvcmFnZSBjbGFzcyAoQ09GRikKLUBjaW5kZXggQ09GRiBzeW1ib2wgc3RvcmFnZSBjbGFzcwotU2V0IHRoZSBzdG9yYWdlLWNsYXNzIHZhbHVlIGZvciBhIHN5bWJvbC4gIFRoaXMgZGlyZWN0aXZlIG1heSBvbmx5IGJlCi11c2VkIGluc2lkZSBhIEBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpci4gIFN0b3JhZ2UgY2xhc3MgbWF5IGZsYWcKLXdoZXRoZXIgYSBzeW1ib2wgaXMgc3RhdGljIG9yIGV4dGVybmFsLCBvciBpdCBtYXkgcmVjb3JkIGZ1cnRoZXIKLXN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLUBpZnNldCBCT1VUCi0KLVRoZSBAc2FtcHsuc2NsfSBkaXJlY3RpdmUgaXMgcHJpbWFyaWx5IGFzc29jaWF0ZWQgd2l0aCBDT0ZGIG91dHB1dDsgd2hlbgotY29uZmlndXJlZCB0byBnZW5lcmF0ZSBAY29kZXtiLm91dH0gb3V0cHV0IGZvcm1hdCwgQGNvZGV7QHZhbHVle0FTfX0KLWFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFNlY3Rpb24KLUBzZWN0aW9uIEBjb2Rley5zZWN0aW9uIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7c2VjdGlvbn0gZGlyZWN0aXZlCi1AY2luZGV4IG5hbWVkIHNlY3Rpb24KLVVzZSB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSB0byBhc3NlbWJsZSB0aGUgZm9sbG93aW5nIGNvZGUgaW50byBhIHNlY3Rpb24KLW5hbWVkIEB2YXJ7bmFtZX0uCi0KLVRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB0YXJnZXRzIHRoYXQgYWN0dWFsbHkgc3VwcG9ydCBhcmJpdHJhcmlseQotbmFtZWQgc2VjdGlvbnM7IG9uIEBjb2Rle2Eub3V0fSB0YXJnZXRzLCBmb3IgZXhhbXBsZSwgaXQgaXMgbm90IGFjY2VwdGVkLCBldmVuCi13aXRoIGEgc3RhbmRhcmQgQGNvZGV7YS5vdXR9IHNlY3Rpb24gbmFtZS4KLQotQGlmc2V0IENPRkYKLUZvciBDT0ZGIHRhcmdldHMsIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIGlzIHVzZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcKLXdheXM6Ci1Ac21hbGxleGFtcGxlCi0uc2VjdGlvbiBAdmFye25hbWV9WywgIkB2YXJ7ZmxhZ3N9Il0KLS5zZWN0aW9uIEB2YXJ7bmFtZX1bLCBAdmFye3N1YnNlZ21lbnR9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGlzIHF1b3RlZCwgaXQgaXMgdGFrZW4gYXMgZmxhZ3MgdG8gdXNlIGZvciB0aGUKLXNlY3Rpb24uICBFYWNoIGZsYWcgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLiAgVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgcmVjb2duaXplZDoKLUB0YWJsZSBAY29kZQotQGl0ZW0gYgotYnNzIHNlY3Rpb24gKHVuaW5pdGlhbGl6ZWQgZGF0YSkKLUBpdGVtIG4KLXNlY3Rpb24gaXMgbm90IGxvYWRlZAotQGl0ZW0gdwotd3JpdGFibGUgc2VjdGlvbgotQGl0ZW0gZAotZGF0YSBzZWN0aW9uCi1AaXRlbSByCi1yZWFkLW9ubHkgc2VjdGlvbgotQGl0ZW0geAotZXhlY3V0YWJsZSBzZWN0aW9uCi1AaXRlbSBzCi1zaGFyZWQgc2VjdGlvbiAobWVhbmluZ2Z1bCBmb3IgUEUgdGFyZ2V0cykKLUBlbmQgdGFibGUKLQotSWYgbm8gZmxhZ3MgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgZmxhZ3MgZGVwZW5kIHVwb24gdGhlIHNlY3Rpb24gbmFtZS4gIElmCi10aGUgc2VjdGlvbiBuYW1lIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgZGVmYXVsdCB3aWxsIGJlIGZvciB0aGUgc2VjdGlvbiB0byBiZQotbG9hZGVkIGFuZCB3cml0YWJsZS4KLQotSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIGlzIG5vdCBxdW90ZWQsIGl0IGlzCi10YWtlbiBhcyBhIHN1YnNlZ21lbnQgbnVtYmVyIChAcHhyZWZ7U3ViLVNlY3Rpb25zfSkuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBFTEYKLUZvciBFTEYgdGFyZ2V0cywgdGhlIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgaXMgdXNlZCBsaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi0uc2VjdGlvbiBAdmFye25hbWV9WywgIkB2YXJ7ZmxhZ3N9IlssIEBAQHZhcnt0eXBlfV1dCi1AZW5kIHNtYWxsZXhhbXBsZQotVGhlIG9wdGlvbmFsIEB2YXJ7ZmxhZ3N9IGFyZ3VtZW50IGlzIGEgcXVvdGVkIHN0cmluZyB3aGljaCBtYXkgY29udGFpbiBhbnkKLWNvbWJpbnRpb24gb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBhCi1zZWN0aW9uIGlzIGFsbG9jYXRhYmxlCi1AaXRlbSB3Ci1zZWN0aW9uIGlzIHdyaXRhYmxlCi1AaXRlbSB4Ci1zZWN0aW9uIGlzIGV4ZWN1dGFibGUKLUBlbmQgdGFibGUKLQotVGhlIG9wdGlvbmFsIEB2YXJ7dHlwZX0gYXJndW1lbnQgbWF5IGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBAQHByb2diaXRzCi1zZWN0aW9uIGNvbnRhaW5zIGRhdGEKLUBpdGVtIEBAbm9iaXRzCi1zZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gZGF0YSAoaS5lLiwgc2VjdGlvbiBvbmx5IG9jY3VwaWVzIHNwYWNlKQotQGVuZCB0YWJsZQotCi1JZiBubyBmbGFncyBhcmUgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBmbGFncyBkZXBlbmQgdXBvbiB0aGUgc2VjdGlvbiBuYW1lLiAgSWYKLXRoZSBzZWN0aW9uIG5hbWUgaXMgbm90IHJlY29nbml6ZWQsIHRoZSBkZWZhdWx0IHdpbGwgYmUgZm9yIHRoZSBzZWN0aW9uIHRvIGhhdmUKLW5vbmUgb2YgdGhlIGFib3ZlIGZsYWdzOiBpdCB3aWxsIG5vdCBiZSBhbGxvY2F0ZWQgaW4gbWVtb3J5LCBub3Igd3JpdGFibGUsIG5vcgotZXhlY3V0YWJsZS4gIFRoZSBzZWN0aW9uIHdpbGwgY29udGFpbiBkYXRhLgotCi1Gb3IgRUxGIHRhcmdldHMsIHRoZSBhc3NlbWJsZXIgc3VwcG9ydHMgYW5vdGhlciB0eXBlIG9mIEBjb2Rley5zZWN0aW9ufQotZGlyZWN0aXZlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgYXNzZW1ibGVyOgotQHNtYWxsZXhhbXBsZQotLnNlY3Rpb24gIkB2YXJ7bmFtZX0iWywgQHZhcntmbGFnc30uLi5dCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90ZSB0aGF0IHRoZSBzZWN0aW9uIG5hbWUgaXMgcXVvdGVkLiAgVGhlcmUgbWF5IGJlIGEgc2VxdWVuY2Ugb2YgY29tbWEKLXNlcGFyYXRlZCBmbGFnczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gI2FsbG9jCi1zZWN0aW9uIGlzIGFsbG9jYXRhYmxlCi1AaXRlbSAjd3JpdGUKLXNlY3Rpb24gaXMgd3JpdGFibGUKLUBpdGVtICNleGVjaW5zdHIKLXNlY3Rpb24gaXMgZXhlY3V0YWJsZQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1Abm9kZSBTZXQKLUBzZWN0aW9uIEBjb2Rley5zZXQgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle3NldH0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCB2YWx1ZSwgc2V0dGluZwotU2V0IHRoZSB2YWx1ZSBvZiBAdmFye3N5bWJvbH0gdG8gQHZhcntleHByZXNzaW9ufS4gIFRoaXMKLWNoYW5nZXMgQHZhcntzeW1ib2x9J3MgdmFsdWUgYW5kIHR5cGUgdG8gY29uZm9ybSB0bwotQHZhcntleHByZXNzaW9ufS4gIElmIEB2YXJ7c3ltYm9sfSB3YXMgZmxhZ2dlZCBhcyBleHRlcm5hbCwgaXQgcmVtYWlucwotZmxhZ2dlZCAoQHB4cmVme1N5bWJvbCBBdHRyaWJ1dGVzfSkuCi0KLVlvdSBtYXkgQGNvZGV7LnNldH0gYSBzeW1ib2wgbWFueSB0aW1lcyBpbiB0aGUgc2FtZSBhc3NlbWJseS4KLQotSWYgeW91IEBjb2Rley5zZXR9IGEgZ2xvYmFsIHN5bWJvbCwgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgb2JqZWN0Ci1maWxlIGlzIHRoZSBsYXN0IHZhbHVlIHN0b3JlZCBpbnRvIGl0LgotCi1AaWZzZXQgSFBQQQotVGhlIHN5bnRheCBmb3IgQGNvZGV7c2V0fSBvbiB0aGUgSFBQQSBpcwotQHNhbXB7QHZhcntzeW1ib2x9IC5zZXQgQHZhcntleHByZXNzaW9ufX0uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFNob3J0Ci1Ac2VjdGlvbiBAY29kZXsuc2hvcnQgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7c2hvcnR9IGRpcmVjdGl2ZQotQGlmc2V0IEdFTkVSSUMKLUBjb2Rley5zaG9ydH0gaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMgQHNhbXB7LndvcmR9LgotQHhyZWZ7V29yZCwsQGNvZGV7LndvcmR9fS4KLQotSW4gc29tZSBjb25maWd1cmF0aW9ucywgaG93ZXZlciwgQGNvZGV7LnNob3J0fSBhbmQgQGNvZGV7LndvcmR9IGdlbmVyYXRlCi1udW1iZXJzIG9mIGRpZmZlcmVudCBsZW5ndGhzOyBAcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IFcxNgotQGNvZGV7LnNob3J0fSBpcyB0aGUgc2FtZSBhcyBAc2FtcHsud29yZH0uICBAeHJlZntXb3JkLCxAY29kZXsud29yZH19LgotQGVuZCBpZnNldAotQGlmc2V0IFczMgotVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBAdmFye2V4cHJlc3Npb25zfSwgYW5kIGVtaXRzCi1hIDE2IGJpdCBudW1iZXIgZm9yIGVhY2guCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgU2luZ2xlCi1Ac2VjdGlvbiBAY29kZXsuc2luZ2xlIEB2YXJ7ZmxvbnVtc319Ci0KLUBjaW5kZXggQGNvZGV7c2luZ2xlfSBkaXJlY3RpdmUKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoc2luZ2xlKQotVGhpcyBkaXJlY3RpdmUgYXNzZW1ibGVzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQKLWhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQGNvZGV7LmZsb2F0fS4KLUBpZnNldCBHRU5FUklDCi1UaGUgZXhhY3Qga2luZCBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzIGVtaXR0ZWQgZGVwZW5kcyBvbiBob3cKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQuICBAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSUVFRUZMT0FUCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LCBAY29kZXsuc2luZ2xlfSBlbWl0cyAzMi1iaXQgZmxvYXRpbmcgcG9pbnQKLW51bWJlcnMgaW4gQHNje2llZWV9IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1AaWZzZXQgQ09GRgotQG5vZGUgU2l6ZQotQHNlY3Rpb24gQGNvZGV7LnNpemV9Ci0KLUBjaW5kZXggQGNvZGV7c2l6ZX0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey5zaXplfSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgd2hlbgotQGNvZGV7QHZhbHVle0FTfX0gaXMgZ2VuZXJhdGluZyBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0Ci1pZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBTbGViMTI4Ci1Ac2VjdGlvbiBAY29kZXsuc2xlYjEyOCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtzbGViMTI4fSBkaXJlY3RpdmUKLUB2YXJ7c2xlYjEyOH0gc3RhbmRzIGZvciBgYHNpZ25lZCBsaXR0bGUgZW5kaWFuIGJhc2UgMTI4LicnICBUaGlzIGlzIGEgCi1jb21wYWN0LCB2YXJpYWJsZSBsZW5ndGggcmVwcmVzZW50YXRpb24gb2YgbnVtYmVycyB1c2VkIGJ5IHRoZSBEV0FSRgotc3ltYm9saWMgZGVidWdnaW5nIGZvcm1hdC4gIEB4cmVme1VsZWIxMjgsQGNvZGV7LnVsZWIxMjh9fS4KLQotQGlmY2xlYXIgbm8tc3BhY2UtZGlyCi1Abm9kZSBTa2lwCi1Ac2VjdGlvbiBAY29kZXsuc2tpcCBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLQotQGNpbmRleCBAY29kZXtza2lwfSBkaXJlY3RpdmUKLUBjaW5kZXggZmlsbGluZyBtZW1vcnkKLVRoaXMgZGlyZWN0aXZlIGVtaXRzIEB2YXJ7c2l6ZX0gYnl0ZXMsIGVhY2ggb2YgdmFsdWUgQHZhcntmaWxsfS4gIEJvdGgKLUB2YXJ7c2l6ZX0gYW5kIEB2YXJ7ZmlsbH0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgSWYgdGhlIGNvbW1hIGFuZAotQHZhcntmaWxsfSBhcmUgb21pdHRlZCwgQHZhcntmaWxsfSBpcyBhc3N1bWVkIHRvIGJlIHplcm8uICBUaGlzIGlzIHRoZSBzYW1lIGFzCi1Ac2FtcHsuc3BhY2V9LgotCi1Abm9kZSBTcGFjZQotQHNlY3Rpb24gQGNvZGV7LnNwYWNlIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9fQotCi1AY2luZGV4IEBjb2Rle3NwYWNlfSBkaXJlY3RpdmUKLUBjaW5kZXggZmlsbGluZyBtZW1vcnkKLVRoaXMgZGlyZWN0aXZlIGVtaXRzIEB2YXJ7c2l6ZX0gYnl0ZXMsIGVhY2ggb2YgdmFsdWUgQHZhcntmaWxsfS4gIEJvdGgKLUB2YXJ7c2l6ZX0gYW5kIEB2YXJ7ZmlsbH0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgSWYgdGhlIGNvbW1hCi1hbmQgQHZhcntmaWxsfSBhcmUgb21pdHRlZCwgQHZhcntmaWxsfSBpcyBhc3N1bWVkIHRvIGJlIHplcm8uICBUaGlzIGlzIHRoZSBzYW1lCi1hcyBAc2FtcHsuc2tpcH0uCi0KLUBpZnNldCBIUFBBCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gQGNvZGV7LnNwYWNlfSBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBtZWFuaW5nIGZvciBIUFBBCi10YXJnZXRzOyB1c2UgQGNvZGV7LmJsb2NrfSBhcyBhIHN1YnN0aXR1dGUuICBTZWUgQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAKLUFzc2VtYmx5IExhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9IChIUCA5MjQzMi05MDAwMSkgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQotQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuICBAeHJlZntIUFBBIERpcmVjdGl2ZXMsLEhQUEEgQXNzZW1ibGVyIERpcmVjdGl2ZXN9LAotZm9yIGEgc3VtbWFyeS4KLUBlbmQgcXVvdGF0aW9uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IEEyOUsKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIFNwYWNlCi1Ac2VjdGlvbiBAY29kZXsuc3BhY2V9Ci1AY2luZGV4IEBjb2Rle3NwYWNlfSBkaXJlY3RpdmUKLUBlbmQgaWZjbGVhcgotT24gdGhlIEFNRCAyOUssIHRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIEFNRCAyOUsgYXNzZW1ibGVycy4KLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEluIG1vc3QgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciwgdGhlIGRpcmVjdGl2ZQotQGNvZGV7LnNwYWNlfSBoYXMgdGhlIGVmZmVjdCBvZiBAY29kZXsuYmxvY2t9ICBAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIHF1b3RhdGlvbgotQGVuZCBpZnNldAotCi1AaWZzZXQgaGF2ZS1zdGFicwotQG5vZGUgU3RhYgotQHNlY3Rpb24gQGNvZGV7LnN0YWJkLCAuc3RhYm4sIC5zdGFic30KLQotQGNpbmRleCBzeW1ib2xpYyBkZWJ1Z2dlcnMsIGluZm9ybWF0aW9uIGZvcgotQGNpbmRleCBAY29kZXtzdGFiQHZhcnt4fX0gZGlyZWN0aXZlcwotVGhlcmUgYXJlIHRocmVlIGRpcmVjdGl2ZXMgdGhhdCBiZWdpbiBAc2FtcHsuc3RhYn0uCi1BbGwgZW1pdCBzeW1ib2xzIChAcHhyZWZ7U3ltYm9sc30pLCBmb3IgdXNlIGJ5IHN5bWJvbGljIGRlYnVnZ2Vycy4KLVRoZSBzeW1ib2xzIGFyZSBub3QgZW50ZXJlZCBpbiB0aGUgQGNvZGV7QHZhbHVle0FTfX0gaGFzaCB0YWJsZTogdGhleQotY2Fubm90IGJlIHJlZmVyZW5jZWQgZWxzZXdoZXJlIGluIHRoZSBzb3VyY2UgZmlsZS4KLVVwIHRvIGZpdmUgZmllbGRzIGFyZSByZXF1aXJlZDoKLQotQHRhYmxlIEB2YXIKLUBpdGVtIHN0cmluZwotVGhpcyBpcyB0aGUgc3ltYm9sJ3MgbmFtZS4gIEl0IG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0Ci1Ac2FtcHtcMDAwfSwgc28gaXMgbW9yZSBnZW5lcmFsIHRoYW4gb3JkaW5hcnkgc3ltYm9sIG5hbWVzLiAgU29tZQotZGVidWdnZXJzIHVzZWQgdG8gY29kZSBhcmJpdHJhcmlseSBjb21wbGV4IHN0cnVjdHVyZXMgaW50byBzeW1ib2wgbmFtZXMKLXVzaW5nIHRoaXMgZmllbGQuCi0KLUBpdGVtIHR5cGUKLUFuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgc3ltYm9sJ3MgdHlwZSBpcyBzZXQgdG8gdGhlIGxvdyA4IGJpdHMgb2YKLXRoaXMgZXhwcmVzc2lvbi4gIEFueSBiaXQgcGF0dGVybiBpcyBwZXJtaXR0ZWQsIGJ1dCBAY29kZXtAdmFsdWV7TER9fQotYW5kIGRlYnVnZ2VycyBjaG9rZSBvbiBzaWxseSBiaXQgcGF0dGVybnMuCi0KLUBpdGVtIG90aGVyCi1BbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIHN5bWJvbCdzIGBgb3RoZXInJyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRoZQotbG93IDggYml0cyBvZiB0aGlzIGV4cHJlc3Npb24uCi0KLUBpdGVtIGRlc2MKLUFuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgc3ltYm9sJ3MgZGVzY3JpcHRvciBpcyBzZXQgdG8gdGhlIGxvdyAxNgotYml0cyBvZiB0aGlzIGV4cHJlc3Npb24uCi0KLUBpdGVtIHZhbHVlCi1BbiBhYnNvbHV0ZSBleHByZXNzaW9uIHdoaWNoIGJlY29tZXMgdGhlIHN5bWJvbCdzIHZhbHVlLgotQGVuZCB0YWJsZQotCi1JZiBhIHdhcm5pbmcgaXMgZGV0ZWN0ZWQgd2hpbGUgcmVhZGluZyBhIEBjb2Rley5zdGFiZH0sIEBjb2Rley5zdGFibn0sCi1vciBAY29kZXsuc3RhYnN9IHN0YXRlbWVudCwgdGhlIHN5bWJvbCBoYXMgcHJvYmFibHkgYWxyZWFkeSBiZWVuIGNyZWF0ZWQ7Ci15b3UgZ2V0IGEgaGFsZi1mb3JtZWQgc3ltYm9sIGluIHlvdXIgb2JqZWN0IGZpbGUuICBUaGlzIGlzCi1jb21wYXRpYmxlIHdpdGggZWFybGllciBhc3NlbWJsZXJzIQotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7c3RhYmR9IGRpcmVjdGl2ZQotQGl0ZW0gLnN0YWJkIEB2YXJ7dHlwZX0gLCBAdmFye290aGVyfSAsIEB2YXJ7ZGVzY30KLQotVGhlIGBgbmFtZScnIG9mIHRoZSBzeW1ib2wgZ2VuZXJhdGVkIGlzIG5vdCBldmVuIGFuIGVtcHR5IHN0cmluZy4KLUl0IGlzIGEgbnVsbCBwb2ludGVyLCBmb3IgY29tcGF0aWJpbGl0eS4gIE9sZGVyIGFzc2VtYmxlcnMgdXNlZCBhCi1udWxsIHBvaW50ZXIgc28gdGhleSBkaWRuJ3Qgd2FzdGUgc3BhY2UgaW4gb2JqZWN0IGZpbGVzIHdpdGggZW1wdHkKLXN0cmluZ3MuCi0KLVRoZSBzeW1ib2wncyB2YWx1ZSBpcyBzZXQgdG8gdGhlIGxvY2F0aW9uIGNvdW50ZXIsCi1yZWxvY2F0YWJseS4gIFdoZW4geW91ciBwcm9ncmFtIGlzIGxpbmtlZCwgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sCi1pcyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24gY291bnRlciB3aGVuIHRoZSBAY29kZXsuc3RhYmR9IHdhcwotYXNzZW1ibGVkLgotCi1AY2luZGV4IEBjb2Rle3N0YWJufSBkaXJlY3RpdmUKLUBpdGVtIC5zdGFibiBAdmFye3R5cGV9ICwgQHZhcntvdGhlcn0gLCBAdmFye2Rlc2N9ICwgQHZhcnt2YWx1ZX0KLVRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcgQGNvZGV7IiJ9LgotCi1AY2luZGV4IEBjb2Rle3N0YWJzfSBkaXJlY3RpdmUKLUBpdGVtIC5zdGFicyBAdmFye3N0cmluZ30gLCAgQHZhcnt0eXBlfSAsIEB2YXJ7b3RoZXJ9ICwgQHZhcntkZXNjfSAsIEB2YXJ7dmFsdWV9Ci1BbGwgZml2ZSBmaWVsZHMgYXJlIHNwZWNpZmllZC4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLUBjIGVuZCAgICAgaGF2ZS1zdGFicwotCi1Abm9kZSBTdHJpbmcKLUBzZWN0aW9uIEBjb2Rley5zdHJpbmd9ICJAdmFye3N0cn0iCi0KLUBjaW5kZXggc3RyaW5nLCBjb3B5aW5nIHRvIG9iamVjdCBmaWxlCi1AY2luZGV4IEBjb2Rle3N0cmluZ30gZGlyZWN0aXZlCi0KLUNvcHkgdGhlIGNoYXJhY3RlcnMgaW4gQHZhcntzdHJ9IHRvIHRoZSBvYmplY3QgZmlsZS4gIFlvdSBtYXkgc3BlY2lmeSBtb3JlIHRoYW4KLW9uZSBzdHJpbmcgdG8gY29weSwgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGZvciBhCi1wYXJ0aWN1bGFyIG1hY2hpbmUsIHRoZSBhc3NlbWJsZXIgbWFya3MgdGhlIGVuZCBvZiBlYWNoIHN0cmluZyB3aXRoIGEgMCBieXRlLgotWW91IGNhbiB1c2UgYW55IG9mIHRoZSBlc2NhcGUgc2VxdWVuY2VzIGRlc2NyaWJlZCBpbiBAcmVme1N0cmluZ3MsLFN0cmluZ3N9LgotCi1Abm9kZSBTdHJ1Y3QKLUBzZWN0aW9uIEBjb2Rley5zdHJ1Y3QgQHZhcntleHByZXNzaW9ufX0KLQotQGNpbmRleCBAY29kZXtzdHJ1Y3R9IGRpcmVjdGl2ZQotU3dpdGNoIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBhbmQgc2V0IHRoZSBzZWN0aW9uIG9mZnNldCB0byBAdmFye2V4cHJlc3Npb259LAotd2hpY2ggbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgWW91IG1pZ2h0IHVzZSB0aGlzIGFzIGZvbGxvd3M6Ci1Ac21hbGxleGFtcGxlCi0gICAgICAgIC5zdHJ1Y3QgMAotZmllbGQxOgotICAgICAgICAuc3RydWN0IGZpZWxkMSArIDQKLWZpZWxkMjoKLSAgICAgICAgLnN0cnVjdCBmaWVsZDIgKyA0Ci1maWVsZDM6Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyB3b3VsZCBkZWZpbmUgdGhlIHN5bWJvbCBAY29kZXtmaWVsZDF9IHRvIGhhdmUgdGhlIHZhbHVlIDAsIHRoZSBzeW1ib2wKLUBjb2Rle2ZpZWxkMn0gdG8gaGF2ZSB0aGUgdmFsdWUgNCwgYW5kIHRoZSBzeW1ib2wgQGNvZGV7ZmllbGQzfSB0byBoYXZlIHRoZQotdmFsdWUgOC4gIEFzc2VtYmx5IHdvdWxkIGJlIGxlZnQgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIGFuZCB5b3Ugd291bGQgbmVlZCB0bwotdXNlIGEgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBvZiBzb21lIHNvcnQgdG8gY2hhbmdlIHRvIHNvbWUgb3RoZXIgc2VjdGlvbgotYmVmb3JlIGZ1cnRoZXIgYXNzZW1ibHkuCi0KLUBpZnNldCBFTEYKLUBub2RlIFN5bXZlcgotQHNlY3Rpb24gQGNvZGV7LnN5bXZlcn0KLUBjaW5kZXggQGNvZGV7c3ltdmVyfSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sIHZlcnNpb25pbmcKLUBjaW5kZXggdmVyc2lvbnMgb2Ygc3ltYm9scwotVXNlIHRoZSBAY29kZXsuc3ltdmVyfSBkaXJlY3RpdmUgdG8gYmluZCBzeW1ib2xzIHRvIHNwZWNpZmljIHZlcnNpb24gbm9kZXMKLXdpdGhpbiBhIHNvdXJjZSBmaWxlLiAgVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBvbiBFTEYgcGxhdGZvcm1zLCBhbmQgaXMKLXR5cGljYWxseSB1c2VkIHdoZW4gYXNzZW1ibGluZyBmaWxlcyB0byBiZSBsaW5rZWQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LgotVGhlcmUgYXJlIGNhc2VzIHdoZXJlIGl0IG1heSBtYWtlIHNlbnNlIHRvIHVzZSB0aGlzIGluIG9iamVjdHMgdG8gYmUgYm91bmQKLWludG8gYW4gYXBwbGljYXRpb24gaXRzZWxmIHNvIGFzIHRvIG92ZXJyaWRlIGEgdmVyc2lvbmVkIHN5bWJvbCBmcm9tIGEKLXNoYXJlZCBsaWJyYXJ5LgotCi1Gb3IgRUxGIHRhcmdldHMsIHRoZSBAY29kZXsuc3ltdmVyfSBkaXJlY3RpdmUgaXMgdXNlZCBsaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi0uc3ltdmVyIEB2YXJ7bmFtZX0sIEB2YXJ7bmFtZTJAQG5vZGVuYW1lfQotQGVuZCBzbWFsbGV4YW1wbGUKLUluIHRoaXMgY2FzZSwgdGhlIHN5bWJvbCBAdmFye25hbWV9IG11c3QgZXhpc3QgYW5kIGJlIGRlZmluZWQgd2l0aGluIHRoZSBmaWxlCi1iZWluZyBhc3NlbWJsZWQuICBUaGUgQGNvZGV7LnZlcnN5bX0gZGlyZWN0aXZlIGVmZmVjdGl2ZWx5IGNyZWF0ZXMgYSBzeW1ib2wKLWFsaWFzIHdpdGggdGhlIG5hbWUgQHZhcntuYW1lMkBAbm9kZW5hbWV9LCBhbmQgaW4gZmFjdCB0aGUgbWFpbiByZWFzb24gdGhhdCB3ZQotanVzdCBkb24ndCB0cnkgYW5kIGNyZWF0ZSBhIHJlZ3VsYXIgYWxpYXMgaXMgdGhhdCB0aGUgQHZhcntAQH0gY2hhcmFjdGVyIGlzbid0Ci1wZXJtaXR0ZWQgaW4gc3ltYm9sIG5hbWVzLiAgVGhlIEB2YXJ7bmFtZTJ9IHBhcnQgb2YgdGhlIG5hbWUgaXMgdGhlIGFjdHVhbCBuYW1lCi1vZiB0aGUgc3ltYm9sIGJ5IHdoaWNoIGl0IHdpbGwgYmUgZXh0ZXJuYWxseSByZWZlcmVuY2VkLiAgVGhlIG5hbWUgQHZhcntuYW1lfQotaXRzZWxmIGlzIG1lcmVseSBhIG5hbWUgb2YgY29udmVuaWVuY2UgdGhhdCBpcyB1c2VkIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KLWhhdmUgZGVmaW5pdGlvbnMgZm9yIG11bHRpcGxlIHZlcnNpb25zIG9mIGEgZnVuY3Rpb24gd2l0aGluIGEgc2luZ2xlIHNvdXJjZQotZmlsZSwgYW5kIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiB1bmFtYmlndW91c2x5IGtub3cgd2hpY2ggdmVyc2lvbiBvZiBhCi1mdW5jdGlvbiBpcyBiZWluZyBtZW50aW9uZWQuICBUaGUgQHZhcntub2RlbmFtZX0gcG9ydGlvbiBvZiB0aGUgYWxpYXMgc2hvdWxkIGJlCi10aGUgbmFtZSBvZiBhIG5vZGUgc3BlY2lmaWVkIGluIHRoZSB2ZXJzaW9uIHNjcmlwdCBzdXBwbGllZCB0byB0aGUgbGlua2VyIHdoZW4KLWJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkuICBJZiB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYSB2ZXJzaW9uZWQKLXN5bWJvbCBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gQHZhcntub2RlbmFtZX0gc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlCi1ub2RlbmFtZSBvZiB0aGUgc3ltYm9sIHlvdSBhcmUgdHJ5aW5nIHRvIG92ZXJyaWRlLgotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgVGFnCi1Ac2VjdGlvbiBAY29kZXsudGFnIEB2YXJ7c3RydWN0bmFtZX19Ci0KLUBjaW5kZXggQ09GRiBzdHJ1Y3R1cmUgZGVidWdnaW5nCi1AY2luZGV4IHN0cnVjdHVyZSBkZWJ1Z2dpbmcsIENPRkYKLUBjaW5kZXggQGNvZGV7dGFnfSBkaXJlY3RpdmUKLVRoaXMgZGlyZWN0aXZlIGlzIGdlbmVyYXRlZCBieSBjb21waWxlcnMgdG8gaW5jbHVkZSBhdXhpbGlhcnkgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSXQgaXMgb25seSBwZXJtaXR0ZWQgaW5zaWRlCi1AY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLiAgVGFncyBhcmUgdXNlZCB0byBsaW5rIHN0cnVjdHVyZQotZGVmaW5pdGlvbnMgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIGluc3RhbmNlcyBvZiB0aG9zZSBzdHJ1Y3R1cmVzLgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LnRhZ30gaXMgb25seSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KLUBjb2Rle0B2YWx1ZXtBU319IGlzIGdlbmVyYXRpbmcgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dAotaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgVGV4dAotQHNlY3Rpb24gQGNvZGV7LnRleHQgQHZhcntzdWJzZWN0aW9ufX0KLQotQGNpbmRleCBAY29kZXt0ZXh0fSBkaXJlY3RpdmUKLVRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGFzc2VtYmxlIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBvbnRvIHRoZSBlbmQgb2YKLXRoZSB0ZXh0IHN1YnNlY3Rpb24gbnVtYmVyZWQgQHZhcntzdWJzZWN0aW9ufSwgd2hpY2ggaXMgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24uICBJZiBAdmFye3N1YnNlY3Rpb259IGlzIG9taXR0ZWQsIHN1YnNlY3Rpb24gbnVtYmVyIHplcm8KLWlzIHVzZWQuCi0KLUBub2RlIFRpdGxlCi1Ac2VjdGlvbiBAY29kZXsudGl0bGUgIkB2YXJ7aGVhZGluZ30ifQotCi1AY2luZGV4IEBjb2Rle3RpdGxlfSBkaXJlY3RpdmUKLUBjaW5kZXggbGlzdGluZyBjb250cm9sOiB0aXRsZSBsaW5lCi1Vc2UgQHZhcntoZWFkaW5nfSBhcyB0aGUgdGl0bGUgKHNlY29uZCBsaW5lLCBpbW1lZGlhdGVseSBhZnRlciB0aGUKLXNvdXJjZSBmaWxlIG5hbWUgYW5kIHBhZ2VudW1iZXIpIHdoZW4gZ2VuZXJhdGluZyBhc3NlbWJseSBsaXN0aW5ncy4KLQotVGhpcyBkaXJlY3RpdmUgYWZmZWN0cyBzdWJzZXF1ZW50IHBhZ2VzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBhZ2UgaWYKLWl0IGFwcGVhcnMgd2l0aGluIHRlbiBsaW5lcyBvZiB0aGUgdG9wIG9mIGEgcGFnZS4KLQotQGlmc2V0IENPRkYKLUBub2RlIFR5cGUKLUBzZWN0aW9uIEBjb2Rley50eXBlIEB2YXJ7aW50fX0KLQotQGNpbmRleCBDT0ZGIHN5bWJvbCB0eXBlCi1AY2luZGV4IHN5bWJvbCB0eXBlLCBDT0ZGCi1AY2luZGV4IEBjb2Rle3R5cGV9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUsIHBlcm1pdHRlZCBvbmx5IHdpdGhpbiBAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLAotcmVjb3JkcyB0aGUgaW50ZWdlciBAdmFye2ludH0gYXMgdGhlIHR5cGUgYXR0cmlidXRlIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LnR5cGV9IGlzIGFzc29jaWF0ZWQgb25seSB3aXRoIENPRkYgZm9ybWF0IG91dHB1dDsgd2hlbgotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgQGNvZGV7Yi5vdXR9IG91dHB1dCwgaXQgYWNjZXB0cyB0aGlzCi1kaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBpZnNldCBDT0ZGCi1Abm9kZSBWYWwKLUBzZWN0aW9uIEBjb2Rley52YWwgQHZhcnthZGRyfX0KLQotQGNpbmRleCBAY29kZXt2YWx9IGRpcmVjdGl2ZQotQGNpbmRleCBDT0ZGIHZhbHVlIGF0dHJpYnV0ZQotQGNpbmRleCB2YWx1ZSBhdHRyaWJ1dGUsIENPRkYKLVRoaXMgZGlyZWN0aXZlLCBwZXJtaXR0ZWQgb25seSB3aXRoaW4gQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycywKLXJlY29yZHMgdGhlIGFkZHJlc3MgQHZhcnthZGRyfSBhcyB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIGEgc3ltYm9sIHRhYmxlCi1lbnRyeS4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey52YWx9IGlzIHVzZWQgb25seSBmb3IgQ09GRiBvdXRwdXQ7IHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMKLWNvbmZpZ3VyZWQgZm9yIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgVWxlYjEyOAotQHNlY3Rpb24gQGNvZGV7LnVsZWIxMjggQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7dWxlYjEyOH0gZGlyZWN0aXZlCi1AdmFye3VsZWIxMjh9IHN0YW5kcyBmb3IgYGB1bnNpZ25lZCBsaXR0bGUgZW5kaWFuIGJhc2UgMTI4LicnICBUaGlzIGlzIGEgCi1jb21wYWN0LCB2YXJpYWJsZSBsZW5ndGggcmVwcmVzZW50YXRpb24gb2YgbnVtYmVycyB1c2VkIGJ5IHRoZSBEV0FSRgotc3ltYm9saWMgZGVidWdnaW5nIGZvcm1hdC4gIEB4cmVme1NsZWIxMjgsQGNvZGV7LnNsZWIxMjh9fS4KLQotQG5vZGUgV29yZAotQHNlY3Rpb24gQGNvZGV7LndvcmQgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBleHBlY3RzIHplcm8gb3IgbW9yZSBAdmFye2V4cHJlc3Npb25zfSwgb2YgYW55IHNlY3Rpb24sCi1zZXBhcmF0ZWQgYnkgY29tbWFzLgotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IFczMgotRm9yIGVhY2ggZXhwcmVzc2lvbiwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMgYSAzMi1iaXQgbnVtYmVyLgotQGVuZCBpZnNldAotQGlmc2V0IFcxNgotRm9yIGVhY2ggZXhwcmVzc2lvbiwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMgYSAxNi1iaXQgbnVtYmVyLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotCi1UaGUgc2l6ZSBvZiB0aGUgbnVtYmVyIGVtaXR0ZWQsIGFuZCBpdHMgYnl0ZSBvcmRlciwKLWRlcGVuZCBvbiB3aGF0IHRhcmdldCBjb21wdXRlciB0aGUgYXNzZW1ibHkgaXMgZm9yLgotQGVuZCBpZnNldAotCi1AYyBvbiBhbWQyOWssIGk5NjAsIHNwYXJjIHRoZSAic3BlY2lhbCB0cmVhdG1lbnQgdG8gc3VwcG9ydCBjb21waWxlcnMiIGRvZXNuJ3QKLUBjIGhhcHBlbi0tLTMyLWJpdCBhZGRyZXNzYWJpbGl0eSwgcGVyaW9kOyBubyBsb25nL3Nob3J0IGp1bXBzLgotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi1AY2luZGV4IGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQKLUBjaW5kZXggYWx0ZXJlZCBkaWZmZXJlbmNlIHRhYmxlcwotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzogU3BlY2lhbCBUcmVhdG1lbnQgdG8gc3VwcG9ydCBDb21waWxlcnN9Ci1AZW5kIHF1b3RhdGlvbgotCi1AaWZzZXQgR0VORVJJQwotTWFjaGluZXMgd2l0aCBhIDMyLWJpdCBhZGRyZXNzIHNwYWNlLCBidXQgdGhhdCBkbyBsZXNzIHRoYW4gMzItYml0Ci1hZGRyZXNzaW5nLCByZXF1aXJlIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCB0cmVhdG1lbnQuICBJZiB0aGUgbWFjaGluZSBvZgotaW50ZXJlc3QgdG8geW91IGRvZXMgMzItYml0IGFkZHJlc3NpbmcgKG9yIGRvZXNuJ3QgcmVxdWlyZSBpdDsKLUBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLCB5b3UgY2FuIGlnbm9yZSB0aGlzIGlzc3VlLgotCi1AZW5kIGlmc2V0Ci1JbiBvcmRlciB0byBhc3NlbWJsZSBjb21waWxlciBvdXRwdXQgaW50byBzb21ldGhpbmcgdGhhdCB3b3JrcywKLUBjb2Rle0B2YWx1ZXtBU319IG9jY2FzaW9ubGx5IGRvZXMgc3RyYW5nZSB0aGluZ3MgdG8gQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMuCi1EaXJlY3RpdmVzIG9mIHRoZSBmb3JtIEBzYW1wey53b3JkIHN5bTEtc3ltMn0gYXJlIG9mdGVuIGVtaXR0ZWQgYnkKLWNvbXBpbGVycyBhcyBwYXJ0IG9mIGp1bXAgdGFibGVzLiAgVGhlcmVmb3JlLCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGFzc2VtYmxlcyBhCi1kaXJlY3RpdmUgb2YgdGhlIGZvcm0gQHNhbXB7LndvcmQgc3ltMS1zeW0yfSwgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLUBjb2Rle3N5bTF9IGFuZCBAY29kZXtzeW0yfSBkb2VzIG5vdCBmaXQgaW4gMTYgYml0cywgQGNvZGV7QHZhbHVle0FTfX0KLWNyZWF0ZXMgYSBAZGZue3NlY29uZGFyeSBqdW1wIHRhYmxlfSwgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBuZXh0IGxhYmVsLgotVGhpcyBzZWNvbmRhcnkganVtcCB0YWJsZSBpcyBwcmVjZWRlZCBieSBhIHNob3J0LWp1bXAgdG8gdGhlCi1maXJzdCBieXRlIGFmdGVyIHRoZSBzZWNvbmRhcnkgdGFibGUuICBUaGlzIHNob3J0LWp1bXAgcHJldmVudHMgdGhlIGZsb3cKLW9mIGNvbnRyb2wgZnJvbSBhY2NpZGVudGFsbHkgZmFsbGluZyBpbnRvIHRoZSBuZXcgdGFibGUuICBJbnNpZGUgdGhlCi10YWJsZSBpcyBhIGxvbmctanVtcCB0byBAY29kZXtzeW0yfS4gIFRoZSBvcmlnaW5hbCBAc2FtcHsud29yZH0KLWNvbnRhaW5zIEBjb2Rle3N5bTF9IG1pbnVzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb25nLWp1bXAgdG8KLUBjb2Rle3N5bTJ9LgotCi1JZiB0aGVyZSB3ZXJlIHNldmVyYWwgb2NjdXJyZW5jZXMgb2YgQHNhbXB7LndvcmQgc3ltMS1zeW0yfSBiZWZvcmUgdGhlCi1zZWNvbmRhcnkganVtcCB0YWJsZSwgYWxsIG9mIHRoZW0gYXJlIGFkanVzdGVkLiAgSWYgdGhlcmUgd2FzIGEKLUBzYW1wey53b3JkIHN5bTMtc3ltNH0sIHRoYXQgYWxzbyBkaWQgbm90IGZpdCBpbiBzaXh0ZWVuIGJpdHMsIGEKLWxvbmctanVtcCB0byBAY29kZXtzeW00fSBpcyBpbmNsdWRlZCBpbiB0aGUgc2Vjb25kYXJ5IGp1bXAgdGFibGUsCi1hbmQgdGhlIEBjb2Rley53b3JkfSBkaXJlY3RpdmVzIGFyZSBhZGp1c3RlZCB0byBjb250YWluIEBjb2Rle3N5bTN9Ci1taW51cyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9uZy1qdW1wIHRvIEBjb2Rle3N5bTR9OyBhbmQgc28gb24sIGZvciBhcyBtYW55Ci1lbnRyaWVzIGluIHRoZSBvcmlnaW5hbCBqdW1wIHRhYmxlIGFzIG5lY2Vzc2FyeS4KLQotQGlmc2V0IElOVEVSTkFMUwotQGVtcGh7VGhpcyBmZWF0dXJlIG1heSBiZSBkaXNhYmxlZCBieSBjb21waWxpbmcgQGNvZGV7QHZhbHVle0FTfX0gd2l0aCB0aGUKLUBzYW1wey1EV09SS0lOR19ET1RfV09SRH0gb3B0aW9uLn0gVGhpcyBmZWF0dXJlIGlzIGxpa2VseSB0byBjb25mdXNlCi1hc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLUBjIGVuZCAgICAgRElGRi1UQkwtS0xVR0UKLQotQG5vZGUgRGVwcmVjYXRlZAotQHNlY3Rpb24gRGVwcmVjYXRlZCBEaXJlY3RpdmVzCi0KLUBjaW5kZXggZGVwcmVjYXRlZCBkaXJlY3RpdmVzCi1AY2luZGV4IG9ic29sZXNjZW50IGRpcmVjdGl2ZXMKLU9uZSBkYXkgdGhlc2UgZGlyZWN0aXZlcyB3b24ndCB3b3JrLgotVGhleSBhcmUgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBhc3NlbWJsZXJzLgotQHRhYmxlIEB0Ci1AaXRlbSAuYWJvcnQKLUBpdGVtIC5saW5lCi1AZW5kIHRhYmxlCi0KLUBpZnNldCBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBtYWNoaW5lIGRlcGVuZGVuY2llcwotVGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0cyBhcmUgKGFsbW9zdCBieSBkZWZpbml0aW9uKSBkaWZmZXJlbnQgb24KLWVhY2ggbWFjaGluZSB3aGVyZSBAY29kZXtAdmFsdWV7QVN9fSBydW5zLiAgRmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb25zCi12YXJ5IGFzIHdlbGwsIGFuZCBAY29kZXtAdmFsdWV7QVN9fSBvZnRlbiBzdXBwb3J0cyBhIGZldyBhZGRpdGlvbmFsCi1kaXJlY3RpdmVzIG9yIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLWFzc2VtYmxlcnMgb24gYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLiAgRmluYWxseSwgc29tZSB2ZXJzaW9ucyBvZgotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydCBzcGVjaWFsIHBzZXVkby1pbnN0cnVjdGlvbnMgZm9yIGJyYW5jaAotb3B0aW1pemF0aW9uLgotCi1UaGlzIGNoYXB0ZXIgZGlzY3Vzc2VzIG1vc3Qgb2YgdGhlc2UgZGlmZmVyZW5jZXMsIHRob3VnaCBpdCBkb2VzIG5vdAotaW5jbHVkZSBkZXRhaWxzIG9uIGFueSBtYWNoaW5lJ3MgaW5zdHJ1Y3Rpb24gc2V0LiAgRm9yIGRldGFpbHMgb24gdGhhdAotc3ViamVjdCwgc2VlIHRoZSBoYXJkd2FyZSBtYW51ZmFjdHVyZXIncyBtYW51YWwuCi0KLUBtZW51Ci1AaWZzZXQgQTI5SwotKiBBTUQyOUstRGVwZW5kZW50OjogICAgICAgICAgICBBTUQgMjlLIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotKiBBUkMtRGVwZW5kZW50OjogICAgICAgICAgICAgICBBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJNCi0qIEFSTS1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBEMTBWCi0qIEQxMFYtRGVwZW5kZW50OjogICAgICAgICAgICAgIEQxMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgRDMwVgotKiBEMzBWLURlcGVuZGVudDo6ICAgICAgICAgICAgICBEMzBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEg4LzMwMAotKiBIOC8zMDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzMwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLSogSDgvNTAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotKiBIUFBBLURlcGVuZGVudDo6ICAgICAgICAgICAgICBIUFBBIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEk4MDM4NgotKiBpMzg2LURlcGVuZGVudDo6ICAgICAgICAgICAgICBJbnRlbCA4MDM4NiBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi0qIGk5NjAtRGVwZW5kZW50OjogICAgICAgICAgICAgIEludGVsIDgwOTYwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotKiBNNjhLLURlcGVuZGVudDo6ICAgICAgICAgICAgICBNNjgweDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTUlQUwotKiBNSVBTLURlcGVuZGVudDo6ICAgICAgICAgICAgICBNSVBTIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFNICi0qIFNILURlcGVuZGVudDo6ICAgICAgICAgICAgICAgIEhpdGFjaGkgU0ggRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgUEoKLSogUEotRGVwZW5kZW50OjogICAgICAgICAgICAgICAgcGljb0phdmEgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU1BBUkMKLSogU3BhcmMtRGVwZW5kZW50OjogICAgICAgICAgICAgU1BBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVjg1MAotKiBWODUwLURlcGVuZGVudDo6ICAgICAgICAgICAgICBWODUwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFo4MDAwCi0qIFo4MDAwLURlcGVuZGVudDo6ICAgICAgICAgICAgIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFZBWAotKiBWYXgtRGVwZW5kZW50OjogICAgICAgICAgICAgICBWQVggRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AZW5kIG1lbnUKLQotQGxvd2Vyc2VjdGlvbnMKLUBlbmQgaWZzZXQKLQotQGMgVGhlIGZvbGxvd2luZyBtYWpvciBub2RlcyBhcmUgKnNlY3Rpb25zKiBpbiB0aGUgR0VORVJJQyB2ZXJzaW9uLCAqY2hhcHRlcnMqCi1AYyBpbiBzaW5nbGUtY3B1IHZlcnNpb25zLiAgVGhpcyBpcyBtYWlubHkgYWNoaWV2ZWQgYnkgQGxvd2Vyc2VjdGlvbnMuICBUaGVyZSBpcyBhCi1AYyBwZWN1bGlhcml0eTogdG8gcHJlc2VydmUgY3Jvc3MtcmVmZXJlbmNlcywgdGhlcmUgbXVzdCBiZSBhIG5vZGUgY2FsbGVkCi1AYyAiTWFjaGluZSBEZXBlbmRlbmNpZXMiLiAgSGVuY2UgdGhlIGNvbmRpdGlvbmFsIG5vZGVuYW1lcyBpbiBlYWNoCi1AYyBtYWpvciBub2RlIGJlbG93LiAgTm9kZSBkZWZhdWx0aW5nIGluIG1ha2VpbmZvIHJlcXVpcmVzIGFkamFjZW5jeSBvZgotQGMgbm9kZSBhbmQgc2VjdGlvbmluZyBjb21tYW5kczsgaGVuY2UgdGhlIHJlcGV0aXRpb24gb2YgQGNoYXB0ZXIgQkxBSAotQGMgaW4gYm90aCBjb25kaXRpb25hbCBibG9ja3MuCi0KLUBpZnNldCBBUkMKLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgQVJDLURlcGVuZGVudAotQGNoYXB0ZXIgQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEFSQyBzdXBwb3J0Ci1AbWVudQotKiBBUkMtT3B0czo6ICAgICAgICAgICAgICAgICAgICBPcHRpb25zCi0qIEFSQy1GbG9hdDo6ICAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEFSQy1EaXJlY3RpdmVzOjogICAgICAgICAgICAgIFNwYXJjIE1hY2hpbmUgRGlyZWN0aXZlcwotQGVuZCBtZW51Ci0KLUBub2RlIEFSQy1PcHRzCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucyBmb3IgQVJDCi1AY2luZGV4IEFSQyBvcHRpb25zCi1AY2luZGV4IGFyY2hpdGVjdHVyZXMsIEFSQwotQGNpbmRleCBBUkMgYXJjaGl0ZWN0dXJlcwotVGhlIEFSQyBjaGlwIGZhbWlseSBpbmNsdWRlcyBzZXZlcmFsIHN1Y2Nlc3NpdmUgbGV2ZWxzIChvciBvdGhlcgotdmFyaWFudHMpIG9mIGNoaXAsIHVzaW5nIHRoZSBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0LCBidXQgaW5jbHVkaW5nCi1hIGZldyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdCBlYWNoIGxldmVsLgotCi1CeSBkZWZhdWx0LCBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIHRoZSBjb3JlIGluc3RydWN0aW9uIHNldCAoQVJDCi1iYXNlKS4gIFRoZSBAY29kZXsuY3B1fSBwc2V1ZG8tb3AgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBzZWxlY3QKLXRoZSB2YXJpYW50LgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7LW1iaWctZW5kaWFufSBvcHRpb24gKEFSQykKLUBjaW5kZXggQGNvZGV7LW1saXR0bGUtZW5kaWFufSBvcHRpb24gKEFSQykKLUBjaW5kZXggQVJDIGJpZy1lbmRpYW4gb3V0cHV0Ci1AY2luZGV4IEFSQyBsaXR0bGUtZW5kaWFuIG91dHB1dAotQGNpbmRleCBiaWctZW5kaWFuIG91dHB1dCwgQVJDCi1AY2luZGV4IGxpdHRsZS1lbmRpYW4gb3V0cHV0LCBBUkMKLUBpdGVtIC1tYmlnLWVuZGlhbgotQGl0ZW14IC1tbGl0dGxlLWVuZGlhbgotQW55IEBzY3thcmN9IGNvbmZpZ3VyYXRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gY2FuIHNlbGVjdCBiaWctZW5kaWFuIG9yCi1saXR0bGUtZW5kaWFuIG91dHB1dCBhdCBydW4gdGltZSAodW5saWtlIG1vc3Qgb3RoZXIgQHNje2dudX0gZGV2ZWxvcG1lbnQKLXRvb2xzLCB3aGljaCBtdXN0IGJlIGNvbmZpZ3VyZWQgZm9yIG9uZSBvciB0aGUgb3RoZXIpLiAgVXNlCi1Ac2FtcHstbWJpZy1lbmRpYW59IHRvIHNlbGVjdCBiaWctZW5kaWFuIG91dHB1dCwgYW5kIEBzYW1wey1tbGl0dGxlLWVuZGlhbn0KLWZvciBsaXR0bGUtZW5kaWFuLgotQGVuZCB0YWJsZQotCi1Abm9kZSBBUkMtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEFSQyAoQHNje2llZWV9KQotQGNpbmRleCBBUkMgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBBUkMgY3B1IGZhbWlseSBjdXJyZW50bHkgZG9lcyBub3QgaGF2ZSBoYXJkd2FyZSBmbG9hdGluZyBwb2ludAotc3VwcG9ydC4gIFNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgaXMgcHJvdmlkZWQgYnkgQGNvZGV7R0NDfQotYW5kIHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0KLUBub2RlIEFSQy1EaXJlY3RpdmVzCi1Ac2VjdGlvbiBBUkMgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggQVJDIG1hY2hpbmUgZGlyZWN0aXZlcwotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEFSQwotVGhlIEFSQyB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAotbWFjaGluZSBkaXJlY3RpdmVzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5jcHUKLUBjaW5kZXggQGNvZGV7Y3B1fSBkaXJlY3RpdmUsIFNQQVJDCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIGRlc2lyZWQgY3B1LgotVGhlIEFSQyBpcyBpbnRlbmRlZCB0byBiZSBjdXN0b21pemFibGUsIEBjb2Rley5jcHV9IGlzIHVzZWQgdG8KLXNlbGVjdCB0aGUgZGVzaXJlZCB2YXJpYW50IFt0aG91Z2ggY3VycmVudGx5IHRoZXJlIGFyZSBub25lXS4KLQotQGVuZCB0YWJsZQotCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBBMjlLCi1AaW5jbHVkZSBjLWEyOWsudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgQVJNCi1AaW5jbHVkZSBjLWFybS50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIaXRhY2hpLWFsbAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi0KLVRoZSBtYWNoaW5lIGluc3RydWN0aW9uIHNldHMgYXJlIGRpZmZlcmVudCBvbiBlYWNoIEhpdGFjaGkgY2hpcCBmYW1pbHksCi1hbmQgdGhlcmUgYXJlIGFsc28gc29tZSBzeW50YXggZGlmZmVyZW5jZXMgYW1vbmcgdGhlIGZhbWlsaWVzLiAgVGhpcwotY2hhcHRlciBkZXNjcmliZXMgdGhlIHNwZWNpZmljIEBjb2Rle0B2YWx1ZXtBU319IGZlYXR1cmVzIGZvciBlYWNoCi1mYW1pbHkuCi0KLUBtZW51Ci0qIEg4LzMwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEhpdGFjaGkgSDgvMzAwIERlcGVuZGVudCBGZWF0dXJlcwotKiBIOC81MDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzUwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLSogU0gtRGVwZW5kZW50OjogICAgICAgICAgICAgICAgSGl0YWNoaSBTSCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgbWVudQotQGxvd2Vyc2VjdGlvbnMKLUBlbmQgaWZjbGVhcgotQGVuZCBpZnNldAotCi1AaWZzZXQgRDEwVgotQGluY2x1ZGUgYy1kMTB2LnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQzMFYKLUBpbmNsdWRlIGMtZDMwdi50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIOC8zMDAKLUBpbmNsdWRlIGMtaDgzMDAudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSDgvNTAwCi1AaW5jbHVkZSBjLWg4NTAwLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLUBpbmNsdWRlIGMtaHBwYS50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBJODAzODYKLUBpbmNsdWRlIGMtaTM4Ni50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBJOTYwCi1AaW5jbHVkZSBjLWk5NjAudGV4aQotQGVuZCBpZnNldAotCi0KLUBpZnNldCBNNjgwWDAKLUBpbmNsdWRlIGMtbTY4ay50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBNSVBTCi1AaW5jbHVkZSBjLW1pcHMudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgTlMzMksKLUBpbmNsdWRlIGMtbnMzMmsudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgUEoKLUBpbmNsdWRlIGMtcGoudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgU0gKLUBpbmNsdWRlIGMtc2gudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgU1BBUkMKLUBpbmNsdWRlIGMtc3BhcmMudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgWjgwMDAKLUBpbmNsdWRlIGMtejhrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFZBWAotQGluY2x1ZGUgYy12YXgudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgVjg1MAotQGluY2x1ZGUgYy12ODUwLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEdFTkVSSUMKLUBjIHJldmVyc2UgZWZmZWN0IG9mIEBkb3duIGF0IHRvcCBvZiBnZW5lcmljIE1hY2hpbmUtRGVwIGNoYXB0ZXIKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFJlcG9ydGluZyBCdWdzCi1AY2hhcHRlciBSZXBvcnRpbmcgQnVncwotQGNpbmRleCBidWdzIGluIGFzc2VtYmxlcgotQGNpbmRleCByZXBvcnRpbmcgYnVncyBpbiBhc3NlbWJsZXIKLQotWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyBAY29kZXtAdmFsdWV7QVN9fSByZWxpYWJsZS4KLQotUmVwb3J0aW5nIGEgYnVnIG1heSBoZWxwIHlvdSBieSBicmluZ2luZyBhIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbSwgb3IgaXQgbWF5Ci1ub3QuICBCdXQgaW4gYW55IGNhc2UgdGhlIHByaW5jaXBhbCBmdW5jdGlvbiBvZiBhIGJ1ZyByZXBvcnQgaXMgdG8gaGVscCB0aGUKLWVudGlyZSBjb21tdW5pdHkgYnkgbWFraW5nIHRoZSBuZXh0IHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gd29yayBiZXR0ZXIuCi1CdWcgcmVwb3J0cyBhcmUgeW91ciBjb250cmlidXRpb24gdG8gdGhlIG1haW50ZW5hbmNlIG9mIEBjb2Rle0B2YWx1ZXtBU319LgotCi1JbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotaW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgotCi1AbWVudQotKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLSogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCi1AZW5kIG1lbnUKLQotQG5vZGUgQnVnIENyaXRlcmlhCi1Ac2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLUBjaW5kZXggYnVnIGNyaXRlcmlhCi0KLUlmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AY2luZGV4IGZhdGFsIHNpZ25hbAotQGNpbmRleCBhc3NlbWJsZXIgY3Jhc2gKLUBjaW5kZXggY3Jhc2ggb2YgYXNzZW1ibGVyCi1AaXRlbQotSWYgdGhlIGFzc2VtYmxlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKLUBjb2Rle0B2YWx1ZXtBU319IGJ1Zy4gIFJlbGlhYmxlIGFzc2VtYmxlcnMgbmV2ZXIgY3Jhc2guCi0KLUBjaW5kZXggZXJyb3Igb24gdmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBAY29kZXtAdmFsdWV7QVN9fSBwcm9kdWNlcyBhbiBlcnJvciBtZXNzYWdlIGZvciB2YWxpZCBpbnB1dCwgdGhhdCBpcyBhIGJ1Zy4KLQotQGNpbmRleCBpbnZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LCB0aGF0Ci1pcyBhIGJ1Zy4gIEhvd2V2ZXIsIHlvdSBzaG91bGQgbm90ZSB0aGF0IHlvdXIgaWRlYSBvZiBgYGludmFsaWQgaW5wdXQnJyBtaWdodAotYmUgb3VyIGlkZWEgb2YgYGBhbiBleHRlbnNpb24nJyBvciBgYHN1cHBvcnQgZm9yIHRyYWRpdGlvbmFsIHByYWN0aWNlJycuCi0KLUBpdGVtCi1JZiB5b3UgYXJlIGFuIGV4cGVyaWVuY2VkIHVzZXIgb2YgYXNzZW1ibGVycywgeW91ciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQKLW9mIEBjb2Rle0B2YWx1ZXtBU319IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEJ1ZyBSZXBvcnRpbmcKLUBzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncwotQGNpbmRleCBidWcgcmVwb3J0cwotQGNpbmRleCBhc3NlbWJsZXIgYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0gcHJvZHVjdHMuICBJZgoteW91IG9idGFpbmVkIEBjb2Rle0B2YWx1ZXtBU319IGZyb20gYSBzdXBwb3J0IG9yZ2FuaXphdGlvbiwgd2UgcmVjb21tZW5kIHlvdQotY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KLQotWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCi1pbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCi1kaXN0cmlidXRpb24uCi0KLUluIGFueSBldmVudCwgd2UgYWxzbyByZWNvbW1lbmQgdGhhdCB5b3Ugc2VuZCBidWcgcmVwb3J0cyBmb3IgQGNvZGV7QHZhbHVle0FTfX0KLXRvIEBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgotCi1UaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6Ci1Ac3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCi1mYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCi0KLU9mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlIHByb2JsZW0KLWFuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodCBhc3N1bWUgdGhhdCB0aGUKLW5hbWUgb2YgYSBzeW1ib2wgeW91IHVzZSBpbiBhbiBleGFtcGxlIGRvZXMgbm90IG1hdHRlci4gIFdlbGwsIHByb2JhYmx5IGl0IGRvZXMKLW5vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcyBhIHN0cmF5IG1lbW9yeSByZWZlcmVuY2Ugd2hpY2gKLWhhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUgdGhhdCBuYW1lIGlzIHN0b3JlZCBpbiBtZW1vcnk7Ci1wZXJoYXBzLCBpZiB0aGUgbmFtZSB3ZXJlIGRpZmZlcmVudCwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbAotdGhlIGFzc2VtYmxlciBpbnRvIGRvaW5nIHRoZSByaWdodCB0aGluZyBkZXNwaXRlIHRoZSBidWcuICBQbGF5IGl0IHNhZmUgYW5kCi1naXZlIGEgc3BlY2lmaWMsIGNvbXBsZXRlIGV4YW1wbGUuICBUaGF0IGlzIHRoZSBlYXNpZXN0IHRoaW5nIGZvciB5b3UgdG8gZG8sCi1hbmQgdGhlIG1vc3QgaGVscGZ1bC4KLQotS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHB1cnBvc2Ugb2YgYSBidWcgcmVwb3J0IGlzIHRvIGVuYWJsZSB1cyB0byBmaXggdGhlIGJ1ZyBpZgotaXQgaXMgbmV3IHRvIHVzLiAgVGhlcmVmb3JlLCBhbHdheXMgd3JpdGUgeW91ciBidWcgcmVwb3J0cyBvbiB0aGUgYXNzdW1wdGlvbgotdGhhdCB0aGUgYnVnIGhhcyBub3QgYmVlbiByZXBvcnRlZCBwcmV2aW91c2x5LgotCi1Tb21ldGltZXMgcGVvcGxlIGdpdmUgYSBmZXcgc2tldGNoeSBmYWN0cyBhbmQgYXNrLCBgYERvZXMgdGhpcyByaW5nIGEKLWJlbGw/JycgIFRob3NlIGJ1ZyByZXBvcnRzIGFyZSB1c2VsZXNzLCBhbmQgd2UgdXJnZSBldmVyeW9uZSB0bwotQGVtcGh7cmVmdXNlIHRvIHJlc3BvbmQgdG8gdGhlbX0gZXhjZXB0IHRvIGNoaWRlIHRoZSBzZW5kZXIgdG8gcmVwb3J0Ci1idWdzIHByb3Blcmx5LgotCi1UbyBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcsIHlvdSBzaG91bGQgaW5jbHVkZSBhbGwgdGhlc2UgdGhpbmdzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0uICBAY29kZXtAdmFsdWV7QVN9fSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0Ci1pdCB3aXRoIHRoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgotCi1XaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKLXRoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fS4KLQotQGl0ZW0KLUFueSBwYXRjaGVzIHlvdSBtYXkgaGF2ZSBhcHBsaWVkIHRvIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgQGNvZGV7QHZhbHVle0FTfX0tLS1lLmcuCi1gYEBjb2Rle2djYy0yLjd9JycuCi0KLUBpdGVtCi1UaGUgY29tbWFuZCBhcmd1bWVudHMgeW91IGdhdmUgdGhlIGFzc2VtYmxlciB0byBhc3NlbWJsZSB5b3VyIGV4YW1wbGUgYW5kCi1vYnNlcnZlIHRoZSBidWcuICBUbyBndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwgbGlzdCB0aGVtCi1hbGwuICBBIGNvcHkgb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMgc3VmZmljaWVudC4KLQotSWYgd2Ugd2VyZSB0byB0cnkgdG8gZ3Vlc3MgdGhlIGFyZ3VtZW50cywgd2Ugd291bGQgcHJvYmFibHkgZ3Vlc3Mgd3JvbmcKLWFuZCB0aGVuIHdlIG1pZ2h0IG5vdCBlbmNvdW50ZXIgdGhlIGJ1Zy4KLQotQGl0ZW0KLUEgY29tcGxldGUgaW5wdXQgZmlsZSB0aGF0IHdpbGwgcmVwcm9kdWNlIHRoZSBidWcuICBJZiB0aGUgYnVnIGlzIG9ic2VydmVkIHdoZW4KLXRoZSBhc3NlbWJsZXIgaXMgaW52b2tlZCB2aWEgYSBjb21waWxlciwgc2VuZCB0aGUgYXNzZW1ibGVyIHNvdXJjZSwgbm90IHRoZQotaGlnaCBsZXZlbCBsYW5ndWFnZSBzb3VyY2UuICBNb3N0IGNvbXBpbGVycyB3aWxsIHByb2R1Y2UgdGhlIGFzc2VtYmxlciBzb3VyY2UKLXdoZW4gcnVuIHdpdGggdGhlIEBzYW1wey1TfSBvcHRpb24uICBJZiB5b3UgYXJlIHVzaW5nIEBjb2Rle0B2YWx1ZXtHQ0N9fSwgdXNlCi10aGUgb3B0aW9ucyBAc2FtcHstdiAtLXNhdmUtdGVtcHN9OyB0aGlzIHdpbGwgc2F2ZSB0aGUgYXNzZW1ibGVyIHNvdXJjZSBpbiBhCi1maWxlIHdpdGggYW4gZXh0ZW5zaW9uIG9mIEBmaWxley5zfSwgYW5kIGFsc28gc2hvdyB5b3UgZXhhY3RseSBob3cKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGJlaW5nIHJ1bi4KLQotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2Ygd2hhdCBiZWhhdmlvciB5b3Ugb2JzZXJ2ZSB0aGF0IHlvdSBiZWxpZXZlIGlzCi1pbmNvcnJlY3QuICBGb3IgZXhhbXBsZSwgYGBJdCBnZXRzIGEgZmF0YWwgc2lnbmFsLicnCi0KLU9mIGNvdXJzZSwgaWYgdGhlIGJ1ZyBpcyB0aGF0IEBjb2Rle0B2YWx1ZXtBU319IGdldHMgYSBmYXRhbCBzaWduYWwsIHRoZW4gd2UKLXdpbGwgY2VydGFpbmx5IG5vdGljZSBpdC4gIEJ1dCBpZiB0aGUgYnVnIGlzIGluY29ycmVjdCBvdXRwdXQsIHdlIG1pZ2h0IG5vdAotbm90aWNlIHVubGVzcyBpdCBpcyBnbGFyaW5nbHkgd3JvbmcuICBZb3UgbWlnaHQgYXMgd2VsbCBub3QgZ2l2ZSB1cyBhIGNoYW5jZSB0bwotbWFrZSBhIG1pc3Rha2UuCi0KLUV2ZW4gaWYgdGhlIHByb2JsZW0geW91IGV4cGVyaWVuY2UgaXMgYSBmYXRhbCBzaWduYWwsIHlvdSBzaG91bGQgc3RpbGwgc2F5IHNvCi1leHBsaWNpdGx5LiAgU3VwcG9zZSBzb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbiwgc3VjaCBhcywgeW91ciBjb3B5IG9mCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIHRoZSBDCi1saWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodCBjcmFzaCBhbmQgb3Vycwotd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbiBvdXJzIGZhaWxzIHRvIGNyYXNoLCB3ZQotd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yIHVzLiAgSWYgeW91IGhhZCBub3QgdG9sZCB1cyB0bwotZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUgdG8gZHJhdyBhbnkgY29uY2x1c2lvbiBmcm9tIG91cgotb2JzZXJ2YXRpb25zLgotCi1AaXRlbQotSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UsIHNlbmQgdXMgY29udGV4dAotZGlmZnMsIGFzIGdlbmVyYXRlZCBieSBAY29kZXtkaWZmfSB3aXRoIHRoZSBAc2FtcHstdX0sIEBzYW1wey1jfSwgb3IgQHNhbXB7LXB9Ci1vcHRpb24uICBBbHdheXMgc2VuZCBkaWZmcyBmcm9tIHRoZSBvbGQgZmlsZSB0byB0aGUgbmV3IGZpbGUuICBJZiB5b3UgZXZlbgotZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle0B2YWx1ZXtBU319IHNvdXJjZSwgcmVmZXIgdG8gaXQgYnkgY29udGV4dCwgbm90Ci1ieSBsaW5lIG51bWJlci4KLQotVGhlIGxpbmUgbnVtYmVycyBpbiBvdXIgZGV2ZWxvcG1lbnQgc291cmNlcyB3aWxsIG5vdCBtYXRjaCB0aG9zZSBpbiB5b3VyCi1zb3VyY2VzLiAgWW91ciBsaW5lIG51bWJlcnMgd291bGQgY29udmV5IG5vIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB1cy4KLUBlbmQgaXRlbWl6ZQotCi1IZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5OgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQSBkZXNjcmlwdGlvbiBvZiB0aGUgZW52ZWxvcGUgb2YgdGhlIGJ1Zy4KLQotT2Z0ZW4gcGVvcGxlIHdobyBlbmNvdW50ZXIgYSBidWcgc3BlbmQgYSBsb3Qgb2YgdGltZSBpbnZlc3RpZ2F0aW5nCi13aGljaCBjaGFuZ2VzIHRvIHRoZSBpbnB1dCBmaWxlIHdpbGwgbWFrZSB0aGUgYnVnIGdvIGF3YXkgYW5kIHdoaWNoCi1jaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCBpdC4KLQotVGhpcyBpcyBvZnRlbiB0aW1lIGNvbnN1bWluZyBhbmQgbm90IHZlcnkgdXNlZnVsLCBiZWNhdXNlIHRoZSB3YXkgd2UKLXdpbGwgZmluZCB0aGUgYnVnIGlzIGJ5IHJ1bm5pbmcgYSBzaW5nbGUgZXhhbXBsZSB1bmRlciB0aGUgZGVidWdnZXIKLXdpdGggYnJlYWtwb2ludHMsIG5vdCBieSBwdXJlIGRlZHVjdGlvbiBmcm9tIGEgc2VyaWVzIG9mIGV4YW1wbGVzLgotV2UgcmVjb21tZW5kIHRoYXQgeW91IHNhdmUgeW91ciB0aW1lIGZvciBzb21ldGhpbmcgZWxzZS4KLQotT2YgY291cnNlLCBpZiB5b3UgY2FuIGZpbmQgYSBzaW1wbGVyIGV4YW1wbGUgdG8gcmVwb3J0IEBlbXBoe2luc3RlYWR9Ci1vZiB0aGUgb3JpZ2luYWwgb25lLCB0aGF0IGlzIGEgY29udmVuaWVuY2UgZm9yIHVzLiAgRXJyb3JzIGluIHRoZQotb3V0cHV0IHdpbGwgYmUgZWFzaWVyIHRvIHNwb3QsIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIHdpbGwgdGFrZQotbGVzcyB0aW1lLCBhbmQgc28gb24uCi0KLUhvd2V2ZXIsIHNpbXBsaWZpY2F0aW9uIGlzIG5vdCB2aXRhbDsgaWYgeW91IGRvIG5vdCB3YW50IHRvIGRvIHRoaXMsCi1yZXBvcnQgdGhlIGJ1ZyBhbnl3YXkgYW5kIHNlbmQgdXMgdGhlIGVudGlyZSB0ZXN0IGNhc2UgeW91IHVzZWQuCi0KLUBpdGVtCi1BIHBhdGNoIGZvciB0aGUgYnVnLgotCi1BIHBhdGNoIGZvciB0aGUgYnVnIGRvZXMgaGVscCB1cyBpZiBpdCBpcyBhIGdvb2Qgb25lLiAgQnV0IGRvIG5vdCBvbWl0Ci10aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0ZXN0IGNhc2UsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKLWEgcGF0Y2ggaXMgYWxsIHdlIG5lZWQuICBXZSBtaWdodCBzZWUgcHJvYmxlbXMgd2l0aCB5b3VyIHBhdGNoIGFuZCBkZWNpZGUKLXRvIGZpeCB0aGUgcHJvYmxlbSBhbm90aGVyIHdheSwgb3Igd2UgbWlnaHQgbm90IHVuZGVyc3RhbmQgaXQgYXQgYWxsLgotCi1Tb21ldGltZXMgd2l0aCBhIHByb2dyYW0gYXMgY29tcGxpY2F0ZWQgYXMgQGNvZGV7QHZhbHVle0FTfX0gaXQgaXMgdmVyeSBoYXJkIHRvCi1jb25zdHJ1Y3QgYW4gZXhhbXBsZSB0aGF0IHdpbGwgbWFrZSB0aGUgcHJvZ3JhbSBmb2xsb3cgYSBjZXJ0YWluIHBhdGggdGhyb3VnaAotdGhlIGNvZGUuICBJZiB5b3UgZG8gbm90IHNlbmQgdXMgdGhlIGV4YW1wbGUsIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gY29uc3RydWN0Ci1vbmUsIHNvIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gdmVyaWZ5IHRoYXQgdGhlIGJ1ZyBpcyBmaXhlZC4KLQotQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKLXBhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKLWhlbHAgdXMgdG8gdW5kZXJzdGFuZC4KLQotQGl0ZW0KLUEgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KLQotU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAotdGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEFja25vd2xlZGdlbWVudHMKLUBjaGFwdGVyIEFja25vd2xlZGdlbWVudHMKLQotSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgdG8gQGNvZGV7QHZhbHVle0FTfX0gYW5kIHlvdXIgbmFtZSBpc24ndCBsaXN0ZWQgaGVyZSwKLWl0IGlzIG5vdCBtZWFudCBhcyBhIHNsaWdodC4gIFdlIGp1c3QgZG9uJ3Qga25vdyBhYm91dCBpdC4gIFNlbmQgbWFpbCB0byB0aGUKLW1haW50YWluZXIsIGFuZCB3ZSdsbCBjb3JyZWN0IHRoZSBzaXR1YXRpb24uICBDdXJyZW50bHkgCi1AYyAoSmFudWFyeSAxOTk0KSwgCi10aGUgbWFpbnRhaW5lciBpcyBLZW4gUmFlYnVybiAoZW1haWwgYWRkcmVzcyBAY29kZXtyYWVidXJuQEBjeWdudXMuY29tfSkuCi0KLURlYW4gRWxzbmVyIHdyb3RlIHRoZSBvcmlnaW5hbCBAc2N7Z251fSBhc3NlbWJsZXIgZm9yIHRoZSBWQVguQGZvb3Rub3Rle0FueQotbW9yZSBkZXRhaWxzP30KLQotSmF5IEZlbmxhc29uIG1haW50YWluZWQgR0FTIGZvciBhIHdoaWxlLCBhZGRpbmcgc3VwcG9ydCBmb3IgR0RCLXNwZWNpZmljIGRlYnVnCi1pbmZvcm1hdGlvbiBhbmQgdGhlIDY4ayBzZXJpZXMgbWFjaGluZXMsIG1vc3Qgb2YgdGhlIHByZXByb2Nlc3NpbmcgcGFzcywgYW5kCi1leHRlbnNpdmUgY2hhbmdlcyBpbiBAZmlsZXttZXNzYWdlcy5jfSwgQGZpbGV7aW5wdXQtZmlsZS5jfSwgQGZpbGV7d3JpdGUuY30uCi0KLUsuIFJpY2hhcmQgUGl4bGV5IG1haW50YWluZWQgR0FTIGZvciBhIHdoaWxlLCBhZGRpbmcgdmFyaW91cyBlbmhhbmNlbWVudHMgYW5kCi1tYW55IGJ1ZyBmaXhlcywgaW5jbHVkaW5nIG1lcmdpbmcgc3VwcG9ydCBmb3Igc2V2ZXJhbCBwcm9jZXNzb3JzLCBicmVha2luZyBHQVMKLXVwIHRvIGhhbmRsZSBtdWx0aXBsZSBvYmplY3QgZmlsZSBmb3JtYXQgYmFjayBlbmRzIChpbmNsdWRpbmcgaGVhdnkgcmV3cml0ZSwKLXRlc3RpbmcsIGFuIGludGVncmF0aW9uIG9mIHRoZSBjb2ZmIGFuZCBiLm91dCBiYWNrIGVuZHMpLCBhZGRpbmcgY29uZmlndXJhdGlvbgotaW5jbHVkaW5nIGhlYXZ5IHRlc3RpbmcgYW5kIHZlcmlmaWNhdGlvbiBvZiBjcm9zcyBhc3NlbWJsZXJzIGFuZCBmaWxlIHNwbGl0cwotYW5kIHJlbmFtaW5nLCBjb252ZXJ0ZWQgR0FTIHRvIHN0cmljdGx5IEFOU0kgQyBpbmNsdWRpbmcgZnVsbCBwcm90b3R5cGVzLCBhZGRlZAotc3VwcG9ydCBmb3IgbTY4MFszNF0wIGFuZCBjcHUzMiwgZGlkIGNvbnNpZGVyYWJsZSB3b3JrIG9uIGk5NjAgaW5jbHVkaW5nIGEgQ09GRgotcG9ydCAoaW5jbHVkaW5nIGNvbnNpZGVyYWJsZSBhbW91bnRzIG9mIHJldmVyc2UgZW5naW5lZXJpbmcpLCBhIFNQQVJDIG9wY29kZQotZmlsZSByZXdyaXRlLCBERUNzdGF0aW9uLCByczYwMDAsIGFuZCBocDMwMGhwdXggaG9zdCBwb3J0cywgdXBkYXRlZCBgYGtub3cnJwotYXNzZXJ0aW9ucyBhbmQgbWFkZSB0aGVtIHdvcmssIG11Y2ggb3RoZXIgcmVvcmdhbml6YXRpb24sIGNsZWFudXAsIGFuZCBsaW50LgotCi1LZW4gUmFlYnVybiB3cm90ZSB0aGUgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlIGNvZGUgdG8gcmVwbGFjZSBtb3N0IG9mIHRoZSBjb2RlCi1pbiBmb3JtYXQtc3BlY2lmaWMgSS9PIG1vZHVsZXMuCi0KLVRoZSBvcmlnaW5hbCBWTVMgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgRGF2aWQgTC4gS2FzaHRhbi4gIEVyaWMgWW91bmdkYWxlCi1oYXMgZG9uZSBtdWNoIHdvcmsgd2l0aCBpdCBzaW5jZS4KLQotVGhlIEludGVsIDgwMzg2IG1hY2hpbmUgZGVzY3JpcHRpb24gd2FzIHdyaXR0ZW4gYnkgRWxpb3QgRHJlc3NlbGhhdXMuCi0KLU1pbmggVHJhbi1MZSBhdCBJbnRlbGxpQ29ycCBjb250cmlidXRlZCBzb21lIEFJWCAzODYgc3VwcG9ydC4KLQotVGhlIE1vdG9yb2xhIDg4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyBjb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZiBCdWZmYWxvCi1Vbml2ZXJzaXR5IGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KLQotS2VpdGggS25vd2xlcyBhdCB0aGUgT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHdyb3RlIHRoZSBvcmlnaW5hbCBNSVBTIGJhY2sgZW5kCi0oQGZpbGV7dGMtbWlwcy5jfSwgQGZpbGV7dGMtbWlwcy5ofSksIGFuZCBjb250cmlidXRlZCBSb3NlIGZvcm1hdCBzdXBwb3J0Ci0od2hpY2ggaGFzbid0IGJlZW4gbWVyZ2VkIGluIHlldCkuICBSYWxwaCBDYW1wYmVsbCB3b3JrZWQgd2l0aCB0aGUgTUlQUyBjb2RlIHRvCi1zdXBwb3J0IGEub3V0IGZvcm1hdC4KLQotU3VwcG9ydCBmb3IgdGhlIFppbG9nIFo4ayBhbmQgSGl0YWNoaSBIOC8zMDAgYW5kIEg4LzUwMCBwcm9jZXNzb3JzICh0Yy16OGssCi10Yy1oODMwMCwgdGMtaDg1MDApLCBhbmQgSUVFRSA2OTUgb2JqZWN0IGZpbGUgZm9ybWF0IChvYmotaWVlZSksIHdhcyB3cml0dGVuIGJ5Ci1TdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4gIFN0ZXZlIGFsc28gbW9kaWZpZWQgdGhlIENPRkYgYmFjayBlbmQgdG8KLXVzZSBCRkQgZm9yIHNvbWUgbG93LWxldmVsIG9wZXJhdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgSDgvMzAwIGFuZCBBTUQgMjlrCi10YXJnZXRzLgotCi1Kb2huIEdpbG1vcmUgYnVpbHQgdGhlIEFNRCAyOTAwMCBzdXBwb3J0LCBhZGRlZCBAY29kZXsuaW5jbHVkZX0gc3VwcG9ydCwgYW5kCi1zaW1wbGlmaWVkIHRoZSBjb25maWd1cmF0aW9uIG9mIHdoaWNoIHZlcnNpb25zIGFjY2VwdCB3aGljaCBkaXJlY3RpdmVzLiAgSGUKLXVwZGF0ZWQgdGhlIDY4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHNvIHRoYXQgTW90b3JvbGEncyBvcGNvZGVzIGFsd2F5cyBwcm9kdWNlZAotZml4ZWQtc2l6ZSBpbnN0cnVjdGlvbnMgKGUuZy4gQGNvZGV7anNyfSksIHdoaWxlIHN5bnRoZXRpYyBpbnN0cnVjdGlvbnMKLXJlbWFpbmVkIHNocmlua2FibGUgKEBjb2Rle2pic3J9KS4gIEpvaG4gZml4ZWQgbWFueSBidWdzLCBpbmNsdWRpbmcgdHJ1ZSB0ZXN0ZWQKLWNyb3NzLWNvbXBpbGF0aW9uIHN1cHBvcnQsIGFuZCBvbmUgYnVnIGluIHJlbGF4YXRpb24gdGhhdCB0b29rIGEgd2VlayBhbmQKLXJlcXVpcmVkIHRoZSBwcm92ZXJiaWFsIG9uZS1iaXQgZml4LgotCi1JYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0IG1lcmdlZCB0aGUgTW90b3JvbGEgYW5kIE1JVCBzeW50YXggZm9yIHRoZQotNjhrLCBjb21wbGV0ZWQgc3VwcG9ydCBmb3Igc29tZSBDT0ZGIHRhcmdldHMgKDY4aywgaTM4NiBTVlIzLCBhbmQgU0NPIFVuaXgpLAotYWRkZWQgc3VwcG9ydCBmb3IgTUlQUyBFQ09GRiBhbmQgRUxGIHRhcmdldHMsIHdyb3RlIHRoZSBpbml0aWFsIFJTLzYwMDAgYW5kCi1Qb3dlclBDIGFzc2VtYmxlciwgYW5kIG1hZGUgYSBmZXcgb3RoZXIgbWlub3IgcGF0Y2hlcy4KLQotU3RldmUgQ2hhbWJlcmxhaW4gbWFkZSBAY29kZXtAdmFsdWV7QVN9fSBhYmxlIHRvIGdlbmVyYXRlIGxpc3RpbmdzLgotCi1IZXdsZXR0LVBhY2thcmQgY29udHJpYnV0ZWQgc3VwcG9ydCBmb3IgdGhlIEhQOTAwMC8zMDAuCi0KLUplZmYgTGF3IHdyb3RlIEdBUyBhbmQgQkZEIHN1cHBvcnQgZm9yIHRoZSBuYXRpdmUgSFBQQSBvYmplY3QgZm9ybWF0IChTT00pCi1hbG9uZyB3aXRoIGEgZmFpcmx5IGV4dGVuc2l2ZSBIUFBBIHRlc3RzdWl0ZSAoZm9yIGJvdGggU09NIGFuZCBFTEYgb2JqZWN0Ci1mb3JtYXRzKS4gIFRoaXMgd29yayB3YXMgc3VwcG9ydGVkIGJ5IGJvdGggdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdAotdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVN1cHBvcnQgZm9yIEVMRiBmb3JtYXQgZmlsZXMgaGFzIGJlZW4gd29ya2VkIG9uIGJ5IE1hcmsgRWljaGluIG9mIEN5Z251cwotU3VwcG9ydCAob3JpZ2luYWwsIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24gZm9yIFNQQVJDKSwgUGV0ZSBIb29nZW5ib29tIGFuZAotSmVmZiBMYXcgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCAoSFBQQSBtYWlubHkpLCBNaWNoYWVsIE1laXNzbmVyIG9mIHRoZSBPcGVuCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uIChpMzg2IG1haW5seSksIGFuZCBLZW4gUmFlYnVybiBvZiBDeWdudXMgU3VwcG9ydCAoc3BhcmMsCi1hbmQgc29tZSBpbml0aWFsIDY0LWJpdCBzdXBwb3J0KS4KLQotUmljaGFyZCBIZW5kZXJzb24gcmV3cm90ZSB0aGUgQWxwaGEgYXNzZW1ibGVyLiBLbGF1cyBLYWVtcGYgd3JvdGUgR0FTIGFuZCBCRkQKLXN1cHBvcnQgZm9yIG9wZW5WTVMvQWxwaGEuCi0KLVNldmVyYWwgZW5naW5lZXJzIGF0IEN5Z251cyBTdXBwb3J0IGhhdmUgYWxzbyBwcm92aWRlZCBtYW55IHNtYWxsIGJ1ZyBmaXhlcyBhbmQKLWNvbmZpZ3VyYXRpb24gZW5oYW5jZW1lbnRzLgotCi1NYW55IG90aGVycyBoYXZlIGNvbnRyaWJ1dGVkIGxhcmdlIG9yIHNtYWxsIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMuICBJZgoteW91IGhhdmUgY29udHJpYnV0ZWQgc2lnbmlmaWNhbnQgd29yayBhbmQgYXJlIG5vdCBtZW50aW9uZWQgb24gdGhpcyBsaXN0LCBhbmQKLXdhbnQgdG8gYmUsIGxldCB1cyBrbm93LiAgU29tZSBvZiB0aGUgaGlzdG9yeSBoYXMgYmVlbiBsb3N0OyB3ZSBhcmUgbm90Ci1pbnRlbnRpb25hbGx5IGxlYXZpbmcgYW55b25lIG91dC4KLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkIEluZGV4Ci0KLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQotQGMgTG9jYWwgVmFyaWFibGVzOgotQGMgZmlsbC1jb2x1bW46IDc5Ci1AYyBFbmQ6CmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtYTI5ay50ZXhpIGIvZ2FzL2RvYy9jLWEyOWsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxMTVkOC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtYTI5ay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBBTUQyOUstRGVwZW5kZW50Ci1AY2hhcHRlciBBTUQgMjlLIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEFNRCAyOUsgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBBTUQgMjlLIHN1cHBvcnQKLUBjaW5kZXggMjlLIHN1cHBvcnQKLUBtZW51Ci0qIEFNRDI5SyBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogQU1EMjlLIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEFNRDI5SyBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEFNRDI5SyBEaXJlY3RpdmVzOjogICAgICAgICAgIEFNRCAyOUsgTWFjaGluZSBEaXJlY3RpdmVzCi0qIEFNRDI5SyBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBTUQyOUsgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotQGNpbmRleCBBTUQgMjlLIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMgZm9yIEFNRDI5SyAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgQU1ECi0yOUsgZmFtaWx5LgotCi1Abm9kZSBBTUQyOUsgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIEFNRDI5Sy1NYWNyb3M6OgkJTWFjcm9zCi0qIEFNRDI5Sy1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBBTUQyOUstUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotQGVuZCBtZW51Ci0KLUBub2RlIEFNRDI5Sy1NYWNyb3MKLUBzdWJzZWN0aW9uIE1hY3JvcwotCi1AY2luZGV4IE1hY3JvcywgQU1EIDI5SwotQGNpbmRleCBBTUQgMjlLIG1hY3JvcwotVGhlIG1hY3JvIHN5bnRheCB1c2VkIG9uIHRoZSBBTUQgMjlLIGlzIGxpa2UgdGhhdCBkZXNjcmliZWQgaW4gdGhlIEFNRAotMjlLIEZhbWlseSBNYWNybyBBc3NlbWJsZXIgU3BlY2lmaWNhdGlvbi4gIE5vcm1hbCBAY29kZXtAdmFsdWV7QVN9fQotbWFjcm9zIHNob3VsZCBzdGlsbCB3b3JrLgotCi1Abm9kZSBBTUQyOUstQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHs7fSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBpZGVudGlmaWVycywgQU1EIDI5SwotQGNpbmRleCBBTUQgMjlLIGlkZW50aWZpZXJzCi1UaGUgY2hhcmFjdGVyIEBzYW1wez99IGlzIHBlcm1pdHRlZCBpbiBpZGVudGlmaWVycyAoYnV0IG1heSBub3QgYmVnaW4KLWFuIGlkZW50aWZpZXIpLgotCi1Abm9kZSBBTUQyOUstUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBBTUQgMjlLIHJlZ2lzdGVyIG5hbWVzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBBTUQgMjlLCi1HZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSBwcmVkZWZpbmVkIHN5bWJvbHMgb2YgdGhlCi1mb3JtIEBzYW1we0dSQHZhcntubm59fSAoZm9yIGdsb2JhbCByZWdpc3RlcnMpIG9yIEBzYW1we0xSQHZhcntubm59fQotKGZvciBsb2NhbCByZWdpc3RlcnMpLCB3aGVyZSBAdmFye25ubn0gcmVwcmVzZW50cyBhIG51bWJlciBiZXR3ZWVuCi1AY29kZXswfSBhbmQgQGNvZGV7MTI3fSwgd3JpdHRlbiB3aXRoIG5vIGxlYWRpbmcgemVyb3MuICBUaGUgbGVhZGluZwotbGV0dGVycyBtYXkgYmUgaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2U7IGZvciBleGFtcGxlLCBAc2FtcHtncjEzfQotYW5kIEBzYW1we0xSN30gYXJlIGJvdGggdmFsaWQgcmVnaXN0ZXIgbmFtZXMuCi0KLVlvdSBtYXkgYWxzbyByZWZlciB0byBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzIGJ5IHNwZWNpZnlpbmcgdGhlCi1yZWdpc3RlciBudW1iZXIgYXMgdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIChwcmVmaXhlZCB3aXRoIEBzYW1weyUlfQotdG8gZmxhZyB0aGUgZXhwcmVzc2lvbiBhcyBhIHJlZ2lzdGVyIG51bWJlcik6Ci1Ac21hbGxleGFtcGxlCi0lJUB2YXJ7ZXhwcmVzc2lvbn0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLS0tLXdoZXJlIEB2YXJ7ZXhwcmVzc2lvbn0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIGV2YWx1YXRpbmcgdG8gYQotbnVtYmVyIGJldHdlZW4gQGNvZGV7MH0gYW5kIEBjb2RlezI1NX0uICBUaGUgcmFuZ2UgWzAsIDEyN10gcmVmZXJzIHRvCi1nbG9iYWwgcmVnaXN0ZXJzLCBhbmQgdGhlIHJhbmdlIFsxMjgsIDI1NV0gdG8gbG9jYWwgcmVnaXN0ZXJzLgotCi1AY2luZGV4IHNwZWNpYWwgcHVycG9zZSByZWdpc3RlcnMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzCi1AY2luZGV4IHByb3RlY3RlZCByZWdpc3RlcnMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBwcm90ZWN0ZWQgcmVnaXN0ZXJzCi1JbiBhZGRpdGlvbiwgQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBwcm90ZWN0ZWQKLXNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyBmb3IgdGhlIEFNRCAyOUsgZmFtaWx5OgotCi1Ac21hbGxleGFtcGxlCi0gIHZhYiAgICBjaGQgICAgcGMwCi0gIG9wcyAgICBjaGMgICAgcGMxCi0gIGNwcyAgICByYnAgICAgcGMyCi0gIGNmZyAgICB0bWMgICAgbW11Ci0gIGNoYSAgICB0bXIgICAgbHJ1Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGVzZSB1bnByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgYXJlIGFsc28gcmVjb2duaXplZDoKLUBzbWFsbGV4YW1wbGUKLSAgaXBjICAgIGFsdSAgICBmcGUKLSAgaXBhICAgIGJwICAgICBpbnRlCi0gIGlwYiAgICBmYyAgICAgZnBzCi0gIHEgICAgICBjciAgICAgZXhvcAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgQU1EMjlLIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBBTUQgMjlLIChAc2N7aWVlZX0pCi1AY2luZGV4IEFNRCAyOUsgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBBTUQgMjlLIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBBTUQyOUsgRGlyZWN0aXZlcwotQHNlY3Rpb24gQU1EIDI5SyBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBtYWNoaW5lIGRpcmVjdGl2ZXMKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtibG9ja30gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAuYmxvY2sgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH0KLVRoaXMgZGlyZWN0aXZlIGVtaXRzIEB2YXJ7c2l6ZX0gYnl0ZXMsIGVhY2ggb2YgdmFsdWUgQHZhcntmaWxsfS4gIEJvdGgKLUB2YXJ7c2l6ZX0gYW5kIEB2YXJ7ZmlsbH0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgSWYgdGhlIGNvbW1hCi1hbmQgQHZhcntmaWxsfSBhcmUgb21pdHRlZCwgQHZhcntmaWxsfSBpcyBhc3N1bWVkIHRvIGJlIHplcm8uCi0KLUluIG90aGVyIHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIsIHRoaXMgZGlyZWN0aXZlIGlzIGNhbGxlZAotQHNhbXB7LnNwYWNlfS4KLUBlbmQgdGFibGUKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2NwdXR5cGV9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmNwdXR5cGUKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQGNpbmRleCBAY29kZXtmaWxlfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5maWxlCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1BTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBpbiBvdGhlciB2ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyLCBAY29kZXsuZmlsZX0gaXMKLXVzZWQgZm9yIHRoZSBkaXJlY3RpdmUgY2FsbGVkIEBjb2Rley5hcHAtZmlsZX0gaW4gdGhlIEFNRCAyOUsgc3VwcG9ydC4KLUBlbmQgcXVvdGF0aW9uCi0KLUBjaW5kZXggQGNvZGV7bGluZX0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAubGluZQotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AaWdub3JlCi1AYyBzaW5jZSB3ZSdyZSBpZ25vcmluZyAubHN5bS4uLgotQGNpbmRleCBAY29kZXtyZWd9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLnJlZyBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn0KLUBjb2Rley5yZWd9IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQGNvZGV7LmxzeW19OyBAcHhyZWZ7THN5bSwsQGNvZGV7LmxzeW19fS4KLUBlbmQgaWdub3JlCi0KLUBjaW5kZXggQGNvZGV7c2VjdH0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAuc2VjdAotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AY2luZGV4IEBjb2Rle3VzZX0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAudXNlIEB2YXJ7c2VjdGlvbiBuYW1lfQotRXN0YWJsaXNoZXMgdGhlIHNlY3Rpb24gYW5kIHN1YnNlY3Rpb24gZm9yIHRoZSBmb2xsb3dpbmcgY29kZTsKLUB2YXJ7c2VjdGlvbiBuYW1lfSBtYXkgYmUgb25lIG9mIEBjb2Rley50ZXh0fSwgQGNvZGV7LmRhdGF9LAotQGNvZGV7LmRhdGExfSwgb3IgQGNvZGV7LmxpdH0uICBXaXRoIG9uZSBvZiB0aGUgZmlyc3QgdGhyZWUgQHZhcntzZWN0aW9uCi1uYW1lfSBvcHRpb25zLCBAc2FtcHsudXNlfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBtYWNoaW5lIGRpcmVjdGl2ZQotQHZhcntzZWN0aW9uIG5hbWV9OyB0aGUgcmVtYWluaW5nIGNhc2UsIEBzYW1wey51c2UgLmxpdH0sIGlzIHRoZSBzYW1lIGFzCi1Ac2FtcHsuZGF0YSAyMDB9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBBTUQyOUsgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IEFNRCAyOUsgb3Bjb2RlcwotQGNpbmRleCBvcGNvZGVzIGZvciBBTUQgMjlLCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgQU1EIDI5SyBvcGNvZGVzLiAgTm8KLWFkZGl0aW9uYWwgcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LgotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIDI5SyBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle0FtMjkwMDAKLVVzZXIncyBNYW51YWx9LCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1hcm0udGV4aSBiL2dhcy9kb2MvYy1hcm0udGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0YzJiMy4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtYXJtLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi0KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgQVJNLURlcGVuZGVudAotQGNoYXB0ZXIgQVJNIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotCi1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgQVJNIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggQVJNIHN1cHBvcnQKLUBjaW5kZXggVGh1bWIgc3VwcG9ydAotQG1lbnUKLSogQVJNIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBBUk0gU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogQVJNIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogQVJNIERpcmVjdGl2ZXM6OiAgICAgICAgICAgQVJNIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBBUk0gT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQVJNIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLUBjaW5kZXggQVJNIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMgZm9yIEFSTSAobm9uZSkKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXstbWFybX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWFybSBbQHZhcnsyfXxAdmFyezI1MH18QHZhcnszfXxAdmFyezZ9fEB2YXJ7NjB9fEB2YXJ7NjAwfXxAdmFyezYxMH18QHZhcns2MjB9fEB2YXJ7N318QHZhcns3bX18QHZhcns3ZH18QHZhcns3ZG19fEB2YXJ7N2RpfXxAdmFyezdkbWl9fEB2YXJ7NzB9fEB2YXJ7NzAwfXxAdmFyezcwMGl9fEB2YXJ7NzEwfXxAdmFyezcxMGN9fEB2YXJ7NzEwMH18QHZhcns3NTAwfXxAdmFyezc1MDBmZX18QHZhcns3dGRtaX18QHZhcns4fXxAdmFyezgxMH18QHZhcns5fXxAdmFyezl0ZG1pfXxAdmFyezkyMH18QHZhcntzdHJvbmdhcm19fEB2YXJ7c3Ryb25nYXJtMTEwfXxAdmFye3N0cm9uZ2FybTExMDB9XQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSB0YXJnZXQgcHJvY2Vzc29yLiAgVGhlIGFzc2VtYmxlciB3aWxsIGlzc3VlIGFuCi1lcnJvciBtZXNzYWdlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhc3NlbWJsZSBhbiBpbnN0cnVjdGlvbiB3aGljaAotd2lsbCBub3QgZXhlY3V0ZSBvbiB0aGUgdGFyZ2V0IHByb2Nlc3Nvci4KLUBjaW5kZXggQGNvZGV7LW1hcm12fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYXJtdiBbQHZhcnsyfXxAdmFyezJhfXxAdmFyezN9fEB2YXJ7M219fEB2YXJ7NH18QHZhcns0dH18QHZhcns1fXxAdmFyezV0fV0KLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIFRoZSBhc3NlbWJsZXIgd2lsbCBpc3N1ZQotYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2gKLXdpbGwgbm90IGV4ZWN1dGUgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCi1AY2luZGV4IEBjb2Rley1tdGh1bWJ9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW10aHVtYgotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgb25seSBUaHVtYiBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGFzc2VtYmxlZC4KLUBjaW5kZXggQGNvZGV7LW1hbGx9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hbGwKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IGFueSBBcm0gb3IgVGh1bWIgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGFzc2VtYmxlZC4KLUBjaW5kZXggQGNvZGV7LW1mcGF9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1mcGEgW0B2YXJ7MTB9fEB2YXJ7MTF9XQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmUgaW4gdXNlIG9uIHRoZQotdGFyZ2V0IHByb2Nlc3Nvci4gCi1AY2luZGV4IEBjb2Rley1tZnBlLW9sZH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWZwZS1vbGQKLURvIG5vdCBhbGxvdyB0aGUgYXNzZW1ibGUgb2YgZmxvYXRpbmcgcG9pbnQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLgotQGNpbmRleCBAY29kZXstbW5vLWZwdX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbW5vLWZwdQotRG8gbm90IGFsbG93IHRoZSBhc3NlbWJseSBvZiBhbnkgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLgotQGNpbmRleCBAY29kZXstbXRodW1iLWludGVyd29ya30gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbXRodW1iLWludGVyd29yawotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZy4KLUBjaW5kZXggQGNvZGV7LW1hcGNzfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYXBjcyBbQHZhcnsyNn18QHZhcnszMn1dCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAotYmUgbWFya2VkIGFzIHN1cHBvcnRpbmcgdGhlIGluZGljYXRlZCB2ZXJzaW9uIG9mIHRoZSBBcm0gUHJvY2VkdXJlLgotQ2FsbGluZyBTdGFuZGFyZC4KLUBpdGVtIC1tYXBjcy1mbG9hdAotVGhpcyBpbmRpY2F0ZXMgdGhlIHRoZSBmbG9hdGluZyBwb2ludCB2YXJpYW50IG9mIHRoZSBBUENTIHNob3VsZCBiZQotdXNlZC4gIEluIHRoaXMgdmFyaWFudCBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBGUAotcmVnaXN0ZXJzIHJhdGVociB0aGFuIGludGVnZXIgcmVnaXN0ZXJzLgotQGl0ZW0gLW1hcGNzLXJlZW50cmFudAotVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVlbnRyYW50IHZhcmlhbnQgb2YgdGhlIEFQQ1Mgc2hvdWxkIGJlIHVzZWQuCi1UaGlzIHZhcmlhbnQgc3VwcG9ydHMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4KLUBjaW5kZXggQGNvZGV7LUVCfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1FQgotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBiZWluZyBlbmNvZGVkIGZvciBhIGJpZy1lbmRpYW4gcHJvY2Vzc29yLgotQGNpbmRleCBAY29kZXstRUx9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLUVMCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAotYmUgbWFya2VkIGFzIGJlaW5nIGVuY29kZWQgZm9yIGEgbGl0dGxlLWVuZGlhbiBwcm9jZXNzb3IuCi1AY2luZGV4IEBjb2Rley1rfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBjaW5kZXggUElDIGNvZGUgZ2VuZXJhdGlvbiBmb3IgQVJNCi1AaXRlbSAtawotVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiBQSUMgKHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUpLgotQGl0ZW0gLW1vYWJpCi1UaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb2RlIHNob3VsZCBiZSBhc3NlbWJsZWQgdXNpbmcgdGhlIG9sZCBBUk0gRUxGCi1jb252ZW50aW9ucywgYmFzZWQgb24gYSBiZXRhIHJlbGVhc2UgcmVsZWFzZSBvZiB0aGUgQVJNLUVMRgotc3BlY2lmaWNhdGlvbnMsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGNvbnZlbnRpb25zIHdoaWNoIGFyZSBiYXNlZCBvbgotdGhlIGZpbmFsIHJlbGVhc2Ugb2YgdGhlIEFSTS1FTEYgc3BlY2lmaWNhdGlvbnMuCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgQVJNIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBBUk0tQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogQVJNLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBUk0tQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEFSTQotQGNpbmRleCBBUk0gbGluZSBjb21tZW50IGNoYXJhY3RlcgotVGhlIHByZXNlbmNlIG9mIGEgQHNhbXB7I30gYW5kIEBzYW1we0BAfSBvbiBhIGxpbmUgaW5kaWNhdGVzIHRoZSBzdGFydCBvZgotYSBjb21tZW50IHRoYXQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUuCi0KLUBjaW5kZXggaWRlbnRpZmllcnMsIEFSTQotQGNpbmRleCBBUk0gaWRlbnRpZmllcnMKLSpUT0RPKiBFeHBsYWluIGFib3V0IC9kYXRhIG1vZGlmaWVyIG9uIHN5bWJvbHMuCi0KLUBub2RlIEFSTS1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IEFSTSByZWdpc3RlciBuYW1lcwotQGNpbmRleCByZWdpc3RlciBuYW1lcywgQVJNCi0qVE9ETyogRXhwbGFpbiBhYm91dCBBUk0gcmVnaXN0ZXIgbmFtaW5nLCBhbmQgdGhlIHByZWRlZmluZWQgbmFtZXMuCi0KLUBub2RlIEFSTSBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgQVJNIChAc2N7aWVlZX0pCi1AY2luZGV4IEFSTSBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEFSTSBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotCi0KLUBub2RlIEFSTSBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBBUk0gTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBUk0KLUBjaW5kZXggQVJNIG1hY2hpbmUgZGlyZWN0aXZlcwotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQGNvZGV7cmVxfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gQHZhcntuYW1lfSAucmVxIEB2YXJ7cmVnaXN0ZXIgbmFtZX0KLVRoaXMgY3JlYXRlcyBhbiBhbGlhcyBmb3IgQHZhcntyZWdpc3RlciBuYW1lfSBjYWxsZWQgQHZhcntuYW1lfS4gIEZvcgotZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBmb28gLnJlcSByMAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBAY29kZXtjb2RlfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLmNvZGUgW0B2YXJ7MTZ9fEB2YXJ7MzJ9XQotVGhpcyBkaXJlY3RpdmUgc2VsZWN0cyB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGJlaW5nIGdlbmVyYXRlZC4gVGhlIHZhbHVlIDE2Ci1zZWxlY3RzIFRodW1iLCB3aXRoIHRoZSB2YWx1ZSAzMiBzZWxlY3RpbmcgQVJNLgotCi1AY2luZGV4IEBjb2Rle3RodW1ifSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLnRodW1iCi1UaGlzIHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBAdmFyey5jb2RlIDE2fS4KLQotQGNpbmRleCBAY29kZXthcm19IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAuYXJtCi1UaGlzIHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBAdmFyey5jb2RlIDMyfS4KLQotQGNpbmRleCBAY29kZXtmb3JjZV90aHVtYn0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5mb3JjZV90aHVtYgotVGhpcyBkaXJlY3RpdmUgZm9yY2VzIHRoZSBzZWxlY3Rpb24gb2YgVGh1bWIgaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIHRoZQotdGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRob3NlIGluc3RydWN0aW9ucwotCi1AY2luZGV4IEBjb2Rle3RodW1iX2Z1bmN9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAudGh1bWJfZnVuYwotVGhpcyBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoYXQgdGhlIGZvbGxvd2luZyBzeW1ib2wgaXMgdGhlIG5hbWUgb2YgYQotVGh1bWIgZW5jb2RlZCBmdW5jdGlvbi4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGFsbG93Ci10aGUgYXNzZW1ibGVyIGFuZCBsaW5rZXIgdG8gZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvciBpbnRlcndvcmtpbmcKLWJldHdlZW4gQXJtIGFuZCBUaHVtYiBpbnN0cnVjdGlvbnMgYW5kIHNob3VsZCBiZSB1c2VkIGV2ZW4gaWYKLWludGVyd29ya2luZyBpcyBub3QgZ29pbmcgdG8gYmUgcGVyZm9ybWVkLgotCi1AY2luZGV4IEBjb2Rle3RodW1iX3NldH0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC50aHVtYl9zZXQKLVRoaXMgcGVyZm9ybXMgdGhlIGVxdWl2YWxlbnQgb2YgYSBAY29kZXsuc2V0fSBkaXJlY3RpdmUgaW4gdGhhdCBpdAotY3JlYXRlcyBhIHN5bWJvbCB3aGljaCBpcyBhbiBhbGlhcyBmb3IgYW5vdGhlciBzeW1ib2wgKHBvc3NpYmx5IG5vdCB5ZXQKLWRlZmluZWQpLiAgVGhpcyBkaXJlY3RpdmUgYWxzbyBoYXMgdGhlIGFkZGVkIHByb3BlcnR5IGluIHRoYXQgaXQgbWFya3MKLXRoZSBhbGlhc2VkIHN5bWJvbCBhcyBiZWluZyBhIHRodW1iIGZ1bmN0aW9uIGVudHJ5IHBvaW50LCBpbiB0aGUgc2FtZQotd2F5IHRoYXQgdGhlIEBjb2Rley50aHVtYl9mdW5jfSBkaXJlY3RpdmUgZG9lcy4KLQotQGNpbmRleCBAY29kZXsubHRvcmd9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAubHRvcmcKLVRoaXMgZGlyZWN0aXZlIGNhdXNlcyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgbGl0ZXJhbCBwb29sIHRvIGJlCi1kdW1wZWQgaW50byB0aGUgY3VycmVudCBzZWN0aW9uICh3aGljaCBpcyBhc3N1bWVkIHRvIGJlIHRoZSAudGV4dAotc2VjdGlvbikgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gKGFsaWduZWQgdG8gYSB3b3JkIGJvdW5kYXJ5KS4KLQotQGNpbmRleCBAY29kZXsucG9vbH0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5wb29sCi1UaGlzIGlzIGEgc3lub255bSBmb3IgLmx0b3JnLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIEFSTSBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggQVJNIG9wY29kZXMKLUBjaW5kZXggb3Bjb2RlcyBmb3IgQVJNCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgQVJNIG9wY29kZXMuICBJdCBhbHNvCi1pbXBsZW1lbnRzIHNldmVyYWwgcHNldWRvIG9wY29kZXMsIGluY2x1ZGluZyBzZXZlcmFsIHN5bnRoZXRpYyBsb2FkCi1pbnN0cnVjdGlvbnMuIAotCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBAY29kZXtOT1B9IHBzZXVkbyBvcCwgQVJNCi1AaXRlbSBOT1AKLUBzbWFsbGV4YW1wbGUKLSAgbm9wCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHBzZXVkbyBvcCB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byBhIGxlZ2FsIEFSTSBpbnN0cnVjdGlvbiB0aGF0IGRvZXMKLW5vdGhpbmcuICBDdXJyZW50bHkgaXQgd2lsbCBldmFsdWF0ZSB0byBNT1YgcjAsIHIwLgotCi1AY2luZGV4IEBjb2Rle0xEUiByZWcsPTxsYWJlbD59IHBzZXVkbyBvcCwgQVJNCi1AaXRlbSBMRFIgCi1Ac21hbGxleGFtcGxlCi0gIGxkciA8cmVnaXN0ZXI+ICwgPSA8ZXhwcmVzc2lvbj4KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgbnVtZXJpYyBjb25zdGFudCB0aGVuIGEgTU9WIG9yIE1WTgotaW5zdHJ1Y3Rpb24gd2lsbCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBMRFIgaW5zdHJ1Y3Rpb24sIGlmIHRoZQotY29uc3RhbnQgY2FuIGJlIGdlbmVyYXRlZCBieSBlaXRoZXIgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zLiAgT3RoZXJ3aXNlCi10aGUgY29uc3RhbnQgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgbmVhcmVzdCBsaXRlcmFsIHBvb2wgKGlmIGl0IG5vdAotYWxyZWFkeSB0aGVyZSkgYW5kIGEgUEMgcmVsYXRpdmUgTERSIGluc3RydWN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkLgotCi1AY2luZGV4IEBjb2Rle0FEUiByZWcsPGxhYmVsPn0gcHNldWRvIG9wLCBBUk0KLUBpdGVtIEFEUgotQHNtYWxsZXhhbXBsZQotICBhZHIgPHJlZ2lzdGVyPiA8bGFiZWw+Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIGluc3RydWN0aW9uIHdpbGwgbG9hZCB0aGUgYWRkcmVzcyBvZiBAdmFye2xhYmVsfSBpbnRvIHRoZSBpbmRpY2F0ZWQKLXJlZ2lzdGVyLiAgVGhlIGluc3RydWN0aW9uIHdpbGwgZXZhbHVhdGUgdG8gYSBQQyByZWxhdGl2ZSBBREQgb3IgU1VCCi1pbnN0cnVjdGlvbiBkZXBlbmRpbmcgdXBvbiB3aGVyZSB0aGUgbGFiZWwgaXMgbG9jYXRlZC4gIElmIHRoZSBsYWJlbCBpcwotb3V0IG9mIHJhbmdlLCBvciBpZiBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc2FtZSBmaWxlIChhbmQgc2VjdGlvbikgYXMKLXRoZSBBRFIgaW5zdHJ1Y3Rpb24sIHRoZW4gYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuICBUaGlzIGluc3RydWN0aW9uCi13aWxsIG5vdCBtYWtlIHVzZSBvZiB0aGUgbGl0ZXJhbCBwb29sLgotCi1AY2luZGV4IEBjb2Rle0FEUkwgcmVnLDxsYWJlbD59IHBzZXVkbyBvcCwgQVJNCi1AaXRlbSBBRFJMIAotQHNtYWxsZXhhbXBsZQotICBhZHJsIDxyZWdpc3Rlcj4gPGxhYmVsPgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyBpbnN0cnVjdGlvbiB3aWxsIGxvYWQgdGhlIGFkZHJlc3Mgb2YgQHZhcntsYWJlbH0gaW50byB0aGUgaW5kaWNhdGVkCi1yZWdpc3Rlci4gIFRoZSBpbnN0cnVjdGlvbiB3aWxsIGV2YWx1YXRlIHRvIG9uZSBvciB0d28gYSBQQyByZWxhdGl2ZSBBREQKLW9yIFNVQiBpbnN0cnVjdGlvbnMgZGVwZW5kaW5nIHVwb24gd2hlcmUgdGhlIGxhYmVsIGlzIGxvY2F0ZWQuICBJZiBhCi1zZWNvbmQgaW5zdHJ1Y3Rpb24gaXMgbm90IG5lZWRlZCBhIE5PUCBpbnN0cnVjdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCBpbgotaXRzIHBsYWNlLCBzbyB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYWx3YXlzIDggYnl0ZXMgbG9uZy4KLQotSWYgdGhlIGxhYmVsIGlzIG91dCBvZiByYW5nZSwgb3IgaWYgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZQotKGFuZCBzZWN0aW9uKSBhcyB0aGUgQURSTCBpbnN0cnVjdGlvbiwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZC4KLVRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCBub3QgbWFrZSB1c2Ugb2YgdGhlIGxpdGVyYWwgcG9vbC4KLQotQGVuZCB0YWJsZQotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIEFSTSBvciBUaHVtYiBpbnN0cnVjdGlvbiBzZXRzLCBzZWUgQGNpdGV7QVJNCi1Tb2Z0d2FyZSBEZXZlbG9wbWVudCBUb29sa2l0IFJlZmVyZW5jZSBNYW51YWx9LCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzCi1MdGQuCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1kMTB2LnRleGkgYi9nYXMvZG9jL2MtZDEwdi50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDdiZjg4Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1kMTB2LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEQxMFYtRGVwZW5kZW50Ci1AY2hhcHRlciBEMTBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEQxMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBEMTBWIHN1cHBvcnQKLUBtZW51Ci0qIEQxMFYtT3B0czo6ICAgICAgICAgICAgICAgICAgIEQxMFYgT3B0aW9ucwotKiBEMTBWLVN5bnRheDo6ICAgICAgICAgICAgICAgICBTeW50YXgKLSogRDEwVi1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogRDEwVi1PcGNvZGVzOjogICAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEQxMFYtT3B0cwotQHNlY3Rpb24gRDEwViBPcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIEQxMFYKLUBjaW5kZXggRDEwViBvcHRpb25zCi1UaGUgTWl0c3ViaXNoaSBEMTBWIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGEgZmV3IG1hY2hpbmUKLWRlcGVuZGVudCBvcHRpb25zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC1PCi1UaGUgRDEwViBjYW4gb2Z0ZW4gZXhlY3V0ZSB0d28gc3ViLWluc3RydWN0aW9ucyBpbiBwYXJhbGxlbC4gV2hlbiB0aGlzIG9wdGlvbgotaXMgdXNlZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhdHRlbXB0IHRvIG9wdGltaXplIGl0cyBvdXRwdXQgYnkgZGV0ZWN0aW5nIHdoZW4KLWluc3RydWN0aW9ucyBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuCi1AaXRlbSAtLW5vd2FybnN3YXAKLVRvIG9wdGltaXplIGV4ZWN1dGlvbiBwZXJmb3JtYW5jZSwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBzb21ldGltZXMgc3dhcCB0aGUKLW9yZGVyIG9mIGluc3RydWN0aW9ucy4gTm9ybWFsbHkgdGhpcyBnZW5lcmF0ZXMgYSB3YXJuaW5nLiBXaGVuIHRoaXMgb3B0aW9uIAotaXMgdXNlZCwgbm8gd2FybmluZyB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGluc3RydWN0aW9ucyBhcmUgc3dhcHBlZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgRDEwVi1TeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQGNpbmRleCBEMTBWIHN5bnRheAotQGNpbmRleCBzeW50YXgsIEQxMFYKLQotVGhlIEQxMFYgc3ludGF4IGlzIGJhc2VkIG9uIHRoZSBzeW50YXggaW4gTWl0c3ViaXNoaSdzIEQxMFYgYXJjaGl0ZWN0dXJlIG1hbnVhbC4KLVRoZSBkaWZmZXJlbmNlcyBhcmUgZGV0YWlsZWQgYmVsb3cuCi0KLUBtZW51Ci0qIEQxMFYtU2l6ZTo6ICAgICAgICAgICAgICAgICBTaXplIE1vZGlmaWVycwotKiBEMTBWLVN1YnM6OiAgICAgICAgICAgICAgICAgU3ViLUluc3RydWN0aW9ucwotKiBEMTBWLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEQxMFYtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBEMTBWLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotKiBEMTBWLVdvcmQ6OiAgICAgICAgICAgICAgICAgQEBXT1JEIE1vZGlmaWVyCi1AZW5kIG1lbnUKLQotCi1Abm9kZSBEMTBWLVNpemUKLUBzdWJzZWN0aW9uIFNpemUgTW9kaWZpZXJzCi1AY2luZGV4IEQxMFYgc2l6ZSBtb2RpZmllcnMKLUBjaW5kZXggc2l6ZSBtb2RpZmllcnMsIEQxMFYKLVRoZSBEMTBWIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaW4gdGhlIEQxMFYKLUFyY2hpdGVjdHVyZSBNYW51YWwuICBIb3dldmVyLCB0aGUgbmFtZXMgaW4gdGhlIG1hbnVhbCBhcmUgc29tZXRpbWVzIGFtYmlndW91cy4KLVRoZXJlIGFyZSBpbnN0cnVjdGlvbiBuYW1lcyB0aGF0IGNhbiBhc3NlbWJsZSB0byBhIHNob3J0IG9yIGxvbmcgZm9ybSBvcGNvZGUuCi1Ib3cgZG9lcyB0aGUgYXNzZW1ibGVyIHBpY2sgdGhlIGNvcnJlY3QgZm9ybT8gIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYWx3YXlzIHBpY2sgdGhlCi1zbWFsbGVzdCBmb3JtIGlmIGl0IGNhbi4gIFdoZW4gZGVhbGluZyB3aXRoIGEgc3ltYm9sIHRoYXQgaXMgbm90IGRlZmluZWQgeWV0IHdoZW4gYQotbGluZSBpcyBiZWluZyBhc3NlbWJsZWQsIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgbG9uZyBmb3JtLiAgSWYgeW91IG5lZWQgdG8gZm9yY2UgdGhlIAotYXNzZW1ibGVyIHRvIHVzZSBlaXRoZXIgdGhlIHNob3J0IG9yIGxvbmcgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHlvdSBjYW4gYXBwZW5kCi1laXRoZXIgQHNhbXB7LnN9IChzaG9ydCkgb3IgQHNhbXB7Lmx9IChsb25nKSB0byBpdC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHdyaXRpbmcgCi1hbiBhc3NlbWJseSBwcm9ncmFtIGFuZCB5b3Ugd2FudCB0byBkbyBhIGJyYW5jaCB0byBhIHN5bWJvbCB0aGF0IGlzIGRlZmluZWQgbGF0ZXIKLWluIHlvdXIgcHJvZ3JhbSwgeW91IGNhbiB3cml0ZSBAc2FtcHticmEucyAgIGZvb30uICAKLU9iamR1bXAgYW5kIEdEQiB3aWxsIGFsd2F5cyBhcHBlbmQgQHNhbXB7LnN9IG9yIEBzYW1wey5sfSB0byBpbnN0cnVjdGlvbnMgd2hpY2gKLWhhdmUgYm90aCBzaG9ydCBhbmQgbG9uZyBmb3Jtcy4KLQotQG5vZGUgRDEwVi1TdWJzCi1Ac3Vic2VjdGlvbiBTdWItSW5zdHJ1Y3Rpb25zCi1AY2luZGV4IEQxMFYgc3ViLWluc3RydWN0aW9ucwotQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb25zLCBEMTBWCi1UaGUgRDEwViBhc3NlbWJsZXIgdGFrZXMgYXMgaW5wdXQgYSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zLCBlaXRoZXIgb25lLXBlci1saW5lLAotb3IgaW4gdGhlIHNwZWNpYWwgdHdvLXBlci1saW5lIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIFNvbWUgb2YgdGhlc2UKLWluc3RydWN0aW9ucyB3aWxsIGJlIHNob3J0LWZvcm0gb3Igc3ViLWluc3RydWN0aW9ucy4gIFRoZXNlIHN1Yi1pbnN0cnVjdGlvbnMgY2FuIGJlIHBhY2tlZAotaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFRoZSBhc3NlbWJsZXIgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuICBJdCB3aWxsIGFsc28gZGV0ZWN0Ci13aGVuIGl0IHNob3VsZCBub3QgcGFjayBpbnN0cnVjdGlvbnMuICBGb3IgZXhhbXBsZSwgd2hlbiBhIGxhYmVsIGlzIGRlZmluZWQsIHRoZSBuZXh0Ci1pbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIHBhY2thZ2VkIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gIFdoZW5ldmVyIGEgYnJhbmNoIGFuZCBsaW5rCi1pbnN0cnVjdGlvbiBpcyBjYWxsZWQsIGl0IHdpbGwgbm90IGJlIHBhY2thZ2VkIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24gc28gdGhlIHJldHVybgotYWRkcmVzcyB3aWxsIGJlIHZhbGlkLiAgTm9wcyBhcmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCB3aGVuIG5lY2Vzc2FyeS4KLQotSWYgeW91IGRvIG5vdCB3YW50IHRoZSBhc3NlbWJsZXIgYXV0b21hdGljYWxseSBtYWtpbmcgdGhlc2UgZGVjaXNpb25zLCB5b3UgY2FuIGNvbnRyb2wKLXRoZSBwYWNrYWdpbmcgYW5kIGV4ZWN1dGlvbiB0eXBlIChwYXJhbGxlbCBvciBzZXF1ZW50aWFsKSB3aXRoIHRoZSBzcGVjaWFsIGV4ZWN1dGlvbiAKLXN5bWJvbHMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICAKLQotQG5vZGUgRDEwVi1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEQxMFYKLUBjaW5kZXggRDEwViBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHs7fSBhbmQgQHNhbXB7I30gYXJlIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVycy4KLUBjaW5kZXggc3ViLWluc3RydWN0aW9uIG9yZGVyaW5nLCBEMTBWCi1AY2luZGV4IEQxMFYgc3ViLWluc3RydWN0aW9uIG9yZGVyaW5nCi1TdWItaW5zdHJ1Y3Rpb25zIG1heSBiZSBleGVjdXRlZCBpbiBvcmRlciwgaW4gcmV2ZXJzZS1vcmRlciwgb3IgaW4gcGFyYWxsZWwuCi1JbnN0cnVjdGlvbnMgbGlzdGVkIGluIHRoZSBzdGFuZGFyZCBvbmUtcGVyLWxpbmUgZm9ybWF0IHdpbGwgYmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5LgotVG8gc3BlY2lmeSB0aGUgZXhlY3V0aW5nIG9yZGVyLCB1c2UgdGhlIGZvbGxvd2luZyBzeW1ib2xzOiAKLUB0YWJsZSBAc2FtcAotQGl0ZW0gLT4KLVNlcXVlbnRpYWwgd2l0aCBpbnN0cnVjdGlvbiBvbiB0aGUgbGVmdCBmaXJzdC4KLUBpdGVtIDwtCi1TZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGZpcnN0LgotQGl0ZW0gfHwKLVBhcmFsbGVsCi1AZW5kIHRhYmxlCi1UaGUgRDEwViBzeW50YXggYWxsb3dzIGVpdGhlciBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUsIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSB3aXRoCi10aGUgZXhlY3V0aW9uIHN5bWJvbCwgb3IgdHdvIGluc3RydWN0aW9ucyBwZXIgbGluZS4gIEZvciBleGFtcGxlCi1AdGFibGUgQGNvZGUKLUBpdGVtIGFicyAgICAgICBhMSAgICAgIC0+ICAgICAgYWJzICAgICByMAotRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAotY29udGFpbmVyIGFuZCBpcyBleGVjdXRlZCBzZWNvbmQuCi1AaXRlbSBhYnMgICAgICAgcjAgICAgICA8LSAgICAgIGFicyAgICAgYTEKLUV4ZWN1dGUgdGhlc2UgcmV2ZXJzZS1zZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAotY29udGFpbmVyLCBhbmQgaXMgZXhlY3V0ZWQgZmlyc3QuCi1AaXRlbSBsZDJ3ICAgIHIyLEBAcjgrICAgICAgICAgfHwgICAgICBtYWMgICAgIGEwLHIwLHI3Ci1FeGVjdXRlIHRoZXNlIGluIHBhcmFsbGVsLgotQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIHx8ICAgICAgCi1AaXRlbXggbWFjICAgICBhMCxyMCxyNwotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIGluIHBhcmFsbGVsLgotQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIAotQGl0ZW14IG1hYyAgICAgYTAscjAscjcKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBBc3NlbWJsZXIgd2lsbAotcHV0IHRoZW0gaW4gdGhlIHByb3BlciBjb250YWluZXJzLgotQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIC0+Ci1AaXRlbXggbWFjICAgICBhMCxyMCxyNwotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseS4gIFNhbWUgYXMgYWJvdmUgYnV0Ci1zZWNvbmQgaW5zdHJ1Y3Rpb24gd2lsbCBhbHdheXMgZ28gaW50byByaWdodCBjb250YWluZXIuICAKLUBlbmQgdGFibGUKLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgotQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgRDEwVi1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotQGNpbmRleCBEMTBWIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIEQxMFYKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9IHRocm91Z2ggQHNhbXB7cjE1fSB0byByZWZlciB0byB0aGUgRDEwViAKLXJlZ2lzdGVycy4gIFlvdSBjYW4gYWxzbyB1c2UgQHNhbXB7c3B9IGFzIGFuIGFsaWFzIGZvciBAc2FtcHtyMTV9LiAgVGhlIGFjY3VtdWxhdG9ycwotYXJlIEBzYW1we2EwfSBhbmQgQHNhbXB7YTF9LiAgVGhlcmUgYXJlIHNwZWNpYWwgcmVnaXN0ZXItcGFpciBuYW1lcyB0aGF0IG1heSAKLW9wdGlvbmFsbHkgYmUgdXNlZCBpbiBvcGNvZGVzIHRoYXQgcmVxdWlyZSBldmVuLW51bWJlcmVkIHJlZ2lzdGVycy4gUmVnaXN0ZXIgbmFtZXMgYXJlIAotbm90IGNhc2Ugc2Vuc2l0aXZlLiAgCi0KLVJlZ2lzdGVyIFBhaXJzCi1AdGFibGUgQGNvZGUKLUBpdGVtIHIwLXIxCi1AaXRlbSByMi1yMwotQGl0ZW0gcjQtcjUKLUBpdGVtIHI2LXI3Ci1AaXRlbSByOC1yOQotQGl0ZW0gcjEwLXIxMQotQGl0ZW0gcjEyLXIxMwotQGl0ZW0gcjE0LXIxNQotQGVuZCB0YWJsZQotCi1UaGUgRDEwViBhbHNvIGhhcyBwcmVkZWZpbmVkIHN5bWJvbHMgZm9yIHRoZXNlIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBzdGF0dXMgYml0czoKLUB0YWJsZSBAY29kZQotQGl0ZW0gcHN3Ci1Qcm9jZXNzb3IgU3RhdHVzIFdvcmQKLUBpdGVtIGJwc3cKLUJhY2t1cCBQcm9jZXNzb3IgU3RhdHVzIFdvcmQKLUBpdGVtIHBjCi1Qcm9ncmFtIENvdW50ZXIKLUBpdGVtIGJwYwotQmFja3VwIFByb2dyYW0gQ291bnRlcgotQGl0ZW0gcnB0X2MKLVJlcGVhdCBDb3VudAotQGl0ZW0gcnB0X3MKLVJlcGVhdCBTdGFydCBhZGRyZXNzCi1AaXRlbSBycHRfZQotUmVwZWF0IEVuZCBhZGRyZXNzCi1AaXRlbSBtb2RfcwotTW9kdWxvIFN0YXJ0IGFkZHJlc3MKLUBpdGVtIG1vZF9lCi1Nb2R1bG8gRW5kIGFkZHJlc3MKLUBpdGVtIGliYQotSW5zdHJ1Y3Rpb24gQnJlYWsgQWRkcmVzcwotQGl0ZW0gZjAKLUZsYWcgMAotQGl0ZW0gZjEKLUZsYWcgMQotQGl0ZW0gYwotQ2FycnkgZmxhZwotQGVuZCB0YWJsZQotICAgICAgICAKLUBub2RlIEQxMFYtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBEMTBWCi1AY2luZGV4IEQxMFYgYWRkcmVzc2luZyBtb2RlcwotQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgRDEwVi4KLUBjb2Rle1JAdmFye259fSBpbiB0aGUgZm9sbG93aW5nIHJlZmVycyB0byBhbnkgb2YgdGhlIG51bWJlcmVkCi1yZWdpc3RlcnMsIGJ1dCBAZW1waHtub3R9IHRoZSBjb250cm9sIHJlZ2lzdGVycy4KLUB0YWJsZSBAY29kZQotQGl0ZW0gUkB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLUBpdGVtIEBAUkB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci1AaXRlbSBAQFJAdmFye259LQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWRlY3JlbWVudAotQGl0ZW0gQEAtU1AKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotQGl0ZW0gQEAoQHZhcntkaXNwfSwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotQGl0ZW0gQHZhcnthZGRyfQotUEMgcmVsYXRpdmUgYWRkcmVzcyAoZm9yIGJyYW5jaCBvciByZXApLiAKLUBpdGVtICNAdmFye2ltbX0KLUltbWVkaWF0ZSBkYXRhICh0aGUgQHNhbXB7I30gaXMgb3B0aW9uYWwgYW5kIGlnbm9yZWQpCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQxMFYtV29yZAotQHN1YnNlY3Rpb24gQEBXT1JEIE1vZGlmaWVyCi1AY2luZGV4IEQxMFYgQEB3b3JkIG1vZGlmaWVyCi1AY2luZGV4IEBAd29yZCBtb2RpZmllciwgRDEwVgotQW55IHN5bWJvbCBmb2xsb3dlZCBieSBAY29kZXtAQHdvcmR9IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHN5bWJvbCdzIHZhbHVlCi1zaGlmdGVkIHJpZ2h0IGJ5IDIuICBUaGlzIGlzIHVzZWQgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGxvYWRpbmcgYSByZWdpc3Rlcgotd2l0aCB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIChvciBhbnkgb3RoZXIgY29kZSBmcmFnbWVudCkuICBGb3IgZXhhbXBsZSwgaWYKLXlvdSB3YW50IHRvIGxvYWQgYSByZWdpc3RlciB3aXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgZnVuY3Rpb24gQGNvZGV7bWFpbn0gdGhlbgotanVtcCB0byB0aGF0IGZ1bmN0aW9uLCB5b3UgY291bGQgZG8gaXQgYXMgZm9sbHdzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1sZGkgICAgIHIyLCBtYWluQEB3b3JkCi1qbXAgICAgIHIyCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBEMTBWLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgRDEwVgotQGNpbmRleCBEMTBWIGZsb2F0aW5nIHBvaW50Ci1UaGUgRDEwViBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fSBhbmQgQGNvZGV7LmRvdWJsZX0KLWRpcmVjdGl2ZXMgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLiAKLQotQG5vZGUgRDEwVi1PcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi1AY2luZGV4IEQxMFYgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIEQxMFYKLUBjaW5kZXggbW5lbW9uaWNzLCBEMTBWCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIEQxMFYKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgRDEwViBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtEMTBWIEFyY2hpdGVjdHVyZTogQSBWTElXIE1pY3JvcHJvY2Vzc29yIGZvciBNdWx0aW1lZGlhIEFwcGxpY2F0aW9uc30gCi0oTWl0c3ViaXNoaSBFbGVjdHJpYyBDb3JwLikuCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgRDEwViBvcGNvZGVzLiAgVGhlIG9ubHkgY2hhbmdlcyBhcmUgdGhvc2UKLWRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiBvbiBzaXplIG1vZGlmaWVycwotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtZDMwdi50ZXhpIGIvZ2FzL2RvYy9jLWQzMHYudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxYjM0NC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtZDMwdi50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBEMzBWLURlcGVuZGVudAotQGNoYXB0ZXIgRDMwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBEMzBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggRDMwViBzdXBwb3J0Ci1AbWVudQotKiBEMzBWLU9wdHM6OiAgICAgICAgICAgICAgICAgICBEMzBWIE9wdGlvbnMKLSogRDMwVi1TeW50YXg6OiAgICAgICAgICAgICAgICAgU3ludGF4Ci0qIEQzMFYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEQzMFYtT3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBEMzBWLU9wdHMKLUBzZWN0aW9uIEQzMFYgT3B0aW9ucwotQGNpbmRleCBvcHRpb25zLCBEMzBWCi1AY2luZGV4IEQzMFYgb3B0aW9ucwotVGhlIE1pdHN1YmlzaGkgRDMwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhIGZldyBtYWNoaW5lCi1kZXBlbmRlbnQgb3B0aW9ucy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAtTwotVGhlIEQzMFYgY2FuIG9mdGVuIGV4ZWN1dGUgdHdvIHN1Yi1pbnN0cnVjdGlvbnMgaW4gcGFyYWxsZWwuIFdoZW4gdGhpcyBvcHRpb24KLWlzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXR0ZW1wdCB0byBvcHRpbWl6ZSBpdHMgb3V0cHV0IGJ5IGRldGVjdGluZyB3aGVuCi1pbnN0cnVjdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgotCi1AaXRlbSAtbgotV2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGlzc3VlIGEgd2FybmluZyBldmVyeQotdGltZSBpdCBhZGRzIGEgbm9wIGluc3RydWN0aW9uLgotCi1AaXRlbSAtTgotV2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGlzc3VlIGEgd2FybmluZyBpZiBpdAotbmVlZHMgdG8gaW5zZXJ0IGEgbm9wIGFmdGVyIGEgMzItYml0IG11bHRpcGx5IGJlZm9yZSBhIGxvYWQgb3IgMTYtYml0Ci1tdWx0aXBseSBpbnN0cnVjdGlvbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgRDMwVi1TeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQGNpbmRleCBEMzBWIHN5bnRheAotQGNpbmRleCBzeW50YXgsIEQzMFYKLQotVGhlIEQzMFYgc3ludGF4IGlzIGJhc2VkIG9uIHRoZSBzeW50YXggaW4gTWl0c3ViaXNoaSdzIEQzMFYgYXJjaGl0ZWN0dXJlIG1hbnVhbC4KLVRoZSBkaWZmZXJlbmNlcyBhcmUgZGV0YWlsZWQgYmVsb3cuCi0KLUBtZW51Ci0qIEQzMFYtU2l6ZTo6ICAgICAgICAgICAgICAgICBTaXplIE1vZGlmaWVycwotKiBEMzBWLVN1YnM6OiAgICAgICAgICAgICAgICAgU3ViLUluc3RydWN0aW9ucwotKiBEMzBWLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEQzMFYtR3VhcmRlZDo6ICAgICAgICAgICAgICBHdWFyZGVkIEV4ZWN1dGlvbgotKiBEMzBWLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogRDMwVi1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi0KLUBub2RlIEQzMFYtU2l6ZQotQHN1YnNlY3Rpb24gU2l6ZSBNb2RpZmllcnMKLUBjaW5kZXggRDMwViBzaXplIG1vZGlmaWVycwotQGNpbmRleCBzaXplIG1vZGlmaWVycywgRDMwVgotVGhlIEQzMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIHRoZSBpbnN0cnVjdGlvbiBuYW1lcyBpbiB0aGUgRDMwVgotQXJjaGl0ZWN0dXJlIE1hbnVhbC4gIEhvd2V2ZXIsIHRoZSBuYW1lcyBpbiB0aGUgbWFudWFsIGFyZSBzb21ldGltZXMgYW1iaWd1b3VzLgotVGhlcmUgYXJlIGluc3RydWN0aW9uIG5hbWVzIHRoYXQgY2FuIGFzc2VtYmxlIHRvIGEgc2hvcnQgb3IgbG9uZyBmb3JtIG9wY29kZS4KLUhvdyBkb2VzIHRoZSBhc3NlbWJsZXIgcGljayB0aGUgY29ycmVjdCBmb3JtPyAgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhbHdheXMgcGljayB0aGUKLXNtYWxsZXN0IGZvcm0gaWYgaXQgY2FuLiAgV2hlbiBkZWFsaW5nIHdpdGggYSBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCB5ZXQgd2hlbiBhCi1saW5lIGlzIGJlaW5nIGFzc2VtYmxlZCwgaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBsb25nIGZvcm0uICBJZiB5b3UgbmVlZCB0byBmb3JjZSB0aGUgCi1hc3NlbWJsZXIgdG8gdXNlIGVpdGhlciB0aGUgc2hvcnQgb3IgbG9uZyBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbiwgeW91IGNhbiBhcHBlbmQKLWVpdGhlciBAc2FtcHsuc30gKHNob3J0KSBvciBAc2FtcHsubH0gKGxvbmcpIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgd3JpdGluZyAKLWFuIGFzc2VtYmx5IHByb2dyYW0gYW5kIHlvdSB3YW50IHRvIGRvIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgZGVmaW5lZCBsYXRlcgotaW4geW91ciBwcm9ncmFtLCB5b3UgY2FuIHdyaXRlIEBzYW1we2JyYS5zIGZvb30uIAotT2JqZHVtcCBhbmQgR0RCIHdpbGwgYWx3YXlzIGFwcGVuZCBAc2FtcHsuc30gb3IgQHNhbXB7Lmx9IHRvIGluc3RydWN0aW9ucyB3aGljaAotaGF2ZSBib3RoIHNob3J0IGFuZCBsb25nIGZvcm1zLgotCi1Abm9kZSBEMzBWLVN1YnMKLUBzdWJzZWN0aW9uIFN1Yi1JbnN0cnVjdGlvbnMKLUBjaW5kZXggRDMwViBzdWItaW5zdHJ1Y3Rpb25zCi1AY2luZGV4IHN1Yi1pbnN0cnVjdGlvbnMsIEQzMFYKLVRoZSBEMzBWIGFzc2VtYmxlciB0YWtlcyBhcyBpbnB1dCBhIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMsIGVpdGhlciBvbmUtcGVyLWxpbmUsCi1vciBpbiB0aGUgc3BlY2lhbCB0d28tcGVyLWxpbmUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgU29tZSBvZiB0aGVzZQotaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgc2hvcnQtZm9ybSBvciBzdWItaW5zdHJ1Y3Rpb25zLiAgVGhlc2Ugc3ViLWluc3RydWN0aW9ucyBjYW4gYmUgcGFja2VkCi1pbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgVGhlIGFzc2VtYmxlciB3aWxsIGRvIHRoaXMgYXV0b21hdGljYWxseS4gIEl0IHdpbGwgYWxzbyBkZXRlY3QKLXdoZW4gaXQgc2hvdWxkIG5vdCBwYWNrIGluc3RydWN0aW9ucy4gIEZvciBleGFtcGxlLCB3aGVuIGEgbGFiZWwgaXMgZGVmaW5lZCwgdGhlIG5leHQKLWluc3RydWN0aW9uIHdpbGwgbmV2ZXIgYmUgcGFja2FnZWQgd2l0aCB0aGUgcHJldmlvdXMgb25lLiAgV2hlbmV2ZXIgYSBicmFuY2ggYW5kIGxpbmsKLWluc3RydWN0aW9uIGlzIGNhbGxlZCwgaXQgd2lsbCBub3QgYmUgcGFja2FnZWQgd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBzbyB0aGUgcmV0dXJuCi1hZGRyZXNzIHdpbGwgYmUgdmFsaWQuICBOb3BzIGFyZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIHdoZW4gbmVjZXNzYXJ5LgotCi1JZiB5b3UgZG8gbm90IHdhbnQgdGhlIGFzc2VtYmxlciBhdXRvbWF0aWNhbGx5IG1ha2luZyB0aGVzZSBkZWNpc2lvbnMsIHlvdSBjYW4gY29udHJvbAotdGhlIHBhY2thZ2luZyBhbmQgZXhlY3V0aW9uIHR5cGUgKHBhcmFsbGVsIG9yIHNlcXVlbnRpYWwpIHdpdGggdGhlIHNwZWNpYWwgZXhlY3V0aW9uIAotc3ltYm9scyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIAotCi1Abm9kZSBEMzBWLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgRDMwVgotQGNpbmRleCBEMzBWIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1wezt9IGFuZCBAc2FtcHsjfSBhcmUgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXJzLgotQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcsIEQzMFYKLUBjaW5kZXggRDMwViBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcKLVN1Yi1pbnN0cnVjdGlvbnMgbWF5IGJlIGV4ZWN1dGVkIGluIG9yZGVyLCBpbiByZXZlcnNlLW9yZGVyLCBvciBpbiBwYXJhbGxlbC4KLUluc3RydWN0aW9ucyBsaXN0ZWQgaW4gdGhlIHN0YW5kYXJkIG9uZS1wZXItbGluZSBmb3JtYXQgd2lsbCBiZSBleGVjdXRlZAotc2VxdWVudGlhbGx5IHVubGVzcyB5b3UgdXNlIHRoZSBAc2FtcHstT30gb3B0aW9uLgotCi1UbyBzcGVjaWZ5IHRoZSBleGVjdXRpbmcgb3JkZXIsIHVzZSB0aGUgZm9sbG93aW5nIHN5bWJvbHM6IAotQHRhYmxlIEBzYW1wCi1AaXRlbSAtPgotU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSBsZWZ0IGZpcnN0LgotCi1AaXRlbSA8LQotU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBmaXJzdC4KLQotQGl0ZW0gfHwKLVBhcmFsbGVsCi1AZW5kIHRhYmxlCi0KLVRoZSBEMzBWIHN5bnRheCBhbGxvd3MgZWl0aGVyIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSwgb25lIGluc3RydWN0aW9uIHBlciBsaW5lIHdpdGgKLXRoZSBleGVjdXRpb24gc3ltYm9sLCBvciB0d28gaW5zdHJ1Y3Rpb25zIHBlciBsaW5lLiAgRm9yIGV4YW1wbGUKLUB0YWJsZSBAY29kZQotQGl0ZW0gYWJzIHIyLHIzIC0+IGFicyByNCxyNQotRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAotY29udGFpbmVyIGFuZCBpcyBleGVjdXRlZCBzZWNvbmQuCi0KLUBpdGVtIGFicyByMixyMyA8LSBhYnMgcjQscjUKLUV4ZWN1dGUgdGhlc2UgcmV2ZXJzZS1zZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAotY29udGFpbmVyLCBhbmQgaXMgZXhlY3V0ZWQgZmlyc3QuCi0KLUBpdGVtIGFicyByMixyMyB8fCBhYnMgcjQscjUKLUV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCi0KLUBpdGVtIGxkdyByMixAQChyMyxyNCkgfHwKLUBpdGVteCBtdWx4IHI2LHI4LHI5Ci1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCi0KLUBpdGVtIG11bHggYTAscjgscjkKLUBpdGVteCBzdHcgcjIsQEAocjMscjQpCi1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5IHVubGVzcyBAc2FtcHstT30gb3B0aW9uIGlzCi11c2VkLiAgSWYgdGhlIEBzYW1wey1PfSBvcHRpb24gaXMgdXNlZCwgdGhlIGFzc2VtYmxlciB3aWxsIGRldGVybWluZSBpZgotdGhlIGluc3RydWN0aW9ucyBjb3VsZCBiZSBkb25lIGluIHBhcmFsbGVsICh0aGUgYWJvdmUgdHdvIGluc3RydWN0aW9ucwotY2FuIGJlIGRvbmUgaW4gcGFyYWxsZWwpLCBhbmQgaWYgc28sIGVtaXQgdGhlbSBhcyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuCi1UaGUgYXNzZW1ibGVyIHdpbGwgcHV0IHRoZW0gaW4gdGhlIHByb3BlciBjb250YWluZXJzLiAgSW4gdGhlIGFib3ZlCi1leGFtcGxlLCB0aGUgYXNzZW1ibGVyIHdpbGwgcHV0IHRoZSBAc2FtcHtzdHd9IGluc3RydWN0aW9uIGluIGxlZnQKLWNvbnRhaW5lciBhbmQgdGhlIEBzYW1we211bHh9IGluc3RydWN0aW9uIGluIHRoZSByaWdodCBjb250YWluZXIuCi0KLUBpdGVtIHN0dyByMixAQChyMyxyNCkgLT4KLUBpdGVteCBtdWx4IGEwLHI4LHI5Ci1Ud28tbGluZSBmb3JtYXQuICBFeGVjdXRlIHRoZSBAc2FtcHtzdHd9IGluc3RydWN0aW9uIGZvbGxvd2VkIGJ5IHRoZQotQHNhbXB7bXVseH0gaW5zdHJ1Y3Rpb24gc2VxdWVudGlhbGx5LiAgVGhlIGZpcnN0IGluc3RydWN0aW9uIGdvZXMgaW4gdGhlCi1sZWZ0IGNvbnRhaW5lciBhbmQgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBnb2VzIGludG8gcmlnaHQgY29udGFpbmVyLgotVGhlIGFzc2VtYmxlciB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgdGhlIG1hY2hpbmUgb3JkZXJpbmcgY29uc3RyYWludHMgYXJlCi12aW9sYXRlZC4KLQotQGl0ZW0gc3R3IHIyLEBAKHIzLHI0KSA8LQotQGl0ZW14IG11bHggYTAscjgscjkKLVNhbWUgYXMgcHJldmlvdXMgZXhhbXBsZSwgZXhjZXB0IHRoYXQgdGhlIEBzYW1we211bHh9IGluc3RydWN0aW9uIGlzCi1leGVjdXRlZCBiZWZvcmUgdGhlIEBzYW1we3N0d30gaW5zdHJ1Y3Rpb24uCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgotQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgRDMwVi1HdWFyZGVkCi1Ac3Vic2VjdGlvbiBHdWFyZGVkIEV4ZWN1dGlvbgotQGNpbmRleCBEMzBWIEd1YXJkZWQgRXhlY3V0aW9uCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZnVsbCByYW5nZSBvZiBndWFyZGVkIGV4ZWN1dGlvbgotZGlyZWN0aXZlcyBmb3IgZWFjaCBpbnN0cnVjdGlvbi4gIEp1c3QgYXBwZW5kIHRoZSBkaXJlY3RpdmUgYWZ0ZXIgdGhlCi1pbnN0cnVjdGlvbiBwcm9wZXIuICBUaGUgZGlyZWN0aXZlcyBhcmU6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gL3R4Ci1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYwIGlzIHRydWUuCi1AaXRlbSAvZngKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjAgaXMgZmFsc2UuCi1AaXRlbSAveHQKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjEgaXMgdHJ1ZS4KLUBpdGVtIC94ZgotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMSBpcyBmYWxzZS4KLUBpdGVtIC90dAotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgYm90aCBmbGFncyBmMCBhbmQgZjEgYXJlIHRydWUuCi1AaXRlbSAvdGYKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjAgaXMgdHJ1ZSBhbmQgZmxhZyBmMSBpcyBmYWxzZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgRDMwVi1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotQGNpbmRleCBEMzBWIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIEQzMFYKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9IHRocm91Z2ggQHNhbXB7cjYzfSB0byByZWZlcgotdG8gdGhlIEQzMFYgcmVnaXN0ZXJzLiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHtzcH0gYXMgYW4gYWxpYXMgZm9yCi1Ac2FtcHtyNjN9IGFuZCBAc2FtcHtsaW5rfSBhcyBhbiBhbGlhcyBmb3IgQHNhbXB7cjYyfS4gIFRoZSBhY2N1bXVsYXRvcnMKLWFyZSBAc2FtcHthMH0gYW5kIEBzYW1we2ExfS4KLQotVGhlIEQzMFYgYWxzbyBoYXMgcHJlZGVmaW5lZCBzeW1ib2xzIGZvciB0aGVzZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgc3RhdHVzIGJpdHM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIHBzdwotUHJvY2Vzc29yIFN0YXR1cyBXb3JkCi1AaXRlbSBicHN3Ci1CYWNrdXAgUHJvY2Vzc29yIFN0YXR1cyBXb3JkCi1AaXRlbSBwYwotUHJvZ3JhbSBDb3VudGVyCi1AaXRlbSBicGMKLUJhY2t1cCBQcm9ncmFtIENvdW50ZXIKLUBpdGVtIHJwdF9jCi1SZXBlYXQgQ291bnQKLUBpdGVtIHJwdF9zCi1SZXBlYXQgU3RhcnQgYWRkcmVzcwotQGl0ZW0gcnB0X2UKLVJlcGVhdCBFbmQgYWRkcmVzcwotQGl0ZW0gbW9kX3MKLU1vZHVsbyBTdGFydCBhZGRyZXNzCi1AaXRlbSBtb2RfZQotTW9kdWxvIEVuZCBhZGRyZXNzCi1AaXRlbSBpYmEKLUluc3RydWN0aW9uIEJyZWFrIEFkZHJlc3MKLUBpdGVtIGYwCi1GbGFnIDAKLUBpdGVtIGYxCi1GbGFnIDEKLUBpdGVtIGYyCi1GbGFnIDIKLUBpdGVtIGYzCi1GbGFnIDMKLUBpdGVtIGY0Ci1GbGFnIDQKLUBpdGVtIGY1Ci1GbGFnIDUKLUBpdGVtIGY2Ci1GbGFnIDYKLUBpdGVtIGY3Ci1GbGFnIDcKLUBpdGVtIHMKLVNhbWUgYXMgZmxhZyA0IChzYXR1cmF0aW9uIGZsYWcpCi1AaXRlbSB2Ci1TYW1lIGFzIGZsYWcgNSAob3ZlcmZsb3cgZmxhZykKLUBpdGVtIHZhCi1TYW1lIGFzIGZsYWcgNiAoc3RpY2t5IG92ZXJmbG93IGZsYWcpCi1AaXRlbSBjCi1TYW1lIGFzIGZsYWcgNyAoY2FycnkvYm9ycm93IGZsYWcpCi1AaXRlbSBiCi1TYW1lIGFzIGZsYWcgNyAoY2FycnkvYm9ycm93IGZsYWcpCi1AZW5kIHRhYmxlCi0gICAgICAgIAotQG5vZGUgRDMwVi1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEQzMFYKLUBjaW5kZXggRDMwViBhZGRyZXNzaW5nIG1vZGVzCi1AY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBEMzBWLgotQGNvZGV7UkB2YXJ7bn19IGluIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGFueSBvZiB0aGUgbnVtYmVyZWQKLXJlZ2lzdGVycywgYnV0IEBlbXBoe25vdH0gdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgotQHRhYmxlIEBjb2RlCi1AaXRlbSBSQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci1AaXRlbSBAQFJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotQGl0ZW0gQEBSQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLUBpdGVtIEBAUkB2YXJ7bn0tCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtZGVjcmVtZW50Ci1AaXRlbSBAQC1TUAotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci1AaXRlbSBAQChAdmFye2Rpc3B9LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci1AaXRlbSBAdmFye2FkZHJ9Ci1QQyByZWxhdGl2ZSBhZGRyZXNzIChmb3IgYnJhbmNoIG9yIHJlcCkuIAotQGl0ZW0gI0B2YXJ7aW1tfQotSW1tZWRpYXRlIGRhdGEgKHRoZSBAc2FtcHsjfSBpcyBvcHRpb25hbCBhbmQgaWdub3JlZCkKLUBlbmQgdGFibGUKLQotQG5vZGUgRDMwVi1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEQzMFYKLUBjaW5kZXggRDMwViBmbG9hdGluZyBwb2ludAotVGhlIEQzMFYgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0gYW5kIEBjb2Rley5kb3VibGV9Ci1kaXJlY3RpdmVzIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4gCi0KLUBub2RlIEQzMFYtT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotQGNpbmRleCBEMzBWIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBEMzBWCi1AY2luZGV4IG1uZW1vbmljcywgRDMwVgotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBEMzBWCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEQzMFYgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7RDMwViBBcmNoaXRlY3R1cmU6IEEgVkxJVyBNaWNyb3Byb2Nlc3NvciBmb3IgTXVsdGltZWRpYSBBcHBsaWNhdGlvbnN9IAotKE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4pLgotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEQzMFYgb3Bjb2Rlcy4gIFRoZSBvbmx5IGNoYW5nZXMgYXJlIHRob3NlCi1kZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gb24gc2l6ZSBtb2RpZmllcnMKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWg4MzAwLnRleGkgYi9nYXMvZG9jL2MtaDgzMDAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3MDkxOC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaDgzMDAudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQGVuZCBpZnNldAotQG5vZGUgSDgvMzAwLURlcGVuZGVudAotQGNoYXB0ZXIgSDgvMzAwIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IEg4LzMwMCBzdXBwb3J0Ci1AbWVudQotKiBIOC8zMDAgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEg4LzMwMCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBIOC8zMDAgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBIOC8zMDAgRGlyZWN0aXZlczo6ICAgICAgICAgICBIOC8zMDAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIEg4LzMwMCBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIOC8zMDAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IEg4LzMwMCBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zLCBIOC8zMDAgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhpdGFjaGkKLUg4LzMwMCBmYW1pbHkuCi0KLUBub2RlIEg4LzMwMCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQG1lbnUKLSogSDgvMzAwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEg4LzMwMC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIEg4LzMwMC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIOC8zMDAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEg4LzMwMAotQGNpbmRleCBIOC8zMDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIEg4LzMwMAotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBIOC8zMDAKLUBjaW5kZXggSDgvMzAwIGxpbmUgc2VwYXJhdG9yCi1Ac2FtcHskfSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotVGhlcmVmb3JlIEBlbXBoe3lvdSBtYXkgbm90IHVzZSBAc2FtcHskfSBpbiBzeW1ib2wgbmFtZXN9IG9uIHRoZSBIOC8zMDAuCi0KLUBub2RlIEg4LzMwMC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IEg4LzMwMCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIEg4LzMwMAotWW91IGNhbiB1c2UgcHJlZGVmaW5lZCBzeW1ib2xzIG9mIHRoZSBmb3JtIEBzYW1we3JAdmFye259aH0gYW5kCi1Ac2FtcHtyQHZhcntufWx9IHRvIHJlZmVyIHRvIHRoZSBIOC8zMDAgcmVnaXN0ZXJzIGFzIHNpeHRlZW4gOC1iaXQKLWdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMuICBAdmFye259IGlzIGEgZGlnaXQgZnJvbSBAc2FtcHswfSB0bwotQHNhbXB7N30pOyBmb3IgaW5zdGFuY2UsIGJvdGggQHNhbXB7cjBofSBhbmQgQHNhbXB7cjdsfSBhcmUgdmFsaWQKLXJlZ2lzdGVyIG5hbWVzLgotCi1Zb3UgY2FuIGFsc28gdXNlIHRoZSBlaWdodCBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7ckB2YXJ7bn19IHRvIHJlZmVyCi10byB0aGUgSDgvMzAwIHJlZ2lzdGVycyBhcyAxNi1iaXQgcmVnaXN0ZXJzICh5b3UgbXVzdCB1c2UgdGhpcyBmb3JtIGZvcgotYWRkcmVzc2luZykuCi0KLU9uIHRoZSBIOC8zMDBILCB5b3UgY2FuIGFsc28gdXNlIHRoZSBlaWdodCBwcmVkZWZpbmVkIHN5bWJvbHMKLUBzYW1we2VyQHZhcntufX0gKEBzYW1we2VyMH0gQGRvdHN7fSBAc2FtcHtlcjd9KSB0byByZWZlciB0byB0aGUgMzItYml0Ci1nZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgotCi1UaGUgdHdvIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSBjYWxsZWQgQGNvZGV7cGN9IChwcm9ncmFtIGNvdW50ZXI7IGEKLTE2LWJpdCByZWdpc3RlciwgZXhjZXB0IG9uIHRoZSBIOC8zMDBIIHdoZXJlIGl0IGlzIDI0IGJpdHMpIGFuZAotQGNvZGV7Y2NyfSAoY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXI7IGFuIDgtYml0IHJlZ2lzdGVyKS4gIEBjb2Rle3I3fSBpcwotdXNlZCBhcyB0aGUgc3RhY2sgcG9pbnRlciwgYW5kIGNhbiBhbHNvIGJlIGNhbGxlZCBAY29kZXtzcH0uCi0KLUBub2RlIEg4LzMwMC1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi0KLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgSDgvMzAwCi1AY2luZGV4IEg4LzMwMCBhZGRyZXNzaW5nIG1vZGVzCi1AdmFsdWV7QVN9IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEg4LzMwMDoKLUB0YWJsZSBAY29kZQotQGl0ZW0gckB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotCi1AaXRlbSBAQHJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotCi1AbmVlZCAxMjAwCi1AaXRlbSBAQChAdmFye2R9LCByQHZhcntufSkKLUBpdGVteCBAQChAdmFye2R9OjE2LCByQHZhcntufSkKLUBpdGVteCBAQChAdmFye2R9OjI0LCByQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0OiAxNi1iaXQgb3IgMjQtYml0IGRpc3BsYWNlbWVudCBAdmFye2R9IGZyb20gcmVnaXN0ZXIKLUB2YXJ7bn0uICAoMjQtYml0IGRpc3BsYWNlbWVudHMgYXJlIG9ubHkgbWVhbmluZ2Z1bCBvbiB0aGUgSDgvMzAwSC4pCi0KLUBpdGVtIEBAckB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci0KLUBpdGVtIEBALXJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLQotQGl0ZW0gQGNvZGV7QEB9QHZhcnthYX0KLUBpdGVteCBAY29kZXtAQH1AdmFye2FhfTo4Ci1AaXRlbXggQGNvZGV7QEB9QHZhcnthYX06MTYKLUBpdGVteCBAY29kZXtAQH1AdmFye2FhfToyNAotQWJzb2x1dGUgYWRkcmVzcyBAY29kZXthYX0uICAoVGhlIGFkZHJlc3Mgc2l6ZSBAc2FtcHs6MjR9IG9ubHkgbWFrZXMKLXNlbnNlIG9uIHRoZSBIOC8zMDBILikKLQotQGl0ZW0gI0B2YXJ7eHh9Ci1AaXRlbXggI0B2YXJ7eHh9OjgKLUBpdGVteCAjQHZhcnt4eH06MTYKLUBpdGVteCAjQHZhcnt4eH06MzIKLUltbWVkaWF0ZSBkYXRhIEB2YXJ7eHh9LiAgWW91IG1heSBzcGVjaWZ5IHRoZSBAc2FtcHs6OH0sIEBzYW1wezoxNn0sIG9yCi1Ac2FtcHs6MzJ9IGZvciBjbGFyaXR5LCBpZiB5b3Ugd2lzaDsgYnV0IEBjb2Rle0B2YWx1ZXtBU319IG5laXRoZXIKLXJlcXVpcmVzIHRoaXMgbm9yIHVzZXMgaXQtLS10aGUgZGF0YSBzaXplIHJlcXVpcmVkIGlzIHRha2VuIGZyb20KLWNvbnRleHQuCi0KLUBpdGVtIEBjb2Rle0BAfUBjb2Rle0BAfUB2YXJ7YWF9Ci1AaXRlbXggQGNvZGV7QEB9QGNvZGV7QEB9QHZhcnthYX06OAotTWVtb3J5IGluZGlyZWN0LiAgWW91IG1heSBzcGVjaWZ5IHRoZSBAc2FtcHs6OH0gZm9yIGNsYXJpdHksIGlmIHlvdQotd2lzaDsgYnV0IEBjb2Rle0B2YWx1ZXtBU319IG5laXRoZXIgcmVxdWlyZXMgdGhpcyBub3IgdXNlcyBpdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgSDgvMzAwIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBIOC8zMDAgKEBzY3tpZWVlfSkKLUBjaW5kZXggSDgvMzAwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgSDgvMzAwIGZhbWlseSBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fQotZGlyZWN0aXZlIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4KLQotQHBhZ2UKLUBub2RlIEg4LzMwMCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBIOC8zMDAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggSDgvMzAwIG1hY2hpbmUgZGlyZWN0aXZlcyAobm9uZSkKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBIOC8zMDAgKG5vbmUpCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZSwgSDgvMzAwCi1AY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlLCBIOC8zMDAKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBvbmx5IG9uZSBtYWNoaW5lLWRlcGVuZGVudCBkaXJlY3RpdmUgZm9yIHRoZQotSDgvMzAwOgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggSDgvMzAwSCwgYXNzZW1ibGluZyBmb3IKLUBpdGVtIC5oODMwMGgKLVJlY29nbml6ZSBhbmQgZW1pdCBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBmb3IgdGhlIEg4LzMwMEggdmFyaWFudCwgYW5kCi1hbHNvIG1ha2UgQGNvZGV7LmludH0gZW1pdCAzMi1iaXQgbnVtYmVycyByYXRoZXIgdGhhbiB0aGUgdXN1YWwgKDE2LWJpdCkKLWZvciB0aGUgSDgvMzAwIGZhbWlseS4KLUBlbmQgdGFibGUKLQotT24gdGhlIEg4LzMwMCBmYW1pbHkgKGluY2x1ZGluZyB0aGUgSDgvMzAwSCkgQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMKLWdlbmVyYXRlIDE2LWJpdCBudW1iZXJzLgotCi1Abm9kZSBIOC8zMDAgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IEg4LzMwMCBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgSDgvMzAwCi1AY2luZGV4IG1uZW1vbmljcywgSDgvMzAwCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIEg4LzMwMAotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBIOC8zMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7SDgvMzAwIFNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIEFERS0tNjAyLS0wMjUpLiAgRm9yCi1pbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgSDgvMzAwSCwgc2VlIEBjaXRle0g4LzMwMEggU2VyaWVzCi1Qcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpKS4KLQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEg4LzMwMCBvcGNvZGVzLiAgTm8gYWRkaXRpb25hbAotcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LgotCi1AaWZzZXQgU01BTEwKLUBjIHRoaXMgdGFibGUsIGR1ZSB0byB0aGUgbXVsdGktY29sIGZha2luZyBhbmQgaGFyZGNvZGVkIG9yZGVyLCBsb29rcyBzaWxseQotQGMgZXhjZXB0IGluIHNtYWxsYm9vay4gIFNlZSBjb21tZW50cyBiZWxvdyAiQHNldCBTTUFMTCIgbmVhciB0b3Agb2YgdGhpcyBmaWxlLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIEg4LzMwMCBvcGNvZGVzLCBhbmQgdGhlaXIgYXJndW1lbnRzLgotRW50cmllcyBtYXJrZWQgQHNhbXB7Kn0gYXJlIG9wY29kZXMgdXNlZCBvbmx5IG9uIHRoZSBIOC8zMDBILgotCi1Ac21hbGxleGFtcGxlCi1AYyBVc2luZyBAZ3JvdXAgc2VlbXMgdG8gdXNlIHRoZSBub3JtYWwgYmFzZWxpbmVza2lwLCBub3QgdGhlIHNtYWxsZXhhbXBsZQotQGMgYmFzZWxpbmVza2lwOyBsb29rcyBhcHByb3ggZG91Ymxlc3BhY2VkLgotICAgICAgICAgQGl7TGVnZW5kOn0KLSAgICAgICAgICAgIFJzICAgQHJ7c291cmNlIHJlZ2lzdGVyfQotICAgICAgICAgICAgUmQgICBAcntkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIGFicyAgQHJ7YWJzb2x1dGUgYWRkcmVzc30KLSAgICAgICAgICAgIGltbSAgQHJ7aW1tZWRpYXRlIGRhdGF9Ci0gICAgICAgICBkaXNwOk4gIEBye04tYml0IGRpc3BsYWNlbWVudCBmcm9tIGEgcmVnaXN0ZXJ9Ci0gICAgICAgIHBjcmVsOk4gIEBye04tYml0IGRpc3BsYWNlbWVudCByZWxhdGl2ZSB0byBwcm9ncmFtIGNvdW50ZXJ9Ci0KLSAgIGFkZC5iICNpbW0scmQgICAgICAgICAgICAgICogIGFuZGMgI2ltbSxjY3IKLSAgIGFkZC5iIHJzLHJkICAgICAgICAgICAgICAgICAgIGJhbmQgI2ltbSxyZAotICAgYWRkLncgcnMscmQgICAgICAgICAgICAgICAgICAgYmFuZCAjaW1tLEBAcmQKLSogIGFkZC53ICNpbW0scmQgICAgICAgICAgICAgICAgIGJhbmQgI2ltbSxAQGFiczo4Ci0qICBhZGQubCBycyxyZCAgICAgICAgICAgICAgICAgICBicmEgIHBjcmVsOjgKLSogIGFkZC5sICNpbW0scmQgICAgICAgICAgICAgICogIGJyYSAgcGNyZWw6MTYKLSAgIGFkZHMgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGJ0ICAgcGNyZWw6OAotICAgYWRkeCAjaW1tLHJkICAgICAgICAgICAgICAgKiAgYnQgICBwY3JlbDoxNgotICAgYWRkeCBycyxyZCAgICAgICAgICAgICAgICAgICAgYnJuICBwY3JlbDo4Ci0gICBhbmQuYiAjaW1tLHJkICAgICAgICAgICAgICAqICBicm4gIHBjcmVsOjE2Ci0gICBhbmQuYiBycyxyZCAgICAgICAgICAgICAgICAgICBiZiAgIHBjcmVsOjgKLSogIGFuZC53IHJzLHJkICAgICAgICAgICAgICAgICogIGJmICAgcGNyZWw6MTYKLSogIGFuZC53ICNpbW0scmQgICAgICAgICAgICAgICAgIGJoaSAgcGNyZWw6OAotKiAgYW5kLmwgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYmhpICBwY3JlbDoxNgotKiAgYW5kLmwgcnMscmQgICAgICAgICAgICAgICAgICAgYmxzICBwY3JlbDo4Ci1AcGFnZQotKiAgYmxzICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYmxkICAjaW1tLHJkCi0gICBiY2MgIHBjcmVsOjggICAgICAgICAgICAgICAgICBibGQgICNpbW0sQEByZAotKiAgYmNjICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYmxkICAjaW1tLEBAYWJzOjgKLSAgIGJocyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJub3QgI2ltbSxyZAotKiAgYmhzICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm5vdCAjaW1tLEBAcmQKLSAgIGJjcyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJub3QgI2ltbSxAQGFiczo4Ci0qICBiY3MgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibm90IHJzLHJkCi0gICBibG8gIHBjcmVsOjggICAgICAgICAgICAgICAgICBibm90IHJzLEBAcmQKLSogIGJsbyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJub3QgcnMsQEBhYnM6OAotICAgYm5lICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm9yICAjaW1tLHJkCi0qICBibmUgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBib3IgICNpbW0sQEByZAotICAgYmVxICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm9yICAjaW1tLEBAYWJzOjgKLSogIGJlcSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzZXQgI2ltbSxyZAotICAgYnZjICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNldCAjaW1tLEBAcmQKLSogIGJ2YyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzZXQgI2ltbSxAQGFiczo4Ci0gICBidnMgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic2V0IHJzLHJkCi0qICBidnMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic2V0IHJzLEBAcmQKLSAgIGJwbCAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzZXQgcnMsQEBhYnM6OAotKiAgYnBsICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNyICBwY3JlbDo4Ci0gICBibWkgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic3IgIHBjcmVsOjE2Ci0qICBibWkgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic3QgICNpbW0scmQKLSAgIGJnZSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzdCAgI2ltbSxAQHJkCi0qICBiZ2UgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic3QgICNpbW0sQEBhYnM6OAotICAgYmx0ICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnRzdCAjaW1tLHJkCi0qICBibHQgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBidHN0ICNpbW0sQEByZAotICAgYmd0ICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnRzdCAjaW1tLEBAYWJzOjgKLSogIGJndCAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJ0c3QgcnMscmQKLSAgIGJsZSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJ0c3QgcnMsQEByZAotKiAgYmxlICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnRzdCBycyxAQGFiczo4Ci0gICBiY2xyICNpbW0scmQgICAgICAgICAgICAgICAgICBieG9yICNpbW0scmQKLSAgIGJjbHIgI2ltbSxAQHJkICAgICAgICAgICAgICAgICBieG9yICNpbW0sQEByZAotICAgYmNsciAjaW1tLEBAYWJzOjggICAgICAgICAgICAgIGJ4b3IgI2ltbSxAQGFiczo4Ci0gICBiY2xyIHJzLHJkICAgICAgICAgICAgICAgICAgICBjbXAuYiAjaW1tLHJkCi0gICBiY2xyIHJzLEBAcmQgICAgICAgICAgICAgICAgICAgY21wLmIgcnMscmQKLSAgIGJjbHIgcnMsQEBhYnM6OCAgICAgICAgICAgICAgICBjbXAudyBycyxyZAotICAgYmlhbmQgI2ltbSxyZCAgICAgICAgICAgICAgICAgY21wLncgcnMscmQKLSAgIGJpYW5kICNpbW0sQEByZCAgICAgICAgICAgICAqICBjbXAudyAjaW1tLHJkCi0gICBiaWFuZCAjaW1tLEBAYWJzOjggICAgICAgICAgKiAgY21wLmwgI2ltbSxyZAotICAgYmlsZCAjaW1tLHJkICAgICAgICAgICAgICAgKiAgY21wLmwgcnMscmQKLSAgIGJpbGQgI2ltbSxAQHJkICAgICAgICAgICAgICAgICBkYWEgIHJzCi0gICBiaWxkICNpbW0sQEBhYnM6OCAgICAgICAgICAgICAgZGFzICBycwotICAgYmlvciAjaW1tLHJkICAgICAgICAgICAgICAgICAgZGVjLmIgcnMKLSAgIGJpb3IgI2ltbSxAQHJkICAgICAgICAgICAgICAqICBkZWMudyAjaW1tLHJkCi0gICBiaW9yICNpbW0sQEBhYnM6OCAgICAgICAgICAgKiAgZGVjLmwgI2ltbSxyZAotICAgYmlzdCAjaW1tLHJkICAgICAgICAgICAgICAgICAgZGl2eHUuYiBycyxyZAotICAgYmlzdCAjaW1tLEBAcmQgICAgICAgICAgICAgICogIGRpdnh1LncgcnMscmQKLSAgIGJpc3QgI2ltbSxAQGFiczo4ICAgICAgICAgICAqICBkaXZ4cy5iIHJzLHJkCi0gICBiaXhvciAjaW1tLHJkICAgICAgICAgICAgICAqICBkaXZ4cy53IHJzLHJkCi0gICBiaXhvciAjaW1tLEBAcmQgICAgICAgICAgICAgICAgZWVwbW92Ci0gICBiaXhvciAjaW1tLEBAYWJzOjggICAgICAgICAgKiAgZWVwbW92dwotQHBhZ2UKLSogIGV4dHMudyByZCAgICAgICAgICAgICAgICAgICAgIG1vdi53IHJzLEBAYWJzOjE2Ci0qICBleHRzLmwgcmQgICAgICAgICAgICAgICAgICAqICBtb3YubCAjaW1tLHJkCi0qICBleHR1LncgcmQgICAgICAgICAgICAgICAgICAqICBtb3YubCBycyxyZAotKiAgZXh0dS5sIHJkICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEBycyxyZAotICAgaW5jICBycyAgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEAoZGlzcDoxNixycykscmQKLSogIGluYy53ICNpbW0scmQgICAgICAgICAgICAgICogIG1vdi5sIEBAKGRpc3A6MjQscnMpLHJkCi0qICBpbmMubCAjaW1tLHJkICAgICAgICAgICAgICAqICBtb3YubCBAQHJzKyxyZAotICAgam1wICBAQHJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAYWJzOjE2LHJkCi0gICBqbXAgIGFicyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQGFiczoyNCxyZAotICAgam1wICBAQEBAYWJzOjggICAgICAgICAgICAgICAqICBtb3YubCBycyxAQHJkCi0gICBqc3IgIEBAcnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEAoZGlzcDoxNixyZCkKLSAgIGpzciAgYWJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAKGRpc3A6MjQscmQpCi0gICBqc3IgIEBAQEBhYnM6OCAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBALXJkCi0gICBsZGMgICNpbW0sY2NyICAgICAgICAgICAgICAqICBtb3YubCBycyxAQGFiczoxNgotICAgbGRjICBycyxjY3IgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEBhYnM6MjQKLSogIGxkYyAgQEBhYnM6MTYsY2NyICAgICAgICAgICAgICBtb3ZmcGUgQEBhYnM6MTYscmQKLSogIGxkYyAgQEBhYnM6MjQsY2NyICAgICAgICAgICAgICBtb3Z0cGUgcnMsQEBhYnM6MTYKLSogIGxkYyAgQEAoZGlzcDoxNixycyksY2NyICAgICAgICBtdWx4dS5iIHJzLHJkCi0qICBsZGMgIEBAKGRpc3A6MjQscnMpLGNjciAgICAgKiAgbXVseHUudyBycyxyZAotKiAgbGRjICBAQHJzKyxjY3IgICAgICAgICAgICAgICogIG11bHhzLmIgcnMscmQKLSogIGxkYyAgQEBycyxjY3IgICAgICAgICAgICAgICAqICBtdWx4cy53IHJzLHJkCi0qICBtb3YuYiBAQChkaXNwOjI0LHJzKSxyZCAgICAgICAgbmVnLmIgcnMKLSogIG1vdi5iIHJzLEBAKGRpc3A6MjQscmQpICAgICAqICBuZWcudyBycwotICAgbW92LmIgQEBhYnM6MTYscmQgICAgICAgICAgICogIG5lZy5sIHJzCi0gICBtb3YuYiBycyxyZCAgICAgICAgICAgICAgICAgICBub3AKLSAgIG1vdi5iIEBAYWJzOjgscmQgICAgICAgICAgICAgICBub3QuYiBycwotICAgbW92LmIgcnMsQEBhYnM6OCAgICAgICAgICAgICogIG5vdC53IHJzCi0gICBtb3YuYiBycyxyZCAgICAgICAgICAgICAgICAqICBub3QubCBycwotICAgbW92LmIgI2ltbSxyZCAgICAgICAgICAgICAgICAgb3IuYiAjaW1tLHJkCi0gICBtb3YuYiBAQHJzLHJkICAgICAgICAgICAgICAgICAgb3IuYiBycyxyZAotICAgbW92LmIgQEAoZGlzcDoxNixycykscmQgICAgICogIG9yLncgI2ltbSxyZAotICAgbW92LmIgQEBycysscmQgICAgICAgICAgICAgICogIG9yLncgcnMscmQKLSAgIG1vdi5iIEBAYWJzOjgscmQgICAgICAgICAgICAqICBvci5sICNpbW0scmQKLSAgIG1vdi5iIHJzLEBAcmQgICAgICAgICAgICAgICAqICBvci5sIHJzLHJkCi0gICBtb3YuYiBycyxAQChkaXNwOjE2LHJkKSAgICAgICAgb3JjICAjaW1tLGNjcgotICAgbW92LmIgcnMsQEAtcmQgICAgICAgICAgICAgICAgIHBvcC53IHJzCi0gICBtb3YuYiBycyxAQGFiczo4ICAgICAgICAgICAgKiAgcG9wLmwgcnMKLSAgIG1vdi53IHJzLEBAcmQgICAgICAgICAgICAgICAgICBwdXNoLncgcnMKLSogIG1vdi53IEBAKGRpc3A6MjQscnMpLHJkICAgICAqICBwdXNoLmwgcnMKLSogIG1vdi53IHJzLEBAKGRpc3A6MjQscmQpICAgICAgICByb3RsLmIgcnMKLSogIG1vdi53IEBAYWJzOjI0LHJkICAgICAgICAgICAqICByb3RsLncgcnMKLSogIG1vdi53IHJzLEBAYWJzOjI0ICAgICAgICAgICAqICByb3RsLmwgcnMKLSAgIG1vdi53IHJzLHJkICAgICAgICAgICAgICAgICAgIHJvdHIuYiBycwotICAgbW92LncgI2ltbSxyZCAgICAgICAgICAgICAgKiAgcm90ci53IHJzCi0gICBtb3YudyBAQHJzLHJkICAgICAgICAgICAgICAgKiAgcm90ci5sIHJzCi0gICBtb3YudyBAQChkaXNwOjE2LHJzKSxyZCAgICAgICAgcm90eGwuYiBycwotICAgbW92LncgQEBycysscmQgICAgICAgICAgICAgICogIHJvdHhsLncgcnMKLSAgIG1vdi53IEBAYWJzOjE2LHJkICAgICAgICAgICAqICByb3R4bC5sIHJzCi0gICBtb3YudyBycyxAQChkaXNwOjE2LHJkKSAgICAgICAgcm90eHIuYiBycwotICAgbW92LncgcnMsQEAtcmQgICAgICAgICAgICAgICogIHJvdHhyLncgcnMKLUBwYWdlCi0qICByb3R4ci5sIHJzICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQChkaXNwOjI0LHJkKQotICAgYnB0ICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEAtcmQKLSAgIHJ0ZSAgICAgICAgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBAYWJzOjE2Ci0gICBydHMgICAgICAgICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQGFiczoyNAotICAgc2hhbC5iIHJzICAgICAgICAgICAgICAgICAgICAgc3ViLmIgcnMscmQKLSogIHNoYWwudyBycyAgICAgICAgICAgICAgICAgICAgIHN1Yi53IHJzLHJkCi0qICBzaGFsLmwgcnMgICAgICAgICAgICAgICAgICAqICBzdWIudyAjaW1tLHJkCi0gICBzaGFyLmIgcnMgICAgICAgICAgICAgICAgICAqICBzdWIubCBycyxyZAotKiAgc2hhci53IHJzICAgICAgICAgICAgICAgICAgKiAgc3ViLmwgI2ltbSxyZAotKiAgc2hhci5sIHJzICAgICAgICAgICAgICAgICAgICAgc3VicyAjaW1tLHJkCi0gICBzaGxsLmIgcnMgICAgICAgICAgICAgICAgICAgICBzdWJ4ICNpbW0scmQKLSogIHNobGwudyBycyAgICAgICAgICAgICAgICAgICAgIHN1YnggcnMscmQKLSogIHNobGwubCBycyAgICAgICAgICAgICAgICAgICogIHRyYXBhICNpbW0KLSAgIHNobHIuYiBycyAgICAgICAgICAgICAgICAgICAgIHhvciAgI2ltbSxyZAotKiAgc2hsci53IHJzICAgICAgICAgICAgICAgICAgICAgeG9yICBycyxyZAotKiAgc2hsci5sIHJzICAgICAgICAgICAgICAgICAgKiAgeG9yLncgI2ltbSxyZAotICAgc2xlZXAgICAgICAgICAgICAgICAgICAgICAgKiAgeG9yLncgcnMscmQKLSAgIHN0YyAgY2NyLHJkICAgICAgICAgICAgICAgICogIHhvci5sICNpbW0scmQKLSogIHN0YyAgY2NyLEBAcnMgICAgICAgICAgICAgICAqICB4b3IubCBycyxyZAotKiAgc3RjICBjY3IsQEAoZGlzcDoxNixyZCkgICAgICAgIHhvcmMgI2ltbSxjY3IKLUBlbmQgc21hbGxleGFtcGxlCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggc2l6ZSBzdWZmaXhlcywgSDgvMzAwCi1AY2luZGV4IEg4LzMwMCBzaXplIHN1ZmZpeGVzCi1Gb3VyIEg4LzMwMCBpbnN0cnVjdGlvbnMgKEBjb2Rle2FkZH0sIEBjb2Rle2NtcH0sIEBjb2Rle21vdn0sCi1AY29kZXtzdWJ9KSBhcmUgZGVmaW5lZCB3aXRoIHZhcmlhbnRzIHVzaW5nIHRoZSBzdWZmaXhlcyBAc2FtcHsuYn0sCi1Ac2FtcHsud30sIGFuZCBAc2FtcHsubH0gdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiBhIG1lbW9yeSBvcGVyYW5kLgotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlc2Ugc3VmZml4ZXMsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoZW07Ci1zaW5jZSBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIGFsd2F5cyBhIHJlZ2lzdGVyLCBAY29kZXtAdmFsdWV7QVN9fSBjYW4KLWRlZHVjZSB0aGUgY29ycmVjdCBzaXplLgotCi1Gb3IgZXhhbXBsZSwgc2luY2UgQGNvZGV7cjB9IHJlZmVycyB0byBhIDE2LWJpdCByZWdpc3RlciwKLUBleGFtcGxlCi1tb3YgICAgcjAsQEBmb28KLUBleGRlbnQgaXMgZXF1aXZhbGVudCB0bwotbW92LncgIHIwLEBAZm9vCi1AZW5kIGV4YW1wbGUKLQotSWYgeW91IHVzZSB0aGUgc2l6ZSBzdWZmaXhlcywgQGNvZGV7QHZhbHVle0FTfX0gaXNzdWVzIGEgd2FybmluZyB3aGVuCi10aGUgc3VmZml4IGFuZCB0aGUgcmVnaXN0ZXIgc2l6ZSBkbyBub3QgbWF0Y2guCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaDg1MDAudGV4aSBiL2dhcy9kb2MvYy1oODUwMC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYwZTY0Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1oODUwMC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQHBhZ2UKLUBub2RlIEg4LzUwMC1EZXBlbmRlbnQKLUBjaGFwdGVyIEg4LzUwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBIOC81MDAgc3VwcG9ydAotQG1lbnUKLSogSDgvNTAwIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBIOC81MDAgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogSDgvNTAwIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogSDgvNTAwIERpcmVjdGl2ZXM6OiAgICAgICAgICAgSDgvNTAwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBIOC81MDAgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSDgvNTAwIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBIOC81MDAgb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucywgSDgvNTAwIChub25lKQotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBIaXRhY2hpCi1IOC81MDAgZmFtaWx5LgotCi1Abm9kZSBIOC81MDAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLQotQG1lbnUKLSogSDgvNTAwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEg4LzUwMC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIEg4LzUwMC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIOC81MDAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEg4LzUwMAotQGNpbmRleCBIOC81MDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7IX0gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIEg4LzUwMAotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBIOC81MDAKLUBjaW5kZXggSDgvNTAwIGxpbmUgc2VwYXJhdG9yCi1Ac2FtcHs7fSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIEg4LzUwMC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IEg4LzUwMCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBIOC81MDAKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9LCBAc2FtcHtyMX0sIEBzYW1we3IyfSwKLUBzYW1we3IzfSwgQHNhbXB7cjR9LCBAc2FtcHtyNX0sIEBzYW1we3I2fSwgYW5kIEBzYW1we3I3fSB0byByZWZlciB0bwotdGhlIEg4LzUwMCByZWdpc3RlcnMuCi0KLVRoZSBIOC81MDAgYWxzbyBoYXMgdGhlc2UgY29udHJvbCByZWdpc3RlcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gY3AKLWNvZGUgcG9pbnRlcgotCi1AaXRlbSBkcAotZGF0YSBwb2ludGVyCi0KLUBpdGVtIGJwCi1iYXNlIHBvaW50ZXIKLQotQGl0ZW0gdHAKLXN0YWNrIHRvcCBwb2ludGVyCi0KLUBpdGVtIGVwCi1leHRyYSBwb2ludGVyCi0KLUBpdGVtIHNyCi1zdGF0dXMgcmVnaXN0ZXIKLQotQGl0ZW0gY2NyCi1jb25kaXRpb24gY29kZSByZWdpc3RlcgotQGVuZCB0YWJsZQotCi1BbGwgcmVnaXN0ZXJzIGFyZSAxNiBiaXRzIGxvbmcuICBUbyByZXByZXNlbnQgMzIgYml0IG51bWJlcnMsIHVzZSB0d28KLWFkamFjZW50IHJlZ2lzdGVyczsgZm9yIGRpc3RhbnQgbWVtb3J5IGFkZHJlc3NlcywgdXNlIG9uZSBvZiB0aGUgc2VnbWVudAotcG9pbnRlcnMgKEBjb2Rle2NwfSBmb3IgdGhlIHByb2dyYW0gY291bnRlcjsgQGNvZGV7ZHB9IGZvcgotQGNvZGV7cjB9LS1AY29kZXtyM307IEBjb2Rle2VwfSBmb3IgQGNvZGV7cjR9IGFuZCBAY29kZXtyNX07IGFuZAotQGNvZGV7dHB9IGZvciBAY29kZXtyNn0gYW5kIEBjb2Rle3I3fS4KLQotQG5vZGUgSDgvNTAwLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLQotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBIOC81MDAKLUBjaW5kZXggSDgvNTAwIGFkZHJlc3NpbmcgbW9kZXMKLUB2YWx1ZXtBU30gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgSDgvNTAwOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBSQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci0KLUBpdGVtIEBAUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci0KLUBpdGVtIEBAKGQ6OCwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQKLQotQGl0ZW0gQEAoZDoxNiwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIDE2IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50Ci0KLUBpdGVtIEBALVJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLQotQGl0ZW0gQEBSQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLQotQGl0ZW0gQEBAdmFye2FhfTo4Ci04IGJpdCBhYnNvbHV0ZSBhZGRyZXNzCi0KLUBpdGVtIEBAQHZhcnthYX06MTYKLTE2IGJpdCBhYnNvbHV0ZSBhZGRyZXNzCi0KLUBpdGVtICNAdmFye3h4fTo4Ci04IGJpdCBpbW1lZGlhdGUKLQotQGl0ZW0gI0B2YXJ7eHh9OjE2Ci0xNiBiaXQgaW1tZWRpYXRlCi1AZW5kIHRhYmxlCi0KLUBub2RlIEg4LzUwMCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgSDgvNTAwIChAc2N7aWVlZX0pCi1AY2luZGV4IEg4LzUwMCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEg4LzUwMCBmYW1pbHkgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0KLWRpcmVjdGl2ZSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuCi0KLUBub2RlIEg4LzUwMCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBIOC81MDAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggSDgvNTAwIG1hY2hpbmUgZGlyZWN0aXZlcyAobm9uZSkKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBIOC81MDAgKG5vbmUpCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZSwgSDgvNTAwCi1AY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlLCBIOC81MDAKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBkaXJlY3RpdmVzIGZvciB0aGUgSDgvNTAwLgotSG93ZXZlciwgb24gdGhpcyBwbGF0Zm9ybSB0aGUgQHNhbXB7LmludH0gYW5kIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzCi1nZW5lcmF0ZSAxNi1iaXQgbnVtYmVycy4KLQotQG5vZGUgSDgvNTAwIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBIOC81MDAgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIEg4LzUwMAotQGNpbmRleCBtbmVtb25pY3MsIEg4LzUwMAotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBIOC81MDAKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgSDgvNTAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle0g4LzUwMCBTZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSBNMjFUMDAxKS4KLQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEg4LzUwMCBvcGNvZGVzLiAgTm8gYWRkaXRpb25hbAotcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LgotCi1AaWZzZXQgU01BTEwKLUBjIHRoaXMgdGFibGUsIGR1ZSB0byB0aGUgbXVsdGktY29sIGZha2luZyBhbmQgaGFyZGNvZGVkIG9yZGVyLCBsb29rcyBzaWxseQotQGMgZXhjZXB0IGluIHNtYWxsYm9vay4gIFNlZSBjb21tZW50cyBiZWxvdyAiQHNldCBTTUFMTCIgbmVhciB0b3Agb2YgdGhpcyBmaWxlLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgSDgvNTAwIG9wY29kZXMgYW5kIHRoZWlyIG9wZXJhbmRzOgotCi1AYyBVc2UgQGdyb3VwIGlmIGl0IGV2ZXIgd29ya3MsIGluc3RlYWQgb2YgQHBhZ2UKLUBwYWdlCi1Ac21hbGxleGFtcGxlCi1AaXtMZWdlbmQ6fQotYWJzOCAgICAgIEByezgtYml0IGFic29sdXRlIGFkZHJlc3N9Ci1hYnMxNiAgICAgQHJ7MTYtYml0IGFic29sdXRlIGFkZHJlc3N9Ci1hYnMyNCAgICAgQHJ7MjQtYml0IGFic29sdXRlIGFkZHJlc3N9Ci1jcmIgICAgICAgQHJ7QGNvZGV7Y2NyfSwgQGNvZGV7YnJ9LCBAY29kZXtlcH0sIEBjb2Rle2RwfSwgQGNvZGV7dHB9LCBAY29kZXtkcH19Ci1kaXNwOCAgICAgQHJ7OC1iaXQgZGlzcGxhY2VtZW50fQotZWEgICAgICAgIEBye0Bjb2Rle3JufSwgQGNvZGV7QEBybn0sIEBjb2Rle0BAKGQ6OCwgcm4pfSwgQGNvZGV7QEAoZDoxNiwgcm4pfSx9Ci0gICAgICAgICAgQHJ7QGNvZGV7QEAtcm59LCBAY29kZXtAQHJuK30sIEBjb2Rle0BAYWE6OH0sIEBjb2Rle0BAYWE6MTZ9LH0KLSAgICAgICAgICBAcntAY29kZXsjeHg6OH0sIEBjb2RleyN4eDoxNn19Ci1lYV9tZW0gICAgQHJ7QGNvZGV7QEBybn0sIEBjb2Rle0BAKGQ6OCwgcm4pfSwgQGNvZGV7QEAoZDoxNiwgcm4pfSx9Ci0gICAgICAgICAgQHJ7QGNvZGV7QEAtcm59LCBAY29kZXtAQHJuK30sIEBjb2Rle0BAYWE6OH0sIEBjb2Rle0BAYWE6MTZ9fQotZWFfbm9pbW0gIEBye0Bjb2Rle3JufSwgQGNvZGV7QEBybn0sIEBjb2Rle0BAKGQ6OCwgcm4pfSwgQGNvZGV7QEAoZDoxNiwgcm4pfSx9Ci0gICAgICAgICAgQHJ7QGNvZGV7QEAtcm59LCBAY29kZXtAQHJuK30sIEBjb2Rle0BAYWE6OH0sIEBjb2Rle0BAYWE6MTZ9fQotZnAgICAgICAgIHI2Ci1pbW00ICAgICAgQHJ7NC1iaXQgaW1tZWRpYXRlIGRhdGF9Ci1pbW04ICAgICAgQHJ7OC1iaXQgaW1tZWRpYXRlIGRhdGF9Ci1pbW0xNiAgICAgQHJ7MTYtYml0IGltbWVkaWF0ZSBkYXRhfQotcGNyZWw4ICAgIEByezgtYml0IG9mZnNldCBmcm9tIHByb2dyYW0gY291bnRlcn0KLXBjcmVsMTYgICBAcnsxNi1iaXQgb2Zmc2V0IGZyb20gcHJvZ3JhbSBjb3VudGVyfQotcWltICAgICAgIEBye0Bjb2Rley0yfSwgQGNvZGV7LTF9LCBAY29kZXsxfSwgQGNvZGV7Mn19Ci1yZCAgICAgICAgQHJ7YW55IHJlZ2lzdGVyfQotcnMgICAgICAgIEBye2EgcmVnaXN0ZXIgZGlzdGluY3QgZnJvbSByZH0KLXJsaXN0ICAgICBAcntjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWdpc3RlcnMgaW4gcGFyZW50aGVzZXM7fQotICAgICAgICAgIEBye3JlZ2lzdGVyIHJhbmdlcyBAY29kZXtyZC1yc30gYXJlIGFsbG93ZWR9Ci1zcCAgICAgICAgQHJ7c3RhY2sgcG9pbnRlciAoQGNvZGV7cjd9KX0KLXNyICAgICAgICBAcntzdGF0dXMgcmVnaXN0ZXJ9Ci1zeiAgICAgICAgQHJ7c2l6ZTsgQHNhbXB7LmJ9IG9yIEBzYW1wey53fS4gIElmIG9taXR0ZWQsIGRlZmF1bHQgQHNhbXB7Lnd9fQotCi1sZGNbLmJdIGVhLGNyYiAgICAgICAgICAgICAgICAgYmNjWy53XSBwY3JlbDE2Ci1sZGNbLnddIGVhLHNyICAgICAgICAgICAgICAgICAgYmNjWy5iXSBwY3JlbDggCi1hZGRbOnFdIHN6IHFpbSxlYV9ub2ltbSAgICAgICAgYmhzWy53XSBwY3JlbDE2Ci1hZGRbOmddIHN6IGVhLHJkICAgICAgICAgICAgICAgYmhzWy5iXSBwY3JlbDggCi1hZGRzIHN6IGVhLHJkICAgICAgICAgICAgICAgICAgYmNzWy53XSBwY3JlbDE2Ci1hZGR4IHN6IGVhLHJkICAgICAgICAgICAgICAgICAgYmNzWy5iXSBwY3JlbDggCi1hbmQgc3ogZWEscmQgICAgICAgICAgICAgICAgICAgYmxvWy53XSBwY3JlbDE2Ci1hbmRjWy5iXSBpbW04LGNyYiAgICAgICAgICAgICAgYmxvWy5iXSBwY3JlbDggCi1hbmRjWy53XSBpbW0xNixzciAgICAgICAgICAgICAgYm5lWy53XSBwY3JlbDE2Ci1icHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm5lWy5iXSBwY3JlbDggCi1icmFbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgYmVxWy53XSBwY3JlbDE2Ci1icmFbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgYmVxWy5iXSBwY3JlbDggCi1idFsud10gcGNyZWwxNiAgICAgICAgICAgICAgICAgYnZjWy53XSBwY3JlbDE2Ci1idFsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICAgYnZjWy5iXSBwY3JlbDggCi1icm5bLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgYnZzWy53XSBwY3JlbDE2Ci1icm5bLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgYnZzWy5iXSBwY3JlbDggCi1iZlsud10gcGNyZWwxNiAgICAgICAgICAgICAgICAgYnBsWy53XSBwY3JlbDE2Ci1iZlsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICAgYnBsWy5iXSBwY3JlbDggCi1iaGlbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgYm1pWy53XSBwY3JlbDE2Ci1iaGlbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgYm1pWy5iXSBwY3JlbDggCi1ibHNbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgYmdlWy53XSBwY3JlbDE2Ci1ibHNbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgYmdlWy5iXSBwY3JlbDggCi1AcGFnZQotYmx0Wy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIG1vdls6Z11bLmJdIGltbTgsZWFfbWVtICAgICAgIAotYmx0Wy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIG1vdls6Z11bLnddIGltbTE2LGVhX21lbSAgICAgIAotYmd0Wy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIG1vdmZwZVsuYl0gZWEscmQgICAgICAgICAgICAgIAotYmd0Wy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIG1vdnRwZVsuYl0gcnMsZWFfbm9pbW0gICAgICAgIAotYmxlWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIG11bHh1IHN6IGVhLHJkICAgICAgICAgICAgICAgIAotYmxlWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIG5lZyBzeiBlYSAgICAgICAgICAgICAgICAgICAgIAotYmNsciBzeiBpbW00LGVhX25vaW1tICAgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgIAotYmNsciBzeiBycyxlYV9ub2ltbSAgICAgICAgICAgIG5vdCBzeiBlYSAgICAgICAgICAgICAgICAgICAgIAotYm5vdCBzeiBpbW00LGVhX25vaW1tICAgICAgICAgIG9yIHN6IGVhLHJkICAgICAgICAgICAgICAgICAgIAotYm5vdCBzeiBycyxlYV9ub2ltbSAgICAgICAgICAgIG9yY1suYl0gaW1tOCxjcmIgICAgICAgICAgICAgIAotYnNldCBzeiBpbW00LGVhX25vaW1tICAgICAgICAgIG9yY1sud10gaW1tMTYsc3IgICAgICAgICAgICAgIAotYnNldCBzeiBycyxlYV9ub2ltbSAgICAgICAgICAgIHBqbXAgYWJzMjQgICAgICAgICAgICAgICAgICAgIAotYnNyWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIHBqbXAgQEByZCAgICAgICAgICAgICAgICAgICAgIAotYnNyWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIHBqc3IgYWJzMjQgICAgICAgICAgICAgICAgICAgIAotYnRzdCBzeiBpbW00LGVhX25vaW1tICAgICAgICAgIHBqc3IgQEByZCAgICAgICAgICAgICAgICAgICAgIAotYnRzdCBzeiBycyxlYV9ub2ltbSAgICAgICAgICAgIHBydGQgaW1tOCAgICAgICAgICAgICAgICAgICAgIAotY2xyIHN6IGVhICAgICAgICAgICAgICAgICAgICAgIHBydGQgaW1tMTYgICAgICAgICAgICAgICAgICAgIAotY21wWzplXVsuYl0gaW1tOCxyZCAgICAgICAgICAgIHBydHMgICAgICAgICAgICAgICAgICAgICAgICAgIAotY21wWzppXVsud10gaW1tMTYscmQgICAgICAgICAgIHJvdGwgc3ogZWEgICAgICAgICAgICAgICAgICAgIAotY21wWzpnXS5iIGltbTgsZWFfbm9pbW0gICAgICAgIHJvdHIgc3ogZWEgICAgICAgICAgICAgICAgICAgIAotY21wWzpnXVsud10gaW1tMTYsZWFfbm9pbW0gICAgIHJvdHhsIHN6IGVhICAgICAgICAgICAgICAgICAgIAotQ21wWzpnXSBzeiBlYSxyZCAgICAgICAgICAgICAgIHJvdHhyIHN6IGVhICAgICAgICAgICAgICAgICAgIAotZGFkZCBycyxyZCAgICAgICAgICAgICAgICAgICAgIHJ0ZCBpbW04ICAgICAgICAgICAgICAgICAgICAgCi1kaXZ4dSBzeiBlYSxyZCAgICAgICAgICAgICAgICAgcnRkIGltbTE2ICAgICAgICAgICAgICAgICAgICAKLWRzdWIgcnMscmQgICAgICAgICAgICAgICAgICAgICBydHMgICAgICAgICAgICAgICAgICAgICAgICAgIAotZXh0c1suYl0gcmQgICAgICAgICAgICAgICAgICAgIHNjYi9mIHJzLHBjcmVsOCAgICAgICAgICAgICAgIAotZXh0dVsuYl0gcmQgICAgICAgICAgICAgICAgICAgIHNjYi9uZSBycyxwY3JlbDggICAgICAgICAgICAgCi1qbXAgQEByZCAgICAgICAgICAgICAgICAgICAgICAgIHNjYi9lcSBycyxwY3JlbDggICAgICAgICAgICAgCi1qbXAgQEAoaW1tOCxyZCkgICAgICAgICAgICAgICAgIHNoYWwgc3ogZWEgICAgICAgICAgICAgICAgICAgCi1qbXAgQEAoaW1tMTYscmQpICAgICAgICAgICAgICAgIHNoYXIgc3ogZWEgICAgICAgICAgICAgICAgICAgIAotam1wIGFiczE2ICAgICAgICAgICAgICAgICAgICAgIHNobGwgc3ogZWEgICAgICAgICAgICAKLWpzciBAQHJkICAgICAgICAgICAgICAgICAgICAgICAgc2hsciBzeiBlYSAgICAgICAgICAgIAotanNyIEBAKGltbTgscmQpICAgICAgICAgICAgICAgICBzbGVlcCAgICAgICAgICAgICAgICAgCi1qc3IgQEAoaW1tMTYscmQpICAgICAgICAgICAgICAgIHN0Y1suYl0gY3JiLGVhX25vaW1tICAKLWpzciBhYnMxNiAgICAgICAgICAgICAgICAgICAgICBzdGNbLnddIHNyLGVhX25vaW1tICAgCi1sZG0gQEBzcCssKHJsaXN0KSAgICAgICAgICAgICAgIHN0bSAocmxpc3QpLEBALXNwICAgICAKLWxpbmsgZnAsaW1tOCAgICAgICAgICAgICAgICAgICBzdWIgc3ogZWEscmQgICAgICAgICAgCi1saW5rIGZwLGltbTE2ICAgICAgICAgICAgICAgICAgc3VicyBzeiBlYSxyZCAgICAgICAgIAotbW92WzplXVsuYl0gaW1tOCxyZCAgICAgICAgICAgIHN1Ynggc3ogZWEscmQgICAgICAgICAKLW1vdls6aV1bLnddIGltbTE2LHJkICAgICAgICAgICBzd2FwWy5iXSByZCAgICAgICAgICAgCi1tb3ZbOmxdWy53XSBhYnM4LHJkICAgICAgICAgICAgdGFzWy5iXSBlYSAgICAgCi1tb3ZbOmxdLmIgYWJzOCxyZCAgICAgICAgICAgICAgdHJhcGEgaW1tNCAgICAgCi1tb3ZbOnNdWy53XSBycyxhYnM4ICAgICAgICAgICAgdHJhcC92cyAgICAgICAgCi1tb3ZbOnNdLmIgcnMsYWJzOCAgICAgICAgICAgICAgdHN0IHN6IGVhICAgICAgCi1tb3ZbOmZdWy53XSBAQChkaXNwOCxmcCkscmQgICAgIHVubGsgZnAgICAgICAgIAotbW92WzpmXVsud10gcnMsQEAoZGlzcDgsZnApICAgICB4Y2hbLnddIHJzLHJkIAotbW92WzpmXS5iIEBAKGRpc3A4LGZwKSxyZCAgICAgICB4b3Igc3ogZWEscmQgICAKLW1vdls6Zl0uYiBycyxAQChkaXNwOCxmcCkgICAgICAgeG9yYy5iIGltbTgsY3JiCi1tb3ZbOmddIHN6IHJzLGVhX21lbSAgICAgICAgICAgeG9yYy53IGltbTE2LHNyCi1tb3ZbOmddIHN6IGVhLHJkICAgICAgICAgICAgICAKLUBlbmQgc21hbGxleGFtcGxlCi1AZW5kIGlmc2V0CmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaHBwYS50ZXhpIGIvZ2FzL2RvYy9jLWhwcGEudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNTM1Zi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaHBwYS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQHBhZ2UKLUBub2RlIEhQUEEtRGVwZW5kZW50Ci1AY2hhcHRlciBIUFBBIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4ICBzdXBwb3J0Ci1AbWVudQotKiBIUFBBIE5vdGVzOjogICAgICAgICAgICAgICAgTm90ZXMKLSogSFBQQSBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogSFBQQSBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBIUFBBIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogSFBQQSBEaXJlY3RpdmVzOjogICAgICAgICAgIEhQUEEgTWFjaGluZSBEaXJlY3RpdmVzCi0qIEhQUEEgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSFBQQSBOb3RlcwotQHNlY3Rpb24gTm90ZXMKLUFzIGEgYmFjayBlbmQgZm9yIEBzY3tnbnV9IEBzY3tjY30gQGNvZGV7QHZhbHVle0FTfX0gaGFzIGJlZW4gdGhyb3VnaGx5IHRlc3RlZCBhbmQgc2hvdWxkCi13b3JrIGV4dHJlbWVseSB3ZWxsLiAgV2UgaGF2ZSB0ZXN0ZWQgaXQgb25seSBtaW5pbWFsbHkgb24gaGFuZCB3cml0dGVuIGFzc2VtYmx5Ci1jb2RlIGFuZCBubyBvbmUgaGFzIHRlc3RlZCBpdCBtdWNoIG9uIHRoZSBhc3NlbWJseSBvdXRwdXQgZnJvbSB0aGUgSFAKLWNvbXBpbGVycy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgZGVidWdnaW5nIHNlY3Rpb25zIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbAotQGNvZGV7QHZhbHVle0FTfX0gcG9ydCAodmVyc2lvbiAxLjNYKSB3YXMgcmVsZWFzZWQ7IHRoZXJlZm9yZSwKLXlvdSBtdXN0IHJlYnVpbGQgYWxsIEhQUEEgb2JqZWN0cyBhbmQgbGlicmFyaWVzIHdpdGggdGhlIG5ldyAKLWFzc2VtYmxlciBzbyB0aGF0IHlvdSBjYW4gZGVidWcgdGhlIGZpbmFsIGV4ZWN1dGFibGUuCi0KLVRoZSBIUFBBIEBjb2Rle0B2YWx1ZXtBU319IHBvcnQgZ2VuZXJhdGVzIGEgc21hbGwgc3Vic2V0IG9mIHRoZSByZWxvY2F0aW9ucwotYXZhaWxhYmxlIGluIHRoZSBTT00gYW5kIEVMRiBvYmplY3QgZmlsZSBmb3JtYXRzLiAgQWRkaXRpb25hbCByZWxvY2F0aW9uCi1zdXBwb3J0IHdpbGwgYmUgYWRkZWQgYXMgaXQgYmVjb21lcyBuZWNlc3NhcnkuICAKLQotQG5vZGUgSFBQQSBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBIUFBBLgotCi1AY2luZGV4IEhQUEEgU3ludGF4Ci1Abm9kZSBIUFBBIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1UaGUgYXNzZW1ibGVyIHN5bnRheCBjbG9zZWx5IGZvbGxvd3MgdGhlIEhQUEEgaW5zdHJ1Y3Rpb24gc2V0Ci1yZWZlcmVuY2UgbWFudWFsOyBhc3NlbWJsZXIgZGlyZWN0aXZlcyBhbmQgZ2VuZXJhbCBzeW50YXggY2xvc2VseSBmb2xsb3cgdGhlCi1IUFBBIGFzc2VtYmx5IGxhbmd1YWdlIHJlZmVyZW5jZSBtYW51YWwsIHdpdGggYSBmZXcgbm90ZXdvcnRoeSBkaWZmZXJlbmNlcy4KLQotRmlyc3QsIGEgY29sb24gbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyBhIGxhYmVsIGRlZmluaXRpb24uICBUaGlzIGlzCi1zaW1wbHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBob3cgbW9zdCBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycwotd3JpdGUgY29kZS4KLQotU29tZSBvYnNjdXJlIGV4cHJlc3Npb24gcGFyc2luZyBwcm9ibGVtcyBtYXkgYWZmZWN0IGhhbmQgd3JpdHRlbiBjb2RlIHdoaWNoCi11c2VzIHRoZSBAY29kZXtzcG9wfSBpbnN0cnVjdGlvbnMsIG9yIGNvZGUgd2hpY2ggbWFrZXMgc2lnbmlmaWNhbnQKLXVzZSBvZiB0aGUgQGNvZGV7IX0gbGluZSBzZXBhcmF0b3IuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGlzIG11Y2ggbGVzcyBmb3JnaXZpbmcgYWJvdXQgbWlzc2luZyBhcmd1bWVudHMgYW5kIG90aGVyCi1zaW1pbGFyIG92ZXJzaWdodHMgdGhhbiB0aGUgSFAgYXNzZW1ibGVyLiAgQGNvZGV7QHZhbHVle0FTfX0gbm90aWZpZXMgeW91Ci1vZiBtaXNzaW5nIGFyZ3VtZW50cyBhcyBzeW50YXggZXJyb3JzOyB0aGlzIGlzIHJlZ2FyZGVkIGFzIGEgZmVhdHVyZSwgbm90IGEKLWJ1Zy4KLQotRmluYWxseSwgQGNvZGV7QHZhbHVle0FTfX0gYWxsb3dzIHlvdSB0byB1c2UgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGhvdXQKLWV4cGxpY2l0bHkgaW1wb3J0aW5nIHRoZSBzeW1ib2wuICBAZW1waHtXYXJuaW5nOn0gaW4gdGhlIGZ1dHVyZSB0aGlzIHdpbGwgYmUKLWFuIGVycm9yIGZvciBIUFBBIHRhcmdldHMuCi0KLVNwZWNpYWwgY2hhcmFjdGVycyBmb3IgSFBQQSB0YXJnZXRzIGluY2x1ZGU6Ci0KLUBzYW1wezt9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1Ac2FtcHshfSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIEhQUEEgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBIUFBBIChAc2N7aWVlZX0pCi1AY2luZGV4IEhQUEEgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBIUFBBIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBIUFBBIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEhQUEEgQXNzZW1ibGVyIERpcmVjdGl2ZXMKLQotQGNvZGV7QHZhbHVle0FTfX0gZm9yIHRoZSBIUFBBIHN1cHBvcnRzIG1hbnkgYWRkaXRpb25hbCBkaXJlY3RpdmVzIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBuYXRpdmUgYXNzZW1ibGVyLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGVtIG9ubHkKLWJyaWVmbHkuICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gSFBQQS1zcGVjaWZpYyBhc3NlbWJsZXIgZGlyZWN0aXZlcywgc2VlCi1AY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMCBBc3NlbWJseSBMYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpLgotCi1AY2luZGV4IEhQUEEgZGlyZWN0aXZlcyBub3Qgc3VwcG9ydGVkCi1AY29kZXtAdmFsdWV7QVN9fSBkb2VzIEBlbXBoe25vdH0gc3VwcG9ydCB0aGUgZm9sbG93aW5nIGFzc2VtYmxlciBkaXJlY3RpdmVzCi1kZXNjcmliZWQgaW4gdGhlIEhQIG1hbnVhbDoKLQotQGV4YW1wbGUKLS5lbmRtICAgICAgICAgICAubGlzdG9uCi0uZW50ZXIgICAgICAgICAgLmxvY2N0Ci0ubGVhdmUgICAgICAgICAgLm1hY3JvICAKLS5saXN0b2ZmCi1AZW5kIGV4YW1wbGUKLQotQGNpbmRleCBAY29kZXsucGFyYW19IG9uIEhQUEEKLUJleW9uZCB0aG9zZSBpbXBsZW1lbnRlZCBmb3IgY29tcGF0aWJpbGl0eSwgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgb25lCi1hZGRpdGlvbmFsIGFzc2VtYmxlciBkaXJlY3RpdmUgZm9yIHRoZSBIUFBBOiBAY29kZXsucGFyYW19LiAgSXQgY29udmV5cwotcmVnaXN0ZXIgYXJndW1lbnQgbG9jYXRpb25zIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgSXRzIHN5bnRheCBjbG9zZWx5IGZvbGxvd3MKLXRoZSBAY29kZXsuZXhwb3J0fSBkaXJlY3RpdmUuCi0KLUBjaW5kZXggSFBQQS1vbmx5IGRpcmVjdGl2ZXMKLVRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBkaXJlY3RpdmVzIGluIEBjb2Rle0B2YWx1ZXtBU319IGZvciB0aGUgSFBQQToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAuYmxvY2sgQHZhcntufQotQGl0ZW14IC5ibG9ja3ogQHZhcntufQotUmVzZXJ2ZSBAdmFye259IGJ5dGVzIG9mIHN0b3JhZ2UsIGFuZCBpbml0aWFsaXplIHRoZW0gdG8gemVyby4KLQotQGl0ZW0gLmNhbGwgCi1NYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSBwcm9jZWR1cmUgY2FsbC4gIE9ubHkgdGhlIHNwZWNpYWwgY2FzZSB3aXRoIEBlbXBoe25vCi1hcmd1bWVudHN9IGlzIGFsbG93ZWQuCi0KLUBpdGVtIC5jYWxsaW5mbyBbIEB2YXJ7cGFyYW19PUB2YXJ7dmFsdWV9LCBAZG90c3t9IF0gIFsgQHZhcntmbGFnfSwgQGRvdHN7fSBdCi1TcGVjaWZ5IGEgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIGZsYWdzIHRoYXQgZGVmaW5lIHRoZSBlbnZpcm9ubWVudCBmb3IgYQotcHJvY2VkdXJlLgotCi1AdmFye3BhcmFtfSBtYXkgYmUgYW55IG9mIEBzYW1we2ZyYW1lfSAoZnJhbWUgc2l6ZSksIEBzYW1we2VudHJ5X2dyfSAoZW5kIG9mCi1nZW5lcmFsIHJlZ2lzdGVyIHJhbmdlKSwgQHNhbXB7ZW50cnlfZnJ9IChlbmQgb2YgZmxvYXQgcmVnaXN0ZXIgcmFuZ2UpLAotQHNhbXB7ZW50cnlfc3J9IChlbmQgb2Ygc3BhY2UgcmVnaXN0ZXIgcmFuZ2UpLgotCi1UaGUgdmFsdWVzIGZvciBAdmFye2ZsYWd9IGFyZSBAc2FtcHtjYWxsc30gb3IgQHNhbXB7Y2FsbGVyfSAocHJvYyBoYXMKLXN1YnJvdXRpbmVzKSwgQHNhbXB7bm9fY2FsbHN9IChwcm9jIGRvZXMgbm90IGNhbGwgc3Vicm91dGluZXMpLCBAc2FtcHtzYXZlX3JwfQotKHByZXNlcnZlIHJldHVybiBwb2ludGVyKSwgQHNhbXB7c2F2ZV9zcH0gKHByb2MgcHJlc2VydmVzIHN0YWNrIHBvaW50ZXIpLAotQHNhbXB7bm9fdW53aW5kfSAoZG8gbm90IHVud2luZCB0aGlzIHByb2MpLCBAc2FtcHtocHV4X2ludH0gKHByb2MgaXMgaW50ZXJydXB0Ci1yb3V0aW5lKS4KLQotQGl0ZW0gLmNvZGUKLUFzc2VtYmxlIGludG8gdGhlIHN0YW5kYXJkIHNlY3Rpb24gY2FsbGVkIEBzYW1weyRURVhUJH0sIHN1YnNlY3Rpb24KLUBzYW1weyRDT0RFJH0uCi0KLUBpZnNldCBTT00KLUBpdGVtIC5jb3B5cmlnaHQgIkB2YXJ7c3RyaW5nfSIKLUluIHRoZSBTT00gb2JqZWN0IGZvcm1hdCwgaW5zZXJ0IEB2YXJ7c3RyaW5nfSBpbnRvIHRoZSBvYmplY3QgY29kZSwgbWFya2VkIGFzIGEKLWNvcHlyaWdodCBzdHJpbmcuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBFTEYKLUBpdGVtIC5jb3B5cmlnaHQgIkB2YXJ7c3RyaW5nfSIKLUluIHRoZSBFTEYgb2JqZWN0IGZvcm1hdCwgaW5zZXJ0IEB2YXJ7c3RyaW5nfSBpbnRvIHRoZSBvYmplY3QgY29kZSwgbWFya2VkIGFzIGEKLXZlcnNpb24gc3RyaW5nLgotQGVuZCBpZnNldAotCi1AaXRlbSAuZW50ZXIKLU5vdCB5ZXQgc3VwcG9ydGVkOyB0aGUgYXNzZW1ibGVyIHJlamVjdHMgcHJvZ3JhbXMgY29udGFpbmluZyB0aGlzIGRpcmVjdGl2ZS4KLQotQGl0ZW0gLmVudHJ5Ci1NYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSBwcm9jZWR1cmUuCi0KLUBpdGVtIC5leGl0Ci1NYXJrIHRoZSBlbmQgb2YgYSBwcm9jZWR1cmUuCi0KLUBpdGVtIC5leHBvcnQgQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXSAgWyAsQHZhcntwYXJhbX09QHZhcntyfSBdCi1NYWtlIGEgcHJvY2VkdXJlIEB2YXJ7bmFtZX0gYXZhaWxhYmxlIHRvIGNhbGxlcnMuICBAdmFye3R5cH0sIGlmIHByZXNlbnQsIG11c3QKLWJlIG9uZSBvZiBAc2FtcHthYnNvbHV0ZX0sIEBzYW1we2NvZGV9IChFTEYgb25seSwgbm90IFNPTSksIEBzYW1we2RhdGF9LAotQHNhbXB7ZW50cnl9LCBAc2FtcHtkYXRhfSwgQHNhbXB7ZW50cnl9LCBAc2FtcHttaWxsaWNvZGV9LCBAc2FtcHtwbGFiZWx9LAotQHNhbXB7cHJpX3Byb2d9LCBvciBAc2FtcHtzZWNfcHJvZ30uCi0KLUB2YXJ7cGFyYW19LCBpZiBwcmVzZW50LCBwcm92aWRlcyBlaXRoZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlCi1wcm9jZWR1cmUgYXJndW1lbnRzIGFuZCByZXN1bHQsIG9yIGEgcHJpdmlsZWdlIGxldmVsLiAgQHZhcntwYXJhbX0gbWF5IGJlCi1Ac2FtcHthcmd3QHZhcntufX0gKHdoZXJlIEB2YXJ7bn0gcmFuZ2VzIGZyb20gQGNvZGV7MH0gdG8gQGNvZGV7M30sIGFuZAotaW5kaWNhdGVzIG9uZSBvZiBmb3VyIG9uZS13b3JkIGFyZ3VtZW50cyk7IEBzYW1we3J0bnZhbH0gKHRoZSBwcm9jZWR1cmUncwotcmVzdWx0KTsgb3IgQHNhbXB7cHJpdl9sZXZ9IChwcml2aWxlZ2UgbGV2ZWwpLiAgRm9yIGFyZ3VtZW50cyBvciB0aGUgcmVzdWx0LAotQHZhcntyfSBzcGVjaWZpZXMgaG93IHRvIHJlbG9jYXRlLCBhbmQgbXVzdCBiZSBvbmUgb2YgQHNhbXB7bm99IChub3QKLXJlbG9jYXRhYmxlKSwgQHNhbXB7Z3J9IChhcmd1bWVudCBpcyBpbiBnZW5lcmFsIHJlZ2lzdGVyKSwgQHNhbXB7ZnJ9IChpbgotZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIpLCBvciBAc2FtcHtmdX0gKHVwcGVyIGhhbGYgb2YgZmxvYXQgcmVnaXN0ZXIpLgotRm9yIEBzYW1we3ByaXZfbGV2fSwgQHZhcntyfSBpcyBhbiBpbnRlZ2VyLgotCi1AaXRlbSAuaGFsZiBAdmFye259Ci1EZWZpbmUgYSB0d28tYnl0ZSBpbnRlZ2VyIGNvbnN0YW50IEB2YXJ7bn07IHN5bm9ueW0gZm9yIHRoZSBwb3J0YWJsZQotQGNvZGV7QHZhbHVle0FTfX0gZGlyZWN0aXZlIEBjb2Rley5zaG9ydH0uCi0KLUBpdGVtIC5pbXBvcnQgQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXQotQ29udmVyc2Ugb2YgQGNvZGV7LmV4cG9ydH07IG1ha2UgYSBwcm9jZWR1cmUgYXZhaWxhYmxlIHRvIGNhbGwuICBUaGUgYXJndW1lbnRzCi11c2UgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgZm9yIEBjb2Rley5leHBvcnR9LgotCi1AaXRlbSAubGFiZWwgQHZhcntuYW1lfQotRGVmaW5lIEB2YXJ7bmFtZX0gYXMgYSBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgYXNzZW1ibHkgbG9jYXRpb24uCi0KLUBpdGVtIC5sZWF2ZQotTm90IHlldCBzdXBwb3J0ZWQ7IHRoZSBhc3NlbWJsZXIgcmVqZWN0cyBwcm9ncmFtcyBjb250YWluaW5nIHRoaXMgZGlyZWN0aXZlLgotCi1AaXRlbSAub3JpZ2luIEB2YXJ7bGN9Ci1BZHZhbmNlIGxvY2F0aW9uIGNvdW50ZXIgdG8gQHZhcntsY30uIFN5bm9ueW0gZm9yIHRoZSBAY29kZXtAdmFsdWV7YXN9fQotcG9ydGFibGUgZGlyZWN0aXZlIEBjb2Rley5vcmd9LgotCi1AaXRlbSAucGFyYW0gQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXSAgWyAsQHZhcntwYXJhbX09QHZhcntyfSBdCi1AYyBOb3QgaW4gSFAgbWFudWFsOyBAc2N7Z251fSBIUFBBIGV4dGVuc2lvbgotU2ltaWxhciB0byBAY29kZXsuZXhwb3J0fSwgYnV0IHVzZWQgZm9yIHN0YXRpYyBwcm9jZWR1cmVzLgotCi1AaXRlbSAucHJvYwotVXNlIHByZWNlZGluZyB0aGUgZmlyc3Qgc3RhdGVtZW50IG9mIGEgcHJvY2VkdXJlLgotCi1AaXRlbSAucHJvY2VuZAotVXNlIGZvbGxvd2luZyB0aGUgbGFzdCBzdGF0ZW1lbnQgb2YgYSBwcm9jZWR1cmUuCi0KLUBpdGVtIEB2YXJ7bGFiZWx9IC5yZWcgQHZhcntleHByfQotQGMgPz8gTm90IGluIEhQIG1hbnVhbCAoSmFuIDE5ODggdm4pCi1TeW5vbnltIGZvciBAY29kZXsuZXF1fTsgZGVmaW5lIEB2YXJ7bGFiZWx9IHdpdGggdGhlIGFic29sdXRlIGV4cHJlc3Npb24KLUB2YXJ7ZXhwcn0gYXMgaXRzIHZhbHVlLgotCi1AaXRlbSAuc3BhY2UgQHZhcntzZWNuYW1lfSBbICxAdmFye3BhcmFtc30gXQotU3dpdGNoIHRvIHNlY3Rpb24gQHZhcntzZWNuYW1lfSwgY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiBieSB0aGF0IG5hbWUgaWYKLW5lY2Vzc2FyeS4gIFlvdSBtYXkgb25seSB1c2UgQHZhcntwYXJhbXN9IHdoZW4gY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiwgbm90Ci13aGVuIHN3aXRjaGluZyB0byBhbiBleGlzdGluZyBvbmUuICBAdmFye3NlY25hbWV9IG1heSBpZGVudGlmeSBhIHNlY3Rpb24gYnkKLW51bWJlciByYXRoZXIgdGhhbiBieSBuYW1lLgotCi1JZiBzcGVjaWZpZWQsIHRoZSBsaXN0IEB2YXJ7cGFyYW1zfSBkZWNsYXJlcyBhdHRyaWJ1dGVzIG9mIHRoZSBzZWN0aW9uLAotaWRlbnRpZmllZCBieSBrZXl3b3Jkcy4gIFRoZSBrZXl3b3JkcyByZWNvZ25pemVkIGFyZSBAc2FtcHtzcG51bT1AdmFye2V4cH19Ci0oaWRlbnRpZnkgdGhpcyBzZWN0aW9uIGJ5IHRoZSBudW1iZXIgQHZhcntleHB9LCBhbiBhYnNvbHV0ZSBleHByZXNzaW9uKSwKLUBzYW1we3NvcnQ9QHZhcntleHB9fSAob3JkZXIgc2VjdGlvbnMgYWNjb3JkaW5nIHRvIHRoaXMgc29ydCBrZXkgd2hlbiBsaW5raW5nOwotQHZhcntleHB9IGlzIGFuIGFic29sdXRlIGV4cHJlc3Npb24pLCBAc2FtcHt1bmxvYWRhYmxlfSAoc2VjdGlvbiBjb250YWlucyBubwotbG9hZGFibGUgZGF0YSksIEBzYW1we25vdGRlZmluZWR9ICh0aGlzIHNlY3Rpb24gZGVmaW5lZCBlbHNld2hlcmUpLCBhbmQKLUBzYW1we3ByaXZhdGV9IChkYXRhIGluIHRoaXMgc2VjdGlvbiBub3QgYXZhaWxhYmxlIHRvIG90aGVyIHByb2dyYW1zKS4KLQotQGl0ZW0gLnNwbnVtIEB2YXJ7c2VjbmFtfQotQGMgPz8gTm90IGluIEhQIG1hbnVhbCAoSmFuIDE5ODgpCi1BbGxvY2F0ZSBmb3VyIGJ5dGVzIG9mIHN0b3JhZ2UsIGFuZCBpbml0aWFsaXplIHRoZW0gd2l0aCB0aGUgc2VjdGlvbiBudW1iZXIgb2YKLXRoZSBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjbmFtfS4gIChZb3UgY2FuIGRlZmluZSB0aGUgc2VjdGlvbiBudW1iZXIgd2l0aCB0aGUKLUhQUEEgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuKQotCi1AY2luZGV4IEBjb2Rle3N0cmluZ30gZGlyZWN0aXZlIG9uIEhQUEEKLUBpdGVtIC5zdHJpbmcgIkB2YXJ7c3RyfSIKLUNvcHkgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBAdmFye3N0cn0gdG8gdGhlIG9iamVjdCBmaWxlLgotQHhyZWZ7U3RyaW5ncywsU3RyaW5nc30sIGZvciBpbmZvcm1hdGlvbiBvbiBlc2NhcGUgc2VxdWVuY2VzIHlvdSBjYW4gdXNlIGluCi1AY29kZXtAdmFsdWV7QVN9fSBzdHJpbmdzLgotCi1AZW1waHtXYXJuaW5nIX0gVGhlIEhQUEEgdmVyc2lvbiBvZiBAY29kZXsuc3RyaW5nfSBkaWZmZXJzIGZyb20gdGhlCi11c3VhbCBAY29kZXtAdmFsdWV7QVN9fSBkZWZpbml0aW9uOiBpdCBkb2VzIEBlbXBoe25vdH0gd3JpdGUgYSB6ZXJvIGJ5dGUKLWFmdGVyIGNvcHlpbmcgQHZhcntzdHJ9LgotCi1AaXRlbSAuc3RyaW5neiAiQHZhcntzdHJ9IgotTGlrZSBAY29kZXsuc3RyaW5nfSwgYnV0IGFwcGVuZHMgYSB6ZXJvIGJ5dGUgYWZ0ZXIgY29weWluZyBAdmFye3N0cn0gdG8gb2JqZWN0Ci1maWxlLgotCi1AaXRlbSAuc3Vic3BhIEB2YXJ7bmFtZX0gWyAsQHZhcntwYXJhbXN9IF0KLUBpdGVteCAubnN1YnNwYSBAdmFye25hbWV9IFsgLEB2YXJ7cGFyYW1zfSBdCi1TaW1pbGFyIHRvIEBjb2Rley5zcGFjZX0sIGJ1dCBzZWxlY3RzIGEgc3Vic2VjdGlvbiBAdmFye25hbWV9IHdpdGhpbiB0aGUKLWN1cnJlbnQgc2VjdGlvbi4gIFlvdSBtYXkgb25seSBzcGVjaWZ5IEB2YXJ7cGFyYW1zfSB3aGVuIHlvdSBjcmVhdGUgYQotc3Vic2VjdGlvbiAoaW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIEBjb2Rley5zdWJzcGF9IGZvciB0aGlzIEB2YXJ7bmFtZX0pLgotCi1JZiBzcGVjaWZpZWQsIHRoZSBsaXN0IEB2YXJ7cGFyYW1zfSBkZWNsYXJlcyBhdHRyaWJ1dGVzIG9mIHRoZSBzdWJzZWN0aW9uLAotaWRlbnRpZmllZCBieSBrZXl3b3Jkcy4gIFRoZSBrZXl3b3JkcyByZWNvZ25pemVkIGFyZSBAc2FtcHtxdWFkPUB2YXJ7ZXhwcn19Ci0oYGBxdWFkcmFudCcnIGZvciB0aGlzIHN1YnNlY3Rpb24pLCBAc2FtcHthbGlnbj1AdmFye2V4cHJ9fSAoYWxpZ25tZW50IGZvcgotYmVnaW5uaW5nIG9mIHRoaXMgc3Vic2VjdGlvbjsgYSBwb3dlciBvZiB0d28pLCBAc2FtcHthY2Nlc3M9QHZhcntleHByfX0gKHZhbHVlCi1mb3IgYGBhY2Nlc3MgcmlnaHRzJycgZmllbGQpLCBAc2FtcHtzb3J0PUB2YXJ7ZXhwcn19IChzb3J0aW5nIG9yZGVyIGZvciB0aGlzCi1zdWJzcGFjZSBpbiBsaW5rKSwgQHNhbXB7Y29kZV9vbmx5fSAoc3Vic2VjdGlvbiBjb250YWlucyBvbmx5IGNvZGUpLAotQHNhbXB7dW5sb2FkYWJsZX0gKHN1YnNlY3Rpb24gY2Fubm90IGJlIGxvYWRlZCBpbnRvIG1lbW9yeSksIEBzYW1we2NvbW1vbn0KLShzdWJzZWN0aW9uIGlzIGNvbW1vbiBibG9jayksIEBzYW1we2R1cF9jb21tfSAoaW5pdGlhbGl6ZWQgZGF0YSBtYXkgaGF2ZQotZHVwbGljYXRlIG5hbWVzKSwgb3IgQHNhbXB7emVyb30gKHN1YnNlY3Rpb24gaXMgYWxsIHplcm9zLCBkbyBub3Qgd3JpdGUgaW4KLW9iamVjdCBmaWxlKS4KLQotQGNvZGV7Lm5zdWJzcGF9IGFsd2F5cyBjcmVhdGVzIGEgbmV3IHN1YnNwYWNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGV2ZW4KLWlmIG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0KLUBpdGVtIC52ZXJzaW9uICJAdmFye3N0cn0iCi1Xcml0ZSBAdmFye3N0cn0gYXMgdmVyc2lvbiBpZGVudGlmaWVyIGluIG9iamVjdCBjb2RlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBIUFBBIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgSFBQQSBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtQQS1SSVNDIEFyY2hpdGVjdHVyZSBhbmQgSW5zdHJ1Y3Rpb24gU2V0IFJlZmVyZW5jZSBNYW51YWx9IAotKEhQIDA5NzQwLTkwMDM5KS4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1pMzg2LnRleGkgYi9nYXMvZG9jL2MtaTM4Ni50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTljODVhLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1pMzg2LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgaTM4Ni1EZXBlbmRlbnQKLUBjaGFwdGVyIDgwMzg2IERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIDgwMzg2IERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggaTM4NiBzdXBwb3J0Ci1AY2luZGV4IGk4MDMwNiBzdXBwb3J0Ci1AbWVudQotKiBpMzg2LU9wdGlvbnM6OiAgICAgICAgICAgICAgICBPcHRpb25zCi0qIGkzODYtU3ludGF4OjogICAgICAgICAgICAgICAgIEFUJlQgU3ludGF4IHZlcnN1cyBJbnRlbCBTeW50YXgKLSogaTM4Ni1NbmVtb25pY3M6OiAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gTmFtaW5nCi0qIGkzODYtUmVnczo6ICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWluZwotKiBpMzg2LVByZWZpeGVzOjogICAgICAgICAgICAgICBJbnN0cnVjdGlvbiBQcmVmaXhlcwotKiBpMzg2LU1lbW9yeTo6ICAgICAgICAgICAgICAgICBNZW1vcnkgUmVmZXJlbmNlcwotKiBpMzg2LWp1bXBzOjogICAgICAgICAgICAgICAgICBIYW5kbGluZyBvZiBKdW1wIEluc3RydWN0aW9ucwotKiBpMzg2LUZsb2F0OjogICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBpMzg2LVNJTUQ6OiAgICAgICAgICAgICAgICAgICBJbnRlbCdzIE1NWCBhbmQgQU1EJ3MgM0ROb3chIFNJTUQgT3BlcmF0aW9ucwotKiBpMzg2LTE2Yml0OjogICAgICAgICAgICAgICAgICBXcml0aW5nIDE2LWJpdCBDb2RlCi0qIGkzODYtQnVnczo6ICAgICAgICAgICAgICAgICAgIEFUJlQgU3ludGF4IGJ1Z3MKLSogaTM4Ni1Ob3Rlczo6ICAgICAgICAgICAgICAgICAgTm90ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBpMzg2LU9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zIGZvciBpMzg2IChub25lKQotQGNpbmRleCBpMzg2IG9wdGlvbnMgKG5vbmUpCi1UaGUgODAzODYgaGFzIG5vIG1hY2hpbmUgZGVwZW5kZW50IG9wdGlvbnMuCi0KLUBub2RlIGkzODYtU3ludGF4Ci1Ac2VjdGlvbiBBVCZUIFN5bnRheCB2ZXJzdXMgSW50ZWwgU3ludGF4Ci0KLUBjaW5kZXggaTM4NiBzeW50YXggY29tcGF0aWJpbGl0eQotQGNpbmRleCBzeW50YXggY29tcGF0aWJpbGl0eSwgaTM4NgotSW4gb3JkZXIgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvdXRwdXQgb2YgQGNvZGV7QHZhbHVle0dDQ319LAotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgQVQmVCBTeXN0ZW0gVi8zODYgYXNzZW1ibGVyIHN5bnRheC4gIFRoaXMgaXMgcXVpdGUKLWRpZmZlcmVudCBmcm9tIEludGVsIHN5bnRheC4gIFdlIG1lbnRpb24gdGhlc2UgZGlmZmVyZW5jZXMgYmVjYXVzZQotYWxtb3N0IGFsbCA4MDM4NiBkb2N1bWVudHMgdXNlIEludGVsIHN5bnRheC4gIE5vdGFibGUgZGlmZmVyZW5jZXMKLWJldHdlZW4gdGhlIHR3byBzeW50YXhlcyBhcmU6Ci0KLUBjaW5kZXggaW1tZWRpYXRlIG9wZXJhbmRzLCBpMzg2Ci1AY2luZGV4IGkzODYgaW1tZWRpYXRlIG9wZXJhbmRzCi1AY2luZGV4IHJlZ2lzdGVyIG9wZXJhbmRzLCBpMzg2Ci1AY2luZGV4IGkzODYgcmVnaXN0ZXIgb3BlcmFuZHMKLUBjaW5kZXgganVtcC9jYWxsIG9wZXJhbmRzLCBpMzg2Ci1AY2luZGV4IGkzODYganVtcC9jYWxsIG9wZXJhbmRzCi1AY2luZGV4IG9wZXJhbmQgZGVsaW1pdGVycywgaTM4NgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUFUJlQgaW1tZWRpYXRlIG9wZXJhbmRzIGFyZSBwcmVjZWRlZCBieSBAc2FtcHskfTsgSW50ZWwgaW1tZWRpYXRlCi1vcGVyYW5kcyBhcmUgdW5kZWxpbWl0ZWQgKEludGVsIEBzYW1we3B1c2ggNH0gaXMgQVQmVCBAc2FtcHtwdXNobCAkNH0pLgotQVQmVCByZWdpc3RlciBvcGVyYW5kcyBhcmUgcHJlY2VkZWQgYnkgQHNhbXB7JX07IEludGVsIHJlZ2lzdGVyIG9wZXJhbmRzCi1hcmUgdW5kZWxpbWl0ZWQuICBBVCZUIGFic29sdXRlIChhcyBvcHBvc2VkIHRvIFBDIHJlbGF0aXZlKSBqdW1wL2NhbGwKLW9wZXJhbmRzIGFyZSBwcmVmaXhlZCBieSBAc2FtcHsqfTsgdGhleSBhcmUgdW5kZWxpbWl0ZWQgaW4gSW50ZWwgc3ludGF4LgotCi1AY2luZGV4IGkzODYgc291cmNlLCBkZXN0aW5hdGlvbiBvcGVyYW5kcwotQGNpbmRleCBzb3VyY2UsIGRlc3RpbmF0aW9uIG9wZXJhbmRzOyBpMzg2Ci1AaXRlbQotQVQmVCBhbmQgSW50ZWwgc3ludGF4IHVzZSB0aGUgb3Bwb3NpdGUgb3JkZXIgZm9yIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLW9wZXJhbmRzLiAgSW50ZWwgQHNhbXB7YWRkIGVheCwgNH0gaXMgQHNhbXB7YWRkbCAkNCwgJWVheH0uICBUaGUKLUBzYW1we3NvdXJjZSwgZGVzdH0gY29udmVudGlvbiBpcyBtYWludGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLXByZXZpb3VzIFVuaXggYXNzZW1ibGVycy4gIE5vdGUgdGhhdCBpbnN0cnVjdGlvbnMgd2l0aCBtb3JlIHRoYW4gb25lCi1zb3VyY2Ugb3BlcmFuZCwgc3VjaCBhcyB0aGUgQHNhbXB7ZW50ZXJ9IGluc3RydWN0aW9uLCBkbyBAZW1waHtub3R9IGhhdmUKLXJldmVyc2VkIG9yZGVyLiAgQHJlZntpMzg2LUJ1Z3N9LgotCi1AY2luZGV4IG1uZW1vbmljIHN1ZmZpeGVzLCBpMzg2Ci1AY2luZGV4IHNpemVzIG9wZXJhbmRzLCBpMzg2Ci1AY2luZGV4IGkzODYgc2l6ZSBzdWZmaXhlcwotQGl0ZW0KLUluIEFUJlQgc3ludGF4IHRoZSBzaXplIG9mIG1lbW9yeSBvcGVyYW5kcyBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGxhc3QKLWNoYXJhY3RlciBvZiB0aGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMuICBNbmVtb25pYyBzdWZmaXhlcyBvZiBAc2FtcHtifSwKLUBzYW1we3d9LCBhbmQgQHNhbXB7bH0gc3BlY2lmeSBieXRlICg4LWJpdCksIHdvcmQgKDE2LWJpdCksIGFuZCBsb25nCi0oMzItYml0KSBtZW1vcnkgcmVmZXJlbmNlcy4gIEludGVsIHN5bnRheCBhY2NvbXBsaXNoZXMgdGhpcyBieSBwcmVmaXhpbmcKLW1lbW9yeSBvcGVyYW5kcyAoQGVtcGh7bm90fSB0aGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzKSB3aXRoIEBzYW1we2J5dGUKLXB0cn0sIEBzYW1we3dvcmQgcHRyfSwgYW5kIEBzYW1we2R3b3JkIHB0cn0uICBUaHVzLCBJbnRlbCBAc2FtcHttb3YgYWwsCi1ieXRlIHB0ciBAdmFye2Zvb319IGlzIEBzYW1we21vdmIgQHZhcntmb299LCAlYWx9IGluIEFUJlQgc3ludGF4LgotCi1AY2luZGV4IHJldHVybiBpbnN0cnVjdGlvbnMsIGkzODYKLUBjaW5kZXggaTM4NiBqdW1wLCBjYWxsLCByZXR1cm4KLUBpdGVtCi1JbW1lZGlhdGUgZm9ybSBsb25nIGp1bXBzIGFuZCBjYWxscyBhcmUKLUBzYW1we2xjYWxsL2xqbXAgJEB2YXJ7c2VjdGlvbn0sICRAdmFye29mZnNldH19IGluIEFUJlQgc3ludGF4OyB0aGUKLUludGVsIHN5bnRheCBpcwotQHNhbXB7Y2FsbC9qbXAgZmFyIEB2YXJ7c2VjdGlvbn06QHZhcntvZmZzZXR9fS4gIEFsc28sIHRoZSBmYXIgcmV0dXJuCi1pbnN0cnVjdGlvbgotaXMgQHNhbXB7bHJldCAkQHZhcntzdGFjay1hZGp1c3R9fSBpbiBBVCZUIHN5bnRheDsgSW50ZWwgc3ludGF4IGlzCi1Ac2FtcHtyZXQgZmFyIEB2YXJ7c3RhY2stYWRqdXN0fX0uCi0KLUBjaW5kZXggc2VjdGlvbnMsIGkzODYKLUBjaW5kZXggaTM4NiBzZWN0aW9ucwotQGl0ZW0KLVRoZSBBVCZUIGFzc2VtYmxlciBkb2VzIG5vdCBwcm92aWRlIHN1cHBvcnQgZm9yIG11bHRpcGxlIHNlY3Rpb24KLXByb2dyYW1zLiAgVW5peCBzdHlsZSBzeXN0ZW1zIGV4cGVjdCBhbGwgcHJvZ3JhbXMgdG8gYmUgc2luZ2xlIHNlY3Rpb25zLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIGkzODYtTW5lbW9uaWNzCi1Ac2VjdGlvbiBJbnN0cnVjdGlvbiBOYW1pbmcKLQotQGNpbmRleCBpMzg2IGluc3RydWN0aW9uIG5hbWluZwotQGNpbmRleCBpbnN0cnVjdGlvbiBuYW1pbmcsIGkzODYKLUluc3RydWN0aW9uIG1uZW1vbmljcyBhcmUgc3VmZml4ZWQgd2l0aCBvbmUgY2hhcmFjdGVyIG1vZGlmaWVycyB3aGljaAotc3BlY2lmeSB0aGUgc2l6ZSBvZiBvcGVyYW5kcy4gIFRoZSBsZXR0ZXJzIEBzYW1we2J9LCBAc2FtcHt3fSwgYW5kCi1Ac2FtcHtsfSBzcGVjaWZ5IGJ5dGUsIHdvcmQsIGFuZCBsb25nIG9wZXJhbmRzLiAgSWYgbm8gc3VmZml4IGlzCi1zcGVjaWZpZWQgYnkgYW4gaW5zdHJ1Y3Rpb24gdGhlbiBAY29kZXtAdmFsdWV7QVN9fSB0cmllcyB0byBmaWxsIGluIHRoZQotbWlzc2luZyBzdWZmaXggYmFzZWQgb24gdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9wZXJhbmQgKHRoZSBsYXN0IG9uZQotYnkgY29udmVudGlvbikuICBUaHVzLCBAc2FtcHttb3YgJWF4LCAlYnh9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7bW92dwotJWF4LCAlYnh9OyBhbHNvLCBAc2FtcHttb3YgJDEsICVieH0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHttb3Z3ICQxLAotJWJ4fS4gIE5vdGUgdGhhdCB0aGlzIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBBVCZUIFVuaXggYXNzZW1ibGVyIHdoaWNoCi1hc3N1bWVzIHRoYXQgYSBtaXNzaW5nIG1uZW1vbmljIHN1ZmZpeCBpbXBsaWVzIGxvbmcgb3BlcmFuZCBzaXplLiAgKFRoaXMKLWluY29tcGF0aWJpbGl0eSBkb2VzIG5vdCBhZmZlY3QgY29tcGlsZXIgb3V0cHV0IHNpbmNlIGNvbXBpbGVycyBhbHdheXMKLWV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbW5lbW9uaWMgc3VmZml4LikKLQotQWxtb3N0IGFsbCBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBpbiBBVCZUIGFuZCBJbnRlbCBmb3JtYXQuCi1UaGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9ucy4gIFRoZSBzaWduIGV4dGVuZCBhbmQgemVybyBleHRlbmQKLWluc3RydWN0aW9ucyBuZWVkIHR3byBzaXplcyB0byBzcGVjaWZ5IHRoZW0uICBUaGV5IG5lZWQgYSBzaXplIHRvCi1zaWduL3plcm8gZXh0ZW5kIEBlbXBoe2Zyb219IGFuZCBhIHNpemUgdG8gemVybyBleHRlbmQgQGVtcGh7dG99LiAgVGhpcwotaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHR3byBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBpbiBBVCZUCi1zeW50YXguICBCYXNlIG5hbWVzIGZvciBzaWduIGV4dGVuZCBhbmQgemVybyBleHRlbmQgYXJlCi1Ac2FtcHttb3ZzQGRvdHN7fX0gYW5kIEBzYW1we21vdnpAZG90c3t9fSBpbiBBVCZUIHN5bnRheCAoQHNhbXB7bW92c3h9Ci1hbmQgQHNhbXB7bW92enh9IGluIEludGVsIHN5bnRheCkuICBUaGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMKLWFyZSB0YWNrZWQgb24gdG8gdGhpcyBiYXNlIG5hbWUsIHRoZSBAZW1waHtmcm9tfSBzdWZmaXggYmVmb3JlIHRoZQotQGVtcGh7dG99IHN1ZmZpeC4gIFRodXMsIEBzYW1we21vdnNibCAlYWwsICVlZHh9IGlzIEFUJlQgc3ludGF4IGZvcgotYGBtb3ZlIHNpZ24gZXh0ZW5kIEBlbXBoe2Zyb219ICVhbCBAZW1waHt0b30gJWVkeC4nJyAgUG9zc2libGUgc3VmZml4ZXMsCi10aHVzLCBhcmUgQHNhbXB7Ymx9IChmcm9tIGJ5dGUgdG8gbG9uZyksIEBzYW1we2J3fSAoZnJvbSBieXRlIHRvIHdvcmQpLAotYW5kIEBzYW1we3dsfSAoZnJvbSB3b3JkIHRvIGxvbmcpLgotCi1AY2luZGV4IGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb25zLCBpMzg2Ci1AY2luZGV4IGkzODYgY29udmVyc2lvbiBpbnN0cnVjdGlvbnMKLVRoZSBJbnRlbC1zeW50YXggY29udmVyc2lvbiBpbnN0cnVjdGlvbnMKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUBzYW1we2Nid30gLS0tIHNpZ24tZXh0ZW5kIGJ5dGUgaW4gQHNhbXB7JWFsfSB0byB3b3JkIGluIEBzYW1weyVheH0sCi0KLUBpdGVtCi1Ac2FtcHtjd2RlfSAtLS0gc2lnbi1leHRlbmQgd29yZCBpbiBAc2FtcHslYXh9IHRvIGxvbmcgaW4gQHNhbXB7JWVheH0sCi0KLUBpdGVtCi1Ac2FtcHtjd2R9IC0tLSBzaWduLWV4dGVuZCB3b3JkIGluIEBzYW1weyVheH0gdG8gbG9uZyBpbiBAc2FtcHslZHg6JWF4fSwKLQotQGl0ZW0KLUBzYW1we2NkcX0gLS0tIHNpZ24tZXh0ZW5kIGR3b3JkIGluIEBzYW1weyVlYXh9IHRvIHF1YWQgaW4gQHNhbXB7JWVkeDolZWF4fSwKLUBlbmQgaXRlbWl6ZQotCi1Abm9pbmRlbnQKLWFyZSBjYWxsZWQgQHNhbXB7Y2J0d30sIEBzYW1we2N3dGx9LCBAc2FtcHtjd3RkfSwgYW5kIEBzYW1we2NsdGR9IGluCi1BVCZUIG5hbWluZy4gIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgZWl0aGVyIG5hbWluZyBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zLgotCi1AY2luZGV4IGp1bXAgaW5zdHJ1Y3Rpb25zLCBpMzg2Ci1AY2luZGV4IGNhbGwgaW5zdHJ1Y3Rpb25zLCBpMzg2Ci1GYXIgY2FsbC9qdW1wIGluc3RydWN0aW9ucyBhcmUgQHNhbXB7bGNhbGx9IGFuZCBAc2FtcHtsam1wfSBpbgotQVQmVCBzeW50YXgsIGJ1dCBhcmUgQHNhbXB7Y2FsbCBmYXJ9IGFuZCBAc2FtcHtqdW1wIGZhcn0gaW4gSW50ZWwKLWNvbnZlbnRpb24uCi0KLUBub2RlIGkzODYtUmVncwotQHNlY3Rpb24gUmVnaXN0ZXIgTmFtaW5nCi0KLUBjaW5kZXggaTM4NiByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBpMzg2Ci1SZWdpc3RlciBvcGVyYW5kcyBhcmUgYWx3YXlzIHByZWZpeGVkIHdpdGggQHNhbXB7JX0uICBUaGUgODAzODYgcmVnaXN0ZXJzCi1jb25zaXN0IG9mCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi10aGUgOCAzMi1iaXQgcmVnaXN0ZXJzIEBzYW1weyVlYXh9ICh0aGUgYWNjdW11bGF0b3IpLCBAc2FtcHslZWJ4fSwKLUBzYW1weyVlY3h9LCBAc2FtcHslZWR4fSwgQHNhbXB7JWVkaX0sIEBzYW1weyVlc2l9LCBAc2FtcHslZWJwfSAodGhlCi1mcmFtZSBwb2ludGVyKSwgYW5kIEBzYW1weyVlc3B9ICh0aGUgc3RhY2sgcG9pbnRlcikuCi0KLUBpdGVtCi10aGUgOCAxNi1iaXQgbG93LWVuZHMgb2YgdGhlc2U6IEBzYW1weyVheH0sIEBzYW1weyVieH0sIEBzYW1weyVjeH0sCi1Ac2FtcHslZHh9LCBAc2FtcHslZGl9LCBAc2FtcHslc2l9LCBAc2FtcHslYnB9LCBhbmQgQHNhbXB7JXNwfS4KLQotQGl0ZW0KLXRoZSA4IDgtYml0IHJlZ2lzdGVyczogQHNhbXB7JWFofSwgQHNhbXB7JWFsfSwgQHNhbXB7JWJofSwKLUBzYW1weyVibH0sIEBzYW1weyVjaH0sIEBzYW1weyVjbH0sIEBzYW1weyVkaH0sIGFuZCBAc2FtcHslZGx9IChUaGVzZQotYXJlIHRoZSBoaWdoLWJ5dGVzIGFuZCBsb3ctYnl0ZXMgb2YgQHNhbXB7JWF4fSwgQHNhbXB7JWJ4fSwKLUBzYW1weyVjeH0sIGFuZCBAc2FtcHslZHh9KQotCi1AaXRlbQotdGhlIDYgc2VjdGlvbiByZWdpc3RlcnMgQHNhbXB7JWNzfSAoY29kZSBzZWN0aW9uKSwgQHNhbXB7JWRzfQotKGRhdGEgc2VjdGlvbiksIEBzYW1weyVzc30gKHN0YWNrIHNlY3Rpb24pLCBAc2FtcHslZXN9LCBAc2FtcHslZnN9LAotYW5kIEBzYW1weyVnc30uCi0KLUBpdGVtCi10aGUgMyBwcm9jZXNzb3IgY29udHJvbCByZWdpc3RlcnMgQHNhbXB7JWNyMH0sIEBzYW1weyVjcjJ9LCBhbmQKLUBzYW1weyVjcjN9LgotCi1AaXRlbQotdGhlIDYgZGVidWcgcmVnaXN0ZXJzIEBzYW1weyVkYjB9LCBAc2FtcHslZGIxfSwgQHNhbXB7JWRiMn0sCi1Ac2FtcHslZGIzfSwgQHNhbXB7JWRiNn0sIGFuZCBAc2FtcHslZGI3fS4KLQotQGl0ZW0KLXRoZSAyIHRlc3QgcmVnaXN0ZXJzIEBzYW1weyV0cjZ9IGFuZCBAc2FtcHsldHI3fS4KLQotQGl0ZW0KLXRoZSA4IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHN0YWNrIEBzYW1weyVzdH0gb3IgZXF1aXZhbGVudGx5Ci1Ac2FtcHslc3QoMCl9LCBAc2FtcHslc3QoMSl9LCBAc2FtcHslc3QoMil9LCBAc2FtcHslc3QoMyl9LAotQHNhbXB7JXN0KDQpfSwgQHNhbXB7JXN0KDUpfSwgQHNhbXB7JXN0KDYpfSwgYW5kIEBzYW1weyVzdCg3KX0uCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgaTM4Ni1QcmVmaXhlcwotQHNlY3Rpb24gSW5zdHJ1Y3Rpb24gUHJlZml4ZXMKLQotQGNpbmRleCBpMzg2IGluc3RydWN0aW9uIHByZWZpeGVzCi1AY2luZGV4IGluc3RydWN0aW9uIHByZWZpeGVzLCBpMzg2Ci1AY2luZGV4IHByZWZpeGVzLCBpMzg2Ci1JbnN0cnVjdGlvbiBwcmVmaXhlcyBhcmUgdXNlZCB0byBtb2RpZnkgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4gIFRoZXkKLWFyZSB1c2VkIHRvIHJlcGVhdCBzdHJpbmcgaW5zdHJ1Y3Rpb25zLCB0byBwcm92aWRlIHNlY3Rpb24gb3ZlcnJpZGVzLCB0bwotcGVyZm9ybSBidXMgbG9jayBvcGVyYXRpb25zLCBhbmQgdG8gY2hhbmdlIG9wZXJhbmQgYW5kIGFkZHJlc3Mgc2l6ZXMuCi0oTW9zdCBpbnN0cnVjdGlvbnMgdGhhdCBub3JtYWxseSBvcGVyYXRlIG9uIDMyLWJpdCBvcGVyYW5kcyB3aWxsIHVzZQotMTYtYml0IG9wZXJhbmRzIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgYW4gYGBvcGVyYW5kIHNpemUnJyBwcmVmaXguKQotSW5zdHJ1Y3Rpb24gcHJlZml4ZXMgYXJlIGJlc3Qgd3JpdHRlbiBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBpbnN0cnVjdGlvbgotdGhleSBhY3QgdXBvbi4gRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHtzY2FzfSAoc2NhbiBzdHJpbmcpIGluc3RydWN0aW9uIGlzCi1yZXBlYXRlZCB3aXRoOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIHJlcG5lIHNjYXMgJWVzOiglZWRpKSwlYWwKLUBlbmQgc21hbGxleGFtcGxlCi0KLVlvdSBtYXkgYWxzbyBwbGFjZSBwcmVmaXhlcyBvbiB0aGUgbGluZXMgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZQotaW5zdHJ1Y3Rpb24sIGJ1dCB0aGlzIGNpcmN1bXZlbnRzIGNoZWNrcyB0aGF0IEBjb2Rle0B2YWx1ZXtBU319IGRvZXMKLXdpdGggcHJlZml4ZXMsIGFuZCB3aWxsIG5vdCB3b3JrIHdpdGggYWxsIHByZWZpeGVzLgotCi1IZXJlIGlzIGEgbGlzdCBvZiBpbnN0cnVjdGlvbiBwcmVmaXhlczoKLQotQGNpbmRleCBzZWN0aW9uIG92ZXJyaWRlIHByZWZpeGVzLCBpMzg2Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotU2VjdGlvbiBvdmVycmlkZSBwcmVmaXhlcyBAc2FtcHtjc30sIEBzYW1we2RzfSwgQHNhbXB7c3N9LCBAc2FtcHtlc30sCi1Ac2FtcHtmc30sIEBzYW1we2dzfS4gIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IHNwZWNpZnlpbmcKLXVzaW5nIHRoZSBAdmFye3NlY3Rpb259OkB2YXJ7bWVtb3J5LW9wZXJhbmR9IGZvcm0gZm9yIG1lbW9yeSByZWZlcmVuY2VzLgotCi1AY2luZGV4IHNpemUgcHJlZml4ZXMsIGkzODYKLUBpdGVtCi1PcGVyYW5kL0FkZHJlc3Mgc2l6ZSBwcmVmaXhlcyBAc2FtcHtkYXRhMTZ9IGFuZCBAc2FtcHthZGRyMTZ9Ci1jaGFuZ2UgMzItYml0IG9wZXJhbmRzL2FkZHJlc3NlcyBpbnRvIDE2LWJpdCBvcGVyYW5kcy9hZGRyZXNzZXMsCi13aGlsZSBAc2FtcHtkYXRhMzJ9IGFuZCBAc2FtcHthZGRyMzJ9IGNoYW5nZSAxNi1iaXQgb25lcyAoaW4gYQotQGNvZGV7LmNvZGUxNn0gc2VjdGlvbikgaW50byAzMi1iaXQgb3BlcmFuZHMvYWRkcmVzc2VzLiAgVGhlc2UgcHJlZml4ZXMKLUBlbXBoe211c3R9IGFwcGVhciBvbiB0aGUgc2FtZSBsaW5lIG9mIGNvZGUgYXMgdGhlIGluc3RydWN0aW9uIHRoZXkKLW1vZGlmeS4gRm9yIGV4YW1wbGUsIGluIGEgMTYtYml0IEBjb2Rley5jb2RlMTZ9IHNlY3Rpb24sIHlvdSBtaWdodAotd3JpdGU6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgYWRkcjMyIGptcGwgKiglZWJ4KQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBidXMgbG9jayBwcmVmaXhlcywgaTM4NgotQGNpbmRleCBpbmhpYml0aW5nIGludGVycnVwdHMsIGkzODYKLUBpdGVtCi1UaGUgYnVzIGxvY2sgcHJlZml4IEBzYW1we2xvY2t9IGluaGliaXRzIGludGVycnVwdHMgZHVyaW5nIGV4ZWN1dGlvbiBvZgotdGhlIGluc3RydWN0aW9uIGl0IHByZWNlZGVzLiAgKFRoaXMgaXMgb25seSB2YWxpZCB3aXRoIGNlcnRhaW4KLWluc3RydWN0aW9uczsgc2VlIGEgODAzODYgbWFudWFsIGZvciBkZXRhaWxzKS4KLQotQGNpbmRleCBjb3Byb2Nlc3NvciB3YWl0LCBpMzg2Ci1AaXRlbQotVGhlIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHByZWZpeCBAc2FtcHt3YWl0fSB3YWl0cyBmb3IgdGhlIGNvcHJvY2Vzc29yIHRvCi1jb21wbGV0ZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gIFRoaXMgc2hvdWxkIG5ldmVyIGJlIG5lZWRlZCBmb3IgdGhlCi04MDM4Ni84MDM4NyBjb21iaW5hdGlvbi4KLQotQGNpbmRleCByZXBlYXQgcHJlZml4ZXMsIGkzODYKLUBpdGVtCi1UaGUgQHNhbXB7cmVwfSwgQHNhbXB7cmVwZX0sIGFuZCBAc2FtcHtyZXBuZX0gcHJlZml4ZXMgYXJlIGFkZGVkCi10byBzdHJpbmcgaW5zdHJ1Y3Rpb25zIHRvIG1ha2UgdGhlbSByZXBlYXQgQHNhbXB7JWVjeH0gdGltZXMgKEBzYW1weyVjeH0KLXRpbWVzIGlmIHRoZSBjdXJyZW50IGFkZHJlc3Mgc2l6ZSBpcyAxNi1iaXRzKS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBpMzg2LU1lbW9yeQotQHNlY3Rpb24gTWVtb3J5IFJlZmVyZW5jZXMKLQotQGNpbmRleCBpMzg2IG1lbW9yeSByZWZlcmVuY2VzCi1AY2luZGV4IG1lbW9yeSByZWZlcmVuY2VzLCBpMzg2Ci1BbiBJbnRlbCBzeW50YXggaW5kaXJlY3QgbWVtb3J5IHJlZmVyZW5jZSBvZiB0aGUgZm9ybQotCi1Ac21hbGxleGFtcGxlCi1AdmFye3NlY3Rpb259OltAdmFye2Jhc2V9ICsgQHZhcntpbmRleH0qQHZhcntzY2FsZX0gKyBAdmFye2Rpc3B9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pcyB0cmFuc2xhdGVkIGludG8gdGhlIEFUJlQgc3ludGF4Ci0KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7c2VjdGlvbn06QHZhcntkaXNwfShAdmFye2Jhc2V9LCBAdmFye2luZGV4fSwgQHZhcntzY2FsZX0pCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZXJlIEB2YXJ7YmFzZX0gYW5kIEB2YXJ7aW5kZXh9IGFyZSB0aGUgb3B0aW9uYWwgMzItYml0IGJhc2UgYW5kCi1pbmRleCByZWdpc3RlcnMsIEB2YXJ7ZGlzcH0gaXMgdGhlIG9wdGlvbmFsIGRpc3BsYWNlbWVudCwgYW5kCi1AdmFye3NjYWxlfSwgdGFraW5nIHRoZSB2YWx1ZXMgMSwgMiwgNCwgYW5kIDgsIG11bHRpcGxpZXMgQHZhcntpbmRleH0KLXRvIGNhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgb3BlcmFuZC4gIElmIG5vIEB2YXJ7c2NhbGV9IGlzCi1zcGVjaWZpZWQsIEB2YXJ7c2NhbGV9IGlzIHRha2VuIHRvIGJlIDEuICBAdmFye3NlY3Rpb259IHNwZWNpZmllcyB0aGUKLW9wdGlvbmFsIHNlY3Rpb24gcmVnaXN0ZXIgZm9yIHRoZSBtZW1vcnkgb3BlcmFuZCwgYW5kIG1heSBvdmVycmlkZSB0aGUKLWRlZmF1bHQgc2VjdGlvbiByZWdpc3RlciAoc2VlIGEgODAzODYgbWFudWFsIGZvciBzZWN0aW9uIHJlZ2lzdGVyCi1kZWZhdWx0cykuIE5vdGUgdGhhdCBzZWN0aW9uIG92ZXJyaWRlcyBpbiBBVCZUIHN5bnRheCBAZW1waHttdXN0fQotYmUgcHJlY2VkZWQgYnkgYSBAc2FtcHslfS4gIElmIHlvdSBzcGVjaWZ5IGEgc2VjdGlvbiBvdmVycmlkZSB3aGljaAotY29pbmNpZGVzIHdpdGggdGhlIGRlZmF1bHQgc2VjdGlvbiByZWdpc3RlciwgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBAZW1waHtub3R9Ci1vdXRwdXQgYW55IHNlY3Rpb24gcmVnaXN0ZXIgb3ZlcnJpZGUgcHJlZml4ZXMgdG8gYXNzZW1ibGUgdGhlIGdpdmVuCi1pbnN0cnVjdGlvbi4gIFRodXMsIHNlY3Rpb24gb3ZlcnJpZGVzIGNhbiBiZSBzcGVjaWZpZWQgdG8gZW1waGFzaXplIHdoaWNoCi1zZWN0aW9uIHJlZ2lzdGVyIGlzIHVzZWQgZm9yIGEgZ2l2ZW4gbWVtb3J5IG9wZXJhbmQuCi0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgSW50ZWwgYW5kIEFUJlQgc3R5bGUgbWVtb3J5IHJlZmVyZW5jZXM6Ci0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gQVQmVDogQHNhbXB7LTQoJWVicCl9LCBJbnRlbDogIEBzYW1we1tlYnAgLSA0XX0KLUB2YXJ7YmFzZX0gaXMgQHNhbXB7JWVicH07IEB2YXJ7ZGlzcH0gaXMgQHNhbXB7LTR9LiBAdmFye3NlY3Rpb259IGlzCi1taXNzaW5nLCBhbmQgdGhlIGRlZmF1bHQgc2VjdGlvbiBpcyB1c2VkIChAc2FtcHslc3N9IGZvciBhZGRyZXNzaW5nIHdpdGgKLUBzYW1weyVlYnB9IGFzIHRoZSBiYXNlIHJlZ2lzdGVyKS4gIEB2YXJ7aW5kZXh9LCBAdmFye3NjYWxlfSBhcmUgYm90aCBtaXNzaW5nLgotCi1AaXRlbSBBVCZUOiBAc2FtcHtmb28oLCVlYXgsNCl9LCBJbnRlbDogQHNhbXB7W2ZvbyArIGVheCo0XX0KLUB2YXJ7aW5kZXh9IGlzIEBzYW1weyVlYXh9IChzY2FsZWQgYnkgYSBAdmFye3NjYWxlfSA0KTsgQHZhcntkaXNwfSBpcwotQHNhbXB7Zm9vfS4gIEFsbCBvdGhlciBmaWVsZHMgYXJlIG1pc3NpbmcuICBUaGUgc2VjdGlvbiByZWdpc3RlciBoZXJlCi1kZWZhdWx0cyB0byBAc2FtcHslZHN9LgotCi1AaXRlbSBBVCZUOiBAc2FtcHtmb28oLDEpfTsgSW50ZWwgQHNhbXB7W2Zvb119Ci1UaGlzIHVzZXMgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgQHNhbXB7Zm9vfSBhcyBhIG1lbW9yeSBvcGVyYW5kLgotTm90ZSB0aGF0IEB2YXJ7YmFzZX0gYW5kIEB2YXJ7aW5kZXh9IGFyZSBib3RoIG1pc3NpbmcsIGJ1dCB0aGVyZSBpcyBvbmx5Ci1AZW1waHtvbmV9IEBzYW1weyx9LiAgVGhpcyBpcyBhIHN5bnRhY3RpYyBleGNlcHRpb24uCi0KLUBpdGVtIEFUJlQ6IEBzYW1weyVnczpmb299OyBJbnRlbCBAc2FtcHtnczpmb299Ci1UaGlzIHNlbGVjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSB2YXJpYWJsZSBAc2FtcHtmb299IHdpdGggc2VjdGlvbgotcmVnaXN0ZXIgQHZhcntzZWN0aW9ufSBiZWluZyBAc2FtcHslZ3N9LgotQGVuZCB0YWJsZQotCi1BYnNvbHV0ZSAoYXMgb3Bwb3NlZCB0byBQQyByZWxhdGl2ZSkgY2FsbCBhbmQganVtcCBvcGVyYW5kcyBtdXN0IGJlCi1wcmVmaXhlZCB3aXRoIEBzYW1weyp9LiAgSWYgbm8gQHNhbXB7Kn0gaXMgc3BlY2lmaWVkLCBAY29kZXtAdmFsdWV7QVN9fQotYWx3YXlzIGNob29zZXMgUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBmb3IganVtcC9jYWxsIGxhYmVscy4KLQotQW55IGluc3RydWN0aW9uIHRoYXQgaGFzIGEgbWVtb3J5IG9wZXJhbmQsIGJ1dCBubyByZWdpc3RlciBvcGVyYW5kLAotQGVtcGh7bXVzdH0gc3BlY2lmeSBpdHMgc2l6ZSAoYnl0ZSwgd29yZCwgb3IgbG9uZykgd2l0aCBhbiBpbnN0cnVjdGlvbgotbW5lbW9uaWMgc3VmZml4IChAc2FtcHtifSwgQHNhbXB7d30sIG9yIEBzYW1we2x9LCByZXNwZWN0aXZlbHkpLgotCi1Abm9kZSBpMzg2LWp1bXBzCi1Ac2VjdGlvbiBIYW5kbGluZyBvZiBKdW1wIEluc3RydWN0aW9ucwotCi1AY2luZGV4IGp1bXAgb3B0aW1pemF0aW9uLCBpMzg2Ci1AY2luZGV4IGkzODYganVtcCBvcHRpbWl6YXRpb24KLUp1bXAgaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgb3B0aW1pemVkIHRvIHVzZSB0aGUgc21hbGxlc3QgcG9zc2libGUKLWRpc3BsYWNlbWVudHMuICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSB1c2luZyBieXRlICg4LWJpdCkgZGlzcGxhY2VtZW50Ci1qdW1wcyB3aGVuZXZlciB0aGUgdGFyZ2V0IGlzIHN1ZmZpY2llbnRseSBjbG9zZS4gIElmIGEgYnl0ZSBkaXNwbGFjZW1lbnQKLWlzIGluc3VmZmljaWVudCBhIGxvbmcgKDMyLWJpdCkgZGlzcGxhY2VtZW50IGlzIHVzZWQuICBXZSBkbyBub3Qgc3VwcG9ydAotd29yZCAoMTYtYml0KSBkaXNwbGFjZW1lbnQganVtcHMgaW4gMzItYml0IG1vZGUgKGkuZS4gcHJlZml4aW5nIHRoZSBqdW1wCi1pbnN0cnVjdGlvbiB3aXRoIHRoZSBAc2FtcHtkYXRhMTZ9IGluc3RydWN0aW9uIHByZWZpeCksIHNpbmNlIHRoZSA4MDM4NgotaW5zaXN0cyB1cG9uIG1hc2tpbmcgQHNhbXB7JWVpcH0gdG8gMTYgYml0cyBhZnRlciB0aGUgd29yZCBkaXNwbGFjZW1lbnQKLWlzIGFkZGVkLgotCi1Ob3RlIHRoYXQgdGhlIEBzYW1we2pjeHp9LCBAc2FtcHtqZWN4en0sIEBzYW1we2xvb3B9LCBAc2FtcHtsb29wen0sCi1Ac2FtcHtsb29wZX0sIEBzYW1we2xvb3Buen0gYW5kIEBzYW1we2xvb3BuZX0gaW5zdHJ1Y3Rpb25zIG9ubHkgY29tZSBpbiBieXRlCi1kaXNwbGFjZW1lbnRzLCBzbyB0aGF0IGlmIHlvdSB1c2UgdGhlc2UgaW5zdHJ1Y3Rpb25zIChAY29kZXtAdmFsdWV7R0NDfX0gZG9lcwotbm90IHVzZSB0aGVtKSB5b3UgbWF5IGdldCBhbiBlcnJvciBtZXNzYWdlIChhbmQgaW5jb3JyZWN0IGNvZGUpLiAgVGhlIEFUJlQKLTgwMzg2IGFzc2VtYmxlciB0cmllcyB0byBnZXQgYXJvdW5kIHRoaXMgcHJvYmxlbSBieSBleHBhbmRpbmcgQHNhbXB7amN4eiBmb299Ci10bwotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICBqY3h6IGN4X3plcm8KLSAgICAgICAgIGptcCBjeF9ub256ZXJvCi1jeF96ZXJvOiBqbXAgZm9vCi1jeF9ub256ZXJvOgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgaTM4Ni1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBpMzg2IGZsb2F0aW5nIHBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBpMzg2Ci1BbGwgODAzODcgZmxvYXRpbmcgcG9pbnQgdHlwZXMgZXhjZXB0IHBhY2tlZCBCQ0QgYXJlIHN1cHBvcnRlZC4KLShCQ0Qgc3VwcG9ydCBtYXkgYmUgYWRkZWQgd2l0aG91dCBtdWNoIGRpZmZpY3VsdHkpLiAgVGhlc2UgZGF0YQotdHlwZXMgYXJlIDE2LSwgMzItLCBhbmQgNjQtIGJpdCBpbnRlZ2VycywgYW5kIHNpbmdsZSAoMzItYml0KSwKLWRvdWJsZSAoNjQtYml0KSwgYW5kIGV4dGVuZGVkICg4MC1iaXQpIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludC4KLUVhY2ggc3VwcG9ydGVkIHR5cGUgaGFzIGFuIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBhbmQgYSBjb25zdHJ1Y3RvcgotYXNzb2NpYXRlZCB3aXRoIGl0LiAgSW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgc3BlY2lmeSB0aGUgb3BlcmFuZCdzCi1kYXRhIHR5cGUuICBDb25zdHJ1Y3RvcnMgYnVpbGQgdGhlc2UgZGF0YSB0eXBlcyBpbnRvIG1lbW9yeS4KLQotQGNpbmRleCBAY29kZXtmbG9hdH0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle3NpbmdsZX0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle3RmbG9hdH0gZGlyZWN0aXZlLCBpMzg2Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotRmxvYXRpbmcgcG9pbnQgY29uc3RydWN0b3JzIGFyZSBAc2FtcHsuZmxvYXR9IG9yIEBzYW1wey5zaW5nbGV9LAotQHNhbXB7LmRvdWJsZX0sIGFuZCBAc2FtcHsudGZsb2F0fSBmb3IgMzItLCA2NC0sIGFuZCA4MC1iaXQgZm9ybWF0cy4KLVRoZXNlIGNvcnJlc3BvbmQgdG8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgQHNhbXB7c30sIEBzYW1we2x9LAotYW5kIEBzYW1we3R9LiBAc2FtcHt0fSBzdGFuZHMgZm9yIDgwLWJpdCAodGVuIGJ5dGUpIHJlYWwuICBUaGUgODAzODcKLW9ubHkgc3VwcG9ydHMgdGhpcyBmb3JtYXQgdmlhIHRoZSBAc2FtcHtmbGR0fSAobG9hZCA4MC1iaXQgcmVhbCB0byBzdGFjawotdG9wKSBhbmQgQHNhbXB7ZnN0cHR9IChzdG9yZSA4MC1iaXQgcmVhbCBhbmQgcG9wIHN0YWNrKSBpbnN0cnVjdGlvbnMuCi0KLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2xvbmd9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtxdWFkfSBkaXJlY3RpdmUsIGkzODYKLUBpdGVtCi1JbnRlZ2VyIGNvbnN0cnVjdG9ycyBhcmUgQHNhbXB7LndvcmR9LCBAc2FtcHsubG9uZ30gb3IgQHNhbXB7LmludH0sIGFuZAotQHNhbXB7LnF1YWR9IGZvciB0aGUgMTYtLCAzMi0sIGFuZCA2NC1iaXQgaW50ZWdlciBmb3JtYXRzLiAgVGhlCi1jb3JyZXNwb25kaW5nIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIGFyZSBAc2FtcHtzfSAoc2luZ2xlKSwKLUBzYW1we2x9IChsb25nKSwgYW5kIEBzYW1we3F9IChxdWFkKS4gIEFzIHdpdGggdGhlIDgwLWJpdCByZWFsIGZvcm1hdCwKLXRoZSA2NC1iaXQgQHNhbXB7cX0gZm9ybWF0IGlzIG9ubHkgcHJlc2VudCBpbiB0aGUgQHNhbXB7ZmlsZHF9IChsb2FkCi1xdWFkIGludGVnZXIgdG8gc3RhY2sgdG9wKSBhbmQgQHNhbXB7ZmlzdHBxfSAoc3RvcmUgcXVhZCBpbnRlZ2VyIGFuZCBwb3AKLXN0YWNrKSBpbnN0cnVjdGlvbnMuCi1AZW5kIGl0ZW1pemUKLQotUmVnaXN0ZXIgdG8gcmVnaXN0ZXIgb3BlcmF0aW9ucyBzaG91bGQgbm90IHVzZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcy4KLUBzYW1we2ZzdGwgJXN0LCAlc3QoMSl9IHdpbGwgZ2l2ZSBhIHdhcm5pbmcsIGFuZCBiZSBhc3NlbWJsZWQgYXMgaWYgeW91Ci13cm90ZSBAc2FtcHtmc3QgJXN0LCAlc3QoMSl9LCBzaW5jZSBhbGwgcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgb3BlcmF0aW9ucwotdXNlIDgwLWJpdCBmbG9hdGluZyBwb2ludCBvcGVyYW5kcy4gKENvbnRyYXN0IHRoaXMgd2l0aCBAc2FtcHtmc3RsICVzdCwgbWVtfSwKLXdoaWNoIGNvbnZlcnRzIEBzYW1weyVzdH0gZnJvbSA4MC1iaXQgdG8gNjQtYml0IGZsb2F0aW5nIHBvaW50IGZvcm1hdCwKLXRoZW4gc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhlIDQgYnl0ZSBsb2NhdGlvbiBAc2FtcHttZW19KQotCi1Abm9kZSBpMzg2LVNJTUQKLUBzZWN0aW9uIEludGVsJ3MgTU1YIGFuZCBBTUQncyAzRE5vdyEgU0lNRCBPcGVyYXRpb25zCi0KLUBjaW5kZXggTU1YLCBpMzg2Ci1AY2luZGV4IDNETm93ISwgaTM4NgotQGNpbmRleCBTSU1ELCBpMzg2Ci0KLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIEludGVsJ3MgTU1YIGluc3RydWN0aW9uIHNldCAoU0lNRAotaW5zdHJ1Y3Rpb25zIGZvciBpbnRlZ2VyIGRhdGEpLCBhdmFpbGFibGUgb24gSW50ZWwncyBQZW50aXVtIE1NWAotcHJvY2Vzc29ycyBhbmQgUGVudGl1bSBJSSBwcm9jZXNzb3JzLCBBTUQncyBLNiBhbmQgSzYtMiBwcm9jZXNzb3JzLAotQ3lyaXgnIE0yIHByb2Nlc3NvciwgYW5kIHByb2JhYmx5IG90aGVycy4gIEl0IGFsc28gc3VwcG9ydHMgQU1EJ3MgM0ROb3chCi1pbnN0cnVjdGlvbiBzZXQgKFNJTUQgaW5zdHJ1Y3Rpb25zIGZvciAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgZGF0YSkKLWF2YWlsYWJsZSBvbiBBTUQncyBLNi0yIHByb2Nlc3NvciBhbmQgcG9zc2libHkgb3RoZXJzIGluIHRoZSBmdXR1cmUuCi0KLUN1cnJlbnRseSwgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3Qgc3VwcG9ydCBJbnRlbCdzIGZsb2F0aW5nIHBvaW50Ci1TSU1ELCBLYXRtYWkgKEtOSSkuCi0KLVRoZSBlaWdodCA2NC1iaXQgTU1YIG9wZXJhbmRzLCBhbHNvIHVzZWQgYnkgM0ROb3chLCBhcmUgY2FsbGVkIEBzYW1weyVtbTB9LAotQHNhbXB7JW1tMX0sIC4uLiBAc2FtcHslbW03fS4gIFRoZXkgY29udGFpbiBlaWdodCA4LWJpdCBpbnRlZ2VycywgZm91cgotMTYtYml0IGludGVnZXJzLCB0d28gMzItYml0IGludGVnZXJzLCBvbmUgNjQtYml0IGludGVnZXIsIG9yIHR3byAzMi1iaXQKLWZsb2F0aW5nIHBvaW50IHZhbHVlcy4gIFRoZSBNTVggcmVnaXN0ZXJzIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUKLWFzIHRoZSBmbG9hdGluZyBwb2ludCBzdGFjay4KLQotU2VlIEludGVsIGFuZCBBTUQgZG9jdW1lbnRhdGlvbiwga2VlcGluZyBpbiBtaW5kIHRoYXQgdGhlIG9wZXJhbmQgb3JkZXIgaW4KLWluc3RydWN0aW9ucyBpcyByZXZlcnNlZCBmcm9tIHRoZSBJbnRlbCBzeW50YXguCi0KLUBub2RlIGkzODYtMTZiaXQKLUBzZWN0aW9uIFdyaXRpbmcgMTYtYml0IENvZGUKLQotQGNpbmRleCBpMzg2IDE2LWJpdCBjb2RlCi1AY2luZGV4IDE2LWJpdCBjb2RlLCBpMzg2Ci1AY2luZGV4IHJlYWwtbW9kZSBjb2RlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2NvZGUxNmdjY30gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2NvZGUxNn0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2NvZGUzMn0gZGlyZWN0aXZlLCBpMzg2Ci1XaGlsZSBAY29kZXtAdmFsdWV7QVN9fSBub3JtYWxseSB3cml0ZXMgb25seSBgYHB1cmUnJyAzMi1iaXQgaTM4NiBjb2RlLAotaXQgYWxzbyBzdXBwb3J0cyB3cml0aW5nIGNvZGUgdG8gcnVuIGluIHJlYWwgbW9kZSBvciBpbiAxNi1iaXQgcHJvdGVjdGVkCi1tb2RlIGNvZGUgc2VnbWVudHMuICBUbyBkbyB0aGlzLCBwdXQgYSBAc2FtcHsuY29kZTE2fSBvcgotQHNhbXB7LmNvZGUxNmdjY30gZGlyZWN0aXZlIGJlZm9yZSB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2UgaW5zdHJ1Y3Rpb25zIHRvCi1iZSBydW4gaW4gMTYtYml0IG1vZGUuICBZb3UgY2FuIHN3aXRjaCBAY29kZXtAdmFsdWV7QVN9fSBiYWNrIHRvIHdyaXRpbmcKLW5vcm1hbCAzMi1iaXQgY29kZSB3aXRoIHRoZSBAc2FtcHsuY29kZTMyfSBkaXJlY3RpdmUuCi0KLUBzYW1wey5jb2RlMTZnY2N9IHByb3ZpZGVzIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIDE2LWJpdAotY29kZSBmcm9tIGdjYywgYW5kIGRpZmZlcnMgZnJvbSBAc2FtcHsuY29kZTE2fSBpbiB0aGF0IEBzYW1we2NhbGx9LAotQHNhbXB7cmV0fSwgQHNhbXB7ZW50ZXJ9LCBAc2FtcHtsZWF2ZX0sIEBzYW1we3B1c2h9LCBAc2FtcHtwb3B9LAotQHNhbXB7cHVzaGF9LCBAc2FtcHtwb3BhfSwgQHNhbXB7cHVzaGZ9LCBhbmQgQHNhbXB7cG9wZn0gaW5zdHJ1Y3Rpb25zCi1kZWZhdWx0IHRvIDMyLWJpdCBzaXplLiAgVGhpcyBpcyBzbyB0aGF0IHRoZSBzdGFjayBwb2ludGVyIGlzCi1tYW5pcHVsYXRlZCBpbiB0aGUgc2FtZSB3YXkgb3ZlciBmdW5jdGlvbiBjYWxscywgYWxsb3dpbmcgYWNjZXNzIHRvCi1mdW5jdGlvbiBwYXJhbWV0ZXJzIGF0IHRoZSBzYW1lIHN0YWNrIG9mZnNldHMgYXMgaW4gMzItYml0IG1vZGUuCi1Ac2FtcHsuY29kZTE2Z2NjfSBhbHNvIGF1dG9tYXRpY2FsbHkgYWRkcyBhZGRyZXNzIHNpemUgcHJlZml4ZXMgd2hlcmUKLW5lY2Vzc2FyeSB0byB1c2UgdGhlIDMyLWJpdCBhZGRyZXNzaW5nIG1vZGVzIHRoYXQgZ2NjIGdlbmVyYXRlcy4KLQotVGhlIGNvZGUgd2hpY2ggQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIGluIDE2LWJpdCBtb2RlIHdpbGwgbm90Ci1uZWNlc3NhcmlseSBydW4gb24gYSAxNi1iaXQgcHJlLTgwMzg2IHByb2Nlc3Nvci4gIFRvIHdyaXRlIGNvZGUgdGhhdAotcnVucyBvbiBzdWNoIGEgcHJvY2Vzc29yLCB5b3UgbXVzdCByZWZyYWluIGZyb20gdXNpbmcgQGVtcGh7YW55fSAzMi1iaXQKLWNvbnN0cnVjdHMgd2hpY2ggcmVxdWlyZSBAY29kZXtAdmFsdWV7QVN9fSB0byBvdXRwdXQgYWRkcmVzcyBvciBvcGVyYW5kCi1zaXplIHByZWZpeGVzLgotCi1Ob3RlIHRoYXQgd3JpdGluZyAxNi1iaXQgY29kZSBpbnN0cnVjdGlvbnMgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIGEKLXByZWZpeCBvciBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggd2l0aGluIGEgMzItYml0IGNvZGUgc2VjdGlvbgotZ2VuZXJhdGVzIGRpZmZlcmVudCBtYWNoaW5lIGluc3RydWN0aW9ucyB0aGFuIHRob3NlIGdlbmVyYXRlZCBmb3IgYQotMTYtYml0IGNvZGUgc2VnbWVudC4gIEluIGEgMzItYml0IGNvZGUgc2VjdGlvbiwgdGhlIGZvbGxvd2luZyBjb2RlCi1nZW5lcmF0ZXMgdGhlIG1hY2hpbmUgb3Bjb2RlIGJ5dGVzIEBzYW1wezY2IDZhIDA0fSwgd2hpY2ggcHVzaGVzIHRoZQotdmFsdWUgQHNhbXB7NH0gb250byB0aGUgc3RhY2ssIGRlY3JlbWVudGluZyBAc2FtcHslZXNwfSBieSAyLgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIHB1c2h3ICQ0Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgc2FtZSBjb2RlIGluIGEgMTYtYml0IGNvZGUgc2VjdGlvbiB3b3VsZCBnZW5lcmF0ZSB0aGUgbWFjaGluZQotb3Bjb2RlIGJ5dGVzIEBzYW1wezZhIDA0fSAoaWUuIHdpdGhvdXQgdGhlIG9wZXJhbmQgc2l6ZSBwcmVmaXgpLCB3aGljaAotaXMgY29ycmVjdCBzaW5jZSB0aGUgcHJvY2Vzc29yIGRlZmF1bHQgb3BlcmFuZCBzaXplIGlzIGFzc3VtZWQgdG8gYmUgMTYKLWJpdHMgaW4gYSAxNi1iaXQgY29kZSBzZWN0aW9uLgotCi1Abm9kZSBpMzg2LUJ1Z3MKLUBzZWN0aW9uIEFUJlQgU3ludGF4IGJ1Z3MKLQotVGhlIFVuaXhXYXJlIGFzc2VtYmxlciwgYW5kIHByb2JhYmx5IG90aGVyIEFUJlQgZGVyaXZlZCBpeDg2IFVuaXgKLWFzc2VtYmxlcnMsIGdlbmVyYXRlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyB3aXRoIHJldmVyc2VkIHNvdXJjZQotYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVycyBpbiBjZXJ0YWluIGNhc2VzLiAgVW5mb3J0dW5hdGVseSwgZ2NjIGFuZAotcG9zc2libHkgbWFueSBvdGhlciBwcm9ncmFtcyB1c2UgdGhpcyByZXZlcnNlZCBzeW50YXgsIHNvIHdlJ3JlIHN0dWNrCi13aXRoIGl0LgotCi1Gb3IgZXhhbXBsZQotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIGZzdWIgJXN0LCVzdCgzKQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotcmVzdWx0cyBpbiBAc2FtcHslc3QoMyl9IGJlaW5nIHVwZGF0ZWQgdG8gQHNhbXB7JXN0IC0gJXN0KDMpfSByYXRoZXIKLXRoYW4gdGhlIGV4cGVjdGVkIEBzYW1weyVzdCgzKSAtICVzdH0uICBUaGlzIGhhcHBlbnMgd2l0aCBhbGwgdGhlCi1ub24tY29tbXV0YXRpdmUgYXJpdGhtZXRpYyBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIHdpdGggdHdvIHJlZ2lzdGVyCi1vcGVyYW5kcyB3aGVyZSB0aGUgc291cmNlIHJlZ2lzdGVyIGlzIEBzYW1weyVzdH0gYW5kIHRoZSBkZXN0aW5hdGlvbgotcmVnaXN0ZXIgaXMgQHNhbXB7JXN0KGkpfS4KLQotQG5vZGUgaTM4Ni1Ob3RlcwotQHNlY3Rpb24gTm90ZXMKLQotQGNpbmRleCBpMzg2IEBjb2Rle211bH0sIEBjb2Rle2ltdWx9IGluc3RydWN0aW9ucwotQGNpbmRleCBAY29kZXttdWx9IGluc3RydWN0aW9uLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2ltdWx9IGluc3RydWN0aW9uLCBpMzg2Ci1UaGVyZSBpcyBzb21lIHRyaWNrZXJ5IGNvbmNlcm5pbmcgdGhlIEBzYW1we211bH0gYW5kIEBzYW1we2ltdWx9Ci1pbnN0cnVjdGlvbnMgdGhhdCBkZXNlcnZlcyBtZW50aW9uLiAgVGhlIDE2LSwgMzItLCBhbmQgNjQtYml0IGV4cGFuZGluZwotbXVsdGlwbGllcyAoYmFzZSBvcGNvZGUgQHNhbXB7MHhmNn07IGV4dGVuc2lvbiA0IGZvciBAc2FtcHttdWx9IGFuZCA1Ci1mb3IgQHNhbXB7aW11bH0pIGNhbiBiZSBvdXRwdXQgb25seSBpbiB0aGUgb25lIG9wZXJhbmQgZm9ybS4gIFRodXMsCi1Ac2FtcHtpbXVsICVlYngsICVlYXh9IGRvZXMgQGVtcGh7bm90fSBzZWxlY3QgdGhlIGV4cGFuZGluZyBtdWx0aXBseTsKLXRoZSBleHBhbmRpbmcgbXVsdGlwbHkgd291bGQgY2xvYmJlciB0aGUgQHNhbXB7JWVkeH0gcmVnaXN0ZXIsIGFuZCB0aGlzCi13b3VsZCBjb25mdXNlIEBjb2Rle0B2YWx1ZXtHQ0N9fSBvdXRwdXQuICBVc2UgQHNhbXB7aW11bCAlZWJ4fSB0byBnZXQgdGhlCi02NC1iaXQgcHJvZHVjdCBpbiBAc2FtcHslZWR4OiVlYXh9LgotCi1XZSBoYXZlIGFkZGVkIGEgdHdvIG9wZXJhbmQgZm9ybSBvZiBAc2FtcHtpbXVsfSB3aGVuIHRoZSBmaXJzdCBvcGVyYW5kCi1pcyBhbiBpbW1lZGlhdGUgbW9kZSBleHByZXNzaW9uIGFuZCB0aGUgc2Vjb25kIG9wZXJhbmQgaXMgYSByZWdpc3Rlci4KLVRoaXMgaXMganVzdCBhIHNob3J0aGFuZCwgc28gdGhhdCwgbXVsdGlwbHlpbmcgQHNhbXB7JWVheH0gYnkgNjksIGZvcgotZXhhbXBsZSwgY2FuIGJlIGRvbmUgd2l0aCBAc2FtcHtpbXVsICQ2OSwgJWVheH0gcmF0aGVyIHRoYW4gQHNhbXB7aW11bAotJDY5LCAlZWF4LCAlZWF4fS4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWk5NjAudGV4aSBiL2dhcy9kb2MvYy1pOTYwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzAzMGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWk5NjAudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgaTk2MC1EZXBlbmRlbnQKLUBjaGFwdGVyIEludGVsIDgwOTYwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEludGVsIDgwOTYwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggaTk2MCBzdXBwb3J0Ci1AbWVudQotKiBPcHRpb25zLWk5NjA6OiAgICAgICAgICAgICAgICBpOTYwIENvbW1hbmQtbGluZSBPcHRpb25zCi0qIEZsb2F0aW5nIFBvaW50LWk5NjA6OiAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIERpcmVjdGl2ZXMtaTk2MDo6ICAgICAgICAgICAgIGk5NjAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIE9wY29kZXMgZm9yIGk5NjA6OiAgICAgICAgICAgIGk5NjAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBjIEZJWE1FISBBZGQgU3ludGF4IHNlYyB3aXRoIGRpc2N1c3Npb24gb2YgYml0ZmllbGRzIGhlcmUsIGF0IGxlYXN0IHNvCi1AYyBsb25nIGFzIHRoZXkncmUgbm90IHR1cm5lZCBvbiBmb3Igb3RoZXIgbWFjaGluZXMgdGhhbiA5NjAuCi0KLUBub2RlIE9wdGlvbnMtaTk2MAotCi1Ac2VjdGlvbiBpOTYwIENvbW1hbmQtbGluZSBPcHRpb25zCi0KLUBjaW5kZXggaTk2MCBvcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIGk5NjAKLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IGk5NjAgYXJjaGl0ZWN0dXJlIG9wdGlvbnMKLUBjaW5kZXggYXJjaGl0ZWN0dXJlIG9wdGlvbnMsIGk5NjAKLUBjaW5kZXggQGNvZGV7LUF9IG9wdGlvbnMsIGk5NjAKLUBpdGVtIC1BQ0EgfCAtQUNBX0EgfCAtQUNCIHwgLUFDQyB8IC1BS0EgfCAtQUtCIHwgLUFLQyB8IC1BTUMKLVNlbGVjdCB0aGUgODA5NjAgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQKLWJ5IHRoZSBzZWxlY3RlZCBhcmNoaXRlY3R1cmUgY2F1c2UgZmF0YWwgZXJyb3JzLgotCi1Ac2FtcHstQUNBfSBpcyBlcXVpdmFsZW50IHRvIEBzYW1wey1BQ0FfQX07IEBzYW1wey1BS0N9IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1wey1BTUN9LiAgU3lub255bXMgYXJlIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgdG9vbHMuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIGNvZGUKLWZvciBhbnkgaW5zdHJ1Y3Rpb24gb3IgZmVhdHVyZSB0aGF0IGlzIHN1cHBvcnRlZCBieSBAZW1waHtzb21lfSB2ZXJzaW9uIG9mIHRoZQotOTYwIChldmVuIGlmIHRoaXMgbWVhbnMgbWl4aW5nIGFyY2hpdGVjdHVyZXMhKS4gIEluIHByaW5jaXBsZSwKLUBjb2Rle0B2YWx1ZXtBU319IGF0dGVtcHRzIHRvIGRlZHVjZSB0aGUgbWluaW1hbCBzdWZmaWNpZW50IHByb2Nlc3NvciB0eXBlIGlmCi1ub25lIGlzIHNwZWNpZmllZDsgZGVwZW5kaW5nIG9uIHRoZSBvYmplY3QgY29kZSBmb3JtYXQsIHRoZSBwcm9jZXNzb3IgdHlwZSBtYXkKLWJlIHJlY29yZGVkIGluIHRoZSBvYmplY3QgZmlsZS4gIElmIGl0IGlzIGNyaXRpY2FsIHRoYXQgdGhlIEBjb2Rle0B2YWx1ZXtBU319Ci1vdXRwdXQgbWF0Y2ggYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUsIHNwZWNpZnkgdGhhdCBhcmNoaXRlY3R1cmUgZXhwbGljaXRseS4KLQotQGNpbmRleCBAY29kZXstYn0gb3B0aW9uLCBpOTYwCi1AY2luZGV4IGJyYW5jaCByZWNvcmRpbmcsIGk5NjAKLUBjaW5kZXggaTk2MCBicmFuY2ggcmVjb3JkaW5nCi1AaXRlbSAtYgotQWRkIGNvZGUgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBjb25kaXRpb25hbCBicmFuY2hlcyB0YWtlbiwgZm9yCi1sYXRlciBvcHRpbWl6YXRpb24gdXNpbmcgYnJhbmNoIHByZWRpY3Rpb24gYml0cy4gIChUaGUgY29uZGl0aW9uYWwgYnJhbmNoCi1pbnN0cnVjdGlvbnMgaGF2ZSBicmFuY2ggcHJlZGljdGlvbiBiaXRzIGluIHRoZSBDQSwgQ0IsIGFuZCBDQwotYXJjaGl0ZWN0dXJlcy4pICBJZiBAdmFye0JSfSByZXByZXNlbnRzIGEgY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uLAotdGhlIGZvbGxvd2luZyByZXByZXNlbnRzIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHdoZW4KLUBzYW1wey1ifSBpcyBzcGVjaWZpZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgY2FsbCAgICBAdmFye2luY3JlbWVudCByb3V0aW5lfQotICAgICAgICAud29yZCAgIDAgICAgICAgIyBwcmUtY291bnRlcgotTGFiZWw6ICBAdmFye0JSfQotICAgICAgICBjYWxsICAgIEB2YXJ7aW5jcmVtZW50IHJvdXRpbmV9Ci0gICAgICAgIC53b3JkICAgMCAgICAgICAjIHBvc3QtY291bnRlcgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGNvdW50ZXIgZm9sbG93aW5nIGEgYnJhbmNoIHJlY29yZHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGJyYW5jaAotd2FzIEBlbXBoe25vdH0gdGFrZW47IHRoZSBkaWZmZXJlbmMgYmV0d2VlbiB0aGUgdHdvIGNvdW50ZXJzIGlzIHRoZQotbnVtYmVyIG9mIHRpbWVzIHRoZSBicmFuY2ggQGVtcGh7d2FzfSB0YWtlbi4KLQotQGNpbmRleCBAY29kZXtnYnI5NjB9LCBpOTYwIHBvc3Rwcm9jZXNzb3IKLUBjaW5kZXggYnJhbmNoIHN0YXRpc3RpY3MgdGFibGUsIGk5NjAKLUEgdGFibGUgb2YgZXZlcnkgc3VjaCBAY29kZXtMYWJlbH0gaXMgYWxzbyBnZW5lcmF0ZWQsIHNvIHRoYXQgdGhlCi1leHRlcm5hbCBwb3N0cHJvY2Vzc29yIEBjb2Rle2dicjk2MH0gKHN1cHBsaWVkIGJ5IEludGVsKSBjYW4gbG9jYXRlIGFsbAotdGhlIGNvdW50ZXJzLiAgVGhpcyB0YWJsZSBpcyBhbHdheXMgbGFiZWxsZWQgQHNhbXB7X19CUkFOQ0hfVEFCTEVfX307Ci10aGlzIGlzIGEgbG9jYWwgc3ltYm9sIHRvIHBlcm1pdCBjb2xsZWN0aW5nIHN0YXRpc3RpY3MgZm9yIG1hbnkgc2VwYXJhdGUKLW9iamVjdCBmaWxlcy4gIFRoZSB0YWJsZSBpcyB3b3JkIGFsaWduZWQsIGFuZCBiZWdpbnMgd2l0aCBhIHR3by13b3JkCi1oZWFkZXIuICBUaGUgZmlyc3Qgd29yZCwgaW5pdGlhbGl6ZWQgdG8gMCwgaXMgdXNlZCBpbiBtYWludGFpbmluZyBsaW5rZWQKLWxpc3RzIG9mIGJyYW5jaCB0YWJsZXMuICBUaGUgc2Vjb25kIHdvcmQgaXMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mCi1lbnRyaWVzIGluIHRoZSB0YWJsZSwgd2hpY2ggZm9sbG93IGltbWVkaWF0ZWx5OiBlYWNoIGlzIGEgd29yZCwgcG9pbnRpbmcKLXRvIG9uZSBvZiB0aGUgbGFiZWxzIGlsbHVzdHJhdGVkIGFib3ZlLgotCi1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1AZXhhbXBsZQotICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsgLi4uICstLS0tLS0tLS0tLS0rCi0gfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgfCAgICAgICAgICAgIHwKLSB8ICAqTkVYVCAgICAgfCAgQ09VTlQ6IE4gIHwgKkJSTEFCIDEgICB8ICAgICB8ICpCUkxBQiBOICAgfAotIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICB8Ci0gKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAuLi4gKy0tLS0tLS0tLS0tLSsKLQotICAgICAgICAgICAgICAgX19CUkFOQ0hfVEFCTEVfXyBsYXlvdXQKLUBlbmQgZXhhbXBsZQotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AbmVlZCAyMDAwCi1AdGV4Ci1cdnNraXAgMXBjCi1cbGluZXtcbGVmdHNraXA9MHB0XGhza2lwXHRhYmxlaW5kZW50Ci1cYm94aXR7MmNtfXtcdHQgKk5FWFR9XGJveGl0ezJjbX17XHR0IENPVU5UOiBcaXQgTn1cYm94aXR7MmNtfXtcdHQKLSpCUkxBQiAxfVxpYm94ezFjbX17XHF1YWRcZG90c31cYm94aXR7MmNtfXtcdHQgKkJSTEFCIFxpdCBOfVxoZmlsfQotXGNlbnRlcmxpbmV7XGl0IHtcdHQgXF9cX0JSQU5DSFxfVEFCTEVcX1xffSBsYXlvdXR9Ci1AZW5kIHRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi0KLVRoZSBmaXJzdCB3b3JkIG9mIHRoZSBoZWFkZXIgaXMgdXNlZCB0byBsb2NhdGUgbXVsdGlwbGUgYnJhbmNoIHRhYmxlcywKLXNpbmNlIGVhY2ggb2JqZWN0IGZpbGUgbWF5IGNvbnRhaW4gb25lLiBOb3JtYWxseSB0aGUgbGlua3MgYXJlCi1tYWludGFpbmVkIHdpdGggYSBjYWxsIHRvIGFuIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIHBsYWNlZCBhdCB0aGUKLWJlZ2lubmluZyBvZiBlYWNoIGZ1bmN0aW9uIGluIHRoZSBmaWxlLiAgVGhlIEBzY3tnbnV9IEMgY29tcGlsZXIKLWdlbmVyYXRlcyB0aGVzZSBjYWxscyBhdXRvbWF0aWNhbGx5IHdoZW4geW91IGdpdmUgaXQgYSBAc2FtcHstYn0gb3B0aW9uLgotRm9yIGZ1cnRoZXIgZGV0YWlscywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEBzYW1we2dicjk2MH0uCi0KLUBjaW5kZXggQGNvZGV7LW5vLXJlbGF4fSBvcHRpb24sIGk5NjAKLUBpdGVtIC1uby1yZWxheAotTm9ybWFsbHksIENvbXBhcmUtYW5kLUJyYW5jaCBpbnN0cnVjdGlvbnMgd2l0aCB0YXJnZXRzIHRoYXQgcmVxdWlyZQotZGlzcGxhY2VtZW50cyBncmVhdGVyIHRoYW4gMTMgYml0cyAob3IgdGhhdCBoYXZlIGV4dGVybmFsIHRhcmdldHMpIGFyZQotcmVwbGFjZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJlIChvciBAc2FtcHtjaGtiaXR9KSBhbmQgYnJhbmNoCi1pbnN0cnVjdGlvbnMuICBZb3UgY2FuIHVzZSB0aGUgQHNhbXB7LW5vLXJlbGF4fSBvcHRpb24gdG8gc3BlY2lmeSB0aGF0Ci1AY29kZXtAdmFsdWV7QVN9fSBzaG91bGQgZ2VuZXJhdGUgZXJyb3JzIGluc3RlYWQsIGlmIHRoZSB0YXJnZXQgZGlzcGxhY2VtZW50Ci1pcyBsYXJnZXIgdGhhbiAxMyBiaXRzLgotCi1UaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIENvbXBhcmUtYW5kLUp1bXAgaW5zdHJ1Y3Rpb25zOyB0aGUgY29kZQotZW1pdHRlZCBmb3IgdGhlbSBpcyBAZW1waHthbHdheXN9IGFkanVzdGVkIHdoZW4gbmVjZXNzYXJ5IChkZXBlbmRpbmcgb24KLWRpc3BsYWNlbWVudCBzaXplKSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHlvdSB1c2UgQHNhbXB7LW5vLXJlbGF4fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgRmxvYXRpbmcgUG9pbnQtaTk2MAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgaTk2MCAoQHNje2llZWV9KQotQGNpbmRleCBpOTYwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1AY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIHRoZSBkaXJlY3RpdmVzCi1Ac2FtcHsuZmxvYXR9LCBAc2FtcHsuZG91YmxlfSwgQHNhbXB7LmV4dGVuZGVkfSwgYW5kIEBzYW1wey5zaW5nbGV9LgotCi1Abm9kZSBEaXJlY3RpdmVzLWk5NjAKLUBzZWN0aW9uIGk5NjAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBpOTYwCi1AY2luZGV4IGk5NjAgbWFjaGluZSBkaXJlY3RpdmVzCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtic3N9IGRpcmVjdGl2ZSwgaTk2MAotQGl0ZW0gLmJzcyBAdmFye3N5bWJvbH0sIEB2YXJ7bGVuZ3RofSwgQHZhcnthbGlnbn0KLVJlc2VydmUgQHZhcntsZW5ndGh9IGJ5dGVzIGluIHRoZSBic3Mgc2VjdGlvbiBmb3IgYSBsb2NhbCBAdmFye3N5bWJvbH0sCi1hbGlnbmVkIHRvIHRoZSBwb3dlciBvZiB0d28gc3BlY2lmaWVkIGJ5IEB2YXJ7YWxpZ259LiAgQHZhcntsZW5ndGh9IGFuZAotQHZhcnthbGlnbn0gbXVzdCBiZSBwb3NpdGl2ZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIFRoaXMgZGlyZWN0aXZlCi1kaWZmZXJzIGZyb20gQHNhbXB7Lmxjb21tfSBvbmx5IGluIHRoYXQgaXQgcGVybWl0cyB5b3UgdG8gc3BlY2lmeQotYW4gYWxpZ25tZW50LiAgQHhyZWZ7TGNvbW0sLEBjb2Rley5sY29tbX19LgotQGVuZCB0YWJsZQotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZXh0ZW5kZWR9IGRpcmVjdGl2ZSwgaTk2MAotQGl0ZW0gLmV4dGVuZGVkIEB2YXJ7ZmxvbnVtc30KLUBjb2Rley5leHRlbmRlZH0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hczsgZm9yCi1lYWNoIGZsb251bSwgQHNhbXB7LmV4dGVuZGVkfSBlbWl0cyBhbiBAc2N7aWVlZX0gZXh0ZW5kZWQtZm9ybWF0ICg4MC1iaXQpCi1mbG9hdGluZy1wb2ludCBudW1iZXIuCi0KLUBjaW5kZXggQGNvZGV7bGVhZnByb2N9IGRpcmVjdGl2ZSwgaTk2MAotQGl0ZW0gLmxlYWZwcm9jIEB2YXJ7Y2FsbC1sYWJ9LCBAdmFye2JhbC1sYWJ9Ci1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LmxlYWZwcm9jfSBkaXJlY3RpdmUgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLW9wdGltaXplZCBAY29kZXtjYWxsan0gaW5zdHJ1Y3Rpb24gdG8gZW5hYmxlIGZhc3RlciBjYWxscyBvZiBsZWFmCi1wcm9jZWR1cmVzLiAgSWYgYSBwcm9jZWR1cmUgaXMga25vd24gdG8gY2FsbCBubyBvdGhlciBwcm9jZWR1cmVzLCB5b3UKLW1heSBkZWZpbmUgYW4gZW50cnkgcG9pbnQgdGhhdCBza2lwcyBwcm9jZWR1cmUgcHJvbG9nIGNvZGUgKGFuZCB0aGF0IGRvZXMKLW5vdCBkZXBlbmQgb24gc3lzdGVtLXN1cHBsaWVkIHNhdmVkIGNvbnRleHQpLCBhbmQgZGVjbGFyZSBpdCBhcyB0aGUKLUB2YXJ7YmFsLWxhYn0gdXNpbmcgQHNhbXB7LmxlYWZwcm9jfS4gIElmIHRoZSBwcm9jZWR1cmUgYWxzbyBoYXMgYW4KLWVudHJ5IHBvaW50IHRoYXQgZ29lcyB0aHJvdWdoIHRoZSBub3JtYWwgcHJvbG9nLCB5b3UgY2FuIHNwZWNpZnkgdGhhdAotZW50cnkgcG9pbnQgYXMgQHZhcntjYWxsLWxhYn0uCi0KLUEgQHNhbXB7LmxlYWZwcm9jfSBkZWNsYXJhdGlvbiBpcyBtZWFudCBmb3IgdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi1vcHRpbWl6ZWQgY2FsbCBpbnN0cnVjdGlvbiBAc2FtcHtjYWxsan07IHRoZSBkaXJlY3RpdmUgcmVjb3JkcyB0aGUgZGF0YQotbmVlZGVkIGxhdGVyIHRvIGNob29zZSBiZXR3ZWVuIGNvbnZlcnRpbmcgdGhlIEBzYW1we2NhbGxqfSBpbnRvIGEKLUBjb2Rle2JhbH0gb3IgYSBAY29kZXtjYWxsfS4KLQotQHZhcntjYWxsLWxhYn0gaXMgb3B0aW9uYWw7IGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByZXNlbnQsIG9yIGlmIHRoZQotdHdvIGFyZ3VtZW50cyBhcmUgaWRlbnRpY2FsLCB0aGUgc2luZ2xlIGFyZ3VtZW50IGlzIGFzc3VtZWQgdG8gYmUgdGhlCi1AY29kZXtiYWx9IGVudHJ5IHBvaW50LgotCi1AY2luZGV4IEBjb2Rle3N5c3Byb2N9IGRpcmVjdGl2ZSwgaTk2MAotQGl0ZW0gLnN5c3Byb2MgQHZhcntuYW1lfSwgQHZhcntpbmRleH0KLVRoZSBAc2FtcHsuc3lzcHJvY30gZGlyZWN0aXZlIGRlZmluZXMgYSBuYW1lIGZvciBhIHN5c3RlbSBwcm9jZWR1cmUuCi1BZnRlciB5b3UgZGVmaW5lIGl0IHVzaW5nIEBzYW1wey5zeXNwcm9jfSwgeW91IGNhbiB1c2UgQHZhcntuYW1lfSB0bwotcmVmZXIgdG8gdGhlIHN5c3RlbSBwcm9jZWR1cmUgaWRlbnRpZmllZCBieSBAdmFye2luZGV4fSB3aGVuIGNhbGxpbmcKLXByb2NlZHVyZXMgd2l0aCB0aGUgb3B0aW1pemVkIGNhbGwgaW5zdHJ1Y3Rpb24gQHNhbXB7Y2FsbGp9LgotCi1Cb3RoIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQ7IEB2YXJ7aW5kZXh9IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMQotKGluY2x1c2l2ZSkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE9wY29kZXMgZm9yIGk5NjAKLUBzZWN0aW9uIGk5NjAgT3Bjb2RlcwotCi1AY2luZGV4IG9wY29kZXMsIGk5NjAKLUBjaW5kZXggaTk2MCBvcGNvZGVzCi1BbGwgSW50ZWwgOTYwIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQ7Ci1AcHhyZWZ7T3B0aW9ucy1pOTYwLCxpOTYwIENvbW1hbmQtbGluZSBPcHRpb25zfSBmb3IgYSBkaXNjdXNzaW9uIG9mCi1zZWxlY3RpbmcgdGhlIGluc3RydWN0aW9uIHN1YnNldCBmb3IgYSBwYXJ0aWN1bGFyIDk2MAotYXJjaGl0ZWN0dXJlLkByZWZpbGwKLQotU29tZSBvcGNvZGVzIGFyZSBwcm9jZXNzZWQgYmV5b25kIHNpbXBseSBlbWl0dGluZyBhIHNpbmdsZSBjb3JyZXNwb25kaW5nCi1pbnN0cnVjdGlvbjogQHNhbXB7Y2FsbGp9LCBhbmQgQ29tcGFyZS1hbmQtQnJhbmNoIG9yIENvbXBhcmUtYW5kLUp1bXAKLWluc3RydWN0aW9ucyB3aXRoIHRhcmdldCBkaXNwbGFjZW1lbnRzIGxhcmdlciB0aGFuIDEzIGJpdHMuCi0KLUBtZW51Ci0qIGNhbGxqLWk5NjA6OiAgICAgICAgICAgICAgICAgIEBjb2Rle2NhbGxqfQotKiBDb21wYXJlLWFuZC1icmFuY2gtaTk2MDo6ICAgICBDb21wYXJlLWFuZC1CcmFuY2gKLUBlbmQgbWVudQotCi1Abm9kZSBjYWxsai1pOTYwCi1Ac3Vic2VjdGlvbiBAY29kZXtjYWxsan0KLQotQGNpbmRleCBAY29kZXtjYWxsan0sIGk5NjAgcHNldWRvLW9wY29kZQotQGNpbmRleCBpOTYwIEBjb2Rle2NhbGxqfSBwc2V1ZG8tb3Bjb2RlCi1Zb3UgY2FuIHdyaXRlIEBjb2Rle2NhbGxqfSB0byBoYXZlIHRoZSBhc3NlbWJsZXIgb3IgdGhlIGxpbmtlciBkZXRlcm1pbmUKLXRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm0gb2Ygc3Vicm91dGluZSBjYWxsOiBAc2FtcHtjYWxsfSwKLUBzYW1we2JhbH0sIG9yIEBzYW1we2NhbGxzfS4gIElmIHRoZSBhc3NlbWJseSBzb3VyY2UgY29udGFpbnMKLWVub3VnaCBpbmZvcm1hdGlvbi0tLWEgQHNhbXB7LmxlYWZwcm9jfSBvciBAc2FtcHsuc3lzcHJvY30gZGlyZWN0aXZlCi1kZWZpbmluZyB0aGUgb3BlcmFuZC0tLXRoZW4gQGNvZGV7QHZhbHVle0FTfX0gdHJhbnNsYXRlcyB0aGUKLUBjb2Rle2NhbGxqfTsgaWYgbm90LCBpdCBzaW1wbHkgZW1pdHMgdGhlIEBjb2Rle2NhbGxqfSwgbGVhdmluZyBpdAotZm9yIHRoZSBsaW5rZXIgdG8gcmVzb2x2ZS4KLQotQG5vZGUgQ29tcGFyZS1hbmQtYnJhbmNoLWk5NjAKLUBzdWJzZWN0aW9uIENvbXBhcmUtYW5kLUJyYW5jaAotCi1AY2luZGV4IGk5NjAgY29tcGFyZS9icmFuY2ggaW5zdHJ1Y3Rpb25zCi1AY2luZGV4IGNvbXBhcmUvYnJhbmNoIGluc3RydWN0aW9ucywgaTk2MAotVGhlIDk2MCBhcmNoaXRlY3R1cmVzIHByb3ZpZGUgY29tYmluZWQgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9ucwotdGhhdCBwZXJtaXQgeW91IHRvIHN0b3JlIHRoZSBicmFuY2ggdGFyZ2V0IGluIHRoZSBsb3dlciAxMyBiaXRzIG9mIHRoZQotaW5zdHJ1Y3Rpb24gd29yZCBpdHNlbGYuICBIb3dldmVyLCBpZiB5b3Ugc3BlY2lmeSBhIGJyYW5jaCB0YXJnZXQgZmFyCi1lbm91Z2ggYXdheSB0aGF0IGl0cyBhZGRyZXNzIHdvbid0IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIGNhbgotZWl0aGVyIGlzc3VlIGFuIGVycm9yLCBvciBjb252ZXJ0IHlvdXIgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9uCi1pbnRvIHNlcGFyYXRlIGluc3RydWN0aW9ucyB0byBkbyB0aGUgY29tcGFyZSBhbmQgdGhlIGJyYW5jaC4KLQotQGNpbmRleCBjb21wYXJlIGFuZCBqdW1wIGV4cGFuc2lvbnMsIGk5NjAKLUBjaW5kZXggaTk2MCBjb21wYXJlIGFuZCBqdW1wIGV4cGFuc2lvbnMKLVdoZXRoZXIgQGNvZGV7QHZhbHVle0FTfX0gZ2l2ZXMgYW4gZXJyb3Igb3IgZXhwYW5kcyB0aGUgaW5zdHJ1Y3Rpb24gZGVwZW5kcwotb24gdHdvIGNob2ljZXMgeW91IGNhbiBtYWtlOiB3aGV0aGVyIHlvdSB1c2UgdGhlIEBzYW1wey1uby1yZWxheH0gb3B0aW9uLAotYW5kIHdoZXRoZXIgeW91IHVzZSBhIGBgQ29tcGFyZSBhbmQgQnJhbmNoJycgaW5zdHJ1Y3Rpb24gb3IgYSBgYENvbXBhcmUKLWFuZCBKdW1wJycgaW5zdHJ1Y3Rpb24uICBUaGUgYGBKdW1wJycgaW5zdHJ1Y3Rpb25zIGFyZSBAZW1waHthbHdheXN9Ci1leHBhbmRlZCBpZiBuZWNlc3Nhcnk7IHRoZSBgYEJyYW5jaCcnIGluc3RydWN0aW9ucyBhcmUgZXhwYW5kZWQgd2hlbgotbmVjZXNzYXJ5IEBlbXBoe3VubGVzc30geW91IHNwZWNpZnkgQGNvZGV7LW5vLXJlbGF4fS0tLWluIHdoaWNoIGNhc2UKLUBjb2Rle0B2YWx1ZXtBU319IGdpdmVzIGFuIGVycm9yIGluc3RlYWQuCi0KLVRoZXNlIGFyZSB0aGUgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9ucywgdGhlaXIgYGBKdW1wJycgdmFyaWFudHMsCi1hbmQgdGhlIGluc3RydWN0aW9uIHBhaXJzIHRoZXkgbWF5IGV4cGFuZCBpbnRvOgotCi1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1AZXhhbXBsZQotICAgICAgICBDb21wYXJlIGFuZAotICAgICBCcmFuY2ggICAgICBKdW1wICAgICAgIEV4cGFuZGVkIHRvCi0gICAgIC0tLS0tLSAgICAtLS0tLS0gICAgICAgLS0tLS0tLS0tLS0tCi0gICAgICAgIGJiYyAgICAgICAgICAgICAgICAgY2hrYml0OyBibm8KLSAgICAgICAgYmJzICAgICAgICAgICAgICAgICBjaGtiaXQ7IGJvCi0gICAgIGNtcGliZSAgICBjbXBpamUgICAgICAgY21waTsgYmUKLSAgICAgY21waWJnICAgIGNtcGlqZyAgICAgICBjbXBpOyBiZwotICAgIGNtcGliZ2UgICBjbXBpamdlICAgICAgIGNtcGk7IGJnZQotICAgICBjbXBpYmwgICAgY21waWpsICAgICAgIGNtcGk7IGJsCi0gICAgY21waWJsZSAgIGNtcGlqbGUgICAgICAgY21waTsgYmxlCi0gICAgY21waWJubyAgIGNtcGlqbm8gICAgICAgY21waTsgYm5vCi0gICAgY21waWJuZSAgIGNtcGlqbmUgICAgICAgY21waTsgYm5lCi0gICAgIGNtcGlibyAgICBjbXBpam8gICAgICAgY21waTsgYm8KLSAgICAgY21wb2JlICAgIGNtcG9qZSAgICAgICBjbXBvOyBiZQotICAgICBjbXBvYmcgICAgY21wb2pnICAgICAgIGNtcG87IGJnCi0gICAgY21wb2JnZSAgIGNtcG9qZ2UgICAgICAgY21wbzsgYmdlCi0gICAgIGNtcG9ibCAgICBjbXBvamwgICAgICAgY21wbzsgYmwKLSAgICBjbXBvYmxlICAgY21wb2psZSAgICAgICBjbXBvOyBibGUKLSAgICBjbXBvYm5lICAgY21wb2puZSAgICAgICBjbXBvOyBibmUKLUBlbmQgZXhhbXBsZQotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AdGV4Ci1caHNraXBcdGFibGVpbmRlbnQKLVxoYWxpZ257XGhmaWwge1x0dCAjfVxxdWFkJlxoZmlsIHtcdHQgI31ccXF1YWQme1x0dCAjfVxoZmlsXGNyCi1cb21pdHtcaGZpbFxpdCBDb21wYXJlIGFuZFxoZmlsfVxzcGFuXG9taXQmXGNyCi17XGl0IEJyYW5jaH0me1xpdCBKdW1wfSZ7XGl0IEV4cGFuZGVkIHRvfVxjcgotICAgICAgICBiYmMmICAgICAgICAgICAgICAgICAmIGNoa2JpdDsgYm5vXGNyCi0gICAgICAgIGJicyYgICAgICAgICAgICAgICAgICYgY2hrYml0OyBib1xjcgotICAgICBjbXBpYmUmICAgIGNtcGlqZSYgICAgICAgY21waTsgYmVcY3IKLSAgICAgY21waWJnJiAgICBjbXBpamcmICAgICAgIGNtcGk7IGJnXGNyCi0gICAgY21waWJnZSYgICBjbXBpamdlJiAgICAgICBjbXBpOyBiZ2VcY3IKLSAgICAgY21waWJsJiAgICBjbXBpamwmICAgICAgIGNtcGk7IGJsXGNyCi0gICAgY21waWJsZSYgICBjbXBpamxlJiAgICAgICBjbXBpOyBibGVcY3IKLSAgICBjbXBpYm5vJiAgIGNtcGlqbm8mICAgICAgIGNtcGk7IGJub1xjcgotICAgIGNtcGlibmUmICAgY21waWpuZSYgICAgICAgY21waTsgYm5lXGNyCi0gICAgIGNtcGlibyYgICAgY21waWpvJiAgICAgICBjbXBpOyBib1xjcgotICAgICBjbXBvYmUmICAgIGNtcG9qZSYgICAgICAgY21wbzsgYmVcY3IKLSAgICAgY21wb2JnJiAgICBjbXBvamcmICAgICAgIGNtcG87IGJnXGNyCi0gICAgY21wb2JnZSYgICBjbXBvamdlJiAgICAgICBjbXBvOyBiZ2VcY3IKLSAgICAgY21wb2JsJiAgICBjbXBvamwmICAgICAgIGNtcG87IGJsXGNyCi0gICAgY21wb2JsZSYgICBjbXBvamxlJiAgICAgICBjbXBvOyBibGVcY3IKLSAgICBjbXBvYm5lJiAgIGNtcG9qbmUmICAgICAgIGNtcG87IGJuZVxjcn0KLUBlbmQgdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1tMzJyLnRleGkgYi9nYXMvZG9jL2MtbTMyci50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI1NDU2ZC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtbTMyci50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgTTMyUi1EZXBlbmRlbnQKLUBjaGFwdGVyIE0zMlIgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTTMyUiBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IE0zMlIgc3VwcG9ydAotQG1lbnUKLSogTTMyUi1PcHRzOjogICAgICAgICAgICAgICAgICAgTTMyUiBPcHRpb25zCi0qIE0zMlItV2FybmluZ3M6OiAgICAgICAgICAgICAgIE0zMlIgV2FybmluZ3MKLUBlbmQgbWVudQotCi1Abm9kZSBNMzJSLU9wdHMKLUBzZWN0aW9uIE0zMlIgT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMsIE0zMlIKLUBjaW5kZXggTTMyUiBvcHRpb25zCi0KLVRoZSBNaXRzdWJpc2hpIE0zMlIgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQotZGVwZW5kZW50IG9wdGlvbnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLW0zMnJ4Ci1AY2luZGV4IEBzYW1wey1tMzJyeH0gb3B0aW9uLCBNMzJSWAotQGNpbmRleCBhcmNoaXRlY3R1cmUgb3B0aW9ucywgTTMyUlgKLUBjaW5kZXggTTMyUiBhcmNoaXRlY3R1cmUgb3B0aW9ucwotQGNvZGV7QHZhbHVle0FTfX0gY2FuIGFzc2VtYmxlIGNvZGUgZm9yIHNldmVyYWwgZGlmZmVyZW50IG1lbWJlcnMgb2YgdGhlCi1NaXRzdWJpc2hpIE0zMlIgZmFtaWx5LiAgTm9ybWFsbHkgdGhlIGRlZmF1bHQgaXMgdG8gYXNzZW1ibGUgY29kZSBmb3IKLXRoZSBNMzJSIG1pY3JvcHJvY2Vzc29yLiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0Ci10byB0aGUgTTMyUlggbWljcm9wcm9jZXNzb3IsIHdoaWNoIGFkZHMgc29tZSBtb3JlIGluc3RydWN0aW9ucyB0byB0aGUKLWJhc2ljIE0zMlIgaW5zdHJ1Y3Rpb24gc2V0LCBhbmQgc29tZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gc29tZSBvZgotdGhlIG9yaWdpbmFsIGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzCi1AY2luZGV4IEBzYW1wey13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0c30gb3B0aW9uLCBNMzJSWAotSW5zdHJ1Y3RzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcyB3aGVuCi1xdWVzdGlvbmFibGUgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIGFyZSBlbmNvdW50ZXJlZC4gIFRoaXMgb3B0aW9uIGlzCi1lbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBAY29kZXtAdmFsdWV7R0NDfX0gZGlzYWJsZXMgaXQgd2hlbiBpdCBpbnZva2VzCi1AY29kZXtAdmFsdWV7QVN9fSBkaXJlY3RseS4gIFF1ZXN0aW9uYWJsZSBpbnN0cnVjdGlvbnMgYXJlIHRob3NlIHdob2VzCi1iZWhhdmlvdXIgd291bGQgYmUgZGlmZmVyZW50IGlmIHRoZXkgd2VyZSBleGVjdXRlZCBzZXF1ZW50aWFsbHkuICBGb3IKLWV4YW1wbGUgdGhlIGNvZGUgZnJhZ21lbnQgQHNhbXB7bXYgcjEsIHIyIHx8IG12IHIzLCByMX0gcHJvZHVjZXMgYQotZGlmZmVyZW50IHJlc3VsdCBmcm9tIEBzYW1we212IHIxLCByMiBcbiBtdiByMywgcjF9IHNpbmNlIHRoZSBmb3JtZXIKLW1vdmVzIHIxIGludG8gcjMgYW5kIHRoZW4gcjIgaW50byByMSwgd2hlcmVhcyB0aGUgbGF0ZXIgbW92ZXMgcjIgaW50byByMQotYW5kIHIzLgotCi1AaXRlbSAtV3AKLUBjaW5kZXggQHNhbXB7LVdwfSBvcHRpb24sIE0zMlJYCi1UaGlzIGlzIGEgc2hvcnRlciBzeW5vbnltIGZvciB0aGUgQGVtcGh7LXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzfQotb3B0aW9uLgotCi1AaXRlbSAtbm8td2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHMKLUBjaW5kZXggQHNhbXB7LW5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzfSBvcHRpb24sIE0zMlJYCi1JbnN0cnVjdHMgQGNvZGV7QHZhbHVle0FTfX0gbm90IHRvIHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcyB3aGVuCi1xdWVzdGlvbmFibGUgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIGFyZSBlbmNvdW50ZXJlZC4KLQotQGl0ZW0gLVducAotQGNpbmRleCBAc2FtcHstV25wfSBvcHRpb24sIE0zMlJYCi1UaGlzIGlzIGEgc2hvcnRlciBzeW5vbnltIGZvciB0aGUgQGVtcGh7LW5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzfQotb3B0aW9uLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIE0zMlItV2FybmluZ3MKLUBzZWN0aW9uIE0zMlIgV2FybmluZ3MKLQotQGNpbmRleCB3YXJuaW5ncywgTTMyUgotQGNpbmRleCBNMzJSIHdhcm5pbmdzCi0KLVRoZXJlIGFyZSBzZXZlcmFsIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHByb2R1Y2VkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fSB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIE0zMlI6Ci0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSBvdXRwdXQgb2YgMXN0IGluc3RydWN0aW9uIGlzIHRoZSBzYW1lIGFzIGFuIGlucHV0IHRvIDJuZCBpbnN0cnVjdGlvbiAtIGlzIHRoaXMgaW50ZW50aW9uYWwgPwotVGhpcyBtZXNzYWdlIGlzIG9ubHkgcHJvZHVjZWQgaWYgd2FybmluZ3MgZm9yIGV4cGxpY2l0IHBhcmFsbGVsCi1jb25mbGljdHMgaGF2ZSBiZWVuIGVuYWJsZWQuICBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgYXNzZW1ibGVyIGhhcwotZW5jb3VudGVyZWQgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbiBpbiB3aGljaCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgb2YKLXRoZSBsZWZ0IGhhbmQgaW5zdHJ1Y3Rpb24gaXMgdXNlZCBhcyBhbiBpbnB1dCByZWdpc3RlciBpbiB0aGUgcmlnaHQgaGFuZAotaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZSBpbiB0aGlzIGNvZGUgZnJhZ21lbnQKLUBzYW1we212IHIxLCByMiB8fCBuZWcgcjMsIHIxfSByZWdpc3RlciByMSBpcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlCi1tb3ZlIGluc3RydWN0aW9uIGFuZCB0aGUgaW5wdXQgdG8gdGhlIG5lZyBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gb3V0cHV0IG9mIDJuZCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAxc3QgaW5zdHJ1Y3Rpb24gLSBpcyB0aGlzIGludGVudGlvbmFsID8KLVRoaXMgbWVzc2FnZSBpcyBvbmx5IHByb2R1Y2VkIGlmIHdhcm5pbmdzIGZvciBleHBsaWNpdCBwYXJhbGxlbAotY29uZmxpY3RzIGhhdmUgYmVlbiBlbmFibGVkLiAgSXQgaW5kaWNhdGVzIHRoYXQgdGhlIGFzc2VtYmxlciBoYXMKLWVuY291bnRlcmVkIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gaW4gd2hpY2ggdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9mCi10aGUgcmlnaHQgaGFuZCBpbnN0cnVjdGlvbiBpcyB1c2VkIGFzIGFuIGlucHV0IHJlZ2lzdGVyIGluIHRoZSBsZWZ0IGhhbmQKLWluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUgaW4gdGhpcyBjb2RlIGZyYWdtZW50Ci1Ac2FtcHttdiByMSwgcjIgfHwgbmVnIHIyLCByM30gcmVnaXN0ZXIgcjIgaXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZQotbmVnIGluc3RydWN0aW9uIGFuZCB0aGUgaW5wdXQgdG8gdGhlIG1vdmUgaW5zdHJ1Y3Rpb24uCi0KLUBpdGVtIGluc3RydWN0aW9uIEBzYW1wey4uLn0gaXMgZm9yIHRoZSBNMzJSWCBvbmx5Ci1UaGlzIG1lc3NhZ2UgaXMgcHJvZHVjZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYW4gaW5zdHJ1Y3Rpb24KLXdoaWNoIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBNMzJSeCBwcm9jZXNzb3IsIGFuZCB0aGUgQHNhbXB7LW0zMnJ4fQotY29tbWFuZCBsaW5lIGZsYWcgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCB0byBhbGxvdyBhc3NlbWJseSBvZiBzdWNoCi1pbnN0cnVjdGlvbnMuIAotCi1AaXRlbSB1bmtub3duIGluc3RydWN0aW9uIEBzYW1wey4uLn0KLVRoaXMgbWVzc2FnZSBpcyBwcm9kdWNlZCB3aGVuIHRoZSBhc3NlbWJsZXIgZW5jb3VudGVycyBhbiBpbnN0cnVjdGlvbgotd2hpY2ggaXQgZG9lIHNub3QgcmVjb2duaXNlLgotCi1AaXRlbSBvbmx5IHRoZSBOT1AgaW5zdHJ1Y3Rpb24gY2FuIGJlIGlzc3VlZCBpbiBwYXJhbGxlbCBvbiB0aGUgbTMycgotVGhpcyBtZXNzYWdlIGlzIHByb2R1Y2VkIHdoZW4gdGhlIGFzc2VtYmxlciBlbmNvdW50ZXJzIGEgcGFyYWxsZWwKLWluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IGludm9sdmUgYSBOT1AgaW5zdHJ1Y3Rpb24gYW5kIHRoZQotQHNhbXB7LW0zMnJ4fSBjb21tYW5kIGxpbmUgZmxhZyBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLiAgT25seSB0aGUgTTMyUngKLXByb2Nlc3NvciBpcyBhYmxlIHRvIGV4ZWN1dGUgdHdvIGluc3RydWN0aW9ucyBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gaW5zdHJ1Y3Rpb24gQHNhbXB7Li4ufSBjYW5ub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuCi1UaGlzIG1lc3NhZ2UgaXMgcHJvZHVjZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYSBwYXJhbGxlbAotaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbWFkZSB1cCBvZiBvbmUgb3IgdHdvIGluc3RydWN0aW9ucyB3aGljaCBjYW5ub3QgYmUKLWV4ZWN1dGVkIGluIHBhcmFsbGVsLgotCi1AaXRlbSBJbnN0cnVjdGlvbnMgc2hhcmUgdGhlIHNhbWUgZXhlY3V0aW9uIHBpcGVsaW5lCi1UaGlzIG1lc3NhZ2UgaXMgcHJvZHVjZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYSBwYXJhbGxlbAotaW5zdHJ1Y3Rpb24gd2hvZXMgY29tcG9uZW50cyBib3RoIHVzZSB0aGUgc2FtZSBleGVjdXRpb24gcGlwZWxpbmUuCi0KLUBpdGVtIEluc3RydWN0aW9ucyB3cml0ZSB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KLVRoaXMgbWVzc2FnZSBpcyBwcm9kdWNlZCB3aGVuIHRoZSBhc3NlbWJsZXIgZW5jb3VudGVycyBhIHBhcmFsbGVsCi1pbnN0cnVjdGlvbiB3aGVyZSBib3RoIGNvbXBvbmVudHMgYXR0ZW1wdCB0byBtb2RpZnkgdGhlIHNhbWUgcmVnaXN0ZXIuCi1Gb3IgZXhhbXBsZSB0aGVzZSBjb2RlIGZyYWdtZW50cyB3aWxsIHByb2R1Y2UgdGhpcyBtZXNzYWdlOgotQHNhbXB7bXYgcjEsIHIyIHx8IG5lZyByMSwgcjN9Ci1Ac2FtcHtqbCByMCB8fCBtdiByMTQsIHIxfQotQHNhbXB7c3QgcjIsIEBALXIxIHx8IG12IHIxLCByM30gCi1Ac2FtcHttdiByMSwgcjIgfHwgbGQgcjAsIEBAcjErfSAKLUBzYW1we2NtcCByMSwgcjIgfHwgYWRkeCByMywgcjR9IChCb3RoIHdyaXRlIHRvIHRoZSBjb25kaXRpb24gYml0KQotCi1AZW5kIHRhYmxlCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtbTY4ay50ZXhpIGIvZ2FzL2RvYy9jLW02OGsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmODU3Zi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtbTY4ay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE02OEstRGVwZW5kZW50Ci1AY2hhcHRlciBNNjgweDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggTTY4MHgwIHN1cHBvcnQKLUBtZW51Ci0qIE02OEstT3B0czo6ICAgICAgICAgICAgICAgICAgIE02ODB4MCBPcHRpb25zCi0qIE02OEstU3ludGF4OjogICAgICAgICAgICAgICAgIFN5bnRheAotKiBNNjhLLU1vdG8tU3ludGF4OjogICAgICAgICAgICBNb3Rvcm9sYSBTeW50YXgKLSogTTY4Sy1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogTTY4Sy1EaXJlY3RpdmVzOjogICAgICAgICAgICAgNjgweDAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIE02OEstb3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBNNjhLLU9wdHMKLUBzZWN0aW9uIE02ODB4MCBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBvcHRpb25zCi1UaGUgTW90b3JvbGEgNjgweDAgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQotZGVwZW5kZW50IG9wdGlvbnMuCi0KLUBjaW5kZXggQHNhbXB7LWx9IG9wdGlvbiwgTTY4MHgwCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LWx9IG9wdGlvbiB0byBzaG9ydGVuIHRoZSBzaXplIG9mIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkCi1zeW1ib2xzLiAgSWYgeW91IGRvIG5vdCB1c2UgdGhlIEBzYW1wey1sfSBvcHRpb24sIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkCi1zeW1ib2xzIGFyZSB3aWRlIGVub3VnaCBmb3IgYSBmdWxsIEBjb2Rle2xvbmd9ICgzMiBiaXRzKS4gIChTaW5jZQotQGNvZGV7QHZhbHVle0FTfX0gY2Fubm90IGtub3cgd2hlcmUgdGhlc2Ugc3ltYm9scyBlbmQgdXAsIEBjb2Rle0B2YWx1ZXtBU319IGNhbgotb25seSBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpbmtlciB0byBmaWxsIGluIGxhdGVyLiAgU2luY2UgQGNvZGV7QHZhbHVle0FTfX0KLWRvZXMgbm90IGtub3cgaG93IGZhciBhd2F5IHRoZXNlIHN5bWJvbHMgYXJlLCBpdCBhbGxvY2F0ZXMgYXMgbXVjaCBzcGFjZSBhcyBpdAotY2FuLikgIElmIHlvdSB1c2UgdGhpcyBvcHRpb24sIHRoZSByZWZlcmVuY2VzIGFyZSBvbmx5IG9uZSB3b3JkIHdpZGUgKDE2IGJpdHMpLgotVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZSB0byBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgYW5kCi15b3Uga25vdyB0aGF0IHRoZSByZWxldmFudCBzeW1ib2xzIGFyZSBhbHdheXMgbGVzcyB0aGFuIDE3IGJpdHMgYXdheS4KLQotQGNpbmRleCBAc2FtcHstLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbH0gb3B0aW9uLCBNNjgweDAKLUZvciBzb21lIGNvbmZpZ3VyYXRpb25zLCBlc3BlY2lhbGx5IHRob3NlIHdoZXJlIHRoZSBjb21waWxlciBub3JtYWxseQotZG9lcyBub3QgcHJlcGVuZCBhbiB1bmRlcnNjb3JlIHRvIHRoZSBuYW1lcyBvZiB1c2VyIHZhcmlhYmxlcywgdGhlCi1hc3NlbWJsZXIgcmVxdWlyZXMgYSBAc2FtcHslfSBiZWZvcmUgYW55IHVzZSBvZiBhIHJlZ2lzdGVyIG5hbWUuICBUaGlzCi1pcyBpbnRlbmRlZCB0byBsZXQgdGhlIGFzc2VtYmxlciBkaXN0aW5ndWlzaCBiZXR3ZWVuIEMgdmFyaWFibGVzIGFuZAotZnVuY3Rpb25zIG5hbWVkIEBzYW1we2EwfSB0aHJvdWdoIEBzYW1we2E3fSwgYW5kIHNvIG9uLiAgVGhlIEBzYW1weyV9IGlzCi1hbHdheXMgYWNjZXB0ZWQsIGJ1dCBpcyBub3QgcmVxdWlyZWQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMsIG5vdGFibHkKLUBzYW1we3N1bjN9LiAgVGhlIEBzYW1wey0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsfSBvcHRpb24gbWF5IGJlIHVzZWQKLXRvIHBlcm1pdCBvbWl0dGluZyB0aGUgQHNhbXB7JX0gZXZlbiBmb3IgY29uZmlndXJhdGlvbnMgZm9yIHdoaWNoIGl0IGlzCi1ub3JtYWxseSByZXF1aXJlZC4gIElmIHRoaXMgaXMgZG9uZSwgaXQgd2lsbCBnZW5lcmFsbHkgYmUgaW1wb3NzaWJsZSB0bwotcmVmZXIgdG8gQyB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWVzIGFzIHJlZ2lzdGVyCi1uYW1lcy4KLQotQGNpbmRleCBAc2FtcHstLWJpdHdpc2Utb3J9IG9wdGlvbiwgTTY4MHgwCi1Ob3JtYWxseSB0aGUgY2hhcmFjdGVyIEBzYW1we3x9IGlzIHRyZWF0ZWQgYXMgYSBjb21tZW50IGNoYXJhY3Rlciwgd2hpY2gKLW1lYW5zIHRoYXQgaXQgY2FuIG5vdCBiZSB1c2VkIGluIGV4cHJlc3Npb25zLiAgVGhlIEBzYW1wey0tYml0d2lzZS1vcn0KLW9wdGlvbiB0dXJucyBAc2FtcHt8fSBpbnRvIGEgbm9ybWFsIGNoYXJhY3Rlci4gIEluIHRoaXMgbW9kZSwgeW91IG11c3QKLWVpdGhlciB1c2UgQyBzdHlsZSBjb21tZW50cywgb3Igc3RhcnQgY29tbWVudHMgd2l0aCBhIEBzYW1weyN9IGNoYXJhY3RlcgotYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCi0KLUBjaW5kZXggQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0xNn0KLUBjaW5kZXggQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0zMn0KLUlmIHlvdSB1c2UgYW4gYWRkcmVzc2luZyBtb2RlIHdpdGggYSBiYXNlIHJlZ2lzdGVyIHdpdGhvdXQgc3BlY2lmeWluZwotdGhlIHNpemUsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgbm9ybWFsbHkgdXNlIHRoZSBmdWxsIDMyIGJpdCB2YWx1ZS4KLUZvciBleGFtcGxlLCB0aGUgYWRkcmVzc2luZyBtb2RlIEBzYW1weyVhMEBAKCVkMCl9IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1weyVhMEBAKCVkMDpsKX0uICBZb3UgbWF5IHVzZSB0aGUgQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0xNn0KLW9wdGlvbiB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRvIGRlZmF1bHQgdG8gdXNpbmcgdGhlIDE2IGJpdCB2YWx1ZS4KLUluIHRoaXMgY2FzZSwgQHNhbXB7JWEwQEAoJWQwKX0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHslYTBAQCglZDA6dyl9LgotWW91IG1heSB1c2UgdGhlIEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMzJ9IG9wdGlvbiB0byByZXN0b3JlIHRoZQotZGVmYXVsdCBiZWhhdmlvdXIuCi0KLUBjaW5kZXggQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0xNn0KLUBjaW5kZXggQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0zMn0KLUlmIHlvdSB1c2UgYW4gYWRkcmVzc2luZyBtb2RlIHdpdGggYSBkaXNwbGFjZW1lbnQsIGFuZCB0aGUgdmFsdWUgb2YgdGhlCi1kaXNwbGFjZW1lbnQgaXMgbm90IGtub3duLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIG5vcm1hbGx5IGFzc3VtZSB0aGF0Ci10aGUgdmFsdWUgaXMgMzIgYml0cy4gIEZvciBleGFtcGxlLCBpZiB0aGUgc3ltYm9sIEBzYW1we2Rpc3B9IGhhcyBub3QKLWJlZW4gZGVmaW5lZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhc3NlbWJsZSB0aGUgYWRkcmVzc2luZyBtb2RlCi1Ac2FtcHslYTBAQChkaXNwLCVkMCl9IGFzIHRob3VnaCBAc2FtcHtkaXNwfSBpcyBhIDMyIGJpdCB2YWx1ZS4gIFlvdSBtYXkKLXVzZSB0aGUgQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0xNn0gb3B0aW9uIHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0KLXRvIGluc3RlYWQgYXNzdW1lIHRoYXQgdGhlIGRpc3BsYWNlbWVudCBpcyAxNiBiaXRzLiAgSW4gdGhpcyBjYXNlLAotQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhc3NlbWJsZSBAc2FtcHslYTBAQChkaXNwLCVkMCl9IGFzIHRob3VnaAotQHNhbXB7ZGlzcH0gaXMgYSAxNiBiaXQgdmFsdWUuICBZb3UgbWF5IHVzZSB0aGUKLUBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMzJ9IG9wdGlvbiB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KLQotQGNpbmRleCBAc2FtcHstbTY4MDAwfSBhbmQgcmVsYXRlZCBvcHRpb25zCi1AY2luZGV4IGFyY2hpdGVjdHVyZSBvcHRpb25zLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGFyY2hpdGVjdHVyZSBvcHRpb25zCi1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYXNzZW1ibGUgY29kZSBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgbWVtYmVycyBvZiB0aGUKLU1vdG9yb2xhIDY4MHgwIGZhbWlseS4gIFRoZSBkZWZhdWx0IGRlcGVuZHMgdXBvbiBob3cgQGNvZGV7QHZhbHVle0FTfX0KLXdhcyBjb25maWd1cmVkIHdoZW4gaXQgd2FzIGJ1aWx0OyBub3JtYWxseSwgdGhlIGRlZmF1bHQgaXMgdG8gYXNzZW1ibGUKLWNvZGUgZm9yIHRoZSA2ODAyMCBtaWNyb3Byb2Nlc3Nvci4gIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBtYXkgYmUgdXNlZCB0bwotY2hhbmdlIHRoZSBkZWZhdWx0LiAgVGhlc2Ugb3B0aW9ucyBjb250cm9sIHdoaWNoIGluc3RydWN0aW9ucyBhbmQKLWFkZHJlc3NpbmcgbW9kZXMgYXJlIHBlcm1pdHRlZC4gIFRoZSBtZW1iZXJzIG9mIHRoZSA2ODB4MCBmYW1pbHkgYXJlCi12ZXJ5IHNpbWlsYXIuICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpZmZlcmVuY2VzLCBzZWUgdGhlCi1Nb3Rvcm9sYSBtYW51YWxzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC1tNjgwMDAKLUBpdGVteCAtbTY4ZWMwMDAKLUBpdGVteCAtbTY4aGMwMDAKLUBpdGVteCAtbTY4aGMwMDEKLUBpdGVteCAtbTY4MDA4Ci1AaXRlbXggLW02ODMwMgotQGl0ZW14IC1tNjgzMDYKLUBpdGVteCAtbTY4MzA3Ci1AaXRlbXggLW02ODMyMgotQGl0ZW14IC1tNjgzNTYKLUFzc2VtYmxlIGZvciB0aGUgNjgwMDAuIEBzYW1wey1tNjgwMDh9LCBAc2FtcHstbTY4MzAyfSwgYW5kIHNvIG9uIGFyZSBzeW5vbnltcwotZm9yIEBzYW1wey1tNjgwMDB9LCBzaW5jZSB0aGUgY2hpcHMgYXJlIHRoZSBzYW1lIGZyb20gdGhlIHBvaW50IG9mIHZpZXcKLW9mIHRoZSBhc3NlbWJsZXIuCi0KLUBpdGVtIC1tNjgwMTAKLUFzc2VtYmxlIGZvciB0aGUgNjgwMTAuCi0KLUBpdGVtIC1tNjgwMjAKLUBpdGVteCAtbTY4ZWMwMjAKLUFzc2VtYmxlIGZvciB0aGUgNjgwMjAuICBUaGlzIGlzIG5vcm1hbGx5IHRoZSBkZWZhdWx0LgotCi1AaXRlbSAtbTY4MDMwCi1AaXRlbXggLW02OGVjMDMwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDMwLgotCi1AaXRlbSAtbTY4MDQwCi1AaXRlbXggLW02OGVjMDQwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDQwLgotCi1AaXRlbSAtbTY4MDYwCi1AaXRlbXggLW02OGVjMDYwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDYwLgotCi1AaXRlbSAtbWNwdTMyCi1AaXRlbXggLW02ODMzMAotQGl0ZW14IC1tNjgzMzEKLUBpdGVteCAtbTY4MzMyCi1AaXRlbXggLW02ODMzMwotQGl0ZW14IC1tNjgzMzQKLUBpdGVteCAtbTY4MzM2Ci1AaXRlbXggLW02ODM0MAotQGl0ZW14IC1tNjgzNDEKLUBpdGVteCAtbTY4MzQ5Ci1AaXRlbXggLW02ODM2MAotQXNzZW1ibGUgZm9yIHRoZSBDUFUzMiBmYW1pbHkgb2YgY2hpcHMuCi0KLUBpdGVtIC1tNTIwMAotQXNzZW1ibGUgZm9yIHRoZSBDb2xkRmlyZSBmYW1pbHkgb2YgY2hpcHMuCi0KLUBpdGVtIC1tNjg4ODEKLUBpdGVteCAtbTY4ODgyCi1Bc3NlbWJsZSA2ODg4MSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKLTY4MDIwLCA2ODAzMCwgYW5kIHRoZSBDUFUzMi4gIFRoZSA2ODA0MCBhbmQgNjgwNjAgYWx3YXlzIHN1cHBvcnQKLWZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLW1uby02ODg4MQotRG8gbm90IGFzc2VtYmxlIDY4ODgxIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQKLWZvciA2ODAwMCBhbmQgdGhlIDY4MDEwLiAgVGhlIDY4MDQwIGFuZCA2ODA2MCBhbHdheXMgc3VwcG9ydCBmbG9hdGluZwotcG9pbnQgaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIHRoaXMgb3B0aW9uIGlzIHVzZWQuCi0KLUBpdGVtIC1tNjg4NTEKLUFzc2VtYmxlIDY4ODUxIE1NVSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUgNjgwMjAsCi02ODAzMCwgYW5kIDY4MDYwLiAgVGhlIDY4MDQwIGFjY2VwdHMgYSBzb21ld2hhdCBkaWZmZXJlbnQgc2V0IG9mIE1NVQotaW5zdHJ1Y3Rpb25zOyBAc2FtcHstbTY4ODUxfSBhbmQgQHNhbXB7LW02ODA0MH0gc2hvdWxkIG5vdCBiZSB1c2VkCi10b2dldGhlci4KLQotQGl0ZW0gLW1uby02ODg1MQotRG8gbm90IGFzc2VtYmxlIDY4ODUxIE1NVSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKLTY4MDAwLCA2ODAxMCwgYW5kIHRoZSBDUFUzMi4gIFRoZSA2ODA0MCBhY2NlcHRzIGEgc29tZXdoYXQgZGlmZmVyZW50IHNldAotb2YgTU1VIGluc3RydWN0aW9ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1TeW50YXgKLUBzZWN0aW9uIFN5bnRheAotCi1AY2luZGV4IEBzY3ttaXR9Ci1UaGlzIHN5bnRheCBmb3IgdGhlIE1vdG9yb2xhIDY4MHgwIHdhcyBkZXZlbG9wZWQgYXQgQHNje21pdH0uCi0KLUBjaW5kZXggTTY4MHgwIHN5bnRheAotQGNpbmRleCBzeW50YXgsIE02ODB4MAotQGNpbmRleCBNNjgweDAgc2l6ZSBtb2RpZmllcnMKLUBjaW5kZXggc2l6ZSBtb2RpZmllcnMsIE02ODB4MAotVGhlIDY4MHgwIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyBpbnN0cnVjdGlvbnMgbmFtZXMgYW5kCi1zeW50YXggY29tcGF0aWJsZSB3aXRoIHRoZSBTdW4gYXNzZW1ibGVyLiAgSW50ZXJ2ZW5pbmcgcGVyaW9kcyBhcmUKLWlnbm9yZWQ7IGZvciBleGFtcGxlLCBAc2FtcHttb3ZsfSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdi5sfS4KLQotSW4gdGhlIGZvbGxvd2luZyB0YWJsZSBAdmFye2FwY30gc3RhbmRzIGZvciBhbnkgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXJzCi0oQHNhbXB7JWEwfSB0aHJvdWdoIEBzYW1weyVhN30pLCB0aGUgcHJvZ3JhbSBjb3VudGVyIChAc2FtcHslcGN9KSwgdGhlCi16ZXJvLWFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXpwY30pLCBhIHN1cHByZXNzZWQKLWFkZHJlc3MgcmVnaXN0ZXIgKEBzYW1weyV6YTB9IHRocm91Z2ggQHNhbXB7JXphN30pLCBvciBpdCBtYXkgYmUgb21pdHRlZAotZW50aXJlbHkuICBUaGUgdXNlIG9mIEB2YXJ7c2l6ZX0gbWVhbnMgb25lIG9mIEBzYW1we3d9IG9yIEBzYW1we2x9LCBhbmQKLWl0IG1heSBiZSBvbWl0dGVkLCBhbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGNvbG9uLCB1bmxlc3MgYSBzY2FsZSBpcyBhbHNvCi1zcGVjaWZpZWQuICBUaGUgdXNlIG9mIEB2YXJ7c2NhbGV9IG1lYW5zIG9uZSBvZiBAc2FtcHsxfSwgQHNhbXB7Mn0sCi1Ac2FtcHs0fSwgb3IgQHNhbXB7OH0sIGFuZCBpdCBtYXkgYWx3YXlzIGJlIG9taXR0ZWQgYWxvbmcgd2l0aCB0aGUKLWxlYWRpbmcgY29sb24uCi0KLUBjaW5kZXggTTY4MHgwIGFkZHJlc3NpbmcgbW9kZXMKLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgTTY4MHgwCi1UaGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgYXJlIHVuZGVyc3Rvb2Q6Ci1AdGFibGUgQGRmbgotQGl0ZW0gSW1tZWRpYXRlCi1Ac2FtcHsjQHZhcntudW1iZXJ9fQotCi1AaXRlbSBEYXRhIFJlZ2lzdGVyCi1Ac2FtcHslZDB9IHRocm91Z2ggQHNhbXB7JWQ3fQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyCi1Ac2FtcHslYTB9IHRocm91Z2ggQHNhbXB7JWE3fUAqCi1Ac2FtcHslYTd9IGlzIGFsc28ga25vd24gYXMgQHNhbXB7JXNwfSwgaS5lLiB0aGUgU3RhY2sgUG9pbnRlci4gIEBjb2RleyVhNn0KLWlzIGFsc28ga25vd24gYXMgQHNhbXB7JWZwfSwgdGhlIEZyYW1lIFBvaW50ZXIuCi0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QKLUBzYW1weyVhMEBAfSB0aHJvdWdoIEBzYW1weyVhN0BAfQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFBvc3RpbmNyZW1lbnQKLUBzYW1weyVhMEBAK30gdGhyb3VnaCBAc2FtcHslYTdAQCt9Ci0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgUHJlZGVjcmVtZW50Ci1Ac2FtcHslYTBAQC19IHRocm91Z2ggQHNhbXB7JWE3QEAtfQotCi1AaXRlbSBJbmRpcmVjdCBQbHVzIE9mZnNldAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9KX0KLQotQGl0ZW0gSW5kZXgKLUBzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KX0KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZC4KLQotQGl0ZW0gUG9zdGluZGV4Ci1Ac2FtcHtAdmFye2FwY31AQChAdmFye251bWJlcn0pQEAoQHZhcntvbnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KX0KLQotVGhlIEB2YXJ7b251bWJlcn0gb3IgdGhlIEB2YXJ7cmVnaXN0ZXJ9LCBidXQgbm90IGJvdGgsIG1heSBiZSBvbWl0dGVkLgotCi1AaXRlbSBQcmVpbmRleAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9LEB2YXJ7cmVnaXN0ZXJ9OkB2YXJ7c2l6ZX06QHZhcntzY2FsZX0pQEAoQHZhcntvbnVtYmVyfSl9Ci0KLVRoZSBAdmFye251bWJlcn0gbWF5IGJlIG9taXR0ZWQuICBPbWl0dGluZyB0aGUgQHZhcntyZWdpc3Rlcn0gcHJvZHVjZXMKLXRoZSBQb3N0aW5kZXggYWRkcmVzc2luZyBtb2RlLgotCi1AaXRlbSBBYnNvbHV0ZQotQHNhbXB7QHZhcntzeW1ib2x9fSwgb3IgQHNhbXB7QHZhcntkaWdpdHN9fSwgb3B0aW9uYWxseSBmb2xsb3dlZCBieQotQHNhbXB7OmJ9LCBAc2FtcHs6d30sIG9yIEBzYW1wezpsfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1Nb3RvLVN5bnRheAotQHNlY3Rpb24gTW90b3JvbGEgU3ludGF4Ci0KLUBjaW5kZXggTW90b3JvbGEgc3ludGF4IGZvciB0aGUgNjgweDAKLUBjaW5kZXggYWx0ZXJuYXRlIHN5bnRheCBmb3IgdGhlIDY4MHgwCi0KLVRoZSBzdGFuZGFyZCBNb3Rvcm9sYSBzeW50YXggZm9yIHRoaXMgY2hpcCBkaWZmZXJzIGZyb20gdGhlIHN5bnRheAotYWxyZWFkeSBkaXNjdXNzZWQgKEBweHJlZntNNjhLLVN5bnRheCwsU3ludGF4fSkuICBAY29kZXtAdmFsdWV7QVN9fSBjYW4KLWFjY2VwdCBNb3Rvcm9sYSBzeW50YXggZm9yIG9wZXJhbmRzLCBldmVuIGlmIEBzY3ttaXR9IHN5bnRheCBpcyB1c2VkIGZvcgotb3RoZXIgb3BlcmFuZHMgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGUgdHdvIGtpbmRzIG9mIHN5bnRheCBhcmUKLWZ1bGx5IGNvbXBhdGlibGUuCi0KLUluIHRoZSBmb2xsb3dpbmcgdGFibGUgQHZhcnthcGN9IHN0YW5kcyBmb3IgYW55IG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVycwotKEBzYW1weyVhMH0gdGhyb3VnaCBAc2FtcHslYTd9KSwgdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXBjfSksIHRoZQotemVyby1hZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyV6cGN9KSwgb3IgYQotc3VwcHJlc3NlZCBhZGRyZXNzIHJlZ2lzdGVyIChAc2FtcHslemEwfSB0aHJvdWdoIEBzYW1weyV6YTd9KS4gIFRoZSB1c2UKLW9mIEB2YXJ7c2l6ZX0gbWVhbnMgb25lIG9mIEBzYW1we3d9IG9yIEBzYW1we2x9LCBhbmQgaXQgbWF5IGFsd2F5cyBiZQotb21pdHRlZCBhbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGRvdC4gIFRoZSB1c2Ugb2YgQHZhcntzY2FsZX0gbWVhbnMgb25lIG9mCi1Ac2FtcHsxfSwgQHNhbXB7Mn0sIEBzYW1wezR9LCBvciBAc2FtcHs4fSwgYW5kIGl0IG1heSBhbHdheXMgYmUgb21pdHRlZAotYWxvbmcgd2l0aCB0aGUgbGVhZGluZyBhc3Rlcmlzay4KLQotVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFkZHJlc3NpbmcgbW9kZXMgYXJlIHVuZGVyc3Rvb2Q6Ci0KLUB0YWJsZSBAZGZuCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIEluZGlyZWN0Ci1Ac2FtcHsoJWEwKX0gdGhyb3VnaCBAc2FtcHsoJWE3KX1AKiAKLUBzYW1weyVhN30gaXMgYWxzbyBrbm93biBhcyBAc2FtcHslc3B9LCBpLmUuIHRoZSBTdGFjayBQb2ludGVyLiAgQGNvZGV7JWE2fQotaXMgYWxzbyBrbm93biBhcyBAc2FtcHslZnB9LCB0aGUgRnJhbWUgUG9pbnRlci4KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQb3N0aW5jcmVtZW50Ci1Ac2FtcHsoJWEwKSt9IHRocm91Z2ggQHNhbXB7KCVhNykrfQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFByZWRlY3JlbWVudAotQHNhbXB7LSglYTApfSB0aHJvdWdoIEBzYW1wey0oJWE3KX0KLQotQGl0ZW0gSW5kaXJlY3QgUGx1cyBPZmZzZXQKLUBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVhMH0pfSB0aHJvdWdoIEBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVhN30pfSwKLW9yIEBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVwY30pfS4KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYWxzbyBhcHBlYXIgd2l0aGluIHRoZSBwYXJlbnRoZXNlcywgYXMgaW4KLUBzYW1weyhAdmFye251bWJlcn0sQHZhcnslYTB9KX0uICBXaGVuIHVzZWQgd2l0aCB0aGUgQHZhcntwY30sIHRoZQotQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkICh3aXRoIGFuIGFkZHJlc3MgcmVnaXN0ZXIsIG9taXR0aW5nIHRoZQotQHZhcntudW1iZXJ9IHByb2R1Y2VzIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QgbW9kZSkuCi0KLUBpdGVtIEluZGV4Ci1Ac2FtcHtAdmFye251bWJlcn0oQHZhcnthcGN9LEB2YXJ7cmVnaXN0ZXJ9LkB2YXJ7c2l6ZX0qQHZhcntzY2FsZX0pfQotCi1UaGUgQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkLCBvciBpdCBtYXkgYXBwZWFyIHdpdGhpbiB0aGUKLXBhcmVudGhlc2VzLiAgVGhlIEB2YXJ7YXBjfSBtYXkgYmUgb21pdHRlZC4gIFRoZSBAdmFye3JlZ2lzdGVyfSBhbmQgdGhlCi1AdmFye2FwY30gbWF5IGFwcGVhciBpbiBlaXRoZXIgb3JkZXIuICBJZiBib3RoIEB2YXJ7YXBjfSBhbmQKLUB2YXJ7cmVnaXN0ZXJ9IGFyZSBhZGRyZXNzIHJlZ2lzdGVycywgYW5kIHRoZSBAdmFye3NpemV9IGFuZCBAdmFye3NjYWxlfQotYXJlIG9taXR0ZWQsIHRoZW4gdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHRha2VuIGFzIHRoZSBiYXNlIHJlZ2lzdGVyLCBhbmQKLXRoZSBzZWNvbmQgYXMgdGhlIGluZGV4IHJlZ2lzdGVyLgotCi1AaXRlbSBQb3N0aW5kZXgKLUBzYW1weyhbQHZhcntudW1iZXJ9LEB2YXJ7YXBjfV0sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfSxAdmFye29udW1iZXJ9KX0KLQotVGhlIEB2YXJ7b251bWJlcn0sIG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgb3IgYm90aCwgbWF5IGJlIG9taXR0ZWQuCi1FaXRoZXIgdGhlIEB2YXJ7bnVtYmVyfSBvciB0aGUgQHZhcnthcGN9IG1heSBiZSBvbWl0dGVkLCBidXQgbm90IGJvdGguCi0KLUBpdGVtIFByZWluZGV4Ci1Ac2FtcHsoW0B2YXJ7bnVtYmVyfSxAdmFye2FwY30sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfV0sQHZhcntvbnVtYmVyfSl9Ci0KLVRoZSBAdmFye251bWJlcn0sIG9yIHRoZSBAdmFye2FwY30sIG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgb3IgYW55IHR3byBvZgotdGhlbSwgbWF5IGJlIG9taXR0ZWQuICBUaGUgQHZhcntvbnVtYmVyfSBtYXkgYmUgb21pdHRlZC4gIFRoZQotQHZhcntyZWdpc3Rlcn0gYW5kIHRoZSBAdmFye2FwY30gbWF5IGFwcGVhciBpbiBlaXRoZXIgb3JkZXIuICBJZiBib3RoCi1AdmFye2FwY30gYW5kIEB2YXJ7cmVnaXN0ZXJ9IGFyZSBhZGRyZXNzIHJlZ2lzdGVycywgYW5kIHRoZSBAdmFye3NpemV9Ci1hbmQgQHZhcntzY2FsZX0gYXJlIG9taXR0ZWQsIHRoZW4gdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHRha2VuIGFzIHRoZQotYmFzZSByZWdpc3RlciwgYW5kIHRoZSBzZWNvbmQgYXMgdGhlIGluZGV4IHJlZ2lzdGVyLgotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGZsb2F0aW5nIHBvaW50Ci1QYWNrZWQgZGVjaW1hbCAoUCkgZm9ybWF0IGZsb2F0aW5nIGxpdGVyYWxzIGFyZSBub3Qgc3VwcG9ydGVkLgotRmVlbCBmcmVlIHRvIGFkZCB0aGUgY29kZSEKLQotVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgZ2VuZXJhdGVkIGJ5IGRpcmVjdGl2ZXMgYXJlIHRoZXNlLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZmxvYXQKLUBjb2Rle1NpbmdsZX0gcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZG91YmxlCi1AY29kZXtEb3VibGV9IHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7ZXh0ZW5kfSBkaXJlY3RpdmUgTTY4MHgwCi1AY2luZGV4IEBjb2Rle2xkb3VibGV9IGRpcmVjdGl2ZSBNNjgweDAKLUBpdGVtIC5leHRlbmQKLUBpdGVteCAubGRvdWJsZQotQGNvZGV7RXh0ZW5kZWR9IHByZWNpc2lvbiAoQGNvZGV7bG9uZyBkb3VibGV9KSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstRGlyZWN0aXZlcwotQHNlY3Rpb24gNjgweDAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggTTY4MHgwIGRpcmVjdGl2ZXMKLUBjaW5kZXggZGlyZWN0aXZlcywgTTY4MHgwCi1JbiBvcmRlciB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIFN1biBhc3NlbWJsZXIgdGhlIDY4MHgwIGFzc2VtYmxlcgotdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZGF0YTF9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZGF0YTEKLVRoaXMgZGlyZWN0aXZlIGlzIGlkZW50aWNhbCB0byBhIEBjb2Rley5kYXRhIDF9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBAY29kZXtkYXRhMn0gZGlyZWN0aXZlLCBNNjgweDAKLUBpdGVtIC5kYXRhMgotVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LmRhdGEgMn0gZGlyZWN0aXZlLgotCi1AY2luZGV4IEBjb2Rle2V2ZW59IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZXZlbgotVGhpcyBkaXJlY3RpdmUgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIEBjb2Rley5hbGlnbn0gZGlyZWN0aXZlOyBpdAotYWxpZ25zIHRoZSBvdXRwdXQgdG8gYW4gZXZlbiBieXRlIGJvdW5kYXJ5LgotCi1AY2luZGV4IEBjb2Rle3NraXB9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuc2tpcAotVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuCi1AZW5kIHRhYmxlCi0KLUBuZWVkIDIwMDAKLUBub2RlIE02OEstb3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IE02ODB4MCBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMsIE02ODB4MAotQGNpbmRleCBpbnN0cnVjdGlvbiBzZXQsIE02ODB4MAotQGMgZG9jQGN5Z251cy5jb206IEkgZG9uJ3Qgc2VlIGFueSBwb2ludCBpbiB0aGUgZm9sbG93aW5nCi1AYyAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguICBCdWdzIGFyZSBidWdzOyBob3cgZG9lcyBzYXlpbmcgdGhpcwotQGMgICAgICAgICAgICAgICAgICAgaGVscCBhbnlvbmU/Ci1AaWdub3JlCi1EYW5nZXI6ICBTZXZlcmFsIGJ1Z3MgaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBvcGNvZGUgdGFibGUgKGFuZAotZml4ZWQpLiAgTW9yZSBidWdzIG1heSBleGlzdC4gIEJlIGNhcmVmdWwgd2hlbiB1c2luZyBvYnNjdXJlCi1pbnN0cnVjdGlvbnMuCi1AZW5kIGlnbm9yZQotCi1AbWVudQotKiBNNjhLLUJyYW5jaDo6ICAgICAgICAgICAgICAgICBCcmFuY2ggSW1wcm92ZW1lbnQKLSogTTY4Sy1DaGFyczo6ICAgICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi1AZW5kIG1lbnUKLQotQG5vZGUgTTY4Sy1CcmFuY2gKLUBzdWJzZWN0aW9uIEJyYW5jaCBJbXByb3ZlbWVudAotCi1AY2luZGV4IHBzZXVkby1vcGNvZGVzLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIHBzZXVkby1vcGNvZGVzCi1AY2luZGV4IGJyYW5jaCBpbXByb3ZlbWVudCwgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBicmFuY2ggaW1wcm92ZW1lbnQKLUNlcnRhaW4gcHNldWRvIG9wY29kZXMgYXJlIHBlcm1pdHRlZCBmb3IgYnJhbmNoIGluc3RydWN0aW9ucy4KLVRoZXkgZXhwYW5kIHRvIHRoZSBzaG9ydGVzdCBicmFuY2ggaW5zdHJ1Y3Rpb24gdGhhdCByZWFjaCB0aGUKLXRhcmdldC4gIEdlbmVyYWxseSB0aGVzZSBtbmVtb25pY3MgYXJlIG1hZGUgYnkgc3Vic3RpdHV0aW5nIEBzYW1we2p9IGZvcgotQHNhbXB7Yn0gYXQgdGhlIHN0YXJ0IG9mIGEgTW90b3JvbGEgbW5lbW9uaWMuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgcHNldWRvLW9wZXJhdGlvbnMuICBBIEBjb2Rleyp9IGZsYWdzCi1jYXNlcyB0aGF0IGFyZSBtb3JlIGZ1bGx5IGRlc2NyaWJlZCBhZnRlciB0aGUgdGFibGU6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICBEaXNwbGFjZW1lbnQKLSAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIHwgICAgICAgICAgICAgICAgNjgwMjAgICA2ODAwMC8xMAotUHNldWRvLU9wIHxCWVRFICAgIFdPUkQgICAgTE9ORyAgICBMT05HICAgICAgbm9uLVBDIHJlbGF0aXZlCi0gICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgamJzciB8YnNycyAgICBic3IgICAgIGJzcmwgICAganNyICAgICAgIGpzcgotICAgICAganJhIHxicmFzICAgIGJyYSAgICAgYnJhbCAgICBqbXAgICAgICAgam1wCi0qICAgICBqWFggfGJYWHMgICAgYlhYICAgICBiWFhsICAgIGJOWHM7am1wbCBiTlhzO2ptcAotKiAgICBkYlhYIHxkYlhYICAgIGRiWFggICAgICAgIGRiWFg7IGJyYTsgam1wbAotKiAgICBmalhYIHxmYlhYdyAgIGZiWFh3ICAgZmJYWGwgICAgICAgICAgICAgZmJOWHc7am1wCi0KLVhYOiBjb25kaXRpb24KLU5YOiBuZWdhdGl2ZSBvZiBjb25kaXRpb24gWFgKLQotQGVuZCBzbWFsbGV4YW1wbGUKLUBjZW50ZXIgQGNvZGV7Kn0tLS1zZWUgZnVsbCBkZXNjcmlwdGlvbiBiZWxvdwotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGpic3IKLUBpdGVteCBqcmEKLVRoZXNlIGFyZSB0aGUgc2ltcGxlc3QganVtcCBwc2V1ZG8tb3BlcmF0aW9uczsgdGhleSBhbHdheXMgbWFwIHRvIG9uZQotcGFydGljdWxhciBtYWNoaW5lIGluc3RydWN0aW9uLCBkZXBlbmRpbmcgb24gdGhlIGRpc3BsYWNlbWVudCB0byB0aGUKLWJyYW5jaCB0YXJnZXQuCi0KLUBpdGVtIGpAdmFye1hYfQotSGVyZSwgQHNhbXB7akB2YXJ7WFh9fSBzdGFuZHMgZm9yIGFuIGVudGlyZSBmYW1pbHkgb2YgcHNldWRvLW9wZXJhdGlvbnMsCi13aGVyZSBAdmFye1hYfSBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvciBjb25kaXRpb24tY29kZSB0ZXN0LiAgVGhlIGZ1bGwKLWxpc3Qgb2YgcHNldWRvLW9wcyBpbiB0aGlzIGZhbWlseSBpczoKLUBzbWFsbGV4YW1wbGUKLSBqaGkgICBqbHMgICBqY2MgICBqY3MgICBqbmUgICBqZXEgICBqdmMKLSBqdnMgICBqcGwgICBqbWkgICBqZ2UgICBqbHQgICBqZ3QgICBqbGUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUZvciB0aGUgY2FzZXMgb2Ygbm9uLVBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudHMgYW5kIGxvbmcgZGlzcGxhY2VtZW50cyBvbgotdGhlIDY4MDAwIG9yIDY4MDEwLCBAY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSBsb25nZXIgY29kZSBmcmFnbWVudCBpbiB0ZXJtcyBvZgotQHZhcntOWH0sIHRoZSBvcHBvc2l0ZSBjb25kaXRpb24gdG8gQHZhcntYWH0uICBGb3IgZXhhbXBsZSwgZm9yIHRoZQotbm9uLVBDIHJlbGF0aXZlIGNhc2U6Ci1Ac21hbGxleGFtcGxlCi0gICAgakB2YXJ7WFh9IGZvbwotQGVuZCBzbWFsbGV4YW1wbGUKLWdpdmVzCi1Ac21hbGxleGFtcGxlCi0gICAgIGJAdmFye05YfXMgb29mCi0gICAgIGptcCBmb28KLSBvb2Y6Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBkYkB2YXJ7WFh9Ci1UaGUgZnVsbCBmYW1pbHkgb2YgcHNldWRvLW9wZXJhdGlvbnMgY292ZXJlZCBoZXJlIGlzCi1Ac21hbGxleGFtcGxlCi0gZGJoaSAgIGRibHMgICBkYmNjICAgZGJjcyAgIGRibmUgICBkYmVxICAgZGJ2YwotIGRidnMgICBkYnBsICAgZGJtaSAgIGRiZ2UgICBkYmx0ICAgZGJndCAgIGRibGUKLSBkYmYgICAgZGJyYSAgIGRidAotQGVuZCBzbWFsbGV4YW1wbGUKLQotT3RoZXIgdGhhbiBmb3Igd29yZCBhbmQgYnl0ZSBkaXNwbGFjZW1lbnRzLCB3aGVuIHRoZSBzb3VyY2UgcmVhZHMKLUBzYW1we2RiQHZhcntYWH0gZm9vfSwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMKLUBzbWFsbGV4YW1wbGUKLSAgICAgZGJAdmFye1hYfSBvbzEKLSAgICAgYnJhIG9vMgotIG9vMTpqbXBsIGZvbwotIG9vMjoKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIGZqQHZhcntYWH0KLVRoaXMgZmFtaWx5IGluY2x1ZGVzCi1Ac21hbGxleGFtcGxlCi0gZmpuZSAgIGZqZXEgICBmamdlICAgZmpsdCAgIGZqZ3QgICBmamxlICAgZmpmCi0gZmp0ICAgIGZqZ2wgICBmamdsZSAgZmpuZ2UgIGZqbmdsICBmam5nbGUgZmpuZ3QKLSBmam5sZSAgZmpubHQgIGZqb2dlICBmam9nbCAgZmpvZ3QgIGZqb2xlICBmam9sdAotIGZqb3IgICBmanNlcSAgZmpzZiAgIGZqc25lICBmanN0ICAgZmp1ZXEgIGZqdWdlCi0gZmp1Z3QgIGZqdWxlICBmanVsdCAgZmp1bgotQGVuZCBzbWFsbGV4YW1wbGUKLQotRm9yIGJyYW5jaCB0YXJnZXRzIHRoYXQgYXJlIG5vdCBQQyByZWxhdGl2ZSwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMKLUBzbWFsbGV4YW1wbGUKLSAgICAgZmJAdmFye05YfSBvb2YKLSAgICAgam1wIGZvbwotIG9vZjoKLUBlbmQgc21hbGxleGFtcGxlCi13aGVuIGl0IGVuY291bnRlcnMgQHNhbXB7ZmpAdmFye1hYfSBmb299LgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IHNwZWNpYWwgY2hhcmFjdGVycywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBpbW1lZGlhdGUgY2hhcmFjdGVyCi1AY2luZGV4IGltbWVkaWF0ZSBjaGFyYWN0ZXIsIE02ODB4MAotQGNpbmRleCBNNjgweDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBNNjgweDAKLUBjaW5kZXggY29tbWVudHMsIE02ODB4MAotVGhlIGltbWVkaWF0ZSBjaGFyYWN0ZXIgaXMgQHNhbXB7I30gZm9yIFN1biBjb21wYXRpYmlsaXR5LiAgVGhlCi1saW5lLWNvbW1lbnQgY2hhcmFjdGVyIGlzIEBzYW1we3x9ICh1bmxlc3MgdGhlIEBzYW1wey0tYml0d2lzZS1vcn0KLW9wdGlvbiBpcyB1c2VkKS4gIElmIGEgQHNhbXB7I30gYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwgaXQKLWlzIHRyZWF0ZWQgYXMgYSBjb21tZW50IHVubGVzcyBpdCBsb29rcyBsaWtlIEBzYW1weyMgbGluZSBmaWxlfSwgaW4KLXdoaWNoIGNhc2UgaXQgaXMgdHJlYXRlZCBub3JtYWxseS4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW1pcHMudGV4aSBiL2dhcy9kb2MvYy1taXBzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyM2RkYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW1pcHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE1JUFMtRGVwZW5kZW50Ci1AY2hhcHRlciBNSVBTIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE1JUFMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBNSVBTIHByb2Nlc3NvcgotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0gZm9yIEBzY3ttaXBzfSBhcmNoaXRlY3R1cmVzIHN1cHBvcnRzIHNldmVyYWwKLWRpZmZlcmVudCBAc2N7bWlwc30gcHJvY2Vzc29ycywgYW5kIE1JUFMgSVNBIGxldmVscyBJIHRocm91Z2ggSVYuICBGb3IKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBAc2N7bWlwc30gaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7TUlQUyBSSVNDCi1BcmNoaXRlY3R1cmV9LCBieSBLYW5lIGFuZCBIZWluZHJpY2ggKFByZW50aWNlLUhhbGwpLiAgRm9yIGFuIG92ZXJ2aWV3Ci1vZiBAc2N7bWlwc30gYXNzZW1ibHkgY29udmVudGlvbnMsIHNlZSBgYEFwcGVuZGl4IEQ6IEFzc2VtYmx5IExhbmd1YWdlCi1Qcm9ncmFtbWluZycnIGluIHRoZSBzYW1lIHdvcmsuCi0KLUBtZW51Ci0qIE1JUFMgT3B0czo6ICAgCUFzc2VtYmxlciBvcHRpb25zCi0qIE1JUFMgT2JqZWN0OjogCUVDT0ZGIG9iamVjdCBjb2RlCi0qIE1JUFMgU3RhYnM6OiAgCURpcmVjdGl2ZXMgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotKiBNSVBTIElTQTo6ICAgIAlEaXJlY3RpdmVzIHRvIG92ZXJyaWRlIHRoZSBJU0EgbGV2ZWwKLSogTUlQUyBhdXRvZXh0ZW5kOjoJRGlyZWN0aXZlcyBmb3IgZXh0ZW5kaW5nIE1JUFMgMTYgYml0IGluc3RydWN0aW9ucwotKiBNSVBTIGluc246OgkJRGlyZWN0aXZlIHRvIG1hcmsgZGF0YSBhcyBhbiBpbnN0cnVjdGlvbgotKiBNSVBTIG9wdGlvbiBzdGFjazo6CURpcmVjdGl2ZXMgdG8gc2F2ZSBhbmQgcmVzdG9yZSBvcHRpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgTUlQUyBPcHRzCi1Ac2VjdGlvbiBBc3NlbWJsZXIgb3B0aW9ucwotCi1UaGUgQHNje21pcHN9IGNvbmZpZ3VyYXRpb25zIG9mIEBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgdGhlc2UKLXNwZWNpYWwgb3B0aW9uczoKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1HfSBvcHRpb24gKE1JUFMpCi1AaXRlbSAtRyBAdmFye251bX0KLVRoaXMgb3B0aW9uIHNldHMgdGhlIGxhcmdlc3Qgc2l6ZSBvZiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZAotaW1wbGljaXRseSB3aXRoIHRoZSBAY29kZXtncH0gcmVnaXN0ZXIuICBJdCBpcyBvbmx5IGFjY2VwdGVkIGZvciB0YXJnZXRzCi10aGF0IHVzZSBAc2N7ZWNvZmZ9IGZvcm1hdC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguCi0KLUBjaW5kZXggQGNvZGV7LUVCfSBvcHRpb24gKE1JUFMpCi1AY2luZGV4IEBjb2Rley1FTH0gb3B0aW9uIChNSVBTKQotQGNpbmRleCBNSVBTIGJpZy1lbmRpYW4gb3V0cHV0Ci1AY2luZGV4IE1JUFMgbGl0dGxlLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggYmlnLWVuZGlhbiBvdXRwdXQsIE1JUFMKLUBjaW5kZXggbGl0dGxlLWVuZGlhbiBvdXRwdXQsIE1JUFMKLUBpdGVtIC1FQgotQGl0ZW14IC1FTAotQW55IEBzY3ttaXBzfSBjb25maWd1cmF0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBzZWxlY3QgYmlnLWVuZGlhbiBvcgotbGl0dGxlLWVuZGlhbiBvdXRwdXQgYXQgcnVuIHRpbWUgKHVubGlrZSB0aGUgb3RoZXIgQHNje2dudX0gZGV2ZWxvcG1lbnQKLXRvb2xzLCB3aGljaCBtdXN0IGJlIGNvbmZpZ3VyZWQgZm9yIG9uZSBvciB0aGUgb3RoZXIpLiAgVXNlIEBzYW1wey1FQn0KLXRvIHNlbGVjdCBiaWctZW5kaWFuIG91dHB1dCwgYW5kIEBzYW1wey1FTH0gZm9yIGxpdHRsZS1lbmRpYW4uCi0KLUBjaW5kZXggTUlQUyBhcmNoaXRlY3R1cmUgb3B0aW9ucwotQGl0ZW0gLW1pcHMxCi1AaXRlbXggLW1pcHMyCi1AaXRlbXggLW1pcHMzCi1AaXRlbXggLW1pcHM0Ci1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsLgotQHNhbXB7LW1pcHMxfSBjb3JyZXNwb25kcyB0byB0aGUgQHNje3IyMDAwfSBhbmQgQHNje3IzMDAwfSBwcm9jZXNzb3JzLAotQHNhbXB7LW1pcHMyfSB0byB0aGUgQHNje3I2MDAwfSBwcm9jZXNzb3IsIEBzYW1wey1taXBzM30gdG8gdGhlCi1Ac2N7cjQwMDB9IHByb2Nlc3NvciwgYW5kIEBzYW1wey1taXBzNH0gdG8gdGhlIEBzY3tyODAwMH0gYW5kCi1Ac2N7cjEwMDAwfSBwcm9jZXNzb3JzLiAgWW91IGNhbiBhbHNvIHN3aXRjaCBpbnN0cnVjdGlvbiBzZXRzIGR1cmluZyB0aGUKLWFzc2VtYmx5OyBzZWUgQHJlZntNSVBTIElTQSwsIERpcmVjdGl2ZXMgdG8gb3ZlcnJpZGUgdGhlIElTQSBsZXZlbH0uCi0KLUBpdGVtIC1taXBzMTYKLUBpdGVteCAtbm8tbWlwczE2Ci1HZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUyAxNiBwcm9jZXNzb3IuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcHV0dGluZwotQHNhbXB7LnNldCBtaXBzMTZ9IGF0IHRoZSBzdGFydCBvZiB0aGUgYXNzZW1ibHkgZmlsZS4gIEBzYW1wey1uby1taXBzMTZ9Ci10dXJucyBvZmYgdGhpcyBvcHRpb24uCi0KLUBpdGVtIC1tNDAxMAotQGl0ZW14IC1uby1tNDAxMAotR2VuZXJhdGUgY29kZSBmb3IgdGhlIExTSSBAc2N7cjQwMTB9IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8KLWFjY2VwdCB0aGUgQHNje3I0MDEwfSBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgKEBzYW1we2FkZGNpdX0sIEBzYW1we2ZmY30sCi1ldGMuKSwgYW5kIHRvIG5vdCBzY2hlZHVsZSBAc2FtcHtub3B9IGluc3RydWN0aW9ucyBhcm91bmQgYWNjZXNzZXMgdG8KLXRoZSBAc2FtcHtISX0gYW5kIEBzYW1we0xPfSByZWdpc3RlcnMuICBAc2FtcHstbm8tbTQwMTB9IHR1cm5zIG9mZiB0aGlzCi1vcHRpb24uCi0KLUBpdGVtIC1tNDY1MAotQGl0ZW14IC1uby1tNDY1MAotR2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMgQHNje3I0NjUwfSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdAotdGhlIEBzYW1we21hZH0gYW5kIEBzYW1we21hZHV9IGluc3RydWN0aW9uLCBhbmQgdG8gbm90IHNjaGVkdWxlIEBzYW1we25vcH0KLWluc3RydWN0aW9ucyBhcm91bmQgYWNjZXNzZXMgdG8gdGhlIEBzYW1we0hJfSBhbmQgQHNhbXB7TE99IHJlZ2lzdGVycy4KLUBzYW1wey1uby1tNDY1MH0gdHVybnMgb2ZmIHRoaXMgb3B0aW9uLgotCi1AaXRlbXggLW0zOTAwCi1AaXRlbXggLW5vLW0zOTAwCi1AaXRlbXggLW00MTAwCi1AaXRlbXggLW5vLW00MTAwCi1Gb3IgZWFjaCBvcHRpb24gQHNhbXB7LW1AdmFye25ubm59fSwgZ2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMKLUBzY3tyQHZhcntubm5ufX0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQgaW5zdHJ1Y3Rpb25zCi1zcGVjaWZpYyB0byB0aGF0IGNoaXAsIGFuZCB0byBzY2hlZHVsZSBmb3IgdGhhdCBjaGlwJ3MgaGF6YXJkcy4KLQotQGl0ZW0gLW1jcHU9QHZhcntjcHV9Ci1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBjcHUuICBJdCBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8KLUBzYW1wey1tQHZhcntjcHV9fSwgZXhjZXB0IHRoYXQgdGhlcmUgYXJlIG1vcmUgdmFsdWUgb2YgQHZhcntjcHV9Ci11bmRlcnN0b29kLiAgVmFsaWQgQHZhcntjcHV9IHZhbHVlIGFyZToKLQotQHF1b3RhdGlvbgotMjAwMCwKLTMwMDAsCi0zOTAwLAotNDAwMCwKLTQwMTAsCi00MTAwLAotNDExMSwKLTQzMDAsCi00NDAwLAotNDYwMCwKLTQ2NTAsCi01MDAwLAotNjAwMCwKLTgwMDAsCi0xMDAwMAotQGVuZCBxdW90YXRpb24KLQotCi1AY2luZGV4IEBjb2Rley1ub2NwcH0gaWdub3JlZCAoTUlQUykKLUBpdGVtIC1ub2NwcAotVGhpcyBvcHRpb24gaXMgaWdub3JlZC4gIEl0IGlzIGFjY2VwdGVkIGZvciBjb21tYW5kLWxpbmUgY29tcGF0aWJpbGl0eSB3aXRoCi1vdGhlciBhc3NlbWJsZXJzLCB3aGljaCB1c2UgaXQgdG8gdHVybiBvZmYgQyBzdHlsZSBwcmVwcm9jZXNzaW5nLiAgV2l0aAotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0sIHRoZXJlIGlzIG5vIG5lZWQgZm9yIEBzYW1wey1ub2NwcH0sIGJlY2F1c2UgdGhlCi1Ac2N7Z251fSBhc3NlbWJsZXIgaXRzZWxmIG5ldmVyIHJ1bnMgdGhlIEMgcHJlcHJvY2Vzc29yLgotCi1AaXRlbSAtLXRyYXAKLUBpdGVteCAtLW5vLWJyZWFrCi1AYyBGSVhNRSEgICgxKSByZWZsZWN0IHRoZXNlIG9wdGlvbnMgKG5leHQgaXRlbSB0b28pIGluIG9wdGlvbiBzdW1tYXJpZXM7Ci1AYyAgICAgICAgICgyKSBzdG9wIHRlYXNpbmcsIHNheSBfd2hpY2hfIGluc3RydWN0aW9ucyBleHBhbmRlZCBfaG93Xy4KLUBjb2Rle0B2YWx1ZXtBU319IGF1dG9tYXRpY2FsbHkgbWFjcm8gZXhwYW5kcyBjZXJ0YWluIGRpdmlzaW9uIGFuZAotbXVsdGlwbGljYXRpb24gaW5zdHJ1Y3Rpb25zIHRvIGNoZWNrIGZvciBvdmVyZmxvdyBhbmQgZGl2aXNpb24gYnkgemVyby4gIFRoaXMKLW9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZ2VuZXJhdGUgY29kZSB0byB0YWtlIGEgdHJhcCBleGNlcHRpb24KLXJhdGhlciB0aGFuIGEgYnJlYWsgZXhjZXB0aW9uIHdoZW4gYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICBUaGUgdHJhcCBpbnN0cnVjdGlvbnMKLWFyZSBvbmx5IHN1cHBvcnRlZCBhdCBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsIDIgYW5kIGhpZ2hlci4KLQotQGl0ZW0gLS1icmVhawotQGl0ZW14IC0tbm8tdHJhcAotR2VuZXJhdGUgY29kZSB0byB0YWtlIGEgYnJlYWsgZXhjZXB0aW9uIHJhdGhlciB0aGFuIGEgdHJhcCBleGNlcHRpb24gd2hlbiBhbgotZXJyb3IgaXMgZGV0ZWN0ZWQuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBNSVBTIE9iamVjdAotQHNlY3Rpb24gTUlQUyBFQ09GRiBvYmplY3QgY29kZQotCi1AY2luZGV4IEVDT0ZGIHNlY3Rpb25zCi1AY2luZGV4IE1JUFMgRUNPRkYgc2VjdGlvbnMKLUFzc2VtYmxpbmcgZm9yIGEgQHNje21pcHN9IEBzY3tlY29mZn0gdGFyZ2V0IHN1cHBvcnRzIHNvbWUgYWRkaXRpb25hbCBzZWN0aW9ucwotYmVzaWRlcyB0aGUgdXN1YWwgQGNvZGV7LnRleHR9LCBAY29kZXsuZGF0YX0gYW5kIEBjb2Rley5ic3N9LiAgVGhlCi1hZGRpdGlvbmFsIHNlY3Rpb25zIGFyZSBAY29kZXsucmRhdGF9LCB1c2VkIGZvciByZWFkLW9ubHkgZGF0YSwKLUBjb2Rley5zZGF0YX0sIHVzZWQgZm9yIHNtYWxsIGRhdGEsIGFuZCBAY29kZXsuc2Jzc30sIHVzZWQgZm9yIHNtYWxsCi1jb21tb24gb2JqZWN0cy4KLQotQGNpbmRleCBzbWFsbCBvYmplY3RzLCBNSVBTIEVDT0ZGCi1AY2luZGV4IEBjb2Rle2dwfSByZWdpc3RlciwgTUlQUwotV2hlbiBhc3NlbWJsaW5nIGZvciBAc2N7ZWNvZmZ9LCB0aGUgYXNzZW1ibGVyIHVzZXMgdGhlIEBjb2RleyRncH0gKEBjb2RleyQyOH0pCi1yZWdpc3RlciB0byBmb3JtIHRoZSBhZGRyZXNzIG9mIGEgYGBzbWFsbCBvYmplY3QnJy4gIEFueSBvYmplY3QgaW4gdGhlCi1AY29kZXsuc2RhdGF9IG9yIEBjb2Rley5zYnNzfSBzZWN0aW9ucyBpcyBjb25zaWRlcmVkIGBgc21hbGwnJyBpbiB0aGlzIHNlbnNlLgotRm9yIGV4dGVybmFsIG9iamVjdHMsIG9yIGZvciBvYmplY3RzIGluIHRoZSBAY29kZXsuYnNzfSBzZWN0aW9uLCB5b3UgY2FuIHVzZQotdGhlIEBjb2Rle0B2YWx1ZXtHQ0N9fSBAc2FtcHstR30gb3B0aW9uIHRvIGNvbnRyb2wgdGhlIHNpemUgb2Ygb2JqZWN0cyBhZGRyZXNzZWQgdmlhCi1AY29kZXskZ3B9OyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyA4LCBtZWFuaW5nIHRoYXQgYSByZWZlcmVuY2UgdG8gYW55IG9iamVjdAotZWlnaHQgYnl0ZXMgb3Igc21hbGxlciB1c2VzIEBjb2RleyRncH0uICBQYXNzaW5nIEBzYW1wey1HIDB9IHRvCi1AY29kZXtAdmFsdWV7QVN9fSBwcmV2ZW50cyBpdCBmcm9tIHVzaW5nIHRoZSBAY29kZXskZ3B9IHJlZ2lzdGVyIG9uIHRoZSBiYXNpcwotb2Ygb2JqZWN0IHNpemUgKGJ1dCB0aGUgYXNzZW1ibGVyIHVzZXMgQGNvZGV7JGdwfSBmb3Igb2JqZWN0cyBpbiBAY29kZXsuc2RhdGF9Ci1vciBAY29kZXtzYnNzfSBpbiBhbnkgY2FzZSkuICBUaGUgc2l6ZSBvZiBhbiBvYmplY3QgaW4gdGhlIEBjb2Rley5ic3N9IHNlY3Rpb24KLWlzIHNldCBieSB0aGUgQGNvZGV7LmNvbW19IG9yIEBjb2Rley5sY29tbX0gZGlyZWN0aXZlIHRoYXQgZGVmaW5lcyBpdC4gIFRoZQotc2l6ZSBvZiBhbiBleHRlcm5hbCBvYmplY3QgbWF5IGJlIHNldCB3aXRoIHRoZSBAY29kZXsuZXh0ZXJufSBkaXJlY3RpdmUuICBGb3IKLWV4YW1wbGUsIEBzYW1wey5leHRlcm4gc3ltLDR9IGRlY2xhcmVzIHRoYXQgdGhlIG9iamVjdCBhdCBAY29kZXtzeW19IGlzIDQgYnl0ZXMKLWluIGxlbmd0aCwgd2hpZSBsZWF2aW5nIEBjb2Rle3N5bX0gb3RoZXJ3aXNlIHVuZGVmaW5lZC4KLQotVXNpbmcgc21hbGwgQHNje2Vjb2ZmfSBvYmplY3RzIHJlcXVpcmVzIGxpbmtlciBzdXBwb3J0LCBhbmQgYXNzdW1lcyB0aGF0IHRoZQotQGNvZGV7JGdwfSByZWdpc3RlciBpcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgKG5vcm1hbGx5IGRvbmUgYXV0b21hdGljYWxseSBieQotdGhlIHN0YXJ0dXAgY29kZSkuICBAc2N7bWlwc30gQHNje2Vjb2ZmfSBhc3NlbWJseSBjb2RlIG11c3Qgbm90IG1vZGlmeSB0aGUKLUBjb2RleyRncH0gcmVnaXN0ZXIuCi0KLUBub2RlIE1JUFMgU3RhYnMKLUBzZWN0aW9uIERpcmVjdGl2ZXMgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCi1AY2luZGV4IE1JUFMgZGVidWdnaW5nIGRpcmVjdGl2ZXMKLUBzY3ttaXBzfSBAc2N7ZWNvZmZ9IEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHNldmVyYWwgZGlyZWN0aXZlcyB1c2VkIGZvcgotZ2VuZXJhdGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hpY2ggYXJlIG5vdCBzdXBwb3J0IGJ5IHRyYWRpdGlvbmFsIEBzY3ttaXBzfQotYXNzZW1ibGVycy4gIFRoZXNlIGFyZSBAY29kZXsuZGVmfSwgQGNvZGV7LmVuZGVmfSwgQGNvZGV7LmRpbX0sIEBjb2Rley5maWxlfSwKLUBjb2Rley5zY2x9LCBAY29kZXsuc2l6ZX0sIEBjb2Rley50YWd9LCBAY29kZXsudHlwZX0sIEBjb2Rley52YWx9LAotQGNvZGV7LnN0YWJkfSwgQGNvZGV7LnN0YWJufSwgYW5kIEBjb2Rley5zdGFic30uICBUaGUgZGVidWdnaW5nIGluZm9ybWF0aW9uCi1nZW5lcmF0ZWQgYnkgdGhlIHRocmVlIEBjb2Rley5zdGFifSBkaXJlY3RpdmVzIGNhbiBvbmx5IGJlIHJlYWQgYnkgQHNje2dkYn0sCi1ub3QgYnkgdHJhZGl0aW9uYWwgQHNje21pcHN9IGRlYnVnZ2VycyAodGhpcyBlbmhhbmNlbWVudCBpcyByZXF1aXJlZCB0byBmdWxseQotc3VwcG9ydCBDKysgZGVidWdnaW5nKS4gIFRoZXNlIGRpcmVjdGl2ZXMgYXJlIHByaW1hcmlseSB1c2VkIGJ5IGNvbXBpbGVycywgbm90Ci1hc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycyEKLQotQG5vZGUgTUlQUyBJU0EKLUBzZWN0aW9uIERpcmVjdGl2ZXMgdG8gb3ZlcnJpZGUgdGhlIElTQSBsZXZlbAotCi1AY2luZGV4IE1JUFMgSVNBIG92ZXJyaWRlCi1Aa2luZGV4IEBjb2Rley5zZXQgbWlwc0B2YXJ7bn19Ci1Ac2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBhbiBhZGRpdGlvbmFsIGRpcmVjdGl2ZSB0byBjaGFuZ2UKLXRoZSBAc2N7bWlwc30gSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbCBvbiB0aGUgZmx5OiBAY29kZXsuc2V0Ci1taXBzQHZhcntufX0uICBAdmFye259IHNob3VsZCBiZSBhIG51bWJlciBmcm9tIDAgdG8gNC4gIEEgdmFsdWUgZnJvbSAxCi10byA0IG1ha2VzIHRoZSBhc3NlbWJsZXIgYWNjZXB0IGluc3RydWN0aW9ucyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKLUBzY3tpc2F9IGxldmVsLCBmcm9tIHRoYXQgcG9pbnQgb24gaW4gdGhlIGFzc2VtYmx5LiAgQGNvZGV7LnNldAotbWlwc0B2YXJ7bn19IGFmZmVjdHMgbm90IG9ubHkgd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZSBwZXJtaXR0ZWQsIGJ1dCBhbHNvCi1ob3cgY2VydGFpbiBtYWNyb3MgYXJlIGV4cGFuZGVkLiAgQGNvZGV7LnNldCBtaXBzMH0gcmVzdG9yZXMgdGhlCi1Ac2N7aXNhfSBsZXZlbCB0byBpdHMgb3JpZ2luYWwgbGV2ZWw6IGVpdGhlciB0aGUgbGV2ZWwgeW91IHNlbGVjdGVkIHdpdGgKLWNvbW1hbmQgbGluZSBvcHRpb25zLCBvciB0aGUgZGVmYXVsdCBmb3IgeW91ciBjb25maWd1cmF0aW9uLiAgWW91IGNhbgotdXNlIHRoaXMgZmVhdHVyZSB0byBwZXJtaXQgc3BlY2lmaWMgQHNje3I0MDAwfSBpbnN0cnVjdGlvbnMgd2hpbGUKLWFzc2VtYmxpbmcgaW4gMzIgYml0IG1vZGUuICBVc2UgdGhpcyBkaXJlY3RpdmUgd2l0aCBjYXJlIQotCi1UaGUgZGlyZWN0aXZlIEBzYW1wey5zZXQgbWlwczE2fSBwdXRzIHRoZSBhc3NlbWJsZXIgaW50byBNSVBTIDE2IG1vZGUsCi1pbiB3aGljaCBpdCB3aWxsIGFzc2VtYmxlIGluc3RydWN0aW9ucyBmb3IgdGhlIE1JUFMgMTYgcHJvY2Vzc29yLiAgVXNlCi1Ac2FtcHsuc2V0IG5vbWlwczE2fSB0byByZXR1cm4gdG8gbm9ybWFsIDMyIGJpdCBtb2RlLgotCi1UcmFkaXRpb25hbCBAc2N7bWlwc30gYXNzZW1ibGVycyBkbyBub3Qgc3VwcG9ydCB0aGlzIGRpcmVjdGl2ZS4gIAotCi1Abm9kZSBNSVBTIGF1dG9leHRlbmQKLUBzZWN0aW9uIERpcmVjdGl2ZXMgZm9yIGV4dGVuZGluZyBNSVBTIDE2IGJpdCBpbnN0cnVjdGlvbnMKLQotQGtpbmRleCBAY29kZXsuc2V0IGF1dG9leHRlbmR9Ci1Aa2luZGV4IEBjb2Rley5zZXQgbm9hdXRvZXh0ZW5kfQotQnkgZGVmYXVsdCwgTUlQUyAxNiBpbnN0cnVjdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gMzIgYml0cwotd2hlbiBuZWNlc3NhcnkuICBUaGUgZGlyZWN0aXZlIEBzYW1wey5zZXQgbm9hdXRvZXh0ZW5kfSB3aWxsIHR1cm4gdGhpcwotb2ZmLiAgV2hlbiBAc2FtcHsuc2V0IG5vYXV0b2V4dGVuZH0gaXMgaW4gZWZmZWN0LCBhbnkgMzIgYml0IGluc3RydWN0aW9uCi1tdXN0IGJlIGV4cGxpY2l0bHkgZXh0ZW5kZWQgd2l0aCB0aGUgQHNhbXB7LmV9IG1vZGlmaWVyIChlLmcuLAotQHNhbXB7bGkuZSAkNCwxMDAwfSkuICBUaGUgZGlyZWN0aXZlIEBzYW1wey5zZXQgYXV0b2V4dGVuZH0gbWF5IGJlIHVzZWQKLXRvIG9uY2UgYWdhaW4gYXV0b21hdGljYWxseSBleHRlbmQgaW5zdHJ1Y3Rpb25zIHdoZW4gbmVjZXNzYXJ5LgotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBpbiBNSVBTIDE2IG1vZGUuICBUcmFkaXRpb25hbAotQHNje21pcHN9IGFzc2VtYmxlcnMgZG8gbm90IHN1cHBvcnQgdGhpcyBkaXJlY3RpdmUuCi0KLUBub2RlIE1JUFMgaW5zbgotQHNlY3Rpb24gRGlyZWN0aXZlIHRvIG1hcmsgZGF0YSBhcyBhbiBpbnN0cnVjdGlvbgotCi1Aa2luZGV4IEBjb2Rley5pbnNufQotVGhlIEBjb2Rley5pbnNufSBkaXJlY3RpdmUgdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdGhhdCB0aGUgZm9sbG93aW5nCi1kYXRhIGlzIGFjdHVhbGx5IGluc3RydWN0aW9ucy4gIFRoaXMgbWFrZXMgYSBkaWZmZXJlbmNlIGluIE1JUFMgMTYgbW9kZToKLXdoZW4gbG9hZGluZyB0aGUgYWRkcmVzcyBvZiBhIGxhYmVsIHdoaWNoIHByZWNlZGVzIGluc3RydWN0aW9ucywKLUBjb2Rle0B2YWx1ZXtBU319IGF1dG9tYXRpY2FsbHkgYWRkcyAxIHRvIHRoZSB2YWx1ZSwgc28gdGhhdCBqdW1waW5nIHRvCi10aGUgbG9hZGVkIGFkZHJlc3Mgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcuCi0KLUBub2RlIE1JUFMgb3B0aW9uIHN0YWNrCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIHRvIHNhdmUgYW5kIHJlc3RvcmUgb3B0aW9ucwotCi1AY2luZGV4IE1JUFMgb3B0aW9uIHN0YWNrCi1Aa2luZGV4IEBjb2Rley5zZXQgcHVzaH0KLUBraW5kZXggQGNvZGV7LnNldCBwb3B9Ci1UaGUgZGlyZWN0aXZlcyBAY29kZXsuc2V0IHB1c2h9IGFuZCBAY29kZXsuc2V0IHBvcH0gbWF5IGJlIHVzZWQgdG8gc2F2ZQotYW5kIHJlc3RvcmUgdGhlIGN1cnJlbnQgc2V0dGluZ3MgZm9yIGFsbCB0aGUgb3B0aW9ucyB3aGljaCBhcmUKLWNvbnRyb2xsZWQgYnkgQGNvZGV7LnNldH0uICBUaGUgQGNvZGV7LnNldCBwdXNofSBkaXJlY3RpdmUgc2F2ZXMgdGhlCi1jdXJyZW50IHNldHRpbmdzIG9uIGEgc3RhY2suICBUaGUgQGNvZGV7LnNldCBwb3B9IGRpcmVjdGl2ZSBwb3BzIHRoZQotc3RhY2sgYW5kIHJlc3RvcmVzIHRoZSBzZXR0aW5ncy4KLQotVGhlc2UgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZnVsIGluc2lkZSBhbiBtYWNybyB3aGljaCBtdXN0IGNoYW5nZSBhbgotb3B0aW9uIHN1Y2ggYXMgdGhlIElTQSBsZXZlbCBvciBpbnN0cnVjdGlvbiByZW9yZGVyaW5nIGJ1dCBkb2VzIG5vdCB3YW50Ci10byBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBjb2RlIHdoaWNoIGludm9rZWQgdGhlIG1hY3JvLgotCi1UcmFkaXRpb25hbCBAc2N7bWlwc30gYXNzZW1ibGVycyBkbyBub3Qgc3VwcG9ydCB0aGVzZSBkaXJlY3RpdmVzLgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW5zMzJrLnRleGkgYi9nYXMvZG9jL2MtbnMzMmsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNjFkOS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtbnMzMmsudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBjICBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLQotQGlnbm9yZQotQGMgRklYTUUhICBTdG9wIGlnbm9yaW5nIHdoZW4gZmlsbGVkIGluLgotQG5vZGUgMzJ4MzIKLUBjaGFwdGVyIDMyeDMyCi0KLUBzZWN0aW9uIE9wdGlvbnMKLVRoZSAzMngzMiB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgYSBAc2FtcHstbTMyMDMyfSBvcHRpb24gdG8KLXNwZWNpZnkgdGhpYXQgaXQgaXMgY29tcGlsaW5nIGZvciBhIDMyMDMyIHByb2Nlc3Nvciwgb3IgYQotQHNhbXB7LW0zMjUzMn0gdG8gc3BlY2lmeSB0aGF0IGl0IGlzIGNvbXBpbGluZyBmb3IgYSAzMjUzMiBvcHRpb24uCi1UaGUgZGVmYXVsdCAoaWYgbmVpdGhlciBpcyBzcGVjaWZpZWQpIGlzIGNob3NlbiB3aGVuIHRoZSBhc3NlbWJsZXIKLWlzIGNvbXBpbGVkLgotCi1Ac2VjdGlvbiBTeW50YXgKLUkgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCB0aGUgMzJ4MzIgc3ludGF4IGFzc2VtYmxlZCBieQotQGNvZGV7QHZhbHVle0FTfX0uICBTb21lb25lIHdobyB1bmRlcnNhbmRzIHRoZSBwcm9jZXNzb3IgKEkndmUgbmV2ZXIgc2Vlbgotb25lKSBhbmQgdGhlIHBvc3NpYmxlIHN5bnRheGVzIHNob3VsZCB3cml0ZSB0aGlzIHNlY3Rpb24uCi0KLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1UaGUgMzJ4MzIgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYnV0IEBjb2Rle0B2YWx1ZXtBU319Ci1vbmx5IGNyZWF0ZXMgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gdmFsdWVzLiAgSSBkb24ndCBrbm93IGlmIHRoZQotMzJ4MzIgdW5kZXJzdGFuZHMgZXh0ZW5kZWQgcHJlY2lzaW9uIG51bWJlcnMuCi0KLUBzZWN0aW9uIDMyeDMyIE1hY2hpbmUgRGlyZWN0aXZlcwotVGhlIDMyeDMyIGhhcyBubyBtYWNoaW5lIGRlcGVuZGVudCBkaXJlY3RpdmVzLgotCi1AZW5kIGlnbm9yZQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXBqLnRleGkgYi9nYXMvZG9jL2MtcGoudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2MDAxNS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtcGoudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQHBhZ2UKLUBub2RlIFBKLURlcGVuZGVudAotQGNoYXB0ZXIgcGljb0phdmEgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggUEogc3VwcG9ydAotQG1lbnUKLSogUEogT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgUEogT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IFBKIG9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgUEoKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyB0d28gYWRkaWl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBwaWNvSmF2YQotYXJjaGl0ZWN0dXJlLgotQHRhYmxlIEBjb2RlCi1AaXRlbSAtbWwKLVRoaXMgb3B0aW9uIHNlbGVjdHMgbGl0dGxlIGVuZGlhbiBkYXRhIG91dHB1dC4KLQotQGl0ZW0gLW1iCi1UaGlzIG9wdGlvbiBzZWxlY3RzIGJpZyBlbmRpYW4gZGF0YSBvdXRwdXQuCi1AZW5kIHRhYmxlCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXNoLnRleGkgYi9nYXMvZG9jL2Mtc2gudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwZjU1NC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2Mtc2gudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AcGFnZQotQG5vZGUgU0gtRGVwZW5kZW50Ci1AY2hhcHRlciBIaXRhY2hpIFNIIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IFNIIHN1cHBvcnQKLUBtZW51Ci0qIFNIIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBTSCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBTSCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIFNIIERpcmVjdGl2ZXM6OiAgICAgICAgICAgU0ggTWFjaGluZSBEaXJlY3RpdmVzCi0qIFNIIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFNIIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBTSCBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zLCBTSCAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQotU0ggZmFtaWx5LgotCi1Abm9kZSBTSCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotCi1AbWVudQotKiBTSC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBTSC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIFNILUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFNILUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBTSAotQGNpbmRleCBTSCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHshfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgU0gKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgU0gKLUBjaW5kZXggU0ggbGluZSBzZXBhcmF0b3IKLVlvdSBjYW4gdXNlIEBzYW1wezt9IGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi0KLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgotQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgU0gtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBTSCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBTSAotWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0sIEBzYW1we3IxfSwgQHNhbXB7cjJ9LAotQHNhbXB7cjN9LCBAc2FtcHtyNH0sIEBzYW1we3I1fSwgQHNhbXB7cjZ9LCBAc2FtcHtyN30sIEBzYW1we3I4fSwKLUBzYW1we3I5fSwgQHNhbXB7cjEwfSwgQHNhbXB7cjExfSwgQHNhbXB7cjEyfSwgQHNhbXB7cjEzfSwgQHNhbXB7cjE0fSwKLWFuZCBAc2FtcHtyMTV9IHRvIHJlZmVyIHRvIHRoZSBTSCByZWdpc3RlcnMuCi0KLVRoZSBTSCBhbHNvIGhhcyB0aGVzZSBjb250cm9sIHJlZ2lzdGVyczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBwcgotcHJvY2VkdXJlIHJlZ2lzdGVyIChob2xkcyByZXR1cm4gYWRkcmVzcykKLQotQGl0ZW0gcGMKLXByb2dyYW0gY291bnRlcgotCi1AaXRlbSBtYWNoCi1AaXRlbXggbWFjbAotaGlnaCBhbmQgbG93IG11bHRpcGx5IGFjY3VtdWxhdG9yIHJlZ2lzdGVycwotCi1AaXRlbSBzcgotc3RhdHVzIHJlZ2lzdGVyCi0KLUBpdGVtIGdicgotZ2xvYmFsIGJhc2UgcmVnaXN0ZXIKLQotQGl0ZW0gdmJyCi12ZWN0b3IgYmFzZSByZWdpc3RlciAoZm9yIGludGVycnVwdCB2ZWN0b3JzKQotQGVuZCB0YWJsZQotCi1Abm9kZSBTSC1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi0KLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgU0gKLUBjaW5kZXggU0ggYWRkcmVzc2luZyBtb2RlcwotQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgU0guCi1AY29kZXtSQHZhcntufX0gaW4gdGhlIGZvbGxvd2luZyByZWZlcnMgdG8gYW55IG9mIHRoZSBudW1iZXJlZAotcmVnaXN0ZXJzLCBidXQgQGVtcGh7bm90fSB0aGUgY29udHJvbCByZWdpc3RlcnMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gUkB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotCi1AaXRlbSBAQFJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotCi1AaXRlbSBAQC1SQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci0KLUBpdGVtIEBAUkB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci0KLUBpdGVtIEBAKEB2YXJ7ZGlzcH0sIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLQotQGl0ZW0gQEAoUjAsIFJAdmFye259KQotUmVnaXN0ZXIgaW5kZXhlZAotCi1AaXRlbSBAQChAdmFye2Rpc3B9LCBHQlIpCi1AY29kZXtHQlJ9IG9mZnNldAotCi1AaXRlbSBAQChSMCwgR0JSKQotR0JSIGluZGV4ZWQKLQotQGl0ZW0gQHZhcnthZGRyfQotQGl0ZW14IEBAKEB2YXJ7ZGlzcH0sIFBDKQotUEMgcmVsYXRpdmUgYWRkcmVzcyAoZm9yIGJyYW5jaCBvciBmb3IgYWRkcmVzc2luZyBtZW1vcnkpLiAgVGhlCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgeW91IHRvIHVzZSB0aGUgc2ltcGxlciBmb3JtCi1AdmFye2FkZHJ9IGFueXdoZXJlIGEgUEMgcmVsYXRpdmUgYWRkcmVzcyBpcyBjYWxsZWQgZm9yOyB0aGUgYWx0ZXJuYXRlCi1mb3JtIGlzIHN1cHBvcnRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCi0KLUBpdGVtICNAdmFye2ltbX0KLUltbWVkaWF0ZSBkYXRhCi1AZW5kIHRhYmxlCi0KLUBub2RlIFNIIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBTSCAoQHNje2llZWV9KQotQGNpbmRleCBTSCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIFNIIGZhbWlseSBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fQotZGlyZWN0aXZlIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4KLQotQG5vZGUgU0ggRGlyZWN0aXZlcwotQHNlY3Rpb24gU0ggTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggU0ggbWFjaGluZSBkaXJlY3RpdmVzCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgU0gKLUBjaW5kZXggQGNvZGV7dWF3b3JkfSBkaXJlY3RpdmUsIFNICi1AY2luZGV4IEBjb2Rle3VhbG9uZ30gZGlyZWN0aXZlLCBTSAotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHVhd29yZAotQGl0ZW14IHVhbG9uZwotQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBpc3N1ZSBhIHdhcm5pbmcgd2hlbiBhIG1pc2FsaWduZWQgQGNvZGV7LndvcmR9IG9yCi1AY29kZXsubG9uZ30gZGlyZWN0aXZlIGlzIHVzZWQuICBZb3UgbWF5IHVzZSBAY29kZXsudWF3b3JkfSBvcgotQGNvZGV7LnVhbG9uZ30gdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZW50aW9uYWxseSBtaXNhbGlnbmVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBTSCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggU0ggb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIFNICi1AY2luZGV4IG1uZW1vbmljcywgU0gKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgU0gKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgU0ggbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7U0gtTWljcm9jb21wdXRlciBVc2VyJ3MgTWFudWFsfSAoSGl0YWNoaSBNaWNybyBTeXN0ZW1zLCBJbmMuKS4KLQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIFNIIG9wY29kZXMuICBObyBhZGRpdGlvbmFsCi1wc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuICBOb3RlLCBob3dldmVyLCB0aGF0Ci1iZWNhdXNlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIGEgc2ltcGxlciBmb3JtIG9mIFBDLXJlbGF0aXZlCi1hZGRyZXNzaW5nLCB5b3UgbWF5IHNpbXBseSB3cml0ZSAoZm9yIGV4YW1wbGUpCi0KLUBleGFtcGxlCi1tb3YubCAgYmFyLHIwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBvdGhlciBhc3NlbWJsZXJzIG1pZ2h0IHJlcXVpcmUgYW4gZXhwbGljaXQgZGlzcGxhY2VtZW50IHRvCi1AY29kZXtiYXJ9IGZyb20gdGhlIHByb2dyYW0gY291bnRlcjoKLQotQGV4YW1wbGUKLW1vdi5sICBAQChAdmFye2Rpc3B9LCBQQykKLUBlbmQgZXhhbXBsZQotCi1AaWZzZXQgU01BTEwKLUBjIHRoaXMgdGFibGUsIGR1ZSB0byB0aGUgbXVsdGktY29sIGZha2luZyBhbmQgaGFyZGNvZGVkIG9yZGVyLCBsb29rcyBzaWxseQotQGMgZXhjZXB0IGluIHNtYWxsYm9vay4gIFNlZSBjb21tZW50cyBiZWxvdyAiQHNldCBTTUFMTCIgbmVhciB0b3Agb2YgdGhpcyBmaWxlLgotCi1IZXJlIGlzIGEgc3VtbWFyeSBvZiBTSCBvcGNvZGVzOgotCi1AcGFnZQotQHNtYWxsZXhhbXBsZQotQGl7TGVnZW5kOn0KLVJuICAgICAgICBAcnthIG51bWJlcmVkIHJlZ2lzdGVyfQotUm0gICAgICAgIEBye2Fub3RoZXIgbnVtYmVyZWQgcmVnaXN0ZXJ9Ci0jaW1tICAgICAgQHJ7aW1tZWRpYXRlIGRhdGF9Ci1kaXNwICAgICAgQHJ7ZGlzcGxhY2VtZW50fQotZGlzcDggICAgIEByezgtYml0IGRpc3BsYWNlbWVudH0KLWRpc3AxMiAgICBAcnsxMi1iaXQgZGlzcGxhY2VtZW50fQotCi1hZGQgI2ltbSxSbiAgICAgICAgICAgICAgICAgICAgbGRzLmwgQEBSbissUFIgICAgICAgICAgICAgIAotYWRkIFJtLFJuICAgICAgICAgICAgICAgICAgICAgIG1hYy53IEBAUm0rLEBAUm4rICAgICAgICAgICAKLWFkZGMgUm0sUm4gICAgICAgICAgICAgICAgICAgICBtb3YgI2ltbSxSbiAgICAgICAgICAgICAgICAgCi1hZGR2IFJtLFJuICAgICAgICAgICAgICAgICAgICAgbW92IFJtLFJuICAgICAgICAgICAgICAgICAgIAotYW5kICNpbW0sUjAgICAgICAgICAgICAgICAgICAgIG1vdi5iIFJtLEBAKFIwLFJuKSAgICAgICAgICAKLWFuZCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBSbSxAQC1SbiAgICAgICAgICAgICAgCi1hbmQuYiAjaW1tLEBAKFIwLEdCUikgICAgICAgICAgIG1vdi5iIFJtLEBAUm4gICAgICAgICAgICAgICAKLWJmIGRpc3A4ICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQChkaXNwLFJtKSxSMCAgICAgICAgCi1icmEgZGlzcDEyICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEAoZGlzcCxHQlIpLFIwICAgICAgIAotYnNyIGRpc3AxMiAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAKFIwLFJtKSxSbiAgICAgICAgICAKLWJ0IGRpc3A4ICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQFJtKyxSbiAgICAgICAgICAgICAgCi1jbHJtYWMgICAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEBSbSxSbiAgICAgICAgICAgICAgIAotY2xydCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIFIwLEBAKGRpc3AsUm0pICAgICAgICAKLWNtcC9lcSAjaW1tLFIwICAgICAgICAgICAgICAgICBtb3YuYiBSMCxAQChkaXNwLEdCUikgICAgICAgCi1jbXAvZXEgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEAoZGlzcCxSbikgICAgICAgIAotY21wL2dlIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAKFIwLFJuKSAgICAgICAgICAKLWNtcC9ndCBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBSbSxAQC1SbiAgICAgICAgICAgICAgCi1jbXAvaGkgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEBSbiAgICAgICAgICAgICAgIAotY21wL2hzIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKGRpc3AsUm4pLFJtICAgICAgICAKLWNtcC9wbCBSbiAgICAgICAgICAgICAgICAgICAgICBtb3YubCBAQChkaXNwLEdCUiksUjAgICAgICAgCi1jbXAvcHogUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEAoZGlzcCxQQyksUm4gICAgICAgIAotY21wL3N0ciBSbSxSbiAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKFIwLFJtKSxSbiAgICAgICAgICAKLWRpdjBzIFJtLFJuICAgICAgICAgICAgICAgICAgICBtb3YubCBAQFJtKyxSbiAgICAgICAgICAgICAgCi1kaXYwdSAgICAgICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEBSbSxSbiAgICAgICAgICAgICAgIAotZGl2MSBSbSxSbiAgICAgICAgICAgICAgICAgICAgIG1vdi5sIFIwLEBAKGRpc3AsR0JSKSAgICAgICAKLWV4dHMuYiBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBSbSxAQChSMCxSbikgICAgICAgICAgCi1leHRzLncgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgUm0sQEAtUm4gICAgICAgICAgICAgIAotZXh0dS5iIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi53IFJtLEBAUm4gICAgICAgICAgICAgICAKLWV4dHUudyBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBAQChkaXNwLFJtKSxSMCAgICAgICAgCi1qbXAgQEBSbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKGRpc3AsR0JSKSxSMCAgICAgICAKLWpzciBAQFJuICAgICAgICAgICAgICAgICAgICAgICAgbW92LncgQEAoZGlzcCxQQyksUm4gICAgICAgIAotbGRjIFJuLEdCUiAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKFIwLFJtKSxSbiAgICAgICAgICAKLWxkYyBSbixTUiAgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQFJtKyxSbiAgICAgICAgICAgICAgCi1sZGMgUm4sVkJSICAgICAgICAgICAgICAgICAgICAgbW92LncgQEBSbSxSbiAgICAgICAgICAgICAgIAotbGRjLmwgQEBSbissR0JSICAgICAgICAgICAgICAgICBtb3YudyBSMCxAQChkaXNwLFJtKSAgICAgICAgCi1sZGMubCBAQFJuKyxTUiAgICAgICAgICAgICAgICAgIG1vdi53IFIwLEBAKGRpc3AsR0JSKSAgICAgICAKLWxkYy5sIEBAUm4rLFZCUiAgICAgICAgICAgICAgICAgbW92YSBAQChkaXNwLFBDKSxSMCAgICAgICAgIAotbGRzIFJuLE1BQ0ggICAgICAgICAgICAgICAgICAgIG1vdnQgUm4gICAgICAgICAgICAgICAgICAgICAKLWxkcyBSbixNQUNMICAgICAgICAgICAgICAgICAgICBtdWxzIFJtLFJuICAgICAgICAgICAgICAgICAgCi1sZHMgUm4sUFIgICAgICAgICAgICAgICAgICAgICAgbXVsdSBSbSxSbiAgICAgICAgICAgICAgICAgIAotbGRzLmwgQEBSbissTUFDSCAgICAgICAgICAgICAgICBuZWcgUm0sUm4gICAgICAgICAgICAgICAgICAgCi1sZHMubCBAQFJuKyxNQUNMICAgICAgICAgICAgICAgIG5lZ2MgUm0sUm4gICAgICAgICAgICAgICAgICAKLUBwYWdlCi1ub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RjIFZCUixSbiAgICAgICAgICAgICAgICAKLW5vdCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBzdGMubCBHQlIsQEAtUm4gICAgICAgICAgIAotb3IgI2ltbSxSMCAgICAgICAgICAgICAgICAgICAgIHN0Yy5sIFNSLEBALVJuICAgICAgICAgICAgCi1vciBSbSxSbiAgICAgICAgICAgICAgICAgICAgICAgc3RjLmwgVkJSLEBALVJuICAgICAgICAgICAKLW9yLmIgI2ltbSxAQChSMCxHQlIpICAgICAgICAgICAgc3RzIE1BQ0gsUm4gICAgICAgICAgICAgICAKLXJvdGNsIFJuICAgICAgICAgICAgICAgICAgICAgICBzdHMgTUFDTCxSbiAgICAgICAgICAgICAgIAotcm90Y3IgUm4gICAgICAgICAgICAgICAgICAgICAgIHN0cyBQUixSbiAgICAgICAgICAgICAgICAgCi1yb3RsIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3RzLmwgTUFDSCxAQC1SbiAgICAgICAgICAKLXJvdHIgUm4gICAgICAgICAgICAgICAgICAgICAgICBzdHMubCBNQUNMLEBALVJuICAgICAgICAgIAotcnRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5sIFBSLEBALVJuICAgICAgICAgICAgCi1ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViIFJtLFJuICAgICAgICAgICAgICAgICAKLXNldHQgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJjIFJtLFJuICAgICAgICAgICAgICAgIAotc2hhbCBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnYgUm0sUm4gICAgICAgICAgICAgICAgCi1zaGFyIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3dhcC5iIFJtLFJuICAgICAgICAgICAgICAKLXNobGwgUm4gICAgICAgICAgICAgICAgICAgICAgICBzd2FwLncgUm0sUm4gICAgICAgICAgICAgIAotc2hsbDE2IFJuICAgICAgICAgICAgICAgICAgICAgIHRhcy5iIEBAUm4gICAgICAgICAgICAgICAgCi1zaGxsMiBSbiAgICAgICAgICAgICAgICAgICAgICAgdHJhcGEgI2ltbSAgICAgICAgICAgICAgICAKLXNobGw4IFJuICAgICAgICAgICAgICAgICAgICAgICB0c3QgI2ltbSxSMCAgICAgICAgICAgICAgIAotc2hsciBSbiAgICAgICAgICAgICAgICAgICAgICAgIHRzdCBSbSxSbiAgICAgICAgICAgICAgICAgCi1zaGxyMTYgUm4gICAgICAgICAgICAgICAgICAgICAgdHN0LmIgI2ltbSxAQChSMCxHQlIpICAgICAKLXNobHIyIFJuICAgICAgICAgICAgICAgICAgICAgICB4b3IgI2ltbSxSMCAgICAgICAgICAgICAgIAotc2hscjggUm4gICAgICAgICAgICAgICAgICAgICAgIHhvciBSbSxSbiAgICAgICAgICAgICAgICAgCi1zbGVlcCAgICAgICAgICAgICAgICAgICAgICAgICAgeG9yLmIgI2ltbSxAQChSMCxHQlIpICAgICAKLXN0YyBHQlIsUm4gICAgICAgICAgICAgICAgICAgICB4dHJjdCBSbSxSbiAgICAgICAgICAgICAgIAotc3RjIFNSLFJuCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgSGl0YWNoaS1hbGwKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXNwYXJjLnRleGkgYi9nYXMvZG9jL2Mtc3BhcmMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1NGViMi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2Mtc3BhcmMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgU3BhcmMtRGVwZW5kZW50Ci1AY2hhcHRlciBTUEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBTUEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IFNQQVJDIHN1cHBvcnQKLUBtZW51Ci0qIFNwYXJjLU9wdHM6OiAgICAgICAgICAgICAgICAgIE9wdGlvbnMKLSogU3BhcmMtQWxpZ25lZC1EYXRhOjoJCU9wdGlvbiB0byBlbmZvcmNlIGFsaWduZWQgZGF0YQotKiBTcGFyYy1GbG9hdDo6ICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBTcGFyYy1EaXJlY3RpdmVzOjogICAgICAgICAgICBTcGFyYyBNYWNoaW5lIERpcmVjdGl2ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTcGFyYy1PcHRzCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucyBmb3IgU1BBUkMKLUBjaW5kZXggU1BBUkMgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmVzLCBTUEFSQwotQGNpbmRleCBTUEFSQyBhcmNoaXRlY3R1cmVzCi1UaGUgU1BBUkMgY2hpcCBmYW1pbHkgaW5jbHVkZXMgc2V2ZXJhbCBzdWNjZXNzaXZlIGxldmVscywgdXNpbmcgdGhlIHNhbWUKLWNvcmUgaW5zdHJ1Y3Rpb24gc2V0LCBidXQgaW5jbHVkaW5nIGEgZmV3IGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0Ci1lYWNoIGxldmVsLiAgVGhlcmUgYXJlIGV4Y2VwdGlvbnMgdG8gdGhpcyBob3dldmVyLiAgRm9yIGRldGFpbHMgb24gd2hhdAotaW5zdHJ1Y3Rpb25zIGVhY2ggdmFyaWFudCBzdXBwb3J0cywgcGxlYXNlIHNlZSB0aGUgY2hpcCdzIGFyY2hpdGVjdHVyZQotcmVmZXJlbmNlIG1hbnVhbC4KLQotQnkgZGVmYXVsdCwgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB0aGUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKFNQQVJDCi12NiksIGJ1dCBgYGJ1bXBzJycgdGhlIGFyY2hpdGVjdHVyZSBsZXZlbCBhcyBuZWVkZWQ6IGl0IHN3aXRjaGVzIHRvCi1zdWNjZXNzaXZlbHkgaGlnaGVyIGFyY2hpdGVjdHVyZXMgYXMgaXQgZW5jb3VudGVycyBpbnN0cnVjdGlvbnMgdGhhdAotb25seSBleGlzdCBpbiB0aGUgaGlnaGVyIGxldmVscy4KLQotSWYgbm90IGNvbmZpZ3VyZWQgZm9yIFNQQVJDIHY5IChAY29kZXtzcGFyYzY0LSotKn0pIEdBUyB3aWxsIG5vdCBidW1wCi1wYXNzZWQgc3BhcmNsaXRlIGJ5IGRlZmF1bHQsIGFuIG9wdGlvbiBtdXN0IGJlIHBhc3NlZCB0byBlbmFibGUgdGhlCi12OSBpbnN0cnVjdGlvbnMuCi0KLUdBUyB0cmVhdHMgc3BhcmNsaXRlIGFzIGJlaW5nIGNvbXBhdGlibGUgd2l0aCB2OCwgdW5sZXNzIGFuIGFyY2hpdGVjdHVyZQotaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQuICBTUEFSQyB2OSBpcyBhbHdheXMgaW5jb21wYXRpYmxlIHdpdGggc3BhcmNsaXRlLgotCi1AYyBUaGUgb3JkZXIgaGVyZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3JkZXIgb2YgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwKLUBjIHRvIGdpdmUgdGhlIHVzZXIgYSBzZW5zZSBvZiB0aGUgb3JkZXIgb2YgdGhlICJidW1waW5nIi4KLQotQHRhYmxlIEBjb2RlCi1Aa2luZGV4IC1BdjYKLUBraW5kZXggQXY3Ci1Aa2luZGV4IC1BdjgKLUBraW5kZXggLUFzcGFyY2xldAotQGtpbmRleCAtQXNwYXJjbGl0ZQotQGtpbmRleCAtQXY5Ci1Aa2luZGV4IC1BdjlhCi1AaXRlbSAtQXY2IHwgLUF2NyB8IC1BdjggfCAtQXNwYXJjbGV0IHwgLUFzcGFyY2xpdGUKLUBpdGVteCAtQXY4cGx1cyB8IC1BdjhwbHVzYSB8IC1BdjkgfCAtQXY5YQotVXNlIG9uZSBvZiB0aGUgQHNhbXB7LUF9IG9wdGlvbnMgdG8gc2VsZWN0IG9uZSBvZiB0aGUgU1BBUkMKLWFyY2hpdGVjdHVyZXMgZXhwbGljaXRseS4gIElmIHlvdSBzZWxlY3QgYW4gYXJjaGl0ZWN0dXJlIGV4cGxpY2l0bHksCi1AY29kZXtAdmFsdWV7QVN9fSByZXBvcnRzIGEgZmF0YWwgZXJyb3IgaWYgaXQgZW5jb3VudGVycyBhbiBpbnN0cnVjdGlvbgotb3IgZmVhdHVyZSByZXF1aXJpbmcgYW4gaW5jb21wYXRpYmxlIG9yIGhpZ2hlciBsZXZlbC4KLQotQHNhbXB7LUF2OHBsdXN9IGFuZCBAc2FtcHstQXY4cGx1c2F9IHNlbGVjdCBhIDMyIGJpdCBlbnZpcm9ubWVudC4KLQotQHNhbXB7LUF2OX0gYW5kIEBzYW1wey1BdjlhfSBzZWxlY3QgYSA2NCBiaXQgZW52aXJvbm1lbnQgYW5kIGFyZSBub3QKLWF2YWlsYWJsZSB1bmxlc3MgR0FTIGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZCB3aXRoIDY0IGJpdCBlbnZpcm9ubWVudAotc3VwcG9ydC4KLQotQHNhbXB7LUF2OHBsdXNhfSBhbmQgQHNhbXB7LUF2OWF9IGVuYWJsZSB0aGUgU1BBUkMgVjkgaW5zdHJ1Y3Rpb24gc2V0IHdpdGgKLVVsdHJhU1BBUkMgZXh0ZW5zaW9ucy4KLQotQGl0ZW0gLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhCi1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIHY5IGFzc2VtYmxlci4gIFRoZXNlIG9wdGlvbnMgYXJlCi1lcXVpdmFsZW50IHRvIC1BdjhwbHVzIGFuZCAtQXY4cGx1c2EsIHJlc3BlY3RpdmVseS4KLQotQGl0ZW0gLWJ1bXAKLVdhcm4gd2hlbmV2ZXIgaXQgaXMgbmVjZXNzYXJ5IHRvIHN3aXRjaCB0byBhbm90aGVyIGxldmVsLgotSWYgYW4gYXJjaGl0ZWN0dXJlIGxldmVsIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBHQVMgd2lsbCBub3QgaXNzdWUKLXdhcm5pbmdzIHVudGlsIHRoYXQgbGV2ZWwgaXMgcmVhY2hlZCwgYW5kIHdpbGwgdGhlbiBidW1wIHRoZSBsZXZlbAotYXMgcmVxdWlyZWQgKGV4Y2VwdCBiZXR3ZWVuIGluY29tcGF0aWJsZSBsZXZlbHMpLgotCi1AaXRlbSAtMzIgfCAtNjQKLVNlbGVjdCB0aGUgd29yZCBzaXplLCBlaXRoZXIgMzIgYml0cyBvciA2NCBiaXRzLgotVGhlc2Ugb3B0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgd2l0aCB0aGUgRUxGIG9iamVjdCBmaWxlIGZvcm1hdCwKLWFuZCByZXF1aXJlIHRoYXQgdGhlIG5lY2Vzc2FyeSBCRkQgc3VwcG9ydCBoYXMgYmVlbiBpbmNsdWRlZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgU3BhcmMtQWxpZ25lZC1EYXRhCi1Ac2VjdGlvbiBFbmZvcmNpbmcgYWxpZ25lZCBkYXRhCi0KLUBjaW5kZXggZGF0YSBhbGlnbm1lbnQgb24gU1BBUkMKLUBjaW5kZXggU1BBUkMgZGF0YSBhbGlnbm1lbnQKLVNQQVJDIEdBUyBub3JtYWxseSBwZXJtaXRzIGRhdGEgdG8gYmUgbWlzYWxpZ25lZC4gIEZvciBleGFtcGxlLCBpdAotcGVybWl0cyB0aGUgQGNvZGV7Lmxvbmd9IHBzZXVkby1vcCB0byBiZSB1c2VkIG9uIGEgYnl0ZSBib3VuZGFyeS4KLUhvd2V2ZXIsIHRoZSBuYXRpdmUgU3VuT1MgYW5kIFNvbGFyaXMgYXNzZW1ibGVycyBpc3N1ZSBhbiBlcnJvciB3aGVuCi10aGV5IHNlZSBtaXNhbGlnbmVkIGRhdGEuCi0KLUBraW5kZXggLS1lbmZvcmNlLWFsaWduZWQtZGF0YQotWW91IGNhbiB1c2UgdGhlIEBjb2Rley0tZW5mb3JjZS1hbGlnbmVkLWRhdGF9IG9wdGlvbiB0byBtYWtlIFNQQVJDIEdBUwotYWxzbyBpc3N1ZSBhbiBlcnJvciBhYm91dCBtaXNhbGlnbmVkIGRhdGEsIGp1c3QgYXMgdGhlIFN1bk9TIGFuZCBTb2xhcmlzCi1hc3NlbWJsZXJzIGRvLgotCi1UaGUgQGNvZGV7LS1lbmZvcmNlLWFsaWduZWQtZGF0YX0gb3B0aW9uIGlzIG5vdCB0aGUgZGVmYXVsdCBiZWNhdXNlIGdjYwotaXNzdWVzIG1pc2FsaWduZWQgZGF0YSBwc2V1ZG8tb3BzIHdoZW4gaXQgaW5pdGlhbGl6ZXMgY2VydGFpbiBwYWNrZWQKLWRhdGEgc3RydWN0dXJlcyAoc3RydWN0dXJlcyBkZWZpbmVkIHVzaW5nIHRoZSBAY29kZXtwYWNrZWR9IGF0dHJpYnV0ZSkuCi1Zb3UgbWF5IGhhdmUgdG8gYXNzZW1ibGUgd2l0aCBHQVMgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBwYWNrZWQgZGF0YQotc3RydWN0dXJlcyBpbiB5b3VyIG93biBjb2RlLgotCi1AaWdub3JlCi1AYyBGSVhNRTogKHNwYXJjKSBGaWxsIGluICJzeW50YXgiIHNlY3Rpb24hCi1AYyBzdWJzZWN0aW9uIHN5bnRheAotSSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IFNwYXJjIHN5bnRheC4gIFNvbWVvbmUgd2hvIGRvZXMKLXdpbGwgaGF2ZSB0byB3cml0ZSB0aGlzIHNlY3Rpb24uCi1AZW5kIGlnbm9yZQotCi1Abm9kZSBTcGFyYy1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgU1BBUkMgKEBzY3tpZWVlfSkKLUBjaW5kZXggU1BBUkMgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBTcGFyYyB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBTcGFyYy1EaXJlY3RpdmVzCi1Ac2VjdGlvbiBTcGFyYyBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBTUEFSQyBtYWNoaW5lIGRpcmVjdGl2ZXMKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBTUEFSQwotVGhlIFNwYXJjIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCi1tYWNoaW5lIGRpcmVjdGl2ZXM6Ci0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXthbGlnbn0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLmFsaWduCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIGRlc2lyZWQgYWxpZ25tZW50IGluIGJ5dGVzLgotCi1AY2luZGV4IEBjb2Rle2NvbW1vbn0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLmNvbW1vbgotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3ltYm9sIG5hbWUsIGEgcG9zaXRpdmUgbnVtYmVyLCBhbmQKLUBjb2RleyJic3MifS4gIFRoaXMgYmVoYXZlcyBzb21ld2hhdCBsaWtlIEBjb2Rley5jb21tfSwgYnV0IHRoZQotc3ludGF4IGlzIGRpZmZlcmVudC4KLQotQGNpbmRleCBAY29kZXtoYWxmfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuaGFsZgotVGhpcyBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIEBjb2Rley5zaG9ydH0uCi0KLUBjaW5kZXggQGNvZGV7bndvcmR9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5ud29yZAotT24gdGhlIFNwYXJjLCB0aGUgQGNvZGV7Lm53b3JkfSBkaXJlY3RpdmUgcHJvZHVjZXMgbmF0aXZlIHdvcmQgc2l6ZWQgdmFsdWUsCi1pZS4gaWYgYXNzZW1ibGluZyB3aXRoIC0zMiBpdCBpcyBlcXVpdmFsZW50IHRvIEBjb2Rley53b3JkfSwgaWYgYXNzZW1ibGluZwotd2l0aCAtNjQgaXQgaXMgZXF1aXZhbGVudCB0byBAY29kZXsueHdvcmR9LgotCi1AY2luZGV4IEBjb2Rle3Byb2N9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5wcm9jCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkLiAgQW55IHRleHQgZm9sbG93aW5nIGl0IG9uIHRoZSBzYW1lCi1saW5lIGlzIGFsc28gaWdub3JlZC4KLQotQGNpbmRleCBAY29kZXtyZWdpc3Rlcn0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnJlZ2lzdGVyCi1UaGlzIGRpcmVjdGl2ZSBkZWNsYXJlcyB1c2Ugb2YgYSBnbG9iYWwgYXBwbGljYXRpb24gb3Igc3lzdGVtIHJlZ2lzdGVyLgotSXQgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHJlZ2lzdGVyIG5hbWUgJWcyLCAlZzMsICVnNiBvciAlZzcsIGNvbW1hIGFuZAotdGhlIHN5bWJvbCBuYW1lIGZvciB0aGF0IHJlZ2lzdGVyLiAgSWYgc3ltYm9sIG5hbWUgaXMgQGNvZGV7I3NjcmF0Y2h9LAotaXQgaXMgYSBzY3JhdGNoIHJlZ2lzdGVyLCBpZiBpdCBpcyBAY29kZXsjaWdub3JlfSwgaXQganVzdCBzdXJwcmVzc2VzIGFueQotZXJyb3JzIGFib3V0IHVzaW5nIHVuZGVjbGFyZWQgZ2xvYmFsIHJlZ2lzdGVyLCBidXQgZG9lcyBub3QgZW1pdCBhbnkKLWluZm9ybWF0aW9uIGFib3V0IGl0IGludG8gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGUuZy4gaWYgeW91Ci1zYXZlIHRoZSByZWdpc3RlciBiZWZvcmUgdXNlIGFuZCByZXN0b3JlIGl0IGFmdGVyLgotCi1AY2luZGV4IEBjb2Rle3Jlc2VydmV9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5yZXNlcnZlCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzeW1ib2wgbmFtZSwgYSBwb3NpdGl2ZSBudW1iZXIsIGFuZAotQGNvZGV7ImJzcyJ9LiAgVGhpcyBiZWhhdmVzIHNvbWV3aGF0IGxpa2UgQGNvZGV7Lmxjb21tfSwgYnV0IHRoZQotc3ludGF4IGlzIGRpZmZlcmVudC4KLQotQGNpbmRleCBAY29kZXtzZWd9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5zZWcKLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBAY29kZXsidGV4dCJ9LCBAY29kZXsiZGF0YSJ9LCBvcgotQGNvZGV7ImRhdGExIn0uICBJdCBiZWhhdmVzIGxpa2UgQGNvZGV7LnRleHR9LCBAY29kZXsuZGF0YX0sIG9yCi1AY29kZXsuZGF0YSAxfS4KLQotQGNpbmRleCBAY29kZXtza2lwfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuc2tpcAotVGhpcyBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIHRoZSBAY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAud29yZAotT24gdGhlIFNwYXJjLCB0aGUgQGNvZGV7LndvcmR9IGRpcmVjdGl2ZSBwcm9kdWNlcyAzMiBiaXQgdmFsdWVzLAotaW5zdGVhZCBvZiB0aGUgMTYgYml0IHZhbHVlcyBpdCBwcm9kdWNlcyBvbiBtYW55IG90aGVyIG1hY2hpbmVzLgotCi1AY2luZGV4IEBjb2Rle3h3b3JkfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAueHdvcmQKLU9uIHRoZSBTcGFyYyBWOSBwcm9jZXNzb3IsIHRoZSBAY29kZXsueHdvcmR9IGRpcmVjdGl2ZSBwcm9kdWNlcwotNjQgYml0IHZhbHVlcy4KLUBlbmQgdGFibGUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy12ODUwLnRleGkgYi9nYXMvZG9jL2Mtdjg1MC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE2ZTBmLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy12ODUwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi0KLUBub2RlIFY4NTAtRGVwZW5kZW50Ci1AY2hhcHRlciB2ODUwIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IFY4NTAgc3VwcG9ydAotQG1lbnUKLSogVjg1MCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogVjg1MCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBWODUwIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogVjg1MCBEaXJlY3RpdmVzOjogICAgICAgICAgIFY4NTAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIFY4NTAgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgVjg1MCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY2luZGV4IFY4NTAgb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucyBmb3IgVjg1MCAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucwotZm9yIHRoZSBWODUwIHByb2Nlc3NvciBmYW1pbHk6Ci0KLUBjaW5kZXggY29tbWFuZCBsaW5lIG9wdGlvbnMsIFY4NTAKLUBjaW5kZXggVjg1MCBjb21tYW5kIGxpbmUgb3B0aW9ucwotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQGNvZGV7LXdzaWduZWRfb3ZlcmZsb3d9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC13c2lnbmVkX292ZXJmbG93Ci1DYXVzZXMgd2FybmluZ3MgdG8gYmUgcHJvZHVjZWQgd2hlbiBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvdyB0aGUKLXNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlbiB3aXRoaW4gdGhlaXIgb3Bjb2Rlcy4gIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24KLWlzIGRpc2FibGVkIGFzIGl0IGlzIHBvc3NpYmxlIHRvIHJlY2VpdmUgc3B1cmlvdXMgd2FybmluZ3MgZHVlIHRvIHVzaW5nCi1leGFjdCBiaXQgcGF0dGVybnMgYXMgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXstd3Vuc2lnbmVkX292ZXJmbG93fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtd3Vuc2lnbmVkX292ZXJmbG93Ci1DYXVzZXMgd2FybmluZ3MgdG8gYmUgcHJvZHVjZWQgd2hlbiB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93Ci10aGUgc3BhY2UgYXZhaWxhYmxlIGZvciB0aGVuIHdpdGhpbiB0aGVpciBvcGNvZGVzLiAgQnkgZGVmYXVsdCB0aGlzCi1vcHRpb24gaXMgZGlzYWJsZWQgYXMgaXQgaXMgcG9zc2libGUgdG8gcmVjZWl2ZSBzcHVyaW91cyB3YXJuaW5ncyBkdWUgdG8KLXVzaW5nIGV4YWN0IGJpdCBwYXR0ZXJucyBhcyBpbW1lZGlhdGUgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rley1tdjg1MH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLW12ODUwCi1TcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAotdGhlIFY4NTAgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBjaW5kZXggQGNvZGV7LW12ODUwZX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLW12ODUwZQotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwRSBwcm9jZXNzb3IuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIHRvIGRldGVjdCBhdHRlbXB0cyB0byBsaW5rCi1zdWNoIGNvZGUgd2l0aCBjb2RlIGFzc2VtYmxlZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KLQotQGNpbmRleCBAY29kZXstbXY4NTBhbnl9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC1tdjg1MGFueQotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwIHByb2Nlc3NvciBidXQgc3VwcG9ydCBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlCi1leHRlbmRlZCB2YXJpYW50cyBvZiB0aGUgcHJvY2Vzcy4gIFRoaXMgYWxsb3dzIHRoZSBwcm9kdWN0aW9uIG9mCi1iaW5hcmllcyB0aGF0IGNvbnRhaW4gdGFyZ2V0IHNwZWNpZmljIGNvZGUsIGJ1dCB3aGljaCBhcmUgYWxzbyBpbnRlbmRlZAotdG8gYmUgdXNlZCBpbiBhIGdlbmVyaWMgZmFzaGlvbi4gIEZvciBleGFtcGxlIGxpYmdjYy5hIGNvbnRhaW5zIGdlbmVyaWMKLXJvdXRpbmVzIHVzZWQgYnkgdGhlIGNvZGUgcHJvZHVjZWQgYnkgR0NDIGZvciBhbGwgdmVyc2lvbnMgb2YgdGhlIHY4NTAKLWFyY2hpdGVjdHVyZSwgdG9nZXRoZXIgd2l0aCBzdXBwb3J0IHJvdXRpbmVzIG9ubHkgdXNlZCBieSB0aGUgVjg1MEUKLWFyY2hpdGVjdHVyZS4KLQotQGVuZCB0YWJsZQotCi0KLUBub2RlIFY4NTAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIFY4NTAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogVjg1MC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi1AZW5kIG1lbnUKLQotQG5vZGUgVjg1MC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgVjg1MAotQGNpbmRleCBWODUwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1weyN9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotQG5vZGUgVjg1MC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IFY4NTAgcmVnaXN0ZXIgbmFtZXMKLUBjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIFY4NTAKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbmFtZXMgZm9yIHJlZ2lzdGVyczoKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXt6ZXJvfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAwCi1yMCwgemVybwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxCi1yMQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyCi1yMiwgaHAKLUBjaW5kZXggQGNvZGV7c3B9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDMKLXIzLCBzcAotQGNpbmRleCBAY29kZXtncH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNAotcjQsIGdwCi1AY2luZGV4IEBjb2Rle3RwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciA1Ci1yNSwgdHAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNgotcjYKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNwotcjcKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgOAotcjgKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgOQotcjkKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTAKLXIxMAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxMQotcjExCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEyCi1yMTIKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTMKLXIxMwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNAotcjE0Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE1Ci1yMTUKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTYKLXIxNgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNwotcjE3Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE4Ci1yMTgKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTkKLXIxOQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMAotcjIwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIxCi1yMjEKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjIKLXIyMgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMwotcjIzCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI0Ci1yMjQKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjUKLXIyNQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNgotcjI2Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI3Ci1yMjcKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjgKLXIyOAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyOQotcjI5Ci1AY2luZGV4IEBjb2Rle2VwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAzMAotcjMwLCBlcAotQGNpbmRleCBAY29kZXtscH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMzEKLXIzMSwgbHAKLUBjaW5kZXggQGNvZGV7ZWlwY30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAwCi1laXBjCi1AY2luZGV4IEBjb2Rle2VpcHN3fSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDEKLWVpcHN3Ci1AY2luZGV4IEBjb2Rle2ZlcGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMgotZmVwYwotQGNpbmRleCBAY29kZXtmZXBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAzCi1mZXBzdwotQGNpbmRleCBAY29kZXtlY3J9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgNAotZWNyCi1AY2luZGV4IEBjb2Rle3Bzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciA1Ci1wc3cKLUBjaW5kZXggQGNvZGV7Y3RwY30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxNgotY3RwYwotQGNpbmRleCBAY29kZXtjdHBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxNwotY3Rwc3cKLUBjaW5kZXggQGNvZGV7ZGJwY30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxOAotZGJwYwotQGNpbmRleCBAY29kZXtkYnBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxOQotZGJwc3cKLUBjaW5kZXggQGNvZGV7Y3RicH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAyMAotY3RicAotQGVuZCB0YWJsZQotCi1Abm9kZSBWODUwIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBWODUwIChAc2N7aWVlZX0pCi1AY2luZGV4IFY4NTAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBWODUwIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBWODUwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIFY4NTAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBWODUwCi1AY2luZGV4IFY4NTAgbWFjaGluZSBkaXJlY3RpdmVzCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7b2Zmc2V0fSBkaXJlY3RpdmUsIFY4NTAKLUBpdGVtIC5vZmZzZXQgQHZhcns8ZXhwcmVzc2lvbj59Ci1Nb3ZlcyB0aGUgb2Zmc2V0IGludG8gdGhlIGN1cnJlbnQgc2VjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGFtb3VudC4gCi0KLUBjaW5kZXggQGNvZGV7c2VjdGlvbn0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAuc2VjdGlvbiAibmFtZSIsIDx0eXBlPgotVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIHN0YW5kYXJkIC5zZWN0aW9uIGRpcmVjdGl2ZS4gIEl0IHNldHMgdGhlCi1jdXJyZW50IHNlY3Rpb24gdG8gYmUgPHR5cGU+IGFuZCBjcmVhdGVzIGFuIGFsaWFzIGZvciB0aGlzIHNlY3Rpb24KLWNhbGxlZCAibmFtZSIuIAotCi1AY2luZGV4IEBjb2Rley52ODUwfSBkaXJlY3RpdmUsIFY4NTAKLUBpdGVtIC52ODUwCi1TcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAotdGhlIFY4NTAgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBjaW5kZXggQGNvZGV7LnY4NTBlfSBkaXJlY3RpdmUsIFY4NTAKLUBpdGVtIC52ODUwZQotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwRSBwcm9jZXNzb3IuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIHRvIGRldGVjdCBhdHRlbXB0cyB0byBsaW5rCi1zdWNoIGNvZGUgd2l0aCBjb2RlIGFzc2VtYmxlZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBWODUwIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBWODUwIG9wY29kZXMKLUBjaW5kZXggb3Bjb2RlcyBmb3IgVjg1MAotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIFY4NTAgb3Bjb2Rlcy4KLQotQGNvZGV7QHZhbHVle0FTfX0gYWxzbyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgcHNldWRvIG9wczoKLQotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQGNvZGV7aGkwfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGhpMCgpCi1Db21wdXRlcyB0aGUgaGlnaGVyIDE2IGJpdHMgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHN0b3JlcyBpdCBpbnRvCi10aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICBAc2FtcHttdWxoaSBoaTAoaGVyZSAtIHRoZXJlKSwgcjUsIHI2fQotCi1jb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGxhYmVscyAnaGVyZScgYW5kCi0ndGhlcmUnLCB0YWtlcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGlzIGRpZmZlcmVuY2UsIHNoaWZ0cyBpdCBkb3duIDE2Ci1iaXRzIGFuZCB0aGVuIG11dGxpcGxpZXMgaXQgYnkgdGhlIGxvd2VyIDE2IGJpdHMgaW4gcmVnaXN0ZXIgNSwgcHV0dGluZwotdGhlIHJlc3VsdCBpbnRvIHJlZ2lzdGVyIDYuIAotCi1AY2luZGV4IEBjb2Rle2xvfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGxvKCkKLUNvbXB1dGVzIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCBzdG9yZXMgaXQgaW50bwotdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgQHNhbXB7YWRkaSBsbyhoZXJlIC0gdGhlcmUpLCByNSwgcjZ9Ci0KLWNvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgbGFiZWxzICdoZXJlJyBhbmQKLSd0aGVyZScsIHRha2VzIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoaXMgZGlmZmVyZW5jZSBhbmQgYWRkcyBpdCB0bwotcmVnaXN0ZXIgNSwgcHV0dGluZyB0aGUgcmVzdWx0IGludG8gcmVnaXN0ZXIgNi4KLQotQGNpbmRleCBAY29kZXtoaX0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBoaSgpCi1Db21wdXRlcyB0aGUgaGlnaGVyIDE2IGJpdHMgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHRoZW4gYWRkcyB0aGUKLXZhbHVlIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgZXhwcmVzc2lvbgotYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbgotaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUKLWFkZHJlc3Mgb2YgdGhlIGxhYmVsICdoZXJlJyBhbmQgc3RvcmUgaXQgaW50byByZWdpc3RlciA2OgotCi0gICAgQHNhbXB7bW92aGkgaGkoaGVyZSksIHIwLCByNn0KLSAgICBAc2FtcHttb3ZlYSBsbyhoZXJlKSwgcjYsIHI2fQotCi1UaGUgcmVhc29uIGZvciB0aGlzIHNwZWNpYWwgYmVoYXZpb3VyIGlzIHRoYXQgbW92ZWEgcGVyZm9ybXMgYSBzaWduCi1leHRlbnRpb24gb24gaXRzIGltbWVkaWF0ZSBvcGVyYW5kLiAgU28gZm9yIGV4YW1wbGUgaWYgdGhlIGFkZHJlc3Mgb2YKLSdoZXJlJyB3YXMgMHhGRkZGRkZGRiB0aGVuIHdpdGhvdXQgdGhlIHNwZWNpYWwgYmVoYXZpb3VyIG9mIHRoZSBoaSgpCi1wc2V1ZG8tb3AgdGhlIG1vdmhpIGluc3RydWN0aW9uIHdvdWxkIHB1dCAweEZGRkYwMDAwIGludG8gcjYsIHRoZW4gdGhlCi1tb3ZlYSBpbnN0cnVjdGlvbiB3b3VsZCB0YWtlcyBpdHMgaW1tZWRpYXRlIG9wZXJhbmQsIDB4RkZGRiwgc2lnbiBleHRlbmQKLWl0IHRvIDMyIGJpdHMsIDB4RkZGRkZGRkYsIGFuZCB0aGVuIGFkZCBpdCBpbnRvIHI2IGdpdmluZyAweEZGRkVGRkZGCi13aGljaCBpcyB3cm9uZyAodGhlIGZpZnRoIG5pYmJsZSBpcyBFKS4gIFdpdGggdGhlIGhpKCkgcHNldWRvIG9wIGFkZGluZwotaW4gdGhlIHRvcCBiaXQgb2YgdGhlIGxvKCkgcHNldWRvIG9wLCB0aGUgbW92aGkgaW5zdHJ1Y3Rpb24gYWN0dWFsbHkKLXN0b3JlcyAwIGludG8gcjYgKDB4RkZGRiArIDEgPSAweDAwMDApLCBzbyB0aGF0IHRoZSBtb3ZlYSBpbnN0cnVjdGlvbgotc3RvcmVzIDB4RkZGRkZGRkYgaW50byByNiAtIHRoZSByaWdodCB2YWx1ZS4KLQotQGNpbmRleCBAY29kZXtoaWxvfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGhpbG8oKQotQ29tcHV0ZXMgdGhlIDMyIGJpdCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgc3RvcmVzIGl0IGludG8KLXRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gKHdoaWNoIG11c3QgYmUgYQotbW92IGluc3RydWN0aW9uKS4gIEZvciBleGFtcGxlOgotCi0gICAgQHNhbXB7bW92IGhpbG8oaGVyZSksIHI2fQotCi1jb21wdXRlcyB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiBsYWJlbCAnaGVyZScgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvCi1yZWdpc3RlciA2LiAgCi0KLUBjaW5kZXggQGNvZGV7c2Rhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIHNkYW9mZigpCi1Db21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgU21hbGwKLURhdGEgQXJlYSAod2hvZXMgYWRkcmVzcyBpcyBoZWxkIGluIHJlZ2lzdGVyIDQsIHRoZSBHUCByZWdpc3RlcikgYW5kCi1zdG9yZXMgdGhlIHJlc3VsdCBhcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUgaW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kCi1maWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZTogCi0KLSAgICAgIEBzYW1we2xkLncgc2Rhb2ZmKF9hX3ZhcmlhYmxlKVtncF0scjZ9Ci0KLWxvYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgbGFiZWwgJ19hX3ZhcmlhYmxlJwotaW50byByZWdpc3RlciA2LCBwcm92aWRlZCB0aGF0IHRoZSBsYWJlbCBpcyBsb2NhdGVkIHNvbWV3aGVyZSB3aXRoaW4gKy8tCi0zMksgb2YgdGhlIGFkZHJlc3MgaGVsZCBpbiB0aGUgR1AgcmVnaXN0ZXIuICBbTm90ZSB0aGUgbGlua2VyIGFzc3VtZXMKLXRoYXQgdGhlIEdQIHJlZ2lzdGVyIGNvbnRhaW5zIGEgZml4ZWQgYWRkcmVzcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCi1sYWJlbCBjYWxsZWQgJ19fZ3AnLiAgVGhpcyBjYW4gZWl0aGVyIGJlIHNldCB1cCBhdXRvbWF0aWNhbGx5IGJ5IHRoZQotbGlua2VyLCBvciBzcGVjaWZpY2FsbHkgc2V0IGJ5IHVzaW5nIHRoZSBAc2FtcHstLWRlZnN5bSBfX2dwPTx2YWx1ZT59Ci1jb21tYW5kIGxpbmUgb3B0aW9uXS4KLQotQGNpbmRleCBAY29kZXt0ZGFvZmZ9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gdGRhb2ZmKCkKLUNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWVkIHZhcmlhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBUaW55Ci1EYXRhIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiByZWdpc3RlciAzMCwgdGhlIEVQIHJlZ2lzdGVyKSBhbmQKLXN0b3JlcyB0aGUgcmVzdWx0IGFzIGEgNCw1LCA3IG9yIDggYml0IHVuc2lnbmVkIHZhbHVlIGluIHRoZSBpbW1lZGlhdGUKLW9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgIEBzYW1we3NsZC53IHRkYW9mZihfYV92YXJpYWJsZSlbZXBdLHI2fQotCi1sb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIGxhYmVsICdfYV92YXJpYWJsZScKLWludG8gcmVnaXN0ZXIgNiwgcHJvdmlkZWQgdGhhdCB0aGUgbGFiZWwgaXMgbG9jYXRlZCBzb21ld2hlcmUgd2l0aGluICsyNTYKLWJ5dGVzIG9mIHRoZSBhZGRyZXNzIGhlbGQgaW4gdGhlIEVQIHJlZ2lzdGVyLiAgW05vdGUgdGhlIGxpbmtlciBhc3N1bWVzCi10aGF0IHRoZSBFUCByZWdpc3RlciBjb250YWlucyBhIGZpeGVkIGFkZHJlc3Mgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZQotbGFiZWwgY2FsbGVkICdfX2VwJy4gIFRoaXMgY2FuIGVpdGhlciBiZSBzZXQgdXAgYXV0b21hdGljYWxseSBieSB0aGUKLWxpbmtlciwgb3Igc3BlY2lmaWNhbGx5IHNldCBieSB1c2luZyB0aGUgQHNhbXB7LS1kZWZzeW0gX19lcD08dmFsdWU+fQotY29tbWFuZCBsaW5lIG9wdGlvbl0uCi0KLUBjaW5kZXggQGNvZGV7emRhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIHpkYW9mZigpCi1Db21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIGFkZHJlc3MgMCBhbmQgc3RvcmVzIHRoZQotcmVzdWx0IGFzIGEgMTYgYml0IHNpZ25lZCB2YWx1ZSBpbiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlCi1naXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgICBAc2FtcHttb3ZlYSB6ZGFvZmYoX2FfdmFyaWFibGUpLHplcm8scjZ9Ci0KLXB1dHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhYmVsICdfYV92YXJpYWJsZScgaW50byByZWdpc3RlciA2LCBhc3N1bWluZwotdGhhdCB0aGUgbGFiZWwgaXMgc29tZXdoZXJlIHdpdGhpbiB0aGUgZmlyc3QgMzJLIG9mIG1lbW9yeS4gIChTdHJpY3RseQotc3BlYWtpbmcgaXQgYWxzbyBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGxhc3QgMzJLIG9mIG1lbW9yeSBhcyB3ZWxsLCBhcwotdGhlIG9mZnNldHMgYXJlIHNpZ25lZCkuCi0KLUBjaW5kZXggQGNvZGV7Y3RvZmZ9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gY3RvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIENhbGwKLVRhYmxlIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZyBpbiBzeXN0ZW0gcmVnaXN0ZXIgMjAsIHRoZSBDVEJQCi1yZWdpc3RlcikgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGEgNiBvciAxNiBiaXQgdW5zaWduZWQgdmFsdWUgaW4gdGhlCi1pbW1lZGlhdGUgZmllbGQgb2YgdGhlbiBnaXZlbiBpbnN0cnVjdGlvbiBvciBwaWVjZSBvZiBkYXRhLiAgRm9yCi1leGFtcGxlOgotCi0gICAgIEBzYW1we2NhbGx0IGN0b2ZmKHRhYmxlX2Z1bmMxKX0KLQotd2lsbCBwdXQgdGhlIGNhbGwgdGhlIGZ1bmN0aW9uIHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiB0aGUgY2FsbCB0YWJsZQotYXQgdGhlIGxvY2F0aW9uIGxhYmVsZWQgJ3RhYmxlX2Z1bmMxJy4KLQotQGVuZCB0YWJsZQotCi0KLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgVjg1MCBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtWODUwCi1GYW1pbHkgMzItLzE2LUJpdCBzaW5nbGUtQ2hpcCBNaWNyb2NvbnRyb2xsZXIgQXJjaGl0ZWN0dXJlIE1hbnVhbH0gZnJvbSBORUMuCi1MdGQuCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy12YXgudGV4aSBiL2dhcy9kb2MvYy12YXgudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzZDdlNS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtdmF4LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBjIFZBWC9WTVMgZGVzY3JpcHRpb24gZXhoYW5jZWQgYW5kIGNvcnJlY3RlZCBieSBLbGF1cyBLImFlbXBmLCBra2FlbXBmQHByb2dpcy5kZQotQGlmc2V0IEdFTkVSSUMKLUBub2RlIFZheC1EZXBlbmRlbnQKLUBjaGFwdGVyIFZBWCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBjaW5kZXggVkFYIHN1cHBvcnQKLQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIFZBWCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBjaW5kZXggVkFYIHN1cHBvcnQKLQotQGVuZCBpZmNsZWFyCi0KLUBtZW51Ci0qIFZBWC1PcHRzOjogICAgICAgICAgICAgICAgICAgIFZBWCBDb21tYW5kLUxpbmUgT3B0aW9ucwotKiBWQVgtZmxvYXQ6OiAgICAgICAgICAgICAgICAgICBWQVggRmxvYXRpbmcgUG9pbnQKLSogVkFYLWRpcmVjdGl2ZXM6OiAgICAgICAgICAgICAgVmF4IE1hY2hpbmUgRGlyZWN0aXZlcwotKiBWQVgtb3Bjb2Rlczo6ICAgICAgICAgICAgICAgICBWQVggT3Bjb2RlcwotKiBWQVgtYnJhbmNoOjogICAgICAgICAgICAgICAgICBWQVggQnJhbmNoIEltcHJvdmVtZW50Ci0qIFZBWC1vcGVyYW5kczo6ICAgICAgICAgICAgICAgIFZBWCBPcGVyYW5kcwotKiBWQVgtbm86OiAgICAgICAgICAgICAgICAgICAgICBOb3QgU3VwcG9ydGVkIG9uIFZBWAotQGVuZCBtZW51Ci0KLQotQG5vZGUgVkFYLU9wdHMKLUBzZWN0aW9uIFZBWCBDb21tYW5kLUxpbmUgT3B0aW9ucwotCi1AY2luZGV4IGNvbW1hbmQtbGluZSBvcHRpb25zIGlnbm9yZWQsIFZBWAotQGNpbmRleCBWQVggY29tbWFuZC1saW5lIG9wdGlvbnMgaWdub3JlZAotVGhlIFZheCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgYW55IG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucywKLWdpdmVzIGEgd2FybmluZyBtZXNzYWdlIHRoYXQgdGhlIG9wdGlvbiB3YXMgaWdub3JlZCBhbmQgcHJvY2VlZHMuCi1UaGVzZSBvcHRpb25zIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNjcmlwdHMgZGVzaWduZWQgZm9yIG90aGVyCi1wZW9wbGUncyBhc3NlbWJsZXJzLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7LUR9LCBpZ25vcmVkIG9uIFZBWAotQGNpbmRleCBAY29kZXstU30sIGlnbm9yZWQgb24gVkFYCi1AY2luZGV4IEBjb2Rley1UfSwgaWdub3JlZCBvbiBWQVgKLUBpdGVtIEBjb2Rley1EfSAoRGVidWcpCi1AaXRlbXggQGNvZGV7LVN9IChTeW1ib2wgVGFibGUpCi1AaXRlbXggQGNvZGV7LVR9IChUb2tlbiBUcmFjZSkKLVRoZXNlIGFyZSBvYnNvbGV0ZSBvcHRpb25zIHVzZWQgdG8gZGVidWcgb2xkIGFzc2VtYmxlcnMuCi0KLUBjaW5kZXggQGNvZGV7LWR9LCBWQVggb3B0aW9uCi1AaXRlbSBAY29kZXstZH0gKERpc3BsYWNlbWVudCBzaXplIGZvciBKVU1QcykKLVRoaXMgb3B0aW9uIGV4cGVjdHMgYSBudW1iZXIgZm9sbG93aW5nIHRoZSBAc2FtcHstZH0uICBMaWtlIG9wdGlvbnMKLXRoYXQgZXhwZWN0IGZpbGVuYW1lcywgdGhlIG51bWJlciBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IHRoZQotQHNhbXB7LWR9IChvbGQgc3RhbmRhcmQpIG9yIGNvbnN0aXR1dGUgdGhlIHdob2xlIG9mIHRoZSBjb21tYW5kIGxpbmUKLWFyZ3VtZW50IHRoYXQgZm9sbG93cyBAc2FtcHstZH0gKEBzY3tnbnV9IHN0YW5kYXJkKS4KLQotQGNpbmRleCBAY29kZXstVn0sIHJlZHVuZGFudCBvbiBWQVgKLUBpdGVtIEBjb2Rley1WfSAoVmlydHVhbGl6ZSBJbnRlcnBhc3MgVGVtcG9yYXJ5IEZpbGUpCi1Tb21lIG90aGVyIGFzc2VtYmxlcnMgdXNlIGEgdGVtcG9yYXJ5IGZpbGUuICBUaGlzIG9wdGlvbgotY29tbWFuZGVkIHRoZW0gdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gaW4gYWN0aXZlIG1lbW9yeSByYXRoZXIKLXRoYW4gaW4gYSBkaXNrIGZpbGUuICBAY29kZXtAdmFsdWV7QVN9fSBhbHdheXMgZG9lcyB0aGlzLCBzbyB0aGlzCi1vcHRpb24gaXMgcmVkdW5kYW50LgotCi1AY2luZGV4IEBjb2Rley1KfSwgaWdub3JlZCBvbiBWQVgKLUBpdGVtIEBjb2Rley1KfSAoSlVNUGlmeSBMb25nZXIgQnJhbmNoZXMpCi1NYW55IDMyLWJpdCBjb21wdXRlcnMgcGVybWl0IGEgdmFyaWV0eSBvZiBicmFuY2ggaW5zdHJ1Y3Rpb25zCi10byBkbyB0aGUgc2FtZSBqb2IuICBTb21lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBhcmUgc2hvcnQgKGFuZAotZmFzdCkgYnV0IGhhdmUgYSBsaW1pdGVkIHJhbmdlOyBvdGhlcnMgYXJlIGxvbmcgKGFuZCBzbG93KSBidXQKLWNhbiBicmFuY2ggYW55d2hlcmUgaW4gdmlydHVhbCBtZW1vcnkuICBPZnRlbiB0aGVyZSBhcmUgMwotZmxhdm9ycyBvZiBicmFuY2g6IHNob3J0LCBtZWRpdW0gYW5kIGxvbmcuICBTb21lIG90aGVyCi1hc3NlbWJsZXJzIHdvdWxkIGVtaXQgc2hvcnQgYW5kIG1lZGl1bSBicmFuY2hlcywgdW5sZXNzIHRvbGQgYnkKLXRoaXMgb3B0aW9uIHRvIGVtaXQgc2hvcnQgYW5kIGxvbmcgYnJhbmNoZXMuCi0KLUBjaW5kZXggQGNvZGV7LXR9LCBpZ25vcmVkIG9uIFZBWAotQGl0ZW0gQGNvZGV7LXR9IChUZW1wb3JhcnkgRmlsZSBEaXJlY3RvcnkpCi1Tb21lIG90aGVyIGFzc2VtYmxlcnMgbWF5IHVzZSBhIHRlbXBvcmFyeSBmaWxlLCBhbmQgdGhpcyBvcHRpb24KLXRha2VzIGEgZmlsZW5hbWUgYmVpbmcgdGhlIGRpcmVjdG9yeSB0byBzaXRlIHRoZSB0ZW1wb3JhcnkKLWZpbGUuICBTaW5jZSBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCB1c2UgYSB0ZW1wb3JhcnkgZGlzayBmaWxlLCB0aGlzCi1vcHRpb24gbWFrZXMgbm8gZGlmZmVyZW5jZS4gIEBzYW1wey10fSBuZWVkcyBleGFjdGx5IG9uZQotZmlsZW5hbWUuCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggVk1TIChWQVgpIG9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucyBmb3IgVkFYL1ZNUwotQGNpbmRleCBWQVgvVk1TIG9wdGlvbnMKLUBjaW5kZXggVmF4LTExIEMgY29tcGF0aWJpbGl0eQotQGNpbmRleCBzeW1ib2xzIHdpdGggdXBwZXJjYXNlLCBWQVgvVk1TCi1UaGUgVmF4IHZlcnNpb24gb2YgdGhlIGFzc2VtYmxlciBhY2NlcHRzIGFkZGl0aW9uYWwgb3B0aW9ucyB3aGVuCi1jb21waWxlZCBmb3IgVk1TOgotCi1AdGFibGUgQHNhbXAKLUBjaW5kZXggQHNhbXB7LWh9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLWggQHZhcntufQotRXh0ZXJuYWwgc3ltYm9sIG9yIHNlY3Rpb24gKHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXMpIG5hbWVzIGFyZSBub3QKLWNhc2Ugc2Vuc2l0aXZlIG9uIFZBWC9WTVMgYW5kIGFsd2F5cyBtYXBwZWQgdG8gdXBwZXIgY2FzZS4gIFRoaXMgaXMKLWNvbnRyYXJ5IHRvIHRoZSBDIGxhbmd1YWdlIGRlZmluaXRpb24gd2hpY2ggZXhwbGljaXRseSBkaXN0aW5ndWlzaGVzCi11cHBlciBhbmQgbG93ZXIgY2FzZS4gIFRvIGltcGxlbWVudCBhIHN0YW5kYXJkIGNvbmZvcm1pbmcgQyBjb21waWxlciwKLW5hbWVzIG11c3QgYmUgY2hhbmdlZCAobWFwcGVkKSB0byBwcmVzZXJ2ZSB0aGUgY2FzZSBpbmZvcm1hdGlvbi4gIFRoZQotZGVmYXVsdCBtYXBwaW5nIGlzIHRvIGNvbnZlcnQgYWxsIGxvd2VyIGNhc2UgY2hhcmFjdGVycyB0byB1cHBlcmNhc2UgYW5kCi1hZGRpbmcgYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhIDYgZGlnaXQgaGV4IHZhbHVlLCByZXByZXNlbnRpbmcgYSAyNAotZGlnaXQgYmluYXJ5IHZhbHVlLiAgVGhlIG9uZSBkaWdpdHMgaW4gdGhlIGJpbmFyeSB2YWx1ZSByZXByZXNlbnQgd2hpY2gKLWNoYXJhY3RlcnMgYXJlIHVwcGVyY2FzZSBpbiB0aGUgb3JpZ2luYWwgc3ltYm9sIG5hbWUuCi0KLVRoZSBAc2FtcHstaCBAdmFye259fSBvcHRpb24gZGV0ZXJtaW5lcyBob3cgd2UgbWFwIG5hbWVzLiAgVGhpcyB0YWtlcwotc2V2ZXJhbCB2YWx1ZXMuICBObyBAc2FtcHstaH0gc3dpdGNoIGF0IGFsbCBhbGxvd3MgY2FzZSBoYWNraW5nIGFzCi1kZXNjcmliZWQgYWJvdmUuICBBIHZhbHVlIG9mIHplcm8gKEBzYW1wey1oMH0pIGltcGxpZXMgbmFtZXMgc2hvdWxkIGJlCi11cHBlciBjYXNlLCBhbmQgaW5oaWJpdHMgdGhlIGNhc2UgaGFjay4gIEEgdmFsdWUgb2YgMiAoQHNhbXB7LWgyfSkKLWltcGxpZXMgbmFtZXMgc2hvdWxkIGJlIGFsbCBsb3dlciBjYXNlLCB3aXRoIG5vIGNhc2UgaGFjay4gIEEgdmFsdWUgb2YgMwotKEBzYW1wey1oM30pIGltcGxpZXMgdGhhdCBjYXNlIHNob3VsZCBiZSBwcmVzZXJ2ZWQuICBUaGUgdmFsdWUgMSBpcwotdW51c2VkLiAgVGhlIEBjb2Rley1IfSBvcHRpb24gZGlyZWN0cyBAY29kZXtAdmFsdWV7QVN9fSB0byBkaXNwbGF5Ci1ldmVyeSBtYXBwZWQgc3ltYm9sIGR1cmluZyBhc3NlbWJseS4KLQotU3ltYm9scyB3aG9zZSBuYW1lcyBpbmNsdWRlIGEgZG9sbGFyIHNpZ24gQHNhbXB7JH0gYXJlIGV4Y2VwdGlvbnMgdG8gdGhlCi1nZW5lcmFsIG5hbWUgbWFwcGluZy4gIFRoZXNlIHN5bWJvbHMgYXJlIG5vcm1hbGx5IG9ubHkgdXNlZCB0byByZWZlcmVuY2UKLVZNUyBsaWJyYXJ5IG5hbWVzLiAgU3VjaCBzeW1ib2xzIGFyZSBhbHdheXMgbWFwcGVkIHRvIHVwcGVyIGNhc2UuCi0KLUBjaW5kZXggQHNhbXB7LSt9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLSsKLVRoZSBAc2FtcHstK30gb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byB0cnVuY2F0ZSBhbnkgc3ltYm9sCi1uYW1lIGxhcmdlciB0aGFuIDMxIGNoYXJhY3RlcnMuICBUaGUgQHNhbXB7LSt9IG9wdGlvbiBhbHNvIHByZXZlbnRzIHNvbWUKLWNvZGUgZm9sbG93aW5nIHRoZSBAc2FtcHtfbWFpbn0gc3ltYm9sIG5vcm1hbGx5IGFkZGVkIHRvIG1ha2UgdGhlIG9iamVjdAotZmlsZSBjb21wYXRpYmxlIHdpdGggVmF4LTExICJDIi4KLQotQGNpbmRleCBAc2FtcHstMX0gb3B0aW9uLCBWQVgvVk1TCi1AaXRlbSAtMQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIEBjb2Rle0B2YWx1ZXtBU319Ci12ZXJzaW9uIDEueC4KLQotQGNpbmRleCBAc2FtcHstSH0gb3B0aW9uLCBWQVgvVk1TCi1AaXRlbSAtSAotVGhlIEBzYW1wey1IfSBvcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHByaW50IGV2ZXJ5IHN5bWJvbAotd2hpY2ggd2FzIGNoYW5nZWQgYnkgY2FzZSBtYXBwaW5nLgotQGVuZCB0YWJsZQotCi1Abm9kZSBWQVgtZmxvYXQKLUBzZWN0aW9uIFZBWCBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IFZBWCBmbG9hdGluZyBwb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgVkFYCi1Db252ZXJzaW9uIG9mIGZsb251bXMgdG8gZmxvYXRpbmcgcG9pbnQgaXMgY29ycmVjdCwgYW5kCi1jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgYXNzZW1ibGVycy4gIFJvdW5kaW5nIGlzCi10b3dhcmRzIHplcm8gaWYgdGhlIHJlbWFpbmRlciBpcyBleGFjdGx5IGhhbGYgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KLQotQGNvZGV7RH0sIEBjb2Rle0Z9LCBAY29kZXtHfSBhbmQgQGNvZGV7SH0gZmxvYXRpbmcgcG9pbnQgZm9ybWF0cwotYXJlIHVuZGVyc3Rvb2QuCi0KLUltbWVkaWF0ZSBmbG9hdGluZyBsaXRlcmFscyAoQGVtcGh7ZS5nLn0gQHNhbXB7U2AkNi45fSkKLWFyZSByZW5kZXJlZCBjb3JyZWN0bHkuICBBZ2Fpbiwgcm91bmRpbmcgaXMgdG93YXJkcyB6ZXJvIGluIHRoZQotYm91bmRhcnkgY2FzZS4KLQotQGNpbmRleCBAY29kZXtmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBjaW5kZXggQGNvZGV7ZG91YmxlfSBkaXJlY3RpdmUsIFZBWAotVGhlIEBjb2Rley5mbG9hdH0gZGlyZWN0aXZlIHByb2R1Y2VzIEBjb2Rle2Z9IGZvcm1hdCBudW1iZXJzLgotVGhlIEBjb2Rley5kb3VibGV9IGRpcmVjdGl2ZSBwcm9kdWNlcyBAY29kZXtkfSBmb3JtYXQgbnVtYmVycy4KLQotQG5vZGUgVkFYLWRpcmVjdGl2ZXMKLUBzZWN0aW9uIFZheCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIFZBWAotQGNpbmRleCBWQVggbWFjaGluZSBkaXJlY3RpdmVzCi1UaGUgVmF4IHZlcnNpb24gb2YgdGhlIGFzc2VtYmxlciBzdXBwb3J0cyBmb3VyIGRpcmVjdGl2ZXMgZm9yCi1nZW5lcmF0aW5nIFZheCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuICBUaGV5IGFyZSBkZXNjcmliZWQgaW4gdGhlCi10YWJsZSBiZWxvdy4KLQotQGNpbmRleCB3aWRlIGZsb2F0aW5nIHBvaW50IGRpcmVjdGl2ZXMsIFZBWAotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2RmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBpdGVtIC5kZmxvYXQKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kCi1hc3NlbWJsZXMgVmF4IEBjb2Rle2R9IGZvcm1hdCA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2ZmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBpdGVtIC5mZmxvYXQKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kCi1hc3NlbWJsZXMgVmF4IEBjb2Rle2Z9IGZvcm1hdCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2dmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBpdGVtIC5nZmxvYXQKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kCi1hc3NlbWJsZXMgVmF4IEBjb2Rle2d9IGZvcm1hdCA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2hmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBpdGVtIC5oZmxvYXQKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kCi1hc3NlbWJsZXMgVmF4IEBjb2Rle2h9IGZvcm1hdCAxMjgtYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBWQVgtb3Bjb2RlcwotQHNlY3Rpb24gVkFYIE9wY29kZXMKLQotQGNpbmRleCBWQVggb3Bjb2RlIG1uZW1vbmljcwotQGNpbmRleCBvcGNvZGUgbW5lbW9uaWNzLCBWQVgKLUBjaW5kZXggbW5lbW9uaWNzIGZvciBvcGNvZGVzLCBWQVgKLUFsbCBERUMgbW5lbW9uaWNzIGFyZSBzdXBwb3J0ZWQuICBCZXdhcmUgdGhhdCBAY29kZXtjYXNlQGRvdHN7fX0KLWluc3RydWN0aW9ucyBoYXZlIGV4YWN0bHkgMyBvcGVyYW5kcy4gIFRoZSBkaXNwYXRjaCB0YWJsZSB0aGF0Ci1mb2xsb3dzIHRoZSBAY29kZXtjYXNlQGRvdHN7fX0gaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIG1hZGUgd2l0aAotQGNvZGV7LndvcmR9IHN0YXRlbWVudHMuICBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgdW5peAotYXNzZW1ibGVycyB3ZSBrbm93IG9mLgotCi1Abm9kZSBWQVgtYnJhbmNoCi1Ac2VjdGlvbiBWQVggQnJhbmNoIEltcHJvdmVtZW50Ci0KLUBjaW5kZXggVkFYIGJyYW5jaCBpbXByb3ZlbWVudAotQGNpbmRleCBicmFuY2ggaW1wcm92ZW1lbnQsIFZBWAotQGNpbmRleCBwc2V1ZG8tb3BzIGZvciBicmFuY2gsIFZBWAotQ2VydGFpbiBwc2V1ZG8gb3Bjb2RlcyBhcmUgcGVybWl0dGVkLiAgVGhleSBhcmUgZm9yIGJyYW5jaAotaW5zdHJ1Y3Rpb25zLiAgVGhleSBleHBhbmQgdG8gdGhlIHNob3J0ZXN0IGJyYW5jaCBpbnN0cnVjdGlvbiB0aGF0Ci1yZWFjaGVzIHRoZSB0YXJnZXQuICBHZW5lcmFsbHkgdGhlc2UgbW5lbW9uaWNzIGFyZSBtYWRlIGJ5Ci1zdWJzdGl0dXRpbmcgQHNhbXB7an0gZm9yIEBzYW1we2J9IGF0IHRoZSBzdGFydCBvZiBhIERFQyBtbmVtb25pYy4KLVRoaXMgZmVhdHVyZSBpcyBpbmNsdWRlZCBib3RoIGZvciBjb21wYXRpYmlsaXR5IGFuZCB0byBoZWxwCi1jb21waWxlcnMuICBJZiB5b3UgZG8gbm90IG5lZWQgdGhpcyBmZWF0dXJlLCBhdm9pZCB0aGVzZQotb3Bjb2Rlcy4gIEhlcmUgYXJlIHRoZSBtbmVtb25pY3MsIGFuZCB0aGUgY29kZSB0aGV5IGNhbiBleHBhbmQgaW50by4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBqYnNiCi1Ac2FtcHtKc2J9IGlzIGFscmVhZHkgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMsIHNvIHdlIGNob3NlIEBzYW1we2pic2J9LgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JzYmIgQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBrYmR7YnNidyBAZG90c3t9fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGtiZHtqc2IgQGRvdHN7fX0KLUBlbmQgdGFibGUKLUBpdGVtIGpicgotQGl0ZW14IGpyCi1VbmNvbmRpdGlvbmFsIGJyYW5jaC4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHticmIgQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBrYmR7YnJ3IEBkb3Rze319Ci1AaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCi1Aa2Jke2ptcCBAZG90c3t9fQotQGVuZCB0YWJsZQotQGl0ZW0gakB2YXJ7Q09ORH0KLUB2YXJ7Q09ORH0gbWF5IGJlIGFueSBvbmUgb2YgdGhlIGNvbmRpdGlvbmFsIGJyYW5jaGVzCi1AY29kZXtuZXF9LCBAY29kZXtuZXF1fSwgQGNvZGV7ZXFsfSwgQGNvZGV7ZXFsdX0sIEBjb2Rle2d0cn0sCi1AY29kZXtnZXF9LCBAY29kZXtsc3N9LCBAY29kZXtndHJ1fSwgQGNvZGV7bGVxdX0sIEBjb2Rle3ZjfSwgQGNvZGV7dnN9LAotQGNvZGV7Z2VxdX0sIEBjb2Rle2NjfSwgQGNvZGV7bHNzdX0sIEBjb2Rle2NzfS4KLUB2YXJ7Q09ORH0gbWF5IGFsc28gYmUgb25lIG9mIHRoZSBiaXQgdGVzdHMKLUBjb2Rle2JzfSwgQGNvZGV7YmN9LCBAY29kZXtic3N9LCBAY29kZXtiY3N9LCBAY29kZXtic2N9LCBAY29kZXtiY2N9LAotQGNvZGV7YnNzaX0sIEBjb2Rle2JjY2l9LCBAY29kZXtsYnN9LCBAY29kZXtsYmN9LgotQHZhcntOT1RDT05EfSBpcyB0aGUgb3Bwb3NpdGUgY29uZGl0aW9uIHRvIEB2YXJ7Q09ORH0uCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7YkB2YXJ7Q09ORH0gQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBrYmR7YkB2YXJ7Tk9UQ09ORH0gZm9vIDsgYnJ3IEBkb3Rze30gOyBmb286fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGtiZHtiQHZhcntOT1RDT05EfSBmb28gOyBqbXAgQGRvdHN7fSA7IGZvbzp9Ci1AZW5kIHRhYmxlCi1AaXRlbSBqYWNiQHZhcntYfQotQHZhcntYfSBtYXkgYmUgb25lIG9mIEBjb2Rle2IgZCBmIGcgaCBsIHd9LgotQHRhYmxlIEBhc2lzCi1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke0B2YXJ7T1BDT0RFfSBAZG90c3t9fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGptcCBAZG90c3t9IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQotQGl0ZW0gamFvYkB2YXJ7WVlZfQotQHZhcntZWVl9IG1heSBiZSBvbmUgb2YgQGNvZGV7bHNzIGxlcX0uCi1AaXRlbSBqc29iQHZhcntaWlp9Ci1AdmFye1paWn0gbWF5IGJlIG9uZSBvZiBAY29kZXtnZXEgZ3RyfS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHtAdmFye09QQ09ERX0gQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBicncgQHZhcntkZXN0aW5hdGlvbn0gOwotYmFyOgotQGVuZCBleGFtcGxlCi1AaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogam1wIEB2YXJ7ZGVzdGluYXRpb259IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQotQGl0ZW0gYW9ibGVxCi1AaXRlbXggYW9ibHNzCi1AaXRlbXggc29iZ2VxCi1AaXRlbXggc29iZ3RyCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7QHZhcntPUENPREV9IEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogYnJ3IEB2YXJ7ZGVzdGluYXRpb259IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGptcCBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLUBlbmQgdGFibGUKLQotQG5vZGUgVkFYLW9wZXJhbmRzCi1Ac2VjdGlvbiBWQVggT3BlcmFuZHMKLQotQGNpbmRleCBWQVggb3BlcmFuZCBub3RhdGlvbgotQGNpbmRleCBvcGVyYW5kIG5vdGF0aW9uLCBWQVgKLUBjaW5kZXggaW1tZWRpYXRlIGNoYXJhY3RlciwgVkFYCi1AY2luZGV4IFZBWCBpbW1lZGlhdGUgY2hhcmFjdGVyCi1UaGUgaW1tZWRpYXRlIGNoYXJhY3RlciBpcyBAc2FtcHskfSBmb3IgVW5peCBjb21wYXRpYmlsaXR5LCBub3QKLUBzYW1weyN9IGFzIERFQyB3cml0ZXMgaXQuCi0KLUBjaW5kZXggaW5kaXJlY3QgY2hhcmFjdGVyLCBWQVgKLUBjaW5kZXggVkFYIGluZGlyZWN0IGNoYXJhY3RlcgotVGhlIGluZGlyZWN0IGNoYXJhY3RlciBpcyBAc2FtcHsqfSBmb3IgVW5peCBjb21wYXRpYmlsaXR5LCBub3QKLUBzYW1we0BAfSBhcyBERUMgd3JpdGVzIGl0LgotCi1AY2luZGV4IGRpc3BsYWNlbWVudCBzaXppbmcgY2hhcmFjdGVyLCBWQVgKLUBjaW5kZXggVkFYIGRpc3BsYWNlbWVudCBzaXppbmcgY2hhcmFjdGVyCi1UaGUgZGlzcGxhY2VtZW50IHNpemluZyBjaGFyYWN0ZXIgaXMgQHNhbXB7YH0gKGFuIGFjY2VudCBncmF2ZSkgZm9yCi1Vbml4IGNvbXBhdGliaWxpdHksIG5vdCBAc2FtcHtefSBhcyBERUMgd3JpdGVzIGl0LiAgVGhlIGxldHRlcgotcHJlY2VkaW5nIEBzYW1we2B9IG1heSBoYXZlIGVpdGhlciBjYXNlLiAgQHNhbXB7R30gaXMgbm90Ci11bmRlcnN0b29kLCBidXQgYWxsIG90aGVyIGxldHRlcnMgKEBjb2Rle2IgaSBsIHMgd30pIGFyZSB1bmRlcnN0b29kLgotCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBWQVgKLUBjaW5kZXggVkFYIHJlZ2lzdGVyIG5hbWVzCi1SZWdpc3RlciBuYW1lcyB1bmRlcnN0b29kIGFyZSBAY29kZXtyMCByMSByMiBAZG90c3t9IHIxNSBhcCBmcCBzcAotcGN9LiAgVXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycyBhcmUgZXF1aXZhbGVudC4KLQotRm9yIGluc3RhbmNlCi1Ac21hbGxleGFtcGxlCi10c3RiICp3YCQ0KHI1KQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQW55IGV4cHJlc3Npb24gaXMgcGVybWl0dGVkIGluIGFuIG9wZXJhbmQuICBPcGVyYW5kcyBhcmUgY29tbWEKLXNlcGFyYXRlZC4KLQotQGMgVGhlcmUgaXMgc29tZSBidWcgdG8gZG8gd2l0aCByZWNvZ25pemluZyBleHByZXNzaW9ucwotQGMgaW4gb3BlcmFuZHMsIGJ1dCBJIGZvcmdldCB3aGF0IGl0IGlzLiAgSXQgaXMKLUBjIGEgc3ludGF4IGNsYXNoIGJlY2F1c2UgKCkgaXMgdXNlZCBhcyBhbiBhZGRyZXNzIG1vZGUKLUBjIGFuZCB0byBlbmNhcHN1bGF0ZSBzdWItZXhwcmVzc2lvbnMuCi0KLUBub2RlIFZBWC1ubwotQHNlY3Rpb24gTm90IFN1cHBvcnRlZCBvbiBWQVgKLQotQGNpbmRleCBWQVggYml0ZmllbGRzIG5vdCBzdXBwb3J0ZWQKLUBjaW5kZXggYml0ZmllbGRzLCBub3Qgc3VwcG9ydGVkIG9uIFZBWAotVmF4IGJpdCBmaWVsZHMgY2FuIG5vdCBiZSBhc3NlbWJsZWQgd2l0aCBAY29kZXtAdmFsdWV7QVN9fS4gIFNvbWVvbmUKLWNhbiBhZGQgdGhlIHJlcXVpcmVkIGNvZGUgaWYgdGhleSByZWFsbHkgbmVlZCBpdC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy16OGsudGV4aSBiL2dhcy9kb2MvYy16OGsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiMTBlMy4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtejhrLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIFo4MDAwLURlcGVuZGVudAotQGNoYXB0ZXIgWjgwMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgWjgwMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBaODAwMCBzdXBwb3J0Ci1UaGUgWjgwMDAgQHZhbHVle0FTfSBzdXBwb3J0cyBib3RoIG1lbWJlcnMgb2YgdGhlIFo4MDAwIGZhbWlseTogdGhlCi11bnNlZ21lbnRlZCBaODAwMiwgd2l0aCAxNiBiaXQgYWRkcmVzc2VzLCBhbmQgdGhlIHNlZ21lbnRlZCBaODAwMSB3aXRoCi0yNCBiaXQgYWRkcmVzc2VzLgotCi1XaGVuIHRoZSBhc3NlbWJsZXIgaXMgaW4gdW5zZWdtZW50ZWQgbW9kZSAoc3BlY2lmaWVkIHdpdGggdGhlCi1AY29kZXt1bnNlZ219IGRpcmVjdGl2ZSksIGFuIGFkZHJlc3MgdGFrZXMgdXAgb25lIHdvcmQgKDE2IGJpdCkKLXNpemVkIHJlZ2lzdGVyLiAgV2hlbiB0aGUgYXNzZW1ibGVyIGlzIGluIHNlZ21lbnRlZCBtb2RlIChzcGVjaWZpZWQgd2l0aAotdGhlIEBjb2Rle3NlZ219IGRpcmVjdGl2ZSksIGEgMjQtYml0IGFkZHJlc3MgdGFrZXMgdXAgYSBsb25nICgzMiBiaXQpCi1yZWdpc3Rlci4gIEB4cmVme1o4MDAwIERpcmVjdGl2ZXMsLEFzc2VtYmxlciBEaXJlY3RpdmVzIGZvciB0aGUgWjgwMDB9LAotZm9yIGEgbGlzdCBvZiBvdGhlciBaODAwMCBzcGVjaWZpYyBhc3NlbWJsZXIgZGlyZWN0aXZlcy4KLQotQG1lbnUKLSogWjgwMDAgT3B0aW9uczo6ICAgICAgICAgICAgICAgTm8gc3BlY2lhbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgWjgwMDAKLSogWjgwMDAgU3ludGF4OjogICAgICAgICAgICAgICAgQXNzZW1ibGVyIHN5bnRheCBmb3IgdGhlIFo4MDAwCi0qIFo4MDAwIERpcmVjdGl2ZXM6OiAgICAgICAgICAgIFNwZWNpYWwgZGlyZWN0aXZlcyBmb3IgdGhlIFo4MDAwCi0qIFo4MDAwIE9wY29kZXM6OiAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBaODAwMCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggWjgwMDAgb3B0aW9ucwotQGNpbmRleCBvcHRpb25zLCBaODAwMAotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBaaWxvZwotWjgwMDAgZmFtaWx5LgotCi1Abm9kZSBaODAwMCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQG1lbnUKLSogWjgwMDAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogWjgwMDAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBaODAwMC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBaODAwMC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgWjgwMDAKLUBjaW5kZXggWjgwMDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7IX0gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIFo4MDAwCi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIFo4MDAwCi1AY2luZGV4IFo4MDAwIGxpbmUgc2VwYXJhdG9yCi1Zb3UgY2FuIHVzZSBAc2FtcHs7fSBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1Abm9kZSBaODAwMC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IFo4MDAwIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIFo4MDAwCi1UaGUgWjgwMDAgaGFzIHNpeHRlZW4gMTYgYml0IHJlZ2lzdGVycywgbnVtYmVyZWQgMCB0byAxNS4gIFlvdSBjYW4gcmVmZXIKLXRvIGRpZmZlcmVudCBzaXplZCBncm91cHMgb2YgcmVnaXN0ZXJzIGJ5IHJlZ2lzdGVyIG51bWJlciwgd2l0aCB0aGUKLXByZWZpeCBAc2FtcHtyfSBmb3IgMTYgYml0IHJlZ2lzdGVycywgQHNhbXB7cnJ9IGZvciAzMiBiaXQgcmVnaXN0ZXJzIGFuZAotQHNhbXB7cnF9IGZvciA2NCBiaXQgcmVnaXN0ZXJzLiAgWW91IGNhbiBhbHNvIHJlZmVyIHRvIHRoZSBjb250ZW50cyBvZgotdGhlIGZpcnN0IGVpZ2h0IChvZiB0aGUgc2l4dGVlbiAxNiBiaXQgcmVnaXN0ZXJzKSBieSBieXRlcy4gIFRoZXkgYXJlCi1uYW1lZCBAc2FtcHtyQHZhcntufWh9IGFuZCBAc2FtcHtyQHZhcntufWx9LgotCi1Ac21hbGxleGFtcGxlCi1AZXhkZW50IEBlbXBoe2J5dGUgcmVnaXN0ZXJzfQotcjBsIHIwaCByMWggcjFsIHIyaCByMmwgcjNoIHIzbAotcjRoIHI0bCByNWggcjVsIHI2aCByNmwgcjdoIHI3bAotCi1AZXhkZW50IEBlbXBoe3dvcmQgcmVnaXN0ZXJzfQotcjAgcjEgcjIgcjMgcjQgcjUgcjYgcjcgcjggcjkgcjEwIHIxMSByMTIgcjEzIHIxNCByMTUKLQotQGV4ZGVudCBAZW1waHtsb25nIHdvcmQgcmVnaXN0ZXJzfQotcnIwIHJyMiBycjQgcnI2IHJyOCBycjEwIHJyMTIgcnIxNAotCi1AZXhkZW50IEBlbXBoe3F1YWQgd29yZCByZWdpc3RlcnN9Ci1ycTAgcnE0IHJxOCBycTEyCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBaODAwMC1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi0KLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgWjgwMDAKLUBjaW5kZXggWjgwMCBhZGRyZXNzaW5nIG1vZGVzCi1AdmFsdWV7QVN9IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIFo4MDAwOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEByQHZhcntufQotSW5kaXJlY3QgcmVnaXN0ZXIKLQotQGl0ZW0gQHZhcnthZGRyfQotRGlyZWN0OiB0aGUgMTYgYml0IG9yIDI0IGJpdCBhZGRyZXNzIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYXNzZW1ibGVyCi1pcyBpbiBzZWdtZW50ZWQgb3IgdW5zZWdtZW50ZWQgbW9kZSkgb2YgdGhlIG9wZXJhbmQgaXMgaW4gdGhlIGluc3RydWN0aW9uLgotCi1AaXRlbSBhZGRyZXNzKHJAdmFye259KQotSW5kZXhlZDogdGhlIDE2IG9yIDI0IGJpdCBhZGRyZXNzIGlzIGFkZGVkIHRvIHRoZSAxNiBiaXQgcmVnaXN0ZXIgdG8gcHJvZHVjZQotdGhlIGZpbmFsIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSBvcGVyYW5kLgotCi1AaXRlbSByQHZhcntufSgjQHZhcntpbW19KQotQmFzZSBBZGRyZXNzOiB0aGUgMTYgb3IgMjQgYml0IHJlZ2lzdGVyIGlzIGFkZGVkIHRvIHRoZSAxNiBiaXQgc2lnbgotZXh0ZW5kZWQgaW1tZWRpYXRlIGRpc3BsYWNlbWVudCB0byBwcm9kdWNlIHRoZSBmaW5hbCBhZGRyZXNzIGluIG1lbW9yeQotb2YgdGhlIG9wZXJhbmQuCi0KLUBpdGVtIHJAdmFye259KHJAdmFye219KQotQmFzZSBJbmRleDogdGhlIDE2IG9yIDI0IGJpdCByZWdpc3RlciByQHZhcntufSBpcyBhZGRlZCB0byB0aGUgc2lnbgotZXh0ZW5kZWQgMTYgYml0IGluZGV4IHJlZ2lzdGVyIHJAdmFye219IHRvIHByb2R1Y2UgdGhlIGZpbmFsIGFkZHJlc3MgaW4KLW1lbW9yeSBvZiB0aGUgb3BlcmFuZC4KLQotQGl0ZW0gI0B2YXJ7eHh9Ci1JbW1lZGlhdGUgZGF0YSBAdmFye3h4fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgWjgwMDAgRGlyZWN0aXZlcwotQHNlY3Rpb24gQXNzZW1ibGVyIERpcmVjdGl2ZXMgZm9yIHRoZSBaODAwMAotCi1AY2luZGV4IFo4MDAwIGRpcmVjdGl2ZXMKLUBjaW5kZXggZGlyZWN0aXZlcywgWjgwMDAKLVRoZSBaODAwMCBwb3J0IG9mIEB2YWx1ZXtBU30gaW5jbHVkZXMgdGhlc2UgYWRkaXRpb25hbCBhc3NlbWJsZXIgZGlyZWN0aXZlcywKLWZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgWjgwMDAgYXNzZW1ibGVycy4gIEFzIHNob3duLCB0aGVzZSBkbyBub3QKLWJlZ2luIHdpdGggQHNhbXB7Ln0gKHVubGlrZSB0aGUgb3JkaW5hcnkgQHZhbHVle0FTfSBkaXJlY3RpdmVzKS4KLQotQHRhYmxlIEBjb2RlCi1Aa2luZGV4IHNlZ20KLUBpdGVtIHNlZ20KLUdlbmVyYXRlcyBjb2RlIGZvciB0aGUgc2VnbWVudGVkIFo4MDAxLgotCi1Aa2luZGV4IHVuc2VnbQotQGl0ZW0gdW5zZWdtCi1HZW5lcmF0ZXMgY29kZSBmb3IgdGhlIHVuc2VnbWVudGVkIFo4MDAyLgotCi1Aa2luZGV4IG5hbWUKLUBpdGVtIG5hbWUKLVN5bm9ueW0gZm9yIEBjb2Rley5maWxlfQotCi1Aa2luZGV4IGdsb2JhbAotQGl0ZW0gZ2xvYmFsCi1TeW5vbnltIGZvciBAY29kZXsuZ2xvYmFsfQotCi1Aa2luZGV4IHd2YWwKLUBpdGVtIHd2YWwKLVN5bm9ueW0gZm9yIEBjb2Rley53b3JkfQotCi1Aa2luZGV4IGx2YWwKLUBpdGVtIGx2YWwKLVN5bm9ueW0gZm9yIEBjb2Rley5sb25nfQotCi1Aa2luZGV4IGJ2YWwKLUBpdGVtIGJ2YWwKLVN5bm9ueW0gZm9yIEBjb2Rley5ieXRlfQotCi1Aa2luZGV4IHN2YWwKLUBpdGVtIHN2YWwKLUFzc2VtYmxlIGEgc3RyaW5nLiAgQGNvZGV7c3ZhbH0gZXhwZWN0cyBvbmUgc3RyaW5nIGxpdGVyYWwsIGRlbGltaXRlZCBieQotc2luZ2xlIHF1b3Rlcy4gIEl0IGFzc2VtYmxlcyBlYWNoIGJ5dGUgb2YgdGhlIHN0cmluZyBpbnRvIGNvbnNlY3V0aXZlCi1hZGRyZXNzZXMuICBZb3UgY2FuIHVzZSB0aGUgZXNjYXBlIHNlcXVlbmNlIEBzYW1weyVAdmFye3h4fX0gKHdoZXJlCi1AdmFye3h4fSByZXByZXNlbnRzIGEgdHdvLWRpZ2l0IGhleGFkZWNpbWFsIG51bWJlcikgdG8gcmVwcmVzZW50IHRoZQotY2hhcmFjdGVyIHdob3NlIEBzY3thc2NpaX0gdmFsdWUgaXMgQHZhcnt4eH0uICBVc2UgdGhpcyBmZWF0dXJlIHRvCi1kZXNjcmliZSBzaW5nbGUgcXVvdGUgYW5kIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBtYXkgbm90IGFwcGVhciBpbiBzdHJpbmcKLWxpdGVyYWxzIGFzIHRoZW1zZWx2ZXMuICBGb3IgZXhhbXBsZSwgdGhlIEMgc3RhdGVtZW50IEB3e0BzYW1we2NoYXIgKmEgPQotImhlIHNhaWQgXCJpdCdzIDUwJSBvZmZcIiI7fX0gaXMgcmVwcmVzZW50ZWQgaW4gWjgwMDAgYXNzZW1ibHkgbGFuZ3VhZ2UKLShzaG93biB3aXRoIHRoZSBhc3NlbWJsZXIgb3V0cHV0IGluIGhleCBhdCB0aGUgbGVmdCkgYXMKLQotQGlmdGV4Ci1AYmVnaW5ncm91cAotQGxldEBub25hcnJvd2luZz1AY29tbWVudAotQGVuZCBpZnRleAotQHNtYWxsZXhhbXBsZQotNjg2NTIwNzMgICAgc3ZhbCAgICAnaGUgc2FpZCAlMjJpdCUyN3MgNTAlMjUgb2ZmJTIyJTAwJwotNjE2OTY0MjAKLTIyNjk3NDI3Ci03MzIwMzUzMAotMjUyMDZGNjYKLTY2MjIwMAotQGVuZCBzbWFsbGV4YW1wbGUKLUBpZnRleAotQGVuZGdyb3VwCi1AZW5kIGlmdGV4Ci0KLUBraW5kZXggcnNlY3QKLUBpdGVtIHJzZWN0Ci1zeW5vbnltIGZvciBAY29kZXsuc2VjdGlvbn0KLQotQGtpbmRleCBibG9jawotQGl0ZW0gYmxvY2sKLXN5bm9ueW0gZm9yIEBjb2Rley5zcGFjZX0KLQotQGtpbmRleCBldmVuCi1AaXRlbSBldmVuCi1zcGVjaWFsIGNhc2Ugb2YgQGNvZGV7LmFsaWdufTsgYWxpZ25zIG91dHB1dCB0byBldmVuIGJ5dGUgYm91bmRhcnkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIFo4MDAwIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBaODAwMCBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgWjgwMDAKLUBjaW5kZXggbW5lbW9uaWNzLCBaODAwMAotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBaODAwMAotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBaODAwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtaODAwMCBUZWNobmljYWwgTWFudWFsfS4KLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGNvZGVzIGFuZCB0aGVpciBhcmd1bWVudHM6Ci1AaWZ0ZXgKLUBiZWdpbmdyb3VwCi1AbGV0QG5vbmFycm93aW5nPUBjb21tZW50Ci1AZW5kIGlmdGV4Ci1Ac21hbGxleGFtcGxlCi0KLSAgICAgICAgICAgIHJzICAgQHJ7MTYgYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJkICAgQHJ7MTYgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgcmJzICAgQHJ7OCBiaXQgc291cmNlIHJlZ2lzdGVyfQotICAgICAgICAgICAgcmJkICAgQHJ7OCBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBycnMgICBAcnszMiBiaXQgc291cmNlIHJlZ2lzdGVyfQotICAgICAgICAgICAgcnJkICAgQHJ7MzIgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgcnFzICAgQHJ7NjQgYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJxZCAgIEByezY0IGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIGFkZHIgQHJ7MTYvMjQgYml0IGFkZHJlc3N9Ci0gICAgICAgICAgICBpbW0gIEBye2ltbWVkaWF0ZSBkYXRhfQotCi1hZGMgcmQscnMgICAgICAgICAgICAgICBjbHJiIGFkZHIgICAgICAgICAgICAgICBjcHNpciBAQHJkLEBAcnMscnIsY2MKLWFkY2IgcmJkLHJicyAgICAgICAgICAgIGNscmIgYWRkcihyZCkgICAgICAgICAgIGNwc2lyYiBAQHJkLEBAcnMscnIsY2MKLWFkZCByZCxAQHJzICAgICAgICAgICAgICBjbHJiIHJiZCAgICAgICAgICAgICAgICBkYWIgcmJkCi1hZGQgcmQsYWRkciAgICAgICAgICAgICBjb20gQEByZCAgICAgICAgICAgICAgICAgZGJqbnogcmJkLGRpc3A3Ci1hZGQgcmQsYWRkcihycykgICAgICAgICBjb20gYWRkciAgICAgICAgICAgICAgICBkZWMgQEByZCxpbW00bTEKLWFkZCByZCxpbW0xNiAgICAgICAgICAgIGNvbSBhZGRyKHJkKSAgICAgICAgICAgIGRlYyBhZGRyKHJkKSxpbW00bTEKLWFkZCByZCxycyAgICAgICAgICAgICAgIGNvbSByZCAgICAgICAgICAgICAgICAgIGRlYyBhZGRyLGltbTRtMQotYWRkYiByYmQsQEBycyAgICAgICAgICAgIGNvbWIgQEByZCAgICAgICAgICAgICAgICBkZWMgcmQsaW1tNG0xCi1hZGRiIHJiZCxhZGRyICAgICAgICAgICBjb21iIGFkZHIgICAgICAgICAgICAgICBkZWNiIEBAcmQsaW1tNG0xCi1hZGRiIHJiZCxhZGRyKHJzKSAgICAgICBjb21iIGFkZHIocmQpICAgICAgICAgICBkZWNiIGFkZHIocmQpLGltbTRtMQotYWRkYiByYmQsaW1tOCAgICAgICAgICAgY29tYiByYmQgICAgICAgICAgICAgICAgZGVjYiBhZGRyLGltbTRtMQotYWRkYiByYmQscmJzICAgICAgICAgICAgY29tZmxnIGZsYWdzICAgICAgICAgICAgZGVjYiByYmQsaW1tNG0xCi1hZGRsIHJyZCxAQHJzICAgICAgICAgICAgY3AgQEByZCxpbW0xNiAgICAgICAgICAgIGRpIGkyCi1hZGRsIHJyZCxhZGRyICAgICAgICAgICBjcCBhZGRyKHJkKSxpbW0xNiAgICAgICBkaXYgcnJkLEBAcnMKLWFkZGwgcnJkLGFkZHIocnMpICAgICAgIGNwIGFkZHIsaW1tMTYgICAgICAgICAgIGRpdiBycmQsYWRkcgotYWRkbCBycmQsaW1tMzIgICAgICAgICAgY3AgcmQsQEBycyAgICAgICAgICAgICAgIGRpdiBycmQsYWRkcihycykKLWFkZGwgcnJkLHJycyAgICAgICAgICAgIGNwIHJkLGFkZHIgICAgICAgICAgICAgIGRpdiBycmQsaW1tMTYKLWFuZCByZCxAQHJzICAgICAgICAgICAgICBjcCByZCxhZGRyKHJzKSAgICAgICAgICBkaXYgcnJkLHJzCi1hbmQgcmQsYWRkciAgICAgICAgICAgICBjcCByZCxpbW0xNiAgICAgICAgICAgICBkaXZsIHJxZCxAQHJzCi1hbmQgcmQsYWRkcihycykgICAgICAgICBjcCByZCxycyAgICAgICAgICAgICAgICBkaXZsIHJxZCxhZGRyCi1hbmQgcmQsaW1tMTYgICAgICAgICAgICBjcGIgQEByZCxpbW04ICAgICAgICAgICAgZGl2bCBycWQsYWRkcihycykKLWFuZCByZCxycyAgICAgICAgICAgICAgIGNwYiBhZGRyKHJkKSxpbW04ICAgICAgIGRpdmwgcnFkLGltbTMyCi1hbmRiIHJiZCxAQHJzICAgICAgICAgICAgY3BiIGFkZHIsaW1tOCAgICAgICAgICAgZGl2bCBycWQscnJzCi1hbmRiIHJiZCxhZGRyICAgICAgICAgICBjcGIgcmJkLEBAcnMgICAgICAgICAgICAgZGpueiByZCxkaXNwNwotYW5kYiByYmQsYWRkcihycykgICAgICAgY3BiIHJiZCxhZGRyICAgICAgICAgICAgZWkgaTIKLWFuZGIgcmJkLGltbTggICAgICAgICAgIGNwYiByYmQsYWRkcihycykgICAgICAgIGV4IHJkLEBAcnMKLWFuZGIgcmJkLHJicyAgICAgICAgICAgIGNwYiByYmQsaW1tOCAgICAgICAgICAgIGV4IHJkLGFkZHIKLWJpdCBAQHJkLGltbTQgICAgICAgICAgICBjcGIgcmJkLHJicyAgICAgICAgICAgICBleCByZCxhZGRyKHJzKQotYml0IGFkZHIocmQpLGltbTQgICAgICAgY3BkIHJkLEBAcnMscnIsY2MgICAgICAgIGV4IHJkLHJzCi1iaXQgYWRkcixpbW00ICAgICAgICAgICBjcGRiIHJiZCxAQHJzLHJyLGNjICAgICAgZXhiIHJiZCxAQHJzCi1iaXQgcmQsaW1tNCAgICAgICAgICAgICBjcGRyIHJkLEBAcnMscnIsY2MgICAgICAgZXhiIHJiZCxhZGRyCi1iaXQgcmQscnMgICAgICAgICAgICAgICBjcGRyYiByYmQsQEBycyxycixjYyAgICAgZXhiIHJiZCxhZGRyKHJzKQotYml0YiBAQHJkLGltbTQgICAgICAgICAgIGNwaSByZCxAQHJzLHJyLGNjICAgICAgICBleGIgcmJkLHJicwotYml0YiBhZGRyKHJkKSxpbW00ICAgICAgY3BpYiByYmQsQEBycyxycixjYyAgICAgIGV4dDBlIGltbTgKLWJpdGIgYWRkcixpbW00ICAgICAgICAgIGNwaXIgcmQsQEBycyxycixjYyAgICAgICBleHQwZiBpbW04Ci1iaXRiIHJiZCxpbW00ICAgICAgICAgICBjcGlyYiByYmQsQEBycyxycixjYyAgICAgZXh0OGUgaW1tOAotYml0YiByYmQscnMgICAgICAgICAgICAgY3BsIHJyZCxAQHJzICAgICAgICAgICAgIGV4dDhmIGltbTgKLWJwdCAgICAgICAgICAgICAgICAgICAgIGNwbCBycmQsYWRkciAgICAgICAgICAgIGV4dHMgcnJkCi1jYWxsIEBAcmQgICAgICAgICAgICAgICAgY3BsIHJyZCxhZGRyKHJzKSAgICAgICAgZXh0c2IgcmQKLWNhbGwgYWRkciAgICAgICAgICAgICAgIGNwbCBycmQsaW1tMzIgICAgICAgICAgIGV4dHNsIHJxZAotY2FsbCBhZGRyKHJkKSAgICAgICAgICAgY3BsIHJyZCxycnMgICAgICAgICAgICAgaGFsdAotY2FsciBkaXNwMTIgICAgICAgICAgICAgY3BzZCBAQHJkLEBAcnMscnIsY2MgICAgICBpbiByZCxAQHJzCi1jbHIgQEByZCAgICAgICAgICAgICAgICAgY3BzZGIgQEByZCxAQHJzLHJyLGNjICAgICBpbiByZCxpbW0xNgotY2xyIGFkZHIgICAgICAgICAgICAgICAgY3BzZHIgQEByZCxAQHJzLHJyLGNjICAgICBpbmIgcmJkLEBAcnMKLWNsciBhZGRyKHJkKSAgICAgICAgICAgIGNwc2RyYiBAQHJkLEBAcnMscnIsY2MgICAgaW5iIHJiZCxpbW0xNgotY2xyIHJkICAgICAgICAgICAgICAgICAgY3BzaSBAQHJkLEBAcnMscnIsY2MgICAgICBpbmMgQEByZCxpbW00bTEKLWNscmIgQEByZCAgICAgICAgICAgICAgICBjcHNpYiBAQHJkLEBAcnMscnIsY2MgICAgIGluYyBhZGRyKHJkKSxpbW00bTEKLWluYyBhZGRyLGltbTRtMSAgICAgICAgIGxkYiByYmQscnMocngpICAgICAgICAgIG11bHQgcnJkLGFkZHIocnMpCi1pbmMgcmQsaW1tNG0xICAgICAgICAgICBsZGIgcmQoaW1tMTYpLHJicyAgICAgICBtdWx0IHJyZCxpbW0xNgotaW5jYiBAQHJkLGltbTRtMSAgICAgICAgIGxkYiByZChyeCkscmJzICAgICAgICAgIG11bHQgcnJkLHJzCi1pbmNiIGFkZHIocmQpLGltbTRtMSAgICBsZGN0bCBjdHJsLHJzICAgICAgICAgICBtdWx0bCBycWQsQEBycwotaW5jYiBhZGRyLGltbTRtMSAgICAgICAgbGRjdGwgcmQsY3RybCAgICAgICAgICAgbXVsdGwgcnFkLGFkZHIKLWluY2IgcmJkLGltbTRtMSAgICAgICAgIGxkZCBAQHJzLEBAcmQscnIgICAgICAgICAgbXVsdGwgcnFkLGFkZHIocnMpCi1pbmQgQEByZCxAQHJzLHJhICAgICAgICAgIGxkZGIgQEBycyxAQHJkLHJyICAgICAgICAgbXVsdGwgcnFkLGltbTMyCi1pbmRiIEBAcmQsQEBycyxyYmEgICAgICAgIGxkZHIgQEBycyxAQHJkLHJyICAgICAgICAgbXVsdGwgcnFkLHJycwotaW5pYiBAQHJkLEBAcnMscmEgICAgICAgICBsZGRyYiBAQHJzLEBAcmQscnIgICAgICAgIG5lZyBAQHJkCi1pbmliciBAQHJkLEBAcnMscmEgICAgICAgIGxkaSBAQHJkLEBAcnMscnIgICAgICAgICAgbmVnIGFkZHIKLWlyZXQgICAgICAgICAgICAgICAgICAgIGxkaWIgQEByZCxAQHJzLHJyICAgICAgICAgbmVnIGFkZHIocmQpCi1qcCBjYyxAQHJkICAgICAgICAgICAgICAgbGRpciBAQHJkLEBAcnMscnIgICAgICAgICBuZWcgcmQKLWpwIGNjLGFkZHIgICAgICAgICAgICAgIGxkaXJiIEBAcmQsQEBycyxyciAgICAgICAgbmVnYiBAQHJkCi1qcCBjYyxhZGRyKHJkKSAgICAgICAgICBsZGsgcmQsaW1tNCAgICAgICAgICAgICBuZWdiIGFkZHIKLWpyIGNjLGRpc3A4ICAgICAgICAgICAgIGxkbCBAQHJkLHJycyAgICAgICAgICAgICBuZWdiIGFkZHIocmQpCi1sZCBAQHJkLGltbTE2ICAgICAgICAgICAgbGRsIGFkZHIocmQpLHJycyAgICAgICAgbmVnYiByYmQKLWxkIEBAcmQscnMgICAgICAgICAgICAgICBsZGwgYWRkcixycnMgICAgICAgICAgICBub3AKLWxkIGFkZHIocmQpLGltbTE2ICAgICAgIGxkbCByZChpbW0xNikscnJzICAgICAgIG9yIHJkLEBAcnMKLWxkIGFkZHIocmQpLHJzICAgICAgICAgIGxkbCByZChyeCkscnJzICAgICAgICAgIG9yIHJkLGFkZHIKLWxkIGFkZHIsaW1tMTYgICAgICAgICAgIGxkbCBycmQsQEBycyAgICAgICAgICAgICBvciByZCxhZGRyKHJzKQotbGQgYWRkcixycyAgICAgICAgICAgICAgbGRsIHJyZCxhZGRyICAgICAgICAgICAgb3IgcmQsaW1tMTYKLWxkIHJkKGltbTE2KSxycyAgICAgICAgIGxkbCBycmQsYWRkcihycykgICAgICAgIG9yIHJkLHJzCi1sZCByZChyeCkscnMgICAgICAgICAgICBsZGwgcnJkLGltbTMyICAgICAgICAgICBvcmIgcmJkLEBAcnMKLWxkIHJkLEBAcnMgICAgICAgICAgICAgICBsZGwgcnJkLHJycyAgICAgICAgICAgICBvcmIgcmJkLGFkZHIKLWxkIHJkLGFkZHIgICAgICAgICAgICAgIGxkbCBycmQscnMoaW1tMTYpICAgICAgIG9yYiByYmQsYWRkcihycykKLWxkIHJkLGFkZHIocnMpICAgICAgICAgIGxkbCBycmQscnMocngpICAgICAgICAgIG9yYiByYmQsaW1tOAotbGQgcmQsaW1tMTYgICAgICAgICAgICAgbGRtIEBAcmQscnMsbiAgICAgICAgICAgIG9yYiByYmQscmJzCi1sZCByZCxycyAgICAgICAgICAgICAgICBsZG0gYWRkcihyZCkscnMsbiAgICAgICBvdXQgQEByZCxycwotbGQgcmQscnMoaW1tMTYpICAgICAgICAgbGRtIGFkZHIscnMsbiAgICAgICAgICAgb3V0IGltbTE2LHJzCi1sZCByZCxycyhyeCkgICAgICAgICAgICBsZG0gcmQsQEBycyxuICAgICAgICAgICAgb3V0YiBAQHJkLHJicwotbGRhIHJkLGFkZHIgICAgICAgICAgICAgbGRtIHJkLGFkZHIocnMpLG4gICAgICAgb3V0YiBpbW0xNixyYnMKLWxkYSByZCxhZGRyKHJzKSAgICAgICAgIGxkbSByZCxhZGRyLG4gICAgICAgICAgIG91dGQgQEByZCxAQHJzLHJhCi1sZGEgcmQscnMoaW1tMTYpICAgICAgICBsZHBzIEBAcnMgICAgICAgICAgICAgICAgb3V0ZGIgQEByZCxAQHJzLHJiYQotbGRhIHJkLHJzKHJ4KSAgICAgICAgICAgbGRwcyBhZGRyICAgICAgICAgICAgICAgb3V0aWIgQEByZCxAQHJzLHJhCi1sZGFyIHJkLGRpc3AxNiAgICAgICAgICBsZHBzIGFkZHIocnMpICAgICAgICAgICBvdXRpYnIgQEByZCxAQHJzLHJhCi1sZGIgQEByZCxpbW04ICAgICAgICAgICAgbGRyIGRpc3AxNixycyAgICAgICAgICAgcG9wIEBAcmQsQEBycwotbGRiIEBAcmQscmJzICAgICAgICAgICAgIGxkciByZCxkaXNwMTYgICAgICAgICAgIHBvcCBhZGRyKHJkKSxAQHJzCi1sZGIgYWRkcihyZCksaW1tOCAgICAgICBsZHJiIGRpc3AxNixyYnMgICAgICAgICBwb3AgYWRkcixAQHJzCi1sZGIgYWRkcihyZCkscmJzICAgICAgICBsZHJiIHJiZCxkaXNwMTYgICAgICAgICBwb3AgcmQsQEBycwotbGRiIGFkZHIsaW1tOCAgICAgICAgICAgbGRybCBkaXNwMTYscnJzICAgICAgICAgcG9wbCBAQHJkLEBAcnMKLWxkYiBhZGRyLHJicyAgICAgICAgICAgIGxkcmwgcnJkLGRpc3AxNiAgICAgICAgIHBvcGwgYWRkcihyZCksQEBycwotbGRiIHJiZCxAQHJzICAgICAgICAgICAgIG1iaXQgICAgICAgICAgICAgICAgICAgIHBvcGwgYWRkcixAQHJzCi1sZGIgcmJkLGFkZHIgICAgICAgICAgICBtcmVxIHJkICAgICAgICAgICAgICAgICBwb3BsIHJyZCxAQHJzCi1sZGIgcmJkLGFkZHIocnMpICAgICAgICBtcmVzICAgICAgICAgICAgICAgICAgICBwdXNoIEBAcmQsQEBycwotbGRiIHJiZCxpbW04ICAgICAgICAgICAgbXNldCAgICAgICAgICAgICAgICAgICAgcHVzaCBAQHJkLGFkZHIKLWxkYiByYmQscmJzICAgICAgICAgICAgIG11bHQgcnJkLEBAcnMgICAgICAgICAgICBwdXNoIEBAcmQsYWRkcihycykKLWxkYiByYmQscnMoaW1tMTYpICAgICAgIG11bHQgcnJkLGFkZHIgICAgICAgICAgIHB1c2ggQEByZCxpbW0xNgotcHVzaCBAQHJkLHJzICAgICAgICAgICAgIHNldCBhZGRyLGltbTQgICAgICAgICAgIHN1YmwgcnJkLGltbTMyCi1wdXNobCBAQHJkLEBAcnMgICAgICAgICAgIHNldCByZCxpbW00ICAgICAgICAgICAgIHN1YmwgcnJkLHJycwotcHVzaGwgQEByZCxhZGRyICAgICAgICAgIHNldCByZCxycyAgICAgICAgICAgICAgIHRjYyBjYyxyZAotcHVzaGwgQEByZCxhZGRyKHJzKSAgICAgIHNldGIgQEByZCxpbW00ICAgICAgICAgICB0Y2NiIGNjLHJiZAotcHVzaGwgQEByZCxycnMgICAgICAgICAgIHNldGIgYWRkcihyZCksaW1tNCAgICAgIHRlc3QgQEByZAotcmVzIEBAcmQsaW1tNCAgICAgICAgICAgIHNldGIgYWRkcixpbW00ICAgICAgICAgIHRlc3QgYWRkcgotcmVzIGFkZHIocmQpLGltbTQgICAgICAgc2V0YiByYmQsaW1tNCAgICAgICAgICAgdGVzdCBhZGRyKHJkKQotcmVzIGFkZHIsaW1tNCAgICAgICAgICAgc2V0YiByYmQscnMgICAgICAgICAgICAgdGVzdCByZAotcmVzIHJkLGltbTQgICAgICAgICAgICAgc2V0ZmxnIGltbTQgICAgICAgICAgICAgdGVzdGIgQEByZAotcmVzIHJkLHJzICAgICAgICAgICAgICAgc2luYiByYmQsaW1tMTYgICAgICAgICAgdGVzdGIgYWRkcgotcmVzYiBAQHJkLGltbTQgICAgICAgICAgIHNpbmIgcmQsaW1tMTYgICAgICAgICAgIHRlc3RiIGFkZHIocmQpCi1yZXNiIGFkZHIocmQpLGltbTQgICAgICBzaW5kIEBAcmQsQEBycyxyYSAgICAgICAgIHRlc3RiIHJiZAotcmVzYiBhZGRyLGltbTQgICAgICAgICAgc2luZGIgQEByZCxAQHJzLHJiYSAgICAgICB0ZXN0bCBAQHJkCi1yZXNiIHJiZCxpbW00ICAgICAgICAgICBzaW5pYiBAQHJkLEBAcnMscmEgICAgICAgIHRlc3RsIGFkZHIKLXJlc2IgcmJkLHJzICAgICAgICAgICAgIHNpbmliciBAQHJkLEBAcnMscmEgICAgICAgdGVzdGwgYWRkcihyZCkKLXJlc2ZsZyBpbW00ICAgICAgICAgICAgIHNsYSByZCxpbW04ICAgICAgICAgICAgIHRlc3RsIHJyZAotcmV0IGNjICAgICAgICAgICAgICAgICAgc2xhYiByYmQsaW1tOCAgICAgICAgICAgdHJkYiBAQHJkLEBAcnMscmJhCi1ybCByZCxpbW0xb3IyICAgICAgICAgICBzbGFsIHJyZCxpbW04ICAgICAgICAgICB0cmRyYiBAQHJkLEBAcnMscmJhCi1ybGIgcmJkLGltbTFvcjIgICAgICAgICBzbGwgcmQsaW1tOCAgICAgICAgICAgICB0cmliIEBAcmQsQEBycyxyYnIKLXJsYyByZCxpbW0xb3IyICAgICAgICAgIHNsbGIgcmJkLGltbTggICAgICAgICAgIHRyaXJiIEBAcmQsQEBycyxyYnIKLXJsY2IgcmJkLGltbTFvcjIgICAgICAgIHNsbGwgcnJkLGltbTggICAgICAgICAgIHRydGRyYiBAQHJhLEBAcmIscmJyCi1ybGRiIHJiYixyYmEgICAgICAgICAgICBzb3V0IGltbTE2LHJzICAgICAgICAgICB0cnRpYiBAQHJhLEBAcmIscnIKLXJyIHJkLGltbTFvcjIgICAgICAgICAgIHNvdXRiIGltbTE2LHJicyAgICAgICAgIHRydGlyYiBAQHJhLEBAcmIscmJyCi1ycmIgcmJkLGltbTFvcjIgICAgICAgICBzb3V0ZCBAQHJkLEBAcnMscmEgICAgICAgIHRydHJiIEBAcmEsQEByYixyYnIKLXJyYyByZCxpbW0xb3IyICAgICAgICAgIHNvdXRkYiBAQHJkLEBAcnMscmJhICAgICAgdHNldCBAQHJkCi1ycmNiIHJiZCxpbW0xb3IyICAgICAgICBzb3V0aWIgQEByZCxAQHJzLHJhICAgICAgIHRzZXQgYWRkcgotcnJkYiByYmIscmJhICAgICAgICAgICAgc291dGliciBAQHJkLEBAcnMscmEgICAgICB0c2V0IGFkZHIocmQpCi1yc3ZkMzYgICAgICAgICAgICAgICAgICBzcmEgcmQsaW1tOCAgICAgICAgICAgICB0c2V0IHJkCi1yc3ZkMzggICAgICAgICAgICAgICAgICBzcmFiIHJiZCxpbW04ICAgICAgICAgICB0c2V0YiBAQHJkCi1yc3ZkNzggICAgICAgICAgICAgICAgICBzcmFsIHJyZCxpbW04ICAgICAgICAgICB0c2V0YiBhZGRyCi1yc3ZkN2UgICAgICAgICAgICAgICAgICBzcmwgcmQsaW1tOCAgICAgICAgICAgICB0c2V0YiBhZGRyKHJkKQotcnN2ZDlkICAgICAgICAgICAgICAgICAgc3JsYiByYmQsaW1tOCAgICAgICAgICAgdHNldGIgcmJkCi1yc3ZkOWYgICAgICAgICAgICAgICAgICBzcmxsIHJyZCxpbW04ICAgICAgICAgICB4b3IgcmQsQEBycwotcnN2ZGI5ICAgICAgICAgICAgICAgICAgc3ViIHJkLEBAcnMgICAgICAgICAgICAgIHhvciByZCxhZGRyCi1yc3ZkYmYgICAgICAgICAgICAgICAgICBzdWIgcmQsYWRkciAgICAgICAgICAgICB4b3IgcmQsYWRkcihycykKLXNiYyByZCxycyAgICAgICAgICAgICAgIHN1YiByZCxhZGRyKHJzKSAgICAgICAgIHhvciByZCxpbW0xNgotc2JjYiByYmQscmJzICAgICAgICAgICAgc3ViIHJkLGltbTE2ICAgICAgICAgICAgeG9yIHJkLHJzCi1zYyBpbW04ICAgICAgICAgICAgICAgICBzdWIgcmQscnMgICAgICAgICAgICAgICB4b3JiIHJiZCxAQHJzCi1zZGEgcmQscnMgICAgICAgICAgICAgICBzdWJiIHJiZCxAQHJzICAgICAgICAgICAgeG9yYiByYmQsYWRkcgotc2RhYiByYmQscnMgICAgICAgICAgICAgc3ViYiByYmQsYWRkciAgICAgICAgICAgeG9yYiByYmQsYWRkcihycykKLXNkYWwgcnJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLGFkZHIocnMpICAgICAgIHhvcmIgcmJkLGltbTgKLXNkbCByZCxycyAgICAgICAgICAgICAgIHN1YmIgcmJkLGltbTggICAgICAgICAgIHhvcmIgcmJkLHJicwotc2RsYiByYmQscnMgICAgICAgICAgICAgc3ViYiByYmQscmJzICAgICAgICAgICAgeG9yYiByYmQscmJzCi1zZGxsIHJyZCxycyAgICAgICAgICAgICBzdWJsIHJyZCxAQHJzCi1zZXQgQEByZCxpbW00ICAgICAgICAgICAgc3VibCBycmQsYWRkcgotc2V0IGFkZHIocmQpLGltbTQgICAgICAgc3VibCBycmQsYWRkcihycykKLUBlbmQgc21hbGxleGFtcGxlCi1AaWZ0ZXgKLUBlbmRncm91cAotQGVuZCBpZnRleAotQGVuZCBpZnNldAotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2dhc3AudGV4aSBiL2dhcy9kb2MvZ2FzcC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGNkNmY0Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvZ2FzcC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTA4NiArMCwwIEBACi1caW5wdXQgdGV4aW5mbyAgICAgICAgICAgICAgIEBjICAgICAgICAgICAgIC0qLSBUZXhpbmZvIC0qLQotQHNldGZpbGVuYW1lIGdhc3AuaW5mbwotQGMKLUBjIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGFzc2VtYmx5IHByZXByb2Nlc3NvciAiR0FTUCIKLUBjCi1AYyBDb3B5cmlnaHQgKGMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYwotQGMgVGhpcyB0ZXh0IG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKLUBjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIGdhc3A6IChnYXNwKS4gICAgICAgICAgICAgICAgICAgICBUaGUgR05VIEFzc2VtYmxlciBQcmVwcm9jZXNzb3IKLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBzeW5jb2RlaW5kZXgga3kgY3AKLUBzeW5jb2RlaW5kZXggZm4gY3AKLQotQGZpbmFsb3V0Ci1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1Ac2V0dGl0bGUgR0FTUAotQHRpdGxlcGFnZQotQGMgRklYTUUgYm9yaW5nIHRpdGxlCi1AdGl0bGUgR0FTUCwgYW4gYXNzZW1ibHkgcHJlcHJvY2Vzc29yCi1Ac3VidGl0bGUgZm9yIEdBU1AgdmVyc2lvbiAxCi1Ac3AgMQotQHN1YnRpdGxlIE1hcmNoIDE5OTQKLUBhdXRob3IgUm9sYW5kIFBlc2NoCi1AcGFnZQotCi1AdGV4Ci17XHBhcnNraXA9MHB0IFxoZmlsbCBDeWdudXMgU3VwcG9ydFxwYXIKLX0KLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgYSBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotQGVuZCBpZ25vcmUKLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotCi1Abm9kZSBUb3AKLUB0b3AgR0FTUAotCi1HQVNQIGlzIGEgcHJlcHJvY2Vzc29yIGZvciBhc3NlbWJseSBwcm9ncmFtcy4KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyB2ZXJzaW9uIDEgb2YgR0FTUC4KLQotU3RldmUgQ2hhbWJlcmxhaW4gd3JvdGUgR0FTUDsgUm9sYW5kIFBlc2NoIHdyb3RlIHRoaXMgbWFudWFsLgotCi1AbWVudQotKiBPdmVydmlldzo6ICAgICAgICAgICAgICAgICAgICBXaGF0IGlzIEdBU1A/Ci0qIEludm9raW5nIEdBU1A6OiAgICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb25zLgotKiBDb21tYW5kczo6ICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgY29tbWFuZHMuCi0qIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4LgotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1Abm9kZSBPdmVydmlldwotQGNoYXB0ZXIgV2hhdCBpcyBHQVNQPwotCi1UaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgaXMgdG8gYXNzZW1ibGUgdGhlIG91dHB1dCBvZgotb3RoZXIgcHJvZ3JhbXMtLS1ub3RhYmx5IGNvbXBpbGVycy4gIFdoZW4geW91IGhhdmUgdG8gaGFuZC1jb2RlCi1zcGVjaWFsaXplZCByb3V0aW5lcyBpbiBhc3NlbWJseSwgdGhhdCBtZWFucyB0aGUgQHNje2dudX0gYXNzZW1ibGVyIGlzCi1hbiB1bmZyaWVuZGx5IHByb2Nlc3NvcjogaXQgaGFzIG5vIGRpcmVjdGl2ZXMgZm9yIG1hY3JvcywgY29uZGl0aW9uYWxzLAotb3IgbWFueSBvdGhlciBjb252ZW5pZW5jZXMgdGhhdCB5b3UgbWlnaHQgZXhwZWN0LgotCi1JbiBzb21lIGNhc2VzIHlvdSBjYW4gc2ltcGx5IHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IsIG9yIGEgZ2VuZXJhbGl6ZWQKLXByZXByb2Nlc3NvciBsaWtlIEBzY3ttNH07IGJ1dCB0aGlzIGNhbiBiZSBhd2t3YXJkLCBzaW5jZSBub25lIG9mIHRoZXNlCi10aGluZ3MgYXJlIGRlc2lnbmVkIHdpdGggYXNzZW1ibHkgaW4gbWluZC4KLQotQHNje2dhc3B9IGZpbGxzIHRoaXMgbmVlZC4gIEl0IGlzIGV4cHJlc3NseSBkZXNpZ25lZCB0byBwcm92aWRlIHRoZQotZmFjaWxpdGllcyB5b3UgbmVlZCB3aXRoIGhhbmQtY29kZWQgYXNzZW1ibHkgY29kZS4gIEltcGxlbWVudGluZyBpdCBhcyBhCi1wcmVwcm9jZXNzb3IsIHJhdGhlciB0aGFuIHBhcnQgb2YgdGhlIGFzc2VtYmxlciwgYWxsb3dzIHRoZSBtYXhpbXVtCi1mbGV4aWJpbGl0eTogeW91IGNhbiB1c2UgaXQgd2l0aCBoYW5kLWNvZGVkIGFzc2VtYmx5LCB3aXRob3V0IHBheWluZyBhCi1wZW5hbHR5IG9mIGFkZGVkIGNvbXBsZXhpdHkgaW4gdGhlIGFzc2VtYmxlciB5b3UgdXNlIGZvciBjb21waWxlcgotb3V0cHV0LgotCi1IZXJlIGlzIGEgc21hbGwgZXhhbXBsZSB0byBnaXZlIHRoZSBmbGF2b3Igb2YgQHNje2dhc3B9LiAgVGhpcyBpbnB1dCB0bwotQHNje2dhc3B9Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi0gICAgICAgIC5NQUNSTyAgc2F2ZXJlZ3MgZnJvbT04IHRvPTE0Ci1jb3VudCAgIC5BU1NJR05BIFxmcm9tCi0gICAgICAgICEgc2F2ZSByXGZyb20uLnJcdG8KLSAgICAgICAgLkFXSElMRSAgXCZjb3VudCBMRSBcdG8KLSAgICAgICAgbW92ICAgICByXCZjb3VudCxAQC1zcAotY291bnQgICAuQVNTSUdOQSAgXCZjb3VudCArIDEKLSAgICAgICAgLkFFTkRXCi0gICAgICAgIC5FTkRNCi0KLSAgICAgICAgc2F2ZXJlZ3MgZnJvbT0xMgotCi1iYXI6ICAgIG1vdiAgICAgI0gnZGVhZCsxMCxyMAotZm9vICAgICAuU0RBVEFDICJoZWxsbyI8MTA+Ci0gICAgICAgIC5FTkQKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQG5vaW5kZW50Ci1nZW5lcmF0ZXMgdGhpcyBhc3NlbWJseSBwcm9ncmFtOgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAhIHNhdmUgcjEyLi5yMTQKLSAgICAgICAgbW92ICAgICByMTIsQEAtc3AKLSAgICAgICAgbW92ICAgICByMTMsQEAtc3AKLSAgICAgICAgbW92ICAgICByMTQsQEAtc3AKLQotYmFyOiAgICBtb3YgICAgICM1NzAwNSsxMCxyMAotZm9vOiAgICAuYnl0ZSAgIDYsMTA0LDEwMSwxMDgsMTA4LDExMSwxMAotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1Abm9kZSBJbnZva2luZyBHQVNQCi1AY2hhcHRlciBDb21tYW5kIExpbmUgT3B0aW9ucwotCi1AYyBGSVhNRSEgIE9yIGlzIHRoZXJlIGEgc2ltcGxlciB3YXksIGNhbGxpbmcgZnJvbSBHQVMgb3B0aW9uPwotVGhlIHNpbXBsZXN0IHdheSB0byB1c2UgQHNje2dhc3B9IGlzIHRvIHJ1biBpdCBhcyBhIGZpbHRlciBhbmQgYXNzZW1ibGUKLWl0cyBvdXRwdXQuICBJbiBVbml4IGFuZCBpdHMgaWxrLCB5b3UgY2FuIGRvIHRoaXMsIGZvciBleGFtcGxlOgotCi1AYyBGSVhNRSEgR0FTUCBmaWxlbmFtZSBzdWZmaXggY29udmVudGlvbj8KLUBleGFtcGxlCi0kIGdhc3AgcHJvZy5hc20gfCBhcyAtbyBwcm9nLm8KLUBlbmQgZXhhbXBsZQotCi1OYXR1cmFsbHksIHRoZXJlIGFyZSBhbHNvIGEgZmV3IGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGFsbG93IHlvdSB0bwotcmVxdWVzdCB2YXJpYXRpb25zIG9uIHRoaXMgYmFzaWMgdGhlbWUuICBIZXJlIGlzIHRoZSBmdWxsIHNldCBvZgotcG9zc2liaWxpdGllcyBmb3IgdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUuCi0KLUBleGFtcGxlCi1nYXNwICBbIC1hIHwgLS1hbHRlcm5hdGUgXQotICAgICAgWyAtYyBAdmFye2NoYXJ9IHwgLS1jb21tZW50Y2hhciBAdmFye2NoYXJ9IF0KLSAgICAgIFsgLWQgfCAtLWRlYnVnIF0gIFsgLWggfCAtLWhlbHAgXSBbIC1NIHwgLS1tcmkgXQotICAgICAgWyAtbyBAdmFye291dGZpbGV9IHwgLS1vdXRwdXQgQHZhcntvdXRmaWxlfSBdCi0gICAgICBbIC1wIHwgLS1wcmludCBdICBbIC1zIHwgLS1jb3B5c291cmNlIF0KLSAgICAgIFsgLXUgfCAtLXVucmVhc29uYWJsZSBdICBbIC12IHwgLS12ZXJzaW9uIF0KLSAgICAgIEB2YXJ7aW5maWxlfSBAZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntpbmZpbGV9IEBkb3Rze30KLUBjIEZJWE1FISBXaHkgbm90IHN0ZGluIGFzIGRlZmF1bHQgaW5maWxlPwotVGhlIGlucHV0IGZpbGUgbmFtZXMuICBZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlOyBpZiB5b3UKLXNwZWNpZnkgbW9yZSwgQHNje2dhc3B9IHByZXByb2Nlc3NlcyB0aGVtIGFsbCwgY29uY2F0ZW5hdGluZyB0aGUgb3V0cHV0Ci1pbiB0aGUgb3JkZXIgeW91IGxpc3QgdGhlIEB2YXJ7aW5maWxlfSBhcmd1bWVudHMuCi0KLU1hcmsgdGhlIGVuZCBvZiBlYWNoIGlucHV0IGZpbGUgd2l0aCB0aGUgcHJlcHJvY2Vzc29yIGNvbW1hbmQKLUBjb2Rley5FTkR9LiAgQHhyZWZ7T3RoZXIgQ29tbWFuZHMsLCBNaXNjZWxsYW5lb3VzIGNvbW1hbmRzfS4KLQotQGl0ZW0gLWEKLUBpdGVteCAtLWFsdGVybmF0ZQotVXNlIGFsdGVybmF0aXZlIG1hY3JvIHN5bnRheC4gIEB4cmVme0FsdGVybmF0ZSwsIEFsdGVybmF0ZSBtYWNybwotc3ludGF4fSwgZm9yIGEgZGlzY3Vzc2lvbiBvZiBob3cgdGhpcyBzeW50YXggZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0Ci1Ac2N7Z2FzcH0gc3ludGF4LgotCi1AY2luZGV4IGNvbW1lbnQgY2hhcmFjdGVyLCBjaGFuZ2luZwotQGNpbmRleCBzZW1pY29sb24sIGFzIGNvbW1lbnQKLUBjaW5kZXggZXhjbGFtYXRpb24gbWFyaywgYXMgY29tbWVudAotQGNpbmRleCBzaHJpZWssIGFzIGNvbW1lbnQKLUBjaW5kZXggYmFuZywgYXMgY29tbWVudAotQGNpbmRleCBAY29kZXshfSBkZWZhdWx0IGNvbW1lbnQgY2hhcgotQGNpbmRleCBAY29kZXs7fSBhcyBjb21tZW50IGNoYXIKLUBpdGVtIC1jICdAdmFye2NoYXJ9JwotQGl0ZW14IC0tY29tbWVudGNoYXIgJ0B2YXJ7Y2hhcn0nCi1Vc2UgQHZhcntjaGFyfSBhcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIuICBUaGUgZGVmYXVsdCBjb21tZW50IGNoYXJhY3RlcgotaXMgQHNhbXB7IX0uICBGb3IgZXhhbXBsZSwgdG8gdXNlIGEgc2VtaWNvbG9uIGFzIHRoZSBjb21tZW50IGNoYXJhY3RlciwKLXNwZWNpZnkgQHd7QHNhbXB7LWMgJzsnfX0gb24gdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUuICBTaW5jZQotYXNzZW1ibGVyIGNvbW1hbmQgY2hhcmFjdGVycyBvZnRlbiBoYXZlIHNwZWNpYWwgc2lnbmlmaWNhbmNlIHRvIGNvbW1hbmQKLXNoZWxscywgaXQgaXMgYSBnb29kIGlkZWEgdG8gcXVvdGUgb3IgZXNjYXBlIEB2YXJ7Y2hhcn0gd2hlbiB5b3Ugc3BlY2lmeQotYSBjb21tZW50IGNoYXJhY3Rlci4KLQotRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIGFsbCBleGFtcGxlcyBpbiB0aGlzIG1hbnVhbCB1c2UgdGhlIGRlZmF1bHQKLWNvbW1lbnQgY2hhcmFjdGVyIEBzYW1weyF9LgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZGVidWcKLVNob3cgZGVidWdnaW5nIHN0YXRpc3RpY3MuICBJbiB0aGlzIHZlcnNpb24gb2YgQHNje2dhc3B9LCB0aGlzIG9wdGlvbgotcHJvZHVjZXMgc3RhdGlzdGljcyBhYm91dCB0aGUgc3RyaW5nIGJ1ZmZlcnMgdGhhdCBAc2N7Z2FzcH0gYWxsb2NhdGVzCi1pbnRlcm5hbGx5LiAgRm9yIGVhY2ggZGVmaW5lZCBidWZmZXJzaXplIEB2YXJ7c30sIEBzY3tnYXNwfSBzaG93cyB0aGUKLW51bWJlciBvZiBzdHJpbmdzIEB2YXJ7bn0gdGhhdCBpdCBhbGxvY2F0ZWQsIHdpdGggYSBsaW5lIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLXN0cmluZ3Mgc2l6ZSBAdmFye3N9IDogQHZhcntufQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotQHNje2dhc3B9IGRpc3BsYXlzIHRoZXNlIHN0YXRpc3RpY3Mgb24gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSwgd2hlbgotZG9uZSBwcmVwcm9jZXNzaW5nLgotCi1AaXRlbSAtaAotQGl0ZW14IC0taGVscAotRGlzcGxheSBhIHN1bW1hcnkgb2YgdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQotQGl0ZW0gLU0KLUBpdGVteCAtLW1yaQotVXNlIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuICBVc2luZyB0aGlzIG9wdGlvbiBjYXVzZXMgQHNje2dhc3B9IHRvCi1hY2NlcHQgdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wcyB1c2VkIGJ5IHRoZSBNaWNyb3RlYyBSZXNlYXJjaAotQGNvZGV7QVNNNjhLfSBhc3NlbWJsZXIuCi0KLUBpdGVtIC1vIEB2YXJ7b3V0ZmlsZX0KLUBpdGVteCAtLW91dHB1dCBAdmFye291dGZpbGV9Ci1Xcml0ZSB0aGUgb3V0cHV0IGluIGEgZmlsZSBjYWxsZWQgQHZhcntvdXRmaWxlfS4gIElmIHlvdSBkbyBub3QgdXNlIHRoZQotQHNhbXB7LW99IG9wdGlvbiwgQHNje2dhc3B9IHdyaXRlcyBpdHMgb3V0cHV0IG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQKLXN0cmVhbS4KLQotQGl0ZW0gLXAKLUBpdGVteCAtLXByaW50Ci1QcmludCBsaW5lIG51bWJlcnMuICBAc2N7Z2FzcH0gb2JleXMgdGhpcyBvcHRpb24gQGVtcGh7b25seX0gaWYgeW91IGFsc28KLXNwZWNpZnkgQHNhbXB7LXN9IHRvIGNvcHkgc291cmNlIGxpbmVzIHRvIGl0cyBvdXRwdXQuICBXaXRoIEBzYW1wey1zCi0tcH0sIEBzY3tnYXNwfSBkaXNwbGF5cyB0aGUgbGluZSBudW1iZXIgb2YgZWFjaCBzb3VyY2UgbGluZSBjb3BpZWQKLShpbW1lZGlhdGVseSBhZnRlciB0aGUgY29tbWVudCBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSkuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1jb3B5c291cmNlCi1Db3B5IHRoZSBzb3VyY2UgbGluZXMgdG8gdGhlIG91dHB1dCBmaWxlLiAgVXNlIHRoaXMgb3B0aW9uCi10byBzZWUgdGhlIGVmZmVjdCBvZiBlYWNoIHByZXByb2Nlc3NvciBsaW5lIG9uIHRoZSBAc2N7Z2FzcH0gb3V0cHV0LgotQHNje2dhc3B9IHBsYWNlcyBhIGNvbW1lbnQgY2hhcmFjdGVyIChAc2FtcHshfSBieSBkZWZhdWx0KSBhdAotdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNvdXJjZSBsaW5lIGl0IGNvcGllcywgc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzCi1vcHRpb24gYW5kIHN0aWxsIGFzc2VtYmxlIHRoZSByZXN1bHQuCi0KLUBpdGVtIC11Ci1AaXRlbXggLS11bnJlYXNvbmFibGUKLUJ5cGFzcyBgYHVucmVhc29uYWJsZSBleHBhbnNpb24nJyBsaW1pdC4gIFNpbmNlIHlvdSBjYW4gZGVmaW5lIEBzY3tnYXNwfQotbWFjcm9zIGluc2lkZSBvdGhlciBtYWNybyBkZWZpbml0aW9ucywgdGhlIHByZXByb2Nlc3NvciBub3JtYWxseQotaW5jbHVkZXMgYSBzYW5pdHkgY2hlY2suICBJZiB5b3VyIHByb2dyYW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEsMDAwCi1uZXN0ZWQgZXhwYW5zaW9ucywgQHNje2dhc3B9IG5vcm1hbGx5IGV4aXRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4gIFVzZQotdGhpcyBvcHRpb24gdG8gdHVybiBvZmYgdGhpcyBjaGVjaywgYWxsb3dpbmcgdW5saW1pdGVkIG5lc3RlZAotZXhwYW5zaW9ucy4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXkgdGhlIEBzY3tnYXNwfSB2ZXJzaW9uIG51bWJlci4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIENvbW1hbmRzCi1AY2hhcHRlciBQcmVwcm9jZXNzb3IgQ29tbWFuZHMKLQotQHNje2dhc3B9IGNvbW1hbmRzIGhhdmUgYSBzdHJhaWdodGZvcndhcmQgc3ludGF4IHRoYXQgZml0cyBpbiB3ZWxsIHdpdGgKLWFzc2VtYmx5IGNvbnZlbnRpb25zLiAgSW4gZ2VuZXJhbCwgYSBjb21tYW5kIGV4dGVuZHMgZm9yIGEgbGluZSwgYW5kIG1heQotaGF2ZSB1cCB0byB0aHJlZSBmaWVsZHM6IGFuIG9wdGlvbmFsIGxhYmVsLCB0aGUgY29tbWFuZCBpdHNlbGYsIGFuZAotb3B0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBjb21tYW5kLiAgWW91IGNhbiB3cml0ZSBjb21tYW5kcyBpbiB1cHBlciBvcgotbG93ZXIgY2FzZSwgdGhvdWdoIHRoaXMgbWFudWFsIHNob3dzIHRoZW0gaW4gdXBwZXIgY2FzZS4gIEB4cmVme1N5bnRheAotRGV0YWlscywsIERldGFpbHMgb2YgdGhlIEdBU1Agc3ludGF4fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBtZW51Ci0qIENvbmRpdGlvbmFsczo6Ci0qIExvb3BzOjoKLSogVmFyaWFibGVzOjoKLSogTWFjcm9zOjoKLSogRGF0YTo6Ci0qIExpc3RpbmdzOjoKLSogT3RoZXIgQ29tbWFuZHM6OgotKiBTeW50YXggRGV0YWlsczo6Ci0qIEFsdGVybmF0ZTo6Ci1AZW5kIG1lbnUKLQotQG5vZGUgQ29uZGl0aW9uYWxzCi1Ac2VjdGlvbiBDb25kaXRpb25hbCBhc3NlbWJseQotCi1UaGUgY29uZGl0aW9uYWwtYXNzZW1ibHkgZGlyZWN0aXZlcyBhbGxvdyB5b3UgdG8gaW5jbHVkZSBvciBleGNsdWRlCi1wb3J0aW9ucyBvZiBhbiBhc3NlbWJseSBkZXBlbmRpbmcgb24gaG93IGEgcGFpciBvZiBleHByZXNzaW9ucywgb3IgYQotcGFpciBvZiBzdHJpbmdzLCBjb21wYXJlLgotCi1UaGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgY29uZGl0aW9uYWxzIGlzIGZhbWlsaWFyIGZyb20gbWFueSBvdGhlcgotY29udGV4dHMuICBAY29kZXsuQUlGfSBtYXJrcyB0aGUgc3RhcnQgb2YgYSBjb25kaXRpb25hbCwgYW5kIHByZWNlZGVzCi1hc3NlbWJseSBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUuICAgQW4gb3B0aW9uYWwKLUBjb2Rley5BRUxTRX0gcHJlY2VkZXMgYXNzZW1ibHkgZm9yIHRoZSBjb252ZXJzZSBjYXNlLCBhbmQgYW4KLUBjb2Rley5BRU5ESX0gbWFya3MgdGhlIGVuZCBvZiB0aGUgY29uZGl0aW9uLgotCi1AYyBGSVhNRSEgV2h5IGRvZXNuJ3QgLXUgdHVybiBvZmYgdGhpcyBjaGVjaz8KLVlvdSBtYXkgbmVzdCBjb25kaXRpb25hbHMgdXAgdG8gYSBkZXB0aCBvZiAxMDA7IEBzY3tnYXNwfSByZWplY3RzCi1uZXN0aW5nIGJleW9uZCB0aGF0LCBiZWNhdXNlIGl0IG1heSBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIG1hY3JvCi1zdHJ1Y3R1cmUuCi0KLUBjIEZJWE1FISBXaHkgaXNuJ3QgdGhlcmUgc29tZXRoaW5nIGxpa2UgY3BwJ3MgLUQgb3B0aW9uPyAgQ29uZGl0aW9uYWxzCi1AYyAgICAgICAgd291bGQgYmUgbXVjaCBtb3JlIHVzZWZ1bCBpZiB0aGVyZSB3ZXJlLgotQ29uZGl0aW9uYWxzIGFyZSBwcmltYXJpbHkgdXNlZnVsIGluc2lkZSBtYWNybyBkZWZpbml0aW9ucywgd2hlcmUgeW91Ci1vZnRlbiBuZWVkIGRpZmZlcmVudCBlZmZlY3RzIGRlcGVuZGluZyBvbiBhcmd1bWVudCB2YWx1ZXMuCi1AeHJlZntNYWNyb3MsLCBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfSwgZm9yIGRldGFpbHMgYWJvdXQgZGVmaW5pbmcKLW1hY3Jvcy4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLkFJRiBAdmFye2V4cHJhfSBAdmFye2NtcH0gQHZhcntleHByYn0KLUBpdGVteCAuQUlGICJAdmFye3N0cmF9IiBAdmFye2NtcH0gIkB2YXJ7c3RyYn0iCi0KLVRoZSBnb3Zlcm5pbmcgY29uZGl0aW9uIGdvZXMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgQGNvZGV7LkFJRn0KLXByZXByb2Nlc3NvciBjb21tYW5kLiAgWW91IG1heSBjb21wYXJlIGVpdGhlciB0d28gc3RyaW5ncywgb3IgdHdvCi1leHByZXNzaW9ucy4KLQotV2hlbiB5b3UgY29tcGFyZSBzdHJpbmdzLCBvbmx5IHR3byBjb25kaXRpb25hbCBAdmFye2NtcH0gY29tcGFyaXNvbgotb3BlcmF0b3JzIGFyZSBhdmFpbGFibGU6IEBzYW1we0VRfSAodHJ1ZSBpZiBAdmFye3N0cmF9IGFuZCBAdmFye3N0cmJ9Ci1hcmUgaWRlbnRpY2FsKSwgYW5kIEBzYW1we05FfSAodGhlIG9wcG9zaXRlKS4KLQotV2hlbiB5b3UgY29tcGFyZSB0d28gZXhwcmVzc2lvbnMsIEBlbXBoe2JvdGggZXhwcmVzc2lvbnMgbXVzdCBiZQotYWJzb2x1dGV9IChAcHhyZWZ7RXhwcmVzc2lvbnMsLCBBcml0aG1ldGljIGV4cHJlc3Npb25zIGluIEdBU1B9KS4gIFlvdQotY2FuIHVzZSB0aGVzZSBAdmFye2NtcH0gY29tcGFyaXNvbiBvcGVyYXRvcnMgd2l0aCBleHByZXNzaW9uczoKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gRVEKLUFyZSBAdmFye2V4cHJhfSBhbmQgQHZhcntleHByYn0gZXF1YWw/ICAoRm9yIHN0cmluZ3MsIGFyZSBAdmFye3N0cmF9IGFuZAotQHZhcntzdHJifSBpZGVudGljYWw/KQotCi1AaXRlbSBORQotQXJlIEB2YXJ7ZXhwcmF9IGFuZCBAdmFye2V4cHJifSBkaWZmZXJlbnQ/ICAoRm9yIHN0cmluZ3MsIGFyZSBAdmFye3N0cmF9Ci1hbmQgQHZhcntzdHJifSBkaWZmZXJlbnQ/Ci0KLUBpdGVtIExUCi1JcyBAdmFye2V4cHJhfSBsZXNzIHRoYW4gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yIHN0cmluZ3MuKQotCi1AaXRlbSBMRQotSXMgQHZhcntleHByYX0gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvciBzdHJpbmdzLikKLQotQGl0ZW0gR1QKLUlzIEB2YXJ7ZXhwcmF9IGdyZWF0ZXIgdGhhbiBAdmFye2V4cHJifT8gIChOb3QgYWxsb3dlZCBmb3Igc3RyaW5ncy4pCi0KLUBpdGVtIEdFCi1JcyBAdmFye2V4cHJhfSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yCi1zdHJpbmdzLikKLUBlbmQgZnRhYmxlCi0KLUBpdGVtIC5BRUxTRQotTWFya3MgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5IGNvZGUgdG8gYmUgaW5jbHVkZWQgaWYgdGhlIGNvbmRpdGlvbiBmYWlscy4KLU9wdGlvbmFsLCBhbmQgb25seSBhbGxvd2VkIHdpdGhpbiBhIGNvbmRpdGlvbmFsIChiZXR3ZWVuIEBjb2Rley5BSUZ9IGFuZAotQGNvZGV7LkFFTkRJfSkuCi0KLUBpdGVtIC5BRU5ESQotTWFya3MgdGhlIGVuZCBvZiBhIGNvbmRpdGlvbmFsIGFzc2VtYmx5LgotQGVuZCBmdGFibGUKLQotQG5vZGUgTG9vcHMKLUBzZWN0aW9uIFJlcGV0aXRpdmUgc2VjdGlvbnMgb2YgYXNzZW1ibHkKLQotVHdvIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGFsbG93IHlvdSB0byByZXBlYXRlZGx5IGlzc3VlIGNvcGllcyBvZiB0aGUKLXNhbWUgYmxvY2sgb2YgYXNzZW1ibHkgY29kZS4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLkFSRVBFQVQgQHZhcnthZXhwfQotQGl0ZW14IC5BRU5EUgotSWYgeW91IHNpbXBseSBuZWVkIHRvIHJlcGVhdCB0aGUgc2FtZSBibG9jayBvZiBhc3NlbWJseSBvdmVyIGFuZCBvdmVyIGEKLWZpeGVkIG51bWJlciBvZiB0aW1lcywgc2FuZHdpY2ggb25lIGluc3RhbmNlIG9mIHRoZSByZXBlYXRlZCBibG9jawotYmV0d2VlbiBAY29kZXsuQVJFUEVBVH0gYW5kIEBjb2Rley5BRU5EUn0uICBTcGVjaWZ5IHRoZSBudW1iZXIgb2YKLWNvcGllcyBhcyBAdmFye2FleHB9ICh3aGljaCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24pLiAgRm9yCi1leGFtcGxlLCB0aGlzIHJlcGVhdHMgdHdvIGFzc2VtYmx5IHN0YXRlbWVudHMgdGhyZWUgdGltZXMgaW4gc3VjY2Vzc2lvbjoKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgLkFSRVBFQVQgICAgICAgIDMKLSAgICAgICAgcm90Y2wgICByMgotICAgICAgICBkaXYxICAgIHIwLHIxCi0gICAgICAgIC5BRU5EUgotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1AaXRlbSAuQVdISUxFIEB2YXJ7ZXhwcmF9IEB2YXJ7Y21wfSBAdmFye2V4cHJifQotQGl0ZW14IC5BRU5EVwotQGl0ZW14IC5BV0hJTEUgQHZhcntzdHJhfSBAdmFye2NtcH0gQHZhcntzdHJifQotQGl0ZW14IC5BRU5EVwotVG8gcmVwZWF0IGEgYmxvY2sgb2YgYXNzZW1ibHkgZGVwZW5kaW5nIG9uIGEgY29uZGl0aW9uYWwgdGVzdCwgcmF0aGVyCi10aGFuIHJlcGVhdGluZyBpdCBmb3IgYSBzcGVjaWZpYyBudW1iZXIgb2YgdGltZXMsIHVzZSBAY29kZXsuQVdISUxFfS4KLUBjb2Rley5BRU5EV30gbWFya3MgdGhlIGVuZCBvZiB0aGUgcmVwZWF0ZWQgYmxvY2suICBUaGUgY29uZGl0aW9uYWwKLWNvbXBhcmlzb24gd29ya3MgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgZm9yIEBjb2Rley5BSUZ9LCB3aXRoIHRoZSBzYW1lCi1jb21wYXJpc29uIG9wZXJhdG9ycyAoQHB4cmVme0NvbmRpdGlvbmFscywsIENvbmRpdGlvbmFsIGFzc2VtYmx5fSkuCi0KLVNpbmNlIHRoZSB0ZXJtcyBvZiB0aGUgY29tcGFyaXNvbiBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24sCi1AY29kZXsuQVdISUxFfSBpcyBwcmltYXJpbHkgdXNlZnVsIHdpdGhpbiBtYWNyb3MuICBAeHJlZntNYWNyb3MsLAotRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uCi1AZW5kIGZ0YWJsZQotCi1AY2luZGV4IGxvb3BzLCBicmVha2luZyBvdXQgb2YKLUBjaW5kZXggYnJlYWtpbmcgb3V0IG9mIGxvb3BzCi1Zb3UgY2FuIHVzZSB0aGUgQGNvZGV7LkVYSVRNfSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIHRvIGJyZWFrIG91dCBvZgotbG9vcHMgZWFybHkgKGFzIHdlbGwgYXMgdG8gYnJlYWsgb3V0IG9mIG1hY3JvcykuICBAeHJlZntNYWNyb3MsLAotRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uCi0KLUBub2RlIFZhcmlhYmxlcwotQHNlY3Rpb24gUHJlcHJvY2Vzc29yIHZhcmlhYmxlcwotCi1Zb3UgY2FuIHVzZSB2YXJpYWJsZXMgaW4gQHNje2dhc3B9IHRvIHJlcHJlc2VudCBzdHJpbmdzLCByZWdpc3RlcnMsIG9yCi10aGUgcmVzdWx0cyBvZiBleHByZXNzaW9ucy4KLQotWW91IG11c3QgZGlzdGluZ3Vpc2ggdHdvIGtpbmRzIG9mIHZhcmlhYmxlczogCi1AZW51bWVyYXRlCi1AaXRlbQotVmFyaWFibGVzIGRlZmluZWQgd2l0aCBAY29kZXsuRVFVfSBvciBAY29kZXsuQVNTSUdOfS4gIFRvIGV2YWx1YXRlIHRoaXMKLWtpbmQgb2YgdmFyaWFibGUgaW4geW91ciBhc3NlbWJseSBvdXRwdXQsIHNpbXBseSBtZW50aW9uIGl0cyBuYW1lLiAgRm9yCi1leGFtcGxlLCB0aGVzZSB0d28gbGluZXMgZGVmaW5lIGFuZCB1c2UgYSB2YXJpYWJsZSBAc2FtcHtlZ306Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi1lZyAgICAgLkVRVSAgIEZMSVAtNjQKLSAgICAgICBAZG90c3t9Ci0gICAgICAgbW92LmwgIGVnLHIwCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBlbXBoe0RvIG5vdCB1c2V9IHRoaXMga2luZCBvZiB2YXJpYWJsZSBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ucyBvcgotd2hpbGUgbG9vcHM7IEBzY3tnYXNwfSBvbmx5IGV2YWx1YXRlcyB0aGVzZSB2YXJpYWJsZXMgd2hlbiB3cml0aW5nCi1hc3NlbWJseSBvdXRwdXQuCi0KLUBpdGVtCi1WYXJpYWJsZXMgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4gIFlvdSBjYW4gZGVmaW5lIHRoZXNlCi13aXRoIEBjb2Rley5BU1NJR05DfSBvciBAY29kZXsuQVNTSUdOQX0uICBUbyBldmFsdWF0ZSB0aGlzCi1raW5kIG9mIHZhcmlhYmxlLCB3cml0ZSBAc2FtcHtcJn0gYmVmb3JlIHRoZSB2YXJpYWJsZSBuYW1lOyBmb3IgZXhhbXBsZSwKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLW9wY2l0ICAuQVNTSUdOQSAgNDcKLSAgICAgICBAZG90c3t9Ci0gICAgICAgLkFXSElMRSAgXCZvcGNpdCBHVCAwCi0gICAgICAgQGRvdHN7fQotICAgICAgIC5BRU5EVwotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1Ac2N7Z2FzcH0gdHJlYXRzIG1hY3JvIGFyZ3VtZW50cyBhbG1vc3QgdGhlIHNhbWUgd2F5LCBidXQgdG8gZXZhbHVhdGUKLXRoZW0geW91IHVzZSB0aGUgcHJlZml4IEBzYW1we1x9IHJhdGhlciB0aGFuIEBzYW1we1wmfS4KLUB4cmVme01hY3JvcywsIERlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgotQGVuZCBlbnVtZXJhdGUKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntwdmFyfSAuRVFVIEB2YXJ7ZXhwcn0KLUBjIEZJWE1FISAgQW55dGhpbmcgdG8gYmV3YXJlIG9mIHJlIEdBUyBkaXJlY3RpdmUgb2Ygc2FtZSBuYW1lPwotQXNzaWduIHByZXByb2Nlc3NvciB2YXJpYWJsZSBAdmFye3B2YXJ9IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbgotQHZhcntleHByfS4gIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gcmVkZWZpbml0aW9uOyB1c2UgQHNhbXB7LkVRVX0KLXdpdGggdGhlIHNhbWUgQHZhcntwdmFyfSBhcyBvZnRlbiBhcyB5b3UgZmluZCBpdCBjb252ZW5pZW50LgotCi1AaXRlbSBAdmFye3B2YXJ9IC5BU1NJR04gQHZhcntleHByfQotQWxtb3N0IHRoZSBzYW1lIGFzIEBjb2Rley5FUVV9LCBzYXZlIHRoYXQgeW91IG1heSBub3QgcmVkZWZpbmUKLUB2YXJ7cHZhcn0gdXNpbmcgQGNvZGV7LkFTU0lHTn0gb25jZSBpdCBoYXMgYSB2YWx1ZS4KLUBjIEZJWE1FISEgIFN1cHBvc2VkIHRvIHdvcmsgdGhpcyB3YXksIGFwcGFyZW50bHksIGJ1dCBvbiA5ZmViOTQgd29ya3MKLUBjICAgICAgICAgIGp1c3QgbGlrZSAuRVFVCi0KLUBpdGVtIEB2YXJ7cHZhcn0gLkFTU0lHTkEgQHZhcnthZXhwcn0KLURlZmluZSBhIHZhcmlhYmxlIHdpdGggYSBudW1lcmljIHZhbHVlLCBmb3IgdXNlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgotQHZhcnthZXhwcn0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgWW91IGNhbiByZWRlZmluZSB2YXJpYWJsZXMKLXdpdGggQGNvZGV7LkFTU0lHTkF9IGF0IGFueSB0aW1lLgotCi1AaXRlbSBAdmFye3B2YXJ9IC5BU1NJR05DICJAdmFye3N0cn0iCi1EZWZpbmUgYSB2YXJpYWJsZSB3aXRoIGEgc3RyaW5nIHZhbHVlLCBmb3IgdXNlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgotWW91IGNhbiByZWRlZmluZSB2YXJpYWJsZXMgd2l0aCBAY29kZXsuQVNTSUdOQ30gYXQgYW55IHRpbWUuCi0KLUBpdGVtIEB2YXJ7cHZhcn0gLlJFRyAoQHZhcntyZWdpc3Rlcn0pCi1Vc2UgQGNvZGV7LlJFR30gdG8gZGVmaW5lIGEgdmFyaWFibGUgdGhhdCByZXByZXNlbnRzIGEgcmVnaXN0ZXIuICBJbgotcGFydGljdWxhciwgQHZhcntyZWdpc3Rlcn0gaXMgQGVtcGh7bm90IGV2YWx1YXRlZH0gYXMgYW4gZXhwcmVzc2lvbi4KLVlvdSBtYXkgdXNlIEBjb2Rley5SRUd9IGF0IHdpbGwgdG8gcmVkZWZpbmUgcmVnaXN0ZXIgdmFyaWFibGVzLgotQGVuZCBmdGFibGUKLQotQWxsIHRoZXNlIGRpcmVjdGl2ZXMgYWNjZXB0IHRoZSB2YXJpYWJsZSBuYW1lIGluIHRoZSBgYGxhYmVsJycgcG9zaXRpb24sCi10aGF0IGlzIGF0IHRoZSBsZWZ0IG1hcmdpbi4gIFlvdSBtYXkgc3BlY2lmeSBhIGNvbG9uIGFmdGVyIHRoZSB2YXJpYWJsZQotbmFtZSBpZiB5b3Ugd2lzaDsgdGhlIGZpcnN0IGV4YW1wbGUgYWJvdmUgY291bGQgaGF2ZSBzdGFydGVkIEBzYW1we2VnOn0KLXdpdGggdGhlIHNhbWUgZWZmZWN0LgotCi1AYyBwYWdlYnJlYWsgbWFrZXMgZm9yIGJldHRlciBhZXN0aGV0aWNzLS0tZW5zdXJlcyBtYWNybyBhbmQgZXhwYW5zaW9uIHRvZ2V0aGVyCi1AcGFnZQotQG5vZGUgTWFjcm9zCi1Ac2VjdGlvbiBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzCi0KLVRoZSBjb21tYW5kcyBAY29kZXsuTUFDUk99IGFuZCBAY29kZXsuRU5ETX0gYWxsb3cgeW91IHRvIGRlZmluZSBtYWNyb3MKLXRoYXQgZ2VuZXJhdGUgYXNzZW1ibHkgb3V0cHV0LiAgWW91IGNhbiB1c2UgdGhlc2UgbWFjcm9zIHdpdGggYSBzeW50YXgKLXNpbWlsYXIgdG8gYnVpbHQtaW4gQHNje2dhc3B9IG9yIGFzc2VtYmxlciBkaXJlY3RpdmVzLiAgRm9yIGV4YW1wbGUsCi10aGlzIGRlZmluaXRpb24gc3BlY2lmaWVzIGEgbWFjcm8gQGNvZGV7U1VNfSB0aGF0IGFkZHMgdG9nZXRoZXIgYSByYW5nZSBvZgotY29uc2VjdXRpdmUgcmVnaXN0ZXJzOgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAuTUFDUk8gIFNVTSBGUk9NPTAsIFRPPTkKLSAgICAgICAgISBcRlJPTSBcVE8KLSAgICAgICAgbW92ICAgICByXEZST00scjEwCi1DT1VOVCAgIC5BU1NJR05BICAgICAgICBcRlJPTSsxCi0gICAgICAgIC5BV0hJTEUgXCZDT1VOVCBMRSBcVE8KLSAgICAgICAgYWRkICAgICByXCZDT1VOVCxyMTAKLUNPVU5UICAgLkFTU0lHTkEgICAgICAgIFwmQ09VTlQrMQotICAgICAgICAuQUVORFcKLSAgICAgICAgLkVORE0KLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQG5vaW5kZW50Ci1XaXRoIHRoYXQgZGVmaW5pdGlvbiwgQHNhbXB7U1VNIDAsNX0gZ2VuZXJhdGVzIHRoaXMgYXNzZW1ibHkgb3V0cHV0OgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAhIDAgNQotICAgICAgICBtb3YgICAgIHIwLHIxMAotICAgICAgICBhZGQgICAgIHIxLHIxMAotICAgICAgICBhZGQgICAgIHIyLHIxMAotICAgICAgICBhZGQgICAgIHIzLHIxMAotICAgICAgICBhZGQgICAgIHI0LHIxMAotICAgICAgICBhZGQgICAgIHI1LHIxMAotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuTUFDUk8gQHZhcnttYWNuYW1lfQotQGl0ZW14IC5NQUNSTyBAdmFye21hY25hbWV9IEB2YXJ7bWFjYXJnc30gQGRvdHN7fQotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQHZhcnttYWNuYW1lfS4gIElmIHlvdXIgbWFjcm8KLWRlZmluaXRpb24gcmVxdWlyZXMgYXJndW1lbnRzLCBzcGVjaWZ5IHRoZWlyIG5hbWVzIGFmdGVyIHRoZSBtYWNybyBuYW1lLAotc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciBzcGFjZXMuICBZb3UgY2FuIHN1cHBseSBhIGRlZmF1bHQgdmFsdWUgZm9yIGFueQotbWFjcm8gYXJndW1lbnQgYnkgZm9sbG93aW5nIHRoZSBuYW1lIHdpdGggQHNhbXB7PUB2YXJ7ZGVmbHR9fS4gIEZvcgotZXhhbXBsZSwgdGhlc2UgYXJlIGFsbCB2YWxpZCBAY29kZXsuTUFDUk99IHN0YXRlbWVudHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLk1BQ1JPIENPTU0KLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle0NPTU19LCB3aGljaCB0YWtlcyBubwotYXJndW1lbnRzLgotCi1AaXRlbSAuTUFDUk8gUExVUzEgUCwgUDEKLUBpdGVteCAuTUFDUk8gUExVUzEgUCBQMQotRWl0aGVyIHN0YXRlbWVudCBiZWdpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7UExVUzF9LAotd2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50czsgd2l0aGluIHRoZSBtYWNybyBkZWZpbml0aW9uLCB3cml0ZQotQHNhbXB7XFB9IG9yIEBzYW1we1xQMX0gdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cy4KLQotQGl0ZW0gLk1BQ1JPIFJFU0VSVkVfU1RSIFAxPTAgUDIKLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle1JFU0VSVkVfU1RSfSwgd2l0aCB0d28KLWFyZ3VtZW50cy4gIFRoZSBmaXJzdCBhcmd1bWVudCBoYXMgYSBkZWZhdWx0IHZhbHVlLCBidXQgbm90IHRoZSBzZWNvbmQuCi1BZnRlciB0aGUgZGVmaW5pdGlvbiBpcyBjb21wbGV0ZSwgeW91IGNhbiBjYWxsIHRoZSBtYWNybyBlaXRoZXIgYXMKLUBzYW1we1JFU0VSVkVfU1RSIEB2YXJ7YX0sQHZhcntifX0gKHdpdGggQHNhbXB7XFAxfSBldmFsdWF0aW5nIHRvCi1AdmFye2F9IGFuZCBAc2FtcHtcUDJ9IGV2YWx1YXRpbmcgdG8gQHZhcntifSksIG9yIGFzIEBzYW1we1JFU0VSVkVfU1RSCi0sQHZhcntifX0gKHdpdGggQHNhbXB7XFAxfSBldmFsdWF0aW5nIGFzIHRoZSBkZWZhdWx0LCBpbiB0aGlzIGNhc2UKLUBzYW1wezB9LCBhbmQgQHNhbXB7XFAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLgotQGVuZCB0YWJsZQotCi1XaGVuIHlvdSBjYWxsIGEgbWFjcm8sIHlvdSBjYW4gc3BlY2lmeSB0aGUgYXJndW1lbnQgdmFsdWVzIGVpdGhlciBieQotcG9zaXRpb24sIG9yIGJ5IGtleXdvcmQuICBGb3IgZXhhbXBsZSwgQHNhbXB7U1VNIDksMTd9IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1we1NVTSBUTz0xNywgRlJPTT05fS4gIE1hY3JvIGFyZ3VtZW50cyBhcmUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcwotc2ltaWxhciB0byB0aGUgdmFyaWFibGVzIHlvdSBkZWZpbmUgd2l0aCBAc2FtcHsuQVNTSUdOQX0gb3IKLUBzYW1wey5BU1NJR05DfTsgaW4gcGFydGljdWxhciwgeW91IGNhbiB1c2UgdGhlbSBpbiBjb25kaXRpb25hbHMgb3IgZm9yCi1sb29wIGNvbnRyb2wuICAoVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgcHJlZml4IHlvdSB3cml0ZSB0byBldmFsdWF0ZQotdGhlIHZhcmlhYmxlOiBmb3IgYSBtYWNybyBhcmd1bWVudCwgd3JpdGUgQHNhbXB7XEB2YXJ7YXJnbmFtZX19LCBidXQgZm9yCi1hIHByZXByb2Nlc3NvciB2YXJpYWJsZSwgd3JpdGUgQHNhbXB7XCZAdmFye3Zhcm5hbWV9fS4pCi0KLUBpdGVtIEB2YXJ7bmFtZX0gLk1BQ1JPCi1AaXRlbXggQHZhcntuYW1lfSAuTUFDUk8gKCBAdmFye21hY2FyZ3N9IEBkb3Rze30gKQotQGMgRklYTUUgY2hlY2s6IEkgdGhpbmsgbm8gZXJyb3IgX2FuZF8gbm8gYXJncyByZWNvZ25pemVkIGlmIEkgdXNlIGZvcm0KLUBjICAgICAgIE5BTUUgIC5NQUNSTyAgIEFSRyBBUkcKLUFuIGFsdGVybmF0aXZlIGZvcm0gb2YgaW50cm9kdWNpbmcgYSBtYWNybyBkZWZpbml0aW9uOiBzcGVjaWZ5IHRoZSBtYWNybwotbmFtZSBpbiB0aGUgbGFiZWwgcG9zaXRpb24sIGFuZCB0aGUgYXJndW1lbnRzIChpZiBhbnkpIGJldHdlZW4KLXBhcmVudGhlc2VzIGFmdGVyIHRoZSBuYW1lLiAgRGVmYXVsdGluZyBydWxlcyBhbmQgdXNhZ2Ugd29yayB0aGUgc2FtZQotd2F5IGFzIGZvciB0aGUgb3RoZXIgbWFjcm8gZGVmaW5pdGlvbiBzeW50YXguCi0KLUBpdGVtIC5FTkRNCi1NYXJrIHRoZSBlbmQgb2YgYSBtYWNybyBkZWZpbml0aW9uLgotCi1AaXRlbSAuRVhJVE0KLUV4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLCBAY29kZXsuQVJFUEVBVH0gbG9vcCwgb3IKLUBjb2Rley5BV0hJTEV9IGxvb3AuCi0KLUBjaW5kZXggbnVtYmVyIG9mIG1hY3JvcyBleGVjdXRlZAotQGNpbmRleCBtYWNyb3MsIGNvdW50IGV4ZWN1dGVkCi1AaXRlbSBcQEAKLUBzY3tnYXNwfSBtYWludGFpbnMgYSBjb3VudGVyIG9mIGhvdyBtYW55IG1hY3JvcyBpdCBoYXMKLWV4ZWN1dGVkIGluIHRoaXMgcHNldWRvLXZhcmlhYmxlOyB5b3UgY2FuIGNvcHkgdGhhdCBudW1iZXIgdG8geW91cgotb3V0cHV0IHdpdGggQHNhbXB7XEBAfSwgYnV0IEBlbXBoe29ubHkgd2l0aGluIGEgbWFjcm8gZGVmaW5pdGlvbn0uCi0KLUBpdGVtIExPQ0FMIEB2YXJ7bmFtZX0gWyAsIEBkb3Rze30gXQotQGVtcGh7V2FybmluZzogQGNvZGV7TE9DQUx9IGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3QgYGBhbHRlcm5hdGUKLW1hY3JvIHN5bnRheCcnIHdpdGggQHNhbXB7LWF9IG9yIEBzYW1wey0tYWx0ZXJuYXRlfS59ICBAeHJlZntBbHRlcm5hdGUsLAotQWx0ZXJuYXRlIG1hY3JvIHN5bnRheH0uCi0KLUdlbmVyYXRlIGEgc3RyaW5nIHJlcGxhY2VtZW50IGZvciBlYWNoIG9mIHRoZSBAdmFye25hbWV9IGFyZ3VtZW50cywgYW5kCi1yZXBsYWNlIGFueSBpbnN0YW5jZXMgb2YgQHZhcntuYW1lfSBpbiBlYWNoIG1hY3JvIGV4cGFuc2lvbi4gIFRoZQotcmVwbGFjZW1lbnQgc3RyaW5nIGlzIHVuaXF1ZSBpbiB0aGUgYXNzZW1ibHksIGFuZCBkaWZmZXJlbnQgZm9yIGVhY2gKLXNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbi4gIEBjb2Rle0xPQ0FMfSBhbGxvd3MgeW91IHRvIHdyaXRlIG1hY3JvcyB0aGF0Ci1kZWZpbmUgc3ltYm9scywgd2l0aG91dCBmZWFyIG9mIGNvbmZsaWN0IGJldHdlZW4gc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9ucy4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIERhdGEKLUBzZWN0aW9uIERhdGEgb3V0cHV0Ci0KLUluIGFzc2VtYmx5IGNvZGUsIHlvdSBvZnRlbiBuZWVkIHRvIHNwZWNpZnkgd29ya2luZyBhcmVhcyBvZiBtZW1vcnk7Ci1kZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uLCB5b3UgbWF5IHdhbnQgdG8gaW5pdGlhbGl6ZSBzdWNoIG1lbW9yeSBvcgotbm90LiAgQHNje2dhc3B9IHByb3ZpZGVzIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRvIGhlbHAgeW91IGF2b2lkCi1yZXBldGl0aXZlIGNvZGluZyBmb3IgYm90aCBwdXJwb3Nlcy4KLQotWW91IGNhbiB1c2UgbGFiZWxzIGFzIHVzdWFsIHRvIG1hcmsgdGhlIGRhdGEgYXJlYXMuCi0KLUBtZW51Ci0qIEluaXRpYWxpemVkOjoKLSogVW5pbml0aWFsaXplZDo6Ci1AZW5kIG1lbnUKLQotQG5vZGUgSW5pdGlhbGl6ZWQKLUBzdWJzZWN0aW9uIEluaXRpYWxpemVkIGRhdGEKLQotVGhlc2UgYXJlIHRoZSBAc2N7Z2FzcH0gZGlyZWN0aXZlcyBmb3IgaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIHRoZSBzdGFuZGFyZAotQHNje2dudX0gYXNzZW1ibGVyIGRpcmVjdGl2ZXMgdGhleSBleHBhbmQgdG86Ci0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5EQVRBIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KLUBpdGVteCAuREFUQS5CIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KLUBpdGVteCAuREFUQS5XIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KLUBpdGVteCAuREFUQS5MIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KLUV2YWx1YXRlIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMgQHZhcntleHByfSwgYW5kIGVtaXQgdGhlIGNvcnJlc3BvbmRpbmcKLUBjb2Rle2FzfSBkaXJlY3RpdmUgKGxhYmVsbGVkIHdpdGggQHZhcntsYWJ9KS4gIFRoZSB1bnF1YWxpZmllZAotQGNvZGV7LkRBVEF9IGVtaXRzIEBzYW1wey5sb25nfTsgQGNvZGV7LkRBVEEuQn0gZW1pdHMgQHNhbXB7LmJ5dGV9OwotQGNvZGV7LkRBVEEuV30gZW1pdHMgQHNhbXB7LnNob3J0fTsgYW5kIEBjb2Rley5EQVRBLkx9IGVtaXRzCi1Ac2FtcHsubG9uZ30uCi0KLUZvciBleGFtcGxlLCBAc2FtcHtmb28gLkRBVEEgMSwyLDN9IGVtaXRzIEBzYW1we2ZvbzogLmxvbmcgMSwyLDN9LgotCi1AaXRlbSAuREFUQUIgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9Ci1AaXRlbXggLkRBVEFCLkIgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9Ci1AaXRlbXggLkRBVEFCLlcgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9Ci1AaXRlbXggLkRBVEFCLkwgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9Ci1AYyBGSVhNRSEgTG9va3MgbGlrZSBnYXNwIGFjY2VwdHMgYW5kIGlnbm9yZXMgYXJncyBhZnRlciAybmQuCi1NYWtlIEBjb2Rle2FzfSBlbWl0IEB2YXJ7cmVwZWF0fSBjb3BpZXMgb2YgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uCi1AdmFye2V4cHJ9ICh1c2luZyB0aGUgQGNvZGV7YXN9IGRpcmVjdGl2ZSBAY29kZXsuZmlsbH0pLgotQHNhbXB7LkRBVEFCLkJ9IHJlcGVhdHMgb25lLWJ5dGUgdmFsdWVzOyBAc2FtcHsuREFUQUIuV30gcmVwZWF0cwotdHdvLWJ5dGUgdmFsdWVzOyBhbmQgQHNhbXB7LkRBVEFCLkx9IHJlcGVhdHMgZm91ci1ieXRlIHZhbHVlcy4KLUBzYW1wey5EQVRBQn0gd2l0aG91dCBhIHN1ZmZpeCByZXBlYXRzIGZvdXItYnl0ZSB2YWx1ZXMsIGp1c3QgbGlrZQotQHNhbXB7LkRBVEFCLkx9LgotCi1AYyBGSVhNRSEgQWxsb3dpbmcgemVybyBtaWdodCBiZSB1c2VmdWwgZm9yIGVkZ2UgY29uZGl0aW9ucyBpbiBtYWNyb3MuCi1AdmFye3JlcGVhdH0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIHdpdGggYSBwb3NpdGl2ZSB2YWx1ZS4KLQotQGl0ZW0gLlNEQVRBICJAdmFye3N0cn0iIEBkb3Rze30KLVN0cmluZyBkYXRhLiAgRW1pdHMgYSBjb25jYXRlbmF0aW9uIG9mIGJ5dGVzLCBwcmVjaXNlbHkgYXMgeW91IHNwZWNpZnkKLXRoZW0gKGluIHBhcnRpY3VsYXIsIEBlbXBoe25vdGhpbmcgaXMgYWRkZWQgdG8gbWFyayB0aGUgZW5kfSBvZiB0aGUKLXN0cmluZykuICBAeHJlZntDb25zdGFudHMsLCBTdHJpbmcgYW5kIG51bWVyaWMgY29uc3RhbnRzfSwgZm9yIGRldGFpbHMKLWFib3V0IGhvdyB0byB3cml0ZSBzdHJpbmdzLiAgQGNvZGV7LlNEQVRBfSBjb25jYXRlbmF0ZXMgbXVsdGlwbGUKLWFyZ3VtZW50cywgbWFraW5nIGl0IGVhc3kgdG8gc3dpdGNoIGJldHdlZW4gc3RyaW5nIHJlcHJlc2VudGF0aW9ucy4gIFlvdQotY2FuIHVzZSBjb21tYXMgdG8gc2VwYXJhdGUgdGhlIGluZGl2aWR1YWwgYXJndW1lbnRzIGZvciBjbGFyaXR5LCBpZiB5b3UKLWNob29zZS4KLQotQGl0ZW0gLlNEQVRBQiBAdmFye3JlcGVhdH0sICJAdmFye3N0cn0iIEBkb3Rze30KLVJlcGVhdGVkIHN0cmluZyBkYXRhLiAgVGhlIGZpcnN0IGFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSBjb3BpZXMgb2YKLXRoZSBzdHJpbmcgdG8gZW1pdDsgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmeSB0aGUgc3RyaW5nLCBpbiB0aGUKLXNhbWUgd2F5IGFzIHRoZSBhcmd1bWVudHMgdG8gQGNvZGV7LlNEQVRBfS4KLQotQGl0ZW0gLlNEQVRBWiAiQHZhcntzdHJ9IiBAZG90c3t9Ci1aZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIGRhdGEuICBKdXN0IGxpa2UgQGNvZGV7LlNEQVRBfSwgZXhjZXB0IHRoYXQKLUBjb2Rley5TREFUQVp9IHdyaXRlcyBhIHplcm8gYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0KLUBpdGVtIC5TREFUQUMgIkB2YXJ7c3RyfSIgQGRvdHN7fQotQ291bnQtcHJlZml4ZWQgc3RyaW5nIGRhdGEuICBKdXN0IGxpa2UgQGNvZGV7LlNEQVRBfSwgZXhjZXB0IHRoYXQKLUBzY3tnYXNwfSBwcmVjZWRlcyB0aGUgc3RyaW5nIHdpdGggYSBsZWFkaW5nIG9uZS1ieXRlIGNvdW50LiAgRm9yCi1leGFtcGxlLCBAc2FtcHsuU0RBVEFDICJISSJ9IGdlbmVyYXRlcyBAc2FtcHsuYnl0ZSAyLDcyLDczfS4gIFNpbmNlIHRoZQotY291bnQgZmllbGQgaXMgb25seSBvbmUgYnl0ZSwgeW91IGNhbiBvbmx5IHVzZSBAY29kZXsuU0RBVEFDfSBmb3IKLXN0cmluZ3MgbGVzcyB0aGFuIDI1NiBieXRlcyBpbiBsZW5ndGguCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBVbmluaXRpYWxpemVkCi1Ac3Vic2VjdGlvbiBVbmluaXRpYWxpemVkIGRhdGEKLQotQGMgRklYTUUhICAuc3BhY2UgZGlmZmVyZW50IG9uIHNvbWUgcGxhdGZvcm1zLCBub3RhYmx5IEhQUEEuICBDb25maWc/Ci1Vc2UgdGhlIEBjb2Rley5SRVN9LCBAY29kZXsuU1JFU30sIEBjb2Rley5TUkVTQ30sIGFuZCBAY29kZXsuU1JFU1p9Ci1kaXJlY3RpdmVzIHRvIHJlc2VydmUgbWVtb3J5IGFuZCBsZWF2ZSBpdCB1bmluaXRpYWxpemVkLiAgQHNje2dhc3B9Ci1yZXNvbHZlcyB0aGVzZSBkaXJlY3RpdmVzIHRvIGFwcHJvcHJpYXRlIGNhbGxzIG9mIHRoZSBAc2N7Z251fQotQGNvZGV7YXN9IEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuUkVTIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlJFUy5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlJFUy5XIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlJFUy5MIEB2YXJ7Y291bnR9Ci1SZXNlcnZlIHJvb20gZm9yIEB2YXJ7Y291bnR9IHVuaW5pdGlhbGl6ZWQgZWxlbWVudHMgb2YgZGF0YS4gIFRoZQotc3VmZml4IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQ6IEBjb2Rley5SRVMuQn0gcmVzZXJ2ZXMKLUB2YXJ7Y291bnR9IGJ5dGVzLCBAY29kZXsuUkVTLld9IHJlc2VydmVzIEB2YXJ7Y291bnR9IHBhaXJzIG9mIGJ5dGVzLAotYW5kIEBjb2Rley5SRVMuTH0gcmVzZXJ2ZXMgQHZhcntjb3VudH0gcXVhcnRldHMuICBAY29kZXsuUkVTfSB3aXRob3V0IGEKLXN1ZmZpeCBpcyBlcXVpdmFsZW50IHRvIEBjb2Rley5SRVMuTH0uCi0KLUBpdGVtIC5TUkVTIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVMuQiBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTLlcgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFUy5MIEB2YXJ7Y291bnR9Ci1AYyBGSVhNRSEgIFRoaXMgaXMgYm9yaW5nLiAgU2hvdWxkbid0IGl0IGF0IGxlYXN0IGhhdmUgYSBkaWZmZXJlbnQKLUBjICAgICAgICAgZGVmYXVsdCBzaXplPyAgKGUuZy4gdGhlICJTIiBzdWdnZXN0cyAic3RyaW5nIiwgZm9yIHdoaWNoIC5CCi1AYyAgICAgICAgIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUpCi1AY29kZXsuU1JFU30gaXMgYSBzeW5vbnltIGZvciBAc2FtcHsuUkVTfS4KLQotQGl0ZW0gLlNSRVNDIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNDLkIgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU0MuVyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTQy5MIEB2YXJ7Y291bnR9Ci1MaWtlIEBjb2Rley5TUkVTfSwgYnV0IHJlc2VydmVzIHNwYWNlIGZvciBAY29kZXtAdmFye2NvdW50fSsxfSBlbGVtZW50cy4KLQotQGl0ZW0gLlNSRVNaIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNaLkIgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU1ouVyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTWi5MIEB2YXJ7Y291bnR9Ci1MaWtlIEBjb2Rley5TUkVTfSwgYnV0IHJlc2VydmVzIHNwYWNlIGZvciBAY29kZXtAdmFye2NvdW50fSsxfSBlbGVtZW50cy4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIExpc3RpbmdzCi1Ac2VjdGlvbiBBc3NlbWJseSBsaXN0aW5nIGNvbnRyb2wKLQotVGhlIEBzY3tnYXNwfSBsaXN0aW5nLWNvbnRyb2wgZGlyZWN0aXZlcyBjb3JyZXNwb25kIHRvCi1yZWxhdGVkIEBzY3tnbnV9IEBjb2Rle2FzfSBkaXJlY3RpdmVzLgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuUFJJTlQgTElTVAotQGl0ZW14IC5QUklOVCBOT0xJU1QKLVByaW50IGNvbnRyb2wuICBUaGlzIGRpcmVjdGl2ZSBlbWl0cyB0aGUgQHNje2dudX0gQGNvZGV7YXN9IGRpcmVjdGl2ZQotQGNvZGV7Lmxpc3R9IG9yIEBjb2Rley5ub2xpc3R9LCBhY2NvcmRpbmcgdG8gaXRzIGFyZ3VtZW50LiAgQHhyZWZ7TGlzdCwsCi1AY29kZXsubGlzdH0sIGFzLmluZm8sIFVzaW5nIGFzfSwgZm9yIGRldGFpbHMgb24gaG93IHRoZXNlIGRpcmVjdGl2ZXMKLWludGVyYWN0LgotCi1AaXRlbSAuRk9STSBMSU49QHZhcntsbn0KLUBpdGVteCAuRk9STSBDT0w9QHZhcntjb2xzfQotQGl0ZW14IC5GT1JNIExJTj1AdmFye2xufSBDT0w9QHZhcntjb2xzfQotU3BlY2lmeSB0aGUgcGFnZSBzaXplIGZvciBhc3NlbWJseSBsaXN0aW5nczogQHZhcntsbn0gcmVwcmVzZW50cyB0aGUKLW51bWJlciBvZiBsaW5lcywgYW5kIEB2YXJ7Y29sc30gdGhlIG51bWJlciBvZiBjb2x1bW5zLiAgWW91IG1heSBzcGVjaWZ5Ci1laXRoZXIgcGFnZSBkaW1lbnNpb24gaW5kZXBlbmRlbnRseSwgb3IgYm90aCB0b2dldGhlci4gIElmIHlvdSBkbyBub3QKLXNwZWNpZnkgdGhlIG51bWJlciBvZiBsaW5lcywgQHNje2dhc3B9IGFzc3VtZXMgNjAgbGluZXM7IGlmIHlvdSBkbyBub3QKLXNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zLCBAc2N7Z2FzcH0gYXNzdW1lcyAxMzIgY29sdW1ucy4KLShBbnkgdmFsdWVzIHlvdSBtYXkgaGF2ZSBzcGVjaWZpZWQgaW4gcHJldmlvdXMgaW5zdGFuY2VzIG9mIEBjb2Rley5GT1JNfQotZG8gQGVtcGh7bm90fSBjYXJyeSBvdmVyIGFzIGRlZmF1bHRzLikgIEVtaXRzIHRoZSBAY29kZXsucHNpemV9Ci1hc3NlbWJsZXIgZGlyZWN0aXZlLgotCi1AaXRlbSAuSEVBRElORyBAdmFye3N0cmluZ30KLVNwZWNpZnkgQHZhcntzdHJpbmd9IGFzIHRoZSB0aXRsZSBvZiB5b3VyIGFzc2VtYmx5IGxpc3RpbmdzLiAgRW1pdHMKLUBzYW1wey50aXRsZSAiQHZhcntzdHJpbmd9In0uCi0KLUBpdGVtIC5QQUdFCi1Gb3JjZSBhIG5ldyBwYWdlIGluIGFzc2VtYmx5IGxpc3RpbmdzLiAgRW1pdHMgQHNhbXB7LmVqZWN0fS4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIE90aGVyIENvbW1hbmRzCi1Ac2VjdGlvbiBNaXNjZWxsYW5lb3VzIGNvbW1hbmRzCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5BTFRFUk5BVEUKLVVzZSB0aGUgYWx0ZXJuYXRlIG1hY3JvIHN5bnRheCBoZW5jZWZvcnRoIGluIHRoZSBhc3NlbWJseS4KLUB4cmVme0FsdGVybmF0ZSwsIEFsdGVybmF0ZSBtYWNybyBzeW50YXh9LgotCi1AaXRlbSAuT1JHCi1AYyBGSVhNRSEgIFRoaXMgaXMgdmVyeSBzdHJhbmdlLCBzaW5jZSBfR0FTXyB1bmRlcnN0YW5kcyAub3JnCi1UaGlzIGNvbW1hbmQgaXMgcmVjb2duaXplZCwgYnV0IG5vdCB5ZXQgaW1wbGVtZW50ZWQuICBAc2N7Z2FzcH0KLWdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGZvciBwcm9ncmFtcyB0aGF0IHVzZSBAY29kZXsuT1JHfS4KLQotQGl0ZW0gLlJBRElYIEB2YXJ7c30KLUBjIEZJWE1FIG5vIHRlc3QgY2FzZXMgaW4gdGVzdHN1aXRlL2dhc3AKLUBzY3tnYXNwfSB1bmRlcnN0YW5kcyBudW1iZXJzIGluIGFueSBvZiBiYXNlIHR3bywgZWlnaHQsIHRlbiwgb3IKLXNpeHRlZW4uICBZb3UgY2FuIGVuY29kZSB0aGUgYmFzZSBleHBsaWNpdGx5IGluIGFueSBudW1lcmljIGNvbnN0YW50Ci0oQHB4cmVme0NvbnN0YW50cywsIFN0cmluZyBhbmQgbnVtZXJpYyBjb25zdGFudHN9KS4gIElmIHlvdSB3cml0ZQotbnVtYmVycyB3aXRob3V0IGFuIGV4cGxpY2l0IGluZGljYXRpb24gb2YgdGhlIGJhc2UsIHRoZSBtb3N0IHJlY2VudAotQHNhbXB7LlJBRElYIEB2YXJ7c319IGNvbW1hbmQgZGV0ZXJtaW5lcyBob3cgdGhleSBhcmUgaW50ZXJwcmV0ZWQuCi1AdmFye3N9IGlzIGEgc2luZ2xlIGxldHRlciwgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLlJBRElYIEIKLUJhc2UgMi4KLQotQGl0ZW0gLlJBRElYIFEKLUJhc2UgOC4KLQotQGl0ZW0gLlJBRElYIEQKLUJhc2UgMTAuICBUaGlzIGlzIHRoZSBvcmlnaW5hbCBkZWZhdWx0IHJhZGl4LgotCi1AaXRlbSAuUkFESVggSAotQmFzZSAxNi4KLUBlbmQgdGFibGUKLQotWW91IG1heSBzcGVjaWZ5IHRoZSBhcmd1bWVudCBAdmFye3N9IGluIGxvd2VyIGNhc2UgKGFueSBvZiBAc2FtcHticWRofSkKLXdpdGggdGhlIHNhbWUgZWZmZWN0cy4KLQotQGl0ZW0gLkVYUE9SVCBAdmFye25hbWV9Ci1AaXRlbXggLkdMT0JBTCBAdmFye25hbWV9Ci1AYyBGSVhNRSEgTm8gdGVzdCBjYXNlcyBpbiB0ZXN0c3VpdGUvZ2FzcAotRGVjbGFyZSBAdmFye25hbWV9IGdsb2JhbCAoZW1pdHMgQHNhbXB7Lmdsb2JhbCBAdmFye25hbWV9fSkuICBUaGUgdHdvCi1kaXJlY3RpdmVzIGFyZSBzeW5vbnltb3VzLgotCi1AaXRlbSAuUFJPR1JBTQotTm8gZWZmZWN0OiBAc2N7Z2FzcH0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwgYW5kIHNpbGVudGx5IGlnbm9yZXMgaXQuCi0KLUBpdGVtIC5FTkQKLU1hcmsgZW5kIG9mIGVhY2ggcHJlcHJvY2Vzc29yIGZpbGUuICBAc2N7Z2FzcH0gaXNzdWVzIGEgd2FybmluZyBpZiBpdAotcmVhY2hlcyBlbmQgb2YgZmlsZSB3aXRob3V0IHNlZWluZyB0aGlzIGNvbW1hbmQuCi0KLUBpdGVtIC5JTkNMVURFICJAdmFye3N0cn0iCi1QcmVwcm9jZXNzIHRoZSBmaWxlIG5hbWVkIGJ5IEB2YXJ7c3RyfSwgYXMgaWYgaXRzIGNvbnRlbnRzIGFwcGVhcmVkCi13aGVyZSB0aGUgQGNvZGV7LklOQ0xVREV9IGRpcmVjdGl2ZSBkb2VzLiAgQHNje2dhc3B9IGltcG9zZXMgYSBtYXhpbXVtCi1saW1pdCBvZiAzMCBzdGFja2VkIGluY2x1ZGUgZmlsZXMsIGFzIGEgc2FuaXR5IGNoZWNrLgotQGMgRklYTUUhICBXaHkgaXMgaW5jbHVkZSBkZXB0aCBub3QgYWZmZWN0ZWQgYnkgLXU/Ci0KLUBpdGVtIC5BTElHTiBAdmFye3NpemV9Ci1AYyBGSVhNRSEgV2h5IGlzIHRoaXMgbm90IHV0dGVybHkgcG9pbnRsZXNzPwotRXZhbHVhdGUgdGhlIGFic29sdXRlIGV4cHJlc3Npb24gQHZhcntzaXplfSwgYW5kIGVtaXQgdGhlIGFzc2VtYmx5Ci1pbnN0cnVjdGlvbiBAc2FtcHsuYWxpZ24gQHZhcntzaXplfX0gdXNpbmcgdGhlIHJlc3VsdC4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIFN5bnRheCBEZXRhaWxzCi1Ac2VjdGlvbiBEZXRhaWxzIG9mIHRoZSBHQVNQIHN5bnRheAotCi1TaW5jZSBAc2N7Z2FzcH0gaXMgbWVhbnQgdG8gd29yayB3aXRoIGFzc2VtYmx5IGNvZGUsIGl0cyBzdGF0ZW1lbnQKLXN5bnRheCBoYXMgbm8gc3VycHJpc2VzIGZvciB0aGUgYXNzZW1ibHkgcHJvZ3JhbW1lci4KLQotQGNpbmRleCB3aGl0ZXNwYWNlCi1AZW1waHtXaGl0ZXNwYWNlfSAoYmxhbmtzIG9yIHRhYnM7IEBlbXBoe25vdH0gbmV3bGluZSkgaXMgcGFydGlhbGx5Ci1zaWduaWZpY2FudCwgaW4gdGhhdCBpdCBkZWxpbWl0cyB1cCB0byB0aHJlZSBmaWVsZHMgaW4gYSBsaW5lLiAgVGhlCi1hbW91bnQgb2Ygd2hpdGVzcGFjZSBkb2VzIG5vdCBtYXR0ZXI7IHlvdSBtYXkgbGluZSB1cCBmaWVsZHMgaW4gc2VwYXJhdGUKLWxpbmVzIGlmIHlvdSB3aXNoLCBidXQgQHNje2dhc3B9IGRvZXMgbm90IHJlcXVpcmUgdGhhdC4KLQotQGNpbmRleCBmaWVsZHMgb2YgQHNje2dhc3B9IHNvdXJjZSBsaW5lCi1AY2luZGV4IGxhYmVsIGZpZWxkCi1UaGUgQGVtcGh7Zmlyc3QgZmllbGR9LCBhbiBvcHRpb25hbCBAZGZue2xhYmVsfSwgbXVzdCBiZSBmbHVzaCBsZWZ0IGluIGEKLWxpbmUgKHdpdGggbm8gbGVhZGluZyB3aGl0ZXNwYWNlKSBpZiBpdCBhcHBlYXJzIGF0IGFsbC4gIFlvdSBtYXkgdXNlIGEKLWNvbG9uIGFmdGVyIHRoZSBsYWJlbCBpZiB5b3Ugd2lzaDsgQHNje2dhc3B9IG5laXRoZXIgcmVxdWlyZXMgdGhlIGNvbG9uCi1ub3Igb2JqZWN0cyB0byBpdCAoYnV0IHdpbGwgbm90IGluY2x1ZGUgaXQgYXMgcGFydCBvZiB0aGUgbGFiZWwgbmFtZSkuCi0KLUBjaW5kZXggZGlyZWN0aXZlIGZpZWxkCi1UaGUgQGVtcGh7c2Vjb25kIGZpZWxkfSwgd2hpY2ggbXVzdCBhcHBlYXIgYWZ0ZXIgc29tZSB3aGl0ZXNwYWNlLAotY29udGFpbnMgYSBAc2N7Z2FzcH0gb3IgYXNzZW1ibHkgQGRmbntkaXJlY3RpdmV9LgotCi1AY2luZGV4IGFyZ3VtZW50IGZpZWxkcwotQW55IEBlbXBoe2Z1cnRoZXIgZmllbGRzfSBvbiBhIGxpbmUgYXJlIEBkZm57YXJndW1lbnRzfSB0byB0aGUKLWRpcmVjdGl2ZTsgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIGZyb20gb25lIGFub3RoZXIgdXNpbmcgZWl0aGVyIGNvbW1hcyBvcgotd2hpdGVzcGFjZS4KLQotQG1lbnUKLSogTWFya2Vyczo6Ci0qIENvbnN0YW50czo6Ci0qIFN5bWJvbHM6OgotKiBFeHByZXNzaW9uczo6Ci0qIFN0cmluZyBCdWlsdGluczo6Ci1AZW5kIG1lbnUKLQotQG5vZGUgTWFya2VycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBzeW50YWN0aWMgbWFya2VycwotCi1Ac2N7Z2FzcH0gcmVjb2duaXplcyBhIGZldyBzcGVjaWFsIG1hcmtlcnM6IHRvIGRlbGltaXQgY29tbWVudHMsIHRvCi1jb250aW51ZSBhIHN0YXRlbWVudCBvbiB0aGUgbmV4dCBsaW5lLCB0byBzZXBhcmF0ZSBzeW1ib2xzIGZyb20gb3RoZXIKLWNoYXJhY3RlcnMsIGFuZCB0byBjb3B5IHRleHQgdG8gdGhlIG91dHB1dCBsaXRlcmFsbHkuICAoT25lIG90aGVyCi1zcGVjaWFsIG1hcmtlciwgQHNhbXB7XEBAfSwgd29ya3Mgb25seSB3aXRoaW4gbWFjcm8gZGVmaW5pdGlvbnM7Ci1AcHhyZWZ7TWFjcm9zLCwgRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uKQotCi1AY2luZGV4IGNvbW1lbnRzCi1UaGUgdHJhaWxpbmcgcGFydCBvZiBhbnkgQHNje2dhc3B9IHNvdXJjZSBsaW5lIG1heSBiZSBhIEBkZm57Y29tbWVudH0uCi1BIGNvbW1lbnQgYmVnaW5zIHdpdGggdGhlIGZpcnN0IHVucXVvdGVkIGNvbW1lbnQgY2hhcmFjdGVyIChAc2FtcHshfSBieQotZGVmYXVsdCksIG9yIGFuIGVzY2FwZWQgb3IgZG91YmxlZCBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7XCF9IG9yCi1Ac2FtcHshIX0gYnkgZGVmYXVsdCksIGFuZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgYSBsaW5lLiAgWW91IGNhbgotc3BlY2lmeSB3aGF0IGNvbW1lbnQgY2hhcmFjdGVyIHRvIHVzZSB3aXRoIHRoZSBAc2FtcHstY30gb3B0aW9uCi0oQHB4cmVme0ludm9raW5nIEdBU1AsLCBDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgVGhlIHR3byBraW5kcyBvZgotY29tbWVudCBtYXJrZXJzIGxlYWQgdG8gc2xpZ2h0bHkgZGlmZmVyZW50IHRyZWF0bWVudDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAhCi1BIHNpbmdsZSwgdW4tZXNjYXBlZCBjb21tZW50IGNoYXJhY3RlciBnZW5lcmF0ZXMgYW4gYXNzZW1ibHkgY29tbWVudCBpbgotdGhlIEBzY3tnYXNwfSBvdXRwdXQuICBAc2N7Z2FzcH0gZXZhbHVhdGVzIGFueSBwcmVwcm9jZXNzb3IgdmFyaWFibGVzCi0obWFjcm8gYXJndW1lbnRzLCBvciB2YXJpYWJsZXMgZGVmaW5lZCB3aXRoIEBjb2Rley5BU1NJR05BfSBvcgotQGNvZGV7LkFTU0lHTkN9KSBwcmVzZW50LiAgRm9yIGV4YW1wbGUsIGEgbWFjcm8gdGhhdCBiZWdpbnMgbGlrZSB0aGlzCi0KLUBleGFtcGxlCi0gICAgICAgIC5NQUNSTyAgU1VNIEZST009MCwgVE89OQotICAgICAgICAhIFxGUk9NIFxUTwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotaXNzdWVzIGFzIHRoZSBmaXJzdCBsaW5lIG9mIG91dHB1dCBhIGNvbW1lbnQgdGhhdCByZWNvcmRzIHRoZQotdmFsdWVzIHlvdSB1c2VkIHRvIGNhbGwgdGhlIG1hY3JvLgotCi1AYyBjb21tZW50cywgcHJlcHJvY2Vzc29yLW9ubHkKLUBjIHByZXByb2Nlc3Nvci1vbmx5IGNvbW1lbnRzCi1AYyBHQVNQLW9ubHkgY29tbWVudHMKLUBpdGVtIFwhCi1AaXRlbXggISEKLUVpdGhlciBhbiBlc2NhcGVkIGNvbW1lbnQgY2hhcmFjdGVyLCBvciBhIGRvdWJsZSBjb21tZW50IGNoYXJhY3RlciwKLW1hcmtzIGEgQHNje2dhc3B9IHNvdXJjZSBjb21tZW50LiAgQHNje2dhc3B9IGRvZXMgbm90IGNvcHkgc3VjaCBjb21tZW50cwotdG8gdGhlIGFzc2VtYmx5IG91dHB1dC4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBjb250aW51YXRpb24gY2hhcmFjdGVyCi1Aa2luZGV4ICsKLVRvIEBlbXBoe2NvbnRpbnVlIGEgc3RhdGVtZW50fSBvbiB0aGUgbmV4dCBsaW5lIG9mIHRoZSBmaWxlLCBiZWdpbiB0aGUKLXNlY29uZCBsaW5lIHdpdGggdGhlIGNoYXJhY3RlciBAc2FtcHsrfS4KLQotQGNpbmRleCBsaXRlcmFsIGNvcHkgdG8gb3V0cHV0Ci1AY2luZGV4IGNvcHlpbmcgbGl0ZXJhbGx5IHRvIG91dHB1dAotQGNpbmRleCBwcmVwcm9jZXNzaW5nLCBhdm9pZGluZwotQGNpbmRleCBhdm9pZGluZyBwcmVwcm9jZXNzaW5nCi1PY2Nhc2lvbmFsbHkgeW91IG1heSB3YW50IHRvIHByZXZlbnQgQHNje2dhc3B9IGZyb20gcHJlcHJvY2Vzc2luZyBzb21lCi1wYXJ0aWN1bGFyIGJpdCBvZiB0ZXh0LiAgVG8gQGVtcGh7Y29weSBsaXRlcmFsbHl9IGZyb20gdGhlIEBzY3tnYXNwfQotc291cmNlIHRvIGl0cyBvdXRwdXQsIHBsYWNlIEBzYW1we1wofSBiZWZvcmUgdGhlIHN0cmluZyB0byBjb3B5LCBhbmQKLUBzYW1weyl9IGF0IHRoZSBlbmQuICBGb3IgZXhhbXBsZSwgd3JpdGUgQHNhbXB7XChcISl9IGlmIHlvdSBuZWVkIHRoZQotY2hhcmFjdGVycyBAc2FtcHtcIX0gaW4geW91ciBhc3NlbWJseSBvdXRwdXQuCi0KLUBjaW5kZXggc3ltYm9sIHNlcGFyYXRvcgotQGNpbmRleCB0ZXh0LCBzZXBhcmF0aW5nIGZyb20gc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCBzZXBhcmF0aW5nIGZyb20gdGV4dAotVG8gQGVtcGh7c2VwYXJhdGUgYSBwcmVwcm9jZXNzb3IgdmFyaWFibGV9IGZyb20gdGV4dCB0byBhcHBlYXIKLWltbWVkaWF0ZWx5IGFmdGVyIGl0cyB2YWx1ZSwgd3JpdGUgYSBzaW5nbGUgcXVvdGUgKEBjb2Rleyd9KS4gIEZvcgotZXhhbXBsZSwgQHNhbXB7LlNEQVRBICJcUCcxIn0gd3JpdGVzIGEgc3RyaW5nIGJ1aWx0IGJ5IGNvbmNhdGVuYXRpbmcgdGhlCi12YWx1ZSBvZiBAY29kZXtQfSBhbmQgdGhlIGRpZ2l0IEBzYW1wezF9LiAgKFlvdSBjYW5ub3QgYWNoaWV2ZSB0aGlzIGJ5Ci13cml0aW5nIGp1c3QgQHNhbXB7XFAxfSwgc2luY2UgQHNhbXB7UDF9IGlzIGl0c2VsZiBhIHZhbGlkIG5hbWUgZm9yIGEKLXByZXByb2Nlc3NvciB2YXJpYWJsZS4pCi0KLUBub2RlIENvbnN0YW50cwotQHN1YnNlY3Rpb24gU3RyaW5nIGFuZCBudW1lcmljIGNvbnN0YW50cwotCi1UaGVyZSBhcmUgdHdvIHdheXMgb2Ygd3JpdGluZyBAZGZue3N0cmluZyBjb25zdGFudHN9IGluIEBzY3tnYXNwfTogYXMKLWxpdGVyYWwgdGV4dCwgYW5kIGJ5IG51bWVyaWMgYnl0ZSB2YWx1ZS4gIFNwZWNpZnkgYSBzdHJpbmcgbGl0ZXJhbAotYmV0d2VlbiBkb3VibGUgcXVvdGVzIChAY29kZXsiQHZhcntzdHJ9In0pLiAgU3BlY2lmeSBhbiBpbmRpdmlkdWFsCi1udW1lcmljIGJ5dGUgdmFsdWUgYXMgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBiZXR3ZWVuIGFuZ2xlIGJyYWNrZXRzCi0oQGNvZGV7PEB2YXJ7ZXhwcn0+fS4gIERpcmVjdGl2ZXMgdGhhdCBvdXRwdXQgc3RyaW5ncyBhbGxvdyB5b3UgdG8KLXNwZWNpZnkgYW55IG51bWJlciBvZiBlaXRoZXIga2luZCBvZiB2YWx1ZSwgaW4gd2hhdGV2ZXIgb3JkZXIgaXMKLWNvbnZlbmllbnQsIGFuZCBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0LiAgKEFsdGVybmF0ZSBzeW50YXggbW9kZQotaW50cm9kdWNlcyBhIG51bWJlciBvZiBhbHRlcm5hdGl2ZSBzdHJpbmcgbm90YXRpb25zOyBAcHhyZWZ7QWx0ZXJuYXRlLCwKLUFsdGVybmF0ZSBtYWNybyBzeW50YXh9LikKLQotQGMgRGV0YWlscyBvZiBudW1lcmljIG5vdGF0aW9uLCBlLmcuIGJhc2UgcHJlZml4ZXMKLVlvdSBjYW4gd3JpdGUgQGRmbntudW1lcmljIGNvbnN0YW50c30gZWl0aGVyIGluIGEgc3BlY2lmaWMgYmFzZSwgb3IgaW4KLXdoYXRldmVyIGJhc2UgaXMgY3VycmVudGx5IHNlbGVjdGVkIChlaXRoZXIgMTAsIG9yIHNlbGVjdGVkIGJ5IHRoZSBtb3N0Ci1yZWNlbnQgQGNvZGV7LlJBRElYfSkuCi0KLVRvIHdyaXRlIGEgbnVtYmVyIGluIGEgQGVtcGh7c3BlY2lmaWMgYmFzZX0sIHVzZSB0aGUgcGF0dGVybgotQGNvZGV7QHZhcntzfSdAdmFye2RkZH19OiBhIGJhc2Ugc3BlY2lmaWVyIGNoYXJhY3RlciBAdmFye3N9LCBmb2xsb3dlZAotYnkgYSBzaW5nbGUgcXVvdGUgZm9sbG93ZWQgYnkgZGlnaXRzIEB2YXJ7ZGRkfS4gIFRoZSBiYXNlIHNwZWNpZmllcgotY2hhcmFjdGVyIG1hdGNoZXMgdGhvc2UgeW91IGNhbiBzcGVjaWZ5IHdpdGggQGNvZGV7LlJBRElYfTogQHNhbXB7Qn0gZm9yCi1iYXNlIDIsIEBzYW1we1F9IGZvciBiYXNlIDgsIEBzYW1we0R9IGZvciBiYXNlIDEwLCBhbmQgQHNhbXB7SH0gZm9yIGJhc2UKLTE2LiAgKFlvdSBjYW4gd3JpdGUgdGhpcyBjaGFyYWN0ZXIgaW4gbG93ZXIgY2FzZSBpZiB5b3UgcHJlZmVyLikKLQotQGMgRklYTUUhIFdoYXQgYXJlIHJ1bGVzIGZvciByZWNvZ25pemluZyBudW1iZXIgaW4gZGVmbHQgYmFzZT8gIFdoYXRldmVyCi1AYyAgICAgICAgaXMgbGVmdCBvdmVyIGFmdGVyIHBhcnNpbmcgb3RoZXIgdGhpbmdzPz8KLQotQG5vZGUgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9scwotCi1Ac2N7Z2FzcH0gcmVjb2duaXplcyBzeW1ib2wgbmFtZXMgdGhhdCBzdGFydCB3aXRoIGFueSBhbHBoYWJldGljIGNoYXJhY3RlciwKLUBzYW1we199LCBvciBAc2FtcHskfSwgYW5kIGNvbnRpbnVlIHdpdGggYW55IG9mIHRoZSBzYW1lIGNoYXJhY3RlcnMgb3IKLXdpdGggZGlnaXRzLiAgTGFiZWwgbmFtZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzLgotCi1Abm9kZSBFeHByZXNzaW9ucwotQHN1YnNlY3Rpb24gQXJpdGhtZXRpYyBleHByZXNzaW9ucyBpbiBHQVNQCi0KLUBjaW5kZXggYWJzb2x1dGUgZXhwcmVzc2lvbnMKLUBjaW5kZXggcmVsb2NhdGFibGUgZXhwcmVzc2lvbnMKLVRoZXJlIGFyZSB0d28ga2luZHMgb2YgZXhwcmVzc2lvbnMsIGRlcGVuZGluZyBvbiB0aGVpciByZXN1bHQ6Ci1AZGZue2Fic29sdXRlfSBleHByZXNzaW9ucywgd2hpY2ggcmVzb2x2ZSB0byBhIGNvbnN0YW50ICh0aGF0IGlzLCB0aGV5Ci1kbyBub3QgaW52b2x2ZSBhbnkgdmFsdWVzIHVua25vd24gdG8gQHNje2dhc3B9KSwgYW5kIEBkZm57cmVsb2NhdGFibGV9Ci1leHByZXNzaW9ucywgd2hpY2ggbXVzdCByZWR1Y2UgdG8gdGhlIGZvcm0KLQotQGV4YW1wbGUKLUB2YXJ7YWRkc3ltfStAdmFye2NvbnN0fS1AdmFye3N1YnN5bX0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZXJlIEB2YXJ7YWRkc3ltfSBhbmQgQHZhcntzdWJzeW19IGFyZSBhc3NlbWJseSBzeW1ib2xzIG9mIHVua25vd24KLXZhbHVlLCBhbmQgQHZhcntjb25zdH0gaXMgYSBjb25zdGFudC4KLQotQXJpdGhtZXRpYyBmb3IgQHNje2dhc3B9IGV4cHJlc3Npb25zIGZvbGxvd3MgdmVyeSBzaW1pbGFyIHJ1bGVzIHRvIEMuCi1Zb3UgY2FuIHVzZSBwYXJlbnRoZXNlcyB0byBjaGFuZ2UgcHJlY2VkZW5jZTsgb3RoZXJ3aXNlLCBhcml0aG1ldGljCi1wcmltaXRpdmVzIGhhdmUgZGVjcmVhc2luZyBwcmVjZWRlbmNlIGluIHRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nCi1saXN0LgotCi1AZW51bWVyYXRlCi1AaXRlbQotU2luZ2xlLWFyZ3VtZW50IEBjb2Rleyt9IChpZGVudGl0eSksIEBjb2Rley19IChhcml0aG1ldGljIG9wcG9zaXRlKSwgb3IKLUBjb2Rle359IChiaXR3aXNlIG5lZ2F0aW9uKS4gIEBlbXBoe1RoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGFic29sdXRlCi1leHByZXNzaW9uLn0KLQotQGl0ZW0KLUBjb2Rleyp9IChtdWx0aXBsaWNhdGlvbikgYW5kIEBjb2Rley99IChkaXZpc2lvbikuICBAZW1waHtCb3RoIGFyZ3VtZW50cwotbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9ucy59Ci0KLUBpdGVtCi1AY29kZXsrfSAoYWRkaXRpb24pIGFuZCBAY29kZXstfSAoc3VidHJhY3Rpb24pLiAgQGVtcGh7QXQgbGVhc3Qgb25lIGFyZ3VtZW50Ci1tdXN0IGJlIGFic29sdXRlLn0KLUBjIEZJWE1FISAgQWN0dWFsbHksIHN1YnRyYWN0aW9uIGRvZXNuJ3QgY2hlY2sgZm9yIHRoaXMuCi0KLUBpdGVtCi1AY29kZXsmfSAoYml0d2lzZSBhbmQpLiAgQGVtcGh7Qm90aCBhcmd1bWVudHMgbXVzdCBiZSBhYnNvbHV0ZS59Ci0KLUBpdGVtCi1AYyBGSVhNRSEgIEkgYWdyZWUgfiBpcyBhIGJldHRlciBub3RhdGlvbiB0aGFuIF4gZm9yIHhvciwgYnV0IGlzIHRoZQotQGMgICAgICAgICBpbXByb3ZlbWVudCB3b3J0aCBkaWZmZXJpbmcgZnJvbSBDPwotQGNvZGV7fH0gKGJpdHdpc2Ugb3IpIGFuZCBAY29kZXt+fSAoYml0d2lzZSBleGNsdXNpdmUgb3I7IEBjb2Rle159IGluCi1DKS4gIEBlbXBoe0JvdGggYXJndW1lbnRzIG11c3QgYmUgYWJzb2x1dGUufQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgU3RyaW5nIEJ1aWx0aW5zCi1Ac3Vic2VjdGlvbiBTdHJpbmcgcHJpbWl0aXZlcwotCi1Zb3UgY2FuIHVzZSB0aGVzZSBwcmltaXRpdmVzIHRvIG1hbmlwdWxhdGUgc3RyaW5ncyAoaW4gdGhlIGFyZ3VtZW50Ci1maWVsZCBvZiBAc2N7Z2FzcH0gc3RhdGVtZW50cyk6Ci0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5MRU4oIkB2YXJ7c3RyfSIpCi1DYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBzdHJpbmcgQGNvZGV7IkB2YXJ7c3RyfSJ9LCBhcyBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlLCBAc2FtcHsuUkVTLkIgLkxFTigic2FtcGxlIil9IHJlc2VydmVzIHNpeAotYnl0ZXMgb2YgbWVtb3J5LgotCi1AaXRlbSAuSU5TVFIoIkB2YXJ7c3RyaW5nfSIsICJAdmFye3NlZ30iLCBAdmFye2l4fSkKLVNlYXJjaCBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQHZhcntzZWd9IGFmdGVyIHBvc2l0aW9uIEB2YXJ7aXh9IG9mCi1AdmFye3N0cmluZ30uICBGb3IgZXhhbXBsZSwgQHNhbXB7LklOU1RSKCJBQkNERUZHIiwgIkNERSIsIDApfSBldmFsdWF0ZXMKLXRvIHRoZSBhYnNvbHV0ZSByZXN1bHQgQGNvZGV7Mn0uCi0KLVRoZSByZXN1bHQgaXMgQGNvZGV7LTF9IGlmIEB2YXJ7c2VnfSBkb2VzIG5vdCBvY2N1ciBpbiBAdmFye3N0cmluZ30KLWFmdGVyIHBvc2l0aW9uIEB2YXJ7aXh9LgotCi1AaXRlbSAuU1VCU1RSKCJAdmFye3N0cmluZ30iLEB2YXJ7c3RhcnR9LEB2YXJ7bGVufSkKLVRoZSBzdWJzdHJpbmcgb2YgQHZhcntzdHJpbmd9IGJlZ2lubmluZyBhdCBieXRlIG51bWJlciBAdmFye3N0YXJ0fSBhbmQKLWV4dGVuZGluZyBmb3IgQHZhcntsZW59IGJ5dGVzLgotQGVuZCBmdGFibGUKLQotQG5vZGUgQWx0ZXJuYXRlCi1Ac2VjdGlvbiBBbHRlcm5hdGUgbWFjcm8gc3ludGF4Ci0KLUlmIHlvdSBzcGVjaWZ5IEBzYW1wey1hfSBvciBAc2FtcHstLWFsdGVybmF0ZX0gb24gdGhlIEBzY3tnYXNwfSBjb21tYW5kCi1saW5lLCB0aGUgcHJlcHJvY2Vzc29yIHVzZXMgc29tZXdoYXQgZGlmZmVyZW50IHN5bnRheC4gIFRoaXMgc3ludGF4IGlzCi1yZW1pbmlzY2VudCBvZiB0aGUgc3ludGF4IG9mIFBoYXIgTGFwIG1hY3JvIGFzc2VtYmxlciwgYnV0IGl0Ci1pcyBAZW1waHtub3R9IG1lYW50IHRvIGJlIGEgZnVsbCBlbXVsYXRpb24gb2YgUGhhciBMYXAgb3Igc2ltaWxhcgotYXNzZW1ibGVycy4gIEluIHBhcnRpY3VsYXIsIEBzY3tnYXNwfSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdGl2ZXMgc3VjaAotYXMgQGNvZGV7REJ9IGFuZCBAY29kZXtJUlB9LCBldmVuIGluIGFsdGVybmF0ZSBzeW50YXggbW9kZS4KLQotSW4gcGFydGljdWxhciwgQHNhbXB7LWF9IChvciBAc2FtcHstLWFsdGVybmF0ZX0pIGVsaWNpdHMgdGhlc2UKLWRpZmZlcmVuY2VzOgotCi1AdGFibGUgQGVtcGgKLUBpdGVtIFByZXByb2Nlc3NvciBkaXJlY3RpdmVzCi1Zb3UgY2FuIHVzZSBAc2N7Z2FzcH0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgd2l0aG91dCBhIGxlYWRpbmcgQHNhbXB7Ln0KLWRvdC4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHdyaXRlIEBzYW1we1NEQVRBfSB3aXRoIHRoZSBzYW1lIGVmZmVjdCBhcwotQHNhbXB7LlNEQVRBfS4KLQotQGl0ZW0gTE9DQUwKLU9uZSBhZGRpdGlvbmFsIGRpcmVjdGl2ZSwgQGNvZGV7TE9DQUx9LCBpcyBhdmFpbGFibGUuICBAeHJlZntNYWNyb3MsLAotRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30sIGZvciBhbiBleHBsYW5hdGlvbiBvZiBob3cgdG8gdXNlCi1AY29kZXtMT0NBTH0uCi0KLUBuZWVkIDIwMDAKLUBpdGVtIFN0cmluZyBkZWxpbWl0ZXJzCi1Zb3UgY2FuIHdyaXRlIHN0cmluZ3MgZGVsaW1pdGVkIGluIHRoZXNlIG90aGVyIHdheXMgYmVzaWRlcwotQGNvZGV7IkB2YXJ7c3RyaW5nfSJ9OgotCi1AdGFibGUgQGNvZGUKLUBpdGVtICdAdmFye3N0cmluZ30nCi1Zb3UgY2FuIGRlbGltaXQgc3RyaW5ncyB3aXRoIHNpbmdsZS1xdW90ZSBjaGFyYXRlcnMuCi0KLUBpdGVtIDxAdmFye3N0cmluZ30+Ci1Zb3UgY2FuIGRlbGltaXQgc3RyaW5ncyB3aXRoIG1hdGNoaW5nIGFuZ2xlIGJyYWNrZXRzLgotQGVuZCB0YWJsZQotCi1AaXRlbSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyBlc2NhcGUKLVRvIGluY2x1ZGUgYW55IHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbGx5IGluIGEgc3RyaW5nIChldmVuIGlmIHRoZQotY2hhcmFjdGVyIHdvdWxkIG90aGVyd2lzZSBoYXZlIHNvbWUgc3BlY2lhbCBtZWFuaW5nKSwgeW91IGNhbiBwcmVmaXggdGhlCi1jaGFyYWN0ZXIgd2l0aCBAc2FtcHshfSAoYW4gZXhjbGFtYXRpb24gbWFyaykuICBGb3IgZXhhbXBsZSwgeW91IGNhbgotd3JpdGUgQHNhbXB7PDQuMyAhPiA1LjQhIT59IHRvIGdldCB0aGUgbGl0ZXJhbCB0ZXh0IEBzYW1wezQuMyA+IDUuNCF9LgotCi1AaXRlbSBFeHByZXNzaW9uIHJlc3VsdHMgYXMgc3RyaW5ncwotWW91IGNhbiB3cml0ZSBAc2FtcHslQHZhcntleHByfX0gdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gQHZhcntleHByfQotYW5kIHVzZSB0aGUgcmVzdWx0IGFzIGEgc3RyaW5nLiAgCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvaDgudGV4aSBiL2dhcy9kb2MvaDgudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMTcxNC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2g4LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1AY2xlYXIgQUxMLUFSQ0gKLUBjbGVhciBHRU5FUklDCi1AY2xlYXIgSU5URVJOQUxTCi1AY2xlYXIgTVVMVEktT0JKCi1AY2xlYXIgQU9VVAotQGNsZWFyIEJPVVQKLUBzZXQgQ09GRgotQGNsZWFyIEVMRgotQHNldCBIaXRhY2hpLWFsbAotQHNldCBIOC8zMDAKLUBzZXQgSDgvNTAwCi1Ac2V0IFNICi1AY2xlYXIgRElGRi1UQkwtS0xVR0UKLUBzZXQgSUVFRUZMT0FUCi1AY2xlYXIgVzMyCi1Ac2V0IFcxNgotQHNldCBTUEVDSUFMLVNZTVMKLUBzZXQgQVMgYXMKLUBzZXQgR0NDIGdjYwotQHNldCBMRCBsZAotQHNldCBUQVJHRVQgSDgvMzAwIGFuZCBIOC81MDAKLUBzZXQgVEFSR0VUIEg4LzMwMCwgSDgvNTAwLCBhbmQgSGl0YWNoaSBTSAotQHNldCBPQkotTkFNRSBDT0ZGCi1AYwotQGNsZWFyIGhhdmUtc3RhYnMKLUBzZXQgYWJub3JtYWwtc2VwYXJhdG9yCmRpZmYgLS1naXQgYS9nYXMvZG9jL2ludGVybmFscy50ZXhpIGIvZ2FzL2RvYy9pbnRlcm5hbHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjOWFjNy4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2ludGVybmFscy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTY5NCArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGludGVybmFscy5pbmZvCi1Abm9kZSBUb3AKLUB0b3AgQXNzZW1ibGVyIEludGVybmFscwotQHJhaXNlc2VjdGlvbnMKLUBjaW5kZXggaW50ZXJuYWxzCi0KLVRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIGludGVybmFscyBvZiB0aGUgYXNzZW1ibGVyLiAgSXQgaXMgaW5jb21wbGV0ZSwgYnV0Ci1pdCBtYXkgaGVscCBhIGJpdC4KLQotVGhpcyBjaGFwdGVyIHdhcyBsYXN0IG1vZGlmaWVkIG9uICREYXRlJC4gIEl0IGlzIG5vdCB1cGRhdGVkIHJlZ3VsYXJseSwgYW5kIGl0Ci1tYXkgYmUgb3V0IG9mIGRhdGUuCi0KLUBtZW51Ci0qIEdBUyB2ZXJzaW9uczo6ICAgICAgICBHQVMgdmVyc2lvbnMKLSogRGF0YSB0eXBlczo6CQlEYXRhIHR5cGVzCi0qIEdBUyBwcm9jZXNzaW5nOjogICAgICBXaGF0IEdBUyBkb2VzIHdoZW4gaXQgcnVucwotKiBQb3J0aW5nIEdBUzo6ICAgICAgICAgUG9ydGluZyBHQVMKLSogUmVsYXhhdGlvbjo6ICAgICAgICAgIFJlbGF4YXRpb24KLSogQnJva2VuIHdvcmRzOjogICAgICAgIEJyb2tlbiB3b3JkcwotKiBJbnRlcm5hbCBmdW5jdGlvbnM6OiAgSW50ZXJuYWwgZnVuY3Rpb25zCi0qIFRlc3Qgc3VpdGU6OiAgICAgICAgICBUZXN0IHN1aXRlCi1AZW5kIG1lbnUKLQotQG5vZGUgR0FTIHZlcnNpb25zCi1Ac2VjdGlvbiBHQVMgdmVyc2lvbnMKLQotR0FTIGhhcyBhY3F1aXJlZCBsYXllcnMgb2YgY29kZSBvdmVyIHRpbWUuICBUaGUgb3JpZ2luYWwgR0FTIG9ubHkgc3VwcG9ydGVkIHRoZQotYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LCB3aXRoIHRocmVlIHNlY3Rpb25zLiAgU3VwcG9ydCBmb3IgbXVsdGlwbGUgc2VjdGlvbnMKLWhhcyBiZWVuIGFkZGVkIGluIHR3byBkaWZmZXJlbnQgd2F5cy4KLQotVGhlIHByZWZlcnJlZCBhcHByb2FjaCBpcyB0byB1c2UgdGhlIHZlcnNpb24gb2YgR0FTIGNyZWF0ZWQgd2hlbiB0aGUgc3ltYm9sCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkLiAgVGhlIG90aGVyIHZlcnNpb25zIG9mIEdBUyBhcmUgZG9jdW1lbnRlZCBmb3IKLWhpc3RvcmljYWwgcHVycG9zZXMsIGFuZCB0byBoZWxwIGFueWJvZHkgd2hvIGhhcyB0byBkZWJ1ZyBjb2RlIHdyaXR0ZW4gZm9yCi10aGVtLgotCi1UaGUgdHlwZSBAY29kZXtzZWdUfSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHNlY3Rpb24gaW4gY29kZSB3aGljaCBtdXN0IHdvcmsKLXdpdGggYWxsIHZlcnNpb25zIG9mIEdBUy4KLQotQG1lbnUKLSogT3JpZ2luYWwgR0FTOjogICAgICAgIE9yaWdpbmFsIEdBUyB2ZXJzaW9uCi0qIE1BTllfU0VHTUVOVFM6OiAgICAgICBNQU5ZX1NFR01FTlRTIGdhcyB2ZXJzaW9uCi0qIEJGRF9BU1NFTUJMRVI6OiAgICAgICBCRkRfQVNTRU1CTEVSIGdhcyB2ZXJzaW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgT3JpZ2luYWwgR0FTCi1Ac3Vic2VjdGlvbiBPcmlnaW5hbCBHQVMKLQotVGhlIG9yaWdpbmFsIEdBUyBvbmx5IHN1cHBvcnRlZCB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHdpdGggdGhyZWUKLXNlY3Rpb25zOiBAc2FtcHsudGV4dH0sIEBzYW1wey5kYXRhfSwgYW5kIEBzYW1wey5ic3N9LiAgVGhpcyBpcyB0aGUgdmVyc2lvbiBvZgotR0FTIHRoYXQgaXMgY29tcGlsZWQgaWYgbmVpdGhlciBAY29kZXtCRkRfQVNTRU1CTEVSfSBub3IgQGNvZGV7TUFOWV9TRUdNRU5UU30KLWlzIGRlZmluZWQuICBUaGlzIHZlcnNpb24gb2YgR0FTIGlzIHN0aWxsIHVzZWQgZm9yIHRoZSBtNjhrLWFvdXQgdGFyZ2V0LCBhbmQKLXBlcmhhcHMgb3RoZXJzLgotCi1UaGlzIHZlcnNpb24gb2YgR0FTIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYW55IG5ldyBkZXZlbG9wbWVudC4KLQotVGhlcmUgaXMgc3RpbGwgY29kZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoaXMgdmVyc2lvbiBvZiBHQVMsIG5vdGFibHkgaW4KLUBmaWxle3dyaXRlLmN9LiAgVGhlcmUgaXMgbm8gd2F5IGZvciB0aGlzIGNvZGUgdG8gbG9vcCB0aHJvdWdoIGFsbCB0aGUKLXNlY3Rpb25zOyBpdCBzaW1wbHkgbG9va3MgYXQgZ2xvYmFsIHZhcmlhYmxlcyBsaWtlIEBjb2Rle3RleHRfZnJhZ19yb290fSBhbmQKLUBjb2Rle2RhdGFfZnJhZ19yb290fS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgYW4gZW51bS4KLQotQG5vZGUgTUFOWV9TRUdNRU5UUwotQHN1YnNlY3Rpb24gTUFOWV9TRUdNRU5UUyBnYXMgdmVyc2lvbgotQGNpbmRleCBNQU5ZX1NFR01FTlRTCi0KLVRoZSBAY29kZXtNQU5ZX1NFR01FTlRTfSB2ZXJzaW9uIG9mIGdhcyBpcyBvbmx5IHVzZWQgZm9yIENPRkYuICBJdCB1c2VzIHRoZSBCRkQKLWxpYnJhcnksIGJ1dCBpdCB3cml0ZXMgb3V0IGFsbCB0aGUgZGF0YSBpdHNlbGYgdXNpbmcgQGNvZGV7YmZkX3dyaXRlfS4gIFRoaXMKLXZlcnNpb24gb2YgZ2FzIHN1cHBvcnRzIHVwIHRvIDQwIG5vcm1hbCBzZWN0aW9ucy4gIFRoZSBzZWN0aW9uIG5hbWVzIGFyZSBzdG9yZWQKLWluIHRoZSBAY29kZXtzZWdfbmFtZX0gYXJyYXkuICBPdGhlciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlCi1AY29kZXtzZWdtZW50X2luZm99IGFycmF5LgotCi1UaGUgdHlwZSBAY29kZXtzZWdUfSBpcyBhbiBlbnVtLiAgQ29kZSB0aGF0IHdhbnRzIHRvIGV4YW1pbmUgYWxsIHRoZSBzZWN0aW9ucwotY2FuIHVzZSBhIEBjb2Rle3NlZ1R9IHZhcmlhYmxlIGFzIGxvb3AgaW5kZXggZnJvbSBAY29kZXtTRUdfRTB9IHVwIHRvIGJ1dCBub3QKLWluY2x1ZGluZyBAY29kZXtTRUdfVU5LTk9XTn0uCi0KLU1vc3Qgb2YgdGhlIGNvZGUgc3BlY2lmaWMgdG8gdGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBpbiB0aGUgZmlsZQotQGZpbGV7Y29uZmlnL29iai1jb2ZmLmN9LCBpbiB0aGUgcG9ydGlvbiBvZiB0aGF0IGZpbGUgdGhhdCBpcyBjb21waWxlZCB3aGVuCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4KLQotVGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBzdGlsbCB1c2VkIGZvciBzZXZlcmFsIENPRkYgdGFyZ2V0cy4KLQotQG5vZGUgQkZEX0FTU0VNQkxFUgotQHN1YnNlY3Rpb24gQkZEX0FTU0VNQkxFUiBnYXMgdmVyc2lvbgotQGNpbmRleCBCRkRfQVNTRU1CTEVSCi0KLVRoZSBwcmVmZXJyZWQgdmVyc2lvbiBvZiBHQVMgaXMgdGhlIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IHZlcnNpb24uICBJbiB0aGlzCi12ZXJzaW9uIG9mIEdBUywgdGhlIG91dHB1dCBmaWxlIGlzIGEgbm9ybWFsIEJGRCwgYW5kIHRoZSBCRkQgcm91dGluZXMgYXJlIHVzZWQKLXRvIGdlbmVyYXRlIHRoZSBvdXRwdXQuCi0KLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IHdpbGwgYXV0b21hdGljYWxseSBiZSB1c2VkIGZvciBjZXJ0YWluIHRhcmdldHMsIGluY2x1ZGluZwotdGhvc2UgdGhhdCB1c2UgdGhlIEVMRiwgRUNPRkYsIGFuZCBTT00gb2JqZWN0IGZpbGUgZm9ybWF0cywgYW5kIGFsc28gYWxsIEFscGhhLAotTUlQUywgUG93ZXJQQywgYW5kIFNQQVJDIHRhcmdldHMuICBZb3UgY2FuIGZvcmNlIHRoZSB1c2Ugb2YKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IGZvciBvdGhlciB0YXJnZXRzIHdpdGggdGhlIGNvbmZpZ3VyZSBvcHRpb24KLUBzYW1wey0tZW5hYmxlLWJmZC1hc3NlbWJsZXJ9OyBob3dldmVyLCBpdCBoYXMgbm90IGJlZW4gdGVzdGVkIGZvciBtYW55Ci10YXJnZXRzLCBhbmQgY2FuIG5vdCBiZSBhc3N1bWVkIHRvIHdvcmsuCi0KLUBub2RlIERhdGEgdHlwZXMKLUBzZWN0aW9uIERhdGEgdHlwZXMKLUBjaW5kZXggaW50ZXJuYWxzLCBkYXRhIHR5cGVzCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBmdW5kYW1lbnRhbCBHQVMgZGF0YSB0eXBlcy4KLQotQG1lbnUKLSogU3ltYm9sczo6ICAgICAgICAgICAgIFRoZSBzeW1ib2xTIHN0cnVjdHVyZQotKiBFeHByZXNzaW9uczo6ICAgICAgICAgVGhlIGV4cHJlc3Npb25TIHN0cnVjdHVyZQotKiBGaXh1cHM6OgkJVGhlIGZpeFMgc3RydWN0dXJlCi0qIEZyYWdzOjogICAgICAgICAgICAgICBUaGUgZnJhZ1Mgc3RydWN0dXJlCi1AZW5kIG1lbnUKLQotQG5vZGUgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9scwotQGNpbmRleCBpbnRlcm5hbHMsIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgaW50ZXJuYWwKLUBjaW5kZXggc3ltYm9sUyBzdHJ1Y3R1cmUKLQotVGhlIGRlZmluaXRpb24gZm9yIHRoZSBzeW1ib2wgc3RydWN0dXJlLCBAY29kZXtzeW1ib2xTfSwgaXMgbG9jYXRlZCBpbgotQGZpbGV7c3RydWMtc3ltYm9sLmh9LgotCi1JbiBnZW5lcmFsLCB0aGUgZmllbGRzIG9mIHRoaXMgc3RydWN0dXJlIG1heSBub3QgYmUgcmVmZXJyZWQgdG8gZGlyZWN0bHkuCi1JbnN0ZWFkLCB5b3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgZGVmaW5lZCBpbiBAZmlsZXtzeW1ib2wuaH0uCi1UaGVzZSBhY2Nlc3NvciBmdW5jdGlvbnMgc2hvdWxkIHdvcmsgZm9yIGFueSBHQVMgdmVyc2lvbi4KLQotU3ltYm9sIHN0cnVjdHVyZXMgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzeV92YWx1ZQotVGhpcyBpcyBhbiBAY29kZXtleHByZXNzaW9uU30gdGhhdCBkZXNjcmliZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJdCBtaWdodAotcmVmZXIgdG8gb25lIG9yIG1vcmUgb3RoZXIgc3ltYm9sczsgaWYgc28sIGl0cyB0cnVlIHZhbHVlIG1heSBub3QgYmUga25vd24KLXVudGlsIEBjb2Rle3Jlc29sdmVfc3ltYm9sX3ZhbHVlfSBpcyBjYWxsZWQgaW4gQGNvZGV7d3JpdGVfb2JqZWN0X2ZpbGV9LgotCi1UaGUgZXhwcmVzc2lvbiBpcyBvZnRlbiBzaW1wbHkgYSBjb25zdGFudC4gIEJlZm9yZSBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0KLWlzIGNhbGxlZCwgdGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkuICBBZnRlcndhcmQsCi10aGUgZnJhZyBhZGRyZXNzIGhhcyBiZWVuIGFkZGVkIGluLgotCi1AaXRlbSBzeV9yZXNvbHZlZAotVGhpcyBmaWVsZCBpcyBub24temVybyBpZiB0aGUgc3ltYm9sJ3MgdmFsdWUgaGFzIGJlZW4gY29tcGxldGVseSByZXNvbHZlZC4gIEl0Ci1pcyB1c2VkIGR1cmluZyB0aGUgZmluYWwgcGFzcyBvdmVyIHRoZSBzeW1ib2wgdGFibGUuCi0KLUBpdGVtIHN5X3Jlc29sdmluZwotVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRldGVjdCBsb29wcyB3aGlsZSByZXNvbHZpbmcgdGhlIHN5bWJvbCdzIHZhbHVlLgotCi1AaXRlbSBzeV91c2VkX2luX3JlbG9jCi1UaGlzIGZpZWxkIGlzIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jYXRpb24gZW50cnkuICBJZiBhIGxvY2FsCi1zeW1ib2wgaXMgdXNlZCBpbiBhIHJlbG9jYXRpb24gZW50cnksIGl0IG11c3QgYmUgcG9zc2libGUgdG8gcmVkaXJlY3QgdGhvc2UKLXJlbG9jYXRpb25zIHRvIG90aGVyIHN5bWJvbHMsIG9yIHRoaXMgc3ltYm9sIGNhbm5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGZpbmFsCi1zeW1ib2wgbGlzdC4KLQotQGl0ZW0gc3lfbmV4dAotQGl0ZW14IHN5X3ByZXZpb3VzCi1UaGVzZSBwb2ludGVycyB0byBvdGhlciBAY29kZXtzeW1ib2xTfSBzdHJ1Y3R1cmVzIGRlc2NyaWJlIGEgc2luZ2x5IG9yIGRvdWJseQotbGlua2VkIGxpc3QuICAoSWYgQGNvZGV7U1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSU30gaXMgbm90IGRlZmluZWQsIHRoZQotQGNvZGV7c3lfcHJldmlvdXN9IGZpZWxkIHdpbGwgYmUgb21pdHRlZDsgQGNvZGV7U1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSU30gaXMKLWFsd2F5cyBkZWZpbmVkIGlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9LikgIFRoZXNlIGZpZWxkcyBzaG91bGQgYmUgYWNjZXNzZWQgd2l0aAotdGhlIEBjb2Rle3N5bWJvbF9uZXh0fSBhbmQgQGNvZGV7c3ltYm9sX3ByZXZpb3VzfSBtYWNyb3MuCi0KLUBpdGVtIHN5X2ZyYWcKLVRoaXMgcG9pbnRzIHRvIHRoZSBmcmFnIChAcHhyZWZ7RnJhZ3N9KSB0aGF0IHRoaXMgc3ltYm9sIGlzIGF0dGFjaGVkIHRvLgotCi1AaXRlbSBzeV91c2VkCi1XaGV0aGVyIHRoZSBzeW1ib2wgaXMgdXNlZCBhcyBhbiBvcGVyYW5kIG9yIGluIGFuIGV4cHJlc3Npb24uICBOb3RlOiBOb3QgYWxsIG9mCi10aGUgYmFja2VuZHMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGFjY3VyYXRlOyBiYWNrZW5kcyB3aGljaCB1c2UgdGhpcyBiaXQgYXJlCi1yZXNwb25zaWJsZSBmb3Igc2V0dGluZyBpdCB3aGVuIGEgc3ltYm9sIGlzIHVzZWQgaW4gYmFja2VuZCByb3V0aW5lcy4KLQotQGl0ZW0gc3lfbXJpX2NvbW1vbgotV2hldGhlciB0aGUgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sIGNyZWF0ZWQgYnkgdGhlIEBjb2Rle0NPTU1PTn0KLXBzZXVkby1vcCB3aGVuIGFzc2VtYmxpbmcgaW4gTVJJIG1vZGUuCi0KLUBpdGVtIGJzeW0KLUlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQsIHRoaXMgcG9pbnRzIHRvIHRoZSBCRkQgQGNvZGV7YXN5bWJvbH0gdGhhdAotd2lsbCBiZSB1c2VkIGluIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLgotCi1AaXRlbSBzeV9uYW1lX29mZnNldAotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIHRoZSBwb3NpdGlvbiBvZgotdGhlIHN5bWJvbCdzIG5hbWUgaW4gdGhlIHN0cmluZyB0YWJsZSBvZiB0aGUgb2JqZWN0IGZpbGUuICBPbiBzb21lIGZvcm1hdHMsCi10aGlzIHdpbGwgc3RhcnQgYXQgcG9zaXRpb24gNCwgd2l0aCBwb3NpdGlvbiAwIHJlc2VydmVkIGZvciB1bm5hbWVkIHN5bWJvbHMuCi1UaGlzIGZpZWxkIGlzIG5vdCB1c2VkIHVudGlsIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfSBpcyBjYWxsZWQuCi0KLUBpdGVtIHN5X3N5bWJvbAotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIHRoZQotZm9ybWF0LXNwZWNpZmljIHN5bWJvbCBzdHJ1Y3R1cmUsIGFzIGl0IHdvdWxkIGJlIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuCi0KLUBpdGVtIHN5X251bWJlcgotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIGEgMjQtYml0IHN5bWJvbAotbnVtYmVyLCBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyByZWxvY2F0aW9uIHRhYmxlIGVudHJpZXMuCi0KLUBpdGVtIHN5X29iagotVGhpcyBmb3JtYXQtc3BlY2lmaWMgZGF0YSBpcyBvZiB0eXBlIEBjb2Rle09CSl9TWU1GSUVMRF9UWVBFfS4gIElmIG5vIG1hY3JvIGJ5Ci10aGF0IG5hbWUgaXMgZGVmaW5lZCBpbiBAZmlsZXtvYmotZm9ybWF0Lmh9LCB0aGlzIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCi1AaXRlbSBzeV90YwotVGhpcyBwcm9jZXNzb3Itc3BlY2lmaWMgZGF0YSBpcyBvZiB0eXBlIEBjb2Rle1RDX1NZTUZJRUxEX1RZUEV9LiAgSWYgbm8gbWFjcm8KLWJ5IHRoYXQgbmFtZSBpcyBkZWZpbmVkIGluIEBmaWxle3RhcmctY3B1Lmh9LCB0aGlzIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCi1AZW5kIHRhYmxlCi0KLUhlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zLiAgVGhlc2Ugc2hvdWxkIGJlIHVzZWQgcmF0aGVyCi10aGFuIHJlZmVycmluZyB0byB0aGUgZmllbGRzIG9mIEBjb2Rle3N5bWJvbFN9IGRpcmVjdGx5LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFNfU0VUX1ZBTFVFCi1AY2luZGV4IFNfU0VUX1ZBTFVFCi1TZXQgdGhlIHN5bWJvbCdzIHZhbHVlLgotCi1AaXRlbSBTX0dFVF9WQUxVRQotQGNpbmRleCBTX0dFVF9WQUxVRQotR2V0IHRoZSBzeW1ib2wncyB2YWx1ZS4gIFRoaXMgd2lsbCBjYXVzZSBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0gdG8gYmUKLWNhbGxlZCBpZiBuZWNlc3NhcnksIHNvIEBjb2Rle1NfR0VUX1ZBTFVFfSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBpdCBpcwotc2FmZSB0byByZXNvbHZlIHN5bWJvbHMgKGkuZS4sIGFmdGVyIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBoYXMgYmVlbiByZWFkIGFuZAotYWxsIHN5bWJvbHMgaGF2ZSBiZWVuIGRlZmluZWQpLgotCi1AaXRlbSBTX1NFVF9TRUdNRU5UCi1AY2luZGV4IFNfU0VUX1NFR01FTlQKLVNldCB0aGUgc2VjdGlvbiBvZiB0aGUgc3ltYm9sLgotCi1AaXRlbSBTX0dFVF9TRUdNRU5UCi1AY2luZGV4IFNfR0VUX1NFR01FTlQKLUdldCB0aGUgc3ltYm9sJ3Mgc2VjdGlvbi4KLQotQGl0ZW0gU19HRVRfTkFNRQotQGNpbmRleCBTX0dFVF9OQU1FCi1HZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19TRVRfTkFNRQotQGNpbmRleCBTX1NFVF9OQU1FCi1TZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19JU19FWFRFUk5BTAotQGNpbmRleCBTX0lTX0VYVEVSTkFMCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfSVNfRVhURVJOCi1AY2luZGV4IFNfSVNfRVhURVJOCi1BIHN5bm9ueW0gZm9yIEBjb2Rle1NfSVNfRVhURVJOQUx9LiAgRG9uJ3QgdXNlIGl0LgotCi1AaXRlbSBTX0lTX1dFQUsKLUBjaW5kZXggU19JU19XRUFLCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIHN5bWJvbCBpcyB3ZWFrLgotCi1AaXRlbSBTX0lTX0NPTU1PTgotQGNpbmRleCBTX0lTX0NPTU1PTgotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgQ29tbW9uIHN5bWJvbHMgYXJlIHNvbWV0aW1lcwotcmVwcmVzZW50ZWQgYXMgdW5kZWZpbmVkIHN5bWJvbHMgd2l0aCBhIHZhbHVlLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbAotbm90IGJlIHJlbGlhYmxlLgotCi1AaXRlbSBTX0lTX0RFRklORUQKLUBjaW5kZXggU19JU19ERUZJTkVECi1SZXR1cm4gbm9uLXplcm8gaWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGlhYmxlIHdoZW4KLWNhbGxlZCBvbiBhIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIFNfSVNfREVCVUcKLUBjaW5kZXggU19JU19ERUJVRwotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLgotCi1AaXRlbSBTX0lTX0xPQ0FMCi1AY2luZGV4IFNfSVNfTE9DQUwKLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgbG9jYWwgYXNzZW1ibGVyIHN5bWJvbCB3aGljaCBzaG91bGQgbm90IGJlCi1pbmNsdWRlZCBpbiB0aGUgZmluYWwgc3ltYm9sIHRhYmxlLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBvcHBvc2l0ZSBvZgotQGNvZGV7U19JU19FWFRFUk5BTH0uICBUaGUgQHNhbXB7LUx9IGFzc2VtYmxlciBvcHRpb24gYWZmZWN0cyB0aGUgcmV0dXJuIHZhbHVlCi1vZiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBTX1NFVF9FWFRFUk5BTAotQGNpbmRleCBTX1NFVF9FWFRFUk5BTAotTWFyayB0aGUgc3ltYm9sIGFzIGV4dGVybmFsbHkgdmlzaWJsZS4KLQotQGl0ZW0gU19DTEVBUl9FWFRFUk5BTAotQGNpbmRleCBTX0NMRUFSX0VYVEVSTkFMCi1NYXJrIHRoZSBzeW1ib2wgYXMgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4KLQotQGl0ZW0gU19TRVRfV0VBSwotQGNpbmRleCBTX1NFVF9XRUFLCi1NYXJrIHRoZSBzeW1ib2wgYXMgd2Vhay4KLQotQGl0ZW0gU19HRVRfVFlQRQotQGl0ZW0gU19HRVRfREVTQwotQGl0ZW0gU19HRVRfT1RIRVIKLUBjaW5kZXggU19HRVRfVFlQRQotQGNpbmRleCBTX0dFVF9ERVNDCi1AY2luZGV4IFNfR0VUX09USEVSCi1HZXQgdGhlIEBjb2Rle3R5cGV9LCBAY29kZXtkZXNjfSwgYW5kIEBjb2Rle290aGVyfSBmaWVsZHMgb2YgdGhlIHN5bWJvbC4gIFRoZXNlCi1hcmUgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvciB3aGljaCB0aGV5IG1ha2Ugc2Vuc2UgKHByaW1hcmlseQotYS5vdXQpLgotCi1AaXRlbSBTX1NFVF9UWVBFCi1AaXRlbSBTX1NFVF9ERVNDCi1AaXRlbSBTX1NFVF9PVEhFUgotQGNpbmRleCBTX1NFVF9UWVBFCi1AY2luZGV4IFNfU0VUX0RFU0MKLUBjaW5kZXggU19TRVRfT1RIRVIKLVNldCB0aGUgQGNvZGV7dHlwZX0sIEBjb2Rle2Rlc2N9LCBhbmQgQGNvZGV7b3RoZXJ9IGZpZWxkcyBvZiB0aGUgc3ltYm9sLiAgVGhlc2UKLWFyZSBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yIHdoaWNoIHRoZXkgbWFrZSBzZW5zZSAocHJpbWFyaWx5Ci1hLm91dCkuCi0KLUBpdGVtIFNfR0VUX1NJWkUKLUBjaW5kZXggU19HRVRfU0laRQotR2V0IHRoZSBzaXplIG9mIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yCi13aGljaCBpdCBtYWtlcyBzZW5zZSAocHJpbWFyaWx5IEVMRikuCi0KLUBpdGVtIFNfU0VUX1NJWkUKLUBjaW5kZXggU19TRVRfU0laRQotU2V0IHRoZSBzaXplIG9mIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yCi13aGljaCBpdCBtYWtlcyBzZW5zZSAocHJpbWFyaWx5IEVMRikuCi0KLUBpdGVtIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbgotQGNpbmRleCBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24KLUdldCBhIHBvaW50ZXIgdG8gYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSB3aGljaCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZgotdGhlIHN5bWJvbCBhcyBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24KLUBjaW5kZXggc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uCi1TZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIHRvIGFuIGV4cHJlc3Npb24uCi0KLUBpdGVtIHN5bWJvbF9zZXRfZnJhZwotQGNpbmRleCBzeW1ib2xfc2V0X2ZyYWcKLVNldCB0aGUgZnJhZyB3aGVyZSBhIHN5bWJvbCBpcyBkZWZpbmVkLgotCi1AaXRlbSBzeW1ib2xfZ2V0X2ZyYWcKLUBjaW5kZXggc3ltYm9sX2dldF9mcmFnCi1HZXQgdGhlIGZyYWcgd2hlcmUgYSBzeW1ib2wgaXMgZGVmaW5lZC4KLQotQGl0ZW0gc3ltYm9sX21hcmtfdXNlZAotQGNpbmRleCBzeW1ib2xfbWFya191c2VkCi1NYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQotQGl0ZW0gc3ltYm9sX2NsZWFyX3VzZWQKLUBjaW5kZXggc3ltYm9sX2NsZWFyX3VzZWQKLUNsZWFyIHRoZSBtYXJrIGluZGljYXRpbmcgdGhhdCBhIHN5bWJvbCB3YXMgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfdXNlZF9wCi1AY2luZGV4IHN5bWJvbF91c2VkX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIHdhcyB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBpdGVtIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MKLUBjaW5kZXggc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYwotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB1c2VkIGJ5IGEgcmVsb2NhdGlvbi4KLQotQGl0ZW0gc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MKLUBjaW5kZXggc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MKLUNsZWFyIHRoZSBtYXJrIGluZGljYXRpbmcgdGhhdCBhIHN5bWJvbCB3YXMgdXNlZCBpbiBhIHJlbG9jYXRpb24uCi0KLUBpdGVtIHN5bWJvbF91c2VkX2luX3JlbG9jX3AKLUBjaW5kZXggc3ltYm9sX3VzZWRfaW5fcmVsb2NfcAotUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgd2FzIHVzZWQgaW4gYSByZWxvY2F0aW9uLgotCi1AaXRlbSBzeW1ib2xfbWFya19tcmlfY29tbW9uCi1AY2luZGV4IHN5bWJvbF9tYXJrX21yaV9jb21tb24KLU1hcmsgYSBzeW1ib2wgYXMgYW4gTVJJIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9jbGVhcl9tcmlfY29tbW9uCi1AY2luZGV4IHN5bWJvbF9jbGVhcl9tcmlfY29tbW9uCi1DbGVhciB0aGUgbWFyayBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgaXMgYW4gTVJJIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9tcmlfY29tbW9uX3AKLUBjaW5kZXggc3ltYm9sX21yaV9jb21tb25fcAotUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaXMgYW4gTVJJIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9tYXJrX3dyaXR0ZW4KLUBjaW5kZXggc3ltYm9sX21hcmtfd3JpdHRlbgotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB3cml0dGVuLgotCi1AaXRlbSBzeW1ib2xfY2xlYXJfd3JpdHRlbgotQGNpbmRleCBzeW1ib2xfY2xlYXJfd3JpdHRlbgotQ2xlYXIgdGhlIG1hcmsgaW5kaWNhdGluZyB0aGF0IGEgc3ltYm9sIHdhcyB3cml0dGVuLgotCi1AaXRlbSBzeW1ib2xfd3JpdHRlbl9wCi1AY2luZGV4IHN5bWJvbF93cml0dGVuX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIHdhcyB3cml0dGVuLgotCi1AaXRlbSBzeW1ib2xfbWFya19yZXNvbHZlZAotQGNpbmRleCBzeW1ib2xfbWFya19yZXNvbHZlZAotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiByZXNvbHZlZC4KLQotQGl0ZW0gc3ltYm9sX3Jlc29sdmVkX3AKLUBjaW5kZXggc3ltYm9sX3Jlc29sdmVkX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHJlc29sdmVkLgotCi1AaXRlbSBzeW1ib2xfc2VjdGlvbl9wCi1AY2luZGV4IHN5bWJvbF9zZWN0aW9uX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9lcXVhdGVkX3AKLUBjaW5kZXggc3ltYm9sX2VxdWF0ZWRfcAotUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaXMgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbC4KLQotQGl0ZW0gc3ltYm9sX2NvbnN0YW50X3AKLUBjaW5kZXggc3ltYm9sX2NvbnN0YW50X3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBhIGNvbnN0YW50IHZhbHVlLCBpbmNsdWRpbmcgYmVpbmcgYW4gb2Zmc2V0IHdpdGhpbgotc29tZSBmcmFnLgotCi1AaXRlbSBzeW1ib2xfZ2V0X2JmZHN5bQotQGNpbmRleCBzeW1ib2xfZ2V0X2JmZHN5bQotUmV0dXJuIHRoZSBCRkQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIHN5bWJvbC4KLQotQGl0ZW0gc3ltYm9sX3NldF9iZmRzeW0KLUBjaW5kZXggc3ltYm9sX3NldF9iZmRzeW0KLVNldCB0aGUgQkZEIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9nZXRfb2JqCi1AY2luZGV4IHN5bWJvbF9nZXRfb2JqCi1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0gZmllbGQgb2YgYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9zZXRfb2JqCi1AY2luZGV4IHN5bWJvbF9zZXRfb2JqCi1TZXQgdGhlIEBjb2Rle09CSl9TWU1GSUVMRF9UWVBFfSBmaWVsZCBvZiBhIHN5bWJvbC4KLQotQGl0ZW0gc3ltYm9sX2dldF90YwotQGNpbmRleCBzeW1ib2xfZ2V0X3RjCi1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfSBmaWVsZCBvZiBhIHN5bWJvbC4KLQotQGl0ZW0gc3ltYm9sX3NldF90YwotQGNpbmRleCBzeW1ib2xfc2V0X3RjCi1TZXQgdGhlIEBjb2Rle1RDX1NZTUZJRUxEX1RZUEV9IGZpZWxkIG9mIGEgc3ltYm9sLgotCi1AZW5kIHRhYmxlCi0KLVdoZW4gQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgZGVmaW5lZCwgR0FTIGF0dGVtcHRzIHRvIHN0b3JlIGxvY2FsCi1zeW1ib2xzLS1zeW1ib2xzIHdoaWNoIHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBmaWxlLS11c2luZyBhCi1kaWZmZXJlbnQgc3RydWN0dXJlLCBAY29kZXtzdHJ1Y3QgbG9jYWxfc3ltYm9sfS4gIFRoaXMgc3RydWN0dXJlIGNhbiBvbmx5Ci1yZXByZXNlbnQgc3ltYm9scyB3aG9zZSB2YWx1ZSBpcyBhbiBvZmZzZXQgd2l0aGluIGEgZnJhZy4KLQotQ29kZSBvdXRzaWRlIG9mIHRoZSBzeW1ib2wgaGFuZGxlciB3aWxsIGFsd2F5cyBkZWFsIHdpdGggQGNvZGV7c3ltYm9sU30KLXN0cnVjdHVyZXMgYW5kIHVzZSB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zLiAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBjb3JyZWN0bHkKLWRlYWwgd2l0aCBsb2NhbCBzeW1ib2xzLiAgQGNvZGV7c3RydWN0IGxvY2FsX3N5bWJvbH0gaXMgbXVjaCBzbWFsbGVyIHRoYW4KLUBjb2Rle3N5bWJvbFN9ICh3aGljaCBhbHNvIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGJmZCBAY29kZXthc3ltYm9sfQotc3RydWN0dXJlKSwgc28gdGhpcyBzYXZlcyBzcGFjZSB3aGVuIGFzc2VtYmxpbmcgbGFyZ2UgZmlsZXMuCi0KLVRoZSBmaXJzdCBmaWVsZCBvZiBAY29kZXtzeW1ib2xTfSBpcyBAY29kZXtic3ltfSwgdGhlIHBvaW50ZXIgdG8gdGhlIEJGRAotc3ltYm9sLiAgVGhlIGZpcnN0IGZpZWxkIG9mIEBjb2Rle3N0cnVjdCBsb2NhbF9zeW1ib2x9IGlzIGEgcG9pbnRlciB3aGljaCBpcwotYWx3YXlzIHNldCB0byBOVUxMLiAgVGhpcyBpcyBob3cgdGhlIHN5bWJvbCBhY2Nlc3NvciBmdW5jdGlvbnMgY2FuIGRpc3Rpbmd1aXNoCi1sb2NhbCBzeW1ib2xzIGZyb20gb3JkaW5hcnkgc3ltYm9scy4gIFRoZSBzeW1ib2wgYWNjZXNzb3IgZnVuY3Rpb25zCi1hdXRvbWF0aWNhbGx5IGNvbnZlcnQgYSBsb2NhbCBzeW1ib2wgaW50byBhbiBvcmRpbmFyeSBzeW1ib2wgd2hlbiBuZWNlc3NhcnkuCi0KLUBub2RlIEV4cHJlc3Npb25zCi1Ac3Vic2VjdGlvbiBFeHByZXNzaW9ucwotQGNpbmRleCBpbnRlcm5hbHMsIGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBpbnRlcm5hbAotQGNpbmRleCBleHByZXNzaW9uUyBzdHJ1Y3R1cmUKLQotRXhwcmVzc2lvbnMgYXJlIHN0b3JlZCBpbiBhbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlLiAgVGhlIHN0cnVjdHVyZSBpcwotZGVmaW5lZCBpbiBAZmlsZXtleHByLmh9LgotCi1AY2luZGV4IGV4cHJlc3Npb24KLVRoZSBtYWNybyBAY29kZXtleHByZXNzaW9ufSB3aWxsIGNyZWF0ZSBhbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlIGJhc2VkCi1vbiB0aGUgdGV4dCBmb3VuZCBhdCB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0uCi0KLUBjaW5kZXggbWFrZV9leHByX3N5bWJvbAotQGNpbmRleCBleHByX3N5bWJvbF93aGVyZQotQSBzaW5nbGUgQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBjYW4gcmVwcmVzZW50IGEgc2luZ2xlIG9wZXJhdGlvbi4KLUNvbXBsZXggZXhwcmVzc2lvbnMgYXJlIGZvcm1lZCBieSBjcmVhdGluZyBAZGZue2V4cHJlc3Npb24gc3ltYm9sc30gYW5kCi1jb21iaW5pbmcgdGhlbSBpbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlcy4gIEFuIGV4cHJlc3Npb24gc3ltYm9sIGlzCi1jcmVhdGVkIGJ5IGNhbGxpbmcgQGNvZGV7bWFrZV9leHByX3N5bWJvbH0uICBBbiBleHByZXNzaW9uIHN5bWJvbCBzaG91bGQKLW5hdHVyYWxseSBuZXZlciBhcHBlYXIgaW4gYSBzeW1ib2wgdGFibGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YKLUBjb2Rle1NfSVNfTE9DQUx9IChAcHhyZWZ7U3ltYm9sc30pIHJlZmxlY3RzIHRoYXQuICBUaGUgZnVuY3Rpb24KLUBjb2Rle2V4cHJfc3ltYm9sX3doZXJlfSByZXR1cm5zIG5vbi16ZXJvIGlmIGEgc3ltYm9sIGlzIGFuIGV4cHJlc3Npb24gc3ltYm9sLAotYW5kIGFsc28gcmV0dXJucyB0aGUgZmlsZSBhbmQgbGluZSBmb3IgdGhlIGV4cHJlc3Npb24gd2hpY2ggY2F1c2VkIGl0IHRvIGJlCi1jcmVhdGVkLgotCi1UaGUgQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBoYXMgdHdvIHN5bWJvbCBmaWVsZHMsIGEgbnVtYmVyIGZpZWxkLCBhbgotb3BlcmF0b3IgZmllbGQsIGFuZCBhIGZpZWxkIGluZGljYXRpbmcgd2hldGhlciB0aGUgbnVtYmVyIGlzIHVuc2lnbmVkLgotCi1UaGUgb3BlcmF0b3IgZmllbGQgaXMgb2YgdHlwZSBAY29kZXtvcGVyYXRvclR9LCBhbmQgZGVzY3JpYmVzIGhvdyB0byBpbnRlcnByZXQKLXRoZSBvdGhlciBmaWVsZHM7IHNlZSB0aGUgZGVmaW5pdGlvbiBpbiBAZmlsZXtleHByLmh9IGZvciB0aGUgcG9zc2liaWxpdGllcy4KLQotQW4gQGNvZGV7b3BlcmF0b3JUfSB2YWx1ZSBvZiBAY29kZXtPX2JpZ30gaW5kaWNhdGVzIGVpdGhlciBhIGZsb2F0aW5nIHBvaW50Ci1udW1iZXIsIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyfSwgb3IKLWFuIGludGVnZXIgdG8gbGFyZ2UgdG8gc3RvcmUgaW4gYW4gQGNvZGV7b2Zmc2V0VH0gdHlwZSwgc3RvcmVkIGluIHRoZSBnbG9iYWwKLWFycmF5IEBjb2Rle2dlbmVyaWNfYmlnbnVtfS4gIFRoaXMgcmF0aGVyIGluZmxleGlibGUgYXBwcm9hY2ggbWFrZXMgaXQKLWltcG9zc2libGUgdG8gdXNlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgb3IgbGFyZ2UgZXhwcmVzc2lvbnMgaW4gY29tcGxleAotZXhwcmVzc2lvbnMuCi0KLUBub2RlIEZpeHVwcwotQHN1YnNlY3Rpb24gRml4dXBzCi1AY2luZGV4IGludGVybmFscywgZml4dXBzCi1AY2luZGV4IGZpeHVwcwotQGNpbmRleCBmaXhTIHN0cnVjdHVyZQotCi1BIEBkZm57Zml4dXB9IGlzIGJhc2ljYWxseSBhbnl0aGluZyB3aGljaCBjYW4gbm90IGJlIHJlc29sdmVkIGluIHRoZSBmaXJzdAotcGFzcy4gIFNvbWV0aW1lcyBhIGZpeHVwIGNhbiBiZSByZXNvbHZlZCBieSB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseTsgaWYgbm90LAotdGhlIGZpeHVwIGJlY29tZXMgYSByZWxvY2F0aW9uIGVudHJ5IGluIHRoZSBvYmplY3QgZmlsZS4KLQotQGNpbmRleCBmaXhfbmV3Ci1AY2luZGV4IGZpeF9uZXdfZXhwCi1BIGZpeHVwIGlzIGNyZWF0ZWQgYnkgYSBjYWxsIHRvIEBjb2Rle2ZpeF9uZXd9IG9yIEBjb2Rle2ZpeF9uZXdfZXhwfS4gIEJvdGgKLXRha2UgYSBmcmFnIChAcHhyZWZ7RnJhZ3N9KSwgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGZyYWcsIGEgc2l6ZSwgYW4gaW5kaWNhdGlvbgotb2Ygd2hldGhlciB0aGUgZml4dXAgaXMgUEMgcmVsYXRpdmUsIGFuZCBhIHR5cGUuICBJbiBhIEBjb2Rle0JGRF9BU1NFTUJMRVJ9Ci1HQVMsIHRoZSB0eXBlIGlzIG5vbWluYWxseSBhIEBjb2Rle2JmZF9yZWxvY19jb2RlX3JlYWxfdHlwZX0sIGJ1dCBzZXZlcmFsCi10YXJnZXRzIHVzZSBvdGhlciB0eXBlIGNvZGVzIHRvIHJlcHJlc2VudCBmaXh1cHMgdGhhdCBjYW4gbm90IGJlIGRlc2NyaWJlZCBhcwotcmVsb2NhdGlvbnMuCi0KLVRoZSBAY29kZXtmaXhTfSBzdHJ1Y3R1cmUgaGFzIGEgbnVtYmVyIG9mIGZpZWxkcywgc2V2ZXJhbCBvZiB3aGljaCBhcmUgb2Jzb2xldGUKLW9yIGFyZSBvbmx5IHVzZWQgYnkgYSBwYXJ0aWN1bGFyIHRhcmdldC4gIFRoZSBpbXBvcnRhbnQgZmllbGRzIGFyZToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmeF9mcmFnCi1UaGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkgdGhpcyBmaXh1cCBpcyBpbi4KLQotQGl0ZW0gZnhfd2hlcmUKLVRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGZyYWcgd2hlcmUgdGhlIGZpeHVwIG9jY3Vycy4KLQotQGl0ZW0gZnhfYWRkc3kKLVRoZSBzeW1ib2wgdGhpcyBmaXh1cCBpcyBhZ2FpbnN0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgaXMgYWRkZWQKLWludG8gdGhlIG9iamVjdCBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuCi0KLUBpdGVtIGZ4X3N1YnN5Ci1UaGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBvYmplY3QgY29udGVudHMuICBUaGlzIGlzCi1ub3JtYWxseSBOVUxMLgotCi1AaXRlbSBmeF9vZmZzZXQKLUEgbnVtYmVyIHdoaWNoIGlzIGFkZGVkIGludG8gdGhlIGZpeHVwLgotCi1AaXRlbSBmeF9hZGRudW1iZXIKLVNvbWUgQ1BVIGJhY2tlbmRzIHVzZSB0aGlzIGZpZWxkIHRvIGNvbnZleSBpbmZvcm1hdGlvbiBiZXR3ZWVuCi1AY29kZXttZF9hcHBseV9maXh9IGFuZCBAY29kZXt0Y19nZW5fcmVsb2N9LiAgVGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBkb2VzCi1ub3QgdXNlIGl0LgotCi1AaXRlbSBmeF9uZXh0Ci1UaGUgbmV4dCBmaXh1cCBpbiB0aGUgc2VjdGlvbi4KLQotQGl0ZW0gZnhfcl90eXBlCi1UaGUgdHlwZSBvZiB0aGUgZml4dXAuICBUaGlzIGZpZWxkIGlzIG9ubHkgZGVmaW5lZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSwgb3IKLWlmIHRoZSB0YXJnZXQgZGVmaW5lcyBAY29kZXtORUVEX0ZYX1JfVFlQRX0uCi0KLUBpdGVtIGZ4X3NpemUKLVRoZSBzaXplIG9mIHRoZSBmaXh1cC4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGVycm9yIGNoZWNraW5nLgotCi1AaXRlbSBmeF9wY3JlbAotV2hldGhlciB0aGUgZml4dXAgaXMgUEMgcmVsYXRpdmUuCi0KLUBpdGVtIGZ4X2RvbmUKLU5vbi16ZXJvIGlmIHRoZSBmaXh1cCBoYXMgYmVlbiBhcHBsaWVkLCBhbmQgbm8gcmVsb2NhdGlvbiBlbnRyeSBuZWVkcyB0byBiZQotZ2VuZXJhdGVkLgotCi1AaXRlbSBmeF9maWxlCi1AaXRlbXggZnhfbGluZQotVGhlIGZpbGUgYW5kIGxpbmUgd2hlcmUgdGhlIGZpeHVwIHdhcyBjcmVhdGVkLgotCi1AaXRlbSB0Y19maXhfZGF0YQotVGhpcyBoYXMgdGhlIHR5cGUgQGNvZGV7VENfRklYX1RZUEV9LCBhbmQgaXMgb25seSBkZWZpbmVkIGlmIHRoZSB0YXJnZXQgZGVmaW5lcwotdGhhdCBtYWNyby4KLUBlbmQgdGFibGUKLQotQG5vZGUgRnJhZ3MKLUBzdWJzZWN0aW9uIEZyYWdzCi1AY2luZGV4IGludGVybmFscywgZnJhZ3MKLUBjaW5kZXggZnJhZ3MKLUBjaW5kZXggZnJhZ1Mgc3RydWN0dXJlLgotCi1UaGUgQGNvZGV7ZnJhZ1N9IHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIEBmaWxle2FzLmh9LiAgRWFjaCBmcmFnIHJlcHJlc2VudHMgYQotcG9ydGlvbiBvZiB0aGUgZmluYWwgb2JqZWN0IGZpbGUuICBBcyBHQVMgcmVhZHMgdGhlIHNvdXJjZSBmaWxlLCBpdCBjcmVhdGVzCi1mcmFncyB0byBob2xkIHRoZSBkYXRhIHRoYXQgaXQgcmVhZHMuICBBdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSB0aGUgZnJhZ3MgYW5kCi1maXh1cHMgYXJlIHByb2Nlc3NlZCB0byBwcm9kdWNlIHRoZSBmaW5hbCBjb250ZW50cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmcl9hZGRyZXNzCi1UaGUgYWRkcmVzcyBvZiB0aGUgZnJhZy4gIFRoaXMgaXMgbm90IHNldCB1bnRpbCB0aGUgYXNzZW1ibGVyIHJlc2NhbnMgdGhlIGxpc3QKLW9mIGFsbCBmcmFncyBhZnRlciB0aGUgZW50aXJlIGlucHV0IGZpbGUgaXMgcGFyc2VkLiAgVGhlIGZ1bmN0aW9uCi1AY29kZXtyZWxheF9zZWdtZW50fSBmaWxscyBpbiB0aGlzIGZpZWxkLgotCi1AaXRlbSBmcl9uZXh0Ci1Qb2ludGVyIHRvIHRoZSBuZXh0IGZyYWcgaW4gdGhpcyAoc3ViKXNlY3Rpb24uCi0KLUBpdGVtIGZyX2ZpeAotRml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2Uga25vdyB3ZSdyZSBnb2luZyB0byBlbWl0IHRvIHRoZSBvdXRwdXQgZmlsZS4gIE1heQotYmUgemVyby4KLQotQGl0ZW0gZnJfdmFyCi1WYXJpYWJsZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3ZSBtYXkgb3V0cHV0LCBhZnRlciB0aGUgaW5pdGlhbCBAY29kZXtmcl9maXh9Ci1jaGFyYWN0ZXJzLiAgTWF5IGJlIHplcm8uCi0KLUBpdGVtIGZyX29mZnNldAotVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgZmllbGQgaXMgY29udHJvbGxlZCBieSBAY29kZXtmcl90eXBlfS4gIEdlbmVyYWxseSwKLWlmIEBjb2Rle2ZyX3Zhcn0gaXMgbm9uLXplcm8sIHRoaXMgaXMgYSByZXBlYXQgY291bnQ6IHRoZSBAY29kZXtmcl92YXJ9Ci1jaGFyYWN0ZXJzIGFyZSBvdXRwdXQgQGNvZGV7ZnJfb2Zmc2V0fSB0aW1lcy4KLQotQGl0ZW0gbGluZQotSG9sZHMgbGluZSBudW1iZXIgaW5mbyB3aGVuIGFuIGFzc2VtYmxlciBsaXN0aW5nIHdhcyByZXF1ZXN0ZWQuCi0KLUBpdGVtIGZyX3R5cGUKLVJlbGF4YXRpb24gc3RhdGUuICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgQGNvZGV7ZnJfb2Zmc2V0fSwKLUBjb2Rle2ZyX3N5bWJvbH0gYW5kIHRoZSB2YXJpYWJsZS1sZW5ndGggdGFpbCBvZiB0aGUgZnJhZywgYXMgd2VsbCBhcyB0aGUKLXRyZWF0bWVudCBpdCBnZXRzIGluIHZhcmlvdXMgcGhhc2VzIG9mIHByb2Nlc3NpbmcuICBJdCBkb2VzIG5vdCBhZmZlY3QgdGhlCi1pbml0aWFsIEBjb2Rle2ZyX2ZpeH0gY2hhcmFjdGVyczsgdGhleSBhcmUgYWx3YXlzIHN1cHBvc2VkIHRvIGJlIG91dHB1dAotdmVyYmF0aW0gKGZpeHVwcyBhc2lkZSkuICBTZWUgYmVsb3cgZm9yIHNwZWNpZmljIHZhbHVlcyB0aGlzIGZpZWxkIGNhbiBoYXZlLgotCi1AaXRlbSBmcl9zdWJ0eXBlCi1SZWxheGF0aW9uIHN1YnN0YXRlLiAgSWYgdGhlIG1hY3JvIEBjb2Rle21kX3JlbGF4X2ZyYWd9IGlzbid0IGRlZmluZWQsIHRoaXMgaXMKLWFzc3VtZWQgdG8gYmUgYW4gaW5kZXggaW50byBAY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSBmb3IgdGhlIGdlbmVyaWMKLXJlbGF4YXRpb24gY29kZSB0byBwcm9jZXNzIChAcHhyZWZ7UmVsYXhhdGlvbn0pLiAgSWYgQGNvZGV7bWRfcmVsYXhfZnJhZ30gaXMKLWRlZmluZWQsIHRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciBhbnkgdXNlIGJ5IHRoZSBDUFUtc3BlY2lmaWMgY29kZS4KLQotQGl0ZW0gZnJfc3ltYm9sCi1UaGlzIG5vcm1hbGx5IGluZGljYXRlcyB0aGUgc3ltYm9sIHRvIHVzZSB3aGVuIHJlbGF4aW5nIHRoZSBmcmFnIGFjY29yZGluZyB0bwotQGNvZGV7ZnJfdHlwZX0uCi0KLUBpdGVtIGZyX29wY29kZQotUG9pbnRzIHRvIHRoZSBsb3dlc3QtYWRkcmVzc2VkIGJ5dGUgb2YgdGhlIG9wY29kZSwgZm9yIHVzZSBpbiByZWxheGF0aW9uLgotCi1AaXRlbSB0Y19mcmFnX2RhdGEKLVRhcmdldCBzcGVjaWZpYyBmcmFnbWVudCBkYXRhIG9mIHR5cGUgVENfRlJBR19UWVBFLgotT25seSBwcmVzZW50IGlmIEBjb2Rle1RDX0ZSQUdfVFlQRX0gaXMgZGVmaW5lZC4KLQotQGl0ZW0gZnJfZmlsZQotQGl0ZW14IGZyX2xpbmUKLVRoZSBmaWxlIGFuZCBsaW5lIHdoZXJlIHRoaXMgZnJhZyB3YXMgbGFzdCBtb2RpZmllZC4KLQotQGl0ZW0gZnJfbGl0ZXJhbAotRGVjbGFyZWQgYXMgYSBvbmUtY2hhcmFjdGVyIGFycmF5LCB0aGlzIGxhc3QgZmllbGQgZ3Jvd3MgYXJiaXRyYXJpbHkgbGFyZ2UgdG8KLWhvbGQgdGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgZnJhZy4KLUBlbmQgdGFibGUKLQotVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSByZWxheGF0aW9uIHN0YXRlcywgcHJvdmlkZWQgaW4gdGhlIGVudW1lcmF0aW9uIHR5cGUKLUBjb2Rle3JlbGF4X3N0YXRlVH0sIGFuZCB0aGUgaW50ZXJwcmV0YXRpb25zIHRoZXkgcmVwcmVzZW50IGZvciB0aGUgb3RoZXIKLWZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSByc19hbGlnbgotQGl0ZW14IHJzX2FsaWduX2NvZGUKLVRoZSBzdGFydCBvZiB0aGUgZm9sbG93aW5nIGZyYWcgc2hvdWxkIGJlIGFsaWduZWQgb24gc29tZSBib3VuZGFyeS4gIEluIHRoaXMKLWZyYWcsIEBjb2Rle2ZyX29mZnNldH0gaXMgdGhlIGxvZ2FyaXRobSAoYmFzZSAyKSBvZiB0aGUgYWxpZ25tZW50IGluIGJ5dGVzLgotKEZvciBleGFtcGxlLCBpZiBhbGlnbm1lbnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IHdlcmUgZGVzaXJlZCwgQGNvZGV7ZnJfb2Zmc2V0fQotd291bGQgaGF2ZSBhIHZhbHVlIG9mIDMuKSAgVGhlIHZhcmlhYmxlIGNoYXJhY3RlcnMgaW5kaWNhdGUgdGhlIGZpbGwgcGF0dGVybiB0bwotYmUgdXNlZC4gIFRoZSBAY29kZXtmcl9zdWJ0eXBlfSBmaWVsZCBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcAotd2hlbiBkb2luZyB0aGlzIGFsaWdubWVudC4gIElmIG1vcmUgYnl0ZXMgYXJlIG5lZWRlZCwgdGhlIGFsaWdubWVudCBpcyBub3QKLWRvbmUuICBBbiBAY29kZXtmcl9zdWJ0eXBlfSB2YWx1ZSBvZiAwIG1lYW5zIG5vIG1heGltdW0sIHdoaWNoIGlzIHRoZSBub3JtYWwKLWNhc2UuICBUYXJnZXQgYmFja2VuZHMgY2FuIHVzZSBAY29kZXtyc19hbGlnbl9jb2RlfSB0byBoYW5kbGUgY2VydGFpbiB0eXBlcyBvZgotYWxpZ25tZW50IGRpZmZlcmVudGx5LgotCi1AaXRlbSByc19icm9rZW5fd29yZAotVGhpcyBpbmRpY2F0ZXMgdGhhdCBgYGJyb2tlbiB3b3JkJycgcHJvY2Vzc2luZyBzaG91bGQgYmUgZG9uZSAoQHB4cmVme0Jyb2tlbgotd29yZHN9KS4gIElmIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcgaXMgbm90IG5lY2Vzc2FyeSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUsCi10aGlzIGVudW1lcmF0b3IgdmFsdWUgd2lsbCBub3QgYmUgZGVmaW5lZC4KLQotQGl0ZW0gcnNfY2ZhCi1UaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiBmcmFtZSBvcHRpbWl6YXRpb25zLiAgVGhlCi1AY29kZXtmcl9zeW1ib2x9IGlzIGFuIGV4cHJlc3Npb24gc3ltYm9sIGZvciB0aGUgc3VidHJhY3Rpb24gd2hpY2ggbWF5IGJlCi1yZWxheGVkLiAgVGhlIEBjb2Rle2ZyX29wY29kZX0gZmllbGQgaG9sZHMgdGhlIGZyYWcgZm9yIHRoZSBwcmVjZWRpbmcgY29tbWFuZAotYnl0ZS4gIFRoZSBAY29kZXtmcl9vZmZzZXR9IGZpZWxkIGhvbGRzIHRoZSBvZmZzZXQgd2l0aGluIHRoYXQgZnJhZy4gIFRoZQotQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgaXMgdXNlZCBkdXJpbmcgcmVsYXhhdGlvbiB0byBob2xkIHRoZSBjdXJyZW50IHNpemUgb2YKLXRoZSBmcmFnLgotCi1AaXRlbSByc19maWxsCi1UaGUgdmFyaWFibGUgY2hhcmFjdGVycyBhcmUgdG8gYmUgcmVwZWF0ZWQgQGNvZGV7ZnJfb2Zmc2V0fSB0aW1lcy4gIElmCi1AY29kZXtmcl9vZmZzZXR9IGlzIDAsIHRoaXMgZnJhZyBoYXMgYSBsZW5ndGggb2YgQGNvZGV7ZnJfZml4fS4gIE1vc3QgZnJhZ3MKLWhhdmUgdGhpcyB0eXBlLgotCi1AaXRlbSByc19sZWIxMjgKLVRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIERXQVJGIGBgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOCcnIAotdmFyaWFibGUgbGVuZ3RoIG51bWJlciBmb3JtYXQuICBUaGUgQGNvZGV7ZnJfc3ltYm9sfSBpcyBhbHdheXMgYW4gZXhwcmVzc2lvbgotc3ltYm9sLCBhcyBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgZW1pdHRlZCBkaXJlY3RseS4gIFRoZSBAY29kZXtmcl9vZmZzZXR9Ci1maWVsZCBpcyB1c2VkIGR1cmluZyByZWxheGF0aW9uIHRvIGhvbGQgdGhlIHByZXZpb3VzIHNpemUgb2YgdGhlIG51bWJlciBzbwotdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBmcmFnbWVudCBjaGFuZ2VkIHNpemUuCi0KLUBpdGVtIHJzX21hY2hpbmVfZGVwZW5kZW50Ci1EaXNwbGFjZW1lbnQgcmVsYXhhdGlvbiBpcyB0byBiZSBkb25lIG9uIHRoaXMgZnJhZy4gIFRoZSB0YXJnZXQgaXMgaW5kaWNhdGVkIGJ5Ci1AY29kZXtmcl9zeW1ib2x9IGFuZCBAY29kZXtmcl9vZmZzZXR9LCBhbmQgQGNvZGV7ZnJfc3VidHlwZX0gaW5kaWNhdGVzIHRoZQotcGFydGljdWxhciBtYWNoaW5lLXNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZSBkZXNpcmVkLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIHJzX29yZwotVGhlIHN0YXJ0IG9mIHRoZSBmb2xsb3dpbmcgZnJhZyBzaG91bGQgYmUgcHVzaGVkIGJhY2sgdG8gc29tZSBzcGVjaWZpYyBvZmZzZXQKLXdpdGhpbiB0aGUgc2VjdGlvbi4gIChTb21lIGFzc2VtYmxlcnMgdXNlIHRoZSB2YWx1ZSBhcyBhbiBhYnNvbHV0ZSBhZGRyZXNzOyBHQVMKLWRvZXMgbm90IGhhbmRsZSBmaW5hbCBhYnNvbHV0ZSBhZGRyZXNzZXMsIGJ1dCByYXRoZXIgcmVxdWlyZXMgdGhhdCB0aGUgbGlua2VyCi1zZXQgdGhlbS4pICBUaGUgb2Zmc2V0IGlzIGdpdmVuIGJ5IEBjb2Rle2ZyX3N5bWJvbH0gYW5kIEBjb2Rle2ZyX29mZnNldH07IG9uZQotY2hhcmFjdGVyIGZyb20gdGhlIHZhcmlhYmxlLWxlbmd0aCB0YWlsIGlzIHVzZWQgYXMgdGhlIGZpbGwgY2hhcmFjdGVyLgotQGVuZCB0YWJsZQotCi1AY2luZGV4IGZyY2hhaW5TIHN0cnVjdHVyZQotQSBjaGFpbiBvZiBmcmFncyBpcyBidWlsdCB1cCBmb3IgZWFjaCBzdWJzZWN0aW9uLiAgVGhlIGRhdGEgc3RydWN0dXJlCi1kZXNjcmliaW5nIGEgY2hhaW4gaXMgY2FsbGVkIGEgQGNvZGV7ZnJjaGFpblN9LCBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZwotZmllbGRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGZyY2hfcm9vdAotUG9pbnRzIHRvIHRoZSBmaXJzdCBmcmFnIGluIHRoZSBjaGFpbi4gIE1heSBiZSBOVUxMIGlmIHRoZXJlIGFyZSBubyBmcmFncyBpbgotdGhpcyBjaGFpbi4KLUBpdGVtIGZyY2hfbGFzdAotUG9pbnRzIHRvIHRoZSBsYXN0IGZyYWcgaW4gdGhlIGNoYWluLCBvciBOVUxMIGlmIHRoZXJlIGFyZSBub25lLgotQGl0ZW0gZnJjaF9uZXh0Ci1OZXh0IGluIHRoZSBsaXN0IG9mIEBjb2Rle2ZyY2hhaW5TfSBzdHJ1Y3R1cmVzLgotQGl0ZW0gZnJjaF9zZWcKLUluZGljYXRlcyB0aGUgc2VjdGlvbiB0aGlzIGZyYWcgY2hhaW4gYmVsb25ncyB0by4KLUBpdGVtIGZyY2hfc3Vic2VnCi1TdWJzZWN0aW9uIChzdWJzZWdtZW50KSBudW1iZXIgb2YgdGhpcyBmcmFnIGNoYWluLgotQGl0ZW0gZml4X3Jvb3QsIGZpeF90YWlsCi0oRGVmaW5lZCBvbmx5IGlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQpLiAgUG9pbnQgdG8gZmlyc3QgYW5kIGxhc3QKLUBjb2Rle2ZpeFN9IHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic2VjdGlvbi4KLUBpdGVtIGZyY2hfb2JzdGFjawotTm90IGN1cnJlbnRseSB1c2VkLiAgSW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgZnJhZyBhbGxvY2F0aW9uIGZvciB0aGlzCi1zdWJzZWN0aW9uLiAgVGhpcyBzaG91bGQgcmVkdWNlIGZyYWcgZ2VuZXJhdGlvbiBjYXVzZWQgYnkgc3dpdGNoaW5nIHNlY3Rpb25zLgotQGl0ZW0gZnJjaF9mcmFnX25vdwotVGhlIGN1cnJlbnQgZnJhZyBmb3IgdGhpcyBzdWJzZWdtZW50LgotQGVuZCB0YWJsZQotCi1BIEBjb2Rle2ZyY2hhaW5TfSBjb3JyZXNwb25kcyB0byBhIHN1YnNlY3Rpb247IGVhY2ggc2VjdGlvbiBoYXMgYSBsaXN0IG9mCi1AY29kZXtmcmNoYWluU30gcmVjb3JkcyBhc3NvY2lhdGVkIHdpdGggaXQuICBJbiBtb3N0IGNhc2VzLCBvbmx5IG9uZSBzdWJzZWN0aW9uCi1vZiBlYWNoIHNlY3Rpb24gaXMgdXNlZCwgc28gdGhlIGxpc3Qgd2lsbCBvbmx5IGJlIG9uZSBlbGVtZW50IGxvbmcsIGJ1dCBhbnkKLXByb2Nlc3Npbmcgb2YgZnJhZyBjaGFpbnMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSBjaGFpbnMgcGVyCi1zZWN0aW9uLgotCi1BZnRlciB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcHJvY2Vzc2VkLCBhbmQgbm8gbW9yZSBmcmFncyBhcmUgdG8KLWJlIGdlbmVyYXRlZCwgdGhlIGZyYWcgY2hhaW5zIGFyZSBqb2luZWQgaW50byBvbmUgcGVyIHNlY3Rpb24gZm9yIGZ1cnRoZXIKLXByb2Nlc3NpbmcuICBBZnRlciB0aGlzIHBvaW50LCBpdCBpcyBzYWZlIHRvIG9wZXJhdGUgb24gb25lIGNoYWluIHBlciBzZWN0aW9uLgotCi1UaGUgYXNzZW1ibGVyIGFsd2F5cyBoYXMgYSBjdXJyZW50IGZyYWcsIG5hbWVkIEBjb2Rle2ZyYWdfbm93fS4gIE1vcmUgc3BhY2UgaXMKLWFsbG9jYXRlZCBmb3IgdGhlIGN1cnJlbnQgZnJhZyB1c2luZyB0aGUgQGNvZGV7ZnJhZ19tb3JlfSBmdW5jdGlvbjsgdGhpcwotcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFtb3VudCBvZiByZXF1ZXN0ZWQgc3BhY2UuICBSZWxheGluZyBpcyBkb25lIHVzaW5nCi12YXJpYW50IGZyYWdzIGFsbG9jYXRlZCBieSBAY29kZXtmcmFnX3Zhcn0gb3IgQGNvZGV7ZnJhZ192YXJpYW50fQotKEBweHJlZntSZWxheGF0aW9ufSkuCi0KLUBub2RlIEdBUyBwcm9jZXNzaW5nCi1Ac2VjdGlvbiBXaGF0IEdBUyBkb2VzIHdoZW4gaXQgcnVucwotQGNpbmRleCBpbnRlcm5hbHMsIG92ZXJ2aWV3Ci0KLVRoaXMgaXMgYSBxdWljayBsb29rIGF0IHdoYXQgYW4gYXNzZW1ibGVyIHJ1biBsb29rcyBsaWtlLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIGFzc2VtYmxlciBpbml0aWFsaXplcyBpdHNlbGYgYnkgY2FsbGluZyB2YXJpb3VzIGluaXQgcm91dGluZXMuCi0KLUBpdGVtCi1Gb3IgZWFjaCBzb3VyY2UgZmlsZSwgdGhlIEBjb2Rle3JlYWRfYV9zb3VyY2VfZmlsZX0gZnVuY3Rpb24gcmVhZHMgaW4gdGhlIGZpbGUKLWFuZCBwYXJzZXMgaXQuICBUaGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0gcG9pbnRzIHRvIHRoZQotY3VycmVudCB0ZXh0OyBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgYnV0IG5vdAotZmFydGhlci4KLQotQGl0ZW0KLUZvciBlYWNoIGxpbmUsIHRoZSBhc3NlbWJsZXIgcGFzc2VzIGxhYmVscyB0byB0aGUgQGNvZGV7Y29sb259IGZ1bmN0aW9uLCBhbmQKLWlzb2xhdGVzIHRoZSBmaXJzdCB3b3JkLiAgSWYgaXQgbG9va3MgbGlrZSBhIHBzZXVkby1vcCwgdGhlIHdvcmQgaXMgbG9va2VkIHVwCi1pbiB0aGUgcHNldWRvLW9wIGhhc2ggdGFibGUgQGNvZGV7cG9faGFzaH0gYW5kIGRpc3BhdGNoZWQgdG8gYSBwc2V1ZG8tb3AKLXJvdXRpbmUuICBPdGhlcndpc2UsIHRoZSB0YXJnZXQgZGVwZW5kZW50IEBjb2Rle21kX2Fzc2VtYmxlfSByb3V0aW5lIGlzIGNhbGxlZAotdG8gcGFyc2UgdGhlIGluc3RydWN0aW9uLgotCi1AaXRlbQotV2hlbiBwc2V1ZG8tb3BzIG9yIGluc3RydWN0aW9ucyBvdXRwdXQgZGF0YSwgdGhleSBhZGQgaXQgdG8gYSBmcmFnLCBjYWxsaW5nCi1AY29kZXtmcmFnX21vcmV9IHRvIGdldCBzcGFjZSB0byBzdG9yZSBpdCBpbi4KLQotQGl0ZW0KLVBzZXVkby1vcHMgYW5kIGluc3RydWN0aW9ucyBjYW4gYWxzbyBvdXRwdXQgZml4dXBzIGNyZWF0ZWQgYnkgQGNvZGV7Zml4X25ld30gb3IKLUBjb2Rle2ZpeF9uZXdfZXhwfS4KLQotQGl0ZW0KLUZvciBjZXJ0YWluIHRhcmdldHMsIGluc3RydWN0aW9ucyBjYW4gY3JlYXRlIHZhcmlhbnQgZnJhZ3Mgd2hpY2ggYXJlIHVzZWQgdG8KLXN0b3JlIHJlbGF4YXRpb24gaW5mb3JtYXRpb24gKEBweHJlZntSZWxheGF0aW9ufSkuCi0KLUBpdGVtCi1XaGVuIHRoZSBpbnB1dCBmaWxlIGlzIGZpbmlzaGVkLCB0aGUgQGNvZGV7d3JpdGVfb2JqZWN0X2ZpbGV9IHJvdXRpbmUgaXMKLWNhbGxlZC4gIEl0IGFzc2lnbnMgYWRkcmVzc2VzIHRvIGFsbCB0aGUgZnJhZ3MgKEBjb2Rle3JlbGF4X3NlZ21lbnR9KSwgcmVzb2x2ZXMKLWFsbCB0aGUgZml4dXBzIChAY29kZXtmaXh1cF9zZWdtZW50fSksIHJlc29sdmVzIGFsbCB0aGUgc3ltYm9sIHZhbHVlcyAodXNpbmcKLUBjb2Rle3Jlc29sdmVfc3ltYm9sX3ZhbHVlfSksIGFuZCBmaW5hbGx5IHdyaXRlcyBvdXQgdGhlIGZpbGUgKGluIHRoZQotQGNvZGV7QkZEX0FTU0VNQkxFUn0gY2FzZSwgdGhpcyBpcyBkb25lIGJ5IHNpbXBseSBjYWxsaW5nIEBjb2Rle2JmZF9jbG9zZX0pLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIFBvcnRpbmcgR0FTCi1Ac2VjdGlvbiBQb3J0aW5nIEdBUwotQGNpbmRleCBwb3J0aW5nCi0KLUVhY2ggR0FTIHRhcmdldCBzcGVjaWZpZXMgdHdvIG1haW4gdGhpbmdzOiB0aGUgQ1BVIGZpbGUgYW5kIHRoZSBvYmplY3QgZm9ybWF0Ci1maWxlLiAgVHdvIG1haW4gc3dpdGNoZXMgaW4gdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBoYW5kbGUgdGhpcy4gIFRoZQotZmlyc3Qgc3dpdGNoZXMgb24gQ1BVIHR5cGUgdG8gc2V0IHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtjcHVfdHlwZX0uICBUaGUKLXNlY29uZCBzd2l0Y2hlcyBvbiB0aGUgZW50aXJlIHRhcmdldCB0byBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle2ZtdH0uCi0KLVRoZSBjb25maWd1cmUgc2NyaXB0IHVzZXMgdGhlIHZhbHVlIG9mIEBjb2Rle2NwdV90eXBlfSB0byBzZWxlY3QgdHdvIGZpbGVzIGluCi10aGUgQGZpbGV7Y29uZmlnfSBkaXJlY3Rvcnk6IEBmaWxle3RjLUB2YXJ7Q1BVfS5jfSBhbmQgQGZpbGV7dGMtQHZhcntDUFV9Lmh9LgotVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7dGFyZy1jcHUuaH0gaW4gdGhlCi1idWlsZCBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMgQGZpbGV7dGMtQHZhcntDUFV9Lmh9LgotCi1UaGUgY29uZmlndXJlIHNjcmlwdCBhbHNvIHVzZXMgdGhlIHZhbHVlIG9mIEBjb2Rle2ZtdH0gdG8gc2VsZWN0IHR3byBmaWxlczoKLUBmaWxle29iai1AdmFye2ZtdH0uY30gYW5kIEBmaWxle29iai1AdmFye2ZtdH0uaH0uICBUaGUgY29uZmlndXJhdGlvbiBwcm9jZXNzCi13aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7b2JqLWZvcm1hdC5ofSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5IHdoaWNoCi1pbmNsdWRlcyBAZmlsZXtvYmotQHZhcntmbXR9Lmh9LgotCi1Zb3UgY2FuIGFsc28gc2V0IHRoZSBlbXVsYXRpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYnkgc2V0dGluZyB0aGUgQGNvZGV7ZW19Ci12YXJpYWJsZS4gIE5vcm1hbGx5IHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBzYW1we2dlbmVyaWN9IGlzIGZpbmUuICBUaGUKLWNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7dGFyZy1lbnYuaH0gaW4gdGhlIGJ1aWxkCi1kaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMgQGZpbGV7dGUtQHZhcntlbX0uaH0uCi0KLVBvcnRpbmcgR0FTIHRvIGEgbmV3IENQVSByZXF1aXJlcyB3cml0aW5nIHRoZSBAZmlsZXt0Yy1AdmFye0NQVX19IGZpbGVzLgotUG9ydGluZyBHQVMgdG8gYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IHJlcXVpcmVzIHdyaXRpbmcgdGhlCi1AZmlsZXtvYmotQHZhcntmbXR9fSBmaWxlcy4gIFRoZXJlIGlzIHNvbWV0aW1lcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhlc2UKLXR3byBmaWxlcywgYnV0IGl0IGlzIG5vcm1hbGx5IG1pbmltYWwuCi0KLVRoZSBiZXN0IGFwcHJvYWNoIGlzLCBvZiBjb3Vyc2UsIHRvIGNvcHkgZXhpc3RpbmcgZmlsZXMuICBUaGUgZG9jdW1lbnRhdGlvbgotYmVsb3cgYXNzdW1lcyB0aGF0IHlvdSBhcmUgbG9va2luZyBhdCBleGlzdGluZyBmaWxlcyB0byBzZWUgdXNhZ2UgZGV0YWlscy4KLQotVGhlc2UgaW50ZXJmYWNlcyBoYXZlIGdyb3duIG92ZXIgdGltZSwgYW5kIGhhdmUgbmV2ZXIgYmVlbiBjYXJlZnVsbHkgdGhvdWdodAotb3V0IG9yIGRlc2lnbmVkLiAgTm90aGluZyBhYm91dCB0aGUgaW50ZXJmYWNlcyBkZXNjcmliZWQgaGVyZSBpcyBjYXN0IGluIHN0b25lLgotSXQgaXMgcG9zc2libGUgdGhhdCB0aGV5IHdpbGwgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgdGhlIGFzc2VtYmxlciB0byB0aGUKLW5leHQuICBBbHNvLCBuZXcgbWFjcm9zIGFyZSBhZGRlZCBhbGwgdGhlIHRpbWUgYXMgdGhleSBhcmUgbmVlZGVkLgotCi1AbWVudQotKiBDUFUgYmFja2VuZDo6ICAgICAgICAgICAgICAgICBXcml0aW5nIGEgQ1BVIGJhY2tlbmQKLSogT2JqZWN0IGZvcm1hdCBiYWNrZW5kOjogICAgICAgV3JpdGluZyBhbiBvYmplY3QgZm9ybWF0IGJhY2tlbmQKLSogRW11bGF0aW9uczo6ICAgICAgICAgICAgICAgICAgV3JpdGluZyBlbXVsYXRpb24gZmlsZXMKLUBlbmQgbWVudQotCi1Abm9kZSBDUFUgYmFja2VuZAotQHN1YnNlY3Rpb24gV3JpdGluZyBhIENQVSBiYWNrZW5kCi1AY2luZGV4IENQVSBiYWNrZW5kCi1AY2luZGV4IEBmaWxle3RjLUB2YXJ7Q1BVfX0KLQotVGhlIENQVSBiYWNrZW5kIGZpbGVzIGFyZSB0aGUgaGVhcnQgb2YgdGhlIGFzc2VtYmxlci4gIFRoZXkgYXJlIHRoZSBvbmx5IHBhcnRzCi1vZiB0aGUgYXNzZW1ibGVyIHdoaWNoIGFjdHVhbGx5IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGluc3RydWN0aW9uIHNldCBvZiB0aGUKLXByb2Nlc3Nvci4KLQotWW91IG11c3QgZGVmaW5lIGEgcmVhc29uYWJseSBzbWFsbCBsaXN0IG9mIG1hY3JvcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBDUFUKLWJhY2tlbmQgZmlsZXMuICBZb3UgbWF5IGRlZmluZSBhIGxhcmdlIG51bWJlciBvZiBhZGRpdGlvbmFsIG1hY3JvcyBpbiB0aGUgQ1BVCi1iYWNrZW5kIGZpbGVzLCBub3QgYWxsIG9mIHdoaWNoIGFyZSBkb2N1bWVudGVkIGhlcmUuICBZb3UgbXVzdCwgb2YgY291cnNlLAotZGVmaW5lIG1hY3JvcyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUsIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IGV2ZXJ5IGFzc2VtYmxlcgotc291cmNlIGZpbGUuICBZb3UgbWF5IGRlZmluZSB0aGUgZnVuY3Rpb25zIGFzIG1hY3JvcyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUsIG9yCi1hcyBmdW5jdGlvbnMgaW4gdGhlIEBmaWxley5jfSBmaWxlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFRDX0B2YXJ7Q1BVfQotQGNpbmRleCBUQ19AdmFye0NQVX0KLUJ5IGNvbnZlbnRpb24sIHlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gaW4gdGhlIEBmaWxley5ofSBmaWxlLiAgRm9yCi1leGFtcGxlLCBAZmlsZXt0Yy1tNjhrLmh9IGRlZmluZXMgQGNvZGV7VENfTTY4S30uICBZb3UgbWlnaHQgaGF2ZSB0byB1c2UgdGhpcwotaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFkZCBDUFUgc3BlY2lmaWMgY29kZSB0byB0aGUgb2JqZWN0IGZvcm1hdCBmaWxlLgotCi1AaXRlbSBUQVJHRVRfRk9STUFUCi1UaGlzIG1hY3JvIGlzIHRoZSBCRkQgdGFyZ2V0IG5hbWUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotd2lsbCBub3JtYWxseSBkZXBlbmQgdXBvbiB0aGUgQGNvZGV7T0JKX0B2YXJ7Rk1UfX0gbWFjcm8uCi0KLUBpdGVtIFRBUkdFVF9BUkNICi1UaGlzIG1hY3JvIGlzIHRoZSBCRkQgYXJjaGl0ZWN0dXJlIHRvIHBhc3MgdG8gQGNvZGV7YmZkX3NldF9hcmNoX21hY2h9LgotCi1AaXRlbSBUQVJHRVRfTUFDSAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIG1hY2hpbmUgbnVtYmVyIHRvIHBhc3MgdG8gQGNvZGV7YmZkX3NldF9hcmNoX21hY2h9LiAgSWYKLWl0IGlzIG5vdCBkZWZpbmVkLCBHQVMgd2lsbCB1c2UgMC4KLQotQGl0ZW0gVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLVlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gdG8gYmUgbm9uLXplcm8gaWYgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuLCBhbmQKLXplcm8gaWYgdGhlIHRhcmdldCBpcyBsaXR0bGUgZW5kaWFuLgotCi1AaXRlbSBtZF9zaG9ydG9wdHMKLUBpdGVteCBtZF9sb25nb3B0cwotQGl0ZW14IG1kX2xvbmdvcHRzX3NpemUKLUBpdGVteCBtZF9wYXJzZV9vcHRpb24KLUBpdGVteCBtZF9zaG93X3VzYWdlCi1AY2luZGV4IG1kX3Nob3J0b3B0cwotQGNpbmRleCBtZF9sb25nb3B0cwotQGNpbmRleCBtZF9sb25nb3B0c19zaXplCi1AY2luZGV4IG1kX3BhcnNlX29wdGlvbgotQGNpbmRleCBtZF9zaG93X3VzYWdlCi1HQVMgdXNlcyB0aGVzZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBkdXJpbmcgb3B0aW9uIHByb2Nlc3NpbmcuCi1AY29kZXttZF9zaG9ydG9wdHN9IGlzIGEgQGNvZGV7Y29uc3QgY2hhciAqfSB3aGljaCBHQVMgYWRkcyB0byB0aGUgbWFjaGluZQotaW5kZXBlbmRlbnQgc3RyaW5nIHBhc3NlZCB0byBAY29kZXtnZXRvcHR9LiAgQGNvZGV7bWRfbG9uZ29wdHN9IGlzIGEKLUBjb2Rle3N0cnVjdCBvcHRpb24gW119IHdoaWNoIEdBUyBhZGRzIHRvIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGxvbmcgb3B0aW9ucwotcGFzc2VkIHRvIEBjb2Rle2dldG9wdH07IHlvdSBtYXkgdXNlIEBjb2Rle09QVElPTl9NRF9CQVNFfSwgZGVmaW5lZCBpbgotQGZpbGV7YXMuaH0sIGFzIHRoZSBzdGFydCBvZiBhIHNldCBvZiBsb25nIG9wdGlvbiBpbmRpY2VzLCBpZiBuZWNlc3NhcnkuCi1AY29kZXttZF9sb25nb3B0c19zaXplfSBpcyBhIEBjb2Rle3NpemVfdH0gaG9sZGluZyB0aGUgc2l6ZSBAY29kZXttZF9sb25nb3B0c30uCi1HQVMgd2lsbCBjYWxsIEBjb2Rle21kX3BhcnNlX29wdGlvbn0gd2hlbmV2ZXIgQGNvZGV7Z2V0b3B0fSByZXR1cm5zIGFuCi11bnJlY29nbml6ZWQgY29kZSwgcHJlc3VtYWJseSBpbmRpY2F0aW5nIGEgc3BlY2lhbCBjb2RlIHZhbHVlIHdoaWNoIGFwcGVhcnMgaW4KLUBjb2Rle21kX2xvbmdvcHRzfS4gIEdBUyB3aWxsIGNhbGwgQGNvZGV7bWRfc2hvd191c2FnZX0gd2hlbiBhIHVzYWdlIG1lc3NhZ2UgaXMKLXByaW50ZWQ7IGl0IHNob3VsZCBwcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtYWNoaW5lIHNwZWNpZmljIG9wdGlvbnMuCi0KLUBpdGVtIG1kX2JlZ2luCi1AY2luZGV4IG1kX2JlZ2luCi1HQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBhc3NlbWJseSwgYWZ0ZXIgdGhlIGNvbW1hbmQKLWxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFsbCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBpbml0aWFsaXphdGlvbnMKLWhhdmUgYmVlbiBjb21wbGV0ZWQuCi0KLUBpdGVtIG1kX2NsZWFudXAKLUBjaW5kZXggbWRfY2xlYW51cAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBlbmQgb2YgZWFjaCBpbnB1dCBmaWxlLgotCi1AaXRlbSBtZF9hc3NlbWJsZQotQGNpbmRleCBtZF9hc3NlbWJsZQotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBlYWNoIGlucHV0IGxpbmUgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhCi1wc2V1ZG8tb3AuICBUaGUgYXJndW1lbnQgaXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlIGZ1bmN0aW9uIHNob3VsZAotYXNzZW1ibGUgdGhlIHN0cmluZyBhcyBhbiBpbnN0cnVjdGlvbiB3aXRoIG9wZXJhbmRzLiAgTm9ybWFsbHkKLUBjb2Rle21kX2Fzc2VtYmxlfSB3aWxsIGRvIHRoaXMgYnkgY2FsbGluZyBAY29kZXtmcmFnX21vcmV9IGFuZCB3cml0aW5nIG91dAotc29tZSBieXRlcyAoQHB4cmVme0ZyYWdzfSkuICBAY29kZXttZF9hc3NlbWJsZX0gd2lsbCBjYWxsIEBjb2Rle2ZpeF9uZXd9IHRvCi1jcmVhdGUgZml4dXBzIGFzIG5lZWRlZCAoQHB4cmVme0ZpeHVwc30pLiAgVGFyZ2V0cyB3aGljaCBuZWVkIHRvIGRvIHNwZWNpYWwKLXB1cnBvc2UgcmVsYXhhdGlvbiB3aWxsIGNhbGwgQGNvZGV7ZnJhZ192YXJ9LgotCi1AaXRlbSBtZF9wc2V1ZG9fdGFibGUKLUBjaW5kZXggbWRfcHNldWRvX3RhYmxlCi1UaGlzIGlzIGEgY29uc3QgYXJyYXkgb2YgdHlwZSBAY29kZXtwc2V1ZG9fdHlwZVN9LiAgSXQgaXMgYSBtYXBwaW5nIGZyb20KLXBzZXVkby1vcCBuYW1lcyB0byBmdW5jdGlvbnMuICBZb3Ugc2hvdWxkIHVzZSB0aGlzIHRhYmxlIHRvIGltcGxlbWVudAotcHNldWRvLW9wcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIENQVS4KLQotQGl0ZW0gdGNfY29uZGl0aW9uYWxfcHNldWRvb3AKLUBjaW5kZXggdGNfY29uZGl0aW9uYWxfcHNldWRvb3AKLUlmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgR0FTIHdpbGwgY2FsbCBpdCB3aXRoIGEgQGNvZGV7cHNldWRvX3R5cGVTfSBhcmd1bWVudC4KLUl0IHNob3VsZCByZXR1cm4gbm9uLXplcm8gaWYgdGhlIHBzZXVkby1vcCBpcyBhIGNvbmRpdGlvbmFsIHdoaWNoIGNvbnRyb2xzCi13aGV0aGVyIGNvZGUgaXMgYXNzZW1ibGVkLCBzdWNoIGFzIEBzYW1wey5pZn0uICBHQVMga25vd3MgYWJvdXQgdGhlIG5vcm1hbAotY29uZGl0aW9uYWwgcHNldWRvLW9wcyxhbmQgeW91IHNob3VsZCBub3JtYWxseSBub3QgaGF2ZSB0byBkZWZpbmUgdGhpcyBtYWNyby4KLQotQGl0ZW0gY29tbWVudF9jaGFycwotQGNpbmRleCBjb21tZW50X2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYQotY29tbWVudC4KLQotQGl0ZW0gdGNfY29tbWVudF9jaGFycwotQGNpbmRleCB0Y19jb21tZW50X2NoYXJzCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIEdBUyB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIEBjb2Rle2NvbW1lbnRfY2hhcnN9LgotCi1AaXRlbSB0Y19zeW1ib2xfY2hhcnMKLUBjaW5kZXggdGNfc3ltYm9sX2NoYXJzCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIGl0IGlzIGEgcG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBsaXN0IG9mCi1jaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXIgaW4gYW4gb3BlcmFuZC4gIEdBUyBhbHJlYWR5IGFzc3VtZXMgdGhhdCBhbGwKLWFscGhhbnVtYmVyaWMgY2hhcmFjdGVycywgYW5kIEBzYW1weyR9LCBAc2FtcHsufSwgYW5kIEBzYW1we199IG1heSBhcHBlYXIgaW4gYW4KLW9wZXJhbmQgKHNlZSBAc2FtcHtzeW1ib2xfY2hhcnN9IGluIEBmaWxle2FwcC5jfSkuICBUaGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkCi10byB0cmVhdCBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgYXMgYXBwZWFyaW5nIGluIGFuIG9wZXJhbmQuICBUaGlzIGFmZmVjdHMgdGhlCi13YXkgaW4gd2hpY2ggR0FTIHJlbW92ZXMgd2hpdGVzcGFjZSBiZWZvcmUgcGFzc2luZyB0aGUgc3RyaW5nIHRvCi1Ac2FtcHttZF9hc3NlbWJsZX0uCi0KLUBpdGVtIGxpbmVfY29tbWVudF9jaGFycwotQGNpbmRleCBsaW5lX2NvbW1lbnRfY2hhcnMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBzdGFydCBhCi1jb21tZW50IHdoZW4gdGhleSBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KLQotQGl0ZW0gbGluZV9zZXBhcmF0b3JfY2hhcnMKLUBjaW5kZXggbGluZV9zZXBhcmF0b3JfY2hhcnMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBzZXBhcmF0ZQotbGluZXMgKHNlbWljb2xvbiBhbmQgbmV3bGluZSBhcmUgc3VjaCBjaGFyYWN0ZXJzIGJ5IGRlZmF1bHQsIGFuZCBuZWVkIG5vdCBiZQotbGlzdGVkIGluIHRoaXMgYXJyYXkpLgotCi1AaXRlbSBFWFBfQ0hBUlMKLUBjaW5kZXggRVhQX0NIQVJTCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlCi11c2VkIGFzIHRoZSBleHBvbmVudCBjaGFyYWN0ZXIgaW4gYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICBUaGlzIGlzIG5vcm1hbGx5Ci1AY29kZXsiZUUifS4KLQotQGl0ZW0gRkxUX0NIQVJTCi1AY2luZGV4IEZMVF9DSEFSUwotVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIG1heSBiZQotdXNlZCB0byBpbmRpY2F0ZSBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgQSB6ZXJvIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGVzZQotY2hhcmFjdGVycyBpcyBhc3N1bWVkIHRvIGJlIGZvbGxvd2VkIGJ5IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOyB0aHVzIHRoZXkKLW9wZXJhdGUgdGhlIHdheSB0aGF0IEBjb2RlezB4fSBpcyB1c2VkIHRvIGluZGljYXRlIGEgaGV4YWRlY2ltYWwgY29uc3RhbnQuCi1Vc3VhbGx5IHRoaXMgaW5jbHVkZXMgQHNhbXB7cn0gYW5kIEBzYW1we2Z9LgotCi1AaXRlbSBMRVhfQVQKLUBjaW5kZXggTEVYX0FUCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7QH19IGNoYXJhY3Rlci4gIFRoZQotZGVmYXVsdCBpcyB6ZXJvLgotCi1MZXhpY2FsIHR5cGVzIGFyZSBhIGNvbWJpbmF0aW9uIG9mIEBjb2Rle0xFWF9OQU1FfSBhbmQgQGNvZGV7TEVYX0JFR0lOX05BTUV9LAotYm90aCBkZWZpbmVkIGluIEBmaWxle3JlYWQuaH0uICBAY29kZXtMRVhfTkFNRX0gaW5kaWNhdGVzIHRoYXQgdGhlIGNoYXJhY3RlcgotbWF5IGFwcGVhciBpbiBhIG5hbWUuICBAY29kZXtMRVhfQkVHSU5fTkFNRX0gaW5kaWNhdGVzIHRoYXQgdGhlIGNoYXJhY3RlciBtYXkKLWFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbmVtLgotCi1AaXRlbSBMRVhfQlIKLUBjaW5kZXggTEVYX0JSCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIGJyYWNlIGNoYXJhY3RlcnMgQGtiZHtAe30sCi1Aa2Jke0B9fSwgQGtiZHtbfSwgYW5kIEBrYmR7XX0uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB6ZXJvLgotCi1AaXRlbSBMRVhfUENUCi1AY2luZGV4IExFWF9QQ1QKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHslfSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgemVyby4KLQotQGl0ZW0gTEVYX1FNCi1AY2luZGV4IExFWF9RTQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBAa2Jkez99IGNoYXJhY3Rlci4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpdCB6ZXJvLgotCi1AaXRlbSBMRVhfRE9MTEFSCi1AY2luZGV4IExFWF9ET0xMQVIKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHskfSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7TEVYX05BTUUgfCBMRVhfQkVHSU5fTkFNRX0uCi0KLUBpdGVtIFNJTkdMRV9RVU9URV9TVFJJTkdTCi1AY2luZGV4IFNJTkdMRV9RVU9URV9TVFJJTkdTCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHRyZWF0IHNpbmdsZSBxdW90ZXMgYXMgc3RyaW5nIGRlbGltaXRlcnMuCi1Ob3JtYWxseSBvbmx5IGRvdWJsZSBxdW90ZXMgYXJlIGFjY2VwdGVkIGFzIHN0cmluZyBkZWxpbWl0ZXJzLgotCi1AaXRlbSBOT19TVFJJTkdfRVNDQVBFUwotQGNpbmRleCBOT19TVFJJTkdfRVNDQVBFUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBub3QgcGVybWl0IGVzY2FwZSBzZXF1ZW5jZXMgaW4gYSBzdHJpbmcuCi0KLUBpdGVtIE9OTFlfU1RBTkRBUkRfRVNDQVBFUwotQGNpbmRleCBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgd2FybiBhYm91dCB0aGUgdXNlIG9mIG5vbnN0YW5kYXJkIGVzY2FwZQotc2VxdWVuY2VzIGluIGEgc3RyaW5nLgotCi1AaXRlbSBtZF9zdGFydF9saW5lX2hvb2sKLUBjaW5kZXggbWRfc3RhcnRfbGluZV9ob29rCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbGluZS4KLQotQGl0ZW0gTEFCRUxTX1dJVEhPVVRfQ09MT05TCi1AY2luZGV4IExBQkVMU19XSVRIT1VUX0NPTE9OUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBhc3N1bWUgdGhhdCBhbnkgdGV4dCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lCi1pcyBhIGxhYmVsLCBldmVuIGlmIGl0IGRvZXMgbm90IGhhdmUgYSBjb2xvbi4KLQotQGl0ZW0gVENfU1RBUlRfTEFCRUwKLUBjaW5kZXggVENfU1RBUlRfTEFCRUwKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gY29udHJvbCB3aGF0IEdBUyBjb25zaWRlcnMgdG8gYmUgYSBsYWJlbC4gIFRoZQotZGVmYXVsdCBkZWZpbml0aW9uIGlzIHRvIGFjY2VwdCBhbnkgbmFtZSBmb2xsb3dlZCBieSBhIGNvbG9uIGNoYXJhY3Rlci4KLQotQGl0ZW0gTk9fUFNFVURPX0RPVAotQGNpbmRleCBOT19QU0VVRE9fRE9UCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIG5vdCByZXF1aXJlIHBzZXVkby1vcHMgdG8gc3RhcnQgd2l0aCBhCi1Aa2Jkey59IGNoYXJhY3Rlci4KLQotQGl0ZW0gVENfRVFVQUxfSU5fSU5TTgotQGNpbmRleCBUQ19FUVVBTF9JTl9JTlNOCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gbm9uemVybyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLXBlcm1pdHRlZCB0byBjb250YWluIGFuIEBrYmR7PX0gY2hhcmFjdGVyLiAgR0FTIHdpbGwgdXNlIHRoaXMgdG8gZGVjaWRlIGlmIGEKLUBrYmR7PX0gaXMgYW4gYXNzaWdubWVudCBvciBhbiBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gVENfRU9MX0lOX0lOU04KLUBjaW5kZXggVENfRU9MX0lOX0lOU04KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgc2hvdWxkIHJldHVybiBub256ZXJvIGlmIHRoZSBjdXJyZW50IGlucHV0IGxpbmUKLXBvaW50ZXIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIGVuZCBvZiBhIGxpbmUuCi0KLUBpdGVtIG1kX3BhcnNlX25hbWUKLUBjaW5kZXggbWRfcGFyc2VfbmFtZQotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBhbnkgc3ltYm9sIGZvdW5kIGluIGFuCi1leHByZXNzaW9uLiAgWW91IGNhbiBkZWZpbmUgdGhpcyB0byBoYW5kbGUgc3BlY2lhbCBzeW1ib2xzIGluIGEgc3BlY2lhbCB3YXkuCi1JZiBhIHN5bWJvbCBhbHdheXMgaGFzIGEgY2VydGFpbiB2YWx1ZSwgeW91IHNob3VsZCBub3JtYWxseSBlbnRlciBpdCBpbiB0aGUKLXN5bWJvbCB0YWJsZSwgcGVyaGFwcyB1c2luZyBAY29kZXtyZWdfc2VjdGlvbn0uCi0KLUBpdGVtIG1kX3VuZGVmaW5lZF9zeW1ib2wKLUBjaW5kZXggbWRfdW5kZWZpbmVkX3N5bWJvbAotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBzeW1ib2wgdGFibGUgbG9va3VwIGZhaWxzLCBiZWZvcmUgaXQKLWNyZWF0ZXMgYSBuZXcgc3ltYm9sLiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgdXNlZCB0byBzdXBwbHkgc3ltYm9scyB3aG9zZQotbmFtZSBvciB2YWx1ZSBjaGFuZ2VzIGR5bmFtaWNhbGx5LCBwb3NzaWJseSBpbiBhIGNvbnRleHQgc2Vuc2l0aXZlIHdheS4KLVByZWRlZmluZWQgc3ltYm9scyB3aXRoIGZpeGVkIHZhbHVlcywgc3VjaCBhcyByZWdpc3RlciBuYW1lcyBvciBjb25kaXRpb24KLWNvZGVzLCBhcmUgdHlwaWNhbGx5IGVudGVyZWQgZGlyZWN0bHkgaW50byB0aGUgc3ltYm9sIHRhYmxlIHdoZW4gQGNvZGV7bWRfYmVnaW59Ci1pcyBjYWxsZWQuCi0KLUBpdGVtIG1kX29wZXJhbmQKLUBjaW5kZXggbWRfb3BlcmFuZAotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBhbnkgZXhwcmVzc2lvbiB0aGF0IGNhbiBub3QgYmUgcmVjb2duaXplZC4KLVdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgQGNvZGV7aW5wdXRfbGluZV9wb2ludGVyfSB3aWxsIHBvaW50IHRvIHRoZSBzdGFydAotb2YgdGhlIGV4cHJlc3Npb24uCi0KLUBpdGVtIHRjX3VucmVjb2duaXplZF9saW5lCi1AY2luZGV4IHRjX3VucmVjb2duaXplZF9saW5lCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgd2hlbiBpdCBmaW5kcyBhIGxpbmUgdGhhdCBpdCBjYW4gbm90Ci1wYXJzZS4KLQotQGl0ZW0gbWRfZG9fYWxpZ24KLUBjaW5kZXggbWRfZG9fYWxpZ24KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaGFuZGxlIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuICBHQVMgd2lsbCBjYWxsIGl0Ci13aGVuIHRoZSBkaXJlY3RpdmUgaXMgc2VlbiBpbiB0aGUgaW5wdXQgZmlsZS4gIEZvciBleGFtcGxlLCB0aGUgaTM4NiBiYWNrZW5kCi11c2VzIHRoaXMgdG8gZ2VuZXJhdGUgZWZmaWNpZW50IG5vcCBpbnN0cnVjdGlvbnMgb2YgdmFyeWluZyBsZW5ndGhzLCBkZXBlbmRpbmcKLXVwb24gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBhbGlnbm1lbnQgd2lsbCBza2lwLgotCi1AaXRlbSBIQU5ETEVfQUxJR04KLUBjaW5kZXggSEFORExFX0FMSUdOCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGRvIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuCi1HQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LgotCi1AaXRlbSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotQGNpbmRleCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGVhY2ggdGltZSBpdCBza2lwcyBhbnkgc3BhY2UgYmVjYXVzZSBvZiBhCi1zcGFjZSBmaWxsaW5nIG9yIGFsaWdubWVudCBvciBkYXRhIGFsbG9jYXRpb24gcHNldWRvLW9wLgotCi1AaXRlbSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLUBjaW5kZXggVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24gdXNlZCBpbiBhIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wIHN1Y2ggYXMgQGNvZGV7LndvcmR9LiAgWW91IGNhbiB1c2UgdGhpcyB0byByZWNvZ25pemUgcmVsb2NhdGlvbgotZGlyZWN0aXZlcyB0aGF0IG1heSBhcHBlYXIgaW4gc3VjaCBkaXJlY3RpdmVzLgotCi1AaXRlbSBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT04KLUBjaW5kZXggQklURklFTERfQ09OU19FWFBSRVNTSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHJlY29nbml6ZSBiaXRmaWVsZCBpbnN0cnVjdGlvbnMgaW4gZGF0YQotYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLCBhcyB1c2VkIG9uIHRoZSBpOTYwLgotCi1AaXRlbSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OCi1AY2luZGV4IFJFUEVBVF9DT05TX0VYUFJFU1NJT04KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgcmVjb2duaXplIHJlcGVhdCBjb3VudHMgaW4gZGF0YSBhbGxvY2F0aW9uCi1wc2V1ZG8tb3BzLCBhcyB1c2VkIG9uIHRoZSBNSVBTLgotCi1AaXRlbSBtZF9jb25zX2FsaWduCi1AY2luZGV4IG1kX2NvbnNfYWxpZ24KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gZG8gYW55IHNwZWNpYWwgYWxpZ25tZW50IGJlZm9yZSBhIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wLgotCi1AaXRlbSBUQ19DT05TX0ZJWF9ORVcKLUBjaW5kZXggVENfQ09OU19GSVhfTkVXCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIGEgZGF0YSBhbGxvY2F0aW9uIHBzZXVkby1vcC4KLQotQGl0ZW0gVENfSU5JVF9GSVhfREFUQSAoQHZhcntmaXhwfSkKLUBjaW5kZXggVENfSU5JVF9GSVhfREFUQQotQSBDIHN0YXRlbWVudCB0byBpbml0aWFsaXplIHRoZSB0YXJnZXQgc3BlY2lmaWMgZmllbGRzIG9mIGZpeHVwIEB2YXJ7Zml4cH0uCi1UaGVzZSBmaWVsZHMgYXJlIGRlZmluZWQgd2l0aCB0aGUgQGNvZGV7VENfRklYX1RZUEV9IG1hY3JvLgotCi1AaXRlbSBUQ19GSVhfREFUQV9QUklOVCAoQHZhcntzdHJlYW19LCBAdmFye2ZpeHB9KQotQGNpbmRleCBUQ19GSVhfREFUQV9QUklOVAotQSBDIHN0YXRlbWVudCB0byBvdXRwdXQgdGFyZ2V0IHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IKLWZpeHVwIEB2YXJ7Zml4cH0gdG8gQHZhcntzdHJlYW19LiAgVGhpcyBtYWNybyBpcyBjYWxsZWQgYnkgQGNvZGV7cHJpbnRfZml4dXB9LgotCi1AaXRlbSBUQ19GUkFHX0lOSVQgKEB2YXJ7ZnJhZ3B9KQotQGNpbmRleCBUQ19GUkFHX0lOSVQKLUEgQyBzdGF0ZW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IHNwZWNpZmljIGZpZWxkcyBvZiBmcmFnIEB2YXJ7ZnJhZ3B9LgotVGhlc2UgZmllbGRzIGFyZSBkZWZpbmVkIHdpdGggdGhlIEBjb2Rle1RDX0ZSQUdfVFlQRX0gbWFjcm8uCi0KLUBpdGVtIG1kX251bWJlcl90b19jaGFycwotQGNpbmRleCBtZF9udW1iZXJfdG9fY2hhcnMKLVRoaXMgc2hvdWxkIGp1c3QgY2FsbCBlaXRoZXIgQGNvZGV7bnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbn0gb3IKLUBjb2Rle251bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW59LCB3aGljaGV2ZXIgaXMgYXBwcm9wcmlhdGUuICBPbiB0YXJnZXRzIGxpa2UKLXRoZSBNSVBTIHdoaWNoIHN1cHBvcnQgb3B0aW9ucyB0byBjaGFuZ2UgdGhlIGVuZGlhbm5lc3MsIHdoaWNoIGZ1bmN0aW9uIHRvIGNhbGwKLWlzIGEgcnVudGltZSBkZWNpc2lvbi4gIE9uIG90aGVyIHRhcmdldHMsIEBjb2Rle21kX251bWJlcl90b19jaGFyc30gY2FuIGJlIGEKLXNpbXBsZSBtYWNyby4KLQotQGl0ZW0gbWRfcmVsb2Nfc2l6ZQotQGNpbmRleCBtZF9yZWxvY19zaXplCi1UaGlzIHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiBnYXMgKG5vdAotQGNvZGV7QkZEX0FTU0VNQkxFUn0gYW5kIG5vdCBAY29kZXtNQU5ZX1NFR01FTlRTfSkuICBJdCBob2xkcyB0aGUgc2l6ZSBvZiBhCi1yZWxvY2F0aW9uIGVudHJ5LgotCi1AaXRlbSBXT1JLSU5HX0RPVF9XT1JECi1AaXRlbXggbWRfc2hvcnRfanVtcF9zaXplCi1AaXRlbXggbWRfbG9uZ19qdW1wX3NpemUKLUBpdGVteCBtZF9jcmVhdGVfc2hvcnRfanVtcAotQGl0ZW14IG1kX2NyZWF0ZV9sb25nX2p1bXAKLUBjaW5kZXggV09SS0lOR19ET1RfV09SRAotQGNpbmRleCBtZF9zaG9ydF9qdW1wX3NpemUKLUBjaW5kZXggbWRfbG9uZ19qdW1wX3NpemUKLUBjaW5kZXggbWRfY3JlYXRlX3Nob3J0X2p1bXAKLUBjaW5kZXggbWRfY3JlYXRlX2xvbmdfanVtcAotSWYgQGNvZGV7V09SS0lOR19ET1RfV09SRH0gaXMgZGVmaW5lZCwgR0FTIHdpbGwgbm90IGRvIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcKLShAcHhyZWZ7QnJva2VuIHdvcmRzfSkuICBPdGhlcndpc2UsIHlvdSBzaG91bGQgc2V0IEBjb2Rle21kX3Nob3J0X2p1bXBfc2l6ZX0gdG8KLXRoZSBzaXplIG9mIGEgc2hvcnQganVtcCAoYSBqdW1wIHRoYXQgaXMganVzdCBsb25nIGVub3VnaCB0byBqdW1wIGFyb3VuZCBhIGxvbmcKLWptcCkgYW5kIEBjb2Rle21kX2xvbmdfanVtcF9zaXplfSB0byB0aGUgc2l6ZSBvZiBhIGxvbmcganVtcCAoYSBqdW1wIHRoYXQgY2FuCi1nbyBhbnl3aGVyZSBpbiB0aGUgZnVuY3Rpb24pLCBZb3Ugc2hvdWxkIGRlZmluZSBAY29kZXttZF9jcmVhdGVfc2hvcnRfanVtcH0gdG8KLWNyZWF0ZSBhIHNob3J0IGp1bXAgYXJvdW5kIGEgbG9uZyBqdW1wLCBhbmQgZGVmaW5lIEBjb2Rle21kX2NyZWF0ZV9sb25nX2p1bXB9Ci10byBjcmVhdGUgYSBsb25nIGp1bXAuCi0KLUBpdGVtIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1AY2luZGV4IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIHNpemUgb2YgYSBAY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0KLWZyYWcgYmVmb3JlIGFueSByZWxheGluZyBpcyBkb25lLiAgSXQgbWF5IGFsc28gY3JlYXRlIGFueSBuZWNlc3NhcnkKLXJlbG9jYXRpb25zLgotCi1AaXRlbSBtZF9yZWxheF9mcmFnCi1AY2luZGV4IG1kX3JlbGF4X2ZyYWcKLVRoaXMgbWFjcm8gbWF5IGJlIGRlZmluZWQgdG8gcmVsYXggYSBmcmFnLiAgR0FTIHdpbGwgY2FsbCB0aGlzIHdpdGggdGhlIGZyYWcKLWFuZCB0aGUgY2hhbmdlIGluIHNpemUgb2YgYWxsIHByZXZpb3VzIGZyYWdzOyBAY29kZXttZF9yZWxheF9mcmFnfSBzaG91bGQKLXJldHVybiB0aGUgY2hhbmdlIGluIHNpemUgb2YgdGhlIGZyYWcuICBAeHJlZntSZWxheGF0aW9ufS4KLQotQGl0ZW0gVENfR0VORVJJQ19SRUxBWF9UQUJMRQotQGNpbmRleCBUQ19HRU5FUklDX1JFTEFYX1RBQkxFCi1JZiB5b3UgZG8gbm90IGRlZmluZSBAY29kZXttZF9yZWxheF9mcmFnfSwgeW91IG1heSBkZWZpbmUKLUBjb2Rle1RDX0dFTkVSSUNfUkVMQVhfVEFCTEV9IGFzIGEgdGFibGUgb2YgQGNvZGV7cmVsYXhfdHlwZVN9IHN0cnVjdHVyZXMuICBUaGUKLW1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBrbm93cyBob3cgdG8gdXNlIHN1Y2ggYSB0YWJsZSB0byByZWxheCBQQyByZWxhdGl2ZQotcmVmZXJlbmNlcy4gIFNlZSBAZmlsZXt0Yy1tNjhrLmN9IGZvciBhbiBleGFtcGxlLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIG1kX3ByZXBhcmVfcmVsYXhfc2NhbgotQGNpbmRleCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4KLUlmIGRlZmluZWQsIGl0IGlzIGEgQyBzdGF0ZW1lbnQgdGhhdCBpcyBpbnZva2VkIHByaW9yIHRvIHNjYW5uaW5nCi10aGUgcmVsYXggdGFibGUuCi0KLUBpdGVtIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLUBjaW5kZXggTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSBAc2FtcHtsaW5rcmVsYXh9IGlzIHNldAotKGJlY2F1c2Ugb2YgYSBjb21tYW5kIGxpbmUgb3B0aW9uLCBvciB1bmNvbmRpdGlvbmFsbHkgaW4gQGNvZGV7bWRfYmVnaW59KSwgYQotQHNhbXB7LmFsaWdufSBkaXJlY3RpdmUgd2lsbCBjYXVzZSBleHRyYSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQuICBUaGUgbGlua2VyIGNhbgotdGhlbiBkaXNjYXJkIHRoaXMgc3BhY2Ugd2hlbiByZWxheGluZyB0aGUgc2VjdGlvbi4KLQotQGl0ZW0gbWRfY29udmVydF9mcmFnCi1AY2luZGV4IG1kX2NvbnZlcnRfZnJhZwotR0FTIHdpbGwgY2FsbCB0aGlzIGZvciBlYWNoIHJzX21hY2hpbmVfZGVwZW5kZW50IGZyYWdtZW50LgotVGhlIGluc3RydWN0aW9uIGlzIGNvbXBsZXRlZCB1c2luZyB0aGUgZGF0YSBmcm9tIHRoZSByZWxheGF0aW9uIHBhc3MuCi1JdCBtYXkgYWxzbyBjcmVhdGUgYW55IG5lY2Vzc2FyeSByZWxvY2F0aW9ucy4KLUB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSBtZF9hcHBseV9maXgKLUBjaW5kZXggbWRfYXBwbHlfZml4Ci1HQVMgd2lsbCBjYWxsIHRoaXMgZm9yIGVhY2ggZml4dXAuICBJdCBzaG91bGQgc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgaW4gdGhlCi1vYmplY3QgZmlsZS4gIEBjb2Rle2ZpeHVwX3NlZ21lbnR9IHBlcmZvcm1zIGEgZ2VuZXJpYyBvdmVyZmxvdyBjaGVjayBvbiB0aGUKLUBjb2Rle3ZhbHVlVCAqdmFsfSBhcmd1bWVudCBhZnRlciBAY29kZXttZF9hcHBseV9maXh9IHJldHVybnMuICBJZiB0aGUgb3ZlcmZsb3cKLWNoZWNrIGlzIHJlbGV2YW50IGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUsIHRoZW4gQGNvZGV7bWRfYXBwbHlfZml4fSBzaG91bGQKLW1vZGlmeSBAY29kZXt2YWx1ZVQgKnZhbH0sIHR5cGljYWxseSB0byB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZS4KLQotQGl0ZW0gVENfSEFORExFU19GWF9ET05FCi1AY2luZGV4IFRDX0hBTkRMRVNfRlhfRE9ORQotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBtZWFucyB0aGF0IEBjb2Rle21kX2FwcGx5X2ZpeH0gY29ycmVjdGx5IHNldHMgdGhlCi1AY29kZXtmeF9kb25lfSBmaWVsZCBpbiB0aGUgZml4dXAuCi0KLUBpdGVtIHRjX2dlbl9yZWxvYwotQGNpbmRleCB0Y19nZW5fcmVsb2MKLUEgQGNvZGV7QkZEX0FTU0VNQkxFUn0gR0FTIHdpbGwgY2FsbCB0aGlzIHRvIGdlbmVyYXRlIGEgcmVsb2MuICBHQVMgd2lsbCBwYXNzCi10aGUgcmVzdWx0aW5nIHJlbG9jIHRvIEBjb2Rle2JmZF9pbnN0YWxsX3JlbG9jYXRpb259LiAgVGhpcyBjdXJyZW50bHkgd29ya3MKLXBvb3JseSwgYXMgQGNvZGV7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0gb2Z0ZW4gZG9lcyB0aGUgd3JvbmcgdGhpbmcsIGFuZAotaW5zdGFuY2VzIG9mIEBjb2Rle3RjX2dlbl9yZWxvY30gaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW1zLAotd2hpY2ggaW4gdHVybnMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGZpeCBAY29kZXtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufS4KLQotQGl0ZW0gUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi1AY2luZGV4IFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBtZWFucyB0aGF0IEBjb2Rle3RjX2dlbl9yZWxvY30gbWF5IHJldHVybiBtdWx0aXBsZQotcmVsb2NhdGlvbiBlbnRyaWVzIGZvciBhIHNpbmdsZSBmaXh1cC4gIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiB2YWx1ZSBvZgotQGNvZGV7dGNfZ2VuX3JlbG9jfSBpcyBhIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgYXJyYXkuCi0KLUBpdGVtIE1BWF9SRUxPQ19FWFBBTlNJT04KLUBjaW5kZXggTUFYX1JFTE9DX0VYUEFOU0lPTgotWW91IG11c3QgZGVmaW5lIHRoaXMgaWYgQGNvZGV7UkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFfSBpcyBkZWZpbmVkOyBpdAotaW5kaWNhdGVzIHRoZSBsYXJnZXN0IG51bWJlciBvZiByZWxvY3Mgd2hpY2ggQGNvZGV7dGNfZ2VuX3JlbG9jfSBtYXkgcmV0dXJuIGZvcgotYSBzaW5nbGUgZml4dXAuCi0KLUBpdGVtIHRjX2ZpeF9hZGp1c3RhYmxlCi1AY2luZGV4IHRjX2ZpeF9hZGp1c3RhYmxlCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHdoZXRoZXIgYSBmaXh1cCBhZ2FpbnN0IGEgbG9jYWxseSBkZWZpbmVkCi1zeW1ib2wgc2hvdWxkIGJlIGFkanVzdGVkIHRvIGJlIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLiAgSXQgc2hvdWxkIHJldHVybiBhCi1ub24temVybyB2YWx1ZSBpZiB0aGUgYWRqdXN0bWVudCBpcyBhY2NlcHRhYmxlLgotCi1AaXRlbSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04KLUBjaW5kZXggTURfUENSRUxfRlJPTV9TRUNUSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEKLVBDIHJlbGF0aXZlIGZpeHVwIGFuZCB0aGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgUEMgcmVsYXRpdmUgYWRqdXN0bWVudCBzaG91bGQKLWJlIG1hZGUuICBPbiBtYW55IHByb2Nlc3NvcnMsIHRoZSBiYXNlIG9mIGEgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gaXMgdGhlIG5leHQKLWluc3RydWN0aW9uLCBzbyB0aGlzIG1hY3JvIHdvdWxkIHJldHVybiB0aGUgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLgotCi1AaXRlbSBtZF9wY3JlbF9mcm9tCi1AY2luZGV4IG1kX3BjcmVsX2Zyb20KLVRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7TURfUENSRUxfRlJPTV9TRUNUSU9OfS4gIFRoZSBkaWZmZXJlbmNlIGlzCi10aGF0IEBjb2Rle21kX3BjcmVsX2Zyb219IGRvZXMgbm90IHRha2UgYSBzZWN0aW9uIGFyZ3VtZW50LgotCi1AaXRlbSB0Y19mcm9iX2xhYmVsCi1AY2luZGV4IHRjX2Zyb2JfbGFiZWwKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBlYWNoIHRpbWUgYSBsYWJlbCBpcyBkZWZpbmVkLgotCi1AaXRlbSBtZF9zZWN0aW9uX2FsaWduCi1AY2luZGV4IG1kX3NlY3Rpb25fYWxpZ24KLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LCB0bwotcGVybWl0IHRoZSBDUFUgYmFja2VuZCB0byBhZGp1c3QgdGhlIGFsaWdubWVudCBvZiBhIHNlY3Rpb24uCi0KLUBpdGVtIHRjX2Zyb2Jfc2VjdGlvbgotQGNpbmRleCB0Y19mcm9iX3NlY3Rpb24KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgYSBAY29kZXtCRkRfQVNTRU1CTEVSfSBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoCi1zZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LgotCi1AaXRlbSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotQGNpbmRleCB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdmFsdWVzIGFyZQotcmVzb2x2ZWQsIGJ1dCBiZWZvcmUgdGhlIGZpeHVwcyBoYXZlIGJlZW4gY2hhbmdlZCBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gc2VjdGlvbgotc3ltYm9scy4KLQotQGl0ZW0gdGNfZnJvYl9zeW1ib2wKLUBjaW5kZXggdGNfZnJvYl9zeW1ib2wKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaCBzeW1ib2wuICBZb3UgY2FuIGluZGljYXRlCi10aGF0IHRoZSBzeW1ib2wgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0IGZpbGUgYnkgZGVmaW5pbmluZyB0aGlzCi1tYWNybyB0byBzZXQgaXRzIHNlY29uZCBhcmd1bWVudCB0byBhIG5vbi16ZXJvIHZhbHVlLgotCi1AaXRlbSB0Y19mcm9iX2ZpbGUKLUBjaW5kZXggdGNfZnJvYl9maWxlCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbgotY29tcGxldGVkLCBidXQgYmVmb3JlIHRoZSByZWxvY2F0aW9ucyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotCi1AaXRlbSB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHJlbG9jcyBoYXZlIGJlZW4KLWdlbmVyYXRlZC4KLQotQGl0ZW0gTElTVElOR19IRUFERVIKLUEgc3RyaW5nIHRvIHVzZSBvbiB0aGUgaGVhZGVyIGxpbmUgb2YgYSBsaXN0aW5nLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgc2ltcGx5Ci1AY29kZXsiR0FTIExJU1RJTkcifS4KLQotQGl0ZW0gTElTVElOR19XT1JEX1NJWkUKLVRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHV0IGludG8gYSB3b3JkIGluIGEgbGlzdGluZy4gIFRoaXMgYWZmZWN0cyB0aGUgd2F5IHRoZQotYnl0ZXMgYXJlIGNsdW1wZWQgdG9nZXRoZXIgaW4gdGhlIGxpc3RpbmcuICBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAyIG1pZ2h0Ci1wcmludCBAc2FtcHsxMjM0IDU2Nzh9IHdoZXJlIGEgdmFsdWUgb2YgMSB3b3VsZCBwcmludCBAc2FtcHsxMiAzNCA1NiA3OH0uICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgNC4KLQotQGl0ZW0gTElTVElOR19MSFNfV0lEVEgKLVRoZSBudW1iZXIgb2Ygd29yZHMgb2YgZGF0YSB0byBwcmludCBvbiB0aGUgZmlyc3QgbGluZSBvZiBhIGxpc3RpbmcgZm9yIGEKLXBhcnRpY3VsYXIgc291cmNlIGxpbmUsIHdoZXJlIGVhY2ggd29yZCBpcyBAY29kZXtMSVNUSU5HX1dPUkRfU0laRX0gYnl0ZXMuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgMS4KLQotQGl0ZW0gTElTVElOR19MSFNfV0lEVEhfU0VDT05ECi1MaWtlIEBjb2Rle0xJU1RJTkdfTEhTX1dJRFRIfSwgYnV0IGFwcGx5aW5nIHRvIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgbGluZQotb2YgdGhlIGRhdGEgcHJpbnRlZCBmb3IgYSBwYXJ0aWN1bGFyIHNvdXJjZSBsaW5lLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4KLQotQGl0ZW0gTElTVElOR19MSFNfQ09OVF9MSU5FUwotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB0byBwcmludCBpbiBhIGxpc3RpbmcgZm9yIGEgcGFydGljdWxhcgotc291cmNlIGxpbmUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0LgotCi1AaXRlbSBMSVNUSU5HX1JIU19XSURUSAotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJpbnQgZnJvbSBvbmUgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpcyAxMDAuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE9iamVjdCBmb3JtYXQgYmFja2VuZAotQHN1YnNlY3Rpb24gV3JpdGluZyBhbiBvYmplY3QgZm9ybWF0IGJhY2tlbmQKLUBjaW5kZXggb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1AY2luZGV4IEBmaWxle29iai1AdmFye2ZtdH19Ci0KLUFzIHdpdGggdGhlIENQVSBiYWNrZW5kLCB0aGUgb2JqZWN0IGZvcm1hdCBiYWNrZW5kIG11c3QgZGVmaW5lIGEgZmV3IHRoaW5ncywKLWFuZCBtYXkgZGVmaW5lIHNvbWUgb3RoZXIgdGhpbmdzLiAgVGhlIGludGVyZmFjZSB0byB0aGUgb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1pcyBnZW5lcmFsbHkgc2ltcGxlcjsgbW9zdCBvZiB0aGUgc3VwcG9ydCBmb3IgYW4gb2JqZWN0IGZpbGUgZm9ybWF0IGNvbnNpc3RzIG9mCi1kZWZpbmluZyBhIG51bWJlciBvZiBwc2V1ZG8tb3BzLgotCi1UaGUgb2JqZWN0IGZvcm1hdCBAZmlsZXsuaH0gZmlsZSBtdXN0IGluY2x1ZGUgQGZpbGV7dGFyZy1jcHUuaH0uCi0KLVRoaXMgc2VjdGlvbiB3aWxsIG9ubHkgZGVmaW5lIHRoZSBAY29kZXtCRkRfQVNTRU1CTEVSfSB2ZXJzaW9uIG9mIEdBUy4gIEl0IGlzCi1pbXBvc3NpYmxlIHRvIHN1cHBvcnQgYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IHVzaW5nIGFueSBvdGhlciB2ZXJzaW9uIGFueWhvdywKLWFzIHRoZSBvcmlnaW5hbCBHQVMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIGEub3V0LCBhbmQgdGhlIEBjb2Rle01BTllfU0VHTUVOVFN9Ci1HQVMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIENPRkYuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gT0JKX0B2YXJ7Zm9ybWF0fQotQGNpbmRleCBPQkpfQHZhcntmb3JtYXR9Ci1CeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIGluIHRoZSBAZmlsZXsuaH0gZmlsZS4gIEZvcgotZXhhbXBsZSwgQGZpbGV7b2JqLWVsZi5ofSBkZWZpbmVzIEBjb2Rle09CSl9FTEZ9LiAgWW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoaXMKLWlmIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmljIGNvZGUgdG8gdGhlIENQVSBmaWxlLgotCi1AaXRlbSBvYmpfYmVnaW4KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGFzc2VtYmx5LCBhZnRlcgotdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgYWxsIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50Ci1pbml0aWFsaXphdGlvbnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KLQotQGl0ZW0gb2JqX2FwcF9maWxlCi1AY2luZGV4IG9ial9hcHBfZmlsZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBpbnZva2UgaXQgd2hlbiBpdCBzZWVzIGEgQGNvZGV7LmZpbGV9Ci1wc2V1ZG8tb3Agb3IgYSBAc2FtcHsjfSBsaW5lIGFzIHVzZWQgYnkgdGhlIEMgcHJlcHJvY2Vzc29yLgotCi1AaXRlbSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotQGNpbmRleCBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyB0byBjb3B5IG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbQotb25lIHN5bWJvbCB0byBhbm90aGVyLiAgR0FTIHdpbGwgY2FsbCBpdCB3aGVuIG9uZSBzeW1ib2wgaXMgZXF1YXRlZCB0bwotYW5vdGhlci4KLQotQGl0ZW0gb2JqX2ZpeF9hZGp1c3RhYmxlCi1AY2luZGV4IG9ial9maXhfYWRqdXN0YWJsZQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgZml4dXAgYWdhaW5zdCBhIGxvY2FsbHkgZGVmaW5lZAotc3ltYm9sIHNob3VsZCBiZSBhZGp1c3RlZCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbC4gIEl0IHNob3VsZCByZXR1cm4gYQotbm9uLXplcm8gdmFsdWUgaWYgdGhlIGFkanVzdG1lbnQgaXMgYWNjZXB0YWJsZS4KLQotQGl0ZW0gb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCi1AY2luZGV4IG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE9LIHRvIHVzZSBhIHNlY3Rpb24gc3ltYm9sIGluCi1hIHJlbG9jYXRlaW9uIGVudHJ5LiAgSWYgaXQgaXMgbm90LCBHQVMgd2lsbCBkZWZpbmUgYSBuZXcgc3ltYm9sIGF0IHRoZSBzdGFydAotb2YgYSBzZWN0aW9uLgotCi1AaXRlbSBFTUlUX1NFQ1RJT05fU1lNQk9MUwotQGNpbmRleCBFTUlUX1NFQ1RJT05fU1lNQk9MUwotWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyB3aXRoIGEgemVybyB2YWx1ZSBpZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZQotc2VjdGlvbiBzeW1ib2xzIGluIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgbWFjcm8KLWlzIG9uZS4KLQotQGl0ZW0gb2JqX2FkanVzdF9zeW10YWIKLUBjaW5kZXggb2JqX2FkanVzdF9zeW10YWIKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgaW52b2tlIGl0IGp1c3QgYmVmb3JlIHNldHRpbmcgdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIG91dHB1dCBCRkQuICBGb3IgZXhhbXBsZSwgdGhlIENPRkYgc3VwcG9ydCB1c2VzIHRoaXMgbWFjcm8gdG8KLWdlbmVyYXRlIGEgQGNvZGV7LmZpbGV9IHN5bWJvbCBpZiBub25lIHdhcyBnZW5lcmF0ZWQgcHJldmlvdXNseS4KLQotQGl0ZW0gU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotQGNpbmRleCBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoYXQgc3RhYnMgc2hvdWxkIGJlIHBsYWNlZCBpbiBzZXBhcmF0ZQotc2VjdGlvbnMsIGFzIGluIEVMRi4KLQotQGl0ZW0gSU5JVF9TVEFCX1NFQ1RJT04KLUBjaW5kZXggSU5JVF9TVEFCX1NFQ1RJT04KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5pdGlhbGl6ZSB0aGUgc3RhYnMgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBpdGVtIE9CSl9QUk9DRVNTX1NUQUIKLUBjaW5kZXggT0JKX1BST0NFU1NfU1RBQgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBkbyBzcGVjaWZpYyBwcm9jZXNzaW5nIG9uIGEgc3RhYnMgZW50cnkuCi0KLUBpdGVtIG9ial9mcm9iX3NlY3Rpb24KLUBjaW5kZXggb2JqX2Zyb2Jfc2VjdGlvbgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoIHNlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUKLWFzc2VtYmx5LgotCi1AaXRlbSBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLUBjaW5kZXggb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB2YWx1ZXMgYXJlCi1yZXNvbHZlZCwgYnV0IGJlZm9yZSB0aGUgZml4dXBzIGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20gbG9jYWwgc3ltYm9scyB0byBzZWN0aW9uCi1zeW1ib2xzLgotCi1AaXRlbSBvYmpfZnJvYl9zeW1ib2wKLUBjaW5kZXggb2JqX2Zyb2Jfc3ltYm9sCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZm9yIGVhY2ggc3ltYm9sLiAgWW91IGNhbiBpbmRpY2F0ZQotdGhhdCB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9iamVjdCBmaWxlIGJ5IGRlZmluaW5pbmcgdGhpcwotbWFjcm8gdG8gc2V0IGl0cyBzZWNvbmQgYXJndW1lbnQgdG8gYSBub24temVybyB2YWx1ZS4KLQotQGl0ZW0gb2JqX2Zyb2JfZmlsZQotQGNpbmRleCBvYmpfZnJvYl9maWxlCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbgotY29tcGxldGVkLCBidXQgYmVmb3JlIHRoZSByZWxvY2F0aW9ucyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotCi1AaXRlbSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSByZWxvY3MgaGF2ZSBiZWVuCi1nZW5lcmF0ZWQuCi0KLUBpdGVtIFNFVF9TRUNUSU9OX1JFTE9DUyAoQHZhcntzZWN9LCBAdmFye3JlbG9jc30sIEB2YXJ7bn0pCi1AY2luZGV4IFNFVF9TRUNUSU9OX1JFTE9DUwotSWYgeW91IGRlZmluZSB0aGlzLCBpdCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIHNldCBmb3IKLXRoZSBzZWN0aW9uIEB2YXJ7c2VjfS4gIFRoZSBsaXN0IG9mIHJlbG9jYXRpb25zIGlzIGluIEB2YXJ7cmVsb2NzfSwgYW5kIHRoZQotbnVtYmVyIG9mIHJlbG9jYXRpb25zIGlzIGluIEB2YXJ7bn0uICBUaGlzIGlzIG9ubHkgdXNlZCB3aXRoCi1AY29kZXtCRkRfQVNTRU1CTEVSfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgRW11bGF0aW9ucwotQHN1YnNlY3Rpb24gV3JpdGluZyBlbXVsYXRpb24gZmlsZXMKLQotTm9ybWFsbHkgeW91IGRvIG5vdCBoYXZlIHRvIHdyaXRlIGFuIGVtdWxhdGlvbiBmaWxlLiAgWW91IGNhbiBqdXN0IHVzZQotQGZpbGV7dGUtZ2VuZXJpYy5ofS4KLQotSWYgeW91IGRvIHdyaXRlIHlvdXIgb3duIGVtdWxhdGlvbiBmaWxlLCBpdCBtdXN0IGluY2x1ZGUgQGZpbGV7b2JqLWZvcm1hdC5ofS4KLQotQW4gZW11bGF0aW9uIGZpbGUgd2lsbCBvZnRlbiBkZWZpbmUgQGNvZGV7VEVfQHZhcntFTX19OyB0aGlzIG1heSB0aGVuIGJlIHVzZWQKLWluIG90aGVyIGZpbGVzIHRvIGNoYW5nZSB0aGUgb3V0cHV0LgotCi1Abm9kZSBSZWxheGF0aW9uCi1Ac2VjdGlvbiBSZWxheGF0aW9uCi1AY2luZGV4IHJlbGF4YXRpb24KLQotQGRmbntSZWxheGF0aW9ufSBpcyBhIGdlbmVyaWMgdGVybSB1c2VkIHdoZW4gdGhlIHNpemUgb2Ygc29tZSBpbnN0cnVjdGlvbiBvcgotZGF0YSBkZXBlbmRzIHVwb24gdGhlIHZhbHVlIG9mIHNvbWUgc3ltYm9sIG9yIG90aGVyIGRhdGEuCi0KLUdBUyBrbm93cyB0byByZWxheCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIHVzaW5nIGEgdGFibGUuCi1Zb3UgY2FuIGFsc28gZGVmaW5lIGFyYml0cmFyaWx5IGNvbXBsZXggZm9ybXMgb2YgcmVsYXhhdGlvbiB5b3Vyc2VsZi4KLQotQG1lbnUKLSogUmVsYXhpbmcgd2l0aCBhIHRhYmxlOjogICAgICAgUmVsYXhpbmcgd2l0aCBhIHRhYmxlCi0qIEdlbmVyYWwgcmVsYXhpbmc6OiAgICAgICAgICAgIEdlbmVyYWwgcmVsYXhpbmcKLUBlbmQgbWVudQotCi1Abm9kZSBSZWxheGluZyB3aXRoIGEgdGFibGUKLUBzdWJzZWN0aW9uIFJlbGF4aW5nIHdpdGggYSB0YWJsZQotCi1JZiB5b3UgZG8gbm90IGRlZmluZSBAY29kZXttZF9yZWxheF9mcmFnfSwgYW5kIHlvdSBkbyBkZWZpbmUKLUBjb2Rle1RDX0dFTkVSSUNfUkVMQVhfVEFCTEV9LCBHQVMgd2lsbCByZWxheCBAY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0gZnJhZ3MKLWJhc2VkIG9uIHRoZSBmcmFnIHN1YnR5cGUgYW5kIHRoZSBkaXNwbGFjZW1lbnQgdG8gc29tZSBzcGVjaWZpZWQgdGFyZ2V0Ci1hZGRyZXNzLiAgVGhlIGJhc2ljIGlkZWEgaXMgdGhhdCBzZXZlcmFsIG1hY2hpbmVzIGhhdmUgZGlmZmVyZW50IGFkZHJlc3NpbmcKLW1vZGVzIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gc3BlY2lmeSBkaWZmZXJlbnQgcmFuZ2VzIG9mIHZhbHVlcywgd2l0aAotc3VjY2Vzc2l2ZSBtb2RlcyBhYmxlIHRvIGFjY2VzcyB3aWRlciByYW5nZXMsIGluY2x1ZGluZyB0aGUgZW50aXJldHkgb2YgdGhlCi1wcmV2aW91cyByYW5nZS4gIFNtYWxsZXIgcmFuZ2VzIGFyZSBhc3N1bWVkIHRvIGJlIG1vcmUgZGVzaXJhYmxlIChwZXJoYXBzIHRoZQotaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgb25lIHdvcmQgaW5zdGVhZCBvZiB0d28gb3IgdGhyZWUpOyBpZiB0aGlzIGlzIG5vdCB0aGUKLWNhc2UsIGRvbid0IGRlc2NyaWJlIHRoZSBzbWFsbGVyLXJhbmdlLCBpbmZlcmlvciBtb2RlLgotCi1UaGUgQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgb2YgYSBmcmFnIGlzIGFuIGluZGV4IGludG8gYSBDUFUtc3BlY2lmaWMKLXJlbGF4YXRpb24gdGFibGUuICBUaGF0IHRhYmxlIGVudHJ5IGluZGljYXRlcyB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHRoYXQgY2FuIGJlCi1zdG9yZWQsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIGhhdmUgdG8gYmUgYWRkZWQgdG8gdGhlIGZyYWcgdG8KLWFjY29tb2RhdGUgdGhlIGFkZHJlc3NpbmcgbW9kZSwgYW5kIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBlbnRyeSB0byBleGFtaW5lIGlmCi10aGUgdmFsdWUgdG8gYmUgc3RvcmVkIGlzIG91dHNpZGUgdGhlIHJhbmdlIGFjY2Vzc2libGUgYnkgdGhlIGN1cnJlbnQKLWFkZHJlc3NpbmcgbW9kZS4gIFRoZSBAY29kZXtmcl9zeW1ib2x9IGZpZWxkIG9mIHRoZSBmcmFnIGluZGljYXRlcyB3aGF0IHN5bWJvbAotaXMgdG8gYmUgYWNjZXNzZWQ7IHRoZSBAY29kZXtmcl9vZmZzZXR9IGZpZWxkIGlzIGFkZGVkIGluLgotCi1JZiB0aGUgQGNvZGV7VENfUENSRUxfQURKVVNUfSBtYWNybyBpcyBkZWZpbmVkLCB3aGljaCBjdXJyZW50bHkgc2hvdWxkIG9ubHkgaGFwcGVuCi1mb3IgdGhlIE5TMzJrIGZhbWlseSwgdGhlIEBjb2Rle1RDX1BDUkVMX0FESlVTVH0gbWFjcm8gaXMgY2FsbGVkIG9uIHRoZSBmcmFnIHRvCi1jb21wdXRlIGFuIGFkanVzdG1lbnQgdG8gYmUgbWFkZSB0byB0aGUgZGlzcGxhY2VtZW50LgotCi1UaGUgdmFsdWUgZml0dGVkIGJ5IHRoZSByZWxheGF0aW9uIGNvZGUgaXMgYWx3YXlzIGFzc3VtZWQgdG8gYmUgYSBkaXNwbGFjZW1lbnQKLWZyb20gdGhlIGN1cnJlbnQgZnJhZy4gIChNb3JlIHNwZWNpZmljYWxseSwgZnJvbSBAY29kZXtmcl9maXh9IGJ5dGVzIGludG8gdGhlCi1mcmFnLikKLUBpZ25vcmUKLVRoaXMgc2VlbXMga2luZGEgc2lsbHkuICBXaGF0IGFib3V0IGZpdHRpbmcgc21hbGwgYWJzb2x1dGUgdmFsdWVzPyAgSSBzdXBwb3NlCi1AY29kZXttZF9hc3NlbWJsZX0gaXMgc3VwcG9zZWQgdG8gdGFrZSBjYXJlIG9mIHRoYXQsIGJ1dCBpZiB0aGUgb3BlcmFuZCBpcyBhCi1kaWZmZXJlbmNlIGJldHdlZW4gc3ltYm9scywgaXQgbWlnaHQgbm90IGJlIGFibGUgdG8sIGlmIHRoZSBkaWZmZXJlbmNlIHdhcyBub3QKLWNvbXB1dGFibGUgeWV0LgotQGVuZCBpZ25vcmUKLQotVGhlIGVuZCBvZiB0aGUgcmVsYXhhdGlvbiBzZXF1ZW5jZSBpcyBpbmRpY2F0ZWQgYnkgYSBgYG5leHQnJyB2YWx1ZSBvZiAwLiAgVGhpcwotbWVhbnMgdGhhdCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhYmxlIGNhbid0IGJlIHVzZWQuCi0KLUZvciBzb21lIGNvbmZpZ3VyYXRpb25zLCB0aGUgbGlua2VyIGNhbiBkbyByZWxheGluZyB3aXRoaW4gYSBzZWN0aW9uIG9mIGFuCi1vYmplY3QgZmlsZS4gIElmIGNhbGwgaW5zdHJ1Y3Rpb25zIG9mIHZhcmlvdXMgc2l6ZXMgZXhpc3QsIHRoZSBsaW5rZXIgY2FuCi1kZXRlcm1pbmUgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gZWFjaCBpbnN0YW5jZSwgd2hlbiBhIHN5bWJvbCdzIHZhbHVlIGlzCi1yZXNvbHZlZC4gIEluIG9yZGVyIGZvciB0aGUgbGlua2VyIHRvIGF2b2lkIHdhc3Rpbmcgc3BhY2UgYW5kIGhhdmluZyB0byBpbnNlcnQKLW5vLW9wIGluc3RydWN0aW9ucywgaXQgbXVzdCBiZSBhYmxlIHRvIGV4cGFuZCBvciBzaHJpbmsgdGhlIHNlY3Rpb24gY29udGVudHMKLXdoaWxlIHN0aWxsIHByZXNlcnZpbmcgaW50cmEtc2VjdGlvbiByZWZlcmVuY2VzIGFuZCBtZWV0aW5nIGFsaWdubWVudAotcmVxdWlyZW1lbnRzLgotCi1Gb3IgdGhlIGk5NjAgdXNpbmcgYi5vdXQgZm9ybWF0LCBubyBleHBhbnNpb24gaXMgZG9uZTsgaW5zdGVhZCwgZWFjaAotQHNhbXB7LmFsaWdufSBkaXJlY3RpdmUgY2F1c2VzIGV4dHJhIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCwgZW5vdWdoIHRoYXQgd2hlbgotdGhlIGxpbmtlciBpcyByZWxheGluZyBhIHNlY3Rpb24gYW5kIHJlbW92aW5nIHVubmVlZGVkIHNwYWNlLCBpdCBjYW4gZGlzY2FyZAotc29tZSBvciBhbGwgb2YgdGhpcyBleHRyYSBwYWRkaW5nIGFuZCBjYXVzZSB0aGUgZm9sbG93aW5nIGRhdGEgdG8gYmUgY29ycmVjdGx5Ci1hbGlnbmVkLgotCi1Gb3IgdGhlIEg4LzMwMCwgSSB0aGluayB0aGUgbGlua2VyIGV4cGFuZHMgY2FsbHMgdGhhdCBjYW4ndCByZWFjaCwgYW5kIGRvZXNuJ3QKLXdvcnJ5IGFib3V0IGFsaWdubWVudCBpc3N1ZXM7IHRoZSBjcHUgcHJvYmFibHkgbmV2ZXIgbmVlZHMgYW55IHNpZ25pZmljYW50Ci1hbGlnbm1lbnQgYmV5b25kIHRoZSBpbnN0cnVjdGlvbiBzaXplLgotCi1UaGUgcmVsYXhhdGlvbiB0YWJsZSB0eXBlIGNvbnRhaW5zIHRoZXNlIGZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBsb25nIHJseF9mb3J3YXJkCi1Gb3J3YXJkIHJlYWNoLCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KLUBpdGVtIGxvbmcgcmx4X2JhY2t3YXJkCi1CYWNrd2FyZCByZWFjaCwgbXVzdCBiZSB6ZXJvIG9yIG5lZ2F0aXZlLgotQGl0ZW0gcmx4X2xlbmd0aAotTGVuZ3RoIGluIGJ5dGVzIG9mIHRoaXMgYWRkcmVzc2luZyBtb2RlLgotQGl0ZW0gcmx4X21vcmUKLUluZGV4IG9mIHRoZSBuZXh0LWxvbmdlciByZWxheCBzdGF0ZSwgb3IgemVybyBpZiB0aGVyZSBpcyBubyBuZXh0IHJlbGF4IHN0YXRlLgotQGVuZCB0YWJsZQotCi1UaGUgcmVsYXhhdGlvbiBpcyBkb25lIGluIEBjb2Rle3JlbGF4X3NlZ21lbnR9IGluIEBmaWxle3dyaXRlLmN9LiAgVGhlCi1kaWZmZXJlbmNlIGluIHRoZSBsZW5ndGggZmllbGRzIGJldHdlZW4gdGhlIG9yaWdpbmFsIG1vZGUgYW5kIHRoZSBvbmUgZmluYWxseQotY2hvc2VuIGJ5IHRoZSByZWxheGluZyBjb2RlIGlzIHRha2VuIGFzIHRoZSBzaXplIGJ5IHdoaWNoIHRoZSBjdXJyZW50IGZyYWcgd2lsbAotYmUgaW5jcmVhc2VkIGluIHNpemUuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGluaXRpYWwgcmVsYXhpbmcgbW9kZSBoYXMgYSBsZW5ndGgKLW9mIDIgYnl0ZXMsIGFuZCBiZWNhdXNlIG9mIHRoZSBzaXplIG9mIHRoZSBkaXNwbGFjZW1lbnQsIGl0IGdldHMgdXBncmFkZWQgdG8gYQotbW9kZSB3aXRoIGEgc2l6ZSBvZiA2IGJ5dGVzLCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYWcgd2lsbCBncm93IGJ5IDQgYnl0ZXMuCi0oVGhlIGluaXRpYWwgdHdvIGJ5dGVzIHNob3VsZCBoYXZlIGJlZW4gcGFydCBvZiB0aGUgZml4ZWQgcG9ydGlvbiBvZiB0aGUgZnJhZywKLXNpbmNlIGl0IGlzIGFscmVhZHkga25vd24gdGhhdCB0aGV5IHdpbGwgYmUgb3V0cHV0LikgIFRoaXMgZ3Jvd3RoIG11c3QgYmUKLWVmZmVjdGVkIGJ5IEBjb2Rle21kX2NvbnZlcnRfZnJhZ307IGl0IHNob3VsZCBpbmNyZWFzZSB0aGUgQGNvZGV7ZnJfZml4fSBmaWVsZAotYnkgdGhlIGFwcHJvcHJpYXRlIHNpemUsIGFuZCBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBvZiB0aGUgZnJhZy4KLShFbm91Z2ggc3BhY2UgZm9yIHRoZSBtYXhpbXVtIGdyb3d0aCBzaG91bGQgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiB0aGUgY2FsbCB0bwotZnJhZ192YXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4pCi0KLUlmIHJlbG9jYXRpb24gcmVjb3JkcyBhcmUgbmVlZGVkLCB0aGV5IHNob3VsZCBiZSBlbWl0dGVkIGJ5Ci1AY29kZXttZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheH0uICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBleGFtaW5lIHRoZSB0YXJnZXQKLXN5bWJvbCBvZiB0aGUgc3VwcGxpZWQgZnJhZyBhbmQgY29ycmVjdCB0aGUgQGNvZGV7ZnJfc3VidHlwZX0gb2YgdGhlIGZyYWcgaWYKLW5lZWRlZC4gIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGlmIHRoZSBzeW1ib2wgaGFzIG5vdCB5ZXQgYmVlbiBkZWZpbmVkLAotaXQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQgbGF0ZXI7IGhvd2V2ZXIsIGl0cyB2YWx1ZSBtYXkgc3RpbGwgY2hhbmdlIGlmIHRoZQotc2VjdGlvbiBpdCBpcyBpbiBnZXRzIHJlbGF4ZWQuCi0KLVVzdWFsbHksIGlmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcyB0aGUgZnJhZyAoZ2l2ZW4gYnkgdGhlCi1AdmFye3NlY30gYXJndW1lbnQpLCB0aGUgbmFycm93ZXN0IGxpa2VseSByZWxheGF0aW9uIG1vZGUgaXMgc3RvcmVkIGluCi1AY29kZXtmcl9zdWJ0eXBlfSwgYW5kIHRoYXQncyB0aGF0LgotCi1JZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgb3IgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiAoYW5kIHRoZXJlZm9yZSBtb3ZlYWJsZQotdG8gYW4gYXJiaXRyYXJpbHkgbGFyZ2UgZGlzdGFuY2UpLCB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgcmVsYXhhdGlvbiBtb2RlIGlzCi1zcGVjaWZpZWQsIEBjb2Rle2ZpeF9uZXd9IGlzIGNhbGxlZCB0byBwcm9kdWNlIHRoZSByZWxvY2F0aW9uIHJlY29yZCwKLUBjb2Rle2ZyX2ZpeH0gaXMgaW5jcmVhc2VkIHRvIGluY2x1ZGUgdGhlIHJlbG9jYXRlZCBmaWVsZCAocmVtZW1iZXIsIHRoaXMKLXN0b3JhZ2Ugd2FzIGFsbG9jYXRlZCB3aGVuIEBjb2Rle2ZyYWdfdmFyfSB3YXMgY2FsbGVkKSwgYW5kIEBjb2Rle2ZyYWdfd2FuZX0gaXMKLWNhbGxlZCB0byBjb252ZXJ0IHRoZSBmcmFnIHRvIGFuIEBjb2Rle3JzX2ZpbGx9IGZyYWcgd2l0aCBubyB2YXJpYW50IHBhcnQuCi1Tb21ldGltZXMgY2hhbmdpbmcgYWRkcmVzc2luZyBtb2RlcyBtYXkgYWxzbyByZXF1aXJlIHJld3JpdGluZyB0aGUgaW5zdHJ1Y3Rpb24uCi1JdCBjYW4gYmUgYWNjZXNzZWQgdmlhIEBjb2Rle2ZyX29wY29kZX0gb3IgQGNvZGV7ZnJfZml4fS4KLQotU29tZXRpbWVzIEBjb2Rle2ZyX3Zhcn0gaXMgaW5jcmVhc2VkIGluc3RlYWQsIGFuZCBAY29kZXtmcmFnX3dhbmV9IGlzIG5vdAotY2FsbGVkLiAgSSdtIG5vdCBzdXJlLCBidXQgSSB0aGluayB0aGlzIGlzIHRvIGtlZXAgQGNvZGV7ZnJfZml4fSByZWZlcnJpbmcgdG8KLWFuIGVhcmxpZXIgYnl0ZSwgYW5kIEBjb2Rle2ZyX3N1YnR5cGV9IHNldCB0byBAY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0gc28KLXRoYXQgQGNvZGV7bWRfY29udmVydF9mcmFnfSB3aWxsIGdldCBjYWxsZWQuCi0KLUBub2RlIEdlbmVyYWwgcmVsYXhpbmcKLUBzdWJzZWN0aW9uIEdlbmVyYWwgcmVsYXhpbmcKLQotSWYgdXNpbmcgYSBzaW1wbGUgdGFibGUgaXMgbm90IHN1aXRhYmxlLCB5b3UgbWF5IGltcGxlbWVudCBhcmJpdHJhcmlseSBjb21wbGV4Ci1yZWxheGF0aW9uIHNlbWFudGljcyB5b3Vyc2VsZi4gIEZvciBleGFtcGxlLCB0aGUgTUlQUyBiYWNrZW5kIHVzZXMgdGhpcyB0byBlbWl0Ci1kaWZmZXJlbnQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzIGRlcGVuZGluZyB1cG9uIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgYmVpbmcKLWFjY2Vzc2VkLgotCi1XaGVuIHlvdSBhc3NlbWJsZSBhbiBpbnN0cnVjdGlvbiB0aGF0IG1heSBuZWVkIHJlbGF4YXRpb24sIHlvdSBzaG91bGQgYWxsb2NhdGUKLWEgZnJhZyB1c2luZyBAY29kZXtmcmFnX3Zhcn0gb3IgQGNvZGV7ZnJhZ192YXJpYW50fSB3aXRoIGEgdHlwZSBvZgotQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9LiAgWW91IHNob3VsZCBzdG9yZSBzb21lIHNvcnQgb2YgaW5mb3JtYXRpb24gaW4gdGhlCi1AY29kZXtmcl9zdWJ0eXBlfSBmaWVsZCBzbyB0aGF0IHlvdSBjYW4gZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggdGhlIGZyYWcKLWxhdGVyLgotCi1XaGVuIEdBUyByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUsIGl0IHdpbGwgbG9vayB0aHJvdWdoIHRoZSBmcmFncyBhbmQKLXdvcmsgb3V0IHRoZWlyIGZpbmFsIHNpemVzLgotCi1HQVMgd2lsbCBmaXJzdCBjYWxsIEBjb2Rle21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4fSBvbiBlYWNoCi1AY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0gZnJhZy4gIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gYW4gZXN0aW1hdGVkIHNpemUKLWZvciB0aGUgZnJhZy4KLQotR0FTIHdpbGwgdGhlbiBsb29wIG92ZXIgdGhlIGZyYWdzLCBjYWxsaW5nIEBjb2Rle21kX3JlbGF4X2ZyYWd9IG9uIGVhY2gKLUBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBmcmFnLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBjaGFuZ2UgaW4KLXNpemUgb2YgdGhlIGZyYWcuICBHQVMgd2lsbCBrZWVwIGxvb3Bpbmcgb3ZlciB0aGUgZnJhZ3MgdW50aWwgbm9uZSBvZiB0aGUgZnJhZ3MKLWNoYW5nZXMgc2l6ZS4KLQotQG5vZGUgQnJva2VuIHdvcmRzCi1Ac2VjdGlvbiBCcm9rZW4gd29yZHMKLUBjaW5kZXggaW50ZXJuYWxzLCBicm9rZW4gd29yZHMKLUBjaW5kZXggYnJva2VuIHdvcmRzCi0KLVNvbWUgY29tcGlsZXJzLCBpbmNsdWRpbmcgR0NDLCB3aWxsIHNvbWV0aW1lcyBlbWl0IHN3aXRjaCB0YWJsZXMgc3BlY2lmeWluZwotMTYtYml0IEBjb2Rley53b3JkfSBkaXNwbGFjZW1lbnRzIHRvIGJyYW5jaCB0YXJnZXRzLCBhbmQgYnJhbmNoIGluc3RydWN0aW9ucwotdGhhdCBsb2FkIGVudHJpZXMgZnJvbSB0aGF0IHRhYmxlIHRvIGNvbXB1dGUgdGhlIHRhcmdldCBhZGRyZXNzLiAgSWYgdGhpcyBpcwotZG9uZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCB0aGVyZSBpcyBhIGNoYW5jZSAoYXQgbGVhc3Qgd2l0aCByZWFsbHkgbGFyZ2UKLWZ1bmN0aW9ucykgdGhhdCB0aGUgZGlzcGxhY2VtZW50IHdpbGwgbm90IGZpdCBpbiAxNiBiaXRzLiAgVGhlIGFzc2VtYmxlcgotaGFuZGxlcyB0aGlzIHVzaW5nIGEgY29uY2VwdCBjYWxsZWQgQGRmbnticm9rZW4gd29yZHN9LiAgVGhpcyBpZGVhIGlzIHdlbGwKLW5hbWVkLCBzaW5jZSB0aGVyZSBpcyBhbiBpbXBsaWVkIHByb21pc2UgdGhhdCB0aGUgMTYtYml0IGZpZWxkIHdpbGwgaW4gZmFjdAotaG9sZCB0aGUgc3BlY2lmaWVkIGRpc3BsYWNlbWVudC4KLQotSWYgYnJva2VuIHdvcmQgcHJvY2Vzc2luZyBpcyBlbmFibGVkLCBhbmQgYSBzaXR1YXRpb24gbGlrZSB0aGlzIGlzIGVuY291bnRlcmVkLAotdGhlIGFzc2VtYmxlciB3aWxsIGluc2VydCBhIGp1bXAgaW5zdHJ1Y3Rpb24gaW50byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLCBjbG9zZQotZW5vdWdoIHRvIGJlIHJlYWNoZWQgd2l0aCB0aGUgMTYtYml0IGRpc3BsYWNlbWVudC4gIFRoaXMganVtcCBpbnN0cnVjdGlvbiB3aWxsCi10cmFuc2ZlciB0byB0aGUgcmVhbCBkZXNpcmVkIHRhcmdldCBhZGRyZXNzLiAgVGh1cywgYXMgbG9uZyBhcyB0aGUgQGNvZGV7LndvcmR9Ci12YWx1ZSByZWFsbHkgaXMgdXNlZCBhcyBhIGRpc3BsYWNlbWVudCB0byBjb21wdXRlIGFuIGFkZHJlc3MgdG8ganVtcCB0bywgdGhlCi1uZXQgZWZmZWN0IHdpbGwgYmUgY29ycmVjdCAobWludXMgYSB2ZXJ5IHNtYWxsIGVmZmljaWVuY3kgY29zdCkuICBJZgotQGNvZGV7LndvcmR9IGRpcmVjdGl2ZXMgd2l0aCBsYWJlbCBkaWZmZXJlbmNlcyBmb3IgdmFsdWVzIGFyZSB1c2VkIGZvciBvdGhlcgotcHVycG9zZXMsIGhvd2V2ZXIsIHRoaW5ncyBtYXkgbm90IHdvcmsgcHJvcGVybHkuICBGb3IgdGFyZ2V0cyB3aGljaCB1c2UgYnJva2VuCi13b3JkcywgdGhlIEBzYW1wey1LfSBvcHRpb24gd2lsbCB3YXJuIHdoZW4gYSBicm9rZW4gd29yZCBpcyBkaXNjb3ZlcmVkLgotCi1UaGUgYnJva2VuIHdvcmQgY29kZSBpcyB0dXJuZWQgb2ZmIGJ5IHRoZSBAY29kZXtXT1JLSU5HX0RPVF9XT1JEfSBtYWNyby4gIEl0Ci1pc24ndCBuZWVkZWQgaWYgQGNvZGV7LndvcmR9IGVtaXRzIGEgdmFsdWUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gYW4gYWRkcmVzcwotKG9yLCBtb3JlIGNvcnJlY3RseSwgYW55IHBvc3NpYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gYWRkcmVzc2VzKS4KLQotQG5vZGUgSW50ZXJuYWwgZnVuY3Rpb25zCi1Ac2VjdGlvbiBJbnRlcm5hbCBmdW5jdGlvbnMKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBiYXNpYyBpbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCBieSBHQVMuCi0KLUBtZW51Ci0qIFdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzOjogIFdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzCi0qIEhhc2ggdGFibGVzOjogICAgICAgICAgICAgICAgIEhhc2ggdGFibGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMKLUBzdWJzZWN0aW9uIFdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzCi0KLUBkZWZ0eXBlZnVuICBAe0B9IGludCBoYWRfd2FybmluZ3MgKHZvaWQpCi1AZGVmdHlwZWZ1bnggQHtAfSBpbnQgaGFkX2Vycm9ycyAodm9pZCkKLVJldHVybnMgbm9uLXplcm8gaWYgYW55IHdhcm5pbmdzIG9yIGVycm9ycywgcmVzcGVjdGl2ZWx5LCBoYXZlIGJlZW4gcHJpbnRlZAotZHVyaW5nIHRoaXMgaW52b2NhdGlvbi4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IHZvaWQgYXNfcGVycm9yIChjb25zdCBjaGFyICpAdmFye2dyaXBlfSwgY29uc3QgY2hhciAqQHZhcntmaWxlbmFtZX0pCi1EaXNwbGF5cyBhIEJGRCBvciBzeXN0ZW0gZXJyb3IsIHRoZW4gY2xlYXJzIHRoZSBlcnJvciBzdGF0dXMuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gIEB7QH0gdm9pZCBhc190c2t0c2sgKGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBhc193YXJuIChjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgYXNfYmFkIChjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgYXNfZmF0YWwgKGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotVGhlc2UgZnVuY3Rpb25zIGRpc3BsYXkgbWVzc2FnZXMgYWJvdXQgc29tZXRoaW5nIGFtaXNzIHdpdGggdGhlIGlucHV0IGZpbGUsIG9yCi1pbnRlcm5hbCBwcm9ibGVtcyBpbiB0aGUgYXNzZW1ibGVyIGl0c2VsZi4gIFRoZSBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZQotbnVtYmVyIGFyZSBwcmludGVkLCBmb2xsb3dlZCBieSB0aGUgc3VwcGxpZWQgbWVzc2FnZSwgZm9ybWF0dGVkIHVzaW5nCi1AY29kZXt2ZnByaW50Zn0sIGFuZCBhIGZpbmFsIG5ld2xpbmUuCi0KLUFuIGVycm9yIGluZGljYXRlZCBieSBAY29kZXthc19iYWR9IHdpbGwgcmVzdWx0IGluIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMgd2hlbgotdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQuICBDYWxsaW5nIEBjb2Rle2FzX2ZhdGFsfSB3aWxsIHJlc3VsdCBpbiBpbW1lZGlhdGUKLXRlcm1pbmF0aW9uIG9mIHRoZSBhc3NlbWJsZXIgcHJvY2Vzcy4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IHZvaWQgYXNfd2Fybl93aGVyZSAoY2hhciAqQHZhcntmaWxlfSwgdW5zaWduZWQgaW50IEB2YXJ7bGluZX0sIGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBhc19iYWRfd2hlcmUgKGNoYXIgKkB2YXJ7ZmlsZX0sIHVuc2lnbmVkIGludCBAdmFye2xpbmV9LCBjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLVRoZXNlIHZhcmlhbnRzIHBlcm1pdCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLCBhbmQgYXJlCi11c2VkIHdoZW4gcHJvYmxlbXMgYXJlIGRldGVjdGVkIHdoZW4gcmVwcm9jZXNzaW5nIGluZm9ybWF0aW9uIHNhdmVkIGF3YXkgd2hlbgotcHJvY2Vzc2luZyBzb21lIGVhcmxpZXIgcGFydCBvZiB0aGUgZmlsZS4gIEZvciBleGFtcGxlLCBmaXh1cHMgYXJlIHByb2Nlc3NlZAotYWZ0ZXIgYWxsIGlucHV0IGhhcyBiZWVuIHJlYWQsIGJ1dCBtZXNzYWdlcyBhYm91dCBmaXh1cHMgc2hvdWxkIHJlZmVyIHRvIHRoZQotb3JpZ2luYWwgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyIHRoYXQgdGhleSBhcmUgYXBwbGljYWJsZSB0by4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IHZvaWQgZnByaW50X3ZhbHVlIChGSUxFICpAdmFye2ZpbGV9LCB2YWx1ZVQgQHZhcnt2YWx9KQotQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBzcHJpbnRfdmFsdWUgKGNoYXIgKkB2YXJ7YnVmfSwgdmFsdWVUIEB2YXJ7dmFsfSkKLVRoZXNlIGZ1bmN0aW9ucyBhcmUgaGVscGZ1bCBmb3IgY29udmVydGluZyBhIEBjb2Rle3ZhbHVlVH0gdmFsdWUgaW50byBwcmludGFibGUKLWZvcm1hdCwgaW4gY2FzZSBpdCdzIHdpZGVyIHRoYW4gbW9kZXMgdGhhdCBAY29kZXsqcHJpbnRmfSBjYW4gaGFuZGxlLiAgSWYgdGhlCi10eXBlIGlzIG5hcnJvdyBlbm91Z2gsIGEgZGVjaW1hbCBudW1iZXIgd2lsbCBiZSBwcm9kdWNlZDsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlCi1pbiBoZXhhZGVjaW1hbC4gIFRoZSB2YWx1ZSBpdHNlbGYgaXMgbm90IGV4YW1pbmVkIHRvIG1ha2UgdGhpcyBkZXRlcm1pbmF0aW9uLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIEhhc2ggdGFibGVzCi1Ac3Vic2VjdGlvbiBIYXNoIHRhYmxlcwotQGNpbmRleCBoYXNoIHRhYmxlcwotCi1AZGVmdHlwZWZ1biBAe0B9IEB7c3RydWN0IGhhc2hfY29udHJvbCAqQH0gaGFzaF9uZXcgKHZvaWQpCi1DcmVhdGVzIHRoZSBoYXNoIHRhYmxlIGNvbnRyb2wgc3RydWN0dXJlLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gdm9pZCBoYXNoX2RpZSAoc3RydWN0IGhhc2hfY29udHJvbCAqKQotRGVzdHJveSBhIGhhc2ggdGFibGUuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSBQVFIgaGFzaF9kZWxldGUgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqKQotRGVsZXRlcyBlbnRyeSBmcm9tIHRoZSBoYXNoIHRhYmxlLCByZXR1cm5zIHRoZSB2YWx1ZSBpdCBoYWQuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSBQVFIgaGFzaF9yZXBsYWNlIChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKiwgUFRSKQotVXBkYXRlcyB0aGUgdmFsdWUgZm9yIGFuIGVudHJ5IGFscmVhZHkgaW4gdGhlIHRhYmxlLCByZXR1cm5pbmcgdGhlIG9sZCB2YWx1ZS4KLUlmIG5vIGVudHJ5IHdhcyBmb3VuZCwganVzdCByZXR1cm5zIE5VTEwuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSBAe2NvbnN0IGNoYXIgKkB9IGhhc2hfaW5zZXJ0IChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKiwgUFRSKQotSW5zZXJ0aW5nIGEgdmFsdWUgYWxyZWFkeSBpbiB0aGUgdGFibGUgaXMgYW4gZXJyb3IuCi1SZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IEB7Y29uc3QgY2hhciAqQH0gaGFzaF9qYW0gKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqLCBQVFIpCi1JbnNlcnRzIGlmIHRoZSB2YWx1ZSBpc24ndCBhbHJlYWR5IHByZXNlbnQsIHVwZGF0ZXMgaXQgaWYgaXQgaXMuCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgVGVzdCBzdWl0ZQotQHNlY3Rpb24gVGVzdCBzdWl0ZQotQGNpbmRleCB0ZXN0IHN1aXRlCi0KLVRoZSB0ZXN0IHN1aXRlIGlzIGtpbmQgb2YgbGFtZSBmb3IgbW9zdCBwcm9jZXNzb3JzLiAgT2Z0ZW4gaXQgb25seSBjaGVja3MgdG8KLXNlZSBpZiBhIGNvdXBsZSBvZiBmaWxlcyBjYW4gYmUgYXNzZW1ibGVkIHdpdGhvdXQgdGhlIGFzc2VtYmxlciByZXBvcnRpbmcgYW55Ci1lcnJvcnMuICBGb3IgbW9yZSBjb21wbGV0ZSB0ZXN0aW5nLCB3cml0ZSBhIHRlc3Qgd2hpY2ggZWl0aGVyIGV4YW1pbmVzIHRoZQotYXNzZW1ibGVyIGxpc3RpbmcsIG9yIHJ1bnMgQGNvZGV7b2JqZHVtcH0gYW5kIGV4YW1pbmVzIGl0cyBvdXRwdXQuICBGb3IgdGhlCi1sYXR0ZXIsIHRoZSBUQ0wgcHJvY2VkdXJlIEBjb2Rle3J1bl9kdW1wX3Rlc3R9IG1heSBjb21lIGluIGhhbmR5LiAgSXQgdGFrZXMgdGhlCi1iYXNlIG5hbWUgb2YgYSBmaWxlLCBhbmQgbG9va3MgZm9yIEBmaWxle0B2YXJ7ZmlsZX0uZH0uICBUaGlzIGZpbGUgc2hvdWxkCi1jb250YWluIGFzIGl0cyBpbml0aWFsIGxpbmVzIGEgc2V0IG9mIHZhcmlhYmxlIHNldHRpbmdzIGluIEBzYW1weyN9IGNvbW1lbnRzLAotaW4gdGhlIGZvcm06Ci0KLUBleGFtcGxlCi0gICAgICAgICNAdmFye3Zhcm5hbWV9OiBAdmFye3ZhbHVlfQotQGVuZCBleGFtcGxlCi0KLVRoZSBAdmFye3Zhcm5hbWV9IG1heSBiZSBAY29kZXtvYmpkdW1wfSwgQGNvZGV7bm19LCBvciBAY29kZXthc30sIGluIHdoaWNoIGNhc2UKLWl0IHNwZWNpZmllcyB0aGUgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gdGhlIHNwZWNpZmllZCBwcm9ncmFtcy4gIEV4YWN0bHkgb25lCi1vZiBAY29kZXtvYmpkdW1wfSBvciBAY29kZXtubX0gbXVzdCBiZSBzcGVjaWZpZWQsIGFzIHRoYXQgYWxzbyBzcGVjaWZpZXMgd2hpY2gKLXByb2dyYW0gdG8gcnVuIGFmdGVyIHRoZSBhc3NlbWJsZXIgaGFzIGZpbmlzaGVkLiAgSWYgQHZhcnt2YXJuYW1lfSBpcwotQGNvZGV7c291cmNlfSwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZTsgb3RoZXJ3aXNlLAotQGZpbGV7QHZhcntmaWxlfS5zfSBpcyB1c2VkLiAgSWYgQHZhcnt2YXJuYW1lfSBpcyBAY29kZXtuYW1lfSwgaXQgc3BlY2lmaWVzIHRoZQotbmFtZSBvZiB0aGUgdGVzdCB0byBiZSB1c2VkIGluIHRoZSBAY29kZXtwYXNzfSBvciBAY29kZXtmYWlsfSBtZXNzYWdlcy4KLQotVGhlIG5vbi1jb21tZW50ZWQgcGFydHMgb2YgdGhlIGZpbGUgYXJlIGludGVycHJldGVkIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIG9uZQotcGVyIGxpbmUuICBCbGFuayBsaW5lcyBpbiB0aGUgQGNvZGV7b2JqZHVtcH0gb3IgQGNvZGV7bm19IG91dHB1dCBhcmUgc2tpcHBlZCwKLWFzIGFyZSBibGFuayBsaW5lcyBpbiB0aGUgQGNvZGV7LmR9IGZpbGU7IHRoZSBvdGhlciBsaW5lcyBhcmUgdGVzdGVkIHRvIHNlZSBpZgotdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSBwcm9ncmFtIG91dHB1dC4gIElmIGl0IGRvZXMgbm90LCB0aGUgdGVzdAotZmFpbHMuCi0KLU5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoZSB0ZXN0cyBtdXN0IGJlIG1vZGlmaWVkIGlmIHRoZSBAY29kZXtvYmpkdW1wfSBvdXRwdXQKLXN0eWxlIGlzIGNoYW5nZWQuCi0KLUBieWUKLUBjIExvY2FsIFZhcmlhYmxlczoKLUBjIGZpbGwtY29sdW1uOiA3OQotQGMgRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL2R3YXJmMmRiZy5jIGIvZ2FzL2R3YXJmMmRiZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzM1NTkyLi4wMDAwMDAwCi0tLSBhL2dhcy9kd2FyZjJkYmcuYworKysgL2Rldi9udWxsCkBAIC0xLDc2OSArMCwwIEBACi0vKiBkd2FyZjJkYmcuYyAtIERXQVJGMiBkZWJ1ZyBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIExvZ2ljYWwgbGluZSBudW1iZXJzIGNhbiBiZSBjb250cm9sbGVkIGJ5IHRoZSBjb21waWxlciB2aWEgdGhlCi0gICBmb2xsb3dpbmcgdHdvIGRpcmVjdGl2ZXM6Ci0KLQkuZmlsZSBGSUxFTk8gImZpbGUuYyIKLQkubG9jICBGSUxFTk8gTElORU5PIFtDT0xVTU5dCi0KLSAgIEZJTEVOTyBpcyB0aGUgZmlsZW51bWJlci4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJkd2FyZjJkYmcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCi0KLS8qIFNpbmNlIHdlIGNhbid0IGdlbmVyYXRlIHRoZSBwcm9sb2cgdW50aWwgdGhlIGJvZHkgaXMgY29tcGxldGUsIHdlCi0gICB1c2UgdGhyZWUgZGlmZmVyZW50IHN1YnNlZ21lbnRzIGZvciAuZGVidWdfbGluZTogb25lIGhvbGRpbmcgdGhlCi0gICBwcm9sb2csIG9uZSBmb3IgdGhlIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgaW5mbywgYW5kIG9uZSBmb3IgdGhlCi0gICBib2R5ICgic3RhdGVtZW50IHByb2dyYW0iKS4gICovCi0jZGVmaW5lIERMX1BST0xPRwkwCi0jZGVmaW5lIERMX0ZJTEVTCTEKLSNkZWZpbmUgRExfQk9EWQkJMgotCi0vKiBGaXJzdCBzcGVjaWFsIGxpbmUgb3BjZGUgLSBsZWF2ZSByb29tIGZvciB0aGUgc3RhbmRhcmQgb3Bjb2Rlcy4KLSAgIE5vdGU6IElmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGlzLCB5b3UnbGwgaGF2ZSB0byB1cGRhdGUgdGhlCi0gICAic3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHMiIHRhYmxlIHRoYXQgaXMgZW1pdHRlZCBiZWxvdyBpbgotICAgZHdhcmYyX2ZpbmlzaCgpLiAgKi8KLSNkZWZpbmUgRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UJCTEwCi0KLSNpZm5kZWYgRFdBUkYyX0xJTkVfQkFTRQotICAvKiBNaW5pbXVtIGxpbmUgb2Zmc2V0IGluIGEgc3BlY2lhbCBsaW5lIGluZm8uIG9wY29kZS4gIFRoaXMgdmFsdWUKLSAgICAgd2FzIGNob3NlbiB0byBnaXZlIGEgcmVhc29uYWJsZSByYW5nZSBvZiB2YWx1ZXMuICAqLwotIyBkZWZpbmUgRFdBUkYyX0xJTkVfQkFTRQkJLTUKLSNlbmRpZgotCi0vKiBSYW5nZSBvZiBsaW5lIG9mZnNldHMgaW4gYSBzcGVjaWFsIGxpbmUgaW5mby4gb3Bjb2RlLiAgKi8KLSNpZm5kZWYgRFdBUkYyX0xJTkVfUkFOR0UKLSMgZGVmaW5lIERXQVJGMl9MSU5FX1JBTkdFCQkxNAotI2VuZGlmCi0KLSNpZm5kZWYgRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RICi0gIC8qIERlZmluZSB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBtaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aCAoaW4KLSAgICAgYnl0ZXMpLiAgVGhpcyB2YWx1ZSBzaG91bGQgYmUgcmF0aGVyIHRvbyBzbWFsbCB0aGFuIHRvbyBiaWcuICAqLwotIyBkZWZpbmUgRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RICTQKLSNlbmRpZgotCi0vKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBpc19zdG10X3N0YXJ0IGZsYWcuCi0gICBJbiB0aGUgcHJlc2VudCBpbXBsZW1lbnRhdGlvbiwgd2UgZG8gbm90IG1hcmsgYW55IGxpbmVzIGFzCi0gICB0aGUgYmVnaW5uaW5nIG9mIGEgc291cmNlIHN0YXRlbWVudCwgYmVjYXVzZSB0aGF0IGluZm9ybWF0aW9uCi0gICBpcyBub3QgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEdDQyBmcm9udC1lbmQuICAqLwotI2RlZmluZQlEV0FSRjJfTElORV9ERUZBVUxUX0lTX1NUTVQJMQotCi0vKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBpc19zdG10X3N0YXJ0IGZsYWcuCi0gICBJbiB0aGUgcHJlc2VudCBpbXBsZW1lbnRhdGlvbiwgd2UgZG8gbm90IG1hcmsgYW55IGxpbmVzIGFzCi0gICB0aGUgYmVnaW5uaW5nIG9mIGEgc291cmNlIHN0YXRlbWVudCwgYmVjYXVzZSB0aGF0IGluZm9ybWF0aW9uCi0gICBpcyBub3QgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEdDQyBmcm9udC1lbmQuICAqLwotI2RlZmluZQlEV0FSRjJfTElORV9ERUZBVUxUX0lTX1NUTVQJMQotCi0vKiBHaXZlbiBhIHNwZWNpYWwgb3AsIHJldHVybiB0aGUgbGluZSBza2lwIGFtb3VudC4gICovCi0jZGVmaW5lIFNQRUNJQUxfTElORShvcCkgXAotCSgoKG9wKSAtIERXQVJGMl9MSU5FX09QQ09ERV9CQVNFKSVEV0FSRjJfTElORV9SQU5HRSArIERXQVJGMl9MSU5FX0JBU0UpCi0KLS8qIEdpdmVuIGEgc3BlY2lhbCBvcCwgcmV0dXJuIHRoZSBhZGRyZXNzIHNraXAgYW1vdW50IChpbiB1bml0cyBvZgotICAgRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RILiAgKi8KLSNkZWZpbmUgU1BFQ0lBTF9BRERSKG9wKSAoKChvcCkgLSBEV0FSRjJfTElORV9PUENPREVfQkFTRSkvRFdBUkYyX0xJTkVfUkFOR0UpCi0KLS8qIFRoZSBtYXhpbXVtIGFkZHJlc3Mgc2tpcCBhbW91bnQgdGhhdCBjYW4gYmUgZW5jb2RlZCB3aXRoIGEgc3BlY2lhbCBvcC4gICovCi0jZGVmaW5lIE1BWF9TUEVDSUFMX0FERFJfREVMVEEJCVNQRUNJQUxfQUREUigyNTUpCi0KLSNkZWZpbmUgSU5JVElBTF9TVEFURQkJCQkJCVwKLSAgLyogSW5pdGlhbGl6ZSBhcyBwZXIgRFdBUkYyLjAgc3RhbmRhcmQuICAqLwkJCVwKLSAgMCwJCQkJCS8qIGFkZHJlc3MgKi8JCVwKLSAgMSwJCQkJCS8qIGZpbGUgKi8JCVwKLSAgMSwJCQkJCS8qIGxpbmUgKi8JCVwKLSAgMCwJCQkJCS8qIGNvbHVtbiAqLwkJXAotICBEV0FSRjJfTElORV9ERUZBVUxUX0lTX1NUTVQsCQkvKiBpc19zdG10ICovCQlcCi0gIDAsCQkJCQkvKiBiYXNpY19ibG9jayAqLwlcCi0gIDEJCQkJCS8qIGVtcHR5X3NlcXVlbmNlICovCi0KLXN0YXRpYyBzdHJ1Y3QKLSAgewotICAgIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGUgYXMgcGVyIERXQVJGMiBtYW51YWw6ICovCi0gICAgc3RydWN0IGR3YXJmMl9zbQotICAgICAgewotCWFkZHJlc3NUIGFkZHI7Ci0JdW5zaWduZWQgaW50IGZpbGVudW07Ci0JdW5zaWduZWQgaW50IGxpbmU7Ci0JdW5zaWduZWQgaW50IGNvbHVtbjsKLQl1bnNpZ25lZCBpbnQKLQkgIGlzX3N0bXQgOiAxLAotCSAgYmFzaWNfYmxvY2sgOiAxLAotCSAgZW1wdHlfc2VxdWVuY2UgOiAxOwkJLyogY3VycmVudCBjb2RlIHNlcXVlbmNlIGhhcyBubyBEV0FSRjIgZGlyZWN0aXZlcz8gKi8KLSAgICAgIH0KLSAgICBzbTsKLQotICAgIHVuc2lnbmVkIGludAotICAgICAgYW55X2R3YXJmMl9kaXJlY3RpdmVzIDogMTsJLyogZGlkIHdlIGVtaXQgYW55IERXQVJGMiBsaW5lIGRlYnVnIGRpcmVjdGl2ZXM/ICovCi0KLSAgICBmcmFnUyAqIGZyYWc7CS8qIGZyYWcgdGhhdCAiYWRkciIgaXMgcmVsYXRpdmUgdG8gKi8KLSAgICBzZWdUIHRleHRfc2VnOwkvKiB0ZXh0IHNlZ21lbnQgImFkZHIiIGlzIHJlbGF0aXZlIHRvICovCi0gICAgc3Vic2VnVCB0ZXh0X3N1YnNlZzsKLSAgICBzZWdUIGxpbmVfc2VnOwkvKiAiLmRlYnVnX2xpbmUiIHNlZ21lbnQgKi8KLSAgICBpbnQgbGFzdF9maWxlbmFtZTsJLyogaW5kZXggb2YgbGFzdCBmaWxlbmFtZSB0aGF0IHdhcyB1c2VkICovCi0gICAgaW50IG51bV9maWxlbmFtZXM7CS8qIGluZGV4IG9mIGxhc3QgZmlsZW5hbWUgaW4gdXNlICovCi0gICAgaW50IGZpbGVuYW1lX2xlbjsJLyogbGVuZ3RoIG9mIHRoZSBmaWxlbmFtZSBhcnJheSAqLwotICAgIHN0cnVjdAotICAgICAgewotCWludCBkaXI7CS8qIHZhbGlkIGFmdGVyIGdlbl9kaXJfbGlzdCgpIG9ubHkgKi8KLQljaGFyICpuYW1lOyAvKiBmdWxsIHBhdGggYmVmb3JlIGdlbl9kaXJfbGlzdCgpLCBmaWxlbmFtZSBhZnRlcndhcmRzICovCi0gICAgICB9Ci0gICAgKmZpbGU7Ci0KLSAgICBzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyBjdXJyZW50OwkvKiBjdXJyZW50IHNvdXJjZSBpbmZvOiAqLwotCi0gICAgLyogY291bnRlcnMgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzOiAqLwotICAgIHVuc2lnbmVkIGludCBudW1fbGluZV9lbnRyaWVzOwotICAgIHVuc2lnbmVkIGludCBvcGNvZGVfaGlzdFsyNTZdOwkvKiBoaXN0b2dyYW0gb2Ygb3Bjb2RlIGZyZXF1ZW5jaWVzICovCi0gIH0KLWxzID0KLSAgewotICAgIHsKLSAgICAgIElOSVRJQUxfU1RBVEUKLSAgICB9LAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICBOVUxMLAotICAgIHsgTlVMTCwgMCwgMCwgMCwgMCB9LAotICAgIDAsCi0gICAgewotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotICAgIH0KLSAgfTsKLQotCi0vKiBGdW5jdGlvbiBwcm90b3R5cGVzOiAqLwotc3RhdGljIHZvaWQgb3V0X3VsZWIxMjggUEFSQU1TICgoYWRkcmVzc1QpKTsKLXN0YXRpYyB2b2lkIG91dF9zbGViMTI4IFBBUkFNUyAoKG9mZnNldFQpKTsKLXN0YXRpYyB2b2lkIGdlbl9hZGRyX2xpbmUgUEFSQU1TICgoaW50LCBhZGRyZXNzVCkpOwotc3RhdGljIHZvaWQgcmVzZXRfc3RhdGVfbWFjaGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBvdXRfc2V0X2FkZHIgUEFSQU1TICgoYWRkcmVzc1QpKTsKLXN0YXRpYyB2b2lkIG91dF9lbmRfc2VxdWVuY2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBnZXRfZmlsZW51bSBQQVJBTVMgKChpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2VuX2Rpcl9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdlbl9maWxlX2xpc3QgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcHJpbnRfc3RhdHMgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotCi0KLSNkZWZpbmUgb3V0X2J5dGUoYnl0ZSkJRlJBR19BUFBFTkRfMV9DSEFSKGJ5dGUpCi0jZGVmaW5lIG91dF9vcGNvZGUob3BjKQkob3V0X2J5dGUgKChvcGMpKSwgKytscy5vcGNvZGVfaGlzdFsob3BjKSAmIDB4ZmZdKQotCi0vKiBPdXRwdXQgYW4gdW5zaWduZWQgImxpdHRsZS1lbmRpYW4gYmFzZSAxMjgiIG51bWJlci4gICovCi1zdGF0aWMgdm9pZAotb3V0X3VsZWIxMjggKHZhbHVlKQotICAgICBhZGRyZXNzVCB2YWx1ZTsKLXsKLSAgdW5zaWduZWQgY2hhciBieXRlLCBtb3JlID0gMHg4MDsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSB2YWx1ZSAmIDB4N2Y7Ci0gICAgICB2YWx1ZSA+Pj0gNzsKLSAgICAgIGlmICh2YWx1ZSA9PSAwKQotCW1vcmUgPSAwOwotICAgICAgb3V0X2J5dGUgKG1vcmUgfCBieXRlKTsKLSAgICB9Ci0gIHdoaWxlIChtb3JlKTsKLX0KLQotLyogT3V0cHV0IGEgc2lnbmVkICJsaXR0bGUtZW5kaWFuIGJhc2UgMTI4IiBudW1iZXIuICAqLwotc3RhdGljIHZvaWQKLW91dF9zbGViMTI4ICh2YWx1ZSkKLSAgICAgb2Zmc2V0VCB2YWx1ZTsKLXsKLSAgdW5zaWduZWQgY2hhciBieXRlLCBtb3JlID0gMHg4MDsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSB2YWx1ZSAmIDB4N2Y7Ci0gICAgICB2YWx1ZSA+Pj0gNzsKLSAgICAgIGlmICgoKHZhbHVlID09IDApICYmICgoYnl0ZSAmIDB4NDApID09IDApKQotCSAgfHwgKCh2YWx1ZSA9PSAtMSkgJiYgKChieXRlICYgMHg0MCkgIT0gMCkpKQotCW1vcmUgPSAwOwotICAgICAgb3V0X2J5dGUgKG1vcmUgfCBieXRlKTsKLSAgICB9Ci0gIHdoaWxlIChtb3JlKTsKLX0KLQotLyogRW5jb2RlIGEgcGFpciBvZiBsaW5lIGFuZCBhZGRyZXNzIHNraXBzIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLgotICAgTm90ZSB0aGF0IHRoZSBsaW5lIHNraXAgaXMgc2lnbmVkLCB3aGVyZWFzIHRoZSBhZGRyZXNzIHNraXAgaXMKLSAgIHVuc2lnbmVkLiAgKi8KLXN0YXRpYyB2b2lkCi1nZW5fYWRkcl9saW5lIChsaW5lX2RlbHRhLCBhZGRyX2RlbHRhKQotICAgICBpbnQgbGluZV9kZWx0YTsKLSAgICAgYWRkcmVzc1QgYWRkcl9kZWx0YTsKLXsKLSAgdW5zaWduZWQgaW50IHRtcCwgb3Bjb2RlOwotCi0gIHRtcCA9IGxpbmVfZGVsdGEgLSBEV0FSRjJfTElORV9CQVNFOwotCi0gIGlmICh0bXAgPj0gRFdBUkYyX0xJTkVfUkFOR0UpCi0gICAgewotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX2FkdmFuY2VfbGluZSk7Ci0gICAgICBvdXRfc2xlYjEyOCAobGluZV9kZWx0YSk7Ci0gICAgICB0bXAgPSAwIC0gRFdBUkYyX0xJTkVfQkFTRTsKLSAgICAgIGxpbmVfZGVsdGEgPSAwOwotICAgIH0KLQotICB0bXAgKz0gRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0U7Ci0KLSAgLyogdHJ5IHVzaW5nIGEgc3BlY2lhbCBvcGNvZGU6ICovCi0gIG9wY29kZSA9IHRtcCArIGFkZHJfZGVsdGEqRFdBUkYyX0xJTkVfUkFOR0U7Ci0gIGlmIChvcGNvZGUgPD0gMjU1KQotICAgIHsKLSAgICAgIG91dF9vcGNvZGUgKG9wY29kZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHRyeSB1c2luZyBEV19MTlNfY29uc3RfYWRkX3BjIGZvbGxvd2VkIGJ5IHNwZWNpYWwgb3A6ICovCi0gIG9wY29kZSA9IHRtcCArIChhZGRyX2RlbHRhIC0gTUFYX1NQRUNJQUxfQUREUl9ERUxUQSkqRFdBUkYyX0xJTkVfUkFOR0U7Ci0gIGlmIChvcGNvZGUgPD0gMjU1KQotICAgIHsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19jb25zdF9hZGRfcGMpOwotICAgICAgb3V0X29wY29kZSAob3Bjb2RlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgb3V0X29wY29kZSAoRFdfTE5TX2FkdmFuY2VfcGMpOwotICBvdXRfdWxlYjEyOCAoYWRkcl9kZWx0YSk7Ci0KLSAgaWYgKGxpbmVfZGVsdGEpCi0gICAgb3V0X29wY29kZSAodG1wKTsJCS8qIG91dHB1dCBsaW5lLWRlbHRhICovCi0gIGVsc2UKLSAgICBvdXRfb3Bjb2RlIChEV19MTlNfY29weSk7CS8qIGFwcGVuZCBuZXcgcm93IHdpdGggY3VycmVudCBpbmZvICovCi19Ci0KLXN0YXRpYyB2b2lkCi1yZXNldF9zdGF0ZV9tYWNoaW5lICgpCi17Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHdhcmYyX3NtIGluaXRpYWxfc3RhdGUgPSB7IElOSVRJQUxfU1RBVEUgfTsKLQotICBscy5zbSA9IGluaXRpYWxfc3RhdGU7Ci19Ci0KLS8qIFNldCBhbiBhYnNvbHV0ZSBhZGRyZXNzIChtYXkgcmVzdWx0cyBpbiBhIHJlbG9jYXRpb24gZW50cnkpOiAqLwotc3RhdGljIHZvaWQKLW91dF9zZXRfYWRkciAoYWRkcikKLSAgICAgYWRkcmVzc1QgYWRkcjsKLXsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWc7Ci0gIHNlZ1Qgc2F2ZWRfc2VnOwotICBleHByZXNzaW9uUyBleHByOwotICBzeW1ib2xTICpzeW07Ci0gIGludCBieXRlc19wZXJfYWRkcmVzczsKLQotICBzYXZlZF9zZWcgPSBub3dfc2VnOwotICBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0gIHN1YnNlZ19zZXQgKGxzLnRleHRfc2VnLCBscy50ZXh0X3N1YnNlZyk7Ci0gIHN5bSA9IHN5bWJvbF9uZXcgKCIuTDBcMDAxIiwgbm93X3NlZywgYWRkciwgZnJhZ19ub3cpOwotCi0gIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYnl0ZXNfcGVyX2FkZHJlc3MgPSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpIC8gODsKLSNlbHNlCi0gIC8qIEZJWE1FLiAgKi8KLSAgYnl0ZXNfcGVyX2FkZHJlc3MgPSA0OwotI2VuZGlmCi0KLSAgb3V0X29wY29kZSAoRFdfTE5TX2V4dGVuZGVkX29wKTsKLSAgb3V0X3VsZWIxMjggKGJ5dGVzX3Blcl9hZGRyZXNzICsgMSk7Ci0KLSAgb3V0X29wY29kZSAoRFdfTE5FX3NldF9hZGRyZXNzKTsKLSAgZXhwci5YX29wID0gT19zeW1ib2w7Ci0gIGV4cHIuWF9hZGRfc3ltYm9sID0gc3ltOwotICBleHByLlhfYWRkX251bWJlciA9IDA7Ci0gIGVtaXRfZXhwciAoJmV4cHIsIGJ5dGVzX3Blcl9hZGRyZXNzKTsKLX0KLQotLyogRW1pdCBEV19MTlNfZW5kX3NlcXVlbmNlIGFuZCByZXNldCBzdGF0ZSBtYWNoaW5lLiAgRG9lcyBub3QKLSAgIHByZXNlcnZlIHRoZSBjdXJyZW50IHNlZ21lbnQvc3ViLXNlZ21lbnQhICAqLwotc3RhdGljIHZvaWQKLW91dF9lbmRfc2VxdWVuY2UgKCkKLXsKLSAgYWRkcmVzc1QgYWRkciwgZGVsdGE7Ci0gIGZyYWdTICp0ZXh0X2ZyYWc7Ci0KLSAgaWYgKGxzLnRleHRfc2VnKQotICAgIHsKLSAgICAgIHN1YnNlZ19zZXQgKGxzLnRleHRfc2VnLCBscy50ZXh0X3N1YnNlZyk7Ci0jaWZkZWYgbWRfY3VycmVudF90ZXh0X2FkZHIKLSAgICAgIGFkZHIgPSBtZF9jdXJyZW50X3RleHRfYWRkciAoKTsKLSNlbHNlCi0gICAgICBhZGRyID0gZnJhZ19ub3dfZml4ICgpOwotI2VuZGlmCi0gICAgICB0ZXh0X2ZyYWcgPSBmcmFnX25vdzsKLSAgICAgIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9CT0RZKTsKLSAgICAgIGlmICh0ZXh0X2ZyYWcgIT0gbHMuZnJhZykKLQl7Ci0JICBvdXRfc2V0X2FkZHIgKGFkZHIpOwotCSAgbHMuc20uYWRkciA9IGFkZHI7Ci0JICBscy5mcmFnID0gdGV4dF9mcmFnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkZWx0YSA9IChhZGRyIC0gbHMuc20uYWRkcikgLyBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEg7Ci0JICBpZiAoZGVsdGEgPiAwKQotCSAgICB7Ci0JICAgICAgLyogQWR2YW5jZSBhZGRyZXNzIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGxpbmUtZGVidWcKLQkJIG1hdHJpeC0tLXRoZSBlbmRfc2VxdWVuY2UgZW50cnkgaXMgdXNlZCBvbmx5IHRvIHRlbGwKLQkJIHRoZSBkZWJ1Z2dlciB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4qLwotCSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19hZHZhbmNlX3BjKTsKLQkgICAgICBvdXRfdWxlYjEyOCAoZGVsdGEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9CT0RZKTsKLQotICBvdXRfb3Bjb2RlIChEV19MTlNfZXh0ZW5kZWRfb3ApOwotICBvdXRfdWxlYjEyOCAoMSk7Ci0gIG91dF9ieXRlIChEV19MTkVfZW5kX3NlcXVlbmNlKTsKLQotICByZXNldF9zdGF0ZV9tYWNoaW5lICgpOwotfQotCi0vKiBMb29rIHVwIGEgZmlsZW51bWJlciBlaXRoZXIgYnkgZmlsZW5hbWUgb3IgYnkgZmlsZW51bWJlci4gIElmIGJvdGgKLSAgIGEgZmlsZW51bWJlciBhbmQgYSBmaWxlbmFtZSBhcmUgc3BlY2lmaWVkLCBsb29rdXAgYnkgZmlsZW5hbWUgdGFrZXMKLSAgIHByZWNlZGVuY2UuICBJZiB0aGUgZmlsZW5hbWUgY2Fubm90IGJlIGZvdW5kLCBpdCBpcyBhZGRlZCB0byB0aGUKLSAgIGZpbGV0YWJsZSBhbmQgdGhlIGZpbGVudW1iZXIgZm9yIHRoZSBuZXcgZW50cnkgaXMgcmV0dXJuZWQuICAqLwotc3RhdGljIGludAotZ2V0X2ZpbGVudW0gKGZpbGVudW0sIGZpbGUpCi0gICAgIGludCBmaWxlbnVtOwotICAgICBjaGFyICpmaWxlOwotewotICBpbnQgaSwgbGFzdCA9IGZpbGVudW0gLSAxOwotICBjaGFyIGNoYXIwID0gZmlsZVswXTsKLQotICAvKiBJZiBmaWxlbnVtIGlzIG91dCBvZiByYW5nZSBvZiB0aGUgZmlsZW5hbWUgdGFibGUsIHRoZW4gdHJ5IHVzaW5nIHRoZQotICAgICB0YWJsZSBlbnRyeSByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLiAgKi8KLSAgaWYgKGxhc3QgPj0gbHMubnVtX2ZpbGVuYW1lcyB8fCBsYXN0IDwgMCkKLSAgICBsYXN0ID0gbHMubGFzdF9maWxlbmFtZTsKLQotICAvKiBEbyBhIHF1aWNrIGNoZWNrIGFnYWluc3QgdGhlIHNwZWNpZmllZCBvciBwcmV2aW91c2x5IHVzZWQgZmlsZW51bS4gICovCi0gIGlmIChscy5udW1fZmlsZW5hbWVzID4gMCAmJiBscy5maWxlW2xhc3RdLm5hbWVbMF0gPT0gY2hhcjAKLSAgICAgICYmIHN0cmNtcCAobHMuZmlsZVtsYXN0XS5uYW1lICsgMSwgZmlsZSArIDEpID09IDApCi0gICAgcmV0dXJuIGxhc3QgKyAxOwotCi0gIC8qIG5vIG1hdGNoLCBmYWxsIGJhY2sgdG8gc2ltcGxlIGxpbmVhciBzY2FuOiAqLwotICBmb3IgKGkgPSAwOyBpIDwgbHMubnVtX2ZpbGVuYW1lczsgKytpKQotICAgIHsKLSAgICAgIGlmIChscy5maWxlW2ldLm5hbWVbMF0gPT0gY2hhcjAKLQkgICYmIHN0cmNtcCAobHMuZmlsZVtpXS5uYW1lICsgMSwgZmlsZSArIDEpID09IDApCi0JewotCSAgbHMubGFzdF9maWxlbmFtZSA9IGk7Ci0JICByZXR1cm4gaSArIDE7Ci0JfQotICAgIH0KLQotICAvKiBubyBtYXRjaDogZW50ZXIgbmV3IGZpbGVuYW1lICovCi0gIGlmIChscy5udW1fZmlsZW5hbWVzID49IGxzLmZpbGVuYW1lX2xlbikKLSAgICB7Ci0gICAgICBscy5maWxlbmFtZV9sZW4gKz0gMTM7Ci0gICAgICBscy5maWxlID0geHJlYWxsb2MgKGxzLmZpbGUsIGxzLmZpbGVuYW1lX2xlbiAqIHNpemVvZiAobHMuZmlsZVswXSkpOwotICAgIH0KLSAgbHMuZmlsZVtscy5udW1fZmlsZW5hbWVzXS5kaXIgPSAwOwotICBscy5maWxlW2xzLm51bV9maWxlbmFtZXNdLm5hbWUgPSBmaWxlOwotICBscy5sYXN0X2ZpbGVuYW1lID0gbHMubnVtX2ZpbGVuYW1lczsKLSAgcmV0dXJuICsrbHMubnVtX2ZpbGVuYW1lczsKLX0KLQotLyogRW1pdCBhbiBlbnRyeSBpbiB0aGUgbGluZSBudW1iZXIgdGFibGUgaWYgdGhlIGFkZHJlc3Mgb3IgbGluZSBoYXMgY2hhbmdlZC4KLSAgIEFERFIgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZnJhZyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLQotdm9pZAotZHdhcmYyX2dlbl9saW5lX2luZm8gKGFkZHIsIGwpCi0gICAgIGFkZHJlc3NUIGFkZHI7Ci0gICAgIHN0cnVjdCBkd2FyZjJfbGluZV9pbmZvICpsOwotewotICB1bnNpZ25lZCBpbnQgZmlsZW51bSA9IGwtPmZpbGVudW07Ci0gIHVuc2lnbmVkIGludCBhbnlfb3V0cHV0ID0gMDsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWc7Ci0gIHNlZ1Qgc2F2ZWRfc2VnOwotICBmcmFnUyAqc2F2ZWRfZnJhZzsKLQotICBpZiAoZmxhZ19kZWJ1ZykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJsaW5lOiBhZGRyICVseCBmaWxlIGAlcycgbGluZSAldSBjb2wgJXUgZmxhZ3MgJXhcbiIsCi0JICAgICAodW5zaWduZWQgbG9uZykgYWRkciwgbC0+ZmlsZW5hbWUsIGwtPmxpbmUsIGwtPmNvbHVtbiwgbC0+ZmxhZ3MpOwotCi0gIGlmIChmaWxlbnVtID4gMCAmJiAhbC0+ZmlsZW5hbWUpCi0gICAgewotICAgICAgaWYgKGZpbGVudW0gPj0gKHVuc2lnbmVkIGludCkgbHMubnVtX2ZpbGVuYW1lcykKLQl7Ci0JICBhc193YXJuICgiRW5jb3VudGVyZWQgYmFkIGZpbGUgbnVtYmVyIGluIGxpbmUgbnVtYmVyIGRlYnVnIGluZm8hIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobC0+ZmlsZW5hbWUpCi0gICAgZmlsZW51bSA9IGdldF9maWxlbnVtIChmaWxlbnVtLCBsLT5maWxlbmFtZSk7Ci0gIGVsc2UKLSAgICByZXR1cm47CS8qIG5vIGZpbGVuYW1lLCBubyBmaWxudW0gPT4gbm8gcGxheSAqLwotCi0gIC8qIE11c3Qgc2F2ZSB0aGVzZSBiZWZvcmUgdGhlIHN1YnNlZ19uZXcgY2FsbCwgYXMgdGhhdCBjYWxsIHdpbGwgY2hhbmdlCi0gICAgIHRoZW0uICAqLwotICBzYXZlZF9zZWcgPSBub3dfc2VnOwotICBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBzYXZlZF9mcmFnID0gZnJhZ19ub3c7Ci0KLSAgaWYgKCFscy5saW5lX3NlZykKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgc3ltYm9sUyAqc2Vjc3ltOwotI2VuZGlmCi0KLSAgICAgIGxzLmxpbmVfc2VnID0gc3Vic2VnX25ldyAoIi5kZWJ1Z19saW5lIiwgMCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbHMubGluZV9zZWcsIFNFQ19SRUFET05MWSk7Ci0KLSAgICAgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgdGhpcyBzeW1ib2wuICAqLwotICAgICAgc2Vjc3ltID0gc3ltYm9sX2ZpbmQgKCIuZGVidWdfbGluZSIpOwotICAgICAgaWYgKHNlY3N5bSAhPSBOVUxMKQotICAgICAgICBzeW1ib2xfc2V0X2JmZHN5bSAoc2Vjc3ltLCBscy5saW5lX3NlZy0+c3ltYm9sKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKGxzLmxpbmVfc2VnKSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgc3Vic2VnX3NldCAobHMubGluZV9zZWcsIERMX0JPRFkpOwotCi0gIGlmIChscy50ZXh0X3NlZyAhPSBzYXZlZF9zZWcgfHwgbHMudGV4dF9zdWJzZWcgIT0gc2F2ZWRfc3Vic2VnKQotICAgIHsKLSAgICAgIGlmICghbHMuc20uZW1wdHlfc2VxdWVuY2UpCi0JewotCSAgb3V0X2VuZF9zZXF1ZW5jZSAoKTsJCS8qIHRlcm1pbmF0ZSBwcmV2aW91cyBzZXF1ZW5jZSAqLwotCSAgbHMuc20uZW1wdHlfc2VxdWVuY2UgPSAxOwotCX0KLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgbHMudGV4dF9zZWcgPSBzYXZlZF9zZWc7Ci0gICAgICBscy50ZXh0X3N1YnNlZyA9IHNhdmVkX3N1YnNlZzsKLSAgICAgIG91dF9zZXRfYWRkciAoYWRkcik7Ci0gICAgICBscy5zbS5hZGRyID0gYWRkcjsKLSAgICAgIGxzLmZyYWcgPSBzYXZlZF9mcmFnOwotICAgIH0KLQotICBpZiAobHMuc20uZmlsZW51bSAhPSBmaWxlbnVtKQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX3NldF9maWxlKTsKLSAgICAgIG91dF91bGViMTI4IChmaWxlbnVtKTsKLSAgICAgIGxzLnNtLmZpbGVudW0gPSBmaWxlbnVtOwotICAgIH0KLQotICBpZiAobHMuc20uY29sdW1uICE9IGwtPmNvbHVtbikKLSAgICB7Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19zZXRfY29sdW1uKTsKLSAgICAgIG91dF91bGViMTI4IChsLT5jb2x1bW4pOwotICAgICAgbHMuc20uY29sdW1uID0gbC0+Y29sdW1uOwotICAgIH0KLQotICBpZiAoKChsLT5mbGFncyAmIERXQVJGMl9GTEFHX0JFR0lOX1NUTVQpICE9IDApICE9IGxzLnNtLmlzX3N0bXQpCi0gICAgewotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfbmVnYXRlX3N0bXQpOwotICAgIH0KLQotICBpZiAobC0+ZmxhZ3MgJiBEV0FSRjJfRkxBR19CRUdJTl9CTE9DSykKLSAgICB7Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19zZXRfYmFzaWNfYmxvY2spOwotICAgIH0KLQotICBpZiAobHMuc20ubGluZSAhPSBsLT5saW5lKQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgaWYgKHNhdmVkX2ZyYWcgIT0gbHMuZnJhZykKLQl7Ci0JICAvKiBJZiBhIG5ldyBmcmFnIGdvdCBhbGxvY2F0ZWQgKGZvciB3aGF0ZXZlciByZWFzb24pLCB0aGVuCi0JICAgICBkZWFsIHdpdGggaXQgYnkgZ2VuZXJhdGluZyBhIHJlZmVyZW5jZSBzeW1ib2wuICBOb3RlOiBubwotCSAgICAgZW5kX3NlcXVlbmNlIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBiZWNhdXNlIHRoZSBhZGRyZXNzIGRpZAotCSAgICAgbm90IHJlYWxseSBkZWNyZWFzZSAob25seSB0aGUgcmVmZXJlbmNlIHBvaW50IGNoYW5nZWQpLiAgKi8KLQkgIG91dF9zZXRfYWRkciAoYWRkcik7Ci0JICBscy5zbS5hZGRyID0gYWRkcjsKLQkgIGxzLmZyYWcgPSBzYXZlZF9mcmFnOwotCX0KLSAgICAgIGdlbl9hZGRyX2xpbmUgKGwtPmxpbmUgLSBscy5zbS5saW5lLAotCQkgICAgIChhZGRyIC0gbHMuc20uYWRkcikgLyBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEgpOwotICAgICAgbHMuc20uYmFzaWNfYmxvY2sgPSAwOwotICAgICAgbHMuc20ubGluZSA9IGwtPmxpbmU7Ci0gICAgICBscy5zbS5hZGRyID0gYWRkcjsKLSAgICB9Ci0KLSAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotCi0gIGxzLm51bV9saW5lX2VudHJpZXMgKz0gYW55X291dHB1dDsKLSAgaWYgKGFueV9vdXRwdXQpCi0gICAgbHMuc20uZW1wdHlfc2VxdWVuY2UgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2Rpcl9saXN0ICgpCi17Ci0gIGNoYXIgKnN0ciwgKnNsYXNoLCAqZGlyX2xpc3QsICpkcCwgKmNwOwotICBpbnQgaSwgaiwgbnVtX2RpcnM7Ci0KLSAgZGlyX2xpc3QgPSBmcmFnX21vcmUgKDApOwotICBudW1fZGlycyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGxzLm51bV9maWxlbmFtZXM7ICsraSkKLSAgICB7Ci0gICAgICBzdHIgPSBscy5maWxlW2ldLm5hbWU7Ci0gICAgICBzbGFzaCA9IHN0cnJjaHIgKHN0ciwgJy8nKTsKLSAgICAgIGlmIChzbGFzaCkKLQl7Ci0JICAqc2xhc2ggPSAnXDAnOwotCSAgZm9yIChqID0gMCwgZHAgPSBkaXJfbGlzdDsgaiA8IG51bV9kaXJzOyArK2opCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChzdHIsIGRwKSA9PSAwKQotCQl7Ci0JCSAgbHMuZmlsZVtpXS5kaXIgPSBqICsgMTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGRwICs9IHN0cmxlbiAoZHApOwotCSAgICB9Ci0JICBpZiAoaiA+PSBudW1fZGlycykKLQkgICAgewotCSAgICAgIC8qIGRpZG4ndCBmaW5kIHRoaXMgZGlyZWN0b3J5OiBhcHBlbmQgaXQgdG8gdGhlIGxpc3QgKi8KLQkgICAgICBzaXplX3Qgc2l6ZSA9IHN0cmxlbiAoc3RyKSArIDE7Ci0JICAgICAgY3AgPSBmcmFnX21vcmUgKHNpemUpOwotCSAgICAgIG1lbWNweSAoY3AsIHN0ciwgc2l6ZSk7Ci0JICAgICAgbHMuZmlsZVtpXS5kaXIgPSArK251bV9kaXJzOwotCSAgICB9Ci0JICAqc2xhc2ggPSAnLyc7Ci0JICBscy5maWxlW2ldLm5hbWUgPSBzbGFzaCArIDE7Ci0JfQotICAgIH0KLSAgb3V0X2J5dGUgKCdcMCcpOwkvKiB0ZXJtaW5hdGUgZGlyZWN0b3J5IGxpc3QgKi8KLX0KLQotc3RhdGljIHZvaWQKLWdlbl9maWxlX2xpc3QgKCkKLXsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKmNwOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbHMubnVtX2ZpbGVuYW1lczsgKytpKQotICAgIHsKLSAgICAgIHNpemUgPSBzdHJsZW4gKGxzLmZpbGVbaV0ubmFtZSkgKyAxOwotICAgICAgY3AgPSBmcmFnX21vcmUgKHNpemUpOwotICAgICAgbWVtY3B5IChjcCwgbHMuZmlsZVtpXS5uYW1lLCBzaXplKTsKLQotICAgICAgb3V0X3VsZWIxMjggKGxzLmZpbGVbaV0uZGlyKTsJLyogZGlyZWN0b3J5IG51bWJlciAqLwotICAgICAgb3V0X3VsZWIxMjggKDApOwkJCS8qIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCAqLwotICAgICAgb3V0X3VsZWIxMjggKDApOwkJCS8qIGZpbGVzaXplICovCi0gICAgfQotICBvdXRfYnl0ZSAoMCk7CQkvKiB0ZXJtaW5hdGUgZmlsZW5hbWUgbGlzdCAqLwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhdHMgKHRvdGFsX3NpemUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKm9wY19uYW1lW10gPQotICAgIHsKLSAgICAgICJleHRlbmRlZCIsICJjb3B5IiwgImFkdmFuY2VfcGMiLCAiYWR2YW5jZV9saW5lIiwgInNldF9maWxlIiwKLSAgICAgICJzZXRfY29sdW1uIiwgIm5lZ2F0ZV9zdG10IiwgInNldF9iYXNpY19ibG9jayIsICJjb25zdF9hZGRfcGMiLAotICAgICAgImZpeGVkX2FkdmFuY2VfcGMiCi0gICAgfTsKLSAgc2l6ZV90IGk7Ci0gIGludCBqOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIkF2ZXJhZ2Ugc2l6ZTogJWcgYnl0ZXMvbGluZVxuIiwKLQkgICB0b3RhbF9zaXplIC8gKGRvdWJsZSkgbHMubnVtX2xpbmVfZW50cmllcyk7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG5TdGFuZGFyZCBvcGNvZGUgaGlzdG9ncmFtOlxuIik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3BjX25hbWUpL3NpemVvZiAob3BjX25hbWVbMF0pOyArK2kpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCBvcGNfbmFtZVtpXSk7Ci0gICAgICBmb3IgKGogPSBzdHJsZW4gKG9wY19uYW1lW2ldKTsgaiA8IDE2OyArK2opCi0JZnByaW50ZiAoc3RkZXJyLCAiICIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiAldVxuIiwgbHMub3Bjb2RlX2hpc3RbaV0pOwotICAgIH0KLQotICBmcHJpbnRmIChzdGRlcnIsICJcblNwZWNpYWwgb3Bjb2RlczpcbmFkZHJcdFx0XHRcdGxpbmUgc2tpcFxuIik7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAic2tpcDogIik7Ci0gIGZvciAoaiA9IERXQVJGMl9MSU5FX0JBU0U7IGogPCBEV0FSRjJfTElORV9CQVNFICsgRFdBUkYyX0xJTkVfUkFOR0U7ICsraikKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlM2QiLCBqKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4tLS0tLSIpOwotCi0gIGZvciAoOyBpIDwgMjU2OyArK2kpCi0gICAgewotICAgICAgaiA9IFNQRUNJQUxfTElORSAoaSk7Ci0gICAgICBpZiAoaiA9PSBEV0FSRjJfTElORV9CQVNFKQotCWZwcmludGYgKHN0ZGVyciwgIlxuJTR1OiAiLAotCQkgRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RIKlNQRUNJQUxfQUREUiAoaSkpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICUydSIsIGxzLm9wY29kZV9oaXN0W2ldKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXZvaWQKLWR3YXJmMl9maW5pc2ggKCkKLXsKLSAgYWRkcmVzc1QgYm9keV9zaXplLCB0b3RhbF9zaXplLCBwcm9sb2dfc2l6ZTsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWc7Ci0gIHNlZ1Qgc2F2ZWRfc2VnOwotICBjaGFyICpjcDsKLQotICBpZiAoIWxzLmxpbmVfc2VnKQotICAgIC8qIG5vIC5kZWJ1Z19saW5lIHNlZ21lbnQsIG5vIHdvcmsgdG8gZG8uLi4gKi8KLSAgICByZXR1cm47Ci0KLSAgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICBpZiAoIWxzLnNtLmVtcHR5X3NlcXVlbmNlKQotICAgIG91dF9lbmRfc2VxdWVuY2UgKCk7Ci0gIHRvdGFsX3NpemUgPSBib2R5X3NpemUgPSBmcmFnX25vd19maXggKCk7Ci0KLSAgLyogbm93IGdlbmVyYXRlIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGUgbGlzdHM6ICovCi0gIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9GSUxFUyk7Ci0gIGdlbl9kaXJfbGlzdCAoKTsKLSAgZ2VuX2ZpbGVfbGlzdCAoKTsKLSAgdG90YWxfc2l6ZSArPSBmcmFnX25vd19maXggKCk7Ci0KLSAgLyogYW5kIG5vdyB0aGUgaGVhZGVyICgic3RhdGVtZW50IHByb2dyYW0gcHJvbG9nIiwgaW4gRFdBUkYyIGxpbmdvLi4uKSAqLwotICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfUFJPTE9HKTsKLQotICBjcCA9IGZyYWdfbW9yZSAoMTUgKyBEV0FSRjJfTElORV9PUENPREVfQkFTRSAtIDEpOwotCi0gIHRvdGFsX3NpemUgKz0gZnJhZ19ub3dfZml4ICgpOwotICBwcm9sb2dfc2l6ZSA9IHRvdGFsX3NpemUgLSBib2R5X3NpemUgLSAxMDsKLQotIyBkZWZpbmUgU1RVRkYodmFsLHNpemUpCW1kX251bWJlcl90b19jaGFycyAoY3AsIHZhbCwgc2l6ZSk7IGNwICs9IHNpemU7Ci0gIFNUVUZGICh0b3RhbF9zaXplIC0gNCwgNCk7CS8qIGxlbmd0aCAqLwotICBTVFVGRiAoMiwgMik7CQkJLyogdmVyc2lvbiAqLwotICBTVFVGRiAocHJvbG9nX3NpemUsIDQpOwkvKiBwcm9sb2d1ZV9sZW5ndGggKi8KLSAgU1RVRkYgKERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSCwgMSk7Ci0gIFNUVUZGIChEV0FSRjJfTElORV9ERUZBVUxUX0lTX1NUTVQsIDEpOwotICBTVFVGRiAoRFdBUkYyX0xJTkVfQkFTRSwgMSk7Ci0gIFNUVUZGIChEV0FSRjJfTElORV9SQU5HRSwgMSk7Ci0gIFNUVUZGIChEV0FSRjJfTElORV9PUENPREVfQkFTRSwgMSk7Ci0KLSAgLyogc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHM6ICovCi0gIFNUVUZGICgwLCAxKTsJCQkvKiBEV19MTlNfY29weSAqLwotICBTVFVGRiAoMSwgMSk7CQkJLyogRFdfTE5TX2FkdmFuY2VfcGMgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19hZHZhbmNlX2xpbmUgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19zZXRfZmlsZSAqLwotICBTVFVGRiAoMSwgMSk7CQkJLyogRFdfTE5TX3NldF9jb2x1bW4gKi8KLSAgU1RVRkYgKDAsIDEpOwkJCS8qIERXX0xOU19uZWdhdGVfc3RtdCAqLwotICBTVFVGRiAoMCwgMSk7CQkJLyogRFdfTE5TX3NldF9iYXNpY19ibG9jayAqLwotICBTVFVGRiAoMCwgMSk7CQkJLyogRFdfTE5TX2NvbnN0X2FkZF9wYyAqLwotICBTVFVGRiAoMSwgMSk7CQkJLyogRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMgKi8KLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci0KLSAgaWYgKGZsYWdfZGVidWcpCi0gICAgcHJpbnRfc3RhdHMgKHRvdGFsX3NpemUpOwotfQotCi12b2lkCi1kd2FyZjJfZGlyZWN0aXZlX2ZpbGUgKGR1bW15KQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGxlbjsKLQotICAvKiBDb250aW51ZSB0byBhY2NlcHQgYSBiYXJlIHN0cmluZyBhbmQgcGFzcyBpdCBvZmYuICAqLwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKLSAgICB7Ci0gICAgICBzX2FwcF9maWxlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbHMuYW55X2R3YXJmMl9kaXJlY3RpdmVzID0gMTsKLQotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19OT05FKQotICAgIC8qIEF1dG9tYXRpY2FsbHkgdHVybiBvbiBEV0FSRjIgZGVidWcgaW5mbyB1bmxlc3Mgc29tZXRoaW5nIGVsc2UKLSAgICAgICBoYXMgYmVlbiBzZWxlY3RlZC4gICovCi0gICAgZGVidWdfdHlwZSA9IERFQlVHX0RXQVJGMjsKLQotICBscy5jdXJyZW50LmZpbGVudW0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgbHMuY3VycmVudC5maWxlbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1kd2FyZjJfZGlyZWN0aXZlX2xvYyAoZHVtbXkpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBscy5hbnlfZHdhcmYyX2RpcmVjdGl2ZXMgPSAxOwotCi0gIGxzLmN1cnJlbnQuZmlsZW51bSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGxzLmN1cnJlbnQubGluZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGxzLmN1cnJlbnQuY29sdW1uID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgbHMuY3VycmVudC5mbGFncyA9IERXQVJGMl9GTEFHX0JFR0lOX1NUTVQ7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3NvdXJjZV9saW5lIChscy5jdXJyZW50LmxpbmUpOwotI2VuZGlmCi19Ci0KLXZvaWQKLWR3YXJmMl93aGVyZSAobGluZSkKLSAgICAgc3RydWN0IGR3YXJmMl9saW5lX2luZm8gKmxpbmU7Ci17Ci0gIGlmIChscy5hbnlfZHdhcmYyX2RpcmVjdGl2ZXMpCi0gICAgKmxpbmUgPSBscy5jdXJyZW50OwotICBlbHNlCi0gICAgewotICAgICAgYXNfd2hlcmUgKCZsaW5lLT5maWxlbmFtZSwgJmxpbmUtPmxpbmUpOwotICAgICAgbGluZS0+ZmlsZW51bSA9IDA7Ci0gICAgICBsaW5lLT5jb2x1bW4gPSAwOwotICAgICAgbGluZS0+ZmxhZ3MgPSBEV0FSRjJfRkxBR19CRUdJTl9TVE1UOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy9kd2FyZjJkYmcuaCBiL2dhcy9kd2FyZjJkYmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlZWMxYy4uMDAwMDAwMAotLS0gYS9nYXMvZHdhcmYyZGJnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBkd2FyZjJkYmcuaCAtIERXQVJGMiBkZWJ1ZyBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQVNfRFdBUkYyREJHX0gKLSNkZWZpbmUgQVNfRFdBUkYyREJHX0gKLQotI2luY2x1ZGUgImFzLmgiCi0KLSNkZWZpbmUgRFdBUkYyX0ZMQUdfQkVHSU5fU1RNVAkoMSA8PCAwKQkvKiBiZWdpbm5pbmcgb2Ygc3RhdGVtZW50ICovCi0jZGVmaW5lIERXQVJGMl9GTEFHX0JFR0lOX0JMT0NLCSgxIDw8IDEpCS8qIGJlZ2lubmluZyBvZiBiYXNpYyBibG9jayAqLwotCi1zdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbwotICB7Ci0gICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgdW5zaWduZWQgaW50IGZpbGVudW07Ci0gICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgdW5zaWduZWQgaW50IGNvbHVtbjsKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0gIH07Ci0KLS8qIEltcGxlbWVudHMgdGhlIC5maWxlIEZJTEVOTyAiRklMRU5BTUUiIGRpcmVjdGl2ZS4gIEZJTEVOTyBjYW4gYmUgMAotICAgdG8gaW5kaWNhdGUgdGhhdCBubyBmaWxlIG51bWJlciBoYXMgYmVlbiBhc3NpZ25lZC4gIEFsbCByZWFsIGZpbGUKLSAgIG51bWJlciBtdXN0IGJlID4wLiAgKi8KLWV4dGVybiB2b2lkIGR3YXJmMl9kaXJlY3RpdmVfZmlsZSBQQVJBTVMgKChpbnQgZHVtbXkpKTsKLQotLyogSW1wbGVtZW50cyB0aGUgLmxvYyBGSUxFTk8gTElORU5PIFtDT0xVTU5dIGRpcmVjdGl2ZS4gIEZJTEVOTyBpcwotICAgdGhlIGZpbGUgbnVtYmVyLCBMSU5FTk8gdGhlIGxpbmUgbnVtYmVyIGFuZCB0aGUgKG9wdGlvbmFsKSBDT0xVTU4KLSAgIHRoZSBjb2x1bW4gb2YgdGhlIHNvdXJjZSBjb2RlIHRoYXQgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbgotICAgY29ycmVzcG9uZHMgdG8uICBGSUxFTk8gY2FuIGJlIDAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmlsZW5hbWUKLSAgIHNwZWNpZmllZCBieSB0aGUgdGV4dHVhbGx5IG1vc3QgcmVjZW50IC5maWxlIGRpcmVjdGl2ZSBzaG91bGQgYmUKLSAgIHVzZWQuICAqLwotZXh0ZXJuIHZvaWQgZHdhcmYyX2RpcmVjdGl2ZV9sb2MgUEFSQU1TICgoaW50IGR1bW15KSk7Ci0KLS8qIFJldHVybnMgdGhlIGN1cnJlbnQgc291cmNlIGluZm9ybWF0aW9uLiAgSWYgLmZpbGUgZGlyZWN0aXZlcyBoYXZlCi0gICBiZWVuIGVuY291bnRlcmVkLCB0aGUgaW5mbyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGUgaXMKLSAgIHJldHVybmVkLiAgT3RoZXJ3aXNlLCB0aGUgaW5mbyBmb3IgdGhlIGFzc2VtYmx5IHNvdXJjZSBmaWxlIGlzCi0gICByZXR1cm5lZC4gICovCi1leHRlcm4gdm9pZCBkd2FyZjJfd2hlcmUgUEFSQU1TICgoc3RydWN0IGR3YXJmMl9saW5lX2luZm8gKmwpKTsKLQotLyogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgLmRlYnVnX2xpbmUgaW5mbyBiYXNlZCBvbiB0aGUgYWRkcmVzcyBhbmQKLSAgIHNvdXJjZSBpbmZvcm1hdGlvbiBwYXNzZWQgaW4gdGhlIGFyZ3VtZW50cy4gIEFERFIgc2hvdWxkIGJlIHRoZQotICAgZnJhZy1yZWxhdGl2ZSBvZmZzZXQgb2YgdGhlIGluc3RydWN0aW9uIHRoZSBpbmZvcm1hdGlvbiBpcyBmb3IgYW5kCi0gICBMIGlzIHRoZSBzb3VyY2UgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQKLSAgIGFkZHJlc3MuICovCi1leHRlcm4gdm9pZCBkd2FyZjJfZ2VuX2xpbmVfaW5mbyBQQVJBTVMgKChhZGRyZXNzVCBhZGRyLAotCQkJCQkgIHN0cnVjdCBkd2FyZjJfbGluZV9pbmZvICpsKSk7Ci0KLS8qIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCBvdGhlciBpbnB1dCBpcyBwcm9jZXNzZWQgdG8gZmluaXNoIHVwIHRoZQotICAgLmRlYnVnX2xpbmUgc2VjdGlvbi4gICovCi1leHRlcm4gdm9pZCBkd2FyZjJfZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIEFTX0RXQVJGMkRCR19IICovCmRpZmYgLS1naXQgYS9nYXMvZWNvZmYuYyBiL2dhcy9lY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZjOGM0Li4wMDAwMDAwCi0tLSBhL2dhcy9lY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMxOCArMCwwIEBACi0vKiBFQ09GRiBkZWJ1Z2dpbmcgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBUaGlzIGZpbGUgd2FzIHB1dCB0b2dldGhlciBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICBBCi0gICBnb29kIGRlYWwgb2YgaXQgY29tZXMgZGlyZWN0bHkgZnJvbSBtaXBzLXRmaWxlLmMsIGJ5IE1pY2hhZWwKLSAgIE1laXNzbmVyIDxtZWlzc25lckBvc2Yub3JnPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGNvbmRpdGlvbmFsbHkgZm9yIHRob3NlIHRhcmdldHMgd2hpY2ggdXNlCi0gICBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKGUuZy4sIE1JUFMgRUNPRkYsIE1JUFMgRUxGLCBBbHBoYQotICAgRUNPRkYpLiAgKi8KLQotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogV2h5IGlzbid0IHRoaXMgaW4gY29mZi9zeW0uaD8gICovCi0jZGVmaW5lIFNUX1JGREVTQ0FQRSAweGZmZgotCi0vKiBUaGlzIGZpbGUgY29uc3RydWN0cyB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgRUNPRkYgZGVidWdnaW5nCi0gICBmb3JtYXQuICBJdCBqdXN0IGJ1aWxkcyBhIGxhcmdlIGJsb2NrIG9mIGRhdGEuCi0KLSAgIFdlIHN1cHBvcnQgYm90aCBFQ09GRiBzdHlsZSBkZWJ1Z2dpbmcgYW5kIHN0YWJzIGRlYnVnZ2luZyAodGhlCi0gICBzdGFicyBzeW1ib2xzIGFyZSBlbmNhcHN1bGF0ZWQgaW4gRUNPRkYgc3ltYm9scykuICBUaGlzIHNob3VsZCBsZXQKLSAgIHVzIGhhbmRsZSBhbnl0aGluZyB0aGUgY29tcGlsZXIgbWlnaHQgdGhyb3cgYXQgdXMuICAqLwotCi0vKiBIZXJlIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIE1JUFMgRUNPRkYgc3ltYm9sIHRhYmxlLCBieQotICAgTWljaGFlbCBNZWlzc25lci4gIFRoZSBNSVBTIHN5bWJvbCB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBwaWVjZXM6Ci0KLQlTeW1ib2xpYyBIZWFkZXIKLQkgICAgfAotCSAgICArLS0JQXV4aWxpYXJ5IFN5bWJvbHMKLQkgICAgfAotCSAgICArLS0JRGVuc2UgbnVtYmVyIHRhYmxlCi0JICAgIHwKLQkgICAgKy0tCU9wdGltaXplciBTeW1ib2xzCi0JICAgIHwKLQkgICAgKy0tCUV4dGVybmFsIFN0cmluZ3MKLQkgICAgfAotCSAgICArLS0JRXh0ZXJuYWwgU3ltYm9scwotCSAgICB8Ci0JICAgICstLQlSZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3JzCi0JICAgIHwKLQkgICAgKy0tCUZpbGUgdGFibGUKLQkJICAgIHwKLQkJICAgICstLQlQcm9jZWR1cmUgdGFibGUKLQkJICAgIHwKLQkJICAgICstLQlMaW5lIG51bWJlciB0YWJsZQotCQkgICAgfAotCQkgICAgKy0tCUxvY2FsIFN0cmluZ3MKLQkJICAgIHwKLQkJICAgICstLQlMb2NhbCBTeW1ib2xzCi0KLSAgIFRoZSBzeW1ib2xpYyBoZWFkZXIgcG9pbnRzIHRvIGVhY2ggb2YgdGhlIG90aGVyIHRhYmxlcywgYW5kIGFsc28KLSAgIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZW50cmllcy4gIEl0IGFsc28gY29udGFpbnMgYSBtYWdpYyBudW1iZXIKLSAgIGFuZCBNSVBTIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzIDIuMC4KLQotICAgVGhlIGF1eGlsaWFyeSB0YWJsZSBpcyBhIHNlcmllcyBvZiAzMiBiaXQgaW50ZWdlcnMsIHRoYXQgYXJlCi0gICByZWZlcmVuY2VkIGFzIG5lZWRlZCBmcm9tIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUuICBVbmxpa2Ugc3RhbmRhcmQKLSAgIENPRkYsIHRoZSBhdXguICBpbmZvcm1hdGlvbiBkb2VzIG5vdCBmb2xsb3cgdGhlIHN5bWJvbCB0aGF0IHVzZXMKLSAgIGl0LCBidXQgcmF0aGVyIGlzIGEgc2VwYXJhdGUgdGFibGUuICBJbiB0aGVvcnksIHRoaXMgd291bGQgYWxsb3cKLSAgIHRoZSBNSVBTIGNvbXBpbGVycyB0byBjb2xsYXBzZSBkdXBsaWNhdGUgYXV4LiBlbnRyaWVzLCBidXQgSSd2ZSBub3QKLSAgIG5vdGljZWQgdGhpcyBoYXBwZW5pbmcgd2l0aCB0aGUgMS4zMSBjb21waWxlciBzdWl0ZS4gIFRoZSBkaWZmZXJlbnQKLSAgIHR5cGVzIG9mIGF1eC4gZW50cmllcyBhcmU6Ci0KLSAgICAxKQlkbkxvdzogTG93IGJvdW5kIG9uIGFycmF5IGRpbWVuc2lvbi4KLQotICAgIDIpCWRuSGlnaDogSGlnaCBib3VuZCBvbiBhcnJheSBkaW1lbnNpb24uCi0KLSAgICAzKQlpc3ltOiBJbmRleCB0byB0aGUgbG9jYWwgc3ltYm9sIHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUKLQlmdW5jdGlvbiBmb3IgdGhlIGVuZCBvZiBmdW5jdGlvbiBmaXJzdCBhdXguIGVudHJ5LgotCi0gICAgNCkJd2lkdGg6IFdpZHRoIG9mIHN0cnVjdHVyZXMgYW5kIGJpdGZpZWxkcy4KLQotICAgIDUpCWNvdW50OiBDb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgcGFydC4KLQotICAgIDYpCXJuZHg6IEEgcmVsYXRpdmUgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIHJlbGF0aXZlCi0JaW5kZXggZmllbGQgaGFzIHR3byBwYXJ0czogcmZkIHdoaWNoIGlzIGEgcG9pbnRlciBpbnRvIHRoZQotCXJlbGF0aXZlIGZpbGUgaW5kZXggdGFibGUgb3IgU1RfUkZERVNDQVBFIHdoaWNoIHNheXMgdGhlIG5leHQKLQlhdXguIGVudHJ5IGlzIHRoZSBmaWxlIG51bWJlciwgYW5kIGluZGV4OiB3aGljaCBpcyB0aGUgcG9pbnRlcgotCWludG8gdGhlIGxvY2FsIHN5bWJvbCB3aXRoaW4gYSBnaXZlbiBmaWxlIHRhYmxlLiAgVGhpcyBpcyBmb3IKLQl0aGluZ3MgbGlrZSByZWZlcmVuY2VzIHRvIHR5cGVzIGRlZmluZWQgaW4gYW5vdGhlciBmaWxlLgotCi0gICAgNykJVHlwZSBpbmZvcm1hdGlvbjogVGhpcyBpcyBsaWtlIHRoZSBDT0ZGIHR5cGUgYml0cywgZXhjZXB0IGl0Ci0JaXMgMzIgYml0cyBpbnN0ZWFkIG9mIDE2OyB0aGV5IHN0aWxsIGhhdmUgcm9vbSB0byBhZGQgbmV3Ci0JYmFzaWMgdHlwZXM7IGFuZCB0aGV5IGNhbiBoYW5kbGUgbW9yZSB0aGFuIDYgbGV2ZWxzIG9mIGFycmF5LAotCXBvaW50ZXIsIGZ1bmN0aW9uLCBldGMuICBFYWNoIHR5cGUgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMKLQl0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzOgotCi0JICAgIGEpCWZCaXRmaWVsZDogYSBiaXQgdGhhdCBzYXlzIHRoaXMgaXMgYSBiaXRmaWVsZCwgYW5kIHRoZQotCQlzaXplIGluIGJpdHMgZm9sbG93cyBhcyB0aGUgbmV4dCBhdXguIGVudHJ5LgotCi0JICAgIGIpCWNvbnRpbnVlZDogYSBiaXQgdGhhdCBzYXlzIHRoZSBuZXh0IGF1eC4gZW50cnkgaXMgYQotCQljb250aW51YXRpb24gb2YgdGhlIGN1cnJlbnQgdHlwZSBpbmZvcm1hdGlvbiAoaW4gY2FzZQotCQl0aGVyZSBhcmUgbW9yZSB0aGFuIDYgbGV2ZWxzIG9mIGFycmF5L3B0ci9mdW5jdGlvbikuCi0KLQkgICAgYykJYnQ6IGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYmFzZSB0eXBlIGJlZm9yZSBhZGRpbmcKLQkJYXJyYXksIHBvaW50ZXIsIGZ1bmN0aW9uLCBldGMuIHF1YWxpZmllcnMuICBUaGUKLQkJY3VycmVudCBiYXNlIHR5cGVzIHRoYXQgSSBoYXZlIGRvY3VtZW50YXRpb24gZm9yIGFyZToKLQotCQkJYnROaWwJCS0tIHVuZGVmaW5lZAotCQkJYnRBZHIJCS0tIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwdHIKLQkJCWJ0Q2hhcgkJLS0gY2hhcmFjdGVyCi0JCQlidFVDaGFyCQktLSB1bnNpZ25lZCBjaGFyYWN0ZXIKLQkJCWJ0U2hvcnQJCS0tIHNob3J0Ci0JCQlidFVTaG9ydAktLSB1bnNpZ25lZCBzaG9ydAotCQkJYnRJbnQJCS0tIGludAotCQkJYnRVSW50CQktLSB1bnNpZ25lZCBpbnQKLQkJCWJ0TG9uZwkJLS0gbG9uZwotCQkJYnRVTG9uZwkJLS0gdW5zaWduZWQgbG9uZwotCQkJYnRGbG9hdAkJLS0gZmxvYXQgKHJlYWwpCi0JCQlidERvdWJsZQktLSBEb3VibGUgKHJlYWwpCi0JCQlidFN0cnVjdAktLSBTdHJ1Y3R1cmUgKFJlY29yZCkKLQkJCWJ0VW5pb24JCS0tIFVuaW9uICh2YXJpYW50KQotCQkJYnRFbnVtCQktLSBFbnVtZXJhdGVkCi0JCQlidFR5cGVkZWYJLS0gZGVmaW5lZCB2aWEgYSB0eXBlZGVmIGlzeW1SZWYKLQkJCWJ0UmFuZ2UJCS0tIHN1YnJhbmdlIG9mIGludAotCQkJYnRTZXQJCS0tIHBhc2NhbCBzZXRzCi0JCQlidENvbXBsZXgJLS0gZm9ydHJhbiBjb21wbGV4Ci0JCQlidERDb21wbGV4CS0tIGZvcnRyYW4gZG91YmxlIGNvbXBsZXgKLQkJCWJ0SW5kaXJlY3QJLS0gZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYKLQkJCWJ0Rml4ZWREZWMJLS0gRml4ZWQgRGVjaW1hbAotCQkJYnRGbG9hdERlYwktLSBGbG9hdCBEZWNpbWFsCi0JCQlidFN0cmluZwktLSBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nCi0JCQlidEJpdAkJLS0gQWxpZ25lZCBCaXQgU3RyaW5nCi0JCQlidFBpY3R1cmUJLS0gUGljdHVyZQotCQkJYnRWb2lkCQktLSBWb2lkIChNSVBTIGNjIHJldmlzaW9uID49IDIuMDApCi0KLQkgICAgZCkJdHEwIC0gdHE1OiB0eXBlIHF1YWxpZmllciBmaWVsZHMgYXMgbmVlZGVkLiAgVGhlCi0JCWN1cnJlbnQgdHlwZSBxdWFsaWZpZXIgZmllbGRzIEkgaGF2ZSBkb2N1bWVudGF0aW9uIGZvcgotCQlhcmU6Ci0KLQkJCXRxTmlsCQktLSBubyBtb3JlIHF1YWxpZmllcnMKLQkJCXRxUHRyCQktLSBwb2ludGVyCi0JCQl0cVByb2MJCS0tIHByb2NlZHVyZQotCQkJdHFBcnJheQkJLS0gYXJyYXkKLQkJCXRxRmFyCQktLSA4MDg2IGZhciBwb2ludGVycwotCQkJdHFWb2wJCS0tIHZvbGF0aWxlCi0KLQotICAgVGhlIGRlbnNlIG51bWJlciB0YWJsZSBpcyB1c2VkIGluIHRoZSBmcm9udCBlbmRzLCBhbmQgZGlzYXBwZWFycyBieQotICAgdGhlIHRpbWUgdGhlIC5vIGlzIGNyZWF0ZWQuCi0KLSAgIFdpdGggdGhlIDEuMzEgY29tcGlsZXIgc3VpdGUsIHRoZSBvcHRpbWl6YXRpb24gc3ltYm9scyBkb24ndCBzZWVtCi0gICB0byBiZSB1c2VkIGFzIGZhciBhcyBJIGNhbiB0ZWxsLgotCi0gICBUaGUgbGlua2VyIGlzIHRoZSBmaXJzdCBlbnRpdHkgdGhhdCBjcmVhdGVzIHRoZSByZWxhdGl2ZSBmaWxlCi0gICBkZXNjcmlwdG9yIHRhYmxlLCBhbmQgSSBiZWxpZXZlIGl0IGlzIHVzZWQgc28gdGhhdCB0aGUgaW5kaXZpZHVhbAotICAgZmlsZSB0YWJsZSBwb2ludGVycyBkb24ndCBoYXZlIHRvIGJlIHJld3JpdHRlbiB3aGVuIHRoZSBvYmplY3RzIGFyZQotICAgbWVyZ2VkIHRvZ2V0aGVyIGludG8gdGhlIHByb2dyYW0gZmlsZS4KLQotICAgVW5saWtlIENPRkYsIHRoZSBiYXNpYyBzeW1ib2wgJiBzdHJpbmcgdGFibGVzIGFyZSBzcGxpdCBpbnRvCi0gICBleHRlcm5hbCBhbmQgbG9jYWwgc3ltYm9scy9zdHJpbmdzLiAgVGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24KLSAgIG9ubHkgZ29lcyBvZmYgb2YgdGhlIGV4dGVybmFsIHN5bWJvbCB0YWJsZSwgYW5kIHRoZSBkZWJ1ZwotICAgaW5mb3JtYXRpb24gb25seSBnb2VzIG9mZiBvZiB0aGUgaW50ZXJuYWwgc3ltYm9sIHRhYmxlLiAgVGhlCi0gICBleHRlcm5hbCBzeW1ib2xzIGNhbiBoYXZlIGxpbmtzIHRvIGFuIGFwcHJvcHJpYXRlIGZpbGUgaW5kZXggYW5kCi0gICBzeW1ib2wgd2l0aGluIHRoZSBmaWxlIHRvIGdpdmUgaXQgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaW5mb3JtYXRpb24uCi0gICBCZWNhdXNlIG9mIHRoaXMsIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFyZSBhY3R1YWxseSBsYXJnZXIgdGhhbiB0aGUKLSAgIGludGVybmFsIHN5bWJvbHMgKHRvIGNvbnRhaW4gdGhlIGxpbmsgaW5mb3JtYXRpb24pLCBhbmQgY29udGFpbiB0aGUKLSAgIGxvY2FsIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgYSBtZW1iZXIsIHRob3VnaCB0aGlzIG1lbWJlciBpcyBub3QgdGhlCi0gICBmaXJzdCBtZW1iZXIgb2YgdGhlIGV4dGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUgKCEpLiAgSSBzdXNwZWN0IHRoaXMKLSAgIHNwbGl0IGlzIHRvIG1ha2Ugc3RyaXAgZWFzaWVyIHRvIGRlYWwgd2l0aC4KLQotICAgRWFjaCBmaWxlIHRhYmxlIGhhcyBvZmZzZXRzIGZvciB3aGVyZSB0aGUgbGluZSBudW1iZXJzLCBsb2NhbAotICAgc3RyaW5ncywgbG9jYWwgc3ltYm9scywgYW5kIHByb2NlZHVyZSB0YWJsZSBzdGFydHMgZnJvbSB3aXRoaW4gdGhlCi0gICBnbG9iYWwgdGFibGVzLCBhbmQgdGhlIGluZGV4cyBhcmUgcmVzZXQgdG8gMCBmb3IgZWFjaCBvZiB0aG9zZQotICAgdGFibGVzIGZvciB0aGUgZmlsZS4KLQotICAgVGhlIHByb2NlZHVyZSB0YWJsZSBjb250YWlucyB0aGUgYmluYXJ5IGVxdWl2YWxlbnRzIG9mIHRoZSAuZW50Ci0gICAoc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGFkZHJlc3MpLCAuZnJhbWUgKHdoYXQgcmVnaXN0ZXIgaXMgdGhlCi0gICB2aXJ0dWFsIGZyYW1lIHBvaW50ZXIsIGNvbnN0YW50IG9mZnNldCBmcm9tIHRoZSByZWdpc3RlciB0byBvYnRhaW4KLSAgIHRoZSBWRlAsIGFuZCB3aGF0IHJlZ2lzdGVyIGhvbGRzIHRoZSByZXR1cm4gYWRkcmVzcyksIC5tYXNrLy5mbWFzawotICAgKGJpdG1hc2sgb2Ygc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgd2hlcmUgdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHN0b3JlZAotICAgcmVsYXRpdmUgdG8gdGhlIFZGUCkgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuICBJdCBhbHNvIGNvbnRhaW5zIHRoZQotICAgbG93IGFuZCBoaWdoIGJvdW5kcyBvZiB0aGUgbGluZSBudW1iZXJzIGlmIGRlYnVnZ2luZyBpcyB0dXJuZWQgb24uCi0KLSAgIFRoZSBsaW5lIG51bWJlciB0YWJsZSBpcyBhIGNvbXByZXNzZWQgZm9ybSBvZiB0aGUgbm9ybWFsIENPRkYgbGluZQotICAgdGFibGUuICBFYWNoIGxpbmUgbnVtYmVyIGVudHJ5IGlzIGVpdGhlciAxIG9yIDMgYnl0ZXMgbG9uZywgYW5kCi0gICBjb250YWlucyBhIHNpZ25lZCBkZWx0YSBmcm9tIHRoZSBwcmV2aW91cyBsaW5lLCBhbmQgYW4gdW5zaWduZWQKLSAgIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoaXMgc3RhdGVtZW50IHRha2VzLgotCi0gICBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOgotCi0gICAgMSkJaXNzOiBpbmRleCB0byB0aGUgbG9jYWwgc3RyaW5nIHRhYmxlIGdpdmluZyB0aGUgbmFtZSBvZiB0aGUKLQlzeW1ib2wuCi0KLSAgICAyKQl2YWx1ZTogdmFsdWUgb2YgdGhlIHN5bWJvbCAoYWRkcmVzcywgcmVnaXN0ZXIgbnVtYmVyLCBldGMuKS4KLQotICAgIDMpCXN0OiBzeW1ib2wgdHlwZS4gIFRoZSBjdXJyZW50IHN5bWJvbCB0eXBlcyBhcmU6Ci0KLQkgICAgc3ROaWwJICAtLSBOdXRoaW4nIHNwZWNpYWwKLQkgICAgc3RHbG9iYWwJICAtLSBleHRlcm5hbCBzeW1ib2wKLQkgICAgc3RTdGF0aWMJICAtLSBzdGF0aWMKLQkgICAgc3RQYXJhbQkgIC0tIHByb2NlZHVyZSBhcmd1bWVudAotCSAgICBzdExvY2FsCSAgLS0gbG9jYWwgdmFyaWFibGUKLQkgICAgc3RMYWJlbAkgIC0tIGxhYmVsCi0JICAgIHN0UHJvYwkgIC0tIEV4dGVybmFsIFByb2NlZHVyZQotCSAgICBzdEJsb2NrCSAgLS0gYmVnaW5uaW5nIG9mIGJsb2NrCi0JICAgIHN0RW5kCSAgLS0gZW5kIChvZiBhbnl0aGluZykKLQkgICAgc3RNZW1iZXIJICAtLSBtZW1iZXIgKG9mIGFueXRoaW5nKQotCSAgICBzdFR5cGVkZWYJICAtLSB0eXBlIGRlZmluaXRpb24KLQkgICAgc3RGaWxlCSAgLS0gZmlsZSBuYW1lCi0JICAgIHN0UmVnUmVsb2MJICAtLSByZWdpc3RlciByZWxvY2F0aW9uCi0JICAgIHN0Rm9yd2FyZAkgIC0tIGZvcndhcmRpbmcgYWRkcmVzcwotCSAgICBzdFN0YXRpY1Byb2MgIC0tIFN0YXRpYyBwcm9jZWR1cmUKLQkgICAgc3RDb25zdGFudAkgIC0tIGNvbnN0Ci0KLSAgICA0KQlzYzogc3RvcmFnZSBjbGFzcy4gIFRoZSBjdXJyZW50IHN0b3JhZ2UgY2xhc3NlcyBhcmU6Ci0KLQkgICAgc2NUZXh0CSAgLS0gdGV4dCBzeW1ib2wKLQkgICAgc2NEYXRhCSAgLS0gaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wKLQkgICAgc2NCc3MJICAtLSB1bi1pbml0aWFsaXplZCBkYXRhIHN5bWJvbAotCSAgICBzY1JlZ2lzdGVyCSAgLS0gdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlcgotCSAgICBzY0FicwkgIC0tIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZQotCSAgICBzY1VuZGVmaW5lZCAgIC0tIHdobyBrbm93cz8KLQkgICAgc2NDZGJMb2NhbAkgIC0tIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gc2UtPnZhLj8/Ci0JICAgIHNjQml0cwkgIC0tIHRoaXMgaXMgYSBiaXQgZmllbGQKLQkgICAgc2NDZGJTeXN0ZW0JICAtLSB2YWx1ZSBpcyBJTiBkZWJ1Z2dlcidzIGFkZHJlc3Mgc3BhY2UKLQkgICAgc2NSZWdJbWFnZQkgIC0tIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrCi0JICAgIHNjSW5mbwkgIC0tIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbgotCSAgICBzY1VzZXJTdHJ1Y3QgIC0tIGFkZHIgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcwotCSAgICBzY1NEYXRhCSAgLS0gbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YQotCSAgICBzY1NCc3MJICAtLSBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24KLQkgICAgc2NSRGF0YQkgIC0tIGxvYWQgdGltZSBvbmx5IHJlYWQgb25seSBkYXRhCi0JICAgIHNjVmFyCSAgLS0gVmFyIHBhcmFtZXRlciAoZm9ydHJhbnBhc2NhbCkKLQkgICAgc2NDb21tb24JICAtLSBjb21tb24gdmFyaWFibGUKLQkgICAgc2NTQ29tbW9uCSAgLS0gc21hbGwgY29tbW9uCi0JICAgIHNjVmFyUmVnaXN0ZXIgLS0gVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyCi0JICAgIHNjVmFyaWFudAkgIC0tIFZhcmlhbnQgcmVjb3JkCi0JICAgIHNjU1VuZGVmaW5lZCAgLS0gc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhCi0JICAgIHNjSW5pdAkgIC0tIC5pbml0IHNlY3Rpb24gc3ltYm9sCi0KLSAgICA1KQlpbmRleDogcG9pbnRlciB0byBhIGxvY2FsIHN5bWJvbCBvciBhdXguIGVudHJ5LgotCi0KLQotICAgRm9yIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbToKLQotCSNpbmNsdWRlIDxzdGRpby5oPgotCi0JbWFpbigpewotCQlwcmludGYoIkhlbGxvIFdvcmxkIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotICAgTWlwcy10ZHVtcCBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotCi0gICBHbG9iYWwgZmlsZSBoZWFkZXI6Ci0gICAgICAgbWFnaWMgbnVtYmVyICAgICAgICAgICAgIDB4MTYyCi0gICAgICAgIyBzZWN0aW9ucyAgICAgICAgICAgICAgIDIKLSAgICAgICB0aW1lc3RhbXAgICAgICAgICAgICAgICAgNjQ1MzExNzk5LCBXZWQgSnVuIDEzIDE3OjE2OjM5IDE5OTAKLSAgICAgICBzeW1ib2xpYyBoZWFkZXIgb2Zmc2V0ICAgMjg0Ci0gICAgICAgc3ltYm9saWMgaGVhZGVyIHNpemUgICAgIDk2Ci0gICAgICAgb3B0aW9uYWwgaGVhZGVyICAgICAgICAgIDU2Ci0gICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgIDB4MAotCi0gICBTeW1ib2xpYyBoZWFkZXIsIG1hZ2ljIG51bWJlciA9IDB4NzAwOSwgdnN0YW1wID0gMS4zMToKLQotICAgICAgIEluZm8gICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgTnVtYmVyICAgICAgIEJ5dGVzCi0gICAgICAgPT09PSAgICAgICAgICAgICAgICAgICAgICA9PT09PT0gICAgICA9PT09PT0gICAgICA9PT09PQotCi0gICAgICAgTGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAzODAgICAgICAgICAgIDQgICAgICAgICAgIDQgWzEzXQotICAgICAgIERlbnNlIG51bWJlcnMgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgUHJvY2VkdXJlcyBUYWJsZXMgICAgICAgICAgICAzODQgICAgICAgICAgIDEgICAgICAgICAgNTIKLSAgICAgICBMb2NhbCBTeW1ib2xzICAgICAgICAgICAgICAgIDQzNiAgICAgICAgICAxNiAgICAgICAgIDE5MgotICAgICAgIE9wdGltaXphdGlvbiBTeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgQXV4aWxpYXJ5IFN5bWJvbHMgICAgICAgICAgICA2MjggICAgICAgICAgMzkgICAgICAgICAxNTYKLSAgICAgICBMb2NhbCBTdHJpbmdzICAgICAgICAgICAgICAgIDc4NCAgICAgICAgICA4MCAgICAgICAgICA4MAotICAgICAgIEV4dGVybmFsIFN0cmluZ3MgICAgICAgICAgICAgODY0ICAgICAgICAgMTQ0ICAgICAgICAgMTQ0Ci0gICAgICAgRmlsZSBUYWJsZXMgICAgICAgICAgICAgICAgIDEwMDggICAgICAgICAgIDIgICAgICAgICAxNDQKLSAgICAgICBSZWxhdGl2ZSBGaWxlcyAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotICAgICAgIEV4dGVybmFsIFN5bWJvbHMgICAgICAgICAgICAxMTUyICAgICAgICAgIDIwICAgICAgICAgMzIwCi0KLSAgIEZpbGUgIzAsICJoZWxsbzIuYyIKLQotICAgICAgIE5hbWUgaW5kZXggID0gMSAgICAgICAgICBSZWFkaW4gICAgICA9IE5vCi0gICAgICAgTWVyZ2UgICAgICAgPSBObyAgICAgICAgIEVuZGlhbiAgICAgID0gTElUVExFCi0gICAgICAgRGVidWcgbGV2ZWwgPSBHMiAgICAgICAgIExhbmd1YWdlICAgID0gQwotICAgICAgIEFkciAgICAgICAgID0gMHgwMDAwMDAwMAotCi0gICAgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgICBOdW1iZXIgICAgICAgIFNpemUgICAgICBPZmZzZXQKLSAgICAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgICA9PT09PSAgICAgID09PT09PSAgICAgICAgPT09PSAgICAgID09PT09PQotICAgICAgIExvY2FsIHN0cmluZ3MgICAgICAgICAgICAgICAgICAwICAgICAgICAgIDE1ICAgICAgICAgIDE1ICAgICAgICAgNzg0Ci0gICAgICAgTG9jYWwgc3ltYm9scyAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDYgICAgICAgICAgNzIgICAgICAgICA0MzYKLSAgICAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAxMyAgICAgICAgICAxMyAgICAgICAgIDM4MAotICAgICAgIE9wdGltaXphdGlvbiBzeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgUHJvY2VkdXJlcyAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAgNTIgICAgICAgICAzODQKLSAgICAgICBBdXhpbGlhcnkgc3ltYm9scyAgICAgICAgICAgICAgMCAgICAgICAgICAxNCAgICAgICAgICA1NiAgICAgICAgIDYyOAotICAgICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0KLSAgICBUaGVyZSBhcmUgNiBsb2NhbCBzeW1ib2xzLCBzdGFydGluZyBhdCA0MzYKLQotCVN5bWJvbCMgMDogImhlbGxvMi5jIgotCSAgICBFbmQrMSBzeW1ib2wgID0gNgotCSAgICBTdHJpbmcgaW5kZXggID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gNgotCSAgICBTeW1ib2wgdHlwZSAgID0gRmlsZSAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOiAibWFpbiIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDUKLQkgICAgVHlwZSAgICAgICAgICA9IGludAotCSAgICBTdHJpbmcgaW5kZXggID0gMTAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEyCi0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDI6ICIiCi0JICAgIEVuZCsxIHN5bWJvbCAgPSA0Ci0JICAgIFN0cmluZyBpbmRleCAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSA0Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBCbG9jayAgICAgICBWYWx1ZSAgPSA4Ci0KLQlTeW1ib2wjIDM6ICIiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAyCi0JICAgIFN0cmluZyBpbmRleCAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAyCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAyOAotCi0JU3ltYm9sIyA0OiAibWFpbiIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDEKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSA1MgotCi0JU3ltYm9sIyA1OiAiaGVsbG8yLmMiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAwCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCi0KLSAgICBUaGVyZSBhcmUgMTQgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDYyOC4KLQotCSogIzAgICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMxICAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0JKiAjMiAgICAgICAgICAgICAgIDgsIFsgICA4LyAgICAgIDBdLCBbIDIgMDowIDA6MDowOjA6MDowXQotCSogIzMgICAgICAgICAgICAgIDE2LCBbICAxNi8gICAgICAwXSwgWyA0IDA6MCAwOjA6MDowOjA6MF0KLQkqICM0ICAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0JKiAjNSAgICAgICAgICAgICAgMzIsIFsgIDMyLyAgICAgIDBdLCBbIDggMDowIDA6MDowOjA6MDowXQotCSogIzYgICAgICAgICAgICAgIDQwLCBbICA0MC8gICAgICAwXSwgWzEwIDA6MCAwOjA6MDowOjA6MF0KLQkqICM3ICAgICAgICAgICAgICA0NCwgWyAgNDQvICAgICAgMF0sIFsxMSAwOjAgMDowOjA6MDowOjBdCi0JKiAjOCAgICAgICAgICAgICAgMTIsIFsgIDEyLyAgICAgIDBdLCBbIDMgMDowIDA6MDowOjA6MDowXQotCSogIzkgICAgICAgICAgICAgIDIwLCBbICAyMC8gICAgICAwXSwgWyA1IDA6MCAwOjA6MDowOjA6MF0KLQkqICMxMCAgICAgICAgICAgICAyOCwgWyAgMjgvICAgICAgMF0sIFsgNyAwOjAgMDowOjA6MDowOjBdCi0JKiAjMTEgICAgICAgICAgICAgMzYsIFsgIDM2LyAgICAgIDBdLCBbIDkgMDowIDA6MDowOjA6MDowXQotCSAgIzEyICAgICAgICAgICAgICA1LCBbICAgNS8gICAgICAwXSwgWyAxIDE6MCAwOjA6MDowOjA6MF0KLQkgICMxMyAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0KLSAgICBUaGVyZSBhcmUgMSBwcm9jZWR1cmUgZGVzY3JpcHRvciBlbnRyaWVzLCBzdGFydGluZyBhdCAwLgotCi0JUHJvY2VkdXJlIGRlc2NyaXB0b3IgMDoKLQkgICAgTmFtZSBpbmRleCAgID0gMTAgICAgICAgICAgTmFtZSAgICAgICAgICA9ICJtYWluIgotCSAgICAubWFzayAweDgwMDAwMDAwLC00ICAgICAgICAuZm1hc2sgMHgwMDAwMDAwMCwwCi0JICAgIC5mcmFtZSAkMjksMjQsJDMxCi0JICAgIE9wdC4gc3RhcnQgICA9IC0xICAgICAgICAgIFN5bWJvbHMgc3RhcnQgPSAxCi0JICAgIEZpcnN0IGxpbmUgIyA9IDMgICAgICAgICAgIExhc3QgbGluZSAjICAgPSA2Ci0JICAgIExpbmUgT2Zmc2V0ICA9IDAgICAgICAgICAgIEFkZHJlc3MgICAgICAgPSAweDAwMDAwMDAwCi0KLQlUaGVyZSBhcmUgNCBieXRlcyBob2xkaW5nIGxpbmUgbnVtYmVycywgc3RhcnRpbmcgYXQgMzgwLgotCSAgICBMaW5lICAgICAgICAgICAzLCAgIGRlbHRhICAgICAwLCAgIGNvdW50ICAyCi0JICAgIExpbmUgICAgICAgICAgIDQsICAgZGVsdGEgICAgIDEsICAgY291bnQgIDMKLQkgICAgTGluZSAgICAgICAgICAgNSwgICBkZWx0YSAgICAgMSwgICBjb3VudCAgMgotCSAgICBMaW5lICAgICAgICAgICA2LCAgIGRlbHRhICAgICAxLCAgIGNvdW50ICA2Ci0KLSAgIEZpbGUgIzEsICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKLQotICAgIE5hbWUgaW5kZXggID0gMSAgICAgICAgICBSZWFkaW4gICAgICA9IE5vCi0gICAgTWVyZ2UgICAgICAgPSBZZXMgICAgICAgIEVuZGlhbiAgICAgID0gTElUVExFCi0gICAgRGVidWcgbGV2ZWwgPSBHMiAgICAgICAgIExhbmd1YWdlICAgID0gQwotICAgIEFkciAgICAgICAgID0gMHgwMDAwMDAwMAotCi0gICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgICBOdW1iZXIgICAgICAgIFNpemUgICAgICBPZmZzZXQKLSAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgICA9PT09PSAgICAgID09PT09PSAgICAgICAgPT09PSAgICAgID09PT09PQotICAgIExvY2FsIHN0cmluZ3MgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgIDY1ICAgICAgICAgIDY1ICAgICAgICAgNzk5Ci0gICAgTG9jYWwgc3ltYm9scyAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgMTAgICAgICAgICAxMjAgICAgICAgICA1MDgKLSAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgIDM4MAotICAgIE9wdGltaXphdGlvbiBzeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgUHJvY2VkdXJlcyAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICA0MzYKLSAgICBBdXhpbGlhcnkgc3ltYm9scyAgICAgICAgICAgICAxNCAgICAgICAgICAyNSAgICAgICAgIDEwMCAgICAgICAgIDY4NAotICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0KLSAgICBUaGVyZSBhcmUgMTAgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgYXQgNDQyCi0KLQlTeW1ib2wjIDA6ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDEwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxMAotCSAgICBTeW1ib2wgdHlwZSAgID0gRmlsZSAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOiAiX2lvYnVmIgotCSAgICBFbmQrMSBzeW1ib2wgID0gOQotCSAgICBTdHJpbmcgaW5kZXggID0gMjIKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDkKLQkgICAgU3ltYm9sIHR5cGUgICA9IEJsb2NrICAgICAgIFZhbHVlICA9IDIwCi0KLQlTeW1ib2wjIDI6ICJfY250IgotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSAyOQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gNAotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAzOiAiX3B0ciIKLQkgICAgVHlwZSAgICAgICAgICA9IHB0ciB0byBjaGFyCi0JICAgIFN0cmluZyBpbmRleCAgPSAzNAotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMTUKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDMyCi0KLQlTeW1ib2wjIDQ6ICJfYmFzZSIKLQkgICAgVHlwZSAgICAgICAgICA9IHB0ciB0byBjaGFyCi0JICAgIFN0cmluZyBpbmRleCAgPSAzOQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMTYKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDY0Ci0KLQlTeW1ib2wjIDU6ICJfYnVmc2l6IgotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSA0NQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gNAotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gOTYKLQotCVN5bWJvbCMgNjogIl9mbGFnIgotCSAgICBUeXBlICAgICAgICAgID0gc2hvcnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUzCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAzCi0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSAxMjgKLQotCVN5bWJvbCMgNzogIl9maWxlIgotCSAgICBUeXBlICAgICAgICAgID0gY2hhcgotCSAgICBTdHJpbmcgaW5kZXggID0gNTkKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDIKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDE0NAotCi0JU3ltYm9sIyA4OiAiIgotCSAgICBGaXJzdCBzeW1ib2wgID0gMQotCSAgICBTdHJpbmcgaW5kZXggID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMQotCSAgICBTeW1ib2wgdHlwZSAgID0gRW5kICAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA5OiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAwCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCi0KLSAgICBUaGVyZSBhcmUgMjUgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDY0Mi4KLQotCSogIzE0ICAgICAgICAgICAgIC0xLCBbNDA5NS8xMDQ4NTc1XSwgWzYzIDE6MSBmOmY6ZjpmOmY6Zl0KLQkgICMxNSAgICAgICAgICA2NTU0NCwgWyAgIDgvICAgICAxNl0sIFsgMiAwOjAgMTowOjA6MDowOjBdCi0JICAjMTYgICAgICAgICAgNjU1NDQsIFsgICA4LyAgICAgMTZdLCBbIDIgMDowIDE6MDowOjA6MDowXQotCSogIzE3ICAgICAgICAgMTk2NjU2LCBbICA0OC8gICAgIDQ4XSwgWzEyIDA6MCAzOjA6MDowOjA6MF0KLQkqICMxOCAgICAgICAgICAgODE5MSwgWzQwOTUvICAgICAgMV0sIFs2MyAxOjEgMDowOjA6MDpmOjFdCi0JKiAjMTkgICAgICAgICAgICAgIDEsIFsgICAxLyAgICAgIDBdLCBbIDAgMTowIDA6MDowOjA6MDowXQotCSogIzIwICAgICAgICAgIDIwNDc5LCBbNDA5NS8gICAgICA0XSwgWzYzIDE6MSAwOjA6MDowOmY6NF0KLQkqICMyMSAgICAgICAgICAgICAgMSwgWyAgIDEvICAgICAgMF0sIFsgMCAxOjAgMDowOjA6MDowOjBdCi0JKiAjMjIgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzIzICAgICAgICAgICAgICAyLCBbICAgMi8gICAgICAwXSwgWyAwIDA6MSAwOjA6MDowOjA6MF0KLQkqICMyNCAgICAgICAgICAgIDE2MCwgWyAxNjAvICAgICAgMF0sIFs0MCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjUgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI2ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyNyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjggICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI5ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzEgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzMyICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzQgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM1ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzNiAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzcgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM4ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQotICAgIFRoZXJlIGFyZSAwIHByb2NlZHVyZSBkZXNjcmlwdG9yIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDEuCi0KLSAgIFRoZXJlIGFyZSAyMCBleHRlcm5hbCBzeW1ib2xzLCBzdGFydGluZyBhdCAxMTUyCi0KLQlTeW1ib2wjIDA6ICJfaW9iIgotCSAgICBUeXBlICAgICAgICAgID0gYXJyYXkgWzMgezE2MH1dIG9mIHN0cnVjdCBfaW9idWYgeyBpZmQgPSAxLCBpbmRleCA9IDEgfQotCSAgICBTdHJpbmcgaW5kZXggID0gMCAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTcKLQkgICAgU3ltYm9sIHR5cGUgICA9IEdsb2JhbCAgICAgIFZhbHVlICA9IDYwCi0KLQlTeW1ib2wjIDE6ICJmb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUgICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMjogImZkb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDExICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMzogImZyZW9wZW4iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxOCAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDQ6ICJwb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDI2ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNTogInRtcGZpbGUiCi0JICAgIFN0cmluZyBpbmRleCAgPSAzMiAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDY6ICJmdGVsbCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDQwICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNzogInJld2luZCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDQ2ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgODogInNldGJ1ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUzICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgOTogInNldGJ1ZmZlciIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDYwICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTA6ICJzZXRsaW5lYnVmIgotCSAgICBTdHJpbmcgaW5kZXggID0gNzAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMTogImZnZXRzIgotCSAgICBTdHJpbmcgaW5kZXggID0gODEgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMjogImdldHMiCi0JICAgIFN0cmluZyBpbmRleCAgPSA4NyAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDEzOiAiY3Rlcm1pZCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDkyICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTQ6ICJjdXNlcmlkIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTAwICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNTogInRlbXBuYW0iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMDggICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE2OiAidG1wbmFtIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTE2ICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNzogInNwcmludGYiCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMjMgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE4OiAibWFpbiIKLQkgICAgVHlwZSAgICAgICAgICA9IGludAotCSAgICBTdHJpbmcgaW5kZXggID0gMTMxICAgICAgICAgSWZkICAgID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOTogInByaW50ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEzNiAgICAgICAgIElmZCAgICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFVuZGVmaW5lZCAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotICAgVGhlIGZvbGxvd2luZyBhdXhpbGlhcnkgdGFibGUgZW50cmllcyB3ZXJlIHVudXNlZDoKLQotICAgICMwICAgICAgICAgICAgICAgMCAgMHgwMDAwMDAwMCAgdm9pZAotICAgICMyICAgICAgICAgICAgICAgOCAgMHgwMDAwMDAwOCAgY2hhcgotICAgICMzICAgICAgICAgICAgICAxNiAgMHgwMDAwMDAxMCAgc2hvcnQKLSAgICAjNCAgICAgICAgICAgICAgMjQgIDB4MDAwMDAwMTggIGludAotICAgICM1ICAgICAgICAgICAgICAzMiAgMHgwMDAwMDAyMCAgbG9uZwotICAgICM2ICAgICAgICAgICAgICA0MCAgMHgwMDAwMDAyOCAgZmxvYXQKLSAgICAjNyAgICAgICAgICAgICAgNDQgIDB4MDAwMDAwMmMgIGRvdWJsZQotICAgICM4ICAgICAgICAgICAgICAxMiAgMHgwMDAwMDAwYyAgdW5zaWduZWQgY2hhcgotICAgICM5ICAgICAgICAgICAgICAyMCAgMHgwMDAwMDAxNCAgdW5zaWduZWQgc2hvcnQKLSAgICAjMTAgICAgICAgICAgICAgMjggIDB4MDAwMDAwMWMgIHVuc2lnbmVkIGludAotICAgICMxMSAgICAgICAgICAgICAzNiAgMHgwMDAwMDAyNCAgdW5zaWduZWQgbG9uZwotICAgICMxNCAgICAgICAgICAgICAgMCAgMHgwMDAwMDAwMCAgdm9pZAotICAgICMxNSAgICAgICAgICAgICAyNCAgMHgwMDAwMDAxOCAgaW50Ci0gICAgIzE5ICAgICAgICAgICAgIDMyICAweDAwMDAwMDIwICBsb25nCi0gICAgIzIwICAgICAgICAgICAgIDQwICAweDAwMDAwMDI4ICBmbG9hdAotICAgICMyMSAgICAgICAgICAgICA0NCAgMHgwMDAwMDAyYyAgZG91YmxlCi0gICAgIzIyICAgICAgICAgICAgIDEyICAweDAwMDAwMDBjICB1bnNpZ25lZCBjaGFyCi0gICAgIzIzICAgICAgICAgICAgIDIwICAweDAwMDAwMDE0ICB1bnNpZ25lZCBzaG9ydAotICAgICMyNCAgICAgICAgICAgICAyOCAgMHgwMDAwMDAxYyAgdW5zaWduZWQgaW50Ci0gICAgIzI1ICAgICAgICAgICAgIDM2ICAweDAwMDAwMDI0ICB1bnNpZ25lZCBsb25nCi0gICAgIzI2ICAgICAgICAgICAgIDQ4ICAweDAwMDAwMDMwICBzdHJ1Y3Qgbm8gbmFtZSB7IGlmZCA9IC0xLCBpbmRleCA9IDEwNDg1NzUgfQotKi8KLQwKLS8qIFJlZGVmaW5pdGlvbiBvZiBvZiBzdG9yYWdlIGNsYXNzZXMgYXMgYW4gZW51bWVyYXRpb24gZm9yIGJldHRlcgotICAgZGVidWdnaW5nLiAgKi8KLQotdHlwZWRlZiBlbnVtIHNjIHsKLSAgc2NfTmlsCSA9IHNjTmlsLAkgIC8qIG5vIHN0b3JhZ2UgY2xhc3MgKi8KLSAgc2NfVGV4dAkgPSBzY1RleHQsCSAgLyogdGV4dCBzeW1ib2wgKi8KLSAgc2NfRGF0YQkgPSBzY0RhdGEsCSAgLyogaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSAgc2NfQnNzCSA9IHNjQnNzLAkgIC8qIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0gIHNjX1JlZ2lzdGVyCSA9IHNjUmVnaXN0ZXIsCSAgLyogdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlciAqLwotICBzY19BYnMJID0gc2NBYnMsCSAgLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCi0gIHNjX1VuZGVmaW5lZAkgPSBzY1VuZGVmaW5lZCwJICAvKiB3aG8ga25vd3M/ICovCi0gIHNjX0NkYkxvY2FsCSA9IHNjQ2RiTG9jYWwsCSAgLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBzZS0+dmEuPz8gKi8KLSAgc2NfQml0cwkgPSBzY0JpdHMsCSAgLyogdGhpcyBpcyBhIGJpdCBmaWVsZCAqLwotICBzY19DZGJTeXN0ZW0JID0gc2NDZGJTeXN0ZW0sCSAgLyogdmFsdWUgaXMgSU4gQ0RCJ3MgYWRkcmVzcyBzcGFjZSAqLwotICBzY19SZWdJbWFnZQkgPSBzY1JlZ0ltYWdlLAkgIC8qIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrICovCi0gIHNjX0luZm8JID0gc2NJbmZvLAkgIC8qIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiAqLwotICBzY19Vc2VyU3RydWN0CSA9IHNjVXNlclN0cnVjdCwgIC8qIGFkZHIgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcyAqLwotICBzY19TRGF0YQkgPSBzY1NEYXRhLAkgIC8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGRhdGEgKi8KLSAgc2NfU0JzcwkgPSBzY1NCc3MsCSAgLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgY29tbW9uICovCi0gIHNjX1JEYXRhCSA9IHNjUkRhdGEsCSAgLyogbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEgKi8KLSAgc2NfVmFyCSA9IHNjVmFyLAkgIC8qIFZhciBwYXJhbWV0ZXIgKGZvcnRyYW4scGFzY2FsKSAqLwotICBzY19Db21tb24JID0gc2NDb21tb24sCSAgLyogY29tbW9uIHZhcmlhYmxlICovCi0gIHNjX1NDb21tb24JID0gc2NTQ29tbW9uLAkgIC8qIHNtYWxsIGNvbW1vbiAqLwotICBzY19WYXJSZWdpc3RlciA9IHNjVmFyUmVnaXN0ZXIsIC8qIFZhciBwYXJhbWV0ZXIgaW4gYSByZWdpc3RlciAqLwotICBzY19WYXJpYW50CSA9IHNjVmFyaWFudCwJICAvKiBWYXJpYW50IHJlY29yZCAqLwotICBzY19TVW5kZWZpbmVkCSA9IHNjU1VuZGVmaW5lZCwgIC8qIHNtYWxsIHVuZGVmaW5lZChleHRlcm5hbCkgZGF0YSAqLwotICBzY19Jbml0CSA9IHNjSW5pdCwJICAvKiAuaW5pdCBzZWN0aW9uIHN5bWJvbCAqLwotICBzY19NYXgJID0gc2NNYXgJICAvKiBNYXggc3RvcmFnZSBjbGFzcysxICovCi19IHNjX3Q7Ci0KLS8qIFJlZGVmaW5pdGlvbiBvZiBzeW1ib2wgdHlwZS4gICovCi0KLXR5cGVkZWYgZW51bSBzdCB7Ci0gIHN0X05pbAk9IHN0TmlsLAkvKiBOdXRoaW4nIHNwZWNpYWwgKi8KLSAgc3RfR2xvYmFsCT0gc3RHbG9iYWwsCS8qIGV4dGVybmFsIHN5bWJvbCAqLwotICBzdF9TdGF0aWMJPSBzdFN0YXRpYywJLyogc3RhdGljICovCi0gIHN0X1BhcmFtCT0gc3RQYXJhbSwJLyogcHJvY2VkdXJlIGFyZ3VtZW50ICovCi0gIHN0X0xvY2FsCT0gc3RMb2NhbCwJLyogbG9jYWwgdmFyaWFibGUgKi8KLSAgc3RfTGFiZWwJPSBzdExhYmVsLAkvKiBsYWJlbCAqLwotICBzdF9Qcm9jCT0gc3RQcm9jLAkvKiAgICAgIiAgICAgICIJIFByb2NlZHVyZSAqLwotICBzdF9CbG9jawk9IHN0QmxvY2ssCS8qIGJlZ2lubmluZyBvZiBibG9jayAqLwotICBzdF9FbmQJPSBzdEVuZCwJLyogZW5kIChvZiBhbnl0aGluZykgKi8KLSAgc3RfTWVtYmVyCT0gc3RNZW1iZXIsCS8qIG1lbWJlciAob2YgYW55dGhpbmcJLSBzdHJ1Y3QvdW5pb24vZW51bSAqLwotICBzdF9UeXBlZGVmCT0gc3RUeXBlZGVmLAkvKiB0eXBlIGRlZmluaXRpb24gKi8KLSAgc3RfRmlsZQk9IHN0RmlsZSwJLyogZmlsZSBuYW1lICovCi0gIHN0X1JlZ1JlbG9jCT0gc3RSZWdSZWxvYywJLyogcmVnaXN0ZXIgcmVsb2NhdGlvbiAqLwotICBzdF9Gb3J3YXJkCT0gc3RGb3J3YXJkLAkvKiBmb3J3YXJkaW5nIGFkZHJlc3MgKi8KLSAgc3RfU3RhdGljUHJvYwk9IHN0U3RhdGljUHJvYywJLyogbG9hZCB0aW1lIG9ubHkgc3RhdGljIHByb2NzICovCi0gIHN0X0NvbnN0YW50CT0gc3RDb25zdGFudCwJLyogY29uc3QgKi8KLSAgc3RfU3RyCT0gc3RTdHIsCS8qIHN0cmluZyAqLwotICBzdF9OdW1iZXIJPSBzdE51bWJlciwJLyogcHVyZSBudW1iZXIgKGllLiA0IE5PUiAyKzIpICovCi0gIHN0X0V4cHIJPSBzdEV4cHIsCS8qIDIrMiB2cy4gNCAqLwotICBzdF9UeXBlCT0gc3RUeXBlLAkvKiBwb3N0LWNvZXJjaW9uIFNFUiAqLwotICBzdF9NYXgJPSBzdE1heAkJLyogbWF4IHR5cGUrMSAqLwotfSBzdF90OwotCi0vKiBSZWRlZmluaXRpb24gb2YgdHlwZSBxdWFsaWZpZXJzLiAgKi8KLQotdHlwZWRlZiBlbnVtIHRxIHsKLSAgdHFfTmlsCT0gdHFOaWwsCS8qIGJ0IGlzIHdoYXQgeW91IHNlZSAqLwotICB0cV9QdHIJPSB0cVB0ciwJLyogcG9pbnRlciAqLwotICB0cV9Qcm9jCT0gdHFQcm9jLAkvKiBwcm9jZWR1cmUgKi8KLSAgdHFfQXJyYXkJPSB0cUFycmF5LAkvKiBkdWggKi8KLSAgdHFfRmFyCT0gdHFGYXIsCS8qIGxvbmdlciBhZGRyZXNzaW5nIC0gODA4Ni84IGxhbmQgKi8KLSAgdHFfVm9sCT0gdHFWb2wsCS8qIHZvbGF0aWxlICovCi0gIHRxX01heAk9IHRxTWF4CQkvKiBNYXggdHlwZSBxdWFsaWZpZXIrMSAqLwotfSB0cV90OwotCi0vKiBSZWRlZmluaXRpb24gb2YgYmFzaWMgdHlwZXMuICAqLwotCi10eXBlZGVmIGVudW0gYnQgewotICBidF9OaWwJPSBidE5pbCwJLyogdW5kZWZpbmVkICovCi0gIGJ0X0Fkcgk9IGJ0QWRyLAkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLwotICBidF9DaGFyCT0gYnRDaGFyLAkvKiBjaGFyYWN0ZXIgKi8KLSAgYnRfVUNoYXIJPSBidFVDaGFyLAkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KLSAgYnRfU2hvcnQJPSBidFNob3J0LAkvKiBzaG9ydCAqLwotICBidF9VU2hvcnQJPSBidFVTaG9ydCwJLyogdW5zaWduZWQgc2hvcnQgKi8KLSAgYnRfSW50CT0gYnRJbnQsCS8qIGludCAqLwotICBidF9VSW50CT0gYnRVSW50LAkvKiB1bnNpZ25lZCBpbnQgKi8KLSAgYnRfTG9uZwk9IGJ0TG9uZywJLyogbG9uZyAqLwotICBidF9VTG9uZwk9IGJ0VUxvbmcsCS8qIHVuc2lnbmVkIGxvbmcgKi8KLSAgYnRfRmxvYXQJPSBidEZsb2F0LAkvKiBmbG9hdCAocmVhbCkgKi8KLSAgYnRfRG91YmxlCT0gYnREb3VibGUsCS8qIERvdWJsZSAocmVhbCkgKi8KLSAgYnRfU3RydWN0CT0gYnRTdHJ1Y3QsCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLwotICBidF9Vbmlvbgk9IGJ0VW5pb24sCS8qIFVuaW9uICh2YXJpYW50KSAqLwotICBidF9FbnVtCT0gYnRFbnVtLAkvKiBFbnVtZXJhdGVkICovCi0gIGJ0X1R5cGVkZWYJPSBidFR5cGVkZWYsCS8qIGRlZmluZWQgdmlhIGEgdHlwZWRlZiwgaXN5bVJlZiBwb2ludHMgKi8KLSAgYnRfUmFuZ2UJPSBidFJhbmdlLAkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KLSAgYnRfU2V0CT0gYnRTZXQsCS8qIHBhc2NhbCBzZXRzICovCi0gIGJ0X0NvbXBsZXgJPSBidENvbXBsZXgsCS8qIGZvcnRyYW4gY29tcGxleCAqLwotICBidF9EQ29tcGxleAk9IGJ0RENvbXBsZXgsCS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSAgYnRfSW5kaXJlY3QJPSBidEluZGlyZWN0LAkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLwotICBidF9GaXhlZERlYwk9IGJ0Rml4ZWREZWMsCS8qIEZpeGVkIERlY2ltYWwgKi8KLSAgYnRfRmxvYXREZWMJPSBidEZsb2F0RGVjLAkvKiBGbG9hdCBEZWNpbWFsICovCi0gIGJ0X1N0cmluZwk9IGJ0U3RyaW5nLAkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCi0gIGJ0X0JpdAk9IGJ0Qml0LAkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KLSAgYnRfUGljdHVyZQk9IGJ0UGljdHVyZSwJLyogUGljdHVyZSAqLwotICBidF9Wb2lkCT0gYnRWb2lkLAkvKiBWb2lkICovCi0gIGJ0X01heAk9IGJ0TWF4CQkvKiBNYXggYmFzaWMgdHlwZSsxICovCi19IGJ0X3Q7Ci0KLSNkZWZpbmUgTl9UUSBpdHFNYXgKLQotLyogU3RhdGVzIGZvciB3aGV0aGVyIHRvIGhhc2ggdHlwZSBvciBub3QuICAqLwotdHlwZWRlZiBlbnVtIGhhc2hfc3RhdGUgewotICBoYXNoX25vCT0gMCwJCS8qIGRvbid0IGhhc2ggdHlwZSAqLwotICBoYXNoX3llcwk9IDEsCQkvKiBvayB0byBoYXNoIHR5cGUsIG9yIHVzZSBwcmV2aW91cyBoYXNoICovCi0gIGhhc2hfcmVjb3JkCT0gMgkJLyogb2sgdG8gcmVjb3JkIGhhc2gsIGJ1dCBkb24ndCB1c2UgcHJldi4gKi8KLX0gaGFzaF9zdGF0ZV90OwotCi0vKiBUeXBlcyBvZiBkaWZmZXJlbnQgc2l6ZWQgYWxsb2NhdGlvbiByZXF1ZXN0cy4gICovCi1lbnVtIGFsbG9jX3R5cGUgewotICBhbGxvY190eXBlX25vbmUsCQkvKiBkdW1teSB2YWx1ZSAqLwotICBhbGxvY190eXBlX3Njb3BlLAkJLyogbmVzdGVkIHNjb3BlcyBsaW5rZWQgbGlzdCAqLwotICBhbGxvY190eXBlX3ZsaW5rcywJCS8qIGdsdWUgbGlua2luZyBwYWdlcyBpbiB2YXJyYXkgKi8KLSAgYWxsb2NfdHlwZV9zaGFzaCwJCS8qIHN0cmluZyBoYXNoIGVsZW1lbnQgKi8KLSAgYWxsb2NfdHlwZV90aGFzaCwJCS8qIHR5cGUgaGFzaCBlbGVtZW50ICovCi0gIGFsbG9jX3R5cGVfdGFnLAkJLyogc3RydWN0L3VuaW9uL3RhZyBlbGVtZW50ICovCi0gIGFsbG9jX3R5cGVfZm9yd2FyZCwJCS8qIGVsZW1lbnQgdG8gaG9sZCB1bmtub3duIHRhZyAqLwotICBhbGxvY190eXBlX3RoZWFkLAkJLyogaGVhZCBvZiB0eXBlIGhhc2ggbGlzdCAqLwotICBhbGxvY190eXBlX3ZhcnJheSwJCS8qIGdlbmVyYWwgdmFycmF5IGFsbG9jYXRpb24gKi8KLSAgYWxsb2NfdHlwZV9saW5lbm8sCQkvKiBsaW5lIG51bWJlciBsaXN0ICovCi0gIGFsbG9jX3R5cGVfbGFzdAkJLyogbGFzdCsxIGVsZW1lbnQgZm9yIGFycmF5IGJvdW5kcyAqLwotfTsKLQotLyogVHlwZXMgb2YgYXV4aWxpYXJ5IHR5cGUgaW5mb3JtYXRpb24uICAqLwotZW51bSBhdXhfdHlwZSB7Ci0gIGF1eF90aXIsCQkJLyogVElSIHR5cGUgaW5mb3JtYXRpb24gKi8KLSAgYXV4X3JuZHgsCQkJLyogcmVsYXRpdmUgaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KLSAgYXV4X2RuTG93LAkJCS8qIGxvdyBkaW1lbnNpb24gKi8KLSAgYXV4X2RuSGlnaCwJCQkvKiBoaWdoIGRpbWVuc2lvbiAqLwotICBhdXhfaXN5bSwJCQkvKiBzeW1ib2wgdGFibGUgaW5kZXggKGVuZCBvZiBwcm9jKSAqLwotICBhdXhfaXNzLAkJCS8qIGluZGV4IGludG8gc3RyaW5nIHNwYWNlIChub3QgdXNlZCkgKi8KLSAgYXV4X3dpZHRoLAkJCS8qIHdpZHRoIGZvciBub24tZGVmYXVsdCBzaXplZCBzdHJ1YyBmaWVsZHMgKi8KLSAgYXV4X2NvdW50CQkJLyogY291bnQgb2YgcmFuZ2VzIGZvciB2YXJpYW50IGFybSAqLwotfTsKLQwKLS8qIFN0cnVjdHVyZXMgdG8gcHJvdmlkZSBuLW51bWJlciBvZiB2aXJ0dWFsIGFycmF5cywgZWFjaCBvZiB3aGljaCBjYW4KLSAgIGdyb3cgbGluZWFybHksIGFuZCB3aGljaCBhcmUgd3JpdHRlbiBpbiB0aGUgb2JqZWN0IGZpbGUgYXMKLSAgIHNlcXVlbnRpYWwgcGFnZXMuICBPbiBzeXN0ZW1zIHdpdGggYSBCU0QgbWFsbG9jLCB0aGUKLSAgIE1BWF9DTFVTVEVSX1BBR0VTIHNob3VsZCBiZSAxIGxlc3MgdGhhbiBhIHBvd2VyIG9mIHR3bywgc2luY2UKLSAgIG1hbGxvYyBhZGRzIGl0J3Mgb3ZlcmhlYWQsIGFuZCByb3VuZHMgdXAgdG8gdGhlIG5leHQgcG93ZXIgb2YgMi4KLSAgIFBhZ2VzIGFyZSBsaW5rZWQgdG9nZXRoZXIgdmlhIGEgbGlua2VkIGxpc3QuCi0KLSAgIElmIFBBR0VfU0laRSBpcyA+IDQwOTYsIHRoZSBzdHJpbmcgbGVuZ3RoIGluIHRoZSBzaGFzaF90IHN0cnVjdHVyZQotICAgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgKGFzc3VtaW5nIHRoZXJlIGFyZSBzdHJpbmdzID4gNDA5NiBieXRlcykuICAqLwotCi0vKiBGSVhNRTogWWVzLCB0aGVyZSBjYW4gYmUgc3VjaCBzdHJpbmdzIHdoaWxlIGVtaXR0aW5nIEMrKyBjbGFzcyBkZWJ1ZwotICAgaW5mby4gIFRlbXBsYXRlcyBhcmUgdGhlIG9mZmVuZGVyIGhlcmUsIHRoZSB0ZXN0IGNhc2UgaW4gcXVlc3Rpb24gCi0gICBoYXZpbmcgYSBtYW5nbGVkIGNsYXNzIG5hbWUgb2YKLQotICAgICB0N3JiX3RyZWU0WjR4a2V5WnQ0cGFpcjJaQzR4a2V5WnQ3eHNvY2tldDFaNFVzZXJadDlzZWxlY3Qxc3QyWnQ0cGFpclwKLSAgICAgMlpDNHhrZXladDd4c29ja2V0MVo0VXNlclo0eGtleVp0NGxlc3MxWjR4a2V5Ci0KLSAgIFJlcGVhdCB0aGF0IGEgY291cGxlIGRvemVuIHRpbWVzIHdoaWxlIGxpc3RpbmcgdGhlIGNsYXNzIG1lbWJlcnMgYW5kCi0gICB5b3UndmUgZ290IHN0cmluZ3Mgb3ZlciA0ay4gIEhhY2sgYXJvdW5kIHRoaXMgZm9yIG5vdyBieSBpbmNyZWFzaW5nCi0gICB0aGUgcGFnZSBzaXplLiAgQSBwcm9wZXIgc29sdXRpb24gd291bGQgYWJhbmRvbiB0aGlzIHN0cnVjdHVyZSBzY2hlbWUKLSAgIGNlcnRhaW5seSBmb3IgdmVyeSBsYXJnZSBzdHJpbmdzLCBhbmQgcG9zc2libHkgZW50aXJlbHkuICAqLwotCi0jaWZuZGVmIFBBR0VfU0laRQotI2RlZmluZSBQQUdFX1NJWkUgKDgqMTAyNCkJLyogc2l6ZSBvZiB2YXJyYXkgcGFnZXMgKi8KLSNlbmRpZgotCi0jZGVmaW5lIFBBR0VfVVNJWkUgKCh1bnNpZ25lZCBsb25nKSBQQUdFX1NJWkUpCi0KLSNpZm5kZWYgTUFYX0NMVVNURVJfUEFHRVMJLyogIyBwYWdlcyB0byBnZXQgZnJvbSBzeXN0ZW0gKi8KLSNkZWZpbmUgTUFYX0NMVVNURVJfUEFHRVMgNjMKLSNlbmRpZgotCi0vKiBMaW5rZWQgbGlzdCBjb25uZWN0aW5nIHNlcGFyYXRlIHBhZ2UgYWxsb2NhdGlvbnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdmxpbmtzIHsKLSAgc3RydWN0IHZsaW5rcwkqcHJldjsJCS8qIHByZXZpb3VzIHNldCBvZiBwYWdlcyAqLwotICBzdHJ1Y3QgdmxpbmtzICpuZXh0OwkJLyogbmV4dCBzZXQgb2YgcGFnZXMgKi8KLSAgdW5pb24gIHBhZ2UgICAqZGF0dW07CQkvKiBzdGFydCBvZiBwYWdlICovCi0gIHVuc2lnbmVkIGxvbmcJIHN0YXJ0X2luZGV4OwkvKiBzdGFydGluZyBpbmRleCAjIG9mIHBhZ2UgKi8KLX0gdmxpbmtzX3Q7Ci0KLQotLyogVmlydHVhbCBhcnJheSBoZWFkZXIuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdmFycmF5IHsKLSAgdmxpbmtzX3QJKmZpcnN0OwkJCS8qIGZpcnN0IHBhZ2UgbGluayAqLwotICB2bGlua3NfdAkqbGFzdDsJCQkvKiBsYXN0IHBhZ2UgbGluayAqLwotICB1bnNpZ25lZCBsb25nCSBudW1fYWxsb2NhdGVkOwkJLyogIyBvYmplY3RzIGFsbG9jYXRlZCAqLwotICB1bnNpZ25lZCBzaG9ydCBvYmplY3Rfc2l6ZTsJCS8qIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBvYmplY3QgKi8KLSAgdW5zaWduZWQgc2hvcnQgb2JqZWN0c19wZXJfcGFnZTsJLyogIyBvYmplY3RzIHRoYXQgY2FuIGZpdCBvbiBhIHBhZ2UgKi8KLSAgdW5zaWduZWQgc2hvcnQgb2JqZWN0c19sYXN0X3BhZ2U7CS8qICMgb2JqZWN0cyBhbGxvY2F0ZWQgb24gbGFzdCBwYWdlICovCi19IHZhcnJheV90OwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotI2RlZmluZSBPQkpFQ1RTX1BFUl9QQUdFKHR5cGUpIChQQUdFX1NJWkUgLyBzaXplb2YgKHR5cGUpKQotI2Vsc2UKLSNkZWZpbmUgT0JKRUNUU19QRVJfUEFHRSh0eXBlKSAoKHNpemVvZiAodHlwZSkgPiAxKSA/IDEgOiBQQUdFX1NJWkUpCi0jZW5kaWYKLQotI2RlZmluZSBJTklUX1ZBUlJBWSh0eXBlKSB7CS8qIG1hY3JvIHRvIGluaXRpYWxpemUgYSB2YXJyYXkgKi8JXAotICAodmxpbmtzX3QgKikwLAkJLyogZmlyc3QgKi8JCQkJXAotICAodmxpbmtzX3QgKikwLAkJLyogbGFzdCAqLwkJCQlcCi0gIDAsCQkJCS8qIG51bV9hbGxvY2F0ZWQgKi8JCQlcCi0gIHNpemVvZiAodHlwZSksCQkvKiBvYmplY3Rfc2l6ZSAqLwkJCVwKLSAgT0JKRUNUU19QRVJfUEFHRSAodHlwZSksCS8qIG9iamVjdHNfcGVyX3BhZ2UgKi8JCQlcCi0gIE9CSkVDVFNfUEVSX1BBR0UgKHR5cGUpLAkvKiBvYmplY3RzX2xhc3RfcGFnZSAqLwkJCVwKLX0KLQotCi0vKiBNYXN0ZXIgdHlwZSBmb3IgaW5kZXhlcyB3aXRoaW4gdGhlIHN5bWJvbCB0YWJsZS4gKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbnRfdDsKLQotCi0vKiBMaW5rZWQgbGlzdCBzdXBwb3J0IGZvciBuZXN0ZWQgc2NvcGVzIChmaWxlLCBibG9jaywgc3RydWN0dXJlLCBldGMuKS4gICovCi10eXBlZGVmIHN0cnVjdCBzY29wZSB7Ci0gIHN0cnVjdCBzY29wZQkqcHJldjsJCS8qIHByZXZpb3VzIHNjb3BlIGxldmVsICovCi0gIHN0cnVjdCBzY29wZQkqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCi0gIHN0cnVjdCBsb2NhbHN5bSAqbHN5bTsJLyogcG9pbnRlciB0byBsb2NhbCBzeW1ib2wgbm9kZSAqLwotICBzdF90CQkgdHlwZTsJCS8qIHR5cGUgb2YgdGhlIG5vZGUgKi8KLX0gc2NvcGVfdDsKLQotCi0vKiBGb3IgYSBsb2NhbCBzeW1ib2wgd2Ugc3RvcmUgYSBnYXMgc3ltYm9sIGFzIHdlbGwgYXMgdGhlIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gd2UgZ2VuZXJhdGUuICBUaGUgZ2FzIHN5bWJvbCB3aWxsIGJlIE5VTEwgaWYgdGhpcyBpcwotICAgb25seSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotdHlwZWRlZiBzdHJ1Y3QgbG9jYWxzeW0gewotICBjb25zdCBjaGFyICpuYW1lOwkJLyogc3ltYm9sIG5hbWUgKi8KLSAgc3ltYm9sUyAqYXNfc3ltOwkJLyogc3ltYm9sIGFzIHNlZW4gYnkgZ2FzICovCi0gIGJmZF92bWEgYWRkZW5kOwkJLyogYWRkZW5kIHRvIGFzX3N5bSB2YWx1ZSAqLwotICBzdHJ1Y3QgZWZkciAqZmlsZV9wdHI7CS8qIGZpbGUgcG9pbnRlciAqLwotICBzdHJ1Y3QgZWNvZmZfcHJvYyAqcHJvY19wdHI7CS8qIHByb2MgcG9pbnRlciAqLwotICBzdHJ1Y3QgbG9jYWxzeW0gKmJlZ2luX3B0cjsJLyogc3ltYm9sIGF0IHN0YXJ0IG9mIGJsb2NrICovCi0gIHN0cnVjdCBlY29mZl9hdXggKmluZGV4X3B0cjsJLyogaW5kZXggdmFsdWUgdG8gYmUgZmlsbGVkIGluICovCi0gIHN0cnVjdCBmb3J3YXJkICpmb3J3YXJkX3JlZjsJLyogZm9yd2FyZCByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sICovCi0gIGxvbmcgc3ltX2luZGV4OwkJLyogZmluYWwgc3ltYm9sIGluZGV4ICovCi0gIEVYVFIgZWNvZmZfc3ltOwkJLyogRUNPRkYgZGVidWdnaW5nIHN5bWJvbCAqLwotfSBsb2NhbHN5bV90OwotCi0KLS8qIEZvciBhdXggaW5mb3JtYXRpb24gd2Uga2VlcCB0aGUgdHlwZSBhbmQgdGhlIGRhdGEuICAqLwotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfYXV4IHsKLSAgZW51bSBhdXhfdHlwZSB0eXBlOwkJLyogYXV4IHR5cGUgKi8KLSAgQVVYVSBkYXRhOwkJCS8qIGF1eCBkYXRhICovCi19IGF1eF90OwotCi0vKiBGb3IgYSBwcm9jZWR1cmUgd2Ugc3RvcmUgdGhlIGdhcyBzeW1ib2wgYXMgd2VsbCBhcyB0aGUgUERSCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfcHJvYyB7Ci0gIGxvY2Fsc3ltX3QgKnN5bTsJCS8qIGFzc29jaWF0ZWQgc3ltYm9sICovCi0gIFBEUiBwZHI7CQkJLyogRUNPRkYgZGVidWdnaW5nIGluZm8gKi8KLX0gcHJvY190OwotCi0vKiBOdW1iZXIgb2YgcHJvY190IHN0cnVjdHVyZXMgYWxsb2NhdGVkLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHByb2NfY250OwotCi0KLS8qIEZvcndhcmQgcmVmZXJlbmNlIGxpc3QgZm9yIHRhZ3MgcmVmZXJlbmNlZCwgYnV0IG5vdCB5ZXQgZGVmaW5lZC4gICovCi10eXBlZGVmIHN0cnVjdCBmb3J3YXJkIHsKLSAgc3RydWN0IGZvcndhcmQgKm5leHQ7CQkvKiBuZXh0IGZvcndhcmQgcmVmZXJlbmNlICovCi0gIHN0cnVjdCBmb3J3YXJkICpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgYXV4X3QJCSAqaWZkX3B0cjsJLyogcG9pbnRlciB0byBzdG9yZSBmaWxlIGluZGV4ICovCi0gIGF1eF90CQkgKmluZGV4X3B0cjsJLyogcG9pbnRlciB0byBzdG9yZSBzeW1ib2wgaW5kZXggKi8KLX0gZm9yd2FyZF90OwotCi0KLS8qIExpbmtlZCBsaXN0IHN1cHBvcnQgZm9yIHRhZ3MuICBUaGUgZmlyc3QgdGFnIGluIHRoZSBsaXN0IGlzIGFsd2F5cwotICAgdGhlIGN1cnJlbnQgdGFnIGZvciB0aGF0IGJsb2NrLiAgKi8KLXR5cGVkZWYgc3RydWN0IHRhZyB7Ci0gIHN0cnVjdCB0YWcJICpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgc3RydWN0IHNoYXNoCSAqaGFzaF9wdHI7CS8qIHBvaW50ZXIgdG8gdGhlIGhhc2ggdGFibGUgaGVhZCAqLwotICBzdHJ1Y3QgdGFnCSAqc2FtZV9uYW1lOwkvKiB0YWcgd2l0aCBzYW1lIG5hbWUgaW4gb3V0ZXIgc2NvcGUgKi8KLSAgc3RydWN0IHRhZwkgKnNhbWVfYmxvY2s7CS8qIG5leHQgdGFnIGRlZmluZWQgaW4gdGhlIHNhbWUgYmxvY2suICAqLwotICBzdHJ1Y3QgZm9yd2FyZCAqZm9yd2FyZF9yZWY7CS8qIGxpc3Qgb2YgZm9yd2FyZCByZWZlcmVuY2VzICovCi0gIGJ0X3QJCSAgYmFzaWNfdHlwZTsJLyogYnRfU3RydWN0LCBidF9Vbmlvbiwgb3IgYnRfRW51bSAqLwotICBzeW1pbnRfdAkgIGlmZDsJCS8qIGZpbGUgIyB0YWcgZGVmaW5lZCBpbiAqLwotICBsb2NhbHN5bV90CSAqc3ltOwkJLyogZmlsZSdzIGxvY2FsIHN5bWJvbHMgKi8KLX0gdGFnX3Q7Ci0KLQotLyogSGVhZCBvZiBhIGJsb2NrJ3MgbGlua2VkIGxpc3Qgb2YgdGFncy4gICovCi10eXBlZGVmIHN0cnVjdCB0aGVhZCB7Ci0gIHN0cnVjdCB0aGVhZAkqcHJldjsJCS8qIHByZXZpb3VzIGJsb2NrICovCi0gIHN0cnVjdCB0aGVhZAkqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCi0gIHN0cnVjdCB0YWcJKmZpcnN0X3RhZzsJLyogZmlyc3QgdGFnIGluIGJsb2NrIGRlZmluZWQgKi8KLX0gdGhlYWRfdDsKLQotCi0vKiBVbmlvbiBjb250YWluaW5nIHBvaW50ZXJzIHRvIGVhY2ggdGhlIHNtYWxsIHN0cnVjdHVyZXMgd2hpY2ggYXJlIGZyZWVkIHVwLiAgKi8KLXR5cGVkZWYgdW5pb24gc21hbGxfZnJlZSB7Ci0gIHNjb3BlX3QJKmZfc2NvcGU7CS8qIHNjb3BlIHN0cnVjdHVyZSAqLwotICB0aGVhZF90CSpmX3RoZWFkOwkvKiB0YWcgaGVhZCBzdHJ1Y3R1cmUgKi8KLSAgdGFnX3QJCSpmX3RhZzsJCS8qIHRhZyBlbGVtZW50IHN0cnVjdHVyZSAqLwotICBmb3J3YXJkX3QJKmZfZm9yd2FyZDsJLyogZm9yd2FyZCB0YWcgcmVmZXJlbmNlICovCi19IHNtYWxsX2ZyZWVfdDsKLQotCi0vKiBTdHJpbmcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNoYXNoIHsKLSAgY2hhcgkJKnN0cmluZzsJLyogc3RyaW5nIHdlIGFyZSBoYXNoaW5nICovCi0gIHN5bWludF90CSBpbmR4OwkJLyogaW5kZXggd2l0aGluIHN0cmluZyB0YWJsZSAqLwotICBFWFRSCQkqZXN5bV9wdHI7CS8qIGdsb2JhbCBzeW1ib2wgcG9pbnRlciAqLwotICBsb2NhbHN5bV90CSpzeW1fcHRyOwkvKiBsb2NhbCBzeW1ib2wgcG9pbnRlciAqLwotICBsb2NhbHN5bV90CSplbmRfcHRyOwkvKiBzeW1ib2wgcG9pbnRlciB0byBlbmQgYmxvY2sgKi8KLSAgdGFnX3QJCSp0YWdfcHRyOwkvKiB0YWcgcG9pbnRlciAqLwotICBwcm9jX3QJKnByb2NfcHRyOwkvKiBwcm9jZWR1cmUgZGVzY3JpcHRvciBwb2ludGVyICovCi19IHNoYXNoX3Q7Ci0KLQotLyogVHlwZSBoYXNoIHRhYmxlIHN1cHBvcnQuICBUaGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBtdXN0IGZpdAotICAgd2l0aGluIGEgcGFnZSB3aXRoIHRoZSBvdGhlciBleHRlbmRlZCBmaWxlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24uCi0gICBCZWNhdXNlIHVuaXF1ZSB0eXBlcyB3aGljaCBhcmUgaGFzaGVkIGFyZSBmZXdlciBpbiBudW1iZXIgdGhhbgotICAgc3RyaW5ncywgd2UgdXNlIGEgc21hbGxlciBoYXNoIHZhbHVlLiAgKi8KLQotI2RlZmluZSBIQVNIQklUUyAzMAotCi0jaWZuZGVmIFRIQVNIX1NJWkUKLSNkZWZpbmUgVEhBU0hfU0laRSAxMTMKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB0aGFzaCB7Ci0gIHN0cnVjdCB0aGFzaAkqbmV4dDsJCS8qIG5leHQgaGFzaCB2YWx1ZSAqLwotICBBVVhVCQkgdHlwZTsJCS8qIHR5cGUgd2UgYXJlIGhhc2hpbmcgKi8KLSAgc3ltaW50X3QJIGluZHg7CQkvKiBpbmRleCB3aXRoaW4gc3RyaW5nIHRhYmxlICovCi19IHRoYXNoX3Q7Ci0KLQotLyogRXh0ZW5kZWQgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBzdXBwb3J0IG5lY2Vzc2FyeQotICAgdG8gYWRkIHRoaW5ncyB0byBlYWNoIGZpbGUgc2VwYXJhdGVseS4gICovCi10eXBlZGVmIHN0cnVjdCBlZmRyIHsKLSAgRkRSCQkgZmRyOwkJLyogRmlsZSBoZWFkZXIgdG8gYmUgd3JpdHRlbiBvdXQgKi8KLSAgRkRSCQkqb3JpZ19mZHI7CS8qIG9yaWdpbmFsIGZpbGUgaGVhZGVyICovCi0gIGNoYXIJCSpuYW1lOwkJLyogZmlsZW5hbWUgKi8KLSAgaW50CQkgZmFrZTsJCS8qIHdoZXRoZXIgdGhpcyBpcyBmYWtlZCAuZmlsZSAqLwotICBzeW1pbnRfdAkgdm9pZF90eXBlOwkvKiBhdXguIHBvaW50ZXIgdG8gJ3ZvaWQnIHR5cGUgKi8KLSAgc3ltaW50X3QJIGludF90eXBlOwkvKiBhdXguIHBvaW50ZXIgdG8gJ2ludCcgdHlwZSAqLwotICBzY29wZV90CSpjdXJfc2NvcGU7CS8qIGN1cnJlbnQgbmVzdGVkIHNjb3BlcyAqLwotICBzeW1pbnRfdAkgZmlsZV9pbmRleDsJLyogY3VycmVudCBmaWxlIG51bWJlciAqLwotICBpbnQJCSBuZXN0ZWRfc2NvcGVzOwkvKiAjIG5lc3RlZCBzY29wZXMgKi8KLSAgdmFycmF5X3QJIHN0cmluZ3M7CS8qIGxvY2FsIHN0cmluZ3MgKi8KLSAgdmFycmF5X3QJIHN5bWJvbHM7CS8qIGxvY2FsIHN5bWJvbHMgKi8KLSAgdmFycmF5X3QJIHByb2NzOwkJLyogcHJvY2VkdXJlcyAqLwotICB2YXJyYXlfdAkgYXV4X3N5bXM7CS8qIGF1eGlsaWFyeSBzeW1ib2xzICovCi0gIHN0cnVjdCBlZmRyCSpuZXh0X2ZpbGU7CS8qIG5leHQgZmlsZSBkZXNjcmlwdG9yICovCi0JCQkJLyogc3RyaW5nL3R5cGUgaGFzaCB0YWJsZXMgKi8KLSAgc3RydWN0IGhhc2hfY29udHJvbCAqc3RyX2hhc2g7CS8qIHN0cmluZyBoYXNoIHRhYmxlICovCi0gIHRoYXNoX3QJKnRoYXNoX2hlYWRbVEhBU0hfU0laRV07Ci19IGVmZHJfdDsKLQotLyogUHJlLWluaXRpYWxpemVkIGV4dGVuZGVkIGZpbGUgc3RydWN0dXJlLiAgKi8KLXN0YXRpYyBjb25zdCBlZmRyX3QgaW5pdF9maWxlID0KLXsKLSAgewkJCS8qIEZEUiBzdHJ1Y3R1cmUgKi8KLSAgICAwLAkJCS8qIGFkcjoJCW1lbW9yeSBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBmaWxlICovCi0gICAgMCwJCQkvKiByc3M6CQlmaWxlIG5hbWUgKG9mIHNvdXJjZSwgaWYga25vd24pICovCi0gICAgMCwJCQkvKiBpc3NCYXNlOglmaWxlJ3Mgc3RyaW5nIHNwYWNlICovCi0gICAgMCwJCQkvKiBjYlNzOgludW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNzICovCi0gICAgMCwJCQkvKiBpc3ltQmFzZToJYmVnaW5uaW5nIG9mIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGNzeW06CWNvdW50IGZpbGUncyBvZiBzeW1ib2xzICovCi0gICAgMCwJCQkvKiBpbGluZUJhc2U6CWZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGNsaW5lOgljb3VudCBvZiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0gICAgMCwJCQkvKiBpb3B0QmFzZToJZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCi0gICAgMCwJCQkvKiBjb3B0Ogljb3VudCBvZiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLSAgICAwLAkJCS8qIGlwZEZpcnN0OglzdGFydCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLSAgICAwLAkJCS8qIGNwZDoJCWNvdW50IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotICAgIDAsCQkJLyogaWF1eEJhc2U6CWZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLwotICAgIDAsCQkJLyogY2F1eDoJY291bnQgb2YgZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0gICAgMCwJCQkvKiByZmRCYXNlOglpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCi0gICAgMCwJCQkvKiBjcmZkOgljb3VudCBmaWxlIGluZGlyZWN0IGVudHJpZXMgKi8KLSAgICBsYW5nQywJCS8qIGxhbmc6CWxhbmd1YWdlIGZvciB0aGlzIGZpbGUgKi8KLSAgICAxLAkJCS8qIGZNZXJnZToJd2hldGhlciB0aGlzIGZpbGUgY2FuIGJlIG1lcmdlZCAqLwotICAgIDAsCQkJLyogZlJlYWRpbjoJdHJ1ZSBpZiByZWFkIGluIChub3QganVzdCBjcmVhdGVkKSAqLwotICAgIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCAgLyogZkJpZ2VuZGlhbjoJaWYgMSwgY29tcGlsZWQgb24gYmlnIGVuZGlhbiBtYWNoaW5lICovCi0gICAgR0xFVkVMXzIsCQkvKiBnbGV2ZWw6CWxldmVsIHRoaXMgZmlsZSB3YXMgY29tcGlsZWQgd2l0aCAqLwotICAgIDAsCQkJLyogcmVzZXJ2ZWQ6CXJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0gICAgMCwJCQkvKiBjYkxpbmVPZmZzZXQ6IGJ5dGUgb2Zmc2V0IGZyb20gaGVhZGVyIGZvciB0aGlzIGZpbGUgbG4ncyAqLwotICAgIDAsCQkJLyogY2JMaW5lOglzaXplIG9mIGxpbmVzIGZvciB0aGlzIGZpbGUgKi8KLSAgfSwKLQotICAoRkRSICopMCwJCS8qIG9yaWdfZmRyOglvcmlnaW5hbCBmaWxlIGhlYWRlciBwb2ludGVyICovCi0gIChjaGFyICopMCwJCS8qIG5hbWU6CXBvaW50ZXIgdG8gZmlsZW5hbWUgKi8KLSAgMCwJCQkvKiBmYWtlOgl3aGV0aGVyIHRoaXMgaXMgYSBmYWtlZCAuZmlsZSAqLwotICAwLAkJCS8qIHZvaWRfdHlwZToJcHRyIHRvIGF1eCBub2RlIGZvciB2b2lkIHR5cGUgKi8KLSAgMCwJCQkvKiBpbnRfdHlwZToJcHRyIHRvIGF1eCBub2RlIGZvciBpbnQgdHlwZSAqLwotICAoc2NvcGVfdCAqKTAsCQkvKiBjdXJfc2NvcGU6CWN1cnJlbnQgc2NvcGUgYmVpbmcgcHJvY2Vzc2VkICovCi0gIDAsCQkJLyogZmlsZV9pbmRleDoJY3VycmVudCBmaWxlICMgKi8KLSAgMCwJCQkvKiBuZXN0ZWRfc2NvcGVzOiAjIG5lc3RlZCBzY29wZXMgKi8KLSAgSU5JVF9WQVJSQVkgKGNoYXIpLAkvKiBzdHJpbmdzOglsb2NhbCBzdHJpbmcgdmFycmF5ICovCi0gIElOSVRfVkFSUkFZIChsb2NhbHN5bV90KSwJLyogc3ltYm9sczoJbG9jYWwgc3ltYm9scyB2YXJyYXkgKi8KLSAgSU5JVF9WQVJSQVkgKHByb2NfdCksCS8qIHByb2NzOglwcm9jZWR1cmUgdmFycmF5ICovCi0gIElOSVRfVkFSUkFZIChhdXhfdCksCS8qIGF1eF9zeW1zOglhdXhpbGlhcnkgc3ltYm9scyB2YXJyYXkgKi8KLQotICAoc3RydWN0IGVmZHIgKikwLAkvKiBuZXh0X2ZpbGU6CW5leHQgZmlsZSBzdHJ1Y3R1cmUgKi8KLQotICAoc3RydWN0IGhhc2hfY29udHJvbCAqKTAsCS8qIHN0cl9oYXNoOglzdHJpbmcgaGFzaCB0YWJsZSAqLwotICB7IDAgfSwJCS8qIHRoYXNoX2hlYWQ6CXR5cGUgaGFzaCB0YWJsZSAqLwotfTsKLQotCi1zdGF0aWMgZWZkcl90ICpmaXJzdF9maWxlOwkJCS8qIGZpcnN0IGZpbGUgZGVzY3JpcHRvciAqLwotc3RhdGljIGVmZHJfdCAqKmxhc3RfZmlsZV9wdHIgPSAmZmlyc3RfZmlsZTsJLyogZmlsZSBkZXNjcmlwdG9yIHRhaWwgKi8KLQotCi0vKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpcyBrZXB0IGluIGEgbGlzdCB1bnRpbCB0aGUgYXNzZW1ibHkgaXMKLSAgIGZpbmlzaGVkLiAgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19saXN0IHsKLSAgc3RydWN0IGxpbmVub19saXN0ICpuZXh0OwkvKiBuZXh0IGVsZW1lbnQgaW4gbGlzdCAqLwotICBlZmRyX3QgKmZpbGU7CQkJLyogZmlsZSB0aGlzIGxpbmUgaXMgaW4gKi8KLSAgcHJvY190ICpwcm9jOwkJCS8qIHByb2NlZHVyZSB0aGlzIGxpbmUgaXMgaW4gKi8KLSAgZnJhZ1MgKmZyYWc7CQkJLyogZnJhZ21lbnQgdGhpcyBsaW5lIG51bWJlciBpcyBpbiAqLwotICB1bnNpZ25lZCBsb25nIHBhZGRyOwkJLyogb2Zmc2V0IHdpdGhpbiBmcmFnbWVudCAqLwotICBsb25nIGxpbmVubzsJCQkvKiBhY3R1YWwgbGluZSBudW1iZXIgKi8KLX0gbGluZW5vX2xpc3RfdDsKLQotc3RhdGljIGxpbmVub19saXN0X3QgKmZpcnN0X2xpbmVubzsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICpsYXN0X2xpbmVubzsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICoqbGFzdF9saW5lbm9fcHRyID0gJmZpcnN0X2xpbmVubzsKLQotLyogU29tZXRpbWVzIHRoZXJlIHdpbGwgYmUgc29tZSAubG9jIHN0YXRlbWVudHMgYmVmb3JlIGEgLmVudC4gIFdlCi0gICBrZWVwIHRoZW0gaW4gdGhpcyBsaXN0IHNvIHRoYXQgd2UgY2FuIGZpbGwgaW4gdGhlIHByb2NlZHVyZSBwb2ludGVyCi0gICBhZnRlciB3ZSBzZWUgdGhlIC5lbnQuICAqLwotc3RhdGljIGxpbmVub19saXN0X3QgKm5vcHJvY19saW5lbm87Ci0KLS8qIFVuaW9uIG9mIHZhcmlvdXMgdGhpbmdzIHRoYXQgYXJlIGhlbGQgaW4gcGFnZXMuICAqLwotdHlwZWRlZiB1bmlvbiBwYWdlIHsKLSAgY2hhcgkJYnl0ZQlbIFBBR0VfU0laRSBdOwotICB1bnNpZ25lZCBjaGFyCXVieXRlCVsgUEFHRV9TSVpFIF07Ci0gIGVmZHJfdAlmaWxlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChlZmRyX3QpCSAgICAgXTsKLSAgRkRSCQlvZmlsZQlbIFBBR0VfU0laRSAvIHNpemVvZiAoRkRSKQkgICAgIF07Ci0gIHByb2NfdAlwcm9jCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChwcm9jX3QpCSAgICAgXTsKLSAgbG9jYWxzeW1fdAlzeW0JWyBQQUdFX1NJWkUgLyBzaXplb2YgKGxvY2Fsc3ltX3QpICAgIF07Ci0gIGF1eF90CQlhdXgJWyBQQUdFX1NJWkUgLyBzaXplb2YgKGF1eF90KQkgICAgIF07Ci0gIEROUgkJZGVuc2UJWyBQQUdFX1NJWkUgLyBzaXplb2YgKEROUikJICAgICBdOwotICBzY29wZV90CXNjb3BlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChzY29wZV90KQkgICAgIF07Ci0gIHZsaW5rc190CXZsaW5rcwlbIFBBR0VfU0laRSAvIHNpemVvZiAodmxpbmtzX3QpCSAgICAgXTsKLSAgc2hhc2hfdAlzaGFzaAlbIFBBR0VfU0laRSAvIHNpemVvZiAoc2hhc2hfdCkJICAgICBdOwotICB0aGFzaF90CXRoYXNoCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGFzaF90KQkgICAgIF07Ci0gIHRhZ190CQl0YWcJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHRhZ190KQkgICAgIF07Ci0gIGZvcndhcmRfdAlmb3J3YXJkCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChmb3J3YXJkX3QpICAgICBdOwotICB0aGVhZF90CXRoZWFkCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGVhZF90KQkgICAgIF07Ci0gIGxpbmVub19saXN0X3QJbGluZW5vCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChsaW5lbm9fbGlzdF90KSBdOwotfSBwYWdlX3R5cGU7Ci0KLQotLyogU3RydWN0dXJlIGhvbGRpbmcgYWxsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3Igc21hbGwgc2l6ZWQgc3RydWN0dXJlcy4gICovCi10eXBlZGVmIHN0cnVjdCBhbGxvY19pbmZvIHsKLSAgY2hhcgkJKmFsbG9jX25hbWU7CS8qIG5hbWUgb2YgdGhpcyBhbGxvY2F0aW9uIHR5cGUgKG11c3QgYmUgZmlyc3QpICovCi0gIHBhZ2VfdHlwZQkqY3VyX3BhZ2U7CS8qIGN1cnJlbnQgcGFnZSBiZWluZyBhbGxvY2F0ZWQgZnJvbSAqLwotICBzbWFsbF9mcmVlX3QJIGZyZWVfbGlzdDsJLyogY3VycmVudCBmcmVlIGxpc3QgaWYgYW55ICovCi0gIGludAkJIHVuYWxsb2NhdGVkOwkvKiBudW1iZXIgb2YgZWxlbWVudHMgdW5hbGxvY2F0ZWQgb24gcGFnZSAqLwotICBpbnQJCSB0b3RhbF9hbGxvYzsJLyogdG90YWwgbnVtYmVyIG9mIGFsbG9jYXRpb25zICovCi0gIGludAkJIHRvdGFsX2ZyZWU7CS8qIHRvdGFsIG51bWJlciBvZiBmcmVlcyAqLwotICBpbnQJCSB0b3RhbF9wYWdlczsJLyogdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFsbG9jYXRlZCAqLwotfSBhbGxvY19pbmZvX3Q7Ci0KLQotLyogVHlwZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgdG9nZXRoZXIuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdHlwZV9pbmZvIHsKLSAgYnRfdAkgICAgICBiYXNpY190eXBlOwkJLyogYmFzaWMgdHlwZSAqLwotICBpbnQJICAgICAgb3JpZ190eXBlOwkJLyogb3JpZ2luYWwgQ09GRi1iYXNlZCB0eXBlICovCi0gIGludAkgICAgICBudW1fdHE7CQkJLyogIyB0eXBlIHF1YWxpZmllcnMgKi8KLSAgaW50CSAgICAgIG51bV9kaW1zOwkJCS8qICMgZGltZW5zaW9ucyAqLwotICBpbnQJICAgICAgbnVtX3NpemVzOwkJLyogIyBzaXplcyAqLwotICBpbnQJICAgICAgZXh0cmFfc2l6ZXM7CQkvKiAjIGV4dHJhIHNpemVzIG5vdCB0aWVkIHdpdGggZGltcyAqLwotICB0YWdfdCAqICAgICB0YWdfcHRyOwkJCS8qIHRhZyBwb2ludGVyICovCi0gIGludAkgICAgICBiaXRmaWVsZDsJCQkvKiBzeW1ib2wgaXMgYSBiaXRmaWVsZCAqLwotICB0cV90CSAgICAgIHR5cGVfcXVhbGlmaWVyc1tOX1RRXTsJLyogdHlwZSBxdWFsaWZpZXJzIChwdHIsIGZ1bmMsIGFycmF5KSovCi0gIHN5bWludF90ICAgIGRpbWVuc2lvbnMgICAgIFtOX1RRXTsJLyogZGltZW5zaW9ucyBmb3IgZWFjaCBhcnJheSAqLwotICBzeW1pbnRfdCAgICBzaXplcwkgICAgIFtOX1RRKzJdOwkvKiBzaXplcyBvZiBlYWNoIGFycmF5IHNsaWNlICsgc2l6ZSBvZgotCQkJCQkgICBzdHJ1Y3QvdW5pb24vZW51bSArIGJpdGZpZWxkIHNpemUgKi8KLX0gdHlwZV9pbmZvX3Q7Ci0KLS8qIFByZS1pbml0aWFsaXplZCB0eXBlX2luZm8gc3RydWN0LiAgKi8KLXN0YXRpYyBjb25zdCB0eXBlX2luZm9fdCB0eXBlX2luZm9faW5pdCA9IHsKLSAgYnRfTmlsLAkJCQkvKiBiYXNpYyB0eXBlICovCi0gIFRfTlVMTCwJCQkJLyogb3JpZ2luYWwgQ09GRi1iYXNlZCB0eXBlICovCi0gIDAsCQkJCQkvKiAjIHR5cGUgcXVhbGlmaWVycyAqLwotICAwLAkJCQkJLyogIyBkaW1lbnNpb25zICovCi0gIDAsCQkJCQkvKiAjIHNpemVzICovCi0gIDAsCQkJCQkvKiBzaXplcyBub3QgdGllZCB3aXRoIGRpbXMgKi8KLSAgTlVMTCwJCQkJCS8qIHB0ciB0byB0YWcgKi8KLSAgMCwJCQkJCS8qIGJpdGZpZWxkICovCi0gIHsJCQkJCS8qIHR5cGUgcXVhbGlmaWVycyAqLwotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICB9LAotICB7CQkJCQkvKiBkaW1lbnNpb25zICovCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAKLSAgfSwKLSAgewkJCQkJLyogc2l6ZXMgKi8KLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gIH0sCi19OwotCi0vKiBHbG9iYWwgaGFzaCB0YWJsZSBmb3IgdGhlIHRhZ3MgdGFibGUgYW5kIGdsb2JhbCB0YWJsZSBmb3IgZmlsZQotICAgZGVzY3JpcHRvcnMuICAqLwotCi1zdGF0aWMgdmFycmF5X3QgZmlsZV9kZXNjCT0gSU5JVF9WQVJSQVkgKGVmZHJfdCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWdfaGFzaDsKLQotLyogU3RhdGljIHR5cGVzIGZvciBpbnQgYW5kIHZvaWQuICBBbHNvLCByZW1lbWJlciB0aGUgbGFzdCBmdW5jdGlvbidzCi0gICB0eXBlICh3aGljaCBpcyBzZXQgdXAgd2hlbiB3ZSBlbmNvdW50ZXIgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUKLSAgIGZ1bmN0aW9uLCBhbmQgdXNlZCB3aGVuIHRoZSBlbmQgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBlbWl0dGVkLiAgKi8KLQotc3RhdGljIHR5cGVfaW5mb190IGludF90eXBlX2luZm87Ci1zdGF0aWMgdHlwZV9pbmZvX3Qgdm9pZF90eXBlX2luZm87Ci1zdGF0aWMgdHlwZV9pbmZvX3QgbGFzdF9mdW5jX3R5cGVfaW5mbzsKLXN0YXRpYyBzeW1ib2xTICpsYXN0X2Z1bmNfc3ltX3ZhbHVlOwotCi0KLS8qIENvbnZlcnQgQ09GRiBiYXNpYyB0eXBlIHRvIEVDT0ZGIGJhc2ljIHR5cGUuICBUaGUgVF9OVUxMIHR5cGUKLSAgIHJlYWxseSBzaG91bGQgdXNlIGJ0X1ZvaWQsIGJ1dCB0aGlzIGNhdXNlcyB0aGUgY3VycmVudCBlY29mZiBHREIgdG8KLSAgIGlzc3VlIHVuc3VwcG9ydGVkIHR5cGUgbWVzc2FnZXMsIGFuZCB0aGUgVWx0cml4IDQuMDAgZGJ4IChha2EgTUlQUwotICAgMi4wKSBkb2Vzbid0IHVuZGVyc3RhbmQgaXQsIGV2ZW4gdGhvdWdoIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgaXQuCi0gICBNYXliZSB0aGlzIHdpbGwgYmUgZml4ZWQgaW4gMi4xMCBvciAyLjIwIG9mIHRoZSBNSVBTIGNvbXBpbGVyCi0gICBzdWl0ZSwgYnV0IGZvciBub3cgZ28gd2l0aCB3aGF0IHdvcmtzLgotCi0gICBJdCB3b3VsZCBtYWtlIHNlbnNlIGZvciB0aGUgLnR5cGUgYW5kIC5zY2wgZGlyZWN0aXZlcyB0byB1c2UgdGhlCi0gICBFQ09GRiBudW1iZXJzIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyB0aGUgQ09GRiBudW1iZXJzIGFuZAotICAgbWFwcGluZyB0aGVtLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBoaXN0b3JpY2FsbHkgd2hhdCBtaXBzLXRmaWxlCi0gICBleHBlY3RzLCBhbmQgY2hhbmdpbmcgZ2NjIG5vdyB3b3VsZCBiZSBhIGNvbnNpZGVyYWJsZSBwYWluICh0aGUKLSAgIG5hdGl2ZSBjb21waWxlciBnZW5lcmF0ZXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludGVybmFsbHksIHJhdGhlcgotICAgdGhhbiB2aWEgdGhlIGFzc2VtYmxlciwgc28gaXQgd2lsbCBuZXZlciB1c2UgLnR5cGUgb3IgLnNjbCkuICAqLwotCi1zdGF0aWMgY29uc3QgYnRfdCBtYXBfY29mZl90eXBlc1tdID0gewotICBidF9OaWwsCQkJLyogVF9OVUxMICovCi0gIGJ0X05pbCwJCQkvKiBUX0FSRyAqLwotICBidF9DaGFyLAkJCS8qIFRfQ0hBUiAqLwotICBidF9TaG9ydCwJCQkvKiBUX1NIT1JUICovCi0gIGJ0X0ludCwJCQkvKiBUX0lOVCAqLwotICBidF9Mb25nLAkJCS8qIFRfTE9ORyAqLwotICBidF9GbG9hdCwJCQkvKiBUX0ZMT0FUICovCi0gIGJ0X0RvdWJsZSwJCQkvKiBUX0RPVUJMRSAqLwotICBidF9TdHJ1Y3QsCQkJLyogVF9TVFJVQ1QgKi8KLSAgYnRfVW5pb24sCQkJLyogVF9VTklPTiAqLwotICBidF9FbnVtLAkJCS8qIFRfRU5VTSAqLwotICBidF9FbnVtLAkJCS8qIFRfTU9FICovCi0gIGJ0X1VDaGFyLAkJCS8qIFRfVUNIQVIgKi8KLSAgYnRfVVNob3J0LAkJCS8qIFRfVVNIT1JUICovCi0gIGJ0X1VJbnQsCQkJLyogVF9VSU5UICovCi0gIGJ0X1VMb25nCQkJLyogVF9VTE9ORyAqLwotfTsKLQotLyogQ29udmVydCBDT0ZGIHN0b3JhZ2UgY2xhc3MgdG8gRUNPRkYgc3RvcmFnZSBjbGFzcy4gICovCi1zdGF0aWMgY29uc3Qgc2NfdCBtYXBfY29mZl9zdG9yYWdlW10gPSB7Ci0gIHNjX05pbCwJCQkvKiAgIDA6IENfTlVMTCAqLwotICBzY19BYnMsCQkJLyogICAxOiBDX0FVVE8JICBhdXRvIHZhciAqLwotICBzY19VbmRlZmluZWQsCQkJLyogICAyOiBDX0VYVAkgIGV4dGVybmFsICovCi0gIHNjX0RhdGEsCQkJLyogICAzOiBDX1NUQVQJICBzdGF0aWMgKi8KLSAgc2NfUmVnaXN0ZXIsCQkJLyogICA0OiBDX1JFRwkgIHJlZ2lzdGVyICovCi0gIHNjX1VuZGVmaW5lZCwJCQkvKiAgIDU6IENfRVhUREVGICA/Pz8gKi8KLSAgc2NfVGV4dCwJCQkvKiAgIDY6IENfTEFCRUwJICBsYWJlbCAqLwotICBzY19UZXh0LAkJCS8qICAgNzogQ19VTEFCRUwgIHVzZXIgbGFiZWwgKi8KLSAgc2NfSW5mbywJCQkvKiAgIDg6IENfTU9TCSAgbWVtYmVyIG9mIHN0cnVjdCAqLwotICBzY19BYnMsCQkJLyogICA5OiBDX0FSRwkgIGFyZ3VtZW50ICovCi0gIHNjX0luZm8sCQkJLyogIDEwOiBDX1NUUlRBRyAgc3RydWN0IHRhZyAqLwotICBzY19JbmZvLAkJCS8qICAxMTogQ19NT1UJICBtZW1iZXIgb2YgdW5pb24gKi8KLSAgc2NfSW5mbywJCQkvKiAgMTI6IENfVU5UQUcgICB1bmlvbiB0YWcgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTM6IENfVFBERUYJICB0eXBlZGVmICovCi0gIHNjX0RhdGEsCQkJLyogIDE0OiBDX1VTVEFUSUMgPz8/ICovCi0gIHNjX0luZm8sCQkJLyogIDE1OiBDX0VOVEFHCSAgZW51bSB0YWcgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTY6IENfTU9FCSAgbWVtYmVyIG9mIGVudW0gKi8KLSAgc2NfUmVnaXN0ZXIsCQkJLyogIDE3OiBDX1JFR1BBUk0gcmVnaXN0ZXIgcGFyYW1ldGVyICovCi0gIHNjX0JpdHMsCQkJLyogIDE4OyBDX0ZJRUxECSAgYml0ZmllbGQgKi8KLSAgc2NfTmlsLAkJCS8qICAxOSAqLwotICBzY19OaWwsCQkJLyogIDIwICovCi0gIHNjX05pbCwJCQkvKiAgMjEgKi8KLSAgc2NfTmlsLAkJCS8qICAyMiAqLwotICBzY19OaWwsCQkJLyogIDIzICovCi0gIHNjX05pbCwJCQkvKiAgMjQgKi8KLSAgc2NfTmlsLAkJCS8qICAyNSAqLwotICBzY19OaWwsCQkJLyogIDI2ICovCi0gIHNjX05pbCwJCQkvKiAgMjcgKi8KLSAgc2NfTmlsLAkJCS8qICAyOCAqLwotICBzY19OaWwsCQkJLyogIDI5ICovCi0gIHNjX05pbCwJCQkvKiAgMzAgKi8KLSAgc2NfTmlsLAkJCS8qICAzMSAqLwotICBzY19OaWwsCQkJLyogIDMyICovCi0gIHNjX05pbCwJCQkvKiAgMzMgKi8KLSAgc2NfTmlsLAkJCS8qICAzNCAqLwotICBzY19OaWwsCQkJLyogIDM1ICovCi0gIHNjX05pbCwJCQkvKiAgMzYgKi8KLSAgc2NfTmlsLAkJCS8qICAzNyAqLwotICBzY19OaWwsCQkJLyogIDM4ICovCi0gIHNjX05pbCwJCQkvKiAgMzkgKi8KLSAgc2NfTmlsLAkJCS8qICA0MCAqLwotICBzY19OaWwsCQkJLyogIDQxICovCi0gIHNjX05pbCwJCQkvKiAgNDIgKi8KLSAgc2NfTmlsLAkJCS8qICA0MyAqLwotICBzY19OaWwsCQkJLyogIDQ0ICovCi0gIHNjX05pbCwJCQkvKiAgNDUgKi8KLSAgc2NfTmlsLAkJCS8qICA0NiAqLwotICBzY19OaWwsCQkJLyogIDQ3ICovCi0gIHNjX05pbCwJCQkvKiAgNDggKi8KLSAgc2NfTmlsLAkJCS8qICA0OSAqLwotICBzY19OaWwsCQkJLyogIDUwICovCi0gIHNjX05pbCwJCQkvKiAgNTEgKi8KLSAgc2NfTmlsLAkJCS8qICA1MiAqLwotICBzY19OaWwsCQkJLyogIDUzICovCi0gIHNjX05pbCwJCQkvKiAgNTQgKi8KLSAgc2NfTmlsLAkJCS8qICA1NSAqLwotICBzY19OaWwsCQkJLyogIDU2ICovCi0gIHNjX05pbCwJCQkvKiAgNTcgKi8KLSAgc2NfTmlsLAkJCS8qICA1OCAqLwotICBzY19OaWwsCQkJLyogIDU5ICovCi0gIHNjX05pbCwJCQkvKiAgNjAgKi8KLSAgc2NfTmlsLAkJCS8qICA2MSAqLwotICBzY19OaWwsCQkJLyogIDYyICovCi0gIHNjX05pbCwJCQkvKiAgNjMgKi8KLSAgc2NfTmlsLAkJCS8qICA2NCAqLwotICBzY19OaWwsCQkJLyogIDY1ICovCi0gIHNjX05pbCwJCQkvKiAgNjYgKi8KLSAgc2NfTmlsLAkJCS8qICA2NyAqLwotICBzY19OaWwsCQkJLyogIDY4ICovCi0gIHNjX05pbCwJCQkvKiAgNjkgKi8KLSAgc2NfTmlsLAkJCS8qICA3MCAqLwotICBzY19OaWwsCQkJLyogIDcxICovCi0gIHNjX05pbCwJCQkvKiAgNzIgKi8KLSAgc2NfTmlsLAkJCS8qICA3MyAqLwotICBzY19OaWwsCQkJLyogIDc0ICovCi0gIHNjX05pbCwJCQkvKiAgNzUgKi8KLSAgc2NfTmlsLAkJCS8qICA3NiAqLwotICBzY19OaWwsCQkJLyogIDc3ICovCi0gIHNjX05pbCwJCQkvKiAgNzggKi8KLSAgc2NfTmlsLAkJCS8qICA3OSAqLwotICBzY19OaWwsCQkJLyogIDgwICovCi0gIHNjX05pbCwJCQkvKiAgODEgKi8KLSAgc2NfTmlsLAkJCS8qICA4MiAqLwotICBzY19OaWwsCQkJLyogIDgzICovCi0gIHNjX05pbCwJCQkvKiAgODQgKi8KLSAgc2NfTmlsLAkJCS8qICA4NSAqLwotICBzY19OaWwsCQkJLyogIDg2ICovCi0gIHNjX05pbCwJCQkvKiAgODcgKi8KLSAgc2NfTmlsLAkJCS8qICA4OCAqLwotICBzY19OaWwsCQkJLyogIDg5ICovCi0gIHNjX05pbCwJCQkvKiAgOTAgKi8KLSAgc2NfTmlsLAkJCS8qICA5MSAqLwotICBzY19OaWwsCQkJLyogIDkyICovCi0gIHNjX05pbCwJCQkvKiAgOTMgKi8KLSAgc2NfTmlsLAkJCS8qICA5NCAqLwotICBzY19OaWwsCQkJLyogIDk1ICovCi0gIHNjX05pbCwJCQkvKiAgOTYgKi8KLSAgc2NfTmlsLAkJCS8qICA5NyAqLwotICBzY19OaWwsCQkJLyogIDk4ICovCi0gIHNjX05pbCwJCQkvKiAgOTkgKi8KLSAgc2NfVGV4dCwJCQkvKiAxMDA6IENfQkxPQ0sgIGJsb2NrIHN0YXJ0L2VuZCAqLwotICBzY19UZXh0LAkJCS8qIDEwMTogQ19GQ04JIGZ1bmN0aW9uIHN0YXJ0L2VuZCAqLwotICBzY19JbmZvLAkJCS8qIDEwMjogQ19FT1MJIGVuZCBvZiBzdHJ1Y3QvdW5pb24vZW51bSAqLwotICBzY19OaWwsCQkJLyogMTAzOiBDX0ZJTEUJIGZpbGUgc3RhcnQgKi8KLSAgc2NfTmlsLAkJCS8qIDEwNDogQ19MSU5FCSBsaW5lIG51bWJlciAqLwotICBzY19OaWwsCQkJLyogMTA1OiBDX0FMSUFTCSBjb21iaW5lZCB0eXBlIGluZm8gKi8KLSAgc2NfTmlsLAkJCS8qIDEwNjogQ19ISURERU4gPz8/ICovCi19OwotCi0vKiBDb252ZXJ0IENPRkYgc3RvcmFnZSBjbGFzcyB0byBFQ09GRiBzeW1ib2wgdHlwZS4gICovCi1zdGF0aWMgY29uc3Qgc3RfdCBtYXBfY29mZl9zeW1fdHlwZVtdID0gewotICBzdF9OaWwsCQkJLyogICAwOiBDX05VTEwgKi8KLSAgc3RfTG9jYWwsCQkJLyogICAxOiBDX0FVVE8JICBhdXRvIHZhciAqLwotICBzdF9HbG9iYWwsCQkJLyogICAyOiBDX0VYVAkgIGV4dGVybmFsICovCi0gIHN0X1N0YXRpYywJCQkvKiAgIDM6IENfU1RBVAkgIHN0YXRpYyAqLwotICBzdF9Mb2NhbCwJCQkvKiAgIDQ6IENfUkVHCSAgcmVnaXN0ZXIgKi8KLSAgc3RfR2xvYmFsLAkJCS8qICAgNTogQ19FWFRERUYgID8/PyAqLwotICBzdF9MYWJlbCwJCQkvKiAgIDY6IENfTEFCRUwJICBsYWJlbCAqLwotICBzdF9MYWJlbCwJCQkvKiAgIDc6IENfVUxBQkVMICB1c2VyIGxhYmVsICovCi0gIHN0X01lbWJlciwJCQkvKiAgIDg6IENfTU9TCSAgbWVtYmVyIG9mIHN0cnVjdCAqLwotICBzdF9QYXJhbSwJCQkvKiAgIDk6IENfQVJHCSAgYXJndW1lbnQgKi8KLSAgc3RfQmxvY2ssCQkJLyogIDEwOiBDX1NUUlRBRyAgc3RydWN0IHRhZyAqLwotICBzdF9NZW1iZXIsCQkJLyogIDExOiBDX01PVQkgIG1lbWJlciBvZiB1bmlvbiAqLwotICBzdF9CbG9jaywJCQkvKiAgMTI6IENfVU5UQUcgICB1bmlvbiB0YWcgKi8KLSAgc3RfVHlwZWRlZiwJCQkvKiAgMTM6IENfVFBERUYJICB0eXBlZGVmICovCi0gIHN0X1N0YXRpYywJCQkvKiAgMTQ6IENfVVNUQVRJQyA/Pz8gKi8KLSAgc3RfQmxvY2ssCQkJLyogIDE1OiBDX0VOVEFHCSAgZW51bSB0YWcgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAxNjogQ19NT0UJICBtZW1iZXIgb2YgZW51bSAqLwotICBzdF9QYXJhbSwJCQkvKiAgMTc6IENfUkVHUEFSTSByZWdpc3RlciBwYXJhbWV0ZXIgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAxODsgQ19GSUVMRAkgIGJpdGZpZWxkICovCi0gIHN0X05pbCwJCQkvKiAgMTkgKi8KLSAgc3RfTmlsLAkJCS8qICAyMCAqLwotICBzdF9OaWwsCQkJLyogIDIxICovCi0gIHN0X05pbCwJCQkvKiAgMjIgKi8KLSAgc3RfTmlsLAkJCS8qICAyMyAqLwotICBzdF9OaWwsCQkJLyogIDI0ICovCi0gIHN0X05pbCwJCQkvKiAgMjUgKi8KLSAgc3RfTmlsLAkJCS8qICAyNiAqLwotICBzdF9OaWwsCQkJLyogIDI3ICovCi0gIHN0X05pbCwJCQkvKiAgMjggKi8KLSAgc3RfTmlsLAkJCS8qICAyOSAqLwotICBzdF9OaWwsCQkJLyogIDMwICovCi0gIHN0X05pbCwJCQkvKiAgMzEgKi8KLSAgc3RfTmlsLAkJCS8qICAzMiAqLwotICBzdF9OaWwsCQkJLyogIDMzICovCi0gIHN0X05pbCwJCQkvKiAgMzQgKi8KLSAgc3RfTmlsLAkJCS8qICAzNSAqLwotICBzdF9OaWwsCQkJLyogIDM2ICovCi0gIHN0X05pbCwJCQkvKiAgMzcgKi8KLSAgc3RfTmlsLAkJCS8qICAzOCAqLwotICBzdF9OaWwsCQkJLyogIDM5ICovCi0gIHN0X05pbCwJCQkvKiAgNDAgKi8KLSAgc3RfTmlsLAkJCS8qICA0MSAqLwotICBzdF9OaWwsCQkJLyogIDQyICovCi0gIHN0X05pbCwJCQkvKiAgNDMgKi8KLSAgc3RfTmlsLAkJCS8qICA0NCAqLwotICBzdF9OaWwsCQkJLyogIDQ1ICovCi0gIHN0X05pbCwJCQkvKiAgNDYgKi8KLSAgc3RfTmlsLAkJCS8qICA0NyAqLwotICBzdF9OaWwsCQkJLyogIDQ4ICovCi0gIHN0X05pbCwJCQkvKiAgNDkgKi8KLSAgc3RfTmlsLAkJCS8qICA1MCAqLwotICBzdF9OaWwsCQkJLyogIDUxICovCi0gIHN0X05pbCwJCQkvKiAgNTIgKi8KLSAgc3RfTmlsLAkJCS8qICA1MyAqLwotICBzdF9OaWwsCQkJLyogIDU0ICovCi0gIHN0X05pbCwJCQkvKiAgNTUgKi8KLSAgc3RfTmlsLAkJCS8qICA1NiAqLwotICBzdF9OaWwsCQkJLyogIDU3ICovCi0gIHN0X05pbCwJCQkvKiAgNTggKi8KLSAgc3RfTmlsLAkJCS8qICA1OSAqLwotICBzdF9OaWwsCQkJLyogIDYwICovCi0gIHN0X05pbCwJCQkvKiAgNjEgKi8KLSAgc3RfTmlsLAkJCS8qICA2MiAqLwotICBzdF9OaWwsCQkJLyogIDYzICovCi0gIHN0X05pbCwJCQkvKiAgNjQgKi8KLSAgc3RfTmlsLAkJCS8qICA2NSAqLwotICBzdF9OaWwsCQkJLyogIDY2ICovCi0gIHN0X05pbCwJCQkvKiAgNjcgKi8KLSAgc3RfTmlsLAkJCS8qICA2OCAqLwotICBzdF9OaWwsCQkJLyogIDY5ICovCi0gIHN0X05pbCwJCQkvKiAgNzAgKi8KLSAgc3RfTmlsLAkJCS8qICA3MSAqLwotICBzdF9OaWwsCQkJLyogIDcyICovCi0gIHN0X05pbCwJCQkvKiAgNzMgKi8KLSAgc3RfTmlsLAkJCS8qICA3NCAqLwotICBzdF9OaWwsCQkJLyogIDc1ICovCi0gIHN0X05pbCwJCQkvKiAgNzYgKi8KLSAgc3RfTmlsLAkJCS8qICA3NyAqLwotICBzdF9OaWwsCQkJLyogIDc4ICovCi0gIHN0X05pbCwJCQkvKiAgNzkgKi8KLSAgc3RfTmlsLAkJCS8qICA4MCAqLwotICBzdF9OaWwsCQkJLyogIDgxICovCi0gIHN0X05pbCwJCQkvKiAgODIgKi8KLSAgc3RfTmlsLAkJCS8qICA4MyAqLwotICBzdF9OaWwsCQkJLyogIDg0ICovCi0gIHN0X05pbCwJCQkvKiAgODUgKi8KLSAgc3RfTmlsLAkJCS8qICA4NiAqLwotICBzdF9OaWwsCQkJLyogIDg3ICovCi0gIHN0X05pbCwJCQkvKiAgODggKi8KLSAgc3RfTmlsLAkJCS8qICA4OSAqLwotICBzdF9OaWwsCQkJLyogIDkwICovCi0gIHN0X05pbCwJCQkvKiAgOTEgKi8KLSAgc3RfTmlsLAkJCS8qICA5MiAqLwotICBzdF9OaWwsCQkJLyogIDkzICovCi0gIHN0X05pbCwJCQkvKiAgOTQgKi8KLSAgc3RfTmlsLAkJCS8qICA5NSAqLwotICBzdF9OaWwsCQkJLyogIDk2ICovCi0gIHN0X05pbCwJCQkvKiAgOTcgKi8KLSAgc3RfTmlsLAkJCS8qICA5OCAqLwotICBzdF9OaWwsCQkJLyogIDk5ICovCi0gIHN0X0Jsb2NrLAkJCS8qIDEwMDogQ19CTE9DSyAgYmxvY2sgc3RhcnQvZW5kICovCi0gIHN0X1Byb2MsCQkJLyogMTAxOiBDX0ZDTgkgZnVuY3Rpb24gc3RhcnQvZW5kICovCi0gIHN0X0VuZCwJCQkvKiAxMDI6IENfRU9TCSBlbmQgb2Ygc3RydWN0L3VuaW9uL2VudW0gKi8KLSAgc3RfRmlsZSwJCQkvKiAxMDM6IENfRklMRQkgZmlsZSBzdGFydCAqLwotICBzdF9OaWwsCQkJLyogMTA0OiBDX0xJTkUJIGxpbmUgbnVtYmVyICovCi0gIHN0X05pbCwJCQkvKiAxMDU6IENfQUxJQVMJIGNvbWJpbmVkIHR5cGUgaW5mbyAqLwotICBzdF9OaWwsCQkJLyogMTA2OiBDX0hJRERFTiA/Pz8gKi8KLX07Ci0KLQotLyogS2VlcCB0cmFjayBvZiBkaWZmZXJlbnQgc2l6ZWQgYWxsb2NhdGlvbiByZXF1ZXN0cy4gICovCi1zdGF0aWMgYWxsb2NfaW5mb190IGFsbG9jX2NvdW50c1sgKGludClhbGxvY190eXBlX2xhc3QgXTsKLQwKLS8qIFJlY29yZCB3aGV0aGVyIHdlIGhhdmUgc2VlbiBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWludCBlY29mZl9kZWJ1Z2dpbmdfc2VlbiA9IDA7Ci0KLS8qIFZhcmlvdXMgc3RhdGljcy4gICovCi1zdGF0aWMgZWZkcl90ICAqY3VyX2ZpbGVfcHRyCT0gKGVmZHJfdCAqKSAwOwkvKiBjdXJyZW50IGZpbGUgZGVzYy4gaGVhZGVyICovCi1zdGF0aWMgcHJvY190ICAqY3VyX3Byb2NfcHRyCT0gKHByb2NfdCAqKSAwOwkvKiBjdXJyZW50IHByb2NlZHVyZSBoZWFkZXIgKi8KLXN0YXRpYyBwcm9jX3QgICpmaXJzdF9wcm9jX3B0ciAgPSAocHJvY190ICopIDA7IC8qIGZpcnN0IHByb2NlZHVyZSBoZWFkZXIgKi8KLXN0YXRpYyB0aGVhZF90ICp0b3BfdGFnX2hlYWQJPSAodGhlYWRfdCAqKSAwOyAvKiB0b3AgbGV2ZWwgdGFnIGhlYWQgKi8KLXN0YXRpYyB0aGVhZF90ICpjdXJfdGFnX2hlYWQJPSAodGhlYWRfdCAqKSAwOyAvKiBjdXJyZW50IHRhZyBoZWFkICovCi0jaWZkZWYgRUNPRkZfREVCVUcKLXN0YXRpYyBpbnQJZGVidWcJCT0gMDsgCQkvKiB0cmFjZSBmdW5jdGlvbnMgKi8KLSNlbmRpZgotc3RhdGljIGludAlzdGFic19zZWVuCT0gMDsJCS8qICE9IDAgaWYgc3RhYnMgaGF2ZSBiZWVuIHNlZW4gKi8KLQotc3RhdGljIGludCBjdXJyZW50X2ZpbGVfaWR4Owotc3RhdGljIGNvbnN0IGNoYXIgKmN1cnJlbnRfc3RhYnNfZmlsZW5hbWU7Ci0KLS8qIFBzZXVkbyBzeW1ib2wgdG8gdXNlIHdoZW4gcHV0dGluZyBzdGFicyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotI2lmbmRlZiBTVEFCU19TWU1CT0wKLSNkZWZpbmUgU1RBQlNfU1lNQk9MICJAc3RhYnMiCi0jZW5kaWYKLQotc3RhdGljIGNoYXIgc3RhYnNfc3ltYm9sW10gPSBTVEFCU19TWU1CT0w7Ci0MCi0vKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZCBhZGRfdmFycmF5X3BhZ2UgUEFSQU1TICgodmFycmF5X3QgKnZwKSk7Ci1zdGF0aWMgc3ltaW50X3QgYWRkX3N0cmluZyBQQVJBTVMgKCh2YXJyYXlfdCAqdnAsCi0JCQkJICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfdGJsLAotCQkJCSAgICBjb25zdCBjaGFyICpzdHIsCi0JCQkJICAgIHNoYXNoX3QgKipyZXRfaGFzaCkpOwotc3RhdGljIGxvY2Fsc3ltX3QgKmFkZF9lY29mZl9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyLCBzdF90IHR5cGUsCi0JCQkJCSAgICAgc2NfdCBzdG9yYWdlLCBzeW1ib2xTICpzeW0sCi0JCQkJCSAgICAgYmZkX3ZtYSBhZGRlbmQsIHN5bWludF90IHZhbHVlLAotCQkJCQkgICAgIHN5bWludF90IGluZHgpKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV9zeW1pbnQgUEFSQU1TICgoc3ltaW50X3QgYXV4X3dvcmQpKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV9ybmR4IFBBUkFNUyAoKGludCBmaWxlX2luZGV4LAotCQkJCQkgIHN5bWludF90IHN5bV9pbmRleCkpOwotc3RhdGljIHN5bWludF90IGFkZF9hdXhfc3ltX3RpciBQQVJBTVMgKCh0eXBlX2luZm9fdCAqdCwKLQkJCQkJIGhhc2hfc3RhdGVfdCBzdGF0ZSwKLQkJCQkJIHRoYXNoX3QgKipoYXNoX3RibCkpOwotc3RhdGljIHRhZ190ICpnZXRfdGFnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnRhZywgbG9jYWxzeW1fdCAqc3ltLAotCQkJICAgICAgIGJ0X3QgYmFzaWNfdHlwZSkpOwotc3RhdGljIHZvaWQgYWRkX3Vua25vd25fdGFnIFBBUkFNUyAoKHRhZ190ICpwdGFnKSk7Ci1zdGF0aWMgdm9pZCBhZGRfcHJvY2VkdXJlIFBBUkFNUyAoKGNoYXIgKmZ1bmMpKTsKLXN0YXRpYyB2b2lkIGFkZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGluZHgsIGludCBmYWtlKSk7Ci0jaWZkZWYgRUNPRkZfREVCVUcKLXN0YXRpYyBjaGFyICpzY190b19zdHJpbmcgUEFSQU1TICgoc2NfdCBzdG9yYWdlX2NsYXNzKSk7Ci1zdGF0aWMgY2hhciAqc3RfdG9fc3RyaW5nIFBBUkFNUyAoKHN0X3Qgc3ltYm9sX3R5cGUpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgbWFya19zdGFicyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBjaGFyICplY29mZl9hZGRfYnl0ZXMgUEFSQU1TICgoY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkJCQkgICAgICBjaGFyICpidWZwdHIsIHVuc2lnbmVkIGxvbmcgbmVlZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfcGFkZGluZ19hZGp1c3QKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGNoYXIgKipidWZwdHJwdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2xpbmVubwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgbG9uZyAqbGluZWNudHB0cikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3ltYm9scwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfcHJvY3MKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2F1eAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3RyaW5ncyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCQkJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQkJCSAgdmFycmF5X3QgKnZwKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9zcwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfZmRyCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zZXR1cF9leHQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHBhZ2VfdHlwZSAqYWxsb2NhdGVfY2x1c3RlciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG5wYWdlcykpOwotc3RhdGljIHBhZ2VfdHlwZSAqYWxsb2NhdGVfcGFnZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgc2NvcGVfdCAqYWxsb2NhdGVfc2NvcGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV9zY29wZSBQQVJBTVMgKChzY29wZV90ICpwdHIpKTsKLXN0YXRpYyB2bGlua3NfdCAqYWxsb2NhdGVfdmxpbmtzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzaGFzaF90ICphbGxvY2F0ZV9zaGFzaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdGhhc2hfdCAqYWxsb2NhdGVfdGhhc2ggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHRhZ190ICphbGxvY2F0ZV90YWcgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV90YWcgUEFSQU1TICgodGFnX3QgKnB0cikpOwotc3RhdGljIGZvcndhcmRfdCAqYWxsb2NhdGVfZm9yd2FyZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdGhlYWRfdCAqYWxsb2NhdGVfdGhlYWQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV90aGVhZCBQQVJBTVMgKCh0aGVhZF90ICpwdHIpKTsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICphbGxvY2F0ZV9saW5lbm9fbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN0YXJ0cyB1cC4gICovCi0KLXZvaWQKLWVjb2ZmX3JlYWRfYmVnaW5faG9vayAoKQotewotICB0YWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB0b3BfdGFnX2hlYWQgPSBhbGxvY2F0ZV90aGVhZCAoKTsKLSAgdG9wX3RhZ19oZWFkLT5maXJzdF90YWcgPSAodGFnX3QgKikgTlVMTDsKLSAgdG9wX3RhZ19oZWFkLT5mcmVlID0gKHRoZWFkX3QgKikgTlVMTDsKLSAgdG9wX3RhZ19oZWFkLT5wcmV2ID0gY3VyX3RhZ19oZWFkOwotICBjdXJfdGFnX2hlYWQgPSB0b3BfdGFnX2hlYWQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGlzIGNyZWF0ZWQuICAqLwotCi12b2lkCi1lY29mZl9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIE9CSl9TWU1GSUVMRF9UWVBFICpvYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGZpbGUgcG9pbnRlciwgYnV0IG9ubHkgaWYgd2UgaGF2ZSBzZWVuIGEKLSAgICAgZmlsZS4gIElmIHdlIGhhdmVuJ3Qgc2VlbiBhIGZpbGUsIHRoZW4gdGhpcyBpcyBhIHByb2JhYmx5IHNwZWNpYWwKLSAgICAgc3ltYm9sIGNyZWF0ZWQgYnkgbWRfYmVnaW4gd2hpY2ggbWF5IHJlcXVpcmVkIHNwZWNpYWwgaGFuZGxpbmcgYXQKLSAgICAgc29tZSBwb2ludC4gIENyZWF0aW5nIGEgZHVtbXkgZmlsZSB3aXRoIGEgZHVtbXkgbmFtZSBpcyBjZXJ0YWlubHkKLSAgICAgd3JvbmcuICAqLwotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTAotICAgICAgJiYgc2Vlbl9hdF9sZWFzdF8xX2ZpbGUgKCkpCi0gICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOwotICBvYmogPSBzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCk7Ci0gIG9iai0+ZWNvZmZfZmlsZSA9IGN1cl9maWxlX3B0cjsKLSAgb2JqLT5lY29mZl9zeW1ib2wgPSBOVUxMOwotICBvYmotPmVjb2ZmX2V4dGVybl9zaXplID0gMDsKLX0KLQwKLS8qIEFkZCBhIHBhZ2UgdG8gYSB2YXJyYXkgb2JqZWN0LiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF92YXJyYXlfcGFnZSAodnApCi0gICAgIHZhcnJheV90ICp2cDsJCQkJLyogdmFycmF5IHRvIGFkZCBwYWdlIHRvICovCi17Ci0gIHZsaW5rc190ICpuZXdfbGlua3MgPSBhbGxvY2F0ZV92bGlua3MgKCk7Ci0KLSNpZmRlZiBNQUxMT0NfQ0hFQ0sKLSAgaWYgKHZwLT5vYmplY3Rfc2l6ZSA+IDEpCi0gICAgbmV3X2xpbmtzLT5kYXR1bSA9IChwYWdlX3R5cGUgKikgeGNhbGxvYyAoMSwgdnAtPm9iamVjdF9zaXplKTsKLSAgZWxzZQotI2VuZGlmCi0gICAgbmV3X2xpbmtzLT5kYXR1bSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92YXJyYXldLnRvdGFsX2FsbG9jKys7Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmFycmF5XS50b3RhbF9wYWdlcysrOwotCi0gIG5ld19saW5rcy0+c3RhcnRfaW5kZXggPSB2cC0+bnVtX2FsbG9jYXRlZDsKLSAgdnAtPm9iamVjdHNfbGFzdF9wYWdlID0gMDsKLQotICBpZiAodnAtPmZpcnN0ID09ICh2bGlua3NfdCAqKSBOVUxMKQkJLyogZmlyc3QgYWxsb2NhdGlvbj8gKi8KLSAgICB2cC0+Zmlyc3QgPSB2cC0+bGFzdCA9IG5ld19saW5rczsKLSAgZWxzZQotICAgIHsJCQkJCQkvKiAybmQgb3IgZ3JlYXRlciBhbGxvY2F0aW9uICovCi0gICAgICBuZXdfbGlua3MtPnByZXYgPSB2cC0+bGFzdDsKLSAgICAgIHZwLT5sYXN0LT5uZXh0ID0gbmV3X2xpbmtzOwotICAgICAgdnAtPmxhc3QgPSBuZXdfbGlua3M7Ci0gICAgfQotfQotDAotLyogQWRkIGEgc3RyaW5nIChhbmQgbnVsbCBwYWQpIHRvIG9uZSBvZiB0aGUgc3RyaW5nIHRhYmxlcy4gICovCi0KLXN0YXRpYyBzeW1pbnRfdAotYWRkX3N0cmluZyAodnAsIGhhc2hfdGJsLCBzdHIsIHJldF9oYXNoKQotICAgICB2YXJyYXlfdCAqdnA7CQkJLyogc3RyaW5nIG9ic3RhY2sgKi8KLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqaGFzaF90Ymw7CS8qIHB0ciB0byBoYXNoIHRhYmxlICovCi0gICAgIGNvbnN0IGNoYXIgKnN0cjsJCQkvKiBzdHJpbmcgKi8KLSAgICAgc2hhc2hfdCAqKnJldF9oYXNoOwkJLyogcmV0dXJuIGhhc2ggcG9pbnRlciAqLwotewotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGxlbiA9IHN0cmxlbiAoc3RyKTsKLSAgcmVnaXN0ZXIgc2hhc2hfdCAqaGFzaF9wdHI7Ci0KLSAgaWYgKGxlbiA+PSBQQUdFX1VTSVpFKQotICAgIGFzX2ZhdGFsIChfKCJTdHJpbmcgdG9vIGJpZyAoJWx1IGJ5dGVzKSIpLCBsZW4pOwotCi0gIGhhc2hfcHRyID0gKHNoYXNoX3QgKikgaGFzaF9maW5kIChoYXNoX3RibCwgc3RyKTsKLSAgaWYgKGhhc2hfcHRyID09IChzaGFzaF90ICopIE5VTEwpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyOwotCi0gICAgICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlICsgbGVuID49IFBBR0VfVVNJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICB2cC0+bnVtX2FsbG9jYXRlZCA9Ci0gICAgICAgICAgICAoKHZwLT5udW1fYWxsb2NhdGVkICsgUEFHRV9VU0laRSAtIDEpIC8gUEFHRV9VU0laRSkgKiBQQUdFX1VTSVpFOwotICAgICAgICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotICAgICAgICB9Ci0KLSAgICAgIGhhc2hfcHRyID0gYWxsb2NhdGVfc2hhc2ggKCk7Ci0gICAgICBoYXNoX3B0ci0+aW5keCA9IHZwLT5udW1fYWxsb2NhdGVkOwotCi0gICAgICBoYXNoX3B0ci0+c3RyaW5nID0gJnZwLT5sYXN0LT5kYXR1bS0+Ynl0ZVt2cC0+b2JqZWN0c19sYXN0X3BhZ2VdOwotCi0gICAgICB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgKz0gbGVuICsgMTsKLSAgICAgIHZwLT5udW1fYWxsb2NhdGVkICs9IGxlbiArIDE7Ci0KLSAgICAgIHN0cmNweSAoaGFzaF9wdHItPnN0cmluZywgc3RyKTsKLQotICAgICAgZXJyID0gaGFzaF9pbnNlcnQgKGhhc2hfdGJsLCBzdHIsIChjaGFyICopIGhhc2hfcHRyKTsKLSAgICAgIGlmIChlcnIpCi0JYXNfZmF0YWwgKF8oIkluc2VydGluZyBcIiVzXCIgaW50byBzdHJpbmcgaGFzaCB0YWJsZTogJXMiKSwKLQkJICBzdHIsIGVycik7Ci0gICAgfQotCi0gIGlmIChyZXRfaGFzaCAhPSAoc2hhc2hfdCAqKikgTlVMTCkKLSAgICAqcmV0X2hhc2ggPSBoYXNoX3B0cjsKLQotICByZXR1cm4gaGFzaF9wdHItPmluZHg7Ci19Ci0MCi0vKiBBZGQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyBsb2NhbHN5bV90ICoKLWFkZF9lY29mZl9zeW1ib2wgKHN0ciwgdHlwZSwgc3RvcmFnZSwgc3ltX3ZhbHVlLCBhZGRlbmQsIHZhbHVlLCBpbmR4KQotICAgICBjb25zdCBjaGFyICpzdHI7CQkJLyogc3ltYm9sIG5hbWUgKi8KLSAgICAgc3RfdCB0eXBlOwkJCQkvKiBzeW1ib2wgdHlwZSAqLwotICAgICBzY190IHN0b3JhZ2U7CQkJLyogc3RvcmFnZSBjbGFzcyAqLwotICAgICBzeW1ib2xTICpzeW1fdmFsdWU7CQkvKiBhc3NvY2lhdGVkIHN5bWJvbC4gICovCi0gICAgIGJmZF92bWEgYWRkZW5kOwkJCS8qIGFkZGVuZCB0byBzeW1fdmFsdWUuICAqLwotICAgICBzeW1pbnRfdCB2YWx1ZTsJCQkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLSAgICAgc3ltaW50X3QgaW5keDsJCQkvKiBpbmRleCB0byBsb2NhbC9hdXguIHN5bXMgKi8KLXsKLSAgbG9jYWxzeW1fdCAqcHN5bTsKLSAgcmVnaXN0ZXIgc2NvcGVfdCAqcHNjb3BlOwotICByZWdpc3RlciB0aGVhZF90ICpwdGFnX2hlYWQ7Ci0gIHJlZ2lzdGVyIHRhZ190ICpwdGFnOwotICByZWdpc3RlciB0YWdfdCAqcHRhZ19uZXh0OwotICByZWdpc3RlciB2YXJyYXlfdCAqdnA7Ci0gIHJlZ2lzdGVyIGludCBzY29wZV9kZWx0YSA9IDA7Ci0gIHNoYXNoX3QgKmhhc2hfcHRyID0gKHNoYXNoX3QgKikgTlVMTDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5zeW1ib2xzOwotCi0gaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBwc3ltID0gJnZwLT5sYXN0LT5kYXR1bS0+c3ltWyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UrKyBdOwotCi0gIGlmIChzdHIgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCAmJiBzeW1fdmFsdWUgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBwc3ltLT5uYW1lID0gU19HRVRfTkFNRSAoc3ltX3ZhbHVlKTsKLSAgZWxzZQotICAgIHBzeW0tPm5hbWUgPSBzdHI7Ci0gIHBzeW0tPmFzX3N5bSA9IHN5bV92YWx1ZTsKLSAgaWYgKHN5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHN5bWJvbF9nZXRfb2JqIChzeW1fdmFsdWUpLT5lY29mZl9zeW1ib2wgPSBwc3ltOwotICBwc3ltLT5hZGRlbmQgPSBhZGRlbmQ7Ci0gIHBzeW0tPmZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICBwc3ltLT5wcm9jX3B0ciA9IGN1cl9wcm9jX3B0cjsKLSAgcHN5bS0+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+cGRyLmlzeW0gPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIuaWxpbmUgPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIubG5Mb3cgPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIubG5IaWdoID0gLTE7Ci0KLSAgLyogU2V0IHRoZSBCU0ZfRlVOQ1RJT04gZmxhZyBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKGZ1bmMpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCi0gIC8qIFB1c2ggdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIG5ld19wcm9jX3B0ci0+c3ltID0gYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfUHJvYywgc2NfVGV4dCwKLQkJCQkJc3ltLCAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLAotCQkJCQkoc3ltaW50X3QpIDApOwotCi0gICsrcHJvY19jbnQ7Ci0KLSAgLyogRmlsbCBpbiB0aGUgbGluZW5vcyBwcmVjZWRpbmcgdGhlIC5lbnQsIGlmIGFueS4gICovCi0gIGlmIChub3Byb2NfbGluZW5vICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCi0gICAgewotICAgICAgbGluZW5vX2xpc3RfdCAqbDsKLQotICAgICAgZm9yIChsID0gbm9wcm9jX2xpbmVubzsgbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLQlsLT5wcm9jID0gbmV3X3Byb2NfcHRyOwotICAgICAgKmxhc3RfbGluZW5vX3B0ciA9IG5vcHJvY19saW5lbm87Ci0gICAgICB3aGlsZSAoKmxhc3RfbGluZW5vX3B0ciAhPSBOVUxMKQotCXsKLQkgIGxhc3RfbGluZW5vID0gKmxhc3RfbGluZW5vX3B0cjsKLQkgIGxhc3RfbGluZW5vX3B0ciA9ICZsYXN0X2xpbmVuby0+bmV4dDsKLQl9Ci0gICAgICBub3Byb2NfbGluZW5vID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgICB9Ci19Ci0KLXN5bWJvbFMgKgotZWNvZmZfZ2V0X2N1cl9wcm9jX3N5bSAoKQotewotICByZXR1cm4gKGN1cl9wcm9jX3B0ciA/IGN1cl9wcm9jX3B0ci0+c3ltLT5hc19zeW0gOiBOVUxMKTsKLX0KLQwKLS8qIEFkZCBhIG5ldyBmaWxlbmFtZSwgYW5kIHNldCB1cCBhbGwgb2YgdGhlIGZpbGUgcmVsYXRpdmUKLSAgIHZpcnR1YWwgYXJyYXlzIChzdHJpbmdzLCBzeW1ib2xzLCBhdXggc3ltcywgZXRjLikuICBSZWNvcmQKLSAgIHdoZXJlIHRoZSBjdXJyZW50IGZpbGUgc3RydWN0dXJlIGxpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9maWxlIChmaWxlX25hbWUsIGluZHgsIGZha2UpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZTsJCS8qIGZpbGUgbmFtZSAqLwotICAgICBpbnQgaW5keDsKLSAgICAgaW50IGZha2U7Ci17Ci0gIHJlZ2lzdGVyIGludCBmaXJzdF9jaDsKLSAgcmVnaXN0ZXIgZWZkcl90ICpmaWxfcHRyOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnKQotICAgIGZwcmludGYgKHN0ZGVyciwgIlx0ZmlsZVx0JS4qc1xuIiwgbGVuLCBmaWxlX3N0YXJ0KTsKLSNlbmRpZgotCi0gIC8qIElmIHRoZSBmaWxlIG5hbWUgaXMgTlVMTCwgdGhlbiBubyAuZmlsZSBzeW1ib2wgYXBwZWFyZWQsIGFuZCB3ZQotICAgICB3YW50IHRvIHVzZSB0aGUgYWN0dWFsIGZpbGUgbmFtZS4gICovCi0gIGlmIChmaWxlX25hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlOwotCi0gICAgICBpZiAoZmlyc3RfZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCi0JYXNfZmF0YWwgKF8oImZha2UgLmZpbGUgYWZ0ZXIgcmVhbCBvbmUiKSk7Ci0gICAgICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gICAgICBmaWxlX25hbWUgPSAoY29uc3QgY2hhciAqKSBmaWxlOwotCi0gICAgICAvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgc2luY2UgSQotICAgICAgICAgdGhpbmsgdGhhdCdzIHdoYXQgb3RoZXIgRUNPRkYgYXNzZW1ibGVycyBkby4gIFdlIGRvbid0IGRvCi0gICAgICAgICB0aGlzIGlmIHdlIHNlZSBhIC5maWxlIGRpcmVjdGl2ZSB3aXRoIGEgc3RyaW5nLCBzaW5jZSB0aGF0Ci0gICAgICAgICBpbXBsaWVzIHRoYXQgc29tZSBzb3J0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBiZWluZwotICAgICAgICAgcHJvdmlkZWQuICAqLwotICAgICAgaWYgKCEgc3ltYm9sX3RhYmxlX2Zyb3plbiAmJiBkZWJ1Z190eXBlID09IERFQlVHX05PTkUpCi0JZGVidWdfdHlwZSA9IERFQlVHX0VDT0ZGOwotICAgIH0KLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGlmIChsaXN0aW5nKQotICAgIGxpc3Rpbmdfc291cmNlX2ZpbGUgKGZpbGVfbmFtZSk7Ci0jZW5kaWYKLQotICBjdXJyZW50X3N0YWJzX2ZpbGVuYW1lID0gZmlsZV9uYW1lOwotCi0gIC8qIElmIHdlJ3JlIGNyZWF0aW5nIHN0YWJzLCB0aGVuIHdlIGRvbid0IGFjdHVhbGx5IG1ha2UgYSBuZXcgRkRSLgotICAgICBJbnN0ZWFkLCB3ZSBqdXN0IGNyZWF0ZSBhIHN0YWJzIHN5bWJvbC4gICovCi0gIGlmIChzdGFic19zZWVuKQotICAgIHsKLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChmaWxlX25hbWUsIHN0X05pbCwgc2NfTmlsLAotCQkJICAgICAgIHN5bWJvbF9uZXcgKCJMMFwwMDEiLCBub3dfc2VnLAotCQkJCQkgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSAgIGZyYWdfbm93KSwKLQkJCSAgICAgICAoYmZkX3ZtYSkgMCwgMCwgRUNPRkZfTUFSS19TVEFCIChOX1NPTCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmaXJzdF9jaCA9ICpmaWxlX25hbWU7Ci0KLSAgLyogRklYTUU6IFdlIGNhbid0IHNhZmVseSBtZXJnZSBmaWxlcyB3aGljaCBoYXZlIGxpbmUgbnVtYmVyCi0gICAgIGluZm9ybWF0aW9uIChmTWVyZ2Ugd2lsbCBiZSB6ZXJvIGluIHRoaXMgY2FzZSkuICBPdGhlcndpc2UsIHdlCi0gICAgIGdldCBpbmNvcnJlY3QgbGluZSBudW1iZXIgZGVidWdnaW5nIGluZm8uICBTZWUgZm9yIGluc3RhbmNlCi0gICAgIGVjb2ZmX2J1aWxkX2xpbmVubywgd2hpY2ggd2lsbCBlbmQgdXAgc2V0dGluZyBhbGwgZmlsZS0+ZmRyLioKLSAgICAgZmllbGRzIG11bHRpcGxlIHRpbWVzLCByZXN1bHRpbmcgaW4gaW5jb3JyZWN0IGRlYnVnIGluZm8uICBJbgotICAgICBvcmRlciB0byBtYWtlIHRoaXMgd29yayByaWdodCwgYWxsIGxpbmUgbnVtYmVyIGFuZCBzeW1ib2wgaW5mbwotICAgICBmb3IgdGhlIHNhbWUgc291cmNlIGZpbGUgaGFzIHRvIGJlIGFkamFjZW50IGluIHRoZSBvYmplY3QgZmlsZSwKLSAgICAgc28gdGhhdCBhIHNpbmdsZSBmaWxlIGRlc2NyaXB0b3IgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlbS4KLSAgICAgVGhpcyB3b3VsZCByZXF1aXJlIG1haW50YWluaW5nIGZpbGUgc3BlY2lmaWMgbGlzdHMgb2YgbGluZQotICAgICBudW1iZXJzIGFuZCBzeW1ib2xzIGZvciBlYWNoIGZpbGUsIHNvIHRoYXQgdGhleSBjYW4gYmUgbWVyZ2VkCi0gICAgIHRvZ2V0aGVyIChvciBvdXRwdXQgdG9nZXRoZXIpIHdoZW4gdHdvIC5maWxlIHBzZXVkby1vcHMgYXJlCi0gICAgIG1lcmdlZCBpbnRvIG9uZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotCi0gIC8qIFNlZSBpZiB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuICAqLwotICBmb3IgKGZpbF9wdHIgPSBmaXJzdF9maWxlOwotICAgICAgIGZpbF9wdHIgIT0gKGVmZHJfdCAqKSBOVUxMOwotICAgICAgIGZpbF9wdHIgPSBmaWxfcHRyLT5uZXh0X2ZpbGUpCi0gICAgewotICAgICAgaWYgKGZpcnN0X2NoID09IGZpbF9wdHItPm5hbWVbMF0KLQkgICYmIHN0cmNtcCAoZmlsZV9uYW1lLCBmaWxfcHRyLT5uYW1lKSA9PSAwCi0JICAmJiBmaWxfcHRyLT5mZHIuZk1lcmdlKQotCXsKLQkgIGN1cl9maWxlX3B0ciA9IGZpbF9wdHI7Ci0JICBpZiAoISBmYWtlKQotCSAgICBjdXJfZmlsZV9wdHItPmZha2UgPSAwOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbmV3IGZpbGUsIGNyZWF0ZSBpdC4gKi8KLSAgaWYgKGZpbF9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2UgPT0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2UpCi0JYWRkX3ZhcnJheV9wYWdlICgmZmlsZV9kZXNjKTsKLQotICAgICAgZmlsX3B0ciA9IGN1cl9maWxlX3B0ciA9Ci0JJmZpbGVfZGVzYy5sYXN0LT5kYXR1bS0+ZmlsZVtmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2UrK107Ci0gICAgICAqZmlsX3B0ciA9IGluaXRfZmlsZTsKLQotICAgICAgZmlsX3B0ci0+ZmlsZV9pbmRleCA9IGN1cnJlbnRfZmlsZV9pZHgrKzsKLSAgICAgICsrZmlsZV9kZXNjLm51bV9hbGxvY2F0ZWQ7Ci0KLSAgICAgIGZpbF9wdHItPmZha2UgPSBmYWtlOwotCi0gICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotICAgICAgZmlsX3B0ci0+c3RyX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAgICAgLyogTWFrZSBzdXJlIDAgYnl0ZSBpbiBzdHJpbmcgdGFibGUgaXMgbnVsbCAgKi8KLSAgICAgIGFkZF9zdHJpbmcgKCZmaWxfcHRyLT5zdHJpbmdzLAotCQkgIGZpbF9wdHItPnN0cl9oYXNoLAotCQkgICIiLAotCQkgIChzaGFzaF90ICoqKTApOwotCi0gICAgICBpZiAoc3RybGVuIChmaWxlX25hbWUpID4gUEFHRV9VU0laRSAtIDIpCi0JYXNfZmF0YWwgKF8oIkZpbGVuYW1lIGdvZXMgb3ZlciBvbmUgcGFnZSBib3VuZGFyeS4iKSk7Ci0KLSAgICAgIC8qIFB1c2ggdGhlIHN0YXJ0IG9mIHRoZSBmaWxlbmFtZS4gV2UgYXNzdW1lIHRoYXQgdGhlIGZpbGVuYW1lCi0gICAgICAgICB3aWxsIGJlIHN0b3JlZCBhdCBzdHJpbmcgb2Zmc2V0IDEuICAqLwotICAgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKGZpbGVfbmFtZSwgc3RfRmlsZSwgc2NfVGV4dCwKLQkJCSAgICAgICAoc3ltYm9sUyAqKSBOVUxMLCAoYmZkX3ZtYSkgMCwKLQkJCSAgICAgICAoc3ltaW50X3QpIDAsIChzeW1pbnRfdCkgMCk7Ci0gICAgICBmaWxfcHRyLT5mZHIucnNzID0gMTsKLSAgICAgIGZpbF9wdHItPm5hbWUgPSAmZmlsX3B0ci0+c3RyaW5ncy5sYXN0LT5kYXR1bS0+Ynl0ZVsxXTsKLQotICAgICAgLyogVXBkYXRlIHRoZSBsaW5rZWQgbGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KLSAgICAgICpsYXN0X2ZpbGVfcHRyID0gZmlsX3B0cjsKLSAgICAgIGxhc3RfZmlsZV9wdHIgPSAmZmlsX3B0ci0+bmV4dF9maWxlOwotCi0gICAgICAvKiBBZGQgdm9pZCAmIGludCB0eXBlcyB0byB0aGUgZmlsZSAodm9pZCBzaG91bGQgYmUgZmlyc3QgdG8gY2F0Y2gKLQkgZXJyYW50IDAncyB3aXRoaW4gdGhlIGluZGV4IGZpZWxkcykuICAqLwotICAgICAgZmlsX3B0ci0+dm9pZF90eXBlID0gYWRkX2F1eF9zeW1fdGlyICgmdm9pZF90eXBlX2luZm8sCi0JCQkJCSAgICBoYXNoX3llcywKLQkJCQkJICAgICZjdXJfZmlsZV9wdHItPnRoYXNoX2hlYWRbMF0pOwotCi0gICAgICBmaWxfcHRyLT5pbnRfdHlwZSA9IGFkZF9hdXhfc3ltX3RpciAoJmludF90eXBlX2luZm8sCi0JCQkJCSAgIGhhc2hfeWVzLAotCQkJCQkgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBub3RpY2VzIGEgcHJlcHJvY2Vzc29yCi0gICBkaXJlY3RpdmUgc3dpdGNoaW5nIHRvIGEgbmV3IGZpbGUuICBUaGlzIHdpbGwgbm90IGhhcHBlbiBpbgotICAgY29tcGlsZXIgb3V0cHV0LCBvbmx5IGluIGhhbmQgY29kZWQgYXNzZW1ibGVyLiAgKi8KLQotdm9pZAotZWNvZmZfbmV3X2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChjdXJfZmlsZV9wdHIgIT0gTlVMTCAmJiBzdHJjbXAgKGN1cl9maWxlX3B0ci0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICByZXR1cm47Ci0gIGFkZF9maWxlIChuYW1lLCAwLCAwKTsKLQotICAvKiBUaGlzIGlzIGEgaGFuZCBjb2RlZCBhc3NlbWJsZXIgZmlsZSwgc28gYXV0b21hdGljYWxseSB0dXJuIG9uCi0gICAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX05PTkUpCi0gICAgZGVidWdfdHlwZSA9IERFQlVHX0VDT0ZGOwotfQotDAotI2lmZGVmIEVDT0ZGX0RFQlVHCi0KLS8qIENvbnZlcnQgc3RvcmFnZSBjbGFzcyB0byBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zY190b19zdHJpbmcoc3RvcmFnZV9jbGFzcykKLSAgICAgc2NfdCBzdG9yYWdlX2NsYXNzOwotewotICBzd2l0Y2goc3RvcmFnZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBzY19OaWw6CSByZXR1cm4gIk5pbCwiOwotICAgIGNhc2Ugc2NfVGV4dDoJIHJldHVybiAiVGV4dCwiOwotICAgIGNhc2Ugc2NfRGF0YToJIHJldHVybiAiRGF0YSwiOwotICAgIGNhc2Ugc2NfQnNzOgkgcmV0dXJuICJCc3MsIjsKLSAgICBjYXNlIHNjX1JlZ2lzdGVyOgkgcmV0dXJuICJSZWdpc3RlciwiOwotICAgIGNhc2Ugc2NfQWJzOgkgcmV0dXJuICJBYnMsIjsKLSAgICBjYXNlIHNjX1VuZGVmaW5lZDoJIHJldHVybiAiVW5kZWZpbmVkLCI7Ci0gICAgY2FzZSBzY19DZGJMb2NhbDoJIHJldHVybiAiQ2RiTG9jYWwsIjsKLSAgICBjYXNlIHNjX0JpdHM6CSByZXR1cm4gIkJpdHMsIjsKLSAgICBjYXNlIHNjX0NkYlN5c3RlbToJIHJldHVybiAiQ2RiU3lzdGVtLCI7Ci0gICAgY2FzZSBzY19SZWdJbWFnZToJIHJldHVybiAiUmVnSW1hZ2UsIjsKLSAgICBjYXNlIHNjX0luZm86CSByZXR1cm4gIkluZm8sIjsKLSAgICBjYXNlIHNjX1VzZXJTdHJ1Y3Q6CSByZXR1cm4gIlVzZXJTdHJ1Y3QsIjsKLSAgICBjYXNlIHNjX1NEYXRhOgkgcmV0dXJuICJTRGF0YSwiOwotICAgIGNhc2Ugc2NfU0JzczoJIHJldHVybiAiU0JzcywiOwotICAgIGNhc2Ugc2NfUkRhdGE6CSByZXR1cm4gIlJEYXRhLCI7Ci0gICAgY2FzZSBzY19WYXI6CSByZXR1cm4gIlZhciwiOwotICAgIGNhc2Ugc2NfQ29tbW9uOgkgcmV0dXJuICJDb21tb24sIjsKLSAgICBjYXNlIHNjX1NDb21tb246CSByZXR1cm4gIlNDb21tb24sIjsKLSAgICBjYXNlIHNjX1ZhclJlZ2lzdGVyOiByZXR1cm4gIlZhclJlZ2lzdGVyLCI7Ci0gICAgY2FzZSBzY19WYXJpYW50OgkgcmV0dXJuICJWYXJpYW50LCI7Ci0gICAgY2FzZSBzY19TVW5kZWZpbmVkOgkgcmV0dXJuICJTVW5kZWZpbmVkLCI7Ci0gICAgY2FzZSBzY19Jbml0OgkgcmV0dXJuICJJbml0LCI7Ci0gICAgY2FzZSBzY19NYXg6CSByZXR1cm4gIk1heCwiOwotICAgIH0KLQotICByZXR1cm4gIj8/PywiOwotfQotCi0jZW5kaWYgLyogREVCVUcgKi8KLQwKLSNpZmRlZiBFQ09GRl9ERUJVRwotCi0vKiBDb252ZXJ0IHN5bWJvbCB0eXBlIHRvIHN0cmluZy4gICovCi0KLXN0YXRpYyBjaGFyICoKLXN0X3RvX3N0cmluZyhzeW1ib2xfdHlwZSkKLSAgICAgc3RfdCBzeW1ib2xfdHlwZTsKLXsKLSAgc3dpdGNoKHN5bWJvbF90eXBlKQotICAgIHsKLSAgICBjYXNlIHN0X05pbDoJcmV0dXJuICJOaWwsIjsKLSAgICBjYXNlIHN0X0dsb2JhbDoJcmV0dXJuICJHbG9iYWwsIjsKLSAgICBjYXNlIHN0X1N0YXRpYzoJcmV0dXJuICJTdGF0aWMsIjsKLSAgICBjYXNlIHN0X1BhcmFtOglyZXR1cm4gIlBhcmFtLCI7Ci0gICAgY2FzZSBzdF9Mb2NhbDoJcmV0dXJuICJMb2NhbCwiOwotICAgIGNhc2Ugc3RfTGFiZWw6CXJldHVybiAiTGFiZWwsIjsKLSAgICBjYXNlIHN0X1Byb2M6CXJldHVybiAiUHJvYywiOwotICAgIGNhc2Ugc3RfQmxvY2s6CXJldHVybiAiQmxvY2ssIjsKLSAgICBjYXNlIHN0X0VuZDoJcmV0dXJuICJFbmQsIjsKLSAgICBjYXNlIHN0X01lbWJlcjoJcmV0dXJuICJNZW1iZXIsIjsKLSAgICBjYXNlIHN0X1R5cGVkZWY6CXJldHVybiAiVHlwZWRlZiwiOwotICAgIGNhc2Ugc3RfRmlsZToJcmV0dXJuICJGaWxlLCI7Ci0gICAgY2FzZSBzdF9SZWdSZWxvYzoJcmV0dXJuICJSZWdSZWxvYywiOwotICAgIGNhc2Ugc3RfRm9yd2FyZDoJcmV0dXJuICJGb3J3YXJkLCI7Ci0gICAgY2FzZSBzdF9TdGF0aWNQcm9jOglyZXR1cm4gIlN0YXRpY1Byb2MsIjsKLSAgICBjYXNlIHN0X0NvbnN0YW50OglyZXR1cm4gIkNvbnN0YW50LCI7Ci0gICAgY2FzZSBzdF9TdHI6CXJldHVybiAiU3RyaW5nLCI7Ci0gICAgY2FzZSBzdF9OdW1iZXI6CXJldHVybiAiTnVtYmVyLCI7Ci0gICAgY2FzZSBzdF9FeHByOglyZXR1cm4gIkV4cHIsIjsKLSAgICBjYXNlIHN0X1R5cGU6CXJldHVybiAiVHlwZSwiOwotICAgIGNhc2Ugc3RfTWF4OglyZXR1cm4gIk1heCwiOwotICAgIH0KLQotICByZXR1cm4gIj8/PywiOwotfQotCi0jZW5kaWYgLyogREVCVUcgKi8KLQwKLS8qIFBhcnNlIC5iZWdpbiBkaXJlY3RpdmVzIHdoaWNoIGhhdmUgYSBsYWJlbCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKLSAgIHdoaWNoIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2JlZ2luIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmJlZ2luIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5iZWdpbiBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X0Jsb2NrLCBzY19UZXh0LAotCQkJICAgc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSksCi0JCQkgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAvKiBUaGUgbGluZSBudW1iZXIgZm9sbG93cywgYnV0IHdlIGRvbid0IHVzZSBpdC4gICovCi0gICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5iZW5kIGRpcmVjdGl2ZXMgd2hpY2ggaGF2ZSBhIGxhYmVsIGFzIHRoZSBmaXJzdCBhcmd1bWVudAotICAgd2hpY2ggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGJsb2NrLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2JlbmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLSAgc3ltYm9sUyAqZW5kc3ltOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5iZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5iZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBUaGUgdmFsdWUgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIC5iZW5kIGRpcmVjdGl2ZSBhbmQgdGhlCi0gICAgIGNvcnJlc3BvbmRpbmcgc3ltYm9sLiAgV2UgZmlsbCBpbiB0aGUgb2Zmc2V0IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICAgIHRoZSBzeW1ib2wuICAqLwotICBlbmRzeW0gPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gIGlmIChlbmRzeW0gPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBhc193YXJuIChfKCIuYmVuZCBkaXJlY3RpdmUgbmFtZXMgdW5rbm93biBzeW1ib2wiKSk7Ci0gIGVsc2UKLSAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfRW5kLCBzY19UZXh0LCBlbmRzeW0sCi0JCQkgICAgIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIDAsIChzeW1pbnRfdCkgMCk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIC8qIFRoZSBsaW5lIG51bWJlciBmb2xsb3dzLCBidXQgd2UgZG9uJ3QgdXNlIGl0LiAgKi8KLSAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYXMgYSBzZXJpZXMgb2YgZGlyZWN0aXZlcwotICAgKC5kZWYsIC5zY2wsIGV0Yy4pLiAgV2UgYnVpbGQgdXAgaW5mb3JtYXRpb24gYXMgd2UgcmVhZCB0aGUKLSAgIGRpcmVjdGl2ZXMgaW4gdGhlIGZvbGxvd2luZyBzdGF0aWMgdmFyaWFibGVzLCBhbmQgZmlsZSBpdCBhd2F5IHdoZW4KLSAgIHdlIHJlYWNoIHRoZSAuZW5kZWYgZGlyZWN0aXZlLiAgKi8KLXN0YXRpYyBjaGFyICpjb2ZmX3N5bV9uYW1lOwotc3RhdGljIHR5cGVfaW5mb190IGNvZmZfdHlwZTsKLXN0YXRpYyBzY190IGNvZmZfc3RvcmFnZV9jbGFzczsKLXN0YXRpYyBzdF90IGNvZmZfc3ltYm9sX3R5cDsKLXN0YXRpYyBpbnQgY29mZl9pc19mdW5jdGlvbjsKLXN0YXRpYyBjaGFyICpjb2ZmX3RhZzsKLXN0YXRpYyB2YWx1ZVQgY29mZl92YWx1ZTsKLXN0YXRpYyBzeW1ib2xTICpjb2ZmX3N5bV92YWx1ZTsKLXN0YXRpYyBiZmRfdm1hIGNvZmZfc3ltX2FkZGVuZDsKLXN0YXRpYyBpbnQgY29mZl9pbnNpZGVfZW51bWVyYXRpb247Ci0KLS8qIEhhbmRsZSBhIC5kZWYgZGlyZWN0aXZlOiBzdGFydCBkZWZpbmluZyBhIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9kZWYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLQotICBlY29mZl9kZWJ1Z2dpbmdfc2VlbiA9IDE7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBhc193YXJuIChfKCIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgZWxzZSBpZiAoKm5hbWUgPT0gJ1wwJykKLSAgICBhc193YXJuIChfKCJFbXB0eSBzeW1ib2wgbmFtZSBpbiAuZGVmOyBpZ25vcmVkIikpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGNvZmZfc3ltX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLQlmcmVlIChjb2ZmX3N5bV9uYW1lKTsKLSAgICAgIGlmIChjb2ZmX3RhZyAhPSAoY2hhciAqKSBOVUxMKQotCWZyZWUgKGNvZmZfdGFnKTsKLSAgICAgIGNvZmZfc3ltX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgKHN0cmxlbiAobmFtZSkgKyAxKSk7Ci0gICAgICBzdHJjcHkgKGNvZmZfc3ltX25hbWUsIG5hbWUpOwotICAgICAgY29mZl90eXBlID0gdHlwZV9pbmZvX2luaXQ7Ci0gICAgICBjb2ZmX3N0b3JhZ2VfY2xhc3MgPSBzY19OaWw7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXAgPSBzdF9OaWw7Ci0gICAgICBjb2ZmX2lzX2Z1bmN0aW9uID0gMDsKLSAgICAgIGNvZmZfdGFnID0gKGNoYXIgKikgTlVMTDsKLSAgICAgIGNvZmZfdmFsdWUgPSAwOwotICAgICAgY29mZl9zeW1fdmFsdWUgPSAoc3ltYm9sUyAqKSBOVUxMOwotICAgICAgY29mZl9zeW1fYWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5kaW0gZGlyZWN0aXZlLCB1c2VkIHRvIGdpdmUgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkuICBUaGUKLSAgIGFyZ3VtZW50cyBhcmUgY29tbWEgc2VwYXJhdGVkIG51bWJlcnMuICBtaXBzLXRmaWxlIGFzc3VtZXMgdGhhdAotICAgdGhlcmUgd2lsbCBub3QgYmUgbW9yZSB0aGFuIDYgZGltZW5zaW9ucywgYW5kIGdkYiB3b24ndCByZWFkIGFueQotICAgbW9yZSB0aGFuIHRoYXQgYW55aG93LCBzbyBJIHdpbGwgYWxzbyBtYWtlIHRoYXQgYXNzdW1wdGlvbi4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9kaW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGRpbWVuc1tOX1RRXTsKLSAgaW50IGk7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgTl9UUTsgaSsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGRpbWVuc1tpXSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZWxzZQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicKLQkgICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICc7JykKLQkgICAgYXNfd2FybiAoXygiQmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaSA9PSBOX1RRKQotICAgIC0taTsKLQotICAvKiBUaGUgZGltZW5zaW9ucyBhcmUgc3RvcmVkIGF3YXkgaW4gcmV2ZXJzZSBvcmRlci4gICovCi0gIGZvciAoOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBpZiAoY29mZl90eXBlLm51bV9kaW1zID49IE5fVFEpCi0JewotCSAgYXNfd2FybiAoXygiVG9vIG1hbnkgLmRpbSBlbnRyaWVzIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgY29mZl90eXBlLmRpbWVuc2lvbnNbY29mZl90eXBlLm51bV9kaW1zXSA9IGRpbWVuc1tpXTsKLSAgICAgICsrY29mZl90eXBlLm51bV9kaW1zOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuc2NsIGRpcmVjdGl2ZSwgd2hpY2ggc2V0cyB0aGUgQ09GRiBzdG9yYWdlIGNsYXNzIG9mIHRoZQotICAgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGNvZmZfc3ltYm9sX3R5cCA9IG1hcF9jb2ZmX3N5bV90eXBlW3ZhbF07Ci0gIGNvZmZfc3RvcmFnZV9jbGFzcyA9IG1hcF9jb2ZmX3N0b3JhZ2VbdmFsXTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuc2l6ZSBkaXJlY3RpdmUuICBGb3Igc29tZSByZWFzb24gbWlwcy10ZmlsZS5jIHRoaW5rcyB0aGF0Ci0gICAuc2l6ZSBjYW4gaGF2ZSBtdWx0aXBsZSBhcmd1bWVudHMuICBXZSBodW1vciBpdCwgYWx0aG91Z2ggZ2NjIHdpbGwKLSAgIG5ldmVyIGdlbmVyYXRlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgc2l6ZXNbTl9UUV07Ci0gIGludCBpOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNpemUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBOX1RROyBpKyspCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc2l6ZXNbaV0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nCi0JICAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOycpCi0JICAgIGFzX3dhcm4gKF8oIkJhZGx5IGZvcm1lZCAuc2l6ZSBkaXJlY3RpdmUiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpID09IE5fVFEpCi0gICAgLS1pOwotCi0gIC8qIFRoZSBzaXplcyBhcmUgc3RvcmVkIGF3YXkgaW4gcmV2ZXJzZSBvcmRlci4gICovCi0gIGZvciAoOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBpZiAoY29mZl90eXBlLm51bV9zaXplcyA+PSBOX1RRKQotCXsKLQkgIGFzX3dhcm4gKF8oIlRvbyBtYW55IC5zaXplIGVudHJpZXMiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBjb2ZmX3R5cGUuc2l6ZXNbY29mZl90eXBlLm51bV9zaXplc10gPSBzaXplc1tpXTsKLSAgICAgICsrY29mZl90eXBlLm51bV9zaXplczsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudHlwZSBkaXJlY3RpdmUsIHdoaWNoIGdpdmVzIHRoZSBDT0ZGIHR5cGUgb2YgdGhlCi0gICBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLSAgdHFfdCAqdHFfcHRyOwotICB0cV90ICp0cV9zaGZ0OwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnR5cGUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGNvZmZfdHlwZS5vcmlnX3R5cGUgPSBCVFlQRSAodmFsKTsKLSAgY29mZl90eXBlLmJhc2ljX3R5cGUgPSBtYXBfY29mZl90eXBlc1tjb2ZmX3R5cGUub3JpZ190eXBlXTsKLQotICB0cV9wdHIgPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1tOX1RRXTsKLSAgd2hpbGUgKHZhbCAmfiBOX0JUTUFTSykKLSAgICB7Ci0gICAgICBpZiAodHFfcHRyID09ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzWzBdKQotCXsKLQkgIC8qIEZJWE1FOiBXZSBjb3VsZCBoYW5kbGUgdGhpcyBieSBzZXR0aW5nIHRoZSBjb250aW51ZWQgYml0LgotICAgICAgICAgICAgIFRoZXJlIHdvdWxkIHN0aWxsIGJlIGEgbGltaXQ6IHRoZSAudHlwZSBhcmd1bWVudCBjYW4gbm90Ci0gICAgICAgICAgICAgYmUgaW5maW5pdGUuICAqLwotCSAgYXNfd2FybiAoXygiVGhlIHR5cGUgb2YgJXMgaXMgdG9vIGNvbXBsZXg7IGl0IHdpbGwgYmUgc2ltcGxpZmllZCIpLAotCQkgICBjb2ZmX3N5bV9uYW1lKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChJU1BUUiAodmFsKSkKLQkqLS10cV9wdHIgPSB0cV9QdHI7Ci0gICAgICBlbHNlIGlmIChJU0ZDTiAodmFsKSkKLQkqLS10cV9wdHIgPSB0cV9Qcm9jOwotICAgICAgZWxzZSBpZiAoSVNBUlkgKHZhbCkpCi0JKi0tdHFfcHRyID0gdHFfQXJyYXk7Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIlVucmVjb2duaXplZCAudHlwZSBhcmd1bWVudCIpKTsKLQotICAgICAgdmFsID0gREVDUkVGICh2YWwpOwotICAgIH0KLQotICB0cV9zaGZ0ID0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbMF07Ci0gIHdoaWxlICh0cV9wdHIgIT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbTl9UUV0pCi0gICAgKnRxX3NoZnQrKyA9ICp0cV9wdHIrKzsKLQotICBpZiAodHFfc2hmdCAhPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1swXSAmJiB0cV9zaGZ0Wy0xXSA9PSB0cV9Qcm9jKQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgaWdub3JlIGl0LCBzbyB0aGF0IHdlIGRvbid0IGdldCB0d28KLQkgZW50cmllcyAob25lIGZyb20gdGhlIC5lbnQsIGFuZCBvbmUgZm9yIHRoZSAuZGVmIHRoYXQKLQkgcHJlY2VkZXMgaXQpLiAgU2F2ZSB0aGUgdHlwZSBpbmZvcm1hdGlvbiBzbyB0aGF0IHRoZSBlbmQKLQkgYmxvY2sgY2FuIHByb3Blcmx5IGFkZCBpdCBhZnRlciB0aGUgYmVnaW4gYmxvY2sgaW5kZXguICBGb3IKLQkgTUlQUyBrbm93cyB3aGF0IHJlYXNvbiwgd2UgbXVzdCBzdHJpcCBvZmYgdGhlIGZ1bmN0aW9uIHR5cGUKLQkgYXQgdGhpcyBwb2ludC4gICovCi0gICAgICBjb2ZmX2lzX2Z1bmN0aW9uID0gMTsKLSAgICAgIHRxX3NoZnRbLTFdID0gdHFfTmlsOwotICAgIH0KLQotICB3aGlsZSAodHFfc2hmdCAhPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1tOX1RRXSkKLSAgICAqdHFfc2hmdCsrID0gdHFfTmlsOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnRhZyBkaXJlY3RpdmUsIHdoaWNoIGdpdmVzIHRoZSBuYW1lIG9mIGEgc3RydWN0dXJlLAotICAgdW5pb24gb3IgZW51bS4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV90YWcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgY29mZl90YWcgPSAoY2hhciAqKSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgKHN0cmxlbiAobmFtZSkgKyAxKSk7Ci0gIHN0cmNweSAoY29mZl90YWcsIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC52YWwgZGlyZWN0aXZlLCB3aGljaCBnaXZlcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEl0Ci0gICBtYXkgYmUgdGhlIG5hbWUgb2YgYSBzdGF0aWMgb3IgZ2xvYmFsIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV92YWwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50ICYmIGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnZhbCBleHByZXNzaW9uIGlzIHRvbyBjb3BtbGV4IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgY29mZl92YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb2ZmX3N5bV92YWx1ZSA9IGV4cC5YX2FkZF9zeW1ib2w7Ci0gICAgICBjb2ZmX3N5bV9hZGRlbmQgPSBleHAuWF9hZGRfbnVtYmVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5lbmRlZiBkaXJlY3RpdmUsIHdoaWNoIHRlcm1pbmF0ZXMgcHJvY2Vzc2luZyBvZiBDT0ZGCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2VuZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN5bWludF90IGluZHg7Ci0gIGxvY2Fsc3ltX3QgKnN5bTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZGVmIHBzZXVkby1vcCB1c2VkIGJlZm9yZSAuZGVmOyBpZ25vcmVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gY29mZl9zeW1fbmFtZTsKLSAgY29mZl9zeW1fbmFtZSA9IChjaGFyICopIE5VTEw7Ci0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBhIHN0YXRpYyBvciBleHRlcm5hbCwgd2UgaGF2ZSBhbHJlYWR5IGdvdHRlbiB0aGUKLSAgICAgYXBwcm9wcmlhdGUgdHlwZSBhbmQgY2xhc3MsIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVycmlkZSB0aG9zZQotICAgICB2YWx1ZXMuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lIHR5cGUgYW5kIGNsYXNzZXMKLSAgICAgdGhhdCBhcmUgbm90IGluIENPRkYsIHN1Y2ggYXMgc2hvcnQgZGF0YSwgZXRjLiAgKi8KLSAgaWYgKGNvZmZfc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwID0gc3RfTmlsOwotICAgICAgY29mZl9zdG9yYWdlX2NsYXNzID0gc2NfTmlsOwotICAgIH0KLQotICBjb2ZmX3R5cGUuZXh0cmFfc2l6ZXMgPSBjb2ZmX3RhZyAhPSAoY2hhciAqKSBOVUxMOwotICBpZiAoY29mZl90eXBlLm51bV9kaW1zID4gMCkKLSAgICB7Ci0gICAgICBpbnQgZGlmZiA9IGNvZmZfdHlwZS5udW1fZGltcyAtIGNvZmZfdHlwZS5udW1fc2l6ZXM7Ci0gICAgICBpbnQgaSA9IGNvZmZfdHlwZS5udW1fZGltcyAtIDE7Ci0gICAgICBpbnQgajsKLQotICAgICAgaWYgKGNvZmZfdHlwZS5udW1fc2l6ZXMgIT0gMSB8fCBkaWZmIDwgMCkKLQl7Ci0JICBhc193YXJuIChfKCJCYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mbyIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gYXJyYXksIG1ha2Ugc3VyZSB0aGUgc2FtZSBudW1iZXIgb2YgZGltZW5zaW9ucwotCSBhbmQgc2l6ZXMgd2VyZSBwYXNzZWQsIGNyZWF0aW5nIGV4dHJhIHNpemVzIGZvciBtdWx0aXBseQotCSBkaW1lbnNpb25lZCBhcnJheXMgaWYgbm90IHBhc3NlZC4gICovCi0gICAgICBjb2ZmX3R5cGUuZXh0cmFfc2l6ZXMgPSAwOwotICAgICAgaWYgKGRpZmYpCi0JewotCSAgaiA9IChzaXplb2YgKGNvZmZfdHlwZS5zaXplcykgLyBzaXplb2YgKGNvZmZfdHlwZS5zaXplc1swXSkpIC0gMTsKLQkgIHdoaWxlIChqID49IDApCi0JICAgIHsKLQkgICAgICBjb2ZmX3R5cGUuc2l6ZXNbal0gPSAoKChqIC0gZGlmZikgPj0gMCkKLQkJCQkgICAgPyBjb2ZmX3R5cGUuc2l6ZXNbaiAtIGRpZmZdCi0JCQkJICAgIDogMCk7Ci0JICAgICAgai0tOwotCSAgICB9Ci0KLQkgIGNvZmZfdHlwZS5udW1fc2l6ZXMgPSBpICsgMTsKLQkgIGZvciAoaS0tOyBpID49IDA7IGktLSkKLQkgICAgY29mZl90eXBlLnNpemVzW2ldID0gKGNvZmZfdHlwZS5kaW1lbnNpb25zW2kgKyAxXSA9PSAwCi0JCQkJICA/IDAKLQkJCQkgIDogKGNvZmZfdHlwZS5zaXplc1tpICsgMV0KLQkJCQkgICAgIC8gY29mZl90eXBlLmRpbWVuc2lvbnNbaSArIDFdKSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoY29mZl9zeW1ib2xfdHlwID09IHN0X01lbWJlcgotCSAgICYmIGNvZmZfdHlwZS5udW1fc2l6ZXMgLSBjb2ZmX3R5cGUuZXh0cmFfc2l6ZXMgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBJcyB0aGlzIGEgYml0ZmllbGQ/ICBUaGlzIGlzIGluZGljYXRlZCBieSBhIHN0cnVjdHVyZSBtZW1lYmVyCi0JIGhhdmluZyBhIHNpemUgZmllbGQgdGhhdCBpc24ndCBhbiBhcnJheS4gICovCi0gICAgICBjb2ZmX3R5cGUuYml0ZmllbGQgPSAxOwotICAgIH0KLQotICAvKiBFeGNlcHQgZm9yIGVudW1lcmF0aW9uIG1lbWJlcnMgJiBiZWdpbi9lbmRpbmcgb2Ygc2NvcGVzLCBwdXQgdGhlCi0gICAgIHR5cGUgd29yZCBpbiB0aGUgYXV4LiBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoY29mZl9zeW1ib2xfdHlwID09IHN0X0Jsb2NrIHx8IGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9FbmQpCi0gICAgaW5keCA9IDA7Ci0gIGVsc2UgaWYgKGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uKQotICAgIGluZHggPSBjdXJfZmlsZV9wdHItPnZvaWRfdHlwZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9PSBidF9TdHJ1Y3QKLQkgIHx8IGNvZmZfdHlwZS5iYXNpY190eXBlID09IGJ0X1VuaW9uCi0JICB8fCBjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9PSBidF9FbnVtKQotCXsKLQkgIGlmIChjb2ZmX3RhZyA9PSAoY2hhciAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiTm8gdGFnIHNwZWNpZmllZCBmb3IgJXMiKSwgbmFtZSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGNvZmZfdHlwZS50YWdfcHRyID0gZ2V0X3RhZyAoY29mZl90YWcsIChsb2NhbHN5bV90ICopIE5VTEwsCi0JCQkJICAgICAgIGNvZmZfdHlwZS5iYXNpY190eXBlKTsKLQl9Ci0KLSAgICAgIGlmIChjb2ZmX2lzX2Z1bmN0aW9uKQotCXsKLQkgIGxhc3RfZnVuY190eXBlX2luZm8gPSBjb2ZmX3R5cGU7Ci0JICBsYXN0X2Z1bmNfc3ltX3ZhbHVlID0gY29mZl9zeW1fdmFsdWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpbmR4ID0gYWRkX2F1eF9zeW1fdGlyICgmY29mZl90eXBlLAotCQkJICAgICAgaGFzaF95ZXMsCi0JCQkgICAgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKLSAgICB9Ci0KLSAgLyogRG8gYW55IGxhc3QgbWludXRlIGFkanVzdG1lbnRzIHRoYXQgYXJlIG5lY2Vzc2FyeS4gICovCi0gIHN3aXRjaCAoY29mZl9zeW1ib2xfdHlwKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEZvciB0aGUgYmVnaW5uaW5nIG9mIHN0cnVjdHMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucywgdGhlCi0JIHNpemUgaW5mbyBuZWVkcyB0byBiZSBwYXNzZWQgaW4gdGhlIHZhbHVlIGZpZWxkLiAgKi8KLSAgICBjYXNlIHN0X0Jsb2NrOgotICAgICAgaWYgKGNvZmZfdHlwZS5udW1fc2l6ZXMgLSBjb2ZmX3R5cGUubnVtX2RpbXMgLSBjb2ZmX3R5cGUuZXh0cmFfc2l6ZXMKLQkgICE9IDEpCi0JewotCSAgYXNfd2FybiAoXygiQmFkIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQljb2ZmX3ZhbHVlID0gY29mZl90eXBlLnNpemVzWzBdOwotCi0gICAgICBjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbiA9IChjb2ZmX3R5cGUub3JpZ190eXBlID09IFRfRU5VTSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogRm9yIHRoZSBlbmQgb2Ygc3RydWN0cywgdW5pb25zLCBhbmQgZW51bWVyYXRpb25zLCBvbWl0IHRoZQotCSBuYW1lIHdoaWNoIGlzIGFsd2F5cyAiLmVvcyIuICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgbGFzdCwgc28KLQkgdGhhdCBhbnkgZXJyb3IgcmVwb3J0aW5nIGFib3ZlIGdpdmVzIHRoZSBjb3JyZWN0IG5hbWUuICAqLwotICAgIGNhc2Ugc3RfRW5kOgotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgICBuYW1lID0gKGNoYXIgKikgTlVMTDsKLSAgICAgIGNvZmZfdmFsdWUgPSAwOwotICAgICAgY29mZl9pbnNpZGVfZW51bWVyYXRpb24gPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE1lbWJlcnMgb2Ygc3RydWN0dXJlcyBhbmQgdW5pb25zIHRoYXQgYXJlbid0IGJpdGZpZWxkcywgbmVlZAotCSB0byBhZGp1c3QgdGhlIHZhbHVlIGZyb20gYSBieXRlIG9mZnNldCB0byBhIGJpdCBvZmZzZXQuCi0JIE1lbWJlcnMgb2YgZW51bWVyYXRpb25zIGRvIG5vdCBoYXZlIHRoZSB2YWx1ZSBhZGp1c3RlZCwgYW5kCi0JIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGJ5IGluZHggPT0gaW5kZXhOaWwuICBGb3IgZW51bWVyYXRpb25zLAotCSB1cGRhdGUgdGhlIG1heGltdW0gZW51bWVyYXRpb24gdmFsdWUuICAqLwotICAgIGNhc2Ugc3RfTWVtYmVyOgotICAgICAgaWYgKCEgY29mZl90eXBlLmJpdGZpZWxkICYmICEgY29mZl9pbnNpZGVfZW51bWVyYXRpb24pCi0JY29mZl92YWx1ZSAqPSA4OwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSBzeW1ib2wuICAqLwotICBzeW0gPSBhZGRfZWNvZmZfc3ltYm9sIChuYW1lLAotCQkJICBjb2ZmX3N5bWJvbF90eXAsCi0JCQkgIGNvZmZfc3RvcmFnZV9jbGFzcywKLQkJCSAgY29mZl9zeW1fdmFsdWUsCi0JCQkgIGNvZmZfc3ltX2FkZGVuZCwKLQkJCSAgKHN5bWludF90KSBjb2ZmX3ZhbHVlLAotCQkJICBpbmR4KTsKLQotICAvKiBkZWFsIHdpdGggc3RydWN0LCB1bmlvbiwgYW5kIGVudW0gdGFncy4gICovCi0gIGlmIChjb2ZmX3N5bWJvbF90eXAgPT0gc3RfQmxvY2spCi0gICAgewotICAgICAgLyogQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgdGFnIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHRhZ190ICp0YWdfcHRyID0gZ2V0X3RhZyAobmFtZSwKLQkJCQlzeW0sCi0JCQkJY29mZl90eXBlLmJhc2ljX3R5cGUpOwotICAgICAgZm9yd2FyZF90ICoqcGY7Ci0KLSAgICAgIC8qIFJlbWVtYmVyIGFueSBmb3J3YXJkIHJlZmVyZW5jZXMuICAqLwotICAgICAgZm9yIChwZiA9ICZzeW0tPmZvcndhcmRfcmVmOwotCSAgICpwZiAhPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0JICAgcGYgPSAmKCpwZiktPm5leHQpCi0JOwotICAgICAgKnBmID0gdGFnX3B0ci0+Zm9yd2FyZF9yZWY7Ci0gICAgICB0YWdfcHRyLT5mb3J3YXJkX3JlZiA9IChmb3J3YXJkX3QgKikgTlVMTDsKLSAgICB9Ci19Ci0MCi0vKiBQYXJzZSAuZW5kIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIHJlZ2lzdGVyIGludCBjaDsKLSAgc3ltYm9sUyAqZW50OwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgY2ggPSAqbmFtZTsKLSAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoY2gpKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSAuZW5kIGRpcmVjdGl2ZSBhbmQgdGhlCi0gICAgIGNvcnJlc3BvbmRpbmcgc3ltYm9sLiAgV2UgY3JlYXRlIGEgZmFrZSBzeW1ib2wgdG8gaG9sZCB0aGUKLSAgICAgY3VycmVudCBsb2NhdGlvbiwgYW5kIHB1dCBpbiB0aGUgb2Zmc2V0IHdoZW4gd2Ugd3JpdGUgb3V0IHRoZQotICAgICBzeW1ib2wuICAqLwotICBlbnQgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gIGlmIChlbnQgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSBuYW1lcyB1bmtub3duIHN5bWJvbCIpKTsKLSAgZWxzZQotICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9FbmQsIHNjX1RleHQsCi0JCQkgICAgIHN5bWJvbF9uZXcgKCJMMFwwMDEiLCBub3dfc2VnLAotCQkJCQkgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgZnJhZ19ub3cpLAotCQkJICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOwotCi0gIGN1cl9wcm9jX3B0ciA9IChwcm9jX3QgKikgTlVMTDsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuZW50IGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIHJlZ2lzdGVyIGludCBjaDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhZGRfZmlsZSAoKGNvbnN0IGNoYXIgKikgTlVMTCwgMCwgMSk7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygic2Vjb25kIC5lbnQgZGlyZWN0aXZlIGZvdW5kIGJlZm9yZSAuZW5kIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgY2ggPSAqbmFtZTsKLSAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoY2gpKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYWRkX3Byb2NlZHVyZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIC8qIFRoZSAuZW50IGRpcmVjdGl2ZSBpcyBzb21ldGltZXMgZm9sbG93ZWQgYnkgYSBudW1iZXIuICBJJ20gbm90Ci0gICAgIHJlYWxseSBzdXJlIHdoYXQgdGhlIG51bWJlciBtZWFucy4gIEkgZG9uJ3Qgc2VlIGFueSB3YXkgdG8gc3RvcmUKLSAgICAgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBQRFIuICBUaGUgSXJpeCA0IGFzc2VtYmxlciBzZWVtcyB0byBpZ25vcmUKLSAgICAgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLSAgICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5leHRlcm4gZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbHA7Ci0gIHZhbHVlVCBzaXplOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9scCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9scCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICBzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgc3ltYm9sX2dldF9vYmogKHN5bWJvbHApLT5lY29mZl9leHRlcm5fc2l6ZSA9IHNpemU7Ci19Ci0MCi0vKiBQYXJzZSAuZmlsZSBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2ZpbGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGluZHg7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBsZW47Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTm8gd2F5IHRvIGhhbmRsZSAuZmlsZSB3aXRoaW4gLmVudC8uZW5kIHNlY3Rpb24iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbmR4ID0gKGludCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgLyogRklYTUU6IHdlIGRvbid0IGhhdmUgdG8gc2F2ZSB0aGUgbmFtZSBoZXJlLiAgKi8KLSAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICBhZGRfZmlsZSAobmFtZSwgaW5keCAtIDEsIDApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuZm1hc2sgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mbWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmZyZWdtYXNrID0gdmFsOwotICBjdXJfcHJvY19wdHItPnBkci5mcmVnb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5mcmFtZSBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2ZyYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5mcmFtZSBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5mcmFtZXJlZyA9IHRjX2dldF9yZWdpc3RlciAoMSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJwotICAgICAgfHwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZyYW1lIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZnJhbWVvZmZzZXQgPSB2YWw7Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIucGNyZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOwotCi0jaWYgMCAvKiBBbHBoYS1PU0YxIGFkZHMgInRoZSBvZmZzZXQgb2Ygc2F2ZWQgJGEwIGZyb20gJHNwIiwgYWNjb3JkaW5nCi0JIHRvIFNhbmRyby4gIEkgZG9uJ3QgeWV0IGtub3cgd2hlcmUgdGhpcyB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkLCBpZgotCSBhbnl3aGVyZS4gICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0jZWxzZQotICBzX2lnbm9yZSAoNDIpOwotI2VuZGlmCi19Ci0MCi0vKiBQYXJzZSAubWFzayBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX21hc2sgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIucmVnbWFzayA9IHZhbDsKLSAgY3VyX3Byb2NfcHRyLT5wZHIucmVnb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5sb2MgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9sb2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbGluZW5vX2xpc3RfdCAqbGlzdDsKLSAgc3ltaW50X3QgbGluZW5vOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2MgYmVmb3JlIC5maWxlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2Mgb3V0c2lkZSBvZiAudGV4dCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGxpbmVubyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ19zb3VyY2VfbGluZSAobGluZW5vKTsKLSNlbmRpZgotCi0gIC8qIElmIHdlJ3JlIGJ1aWxkaW5nIHN0YWJzLCB0aGVuIG91dHB1dCBhIHNwZWNpYWwgbGFiZWwgcmF0aGVyIHRoYW4KLSAgICAgRUNPRkYgbGluZSBudW1iZXIgaW5mby4gICovCi0gIGlmIChzdGFic19zZWVuKQotICAgIHsKLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY2hhciAqKSBOVUxMLCBzdF9MYWJlbCwgc2NfVGV4dCwKLQkJCSAgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkJICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgICBmcmFnX25vdyksCi0JCQkgICAgICAgKGJmZF92bWEpIDAsIDAsIGxpbmVubyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxpc3QgPSBhbGxvY2F0ZV9saW5lbm9fbGlzdCAoKTsKLQotICBsaXN0LT5uZXh0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgbGlzdC0+ZmlsZSA9IGN1cl9maWxlX3B0cjsKLSAgbGlzdC0+cHJvYyA9IGN1cl9wcm9jX3B0cjsKLSAgbGlzdC0+ZnJhZyA9IGZyYWdfbm93OwotICBsaXN0LT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgbGlzdC0+bGluZW5vID0gbGluZW5vOwotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcnMuICAqLwotICBjdXJfZmlsZV9wdHItPmZkci5mTWVyZ2UgPSAwOwotCi0gIC8qIEEgLmxvYyBkaXJlY3RpdmUgd2lsbCBzb21ldGltZXMgYXBwZWFyIGJlZm9yZSBhIC5lbnQgZGlyZWN0aXZlLAotICAgICB3aGljaCBtZWFucyB0aGF0IGN1cl9wcm9jX3B0ciB3aWxsIGJlIE5VTEwgaGVyZS4gIEFycmFuZ2UgdG8KLSAgICAgcGF0Y2ggdGhpcyB1cC4gICovCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVub19saXN0X3QgKipwbDsKLQotICAgICAgcGwgPSAmbm9wcm9jX2xpbmVubzsKLSAgICAgIHdoaWxlICgqcGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLQlwbCA9ICYoKnBsKS0+bmV4dDsKLSAgICAgICpwbCA9IGxpc3Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGFzdF9saW5lbm8gPSBsaXN0OwotICAgICAgKmxhc3RfbGluZW5vX3B0ciA9IGxpc3Q7Ci0gICAgICBsYXN0X2xpbmVub19wdHIgPSAmbGlzdC0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIFRoZSBNSVBTIGFzc2VtYmxlciBzb21ldGltZXMgaW5zZXJ0cyBub3AgaW5zdHJ1Y3Rpb25zIGluIHRoZQotICAgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgV2hlbiB0aGlzIGhhcHBlbnMsIHdlIG11c3QgcGF0Y2ggdXAgdGhlIC5sb2MKLSAgIGluZm9ybWF0aW9uIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgbm9wLiAgKi8KLQotdm9pZAotZWNvZmZfZml4X2xvYyAob2xkX2ZyYWcsIG9sZF9mcmFnX29mZnNldCkKLSAgICAgZnJhZ1MgKm9sZF9mcmFnOwotICAgICB1bnNpZ25lZCBsb25nIG9sZF9mcmFnX29mZnNldDsKLXsKLSAgaWYgKGxhc3RfbGluZW5vICE9IE5VTEwKLSAgICAgICYmIGxhc3RfbGluZW5vLT5mcmFnID09IG9sZF9mcmFnCi0gICAgICAmJiBsYXN0X2xpbmVuby0+cGFkZHIgPT0gb2xkX2ZyYWdfb2Zmc2V0KQotICAgIHsKLSAgICAgIGxhc3RfbGluZW5vLT5mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBsYXN0X2xpbmVuby0+cGFkZHIgPSBmcmFnX25vd19maXggKCk7Ci0gICAgfQotfQotDAotLyogTWFrZSBzdXJlIHRoZSBAc3RhYnMgc3ltYm9sIGlzIGVtaXR0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbWFya19zdGFicyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoISBzdGFic19zZWVuKQotICAgIHsKLSAgICAgIC8qIEFkZCBhIGR1bW15IEBzdGFicyBkeW1ib2wuICovCi0gICAgICBzdGFic19zZWVuID0gMTsKLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChzdGFic19zeW1ib2wsIHN0TmlsLCBzY0luZm8sCi0JCQkgICAgICAgKHN5bWJvbFMgKikgTlVMTCwKLQkJCSAgICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAtMSwKLQkJCSAgICAgICBFQ09GRl9NQVJLX1NUQUIgKDApKTsKLSAgICB9Ci19Ci0MCi0vKiBQYXJzZSAud2Vha2V4dCBkaXJlY3RpdmVzLiAgKi8KLSNpZm5kZWYgVENfTUlQUwotLyogRm9yIFRDX01JUFMgdXNlIHRoZSB2ZXJzaW9uIGluIHRjLW1pcHMuYy4gKi8KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JewotCSAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCQkgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICBleHByZXNzaW9uICgmZXhwKTsKLQkgIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYmFkIC53ZWFrZXh0IGRpcmVjdGl2ZSIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsICZleHApOwotCX0KLSAgICB9Ci0KLSAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLSNlbmRpZiAvKiBub3QgVENfTUlQUyAqLwotDAotLyogSGFuZGxlIC5zdGFicyBkaXJlY3RpdmVzLiAgVGhlIGFjdHVhbCBwYXJzaW5nIHJvdXRpbmUgaXMgZG9uZSBieSBhCi0gICBnZW5lcmljIHJvdXRpbmUuICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHZpYSBPQkpfUFJPQ0VTU19TVEFCLgotICAgV2hlbiB0aGlzIGlzIGNhbGxlZCwgaW5wdXRfbGluZV9wb2ludGVyIHdpbGwgYmUgcG9pbnRpbmcgYXQgdGhlCi0gICB2YWx1ZSBmaWVsZCBvZiB0aGUgc3RhYi4KLQotICAgLnN0YWJzIGRpcmVjdGl2ZXMgaGF2ZSBmaXZlIGZpZWxkczoKLQkic3RyaW5nIglhIHN0cmluZywgZW5jb2RpbmcgdGhlIHR5cGUgaW5mb3JtYXRpb24uCi0JY29kZQkJYSBudW1lcmljIGNvZGUsIGRlZmluZWQgaW4gPHN0YWIuaD4KLQkwCQlhIHplcm8KLQlkZXNjCQlhIHplcm8gb3IgbGluZSBudW1iZXIKLQl2YWx1ZQkJYSBudW1lcmljIHZhbHVlIG9yIGFuIGFkZHJlc3MuCi0KLSAgICBJZiB0aGUgdmFsdWUgaXMgcmVsb2NhdGFibGUsIHdlIHRyYW5zZm9ybSB0aGlzIGludG86Ci0JaXNzCQlwb2ludHMgYXMgYW4gaW5kZXggaW50byBzdHJpbmcgc3BhY2UKLQl2YWx1ZQkJdmFsdWUgZnJvbSBsb29rdXAgb2YgdGhlIG5hbWUKLQlzdAkJc3QgZnJvbSBsb29rdXAgb2YgdGhlIG5hbWUKLQlzYwkJc2MgZnJvbSBsb29rdXAgb2YgdGhlIG5hbWUKLQlpbmRleAkJY29kZXxDT0RFX01BU0sKLQotICAgIElmIHRoZSB2YWx1ZSBpcyBub3QgcmVsb2NhdGFibGUsIHdlIHRyYW5zZm9ybSB0aGlzIGludG86Ci0JaXNzCQlwb2ludHMgYXMgYW4gaW5kZXggaW50byBzdHJpbmcgc3BhY2UKLQl2YWx1ZQkJdmFsdWUKLQlzdAkJc3RfTmlsCi0Jc2MJCXNjX05pbAotCWluZGV4CQljb2RlfENPREVfTUFTSwotCi0gICAgLnN0YWJuIGRpcmVjdGl2ZXMgaGF2ZSBmb3VyIGZpZWxkcyAoc3RyaW5nIGlzIG51bGwpOgotCWNvZGUJCWEgbnVtZXJpYyBjb2RlLCBkZWZpbmVkIGluIDxzdGFiLmg+Ci0JMAkJYSB6ZXJvCi0JZGVzYwkJYSB6ZXJvIG9yIGEgbGluZSBudW1iZXIKLQl2YWx1ZQkJYSBudW1lcmljIHZhbHVlIG9yIGFuIGFkZHJlc3MuICAqLwotCi12b2lkCi1lY29mZl9zdGFiIChzZWMsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpCi0gICAgIHNlZ1Qgc2VjOwotICAgICBpbnQgd2hhdDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IG90aGVyOwotICAgICBpbnQgZGVzYzsKLXsKLSAgZWZkcl90ICpzYXZlX2ZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICBzeW1ib2xTICpzeW07Ci0gIHN5bWludF90IHZhbHVlOwotICBiZmRfdm1hIGFkZGVuZDsKLSAgc3RfdCBzdDsKLSAgc2NfdCBzYzsKLSAgc3ltaW50X3QgaW5keDsKLSAgbG9jYWxzeW1fdCAqaG9sZCA9IE5VTEw7Ci0KLSAgZWNvZmZfZGVidWdnaW5nX3NlZW4gPSAxOwotCi0gIC8qIFdlIGRvbid0IGhhbmRsZSAuc3RhYmQuICAqLwotICBpZiAod2hhdCAhPSAncycgJiYgd2hhdCAhPSAnbicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuc3RhYiVjIGlzIG5vdCBzdXBwb3J0ZWQiKSwgd2hhdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEEgLnN0YWJuIHVzZXMgYSBudWxsIG5hbWUsIG5vdCBhbiBlbXB0eSBzdHJpbmcuICAqLwotICBpZiAod2hhdCA9PSAnbicpCi0gICAgc3RyaW5nID0gTlVMTDsKLQotICAvKiBXZSBpZ25vcmUgdGhlIG90aGVyIGZpZWxkLiAgKi8KLSAgaWYgKG90aGVyICE9IDApCi0gICAgYXNfd2FybiAoXygiLnN0YWIlYzogaWdub3Jpbmcgbm9uLXplcm8gb3RoZXIgZmllbGQiKSwgd2hhdCk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBjdXJyZW50IGZpbGUuICAqLwotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhZGRfZmlsZSAoKGNvbnN0IGNoYXIgKikgTlVMTCwgMCwgMSk7Ci0gICAgICBzYXZlX2ZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICAgIH0KLQotICAvKiBGb3Igc3RhYnMgaW4gRUNPRkYsIHRoZSBmaXJzdCBzeW1ib2wgbXVzdCBiZSBAc3RhYnMuICBUaGlzIGlzIGEKLSAgICAgc2lnbmFsIHRvIGdkYi4gICovCi0gIGlmIChzdGFic19zZWVuID09IDApCi0gICAgbWFya19zdGFicyAoMCk7Ci0KLSAgLyogTGluZSBudW1iZXIgc3RhYnMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHNpbmNlIHRoZXkgaGF2ZSB0d28KLSAgICAgdmFsdWVzLCB0aGUgbGluZSBudW1iZXIgYW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBsYWJlbC4gIFdlIHVzZSB0aGUKLSAgICAgaW5kZXggZmllbGQgKGFrYSBkZXNjKSB0byBob2xkIHRoZSBsaW5lIG51bWJlciwgYW5kIHRoZSB2YWx1ZQotICAgICBmaWVsZCB0byBob2xkIHRoZSBhZGRyZXNzLiAgVGhlIHN5bWJvbCB0eXBlIGlzIHN0X0xhYmVsLCB3aGljaAotICAgICBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIHN0YWJzLCBzbyB0aGF0IGdkYiBjYW4KLSAgICAgcmVjb2duaXplIGl0LiAgKi8KLSAgaWYgKHR5cGUgPT0gTl9TTElORSkKLSAgICB7Ci0gICAgICBTWU1SIGR1bW15X3N5bXI7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgY2hhciBuYW1lX2VuZDsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gICAgICBpZiAobGlzdGluZykKLQlsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBkZXNjKTsKLSNlbmRpZgotCi0gICAgICBkdW1teV9zeW1yLmluZGV4ID0gZGVzYzsKLSAgICAgIGlmIChkdW1teV9zeW1yLmluZGV4ICE9IGRlc2MpCi0JewotCSAgYXNfd2FybiAoXygiTGluZSBudW1iZXIgKCVkKSBmb3IgLnN0YWIlYyBkaXJlY3RpdmUgY2Fubm90IGZpdCBpbiBpbmRleCBmaWVsZCAoMjAgYml0cykiKSwKLQkJICAgZGVzYywgd2hhdCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICBzdCA9IHN0X0xhYmVsOwotICAgICAgc2MgPSBzY19UZXh0OwotICAgICAgaW5keCA9IGRlc2M7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmbmRlZiBOT19MSVNUSU5HCi0gICAgICBpZiAobGlzdGluZyAmJiAodHlwZSA9PSBOX1NPIHx8IHR5cGUgPT0gTl9TT0wpKQotCWxpc3Rpbmdfc291cmNlX2ZpbGUgKHN0cmluZyk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKQotCSAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScKLQkgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJysnKQotCXsKLQkgIHN0ID0gc3RfTmlsOwotCSAgc2MgPSBzY19OaWw7Ci0JICBzeW0gPSAoc3ltYm9sUyAqKSBOVUxMOwotCSAgdmFsdWUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgYXNfd2FybiAoXygiSWxsZWdhbCAuc3RhYiVjIGRpcmVjdGl2ZSwgYmFkIGNoYXJhY3RlciIpLCB3aGF0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcmVzc2lvblMgZXhwOwotCi0JICBzYyA9IHNjX05pbDsKLQkgIHN0ID0gc3RfTmlsOwotCi0JICBleHByZXNzaW9uICgmZXhwKTsKLQkgIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgc3ltID0gTlVMTDsKLQkgICAgICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wpCi0JICAgIHsKLQkgICAgICBzeW0gPSBleHAuWF9hZGRfc3ltYm9sOwotCSAgICAgIHZhbHVlID0gMDsKLQkgICAgICBhZGRlbmQgPSBleHAuWF9hZGRfbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmZXhwKTsKLQkgICAgICB2YWx1ZSA9IDA7Ci0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaW5keCA9IEVDT0ZGX01BUktfU1RBQiAodHlwZSk7Ci0gICAgfQotCi0gIC8qIERvbid0IHN0b3JlIHRoZSBzdGFicyBzeW1ib2wgd2UgYXJlIGNyZWF0aW5nIGFzIHRoZSB0eXBlIG9mIHRoZQotICAgICBFQ09GRiBzeW1ib2wuICBXZSB3YW50IHRvIGNvbXB1dGUgdGhlIHR5cGUgb2YgdGhlIEVDT0ZGIHN5bWJvbAotICAgICBpbmRlcGVuZGVudGx5LiAgKi8KLSAgaWYgKHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIGhvbGQgPSBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sOwotCi0gICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChzdHJpbmcsIHN0LCBzYywgc3ltLCBhZGRlbmQsIHZhbHVlLCBpbmR4KTsKLQotICBpZiAoc3ltICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbCA9IGhvbGQ7Ci0KLSAgLyogUmVzdG9yZSBub3JtYWwgZmlsZSB0eXBlLiAgKi8KLSAgY3VyX2ZpbGVfcHRyID0gc2F2ZV9maWxlX3B0cjsKLX0KLQwKLS8qIEZyb2IgYW4gRUNPRkYgc3ltYm9sLiAgU21hbGwgY29tbW9uIHN5bWJvbHMgZ28gaW50byBhIHNwZWNpYWwKLSAgIC5zY29tbW9uIHNlY3Rpb24gcmF0aGVyIHRoYW4gYmZkX2NvbV9zZWN0aW9uLiAgKi8KLQotdm9pZAotZWNvZmZfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAoU19JU19DT01NT04gKHN5bSkKLSAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pID4gMAotICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPD0gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKQotICAgIHsKLSAgICAgIHN0YXRpYyBhc2VjdGlvbiBzY29tX3NlY3Rpb247Ci0gICAgICBzdGF0aWMgYXN5bWJvbCBzY29tX3N5bWJvbDsKLQotICAgICAgLyogV2UgbXVzdCBjb25zdHJ1Y3QgYSBmYWtlIHNlY3Rpb24gc2ltaWxhciB0byBiZmRfY29tX3NlY3Rpb24KLQkgYnV0IHdpdGggdGhlIG5hbWUgLnNjb21tb24uICAqLwotICAgICAgaWYgKHNjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgc2NvbV9zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uOwotCSAgc2NvbV9zZWN0aW9uLm5hbWUgPSAiLnNjb21tb24iOwotCSAgc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJnNjb21fc2VjdGlvbjsKLQkgIHNjb21fc2VjdGlvbi5zeW1ib2wgPSAmc2NvbV9zeW1ib2w7Ci0JICBzY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmc2NvbV9zZWN0aW9uLnN5bWJvbDsKLQkgIHNjb21fc3ltYm9sID0gKmJmZF9jb21fc2VjdGlvbi5zeW1ib2w7Ci0JICBzY29tX3N5bWJvbC5uYW1lID0gIi5zY29tbW9uIjsKLQkgIHNjb21fc3ltYm9sLnNlY3Rpb24gPSAmc2NvbV9zZWN0aW9uOwotCX0KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgJnNjb21fc2VjdGlvbik7Ci0gICAgfQotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoU19JU19XRUFLIChzeW0pKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0NPTU1PTiAoc3ltKSkKLQlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKLQkJU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgfQotfQotDAotLyogQWRkIGJ5dGVzIHRvIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBidWZmZXIuICAqLwotCi1zdGF0aWMgY2hhciAqCi1lY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBidWZwdHIsIG5lZWQpCi0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIGNoYXIgKmJ1ZnB0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBuZWVkOwotewotICB1bnNpZ25lZCBsb25nIGF0OwotICB1bnNpZ25lZCBsb25nIHdhbnQ7Ci0KLSAgYXQgPSBidWZwdHIgLSAqYnVmOwotICBuZWVkIC09ICpidWZlbmQgLSBidWZwdHI7Ci0gIGlmIChuZWVkIDwgUEFHRV9TSVpFKQotICAgIG5lZWQgPSBQQUdFX1NJWkU7Ci0gIHdhbnQgPSAoKmJ1ZmVuZCAtICpidWYpICsgbmVlZDsKLSAgKmJ1ZiA9IHhyZWFsbG9jICgqYnVmLCB3YW50KTsKLSAgKmJ1ZmVuZCA9ICpidWYgKyB3YW50OwotICByZXR1cm4gKmJ1ZiArIGF0OwotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGJ1ZmZlciB0byB0aGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gICBmb3IgdGhlIEVDT0ZGIHRhcmdldCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfcGFkZGluZ19hZGp1c3QgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQsIGJ1ZnB0cnB0cikKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICBjaGFyICoqYnVmcHRycHRyOwotewotICBiZmRfc2l6ZV90eXBlIGFsaWduOwotCi0gIGFsaWduID0gYmFja2VuZC0+ZGVidWdfYWxpZ247Ci0gIGlmICgob2Zmc2V0ICYgKGFsaWduIC0gMSkpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0KLSAgICAgIGFkZCA9IGFsaWduIC0gKG9mZnNldCAmIChhbGlnbiAtIDEpKTsKLSAgICAgIGlmICgqYnVmZW5kIC0gKCpidWYgKyBvZmZzZXQpIDwgYWRkKQotCSh2b2lkKSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCAqYnVmICsgb2Zmc2V0LCBhZGQpOwotICAgICAgbWVtc2V0ICgqYnVmICsgb2Zmc2V0LCAwLCBhZGQpOwotICAgICAgb2Zmc2V0ICs9IGFkZDsKLSAgICAgIGlmIChidWZwdHJwdHIgIT0gKGNoYXIgKiopIE5VTEwpCi0JKmJ1ZnB0cnB0ciA9ICpidWYgKyBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQ7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9saW5lbm8gKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQsIGxpbmVjbnRwdHIpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgbG9uZyAqbGluZWNudHB0cjsKLXsKLSAgY2hhciAqYnVmcHRyOwotICByZWdpc3RlciBsaW5lbm9fbGlzdF90ICpsOwotICBsaW5lbm9fbGlzdF90ICpsYXN0OwotICBlZmRyX3QgKmZpbGU7Ci0gIHByb2NfdCAqcHJvYzsKLSAgdW5zaWduZWQgbG9uZyBjOwotICBsb25nIGlsaW5lOwotICBsb25nIHRvdGNvdW50OwotICBsaW5lbm9fbGlzdF90IGZpcnN0OwotICBsaW5lbm9fbGlzdF90ICpsb2NhbF9maXJzdF9saW5lbm8gPSBmaXJzdF9saW5lbm87Ci0KLSAgaWYgKGxpbmVjbnRwdHIgIT0gKGxvbmcgKikgTlVMTCkKLSAgICAqbGluZWNudHB0ciA9IDA7Ci0KLSAgYnVmcHRyID0gKmJ1ZiArIG9mZnNldDsKLQotICBmaWxlID0gKGVmZHJfdCAqKSBOVUxMOwotICBwcm9jID0gKHByb2NfdCAqKSBOVUxMOwotICBsYXN0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgYyA9IG9mZnNldDsKLSAgaWxpbmUgPSAwOwotICB0b3Rjb3VudCA9IDA7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwcm9jZWR1cmUgaXMgaWdub3JlZAotICAgICB3aGVuIHJlYWRpbmcgbGluZSBudW1iZXJzLiAgVGhpcyBkb2Vzbid0IG1hdHRlciBpZiB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgZmlyc3QgcHJvY2VkdXJlIGlzIDAsIGJ1dCB3aGVuIGdjYyBpcyBnZW5lcmF0aW5nIE1JUFMKLSAgICAgZW1iZWRkZWQgUElDIGNvZGUsIGl0IHdpbGwgcHV0IHN0cmluZ3MgaW4gdGhlIC50ZXh0IHNlY3Rpb24KLSAgICAgYmVmb3JlIHRoZSBmaXJzdCBwcm9jZWR1cmUuICBXZSBjb3BlIGJ5IGluc2VydGluZyBhIGR1bW15IGxpbmUgaWYKLSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByb2NlZHVyZSBpcyBub3QgMC4gIEhvcGVmdWxseSB0aGlzCi0gICAgIHdvbid0IHNjcmV3IHRoaW5ncyB1cCB0b28gYmFkbHkuICAKLQotICAgICBEb24ndCBkbyB0aGlzIGZvciBFQ09GRiBhc3NlbWJseSBzb3VyY2UgbGluZSBudW1iZXJzLiAgVGhleSB3b3JrCi0gICAgIHdpdGhvdXQgdGhpcyBleHRyYSBhdHRlbnRpb24uICAqLwotICBpZiAoZGVidWdfdHlwZSAhPSBERUJVR19FQ09GRgotICAgICAgJiYgZmlyc3RfcHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMCi0gICAgICAmJiBsb2NhbF9maXJzdF9saW5lbm8gIT0gKGxpbmVub19saXN0X3QgKikgTlVMTAotICAgICAgJiYgKChTX0dFVF9WQUxVRSAoZmlyc3RfcHJvY19wdHItPnN5bS0+YXNfc3ltKQotCSAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LAotCQkJCSAgU19HRVRfU0VHTUVOVCAoZmlyc3RfcHJvY19wdHItPnN5bS0+YXNfc3ltKSkpCi0JICAhPSAwKSkKLSAgICB7Ci0gICAgICBmaXJzdC5maWxlID0gbG9jYWxfZmlyc3RfbGluZW5vLT5maWxlOwotICAgICAgZmlyc3QucHJvYyA9IGxvY2FsX2ZpcnN0X2xpbmVuby0+cHJvYzsKLSAgICAgIGZpcnN0LmZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgICBmaXJzdC5wYWRkciA9IDA7Ci0gICAgICBmaXJzdC5saW5lbm8gPSAwOwotCi0gICAgICBmaXJzdC5uZXh0ID0gbG9jYWxfZmlyc3RfbGluZW5vOwotICAgICAgbG9jYWxfZmlyc3RfbGluZW5vID0gJmZpcnN0OwotICAgIH0KLQotICBmb3IgKGwgPSBsb2NhbF9maXJzdF9saW5lbm87IGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgbG9uZyBjb3VudDsKLSAgICAgIGxvbmcgZGVsdGE7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IHRvIHRoZSBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgbmV4dCBsaW5lIG51bWJlcgotCSAoaW4gd29yZHMpLiAgRG8gdGhpcyBmaXJzdCwgc28gdGhhdCB3ZSBjYW4gc2tpcCBhaGVhZCB0byB0aGUKLQkgbmV4dCB1c2VmdWwgbGluZSBudW1iZXIgZW50cnkuICAqLwotICAgICAgaWYgKGwtPm5leHQgPT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLQl7Ci0JICAvKiBXZSB3YW50IGEgY291bnQgb2YgemVybywgYnV0IGl0IHdpbGwgYmUgZGVjcmVtZW50ZWQKLQkgICAgIGJlZm9yZSBpdCBpcyB1c2VkLiAgKi8KLQkgIGNvdW50ID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChsLT5uZXh0LT5mcmFnLT5mcl9hZGRyZXNzICsgbC0+bmV4dC0+cGFkZHIKLQkgICAgICAgPiBsLT5mcmFnLT5mcl9hZGRyZXNzICsgbC0+cGFkZHIpCi0JewotCSAgY291bnQgPSAoKGwtPm5leHQtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5uZXh0LT5wYWRkcgotCQkgICAgLSAobC0+ZnJhZy0+ZnJfYWRkcmVzcyArIGwtPnBhZGRyKSkKLQkJICAgPj4gMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvbid0IGNoYW5nZSBsYXN0LCBzbyB3ZSBzdGlsbCBnZXQgdGhlIHJpZ2h0IGRlbHRhLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGwtPmZpbGUgIT0gZmlsZSB8fCBsLT5wcm9jICE9IHByb2MpCi0JewotCSAgaWYgKGwtPnByb2MgIT0gcHJvYyAmJiBwcm9jICE9IChwcm9jX3QgKikgTlVMTCkKLQkgICAgcHJvYy0+cGRyLmxuSGlnaCA9IGxhc3QtPmxpbmVubzsKLQkgIGlmIChsLT5maWxlICE9IGZpbGUgJiYgZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBmaWxlLT5mZHIuY2JMaW5lID0gYyAtIGZpbGUtPmZkci5jYkxpbmVPZmZzZXQ7Ci0JICAgICAgZmlsZS0+ZmRyLmNsaW5lID0gdG90Y291bnQgKyBjb3VudDsKLQkgICAgICBpZiAobGluZWNudHB0ciAhPSAobG9uZyAqKSBOVUxMKQotCQkqbGluZWNudHB0ciArPSB0b3Rjb3VudCArIGNvdW50OwotCSAgICAgIHRvdGNvdW50ID0gMDsKLQkgICAgfQotCi0JICBpZiAobC0+ZmlsZSAhPSBmaWxlKQotCSAgICB7Ci0JICAgICAgZWZkcl90ICpsYXN0X2ZpbGUgPSBmaWxlOwotCi0JICAgICAgZmlsZSA9IGwtPmZpbGU7Ci0JICAgICAgaWYgKGxhc3RfZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCi0JCWZpbGUtPmZkci5pbGluZUJhc2UKLQkJICA9IGxhc3RfZmlsZS0+ZmRyLmlsaW5lQmFzZSArIGxhc3RfZmlsZS0+ZmRyLmNsaW5lOwotCSAgICAgIGVsc2UKLQkJZmlsZS0+ZmRyLmlsaW5lQmFzZSA9IDA7Ci0JICAgICAgZmlsZS0+ZmRyLmNiTGluZU9mZnNldCA9IGM7Ci0JICAgIH0KLQkgIGlmIChsLT5wcm9jICE9IHByb2MpCi0JICAgIHsKLQkgICAgICBwcm9jID0gbC0+cHJvYzsKLQkgICAgICBpZiAocHJvYyAhPSAocHJvY190ICopIE5VTEwpCi0JCXsKLQkJICBwcm9jLT5wZHIubG5Mb3cgPSBsLT5saW5lbm87Ci0JCSAgcHJvYy0+cGRyLmNiTGluZU9mZnNldCA9IGMgLSBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0OwotCQkgIHByb2MtPnBkci5pbGluZSA9IHRvdGNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgbGFzdCA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7Ci0JfQotCi0gICAgICB0b3Rjb3VudCArPSBjb3VudDsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgdG8gdGhpcyBsaW5lIG51bWJlci4gICovCi0gICAgICBpZiAobGFzdCA9PSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotCWRlbHRhID0gMDsKLSAgICAgIGVsc2UKLQlkZWx0YSA9IGwtPmxpbmVubyAtIGxhc3QtPmxpbmVubzsKLQotICAgICAgLyogUHV0IGluIHRoZSBvZmZzZXQgdG8gdGhpcyBsaW5lIG51bWJlci4gICovCi0gICAgICB3aGlsZSAoZGVsdGEgIT0gMCkKLQl7Ci0JICBpbnQgc2V0Y291bnQ7Ci0KLQkgIC8qIDEgaXMgYWRkZWQgdG8gZWFjaCBjb3VudCByZWFkLiAgKi8KLQkgIC0tY291bnQ7Ci0JICAvKiBXZSBjYW4gb25seSBhZGp1c3QgdGhlIHdvcmQgY291bnQgYnkgdXAgdG8gMTUgd29yZHMgYXQgYQotCSAgICAgdGltZS4gICovCi0JICBpZiAoY291bnQgPD0gMHgwZikKLQkgICAgewotCSAgICAgIHNldGNvdW50ID0gY291bnQ7Ci0JICAgICAgY291bnQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZXRjb3VudCA9IDB4MGY7Ci0JICAgICAgY291bnQgLT0gMHgwZjsKLQkgICAgfQotCSAgaWYgKGRlbHRhID49IC03ICYmIGRlbHRhIDw9IDcpCi0JICAgIHsKLQkgICAgICBpZiAoYnVmcHRyID49ICpidWZlbmQpCi0JCWJ1ZnB0ciA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgKGxvbmcpIDEpOwotCSAgICAgICpidWZwdHIrKyA9IHNldGNvdW50ICsgKGRlbHRhIDw8IDQpOwotCSAgICAgIGRlbHRhID0gMDsKLQkgICAgICArK2M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBzZXQ7Ci0KLQkgICAgICBpZiAoKmJ1ZmVuZCAtIGJ1ZnB0ciA8IDMpCi0JCWJ1ZnB0ciA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgKGxvbmcpIDMpOwotCSAgICAgICpidWZwdHIrKyA9IHNldGNvdW50ICsgKDggPDwgNCk7Ci0JICAgICAgaWYgKGRlbHRhIDwgLTB4ODAwMCkKLQkJewotCQkgIHNldCA9IC0weDgwMDA7Ci0JCSAgZGVsdGEgKz0gMHg4MDAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoZGVsdGEgPiAweDdmZmYpCi0JCXsKLQkJICBzZXQgPSAweDdmZmY7Ci0JCSAgZGVsdGEgLT0gMHg3ZmZmOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2V0ID0gZGVsdGE7Ci0JCSAgZGVsdGEgPSAwOwotCQl9Ci0JICAgICAgKmJ1ZnB0cisrID0gc2V0ID4+IDg7Ci0JICAgICAgKmJ1ZnB0cisrID0gc2V0ICYgMHhmZmZmOwotCSAgICAgIGMgKz0gMzsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmluaXNoIGFkanVzdGluZyB0aGUgY291bnQuICAqLwotICAgICAgd2hpbGUgKGNvdW50ID4gMCkKLQl7Ci0JICBpZiAoYnVmcHRyID49ICpidWZlbmQpCi0JICAgIGJ1ZnB0ciA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgKGxvbmcpIDEpOwotCSAgLyogMSBpcyBhZGRlZCB0byBlYWNoIGNvdW50IHJlYWQuICAqLwotCSAgLS1jb3VudDsKLQkgIGlmIChjb3VudCA+IDB4MGYpCi0JICAgIHsKLQkgICAgICAqYnVmcHRyKysgPSAweDBmOwotCSAgICAgIGNvdW50IC09IDB4MGY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpidWZwdHIrKyA9IGNvdW50OwotCSAgICAgIGNvdW50ID0gMDsKLQkgICAgfQotCSAgKytjOwotCX0KLQotICAgICAgKytpbGluZTsKLSAgICAgIGxhc3QgPSBsOwotICAgIH0KLQotICBpZiAocHJvYyAhPSAocHJvY190ICopIE5VTEwpCi0gICAgcHJvYy0+cGRyLmxuSGlnaCA9IGxhc3QtPmxpbmVubzsKLSAgaWYgKGZpbGUgIT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZpbGUtPmZkci5jYkxpbmUgPSBjIC0gZmlsZS0+ZmRyLmNiTGluZU9mZnNldDsKLSAgICAgIGZpbGUtPmZkci5jbGluZSA9IHRvdGNvdW50OwotICAgIH0KLQotICBpZiAobGluZWNudHB0ciAhPSAobG9uZyAqKSBOVUxMKQotICAgICpsaW5lY250cHRyICs9IHRvdGNvdW50OwotCi0gIGMgPSBlY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIGMsICZidWZwdHIpOwotCi0gIHJldHVybiBjOwotfQotCi0vKiBCdWlsZCBhbmQgc3dhcCBvdXQgdGhlIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfc3ltYm9scyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9zeW1fb3V0OwotICBjaGFyICpzeW1fb3V0OwotICBsb25nIGlzeW07Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgc3ltX291dCA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgaXN5bSA9IDA7Ci0KLSAgLyogVGhlIHN5bWJvbHMgYXJlIHN0b3JlZCBieSBmaWxlLiAgKi8KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgaWZpbGVzeW07Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgdmxpbmtzX3QgKnN5bV9saW5rOwotCi0JICBmaWxfcHRyLT5mZHIuaXN5bUJhc2UgPSBpc3ltOwotCSAgaWZpbGVzeW0gPSBpc3ltOwotCSAgZm9yIChzeW1fbGluayA9IGZpbF9wdHItPnN5bWJvbHMuZmlyc3Q7Ci0JICAgICAgIHN5bV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotCSAgICAgICBzeW1fbGluayA9IHN5bV9saW5rLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IHN5bV9jbnQ7Ci0JICAgICAgbG9jYWxzeW1fdCAqc3ltX3B0cjsKLQkgICAgICBsb2NhbHN5bV90ICpzeW1fZW5kOwotCi0JICAgICAgaWYgKHN5bV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCQlzeW1fY250ID0gZmlsX3B0ci0+c3ltYm9scy5vYmplY3RzX2xhc3RfcGFnZTsKLQkgICAgICBlbHNlCi0JCXN5bV9jbnQgPSBmaWxfcHRyLT5zeW1ib2xzLm9iamVjdHNfcGVyX3BhZ2U7Ci0JICAgICAgc3ltX3B0ciA9IHN5bV9saW5rLT5kYXR1bS0+c3ltOwotCSAgICAgIHN5bV9lbmQgPSBzeW1fcHRyICsgc3ltX2NudDsKLQkgICAgICBmb3IgKDsgc3ltX3B0ciA8IHN5bV9lbmQ7IHN5bV9wdHIrKykKLQkJewotCQkgIGludCBsb2NhbDsKLQkJICBzeW1ib2xTICphc19zeW07Ci0JCSAgZm9yd2FyZF90ICpmOwotCi0JCSAga25vdyAoc3ltX3B0ci0+ZmlsZV9wdHIgPT0gZmlsX3B0cik7Ci0KLQkJICAvKiBJZiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGdhcyBzeW1ib2wsIHRoZW4gdGhpcwotCQkgICAgIGlzIGEgcHVyZSBkZWJ1Z2dpbmcgc3ltYm9sLiAgV2UgaGF2ZSBhbHJlYWR5Ci0JCSAgICAgYWRkZWQgdGhlIG5hbWUgKGlmIGFueSkgdG8gZmlsX3B0ci0+c3RyaW5ncy4KLQkJICAgICBPdGhlcndpc2Ugd2UgbXVzdCBkZWNpZGUgd2hldGhlciB0aGlzIGlzIGFuCi0JCSAgICAgZXh0ZXJuYWwgb3IgYSBsb2NhbCBzeW1ib2wgKGFjdHVhbGx5LCBpdCBtYXkgYmUKLQkJICAgICBib3RoIGlmIHRoZSBsb2NhbCBwcm92aWRlcyBhZGRpdGlvbmFsIGRlYnVnZ2luZwotCQkgICAgIGluZm9ybWF0aW9uIGZvciB0aGUgZXh0ZXJuYWwpLiAgKi8KLQkJICBsb2NhbCA9IDE7Ci0JCSAgYXNfc3ltID0gc3ltX3B0ci0+YXNfc3ltOwotCQkgIGlmIChhc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3ltaW50X3QgaW5keDsKLQotCQkgICAgICAvKiBUaGUgdmFsdWUgb2YgYSBibG9jayBzdGFydCBzeW1ib2wgaXMgdGhlCi0JCQkgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwcm9jZWR1cmUuICBGb3IKLQkJCSBvdGhlciBzeW1ib2xzIHdlIGp1c3QgdXNlIHRoZSBnYXMgdmFsdWUgKGJ1dAotCQkJIHdlIG11c3Qgb2Zmc2V0IGl0IGJ5IHRoZSB2bWEgb2YgdGhlIHNlY3Rpb24sCi0JCQkganVzdCBhcyBCRkQgZG9lcywgYmVjYXVzZSBCRkQgd2lsbCBub3Qgc2VlCi0JCQkgdGhpcyB2YWx1ZSkuICAqLwotCQkgICAgICBpZiAoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPT0gKGludCkgc3RfQmxvY2sKLQkJCSAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgPT0gKGludCkgc2NfVGV4dCkKLQkJCXsKLQkJCSAgc3ltYm9sUyAqYmVnaW5fc3ltOwotCi0JCQkgIGtub3cgKHN5bV9wdHItPnByb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTCk7Ci0JCQkgIGJlZ2luX3N5bSA9IHN5bV9wdHItPnByb2NfcHRyLT5zeW0tPmFzX3N5bTsKLQkJCSAgaWYgKFNfR0VUX1NFR01FTlQgKGFzX3N5bSkKLQkJCSAgICAgICE9IFNfR0VUX1NFR01FTlQgKGJlZ2luX3N5bSkpCi0JCQkgICAgYXNfd2FybiAoXygiLmJlZ2luLy5iZW5kIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQotCQkJICAgIFNfR0VUX1ZBTFVFIChhc19zeW0pIC0gU19HRVRfVkFMVUUgKGJlZ2luX3N5bSk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0KLQkJCSAgKFNfR0VUX1ZBTFVFIChhc19zeW0pCi0JCQkgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwKLQkJCQkJCSAgU19HRVRfU0VHTUVOVCAoYXNfc3ltKSkKLQkJCSAgICsgc3ltX3B0ci0+YWRkZW5kKTsKLQotCQkgICAgICBzeW1fcHRyLT5lY29mZl9zeW0ud2Vha2V4dCA9IFNfSVNfV0VBSyAoYXNfc3ltKTsKLQotCQkgICAgICAvKiBTZXQgc3RfUHJvYyB0byBzdF9TdGF0aWNQcm9jIGZvciBsb2NhbAotCQkJIGZ1bmN0aW9ucy4gICovCi0JCSAgICAgIGlmIChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSBzdF9Qcm9jCi0JCQkgICYmIFNfSVNfREVGSU5FRCAoYXNfc3ltKQotCQkJICAmJiAhIFNfSVNfRVhURVJOQUwgKGFzX3N5bSkKLQkJCSAgJiYgISBTX0lTX1dFQUsgKGFzX3N5bSkpCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9IHN0X1N0YXRpY1Byb2M7Ci0KLQkJICAgICAgLyogR2V0IHRoZSB0eXBlIGFuZCBzdG9yYWdlIGNsYXNzIGJhc2VkIG9uIHdoZXJlCi0JCQkgdGhlIHN5bWJvbCBhY3R1YWxseSB3b3VuZCB1cC4gIFRyYWRpdGlvbmFsbHksCi0JCQkgTl9MQlJBQyBhbmQgTl9SQlJBQyBhcmUgKm5vdCogcmVsb2NhdGVkLiAqLwotCQkgICAgICBpbmR4ID0gc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXg7Ci0JCSAgICAgIGlmIChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSBzdF9OaWwKLQkJCSAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgPT0gc2NfTmlsCi0JCQkgICYmICghIEVDT0ZGX0lTX1NUQUIgKCZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSkKLQkJCSAgICAgIHx8ICgoRUNPRkZfVU5NQVJLX1NUQUIgKGluZHgpICE9IE5fTEJSQUMpCi0JCQkJICAmJiAoRUNPRkZfVU5NQVJLX1NUQUIgKGluZHgpICE9IE5fUkJSQUMpKSkpCi0JCQl7Ci0JCQkgIHNlZ1Qgc2VnOwotCQkJICBjb25zdCBjaGFyICpzZWduYW1lOwotCQkJICBzdF90IHN0OwotCQkJICBzY190IHNjOwotCi0JCQkgIHNlZyA9IFNfR0VUX1NFR01FTlQgKGFzX3N5bSk7Ci0JCQkgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKHNlZyk7Ci0KLQkJCSAgaWYgKCEgRUNPRkZfSVNfU1RBQiAoJnN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltKQotCQkJICAgICAgJiYgKFNfSVNfRVhURVJOQUwgKGFzX3N5bSkKLQkJCQkgIHx8IFNfSVNfV0VBSyAoYXNfc3ltKQotCQkJCSAgfHwgISBTX0lTX0RFRklORUQgKGFzX3N5bSkpKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoc3ltYm9sX2dldF9iZmRzeW0gKGFzX3N5bSktPmZsYWdzCi0JCQkJICAgJiBCU0ZfRlVOQ1RJT04pICE9IDApCi0JCQkJc3QgPSBzdF9Qcm9jOwotCQkJICAgICAgZWxzZQotCQkJCXN0ID0gc3RfR2xvYmFsOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoc2VnID09IHRleHRfc2VjdGlvbikKLQkJCSAgICBzdCA9IHN0X0xhYmVsOwotCQkJICBlbHNlCi0JCQkgICAgc3QgPSBzdF9TdGF0aWM7Ci0KLQkJCSAgaWYgKCEgU19JU19ERUZJTkVEIChhc19zeW0pKQotCQkJICAgIHsKLQkJCSAgICAgIHZhbHVlVCBzOwotCi0JCQkgICAgICBzID0gc3ltYm9sX2dldF9vYmogKGFzX3N5bSktPmVjb2ZmX2V4dGVybl9zaXplOwotCQkJICAgICAgaWYgKHMgPT0gMAotCQkJCSAgfHwgcyA+IGJmZF9nZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0KSkKLQkJCQlzYyA9IHNjX1VuZGVmaW5lZDsKLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBzYyA9IHNjX1NVbmRlZmluZWQ7Ci0JCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9IHM7Ci0JCQkJfQotI2lmZGVmIFNfU0VUX1NJWkUKLQkJCSAgICAgIFNfU0VUX1NJWkUgKGFzX3N5bSwgcyk7Ci0jZW5kaWYKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKFNfSVNfQ09NTU9OIChhc19zeW0pKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChTX0dFVF9WQUxVRSAoYXNfc3ltKSA+IDAKLQkJCQkgICYmIChTX0dFVF9WQUxVRSAoYXNfc3ltKQotCQkJCSAgICAgIDw9IGJmZF9nZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0KSkpCi0JCQkJc2MgPSBzY19TQ29tbW9uOwotCQkJICAgICAgZWxzZQotCQkJCXNjID0gc2NfQ29tbW9uOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoc2VnID09IHRleHRfc2VjdGlvbikKLQkJCSAgICBzYyA9IHNjX1RleHQ7Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSBkYXRhX3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19EYXRhOwotCQkJICBlbHNlIGlmIChzdHJjbXAgKHNlZ25hbWUsICIucmRhdGEiKSA9PSAwCi0JCQkJICAgfHwgc3RyY21wIChzZWduYW1lLCAiLnJvZGF0YSIpID09IDApCi0JCQkgICAgc2MgPSBzY19SRGF0YTsKLQkJCSAgZWxzZSBpZiAoc3RyY21wIChzZWduYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJCSAgICBzYyA9IHNjX1NEYXRhOwotCQkJICBlbHNlIGlmIChzZWcgPT0gYnNzX3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19Cc3M7Ci0JCQkgIGVsc2UgaWYgKHN0cmNtcCAoc2VnbmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJCSAgICBzYyA9IHNjX1NCc3M7Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSAmYmZkX2Fic19zZWN0aW9uKQotCQkJICAgIHNjID0gc2NfQWJzOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgLyogVGhpcyBtdXN0IGJlIGEgdXNlciBuYW1lZCBzZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBub3QgcG9zc2libGUgaW4gRUNPRkYsIGJ1dCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gRUxGLiAgKi8KLQkJCSAgICAgIHNjID0gc2NfRGF0YTsKLQkJCSAgICB9Ci0KLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAoaW50KSBzdDsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAoaW50KSBzYzsKLQkJCX0KLQotCQkgICAgICAvKiBUaGlzIGlzIGp1c3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGlzCi0JCQkgb3V0c2lkZSBhIHByb2NlZHVyZSBhbmQgaXQgaGFzIGEgdHlwZS4KLQkJCSBGSVhNRTogZysrIHdpbGwgZ2VuZXJhdGUgc3ltYm9scyB3aGljaCBoYXZlCi0JCQkgZGlmZmVyZW50IG5hbWVzIGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQkJCSB0aGFuIHRoZSBhY3R1YWwgc3ltYm9sLiAgU2hvdWxkIHdlIGhhbmRsZQotCQkJIHRoZW0gaGVyZT8gICovCi0JCSAgICAgIGlmICgoU19JU19FWFRFUk5BTCAoYXNfc3ltKQotCQkJICAgfHwgU19JU19XRUFLIChhc19zeW0pCi0JCQkgICB8fCAhIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkKLQkJCSAgJiYgc3ltX3B0ci0+cHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMCi0JCQkgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ICE9IChpbnQpIHN0X05pbAotCQkJICAmJiAhIEVDT0ZGX0lTX1NUQUIgKCZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSkpCi0JCQlsb2NhbCA9IDA7Ci0KLQkJICAgICAgLyogVGhpcyBpcyBqdXN0IGFuIGV4dGVybmFsIHN5bWJvbCBpZiBpdCBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uIHN5bWJvbC4gICovCi0JCSAgICAgIGlmIChTX0lTX0NPTU1PTiAoYXNfc3ltKSkKLQkJCWxvY2FsID0gMDsKLQotCQkgICAgICAvKiBJZiBhbiBzdF9lbmQgc3ltYm9sIGhhcyBhbiBhc3NvY2lhdGVkIGdhcwotCQkJIHN5bWJvbCwgdGhlbiBpdCBpcyBhIGxvY2FsIGxhYmVsIGNyZWF0ZWQgZm9yCi0JCQkgYSAuYmVuZCBvciAuZW5kIGRpcmVjdGl2ZS4gIFN0YWJzIGxpbmUKLQkJCSBudW1iZXJzIHdpbGwgaGF2ZSBcMDAxIGluIHRoZSBuYW1lcy4gICovCi0JCSAgICAgIGlmIChsb2NhbAotCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCAhPSBzdF9FbmQKLQkJCSAgJiYgc3RyY2hyIChzeW1fcHRyLT5uYW1lLCAnXDAwMScpID09IDApCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3MgPQotCQkJICBhZGRfc3RyaW5nICgmZmlsX3B0ci0+c3RyaW5ncywKLQkJCQkgICAgICBmaWxfcHRyLT5zdHJfaGFzaCwKLQkJCQkgICAgICBzeW1fcHRyLT5uYW1lLAotCQkJCSAgICAgIChzaGFzaF90ICoqKSBOVUxMKTsKLQkJICAgIH0KLQotCQkgIC8qIFdlIG5vdyBrbm93IHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbDsgZmlsbCBpbgotCQkgICAgIGxvY2F0aW9ucyB0aGF0IGhhdmUgYmVlbiB3YWl0aW5nIGZvciB0aGF0Ci0JCSAgICAgaW5mb3JtYXRpb24uICAqLwotCQkgIGlmIChzeW1fcHRyLT5iZWdpbl9wdHIgIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgbG9jYWxzeW1fdCAqYmVnaW5fcHRyOwotCQkgICAgICBzdF90IGJlZ2luX3R5cGU7Ci0KLQkJICAgICAga25vdyAobG9jYWwpOwotCQkgICAgICBiZWdpbl9wdHIgPSBzeW1fcHRyLT5iZWdpbl9wdHI7Ci0JCSAgICAgIGtub3cgKGJlZ2luX3B0ci0+c3ltX2luZGV4ICE9IC0xKTsKLQkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBiZWdpbl9wdHItPnN5bV9pbmRleDsKLQkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnNjICE9IChpbnQpIHNjX0luZm8pCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3MgPQotCQkJICBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLmlzczsKLQotCQkgICAgICBiZWdpbl90eXBlID0gYmVnaW5fcHRyLT5lY29mZl9zeW0uYXN5bS5zdDsKLQkJICAgICAgaWYgKGJlZ2luX3R5cGUgPT0gc3RfRmlsZQotCQkJICB8fCBiZWdpbl90eXBlID09IHN0X0Jsb2NrKQotCQkJewotCQkJICBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0KLQkJCSAgICBpc3ltIC0gaWZpbGVzeW0gKyAxOwotCQkJICAoKnN3YXBfc3ltX291dCkgKHN0ZG91dHB1dCwKLQkJCQkJICAgJmJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0sCi0JCQkJCSAgICgqYnVmCi0JCQkJCSAgICArIG9mZnNldAotCQkJCQkgICAgKyAoYmVnaW5fcHRyLT5zeW1faW5kZXgKLQkJCQkJICAgICAgICogZXh0ZXJuYWxfc3ltX3NpemUpKSk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAga25vdyAoYmVnaW5fcHRyLT5pbmRleF9wdHIgIT0gKGF1eF90ICopIE5VTEwpOwotCQkJICBiZWdpbl9wdHItPmluZGV4X3B0ci0+ZGF0YS5pc3ltID0KLQkJCSAgICBpc3ltIC0gaWZpbGVzeW0gKyAxOwotCQkJfQotCi0JCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiBhCi0JCQkgcHJvY2VkdXJlIGlzIHRoZSBzaXplIG9mIHRoZSBwcm9jZWR1cmUuICBUaGUKLQkJCSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiBhCi0JCQkgYmxvY2sgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLQkJCSBwcm9jZWR1cmUgdG8gdGhlIGJsb2NrLiAgKi8KLQkJICAgICAgaWYgKGJlZ2luX3R5cGUgPT0gc3RfUHJvYwotCQkJICB8fCBiZWdpbl90eXBlID09IHN0X1N0YXRpY1Byb2MpCi0JCQl7Ci0JCQkgIGtub3cgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKLQkJCSAga25vdyAoYmVnaW5fcHRyLT5hc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTCk7Ci0JCQkgIGlmIChTX0dFVF9TRUdNRU5UIChhc19zeW0pCi0JCQkgICAgICAhPSBTX0dFVF9TRUdNRU5UIChiZWdpbl9wdHItPmFzX3N5bSkpCi0JCQkgICAgYXNfd2FybiAoXygiLmJlZ2luLy5iZW5kIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQotCQkJICAgIChTX0dFVF9WQUxVRSAoYXNfc3ltKQotCQkJICAgICAtIFNfR0VUX1ZBTFVFIChiZWdpbl9wdHItPmFzX3N5bSkpOwotCi0JCQkgIC8qIElmIHRoZSBzaXplIGlzIG9kZCwgdGhpcyBpcyBwcm9iYWJseSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHMxNiBmdW5jdGlvbjsgZm9yY2UgaXQgdG8gYmUgZXZlbi4gICovCi0JCQkgIGlmICgoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgJiAxKSAhPSAwKQotCQkJICAgICsrc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWU7Ci0KLSNpZmRlZiBTX1NFVF9TSVpFCi0JCQkgIFNfU0VUX1NJWkUgKGJlZ2luX3B0ci0+YXNfc3ltLAotCQkJCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlKTsKLSNlbmRpZgotCQkJfQotCQkgICAgICBlbHNlIGlmIChiZWdpbl90eXBlID09IHN0X0Jsb2NrCi0JCQkgICAgICAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgIT0gKGludCkgc2NfSW5mbykKLQkJCXsKLQkJCSAgc3ltYm9sUyAqYmVnaW5fc3ltOwotCi0JCQkgIGtub3cgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKLQkJCSAga25vdyAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKTsKLQkJCSAgYmVnaW5fc3ltID0gc3ltX3B0ci0+cHJvY19wdHItPnN5bS0+YXNfc3ltOwotCQkJICBpZiAoU19HRVRfU0VHTUVOVCAoYXNfc3ltKQotCQkJICAgICAgIT0gU19HRVRfU0VHTUVOVCAoYmVnaW5fc3ltKSkKLQkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkgICAgU19HRVRfVkFMVUUgKGFzX3N5bSkgLSBTX0dFVF9WQUxVRSAoYmVnaW5fc3ltKTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGZvciAoZiA9IHN5bV9wdHItPmZvcndhcmRfcmVmOwotCQkgICAgICAgZiAhPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0JCSAgICAgICBmID0gZi0+bmV4dCkKLQkJICAgIHsKLQkJICAgICAga25vdyAobG9jYWwpOwotCQkgICAgICBmLT5pZmRfcHRyLT5kYXRhLmlzeW0gPSBmaWxfcHRyLT5maWxlX2luZGV4OwotCQkgICAgICBmLT5pbmRleF9wdHItPmRhdGEucm5keC5pbmRleCA9IGlzeW0gLSBpZmlsZXN5bTsKLQkJICAgIH0KLQotCQkgIGlmIChsb2NhbCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCpidWZlbmQgLSBzeW1fb3V0IDwgZXh0ZXJuYWxfc3ltX3NpemUpCi0JCQlzeW1fb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwKLQkJCQkJCSAgIHN5bV9vdXQsCi0JCQkJCQkgICBleHRlcm5hbF9zeW1fc2l6ZSk7Ci0JCSAgICAgICgqc3dhcF9zeW1fb3V0KSAoc3Rkb3V0cHV0LCAmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0sCi0JCQkJICAgICAgIHN5bV9vdXQpOwotCQkgICAgICBzeW1fb3V0ICs9IGV4dGVybmFsX3N5bV9zaXplOwotCi0JCSAgICAgIHN5bV9wdHItPnN5bV9pbmRleCA9IGlzeW07Ci0KLQkJICAgICAgaWYgKHN5bV9wdHItPnByb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTAotCQkJICAmJiBzeW1fcHRyLT5wcm9jX3B0ci0+c3ltID09IHN5bV9wdHIpCi0JCQlzeW1fcHRyLT5wcm9jX3B0ci0+cGRyLmlzeW0gPSBpc3ltIC0gaWZpbGVzeW07Ci0KLQkJICAgICAgKytpc3ltOwotCQkgICAgfQotCi0JCSAgLyogUmVjb3JkIHRoZSBsb2NhbCBzeW1ib2wgaW5kZXggYW5kIGZpbGUgbnVtYmVyIGluCi0JCSAgICAgY2FzZSB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gIE5vdGUgdGhhdCB0aGlzCi0JCSAgICAgZGVzdHJveXMgdGhlIGFzeW0uaW5kZXggZmllbGQuICAqLwotCQkgIGlmIChhc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTAotCQkgICAgICAmJiBzeW1ib2xfZ2V0X29iaiAoYXNfc3ltKS0+ZWNvZmZfc3ltYm9sID09IHN5bV9wdHIpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPT0gc3RfUHJvYwotCQkJICAgfHwgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPT0gc3RfU3RhdGljUHJvYykKLQkJCSAgJiYgbG9jYWwpCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGlzeW0gLSBpZmlsZXN5bSAtIDE7Ci0JCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS5pZmQgPSBmaWxfcHRyLT5maWxlX2luZGV4OwotCi0JCSAgICAgIC8qIERvbid0IHRyeSB0byBtZXJnZSBhbiBGRFIgd2hpY2ggaGFzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgc3ltYm9sIGF0dGFjaGVkIHRvIGl0LiAgKi8KLQkJICAgICAgaWYgKFNfSVNfRVhURVJOQUwgKGFzX3N5bSkgfHwgU19JU19XRUFLIChhc19zeW0pKQotCQkJZmlsX3B0ci0+ZmRyLmZNZXJnZSA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZmlsX3B0ci0+ZmRyLmNzeW0gPSBpc3ltIC0gZmlsX3B0ci0+ZmRyLmlzeW1CYXNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldCArIGlzeW0gKiBleHRlcm5hbF9zeW1fc2l6ZTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIHByb2NlZHVyZSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9wcm9jcyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9wZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUERSICosIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX3Bkcl9vdXQ7Ci0gIGNoYXIgKnBkcl9vdXQ7Ci0gIGxvbmcgaXByb2M7Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgcGRyX291dCA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgaXByb2MgPSAwOwotCi0gIC8qIFRoZSBwcm9jZWR1cmVzIGFyZSBzdG9yZWQgYnkgZmlsZS4gICovCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIHZsaW5rc190ICpwcm9jX2xpbms7Ci0JICBpbnQgZmlyc3Q7Ci0KLQkgIGZpbF9wdHItPmZkci5pcGRGaXJzdCA9IGlwcm9jOwotCSAgZmlyc3QgPSAxOwotCSAgZm9yIChwcm9jX2xpbmsgPSBmaWxfcHRyLT5wcm9jcy5maXJzdDsKLQkgICAgICAgcHJvY19saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotCSAgICAgICBwcm9jX2xpbmsgPSBwcm9jX2xpbmstPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgcHJjX2NudDsKLQkgICAgICBwcm9jX3QgKnByb2NfcHRyOwotCSAgICAgIHByb2NfdCAqcHJvY19lbmQ7Ci0KLQkgICAgICBpZiAocHJvY19saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCQlwcmNfY250ID0gZmlsX3B0ci0+cHJvY3Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0JICAgICAgZWxzZQotCQlwcmNfY250ID0gZmlsX3B0ci0+cHJvY3Mub2JqZWN0c19wZXJfcGFnZTsKLQkgICAgICBwcm9jX3B0ciA9IHByb2NfbGluay0+ZGF0dW0tPnByb2M7Ci0JICAgICAgcHJvY19lbmQgPSBwcm9jX3B0ciArIHByY19jbnQ7Ci0JICAgICAgZm9yICg7IHByb2NfcHRyIDwgcHJvY19lbmQ7IHByb2NfcHRyKyspCi0JCXsKLQkJICBzeW1ib2xTICphZHJfc3ltOwotCQkgIHVuc2lnbmVkIGxvbmcgYWRyOwotCi0JCSAgYWRyX3N5bSA9IHByb2NfcHRyLT5zeW0tPmFzX3N5bTsKLQkJICBhZHIgPSAoU19HRVRfVkFMVUUgKGFkcl9zeW0pCi0JCQkgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsCi0JCQkJCQlTX0dFVF9TRUdNRU5UIChhZHJfc3ltKSkpOwotCQkgIGlmIChmaXJzdCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gZm9yY2UgdGhlIGFkciBvZiB0aGUgdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGZkciB0byBiZSAwLiAgSG93ZXZlciwgdGhlIG5hdGl2ZSB0b29scwotICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGRvIHRoYXQsIGFuZCBJIGNhbid0IHJlbWVtYmVyIHdoeSBpdAotICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gd29yayB0aGF0IHdheSwgc28gSSB0b29rIGl0IG91dC4gICovCi0JCSAgICAgIGZpbF9wdHItPmZkci5hZHIgPSBhZHI7Ci0JCSAgICAgIGZpcnN0ID0gMDsKLQkJICAgIH0KLQkJICBwcm9jX3B0ci0+cGRyLmFkciA9IGFkciAtIGZpbF9wdHItPmZkci5hZHI7Ci0JCSAgaWYgKCpidWZlbmQgLSBwZHJfb3V0IDwgZXh0ZXJuYWxfcGRyX3NpemUpCi0JCSAgICBwZHJfb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwKLQkJCQkJICAgICAgIHBkcl9vdXQsCi0JCQkJCSAgICAgICBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0JCSAgKCpzd2FwX3Bkcl9vdXQpIChzdGRvdXRwdXQsICZwcm9jX3B0ci0+cGRyLCBwZHJfb3V0KTsKLQkJICBwZHJfb3V0ICs9IGV4dGVybmFsX3Bkcl9zaXplOwotCQkgICsraXByb2M7Ci0JCX0KLQkgICAgfQotCSAgZmlsX3B0ci0+ZmRyLmNwZCA9IGlwcm9jIC0gZmlsX3B0ci0+ZmRyLmlwZEZpcnN0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldCArIGlwcm9jICogZXh0ZXJuYWxfcGRyX3NpemU7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBhdXggaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfYXV4IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGludCBiaWdlbmRpYW47Ci0gIHVuaW9uIGF1eF9leHQgKmF1eF9vdXQ7Ci0gIGxvbmcgaWF1eDsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBiaWdlbmRpYW4gPSBiZmRfYmlnX2VuZGlhbiAoc3Rkb3V0cHV0KTsKLQotICBhdXhfb3V0ID0gKHVuaW9uIGF1eF9leHQgKikgKCpidWYgKyBvZmZzZXQpOwotCi0gIGlhdXggPSAwOwotCi0gIC8qIFRoZSBhdXggZW50cmllcyBhcmUgc3RvcmVkIGJ5IGZpbGUuICAqLwotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICB2bGlua3NfdCAqYXV4X2xpbms7Ci0KLQkgIGZpbF9wdHItPmZkci5mQmlnZW5kaWFuID0gYmlnZW5kaWFuOwotCSAgZmlsX3B0ci0+ZmRyLmlhdXhCYXNlID0gaWF1eDsKLQkgIGZvciAoYXV4X2xpbmsgPSBmaWxfcHRyLT5hdXhfc3ltcy5maXJzdDsKLQkgICAgICAgYXV4X2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0JICAgICAgIGF1eF9saW5rID0gYXV4X2xpbmstPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgYXV4X2NudDsKLQkgICAgICBhdXhfdCAqYXV4X3B0cjsKLQkgICAgICBhdXhfdCAqYXV4X2VuZDsKLQotCSAgICAgIGlmIChhdXhfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQkJYXV4X2NudCA9IGZpbF9wdHItPmF1eF9zeW1zLm9iamVjdHNfbGFzdF9wYWdlOwotCSAgICAgIGVsc2UKLQkJYXV4X2NudCA9IGZpbF9wdHItPmF1eF9zeW1zLm9iamVjdHNfcGVyX3BhZ2U7Ci0JICAgICAgYXV4X3B0ciA9IGF1eF9saW5rLT5kYXR1bS0+YXV4OwotCSAgICAgIGF1eF9lbmQgPSBhdXhfcHRyICsgYXV4X2NudDsKLQkgICAgICBmb3IgKDsgYXV4X3B0ciA8IGF1eF9lbmQ7IGF1eF9wdHIrKykKLQkJewotCQkgIGlmICgqYnVmZW5kIC0gKGNoYXIgKikgYXV4X291dCA8IHNpemVvZiAodW5pb24gYXV4X2V4dCkpCi0JCSAgICBhdXhfb3V0ID0gKCh1bmlvbiBhdXhfZXh0ICopCi0JCQkgICAgICAgZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwKLQkJCQkJCShjaGFyICopIGF1eF9vdXQsCi0JCQkJCQlzaXplb2YgKHVuaW9uIGF1eF9leHQpKSk7Ci0JCSAgc3dpdGNoIChhdXhfcHRyLT50eXBlKQotCQkgICAgewotCQkgICAgY2FzZSBhdXhfdGlyOgotCQkgICAgICAoKmJhY2tlbmQtPnN3YXBfdGlyX291dCkgKGJpZ2VuZGlhbiwKLQkJCQkJCSZhdXhfcHRyLT5kYXRhLnRpLAotCQkJCQkJJmF1eF9vdXQtPmFfdGkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X3JuZHg6Ci0JCSAgICAgICgqYmFja2VuZC0+c3dhcF9ybmR4X291dCkgKGJpZ2VuZGlhbiwKLQkJCQkJCSAmYXV4X3B0ci0+ZGF0YS5ybmR4LAotCQkJCQkJICZhdXhfb3V0LT5hX3JuZHgpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2RuTG93OgotCQkgICAgICBBVVhfUFVUX0ROTE9XIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuZG5Mb3csCi0JCQkJICAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9kbkhpZ2g6Ci0JCSAgICAgIEFVWF9QVVRfRE5ISUdIIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuZG5IaWdoLAotCQkJCSAgICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2lzeW06Ci0JCSAgICAgIEFVWF9QVVRfSVNZTSAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmlzeW0sCi0JCQkJICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2lzczoKLQkJICAgICAgQVVYX1BVVF9JU1MgKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5pc3MsCi0JCQkJICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfd2lkdGg6Ci0JCSAgICAgIEFVWF9QVVRfV0lEVEggKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS53aWR0aCwKLQkJCQkgICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2NvdW50OgotCQkgICAgICBBVVhfUFVUX0NPVU5UIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuY291bnQsCi0JCQkJICAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICArK2F1eF9vdXQ7Ci0JCSAgKytpYXV4OwotCQl9Ci0JICAgIH0KLQkgIGZpbF9wdHItPmZkci5jYXV4ID0gaWF1eCAtIGZpbF9wdHItPmZkci5pYXV4QmFzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBlY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsCi0JCQkgICAgICAgb2Zmc2V0ICsgaWF1eCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JCQkgICAgICAgKGNoYXIgKiopIE5VTEwpOwotfQotCi0vKiBDb3B5IG91dCB0aGUgc3RyaW5ncyBmcm9tIGEgdmFycmF5X3QuICBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZgotICAgYnl0ZXMgY29waWVkLCByYXRoZXIgdGhhbiB0aGUgbmV3IG9mZnNldC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9zdHJpbmdzIChidWYsIGJ1ZmVuZCwgb2Zmc2V0LCB2cCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIHZhcnJheV90ICp2cDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpc3RyOwotICBjaGFyICpzdHJfb3V0OwotICB2bGlua3NfdCAqc3RyX2xpbms7Ci0KLSAgc3RyX291dCA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgaXN0ciA9IDA7Ci0KLSAgZm9yIChzdHJfbGluayA9IHZwLT5maXJzdDsKLSAgICAgICBzdHJfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBzdHJfbGluayA9IHN0cl9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RyX2NudDsKLQotICAgICAgaWYgKHN0cl9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCXN0cl9jbnQgPSB2cC0+b2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0Jc3RyX2NudCA9IHZwLT5vYmplY3RzX3Blcl9wYWdlOwotCi0gICAgICBpZiAoKmJ1ZmVuZCAtIHN0cl9vdXQgPCBzdHJfY250KQotCXN0cl9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBzdHJfb3V0LCBzdHJfY250KTsKLQotICAgICAgbWVtY3B5IChzdHJfb3V0LCBzdHJfbGluay0+ZGF0dW0tPmJ5dGUsIHN0cl9jbnQpOwotICAgICAgc3RyX291dCArPSBzdHJfY250OwotICAgICAgaXN0ciArPSBzdHJfY250OwotICAgIH0KLQotICByZXR1cm4gaXN0cjsKLX0KLQotLyogRHVtcCBvdXQgdGhlIGxvY2FsIHN0cmluZ3MuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfc3MgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgbG9uZyBpc3M7Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgaXNzID0gMDsKLQotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICBsb25nIHNzX2NudDsKLQotCSAgZmlsX3B0ci0+ZmRyLmlzc0Jhc2UgPSBpc3M7Ci0JICBzc19jbnQgPSBlY29mZl9idWlsZF9zdHJpbmdzIChidWYsIGJ1ZmVuZCwgb2Zmc2V0ICsgaXNzLAotCQkJCQkmZmlsX3B0ci0+c3RyaW5ncyk7Ci0JICBmaWxfcHRyLT5mZHIuY2JTcyA9IHNzX2NudDsKLQkgIGlzcyArPSBzc19jbnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZWNvZmZfcGFkZGluZ19hZGp1c3QgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQgKyBpc3MsCi0JCQkgICAgICAgKGNoYXIgKiopIE5VTEwpOwotfQotCi0vKiBTd2FwIG91dCB0aGUgZmlsZSBkZXNjcmlwdG9ycy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9mZHIgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX2Zkcl9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9mZHJfb3V0OwotICBsb25nIGlmaWxlOwotICBjaGFyICpmZHJfb3V0OwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIGlmaWxlID0gMDsKLQotICBmZHJfb3V0ID0gKmJ1ZiArIG9mZnNldDsKLQotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICBpZiAoKmJ1ZmVuZCAtIGZkcl9vdXQgPCBleHRlcm5hbF9mZHJfc2l6ZSkKLQkgICAgZmRyX291dCA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGZkcl9vdXQsCi0JCQkJICAgICAgIGV4dGVybmFsX2Zkcl9zaXplKTsKLQkgICgqc3dhcF9mZHJfb3V0KSAoc3Rkb3V0cHV0LCAmZmlsX3B0ci0+ZmRyLCBmZHJfb3V0KTsKLQkgIGZkcl9vdXQgKz0gZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICArK2lmaWxlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldCArIGlmaWxlICogZXh0ZXJuYWxfZmRyX3NpemU7Ci19Ci0KLS8qIFNldCB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIFRoZXNlIGFyZSBzdXBwb3NlZCB0byBiZSBoYW5kbGVkIGJ5Ci0gICB0aGUgYmFja2VuZC4gIFRoaXMgcm91dGluZSBqdXN0IGdldHMgdGhlIHJpZ2h0IGluZm9ybWF0aW9uIGFuZAotICAgY2FsbHMgYSBiYWNrZW5kIGZ1bmN0aW9uIHRvIGRlYWwgd2l0aCBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zZXR1cF9leHQgKCkKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltOwotCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gKHN5bWJvbFMgKikgTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2wgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgdGhlbiBmb3JjZSB0aGUgZmllbGRzIHRvIHplcm8uICAqLwotICAgICAgaWYgKCEgU19JU19FWFRFUk5BTCAoc3ltKQotCSAgJiYgISBTX0lTX1dFQUsgKHN5bSkKLQkgICYmIFNfSVNfREVGSU5FRCAoc3ltKSkKLQl7Ci0JICBzdHJ1Y3QgbG9jYWxzeW0gKmxzeW07Ci0KLQkgIGxzeW0gPSBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sOwotCSAgbHN5bS0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPSAwOwotCSAgbHN5bS0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAoaW50KSBzdF9OaWw7Ci0JICBsc3ltLT5lY29mZl9zeW0uYXN5bS5zYyA9IChpbnQpIHNjX05pbDsKLQkgIGxzeW0tPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0JfQotCi0gICAgICBvYmpfZWNvZmZfc2V0X2V4dCAoc3ltLCAmc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltKTsKLSAgICB9Ci19Ci0KLS8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi11bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9kZWJ1ZyAoaGRyLCBidWZwLCBiYWNrZW5kKQotICAgICBIRFJSICpoZHI7Ci0gICAgIGNoYXIgKipidWZwOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3Bkcl9zaXplOwotICB0YWdfdCAqcHRhZzsKLSAgdGFnX3QgKnB0YWdfbmV4dDsKLSAgZWZkcl90ICpmaWxfcHRyOwotICBpbnQgZW5kX3dhcm5pbmc7Ci0gIGVmZHJfdCAqaG9sZF9maWxlX3B0cjsKLSAgcHJvY190ICogaG9sZF9wcm9jX3B0cjsKLSAgc3ltYm9sUyAqc3ltOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKmJ1ZmVuZDsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBmaWxlLiAgKi8KLSAgaWYgKGZpcnN0X2ZpbGUgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLQotICAvKiBIYW5kbGUgYW55IHRvcCBsZXZlbCB0YWdzLiAgKi8KLSAgZm9yIChwdGFnID0gdG9wX3RhZ19oZWFkLT5maXJzdF90YWc7Ci0gICAgICAgcHRhZyAhPSAodGFnX3QgKikgTlVMTDsKLSAgICAgICBwdGFnID0gcHRhZ19uZXh0KQotICAgIHsKLSAgICAgIGlmIChwdGFnLT5mb3J3YXJkX3JlZiAhPSAoZm9yd2FyZF90ICopIE5VTEwpCi0JYWRkX3Vua25vd25fdGFnIChwdGFnKTsKLQotICAgICAgcHRhZ19uZXh0ID0gcHRhZy0+c2FtZV9ibG9jazsKLSAgICAgIHB0YWctPmhhc2hfcHRyLT50YWdfcHRyID0gcHRhZy0+c2FtZV9uYW1lOwotICAgICAgZnJlZV90YWcgKHB0YWcpOwotICAgIH0KLQotICBmcmVlX3RoZWFkICh0b3BfdGFnX2hlYWQpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scy4gIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2gKLSAgICAgc3ltYm9sIHRoYXQgaGFzIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGl0LiAgKi8KLSAgaG9sZF9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKLSAgaG9sZF9wcm9jX3B0ciA9IGN1cl9wcm9jX3B0cjsKLSAgY3VyX3Byb2NfcHRyID0gKHByb2NfdCAqKSBOVUxMOwotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IChzeW1ib2xTICopIE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sICE9IE5VTEwKLQkgIHx8IHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9maWxlID09IChlZmRyX3QgKikgTlVMTAotCSAgfHwgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgY3VyX2ZpbGVfcHRyID0gc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2ZpbGU7Ci0gICAgICBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9OaWwsIHNjX05pbCwgc3ltLAotCQkJKGJmZF92bWEpIDAsIFNfR0VUX1ZBTFVFIChzeW0pLCBpbmRleE5pbCk7Ci0gICAgfQotICBjdXJfcHJvY19wdHIgPSBob2xkX3Byb2NfcHRyOwotICBjdXJfZmlsZV9wdHIgPSBob2xkX2ZpbGVfcHRyOwotCi0gIC8qIE91dHB1dCBhbiBlbmRpbmcgc3ltYm9sIGZvciBhbGwgdGhlIGZpbGVzLiAgV2UgaGF2ZSB0byBkbyB0aGlzCi0gICAgIGhlcmUgZm9yIHRoZSBsYXN0IGZpbGUsIHNvIHdlIG1heSBhcyB3ZWxsIGRvIGl0IGZvciBhbGwgb2YgdGhlCi0gICAgIGZpbGVzLiAgKi8KLSAgZW5kX3dhcm5pbmcgPSAwOwotICBmb3IgKGZpbF9wdHIgPSBmaXJzdF9maWxlOwotICAgICAgIGZpbF9wdHIgIT0gKGVmZHJfdCAqKSBOVUxMOwotICAgICAgIGZpbF9wdHIgPSBmaWxfcHRyLT5uZXh0X2ZpbGUpCi0gICAgewotICAgICAgY3VyX2ZpbGVfcHRyID0gZmlsX3B0cjsKLSAgICAgIHdoaWxlIChjdXJfZmlsZV9wdHItPmN1cl9zY29wZSAhPSAoc2NvcGVfdCAqKSBOVUxMCi0JICAgICAmJiBjdXJfZmlsZV9wdHItPmN1cl9zY29wZS0+cHJldiAhPSAoc2NvcGVfdCAqKSBOVUxMKQotCXsKLQkgIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlID0gY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUtPnByZXY7Ci0JICBpZiAoISBlbmRfd2FybmluZyAmJiAhIGN1cl9maWxlX3B0ci0+ZmFrZSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIk1pc3NpbmcgLmVuZCBvciAuYmVuZCBhdCBlbmQgb2YgZmlsZSIpKTsKLQkgICAgICBlbmRfd2FybmluZyA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgIT0gKHNjb3BlX3QgKikgTlVMTCkKLQkodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgc3RfRW5kLCBzY19UZXh0LAotCQkJCSAoc3ltYm9sUyAqKSBOVUxMLAotCQkJCSAoYmZkX3ZtYSkgMCwKLQkJCQkgKHN5bWludF90KSAwLAotCQkJCSAoc3ltaW50X3QpIDApOwotICAgIH0KLQotICAvKiBCdWlsZCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBvZmZzZXQgPSAwOwotICBidWYgPSB4bWFsbG9jIChQQUdFX1NJWkUpOwotICBidWZlbmQgPSBidWYgKyBQQUdFX1NJWkU7Ci0KLSAgLyogQnVpbGQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLSAgaGRyLT5jYkxpbmVPZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX2xpbmVubyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0LAotCQkJICAgICAgICZoZHItPmlsaW5lTWF4KTsKLSAgaGRyLT5jYkxpbmUgPSBvZmZzZXQgLSBoZHItPmNiTGluZU9mZnNldDsKLQotICAvKiBXZSBkb24ndCB1c2UgZGVuc2UgbnVtYmVycyBhdCBhbGwuICAqLwotICBoZHItPmlkbk1heCA9IDA7Ci0gIGhkci0+Y2JEbk9mZnNldCA9IDA7Ci0KLSAgLyogV2UgY2FuJ3QgYnVpbGQgdGhlIFBEUiB0YWJsZSB1bnRpbCB3ZSBoYXZlIGJ1aWx0IHRoZSBzeW1ib2xzLAotICAgICBiZWNhdXNlIGEgUERSIGNvbnRhaW5zIGEgc3ltYm9sIGluZGV4LiAgSG93ZXZlciwgd2Ugc2V0IGFzaWRlCi0gICAgIHNwYWNlIGF0IHRoaXMgcG9pbnQuICAqLwotICBoZHItPmlwZE1heCA9IHByb2NfY250OwotICBoZHItPmNiUGRPZmZzZXQgPSBvZmZzZXQ7Ci0gIGlmIChidWZlbmQgLSAoYnVmICsgb2Zmc2V0KSA8IHByb2NfY250ICogZXh0ZXJuYWxfcGRyX3NpemUpCi0gICAgKHZvaWQpIGVjb2ZmX2FkZF9ieXRlcyAoJmJ1ZiwgJmJ1ZmVuZCwgYnVmICsgb2Zmc2V0LAotCQkJICAgIHByb2NfY250ICogZXh0ZXJuYWxfcGRyX3NpemUpOwotICBvZmZzZXQgKz0gcHJvY19jbnQgKiBleHRlcm5hbF9wZHJfc2l6ZTsKLQotICAvKiBCdWlsZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gIGhkci0+Y2JTeW1PZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX3N5bWJvbHMgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCk7Ci0gIGhkci0+aXN5bU1heCA9IChvZmZzZXQgLSBoZHItPmNiU3ltT2Zmc2V0KSAvIGJhY2tlbmQtPmV4dGVybmFsX3N5bV9zaXplOwotCi0gIC8qIEJ1aWxkaW5nIHRoZSBzeW1ib2xzIGluaXRpYWxpemVzIHRoZSBzeW1ib2wgaW5kZXggaW4gdGhlIFBEUidzLgotICAgICBOb3cgd2UgY2FuIHN3YXAgb3V0IHRoZSBQRFIncy4gICovCi0gICh2b2lkKSBlY29mZl9idWlsZF9wcm9jcyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgaGRyLT5jYlBkT2Zmc2V0KTsKLQotICAvKiBXZSBkb24ndCB1c2Ugb3B0aW1pemF0aW9uIHN5bWJvbHMuICAqLwotICBoZHItPmlvcHRNYXggPSAwOwotICBoZHItPmNiT3B0T2Zmc2V0ID0gMDsKLQotICAvKiBTd2FwIG91dCB0aGUgYXV4aWxpYXJ5IHR5cGUgaW5mb3JtYXRpb24uICAqLwotICBoZHItPmNiQXV4T2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9hdXggKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCk7Ci0gIGhkci0+aWF1eE1heCA9IChvZmZzZXQgLSBoZHItPmNiQXV4T2Zmc2V0KSAvIHNpemVvZiAodW5pb24gYXV4X2V4dCk7Ci0KLSAgLyogQ29weSBvdXQgdGhlIGxvY2FsIHN0cmluZ3MuICAqLwotICBoZHItPmNiU3NPZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX3NzIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOwotICBoZHItPmlzc01heCA9IG9mZnNldCAtIGhkci0+Y2JTc09mZnNldDsKLQotICAvKiBXZSBkb24ndCB1c2UgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9ycy4gICovCi0gIGhkci0+Y3JmZCA9IDA7Ci0gIGhkci0+Y2JSZmRPZmZzZXQgPSAwOwotCi0gIC8qIFN3YXAgb3V0IHRoZSBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KLSAgaGRyLT5jYkZkT2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9mZHIgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCk7Ci0gIGhkci0+aWZkTWF4ID0gKG9mZnNldCAtIGhkci0+Y2JGZE9mZnNldCkgLyBiYWNrZW5kLT5leHRlcm5hbF9mZHJfc2l6ZTsKLQotICAvKiBTZXQgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMsIHdoaWNoIGFyZSBoYW5kbGVkIGJ5IHRoZSBCRkQgYmFjawotICAgICBlbmQuICAqLwotICBoZHItPmlzc0V4dE1heCA9IDA7Ci0gIGhkci0+Y2JTc0V4dE9mZnNldCA9IDA7Ci0gIGhkci0+aWV4dE1heCA9IDA7Ci0gIGhkci0+Y2JFeHRPZmZzZXQgPSAwOwotICBlY29mZl9zZXR1cF9leHQgKCk7Ci0KLSAga25vdyAoKG9mZnNldCAmIChiYWNrZW5kLT5kZWJ1Z19hbGlnbiAtIDEpKSA9PSAwKTsKLQotICAvKiBGSVhNRTogVGhpcyB2YWx1ZSBzaG91bGQgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSAudmVyc3RhbXAgZGlyZWN0aXZlLAotICAgICB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gY29uZmlnIGZpbGVzLiAgKi8KLSNpZmRlZiBUQ19BTFBIQQotICBoZHItPnZzdGFtcCA9IDB4MDMwYjsKLSNlbHNlCi0gIGhkci0+dnN0YW1wID0gMHgwMjBiOwotI2VuZGlmCi0KLSAgKmJ1ZnAgPSBidWY7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBhIGNsdXN0ZXIgb2YgcGFnZXMuICAqLwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi1zdGF0aWMgcGFnZV90eXBlICoKLWFsbG9jYXRlX2NsdXN0ZXIgKG5wYWdlcykKLSAgICAgdW5zaWduZWQgbG9uZyBucGFnZXM7Ci17Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqdmFsdWUgPSAocGFnZV90eXBlICopIHhtYWxsb2MgKG5wYWdlcyAqIFBBR0VfVVNJWkUpOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnID4gMykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcdGFsbG9jXHRucGFnZXMgPSAlZCwgdmFsdWUgPSAweCUuOHhcbiIsIG5wYWdlcywgdmFsdWUpOwotI2VuZGlmCi0KLSAgbWVtc2V0ICh2YWx1ZSwgMCwgbnBhZ2VzICogUEFHRV9VU0laRSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLXN0YXRpYyBwYWdlX3R5cGUgKmNsdXN0ZXJfcHRyID0gTlVMTDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2VzX2xlZnQgPSAwOwotCi0jZW5kaWYgLyogTUFMTE9DX0NIRUNLICovCi0KLS8qIEFsbG9jYXRlIG9uZSBwYWdlICh3aGljaCBpcyBpbml0aWFsaXplZCB0byAwKS4gICovCi0KLXN0YXRpYyBwYWdlX3R5cGUgKgotYWxsb2NhdGVfcGFnZSAoKQotewotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICBpZiAocGFnZXNfbGVmdCA9PSAwKQotICAgIHsKLSAgICAgIHBhZ2VzX2xlZnQgPSBNQVhfQ0xVU1RFUl9QQUdFUzsKLSAgICAgIGNsdXN0ZXJfcHRyID0gYWxsb2NhdGVfY2x1c3RlciAocGFnZXNfbGVmdCk7Ci0gICAgfQotCi0gIHBhZ2VzX2xlZnQtLTsKLSAgcmV0dXJuIGNsdXN0ZXJfcHRyKys7Ci0KLSNlbHNlCS8qIE1BTExPQ19DSEVDSyAqLwotCi0gIHBhZ2VfdHlwZSAqcHRyOwotCi0gIHB0ciA9IHhtYWxsb2MgKFBBR0VfVVNJWkUpOwotICBtZW1zZXQgKHB0ciwgMCwgUEFHRV9VU0laRSk7Ci0gIHJldHVybiBwdHI7Ci0KLSNlbmRpZgkvKiBNQUxMT0NfQ0hFQ0sgKi8KLX0KLQwKLS8qIEFsbG9jYXRlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgc2NvcGVfdCAqCi1hbGxvY2F0ZV9zY29wZSAoKQotewotICByZWdpc3RlciBzY29wZV90ICpwdHI7Ci0gIHN0YXRpYyBzY29wZV90IGluaXRpYWxfc2NvcGU7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcHRyID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uZnJlZV9saXN0LmZfc2NvcGU7Ci0gIGlmIChwdHIgIT0gKHNjb3BlX3QgKikgTlVMTCkKLSAgICBhbGxvY19jb3VudHNbIChpbnQpYWxsb2NfdHlwZV9zY29wZSBdLmZyZWVfbGlzdC5mX3Njb3BlID0gcHRyLT5mcmVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkCT0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udW5hbGxvY2F0ZWQ7Ci0gICAgICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlCT0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uY3VyX3BhZ2U7Ci0KLSAgICAgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotCXsKLQkgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChzY29wZV90KTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udG90YWxfcGFnZXMrKzsKLQl9Ci0KLSAgICAgIHB0ciA9ICZjdXJfcGFnZS0+c2NvcGVbLS11bmFsbG9jYXRlZF07Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotICAgIH0KLQotI2Vsc2UKLQotICBwdHIgPSAoc2NvcGVfdCAqKSB4bWFsbG9jIChzaXplb2YgKHNjb3BlX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfc2NvcGU7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIEZyZWUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX3Njb3BlIChwdHIpCi0gICAgIHNjb3BlX3QgKnB0cjsKLXsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udG90YWxfZnJlZSsrOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotICBwdHItPmZyZWUgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5mcmVlX2xpc3QuZl9zY29wZTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uZnJlZV9saXN0LmZfc2NvcGUgPSBwdHI7Ci0jZWxzZQotICBmcmVlICgoUFRSKSBwdHIpOwotI2VuZGlmCi19Ci0MCi0vKiBBbGxvY2F0ZSBsaW5rcyBmb3IgcGFnZXMgaW4gYSB2aXJ0dWFsIGFycmF5LiAgKi8KLQotc3RhdGljIHZsaW5rc190ICoKLWFsbG9jYXRlX3ZsaW5rcyAoKQotewotICByZWdpc3RlciB2bGlua3NfdCAqcHRyOwotICBzdGF0aWMgdmxpbmtzX3QgaW5pdGlhbF92bGlua3M7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh2bGlua3NfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT52bGlua3NbLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9ICh2bGlua3NfdCAqKSB4bWFsbG9jIChzaXplb2YgKHZsaW5rc190KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF92bGlua3M7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBzdHJpbmcgaGFzaCBidWNrZXRzLiAgKi8KLQotc3RhdGljIHNoYXNoX3QgKgotYWxsb2NhdGVfc2hhc2ggKCkKLXsKLSAgcmVnaXN0ZXIgc2hhc2hfdCAqcHRyOwotICBzdGF0aWMgc2hhc2hfdCBpbml0aWFsX3NoYXNoOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHNoYXNoX3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPnNoYXNoWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9IChzaGFzaF90ICopIHhtYWxsb2MgKHNpemVvZiAoc2hhc2hfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF9zaGFzaDsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIEFsbG9jYXRlIHR5cGUgaGFzaCBidWNrZXRzLiAgKi8KLQotc3RhdGljIHRoYXNoX3QgKgotYWxsb2NhdGVfdGhhc2ggKCkKLXsKLSAgcmVnaXN0ZXIgdGhhc2hfdCAqcHRyOwotICBzdGF0aWMgdGhhc2hfdCBpbml0aWFsX3RoYXNoOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHRoYXNoX3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPnRoYXNoWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9ICh0aGFzaF90ICopIHhtYWxsb2MgKHNpemVvZiAodGhhc2hfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF90aGFzaDsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIEFsbG9jYXRlIHN0cnVjdHVyZSwgdW5pb24sIG9yIGVudW0gdGFnIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHRhZ190ICoKLWFsbG9jYXRlX3RhZyAoKQotewotICByZWdpc3RlciB0YWdfdCAqcHRyOwotICBzdGF0aWMgdGFnX3QgaW5pdGlhbF90YWc7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcHRyID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZzsKLSAgaWYgKHB0ciAhPSAodGFnX3QgKikgTlVMTCkKLSAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnID0gcHRyLT5mcmVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnVuYWxsb2NhdGVkOwotICAgICAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5jdXJfcGFnZTsKLQotICAgICAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0JewotCSAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHRhZ190KTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS50b3RhbF9wYWdlcysrOwotCX0KLQotICAgICAgcHRyID0gJmN1cl9wYWdlLT50YWdbLS11bmFsbG9jYXRlZF07Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLSAgICB9Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHRhZ190ICopIHhtYWxsb2MgKHNpemVvZiAodGFnX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3RhZzsKLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogRnJlZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfdGFnIChwdHIpCi0gICAgIHRhZ190ICpwdHI7Ci17Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS50b3RhbF9mcmVlKys7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0gIHB0ci0+ZnJlZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWc7Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWcgPSBwdHI7Ci0jZWxzZQotICBmcmVlICgoUFRSX1QpIHB0cik7Ci0jZW5kaWYKLX0KLQwKLS8qIEFsbG9jYXRlIGZvcndhcmQgcmVmZXJlbmNlIHRvIGEgeWV0IHVua25vd24gdGFnLiAgKi8KLQotc3RhdGljIGZvcndhcmRfdCAqCi1hbGxvY2F0ZV9mb3J3YXJkICgpCi17Ci0gIHJlZ2lzdGVyIGZvcndhcmRfdCAqcHRyOwotICBzdGF0aWMgZm9yd2FyZF90IGluaXRpYWxfZm9yd2FyZDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAoZm9yd2FyZF90KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+Zm9yd2FyZFstLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9IChmb3J3YXJkX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3J3YXJkX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF9mb3J3YXJkOwotICByZXR1cm4gcHRyOwotfQotDAotLyogQWxsb2NhdGUgaGVhZCBvZiB0eXBlIGhhc2ggbGlzdC4gICovCi0KLXN0YXRpYyB0aGVhZF90ICoKLWFsbG9jYXRlX3RoZWFkICgpCi17Ci0gIHJlZ2lzdGVyIHRoZWFkX3QgKnB0cjsKLSAgc3RhdGljIHRoZWFkX3QgaW5pdGlhbF90aGVhZDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICBwdHIgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5mcmVlX2xpc3QuZl90aGVhZDsKLSAgaWYgKHB0ciAhPSAodGhlYWRfdCAqKSBOVUxMKQotICAgIGFsbG9jX2NvdW50c1sgKGludClhbGxvY190eXBlX3RoZWFkIF0uZnJlZV9saXN0LmZfdGhlYWQgPSBwdHItPmZyZWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS51bmFsbG9jYXRlZDsKLSAgICAgIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5jdXJfcGFnZTsKLQotICAgICAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0JewotCSAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHRoZWFkX3QpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS50b3RhbF9wYWdlcysrOwotCX0KLQotICAgICAgcHRyID0gJmN1cl9wYWdlLT50aGVhZFstLXVuYWxsb2NhdGVkXTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0gICAgfQotCi0jZWxzZQotCi0gIHB0ciA9ICh0aGVhZF90ICopIHhtYWxsb2MgKHNpemVvZiAodGhlYWRfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF90aGVhZDsKLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogRnJlZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfdGhlYWQgKHB0cikKLSAgICAgdGhlYWRfdCAqcHRyOwotewotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS50b3RhbF9mcmVlKys7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0gIHB0ci0+ZnJlZSA9ICh0aGVhZF90ICopIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmZyZWVfbGlzdC5mX3RoZWFkOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5mcmVlX2xpc3QuZl90aGVhZCA9IHB0cjsKLSNlbHNlCi0gIGZyZWUgKChQVFJfVCkgcHRyKTsKLSNlbmRpZgotfQotDAotc3RhdGljIGxpbmVub19saXN0X3QgKgotYWxsb2NhdGVfbGluZW5vX2xpc3QgKCkKLXsKLSAgcmVnaXN0ZXIgbGluZW5vX2xpc3RfdCAqcHRyOwotICBzdGF0aWMgbGluZW5vX2xpc3RfdCBpbml0aWFsX2xpbmVub19saXN0OwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAobGluZW5vX2xpc3RfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT5saW5lbm9bLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9IChsaW5lbm9fbGlzdF90ICopIHhtYWxsb2MgKHNpemVvZiAobGluZW5vX2xpc3RfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfbGluZW5vX2xpc3Q7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLXZvaWQKLWVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSAoc3opCi0gICAgIGludCBzejsKLXsKLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAwKQotICAgIHJldHVybjsKLQotICBjdXJfcHJvY19wdHItPnBkci5ncF9wcm9sb2d1ZSA9IHN6OwotICBpZiAoY3VyX3Byb2NfcHRyLT5wZHIuZ3BfcHJvbG9ndWUgIT0gc3opCi0gICAgewotICAgICAgYXNfd2FybiAoXygiR1AgcHJvbG9ndWUgc2l6ZSBleGNlZWRzIGZpZWxkIHNpemUsIHVzaW5nIDAgaW5zdGVhZCIpKTsKLSAgICAgIGN1cl9wcm9jX3B0ci0+cGRyLmdwX3Byb2xvZ3VlID0gMDsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZ3BfdXNlZCA9IDE7Ci19Ci0KLWludCAKLWVjb2ZmX25vX2N1cnJlbnRfZmlsZSAoKQotewotICByZXR1cm4gY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTDsKLX0KLQotdm9pZAotZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKQotewotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICBjaGFyICpmaWxlbmFtZTsKLSAgbGluZW5vX2xpc3RfdCAqbGlzdDsKLQotICBhc193aGVyZSAoJmZpbGVuYW1lLCAmbGluZW5vKTsKLQotICBpZiAoY3VycmVudF9zdGFic19maWxlbmFtZSA9PSAoY2hhciAqKU5VTEwKLSAgICAgIHx8IHN0cmNtcCAoY3VycmVudF9zdGFic19maWxlbmFtZSwgZmlsZW5hbWUpKQotICAgIGFkZF9maWxlIChmaWxlbmFtZSwgMCwgMSk7Ci0KLSAgbGlzdCA9IGFsbG9jYXRlX2xpbmVub19saXN0ICgpOwotCi0gIGxpc3QtPm5leHQgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICBsaXN0LT5maWxlID0gY3VyX2ZpbGVfcHRyOwotICBsaXN0LT5wcm9jID0gY3VyX3Byb2NfcHRyOwotICBsaXN0LT5mcmFnID0gZnJhZ19ub3c7Ci0gIGxpc3QtPnBhZGRyID0gZnJhZ19ub3dfZml4ICgpOwotICBsaXN0LT5saW5lbm8gPSBsaW5lbm87Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBtZXJnZSBmaWxlcyB3aGljaCBoYXZlIGxpbmUgbnVtYmVycy4gICovCi0gIGN1cl9maWxlX3B0ci0+ZmRyLmZNZXJnZSA9IDA7Ci0KLSAgLyogQSAubG9jIGRpcmVjdGl2ZSB3aWxsIHNvbWV0aW1lcyBhcHBlYXIgYmVmb3JlIGEgLmVudCBkaXJlY3RpdmUsCi0gICAgIHdoaWNoIG1lYW5zIHRoYXQgY3VyX3Byb2NfcHRyIHdpbGwgYmUgTlVMTCBoZXJlLiAgQXJyYW5nZSB0bwotICAgICBwYXRjaCB0aGlzIHVwLiAgKi8KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgbGluZW5vX2xpc3RfdCAqKnBsOwotCi0gICAgICBwbCA9ICZub3Byb2NfbGluZW5vOwotICAgICAgd2hpbGUgKCpwbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotICAgICAgICBwbCA9ICYoKnBsKS0+bmV4dDsKLSAgICAgICpwbCA9IGxpc3Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGFzdF9saW5lbm8gPSBsaXN0OwotICAgICAgKmxhc3RfbGluZW5vX3B0ciA9IGxpc3Q7Ci0gICAgICBsYXN0X2xpbmVub19wdHIgPSAmbGlzdC0+bmV4dDsKLSAgICB9Ci19Ci0KLSNlbHNlCi0KLXZvaWQKLWVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gKCkKLXsKLX0KLQotI2VuZGlmIC8qIEVDT0ZGX0RFQlVHR0lORyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Vjb2ZmLmggYi9nYXMvZWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjNjVmOC4uMDAwMDAwMAotLS0gYS9nYXMvZWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKiBlY29mZi5oIC0tIGhlYWRlciBmaWxlIGZvciBFQ09GRiBkZWJ1Z2dpbmcgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFB1dCB0b2dldGhlciBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgR0FTX0VDT0ZGX0gKLSNkZWZpbmUgR0FTX0VDT0ZGX0gKLQotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBzZWVuIGFueSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGludCBlY29mZl9kZWJ1Z2dpbmdfc2VlbjsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhc3NlbWJseSwgYnkKLSAgIG9ial9yZWFkX2JlZ2luX2hvb2suICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfcmVhZF9iZWdpbl9ob29rIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBzd2l0Y2hlcyB0byBhIG5ldwotICAgZmlsZS4gICovCi1leHRlcm4gdm9pZCBlY29mZl9uZXdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBuZXcgc3ltYm9sIGlzIGNyZWF0ZWQsIGJ5Ci0gICBvYmpfc3ltYm9sX25ld19ob29rLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX3N5bWJvbF9uZXdfaG9vayBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBvYmpfZnJvYl9zeW1ib2wgaG9vay4gICovCi1leHRlcm4gdm9pZCBlY29mZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogQnVpbGQgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieQotICAgb2JqX2Zyb2JfZmlsZS4gIFRoaXMgZmlsbHMgaW4gdGhlIGNvdW50cyBpbiAqSERSOyB0aGUgb2Zmc2V0cyBhcmUKLSAgIGZpbGxlZCBpbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlICpCVUZQLiAgSXQgc2V0cyAqQlVGUCB0byBhCi0gICBibG9jayBvZiBtZW1vcnkgaG9sZGluZyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSXQgcmV0dXJucyB0aGUKLSAgIGxlbmd0aCBvZiAqQlVGUC4gICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9kZWJ1ZwotICBQQVJBTVMgKChIRFJSICpoZHIsIGNoYXIgKipidWZwLCBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqKSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBkaXJlY3RpdmVzLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9iZWdpbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9iZW5kIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2VuZCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9lbnQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZm1hc2sgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZnJhbWUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfbG9jIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX21hc2sgUEFSQU1TICgoaW50KSk7Ci0KLS8qIE90aGVyIEVDT0ZGIGRpcmVjdGl2ZXMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2V4dGVybiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0IFBBUkFNUyAoKGludCkpOwotCi0vKiBGdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBDT0ZGIGRlYnVnZ2luZyBkaXJlY3RpdmVzLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9kZWYgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZGltIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2VuZGVmIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2ZpbGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfc2NsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3NpemUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfdGFnIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3R5cGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfdmFsIFBBUkFNUyAoKGludCkpOwotCi0vKiBIYW5kbGUgc3RhYnMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfc3RhYiBQQVJBTVMgKChzZWdUIHNlYywgaW50IHdoYXQsIGNvbnN0IGNoYXIgKnN0cmluZywKLQkJCQlpbnQgdHlwZSwgaW50IG90aGVyLCBpbnQgZGVzYykpOwotCi0vKiBTZXQgdGhlIEdQIHByb2xvZ3VlIHNpemUuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplIFBBUkFNUyAoKGludCBzeikpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIEVDT0ZGIGNvZGUgdG8gc2V0IHRoZSBleHRlcm5hbAotICAgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLSNpZm5kZWYgb2JqX2Vjb2ZmX3NldF9leHQKLWV4dGVybiB2b2lkIG9ial9lY29mZl9zZXRfZXh0IFBBUkFNUyAoKHN5bWJvbFMgKiwgRVhUUiAqKSk7Ci0jZW5kaWYKLQotLyogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcGF0Y2ggdXAgYSBsaW5lIG51bWJlciBkaXJlY3RpdmUgd2hlbgotICAgaW5zdHJ1Y3Rpb25zIGFyZSBtb3ZlZCBhcm91bmQuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZml4X2xvYyBQQVJBTVMgKChmcmFnUyAqLCB1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gcmVhZC5jIHRvIHBlZWsgYXQgY3VyX2ZpbGVfcHRyLiAgKi8KLWV4dGVybiBpbnQgZWNvZmZfbm9fY3VycmVudF9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHByb2MuICAqLwotZXh0ZXJuIHN5bWJvbFMgKmVjb2ZmX2dldF9jdXJfcHJvY19zeW0gUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogRUNPRkZfREVCVUdHSU5HICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSByZWFkLmMgdG8gZ2VuZXJhdGUgbGluZSBudW1iZXIgZm9yIC5zIGZpbGUuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiAhIEdBU19FQ09GRl9IICovCmRpZmYgLS1naXQgYS9nYXMvZWhvcHQuYyBiL2dhcy9laG9wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGE1ZjYyLi4wMDAwMDAwCi0tLSBhL2dhcy9laG9wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qIGVob3B0LmMtLW9wdGltaXplIGdjYyBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLS8qIFdlIGluY2x1ZGUgdGhpcyBFTEYgZmlsZSwgZXZlbiB0aG91Z2ggd2UgbWF5IG5vdCBiZSBhc3NlbWJsaW5nIGZvcgotICAgRUxGLCBzaW5jZSB0aGUgZXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uIGlzIGFsd2F5cyBpbiBhIGZvcm1hdAotICAgZGVyaXZlZCBmcm9tIERXQVJGLiAgKi8KLQotI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKLQotLyogVHJ5IHRvIG9wdGltaXplIGdjYyAyLjggZXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uLgotCi0gICBFeGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gaXMgZW1pdHRlZCBmb3IgZXZlcnkgZnVuY3Rpb24gaW4gdGhlCi0gICAuZWhfZnJhbWUgc2VjdGlvbi4gIFNpbXBsZSBpbmZvcm1hdGlvbiBmb3IgYSBmdW5jdGlvbiB3aXRoIG5vCi0gICBleGNlcHRpb25zIGxvb2tzIGxpa2UgdGhpczoKLQotX19GUkFNRV9CRUdJTl9fOgotCS40Ynl0ZQkuTExDSUUxCS8gTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQotLkxTQ0lFMToKLQkuNGJ5dGUJMHgwCS8gQ0lFIElkZW50aWZpZXIgVGFnCi0JLmJ5dGUJMHgxCS8gQ0lFIFZlcnNpb24KLQkuYnl0ZQkweDAJLyBDSUUgQXVnbWVudGF0aW9uIChub25lKQotCS5ieXRlCTB4MQkvIFVMRUIxMjggMHgxIChDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yKQotCS5ieXRlCTB4N2MJLyBTTEVCMTI4IC00IChDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yKQotCS5ieXRlCTB4OAkvIENJRSBSQSBDb2x1bW4KLQkuYnl0ZQkweGMJLyBEV19DRkFfZGVmX2NmYQotCS5ieXRlCTB4NAkvIFVMRUIxMjggMHg0Ci0JLmJ5dGUJMHg0CS8gVUxFQjEyOCAweDQKLQkuYnl0ZQkweDg4CS8gRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OAotCS5ieXRlCTB4MQkvIFVMRUIxMjggMHgxCi0JLmFsaWduIDQKLS5MRUNJRTE6Ci0JLnNldAkuTExDSUUxLC5MRUNJRTEtLkxTQ0lFMQkvIENJRSBMZW5ndGggU3ltYm9sCi0JLjRieXRlCS5MTEZERTEJLyBGREUgTGVuZ3RoCi0uTFNGREUxOgotCS40Ynl0ZQkuTFNGREUxLV9fRlJBTUVfQkVHSU5fXwkvIEZERSBDSUUgb2Zmc2V0Ci0JLjRieXRlCS5MRkIxCS8gRkRFIGluaXRpYWwgbG9jYXRpb24KLQkuNGJ5dGUJLkxGRTEtLkxGQjEJLyBGREUgYWRkcmVzcyByYW5nZQotCS5ieXRlCTB4NAkvIERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuNGJ5dGUJLkxDRkkwLS5MRkIxCi0JLmJ5dGUJMHhlCS8gRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0Ci0JLmJ5dGUJMHg4CS8gVUxFQjEyOCAweDgKLQkuYnl0ZQkweDg1CS8gRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NQotCS5ieXRlCTB4MgkvIFVMRUIxMjggMHgyCi0JLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkuTENGSTEtLkxDRkkwCi0JLmJ5dGUJMHhkCS8gRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIKLQkuYnl0ZQkweDUJLyBVTEVCMTI4IDB4NQotCS5ieXRlCTB4NAkvIERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuNGJ5dGUJLkxDRkkyLS5MQ0ZJMQotCS5ieXRlCTB4MmUJLyBEV19DRkFfR05VX2FyZ3Nfc2l6ZQotCS5ieXRlCTB4NAkvIFVMRUIxMjggMHg0Ci0JLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkuTENGSTMtLkxDRkkyCi0JLmJ5dGUJMHgyZQkvIERXX0NGQV9HTlVfYXJnc19zaXplCi0JLmJ5dGUJMHgwCS8gVUxFQjEyOCAweDAKLQkuYWxpZ24gNAotLkxFRkRFMToKLQkuc2V0CS5MTEZERTEsLkxFRkRFMS0uTFNGREUxCS8gRkRFIExlbmd0aCBTeW1ib2wKLQotICAgVGhlIGltbWVkaWF0ZSBpc3N1ZSB3ZSBjYW4gYWRkcmVzcyBpbiB0aGUgYXNzZW1ibGVyIGlzIHRoZQotICAgRFdfQ0ZBX2FkdmFuY2VfbG9jNCBmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSB2YWx1ZS4gIFRoZSB2YWx1ZSBpcwotICAgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGFkZHJlc3NlcyBpbiB0aGUgZnVuY3Rpb24uICBTaW5jZSBnY2MgZG9lcwotICAgbm90IGtub3cgdGhpcyB2YWx1ZSwgaXQgYWx3YXlzIHVzZXMgZm91ciBieXRlcy4gIFdlIHdpbGwga25vdyB0aGUKLSAgIHZhbHVlIGF0IHRoZSBlbmQgb2YgYXNzZW1ibHksIHNvIHdlIGNhbiBkbyBiZXR0ZXIuICAqLwotCi1zdGF0aWMgaW50IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogR2V0IHRoZSBjb2RlIGFsaWdubWVudCBmYWN0b3IgZnJvbSB0aGUgQ0lFLiAgKi8KLQotc3RhdGljIGludAotZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCkKLXsKLSAgc3RhdGljIGludCBjb2RlX2FsaWdubWVudDsKLSAgc2VnVCBjdXJyZW50X3NlZzsKLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZzsKLSAgZnJhZ1MgKmY7Ci0gIGZpeFMgKmZpeDsKLSAgaW50IG9mZnNldDsKLSAgY2hhciBhdWdtZW50YXRpb25bMTBdOwotICBpbnQgaWF1ZzsKLQotICBpZiAoY29kZV9hbGlnbm1lbnQgIT0gMCkKLSAgICByZXR1cm4gY29kZV9hbGlnbm1lbnQ7Ci0KLSAgLyogV2Ugc2hvdWxkIGZpbmQgdGhlIENJRSBhdCB0aGUgc3RhcnQgb2YgdGhlIC5laF9mcmFtZSBzZWN0aW9uLiAgKi8KLQotICBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0gIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgc3Vic2VnX25ldyAoIi5laF9mcmFtZSIsIDApOwotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8IGRlZmluZWQgKE1BTllfU0VHTUVOVFMpCi0gIGYgPSBzZWdfaW5mbyAobm93X3NlZyktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0jZWxzZQotICBmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsKLSNlbmRpZgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZml4ID0gc2VnX2luZm8gKG5vd19zZWcpLT5mcmNoYWluUC0+Zml4X3Jvb3Q7Ci0jZWxzZQotICBmaXggPSAqc2VnX2ZpeF9yb290UDsKLSNlbmRpZgotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgZnJhZ3Mgb2YgdGhlIHNlY3Rpb24gdG8gZmluZCB0aGUgY29kZSBhbGlnbm1lbnQuICAqLwotCi0gIC8qIEZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBDSUUgSWRlbnRpZmllciBUYWcgaXMgMC4gICovCi0KLSAgb2Zmc2V0ID0gNDsKLSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotICAgIHsKLSAgICAgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0gICAgICBmID0gZi0+ZnJfbmV4dDsKLSAgICB9Ci0gIGlmIChmID09IE5VTEwKLSAgICAgIHx8IGYtPmZyX2ZpeCAtIG9mZnNldCA8IDQKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAhPSAwCi0gICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldCArIDFdICE9IDAKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gIT0gMAotICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSAhPSAwKQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIE5leHQgbWFrZSBzdXJlIHRoZSBDSUUgdmVyc2lvbiBudW1iZXIgaXMgMS4gICovCi0KLSAgb2Zmc2V0ICs9IDQ7Ci0gIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKLSAgICB7Ci0gICAgICBvZmZzZXQgLT0gZi0+ZnJfZml4OwotICAgICAgZiA9IGYtPmZyX25leHQ7Ci0gICAgfQotICBpZiAoZiA9PSBOVUxMCi0gICAgICB8fCBmLT5mcl9maXggLSBvZmZzZXQgPCAxCi0gICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldF0gIT0gMSkKLSAgICB7Ci0gICAgICBjb2RlX2FsaWdubWVudCA9IC0xOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBTa2lwIHRoZSBhdWdtZW50YXRpb24gKGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZykuICAqLwotCi0gIGlhdWcgPSAwOwotICArK29mZnNldDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotCXsKLQkgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0JICBmID0gZi0+ZnJfbmV4dDsKLQl9Ci0gICAgICBpZiAoZiA9PSBOVUxMKQotCXsKLQkgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgd2hpbGUgKG9mZnNldCA8IGYtPmZyX2ZpeCAmJiBmLT5mcl9saXRlcmFsW29mZnNldF0gIT0gJ1wwJykKLQl7Ci0JICBpZiAoKHNpemVfdCkgaWF1ZyA8IChzaXplb2YgYXVnbWVudGF0aW9uKSAtIDEpCi0JICAgIHsKLQkgICAgICBhdWdtZW50YXRpb25baWF1Z10gPSBmLT5mcl9saXRlcmFsW29mZnNldF07Ci0JICAgICAgKytpYXVnOwotCSAgICB9Ci0JICArK29mZnNldDsKLQl9Ci0gICAgICBpZiAob2Zmc2V0IDwgZi0+ZnJfZml4KQotCWJyZWFrOwotICAgIH0KLSAgKytvZmZzZXQ7Ci0gIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKLSAgICB7Ci0gICAgICBvZmZzZXQgLT0gZi0+ZnJfZml4OwotICAgICAgZiA9IGYtPmZyX25leHQ7Ci0gICAgfQotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGF1Z21lbnRhdGlvbltpYXVnXSA9ICdcMCc7Ci0gIGlmIChhdWdtZW50YXRpb25bMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBObyBhdWdtZW50YXRpb24uICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhdWdtZW50YXRpb24sICJlaCIpID09IDApCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBza2lwIGEgcG9pbnRlci4gIFVuZm9ydHVuYXRlbHksIHdlIGRvbid0IGtub3cgaG93Ci0JIGxhcmdlIGl0IGlzLiAgV2UgZmluZCBvdXQgYnkgbG9va2luZyBmb3IgYSBtYXRjaGluZyBmaXh1cC4gICovCi0gICAgICB3aGlsZSAoZml4ICE9IE5VTEwKLQkgICAgICYmIChmaXgtPmZ4X2ZyYWcgIT0gZiB8fCBmaXgtPmZ4X3doZXJlICE9IG9mZnNldCkpCi0JZml4ID0gZml4LT5meF9uZXh0OwotICAgICAgaWYgKGZpeCA9PSBOVUxMKQotCW9mZnNldCArPSA0OwotICAgICAgZWxzZQotCW9mZnNldCArPSBmaXgtPmZ4X3NpemU7Ci0gICAgICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCi0JewotCSAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKLQkgIGYgPSBmLT5mcl9uZXh0OwotCX0KLSAgICAgIGlmIChmID09IE5VTEwpCi0JewotCSAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogV2UncmUgbm93IGF0IHRoZSBjb2RlIGFsaWdubWVudCBmYWN0b3IsIHdoaWNoIGlzIGEgVUxFQjEyOC4gIElmCi0gICAgIGl0IGlzbid0IGEgc2luZ2xlIGJ5dGUsIGZvcmdldCBpdC4gICovCi0KLSAgY29kZV9hbGlnbm1lbnQgPSBmLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotICBpZiAoKGNvZGVfYWxpZ25tZW50ICYgMHg4MCkgIT0gMCB8fCBjb2RlX2FsaWdubWVudCA9PSAwKQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBjb2RlX2FsaWdubWVudDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBlbWl0X2V4cHIuICBJdCBsb29rcyBmb3IgY2FzZXMgd2hpY2gKLSAgIHdlIGNhbiBvcHRpbWl6ZS4KLQotICAgUmF0aGVyIHRoYW4gdHJ5IHRvIHBhcnNlIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFzIHdlIHJlYWQgaXQsIHdlCi0gICBsb29rIGZvciBhIHNpbmdsZSBieXRlIERXX0NGQV9hZHZhbmNlX2xvYzQgZm9sbG93ZWQgYnkgYSA0IGJ5dGUKLSAgIGRpZmZlcmVuY2UuICBXZSB0dXJuIHRoYXQgaW50byBhIHJzX2NmYV9hZHZhbmNlIGZyYWcsIGFuZCBoYW5kbGUKLSAgIHRob3NlIGZyYWdzIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LiAgSWYgdGhlIGdjYyBvdXRwdXQgY2hhbmdlcwotICAgc29tZXdoYXQsIHRoaXMgb3B0aW1pemF0aW9uIG1heSBzdG9wIHdvcmtpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiBpdCBoYW5kbGVkIHRoZSBleHByZXNzaW9uIGFuZAotICAgZW1pdF9leHByIHNob3VsZCBub3QgZG8gYW55dGhpbmcsIG9yIHplcm8gb3RoZXJ3aXNlLiAgSXQgY2FuIGFsc28KLSAgIGNoYW5nZSAqRVhQIGFuZCAqUE5CWVRFUy4gICovCi0KLWludAotY2hlY2tfZWhfZnJhbWUgKGV4cCwgcG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50ICpwbmJ5dGVzOwotewotICBzdGF0aWMgaW50IHNhd19zaXplOwotICBzdGF0aWMgc3ltYm9sUyAqc2l6ZV9lbmRfc3ltOwotICBzdGF0aWMgaW50IHNhd19hZHZhbmNlX2xvYzQ7Ci0gIHN0YXRpYyBmcmFnUyAqbG9jNF9mcmFnOwotICBzdGF0aWMgaW50IGxvYzRfZml4OwotCi0gIGlmIChzYXdfc2l6ZQotICAgICAgJiYgU19JU19ERUZJTkVEIChzaXplX2VuZF9zeW0pKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgY29tZSB0byB0aGUgZW5kIG9mIHRoZSBDSUUgb3IgRkRFLiAgU2VlIGJlbG93IHdoZXJlCi0gICAgICAgICB3ZSBzZXQgc2F3X3NpemUuICBXZSBtdXN0IGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZSB3ZSBtYXkgbm93Ci0gICAgICAgICBiZSBsb29raW5nIGF0IHRoZSBuZXh0IHNpemUuICAqLwotICAgICAgc2F3X3NpemUgPSAwOwotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0gICAgfQotCi0gIGlmIChmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBvcHRpbWl6ZS4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZWhfZnJhbWUiKSAhPSAwKQotICAgIHsKLSAgICAgIHNhd19zaXplID0gMDsKLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoISBzYXdfc2l6ZQotCSAgICYmICpwbmJ5dGVzID09IDQpCi0gICAgewotICAgICAgLyogVGhpcyBtaWdodCBiZSB0aGUgc2l6ZSBvZiB0aGUgQ0lFIG9yIEZERS4gIFdlIHdhbnQgdG8ga25vdwotICAgICAgICAgdGhlIHNpemUgc28gdGhhdCB3ZSBkb24ndCBhY2NpZGVudGFsbHkgb3B0aW1pemUgYWNyb3NzIGFuIEZERQotICAgICAgICAgYm91bmRhcnkuICBXZSByZWNvZ25pemUgdGhlIHNpemUgaW4gb25lIG9mIHR3byBmb3JtczogYQotICAgICAgICAgc3ltYm9sIHdoaWNoIHdpbGwgbGF0ZXIgYmUgZGVmaW5lZCBhcyBhIGRpZmZlcmVuY2UsIG9yIGEKLSAgICAgICAgIHN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzLiAgRWl0aGVyIHdheSwgd2UgY2FuIHRlbGwgd2hlbiB3ZQotICAgICAgICAgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIEZERSBiZWNhdXNlIHRoZSBzeW1ib2wgYmVjb21lcyBkZWZpbmVkCi0gICAgICAgICAoaW4gdGhlIGNhc2Ugb2YgYSBzdWJ0cmFjdGlvbiwgdGhlIGVuZCBzeW1ib2wsIGZyb20gd2hpY2ggdGhlCi0gICAgICAgICBzdGFydCBzeW1ib2wgaXMgYmVpbmcgc3VidHJhY3RlZCkuICBPdGhlciB3YXlzIG9mIGRlc2NyaWJpbmcKLSAgICAgICAgIHRoZSBzaXplIHdpbGwgbm90IGJlIG9wdGltaXplZC4gICovCi0gICAgICBpZiAoKGV4cC0+WF9vcCA9PSBPX3N5bWJvbCB8fCBleHAtPlhfb3AgPT0gT19zdWJ0cmFjdCkKLQkgICYmICEgU19JU19ERUZJTkVEIChleHAtPlhfYWRkX3N5bWJvbCkpCi0JewotCSAgc2F3X3NpemUgPSAxOwotCSAgc2l6ZV9lbmRfc3ltID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc2F3X3NpemUKLQkgICAmJiAqcG5ieXRlcyA9PSAxCi0JICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSBEV19DRkFfYWR2YW5jZV9sb2M0KQotICAgIHsKLSAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBEV19DRkFfYWR2YW5jZV9sb2M0LiAgUmVjb3JkIHRoZSBmcmFnIGFuZCB0aGUKLSAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiB0aGUgZnJhZywgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIGl0IGxhdGVyLiAgKi8KLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAxOwotICAgICAgZnJhZ19ncm93ICgxKTsKLSAgICAgIGxvYzRfZnJhZyA9IGZyYWdfbm93OwotICAgICAgbG9jNF9maXggPSBmcmFnX25vd19maXggKCk7Ci0gICAgfQotICBlbHNlIGlmIChzYXdfYWR2YW5jZV9sb2M0Ci0JICAgJiYgKnBuYnl0ZXMgPT0gNAotCSAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGludCBjYTsKLQotICAgICAgLyogVGhpcyBpcyBhIGNhc2Ugd2hpY2ggd2UgY2FuIG9wdGltaXplLiAgVGhlIHR3byBzeW1ib2xzIGJlaW5nCi0gICAgICAgICBzdWJ0cmFjdGVkIHdlcmUgaW4gdGhlIHNhbWUgZnJhZyBhbmQgdGhlIGV4cHJlc3Npb24gd2FzCi0gICAgICAgICByZWR1Y2VkIHRvIGEgY29uc3RhbnQuICBXZSBjYW4gZG8gdGhlIG9wdGltaXphdGlvbiBlbnRpcmVseQotICAgICAgICAgaW4gdGhpcyBmdW5jdGlvbi4gICovCi0KLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOwotCi0gICAgICBjYSA9IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50ICgpOwotICAgICAgaWYgKGNhIDwgMCkKLQl7Ci0JICAvKiBEb24ndCBvcHRpbWl6ZS4gICovCi0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9udW1iZXIgJSBjYSA9PSAwCi0JICAgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyIC8gY2EgPCAweDQwKQotCXsKLQkgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0KLQkgICAgPSBEV19DRkFfYWR2YW5jZV9sb2MgfCAoZXhwLT5YX2FkZF9udW1iZXIgLyBjYSk7Ci0JICAvKiBObyBtb3JlIGJ5dGVzIG5lZWRlZC4gICovCi0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChleHAtPlhfYWRkX251bWJlciA8IDB4MTAwKQotCXsKLQkgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MxOwotCSAgKnBuYnl0ZXMgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMjsKLQkgICpwbmJ5dGVzID0gMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzYXdfYWR2YW5jZV9sb2M0Ci0JICAgJiYgKnBuYnl0ZXMgPT0gNAotCSAgICYmIGV4cC0+WF9vcCA9PSBPX3N1YnRyYWN0KQotICAgIHsKLQotICAgICAgLyogVGhpcyBpcyBhIGNhc2Ugd2UgY2FuIG9wdGltaXplLiAgVGhlIGV4cHJlc3Npb24gd2FzIG5vdAotICAgICAgICAgcmVkdWNlZCwgc28gd2UgY2FuIG5vdCBmaW5pc2ggdGhlIG9wdGltaXphdGlvbiB1bnRpbCB0aGUgZW5kCi0gICAgICAgICBvZiB0aGUgYXNzZW1ibHkuICBXZSBzZXQgdXAgYSB2YXJpYW50IGZyYWcgd2hpY2ggd2UgaGFuZGxlCi0gICAgICAgICBsYXRlci4gICovCi0KLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOwotCi0gICAgICBmcmFnX3ZhciAocnNfY2ZhLCA0LCAwLCAwLCBtYWtlX2V4cHJfc3ltYm9sIChleHApLAotCQlsb2M0X2ZpeCwgKGNoYXIgKikgbG9jNF9mcmFnKTsKLQotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIHNpemUgb2YgYSByc19jZmEgdmFyaWFudCBmcmFnIGJhc2VkIG9uCi0gICB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMuICBJdCBpcyBjYWxsZWQgYmVmb3JlIHRoZQotICAgcmVsYXhhdGlvbiBsb29wLiAgV2Ugc2V0IGZyX3N1YnR5cGUgdG8gdGhlIGV4cGVjdGVkIGxlbmd0aC4gICovCi0KLWludAotZWhfZnJhbWVfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBpbnQgY2E7Ci0gIG9mZnNldFQgZGlmZjsKLSAgaW50IHJldDsKLQotICBjYSA9IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50ICgpOwotICBkaWZmID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWctPmZyX3N5bWJvbCwgMCk7Ci0KLSAgaWYgKGNhIDwgMCkKLSAgICByZXQgPSA0OwotICBlbHNlIGlmIChkaWZmICUgY2EgPT0gMCAmJiBkaWZmIC8gY2EgPCAweDQwKQotICAgIHJldCA9IDA7Ci0gIGVsc2UgaWYgKGRpZmYgPCAweDEwMCkKLSAgICByZXQgPSAxOwotICBlbHNlIGlmIChkaWZmIDwgMHgxMDAwMCkKLSAgICByZXQgPSAyOwotICBlbHNlCi0gICAgcmV0ID0gNDsKLQotICBmcmFnLT5mcl9zdWJ0eXBlID0gcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmVsYXhlcyBhIHJzX2NmYSB2YXJpYW50IGZyYWcgYmFzZWQgb24gdGhlIGN1cnJlbnQKLSAgIHZhbHVlcyBvZiB0aGUgc3ltYm9scy4gIGZyX3N1YnR5cGUgaXMgdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZQotICAgZnJhZy4gIFRoaXMgcmV0dXJucyB0aGUgY2hhbmdlIGluIGZyYWcgbGVuZ3RoLiAgKi8KLQotaW50Ci1laF9mcmFtZV9yZWxheF9mcmFnIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaW50IG9sZHNpemUsIG5ld3NpemU7Ci0KLSAgb2xkc2l6ZSA9IGZyYWctPmZyX3N1YnR5cGU7Ci0gIG5ld3NpemUgPSBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZyk7Ci0gIHJldHVybiBuZXdzaXplIC0gb2xkc2l6ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHJzX2NmYSB2YXJpYW50IGZyYWcgaW50byBhIG5vcm1hbCBmaWxsCi0gICBmcmFnLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHJlbGF4YXRpb24gaGFzIGJlZW4gZG9uZS4KLSAgIGZyX3N1YnR5cGUgd2lsbCBiZSB0aGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIGZyYWcuICAqLwotCi12b2lkCi1laF9mcmFtZV9jb252ZXJ0X2ZyYWcgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBvZmZzZXRUIGRpZmY7Ci0gIGZyYWdTICpsb2M0X2ZyYWc7Ci0gIGludCBsb2M0X2ZpeDsKLQotICBsb2M0X2ZyYWcgPSAoZnJhZ1MgKikgZnJhZy0+ZnJfb3Bjb2RlOwotICBsb2M0X2ZpeCA9IChpbnQpIGZyYWctPmZyX29mZnNldDsKLQotICBkaWZmID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWctPmZyX3N5bWJvbCwgMSk7Ci0KLSAgaWYgKGZyYWctPmZyX3N1YnR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgY2E7Ci0KLSAgICAgIGNhID0gZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCk7Ci0gICAgICBhc3NlcnQgKGNhID4gMCAmJiBkaWZmICUgY2EgPT0gMCAmJiBkaWZmIC8gY2EgPCAweDQwKTsKLSAgICAgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MgfCAoZGlmZiAvIGNhKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWctPmZyX3N1YnR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGRpZmYgPCAweDEwMCk7Ci0gICAgICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMTsKLSAgICAgIGZyYWctPmZyX2xpdGVyYWxbZnJhZy0+ZnJfZml4XSA9IGRpZmY7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgYXNzZXJ0IChkaWZmIDwgMHgxMDAwMCk7Ci0gICAgICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMjsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZy0+ZnJfbGl0ZXJhbCArIGZyYWctPmZyX2ZpeCwgZGlmZiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnLT5mcl9saXRlcmFsICsgZnJhZy0+ZnJfZml4LCBkaWZmLCA0KTsKLQotICBmcmFnLT5mcl9maXggKz0gZnJhZy0+ZnJfc3VidHlwZTsKLSAgZnJhZy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0gIGZyYWctPmZyX29mZnNldCA9IDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvZW11bC10YXJnZXQuaCBiL2dhcy9lbXVsLXRhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzA0MDUwLi4wMDAwMDAwCi0tLSBhL2dhcy9lbXVsLXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotI2lmbmRlZiBlbXVsX2luaXQKLSNkZWZpbmUgZW11bF9pbml0CQkJY29tbW9uX2VtdWxfaW5pdAotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2JmZF9uYW1lCQkJZGVmYXVsdF9lbXVsX2JmZF9uYW1lCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2xvY2FsX2xhYmVsc19mYgotI2RlZmluZSBlbXVsX2xvY2FsX2xhYmVsc19mYgkJMAotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9sb2NhbF9sYWJlbHNfZG9sbGFyCi0jZGVmaW5lIGVtdWxfbG9jYWxfbGFiZWxzX2RvbGxhcgkwCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2xlYWRpbmdfdW5kZXJzY29yZQotI2RlZmluZSBlbXVsX2xlYWRpbmdfdW5kZXJzY29yZQkJMgotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9zdHJpcF91bmRlcnNjb3JlCi0jZGVmaW5lIGVtdWxfc3RyaXBfdW5kZXJzY29yZQkJMAotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9kZWZhdWx0X2VuZGlhbgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuCQkyCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2Zha2VfbGFiZWxfbmFtZQotI2RlZmluZSBlbXVsX2Zha2VfbGFiZWxfbmFtZQkJMAotI2VuZGlmCi0KLXN0cnVjdCBlbXVsYXRpb24gZW11bF9zdHJ1Y3RfbmFtZSA9IHsKLSAgMCwKLSAgZW11bF9uYW1lLAotICBlbXVsX2luaXQsCi0gIGVtdWxfYmZkX25hbWUsCi0gIGVtdWxfbG9jYWxfbGFiZWxzX2ZiLCBlbXVsX2xvY2FsX2xhYmVsc19kb2xsYXIsCi0gIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlLCBlbXVsX3N0cmlwX3VuZGVyc2NvcmUsCi0gIGVtdWxfZGVmYXVsdF9lbmRpYW4sCi0gIGVtdWxfZmFrZV9sYWJlbF9uYW1lLAotICBlbXVsX2Zvcm1hdCwKLX07CmRpZmYgLS1naXQgYS9nYXMvZW11bC5oIGIvZ2FzL2VtdWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjNDZkOC4uMDAwMDAwMAotLS0gYS9nYXMvZW11bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2lmbmRlZiBFTVVMX0RFRlMKLSNkZWZpbmUgRU1VTF9ERUZTCi0KLXN0cnVjdCBlbXVsYXRpb24gewotICB2b2lkICgqbWF0Y2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotICBjb25zdCBjaGFyICpuYW1lOwotICB2b2lkICgqaW5pdCkgUEFSQU1TICgodm9pZCkpOwotICBjb25zdCBjaGFyICooKmJmZF9uYW1lKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIHVuc2lnbmVkIGxvY2FsX2xhYmVsc19mYiA6IDE7Ci0gIHVuc2lnbmVkIGxvY2FsX2xhYmVsc19kb2xsYXIgOiAxOwotICB1bnNpZ25lZCBsZWFkaW5nX3VuZGVyc2NvcmUgOiAyOwotICB1bnNpZ25lZCBzdHJpcF91bmRlcnNjb3JlIDogMTsKLSAgdW5zaWduZWQgZGVmYXVsdF9lbmRpYW4gOiAyOwotICBjb25zdCBjaGFyICpmYWtlX2xhYmVsX25hbWU7Ci0gIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzICpmb3JtYXQ7Ci19OwotCi1DT01NT04gc3RydWN0IGVtdWxhdGlvbiAqdGhpc19lbXVsYXRpb247Ci0KLWV4dGVybiBjb25zdCBjaGFyICpkZWZhdWx0X2VtdWxfYmZkX25hbWUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgY29tbW9uX2VtdWxfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2V4cHIuYyBiL2dhcy9leHByLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDEyMzkuLjAwMDAwMDAKLS0tIGEvZ2FzL2V4cHIuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MDQgKzAsMCBAQAotLyogZXhwci5jIC1vcGVyYW5kcywgZXhwcmVzc2lvbnMtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0gKiBUaGlzIGlzIHJlYWxseSBhIGJyYW5jaCBvZmZpY2Ugb2YgYXMtcmVhZC5jLiBJIHNwbGl0IGl0IG91dCB0byBjbGVhcmx5Ci0gKiBkaXN0aW5ndWlzaCB0aGUgd29ybGQgb2YgZXhwcmVzc2lvbnMgZnJvbSB0aGUgd29ybGQgb2Ygc3RhdGVtZW50cy4KLSAqIChJdCBhbHNvIGdpdmVzIHNtYWxsZXIgZmlsZXMgdG8gcmUtY29tcGlsZS4pCi0gKiBIZXJlLCAib3BlcmFuZCJzIGFyZSBvZiBleHByZXNzaW9ucywgbm90IGluc3RydWN0aW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgbWluKGEsIGIpICAgICAgICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotc3RhdGljIHZvaWQgZmxvYXRpbmdfY29uc3RhbnQgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotc3RhdGljIHZhbHVlVCBnZW5lcmljX2JpZ251bV90b19pbnQzMiBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZkZWYgQkZENjQKLXN0YXRpYyB2YWx1ZVQgZ2VuZXJpY19iaWdudW1fdG9faW50NjQgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBpbnRlZ2VyX2NvbnN0YW50IFBBUkFNUyAoKGludCByYWRpeCwgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotc3RhdGljIHZvaWQgbXJpX2NoYXJfY29uc3RhbnQgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgY3VycmVudF9sb2NhdGlvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbl91cF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLXN0YXRpYyBzZWdUIG9wZXJhbmQgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIG9wZXJhdG9yVCBvcGVyYXRvciBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiBjb25zdCBjaGFyIEVYUF9DSEFSU1tdLCBGTFRfQ0hBUlNbXTsKLQotLyogV2Uga2VlcCBhIG1hcHBpbmcgb2YgZXhwcmVzc2lvbiBzeW1ib2xzIHRvIGZpbGUgcG9zaXRpb25zLCBzbyB0aGF0Ci0gICB3ZSBjYW4gcHJvdmlkZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuICAqLwotCi1zdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZQotewotICBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbmV4dDsKLSAgc3ltYm9sUyAqc3ltOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqZXhwcl9zeW1ib2xfbGluZXM7Ci0MCi0vKiBCdWlsZCBhIGR1bW15IHN5bWJvbCB0byBob2xkIGEgY29tcGxleCBleHByZXNzaW9uLiAgVGhpcyBpcyBob3cgd2UKLSAgIGJ1aWxkIGV4cHJlc3Npb25zIHVwIG91dCBvZiBvdGhlciBleHByZXNzaW9ucy4gIFRoZSBzeW1ib2wgaXMgcHV0Ci0gICBpbnRvIHRoZSBmYWtlIHNlY3Rpb24gZXhwcl9zZWN0aW9uLiAgKi8KLQotc3ltYm9sUyAqCi1tYWtlX2V4cHJfc3ltYm9sIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBleHByZXNzaW9uUyB6ZXJvOwotICBjb25zdCBjaGFyICpmYWtlOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbjsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICByZXR1cm4gZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbDsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgLyogVGhpcyB3b24ndCB3b3JrLCBiZWNhdXNlIHRoZSBhY3R1YWwgdmFsdWUgaXMgc3RvcmVkIGluCi0gICAgICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciBvciBnZW5lcmljX2JpZ251bSwgYW5kIHdlIGFyZQotICAgICAgICAgZ29pbmcgdG8gbG9zZSBpdCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICB6ZXJvLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgemVyby5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgemVyby5YX3Vuc2lnbmVkID0gMDsKLSAgICAgIGNsZWFuX3VwX2V4cHJlc3Npb24gKCZ6ZXJvKTsKLSAgICAgIGV4cHJlc3Npb25QID0gJnplcm87Ci0gICAgfQotCi0gIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0KLSAgLyogUHV0dGluZyBjb25zdGFudCBzeW1ib2xzIGluIGFic29sdXRlX3NlY3Rpb24gcmF0aGVyIHRoYW4KLSAgICAgZXhwcl9zZWN0aW9uIGlzIGNvbnZlbmllbnQgZm9yIHRoZSBvbGQgYS5vdXQgY29kZSwgZm9yIHdoaWNoCi0gICAgIFNfR0VUX1NFR01FTlQgZG9lcyBub3QgYWx3YXlzIHJldHJpZXZlIHRoZSB2YWx1ZSBwdXQgaW4gYnkKLSAgICAgU19TRVRfU0VHTUVOVC4gICovCi0gIHN5bWJvbFAgPSBzeW1ib2xfY3JlYXRlIChmYWtlLAotCQkJICAgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQKLQkJCSAgICA/IGFic29sdXRlX3NlY3Rpb24KLQkJCSAgICA6IGV4cHJfc2VjdGlvbiksCi0JCQkgICAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsIGV4cHJlc3Npb25QKTsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLSAgbiA9IChzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5zeW0gPSBzeW1ib2xQOwotICBhc193aGVyZSAoJm4tPmZpbGUsICZuLT5saW5lKTsKLSAgbi0+bmV4dCA9IGV4cHJfc3ltYm9sX2xpbmVzOwotICBleHByX3N5bWJvbF9saW5lcyA9IG47Ci0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0KLS8qIFJldHVybiB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZm9yIGFuIGV4cHIgc3ltYm9sLiAgUmV0dXJuCi0gICBub24temVybyBpZiBzb21ldGhpbmcgd2FzIGZvdW5kLCAwIGlmIG5vIGluZm9ybWF0aW9uIGlzIGtub3duIGZvcgotICAgdGhlIHN5bWJvbC4gICovCi0KLWludAotZXhwcl9zeW1ib2xfd2hlcmUgKHN5bSwgcGZpbGUsIHBsaW5lKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGNoYXIgKipwZmlsZTsKLSAgICAgdW5zaWduZWQgaW50ICpwbGluZTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKmw7Ci0KLSAgZm9yIChsID0gZXhwcl9zeW1ib2xfbGluZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnN5bSA9PSBzeW0pCi0JewotCSAgKnBmaWxlID0gbC0+ZmlsZTsKLQkgICpwbGluZSA9IGwtPmxpbmU7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotDAotLyogVXRpbGl0aWVzIGZvciBidWlsZGluZyBleHByZXNzaW9ucy4KLSAgIFNpbmNlIGNvbXBsZXggZXhwcmVzc2lvbnMgYXJlIHJlY29yZGVkIGFzIHN5bWJvbHMgZm9yIHVzZSBpbiBvdGhlcgotICAgZXhwcmVzc2lvbnMgdGhlc2UgcmV0dXJuIGEgc3ltYm9sUyAqIGFuZCBub3QgYW4gZXhwcmVzc2lvblMgKi4KLSAgIFRoZXNlIGV4cGxpY2l0bHkgZG8gbm90IHRha2UgYW4gImFkZF9udW1iZXIiIGFyZ3VtZW50LiAgKi8KLS8qID8/PyBGb3IgY29tcGxldGVuZXNzJyBzYWtlIG9uZSBtaWdodCB3YW50IGV4cHJfYnVpbGRfc3ltYm9sLgotICAgSXQgd291bGQganVzdCByZXR1cm4gaXRzIGFyZ3VtZW50LiAgKi8KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgYW4gdW5zaWduZWQgY29uc3RhbnQuCi0gICBUaGUgY29ycmVzcG9uZGluZyBvbmUgZm9yIHNpZ25lZCBjb25zdGFudHMgaXMgbWlzc2luZyBiZWNhdXNlCi0gICB0aGVyZSdzIGN1cnJlbnRseSBubyBuZWVkIGZvciBpdC4gIE9uZSBjb3VsZCBhZGQgYW4gdW5zaWduZWRfcCBmbGFnCi0gICBidXQgdGhhdCBzZWVtcyBtb3JlIGNsdW1zeS4gICovCi0KLXN5bWJvbFMgKgotZXhwcl9idWlsZF91Y29uc3RhbnQgKHZhbHVlKQotICAgICBvZmZzZXRUIHZhbHVlOwotewotICBleHByZXNzaW9uUyBlOwotCi0gIGUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGUuWF9hZGRfbnVtYmVyID0gdmFsdWU7Ci0gIGUuWF91bnNpZ25lZCA9IDE7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIE9QIHMxLiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX3VuYXJ5IChvcCwgczEpCi0gICAgIG9wZXJhdG9yVCBvcDsKLSAgICAgc3ltYm9sUyAqczE7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0KLSAgZS5YX29wID0gb3A7Ci0gIGUuWF9hZGRfc3ltYm9sID0gczE7Ci0gIGUuWF9hZGRfbnVtYmVyID0gMDsKLSAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKLX0KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgczEgT1AgczIuICAqLwotCi1zeW1ib2xTICoKLWV4cHJfYnVpbGRfYmluYXJ5IChvcCwgczEsIHMyKQotICAgICBvcGVyYXRvclQgb3A7Ci0gICAgIHN5bWJvbFMgKnMxOwotICAgICBzeW1ib2xTICpzMjsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLQotICBlLlhfb3AgPSBvcDsKLSAgZS5YX2FkZF9zeW1ib2wgPSBzMTsKLSAgZS5YX29wX3N5bWJvbCA9IHMyOwotICBlLlhfYWRkX251bWJlciA9IDA7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uICgnLicpLiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX2RvdCAoKQotewotICBleHByZXNzaW9uUyBlOwotCi0gIGN1cnJlbnRfbG9jYXRpb24gKCZlKTsKLSAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKLX0KLQwKLS8qCi0gKiBCdWlsZCBhbnkgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbCBoZXJlLgotICogQWxzbyBidWlsZCBhbnkgYmlnbnVtIGxpdGVyYWwgaGVyZS4KLSAqLwotCi0vKiBTZWVtcyBhdG9mX21hY2hpbmUgY2FuIGJhY2tzY2FuIHRocm91Z2ggZ2VuZXJpY19iaWdudW0gYW5kIGhpdCB3aGF0ZXZlcgotICAgaGFwcGVucyB0byBiZSBsb2FkZWQgYmVmb3JlIGl0IGluIG1lbW9yeS4gIEFuZCBpdHMgd2F5IHRvbyBjb21wbGljYXRlZAotICAgZm9yIG1lIHRvIGZpeCByaWdodC4gIFRodXMgYSBoYWNrLiAgSkY6ICBKdXN0IG1ha2UgZ2VuZXJpY19iaWdudW0gYmlnZ2VyLAotICAgYW5kIG5ldmVyIHdyaXRlIGludG8gdGhlIGVhcmx5IHdvcmRzLCB0aHVzIHRoZXknbGwgYWx3YXlzIGJlIHplcm8uCi0gICBJIGhhdGUgRGVhbidzIGZsb2F0aW5nLXBvaW50IGNvZGUuICBCbGVoLiAgKi8KLUxJVFRMRU5VTV9UWVBFIGdlbmVyaWNfYmlnbnVtW1NJWkVfT0ZfTEFSR0VfTlVNQkVSICsgNl07Ci1GTE9OVU1fVFlQRSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciA9Ci17Ci0gICZnZW5lcmljX2JpZ251bVs2XSwJCS8qIGxvdyAoSkY6IFdhcyAwKSAqLwotICAmZ2VuZXJpY19iaWdudW1bU0laRV9PRl9MQVJHRV9OVU1CRVIgKyA2IC0gMV0sIC8qIGhpZ2ggSkY6IChhZGRlZCArNikgKi8KLSAgMCwJCQkJLyogbGVhZGVyICovCi0gIDAsCQkJCS8qIGV4cG9uZW50ICovCi0gIDAJCQkJLyogc2lnbiAqLwotfTsKLS8qIElmIG5vbnplcm8sIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgbmFuLCAraW5mIG9yIC1pbmYgKi8KLWludCBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X21hZ2ljOwotDAotc3RhdGljIHZvaWQKLWZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPiovCi0gIC8qIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50LiAqLwotICBpbnQgZXJyb3JfY29kZTsKLQotICBlcnJvcl9jb2RlID0gYXRvZl9nZW5lcmljICgmaW5wdXRfbGluZV9wb2ludGVyLCAiLiIsIEVYUF9DSEFSUywKLQkJCSAgICAgJmdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKTsKLQotICBpZiAoZXJyb3JfY29kZSkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfY29kZSA9PSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVykKLQl7Ci0JICBhc19iYWQgKF8oImJhZCBmbG9hdGluZy1wb2ludCBjb25zdGFudDogZXhwb25lbnQgb3ZlcmZsb3csIHByb2JhYmx5IGFzc2VtYmxpbmcganVuayIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IHVua25vd24gZXJyb3IgY29kZT0lZC4iKSwgZXJyb3JfY29kZSk7Ci0JfQotICAgIH0KLSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKLSAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5qdXN0IGFmdGVyIGNvbnN0YW50LCAqLwotICAvKiB3aGljaCBtYXkgcG9pbnQgdG8gd2hpdGVzcGFjZS4gKi8KLSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IC0xOwotfQotCi1zdGF0aWMgdmFsdWVUIAotZ2VuZXJpY19iaWdudW1fdG9faW50MzIgKCkgCi17Ci0gIHZhbHVlVCBudW1iZXIgPQotCSAgICgoZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgIHwgKGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spOwotICBudW1iZXIgJj0gMHhmZmZmZmZmZjsKLSAgcmV0dXJuIG51bWJlcjsKLX0KLQotI2lmZGVmIEJGRDY0Ci1zdGF0aWMgdmFsdWVUIAotZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCkgCi17Ci0gIHZhbHVlVCBudW1iZXIgPSAKLQkgICAoKCgoKCgoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bM10gJiBMSVRUTEVOVU1fTUFTSykKLQkJIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzJdICYgTElUVExFTlVNX01BU0spKQotCSAgICAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgICAgfCAoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykpCi0JICAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spKTsKLSAgcmV0dXJuIG51bWJlcjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotaW50ZWdlcl9jb25zdGFudCAocmFkaXgsIGV4cHJlc3Npb25QKQotICAgICBpbnQgcmFkaXg7Ci0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciAqc3RhcnQ7CQkvKiBzdGFydCBvZiBudW1iZXIuICovCi0gIGNoYXIgKnN1ZmZpeCA9IE5VTEw7Ci0gIGNoYXIgYzsKLSAgdmFsdWVUIG51bWJlcjsJLyogb2Zmc2V0IG9yIChhYnNvbHV0ZSkgdmFsdWUgKi8KLSAgc2hvcnQgaW50IGRpZ2l0OwkvKiB2YWx1ZSBvZiBuZXh0IGRpZ2l0IGluIGN1cnJlbnQgcmFkaXggKi8KLSAgc2hvcnQgaW50IG1heGRpZyA9IDA7LyogaGlnaGVzdCBwZXJtaXR0ZWQgZGlnaXQgdmFsdWUuICovCi0gIGludCB0b29fbWFueV9kaWdpdHMgPSAwOwkvKiBpZiB3ZSBzZWUgPj0gdGhpcyBudW1iZXIgb2YgKi8KLSAgY2hhciAqbmFtZTsJCS8qIHBvaW50cyB0byBuYW1lIG9mIHN5bWJvbCAqLwotICBzeW1ib2xTICpzeW1ib2xQOwkvKiBwb2ludHMgdG8gc3ltYm9sICovCi0KLSAgaW50IHNtYWxsOwkJCS8qIHRydWUgaWYgZml0cyBpbiAzMiBiaXRzLiAqLwotCi0gIC8qIE1heSBiZSBiaWdudW0sIG9yIG1heSBmaXQgaW4gMzIgYml0cy4gKi8KLSAgLyogTW9zdCBudW1iZXJzIGZpdCBpbnRvIDMyIGJpdHMsIGFuZCB3ZSB3YW50IHRoaXMgY2FzZSB0byBiZSBmYXN0LgotICAgICBzbyB3ZSBwcmV0ZW5kIGl0IHdpbGwgZml0IGludG8gMzIgYml0cy4gIElmLCBhZnRlciBtYWtpbmcgdXAgYSAzMgotICAgICBiaXQgbnVtYmVyLCB3ZSByZWFsaXNlIHRoYXQgd2UgaGF2ZSBzY2FubmVkIG1vcmUgZGlnaXRzIHRoYW4KLSAgICAgY29tZm9ydGFibHkgZml0IGludG8gMzIgYml0cywgd2UgcmUtc2NhbiB0aGUgZGlnaXRzIGNvZGluZyB0aGVtCi0gICAgIGludG8gYSBiaWdudW0uICBGb3IgZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycyB3ZSBhcmUKLSAgICAgY29uc2VydmF0aXZlOiBTb21lIG51bWJlcnMgbWF5IGJlIGFzc3VtZWQgYmlnbnVtcyB3aGVuIGluIGZhY3QKLSAgICAgdGhleSBkbyBmaXQgaW50byAzMiBiaXRzLiAgTnVtYmVycyBvZiBhbnkgcmFkaXggY2FuIGhhdmUgZXhjZXNzCi0gICAgIGxlYWRpbmcgemVyb3M6IFdlIHN0cml2ZSB0byByZWNvZ25pc2UgdGhpcyBhbmQgY2FzdCB0aGVtIGJhY2sKLSAgICAgaW50byAzMiBiaXRzLiAgV2UgbXVzdCBjaGVjayB0aGF0IHRoZSBiaWdudW0gcmVhbGx5IGlzIG1vcmUgdGhhbgotICAgICAzMiBiaXRzLCBhbmQgY2hhbmdlIGl0IGJhY2sgdG8gYSAzMi1iaXQgbnVtYmVyIGlmIGl0IGZpdHMuICBUaGUKLSAgICAgbnVtYmVyIHdlIGFyZSBsb29raW5nIGZvciBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGlmIGl0Ci0gICAgIGZpdHMgaW50byAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIG51bWJlciwgd2UgbGV0IGl0IGJlIGEgMzItYml0Ci0gICAgIG51bWJlci4gIFRoZSBjYXZhbGllciBhcHByb2FjaCBpcyBmb3Igc3BlZWQgaW4gb3JkaW5hcnkgY2FzZXMuICovCi0gIC8qIFRoaXMgaGFzIGJlZW4gZXh0ZW5kZWQgZm9yIDY0IGJpdHMuICBXZSBibGluZGx5IGFzc3VtZSB0aGF0IGlmCi0gICAgIHlvdSdyZSBjb21waWxpbmcgaW4gNjQtYml0IG1vZGUsIHRoZSB0YXJnZXQgaXMgYSA2NC1iaXQgbWFjaGluZS4KLSAgICAgVGhpcyBzaG91bGQgYmUgY2xlYW5lZCB1cC4gICovCi0KLSNpZmRlZiBCRkQ2NAotI2RlZmluZSB2YWx1ZXNpemUgNjQKLSNlbHNlIC8qIGluY2x1ZGVzIG5vbi1iZmQgY2FzZSwgbW9zdGx5ICovCi0jZGVmaW5lIHZhbHVlc2l6ZSAzMgotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgcmFkaXggPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZmx0ID0gMDsKLQotICAgICAgLyogSW4gTVJJIG1vZGUsIHRoZSBudW1iZXIgbWF5IGhhdmUgYSBzdWZmaXggaW5kaWNhdGluZyB0aGUKLSAgICAgICAgIHJhZGl4LiAgRm9yIHRoYXQgbWF0dGVyLCBpdCBtaWdodCBhY3R1YWxseSBiZSBhIGZsb2F0aW5nCi0gICAgICAgICBwb2ludCBjb25zdGFudC4gICovCi0gICAgICBmb3IgKHN1ZmZpeCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnN1ZmZpeCk7Ci0JICAgc3VmZml4KyspCi0JewotCSAgaWYgKCpzdWZmaXggPT0gJ2UnIHx8ICpzdWZmaXggPT0gJ0UnKQotCSAgICBmbHQgPSAxOwotCX0KLQotICAgICAgaWYgKHN1ZmZpeCA9PSBpbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCSAgcmFkaXggPSAxMDsKLQkgIHN1ZmZpeCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGMgPSAqLS1zdWZmaXg7Ci0JICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICBjID0gdG91cHBlciAoYyk7Ci0JICBpZiAoYyA9PSAnQicpCi0JICAgIHJhZGl4ID0gMjsKLQkgIGVsc2UgaWYgKGMgPT0gJ0QnKQotCSAgICByYWRpeCA9IDEwOwotCSAgZWxzZSBpZiAoYyA9PSAnTycgfHwgYyA9PSAnUScpCi0JICAgIHJhZGl4ID0gODsKLQkgIGVsc2UgaWYgKGMgPT0gJ0gnKQotCSAgICByYWRpeCA9IDE2OwotCSAgZWxzZSBpZiAoc3VmZml4WzFdID09ICcuJyB8fCBjID09ICdFJyB8fCBmbHQpCi0JICAgIHsKLQkgICAgICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmFkaXggPSAxMDsKLQkgICAgICBzdWZmaXggPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKHJhZGl4KQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICBtYXhkaWcgPSAyOwotICAgICAgdG9vX21hbnlfZGlnaXRzID0gdmFsdWVzaXplICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIG1heGRpZyA9IHJhZGl4ID0gODsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9ICh2YWx1ZXNpemUgKyAyKSAvIDMgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIG1heGRpZyA9IHJhZGl4ID0gMTY7Ci0gICAgICB0b29fbWFueV9kaWdpdHMgPSAodmFsdWVzaXplICsgMykgLyA0ICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTA6Ci0gICAgICBtYXhkaWcgPSByYWRpeCA9IDEwOwotICAgICAgdG9vX21hbnlfZGlnaXRzID0gKHZhbHVlc2l6ZSArIDExKSAvIDQ7IC8qIHZlcnkgcm91Z2ggKi8KLSAgICB9Ci0jdW5kZWYgdmFsdWVzaXplCi0gIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICBmb3IgKG51bWJlciA9IDA7Ci0gICAgICAgKGRpZ2l0ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7Ci0gICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLSAgICB7Ci0gICAgICBudW1iZXIgPSBudW1iZXIgKiByYWRpeCArIGRpZ2l0OwotICAgIH0KLSAgLyogYyBjb250YWlucyBjaGFyYWN0ZXIgYWZ0ZXIgbnVtYmVyLiAqLwotICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPmNoYXIgYWZ0ZXIgYy4gKi8KLSAgc21hbGwgPSAoaW5wdXRfbGluZV9wb2ludGVyIC0gc3RhcnQgLSAxKSA8IHRvb19tYW55X2RpZ2l0czsKLQotICBpZiAocmFkaXggPT0gMTYgJiYgYyA9PSAnXycpIAotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgbGl0ZXJhbCBvZiB0aGUgZm9ybSAweDMzM18wXzEyMzQ1Njc4XzEuCi0gICAgICAgICBUaGlzIGV4YW1wbGUgaXMgZXF1aXZhbGVudCB0byAweDAwMDAwMzMzMDAwMDAwMDAxMjM0NTY3ODAwMDAwMDAxLiAgKi8KLQotICAgICAgaW50IG51bV9saXR0bGVfZGlnaXRzID0gMDsKLSAgICAgIGludCBpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7CS8qLT4xc3QgZGlnaXQuICovCi0KLSAgICAgIGtub3cgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyA9PSAxNik7Ci0KLSAgICAgIGZvciAoYyA9ICdfJzsgYyA9PSAnXyc7IG51bV9saXR0bGVfZGlnaXRzKz0yKQotCXsKLQotCSAgLyogQ29udmVydCBvbmUgNjQtYml0IHdvcmQuICovCi0JICBpbnQgbmRpZ2l0ID0gMDsgCi0JICBudW1iZXIgPSAwOwotCSAgZm9yIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgICAoZGlnaXQgPSBoZXhfdmFsdWUgKGMpKSA8IG1heGRpZzsKLQkgICAgICAgYyA9ICooaW5wdXRfbGluZV9wb2ludGVyKyspKQotCSAgICB7Ci0JICAgICAgbnVtYmVyID0gbnVtYmVyICogcmFkaXggKyBkaWdpdDsKLQkgICAgICBuZGlnaXQrKzsKLQkgICAgfQotCi0JICAvKiBDaGVjayBmb3IgOCBkaWdpdCBwZXIgd29yZCBtYXguICAqLwotCSAgaWYgKG5kaWdpdCA+IDgpIAotCSAgICBhc19iYWQgKF8oIkEgYmlnbnVtIHdpdGggdW5kZXJzY29yZXMgbWF5IG5vdCBoYXZlIG1vcmUgdGhhbiA4IGhleCBkaWdpdHMgaW4gYW55IHdvcmQuIikpOwotCi0JICAvKiBBZGQgdGhpcyBjaHVuayB0byB0aGUgYmlnbnVtLiAgU2hpZnQgdGhpbmdzIGRvd24gMiBsaXR0bGUgZGlnaXRzLiovCi0JICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotCSAgZm9yIChpID0gbWluIChudW1fbGl0dGxlX2RpZ2l0cyArIDEsIFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMSk7IGkgPj0gMjsgaS0tKQotCSAgICBnZW5lcmljX2JpZ251bVtpXSA9IGdlbmVyaWNfYmlnbnVtW2ktMl07Ci0KLQkgIC8qIEFkZCB0aGUgbmV3IGRpZ2l0cyBhcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbmV3IG9uZXMuICovCi0JICBnZW5lcmljX2JpZ251bVswXSA9IG51bWJlciAmIDB4ZmZmZmZmZmY7Ci0JICBnZW5lcmljX2JpZ251bVsxXSA9IG51bWJlciA+PiAxNjsKLQl9Ci0KLSAgICAgIC8qIEFnYWluLCBjIGlzIGNoYXIgYWZ0ZXIgbnVtYmVyLCBpbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyIGMuICovCi0KLSAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA+IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMSkKLQludW1fbGl0dGxlX2RpZ2l0cyA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMTsKLQotICAgICAgYXNzZXJ0IChudW1fbGl0dGxlX2RpZ2l0cyA+PSA0KTsKLQotICAgICAgaWYgKG51bV9saXR0bGVfZGlnaXRzICE9IDgpCi0JYXNfYmFkIChfKCJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG11c3QgaGF2ZSBleGFjdGx5IDQgd29yZHMuIikpOwotCi0gICAgICAvKiBXZSBtaWdodCBoYXZlIHNvbWUgbGVhZGluZyB6ZXJvcy4gIFRoZXNlIGNhbiBiZSB0cmltbWVkIHRvIGdpdmUKLSAgICAgICAqIHVzIGEgY2hhbmdlIHRvIGZpdCB0aGlzIGNvbnN0YW50IGludG8gYSBzbWFsbCBudW1iZXIuCi0gICAgICAgKi8KLSAgICAgIHdoaWxlIChnZW5lcmljX2JpZ251bVtudW1fbGl0dGxlX2RpZ2l0cy0xXSA9PSAwICYmIG51bV9saXR0bGVfZGlnaXRzID4gMSkKLQludW1fbGl0dGxlX2RpZ2l0cy0tOwotCQotICAgICAgaWYgKG51bV9saXR0bGVfZGlnaXRzIDw9IDIpCi0JewotCSAgLyogd2lsbCBmaXQgaW50byAzMiBiaXRzLiAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50MzIgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2lmZGVmIEJGRDY0Ci0gICAgICBlbHNlIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA8PSA0KQotCXsKLQkgIC8qIFdpbGwgZml0IGludG8gNjQgYml0cy4gICovCi0JICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQ2NCAoKTsKLQkgIHNtYWxsID0gMTsKLQl9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQl7Ci0JICBzbWFsbCA9IDA7Ci0JICBudW1iZXIgPSBudW1fbGl0dGxlX2RpZ2l0czsgLyogbnVtYmVyIG9mIGxpdHRsZW51bXMgaW4gdGhlIGJpZ251bS4gKi8KLQl9Ci0gICAgfQotICBlbHNlIGlmICghc21hbGwpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIHdlIHNhdyBhIGxvdCBvZiBkaWdpdHMuIG1hbnVmYWN0dXJlIGEgYmlnbnVtIHRoZSBoYXJkIHdheS4KLSAgICAgICAqLwotICAgICAgTElUVExFTlVNX1RZUEUgKmxlYWRlcjsJLyotPmhpZ2ggb3JkZXIgbGl0dGxlbnVtIG9mIHRoZSBiaWdudW0uICovCi0gICAgICBMSVRUTEVOVU1fVFlQRSAqcG9pbnRlcjsJLyotPmxpdHRsZW51bSB3ZSBhcmUgZnJvYmJpbmcgbm93LiAqLwotICAgICAgbG9uZyBjYXJyeTsKLQotICAgICAgbGVhZGVyID0gZ2VuZXJpY19iaWdudW07Ci0gICAgICBnZW5lcmljX2JpZ251bVswXSA9IDA7Ci0gICAgICBnZW5lcmljX2JpZ251bVsxXSA9IDA7Ci0gICAgICBnZW5lcmljX2JpZ251bVsyXSA9IDA7Ci0gICAgICBnZW5lcmljX2JpZ251bVszXSA9IDA7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsJLyotPjFzdCBkaWdpdC4gKi8KLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmb3IgKDsKLQkgICAoY2FycnkgPSBoZXhfdmFsdWUgKGMpKSA8IG1heGRpZzsKLQkgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKQotCXsKLQkgIGZvciAocG9pbnRlciA9IGdlbmVyaWNfYmlnbnVtOwotCSAgICAgICBwb2ludGVyIDw9IGxlYWRlcjsKLQkgICAgICAgcG9pbnRlcisrKQotCSAgICB7Ci0JICAgICAgbG9uZyB3b3JrOwotCi0JICAgICAgd29yayA9IGNhcnJ5ICsgcmFkaXggKiAqcG9pbnRlcjsKLQkgICAgICAqcG9pbnRlciA9IHdvcmsgJiBMSVRUTEVOVU1fTUFTSzsKLQkgICAgICBjYXJyeSA9IHdvcmsgPj4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgICB9Ci0JICBpZiAoY2FycnkpCi0JICAgIHsKLQkgICAgICBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCi0JCXsKLQkJICAvKiByb29tIHRvIGdyb3cgYSBsb25nZXIgYmlnbnVtLiAqLwotCQkgICorK2xlYWRlciA9IGNhcnJ5OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBhZ2FpbiwgYyBpcyBjaGFyIGFmdGVyIG51bWJlciwgKi8KLSAgICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgYy4gKi8KLSAgICAgIGtub3cgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyA9PSAxNik7Ci0gICAgICBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyAyKQotCXsKLQkgIC8qIHdpbGwgZml0IGludG8gMzIgYml0cy4gKi8KLQkgIG51bWJlciA9IGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyICgpOwotCSAgc21hbGwgPSAxOwotCX0KLSNpZmRlZiBCRkQ2NAotICAgICAgZWxzZSBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyA0KQotCXsKLQkgIC8qIFdpbGwgZml0IGludG8gNjQgYml0cy4gICovCi0JICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQ2NCAoKTsKLQkgIHNtYWxsID0gMTsKLQl9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQl7Ci0JICBudW1iZXIgPSBsZWFkZXIgLSBnZW5lcmljX2JpZ251bSArIDE7CS8qIG51bWJlciBvZiBsaXR0bGVudW1zIGluIHRoZSBiaWdudW0uICovCi0JfQotICAgIH0KLQotICBpZiAoZmxhZ19tNjhrX21yaSAmJiBzdWZmaXggIT0gTlVMTCAmJiBpbnB1dF9saW5lX3BvaW50ZXIgLSAxID09IHN1ZmZpeCkKLSAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gIGlmIChzbWFsbCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogaGVyZSB3aXRoIG51bWJlciwgaW4gY29ycmVjdCByYWRpeC4gYyBpcyB0aGUgbmV4dCBjaGFyLgotICAgICAgICogbm90ZSB0aGF0IHVubGlrZSB1bip4LCB3ZSBhbGxvdyAiMDExZiIgIjB4OWYiIHRvCi0gICAgICAgKiBib3RoIG1lYW4gdGhlIHNhbWUgYXMgdGhlIChjb252ZW50aW9uYWwpICI5ZiIuIHRoaXMgaXMgc2ltcGx5IGVhc2llcgotICAgICAgICogdGhhbiBjaGVja2luZyBmb3Igc3RyaWN0IGNhbm9uaWNhbCBmb3JtLiBzeW50YXggc3V4IQotICAgICAgICovCi0KLSAgICAgIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgYyA9PSAnYicpCi0JewotCSAgLyoKLQkgICAqIGJhY2t3YXJkIHJlZiB0byBsb2NhbCBsYWJlbC4KLQkgICAqIGJlY2F1c2UgaXQgaXMgYmFja3dhcmQsIGV4cGVjdCBpdCB0byBiZSBkZWZpbmVkLgotCSAgICovCi0JICAvKiBDb25zdHJ1Y3QgYSBsb2NhbCBsYWJlbC4gICovCi0JICBuYW1lID0gZmJfbGFiZWxfbmFtZSAoKGludCkgbnVtYmVyLCAwKTsKLQotCSAgLyogc2VlbiBiZWZvcmUsIG9yIHN5bWJvbCBpcyBkZWZpbmVkOiBvayAqLwotCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQkgIGlmICgoc3ltYm9sUCAhPSBOVUxMKSAmJiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkpCi0JICAgIHsKLQkgICAgICAvKiBsb2NhbCBsYWJlbHMgYXJlIG5ldmVyIGFic29sdXRlLiBkb24ndCB3YXN0ZSB0aW1lCi0JCSBjaGVja2luZyBhYnNvbHV0ZW5lc3MuICovCi0JICAgICAga25vdyAoU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpKTsKLQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIGVpdGhlciBub3Qgc2VlbiBvciBub3QgZGVmaW5lZC4gKi8KLQkgICAgICAvKiBAQCBTaG91bGQgcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCBzdHJpbmcgaW5zdGVhZCBvZgotCQkgdGhlIHBhcnNlZCBudW1iZXIuICAqLwotCSAgICAgIGFzX2JhZCAoXygiYmFja3cuIHJlZiB0byB1bmtub3duIGxhYmVsIFwiJWQ6XCIsIDAgYXNzdW1lZC4iKSwKLQkJICAgICAgKGludCkgbnVtYmVyKTsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgIH0KLQotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JfQkJCS8qIGNhc2UgJ2InICovCi0gICAgICBlbHNlIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgYyA9PSAnZicpCi0JewotCSAgLyoKLQkgICAqIGZvcndhcmQgcmVmZXJlbmNlLiBleHBlY3Qgc3ltYm9sIHRvIGJlIHVuZGVmaW5lZCBvcgotCSAgICogdW5rbm93bi4gdW5kZWZpbmVkOiBzZWVuIGl0IGJlZm9yZS4gdW5rbm93bjogbmV2ZXIgc2VlbgotCSAgICogaXQgYmVmb3JlLgotCSAgICogY29uc3RydWN0IGEgbG9jYWwgbGFiZWwgbmFtZSwgdGhlbiBhbiB1bmRlZmluZWQgc3ltYm9sLgotCSAgICogZG9uJ3QgY3JlYXRlIGEgeHNlZyBmcmFnIGZvciBpdDogY2FsbGVyIG1heSBkbyB0aGF0LgotCSAgICoganVzdCByZXR1cm4gaXQgYXMgbmV2ZXIgc2VlbiBiZWZvcmUuCi0JICAgKi8KLQkgIG5hbWUgPSBmYl9sYWJlbF9uYW1lICgoaW50KSBudW1iZXIsIDEpOwotCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCSAgLyogd2UgaGF2ZSBubyBuZWVkIHRvIGNoZWNrIHN5bWJvbCBwcm9wZXJ0aWVzLiAqLwotI2lmbmRlZiBtYW55X3NlZ21lbnRzCi0JICAvKiBzaW5jZSAia25vdyIgcHV0cyBpdHMgYXJnIGludG8gYSAic3RyaW5nIiwgd2UKLQkgICAgIGNhbid0IGhhdmUgbmV3bGluZXMgaW4gdGhlIGFyZ3VtZW50LiAgKi8KLQkgIGtub3cgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHVuZGVmaW5lZF9zZWN0aW9uIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHRleHRfc2VjdGlvbiB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBkYXRhX3NlY3Rpb24pOwotI2VuZGlmCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQl9CQkJLyogY2FzZSAnZicgKi8KLSAgICAgIGVsc2UgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIgJiYgYyA9PSAnJCcpCi0JewotCSAgLyogSWYgdGhlIGRvbGxhciBsYWJlbCBpcyAqY3VycmVudGx5KiBkZWZpbmVkLCB0aGVuIHRoaXMgaXMganVzdAotCSAgICAgYW5vdGhlciByZWZlcmVuY2UgdG8gaXQuICBJZiBpdCBpcyBub3QgKmN1cnJlbnRseSogZGVmaW5lZCwKLQkgICAgIHRoZW4gdGhpcyBpcyBhIGZyZXNoIGluc3RhbnRpYXRpb24gb2YgdGhhdCBudW1iZXIsIHNvIGNyZWF0ZQotCSAgICAgaXQuICAqLwotCi0JICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKChsb25nKSBudW1iZXIpKQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGRvbGxhcl9sYWJlbF9uYW1lICgobG9uZykgbnVtYmVyLCAwKTsKLQkgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCSAgICAgIGtub3cgKHN5bWJvbFAgIT0gTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAoKGxvbmcpIG51bWJlciwgMSk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCSAgICB9Ci0KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCX0JCQkvKiBjYXNlICckJyAqLwotICAgICAgZWxzZQotCXsKLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSNpZmRlZiBUQVJHRVRfV09SRF9TSVpFCi0JICAvKiBTaWduIGV4dGVuZCBOVU1CRVIuICAqLwotCSAgbnVtYmVyIHw9ICgtKG51bWJlciA+PiAoVEFSR0VUX1dPUkRfU0laRSAtIDEpKSkgPDwgKFRBUkdFVF9XT1JEX1NJWkUgLSAxKTsKLSNlbmRpZgotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IG51bWJlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKiByZXN0b3JlIGZvbGxvd2luZyBjaGFyYWN0ZXIuICovCi0JfQkJCS8qIHJlYWxseSBqdXN0IGEgbnVtYmVyICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogbm90IGEgc21hbGwgbnVtYmVyICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYmlnOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IG51bWJlcjsJLyogbnVtYmVyIG9mIGxpdHRsZW51bXMgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKi0+Y2hhciBmb2xsb3dpbmcgbnVtYmVyLiAqLwotICAgIH0KLX0KLQotLyogUGFyc2UgYW4gTVJJIG11bHRpIGNoYXJhY3RlciBjb25zdGFudC4gICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfY2hhcl9jb25zdGFudCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJwotICAgICAgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycpCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEluIG9yZGVyIHRvIGdldCB0aGUgY29ycmVjdCBieXRlIG9yZGVyaW5nLCB3ZSBtdXN0IGJ1aWxkIHRoZQotICAgICBudW1iZXIgaW4gcmV2ZXJzZS4gICovCi0gIGZvciAoaSA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgaW50IGo7Ci0KLSAgICAgIGdlbmVyaWNfYmlnbnVtW2ldID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBDSEFSU19QRVJfTElUVExFTlVNOyBqKyspCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkgICAgewotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJykKLQkJYnJlYWs7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGdlbmVyaWNfYmlnbnVtW2ldIDw8PSA4OwotCSAgZ2VuZXJpY19iaWdudW1baV0gKz0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLQotICAgICAgaWYgKGkgPCBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCi0JewotCSAgLyogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBsaXR0bGVudW0sIGxlZnQganVzdGlmeSB0aGUKLSAgICAgICAgICAgICBsYXN0IG9uZSB0byBtYWtlIGl0IG1hdGNoIHRoZSBlYXJsaWVyIG9uZXMuICBJZiB0aGVyZSBpcwotICAgICAgICAgICAgIG9ubHkgb25lLCB3ZSBjYW4ganVzdCB1c2UgdGhlIHZhbHVlIGRpcmVjdGx5LiAgKi8KLQkgIGZvciAoOyBqIDwgQ0hBUlNfUEVSX0xJVFRMRU5VTTsgaisrKQotCSAgICBnZW5lcmljX2JpZ251bVtpXSA8PD0gODsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycKLQkgICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDaGFyYWN0ZXIgY29uc3RhbnQgdG9vIGxhcmdlIikpOwotICAgICAgaSA9IDA7Ci0gICAgfQotCi0gIGlmIChpID4gMCkKLSAgICB7Ci0gICAgICBpbnQgYzsKLSAgICAgIGludCBqOwotCi0gICAgICBjID0gU0laRV9PRl9MQVJHRV9OVU1CRVIgLSBpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGM7IGorKykKLQlnZW5lcmljX2JpZ251bVtqXSA9IGdlbmVyaWNfYmlnbnVtW2kgKyBqXTsKLSAgICAgIGkgPSBjOwotICAgIH0KLQotICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotICBpZiAoaSA+IDIpCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGlmIChpIDwgMikKLQlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMF0gJiBMSVRUTEVOVU1fTUFTSzsKLSAgICAgIGVsc2UKLQlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0KLQkgICgoKGdlbmVyaWNfYmlnbnVtWzFdICYgTElUVExFTlVNX01BU0spCi0JICAgIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICB8IChnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLKSk7Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGZpbmFsIGNsb3NpbmcgcXVvdGUuICAqLwotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotLyogUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgVGhpcwotICAgaGFuZGxlcyB0aGUgbWFnaWMgc3ltYm9sIGAuJy4gICovCi0KLXN0YXRpYyB2b2lkCi1jdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9ucCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25wOwotewotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25wLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9udW1iZXIgPSBhYnNfc2VjdGlvbl9vZmZzZXQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltYm9scDsKLQotICAgICAgc3ltYm9scCA9IHN5bWJvbF9uZXcgKEZBS0VfTEFCRUxfTkFNRSwgbm93X3NlZywKLQkJCSAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkgICAgZnJhZ19ub3cpOwotICAgICAgZXhwcmVzc2lvbnAtPlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xwOwotICAgICAgZXhwcmVzc2lvbnAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotfQotCi0vKgotICogU3VtbWFyeSBvZiBvcGVyYW5kKCkuCi0gKgotICogaW46CUlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZCwgd2hpY2ggbWF5Ci0gKgliZSBhIHNwYWNlLgotICoKLSAqIG91dDoJQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gZW1wdHk6IGluIHRoaXMgY2FzZSBYX29wID09IE9fYWJzZW50LgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZC4KLSAqLwotCi1zdGF0aWMgc2VnVAotb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW1ib2xQOwkvKiBwb2ludHMgdG8gc3ltYm9sICovCi0gIGNoYXIgKm5hbWU7CQkvKiBwb2ludHMgdG8gbmFtZSBvZiBzeW1ib2wgKi8KLSAgc2VnVCBzZWdtZW50OwotCi0gIC8qIEFsbCBpbnRlZ2VycyBhcmUgcmVnYXJkZWQgYXMgdW5zaWduZWQgdW5sZXNzIHRoZXkgYXJlIG5lZ2F0ZWQuCi0gICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgb25seSB0aGluZyB3aGljaCBjYXJlcyB3aGV0aGVyIGEgbnVtYmVyIGlzCi0gICAgIHVuc2lnbmVkIGlzIHRoZSBjb2RlIGluIGVtaXRfZXhwciB3aGljaCBleHRlbmRzIGNvbnN0YW50cyBpbnRvCi0gICAgIGJpZ251bXMuICBJdCBzaG91bGQgb25seSBzaWduIGV4dGVuZCBuZWdhdGl2ZSBudW1iZXJzLCBzbyB0aGF0Ci0gICAgIHNvbWV0aGluZyBsaWtlIGBgLnF1YWQgMHg4MDAwMDAwMCcnIGlzIG5vdCBzaWduIGV4dGVuZGVkIGV2ZW4KLSAgICAgdGhvdWdoIGl0IGFwcGVhcnMgbmVnYXRpdmUgaWYgdmFsdWVUIGlzIDMyIGJpdHMuICAqLwotICBleHByZXNzaW9uUC0+WF91bnNpZ25lZCA9IDE7Ci0KLSAgLyogZGlnaXRzLCBhc3N1bWUgaXQgaXMgYSBiaWdudW0uICovCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogbGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsJLyogaW5wdXRfbGluZV9wb2ludGVyLT5wYXN0IGNoYXIgaW4gYy4gKi8KLQotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0KLSAgICAgIGludGVnZXJfY29uc3RhbnQgKGZsYWdfbTY4a19tcmkgPyAwIDogMTAsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgICAvKiBub24tZGVjaW1hbCByYWRpeCAqLwotCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaSkKLQl7Ci0JICBjaGFyICpzOwotCi0JICAvKiBDaGVjayBmb3IgYSBoZXggY29uc3RhbnQuICAqLwotCSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyBoZXhfcCAoKnMpOyBzKyspCi0JICAgIDsKLQkgIGlmICgqcyA9PSAnaCcgfHwgKnMgPT0gJ0gnKQotCSAgICB7Ci0JICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnbyc6Ci0JY2FzZSAnTyc6Ci0JY2FzZSAncSc6Ci0JY2FzZSAnUSc6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnOSc6Ci0JICBpZiAoZmxhZ19tNjhrX21yaSkKLQkgICAgewotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDAsIGV4cHJlc3Npb25QKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQlkZWZhdWx0OgotCWRlZmF1bHRfY2FzZToKLQkgIGlmIChjICYmIHN0cmNociAoRkxUX0NIQVJTLCBjKSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIGZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCk7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9Ci0JCS0gKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/IHRvbG93ZXIgKGMpIDogYyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBzdHJpbmcgd2FzIG9ubHkgemVybyAqLwotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWNhc2UgJ3gnOgotCWNhc2UgJ1gnOgotCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JICAgIGdvdG8gZGVmYXVsdF9jYXNlOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0KLQljYXNlICdiJzoKLQkgIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgISBmbGFnX202OGtfbXJpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gY2hlY2sgZm9yICcrJyBhbmQgJy0nIGhlcmUsIGFuZCwgaW4KLQkJIHNvbWUgY29uZGl0aW9ucywgZmFsbCB0aHJvdWdoIHRvIGNhbGwKLQkJIGludGVnZXJfY29uc3RhbnQuICBIb3dldmVyLCB0aGF0IGRpZG4ndCBtYWtlIHNlbnNlLAotCQkgYXMgaW50ZWdlcl9jb25zdGFudCBvbmx5IGFjY2VwdHMgZGlnaXRzLiAgKi8KLQkgICAgICAvKiBTb21lIG9mIG91ciBjb2RlIGVsc2V3aGVyZSBkb2VzIHBlcm1pdCBkaWdpdHMgZ3JlYXRlcgotCQkgdGhhbiB0aGUgZXhwZWN0ZWQgYmFzZTsgZm9yIGNvbnNpc3RlbmN5LCBkbyB0aGUgc2FtZQotCQkgaGVyZS4gICovCi0JICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA8ICcwJwotCQkgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA+ICc5JykKLQkJewotCQkgIC8qIFBhcnNlIHRoaXMgYXMgYSBiYWNrIHJlZmVyZW5jZSB0byBsYWJlbCAwLiAgKi8KLQkJICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkJICBpbnRlZ2VyX2NvbnN0YW50ICgxMCwgZXhwcmVzc2lvblApOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogT3RoZXJ3aXNlLCBwYXJzZSB0aGlzIGFzIGEgYmluYXJ5IG51bWJlci4gICovCi0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnQic6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKLQkgIGludGVnZXJfY29uc3RhbnQgKDIsIGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JY2FzZSAnMyc6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnNic6Ci0JY2FzZSAnNyc6Ci0JICBpbnRlZ2VyX2NvbnN0YW50IChmbGFnX202OGtfbXJpID8gMCA6IDgsIGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBpZiAoTE9DQUxfTEFCRUxTX0ZCKQotCSAgICB7Ci0JICAgICAgLyogSWYgaXQgc2F5cyAiMGYiIGFuZCBpdCBjb3VsZCBwb3NzaWJseSBiZSBhIGZsb2F0aW5nIHBvaW50Ci0JCSBudW1iZXIsIG1ha2UgaXQgb25lLiAgT3RoZXJ3aXNlLCBtYWtlIGl0IGEgbG9jYWwgbGFiZWwsCi0JCSBhbmQgdHJ5IHRvIGRlYWwgd2l0aCBwYXJzaW5nIHRoZSByZXN0IGxhdGVyLiAgKi8KLQkgICAgICBpZiAoIWlucHV0X2xpbmVfcG9pbnRlclsxXQotCQkgIHx8IChpc19lbmRfb2ZfbGluZVsweGZmICYgaW5wdXRfbGluZV9wb2ludGVyWzFdXSkpCi0JCWdvdG8gaXNfMGZfbGFiZWw7Ci0JICAgICAgewotCQljaGFyICpjcCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0JCWludCByID0gYXRvZl9nZW5lcmljICgmY3AsICIuIiwgRVhQX0NIQVJTLAotCQkJCSAgICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcik7Ci0JCXN3aXRjaCAocikKLQkJICB7Ci0JCSAgY2FzZSAwOgotCQkgIGNhc2UgRVJST1JfRVhQT05FTlRfT1ZFUkZMT1c6Ci0JCSAgICBpZiAoKmNwID09ICdmJyB8fCAqY3AgPT0gJ2InKQotCQkgICAgICAvKiBsb29rcyBsaWtlIGEgZGlmZmVyZW5jZSBleHByZXNzaW9uICovCi0JCSAgICAgIGdvdG8gaXNfMGZfbGFiZWw7Ci0JCSAgICBlbHNlIGlmIChjcCA9PSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKQotCQkgICAgICAvKiBObyBjaGFyYWN0ZXJzIGhhcyBiZWVuIGFjY2VwdGVkIC0tIGxvb2tzIGxpa2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgb2Ygb3BlcmFuZC4gKi8KLQkJICAgICAgZ290byBpc18wZl9sYWJlbDsKLQkJICAgIGVsc2UKLQkJICAgICAgZ290byBpc18wZl9mbG9hdDsKLQkJICBkZWZhdWx0OgotCQkgICAgYXNfZmF0YWwgKF8oImV4cHIuYyhvcGVyYW5kKTogYmFkIGF0b2ZfZ2VuZXJpYyByZXR1cm4gdmFsICVkIiksCi0JCQkgICAgICByKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgICAgLyogT2theSwgbm93IHdlJ3ZlIHNvcnRlZCBpdCBvdXQuICBXZSByZXN1bWUgYXQgb25lIG9mIHRoZXNlCi0JCSB0d28gbGFiZWxzLCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBkZWNpZGVkIHdlJ3JlIHByb2JhYmx5Ci0JCSBsb29raW5nIGF0LiAgKi8KLQkgICAgaXNfMGZfbGFiZWw6Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMTAsIGV4cHJlc3Npb25QKTsKLQkgICAgICBicmVhazsKLQotCSAgICBpc18wZl9mbG9hdDoKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQkgICAgICA7Ci0JICAgIH0KLQotCWNhc2UgJ2QnOgotCWNhc2UgJ0QnOgotCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JICAgIHsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnRic6Ci0JY2FzZSAncic6Ci0JY2FzZSAnZSc6Ci0JY2FzZSAnRSc6Ci0JY2FzZSAnZyc6Ci0JY2FzZSAnRyc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCk7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0KLQkgICAgLSAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpID8gdG9sb3dlciAoYykgOiBjKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnJCc6Ci0JICBpZiAoTE9DQUxfTEFCRUxTX0RPTExBUikKLQkgICAgewotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDEwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZ290byBkZWZhdWx0X2Nhc2U7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJygnOgotI2lmbmRlZiBORUVEX0lOREVYX09QRVJBVE9SCi0gICAgY2FzZSAnWyc6Ci0jZW5kaWYKLSAgICAgIC8qIGRpZG4ndCBiZWdpbiB3aXRoIGRpZ2l0ICYgbm90IGEgbmFtZSAqLwotICAgICAgc2VnbWVudCA9IGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIC8qIEV4cHJlc3Npb24oKSB3aWxsIHBhc3MgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotICAgICAgaWYgKChjID09ICcoJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyknKQotCSAgfHwgKGMgPT0gJ1snICYmICppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnXScpKQotCXsKLQkgIGFzX2JhZCAoXygiTWlzc2luZyAnKScgYXNzdW1lZCIpKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIC8qIGhlcmUgd2l0aCBpbnB1dF9saW5lX3BvaW50ZXItPmNoYXIgYWZ0ZXIgIiguLi4pIiAqLwotICAgICAgcmV0dXJuIHNlZ21lbnQ7Ci0KLSAgICBjYXNlICdFJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnKQotCWdvdG8gZGVfZmF1bHQ7Ci0gICAgICBhc19iYWQgKF8oIkVCQ0RJQyBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJ0EnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICdcJyc6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCXsKLQkgIC8qIFdhcm5pbmc6IHRvIGNvbmZvcm0gdG8gb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycyBOTwotCSAgICAgRVNDQVBFTUVOVCBpcyBwZXJtaXR0ZWQgZm9yIGEgc2luZ2xlIHF1b3RlLiBUaGUgbmV4dAotCSAgICAgY2hhcmFjdGVyLCBwYXJpdHkgZXJyb3JzIGFuZCBhbGwsIGlzIHRha2VuIGFzIHRoZSB2YWx1ZQotCSAgICAgb2YgdGhlIG9wZXJhbmQuIFZFUlkgS0lOS1kuICAqLwotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbXJpX2NoYXJfY29uc3RhbnQgKGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKyc6Ci0gICAgICAodm9pZCkgb3BlcmFuZCAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICciJzoKLSAgICAgIC8qIERvdWJsZSBxdW90ZSBpcyB0aGUgYml0d2lzZSBub3Qgb3BlcmF0b3IgaW4gTVJJIG1vZGUuICAqLwotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICd+JzoKLSAgICAgIC8qIH4gaXMgcGVybWl0dGVkIHRvIHN0YXJ0IGEgbGFiZWwgb24gdGhlIERlbHRhLiAgKi8KLSAgICAgIGlmIChpc19uYW1lX2JlZ2lubmVyIChjKSkKLQlnb3RvIGlzbmFtZTsKLSAgICBjYXNlICchJzoKLSAgICBjYXNlICctJzoKLSAgICAgIHsKLQlvcGVyYW5kIChleHByZXNzaW9uUCk7Ci0JaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQpCi0JICB7Ci0JICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlciAtPiBjaGFyIGFmdGVyIG9wZXJhbmQgKi8KLQkgICAgaWYgKGMgPT0gJy0nKQotCSAgICAgIHsKLQkJZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IC0gZXhwcmVzc2lvblAtPlhfYWRkX251bWJlcjsKLQkJLyogTm90aWNlOiAnLScgbWF5IG92ZXJmbG93OiBubyB3YXJuaW5nIGlzIGdpdmVuLiBUaGlzIGlzCi0JCSAgIGNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLiBTaWdoLiAgKi8KLQkJZXhwcmVzc2lvblAtPlhfdW5zaWduZWQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoYyA9PSAnficgfHwgYyA9PSAnIicpCi0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IH4gZXhwcmVzc2lvblAtPlhfYWRkX251bWJlcjsKLQkgICAgZWxzZQotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAhIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXI7Ci0JICB9Ci0JZWxzZSBpZiAoZXhwcmVzc2lvblAtPlhfb3AgIT0gT19pbGxlZ2FsCi0JCSAmJiBleHByZXNzaW9uUC0+WF9vcCAhPSBPX2Fic2VudCkKLQkgIHsKLQkgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKGV4cHJlc3Npb25QKTsKLQkgICAgaWYgKGMgPT0gJy0nKQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT191bWludXM7Ci0JICAgIGVsc2UgaWYgKGMgPT0gJ34nIHx8IGMgPT0gJyInKQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19iaXRfbm90OwotCSAgICBlbHNlCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2xvZ2ljYWxfbm90OwotCSAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIH0KLQllbHNlCi0JICBhc193YXJuIChfKCJVbmFyeSBvcGVyYXRvciAlYyBpZ25vcmVkIGJlY2F1c2UgYmFkIG9wZXJhbmQgZm9sbG93cyIpLAotCQkgICBjKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnJCc6Ci0gICAgICAvKiAkIGlzIHRoZSBwcm9ncmFtIGNvdW50ZXIgd2hlbiBpbiBNUkkgbW9kZSwgb3Igd2hlbiBET0xMQVJfRE9UCi0gICAgICAgICBpcyBkZWZpbmVkLiAgKi8KLSNpZm5kZWYgRE9MTEFSX0RPVAotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotI2VuZGlmCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaSAmJiBoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgLyogSW4gTVJJIG1vZGUsICQgaXMgYWxzbyB1c2VkIGFzIHRoZSBwcmVmaXggZm9yIGEKLSAgICAgICAgICAgICBoZXhhZGVjaW1hbCBjb25zdGFudC4gICovCi0JICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQlnb3RvIGlzbmFtZTsKLQotICAgICAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIGlmICghaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICBjdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInN0YXJ0b2YuIiwgOCkgPT0gMAotCQkmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzhdKSkKLQkgICAgICAgfHwgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzaXplb2YuIiwgNykgPT0gMAotCQkgICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzddKSkpCi0JewotCSAgaW50IHN0YXJ0OwotCi0JICBzdGFydCA9IChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ3QnCi0JCSAgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnVCcpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IHN0YXJ0ID8gOCA6IDc7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKCcpCi0JICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIC5zdGFydG9mLiBvciAuc2l6ZW9mLiIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxMCk7Ci0JICAgICAgaWYgKHN0YXJ0KQotCQlzcHJpbnRmIChidWYsICIuc3RhcnRvZi4lcyIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIG5hbWUpOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbWFrZSAoYnVmKTsKLQkgICAgICBmcmVlIChidWYpOwotCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKScpCi0JCWFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIC5zdGFydG9mLiBvciAuc2l6ZW9mLiIpKTsKLQkgICAgICBlbHNlCi0JCSsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZ290byBpc25hbWU7Ci0JfQotICAgIGNhc2UgJywnOgotICAgIGNhc2UgJ1xuJzoKLSAgICBjYXNlICdcMCc6Ci0gICAgZW9sOgotICAgICAgLyogY2FuJ3QgaW1hZ2luZSBhbnkgb3RoZXIga2luZCBvZiBvcGVyYW5kICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYWJzZW50OwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyUnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoMiwgZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdAJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgIGludGVnZXJfY29uc3RhbnQgKDgsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnOic6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgcmVwcmVzZW50ZWQKLSAgICAgICAgIHVzaW5nIGhleGFkZWNpbWFsIGRpZ2l0cy4gICovCi0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoMTYsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKic6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpIHx8IGlzX3BhcnRfb2ZfbmFtZSAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JZ290byBkZV9mYXVsdDsKLQotICAgICAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgIGRlX2ZhdWx0OgotICAgICAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBjXSkKLQlnb3RvIGVvbDsKLSAgICAgIGlmIChpc19uYW1lX2JlZ2lubmVyIChjKSkJLyogaGVyZSBpZiBkaWQgbm90IGJlZ2luIHdpdGggYSBkaWdpdCAqLwotCXsKLQkgIC8qCi0JICAgKiBJZGVudGlmaWVyIGJlZ2lucyBoZXJlLgotCSAgICogVGhpcyBpcyBrbHVkZ2VkIGZvciBzcGVlZCwgc28gY29kZSBpcyByZXBlYXRlZC4KLQkgICAqLwotCWlzbmFtZToKLQkgIG5hbWUgPSAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotI2lmZGVmIG1kX3BhcnNlX25hbWUKLQkgIC8qIFRoaXMgaXMgYSBob29rIGZvciB0aGUgYmFja2VuZCB0byBwYXJzZSBjZXJ0YWluIG5hbWVzCi0gICAgICAgICAgICAgc3BlY2lhbGx5IGluIGNlcnRhaW4gY29udGV4dHMuICBJZiBhIG5hbWUgYWx3YXlzIGhhcyBhCi0gICAgICAgICAgICAgc3BlY2lmaWMgdmFsdWUsIGl0IGNhbiBvZnRlbiBiZSBoYW5kbGVkIGJ5IHNpbXBseQotICAgICAgICAgICAgIGVudGVyaW5nIGl0IGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCSAgaWYgKG1kX3BhcnNlX25hbWUgKG5hbWUsIGV4cHJlc3Npb25QKSkKLQkgICAgewotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0k5NjAKLQkgIC8qIFRoZSBNUkkgaTk2MCBhc3NlbWJsZXIgcGVybWl0cwotCSAgICAgICAgIGxkYSBzaXplb2YgY29kZSxnMTMKLQkgICAgIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgbWRfcGFyc2VfbmFtZS4gICovCi0JICBpZiAoZmxhZ19tcmkKLQkgICAgICAmJiAoc3RyY2FzZWNtcCAobmFtZSwgInNpemVvZiIpID09IDAKLQkJICB8fCBzdHJjYXNlY21wIChuYW1lLCAic3RhcnRvZiIpID09IDApKQotCSAgICB7Ci0JICAgICAgaW50IHN0YXJ0OwotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgIHN0YXJ0ID0gKG5hbWVbMV0gPT0gJ3QnCi0JCSAgICAgICB8fCBuYW1lWzFdID09ICdUJyk7Ci0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxMCk7Ci0JICAgICAgaWYgKHN0YXJ0KQotCQlzcHJpbnRmIChidWYsICIuc3RhcnRvZi4lcyIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIG5hbWUpOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbWFrZSAoYnVmKTsKLQkgICAgICBmcmVlIChidWYpOwotCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotCSAgICAgIGJyZWFrOwotCSAgICB9CSAgICAgIAotI2VuZGlmCi0KLQkgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotCSAgLyogSWYgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBzeW1ib2wgb3IgYSByZWcsIHRoZW4gd2Uga25vdyBpdHMKLQkgICAgIHZhbHVlIG5vdy4gICovCi0JICBzZWdtZW50ID0gU19HRVRfU0VHTUVOVCAoc3ltYm9sUCk7Ci0JICBpZiAoc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNlZ21lbnQgPT0gcmVnX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExldCB0aGUgdGFyZ2V0IHRyeSB0byBwYXJzZSBpdC4gIFN1Y2Nlc3MgaXMgaW5kaWNhdGVkIGJ5IGNoYW5naW5nCi0JICAgICB0aGUgWF9vcCBmaWVsZCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBPX2Fic2VudCBhbmQgcG9pbnRpbmcKLQkgICAgIGlucHV0X2xpbmVfcG9pbnRlciBwYXNzZWQgdGhlIGV4cHJlc3Npb24uICBJZiBpdCBjYW4ndCBwYXJzZSB0aGUKLQkgICAgIGV4cHJlc3Npb24sIFhfb3AgYW5kIGlucHV0X2xpbmVfcG9pbnRlciBzaG91bGQgYmUgdW5jaGFuZ2VkLiAgKi8KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19hYnNlbnQ7Ci0JICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIG1kX29wZXJhbmQgKGV4cHJlc3Npb25QKTsKLQkgIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGFzX2JhZCAoXygiQmFkIGV4cHJlc3Npb24iKSk7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qCi0gICAqIEl0IGlzIG1vcmUgJ2VmZmljaWVudCcgdG8gY2xlYW4gdXAgdGhlIGV4cHJlc3Npb25TIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4KLSAgICogRG9pbmcgaXQgaGVyZSBzYXZlcyBsaW5lcyBvZiBjb2RlLgotICAgKi8KLSAgY2xlYW5fdXBfZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7CQkvKi0+MXN0IGNoYXIgYWZ0ZXIgb3BlcmFuZC4gKi8KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcpOwotCi0gIC8qIFRoZSBQQSBwb3J0IG5lZWRzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkKLSAgICBzeW1ib2xfbWFya191c2VkIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKTsKLQotICBzd2l0Y2ggKGV4cHJlc3Npb25QLT5YX29wKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGFic29sdXRlX3NlY3Rpb247Ci0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIHJldHVybiBTX0dFVF9TRUdNRU5UIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKTsKLSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0gICAgICByZXR1cm4gcmVnX3NlY3Rpb247Ci0gICAgfQotfQkJCQkvKiBvcGVyYW5kKCkgKi8KLQwKLS8qIEludGVybmFsLiBTaW1wbGlmeSBhIHN0cnVjdCBleHByZXNzaW9uIGZvciB1c2UgYnkgZXhwcigpICovCi0KLS8qCi0gKiBJbjoJYWRkcmVzcyBvZiBhIGV4cHJlc3Npb25TLgotICoJVGhlIFhfb3AgZmllbGQgb2YgdGhlIGV4cHJlc3Npb25TIG1heSBvbmx5IHRha2UgY2VydGFpbiB2YWx1ZXMuCi0gKglFbHNld2lzZSB3ZSB3YXN0ZSB0aW1lIHNwZWNpYWwtY2FzZSB0ZXN0aW5nLiBTaWdoLiBEaXR0byBTRUdfQUJTRU5ULgotICogT3V0OglleHByZXNzaW9uUyBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOgotICoJJ2Zvby1mb28nIHN5bWJvbCByZWZlcmVuY2VzIGNhbmNlbGxlZCB0byAwLAotICoJCXdoaWNoIGNoYW5nZXMgWF9vcCBmcm9tIE9fc3VidHJhY3QgdG8gT19jb25zdGFudC4KLSAqCVVudXNlZCBmaWVsZHMgemVyb2VkIHRvIGhlbHAgZXhwcigpLgotICovCi0KLXN0YXRpYyB2b2lkCi1jbGVhbl91cF9leHByZXNzaW9uIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBzd2l0Y2ggKGV4cHJlc3Npb25QLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICBjYXNlIE9fYWJzZW50OgotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19iaWc6Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgIGNhc2UgT191bWludXM6Ci0gICAgY2FzZSBPX2JpdF9ub3Q6Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9PSBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sCi0JICB8fCAoKHN5bWJvbF9nZXRfZnJhZyAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sKQotCSAgICAgICA9PSBzeW1ib2xfZ2V0X2ZyYWcgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpKQotCSAgICAgICYmIFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpKQotCSAgICAgICYmIChTX0dFVF9WQUxVRSAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sKQotCQkgID09IFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKSkpKQotCXsKLQkgIGFkZHJlc3NUIGRpZmYgPSAoU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpCi0JCQkgICAtIFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wpKTsKLQotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciArPSBkaWZmOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBFeHByZXNzaW9uIHBhcnNlci4gKi8KLQotLyoKLSAqIFdlIGFsbG93IGFuIGVtcHR5IGV4cHJlc3Npb24sIGFuZCBqdXN0IGFzc3VtZSAoYWJzb2x1dGUsMCkgc2lsZW50bHkuCi0gKiBVbmFyeSBvcGVyYXRvcnMgYW5kIHBhcmVudGhldGljYWwgZXhwcmVzc2lvbnMgYXJlIHRyZWF0ZWQgYXMgb3BlcmFuZHMuCi0gKiBBcyB1c3VhbCwgUT09cXVhbnRpdHk9PW9wZXJhbmQsIE89PW9wZXJhdG9yLCBYPT1leHByZXNzaW9uIG1uZW1vbmljcy4KLSAqCi0gKiBXZSB1c2VkIHRvIGRvIGEgYWhvL3VsbG1hbiBzaGlmdC1yZWR1Y2UgcGFyc2VyLCBidXQgdGhlIGxvZ2ljIGdvdCBzbwotICogd2FycGVkIHRoYXQgSSBmbHVzaGVkIGl0IGFuZCB3cm90ZSBhIHJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNlciBpbnN0ZWFkLgotICogTm93IHRoaW5ncyBhcmUgc3RhYmxlLCB3b3VsZCBhbnlib2R5IGxpa2UgdG8gd3JpdGUgYSBmYXN0IHBhcnNlcj8KLSAqIE1vc3QgZXhwcmVzc2lvbnMgYXJlIGVpdGhlciByZWdpc3RlciAod2hpY2ggZG9lcyBub3QgZXZlbiByZWFjaCBoZXJlKQotICogb3IgMSBzeW1ib2wuIFRoZW4gInN5bWJvbCtjb25zdGFudCIgYW5kICJzeW1ib2wtc3ltYm9sIiBhcmUgY29tbW9uLgotICogU28gSSBndWVzcyBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgaG93IGluZWZmaWNpZW50IG1vcmUgY29tcGxleCBleHByZXNzaW9ucwotICogYXJlIHBhcnNlZC4KLSAqCi0gKiBBZnRlciBleHByKFJBTksscmVzdWx0UCkgaW5wdXRfbGluZV9wb2ludGVyLT5vcGVyYXRvciBvZiByYW5rIDw9IFJBTksuCi0gKiBBbHNvLCB3ZSBoYXZlIGNvbnN1bWVkIGFueSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyAob3BlcmFuZCBkb2VzIHRoYXQpCi0gKiBhbmQgZG9uZSBhbGwgaW50ZXJ2ZW5pbmcgb3BlcmF0b3JzLgotICoKLSAqIFRoaXMgcmV0dXJucyB0aGUgc2VnbWVudCBvZiB0aGUgcmVzdWx0LCB3aGljaCB3aWxsIGJlCi0gKiBhYnNvbHV0ZV9zZWN0aW9uIG9yIHRoZSBzZWdtZW50IG9mIGEgc3ltYm9sLgotICovCi0KLSN1bmRlZiBfXwotI2RlZmluZSBfXyBPX2lsbGVnYWwKLQotc3RhdGljIGNvbnN0IG9wZXJhdG9yVCBvcF9lbmNvZGluZ1syNTZdID0KLXsJCQkJLyogbWFwcyBBU0NJSS0+b3BlcmF0b3JzICovCi0KLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotCi0gIF9fLCBPX2JpdF9vcl9ub3QsIF9fLCBfXywgX18sIE9fbW9kdWx1cywgT19iaXRfYW5kLCBfXywKLSAgX18sIF9fLCBPX211bHRpcGx5LCBPX2FkZCwgX18sIE9fc3VidHJhY3QsIF9fLCBPX2RpdmlkZSwKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgT19sdCwgX18sIE9fZ3QsIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLAotI2lmZGVmIE5FRURfSU5ERVhfT1BFUkFUT1IKLSAgT19pbmRleCwKLSNlbHNlCi0gIF9fLAotI2VuZGlmCi0gIF9fLCBfXywgT19iaXRfZXhjbHVzaXZlX29yLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIE9fYml0X2luY2x1c2l2ZV9vciwgX18sIF9fLCBfXywKLQotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18KLX07Ci0KLQotLyoKLSAqCVJhbmsJRXhhbXBsZXMKLSAqCTAJb3BlcmFuZCwgKGV4cHJlc3Npb24pCi0gKgkxCXx8Ci0gKgkyCSYmCi0gKgkzCT0gPD4gPCA8PSA+PSA+Ci0gKgk0CSsgLQotICoJNQl1c2VkIGZvciAqIC8gJSBpbiBNUkkgbW9kZQotICoJNgkmIF4gISB8Ci0gKgk3CSogLyAlIDw8ID4+Ci0gKgk4CXVuYXJ5IC0gdW5hcnkgfgotICovCi1zdGF0aWMgb3BlcmF0b3JfcmFua1Qgb3BfcmFua1tdID0KLXsKLSAgMCwJLyogT19pbGxlZ2FsICovCi0gIDAsCS8qIE9fYWJzZW50ICovCi0gIDAsCS8qIE9fY29uc3RhbnQgKi8KLSAgMCwJLyogT19zeW1ib2wgKi8KLSAgMCwJLyogT19zeW1ib2xfcnZhICovCi0gIDAsCS8qIE9fcmVnaXN0ZXIgKi8KLSAgMCwJLyogT19iaXQgKi8KLSAgOSwJLyogT191bWludXMgKi8KLSAgOSwJLyogT19iaXRfbm90ICovCi0gIDksCS8qIE9fbG9naWNhbF9ub3QgKi8KLSAgOCwJLyogT19tdWx0aXBseSAqLwotICA4LAkvKiBPX2RpdmlkZSAqLwotICA4LAkvKiBPX21vZHVsdXMgKi8KLSAgOCwJLyogT19sZWZ0X3NoaWZ0ICovCi0gIDgsCS8qIE9fcmlnaHRfc2hpZnQgKi8KLSAgNywJLyogT19iaXRfaW5jbHVzaXZlX29yICovCi0gIDcsCS8qIE9fYml0X29yX25vdCAqLwotICA3LAkvKiBPX2JpdF9leGNsdXNpdmVfb3IgKi8KLSAgNywJLyogT19iaXRfYW5kICovCi0gIDUsCS8qIE9fYWRkICovCi0gIDUsCS8qIE9fc3VidHJhY3QgKi8KLSAgNCwJLyogT19lcSAqLwotICA0LAkvKiBPX25lICovCi0gIDQsCS8qIE9fbHQgKi8KLSAgNCwJLyogT19sZSAqLwotICA0LAkvKiBPX2dlICovCi0gIDQsCS8qIE9fZ3QgKi8KLSAgMywJLyogT19sb2dpY2FsX2FuZCAqLwotICAyLAkvKiBPX2xvZ2ljYWxfb3IgKi8KLSAgMSwJLyogT19pbmRleCAqLwotICAwLAkvKiBPX21kMSAqLwotICAwLAkvKiBPX21kMiAqLwotICAwLAkvKiBPX21kMyAqLwotICAwLAkvKiBPX21kNCAqLwotICAwLAkvKiBPX21kNSAqLwotICAwLAkvKiBPX21kNiAqLwotICAwLAkvKiBPX21kNyAqLwotICAwLAkvKiBPX21kOCAqLwotICAwLAkvKiBPX21kOSAqLwotICAwLAkvKiBPX21kMTAgKi8KLSAgMCwJLyogT19tZDExICovCi0gIDAsCS8qIE9fbWQxMiAqLwotICAwLAkvKiBPX21kMTMgKi8KLSAgMCwJLyogT19tZDE0ICovCi0gIDAsCS8qIE9fbWQxNSAqLwotICAwLAkvKiBPX21kMTYgKi8KLX07Ci0KLS8qIFVuZm9ydHVuYXRlbHksIGluIE1SSSBtb2RlIGZvciB0aGUgbTY4aywgbXVsdGlwbGljYXRpb24gYW5kCi0gICBkaXZpc2lvbiBoYXZlIGxvd2VyIHByZWNlZGVuY2UgdGhhbiB0aGUgYml0IHdpc2Ugb3BlcmF0b3JzLiAgVGhpcwotICAgZnVuY3Rpb24gc2V0cyB0aGUgb3BlcmF0b3IgcHJlY2VkZW5jZXMgY29ycmVjdGx5IGZvciB0aGUgY3VycmVudAotICAgbW9kZS4gIEFsc28sIE1SSSB1c2VzIGEgZGlmZmVyZW50IGJpdF9ub3Qgb3BlcmF0b3IsIGFuZCB0aGlzIGZpeGVzCi0gICB0aGF0IGFzIHdlbGwuICAqLwotCi0jZGVmaW5lIFNUQU5EQVJEX01VTF9QUkVDRURFTkNFICg3KQotI2RlZmluZSBNUklfTVVMX1BSRUNFREVOQ0UgKDUpCi0KLXZvaWQKLWV4cHJfc2V0X3ByZWNlZGVuY2UgKCkKLXsKLSAgaWYgKGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgb3BfcmFua1tPX211bHRpcGx5XSA9IE1SSV9NVUxfUFJFQ0VERU5DRTsKLSAgICAgIG9wX3JhbmtbT19kaXZpZGVdID0gTVJJX01VTF9QUkVDRURFTkNFOwotICAgICAgb3BfcmFua1tPX21vZHVsdXNdID0gTVJJX01VTF9QUkVDRURFTkNFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9wX3JhbmtbT19tdWx0aXBseV0gPSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRTsKLSAgICAgIG9wX3JhbmtbT19kaXZpZGVdID0gU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fbW9kdWx1c10gPSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRTsKLSAgICB9Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGV4cHJlc3Npb24gcGFyc2VyLiAgKi8KLQotdm9pZAotZXhwcl9iZWdpbiAoKQotewotICBleHByX3NldF9wcmVjZWRlbmNlICgpOwotCi0gIC8qIFZlcmlmeSB0aGF0IFhfb3AgZmllbGQgaXMgd2lkZSBlbm91Z2guICAqLwotICB7Ci0gICAgZXhwcmVzc2lvblMgZTsKLSAgICBlLlhfb3AgPSBPX21heDsKLSAgICBhc3NlcnQgKGUuWF9vcCA9PSBPX21heCk7Ci0gIH0KLX0KLQwKLS8qIFJldHVybiB0aGUgZW5jb2RpbmcgZm9yIHRoZSBvcGVyYXRvciBhdCBJTlBVVF9MSU5FX1BPSU5URVIuCi0gICBBZHZhbmNlIElOUFVUX0xJTkVfUE9JTlRFUiB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIG9wZXJhdG9yCi0gICAoaS5lLiwgZG9uJ3QgY2hhbmdlIGl0IGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgb3BlcmF0b3IpLiAgKi8KLQotc3RhdGljIGlubGluZSBvcGVyYXRvclQKLW9wZXJhdG9yICgpCi17Ci0gIGludCBjOwotICBvcGVyYXRvclQgcmV0OwotCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyICYgMHhmZjsKLQotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0KLSAgICBjYXNlICc8JzoKLSAgICAgIHN3aXRjaCAoaW5wdXRfbGluZV9wb2ludGVyWzFdKQotCXsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCWNhc2UgJzwnOgotCSAgcmV0ID0gT19sZWZ0X3NoaWZ0OwotCSAgYnJlYWs7Ci0JY2FzZSAnPic6Ci0JICByZXQgPSBPX25lOwotCSAgYnJlYWs7Ci0JY2FzZSAnPSc6Ci0JICByZXQgPSBPX2xlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gcmV0OwotCi0gICAgY2FzZSAnPSc6Ci0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICc9JykKLQlyZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIE9fZXE7Ci0KLSAgICBjYXNlICc+JzoKLSAgICAgIHN3aXRjaCAoaW5wdXRfbGluZV9wb2ludGVyWzFdKQotCXsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCWNhc2UgJz4nOgotCSAgcmV0ID0gT19yaWdodF9zaGlmdDsKLQkgIGJyZWFrOwotCWNhc2UgJz0nOgotCSAgcmV0ID0gT19nZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIHJldDsKLQotICAgIGNhc2UgJyEnOgotICAgICAgLyogV2UgYWNjZXB0ICEhIGFzIGVxdWl2YWxlbnQgdG8gXiBmb3IgTVJJIGNvbXBhdGliaWxpdHkuICAqLwotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnIScpCi0JewotCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JICAgIHJldHVybiBPX2JpdF9pbmNsdXNpdmVfb3I7Ci0JICByZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gT19iaXRfZXhjbHVzaXZlX29yOwotCi0gICAgY2FzZSAnfCc6Ci0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICd8JykKLQlyZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIE9fbG9naWNhbF9vcjsKLQotICAgIGNhc2UgJyYnOgotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnJicpCi0JcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2xvZ2ljYWxfYW5kOwotICAgIH0KLQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBQYXJzZSBhbiBleHByZXNzaW9uLiAgKi8KLQotc2VnVAotZXhwciAocmFua2FyZywgcmVzdWx0UCkKLSAgICAgaW50IHJhbmthcmc7CS8qIExhcmdlciAjIGlzIGhpZ2hlciByYW5rLiAqLwotICAgICBleHByZXNzaW9uUyAqcmVzdWx0UDsJLyogRGVsaXZlciByZXN1bHQgaGVyZS4gKi8KLXsKLSAgb3BlcmF0b3JfcmFua1QgcmFuayA9IChvcGVyYXRvcl9yYW5rVCkgcmFua2FyZzsKLSAgc2VnVCByZXR2YWw7Ci0gIGV4cHJlc3Npb25TIHJpZ2h0OwotICBvcGVyYXRvclQgb3BfbGVmdDsKLSAgb3BlcmF0b3JUIG9wX3JpZ2h0OwotCi0gIGtub3cgKHJhbmsgPj0gMCk7Ci0KLSAgcmV0dmFsID0gb3BlcmFuZCAocmVzdWx0UCk7Ci0KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcpOwkvKiBPcGVyYW5kKCkgZ29iYmxlcyBzcGFjZXMuICovCi0KLSAgb3BfbGVmdCA9IG9wZXJhdG9yICgpOwotICB3aGlsZSAob3BfbGVmdCAhPSBPX2lsbGVnYWwgJiYgb3BfcmFua1soaW50KSBvcF9sZWZ0XSA+IHJhbmspCi0gICAgewotICAgICAgc2VnVCByaWdodHNlZzsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CS8qLT5hZnRlciAxc3QgY2hhcmFjdGVyIG9mIG9wZXJhdG9yLiAqLwotCi0gICAgICByaWdodHNlZyA9IGV4cHIgKG9wX3JhbmtbKGludCkgb3BfbGVmdF0sICZyaWdodCk7Ci0gICAgICBpZiAocmlnaHQuWF9vcCA9PSBPX2Fic2VudCkKLQl7Ci0JICBhc193YXJuIChfKCJtaXNzaW5nIG9wZXJhbmQ7IHplcm8gYXNzdW1lZCIpKTsKLQkgIHJpZ2h0Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmlnaHQuWF9hZGRfbnVtYmVyID0gMDsKLQkgIHJpZ2h0LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICByaWdodC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyk7Ci0KLSAgICAgIGlmIChvcF9sZWZ0ID09IE9faW5kZXgpCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ10nKQotCSAgICBhc19iYWQgKCJtaXNzaW5nIHJpZ2h0IGJyYWNrZXQiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJldHZhbCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQl7Ci0JICBpZiAoU0VHX05PUk1BTCAocmlnaHRzZWcpKQotCSAgICByZXR2YWwgPSByaWdodHNlZzsKLQl9Ci0gICAgICBlbHNlIGlmICghIFNFR19OT1JNQUwgKHJldHZhbCkpCi0JcmV0dmFsID0gcmlnaHRzZWc7Ci0gICAgICBlbHNlIGlmIChTRUdfTk9STUFMIChyaWdodHNlZykKLQkgICAgICAgJiYgcmV0dmFsICE9IHJpZ2h0c2VnCi0jaWZkZWYgRElGRl9FWFBSX09LCi0JICAgICAgICYmIG9wX2xlZnQgIT0gT19zdWJ0cmFjdAotI2VuZGlmCi0JICAgICAgICkKLQlhc19iYWQgKF8oIm9wZXJhdGlvbiBjb21iaW5lcyBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKLQotICAgICAgb3BfcmlnaHQgPSBvcGVyYXRvciAoKTsKLQotICAgICAga25vdyAob3BfcmlnaHQgPT0gT19pbGxlZ2FsIHx8IG9wX3JhbmtbKGludCkgb3BfcmlnaHRdIDw9IG9wX3JhbmtbKGludCkgb3BfbGVmdF0pOwotICAgICAga25vdyAoKGludCkgb3BfbGVmdCA+PSAoaW50KSBPX211bHRpcGx5Ci0JICAgICYmIChpbnQpIG9wX2xlZnQgPD0gKGludCkgT19sb2dpY2FsX29yKTsKLQotICAgICAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciByaWdodC1oYW5kIHF1YW50aXR5LiAqLwotICAgICAgLyogbGVmdC1oYW5kIHF1YW50aXR5IGluIHJlc3VsdFAgKi8KLSAgICAgIC8qIHJpZ2h0LWhhbmQgcXVhbnRpdHkgaW4gcmlnaHQuICovCi0gICAgICAvKiBvcGVyYXRvciBpbiBvcF9sZWZ0LiAqLwotCi0gICAgICBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX2JpZykKLQl7Ci0JICBpZiAocmVzdWx0UC0+WF9hZGRfbnVtYmVyID4gMCkKLQkgICAgYXNfd2FybiAoXygibGVmdCBvcGVyYW5kIGlzIGEgYmlnbnVtOyBpbnRlZ2VyIDAgYXNzdW1lZCIpKTsKLQkgIGVsc2UKLQkgICAgYXNfd2FybiAoXygibGVmdCBvcGVyYW5kIGlzIGEgZmxvYXQ7IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgcmVzdWx0UC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQl9Ci0gICAgICBpZiAocmlnaHQuWF9vcCA9PSBPX2JpZykKLQl7Ci0JICBpZiAocmlnaHQuWF9hZGRfbnVtYmVyID4gMCkKLQkgICAgYXNfd2FybiAoXygicmlnaHQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiKSk7Ci0JICBlbHNlCi0JICAgIGFzX3dhcm4gKF8oInJpZ2h0IG9wZXJhbmQgaXMgYSBmbG9hdDsgaW50ZWdlciAwIGFzc3VtZWQiKSk7Ci0JICByaWdodC5YX29wID0gT19jb25zdGFudDsKLQkgIHJpZ2h0LlhfYWRkX251bWJlciA9IDA7Ci0JICByaWdodC5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgcmlnaHQuWF9vcF9zeW1ib2wgPSBOVUxMOwotCX0KLQotICAgICAgLyogT3B0aW1pemUgY29tbW9uIGNhc2VzLiAgKi8KLSAgICAgIGlmIChvcF9sZWZ0ID09IE9fYWRkICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBYICsgY29uc3RhbnQuICAqLwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IHJpZ2h0LlhfYWRkX251bWJlcjsKLQl9Ci0gICAgICAvKiBUaGlzIGNhc2UgY29tZXMgdXAgaW4gUElDIGNvZGUuICAqLwotICAgICAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0Ci0JICAgICAgICYmIHJpZ2h0Llhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgcmVzdWx0UC0+WF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAoc3ltYm9sX2dldF9mcmFnIChyaWdodC5YX2FkZF9zeW1ib2wpCi0JCSAgID09IHN5bWJvbF9nZXRfZnJhZyAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKSkKLQkgICAgICAgJiYgU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAocmlnaHQuWF9hZGRfc3ltYm9sKSkpCi0KLQl7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IChTX0dFVF9WQUxVRSAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKQotCQkJCSAgICAtIFNfR0VUX1ZBTFVFIChyaWdodC5YX2FkZF9zeW1ib2wpKTsKLQkgIHJlc3VsdFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fc3VidHJhY3QgJiYgcmlnaHQuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFggLSBjb25zdGFudC4gICovCi0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wX2xlZnQgPT0gT19hZGQgJiYgcmVzdWx0UC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIENvbnN0YW50ICsgWC4gICovCi0JICByZXN1bHRQLT5YX29wID0gcmlnaHQuWF9vcDsKLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IHJpZ2h0LlhfYWRkX3N5bWJvbDsKLQkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gcmlnaHQuWF9vcF9zeW1ib2w7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgcmV0dmFsID0gcmlnaHRzZWc7Ci0JfQotICAgICAgZWxzZSBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBDb25zdGFudCBPUCBjb25zdGFudC4gICovCi0JICBvZmZzZXRUIHYgPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JICBpZiAodiA9PSAwICYmIChvcF9sZWZ0ID09IE9fZGl2aWRlIHx8IG9wX2xlZnQgPT0gT19tb2R1bHVzKSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImRpdmlzaW9uIGJ5IHplcm8iKSk7Ci0JICAgICAgdiA9IDE7Ci0JICAgIH0KLQkgIHN3aXRjaCAob3BfbGVmdCkKLQkgICAgewotCSAgICBkZWZhdWx0OgkJCWFib3J0ICgpOwotCSAgICBjYXNlIE9fbXVsdGlwbHk6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgKj0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19kaXZpZGU6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgLz0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19tb2R1bHVzOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICU9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fbGVmdF9zaGlmdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciA8PD0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19yaWdodF9zaGlmdDoKLQkgICAgICAvKiBXZSBhbHdheXMgdXNlIHVuc2lnbmVkIHNoaWZ0cywgdG8gYXZvaWQgcmVseWluZyBvbgotICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSBnYXMuICAqLwotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCShvZmZzZXRUKSAoKHZhbHVlVCkgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID4+ICh2YWx1ZVQpIHYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIHw9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X29yX25vdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciB8PSB+djsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOglyZXN1bHRQLT5YX2FkZF9udW1iZXIgXj0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfYW5kOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICY9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fYWRkOgkJCXJlc3VsdFAtPlhfYWRkX251bWJlciArPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX3N1YnRyYWN0OgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fZXE6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyID09IHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX25lOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciAhPSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19sdDoKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPCAgdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbGU6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIDw9IHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2dlOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA+PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19ndDoKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPiAgdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0gcmVzdWx0UC0+WF9hZGRfbnVtYmVyICYmIHY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19sb2dpY2FsX29yOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IHJlc3VsdFAtPlhfYWRkX251bWJlciB8fCB2OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiByaWdodC5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmIChvcF9sZWZ0ID09IE9fYWRkCi0JCSAgIHx8IG9wX2xlZnQgPT0gT19zdWJ0cmFjdAotCQkgICB8fCAocmVzdWx0UC0+WF9hZGRfbnVtYmVyID09IDAKLQkJICAgICAgICYmIHJpZ2h0LlhfYWRkX251bWJlciA9PSAwKSkpCi0JewotCSAgLyogU3ltYm9sIE9QIHN5bWJvbC4gICovCi0JICByZXN1bHRQLT5YX29wID0gb3BfbGVmdDsKLQkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gcmlnaHQuWF9hZGRfc3ltYm9sOwotCSAgaWYgKG9wX2xlZnQgPT0gT19hZGQpCi0JICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fc3VidHJhY3QpCi0JICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciAtPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBnZW5lcmFsIGNhc2UuICAqLwotCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAocmVzdWx0UCk7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyaWdodCk7Ci0JICByZXN1bHRQLT5YX29wID0gb3BfbGVmdDsKLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IDA7Ci0JICByZXN1bHRQLT5YX3Vuc2lnbmVkID0gMTsKLQl9Ci0KLSAgICAgIG9wX2xlZnQgPSBvcF9yaWdodDsKLSAgICB9CQkJCS8qIFdoaWxlIG5leHQgb3BlcmF0b3IgaXMgPj0gdGhpcyByYW5rLiAqLwotCi0gIC8qIFRoZSBQQSBwb3J0IG5lZWRzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKQotICAgIHN5bWJvbF9tYXJrX3VzZWQgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCk7Ci0KLSAgcmV0dXJuIHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCA/IGFic29sdXRlX3NlY3Rpb24gOiByZXR2YWw7Ci19Ci0MCi0vKgotICoJCQlnZXRfc3ltYm9sX2VuZCgpCi0gKgotICogVGhpcyBsaXZlcyBoZXJlIGJlY2F1c2UgaXQgYmVsb25ncyBlcXVhbGx5IGluIGV4cHIuYyAmIHJlYWQuYy4KLSAqIEV4cHIuYyBpcyBqdXN0IGEgYnJhbmNoIG9mZmljZSByZWFkLmMgYW55d2F5LCBhbmQgcHV0dGluZyBpdAotICogaGVyZSBsZXNzZW5zIHRoZSBjcm93ZCBhdCByZWFkLmMuCi0gKgotICogQXNzdW1lIGlucHV0X2xpbmVfcG9pbnRlciBpcyBhdCBzdGFydCBvZiBzeW1ib2wgbmFtZS4KLSAqIEFkdmFuY2UgaW5wdXRfbGluZV9wb2ludGVyIHBhc3Qgc3ltYm9sIG5hbWUuCi0gKiBUdXJuIHRoYXQgY2hhcmFjdGVyIGludG8gYSAnXDAnLCByZXR1cm5pbmcgaXRzIGZvcm1lciB2YWx1ZS4KLSAqIFRoaXMgYWxsb3dzIGEgc3RyaW5nIGNvbXBhcmUgKFJNUyB3YW50cyBzeW1ib2wgbmFtZXMgdG8gYmUgc3RyaW5ncykKLSAqIG9mIHRoZSBzeW1ib2wgbmFtZS4KLSAqIFRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgY2hhciBmb2xsb3dpbmcgc3ltYm9sIG5hbWUsIGJlY2F1c2UgYWxsIGdvb2QKLSAqIGxpbmVzIGVuZCBpbiBlbmQtb2YtbGluZS4KLSAqLwotY2hhcgotZ2V0X3N5bWJvbF9lbmQgKCkKLXsKLSAgY2hhciBjOwotCi0gIC8qIFdlIGFjY2VwdCBcMDAxIGluIGEgbmFtZSBpbiBjYXNlIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHdpdGggYQotICAgICBjb25zdHJ1Y3RlZCBzdHJpbmcuICAqLwotICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykgfHwgYyA9PSAnXDAwMScpCi0gICAgewotICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLQkgICAgIHx8IGMgPT0gJ1wwMDEnKQotCTsKLSAgICAgIGlmIChpc19uYW1lX2VuZGVyIChjKSkKLQljID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgcmV0dXJuIChjKTsKLX0KLQotCi11bnNpZ25lZCBpbnQKLWdldF9zaW5nbGVfbnVtYmVyICgpCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgb3BlcmFuZCAoJmV4cCk7Ci0gIHJldHVybiBleHAuWF9hZGRfbnVtYmVyOwotCi19Ci0KLS8qIGVuZCBvZiBleHByLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9leHByLmggYi9nYXMvZXhwci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWQ2YWY2Li4wMDAwMDAwCi0tLSBhL2dhcy9leHByLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyogZXhwci5oIC0+IGhlYWRlciBmaWxlIGZvciBleHByLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBCeSBwb3B1bGFyIGRlbWFuZCwgd2UgZGVmaW5lIGEgc3RydWN0IHRvIHJlcHJlc2VudCBhbiBleHByZXNzaW9uLgotICogVGhpcyB3aWxsIG5vIGRvdWJ0IG11dGF0ZSBhcyBleHByZXNzaW9ucyBiZWNvbWUgYmFyb3F1ZS4KLSAqCi0gKiBDdXJyZW50bHksIHdlIHN1cHBvcnQgZXhwcmVzc2lvbnMgbGlrZSAiZm9vIE9QIGJhciArIDQyIi4gIEluIG90aGVyCi0gKiB3b3JkcyB3ZSBwZXJtaXQgYSAocG9zc2libHkgdW5kZWZpbmVkKSBzeW1ib2wsIGEgKHBvc3NpYmx5Ci0gKiB1bmRlZmluZWQpIHN5bWJvbCBhbmQgdGhlIG9wZXJhdGlvbiB1c2VkIHRvIGNvbWJpbmUgdGhlIHN5bWJvbHMsCi0gKiBhbmQgYW4gKGFic29sdXRlKSBhdWdlbmQuICBSTVMgc2F5cyB0aGlzIGlzIHNvIHdlIGNhbiBoYXZlIDEtcGFzcwotICogYXNzZW1ibHkgZm9yIGFueSBjb21waWxlciBlbWlzc2lvbnMsIGFuZCBhICdjYXNlJyBzdGF0ZW1lbnQgbWlnaHQKLSAqIGVtaXQgJ3VuZGVmaW5lZDEgLSB1bmRlZmluZWQyJy4KLSAqCi0gKiBUaGUgdHlwZSBvZiBhbiBleHByZXNzaW9uIHVzZWQgdG8gYmUgc3RvcmVkIGFzIGEgc2VnbWVudC4gIFRoYXQgZ290Ci0gKiBjb25mdXNpbmcgYmVjYXVzZSBpdCBvdmVybG9hZGVkIHRoZSBjb25jZXB0IG9mIGEgc2VnbWVudC4gIEkgYWRkZWQKLSAqIGFuIG9wZXJhdG9yIGZpZWxkLCBpbnN0ZWFkLgotICovCi0KLS8qIFRoaXMgaXMgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbi4gIFRoZSBvcGVyYXRvciB0eXBlcyBhcmUgYWxzbwotICAgdXNlZCB3aGlsZSBwYXJzaW5nIGFuIGV4cHJlc3Npb24uCi0KLSAgIE5PVEU6IFRoaXMgZW51bWVyYXRpb24gbXVzdCBtYXRjaCB0aGUgb3BfcmFuayBhcnJheSBpbiBleHByLmMuICAqLwotCi10eXBlZGVmIGVudW0KLXsKLSAgLyogQW4gaWxsZWdhbCBleHByZXNzaW9uLiAgKi8KLSAgT19pbGxlZ2FsLAotICAvKiBBIG5vbmV4aXN0ZW50IGV4cHJlc3Npb24uICAqLwotICBPX2Fic2VudCwKLSAgLyogWF9hZGRfbnVtYmVyIChhIGNvbnN0YW50IGV4cHJlc3Npb24pLiAgKi8KLSAgT19jb25zdGFudCwKLSAgLyogWF9hZGRfc3ltYm9sICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19zeW1ib2wsCi0gIC8qIFhfYWRkX3N5bWJvbCArIFhfYWRkX251bWJlciAtIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGltYWdlLiAgKi8KLSAgT19zeW1ib2xfcnZhLAotICAvKiBBIHJlZ2lzdGVyIChYX2FkZF9udW1iZXIgaXMgcmVnaXN0ZXIgbnVtYmVyKS4gICovCi0gIE9fcmVnaXN0ZXIsCi0gIC8qIEEgYmlnIHZhbHVlLiAgSWYgWF9hZGRfbnVtYmVyIGlzIG5lZ2F0aXZlIG9yIDAsIHRoZSB2YWx1ZSBpcyBpbgotICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci4gIE90aGVyd2lzZSB0aGUgdmFsdWUgaXMgaW4KLSAgICAgZ2VuZXJpY19iaWdudW0sIGFuZCBYX2FkZF9udW1iZXIgaXMgdGhlIG51bWJlciBvZiBMSVRUTEVOVU1zIGluCi0gICAgIHRoZSB2YWx1ZS4gICovCi0gIE9fYmlnLAotICAvKiAoLSBYX2FkZF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT191bWludXMsCi0gIC8qICh+IFhfYWRkX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9ub3QsCi0gIC8qICghIFhfYWRkX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xvZ2ljYWxfbm90LAotICAvKiAoWF9hZGRfc3ltYm9sICogWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19tdWx0aXBseSwKLSAgLyogKFhfYWRkX3N5bWJvbCAvIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fZGl2aWRlLAotICAvKiBYX2FkZF9zeW1ib2wgJSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX21vZHVsdXMsCi0gIC8qIFhfYWRkX3N5bWJvbCA8PCBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xlZnRfc2hpZnQsCi0gIC8qIFhfYWRkX3N5bWJvbCA+PiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX3JpZ2h0X3NoaWZ0LAotICAvKiBYX2FkZF9zeW1ib2wgfCBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9pbmNsdXNpdmVfb3IsCi0gIC8qIFhfYWRkX3N5bWJvbCB8fiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9vcl9ub3QsCi0gIC8qIFhfYWRkX3N5bWJvbCBeIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYml0X2V4Y2x1c2l2ZV9vciwKLSAgLyogWF9hZGRfc3ltYm9sICYgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfYW5kLAotICAvKiBYX2FkZF9zeW1ib2wgKyBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2FkZCwKLSAgLyogWF9hZGRfc3ltYm9sIC0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19zdWJ0cmFjdCwKLSAgLyogKFhfYWRkX3N5bWJvbCA9PSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2VxLAotICAvKiAoWF9hZGRfc3ltYm9sICE9IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbmUsCi0gIC8qIChYX2FkZF9zeW1ib2wgPCBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2x0LAotICAvKiAoWF9hZGRfc3ltYm9sIDw9IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbGUsCi0gIC8qIChYX2FkZF9zeW1ib2wgPj0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19nZSwKLSAgLyogKFhfYWRkX3N5bWJvbCA+IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fZ3QsCi0gIC8qIChYX2FkZF9zeW1ib2wgJiYgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sb2dpY2FsX2FuZCwKLSAgLyogKFhfYWRkX3N5bWJvbCB8fCBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xvZ2ljYWxfb3IsCi0gIC8qIFhfb3Bfc3ltYm9sIFsgWF9hZGRfc3ltYm9sIF0gKi8KLSAgT19pbmRleCwKLSAgLyogbWFjaGluZSBkZXBlbmRlbnQgb3BlcmF0b3JzICovCi0gIE9fbWQxLCAgT19tZDIsICBPX21kMywgIE9fbWQ0LCAgT19tZDUsICBPX21kNiwgIE9fbWQ3LCAgT19tZDgsCi0gIE9fbWQ5LCAgT19tZDEwLCBPX21kMTEsIE9fbWQxMiwgT19tZDEzLCBPX21kMTQsIE9fbWQxNSwgT19tZDE2LAotICAvKiB0aGlzIG11c3QgYmUgdGhlIGxhcmdlc3QgdmFsdWUgKi8KLSAgT19tYXgKLX0gb3BlcmF0b3JUOwotCi10eXBlZGVmIHN0cnVjdCBleHByZXNzaW9uUwotewotICAvKiBUaGUgbWFpbiBzeW1ib2wuICAqLwotICBzeW1ib2xTICpYX2FkZF9zeW1ib2w7Ci0gIC8qIFRoZSBzZWNvbmQgc3ltYm9sLCBpZiBuZWVkZWQuICAqLwotICBzeW1ib2xTICpYX29wX3N5bWJvbDsKLSAgLyogQSBudW1iZXIgdG8gYWRkLiAgKi8KLSAgb2Zmc2V0VCBYX2FkZF9udW1iZXI7Ci0KLSAgLyogVGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uICBXZSBjYW4ndCBhc3N1bWUgdGhhdCBhbiBhcmJpdHJhcnkKLSAgICAgY29tcGlsZXIgY2FuIGhhbmRsZSBhIGJpdGZpZWxkIG9mIGVudW0gdHlwZS4gIEZJWE1FOiBXZSBjb3VsZAotICAgICBjaGVjayB0aGlzIHVzaW5nIGF1dG9jb25mLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotICBvcGVyYXRvclQgWF9vcCA6IDg7Ci0jZWxzZQotICB1bnNpZ25lZCBjaGFyIFhfb3A7Ci0jZW5kaWYKLQotICAvKiBOb24temVybyBpZiBYX2FkZF9udW1iZXIgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIHVuc2lnbmVkLiAgVGhpcyBpcwotICAgICBvbmx5IHZhbGlkIGZvciBPX2NvbnN0YW50IGV4cHJlc3Npb25zLiAgSXQgaXMgb25seSB1c2VkIHdoZW4gYW4KLSAgICAgT19jb25zdGFudCBtdXN0IGJlIGV4dGVuZGVkIGludG8gYSBiaWdudW0gKGkuZS4sIGl0IGlzIG5vdCB1c2VkCi0gICAgIHdoZW4gcGVyZm9ybWluZyBhcml0aG1ldGljIG9uIHRoZXNlIHZhbHVlcykuCi0gICAgIEZJWE1FOiBUaGlzIGZpZWxkIGlzIG5vdCBzZXQgdmVyeSByZWxpYWJseS4gICovCi0gIHVuc2lnbmVkIGludCBYX3Vuc2lnbmVkIDogMTsKLQotICAvKiA3IGFkZGl0aW9uYWwgYml0cyBjYW4gYmUgZGVmaW5lZCBpZiBuZWVkZWQuICAqLwotCi0gIC8qIE1hY2hpbmUgZGVwZW5kZW50IGZpZWxkICovCi0gIHVuc2lnbmVkIHNob3J0IFhfbWQ7Ci19IGV4cHJlc3Npb25TOwotCi0vKiAicmVzdWx0IiBzaG91bGQgYmUgdHlwZSAoZXhwcmVzc2lvblMgKikuICovCi0jZGVmaW5lIGV4cHJlc3Npb24ocmVzdWx0KSBleHByICgwLCByZXN1bHQpCi0KLS8qIElmIGFuIGV4cHJlc3Npb24gaXMgT19iaWcsIGxvb2sgaGVyZSBmb3IgaXRzIHZhbHVlLiBUaGVzZSBjb21tb24KLSAgIGRhdGEgbWF5IGJlIGNsb2JiZXJlZCB3aGVuZXZlciBleHByKCkgaXMgY2FsbGVkLiAqLwotLyogRmxvbnVtcyByZXR1cm5lZCBoZXJlLiAgQmlnIGVub3VnaCB0byBob2xkIG1vc3QgcHJlY2lzZSBmbG9udW0uICovCi1leHRlcm4gRkxPTlVNX1RZUEUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXI7Ci0vKiBCaWdudW1zIHJldHVybmVkIGhlcmUuICovCi1leHRlcm4gTElUVExFTlVNX1RZUEUgZ2VuZXJpY19iaWdudW1bXTsKLS8qIE51bWJlciBvZiBsaXR0bGVudW1zIGluIGFib3ZlLiAqLwotI2RlZmluZSBTSVpFX09GX0xBUkdFX05VTUJFUiAoMjApCi0KLXR5cGVkZWYgY2hhciBvcGVyYXRvcl9yYW5rVDsKLQotZXh0ZXJuIGNoYXIgZ2V0X3N5bWJvbF9lbmQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZXhwcl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBleHByX3NldF9wcmVjZWRlbmNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBzZWdUIGV4cHIgUEFSQU1TICgoaW50IHJhbmssIGV4cHJlc3Npb25TICogcmVzdWx0UCkpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfc2luZ2xlX251bWJlciBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gc3ltYm9sUyAqbWFrZV9leHByX3N5bWJvbCBQQVJBTVMgKChleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QKSk7Ci1leHRlcm4gaW50IGV4cHJfc3ltYm9sX3doZXJlCi0gIFBBUkFNUyAoKHN5bWJvbFMgKiwgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotZXh0ZXJuIHN5bWJvbFMgKmV4cHJfYnVpbGRfdWNvbnN0YW50IFBBUkFNUyAoKG9mZnNldFQpKTsKLWV4dGVybiBzeW1ib2xTICpleHByX2J1aWxkX3VuYXJ5IFBBUkFNUyAoKG9wZXJhdG9yVCwgc3ltYm9sUyAqKSk7Ci1leHRlcm4gc3ltYm9sUyAqZXhwcl9idWlsZF9iaW5hcnkgUEFSQU1TICgob3BlcmF0b3JULCBzeW1ib2xTICosIHN5bWJvbFMgKikpOwotZXh0ZXJuIHN5bWJvbFMgKmV4cHJfYnVpbGRfZG90IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogZW5kIG9mIGV4cHIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Zsb251bS1jb3B5LmMgYi9nYXMvZmxvbnVtLWNvcHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjYzVjYy4uMDAwMDAwMAotLS0gYS9nYXMvZmxvbnVtLWNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIGZsb251bV9jb3B5LmMgLSBjb3B5IGEgZmxvbnVtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLXZvaWQKLWZsb251bV9jb3B5IChpbiwgb3V0KQotICAgICBGTE9OVU1fVFlQRSAqaW47Ci0gICAgIEZMT05VTV9UWVBFICpvdXQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpbl9sZW5ndGg7CQkvKiAwIG9yaWdpbiAqLwotICB1bnNpZ25lZCBpbnQgb3V0X2xlbmd0aDsJCS8qIDAgb3JpZ2luICovCi0KLSAgb3V0LT5zaWduID0gaW4tPnNpZ247Ci0gIGluX2xlbmd0aCA9IGluLT5sZWFkZXIgLSBpbi0+bG93OwotCi0gIGlmIChpbi0+bGVhZGVyIDwgaW4tPmxvdykKLSAgICB7Ci0gICAgICBvdXQtPmxlYWRlciA9IG91dC0+bG93IC0gMTsJLyogMC4wIGNhc2UgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvdXRfbGVuZ3RoID0gb3V0LT5oaWdoIC0gb3V0LT5sb3c7Ci0gICAgICAvKgotICAgICAgICogQXNzdW1lIG5vIEdBUFMgaW4gcGFja2luZyBvZiBsaXR0bGVudW1zLgotICAgICAgICogSS5lLiBzaXplb2YoYXJyYXkpID09IHNpemVvZihlbGVtZW50KSAqIG51bWJlcl9vZl9lbGVtZW50cy4KLSAgICAgICAqLwotICAgICAgaWYgKGluX2xlbmd0aCA8PSBvdXRfbGVuZ3RoKQotCXsKLQkgIHsKLQkgICAgLyoKLQkgICAgICogRm9yIGRlZmVuc2l2ZSBwcm9ncmFtbWluZywgemVybyBhbnkgaGlnaC1vcmRlciBsaXR0bGVudW1zIHdlIGRvbid0IG5lZWQuCi0JICAgICAqIFRoaXMgaXMgZGVzdHJveWluZyBldmlkZW5jZSBhbmQgd2FzdGluZyB0aW1lLCBzbyB3aHkgYm90aGVyPz8/Ci0JICAgICAqLwotCSAgICBpZiAoaW5fbGVuZ3RoIDwgb3V0X2xlbmd0aCkKLQkgICAgICB7Ci0JCW1lbXNldCAoKGNoYXIgKikgKG91dC0+bG93ICsgaW5fbGVuZ3RoICsgMSksICdcMCcsIG91dF9sZW5ndGggLSBpbl9sZW5ndGgpOwotCSAgICAgIH0KLQkgIH0KLQkgIG1lbWNweSAoKHZvaWQgKikgKG91dC0+bG93KSwgKHZvaWQgKikgKGluLT5sb3cpLCAoKGluX2xlbmd0aCArIDEpICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpKTsKLQkgIG91dC0+ZXhwb25lbnQgPSBpbi0+ZXhwb25lbnQ7Ci0JICBvdXQtPmxlYWRlciA9IGluLT5sZWFkZXIgLSBpbi0+bG93ICsgb3V0LT5sb3c7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBzaG9ydGVuOwkJLyogMS1vcmlnaW4uIE51bWJlciBvZiBsaXR0bGVudW1zIHdlIGRyb3AuICovCi0KLQkgIHNob3J0ZW4gPSBpbl9sZW5ndGggLSBvdXRfbGVuZ3RoOwotCSAgLyogQXNzdW1lIG91dF9sZW5ndGggPj0gMCAhICovCi0JICBtZW1jcHkgKCh2b2lkICopIChvdXQtPmxvdyksICh2b2lkICopIChpbi0+bG93ICsgc2hvcnRlbiksICgob3V0X2xlbmd0aCArIDEpICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpKTsKLQkgIG91dC0+bGVhZGVyID0gb3V0LT5oaWdoOwotCSAgb3V0LT5leHBvbmVudCA9IGluLT5leHBvbmVudCArIHNob3J0ZW47Ci0JfQotICAgIH0JCQkJLyogaWYgYW55IHNpZ25pZmljYW50IGJpdHMgKi8KLX0JCQkJLyogZmxvbnVtX2NvcHkoKSAqLwotCi0vKiBlbmQgb2YgZmxvbnVtX2NvcHkuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Zsb251bS1rb25zdC5jIGIvZ2FzL2Zsb251bS1rb25zdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmJiYTA1Li4wMDAwMDAwCi0tLSBhL2dhcy9mbG9udW0ta29uc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKiBmbG9udW1fY29uc3QuYyAtIFVzZWZ1bCBGbG9udW0gY29uc3RhbnRzCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJmbG9udW0uaCIKLS8qIEpGOiAgSSBhZGRlZCB0aGUgbGFzdCBlbnRyeSB0byB0aGlzIHRhYmxlLCBhbmQgSSdtIG5vdAotICAgc3VyZSBpZiBpdHMgcmlnaHQgb3Igbm90LiAgQ291bGQgZ28gZWl0aGVyIHdheS4gIEkgd2lzaAotICAgSSByZWFsbHkgdW5kZXJzdG9vZCB0aGlzIHN0dWZmLiAqLwotCi0KLWNvbnN0IGludCB0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuID0gMTM7Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSB6ZXJvW10gPQotezF9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCVdhcm5pbmc6IHRoZSBsb3cgb3JkZXIgYml0cyBtYXkgYmUgV1JPTkcgaGVyZS4JCQkqCi0gKglJIHRvb2sgdGhpcyBmcm9tIGEgc3VzcGVjdCBiYygxKSBzY3JpcHQuCQkJKgotICoJIm1pbnVzX1giW10gaXMgc3VwcG9zZWQgdG8gYmUgMTBeKDJeLVgpIGV4cHJlc3NlZCBpbiBiYXNlIDJeMTYuCSoKLSAqCVRoZSByYWRpeCBwb2ludCBpcyBqdXN0IEFGVEVSIHRoZSBoaWdoZXN0IGVsZW1lbnQgb2YgdGhlIFtdCSoKLSAqCQkJCQkJCQkJKgotICoJQmVjYXVzZSBiYyByb3VuZHMgRE9XTiBmb3IgcHJpbnRpbmcgKEkgdGhpbmspLCB0aGUgbG93ZXN0CSoKLSAqCXNpZ25pZmljYW5jZSBsaXR0bGVudW1zIHNob3VsZCBwcm9iYWJseSBoYXZlIDEgYWRkZWQgdG8gdGhlbS4JKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBKRjogIElmIHRoaXMgZXF1YWxzIDY1NTMvKDJeMTYpKzM5MzIxLygyXjMyKSsuLi4gIGl0IGFwcHJvYWNoZXMgLjEgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xW10gPQotewotICAzOTMyMiwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwKLSAgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgNjU1M307Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xW10gPQotezEwfTsKLQotLyogSkY6ICBJZiB0aGlzIGVxdWFscyA2NTUvKDJeMTYpICsgMjM1OTIvKDJeMzIpICsgLi4uIGl0IGFwcHJvYWNoZXMgLjAxICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMltdID0KLXsKLSAgMTA0ODYsIDM2NzAwLCA2MjkxNCwgMjM1OTIsIDQ5ODA3LCAxMDQ4NSwgMzY3MDAsIDYyOTE0LCAyMzU5MiwgNDk4MDcsCi0gIDEwNDg1LCAzNjcwMCwgNjI5MTQsIDIzNTkyLCA0OTgwNywgMTA0ODUsIDM2NzAwLCA2MjkxNCwgMjM1OTIsIDY1NX07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18yW10gPQotezEwMH07Ci0KLS8qIFRoaXMgYXBwcm9hY2hlcyAuMDAwMSAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzNbXSA9Ci17Ci0gIDUyNTM0LCAyMDAyNywgMzczMjksIDY1MTE2LCA2NDA2NywgNjAzOTcsIDE0Nzg0LCAxODk3OSwgMzM2NTksIDE5NTAzLAotICAyNzI2LCA5NTQyLCA2MjksIDIyMDIsIDQwNDc1LCAxMDU5MCwgNDI5OSwgNDc4MTUsIDM2MjgwLCA2fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzNbXSA9Ci17MTAwMDB9OwotCi0vKiBKRjogdGhpcyBhcHByb2FjaGVzIDFlLTggKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c180W10gPQotewotICAyMjUxNywgNDk1MDEsIDU0MjkzLCAxOTQyNCwgNjA2OTksIDY3MTYsIDI0MzQ4LCAyMjYxOCwgMjM5MDQsIDIxMzI3LAotICAzOTE5LCA0NDcwMywgMTkxNDksIDI4ODAzLCA0ODk1OSwgNjI1OSwgNTAyNzMsIDYyMjM3LCA0Mn07Ci0vKiBUaGlzIGVxdWFscyAxNTI1ICogMl4xNiArIDU3NjAwICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c180W10gPQotezU3NjAwLCAxNTI1fTsKLQotLyogVGhpcyBhcHByb2FjaGVzIDFlLTE2ICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfNVtdID0KLXsKLSAgMjIxOTksIDQ1OTU3LCAxNzAwNSwgMjYyNjYsIDEwNTI2LCAxNjI2MCwgNTUwMTcsIDM1NjgwLCA0MDQ0MywgMTk3ODksCi0gIDE3MzU2LCAzMDE5NSwgNTU5MDUsIDI4NDI2LCA2MzAxMCwgNDQxOTcsIDE4NDR9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfNVtdID0KLXsyODYwOSwgMzQ1NDYsIDM1fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzZbXSA9Ci17Ci0gIDMwOTI2LCAyNjUxOCwgMTMxMTAsIDQzMDE4LCA1NDk4MiwgNDgyNTgsIDI0NjU4LCAxNTIwOSwgNjMzNjYsIDExOTI5LAotICAyMDA2OSwgNDM4NTcsIDYwNDg3LCA1MX07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c182W10gPQotezYxMzEzLCAzNDIyMCwgMTY3MzEsIDExNjI5LCAxMjYyfTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzdbXSA9Ci17Ci0gIDI5ODE5LCAxNDczMywgMjE0OTAsIDQwNjAyLCAzMTMxNSwgNjUxODYsIDI2OTV9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfN1tdID0KLXsKLSAgNzkzNywgNDkwMDIsIDYwNzcyLCAyODIxNiwgMzg4OTMsIDU1OTc1LCA2Mzk4OCwgNTk3MTEsIDIwMjI3LCAyNH07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c184W10gPQotewotICAyNzU3OSwgNjQ4MDcsIDEyNTQzLCA3OTQsIDEzOTA3LCA2MTI5NywgMTIwMTMsIDY0MzYwLCAxNTk2MSwgMjA1NjYsCi0gIDI0MTc4LCAxNTkyMiwgNTk0MjcsIDExMH07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c184W10gPQotewotICAxNTg3MywgMTE5MjUsIDM5MTc3LCA5OTEsIDE0NTg5LCAzODYxLCA1ODQxNSwgOTA3NiwgNjI5NTYsIDU0MjIzLAotICA1NjMyOCwgNTAxODAsIDQ1Mjc0LCA0ODMzMywgMzI1MzcsIDQyNTQ3LCA5NzMxLCA1OTY3OSwgNTkwfTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzlbXSA9Ci17Ci0gIDExMDQyLCA4NDY0LCA1ODk3MSwgNjM0MjksIDYwMjIsIDYzNDg1LCA1NTAwLCA1MzQ2NCwgNDc1NDUsIDUwMDY4LAotICA1Njk4OCwgMjI4MTksIDQ5NzA4LCA1NDQ5MywgOTkyMCwgNDc2NjcsIDQwNDA5LCAzNTc2NCwgMTAzODMsIDU0NDY2LAotICAzMjcwMiwgMTc0OTMsIDMyNDIwLCAzNDM4MiwgMjI3NTAsIDIwNjgxLCAxMjMwMH07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c185W10gPQotewotICAyMDY3OCwgMjc2MTQsIDI4MjcyLCA1MzA2NiwgNTUzMTEsIDU0Njc3LCAyOTAzOCwgOTkwNiwgMjYyODgsIDQ0NDg2LAotICAxMzg2MCwgNzQ0NSwgNTQxMDYsIDE1NDI2LCAyMTUxOCwgMjU1OTksIDI5NjMyLCA1MjMwOSwgNjEyMDcsIDI2MTA1LAotICAxMDQ4MiwgMjE5NDgsIDUxMTkxLCAzMjk4OCwgNjA4OTIsIDYyNTc0LCA2MTM5MCwgMjQ1NDAsIDIxNDk1LCA1fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzEwW10gPQotewotICA2MjE0LCA0ODc3MSwgMjM0NzEsIDMwMTYzLCAzMTc2MywgMzgwMTMsIDU3MDAxLCAxMTc3MCwgMTgyNjMsIDM2MzY2LAotICAyMDc0MiwgNDUwODYsIDU2OTY5LCA1MzIzMSwgMzc4NTYsIDU1ODE0LCAzODA1NywgMTU2OTIsIDQ2NzYxLCA4NzEzLAotICA2MTAyLCAyMDA4MywgODI2OSwgMTE4MzksIDExNTcxLCA1MDk2MywgMTU2NDksIDExNjk4LCA0MDY3NSwgMjMwOH07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xMFtdID0KLXsKLSAgNjM4MzksIDM2NTc2LCA0NTcxMiwgNDQ1MTYsIDM3ODAzLCAyOTQ4MiwgNDk2NiwgMzA1NTYsIDM3OTYxLCAyMzMxMCwKLSAgMjcwNzAsIDQ0OTcyLCAyOTUwNywgNDgyNTcsIDQ1MjA5LCA3NDk0LCAxNzgzMSwgMzg3MjgsIDQxNTc3LCAyOTQ0MywKLSAgMzYwMTYsIDc5NTUsIDM1MzM5LCAzNTQ3OSwgMzYwMTEsIDE0NTUzLCA0OTYxOCwgNTU4OCwgMjUzOTYsIDI4fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzExW10gPQotewotICAxNjY2MywgNTY4ODIsIDYxOTgzLCA3ODA0LCAzNjU1NSwgMzIwNjAsIDM0NTAyLCAxMDAwLCAxNDM1NiwgMjE2ODEsCi0gIDY2MDUsIDM0NzY3LCA1MTQxMSwgNTkwNDgsIDUzNjE0LCAzOTg1MCwgMzAwNzksIDY0OTYsIDY4NDYsIDI2ODQxLAotICA0MDc3OCwgMTk1NzgsIDU5ODk5LCA0NDA4NSwgNTQwMTYsIDI0MjU5LCAxMTIzMiwgMjEyMjksIDIxMzEzLCA4MX07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xMVtdID0KLXsKLSAgOTIsIDkwNTQsIDYyNzA3LCAxNzk5MywgNzgyMSwgNTY4MzgsIDEzOTkyLCAyMTMyMSwgMjk2MzcsIDQ4NDI2LAotICA0Mjk4MiwgMzg2NjgsIDQ5NTc0LCAyODgyMCwgMTgyMDAsIDE4OTI3LCA1Mzk3OSwgMTYyMTksIDM3NDg0LCAyNTE2LAotICA0NDY0MiwgMTQ2NjUsIDExNTg3LCA0MTkyNiwgMTM1NTYsIDIzOTU2LCA1NDMyMCwgNjY2MSwgNTU3NjYsIDgwNX07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xMltdID0KLXsKLSAgMzMyMDIsIDQ1OTY5LCA1ODgwNCwgNTY3MzQsIDE2NDgyLCAyNjAwNywgNDQ5ODQsIDQ5MzM0LCAzMTAwNywgMzI5NDQsCi0gIDQ0NTE3LCA2MzMyOSwgNDcxMzEsIDE1MjkxLCA1OTQ2NSwgMjI2NCwgMjMyMTgsIDExODI5LCA1OTc3MSwgMzg3OTgsCi0gIDMxMDUxLCAyODc0OCwgMjMxMjksIDQwNTQxLCA0MTU2MiwgMzUxMDgsIDUwNjIwLCA1OTAxNCwgNTE4MTcsIDY2MTN9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMTJbXSA9Ci17Ci0gIDEwMDk4LCAzNzkyMiwgNTgwNzAsIDc0MzIsIDEwNDcwLCA2MzQ2NSwgMjM3MTgsIDYyMTkwLCA0NzQyMCwgNzAwOSwKLSAgMzg0NDMsIDQ1ODcsIDQ1NTk2LCAzODQ3MiwgNTIxMjksIDUyNzc5LCAyOTAxMiwgMTM1NTksIDQ4Njg4LCAzMTY3OCwKLSAgNDE3NTMsIDU4NjYyLCAxMDY2OCwgMzYwNjcsIDI5OTA2LCA1NjkwNiwgMjE0NjEsIDQ2NTU2LCA1OTU3MSwgOX07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xM1tdID0KLXsKLSAgNDUzMDksIDI3NTkyLCAzNzE0NCwgMzQ2MzcsIDM0MzI4LCA0MTY3MSwgMzQ2MjAsIDI0MTM1LCA1MzQwMSwgMjIxMTIsCi0gIDIxNTc2LCA0NTE0NywgMzkzMTAsIDQ0MDUxLCA0ODU3MiwgMzY3NiwgNDY1NDQsIDU5NzY4LCAzMzM1MCwgMjMyMywKLSAgNDk1MjQsIDYxNTY4LCAzOTAzLCAzNjQ4NywgMzYzNTYsIDMwOTAzLCAxNDk3NSwgOTAzNSwgMjk3MTUsIDY2N307Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xM1tdID0KLXsKLSAgMTg3ODgsIDE2OTYwLCA2MzE4LCA0NTY4NSwgNTU0MDAsIDQ2MjMwLCAzNTc5NCwgMjU1ODgsIDcyNTMsIDU1NTQxLAotICA0OTcxNiwgNTk3NjAsIDYzNTkyLCA4MTkxLCA2Mzc2NSwgNTg1MzAsIDQ0NjY3LCAxMzI5NCwgMTAwMDEsIDU1NTg2LAotICA0Nzg4NywgMTg3MzgsIDk1MDksIDQwODk2LCA0MjUwNiwgNTI1ODAsIDQxNzEsIDMyNSwgMTIzMjksIDk4fTsKLQotLyogU2h1dCB1cCBjb21wbGFpbnRzIGFib3V0IGRpZmZlcmluZyBwb2ludGVyIHR5cGVzLiAgVGhleSBvbmx5IGRpZmZlcgotICAgaW4gdGhlIGNvbnN0IGF0dHJpYnV0ZSwgYnV0IHRoZXJlIGlzbid0IGFueSBlYXN5IHdheSB0byBkbyB0aGlzCi0gICAqLwotI2RlZmluZSBYIChMSVRUTEVOVU1fVFlQRSAqKQotCi1jb25zdCBGTE9OVU1fVFlQRSBmbG9udW1fbmVnYXRpdmVfcG93ZXJzX29mX3RlbltdID0KLXsKLSAge1ggemVybywgWCB6ZXJvLCBYIHplcm8sIDAsICcrJ30sCi0gIHtYIG1pbnVzXzEsIFggbWludXNfMSArIDE5LCBYIG1pbnVzXzEgKyAxOSwgLTIwLCAnKyd9LAotICB7WCBtaW51c18yLCBYIG1pbnVzXzIgKyAxOSwgWCBtaW51c18yICsgMTksIC0yMCwgJysnfSwKLSAge1ggbWludXNfMywgWCBtaW51c18zICsgMTksIFggbWludXNfMyArIDE5LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzQsIFggbWludXNfNCArIDE4LCBYIG1pbnVzXzQgKyAxOCwgLTIwLCAnKyd9LAotICB7WCBtaW51c181LCBYIG1pbnVzXzUgKyAxNiwgWCBtaW51c181ICsgMTYsIC0yMCwgJysnfSwKLSAge1ggbWludXNfNiwgWCBtaW51c182ICsgMTMsIFggbWludXNfNiArIDEzLCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzcsIFggbWludXNfNyArIDYsIFggbWludXNfNyArIDYsIC0yMCwgJysnfSwKLSAge1ggbWludXNfOCwgWCBtaW51c184ICsgMTMsIFggbWludXNfOCArIDEzLCAtNDAsICcrJ30sCi0gIHtYIG1pbnVzXzksIFggbWludXNfOSArIDI2LCBYIG1pbnVzXzkgKyAyNiwgLTgwLCAnKyd9LAotICB7WCBtaW51c18xMCwgWCBtaW51c18xMCArIDI5LCBYIG1pbnVzXzEwICsgMjksIC0xMzYsICcrJ30sCi0gIHtYIG1pbnVzXzExLCBYIG1pbnVzXzExICsgMjksIFggbWludXNfMTEgKyAyOSwgLTI0MiwgJysnfSwKLSAge1ggbWludXNfMTIsIFggbWludXNfMTIgKyAyOSwgWCBtaW51c18xMiArIDI5LCAtNDU1LCAnKyd9LAotICB7WCBtaW51c18xMywgWCBtaW51c18xMyArIDI5LCBYIG1pbnVzXzEzICsgMjksIC04ODAsICcrJ30sCi19OwotCi1jb25zdCBGTE9OVU1fVFlQRSBmbG9udW1fcG9zaXRpdmVfcG93ZXJzX29mX3RlbltdID0KLXsKLSAge1ggemVybywgWCB6ZXJvLCBYIHplcm8sIDAsICcrJ30sCi0gIHtYIHBsdXNfMSwgWCBwbHVzXzEgKyAwLCBYIHBsdXNfMSArIDAsIDAsICcrJ30sCi0gIHtYIHBsdXNfMiwgWCBwbHVzXzIgKyAwLCBYIHBsdXNfMiArIDAsIDAsICcrJ30sCi0gIHtYIHBsdXNfMywgWCBwbHVzXzMgKyAwLCBYIHBsdXNfMyArIDAsIDAsICcrJ30sCi0gIHtYIHBsdXNfNCwgWCBwbHVzXzQgKyAxLCBYIHBsdXNfNCArIDEsIDAsICcrJ30sCi0gIHtYIHBsdXNfNSwgWCBwbHVzXzUgKyAyLCBYIHBsdXNfNSArIDIsIDEsICcrJ30sCi0gIHtYIHBsdXNfNiwgWCBwbHVzXzYgKyA0LCBYIHBsdXNfNiArIDQsIDIsICcrJ30sCi0gIHtYIHBsdXNfNywgWCBwbHVzXzcgKyA5LCBYIHBsdXNfNyArIDksIDQsICcrJ30sCi0gIHtYIHBsdXNfOCwgWCBwbHVzXzggKyAxOCwgWCBwbHVzXzggKyAxOCwgOCwgJysnfSwKLSAge1ggcGx1c185LCBYIHBsdXNfOSArIDI5LCBYIHBsdXNfOSArIDI5LCAyNCwgJysnfSwKLSAge1ggcGx1c18xMCwgWCBwbHVzXzEwICsgMjksIFggcGx1c18xMCArIDI5LCA3NywgJysnfSwKLSAge1ggcGx1c18xMSwgWCBwbHVzXzExICsgMjksIFggcGx1c18xMSArIDI5LCAxODMsICcrJ30sCi0gIHtYIHBsdXNfMTIsIFggcGx1c18xMiArIDI5LCBYIHBsdXNfMTIgKyAyOSwgMzk2LCAnKyd9LAotICB7WCBwbHVzXzEzLCBYIHBsdXNfMTMgKyAyOSwgWCBwbHVzXzEzICsgMjksIDgyMSwgJysnfSwKLX07Ci0KLSNpZmRlZiBWTVMKLXZvaWQgZHVtbXkxICgpIHsgfQotI2VuZGlmCi0vKiBlbmQgb2YgZmxvbnVtX2NvbnN0LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0tbXVsdC5jIGIvZ2FzL2Zsb251bS1tdWx0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGE3M2IuLjAwMDAwMDAKLS0tIGEvZ2FzL2Zsb251bS1tdWx0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyogZmxvbnVtX211bHQuYyAtIG11bHRpcGx5IHR3byBmbG9udW1zCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdhcywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIFRoZSBHTlUgYXNzZW1ibGVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFkuICBObyBhdXRob3Igb3IgZGlzdHJpYnV0b3IKLSAgIGFjY2VwdHMgcmVzcG9uc2liaWxpdHkgdG8gYW55b25lIGZvciB0aGUgY29uc2VxdWVuY2VzIG9mIHVzaW5nIGl0Ci0gICBvciBmb3Igd2hldGhlciBpdCBzZXJ2ZXMgYW55IHBhcnRpY3VsYXIgcHVycG9zZSBvciB3b3JrcyBhdCBhbGwsCi0gICB1bmxlc3MgaGUgc2F5cyBzbyBpbiB3cml0aW5nLiAgUmVmZXIgdG8gdGhlIEdOVSBBc3NlbWJsZXIgR2VuZXJhbAotICAgUHVibGljIExpY2Vuc2UgZm9yIGZ1bGwgZGV0YWlscy4KLQotICAgRXZlcnlvbmUgaXMgZ3JhbnRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlCi0gICB0aGUgR05VIEFzc2VtYmxlciwgYnV0IG9ubHkgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGVzY3JpYmVkIGluIHRoZQotICAgR05VIEFzc2VtYmxlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQSBjb3B5IG9mIHRoaXMgbGljZW5zZSBpcwotICAgc3VwcG9zZWQgdG8gaGF2ZSBiZWVuIGdpdmVuIHRvIHlvdSBhbG9uZyB3aXRoIHRoZSBHTlUgQXNzZW1ibGVyCi0gICBzbyB5b3UgY2FuIGtub3cgeW91ciByaWdodHMgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBJdCBzaG91bGQgYmUKLSAgIGluIGEgZmlsZSBuYW1lZCBDT1BZSU5HLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgY29weXJpZ2h0Ci0gICBub3RpY2UgYW5kIHRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJmbG9udW0uaCIKLQotLyoJcGxhbiBmb3IgYSAuIGIgPT4gcChyb2R1Y3QpCi0JCi0JCi0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQl8IGEJfCBhCXwgIC4uLgl8IGEJfCBhCXwKLQl8ICBBCXwgIEEtMQl8CXwgIDEJfCAgMAl8Ci0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQkKLQkKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCXwgYgl8IGIJfCAgLi4uCXwgYgl8IGIJfAotCXwgIEIJfCAgQi0xCXwJfCAgMQl8ICAwCXwKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCQotCQotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCXwgcAl8IHAJfCAgLi4uCXwgcAl8ICAuLi4JfCBwCXwgcAl8Ci0JfCAgQStCKzF8ICBBK0IJfAl8ICBOCXwJfCAgMQl8ICAwCXwKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQkKLQkvXlwKLQkoY2FycnkpIGEgLmIJICAgLi4uCSAgICB8CSAgIC4uLgkgYSAuYgkgYSAuYgotCUEgIEIgCQkgICAgfAkJICAwICAxCSAgMCAgMAotCXwKLQkuLi4JICAgIHwJICAgLi4uCSBhIC5iCi0JfAkJICAxICAwCi0JfAotCXwJICAgLi4uCi0JfAotCXwKLQl8Ci0JfAkJICBfX18KLQl8CQkgIFwKLQkrLS0tLS0gIFAgID0gICA+ICBhIC5iCi0JTgkgIC9fXyAgaSAgagotCQotCU4gPSAwIC4uLiBBK0IKLQkKLQlmb3IgYWxsIGksaiB3aGVyZSBpK2o9TgotCVtpLGogaW50ZWdlcnMgPiAwXQotCQotCWFbXSwgYltdLCBwW10gbWF5IG5vdCBpbnRlcnNlY3QuCi0JWmVybyBsZW5ndGggZmFjdG9ycyBzaWduaWZ5IDAgc2lnbmlmaWNhbnQgYml0czogdHJlYXQgYXMgMC4wLgotCTAuMCBmYWN0b3JzIGRvIHRoZSByaWdodCB0aGluZy4KLQlaZXJvIGxlbmd0aCBwcm9kdWN0IE9LLgotCQotCUkgY2hvc2UgdGhlIEZvclRyYW4gYWNjZW50ICJmb29bYmFyXSIgaW5zdGVhZCBvZiB0aGUgQyBhY2NlbnQgIipnYXJwbHkiCi0JYmVjYXVzZSBJIGZlbHQgdGhlIEZvclRyYW4gd2F5IHdhcyBtb3JlIGludHVpdGl2ZS4gVGhlIEMgd2F5IHdvdWxkCi0JcHJvYmFibHkgeWllbGQgYmV0dGVyIGNvZGUgb24gbW9zdCBDIGNvbXBpbGVycy4gRGVhbiBFbHNuZXIuCi0JKEMgc3R5bGUgYWxzbyBnaXZlcyBkZWVwZXIgaW5zaWdodCBbdG8gbWVdIC4uLiBvaCB3ZWxsIC4uLikKLQkqLwotDAotdm9pZCAKLWZsb251bV9tdWx0aXAgKGEsIGIsIHByb2R1Y3QpCi0gICAgIGNvbnN0IEZMT05VTV9UWVBFICphOwotICAgICBjb25zdCBGTE9OVU1fVFlQRSAqYjsKLSAgICAgRkxPTlVNX1RZUEUgKnByb2R1Y3Q7Ci17Ci0gIGludCBzaXplX29mX2E7CQkvKiAwIG9yaWdpbiAqLwotICBpbnQgc2l6ZV9vZl9iOwkJLyogMCBvcmlnaW4gKi8KLSAgaW50IHNpemVfb2ZfcHJvZHVjdDsJCS8qIDAgb3JpZ2luICovCi0gIGludCBzaXplX29mX3N1bTsJCS8qIDAgb3JpZ2luICovCi0gIGludCBleHRyYV9wcm9kdWN0X3Bvc2l0aW9uczsJLyogMSBvcmlnaW4gKi8KLSAgdW5zaWduZWQgbG9uZyB3b3JrOwotICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotICBsb25nIGV4cG9uZW50OwotICBMSVRUTEVOVU1fVFlQRSAqcTsKLSAgbG9uZyBzaWduaWZpY2FudDsJCS8qIFRSVUUgd2hlbiB3ZSBlbWl0IGEgbm9uLTAgbGl0dGxlbnVtICAqLwotICAvKiBGb3JUcmFuIGFjY2VudCBmb2xsb3dzLiAqLwotICBpbnQgUDsJCQkvKiBTY2FuIHByb2R1Y3QgbG93LW9yZGVyIC0+IGhpZ2guICovCi0gIGludCBOOwkJCS8qIEFzIGluIHN1bSBhYm92ZS4gICovCi0gIGludCBBOwkJCS8qIFdoaWNoIFtdIG9mIGE/ICovCi0gIGludCBCOwkJCS8qIFdoaWNoIFtdIG9mIGI/ICovCi0KLSAgaWYgKChhLT5zaWduICE9ICctJyAmJiBhLT5zaWduICE9ICcrJykgfHwgKGItPnNpZ24gIT0gJy0nICYmIGItPnNpZ24gIT0gJysnKSkKLSAgICB7Ci0gICAgICAvKiAuLi4KLQkJICAgR290IHRvIGZhaWwgc29tZWhvdy4gIEFueSBzdWdnZXN0aW9ucz8gKi8KLSAgICAgIHByb2R1Y3QtPnNpZ24gPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgcHJvZHVjdC0+c2lnbiA9IChhLT5zaWduID09IGItPnNpZ24pID8gJysnIDogJy0nOwotICBzaXplX29mX2EgPSBhLT5sZWFkZXIgLSBhLT5sb3c7Ci0gIHNpemVfb2ZfYiA9IGItPmxlYWRlciAtIGItPmxvdzsKLSAgZXhwb25lbnQgPSBhLT5leHBvbmVudCArIGItPmV4cG9uZW50OwotICBzaXplX29mX3Byb2R1Y3QgPSBwcm9kdWN0LT5oaWdoIC0gcHJvZHVjdC0+bG93OwotICBzaXplX29mX3N1bSA9IHNpemVfb2ZfYSArIHNpemVfb2ZfYjsKLSAgZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMgPSBzaXplX29mX3Byb2R1Y3QgLSBzaXplX29mX3N1bTsKLSAgaWYgKGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zIDwgMCkKLSAgICB7Ci0gICAgICBQID0gZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnM7CS8qIFAgPCAwICovCi0gICAgICBleHBvbmVudCAtPSBleHRyYV9wcm9kdWN0X3Bvc2l0aW9uczsJLyogSW5jcmVhc2VzIGV4cG9uZW50LiAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFAgPSAwOwotICAgIH0KLSAgY2FycnkgPSAwOwotICBzaWduaWZpY2FudCA9IDA7Ci0gIGZvciAoTiA9IDA7IE4gPD0gc2l6ZV9vZl9zdW07IE4rKykKLSAgICB7Ci0gICAgICB3b3JrID0gY2Fycnk7Ci0gICAgICBjYXJyeSA9IDA7Ci0gICAgICBmb3IgKEEgPSAwOyBBIDw9IE47IEErKykKLQl7Ci0JICBCID0gTiAtIEE7Ci0JICBpZiAoQSA8PSBzaXplX29mX2EgJiYgQiA8PSBzaXplX29mX2IgJiYgQiA+PSAwKQotCSAgICB7Ci0jaWZkZWYgVFJBQ0UKLQkgICAgICBwcmludGYgKCJhOmxvd1slZC5dPSUwNHggYjpsb3dbJWQuXT0lMDR4IHdvcmtfYmVmb3JlPSUwOHhcbiIsIEEsIGEtPmxvd1tBXSwgQiwgYi0+bG93W0JdLCB3b3JrKTsKLSNlbmRpZgotCSAgICAgIC8qIFdhdGNoIG91dCBmb3Igc2lnbiBleHRlbnNpb24hICBXaXRob3V0IHRoZSBjYXN0cywgb24KLQkJIHRoZSBERUMgQWxwaGEsIHRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaXMgKnNpZ25lZCoKLQkJIGludCwgd2hpY2ggZ2V0cyBzaWduLWV4dGVuZGVkIHRvIGNvbnZlcnQgdG8gdGhlCi0JCSB1bnNpZ25lZCBsb25nISAgKi8KLQkgICAgICB3b3JrICs9ICh1bnNpZ25lZCBsb25nKSBhLT5sb3dbQV0gKiAodW5zaWduZWQgbG9uZykgYi0+bG93W0JdOwotCSAgICAgIGNhcnJ5ICs9IHdvcmsgPj4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgICAgIHdvcmsgJj0gTElUVExFTlVNX01BU0s7Ci0jaWZkZWYgVFJBQ0UKLQkgICAgICBwcmludGYgKCJ3b3JrPSUwOHggY2Fycnk9JTA0eFxuIiwgd29yaywgY2FycnkpOwotI2VuZGlmCi0JICAgIH0KLQl9Ci0gICAgICBzaWduaWZpY2FudCB8PSB3b3JrOwotICAgICAgaWYgKHNpZ25pZmljYW50IHx8IFAgPCAwKQotCXsKLQkgIGlmIChQID49IDApCi0JICAgIHsKLQkgICAgICBwcm9kdWN0LT5sb3dbUF0gPSB3b3JrOwotI2lmZGVmIFRSQUNFCi0JICAgICAgcHJpbnRmICgiUD0lZC4gd29ya1twXTo9JTA0eFxuIiwgUCwgd29yayk7Ci0jZW5kaWYKLQkgICAgfQotCSAgUCsrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHRyYV9wcm9kdWN0X3Bvc2l0aW9ucysrOwotCSAgZXhwb25lbnQrKzsKLQl9Ci0gICAgfQotICAvKgotICAgKiBbUF0tPiBwb3NpdGlvbiAjIHNpemVfb2Zfc3VtICsgMS4KLSAgICogVGhpcyBpcyB3aGVyZSAnY2FycnknIHNob3VsZCBnby4KLSAgICovCi0jaWZkZWYgVFJBQ0UKLSAgcHJpbnRmICgiZmluYWwgY2FycnkgPSUwNHhcbiIsIGNhcnJ5KTsKLSNlbmRpZgotICBpZiAoY2FycnkpCi0gICAgewotICAgICAgaWYgKGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zID4gMCkKLQl7Ci0JICBwcm9kdWN0LT5sb3dbUF0gPSBjYXJyeTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gcm9vbSBhdCBoaWdoIG9yZGVyIGZvciBjYXJyeSBsaXR0bGVudW0uICovCi0JICAvKiBTaGlmdCByaWdodCAxIHRvIG1ha2Ugcm9vbSBmb3IgbW9zdCBzaWduaWZpY2FudCBsaXR0bGVudW0uICovCi0JICBleHBvbmVudCsrOwotCSAgUC0tOwotCSAgZm9yIChxID0gcHJvZHVjdC0+bG93ICsgUDsgcSA+PSBwcm9kdWN0LT5sb3c7IHEtLSkKLQkgICAgewotCSAgICAgIHdvcmsgPSAqcTsKLQkgICAgICAqcSA9IGNhcnJ5OwotCSAgICAgIGNhcnJ5ID0gd29yazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQLS07Ci0gICAgfQotICBwcm9kdWN0LT5sZWFkZXIgPSBwcm9kdWN0LT5sb3cgKyBQOwotICBwcm9kdWN0LT5leHBvbmVudCA9IGV4cG9uZW50OwotfQotCi0vKiBlbmQgb2YgZmxvbnVtX211bHQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Zsb251bS5oIGIvZ2FzL2Zsb251bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg0ZjQ5Li4wMDAwMDAwCi0tLSBhL2dhcy9mbG9udW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKiBmbG9udW0uaCAtIEZsb2F0aW5nIHBvaW50IHBhY2thZ2UKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJQXJiaXRyYXJ5LXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLgkJCSoKLSAqCQkJCQkJCQkJKgotICoJCQkJCQkJCQkqCi0gKglOb3RhdGlvbjogYSBmbG9hdGluZyBwb2ludCBudW1iZXIgaXMgZXhwcmVzc2VkIGFzCQkqCi0gKglNQU5USVNTQSAqICgyICoqIEVYUE9ORU5UKS4JCQkJCSoKLSAqCQkJCQkJCQkJKgotICoJSWYgdGhpcyBvZmZlbmRzIG1vcmUgdHJhZGl0aW9uYWwgbWF0aGVtYXRpY2lhbnMsIHRoZW4JCSoKLSAqCXBsZWFzZSB0ZWxsIG1lIHlvdXIgbm9tZW5jbGF0dXJlIGZvciBmbG9udW1zIQkJCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJpZ251bS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCVZhcmlhYmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLgkJCSoKLSAqCQkJCQkJCQkJKgotICoJRXhwb25lbnQgaXMgdGhlIHBsYWNlIHZhbHVlIG9mIHRoZSBsb3cgbGl0dGxlbnVtLiBFLmcuOgkJKgotICoJSWYgIDA6ICBsb3cgcG9pbnRzIHRvIHRoZSB1bml0cyAgICAgICAgICAgICBsaXR0bGVudW0uCQkqCi0gKglJZiAgMTogIGxvdyBwb2ludHMgdG8gdGhlIExJVFRMRU5VTV9SQURJWCAgIGxpdHRsZW51bS4JCSoKLSAqCUlmIC0xOiAgbG93IHBvaW50cyB0byB0aGUgMS9MSVRUTEVOVU1fUkFESVggbGl0dGxlbnVtLgkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBKRjogIEEgc2lnbiB2YWx1ZSBvZiAwIG1lYW5zIHdlIGhhdmUgYmVlbiBhc2tlZCB0byBhc3NlbWJsZSBOYU4KLSAgIEEgc2lnbiB2YWx1ZSBvZiAnUCcgbWVhbnMgd2UndmUgYmVlbiBhc2tlZCB0byBhc3NlbWJsZSArSW5mCi0gICBBIHNpZ24gdmFsdWUgb2YgJ04nIG1lYW5zIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgLUluZgotICAgKi8KLXN0cnVjdCBGTE9OVU1fU1RSVUNUCi17Ci0gIExJVFRMRU5VTV9UWVBFICpsb3c7CQkvKiBsb3cgb3JkZXIgbGl0dGxlbnVtIG9mIGEgYmlnbnVtICovCi0gIExJVFRMRU5VTV9UWVBFICpoaWdoOwkJLyogaGlnaCBvcmRlciBsaXR0bGVudW0gb2YgYSBiaWdudW0gKi8KLSAgTElUVExFTlVNX1RZUEUgKmxlYWRlcjsJLyogLT4gMXN0IG5vbi16ZXJvIGxpdHRsZW51bSAqLwotICAvKiBJZiBmbG9udW0gaXMgMC4wLCBsZWFkZXI9PWxvdy0xICovCi0gIGxvbmcgZXhwb25lbnQ7CQkvKiBiYXNlIExJVFRMRU5VTV9SQURJWCAqLwotICBjaGFyIHNpZ247CQkJLyogJysnIG9yICctJyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgRkxPTlVNX1NUUlVDVCBGTE9OVU1fVFlQRTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCVNpbmNlIHdlIGNhbiAoJiBkbykgbWVldCB3aXRoIGV4cG9uZW50cyBsaWtlIDEwXjUwMDAsIGl0CSoKLSAqCWlzIHNpbGx5IHRvIG1ha2UgYSB0YWJsZSBvZiB+IDEwLDAwMCBlbnRyaWVzLCBvbmUgZm9yIGVhY2gJKgotICoJcG93ZXIgb2YgMTAuIFdlIGtlZXAgYSB0YWJsZSB3aGVyZSBpdGVtIFtuXSBpcyBhIHN0cnVjdAkJKgotICoJRkxPTlVNX0ZMT0FUSU5HX1BPSU5UIHJlcHJlc2VudGluZyAxMF4oMl5uKS4gV2UgdGhlbgkJKgotICoJbXVsdGlwbHkgYXBwcm9wcmlhdGUgZW50cmllcyBmcm9tIHRoaXMgdGFibGUgdG8gZ2V0IGFueQkJKgotICoJcGFydGljdWxhciBwb3dlciBvZiAxMC4gRm9yIHRoZSBleGFtcGxlIG9mIDEwXjUwMDAsIGEgdGFibGUJKgotICoJb2YganVzdCAyNSBlbnRyaWVzIHN1ZmZpY2VzOiAxMF4oMl4tMTIpLi4uMTBeKDJeKzEyKS4JCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1leHRlcm4gY29uc3QgRkxPTlVNX1RZUEUgZmxvbnVtX3Bvc2l0aXZlX3Bvd2Vyc19vZl90ZW5bXTsKLWV4dGVybiBjb25zdCBGTE9OVU1fVFlQRSBmbG9udW1fbmVnYXRpdmVfcG93ZXJzX29mX3RlbltdOwotZXh0ZXJuIGNvbnN0IGludCB0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuOwotLyogRmxvbnVtX1hYWF9wb3dlcnNfb2ZfdGVuW10gdGFibGUgaGFzICovCi0vKiBsZWdhbCBpbmRpY2VzIGZyb20gMCB0byAqLwotLyogKyB0aGlzIG51bWJlciBpbmNsdXNpdmUuICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCURlY2xhcmUgd29ya2VyIGZ1bmN0aW9ucy4JCQkJCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IGF0b2ZfZ2VuZXJpYyBQQVJBTVMgKChjaGFyICoqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciwKLQkJCSAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfbWFya3MsCi0JCQkgIGNvbnN0IGNoYXIgKnN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLAotCQkJICBGTE9OVU1fVFlQRSAqIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpKTsKLQotdm9pZCBmbG9udW1fY29weSBQQVJBTVMgKChGTE9OVU1fVFlQRSAqIGluLCBGTE9OVU1fVFlQRSAqIG91dCkpOwotdm9pZCBmbG9udW1fbXVsdGlwIFBBUkFNUyAoKGNvbnN0IEZMT05VTV9UWVBFICogYSwgY29uc3QgRkxPTlVNX1RZUEUgKiBiLAotCQkJICAgIEZMT05VTV9UWVBFICogcHJvZHVjdCkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCURlY2xhcmUgZXJyb3IgY29kZXMuCQkJCQkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVSUk9SX0VYUE9ORU5UX09WRVJGTE9XICgyKQotCi0vKiBlbmQgb2YgZmxvbnVtLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9mcmFncy5jIGIvZ2FzL2ZyYWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGIyZWUuLjAwMDAwMDAKLS0tIGEvZ2FzL2ZyYWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyogZnJhZ3MuYyAtIG1hbmFnZSBmcmFncyAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLWV4dGVybiBmcmFnUyB6ZXJvX2FkZHJlc3NfZnJhZzsKLWV4dGVybiBmcmFnUyBic3NfYWRkcmVzc19mcmFnOwotDAotLyogSW5pdGlhbGl6YXRpb24gZm9yIGZyYWcgcm91dGluZXMuICAqLwotdm9pZAotZnJhZ19pbml0ICgpCi17Ci0gIHplcm9fYWRkcmVzc19mcmFnLmZyX3R5cGUgPSByc19maWxsOwotICBic3NfYWRkcmVzc19mcmFnLmZyX3R5cGUgPSByc19maWxsOwotfQotDAotLyogQWxsb2NhdGUgYSBmcmFnIG9uIHRoZSBzcGVjaWZpZWQgb2JzdGFjay4KLSAgIENhbGwgdGhpcyByb3V0aW5lIGZyb20gZXZlcnl3aGVyZSBlbHNlLCBzbyB0aGF0IGFsbCB0aGUgd2VpcmQgYWxpZ25tZW50Ci0gICBoYWNrZXJ5IGNhbiBiZSBkb25lIGluIGp1c3Qgb25lIHBsYWNlLiAgKi8KLWZyYWdTICoKLWZyYWdfYWxsb2MgKG9iKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2I7Ci17Ci0gIGZyYWdTICpwdHI7Ci0gIGludCBvYWxpZ247Ci0KLSAgKHZvaWQpIG9ic3RhY2tfYWxsb2MgKG9iLCAwKTsKLSAgb2FsaWduID0gb2JzdGFja19hbGlnbm1lbnRfbWFzayAob2IpOwotICBvYnN0YWNrX2FsaWdubWVudF9tYXNrIChvYikgPSAwOwotICBwdHIgPSAoZnJhZ1MgKikgb2JzdGFja19hbGxvYyAob2IsIFNJWkVPRl9TVFJVQ1RfRlJBRyk7Ci0gIG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKG9iKSA9IG9hbGlnbjsKLSAgbWVtc2V0IChwdHIsIDAsIFNJWkVPRl9TVFJVQ1RfRlJBRyk7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKgotICoJCQlmcmFnX2dyb3coKQotICoKLSAqIFRyeSB0byBhdWdtZW50IGN1cnJlbnQgZnJhZyBieSBuY2hhcnMgY2hhcnMuCi0gKiBJZiB0aGVyZSBpcyBubyByb29tLCBjbG9zZSBvZiB0aGUgY3VycmVudCBmcmFnIHdpdGggYSAiLmZpbGwgMCIKLSAqIGFuZCBiZWdpbiBhIG5ldyBmcmFnLiBVbmxlc3MgdGhlIG5ldyBmcmFnIGhhcyBuY2hhcnMgY2hhcnMgYXZhaWxhYmxlCi0gKiBkbyBub3QgcmV0dXJuLiBEbyBub3Qgc2V0IHVwIGFueSBmaWVsZHMgb2YgKm5vd19mcmFnLgotICovCi12b2lkIAotZnJhZ19ncm93IChuY2hhcnMpCi0gICAgIHVuc2lnbmVkIGludCBuY2hhcnM7Ci17Ci0gIGlmIChvYnN0YWNrX3Jvb20gKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKSA8IG5jaGFycykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbjsKLSAgICAgIGxvbmcgb2xkYzsKLQotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0gICAgICBvbGRjID0gZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjay5jaHVua19zaXplOwotICAgICAgZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjay5jaHVua19zaXplID0gMiAqIG5jaGFycyArIFNJWkVPRl9TVFJVQ1RfRlJBRzsKLSAgICAgIHdoaWxlICgobiA9IG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spKSA8IG5jaGFycykKLQl7Ci0JICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLQkgIGZyYWdfbmV3ICgwKTsKLQl9Ci0gICAgICBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLmNodW5rX3NpemUgPSBvbGRjOwotICAgIH0KLSAgaWYgKG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIDwgbmNoYXJzKQotICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBleHRlbmQgZnJhZyAlZC4gY2hhcnMiKSwgbmNoYXJzKTsKLX0KLQwKLS8qCi0gKgkJCWZyYWdfbmV3KCkKLSAqCi0gKiBDYWxsIHRoaXMgdG8gY2xvc2Ugb2ZmIGEgY29tcGxldGVkIGZyYWcsIGFuZCBzdGFydCB1cCBhIG5ldyAoZW1wdHkpCi0gKiBmcmFnLCBpbiB0aGUgc2FtZSBzdWJzZWdtZW50IGFzIHRoZSBvbGQgZnJhZy4KLSAqIFtmcmNoYWluX25vdyByZW1haW5zIHRoZSBzYW1lIGJ1dCBmcmFnX25vdyBpcyB1cGRhdGVkLl0KLSAqIEJlY2F1c2UgdGhpcyBjYWxjdWxhdGVzIHRoZSBjb3JyZWN0IHZhbHVlIG9mIGZyX2ZpeCBieQotICogbG9va2luZyBhdCB0aGUgb2JzdGFjayAnZnJhZ3MnLCBpdCBuZWVkcyB0byBrbm93IGhvdyBtYW55Ci0gKiBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgb2YgdGhlIG9sZCBmcmFnIGJlbG9uZyB0byAodGhlIG1heGltYWwpCi0gKiBmcl92YXI6IHRoZSByZXN0IG11c3QgYmVsb25nIHRvIGZyX2ZpeC4KLSAqIEl0IGRvZXNuJ3QgYWN0dWFsbHkgc2V0IHVwIHRoZSBvbGQgZnJhZydzIGZyX3ZhcjogeW91IG1heSBoYXZlCi0gKiBzZXQgZnJfdmFyID09IDEsIGJ1dCBhbGxvY2F0ZWQgMTAgY2hhcnMgdG8gdGhlIGVuZCBvZiB0aGUgZnJhZzoKLSAqIGluIHRoaXMgY2FzZSB5b3UgcGFzcyBvbGRfZnJhZ3NfdmFyX21heF9zaXplID09IDEwLgotICoKLSAqIE1ha2UgYSBuZXcgZnJhZywgaW5pdGlhbGlzaW5nIHNvbWUgY29tcG9uZW50cy4gTGluayBuZXcgZnJhZyBhdCBlbmQKLSAqIG9mIGZyY2hhaW5fbm93LgotICovCi12b2lkIAotZnJhZ19uZXcgKG9sZF9mcmFnc192YXJfbWF4X3NpemUpCi0gICAgIC8qIE51bWJlciBvZiBjaGFycyAoYWxyZWFkeSBhbGxvY2F0ZWQgb24gb2JzdGFjayBmcmFncykgaW4KLQl2YXJpYWJsZV9sZW5ndGggcGFydCBvZiBmcmFnLiAqLwotICAgICBpbnQgb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZTsKLXsKLSAgZnJhZ1MgKmZvcm1lcl9sYXN0X2ZyYWdQOwotICBmcmNoYWluUyAqZnJjaFA7Ci0KLSAgYXNzZXJ0IChmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKLQotICAvKiBGaXggdXAgb2xkIGZyYWcncyBmcl9maXguICAqLwotICBmcmFnX25vdy0+ZnJfZml4ID0gZnJhZ19ub3dfZml4ICgpIC0gb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZTsKLSAgLyogTWFrZSBzdXJlIGl0cyB0eXBlIGlzIHZhbGlkLiAgKi8KLSAgYXNzZXJ0IChmcmFnX25vdy0+ZnJfdHlwZSAhPSAwKTsKLQotICAvKiBUaGlzIHdpbGwgYWxpZ24gdGhlIG9ic3RhY2sgc28gdGhlIG5leHQgc3RydWN0IHdlIGFsbG9jYXRlIG9uIGl0Ci0gICAgIHdpbGwgYmVnaW4gYXQgYSBjb3JyZWN0IGJvdW5kYXJ5LiAqLwotICBvYnN0YWNrX2ZpbmlzaCAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOwotICBmcmNoUCA9IGZyY2hhaW5fbm93OwotICBrbm93IChmcmNoUCk7Ci0gIGZvcm1lcl9sYXN0X2ZyYWdQID0gZnJjaFAtPmZyY2hfbGFzdDsKLSAgYXNzZXJ0IChmb3JtZXJfbGFzdF9mcmFnUCAhPSAwKTsKLSAgYXNzZXJ0IChmb3JtZXJfbGFzdF9mcmFnUCA9PSBmcmFnX25vdyk7Ci0gIGZyYWdfbm93ID0gZnJhZ19hbGxvYyAoJmZyY2hQLT5mcmNoX29ic3RhY2spOwotCi0gIGFzX3doZXJlICgmZnJhZ19ub3ctPmZyX2ZpbGUsICZmcmFnX25vdy0+ZnJfbGluZSk7Ci0KLSAgLyogR2VuZXJhbGx5LCBmcmFnX25vdy0+cG9pbnRzIHRvIGFuIGFkZHJlc3Mgcm91bmRlZCB1cCB0byBuZXh0Ci0gICAgIGFsaWdubWVudC4gIEhvd2V2ZXIsIGNoYXJhY3RlcnMgd2lsbCBhZGQgdG8gb2JzdGFjayBmcmFncwotICAgICBJTU1FRElBVEVMWSBhZnRlciB0aGUgc3RydWN0IGZyYWcsIGV2ZW4gaWYgdGhleSBhcmUgbm90IHN0YXJ0aW5nCi0gICAgIGF0IGFuIGFsaWdubWVudCBhZGRyZXNzLiAqLwotICBmb3JtZXJfbGFzdF9mcmFnUC0+ZnJfbmV4dCA9IGZyYWdfbm93OwotICBmcmNoUC0+ZnJjaF9sYXN0ID0gZnJhZ19ub3c7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICB7Ci0gICAgZXh0ZXJuIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICpsaXN0aW5nX3RhaWw7Ci0gICAgZnJhZ19ub3ctPmxpbmUgPSBsaXN0aW5nX3RhaWw7Ci0gIH0KLSNlbmRpZgotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgZnJhZ19ub3ctPmZyX25leHQgPSBOVUxMOwotfQkJCQkvKiBmcmFnX25ldygpICovCi0MCi0vKgotICoJCQlmcmFnX21vcmUoKQotICoKLSAqIFN0YXJ0IGEgbmV3IGZyYWcgdW5sZXNzIHdlIGhhdmUgbiBtb3JlIGNoYXJzIG9mIHJvb20gaW4gdGhlIGN1cnJlbnQgZnJhZy4KLSAqIENsb3NlIG9mZiB0aGUgb2xkIGZyYWcgd2l0aCBhIC5maWxsIDAuCi0gKgotICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSAxc3QgY2hhciB0byB3cml0ZSBpbnRvLiBBZHZhbmNlCi0gKiBmcmFnX25vd19ncm93dGggcGFzdCB0aGUgbmV3IGNoYXJzLgotICovCi0KLWNoYXIgKgotZnJhZ19tb3JlIChuY2hhcnMpCi0gICAgIGludCBuY2hhcnM7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldHZhbDsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byBhbGxvY2F0ZSBkYXRhIGluIGFic29sdXRlIHNlY3Rpb24iKSk7Ci0gICAgICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotICAgIH0KLQotICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gYWxsb2NhdGUgZGF0YSBpbiBjb21tb24gc2VjdGlvbiIpKTsKLSAgICAgIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLSAgICB9Ci0KLSAgZnJhZ19ncm93IChuY2hhcnMpOwotICByZXR2YWwgPSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOwotICBvYnN0YWNrX2JsYW5rX2Zhc3QgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBuY2hhcnMpOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGZyYWdfbW9yZSgpICovCi0MCi0vKgotICoJCQlmcmFnX3ZhcigpCi0gKgotICogU3RhcnQgYSBuZXcgZnJhZyB1bmxlc3Mgd2UgaGF2ZSBtYXhfY2hhcnMgbW9yZSBjaGFycyBvZiByb29tIGluIHRoZSBjdXJyZW50IGZyYWcuCi0gKiBDbG9zZSBvZmYgdGhlIG9sZCBmcmFnIHdpdGggYSAuZmlsbCAwLgotICoKLSAqIFNldCB1cCBhIG1hY2hpbmVfZGVwZW5kZW50IHJlbGF4YWJsZSBmcmFnLCB0aGVuIHN0YXJ0IGEgbmV3IGZyYWcuCi0gKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIDFzdCBjaGFyIG9mIHRoZSB2YXIgcGFydCBvZiB0aGUgb2xkIGZyYWcKLSAqIHRvIHdyaXRlIGludG8uCi0gKi8KLQotY2hhciAqCi1mcmFnX3ZhciAodHlwZSwgbWF4X2NoYXJzLCB2YXIsIHN1YnR5cGUsIHN5bWJvbCwgb2Zmc2V0LCBvcGNvZGUpCi0gICAgIHJlbGF4X3N0YXRlVCB0eXBlOwotICAgICBpbnQgbWF4X2NoYXJzOwotICAgICBpbnQgdmFyOwotICAgICByZWxheF9zdWJzdGF0ZVQgc3VidHlwZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sOwotICAgICBvZmZzZXRUIG9mZnNldDsKLSAgICAgY2hhciAqb3Bjb2RlOwotewotICByZWdpc3RlciBjaGFyICpyZXR2YWw7Ci0KLSAgZnJhZ19ncm93IChtYXhfY2hhcnMpOwotICByZXR2YWwgPSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOwotICBvYnN0YWNrX2JsYW5rX2Zhc3QgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBtYXhfY2hhcnMpOwotICBmcmFnX25vdy0+ZnJfdmFyID0gdmFyOwotICBmcmFnX25vdy0+ZnJfdHlwZSA9IHR5cGU7Ci0gIGZyYWdfbm93LT5mcl9zdWJ0eXBlID0gc3VidHlwZTsKLSAgZnJhZ19ub3ctPmZyX3N5bWJvbCA9IHN5bWJvbDsKLSAgZnJhZ19ub3ctPmZyX29mZnNldCA9IG9mZnNldDsKLSAgZnJhZ19ub3ctPmZyX29wY29kZSA9IG9wY29kZTsKLSNpZmRlZiBVU0lOR19DR0VOCi0gIGZyYWdfbm93LT5mcl9jZ2VuLmluc24gPSAwOwotICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZGV4ID0gMDsKLSAgZnJhZ19ub3ctPmZyX2NnZW4ub3BpbmZvID0gMDsKLSNlbmRpZgotI2lmZGVmIFRDX0ZSQUdfSU5JVAotICBUQ19GUkFHX0lOSVQgKGZyYWdfbm93KTsKLSNlbmRpZgotICBhc193aGVyZSAoJmZyYWdfbm93LT5mcl9maWxlLCAmZnJhZ19ub3ctPmZyX2xpbmUpOwotICBmcmFnX25ldyAobWF4X2NoYXJzKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQotDAotLyoKLSAqCQkJZnJhZ192YXJpYW50KCkKLSAqCi0gKiBPVkU6IFRoaXMgdmFyaWFudCBvZiBmcmFnX3ZhciBhc3N1bWVzIHRoYXQgc3BhY2UgZm9yIHRoZSB0YWlsIGhhcyBiZWVuCi0gKiAgICAgIGFsbG9jYXRlZCBieSBjYWxsZXIuCi0gKiAgICAgIE5vIGNhbGwgdG8gZnJhZ19ncm93IGlzIGRvbmUuCi0gKi8KLQotY2hhciAqCi1mcmFnX3ZhcmlhbnQgKHR5cGUsIG1heF9jaGFycywgdmFyLCBzdWJ0eXBlLCBzeW1ib2wsIG9mZnNldCwgb3Bjb2RlKQotICAgICByZWxheF9zdGF0ZVQgdHlwZTsKLSAgICAgaW50IG1heF9jaGFyczsKLSAgICAgaW50IHZhcjsKLSAgICAgcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbDsKLSAgICAgb2Zmc2V0VCBvZmZzZXQ7Ci0gICAgIGNoYXIgKm9wY29kZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmV0dmFsOwotCi0gIHJldHZhbCA9IG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayk7Ci0gIGZyYWdfbm93LT5mcl92YXIgPSB2YXI7Ci0gIGZyYWdfbm93LT5mcl90eXBlID0gdHlwZTsKLSAgZnJhZ19ub3ctPmZyX3N1YnR5cGUgPSBzdWJ0eXBlOwotICBmcmFnX25vdy0+ZnJfc3ltYm9sID0gc3ltYm9sOwotICBmcmFnX25vdy0+ZnJfb2Zmc2V0ID0gb2Zmc2V0OwotICBmcmFnX25vdy0+ZnJfb3Bjb2RlID0gb3Bjb2RlOwotI2lmZGVmIFVTSU5HX0NHRU4KLSAgZnJhZ19ub3ctPmZyX2NnZW4uaW5zbiA9IDA7Ci0gIGZyYWdfbm93LT5mcl9jZ2VuLm9waW5kZXggPSAwOwotICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZm8gPSAwOwotI2VuZGlmCi0jaWZkZWYgVENfRlJBR19JTklUCi0gIFRDX0ZSQUdfSU5JVCAoZnJhZ19ub3cpOwotI2VuZGlmCi0gIGFzX3doZXJlICgmZnJhZ19ub3ctPmZyX2ZpbGUsICZmcmFnX25vdy0+ZnJfbGluZSk7Ci0gIGZyYWdfbmV3IChtYXhfY2hhcnMpOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGZyYWdfdmFyaWFudCgpICovCi0MCi0vKgotICoJCQlmcmFnX3dhbmUoKQotICoKLSAqIFJlZHVjZSB0aGUgdmFyaWFibGUgZW5kIG9mIGEgZnJhZyB0byBhIGhhcm1sZXNzIHN0YXRlLgotICovCi12b2lkIAotZnJhZ193YW5lIChmcmFnUCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0gIGZyYWdQLT5mcl9vZmZzZXQgPSAwOwotICBmcmFnUC0+ZnJfdmFyID0gMDsKLX0KLQwKLS8qIE1ha2UgYW4gYWxpZ25tZW50IGZyYWcuICBUaGUgc2l6ZSBvZiB0aGlzIGZyYWcgd2lsbCBiZSBhZGp1c3RlZCB0bwotICAgZm9yY2UgdGhlIG5leHQgZnJhZyB0byBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhbGlnbm1lbnQuICBBTElHTk1FTlQKLSAgIGlzIHRoZSBwb3dlciBvZiB0d28gdG8gd2hpY2ggdG8gYWxpZ24uICBGSUxMX0NIQVJBQ1RFUiBpcyB0aGUKLSAgIGNoYXJhY3RlciB0byB1c2UgdG8gZmlsbCBpbiBhbnkgYnl0ZXMgd2hpY2ggYXJlIHNraXBwZWQuICBNQVggaXMKLSAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAotICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotdm9pZCAKLWZyYWdfYWxpZ24gKGFsaWdubWVudCwgZmlsbF9jaGFyYWN0ZXIsIG1heCkKLSAgICAgaW50IGFsaWdubWVudDsKLSAgICAgaW50IGZpbGxfY2hhcmFjdGVyOwotICAgICBpbnQgbWF4OwotewotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFkZHJlc3NUIG5ld19vZmY7Ci0KLSAgICAgIG5ld19vZmYgPSAoKGFic19zZWN0aW9uX29mZnNldCArIGFsaWdubWVudCAtIDEpCi0JCSAmfiAoKDEgPDwgYWxpZ25tZW50KSAtIDEpKTsKLSAgICAgIGlmIChtYXggPT0gMCB8fCBuZXdfb2ZmIC0gYWJzX3NlY3Rpb25fb2Zmc2V0IDw9IChhZGRyZXNzVCkgbWF4KQotCWFic19zZWN0aW9uX29mZnNldCA9IG5ld19vZmY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqcDsKLQotICAgICAgcCA9IGZyYWdfdmFyIChyc19hbGlnbiwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgbWF4LAotCQkgICAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIGFsaWdubWVudCwgKGNoYXIgKikgMCk7Ci0gICAgICAqcCA9IGZpbGxfY2hhcmFjdGVyOwotICAgIH0KLX0KLQotLyogTWFrZSBhbiBhbGlnbm1lbnQgZnJhZyBsaWtlIGZyYWdfYWxpZ24sIGJ1dCBmaWxsIHdpdGggYSByZXBlYXRpbmcKLSAgIHBhdHRlcm4gcmF0aGVyIHRoYW4gYSBzaW5nbGUgYnl0ZS4gIEFMSUdOTUVOVCBpcyB0aGUgcG93ZXIgb2YgdHdvCi0gICB0byB3aGljaCB0byBhbGlnbi4gIEZJTExfUEFUVEVSTiBpcyB0aGUgZmlsbCBwYXR0ZXJuIHRvIHJlcGVhdCBpbgotICAgdGhlIGJ5dGVzIHdoaWNoIGFyZSBza2lwcGVkLiAgTl9GSUxMIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4KLSAgIEZJTExfUEFUVEVSTi4gIE1BWCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwIHdoZW4KLSAgIGRvaW5nIHRoZSBhbGlnbm1lbnQsIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0KLXZvaWQgCi1mcmFnX2FsaWduX3BhdHRlcm4gKGFsaWdubWVudCwgZmlsbF9wYXR0ZXJuLCBuX2ZpbGwsIG1heCkKLSAgICAgaW50IGFsaWdubWVudDsKLSAgICAgY29uc3QgY2hhciAqZmlsbF9wYXR0ZXJuOwotICAgICBpbnQgbl9maWxsOwotICAgICBpbnQgbWF4OwotewotICBjaGFyICpwOwotCi0gIHAgPSBmcmFnX3ZhciAocnNfYWxpZ24sIG5fZmlsbCwgbl9maWxsLCAocmVsYXhfc3Vic3RhdGVUKSBtYXgsCi0JCShzeW1ib2xTICopIDAsIChvZmZzZXRUKSBhbGlnbm1lbnQsIChjaGFyICopIDApOwotICBtZW1jcHkgKHAsIGZpbGxfcGF0dGVybiwgbl9maWxsKTsKLX0KLQotYWRkcmVzc1QKLWZyYWdfbm93X2ZpeCAoKQotewotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybiBhYnNfc2VjdGlvbl9vZmZzZXQ7Ci0gIHJldHVybiAoYWRkcmVzc1QpICgoY2hhciopIG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykKLQkJICAgICAtIGZyYWdfbm93LT5mcl9saXRlcmFsKTsKLX0KLQotdm9pZAotZnJhZ19hcHBlbmRfMV9jaGFyIChkYXR1bSkKLSAgICAgaW50IGRhdHVtOwotewotICBpZiAob2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgPD0gMSkKLSAgICB7Ci0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLSAgICB9Ci0gIG9ic3RhY2tfMWdyb3cgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBkYXR1bSk7Ci19Ci0KLS8qIGVuZCBvZiBmcmFncy5jICovCmRpZmYgLS1naXQgYS9nYXMvZnJhZ3MuaCBiL2dhcy9mcmFncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTg4ZTMzLi4wMDAwMDAwCi0tLSBhL2dhcy9mcmFncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qIGZyYWdzLmggLSBIZWFkZXIgZmlsZSBmb3IgdGhlIGZyYWcgY29uY2VwdC4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRlJBR1NfSAotI2RlZmluZSBGUkFHU19ICi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBvYnN0YWNrOwotI2VuZGlmCi0KLS8qCi0gKiBBIGNvZGUgZnJhZ21lbnQgKGZyYWcpIGlzIHNvbWUga25vd24gbnVtYmVyIG9mIGNoYXJzLCBmb2xsb3dlZCBieSBzb21lCi0gKiB1bmtub3duIG51bWJlciBvZiBjaGFycy4gVHlwaWNhbGx5IHRoZSB1bmtub3duIG51bWJlciBvZiBjaGFycyBpcyBhbgotICogaW5zdHJ1Y3Rpb24gYWRkcmVzcyB3aG9zZSBzaXplIGlzIHlldCB1bmtub3duLiBXZSBhbHdheXMga25vdyB0aGUgZ3JlYXRlc3QKLSAqIHBvc3NpYmxlIHNpemUgdGhlIHVua25vd24gbnVtYmVyIG9mIGNoYXJzIG1heSBiZWNvbWUsIGFuZCByZXNlcnZlIHRoYXQKLSAqIG11Y2ggcm9vbSBhdCB0aGUgZW5kIG9mIHRoZSBmcmFnLgotICogT25jZSBjcmVhdGVkLCBmcmFncyBkbyBub3QgY2hhbmdlIGFkZHJlc3MgZHVyaW5nIGFzc2VtYmx5LgotICogV2UgY2hhaW4gdGhlIGZyYWdzIGluIChhKSBmb3J3YXJkLWxpbmtlZCBsaXN0KHMpLiBUaGUgb2JqZWN0LWZpbGUgYWRkcmVzcwotICogb2YgdGhlIDFzdCBjaGFyIG9mIGEgZnJhZyBpcyBnZW5lcmFsbHkgbm90IGtub3duIHVudGlsIGFmdGVyIHJlbGF4KCkuCi0gKiBNYW55IHRoaW5ncyBhdCBhc3NlbWJseSB0aW1lIGRlc2NyaWJlIGFuIGFkZHJlc3MgYnkge29iamVjdC1maWxlLWFkZHJlc3MKLSAqIG9mIGEgcGFydGljdWxhciBmcmFnfStvZmZzZXQuCi0KLSBCVUc6IGl0IG1heSBiZSBzbWFydGVyIHRvIGhhdmUgYSBzaW5nbGUgcG9pbnRlciBvZmYgdG8gdmFyaW91cyBkaWZmZXJlbnQKLSBub3RlcyBmb3IgZGlmZmVyZW50IGZyYWcga2luZHMuIFNlZSBob3cgY29kZSBwYW5zCi0gKi8KLQotc3RydWN0IGZyYWcKLXsKLSAgLyogT2JqZWN0IGZpbGUgYWRkcmVzcy4gKi8KLSAgYWRkcmVzc1QgZnJfYWRkcmVzczsKLSAgLyogQ2hhaW4gZm9yd2FyZDsgYXNjZW5kaW5nIGFkZHJlc3Mgb3JkZXIuICBSb290ZWQgaW4gZnJjaF9yb290LiAqLwotICBzdHJ1Y3QgZnJhZyAqZnJfbmV4dDsKLQotICAvKiAoRml4ZWQpIG51bWJlciBvZiBjaGFycyB3ZSBrbm93IHdlIGhhdmUuICBNYXkgYmUgMC4gKi8KLSAgb2Zmc2V0VCBmcl9maXg7Ci0gIC8qIChWYXJpYWJsZSkgbnVtYmVyIG9mIGNoYXJzIGFmdGVyIGFib3ZlLiAgTWF5IGJlIDAuICovCi0gIG9mZnNldFQgZnJfdmFyOwotICAvKiBGb3IgdmFyaWFibGUtbGVuZ3RoIHRhaWwuICovCi0gIHN5bWJvbFMgKmZyX3N5bWJvbDsKLSAgLyogRm9yIHZhcmlhYmxlLWxlbmd0aCB0YWlsLiAqLwotICBvZmZzZXRUIGZyX29mZnNldDsKLSAgLyogUG9pbnRzIHRvIG9wY29kZSBsb3cgYWRkciBieXRlLCBmb3IgcmVsYXhhdGlvbi4gICovCi0gIGNoYXIgKmZyX29wY29kZTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICpsaW5lOwotI2VuZGlmCi0KLSAgLyogV2hhdCBzdGF0ZSBpcyBteSB0YWlsIGluPyAqLwotICByZWxheF9zdGF0ZVQgZnJfdHlwZTsKLSAgcmVsYXhfc3Vic3RhdGVUIGZyX3N1YnR5cGU7Ci0KLSNpZmRlZiBVU0lOR19DR0VOCi0gIC8qIERvbid0IGluY2x1ZGUgdGhpcyB1bmxlc3MgdXNpbmcgQ0dFTiB0byBrZWVwIGZyYWcgc2l6ZSBkb3duLiAgKi8KLSAgc3RydWN0IHsKLSAgICAvKiBDR0VOX0lOU04gZW50cnkgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgIGNvbnN0IHN0cnVjdCBjZ2VuX2luc24gKmluc247Ci0gICAgLyogSW5kZXggaW50byBvcGVyYW5kIHRhYmxlLiAgKi8KLSAgICBpbnQgb3BpbmRleDsKLSAgICAvKiBUYXJnZXQgc3BlY2lmaWMgZGF0YSwgdXN1YWxseSByZWxvYyBudW1iZXIuICAqLwotICAgIGludCBvcGluZm87Ci0gIH0gZnJfY2dlbjsKLSNlbmRpZgotCi0jaWZkZWYgVENfRlJBR19UWVBFCi0gIFRDX0ZSQUdfVFlQRSB0Y19mcmFnX2RhdGE7Ci0jZW5kaWYKLQotICAvKiBXaGVyZSB0aGUgZnJhZyB3YXMgY3JlYXRlZCwgb3Igd2hlcmUgaXQgYmVjYW1lIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgY2hhciAqZnJfZmlsZTsKLSAgdW5zaWduZWQgaW50IGZyX2xpbmU7Ci0KLSAgLyogRGF0YSBiZWdpbnMgaGVyZS4gICovCi0gIGNoYXIgZnJfbGl0ZXJhbFsxXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX1NUUlVDVF9GUkFHIFwKLSgoY2hhciAqKXplcm9fYWRkcmVzc19mcmFnLmZyX2xpdGVyYWwtKGNoYXIgKikmemVyb19hZGRyZXNzX2ZyYWcpCi0vKiBXZSB3YW50IHRvIHNheSBmcl9saXRlcmFsWzBdIGFib3ZlLiAqLwotCi0vKiBDdXJyZW50IGZyYWcgd2UgYXJlIGJ1aWxkaW5nLiAgVGhpcyBmcmFnIGlzIGluY29tcGxldGUuICBJdCBpcywKLSAgIGhvd2V2ZXIsIGluY2x1ZGVkIGluIGZyY2hhaW5fbm93LiAgVGhlIGZyX2ZpeCBmaWVsZCBpcyBib2d1czsKLSAgIGluc3RlYWQsIHVzZSBmcmFnX25vd19maXggKCkuICAqLwotQ09NTU9OIGZyYWdTICpmcmFnX25vdzsKLWV4dGVybiBhZGRyZXNzVCBmcmFnX25vd19maXggUEFSQU1TICgodm9pZCkpOwotCi0vKiBGb3IgZm9yZWlnbi1zZWdtZW50IHN5bWJvbCBmaXh1cHMuICovCi1DT01NT04gZnJhZ1MgemVyb19hZGRyZXNzX2ZyYWc7Ci0vKiBGb3IgbG9jYWwgY29tbW9uIChOX0JTUyBzZWdtZW50KSBmaXh1cHMuICovCi1DT01NT04gZnJhZ1MgYnNzX2FkZHJlc3NfZnJhZzsKLQotI2lmIDAKLS8qCi0gKiBBIG1hY3JvIHRvIHNwZWVkIHVwIGFwcGVuZGluZyBleGFjdGx5IDEgY2hhcgotICogdG8gY3VycmVudCBmcmFnLgotICovCi0vKiBKRiBjaGFuZ2VkIDwgMSB0byA8PSAxIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRvbiAqLwotI2RlZmluZSBGUkFHX0FQUEVORF8xX0NIQVIoZGF0dW0pCVwKLXsJCQkJCVwKLSAgaWYgKG9ic3RhY2tfcm9vbSggJmZyYWdzICkgPD0gMSkge1wKLSAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsJXAotICAgIGZyYWdfbmV3ICgwKTsJCVwKLSAgfQkJCQlcCi0gIG9ic3RhY2tfMWdyb3coICZmcmFncywgZGF0dW0gKTsJXAotfQotI2Vsc2UKLWV4dGVybiB2b2lkIGZyYWdfYXBwZW5kXzFfY2hhciBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgRlJBR19BUFBFTkRfMV9DSEFSKFgpIGZyYWdfYXBwZW5kXzFfY2hhciAoWCkKLSNlbmRpZgotCi0KLXZvaWQgZnJhZ19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLWZyYWdTICpmcmFnX2FsbG9jIFBBUkFNUyAoKHN0cnVjdCBvYnN0YWNrICopKTsKLXZvaWQgZnJhZ19ncm93IFBBUkFNUyAoKHVuc2lnbmVkIGludCBuY2hhcnMpKTsKLWNoYXIgKmZyYWdfbW9yZSBQQVJBTVMgKChpbnQgbmNoYXJzKSk7Ci12b2lkIGZyYWdfYWxpZ24gUEFSQU1TICgoaW50IGFsaWdubWVudCwgaW50IGZpbGxfY2hhcmFjdGVyLCBpbnQgbWF4KSk7Ci12b2lkIGZyYWdfYWxpZ25fcGF0dGVybiBQQVJBTVMgKChpbnQgYWxpZ25tZW50LAotCQkJCSBjb25zdCBjaGFyICpmaWxsX3BhdHRlcm4sCi0JCQkJIGludCBuX2ZpbGwsCi0JCQkJIGludCBtYXgpKTsKLXZvaWQgZnJhZ19uZXcgUEFSQU1TICgoaW50IG9sZF9mcmFnc192YXJfbWF4X3NpemUpKTsKLXZvaWQgZnJhZ193YW5lIFBBUkFNUyAoKGZyYWdTICogZnJhZ1ApKTsKLQotY2hhciAqZnJhZ192YXJpYW50IFBBUkFNUyAoKHJlbGF4X3N0YXRlVCB0eXBlLAotCQkJICAgIGludCBtYXhfY2hhcnMsCi0JCQkgICAgaW50IHZhciwKLQkJCSAgICByZWxheF9zdWJzdGF0ZVQgc3VidHlwZSwKLQkJCSAgICBzeW1ib2xTICogc3ltYm9sLAotCQkJICAgIG9mZnNldFQgb2Zmc2V0LAotCQkJICAgIGNoYXIgKm9wY29kZSkpOwotCi1jaGFyICpmcmFnX3ZhciBQQVJBTVMgKChyZWxheF9zdGF0ZVQgdHlwZSwKLQkJCWludCBtYXhfY2hhcnMsCi0JCQlpbnQgdmFyLAotCQkJcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGUsCi0JCQlzeW1ib2xTICogc3ltYm9sLAotCQkJb2Zmc2V0VCBvZmZzZXQsCi0JCQljaGFyICpvcGNvZGUpKTsKLQotI2VuZGlmIC8qIEZSQUdTX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9nYXNwLmMgYi9nYXMvZ2FzcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmIzMDc2Li4wMDAwMDAwCi0tLSBhL2dhcy9nYXNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUwICswLDAgQEAKLS8qIGdhc3AuYyAtIEdudSBhc3NlbWJsZXIgcHJlcHJvY2Vzc29yIG1haW4gcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVNQLCB0aGUgR05VIEFzc2VtYmxlciBQcmVwcm9jZXNzb3IuCi0KLSAgIEdBU1AgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVNQIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTUDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoKLQotVGhpcyBwcm9ncmFtIHRyYW5zbGF0ZXMgdGhlIGlucHV0IG1hY3JvcyBhbmQgc3R1ZmYgaW50byBhIGZvcm0KLXN1aXRhYmxlIGZvciBnYXMgdG8gY29uc3VtZS4KLQotCi0gIGdhc3AgWy1zZGhhdV0gWy1jIGNoYXJdIFstbyA8b3V0ZmlsZT5dIDxpbmZpbGU+KgotCi0gIC1zIGNvcHkgc291cmNlIHRvIG91dHB1dAotICAtYyA8Y2hhcj4gY29tbWVudHMgYXJlIHN0YXJ0ZWQgd2l0aCA8Y2hhcj4gaW5zdGVhZCBvZiAhCi0gIC11IGFsbG93IHVucmVhc29uYWJsZSBzdHVmZgotICAtcCBwcmludCBsaW5lIG51bWJlcnMKLSAgLWQgcHJpbnQgZGVidWdnaW5nIHN0YXRzCi0gIC1zIHNlbWkgY29sb25zIHN0YXJ0IGNvbW1lbnRzCi0gIC1hIHVzZSBhbHRlcm5hdGUgc3ludGF4Ci0gICAgIFBzZXVkbyBvcHMgY2FuIHN0YXJ0IHdpdGggb3Igd2l0aG91dCBhIC4KLSAgICAgTGFiZWxzIGhhdmUgdG8gYmUgaW4gZmlyc3QgY29sdW1uLgotICAtSSBzcGVjaWZ5IGluY2x1ZGUgZGlyCi0gICAgTWFjcm8gYXJnIHBhcmFtZXRlcnMgc3Vic2l0dXRlZCBieSBuYW1lLCBkb24ndCBuZWVkIHRoZSAmLgotICAgICBTdHJpbmcgY2FuIHN0YXJ0IHdpdGggJyB0b28uCi0gICAgIFN0cmluZ3MgY2FuIGJlIHN1cnJvdW5kZWQgYnkgPC4uPgotICAgICBBICU8ZXhwPiBpbiBhIHN0cmluZyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gCi0gICAgIExpdGVyYWwgY2hhciBpbiBhIHN0cmluZyB3aXRoICEKLQotCi0qLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfTUFMTE9DX0RFQ0xBUkFUSU9OCi1leHRlcm4gY2hhciAqbWFsbG9jICgpOwotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNiLmgiCi0jaW5jbHVkZSAibWFjcm8uaCIKLSNpbmNsdWRlICJhc2ludGwuaCIKLQotY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjEuMiI7Ci0KLS8qIFRoaXMgaXMgbm9ybWFsbHkgZGVjbGFyZWQgaW4gYXMuaCwgYnV0IHdlIGRvbid0IGluY2x1ZGUgdGhhdC4gIFdlCi0gICBuZWVkIHRoZSBmdW5jdGlvbiBiZWNhdXNlIG90aGVyIGZpbGVzIGxpbmtlZCB3aXRoIGdhc3AuYyBtaWdodCBjYWxsCi0gICBpdC4gICovCi1leHRlcm4gdm9pZCBhc19hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoZSBkZWZhdWx0IG9ic3RhY2sgY2h1bmsgc2l6ZS4gIElmIHdlIHNldCB0aGlzIHRvIHplcm8sIHRoZQotICAgb2JzdGFjayBjb2RlIHdpbGwgdXNlIHdoYXRldmVyIHdpbGwgZml0IGluIGEgNDA5NiBieXRlIGJsb2NrLiAgVGhpcwotICAgaXMgdXNlZCBieSB0aGUgaGFzaCB0YWJsZSBjb2RlIHVzZWQgYnkgbWFjcm8uYy4gICovCi1pbnQgY2h1bmtzaXplID0gMDsKLQotI2RlZmluZSBNQVhfSU5DTFVERVMgMzAJCS8qIE1heGltdW0gaW5jbHVkZSBkZXB0aCAqLwotI2RlZmluZSBNQVhfUkVBU09OQUJMRSAxMDAwCS8qIE1heGltdW0gbnVtYmVyIG9mIGV4cGFuc2lvbnMgKi8KLQotaW50IHVucmVhc29uYWJsZTsJCS8qIC11IG9uIGNvbW1hbmQgbGluZSAqLwotaW50IHN0YXRzOwkJCS8qIC1kIG9uIGNvbW1hbmQgbGluZSAqLwotaW50IHByaW50X2xpbmVfbnVtYmVyOwkJLyogLXAgZmxhZyBvbiBjb21tYW5kIGxpbmUgKi8KLWludCBjb3B5c291cmNlOwkJCS8qIC1jIGZsYWcgb24gY29tbWFuZCBsaW5lICovCi1pbnQgd2FybmluZ3M7CQkJLyogTnVtYmVyIG9mIFdBUk5JTkdzIGdlbmVyYXRlZCBzbyBmYXIuICovCi1pbnQgZXJyb3JzOwkJCS8qIE51bWJlciBvZiBFUlJPUnMgZ2VuZXJhdGVkIHNvIGZhci4gKi8KLWludCBmYXRhbHM7CQkJLyogTnVtYmVyIG9mIGZhdGFsIEVSUk9ScyBnZW5lcmF0ZWQgc28gZmFyIChlaXRoZXIgMCBvciAxKS4gKi8KLWludCBhbHRlcm5hdGUgPSAwOyAgICAgICAgICAgICAgLyogLWEgb24gY29tbWFuZCBsaW5lICovCi1pbnQgbXJpID0gMDsJCQkvKiAtTSBvbiBjb21tYW5kIGxpbmUgKi8KLWNoYXIgY29tbWVudF9jaGFyID0gJyEnOwotaW50IHJhZGl4ID0gMTA7CQkJLyogRGVmYXVsdCByYWRpeCAqLwotCi1pbnQgaGFkX2VuZDsgLyogU2VlbiAuRU5EICovCi0KLS8qIFRoZSBvdXRwdXQgc3RyZWFtICovCi1GSUxFICpvdXRmaWxlOwotCi0vKiB0aGUgYXR0cmlidXRlcyBvZiBlYWNoIGNoYXJhY3RlciBhcmUgc3RvcmVkIGFzIGEgYml0IHBhdHRlcm4KLSAgIGNoYXJ0eXBlLCB3aGljaCBnaXZlcyB1cyBxdWljayB0ZXN0cy4gKi8KLQotCi0jZGVmaW5lIEZJUlNUQklUIDEKLSNkZWZpbmUgTkVYVEJJVCAgMgotI2RlZmluZSBTRVBCSVQgICA0Ci0jZGVmaW5lIFdISVRFQklUIDgKLSNkZWZpbmUgQ09NTUVOVEJJVCAxNgotI2RlZmluZSBCQVNFQklUICAzMgotI2RlZmluZSBJU0NPTU1FTlRDSEFSKHgpIChjaGFydHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgQ09NTUVOVEJJVCkKLSNkZWZpbmUgSVNGSVJTVENIQVIoeCkgIChjaGFydHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgRklSU1RCSVQpCi0jZGVmaW5lIElTTkVYVENIQVIoeCkgICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIE5FWFRCSVQpCi0jZGVmaW5lIElTU0VQKHgpICAgICAgICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIFNFUEJJVCkKLSNkZWZpbmUgSVNXSElURSh4KSAgICAgIChjaGFydHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgV0hJVEVCSVQpCi0jZGVmaW5lIElTQkFTRSh4KSAgICAgICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIEJBU0VCSVQpCi1zdGF0aWMgY2hhciBjaGFydHlwZVsyNTZdOwotCi0KLS8qIENvbmRpdGlvbmFsIGFzc2VtYmx5IHVzZXMgdGhlIGBpZnN0YWNrJy4gIEVhY2ggYWlmIHB1c2hlcyBhbm90aGVyCi0gICBlbnRyeSBvbnRvIHRoZSBzdGFjaywgYW5kIHNldHMgdGhlIG9uIGZsYWcgaWYgaXQgc2hvdWxkLiAgVGhlIGFlbHNlCi0gICBzZXRzIGhhZGVsc2UsIGFuZCB0b2dnbGVzIG9uLiAgQW4gYWVuZCBwb3BzIGEgbGV2ZWwuICBXZSBsaW1pdCB0bwotICAgMTAwIGxldmVscyBvZiBuZXN0aW5nLCBub3QgYmVjYXVzZSB3ZSdyZSBmYWNpc3RzIHBpZ3Mgd2l0aCByZWFkCi0gICBvbmx5IG1pbmRzLCBidXQgYmVjYXVzZSBtb3JlIHRoYW4gMTAwIGxldmVscyBvZiBuZXN0aW5nIGlzIHByb2JhYmx5Ci0gICBhIGJ1ZyBpbiB0aGUgdXNlcidzIG1hY3JvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgSUZORVNUSU5HIDEwMAotc3RydWN0Ci0gIHsKLSAgICBpbnQgb247CQkJLyogaXMgdGhlIGxldmVsIGJlaW5nIG91dHB1dCAqLwotICAgIGludCBoYWRlbHNlOwkJLyogaGFzIGFuIGFlbHNlIGJlZW4gc2VlbiAqLwotICB9Ci1pZnN0YWNrW0lGTkVTVElOR107Ci1pbnQgaWZpOwotCi0vKiBUaGUgZmluYWwgYW5kIGludGVybWVkaWF0ZSByZXN1bHRzIG9mIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBhcmUga2VwdCBpbgotICAgZXhwX3Qncy4gIE5vdGUgdGhhdCBhIHN5bWJvbCBpcyBub3QgYW4gc2IsIGJ1dCBhIHBvaW50ZXIgaW50byB0aGUgaW5wdXQKLSAgIGxpbmUuICBJdCBtdXN0IGJlIGNvcGVkIHNvbWV3aGVyZSBzYWZlIGJlZm9yZSB0aGUgbmV4dCBsaW5lIGlzIHJlYWQgaW4uICovCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCBsZW47Ci0gIH0KLXN5bWJvbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGludCB2YWx1ZTsJCQkvKiBjb25zdGFudCBwYXJ0ICovCi0gICAgc3ltYm9sIGFkZF9zeW1ib2w7CQkvKiBuYW1lIHBhcnQgKi8KLSAgICBzeW1ib2wgc3ViX3N5bWJvbDsJCS8qIG5hbWUgcGFydCAqLwotICB9Ci1leHBfdDsKLQotCi0vKiBIYXNoaW5nIGlzIGRvbmUgaW4gYSBwcmV0dHkgc3RhbmRhcmQgd2F5LiAgQSBoYXNoX3RhYmxlIGhhcyBhCi0gICBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvIGhhc2hfZW50cnlzLCBhbmQgdGhlIHNpemUgb2YgdGhlCi0gICB2ZWN0b3IuICBBIGhhc2hfZW50cnkgY29udGFpbnMgYSB1bmlvbiBvZiBhbGwgdGhlIGluZm8gd2UgbGlrZSB0bwotICAgc3RvcmUgaW4gaGFzaCB0YWJsZS4gIElmIHRoZXJlIGlzIGEgaGFzaCBjb2xsaXNpb24sIGhhc2hfZW50cmllcwotICAgd2l0aCB0aGUgc2FtZSBoYXNoIGFyZSBrZXB0IGluIGEgY2hhaW4uICovCi0KLS8qIFdoYXQgdGhlIGRhdGEgaW4gYSBoYXNoX2VudHJ5IG1lYW5zICovCi10eXBlZGVmIGVudW0KLSAgewotICAgIGhhc2hfaW50ZWdlciwJCS8qIG5hbWUtPmludGVnZXIgbWFwcGluZyAqLwotICAgIGhhc2hfc3RyaW5nLAkJLyogbmFtZS0+c3RyaW5nIG1hcHBpbmcgKi8KLSAgICBoYXNoX21hY3JvLAkJCS8qIG5hbWUgaXMgYSBtYWNybyAqLwotICAgIGhhc2hfZm9ybWFsCQkJLyogbmFtZSBpcyBhIGZvcm1hbCBhcmd1bWVudCAqLwotICB9IGhhc2hfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgaHMKLSAgewotICAgIHNiIGtleTsJCQkvKiBzeW1ib2wgbmFtZSAqLwotICAgIGhhc2hfdHlwZSB0eXBlOwkJLyogc3ltYm9sIG1lYW5pbmcgKi8KLSAgICB1bmlvbgotICAgICAgewotCXNiIHM7Ci0JaW50IGk7Ci0Jc3RydWN0IG1hY3JvX3N0cnVjdCAqbTsKLQlzdHJ1Y3QgZm9ybWFsX3N0cnVjdCAqZjsKLSAgICAgIH0gdmFsdWU7Ci0gICAgc3RydWN0IGhzICpuZXh0OwkJLyogbmV4dCBoYXNoX2VudHJ5IHdpdGggc2FtZSBoYXNoIGtleSAqLwotICB9IGhhc2hfZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBoYXNoX2VudHJ5ICoqdGFibGU7Ci0gICAgaW50IHNpemU7Ci0gIH0gaGFzaF90YWJsZTsKLQotCi0vKiBTdHJ1Y3R1cmVzIHVzZWQgdG8gc3RvcmUgbWFjcm9zLiAKLQotICAgRWFjaCBtYWNybyBrbm93cyBpdHMgbmFtZSBhbmQgaW5jbHVkZWQgdGV4dC4gIEl0IGdldHMgYnVpbHQgd2l0aCBhCi0gICBsaXN0IG9mIGZvcm1hbCBhcmd1bWVudHMsIGFuZCBhbHNvIGtlZXBzIGEgaGFzaCB0YWJsZSB3aGljaCBwb2ludHMKLSAgIGludG8gdGhlIGxpc3QgdG8gc3BlZWQgdXAgZm9ybWFsIHNlYXJjaC4gIEVhY2ggZm9ybWFsIGtub3dzIGl0cwotICAgbmFtZSBhbmQgaXRzIGRlZmF1bHQgdmFsdWUuICBFYWNoIHRpbWUgdGhlIG1hY3JvIGlzIGV4cGFuZGVkLCB0aGUKLSAgIGZvcm1hbHMgZ2V0IHRoZSBhY3R1YWwgdmFsdWVzIGF0dGF0Y2hlZCB0byB0aGVtLiAqLwotCi0vKiBkZXNjcmliZSB0aGUgZm9ybWFsIGFyZ3VtZW50cyB0byBhIG1hY3JvICovCi0KLXR5cGVkZWYgc3RydWN0IGZvcm1hbF9zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBmb3JtYWxfc3RydWN0ICpuZXh0OwkvKiBuZXh0IGZvcm1hbCBpbiBsaXN0ICovCi0gICAgc2IgbmFtZTsJCQkvKiBuYW1lIG9mIHRoZSBmb3JtYWwgKi8KLSAgICBzYiBkZWY7CQkJLyogdGhlIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBzYiBhY3R1YWw7CQkJLyogdGhlIGFjdHVhbCBhcmd1bWVudCAoY2hhbmdlZCBvbiBlYWNoIGV4cGFuc2lvbikgKi8KLSAgICBpbnQgaW5kZXg7CQkJLyogdGhlIGluZGV4IG9mIHRoZSBmb3JtYWwgMC4uZm9ybWFsX2NvdW50LTEgKi8KLSAgfQotZm9ybWFsX2VudHJ5OwotCi0vKiBkZXNjcmliZSB0aGUgbWFjcm8uICovCi0KLXR5cGVkZWYgc3RydWN0IG1hY3JvX3N0cnVjdAotICB7Ci0gICAgc2Igc3ViOwkJCS8qIHN1YnN0aXR1dGlvbiB0ZXh0LiAqLwotICAgIGludCBmb3JtYWxfY291bnQ7CQkvKiBudW1iZXIgb2YgZm9ybWFsIGFyZ3MuICovCi0gICAgZm9ybWFsX2VudHJ5ICpmb3JtYWxzOwkvKiBwb2ludGVyIHRvIGxpc3Qgb2YgZm9ybWFsX3N0cnVjdHMgKi8KLSAgICBoYXNoX3RhYmxlIGZvcm1hbF9oYXNoOwkvKiBoYXNoIHRhYmxlIG9mIGZvcm1hbHMuICovCi0gIH0KLW1hY3JvX2VudHJ5OwotCi0vKiBob3cgd2UgbmVzdCBmaWxlcyBhbmQgZXhwYW5kIG1hY3JvcyBldGMuCi0KLSAgIHdlIGtlZXAgYSBzdGFjayBvZiBvZiBpbmNsdWRlX3N0YWNrIHN0cnVjdHMuICBlYWNoIGluY2x1ZGUgZmlsZQotICAgcHVzaGVzIGEgbmV3IGxldmVsIG9udG8gdGhlIHN0YWNrLiAgd2Uga2VlcCBhbiBzYiB3aXRoIGEgcHVzaGJhY2sKLSAgIHRvby4gIHVuZ2V0IGNoYXJzIGFyZSBwdXNoZWQgb250byB0aGUgcHVzaGJhY2sgc2IsIGdldGNoYXJzIGZpcnN0Ci0gICBjaGVja3MgdGhlIHB1c2hiYWNrIHNiIGJlZm9yZSByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLQotICAgc21hbGwgdGhpbmdzIGFyZSBleHBhbmRlZCBieSBhZGRpbmcgdGhlIHRleHQgb2YgdGhlIGl0ZW0gb250byB0aGUKLSAgIHB1c2hiYWNrIHNiLiAgbGFyZ2VyIGl0ZW1zIGFyZSBncm93biBieSBwdXNoaW5nIGEgbmV3IGxldmVsIGFuZAotICAgYWxsb2NhdGluZyB0aGUgZW50aXJlIHB1c2hiYWNrIGJ1ZiBmb3IgdGhlIGl0ZW0uICBlYWNoIHRpbWUKLSAgIHNvbWV0aGluZyBsaWtlIGEgbWFjcm8gaXMgZXhwYW5kZWQsIHRoZSBzdGFjayBpbmRleCBpcyBjaGFuZ2VkLiB3ZQotICAgY2FuIHRoZW4gcGVyZm9ybSBhbiBleGl0bSBieSBwb3BwaW5nIGFsbCBlbnRyaWVzIG9mZiB0aGUgc3RhY2sgd2l0aAotICAgdGhlIHNhbWUgc3RhY2sgaW5kZXguICBpZiB3ZSdyZSBiZWluZyByZWFzb25hYmxlLCB3ZSBjYW4gZGV0ZWN0Ci0gICByZWN1c2l2ZSBleHBhbnNpb24gYnkgY2hlY2tpbmcgdGhlIGluZGV4IGlzIHJlYXNvbmFibHkgc21hbGwuCi0gKi8KLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBpbmNsdWRlX2ZpbGUsIGluY2x1ZGVfcmVwZWF0LCBpbmNsdWRlX3doaWxlLCBpbmNsdWRlX21hY3JvCi0gIH0gaW5jbHVkZV90eXBlOwotCi1zdHJ1Y3QgaW5jbHVkZV9zdGFjawotICB7Ci0gICAgc2IgcHVzaGJhY2s7CQkvKiBjdXJyZW50IHB1c2hiYWNrIHN0cmVhbSAqLwotICAgIGludCBwdXNoYmFja19pbmRleDsJCS8qIG5leHQgY2hhciB0byByZWFkIGZyb20gc3RyZWFtICovCi0gICAgRklMRSAqaGFuZGxlOwkJLyogb3BlbiBmaWxlICovCi0gICAgc2IgbmFtZTsJCQkvKiBuYW1lIG9mIGZpbGUgKi8KLSAgICBpbnQgbGluZWNvdW50OwkJLyogbnVtYmVyIG9mIGxpbmVzIHJlYWQgc28gZmFyICovCi0gICAgaW5jbHVkZV90eXBlIHR5cGU7Ci0gICAgaW50IGluZGV4OwkJCS8qIGluZGV4IG9mIHRoaXMgbGF5ZXIgKi8KLSAgfQotaW5jbHVkZV9zdGFja1tNQVhfSU5DTFVERVNdOwotCi1zdHJ1Y3QgaW5jbHVkZV9zdGFjayAqc3A7Ci0jZGVmaW5lIGlzcCAoc3AgLSBpbmNsdWRlX3N0YWNrKQotCi0vKiBJbmNsdWRlIGZpbGUgbGlzdCAqLwotCi10eXBlZGVmIHN0cnVjdCBpbmNsdWRlX3BhdGggCi17Ci0gIHN0cnVjdCBpbmNsdWRlX3BhdGggKm5leHQ7Ci0gIHNiIHBhdGg7Ci19ICBpbmNsdWRlX3BhdGg7Ci0KLWluY2x1ZGVfcGF0aCAqcGF0aHNfaGVhZDsKLWluY2x1ZGVfcGF0aCAqcGF0aHNfdGFpbDsKLQotCi1zdGF0aWMgdm9pZCBxdWl0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGhhc2hfbmV3X3RhYmxlIFBBUkFNUyAoKGludCwgaGFzaF90YWJsZSAqKSk7Ci1zdGF0aWMgaW50IGhhc2ggUEFSQU1TICgoc2IgKikpOwotc3RhdGljIGhhc2hfZW50cnkgKmhhc2hfY3JlYXRlIFBBUkFNUyAoKGhhc2hfdGFibGUgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlIFBBUkFNUyAoKGhhc2hfdGFibGUgKiwgc2IgKiwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBoYXNoX2FkZF90b19pbnRfdGFibGUgUEFSQU1TICgoaGFzaF90YWJsZSAqLCBzYiAqLCBpbnQpKTsKLXN0YXRpYyBoYXNoX2VudHJ5ICpoYXNoX2xvb2t1cCBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGNoZWNrY29uc3QgUEFSQU1TICgoaW50LCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IHNiX3N0cnRvbCBQQVJBTVMgKChpbnQsIHNiICosIGludCwgaW50ICopKTsKLXN0YXRpYyBpbnQgbGV2ZWxfMCBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyBpbnQgbGV2ZWxfMSBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyBpbnQgbGV2ZWxfMiBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyBpbnQgbGV2ZWxfMyBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyBpbnQgbGV2ZWxfNCBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyBpbnQgbGV2ZWxfNSBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyBpbnQgZXhwX3BhcnNlIFBBUkFNUyAoKGludCwgc2IgKiwgZXhwX3QgKikpOwotc3RhdGljIHZvaWQgZXhwX3N0cmluZyBQQVJBTVMgKChleHBfdCAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGV4cF9nZXRfYWJzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotI2lmIDAKLXN0YXRpYyB2b2lkIHN0cmlwX2NvbW1lbnRzIFBBUkFNUyAoKHNiICopKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgdW5nZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpbmNsdWRlX2J1ZiBQQVJBTVMgKChzYiAqLCBzYiAqLCBpbmNsdWRlX3R5cGUsIGludCkpOwotc3RhdGljIHZvaWQgaW5jbHVkZV9wcmludF93aGVyZV9saW5lIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgaW5jbHVkZV9wcmludF9saW5lIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCBnZXRfbGluZSBQQVJBTVMgKChzYiAqKSk7Ci1zdGF0aWMgaW50IGdyYWJfbGFiZWwgUEFSQU1TICgoc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgY2hhbmdlX2Jhc2UgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19lbmQgUEFSQU1TICgoc2IgKikpOwotc3RhdGljIHZvaWQgZG9fYXNzaWduIFBBUkFNUyAoKGludCwgaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19yYWRpeCBQQVJBTVMgKChzYiAqKSk7Ci1zdGF0aWMgaW50IGdldF9vcHNpemUgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQgKikpOwotc3RhdGljIGludCBlb2wgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19kYXRhIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19kYXRhYiBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2FsaWduIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fcmVzIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19leHBvcnQgUEFSQU1TICgoc2IgKikpOwotc3RhdGljIHZvaWQgZG9fcHJpbnQgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19oZWFkaW5nIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fcGFnZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19mb3JtIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBnZXRfYW55X3N0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IHNraXBfb3BlbnAgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IHNraXBfY2xvc2VwIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBkb2xlbiBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyBpbnQgZG9pbnN0ciBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyBpbnQgZG9zdWJzdHIgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2Fzc2lnbnMgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldF9hbmRfcHJvY2VzcyBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX29sZF9lbnRyeSBQQVJBTVMgKChoYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIGRvX2Fzc2lnbmEgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hc3NpZ25jIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fcmVnIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBjb25kYXNzX2xvb2t1cF9uYW1lIFBBUkFNUyAoKHNiICosIGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgaW50IHdoYXRjb25kIFBBUkFNUyAoKGludCwgc2IgKiwgaW50ICopKTsKLXN0YXRpYyBpbnQgaXN0cnVlIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fYWlmIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fYWVsc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9fYWVuZGkgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBjb25kYXNzX29uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2lmIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGdldF9tcmlfc3RyaW5nIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19pZmMgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2FlbmRyIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2F3aGlsZSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2FlbmR3IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2V4aXRtIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2FyZXBlYXQgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19lbmRtIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2lycCBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fbG9jYWwgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19tYWNybyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgbWFjcm9fb3AgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldHN0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3NkYXRhIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19zZGF0YWIgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IG5ld19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9faW5jbHVkZSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGluY2x1ZGVfcG9wIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgbGluZWNvdW50IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgaW5jbHVkZV9uZXh0X2luZGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNoYXJ0eXBlX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBwcm9jZXNzX3BzZXVkb19vcCBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGFkZF9rZXl3b3JkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9fZGVmaW5lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgc2hvd19oZWxwIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBGQVRBTCh4KSBcCi0gIGRvIHsgaW5jbHVkZV9wcmludF93aGVyZV9saW5lIChzdGRlcnIpOyBmcHJpbnRmIHggOyBmYXRhbHMrKzsgcXVpdCgpOyB9IHdoaWxlKDApIAotI2RlZmluZSBFUlJPUih4KSBcCi0gIGRvIHsgaW5jbHVkZV9wcmludF93aGVyZV9saW5lIChzdGRlcnIpOyBmcHJpbnRmIHg7IGVycm9ycysrOyB9IHdoaWxlKDApCi0jZGVmaW5lIFdBUk5JTkcoeCkgXAotICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4OyB3YXJuaW5ncysrO30gd2hpbGUoMCkgCi0KLQotCi0vKiBleGl0IHRoZSBwcm9ncmFtIGFuZCByZXR1cm4gdGhlIHJpZ2h0IEVSUk9SIGNvZGUuICovCi1zdGF0aWMgdm9pZAotcXVpdCAoKQotewotICBpbnQgZXhpdGNvZGU7Ci0gIGlmIChmYXRhbHMgKyBlcnJvcnMpCi0gICAgZXhpdGNvZGUgPSAxOwotICBlbHNlCi0gICAgZXhpdGNvZGUgPSAwOwotCi0gIGlmIChzdGF0cykgCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2JfbWF4X3Bvd2VyX3R3bzsgaSsrKSAKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJzdHJpbmdzIHNpemUgJThkIDogJWRcbiIsIDE8PGksIHN0cmluZ19jb3VudFtpXSk7Ci0JfQotICAgIH0KLSAgZXhpdCAoZXhpdGNvZGUpOwotfQotCi0vKiBoYXNoIHRhYmxlIG1haW50ZW5hbmNlLiAqLwotCi0vKiBidWlsZCBhIG5ldyBoYXNoIHRhYmxlIHdpdGggc2l6ZSBidWNrZXRzLCBhbmQgZmlsbCBpbiB0aGUgaW5mbyBhdCBwdHIuICovCi0KLXN0YXRpYyB2b2lkCi1oYXNoX25ld190YWJsZSAoc2l6ZSwgcHRyKQotICAgICBpbnQgc2l6ZTsKLSAgICAgaGFzaF90YWJsZSAqcHRyOwotewotICBpbnQgaTsKLSAgcHRyLT5zaXplID0gc2l6ZTsKLSAgcHRyLT50YWJsZSA9IChoYXNoX2VudHJ5ICoqKSB4bWFsbG9jIChzaXplICogKHNpemVvZiAoaGFzaF9lbnRyeSAqKSkpOwotICAvKiBGaWxsIHdpdGggbnVsbC1wb2ludGVyLCBub3QgemVyby1iaXQtcGF0dGVybi4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgcHRyLT50YWJsZVtpXSA9IDA7Ci19Ci0KLS8qIGNhbGN1bGF0ZSBhbmQgcmV0dXJuIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBzYiBhdCBrZXkuICovCi0KLXN0YXRpYyBpbnQKLWhhc2ggKGtleSkKLSAgICAgc2IgKmtleTsKLXsKLSAgaW50IGsgPSAweDEyMzQ7Ci0gIGludCBpOwotICBjaGFyICpwID0ga2V5LT5wdHI7Ci0gIGZvciAoaSA9IDA7IGkgPCBrZXktPmxlbjsgaSsrKQotICAgIHsKLSAgICAgIGsgXj0gKGsgPDwgMikgXiAqcDsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHJldHVybiBrICYgMHhmMGZmZjsKLX0KLQotLyogbG9va3VwIGtleSBpbiBoYXNoX3RhYmxlIHRhYiwgaWYgcHJlc2VudCwgdGhlbiByZXR1cm4gaXQsIG90aGVyd2lzZQotICAgYnVpbGQgYSBuZXcgb25lIGFuZCBmaWxsIGl0IHdpdGggaGFzaF9pbnRlZ2VyLiAqLwotCi1zdGF0aWMKLWhhc2hfZW50cnkgKgotaGFzaF9jcmVhdGUgKHRhYiwga2V5KQotICAgICBoYXNoX3RhYmxlICp0YWI7Ci0gICAgIHNiICprZXk7Ci17Ci0gIGludCBrID0gaGFzaCAoa2V5KSAlIHRhYi0+c2l6ZTsKLSAgaGFzaF9lbnRyeSAqcDsKLSAgaGFzaF9lbnRyeSAqKnRhYmxlID0gdGFiLT50YWJsZTsKLQotICBwID0gdGFibGVba107Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKCFwKQotCXsKLQkgIGhhc2hfZW50cnkgKm4gPSAoaGFzaF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGhhc2hfZW50cnkpKTsKLQkgIG4tPm5leHQgPSB0YWJsZVtrXTsKLQkgIHNiX25ldyAoJm4tPmtleSk7Ci0JICBzYl9hZGRfc2IgKCZuLT5rZXksIGtleSk7Ci0JICB0YWJsZVtrXSA9IG47Ci0JICBuLT50eXBlID0gaGFzaF9pbnRlZ2VyOwotCSAgcmV0dXJuIG47Ci0JfQotICAgICAgaWYgKHN0cm5jbXAgKHRhYmxlW2tdLT5rZXkucHRyLCBrZXktPnB0ciwga2V5LT5sZW4pID09IDApCi0JewotCSAgcmV0dXJuIHA7Ci0JfQotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotfQotCi0vKiBhZGQgc2IgbmFtZSB3aXRoIGtleSBpbnRvIGhhc2hfdGFibGUgdGFiLiAgaWYgcmVwbGFjaW5nIG9sZCB2YWx1ZQotICAgYW5kIGFnYWluLCB0aGVuIEVSUk9SLiAqLwotCi1zdGF0aWMKLXZvaWQKLWhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSAodGFiLCBrZXksIG5hbWUsIGFnYWluKQotICAgICBoYXNoX3RhYmxlICp0YWI7Ci0gICAgIHNiICprZXk7Ci0gICAgIHNiICpuYW1lOwotICAgICBpbnQgYWdhaW47Ci17Ci0gIGhhc2hfZW50cnkgKnB0ciA9IGhhc2hfY3JlYXRlICh0YWIsIGtleSk7Ci0gIGlmIChwdHItPnR5cGUgPT0gaGFzaF9pbnRlZ2VyKQotICAgIHsKLSAgICAgIHNiX25ldyAoJnB0ci0+dmFsdWUucyk7Ci0gICAgfQotICBpZiAocHRyLT52YWx1ZS5zLmxlbikKLSAgICB7Ci0gICAgICBpZiAoIWFnYWluKQotCUVSUk9SICgoc3RkZXJyLCBfKCJyZWRlZmluaXRpb24gbm90IGFsbG93ZWRcbiIpKSk7Ci0gICAgfQotCi0gIHB0ci0+dHlwZSA9IGhhc2hfc3RyaW5nOwotICBzYl9yZXNldCAoJnB0ci0+dmFsdWUucyk7Ci0gIAotICBzYl9hZGRfc2IgKCZwdHItPnZhbHVlLnMsIG5hbWUpOwotfQotCi0vKiBhZGQgaW50ZWdlciBuYW1lIHRvIGhhc2hfdGFibGUgdGFiIHdpdGggc2Iga2V5LiAqLwotCi1zdGF0aWMKLXZvaWQKLWhhc2hfYWRkX3RvX2ludF90YWJsZSAodGFiLCBrZXksIG5hbWUpCi0gICAgIGhhc2hfdGFibGUgKnRhYjsKLSAgICAgc2IgKmtleTsKLSAgICAgaW50IG5hbWU7Ci17Ci0gIGhhc2hfZW50cnkgKnB0ciA9IGhhc2hfY3JlYXRlICh0YWIsIGtleSk7Ci0gIHB0ci0+dmFsdWUuaSA9IG5hbWU7Ci19Ci0KLS8qIGxvb2t1cCBzYiBrZXkgaW4gaGFzaF90YWJsZSB0YWIuICBpZiBmb3VuZCByZXR1cm4gaGFzaF9lbnRyeSByZXN1bHQsCi0gICBlbHNlIDAuICovCi0gICAKLXN0YXRpYwotaGFzaF9lbnRyeSAqCi1oYXNoX2xvb2t1cCAodGFiLCBrZXkpCi0gICAgIGhhc2hfdGFibGUgKnRhYjsKLSAgICAgc2IgKmtleTsKLXsKLSAgaW50IGsgPSBoYXNoIChrZXkpICUgdGFiLT5zaXplOwotICBoYXNoX2VudHJ5ICoqdGFibGUgPSB0YWItPnRhYmxlOwotICBoYXNoX2VudHJ5ICpwID0gdGFibGVba107Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIGlmIChwLT5rZXkubGVuID09IGtleS0+bGVuCi0JICAmJiBzdHJuY21wIChwLT5rZXkucHRyLCBrZXktPnB0ciwga2V5LT5sZW4pID09IDApCi0JcmV0dXJuIHA7Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIGV4cHJlc3Npb25zCi0KLSAgIGFyZSBoYW5kbGVkIGluIGEgcmVhbGx5IHNpbXBsZSByZWN1cnNpdmUgZGVjZW50IHdheS4gZWFjaCBiaXQgb2YKLSAgIHRoZSBtYWNoaW5lIHRha2VzIGFuIGluZGV4IGludG8gYW4gc2IgYW5kIGEgcG9pbnRlciB0byBhbiBleHBfdCwKLSAgIG1vZGlmaWVzIHRoZSAqZXhwX3QgYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgIHBhc3QgdGhlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gcGFyc2VkLgotCi0gZXhwcmVzc2lvbiBwcmVjZWRlbmNlOgotICAoICkKLSB1bmFyeSArIC0gfgotICAqIC8KLSAgKyAtCi0gICYKLSAgfCB+Ci0KLSovCi0KLQotLyogbWFrZSBzdXJlIHRoYXQgdGhlIGV4cF90IGF0IHRlcm0gaXMgY29uc3RhbnQsIGlmIG5vdCB0aGUgZ2l2ZSB0aGUgb3AgRVJST1IuICovCi0KLXN0YXRpYwotdm9pZAotY2hlY2tjb25zdCAob3AsIHRlcm0pCi0gICAgIGludCBvcDsKLSAgICAgZXhwX3QgKnRlcm07Ci17Ci0gIGlmICh0ZXJtLT5hZGRfc3ltYm9sLmxlbgotICAgICAgfHwgdGVybS0+c3ViX3N5bWJvbC5sZW4pCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oInRoZSAlYyBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLlxuIiksIG9wKSk7Ci0gICAgfQotfQotCi0vKiB0dXJuIHRoZSBudW1iZXIgaW4gc3RyaW5nIGF0IGlkeCBpbnRvIGEgbnVtYmVyIG9mIGJhc2UsCi0gICBmaWxsIGluIHB0ciBhbmQgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG5vdCBpbiB0aGUKLSAgIG51bWJlci4gKi8KLQotc3RhdGljCi1pbnQKLXNiX3N0cnRvbCAoaWR4LCBzdHJpbmcsIGJhc2UsIHB0cikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnN0cmluZzsKLSAgICAgaW50IGJhc2U7Ci0gICAgIGludCAqcHRyOwotewotICBpbnQgdmFsdWUgPSAwOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci0KLSAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuKQotICAgIHsKLSAgICAgIGludCBjaCA9IHN0cmluZy0+cHRyW2lkeF07Ci0gICAgICBpbnQgZGlnID0gMDsKLSAgICAgIGlmIChpc2RpZ2l0IChjaCkpCi0JZGlnID0gY2ggLSAnMCc7Ci0gICAgICBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQotCWRpZyA9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQotCWRpZyA9IGNoIC0gJ0EnICsgMTA7Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0KLSAgICAgIGlmIChkaWcgPj0gYmFzZSkKLQlicmVhazsKLQotICAgICAgdmFsdWUgPSB2YWx1ZSAqIGJhc2UgKyBkaWc7Ci0gICAgICBpZHgrKzsKLSAgICB9Ci0gICpwdHIgPSB2YWx1ZTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIGludAotbGV2ZWxfMCAoaWR4LCBzdHJpbmcsIGxocykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnN0cmluZzsKLSAgICAgZXhwX3QgKmxoczsKLXsKLSAgbGhzLT5hZGRfc3ltYm9sLmxlbiA9IDA7Ci0gIGxocy0+YWRkX3N5bWJvbC5uYW1lID0gMDsKLQotICBsaHMtPnN1Yl9zeW1ib2wubGVuID0gMDsKLSAgbGhzLT5zdWJfc3ltYm9sLm5hbWUgPSAwOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLQotICBsaHMtPnZhbHVlID0gMDsKLQotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHN0cmluZy0+cHRyW2lkeF0pKQotICAgIHsKLSAgICAgIGlkeCA9IHNiX3N0cnRvbCAoaWR4LCBzdHJpbmcsIDEwLCAmbGhzLT52YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmIChJU0ZJUlNUQ0hBUiAoc3RyaW5nLT5wdHJbaWR4XSkpCi0gICAgewotICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICBsaHMtPmFkZF9zeW1ib2wubmFtZSA9IHN0cmluZy0+cHRyICsgaWR4OwotICAgICAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuICYmIElTTkVYVENIQVIgKHN0cmluZy0+cHRyW2lkeF0pKQotCXsKLQkgIGlkeCsrOwotCSAgbGVuKys7Ci0JfQotICAgICAgbGhzLT5hZGRfc3ltYm9sLmxlbiA9IGxlbjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmluZy0+cHRyW2lkeF0gPT0gJyInKQotICAgIHsKLSAgICAgIHNiIGFjYzsKLSAgICAgIHNiX25ldyAoJmFjYyk7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygic3RyaW5nIHdoZXJlIGV4cHJlc3Npb24gZXhwZWN0ZWQuXG4iKSkpOwotICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIHN0cmluZywgJmFjYyk7Ci0gICAgICBzYl9raWxsICgmYWNjKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiY2FuJ3QgZmluZCBwcmltYXJ5IGluIGV4cHJlc3Npb24uXG4iKSkpOwotICAgICAgaWR4Kys7Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi0KLQotc3RhdGljIGludAotbGV2ZWxfMSAoaWR4LCBzdHJpbmcsIGxocykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnN0cmluZzsKLSAgICAgZXhwX3QgKmxoczsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotCi0gIHN3aXRjaCAoc3RyaW5nLT5wdHJbaWR4XSkKLSAgICB7Ci0gICAgY2FzZSAnKyc6Ci0gICAgICBpZHggPSBsZXZlbF8xIChpZHggKyAxLCBzdHJpbmcsIGxocyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd+JzoKLSAgICAgIGlkeCA9IGxldmVsXzEgKGlkeCArIDEsIHN0cmluZywgbGhzKTsKLSAgICAgIGNoZWNrY29uc3QgKCd+JywgbGhzKTsKLSAgICAgIGxocy0+dmFsdWUgPSB+bGhzLT52YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJy0nOgotICAgICAgewotCXN5bWJvbCB0OwotCWlkeCA9IGxldmVsXzEgKGlkeCArIDEsIHN0cmluZywgbGhzKTsKLQlsaHMtPnZhbHVlID0gLWxocy0+dmFsdWU7Ci0JdCA9IGxocy0+YWRkX3N5bWJvbDsKLQlsaHMtPmFkZF9zeW1ib2wgPSBsaHMtPnN1Yl9zeW1ib2w7Ci0JbGhzLT5zdWJfc3ltYm9sID0gdDsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlICcoJzoKLSAgICAgIGlkeCsrOwotICAgICAgaWR4ID0gbGV2ZWxfNSAoc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpLCBzdHJpbmcsIGxocyk7Ci0gICAgICBpZiAoc3RyaW5nLT5wdHJbaWR4XSAhPSAnKScpCi0JRVJST1IgKChzdGRlcnIsIF8oIm1pc3BsYWNlZCBjbG9zaW5nIHBhcmVucy5cbiIpKSk7Ci0gICAgICBlbHNlCi0JaWR4Kys7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWR4ID0gbGV2ZWxfMCAoaWR4LCBzdHJpbmcsIGxocyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWxldmVsXzIgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGV4cF90IHJoczsKLQotICBpZHggPSBsZXZlbF8xIChpZHgsIHN0cmluZywgbGhzKTsKLQotICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4gJiYgKHN0cmluZy0+cHRyW2lkeF0gPT0gJyonCi0JCQkgICAgICAgfHwgc3RyaW5nLT5wdHJbaWR4XSA9PSAnLycpKQotICAgIHsKLSAgICAgIGNoYXIgb3AgPSBzdHJpbmctPnB0cltpZHgrK107Ci0gICAgICBpZHggPSBsZXZlbF8xIChpZHgsIHN0cmluZywgJnJocyk7Ci0gICAgICBzd2l0Y2ggKG9wKQotCXsKLQljYXNlICcqJzoKLQkgIGNoZWNrY29uc3QgKCcqJywgbGhzKTsKLQkgIGNoZWNrY29uc3QgKCcqJywgJnJocyk7Ci0JICBsaHMtPnZhbHVlICo9IHJocy52YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJy8nOgotCSAgY2hlY2tjb25zdCAoJy8nLCBsaHMpOwotCSAgY2hlY2tjb25zdCAoJy8nLCAmcmhzKTsKLQkgIGlmIChyaHMudmFsdWUgPT0gMCkKLQkgICAgRVJST1IgKChzdGRlcnIsIF8oImF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8uXG4iKSkpOwotCSAgZWxzZQotCSAgICBsaHMtPnZhbHVlIC89IHJocy52YWx1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci19Ci0KLQotc3RhdGljIGludAotbGV2ZWxfMyAoaWR4LCBzdHJpbmcsIGxocykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnN0cmluZzsKLSAgICAgZXhwX3QgKmxoczsKLXsKLSAgZXhwX3QgcmhzOwotCi0gIGlkeCA9IGxldmVsXzIgKGlkeCwgc3RyaW5nLCBsaHMpOwotCi0gIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbgotCSAmJiAoc3RyaW5nLT5wdHJbaWR4XSA9PSAnKycKLQkgICAgIHx8IHN0cmluZy0+cHRyW2lkeF0gPT0gJy0nKSkKLSAgICB7Ci0gICAgICBjaGFyIG9wID0gc3RyaW5nLT5wdHJbaWR4KytdOwotICAgICAgaWR4ID0gbGV2ZWxfMiAoaWR4LCBzdHJpbmcsICZyaHMpOwotICAgICAgc3dpdGNoIChvcCkKLQl7Ci0JY2FzZSAnKyc6Ci0JICBsaHMtPnZhbHVlICs9IHJocy52YWx1ZTsKLQkgIGlmIChsaHMtPmFkZF9zeW1ib2wubmFtZSAmJiByaHMuYWRkX3N5bWJvbC5uYW1lKQotCSAgICB7Ci0JICAgICAgRVJST1IgKChzdGRlcnIsIF8oImNhbid0IGFkZCB0d28gcmVsb2NhdGFibGUgZXhwcmVzc2lvbnNcbiIpKSk7Ci0JICAgIH0KLQkgIC8qIGNoYW5nZSBubitzeW1ib2wgdG8gc3ltYm9sICsgbm4gKi8KLQkgIGlmIChyaHMuYWRkX3N5bWJvbC5uYW1lKQotCSAgICB7Ci0JICAgICAgbGhzLT5hZGRfc3ltYm9sID0gcmhzLmFkZF9zeW1ib2w7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJy0nOgotCSAgbGhzLT52YWx1ZSAtPSByaHMudmFsdWU7Ci0JICBsaHMtPnN1Yl9zeW1ib2wgPSByaHMuYWRkX3N5bWJvbDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWxldmVsXzQgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGV4cF90IHJoczsKLQotICBpZHggPSBsZXZlbF8zIChpZHgsIHN0cmluZywgbGhzKTsKLQotICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4gJiYKLQkgc3RyaW5nLT5wdHJbaWR4XSA9PSAnJicpCi0gICAgewotICAgICAgY2hhciBvcCA9IHN0cmluZy0+cHRyW2lkeCsrXTsKLSAgICAgIGlkeCA9IGxldmVsXzMgKGlkeCwgc3RyaW5nLCAmcmhzKTsKLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWNhc2UgJyYnOgotCSAgY2hlY2tjb25zdCAoJyYnLCBsaHMpOwotCSAgY2hlY2tjb25zdCAoJyYnLCAmcmhzKTsKLQkgIGxocy0+dmFsdWUgJj0gcmhzLnZhbHVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLX0KLQotc3RhdGljIGludAotbGV2ZWxfNSAoaWR4LCBzdHJpbmcsIGxocykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnN0cmluZzsKLSAgICAgZXhwX3QgKmxoczsKLXsKLSAgZXhwX3QgcmhzOwotCi0gIGlkeCA9IGxldmVsXzQgKGlkeCwgc3RyaW5nLCBsaHMpOwotCi0gIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbgotCSAmJiAoc3RyaW5nLT5wdHJbaWR4XSA9PSAnfCcgfHwgc3RyaW5nLT5wdHJbaWR4XSA9PSAnficpKQotICAgIHsKLSAgICAgIGNoYXIgb3AgPSBzdHJpbmctPnB0cltpZHgrK107Ci0gICAgICBpZHggPSBsZXZlbF80IChpZHgsIHN0cmluZywgJnJocyk7Ci0gICAgICBzd2l0Y2ggKG9wKQotCXsKLQljYXNlICd8JzoKLQkgIGNoZWNrY29uc3QgKCd8JywgbGhzKTsKLQkgIGNoZWNrY29uc3QgKCd8JywgJnJocyk7Ci0JICBsaHMtPnZhbHVlIHw9IHJocy52YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ34nOgotCSAgY2hlY2tjb25zdCAoJ34nLCBsaHMpOwotCSAgY2hlY2tjb25zdCAoJ34nLCAmcmhzKTsKLQkgIGxocy0+dmFsdWUgXj0gcmhzLnZhbHVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLX0KLQotCi0vKiBwYXJzZSB0aGUgZXhwcmVzc2lvbiBhdCBvZmZzZXQgaWR4IGludG8gc3RyaW5nLCBmaWxsIHVwIHJlcyB3aXRoCi0gICB0aGUgcmVzdWx0LiByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyIHBhc3QgdGhlIGV4cHJlc3Npb24uCi0gICAqLwotCi1zdGF0aWMgaW50Ci1leHBfcGFyc2UgKGlkeCwgc3RyaW5nLCByZXMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpyZXM7Ci17Ci0gIHJldHVybiBsZXZlbF81IChzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyksIHN0cmluZywgcmVzKTsKLX0KLQotCi0vKiB0dXJuIHRoZSBleHByZXNzaW9uIGF0IGV4cCBpbnRvIHRleHQgYW5kIGdsdWUgaXQgb250byB0aGUgZW5kIG9mCi0gICBzdHJpbmcuICovCi0KLXN0YXRpYyB2b2lkCi1leHBfc3RyaW5nIChleHAsIHN0cmluZykKLSAgICAgZXhwX3QgKmV4cDsKLSAgICAgc2IgKnN0cmluZzsKLXsKLSAgaW50IG5wID0gMDsKLSAgaW50IGFkID0gMDsKLSAgc2JfcmVzZXQgKHN0cmluZyk7Ci0KLSAgaWYgKGV4cC0+YWRkX3N5bWJvbC5sZW4pCi0gICAgewotICAgICAgc2JfYWRkX2J1ZmZlciAoc3RyaW5nLCBleHAtPmFkZF9zeW1ib2wubmFtZSwgZXhwLT5hZGRfc3ltYm9sLmxlbik7Ci0gICAgICBucCA9IDE7Ci0gICAgICBhZCA9IDE7Ci0gICAgfQotICBpZiAoZXhwLT52YWx1ZSkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlsyMF07Ci0gICAgICBpZiAobnApCi0Jc2JfYWRkX2NoYXIgKHN0cmluZywgJysnKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVkIiwgZXhwLT52YWx1ZSk7Ci0gICAgICBzYl9hZGRfc3RyaW5nIChzdHJpbmcsIGJ1Zik7Ci0gICAgICBucCA9IDE7Ci0gICAgICBhZCA9IDE7Ci0gICAgfQotICBpZiAoZXhwLT5zdWJfc3ltYm9sLmxlbikKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAoc3RyaW5nLCAnLScpOwotICAgICAgc2JfYWRkX2J1ZmZlciAoc3RyaW5nLCBleHAtPmFkZF9zeW1ib2wubmFtZSwgZXhwLT5hZGRfc3ltYm9sLmxlbik7Ci0gICAgICBucCA9IDA7Ci0gICAgICBhZCA9IDE7Ci0gICAgfQotCi0gIGlmICghYWQpCi0gICAgc2JfYWRkX2NoYXIgKHN0cmluZywgJzAnKTsKLX0KLQotCi0vKiBwYXJzZSB0aGUgZXhwcmVzc2lvbiBhdCBvZmZzZXQgaWR4IGludG8gc2IgaW4sIHJldHVybiB0aGUgdmFsdWUgaW4gdmFsLiAgCi0gICBpZiB0aGUgZXhwcmVzc2lvbiBpcyBub3QgY29uc3RhbnQsIGdpdmUgRVJST1IgZW1zZy4gIHJldHVybnMgdGhlIGluZGV4Ci0gICBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHBhc3QgdGhlIGVuZCBvZiB0aGUgZXhwcmVzc2lvbi4gKi8KLQotc3RhdGljIGludAotZXhwX2dldF9hYnMgKGVtc2csIGlkeCwgaW4sIHZhbCkKLSAgICAgY29uc3QgY2hhciAqZW1zZzsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgKnZhbDsKLXsKLSAgZXhwX3QgcmVzOwotICBpZHggPSBleHBfcGFyc2UgKGlkeCwgaW4sICZyZXMpOwotICBpZiAocmVzLmFkZF9zeW1ib2wubGVuIHx8IHJlcy5zdWJfc3ltYm9sLmxlbikKLSAgICBFUlJPUiAoKHN0ZGVyciwgZW1zZykpOwotICAqdmFsID0gcmVzLnZhbHVlOwotICByZXR1cm4gaWR4OwotfQotCi0KLXNiIGxhYmVsOyAvKiBjdXJyZW50IGxhYmVsIHBhcnNlZCBmcm9tIGxpbmUgKi8KLWhhc2hfdGFibGUgYXNzaWduX2hhc2hfdGFibGU7ICAgLyogaGFzaCB0YWJsZSBmb3IgYWxsIGFzc2lnbmVkIHZhcmlhYmxlcyAqLwotaGFzaF90YWJsZSBrZXl3b3JkX2hhc2hfdGFibGU7ICAvKiBoYXNoIHRhYmxlIGZvciBrZXl3b3JkICovCi1oYXNoX3RhYmxlIHZhcnM7ICAvKiBoYXNoIHRhYmxlIGZvciAgZXEgdmFyaWFibGVzICovCi0KLSNkZWZpbmUgaW5fY29tbWVudCAnOycKLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1zdHJpcF9jb21tZW50cyAob3V0KQotICAgICBzYiAqb3V0OwotewotICBjaGFyICpzID0gb3V0LT5wdHI7Ci0gIGludCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG91dC0+bGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKElTQ09NTUVOVENIQVIoc1tpXSkpCi0JewotCSAgb3V0LT5sZW4gPSBpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQotLyogcHVzaCBiYWNrIGNoYXJhY3RlciBjaCBzbyB0aGF0IGl0IGNhbiBiZSByZWFkIGFnYWluLiAqLwotCi1zdGF0aWMgdm9pZAotdW5nZXQgKGNoKQotICAgICBpbnQgY2g7Ci17Ci0gIGlmIChjaCA9PSAnXG4nKQotICAgIHsKLSAgICAgIHNwLT5saW5lY291bnQtLTsKLSAgICB9Ci0gIGlmIChzcC0+cHVzaGJhY2tfaW5kZXgpCi0gICAgc3AtPnB1c2hiYWNrX2luZGV4LS07Ci0gIGVsc2UKLSAgICBzYl9hZGRfY2hhciAoJnNwLT5wdXNoYmFjaywgY2gpOwotfQotCi0vKiBwdXNoIHRoZSBzYiBwdHIgb250byB0aGUgaW5jbHVkZSBzdGFjaywgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdHlwZSBhbmQgaW5kZXguICovCi0KLXN0YXRpYwotdm9pZAotaW5jbHVkZV9idWYgKG5hbWUsIHB0ciwgdHlwZSwgaW5kZXgpCi0gICAgIHNiICpuYW1lOwotICAgICBzYiAqcHRyOwotICAgICBpbmNsdWRlX3R5cGUgdHlwZTsKLSAgICAgaW50IGluZGV4OwotewotICBzcCsrOwotICBpZiAoc3AgLSBpbmNsdWRlX3N0YWNrID49IE1BWF9JTkNMVURFUykKLSAgICBGQVRBTCAoKHN0ZGVyciwgXygidW5yZWFzb25hYmxlIG5lc3RpbmcuXG4iKSkpOwotICBzYl9uZXcgKCZzcC0+bmFtZSk7Ci0gIHNiX2FkZF9zYiAoJnNwLT5uYW1lLCBuYW1lKTsKLSAgc3AtPmhhbmRsZSA9IDA7Ci0gIHNwLT5saW5lY291bnQgPSAxOwotICBzcC0+cHVzaGJhY2tfaW5kZXggPSAwOwotICBzcC0+dHlwZSA9IHR5cGU7Ci0gIHNwLT5pbmRleCA9IGluZGV4OwotICBzYl9uZXcgKCZzcC0+cHVzaGJhY2spOwotICBzYl9hZGRfc2IgKCZzcC0+cHVzaGJhY2ssIHB0cik7Ci19Ci0KLQotLyogdXNlZCBpbiBFUlJPUiBtZXNzYWdlcywgcHJpbnQgaW5mbyBvbiB3aGVyZSB0aGUgaW5jbHVkZSBzdGFjayBpcyBvbnRvIGZpbGUuICovCi1zdGF0aWMgCi12b2lkCi1pbmNsdWRlX3ByaW50X3doZXJlX2xpbmUgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIHN0cnVjdCBpbmNsdWRlX3N0YWNrICpwID0gaW5jbHVkZV9zdGFjayArIDE7Ci0KLSAgd2hpbGUgKHAgPD0gc3ApCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzOiVkICIsIHNiX25hbWUgKCZwLT5uYW1lKSwgcC0+bGluZWNvdW50IC0gMSk7Ci0gICAgICBwKys7Ci0gICAgfQotfQotCi0vKiB1c2VkIGluIGxpc3RpbmdzLCBwcmludCB0aGUgbGluZSBudW1iZXIgb250byBmaWxlLiAqLwotc3RhdGljIHZvaWQKLWluY2x1ZGVfcHJpbnRfbGluZSAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaW50IG47Ci0gIHN0cnVjdCBpbmNsdWRlX3N0YWNrICpwID0gaW5jbHVkZV9zdGFjayArIDE7Ci0KLSAgbiA9IGZwcmludGYgKGZpbGUsICIlNGQiLCBwLT5saW5lY291bnQpOwotICBwKys7Ci0gIHdoaWxlIChwIDw9IHNwKQotICAgIHsKLSAgICAgIG4gKz0gZnByaW50ZiAoZmlsZSwgIi4lZCIsIHAtPmxpbmVjb3VudCk7Ci0gICAgICBwKys7Ci0gICAgfQotICB3aGlsZSAobiA8IDggKiAzKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgIik7Ci0gICAgICBuKys7Ci0gICAgfQotfQotCi0KLS8qIHJlYWQgYSBsaW5lIGZyb20gdGhlIHRvcCBvZiB0aGUgaW5jbHVkZSBzdGFjayBpbnRvIHNiIGluLiAqLwotCi1zdGF0aWMgaW50Ci1nZXRfbGluZSAoaW4pCi0gICAgIHNiICppbjsKLXsKLSAgaW50IG9ubGluZSA9IDA7Ci0gIGludCBtb3JlID0gMTsKLQotICBpZiAoY29weXNvdXJjZSkKLSAgICB7Ci0gICAgICBwdXRjIChjb21tZW50X2NoYXIsIG91dGZpbGUpOwotICAgICAgaWYgKHByaW50X2xpbmVfbnVtYmVyKQotCWluY2x1ZGVfcHJpbnRfbGluZSAob3V0ZmlsZSk7Ci0gICAgfQotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCBjaCA9IGdldCAoKTsKLQotICAgICAgd2hpbGUgKGNoID09ICdccicpCi0JY2ggPSBnZXQgKCk7Ci0KLSAgICAgIGlmIChjaCA9PSBFT0YpCi0JewotCSAgaWYgKG9ubGluZSkKLQkgICAgewotCSAgICAgIFdBUk5JTkcgKChzdGRlcnIsIF8oIkVuZCBvZiBmaWxlIG5vdCBhdCBzdGFydCBvZiBsaW5lLlxuIikpKTsKLQkgICAgICBpZiAoY29weXNvdXJjZSkKLQkJcHV0YyAoJ1xuJywgb3V0ZmlsZSk7Ci0JICAgICAgY2ggPSAnXG4nOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIG1vcmUgPSAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoY29weXNvdXJjZSkKLQl7Ci0JICBwdXRjIChjaCwgb3V0ZmlsZSk7Ci0JfQotCi0gICAgICBpZiAoY2ggPT0gJ1xuJykKLQl7Ci0JICBjaCA9IGdldCAoKTsKLQkgIG9ubGluZSA9IDA7Ci0JICBpZiAoY2ggPT0gJysnKQotCSAgICB7Ci0JICAgICAgLyogY29udGludWVkIGxpbmUgKi8KLQkgICAgICBpZiAoY29weXNvdXJjZSkKLQkJewotCQkgIHB1dGMgKGNvbW1lbnRfY2hhciwgb3V0ZmlsZSk7Ci0JCSAgcHV0YyAoJysnLCBvdXRmaWxlKTsKLQkJfQotCSAgICAgIGNoID0gZ2V0ICgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoY2ggIT0gRU9GKQotCQl1bmdldCAoY2gpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNiX2FkZF9jaGFyIChpbiwgY2gpOwotCX0KLSAgICAgIG9ubGluZSsrOwotICAgIH0KLQotICByZXR1cm4gbW9yZTsKLX0KLQotLyogZmluZCBhIGxhYmVsIGZyb20gc2IgaW4gYW5kIHB1dCBpdCBpbiBvdXQuICovCi0KLXN0YXRpYyBpbnQKLWdyYWJfbGFiZWwgKGluLCBvdXQpCi0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgaW50IGkgPSAwOwotICBzYl9yZXNldCAob3V0KTsKLSAgaWYgKElTRklSU1RDSEFSIChpbi0+cHRyW2ldKSB8fCBpbi0+cHRyW2ldID09ICdcXCcpCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpXSk7Ci0gICAgICBpKys7Ci0gICAgICB3aGlsZSAoKElTTkVYVENIQVIgKGluLT5wdHJbaV0pIAotCSAgICAgIHx8IGluLT5wdHJbaV0gPT0gJ1xcJwotCSAgICAgIHx8IGluLT5wdHJbaV0gPT0gJyYnKSAKLQkgICAgICYmIGkgPCBpbi0+bGVuKQotCXsKLQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaV0pOwotCSAgaSsrOwotCX0KLSAgICB9Ci0gIHJldHVybiBpOwotfQotCi0vKiBmaW5kIGFsbCBzdHJhbmdlIGJhc2Ugc3R1ZmYgYW5kIHR1cm4gaW50byBkZWNpbWFsLiBhbHNvCi0gICBmaW5kIGFsbCB0aGUgb3RoZXIgbnVtYmVycyBhbmQgY29udmVydCB0aGVtIGZyb20gdGhlIGRlZmF1bHQgcmFkaXggKi8KLQotc3RhdGljIHZvaWQKLWNoYW5nZV9iYXNlIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgY2hhciBidWZmZXJbMjBdOwotCi0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJ1xcJwotCSAgJiYgaWR4ICsgMSA8IGluLT5sZW4KLQkgICYmIGluLT5wdHJbaWR4ICsgMV0gPT0gJygnKQotCXsKLQkgIGlkeCArPSAyOwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkJICYmIGluLT5wdHJbaWR4XSAhPSAnKScpCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgICAgIGlkeCsrOwotCSAgICB9Ci0JICBpZiAoaWR4IDwgaW4tPmxlbikKLQkgICAgaWR4Kys7Ci0JfQotICAgICAgZWxzZSBpZiAoaWR4IDwgaW4tPmxlbiAtIDEgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnXCcnICYmICEgbXJpKQotCXsKLQkgIGludCBiYXNlOwotCSAgaW50IHZhbHVlOwotCSAgc3dpdGNoIChpbi0+cHRyW2lkeF0pCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIGJhc2UgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdxJzoKLQkgICAgY2FzZSAnUSc6Ci0JICAgICAgYmFzZSA9IDg7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2gnOgotCSAgICBjYXNlICdIJzoKLQkgICAgICBiYXNlID0gMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICBjYXNlICdEJzoKLQkgICAgICBiYXNlID0gMTA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgRVJST1IgKChzdGRlcnIsIF8oIklsbGVnYWwgYmFzZSBjaGFyYWN0ZXIgJWMuXG4iKSwgaW4tPnB0cltpZHhdKSk7Ci0JICAgICAgYmFzZSA9IDEwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlkeCA9IHNiX3N0cnRvbCAoaWR4ICsgMiwgaW4sIGJhc2UsICZ2YWx1ZSk7Ci0JICBzcHJpbnRmIChidWZmZXIsICIlZCIsIHZhbHVlKTsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0ZJUlNUQ0hBUiAoaW4tPnB0cltpZHhdKSkKLQl7Ci0JICAvKiBjb3B5IGVudGlyZSBuYW1lcyB0aHJvdWdoIHF1aWNrbHkgKi8KLQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4XSk7Ci0JICBpZHgrKzsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmIElTTkVYVENIQVIgKGluLT5wdHJbaWR4XSkpCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgICAgIGlkeCsrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4XSkpCi0JewotCSAgaW50IHZhbHVlOwotCSAgLyogYWxsIG51bWJlcnMgbXVzdCBzdGFydCB3aXRoIGEgZGlnaXQsIGxldCdzIGNoZXcgaXQgYW5kCi0JICAgICBzcGl0IG91dCBkZWNpbWFsICovCi0JICBpZHggPSBzYl9zdHJ0b2wgKGlkeCwgaW4sIHJhZGl4LCAmdmFsdWUpOwotCSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCB2YWx1ZSk7Ci0JICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1ZmZlcik7Ci0KLQkgIC8qIHNraXAgYWxsIHVuZGlnc2VzdGVkIGxldHRlcnMgKi8KLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmIElTTkVYVENIQVIgKGluLT5wdHJbaWR4XSkpCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgICAgIGlkeCsrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJyB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQl7Ci0JICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCSAgLyogY29weSBlbnRpcmUgbmFtZXMgdGhyb3VnaCBxdWlja2x5ICovCi0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgaWR4Kys7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gIT0gdGNoYXIpCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgICAgIGlkeCsrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG5vdGhpbmcgc3BlY2lhbCwganVzdCBwYXNzIGl0IHRocm91Z2ggKi8KLQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4XSk7Ci0JICBpZHgrKzsKLQl9Ci0gICAgfQotCi19Ci0KLS8qIC5lbmQgKi8KLXN0YXRpYyB2b2lkCi1kb19lbmQgKGluKQotICAgICBzYiAqaW47Ci17Ci0gIGhhZF9lbmQgPSAxOwotICBpZiAobXJpKQotICAgIGZwcmludGYgKG91dGZpbGUsICIlc1xuIiwgc2JfbmFtZSAoaW4pKTsKLX0KLQotLyogLmFzc2lnbiAqLwotCi1zdGF0aWMgdm9pZAotZG9fYXNzaWduIChhZ2FpbiwgaWR4LCBpbikKLSAgICAgaW50IGFnYWluOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIC8qIHN0aWNrIGxhYmVsIGluIHN5bWJvbCB0YWJsZSB3aXRoIGZvbGxvd2luZyB2YWx1ZSAqLwotICBleHBfdCBlOwotICBzYiBhY2M7Ci0KLSAgc2JfbmV3ICgmYWNjKTsKLSAgaWR4ID0gZXhwX3BhcnNlIChpZHgsIGluLCAmZSk7Ci0gIGV4cF9zdHJpbmcgKCZlLCAmYWNjKTsKLSAgaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlICgmYXNzaWduX2hhc2hfdGFibGUsICZsYWJlbCwgJmFjYywgYWdhaW4pOwotICBzYl9raWxsICgmYWNjKTsKLX0KLQotCi0vKiAucmFkaXggW2J8cXxkfGhdICovCi0KLXN0YXRpYwotdm9pZAotZG9fcmFkaXggKHB0cikKLSAgICAgc2IgKnB0cjsKLXsKLSAgaW50IGlkeCA9IHNiX3NraXBfd2hpdGUgKDAsIHB0cik7Ci0gIHN3aXRjaCAocHRyLT5wdHJbaWR4XSkKLSAgICB7Ci0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnYic6Ci0gICAgICByYWRpeCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdxJzoKLSAgICBjYXNlICdRJzoKLSAgICAgIHJhZGl4ID0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgICAgcmFkaXggPSAxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2gnOgotICAgIGNhc2UgJ0gnOgotICAgICAgcmFkaXggPSAxNjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygicmFkaXggaXMgJWMgbXVzdCBiZSBvbmUgb2YgYiwgcSwgZCBvciBoIiksIHJhZGl4KSk7Ci0gICAgfQotfQotCi0KLS8qIFBhcnNlIG9mZiBhIC5iLCAudyBvciAubCAqLwotCi1zdGF0aWMgaW50Ci1nZXRfb3BzaXplIChpZHgsIGluLCBzaXplKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCAqc2l6ZTsKLXsKLSAgKnNpemUgPSA0OwotICBpZiAoaW4tPnB0cltpZHhdID09ICcuJykKLSAgICB7Ci0gICAgICBpZHgrKzsKLSAgICB9Ci0gIHN3aXRjaCAoaW4tPnB0cltpZHhdKQotICAgIHsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdCJzoKLSAgICAgICpzaXplID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3cnOgotICAgIGNhc2UgJ1cnOgotICAgICAgKnNpemUgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbCc6Ci0gICAgY2FzZSAnTCc6Ci0gICAgICAqc2l6ZSA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcgJzoKLSAgICBjYXNlICdcdCc6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IgKChzdGRlcnIsIF8oInNpemUgbXVzdCBiZSBvbmUgb2YgYiwgdyBvciBsLCBpcyAlYy5cbiIpLCBpbi0+cHRyW2lkeF0pKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgaWR4Kys7Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIAotaW50IGVvbChpZHgsIGxpbmUpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpsaW5lOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGxpbmUpOwotICBpZiAoaWR4IDwgbGluZS0+bGVuIAotICAgICAgJiYgSVNDT01NRU5UQ0hBUihsaW5lLT5wdHJbaWR4XSkpCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChpZHggPj0gbGluZS0+bGVuKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotLyogLmRhdGEgWy5ifC53fC5sXSA8ZGF0YT4qIAotICAgIG9yIGRbYndsXSA8ZGF0YT4qICovCi0KLXN0YXRpYyB2b2lkCi1kb19kYXRhIChpZHgsIGluLCBzaXplKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCBzaXplOwotewotICBpbnQgb3BzaXplID0gNDsKLSAgY2hhciAqb3BuYW1lID0gIi55aWtlcyEiOwotICBzYiBhY2M7Ci0gIHNiX25ldyAoJmFjYyk7Ci0KLSAgaWYgKCFzaXplKSAKLSAgICB7Ci0gICAgICBpZHggPSBnZXRfb3BzaXplIChpZHgsIGluLCAmb3BzaXplKTsKLSAgICB9Ci0gIGVsc2UgewotICAgIG9wc2l6ZSA9IHNpemU7Ci0gIH0KLSAgc3dpdGNoIChvcHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIG9wbmFtZSA9ICIubG9uZyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBvcG5hbWUgPSAiLnNob3J0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIG9wbmFtZSA9ICIuYnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLQotICBmcHJpbnRmIChvdXRmaWxlLCAiJXNcdCIsIG9wbmFtZSk7Ci0KLSAgaWR4ID0gICBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBpZiAoYWx0ZXJuYXRlIAotICAgICAgJiYgaWR4IDwgaW4tPmxlbiAKLSAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnIicpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2MpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGFjYy5sZW47IGkrKykKLQl7Ci0JICBpZiAoaSkKLQkgICAgZnByaW50ZihvdXRmaWxlLCIsIik7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiJWQiLCBhY2MucHRyW2ldKTsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHdoaWxlICghZW9sIChpZHgsIGluKSkKLQl7Ci0JICBleHBfdCBlOwotCSAgaWR4ID0gZXhwX3BhcnNlIChpZHgsIGluLCAmZSk7Ci0JICBleHBfc3RyaW5nICgmZSwgJmFjYyk7Ci0JICBzYl9hZGRfY2hhciAoJmFjYywgMCk7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCBhY2MucHRyKTsKLQkgIGlmIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChvdXRmaWxlLCAiLCIpOwotCSAgICAgIGlkeCsrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgc2Jfa2lsbCAoJmFjYyk7Ci0gIHNiX3ByaW50X2F0IChvdXRmaWxlLCBpZHgsIGluKTsKLSAgZnByaW50ZiAob3V0ZmlsZSwgIlxuIik7Ci19Ci0KLS8qIC5kYXRhYiBbLmJ8Lnd8LmxdIDxyZXBlYXQ+LDxmaWxsPiAqLwotCi1zdGF0aWMgdm9pZAotZG9fZGF0YWIgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IG9wc2l6ZTsKLSAgaW50IHJlcGVhdDsKLSAgaW50IGZpbGw7Ci0KLSAgaWR4ID0gZ2V0X29wc2l6ZSAoaWR4LCBpbiwgJm9wc2l6ZSk7Ci0KLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oImRhdGFiIHJlcGVhdCBtdXN0IGJlIGNvbnN0YW50LlxuIiksIGlkeCwgaW4sICZyZXBlYXQpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oImRhdGFiIGRhdGEgbXVzdCBiZSBhYnNvbHV0ZS5cbiIpLCBpZHgsIGluLCAmZmlsbCk7Ci0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIi5maWxsXHQlZCwlZCwlZFxuIiwgcmVwZWF0LCBvcHNpemUsIGZpbGwpOwotfQotCi0vKiAuYWxpZ24gPHNpemU+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19hbGlnbiAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgYWwsIGhhdmVfZmlsbCwgZmlsbDsKLQotICBpZHggPSBleHBfZ2V0X2FicyAoXygiYWxpZ24gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbi5cbiIpLCBpZHgsIGluLCAmYWwpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgaGF2ZV9maWxsID0gMDsKLSAgZmlsbCA9IDA7Ci0gIGlmICghIGVvbCAoaWR4LCBpbikpCi0gICAgewotICAgICAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gICAgICBpZHggPSBleHBfZ2V0X2FicyAoXygiLmFsaWduIG5lZWRzIGFic29sdXRlIGZpbGwgdmFsdWUuXG4iKSwgaWR4LCBpbiwKLQkJCSAmZmlsbCk7Ci0gICAgICBoYXZlX2ZpbGwgPSAxOwotICAgIH0KLQotICBpZiAoYWwgIT0gMQotICAgICAgJiYgYWwgIT0gMgotICAgICAgJiYgYWwgIT0gNCkKLSAgICBXQVJOSU5HICgoc3RkZXJyLCBfKCJhbGlnbm1lbnQgbXVzdCBiZSBvbmUgb2YgMSwgMiBvciA0LlxuIikpKTsKLQotICBmcHJpbnRmIChvdXRmaWxlLCAiLmFsaWduCSVkIiwgYWwpOwotICBpZiAoaGF2ZV9maWxsKQotICAgIGZwcmludGYgKG91dGZpbGUsICIsJWQiLCBmaWxsKTsKLSAgZnByaW50ZiAob3V0ZmlsZSwgIlxuIik7Ci19Ci0KLS8qIC5yZXNbLmJ8Lnd8LmxdIDxzaXplPiAqLwotCi1zdGF0aWMgdm9pZAotZG9fcmVzIChpZHgsIGluLCB0eXBlKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCB0eXBlOwotewotICBpbnQgc2l6ZSA9IDQ7Ci0gIGludCBjb3VudCA9IDA7Ci0KLSAgaWR4ID0gZ2V0X29wc2l6ZSAoaWR4LCBpbiwgJnNpemUpOwotICB3aGlsZSAoIWVvbChpZHgsIGluKSkKLSAgICB7Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJywnKQotCWlkeCsrOwotICAgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oInJlcyBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIGZvciBmaWxsIGNvdW50LlxuIiksIGlkeCwgaW4sICZjb3VudCk7Ci0KLSAgICAgIGlmICh0eXBlID09ICdjJyB8fCB0eXBlID09ICd6JykKLQljb3VudCsrOwotCi0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiLnNwYWNlCSVkXG4iLCBjb3VudCAqIHNpemUpOwotICAgIH0KLX0KLQotCi0vKiAuZXhwb3J0ICovCi0KLXN0YXRpYyB2b2lkCi1kb19leHBvcnQgKGluKQotICAgICBzYiAqaW47Ci17Ci0gIGZwcmludGYgKG91dGZpbGUsICIuZ2xvYmFsCSVzXG4iLCBzYl9uYW1lIChpbikpOwotfQotCi0vKiAucHJpbnQgW2xpc3RdIFtub2xpc3RdICovCi0KLXN0YXRpYyB2b2lkCi1kb19wcmludCAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0gICAgewotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbi0+cHRyICsgaWR4LCAiTElTVCIsIDQpID09IDApCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIi5saXN0XG4iKTsKLQkgIGlkeCArPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbi0+cHRyICsgaWR4LCAiTk9MSVNUIiwgNikgPT0gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiLm5vbGlzdFxuIik7Ci0JICBpZHggKz0gNjsKLQl9Ci0gICAgICBpZHgrKzsKLSAgICB9Ci19Ci0KLS8qIC5oZWFkICovCi1zdGF0aWMgdm9pZAotZG9faGVhZGluZyAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBzYiBoZWFkOwotICBzYl9uZXcgKCZoZWFkKTsKLSAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmaGVhZCk7Ci0gIGZwcmludGYgKG91dGZpbGUsICIudGl0bGUJXCIlc1wiXG4iLCBzYl9uYW1lICgmaGVhZCkpOwotICBzYl9raWxsICgmaGVhZCk7Ci19Ci0KLS8qIC5wYWdlICovCi0KLXN0YXRpYyB2b2lkCi1kb19wYWdlICgpCi17Ci0gIGZwcmludGYgKG91dGZpbGUsICIuZWplY3RcbiIpOwotfQotCi0vKiAuZm9ybSBbbGluPTx2YWx1ZT5dIFtjb2w9PHZhbHVlPl0gKi8KLXN0YXRpYyB2b2lkCi1kb19mb3JtIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBsaW5lcyA9IDYwOwotICBpbnQgY29sdW1ucyA9IDEzMjsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0gICAgewotCi0gICAgICBpZiAoc3RybmNhc2VjbXAgKGluLT5wdHIgKyBpZHgsICJMSU49IiwgNCkgPT0gMCkKLQl7Ci0JICBpZHggKz0gNDsKLQkgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJmb3JtIExJTj0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iKSwgaWR4LCBpbiwgJmxpbmVzKTsKLQl9Ci0KLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgXygiQ09MPSIpLCA0KSA9PSAwKQotCXsKLQkgIGlkeCArPSA0OwotCSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oImZvcm0gQ09MPSBuZWVkcyBhYnNvbHV0ZSBleHByZXNzc2lvbi5cbiIpLCBpZHgsIGluLCAmY29sdW1ucyk7Ci0JfQotCi0gICAgICBpZHgrKzsKLSAgICB9Ci0gIGZwcmludGYgKG91dGZpbGUsICIucHNpemUgJWQsJWRcbiIsIGxpbmVzLCBjb2x1bW5zKTsKLQotfQotCi0KLS8qIEZldGNoIHN0cmluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sCi0gICBydWxlczoKLSAgICAnQnh5eDx3aGl0ZXNwYWNlPiAgCS0+IHJldHVybiAnQnh5emEKLSAgICAlPGNoYXI+CQktPiByZXR1cm4gc3RyaW5nIG9mIGRlY2ltYWwgdmFsdWUgb2YgeAotICAgICI8c3RyaW5nPiIJCS0+IHJldHVybiBzdHJpbmcKLSAgICB4eXg8d2hpdGVzcGFjZT4gICAgIC0+IHJldHVybiB4eXoKLSovCi1zdGF0aWMgaW50Ci1nZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgb3V0LCBleHBhbmQsIHByZXRlbmRfcXVvdGVkKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCBleHBhbmQ7Ci0gICAgIGludCBwcmV0ZW5kX3F1b3RlZDsKLXsKLSAgc2JfcmVzZXQgKG91dCk7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIGlmIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGlmIChpbi0+bGVuID4gMiAmJiBpbi0+cHRyW2lkeCsxXSA9PSAnXCcnICYmIElTQkFTRSAoaW4tPnB0cltpZHhdKSkKLQl7Ci0JICB3aGlsZSAoIUlTU0VQIChpbi0+cHRyW2lkeF0pKQotCSAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICclJwotCSAgICAgICAmJiBhbHRlcm5hdGUKLQkgICAgICAgJiYgZXhwYW5kKQotCXsKLQkgIGludCB2YWw7Ci0JICBjaGFyIGJ1ZlsyMF07Ci0JICAvKiBUdXJucyB0aGUgbmV4dCBleHByZXNzaW9uIGludG8gYSBzdHJpbmcgKi8KLQkgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCIlIG9wZXJhdG9yIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24iKSwKLQkJCSAgICAgaWR4ICsgMSwKLQkJCSAgICAgaW4sCi0JCQkgICAgICZ2YWwpOwotCSAgc3ByaW50ZihidWYsICIlZCIsIHZhbCk7Ci0JICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1Zik7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJwotCSAgICAgICB8fCBpbi0+cHRyW2lkeF0gPT0gJzwnCi0JICAgICAgIHx8IChhbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdID09ICdcJycpKQotCXsKLQkgIGlmIChhbHRlcm5hdGUgJiYgZXhwYW5kKQotCSAgICB7Ci0JICAgICAgLyogS2VlcCB0aGUgcXVvdGVzICovCi0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOwotCQkgICAgCi0JICAgICAgaWR4ID0gIGdldHN0cmluZyAoaWR4LCBpbiwgb3V0KTsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAgJ1wiJyk7Ci0KLQkgICAgfQotCSAgZWxzZSB7Ci0JICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgb3V0KTsKLQkgIH0KLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuIAotCQkgJiYgKGluLT5wdHJbaWR4XSA9PSAnIicKLQkJICAgICB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJwotCQkgICAgIHx8IHByZXRlbmRfcXVvdGVkIAotCQkgICAgIHx8ICFJU1NFUCAoaW4tPnB0cltpZHhdKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICciJyAKLQkJICB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQkJewotCQkgIGNoYXIgdGNoYXIgPSBpbi0+cHRyW2lkeF07Ci0JCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCQkgIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JCQkgJiYgaW4tPnB0cltpZHhdICE9IHRjaGFyKQotCQkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwkJICAgIAotCQkgIGlmIChpZHggPT0gaW4tPmxlbikKLQkJICAgIHJldHVybiBpZHg7CSAgICAgIAotCQl9Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0KLS8qIHNraXAgYWxvbmcgc2IgaW4gc3RhcnRpbmcgYXQgaWR4LCBzdWNrIG9mZiB3aGl0ZXNwYWNlIGEgKCBhbmQgbW9yZQotICAgd2hpdGVzcGFjZS4gIHJldHVybiB0aGUgaWR4IG9mIHRoZSBuZXh0IGNoYXIgKi8KLQotc3RhdGljIGludAotc2tpcF9vcGVucCAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgaWYgKGluLT5wdHJbaWR4XSAhPSAnKCcpCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIm1pc3BsYWNlZCAoIC5cbiIpKSk7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCArIDEsIGluKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogc2tpcCBhbG9uZyBzYiBpbiBzdGFydGluZyBhdCBpZHgsIHN1Y2sgb2ZmIHdoaXRlc3BhY2UgYSApIGFuZCBtb3JlCi0gICB3aGl0ZXNwYWNlLiAgcmV0dXJuIHRoZSBpZHggb2YgdGhlIG5leHQgY2hhciAqLwotCi1zdGF0aWMgaW50Ci1za2lwX2Nsb3NlcCAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgaWYgKGluLT5wdHJbaWR4XSAhPSAnKScpCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIm1pc3BsYWNlZCApLlxuIikpKTsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4ICsgMSwgaW4pOwotICByZXR1cm4gaWR4OwotfQotCi0vKiAubGVuICovCi0KLXN0YXRpYyBpbnQKLWRvbGVuIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLQotICBzYiBzdHJpbmdvdXQ7Ci0gIGNoYXIgYnVmZmVyWzEwXTsKLQotICBzYl9uZXcgKCZzdHJpbmdvdXQpOwotICBpZHggPSBza2lwX29wZW5wIChpZHgsIGluKTsKLSAgaWR4ID0gZ2V0X2FuZF9wcm9jZXNzIChpZHgsIGluLCAmc3RyaW5nb3V0KTsKLSAgaWR4ID0gc2tpcF9jbG9zZXAgKGlkeCwgaW4pOwotICBzcHJpbnRmIChidWZmZXIsICIlZCIsIHN0cmluZ291dC5sZW4pOwotICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1ZmZlcik7Ci0KLSAgc2Jfa2lsbCAoJnN0cmluZ291dCk7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLQotLyogLmluc3RyICovCi0KLXN0YXRpYwotaW50Ci1kb2luc3RyIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgc2Igc3RyaW5nOwotICBzYiBzZWFyY2g7Ci0gIGludCBpOwotICBpbnQgc3RhcnQ7Ci0gIGludCByZXM7Ci0gIGNoYXIgYnVmZmVyWzEwXTsKLQotICBzYl9uZXcgKCZzdHJpbmcpOwotICBzYl9uZXcgKCZzZWFyY2gpOwotICBpZHggPSBza2lwX29wZW5wIChpZHgsIGluKTsKLSAgaWR4ID0gZ2V0X2FuZF9wcm9jZXNzIChpZHgsIGluLCAmc3RyaW5nKTsKLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnNlYXJjaCk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4XSkpCi0gICAgewotICAgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIi5pbnN0ciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzb24uXG4iKSwgaWR4LCBpbiwgJnN0YXJ0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdGFydCA9IDA7Ci0gICAgfQotICBpZHggPSBza2lwX2Nsb3NlcCAoaWR4LCBpbik7Ci0gIHJlcyA9IC0xOwotICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0cmluZy5sZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAoc3RyaW5nLnB0ciArIGksIHNlYXJjaC5wdHIsIHNlYXJjaC5sZW4pID09IDApCi0JewotCSAgcmVzID0gaTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgcmVzKTsKLSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotICBzYl9raWxsICgmc3RyaW5nKTsKLSAgc2Jfa2lsbCAoJnNlYXJjaCk7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLQotc3RhdGljIGludAotZG9zdWJzdHIgKGlkeCwgaW4sIG91dCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotewotICBzYiBzdHJpbmc7Ci0gIGludCBwb3M7Ci0gIGludCBsZW47Ci0gIHNiX25ldyAoJnN0cmluZyk7Ci0KLSAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZyk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygibmVlZCBhYnNvbHV0ZSBwb3NpdGlvbi5cbiIpLCBpZHgsIGluLCAmcG9zKTsKLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJuZWVkIGFic29sdXRlIGxlbmd0aC5cbiIpLCBpZHgsIGluLCAmbGVuKTsKLSAgaWR4ID0gc2tpcF9jbG9zZXAgKGlkeCwgaW4pOwotCi0KLSAgaWYgKGxlbiA8IDAgfHwgcG9zIDwgMCB8fAotICAgICAgcG9zID4gc3RyaW5nLmxlbgotICAgICAgfHwgcG9zICsgbGVuID4gc3RyaW5nLmxlbikKLSAgICB7Ci0gICAgICBzYl9hZGRfc3RyaW5nIChvdXQsICIgIik7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICciJyk7Ci0gICAgICB3aGlsZSAobGVuID4gMCkKLQl7Ci0JICBzYl9hZGRfY2hhciAob3V0LCBzdHJpbmcucHRyW3BvcysrXSk7Ci0JICBsZW4tLTsKLQl9Ci0gICAgICBzYl9hZGRfY2hhciAob3V0LCAnIicpOwotICAgIH0KLSAgc2Jfa2lsbCgmc3RyaW5nKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogc2NhbiBsaW5lLCBjaGFuZ2UgdG9rZW5zIGluIHRoZSBoYXNoIHRhYmxlIHRvIHRoZWlyIHJlcGxhY2VtZW50cyAqLwotc3RhdGljIHZvaWQKLXByb2Nlc3NfYXNzaWducyAoaWR4LCBpbiwgYnVmKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpidWY7Ci17Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGhhc2hfZW50cnkgKnB0cjsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJ1xcJwotCSAgJiYgaWR4ICsgMSA8IGluLT5sZW4KLQkgICYmIGluLT5wdHJbaWR4ICsgMV0gPT0gJygnKQotCXsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAoYnVmLCBpbi0+cHRyW2lkeF0pOwotCSAgICAgIGlkeCsrOwotCSAgICB9Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeCAtIDFdICE9ICcpJyk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICYmIGlkeCArIDEgPCBpbi0+bGVuCi0JICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICcmJykKLQl7Ci0JICBpZHggPSBjb25kYXNzX2xvb2t1cF9uYW1lIChpbiwgaWR4ICsgMiwgYnVmLCAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJ1xcJwotCSAgICAgICAmJiBpZHggKyAxIDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICckJykKLQl7Ci0JICBpZHggPSBjb25kYXNzX2xvb2t1cF9uYW1lIChpbiwgaWR4ICsgMiwgYnVmLCAwKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpZHggKyAzIDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDFdKSA9PSAnTCcKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMl0pID09ICdFJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAzXSkgPT0gJ04nKQotCWlkeCA9IGRvbGVuIChpZHggKyA0LCBpbiwgYnVmKTsKLSAgICAgIGVsc2UgaWYgKGlkeCArIDYgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnLicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMV0pID09ICdJJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAyXSkgPT0gJ04nCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDNdKSA9PSAnUycKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNF0pID09ICdUJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyA1XSkgPT0gJ1InKQotCWlkeCA9IGRvaW5zdHIgKGlkeCArIDYsIGluLCBidWYpOwotICAgICAgZWxzZSBpZiAoaWR4ICsgNyA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltpZHhdID09ICcuJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAxXSkgPT0gJ1MnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDJdKSA9PSAnVScKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgM10pID09ICdCJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyA0XSkgPT0gJ1MnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDVdKSA9PSAnVCcKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNl0pID09ICdSJykKLQlpZHggPSBkb3N1YnN0ciAoaWR4ICsgNywgaW4sIGJ1Zik7Ci0gICAgICBlbHNlIGlmIChJU0ZJUlNUQ0hBUiAoaW4tPnB0cltpZHhdKSkKLQl7Ci0JICAvKiBtYXkgYmUgYSBzaW1wbGUgbmFtZSBzdWJzaXR1dGlvbiwgc2VlIGlmIHdlIGhhdmUgYSB3b3JkICovCi0JICBzYiBhY2M7Ci0JICBpbnQgY3VyID0gaWR4ICsgMTsKLQkgIHdoaWxlIChjdXIgPCBpbi0+bGVuCi0JCSAmJiAoSVNORVhUQ0hBUiAoaW4tPnB0cltjdXJdKSkpCi0JICAgIGN1cisrOwotCi0JICBzYl9uZXcgKCZhY2MpOwotCSAgc2JfYWRkX2J1ZmZlciAoJmFjYywgaW4tPnB0ciArIGlkeCwgY3VyIC0gaWR4KTsKLQkgIHB0ciA9IGhhc2hfbG9va3VwICgmYXNzaWduX2hhc2hfdGFibGUsICZhY2MpOwotCSAgaWYgKHB0cikKLQkgICAgewotCSAgICAgIC8qIEZvdW5kIGEgZGVmaW5pdGlvbiBmb3IgaXQgKi8KLQkgICAgICBzYl9hZGRfc2IgKGJ1ZiwgJnB0ci0+dmFsdWUucyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE5vIGRlZmluaXRpb24sIGp1c3QgY29weSB0aGUgd29yZCAqLwotCSAgICAgIHNiX2FkZF9zYiAoYnVmLCAmYWNjKTsKLQkgICAgfQotCSAgc2Jfa2lsbCAoJmFjYyk7Ci0JICBpZHggPSBjdXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNiX2FkZF9jaGFyIChidWYsIGluLT5wdHJbaWR4KytdKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sIG91dCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotewotICBzYiB0OwotICBzYl9uZXcgKCZ0KTsKLSAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sICZ0LCAxLCAwKTsKLSAgcHJvY2Vzc19hc3NpZ25zICgwLCAmdCwgb3V0KTsKLSAgc2Jfa2lsbCAoJnQpOwotICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMKLXZvaWQKLXByb2Nlc3NfZmlsZSAoKQotewotICBzYiBsaW5lOwotICBzYiB0MSwgdDI7Ci0gIHNiIGFjYzsKLSAgc2IgbGFiZWxfaW47Ci0gIGludCBtb3JlOwotCi0gIHNiX25ldyAoJmxpbmUpOwotICBzYl9uZXcgKCZ0MSk7Ci0gIHNiX25ldyAoJnQyKTsKLSAgc2JfbmV3KCZhY2MpOwotICBzYl9uZXcgKCZsYWJlbF9pbik7Ci0gIHNiX3Jlc2V0ICgmbGluZSk7Ci0gIG1vcmUgPSBnZXRfbGluZSAoJmxpbmUpOwotICB3aGlsZSAobW9yZSkKLSAgICB7Ci0gICAgICAvKiBGaW5kIGFueSBsYWJlbCBhbmQgcHNldWRvIG9wIHRoYXQgd2UncmUgaW50ZXN0ZWQgaW4gKi8KLSAgICAgIGludCBsOwotICAgICAgaWYgKGxpbmUubGVuID09IDApCi0JewotCSAgaWYgKGNvbmRhc3Nfb24gKCkpCi0JICAgIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1yaQotCSAgICAgICAmJiAobGluZS5wdHJbMF0gPT0gJyonCi0JCSAgIHx8IGxpbmUucHRyWzBdID09ICchJykpCi0JewotCSAgLyogTVJJIGxpbmUgY29tbWVudC4gICovCi0JICBmcHJpbnRmIChvdXRmaWxlLCBzYl9uYW1lICgmbGluZSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsID0gZ3JhYl9sYWJlbCAoJmxpbmUsICZsYWJlbF9pbik7Ci0JICBzYl9yZXNldCAoJmxhYmVsKTsJICAJICAKLQotCSAgaWYgKGxpbmUucHRyW2xdID09ICc6JykKLQkgICAgbCsrOwotCSAgd2hpbGUgKElTV0hJVEUgKGxpbmUucHRyW2xdKSAmJiBsIDwgbGluZS5sZW4pCi0JICAgIGwrKzsKLQotCSAgaWYgKGxhYmVsX2luLmxlbikKLQkgICAgewotCSAgICAgIGludCBkb19hc3NpZ25zOwotCi0JICAgICAgLyogTXVuZ2UgdGhlIGxhYmVsLCB1bmxlc3MgdGhpcyBpcyBFUVUgb3IgQVNTSUdOLiAgKi8KLQkgICAgICBkb19hc3NpZ25zID0gMTsKLQkgICAgICBpZiAobCA8IGxpbmUubGVuCi0JCSAgJiYgKGxpbmUucHRyW2xdID09ICcuJyB8fCBhbHRlcm5hdGUgfHwgbXJpKSkKLQkJewotCQkgIGludCBseCA9IGw7Ci0KLQkJICBpZiAobGluZS5wdHJbbHhdID09ICcuJykKLQkJICAgICsrbHg7Ci0JCSAgaWYgKGx4ICsgMyA8PSBsaW5lLmxlbgotCQkgICAgICAmJiBzdHJuY2FzZWNtcCAoIkVRVSIsIGxpbmUucHRyICsgbHgsIDMpID09IDAKLQkJICAgICAgJiYgKGx4ICsgMyA9PSBsaW5lLmxlbgotCQkJICB8fCAhIElTRklSU1RDSEFSIChsaW5lLnB0cltseCArIDNdKSkpCi0JCSAgICBkb19hc3NpZ25zID0gMDsKLQkJICBlbHNlIGlmIChseCArIDYgPD0gbGluZS5sZW4KLQkJCSAgICYmIHN0cm5jYXNlY21wICgiQVNTSUdOIiwgbGluZS5wdHIgKyBseCwgNikgPT0gMAotCQkJICAgJiYgKGx4ICsgNiA9PSBsaW5lLmxlbgotCQkJICAgICAgIHx8ICEgSVNGSVJTVENIQVIgKGxpbmUucHRyW2x4ICsgNl0pKSkKLQkJICAgIGRvX2Fzc2lnbnMgPSAwOwotCQl9Ci0KLQkgICAgICBpZiAoZG9fYXNzaWducykKLQkJcHJvY2Vzc19hc3NpZ25zICgwLCAmbGFiZWxfaW4sICZsYWJlbCk7Ci0JICAgICAgZWxzZQotCQlzYl9hZGRfc2IgKCZsYWJlbCwgJmxhYmVsX2luKTsKLQkgICAgfQotCi0JICBpZiAobCA8IGxpbmUubGVuKQotCSAgICB7Ci0JICAgICAgaWYgKHByb2Nlc3NfcHNldWRvX29wIChsLCAmbGluZSwgJmFjYykpCi0JCXsKLQotCi0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGNvbmRhc3Nfb24gKCkpCi0JCXsKLQkJICBpZiAobWFjcm9fb3AgKGwsICZsaW5lKSkKLQkJICAgIHsKLQotCi0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICB7Ci0JCQlpZiAobGFiZWwubGVuKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVzOlx0Iiwgc2JfbmFtZSAoJmxhYmVsKSk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgZnByaW50ZiAob3V0ZmlsZSwgIlx0Iik7Ci0JCQlzYl9yZXNldCgmdDEpOwotCQkJcHJvY2Vzc19hc3NpZ25zIChsLCAmbGluZSwgJnQxKTsKLQkJCXNiX3Jlc2V0ICgmdDIpOwotCQkJY2hhbmdlX2Jhc2UgKDAsICZ0MSwgJnQyKTsKLQkJCWZwcmludGYgKG91dGZpbGUsICIlc1xuIiwgc2JfbmFtZSAoJnQyKSk7Ci0JCSAgICAgIH0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlIHsKLQkgICAgLyogT25seSBhIGxhYmVsIG9uIHRoaXMgbGluZSAqLwotCSAgICBpZiAobGFiZWwubGVuICYmIGNvbmRhc3Nfb24oKSkKLQkgICAgICB7Ci0JCWZwcmludGYgKG91dGZpbGUsICIlczpcbiIsIHNiX25hbWUgKCZsYWJlbCkpOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0KLSAgICAgIGlmIChoYWRfZW5kKQotCWJyZWFrOwotICAgICAgc2JfcmVzZXQgKCZsaW5lKTsKLSAgICAgIG1vcmUgPSBnZXRfbGluZSAoJmxpbmUpOwotICAgIH0KLQotICBpZiAoIWhhZF9lbmQgJiYgIW1yaSkKLSAgICBXQVJOSU5HICgoc3RkZXJyLCBfKCJFTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLlxuIikpKTsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZAotZnJlZV9vbGRfZW50cnkgKHB0cikKLSAgICAgaGFzaF9lbnRyeSAqcHRyOwotewotICBpZiAocHRyKQotICAgIHsKLSAgICAgIGlmIChwdHItPnR5cGUgPT0gaGFzaF9zdHJpbmcpCi0Jc2Jfa2lsbCgmcHRyLT52YWx1ZS5zKTsKLSAgICB9Ci19Ci0KLS8qIG5hbWU6IC5BU1NJR05BIDx2YWx1ZT4gKi8KLQotc3RhdGljIHZvaWQKLWRvX2Fzc2lnbmEgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgc2IgdG1wOwotICBpbnQgdmFsOwotICBzYl9uZXcgKCZ0bXApOwotCi0gIHByb2Nlc3NfYXNzaWducyAoaWR4LCBpbiwgJnRtcCk7Ci0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCIuQVNTSUdOQSBuZWVkcyBjb25zdGFudCBleHByZXNzaW9uIGFyZ3VtZW50LlxuIiksIDAsICZ0bXAsICZ2YWwpOwotCi0gIGlmICghbGFiZWwubGVuKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCIuQVNTSUdOQSB3aXRob3V0IGxhYmVsLlxuIikpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAoJnZhcnMsICZsYWJlbCk7Ci0gICAgICBmcmVlX29sZF9lbnRyeSAocHRyKTsKLSAgICAgIHB0ci0+dHlwZSA9IGhhc2hfaW50ZWdlcjsKLSAgICAgIHB0ci0+dmFsdWUuaSA9IHZhbDsKLSAgICB9Ci0gIHNiX2tpbGwgKCZ0bXApOwotfQotCi0vKiBuYW1lOiAuQVNTSUdOQyA8c3RyaW5nPiAqLwotCi1zdGF0aWMgdm9pZAotZG9fYXNzaWduYyAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBzYiBhY2M7Ci0gIHNiX25ldyAoJmFjYyk7Ci0gIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmFjYyk7Ci0KLSAgaWYgKCFsYWJlbC5sZW4pCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oIi5BU1NJR05TIHdpdGhvdXQgbGFiZWwuXG4iKSkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhhc2hfZW50cnkgKnB0ciA9IGhhc2hfY3JlYXRlICgmdmFycywgJmxhYmVsKTsKLSAgICAgIGZyZWVfb2xkX2VudHJ5IChwdHIpOwotICAgICAgcHRyLT50eXBlID0gaGFzaF9zdHJpbmc7Ci0gICAgICBzYl9uZXcgKCZwdHItPnZhbHVlLnMpOwotICAgICAgc2JfYWRkX3NiICgmcHRyLT52YWx1ZS5zLCAmYWNjKTsKLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotfQotCi0KLS8qIG5hbWU6IC5SRUcgKHJlZykgKi8KLQotc3RhdGljIHZvaWQKLWRvX3JlZyAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICAvKiByZW1vdmUgcmVnIHN0dWZmIGZyb20gaW5zaWRlIHBhcmVucyAqLwotICBzYiB3aGF0OwotICBpZiAoIW1yaSkKLSAgICBpZHggPSBza2lwX29wZW5wIChpZHgsIGluKTsKLSAgZWxzZQotICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBzYl9uZXcgKCZ3aGF0KTsKLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkgJiYgKG1yaQotCSAgICAgPyAhIGVvbCAoaWR4LCBpbikKLQkgICAgIDogaW4tPnB0cltpZHhdICE9ICcpJykpCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKCZ3aGF0LCBpbi0+cHRyW2lkeF0pOwotICAgICAgaWR4Kys7Ci0gICAgfQotICBoYXNoX2FkZF90b19zdHJpbmdfdGFibGUgKCZhc3NpZ25faGFzaF90YWJsZSwgJmxhYmVsLCAmd2hhdCwgMSk7Ci0gIHNiX2tpbGwgKCZ3aGF0KTsKLX0KLQotCi1zdGF0aWMgaW50Ci1jb25kYXNzX2xvb2t1cF9uYW1lIChpbmJ1ZiwgaWR4LCBvdXQsIHdhcm4pCi0gICAgIHNiICppbmJ1ZjsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKm91dDsKLSAgICAgaW50IHdhcm47Ci17Ci0gIGhhc2hfZW50cnkgKnB0cjsKLSAgc2IgY29uZGFzc19hY2M7Ci0gIHNiX25ldyAoJmNvbmRhc3NfYWNjKTsKLQotICB3aGlsZSAoaWR4IDwgaW5idWYtPmxlbgotCSAmJiBJU05FWFRDSEFSIChpbmJ1Zi0+cHRyW2lkeF0pKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyICgmY29uZGFzc19hY2MsIGluYnVmLT5wdHJbaWR4KytdKTsKLSAgICB9Ci0KLSAgaWYgKGluYnVmLT5wdHJbaWR4XSA9PSAnXCcnKQotICAgIGlkeCsrOwotICBwdHIgPSBoYXNoX2xvb2t1cCAoJnZhcnMsICZjb25kYXNzX2FjYyk7Ci0KLQotICBpZiAoIXB0cikKLSAgICB7Ci0gICAgICBpZiAod2FybikgCi0JewotCSAgV0FSTklORyAoKHN0ZGVyciwgXygiQ2FuJ3QgZmluZCBwcmVwcm9jZXNzb3IgdmFyaWFibGUgJXMuXG4iKSwgc2JfbmFtZSAoJmNvbmRhc3NfYWNjKSkpOwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgc2JfYWRkX3N0cmluZyAob3V0LCAiMCIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocHRyLT50eXBlID09IGhhc2hfaW50ZWdlcikKLQl7Ci0JICBjaGFyIGJ1ZmZlclszMF07Ci0JICBzcHJpbnRmIChidWZmZXIsICIlZCIsIHB0ci0+dmFsdWUuaSk7Ci0JICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1ZmZlcik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNiX2FkZF9zYiAob3V0LCAmcHRyLT52YWx1ZS5zKTsKLQl9Ci0gICAgfQotICBzYl9raWxsICgmY29uZGFzc19hY2MpOwotICByZXR1cm4gaWR4OwotfQotCi0jZGVmaW5lIEVRIDEKLSNkZWZpbmUgTkUgMgotI2RlZmluZSBHRSAzCi0jZGVmaW5lIExUIDQKLSNkZWZpbmUgTEUgNQotI2RlZmluZSBHVCA2Ci0jZGVmaW5lIE5FVkVSIDcKLQotc3RhdGljIGludAotd2hhdGNvbmQgKGlkeCwgaW4sIHZhbCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgKnZhbDsKLXsKLSAgaW50IGNvbmQ7Ci0KLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGNvbmQgPSBORVZFUjsKLSAgaWYgKGlkeCArIDEgPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjaGFyIGEsIGI7Ci0KLSAgICAgIHAgPSBpbi0+cHRyICsgaWR4OwotICAgICAgYSA9IHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBwWzBdKTsKLSAgICAgIGIgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgcFsxXSk7Ci0gICAgICBpZiAoYSA9PSAnRScgJiYgYiA9PSAnUScpCi0JY29uZCA9IEVROwotICAgICAgZWxzZSBpZiAoYSA9PSAnTicgJiYgYiA9PSAnRScpCi0JY29uZCA9IE5FOwotICAgICAgZWxzZSBpZiAoYSA9PSAnTCcgJiYgYiA9PSAnVCcpCi0JY29uZCA9IExUOwotICAgICAgZWxzZSBpZiAoYSA9PSAnTCcgJiYgYiA9PSAnRScpCi0JY29uZCA9IExFOwotICAgICAgZWxzZSBpZiAoYSA9PSAnRycgJiYgYiA9PSAnVCcpCi0JY29uZCA9IEdUOwotICAgICAgZWxzZSBpZiAoYSA9PSAnRycgJiYgYiA9PSAnRScpCi0JY29uZCA9IEdFOwotICAgIH0KLSAgaWYgKGNvbmQgPT0gTkVWRVIpCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oIkNvbXBhcmlzb24gb3BlcmF0b3IgbXVzdCBiZSBvbmUgb2YgRVEsIE5FLCBMVCwgTEUsIEdUIG9yIEdFLlxuIikpKTsKLSAgICAgIGNvbmQgPSBORVZFUjsKLSAgICB9Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCArIDIsIGluKTsKLSAgKnZhbCA9IGNvbmQ7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbnQKLWlzdHJ1ZSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgcmVzOwotICBzYiBhY2NfYTsKLSAgc2IgY29uZDsKLSAgc2IgYWNjX2I7Ci0gIHNiX25ldyAoJmFjY19hKTsKLSAgc2JfbmV3ICgmY29uZCk7Ci0gIHNiX25ldyAoJmFjY19iKTsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicpCi0gICAgewotICAgICAgaW50IGNvbmQ7Ci0gICAgICBpbnQgc2FtZTsKLSAgICAgIC8qIFRoaXMgaXMgYSBzdHJpbmcgY29tcGFyaXNpb24gKi8KLSAgICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmFjY19hKTsKLSAgICAgIGlkeCA9IHdoYXRjb25kIChpZHgsIGluLCAmY29uZCk7Ci0gICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2NfYik7Ci0gICAgICBzYW1lID0gYWNjX2EubGVuID09IGFjY19iLmxlbiAmJiAoc3RybmNtcCAoYWNjX2EucHRyLCBhY2NfYi5wdHIsIGFjY19hLmxlbikgPT0gMCk7Ci0KLSAgICAgIGlmIChjb25kICE9IEVRICYmIGNvbmQgIT0gTkUpCi0JewotCSAgRVJST1IgKChzdGRlcnIsIF8oIkNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHN0cmluZ3MgbXVzdCBiZSBFUSBvciBORVxuIikpKTsKLQkgIHJlcyA9IDA7Ci0JfQotICAgICAgZWxzZQotCXJlcyA9IChjb25kICE9IEVRKSBeIHNhbWU7Ci0gICAgfQotICBlbHNlCi0gICAgLyogVGhpcyBpcyBhIG51bWVyaWMgZXhwcmVzc2lvbiAqLwotICAgIHsKLSAgICAgIGludCB2YWxhOwotICAgICAgaW50IHZhbGI7Ci0gICAgICBpbnQgY29uZDsKLSAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJDb25kaXRpb25hbCBvcGVyYXRvciBtdXN0IGhhdmUgYWJzb2x1dGUgb3BlcmFuZHMuXG4iKSwgaWR4LCBpbiwgJnZhbGEpOwotICAgICAgaWR4ID0gd2hhdGNvbmQgKGlkeCwgaW4sICZjb25kKTsKLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicpCi0JewotCSAgV0FSTklORyAoKHN0ZGVyciwgXygiU3RyaW5nIGNvbXBhcmVkIGFnYWluc3QgZXhwcmVzc2lvbi5cbiIpKSk7Ci0JICByZXMgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksIGlkeCwgaW4sICZ2YWxiKTsKLQkgIHN3aXRjaCAoY29uZCkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlcyA9IDQyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVROgotCSAgICAgIHJlcyA9IHZhbGEgPT0gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBORToKLQkgICAgICByZXMgPSB2YWxhICE9IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTFQ6Ci0JICAgICAgcmVzID0gdmFsYSA8IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTEU6Ci0JICAgICAgcmVzID0gdmFsYSA8PSB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEdUOgotCSAgICAgIHJlcyA9IHZhbGEgPiB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEdFOgotCSAgICAgIHJlcyA9IHZhbGEgPj0gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBORVZFUjoKLQkgICAgICByZXMgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBzYl9raWxsICgmYWNjX2EpOwotICBzYl9raWxsICgmY29uZCk7Ci0gIHNiX2tpbGwgKCZhY2NfYik7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIC5BSUYgKi8KLXN0YXRpYyB2b2lkCi1kb19haWYgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWYgKGlmaSA+PSBJRk5FU1RJTkcpCi0gICAgewotICAgICAgRkFUQUwgKChzdGRlcnIsIF8oIkFJRiBuZXN0aW5nIHVucmVhc29uYWJsZS5cbiIpKSk7Ci0gICAgfQotICBpZmkrKzsKLSAgaWZzdGFja1tpZmldLm9uID0gaWZzdGFja1tpZmktMV0ub24gPyBpc3RydWUgKGlkeCwgaW4pIDogMDsKLSAgaWZzdGFja1tpZmldLmhhZGVsc2UgPSAwOwotfQotCi0KLS8qIC5BRUxTRSAqLwotc3RhdGljIHZvaWQKLWRvX2FlbHNlICgpCi17Ci0gIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gIWlmc3RhY2tbaWZpXS5vbiA6IDA7Ci0gIGlmIChpZnN0YWNrW2lmaV0uaGFkZWxzZSkKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiTXVsdGlwbGUgQUVMU0VzIGluIEFJRi5cbiIpKSk7Ci0gICAgfQotICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDE7Ci19Ci0KLQotLyogLkFFTkRJICovCi1zdGF0aWMgdm9pZAotZG9fYWVuZGkgKCkKLXsKLSAgaWYgKGlmaSAhPSAwKQotICAgIHsKLSAgICAgIGlmaS0tOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJBRU5ESSB3aXRob3V0IEFJRi5cbiIpKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1jb25kYXNzX29uICgpCi17Ci0gIHJldHVybiBpZnN0YWNrW2lmaV0ub247Ci19Ci0KLS8qIE1SSSBJRkVRLCBJRk5FLCBJRkxULCBJRkxFLCBJRkdFLCBJRkdULiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX2lmIChpZHgsIGluLCBjb25kKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCBjb25kOwotewotICBpbnQgdmFsOwotICBpbnQgcmVzOwotCi0gIGlmIChpZmkgPj0gSUZORVNUSU5HKQotICAgIHsKLSAgICAgIEZBVEFMICgoc3RkZXJyLCBfKCJJRiBuZXN0aW5nIHVucmVhc29uYWJsZS5cbiIpKSk7Ci0gICAgfQotCi0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJDb25kaXRpb25hbCBvcGVyYXRvciBtdXN0IGhhdmUgYWJzb2x1dGUgb3BlcmFuZHMuXG4iKSwKLQkJICAgICBpZHgsIGluLCAmdmFsKTsKLSAgc3dpdGNoIChjb25kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRVE6IHJlcyA9IHZhbCA9PSAwOyBicmVhazsKLSAgICBjYXNlIE5FOiByZXMgPSB2YWwgIT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBMVDogcmVzID0gdmFsIDwgIDA7IGJyZWFrOwotICAgIGNhc2UgTEU6IHJlcyA9IHZhbCA8PSAwOyBicmVhazsKLSAgICBjYXNlIEdFOiByZXMgPSB2YWwgPj0gMDsgYnJlYWs7Ci0gICAgY2FzZSBHVDogcmVzID0gdmFsID4gIDA7IGJyZWFrOwotICAgIH0KLQotICBpZmkrKzsKLSAgaWZzdGFja1tpZmldLm9uID0gaWZzdGFja1tpZmktMV0ub24gPyByZXM6IDA7Ci0gIGlmc3RhY2tbaWZpXS5oYWRlbHNlID0gMDsKLX0KLQotLyogR2V0IGEgc3RyaW5nIGZvciB0aGUgTVJJIElGQyBvciBJRk5DIHBzZXVkby1vcHMuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfbXJpX3N0cmluZyAoaWR4LCBpbiwgdmFsLCB0ZXJtaW5hdG9yKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICp2YWw7Ci0gICAgIGludCB0ZXJtaW5hdG9yOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBpZiAoaWR4IDwgaW4tPmxlbgotICAgICAgJiYgaW4tPnB0cltpZHhdID09ICdcJycpCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKHZhbCwgJ1wnJyk7Ci0gICAgICBmb3IgKCsraWR4OyBpZHggPCBpbi0+bGVuOyArK2lkeCkKLQl7Ci0JICBzYl9hZGRfY2hhciAodmFsLCBpbi0+cHRyW2lkeF0pOwotCSAgaWYgKGluLT5wdHJbaWR4XSA9PSAnXCcnKQotCSAgICB7Ci0JICAgICAgKytpZHg7Ci0JICAgICAgaWYgKGlkeCA+PSBpbi0+bGVuCi0JCSAgfHwgaW4tPnB0cltpZHhdICE9ICdcJycpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JICAgICAmJiBpbi0+cHRyW2lkeF0gIT0gdGVybWluYXRvcikKLQl7Ci0JICBzYl9hZGRfY2hhciAodmFsLCBpbi0+cHRyW2lkeF0pOwotCSAgKytpZHg7Ci0JfQotICAgICAgaSA9IHZhbC0+bGVuIC0gMTsKLSAgICAgIHdoaWxlIChpID49IDAgJiYgSVNXSElURSAodmFsLT5wdHJbaV0pKQotCS0taTsKLSAgICAgIHZhbC0+bGVuID0gaSArIDE7Ci0gICAgfQotCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIE1SSSBJRkMsIElGTkMuICAqLwotCi1zdGF0aWMgdm9pZAotZG9faWZjIChpZHgsIGluLCBpZm5jKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCBpZm5jOwotewotICBzYiBmaXJzdDsKLSAgc2Igc2Vjb25kOwotICBpbnQgcmVzOwotCi0gIGlmIChpZmkgPj0gSUZORVNUSU5HKQotICAgIHsKLSAgICAgIEZBVEFMICgoc3RkZXJyLCBfKCJJRiBuZXN0aW5nIHVucmVhc29uYWJsZS5cbiIpKSk7Ci0gICAgfQotCi0gIHNiX25ldyAoJmZpcnN0KTsKLSAgc2JfbmV3ICgmc2Vjb25kKTsKLQotICBpZHggPSBnZXRfbXJpX3N0cmluZyAoaWR4LCBpbiwgJmZpcnN0LCAnLCcpOwotCi0gIGlmIChpZHggPj0gaW4tPmxlbiB8fCBpbi0+cHRyW2lkeF0gIT0gJywnKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJCYWQgZm9ybWF0IGZvciBJRiBvciBJRk5DLlxuIikpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWR4ID0gZ2V0X21yaV9zdHJpbmcgKGlkeCArIDEsIGluLCAmc2Vjb25kLCAnOycpOwotCi0gIHJlcyA9IChmaXJzdC5sZW4gPT0gc2Vjb25kLmxlbgotCSAmJiBzdHJuY21wIChmaXJzdC5wdHIsIHNlY29uZC5wdHIsIGZpcnN0LmxlbikgPT0gMCk7Ci0gIHJlcyBePSBpZm5jOwotCi0gIGlmaSsrOwotICBpZnN0YWNrW2lmaV0ub24gPSBpZnN0YWNrW2lmaS0xXS5vbiA/IHJlcyA6IDA7Ci0gIGlmc3RhY2tbaWZpXS5oYWRlbHNlID0gMDsKLX0KLQotLyogLkVORFIgKi8KLXN0YXRpYyB2b2lkCi1kb19hZW5kciAoKQotewotICBpZiAoIW1yaSkKLSAgICBFUlJPUiAoKHN0ZGVyciwgXygiQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuXG4iKSkpOwotICBlbHNlCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIkVORFIgd2l0aG91dCBhIFJFUFQuXG4iKSkpOwotfQotCi0vKiAuQVdISUxFICovCi0KLXN0YXRpYwotdm9pZAotZG9fYXdoaWxlIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBsaW5lID0gbGluZWNvdW50ICgpOwotICBzYiBleHA7Ci0gIHNiIHN1YjsKLSAgaW50IGRvaXQ7Ci0KLSAgc2JfbmV3ICgmc3ViKTsKLSAgc2JfbmV3ICgmZXhwKTsKLQotICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sICZleHApOwotICBkb2l0ID0gaXN0cnVlICgwLCAmZXhwKTsKLQotICBpZiAoISBidWZmZXJfYW5kX25lc3QgKCJBV0hJTEUiLCAiQUVORFciLCAmc3ViLCBnZXRfbGluZSkpCi0gICAgRkFUQUwgKChzdGRlcnIsIF8oIkFXSElMRSB3aXRob3V0IGEgQUVORFcgYXQgJWQuXG4iKSwgbGluZSAtIDEpKTsKLQotICAvKiBUdXJuCi0gICAgIAkuQVdISUxFIGV4cAotCSAgICAgZm9vCi0JLkFFTkRXCi0gICAgIGludG8KLSAgICAgICAgZm9vCi0JLkFXSElMRSBleHAKLQlmb28KLQkuRU5EVwotICAgKi8KLQotICBpZiAoZG9pdCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBpbmNsdWRlX25leHRfaW5kZXggKCk7Ci0KLSAgICAgIHNiIGNvcHk7Ci0gICAgICBzYl9uZXcgKCZjb3B5KTsKLSAgICAgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotICAgICAgc2JfYWRkX3NiICgmY29weSwgaW4pOwotICAgICAgc2JfYWRkX3N0cmluZyAoJmNvcHksICJcbiIpOwotICAgICAgc2JfYWRkX3NiICgmY29weSwgJnN1Yik7Ci0gICAgICBzYl9hZGRfc3RyaW5nICgmY29weSwgIlx0LkFFTkRXXG4iKTsKLSAgICAgIC8qIFB1c2ggYW5vdGhlciBXSElMRSAqLwotICAgICAgaW5jbHVkZV9idWYgKCZleHAsICZjb3B5LCBpbmNsdWRlX3doaWxlLCBpbmRleCk7Ci0gICAgICBzYl9raWxsICgmY29weSk7Ci0gICAgfQotICBzYl9raWxsICgmZXhwKTsKLSAgc2Jfa2lsbCAoJnN1Yik7Ci19Ci0KLQotLyogLkFFTkRXICovCi0KLXN0YXRpYyB2b2lkCi1kb19hZW5kdyAoKQotewotICBFUlJPUiAoKHN0ZGVyciwgXygiQUVORFcgd2l0aG91dCBhIEFFTkRXLlxuIikpKTsKLX0KLQotCi0vKiAuRVhJVE0KLSAgIAotICAgUG9wIHRoaW5ncyBvZmYgdGhlIGluY2x1ZGUgc3RhY2sgdW50aWwgdGhlIHR5cGUgYW5kIGluZGV4IGNoYW5nZXMgKi8KLQotc3RhdGljIHZvaWQKLWRvX2V4aXRtICgpCi17Ci0gIGluY2x1ZGVfdHlwZSB0eXBlID0gc3AtPnR5cGU7Ci0gIGlmICh0eXBlID09IGluY2x1ZGVfcmVwZWF0Ci0gICAgICB8fCB0eXBlID09IGluY2x1ZGVfd2hpbGUKLSAgICAgIHx8IHR5cGUgPT0gaW5jbHVkZV9tYWNybykKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBzcC0+aW5kZXg7Ci0gICAgICBpbmNsdWRlX3BvcCAoKTsKLSAgICAgIHdoaWxlIChzcC0+aW5kZXggPT0gaW5kZXgKLQkgICAgICYmIHNwLT50eXBlID09IHR5cGUpCi0JewotCSAgaW5jbHVkZV9wb3AgKCk7Ci0JfQotICAgIH0KLX0KLQotLyogLkFSRVBFQVQgKi8KLQotc3RhdGljIHZvaWQKLWRvX2FyZXBlYXQgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IGxpbmUgPSBsaW5lY291bnQgKCk7Ci0gIHNiIGV4cDsJCQkvKiBidWZmZXIgd2l0aCBleHByZXNzaW9uIGluIGl0ICovCi0gIHNiIGNvcHk7CQkJLyogZXhwYW5kZWQgcmVwZWF0IGJsb2NrICovCi0gIHNiIHN1YjsJCQkvKiBjb250ZW50cyBvZiBBUkVQRUFUICovCi0gIGludCByYzsKLSAgaW50IHJldDsKLSAgY2hhciBidWZmZXJbMzBdOwotCi0gIHNiX25ldyAoJmV4cCk7Ci0gIHNiX25ldyAoJmNvcHkpOwotICBzYl9uZXcgKCZzdWIpOwotICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sICZleHApOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygiQVJFUEVBVCBtdXN0IGhhdmUgYWJzb2x1dGUgb3BlcmFuZC5cbiIpLCAwLCAmZXhwLCAmcmMpOwotICBpZiAoIW1yaSkKLSAgICByZXQgPSBidWZmZXJfYW5kX25lc3QgKCJBUkVQRUFUIiwgIkFFTkRSIiwgJnN1YiwgZ2V0X2xpbmUpOwotICBlbHNlCi0gICAgcmV0ID0gYnVmZmVyX2FuZF9uZXN0ICgiUkVQVCIsICJFTkRSIiwgJnN1YiwgZ2V0X2xpbmUpOwotICBpZiAoISByZXQpCi0gICAgRkFUQUwgKChzdGRlcnIsIF8oIkFSRVBFQVQgd2l0aG91dCBhIEFFTkRSIGF0ICVkLlxuIiksIGxpbmUgLSAxKSk7Ci0gIGlmIChyYyA+IDApCi0gICAgewotICAgICAgLyogUHVzaCBiYWNrIHRoZSB0ZXh0IGZvbGxvd2luZyB0aGUgcmVwZWF0LCBhbmQgYW5vdGhlciByZXBlYXQgYmxvY2sKLQkgc28KLQkgLkFSRVBFQVQgMjAKLQkgZm9vCi0JIC5BRU5EUgotCSBnZXRzIHR1cm5lZCBpbnRvCi0JIGZvbwotCSAuQVJFUEVBVCAxOQotCSBmb28KLQkgLkFFTkRSCi0JICovCi0gICAgICBpbnQgaW5kZXggPSBpbmNsdWRlX25leHRfaW5kZXggKCk7Ci0gICAgICBzYl9hZGRfc2IgKCZjb3B5LCAmc3ViKTsKLSAgICAgIGlmIChyYyA+IDEpCi0JewotCSAgaWYgKCFtcmkpCi0JICAgIHNwcmludGYgKGJ1ZmZlciwgIlx0LkFSRVBFQVQJJWRcbiIsIHJjIC0gMSk7Ci0JICBlbHNlCi0JICAgIHNwcmludGYgKGJ1ZmZlciwgIlx0UkVQVAklZFxuIiwgcmMgLSAxKTsKLQkgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCBidWZmZXIpOwotCSAgc2JfYWRkX3NiICgmY29weSwgJnN1Yik7Ci0JICBpZiAoIW1yaSkKLQkgICAgc2JfYWRkX3N0cmluZyAoJmNvcHksICIJLkFFTkRSXG4iKTsKLQkgIGVsc2UKLQkgICAgc2JfYWRkX3N0cmluZyAoJmNvcHksICIJRU5EUlxuIik7Ci0JfQotCi0gICAgICBpbmNsdWRlX2J1ZiAoJmV4cCwgJmNvcHksIGluY2x1ZGVfcmVwZWF0LCBpbmRleCk7Ci0gICAgfQotICBzYl9raWxsICgmZXhwKTsKLSAgc2Jfa2lsbCAoJnN1Yik7Ci0gIHNiX2tpbGwgKCZjb3B5KTsKLX0KLQotLyogLkVORE0gKi8KLQotc3RhdGljIHZvaWQKLWRvX2VuZG0gKCkKLXsKLSAgRVJST1IgKChzdGRlcnIsIF8oIi5FTkRNIHdpdGhvdXQgYSBtYXRjaGluZyAuTUFDUk8uXG4iKSkpOwotfQotCi0vKiBNUkkgSVJQIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1kb19pcnAgKGlkeCwgaW4sIGlycGMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50IGlycGM7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgc2Igb3V0OwotCi0gIHNiX25ldyAoJm91dCk7Ci0KLSAgZXJyID0gZXhwYW5kX2lycCAoaXJwYywgaWR4LCBpbiwgJm91dCwgZ2V0X2xpbmUsIGNvbW1lbnRfY2hhcik7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICBFUlJPUiAoKHN0ZGVyciwgIiVzXG4iLCBlcnIpKTsKLQotICBmcHJpbnRmIChvdXRmaWxlLCAiJXMiLCBzYl90ZXJtaW5hdGUgKCZvdXQpKTsKLQotICBzYl9raWxsICgmb3V0KTsKLX0KLQotLyogTUFDUk8gUFJPQ0VTU0lORyAqLwotCi0vKiBQYXJzZSBvZmYgTE9DQUwgbjEsIG4yLC4uLiBJbnZlbnQgYSBsYWJlbCBuYW1lIGZvciBpdCAqLwotc3RhdGljCi12b2lkIAotZG9fbG9jYWwgKGlkeCwgbGluZSkKLSAgICAgaW50IGlkeCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzYiAqbGluZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBFUlJPUiAoKHN0ZGVyciwgXygiTE9DQUwgb3V0c2lkZSBvZiBNQUNSTyIpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tYWNybyAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIGludCBsaW5lID0gbGluZWNvdW50ICgpOwotCi0gIGVyciA9IGRlZmluZV9tYWNybyAoaWR4LCBpbiwgJmxhYmVsLCBnZXRfbGluZSwgKGNvbnN0IGNoYXIgKiopIE5VTEwpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIm1hY3JvIGF0IGxpbmUgJWQ6ICVzXG4iKSwgbGluZSAtIDEsIGVycikpOwotfQotCi1zdGF0aWMgaW50Ci1tYWNyb19vcCAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIHNiIG91dDsKLSAgc2IgbmFtZTsKLQotICBpZiAoISBtYWNyb19kZWZpbmVkKQotICAgIHJldHVybiAwOwotCi0gIHNiX3Rlcm1pbmF0ZSAoaW4pOwotICBpZiAoISBjaGVja19tYWNybyAoaW4tPnB0ciArIGlkeCwgJm91dCwgY29tbWVudF9jaGFyLCAmZXJyKSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7Ci0KLSAgc2JfbmV3ICgmbmFtZSk7Ci0gIHNiX2FkZF9zdHJpbmcgKCZuYW1lLCBfKCJtYWNybyBleHBhbnNpb24iKSk7Ci0KLSAgaW5jbHVkZV9idWYgKCZuYW1lLCAmb3V0LCBpbmNsdWRlX21hY3JvLCBpbmNsdWRlX25leHRfaW5kZXggKCkpOwotCi0gIHNiX2tpbGwgKCZuYW1lKTsKLSAgc2Jfa2lsbCAoJm91dCk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFNUUklORyBIQU5ETElORyAqLwotCi1zdGF0aWMgaW50Ci1nZXRzdHJpbmcgKGlkeCwgaW4sIGFjYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqYWNjOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAmJiAoaW4tPnB0cltpZHhdID09ICciJyAKLQkgICAgIHx8IGluLT5wdHJbaWR4XSA9PSAnPCcgCi0JICAgICB8fCAoaW4tPnB0cltpZHhdID09ICdcJycgJiYgYWx0ZXJuYXRlKSkpCi0gICAgewotICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCi0JewotCSAgaWYgKGFsdGVybmF0ZSB8fCBtcmkpCi0JICAgIHsKLQkgICAgICBpbnQgbmVzdCA9IDA7Ci0JICAgICAgaWR4Kys7Ci0JICAgICAgd2hpbGUgKChpbi0+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+cGF0aCk7Ci0JICAgIHNiX2FkZF9zdHJpbmcgKCZwLT5wYXRoLCBvcHRhcmcpOwotCSAgICBpZiAocGF0aHNfdGFpbCkKLQkgICAgICBwYXRoc190YWlsLT5uZXh0ID0gcDsKLQkgICAgZWxzZQotCSAgICAgIHBhdGhzX2hlYWQgPSBwOwotCSAgICBwYXRoc190YWlsID0gcDsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgcHJpbnRfbGluZV9udW1iZXIgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBjb21tZW50X2NoYXIgPSBvcHRhcmdbMF07Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIGFsdGVybmF0ZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGNvcHlzb3VyY2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBzdGF0cyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGRvX2RlZmluZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgbXJpID0gMTsKLQkgIGNvbW1lbnRfY2hhciA9ICc7JzsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlICd2JzoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBhc3NlbWJsZXIgcHJlLXByb2Nlc3NvciAlc1xuIiksIHByb2dyYW1fdmVyc2lvbik7Ci0JICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOwotCSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICBleGl0ICgwKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCX0KLSAgICB9Ci0KLSAgcHJvY2Vzc19pbml0ICgpOwotCi0gIG1hY3JvX2luaXQgKGFsdGVybmF0ZSwgbXJpLCAwLCBleHBfZ2V0X2Ficyk7Ci0KLSAgaWYgKG91dF9uYW1lKSB7Ci0gICAgb3V0ZmlsZSA9IGZvcGVuIChvdXRfbmFtZSwgInciKTsKLSAgICBpZiAoIW91dGZpbGUpCi0gICAgICB7Ci0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSBgJXMnLlxuIiksCi0JCSBwcm9ncmFtX25hbWUsIG91dF9uYW1lKTsKLQlleGl0ICgxKTsKLSAgICAgIH0KLSAgfQotICBlbHNlICB7Ci0gICAgb3V0ZmlsZSA9IHN0ZG91dDsKLSAgfQotCi0gIGNoYXJ0eXBlX2luaXQgKCk7Ci0gIGlmICghb3V0ZmlsZSkKLSAgICBvdXRmaWxlID0gc3Rkb3V0OwotCi0gIC8qIFByb2Nlc3MgYWxsIHRoZSBpbnB1dCBmaWxlcyAqLwotCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGlmIChuZXdfZmlsZSAoYXJndltvcHRpbmRdKSkKLQl7Ci0JICBwcm9jZXNzX2ZpbGUgKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gaW5wdXQgZmlsZSBgJXMnLlxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYXJndltvcHRpbmRdKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIG9wdGluZCsrOwotICAgIH0KLQotICBxdWl0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJlY2F1c2UgYW4gYWJvcnQgaW4gc29tZSBvZiB0aGUgb3RoZXIgZmlsZXMKLSAgIG1heSBiZSBjb21waWxlZCBpbnRvIGFzX2Fib3J0IGJlY2F1c2UgdGhleSBpbmNsdWRlIGFzLmguICAqLwotCi12b2lkCi1hc19hYm9ydCAoZmlsZSwgbGluZSwgZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKLSAgICAgaW50IGxpbmU7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQiKSwgZmlsZSwgbGluZSk7Ci0gIGlmIChmbikKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgaW4gJXMiLCBmbik7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiXG5QbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICBleGl0ICgxKTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9nZGJpbml0LmluIGIvZ2FzL2dkYmluaXQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDY3MjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2dkYmluaXQuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1kaXIgQHNyY2RpckAKLWRpciAuCi0KLWJyZWFrIGFzX3dhcm4KLWJyZWFrIGFzX3dhcm5fd2hlcmUKLWJyZWFrIGFzX2JhZAotYnJlYWsgYXNfYmFkX3doZXJlCi1icmVhayBhc19mYXRhbAotYnJlYWsgYXNfcGVycm9yCi1icmVhayBhc19hc3NlcnQKLWJyZWFrIGFzX2Fib3J0Ci0KLWRlZmluZSBwZQotY2FsbCBwcmludF9leHByICgkKQotZW5kCi0KLWRvY3VtZW50IHBlCi1QcmludCAqJCBhcyBhbiBleHByZXNzaW9uUywgZXhwYW5kaW5nIHBhcmFtZXRlcnMuCi1lbmQKLQotZGVmaW5lIHBzCi1jYWxsIHByaW50X3N5bWJvbF92YWx1ZSAoJCkKLWVuZAotCi1kb2N1bWVudCBwcwotUHJpbnQgKiQgYXMgYSBzeW1ib2xTLCBpbmNsdWRpbmcgZXhwcmVzc2lvbiB2YWx1ZS4KLWVuZAotCi1kZWZpbmUgcGYKLWNhbGwgcHJpbnRfZml4dXAgKCQpCi1lbmQKLQotZG9jdW1lbnQgcGYKLVByaW50ICokIGFzIGEgZml4UywgaW5jbHVkaW5nIHN5bWJvbCB2YWx1ZS4KLWVuZAotCi0jIFB1dCB0aGlzIGxhc3QsIGluIGNhc2UgaXQgZmFpbHMuCi0KLWJyZWFrIGFib3J0CmRpZmYgLS1naXQgYS9nYXMvaGFzaC5jIGIvZ2FzL2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxMjlmYi4uMDAwMDAwMAotLS0gYS9nYXMvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qIGhhc2guYyAtLSBnYXMgaGFzaCB0YWJsZSBjb2RlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgdmVyc2lvbiBvZiB0aGUgaGFzaCB0YWJsZSBjb2RlIGlzIGEgd2hvbGVzY2FsZSByZXBsYWNlbWVudCBvZgotICAgdGhlIG9sZCBoYXNoIHRhYmxlIGNvZGUsIHdoaWNoIHdhcyBmYWlybHkgYmFkLiAgVGhpcyBpcyBiYXNlZCBvbgotICAgdGhlIGhhc2ggdGFibGUgY29kZSBpbiBCRkQsIGJ1dCBvcHRpbWl6ZWQgc2xpZ2h0bHkgZm9yIHRoZQotICAgYXNzc2VtYmxlci4gIFRoZSBhc3NlbWJsZXIgZG9lcyBub3QgbmVlZCB0byBkZXJpdmUgc3RydWN0dXJlcyB0aGF0Ci0gICBhcmUgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLiAgSW5zdGVhZCwgaXQgYWx3YXlzIHN0b3JlcyBhIHBvaW50ZXIuCi0gICBUaGUgYXNzZW1ibGVyIHVzZXMgdGhlIGhhc2ggdGFibGUgbW9zdGx5IHRvIHN0b3JlIHN5bWJvbHMsIGFuZCB3ZQotICAgZG9uJ3QgbmVlZCB0byBjb25mdXNlIHRoZSBzeW1ib2wgc3RydWN0dXJlIHdpdGggYSBoYXNoIHRhYmxlCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIFRoZSBkZWZhdWx0IG51bWJlciBvZiBlbnRyaWVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgREVGQVVMVF9TSVpFICg0MDUxKQotCi0vKiBBbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgaGFzaF9lbnRyeQotewotICAvKiBOZXh0IGVudHJ5IGZvciB0aGlzIGhhc2ggY29kZS4gICovCi0gIHN0cnVjdCBoYXNoX2VudHJ5ICpuZXh0OwotICAvKiBTdHJpbmcgYmVpbmcgaGFzaGVkLiAgKi8KLSAgY29uc3QgY2hhciAqc3RyaW5nOwotICAvKiBIYXNoIGNvZGUuICBUaGlzIGlzIHRoZSBmdWxsIGhhc2ggY29kZSwgbm90IHRoZSBpbmRleCBpbnRvIHRoZQotICAgICB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgLyogUG9pbnRlciBiZWluZyBzdG9yZWQgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICBQVFIgZGF0YTsKLX07Ci0KLS8qIEEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBoYXNoX2NvbnRyb2wKLXsKLSAgLyogVGhlIGhhc2ggYXJyYXkuICAqLwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqKnRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIEFuIG9ic3RhY2sgZm9yIHRoaXMgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBvYnN0YWNrIG1lbW9yeTsKLQotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAvKiBTdGF0aXN0aWNzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsb29rdXBzOwotICB1bnNpZ25lZCBsb25nIGhhc2hfY29tcGFyZXM7Ci0gIHVuc2lnbmVkIGxvbmcgc3RyaW5nX2NvbXBhcmVzOwotICB1bnNpZ25lZCBsb25nIGluc2VydGlvbnM7Ci0gIHVuc2lnbmVkIGxvbmcgcmVwbGFjZW1lbnRzOwotICB1bnNpZ25lZCBsb25nIGRlbGV0aW9uczsKLSNlbmRpZiAvKiBIQVNIX1NUQVRJU1RJQ1MgKi8KLX07Ci0KLS8qIENyZWF0ZSBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybiBhIGNvbnRyb2wgYmxvY2suICAqLwotCi1zdHJ1Y3QgaGFzaF9jb250cm9sICoKLWhhc2hfbmV3ICgpCi17Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZXQ7Ci0gIHVuc2lnbmVkIGludCBhbGxvYzsKLQotICBzaXplID0gREVGQVVMVF9TSVpFOwotCi0gIHJldCA9IChzdHJ1Y3QgaGFzaF9jb250cm9sICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgb2JzdGFja19iZWdpbiAoJnJldC0+bWVtb3J5LCBjaHVua3NpemUpOwotICBhbGxvYyA9IHNpemUgKiBzaXplb2YgKHN0cnVjdCBoYXNoX2VudHJ5ICopOwotICByZXQtPnRhYmxlID0gKHN0cnVjdCBoYXNoX2VudHJ5ICoqKSBvYnN0YWNrX2FsbG9jICgmcmV0LT5tZW1vcnksIGFsbG9jKTsKLSAgbWVtc2V0IChyZXQtPnRhYmxlLCAwLCBhbGxvYyk7Ci0gIHJldC0+c2l6ZSA9IHNpemU7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgcmV0LT5sb29rdXBzID0gMDsKLSAgcmV0LT5oYXNoX2NvbXBhcmVzID0gMDsKLSAgcmV0LT5zdHJpbmdfY29tcGFyZXMgPSAwOwotICByZXQtPmluc2VydGlvbnMgPSAwOwotICByZXQtPnJlcGxhY2VtZW50cyA9IDA7Ci0gIHJldC0+ZGVsZXRpb25zID0gMDsKLSNlbmRpZgotCi0gIHJldHVybiByZXQ7ICAKLX0KLQotLyogRGVsZXRlIGEgaGFzaCB0YWJsZSwgZnJlZWluZyBhbGwgYWxsb2NhdGVkIG1lbW9yeS4gICovCi0KLXZvaWQKLWhhc2hfZGllICh0YWJsZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci17Ci0gIG9ic3RhY2tfZnJlZSAoJnRhYmxlLT5tZW1vcnksIDApOwotICBmcmVlICh0YWJsZSk7Ci19Ci0KLS8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKLSAgIGhhc2hfZW50cnksIG9yIE5VTEwgaWYgdGhlIHN0cmluZyBpcyBub3QgaW4gdGhlIHRhYmxlLiAgSWYgUExJU1QgaXMKLSAgIG5vdCBOVUxMLCB0aGlzIHNldHMgKlBMSVNUIHRvIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgbGlzdCB3aGljaAotICAgd291bGQgaG9sZCB0aGlzIGhhc2ggZW50cnkuICBJZiBQSEFTSCBpcyBub3QgTlVMTCwgdGhpcyBzZXRzICpQSEFTSAotICAgdG8gdGhlIGhhc2ggY29kZSBmb3IgS0VZLgotCi0gICBFYWNoIHRpbWUgd2UgbG9vayB1cCBhIHN0cmluZywgd2UgbW92ZSBpdCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3QKLSAgIGZvciBpdHMgaGFzaCBjb2RlLCB0byB0YWtlIGFkdmFudGFnZSBvZiByZWZlcmVudGlhbCBsb2NhbGl0eS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9lbnRyeSAqaGFzaF9sb29rdXAgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqLAotCQkJCQkgICAgICAgc3RydWN0IGhhc2hfZW50cnkgKioqLAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9lbnRyeSAqCi1oYXNoX2xvb2t1cCAodGFibGUsIGtleSwgcGxpc3QsIHBoYXNoKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqKipwbGlzdDsKLSAgICAgdW5zaWduZWQgbG9uZyAqcGhhc2g7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqczsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnByZXY7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgKyt0YWJsZS0+bG9va3VwczsKLSNlbmRpZgotCi0gIGhhc2ggPSAwOwotICBsZW4gPSAwOwotICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikga2V5OwotICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggKz0gYyArIChjIDw8IDE3KTsKLSAgICAgIGhhc2ggXj0gaGFzaCA+PiAyOwotICAgICAgKytsZW47Ci0gICAgfQotICBoYXNoICs9IGxlbiArIChsZW4gPDwgMTcpOwotICBoYXNoIF49IGhhc2ggPj4gMjsKLQotICBpZiAocGhhc2ggIT0gTlVMTCkKLSAgICAqcGhhc2ggPSBoYXNoOwotCi0gIGluZGV4ID0gaGFzaCAlIHRhYmxlLT5zaXplOwotICBsaXN0ID0gdGFibGUtPnRhYmxlICsgaW5kZXg7Ci0KLSAgaWYgKHBsaXN0ICE9IE5VTEwpCi0gICAgKnBsaXN0ID0gbGlzdDsKLQotICBwcmV2ID0gTlVMTDsKLSAgZm9yIChwID0gKmxpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAgICAgKyt0YWJsZS0+aGFzaF9jb21wYXJlczsKLSNlbmRpZgotCi0gICAgICBpZiAocC0+aGFzaCA9PSBoYXNoKQotCXsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLQkgICsrdGFibGUtPnN0cmluZ19jb21wYXJlczsKLSNlbmRpZgotCi0JICBpZiAoc3RyY21wIChwLT5zdHJpbmcsIGtleSkgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChwcmV2ICE9IE5VTEwpCi0JCXsKLQkJICBwcmV2LT5uZXh0ID0gcC0+bmV4dDsKLQkJICBwLT5uZXh0ID0gKmxpc3Q7Ci0JCSAgKmxpc3QgPSBwOwotCQl9Ci0KLQkgICAgICByZXR1cm4gcDsKLQkgICAgfQotCX0KLQotICAgICAgcHJldiA9IHA7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBJbnNlcnQgYW4gZW50cnkgaW50byBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgTlVMTCBvbiBzdWNjZXNzLgotICAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlIGVycm9yLiAgSXQKLSAgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gZXJyb3IgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzIGluIHRoZQotICAgaGFzaCB0YWJsZS4gICovCi0KLWNvbnN0IGNoYXIgKgotaGFzaF9pbnNlcnQgKHRhYmxlLCBrZXksIHZhbHVlKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBQVFIgdmFsdWU7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqKmxpc3Q7Ci0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksICZsaXN0LCAmaGFzaCk7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgcmV0dXJuICJleGlzdHMiOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPmluc2VydGlvbnM7Ci0jZW5kaWYKLQotICBwID0gb2JzdGFja19hbGxvYyAoJnRhYmxlLT5tZW1vcnksIHNpemVvZiAqcCk7Ci0gIHAtPnN0cmluZyA9IGtleTsKLSAgcC0+aGFzaCA9IGhhc2g7Ci0gIHAtPmRhdGEgPSB2YWx1ZTsKLQotICBwLT5uZXh0ID0gKmxpc3Q7Ci0gICpsaXN0ID0gcDsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW5zZXJ0IG9yIHJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIE5VTEwgb24KLSAgIHN1Y2Nlc3MuICBPbiBlcnJvciwgaXQgcmV0dXJucyBhIHByaW50YWJsZSBzdHJpbmcgaW5kaWNhdGluZyB0aGUKLSAgIGVycm9yLiAgSWYgYW4gZW50cnkgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyByZXBsYWNlZC4gICovCi0KLWNvbnN0IGNoYXIgKgotaGFzaF9qYW0gKHRhYmxlLCBrZXksIHZhbHVlKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBQVFIgdmFsdWU7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqKmxpc3Q7Ci0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksICZsaXN0LCAmaGFzaCk7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgewotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAgICAgKyt0YWJsZS0+cmVwbGFjZW1lbnRzOwotI2VuZGlmCi0KLSAgICAgIHAtPmRhdGEgPSB2YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICAgICArK3RhYmxlLT5pbnNlcnRpb25zOwotI2VuZGlmCi0KLSAgICAgIHAgPSBvYnN0YWNrX2FsbG9jICgmdGFibGUtPm1lbW9yeSwgc2l6ZW9mICpwKTsKLSAgICAgIHAtPnN0cmluZyA9IGtleTsKLSAgICAgIHAtPmhhc2ggPSBoYXNoOwotICAgICAgcC0+ZGF0YSA9IHZhbHVlOwotCi0gICAgICBwLT5uZXh0ID0gKmxpc3Q7Ci0gICAgICAqbGlzdCA9IHA7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgb2xkCi0gICB2YWx1ZSBzdG9yZWQgZm9yIHRoZSBlbnRyeS4gIElmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQgaW4gdGhlIGhhc2gKLSAgIHRhYmxlLCB0aGlzIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBOVUxMLiAgKi8KLQotUFRSCi1oYXNoX3JlcGxhY2UgKHRhYmxlLCBrZXksIHZhbHVlKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBQVFIgdmFsdWU7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotICBQVFIgcmV0OwotCi0gIHAgPSBoYXNoX2xvb2t1cCAodGFibGUsIGtleSwgTlVMTCwgTlVMTCk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgKyt0YWJsZS0+cmVwbGFjZW1lbnRzOwotI2VuZGlmCi0KLSAgcmV0ID0gcC0+ZGF0YTsKLQotICBwLT5kYXRhID0gdmFsdWU7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRmluZCBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUsIHJldHVybmluZyBpdHMgdmFsdWUuICBSZXR1cm5zIE5VTEwKLSAgIGlmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQuICAqLwotCi1QVFIKLWhhc2hfZmluZCAodGFibGUsIGtleSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0KLSAgcCA9IGhhc2hfbG9va3VwICh0YWJsZSwga2V5LCBOVUxMLCBOVUxMKTsKLSAgaWYgKHAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gcC0+ZGF0YTsKLX0KLQotLyogRGVsZXRlIGFuIGVudHJ5IGZyb20gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQKLSAgIGZvciB0aGF0IGVudHJ5LCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZW50cnkuICAqLwotCi1QVFIKLWhhc2hfZGVsZXRlICh0YWJsZSwga2V5KQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotCi0gIHAgPSBoYXNoX2xvb2t1cCAodGFibGUsIGtleSwgJmxpc3QsIE5VTEwpOwotICBpZiAocCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChwICE9ICpsaXN0KQotICAgIGFib3J0ICgpOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPmRlbGV0aW9uczsKLSNlbmRpZgotCi0gICpsaXN0ID0gcC0+bmV4dDsKLQotICAvKiBOb3RlIHRoYXQgd2UgbmV2ZXIgcmVjbGFpbSB0aGUgbWVtb3J5IGZvciB0aGlzIGVudHJ5LiAgSWYgZ2FzCi0gICAgIGV2ZXIgc3RhcnRzIGRlbGV0aW5nIGhhc2ggdGFibGUgZW50cmllcyBpbiBhIGJpZyB3YXksIHRoaXMgd2lsbAotICAgICBoYXZlIHRvIGNoYW5nZS4gICovCi0KLSAgcmV0dXJuIHAtPmRhdGE7Ci19Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZS4gIENhbGwgdGhlIGZ1bmN0aW9uIG9uIGV2ZXJ5IGVudHJ5IGluIHRoZQotICAgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWhhc2hfdHJhdmVyc2UgKHRhYmxlLCBwZm4pCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlOwotICAgICB2b2lkICgqcGZuKSBQQVJBTVMgKChjb25zdCBjaGFyICprZXksIFBUUiB2YWx1ZSkpOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7ICsraSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLQotICAgICAgZm9yIChwID0gdGFibGUtPnRhYmxlW2ldOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCSgqcGZuKSAocC0+c3RyaW5nLCBwLT5kYXRhKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGhhc2ggdGFibGUgc3RhdGlzdGljcyBvbiB0aGUgc3BlY2lmaWVkIGZpbGUuICBOQU1FIGlzIHRoZQotICAgbmFtZSBvZiB0aGUgaGFzaCB0YWJsZSwgdXNlZCBmb3IgcHJpbnRpbmcgYSBoZWFkZXIuICAqLwotCi12b2lkCi1oYXNoX3ByaW50X3N0YXRpc3RpY3MgKGYsIG5hbWUsIHRhYmxlKQotICAgICBGSUxFICpmIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0gIHVuc2lnbmVkIGxvbmcgZW1wdHk7Ci0KLSAgZnByaW50ZiAoZiwgIiVzIGhhc2ggc3RhdGlzdGljczpcbiIsIG5hbWUpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgbG9va3Vwc1xuIiwgdGFibGUtPmxvb2t1cHMpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgaGFzaCBjb21wYXJpc29uc1xuIiwgdGFibGUtPmhhc2hfY29tcGFyZXMpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgc3RyaW5nIGNvbXBhcmlzb25zXG4iLCB0YWJsZS0+c3RyaW5nX2NvbXBhcmVzKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGluc2VydGlvbnNcbiIsIHRhYmxlLT5pbnNlcnRpb25zKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IHJlcGxhY2VtZW50c1xuIiwgdGFibGUtPnJlcGxhY2VtZW50cyk7Ci0gIGZwcmludGYgKGYsICJcdCVsdSBkZWxldGlvbnNcbiIsIHRhYmxlLT5kZWxldGlvbnMpOwotCi0gIHRvdGFsID0gMDsKLSAgZW1wdHkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7ICsraSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLQotICAgICAgaWYgKHRhYmxlLT50YWJsZVtpXSA9PSBOVUxMKQotCSsrZW1wdHk7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChwID0gdGFibGUtPnRhYmxlW2ldOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCSAgICArK3RvdGFsOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZiwgIlx0JWcgYXZlcmFnZSBjaGFpbiBsZW5ndGhcbiIsIChkb3VibGUpIHRvdGFsIC8gdGFibGUtPnNpemUpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgZW1wdHkgc2xvdHNcbiIsIGVtcHR5KTsKLSNlbmRpZgotfQotDAotI2lmZGVmIFRFU1QKLQotLyogVGhpcyB0ZXN0IHByb2dyYW0gaXMgbGVmdCBvdmVyIGZyb20gdGhlIG9sZCBoYXNoIHRhYmxlIGNvZGUuICAqLwotCi0jZGVmaW5lIFRBQkxFUyAoNikJCS8qIG51bWJlciBvZiBoYXNoIHRhYmxlcyB0byBtYWludGFpbiAqLwotCQkJCS8qIChhdCBvbmNlKSBpbiBhbnkgdGVzdGluZyAqLwotI2RlZmluZSBTVEFUQlVGU0laRSAoMTIpCS8qIHdlIGNhbiBoYXZlIDEyIHN0YXRpc3RpY3MgKi8KLQotaW50IHN0YXRidWZbU1RBVEJVRlNJWkVdOwkvKiBkaXNwbGF5IHN0YXRpc3RpY3MgaGVyZSAqLwotY2hhciBhbnN3ZXJbMTAwXTsJCS8qIGh1bWFuIGZhcnRzIGhlcmUgKi8KLWNoYXIgKmhhc2h0YWJsZVtUQUJMRVNdOwkvKiB3ZSB0ZXN0IG1hbnkgaGFzaCB0YWJsZXMgYXQgb25jZSAqLwotY2hhciAqaDsJCQkvKiBwb2ludHMgdG8gY3VyZW50IGhhc2hfY29udHJvbCAqLwotY2hhciAqKnBwOwotY2hhciAqcDsKLWNoYXIgKm5hbWU7Ci1jaGFyICp2YWx1ZTsKLWludCBzaXplOwotaW50IHVzZWQ7Ci1jaGFyIGNvbW1hbmQ7Ci1pbnQgbnVtYmVyOwkJCS8qIG51bWJlciAwOlRBQkxFUy0xIG9mIGN1cnJlbnQgaGFzaGVkICovCi0JCQkJLyogc3ltYm9sIHRhYmxlICovCi0KLWludAotbWFpbiAoKQotewotICB2b2lkIGFwcGxpY2F0ZWUgKCk7Ci0gIHZvaWQgZGVzdHJveSAoKTsKLSAgY2hhciAqd2hhdCAoKTsKLSAgaW50ICppcDsKLQotICBudW1iZXIgPSAwOwotICBoID0gMDsKLSAgcHJpbnRmICgidHlwZSBoIDxSRVRVUk4+IGZvciBoZWxwXG4iKTsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwcmludGYgKCJoYXNoX3Rlc3QgY29tbWFuZDogIik7Ci0gICAgICBnZXRzIChhbnN3ZXIpOwotICAgICAgY29tbWFuZCA9IGFuc3dlclswXTsKLSAgICAgIGlmIChpc3VwcGVyIChjb21tYW5kKSkKLQljb21tYW5kID0gdG9sb3dlciAoY29tbWFuZCk7CS8qIGVjY2ghICovCi0gICAgICBzd2l0Y2ggKGNvbW1hbmQpCi0JewotCWNhc2UgJyMnOgotCSAgcHJpbnRmICgib2xkIGhhc2ggdGFibGUgIz0lZC5cbiIsIG51bWJlcik7Ci0JICB3aGF0dGFibGUgKCk7Ci0JICBicmVhazsKLQljYXNlICc/JzoKLQkgIGZvciAocHAgPSBoYXNodGFibGU7IHBwIDwgaGFzaHRhYmxlICsgVEFCTEVTOyBwcCsrKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiYWRkcmVzcyBvZiBoYXNoIHRhYmxlICMlZCBjb250cm9sIGJsb2NrIGlzICV4eFxuIgotCQkgICAgICAscHAgLSBoYXNodGFibGUsICpwcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgaGFzaF90cmF2ZXJzZSAoaCwgYXBwbGljYXRlZSk7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGhhc2hfdHJhdmVyc2UgKGgsIGRlc3Ryb3kpOwotCSAgaGFzaF9kaWUgKGgpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBwID0gaGFzaF9maW5kIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpKTsKLQkgIHByaW50ZiAoInZhbHVlIG9mIFwiJXNcIiBpcyBcIiVzXCJcbiIsIG5hbWUsIHAgPyBwIDogIk5PVC1QUkVTRU5UIik7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHByaW50ZiAoIiMgc2hvdyBvbGQsIHNlbGVjdCBuZXcgZGVmYXVsdCBoYXNoIHRhYmxlIG51bWJlclxuIik7Ci0JICBwcmludGYgKCI/IGRpc3BsYXkgYWxsIGhhc2h0YWJsZSBjb250cm9sIGJsb2NrIGFkZHJlc3Nlc1xuIik7Ci0JICBwcmludGYgKCJhIGFwcGx5IGEgc2ltcGxlIGRpc3BsYXktZXIgdG8gZWFjaCBzeW1ib2wgaW4gdGFibGVcbiIpOwotCSAgcHJpbnRmICgiZCBkaWU6IGRlc3Ryb3kgaGFzaHRhYmxlXG4iKTsKLQkgIHByaW50ZiAoImYgZmluZCB2YWx1ZSBvZiBub21pbmF0ZWQgc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoImggdGhpcyBoZWxwXG4iKTsKLQkgIHByaW50ZiAoImkgaW5zZXJ0IHZhbHVlIGludG8gc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoImogamFtIHZhbHVlIGludG8gc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoIm4gbmV3IGhhc2h0YWJsZVxuIik7Ci0JICBwcmludGYgKCJyIHJlcGxhY2UgYSB2YWx1ZSB3aXRoIGFub3RoZXJcbiIpOwotCSAgcHJpbnRmICgicyBzYXkgd2hhdCAlJSBvZiB0YWJsZSBpcyB1c2VkXG4iKTsKLQkgIHByaW50ZiAoInEgZXhpdCB0aGlzIHByb2dyYW1cbiIpOwotCSAgcHJpbnRmICgieCBkZWxldGUgYSBzeW1ib2wgZnJvbSB0YWJsZSwgcmVwb3J0IGl0cyB2YWx1ZVxuIik7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIHAgPSBoYXNoX2luc2VydCAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSwgdmFsdWUgPSB3aGF0ICgidmFsdWUiKSk7Ci0JICBpZiAocCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoInN5bWJvbD1cIiVzXCIgIHZhbHVlPVwiJXNcIiAgZXJyb3I9JXNcbiIsIG5hbWUsIHZhbHVlLAotCQkgICAgICBwKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBwID0gaGFzaF9qYW0gKGgsIG5hbWUgPSB3aGF0ICgic3ltYm9sIiksIHZhbHVlID0gd2hhdCAoInZhbHVlIikpOwotCSAgaWYgKHApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJzeW1ib2w9XCIlc1wiICB2YWx1ZT1cIiVzXCIgIGVycm9yPSVzXG4iLCBuYW1lLCB2YWx1ZSwgcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgaCA9IGhhc2h0YWJsZVtudW1iZXJdID0gKGNoYXIgKikgaGFzaF9uZXcgKCk7Ci0JICBicmVhazsKLQljYXNlICdxJzoKLQkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0JY2FzZSAncic6Ci0JICBwID0gaGFzaF9yZXBsYWNlIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpLCB2YWx1ZSA9IHdoYXQgKCJ2YWx1ZSIpKTsKLQkgIHByaW50ZiAoIm9sZCB2YWx1ZSB3YXMgXCIlc1wiXG4iLCBwID8gcCA6ICJ7fSIpOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBoYXNoX3NheSAoaCwgc3RhdGJ1ZiwgU1RBVEJVRlNJWkUpOwotCSAgZm9yIChpcCA9IHN0YXRidWY7IGlwIDwgc3RhdGJ1ZiArIFNUQVRCVUZTSVpFOyBpcCsrKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJWQgIiwgKmlwKTsKLQkgICAgfQotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgcCA9IGhhc2hfZGVsZXRlIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpKTsKLQkgIHByaW50ZiAoIm9sZCB2YWx1ZSB3YXMgXCIlc1wiXG4iLCBwID8gcCA6ICJ7fSIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIkkgY2FuJ3QgdW5kZXJzdGFuZCBjb21tYW5kIFwiJWNcIlxuIiwgY29tbWFuZCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1jaGFyICoKLXdoYXQgKGRlc2NyaXB0aW9uKQotICAgICBjaGFyICpkZXNjcmlwdGlvbjsKLXsKLSAgY2hhciAqcmV0dmFsOwotICBjaGFyICptYWxsb2MgKCk7Ci0KLSAgcHJpbnRmICgiICAgJXMgOiAiLCBkZXNjcmlwdGlvbik7Ci0gIGdldHMgKGFuc3dlcik7Ci0gIC8qIHdpbGwgb25lIGRheSBjbGVhbiB1cCBhbnN3ZXIgaGVyZSAqLwotICByZXR2YWwgPSBtYWxsb2MgKHN0cmxlbiAoYW5zd2VyKSArIDEpOwotICBpZiAoIXJldHZhbCkKLSAgICB7Ci0gICAgICBlcnJvciAoInJvb20iKTsKLSAgICB9Ci0gICh2b2lkKSBzdHJjcHkgKHJldHZhbCwgYW5zd2VyKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi12b2lkCi1kZXN0cm95IChzdHJpbmcsIHZhbHVlKQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGNoYXIgKnZhbHVlOwotewotICBmcmVlIChzdHJpbmcpOwotICBmcmVlICh2YWx1ZSk7Ci19Ci0KLQotdm9pZAotYXBwbGljYXRlZSAoc3RyaW5nLCB2YWx1ZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBjaGFyICp2YWx1ZTsKLXsKLSAgcHJpbnRmICgiJS4yMHMtJS4yMHNcbiIsIHN0cmluZywgdmFsdWUpOwotfQotCi12b2lkCi13aGF0dGFibGUgKCkJCQkvKiBkZXRlcm1pbmUgbnVtYmVyOiB3aGF0IGhhc2ggdGFibGUgdG8gdXNlICovCi0JCQkgICAgICAgIC8qIGFsc28gZGV0ZXJtaW5lIGg6IHBvaW50cyB0byBoYXNoX2NvbnRyb2wgKi8KLXsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAgIHdoYXQgaGFzaCB0YWJsZSAoJWQ6JWQpID8gICIsIDAsIFRBQkxFUyAtIDEpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIHNzY2FuZiAoYW5zd2VyLCAiJWQiLCAmbnVtYmVyKTsKLSAgICAgIGlmIChudW1iZXIgPj0gMCAmJiBudW1iZXIgPCBUQUJMRVMpCi0JewotCSAgaCA9IGhhc2h0YWJsZVtudW1iZXJdOwotCSAgaWYgKCFoKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgid2FybmluZzogY3VycmVudCBoYXNoLXRhYmxlLSMlZC4gaGFzIG5vIGhhc2gtY29udHJvbFxuIiwgbnVtYmVyKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCJpbnZhbGlkIGhhc2ggdGFibGUgbnVtYmVyOiAlZFxuIiwgbnVtYmVyKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYgLyogI2lmZGVmIFRFU1QgKi8KLQotLyogZW5kIG9mIGhhc2guYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2hhc2guaCBiL2dhcy9oYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTlkOWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2hhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIGhhc2guaCAtLSBoZWFkZXIgZmlsZSBmb3IgZ2FzIGhhc2ggdGFibGUgcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBIQVNIX0gKLSNkZWZpbmUgSEFTSF9ICi0KLXN0cnVjdCBoYXNoX2NvbnRyb2w7Ci0KLS8qIENyZWF0ZSBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybiBhIGNvbnRyb2wgYmxvY2suICAqLwotCi1leHRlcm4gc3RydWN0IGhhc2hfY29udHJvbCAqaGFzaF9uZXcgUEFSQU1TICgodm9pZCkpOwotCi0vKiBEZWxldGUgYSBoYXNoIHRhYmxlLCBmcmVlaW5nIGFsbCBhbGxvY2F0ZWQgbWVtb3J5LiAgKi8KLQotZXh0ZXJuIHZvaWQgaGFzaF9kaWUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqKSk7Ci0KLS8qIEluc2VydCBhbiBlbnRyeSBpbnRvIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBOVUxMIG9uIHN1Y2Nlc3MuCi0gICBPbiBlcnJvciwgaXQgcmV0dXJucyBhIHByaW50YWJsZSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgZXJyb3IuICBJdAotICAgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBlcnJvciBpZiB0aGUgZW50cnkgYWxyZWFkeSBleGlzdHMgaW4gdGhlCi0gICBoYXNoIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmhhc2hfaW5zZXJ0IFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwKLQkJCQkJY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKTsKLQotLyogSW5zZXJ0IG9yIHJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIE5VTEwgb24KLSAgIHN1Y2Nlc3MuICBPbiBlcnJvciwgaXQgcmV0dXJucyBhIHByaW50YWJsZSBzdHJpbmcgaW5kaWNhdGluZyB0aGUKLSAgIGVycm9yLiAgSWYgYW4gZW50cnkgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyByZXBsYWNlZC4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpoYXNoX2phbSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJICAgICBjb25zdCBjaGFyICprZXksIFBUUiB2YWx1ZSkpOwotCi0vKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgb2xkCi0gICB2YWx1ZSBzdG9yZWQgZm9yIHRoZSBlbnRyeS4gIElmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQgaW4gdGhlIGhhc2gKLSAgIHRhYmxlLCB0aGlzIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBOVUxMLiAgKi8KLQotZXh0ZXJuIFBUUiBoYXNoX3JlcGxhY2UgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICprZXksCi0JCQkJIFBUUiB2YWx1ZSkpOwotCi0vKiBGaW5kIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZSwgcmV0dXJuaW5nIGl0cyB2YWx1ZS4gIFJldHVybnMgTlVMTAotICAgaWYgdGhlIGVudHJ5IGlzIG5vdCBmb3VuZC4gICovCi0KLWV4dGVybiBQVFIgaGFzaF9maW5kIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqa2V5KSk7Ci0KLS8qIERlbGV0ZSBhbiBlbnRyeSBmcm9tIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkCi0gICBmb3IgdGhhdCBlbnRyeSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWNoIGVudHJ5LiAgKi8KLQotZXh0ZXJuIFBUUiBoYXNoX2RlbGV0ZSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKmtleSkpOwotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUuICBDYWxsIHRoZSBmdW5jdGlvbiBvbiBldmVyeSBlbnRyeSBpbiB0aGUKLSAgIGhhc2ggdGFibGUuICAqLwotCi1leHRlcm4gdm9pZCBoYXNoX3RyYXZlcnNlIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwKLQkJCQkgICB2b2lkICgqcGZuKSAoY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKSk7Ci0KLS8qIFByaW50IGhhc2ggdGFibGUgc3RhdGlzdGljcyBvbiB0aGUgc3BlY2lmaWVkIGZpbGUuICBOQU1FIGlzIHRoZQotICAgbmFtZSBvZiB0aGUgaGFzaCB0YWJsZSwgdXNlZCBmb3IgcHJpbnRpbmcgYSBoZWFkZXIuICAqLwotCi1leHRlcm4gdm9pZCBoYXNoX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICBzdHJ1Y3QgaGFzaF9jb250cm9sICopKTsKLQotI2VuZGlmIC8qIEhBU0hfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2lucHV0LWZpbGUuYyBiL2dhcy9pbnB1dC1maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGY2ZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2lucHV0LWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKiBpbnB1dF9maWxlLmMgLSBEZWFsIHdpdGggSW5wdXQgRmlsZXMgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBDb25maW5lcyBhbGwgZGV0YWlscyBvZiByZWFkaW5nIHNvdXJjZSBieXRlcyB0byB0aGlzIG1vZHVsZS4KLSAqIEFsbCBPL1Mgc3BlY2lmaWMgY3JvY2tzIHNob3VsZCBsaXZlIGhlcmUuCi0gKiBXaGF0IHdlIGxvc2UgaW4gImVmZmljaWVuY3kiIHdlIGdhaW4gaW4gbW9kdWxhcml0eS4KLSAqIE5vdGUgd2UgZG9uJ3QgbmVlZCB0byAjaW5jbHVkZSB0aGUgImFzLmgiIGZpbGUuIE5vIGNvbW1vbiBjb3VwbGluZyEKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiaW5wdXQtZmlsZS5oIgotCi1zdGF0aWMgaW50IGlucHV0X2ZpbGVfZ2V0IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgbm9uLXplcm8gaWYgdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIHJlYWQgc2hvdWxkIGJlCi0gICBwcmVwcm9jZXNzZWQgYnkgYXBwLiAgSXQgaXMgemVybyBpZiB0aGUgZmlsZSBjYW4gYmUgcmVhZCBzdHJhaWdodCBpbi4KLSAgICovCi1pbnQgcHJlcHJvY2VzcyA9IDA7Ci0KLS8qCi0gKiBUaGlzIGNvZGUgb3BlbnMgYSBmaWxlLCB0aGVuIGRlbGl2ZXJzIEJVRkZFUl9TSVpFIGNoYXJhY3RlcgotICogY2h1bmtzIG9mIHRoZSBmaWxlIG9uIGRlbWFuZC4KLSAqIEJVRkZFUl9TSVpFIGlzIHN1cHBvc2VkIHRvIGJlIGEgbnVtYmVyIGNob3NlbiBmb3Igc3BlZWQuCi0gKiBUaGUgY2FsbGVyIG9ubHkgYXNrcyBvbmNlIHdoYXQgQlVGRkVSX1NJWkUgaXMsIGFuZCBhc2tzIGJlZm9yZQotICogdGhlIG5hdHVyZSBvZiB0aGUgaW5wdXQgZmlsZXMgKGlmIGFueSkgaXMga25vd24uCi0gKi8KLQotI2RlZmluZSBCVUZGRVJfU0laRSAoMzIgKiAxMDI0KQotCi0vKgotICogV2UgdXNlIHN0YXRpYyBkYXRhOiB0aGUgZGF0YSBhcmVhIGlzIG5vdCBzaGFyYWJsZS4KLSAqLwotCi1zdGF0aWMgRklMRSAqZl9pbjsKLXN0YXRpYyBjaGFyICpmaWxlX25hbWU7Ci0KLS8qIFN0cnVjdCBmb3Igc2F2aW5nIHRoZSBzdGF0ZSBvZiB0aGlzIG1vZHVsZSBmb3IgZmlsZSBpbmNsdWRlcy4gICovCi1zdHJ1Y3Qgc2F2ZWRfZmlsZQotICB7Ci0gICAgRklMRSAqZl9pbjsKLSAgICBjaGFyICpmaWxlX25hbWU7Ci0gICAgaW50IHByZXByb2Nlc3M7Ci0gICAgY2hhciAqYXBwX3NhdmU7Ci0gIH07Ci0MCi0vKiBUaGVzZSBob29rcyBhY2NvbW9kYXRlIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMuICovCi0KLXZvaWQgCi1pbnB1dF9maWxlX2JlZ2luICgpCi17Ci0gIGZfaW4gPSAoRklMRSAqKSAwOwotfQotCi12b2lkIAotaW5wdXRfZmlsZV9lbmQgKCkKLXsKLX0KLQotLyogUmV0dXJuIEJVRkZFUl9TSVpFLiAqLwotdW5zaWduZWQgaW50IAotaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKQotewotICByZXR1cm4gKEJVRkZFUl9TSVpFKTsKLX0KLQotaW50IAotaW5wdXRfZmlsZV9pc19vcGVuICgpCi17Ci0gIHJldHVybiBmX2luICE9IChGSUxFICopIDA7Ci19Ci0KLS8qIFB1c2ggdGhlIHN0YXRlIG9mIG91ciBpbnB1dCwgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBzYXZlZCBpbmZvIHRoYXQKLSAgIGNhbiBiZSByZXN0b3JlZCB3aXRoIGlucHV0X2ZpbGVfcG9wICgpLiAgKi8KLWNoYXIgKgotaW5wdXRfZmlsZV9wdXNoICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzYXZlZF9maWxlICpzYXZlZDsKLQotICBzYXZlZCA9IChzdHJ1Y3Qgc2F2ZWRfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKnNhdmVkKTsKLQotICBzYXZlZC0+Zl9pbiA9IGZfaW47Ci0gIHNhdmVkLT5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0gIHNhdmVkLT5wcmVwcm9jZXNzID0gcHJlcHJvY2VzczsKLSAgaWYgKHByZXByb2Nlc3MpCi0gICAgc2F2ZWQtPmFwcF9zYXZlID0gYXBwX3B1c2ggKCk7Ci0KLSAgaW5wdXRfZmlsZV9iZWdpbiAoKTsJCS8qIEluaXRpYWxpemUgZm9yIG5ldyBmaWxlICovCi0KLSAgcmV0dXJuIChjaGFyICopIHNhdmVkOwotfQotCi12b2lkCi1pbnB1dF9maWxlX3BvcCAoYXJnKQotICAgICBjaGFyICphcmc7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzYXZlZF9maWxlICpzYXZlZCA9IChzdHJ1Y3Qgc2F2ZWRfZmlsZSAqKSBhcmc7Ci0KLSAgaW5wdXRfZmlsZV9lbmQgKCk7CQkvKiBDbG9zZSBvdXQgb2xkIGZpbGUgKi8KLQotICBmX2luID0gc2F2ZWQtPmZfaW47Ci0gIGZpbGVfbmFtZSA9IHNhdmVkLT5maWxlX25hbWU7Ci0gIHByZXByb2Nlc3MgPSBzYXZlZC0+cHJlcHJvY2VzczsKLSAgaWYgKHByZXByb2Nlc3MpCi0gICAgYXBwX3BvcCAoc2F2ZWQtPmFwcF9zYXZlKTsKLQotICBmcmVlIChhcmcpOwotfQotDAotdm9pZAotaW5wdXRfZmlsZV9vcGVuIChmaWxlbmFtZSwgcHJlKQotICAgICBjaGFyICpmaWxlbmFtZTsJCS8qICIiIG1lYW5zIHVzZSBzdGRpbi4gTXVzdCBub3QgYmUgMC4gKi8KLSAgICAgaW50IHByZTsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgYnVmWzgwXTsKLQotICBwcmVwcm9jZXNzID0gcHJlOwotCi0gIGFzc2VydCAoZmlsZW5hbWUgIT0gMCk7CS8qIEZpbGVuYW1lIG1heSBub3QgYmUgTlVMTC4gKi8KLSAgaWYgKGZpbGVuYW1lWzBdKQotICAgIHsJCQkJLyogV2UgaGF2ZSBhIGZpbGUgbmFtZS4gU3VjayBpdCBhbmQgc2VlLiAqLwotICAgICAgZl9pbiA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLSAgICAgIGZpbGVfbmFtZSA9IGZpbGVuYW1lOwotICAgIH0KLSAgZWxzZQotICAgIHsJCQkJLyogdXNlIHN0ZGluIGZvciB0aGUgaW5wdXQgZmlsZS4gKi8KLSAgICAgIGZfaW4gPSBzdGRpbjsKLSAgICAgIGZpbGVfbmFtZSA9IF8oIntzdGFuZGFyZCBpbnB1dH0iKTsJLyogRm9yIGVycm9yIG1lc3NhZ2VzLiAqLwotICAgIH0KLSAgaWYgKGZfaW4gPT0gKEZJTEUgKikgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhbid0IG9wZW4gJXMgZm9yIHJlYWRpbmcuIiksIGZpbGVfbmFtZSk7Ci0gICAgICBhc19wZXJyb3IgKCIlcyIsIGZpbGVfbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGMgPSBnZXRjIChmX2luKTsKLSAgaWYgKGMgPT0gJyMnKQotICAgIHsJCQkJLyogQmVnaW5zIHdpdGggY29tbWVudCwgbWF5IG5vdCB3YW50IHRvIHByZXByb2Nlc3MgKi8KLSAgICAgIGMgPSBnZXRjIChmX2luKTsKLSAgICAgIGlmIChjID09ICdOJykKLQl7Ci0JICBmZ2V0cyAoYnVmLCA4MCwgZl9pbik7Ci0JICBpZiAoIXN0cmNtcCAoYnVmLCAiT19BUFBcbiIpKQotCSAgICBwcmVwcm9jZXNzID0gMDsKLQkgIGlmICghc3RyY2hyIChidWYsICdcbicpKQotCSAgICB1bmdldGMgKCcjJywgZl9pbik7CS8qIEl0IHdhcyBsb25nZXIgKi8KLQkgIGVsc2UKLQkgICAgdW5nZXRjICgnXG4nLCBmX2luKTsKLQl9Ci0gICAgICBlbHNlIGlmIChjID09ICdcbicpCi0JdW5nZXRjICgnXG4nLCBmX2luKTsKLSAgICAgIGVsc2UKLQl1bmdldGMgKCcjJywgZl9pbik7Ci0gICAgfQotICBlbHNlCi0gICAgdW5nZXRjIChjLCBmX2luKTsKLX0KLQotLyogQ2xvc2UgaW5wdXQgZmlsZS4gICovCi12b2lkIAotaW5wdXRfZmlsZV9jbG9zZSAoKQotewotICBpZiAoZl9pbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZjbG9zZSAoZl9pbik7Ci0gICAgfQkJCQkvKiBkb24ndCBjbG9zZSBhIG51bGwgZmlsZSBwb2ludGVyICovCi0gIGZfaW4gPSAwOwotfQkJCQkvKiBpbnB1dF9maWxlX2Nsb3NlKCkgKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gZG9fc2NydWJfY2hhcnMuICAqLwotCi1zdGF0aWMgaW50Ci1pbnB1dF9maWxlX2dldCAoYnVmLCBidWZsZW4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGJ1ZmxlbjsKLXsKLSAgaW50IHNpemU7Ci0KLSAgc2l6ZSA9IGZyZWFkIChidWYsIHNpemVvZiAoY2hhciksIGJ1ZmxlbiwgZl9pbik7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkNhbid0IHJlYWQgZnJvbSAlcyIpLCBmaWxlX25hbWUpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogUmVhZCBhIGJ1ZmZlciBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgKi8KLQotY2hhciAqCi1pbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIgKHdoZXJlKQotICAgICBjaGFyICp3aGVyZTsJCS8qIFdoZXJlIHRvIHBsYWNlIDFzdCBjaGFyYWN0ZXIgb2YgbmV3IGJ1ZmZlci4gKi8KLXsKLSAgY2hhciAqcmV0dXJuX3ZhbHVlOwkJLyogLT4gTGFzdCBjaGFyIG9mIHdoYXQgd2UgcmVhZCwgKyAxLiAqLwotICByZWdpc3RlciBpbnQgc2l6ZTsKLQotICBpZiAoZl9pbiA9PSAoRklMRSAqKSAwKQotICAgIHJldHVybiAwOwotICAvKgotICAgKiBmZmx1c2ggKHN0ZGluKTsgY291bGQgYmUgZG9uZSBoZXJlIGlmIHlvdSB3YW50IHRvIHN5bmNocm9uaXNlCi0gICAqIHN0ZGluIGFuZCBzdGRvdXQsIGZvciB0aGUgY2FzZSB3aGVyZSBvdXIgaW5wdXQgZmlsZSBpcyBzdGRpbi4KLSAgICogU2luY2UgdGhlIGFzc2VtYmxlciBzaG91bGRuJ3QgZG8gYW55IG91dHB1dCB0byBzdGRvdXQsIHdlCi0gICAqIGRvbid0IGJvdGhlciB0byBzeW5jaCBvdXRwdXQgYW5kIGlucHV0LgotICAgKi8KLSAgaWYgKHByZXByb2Nlc3MpCi0gICAgc2l6ZSA9IGRvX3NjcnViX2NoYXJzIChpbnB1dF9maWxlX2dldCwgd2hlcmUsIEJVRkZFUl9TSVpFKTsKLSAgZWxzZQotICAgIHNpemUgPSBmcmVhZCAod2hlcmUsIHNpemVvZiAoY2hhciksIEJVRkZFUl9TSVpFLCBmX2luKTsKLSAgaWYgKHNpemUgPCAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiQ2FuJ3QgcmVhZCBmcm9tICVzIiksIGZpbGVfbmFtZSk7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0gIGlmIChzaXplKQotICAgIHJldHVybl92YWx1ZSA9IHdoZXJlICsgc2l6ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmY2xvc2UgKGZfaW4pKQotCWFzX3BlcnJvciAoXygiQ2FuJ3QgY2xvc2UgJXMiKSwgZmlsZV9uYW1lKTsKLSAgICAgIGZfaW4gPSAoRklMRSAqKSAwOwotICAgICAgcmV0dXJuX3ZhbHVlID0gMDsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotLyogZW5kIG9mIGlucHV0LWZpbGUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2lucHV0LWZpbGUuaCBiL2dhcy9pbnB1dC1maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWJmMjguLjAwMDAwMDAKLS0tIGEvZ2FzL2lucHV0LWZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIGlucHV0X2ZpbGUuaCBoZWFkZXIgZm9yIGlucHV0LWZpbGUuYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qImlucHV0X2ZpbGUuYyI6T3BlcmF0aW5nLXN5c3RlbSBkZXBlbmRhbnQgZnVuY3Rpb25zIHRvIHJlYWQgc291cmNlIGZpbGVzLiovCi0KLQotLyoKLSAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCB0aGlzIG1vZHVsZSBtdXN0IHByb3ZpZGUgdGhlCi0gKiBmb2xsb3dpbmcgc2VydmljZXMgdG8gaXRzIGNhbGxlcnMuCi0gKgotICogaW5wdXRfZmlsZV9iZWdpbigpCQkJQ2FsbCBvbmNlIGJlZm9yZSBhbnl0aGluZyBlbHNlLgotICoKLSAqIGlucHV0X2ZpbGVfZW5kKCkJCQlDYWxsIG9uY2UgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlLgotICoKLSAqIGlucHV0X2ZpbGVfYnVmZmVyX3NpemUoKQkJQ2FsbCBhbnl0aW1lLiBSZXR1cm5zIGxhcmdlc3QgcG9zc2libGUKLSAqCQkJCQlkZWxpdmVyeSBmcm9tCi0gKgkJCQkJaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKCkuCi0gKgotICogaW5wdXRfZmlsZV9vcGVuKG5hbWUpCQlDYWxsIG9uY2UgZm9yIGVhY2ggaW5wdXQgZmlsZS4KLSAqCi0gKiBpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIod2hlcmUpCUNhbGwgb25jZSB0byBnZXQgZWFjaCBuZXcgYnVmZmVyLgotICoJCQkJCVJldHVybiAwOiBubyBtb3JlIGNoYXJzIGxlZnQgaW4gZmlsZSwKLSAqCQkJCQkgICB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KLSAqCQkJCQlPdGhlcndpc2U6IHJldHVybiBhIHBvaW50ZXIgdG8ganVzdAotICoJCQkJCSAgIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciB3ZSByZWFkCi0gKgkJCQkJICAgaW50byB0aGUgYnVmZmVyLgotICoJCQkJCUlmIHdlIGNhbiBvbmx5IHJlYWQgMCBjaGFyYWN0ZXJzLCB0aGVuCi0gKgkJCQkJZW5kLW9mLWZpbGUgaXMgZmFrZWQuCi0gKgotICogaW5wdXRfZmlsZV9wdXNoKCkJCQlQdXNoIHN0YXRlLCB3aGljaCBjYW4gYmUgcmVzdG9yZWQKLSAqCQkJCQlsYXRlci4gIERvZXMgaW1wbGljaXQgaW5wdXRfZmlsZV9iZWdpbi4KLSAqCQkJCQlSZXR1cm5zIGNoYXIgKiB0byBzYXZlZCBzdGF0ZS4KLSAqCi0gKiBpbnB1dF9maWxlX3BvcCAoYXJnKQkJCVBvcHMgcHJldmlvdXNseSBzYXZlZCBzdGF0ZS4KLSAqCi0gKiBpbnB1dF9maWxlX2Nsb3NlICgpCQkJQ2xvc2VzIG9wZW5lZCBmaWxlLgotICoKLSAqIEFsbCBlcnJvcnMgYXJlIHJlcG9ydGVkICh1c2luZyBhc19wZXJyb3IpIHNvIGNhbGxlciBkb2Vzbid0IGhhdmUgdG8gdGhpbmsKLSAqIGFib3V0IEkvTyBlcnJvcnMuIE5vIEkvTyBlcnJvcnMgYXJlIGZhdGFsOiBhbiBlbmQtb2YtZmlsZSBtYXkgYmUgZmFrZWQuCi0gKi8KLQotY2hhciAqaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIFBBUkFNUyAoKGNoYXIgKndoZXJlKSk7Ci1jaGFyICppbnB1dF9maWxlX3B1c2ggUEFSQU1TICgodm9pZCkpOwotdW5zaWduZWQgaW50IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgUEFSQU1TICgodm9pZCkpOwotaW50IGlucHV0X2ZpbGVfaXNfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X2ZpbGVfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9maWxlX2Nsb3NlIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9lbmQgUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9maWxlX29wZW4gUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGludCBwcmUpKTsKLXZvaWQgaW5wdXRfZmlsZV9wb3AgUEFSQU1TICgoY2hhciAqYXJnKSk7Ci0KLS8qIGVuZCBvZiBpbnB1dF9maWxlLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1zY3J1Yi5jIGIvZ2FzL2lucHV0LXNjcnViLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTNiYjMuLjAwMDAwMDAKLS0tIGEvZ2FzL2lucHV0LXNjcnViLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotLyogaW5wdXRfc2NydWIuYyAtIEJyZWFrIHVwIGlucHV0IGJ1ZmZlcnMgaW50byB3aG9sZSBudW1iZXJzIG9mIGxpbmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+CQkvKiBOZWVkIHRoaXMgdG8gbWFrZSBlcnJubyBkZWNsYXJhdGlvbiByaWdodCAqLwotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiaW5wdXQtZmlsZS5oIgotI2luY2x1ZGUgInNiLmgiCi0jaW5jbHVkZSAibGlzdGluZy5oIgotCi0vKgotICogTy9TIGluZGVwZW5kZW50IG1vZHVsZSB0byBzdXBwbHkgYnVmZmVycyBvZiBzYW5pdGlzZWQgc291cmNlIGNvZGUKLSAqIHRvIHJlc3Qgb2YgYXNzZW1ibGVyLiAgV2UgZ2V0IHNhbml0aXNlZCBpbnB1dCBkYXRhIG9mIGFyYml0cmFyeSBsZW5ndGguCi0gKiBXZSBicmVhayB0aGVzZSBidWZmZXJzIG9uIGxpbmUgYm91bmRhcmllcywgcmVjb21iaW5lIHBpZWNlcyB0aGF0Ci0gKiB3ZXJlIGJyb2tlbiBhY3Jvc3MgYnVmZmVycywgYW5kIHJldHVybiBhIGJ1ZmZlciBvZiBmdWxsIGxpbmVzIHRvCi0gKiB0aGUgY2FsbGVyLgotICogVGhlIGxhc3QgcGFydGlhbCBsaW5lIGJlZ2lucyB0aGUgbmV4dCBidWZmZXIgd2UgYnVpbGQgYW5kIHJldHVybiB0byBjYWxsZXIuCi0gKiBUaGUgYnVmZmVyIHJldHVybmVkIHRvIGNhbGxlciBpcyBwcmVjZWVkZWQgYnkgQkVGT1JFX1NUUklORyBhbmQgZm9sbG93ZWQKLSAqIGJ5IEFGVEVSX1NUUklORywgYXMgc2VudGluZWxzLiBUaGUgbGFzdCBjaGFyYWN0ZXIgYmVmb3JlIEFGVEVSX1NUUklORwotICogaXMgYSBuZXdsaW5lLgotICogQWxzbyBsb29rcyBhZnRlciBsaW5lIG51bWJlcnMsIGZvciBlLmcuIGVycm9yIG1lc3NhZ2VzLgotICovCi0KLS8qCi0gKiBXZSBkb24ndCBjYXJlIGhvdyBmaWx0aHkgb3VyIGJ1ZmZlcnMgYXJlLCBidXQgb3VyIGNhbGxlcnMgYXNzdW1lCi0gKiB0aGF0IHRoZSBmb2xsb3dpbmcgc2FuaXRhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuCi0gKgotICogTm8gY29tbWVudHMsIHJlZHVjZSBhIGNvbW1lbnQgdG8gYSBzcGFjZS4KLSAqIFJlZHVjZSBhIHRhYiB0byBhIHNwYWNlIHVubGVzcyBpdCBpcyAxc3QgY2hhciBvZiBsaW5lLgotICogQWxsIG11bHRpcGxlIHRhYnMgYW5kIHNwYWNlcyBjb2xsYXBzZWQgaW50byAxIGNoYXIuIFRhYiBvbmx5Ci0gKiAgIGxlZ2FsIGlmIDFzdCBjaGFyIG9mIGxpbmUuCi0gKiAjIGxpbmUgZmlsZSBzdGF0ZW1lbnRzIGNvbnZlcnRlZCB0byAubGluZSB4Oy5maWxlIHk7IHN0YXRlbWVudHMuCi0gKiBFc2NhcGVkIG5ld2xpbmVzIGF0IGVuZCBvZiBsaW5lOiByZW1vdmUgdGhlbSBidXQgYWRkIGFzIG1hbnkgbmV3bGluZXMKLSAqICAgdG8gZW5kIG9mIHN0YXRlbWVudCBhcyB5b3UgcmVtb3ZlZCBpbiB0aGUgbWlkZGxlLCB0byBzeW5jaCBsaW5lIG51bWJlcnMuCi0gKi8KLQwKLSNkZWZpbmUgQkVGT1JFX1NUUklORyAoIlxuIikKLSNkZWZpbmUgQUZURVJfU1RSSU5HICgiXDAiKQkvKiBtZW1jcHkgb2YgMCBjaGFycyBtaWdodCBjaG9rZS4gKi8KLSNkZWZpbmUgQkVGT1JFX1NJWkUgKDEpCi0jZGVmaW5lIEFGVEVSX1NJWkUgICgxKQotCi1zdGF0aWMgY2hhciAqYnVmZmVyX3N0YXJ0OwkvKi0+MXN0IGNoYXIgb2YgZnVsbCBidWZmZXIgYXJlYS4gKi8KLXN0YXRpYyBjaGFyICpwYXJ0aWFsX3doZXJlOwkvKi0+YWZ0ZXIgbGFzdCBmdWxsIGxpbmUgaW4gYnVmZmVyLiAqLwotc3RhdGljIGludCBwYXJ0aWFsX3NpemU7CS8qID49MC4gTnVtYmVyIG9mIGNoYXJzIGluIHBhcnRpYWwgbGluZSBpbiBidWZmZXIuICovCi1zdGF0aWMgY2hhciBzYXZlX3NvdXJjZVtBRlRFUl9TSVpFXTsKLS8qIEJlY2F1c2Ugd2UgbmVlZCBBRlRFUl9TVFJJTkcganVzdCBhZnRlciBsYXN0ICovCi0vKiBmdWxsIGxpbmUsIGl0IGNsb2JiZXJzIDFzdCBwYXJ0IG9mIHBhcnRpYWwgKi8KLS8qIGxpbmUuIFNvIHdlIHByZXNlcnZlIDFzdCBwYXJ0IG9mIHBhcnRpYWwgKi8KLS8qIGxpbmUgaGVyZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYnVmZmVyX2xlbmd0aDsJLyogV2hhdCBpcyB0aGUgbGFyZ2VzdCBzaXplIGJ1ZmZlciB0aGF0ICovCi0vKiBpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIoKSBjb3VsZCAqLwotLyogcmV0dXJuIHRvIHVzPyAqLwotCi0vKiBUaGUgaW5kZXggaW50byBhbiBzYiBzdHJ1Y3R1cmUgd2UgYXJlIHJlYWRpbmcgZnJvbS4gIC0xIGlmIG5vbmUuICAqLwotc3RhdGljIGludCBzYl9pbmRleCA9IC0xOwotCi0vKiBJZiB3ZSBhcmUgcmVhZGluZyBmcm9tIGFuIHNiIHN0cnVjdHVyZSwgdGhpcyBpcyBpdC4gICovCi1zdGF0aWMgc2IgZnJvbV9zYjsKLQotLyogVGhlIG51bWJlciBvZiBuZXN0ZWQgc2Igc3RydWN0dXJlcyB3ZSBoYXZlIGluY2x1ZGVkLiAgKi8KLWludCBtYWNyb19uZXN0OwotCi0vKiBXZSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHNvdXJjZSBmaWxlIG9wZW4gYXQgb25jZSwgdGhvdWdoIHRoZSBpbmZvIGZvciBhbGwKLSAgIGJ1dCB0aGUgbGF0ZXN0IG9uZSBhcmUgc2F2ZWQgb2ZmIGluIGEgc3RydWN0IGlucHV0X3NhdmUuICBUaGVzZSBmaWxlcyByZW1haW4KLSAgIG9wZW4sIHNvIHdlIGFyZSBsaW1pdGVkIGJ5IHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlcyBhbGxvd2VkIGJ5IHRoZQotICAgdW5kZXJseWluZyBPUy4gV2UgbWF5IGFsc28gc2VxdWVudGlhbGx5IHJlYWQgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZSBpbiBhbgotICAgYXNzZW1ibHkuICovCi0KLS8qIFdlIG11c3QgdHJhY2sgdGhlIHBoeXNpY2FsIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZvciBlcnJvciBtZXNzYWdlcy4gV2UgYWxzbwotICAgdHJhY2sgYSAibG9naWNhbCIgZmlsZSBhbmQgbGluZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byAoQz8pICBjb21waWxlcgotICAgc291cmNlIGxpbmUgbnVtYmVycy4gIFdoZW5ldmVyIHdlIG9wZW4gYSBmaWxlIHdlIG11c3QgZmlsbCBpbgotICAgcGh5c2ljYWxfaW5wdXRfZmlsZS4gU28gaWYgaXQgaXMgTlVMTCB3ZSBoYXZlIG5vdCBvcGVuZWQgYW55IGZpbGVzIHlldC4gKi8KLQotc3RhdGljIGNoYXIgKnBoeXNpY2FsX2lucHV0X2ZpbGU7Ci1zdGF0aWMgY2hhciAqbG9naWNhbF9pbnB1dF9maWxlOwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBsaW5lX251bWJlclQ7CS8qIDEtb3JpZ2luIGxpbmUgbnVtYmVyIGluIGEgc291cmNlIGZpbGUuICovCi0vKiBBIGxpbmUgZW5kcyBpbiAnXG4nIG9yIGVvZi4gKi8KLQotc3RhdGljIGxpbmVfbnVtYmVyVCBwaHlzaWNhbF9pbnB1dF9saW5lOwotc3RhdGljIGludCBsb2dpY2FsX2lucHV0X2xpbmU7Ci0KLS8qIFN0cnVjdCB1c2VkIHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBpbnB1dCBoYW5kbGVyIGR1cmluZyBpbmNsdWRlIGZpbGVzICovCi1zdHJ1Y3QgaW5wdXRfc2F2ZQotICB7Ci0gICAgY2hhciAqYnVmZmVyX3N0YXJ0OwotICAgIGNoYXIgKnBhcnRpYWxfd2hlcmU7Ci0gICAgaW50IHBhcnRpYWxfc2l6ZTsKLSAgICBjaGFyIHNhdmVfc291cmNlW0FGVEVSX1NJWkVdOwotICAgIHVuc2lnbmVkIGludCBidWZmZXJfbGVuZ3RoOwotICAgIGNoYXIgKnBoeXNpY2FsX2lucHV0X2ZpbGU7Ci0gICAgY2hhciAqbG9naWNhbF9pbnB1dF9maWxlOwotICAgIGxpbmVfbnVtYmVyVCBwaHlzaWNhbF9pbnB1dF9saW5lOwotICAgIGludCBsb2dpY2FsX2lucHV0X2xpbmU7Ci0gICAgaW50IHNiX2luZGV4OwotICAgIHNiIGZyb21fc2I7Ci0gICAgc3RydWN0IGlucHV0X3NhdmUgKm5leHRfc2F2ZWRfZmlsZTsJLyogQ2hhaW4gb2YgaW5wdXRfc2F2ZXMgKi8KLSAgICBjaGFyICppbnB1dF9maWxlX3NhdmU7CS8qIFNhdmVkIHN0YXRlIG9mIGlucHV0IHJvdXRpbmVzICovCi0gICAgY2hhciAqc2F2ZWRfcG9zaXRpb247CS8qIENhbGxlcidzIHNhdmVkIHBvc2l0aW9uIGluIGJ1ZiAqLwotICB9OwotCi1zdGF0aWMgc3RydWN0IGlucHV0X3NhdmUgKmlucHV0X3NjcnViX3B1c2ggUEFSQU1TICgoY2hhciAqc2F2ZWRfcG9zaXRpb24pKTsKLXN0YXRpYyBjaGFyICppbnB1dF9zY3J1Yl9wb3AgUEFSQU1TICgoc3RydWN0IGlucHV0X3NhdmUgKmFyZykpOwotc3RhdGljIHZvaWQgYXNfMV9jaGFyIFBBUkFNUyAoKHVuc2lnbmVkIGludCBjLCBGSUxFICogc3RyZWFtKSk7Ci0KLS8qIFNhdmVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlIHRoYXQgLmluY2x1ZGUnZCB0aGlzIG9uZS4gIFdoZW4gd2UgaGl0IEVPRiwKLSAgIHdlIGF1dG9tYXRpY2FsbHkgcG9wIHRvIHRoYXQgZmlsZS4gKi8KLQotc3RhdGljIHN0cnVjdCBpbnB1dF9zYXZlICpuZXh0X3NhdmVkX2ZpbGU7Ci0KLS8qIFB1c2ggdGhlIHN0YXRlIG9mIGlucHV0IHJlYWRpbmcgYW5kIHNjcnViYmluZyBzbyB0aGF0IHdlIGNhbiAjaW5jbHVkZS4KLSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSAndm9pZCAqJyAoZnVkZ2VkIGZvciBvbGQgY29tcGlsZXJzKSB0byBhIHNhdmUKLSAgIGFyZWEsIHdoaWNoIGNhbiBiZSByZXN0b3JlZCBieSBwYXNzaW5nIGl0IHRvIGlucHV0X3NjcnViX3BvcCgpLiAqLwotc3RhdGljIHN0cnVjdCBpbnB1dF9zYXZlICoKLWlucHV0X3NjcnViX3B1c2ggKHNhdmVkX3Bvc2l0aW9uKQotICAgICBjaGFyICpzYXZlZF9wb3NpdGlvbjsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGlucHV0X3NhdmUgKnNhdmVkOwotCi0gIHNhdmVkID0gKHN0cnVjdCBpbnB1dF9zYXZlICopIHhtYWxsb2MgKHNpemVvZiAqc2F2ZWQpOwotCi0gIHNhdmVkLT5zYXZlZF9wb3NpdGlvbiA9IHNhdmVkX3Bvc2l0aW9uOwotICBzYXZlZC0+YnVmZmVyX3N0YXJ0ID0gYnVmZmVyX3N0YXJ0OwotICBzYXZlZC0+cGFydGlhbF93aGVyZSA9IHBhcnRpYWxfd2hlcmU7Ci0gIHNhdmVkLT5wYXJ0aWFsX3NpemUgPSBwYXJ0aWFsX3NpemU7Ci0gIHNhdmVkLT5idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsKLSAgc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2ZpbGUgPSBwaHlzaWNhbF9pbnB1dF9maWxlOwotICBzYXZlZC0+bG9naWNhbF9pbnB1dF9maWxlID0gbG9naWNhbF9pbnB1dF9maWxlOwotICBzYXZlZC0+cGh5c2ljYWxfaW5wdXRfbGluZSA9IHBoeXNpY2FsX2lucHV0X2xpbmU7Ci0gIHNhdmVkLT5sb2dpY2FsX2lucHV0X2xpbmUgPSBsb2dpY2FsX2lucHV0X2xpbmU7Ci0gIHNhdmVkLT5zYl9pbmRleCA9IHNiX2luZGV4OwotICBzYXZlZC0+ZnJvbV9zYiA9IGZyb21fc2I7Ci0gIG1lbWNweSAoc2F2ZWQtPnNhdmVfc291cmNlLCBzYXZlX3NvdXJjZSwgc2l6ZW9mIChzYXZlX3NvdXJjZSkpOwotICBzYXZlZC0+bmV4dF9zYXZlZF9maWxlID0gbmV4dF9zYXZlZF9maWxlOwotICBzYXZlZC0+aW5wdXRfZmlsZV9zYXZlID0gaW5wdXRfZmlsZV9wdXNoICgpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7CQkvKiBSZWluaXRpYWxpemUhICovCi0gIGxvZ2ljYWxfaW5wdXRfbGluZSA9IC0xOwotICBsb2dpY2FsX2lucHV0X2ZpbGUgPSAoY2hhciAqKSBOVUxMOwotICBidWZmZXJfbGVuZ3RoID0gaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKTsKLSAgc2JfaW5kZXggPSAtMTsKLQotICBidWZmZXJfc3RhcnQgPSB4bWFsbG9jICgoQkVGT1JFX1NJWkUgKyBidWZmZXJfbGVuZ3RoICsgYnVmZmVyX2xlbmd0aCArIEFGVEVSX1NJWkUpKTsKLSAgbWVtY3B5IChidWZmZXJfc3RhcnQsIEJFRk9SRV9TVFJJTkcsIChpbnQpIEJFRk9SRV9TSVpFKTsKLQotICByZXR1cm4gc2F2ZWQ7Ci19CQkJCS8qIGlucHV0X3NjcnViX3B1c2goKSAqLwotCi1zdGF0aWMgY2hhciAqCi1pbnB1dF9zY3J1Yl9wb3AgKHNhdmVkKQotICAgICBzdHJ1Y3QgaW5wdXRfc2F2ZSAqc2F2ZWQ7Ci17Ci0gIGNoYXIgKnNhdmVkX3Bvc2l0aW9uOwotCi0gIGlucHV0X3NjcnViX2VuZCAoKTsJCS8qIEZpbmlzaCBvZmYgb2xkIGJ1ZmZlciAqLwotCi0gIGlucHV0X2ZpbGVfcG9wIChzYXZlZC0+aW5wdXRfZmlsZV9zYXZlKTsKLSAgc2F2ZWRfcG9zaXRpb24gPSBzYXZlZC0+c2F2ZWRfcG9zaXRpb247Ci0gIGJ1ZmZlcl9zdGFydCA9IHNhdmVkLT5idWZmZXJfc3RhcnQ7Ci0gIGJ1ZmZlcl9sZW5ndGggPSBzYXZlZC0+YnVmZmVyX2xlbmd0aDsKLSAgcGh5c2ljYWxfaW5wdXRfZmlsZSA9IHNhdmVkLT5waHlzaWNhbF9pbnB1dF9maWxlOwotICBsb2dpY2FsX2lucHV0X2ZpbGUgPSBzYXZlZC0+bG9naWNhbF9pbnB1dF9maWxlOwotICBwaHlzaWNhbF9pbnB1dF9saW5lID0gc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2xpbmU7Ci0gIGxvZ2ljYWxfaW5wdXRfbGluZSA9IHNhdmVkLT5sb2dpY2FsX2lucHV0X2xpbmU7Ci0gIHNiX2luZGV4ID0gc2F2ZWQtPnNiX2luZGV4OwotICBmcm9tX3NiID0gc2F2ZWQtPmZyb21fc2I7Ci0gIHBhcnRpYWxfd2hlcmUgPSBzYXZlZC0+cGFydGlhbF93aGVyZTsKLSAgcGFydGlhbF9zaXplID0gc2F2ZWQtPnBhcnRpYWxfc2l6ZTsKLSAgbmV4dF9zYXZlZF9maWxlID0gc2F2ZWQtPm5leHRfc2F2ZWRfZmlsZTsKLSAgbWVtY3B5IChzYXZlX3NvdXJjZSwgc2F2ZWQtPnNhdmVfc291cmNlLCBzaXplb2YgKHNhdmVfc291cmNlKSk7Ci0KLSAgZnJlZSAoc2F2ZWQpOwotICByZXR1cm4gc2F2ZWRfcG9zaXRpb247Ci19Ci0MCi0KLXZvaWQKLWlucHV0X3NjcnViX2JlZ2luICgpCi17Ci0gIGtub3cgKHN0cmxlbiAoQkVGT1JFX1NUUklORykgPT0gQkVGT1JFX1NJWkUpOwotICBrbm93IChzdHJsZW4gKEFGVEVSX1NUUklORykgPT0gQUZURVJfU0laRSB8fCAoQUZURVJfU1RSSU5HWzBdID09ICdcMCcgJiYgQUZURVJfU0laRSA9PSAxKSk7Ci0KLSAgaW5wdXRfZmlsZV9iZWdpbiAoKTsKLQotICBidWZmZXJfbGVuZ3RoID0gaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKTsKLQotICBidWZmZXJfc3RhcnQgPSB4bWFsbG9jICgoQkVGT1JFX1NJWkUgKyBidWZmZXJfbGVuZ3RoICsgYnVmZmVyX2xlbmd0aCArIEFGVEVSX1NJWkUpKTsKLSAgbWVtY3B5IChidWZmZXJfc3RhcnQsIEJFRk9SRV9TVFJJTkcsIChpbnQpIEJFRk9SRV9TSVpFKTsKLQotICAvKiBMaW5lIG51bWJlciB0aGluZ3MuICovCi0gIGxvZ2ljYWxfaW5wdXRfbGluZSA9IC0xOwotICBsb2dpY2FsX2lucHV0X2ZpbGUgPSAoY2hhciAqKSBOVUxMOwotICBwaHlzaWNhbF9pbnB1dF9maWxlID0gTlVMTDsJLyogTm8gZmlsZSByZWFkIHlldC4gKi8KLSAgbmV4dF9zYXZlZF9maWxlID0gTlVMTDsJLyogQXQgRU9GLCBkb24ndCBwb3AgdG8gYW55IG90aGVyIGZpbGUgKi8KLSAgZG9fc2NydWJfYmVnaW4gKGZsYWdfbTY4a19tcmkpOwotfQotCi12b2lkCi1pbnB1dF9zY3J1Yl9lbmQgKCkKLXsKLSAgaWYgKGJ1ZmZlcl9zdGFydCkKLSAgICB7Ci0gICAgICBmcmVlIChidWZmZXJfc3RhcnQpOwotICAgICAgYnVmZmVyX3N0YXJ0ID0gMDsKLSAgICAgIGlucHV0X2ZpbGVfZW5kICgpOwotICAgIH0KLX0KLQotLyogU3RhcnQgcmVhZGluZyBpbnB1dCBmcm9tIGEgbmV3IGZpbGUuICovCi0KLWNoYXIgKgkJCQkvKiBSZXR1cm4gc3RhcnQgb2YgY2FsbGVyJ3MgcGFydCBvZiBidWZmZXIuICovCi1pbnB1dF9zY3J1Yl9uZXdfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpbnB1dF9maWxlX29wZW4gKGZpbGVuYW1lLCAhZmxhZ19ub19jb21tZW50cyk7Ci0gIHBoeXNpY2FsX2lucHV0X2ZpbGUgPSBmaWxlbmFtZVswXSA/IGZpbGVuYW1lIDogXygie3N0YW5kYXJkIGlucHV0fSIpOwotICBwaHlzaWNhbF9pbnB1dF9saW5lID0gMDsKLQotICBwYXJ0aWFsX3NpemUgPSAwOwotICByZXR1cm4gKGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFKTsKLX0KLQotCi0vKiBJbmNsdWRlIGEgZmlsZSBmcm9tIHRoZSBjdXJyZW50IGZpbGUuICBTYXZlIG91ciBzdGF0ZSwgY2F1c2UgaXQgdG8KLSAgIGJlIHJlc3RvcmVkIG9uIEVPRiwgYW5kIGJlZ2luIGhhbmRsaW5nIGEgbmV3IGZpbGUuICBTYW1lIHJlc3VsdCBhcwotICAgaW5wdXRfc2NydWJfbmV3X2ZpbGUuICovCi0KLWNoYXIgKgotaW5wdXRfc2NydWJfaW5jbHVkZV9maWxlIChmaWxlbmFtZSwgcG9zaXRpb24pCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotICAgICBjaGFyICpwb3NpdGlvbjsKLXsKLSAgbmV4dF9zYXZlZF9maWxlID0gaW5wdXRfc2NydWJfcHVzaCAocG9zaXRpb24pOwotICByZXR1cm4gaW5wdXRfc2NydWJfbmV3X2ZpbGUgKGZpbGVuYW1lKTsKLX0KLQotLyogU3RhcnQgZ2V0dGluZyBpbnB1dCBmcm9tIGFuIHNiIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB3aGVuCi0gICBleHBhbmRpbmcgYSBtYWNyby4gICovCi0KLXZvaWQKLWlucHV0X3NjcnViX2luY2x1ZGVfc2IgKGZyb20sIHBvc2l0aW9uKQotICAgICBzYiAqZnJvbTsKLSAgICAgY2hhciAqcG9zaXRpb247Ci17Ci0gIGlmIChtYWNyb19uZXN0ID4gbWF4X21hY3JvX25lc3QpCi0gICAgYXNfZmF0YWwgKF8oIm1hY3JvcyBuZXN0ZWQgdG9vIGRlZXBseSIpKTsKLSAgKyttYWNyb19uZXN0OwotCi0gIG5leHRfc2F2ZWRfZmlsZSA9IGlucHV0X3NjcnViX3B1c2ggKHBvc2l0aW9uKTsKLQotICBzYl9uZXcgKCZmcm9tX3NiKTsKLSAgaWYgKGZyb20tPmxlbiA+PSAxICYmIGZyb20tPnB0clswXSAhPSAnXG4nKQotICAgIHsKLSAgICAgIC8qIEFkZCB0aGUgc2VudGluZWwgcmVxdWlyZWQgYnkgcmVhZC5jLiAgKi8KLSAgICAgIHNiX2FkZF9jaGFyICgmZnJvbV9zYiwgJ1xuJyk7Ci0gICAgfQotICBzYl9hZGRfc2IgKCZmcm9tX3NiLCBmcm9tKTsKLSAgc2JfaW5kZXggPSAxOwotCi0gIC8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVzZXQgYnkgaW5wdXRfc2NydWJfcHVzaC4gIFJlc3RvcmUgdGhlbQotICAgICBzaW5jZSB3ZSBhcmUsIGFmdGVyIGFsbCwgc3RpbGwgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhlIGZpbGUuICAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSBuZXh0X3NhdmVkX2ZpbGUtPmxvZ2ljYWxfaW5wdXRfbGluZTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gbmV4dF9zYXZlZF9maWxlLT5sb2dpY2FsX2lucHV0X2ZpbGU7Ci19Ci0KLXZvaWQKLWlucHV0X3NjcnViX2Nsb3NlICgpCi17Ci0gIGlucHV0X2ZpbGVfY2xvc2UgKCk7Ci19Ci0KLWNoYXIgKgotaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKGJ1ZnApCi0gICAgIGNoYXIgKipidWZwOwotewotICByZWdpc3RlciBjaGFyICpsaW1pdDsJCS8qLT5qdXN0IGFmdGVyIGxhc3QgY2hhciBvZiBidWZmZXIuICovCi0KLSAgaWYgKHNiX2luZGV4ID49IDApCi0gICAgewotICAgICAgaWYgKHNiX2luZGV4ID49IGZyb21fc2IubGVuKQotCXsKLQkgIHNiX2tpbGwgKCZmcm9tX3NiKTsKLQkgIGNvbmRfZmluaXNoX2NoZWNrIChtYWNyb19uZXN0KTsKLQkgIC0tbWFjcm9fbmVzdDsKLQkgIHBhcnRpYWxfd2hlcmUgPSBOVUxMOwotCSAgaWYgKG5leHRfc2F2ZWRfZmlsZSAhPSBOVUxMKQotCSAgICAqYnVmcCA9IGlucHV0X3NjcnViX3BvcCAobmV4dF9zYXZlZF9maWxlKTsKLQkgIHJldHVybiBwYXJ0aWFsX3doZXJlOwotCX0KLQotICAgICAgcGFydGlhbF93aGVyZSA9IGZyb21fc2IucHRyICsgZnJvbV9zYi5sZW47Ci0gICAgICBwYXJ0aWFsX3NpemUgPSAwOwotICAgICAgKmJ1ZnAgPSBmcm9tX3NiLnB0ciArIHNiX2luZGV4OwotICAgICAgc2JfaW5kZXggPSBmcm9tX3NiLmxlbjsKLSAgICAgIHJldHVybiBwYXJ0aWFsX3doZXJlOwotICAgIH0KLQotICAqYnVmcCA9IGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFOwotCi0gIGlmIChwYXJ0aWFsX3NpemUpCi0gICAgewotICAgICAgbWVtY3B5IChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSwgcGFydGlhbF93aGVyZSwKLQkgICAgICAodW5zaWduZWQgaW50KSBwYXJ0aWFsX3NpemUpOwotICAgICAgbWVtY3B5IChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSwgc2F2ZV9zb3VyY2UsIEFGVEVSX1NJWkUpOwotICAgIH0KLSAgbGltaXQgPSBpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIgKGJ1ZmZlcl9zdGFydAotCQkJCSAgICAgICArIEJFRk9SRV9TSVpFCi0JCQkJICAgICAgICsgcGFydGlhbF9zaXplKTsKLSAgaWYgKGxpbWl0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNoYXIgKnA7CQkvKiBGaW5kIGxhc3QgbmV3bGluZS4gKi8KLQotICAgICAgZm9yIChwID0gbGltaXQgLSAxOyAqcCAhPSAnXG4nOyAtLXApCi0JOwotICAgICAgKytwOwotCi0gICAgICB3aGlsZSAocCA8PSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSkKLQl7Ci0JICBpbnQgbGltb2ZmOwotCi0JICBsaW1vZmYgPSBsaW1pdCAtIGJ1ZmZlcl9zdGFydDsKLQkgIGJ1ZmZlcl9sZW5ndGggKz0gaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKTsKLQkgIGJ1ZmZlcl9zdGFydCA9IHhyZWFsbG9jIChidWZmZXJfc3RhcnQsCi0JCQkJICAgKEJFRk9SRV9TSVpFCi0JCQkJICAgICsgMiAqIGJ1ZmZlcl9sZW5ndGgKLQkJCQkgICAgKyBBRlRFUl9TSVpFKSk7Ci0JICAqYnVmcCA9IGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFOwotCSAgbGltaXQgPSBpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIgKGJ1ZmZlcl9zdGFydCArIGxpbW9mZik7Ci0KLQkgIGlmIChsaW1pdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygicGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiKSk7Ci0JICAgICAgcGFydGlhbF93aGVyZSA9IE5VTEw7Ci0JICAgICAgaWYgKG5leHRfc2F2ZWRfZmlsZSkKLQkJKmJ1ZnAgPSBpbnB1dF9zY3J1Yl9wb3AgKG5leHRfc2F2ZWRfZmlsZSk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgZm9yIChwID0gbGltaXQgLSAxOyAqcCAhPSAnXG4nOyAtLXApCi0JICAgIDsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIHBhcnRpYWxfd2hlcmUgPSBwOwotICAgICAgcGFydGlhbF9zaXplID0gbGltaXQgLSBwOwotICAgICAgbWVtY3B5IChzYXZlX3NvdXJjZSwgcGFydGlhbF93aGVyZSwgKGludCkgQUZURVJfU0laRSk7Ci0gICAgICBtZW1jcHkgKHBhcnRpYWxfd2hlcmUsIEFGVEVSX1NUUklORywgKGludCkgQUZURVJfU0laRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcGFydGlhbF93aGVyZSA9IDA7Ci0gICAgICBpZiAocGFydGlhbF9zaXplID4gMCkKLQl7Ci0JICBhc193YXJuIChfKCJQYXJ0aWFsIGxpbmUgYXQgZW5kIG9mIGZpbGUgaWdub3JlZCIpKTsKLQl9Ci0KLSAgICAgIC8qIFRlbGwgdGhlIGxpc3Rpbmcgd2UndmUgZmluaXNoZWQgdGhlIGZpbGUuICAqLwotICAgICAgTElTVElOR19FT0YgKCk7Ci0KLSAgICAgIC8qIElmIHdlIHNob3VsZCBwb3AgdG8gYW5vdGhlciBmaWxlIGF0IEVPRiwgZG8gaXQuICovCi0gICAgICBpZiAobmV4dF9zYXZlZF9maWxlKQotCXsKLQkgICpidWZwID0gaW5wdXRfc2NydWJfcG9wIChuZXh0X3NhdmVkX2ZpbGUpOwkvKiBQb3Agc3RhdGUgKi8KLQkgIC8qIHBhcnRpYWxfd2hlcmUgaXMgbm93IGNvcnJlY3QgdG8gcmV0dXJuLCBzaW5jZSB3ZSBwb3BwZWQgaXQuICovCi0JfQotICAgIH0KLSAgcmV0dXJuIChwYXJ0aWFsX3doZXJlKTsKLX0JCQkJLyogaW5wdXRfc2NydWJfbmV4dF9idWZmZXIoKSAqLwotDAotLyoKLSAqIFRoZSByZW1haW5pbmcgcGFydCBvZiB0aGlzIGZpbGUgZGVhbHMgd2l0aCBsaW5lIG51bWJlcnMsIGVycm9yCi0gKiBtZXNzYWdlcyBhbmQgc28gb24uCi0gKi8KLQotCi1pbnQKLXNlZW5fYXRfbGVhc3RfMV9maWxlICgpCQkvKiBUUlVFIGlmIHdlIG9wZW5lZCBhbnkgZmlsZS4gKi8KLXsKLSAgcmV0dXJuIChwaHlzaWNhbF9pbnB1dF9maWxlICE9IE5VTEwpOwotfQotCi12b2lkCi1idW1wX2xpbmVfY291bnRlcnMgKCkKLXsKLSAgaWYgKHNiX2luZGV4IDwgMCkKLSAgICB7Ci0gICAgICArK3BoeXNpY2FsX2lucHV0X2xpbmU7Ci0gICAgICBpZiAobG9naWNhbF9pbnB1dF9saW5lID49IDApCi0JKytsb2dpY2FsX2lucHV0X2xpbmU7Ci0gICAgfQotfQotDAotLyoKLSAqCQkJbmV3X2xvZ2ljYWxfbGluZSgpCi0gKgotICogVGVsbHMgdXMgd2hhdCB0aGUgbmV3IGxvZ2ljYWwgbGluZSBudW1iZXIgYW5kIGZpbGUgYXJlLgotICogSWYgdGhlIGxpbmVfbnVtYmVyIGlzIC0xLCB3ZSBkb24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgbG9naWNhbCBsaW5lCi0gKiBudW1iZXIuICBJZiBpdCBpcyAtMiwgd2UgZGVjcmVtZW50IHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyICh0aGlzIGlzCi0gKiB0byBzdXBwb3J0IHRoZSAuYXBwZmlsZSBwc2V1ZG8tb3AgaW5zZXJ0ZWQgaW50byB0aGUgc3RyZWFtIGJ5Ci0gKiBkb19zY3J1Yl9jaGFycykuCi0gKiBJZiB0aGUgZm5hbWUgaXMgTlVMTCwgd2UgZG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGxvZ2ljYWwgZmlsZSBuYW1lLgotICogUmV0dXJucyBub256ZXJvIGlmIHRoZSBmaWxlbmFtZSBhY3R1YWxseSBjaGFuZ2VzLgotICovCi1pbnQKLW5ld19sb2dpY2FsX2xpbmUgKGZuYW1lLCBsaW5lX251bWJlcikKLSAgICAgY2hhciAqZm5hbWU7CQkvKiBET04nVCBkZXN0cm95IGl0ISBXZSBwb2ludCB0byBpdCEgKi8KLSAgICAgaW50IGxpbmVfbnVtYmVyOwotewotICBpZiAobGluZV9udW1iZXIgPj0gMCkKLSAgICBsb2dpY2FsX2lucHV0X2xpbmUgPSBsaW5lX251bWJlcjsKLSAgZWxzZSBpZiAobGluZV9udW1iZXIgPT0gLTIgJiYgbG9naWNhbF9pbnB1dF9saW5lID4gMCkKLSAgICAtLWxvZ2ljYWxfaW5wdXRfbGluZTsKLQotICBpZiAoZm5hbWUKLSAgICAgICYmIChsb2dpY2FsX2lucHV0X2ZpbGUgPT0gTlVMTAotCSAgfHwgc3RyY21wIChsb2dpY2FsX2lucHV0X2ZpbGUsIGZuYW1lKSkpCi0gICAgewotICAgICAgbG9naWNhbF9pbnB1dF9maWxlID0gZm5hbWU7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0JCQkJLyogbmV3X2xvZ2ljYWxfbGluZSgpICovCi0MCi0vKgotICoJCQlhIHMgXyB3IGggZSByIGUgKCkKLSAqCi0gKiBSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlci4KLSAqIG5hbWVwIHNob3VsZCBiZSBjaGFyICogY29uc3QgKiwgYnV0IHRoZXJlIGFyZSBjb21waWxlcnMgd2hpY2ggc2NyZXcKLSAqIHVwIGRlY2xhcmF0aW9ucyBsaWtlIHRoYXQsIGFuZCBpdCdzIGVhc2llciB0byBhdm9pZCBpdC4KLSAqLwotdm9pZCAKLWFzX3doZXJlIChuYW1lcCwgbGluZXApCi0gICAgIGNoYXIgKipuYW1lcDsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lcDsKLXsKLSAgaWYgKGxvZ2ljYWxfaW5wdXRfZmlsZSAhPSBOVUxMCi0gICAgICAmJiAobGluZXAgPT0gTlVMTCB8fCBsb2dpY2FsX2lucHV0X2xpbmUgPj0gMCkpCi0gICAgewotICAgICAgKm5hbWVwID0gbG9naWNhbF9pbnB1dF9maWxlOwotICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCi0JKmxpbmVwID0gbG9naWNhbF9pbnB1dF9saW5lOwotICAgIH0KLSAgZWxzZSBpZiAocGh5c2ljYWxfaW5wdXRfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICpuYW1lcCA9IHBoeXNpY2FsX2lucHV0X2ZpbGU7Ci0gICAgICBpZiAobGluZXAgIT0gTlVMTCkKLQkqbGluZXAgPSBwaHlzaWNhbF9pbnB1dF9saW5lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpuYW1lcCA9IDA7Ci0gICAgICBpZiAobGluZXAgIT0gTlVMTCkKLQkqbGluZXAgPSAwOwotICAgIH0KLX0JCQkJLyogYXNfd2hlcmUoKSAqLwotDAotCi0KLQotLyoKLSAqCQkJYSBzIF8gaCBvIHcgbSB1IGMgaCAoKQotICoKLSAqIE91dHB1dCB0byBnaXZlbiBzdHJlYW0gaG93IG11Y2ggb2YgbGluZSB3ZSBoYXZlIHNjYW5uZWQgc28gZmFyLgotICogQXNzdW1lcyB3ZSBoYXZlIHNjYW5uZWQgdXAgdG8gYW5kIGluY2x1ZGluZyBpbnB1dF9saW5lX3BvaW50ZXIuCi0gKiBObyBmcmVlICdcbicgYXQgZW5kIG9mIGxpbmUuCi0gKi8KLXZvaWQKLWFzX2hvd211Y2ggKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwkJLyogT3BlbmVkIGZvciB3cml0ZSBwbGVhc2UuICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7CQkvKiBTY2FuIGlucHV0IGxpbmUuICovCi0gIC8qIHJlZ2lzdGVyIGNoYXIgYzsgSkYgdW51c2VkICovCi0KLSAgZm9yIChwID0gaW5wdXRfbGluZV9wb2ludGVyIC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQotICAgIHsKLSAgICB9Ci0gICsrcDsJCQkJLyogcC0+MXN0IGNoYXIgb2YgbGluZS4gKi8KLSAgZm9yICg7IHAgPD0gaW5wdXRfbGluZV9wb2ludGVyOyBwKyspCi0gICAgewotICAgICAgLyogQXNzdW1lIEFTQ0lJLiBFQkNESUMgJiBvdGhlciBtaWNyby1jb21wdXRlciBjaGFyIHNldHMgaWdub3JlZC4gKi8KLSAgICAgIGFzXzFfY2hhciAoKHVuc2lnbmVkIGNoYXIpICpwLCBzdHJlYW0pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgCi1hc18xX2NoYXIgKGMsIHN0cmVhbSkKLSAgICAgdW5zaWduZWQgaW50IGM7Ci0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgaWYgKGMgPiAxMjcpCi0gICAgewotICAgICAgKHZvaWQpIHB1dGMgKCclJywgc3RyZWFtKTsKLSAgICAgIGMgLT0gMTI4OwotICAgIH0KLSAgaWYgKGMgPCAzMikKLSAgICB7Ci0gICAgICAodm9pZCkgcHV0YyAoJ14nLCBzdHJlYW0pOwotICAgICAgYyArPSAnQCc7Ci0gICAgfQotICAodm9pZCkgcHV0YyAoYywgc3RyZWFtKTsKLX0KLQotLyogZW5kIG9mIGlucHV0X3NjcnViLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9pdGJsLWxleC5sIGIvZ2FzL2l0YmwtbGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDVkZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL2l0YmwtbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyogaXRibC1sZXgubAotICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSV7Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgIml0YmwtcGFyc2UuaCIKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2RlZmluZSBNREJHKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBEQkcoeCkKLSNkZWZpbmUgTURCRyh4KQotI2VuZGlmCi0KLWludCBpbnNudGJsX2xpbmUgPSAxOwotJX0KLQotQUxOVU0JW0EtWmEtejAtOV9dCi1ESUdJVAlbMC05XQotQUxQSEEJW0EtWmEtel9dCi1IRVgJWzAtOUEtRmEtZl0KLQotJSUKLQotImNyZWcifCJDUkVHIiB7Ci0gICAgcmV0dXJuIENSRUc7Ci0gIH0KLSJkcmVnInwiRFJFRyIgewotICAgIHJldHVybiBEUkVHOwotICB9Ci0iZ3JlZyJ8IkdSRUciIHsKLSAgICByZXR1cm4gR1JFRzsKLSAgfQotImltbWVkInwiSU1NRUQiIHsKLSAgICByZXR1cm4gSU1NRUQ7Ci0gIH0KLSJhZGRyInwiQUREUiIgewotICAgIHJldHVybiBBRERSOwotICB9Ci0iaW5zbiJ8IklOU04iIHsKLSAgICByZXR1cm4gSU5TTjsKLSAgfQotInAie0RJR0lUfSB7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5wcm9jZXNzb3IgPSBzdHJ0b3VsICh5eXRleHQrMSwgMCwgMCk7Ci0gICAgcmV0dXJuIFBOVU07Ci0gIH0KLXtESUdJVH0rIHsKLSAgICB5eXRleHRbeXlsZW5nXSA9IDA7Ci0gICAgeXlsdmFsLm51bSA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0gICAgcmV0dXJuIE5VTTsKLSAgfQotIjB4IntIRVh9KyB7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5udW0gPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotICAgIHJldHVybiBOVU07Ci0gIH0KLXtBTFBIQX17QUxOVU19Kgl7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5zdHIgPSBzdHJkdXAgKHl5dGV4dCk7Ci0gICAgcmV0dXJuIElEOwotICB9Ci0iOyJ8IiMiCXsKLSAgICBpbnQgYzsKLSAgICB3aGlsZSAoKGMgPSBpbnB1dCAoKSkgIT0gIEVPRikgCi0gICAgICB7Ci0gICAgICAgIGlmIChjID09ICAnXG4nKSAKLSAgICAJewotICAgIAkJdW5wdXQgKGMpOwotICAgIAkJYnJlYWs7Ci0gICAgCX0KLSAgICAgIH0KLSAgfQotIlxuIgl7IAotICAgIGluc250YmxfbGluZSsrOyAKLSAgICBNREJHICgoImluIGxleCwgTkwgPSAlZCAoeCV4KVxuIiwgTkwsIE5MKSk7Ci0gICAgcmV0dXJuIE5MOyAKLSAgfQotIiAifCJcdCIgeyAKLSAgfQotLiB7Ci0gICAgTURCRyAoKCJjaGFyID0gJXgsICVkXG4iLCB5eXRleHRbMF0sIHl5dGV4dFswXSkpOwotICAgIHJldHVybiB5eXRleHRbMF07Ci0gIH0KLSUlCi0KLSNpZm5kZWYgeXl3cmFwCi1pbnQgCi15eXdyYXAgKCkgCi0gIHsgCi0gICAgcmV0dXJuIDE7IAotICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9pdGJsLW9wcy5jIGIvZ2FzL2l0Ymwtb3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2NhNjAuLjAwMDAwMDAKLS0tIGEvZ2FzL2l0Ymwtb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTYgKzAsMCBAQAotLyogaXRibC1vcHMuYwotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyoKLSAqIEhlcmVpbiBsaWVzIHRoZSBzdXBwb3J0IGZvciBkeW5hbWljIHNwZWNpZmljYXRpb24gb2YgcHJvY2Vzc29yCi0gKiBpbnN0cnVjdGlvbnMgYW5kIHJlZ2lzdGVycy4gIE1uZW1vbmljcywgdmFsdWVzLCBhbmQgZm9ybWF0cyBmb3IgZWFjaAotICogaW5zdHJ1Y3Rpb24gYW5kIHJlZ2lzdGVyIGFyZSBzcGVjaWZpZWQgaW4gYW4gYXNjaWkgZmlsZSBjb25zaXN0aW5nIG9mCi0gKiB0YWJsZSBlbnRyaWVzLiAgVGhlIGdyYW1tYXIgZm9yIHRoZSB0YWJsZSBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudAotICogIlByb2Nlc3NvciBpbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIi4KLSAqCi0gKiBJbnN0cnVjdGlvbnMgdXNlIHRoZSBnbnUgYXNzZW1ibGVyIHN5bnRheCwgd2l0aCB0aGUgYWRkaXRpb24gb2YKLSAqIGFsbG93aW5nIG1uZW1vbmljcyBmb3IgcmVnaXN0ZXIuCi0gKiBFZy4gImZ1bmMgJDIscmVnMywweDEwMCxzeW1ib2wgOyBjb21tZW50IgotICogCWZ1bmMgLSBvcGNvZGUgbmFtZQotICogCSRuIC0gcmVnaXN0ZXIgbgotICogCXJlZzMgLSBtbmVtb25pYyBmb3IgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgZGVmaW5lZCBpbiB0YWJsZQotICogCTB4ZGRkLi5kIC0gaW1tZWRpYXRlIHZhbHVlCi0gKiAJc3ltYm9sIC0gYWRkcmVzcyBvZiBsYWJlbCBvciBleHRlcm5hbCBzeW1ib2wKLSAqCi0gKiBGaXJzdCwgaXRibF9wYXJzZSByZWFkcyBpbiB0aGUgdGFibGUgb2YgcmVnaXN0ZXIgYW5kIGluc3RydWN0aW9uCi0gKiBuYW1lcyBhbmQgZm9ybWF0cywgYW5kIGJ1aWxkcyBhIGxpc3Qgb2YgZW50cmllcyBmb3IgZWFjaAotICogcHJvY2Vzc29yL3R5cGUgY29tYmluYXRpb24uICBsZXggYW5kIHlhY2MgYXJlIHVzZWQgdG8gcGFyc2UKLSAqIHRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBhbmQgY2FsbCBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIHRvCi0gKiBhZGQgZWFjaCBlbnRyeSB0byBvdXIgbGlzdC4KLSAqCi0gKiBUaGVuLCB3aGVuIGFzc2VtYmxpbmcgb3IgZGlzYXNzZW1ibGluZywgdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8KLSAqIDEpIGdldCBpbmZvcm1hdGlvbiBvbiBhIHByb2Nlc3NvcidzIHJlZ2lzdGVycyBhbmQKLSAqIDIpIGFzc2VtYmxlL2Rpc2Fzc2VtYmxlIGFuIGluc3RydWN0aW9uLgotICogVG8gYXNzZW1ibGUoZGlzYXNzZW1ibGUpIGFuIGluc3RydWN0aW9uLCB0aGUgZnVuY3Rpb24KLSAqIGl0YmxfYXNzZW1ibGUoaXRibF9kaXNhc3NlbWJsZSkgaXMgY2FsbGVkIHRvIHNlYXJjaCB0aGUgbGlzdCBvZgotICogaW5zdHJ1Y3Rpb24gZW50cmllcywgYW5kIGlmIGEgbWF0Y2ggaXMgZm91bmQsIHVzZXMgdGhlIGZvcm1hdAotICogZGVzY3JpYmVkIGluIHRoZSBpbnN0cnVjdGlvbiBlbnRyeSBzdHJ1Y3R1cmUgdG8gY29tcGxldGUgdGhlIGFjdGlvbi4KLSAqCi0gKiBFZy4gU3VwcG9zZSB3ZSBoYXZlIGEgTWlwcyBjb3Byb2Nlc3NvciAiY29wMyIgd2l0aCBkYXRhIHJlZ2lzdGVyICJkMiIKLSAqIGFuZCB3ZSB3YW50IHRvIGRlZmluZSBmdW5jdGlvbiAicGlnIiB3aGljaCB0YWtlcyB0d28gb3BlcmFuZHMuCi0gKgotICogR2l2ZW4gdGhlIHRhYmxlIGVudHJpZXM6Ci0gKiAJInAzIGluc24gcGlnIDB4MToyNC0yMSBkcmVnOjIwLTE2IGltbWVkOjE1LTAiCi0gKiAJInAzIGRyZWcgZDIgMHgyIgotICogYW5kIHRoYXQgdGhlIGluc3RydWN0aW9uIGVuY29kaW5nIGZvciBjb3Byb2Nlc3NvciBweiBoYXMgZW5jb2Rpbmc6Ci0gKiAJI2RlZmluZSBNSVBTX0VOQ09ERV9DT1BfTlVNKHopICgoMHgyMXwoejw8MSkpPDwyNSkKLSAqIAkjZGVmaW5lIElUQkxfRU5DT0RFX1BOVU0ocG51bSkgTUlQU19FTkNPREVfQ09QX05VTShwbnVtKQotICoKLSAqIGEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIHRoZSBpbnN0cnVjdGlvbiBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlOgotICogICAgICBzdHJ1Y3QgaXRibF9lbnRyeSA9IHsKLSAqICAgICAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yID0gZV9wMwotICogICAgICBlX3R5cGUgdHlwZSA9IGVfaW5zbgotICogICAgICBjaGFyICpuYW1lID0gInBpZyIKLSAqICAgICAgdWludCB2YWx1ZSA9IDB4MQotICogICAgICB1aW50IGZsYWdzID0gMAotICogICAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZSA9IDI0LTIxCi0gKiAgICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpmaWVsZCA9IHsKLSAqICAgICAgICAgICAgICBlX3R5cGUgdHlwZSA9IGVfZHJlZwotICogICAgICAgICAgICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlID0gMjAtMTYKLSAqICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9maWVsZCAqbmV4dCA9IHsKLSAqICAgICAgICAgICAgICAgICAgICAgIGVfdHlwZSB0eXBlID0gZV9pbW1lZAotICogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2UgPSAxNS0wCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9maWVsZCAqbmV4dCA9IDAKLSAqICAgICAgICAgICAgICAgICAgICAgIH07Ci0gKiAgICAgICAgICAgICAgfTsKLSAqICAgICAgc3RydWN0IGl0YmxfZW50cnkgKm5leHQgPSAwCi0gKiAgICAgIH07Ci0gKgotICogQW5kIHRoZSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb25zOgotICogCSJwaWcgZDIsMHgxMDAiCi0gKiAJInBpZyAkMiwweDEwMCIKLSAqCi0gKiB3b3VsZCBib3RoIGFzc2VtYmxlIHRvIHRoZSBoZXggdmFsdWU6Ci0gKiAJIjB4NGUyMjAxMDAiCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0jaW5jbHVkZSAiaXRibC1wYXJzZS5oIgotCi0vKiAjZGVmaW5lIERFQlVHICovCi0KLSNpZmRlZiBERUJVRwotI2luY2x1ZGUgPGFzc2VydC5oPgotI2RlZmluZSBBU1NFUlQoeCkgYXNzZXJ0KHgpCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgQVNTRVJUKHgpCi0jZGVmaW5lIERCRyh4KQotI2VuZGlmCi0KLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpIChhPGI/YTpiKQotI2VuZGlmCi0KLWludCBpdGJsX2hhdmVfZW50cmllcyA9IDA7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBzdHJ1Y3R1cmVzIGZvciBrZWVwaW5nIGl0YmwgZm9ybWF0IGVudHJpZXMgKi8KLQotc3RydWN0IGl0YmxfcmFuZ2UKLSAgewotICAgIGludCBzYml0OwkJCS8qIG1hc2sgc3RhcnRpbmcgYml0IHBvc2l0aW9uICovCi0gICAgaW50IGViaXQ7CQkJLyogbWFzayBlbmRpbmcgYml0IHBvc2l0aW9uICovCi0gIH07Ci0KLXN0cnVjdCBpdGJsX2ZpZWxkCi0gIHsKLSAgICBlX3R5cGUgdHlwZTsJCS8qIGRyZWcvY3JlZy9ncmVnL2ltbWVkL3N5bWIgKi8KLSAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZTsJLyogZmllbGQncyBiaXRmaWVsZCByYW5nZSB3aXRoaW4gaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBmaWVsZCBmbGFncyAqLwotICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpuZXh0OwkvKiBuZXh0IGZpZWxkIGluIGxpc3QgKi8KLSAgfTsKLQotCi0vKiBUaGVzZSBzdHJ1Y3R1cmVzIGRlZmluZSB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMgZm9yIGEgcHJvY2Vzc29yLgotICogSWYgdGhlIHR5cGUgaXMgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZm9ybWF0IG9mIGFuCi0gKiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgZmllbGRzIGFyZSB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLSAqIFRoZSBmbGFncyBmaWVsZCBiZWxvdyB1c2VzIHRoZSBzYW1lIHZhbHVlcyBhcyB0aG9zZSBkZWZpbmVkIGluIHRoZQotICogZ251IGFzc2VtYmxlciBhbmQgYXJlIG1hY2hpbmUgc3BlY2lmaWMuICovCi1zdHJ1Y3QgaXRibF9lbnRyeQotICB7Ci0gICAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yOwkvKiBwcm9jZXNzb3IgbnVtYmVyICovCi0gICAgZV90eXBlIHR5cGU7CQkvKiBkcmVnL2NyZWcvZ3JlZy9pbnNuICovCi0gICAgY2hhciAqbmFtZTsJCQkvKiBtbmVtaW9uaWMgbmFtZSBmb3IgaW5zbi9yZWdpc3RlciAqLwotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CS8qIG9wY29kZS9pbnN0cnVjdGlvbiBtYXNrL3JlZ2lzdGVyIG51bWJlciAqLwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGVmZmVjdHMgb2YgdGhlIGluc3RydWN0aW9uICovCi0gICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2U7CS8qIGJpdCByYW5nZSB3aXRoaW4gaW5zdHJ1Y3Rpb24gZm9yIHZhbHVlICovCi0gICAgc3RydWN0IGl0YmxfZmllbGQgKmZpZWxkczsJLyogbGlzdCBvZiBvcGVyYW5kIGRlZmluaXRpb25zIChpZiBhbnkpICovCi0gICAgc3RydWN0IGl0YmxfZW50cnkgKm5leHQ7CS8qIG5leHQgZW50cnkgKi8KLSAgfTsKLQotCi0vKiBsb2NhbCBkYXRhIGFuZCBzdHJ1Y3R1cmVzICovCi0KLXN0YXRpYyBpbnQgaXRibF9udW1fb3Bjb2RlcyA9IDA7Ci0vKiBBcnJheSBvZiBlbnRyaWVzIGZvciBlYWNoIHByb2Nlc3NvciBhbmQgZW50cnkgdHlwZSAqLwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICplbnRyaWVzW2VfbnByb2NzXVtlX250eXBlc10gPQotewotICB7MCwgMCwgMCwgMCwgMCwgMH0sCi0gIHswLCAwLCAwLCAwLCAwLCAwfSwKLSAgezAsIDAsIDAsIDAsIDAsIDB9LAotICB7MCwgMCwgMCwgMCwgMCwgMH0KLX07Ci0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJ1aWxkX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgaXRibF9lbnRyeSAqZSkpOwotc3RhdGljIGVfdHlwZSBnZXRfdHlwZSBQQVJBTVMgKChpbnQgeXl0eXBlKSk7Ci1zdGF0aWMgZV9wcm9jZXNzb3IgZ2V0X3Byb2Nlc3NvciBQQVJBTVMgKChpbnQgeXlwcm9jKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKipnZXRfZW50cmllcyBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAotCQkJCQkJZV90eXBlIHR5cGUpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqZmluZF9lbnRyeV9ieW5hbWUgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKLQkJCQkJZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqZmluZF9lbnRyeV9ieXZhbCBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAotCQkJZV90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgaXRibF9yYW5nZSAqcikpOwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICphbGxvY19lbnRyeSBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAotCQllX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYXBwbHlfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyB2YWx1ZSwgCi0JCQkJCQlzdHJ1Y3QgaXRibF9yYW5nZSByKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHRyYWN0X3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgdmFsdWUsIAotCQkJCQkJc3RydWN0IGl0YmxfcmFuZ2UgcikpOwotc3RhdGljIHN0cnVjdCBpdGJsX2ZpZWxkICphbGxvY19maWVsZCBQQVJBTVMgKChlX3R5cGUgdHlwZSwgaW50IHNiaXQsIAotCQkJCQlpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykpOwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBJbnRlcmZhY2VzIHRvIHRoZSBwYXJzZXIgKi8KLQotCi0vKiBPcGVuIHRoZSB0YWJsZSBhbmQgdXNlIGxleCBhbmQgeWFjYyB0byBwYXJzZSB0aGUgZW50cmllcy4KLSAqIFJldHVybiAxIGZvciBmYWlsdXJlOyAwIGZvciBzdWNjZXNzLiAgKi8KLQotaW50IAotaXRibF9wYXJzZSAoY2hhciAqaW5zbnRibCkKLXsKLSAgZXh0ZXJuIEZJTEUgKnl5aW47Ci0gIGV4dGVybiBpbnQgeXlwYXJzZSAodm9pZCk7Ci0gIHl5aW4gPSBmb3BlbiAoaW5zbnRibCwgInIiKTsKLSAgaWYgKHl5aW4gPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJDYW4ndCBvcGVuIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBzcGVjaWZpY2F0aW9uIGZpbGUgXCIlc1wiXG4iLAotCSAgICAgIGluc250YmwpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKHl5cGFyc2UgKCkpOwotICAgIH0KLSAgZmNsb3NlICh5eWluKTsKLSAgaXRibF9oYXZlX2VudHJpZXMgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogQWRkIGEgcmVnaXN0ZXIgZW50cnkgKi8KLQotc3RydWN0IGl0YmxfZW50cnkgKgotaXRibF9hZGRfcmVnIChpbnQgeXlwcm9jZXNzb3IsIGludCB5eXR5cGUsIGNoYXIgKnJlZ25hbWUsCi0JICAgICAgaW50IHJlZ251bSkKLXsKLSNpZiAwCQkJCQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotICAvKiBTaW5jZSByZWdpc3RlciBuYW1lcyBkb24ndCBoYXZlIGEgcHJlZml4LCB3ZSBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCi0gICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcwotICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAgVGhlIHJlY29yZGVkIHJlZ2lzdGVyIG51bWJlciBpcwotICAgICByZWdudW0uICAqLwotICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBoZXJlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLSAgICAgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKHJlZ25hbWUsIHJlZ19zZWN0aW9uLAotCQkJCSAgICAgIHJlZ251bSwgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0jZW5kaWYKLSAgcmV0dXJuIGFsbG9jX2VudHJ5IChnZXRfcHJvY2Vzc29yICh5eXByb2Nlc3NvciksIGdldF90eXBlICh5eXR5cGUpLCByZWduYW1lLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgcmVnbnVtKTsKLX0KLQotLyogQWRkIGFuIGluc3RydWN0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCBpdGJsX2VudHJ5ICoKLWl0YmxfYWRkX2luc24gKGludCB5eXByb2Nlc3NvciwgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKLQkgICAgICAgaW50IHNiaXQsIGludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKLSAgZSA9IGFsbG9jX2VudHJ5IChnZXRfcHJvY2Vzc29yICh5eXByb2Nlc3NvciksIGVfaW5zbiwgbmFtZSwgdmFsdWUpOwotICBpZiAoZSkKLSAgICB7Ci0gICAgICBlLT5yYW5nZS5zYml0ID0gc2JpdDsKLSAgICAgIGUtPnJhbmdlLmViaXQgPSBlYml0OwotICAgICAgZS0+ZmxhZ3MgPSBmbGFnczsKLSAgICAgIGl0YmxfbnVtX29wY29kZXMrKzsKLSAgICB9Ci0gIHJldHVybiBlOwotfQotCi0vKiBBZGQgYW4gb3BlcmFuZCB0byBhbiBpbnN0cnVjdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgaXRibF9maWVsZCAqCi1pdGJsX2FkZF9vcGVyYW5kIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgaW50IHl5dHlwZSwgaW50IHNiaXQsCi0JCSAgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmLCAqKmxhc3RfZjsKLSAgaWYgKCFlKQotICAgIHJldHVybiAwOwotICAvKiBBZGQgdG8gZW5kIG9mIGZpZWxkcycgbGlzdC4gKi8KLSAgZiA9IGFsbG9jX2ZpZWxkIChnZXRfdHlwZSAoeXl0eXBlKSwgc2JpdCwgZWJpdCwgZmxhZ3MpOwotICBpZiAoZikKLSAgICB7Ci0gICAgICBsYXN0X2YgPSAmZS0+ZmllbGRzOwotICAgICAgd2hpbGUgKCpsYXN0X2YpCi0JbGFzdF9mID0gJigqbGFzdF9mKS0+bmV4dDsKLSAgICAgICpsYXN0X2YgPSBmOwotICAgICAgZi0+bmV4dCA9IDA7Ci0gICAgfQotICByZXR1cm4gZjsKLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogSW50ZXJmYWNlcyBmb3IgYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgKi8KLQotI2lmbmRlZiBTVEFORF9BTE9ORQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotc3RhdGljIHZvaWQgYXBwZW5kX2luc25zX2FzX21hY3JvcyAodm9pZCk7Ci0KLS8qIGluaXRpYWxpemUgZm9yIGdhcyAqLwotdm9pZCAKLWl0YmxfaW5pdCAodm9pZCkKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIGVfcHJvY2Vzc29yIHByb2NuOwotICBlX3R5cGUgdHlwZTsKLQotICBpZiAoIWl0YmxfaGF2ZV9lbnRyaWVzKQotCXJldHVybjsKLQotICAvKiBTaW5jZSByZWdpc3RlciBuYW1lcyBkb24ndCBoYXZlIGEgcHJlZml4LCBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCi0gICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBzaW1wbGlmaWVzIGFyZ3VtZW50IHBhcnNpbmcgYXMKLSAgICAgd2UgY2FuIGxldCBnYXMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4gKi8KLSAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaW5zdGVhZCBvZiBzeW1ib2xfbmV3IHNvIHdlIGRvbid0IHRyeSB0bwotICAgICBvdXRwdXQgcmVnaXN0ZXJzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLiAgKi8KLQotICBmb3IgKHR5cGUgPSBlX3JlZ3R5cGUwOyB0eXBlIDwgZV9ucmVndHlwZXM7IHR5cGUrKykKLSAgICBmb3IgKHByb2NuID0gZV9wMDsgcHJvY24gPCBlX25wcm9jczsgcHJvY24rKykKLSAgICAgIHsKLQllcyA9IGdldF9lbnRyaWVzIChwcm9jbiwgdHlwZSk7Ci0JZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkKLQkgIHsKLQkgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX2NyZWF0ZSAoZS0+bmFtZSwgcmVnX3NlY3Rpb24sCi0JCQkJCSAgICAgZS0+dmFsdWUsICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCSAgfQotICAgICAgfQotICBhcHBlbmRfaW5zbnNfYXNfbWFjcm9zICgpOwotfQotCi0KLS8qIEFwcGVuZCBpbnNucyB0byBvcGNvZGVzIHRhYmxlIGFuZCBpbmNyZWFzZSBudW1iZXIgb2Ygb3Bjb2RlcyAKLSAqIFN0cnVjdHVyZSBvZiBvcGNvZGVzIHRhYmxlOiAKLSAqIHN0cnVjdCBpdGJsX29wY29kZQotICogewotICogICBjb25zdCBjaGFyICpuYW1lOwotICogICBjb25zdCBjaGFyICphcmdzOyAJCS0gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFyZ3VtZW50cy4gIAotICogICB1bnNpZ25lZCBsb25nIG1hdGNoOyAJLSBvcGNvZGUsIG9yIElTQSBsZXZlbCBpZiBwaW5mbz1JTlNOX01BQ1JPIAotICogICB1bnNpZ25lZCBsb25nIG1hc2s7IAktIG9wY29kZSBtYXNrLCBvciBtYWNybyBpZCBpZiBwaW5mbz1JTlNOX01BQ1JPIAotICogICB1bnNpZ25lZCBsb25nIHBpbmZvOyAJLSBpbnNuIGZsYWdzLCBvciBJTlNOX01BQ1JPIAotICogfTsKLSAqIGV4YW1wbGVzOgotICoJeyJsaSIsICAgICAgInQsaSIsICAweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90ICAgIH0sCi0gKgl7ImxpIiwgICAgICAidCxJIiwgIDAsICAgIChpbnQpIE1fTEksICAgSU5TTl9NQUNSTyAgfSwKLSAqLwotCi1zdGF0aWMgY2hhciAqZm9ybV9hcmdzIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSk7Ci1zdGF0aWMgdm9pZCAKLWFwcGVuZF9pbnNuc19hc19tYWNyb3MgKHZvaWQpCi17Ci0gIHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QgKm5ld19vcGNvZGVzLCAqbzsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIGludCBuLCBpZCwgc2l6ZSwgbmV3X3NpemUsIG5ld19udW1fb3Bjb2RlczsKLQotICBpZiAoIWl0YmxfaGF2ZV9lbnRyaWVzKQotCXJldHVybjsKLQotICBpZiAoIWl0YmxfbnVtX29wY29kZXMpCS8qIG5vIG5ldyBpbnN0cnVjdGlvbnMgdG8gYWRkISAqLwotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIERCRyAoKCJwcmV2aW91cyBudW1fb3Bjb2Rlcz0lZFxuIiwgSVRCTF9OVU1fT1BDT0RFUykpOwotCi0gIG5ld19udW1fb3Bjb2RlcyA9IElUQkxfTlVNX09QQ09ERVMgKyBpdGJsX251bV9vcGNvZGVzOwotICBBU1NFUlQgKG5ld19udW1fb3Bjb2RlcyA+PSBpdGJsX251bV9vcGNvZGVzKTsKLQotICBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUKSAqIElUQkxfTlVNX09QQ09ERVM7Ci0gIEFTU0VSVCAoc2l6ZSA+PSAwKTsKLSAgREJHICgoIkkgZ2V0PSVkXG4iLCBzaXplIC8gc2l6ZW9mIChJVEJMX09QQ09ERVNbMF0pKSk7Ci0KLSAgbmV3X3NpemUgPSBzaXplb2YgKHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QpICogbmV3X251bV9vcGNvZGVzOwotICBBU1NFUlQgKG5ld19zaXplID4gc2l6ZSk7Ci0KLSAgLyogRklYTUUgc2luY2UgSVRCTF9PUENPREVTIGN1bGQgYmUgYSBzdGF0aWMgdGFibGUsCi0JCXdlIGNhbid0IHJlYWxsb2Mgb3IgZGVsZXRlIHRoZSBvbGQgbWVtb3J5LiAqLwotICBuZXdfb3Bjb2RlcyA9IChzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUICopIG1hbGxvYyAobmV3X3NpemUpOwotICBpZiAoIW5ld19vcGNvZGVzKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGluc3RydWN0aW9uc1xuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHNpemUpCQkJLyogY29weSBwcmV4aXN0aW5nIG9wY29kZXMgdGFibGUgKi8KLSAgICBtZW1jcHkgKG5ld19vcGNvZGVzLCBJVEJMX09QQ09ERVMsIHNpemUpOwotCi0gIC8qIEZJWE1FISBzb21lIE5VTU9QQ09ERVMgYXJlIGNhbGN1bGF0ZWQgZXhwcmVzc2lvbnMuCi0JCVRoZXNlIG5lZWQgdG8gYmUgY2hhbmdlZCBiZWZvcmUgaXRibHMgY2FuIGJlIHN1cHBvcnRlZC4gKi8KLQotICBpZCA9IElUQkxfTlVNX01BQ1JPUzsJCS8qIGJlZ2luIHRoZSBuZXh0IG1hY3JvIGlkIGFmdGVyIHRoZSBsYXN0ICovCi0gIG8gPSAmbmV3X29wY29kZXNbSVRCTF9OVU1fT1BDT0RFU107CS8qIGFwcGVuZCBtYWNybyB0byBvcGNvZGVzIGxpc3QgKi8KLSAgZm9yIChuID0gZV9wMDsgbiA8IGVfbnByb2NzOyBuKyspCi0gICAgewotICAgICAgZXMgPSBnZXRfZW50cmllcyAobiwgZV9pbnNuKTsKLSAgICAgIGZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCi0JewotCSAgLyogbmFtZSwgICAgYXJncywgICBtYXNrLCAgICAgICBtYXRjaCwgIHBpbmZvCi0JCSAqIHsibGkiLCAgICAgICJ0LGkiLCAgMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCAgICB9LAotCQkgKiB7ImxpIiwgICAgICAidCxJIiwgIDAsICAgIChpbnQpIE1fTEksICAgSU5TTl9NQUNSTyAgfSwKLQkJICogQ29uc3RydWN0IGFyZ3MgZnJvbSBpdGJsX2ZpZWxkcy4KLQkJKi8KLQkgIG8tPm5hbWUgPSBlLT5uYW1lOwotCSAgby0+YXJncyA9IHN0cmR1cCAoZm9ybV9hcmdzIChlKSk7Ci0JICBvLT5tYXNrID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7Ci0JICAvKiBGSVhNRSBob3cgdG8gY2F0Y2ggZHVycmluZyBhc3NlbWJseT8gKi8KLQkgIC8qIG1hc2sgdG8gaWRlbnRpZnkgdGhpcyBpbnNuICovCi0JICBvLT5tYXRjaCA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOwotCSAgby0+cGluZm8gPSAwOwotCi0jaWZkZWYgVVNFX01BQ1JPUwotCSAgby0+bWFzayA9IGlkKys7CS8qIEZJWE1FIGhvdyB0byBjYXRjaCBkdXJyaW5nIGFzc2VtYmx5PyAqLwotCSAgby0+bWF0Y2ggPSAwOwkJLyogZm9yIG1hY3JvcywgdGhlIGluc25faXNhIG51bWJlciAqLwotCSAgby0+cGluZm8gPSBJTlNOX01BQ1JPOwotI2VuZGlmCi0KLQkgIC8qIERvbid0IGFkZCBpbnN0cnVjdGlvbnMgd2hpY2ggY2F1c2VkIGFuIGVycm9yICovCi0JICBpZiAoby0+YXJncykKLQkgICAgbysrOwotCSAgZWxzZQotCSAgICBuZXdfbnVtX29wY29kZXMtLTsKLQl9Ci0gICAgfQotICBJVEJMX09QQ09ERVMgPSBuZXdfb3Bjb2RlczsKLSAgSVRCTF9OVU1fT1BDT0RFUyA9IG5ld19udW1fb3Bjb2RlczsKLQotICAvKiBGSVhNRQotCQlBdCB0aGlzIHBvaW50LCB3ZSBjYW4gZnJlZSB0aGUgZW50cmllcywgYXMgdGhleSBzaG91bGQgaGF2ZQotCQliZWVuIGFkZGVkIHRvIHRoZSBhc3NlbWJsZXIncyB0YWJsZXMuCi0JCURvbid0IGZyZWUgbmFtZSB0aG91Z2gsIHNpbmNlIG5hbWUgaXMgYmVpbmcgdXNlZCBieSB0aGUgbmV3Ci0JCW9wY29kZXMgdGFibGUuCi0KLQkJRXZlbnR1YWxseSwgd2Ugc2hvdWxkIGFsc28gZnJlZSB0aGUgbmV3IG9wY29kZXMgdGFibGUgaXRzZWxmIAotCQlvbiBleGl0LgotCSovCi19Ci0KLXN0YXRpYyBjaGFyICoKLWZvcm1fYXJncyAoc3RydWN0IGl0YmxfZW50cnkgKmUpCi17Ci0gIHN0YXRpYyBjaGFyIHNbMzFdOwotICBjaGFyIGMgPSAwLCAqcCA9IHM7Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmOwotCi0gIEFTU0VSVCAoZSk7Ci0gIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChmLT50eXBlKQotCXsKLQljYXNlIGVfZHJlZzoKLQkgIGMgPSAnZCc7Ci0JICBicmVhazsKLQljYXNlIGVfY3JlZzoKLQkgIGMgPSAndCc7Ci0JICBicmVhazsKLQljYXNlIGVfZ3JlZzoKLQkgIGMgPSAncyc7Ci0JICBicmVhazsKLQljYXNlIGVfaW1tZWQ6Ci0JICBjID0gJ2knOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2FkZHI6Ci0JICBjID0gJ2EnOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGMgPSAwOwkJLyogaWdub3JlOyB1bmtub3duIGZpZWxkIHR5cGUgKi8KLQl9Ci0gICAgICBpZiAoYykKLQl7Ci0JICBpZiAocCAhPSBzKQotCSAgICAqcCsrID0gJywnOwotCSAgKnArKyA9IGM7Ci0JfQotICAgIH0KLSAgKnAgPSAwOwotICByZXR1cm4gczsKLX0KLSNlbmRpZiAvKiAhU1RBTkRfQUxPTkUgKi8KLQotCi0vKiBHZXQgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgbmFtZSBmcm9tIHZhbCAqLwotCi1pbnQKLWl0YmxfZ2V0X3JlZ192YWwgKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnB2YWwpCi17Ci0gIGVfdHlwZSB0OwotICBlX3Byb2Nlc3NvciBwOwotCi0gIGZvciAocCA9IGVfcDA7IHAgPCBlX25wcm9jczsgcCsrKQotICAgIHsKLSAgICAgIGZvciAodCA9IGVfcmVndHlwZTA7IHQgPCBlX25yZWd0eXBlczsgdCsrKQotCXsKLQkgIGlmIChpdGJsX2dldF92YWwgKHAsIHQsIG5hbWUsIHB2YWwpKQotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1pdGJsX2dldF9uYW1lIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKnI7Ci0gIC8qIHR5cGUgZGVwZW5kcyBvbiBpbnN0cnVjdGlvbiBwYXNzZWQgKi8KLSAgciA9IGZpbmRfZW50cnlfYnl2YWwgKHByb2Nlc3NvciwgdHlwZSwgdmFsLCAwKTsKLSAgaWYgKHIpCi0gICAgcmV0dXJuIHItPm5hbWU7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsJCQkvKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICovCi19Ci0KLS8qIEdldCBwcm9jZXNzb3IncyByZWdpc3RlciB2YWx1ZSBmcm9tIG5hbWUgKi8KLQotaW50Ci1pdGJsX2dldF92YWwgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JICAgICAgdW5zaWduZWQgbG9uZyAqcHZhbCkKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKnI7Ci0gIC8qIHR5cGUgZGVwZW5kcyBvbiBpbnN0cnVjdGlvbiBwYXNzZWQgKi8KLSAgciA9IGZpbmRfZW50cnlfYnluYW1lIChwcm9jZXNzb3IsIHR5cGUsIG5hbWUpOwotICBpZiAociA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAqcHZhbCA9IHItPnZhbHVlOwotICByZXR1cm4gMTsKLX0KLQotCi0vKiBBc3NlbWJsZSBpbnN0cnVjdGlvbiAibmFtZSIgd2l0aCBvcGVyYW5kcyAicyIuCi0gKiBuYW1lIC0gbmFtZSBvZiBpbnN0cnVjdGlvbgotICogcyAtIG9wZXJhbmRzCi0gKiByZXR1cm5zIC0gbG9uZyB3b3JkIGZvciBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gKi8KLQotdW5zaWduZWQgbG9uZyAKLWl0YmxfYXNzZW1ibGUgKGNoYXIgKm5hbWUsIGNoYXIgKnMpCi17Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmY7Ci0gIGNoYXIgKm47Ci0gIGludCBwcm9jZXNzb3I7Ci0KLSAgaWYgKCFuYW1lIHx8ICEqbmFtZSkKLSAgICByZXR1cm4gMDsJCQkvKiBlcnJvciEgIG11c3QgaGF2ZSBhIG9wY29kZSBuYW1lL2V4cHIgKi8KLQotICAvKiBmaW5kIGVudHJ5IGluIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIGZvciBhbGwgcHJvY2Vzc29ycyAqLwotICBmb3IgKHByb2Nlc3NvciA9IDA7IHByb2Nlc3NvciA8IGVfbnByb2NzOyBwcm9jZXNzb3IrKykKLSAgICB7Ci0gICAgICBlID0gZmluZF9lbnRyeV9ieW5hbWUgKHByb2Nlc3NvciwgZV9pbnNuLCBuYW1lKTsKLSAgICAgIGlmIChlKQotCWJyZWFrOwotICAgIH0KLSAgaWYgKCFlKQotICAgIHJldHVybiAwOwkJCS8qIG9wY29kZSBub3QgaW4gdGFibGU7IGludmFsaWQgaW5zdHJ1c3Rpb24gKi8KLSAgb3Bjb2RlID0gYnVpbGRfb3Bjb2RlIChlKTsKLQotICAvKiBwYXJzZSBvcGNvZGUncyBhcmdzIChpZiBhbnkpICovCi0gIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCS8qIGZvciBlYWNoIGFyZywgLi4uICovCi0gICAgewotICAgICAgc3RydWN0IGl0YmxfZW50cnkgKnI7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICAgaWYgKCFzIHx8ICEqcykKLQlyZXR1cm4gMDsJCS8qIGVycm9yIC0gbm90IGVub3VnaCBvcGVyYW5kcyAqLwotICAgICAgbiA9IGl0YmxfZ2V0X2ZpZWxkICgmcyk7Ci0gICAgICAvKiBuIHNob3VsZCBiZSBpbiBmb3JtICRuIG9yIDB4aGhoIChhcmUgc3ltYm9sIG5hbWVzIHZhbGlkPz8gKi8KLSAgICAgIHN3aXRjaCAoZi0+dHlwZSkKLQl7Ci0JY2FzZSBlX2RyZWc6Ci0JY2FzZSBlX2NyZWc6Ci0JY2FzZSBlX2dyZWc6Ci0JICAvKiBBY2NlcHQgZWl0aGVyIGEgc3RyaW5nIG5hbWUKLQkJCSAqIG9yICckJyBmb2xsb3dlZCBieSB0aGUgcmVnaXN0ZXIgbnVtYmVyICovCi0JICBpZiAoKm4gPT0gJyQnKQotCSAgICB7Ci0JICAgICAgbisrOwotCSAgICAgIHZhbHVlID0gc3RydG9sIChuLCAwLCAxMCk7Ci0JICAgICAgLyogRklYTUUhIGNvdWxkIGhhdmUgIjBsIi4uLiB0aGVuIHdoYXQ/PyAqLwotCSAgICAgIGlmICh2YWx1ZSA9PSAwICYmICpuICE9ICcwJykKLQkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgciA9IGZpbmRfZW50cnlfYnluYW1lIChlLT5wcm9jZXNzb3IsIGYtPnR5cGUsIG4pOwotCSAgICAgIGlmIChyKQotCQl2YWx1ZSA9IHItPnZhbHVlOwotCSAgICAgIGVsc2UKLQkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBlX2FkZHI6Ci0JICAvKiB1c2UgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlIHRvIGZpbmQgc3ltYm9sICovCi0JICAvKiBGSVhNRSEhIERvIHdlIG5lZWQgdGhpcz8KLQkJCQlpZiBzbywgd2hhdCBhYm91dCByZWxvY3M/PwotCQkJCW15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JCQkJcmV0dXJuIDA7CS8tKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICotLwotCQkJCWJyZWFrOwotCQkJKi8KLQkgIC8qIElmIG5vdCBhIHN5bWJvbCwgZmFsbCB0aHJ1IHRvIElNTUVEICovCi0JY2FzZSBlX2ltbWVkOgotCSAgaWYgKCpuID09ICcwJyAmJiAqKG4gKyAxKSA9PSAneCcpCS8qIGhleCBiZWdpbnMgMHguLi4gKi8KLQkgICAgewotCSAgICAgIG4gKz0gMjsKLQkgICAgICB2YWx1ZSA9IHN0cnRvbCAobiwgMCwgMTYpOwotCSAgICAgIC8qIEZJWE1FISBjb3VsZCBoYXZlICIweGwiLi4uIHRoZW4gd2hhdD8/ICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHZhbHVlID0gc3RydG9sIChuLCAwLCAxMCk7Ci0JICAgICAgLyogRklYTUUhIGNvdWxkIGhhdmUgIjBsIi4uLiB0aGVuIHdoYXQ/PyAqLwotCSAgICAgIGlmICh2YWx1ZSA9PSAwICYmICpuICE9ICcwJykKLQkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KLQkgICAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiAwOwkJLyogZXJyb3I7IGludmFsaWQgZmllbGQgc3BlYyAqLwotCX0KLSAgICAgIG9wY29kZSB8PSBhcHBseV9yYW5nZSAodmFsdWUsIGYtPnJhbmdlKTsKLSAgICB9Ci0gIGlmIChzICYmICpzKQotICAgIHJldHVybiAwOwkJCS8qIGVycm9yIC0gdG9vIG1hbnkgb3BlcmFuZHMgKi8KLSAgcmV0dXJuIG9wY29kZTsJCS8qIGRvbmUhICovCi19Ci0KLS8qIERpc2Fzc2VtYmxlIGluc3RydWN0aW9uICJpbnNuIi4KLSAqIGluc24gLSBpbnN0cnVjdGlvbgotICogcyAtIGJ1ZmZlciB0byBob2xkIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbgotICogcmV0dXJucyAtIDEgaWYgc3VjY2VlZGVkOyAwIGlmIGZhaWxlZAotICovCi0KLWludCAKLWl0YmxfZGlzYXNzZW1ibGUgKGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgaW5zbikKLXsKLSAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yOwotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmY7Ci0KLSAgaWYgKCFJVEJMX0lTX0lOU04gKGluc24pKQotICAgIHJldHVybiAwOwkJCS8qIGVycm9yKi8KLSAgcHJvY2Vzc29yID0gZ2V0X3Byb2Nlc3NvciAoSVRCTF9ERUNPREVfUE5VTSAoaW5zbikpOwotCi0gIC8qIGZpbmQgZW50cnkgaW4gbGlzdCAqLwotICBlID0gZmluZF9lbnRyeV9ieXZhbCAocHJvY2Vzc29yLCBlX2luc24sIGluc24sIDApOwotICBpZiAoIWUpCi0gICAgcmV0dXJuIDA7CQkJLyogb3Bjb2RlIG5vdCBpbiB0YWJsZTsgaW52YWxpZCBpbnN0cnVzdGlvbiAqLwotICBzdHJjcHkgKHMsIGUtPm5hbWUpOwotCi0gIC8qIHBhcnNlIGluc24ncyBhcmdzIChpZiBhbnkpICovCi0gIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCS8qIGZvciBlYWNoIGFyZywgLi4uICovCi0gICAgewotICAgICAgc3RydWN0IGl0YmxfZW50cnkgKnI7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0gICAgICBpZiAoZiA9PSBlLT5maWVsZHMpCS8qIGZpcnN0IG9wZXJhbmQgaXMgcHJlY2VlZGVkIGJ5IHRhYiAqLwotCXN0cmNhdCAocywgIlx0Iik7Ci0gICAgICBlbHNlCQkJLyogJywncyBzZXBhcmF0ZSBmb2xsb3dpbmcgb3BlcmFuZHMgKi8KLQlzdHJjYXQgKHMsICIsIik7Ci0gICAgICB2YWx1ZSA9IGV4dHJhY3RfcmFuZ2UgKGluc24sIGYtPnJhbmdlKTsKLSAgICAgIC8qIG4gc2hvdWxkIGJlIGluIGZvcm0gJG4gb3IgMHhoaGggKGFyZSBzeW1ib2wgbmFtZXMgdmFsaWQ/PyAqLwotICAgICAgc3dpdGNoIChmLT50eXBlKQotCXsKLQljYXNlIGVfZHJlZzoKLQljYXNlIGVfY3JlZzoKLQljYXNlIGVfZ3JlZzoKLQkgIC8qIEFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgbmFtZQotCQkJICogb3IgJyQnIGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlciBudW1iZXIgKi8KLQkgIHIgPSBmaW5kX2VudHJ5X2J5dmFsIChlLT5wcm9jZXNzb3IsIGYtPnR5cGUsIHZhbHVlLCAmZi0+cmFuZ2UpOwotCSAgaWYgKHIpCi0JICAgIHN0cmNhdCAocywgci0+bmFtZSk7Ci0JICBlbHNlCi0JICAgIHNwcmludGYgKHMsICIlcyQlbHUiLCBzLCB2YWx1ZSk7Ci0JICBicmVhazsKLQljYXNlIGVfYWRkcjoKLQkgIC8qIHVzZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUgdG8gZmluZCBzeW1ib2wgKi8KLQkgIC8qIEZJWE1FISEgRG8gd2UgbmVlZCB0aGlzPwotCQkJICogICBpZiBzbywgd2hhdCBhYm91dCByZWxvY3M/PwotCQkJKi8KLQkgIC8qIElmIG5vdCBhIHN5bWJvbCwgZmFsbCB0aHJ1IHRvIElNTUVEICovCi0JY2FzZSBlX2ltbWVkOgotCSAgc3ByaW50ZiAocywgIiVzMHglbHgiLCBzLCB2YWx1ZSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIDA7CQkvKiBlcnJvcjsgaW52YWxpZCBmaWVsZCBzcGVjICovCi0JfQotICAgIH0KLSAgcmV0dXJuIDE7CQkJLyogZG9uZSEgKi8KLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qCi0gKiBMb2NhbCBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBwcml2YXRlIHN0cnVjdHVyZXMgY29udGFpbmluZwotICogdGhlIG5hbWVzIGFuZCBmb3JtYXQgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMKLSAqIGZvciBlYWNoIHByb2Nlc3Nvci4KLSAqLwotCi0vKiBDYWxjdWxhdGUgaW5zdHJ1Y3Rpb24ncyBvcGNvZGUgYW5kIGZ1bmN0aW9uIHZhbHVlcyBmcm9tIGVudHJ5ICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIAotYnVpbGRfb3Bjb2RlIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSkKLXsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgb3Bjb2RlID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7Ci0gIG9wY29kZSB8PSBJVEJMX0VOQ09ERV9QTlVNIChlLT5wcm9jZXNzb3IpOwotICByZXR1cm4gb3Bjb2RlOwotfQotCi0vKiBDYWxjdWxhdGUgYWJzb2x1dGUgdmFsdWUgZ2l2ZW4gdGhlIHJlbGF0aXZlIHZhbHVlIGFuZCBiaXQgcG9zaXRpb24gcmFuZ2UKLSAqIHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0gKiBUaGUgcmFuZ2UgaXMgaW5jbHVzaXZlIHdoZXJlIDAgaXMgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgotICogQSByYW5nZSBvZiB7IDI0LCAyMCB9IHdpbGwgaGF2ZSBhIG1hc2sgb2YKLSAqIGJpdCAgIDMgICAgICAgICAgIDIgICAgICAgICAgICAxCi0gKiBwb3M6IDEwOTggNzY1NCAzMjEwIDk4NzYgNTQzMiAxMDk4IDc2NTQgMzIxMAotICogYmluOiAwMDAwIDAwMDEgMTExMSAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAKLSAqIGhleDogICAgMCAgICAxICAgIGYgICAgMCAgICAwICAgIDAgICAgMCAgICAwCi0gKiBtYXNrOiAweDAxZjAwMDAwLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIAotYXBwbHlfcmFuZ2UgKHVuc2lnbmVkIGxvbmcgcnZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgcikKLXsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICB1bnNpZ25lZCBsb25nIGF2YWw7Ci0gIGludCBsZW4gPSBNQVhfQklUUE9TIC0gci5zYml0OwotCi0gIEFTU0VSVCAoci5zYml0ID49IHIuZWJpdCk7Ci0gIEFTU0VSVCAoTUFYX0JJVFBPUyA+PSByLnNiaXQpOwotICBBU1NFUlQgKHIuZWJpdCA+PSAwKTsKLQotICAvKiBjcmVhdGUgbWFzayBieSB0cnVuY2F0aW5nIDFzIGJ5IHNoaWZ0aW5nICovCi0gIG1hc2sgPSAweGZmZmZmZmZmIDw8IGxlbjsKLSAgbWFzayA9IG1hc2sgPj4gbGVuOwotICBtYXNrID0gbWFzayA+PiByLmViaXQ7Ci0gIG1hc2sgPSBtYXNrIDw8IHIuZWJpdDsKLQotICBhdmFsID0gKHJ2YWwgPDwgci5lYml0KSAmIG1hc2s7Ci0gIHJldHVybiBhdmFsOwotfQotCi0vKiBDYWxjdWxhdGUgcmVsYXRpdmUgdmFsdWUgZ2l2ZW4gdGhlIGFic29sdXRlIHZhbHVlIGFuZCBiaXQgcG9zaXRpb24gcmFuZ2UKLSAqIHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAKLWV4dHJhY3RfcmFuZ2UgKHVuc2lnbmVkIGxvbmcgYXZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgcikKLXsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICB1bnNpZ25lZCBsb25nIHJ2YWw7Ci0gIGludCBsZW4gPSBNQVhfQklUUE9TIC0gci5zYml0OwotCi0gIC8qIGNyZWF0ZSBtYXNrIGJ5IHRydW5jYXRpbmcgMXMgYnkgc2hpZnRpbmcgKi8KLSAgbWFzayA9IDB4ZmZmZmZmZmYgPDwgbGVuOwotICBtYXNrID0gbWFzayA+PiBsZW47Ci0gIG1hc2sgPSBtYXNrID4+IHIuZWJpdDsKLSAgbWFzayA9IG1hc2sgPDwgci5lYml0OwotCi0gIHJ2YWwgPSAoYXZhbCAmIG1hc2spID4+IHIuZWJpdDsKLSAgcmV0dXJuIHJ2YWw7Ci19Ci0KLS8qIEV4dHJhY3QgcHJvY2Vzc29yJ3MgYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gZmllbGQgbmFtZSBmcm9tIHM7Ci0gKiBmb3JtcyBhcmUgIm4gYXJncyIgIm4sYXJncyIgb3IgIm4iICovCi0vKiBSZXR1cm4gbmV4dCBhcmd1bWVudCBmcm9tIHN0cmluZyBwb2ludGVyICJzIiBhbmQgYWR2YW5jZSBzLgotICogZGVsaW1pdGVycyBhcmUgIiAsKCkiICovCi0KLWNoYXIgKgotaXRibF9nZXRfZmllbGQgKGNoYXIgKipTKQotewotICBzdGF0aWMgY2hhciBuWzEyOF07Ci0gIGNoYXIgKnM7Ci0gIGludCBsZW47Ci0KLSAgcyA9ICpTOwotICBpZiAoIXMgfHwgISpzKQotICAgIHJldHVybiAwOwotICAvKiBGSVhNRTogVGhpcyBpcyBhIHdlaXJkIHNldCBvZiBkZWxpbWl0ZXJzLiAgKi8KLSAgbGVuID0gc3RyY3NwbiAocywgIiBcdCwoKSIpOwotICBBU1NFUlQgKDEyOCA+IGxlbiArIDEpOwotICBzdHJuY3B5IChuLCBzLCBsZW4pOwotICBuW2xlbl0gPSAwOwotICBpZiAoc1tsZW5dID09ICdcMCcpCi0gICAgcyA9IDA7CQkJLyogbm8gbW9yZSBhcmdzICovCi0gIGVsc2UKLSAgICBzICs9IGxlbiArIDE7CQkvKiBhZHZhbmNlIHRvIG5leHQgYXJnICovCi0KLSAgKlMgPSBzOwotICByZXR1cm4gbjsKLX0KLQotLyogU2VhcmNoIGVudHJpZXMgZm9yIGEgZ2l2ZW4gcHJvY2Vzc29yIGFuZCB0eXBlCi0gKiB0byBmaW5kIG9uZSBtYXRjaGluZyB0aGUgbmFtZSAibiIuCi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKgotZmluZF9lbnRyeV9ieW5hbWUgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJICAgZV90eXBlIHR5cGUsIGNoYXIgKm4pCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOwotCi0gIGVzID0gZ2V0X2VudHJpZXMgKHByb2Nlc3NvciwgdHlwZSk7Ci0gIGZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCS8qIGZvciBlYWNoIGVudHJ5LCAuLi4gKi8KLSAgICB7Ci0gICAgICBpZiAoIXN0cmNtcCAoZS0+bmFtZSwgbikpCi0JcmV0dXJuIGU7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogU2VhcmNoIGVudHJpZXMgZm9yIGEgZ2l2ZW4gcHJvY2Vzc29yIGFuZCB0eXBlCi0gKiB0byBmaW5kIG9uZSBtYXRjaGluZyB0aGUgdmFsdWUgInZhbCIgZm9yIHRoZSByYW5nZSAiciIuCi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeS4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgZGlzYXNzZW1ibGluZyBmaWVsZHMgb2YgYW4gaW5zdHJ1Y3Rpb24uCi0gKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoKLWZpbmRfZW50cnlfYnl2YWwgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCi0JCSAgdW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBpdGJsX3JhbmdlICpyKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgdW5zaWduZWQgbG9uZyBldmFsOwotCi0gIGVzID0gZ2V0X2VudHJpZXMgKHByb2Nlc3NvciwgdHlwZSk7Ci0gIGZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCS8qIGZvciBlYWNoIGVudHJ5LCAuLi4gKi8KLSAgICB7Ci0gICAgICBpZiAocHJvY2Vzc29yICE9IGUtPnByb2Nlc3NvcikKLQljb250aW51ZTsKLSAgICAgIC8qIEZvciBpbnNucywgd2UgbWlnaHQgbm90IGtub3cgdGhlIHJhbmdlIG9mIHRoZSBvcGNvZGUsCi0JICogc28gYSByYW5nZSBvZiAwIHdpbGwgYWxsb3cgdGhpcyByb3V0aW5lIHRvIG1hdGNoIGFnYWluc3QKLQkgKiB0aGUgcmFuZ2Ugb2YgdGhlIGVudHJ5IHRvIGJlIGNvbXBhcmVkIHdpdGguCi0JICogVGhpcyBjb3VsZCBjYXVzZSBhbWJpZ3VpdGllcy4KLQkgKiBGb3Igb3BlcmFuZHMsIHdlIGdldCBhbiBleHRyYWN0ZWQgdmFsdWUgYW5kIGEgcmFuZ2UuCi0JICovCi0gICAgICAvKiBpZiByYW5nZSBpcyAwLCBtYXNrIHZhbCBhZ2FpbnN0IHRoZSByYW5nZSBvZiB0aGUgY29tcGFyZWQgZW50cnkuICovCi0gICAgICBpZiAociA9PSAwKQkJLyogaWYgbm8gcmFuZ2UgcGFzc2VkLCBtdXN0IGJlIHdob2xlIDMyLWJpdHMKLQkJCSAqIHNvIGNyZWF0ZSAzMi1iaXQgdmFsdWUgZnJvbSBlbnRyeSdzIHJhbmdlICovCi0JewotCSAgZXZhbCA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOwotCSAgdmFsICY9IGFwcGx5X3JhbmdlICgweGZmZmZmZmZmLCBlLT5yYW5nZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHItPnNiaXQgPT0gZS0+cmFuZ2Uuc2JpdCAmJiByLT5lYml0ID09IGUtPnJhbmdlLmViaXQpCi0JICAgICAgIHx8IChlLT5yYW5nZS5zYml0ID09IDAgJiYgZS0+cmFuZ2UuZWJpdCA9PSAwKSkKLQl7Ci0JICBldmFsID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCAqcik7Ci0JICB2YWwgPSBhcHBseV9yYW5nZSAodmFsLCAqcik7Ci0JfQotICAgICAgZWxzZQotCWNvbnRpbnVlOwotICAgICAgaWYgKHZhbCA9PSBldmFsKQotCXJldHVybiBlOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGxpc3Qgb2YgZW50cmllcyBmb3IgYSBnaXZlbiBwcm9jZXNzb3IgYW5kIHR5cGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqKgotZ2V0X2VudHJpZXMgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUpCi17Ci0gIHJldHVybiAmZW50cmllc1twcm9jZXNzb3JdW3R5cGVdOwotfQotCi0vKiBSZXR1cm4gYW4gaW50ZWdyYWwgdmFsdWUgZm9yIHRoZSBwcm9jZXNzb3IgcGFzc2VkIGZyb20geXlwYXJzZS4gKi8KLQotc3RhdGljIGVfcHJvY2Vzc29yIAotZ2V0X3Byb2Nlc3NvciAoaW50IHl5cHJvYykKLXsKLSAgLyogdHJhbnNsYXRlIGZyb20geWFjYydzIHByb2Nlc3NvciB0byBlbnVtICovCi0gIGlmICh5eXByb2MgPj0gZV9wMCAmJiB5eXByb2MgPCBlX25wcm9jcykKLSAgICByZXR1cm4gKGVfcHJvY2Vzc29yKSB5eXByb2M7Ci0gIHJldHVybiBlX2ludnByb2M7CQkvKiBlcnJvcjsgaW52YWxpZCBwcm9jZXNzb3IgKi8KLX0KLQotLyogUmV0dXJuIGFuIGludGVncmFsIHZhbHVlIGZvciB0aGUgZW50cnkgdHlwZSBwYXNzZWQgZnJvbSB5eXBhcnNlLiAqLwotCi1zdGF0aWMgZV90eXBlIAotZ2V0X3R5cGUgKGludCB5eXR5cGUpCi17Ci0gIHN3aXRjaCAoeXl0eXBlKQotICAgIHsKLSAgICAgIC8qIHRyYW5zbGF0ZSBmcm9tIHlhY2MncyB0eXBlIHRvIGVudW0gKi8KLSAgICBjYXNlIElOU046Ci0gICAgICByZXR1cm4gZV9pbnNuOwotICAgIGNhc2UgRFJFRzoKLSAgICAgIHJldHVybiBlX2RyZWc7Ci0gICAgY2FzZSBDUkVHOgotICAgICAgcmV0dXJuIGVfY3JlZzsKLSAgICBjYXNlIEdSRUc6Ci0gICAgICByZXR1cm4gZV9ncmVnOwotICAgIGNhc2UgQUREUjoKLSAgICAgIHJldHVybiBlX2FkZHI7Ci0gICAgY2FzZSBJTU1FRDoKLSAgICAgIHJldHVybiBlX2ltbWVkOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZV9pbnZ0eXBlOwkJLyogZXJyb3I7IGludmFsaWQgdHlwZSAqLwotICAgIH0KLX0KLQotCi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlbnRyeSAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKgotYWxsb2NfZW50cnkgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCi0JICAgICBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgaWYgKCFuYW1lKQotICAgIHJldHVybiAwOwotICBlID0gKHN0cnVjdCBpdGJsX2VudHJ5ICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaXRibF9lbnRyeSkpOwotICBpZiAoZSkKLSAgICB7Ci0gICAgICBtZW1zZXQgKGUsIDAsIHNpemVvZiAoc3RydWN0IGl0YmxfZW50cnkpKTsKLSAgICAgIGUtPm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKHNpemVvZiAoc3RybGVuIChuYW1lKSkgKyAxKTsKLSAgICAgIGlmIChlLT5uYW1lKQotCXN0cmNweSAoZS0+bmFtZSwgbmFtZSk7Ci0gICAgICBlLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0gICAgICBlLT50eXBlID0gdHlwZTsKLSAgICAgIGUtPnZhbHVlID0gdmFsdWU7Ci0gICAgICBlcyA9IGdldF9lbnRyaWVzIChlLT5wcm9jZXNzb3IsIGUtPnR5cGUpOwotICAgICAgZS0+bmV4dCA9ICplczsKLSAgICAgICplcyA9IGU7Ci0gICAgfQotICByZXR1cm4gZTsKLX0KLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gZW50cnkncyBmaWVsZCAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZmllbGQgKgotYWxsb2NfZmllbGQgKGVfdHlwZSB0eXBlLCBpbnQgc2JpdCwgaW50IGViaXQsCi0JICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLSAgZiA9IChzdHJ1Y3QgaXRibF9maWVsZCAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGl0YmxfZmllbGQpKTsKLSAgaWYgKGYpCi0gICAgewotICAgICAgbWVtc2V0IChmLCAwLCBzaXplb2YgKHN0cnVjdCBpdGJsX2ZpZWxkKSk7Ci0gICAgICBmLT50eXBlID0gdHlwZTsKLSAgICAgIGYtPnJhbmdlLnNiaXQgPSBzYml0OwotICAgICAgZi0+cmFuZ2UuZWJpdCA9IGViaXQ7Ci0gICAgICBmLT5mbGFncyA9IGZsYWdzOwotICAgIH0KLSAgcmV0dXJuIGY7Ci19CmRpZmYgLS1naXQgYS9nYXMvaXRibC1vcHMuaCBiL2dhcy9pdGJsLW9wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjllYTdmLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLW9wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qIGl0Ymwtb3BzLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRXh0ZXJuYWwgZnVuY3Rpb25zLCBjb25zdGFudHMgYW5kIGRlZmluZXMgZm9yIGl0Ymwgc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogSW5jbHVkZSBmaWxlIG5vdGVzOiAiZXhwci5oIiBuZWVkZWQgYmVmb3JlIHRhcmctKi5oLAotICogInRhcmctZW52LmgiIGluY2x1ZGVzIHRoZSBjaGFpbiBvZiB0YXJnZXQgZGVwZW5kYW50IGhlYWRlcnMsCi0gKiAidGFyZy1jcHUuaCIgaGFzIHRoZSBIQVZFX0lUQkxfQ1BVIGRlZmluZSwgYW5kCi0gKiBhcy5oIGluY2x1ZGVzIHRoZW0gYWxsICovCi0jaW5jbHVkZSAiYXMuaCIKLQotI2lmZGVmIEhBVkVfSVRCTF9DUFUKLSNpbmNsdWRlICJpdGJsLWNwdS5oIgotI2VuZGlmCi0KLS8qIERlZmF1bHRzIGZvciBkZWZpbml0aW9ucyByZXF1aXJlZCBieSBnZW5lcmljIGNvZGUgKi8KLSNpZm5kZWYgSVRCTF9OVU1CRVJfT0ZfUFJPQ0VTU09SUwotI2RlZmluZSBJVEJMX05VTUJFUl9PRl9QUk9DRVNTT1JTIDEKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfTUFYX0JJVFBPUwotI2RlZmluZSBJVEJMX01BWF9CSVRQT1MgMzEKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfVFlQRQotI2RlZmluZSBJVEJMX1RZUEUgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9JU19JTlNOCi0jZGVmaW5lIElUQkxfSVNfSU5TTihpbnNuKSAxCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX0RFQ09ERV9QTlVNCi0jZGVmaW5lIElUQkxfREVDT0RFX1BOVU0oaW5zbikgMAotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9FTkNPREVfUE5VTQotI2RlZmluZSBJVEJMX0VOQ09ERV9QTlVNKHBudW0pIDAKLSNlbmRpZgotCi10eXBlZGVmIElUQkxfVFlQRSB0X2luc247Ci0KLS8qIHR5cGVzIG9mIGVudHJpZXMgKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgZV9pbnNuLAotICAgIGVfZHJlZywKLSAgICBlX3JlZ3R5cGUwID0gZV9kcmVnLAotICAgIGVfY3JlZywKLSAgICBlX2dyZWcsCi0gICAgZV9hZGRyLAotICAgIGVfbnJlZ3R5cGVzID0gZV9ncmVnICsgMSwKLSAgICBlX2ltbWVkLAotICAgIGVfbnR5cGVzLAotICAgIGVfaW52dHlwZQkJCS8qIGludmFsaWQgdHlwZSAqLwotICB9IGVfdHlwZTsKLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBlX3AwLAotICAgIGVfbnByb2NzID0gTlVNQkVSX09GX1BST0NFU1NPUlMsCi0gICAgZV9pbnZwcm9jCQkJLyogaW52YWxpZCBwcm9jZXNzb3IgKi8KLSAgfSBlX3Byb2Nlc3NvcjsKLQotLyogMCBtZWFucyBhbiBpbnN0cnVjdGlvbiB0YWJsZSB3YXMgbm90IHNwZWNpZmllZC4gKi8KLWV4dGVybiBpbnQgaXRibF9oYXZlX2VudHJpZXM7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSB2aXNpYmxlIHRvIHRoZSBtYWluIHBhcnQgb2YgdGhlIGFzc2VtYmxlciAqLwotCi1pbnQgaXRibF9wYXJzZSBQQVJBTVMgKChjaGFyICppbnNudGJsKSk7Ci12b2lkIGl0YmxfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1jaGFyICppdGJsX2dldF9maWVsZCBQQVJBTVMgKChjaGFyICoqcykpOwotdW5zaWduZWQgbG9uZyBpdGJsX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGNoYXIgKm9wZXJhbmRzKSk7Ci1pbnQgaXRibF9kaXNhc3NlbWJsZSBQQVJBTVMgKChjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgaW5zbikpOwotaW50IGl0YmxfcGFyc2UgUEFSQU1TICgoY2hhciAqdGJsKSk7CS8qIHBhcnNlcyBpbnNuIHRibCAqLwotaW50IGl0YmxfZ2V0X3JlZ192YWwgUEFSQU1TICgoY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqcHZhbCkpOwotaW50IGl0YmxfZ2V0X3ZhbCBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCBjaGFyICpuYW1lLAotCQkJICB1bnNpZ25lZCBsb25nICpwdmFsKSk7Ci1jaGFyICppdGJsX2dldF9uYW1lIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsKSk7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgYnkgdGhlIHRhYmxlIHBhcnNlciB1c2VkIHRvIGJ1aWxkIHRoZQotICAgZHluYW1pYyBsaXN0IG9mIG5ldyBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMuICovCi0KLXN0cnVjdCBpdGJsX2VudHJ5ICppdGJsX2FkZF9yZWcgUEFSQU1TICgoaW50IHl5cHJvYywgaW50IHl5dHlwZSwKLQkJCQkJIGNoYXIgKnJlZ25hbWUsIGludCByZWdudW0pKTsKLXN0cnVjdCBpdGJsX2VudHJ5ICppdGJsX2FkZF9pbnNuIFBBUkFNUyAoKGludCB5eXByb2MsIGNoYXIgKm5hbWUsCi0JICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgc2JpdCwgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0cnVjdCBpdGJsX2ZpZWxkICppdGJsX2FkZF9vcGVyYW5kIFBBUkFNUyAoKHN0cnVjdCBpdGJsX2VudHJ5ICogZSwgaW50IHl5dHlwZSwKLQkJCQkgIGludCBzYml0LCBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykpOwpkaWZmIC0tZ2l0IGEvZ2FzL2l0YmwtcGFyc2UueSBiL2dhcy9pdGJsLXBhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjZlZTguLjAwMDAwMDAKLS0tIGEvZ2FzL2l0YmwtcGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKiBpdGJsLXBhcnNlLnkKLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSV7Ci0KLS8qIAotCi1ZYWNjIGdyYW1tYXIgZm9yIGluc3RydWN0aW9uIHRhYmxlIGVudHJpZXMuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1PcmlnaW5hbCBJbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIGRvY3VtZW50OgotCi0JICAgIE1JUFMgQ29wcm9jZXNzb3IgVGFibGUgU3BlY2lmaWNhdGlvbgotCSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgTUlQUyBjb3Byb2Nlc3NvciB0YWJsZS4gIFRoZQotdGFibGUgc3BlY2lmaWVzIGEgbGlzdCBvZiB2YWxpZCBmdW5jdGlvbnMsIGRhdGEgcmVnaXN0ZXJzIGFuZCBjb250cm9sCi1yZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuICBUaGlzIGxpc3QsCi10b2dldGhlciB3aXRoIHRoZSBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjbGFzc2VzIGxpc3RlZCBiZWxvdywKLXNwZWNpZmllcyB0aGUgY29tcGxldGUgbGlzdCBvZiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsCi1iZSByZWNvZ25pemVkIGFuZCBhc3NlbWJsZWQgYnkgdGhlIEdOVSBhc3NlbWJsZXIuICBJbiBlZmZlY3QsCi10aGlzIG1ha2VzIHRoZSBHTlUgYXNzZW1ibGVyIHRhYmxlLWRyaXZlbiwgd2hlcmUgdGhlIHRhYmxlIGlzCi1zcGVjaWZpZWQgYnkgdGhlIHByb2dyYW1tZXIuCi0KLVRoZSB0YWJsZSBpcyBhbiBvcmRpbmFyeSB0ZXh0IGZpbGUgdGhhdCB0aGUgR05VIGFzc2VtYmxlciByZWFkcyB3aGVuCi1pdCBzdGFydHMuICBVc2luZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHRhYmxlLCB0aGUgYXNzZW1ibGVyCi1nZW5lcmF0ZXMgYW4gaW50ZXJuYWwgbGlzdCBvZiB2YWxpZCBjb3Byb2Nlc3NvciByZWdpc3RlcnMgYW5kCi1mdW5jdGlvbnMuICBUaGUgYXNzZW1ibGVyIHVzZXMgdGhpcyBpbnRlcm5hbCBsaXN0IGluIGFkZGl0aW9uIHRvIHRoZQotc3RhbmRhcmQgTUlQUyByZWdpc3RlcnMgYW5kIGluc3RydWN0aW9ucyB3aGljaCBhcmUgYnVpbHQtaW4gdG8gdGhlIAotYXNzZW1ibGVyIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0KLVRvIHNwZWNpZnkgdGhlIGNvcHJvY2Vzc29yIHRhYmxlIHdoZW4gaW52b2tpbmcgdGhlIEdOVSBhc3NlbWJsZXIsIHVzZQotdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi0taXRibCBmaWxlIiwgd2hlcmUgZmlsZSBpcyB0aGUKLWNvbXBsZXRlIG5hbWUgb2YgdGhlIHRhYmxlLCBpbmNsdWRpbmcgcGF0aCBhbmQgZXh0ZW5zaW9uLgotCi1FeGFtcGxlczoKLQotCSAgICBnYXMgLXQgY29wLnRibCB0ZXN0LnMgLW8gdGVzdC5vCi0JICAgIGdhcyAtdCAvdXNyL2xvY2FsL2xpYi9jb3AudGJsIHRlc3QucyAtbyB0ZXN0Lm8KLQkgICAgZ2FzIC0taXRibCBkOlxnbnVcZGF0YVxjb3AudGJsIHRlc3QucyAtbyB0ZXN0Lm8KLQotT25seSBvbmUgdGFibGUgbWF5IGJlIHN1cHBsaWVkIGR1cmluZyBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mCi10aGUgYXNzZW1ibGVyLgotCi0KLUluc3RydWN0aW9uIGNsYXNzZXMKLT09PT09PT09PT09PT09PT09PT0KLQotQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB2YWxpZCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjbGFzc2VzIGZvcgotYW55IGdpdmVuIGNvcHJvY2Vzc29yICJ6Ii4gIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgYWxyZWFkeSByZWNvZ25pemVkCi1ieSB0aGUgYXNzZW1ibGVyLCBhbmQgYXJlIGxpc3RlZCBoZXJlIG9ubHkgZm9yIHJlZmVyZW5jZS4KLQotQ2xhc3MgICBmb3JtYXQJICAgIAkgICAgCSAgICAgIGluc3RydWN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ2xhc3MxOgotCW9wIGJhc2UgcnQgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIExXQ3ogcnQsb2Zmc2V0IChiYXNlKQotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBTV0N6IHJ0LG9mZnNldCAoYmFzZSkKLUNsYXNzMjoKLQlDT1B6IHN1YiBydCByZCAwCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIE1UQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTUZDeiBydCxyZAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBDVEN6IHJ0LHJkCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIENGQ3ogcnQscmQKLUNsYXNzMzoKLQlDT1B6IENPIGNvZnVuCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIENPUHogY29mdW4KLUNsYXNzNDoKLQlDT1B6IEJDIGJyIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pUIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pGIG9mZnNldAotQ2xhc3M1OgotCUNPUHogc3ViIHJ0IHJkIDAKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgRE1GQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgRE1UQ3ogcnQscmQKLUNsYXNzNjoKLQlvcCBiYXNlIHJ0IG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBMREN6IHJ0LG9mZnNldCAoYmFzZSkKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgU0RDeiBydCxvZmZzZXQgKGJhc2UpCi1DbGFzczc6Ci0JQ09QeiBCQyBiciBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6VEwgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDekZMIG9mZnNldAotCi1UaGUgY29wcm9jZXNzb3IgdGFibGUgZGVmaW5lcyBjb3Byb2Nlc3Nvci1zcGVjaWZpYyByZWdpc3RlcnMgdGhhdCBjYW4KLWJlIHVzZWQgd2l0aCBhbGwgb2YgdGhlIGFib3ZlIGNsYXNzZXMgb2YgaW5zdHJ1Y3Rpb25zLCB3aGVyZQotYXBwcm9wcmlhdGUuICBJdCBhbHNvIGRlZmluZXMgYWRkaXRpb25hbCBjb3Byb2Nlc3Nvci1zcGVjaWZpYwotZnVuY3Rpb25zIGZvciBDbGFzczMgKENPUHogY29mdW4pIGluc3RydWN0aW9ucywgVGh1cywgdGhlIHRhYmxlIGFsbG93cwotdGhlIHByb2dyYW1tZXIgdG8gdXNlIGNvbnZlbmllbnQgbW5lbW9uaWNzIGFuZCBvcGVyYW5kcyBmb3IgdGhlc2UKLWZ1bmN0aW9ucywgaW5zdGVhZCBvZiB0aGUgQ09QeiBtbWVubW9uaWMgYW5kIGNvZnVuIG9wZXJhbmQuCi0KLVRoZSBuYW1lcyBvZiB0aGUgTUlQUyBnZW5lcmFsIHJlZ2lzdGVycyBhbmQgdGhlaXIgYWxpYXNlcyBhcmUgZGVmaW5lZAotYnkgdGhlIGFzc2VtYmxlciBhbmQgd2lsbCBiZSByZWNvZ25pemVkIGFzIHZhbGlkIHJlZ2lzdGVyIG5hbWVzIGJ5IHRoZQotYXNzZW1ibGVyIHdoZW4gdXNlZCAod2hlcmUgYWxsb3dlZCkgaW4gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLgotSG93ZXZlciwgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgYWxsIGNvcHJvY2Vzc29yIGRhdGEgYW5kIGNvbnRyb2wKLXJlZ2lzdGVyIG1uZW1vbmljcyBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgY29wcm9jZXNzb3IgdGFibGUuCi0KLQotVGFibGUgR3JhbW1hcgotPT09PT09PT09PT09PQotCi1IZXJlIGlzIHRoZSBncmFtbWFyIGZvciB0aGUgY29wcm9jZXNzb3IgdGFibGU6Ci0KLQkgICAgdGFibGUgLT4gZW50cnkqCi0KLQkgICAgZW50cnkgLT4gW3ogZW50cnlkZWZdIFtjb21tZW50XSAnXG4nCi0KLQkgICAgZW50cnlkZWYgLT4gdHlwZSBuYW1lIHZhbAotCSAgICBlbnRyeWRlZiAtPiAnaW5zbicgbmFtZSB2YWwgZnVuY2RlZiA7IHR5cGUgb2YgZW50cnkgKGluc3RydWN0aW9uKQotCi0JICAgIHogLT4gJ3AnWycwJy4uJzMnXQkgICAgCSAgICAgOyBwcm9jZXNzb3IgbnVtYmVyIAotCSAgICB0eXBlIC0+IFsnZHJlZycgfCAnY3JlZycgfCAnZ3JlZycgXQkgICAgIDsgdHlwZSBvZiBlbnRyeSAocmVnaXN0ZXIpCi0JOyAnZHJlZycsICdjcmVnJyBvciAnZ3JlZycgc3BlY2lmaWVzIGEgZGF0YSwgY29udHJvbCwgb3IgZ2VuZXJhbAotCTsJICAgIHJlZ2lzdGVyIG1uZW1vbmljLCByZXNwZWN0aXZlbHkKLQkgICAgbmFtZSAtPiBbbHRyfGRlY10qCSAgICAJICAgICA7IG1uZW1vbmljIG9mIHJlZ2lzdGVyL2Z1bmN0aW9uCi0JICAgIHZhbCAtPiBbZGVjfGhleF0JICAgIAkgICAgIDsgcmVnaXN0ZXIvZnVuY3Rpb24gbnVtYmVyIChpbnRlZ2VyIGNvbnN0YW50KQotCi0JICAgIGZ1bmNkZWYgLT4gZnJhbmdlIGZsYWdzIGZpZWxkcwotCSAgICAJICAgIAkgICAgCTsgYml0ZmllbGQgcmFuZ2UgZm9yIG9wY29kZQotCSAgICAJICAgIAkgICAgCTsgbGlzdCBvZiBmaWVsZHMnIGZvcm1hdHMKLQkgICAgZmllbGRzIC0+IGZpZWxkKgotCSAgICBmaWVsZCAtPiBbJywnXSBmdHlwZSBmcmFuZ2UgZmxhZ3MKLQkgICAgZmxhZ3MgLT4gWycqJyBmbGFnZXhwcl0KLQkgICAgZmxhZ2V4cHIgLT4gJ1snIGZsYWdleHByICddJwotCSAgICBmbGFnZXhwciAtPiB2YWwgJ3wnIGZsYWdleHByIAotCSAgICBmdHlwZSAtPiBbIHR5cGUgfCAnaW1tZWQnIHwgJ2FkZHInIF0KLQk7ICdpbW1lZCcgc3BlY2lmaWVzIGFuIGltbWVkaWF0ZSB2YWx1ZTsgc2VlIGdyYW1tYXIgZm9yICJ2YWwiIGFib3ZlCi0JICAgIAk7ICdhZGRyJyBzcGVjaWZpZXMgYSBDIGlkZW50aWZpZXI7IG5hbWUgb2Ygc3ltYm9sIHRvIGJlIHJlc29sdmVkIGF0IAotCTsJICAgIGxpbmsgdGltZQotCSAgICBmcmFuZ2UgLT4gJzonIHZhbCAnLScgdmFsCTsgc3RhcnRpbmcgdG8gZW5kaW5nIGJpdCBwb3NpdGlvbnMsIHdoZXJlCi0JICAgIAkgICAgCSAgICAJOyB3aGVyZSAwIGlzIGxlYXN0IHNpZ25pZmljYW50IGJpdAotCSAgICBmcmFuZ2UgLT4gKG51bGwpCSAgICAJOyBkZWZhdWx0IHJhbmdlIG9mIDMxLTAgd2lsbCBiZSBhc3N1bWVkCi0KLQkgICAgY29tbWVudCAtPiBbJzsnfCcjJ10gW2NoYXJdKgotCSAgICBjaGFyIC0+IGFueSBwcmludGFibGUgY2hhcmFjdGVyCi0JICAgIGx0ciAtPiBbJ2EnLi4neid8J0EnLi4nWiddIAotCSAgICBkZWMgLT4gWycwJy4uJzknXSoJICAgIAkgICAgCSAgICAJICAgIAkgICAgIDsgdmFsdWUgaW4gZGVjaW1hbAotCSAgICBoZXggLT4gJzB4J1snMCcuLic5JyB8ICdhJy4uJ2YnIHwgJ0EnLi4nRiddKgk7IHZhbHVlIGluIGhleGlkZWNpbWFsIAotCi0KLUV4YW1wbGVzCi09PT09PT09PQotCi1FeGFtcGxlIDE6Ci0KLVRoZSB0YWJsZToKLQotCSAgICBwMSBkcmVnIGQxIDEJICAgICA7IGRhdGEgcmVnaXN0ZXIgImQxIiBmb3IgQ09QMSBoYXMgdmFsdWUgMQotCSAgICBwMSBjcmVnIGMzIDMJICAgICA7IGN0cmwgcmVnaXN0ZXIgImMzIiBmb3IgQ09QMSBoYXMgdmFsdWUgMwotCSAgICBwMyBmdW5jIGZpbGwgMHgxZjoyNC0yMAkgICAgICA7IGZ1bmN0aW9uICJmaWxsIiBmb3IgQ09QMyBoYXMgdmFsdWUgMzEgYW5kIAotCSAgICAJICAgIAk7IG5vIGZpZWxkcwotCi13aWxsIGFsbG93IHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IHRoZSBmb2xsb3dpbmcgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zOgotCi0JICAgIExXQzEgZDEsMHgxMDAgKCQyKQotCSAgICBmaWxsCi0KLUhlcmUsIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgIiQyIiwgYW5kIGluc3RydWN0aW9uICJMV0MxIiwgYXJlIHN0YW5kYXJkIAotbW5lbW9uaWNzIGJ1aWx0LWluIHRvIHRoZSBNSVBTIGFzc2VtYmxlci4gIAotCi0KLUV4YW1wbGUgMjoKLQotVGhlIHRhYmxlOgotCi0JICAgIHAzIGRyZWcgZDMgMwkgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0JICAgIHAzIGNyZWcgYzIgMjIJICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLQkgICAgcDMgZnVuYyBmZWUgMHgxZjoyNC0yMCBkcmVnOjE3LTEzIGNyZWc6MTItOCBpbW1lZDo3LTAgCi0JICAgIAk7IGZ1bmN0aW9uICJmZWUiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMSwgYW5kIDMgZmllbGRzIAotCSAgICAJOyBjb25zaXN0aW5nIG9mIGEgZGF0YSByZWdpc3RlciwgYSBjb250cm9sIHJlZ2lzdGVyLCAKLQkgICAgCTsgYW5kIGFuIGltbWVkaWF0ZSB2YWx1ZS4KLQotd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCB0aGUgZm9sbG93aW5nIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uOgotCi0JICAgIGZlZSBkMyxjMiwweDEKLQotYW5kIHdpbGwgZW1pdCB0aGUgb2JqZWN0IGNvZGU6Ci0KLQkgICAgMzEtMjYgIDI1IDI0LTIwIDE5LTE4ICAxNy0xMyAxMi04ICA3LTAKLQkgICAgQ09QeiAgIENPIGZ1bgkgICAgCSAgICAgIGRyZWcgIGNyZWcgIGltbWVkCi0JICAgIDAxMDAxMSAxICAxMTExMSAwMAkgICAgIDAwMDExIDEwMTEwIDAwMDAwMDAxIAotCi0JICAgIDB4NGZmMDc2MDEKLQotCi1FeGFtcGxlIDM6Ci0KLVRoZSB0YWJsZToKLQotCSAgICBwMyBkcmVnIGQzIDMJICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotCSAgICBwMyBjcmVnIGMyIDIyCSAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0JICAgIHAzIGZ1bmMgZnV1IDB4MDFmMDAwMDEgZHJlZzoxNy0xMyBjcmVnOjEyLTgKLQotd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCB0aGUgZm9sbG93aW5nIGNvcHJvY2Vzc29yCi1pbnN0cnVjdGlvbjoKLQotCSAgICBmdXUgZDMsYzIKLQotYW5kIHdpbGwgZW1pdCB0aGUgb2JqZWN0IGNvZGU6Ci0KLQkgICAgMzEtMjYgIDI1IDI0LTIwIDE5LTE4ICAxNy0xMyAxMi04ICA3LTAKLQkgICAgQ09QeiAgIENPIGZ1bgkgICAgCSAgICAgIGRyZWcgIGNyZWcgIAotCSAgICAwMTAwMTEgMSAgMTExMTEgMDAJICAgICAwMDAxMSAxMDExMCAwMDAwMDAwMSAKLQotCSAgICAweDRmZjA3NjAxCi0KLUluIHRoaXMgd2F5LCB0aGUgcHJvZ3JhbW1lciBjYW4gZm9yY2UgYXJiaXRyYXJ5IGJpdHMgb2YgYW4gaW5zdHJ1Y3Rpb24KLXRvIGhhdmUgcHJlZGVmaW5lZCB2YWx1ZXMuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BZGRpdGlvbmFsIG5vdGVzOgotCi1FbmNvZGluZyBvZiByYW5nZXM6Ci1UbyBoYW5kbGUgbW9yZSB0aGFuIG9uZSBiaXQgcG9zaXRpb24gcmFuZ2Ugd2l0aGluIGFuIGluc3RydWN0aW9uLAotdXNlIDBzIHRvIG1hc2sgb3V0IHRoZSByYW5nZXMgd2hpY2ggZG9uJ3QgYXBwbHkuCi1NYXkgZGVjaWRlIHRvIG1vZGlmeSB0aGUgc3ludGF4IHRvIGFsbG93IGNvbW1hcyBzZXBhcmF0ZSBtdWx0aXBsZSAKLXJhbmdlcyB3aXRoaW4gYW4gaW5zdHJ1Y3Rpb24gKHJhbmdlJywncmFuZ2UpLgotCi1DaGFuZ2VzIGluIGdyYW1tYXI6Ci0JVGhlIG51bWJlciBvZiBwYXJtcyBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24gZW50cnkKLXdhcyBkZWxldGVkIGZyb20gdGhlIG9yaWdpbmFsIGZvcm1hdCBzdWNoIHRoYXQgd2Ugbm93IGNvdW50IHRoZSBmaWVsZHMuCi0KLS0tLS0KLUZJWE1FISBzaG91bGQgcmVhbGx5IGNoYW5nZSBsZXhpY2FsIGFuYWx5emVyIAotdG8gcmVjb2duaXplICdkcmVnJyBldGMuIGluIGNvbnRleHQgc2Vuc2F0aXZlIHdheS4KLUN1cnJlbnRseSBmdW5jdGlvbiBuYW1lcyBvciBtbmVtb25pY3MgbWF5IGJlIGluY29ycmVjdGx5IHBhcnNlZCBhcyBrZXl3b3JkcwotCi1GSVhNRSEgaGV4IGlzIGFtYmlndW91cyB3aXRoIGFueSBkaWdpdAotCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJpdGJsLW9wcy5oIgotCi0vKiAjZGVmaW5lIERFQlVHICovCi0KLSNpZmRlZiBERUJVRwotI2lmbmRlZiBEQkdfTFZMCi0jZGVmaW5lIERCR19MVkwgMQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBEQkdfTFZMIDAKLSNlbmRpZgotCi0jaWYgREJHX0xWTCA+PSAxCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpIAotI2VuZGlmCi0KLSNpZiBEQkdfTFZMID49IDIKLSNkZWZpbmUgREJHTDIoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIERCR0wyKHgpIAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc2JpdCwgZWJpdDsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqaW5zbj0wOwotZXh0ZXJuIGludCBpbnNudGJsX2xpbmU7Ci1pbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1pbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0lfQotCi0ldW5pb24gCi0gIHsKLSAgICBjaGFyICpzdHI7Ci0gICAgaW50IG51bTsKLSAgICBpbnQgcHJvY2Vzc29yOwotICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotICB9Ci0KLSV0b2tlbgkgICAgRFJFRyBDUkVHIEdSRUcgSU1NRUQgQUREUiBJTlNOIE5VTSBJRCBOTCBQTlVNCi0ldHlwZQkgICAgPHZhbD4gdmFsdWUgZmxhZ3MgZmxhZ2V4cHIKLSV0eXBlCSAgICA8bnVtPiBudW1iZXIgTlVNIGZ0eXBlIHJlZ3R5cGUgcG51bSBQTlVNCi0ldHlwZQkgICAgPHN0cj4gSUQgbmFtZQotCi0lc3RhcnQgaW5zbnRibAotCi0lJQotCi1pbnNudGJsOgotCWVudHJ5cwotCTsKLQotZW50cnlzOgotCWVudHJ5IGVudHJ5cwotCXwKLQk7Ci0KLWVudHJ5OgotCXBudW0gcmVndHlwZSBuYW1lIHZhbHVlIE5MCi0JICB7Ci0JICAgIERCRyAoKCJsaW5lICVkOiBlbnRyeSBwbnVtPSVkIHR5cGU9JWQgbmFtZT0lcyB2YWx1ZT14JXhcbiIsIAotCSAgICAJICAgIGluc250YmxfbGluZSwgJDEsICQyLCAkMywgJDQpKTsKLQkgICAgaXRibF9hZGRfcmVnICgkMSwgJDIsICQzLCAkNCk7Ci0JICB9Ci0JfCBwbnVtIElOU04gbmFtZSB2YWx1ZSByYW5nZSBmbGFncwotCSAgewotCSAgICBEQkcgKCgibGluZSAlZDogZW50cnkgcG51bT0lZCB0eXBlPUlOU04gbmFtZT0lcyB2YWx1ZT14JXgiLAotCSAgICAJICAgIGluc250YmxfbGluZSwgJDEsICQzLCAkNCkpOwotCSAgICBEQkcgKCgiIHNiaXQ9JWQgZWJpdD0lZCBmbGFncz0weCV4XG4iLCBzYml0LCBlYml0LCAkNikpOwotCSAgICBpbnNuPWl0YmxfYWRkX2luc24gKCQxLCAkMywgJDQsIHNiaXQsIGViaXQsICQ2KTsKLQkgIH0KLQlmaWVsZHNwZWNzIE5MCi0JfCBOTAotCXwgZXJyb3IgTkwKLQk7Ci0KLWZpZWxkc3BlY3M6Ci0JJywnIGZpZWxkc3BlYyBmaWVsZHNwZWNzCi0JfCBmaWVsZHNwZWMgZmllbGRzcGVjcwotCXwKLQk7Ci0KLWZ0eXBlOgotCXJlZ3R5cGUgCi0JICB7Ci0JICAgIERCR0wyICgoImZ0eXBlXG4iKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBBRERSIAotCSAgewotCSAgICBEQkdMMiAoKCJhZGRyXG4iKSk7Ci0JICAgICQkID0gQUREUjsKLQkgIH0KLQl8IElNTUVECi0JICB7Ci0JICAgIERCR0wyICgoImltbWVkXG4iKSk7Ci0JICAgICQkID0gSU1NRUQ7Ci0JICB9Ci0JOwotCi1maWVsZHNwZWM6Ci0JZnR5cGUgcmFuZ2UgZmxhZ3MKLQkgIHsKLQkgICAgREJHICgoImxpbmUgJWQ6IGZpZWxkIHR5cGU9JWQgc2JpdD0lZCBlYml0PSVkLCBmbGFncz0weCV4XG4iLCAKLQkgICAgCSAgICBpbnNudGJsX2xpbmUsICQxLCBzYml0LCBlYml0LCAkMykpOwotCSAgICBpdGJsX2FkZF9vcGVyYW5kIChpbnNuLCAkMSwgc2JpdCwgZWJpdCwgJDMpOwotCSAgfQotCTsKLQotZmxhZ2V4cHI6Ci0JTlVNICd8JyBmbGFnZXhwcgotCSAgewotCSAgICAkJCA9ICQxIHwgJDM7Ci0JICB9Ci0JfCAnWycgZmxhZ2V4cHIgJ10nCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JfCBOVU0KLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLWZsYWdzOgotCScqJyBmbGFnZXhwcgotCSAgewotCSAgICBEQkdMMiAoKCJmbGFncz0lZFxuIiwgJDIpKTsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQl8IAotCSAgewotCSAgICAkJCA9IDA7Ci0JICB9Ci0JOwotCi1yYW5nZToKLQknOicgTlVNICctJyBOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgicmFuZ2UgJWQgJWRcbiIsICQyLCAkNCkpOwotCSAgICBzYml0ID0gJDI7Ci0JICAgIGViaXQgPSAkNDsKLQkgIH0KLQl8Ci0JICB7Ci0JICAgIHNiaXQgPSAzMTsKLQkgICAgZWJpdCA9IDA7Ci0JICB9Ci0JOwotCSAgICAKLXBudW06Ci0JUE5VTQotCSAgewotCSAgICBEQkdMMiAoKCJwbnVtPSVkXG4iLCQxKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi1yZWd0eXBlOgotCSAgICAgRFJFRwotCSAgewotCSAgICBEQkdMMiAoKCJkcmVnXG4iKSk7Ci0JICAgICQkID0gRFJFRzsKLQkgIH0KLQl8IENSRUcKLQkgIHsKLQkgICAgREJHTDIgKCgiY3JlZ1xuIikpOwotCSAgICAkJCA9IENSRUc7Ci0JICB9Ci0JfCBHUkVHCi0JICB7Ci0JICAgIERCR0wyICgoImdyZWdcbiIpKTsKLQkgICAgJCQgPSBHUkVHOwotCSAgfQotCTsKLQotbmFtZToKLQlJRAotCSAgewotCSAgICBEQkdMMiAoKCJuYW1lPSVzXG4iLCQxKSk7Ci0JICAgICQkID0gJDE7IAotCSAgfQotCTsKLQotbnVtYmVyOgotCU5VTQotCSAgewotCSAgICBEQkdMMiAoKCJudW09JWRcbiIsJDEpKTsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLXZhbHVlOgotCU5VTQotCSAgewotCSAgICBEQkdMMiAoKCJ2YWw9eCV4XG4iLCQxKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotJSUKLQotc3RhdGljIGludAoteXllcnJvciAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIHByaW50ZiAoImxpbmUgJWQ6ICVzXG4iLCBpbnNudGJsX2xpbmUsIG1zZyk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2xpbmsuY21kIGIvZ2FzL2xpbmsuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM1Y2E4Li4wMDAwMDAwCi0tLSBhL2dhcy9saW5rLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUFMSUdOPTEwMjQKLVJFU05VTSAweDAwMDAsIDB4ODAwMAotOyBQdXR0aW5nIGluIC5saXQxIGdpdmVzIGVycm9ycy4KLU9SREVSIC5kYXRhPTB4ODAwMDIwMDAsIC5kYXRhMSwgLmxpdCwgLmJzcwotOyBMZXQncyBwdXQgdGhpcyBvbiB0aGUgY29tbWFuZCBsaW5lIHNvIGl0IGdvZXMgZmlyc3QsIHdoaWNoIGlzIHdoYXQKLTsgR0RCIGV4cGVjdHMuCi07IExPQUQgL3MyL2FtZC8yOWsvbGliL2NydDAubwotTE9BRCAvczIvYW1kLzI5ay9saWIvbGlicWNiMGgubGliCi1MT0FEIC9zMi9hbWQvMjlrL2xpYi9saWJzY2IwaC5saWIKLUxPQUQgL3MyL2FtZC8yOWsvbGliL2xpYmFjYjBoLmxpYgpkaWZmIC0tZ2l0IGEvZ2FzL2xpc3RpbmcuYyBiL2dhcy9saXN0aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjBkZGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2xpc3RpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjAgKzAsMCBAQAotLyogbGlzdGluZy5jIC0gbWFpbnRpbmcgYXNzZW1ibHkgbGlzdGluZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0gQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAJCXNhY0BjeWdudXMuY29tCi0KLQotIEEgbGlzdGluZyBwYWdlIGxvb2tzIGxpa2U6Ci0KLSBMSVNUSU5HX0hFQURFUiAgc291cmNlZmlsZW5hbWUgcGFnZW51bWJlcgotIFRJVExFIExJTkUKLSBTVUJUSVRMRSBMSU5FCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKLSBsaW5lbnVtYmVyIGFkZHJlc3MgZGF0YSAgc291cmNlCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotCi0gSWYgbm90IG92ZXJyaWRkZW4sIHRoZSBsaXN0aW5nIGNvbW1hbmRzIGFyZToKLQotIC50aXRsZSAgInN0dWZmIgotIAlQdXQgInN0dWZmIiBvbnRvIHRoZSB0aXRsZSBsaW5lCi0gLnNidHRsICAic3R1ZmYiCi0gICAgICAgIFB1dCBzdHVmZiBvbnRvIHRoZSBzdWJ0aXRsZSBsaW5lCi0KLSAgSWYgdGhlc2UgY29tbWFuZHMgY29tZSB3aXRoaW4gMTAgbGluZXMgb2YgdGhlIHRvcCBvZiB0aGUgcGFnZSwgdGhleQotICB3aWxsIGFmZmVjdCB0aGUgcGFnZSB0aGV5IGFyZSBvbiwgYXMgd2VsbCBhcyBhbnkgc3Vic2VxdWVudCBwYWdlCi0KLSAuZWplY3QKLSAJVGhvdyBhIHBhZ2UKLSAubGlzdAotIAlJbmNyZW1lbnQgdGhlIGVuYWJsZSBsaXN0aW5nIGNvdW50ZXIKLSAubm9saXN0Ci0gCURlY3JlbWVudCB0aGUgZW5hYmxlIGxpc3RpbmcgY291bnRlcgotCi0gLnBzaXplIFlbLFhdCi0gCVNldCB0aGUgcGFwZXIgc2l6ZSB0byBYIHdpZGUgYW5kIFkgaGlnaC4gU2V0dGluZyBhIHBzaXplIFkgb2YKLQl6ZXJvIHdpbGwgc3VwcHJlc3MgZm9ybSBmZWVkcyBleGNlcHQgd2hlcmUgZGVtYW5kZWQgYnkgLmVqZWN0Ci0KLSBJZiB0aGUgY291bnRlciBnb2VzIGJlbG93IHplcm8sIGxpc3RpbmcgaXMgc3VwcHJlc3NlZC4KLQotCi0gTGlzdGluZ3MgYXJlIGEgbWFpbnRhaW5lZCBieSByZWFkIGNhbGxpbmcgdmFyaW91cyBsaXN0aW5nXzxmb28+Ci0gZnVuY3Rpb25zLiAgV2hhdCBoYXBwZW5zIG1vc3QgaXMgdGhhdCB0aGUgbWFjcm8gTk9fTElTVElORyBpcyBub3QKLSBkZWZpbmVkIChmcm9tIHRoZSBNYWtlZmlsZSksIHRoZW4gdGhlIG1hY3JvIExJU1RJTkdfTkVXTElORSBleHBhbmRzCi0gaW50byBhIGNhbGwgdG8gbGlzdGluZ19uZXdsaW5lLiAgVGhlIGNhbGwgaXMgZG9uZSBmcm9tIHJlYWQuYywgZXZlcnkKLSB0aW1lIGl0IHNlZXMgYSBuZXdsaW5lLCBhbmQgLWwgaXMgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotIFRoZSBmdW5jdGlvbiBsaXN0aW5nX25ld2xpbmUgcmVtZW1iZXJzIHRoZSBmcmFnIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSBuZXdsaW5lLCBhbmQgY3JlYXRlcyBhIG5ldyBmcmFnIC0gbm90ZSB0aGF0IHRoaXMgaXMgd2FzdGVmdWwsIGJ1dCBub3QKLSBhIGJpZyBkZWFsLCBzaW5jZSBsaXN0aW5nIHNsb3dzIHRoaW5ncyBkb3duIGEgbG90IGFueXdheS4gIFRoZQotIGZ1bmN0aW9uIGFsc28gcmVtZW1lYmVycyB3aGVuIHRoZSBmaWxlbmFtZSBjaGFuZ2VzLgotCi0gV2hlbiBhbGwgdGhlIGlucHV0IGhhcyBmaW5pc2hlZCwgYW5kIGdhcyBoYXMgaGFkIGEgY2hhbmNlIHRvIHNldHRsZQotIGRvd24sIHRoZSBsaXN0aW5nIGlzIG91dHB1dC4gVGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgZG93biB0aGUgbGlzdCBvZgotIGZyYWcvc291cmNlIGZpbGUgcmVjb3JkcywgYW5kIG9wZW5pbmcgdGhlIGZpbGVzIGFzIG5lZWRlZCBhbmQgcHJpbnRpbmcKLSBvdXQgdGhlIGJ5dGVzIGFuZCBjaGFycyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KLQotIFRoZSBvbmx5IHRoaW5ncyB3aGljaCB0aGUgYXJjaGl0ZWN0dXJlIGNhbiBjaGFuZ2UgYWJvdXQgdGhlIGxpc3RpbmcKLSBhcmUgZGVmaW5lZCBpbiB0aGVzZSBtYWNyb3M6Ci0KLSBMSVNUSU5HX0hFQURFUgkJVGhlIG5hbWUgb2YgdGhlIGFyY2hpdGVjdHVyZQotIExJU1RJTkdfV09SRF9TSVpFICAgICAgVGhlIG1ha2Ugb2YgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHdvcmQsIHRoaXMgZGV0ZXJtaW5lcwotIAkJCXRoZSBjbHVtcGluZyBvZiB0aGUgb3V0cHV0IGRhdGEuIGVnIGEgdmFsdWUgb2YKLQkJCTIgbWFrZXMgd29yZHMgbG9vayBsaWtlIDEyMzQgNTY3OCwgd2hpbHN0IDEKLQkJCXdvdWxkIG1ha2UgdGhlIHNhbWUgdmFsdWUgbG9vayBsaWtlIDEyIDM0IDU2Ci0JCQk3OAotIExJU1RJTkdfTEhTX1dJRFRIICAgICAgTnVtYmVyIG9mIHdvcmRzIG9mIGFib3ZlIHNpemUgZm9yIHRoZSBsaHMKLQotIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORCAgIE51bWJlciBvZiB3b3JkcyBmb3IgdGhlIGRhdGEgb24gdGhlIGxocwotIAkJCWZvciB0aGUgc2Vjb25kIGxpbmUKLQotIExJU1RJTkdfTEhTX0NPTlRfTElORVMJTWF4IG51bWJlciBvZiBsaW5lcyB0byB1c2UgdXAgZm9yIGEgY29udGludXRhdGlvbgotIExJU1RJTkdfUkhTX1dJRFRIICAgICAgTnVtYmVyIG9mIGNoYXJzIGZyb20gdGhlIGlucHV0IGZpbGUgdG8gcHJpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgbGluZQotKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgPG9ic3RhY2suaD4KLSNpbmNsdWRlICJpbnB1dC1maWxlLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLQotI2lmbmRlZiBMSVNUSU5HX0hFQURFUgotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiR0FTIExJU1RJTkciCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19XT1JEX1NJWkUKLSNkZWZpbmUgTElTVElOR19XT1JEX1NJWkUgNAotI2VuZGlmCi0jaWZuZGVmIExJU1RJTkdfTEhTX1dJRFRICi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIIDEKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQKLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEhfU0VDT05EIDEKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX1JIU19XSURUSAotI2RlZmluZSBMSVNUSU5HX1JIU19XSURUSCAxMDAKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19DT05UX0xJTkVTCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNAotI2VuZGlmCi0KLS8qIFRoaXMgc3RydWN0dXJlIHJlbWVtYmVycyB3aGljaCAucyB3ZXJlIHVzZWQgKi8KLXR5cGVkZWYgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QKLXsKLSAgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QgKiBuZXh0OwotICBjaGFyICogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOwotICBsb25nICAgICAgICAgICAgICAgICAgICAgIHBvczsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsaW5lbnVtOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGF0X2VuZDsKLX0KLWZpbGVfaW5mb190eXBlOwotCi0vKiBUaGlzIHN0cnVjdHVyZSByZW1lbWVicnMgd2hpY2ggbGluZSBmcm9tIHdoaWNoIGZpbGUgZ29lcyBpbnRvIHdoaWNoCi0gICBmcmFnICovCi1zdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdAotewotICAvKiBGcmFnIHdoaWNoIHRoaXMgbGluZSBvZiBzb3VyY2UgaXMgbmVhcmVzdCB0byAqLwotICBmcmFnUyAqIGZyYWc7Ci0KLSAgLyogVGhlIGFjdHVhbCBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgLyogUG9pbnRlciB0byB0aGUgZmlsZSBpbmZvIHN0cnVjdCBmb3IgdGhlIGZpbGUgd2hpY2ggdGhpcyBsaW5lCi0gICAgIGJlbG9uZ3MgdG8gKi8KLSAgZmlsZV9pbmZvX3R5cGUgKiBmaWxlOwotCi0gIC8qIFRoZSBleHBhbmRlZCB0ZXh0IG9mIGFueSBtYWNybyB0aGF0IG1heSBoYXZlIGJlZW4gZXhlY3V0aW5nLiAgKi8KLSAgY2hhciAqIGxpbmVfY29udGVudHM7Ci0KLSAgLyogTmV4dCBpbiBsaXN0ICovCi0gIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogbmV4dDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmaWxlIGluZm8gc3RydWN0IGZvciB0aGUgaGlnaCBsZXZlbCBsYW5ndWFnZQotICAgICBzb3VyY2UgbGluZSB0aGF0IGJlbG9uZ3MgaGVyZSAqLwotICBmaWxlX2luZm9fdHlwZSAqIGhsbF9maWxlOwotICAvKiBIaWdoIGxldmVsIGxhbmd1YWdlIHNvdXJjZSBsaW5lICovCi0gIHVuc2lnbmVkIGludCBobGxfbGluZTsKLQotICAvKiBQb2ludGVyIHRvIGFueSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpbmUgKi8KLSAgY2hhciAqIG1lc3NhZ2U7Ci0KLSAgZW51bQotICAgIHsKLSAgICAgIEVESUNUX05PTkUsCi0gICAgICBFRElDVF9TQlRUTCwKLSAgICAgIEVESUNUX1RJVExFLAotICAgICAgRURJQ1RfTk9MSVNULAotICAgICAgRURJQ1RfTElTVCwKLSAgICAgIEVESUNUX05PTElTVF9ORVhULAotICAgICAgRURJQ1RfRUpFQ1QKLSAgICB9IGVkaWN0OwotICBjaGFyICogZWRpY3RfYXJnOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBsaW5lIGlzIHRvIGJlIG9taXR0ZWQgYmVjYXVzZSBpdCBjb250YWlucwotICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBiZWNvbWUgYSBmbGFncyBmaWVsZCBpZiB3ZSBjb21lCi0gICAgIHVwIHdpdGggbW9yZSBpbmZvcm1hdGlvbiB0byBzdG9yZSBoZXJlLiAgKi8KLSAgaW50IGRlYnVnZ2luZzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgbGlzdF9pbmZvX3R5cGU7Ci0KLQotaW50IGxpc3RpbmdfbGhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfTEhTX1dJRFRIOwotaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORDsKLWludCBsaXN0aW5nX2xoc19jb250X2xpbmVzICAgPSBMSVNUSU5HX0xIU19DT05UX0xJTkVTOwotaW50IGxpc3RpbmdfcmhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfUkhTX1dJRFRIOwotCi1zdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqICAgICAgICBsaXN0aW5nX3RhaWw7Ci0KLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqICAgICAgICAgIGZpbGVfaW5mb19oZWFkOwotc3RhdGljIGZpbGVfaW5mb190eXBlICogICAgICAgICAgbGFzdF9vcGVuX2ZpbGVfaW5mbzsKLXN0YXRpYyBGSUxFICogICAgICAgICAgICAgICAgICAgIGxhc3Rfb3Blbl9maWxlOwotc3RhdGljIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogaGVhZDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgIHBhcGVyX3dpZHRoID0gMjAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgcGFwZXJfaGVpZ2h0ID0gNjA7Ci0KLWV4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmc7Ci0KLS8qIEZpbGUgdG8gb3V0cHV0IGxpc3RpbmdzIHRvLiAgKi8KLXN0YXRpYyBGSUxFICogbGlzdF9maWxlOwotCi0vKiBUaGlzIHN0YXRpYyBhcnJheSBpcyB1c2VkIHRvIGtlZXAgdGhlIHRleHQgb2YgZGF0YSB0byBiZSBwcmludGVkCi0gICBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAgKi8KLQotI2RlZmluZSBNQVhfQllURVMJCQkJCQkJXAotICAoKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aAkJCVwKLSAgICsgKCgoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCkJXAotICAgICAgKiBsaXN0aW5nX2xoc19jb250X2xpbmVzKQkJCQkJCVwKLSAgICsgMjApCi0KLXN0YXRpYyBjaGFyICogZGF0YV9idWZmZXI7Ci0KLS8qIFByb3RvdHlwZXMuICAqLwotc3RhdGljIHZvaWQgbGlzdGluZ19tZXNzYWdlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpKTsKLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqIGZpbGVfaW5mbyBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlX25hbWUpKTsKLXN0YXRpYyB2b2lkIG5ld19mcmFnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICogYnVmZmVyX2xpbmUgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmZpbGUsCi0JCQkJICBjaGFyICpsaW5lLCB1bnNpZ25lZCBpbnQgc2l6ZSkpOwotc3RhdGljIHZvaWQgbGlzdGluZ19wYWdlIFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfaGV4IFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9saW5lcyBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBsaXN0X3N5bWJvbF90YWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zb3VyY2UgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfZmlsZSwKLQkJCQkgIGxpc3RfaW5mb190eXBlICpsaXN0LAotCQkJCSAgY2hhciAqYnVmZmVyLAotCQkJCSAgdW5zaWduZWQgaW50IHdpZHRoKSk7Ci1zdGF0aWMgaW50IGRlYnVnZ2luZ19wc2V1ZG8gUEFSQU1TICgobGlzdF9pbmZvX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBsaXN0aW5nX2xpc3RpbmcgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX21lc3NhZ2UgKG5hbWUsIG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIHVuc2lnbmVkIGludCBsID0gc3RybGVuIChuYW1lKSArIHN0cmxlbiAobWVzc2FnZSkgKyAxOwotICBjaGFyICpuID0gKGNoYXIgKikgeG1hbGxvYyAobCk7Ci0gIHN0cmNweSAobiwgbmFtZSk7Ci0gIHN0cmNhdCAobiwgbWVzc2FnZSk7Ci0gIGlmIChsaXN0aW5nX3RhaWwgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgbGlzdGluZ190YWlsLT5tZXNzYWdlID0gbjsKLSAgICB9Ci19Ci0KLXZvaWQKLWxpc3Rpbmdfd2FybmluZyAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgbGlzdGluZ19tZXNzYWdlIChfKCJXYXJuaW5nOiIpLCBtZXNzYWdlKTsKLX0KLQotdm9pZAotbGlzdGluZ19lcnJvciAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgbGlzdGluZ19tZXNzYWdlIChfKCJFcnJvcjoiKSwgbWVzc2FnZSk7Ci19Ci0KLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqCi1maWxlX2luZm8gKGZpbGVfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOwotewotICAvKiBGaW5kIGFuIGVudHJ5IHdpdGggdGhpcyBmaWxlIG5hbWUgKi8KLSAgZmlsZV9pbmZvX3R5cGUgKnAgPSBmaWxlX2luZm9faGVhZDsKLQotICB3aGlsZSAocCAhPSAoZmlsZV9pbmZvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKSA9PSAwKQotCXJldHVybiBwOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotCi0gIC8qIE1ha2UgbmV3IGVudHJ5ICovCi0KLSAgcCA9IChmaWxlX2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGZpbGVfaW5mb190eXBlKSk7Ci0gIHAtPm5leHQgPSBmaWxlX2luZm9faGVhZDsKLSAgZmlsZV9pbmZvX2hlYWQgPSBwOwotICBwLT5maWxlbmFtZSA9IHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSBzdHJsZW4gKGZpbGVfbmFtZSkgKyAxKTsKLSAgc3RyY3B5IChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKTsKLSAgcC0+cG9zID0gMDsKLSAgcC0+bGluZW51bSA9IDA7Ci0gIHAtPmF0X2VuZCA9IDA7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW5ld19mcmFnICgpCi17Ci0KLSAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gIGZyYWdfbmV3ICgwKTsKLQotfQotCi12b2lkCi1saXN0aW5nX25ld2xpbmUgKHBzKQotICAgICBjaGFyICpwczsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9saW5lID0gMHhmZmZmOwotICBzdGF0aWMgY2hhciAqbGFzdF9maWxlID0gTlVMTDsKLSAgbGlzdF9pbmZvX3R5cGUgKm5ldyA9IE5VTEw7Ci0KLSAgaWYgKGxpc3RpbmcgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEluIEVMRiwgYW55dGhpbmcgaW4gYSBzZWN0aW9uIGJlZ2lubmluZyB3aXRoIC5kZWJ1ZyBvciAubGluZSBpcwotICAgICBjb25zaWRlcmVkIHRvIGJlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaW5jbHVkZXMgdGhlCi0gICAgIHN0YXRlbWVudCB3aGljaCBzd2l0Y2hlcyB1cyBpbnRvIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbiwgd2hpY2ggd2UKLSAgICAgY2FuIG9ubHkgc2V0IGFmdGVyIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCi0gIGlmICgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykgIT0gMAotICAgICAgJiYgbGlzdGluZ190YWlsICE9IE5VTEwKLSAgICAgICYmICEgbGlzdGluZ190YWlsLT5kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VnbmFtZTsKLQotICAgICAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAobm93X3NlZyk7Ci0gICAgICBpZiAoc3RybmNtcCAoc2VnbmFtZSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIiAtIDEpID09IDAKLQkgIHx8IHN0cm5jbXAgKHNlZ25hbWUsICIubGluZSIsIHNpemVvZiAiLmxpbmUiIC0gMSkgPT0gMCkKLQlsaXN0aW5nX3RhaWwtPmRlYnVnZ2luZyA9IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0gIGlmIChwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW5lID09IGxhc3RfbGluZSAmJiAhKGxhc3RfZmlsZSAmJiBmaWxlICYmIHN0cmNtcCAoZmlsZSwgbGFzdF9maWxlKSkpCi0JcmV0dXJuOwotCi0gICAgICBuZXcgPSAobGlzdF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChsaXN0X2luZm9fdHlwZSkpOwotCi0gICAgICAvKiBEZXRlY3QgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiBieSBleGFtaW5pbmcgdGhlIGZpbGUKLQkgbmFtZSByZXR1cm5lZCBieSBhc193aGVyZSgpLgotCi0JIFtGSVhNRTogV2UgcmVseSB1cG9uIHRoZSBuYW1lIGluIHRoZSBzdHJjbXAgYmVsb3cgYmVpbmcgdGhlCi0JIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGJ5IGlucHV0X3NjcnViX25ld19maWxlKCksIGlmIHRoYXQgaXMKLQkgbm90IHRydWUsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbF0uCi0KLQkgSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiwgdGhlbiB3ZSBuZWVkIHRvIHNhdmUgZWFjaCBpbnB1dCBsaW5lCi0JIGhlcmUgKGFzc3VtaW5nIG9mIGNvdXJzZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBsaW5lIG9mIGlucHV0IHRvIHJlYWQpLAotCSBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3RpbmcgdGhhdCBpcyBwcm9kdWNlZCBhdCB0aGUgZW5kCi0JIG9mIHRoZSBhc3NlbWJseS4gICovCi0gICAgICBpZiAoc3RyY21wIChmaWxlLCBfKCJ7c3RhbmRhcmQgaW5wdXR9IikpID09IDAKLQkgICYmIGlucHV0X2xpbmVfcG9pbnRlciAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKiBjb3B5OwotCSAgaW50IGxlbjsKLQkgIGludCBzZWVuX3F1b3RlID0gMDsKLQotCSAgZm9yIChjb3B5ID0gaW5wdXRfbGluZV9wb2ludGVyIC0gMTsKLQkgICAgICAgKiBjb3B5ICYmIChzZWVuX3F1b3RlCi0JCQkgIHx8ICghIGlzX2VuZF9vZl9saW5lIFsodW5zaWduZWQgY2hhcikgKiBjb3B5XSkpOwotCSAgICAgICBjb3B5ICsrKQotCSAgICBpZiAoKiBjb3B5ID09ICciJyAmJiBjb3B5Wy0xXSAhPSAnXFwnKQotCSAgICAgIHNlZW5fcXVvdGUgPSAhIHNlZW5fcXVvdGU7Ci0KLQkgIGxlbiA9IChjb3B5IC0gaW5wdXRfbGluZV9wb2ludGVyKSArIDI7Ci0KLQkgIGNvcHkgPSB4bWFsbG9jIChsZW4pOwotCi0JICBpZiAoY29weSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqIHNyYyA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7Ci0JICAgICAgY2hhciAqIGRlc3QgPSBjb3B5OwotCSAgICAgIAotCSAgICAgIHdoaWxlICgtLWxlbikKLQkJewotCQkgIHVuc2lnbmVkIGNoYXIgYyA9ICogc3JjICsrOwotCi0JCSAgLyogT21pdCBjb250cm9sIGNoYXJhY3RlcnMgaW4gdGhlIGxpc3RpbmcuICAqLwotCQkgIGlmIChpc2FzY2lpIChjKSAmJiAhIGlzY250cmwgKGMpKQotCQkgICAgKiBkZXN0ICsrID0gYzsKLQkJfQotCSAgICAgIAotCSAgICAgICpkZXN0ID0gMDsKLQkgICAgfQotCSAgCi0JICBuZXctPmxpbmVfY29udGVudHMgPSBjb3B5OwotCX0KLSAgICAgIGVsc2UKLQluZXctPmxpbmVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5ldyA9IChsaXN0X2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGxpc3RfaW5mb190eXBlKSk7Ci0gICAgICBuZXctPmxpbmVfY29udGVudHMgPSBwczsKLSAgICB9Ci0KLSAgbGFzdF9saW5lID0gbGluZTsKLSAgbGFzdF9maWxlID0gZmlsZTsKLSAgCi0gIG5ld19mcmFnICgpOwotCi0gIGlmIChsaXN0aW5nX3RhaWwpCi0gICAgbGlzdGluZ190YWlsLT5uZXh0ID0gbmV3OwotICBlbHNlCi0gICAgaGVhZCA9IG5ldzsKLSAgCi0gIGxpc3RpbmdfdGFpbCA9IG5ldzsKLQotICBuZXctPmZyYWcgPSBmcmFnX25vdzsKLSAgbmV3LT5saW5lID0gbGluZTsKLSAgbmV3LT5maWxlID0gZmlsZV9pbmZvIChmaWxlKTsKLSAgbmV3LT5uZXh0ID0gKGxpc3RfaW5mb190eXBlICopIE5VTEw7Ci0gIG5ldy0+bWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0gIG5ldy0+ZWRpY3QgPSBFRElDVF9OT05FOwotICBuZXctPmhsbF9maWxlID0gKGZpbGVfaW5mb190eXBlICopIE5VTEw7Ci0gIG5ldy0+aGxsX2xpbmUgPSAwOwotICBuZXctPmRlYnVnZ2luZyA9IDA7Ci0gIAotICBuZXdfZnJhZyAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogSW4gRUxGLCBhbnl0aGluZyBpbiBhIHNlY3Rpb24gYmVnaW5uaW5nIHdpdGggLmRlYnVnIG9yIC5saW5lIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gYmUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0KLSAgICAgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKG5vd19zZWcpOwotICAgICAgaWYgKHN0cm5jbXAgKHNlZ25hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChzZWduYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDApCi0JbmV3LT5kZWJ1Z2dpbmcgPSAxOwotICAgIH0KLSNlbmRpZgotfQotCi0vKiBBdHRhY2ggYWxsIGN1cnJlbnQgZnJhZ3MgdG8gdGhlIHByZXZpb3VzIGxpbmUgaW5zdGVhZCBvZiB0aGUKLSAgIGN1cnJlbnQgbGluZS4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBNSVBTIGJhY2tlbmQgd2hlbiBpdCBkaXNjb3ZlcnMKLSAgIHRoYXQgaXQgbmVlZHMgdG8gYWRkIHNvbWUgTk9QIGluc3RydWN0aW9uczsgdGhlIGFkZGVkIE5PUAotICAgaW5zdHJ1Y3Rpb25zIHNob3VsZCBnbyB3aXRoIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGhhcyB0aGUgZGVsYXksIG5vdAotICAgd2l0aCB0aGUgbmV3IGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotbGlzdGluZ19wcmV2X2xpbmUgKCkKLXsKLSAgbGlzdF9pbmZvX3R5cGUgKmw7Ci0gIGZyYWdTICpmOwotCi0gIGlmIChoZWFkID09IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMCi0gICAgICB8fCBoZWFkID09IGxpc3RpbmdfdGFpbCkKLSAgICByZXR1cm47Ci0KLSAgbmV3X2ZyYWcgKCk7Ci0KLSAgZm9yIChsID0gaGVhZDsgbC0+bmV4dCAhPSBsaXN0aW5nX3RhaWw7IGwgPSBsLT5uZXh0KQotICAgIDsKLQotICBmb3IgKGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmICE9IChmcmFnUyAqKSBOVUxMOyBmID0gZi0+ZnJfbmV4dCkKLSAgICBpZiAoZi0+bGluZSA9PSBsaXN0aW5nX3RhaWwpCi0gICAgICBmLT5saW5lID0gbDsKLQotICBsaXN0aW5nX3RhaWwtPmZyYWcgPSBmcmFnX25vdzsKLSAgbmV3X2ZyYWcgKCk7Ci19Ci0KLS8qCi0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXh0IHNvdXJjZSBsaW5lIGZyb20gdGhlIGZpbGUgc3VwcGxpZWQsCi0gdHJ1bmNhdGVkIHRvIHNpemUuICBJdCBhcHBlbmRzIGEgZmFrZSBsaW5lIHRvIHRoZSBlbmQgb2YgZWFjaCBpbnB1dAotIGZpbGUgdG8gbWFrZQotKi8KLQotc3RhdGljIGNoYXIgKgotYnVmZmVyX2xpbmUgKGZpbGUsIGxpbmUsIHNpemUpCi0gICAgIGZpbGVfaW5mb190eXBlICogZmlsZTsKLSAgICAgY2hhciAqbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0gIGludCBjOwotCi0gIGNoYXIgKnAgPSBsaW5lOwotCi0gIC8qIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIGZpbGUsIHJldHVybiBhbiBlbXB0eSBsaW5lICovCi0gIGlmIChmaWxlLT5hdF9lbmQpCi0gICAgcmV0dXJuICIiOwotCi0gIC8qIENoZWNrIHRoZSBjYWNoZSBhbmQgc2VlIGlmIHdlIGxhc3QgdXNlZCB0aGlzIGZpbGUuICAqLwotICBpZiAoIWxhc3Rfb3Blbl9maWxlX2luZm8gfHwgZmlsZSAhPSBsYXN0X29wZW5fZmlsZV9pbmZvKQotICAgIHsKLSAgICAgIGlmIChsYXN0X29wZW5fZmlsZSkKLQl7Ci0JICBsYXN0X29wZW5fZmlsZV9pbmZvLT5wb3MgPSBmdGVsbCAobGFzdF9vcGVuX2ZpbGUpOwotCSAgZmNsb3NlIChsYXN0X29wZW5fZmlsZSk7Ci0JfQotCi0gICAgICBsYXN0X29wZW5fZmlsZV9pbmZvID0gZmlsZTsKLSAgICAgIGxhc3Rfb3Blbl9maWxlID0gZm9wZW4gKGZpbGUtPmZpbGVuYW1lLCAiciIpOwotICAgICAgaWYgKGxhc3Rfb3Blbl9maWxlID09IE5VTEwpCi0JewotCSAgZmlsZS0+YXRfZW5kID0gMTsKLQkgIHJldHVybiAiIjsKLQl9Ci0gICAgICAKLSAgICAgIC8qIFNlZWsgdG8gd2hlcmUgd2Ugd2VyZSBsYXN0IHRpbWUgdGhpcyBmaWxlIHdhcyBvcGVuLiAgKi8KLSAgICAgIGlmIChmaWxlLT5wb3MpCi0JZnNlZWsobGFzdF9vcGVuX2ZpbGUsIGZpbGUtPnBvcywgU0VFS19TRVQpOwotICAgIH0KLQotICBjID0gZmdldGMgKGxhc3Rfb3Blbl9maWxlKTsKLQotICBzaXplIC09IDE7CQkJLyogbGVhdmUgcm9vbSBmb3IgbnVsbCAqLwotCi0gIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCi0gICAgewotICAgICAgaWYgKGNvdW50IDwgc2l6ZSkKLQkqcCsrID0gYzsKLSAgICAgIGNvdW50Kys7Ci0KLSAgICAgIGMgPSBmZ2V0YyAobGFzdF9vcGVuX2ZpbGUpOwotCi0gICAgfQotICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgZmlsZS0+YXRfZW5kID0gMTsKLSAgICAgICpwKysgPSAnLic7Ci0gICAgICAqcCsrID0gJy4nOwotICAgICAgKnArKyA9ICcuJzsKLSAgICB9Ci0gIGZpbGUtPmxpbmVudW0rKzsKLSAgKnArKyA9IDA7Ci0gIHJldHVybiBsaW5lOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmbjsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlamVjdDsJLyogRWplY3QgcGVuZGluZyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBwYWdlOwkvKiBDdXJyZW50IHBhZ2UgbnVtYmVyICovCi1zdGF0aWMgY2hhciAqdGl0bGU7CQkvKiBjdXJyZW50IHRpdGxlICovCi1zdGF0aWMgY2hhciAqc3VidGl0bGU7CQkvKiBjdXJyZW50IHN1YnRpdGxlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG9uX3BhZ2U7CS8qIG51bWJlciBvZiBsaW5lcyBwcmludGVkIG9uIGN1cnJlbnQgcGFnZSAqLwotCi0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX3BhZ2UgKGxpc3QpCi0gICAgIGxpc3RfaW5mb190eXBlICpsaXN0OwotewotICAvKiBHcm9wZSBhcm91bmQsIHNlZSBpZiB3ZSBjYW4gc2VlIGEgdGl0bGUgb3Igc3VidGl0bGUgZWRpY3QgY29taW5nIHVwCi0gICAgIHNvb24gICh3ZSBsb29rIGRvd24gMTAgbGluZXMgb2YgdGhlIHBhZ2UgYW5kIHNlZSBpZiBpdCdzIHRoZXJlKSovCi0gIGlmICgoZWplY3QgfHwgKG9uX3BhZ2UgPj0gKHVuc2lnbmVkIGludCkgcGFwZXJfaGVpZ2h0KSkgJiYgcGFwZXJfaGVpZ2h0ICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGMgPSAxMDsKLSAgICAgIGludCBoYWRfdGl0bGUgPSAwOwotICAgICAgaW50IGhhZF9zdWJ0aXRsZSA9IDA7Ci0KLSAgICAgIHBhZ2UrKzsKLQotICAgICAgd2hpbGUgKGMgIT0gMCAmJiBsaXN0KQotCXsKLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9TQlRUTCAmJiAhaGFkX3N1YnRpdGxlKQotCSAgICB7Ci0JICAgICAgaGFkX3N1YnRpdGxlID0gMTsKLQkgICAgICBzdWJ0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKLQkgICAgfQotCSAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX1RJVExFICYmICFoYWRfdGl0bGUpCi0JICAgIHsKLQkgICAgICBoYWRfdGl0bGUgPSAxOwotCSAgICAgIHRpdGxlID0gbGlzdC0+ZWRpY3RfYXJnOwotCSAgICB9Ci0JICBsaXN0ID0gbGlzdC0+bmV4dDsKLQkgIGMtLTsKLQl9Ci0KLQotICAgICAgaWYgKHBhZ2UgPiAxKQotCXsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxmIik7Ci0JfQotCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlcyAlcyBcdFx0XHRwYWdlICVkXG4iLCBMSVNUSU5HX0hFQURFUiwgZm4sIHBhZ2UpOwotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIHRpdGxlKTsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCBzdWJ0aXRsZSk7Ci0gICAgICBvbl9wYWdlID0gMzsKLSAgICAgIGVqZWN0ID0gMDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY2FsY19oZXggKGxpc3QpCi0gICAgIGxpc3RfaW5mb190eXBlICogbGlzdDsKLXsKLSAgaW50IGRhdGFfYnVmZmVyX3NpemU7Ci0gIGxpc3RfaW5mb190eXBlICpmaXJzdCA9IGxpc3Q7Ci0gIHVuc2lnbmVkIGludCBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOwotICBmcmFnUyAqZnJhZzsKLSAgZnJhZ1MgKmZyYWdfcHRyOwotICB1bnNpZ25lZCBpbnQgYnl0ZV9pbl9mcmFnOwotCi0gIC8qIEZpbmQgZmlyc3QgZnJhZyB3aGljaCBzYXlzIGl0IGJlbG9uZ3MgdG8gdGhpcyBsaW5lICovCi0gIGZyYWcgPSBsaXN0LT5mcmFnOwotICB3aGlsZSAoZnJhZyAmJiBmcmFnLT5saW5lICE9IGxpc3QpCi0gICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0KLSAgZnJhZ19wdHIgPSBmcmFnOwotCi0gIGRhdGFfYnVmZmVyX3NpemUgPSAwOwotCi0gIC8qIER1bXAgYWxsIHRoZSBmcmFncyB3aGljaCBiZWxvbmcgdG8gdGhpcyBsaW5lICovCi0gIHdoaWxlIChmcmFnX3B0ciAhPSAoZnJhZ1MgKikgTlVMTCAmJiBmcmFnX3B0ci0+bGluZSA9PSBmaXJzdCkKLSAgICB7Ci0gICAgICAvKiBQcmludCBhcyBtYW55IGJ5dGVzIGZyb20gdGhlIGZpeGVkIHBhcnQgYXMgaXMgc2Vuc2libGUgKi8KLSAgICAgIGJ5dGVfaW5fZnJhZyA9IDA7Ci0gICAgICB3aGlsZSAoKG9mZnNldFQpIGJ5dGVfaW5fZnJhZyA8IGZyYWdfcHRyLT5mcl9maXgKLQkgICAgICYmIGRhdGFfYnVmZmVyX3NpemUgPCBNQVhfQllURVMgLSAzKQotCXsKLQkgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLQkgICAgewotCSAgICAgIGFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzczsKLQkgICAgfQotCi0JICBzcHJpbnRmIChkYXRhX2J1ZmZlciArIGRhdGFfYnVmZmVyX3NpemUsCi0JCSAgICIlMDJYIiwKLQkJICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW2J5dGVfaW5fZnJhZ10pICYgMHhmZik7Ci0JICBkYXRhX2J1ZmZlcl9zaXplICs9IDI7Ci0JICBieXRlX2luX2ZyYWcrKzsKLQl9Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHZhcl9yZXBfbWF4ID0gYnl0ZV9pbl9mcmFnOwotCXVuc2lnbmVkIGludCB2YXJfcmVwX2lkeCA9IGJ5dGVfaW5fZnJhZzsKLQotCS8qIFByaW50IGFzIG1hbnkgYnl0ZXMgZnJvbSB0aGUgdmFyaWFibGUgcGFydCBhcyBpcyBzZW5zaWJsZSAqLwotCXdoaWxlICgoKG9mZnNldFQpIGJ5dGVfaW5fZnJhZwotCQk8IGZyYWdfcHRyLT5mcl9maXggKyBmcmFnX3B0ci0+ZnJfdmFyICogZnJhZ19wdHItPmZyX29mZnNldCkKLQkgICAgICAgJiYgZGF0YV9idWZmZXJfc2l6ZSA8IE1BWF9CWVRFUyAtIDMpCi0JICB7Ci0JICAgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLQkgICAgICB7Ci0JCWFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzczsKLQkgICAgICB9Ci0JICAgIHNwcmludGYgKGRhdGFfYnVmZmVyICsgZGF0YV9idWZmZXJfc2l6ZSwKLQkJICAgICAiJTAyWCIsCi0JCSAgICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW3Zhcl9yZXBfaWR4XSkgJiAweGZmKTsKLSNpZiAwCi0JICAgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemUrK10gPSAnKic7Ci0JICAgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemUrK10gPSAnKic7Ci0jZW5kaWYKLQkgICAgZGF0YV9idWZmZXJfc2l6ZSArPSAyOwotCi0JICAgIHZhcl9yZXBfaWR4Kys7Ci0JICAgIGJ5dGVfaW5fZnJhZysrOwotCi0JICAgIGlmICgob2Zmc2V0VCkgdmFyX3JlcF9pZHggPj0gZnJhZ19wdHItPmZyX2ZpeCArIGZyYWdfcHRyLT5mcl92YXIpCi0JICAgICAgdmFyX3JlcF9pZHggPSB2YXJfcmVwX21heDsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgZnJhZ19wdHIgPSBmcmFnX3B0ci0+ZnJfbmV4dDsKLSAgICB9Ci0gIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemVdID0gJ1wwJzsKLSAgcmV0dXJuIGFkZHJlc3M7Ci19Ci0KLQotCi0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbGluZXMgKGxpc3QsIGxpbmVubywgc3RyaW5nLCBhZGRyZXNzKQotICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICB1bnNpZ25lZCBpbnQgYWRkcmVzczsKLXsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgaW50IG5jaGFyczsKLSAgdW5zaWduZWQgaW50IGxpbmVzOwotICB1bnNpZ25lZCBpbnQgYnl0ZV9pbl93b3JkID0gMDsKLSAgY2hhciAqc3JjID0gZGF0YV9idWZmZXI7Ci0KLSAgLyogUHJpbnQgdGhlIHN0dWZmIG9uIHRoZSBmaXJzdCBsaW5lICovCi0gIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gIG5jaGFycyA9IChMSVNUSU5HX1dPUkRfU0laRSAqIDIgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoOwotICAKLSAgLyogUHJpbnQgdGhlIGhleCBmb3IgdGhlIGZpcnN0IGxpbmUgKi8KLSAgaWYgKGFkZHJlc3MgPT0gfiAodW5zaWduZWQgaW50KSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgICAgICIsIGxpbmVubyk7Ci0gICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5jaGFyczsgaWR4KyspCi0JZnByaW50ZiAobGlzdF9maWxlLCAiICIpOwotCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcdCVzXG4iLCBzdHJpbmcgPyBzdHJpbmcgOiAiIik7Ci0gICAgICAKLSAgICAgIG9uX3BhZ2UgKys7Ci0gICAgICAKLSAgICAgIGxpc3RpbmdfcGFnZSAoMCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGhhZF9lcnJvcnMgKCkpCi0gICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCA/Pz8/ICIsIGxpbmVubyk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlIDRkICUwNHggIiwgbGluZW5vLCBhZGRyZXNzKTsKLQotICAvKiBBbmQgdGhlIGRhdGEgdG8gZ28gYWxvbmcgd2l0aCBpdCAqLwotICBpZHggPSAwOwotICAKLSAgd2hpbGUgKCpzcmMgJiYgaWR4IDwgbmNoYXJzKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVjJWMiLCBzcmNbMF0sIHNyY1sxXSk7Ci0gICAgICBzcmMgKz0gMjsKLSAgICAgIGJ5dGVfaW5fd29yZCsrOwotICAgICAgCi0gICAgICBpZiAoYnl0ZV9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQotCXsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLQkgIGlkeCsrOwotCSAgYnl0ZV9pbl93b3JkID0gMDsKLQl9Ci0gICAgICAKLSAgICAgIGlkeCArPSAyOwotICAgIH0KLSAgCi0gIGZvciAoOyBpZHggPCBuY2hhcnM7IGlkeCsrKQotICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLSAgCi0gIGZwcmludGYgKGxpc3RfZmlsZSwgIlx0JXNcbiIsIHN0cmluZyA/IHN0cmluZyA6ICIiKTsKLSAgb25fcGFnZSsrOwotICBsaXN0aW5nX3BhZ2UgKGxpc3QpOwotICAKLSAgaWYgKGxpc3QtPm1lc3NhZ2UpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiKioqKiAgJXNcbiIsIGxpc3QtPm1lc3NhZ2UpOwotICAgICAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgICAgIG9uX3BhZ2UrKzsKLSAgICB9Ci0gIAotICBmb3IgKGxpbmVzID0gMDsKLSAgICAgICBsaW5lcyA8ICh1bnNpZ25lZCBpbnQpIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMKLQkgJiYgKnNyYzsKLSAgICAgICBsaW5lcyArKykKLSAgICB7Ci0gICAgICBuY2hhcnMgPSAoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKQotCSogbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIC0gMTsKLSAgICAgIGlkeCA9IDA7Ci0gICAgICAKLSAgICAgIC8qIFByaW50IGFueSBtb3JlIGxpbmVzIG9mIGRhdGEsIGJ1dCBtb3JlIGNvbXBhY3RseSAqLwotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCAgICAgICIsIGxpbmVubyk7Ci0gICAgICAKLSAgICAgIHdoaWxlICgqc3JjICYmIGlkeCA8IG5jaGFycykKLQl7Ci0JICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlYyVjIiwgc3JjWzBdLCBzcmNbMV0pOwotCSAgc3JjICs9IDI7Ci0JICBpZHggKz0gMjsKLQkgIGJ5dGVfaW5fd29yZCsrOwotCSAgCi0JICBpZiAoYnl0ZV9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiICIpOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJ5dGVfaW5fd29yZCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxuIik7Ci0gICAgICBvbl9wYWdlICsrOwotICAgICAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWxpc3Rfc3ltYm9sX3RhYmxlICgpCi17Ci0gIGV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci0gIGludCBnb3Rfc29tZSA9IDA7Ci0KLSAgc3ltYm9sUyAqcHRyOwotICBlamVjdCA9IDE7Ci0gIGxpc3RpbmdfcGFnZSAoMCk7Ci0KLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7IHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOyBwdHIgPSBzeW1ib2xfbmV4dCAocHRyKSkKLSAgICB7Ci0gICAgICBpZiAoU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAocHRyKSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKHB0cikgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQl7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgLyogRG9uJ3QgcmVwb3J0IHNlY3Rpb24gc3ltYm9scy4gIFRoZXkgYXJlIG5vdCBpbnRlcmVzdGluZy4gICovCi0JICBpZiAoc3ltYm9sX3NlY3Rpb25fcCAocHRyKSkKLQkgICAgY29udGludWU7Ci0jZW5kaWYKLQkgIGlmIChTX0dFVF9OQU1FIChwdHIpKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbMzBdLCBmbXRbOF07Ci0JICAgICAgdmFsdWVUIHZhbCA9IFNfR0VUX1ZBTFVFIChwdHIpOwotCi0JICAgICAgLyogQEAgTm90ZSB0aGF0IHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBjb21waWxhdGlvbiBvcHRpb25zLAotCQkgbm90IHNvbGVseSBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlcmlzdGljcy4gICovCi0JICAgICAgaWYgKHNpemVvZiAodmFsKSA9PSA0ICYmIHNpemVvZiAoaW50KSA9PSA0KQotCQlzcHJpbnRmIChidWYsICIlMDhseCIsICh1bnNpZ25lZCBsb25nKSB2YWwpOwotCSAgICAgIGVsc2UgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotCQl7Ci0JCSAgc3ByaW50ZiAoZm10LCAiJSUwJWx1bHgiLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIChzaXplb2YgKHZhbCkgKiAyKSk7Ci0JCSAgc3ByaW50ZiAoYnVmLCBmbXQsICh1bnNpZ25lZCBsb25nKSB2YWwpOwotCQl9Ci0jaWYgZGVmaW5lZCAoQkZENjQpCi0JICAgICAgZWxzZSBpZiAoc2l6ZW9mICh2YWwpID4gNCkKLQkJc3ByaW50Zl92bWEgKGJ1ZiwgdmFsKTsKLSNlbmRpZgotCSAgICAgIGVsc2UKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICBpZiAoIWdvdF9zb21lKQotCQl7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiREVGSU5FRCBTWU1CT0xTXG4iKTsKLQkJICBvbl9wYWdlKys7Ci0JCSAgZ290X3NvbWUgPSAxOwotCQl9Ci0KLQkgICAgICBpZiAoc3ltYm9sX2dldF9mcmFnIChwdHIpICYmIHN5bWJvbF9nZXRfZnJhZyAocHRyKS0+bGluZSkKLQkJewotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUyMHM6JS01ZCAgJXM6JXMgJXNcbiIsCi0JCQkgICBzeW1ib2xfZ2V0X2ZyYWcgKHB0ciktPmxpbmUtPmZpbGUtPmZpbGVuYW1lLAotCQkJICAgc3ltYm9sX2dldF9mcmFnIChwdHIpLT5saW5lLT5saW5lLAotCQkJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChwdHIpKSwKLQkJCSAgIGJ1ZiwgU19HRVRfTkFNRSAocHRyKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlMzNzOiVzICVzXG4iLAotCQkJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChwdHIpKSwKLQkJCSAgIGJ1ZiwgU19HRVRfTkFNRSAocHRyKSk7Ci0JCX0KLQotCSAgICAgIG9uX3BhZ2UgKys7Ci0JICAgICAgbGlzdGluZ19wYWdlICgwKTsKLQkgICAgfQotCX0KLQotICAgIH0KLSAgaWYgKCFnb3Rfc29tZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJOTyBERUZJTkVEIFNZTUJPTFNcbiIpOwotICAgICAgb25fcGFnZSsrOwotICAgIH0KLSAgZnByaW50ZiAobGlzdF9maWxlLCAiXG4iKTsKLSAgb25fcGFnZSsrOwotICBsaXN0aW5nX3BhZ2UgKDApOwotCi0gIGdvdF9zb21lID0gMDsKLQotICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsgcHRyICE9IChzeW1ib2xTICopIE5VTEw7IHB0ciA9IHN5bWJvbF9uZXh0IChwdHIpKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9OQU1FIChwdHIpICYmIHN0cmxlbiAoU19HRVRfTkFNRSAocHRyKSkgIT0gMCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAocHRyKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGlmICghZ290X3NvbWUpCi0JCXsKLQkJICBnb3Rfc29tZSA9IDE7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiVU5ERUZJTkVEIFNZTUJPTFNcbiIpOwotCQkgIG9uX3BhZ2UrKzsKLQkJICBsaXN0aW5nX3BhZ2UgKDApOwotCQl9Ci0JICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIFNfR0VUX05BTUUgKHB0cikpOwotCSAgICAgIG9uX3BhZ2UrKzsKLQkgICAgICBsaXN0aW5nX3BhZ2UgKDApOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKCFnb3Rfc29tZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJOTyBVTkRFRklORUQgU1lNQk9MU1xuIik7Ci0gICAgICBvbl9wYWdlKys7Ci0gICAgICBsaXN0aW5nX3BhZ2UgKDApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3NvdXJjZSAoY3VycmVudF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKQotICAgICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9maWxlOwotICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci17Ci0gIGlmICghY3VycmVudF9maWxlLT5hdF9lbmQpCi0gICAgewotICAgICAgd2hpbGUgKGN1cnJlbnRfZmlsZS0+bGluZW51bSA8IGxpc3QtPmhsbF9saW5lCi0JICAgICAmJiAhY3VycmVudF9maWxlLT5hdF9lbmQpCi0JewotCSAgY2hhciAqcCA9IGJ1ZmZlcl9saW5lIChjdXJyZW50X2ZpbGUsIGJ1ZmZlciwgd2lkdGgpOwotCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJTR1OiUtMTNzICoqKiogJXNcbiIsIGN1cnJlbnRfZmlsZS0+bGluZW51bSwKLQkJICAgY3VycmVudF9maWxlLT5maWxlbmFtZSwgcCk7Ci0JICBvbl9wYWdlKys7Ci0JICBsaXN0aW5nX3BhZ2UgKGxpc3QpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNvbWV0aW1lcyB0aGUgdXNlciBkb2Vzbid0IHdhbnQgdG8gYmUgYm90aGVyZWQgYnkgdGhlIGRlYnVnZ2luZwotICAgcmVjb3JkcyBpbnNlcnRlZCBieSB0aGUgY29tcGlsZXIsIHNlZSBpZiB0aGUgbGluZSBpcyBzdXNwaWNpb3VzLiAgKi8KLQotc3RhdGljIGludAotZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGluZSkKLSAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKmxpbmU7Ci17Ci0gIHN0YXRpYyBpbnQgaW5fZGVidWc7Ci0gIGludCB3YXNfZGVidWc7Ci0KLSAgaWYgKGxpc3QtPmRlYnVnZ2luZykKLSAgICB7Ci0gICAgICBpbl9kZWJ1ZyA9IDE7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgd2FzX2RlYnVnID0gaW5fZGVidWc7Ci0gIGluX2RlYnVnID0gMDsKLQotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpsaW5lKSkKLSAgICBsaW5lKys7Ci0KLSAgaWYgKCpsaW5lICE9ICcuJykKLSAgICB7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogVGhlIEVMRiBjb21waWxlciBzb21ldGltZXMgZW1pdHMgYmxhbmsgbGluZXMgYWZ0ZXIgc3dpdGNoaW5nCi0gICAgICAgICBvdXQgb2YgYSBkZWJ1Z2dpbmcgc2VjdGlvbi4gIElmIHRoZSBuZXh0IGxpbmUgZHJvcHMgdXMgYmFjawotICAgICAgICAgaW50byBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZW4gZG9uJ3QgcHJpbnQgdGhlIGJsYW5rIGxpbmUuCi0gICAgICAgICBUaGlzIGlzIGEgaGFjayBmb3IgYSBwYXJ0aWN1bGFyIGNvbXBpbGVyIGJlaGF2aW91ciwgbm90IGEKLSAgICAgICAgIGdlbmVyYWwgY2FzZS4gICovCi0gICAgICBpZiAod2FzX2RlYnVnCi0JICAmJiAqbGluZSA9PSAnXDAnCi0JICAmJiBsaXN0LT5uZXh0ICE9IE5VTEwKLQkgICYmIGxpc3QtPm5leHQtPmRlYnVnZ2luZykKLQl7Ci0JICBpbl9kZWJ1ZyA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGxpbmUrKzsKLQotICBpZiAoc3RybmNtcCAobGluZSwgImRlZiIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidmFsIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJzY2wiLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImxpbmUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImVuZGVmIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJsbiIsIDIpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidHlwZSIsIDQpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAic2l6ZSIsIDQpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAiZGltIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJ0YWciLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzdHJuY21wIChsaW5lLCAic3RhYnMiLCA1KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInN0YWJuIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWxpc3RpbmdfbGlzdGluZyAobmFtZSkKLSAgICAgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBsaXN0X2luZm9fdHlwZSAqbGlzdCA9IGhlYWQ7Ci0gIGZpbGVfaW5mb190eXBlICpjdXJyZW50X2hsbF9maWxlID0gKGZpbGVfaW5mb190eXBlICopIE5VTEw7Ci0gIGNoYXIgKm1lc3NhZ2U7Ci0gIGNoYXIgKmJ1ZmZlcjsKLSAgY2hhciAqcDsKLSAgaW50IHNob3dfbGlzdGluZyA9IDE7Ci0gIHVuc2lnbmVkIGludCB3aWR0aDsKLQotICBidWZmZXIgPSB4bWFsbG9jIChsaXN0aW5nX3Joc193aWR0aCk7Ci0gIGRhdGFfYnVmZmVyID0geG1hbGxvYyAoTUFYX0JZVEVTKTsKLSAgZWplY3QgPSAxOwotICBsaXN0ID0gaGVhZDsKLQotICB3aGlsZSAobGlzdCAhPSAobGlzdF9pbmZvX3R5cGUgKikgTlVMTCAmJiAwKQotICAgIHsKLSAgICAgIGlmIChsaXN0LT5uZXh0KQotCWxpc3QtPmZyYWcgPSBsaXN0LT5uZXh0LT5mcmFnOwotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0KLSAgICB9Ci0KLSAgbGlzdCA9IGhlYWQtPm5leHQ7Ci0KLQotICB3aGlsZSAobGlzdCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGlzdF9saW5lOwotCi0gICAgICB3aWR0aCA9IGxpc3RpbmdfcmhzX3dpZHRoID4gcGFwZXJfd2lkdGggPyBwYXBlcl93aWR0aCA6Ci0JbGlzdGluZ19yaHNfd2lkdGg7Ci0KLSAgICAgIGxpc3RfbGluZSA9IGxpc3QtPmxpbmU7Ci0gICAgICBzd2l0Y2ggKGxpc3QtPmVkaWN0KQotCXsKLQljYXNlIEVESUNUX0xJU1Q6Ci0JICAvKiBTa2lwIGFsbCBsaW5lcyB1cCB0byB0aGUgY3VycmVudC4gICovCi0JICBsaXN0X2xpbmUtLTsKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfTk9MSVNUOgotCSAgc2hvd19saXN0aW5nLS07Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTElTVF9ORVhUOgotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9FSkVDVDoKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfTk9ORToKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfVElUTEU6Ci0JICB0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfU0JUVEw6Ci0JICBzdWJ0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGlmIChzaG93X2xpc3RpbmcgPD0gMCkKLQl7Ci0JICB3aGlsZSAobGlzdC0+ZmlsZS0+bGluZW51bSA8IGxpc3RfbGluZQotCQkgJiYgIWxpc3QtPmZpbGUtPmF0X2VuZCkKLQkgICAgcCA9IGJ1ZmZlcl9saW5lIChsaXN0LT5maWxlLCBidWZmZXIsIHdpZHRoKTsKLQl9Ci0KLSAgICAgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9MSVNUKQotCXsKLQkgIC8qIEVuYWJsZSBsaXN0aW5nIGZvciB0aGUgc2luZ2xlIGxpbmUgdGhhdCBjYXVzZWQgdGhlIGVuYWJsZS4gICovCi0JICBsaXN0X2xpbmUrKzsKLQkgIHNob3dfbGlzdGluZysrOwotCX0KLQotICAgICAgaWYgKHNob3dfbGlzdGluZyA+IDApCi0JewotCSAgLyogU2NhbiBkb3duIHRoZSBsaXN0IGFuZCBwcmludCBhbGwgdGhlIHN0dWZmIHdoaWNoIGNhbiBiZSBkb25lCi0JICAgICB3aXRoIHRoaXMgbGluZSAob3IgbGluZXMpLiAgKi8KLQkgIG1lc3NhZ2UgPSAwOwotCi0JICBpZiAobGlzdC0+aGxsX2ZpbGUpCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2hsbF9maWxlID0gbGlzdC0+aGxsX2ZpbGU7Ci0JICAgIH0KLQotCSAgaWYgKGN1cnJlbnRfaGxsX2ZpbGUgJiYgbGlzdC0+aGxsX2xpbmUgJiYgKGxpc3RpbmcgJiBMSVNUSU5HX0hMTCkpCi0JICAgIHsKLQkgICAgICBwcmludF9zb3VyY2UgKGN1cnJlbnRfaGxsX2ZpbGUsIGxpc3QsIGJ1ZmZlciwgd2lkdGgpOwotCSAgICB9Ci0KLQkgIGlmIChsaXN0LT5saW5lX2NvbnRlbnRzKQotCSAgICB7Ci0JICAgICAgaWYgKCEoKGxpc3RpbmcgJiBMSVNUSU5HX05PREVCVUcpCi0JCSAgICAmJiBkZWJ1Z2dpbmdfcHNldWRvIChsaXN0LCBsaXN0LT5saW5lX2NvbnRlbnRzKSkpCi0JCXsKLSAJCSAgcHJpbnRfbGluZXMgKGxpc3QsCi0JCQkgICAgICAgbGlzdC0+ZmlsZS0+bGluZW51bSA9PSAwID8gbGlzdC0+bGluZSA6IGxpc3QtPmZpbGUtPmxpbmVudW0sCi0JCQkgICAgICAgbGlzdC0+bGluZV9jb250ZW50cywgY2FsY19oZXggKGxpc3QpKTsKLQkJfQotCSAgICAgIGZyZWUgKGxpc3QtPmxpbmVfY29udGVudHMpOwotCSAgICAgIGxpc3QtPmxpbmVfY29udGVudHMgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aGlsZSAobGlzdC0+ZmlsZS0+bGluZW51bSA8IGxpc3RfbGluZQotCQkgICAgICYmICFsaXN0LT5maWxlLT5hdF9lbmQpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgYWRkcmVzczsKLQotCQkgIHAgPSBidWZmZXJfbGluZSAobGlzdC0+ZmlsZSwgYnVmZmVyLCB3aWR0aCk7Ci0KLQkJICBpZiAobGlzdC0+ZmlsZS0+bGluZW51bSA8IGxpc3RfbGluZSkKLQkJICAgIGFkZHJlc3MgPSB+ICh1bnNpZ25lZCBpbnQpIDA7Ci0JCSAgZWxzZQotCQkgICAgYWRkcmVzcyA9IGNhbGNfaGV4IChsaXN0KTsKLQotCQkgIGlmICghKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKQotCQkJJiYgZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgcCkpKQotCQkgICAgcHJpbnRfbGluZXMgKGxpc3QsIGxpc3QtPmZpbGUtPmxpbmVudW0sIHAsIGFkZHJlc3MpOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX0VKRUNUKQotCSAgICB7Ci0JICAgICAgZWplY3QgPSAxOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfTk9MSVNUX05FWFQpCi0JLS1zaG93X2xpc3Rpbmc7Ci0KLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLQotICBmcmVlIChidWZmZXIpOwotICBmcmVlIChkYXRhX2J1ZmZlcik7Ci0gIGRhdGFfYnVmZmVyID0gTlVMTDsKLX0KLQotdm9pZAotbGlzdGluZ19wcmludCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IHVzaW5nX3N0ZG91dDsKLSAgCi0gIHRpdGxlID0gIiI7Ci0gIHN1YnRpdGxlID0gIiI7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsaXN0X2ZpbGUgPSBzdGRvdXQ7Ci0gICAgICB1c2luZ19zdGRvdXQgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxpc3RfZmlsZSA9IGZvcGVuIChuYW1lLCAidyIpOwotICAgICAgaWYgKGxpc3RfZmlsZSAhPSBOVUxMKQotCXVzaW5nX3N0ZG91dCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfcGVycm9yIChfKCJjYW4ndCBvcGVuIGxpc3QgZmlsZTogJXMiKSwgbmFtZSk7Ci0JICBsaXN0X2ZpbGUgPSBzdGRvdXQ7Ci0JICB1c2luZ19zdGRvdXQgPSAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX05PRk9STSkKLSAgICB7Ci0gICAgICBwYXBlcl9oZWlnaHQgPSAwOwotICAgIH0KLQotICBpZiAobGlzdGluZyAmIExJU1RJTkdfTElTVElORykKLSAgICB7Ci0gICAgICBsaXN0aW5nX2xpc3RpbmcgKG5hbWUpOwotICAgIH0KLQotICBpZiAobGlzdGluZyAmIExJU1RJTkdfU1lNQk9MUykKLSAgICB7Ci0gICAgICBsaXN0X3N5bWJvbF90YWJsZSAoKTsKLSAgICB9Ci0KLSAgaWYgKCEgdXNpbmdfc3Rkb3V0KQotICAgIHsKLSAgICAgIGlmIChmY2xvc2UgKGxpc3RfZmlsZSkgPT0gRU9GKQotCWFzX3BlcnJvciAoXygiZXJyb3IgY2xvc2luZyBsaXN0IGZpbGU6ICVzIiksIG5hbWUpOwotICAgIH0KLQotICBpZiAobGFzdF9vcGVuX2ZpbGUpCi0gICAgewotICAgICAgZmNsb3NlIChsYXN0X29wZW5fZmlsZSk7Ci0gICAgfQotfQotCi0KLXZvaWQKLWxpc3RpbmdfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgZm4gPSBuYW1lOwotfQotCi12b2lkCi1saXN0aW5nX2VqZWN0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX0VKRUNUOwotfQotCi12b2lkCi1saXN0aW5nX2ZsYWdzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgd2hpbGUgKCgqaW5wdXRfbGluZV9wb2ludGVyKyspICYmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicpKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi19Ci0KLS8qIFR1cm4gbGlzdGluZyBvbiBvciBvZmYuICBBbiBhcmd1bWVudCBvZiAwIG1lYW5zIHRvIHR1cm4gb2ZmCi0gICBsaXN0aW5nLiAgQW4gYXJndW1lbnQgb2YgMSBtZWFucyB0byB0dXJuIG9uIGxpc3RpbmcuICBBbiBhcmd1bWVudAotICAgb2YgMiBtZWFucyB0byB0dXJuIG9mZiBsaXN0aW5nLCBidXQgYXMgb2YgdGhlIG5leHQgbGluZTsgdGhhdCBpcywKLSAgIHRoZSBjdXJyZW50IGxpbmUgc2hvdWxkIGJlIGxpc3RlZCwgYnV0IHRoZSBuZXh0IGxpbmUgc2hvdWxkIG5vdC4gICovCi0KLXZvaWQKLWxpc3RpbmdfbGlzdCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgc3dpdGNoIChvbikKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGxpc3RpbmdfdGFpbC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTkU7Ci0JICBlbHNlCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9OT0xJU1Q7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpZiAobGlzdGluZ190YWlsLT5lZGljdCA9PSBFRElDVF9OT0xJU1QKLQkgICAgICB8fCBsaXN0aW5nX3RhaWwtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQotCSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9ORTsKLQkgIGVsc2UKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX0xJU1Q7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9MSVNUX05FWFQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLX0KLQotCi12b2lkCi1saXN0aW5nX3BzaXplICh3aWR0aF9vbmx5KQotICAgICBpbnQgd2lkdGhfb25seTsKLXsKLSAgaWYgKCEgd2lkdGhfb25seSkKLSAgICB7Ci0gICAgICBwYXBlcl9oZWlnaHQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAgICAgaWYgKHBhcGVyX2hlaWdodCA8IDAgfHwgcGFwZXJfaGVpZ2h0ID4gMTAwMCkKLQl7Ci0JICBwYXBlcl9oZWlnaHQgPSAwOwotCSAgYXNfd2FybiAoXygic3RyYW5nZSBwYXBlciBoZWlnaHQsIHNldCB0byBubyBmb3JtIikpOwotCX0KLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgcGFwZXJfd2lkdGggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1saXN0aW5nX25vcGFnZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHBhcGVyX2hlaWdodCA9IDA7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfdGl0bGUgKGRlcHRoKQotICAgICBpbnQgZGVwdGg7Ci17Ci0gIGludCBxdW90ZWQ7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyICp0dGw7Ci0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCInKQotICAgIHF1b3RlZCA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBxdW90ZWQgPSAxOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKQotICAgIHsKLSAgICAgIGlmIChxdW90ZWQKLQkgID8gKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCInCi0JICA6IGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICBpZiAobGlzdGluZykKLQkgICAgewotCSAgICAgIGxlbmd0aCA9IGlucHV0X2xpbmVfcG9pbnRlciAtIHN0YXJ0OwotCSAgICAgIHR0bCA9IHhtYWxsb2MgKGxlbmd0aCArIDEpOwotCSAgICAgIG1lbWNweSAodHRsLCBzdGFydCwgbGVuZ3RoKTsKLQkgICAgICB0dGxbbGVuZ3RoXSA9IDA7Ci0JICAgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IGRlcHRoID8gRURJQ1RfU0JUVEwgOiBFRElDVF9USVRMRTsKLQkgICAgICBsaXN0aW5nX3RhaWwtPmVkaWN0X2FyZyA9IHR0bDsKLQkgICAgfQotCSAgaWYgKHF1b3RlZCkKLQkgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQl7Ci0JICBhc19iYWQgKF8oIk5ldyBsaW5lIGluIHRpdGxlIikpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JfQotICAgIH0KLX0KLQotCi0KLXZvaWQKLWxpc3Rpbmdfc291cmNlX2xpbmUgKGxpbmUpCi0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBpZiAobGlzdGluZykKLSAgICB7Ci0gICAgICBuZXdfZnJhZyAoKTsKLSAgICAgIGxpc3RpbmdfdGFpbC0+aGxsX2xpbmUgPSBsaW5lOwotICAgICAgbmV3X2ZyYWcgKCk7Ci0gICAgfQotfQotCi12b2lkCi1saXN0aW5nX3NvdXJjZV9maWxlIChmaWxlKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotewotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3RhaWwtPmhsbF9maWxlID0gZmlsZV9pbmZvIChmaWxlKTsKLX0KLQotCi0KLSNlbHNlCi0KLQotLyogRHVtbXkgZnVuY3Rpb25zIGZvciB3aGVuIGNvbXBpbGVkIHdpdGhvdXQgbGlzdGluZyBlbmFibGVkICovCi0KLXZvaWQKLWxpc3RpbmdfZmxhZ3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ19saXN0IChvbikKLSAgICAgaW50IG9uOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQgCi1saXN0aW5nX2VqZWN0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZCAKLWxpc3RpbmdfcHNpemUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkCi1saXN0aW5nX25vcGFnZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQgCi1saXN0aW5nX3RpdGxlIChkZXB0aCkKLSAgICAgaW50IGRlcHRoOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLQotfQotCi12b2lkIAotbGlzdGluZ19uZXdsaW5lIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotCi19Ci0KLXZvaWQgCi1saXN0aW5nX3NvdXJjZV9saW5lIChuKQotICAgICB1bnNpZ25lZCBpbnQgbjsKLXsKLQotfQotdm9pZCAKLWxpc3Rpbmdfc291cmNlX2ZpbGUgKG4pCi0gICAgIGNvbnN0IGNoYXIgKm47Ci17Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvbGlzdGluZy5oIGIvZ2FzL2xpc3RpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkNWMzNy4uMDAwMDAwMAotLS0gYS9nYXMvbGlzdGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGxpc3RpbmcuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9fbGlzdGluZ19oX18KLSNkZWZpbmUgX19saXN0aW5nX2hfXwotCi0jZGVmaW5lIExJU1RJTkdfTElTVElORyAgICAxCi0jZGVmaW5lIExJU1RJTkdfU1lNQk9MUyAgICAyCi0jZGVmaW5lIExJU1RJTkdfTk9GT1JNICAgICA0Ci0jZGVmaW5lIExJU1RJTkdfSExMICAgICAgICA4Ci0jZGVmaW5lIExJU1RJTkdfTk9ERUJVRyAgIDE2Ci0jZGVmaW5lIExJU1RJTkdfTk9DT05ECSAgMzIKLSNkZWZpbmUgTElTVElOR19NQUNFWFAJICA2NAotCi0jZGVmaW5lIExJU1RJTkdfREVGQVVMVCAgICAoTElTVElOR19MSVNUSU5HIHwgTElTVElOR19ITEwgfCBMSVNUSU5HX1NZTUJPTFMpCi0KLSNpZm5kZWYgTk9fTElTVElORwotI2RlZmluZSBMSVNUSU5HX05FV0xJTkUoKSB7IGlmIChsaXN0aW5nKSBsaXN0aW5nX25ld2xpbmUoTlVMTCk7IH0KLSNlbHNlCi0jZGVmaW5lIExJU1RJTkdfTkVXTElORSgpIHs7fQotI2VuZGlmCi0jZGVmaW5lIExJU1RJTkdfRU9GKCkgICAgIExJU1RJTkdfTkVXTElORSgpCi0KLSNkZWZpbmUgTElTVElOR19TS0lQX0NPTkQoKSAoKGxpc3RpbmcgJiBMSVNUSU5HX05PQ09ORCkgIT0gMCkKLQotdm9pZCBsaXN0aW5nX2VqZWN0IFBBUkFNUyAoKGludCkpOwotdm9pZCBsaXN0aW5nX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1lc3NhZ2UpKTsKLXZvaWQgbGlzdGluZ19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLXZvaWQgbGlzdGluZ19mbGFncyBQQVJBTVMgKChpbnQpKTsKLXZvaWQgbGlzdGluZ19saXN0IFBBUkFNUyAoKGludCBvbikpOwotdm9pZCBsaXN0aW5nX25ld2xpbmUgUEFSQU1TICgoY2hhciAqcHMpKTsKLXZvaWQgbGlzdGluZ19wcmV2X2xpbmUgUEFSQU1TICgodm9pZCkpOwotdm9pZCBsaXN0aW5nX3ByaW50IFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLXZvaWQgbGlzdGluZ19wc2l6ZSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgbGlzdGluZ19ub3BhZ2UgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3Rpbmdfc291cmNlX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci12b2lkIGxpc3Rpbmdfc291cmNlX2xpbmUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci12b2lkIGxpc3RpbmdfdGl0bGUgUEFSQU1TICgoaW50IGRlcHRoKSk7Ci12b2lkIGxpc3Rpbmdfd2FybmluZyBQQVJBTVMgKChjb25zdCBjaGFyICptZXNzYWdlKSk7Ci12b2lkIGxpc3Rpbmdfd2lkdGggUEFSQU1TICgodW5zaWduZWQgaW50IHgpKTsKLQotZXh0ZXJuIGludCBsaXN0aW5nX2xoc193aWR0aDsKLWV4dGVybiBpbnQgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kOwotZXh0ZXJuIGludCBsaXN0aW5nX2xoc19jb250X2xpbmVzOwotZXh0ZXJuIGludCBsaXN0aW5nX3Joc193aWR0aDsKLQotI2VuZGlmIC8qIF9fbGlzdGluZ19oX18gKi8KLQotLyogZW5kIG9mIGxpc3RpbmcuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2xpdGVyYWwuYyBiL2dhcy9saXRlcmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjhmYzQuLjAwMDAwMDAKLS0tIGEvZ2FzL2xpdGVyYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIGFzLmMgLSBHQVMgbGl0ZXJhbCBwb29sIG1hbmFnZW1lbnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtlbiBSYWVidXJuIChyYWVidXJuQGN5Z251cy5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyogVGhpcyBpc24ndCBxdWl0ZSBhICJjb25zdGFudCIgcG9vbC4gIFNvbWUgb2YgdGhlIHZhbHVlcyBtYXkgZ2V0Ci0gICBhZGp1c3RlZCBhdCBydW4gdGltZSwgZS5nLiwgZm9yIHN5bWJvbGljIHJlbG9jYXRpb25zIHdoZW4gc2hhcmVkCi0gICBsaWJyYXJpZXMgYXJlIGluIHVzZS4gIEl0J3MgbW9yZSBvZiBhICJsaXRlcmFsIiBwb29sLgotCi0gICBPbiB0aGUgQWxwaGEsIHRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIC5saXRhIGFuZCAubGl0OC4gIChJcyB0aGVyZQotICAgZXZlciBhIC5saXQ0PykgIE9uIHRoZSBNSVBTLCBpdCBjb3VsZCBiZSB1c2VkIGZvciAubGl0NCBhcyB3ZWxsLgotCi0gICBUaGUgZXhwcmVzc2lvbnMgcGFzc2VkIGhlcmUgc2hvdWxkIGNvbnRhaW4gZWl0aGVyIGNvbnN0YW50cyBvciBzeW1ib2xzLAotICAgbm90IGEgY29tYmluYXRpb24gb2YgYm90aC4gIFR5cGljYWxseSwgdGhlIGNvbnN0YW50IHBvb2wgaXMgYWNjZXNzZWQKLSAgIHdpdGggc29tZSBzb3J0IG9mIEdQIHJlZ2lzdGVyLCBzbyB0aGUgc2l6ZSBvZiB0aGUgcG9vbCBtdXN0IGJlIGtlcHQgZG93bgotICAgaWYgcG9zc2libGUuICBUaGUgZXhjZXB0aW9uIGlzIHNlY3Rpb24gb2Zmc2V0cyAtLSBpZiB5b3UncmUgc3RvcmluZyBhCi0gICBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiAuZGF0YSwgZm9yIGV4YW1wbGUsIGFuZCB5b3VyIG1hY2hpbmUgcHJvdmlkZXMKLSAgIGZvciAxNi1iaXQgc2lnbmVkIGFkZGVuZHMsIHlvdSBtaWdodCB3YW50IHRvIHN0b3JlIC5kYXRhKzMySywgc28gdGhhdAotICAgeW91IGNhbiBhY2Nlc3MgYWxsIG9mIHRoZSBmaXJzdCA2NEsgb2YgLmRhdGEgd2l0aCB0aGUgb25lIHBvaW50ZXIuCi0KLSAgIFRoaXMgaXNuJ3QgYSByZXF1aXJlbWVudCwganVzdCBhIGd1aWRlbGluZSB0aGF0IGNhbiBoZWxwIGtlZXAgLm8gZmlsZQotICAgc2l6ZSBkb3duLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgZGVmaW5lZCAoTkVFRF9MSVRFUkFMX1BPT0wpCi0KLXZhbHVlVAotYWRkX3RvX2xpdGVyYWxfcG9vbCAoc3ltLCBhZGRlbmQsIHNlYywgc2l6ZSkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICB2YWx1ZVQgYWRkZW5kOwotICAgICBzZWdUIHNlYzsKLSAgICAgaW50IHNpemU7Ci17Ci0gIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgdmFsdWVUIG9mZnNldDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7Ci0gIGNoYXIgKnA7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGZpeFMgKmZpeHA7Ci0KLSAgb2Zmc2V0ID0gMDsKLSAgLyogQEAgVGhpcyBhc3N1bWVzIGFsbCBlbnRyaWVzIGluIGEgZ2l2ZW4gc2VjdGlvbiB3aWxsIGJlIG9mIHRoZSBzYW1lCi0gICAgIHNpemUuLi4gIFByb2JhYmx5IGNvcnJlY3QsIGJ1dCB1bndpc2UgdG8gcmVseSBvbi4gICovCi0gIC8qIFRoaXMgbXVzdCBhbHdheXMgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgc3Vic2VnbWVudC4gICovCi0gIGlmIChzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5mcmNoYWluUC0+Zml4X3Jvb3Q7Ci0JIGZpeHAgIT0gKGZpeFMgKikgTlVMTDsKLQkgZml4cCA9IGZpeHAtPmZ4X25leHQsIG9mZnNldCArPSBzaXplKQotICAgICAgewotCWlmIChmaXhwLT5meF9hZGRzeSA9PSBzeW0gJiYgZml4cC0+Znhfb2Zmc2V0ID09IGFkZGVuZCkKLQkgIHJldHVybiBvZmZzZXQ7Ci0gICAgICB9Ci0KLSAgc3Vic2VnX3NldCAoc2VjLCAwKTsKLSAgcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0gIG1lbXNldCAocCwgMCwgc2l6ZSk7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICByZWxvY190eXBlID0gQkZEX1JFTE9DXzMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ182NDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsIHN5bSwgYWRkZW5kLCAwLAotCSAgIHJlbG9jX3R5cGUpOwotCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VjdGlvbiwgY3VycmVudF9zdWJzZWMpOwotICBvZmZzZXQgPSBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gc2l6ZTsKLSAgcmV0dXJuIG9mZnNldDsKLX0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCmRpZmYgLS1naXQgYS9nYXMvbWFjLWFzLnIgYi9nYXMvbWFjLWFzLnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNmMwMzMuLjAwMDAwMDAKLS0tIGEvZ2FzL21hYy1hcy5yCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogUmVzb3VyY2VzIGZvciBHTlUgQVMuICovCi0KLSNpbmNsdWRlICJTeXNUeXBlcy5yIgotCi0vKiBWZXJzaW9uIHJlc291cmNlcy4gKi8KLQotcmVzb3VyY2UgJ3ZlcnMnICgxKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JVkVSU0lPTl9TVFJJTkcgICIgKEMpIDE5ODYtOTUgRlNGLCBJbmMuIgotfTsKLQotcmVzb3VyY2UgJ3ZlcnMnICgyLCBwdXJnZWFibGUpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQkiR0FTICIgVkVSU0lPTl9TVFJJTkcgIiBmb3IgTVBXIgotfTsKLQotI2lmZGVmIFdBTlRfQ0ZSRwotCi0jaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKLQotcmVzb3VyY2UgJ2NmcmcnICgwKSB7Ci0JewotCQlrUG93ZXJQQywKLQkJa0Z1bGxMaWIsCi0JCWtOb1ZlcnNpb25OdW0sIGtOb1ZlcnNpb25OdW0sCi0JCTAsMCwKLQkJa0lzQXBwLCBrT25EaXNrRmxhdCwga1plcm9PZmZzZXQsIGtXaG9sZUZvcmssCi0JCVBST0dfTkFNRQotCX0KLX07Ci0KLSNlbmRpZiAvKiBXQU5UX0NGUkcgKi8KZGlmZiAtLWdpdCBhL2dhcy9tYWNyby5jIGIvZ2FzL21hY3JvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDdmMWQuLjAwMDAwMDAKLS0tIGEvZ2FzL21hY3JvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYzICswLDAgQEAKLS8qIG1hY3JvLmMgLSBtYWNybyBzdXBwb3J0IGZvciBnYXMgYW5kIGdhc3AKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotIyBpZm5kZWYgYWxsb2NhCi0jICBpZmRlZiBfX1NURENfXwotZXh0ZXJuIHZvaWQgKmFsbG9jYSAoKTsKLSMgIGVsc2UKLWV4dGVybiBjaGFyICphbGxvY2EgKCk7Ci0jICBlbmRpZgotIyBlbmRpZgotI2Vsc2UKLSMgaWYgSEFWRV9BTExPQ0FfSAotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi0jICAgIGlmICFkZWZpbmVkIChfX1NURENfXykgJiYgIWRlZmluZWQgKF9faHB1eCkKLWV4dGVybiBjaGFyICphbGxvY2EgKCk7Ci0jICAgIGVsc2UKLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmIC8qIF9fU1REQ19fLCBfX2hwdXggKi8KLSMgICBlbmRpZiAvKiBhbGxvY2EgKi8KLSMgIGVuZGlmIC8qIF9BSVggKi8KLSMgZW5kaWYgLyogSEFWRV9BTExPQ0FfSCAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJtYWNyby5oIgotCi0jaW5jbHVkZSAiYXNpbnRsLmgiCi0KLS8qIFRoZSByb3V0aW5lcyBpbiB0aGlzIGZpbGUgaGFuZGxlIG1hY3JvIGRlZmluaXRpb24gYW5kIGV4cGFuc2lvbi4KLSAgIFRoZXkgYXJlIGNhbGxlZCBieSBib3RoIGdhc3AgYW5kIGdhcy4gICovCi0KLS8qIFN0cnVjdHVyZXMgdXNlZCB0byBzdG9yZSBtYWNyb3MuIAotCi0gICBFYWNoIG1hY3JvIGtub3dzIGl0cyBuYW1lIGFuZCBpbmNsdWRlZCB0ZXh0LiAgSXQgZ2V0cyBidWlsdCB3aXRoIGEKLSAgIGxpc3Qgb2YgZm9ybWFsIGFyZ3VtZW50cywgYW5kIGFsc28ga2VlcHMgYSBoYXNoIHRhYmxlIHdoaWNoIHBvaW50cwotICAgaW50byB0aGUgbGlzdCB0byBzcGVlZCB1cCBmb3JtYWwgc2VhcmNoLiAgRWFjaCBmb3JtYWwga25vd3MgaXRzCi0gICBuYW1lIGFuZCBpdHMgZGVmYXVsdCB2YWx1ZS4gIEVhY2ggdGltZSB0aGUgbWFjcm8gaXMgZXhwYW5kZWQsIHRoZQotICAgZm9ybWFscyBnZXQgdGhlIGFjdHVhbCB2YWx1ZXMgYXR0YXRjaGVkIHRvIHRoZW0uICovCi0KLS8qIGRlc2NyaWJlIHRoZSBmb3JtYWwgYXJndW1lbnRzIHRvIGEgbWFjcm8gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZm9ybWFsX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IGZvcm1hbF9zdHJ1Y3QgKm5leHQ7CS8qIG5leHQgZm9ybWFsIGluIGxpc3QgKi8KLSAgICBzYiBuYW1lOwkJCS8qIG5hbWUgb2YgdGhlIGZvcm1hbCAqLwotICAgIHNiIGRlZjsJCQkvKiB0aGUgZGVmYXVsdCB2YWx1ZSAqLwotICAgIHNiIGFjdHVhbDsJCQkvKiB0aGUgYWN0dWFsIGFyZ3VtZW50IChjaGFuZ2VkIG9uIGVhY2ggZXhwYW5zaW9uKSAqLwotICAgIGludCBpbmRleDsJCQkvKiB0aGUgaW5kZXggb2YgdGhlIGZvcm1hbCAwLi5mb3JtYWxfY291bnQtMSAqLwotICB9Ci1mb3JtYWxfZW50cnk7Ci0KLS8qIE90aGVyIHZhbHVlcyBmb3VuZCBpbiB0aGUgaW5kZXggZmllbGQgb2YgYSBmb3JtYWxfZW50cnkuICAqLwotI2RlZmluZSBRVUFMX0lOREVYICgtMSkKLSNkZWZpbmUgTkFSR19JTkRFWCAoLTIpCi0jZGVmaW5lIExPQ0FMX0lOREVYICgtMykKLQotLyogZGVzY3JpYmUgdGhlIG1hY3JvLiAqLwotCi10eXBlZGVmIHN0cnVjdCBtYWNyb19zdHJ1Y3QKLSAgewotICAgIHNiIHN1YjsJCQkvKiBzdWJzdGl0dXRpb24gdGV4dC4gKi8KLSAgICBpbnQgZm9ybWFsX2NvdW50OwkJLyogbnVtYmVyIG9mIGZvcm1hbCBhcmdzLiAqLwotICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsczsJLyogcG9pbnRlciB0byBsaXN0IG9mIGZvcm1hbF9zdHJ1Y3RzICovCi0gICAgc3RydWN0IGhhc2hfY29udHJvbCAqZm9ybWFsX2hhc2g7IC8qIGhhc2ggdGFibGUgb2YgZm9ybWFscy4gKi8KLSAgfQotbWFjcm9fZW50cnk7Ci0KLS8qIEludGVybmFsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQgZ2V0X3Rva2VuIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBnZXRzdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldF9hbnlfc3RyaW5nIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgZG9fZm9ybWFscyBQQVJBTVMgKChtYWNyb19lbnRyeSAqLCBpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0X2Fwb3N0X3Rva2VuIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgaW50IHN1Yl9hY3R1YWwKLSAgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBzdHJ1Y3QgaGFzaF9jb250cm9sICosIGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbWFjcm9fZXhwYW5kX2JvZHkKLSAgUEFSQU1TICgoc2IgKiwgc2IgKiwgZm9ybWFsX2VudHJ5ICosIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICptYWNyb19leHBhbmQgUEFSQU1TICgoaW50LCBzYiAqLCBtYWNyb19lbnRyeSAqLCBzYiAqLCBpbnQpKTsKLQotI2RlZmluZSBJU1dISVRFKHgpICgoeCkgPT0gJyAnIHx8ICh4KSA9PSAnXHQnKQotCi0jZGVmaW5lIElTU0VQKHgpIFwKLSAoKHgpID09ICcgJyB8fCAoeCkgPT0gJ1x0JyB8fCAoeCkgPT0gJywnIHx8ICh4KSA9PSAnIicgfHwgKHgpID09ICc7JyBcCi0gIHx8ICh4KSA9PSAnKScgfHwgKHgpID09ICcoJyBcCi0gIHx8ICgobWFjcm9fYWx0ZXJuYXRlIHx8IG1hY3JvX21yaSkgJiYgKCh4KSA9PSAnPCcgfHwgKHgpID09ICc+JykpKQotCi0jZGVmaW5lIElTQkFTRSh4KSBcCi0gICgoeCkgPT0gJ2InIHx8ICh4KSA9PSAnQicgXAotICAgfHwgKHgpID09ICdxJyB8fCAoeCkgPT0gJ1EnIFwKLSAgIHx8ICh4KSA9PSAnaCcgfHwgKHgpID09ICdIJyBcCi0gICB8fCAoeCkgPT0gJ2QnIHx8ICh4KSA9PSAnRCcpCi0KLS8qIFRoZSBtYWNybyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1hY3JvX2hhc2g7Ci0KLS8qIFdoZXRoZXIgYW55IG1hY3JvcyBoYXZlIGJlZW4gZGVmaW5lZC4gICovCi0KLWludCBtYWNyb19kZWZpbmVkOwotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiBHQVNQIGFsdGVybmF0ZSBtb2RlLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19hbHRlcm5hdGU7Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIGluIE1SSSBtb2RlLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19tcmk7Ci0KLS8qIFdoZXRoZXIgd2Ugc2hvdWxkIHN0cmlwICdAJyBjaGFyYWN0ZXJzLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19zdHJpcF9hdDsKLQotLyogRnVuY3Rpb24gdG8gdXNlIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50ICgqbWFjcm9fZXhwcikgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHNiICosIGludCAqKSk7Ci0KLS8qIE51bWJlciBvZiBtYWNybyBleHBhbnNpb25zIHRoYXQgaGF2ZSBiZWVuIGRvbmUuICAqLwotCi1zdGF0aWMgaW50IG1hY3JvX251bWJlcjsKLQotLyogSW5pdGlhbGl6ZSBtYWNybyBwcm9jZXNzaW5nLiAgKi8KLQotdm9pZAotbWFjcm9faW5pdCAoYWx0ZXJuYXRlLCBtcmksIHN0cmlwX2F0LCBleHByKQotICAgICBpbnQgYWx0ZXJuYXRlOwotICAgICBpbnQgbXJpOwotICAgICBpbnQgc3RyaXBfYXQ7Ci0gICAgIGludCAoKmV4cHIpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotewotICBtYWNyb19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIG1hY3JvX2RlZmluZWQgPSAwOwotICBtYWNyb19hbHRlcm5hdGUgPSBhbHRlcm5hdGU7Ci0gIG1hY3JvX21yaSA9IG1yaTsKLSAgbWFjcm9fc3RyaXBfYXQgPSBzdHJpcF9hdDsKLSAgbWFjcm9fZXhwciA9IGV4cHI7Ci19Ci0KLS8qIFN3aXRjaCBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlIG9uIHRoZSBmbHkuICAqLwotCi12b2lkCi1tYWNyb19tcmlfbW9kZSAobXJpKQotICAgICBpbnQgbXJpOwotewotICBtYWNyb19tcmkgPSBtcmk7Ci19Ci0KLS8qIFJlYWQgaW5wdXQgbGluZXMgdGlsbCB3ZSBnZXQgdG8gYSBUTyBzdHJpbmcuCi0gICBJbmNyZWFzZSBuZXN0aW5nIGRlcHRoIGlmIHdlIGdldCBhIEZST00gc3RyaW5nLgotICAgUHV0IHRoZSByZXN1bHRzIGludG8gc2IgYXQgUFRSLgotICAgQWRkIGEgbmV3IGlucHV0IGxpbmUgdG8gYW4gc2IgdXNpbmcgR0VUX0xJTkUuCi0gICBSZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIHVuZXhwZWN0ZWQgRU9GLiAgKi8KLQotaW50Ci1idWZmZXJfYW5kX25lc3QgKGZyb20sIHRvLCBwdHIsIGdldF9saW5lKQotICAgICBjb25zdCBjaGFyICpmcm9tOwotICAgICBjb25zdCBjaGFyICp0bzsKLSAgICAgc2IgKnB0cjsKLSAgICAgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKTsKLXsKLSAgaW50IGZyb21fbGVuID0gc3RybGVuIChmcm9tKTsKLSAgaW50IHRvX2xlbiA9IHN0cmxlbiAodG8pOwotICBpbnQgZGVwdGggPSAxOwotICBpbnQgbGluZV9zdGFydCA9IHB0ci0+bGVuOwotCi0gIGludCBtb3JlID0gZ2V0X2xpbmUgKHB0cik7Ci0KLSAgd2hpbGUgKG1vcmUpCi0gICAgewotICAgICAgLyogVHJ5IGFuZCBmaW5kIHRoZSBmaXJzdCBwc2V1ZG8gb3Agb24gdGhlIGxpbmUgKi8KLSAgICAgIGludCBpID0gbGluZV9zdGFydDsKLQotICAgICAgaWYgKCEgbWFjcm9fYWx0ZXJuYXRlICYmICEgbWFjcm9fbXJpKQotCXsKLQkgIC8qIFdpdGggbm9ybWFsIHN5bnRheCB3ZSBjYW4gc3VjayB3aGF0IHdlIHdhbnQgdGlsbCB3ZSBnZXQKLQkgICAgIHRvIHRoZSBkb3QuICBXaXRoIHRoZSBhbHRlcm5hdGUsIGxhYmVscyBoYXZlIHRvIHN0YXJ0IGluCi0JICAgICB0aGUgZmlyc3QgY29sdW1uLCBzaW5jZSB3ZSBjYW50IHRlbGwgd2hhdCdzIGEgbGFiZWwgYW5kCi0JICAgICB3aGF0cyBhIHBzZXVkb29wICovCi0KLQkgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0JICB3aGlsZSAoaSA8IHB0ci0+bGVuICYmIElTV0hJVEUgKHB0ci0+cHRyW2ldKSkKLQkgICAgaSsrOwotCi0JICAvKiBTa2lwIG92ZXIgYSBsYWJlbCAqLwotCSAgd2hpbGUgKGkgPCBwdHItPmxlbgotCQkgJiYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBwdHItPnB0cltpXSkKLQkJICAgICB8fCBwdHItPnB0cltpXSA9PSAnXycKLQkJICAgICB8fCBwdHItPnB0cltpXSA9PSAnJCcpKQotCSAgICBpKys7Ci0KLQkgIC8qIEFuZCBhIGNvbG9uICovCi0JICBpZiAoaSA8IHB0ci0+bGVuCi0JICAgICAgJiYgcHRyLT5wdHJbaV0gPT0gJzonKQotCSAgICBpKys7Ci0KLQl9Ci0gICAgICAvKiBTa2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLSAgICAgIHdoaWxlIChpIDwgcHRyLT5sZW4gJiYgSVNXSElURSAocHRyLT5wdHJbaV0pKQotCWkrKzsKLQotICAgICAgaWYgKGkgPCBwdHItPmxlbiAmJiAocHRyLT5wdHJbaV0gPT0gJy4nCi0JCQkgICB8fCBtYWNyb19hbHRlcm5hdGUKLQkJCSAgIHx8IG1hY3JvX21yaSkpCi0JewotCSAgaWYgKHB0ci0+cHRyW2ldID09ICcuJykKLQkgICAgICBpKys7Ci0JICBpZiAoc3RybmNhc2VjbXAgKHB0ci0+cHRyICsgaSwgZnJvbSwgZnJvbV9sZW4pID09IDAKLQkgICAgICAmJiAocHRyLT5sZW4gPT0gKGkgKyBmcm9tX2xlbikgfHwgISBpc2FsbnVtIChwdHItPnB0cltpICsgZnJvbV9sZW5dKSkpCi0JICAgIGRlcHRoKys7Ci0JICBpZiAoc3RybmNhc2VjbXAgKHB0ci0+cHRyICsgaSwgdG8sIHRvX2xlbikgPT0gMAotCSAgICAgICYmIChwdHItPmxlbiA9PSAoaSArIHRvX2xlbikgfHwgISBpc2FsbnVtIChwdHItPnB0cltpICsgdG9fbGVuXSkpKQotCSAgICB7Ci0JICAgICAgZGVwdGgtLTsKLQkgICAgICBpZiAoZGVwdGggPT0gMCkKLQkJewotCQkgIC8qIFJlc2V0IHRoZSBzdHJpbmcgdG8gbm90IGluY2x1ZGUgdGhlIGVuZGluZyBydW5lICovCi0JCSAgcHRyLT5sZW4gPSBsaW5lX3N0YXJ0OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFkZCBhIENSIHRvIHRoZSBlbmQgYW5kIGtlZXAgcnVubmluZyAqLwotICAgICAgc2JfYWRkX2NoYXIgKHB0ciwgJ1xuJyk7Ci0gICAgICBsaW5lX3N0YXJ0ID0gcHRyLT5sZW47Ci0gICAgICBtb3JlID0gZ2V0X2xpbmUgKHB0cik7Ci0gICAgfQotCi0gIC8qIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gdW5leHBlY3RlZCBFT0YuICAqLwotICByZXR1cm4gZGVwdGggPT0gMDsKLX0KLQotLyogUGljayB1cCBhIHRva2VuLiAgKi8KLQotc3RhdGljIGludAotZ2V0X3Rva2VuIChpZHgsIGluLCBuYW1lKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpuYW1lOwotewotICBpZiAoaWR4IDwgaW4tPmxlbgotICAgICAgJiYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pCi0JICB8fCBpbi0+cHRyW2lkeF0gPT0gJ18nCi0JICB8fCBpbi0+cHRyW2lkeF0gPT0gJyQnKSkKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAobmFtZSwgaW4tPnB0cltpZHgrK10pOwotICAgICAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkgICAgICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHhdKQotCQkgfHwgaW4tPnB0cltpZHhdID09ICdfJwotCQkgfHwgaW4tPnB0cltpZHhdID09ICckJykpCi0JewotCSAgc2JfYWRkX2NoYXIgKG5hbWUsIGluLT5wdHJbaWR4KytdKTsKLQl9Ci0gICAgfQotICAvKiBJZ25vcmUgdHJhaWxpbmcgJiAqLwotICBpZiAobWFjcm9fYWx0ZXJuYXRlICYmIGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICcmJykKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogUGljayB1cCBhIHN0cmluZy4gICovCi0KLXN0YXRpYyBpbnQKLWdldHN0cmluZyAoaWR4LCBpbiwgYWNjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICphY2M7Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JICYmIChpbi0+cHRyW2lkeF0gPT0gJyInIAotCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnPCcgJiYgKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpKQotCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnXCcnICYmIG1hY3JvX2FsdGVybmF0ZSkpKQotICAgIHsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCXsKLQkgIGludCBuZXN0ID0gMDsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKChpbi0+cHRyW2lkeF0gIT0gJz4nIHx8IG5lc3QpCi0JCSAmJiBpZHggPCBpbi0+bGVuKQotCSAgICB7Ci0JICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIScpCi0JCXsKLQkJICBpZHgrKyAgOwotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJz4nKQotCQkgICAgbmVzdC0tOwotCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCQkgICAgbmVzdCsrOwotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJfQotCSAgICB9Ci0JICBpZHgrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnKQotCXsKLQkgIGNoYXIgdGNoYXIgPSBpbi0+cHRyW2lkeF07Ci0JICBpZHgrKzsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuKQotCSAgICB7Ci0JICAgICAgaWYgKG1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW2lkeF0gPT0gJyEnKQotCQl7Ci0JCSAgaWR4KysgIDsKLQkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09IHRjaGFyKQotCQkgICAgewotCQkgICAgICBpZHgrKzsKLQkJICAgICAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4XSk7Ci0JCSAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gaWR4OwotfQotCi0vKiBGZXRjaCBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAotICAgcnVsZXM6Ci0gICAgJ0J4eXg8d2hpdGVzcGFjZT4gIAktPiByZXR1cm4gJ0J4eXphCi0gICAgJTxjaGFyPgkJLT4gcmV0dXJuIHN0cmluZyBvZiBkZWNpbWFsIHZhbHVlIG9mIHgKLSAgICAiPHN0cmluZz4iCQktPiByZXR1cm4gc3RyaW5nCi0gICAgeHl4PHdoaXRlc3BhY2U+ICAgICAtPiByZXR1cm4geHl6Ci0qLwotCi1zdGF0aWMgaW50Ci1nZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgb3V0LCBleHBhbmQsIHByZXRlbmRfcXVvdGVkKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCBleHBhbmQ7Ci0gICAgIGludCBwcmV0ZW5kX3F1b3RlZDsKLXsKLSAgc2JfcmVzZXQgKG91dCk7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIGlmIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGlmIChpbi0+bGVuID4gMiAmJiBpbi0+cHRyW2lkeCsxXSA9PSAnXCcnICYmIElTQkFTRSAoaW4tPnB0cltpZHhdKSkKLQl7Ci0JICB3aGlsZSAoIUlTU0VQIChpbi0+cHRyW2lkeF0pKQotCSAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICclJwotCSAgICAgICAmJiBtYWNyb19hbHRlcm5hdGUKLQkgICAgICAgJiYgZXhwYW5kKQotCXsKLQkgIGludCB2YWw7Ci0JICBjaGFyIGJ1ZlsyMF07Ci0JICAvKiBUdXJucyB0aGUgbmV4dCBleHByZXNzaW9uIGludG8gYSBzdHJpbmcgKi8KLQkgIGlkeCA9ICgqbWFjcm9fZXhwcikgKF8oIiUgb3BlcmF0b3IgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiIpLAotCQkJICAgICAgIGlkeCArIDEsCi0JCQkgICAgICAgaW4sCi0JCQkgICAgICAgJnZhbCk7Ci0JICBzcHJpbnRmKGJ1ZiwgIiVkIiwgdmFsKTsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInCi0JICAgICAgIHx8IChpbi0+cHRyW2lkeF0gPT0gJzwnICYmIChtYWNyb19hbHRlcm5hdGUgfHwgbWFjcm9fbXJpKSkKLQkgICAgICAgfHwgKG1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW2lkeF0gPT0gJ1wnJykpCi0JewotCSAgaWYgKG1hY3JvX2FsdGVybmF0ZQotCSAgICAgICYmICEgbWFjcm9fc3RyaXBfYXQKLQkgICAgICAmJiBleHBhbmQpCi0JICAgIHsKLQkgICAgICAvKiBLZWVwIHRoZSBxdW90ZXMgKi8KLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAgJ1wiJyk7Ci0KLQkgICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuIAotCQkgJiYgKGluLT5wdHJbaWR4XSA9PSAnIicKLQkJICAgICB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJwotCQkgICAgIHx8IHByZXRlbmRfcXVvdGVkIAotCQkgICAgIHx8IChpbi0+cHRyW2lkeF0gIT0gJyAnCi0JCQkgJiYgaW4tPnB0cltpZHhdICE9ICdcdCcKLQkJCSAmJiBpbi0+cHRyW2lkeF0gIT0gJywnCi0JCQkgJiYgKGluLT5wdHJbaWR4XSAhPSAnPCcKLQkJCSAgICAgfHwgKCEgbWFjcm9fYWx0ZXJuYXRlICYmICEgbWFjcm9fbXJpKSkpKSkKLQkgICAgewotCSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInIAotCQkgIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnKQotCQl7Ci0JCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkJCSAmJiBpbi0+cHRyW2lkeF0gIT0gdGNoYXIpCi0JCSAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7CQkgICAgCi0JCSAgaWYgKGlkeCA9PSBpbi0+bGVuKQotCQkgICAgcmV0dXJuIGlkeDsJICAgICAgCi0JCX0KLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIFBpY2sgdXAgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLWRvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKQotICAgICBtYWNyb19lbnRyeSAqbWFjcm87Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgZm9ybWFsX2VudHJ5ICoqcCA9ICZtYWNyby0+Zm9ybWFsczsKLQotICBtYWNyby0+Zm9ybWFsX2NvdW50ID0gMDsKLSAgbWFjcm8tPmZvcm1hbF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsOwotCi0gICAgICBmb3JtYWwgPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0KLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+bmFtZSk7Ci0gICAgICBzYl9uZXcgKCZmb3JtYWwtPmRlZik7Ci0gICAgICBzYl9uZXcgKCZmb3JtYWwtPmFjdHVhbCk7Ci0KLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgICAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmZm9ybWFsLT5uYW1lKTsKLSAgICAgIGlmIChmb3JtYWwtPm5hbWUubGVuID09IDApCi0JYnJlYWs7Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIGlmIChmb3JtYWwtPm5hbWUubGVuKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBmb3JtYWwgKi8KLQkgIGlmIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnPScpCi0JICAgIHsKLQkgICAgICAvKiBHb3QgYSBkZWZhdWx0ICovCi0JICAgICAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCArIDEsIGluLCAmZm9ybWFsLT5kZWYsIDEsIDApOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBZGQgdG8gbWFjcm8ncyBoYXNoIHRhYmxlICovCi0gICAgICBoYXNoX2phbSAobWFjcm8tPmZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZmb3JtYWwtPm5hbWUpLCBmb3JtYWwpOwotCi0gICAgICBmb3JtYWwtPmluZGV4ID0gbWFjcm8tPmZvcm1hbF9jb3VudDsKLSAgICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICAgICAgbWFjcm8tPmZvcm1hbF9jb3VudCsrOwotICAgICAgKnAgPSBmb3JtYWw7Ci0gICAgICBwID0gJmZvcm1hbC0+bmV4dDsKLSAgICAgICpwID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG1hY3JvX21yaSkKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKmZvcm1hbDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIEFkZCBhIHNwZWNpYWwgTkFSRyBmb3JtYWwsIHdoaWNoIG1hY3JvX2V4cGFuZCB3aWxsIHNldCB0byB0aGUKLSAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICAgICAgZm9ybWFsID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCi0gICAgICBzYl9uZXcgKCZmb3JtYWwtPm5hbWUpOwotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5kZWYpOwotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5hY3R1YWwpOwotCi0gICAgICAvKiBUaGUgc2FtZSBNUkkgYXNzZW1ibGVycyB3aGljaCB0cmVhdCAnQCcgY2hhcmFjdGVycyBhbHNvIHVzZQotICAgICAgICAgdGhlIG5hbWUgJE5BUkcuICBBdCBsZWFzdCB1bnRpbCB3ZSBmaW5kIGFuIGV4Y2VwdGlvbi4gICovCi0gICAgICBpZiAobWFjcm9fc3RyaXBfYXQpCi0JbmFtZSA9ICIkTkFSRyI7Ci0gICAgICBlbHNlCi0JbmFtZSA9ICJOQVJHIjsKLQotICAgICAgc2JfYWRkX3N0cmluZyAoJmZvcm1hbC0+bmFtZSwgbmFtZSk7Ci0KLSAgICAgIC8qIEFkZCB0byBtYWNybydzIGhhc2ggdGFibGUgKi8KLSAgICAgIGhhc2hfamFtIChtYWNyby0+Zm9ybWFsX2hhc2gsIG5hbWUsIGZvcm1hbCk7Ci0KLSAgICAgIGZvcm1hbC0+aW5kZXggPSBOQVJHX0lOREVYOwotICAgICAgKnAgPSBmb3JtYWw7Ci0gICAgICBmb3JtYWwtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBEZWZpbmUgYSBuZXcgbWFjcm8uICBSZXR1cm5zIE5VTEwgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIHJldHVybnMgYW4KLSAgIGVycm9yIG1lc3NhZ2UuICBJZiBOQU1FUCBpcyBub3QgTlVMTCwgKk5BTUVQIGlzIHNldCB0byB0aGUgbmFtZSBvZgotICAgdGhlIG1hY3JvIHdoaWNoIHdhcyBkZWZpbmVkLiAgKi8KLQotY29uc3QgY2hhciAqCi1kZWZpbmVfbWFjcm8gKGlkeCwgaW4sIGxhYmVsLCBnZXRfbGluZSwgbmFtZXApCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKmxhYmVsOwotICAgICBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci17Ci0gIG1hY3JvX2VudHJ5ICptYWNybzsKLSAgc2IgbmFtZTsKLSAgY29uc3QgY2hhciAqbmFtZXN0cjsKLQotICBtYWNybyA9IChtYWNyb19lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKG1hY3JvX2VudHJ5KSk7Ci0gIHNiX25ldyAoJm1hY3JvLT5zdWIpOwotICBzYl9uZXcgKCZuYW1lKTsKLQotICBtYWNyby0+Zm9ybWFsX2NvdW50ID0gMDsKLSAgbWFjcm8tPmZvcm1hbHMgPSAwOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBpZiAoISBidWZmZXJfYW5kX25lc3QgKCJNQUNSTyIsICJFTkRNIiwgJm1hY3JvLT5zdWIsIGdldF9saW5lKSkKLSAgICByZXR1cm4gXygidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBtYWNybyBkZWZpbml0aW9uIik7Ci0gIGlmIChsYWJlbCAhPSBOVUxMICYmIGxhYmVsLT5sZW4gIT0gMCkKLSAgICB7Ci0gICAgICBzYl9hZGRfc2IgKCZuYW1lLCBsYWJlbCk7Ci0gICAgICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJygnKQotCXsKLQkgIC8qIEl0J3MgdGhlIGxhYmVsOiBNQUNSTyAoZm9ybWFscywuLi4pICBzb3J0ICovCi0JICBpZHggPSBkb19mb3JtYWxzIChtYWNybywgaWR4ICsgMSwgaW4pOwotCSAgaWYgKGluLT5wdHJbaWR4XSAhPSAnKScpCi0JICAgIHJldHVybiBfKCJtaXNzaW5nICkgYWZ0ZXIgZm9ybWFscyIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJdCdzIHRoZSBsYWJlbDogTUFDUk8gZm9ybWFscywuLi4gIHNvcnQgKi8KLQkgIGlkeCA9IGRvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmbmFtZSk7Ci0gICAgICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgICAgIGlkeCA9IGRvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKTsKLSAgICB9Ci0KLSAgLyogYW5kIHN0aWNrIGl0IGluIHRoZSBtYWNybyBoYXNoIHRhYmxlICovCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgbmFtZS5sZW47IGlkeCsrKQotICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgbmFtZS5wdHJbaWR4XSkpCi0gICAgICBuYW1lLnB0cltpZHhdID0gdG9sb3dlciAobmFtZS5wdHJbaWR4XSk7Ci0gIG5hbWVzdHIgPSBzYl90ZXJtaW5hdGUgKCZuYW1lKTsKLSAgaGFzaF9qYW0gKG1hY3JvX2hhc2gsIG5hbWVzdHIsIChQVFIpIG1hY3JvKTsKLQotICBtYWNyb19kZWZpbmVkID0gMTsKLQotICBpZiAobmFtZXAgIT0gTlVMTCkKLSAgICAqbmFtZXAgPSBuYW1lc3RyOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTY2FuIGEgdG9rZW4sIGFuZCB0aGVuIHNraXAgS0lORC4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9hcG9zdF90b2tlbiAoaWR4LCBpbiwgbmFtZSwga2luZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqbmFtZTsKLSAgICAgaW50IGtpbmQ7Ci17Ci0gIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgbmFtZSk7Ci0gIGlmIChpZHggPCBpbi0+bGVuCi0gICAgICAmJiBpbi0+cHRyW2lkeF0gPT0ga2luZAotICAgICAgJiYgKCEgbWFjcm9fbXJpIHx8IG1hY3JvX3N0cmlwX2F0KQotICAgICAgJiYgKCEgbWFjcm9fc3RyaXBfYXQgfHwga2luZCA9PSAnQCcpKQotICAgIGlkeCsrOwotICByZXR1cm4gaWR4OwotfQotCi0vKiBTdWJzdGl0dXRlIHRoZSBhY3R1YWwgdmFsdWUgZm9yIGEgZm9ybWFsIHBhcmFtZXRlci4gICovCi0KLXN0YXRpYyBpbnQKLXN1Yl9hY3R1YWwgKHN0YXJ0LCBpbiwgdCwgZm9ybWFsX2hhc2gsIGtpbmQsIG91dCwgY29weWlmbm90dGhlcmUpCi0gICAgIGludCBzdGFydDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqdDsKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqZm9ybWFsX2hhc2g7Ci0gICAgIGludCBraW5kOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgY29weWlmbm90dGhlcmU7Ci17Ci0gIGludCBzcmM7Ci0gIGZvcm1hbF9lbnRyeSAqcHRyOwotCi0gIHNyYyA9IGdldF9hcG9zdF90b2tlbiAoc3RhcnQsIGluLCB0LCBraW5kKTsKLSAgLyogU2VlIGlmIGl0J3MgaW4gdGhlIG1hY3JvJ3MgaGFzaCB0YWJsZSwgdW5sZXNzIHRoaXMgaXMKLSAgICAgbWFjcm9fc3RyaXBfYXQgYW5kIGtpbmQgaXMgJ0AnIGFuZCB0aGUgdG9rZW4gZGlkIG5vdCBlbmQgaW4gJ0AnLiAgKi8KLSAgaWYgKG1hY3JvX3N0cmlwX2F0Ci0gICAgICAmJiBraW5kID09ICdAJwotICAgICAgJiYgKHNyYyA9PSBzdGFydCB8fCBpbi0+cHRyW3NyYyAtIDFdICE9ICdAJykpCi0gICAgcHRyID0gTlVMTDsKLSAgZWxzZQotICAgIHB0ciA9IChmb3JtYWxfZW50cnkgKikgaGFzaF9maW5kIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICh0KSk7Ci0gIGlmIChwdHIpCi0gICAgewotICAgICAgaWYgKHB0ci0+YWN0dWFsLmxlbikKLQl7Ci0JICBzYl9hZGRfc2IgKG91dCwgJnB0ci0+YWN0dWFsKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2JfYWRkX3NiIChvdXQsICZwdHItPmRlZik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoa2luZCA9PSAnJicpCi0gICAgewotICAgICAgLyogRG9pbmcgdGhpcyBwZXJtaXRzIHBlb3BsZSB0byB1c2UgJiBpbiBtYWNybyBib2RpZXMuICAqLwotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyYnKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGNvcHlpZm5vdHRoZXJlKQotICAgIHsKLSAgICAgIHNiX2FkZF9zYiAob3V0LCB0KTsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJ1xcJyk7Ci0gICAgICBzYl9hZGRfc2IgKG91dCwgdCk7Ci0gICAgfQotICByZXR1cm4gc3JjOwotfQotCi0vKiBFeHBhbmQgdGhlIGJvZHkgb2YgYSBtYWNyby4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1hY3JvX2V4cGFuZF9ib2R5IChpbiwgb3V0LCBmb3JtYWxzLCBmb3JtYWxfaGFzaCwgY29tbWVudF9jaGFyLCBsb2NhbHMpCi0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLSAgICAgZm9ybWFsX2VudHJ5ICpmb3JtYWxzOwotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpmb3JtYWxfaGFzaDsKLSAgICAgaW50IGNvbW1lbnRfY2hhcjsKLSAgICAgaW50IGxvY2FsczsKLXsKLSAgc2IgdDsKLSAgaW50IHNyYyA9IDA7Ci0gIGludCBpbnF1b3RlID0gMDsKLSAgZm9ybWFsX2VudHJ5ICpsb2NsaXN0ID0gTlVMTDsKLQotICBzYl9uZXcgKCZ0KTsKLQotICB3aGlsZSAoc3JjIDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPnB0cltzcmNdID09ICcmJykKLQl7Ci0JICBzYl9yZXNldCAoJnQpOwotCSAgaWYgKG1hY3JvX21yaSkKLQkgICAgewotCSAgICAgIGlmIChzcmMgKyAxIDwgaW4tPmxlbiAmJiBpbi0+cHRyW3NyYyArIDFdID09ICcmJykKLQkJc3JjID0gc3ViX2FjdHVhbCAoc3JjICsgMiwgaW4sICZ0LCBmb3JtYWxfaGFzaCwgJ1wnJywgb3V0LCAxKTsKLQkgICAgICBlbHNlCi0JCXNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdoeSBkbyB3ZSBkbyB0aGlzPyAgKi8KLQkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMgKyAxLCBpbiwgJnQsIGZvcm1hbF9oYXNoLCAnJicsIG91dCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJ1xcJykKLQl7Ci0JICBzcmMrKzsKLQkgIGlmIChpbi0+cHRyW3NyY10gPT0gY29tbWVudF9jaGFyICYmIGNvbW1lbnRfY2hhciAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGNvbW1lbnQsIGp1c3QgZHJvcCB0aGUgcmVzdCBvZiB0aGUgbGluZSAqLwotCSAgICAgIHdoaWxlIChzcmMgPCBpbi0+bGVuCi0JCSAgICAgJiYgaW4tPnB0cltzcmNdICE9ICdcbicpCi0JCXNyYysrOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJygnKQotCSAgICB7Ci0JICAgICAgLyogU3ViIGluIHRpbGwgdGhlIG5leHQgJyknIGxpdGVyYWxseSAqLwotCSAgICAgIHNyYysrOwotCSAgICAgIHdoaWxlIChzcmMgPCBpbi0+bGVuICYmIGluLT5wdHJbc3JjXSAhPSAnKScpCi0JCXsKLQkJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW3NyYysrXSk7Ci0JCX0KLQkgICAgICBpZiAoaW4tPnB0cltzcmNdID09ICcpJykKLQkJc3JjKys7Ci0JICAgICAgZWxzZQotCQlyZXR1cm4gXygibWlzc3BsYWNlZCApIik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnQCcpCi0JICAgIHsKLQkgICAgICAvKiBTdWIgaW4gdGhlIG1hY3JvIGludm9jYXRpb24gbnVtYmVyICovCi0KLQkgICAgICBjaGFyIGJ1ZmZlclsxMF07Ci0JICAgICAgc3JjKys7Ci0JICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJTA1ZCIsIG1hY3JvX251bWJlcik7Ci0JICAgICAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJyYnKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHByZXByb2Nlc3NvciB2YXJpYWJsZSBuYW1lLCB3ZSBkb24ndCBkbyB0aGVtCi0JCSBoZXJlICovCi0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJ1xcJyk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyYnKTsKLQkgICAgICBzcmMrKzsKLQkgICAgfQotCSAgZWxzZSBpZiAobWFjcm9fbXJpCi0JCSAgICYmIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pKQotCSAgICB7Ci0JICAgICAgaW50IGluZDsKLQkgICAgICBmb3JtYWxfZW50cnkgKmY7Ci0KLQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbc3JjXSkpCi0JCWluZCA9IGluLT5wdHJbc3JjXSAtICcwJzsKLQkgICAgICBlbHNlIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltzcmNdKSkKLQkJaW5kID0gaW4tPnB0cltzcmNdIC0gJ0EnICsgMTA7Ci0JICAgICAgZWxzZQotCQlpbmQgPSBpbi0+cHRyW3NyY10gLSAnYScgKyAxMDsKLQkgICAgICArK3NyYzsKLQkgICAgICBmb3IgKGYgPSBmb3JtYWxzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCQl7Ci0JCSAgaWYgKGYtPmluZGV4ID09IGluZCAtIDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChmLT5hY3R1YWwubGVuICE9IDApCi0JCQlzYl9hZGRfc2IgKG91dCwgJmYtPmFjdHVhbCk7Ci0JCSAgICAgIGVsc2UKLQkJCXNiX2FkZF9zYiAob3V0LCAmZi0+ZGVmKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2JfcmVzZXQgKCZ0KTsKLQkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMsIGluLCAmdCwgZm9ybWFsX2hhc2gsICdcJycsIG91dCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgobWFjcm9fYWx0ZXJuYXRlIHx8IG1hY3JvX21yaSkKLQkgICAgICAgJiYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pCi0JCSAgIHx8IGluLT5wdHJbc3JjXSA9PSAnXycKLQkJICAgfHwgaW4tPnB0cltzcmNdID09ICckJykKLQkgICAgICAgJiYgKCEgaW5xdW90ZQotCQkgICB8fCAhIG1hY3JvX3N0cmlwX2F0Ci0JCSAgIHx8IChzcmMgPiAwICYmIGluLT5wdHJbc3JjIC0gMV0gPT0gJ0AnKSkpCi0JewotCSAgaWYgKCEgbG9jYWxzCi0JICAgICAgfHwgc3JjICsgNSA+PSBpbi0+bGVuCi0JICAgICAgfHwgc3RybmNhc2VjbXAgKGluLT5wdHIgKyBzcmMsICJMT0NBTCIsIDUpICE9IDAKLQkgICAgICB8fCAhIElTV0hJVEUgKGluLT5wdHJbc3JjICsgNV0pKQotCSAgICB7Ci0JICAgICAgc2JfcmVzZXQgKCZ0KTsKLQkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMsIGluLCAmdCwgZm9ybWFsX2hhc2gsCi0JCQkJKG1hY3JvX3N0cmlwX2F0ICYmIGlucXVvdGUpID8gJ0AnIDogJ1wnJywKLQkJCQlvdXQsIDEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmb3JtYWxfZW50cnkgKmY7Ci0KLQkgICAgICBzcmMgPSBzYl9za2lwX3doaXRlIChzcmMgKyA1LCBpbik7Ci0JICAgICAgd2hpbGUgKGluLT5wdHJbc3JjXSAhPSAnXG4nICYmIGluLT5wdHJbc3JjXSAhPSBjb21tZW50X2NoYXIpCi0JCXsKLQkJICBzdGF0aWMgaW50IGxvY2NudDsKLQkJICBjaGFyIGJ1ZlsyMF07Ci0JCSAgY29uc3QgY2hhciAqZXJyOwotCi0JCSAgZiA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQkJICBzYl9uZXcgKCZmLT5uYW1lKTsKLQkJICBzYl9uZXcgKCZmLT5kZWYpOwotCQkgIHNiX25ldyAoJmYtPmFjdHVhbCk7Ci0JCSAgZi0+aW5kZXggPSBMT0NBTF9JTkRFWDsKLQkJICBmLT5uZXh0ID0gbG9jbGlzdDsKLQkJICBsb2NsaXN0ID0gZjsKLQotCQkgIHNyYyA9IGdldF90b2tlbiAoc3JjLCBpbiwgJmYtPm5hbWUpOwotCQkgICsrbG9jY250OwotCQkgIHNwcmludGYgKGJ1ZiwgIkxMJTA0eCIsIGxvY2NudCk7Ci0JCSAgc2JfYWRkX3N0cmluZyAoJmYtPmFjdHVhbCwgYnVmKTsKLQotCQkgIGVyciA9IGhhc2hfamFtIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmZi0+bmFtZSksIGYpOwotCQkgIGlmIChlcnIgIT0gTlVMTCkKLQkJICAgIHJldHVybiBlcnI7Ci0KLQkJICBzcmMgPSBzYl9za2lwX2NvbW1hIChzcmMsIGluKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoY29tbWVudF9jaGFyICE9ICdcMCcKLQkgICAgICAgJiYgaW4tPnB0cltzcmNdID09IGNvbW1lbnRfY2hhcgotCSAgICAgICAmJiBzcmMgKyAxIDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW3NyYyArIDFdID09IGNvbW1lbnRfY2hhcgotCSAgICAgICAmJiAhaW5xdW90ZSkKLQl7Ci0JICAvKiBUd28gY29tbWVudCBjaGFycyBpbiBhIHJvdyBjYXVzZSB0aGUgcmVzdCBvZiB0aGUgbGluZSB0bwotICAgICAgICAgICAgIGJlIGRyb3BwZWQuICAqLwotCSAgd2hpbGUgKHNyYyA8IGluLT5sZW4gJiYgaW4tPnB0cltzcmNdICE9ICdcbicpCi0JICAgIHNyYysrOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnIicKLQkgICAgICAgfHwgKG1hY3JvX21yaSAmJiBpbi0+cHRyW3NyY10gPT0gJ1wnJykpCi0JewotCSAgaW5xdW90ZSA9ICFpbnF1b3RlOwotCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltzcmMrK10pOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnQCcgJiYgbWFjcm9fc3RyaXBfYXQpCi0JewotCSAgKytzcmM7Ci0JICBpZiAoc3JjIDwgaW4tPmxlbgotCSAgICAgICYmIGluLT5wdHJbc3JjXSA9PSAnQCcpCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnQCcpOwotCSAgICAgICsrc3JjOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWFjcm9fbXJpCi0JICAgICAgICYmIGluLT5wdHJbc3JjXSA9PSAnPScKLQkgICAgICAgJiYgc3JjICsgMSA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltzcmMgKyAxXSA9PSAnPScpCi0JewotCSAgZm9ybWFsX2VudHJ5ICpwdHI7Ci0KLQkgIHNiX3Jlc2V0ICgmdCk7Ci0JICBzcmMgPSBnZXRfdG9rZW4gKHNyYyArIDIsIGluLCAmdCk7Ci0JICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJnQpKTsKLQkgIGlmIChwdHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IHJldHVybiBhIHdhcm5pbmcgc3RyaW5nIGhlcmUsCi0gICAgICAgICAgICAgICAgIGJ1dCB3ZSBjYW4ndCwgYmVjYXVzZSB0aGUgPT0gbWlnaHQgYmUgaW4gdGhlIE1SSQotICAgICAgICAgICAgICAgICBjb21tZW50IGZpZWxkLCBhbmQsIHNpbmNlIHRoZSBuYXR1cmUgb2YgdGhlIE1SSQotICAgICAgICAgICAgICAgICBjb21tZW50IGZpZWxkIGRlcGVuZHMgdXBvbiB0aGUgZXhhY3QgaW5zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgICAgYmVpbmcgdXNlZCwgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gaGVyZSB0bwotICAgICAgICAgICAgICAgICBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgaXMgb3Igbm90LiAgSW5zdGVhZCwgd2UgbGVhdmUKLSAgICAgICAgICAgICAgICAgdGhlID09IGluIHBsYWNlLCB3aGljaCBzaG91bGQgY2F1c2UgYSBzeW50YXggZXJyb3IgaWYKLSAgICAgICAgICAgICAgICAgaXQgaXMgbm90IGluIGEgY29tbWVudC4gICovCi0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJz0nKTsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnPScpOwotCSAgICAgIHNiX2FkZF9zYiAob3V0LCAmdCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwdHItPmFjdHVhbC5sZW4pCi0JCXsKLQkJICBzYl9hZGRfc3RyaW5nIChvdXQsICItMSIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2JfYWRkX2NoYXIgKG91dCwgJzAnKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKLQl9Ci0gICAgfQotCi0gIHNiX2tpbGwgKCZ0KTsKLQotICB3aGlsZSAobG9jbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvcm1hbF9lbnRyeSAqZjsKLQotICAgICAgZiA9IGxvY2xpc3QtPm5leHQ7Ci0gICAgICAvKiBTZXR0aW5nIHRoZSB2YWx1ZSB0byBOVUxMIGVmZmVjdGl2ZWx5IGRlbGV0ZXMgdGhlIGVudHJ5LiAgV2UKLSAgICAgICAgIGF2b2lkIGNhbGxpbmcgaGFzaF9kZWxldGUgYmVjYXVzZSBpdCBkb2Vzbid0IHJlY2xhaW0gbWVtb3J5LiAgKi8KLSAgICAgIGhhc2hfamFtIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmbG9jbGlzdC0+bmFtZSksIE5VTEwpOwotICAgICAgc2Jfa2lsbCAoJmxvY2xpc3QtPm5hbWUpOwotICAgICAgc2Jfa2lsbCAoJmxvY2xpc3QtPmRlZik7Ci0gICAgICBzYl9raWxsICgmbG9jbGlzdC0+YWN0dWFsKTsKLSAgICAgIGZyZWUgKGxvY2xpc3QpOwotICAgICAgbG9jbGlzdCA9IGY7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBBc3NpZ24gdmFsdWVzIHRvIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiBhIG1hY3JvLCBhbmQgZXhwYW5kIHRoZQotICAgYm9keS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1hY3JvX2V4cGFuZCAoaWR4LCBpbiwgbSwgb3V0LCBjb21tZW50X2NoYXIpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgbWFjcm9fZW50cnkgKm07Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci17Ci0gIHNiIHQ7Ci0gIGZvcm1hbF9lbnRyeSAqcHRyOwotICBmb3JtYWxfZW50cnkgKmY7Ci0gIGludCBpc19wb3NpdGlvbmFsID0gMDsKLSAgaW50IGlzX2tleXdvcmQgPSAwOwotICBpbnQgbmFyZyA9IDA7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLQotICBzYl9uZXcgKCZ0KTsKLSAgCi0gIC8qIFJlc2V0IGFueSBvbGQgdmFsdWUgdGhlIGFjdHVhbHMgbWF5IGhhdmUgKi8KLSAgZm9yIChmID0gbS0+Zm9ybWFsczsgZjsgZiA9IGYtPm5leHQpCi0gICAgICBzYl9yZXNldCAoJmYtPmFjdHVhbCk7Ci0gIGYgPSBtLT5mb3JtYWxzOwotICB3aGlsZSAoZiAhPSBOVUxMICYmIGYtPmluZGV4IDwgMCkKLSAgICBmID0gZi0+bmV4dDsKLQotICBpZiAobWFjcm9fbXJpKQotICAgIHsKLSAgICAgIC8qIFRoZSBtYWNybyBtYXkgYmUgY2FsbGVkIHdpdGggYW4gb3B0aW9uYWwgcXVhbGlmaWVyLCB3aGljaCBtYXkKLSAgICAgICAgIGJlIHJlZmVycmVkIHRvIGluIHRoZSBtYWNybyBib2R5IGFzIFwwLiAgKi8KLSAgICAgIGlmIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnLicpCi0JewotCSAgZm9ybWFsX2VudHJ5ICpuOwotCi0JICBuID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCSAgc2JfbmV3ICgmbi0+bmFtZSk7Ci0JICBzYl9uZXcgKCZuLT5kZWYpOwotCSAgc2JfbmV3ICgmbi0+YWN0dWFsKTsKLQkgIG4tPmluZGV4ID0gUVVBTF9JTkRFWDsKLQotCSAgbi0+bmV4dCA9IG0tPmZvcm1hbHM7Ci0JICBtLT5mb3JtYWxzID0gbjsKLQotCSAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCArIDEsIGluLCAmbi0+YWN0dWFsLCAxLCAwKTsKLQl9Ci0gICAgfQotCi0gIC8qIFBlZWwgb2ZmIHRoZSBhY3R1YWxzIGFuZCBzdG9yZSB0aGVtIGF3YXkgaW4gdGhlIGhhc2ggdGFibGVzJyBhY3R1YWxzICovCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gIT0gY29tbWVudF9jaGFyKQotICAgIHsKLSAgICAgIGludCBzY2FuOwotCi0gICAgICAvKiBMb29rIGFuZCBzZWUgaWYgaXQncyBhIHBvc2l0aW9uYWwgb3Iga2V5d29yZCBhcmcgKi8KLSAgICAgIHNjYW4gPSBpZHg7Ci0gICAgICB3aGlsZSAoc2NhbiA8IGluLT5sZW4KLQkgICAgICYmICFJU1NFUCAoaW4tPnB0cltzY2FuXSkKLQkgICAgICYmICEobWFjcm9fbXJpICYmIGluLT5wdHJbc2Nhbl0gPT0gJ1wnJykKLQkgICAgICYmICghbWFjcm9fYWx0ZXJuYXRlICYmIGluLT5wdHJbc2Nhbl0gIT0gJz0nKSkKLQlzY2FuKys7Ci0gICAgICBpZiAoc2NhbiA8IGluLT5sZW4gJiYgIW1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW3NjYW5dID09ICc9JykKLQl7Ci0JICBpc19rZXl3b3JkID0gMTsKLQotCSAgLyogSXQncyBPSyB0byBnbyBmcm9tIHBvc2l0aW9uYWwgdG8ga2V5d29yZC4gICovCi0KLQkgIC8qIFRoaXMgaXMgYSBrZXl3b3JkIGFyZywgZmV0Y2ggdGhlIGZvcm1hbCBuYW1lIGFuZAotCSAgICAgdGhlbiB0aGUgYWN0dWFsIHN0dWZmICovCi0JICBzYl9yZXNldCAoJnQpOwotCSAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmdCk7Ci0JICBpZiAoaW4tPnB0cltpZHhdICE9ICc9JykKLQkgICAgcmV0dXJuIF8oImNvbmZ1c2lvbiBpbiBmb3JtYWwgcGFyYW1ldGVycyIpOwotCi0JICAvKiBMb29rdXAgdGhlIGZvcm1hbCBpbiB0aGUgbWFjcm8ncyBsaXN0ICovCi0JICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAobS0+Zm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJnQpKTsKLQkgIGlmICghcHRyKQotCSAgICByZXR1cm4gXygibWFjcm8gZm9ybWFsIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0Iik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJbnNlcnQgdGhpcyB2YWx1ZSBpbnRvIHRoZSByaWdodCBwbGFjZSAqLwotCSAgICAgIHNiX3Jlc2V0ICgmcHRyLT5hY3R1YWwpOwotCSAgICAgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHggKyAxLCBpbiwgJnB0ci0+YWN0dWFsLCAwLCAwKTsKLQkgICAgICBpZiAocHRyLT5hY3R1YWwubGVuID4gMCkKLQkJKytuYXJnOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwb3NpdGlvbmFsIGFyZyAqLwotCSAgaXNfcG9zaXRpb25hbCA9IDE7Ci0JICBpZiAoaXNfa2V5d29yZCkKLQkgICAgcmV0dXJuIF8oImNhbid0IG1peCBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyIpOwotCi0JICBpZiAoIWYpCi0JICAgIHsKLQkgICAgICBmb3JtYWxfZW50cnkgKipwZjsKLQkgICAgICBpbnQgYzsKLQotCSAgICAgIGlmICghbWFjcm9fbXJpKQotCQlyZXR1cm4gXygidG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMiKTsKLQotCSAgICAgIGYgPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0JICAgICAgc2JfbmV3ICgmZi0+bmFtZSk7Ci0JICAgICAgc2JfbmV3ICgmZi0+ZGVmKTsKLQkgICAgICBzYl9uZXcgKCZmLT5hY3R1YWwpOwotCSAgICAgIGYtPm5leHQgPSBOVUxMOwotCi0JICAgICAgYyA9IC0xOwotCSAgICAgIGZvciAocGYgPSAmbS0+Zm9ybWFsczsgKnBmICE9IE5VTEw7IHBmID0gJigqcGYpLT5uZXh0KQotCQlpZiAoKCpwZiktPmluZGV4ID49IGMpCi0JCSAgYyA9ICgqcGYpLT5pbmRleCArIDE7Ci0JICAgICAgaWYgKGMgPT0gLTEpCi0JCWMgPSAwOwotCSAgICAgICpwZiA9IGY7Ci0JICAgICAgZi0+aW5kZXggPSBjOwotCSAgICB9Ci0KLQkgIHNiX3Jlc2V0ICgmZi0+YWN0dWFsKTsKLQkgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmZi0+YWN0dWFsLCAxLCAwKTsKLQkgIGlmIChmLT5hY3R1YWwubGVuID4gMCkKLQkgICAgKytuYXJnOwotCSAgZG8KLQkgICAgewotCSAgICAgIGYgPSBmLT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoZiAhPSBOVUxMICYmIGYtPmluZGV4IDwgMCk7Ci0JfQotCi0gICAgICBpZiAoISBtYWNyb19tcmkpCi0JaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGluLT5wdHJbaWR4XSA9PSAnLCcpCi0JICAgICsraWR4OwotCSAgaWYgKElTV0hJVEUgKGluLT5wdHJbaWR4XSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG1hY3JvX21yaSkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZmZlclsyMF07Ci0KLSAgICAgIHNiX3Jlc2V0ICgmdCk7Ci0gICAgICBzYl9hZGRfc3RyaW5nICgmdCwgbWFjcm9fc3RyaXBfYXQgPyAiJE5BUkciIDogIk5BUkciKTsKLSAgICAgIHB0ciA9IChmb3JtYWxfZW50cnkgKikgaGFzaF9maW5kIChtLT5mb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmdCkpOwotICAgICAgc2JfcmVzZXQgKCZwdHItPmFjdHVhbCk7Ci0gICAgICBzcHJpbnRmIChidWZmZXIsICIlZCIsIG5hcmcpOwotICAgICAgc2JfYWRkX3N0cmluZyAoJnB0ci0+YWN0dWFsLCBidWZmZXIpOwotICAgIH0KLQotICBlcnIgPSBtYWNyb19leHBhbmRfYm9keSAoJm0tPnN1Yiwgb3V0LCBtLT5mb3JtYWxzLCBtLT5mb3JtYWxfaGFzaCwKLQkJCSAgIGNvbW1lbnRfY2hhciwgMSk7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICByZXR1cm4gZXJyOwotCi0gIC8qIERpc2NhcmQgYW55IHVubmFtZWQgZm9ybWFsIGFyZ3VtZW50cy4gICovCi0gIGlmIChtYWNyb19tcmkpCi0gICAgewotICAgICAgZm9ybWFsX2VudHJ5ICoqcGY7Ci0KLSAgICAgIHBmID0gJm0tPmZvcm1hbHM7Ci0gICAgICB3aGlsZSAoKnBmICE9IE5VTEwpCi0JewotCSAgaWYgKCgqcGYpLT5uYW1lLmxlbiAhPSAwKQotCSAgICBwZiA9ICYoKnBmKS0+bmV4dDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNiX2tpbGwgKCYoKnBmKS0+bmFtZSk7Ci0JICAgICAgc2Jfa2lsbCAoJigqcGYpLT5kZWYpOwotCSAgICAgIHNiX2tpbGwgKCYoKnBmKS0+YWN0dWFsKTsKLQkgICAgICBmID0gKCpwZiktPm5leHQ7Ci0JICAgICAgZnJlZSAoKnBmKTsKLQkgICAgICAqcGYgPSBmOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBzYl9raWxsICgmdCk7Ci0gIG1hY3JvX251bWJlcisrOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBDaGVjayBmb3IgYSBtYWNyby4gIElmIG9uZSBpcyBmb3VuZCwgcHV0IHRoZSBleHBhbnNpb24gaW50bwotICAgKkVYUEFORC4gIENPTU1FTlRfQ0hBUiBpcyB0aGUgY29tbWVudCBjaGFyYWN0ZXItLXRoaXMgaXMgdXNlZCBieQotICAgZ2FzcC4gIFJldHVybiAxIGlmIGEgbWFjcm8gaXMgZm91bmQsIDAgb3RoZXJ3aXNlLiAgKi8KLQotaW50Ci1jaGVja19tYWNybyAobGluZSwgZXhwYW5kLCBjb21tZW50X2NoYXIsIGVycm9yKQotICAgICBjb25zdCBjaGFyICpsaW5lOwotICAgICBzYiAqZXhwYW5kOwotICAgICBpbnQgY29tbWVudF9jaGFyOwotICAgICBjb25zdCBjaGFyICoqZXJyb3I7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNoYXIgKmNvcHksICpjczsKLSAgbWFjcm9fZW50cnkgKm1hY3JvOwotICBzYiBsaW5lX3NiOwotCi0gIGlmICghIGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSAqbGluZSkKLSAgICAgICYmICpsaW5lICE9ICdfJwotICAgICAgJiYgKmxpbmUgIT0gJyQnCi0gICAgICAmJiAoISBtYWNyb19tcmkgfHwgKmxpbmUgIT0gJy4nKSkKLSAgICByZXR1cm4gMDsKLQotICBzID0gbGluZSArIDE7Ci0gIHdoaWxlIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnMpCi0JIHx8ICpzID09ICdfJwotCSB8fCAqcyA9PSAnJCcpCi0gICAgKytzOwotCi0gIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHMgLSBsaW5lICsgMSk7Ci0gIG1lbWNweSAoY29weSwgbGluZSwgcyAtIGxpbmUpOwotICBjb3B5W3MgLSBsaW5lXSA9ICdcMCc7Ci0gIGZvciAoY3MgPSBjb3B5OyAqY3MgIT0gJ1wwJzsgY3MrKykKLSAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpjcykpCi0gICAgICAqY3MgPSB0b2xvd2VyICgqY3MpOwotCi0gIG1hY3JvID0gKG1hY3JvX2VudHJ5ICopIGhhc2hfZmluZCAobWFjcm9faGFzaCwgY29weSk7Ci0KLSAgaWYgKG1hY3JvID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV3JhcCB0aGUgbGluZSB1cCBpbiBhbiBzYi4gICovCi0gIHNiX25ldyAoJmxpbmVfc2IpOwotICB3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnXG4nICYmICpzICE9ICdccicpCi0gICAgc2JfYWRkX2NoYXIgKCZsaW5lX3NiLCAqcysrKTsKLQotICBzYl9uZXcgKGV4cGFuZCk7Ci0gICplcnJvciA9IG1hY3JvX2V4cGFuZCAoMCwgJmxpbmVfc2IsIG1hY3JvLCBleHBhbmQsIGNvbW1lbnRfY2hhcik7Ci0KLSAgc2Jfa2lsbCAoJmxpbmVfc2IpOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWxldGUgYSBtYWNyby4gICovCi0KLXZvaWQKLWRlbGV0ZV9tYWNybyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaGFzaF9kZWxldGUgKG1hY3JvX2hhc2gsIG5hbWUpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBJUlAgYW5kIElSUEMgcHNldWRvLW9wcy4gIFRoZXNlIGFyZSBoYW5kbGVkIGFzIGEKLSAgIGNvbWJpbmVkIG1hY3JvIGRlZmluaXRpb24gYW5kIGV4ZWN1dGlvbi4gIFRoaXMgcmV0dXJucyBOVUxMIG9uCi0gICBzdWNjZXNzLCBvciBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4gICovCi0KLWNvbnN0IGNoYXIgKgotZXhwYW5kX2lycCAoaXJwYywgaWR4LCBpbiwgb3V0LCBnZXRfbGluZSwgY29tbWVudF9jaGFyKQotICAgICBpbnQgaXJwYzsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpOwotICAgICBpbnQgY29tbWVudF9jaGFyOwotewotICBjb25zdCBjaGFyICptbjsKLSAgc2Igc3ViOwotICBmb3JtYWxfZW50cnkgZjsKLSAgc3RydWN0IGhhc2hfY29udHJvbCAqaDsKLSAgY29uc3QgY2hhciAqZXJyOwotCi0gIGlmIChpcnBjKQotICAgIG1uID0gIklSUEMiOwotICBlbHNlCi0gICAgbW4gPSAiSVJQIjsKLQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBzYl9uZXcgKCZzdWIpOwotICBpZiAoISBidWZmZXJfYW5kX25lc3QgKG1uLCAiRU5EUiIsICZzdWIsIGdldF9saW5lKSkKLSAgICByZXR1cm4gXygidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBpcnAgb3IgaXJwYyIpOwotICAKLSAgc2JfbmV3ICgmZi5uYW1lKTsKLSAgc2JfbmV3ICgmZi5kZWYpOwotICBzYl9uZXcgKCZmLmFjdHVhbCk7Ci0KLSAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmZi5uYW1lKTsKLSAgaWYgKGYubmFtZS5sZW4gPT0gMCkKLSAgICByZXR1cm4gXygibWlzc2luZyBtb2RlbCBwYXJhbWV0ZXIiKTsKLQotICBoID0gaGFzaF9uZXcgKCk7Ci0gIGVyciA9IGhhc2hfamFtIChoLCBzYl90ZXJtaW5hdGUgKCZmLm5hbWUpLCAmZik7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICByZXR1cm4gZXJyOwotCi0gIGYuaW5kZXggPSAxOwotICBmLm5leHQgPSBOVUxMOwotCi0gIHNiX3Jlc2V0IChvdXQpOwotCi0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdID09IGNvbW1lbnRfY2hhcikKLSAgICB7Ci0gICAgICAvKiBFeHBhbmQgb25jZSB3aXRoIGEgbnVsbCBzdHJpbmcuICAqLwotICAgICAgZXJyID0gbWFjcm9fZXhwYW5kX2JvZHkgKCZzdWIsIG91dCwgJmYsIGgsIGNvbW1lbnRfY2hhciwgMCk7Ci0gICAgICBpZiAoZXJyICE9IE5VTEwpCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXJwYyAmJiBpbi0+cHRyW2lkeF0gPT0gJyInKQotCSsraWR4OwotICAgICAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdICE9IGNvbW1lbnRfY2hhcikKLQl7Ci0JICBpZiAoIWlycGMpCi0JICAgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmZi5hY3R1YWwsIDEsIDApOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicpCi0JCXsKLQkJICBpbnQgbnh0OwotCi0JCSAgbnh0ID0gc2Jfc2tpcF93aGl0ZSAoaWR4ICsgMSwgaW4pOwotCQkgIGlmIChueHQgPj0gaW4tPmxlbiB8fCBpbi0+cHRyW254dF0gPT0gY29tbWVudF9jaGFyKQotCQkgICAgewotCQkgICAgICBpZHggPSBueHQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgc2JfcmVzZXQgKCZmLmFjdHVhbCk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKCZmLmFjdHVhbCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICArK2lkeDsKLQkgICAgfQotCSAgZXJyID0gbWFjcm9fZXhwYW5kX2JvZHkgKCZzdWIsIG91dCwgJmYsIGgsIGNvbW1lbnRfY2hhciwgMCk7Ci0JICBpZiAoZXJyICE9IE5VTEwpCi0JICAgIHJldHVybiBlcnI7Ci0JICBpZiAoIWlycGMpCi0JICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotCSAgZWxzZQotCSAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQl9Ci0gICAgfQotCi0gIGhhc2hfZGllIChoKTsKLSAgc2Jfa2lsbCAoJnN1Yik7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9nYXMvbWFjcm8uaCBiL2dhcy9tYWNyby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGVlYTRhLi4wMDAwMDAwCi0tLSBhL2dhcy9tYWNyby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogbWFjcm8uaCAtIGhlYWRlciBmaWxlIGZvciBtYWNybyBzdXBwb3J0IGZvciBnYXMgYW5kIGdhc3AKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKLSAgICAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmbmRlZiBNQUNST19ICi0KLSNkZWZpbmUgTUFDUk9fSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzYi5oIgotCi0vKiBXaGV0aGVyIGFueSBtYWNyb3MgaGF2ZSBiZWVuIGRlZmluZWQuICAqLwotCi1leHRlcm4gaW50IG1hY3JvX2RlZmluZWQ7Ci0KLS8qIFRoZSBtYWNybyBuZXN0aW5nIGxldmVsLiAgKi8KLQotZXh0ZXJuIGludCBtYWNyb19uZXN0OwotCi1leHRlcm4gaW50IGJ1ZmZlcl9hbmRfbmVzdAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgc2IgKiwgaW50ICgqKSBQQVJBTVMgKChzYiAqKSkpKTsKLWV4dGVybiB2b2lkIG1hY3JvX2luaXQKLSAgUEFSQU1TICgoaW50IGFsdGVybmF0ZSwgaW50IG1yaSwgaW50IHN0cmlwX2F0LAotCSAgIGludCAoKikgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHNiICosIGludCAqKSkpKTsKLWV4dGVybiB2b2lkIG1hY3JvX21yaV9tb2RlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlZmluZV9tYWNybwotICBQQVJBTVMgKChpbnQgaWR4LCBzYiAqaW4sIHNiICpsYWJlbCwgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKSwKLQkgICBjb25zdCBjaGFyICoqbmFtZXApKTsKLWV4dGVybiBpbnQgY2hlY2tfbWFjcm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzYiAqLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLWV4dGVybiB2b2lkIGRlbGV0ZV9tYWNybyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpleHBhbmRfaXJwCi0gIFBBUkFNUyAoKGludCwgaW50LCBzYiAqLCBzYiAqLCBpbnQgKCopIFBBUkFNUyAoKHNiICopKSwgaW50KSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL21ha2VmaWxlLnZtcyBiL2dhcy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzMwZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jCi0jIG1ha2VmaWxlIGZvciBnYXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcHJvZ2lzLmRlCi0jCi1DQz1nY2MKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1pZmVxICgkKENDKSxnY2MpCi1ERUZTPQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5iZmRdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKQotTEZMQUdTPQotTElCUz0sR05VX0NDX0xJQlJBUlk6bGliZ2NjL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliLEdOVV9DQ19MSUJSQVJZOmNydDAub2JqCi1lbHNlCi1ERUZTPS9kZWZpbmU9KCJ0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuIj0idGFic2l6X2Zsb251bV9wb3dlcnNfb2ZfdGVuIixcCi0iX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyI9Il9iZmRfZ2VuZXJpY19nZXRfd2luX3NlY3Rpb25fY29udCIsXAotIl9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIj0iX2JmZF9lbGZfc2VjX2Zyb21fYmZkX3NlYyIsImNvbnN0PSIpCi1DRkxBR1M9L25vb3B0L25vZGVidWcvaW5jbHVkZT0oW10sWy0uYmZkXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUylcCi0vd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMscHRybWlzbWF0Y2gsdW5kZWZlc2NhcCxsb25nZXh0ZXJuLGR1cHR5cGVzcGVjKQotTEZMQUdTPQotTElCUz0sc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotZW5kaWYKLQotZWxzZQkjIEFSQ0ggbm90IEFMUEhBCi0KLWlmZXEgKCQoQ0MpLGdjYykKLURFRlM9Ci1DRkxBR1M9L2luY2x1ZGU9KFtdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKQotTEZMQUdTPQotTElCUz0sR05VX0NDX0xJQlJBUlk6bGliZ2NjL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliLEdOVV9DQ19MSUJSQVJZOmNydGJlZ2luLm9iaixHTlVfQ0NfTElCUkFSWTpjcnRlbmQub2JqCi0jTElCUz0sZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9saWIsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotZWxzZQotZXJyb3IgREVDQyBpcyBicm9rZW4gb24gVkFYCi1ERUZTPS9kZWZpbmU9KCJ0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuIj0idGFic2l6X2Zsb251bV9wb3dlcnNfb2ZfdGVuIiwiY29uc3Q9IikKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLHB0cm1pc21hdGNoLHVuZGVmZXNjYXAsbG9uZ2V4dGVybixkdXB0eXBlc3BlYykKLUxGTEFHUz0KLUxJQlM9LHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKLWVuZGlmCi1lbmRpZgotCi0KLU9CSlM9dGFyZy1jcHUub2JqLG9iai1mb3JtYXQub2JqLGF0b2YtdGFyZy5vYmosYXBwLm9iaixhcy5vYmosYXRvZi1nZW5lcmljLm9iaixcCi0gIGJpZ251bS1jb3B5Lm9iaixjb25kLm9iaixkZXBlbmQub2JqLGV4cHIub2JqLGZsb251bS1rb25zdC5vYmosZmxvbnVtLWNvcHkub2JqLFwKLSAgZmxvbnVtLW11bHQub2JqLGZyYWdzLm9iaixoYXNoLm9iaixpbnB1dC1maWxlLm9iaixpbnB1dC1zY3J1Yi5vYmosXAotICBsaXRlcmFsLm9iaixtZXNzYWdlcy5vYmosb3V0cHV0LWZpbGUub2JqLHJlYWQub2JqLHN1YnNlZ3Mub2JqLHN5bWJvbHMub2JqLFwKLSAgd3JpdGUub2JqLGxpc3Rpbmcub2JqLGVjb2ZmLm9iaixzdGFicy5vYmosc2Iub2JqLG1hY3JvLm9iaixlaG9wdC5vYmoKLQotR0FTUE9CSlMgPSBnYXNwLm9iaixtYWNyby5vYmosc2Iub2JqLGhhc2gub2JqCi0KLUxJQklCRVJUWSA9IFstLmxpYmliZXJ0eV1saWJpYmVydHkub2xiCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1MSUJCRkQgPSBbLS5iZmRdbGliYmZkLm9sYgotTElCT1BDT0RFUyA9IFstLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGIKLUJGRERFUCA9IFstLmJmZF1iZmQuaAotZWxzZQotTElCQkZEID0KLUxJQk9QQ09ERVMgPQotQkZEREVQID0KLWVuZGlmCi0KLWFsbDogY29uZmlnLnN0YXR1cyAkKEJGRERFUCkgYXMuZXhlIGdhc3AuZXhlCi0KLWFzLmV4ZTogJChPQkpTKSAkKExJQk9QQ09ERVMpICQoTElCQkZEKSAkKExJQklCRVJUWSkKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi0JbGluayQoTEZMQUdTKS9leGU9JEAgJChPQkpTKSwkKExJQk9QQ09ERVMpL2xpYiwkKExJQkJGRCkvbGliLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCi1lbHNlCi0JbGluayQoTEZMQUdTKS9leGU9JEAgJChPQkpTKSwkKExJQklCRVJUWSkvbGliJChMSUJTKQotZW5kaWYKLQotZ2FzcC5leGU6ICQoR0FTUE9CSlMpICQoTElCQkZEKSAkKExJQklCRVJUWSkKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi0JbGluayQoTEZMQUdTKS9leGU9JEAgJChHQVNQT0JKUyksJChMSUJCRkQpL2xpYiwkKExJQklCRVJUWSkvbGliJChMSUJTKQotZWxzZQotCWxpbmskKExGTEFHUykvZXhlPSRAICQoR0FTUE9CSlMpLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCi1lbmRpZgotCi1jb25maWcuc3RhdHVzOgotCSQkIEBjb25maWctZ2FzCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1DUFU9YWxwaGEKLU9CSkZPUk1BVD1ldmF4Ci1GTFRGT1JNQVQ9aWVlZQotZWxzZQotQ1BVPXZheAotT0JKRk9STUFUPXZtcwotRkxURk9STUFUPXZheAotZW5kaWYKLQotdGFyZy1jcHUuYzogWy5jb25maWdddGMtJChDUFUpLmMKLQljb3B5ICQ8ICRACi10YXJnLWNwdS5oOiBbLmNvbmZpZ110Yy0kKENQVSkuaAotCWNvcHkgJDwgJEAKLXRhcmctZW52Lmg6IFsuY29uZmlnXXRlLWdlbmVyaWMuaAotCWNvcHkgJDwgJEAKLW9iai1mb3JtYXQuaDogWy5jb25maWddb2JqLSQoT0JKRk9STUFUKS5oCi0JY29weSAkPCAkQAotb2JqLWZvcm1hdC5jOiBbLmNvbmZpZ11vYmotJChPQkpGT1JNQVQpLmMKLQljb3B5ICQ8ICRACi1hdG9mLXRhcmcuYzogWy5jb25maWddYXRvZi0kKEZMVEZPUk1BVCkuYwotCWNvcHkgJDwgJEAKLQotdGFyZy1jcHUub2JqOiB0YXJnLWNwdS5jIHRhcmctY3B1LmggWy5jb25maWddYXRvZi12YXguYwotCi1bLS5iZmRdYmZkLmg6Ci0JJChDRCkgWy0uYmZkXQotCWdtYWtlIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCi0JJChDRCkgWy0uZ2FzXQotCi1pbnN0YWxsOiBhcy5leGUgZ2FzcC5leGUKLQkkKENQKSAkXiBHTlVfUk9PVFw6W0JJTl0KLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSAqLmV4ZTsKLQkkKFJNKSBhdG9mLXRhcmcuYzsKLQkkKFJNKSBvYmotZm9ybWF0LmM7Ci0JJChSTSkgb2JqLWZvcm1hdC5oOwotCSQoUk0pIHRhcmctZW52Lmg7Ci0JJChSTSkgdGFyZy1jcHUuaDsKLQkkKFJNKSB0YXJnLWNwdS5jOwotCSQoUk0pIGNvbmZpZy5zdGF0dXM7CmRpZmYgLS1naXQgYS9nYXMvbWVzc2FnZXMuYyBiL2dhcy9tZXNzYWdlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGI3YWQwLi4wMDAwMDAwCi0tLSBhL2dhcy9tZXNzYWdlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qIG1lc3NhZ2VzLmMgLSBlcnJvciByZXBvcnRlciAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfRVJSTk9fSAotI2luY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9TVERBUkcKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX1ZBUkFSR1MKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChVU0VfU1REQVJHKSAmJiAhZGVmaW5lZCAoVVNFX1ZBUkFSR1MpCi0vKiBSb2xsIG91ciBvd24uICAqLwotI2RlZmluZSB2YV9hbGlzdCBSRVNUCi0jZGVmaW5lIHZhX2RjbAotdHlwZWRlZiBpbnQgKiB2YV9saXN0OwotI2RlZmluZSB2YV9zdGFydChBUkdTKQlBUkdTID0gJlJFU1QKLSNkZWZpbmUgdmFfZW5kKEFSR1MpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgaWRlbnRpZnkgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBhc19zaG93X3doZXJlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGFzX3dhcm5faW50ZXJuYWwgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgYXNfYmFkX2ludGVybmFsIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBjaGFyICopKTsKLQotLyoKLSAqIERlc3BpdGUgdGhlIHJlc3Qgb2YgdGhlIGNvbW1lbnRzIGluIHRoaXMgZmlsZSwgKEZJWE1FLVNPT04pLAotICogaGVyZSBpcyB0aGUgY3VycmVudCBzY2hlbWUgZm9yIGVycm9yIG1lc3NhZ2VzIGV0YzoKLSAqCi0gKiBhc19mYXRhbCgpIGlzIHVzZWQgd2hlbiBnYXMgaXMgcXVpdGUgY29uZnVzZWQgYW5kCi0gKiBjb250aW51aW5nIHRoZSBhc3NlbWJseSBpcyBwb2ludGxlc3MuICBJbiB0aGlzIGNhc2Ugd2UKLSAqIGV4aXQgaW1tZWRpYXRlbHkgd2l0aCBlcnJvciBzdGF0dXMuCi0gKgotICogYXNfYmFkKCkgaXMgdXNlZCB0byBtYXJrIGVycm9ycyB0aGF0IHJlc3VsdCBpbiB3aGF0IHdlCi0gKiBwcmVzdW1lIHRvIGJlIGEgdXNlbGVzcyBvYmplY3QgZmlsZS4gIFNheSwgd2UgaWdub3JlZAotICogc29tZXRoaW5nIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIHZpdGFsLiAgSWYgd2Ugc2VlIGFueSBvZgotICogdGhlc2UsIGFzc2VtYmx5IHdpbGwgY29udGludWUgdG8gdGhlIGVuZCBvZiB0aGUgc291cmNlLAotICogbm8gb2JqZWN0IGZpbGUgd2lsbCBiZSBwcm9kdWNlZCwgYW5kIHdlIHdpbGwgdGVybWluYXRlCi0gKiB3aXRoIGVycm9yIHN0YXR1cy4gIFRoZSBuZXcgb3B0aW9uLCAtWiwgdGVsbHMgdXMgdG8KLSAqIHByb2R1Y2UgYW4gb2JqZWN0IGZpbGUgYW55d2F5IGJ1dCB3ZSBzdGlsbCBleGl0IHdpdGgKLSAqIGVycm9yIHN0YXR1cy4gIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB5b3UgZG9uJ3Qgd2FudAotICogdGhpcyBvYmplY3QgZmlsZSBidXQgd2UgY291bGQgYmUgd3JvbmcuCi0gKgotICogYXNfd2FybigpIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIGFuIGVycm9yIGZyb20gd2hpY2ggd2UKLSAqIGhhdmUgYSBwbGF1c2libGUgZXJyb3IgcmVjb3ZlcnkuICBlZywgbWFza2luZyB0aGUgdG9wCi0gKiBiaXRzIG9mIGEgY29uc3RhbnQgdGhhdCBpcyBsb25nZXIgdGhhbiB3aWxsIGZpdCBpbiB0aGUKLSAqIGRlc3RpbmF0aW9uLiAgSW4gdGhpcyBjYXNlIHdlIHdpbGwgY29udGludWUgdG8gYXNzZW1ibGUKLSAqIHRoZSBzb3VyY2UsIGFsdGhvdWdoIHdlIG1heSBoYXZlIG1hZGUgYSBiYWQgYXNzdW1wdGlvbiwKLSAqIGFuZCB3ZSB3aWxsIHByb2R1Y2UgYW4gb2JqZWN0IGZpbGUgYW5kIHJldHVybiBub3JtYWwgZXhpdAotICogc3RhdHVzIChpZSwgbm8gZXJyb3IpLiAgVGhlIG5ldyBvcHRpb24gLVggdGVsbHMgdXMgdG8KLSAqIHRyZWF0IGFsbCBhc193YXJuKCkgZXJyb3JzIGFzIGFzX2JhZCgpIGVycm9ycy4gIFRoYXQgaXMsCi0gKiBubyBvYmplY3QgZmlsZSB3aWxsIGJlIHByb2R1Y2VkIGFuZCB3ZSB3aWxsIGV4aXQgd2l0aAotICogZXJyb3Igc3RhdHVzLiAgVGhlIGlkZWEgaGVyZSBpcyB0aGF0IHdlIGRvbid0IGtpbGwgYW4KLSAqIGVudGlyZSBtYWtlIGJlY2F1c2Ugb2YgYW4gZXJyb3IgdGhhdCB3ZSBrbmV3IGhvdyB0bwotICogY29ycmVjdC4gIE9uIHRoZSBvdGhlciBoYW5kLCBzb21ldGltZXMgeW91IG1pZ2h0IHdhbnQgdG8KLSAqIHN0b3AgdGhlIG1ha2UgYXQgdGhlc2UgcG9pbnRzLgotICoKLSAqIGFzX3Rza3RzaygpIGlzIHVzZWQgd2hlbiB3ZSBzZWUgYSBtaW5vciBlcnJvciBmb3Igd2hpY2gKLSAqIG91ciBlcnJvciByZWNvdmVyeSBhY3Rpb24gaXMgYWxtb3N0IGNlcnRhaW5seSBjb3JyZWN0LgotICogSW4gdGhpcyBjYXNlLCB3ZSBwcmludCBhIG1lc3NhZ2UgYW5kIHRoZW4gYXNzZW1ibHkKLSAqIGNvbnRpbnVlcyBhcyB0aG91Z2ggbm8gZXJyb3Igb2NjdXJyZWQuCi0gKi8KLQotc3RhdGljIHZvaWQKLWlkZW50aWZ5IChmaWxlKQotICAgICBjaGFyICpmaWxlOwotewotICBzdGF0aWMgaW50IGlkZW50aWZpZWQ7Ci0gIGlmIChpZGVudGlmaWVkKQotICAgIHJldHVybjsKLSAgaWRlbnRpZmllZCsrOwotCi0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgeDsKLSAgICAgIGFzX3doZXJlICgmZmlsZSwgJngpOwotICAgIH0KLQotICBpZiAoZmlsZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgZmlsZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiQXNzZW1ibGVyIG1lc3NhZ2VzOlxuIikpOwotfQotCi1zdGF0aWMgaW50IHdhcm5pbmdfY291bnQ7CS8qIENvdW50IG9mIG51bWJlciBvZiB3YXJuaW5ncyBpc3N1ZWQgKi8KLQotaW50IAotaGFkX3dhcm5pbmdzICgpCi17Ci0gIHJldHVybiAod2FybmluZ19jb3VudCk7Ci19Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgaGl0IGEgJ2JhZCBlcnJvcicsIGFuZCBzaG91bGQgbm90IHdyaXRlIGFuIG9iaiBmaWxlLAotICAgYW5kIGV4aXQgd2l0aCBhIG5vbnplcm8gZXJyb3IgY29kZSAqLwotCi1zdGF0aWMgaW50IGVycm9yX2NvdW50OwotCi1pbnQgCi1oYWRfZXJyb3JzICgpCi17Ci0gIHJldHVybiAoZXJyb3JfY291bnQpOwotfQotCi0KLS8qIFByaW50IHRoZSBjdXJyZW50IGxvY2F0aW9uIHRvIHN0ZGVyci4gICovCi0KLXN0YXRpYyB2b2lkCi1hc19zaG93X3doZXJlICgpCi17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotICBpZGVudGlmeSAoZmlsZSk7Ci0gIGlmIChmaWxlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiV1OiAiLCBmaWxlLCBsaW5lKTsKLX0KLQotLyoKLSAqCQkJYSBzIF8gcCBlIHIgciBvIHIKLSAqCi0gKiBMaWtlIHBlcnJvcigzKSwgYnV0IHdpdGggbW9yZSBpbmZvLgotICovCi0KLXZvaWQgCi1hc19wZXJyb3IgKGdyaXBlLCBmaWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZ3JpcGU7CQkvKiBVbnB1bmN0dWF0ZWQgZXJyb3IgdGhlbWUuICovCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBjb25zdCBjaGFyICplcnJ0eHQ7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBncmlwZSwgZmlsZW5hbWUpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZXJydHh0ID0gYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSk7Ci0jZWxzZQotICBlcnJ0eHQgPSB4c3RyZXJyb3IgKGVycm5vKTsKLSNlbmRpZgotICBmcHJpbnRmIChzdGRlcnIsICI6ICVzXG4iLCBlcnJ0eHQpOwotICBlcnJubyA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotI2VuZGlmCi19Ci0KLS8qCi0gKgkJCWEgcyBfIHQgcyBrIHQgcyBrICgpCi0gKgotICogU2VuZCB0byBzdGRlcnIgYSBzdHJpbmcgYXMgYSB3YXJuaW5nLCBhbmQgbG9jYXRlIHdhcm5pbmcKLSAqIGluIGlucHV0IGZpbGUocykuCi0gKiBQbGVhc2Ugb25seSB1c2UgdGhpcyBmb3Igd2hlbiB3ZSBoYXZlIHNvbWUgcmVjb3ZlcnkgYWN0aW9uLgotICogUGxlYXNlIGV4cGxhaW4gaW4gc3RyaW5nICh3aGljaCBtYXkgaGF2ZSAnXG4ncykgd2hhdCByZWNvdmVyeSB3YXMgZG9uZS4KLSAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX3Rza3RzayAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0JCQkJLyogYXNfdHNrdHNrKCkgKi8KLSNlbHNlCi12b2lkIAotYXNfdHNrdHNrIChmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0JCQkJLyogYXNfdHNrdHNrKCkgKi8KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qIFRoZSBjb21tb24gcG9ydGlvbiBvZiBhc193YXJuIGFuZCBhc193YXJuX3doZXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzX3dhcm5faW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcikKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgKyt3YXJuaW5nX2NvdW50OwotCi0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgaWRlbnRpZnkgKGZpbGUpOwotICBpZiAoZmlsZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczoldTogIiwgZmlsZSwgbGluZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiV2FybmluZzogIikpOwotICBmcHV0cyAoYnVmZmVyLCBzdGRlcnIpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSNpZm5kZWYgTk9fTElTVElORwotICBsaXN0aW5nX3dhcm5pbmcgKGJ1ZmZlcik7Ci0jZW5kaWYKLX0KLQotLyoKLSAqCQkJYSBzIF8gdyBhIHIgbiAoKQotICoKLSAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgd2FybmluZywgYW5kIGxvY2F0ZSB3YXJuaW5nCi0gKiBpbiBpbnB1dCBmaWxlKHMpLgotICogUGxlYXNlIG9ubHkgdXNlIHRoaXMgZm9yIHdoZW4gd2UgaGF2ZSBzb21lIHJlY292ZXJ5IGFjdGlvbi4KLSAqIFBsZWFzZSBleHBsYWluIGluIHN0cmluZyAod2hpY2ggbWF5IGhhdmUgJ1xuJ3MpIHdoYXQgcmVjb3Zlcnkgd2FzIGRvbmUuCi0gKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc193YXJuIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIGlmICghZmxhZ19ub193YXJuaW5ncykKLSAgICB7Ci0gICAgICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoKGNoYXIgKikgTlVMTCwgMCwgYnVmZmVyKTsKLSAgICB9Ci19CQkJCS8qIGFzX3dhcm4oKSAqLwotI2Vsc2UKLS8qVkFSQVJHUzEgKi8KLXZvaWQgCi1hc193YXJuIChmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIGlmICghZmxhZ19ub193YXJuaW5ncykKLSAgICB7Ci0gICAgICB2YV9zdGFydCAoYXJncyk7Ci0gICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIGFzX3dhcm5faW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Ci0gICAgfQotfQkJCQkvKiBhc193YXJuKCkgKi8KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qIGFzX3dhcm5fd2hlcmUsIGxpa2UgYXNfYmFkIGJ1dCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKLSAgIHBhc3NlZCBpbi4gIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgdG8gcmVwZWF0IHRoZSBmdW5jdGlvbiBpbiBvcmRlcgotICAgdG8gaGFuZGxlIHRoZSB2YXJhcmdzIGNvcnJlY3RseSBhbmQgcG9ydGFibHkuICAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX3dhcm5fd2hlcmUgKGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIGlmICghZmxhZ19ub193YXJuaW5ncykKLSAgICB7Ci0gICAgICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKLSAgICB9Ci19CQkJCS8qIGFzX3dhcm4oKSAqLwotI2Vsc2UKLS8qVkFSQVJHUzEgKi8KLXZvaWQgCi1hc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCi0gICAgewotICAgICAgdmFfc3RhcnQgKGFyZ3MpOwotICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICBhc193YXJuX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOwotICAgIH0KLX0JCQkJLyogYXNfd2FybigpICovCi0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKiBUaGUgY29tbW9uIHBvcnRpb24gb2YgYXNfYmFkIGFuZCBhc19iYWRfd2hlcmUuICAqLwotCi1zdGF0aWMgdm9pZAotYXNfYmFkX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gICsrZXJyb3JfY291bnQ7Ci0KLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICBhc193aGVyZSAoJmZpbGUsICZsaW5lKTsKLQotICBpZGVudGlmeSAoZmlsZSk7Ci0gIGlmIChmaWxlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiV1OiAiLCBmaWxlLCBsaW5lKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJFcnJvcjogIikpOwotICBmcHV0cyAoYnVmZmVyLCBzdGRlcnIpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSNpZm5kZWYgTk9fTElTVElORwotICBsaXN0aW5nX2Vycm9yIChidWZmZXIpOwotI2VuZGlmCi19Ci0KLS8qCi0gKgkJCWEgcyBfIGIgYSBkICgpCi0gKgotICogU2VuZCB0byBzdGRlcnIgYSBzdHJpbmcgYXMgYSB3YXJuaW5nLCBhbmQgbG9jYXRlIHdhcm5pbmcgaW4gaW5wdXQgZmlsZShzKS4KLSAqIFBsZWFzZSB1cyB3aGVuIHRoZXJlIGlzIG5vIHJlY292ZXJ5LCBidXQgd2Ugd2FudCB0byBjb250aW51ZSBwcm9jZXNzaW5nCi0gKiBidXQgbm90IHByb2R1Y2UgYW4gb2JqZWN0IGZpbGUuCi0gKiBQbGVhc2UgZXhwbGFpbiBpbiBzdHJpbmcgKHdoaWNoIG1heSBoYXZlICdcbidzKSB3aGF0IHJlY292ZXJ5IHdhcyBkb25lLgotICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfYmFkIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGFzX2JhZF9pbnRlcm5hbCAoKGNoYXIgKikgTlVMTCwgMCwgYnVmZmVyKTsKLX0KLQotI2Vsc2UKLS8qVkFSQVJHUzEgKi8KLXZvaWQgCi1hc19iYWQgKGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGFzX2JhZF9pbnRlcm5hbCAoKGNoYXIgKikgTlVMTCwgMCwgYnVmZmVyKTsKLX0KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qIGFzX2JhZF93aGVyZSwgbGlrZSBhc19iYWQgYnV0IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZQotICAgcGFzc2VkIGluLiAgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byByZXBlYXQgdGhlIGZ1bmN0aW9uIGluIG9yZGVyCi0gICB0byBoYW5kbGUgdGhlIHZhcmFyZ3MgY29ycmVjdGx5IGFuZCBwb3J0YWJseS4gICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfYmFkX3doZXJlIChjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICBhc19iYWRfaW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7Ci19Ci0KLSNlbHNlCi0vKlZBUkFSR1MxICovCi12b2lkIAotYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICB2YV9zdGFydCAoYXJncyk7Ci0gIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgYXNfYmFkX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOwotfQotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyoKLSAqCQkJYSBzIF8gZiBhIHQgYSBsICgpCi0gKgotICogU2VuZCB0byBzdGRlcnIgYSBzdHJpbmcgYXMgYSBmYXRhbCBtZXNzYWdlLCBhbmQgcHJpbnQgbG9jYXRpb24gb2YgZXJyb3IgaW4KLSAqIGlucHV0IGZpbGUocykuCi0gKiBQbGVhc2Ugb25seSB1c2UgdGhpcyBmb3Igd2hlbiB3ZSBET04nVCBoYXZlIHNvbWUgcmVjb3ZlcnkgYWN0aW9uLgotICogSXQgeGV4aXQoKXMgd2l0aCBhIHdhcm5pbmcgc3RhdHVzLgotICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfZmF0YWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBhc19zaG93X3doZXJlICgpOwotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJGYXRhbCBlcnJvcjogIikpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19CQkJCS8qIGFzX2ZhdGFsKCkgKi8KLSNlbHNlCi0vKlZBUkFSR1MxKi8KLXZvaWQgCi1hc19mYXRhbCAoZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJGYXRhbCBlcnJvcjogIikpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19CQkJCS8qIGFzX2ZhdGFsKCkgKi8KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qCi0gKiBhc19hc3NlcnQ6IEluZGljYXRlIGFzc2VydGlvbiBmYWlsdXJlLgotICogQXJndW1lbnRzOiBGaWxlbmFtZSwgbGluZSBudW1iZXIsIG9wdGlvbmFsIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLQotdm9pZAotYXNfYXNzZXJ0IChmaWxlLCBsaW5lLCBmbikKLSAgICAgY29uc3QgY2hhciAqZmlsZSwgKmZuOwotICAgICBpbnQgbGluZTsKLXsKLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJJbnRlcm5hbCBlcnJvciFcbiIpKTsKLSAgaWYgKGZuKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiQXNzZXJ0aW9uIGZhaWx1cmUgaW4gJXMgYXQgJXMgbGluZSAlZC5cbiIpLAotCSAgICAgZm4sIGZpbGUsIGxpbmUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJBc3NlcnRpb24gZmFpbHVyZSBhdCAlcyBsaW5lICVkLlxuIiksIGZpbGUsIGxpbmUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIlBsZWFzZSByZXBvcnQgdGhpcyBidWcuXG4iKSk7Ci0gIHhleGl0IChFWElUX0ZBSUxVUkUpOwotfQotCi0vKiBhc19hYm9ydDogUHJpbnQgYSBmcmllbmRseSBtZXNzYWdlIHNheWluZyBob3cgdG90YWxseSBob3NlZCB3ZSBhcmUsCi0gICBhbmQgZXhpdCB3aXRob3V0IHByb2R1Y2luZyBhIGNvcmUgZmlsZS4gICovCi12b2lkCi1hc19hYm9ydCAoZmlsZSwgbGluZSwgZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKLSAgICAgaW50IGxpbmU7Ci17Ci0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIGlmIChmbikKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkIGluICVzXG4iKSwKLQkgICAgIGZpbGUsIGxpbmUsIGZuKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWRcbiIpLAotCSAgICAgZmlsZSwgbGluZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIpKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19Ci0KLS8qIFN1cHBvcnQgcm91dGluZXMuICAqLwotCi12b2lkCi1mcHJpbnRfdmFsdWUgKGZpbGUsIHZhbCkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgdmFsdWVUIHZhbDsKLXsKLSAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGxvbmcpKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICIlbGQiLCAobG9uZykgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAoYmZkX3ZtYSkpCi0gICAgewotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHZhbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gIGFib3J0ICgpOwotfQotCi12b2lkCi1zcHJpbnRfdmFsdWUgKGJ1ZiwgdmFsKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci17Ci0gIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChsb25nKSkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChidWYsICIlbGQiLCAobG9uZykgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAoYmZkX3ZtYSkpCi0gICAgewotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiwgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIGVuZCBvZiBtZXNzYWdlcy5jICovCmRpZmYgLS1naXQgYS9nYXMvbXB3LWNvbmZpZy5pbiBiL2dhcy9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI5YjFkLi4wMDAwMDAwCi0tLSBhL2dhcy9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgR0FTLgotCi1TZXQgdGFyZ2V0X2FyY2ggYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy0uKi0uKi8vJ2AKLQotSWYgInt0YXJnZXRfYXJjaH0iID1+IC9wb3dlcnBjLwotCVNldCBzaG9ydF9hcmNoX25hbWUgInBwYyIKLQlTZXQgdGFyZ2V0X2NwdSAicG93ZXJwYyIKLUVsc2UKLQlTZXQgc2hvcnRfYXJjaF9uYW1lICJ7dGFyZ2V0X2FyY2h9IgotRW5kIElmCi0KLSMgVGhlIGZvbGxvd2luZyB3b3JrcyBmb3IgbWFueSBjb25maWd1cmF0aW9ucywgdGhvdWdoIG5vdCBhbGwuCi0KLVNldCBvYmpfZm9ybWF0IGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8uKi0uKi0vLydgCi1TZXQgdGFyZ2V0X29zIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8uKi0uKi0vLydgCi0KLVNldCBiZmRfZ2FzIG5vCi0KLVNldCBUREVGSU5FUyAiIgotCi1TZXQgRVhUUkFfT0JKRUNUUyAiIgotCi0jIERlZmF1bHQgZW11bGF0aW9uLgotCi1TZXQgZW0gZ2VuZXJpYwotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KLQlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKLQlTZXQgVERFRklORVMgJy1kIE02OEtDT0ZGJwotCVNldCBFWFRSQV9PQkpFQ1RTICcie299Im02OGstcGFyc2UuYy5vJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLwotCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgotCVNldCBiZmRfZ2FzIHllcwotCVNldCBlbSBtYWNvcwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9pMzg2LVxPcHRpb24teC1nbzMyLwotCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgotCVNldCBUREVGSU5FUyAnLWQgSTM4NkNPRkYnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL202OGstXE9wdGlvbi14LWNvZmYvCi0JU2V0IFRERUZJTkVTICctZCBNNjhLQ09GRicKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1pZHQtZWNvZmYvCi0JU2V0IGJmZF9nYXMgeWVzCi0JU2V0IFRERUZJTkVTICctZCBUQVJHRVRfQllURVNfQklHX0VORElBTj0xJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCi0JIyBBc3N1bWUgb3RoZXIgT1NlcyBldGMgdXNlIEVMRgotCVNldCBvYmpfZm9ybWF0ICJlbGYiCi0JU2V0IGJmZF9nYXMgeWVzCi0JU2V0IFRERUZJTkVTICctZCBUQVJHRVRfQllURVNfQklHX0VORElBTj0xJwotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImJmZDplbGYtYmZkLmggJ2JmZC9lbGYtYmZkLmgnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3NoLVxPcHRpb24teC1obXMvCi0JU2V0IG9ial9mb3JtYXQgImNvZmYiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0ib3Bjb2RlczpzaC1vcGMuaCAnb3Bjb2Rlcy9zaC1vcGMuaCcKLUVuZCBJZgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzp0Yy17c2hvcnRfYXJjaF9uYW1lfS5jIHRhcmctY3B1LmMKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnRjLXtzaG9ydF9hcmNoX25hbWV9LmggdGFyZy1jcHUuaAotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzpvYmote29ial9mb3JtYXR9LmMgb2JqLWZvcm1hdC5jCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzpvYmote29ial9mb3JtYXR9Lmggb2JqLWZvcm1hdC5oCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnRlLXtlbX0uaCB0YXJnLWVudi5oCi0KLSMgU3BlY2lhbCBjYXNlcyBmb3IgZmxvYXQgaGFuZGxpbmcuCi0KLUlmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvbnMzMmsvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi1uczMyay5jIGF0b2YtdGFyZy5jCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvdGFob2UvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi10YWhvZS5jIGF0b2YtdGFyZy5jCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvdmF4LwotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtdmF4LmMgYXRvZi10YXJnLmMKLUVsc2UKLQkjIFVzZSBJRUVFIGJ5IGRlZmF1bHQuCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi1pZWVlLmMgYXRvZi10YXJnLmMKLUVuZCBJZgotCi1FY2hvICcjIEZyb20gbXB3LWNvbmZpZy5pbicgICAgIAkJID4gIntvfSJtay50bXAKLUVjaG8gIlRERUZJTkVTID0gIiB7VERFRklORVN9CQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkVYVFJBX09CSkVDVFMgPSAiIHtFWFRSQV9PQkpFQ1RTfQkJPj4gIntvfSJtay50bXAKLSMgKFdlIHVzZSB0aGUgLW4gb3B0aW9uIGhlcmUgc28gYXMgbm90IHRvIGdldCBleHRyYSBzcGFjZXMgaW5zZXJ0ZWQpCi1FY2hvIC1uICdUQVJHX0NQVV9ERVAgPSB7VEFSR19DUFVfREVQXycJCT4+ICJ7b30ibWsudG1wCi1FY2hvIC1uIHtzaG9ydF9hcmNoX25hbWV9CQkJPj4gIntvfSJtay50bXAKLUVjaG8gLW4gJ30nCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmYuICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJyA+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX0NQVSAgICAgICAiJyAgICAgICAJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAie3RhcmdldF9jcHV9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfT1MgICAgICAgIicgICAgICAgCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gInt0YXJnZXRfb3N9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfQUxJQVMgICAgICAgIicgICAgICAgCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gInt0YXJnZXRfYWxpYXN9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMICAgICAgICInICAgICAJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAie3RhcmdldF9jYW5vbmljYWx9IgkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQk+PiAie299ImNvbmYubmV3Ci1JZiAie2JmZF9nYXN9IiA9fiAveWVzLwotCUVjaG8gIiNkZWZpbmUgQkZEX0FTU0VNQkxFUiIJCT4+ICJ7b30iY29uZi5uZXcKLUVsc2UKLQlFY2hvICIjZGVmaW5lIE1BTllfU0VHTUVOVFMiCQk+PiAie299ImNvbmYubmV3Ci1FbmQgSWYKLUVjaG8gJyNkZWZpbmUgQ1JfRU9MJwkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICcjZGVmaW5lIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QJwkJPj4gIntvfSJjb25mLm5ldwotRWNobyAnI2RlZmluZSBMT1NJTkdfQ09NUElMRVInCQkJPj4gIntvfSJjb25mLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25mLm5ldyAie299ImNvbmYKLQotc2VkIC1lICJzL0BzcmNkaXJAL3tzcmNkaXJ9LyIgIntzcmNkaXJ9ImdkYmluaXQuaW4gPiAie299Il9nZGJpbml0CmRpZmYgLS1naXQgYS9nYXMvbXB3LW1ha2Uuc2VkIGIvZ2FzL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmMTJhNS4uMDAwMDAwMAotLS0gYS9nYXMvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRoYXQgZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBHQVMgVW5peCBNYWtlZmlsZSB0byBNUFcgc3ludGF4LgotCi0vXiMgQHRhcmdldF9mcmFnQC9hXAotXAotSERFRklORVMgPSBcCi1MT0NBTF9MT0FETElCRVMgPSBcCi0KLS9ec3Jjcm9vdCA9IC9zL14vIy8KLS9edGFyZ2V0X2FsaWFzID0gL3MvXi8jLwotCi0vSU5DTFVERVMvcy8taSAie3NyY2Rpcn0iOlwoW2Etel0qXCkvLWkgInt0b3BzcmNkaXJ9IlwxLwotL0lOQ0xVREVTL3MvLWkgIntzcmNkaXJ9IlwuXC4vLWkgInt0b3BzcmNkaXJ9Ii8KLQotL15JTkNMVURFUyA9IC4qJC9zLyQvIC1pICJ7dG9wc3JjZGlyfSJpbmNsdWRlOm1wdzogLWkgOjpleHRyYS1pbmNsdWRlOi8KLQotLyQoVEFSR19DUFVfREVQX0B0YXJnZXRfY3B1X3R5cGVAKS9zLyQoVEFSR19DUFVfREVQX0B0YXJnZXRfY3B1X3R5cGVAKS97VEFSR19DUFVfREVQfS8KLQotL0BPUENPREVTX0xJQkAvcy9AT1BDT0RFU19MSUJALzo6b3Bjb2RlczpsaWJvcGNvZGVzLm8vCi0vQEJGRExJQkAvcy9AQkZETElCQC86OmJmZDpsaWJiZmQuby8KLQotIyBQb2ludCBhdCB0aGUgbGlicmFyaWVzIGRpcmVjdGx5LgotL0BPUENPREVTX0RFUEAvcy9AT1BDT0RFU19ERVBALzo6b3Bjb2RlczpsaWJvcGNvZGVzLm8vCi0vQEJGRERFUEAvcy9AQkZEREVQQC86OmJmZDpsaWJiZmQuby8KLQotIyBEb24ndCBuZWVkIHRoaXMuCi0vQEhMREZMQUdTQC9zL0BITERGTEFHU0AvLwotCi0vZXh0cmFfb2JqZWN0c0Avcy9leHRyYV9vYmplY3RzQC97RVhUUkFfT0JKRUNUU30vCi0KLS9MT0FETElCRVMvcy97TE9BRExJQkVTfS97RVhUUkFMSUJTfS8KLQotL0BBTExfT0JKX0RFUFNAL3MvQEFMTF9PQkpfREVQU0AvOjpiZmQ6YmZkLmgvCi0KLSMgVGhpcyBjYXVzZXMgcHJvYmxlbXMgLSBub3Qgc3VyZSB3aHkuCi0vXnRhZ3MgVEFHUy8sL2V0YWdzIC9kCi0KLS9ebWFrZS1nYXMuY29tL3MvXi8jLwotCi0vdHJ1ZS9zLyA7IEB0cnVlJC8vCi0KLSMgUmVtb3ZlIHJlZmVyZW5jZXMgdG8gY29uZi5pbiwgd2UgZG9uJ3QgbmVlZCB0aGVtLgotL2NvbmZcLmluL3MvY29uZlwuaW4vL2cKLQotIyBVc2UgX2dkYmluaXQgZXZlcnl3aGVyZSBpbnN0ZWFkIG9mIC5nZGJpbml0LgotL2dkYmluaXQvcy9cLmdkYmluaXQvX2dkYmluaXQvZwotCi0vYXRvZi10YXJnL3MvIntzfSJhdG9mLXRhcmdcLmMvIntvfSJhdG9mLXRhcmcuYy9nCi0vY29uZmlnL3MvIntzfSJjb25maWdcLmgvIntvfSJjb25maWcuaC9nCi0vY29uZmlnL3MvXmNvbmZpZ1wuaC8ie299ImNvbmZpZy5oLwotL29iai1mb3JtYXQvcy8ie3N9Im9iai1mb3JtYXRcLmMvIntvfSJvYmotZm9ybWF0LmMvZwotL29iai1mb3JtYXQvcy8ie3N9Im9iai1mb3JtYXRcLmgvIntvfSJvYmotZm9ybWF0LmgvZwotL3RhcmctY3B1L3MvIntzfSJ0YXJnLWNwdVwuYy8ie299InRhcmctY3B1LmMvZwotL3RhcmctY3B1L3MvIntzfSJ0YXJnLWNwdVwuaC8ie299InRhcmctY3B1LmgvZwotL3RhcmctZW52L3MvIntzfSJ0YXJnLWVudlwuaC8ie299InRhcmctZW52LmgvZwotCi0vbTY4ay1wYXJzZS5jL3MvIntzfSJtNjhrLXBhcnNlXC5jLyJ7b30ibTY4ay1wYXJzZS5jL2cKLS9tNjhrLXBhcnNlLmMvcy9ebTY4ay1wYXJzZVwuYy8ie299Im02OGstcGFyc2UuYy8KLQotIyBXaGFjayBvdXQgdGhlIGNvbmZpZy5oIGRlcGVuZGVuY3ksIGl0IG9ubHkgY2F1c2VzIGV4Y2VzcyByZWJ1aWxkcy4KLS97T0JKU30vcy97T0JKU30gXFxPcHRpb24tZiAie299ImNvbmZpZy5oL3tPQkpTfSBcXE9wdGlvbi1mLwotL2dhc3AuYy9zL2dhc3BcLmMgIntvfSJjb25maWcuaC9nYXNwLmMvCi0KLSMgQUxMX0NGTEFHUyBpbmNsdWRlcyBUREVGSU5FUywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZSBhdCBsaW5rIHRpbWUuCi0vQ0NfTEQvcy9BTExfQ0ZMQUdTL0NGTEFHUy9nCi0KLSMgVGhlIHJlc291cmNlIGZpbGUgaXMgY2FsbGVkIG1hYy1hcy5yLgotL2FzLm5ldy5yL3MvYXNcLm5ld1wuci9tYWMtYXMuci8KLS9nYXNwLm5ldy5yL3MvZ2FzcFwubmV3XC5yL21hYy1hcy5yLwotCi0jIC4uLmFuZCB0aGUgUFJPR19OQU1FIGRvZXNuJ3QgaGF2ZSBhIC5uZXcgaW4gaXQuCi0vUFJPR19OQU1FL3MvUFJPR19OQU1FPSciJ2FzLm5ldyciJy9QUk9HX05BTUU9JyInYXMnIicvCi0vUFJPR19OQU1FL3MvUFJPR19OQU1FPSciJ2dhc3AubmV3JyInL1BST0dfTkFNRT0nIidnYXNwJyInLwotCi0jIFdoYWNrIG91dCByZWN1cnNpdmUgbWFrZXMsIHRoZXkgd29uJ3Qgd29yay4KLS9eWyAJXVsgCV0qc3Jjcm9vdD0vLC9eWyAJXVsgCV0qKGNkIC9kCi0KLSMgV29yayBhcm91bmQgcXVvdGluZyBwcm9ibGVtcyBieSB1c2luZyBtdWx0aXBsZSBlY2hvIGNvbW1hbmRzLgotLycjZGVmaW5lIEdBU19WRVJTSU9OICJ7VkVSU0lPTn0iJy9jXAotCUVjaG8gLW4gJyNkZWZpbmUgR0FTX1ZFUlNJT04gIicgPj4gIntvfSJjb25maWcubmV3XAotCUVjaG8gLW4gIntWRVJTSU9OfSIgPj4gIntvfSJjb25maWcubmV3XAotCUVjaG8gLW4gJyInID4+ICJ7b30iY29uZmlnLm5ldwotCi0jIEFkZCBhICJzdGFtcHMiIHRhcmdldC4KLSRhXAotc3RhbXBzIFxcT3B0aW9uLWYgY29uZmlnLXN0YW1wXAotCi0vXmluc3RhbGwgXFxPcHRpb24tZi8sL14kL2NcCi1pbnN0YWxsIFxcT3B0aW9uLWYgYWxsIGluc3RhbGwtb25seVwKLVwKLWluc3RhbGwtb25seSBcXE9wdGlvbi1mXAotCU5ld0ZvbGRlclJlY3Vyc2l2ZSAie2JpbmRpcn0iXAotCUR1cGxpY2F0ZSAteSA6YXMubmV3ICJ7YmluZGlyfSJhc1wKLQlEdXBsaWNhdGUgLXkgOmdhc3AubmV3ICJ7YmluZGlyfSJnYXNwXAotCi0KLSMgV2hhY2sgb3V0IGNvbmZpZy1yZWJ1aWxkaW5nIHRhcmdldHMsIHRoZXkgd29uJ3Qgd29yay4KLS9eTWFrZWZpbGUgXFxPcHRpb24tZi8sL14kL2QKLS9eY29uZmlnLnN0YXR1cyBcXE9wdGlvbi1mLywvXiQvZAotCi0vXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi9zL14vIy8KZGlmZiAtLWdpdCBhL2dhcy9vYmouaCBiL2dhcy9vYmouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZTc1Yy4uMDAwMDAwMAotLS0gYS9nYXMvb2JqLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBvYmouaCAtIGRlZmluZXMgdGhlIG9iamVjdCBkZXBlbmRlbnQgaG9va3MgZm9yIGFsbCBvYmplY3QKLSAgIGZvcm1hdCBiYWNrZW5kcy4KLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTUsIDk2LCA5NywgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWNoYXIgKm9ial9kZWZhdWx0X291dHB1dF9maWxlX25hbWUgUEFSQU1TICgodm9pZCkpOwotdm9pZCBvYmpfZW1pdF9yZWxvY2F0aW9ucyBQQVJBTVMgKChjaGFyICoqd2hlcmUsIGZpeFMgKiBmaXhQLAotCQkJCSAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKSk7Ci12b2lkIG9ial9lbWl0X3N0cmluZ3MgUEFSQU1TICgoY2hhciAqKndoZXJlKSk7Ci12b2lkIG9ial9lbWl0X3N5bWJvbHMgUEFSQU1TICgoY2hhciAqKndoZXJlLCBzeW1ib2xTICogc3ltYm9scykpOwotI2lmbmRlZiBvYmpfcmVhZF9iZWdpbl9ob29rCi12b2lkIG9ial9yZWFkX2JlZ2luX2hvb2sgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQgb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLXZvaWQgb2JqX2hlYWRlcl9hcHBlbmQgUEFSQU1TICgoY2hhciAqKndoZXJlLCBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNpZm5kZWYgb2JqX3ByZV93cml0ZV9ob29rCi12b2lkIG9ial9wcmVfd3JpdGVfaG9vayBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgb2JqX3N5bWJvbF9uZXdfaG9vawotdm9pZCBvYmpfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci0jZW5kaWYKLQotdm9pZCBvYmpfc3ltYm9sX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgc3ltYm9sUyAqIHN5bWJvbFApKTsKLQotZXh0ZXJuIGNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW107Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdHJ1Y3QgZm9ybWF0X29wcyB7Ci0gIGludCBmbGF2b3I7Ci0gIHVuc2lnbmVkIGRmbF9sZWFkaW5nX3VuZGVyc2NvcmUgOiAxOwotICB1bnNpZ25lZCBlbWl0X3NlY3Rpb25fc3ltYm9scyA6IDE7Ci0gIHZvaWQgKCpmcm9iX3N5bWJvbCkgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotICB2b2lkICgqZnJvYl9maWxlKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIHZvaWQgKCpmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIGJmZF92bWEgKCpzX2dldF9zaXplKSBQQVJBTVMgKChzeW1ib2xTICopKTsKLSAgdm9pZCAoKnNfc2V0X3NpemUpIFBBUkFNUyAoKHN5bWJvbFMgKiwgYmZkX3ZtYSkpOwotICBiZmRfdm1hICgqc19nZXRfYWxpZ24pIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotICB2b2lkICgqc19zZXRfYWxpZ24pIFBBUkFNUyAoKHN5bWJvbFMgKiwgYmZkX3ZtYSkpOwotICB2b2lkICgqY29weV9zeW1ib2xfYXR0cmlidXRlcykgUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLSAgdm9pZCAoKmdlbmVyYXRlX2FzbV9saW5lbm8pIFBBUkFNUyAoKHZvaWQpKTsKLSAgdm9pZCAoKnByb2Nlc3Nfc3RhYikgUEFSQU1TICgoc2VnVCwgaW50LCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpKTsKLSAgaW50ICgqc2VjX3N5bV9va19mb3JfcmVsb2MpIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLSAgdm9pZCAoKnBvcF9pbnNlcnQpIFBBUkFNUyAoKHZvaWQpKTsKLSAgLyogRm9yIGNvbmZpZ3VyYXRpb25zIHVzaW5nIEVDT0ZGX0RFQlVHR0lORywgdGhpcyBjYWxsYmFjayBpcyB1c2VkLiAgKi8KLSAgdm9pZCAoKmVjb2ZmX3NldF9leHQpIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3RydWN0IGVjb2ZmX2V4dHIgKikpOwotCi0gIHZvaWQgKCpyZWFkX2JlZ2luX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKLSAgdm9pZCAoKnN5bWJvbF9uZXdfaG9vaykgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWxmX2Zvcm1hdF9vcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWNvZmZfZm9ybWF0X29wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBjb2ZmX2Zvcm1hdF9vcHM7Ci0KLSNpZm5kZWYgdGhpc19mb3JtYXQKLUNPTU1PTiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyAqdGhpc19mb3JtYXQ7Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBlbmQgb2Ygb2JqLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9vdXRwdXQtZmlsZS5jIGIvZ2FzL291dHB1dC1maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZGY3MmYuLjAwMDAwMDAKLS0tIGEvZ2FzL291dHB1dC1maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyogb3V0cHV0LWZpbGUuYyAtICBEZWFsIHdpdGggdGhlIG91dHB1dCBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTMsIDkyLCA5NCwgOTUsIDk2LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgotCi0jaWZkZWYgQkZEX0hFQURFUlMKLSNkZWZpbmUgVVNFX0JGRAotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIFVTRV9CRkQKLSNpZm5kZWYgVEFSR0VUX01BQ0gKLSNkZWZpbmUgVEFSR0VUX01BQ0ggMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9CRkQKLSNpbmNsdWRlICJiZmQuaCIKLWJmZCAqc3Rkb3V0cHV0OwotCi12b2lkCi1vdXRwdXRfZmlsZV9jcmVhdGUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICctJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IG9wZW4gYSBiZmQgb24gc3Rkb3V0ICVzICIpLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEoc3Rkb3V0cHV0ID0gYmZkX29wZW53IChuYW1lLCBUQVJHRVRfRk9STUFUKSkpCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIiksIG5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIGJmZF9zZXRfZm9ybWF0IChzdGRvdXRwdXQsIGJmZF9vYmplY3QpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIFRBUkdFVF9NQUNIKTsKLSNlbmRpZgotICBpZiAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpCi0gICAgc3Rkb3V0cHV0LT5mbGFncyB8PSBCRkRfVFJBRElUSU9OQUxfRk9STUFUOwotfQotCi12b2lkCi1vdXRwdXRfZmlsZV9jbG9zZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogQ2xvc2UgdGhlIGJmZC4gICovCi0gIGlmIChiZmRfY2xvc2UgKHN0ZG91dHB1dCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjbG9zZSAlc1xuIiksIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotI2Vsc2UKLSAgLyogQ2xvc2UgdGhlIGJmZCB3aXRob3V0IGdldHRpbmcgYmZkIHRvIHdyaXRlIG91dCBhbnl0aGluZyBieSBpdHNlbGYgKi8KLSAgaWYgKGJmZF9jbG9zZV9hbGxfZG9uZSAoc3Rkb3V0cHV0KSA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNsb3NlICVzXG4iKSwgZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZW5kaWYKLSAgc3Rkb3V0cHV0ID0gTlVMTDsJCS8qIFRydXN0IG5vYm9keSEgKi8KLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkCi1vdXRwdXRfZmlsZV9hcHBlbmQgKHdoZXJlLCBsZW5ndGgsIGZpbGVuYW1lKQotICAgICBjaGFyICp3aGVyZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBsb25nIGxlbmd0aCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpmaWxlbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi0jZWxzZQotCi1zdGF0aWMgRklMRSAqc3Rkb3V0cHV0OwotCi12b2lkCi1vdXRwdXRfZmlsZV9jcmVhdGUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICctJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgc3Rkb3V0cHV0ID0gc3Rkb3V0OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdGRvdXRwdXQgPSBmb3BlbiAobmFtZSwgIndiIik7Ci0KLSAgLyogU29tZSBzeXN0ZW1zIGRvbid0IGdyb2sgImIiIGluIGZvcGVuIG1vZGVzLiAgKi8KLSAgaWYgKHN0ZG91dHB1dCA9PSBOVUxMKQotICAgIHN0ZG91dHB1dCA9IGZvcGVuIChuYW1lLCAidyIpOwotCi0gIGlmIChzdGRvdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLX0KLQotdm9pZAotb3V0cHV0X2ZpbGVfY2xvc2UgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKEVPRiA9PSBmY2xvc2UgKHN0ZG91dHB1dCkpCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY2xvc2UgJXMiKSwgZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIHN0ZG91dHB1dCA9IE5VTEw7CQkvKiBUcnVzdCBub2JvZHkhICovCi19Ci0KLXZvaWQKLW91dHB1dF9maWxlX2FwcGVuZCAod2hlcmUsIGxlbmd0aCwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBsb25nIGxlbmd0aDsKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGZvciAoOyBsZW5ndGg7IGxlbmd0aC0tLCB3aGVyZSsrKQotICAgIHsKLSAgICAgICh2b2lkKSBwdXRjICgqd2hlcmUsIHN0ZG91dHB1dCk7Ci0gICAgICBpZiAoZmVycm9yIChzdGRvdXRwdXQpKQotCS8qIGlmICggRU9GID09IChwdXRjKCAqd2hlcmUsIHN0ZG91dHB1dCApKSApICovCi0JewotCSAgYXNfcGVycm9yIChfKCJGYWlsZWQgdG8gZW1pdCBhbiBvYmplY3QgYnl0ZSIpLCBmaWxlbmFtZSk7Ci0JICBhc19mYXRhbCAoXygiQ2FuJ3QgY29udGludWUiKSk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIGVuZCBvZiBvdXRwdXQtZmlsZS5jICovCmRpZmYgLS1naXQgYS9nYXMvb3V0cHV0LWZpbGUuaCBiL2dhcy9vdXRwdXQtZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDJmMWVmLi4wMDAwMDAwCi0tLSBhL2dhcy9vdXRwdXQtZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG91dHB1dC1maWxlLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdm9pZCBvdXRwdXRfZmlsZV9hcHBlbmQgUEFSQU1TICgoY2hhciAqd2hlcmUsIGxvbmcgbGVuZ3RoLCBjaGFyICpmaWxlbmFtZSkpOwotdm9pZCBvdXRwdXRfZmlsZV9jbG9zZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotdm9pZCBvdXRwdXRfZmlsZV9jcmVhdGUgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotCi0vKiBlbmQgb2Ygb3V0cHV0LWZpbGUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3BvL01ha2UtaW4gYi9nYXMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9nYXMvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9nYXMvcG8vUE9URklMRVMuaW4gYi9nYXMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNjdmMjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLWFwcC5jCi1hcHAuYwotYXMuYwotYXMuYwotYXMuaAotYXNpbnRsLmgKLWF0b2YtZ2VuZXJpYy5jCi1hdG9mLWdlbmVyaWMuYwotYmlnbnVtLWNvcHkuYwotYmlnbnVtLWNvcHkuYwotYmlnbnVtLmgKLWJpdF9maXguaAotY2dlbi5oCi1jb25kLmMKLWNvbmQuYwotY29uZmlnL2UtaTM4NmNvZmYuYwotY29uZmlnL2UtaTM4NmVsZi5jCi1jb25maWcvZS1taXBzZWNvZmYuYwotY29uZmlnL2UtbWlwc2VsZi5jCi1jb25maWcvb2JqLWFvdXQuYwotY29uZmlnL29iai1hb3V0LmgKLWNvbmZpZy9vYmotYm91dC5jCi1jb25maWcvb2JqLWJvdXQuaAotY29uZmlnL29iai1jb2ZmLmMKLWNvbmZpZy9vYmotY29mZi5oCi1jb25maWcvb2JqLWVjb2ZmLmMKLWNvbmZpZy9vYmotZWNvZmYuaAotY29uZmlnL29iai1lbGYuYwotY29uZmlnL29iai1lbGYuaAotY29uZmlnL29iai1ldmF4LmMKLWNvbmZpZy9vYmotZXZheC5oCi1jb25maWcvb2JqLWhwMzAwLmMKLWNvbmZpZy9vYmotaHAzMDAuaAotY29uZmlnL29iai1pZWVlLmMKLWNvbmZpZy9vYmotaWVlZS5oCi1jb25maWcvb2JqLXNvbS5jCi1jb25maWcvb2JqLXNvbS5oCi1jb25maWcvb2JqLXZtcy5jCi1jb25maWcvb2JqLXZtcy5oCi1jb25maWcvdGMtYTI5ay5jCi1jb25maWcvdGMtYTI5ay5oCi1jb25maWcvdGMtYWxwaGEuYwotY29uZmlnL3RjLWFscGhhLmgKLWNvbmZpZy90Yy1hcmMuYwotY29uZmlnL3RjLWFyYy5oCi1jb25maWcvdGMtYXJtLmMKLWNvbmZpZy90Yy1hcm0uaAotY29uZmlnL3RjLWQxMHYuYwotY29uZmlnL3RjLWQxMHYuaAotY29uZmlnL3RjLWQzMHYuYwotY29uZmlnL3RjLWQzMHYuaAotY29uZmlnL3RjLWg4MzAwLmMKLWNvbmZpZy90Yy1oODMwMC5oCi1jb25maWcvdGMtaDg1MDAuYwotY29uZmlnL3RjLWg4NTAwLmgKLWNvbmZpZy90Yy1ocHBhLmMKLWNvbmZpZy90Yy1ocHBhLmgKLWNvbmZpZy90Yy1pMzg2LmMKLWNvbmZpZy90Yy1pMzg2LmgKLWNvbmZpZy90Yy1pODYwLmMKLWNvbmZpZy90Yy1pODYwLmgKLWNvbmZpZy90Yy1pOTYwLmMKLWNvbmZpZy90Yy1pOTYwLmgKLWNvbmZpZy90Yy1tMzJyLmMKLWNvbmZpZy90Yy1tMzJyLmgKLWNvbmZpZy90Yy1tNjhrLmMKLWNvbmZpZy90Yy1tNjhrLmgKLWNvbmZpZy90Yy1tODhrLmMKLWNvbmZpZy90Yy1tODhrLmgKLWNvbmZpZy90Yy1tY29yZS5jCi1jb25maWcvdGMtbWNvcmUuaAotY29uZmlnL3RjLW1pcHMuYwotY29uZmlnL3RjLW1pcHMuaAotY29uZmlnL3RjLW1uMTAyMDAuYwotY29uZmlnL3RjLW1uMTAyMDAuaAotY29uZmlnL3RjLW1uMTAzMDAuYwotY29uZmlnL3RjLW1uMTAzMDAuaAotY29uZmlnL3RjLW5zMzJrLmMKLWNvbmZpZy90Yy1uczMyay5oCi1jb25maWcvdGMtcHBjLmMKLWNvbmZpZy90Yy1wcGMuaAotY29uZmlnL3RjLXNoLmMKLWNvbmZpZy90Yy1zaC5oCi1jb25maWcvdGMtc3BhcmMuYwotY29uZmlnL3RjLXNwYXJjLmgKLWNvbmZpZy90Yy10YWhvZS5jCi1jb25maWcvdGMtdGFob2UuaAotY29uZmlnL3RjLXRpYzMwLmMKLWNvbmZpZy90Yy10aWMzMC5oCi1jb25maWcvdGMtdGljODAuYwotY29uZmlnL3RjLXRpYzgwLmgKLWNvbmZpZy90Yy12ODUwLmMKLWNvbmZpZy90Yy12ODUwLmgKLWNvbmZpZy90Yy12YXguYwotY29uZmlnL3RjLXZheC5oCi1jb25maWcvdGMtdzY1LmMKLWNvbmZpZy90Yy13NjUuaAotY29uZmlnL3RjLXo4ay5jCi1jb25maWcvdGMtejhrLmgKLWRlcGVuZC5jCi1kZXBlbmQuYwotZHdhcmYyZGJnLmMKLWR3YXJmMmRiZy5jCi1kd2FyZjJkYmcuaAotZWNvZmYuYwotZWNvZmYuYwotZWNvZmYuaAotZWhvcHQuYwotZWhvcHQuYwotZW11bC10YXJnZXQuaAotZW11bC5oCi1leHByLmMKLWV4cHIuYwotZXhwci5oCi1mbG9udW0tY29weS5jCi1mbG9udW0tY29weS5jCi1mbG9udW0ta29uc3QuYwotZmxvbnVtLWtvbnN0LmMKLWZsb251bS1tdWx0LmMKLWZsb251bS1tdWx0LmMKLWZsb251bS5oCi1mcmFncy5jCi1mcmFncy5jCi1mcmFncy5oCi1nYXNwLmMKLWhhc2guYwotaGFzaC5jCi1oYXNoLmgKLWlucHV0LWZpbGUuYwotaW5wdXQtZmlsZS5jCi1pbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLmMKLWlucHV0LXNjcnViLmMKLWl0Ymwtb3BzLmMKLWl0Ymwtb3BzLmgKLWxpc3RpbmcuYwotbGlzdGluZy5jCi1saXN0aW5nLmgKLWxpdGVyYWwuYwotbGl0ZXJhbC5jCi1tYWNyby5jCi1tYWNyby5jCi1tYWNyby5oCi1tZXNzYWdlcy5jCi1tZXNzYWdlcy5jCi1vYmouaAotb3V0cHV0LWZpbGUuYwotb3V0cHV0LWZpbGUuYwotb3V0cHV0LWZpbGUuaAotcmVhZC5jCi1yZWFkLmMKLXJlYWQuaAotc2IuYwotc2IuYwotc2IuaAotc3RhYnMuYwotc3RhYnMuYwotc3RydWMtc3ltYm9sLmgKLXN1YnNlZ3MuYwotc3Vic2Vncy5jCi1zdWJzZWdzLmgKLXN5bWJvbHMuYwotc3ltYm9scy5jCi1zeW1ib2xzLmgKLXRjLmgKLXdyaXRlLmMKLXdyaXRlLmMKLXdyaXRlLmgKZGlmZiAtLWdpdCBhL2dhcy9wby9nYXMucG90IGIvZ2FzL3BvL2dhcy5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDBlZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3BvL2dhcy5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSw3MTY2ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA2LTAzIDAzOjAwLTA3MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhcHAuYzo0NDggYXBwLmM6NDYyCi1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo1NDEKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBzdHJpbmc6IGluc2VydGVkICdcIiciCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZXNjYXBlICdcXCVjJyBpbiBzdHJpbmc6IElnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NjE2Ci1tc2dpZCAiRW5kIG9mIGZpbGUgaW4gc3RyaW5nOiAnXCInIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjczNgotbXNnaWQgImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjg4MgotbXNnaWQgImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjkzMQotbXNnaWQgImVuZCBvZiBmaWxlIGFmdGVyIGEgb25lLWNoYXJhY3RlciBxdW90ZTsgXFwwIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjkzOQotbXNnaWQgImVuZCBvZiBmaWxlIGluIGVzY2FwZSBjaGFyYWN0ZXIiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6OTUxCi1tc2dpZCAiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjEwMTAgYXBwLmM6MTA2NCBhcHAuYzoxMTMzCi1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzoxMDc0Ci1tc2dpZCAiRU9GIGluIENvbW1lbnQ6IE5ld2xpbmUgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGFzc2VtYmxlciB2ZXJzaW9uICVzICglcykgdXNpbmcgQkZEIHZlcnNpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGFzc2VtYmxlciB2ZXJzaW9uICVzICglcykiCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFtvcHRpb24uLi5dIFthc21maWxlLi4uXVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTM1Ci1tc2dpZCAiIgotIk9wdGlvbnM6XG4iCi0iICAtYVtzdWItb3B0aW9uLi4uXVx0dHVybiBvbiBsaXN0aW5nc1xuIgotIiAgICBTdWItb3B0aW9ucyBbZGVmYXVsdCBobHNdOlxuIgotIiAgICBjICAgb21pdCBmYWxzZSBjb25kaXRpb25hbHNcbiIKLSIgICAgZCAgIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXNcbiIKLSIgICAgaCAgIGluY2x1ZGUgaGlnaC1sZXZlbCBzb3VyY2VcbiIKLSIgICAgbCAgIGluY2x1ZGUgYXNzZW1ibHlcbiIKLSIgICAgbSAgIGluY2x1ZGUgbWFjcm8gZXhwYW5zaW9uc1xuIgotIiAgICBuICAgb21pdCBmb3JtcyBwcm9jZXNzaW5nXG4iCi0iICAgIHMgICBpbmNsdWRlIHN5bWJvbHNcbiIKLSIgICAgTCAgIGluY2x1ZGUgbGluZSBkZWJ1ZyBzdGF0aXN0aWNzIChpZiBhcHBsaWNhYmxlKVxuIgotIiAgICA9ZmlsZSBzZXQgbGlzdGluZyBmaWxlIG5hbWUgKG11c3QgYmUgbGFzdCBzdWItb3B0aW9uKVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTQ5Ci1tc2dpZCAiIgotIiAgLURcdFx0ICAgICAgICAgIHByb2R1Y2UgYXNzZW1ibGVyIGRlYnVnZ2luZyBtZXNzYWdlc1xuIgotIiAgLS1kZWZzeW0gU1lNPVZBTCAgICAgICAgZGVmaW5lIHN5bWJvbCBTWU0gdG8gZ2l2ZW4gdmFsdWVcbiIKLSIgIC1mXHRcdCAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuIgotIiAgLS1nc3RhYnNcdCAgICAgICAgICBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIKLSIgIC0taGVscFx0XHQgIHNob3cgdGhpcyBtZXNzYWdlIGFuZCBleGl0XG4iCi0iICAtSSBESVJcdFx0ICBhZGQgRElSIHRvIHNlYXJjaCBsaXN0IGZvciAuaW5jbHVkZSBkaXJlY3RpdmVzXG4iCi0iICAtSlx0XHQgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3dcbiIKLSIgIC1LXHRcdCAgICAgICAgICB3YXJuIHdoZW4gZGlmZmVyZW5jZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG4iCi0iICAtTCwtLWtlZXAtbG9jYWxzICAgICAgICBrZWVwIGxvY2FsIHN5bWJvbHMgKGUuZy4gc3RhcnRpbmcgd2l0aCBgTCcpXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxNjAKLW1zZ2lkICIiCi0iICAtTSwtLW1yaVx0ICAgICAgICAgIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcbiIKLSIgIC0tTUQgRklMRVx0ICAgICAgICAgIHdyaXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaW4gRklMRSAoZGVmYXVsdCBub25lKVxuIgotIiAgLW5vY3BwXHRcdCAgaWdub3JlZFxuIgotIiAgLW8gT0JKRklMRVx0ICAgICAgICAgIG5hbWUgdGhlIG9iamVjdC1maWxlIG91dHB1dCBPQkpGSUxFIChkZWZhdWx0IGEub3V0KVxuIgotIiAgLVJcdFx0ICAgICAgICAgIGZvbGQgZGF0YSBzZWN0aW9uIGludG8gdGV4dCBzZWN0aW9uXG4iCi0iICAtLXN0YXRpc3RpY3NcdCAgICAgICAgICBwcmludCB2YXJpb3VzIG1lYXN1cmVkIHN0YXRpc3RpY3MgZnJvbSBleGVjdXRpb25cbiIKLSIgIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUgIHN0cmlwIGxvY2FsIGFic29sdXRlIHN5bWJvbHNcbiIKLSIgIC0tdHJhZGl0aW9uYWwtZm9ybWF0XHQgIFVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyIHdoZW4gcG9zc2libGVcbiIKLSIgIC0tdmVyc2lvblx0XHQgIHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIgotIiAgLVdcdFx0XHQgIHN1cHByZXNzIHdhcm5pbmdzXG4iCi0iICAtLWl0YmwgSU5TVFRCTFx0ICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG4iCi0iXHRcdFx0ICBtYXRjaGluZyB0aGUgc3BlY2lmaWNhdGlvbnMgZGVmaW5lZCBpbiBmaWxlIElOU1RUQkxcbiIKLSIgIC13XHRcdFx0ICBpZ25vcmVkXG4iCi0iICAtWFx0XHRcdCAgaWdub3JlZFxuIgotIiAgLVpcdFx0XHQgIGdlbmVyYXRlIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxNzcKLW1zZ2lkICIiCi0iICAtLWxpc3RpbmctbGhzLXdpZHRoXHQgIHNldCB0aGUgd2lkdGggaW4gd29yZHMgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiAiCi0ib2ZcbiIKLSJcdFx0XHQgIHRoZSBsaXN0aW5nXG4iCi0iICAtLWxpc3RpbmctbGhzLXdpZHRoMlx0ICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBjb250aW51YXRpb24gbGluZXNcbiIKLSJcdFx0XHQgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG4iCi0iXHRcdFx0ICB0aGUgd2lkdGggb2YgdGhlIGZpcnN0IGxpbmVcbiIKLSIgIC0tbGlzdGluZy1yaHMtd2lkdGhcdCAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuIgotIlx0XHRcdCAgdGhlIHNvdXJjZSBmaWxlXG4iCi0iICAtLWxpc3RpbmctY29udC1saW5lc1x0ICBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB1c2VkXG4iCi0iXHRcdFx0ICBmb3IgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiBvZiB0aGUgbGlzdGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTkwIGdhc3AuYzozNTg4Ci1tc2dpZCAiIgotIlxuIgotIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjI3Ci1tc2dpZCAibWlzc2luZyBlbXVsYXRpb24gbW9kZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBlbXVsYXRpb24gbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KLSM6IGFzLmM6NDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBhc3NlbWJsZXIgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ2MwotbXNnaWQgIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDY0IGdhc3AuYzozNjgyCi1tc2dpZCAiIgotIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcbiIKLSJ0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhpcyBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQgZm9yIGEgdGFyZ2V0IG9mIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NzQKLW1zZ2lkICJtdWx0aXBsZSBlbXVsYXRpb24gbmFtZXMgc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDc2Ci1tc2dpZCAiZW11bGF0aW9ucyBub3QgaGFuZGxlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWxpYXMgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm9uaWNhbCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY3B1LXR5cGUgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZvcm1hdCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkLXRhcmdldCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo1MDEKLW1zZ2lkICJiYWQgZGVmc3ltOyBmb3JtYXQgaXMgLS1kZWZzeW0gbmFtZT12YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUyMQotbXNnaWQgIk5vIGZpbGUgbmFtZSBmb2xsb3dpbmcgLXQgb3B0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo1MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmFpbGVkIHRvIHJlYWQgaW5zdHJ1Y3Rpb24gdGFibGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGxpc3Rpbmcgb3B0aW9uIGAlYyciCi1tc2dzdHIgIiIKLQotIzogYXMuYzo4NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHRvdGFsIHRpbWUgaW4gYXNzZW1ibHk6ICVsZC4lMDZsZFxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6ODY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIy4KLSMuICogV2UgaGF2ZSBhIEdST1NTIGludGVybmFsIGVycm9yLgotIy4gKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0jLgotIzogYXRvZi1nZW5lcmljLmM6NDM4IGNvbmZpZy90Yy1hMjlrLmM6NTQ0IGNvbmZpZy90Yy1pODYwLmM6MzM1Ci0jOiBjb25maWcvdGMtaTg2MC5jOjcwOCBjb25maWcvdGMtbTY4ay5jOjMxMjQgY29uZmlnL3RjLW02OGsuYzozMTUzCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTU3Ci1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjay4iCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjc1Ci1tc2dpZCAiaW52YWxpZCBpZGVudGlmaWVyIGZvciBcIi5pZmRlZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoxMjgKLW1zZ2lkICJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5pZlwiIHN0YXRlbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6MjI0Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgaWZjIG9yIGlmbmMiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI1NwotbXNnaWQgIlwiLmVuZGlmXCIgd2l0aG91dCBcIi5pZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyODcKLW1zZ2lkICIuZWxzZSB3aXRob3V0IG1hdGNoaW5nIC5pZiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI5MgotbXNnaWQgImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI5NQotbXNnaWQgImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiZWxzZVwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyOTgKLW1zZ2lkICJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImlmXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjM0MwotbXNnaWQgIi5pZmVxcyBzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQzMAotbXNnaWQgImVuZCBvZiBtYWNybyBpbnNpZGUgY29uZGl0aW9uYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQzMgotbXNnaWQgImVuZCBvZiBmaWxlIGluc2lkZSBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NDM1Ci1tc2dpZCAiaGVyZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NDM5Ci1tc2dpZCAiaGVyZSBpcyB0aGUgXCJlbHNlXCIgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzoxNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBwdXQgYSBjb21tb24gc3ltYm9sIGludG8gc2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gc2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE5NiBjb25maWcvb2JqLWVsZi5jOjE1NDAgZWNvZmYuYzozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MjU0IGNvbmZpZy9vYmotY29mZi5jOjE3NzAKLW1zZ2lkICJ1bnJlc29sdmVkIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MjU2IGNvbmZpZy9vYmotY29mZi5jOjE3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgdHlwZSBmb3Igd2VhayBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6NDU3IGNvbmZpZy9vYmotY29mZi5jOjI3MDQgd3JpdGUuYzoxODAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzo1MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjYxMgotbXNnaWQgInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1ib3V0LmM6MzEyIGNvbmZpZy9vYmotdm1zLmM6NTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RydWN0dXJlIHRhYmxlIGZhaWxlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDUzIGNvbmZpZy9vYmotY29mZi5jOjIxMTcKLW1zZ2lkICIubG4gcHNldWRvLW9wIGluc2lkZSAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTEzIGNvbmZpZy9vYmotY29mZi5jOjIxNzQKLW1zZ2lkICIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTU5IGNvbmZpZy9vYmotY29mZi5jOjIyMjcKLW1zZ2lkICIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjYzNSBjb25maWcvb2JqLWNvZmYuYzoyMzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo3MzcgY29uZmlnL29iai1jb2ZmLmM6MjQwOQotbXNnaWQgIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NzU3IGNvbmZpZy9vYmotY29mZi5jOjI0MjkKLW1zZ2lkICJiYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4MDggY29uZmlnL29iai1jb2ZmLmM6MjQ5MgotbXNnaWQgIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODI0IGNvbmZpZy9vYmotY29mZi5jOjI1MDgKLW1zZ2lkICIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODQyIGNvbmZpZy9vYmotY29mZi5jOjI1MjYKLW1zZ2lkICIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODYxIGNvbmZpZy9vYmotY29mZi5jOjI1NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGFnIG5vdCBmb3VuZCBmb3IgLnRhZyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4NzYgY29uZmlnL29iai1jb2ZmLmM6MjU1OQotbXNnaWQgIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODk4IGNvbmZpZy9vYmotY29mZi5jOjI1ODEKLW1zZ2lkICIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTAyOSBjb25maWcvb2JqLWNvZmYuYzoyNzc3Ci1tc2dpZCAibWlzbWF0Y2hlZCAuZWIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTA0OCBjb25maWcvb2JqLWNvZmYuYzoyODE3Ci1tc2dpZCAiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiCi1tc2dzdHIgIiIKLQotIy4gU1RZUF9JTkZPCi0jLiBTVFlQX0xJQgotIy4gU1RZUF9PVkVSCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlICclYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTI2MiBjb25maWcvb2JqLWNvZmYuYzozNTIwIGNvbmZpZy90Yy1wcGMuYzozNzg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMjg0IGNvbmZpZy90Yy1wcGMuYzozODAyIHJlYWQuYzoyNDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTQwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIweCVseDogXCIlc1wiIHR5cGUgPSAlbGQsIGNsYXNzID0gJWQsIHNlZ21lbnQgPSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjE1OTcgY29uZmlnL29iai1pZWVlLmM6NjkKLW1zZ2lkICJPdXQgb2Ygc3RlcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjIwMzIKLW1zZ2lkICJiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjIyNTkKLW1zZ2lkICJgLmJmJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozMjIwIGNvbmZpZy9vYmotaWVlZS5jOjUyMiBvdXRwdXQtZmlsZS5jOjUyCi0jOiBvdXRwdXQtZmlsZS5jOjExOQotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjMzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgY2xvc2UgJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVG9vIG1hbnkgbmV3IHNlY3Rpb25zOyBjYW4ndCBhZGQgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM4MzggY29uZmlnL3RjLW04OGsuYzoxMjYwIGNvbmZpZy90Yy1zcGFyYy5jOjMwMTYKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM4NDQgcmVhZC5jOjE5NTUKLW1zZ2lkICJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozODUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImxjb21tIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6Mzg3OCByZWFkLmM6MjE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM5NzIgY29uZmlnL3RjLWk5NjAuYzozMjc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MDUxIHdyaXRlLmM6MjQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQwNzIgd3JpdGUuYzoyNTA5Ci1tc2dpZCAiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBlbWl0IHJlbG9jIHstICVzLXNlZyBzeW1ib2wgXCIlc1wifSBAIGZpbGUgYWRkcmVzcyAlbGQuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYSAxMy1iaXQKLSMuIGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZCBmb3IgbG9jYWwgYnJhbmNoZXM6Ci0jLiBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZSByZWxvY2F0aW9uLgotIzogY29uZmlnL29iai1jb2ZmLmM6NDIwOCBjb25maWcvdGMtaTk2MC5jOjMyOTQgd3JpdGUuYzoyNjUzCi1tc2dpZCAiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDI4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJWYWx1ZSBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MzAyIHdyaXRlLmM6Mjc2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJTaWduZWQgLndvcmQgb3ZlcmZsb3c7IHN3aXRjaCBtYXkgYmUgdG9vIGxhcmdlOyAlbGQgYXQgMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lY29mZi5jOjIzOQotbXNnaWQgIkNhbid0IHNldCBHUCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVjb2ZmLmM6MjQ2Ci1tc2dpZCAiQ2FuJ3Qgc2V0IHJlZ2lzdGVyIG1hc2tzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6Mjc2IGNvbmZpZy90Yy1zcGFyYy5jOjMxNTcgY29uZmlnL3RjLXY4NTAuYzoyNjMKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjI4MyBjb25maWcvdGMtYXJjLmM6Nzc4IGNvbmZpZy90Yy1zcGFyYy5jOjMxNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MjkzIGNvbmZpZy90Yy1hbHBoYS5jOjM0MzAgY29uZmlnL3RjLXNwYXJjLmM6MzE3NAotIzogY29uZmlnL3RjLXY4NTAuYzoyODUKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzozMDEgY29uZmlnL3RjLWFyYy5jOjc5NiBjb25maWcvdGMtc3BhcmMuYzozMTgyCi0jOiBjb25maWcvdGMtdjg1MC5jOjI5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzozMjQgY29uZmlnL3RjLWFyYy5jOjgxNSBjb25maWcvdGMtdjg1MC5jOjMyMgotbXNnaWQgIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjM0MyBjb25maWcvdGMtbTMyci5jOjY2NCBjb25maWcvdGMtcHBjLmM6MTM5NQotIzogY29uZmlnL3RjLXY4NTAuYzozODUKLW1zZ2lkICJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo0MDYgY29uZmlnL3RjLWFyYy5jOjg3NSBjb25maWcvdGMtc3BhcmMuYzozMzA2Ci0jOiBjb25maWcvdGMtdjg1MC5jOjU2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NTkxCi1tc2dpZCAiTWlzc2luZyBzZWN0aW9uIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo2NTYKLW1zZ2lkICJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlOiB3YW50IGEsdyx4IGluIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjcwNQotbXNnaWQgIlVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3MTkKLW1zZ2lkICJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlIC0gY2hhcmFjdGVyIGZvbGxvd2luZyBuYW1lIGlzIG5vdCAnIyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3NTEKLW1zZ2lkICJVbnJlY29nbml6ZWQgc2VjdGlvbiBhdHRyaWJ1dGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2V0dGluZyBpbmNvcnJlY3Qgc2VjdGlvbiB0eXBlIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjc4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIGF0dHJpYnV0ZXMgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6OTA3Ci1tc2dpZCAiLnByZXZpb3VzIHdpdGhvdXQgY29ycmVzcG9uZGluZyAuc2VjdGlvbjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjk1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJtdWx0aXBsZSAuc3ltdmVyIGRpcmVjdGl2ZXMgZm9yIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6OTY1Ci1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6OTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1pc3NpbmcgdmVyc2lvbiBuYW1lIGluIGAlcycgZm9yIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTE5MyBjb25maWcvb2JqLXNvbS5jOjE0OCBjb25maWcvb2JqLXNvbS5jOjE5MwotbXNnaWQgIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgYCVzJyBpbiAuc2l6ZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMjIzCi1tc2dpZCAibWlzc2luZyBleHByZXNzaW9uIGluIC5zaXplIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjEyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgdW5yZWNvZ25pemVkIHN5bWJvbCB0eXBlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE0NjQKLW1zZ2lkICIuc2l6ZSBleHByZXNzaW9uIHRvbyBjb21wbGljYXRlZCB0byBmaXggdXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJpbnZhbGlkIGF0dGVtcHQgdG8gZGVjbGFyZSBleHRlcm5hbCB2ZXJzaW9uIG5hbWUgYXMgZGVmYXVsdCBpbiBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE2MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmFpbGVkIHRvIHNldCB1cCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBzdGFydCB3cml0aW5nIC5tZGVidWcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNjQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvdWxkIG5vdCB3cml0ZSAubWRlYnVnIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotaWVlZS5jOjQ2MAotbXNnaWQgInRvbyBtYW55IHNlY3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotc29tLmM6MTMxCi1tc2dpZCAiT25seSBvbmUgLnZlcnNpb24gcHNldWRvLW9wIHBlciBmaWxlISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjE1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQXR0YWNoaW5nIHZlcnNpb24gaGVhZGVyICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotc29tLmM6MTc2Ci1tc2dpZCAiT25seSBvbmUgLmNvcHlyaWdodCBwc2V1ZG8tb3AgcGVyIGZpbGUhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotc29tLmM6MjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZBVEFMOiBBdHRhY2hpbmcgY29weXJpZ2h0IGhlYWRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjb21waWxlciBlbWl0dGVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvbXBpbGVyIHJlZGVmaW5lZCB6ZXJvLXNpemUgY29tbW9uIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvdWxkbid0IGNyZWF0ZSBWTVMgb2JqZWN0IGZpbGUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NjIzCi1tc2dpZCAiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIChsZW5ndGggcHJlZml4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjYzNwotbXNnaWQgIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjEyNDAKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIHNvdXJjZSBmaWxlIFwiJXNcIiwgc3RhdHVzPSUlWCV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MTc0OSBjb25maWcvb2JqLXZtcy5jOjI5MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgZm9yd2FyZCByZWZlcmVuY2UgZXJyb3IsIGRieCB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MTgyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJWYXJpYWJsZSBkZXNjcmlwdG9yICVkIHRvbyBjb21wbGljYXRlZC4gIERlZmluZWQgYXMgYHZvaWQgKicuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MjE0NAotbXNnaWQgIiIKLSIqKipXYXJuaW5nIC0gdGhlIGFzc2VtYmx5IGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBoYXMgcGxhY2VkIFxuIgotIiBnbG9iYWwgY29uc3RhbnQocykgaW4gdGhlIHRleHQgcHNlY3QuICBUaGVzZSB3aWxsIG5vdCBiZSBhdmFpbGFibGUgdG8gXG4iCi0iIG90aGVyIG1vZHVsZXMsIHNpbmNlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0IHdheSB0byBoYW5kbGUgdGhpcy4gWW91IFxuIgotIiBoYXZlIHR3byBvcHRpb25zOiAxKSBnZXQgYSBwYXRjaGVkIGNvbXBpbGVyIHRoYXQgZG9lcyBub3QgcHV0IGdsb2JhbCBcbiIKLSIgY29uc3RhbnRzIGluIHRoZSB0ZXh0IHBzZWN0LCBvciAyKSByZW1vdmUgdGhlICdjb25zdCcga2V5d29yZCBmcm9tIFxuIgotIiBkZWZpbml0aW9ucyBvZiBnbG9iYWwgdmFyaWFibGVzIGluIHlvdXIgc291cmNlIG1vZHVsZShzKS4gIERvbid0IHNheSBcbiIKLSIgSSBkaWRuJ3Qgd2FybiB5b3UhIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MjQ2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWJ1Z2dpbmVyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB1bnR5cGVkIHZhcmlhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI2ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgb3V0cHV0OiBzdHJ1Y3R1cmUgZWxlbWVudCBgJXMnIGhhcyB1bmRlZmluZWQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI3OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgb3V0cHV0OiAlZCBpcyBhbiB1bmtub3duIHR5cGUgb2YgdmFyaWFibGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MjkyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWJ1Z2dlciBvdXRwdXQ6IFVuYWJsZSB0byByZXNvbHZlICVkIGNpcmN1bGFyIHJlZmVyZW5jZXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MzEzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJNb2R1bGUgbmFtZSB0cnVuY2F0ZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzozNDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyByZXBsYWNlZCBieSAlc1xuIgotbXNnc3RyICIiCi0KLSMuIGltcG9zc2libGUKLSM6IGNvbmZpZy9vYmotdm1zLmM6MzY5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIFZNUyBwc2VjdCB0eXBlICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MzczNQotIywgYy1mb3JtYXQKLW1zZ2lkICJHbG9iYWxzeW1ib2wgYXR0cmlidXRlIGZvciBzeW1ib2wgJXMgd2FzIHVuZXhwZWN0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6Mzg4NQotbXNnaWQgIkludmFsaWQgZGF0YSB0eXBlIGZvciBnbG9iYWx2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM4OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBnbG9iYWx2YWx1ZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQyNDcKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIGZpeHVwIGZyYWdtZW50IHdoZW4gY2hlY2tpbmcgZm9yIGluZGlyZWN0IHJlZmVyZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ1OTEgY29uZmlnL29iai12bXMuYzo0NzMzCi1tc2dpZCAiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDU5NSBjb25maWcvb2JqLXZtcy5jOjQ3MzcKLW1zZ2lkICJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIGFuIGFwcHJvcHJpYXRlIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NTk4IGNvbmZpZy9vYmotdm1zLmM6NDc0MAotbXNnaWQgIkZpeHVwIGRhdGEgaXMgZXJyb25lb3VzbHkgXCJwY3JlbFwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDYxNCBjb25maWcvb2JqLXZtcy5jOjQ3NTkKLW1zZ2lkICJGaXh1cCBkYXR1bSBpcyBub3QgYSBsb25nd29yZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ2MTggY29uZmlnL29iai12bXMuYzo0NzYzCi1tc2dpZCAiRml4dXAgZGF0dW0gaXMgbm90IFwiZml4UC0+ZnhfYWRkc3lcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ4MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImcrKyB3cm90ZSBhbiBleHRlcm4gcmVmZXJlbmNlIHRvIGAlcycgYXMgYSByb3V0aW5lLlxuIgotIkkgd2lsbCBmaXggaXQsIGJ1dCBJIGhvcGUgdGhhdCBpdCB3YXMgbm90ZSByZWFsbHkgYSByb3V0aW5lLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ5NjYKLW1zZ2lkICJDYW4ndCBoYW5kbGUgZ2xvYmFsIHh0b3JzIHN5bWJvbHMgeWV0LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ5NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biAlcyIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKglFcnJvciBvdGhlcndpc2UuCi0jLgotIzogY29uZmlnL29iai12bXMuYzo1MDU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaGFuZGxlZCBzdGFiIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxNjAgY29uZmlnL3RjLXNwYXJjLmM6MzM1OAotbXNnaWQgIlVua25vd24gc2VnbWVudCB0eXBlIgotbXNnc3RyICIiCi0KLSMuIFByb2JhYmx5IGEgbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbT8gIEdpdmUgdXAgbm93LgotIzogY29uZmlnL3RjLWEyOWsuYzozMzAgY29uZmlnL3RjLWhwcGEuYzoxMzM2IGNvbmZpZy90Yy1pODYwLmM6MjAyCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMTYgY29uZmlnL3RjLW1pcHMuYzoxMDU4IGNvbmZpZy90Yy1zcGFyYy5jOjcxNQotbXNnaWQgIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6Mzc1IGNvbmZpZy90Yy1hcmMuYzo1MzQgY29uZmlnL3RjLWQxMHYuYzo0ODEKLSM6IGNvbmZpZy90Yy1kMzB2LmM6NTQwIGNvbmZpZy90Yy1oODMwMC5jOjMwNSBjb25maWcvdGMtaDg1MDAuYzoyOTcKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjUwOSBjb25maWcvdGMtbW4xMDIwMC5jOjkzNiBjb25maWcvdGMtbW4xMDMwMC5jOjk5MgotIzogY29uZmlnL3RjLXBwYy5jOjE4NTAgY29uZmlnL3RjLXNoLmM6NDc4IGNvbmZpZy90Yy10aWM4MC5jOjI5MQotIzogY29uZmlnL3RjLXY4NTAuYzoyMDMzIGNvbmZpZy90Yy13NjUuYzoyNTcgY29uZmlnL3RjLXo4ay5jOjM0MQotbXNnaWQgIm1pc3Npbmcgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQxNSBjb25maWcvdGMtaHBwYS5jOjE0NTAgY29uZmlnL3RjLWk4NjAuYzo0MDcKLSM6IGNvbmZpZy90Yy1pODYwLmM6NDIzIGNvbmZpZy90Yy1zcGFyYy5jOjExOTEgY29uZmlnL3RjLXNwYXJjLmM6MTE5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIG9wY29kZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIG9wY29kZSBgJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQ1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJUb28gbWFueSBvcGVyYW5kczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo0NzQgY29uZmlnL3RjLWEyOWsuYzo1MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW1tZWRpYXRlIHZhbHVlIG9mICVsZCBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo4OTIgY29uZmlnL3RjLWk4NjAuYzo5NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6OTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5lZWQgJW8zXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo5MzIKLW1zZ2lkICJhMjlrX2NvbnZlcnRfZnJhZ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6OTQxCi1tc2dpZCAiYTI5a19lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJsYWJlbCBcIiQlZFwiIHJlZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjExNjUKLW1zZ2lkICJJbnZhbGlkIGV4cHJlc3Npb24gYWZ0ZXIgJSUlJVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTE3NgotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgaW4gJiBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjcyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBvcGNvZGUgYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG1hY3JvIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjgzMiBjb25maWcvdGMtaTk2MC5jOjI3MzYKLW1zZ2lkICJzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6OTA1IGNvbmZpZy90Yy1hcm0uYzo0OTgyIGNvbmZpZy90Yy1oODMwMC5jOjE0MTMKLSM6IGNvbmZpZy90Yy1oODUwMC5jOjEyMjIgY29uZmlnL3RjLWhwcGEuYzoyNjg0IGNvbmZpZy90Yy1pODYwLmM6ODEzCi0jOiBjb25maWcvdGMtbTY4ay5jOjQxMjUgY29uZmlnL3RjLW04OGsuYzoxMTA2IGNvbmZpZy90Yy1uczMyay5jOjE1ODgKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI0MzMgY29uZmlnL3RjLXo4ay5jOjEzNTUKLW1zZ2lkICJCYWQgY2FsbCB0byBNRF9BVE9GKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6OTU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gQ1BVIGlkZW50aWZpZXIgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo5OTkKLW1zZ2lkICIiCi0iQWxwaGEgb3B0aW9uczpcbiIKLSItMzJhZGRyXHRcdFx0dHJlYXQgYWRkcmVzc2VzIGFzIDMyLWJpdCB2YWx1ZXNcbiIKLSItRlx0XHRcdGxhY2sgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRcbiIKLSItbWV2NCB8IC1tZXY0NSB8IC1tZXY1IHwgLW1ldjU2IHwgLW1wY2E1NiB8IC1tZXY2IHwgLW1hbGxcbiIKLSJcdFx0XHRzcGVjaWZ5IHZhcmlhbnQgb2YgQWxwaGEgYXJjaGl0ZWN0dXJlXG4iCi0iLW0yMTA2NCB8IC1tMjEwNjYgfCAtbTIxMTY0IHwgLW0yMTE2NGEgfCAtbTIxMTY0cGMgfCAtbTIxMjY0XG4iCi0iXHRcdFx0dGhlc2UgdmFyaWFudHMgaW5jbHVkZSBQQUxjb2RlIG9wY29kZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMDA5Ci1tc2dpZCAiIgotIlZNUyBvcHRpb25zOlxuIgotIi0rXHRcdFx0aGFzaCBlbmNvZGUgKGRvbid0IHRydW5jYXRlKSBuYW1lcyBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzXG4iCi0iLUhcdFx0XHRzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTE2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjExNzgKLW1zZ2lkICJub24tYWJzb2x1dGUgZXhwcmVzc2lvbiBpbiBjb25zdGFudCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgInR5cGUgJWQgcmVsb2MgZG9uZT9cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMjQzIGNvbmZpZy90Yy1hbHBoYS5jOjEyNTAgY29uZmlnL3RjLW1pcHMuYzo3MzI5Ci1tc2dpZCAiVXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlcHJlc2VudCBgJXMnIHJlbG9jYXRpb24gaW4gb2JqZWN0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTQxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcj8gY2Fubm90IGdlbmVyYXRlIGAlcycgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxNDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZyYW1lIHJlZyBleHBlY3RlZCwgdXNpbmcgJCVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxNzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlZCBhbmQgJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE4OTEgY29uZmlnL3RjLWFyYy5jOjU0NyBjb25maWcvdGMtZDEwdi5jOjU3MAotIzogY29uZmlnL3RjLWQzMHYuYzo2MjMgY29uZmlnL3RjLW1uMTAyMDAuYzo5OTEgY29uZmlnL3RjLW1uMTAzMDAuYzoxMDU4Ci0jOiBjb25maWcvdGMtcHBjLmM6MTgxNiBjb25maWcvdGMtcHBjLmM6MTkyMyBjb25maWcvdGMtcHBjLmM6MTkzNQotIzogY29uZmlnL3RjLXY4NTAuYzoxODE5IGNvbmZpZy90Yy12ODUwLmM6MTg0MiBjb25maWcvdGMtdjg1MC5jOjIwNTUKLW1zZ2lkICJ0b28gbWFueSBmaXh1cHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjAxNiBjb25maWcvdGMtYWxwaGEuYzoyMDc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImluYXBwcm9wcmlhdGUgYXJndW1lbnRzIGZvciBvcGNvZGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMDE4IGNvbmZpZy90Yy1hbHBoYS5jOjIwNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3Bjb2RlIGAlcycgbm90IHN1cHBvcnRlZCBmb3IgdGFyZ2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIwMjIgY29uZmlnL3RjLWFscGhhLmM6MjA3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wY29kZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIxMzEKLW1zZ2lkICJjYW4gbm90IHJlc29sdmUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMjY5IGNvbmZpZy90Yy1hbHBoYS5jOjI0NDYKLW1zZ2lkICJvdmVyZmxvdyBpbiBsaXRlcmFsICgubGl0YSkgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjI3NiBjb25maWcvdGMtYWxwaGEuYzoyMjk4IGNvbmZpZy90Yy1hbHBoYS5jOjI0NTkKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI2ODEgY29uZmlnL3RjLWFscGhhLmM6MjcyOCBjb25maWcvdGMtYWxwaGEuYzoyNzc2Ci0jOiBjb25maWcvdGMtYWxwaGEuYzoyODY1IGNvbmZpZy90Yy1hbHBoYS5jOjMwNjYgY29uZmlnL3RjLWFscGhhLmM6MzE2NwotbXNnaWQgIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMjc4IGNvbmZpZy90Yy1hbHBoYS5jOjIzMDAgY29uZmlnL3RjLWFscGhhLmM6MjQ2MQotbXNnaWQgIm1hY3JvIHJlcXVpcmVzICRhdCB3aGlsZSAkYXQgaW4gdXNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI0MDggZXhwci5jOjg2IHJlYWQuYzozMTI1Ci1tc2dpZCAiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyNDEwIGV4cHIuYzo4OCByZWFkLmM6MzEyNyByZWFkLmM6MzQ1NyByZWFkLmM6NDM1MwotbXNnaWQgImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjQxNQotbXNnaWQgImNhbid0IGhhbmRsZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI0NTIKLW1zZ2lkICJvdmVyZmxvdyBpbiBsaXRlcmFsICgubGl0OCkgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzQwMSBjb25maWcvdGMtcHBjLmM6MTM0NCBjb25maWcvdGMtcHBjLmM6MzU0OAotIzogcmVhZC5jOjEzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNDM5IGNvbmZpZy90Yy1hbHBoYS5jOjM0NDggY29uZmlnL3RjLXBwYy5jOjM1ODUKLSM6IHJlYWQuYzoxMzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzU1MCBlY29mZi5jOjMxMDgKLW1zZ2lkICIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNTU4Ci1tc2dpZCAibmVzdGVkIC5lbnQgZGlyZWN0aXZlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNTk0IGVjb2ZmLmM6MzA1NgotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM2MDMKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSBuYW1lcyBkaWZmZXJlbnQgc3ltYm9sIHRoYW4gLmVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNjc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgJWQgdG8gLnByb2xvZ3VlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNzA2Ci1tc2dpZCAiRUNPRkYgZGVidWdnaW5nIGlzIGRpc2FibGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNzI3Ci1tc2dpZCAiVW5rbm93biBzZWN0aW9uIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNzY0Ci1tc2dpZCAiLmVudCBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNzkyCi1tc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMS4vMi4gcGFyYW0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzgwNAotbXNnaWQgIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDMuLzQuIHBhcmFtIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4MjkKLW1zZ2lkICIucGRlc2MgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODM3Ci1tc2dpZCAiLnBkZXNjIGhhcyBubyBtYXRjaGluZyAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4NDcKLW1zZ2lkICIucGRlc2MgZGlyZWN0aXZlIGhhcyBubyBlbnRyeSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzg1OQotbXNnaWQgIk5vIGNvbW1hIGFmdGVyIC5wZGVzYyA8ZW50cnluYW1lPiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODgyCi1tc2dpZCAidW5rbm93biBwcm9jZWR1cmUga2luZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozOTc3Ci1tc2dpZCAiLm5hbWUgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozOTg1Ci1tc2dpZCAiLm5hbWUgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDAyMAotbXNnaWQgIk5vIHN5bWJvbCBhZnRlciAubGlua2FnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MDQ5Ci1tc2dpZCAiTm8gc3ltYm9sIGFmdGVyIC5jb2RlX2FkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDA4NCBlY29mZi5jOjMyNzMKLW1zZ2lkICJCYWQgLm1hc2sgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQxMDYgZWNvZmYuYzozMjA0Ci1tc2dpZCAiQmFkIC5mbWFzayBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDI3NyByZWFkLmM6MjE0NCByZWFkLmM6MjY5NiBzdGFicy5jOjQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jLiBzeW1ib2xQLT5zeV9vdGhlciA9IChzaWduZWQgY2hhcikgdGVtcDsKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQyODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5oYW5kbGVkOiAucHJvYyAlcywlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRyaWVkIHRvIC5zZXQgdW5yZWNvZ25pemVkIG1vZGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jLiBub3QgZmF0YWwsIGJ1dCBpdCBtaWdodCBub3Qgd29yayBpbiB0aGUgZW5kCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MzQwCi1tc2dpZCAiRmlsZSBvdmVycmlkZXMgbm8tYmFzZS1yZWdpc3RlciBvcHRpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIGJhc2UgcmVnaXN0ZXIsIHVzaW5nICQlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDM3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MzgzIGNvbmZpZy90Yy1kMzB2LmM6MjE2MwotbXNnaWQgIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2hvc2UgR1AgdmFsdWUgb2YgJWx4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEzNgotbXNnaWQgIiIKLSJBUkMgb3B0aW9uczpcbiIKLSItRUJcdFx0XHRnZW5lcmF0ZSBiaWcgZW5kaWFuIG91dHB1dFxuIgotIi1FTFx0XHRcdGdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjE1NCBjb25maWcvdGMtYXJjLmM6MTc3IGNvbmZpZy90Yy1hcmMuYzo5MjEKLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTI5OCBjb25maWcvdGMtaHBwYS5jOjUwNTQgY29uZmlnL3RjLWhwcGEuYzo1MDYwCi0jOiBjb25maWcvdGMtaHBwYS5jOjUwNjYgY29uZmlnL3RjLW1uMTAzMDAuYzo3MjEgY29uZmlnL3RjLW1uMTAzMDAuYzoxNjQ2Ci1tc2dpZCAiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjE3NAotbXNnaWQgInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MjUzIGNvbmZpZy90Yy1tbjEwMjAwLmM6MTM1NCBjb25maWcvdGMtbW4xMDMwMC5jOjE1NjUKLSM6IGNvbmZpZy90Yy1wcGMuYzoxMTAxIGNvbmZpZy90Yy12ODUwLmM6MTYxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzozODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBzeW50YXggZm9ybWF0IGNoYXJhY3RlciBgJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo0ODcKLW1zZ2lkICJ0b28gbWFueSBzdWZmaXhlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NTMyIGNvbmZpZy90Yy1kMTB2LmM6NDc5IGNvbmZpZy90Yy1kMzB2LmM6NTM4Ci0jOiBjb25maWcvdGMtbW4xMDIwMC5jOjkzMyBjb25maWcvdGMtbW4xMDMwMC5jOjk4OSBjb25maWcvdGMtcHBjLmM6MTg0OAotIzogY29uZmlnL3RjLXRpYzgwLmM6Mjg3IGNvbmZpZy90Yy12ODUwLmM6MjAzMAotbXNnaWQgImlsbGVnYWwgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NjE5IGNvbmZpZy90Yy1tbjEwMjAwLmM6MTAzMiBjb25maWcvdGMtbW4xMDMwMC5jOjExMjgKLSM6IGNvbmZpZy90Yy1wcGMuYzoxOTcyIGNvbmZpZy90Yy12ODUwLmM6MjEwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2NTkKLW1zZ2lkICI4IGJ5dGUgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NjYxCi1tc2dpZCAiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2NjkKLW1zZ2lkICJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjc0OCBjb25maWcvdGMtYXJtLmM6NjAzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NzcxCi1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjc4OAotbXNnaWQgImlnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6ODAzCi1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6ODk2Ci1tc2dpZCAiLmNwdSBjb21tYW5kIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5MTUKLW1zZ2lkICIuY3B1IGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5MjYKLW1zZ2lkICJiYWQgLmNwdSBvcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6OTUwIGNvbmZpZy90Yy1wcGMuYzoyNjIxCi1tc2dpZCAibWlzc2luZyByZW5hbWUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5NjIKLW1zZ2lkICJpbnZhbGlkIHN5bWJvbCB0byByZW5hbWUgdG8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEwMDkgY29uZmlnL3RjLWQxMHYuYzoyNzQgY29uZmlnL3RjLWQzMHYuYzozNTMKLSM6IGNvbmZpZy90Yy1taXBzLmM6ODczNiBjb25maWcvdGMtbW4xMDIwMC5jOjM1NiBjb25maWcvdGMtcHBjLmM6NDM2OQotIzogY29uZmlnL3RjLXNoLmM6MTE4NyBjb25maWcvdGMtdjg1MC5jOjEyNzYKLW1zZ2lkICJiYWQgY2FsbCB0byBtZF9hdG9mIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMDk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1pc3NpbmcgJyknIGluICUtb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjExMzAKLW1zZ2lkICJleHByZXNzaW9uIHRvbyBjb21wbGV4IGZvciAlJXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMzI0IGNvbmZpZy90Yy1hcm0uYzoyOTM3IGNvbmZpZy90Yy1kMTB2LmM6MTQ0OAotIzogY29uZmlnL3RjLWQzMHYuYzoxODEwIGNvbmZpZy90Yy1taXBzLmM6MzE5NiBjb25maWcvdGMtbWlwcy5jOjQxMjgKLSM6IGNvbmZpZy90Yy1taXBzLmM6NDkxMyBjb25maWcvdGMtbWlwcy5jOjU0NTkgY29uZmlnL3RjLXBwYy5jOjQ3MDQKLSM6IGNvbmZpZy90Yy12ODUwLmM6MjMzOQotbXNnaWQgImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEzOTAgY29uZmlnL3RjLXBwYy5jOjQ4MDcgY29uZmlnL3RjLXY4NTAuYzoyMzgzCi1tc2dpZCAidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTQ1NCBjb25maWcvdGMtc3BhcmMuYzoyODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjk4MwotbXNnaWQgIkxpdGVyYWwgUG9vbCBPdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTEwMwotbXNnaWQgIkludmFsaWQgc3ludGF4IGZvciAucmVxIGRpcmVjdGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExMzkKLW1zZ2lkICJOb3RoaW5nIHRvIHB1dCBpbiB0aGUgcG9vbFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMTUxCi1tc2dpZCAiSW5zZXJ0aW5nIGltcGxpY2l0IHBvb2wgYXQgY2hhbmdlIG9mIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExODMgY29uZmlnL3RjLW1pcHMuYzo5ODUxIHJlYWQuYzoyMDM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTE4NiByZWFkLmM6MjA0MwotbXNnaWQgIkFsaWdubWVudCBuZWdhdGl2ZS4gMCBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTI1MQotbXNnaWQgInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IFRIVU1CIG9wY29kZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEyNjMKLW1zZ2lkICJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBBUk0gb3Bjb2RlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTI3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGluc3RydWN0aW9uIHNpemUgc2VsZWN0ZWQgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTMwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgdG8gLmNvZGUgZGlyZWN0aXZlICglZCkgKGV4cGVjdGluZyAxNiBvciAzMikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEzMTkKLW1zZ2lkICJHYXJiYWdlIGZvbGxvd2luZyBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0jLiB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuCi0jOiBjb25maWcvdGMtYXJtLmM6MTM2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWdpc3RlciBleHBlY3RlZCwgbm90ICclLjEwMHMnIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMzkzCi1tc2dpZCAiPHBzcihmKT4gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE0MjQKLW1zZ2lkICJJbGxlZ2FsIGNvLXByb2Nlc3NvciBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE0MzEKLW1zZ2lkICJCYWQgb3IgbWlzc2luZyBjby1wcm9jZXNzb3IgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDU2Ci1tc2dpZCAiYmFkIG9yIG1pc3NpbmcgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTQ2MgotbXNnaWQgImltbWVkaWF0ZSBjby1wcm9jZXNzb3IgZXhwcmVzc2lvbiB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIy4gSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotIy4gdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbgotIzogY29uZmlnL3RjLWFybS5jOjE0ODcKLW1zZ2lkICJDby1wcm9jZXNzb3IgcmVnaXN0ZXIgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIy4gSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotIy4gdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbgotIzogY29uZmlnL3RjLWFybS5jOjE1MTEKLW1zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTUyOQotbXNnaWQgImltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNTQ0Ci1tc2dpZCAiY28tcHJvY2Vzc29yIGFkZHJlc3MgbXVzdCBiZSB3b3JkIGFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE1NTAKLW1zZ2lkICJvZmZzZXQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjAwCi1tc2dpZCAicGMgbWF5IG5vdCBiZSB1c2VkIGluIHBvc3QtaW5jcmVtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjE2IGNvbmZpZy90Yy1hcm0uYzoyNzI3Ci1tc2dpZCAicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTYzMCBjb25maWcvdGMtYXJtLmM6Mjc0MCBjb25maWcvdGMtYXJtLmM6MzA4OQotbXNnaWQgIm1pc3NpbmcgXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTY0MQotbXNnaWQgInBjIG1heSBub3QgYmUgdXNlZCB3aXRoIHdyaXRlLWJhY2siCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2OTYKLW1zZ2lkICI8cHNyPiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTc1OCBjb25maWcvdGMtYXJtLmM6MjM3OAotbXNnaWQgIlJlZ2lzdGVyIG9yIHNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE3NzIgY29uZmlnL3RjLWFybS5jOjIwOTAgY29uZmlnL3RjLWFybS5jOjIzNDUKLSM6IGNvbmZpZy90Yy1hcm0uYzoyMzY1Ci1tc2dpZCAiSW52YWxpZCBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTc4MwotbXNnaWQgIkVycm9yOiB1bnJlY29nbmlzZWQgc3ludGF4IGZvciBzZWNvbmQgYXJndW1lbnQgdG8gbXNyIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxODMzCi1tc2dpZCAicmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxODkwCi1tc2dpZCAicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbXVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxOTQ3Ci1tc2dpZCAicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbWxhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMDc0Ci1tc2dpZCAiYmFkX3NlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIxMjEgY29uZmlnL3RjLWFybS5jOjIxOTkKLW1zZ2lkICJTaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMTYzCi1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgc2hpZnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIxOTIKLW1zZ2lkICJzaGlmdCByZXF1aXJlcyByZWdpc3RlciBvciAjZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjE5MwotbXNnaWQgInNoaWZ0IHJlcXVpcmVzICNleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMzM2IGNvbmZpZy90Yy1hcm0uYzoyNzcwCi1tc2dpZCAiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjQzMgotbXNnaWQgIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI0MzUKLW1zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBvciBpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjU3NAotbXNnaWQgImFkZHJlc3Mgb2Zmc2V0IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjY0NQotbXNnaWQgIlByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGhhbGZ3b3JkcyBvciBzaWduZWQgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI2NjcKLW1zZ2lkICJBZGRyZXNzIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNjk4IGNvbmZpZy90Yy1hcm0uYzoyNzEyIGNvbmZpZy90Yy1hcm0uYzoyNzUwCi1tc2dpZCAiZGVzdGluYXRpb24gcmVnaXN0ZXIgc2FtZSBhcyB3cml0ZS1iYWNrIGJhc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjc5MAotbXNnaWQgImxpdGVyYWwgcG9vbCBpbnNlcnRpb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyODI2Ci1tc2dpZCAiUHJlLWluY3JlbWVudCBpbnN0cnVjdGlvbiB3aXRoIHRyYW5zbGF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjg2OAotbXNnaWQgIkJhZCByYW5nZSBpbiByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyODc2IGNvbmZpZy90Yy1hcm0uYzoyODg1IGNvbmZpZy90Yy1hcm0uYzoyOTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IER1cGxpY2F0ZWQgcmVnaXN0ZXIgKHIlZCkgaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjg4OAotbXNnaWQgIldhcm5pbmc6IFJlZ2lzdGVyIHJhbmdlIG5vdCBpbiBhc2NlbmRpbmcgb3JkZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI5MDAKLW1zZ2lkICJNaXNzaW5nIGB9JyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjkxNgotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbWFzayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjk3NwotbXNnaWQgInIxNSBub3QgYWxsb3dlZCBhcyBiYXNlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozMDQ3IGNvbmZpZy90Yy1hcm0uYzozMDYxCi1tc2dpZCAicjE1IG5vdCBhbGxvd2VkIGluIHN3YXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjMxNTgKLW1zZ2lkICJVc2Ugb2YgcjE1IGluIGJ4IGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNDE3IGNvbmZpZy90Yy12ODUwLmM6MTkyMSBjb25maWcvdGMtdjg1MC5jOjE5NDIKLW1zZ2lkICJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNDIzCi1tc2dpZCAiQ29uc3RhbnQgdmFsdWUgcmVxdWlyZWQgZm9yIG51bWJlciBvZiByZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM0MzEKLW1zZ2lkICJudW1iZXIgb2YgcmVnaXN0ZXJzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFsxOjRdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNDkzCi1tc2dpZCAiUjE1IG5vdCBhbGxvd2VkIGFzIGJhc2UgcmVnaXN0ZXIgd2l0aCB3cml0ZS1iYWNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNzQ1Ci1tc2dpZCAibG8gcmVnaXN0ZXIgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM3NTMKLW1zZ2lkICJoaSByZWdpc3RlciByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzgyMwotbXNnaWQgImRlc3QgYW5kIHNvdXJjZTEgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzgzMAotbXNnaWQgInN1YnRyYWN0IHZhbGlkIG9ubHkgb24gbG8gcmVncyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzg1NAotbXNnaWQgImludmFsaWQgSGkgcmVnaXN0ZXIgd2l0aCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4ODEgY29uZmlnL3RjLWFybS5jOjM5MTQgY29uZmlnL3RjLWFybS5jOjM5MjQKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozODkyCi1tc2dpZCAiaW52YWxpZCBpbW1lZGlhdGUgdmFsdWUgZm9yIHN0YWNrIGFkanVzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzkwMwotbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozOTkwCi1tc2dpZCAic291cmNlMSBhbmQgZGVzdCBtdXN0IGJlIHNhbWUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQwMjUKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc2hpZnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQxMDQKLW1zZ2lkICJvbmx5IGxvIHJlZ3MgYWxsb3dlZCB3aXRoIGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDEyMwotbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MTc4Ci1tc2dpZCAiZXhwZWN0ZWQgJ10nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MjQ1Ci1tc2dpZCAiYnl0ZSBvciBoYWxmd29yZCBub3QgdmFsaWQgZm9yIGJhc2UgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyNTAKLW1zZ2lkICJSMTUgYmFzZWQgc3RvcmUgbm90IGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyNTUKLW1zZ2lkICJJbnZhbGlkIGJhc2UgcmVnaXN0ZXIgZm9yIHJlZ2lzdGVyIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDI3MwotbXNnaWQgImludmFsaWQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0Mjg0Ci1tc2dpZCAiaW52YWxpZCBiYXNlIHJlZ2lzdGVyIGluIGxvYWQvc3RvcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQzMDggY29uZmlnL3RjLWFybS5jOjU0NjkgY29uZmlnL3RjLWFybS5jOjU0NzgKLSM6IGNvbmZpZy90Yy1hcm0uYzo1NDg1IGNvbmZpZy90Yy1hcm0uYzo1NDkyIGNvbmZpZy90Yy1hcm0uYzo1NDk5Ci1tc2dpZCAiSW52YWxpZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQzODYKLW1zZ2lkICJkZXN0IGFuZCBzb3VyY2UxIG9uZSBtdXN0IGJlIHRoZSBzYW1lIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0Mzk0Ci1tc2dpZCAiUnMgYW5kIFJkIG11c3QgYmUgZGlmZmVyZW50IGluIE1VTCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDUzOQotbXNnaWQgIiIKLSJJbnNlcnRlZCBtaXNzaW5nICchJzogbG9hZC9zdG9yZSBtdWx0aXBsZSBhbHdheXMgd3JpdGVzIGJhY2sgYmFzZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDU1NSBjb25maWcvdGMtYXJtLmM6NDY1NwotbXNnaWQgIkV4cHJlc3Npb24gdG9vIGNvbXBsZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ1NjEKLW1zZ2lkICJvbmx5IGxvLXJlZ3MgdmFsaWQgaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDYwOAotbXNnaWQgIlN5bnRheDogbGRyc1tiXSBSZCwgW1JiLCBSb10iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ2NzMKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QgdG8gcHVzaC9wb3AgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ4MTEKLW1zZ2lkICJWaXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjb25zdGFudCAoJXgpIGFmdGVyIGZpeHVwXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyMTUgY29uZmlnL3RjLWFybS5jOjUyMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGltbWVkaWF0ZSB2YWx1ZSBmb3Igb2Zmc2V0ICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyMzQgY29uZmlnL3RjLWFybS5jOjUyNTcKLW1zZ2lkICJpbnZhbGlkIGxpdGVyYWwgY29uc3RhbnQ6IHBvb2wgbmVlZHMgdG8gYmUgY2xvc2VyXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyNzQKLW1zZ2lkICJzaGlmdCBleHByZXNzaW9uIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTI5MiBjb25maWcvdGMtYXJtLmM6NTMwMQotbXNnaWQgIkludmFsaWQgc3dpIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUzMTEKLW1zZ2lkICJJbnZhbGlkIGV4cHJlc3Npb24gaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTMzOSBjb25maWcvdGMtYXJtLmM6NTM1NSBjb25maWcvdGMtbWlwcy5jOjk2NzgKLW1zZ2lkICJCcmFuY2ggb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1Mzc0Ci1tc2dpZCAiQnJhbmNoIHdpdGggbGluayBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU0NDEKLW1zZ2lkICJJbGxlZ2FsIHZhbHVlIGZvciBjby1wcm9jZXNzb3Igb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb2Zmc2V0LCB0YXJnZXQgbm90IHdvcmQgYWxpZ25lZCAoMHglMDhYKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTUzNQotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIGZvciBzdGFjayBhZGRyZXNzIGNhbGN1bGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uICh2YWx1ZSA9IDB4JTA4WCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1NTMKLW1zZ2lkICJJbnZhbGlkIDhiaXQgaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTYxCi1tc2dpZCAiSW52YWxpZCAzYml0IGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTU3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZTogJWQgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgVGh1bWIgc2hpZnQgdmFsdWU6ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NjA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCByZWxvY2F0aW9uIGZpeHVwIHR5cGUgKCVkKVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1Njc0Ci1tc2dpZCAiTGl0ZXJhbCByZWZlcmVuY2VkIGFjcm9zcyBzZWN0aW9uIGJvdW5kcnkgKEltcGxpY2l0IGR1bXA/KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTY5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKElNTUVESUFURSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU2OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChPRkZTRVRfSU1NKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTcyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0ICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU3NDAgY29uZmlnL3RjLW1pcHMuYzoxMTE2NiBjb25maWcvdGMtc2guYzoyMjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU3NTMKLW1zZ2lkICJtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1ODIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIG9wZXJhdG9yIC0tIHN0YXRlbWVudCBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU4NzMgY29uZmlnL3RjLWFybS5jOjU5MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3Bjb2RlIGAlcycgbXVzdCBoYXZlIHN1ZmZpeCBmcm9tIDwlcz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTg5OAotbXNnaWQgIldhcm5pbmc6IFVzZSBvZiB0aGUgJ252JyBjb25kaXRpb25hbCBpcyBkZXByZWNhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYwMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgJyVzJyBkb2VzIG5vdCBleGlzdFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyB0byBub24tZXhpc3RhbnQgcmVnaXN0ZXIgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjAzMgotbXNnaWQgImlnbm9yaW5nIGluY29tcGxldGUgLnJlcSBwc2V1c28gb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIEFQQ1Mgc3dpdGNoIC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYzMzQgY29uZmlnL3RjLWFybS5jOjYzNDUgY29uZmlnL3RjLWFybS5jOjYzNTYKLSM6IGNvbmZpZy90Yy1hcm0uYzo2MzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjM2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHByb2Nlc3NvciB2YXJpYW50IC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYzOTAKLW1zZ2lkICIiCi0iIEFSTSBTcGVjaWZpYyBBc3NlbWJsZXIgT3B0aW9uczpcbiIKLSIgIC1tW2FybV1bPHByb2Nlc3NvciBuYW1lPl0gc2VsZWN0IHByb2Nlc3NvciB2YXJpYW50XG4iCi0iICAtbVthcm1ddlsyfDJhfDN8M218NHw0dF0gIHNlbGVjdCBhcmNoaXRlY3R1cmUgdmFyaWFudFxuIgotIiAgLW10aHVtYiAgICAgICAgICAgICAgICAgICBvbmx5IGFsbG93IFRodW1iIGluc3RydWN0aW9uc1xuIgotIiAgLW10aHVtYi1pbnRlcndvcmsgICAgICAgICBtYXJrIHRoZSBhc3NlbWJsZWQgY29kZSBhcyBzdXBwb3J0aW5nICIKLSJpbnRlcndvcmtpbmdcbiIKLSIgIC1tYWxsICAgICAgICAgICAgICAgICAgICAgYWxsb3cgYW55IGluc3RydWN0aW9uXG4iCi0iICAtbWZwYTEwLCAtbWZwYTExICAgICAgICAgIHNlbGVjdCBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmVcbiIKLSIgIC1tZnBlLW9sZCAgICAgICAgICAgICAgICAgZG9uJ3QgYWxsb3cgZmxvYXRpbmctcG9pbnQgbXVsdGlwbGUgIgotImluc3RydWN0aW9uc1xuIgotIiAgLW1uby1mcHUgICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBhbnkgZmxvYXRpbmctcG9pbnQgaW5zdHJ1Y3Rpb25zLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDAxCi1tc2dpZCAiICAtayAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIFBJQyBjb2RlLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDA1Ci1tc2dpZCAiIgotIiAgLW1hcGNzLTMyLCAtbWFwY3MtMjYgICAgICBzcGVjaWZ5IHdoaWNoIEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZCB0byAiCi0idXNlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MDgKLW1zZ2lkICIgIC1tYXBjcy1mbG9hdCAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgYXJncyBhcmUgcGFzc2VkIGluIEZQIHJlZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQxMQotbXNnaWQgIiIKLSIgIC1tYXBjcy1yZWVudHJhbnQgICAgICAgICAgdGhlIGNvZGUgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQvcmVlbnRyYW50XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MTYKLW1zZ2lkICIgIC1tb2FiaSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgb2xkIEVMRiBBQklcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQyMQotbXNnaWQgIiIKLSIgIC1FQiAgICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIGNwdVxuIgotIiAgLUVMICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gY3B1XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY1OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgZnVuY3Rpb24gdHlwZTogJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoyMTgKLW1zZ2lkICIiCi0iRDEwViBvcHRpb25zOlxuIgotIi1PICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplLiAgV2lsbCBkbyBzb21lIG9wZXJhdGlvbnMgaW4gcGFyYWxsZWwuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo1MjEgY29uZmlnL3RjLWQxMHYuYzo2MDMgY29uZmlnL3RjLWQzMHYuYzo2MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NjY0Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gbXVzdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCB3aXRoIGFub3RoZXIgaW5zdHJ1Y3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzE2Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gbXVzdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjcxOQotbXNnaWQgIkxvbmcgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgY29tYmluZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzU5Ci1tc2dpZCAiT25lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc2NCBjb25maWcvdGMtZDMwdi5jOjg0MwotbXNnaWQgIlR3byBJVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc2NiBjb25maWcvdGMtZDEwdi5jOjc3NCBjb25maWcvdGMtZDEwdi5jOjc4OQotIzogY29uZmlnL3RjLWQxMHYuYzo4MDIgY29uZmlnL3RjLWQzMHYuYzo4NDQgY29uZmlnL3RjLWQzMHYuYzo4NTMKLW1zZ2lkICJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc3MiBjb25maWcvdGMtZDMwdi5jOjg1MAotbXNnaWQgIlR3byBNVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc5MyBjb25maWcvdGMtZDMwdi5jOjg2OQotbXNnaWQgIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6ODA2IGNvbmZpZy90Yy1kMzB2LmM6ODgyCi1tc2dpZCAiTVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgcmlnaHQgY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6ODEwIGNvbmZpZy90Yy1kMzB2LmM6ODkwCi1tc2dpZCAidW5rbm93biBleGVjdXRpb24gdHlwZSBwYXNzZWQgdG8gd3JpdGVfMl9zaG9ydCgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTAyMyBjb25maWcvdGMtZDEwdi5jOjEwMzcgY29uZmlnL3RjLWg4MzAwLmM6MTI3OQotIzogY29uZmlnL3RjLWg4NTAwLmM6MTEyMiBjb25maWcvdGMtbWNvcmUuYzo4NDIgY29uZmlnL3RjLXNoLmM6MTA0MAotIzogY29uZmlnL3RjLXo4ay5jOjEyMjMKLW1zZ2lkICJjYW4ndCBmaW5kIG9wY29kZSAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMDUwIGNvbmZpZy90Yy1kMTB2LmM6MTA2OCBjb25maWcvdGMtZDMwdi5jOjEzNjgKLW1zZ2lkICJVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMTE2IGNvbmZpZy90Yy1kMzB2LmM6MTUwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wY29kZTogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMTk3IGNvbmZpZy90Yy1kMTB2LmM6MTM0MyBjb25maWcvdGMtdGljODAuYzo1MzcKLW1zZ2lkICJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTI0NiBjb25maWcvdGMtbTY4ay5jOjQyMzIKLW1zZ2lkICJ2YWx1ZSBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMzE4Ci1tc2dpZCAiaWxsZWdhbCBvcGVyYW5kIC0gcmVnaXN0ZXIgbmFtZSBmb3VuZCB3aGVyZSBub25lIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTM1NCBjb25maWcvdGMtdGljODAuYzo1NDgKLW1zZ2lkICJSZWdpc3RlciBudW1iZXIgbXVzdCBiZSBFVkVOIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTM4NSBjb25maWcvdGMtZDMwdi5jOjE3NTQgY29uZmlnL3RjLW1uMTAyMDAuYzoxMjM0Ci0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjE0MjUgY29uZmlnL3RjLXBwYy5jOjUwMDQgY29uZmlnL3RjLXY4NTAuYzoyMjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiByZXAgb3IgcmVwaSBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgNCBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxNTE3IGNvbmZpZy90Yy1kMzB2LmM6MTkzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWdpc3RlciBuYW1lICVzIGNvbmZsaWN0cyB3aXRoIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6Mjc2Ci1tc2dpZCAiIgotIlxuIgotIkQzMFYgb3B0aW9uczpcbiIKLSItTyAgICAgICAgICAgICAgICAgICAgICBNYWtlIGFkamFjZW50IHNob3J0IGluc3RydWN0aW9ucyBwYXJhbGxlbCBpZiAiCi0icG9zc2libGUuXG4iCi0iLW4gICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBhbGwgTk9QcyBpbnNlcnRlZCBieSB0aGUgYXNzZW1ibGVyLlxuIgotIi1OXHRcdFx0V2FybiBhYm91dCBOT1BzIGluc2VydGVkIGFmdGVyIHdvcmQgbXVsdGlwbGllcy5cbiIKLSItYyAgICAgICAgICAgICAgICAgICAgICBXYXJuIGFib3V0IHN5bWJvbHMgd2hvZXMgbmFtZXMgbWF0Y2ggcmVnaXN0ZXIgIgotIm5hbWVzLlxuIgotIi1DICAgICAgICAgICAgICAgICAgICAgIE9wcG9zaXRlIG9mIC1DLiAgLWMgaXMgdGhlIGRlZmF1bHQuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo0NTAKLW1zZ2lkICJ1bmV4cGVjdGVkIDEyLWJpdCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NDU3Ci1tc2dpZCAidW5leHBlY3RlZCAxOC1iaXQgcmVsb2MgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBOT1AgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo3MDIKLW1zZ2lkICJzZXF1ZW50aWFsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NzAyCi1tc2dpZCAicGFyYWxsZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo4MzkKLW1zZ2lkICJJbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjg1MiBjb25maWcvdGMtZDMwdi5jOjg1OSBjb25maWcvdGMtZDMwdi5jOjg3NQotIzogY29uZmlnL3RjLWQzMHYuYzo4ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjg3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzcGVjaWFsIGxlZnQgaW5zdHJ1Y3Rpb24gYCVzJyBraWxscyBpbnN0cnVjdGlvbiBgJXMnIGluIHJpZ2h0IGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEyNTAgY29uZmlnL3RjLWQzMHYuYzoxMjY3Ci1tc2dpZCAiQ2Fubm90IGFzc2VtYmxlIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTI1MgotbXNnaWQgIkZpcnN0IG9wY29kZSBpcyBsb25nLiAgVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEzMjAKLW1zZ2lkICJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCBsb2FkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTMyMgotbXNnaWQgIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIDE2LWJpdCBtdWx0aXBseSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEzNTIKLW1zZ2lkICJJbnN0cnVjdGlvbiB1c2VzIGxvbmcgdmVyc2lvbiwgc28gaXQgY2Fubm90IGJlIG1peGVkIGFzIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE0MzYgY29uZmlnL3RjLWQzMHYuYzoxNDczCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gY29uZGl0aW9uIGNvZGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjbXB1IGRvZXNuJ3Qgc3VwcG9ydCBjb25kaXRpb24gY29kZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE1MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZHMgZm9yIG9wY29kZSBgJXMnIGRvIG5vdCBtYXRjaCBhbnkgdmFsaWQgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTcyNwotbXNnaWQgIk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIGJ5dGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIHNob3J0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTgzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIHNob3J0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTg0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgcXVhZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjIwMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidmFsdWUgdG9vIGxhcmdlIHRvIGZpdCBpbiAlZCBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjI1NCBjb25maWcvdGMtaDgzMDAuYzoyNjIKLW1zZ2lkICJSZWcgbm90IHZhbGlkIGZvciBIOC8zMDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6NDIzIGNvbmZpZy90Yy1oODMwMC5jOjQyNiBjb25maWcvdGMtaDgzMDAuYzo0MjkKLSM6IGNvbmZpZy90Yy1oODMwMC5jOjQzMwotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjQ5MCBjb25maWcvdGMtaDgzMDAuYzo1NTMgY29uZmlnL3RjLWg4MzAwLmM6NTYwCi1tc2dpZCAiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjUxOCBjb25maWcvdGMtaDgzMDAuYzo1MjcgY29uZmlnL3RjLWg4MzAwLmM6NTM3Ci1tc2dpZCAiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo2MTcKLW1zZ2lkICJleHBlY3QgOjggb3IgOjE2IGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6ODIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgJXMweCVseCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjkxMAotbXNnaWQgIkNhbid0IHdvcmsgb3V0IHNpemUgb2Ygb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo5NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3Bjb2RlIGAlcycgd2l0aCB0aGVzZSBvcGVyYW5kIHR5cGVzIG5vdCBhdmFpbGFibGUgaW4gSDgvMzAwIG1vZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTAxNiBjb25maWcvdGMtaDgzMDAuYzoxMDM2Ci1tc2dpZCAiTmVlZCAjMSBvciAjMiBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEwMzEKLW1zZ2lkICIjNCBub3QgdmFsaWQgb24gSDgvMzAwLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMTEyIGNvbmZpZy90Yy1oODMwMC5jOjExNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYnJhbmNoIG9wZXJhbmQgaGFzIG9kZCBvZmZzZXQgKCVseClcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMTkxCi1tc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjAxCi1tc2dpZCAic291cmNlIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjA5Ci1tc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTIxNgotbXNnaWQgImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjI1Ci1tc2dpZCAic291cmNlIG9wZXJhbmQgbXVzdCBiZSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMzMKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyOTAgY29uZmlnL3RjLWg4NTAwLmM6MTEyOSBjb25maWcvdGMtbWlwcy5jOjc5MzIKLSM6IGNvbmZpZy90Yy1zaC5jOjEwNDcgY29uZmlnL3RjLXc2NS5jOjc1OSBjb25maWcvdGMtejhrLmM6MTIzNQotbXNnaWQgInVua25vd24gb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEzMzYKLW1zZ2lkICJtaXNtYXRjaCBiZXR3ZWVuIG9wY29kZSBzaXplIGFuZCBvcGVyYW5kIHNpemUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTM0OCBjb25maWcvdGMtaDg1MDAuYzoxMTU3IGNvbmZpZy90Yy1zaC5jOjExNDQKLSM6IGNvbmZpZy90Yy13NjUuYzo3OTEgY29uZmlnL3RjLXo4ay5jOjEyOTAKLW1zZ2lkICJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMzYyIGNvbmZpZy90Yy1oODUwMC5jOjExNzEgY29uZmlnL3RjLXNoLmM6MTE1MQotIzogY29uZmlnL3RjLXc2NS5jOjgwNSBjb25maWcvdGMtejhrLmM6MTMwNAotbXNnaWQgImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjE0NTEgY29uZmlnL3RjLWg4NTAwLmM6MTI2MCBjb25maWcvdGMtejhrLmM6MTQxNQotbXNnaWQgImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTQ2MSBjb25maWcvdGMtejhrLmM6MTQyNQotbXNnaWQgImNhbGwgdG8gbWRfY29udmVydF9mcmFnIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjE1MDYgY29uZmlnL3RjLXo4ay5jOjE1MDAKLW1zZ2lkICJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6MzM3Ci1tc2dpZCAiOjI0IG5vdCB2YWxpZCBmb3IgdGhpcyBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6MzQ0Ci1tc2dpZCAiZXhwZWN0IDo4LDoxNiBvciA6MjQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NDAxCi1tc2dpZCAic3ludGF4IGVycm9yIGluIHJlZyBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjQxOQotbXNnaWQgIm1pc3NpbmcgZmluYWwgcmVnaXN0ZXIgaW4gcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NTA2IGNvbmZpZy90Yy1oODUwMC5jOjUxMyBjb25maWcvdGMtaDg1MDAuYzo1MTkKLW1zZ2lkICJleHBlY3RlZCBAKGV4cCwgUm4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjUzNQotbXNnaWQgIkBSbisgbmVlZHMgd29yZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo1NDUKLW1zZ2lkICJAUm4gbmVlZHMgd29yZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo4NDUgY29uZmlnL3RjLXNoLmM6ODQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaGFuZGxlZCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjg3MyBjb25maWcvdGMtc2guYzo4NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo5NjMgY29uZmlnL3RjLXNoLmM6OTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCBmb3IgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzoxMTQ1IGNvbmZpZy90Yy1zaC5jOjEwODIgY29uZmlnL3RjLXc2NS5jOjc3OQotbXNnaWQgImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEwOTYKLW1zZ2lkICJNaXNzaW5nIC5leGl0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMDk5Ci1tc2dpZCAiTWlzc2luZyAucHJvY2VuZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTEwOAotbXNnaWQgIk5vdCBpbiBhIHNwYWNlLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTExMQotbXNnaWQgIk5vdCBpbiBhIHN1YnNwYWNlLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTI3MwotbXNnaWQgIkludmFsaWQgZmllbGQgc2VsZWN0b3IuICBBc3N1bWluZyBGJSUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTMwNAotbXNnaWQgIi1SIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzMjYgY29uZmlnL3RjLWk4NjAuYzoxOTEgY29uZmlnL3RjLXNwYXJjLmM6NzA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBsb3Npbmcgb3Bjb2RlOiBgJXMnIFwiJXNcIlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTM4OCBjb25maWcvdGMtaHBwYS5jOjUxODMgY29uZmlnL3RjLWhwcGEuYzo1MjM1Ci1tc2dpZCAiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzOTEgY29uZmlnL3RjLWhwcGEuYzo1MjM4Ci1tc2dpZCAiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE0OTQgY29uZmlnL3RjLWhwcGEuYzozNDYzCi1tc2dpZCAiY291bGQgbm90IHVwZGF0ZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNjI1Ci1tc2dpZCAiSW52YWxpZCBJbmRleGVkIExvYWQgQ29tcGxldGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE2MzAKLW1zZ2lkICJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIgU3ludGF4LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE2NTQKLW1zZ2lkICJJbnZhbGlkIFNob3J0IExvYWQvU3RvcmUgQ29tcGxldGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE2ODEgY29uZmlnL3RjLWhwcGEuYzoxNjg2Ci1tc2dpZCAiSW52YWxpZCBTdG9yZSBCeXRlcyBTaG9ydCBDb21wbGV0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNjk2IGNvbmZpZy90Yy1ocHBhLmM6MTcyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uOiAlYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE3MTEKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE3NDMKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTgyMSBjb25maWcvdGMtaHBwYS5jOjE4OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE5NDggY29uZmlnL3RjLWhwcGEuYzoyMDI1Ci1tc2dpZCAiSW52YWxpZCBMb2dpY2FsIEluc3RydWN0aW9uIENvbmRpdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMDY3Ci1tc2dpZCAiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIwODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBCaXQgQnJhbmNoIENvbmRpdGlvbjogJWMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMjAyIGNvbmZpZy90Yy1ocHBhLmM6MjIzNSBjb25maWcvdGMtaHBwYS5jOjIyNzIKLW1zZ2lkICJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMzM1Ci1tc2dpZCAiSW52YWxpZCBTRlUgaWRlbnRpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIzNzUKLW1zZ2lkICJJbnZhbGlkIENPUFIgaWRlbnRpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjI1MDAgY29uZmlnL3RjLWhwcGEuYzoyNTIxIGNvbmZpZy90Yy1ocHBhLmM6MjU0MQotIzogY29uZmlnL3RjLWhwcGEuYzoyNTYxIGNvbmZpZy90Yy1ocHBhLmM6MjU4MQotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjYwNQotbXNnaWQgIkludmFsaWQgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjYyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG9wZXJhbmRzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzE2MwotbXNnaWQgIlVua25vd24gcmVsb2NhdGlvbiBlbmNvdW50ZXJlZCBpbiBtZF9hcHBseV9maXguIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzE3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBocHBhX2ZpeHVwIGVudHJ5IGZvciB0aGlzIGZpeHVwIChmaXhQID0gMHgleCwgdHlwZSA9IDB4JXgpXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozMzE1IGNvbmZpZy90Yy1ocHBhLmM6MzM0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmRlZmluZWQgcmVnaXN0ZXI6ICclcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzM3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJOb24tYWJzb2x1dGUgc3ltYm9sOiAnJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjMzOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5kZWZpbmVkIGFic29sdXRlIGNvbnN0YW50OiAnJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBGUCBDb21wYXJlIENvbmRpdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgRlAgT3BlcmFuZCBGb3JtYXQ6ICUzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM2MjQKLW1zZ2lkICJCYWQgc2VnbWVudCBpbiBleHByZXNzaW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM2NzUKLW1zZ2lkICJCYWQgc2VnbWVudCAoc2hvdWxkIGJlIGFic29sdXRlKS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgbG9jYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozODA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZGVzY3JpcHRpb246ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzgyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIE51bGxpZmljYXRpb246ICglYykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0MzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgLkNBTEwgYXJndW1lbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDQyMAotbXNnaWQgIi5jYWxsaW5mbyBpcyBub3Qgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NDQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZSQU1FIHBhcmFtZXRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgODogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0NTkKLW1zZ2lkICJWYWx1ZSBmb3IgRU5UUllfR1IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMy4uMThcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0NzEKLW1zZ2lkICJWYWx1ZSBmb3IgRU5UUllfRlIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMTIuLjIxXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NDgxCi1tc2dpZCAiVmFsdWUgZm9yIEVOVFJZX1NSIG11c3QgYmUgM1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDUzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIC5DQUxMSU5GTyBhcmd1bWVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NjI3Ci1tc2dpZCAiVGhlIC5FTlRFUiBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ2NDEKLW1zZ2lkICJNaXNwbGFjZWQgLmVudHJ5LiBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ2NDUKLW1zZ2lkICJNaXNzaW5nIC5jYWxsaW5mby4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NjkzCi1tc2dpZCAiLlJFRyBtdXN0IHVzZSBhIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDY5NQotbXNnaWQgIi5FUVUgbXVzdCB1c2UgYSBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ3NDYKLW1zZ2lkICIuRVhJVCBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NzUwCi1tc2dpZCAiTWlzc2luZyAuY2FsbGluZm8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NzU0Ci1tc2dpZCAiTm8gLkVOVFJZIGZvciB0aGlzIC5FWElUIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDc4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgZGVmaW5lIGV4cG9ydCBzeW1ib2w6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzaW5nIEVOVFJZIHJhdGhlciB0aGFuIENPREUgaW4gZXhwb3J0IGRpcmVjdGl2ZSBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0OTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCAuRVhQT1JULy5JTVBPUlQgYXJndW1lbnQgKGlnbm9yZWQpOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUwMTcKLW1zZ2lkICJNaXNzaW5nIGxhYmVsIG5hbWUgb24gLkxBQkVMIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTAyMgotbXNnaWQgImV4dHJhIC5MQUJFTCBhcmd1bWVudHMgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MDM3Ci1tc2dpZCAiVGhlIC5MRUFWRSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUwNzAKLW1zZ2lkICJVbnJlY29nbml6ZWQgLkxFVkVMIGFyZ3VtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBkZWZpbmUgc3RhdGljIHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUxMzcKLW1zZ2lkICJOZXN0ZWQgcHJvY2VkdXJlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUxNDcKLW1zZ2lkICJDYW5ub3QgYWxsb2NhdGUgdW53aW5kIGRlc2NyaXB0b3JcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUyNDIKLW1zZ2lkICJtaXNwbGFjZWQgLnByb2NlbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MjQ1Ci1tc2dpZCAiTWlzc2luZyAuY2FsbGluZm8gZm9yIHRoaXMgcHJvY2VkdXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTI0OAotbXNnaWQgIk1pc3NpbmcgLkVYSVQgZm9yIGEgLkVOVFJZIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTM0OAotbXNnaWQgIkludmFsaWQgLlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTM5NgotbXNnaWQgIkNhbid0IGNoYW5nZSBzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCBzcGFjZTogJyVzJyBBc3N1bWluZyBzcGFjZSBudW1iZXIgPSAwLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU1NjUKLW1zZ2lkICJNdXN0IGJlIGluIGEgc3BhY2UgYmVmb3JlIGNoYW5naW5nIG9yIGRlY2xhcmluZyBzdWJzcGFjZXMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NTY5Ci1tc2dpZCAiQ2FuJ3QgY2hhbmdlIHN1YnNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU2MDUKLW1zZ2lkICJQYXJhbWV0ZXJzIG9mIGFuIGV4aXN0aW5nIHN1YnNwYWNlIGNhbid0IGJlIG1vZGlmaWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTY1OAotbXNnaWQgIkFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU3MDAKLW1zZ2lkICJGSVJTVCBub3Qgc3VwcG9ydGVkIGFzIGEgLlNVQlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTcwMgotbXNnaWQgIkludmFsaWQgLlNVQlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTc0MgotbXNnaWQgIklnbm9yaW5nIHN1YnNwYWNlIGRlY2wgZHVlIHRvIEVMRiBCRkQgYnVncy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1OTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZmluZCBjb250YWluaW5nIHNwYWNlIGZvciAlcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1OTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3Vic3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2Njg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAnJXMnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY2OTIKLW1zZ2lkICJObyBtZW1vcnkgZm9yIHN5bWJvbCBuYW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjUwMgotbXNnaWQgInNhbWUgdHlwZSBvZiBwcmVmaXggdXNlZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjUzNgotbXNnaWQgIkJhZCBhcmd1bWVudCB0byBzeW50YXggZGlyZWN0aXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjYxOSBjb25maWcvdGMtbTY4ay5jOjM3NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjg1MQotbXNnaWQgIlVua25vd24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo4OTkgY29uZmlnL3RjLWkzODYuYzo0MzYwIGNvbmZpZy90Yy1tNjhrLmM6NzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6OTA5IGNvbmZpZy90Yy1pMzg2LmM6NDM3NCBjb25maWcvdGMtbTY4ay5jOjc3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMTAgY29uZmlnL3RjLWkzODYuYzoxMDk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIHN1Y2ggMzg2IGluc3RydWN0aW9uOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTAxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBtbmVtb25pYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMjYKLW1zZ2lkICJleHBlY3RpbmcgcHJlZml4OyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMjgKLW1zZ2lkICJleHBlY3RpbmcgbW5lbW9uaWM7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWR1bmRhbnQgJXMgcHJlZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTEwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3Rpbmcgc3RyaW5nIGluc3RydWN0aW9uIGFmdGVyIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSBvcGVyYW5kICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIGluIG9wZXJhbmQgJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmJhbGFuY2VkIGJyYWNrZXRzIGluIG9wZXJhbmQgJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGVyYW5kICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMjAyCi1tc2dpZCAiZXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEyMDcKLW1zZ2lkICJleHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jLiB3ZSBmb3VuZCBubyBtYXRjaAotIzogY29uZmlnL3RjLWkzODYuYzoxNDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN1ZmZpeCBvciBvcGVyYW5kcyBpbnZhbGlkIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSMuIFdhcm4gdGhlbSB0aGF0IGEgZGF0YSBvciBhZGRyZXNzIHNpemUgcHJlZml4IGRvZXNuJ3QgYWZmZWN0Ci0jLiBhc3NlbWJseSBvZiB0aGUgbmV4dCBsaW5lIG9mIGNvZGUuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE0NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNDY3IGNvbmZpZy90Yy1pMzg2LmM6MTQ4MgotbXNnaWQgImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE1NDggY29uZmlnL3RjLWkzODYuYzoxNTg5IGNvbmZpZy90Yy1pMzg2LmM6MTYxNgotbXNnaWQgInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNTYxIGNvbmZpZy90Yy1pMzg2LmM6MTU3OCBjb25maWcvdGMtaTM4Ni5jOjE2MDUKLW1zZ2lkICJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNjQ1IGNvbmZpZy90Yy1pMzg2LmM6MTY2NQotbXNnaWQgIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTY5MAotbXNnaWQgIiIKLSJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW4gYW5kIG5vIHJlZ2lzdGVyIG9wZXJhbmRzOyBjYW4ndCBzaXplICIKLSJpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiByZXZlcnNlZCBhcmd1bWVudHMgb24gZmFkZHAsIGZzdWJwLCBldGMuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE4MDMKLW1zZ2lkICJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcywlJSVzJyIKLW1zZ3N0ciAiIgotCi0jLiBleHRyYW5lb3VzIGBsJyBzdWZmaXggb24gZnAgaW5zbgotIzogY29uZmlnL3RjLWkzODYuYzoxODEwCi1tc2dpZCAidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjAyMgotbXNnaWQgInlvdSBjYW4ndCBgcG9wICUlY3MnIgotbXNnc3RyICIiCi0KLSMuIFVuaXhXYXJlIGZzdWIgbm8gYXJncyBpcyBhbGlhcyBmb3IgZnN1YnAsIGZhZGQgLT4gZmFkZHAsIGV0YwotIzogY29uZmlnL3RjLWkzODYuYzoyMDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInRyYW5zbGF0aW5nIHRvIGAlc3AnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjA4NCBjb25maWcvdGMtaTM4Ni5jOjIxODcgY29uZmlnL3RjLWkzODYuYzoyMjQ3Ci1tc2dpZCAic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIxMDQgY29uZmlnL3RjLWkzODYuYzoyMjExIGNvbmZpZy90Yy1pMzg2LmM6MjI2MAotbXNnaWQgIjE2LWJpdCBqdW1wIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYCVzJyBvbmx5IHRha2VzIGJ5dGUgZGlzcGxhY2VtZW50OyAlbGQgc2hvcnRlbmVkIHRvICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjI2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBoYW5kbGUgbm9uIGFic29sdXRlIHNlZ21lbnQgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1MjcKLW1zZ2lkICJPbmx5IDEgb3IgMiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNTU4IGNvbmZpZy90Yy1pMzg2LmM6Mjc4OAotbXNnaWQgIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjU3OSBjb25maWcvdGMtaTM4Ni5jOjI4MDkKLW1zZ2lkICJCYWQgcmVsb2Mgc3BlY2lmaWVyIGluIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNTk3IGNvbmZpZy90Yy1pMzg2LmM6Mjg0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBqdW5rIGAlcycgYWZ0ZXIgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jLiBtaXNzaW5nIG9yIGJhZCBleHByIGJlY29tZXMgYWJzb2x1dGUgMAotIzogY29uZmlnL3RjLWkzODYuYzoyNjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1pc3Npbmcgb3IgaW52YWxpZCBpbW1lZGlhdGUgZXhwcmVzc2lvbiBgJXMnIHRha2VuIGFzIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNjM5IGNvbmZpZy90Yy1pMzg2LmM6Mjg2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjY4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3Rpbmcgc2NhbGUgZmFjdG9yIG9mIDEsIDIsIDQsIG9yIDg6IGdvdCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzY2FsZSBmYWN0b3Igb2YgJWQgd2l0aG91dCBhbiBpbmRleCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMwMzcgY29uZmlnL3RjLWkzODYuYzozMDQzIGNvbmZpZy90Yy1pMzg2LmM6MzA1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgc2VnbWVudCBuYW1lIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozMjE4IGNvbmZpZy90Yy1pMzg2LmM6MzQ3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ0b28gbWFueSBtZW1vcnkgcmVmZXJlbmNlcyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMzMjkgY29uZmlnL3RjLWkzODYuYzozMzQyIGNvbmZpZy90Yy1pMzg2LmM6MzY1NAotIzogY29uZmlnL3RjLWkzODYuYzozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM0MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG1lbW9yeSBvcGVyYW5kIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkp1bmsgYCVzJyBhZnRlciByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM1ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgaW5kZXggcmVnaXN0ZXIgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM1OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGApJyBhZnRlciBzY2FsZSBmYWN0b3IgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM2MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGluZGV4IHJlZ2lzdGVyIG9yIHNjYWxlIGZhY3RvciBhZnRlciBgLCc7IGdvdCAnJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzYxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBiYXNlIHJlZ2lzdGVyIGluIGAlcyciCi1tc2dzdHIgIiIKLQotIy4gaXQncyBub3QgYSBtZW1vcnkgb3BlcmFuZDsgYXJnaCEKLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXIgJXMgYmVnaW5uaW5nIG9wZXJhbmQgJWQgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQwOTUKLW1zZ2lkICJCYWQgY2FsbCB0byBtZF9hdG9mICgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDE1NiBjb25maWcvdGMtaTM4Ni5jOjQxNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQyMjMKLW1zZ2lkICItbVx0XHRcdGRvIGxvbmcganVtcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDI2MwotbXNnaWQgIkdPVCBhbHJlYWR5IGluIHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQ0MDkgY29uZmlnL3RjLW1jb3JlLmM6MjEzMCBjb25maWcvdGMtc2guYzoyNDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTU3IGNvbmZpZy90Yy1pODYwLmM6MTYxCi1tc2dpZCAiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTgzIGNvbmZpZy90Yy1taXBzLmM6MTAxMyBjb25maWcvdGMtc3BhcmMuYzo2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjM0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBhbmRlZCBvcGNvZGUgYWZ0ZXIgZGVsYXllZCBicmFuY2g6IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzozNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhwYW5kZWQgb3Bjb2RlIGluIGR1YWwgbW9kZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjU4MAotbXNnaWQgIkZzcjEgZXF1YWxzIGZkZXN0IHdpdGggUGlwZWxpbmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjYzMQotbXNnaWQgIjUtYml0IGltbWVkaWF0ZSB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo3MjUKLW1zZ2lkICJJbGxlZ2FsIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6NzQ5IGNvbmZpZy90Yy1zcGFyYy5jOjIzMzgKLW1zZ2lkICJiYWQgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIyNi1iaXQgYnJhbmNoIHcvbyBwYyByZWxhdGl2ZSBzZXQ6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jLiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwKLSMuIGNoZWNrIGZvciBvdmVyZmxvdwotIzogY29uZmlnL3RjLWk4NjAuYzo4ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMjYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg5MSBjb25maWcvdGMtaTg2MC5jOjkyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDQtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg5NiBjb25maWcvdGMtaTg2MC5jOjkyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDItYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgMTYtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDgtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIG92ZXJmbG93OiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5NTEKLW1zZ2lkICJtZF9udW1iZXJfdG9fZGlzcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTYxCi1tc2dpZCAiaTg2MF9udW1iZXJfdG9fZmllbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjEwMDEKLW1zZ2lkICJpODYwX2NvbnZlcnRfZnJhZ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTAxMAotbXNnaWQgImk4NjBfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjU1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJIYXNoaW5nIHJldHVybmVkIFwiJXNcIi4iCi1tc2dzdHIgIiIKLQotIy4gT2Zmc2V0IG9mIGxhc3QgY2hhcmFjdGVyIGluIG9wY29kZSBtbmVtb25pYwotIzogY29uZmlnL3RjLWk5NjAuYzo1OTMKLW1zZ2lkICJicmFuY2ggcHJlZGljdGlvbiBpbnZhbGlkIG9uIHRoaXMgb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NjM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb3Bjb2RlLCBcIiVzXCIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgImltcHJvcGVyIG51bWJlciBvZiBvcGVyYW5kcy4gIGV4cGVjdGluZyAlZCwgZ290ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6Nzg2IGNvbmZpZy90Yy1tMzJyLmM6MTIzOQotbXNnaWQgIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjg3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJGaXh1cCBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCB3aWR0aCBvZiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjk5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjEwMTQKLW1zZ2lkICJJOTYwIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxMDE3Ci1tc2dpZCAiIgotIlxuIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiA5NjAgYXJjaGl0ZWN0dXJlXG4iCi0iLWJcdFx0XHRhZGQgY29kZSB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQgYnJhbmNoZXMgdGFrZW5cbiIKLSItbGluay1yZWxheFx0XHRwcmVzZXJ2ZSBpbmRpdmlkdWFsIGFsaWdubWVudCBkaXJlY3RpdmVzIHNvIGxpbmtlclxuIgotIlx0XHRcdGNhbiBkbyByZWxheGluZyAoYi5vdXQgZm9ybWF0IG9ubHkpXG4iCi0iLW5vLXJlbGF4XHRcdGRvbid0IGFsdGVyIGNvbXBhcmUtYW5kLWJyYW5jaCBpbnN0cnVjdGlvbnMgZm9yXG4iCi0iXHRcdFx0bG9uZyBkaXNwbGFjZW1lbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNDI1Ci1tc2dpZCAidG9vIG1hbnkgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNDg1IGNvbmZpZy90Yy1pOTYwLmM6MTcxNQotbXNnaWQgImV4cHJlc3Npb24gc3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTUyMwotbXNnaWQgImF0dGVtcHQgdG8gYnJhbmNoIGludG8gZGlmZmVyZW50IHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRhcmdldCBvZiAlcyBpbnN0cnVjdGlvbiBtdXN0IGJlIGEgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNTY3Ci1tc2dpZCAidW5tYXRjaGVkICdbJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE1NzgKLW1zZ2lkICJnYXJiYWdlIGFmdGVyIGluZGV4IHNwZWMgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jLiBXZSBuZXZlciBtb3ZlZDogdGhlcmUgd2FzIG5vIG9wY29kZSBlaXRoZXIhCi0jOiBjb25maWcvdGMtaTk2MC5jOjE2NDUKLW1zZ2lkICJtaXNzaW5nIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE5NTMKLW1zZ2lkICJpbnZhbGlkIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjA2NgotbXNnaWQgImludmFsaWQgaW5kZXggcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMDg5Ci1tc2dpZCAiaW52YWxpZCBzY2FsZSBmYWN0b3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMjcyCi1tc2dpZCAidW5hbGlnbmVkIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjI5NQotbXNnaWQgIm5vIHN1Y2ggc2ZyIGluIHRoaXMgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjMzMwotbXNnaWQgImlsbGVnYWwgbGl0ZXJhbCIKLW1zZ3N0ciAiIgotCi0jLiBTaG91bGQgbm90IGhhcHBlbjogc2VlIGJsb2NrIGNvbW1lbnQgYWJvdmUKLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjU2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJUcnlpbmcgdG8gJ2JhbCcgdG8gJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNTc3Ci1tc2dpZCAiTG9va3MgbGlrZSBhIHByb2MsIGJ1dCBjYW4ndCB0ZWxsIHdoYXQga2luZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2MDkKLW1zZ2lkICJzaG91bGQgaGF2ZSAxIG9yIDIgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjE4IGNvbmZpZy90Yy1pOTYwLmM6MjYzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWRlZmluaW5nIGxlYWZwcm9jICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjY2NwotbXNnaWQgInNob3VsZCBoYXZlIHR3byBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2NzcKLW1zZ2lkICInZW50cnlfbnVtJyBtdXN0IGJlIGFic29sdXRlIG51bWJlciBpbiBbMCwzMV0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlZGVmaW5pbmcgZW50cnludW0gZm9yIHN5c3Byb2MgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNzk3Ci1tc2dpZCAiYXJjaGl0ZWN0dXJlIG9mIG9wY29kZSBjb25mbGljdHMgd2l0aCB0aGF0IG9mIGVhcmxpZXIgaW5zdHJ1Y3Rpb24ocykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyODE4Ci1tc2dpZCAiYmlnIGVuZGlhbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyODIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIHVucmVjb2duaXplZCAuZW5kaWFuIHR5cGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjMxMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGVhZnByb2Mgc3ltYm9sICclcycgdW5kZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MzEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBtYWtpbmcgbGVhZnByb2MgZW50cmllcyAlcyBhbmQgJXMgYm90aCBnbG9iYWxcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjMyNDIKLW1zZ2lkICJvcHRpb24gLS1saW5rLXJlbGF4IGlzIG9ubHkgc3VwcG9ydGVkIGluIGIub3V0IGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjMyODUKLW1zZ2lkICJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTkxCi1tc2dpZCAiIE0zMlIgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoxOTQKLW1zZ2lkICIiCi0iICAtd2Fybi11bm1hdGNoZWQtaGlnaCAgICB3YXJuIHdoZW4gYW4gKHMpaGlnaCByZWxvYyBoYXMgbm8gbWF0Y2hpbmcgbG93ICIKLSJyZWxvY1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTk2Ci1tc2dpZCAiICAtbm8td2Fybi11bm1hdGNoZWQtaGlnaCBkbyBub3Qgd2FybiBhYm91dCBtaXNzaW5nIGxvdyByZWxvY3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjE5OAotbXNnaWQgIiAgLVd1aCAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjIwMAotbXNnaWQgIiAgLVdudWggICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjIwNAotbXNnaWQgIiAgLXJlbGF4ICAgICAgICAgICAgICAgICBjcmVhdGUgbGlua2VyIHJlbGF4YWJsZSBjb2RlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyMDYKLW1zZ2lkICIgIC1jcHUtZGVzYyAgICAgICAgICAgICAgcHJvdmlkZSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzozMzEgcmVhZC5jOjI3NTUgcmVhZC5jOjQ4MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6NjMwIGNvbmZpZy90Yy1wcGMuYzoxMzM2IGNvbmZpZy90Yy1wcGMuYzozNTQwIHJlYWQuYzoxMzY4Ci1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjYzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIuU0NPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjY1MyBjb25maWcvdGMtcHBjLmM6MTM1OCBjb25maWcvdGMtcHBjLmM6MjI2NwotIzogY29uZmlnL3RjLXBwYy5jOjM1NjQKLW1zZ2lkICJpZ25vcmluZyBiYWQgYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6Njc5IGNvbmZpZy90Yy1wcGMuYzoxMzY5IGNvbmZpZy90Yy1wcGMuYzozNTc2IHJlYWQuYzoxMzg4Ci0jOiByZWFkLmM6MjEwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5zY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo5MzIKLW1zZ2lkICJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTE2MQotbXNnaWQgIlVubWF0Y2hlZCBoaWdoL3NoaWdoIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjQ2Ci1tc2dpZCAiVW5rbm93biBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcGljIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo3ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHBpYyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6ODg1IGNvbmZpZy90Yy1taXBzLmM6MTExNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IG1ha2UgJXMgcmVsb2NhdGlvbiBQQyByZWxhdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjk5OCBjb25maWcvdGMtdGFob2UuYzoxNTA1IGNvbmZpZy90Yy12YXguYzoxNzc0Ci1tc2dpZCAiTm8gb3BlcmF0b3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxMDI4IGNvbmZpZy90Yy10YWhvZS5jOjE1MjIgY29uZmlnL3RjLXZheC5jOjE3OTEKLW1zZ2lkICJVbmtub3duIG9wZXJhdG9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgwMwotbXNnaWQgImludmFsaWQgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODA4Ci1tc2dpZCAiZnB1ICg2ODA0MCwgNjgwNjAgb3IgNjg4ODEvNjg4ODIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgxMQotbXNnaWQgIm1tdSAoNjgwMzAgb3IgNjg4NTEpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgxNAotbXNnaWQgIjY4MDIwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MTcKLW1zZ2lkICI2ODAwMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODIwCi1tc2dpZCAiNjgwMTAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTg0OAotbXNnaWQgIm9wZXJhbmRzIG1pc21hdGNoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTkwNSBjb25maWcvdGMtbTY4ay5jOjE5MTEgY29uZmlnL3RjLW02OGsuYzoxOTE3Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxOTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJpZ251bSB0b28gYmlnIGZvciAlYyBmb3JtYXQ7IHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIwNDIKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjE1MgotbXNnaWQgIiIKLSJzY2FsZSBmYWN0b3IgaW52YWxpZCBvbiB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgY3B1MzIgb3IgNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjE1NwotbXNnaWQgImludmFsaWQgaW5kZXggc2l6ZSBmb3IgY29sZGZpcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMjEwCi1tc2dpZCAiRm9yY2luZyBieXRlIGRpc3BsYWNlbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIyMTIKLW1zZ2lkICJieXRlIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMjU5IGNvbmZpZy90Yy1tNjhrLmM6MjI5NwotbXNnaWQgImludmFsaWQgb3BlcmFuZCBtb2RlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjI4MyBjb25maWcvdGMtbTY4ay5jOjIzMTcKLW1zZ2lkICI6YiBub3QgcGVybWl0dGVkOyBkZWZhdWx0aW5nIHRvIDp3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjM5OQotbXNnaWQgInVuc3VwcG9ydGVkIGJ5dGUgdmFsdWU7IHVzZSBhIGRpZmZlcmVudCBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNDEzCi1tc2dpZCAidW5rbm93bi9pbmNvcnJlY3Qgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI0NDYgY29uZmlnL3RjLW02OGsuYzoyNDU0IGNvbmZpZy90Yy1tNjhrLmM6MjQ2MQotIzogY29uZmlnL3RjLW02OGsuYzoyNDY4Ci1tc2dpZCAib3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjUxOAotbXNnaWQgIkNhbid0IHVzZSBsb25nIGJyYW5jaGVzIG9uIDY4MDAwLzY4MDEwLzUyMDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNjA2Ci1tc2dpZCAiRXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2UsIHVzaW5nIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNzE4IGNvbmZpZy90Yy1tNjhrLmM6MjczNAotbXNnaWQgIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNzI0Ci1tc2dpZCAiV3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3NDAKLW1zZ2lkICJpbmNvcnJlY3QgcmVnaXN0ZXIgaW4gcmVnbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3NDYKLW1zZ2lkICJ3cm9uZyByZWdpc3RlciBpbiBmbG9hdGluZy1wb2ludCByZWdsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjgyMgotbXNnaWQgImZhaWxlZCBzYW5pdHkgY2hlY2siCi1tc2dzdHIgIiIKLQotIy4gRVJST1IKLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzE4NwotbXNnaWQgIkV4dHJhICkiCi1tc2dzdHIgIiIKLQotIy4gRVJST1IKLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzE5OAotbXNnaWQgIk1pc3NpbmcgKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjMyMTUKLW1zZ2lkICJNaXNzaW5nIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozNTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIC0tIHN0YXRlbWVudCBgJXMnIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozNTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkRvbid0IGtub3cgaG93IHRvIGZpZ3VyZSB3aWR0aCBvZiAlYyBpbiBtZF9hc3NlbWJsZSgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mzc1OSBjb25maWcvdGMtbTY4ay5jOjM3OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgRXJyb3I6IENhbid0IGZpbmQgJXMgaW4gaGFzaCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM3NjIgY29uZmlnL3RjLW02OGsuYzozNzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIEVycm9yOiBDYW4ndCBoYXNoICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM5MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIGRlZmF1bHQgY3B1IGAlcycgPz8/IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzkzOAotbXNnaWQgIjY4MDQwIGFuZCA2ODg1MSBzcGVjaWZpZWQ7IG1tdSBpbnN0cnVjdGlvbnMgbWF5IGFzc2VtYmxlIGluY29ycmVjdGx5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mzk1OAotbXNnaWQgIm9wdGlvbnMgZm9yIDY4ODgxIGFuZCBuby02ODg4MSBib3RoIGdpdmVuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mzk2MAotbXNnaWQgIm9wdGlvbnMgZm9yIDY4ODUxIGFuZCBuby02ODg1MSBib3RoIGdpdmVuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDAzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJ0ZXh0IGxhYmVsIGAlcycgYWxpZ25lZCB0byBvZGQgYm91bmRhcnkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MjQ4Ci1tc2dpZCAiaW52YWxpZCBieXRlIGJyYW5jaCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MzA1Ci1tc2dpZCAic2hvcnQgYnJhbmNoIHdpdGggemVybyBvZmZzZXQ6IHVzZSA6dyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQzNTEKLW1zZ2lkICJMb25nIGJyYW5jaCBvZmZzZXQgbm90IHN1cHBvcnRlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0NDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yIChsb25nIFBDLXJlbGF0aXZlIG9wZXJhbmQpIGZvciBpbnNuIDB4JTA0eCBhdCAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ0NDMKLW1zZ2lkICJkaXNwbGFjZW1lbnQgZG9lc24ndCBmaXQgaW4gb25lIGJ5dGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0NTU2Ci1tc2dpZCAiTG9uZyBicmFuY2ggb2Zmc2V0IHRvIGV4dGVybiBzeW1ib2wgbm90IHN1cHBvcnRlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0OTA1IGNvbmZpZy90Yy1tNjhrLmM6NDkxNgotbXNnaWQgImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0OTQ4Ci1tc2dpZCAiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ5ODEgY29uZmlnL3RjLW02OGsuYzo0OTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGRlYWwgd2l0aCBleHByZXNzaW9uOyBkZWZhdWx0aW5nIHRvICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUwMDcKLW1zZ2lkICJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIEJZVEUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MDExCi1tc2dpZCAiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBXT1JEIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTEwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZWNvZ25pemVkIHByb2Nlc3NvciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTE2OQotbXNnaWQgImJhZCBjb3Byb2Nlc3NvciBpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUxNzUKLW1zZ2lkICJ1bnJlY29nbml6ZWQgZm9wdCBvcHRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wdGlvbiBgJXMnIG1heSBub3QgYmUgbmVnYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUzMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3B0aW9uIGAlcycgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MzUzCi1tc2dpZCAiYmFkIGZvcm1hdCBvZiBPUFQgTkVTVD1kZXB0aCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU0MTYKLW1zZ2lkICJtaXNzaW5nIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTQ0MCBjb25maWcvdGMtbTY4ay5jOjU0NjkKLW1zZ2lkICJiYWQgcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU0NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIGxpc3Q6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTU0MAotbXNnaWQgInJlc3RvcmUgd2l0aG91dCBzYXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTcxNyBjb25maWcvdGMtbTY4ay5jOjYwNjYKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU3NjgKLW1zZ2lkICJtaXNzaW5nIGNvbmRpdGlvbiBjb2RlIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MTAwCi1tc2dpZCAibWlzc2luZyB0aGVuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjE4MgotbXNnaWQgImVsc2Ugd2l0aG91dCBtYXRjaGluZyBpZiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYyMTYKLW1zZ2lkICJlbmRpIHdpdGhvdXQgbWF0Y2hpbmcgaWYiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MjU3Ci1tc2dpZCAiYnJlYWsgb3V0c2lkZSBvZiBzdHJ1Y3R1cmVkIGxvb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2Mjk2Ci1tc2dpZCAibmV4dCBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYzNDgKLW1zZ2lkICJtaXNzaW5nID0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2Mzg2Ci1tc2dpZCAibWlzc2luZyB0byBvciBkb3dudG8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NDIyIGNvbmZpZy90Yy1tNjhrLmM6NjQ1NiBjb25maWcvdGMtbTY4ay5jOjY2NjYKLW1zZ2lkICJtaXNzaW5nIGRvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjU1OQotbXNnaWQgImVuZGYgd2l0aG91dCBmb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NjE1Ci1tc2dpZCAidW50aWwgd2l0aG91dCByZXBlYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NzAyCi1tc2dpZCAiZW5kdyB3aXRob3V0IHdoaWxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjgxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgb3B0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2ODYzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjkzMwotbXNnaWQgIiIKLSI2ODBYMCBvcHRpb25zOlxuIgotIi1sXHRcdFx0dXNlIDEgd29yZCBmb3IgcmVmcyB0byB1bmRlZmluZWQgc3ltYm9scyBbZGVmYXVsdCAyXVxuIgotIi1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjBcbiIKLSIgfCAtbTY4MzAyIHwgLW02ODMzMSB8IC1tNjgzMzIgfCAtbTY4MzMzIHwgLW02ODM0MCB8IC1tNjgzNjBcbiIKLSIgfCAtbWNwdTMyIHwgLW01MjAwXG4iCi0iXHRcdFx0c3BlY2lmeSB2YXJpYW50IG9mIDY4MFgwIGFyY2hpdGVjdHVyZSBbZGVmYXVsdCA2ODAyMF1cbiIKLSItbTY4ODgxIHwgLW02ODg4MiB8IC1tbm8tNjg4ODEgfCAtbW5vLTY4ODgyXG4iCi0iXHRcdFx0dGFyZ2V0IGhhcy9sYWNrcyBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3NvclxuIgotIlx0XHRcdFtkZWZhdWx0IHllcyBmb3IgNjgwMjAsIDY4MDMwLCBhbmQgY3B1MzJdXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTQzCi1tc2dpZCAiIgotIi1tNjg4NTEgfCAtbW5vLTY4ODUxXG4iCi0iXHRcdFx0dGFyZ2V0IGhhcy9sYWNrcyBtZW1vcnktbWFuYWdlbWVudCB1bml0IGNvcHJvY2Vzc29yXG4iCi0iXHRcdFx0W2RlZmF1bHQgeWVzIGZvciA2ODAyMCBhbmQgdXBdXG4iCi0iLXBpYywgLWtcdFx0Z2VuZXJhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuIgotIi1TXHRcdFx0dHVybiBqYnNyIGludG8ganNyXG4iCi0iLS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWxcbiIKLSJcdFx0XHRyZWNvZ25pemUgcmVnaXN0ZXIgbmFtZXMgd2l0aG91dCBwcmVmaXggY2hhcmFjdGVyXG4iCi0iLS1iaXR3aXNlLW9yXHRcdGRvIG5vdCB0cmVhdCBgfCcgYXMgYSBjb21tZW50IGNoYXJhY3RlclxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njk1MgotbXNnaWQgIiIKLSItLWJhc2Utc2l6ZS1kZWZhdWx0LTE2XHRiYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMTYgYml0c1xuIgotIi0tYmFzZS1zaXplLWRlZmF1bHQtMzJcdGJhc2UgcmVnIHdpdGhvdXQgc2l6ZSBpcyAzMiBiaXRzIChkZWZhdWx0KVxuIgotIi0tZGlzcC1zaXplLWRlZmF1bHQtMTZcdGRpc3BsYWNlbWVudCB3aXRoIHVua25vd24gc2l6ZSBpcyAxNiBiaXRzXG4iCi0iLS1kaXNwLXNpemUtZGVmYXVsdC0zMlx0ZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9yICVzIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9wY29kZSglZC4lcyk6ICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjIwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBoYXNoIGluc3RydWN0aW9uICclcyc6JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoyNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBtbmVtb25pYyAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6Mjc4Ci1tc2dpZCAiUGFyYW1ldGVyIHN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjMzMwotbXNnaWQgIlVua25vd24gcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSMuIEhhdmluZyB0aGlzIGhlcmUgcmVwZWF0cyB0aGUgd2FybmluZyBzb210aW1lcy4KLSMuIEJ1dCBjYW4ndCB3ZSBzdGFuZCB0aGF0PwotIzogY29uZmlnL3RjLW04OGsuYzo0NDYKLW1zZ2lkICJVc2Ugb2Ygb2Jzb2xldGUgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzo1NjMKLW1zZ2lkICJFeHByZXNzaW9uIHRydW5jYXRlZCB0byAxNiBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6NjI5IGNvbmZpZy90Yy1tODhrLmM6NjUxCi1tc2dpZCAiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gNSBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6ODczCi1tc2dpZCAiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gOSBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6ODk1Ci1tc2dpZCAiUmVtb3ZlZCBsb3dlciAyIGJpdHMgb2YgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEwMzQKLW1zZ2lkICJCYWQgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTA0NwotbXNnaWQgIm1kX251bWJlcl90b19kaXNwIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTA1NwotbXNnaWQgIm1kX251bWJlcl90b19maWVsZCBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjExNzAKLW1zZ2lkICJSZWxheGF0aW9uIHNob3VsZCBuZXZlciBvY2N1ciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEyNjcgY29uZmlnL3RjLXNwYXJjLmM6MzAyNSByZWFkLmM6MTk2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEzMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo0MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgZXhwZWN0ZWQsIGJ1dCBzYXcgJyUuNnMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjQ4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjb250cm9sIHJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo2NDUKLW1zZ2lkICJtb3JlIHRoYW4gNjVLIGxpdGVyYWwgcG9vbHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6Njk5Ci1tc2dpZCAibWlzc2luZyAnXSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NzM5Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGEgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NzQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQsIG5vdCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo3NzkKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjc4NgotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6ODAwIGNvbmZpZy90Yy1tY29yZS5jOjEzMDEgY29uZmlnL3RjLW1jb3JlLmM6MTM1NQotbXNnaWQgImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6ODQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3Bjb2RlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo4OTIKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyOiByMTUgaWxsZWdhbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo5NTEgY29uZmlnL3RjLW1jb3JlLmM6OTkwIGNvbmZpZy90Yy1tY29yZS5jOjEwMDkKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEwMjggY29uZmlnL3RjLW1jb3JlLmM6MTA1NSBjb25maWcvdGMtbWNvcmUuYzoxMDg0Ci0jOiBjb25maWcvdGMtbWNvcmUuYzoxMTIxIGNvbmZpZy90Yy1tY29yZS5jOjExNTYgY29uZmlnL3RjLW1jb3JlLmM6MTE3NQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTE5NCBjb25maWcvdGMtbWNvcmUuYzoxMjI2IGNvbmZpZy90Yy1tY29yZS5jOjEyNDgKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzMDQgY29uZmlnL3RjLW1jb3JlLmM6MTM1OCBjb25maWcvdGMtbWNvcmUuYzoxMzkzCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDQ3IGNvbmZpZy90Yy1tY29yZS5jOjE0NjkgY29uZmlnL3RjLW1jb3JlLmM6MTQ5MgotbXNnaWQgInNlY29uZCBvcGVyYW5kIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6OTY2Ci1tc2dpZCAiZGVzdGluYXRpb24gcmVnaXN0ZXIgbXVzdCBiZSByMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo5ODcKLW1zZ2lkICJzb3VyY2UgcmVnaXN0ZXIgbXVzdCBiZSByMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMDUwIGNvbmZpZy90Yy1tY29yZS5jOjExMDcKLW1zZ2lkICJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEwNzgKLW1zZ2lkICJ0cmFuc2xhdGluZyBiZ2VuaSB0byBtb3ZpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExMTUKLW1zZ2lkICJ0cmFuc2xhdGluZyBtZ2VuaSB0byBtb3ZpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExNDcKLW1zZ2lkICJ0cmFuc2xhdGluZyBibWFza2kgdG8gbW92aSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjM1Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlcjogcjAgYW5kIHIxNSBpbGxlZ2FsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyNjIKLW1zZ2lkICJiYWQgc3RhcnRpbmcgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaW52YWxpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjc1Ci1tc2dpZCAiZW5kaW5nIHJlZ2lzdGVyIG11c3QgYmUgcjE1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyOTUKLW1zZ2lkICJiYWQgYmFzZSByZWdpc3RlcjogbXVzdCBiZSByMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzEzCi1tc2dpZCAiZmlyc3QgcmVnaXN0ZXIgbXVzdCBiZSByNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzI0Ci1tc2dpZCAibGFzdCByZWdpc3RlciBtdXN0IGJlIHI3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzNjEKLW1zZ2lkICJyZWctcmVnIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE0NjYKLW1zZ2lkICJzZWNvbmQgb3BlcmFuZCBtdXN0IGJlIDEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTQ4NwotbXNnaWQgInplcm8gdXNlZCBhcyBpbW1lZGlhdGUgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmltcGxlbWVudGVkIG9wY29kZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTU2OCBjb25maWcvdGMtdzY1LmM6ODU2Ci1tc2dpZCAiQmFkIGNhbGwgdG8gTURfTlRPRigpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE2MzEKLW1zZ2lkICIiCi0iTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcbiIKLSIgIC17bm8tfWpzcmkyYnNyXHQgIHtkaXN9YWJsZSBqc3JpIHRvIGJzciB0cmFuc2Zvcm1hdGlvbiAoZGVmOiBkaXMpXG4iCi0iICAte25vLX1zaWZpbHRlclx0ICB7ZGlzfWFibGUgc2lsaWNvbiBmaWx0ZXIgYmVoYXZpb3IgKGRlZjogZGlzKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNjQ3Ci1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjazogc2hvcnRfanVtcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNjU4Ci1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjazogbG9uZ19qdW1wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE2ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2RkIGRpc3BsYWNlbWVudCBhdCAleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODM5Ci1tc2dpZCAidW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODQ0IGNvbmZpZy90Yy1uczMyay5jOjIyODEKLW1zZ2lkICI8dW5rbm93bj4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJvZGQgZGlzdGFuY2UgYnJhbmNoICgweCV4IGJ5dGVzKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBjcmVsIGZvciBicmFuY2ggdG8gJXMgdG9vIGZhciAoMHgleCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJwY3JlbCBmb3IgbHJ3L2ptcGkvanNyaSB0byAlcyB0b28gZmFyICgweCV4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBjcmVsIGZvciBsb29wdCB0b28gZmFyICgweCV4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoyMTEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSAlc3JlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MjExNAotbXNnaWQgInBjLXJlbGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTYwCi1tc2dpZCAidHJhcCBleGNlcHRpb24gbm90IHN1cHBvcnRlZCBhdCBJU0EgMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMDAKLW1zZ2lkICJDb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWw6IGNhbid0IGhhc2ggYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBiYWQgbWlwczE2IG9wY29kZTogJXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEyMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmV0dXJuZWQgZnJvbSBtaXBzX2lwKCVzKSBpbnNuX29wY29kZSA9IDB4JXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjE3MzkgY29uZmlnL3RjLW1pcHMuYzoxMTI3OQotbXNnaWQgImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxNzYxIGNvbmZpZy90Yy1taXBzLmM6MTc2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJqdW1wIHRvIG1pc2FsaWduZWQgYWRkcmVzcyAoMHglbHgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MjQxOSBjb25maWcvdGMtbWlwcy5jOjI3ODIKLW1zZ2lkICJNYWNybyBpbnN0cnVjdGlvbiBleHBhbmRlZCBpbnRvIG11bHRpcGxlIGluc3RydWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjI4MzUKLW1zZ2lkICJ1bnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjI4MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gJXMgcmVxdWlyZXMgYWJzb2x1dGUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjI5ODMKLW1zZ2lkICJOdW1iZXIgbGFyZ2VyIHRoYW4gMzIgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjMwMDQKLW1zZ2lkICJOdW1iZXIgbGFyZ2VyIHRoYW4gNjQgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjMyNzAgY29uZmlnL3RjLW1pcHMuYzozMzQyIGNvbmZpZy90Yy1taXBzLmM6NTAyMQotIzogY29uZmlnL3RjLW1pcHMuYzo1MDcyIGNvbmZpZy90Yy1taXBzLmM6NTYwOCBjb25maWcvdGMtbWlwcy5jOjU2NzEKLW1zZ2lkICJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozNTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJyYW5jaCAlcyBpcyBhbHdheXMgZmFsc2UgKG5vcCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozNTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJyYW5jaCBsaWtlbHkgJXMgaXMgYWx3YXlzIGZhbHNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzU5MyBjb25maWcvdGMtbWlwcy5jOjM2NjcgY29uZmlnL3RjLW1pcHMuYzozNzcwCi0jOiBjb25maWcvdGMtbWlwcy5jOjM4MjUgY29uZmlnL3RjLW1pcHMuYzo2NzA3IGNvbmZpZy90Yy1taXBzLmM6NjcxNgotIzogY29uZmlnL3RjLW1pcHMuYzo2NzI0IGNvbmZpZy90Yy1taXBzLmM6NjgzMwotbXNnaWQgIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSMuIHJlc3VsdCBpcyBhbHdheXMgdHJ1ZQotIzogY29uZmlnL3RjLW1pcHMuYzozNjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJyYW5jaCAlcyBpcyBhbHdheXMgdHJ1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjM5MDEgY29uZmlnL3RjLW1pcHMuYzo0MDA4Ci1tc2dpZCAiRGl2aWRlIGJ5IHplcm8uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NDU5MgotbXNnaWQgIk1JUFMgUElDIGNhbGwgdG8gcmVnaXN0ZXIgb3RoZXIgdGhhbiAkMjUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo0NTk3IGNvbmZpZy90Yy1taXBzLmM6NDcwOQotbXNnaWQgIk5vIC5jcHJlc3RvcmUgcHNldWRvLW9wIHVzZWQgaW4gUElDIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo0NzgyIGNvbmZpZy90Yy1taXBzLmM6NDg3MSBjb25maWcvdGMtbWlwcy5jOjUzNTkKLSM6IGNvbmZpZy90Yy1taXBzLmM6NTQwMCBjb25maWcvdGMtbWlwcy5jOjU0MTggY29uZmlnL3RjLW1pcHMuYzo2MDQ2Ci0jOiBjb25maWcvdGMtbWlwcy5jOjcwNTQKLW1zZ2lkICJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjU4NzcgY29uZmlnL3RjLW1pcHMuYzo2NjAxCi1tc2dpZCAiTWFjcm8gdXNlZCAkYXQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjYwMTcgY29uZmlnL3RjLW1pcHMuYzo2MDM1Ci1tc2dpZCAicm90YXRlIGNvdW50IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjYwODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgZmFsc2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2MjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkluc3RydWN0aW9uICVzOiByZXN1bHQgaXMgYWx3YXlzIHRydWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2Mzk0IGNvbmZpZy90Yy1taXBzLmM6NjQyMSBjb25maWcvdGMtbWlwcy5jOjY0OTMKLSM6IGNvbmZpZy90Yy1taXBzLmM6NjUxOAotbXNnaWQgIm9wZXJhbmQgb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIHRoZSBpdGJsIG1hY3Jvcywgc2luY2UgdGhleQotIy4gYXJlIGFkZGVkIGR5bmFtaWNhbGx5LgotIzogY29uZmlnL3RjLW1pcHMuYzo2NTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1hY3JvICVzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2ODY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKG1hc2sgZXJyb3IpOiAlcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjY5MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAodW5rbm93biBvcGVyYW5kIHR5cGUgYCVjJyk6ICVzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjkyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlIChiaXRzIDB4JWx4IHVuZGVmaW5lZCk6ICVzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzA1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGNvZGUgcmVxdWlyZXMgLW1pcHMlZCBvciBncmVhdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbXByb3BlciBzaGlmdCBhbW91bnQgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MTU0IGNvbmZpZy90Yy1taXBzLmM6ODI3MiBjb25maWcvdGMtbWlwcy5jOjgzODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcxNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBicmVhayBjb2RlICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzE4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIGxvd2VyIGJyZWFrIGNvZGUgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgc3lzY2FsbCBjb2RlICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJDb3Byb2NjZXNvciBjb2RlID4gMjUgYml0cyAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZGF0ZSBwZXJmb3JtYW5jZSByZWdzdGVyICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzI2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGZsb2F0IHJlZ2lzdGVyIG51bWJlciAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzQzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJGbG9hdCByZWdpc3RlciBzaG91bGQgYmUgZXZlbiwgd2FzICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzQ4NCBjb25maWcvdGMtbWlwcy5jOjc3MTYgY29uZmlnL3RjLW1pcHMuYzo3NzU1Ci1tc2dpZCAiYWJzb2x1dGUgZXhwcmVzc2lvbiByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc1NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc2NjIKLW1zZ2lkICJDYW4ndCB1c2UgZmxvYXRpbmcgcG9pbnQgaW5zbiBpbiB0aGlzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NzE4Ci1tc2dpZCAiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIDAuLjY1NTM1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzc1NwotbXNnaWQgIjE2IGJpdCBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAtMzI3NjguLjMyNzY3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzgyOQotbXNnaWQgImx1aSBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAwLi42NTUzNSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc4NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjb25kaXRpb24gY29kZSByZWdpc3RlciAkZmNjJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3ODYxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBjaGFyID0gJyVjJ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzg3NCBjb25maWcvdGMtbWlwcy5jOjg0MTIKLW1zZ2lkICJpbGxlZ2FsIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzk0MQotbXNnaWQgInVucmVjb2duaXplZCBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4MDUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbnVtYmVyICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4MTMxCi1tc2dpZCAidXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODMwNgotbXNnaWQgImNhbid0IHBhcnNlIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4MzQwIGNvbmZpZy90Yy1taXBzLmM6ODM3MAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjg1MzcKLW1zZ2lkICJleHRlbmRlZCBvcGVyYW5kIHJlcXVlc3RlZCBidXQgbm90IHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODUzOQotbXNnaWQgImludmFsaWQgdW5leHRlbmRlZCBvcGVyYW5kIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODU2NwotbXNnaWQgIm9wZXJhbmQgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgaW52YWxpZCBsZWFkaW5nICd2JyBpbiAtbWNwdT0lcyBzd2l0Y2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIC1tY3B1PSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTA2NAotbXNnaWQgIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIGVtYmVkZGVkIFBJQyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTA3NgotbXNnaWQgIi1jYWxsX3NoYXJlZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgRUxGIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwODIgY29uZmlnL3RjLW1pcHMuYzoxMDA5MyBjb25maWcvdGMtbWlwcy5jOjEwMjYxCi1tc2dpZCAiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBQSUMgY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwOTEKLW1zZ2lkICItbm9uX3NoYXJlZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgRUxGIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkxMDcKLW1zZ2lkICItRyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTEyCi1tc2dpZCAiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBvciBlbWJlZGRlZCBQSUMgY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkxMzYKLW1zZ2lkICJObyBjb21waWxlZCBpbiBzdXBwb3J0IGZvciA2NCBiaXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTE5NwotbXNnaWQgIiIKLSJNSVBTIG9wdGlvbnM6XG4iCi0iLW1lbWJlZGRlZC1waWNcdFx0Z2VuZXJhdGUgZW1iZWRkZWQgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuIgotIi1FQlx0XHRcdGdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG4iCi0iLUVMXHRcdFx0Z2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcbiIKLSItZywgLWcyXHRcdFx0ZG8gbm90IHJlbW92ZSB1bmVlZGVkIE5PUHMgb3Igc3dhcCBicmFuY2hlc1xuIgotIi1HIE5VTVx0XHRcdGFsbG93IHJlZmVyZW5jaW5nIG9iamVjdHMgdXAgdG8gTlVNIGJ5dGVzXG4iCi0iXHRcdFx0aW1wbGljaXRseSB3aXRoIHRoZSBncCByZWdpc3RlciBbZGVmYXVsdCA4XVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTIwNQotbXNnaWQgIiIKLSItbWlwczFcdFx0XHRnZW5lcmF0ZSBNSVBTIElTQSBJIGluc3RydWN0aW9uc1xuIgotIi1taXBzMlx0XHRcdGdlbmVyYXRlIE1JUFMgSVNBIElJIGluc3RydWN0aW9uc1xuIgotIi1taXBzM1x0XHRcdGdlbmVyYXRlIE1JUFMgSVNBIElJSSBpbnN0cnVjdGlvbnNcbiIKLSItbWlwczRcdFx0XHRnZW5lcmF0ZSBNSVBTIElTQSBJViBpbnN0cnVjdGlvbnNcbiIKLSItbWNwdT1DUFVcdFx0Z2VuZXJhdGUgY29kZSBmb3IgQ1BVLCB3aGVyZSBDUFUgaXMgb25lIG9mOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTIzMQotbXNnaWQgIiIKLSItbUNQVVx0XHRcdGVxdWl2YWxlbnQgdG8gLW1jcHU9Q1BVLlxuIgotIi1uby1tQ1BVXHRcdGRvbid0IGdlbmVyYXRlIGNvZGUgc3BlY2lmaWMgdG8gQ1BVLlxuIgotIlx0XHRcdEZvciAtbUNQVSBhbmQgLW5vLW1DUFUsIENQVSBtdXN0IGJlIG9uZSBvZjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyNDQKLW1zZ2lkICIiCi0iLW1pcHMxNlx0XHRcdGdlbmVyYXRlIG1pcHMxNiBpbnN0cnVjdGlvbnNcbiIKLSItbm8tbWlwczE2XHRcdGRvIG5vdCBnZW5lcmF0ZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MjQ3Ci1tc2dpZCAiIgotIi1PMFx0XHRcdHJlbW92ZSB1bm5lZWRlZCBOT1BzLCBkbyBub3Qgc3dhcCBicmFuY2hlc1xuIgotIi1PXHRcdFx0cmVtb3ZlIHVubmVlZGVkIE5PUHMgYW5kIHN3YXAgYnJhbmNoZXNcbiIKLSItLXRyYXAsIC0tbm8tYnJlYWtcdHRyYXAgZXhjZXB0aW9uIG9uIGRpdiBieSAwIGFuZCBtdWx0IG92ZXJmbG93XG4iCi0iLS1icmVhaywgLS1uby10cmFwXHRicmVhayBleGNlcHRpb24gb24gZGl2IGJ5IDAgYW5kIG11bHQgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyNTMKLW1zZ2lkICIiCi0iLUtQSUMsIC1jYWxsX3NoYXJlZFx0Z2VuZXJhdGUgU1ZSNCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG4iCi0iLW5vbl9zaGFyZWRcdFx0ZG8gbm90IGdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcbiIKLSIteGdvdFx0XHRcdGFzc3VtZSBhIDMyIGJpdCBHT1RcbiIKLSItMzJcdFx0XHRjcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlIChkZWZhdWx0KVxuIgotIi02NFx0XHRcdGNyZWF0ZSA2NCBiaXQgb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkzMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgcmVsb2Mgc2l6ZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk0MTMKLW1zZ2lkICJVbm1hdGNoZWQgJSVoaSByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk1MTgKLW1zZ2lkICJJbnZhbGlkIFBDIHJlbGF0aXZlIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTYxNyBjb25maWcvdGMtc3BhcmMuYzoyNjE3IGNvbmZpZy90Yy1zcGFyYy5jOjI2MjQKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI2MzEgY29uZmlnL3RjLXNwYXJjLmM6MjYzOCBjb25maWcvdGMtc3BhcmMuYzoyNjQ1Ci0jOiBjb25maWcvdGMtc3BhcmMuYzoyNjU0IGNvbmZpZy90Yy1zcGFyYy5jOjI2NjUgY29uZmlnL3RjLXNwYXJjLmM6MjY5MQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjcxNCB3cml0ZS5jOjk3MiB3cml0ZS5jOjEwMzYKLW1zZ2lkICJyZWxvY2F0aW9uIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTYzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJCcmFuY2ggdG8gb2RkIGFkZHJlc3MgKCVseCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5Nzg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUwOGx4ICBVTkRFRklORURcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk4NTQKLW1zZ2lkICJBbGlnbm1lbnQgbmVnYXRpdmU6IDAgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5OTQyCi1tc2dpZCAiTm8gcmVhZCBvbmx5IGRhdGEgc2VjdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk5NjUKLW1zZ2lkICJHbG9iYWwgcG9pbnRlcnMgbm90IHN1cHBvcnRlZDsgcmVjb21waWxlIC1HIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDA1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gc3VjaCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLm9wdGlvbiBwaWMlZCBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIG9wdGlvbiBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDE2MgotbXNnaWQgImBub3Jlb3JkZXInIG11c3QgYmUgc2V0IGJlZm9yZSBgbm9tYWNybyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDE5NwotbXNnaWQgInVua25vd24gSVNBIGxldmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAyMjAKLW1zZ2lkICIuc2V0IHBvcCB3aXRoIG5vIC5zZXQgcHVzaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRyaWVkIHRvIHNldCB1bnJlY29nbml6ZWQgc3ltYm9sOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAyOTQKLW1zZ2lkICIuY3Bsb2FkIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMzc2Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgdXNlIG9mIC5ncHdvcmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDUxMwotbXNnaWQgImV4cGVjdGVkIGAkJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNTIxCi1tc2dpZCAiQmFkIHJlZ2lzdGVyIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNTM3Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHJlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDczNAotbXNnaWQgInVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSB0byBkaWZmZXJlbnQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwODQzCi1tc2dpZCAidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwOTI2Ci1tc2dpZCAiQVQgdXNlZCBhZnRlciBcIi5zZXQgbm9hdFwiIG9yIG1hY3JvIHVzZWQgYWZ0ZXIgXCIuc2V0IG5vbWFjcm9cIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwOTg5Ci1tc2dpZCAiRG91YmxlIGNoZWNrIGZ4X3JfdHlwZSBpbiB0Yy1taXBzLmM6dGNfZ2VuX3JlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE0NzAKLW1zZ2lkICJtaXNzaW5nIGAuZW5kJyBhdCBlbmQgb2YgYXNzZW1ibHkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTQ4NQotbXNnaWQgIkV4cGVjdGVkIHNpbXBsZSBudW1iZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE1MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyVjJyAweCUwMnhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTEzCi1tc2dpZCAiSW52YWxpZCBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTU2OAotbXNnaWQgIi5lbmQgbm90IGluIHRleHQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTcyCi1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTU4MQotbXNnaWQgIi5lbmQgc3ltYm9sIGRvZXMgbm90IG1hdGNoIC5lbnQgc3ltYm9sLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTg0Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgbWlzc2luZyBvciB1bmtub3duIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNjU5Ci1tc2dpZCAiLmVudCBvciAuYWVudCBub3QgaW4gdGV4dCBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNjYyCi1tc2dpZCAibWlzc2luZyBgLmVuZCciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTY5NSBlY29mZi5jOjMyMjYKLW1zZ2lkICIuZnJhbWUgb3V0c2lkZSBvZiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE3MDYgZWNvZmYuYzozMjM3Ci1tc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTczNgotbXNnaWQgIi5tYXNrLy5mbWFzayBvdXRzaWRlIG9mIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTc0MwotbXNnaWQgIkJhZCAubWFzay8uZm1hc2sgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6MzE0Ci1tc2dpZCAiIgotIk1OMTAyMDAgb3B0aW9uczpcbiIKLSJub25lIHlldFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6Nzg5IGNvbmZpZy90Yy1tbjEwMzAwLmM6NzUwIGNvbmZpZy90Yy1wcGMuYzoxNjEzCi0jOiBjb25maWcvdGMtdjg1MC5jOjE2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjMzMwotbXNnaWQgIiIKLSJNTjEwMzAwIG9wdGlvbnM6XG4iCi0ibm9uZSB5ZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjc2OAotbXNnaWQgIkludmFsaWQgb3Bjb2RlL29wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTA5OQotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NDQzCi1tc2dpZCAiSW52YWxpZCBzeW50YXggaW4gUEMtcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjQ2NwotbXNnaWQgIkludmFsaWQgc3ludGF4IGluIEV4dGVybmFsIGFkZHJlc3NpbmcgbW9kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo1MzYKLW1zZ2lkICJJbnZhbGlkIHN5bnRheCBpbiBNZW1vcnkgUmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjYwMwotbXNnaWQgIkludmFsaWQgc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIChiLHcsZCxxKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo2MDgKLW1zZ2lkICJTeW50YXggaW4gc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIFtSbjptXSB3aGVyZSBuPVswLi43XSBtPXtiLHcsZCxxfSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo2MTQKLW1zZ2lkICJTY2FsZWQtaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NjIzCi1tc2dpZCAiSW52YWxpZCBvciBpbGxlZ2FsIGFkZHJlc3NpbmcgbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZC1pbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo3MzAKLW1zZ2lkICJQcmVtYXR1cmUgZW5kIG9mIHN1ZmZpeCAtLSBEZWZhdWx0aW5nIHRvIGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NzQzCi1tc2dpZCAiQmFkIHN1ZmZpeCBhZnRlciAnOicgdXNlIHtifHd8ZH0gRGVmYXVsdGluZyB0byBkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjc4NAotbXNnaWQgIlZlcnkgc2hvcnQgaW5zdHIgdG8gb3B0aW9uLCBpZSB5b3UgY2FuJ3QgZG8gaXQgb24gYSBOVUxMc3RyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjgyOAotbXNnaWQgIk5vIHN1Y2ggZW50cnkgaW4gbGlzdC4gKGNwdS9tbXUgcmVnaXN0ZXIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjg2OQotbXNnaWQgIkludGVybmFsIGNvbnNpc3RlbmN5IGVycm9yLiAgY2hlY2sgbnMzMmstb3Bjb2RlLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6ODkwCi1tc2dpZCAiQWRkcmVzcyBvZiBpbW1lZGlhdGUgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo4OTEKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSB3cml0ZSBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMDE4Ci1tc2dpZCAiQmFkIG9wY29kZS10YWJsZS1vcHRpb24sIGNoZWNrIGluIGZpbGUgbnMzMmstb3Bjb2RlLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTA0NwotbXNnaWQgIk5vIHN1Y2ggb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjExMTUKLW1zZ2lkICJCYWQgc3VmZml4LCBkZWZhdWx0aW5nIHRvIGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTEzNwotbXNnaWQgIlRvbyBtYW55IG9wZXJhbmRzIHBhc3NlZCB0byBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiBjaGVjayBlcnJvciBpbiBkZWZhdWx0Ci0jOiBjb25maWcvdGMtbnMzMmsuYzoxMTQ4Ci1tc2dpZCAiV3JvbmcgbnVtYmVycyBvZiBvcGVyYW5kcyBpbiBkZWZhdWx0LCBjaGVjayBuczMyay1vcGNvZGVzLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTE1MwotbXNnaWQgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMjcyCi1tc2dpZCAiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvYmluYXJ5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjEyODgKLW1zZ2lkICJCaWdudW0gdG9vIGJpZyBmb3IgbG9uZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMzYzCi1tc2dpZCAiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMzY4Ci1tc2dpZCAiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbbl0udHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBXZSBjYW50IHJlbGF4IHRoaXMgY2FzZQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQwMgotbXNnaWQgIkNhbid0IHJlbGF4IGRpZmZlcmVuY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQ1MQotbXNnaWQgIkRpc3BsYWNlbWVudCB0byBsYXJnZSBmb3IgOmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQ2MgotbXNnaWQgIkludGVybmFsIGxvZ2ljIGVycm9yIGluIGlpZi5paWZQW10udHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBzdG9yYWdlIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTUyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiBmb3Igc3RvcmFnZSB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE1NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgaGFzaCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTYzNgotbXNnaWQgIkJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNjQ1Ci1tc2dpZCAiV29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlLiAgbGluZSBudW1iZXIgbm90IHZhbGlkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE2NTkKLW1zZ2lkICJEb3VibGUgd29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgbG9naWMgZXJyb3IuICBsaW5lICVzLCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNzI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGxvZ2ljIGVycm9yLiBsaW5lICVzLCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxODM4Ci1tc2dpZCAiQml0IGZpZWxkIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoyMDg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIG9wdGlvbiAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjIxMDMKLW1zZ2lkICIiCi0iTlMzMksgb3B0aW9uczpcbiIKLSItbTMyMDMyIHwgLW0zMjUzMlx0c2VsZWN0IHZhcmlhbnQgb2YgTlMzMksgYXJjaGl0ZWN0dXJlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MjI4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgZmluZCByZWxvY2F0aW9uIHR5cGUgZm9yIHN5bWJvbCAlcywgY29kZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc3dpdGNoIC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjg3MQotbXNnaWQgIiIKLSJQb3dlclBDIG9wdGlvbnM6XG4iCi0iLXVcdFx0XHRpZ25vcmVkXG4iCi0iLW1wd3J4LCAtbXB3cjJcdFx0Z2VuZXJhdGUgY29kZSBmb3IgSUJNIFBPV0VSLzIgKFJJT1MyKVxuIgotIi1tcHdyXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgSUJNIFBPV0VSIChSSU9TMSlcbiIKLSItbTYwMVx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAxXG4iCi0iLW1wcGMsIC1tcHBjMzIsIC1tNDAzLCAtbTYwMywgLW02MDRcbiIKLSJcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYwMy82MDRcbiIKLSItbXBwYzY0LCAtbTYyMFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYyMFxuIgotIi1tcHBjNjRicmlkZ2VcdFx0Z2VuZXJhdGUgY29kZSBmb3IgUG93ZXJQQyA2NCwgaW5jbHVkaW5nIGJyaWRnZSBpbnNuc1xuIgotIi1tY29tXHRcdFx0Z2VuZXJhdGUgY29kZSBQb3dlci9Qb3dlclBDIGNvbW1vbiBpbnN0cnVjdGlvbnNcbiIKLSItbWFueVx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKFBXUi9QV1JYL1BQQylcbiIKLSItbXJlZ25hbWVzXHRcdEFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcbiIKLSItbW5vLXJlZ25hbWVzXHRcdERvIG5vdCBhbGxvdyBzeW1ib2xpYyBuYW1lcyBmb3IgcmVnaXN0ZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjg4NgotbXNnaWQgIiIKLSItbXJlbG9jYXRhYmxlXHRcdHN1cHBvcnQgZm9yIEdDQydzIC1tcmVsb2NhdGJsZSBvcHRpb25cbiIKLSItbXJlbG9jYXRhYmxlLWxpYlx0c3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlLWxpYiBvcHRpb25cbiIKLSItbWVtYlx0XHRcdHNldCBQUENfRU1CIGJpdCBpbiBFTEYgZmxhZ3NcbiIKLSItbWxpdHRsZSwgLW1saXR0bGUtZW5kaWFuXG4iCi0iXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmVcbiIKLSItbWJpZywgLW1iaWctZW5kaWFuXHRnZW5lcmF0ZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZVxuIgotIi1tc29sYXJpc1x0XHRnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG4iCi0iLW1uby1zb2xhcmlzXHRcdGRvIG5vdCBnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG4iCi0iLVZcdFx0XHRwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcbiIKLSItUXksIC1Rblx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjkyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIGRlZmF1bHQgY3B1ID0gJXMsIG9zID0gJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjk0NgotbXNnaWQgIk5laXRoZXIgUG93ZXIgbm9yIFBvd2VyUEMgb3Bjb2RlcyB3ZXJlIHNlbGVjdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6OTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgaW5zdHJ1Y3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjEwMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBtYWNybyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTIyMwotbXNnaWQgImlkZW50aWZpZXIrY29uc3RhbnRAZ290IG1lYW5zIGlkZW50aWZpZXJAZ290K2NvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxMjc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIHJlbG9jYXRpb25zIGRvIG5vdCBmaXQgaW4gJWQgYnl0ZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTM3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggb2YgLmxjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTQ1OQotbXNnaWQgIlJlbG9jYXRpb24gY2Fubm90IGJlIGRvbmUgd2hlbiB1c2luZyAtbXJlbG9jYXRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInN5bnRheCBlcnJvcjogaW52YWxpZCB0b2Mgc3BlY2lmaWVyIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE1NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ludGF4IGVycm9yOiBleHBlY3RlZCBgXScsIGZvdW5kICBgJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNzg4Ci1tc2dpZCAiW3RvY3ZdIHN5bWJvbCBpcyBub3QgYSB0b2Mgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNzk5Ci1tc2dpZCAiVW5pbXBsZW1lbnRlZCB0b2MzMiBleHByZXNzaW9uIG1vZGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxODA0Ci1tc2dpZCAiVW5pbXBsZW1lbnRlZCB0b2M2NCBleHByZXNzaW9uIG1vZGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxODA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIFslZF0gZnJvbSBwYXJzZV90b2NfZW50cnkhXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE5NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ludGF4IGVycm9yOyBmb3VuZCBgJWMnIGJ1dCBleHBlY3RlZCBgJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMDY4Ci1tc2dpZCAid3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMTI0Ci1tc2dpZCAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZTogd2FudCBhLHcseCxlIGluIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjI0MgotbXNnaWQgIm1pc3Npbmcgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjI1MQotbXNnaWQgIm5lZ2F0aXZlIHNpemUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIyOTIKLW1zZ2lkICJtaXNzaW5nIHJlYWwgc3ltYm9sIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIzMTMKLW1zZ2lkICJhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjU0NAotbXNnaWQgIlRoZSBYQ09GRiBmaWxlIGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjY1MiBjb25maWcvdGMtcHBjLmM6MzE2NCByZWFkLmM6Mjk1MAotbXNnaWQgIm1pc3NpbmcgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI2NzAKLW1zZ2lkICJpbGxlZ2FsIC5zdGFieCBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI3MDIKLW1zZ2lkICJtaXNzaW5nIGNsYXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNzExCi1tc2dpZCAibWlzc2luZyB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNzcyCi1tc2dpZCAibWlzc2luZyBzeW1ib2wgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6Mjk0NAotbXNnaWQgIm5lc3RlZCAuYnMgYmxvY2tzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyOTc3Ci1tc2dpZCAiLmVzIHdpdGhvdXQgcHJlY2VkaW5nIC5icyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MzE1NgotbXNnaWQgIm5vbi1jb25zdGFudCBieXRlIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozMjAxCi1tc2dpZCAiLnRjIG5vdCBpbiAudG9jIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjMyMjAKLW1zZ2lkICIudGMgd2l0aCBubyBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MzI5NQotbXNnaWQgIk5vIHByZXZpb3VzIHNlY3Rpb24gdG8gcmV0dXJuIHRvLiBEaXJlY3RpdmUgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIy4gU2VjdGlvbiBDb250ZW50cwotIy4gdW5rbm93bgotIzogY29uZmlnL3RjLXBwYy5jOjM3MTQKLW1zZ2lkICJVbnN1cHBvcnRlZCBzZWN0aW9uIGF0dHJpYnV0ZSAtLSAnYSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjM5MDQKLW1zZ2lkICJiYWQgc3ltYm9sIHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6Mzk5NQotbXNnaWQgIlVucmVjb2duaXplZCBzeW1ib2wgc3VmZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0MDc3Ci1tc2dpZCAidHdvIC5mdW5jdGlvbiBwc2V1ZG8tb3BzIHdpdGggbm8gaW50ZXJ2ZW5pbmcgLmVmIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0MDg5Ci1tc2dpZCAiLmVmIHdpdGggbm8gcHJlY2VkaW5nIC5mdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDIxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3YXJuaW5nOiBzeW1ib2wgJXMgaGFzIG5vIGNzZWN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0NTEzCi1tc2dpZCAic3ltYm9sIGluIC50b2MgZG9lcyBub3QgbWF0Y2ggYW55IC50YyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDgxMAotbXNnaWQgInVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDg2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZW1pdCBQQyByZWxhdGl2ZSAlcyByZWxvY2F0aW9uIGFnYWluc3QgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ4NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDkzMQotbXNnaWQgIm11c3QgYnJhbmNoIHRvIGFuIGFkZHJlc3MgYSBtdWx0aXBsZSBvZiA0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0OTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkBsb2NhbCBvciBAcGx0IGJyYW5jaCBkZXN0aW5hdGlvbiBpcyB0b28gZmFyIGF3YXksICVsZCBieXRlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDk1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJHYXMgZmFpbHVyZSwgcmVsb2MgdmFsdWUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo1MjEKLW1zZ2lkICJpbGxlZ2FsIHJlZ2lzdGVyIGFmdGVyIEAtIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjUzNwotbXNnaWQgIm11c3QgYmUgQChyMCwuLi4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjU1MwotbXNnaWQgInN5bnRheCBlcnJvciBpbiBAKHIwLC4uLikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NTg1IGNvbmZpZy90Yy1zaC5jOjU5MAotbXNnaWQgInN5bnRheCBlcnJvciBpbiBAKGRpc3AsW1JuLCBnYnIsIHBjXSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NTk1Ci1tc2dpZCAiZXhwZWN0aW5nICkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NjA0Ci1tc2dpZCAiaWxsZWdhbCByZWdpc3RlciBhZnRlciBAIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjEyMjgKLW1zZ2lkICIudXNlcyBwc2V1ZG8tb3Agc2VlbiB3aGVuIG5vdCByZWxheGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMjM0Ci1tc2dpZCAiYmFkIC51c2VzIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMjg5Ci1tc2dpZCAiIgotIlNIIG9wdGlvbnM6XG4iCi0iLWxpdHRsZVx0XHRcdGdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gY29kZVxuIgotIi1yZWxheFx0XHRcdGFsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHNcbiIKLSItc21hbGxcdFx0XHRhbGlnbiBzZWN0aW9ucyB0byA0IGJ5dGUgYm91bmRhcmllcywgbm90IDE2XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTI5OSBjb25maWcvdGMtdzY1LmM6ODgzCi1tc2dpZCAiY2FsbCB0byB0Y19Ob3V0X2ZpeF90b19jaGFycyBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMzg1Ci1tc2dpZCAiLnVzZXMgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNDA0Ci1tc2dpZCAiY2FuJ3QgZmluZCBmaXh1cCBwb2ludGVkIHRvIGJ5IC51c2VzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE0MjcKLW1zZ2lkICIudXNlcyB0YXJnZXQgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE2NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCBvdmVyZmxvd3MgOC1iaXQgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTY1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTY1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIHVuZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDgtYml0IGZpZWxkICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm92ZXJmbG93IGluIGJyYW5jaCB0byAlczsgY29udmVydGVkIGludG8gbG9uZ2VyIGluc3RydWN0aW9uIHNlcXVlbmNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE3ODIgY29uZmlnL3RjLXNoLmM6MTgxMCBjb25maWcvdGMtc3BhcmMuYzozNDM2Ci0jOiBjb25maWcvdGMtc3BhcmMuYzozNDU1Ci1tc2dpZCAibWlzYWxpZ25lZCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE5ODggY29uZmlnL3RjLXNoLmM6MTk5NSBjb25maWcvdGMtc2guYzoyMDAyCi0jOiBjb25maWcvdGMtc2guYzoyMDA5Ci1tc2dpZCAicGNyZWwgdG9vIGZhciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoyMDczCi1tc2dpZCAibWlzYWxpZ25lZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MjA4MQotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjU3Ci1tc2dpZCAiSW52YWxpZCBkZWZhdWx0IGFyY2hpdGVjdHVyZSwgYnJva2VuIGFzc2VtYmxlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjYxIGNvbmZpZy90Yy1zcGFyYy5jOjQ0OAotbXNnaWQgIkJhZCBvcGNvZGUgdGFibGUsIGJyb2tlbiBhc3NlbWJsZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjQyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAteGFyY2g9JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NDQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIC1BJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yICVkIGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTQ2Ci1tc2dpZCAiVW5yZWNvZ25pemVkIG9wdGlvbiBmb2xsb3dpbmcgLUsiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTcwCi1tc2dpZCAiU1BBUkMgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1NzgKLW1zZ2lkICIiCi0iXG4iCi0iLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTc5Ci1tc2dpZCAiIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiBTUEFSQyBhcmNoaXRlY3R1cmVcbiIKLSItYnVtcFx0XHRcdHdhcm4gd2hlbiBhc3NlbWJsZXIgc3dpdGNoZXMgYXJjaGl0ZWN0dXJlc1xuIgotIi1zcGFyY1x0XHRcdGlnbm9yZWRcbiIKLSItLWVuZm9yY2UtYWxpZ25lZC1kYXRhXHRmb3JjZSAubG9uZywgZXRjLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHlcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1ODUKLW1zZ2lkICIta1x0XHRcdGdlbmVyYXRlIFBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU4OQotbXNnaWQgIiIKLSItMzJcdFx0XHRjcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlXG4iCi0iLTY0XHRcdFx0Y3JlYXRlIDY0IGJpdCBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFx0XHRbZGVmYXVsdCBpcyAlZF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1OTQKLW1zZ2lkICIiCi0iLVRTT1x0XHRcdHVzZSBUb3RhbCBTdG9yZSBPcmRlcmluZ1xuIgotIi1QU09cdFx0XHR1c2UgUGFydGlhbCBTdG9yZSBPcmRlcmluZ1xuIgotIi1STU9cdFx0XHR1c2UgUmVsYXhlZCBNZW1vcnkgT3JkZXJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHRcdFx0W2RlZmF1bHQgaXMgJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NjAwCi1tc2dpZCAiIgotIi1LUElDXHRcdFx0Z2VuZXJhdGUgUElDXG4iCi0iLVZcdFx0XHRwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcbiIKLSItcVx0XHRcdGlnbm9yZWRcbiIKLSItUXksIC1Rblx0XHRpZ25vcmVkXG4iCi0iLXNcdFx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NjA4Ci1tc2dpZCAiIgotIi1FTFx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lXG4iCi0iLUVCXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcbiIKLSItLWxpdHRsZS1lbmRpYW4tZGF0YVx0Z2VuZXJhdGUgY29kZSBmb3IgYSBtYWNoaW5lIGhhdmluZyBiaWcgZW5kaWFuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFuZCBsaXR0bGUgZW5kaWFuIGRhdGEuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjg1NgotbXNnaWQgIlN1cHBvcnQgZm9yIDY0LWJpdCBhcml0aG1ldGljIG5vdCBjb21waWxlZCBpbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6OTExCi1tc2dpZCAiRlAgYnJhbmNoIGluIGRlbGF5IHNsb3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6OTI3Ci1tc2dpZCAiRlAgYnJhbmNoIHByZWNlZGVkIGJ5IEZQIGluc3RydWN0aW9uOyBOT1AgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6OTQ3Ci1tc2dpZCAic2V0OiB1c2VkIHdpdGggbmVnYXRpdmUgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjk0OQotbXNnaWQgInNldDogbnVtYmVyIGxhcmdlciB0aGFuIDQyOTQ5NjcyOTUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTAwMAotbXNnaWQgInNldHg6IHRlbXBvcmFyeSByZWdpc3RlciBzYW1lIGFzIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjExNDUKLW1zZ2lkICJmYWlsZWQgc3BlY2lhbCBjYXNlIGluc24gc2FuaXR5IGNoZWNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyMzUKLW1zZ2lkICI6IGludmFsaWQgbWVtYmFyIG1hc2sgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjQ5Ci1tc2dpZCAiOiBpbnZhbGlkIG1lbWJhciBtYXNrIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTI1NAotbXNnaWQgIjogaW52YWxpZCBtZW1iYXIgbWFzayBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTI3MgotbXNnaWQgIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyODAKLW1zZ2lkICI6IGludmFsaWQgcHJlZmV0Y2ggZnVuY3Rpb24gZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjg1Ci1tc2dpZCAiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMzEzIGNvbmZpZy90Yy1zcGFyYy5jOjEzMjUKLW1zZ2lkICI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTM0OSBjb25maWcvdGMtc3BhcmMuYzoxMzY2Ci1tc2dpZCAiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEzNTQKLW1zZ2lkICI6IHJkIG9uIHdyaXRlIG9ubHkgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEzOTAKLW1zZ2lkICI6IGFzciBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDE2IGFuZCAzMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMzk4Ci1tc2dpZCAiOiBhc3IgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxNDA4Ci1tc2dpZCAiOiBleHBlY3RpbmcgJWFzck4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTc5OQotbXNnaWQgIjogVGhlcmUgYXJlIG9ubHkgNjQgZiByZWdpc3RlcnM7IFswLTYzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxODAxIGNvbmZpZy90Yy1zcGFyYy5jOjE4MTMKLW1zZ2lkICI6IFRoZXJlIGFyZSBvbmx5IDMyIGYgcmVnaXN0ZXJzOyBbMC0zMV0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTk4MgotbXNnaWQgIjogUEMtcmVsYXRpdmUgb3BlcmFuZCBjYW4ndCBiZSBhIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIwMTUKLW1zZ2lkICI6IGludmFsaWQgQVNJIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjAyMwotbXNnaWQgIjogaW52YWxpZCBBU0kgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMDI4Ci1tc2dpZCAiOiBpbnZhbGlkIEFTSSBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjEyNQotbXNnaWQgIk9QRiBpbW1lZGlhdGUgb3BlcmFuZCBvdXQgb2YgcmFuZ2UgKDAtMHgxZmYpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIxMzAKLW1zZ2lkICJub24taW1tZWRpYXRlIE9QRiBvcGVyYW5kLCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIxNDkKLW1zZ2lkICI6IGludmFsaWQgY3ByZWcgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgb3BlcmFuZHMlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdGVjdHVyZSBidW1wZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIG9uIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMjQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdGVjdHVyZSBtaXNtYXRjaCBvbiBcIiVzXCIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIyNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChSZXF1aXJlcyAlczsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyAlcy4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI3NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG9yIHVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMDM3Ci1tc2dpZCAiYmFkIC5yZXNlcnZlIHNlZ21lbnQgLS0gZXhwZWN0ZWQgQlNTIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzA1NAotbXNnaWQgIm1pc3NpbmcgYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMwNjUgY29uZmlnL3RjLXNwYXJjLmM6MzIxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJhbGlnbm1lbnQgdG9vIGxhcmdlOyBhc3N1bWluZyAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMDcxIGNvbmZpZy90Yy1zcGFyYy5jOjMyMTYKLW1zZ2lkICJuZWdhdGl2ZSBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzA4MSBjb25maWcvdGMtc3BhcmMuYzozMjM5Ci1tc2dpZCAiYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzE5NgotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIGNvbW1vbiBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6Mzg3Ci1tc2dpZCAiVGhlIC1hIG9wdGlvbiBkb2Vzbid0IGV4aXN0LiAoRGVzcGl0ZSB3aGF0IHRoZSBtYW4gcGFnZSBzYXlzISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzozOTEgY29uZmlnL3RjLXZheC5jOjMxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRGlzcGxhY2VtZW50IGxlbmd0aCAlcyBpZ25vcmVkISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzozOTUgY29uZmlnL3RjLXZheC5jOjMxMzMKLW1zZ2lkICJTWU1CT0wgVEFCTEUgbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjM5OSBjb25maWcvdGMtdmF4LmM6MzEzNwotbXNnaWQgIlRPS0VOIFRSQUNFIG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzo0MDMgY29uZmlnL3RjLXZheC5jOjMxNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSSBkb24ndCBuZWVkIG9yIHVzZSB0ZW1wLiBmaWxlIFwiJXNcIi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6NDA3IGNvbmZpZy90Yy12YXguYzozMTQ5Ci1tc2dpZCAiSSBkb24ndCB1c2UgYW4gaW50ZXJwYXNzIGZpbGUhIC1WIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6NDIxCi1tc2dpZCAiIgotIlRhaG9lIG9wdGlvbnM6XG4iCi0iLWFcdFx0XHRpZ25vcmVkXG4iCi0iLWQgTEVOR1RIXHRcdGlnbm9yZWRcbiIKLSItSlx0XHRcdGlnbm9yZWRcbiIKLSItU1x0XHRcdGlnbm9yZWRcbiIKLSItdCBGSUxFXHRcdFx0aWdub3JlZFxuIgotIi1UXHRcdFx0aWdub3JlZFxuIgotIi1WXHRcdFx0aWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEwNzUKLW1zZ2lkICJDYXN0aW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCBpcyBiYWQgZm9ybSwgYW5kIGlzIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjExMzEKLW1zZ2lkICJDb3VsZG4ndCBwYXJzZSB0aGUgW2luZGV4XSBpbiB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjExMzcKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIHRoZSBvcGVuaW5nICdbJyBmb3IgdGhlIGluZGV4IG9mIHRoaXMgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTE3NwotbXNnaWQgIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJygnIGZvciB0aGUgZGVyZWYgb2YgdGhpcyBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMTg3Ci1tc2dpZCAiT3BlcmFuZCBjYW4ndCBiZSBib3RoIHByZS1pbmMgYW5kIHBvc3QtZGVjLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMjE3Ci1tc2dpZCAiSSBwYXJzZWQgMiByZWdpc3RlcnMgaW4gdGhpcyBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMjY3Ci1tc2dpZCAiQ2FuJ3QgcmVsb2NhdGUgZXhwcmVzc2lvbiBlcnJvci4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBpcyBhbiBlcnJvci4gVGFob2UgZG9lc24ndCBhbGxvdyBhbnkgZXhwcmVzc2lvbnMKLSMuIGJpZ2dlciB0aGF0IGEgMzIgYml0IGxvbmcgd29yZC4gQW55IGJpZ2dlciBoYXMgdG8gYmUgcmVmZXJlbmNlZAotIy4gYnkgYWRkcmVzcy4KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEyNzQKLW1zZ2lkICJFeHByZXNzaW9uIGlzIHRvbyBsYXJnZSBmb3IgYSAzMiBiaXRzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMjc5Ci1tc2dpZCAiSnVuayBhdCBlbmQgb2YgZXhwcmVzc2lvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMxOQotbXNnaWQgIlN5bnRheCBlcnJvciBpbiBkaXJlY3QgcmVnaXN0ZXIgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMyMQotbXNnaWQgIllvdSBjYW4ndCBpbmRleCBhIHJlZ2lzdGVyIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzI0Ci1tc2dpZCAiU1AgY2FuJ3QgYmUgdGhlIHNvdXJjZSBvcGVyYW5kIHdpdGggZGlyZWN0IHJlZ2lzdGVyIGFkZHJlc3NpbmcuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMjYKLW1zZ2lkICJDYW4ndCB0YWtlIHRoZSBhZGRyZXNzIG9mIGEgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMjgKLW1zZ2lkICJEaXJlY3QgUmVnaXN0ZXIgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMzMAotbXNnaWQgIkZvciBxdWFkIGFjY2VzcywgdGhlIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBhbmQgPCAxNC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMzMgotbXNnaWQgIllvdSBjYW4ndCBjYXN0IGEgZGlyZWN0IHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzM4Ci1tc2dpZCAiVXNpbmcgcmVnIDE0IGZvciBxdWFkd29yZHMgY2FuIHRyb21wIHRoZSBGUCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM1MAotbXNnaWQgIlN5bnRheCBlcnJvciBpbiBhdXRvLWRlYyBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzUyCi1tc2dpZCAiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggYXV0byBkZWMgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM1NAotbXNnaWQgIkF1dG8gZGVjIG1vZGUgY2FudCBiZSB1c2VkIGZvciByZWFkaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzU2Ci1tc2dpZCAiQXV0byBkZWMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNTgKLW1zZ2lkICJBdXRvIGRlYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzYwCi1tc2dpZCAiQXV0byBkZWMgd29uJ3Qgd29yayB3aXRoIHF1YWR3b3Jkcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM2NwotbXNnaWQgIlN5bnRheCBlcnJvciBpbiBvbmUgb2YgdGhlIGF1dG8taW5jIG1vZGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzczCi1tc2dpZCAiQXV0byBpbmMgZGVmZXJyZWQgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNzUKLW1zZ2lkICJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGluYyBkZWZlcnJlZCBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzc3IGNvbmZpZy90Yy10YWhvZS5jOjEzODgKLW1zZ2lkICJBdXRvIGluYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzg0Ci1tc2dpZCAiWW91IGNhbid0IHdyaXRlIHRvIGFuIGF1dG8gaW5jIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzg2Ci1tc2dpZCAiQXV0byBpbmMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzOTAKLW1zZ2lkICJBdXRvIGluYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzkyCi1tc2dpZCAiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggaW4gYXV0byBpbmMgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQwMAotbXNnaWQgIllvdSBjYW4ndCBpbmRleCB0aGUgc3AgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE0MDYKLW1zZ2lkICJTeW50YXggZXJyb3IgaW4gcmVnaXN0ZXIgZGlzcGxhY2VkIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE0MjUKLW1zZ2lkICJBbiBvZmZlc3QgaXMgbmVlZGVkIGZvciB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE0MzcKLW1zZ2lkICJZb3UgY2FuJ3QgaW5kZXggYSByZWdpc3RlciBpbiBpbW1lZGlhdGUgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQzOQotbXNnaWQgIkltbWVkaWF0ZSBhY2Nlc3MgY2FuJ3QgYmUgdXNlZCBhcyBhbiBhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbXBpbGVyIGJ1ZzogT0REIG51bWJlciBvZiBieXRlcyBpbiBhcmcgc3RydWN0dXJlICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNTc3IGNvbmZpZy90Yy12YXguYzoxODQ3Ci1tc2dpZCAiTm90IGVub3VnaCBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNTg3IGNvbmZpZy90Yy12YXguYzoxODU0Ci1tc2dpZCAiVG9vIG1hbnkgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTYzOCBjb25maWcvdGMtdmF4LmM6MzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIHN0YXRlbWVudCBkdWUgdG8gXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE3MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29tcGxpbGVyIGJ1ZzogR290IGEgY2FzZSAoJWQpIEkgd2Fzbid0IGV4cGVjdGluZy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTgyNwotbXNnaWQgIlJlYWwgYnJhbmNoIGRpc3BsYWNlbWVudHMgbXVzdCBiZSBleHByZXNzaW9ucy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTgzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJDb21wbGllciBlcnJvcjogSSBnb3QgYW4gdW5rbm93biBzeW50aGV0aWMgYnJhbmNoIDolYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxOTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJhcmYsIGJhZCBtb2RlICV4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6OTAKLW1zZ2lkICJSZWxheGF0aW9uIGlzIGEgbHV4dXJ5IHdlIGNhbid0IGFmZm9yZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoxNDEKLW1zZ2lkICJiYWQgY2FsbCB0byBtZF9hdG9mICgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjI0NQotbXNnaWQgIic6JyBub3QgZm9sbG93ZWQgYnkgJ20nIG9yICdzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoyNTkKLW1zZ2lkICJwYXJlbiBuZXN0aW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjI3NAotbXNnaWQgIm1pc21hdGNoZWQgcGFyZW50aGVzaXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6NDY3Ci1tc2dpZCAidW5oYW5kbGVkIGV4cHJlc3Npb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo2ODIKLW1zZ2lkICJzeW1ib2wgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgb3IgMzIgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo3MDUKLW1zZ2lkICJ1bmhhbmRsZWQgb3BlcmFuZCBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo3NDYKLW1zZ2lkICJ1bmhhbmRsZWQgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo3OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBtbmVtb25pYzogJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvcGVyYW5kczogJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo4OTAKLW1zZ2lkICJ1bmhhbmRsZWQgcHJlZGVmaW5lZCBzeW1ib2wgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo5ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUEMgb2Zmc2V0IDB4JWx4IG91dHNpZGUgcmFuZ2UgMHglbHgtMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6MTAwMQotbXNnaWQgInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgaW4gZml4dXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6MTAzOAotbXNnaWQgIm1kX2NvbnZlcnRfZnJhZygpIG5vdCBpbXBsZW1lbnRlZCB5ZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoyNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLkNPTU1vbiBsZW5ndGggKCVkLikgPCAwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTAwMQotbXNnaWQgImludGVybmFsIGZhaWx1cmUgaW4gcGFyc2VfcmVnaXN0ZXJfbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwMTkKLW1zZ2lkICJjb25zdGFudCBleHByZXNzaW9uIG9yIHJlZ2lzdGVyIGxpc3QgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMDI0IGNvbmZpZy90Yy12ODUwLmM6MTAzNyBjb25maWcvdGMtdjg1MC5jOjEwNTYKLW1zZ2lkICJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwOTYgY29uZmlnL3RjLXY4NTAuYzoxMTYwCi1tc2dpZCAiaWxsZWdhbCByZWdpc3RlciBpbmNsdWRlZCBpbiBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTEwMwotbXNnaWQgInN5c3RlbSByZWdpc3RlcnMgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTA4Ci1tc2dpZCAiUFNXIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTExNQotbXNnaWQgIkhpZ2ggdmFsdWUgc3lzdGVtIHJlZ2lzdGVycyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExMzkKLW1zZ2lkICJzZWNvbmQgcmVnaXN0ZXIgc2hvdWxkIGZvbGxvdyBkYXNoIGluIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTg3Ci1tc2dpZCAiIFY4NTAgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExODgKLW1zZ2lkICIgIC1td2Fybi1zaWduZWQtb3ZlcmZsb3cgICAgV2FybiBpZiBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvd1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE4OQotbXNnaWQgIiIKLSIgIC1td2Fybi11bnNpZ25lZC1vdmVyZmxvdyAgV2FybiBpZiB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTkwCi1tc2dpZCAiICAtbXY4NTAgICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTkxCi1tc2dpZCAiICAtbXY4NTBlICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE5MgotbXNnaWQgIiAgLW12ODUwZWEgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MGVhXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTkzCi1tc2dpZCAiIgotIiAgLW12ODUwYW55ICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyBnZW5lcmljLCBkZXNwaXRlIGFueSBwcm9jZXNzb3IgIgotInNwZWNpZmljIGluc3RydWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTIwNCBjb25maWcvdGMtdjg1MC5jOjEyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBjb21tYW5kIGxpbmUgb3B0aW9uOiAtJWMlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTM5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gZGV0ZXJtaW5lIGRlZmF1bHQgdGFyZ2V0IHByb2Nlc3NvciBmcm9tIHN0cmluZzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxNDQyCi1tc2dpZCAiY3RvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE0NTkKLW1zZ2lkICJzZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE0NzYKLW1zZ2lkICJ6ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE0OTQKLW1zZ2lkICJ0ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE3MTIKLW1zZ2lkICJUYXJnZXQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpbnN0cnVjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODAyIGNvbmZpZy90Yy12ODUwLmM6MTgzMiBjb25maWcvdGMtdjg1MC5jOjIwMTgKLW1zZ2lkICJpbW1lZGlhdGUgb3BlcmFuZCBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODE0Ci1tc2dpZCAiQUFBUkcgLT4gdW5oYW5kbGVkIGNvbnN0YW50IHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTg1OAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4NjMKLW1zZ2lkICJyZWdpc3RlciByMCBjYW5ub3QgYmUgdXNlZCBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTg3NQotbXNnaWQgImludmFsaWQgc3lzdGVtIHJlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODg4Ci1tc2dpZCAiZXhwZWN0ZWQgRVAgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTA0Ci1tc2dpZCAiaW52YWxpZCBjb25kaXRpb24gY29kZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTkyNSBjb25maWcvdGMtdjg1MC5jOjE5MjkKLW1zZ2lkICJjb25zdGFudCB0b28gYmlnIHRvIGZpdCBpbnRvIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTk4MQotbXNnaWQgInN5bnRheCBlcnJvcjogdmFsdWUgaXMgbWlzc2luZyBiZWZvcmUgdGhlIHJlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTgzCi1tc2dpZCAic3ludGF4IGVycm9yOiByZWdpc3RlciBub3QgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTk3Ci1tc2dpZCAic3ludGF4IGVycm9yOiBzeXN0ZW0gcmVnaXN0ZXIgbm90IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MjAwMgotbXNnaWQgInN5bnRheCBlcnJvcjogY29uZGl0aW9uIGNvZGUgbm90IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MjAzOAotbXNnaWQgImludmFsaWQgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlZJUF9CRUdJTiBlcnJvcjolcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIHN0YXRlbWVudCBiZWNhdXNlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6NDM0Ci1tc2dpZCAiQ2FuJ3QgcmVsb2NhdGUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6NTM3Ci1tc2dpZCAiQmlnbnVtIG5vdCBwZXJtaXR0ZWQgaW4gc2hvcnQgbGl0ZXJhbC4gSW1tZWRpYXRlIG1vZGUgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjU0NgotbXNnaWQgIkNhbid0IGRvIGZsb251bSBzaG9ydCBsaXRlcmFsOiBpbW1lZGlhdGUgbW9kZSB1c2VkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6NTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkEgYmlnbnVtL2Zsb251bSBtYXkgbm90IGJlIGEgZGlzcGxhY2VtZW50OiAweCVseCB1c2VkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo5MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2hvcnQgbGl0ZXJhbCBvdmVyZmxvdyglbGQuKSwgaW1tZWRpYXRlIG1vZGUgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjkyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJGb3JjZWQgc2hvcnQgbGl0ZXJhbCB0byBpbW1lZGlhdGUgbW9kZS4gbm93X3NlZz0lcyB0b19zZWc9JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjk4MQotbXNnaWQgIkxlbmd0aCBzcGVjaWZpY2F0aW9uIGlnbm9yZWQuIEFkZHJlc3MgbW9kZSA5RiB1c2VkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoxMDMwCi1tc2dpZCAiSW52YWxpZCBvcGVyYW5kOiAgaW1tZWRpYXRlIHZhbHVlIHVzZWQgYXMgYmFzZSBhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MTAzMgotbXNnaWQgIkludmFsaWQgb3BlcmFuZDogIGltbWVkaWF0ZSB2YWx1ZSB1c2VkIGFzIGFkZHJlc3MuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoxODI2Ci1tc2dpZCAib2RkIG51bWJlciBvZiBieXRlcyBpbiBvcGVyYW5kIGRlc2NyaXB0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoxODQyCi1tc2dpZCAiQmFkIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjIzOTkKLW1zZ2lkICJubyAnWycgdG8gbWF0Y2ggJ10nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNDE3Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIGluIFtdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNDE5Ci1tc2dpZCAiW1BDXSBpbmRleCBiYW5uZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI0NTQKLW1zZ2lkICJubyAnKCcgdG8gbWF0Y2ggJyknIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNTg5Ci1tc2dpZCAiaW52YWxpZCBicmFuY2ggb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYxOAotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzIEAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MjAKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyAjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjI0Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgLSgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjI2Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgKCkrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjI5Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MzEKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyBbXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYzMwotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjM1Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgZGlzcGxhY2VtZW50IGxlbmd0aCBzcGVjaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2NjUKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgb2YgU14jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjgyCi1tc2dpZCAiU14jIG5lZWRzIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2ODkKLW1zZ2lkICJTXiMgbWF5IG9ubHkgcmVhZC1hY2Nlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3MTQKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgb2YgLSgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzIwCi1tc2dpZCAiLShQQykgdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjcyMgotbXNnaWQgIltdaW5kZXggc2FtZSBhcyAtKClyZWdpc3RlcjogdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjc1OAotbXNnaWQgImludmFsaWQgb3BlcmFuZCBvZiAoKSsiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3NjQKLW1zZ2lkICIoUEMpKyB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzY2Ci1tc2dpZCAiW11pbmRleCBzYW1lIGFzICgpK3JlZ2lzdGVyOiB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzkxCi1tc2dpZCAiIyBjb25mbGljdHMgbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzkzCi1tc2dpZCAiIyBiYXJzIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyODE1Ci1tc2dpZCAid3JpdGluZyBvciBtb2RpZnlpbmcgIyBpcyB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyODQ1Ci1tc2dpZCAibGVuZ3RoIG5vdCBuZWVkZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4NTIKLW1zZ2lkICJjYW4ndCBbXWluZGV4IGEgcmVnaXN0ZXIsIGJlY2F1c2UgaXQgaGFzIG5vIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4NTQKLW1zZ2lkICJhIHJlZ2lzdGVyIGhhcyBubyBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyODY1Ci1tc2dpZCAiUEMgcGFydCBvZiBvcGVyYW5kIHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjMxOTQKLW1zZ2lkICIiCi0iVkFYIG9wdGlvbnM6XG4iCi0iLWQgTEVOR1RIXHRcdGlnbm9yZWRcbiIKLSItSlx0XHRcdGlnbm9yZWRcbiIKLSItU1x0XHRcdGlnbm9yZWRcbiIKLSItdCBGSUxFXHRcdFx0aWdub3JlZFxuIgotIi1UXHRcdFx0aWdub3JlZFxuIgotIi1WXHRcdFx0aWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzozMjAzCi1tc2dpZCAiIgotIlZNUyBvcHRpb25zOlxuIgotIi0rXHRcdFx0aGFzaCBlbmNvZGUgbmFtZXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVyc1xuIgotIi0xXHRcdFx0YGNvbnN0JyBoYW5kbGluZyBjb21wYXRpYmxlIHdpdGggZ2NjIDEueFxuIgotIi1IXHRcdFx0c2hvdyBuZXcgc3ltYm9sIGFmdGVyIGhhc2ggdHJ1bmNhdGlvblxuIgotIi1oIE5VTVx0XHRcdGRvbid0IGhhc2ggbWl4ZWQtY2FzZSBuYW1lcywgYW5kIGFkanVzdCBjYXNlOlxuIgotIlx0XHRcdDAgPSB1cHBlciwgMiA9IGxvd2VyLCAzID0gcHJlc2VydmUgY2FzZVxuIgotIi12XCJWRVJTSU9OXCJcdFx0Y29kZSBiZWluZyBhc3NlbWJsZWQgd2FzIHByb2R1Y2VkIGJ5IGNvbXBpbGVyIFwiVkVSU0lPTlwiXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXc2NS5jOjEzNgotbXNnaWQgIm5lZWQgb24gb3Igb2ZmLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdzY1LmM6MzIxIGNvbmZpZy90Yy13NjUuYzozNjQKLW1zZ2lkICJzeW50YXggZXJyb3IgYWZ0ZXIgPGV4cCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHJyJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciByaCVkLCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzozMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgcmwlZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHJxJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjMyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciByJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjM3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RlZCAlYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MzkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGEgd29yZCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6NDA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGFkZHJlc3MgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjY4MAotbXNnaWQgIk1pc3NpbmcgKSBpbiByYShyYikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjk0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kICVzMHgleCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMDg2Ci1tc2dpZCAiaW1tZWRpYXRlIG11c3QgYmUgMSBvciAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMDkxCi1tc2dpZCAiaW1tZWRpYXRlIDEgb3IgMiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTExOQotbXNnaWQgImNhbid0IHVzZSBSMCBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMjc4Ci1tc2dpZCAiQ2FuJ3QgZmluZCBvcGNvZGUgdG8gbWF0Y2ggb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjEzOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXRlY3R1cmUgLXolcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTQwNgotbXNnaWQgIiIKLSJaOEsgb3B0aW9uczpcbiIKLSItejgwMDFcdFx0XHRnZW5lcmF0ZSBzZWdtZW50ZWQgY29kZVxuIgotIi16ODAwMlx0XHRcdGdlbmVyYXRlIHVuc2VnbWVudGVkIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBzdWJ0cmFjdCBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyAlcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkZXBlbmQuYzoxOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBgJXMnIGZvciB3cml0aW5nIgotbXNnc3RyICIiCi0KLSM6IGRlcGVuZC5jOjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBjbG9zZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJTdHJpbmcgdG9vIGJpZyAoJWx1IGJ5dGVzKSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cmluZyBoYXNoIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MzQgZWNvZmYuYzoxODI3IGVjb2ZmLmM6MTg1MyBlY29mZi5jOjE4ODUgZWNvZmYuYzoyMDQxCi0jOiBlY29mZi5jOjIxNTUKLW1zZ2lkICJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE3MjEKLW1zZ2lkICJ0b28gbWFueSBzdF9FbmQncyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjIwNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHRhZyBoYXNoIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjIyMzMKLW1zZ2lkICJmYWtlIC5maWxlIGFmdGVyIHJlYWwgb25lIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjMyMQotbXNnaWQgIkZpbGVuYW1lIGdvZXMgb3ZlciBvbmUgcGFnZSBib3VuZGFyeS4iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNDU2Ci1tc2dpZCAiLmJlZ2luIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI0NjMKLW1zZ2lkICIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNDk1Ci1tc2dpZCAiLmJlbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjUwMgotbXNnaWQgIi5iZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjUxNQotbXNnaWQgIi5iZW5kIGRpcmVjdGl2ZSBuYW1lcyB1bmtub3duIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI1NTkKLW1zZ2lkICIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI1NjEKLW1zZ2lkICJFbXB0eSBzeW1ib2wgbmFtZSBpbiAuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjU5OQotbXNnaWQgIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI2MTQKLW1zZ2lkICJCYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjI3Ci1tc2dpZCAiVG9vIG1hbnkgLmRpbSBlbnRyaWVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjY0OAotbXNnaWQgIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI2NzQKLW1zZ2lkICIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjY4OQotbXNnaWQgIkJhZGx5IGZvcm1lZCAuc2l6ZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNzAyCi1tc2dpZCAiVG9vIG1hbnkgLnNpemUgZW50cmllcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI3MjUKLW1zZ2lkICIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSMuIEZJWE1FOiBXZSBjb3VsZCBoYW5kbGUgdGhpcyBieSBzZXR0aW5nIHRoZSBjb250aW51ZWQgYml0LgotIy4gVGhlcmUgd291bGQgc3RpbGwgYmUgYSBsaW1pdDogdGhlIC50eXBlIGFyZ3VtZW50IGNhbiBub3QKLSMuIGJlIGluZmluaXRlLgotIzogZWNvZmYuYzoyNzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRoZSB0eXBlIG9mICVzIGlzIHRvbyBjb21wbGV4OyBpdCB3aWxsIGJlIHNpbXBsaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNzU0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIC50eXBlIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6Mjc5MwotbXNnaWQgIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI4MjAKLW1zZ2lkICIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyODI4Ci1tc2dpZCAiLnZhbCBleHByZXNzaW9uIGlzIHRvbyBjb3BtbGV4IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6Mjg1OQotbXNnaWQgIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBiZWZvcmUgLmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI4ODUKLW1zZ2lkICJCYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI5MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gdGFnIHNwZWNpZmllZCBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyOTY2Ci1tc2dpZCAiQmFkIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzAzOAotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzA0NQotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMDY4Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgbmFtZXMgdW5rbm93biBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMDk3Ci1tc2dpZCAic2Vjb25kIC5lbnQgZGlyZWN0aXZlIGZvdW5kIGJlZm9yZSAuZW5kIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMxNzIKLW1zZ2lkICJObyB3YXkgdG8gaGFuZGxlIC5maWxlIHdpdGhpbiAuZW50Ly5lbmQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMxOTcKLW1zZ2lkICIuZm1hc2sgb3V0c2lkZSBvZiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzI2NgotbXNnaWQgIi5tYXNrIG91dHNpZGUgb2YgLmVudCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMyOTYKLW1zZ2lkICIubG9jIGJlZm9yZSAuZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMzMDMKLW1zZ2lkICIubG9jIG91dHNpZGUgb2YgLnRleHQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIGAlcycuIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzQzNQotbXNnaWQgImJhZCAud2Vha2V4dCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5zdGFiJWMgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM1MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLnN0YWIlYzogaWdub3Jpbmcgbm9uLXplcm8gb3RoZXIgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNTQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJMaW5lIG51bWJlciAoJWQpIGZvciAuc3RhYiVjIGRpcmVjdGl2ZSBjYW5ub3QgZml0IGluIGluZGV4IGZpZWxkICgyMCBiaXRzKSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCAuc3RhYiVjIGRpcmVjdGl2ZSwgYmFkIGNoYXJhY3RlciIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjQwNDYgZWNvZmYuYzo0MjM1IGVjb2ZmLmM6NDI2MAotbXNnaWQgIi5iZWdpbi8uYmVuZCBpbiBkaWZmZXJlbnQgc2VnbWVudHMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzo0NzYxCi1tc2dpZCAiTWlzc2luZyAuZW5kIG9yIC5iZW5kIGF0IGVuZCBvZiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6NTI1MgotbXNnaWQgIkdQIHByb2xvZ3VlIHNpemUgZXhjZWVkcyBmaWVsZCBzaXplLCB1c2luZyAwIGluc3RlYWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjI1MAotbXNnaWQgIiIKLSJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IGV4cG9uZW50IG92ZXJmbG93LCBwcm9iYWJseSBhc3NlbWJsaW5nIGp1bmsiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjI1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IHVua25vd24gZXJyb3IgY29kZT0lZC4iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjQzNAotbXNnaWQgIiIKLSJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG1heSBub3QgaGF2ZSBtb3JlIHRoYW4gOCBoZXggZGlnaXRzIGluIGFueSB3b3JkLiIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6NDU0Ci1tc2dpZCAiQSBiaWdudW0gd2l0aCB1bmRlcnNjb3JlcyBtdXN0IGhhdmUgZXhhY3RseSA0IHdvcmRzLiIKLW1zZ3N0ciAiIgotCi0jLiBlaXRoZXIgbm90IHNlZW4gb3Igbm90IGRlZmluZWQuCi0jLiBAQCBTaG91bGQgcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCBzdHJpbmcgaW5zdGVhZCBvZgotIy4gdGhlIHBhcnNlZCBudW1iZXIuCi0jOiBleHByLmM6NTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhY2t3LiByZWYgdG8gdW5rbm93biBsYWJlbCBcIiVkOlwiLCAwIGFzc3VtZWQuIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzo3MDUKLW1zZ2lkICJDaGFyYWN0ZXIgY29uc3RhbnQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzo5NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwci5jKG9wZXJhbmQpOiBiYWQgYXRvZl9nZW5lcmljIHJldHVybiB2YWwgJWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjEwMDEKLW1zZ2lkICJNaXNzaW5nICcpJyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxMDExIHJlYWQuYzozODI0Ci1tc2dpZCAiRUJDRElDIGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTA3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFyeSBvcGVyYXRvciAlYyBpZ25vcmVkIGJlY2F1c2UgYmFkIG9wZXJhbmQgZm9sbG93cyIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTEyMiBleHByLmM6MTE0NwotbXNnaWQgInN5bnRheCBlcnJvciBpbiAuc3RhcnRvZi4gb3IgLnNpemVvZi4iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjEyOTYKLW1zZ2lkICJCYWQgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTY0NAotbXNnaWQgIm1pc3Npbmcgb3BlcmFuZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNjc3Ci1tc2dpZCAib3BlcmF0aW9uIGNvbWJpbmVzIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlZ21lbnRzIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNjkzCi1tc2dpZCAibGVmdCBvcGVyYW5kIGlzIGEgYmlnbnVtOyBpbnRlZ2VyIDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTY5NQotbXNnaWQgImxlZnQgb3BlcmFuZCBpcyBhIGZsb2F0OyBpbnRlZ2VyIDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTcwNAotbXNnaWQgInJpZ2h0IG9wZXJhbmQgaXMgYSBiaWdudW07IGludGVnZXIgMCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNzA2Ci1tc2dpZCAicmlnaHQgb3BlcmFuZCBpcyBhIGZsb2F0OyBpbnRlZ2VyIDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTc1NCBzeW1ib2xzLmM6MTA5MgotbXNnaWQgImRpdmlzaW9uIGJ5IHplcm8iCi1tc2dzdHIgIiIKLQotIzogZnJhZ3MuYzo4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBleHRlbmQgZnJhZyAlZC4gY2hhcnMiCi1tc2dzdHIgIiIKLQotIzogZnJhZ3MuYzoxNzAKLW1zZ2lkICJhdHRlbXB0IHRvIGFsbG9jYXRlIGRhdGEgaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBmcmFncy5jOjE3NgotbXNnaWQgImF0dGVtcHQgdG8gYWxsb2NhdGUgZGF0YSBpbiBjb21tb24gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NDg0Ci1tc2dpZCAicmVkZWZpbml0aW9uIG5vdCBhbGxvd2VkXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjU1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ0aGUgJWMgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NjM1Ci1tc2dpZCAic3RyaW5nIHdoZXJlIGV4cHJlc3Npb24gZXhwZWN0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjY0MQotbXNnaWQgImNhbid0IGZpbmQgcHJpbWFyeSBpbiBleHByZXNzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo2ODEKLW1zZ2lkICJtaXNwbGFjZWQgY2xvc2luZyBwYXJlbnMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjcxOAotbXNnaWQgImF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjc1MAotbXNnaWQgImNhbid0IGFkZCB0d28gcmVsb2NhdGFibGUgZXhwcmVzc2lvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6OTU1Ci1tc2dpZCAidW5yZWFzb25hYmxlIG5lc3RpbmcuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjEwMzMKLW1zZ2lkICJFbmQgb2YgZmlsZSBub3QgYXQgc3RhcnQgb2YgbGluZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIGJhc2UgY2hhcmFjdGVyICVjLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxMjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJhZGl4IGlzICVjIG11c3QgYmUgb25lIG9mIGIsIHEsIGQgb3IgaCIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTMwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzaXplIG11c3QgYmUgb25lIG9mIGIsIHcgb3IgbCwgaXMgJWMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0MTMKLW1zZ2lkICJkYXRhYiByZXBlYXQgbXVzdCBiZSBjb25zdGFudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQxNQotbXNnaWQgImRhdGFiIGRhdGEgbXVzdCBiZSBhYnNvbHV0ZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQyOQotbXNnaWQgImFsaWduIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0MzYKLW1zZ2lkICIuYWxpZ24gbmVlZHMgYWJzb2x1dGUgZmlsbCB2YWx1ZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQ0NAotbXNnaWQgImFsaWdubWVudCBtdXN0IGJlIG9uZSBvZiAxLCAyIG9yIDQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0NjkKLW1zZ2lkICJyZXMgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiBmb3IgZmlsbCBjb3VudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTU0OQotbXNnaWQgImZvcm0gTElOPSBuZWVkcyBhYnNvbHV0ZSBleHByZXNzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTU1MgotbXNnaWQgIkNPTD0iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE1NTUKLW1zZ2lkICJmb3JtIENPTD0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIy4gVHVybnMgdGhlIG5leHQgZXhwcmVzc2lvbiBpbnRvIGEgc3RyaW5nCi0jOiBnYXNwLmM6MTU5NyBtYWNyby5jOjQwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlIG9wZXJhdG9yIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE2NTkKLW1zZ2lkICJtaXNwbGFjZWQgKCAuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE2NzQKLW1zZ2lkICJtaXNwbGFjZWQgKS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTcyOAotbXNnaWQgIi5pbnN0ciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE3NjYKLW1zZ2lkICJuZWVkIGFic29sdXRlIHBvc2l0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNzY4Ci1tc2dpZCAibmVlZCBhYnNvbHV0ZSBsZW5ndGguXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIwMTcKLW1zZ2lkICJFTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMDQ3Ci1tc2dpZCAiLkFTU0lHTkEgbmVlZHMgY29uc3RhbnQgZXhwcmVzc2lvbiBhcmd1bWVudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjA1MQotbXNnaWQgIi5BU1NJR05BIHdpdGhvdXQgbGFiZWwuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIwNzYKLW1zZ2lkICIuQVNTSUdOUyB3aXRob3V0IGxhYmVsLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGZpbmQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMjA4Ci1tc2dpZCAiQ29tcGFyaXNvbiBvcGVyYXRvciBtdXN0IGJlIG9uZSBvZiBFUSwgTkUsIExULCBMRSwgR1Qgb3IgR0UuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIyNDIKLW1zZ2lkICJDb21wYXJpc29uIG9wZXJhdG9yIGZvciBzdHJpbmdzIG11c3QgYmUgRVEgb3IgTkVcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjI1NCBnYXNwLmM6MjI2NCBnYXNwLmM6MjM2NgotbXNnaWQgIkNvbmRpdGlvbmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjI1OQotbXNnaWQgIlN0cmluZyBjb21wYXJlZCBhZ2FpbnN0IGV4cHJlc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIzMDkKLW1zZ2lkICJBSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIzMjQKLW1zZ2lkICJNdWx0aXBsZSBBRUxTRXMgaW4gQUlGLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMzQwCi1tc2dpZCAiQUVOREkgd2l0aG91dCBBSUYuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIzNjMgZ2FzcC5jOjI0NDUKLW1zZ2lkICJJRiBuZXN0aW5nIHVucmVhc29uYWJsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjQ1NQotbXNnaWQgIkJhZCBmb3JtYXQgZm9yIElGIG9yIElGTkMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI0NzUKLW1zZ2lkICJBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjQ3NwotbXNnaWQgIkVORFIgd2l0aG91dCBhIFJFUFQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI1MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQVdISUxFIHdpdGhvdXQgYSBBRU5EVyBhdCAlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjUzOAotbXNnaWQgIkFFTkRXIHdpdGhvdXQgYSBBRU5EVy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjU4MwotbXNnaWQgIkFSRVBFQVQgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI1ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQVJFUEVBVCB3aXRob3V0IGEgQUVORFIgYXQgJWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI2MzEKLW1zZ2lkICIuRU5ETSB3aXRob3V0IGEgbWF0Y2hpbmcgLk1BQ1JPLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNjY1Ci1tc2dpZCAiTE9DQUwgb3V0c2lkZSBvZiBNQUNSTyIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjY3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJtYWNybyBhdCBsaW5lICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNzAxCi1tc2dpZCAibWFjcm8gZXhwYW5zaW9uIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNzUzCi1tc2dpZCAiQ2hhcmFjdGVyIGNvZGUgaW4gc3RyaW5nIG11c3QgYmUgYWJzb2x1dGUgZXhwcmVzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjc1OAotbXNnaWQgIk1pc3NpbmcgPiBmb3IgY2hhcmFjdGVyIGNvZGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RyaW5nIGZvciBTREFUQUMgbG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMgKCVkKS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjg0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbGxlZ2FsIGNoYXJhY3RlciBpbiBTREFUQSBsaW5lICgweCV4KS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjg2NgotbXNnaWQgIk11c3QgaGF2ZSBhYnNvbHV0ZSBTREFUQUIgcmVwZWF0IGNvdW50LlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyODY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk11c3QgaGF2ZSBwb3NpdGl2ZSBTREFUQUIgcmVwZWF0IGNvdW50ICglZCkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWFzb25hYmxlIGluY2x1ZGUgZGVwdGggKCVsZCkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBpbmNsdWRlIGZpbGUgYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzAyNQotbXNnaWQgIlVucmVhc29uYWJsZSBleHBhbnNpb24gKC11IHR1cm5zIG9mZiBjaGVjaykuXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvbmUgY2F1c2VzIGxvdHMgb2YgcGFpbiB3aGVuIHRyeWluZyB0byBwcmVwcm9jZXNzCi0jLiBvcmRpbmFyeSBjb2RlCi0jOiBnYXNwLmM6MzI0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbmlzZWQgcHNldWRvIG9wIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjMzMTMKLW1zZ2lkICJPUkcgY29tbWFuZCBub3QgYWxsb3dlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzUzMAotbXNnaWQgIkludmFsaWQgZXhwcmVzc2lvbiBvbiBjb21tYW5kIGxpbmUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM1NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBcbiIKLSIgIFstYV0gICAgICBbLS1hbHRlcm5hdGVdICAgICAgICAgZW50ZXIgYWx0ZXJuYXRlIG1hY3JvIG1vZGVcbiIKLSIgIFstYyBjaGFyXSBbLS1jb21tZW50Y2hhciBjaGFyXSAgY2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlciBmcm9tICFcbiIKLSIgIFstZF0gICAgICBbLS1kZWJ1Z10gICAgICAgICAgICAgcHJpbnQgc29tZSBkZWJ1Z2dpbmcgaW5mb1xuIgotIiAgWy1oXSAgICAgIFstLWhlbHBdICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2VcbiIKLSIgIFstTV0gICAgICBbLS1tcmldICAgICAgICAgICAgICAgZW50ZXIgTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuIgotIiAgWy1vIG91dF0gIFstLW91dHB1dCBvdXRdICAgICAgICBzZXQgdGhlIG91dHB1dCBmaWxlXG4iCi0iICBbLXBdICAgICAgWy0tcHJpbnRdICAgICAgICAgICAgIHByaW50IGxpbmUgbnVtYmVyc1xuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNTgwCi1tc2dpZCAiIgotIiAgWy1zXSAgICAgIFstLWNvcHlzb3VyY2VdICAgICAgICBjb3B5IHNvdXJjZSB0aHJvdWdoIGFzIGNvbW1lbnRzIFxuIgotIiAgWy11XSAgICAgIFstLXVucmVhc29uYWJsZV0gICAgICBhbGxvdyB1bnJlYXNvbmFibGUgbmVzdGluZ1xuIgotIiAgWy12XSAgICAgIFstLXZlcnNpb25dICAgICAgICAgICBwcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uXG4iCi0iICBbLURuYW1lPXZhbHVlXSAgICAgICAgICAgICAgICAgIGNyZWF0ZSBwcmVwcm9jZXNzb3IgdmFyaWFibGUgY2FsbGVkIG5hbWUsICIKLSJ3aXRoIHZhbHVlXG4iCi0iICBbLUlwYXRoXSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCB0byBpbmNsdWRlIHBhdGggbGlzdFxuIgotIiAgW2luLWZpbGVdXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM1OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEdudSBBc3NlbWJsZXIgTWFjcm8gUHJlcHJvY2Vzc29yXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LgotIzogZ2FzcC5jOjM2ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGFzc2VtYmxlciBwcmUtcHJvY2Vzc29yICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM2ODEKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIGlucHV0IGZpbGUgYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mzc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mzc0OAotbXNnaWQgIiIKLSJcbiIKLSJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIgotbXNnc3RyICIiCi0KLSMuIERldGVjdCBpZiB3ZSBhcmUgcmVhZGluZyBmcm9tIHN0ZGluIGJ5IGV4YW1pbmluZyB0aGUgZmlsZQotIy4gbmFtZSByZXR1cm5lZCBieSBhc193aGVyZSgpLgotIy4KLSMuIFtGSVhNRTogV2UgcmVseSB1cG9uIHRoZSBuYW1lIGluIHRoZSBzdHJjbXAgYmVsb3cgYmVpbmcgdGhlCi0jLiBzYW1lIGFzIHRoZSBvbmUgdXNlZCBieSBpbnB1dF9zY3J1Yl9uZXdfZmlsZSgpLCBpZiB0aGF0IGlzCi0jLiBub3QgdHJ1ZSwgdGhlbiB0aGlzIGNvZGUgd2lsbCBmYWlsXS4KLSMuCi0jLiBJZiB3ZSBhcmUgcmVhZGluZyBmcm9tIHN0ZGluLCB0aGVuIHdlIG5lZWQgdG8gc2F2ZSBlYWNoIGlucHV0IGxpbmUKLSMuIGhlcmUgKGFzc3VtaW5nIG9mIGNvdXJzZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBsaW5lIG9mIGlucHV0IHRvIHJlYWQpLAotIy4gc28gdGhhdCBpdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0aW5nIHRoYXQgaXMgcHJvZHVjZWQgYXQgdGhlIGVuZAotIy4gb2YgdGhlIGFzc2VtYmx5LgotIzogaW5wdXQtZmlsZS5jOjE1MCBpbnB1dC1zY3J1Yi5jOjIzMyBsaXN0aW5nLmM6MzUzCi1tc2dpZCAie3N0YW5kYXJkIGlucHV0fSIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1maWxlLmM6MTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gJXMgZm9yIHJlYWRpbmcuIgotbXNnc3RyICIiCi0KLSM6IGlucHV0LWZpbGUuYzoyMDUgaW5wdXQtZmlsZS5jOjIzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCByZWFkIGZyb20gJXMiCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtZmlsZS5jOjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBjbG9zZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1zY3J1Yi5jOjI2MwotbXNnaWQgIm1hY3JvcyBuZXN0ZWQgdG9vIGRlZXBseSIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1zY3J1Yi5jOjM0OQotbXNnaWQgInBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGlucHV0LXNjcnViLmM6MzcxCi1tc2dpZCAiUGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogaXRibC1vcHMuYzozNTkKLW1zZ2lkICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgaW5zdHJ1Y3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjI1MgotbXNnaWQgIldhcm5pbmc6IgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoyNTkKLW1zZ2lkICJFcnJvcjoiCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjExNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3Qgb3BlbiBsaXN0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoxMTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIGNsb3NpbmcgbGlzdCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MTI0NQotbXNnaWQgInN0cmFuZ2UgcGFwZXIgaGVpZ2h0LCBzZXQgdG8gbm8gZm9ybSIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MTMxMQotbXNnaWQgIk5ldyBsaW5lIGluIHRpdGxlIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6NTYzCi1tc2dpZCAidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBtYWNybyBkZWZpbml0aW9uIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6NTcyCi1tc2dpZCAibWlzc2luZyApIGFmdGVyIGZvcm1hbHMiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzo3MjkKLW1zZ2lkICJtaXNzcGxhY2VkICkiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzo5OTEKLW1zZ2lkICJjb25mdXNpb24gaW4gZm9ybWFsIHBhcmFtZXRlcnMiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzo5OTYKLW1zZ2lkICJtYWNybyBmb3JtYWwgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzoxMDExCi1tc2dpZCAiY2FuJ3QgbWl4IHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6MTAxOQotbXNnaWQgInRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6MTE5NAotbXNnaWQgInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gaXJwIG9yIGlycGMiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzoxMjAyCi1tc2dpZCAibWlzc2luZyBtb2RlbCBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzoxMDUKLW1zZ2lkICJBc3NlbWJsZXIgbWVzc2FnZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzoyMjIKLW1zZ2lkICJXYXJuaW5nOiAiCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzozMzEKLW1zZ2lkICJFcnJvcjogIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDM1IG1lc3NhZ2VzLmM6NDUyCi1tc2dpZCAiRmF0YWwgZXJyb3I6ICIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ3MQotbXNnaWQgIkludGVybmFsIGVycm9yIVxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDczCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFzc2VydGlvbiBmYWlsdXJlIGluICVzIGF0ICVzIGxpbmUgJWQuXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMgbGluZSAlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ3NyBtZXNzYWdlcy5jOjQ5NQotbXNnaWQgIlBsZWFzZSByZXBvcnQgdGhpcyBidWcuXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IG91dHB1dC1maWxlLmM6NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBhIGJmZCBvbiBzdGRvdXQgJXMgIgotbXNnc3RyICIiCi0KLSM6IG91dHB1dC1maWxlLmM6NzIgb3V0cHV0LWZpbGUuYzo3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQ2FuJ3QgY2xvc2UgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjEzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQ2FuJ3QgY2xvc2UgJXMiCi1tc2dzdHIgIiIKLQotIzogb3V0cHV0LWZpbGUuYzoxNDgKLW1zZ2lkICJGYWlsZWQgdG8gZW1pdCBhbiBvYmplY3QgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjE0OQotbXNnaWQgIkNhbid0IGNvbnRpbnVlIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3IgY29uc3RydWN0aW5nICVzIHBzZXVkby1vcCB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjgwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIHBzZXVkby1vcDogIGAlcyciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjkyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJsYWJlbCBcIiVkJFwiIHJlZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTE0NQotbXNnaWQgIi5hYm9ydCBkZXRlY3RlZC4gIEFiYW5kb25pbmcgc2hpcC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjEyNTAgcmVhZC5jOjIwMzEKLW1zZ2lkICJBbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTI1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAldSBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxMjkwCi1tc2dpZCAiZXhwZWN0ZWQgZmlsbCBwYXR0ZXJuIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE0ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIy4gU29tZSBvZiB0aGUgYmFjayBlbmRzIGNhbid0IGRlYWwgd2l0aCBub24tcG9zaXRpdmUgbGluZSBudW1iZXJzLgotIy4gQmVzaWRlcywgaXQncyBzaWxseS4KLSM6IHJlYWQuYzoxNjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpbmUgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlOyBsaW5lIG51bWJlciAlZCByZWplY3RlZC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE2MzgKLW1zZ2lkICJzdGFydCBhZGRyZXNzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE2NDgKLW1zZ2lkICIuZXJyIGVuY291bnRlcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNjY3IHJlYWQuYzoxNjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5mYWlsICVsZCBlbmNvdW50ZXJlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTcwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIuZmlsbCBzaXplIGNsYW1wZWQgdG8gJWQuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNzExCi1tc2dpZCAiU2l6ZSBuZWdhdGl2ZTogLmZpbGwgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE3MTcKLW1zZ2lkICJSZXBlYXQgPCAwLCAuZmlsbCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxODczCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCAubGlua29uY2UgdHlwZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxODg2IHJlYWQuYzoxOTEyCi1tc2dpZCAiLmxpbmtvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxOTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJmZF9zZXRfc2VjdGlvbl9mbGFnczogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE5NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIuc2Jzc1wiOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjAwOQotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHNpemUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIwMTcKLW1zZ2lkICJNaXNzaW5nIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjE1NAotbXNnaWQgImJhZCBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMjg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0dGVtcHQgdG8gcmVkZWZpbmUgcHNldWRvLW9wIGAlcycgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlZ21lbnQgXCIlc1wiOyBzZWdtZW50IFwiJXNcIiBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMzU5Ci1tc2dpZCAiaWdub3JpbmcgZmlsbCB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMzYyCi1tc2dpZCAib25seSBjb25zdGFudCBvZmZzZXRzIHN1cHBvcnRlZCBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMzk0Ci1tc2dpZCAiTVJJIHN0eWxlIE9SRyBwc2V1ZG8tb3Agbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjQ4MgotbXNnaWQgInVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNTY0Ci1tc2dpZCAiYWJzb2x1dGUgc2VjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI1NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIHNlY3Rpb24gY29tbWFuZCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNjU0Ci1tc2dpZCAicmVwdCB3aXRob3V0IGVuZHIiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI4NDEKLW1zZ2lkICJVbnN1cHBvcnRlZCB2YXJpYWJsZSBzaXplIG9yIGZpbGwgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI4NjYKLW1zZ2lkICIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIHplcm8sIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI4NjgKLW1zZ2lkICIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyODk3Ci1tc2dpZCAic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyOTAyCi1tc2dpZCAic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBjb21tb24gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mjk4OSByZWFkLmM6NDA3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgZmxvYXRpbmcgbGl0ZXJhbDogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMwNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIGlzIGAlYycuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc3Qgb2YgbGluZSBpZ25vcmVkLiBGaXJzdCBpZ25vcmVkIGNoYXJhY3RlciB2YWx1ZWQgMHgleC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMxMTkKLW1zZ2lkICJpbGxlZ2FsIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzEyMQotbXNnaWQgIm1pc3NpbmcgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMjg4Ci1tc2dpZCAicnZhIHdpdGhvdXQgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNDEzCi1tc2dpZCAiYXR0ZW1wdCB0byBzdG9yZSB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNDUxIHJlYWQuYzo0MzQ3Ci1tc2dpZCAiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM0NjMgcmVhZC5jOjQzNTkKLW1zZ2lkICJyZWdpc3RlciB2YWx1ZSB1c2VkIGFzIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIy4gTGVhZGluZyBiaXRzIGNvbnRhaW4gYm90aCAwcyAmIDFzLgotIzogcmVhZC5jOjM1NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFsdWUgMHglbHggdHJ1bmNhdGVkIHRvIDB4JWx4LiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJCaWdudW0gdHJ1bmNhdGVkIHRvICVkIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIEJGRCByZWxvY2F0aW9uIHNpemUgJXUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM3MzUKLW1zZ2lkICJ1c2luZyBhIGJpdCBmaWVsZCB3aWR0aCBvZiB6ZXJvIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImZpZWxkIHdpZHRoIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzc1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWVsZCB3aWR0aCAlbHUgdG9vIGJpZyB0byBmaXQgaW4gJWQgYnl0ZXM6IHRydW5jYXRlZCB0byAlZCBiaXRzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImZpZWxkIHZhbHVlIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzg5NAotbXNnaWQgIlVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM5NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBmbG9hdGluZyB0eXBlIHR5cGUgJyVjJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzk2NwotbXNnaWQgIkZsb2F0aW5nIHBvaW50IGNvbnN0YW50IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDA5MgotbXNnaWQgInVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ0OTYKLW1zZ2lkICJFeHBlY3RlZCA8bm4+IgotbXNnc3RyICIiCi0KLSMuIFRvIGJlIGNvbXBhdGlibGUgd2l0aCBCU0QgNC4yIGFzOiBnaXZlIHRoZSBsdXNlciBhIGxpbmVmZWVkISEKLSM6IHJlYWQuYzo0NTI5IHJlYWQuYzo0NjEyCi1tc2dpZCAiVW50ZXJtaW5hdGVkIHN0cmluZzogTmV3bGluZSBpbnNlcnRlZC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ2MjAKLW1zZ2lkICJCYWQgZXNjYXBlZCBjaGFyYWN0ZXIgaW4gc3RyaW5nLCAnPycgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDY0NgotbXNnaWQgImV4cGVjdGVkIGFkZHJlc3MgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN5bWJvbCBcIiVzXCIgdW5kZWZpbmVkOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ2NjkKLW1zZ2lkICJzb21lIHN5bWJvbCB1bmRlZmluZWQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDY4NwotbXNnaWQgImJhZCBvciBpcnJlZHVjaWJsZSBhYnNvbHV0ZSBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ3MjUKLW1zZ2lkICJUaGlzIHN0cmluZyBtYXkgbm90IGNvbnRhaW4gJ1xcMCciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ3NjQKLW1zZ2lkICJNaXNzaW5nIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDk5NQotbXNnaWQgIm1pc3NpbmcgLmZ1bmMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjUwMTIKLW1zZ2lkICIuZW5kZnVuYyBtaXNzaW5nIGZvciBwcmV2aW91cyAuZnVuYyIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIwOQotbXNnaWQgIi5zdGFiczogTWlzc2luZyBjb21tYSIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIxNyBzdGFicy5jOjIyNSBzdGFicy5jOjIzNgotIywgYy1mb3JtYXQKLW1zZ2lkICIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NDE1Ci1tc2dpZCAiY29tbWEgbWlzc2luZyBpbiAueHN0YWJzIgotbXNnc3RyICIiCi0KLSM6IHN1YnNlZ3MuYzozNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBzd2l0Y2ggdG8gbm9uZXhpc3RlbnQgc2VnbWVudCBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjM2NCBzeW1ib2xzLmM6NDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQuIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzo0MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQgYXMgXCIlc1wiLyVkLiVkLiVsZC4iCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6NTI4IHN5bWJvbHMuYzo1MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN5bWJvbCB0YWJsZSBmYWlsZWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzo4ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sIGRlZmluaXRpb24gbG9vcCBlbmNvdW50ZXJlZCBhdCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA1NCBzeW1ib2xzLmM6MTA1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA2MgotbXNnaWQgImludmFsaWQgc2VjdGlvbiBmb3Igb3BlcmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxMDY3IHN5bWJvbHMuYzoxMDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIHNldHRpbmcgJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjEwNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGZvciBvcGVyYXRpb24gc2V0dGluZyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJkaXZpc2lvbiBieSB6ZXJvIHdoZW4gc2V0dGluZyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTE2NiB3cml0ZS5jOjE4NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgcmVzb2x2ZSB2YWx1ZSBmb3Igc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTUzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJcIiVkXCIgKGluc3RhbmNlIG51bWJlciAlZCBvZiBhICVzIGxhYmVsKSIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIGdldCB2YWx1ZSBvZiB1bnJlc29sdmVkIHN5bWJvbCAlcyIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjE2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWVsZCBmeF9zaXplIHRvbyBzbWFsbCB0byBob2xkICVkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MzA2Ci1tc2dpZCAicnZhIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzo1MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byAub3JnLy5zcGFjZSBiYWNrd2FyZHM/ICglbGQpIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6OTc1Ci1tc2dpZCAicmVsb2NhdGlvbiBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzo5NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uOiAleCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjEwMjMKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZml4dXAgbm90IGNvbnRhaW5lZCB3aXRoaW4gZnJhZyIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjEwMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTEyMiB3cml0ZS5jOjExNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IENhbid0IHdyaXRlICVzIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTE3NwotbXNnaWQgIkNhbm5vdCB3cml0ZSB0byBvdXRwdXQgZmlsZS4iCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxNDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgZ2VuZXJhdGluZyBiYWQgb2JqZWN0IGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxNDE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgbm8gb2JqZWN0IGZpbGUgZ2VuZXJhdGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTgxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2NhbCBsYWJlbCAlcyBpcyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIxMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWxpZ25tZW50IHBhZGRpbmcgKCVsdSBieXRlcykgbm90IGEgbXVsdGlwbGUgb2YgJWxkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MjIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIud29yZCAlcy0lcyslcyBkaWRuJ3QgZml0IgotbXNnc3RyICIiCi0KLSMuIEdyb3d0aCBtYXkgYmUgbmVnYXRpdmUsIGJ1dCB2YXJpYWJsZSBwYXJ0IG9mIGZyYWcKLSMuIGNhbm5vdCBoYXZlIGZld2VyIHRoYW4gMCBjaGFycy4gIFRoYXQgaXMsIHdlIGNhbid0Ci0jLiAub3JnIGJhY2t3YXJkcy4KLSM6IHdyaXRlLmM6MjMwNAotbXNnaWQgImF0dGVtcHQgdG8gLm9yZyBiYWNrd2FyZHMgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIzMjAKLW1zZ2lkICIuc3BhY2Ugc3BlY2lmaWVzIG5vbi1hYnNvbHV0ZSB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIzMjQKLW1zZ2lkICIuc3BhY2Ugb3IgLmZpbGwgd2l0aCBuZWdhdGl2ZSB2YWx1ZSwgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjI1NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBcIiVzXCIgeyVzIHNlY3Rpb259IC0gIgotIlwiJXNcIiB7JXMgc2VjdGlvbn0gYXQgZmlsZSBhZGRyZXNzICVzLiIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjI3NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFsdWUgb2YgJXMgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAlcyIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvZ2FzL3JlYWQuYyBiL2dhcy9yZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDIwM2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3JlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNzYgKzAsMCBAQAotLyogcmVhZC5jIC0gcmVhZCBhIHNvdXJjZSBmaWxlIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NiwgODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZiAwCi0jZGVmaW5lIE1BU0tfQ0hBUiAoMHhGRikJLyogSWYgeW91ciBjaGFycyBhcmVuJ3QgOCBiaXRzLCB5b3Ugd2lsbAotCQkJCSAgIGNoYW5nZSB0aGlzIGEgYml0LiAgQnV0IHRoZW4sIEdOVSBpc24ndAotCQkJCSAgIHNwb3plZCB0byBydW4gb24geW91ciBtYWNoaW5lIGFueXdheS4KLQkJCQkgICAoUk1TIGlzIHNvIHNob3J0c2lnaHRlZCBzb21ldGltZXMuKQotCQkJCSAgICovCi0jZWxzZQotI2RlZmluZSBNQVNLX0NIQVIgKChpbnQpKHVuc2lnbmVkIGNoYXIpLTEpCi0jZW5kaWYKLQotCi0vKiBUaGlzIGlzIHRoZSBsYXJnZXN0IGtub3duIGZsb2F0aW5nIHBvaW50IGZvcm1hdCAoZm9yIG5vdykuIEl0IHdpbGwKLSAgIGdyb3cgd2hlbiB3ZSBkbyA0MzYxIHN0eWxlIGZsb251bXMuICovCi0KLSNkZWZpbmUgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUICgxNikKLQotLyogUm91dGluZXMgdGhhdCByZWFkIGFzc2VtYmxlciBzb3VyY2UgdGV4dCB0byBidWlsZCBzcGFnZXR0aSBpbiBtZW1vcnkuCi0gICBBbm90aGVyIGdyb3VwIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBpbiB0aGUgZXhwci5jIG1vZHVsZS4gICovCi0KLS8qIGZvciBpc2RpZ2l0KCkgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAic2IuaCIKLSNpbmNsdWRlICJtYWNyby5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJsaXN0aW5nLmgiCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotI2lmbmRlZiBUQ19TVEFSVF9MQUJFTAotI2RlZmluZSBUQ19TVEFSVF9MQUJFTCh4LHkpICh4PT0nOicpCi0jZW5kaWYKLQotLyogVGhlIE5PUF9PUENPREUgaXMgZm9yIHRoZSBhbGlnbm1lbnQgZmlsbCB2YWx1ZS4KLSAqIGZpbGwgaXQgYSBub3AgaW5zdHJ1Y3Rpb24gc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIGRvZXMgbm90IGNob2tlCi0gKiBvbiBpdAotICovCi0jaWZuZGVmIE5PUF9PUENPREUKLSNkZWZpbmUgTk9QX09QQ09ERSAweDAwCi0jZW5kaWYKLQotY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwkvKi0+bmV4dCBjaGFyIG9mIHNvdXJjZSBmaWxlIHRvIHBhcnNlLiAqLwotCi0jaWYgQklUU19QRVJfQ0hBUiAhPSA4Ci0vKiAgVGhlIGZvbGxvd2luZyB0YWJsZSBpcyBpbmRleGVkIGJ5WyhjaGFyKV0gYW5kIHdpbGwgYnJlYWsgaWYKLSAgICBhIGNoYXIgZG9lcyBub3QgaGF2ZSBleGFjdGx5IDI1NiBzdGF0ZXMgKGhvcGVmdWxseSAwOjI1NSEpISAgKi8KLWRpZSBob3JyaWJseTsKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9BVAotLyogVGhlIG04OGsgdW5mb3J0dW5hdGVseSB1c2VzIEAgYXMgYSBsYWJlbCBiZWdpbm5lci4gICovCi0jZGVmaW5lIExFWF9BVCAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfQlIKLS8qIFRoZSBSUy82MDAwIGFzc2VtYmxlciB1c2VzIHssfSxbLF0gYXMgcGFydHMgb2Ygc3ltYm9sIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX0JSIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9QQ1QKLS8qIFRoZSBEZWx0YSA2OGsgYXNzZW1ibGVyIHBlcm1pdHMgJSBpbnNpZGUgbGFiZWwgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfUENUIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9RTQotLyogVGhlIFBvd2VyUEMgV2luZG93cyBOVCBhc3NlbWJsZXJzIHBlcm1pdHMgPyBpbnNpZGUgbGFiZWwgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfUU0gMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX0hBU0gKLSNkZWZpbmUgTEVYX0hBU0ggMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX0RPTExBUgotLyogVGhlIGEyOWsgYXNzZW1ibGVyIGRvZXMgbm90IHBlcm1pdHMgbGFiZWxzIHRvIHN0YXJ0IHdpdGggJC4gICovCi0jZGVmaW5lIExFWF9ET0xMQVIgMwotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX1RJTERFCi0vKiBUaGUgRGVsdGEgNjhrIGFzc2VtYmxlciBwZXJtaXRzIH4gYXQgc3RhcnQgb2YgbGFiZWwgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfVElMREUgMAotI2VuZGlmCi0KLS8qIHVzZWQgYnkgaXNfLi4uIG1hY3Jvcy4gb3VyIGN0eXBlW10gKi8KLWNoYXIgbGV4X3R5cGVbMjU2XSA9Ci17Ci0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIEBBQkNERUZHSElKS0xNTk8gKi8KLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogUFFSU1RVVldYWVpbXF1eXyAqLwotICAwLCAwLCAwLCBMRVhfSEFTSCwgTEVYX0RPTExBUiwgTEVYX1BDVCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgLyogXyEiIyQlJicoKSorLC0uLyAqLwotICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCBMRVhfUU0sCS8qIDAxMjM0NTY3ODk6Ozw9Pj8gKi8KLSAgTEVYX0FULCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAkvKiBAQUJDREVGR0hJSktMTU5PICovCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIExFWF9CUiwgMCwgTEVYX0JSLCAwLCAzLCAvKiBQUVJTVFVWV1hZWltcXV5fICovCi0gIDAsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCS8qIGBhYmNkZWZnaGlqa2xtbm8gKi8KLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgTEVYX0JSLCAwLCBMRVhfQlIsIExFWF9USUxERSwgMCwgLyogcHFyc3R1dnd4eXp7fH1+LiAqLwotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzCi19OwotCi0KLS8qCi0gKiBJbjogYSBjaGFyYWN0ZXIuCi0gKiBPdXQ6IDEgaWYgdGhpcyBjaGFyYWN0ZXIgZW5kcyBhIGxpbmUuCi0gKi8KLSNkZWZpbmUgWl8gKDApCi1jaGFyIGlzX2VuZF9vZl9saW5lWzI1Nl0gPQotewotI2lmZGVmIENSX0VPTAotICA5OSwgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgOTksIFpfLCBaXywJLyogQGFiY2RlZmdoaWprbG1ubyAqLwotI2Vsc2UKLSAgOTksIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIDk5LCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIEBhYmNkZWZnaGlqa2xtbm8gKi8KLSNlbmRpZgotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSNpZmRlZiBUQ19IUFBBCi0gIFpfLDk5LCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIF8hIiMkJSYnKCkqKywtLi8gKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIDAxMjM0NTY3ODk6Ozw9Pj8gKi8KLSNlbHNlCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIDk5LCBaXywgWl8sIFpfLCBaXywJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLwotI2VuZGlmCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi19OwotI3VuZGVmIFpfCi0KLS8qIEZ1bmN0aW9ucyBwcml2YXRlIHRvIHRoaXMgZmlsZS4gKi8KLQotc3RhdGljIGNoYXIgKmJ1ZmZlcjsJLyogMXN0IGNoYXIgb2YgZWFjaCBidWZmZXIgb2YgbGluZXMgaXMgaGVyZS4gKi8KLXN0YXRpYyBjaGFyICpidWZmZXJfbGltaXQ7CS8qLT4xICsgbGFzdCBjaGFyIGluIGJ1ZmZlci4gKi8KLQotLyogVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gaXMgcmVxdWlyZWQgdG8gYmUgZGVmaW5lZCB0byBlaXRoZXIgMCBvciAxIGluIHRoZQotICAgdGMtPENQVT4uaCBmaWxlLiAgU2VlIHRoZSAiUG9ydGluZyBHQVMiIHNlY3Rpb24gb2YgdGhlIGludGVybmFscyBtYW51YWwuICovCi1pbnQgdGFyZ2V0X2JpZ19lbmRpYW4gPSBUQVJHRVRfQllURVNfQklHX0VORElBTjsKLQotc3RhdGljIGNoYXIgKm9sZF9idWZmZXI7CS8qIEpGIGEgaGFjayAqLwotc3RhdGljIGNoYXIgKm9sZF9pbnB1dDsKLXN0YXRpYyBjaGFyICpvbGRfbGltaXQ7Ci0KLS8qIFZhcmlhYmxlcyBmb3IgaGFuZGxpbmcgaW5jbHVkZSBmaWxlIGRpcmVjdG9yeSB0YWJsZS4gKi8KLQotY2hhciAqKmluY2x1ZGVfZGlyczsJLyogVGFibGUgb2YgcG9pbnRlcnMgdG8gZGlyZWN0b3JpZXMgdG8KLQkJCSAgIHNlYXJjaCBmb3IgLmluY2x1ZGUncyAqLwotaW50IGluY2x1ZGVfZGlyX2NvdW50OwkvKiBIb3cgbWFueSBhcmUgaW4gdGhlIHRhYmxlICovCi1pbnQgaW5jbHVkZV9kaXJfbWF4bGVuID0gMTsvKiBMZW5ndGggb2YgbG9uZ2VzdCBpbiB0YWJsZSAqLwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLXN0cnVjdCBicm9rZW5fd29yZCAqYnJva2VuX3dvcmRzOwotaW50IG5ld19icm9rZW5fd29yZHM7Ci0jZW5kaWYKLQotLyogVGhlIGN1cnJlbnQgb2Zmc2V0IGludG8gdGhlIGFic29sdXRlIHNlY3Rpb24uICBXZSBkb24ndCB0cnkgdG8KLSAgIGJ1aWxkIGZyYWdzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBzaW5jZSBubyBkYXRhIGNhbiBiZSBzdG9yZWQKLSAgIHRoZXJlLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IG9mZnNldC4gICovCi1hZGRyZXNzVCBhYnNfc2VjdGlvbl9vZmZzZXQ7Ci0KLS8qIElmIHRoaXMgbGluZSBoYWQgYW4gTVJJIHN0eWxlIGxhYmVsLCBpdCBpcyBzdG9yZWQgaW4gdGhpcyB2YXJpYWJsZS4KLSAgIFRoaXMgaXMgdXNlZCBieSBzb21lIG9mIHRoZSBNUkkgcHNldWRvLW9wcy4gICovCi1zeW1ib2xTICpsaW5lX2xhYmVsOwotCi0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIHRvIHN1cHBvcnQgTVJJIGNvbW1vbiBzZWN0aW9ucy4gIFdlCi0gICB0cmFuc2xhdGUgc3VjaCBzZWN0aW9ucyBpbnRvIGEgY29tbW9uIHN5bWJvbC4gIFRoaXMgdmFyaWFibGUgaXMKLSAgIG5vbi1OVUxMIHdoZW4gd2UgYXJlIGluIGFuIE1SSSBjb21tb24gc2VjdGlvbi4gICovCi1zeW1ib2xTICptcmlfY29tbW9uX3N5bWJvbDsKLQotLyogSW4gTVJJIG1vZGUsIGFmdGVyIGEgZGMuYiBwc2V1ZG8tb3Agd2l0aCBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZQotICAgbmVlZCB0byBhbGlnbiB0byBhbiBldmVuIGJ5dGUgYm91bmRhcnkgdW5sZXNzIHRoZSBuZXh0IHBzZXVkby1vcCBpcwotICAgZGMuYiwgZHMuYiwgb3IgZGNiLmIuICBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byAxIGlmIGFuIGFsaWdubWVudAotICAgbWF5IGJlIG5lZWRlZC4gICovCi1zdGF0aWMgaW50IG1yaV9wZW5kaW5nX2FsaWduOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNpZmRlZiBPQkpfRUxGCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byBiZSBub24temVybyBpZiB0aGUgbmV4dCBzdHJpbmcgd2Ugc2VlIG1pZ2h0Ci0gICBiZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgaW4gRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgU2VlCi0gICB0aGUgY29tbWVudCBpbiBlbWl0X2V4cHIgZm9yIHRoZSBmb3JtYXQgd2UgbG9vayBmb3IuICAqLwotc3RhdGljIGludCBkd2FyZl9maWxlX3N0cmluZzsKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNvbnNfd29ya2VyIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgaW50IHNjcnViX2Zyb21fc3RyaW5nIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19hbGlnbiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxpZ24gUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbGNvbW1faW50ZXJuYWwgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgaGV4X2Zsb2F0IFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci1zdGF0aWMgaW5saW5lIGludCBzaXplb2Zfc2xlYjEyOCBQQVJBTVMgKChvZmZzZXRUKSk7Ci1zdGF0aWMgaW5saW5lIGludCBzaXplb2ZfdWxlYjEyOCBQQVJBTVMgKCh2YWx1ZVQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IG91dHB1dF9zbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgb2Zmc2V0VCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X3VsZWIxMjggUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IG91dHB1dF9iaWdfc2xlYjEyOCBQQVJBTVMgKChjaGFyICosIExJVFRMRU5VTV9UWVBFICosIGludCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X2JpZ191bGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgTElUVExFTlVNX1RZUEUgKiwgaW50KSk7Ci1zdGF0aWMgaW50IG91dHB1dF9iaWdfbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgTElUVExFTlVNX1RZUEUgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX29yZyBQQVJBTVMgKChzZWdULCBleHByZXNzaW9uUyAqLCBpbnQpKTsKLWNoYXIgKmRlbWFuZF9jb3B5X3N0cmluZyBQQVJBTVMgKChpbnQgKmxlblApKTsKLXN0YXRpYyBzZWdUIGdldF9zZWdtZW50ZWRfZXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwUCkpOwotc3RhdGljIHNlZ1QgZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwUCkpOwotc3RhdGljIHZvaWQgcG9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldF9saW5lX3NiIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX2ZpbGVfZGVidWcgUEFSQU1TICgodm9pZCkpOwotDAotCi12b2lkCi1yZWFkX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0KLSAgcG9iZWdpbiAoKTsKLSAgb2JqX3JlYWRfYmVnaW5faG9vayAoKTsKLQotICAvKiBTb21ldGhpbmcgY2xvc2UgLS0gYnV0IG5vdCB0b28gY2xvc2UgLS0gdG8gYSBtdWx0aXBsZSBvZiAxMDI0LgotICAgICBUaGUgZGVidWdnaW5nIG1hbGxvYyBJJ20gdXNpbmcgaGFzIDI0IGJ5dGVzIG9mIG92ZXJoZWFkLiAgKi8KLSAgb2JzdGFja19iZWdpbiAoJm5vdGVzLCBjaHVua3NpemUpOwotICBvYnN0YWNrX2JlZ2luICgmY29uZF9vYnN0YWNrLCBjaHVua3NpemUpOwotCi0gIC8qIFVzZSBtYWNoaW5lIGRlcGVuZGVudCBzeW50YXggKi8KLSAgZm9yIChwID0gbGluZV9zZXBhcmF0b3JfY2hhcnM7ICpwOyBwKyspCi0gICAgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpwXSA9IDE7Ci0gIC8qIFVzZSBtb3JlLiAgRklYTUUtU09NRURBWS4gKi8KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbGV4X3R5cGVbJz8nXSA9IDM7Ci19Ci0MCi0vKiBzZXQgdXAgcHNldWRvLW9wIHRhYmxlcyAqLwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcG9faGFzaDsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBwb3RhYmxlW10gPQotewotICB7ImFib3J0Iiwgc19hYm9ydCwgMH0sCi0gIHsiYWxpZ24iLCBzX2FsaWduX3B0d28sIDB9LAotICB7ImFzY2lpIiwgc3RyaW5nZXIsIDB9LAotICB7ImFzY2l6Iiwgc3RyaW5nZXIsIDF9LAotICB7ImJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAotICB7ImJhbGlnbnciLCBzX2FsaWduX2J5dGVzLCAtMn0sCi0gIHsiYmFsaWdubCIsIHNfYWxpZ25fYnl0ZXMsIC00fSwKLS8qIGJsb2NrICovCi0gIHsiYnl0ZSIsIGNvbnMsIDF9LAotICB7ImNvbW0iLCBzX2NvbW0sIDB9LAotICB7ImNvbW1vbiIsIHNfbXJpX2NvbW1vbiwgMH0sCi0gIHsiY29tbW9uLnMiLCBzX21yaV9jb21tb24sIDF9LAotICB7ImRhdGEiLCBzX2RhdGEsIDB9LAotICB7ImRjIiwgY29ucywgMn0sCi0gIHsiZGMuYiIsIGNvbnMsIDF9LAotICB7ImRjLmQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImRjLmwiLCBjb25zLCA0fSwKLSAgeyJkYy5zIiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJkYy53IiwgY29ucywgMn0sCi0gIHsiZGMueCIsIGZsb2F0X2NvbnMsICd4J30sCi0gIHsiZGNiIiwgc19zcGFjZSwgMn0sCi0gIHsiZGNiLmIiLCBzX3NwYWNlLCAxfSwKLSAgeyJkY2IuZCIsIHNfZmxvYXRfc3BhY2UsICdkJ30sCi0gIHsiZGNiLmwiLCBzX3NwYWNlLCA0fSwKLSAgeyJkY2IucyIsIHNfZmxvYXRfc3BhY2UsICdmJ30sCi0gIHsiZGNiLnciLCBzX3NwYWNlLCAyfSwKLSAgeyJkY2IueCIsIHNfZmxvYXRfc3BhY2UsICd4J30sCi0gIHsiZHMiLCBzX3NwYWNlLCAyfSwKLSAgeyJkcy5iIiwgc19zcGFjZSwgMX0sCi0gIHsiZHMuZCIsIHNfc3BhY2UsIDh9LAotICB7ImRzLmwiLCBzX3NwYWNlLCA0fSwKLSAgeyJkcy5wIiwgc19zcGFjZSwgMTJ9LAotICB7ImRzLnMiLCBzX3NwYWNlLCA0fSwKLSAgeyJkcy53Iiwgc19zcGFjZSwgMn0sCi0gIHsiZHMueCIsIHNfc3BhY2UsIDEyfSwKLSAgeyJkZWJ1ZyIsIHNfaWdub3JlLCAwfSwKLSNpZmRlZiBTX1NFVF9ERVNDCi0gIHsiZGVzYyIsIHNfZGVzYywgMH0sCi0jZW5kaWYKLS8qIGRpbSAqLwotICB7ImRvdWJsZSIsIGZsb2F0X2NvbnMsICdkJ30sCi0vKiBkc2VjdCAqLwotICB7ImVqZWN0IiwgbGlzdGluZ19lamVjdCwgMH0sCS8qIEZvcm1mZWVkIGxpc3RpbmcgKi8KLSAgeyJlbHNlIiwgc19lbHNlLCAwfSwKLSAgeyJlbHNlYyIsIHNfZWxzZSwgMH0sCi0gIHsiZW5kIiwgc19lbmQsIDB9LAotICB7ImVuZGMiLCBzX2VuZGlmLCAwfSwKLSAgeyJlbmRmdW5jIiwgc19mdW5jLCAxfSwKLSAgeyJlbmRpZiIsIHNfZW5kaWYsIDB9LAotLyogZW5kZWYgKi8KLSAgeyJlcXUiLCBzX3NldCwgMH0sCi0gIHsiZXF1aXYiLCBzX3NldCwgMX0sCi0gIHsiZXJyIiwgc19lcnIsIDB9LAotICB7ImV4aXRtIiwgc19tZXhpdCwgMH0sCi0vKiBleHRlbmQgKi8KLSAgeyJleHRlcm4iLCBzX2lnbm9yZSwgMH0sCS8qIFdlIHRyZWF0IGFsbCB1bmRlZiBhcyBleHQgKi8KLSAgeyJhcHBmaWxlIiwgc19hcHBfZmlsZSwgMX0sCi0gIHsiYXBwbGluZSIsIHNfYXBwX2xpbmUsIDB9LAotICB7ImZhaWwiLCBzX2ZhaWwsIDB9LAotICB7ImZpbGUiLCBzX2FwcF9maWxlLCAwfSwKLSAgeyJmaWxsIiwgc19maWxsLCAwfSwKLSAgeyJmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZm9ybWF0Iiwgc19pZ25vcmUsIDB9LAotICB7ImZ1bmMiLCBzX2Z1bmMsIDB9LAotICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAotICB7Imdsb2JsIiwgc19nbG9ibCwgMH0sCi0gIHsiaHdvcmQiLCBjb25zLCAyfSwKLSAgeyJpZiIsIHNfaWYsIChpbnQpIE9fbmV9LAotICB7ImlmYyIsIHNfaWZjLCAwfSwKLSAgeyJpZmRlZiIsIHNfaWZkZWYsIDB9LAotICB7ImlmZXEiLCBzX2lmLCAoaW50KSBPX2VxfSwKLSAgeyJpZmVxcyIsIHNfaWZlcXMsIDB9LAotICB7ImlmZ2UiLCBzX2lmLCAoaW50KSBPX2dlfSwKLSAgeyJpZmd0Iiwgc19pZiwgKGludCkgT19ndH0sCi0gIHsiaWZsZSIsIHNfaWYsIChpbnQpIE9fbGV9LAotICB7ImlmbHQiLCBzX2lmLCAoaW50KSBPX2x0fSwKLSAgeyJpZm5jIiwgc19pZmMsIDF9LAotICB7ImlmbmRlZiIsIHNfaWZkZWYsIDF9LAotICB7ImlmbmUiLCBzX2lmLCAoaW50KSBPX25lfSwKLSAgeyJpZm5lcyIsIHNfaWZlcXMsIDF9LAotICB7Imlmbm90ZGVmIiwgc19pZmRlZiwgMX0sCi0gIHsiaW5jbHVkZSIsIHNfaW5jbHVkZSwgMH0sCi0gIHsiaW50IiwgY29ucywgNH0sCi0gIHsiaXJwIiwgc19pcnAsIDB9LAotICB7ImlyZXAiLCBzX2lycCwgMH0sCi0gIHsiaXJwYyIsIHNfaXJwLCAxfSwKLSAgeyJpcmVwYyIsIHNfaXJwLCAxfSwKLSAgeyJsY29tbSIsIHNfbGNvbW0sIDB9LAotICB7ImxmbGFncyIsIGxpc3RpbmdfZmxhZ3MsIDB9LAkvKiBMaXN0aW5nIGZsYWdzICovCi0gIHsibGlua29uY2UiLCBzX2xpbmtvbmNlLCAwfSwKLSAgeyJsaXN0IiwgbGlzdGluZ19saXN0LCAxfSwJLyogVHVybiBsaXN0aW5nIG9uICovCi0gIHsibGxlbiIsIGxpc3RpbmdfcHNpemUsIDF9LAotICB7ImxvbmciLCBjb25zLCA0fSwKLSAgeyJsc3ltIiwgc19sc3ltLCAwfSwKLSAgeyJtYWNybyIsIHNfbWFjcm8sIDB9LAotICB7Im1leGl0Iiwgc19tZXhpdCwgMH0sCi0gIHsibXJpIiwgc19tcmksIDB9LAotICB7Ii5tcmkiLCBzX21yaSwgMH0sCS8qIFNwZWNpYWwgY2FzZSBzbyAubXJpIHdvcmtzIGluIE1SSSBtb2RlLiAgKi8KLSAgeyJuYW1lIiwgc19pZ25vcmUsIDB9LAotICB7Im5vZm9ybWF0Iiwgc19pZ25vcmUsIDB9LAotICB7Im5vbGlzdCIsIGxpc3RpbmdfbGlzdCwgMH0sCS8qIFR1cm4gbGlzdGluZyBvZmYgKi8KLSAgeyJub3BhZ2UiLCBsaXN0aW5nX25vcGFnZSwgMH0sCi0gIHsib2N0YSIsIGNvbnMsIDE2fSwKLSAgeyJvZmZzZXQiLCBzX3N0cnVjdCwgMH0sCi0gIHsib3JnIiwgc19vcmcsIDB9LAotICB7InAyYWxpZ24iLCBzX2FsaWduX3B0d28sIDB9LAotICB7InAyYWxpZ253Iiwgc19hbGlnbl9wdHdvLCAtMn0sCi0gIHsicDJhbGlnbmwiLCBzX2FsaWduX3B0d28sIC00fSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicGxlbiIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7InByaW50Iiwgc19wcmludCwgMH0sCi0gIHsicHNpemUiLCBsaXN0aW5nX3BzaXplLCAwfSwJLyogc2V0IHBhcGVyIHNpemUgKi8KLSAgeyJwdXJnZW0iLCBzX3B1cmdlbSwgMH0sCi0gIHsicXVhZCIsIGNvbnMsIDh9LAotICB7InJlcCIsIHNfcmVwdCwgMH0sCi0gIHsicmVwdCIsIHNfcmVwdCwgMH0sCi0gIHsicnZhIiwgc19ydmEsIDR9LAotICB7InNidHRsIiwgbGlzdGluZ190aXRsZSwgMX0sCS8qIFN1YnRpdGxlIG9mIGxpc3RpbmcgKi8KLS8qIHNjbCAqLwotLyogc2VjdCAqLwotICB7InNldCIsIHNfc2V0LCAwfSwKLSAgeyJzaG9ydCIsIGNvbnMsIDJ9LAotICB7InNpbmdsZSIsIGZsb2F0X2NvbnMsICdmJ30sCi0vKiBzaXplICovCi0gIHsic3BhY2UiLCBzX3NwYWNlLCAwfSwKLSAgeyJza2lwIiwgc19zcGFjZSwgMH0sCi0gIHsic2xlYjEyOCIsIHNfbGViMTI4LCAxfSwKLSAgeyJzcGMiLCBzX2lnbm9yZSwgMH0sCi0gIHsic3RhYmQiLCBzX3N0YWIsICdkJ30sCi0gIHsic3RhYm4iLCBzX3N0YWIsICduJ30sCi0gIHsic3RhYnMiLCBzX3N0YWIsICdzJ30sCi0gIHsic3RyaW5nIiwgc3RyaW5nZXIsIDF9LAotICB7InN0cnVjdCIsIHNfc3RydWN0LCAwfSwKLS8qIHRhZyAqLwotICB7InRleHQiLCBzX3RleHQsIDB9LAotCi0gIC8qIFRoaXMgaXMgZm9yIGdjYyB0byB1c2UuICBJdCdzIG9ubHkganVzdCBiZWVuIGFkZGVkICgyLzk0KSwgc28gZ2NjCi0gICAgIHdvbid0IGJlIGFibGUgdG8gdXNlIGl0IGZvciBhIHdoaWxlIC0tIHByb2JhYmx5IGEgeWVhciBvciBtb3JlLgotICAgICBCdXQgb25jZSB0aGlzIGhhcyBiZWVuIHJlbGVhc2VkLCBjaGVjayB3aXRoIGdjYyBtYWludGFpbmVycwotICAgICBiZWZvcmUgZGVsZXRpbmcgaXQgb3IgZXZlbiBjaGFuZ2luZyB0aGUgc3BlbGxpbmcuICAqLwotICB7InRoaXNfR0NDX3JlcXVpcmVzX3RoZV9HTlVfYXNzZW1ibGVyIiwgc19pZ25vcmUsIDB9LAotICAvKiBJZiB3ZSdyZSBmb2xkaW5nIGNhc2UgLS0gZG9uZSBmb3Igc29tZSB0YXJnZXRzLCBub3QgbmVjZXNzYXJpbHkKLSAgICAgYWxsIC0tIHRoZSBhYm92ZSBzdHJpbmcgaW4gYW4gaW5wdXQgZmlsZSB3aWxsIGJlIGNvbnZlcnRlZCB0bwotICAgICB0aGlzIG9uZS4gIE1hdGNoIGl0IGVpdGhlciB3YXkuLi4gICovCi0gIHsidGhpc19nY2NfcmVxdWlyZXNfdGhlX2dudV9hc3NlbWJsZXIiLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJ0aXRsZSIsIGxpc3RpbmdfdGl0bGUsIDB9LAkvKiBMaXN0aW5nIHRpdGxlICovCi0gIHsidHRsIiwgbGlzdGluZ190aXRsZSwgMH0sCi0vKiB0eXBlICovCi0gIHsidWxlYjEyOCIsIHNfbGViMTI4LCAwfSwKLS8qIHVzZSAqLwotLyogdmFsICovCi0gIHsieGNvbSIsIHNfY29tbSwgMH0sCi0gIHsieGRlZiIsIHNfZ2xvYmwsIDB9LAotICB7InhyZWYiLCBzX2lnbm9yZSwgMH0sCi0gIHsieHN0YWJzIiwgc194c3RhYiwgJ3MnfSwKLSAgeyJ3b3JkIiwgY29ucywgMn0sCi0gIHsiemVybyIsIHNfc3BhY2UsIDB9LAotICB7TlVMTCwgTlVMTCwgMH0JCQkvKiBlbmQgc2VudGluZWwgKi8KLX07Ci0KLXN0YXRpYyBpbnQgcG9wX292ZXJyaWRlX29rID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpwb3BfdGFibGVfbmFtZTsKLQotdm9pZAotcG9wX2luc2VydCAodGFibGUpCi0gICAgIGNvbnN0IHBzZXVkb190eXBlUyAqdGFibGU7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycnR4dDsKLSAgY29uc3QgcHNldWRvX3R5cGVTICpwb3A7Ci0gIGZvciAocG9wID0gdGFibGU7IHBvcC0+cG9jX25hbWU7IHBvcCsrKQotICAgIHsKLSAgICAgIGVycnR4dCA9IGhhc2hfaW5zZXJ0IChwb19oYXNoLCBwb3AtPnBvY19uYW1lLCAoY2hhciAqKSBwb3ApOwotICAgICAgaWYgKGVycnR4dCAmJiAoIXBvcF9vdmVycmlkZV9vayB8fCBzdHJjbXAgKGVycnR4dCwgImV4aXN0cyIpKSkKLQlhc19mYXRhbCAoXygiZXJyb3IgY29uc3RydWN0aW5nICVzIHBzZXVkby1vcCB0YWJsZTogJXMiKSwgcG9wX3RhYmxlX25hbWUsCi0JCSAgZXJydHh0KTsKLSAgICB9Ci19Ci0KLSNpZm5kZWYgbWRfcG9wX2luc2VydAotI2RlZmluZSBtZF9wb3BfaW5zZXJ0KCkJCXBvcF9pbnNlcnQobWRfcHNldWRvX3RhYmxlKQotI2VuZGlmCi0KLSNpZm5kZWYgb2JqX3BvcF9pbnNlcnQKLSNkZWZpbmUgb2JqX3BvcF9pbnNlcnQoKQlwb3BfaW5zZXJ0KG9ial9wc2V1ZG9fdGFibGUpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgCi1wb2JlZ2luICgpCi17Ci0gIHBvX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAvKiBEbyB0aGUgdGFyZ2V0LXNwZWNpZmljIHBzZXVkbyBvcHMuICovCi0gIHBvcF90YWJsZV9uYW1lID0gIm1kIjsKLSAgbWRfcG9wX2luc2VydCAoKTsKLQotICAvKiBOb3cgb2JqZWN0IHNwZWNpZmljLiAgU2tpcCBhbnkgdGhhdCB3ZXJlIGluIHRoZSB0YXJnZXQgdGFibGUuICovCi0gIHBvcF90YWJsZV9uYW1lID0gIm9iaiI7Ci0gIHBvcF9vdmVycmlkZV9vayA9IDE7Ci0gIG9ial9wb3BfaW5zZXJ0ICgpOwotCi0gIC8qIE5vdyBwb3J0YWJsZSBvbmVzLiAgU2tpcCBhbnkgdGhhdCB3ZSd2ZSBzZWVuIGFscmVhZHkuICovCi0gIHBvcF90YWJsZV9uYW1lID0gInN0YW5kYXJkIjsKLSAgcG9wX2luc2VydCAocG90YWJsZSk7Ci19Ci0MCi0jZGVmaW5lIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSgpCQkJCQlcCi0gIGlmIChpZ25vcmVfaW5wdXQgKCkpCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIrK10pCVwKLQlpZiAoaW5wdXRfbGluZV9wb2ludGVyID09IGJ1ZmZlcl9saW1pdCkJCQkJXAotCSAgYnJlYWs7CQkJCQkJCVwKLSAgICAgIGNvbnRpbnVlOwkJCQkJCQkJXAotICAgIH0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBzY3J1YmJpbmcgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiAjQVBQCi0gICBhbmQgI05PX0FQUC4gICovCi0KLXN0YXRpYyBjaGFyICpzY3J1Yl9zdHJpbmc7Ci1zdGF0aWMgY2hhciAqc2NydWJfc3RyaW5nX2VuZDsKLQotc3RhdGljIGludAotc2NydWJfZnJvbV9zdHJpbmcgKGJ1ZiwgYnVmbGVuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIGludCBjb3B5OwotCi0gIGNvcHkgPSBzY3J1Yl9zdHJpbmdfZW5kIC0gc2NydWJfc3RyaW5nOwotICBpZiAoY29weSA+IGJ1ZmxlbikKLSAgICBjb3B5ID0gYnVmbGVuOwotICBtZW1jcHkgKGJ1Ziwgc2NydWJfc3RyaW5nLCBjb3B5KTsKLSAgc2NydWJfc3RyaW5nICs9IGNvcHk7Ci0gIHJldHVybiBjb3B5OwotfQotCi0vKglyZWFkX2Ffc291cmNlX2ZpbGUoKQotICoKLSAqIFdlIHJlYWQgdGhlIGZpbGUsIHB1dHRpbmcgdGhpbmdzIGludG8gYSB3ZWIgdGhhdAotICogcmVwcmVzZW50cyB3aGF0IHdlIGhhdmUgYmVlbiByZWFkaW5nLgotICovCi12b2lkIAotcmVhZF9hX3NvdXJjZV9maWxlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnM7CQkvKiBzdHJpbmcgb2Ygc3ltYm9sLCAnXDAnIGFwcGVuZGVkICovCi0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICBwc2V1ZG9fdHlwZVMgKnBvcDsKLQotICBidWZmZXIgPSBpbnB1dF9zY3J1Yl9uZXdfZmlsZSAobmFtZSk7Ci0KLSAgbGlzdGluZ19maWxlIChuYW1lKTsKLSAgbGlzdGluZ19uZXdsaW5lIChOVUxMKTsKLSAgcmVnaXN0ZXJfZGVwZW5kZW5jeSAobmFtZSk7Ci0KLSAgLyogR2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJlZm9yZSB3ZSd2ZSByZWFkIGFueXRoaW5nIGluIHRvIGRlbm90ZQotICAgICB0aGlzIGZpbGUgYXMgdGhlICJtYWluIiBzb3VyY2UgZmlsZSBhbmQgbm90IGEgc3Vib3JkaW5hdGUgb25lCi0gICAgIChlLmcuIE5fU08gdnMgTl9TT0wgaW4gc3RhYnMpLiAgKi8KLSAgZ2VuZXJhdGVfZmlsZV9kZWJ1ZyAoKTsKLQotICB3aGlsZSAoKGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKSkgIT0gMCkKLSAgICB7CQkJCS8qIFdlIGhhdmUgYW5vdGhlciBsaW5lIHRvIHBhcnNlLiAqLwotICAgICAga25vdyAoYnVmZmVyX2xpbWl0Wy0xXSA9PSAnXG4nKTsJLyogTXVzdCBoYXZlIGEgc2VudGluZWwuICovCi0gICAgY29udGluOgkJCS8qIEpGIHRoaXMgZ290byBpcyBteSBmYXVsdCBJIGFkbWl0IGl0LgotCQkJCSAgIFNvbWVvbmUgYnJhdmUgcGxlYXNlIHJlLXdyaXRlIHRoZSB3aG9sZQotCQkJCSAgIGlucHV0IHNlY3Rpb24gaGVyZT8gIFBsZWV6ZT8/PyAgKi8KLSAgICAgIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQpCi0JewotCSAgLyogV2UgaGF2ZSBtb3JlIG9mIHRoaXMgYnVmZmVyIHRvIHBhcnNlLiAqLwotCi0JICAvKgotCSAgICogV2Ugbm93IGhhdmUgaW5wdXRfbGluZV9wb2ludGVyLT4xc3QgY2hhciBvZiBuZXh0IGxpbmUuCi0JICAgKiBJZiBpbnB1dF9saW5lX3BvaW50ZXIgWy0xXSA9PSAnXG4nIHRoZW4gd2UganVzdAotCSAgICogc2Nhbm5lZCBhbm90aGVyIGxpbmU6IHNvIGJ1bXAgbGluZSBjb3VudGVycy4KLQkgICAqLwotCSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdXSkKLQkgICAgewotI2lmZGVmIG1kX3N0YXJ0X2xpbmVfaG9vawotCSAgICAgIG1kX3N0YXJ0X2xpbmVfaG9vayAoKTsKLSNlbmRpZgotCi0JICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1xuJykKLQkJYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCi0JICAgICAgbGluZV9sYWJlbCA9IE5VTEw7Ci0KLQkgICAgICBpZiAoZmxhZ19tNjhrX21yaQotI2lmZGVmIExBQkVMU19XSVRIT1VUX0NPTE9OUwotCQkgIHx8IDEKLSNlbmRpZgotCQkgICkKLQkJewotCQkgIC8qIFRleHQgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBtdXN0IGJlIGEgbGFiZWwsIHdlCi0JCSAgICAgcnVuIGRvd24gYW5kIHN0aWNrIGEgY29sb24gaW4uICAqLwotCQkgIGlmIChpc19uYW1lX2JlZ2lubmVyICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkJICAgIHsKLQkJICAgICAgY2hhciAqbGluZV9zdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICAgICAgY2hhciBjOwotCQkgICAgICBpbnQgbXJpX2xpbmVfbWFjcm87Ci0KLQkJICAgICAgTElTVElOR19ORVdMSU5FICgpOwotCQkgICAgICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7Ci0KLQkJICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JCSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgRVFVIGFuZCBNQUNSTyBwc2V1ZG9vcHMgbXVzdAotCQkJIGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgKi8KLQkJICAgICAgbXJpX2xpbmVfbWFjcm8gPSAwOwotCQkgICAgICBpZiAoZmxhZ19tNjhrX21yaSkKLQkJCXsKLQkJCSAgY2hhciAqcmVzdCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0KLQkJCSAgaWYgKCpyZXN0ID09ICc6JykKLQkJCSAgICArK3Jlc3Q7Ci0JCQkgIGlmICgqcmVzdCA9PSAnICcgfHwgKnJlc3QgPT0gJ1x0JykKLQkJCSAgICArK3Jlc3Q7Ci0JCQkgIGlmICgoc3RybmNhc2VjbXAgKHJlc3QsICJFUVUiLCAzKSA9PSAwCi0JCQkgICAgICAgfHwgc3RybmNhc2VjbXAgKHJlc3QsICJTRVQiLCAzKSA9PSAwKQotCQkJICAgICAgJiYgKHJlc3RbM10gPT0gJyAnIHx8IHJlc3RbM10gPT0gJ1x0JykpCi0JCQkgICAgewotCQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcmVzdCArIDM7Ci0JCQkgICAgICBlcXVhbHMgKGxpbmVfc3RhcnQsCi0JCQkJICAgICAgc3RybmNhc2VjbXAgKHJlc3QsICJTRVQiLCAzKSA9PSAwKTsKLQkJCSAgICAgIGNvbnRpbnVlOwotCQkJICAgIH0KLQkJCSAgaWYgKHN0cm5jYXNlY21wIChyZXN0LCAiTUFDUk8iLCA1KSA9PSAwCi0JCQkgICAgICAmJiAocmVzdFs1XSA9PSAnICcKLQkJCQkgIHx8IHJlc3RbNV0gPT0gJ1x0JwotCQkJCSAgfHwgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIHJlc3RbNV1dKSkKLQkJCSAgICBtcmlfbGluZV9tYWNybyA9IDE7Ci0JCQl9Ci0KLQkJICAgICAgLyogSW4gTVJJIG1vZGUsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBNQUNSTwotICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkby1vcCBzcGVjaWFsbHk6IHdlIGRvbid0IHdhbnQgdG8gcHV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQkJICAgICAgaWYgKCEgbXJpX2xpbmVfbWFjcm8pCi0JCQlsaW5lX2xhYmVsID0gY29sb24gKGxpbmVfc3RhcnQpOwotCQkgICAgICBlbHNlCi0JCQlsaW5lX2xhYmVsID0gc3ltYm9sX2NyZWF0ZSAobGluZV9zdGFydCwKLQkJCQkJCSAgICBhYnNvbHV0ZV9zZWN0aW9uLAotCQkJCQkJICAgICh2YWx1ZVQpIDAsCi0JCQkJCQkgICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgICAgaWYgKGMgPT0gJzonKQotCQkJaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKgotCSAgICogV2UgYXJlIGF0IHRoZSBiZWdpbmluZyBvZiBhIGxpbmUsIG9yIHNpbWlsYXIgcGxhY2UuCi0JICAgKiBXZSBleHBlY3QgYSB3ZWxsLWZvcm1lZCBhc3NlbWJsZXIgc3RhdGVtZW50LgotCSAgICogQSAic3ltYm9sLW5hbWU6IiBpcyBhIHN0YXRlbWVudC4KLQkgICAqCi0JICAgKiBEZXBlbmRpbmcgb24gd2hhdCBjb21waWxlciBpcyB1c2VkLCB0aGUgb3JkZXIgb2YgdGhlc2UgdGVzdHMKLQkgICAqIG1heSB2YXJ5IHRvIGNhdGNoIG1vc3QgY29tbW9uIGNhc2UgMXN0LgotCSAgICogRWFjaCB0ZXN0IGlzIGluZGVwZW5kZW50IG9mIGFsbCBvdGhlciB0ZXN0cyBhdCB0aGUgKHRvcCkgbGV2ZWwuCi0JICAgKiBQTEVBU0UgbWFrZSBhIGNvbXBpbGVyIHRoYXQgZG9lc24ndCB1c2UgdGhpcyBhc3NlbWJsZXIuCi0JICAgKiBJdCBpcyBjcnVmdHkgdG8gd2FzdGUgYSBjb21waWxlcidzIHRpbWUgZW5jb2RpbmcgdGhpbmdzIGZvciB0aGlzCi0JICAgKiBhc3NlbWJsZXIsIHdoaWNoIHRoZW4gd2FzdGVzIG1vcmUgdGltZSBkZWNvZGluZyBpdC4KLQkgICAqIChBbmQgY29tbXVuaWNhdGluZyB2aWEgKGxpbmVhcikgZmlsZXMgaXMgc2lsbHkhCi0JICAgKiBJZiB5b3UgbXVzdCBwYXNzIHN0dWZmLCBwbGVhc2UgcGFzcyBhIHRyZWUhKQotCSAgICovCi0JICBpZiAoKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspID09ICdcdCcKLQkgICAgICB8fCBjID09ICcgJwotCSAgICAgIHx8IGMgPT0gJ1xmJwotCSAgICAgIHx8IGMgPT0gMCkKLQkgICAgewotCSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgIH0KLQkgIGtub3cgKGMgIT0gJyAnKTsJLyogTm8gZnVydGhlciBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0KLSNpZm5kZWYgTk9fTElTVElORwotCSAgLyogSWYgbGlzdGluZyBpcyBvbiwgYW5kIHdlIGFyZSBleHBhbmRpbmcgYSBtYWNybywgdGhlbiBnaXZlCi0JICAgICB0aGUgbGlzdGluZyBjb2RlIHRoZSBjb250ZW50cyBvZiB0aGUgZXhwYW5kZWQgbGluZS4gICovCi0JICBpZiAobGlzdGluZykKLQkgICAgewotCSAgICAgIGlmICgobGlzdGluZyAmIExJU1RJTkdfTUFDRVhQKSAmJiBtYWNyb19uZXN0ID4gMCkKLQkJewotCQkgIGNoYXIgKmNvcHk7Ci0JCSAgaW50IGxlbjsKLQotCQkgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBleHBhbmRlZCBtYWNybyBsaW5lLiAgKi8KLQkJICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXItMTsgKnMgOyArK3MpCi0JCSAgICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXSkKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAvKiBDb3B5IGl0IGZvciBzYWZlIGtlZXBpbmcuICBBbHNvIGdpdmUgYW4gaW5kaWNhdGlvbiBvZgotCQkgICAgIGhvdyBtdWNoIG1hY3JvIG5lc3RpbmcgaXMgaW52b2x2ZWQgYXQgdGhpcyBwb2ludC4gICovCi0JCSAgbGVuID0gcyAtIChpbnB1dF9saW5lX3BvaW50ZXItMSk7Ci0JCSAgY29weSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIG1hY3JvX25lc3QgKyAyKTsKLQkJICBtZW1zZXQgKGNvcHksICc+JywgbWFjcm9fbmVzdCk7Ci0JCSAgY29weVttYWNyb19uZXN0XSA9ICcgJzsKLQkJICBtZW1jcHkgKGNvcHkgKyBtYWNyb19uZXN0ICsgMSwgaW5wdXRfbGluZV9wb2ludGVyLTEsIGxlbik7Ci0JCSAgY29weVttYWNyb19uZXN0KzErbGVuXSA9ICdcMCc7Ci0KLQkJICAvKiBJbnN0YWxsIHRoZSBsaW5lIHdpdGggdGhlIGxpc3RpbmcgZmFjaWxpdHkuICAqLwotCQkgIGxpc3RpbmdfbmV3bGluZSAoY29weSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxpc3RpbmdfbmV3bGluZSAoTlVMTCk7Ci0JICAgIH0KLSNlbmRpZgotCi0JICAvKgotCSAgICogQyBpcyB0aGUgMXN0IHNpZ25pZmljYW50IGNoYXJhY3Rlci4KLQkgICAqIElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgYWZ0ZXIgdGhhdCBjaGFyYWN0ZXIuCi0JICAgKi8KLQkgIGlmIChpc19uYW1lX2JlZ2lubmVyIChjKSkKLQkgICAgewotCSAgICAgIC8qIHdhbnQgdXNlci1kZWZpbmVkIGxhYmVsIG9yIHBzZXVkby9vcGNvZGUgKi8KLQkgICAgICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7Ci0KLQkgICAgICBzID0gLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwkvKiBuYW1lJ3MgZGVsaW1pdGVyICovCi0JICAgICAgLyoKLQkgICAgICAgKiBDIGlzIGNoYXJhY3RlciBhZnRlciBzeW1ib2wuCi0JICAgICAgICogVGhhdCBjaGFyYWN0ZXIncyBwbGFjZSBpbiB0aGUgaW5wdXQgbGluZSBpcyBub3cgJ1wwJy4KLQkgICAgICAgKiBTIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2wuCi0JICAgICAgICogICBbSW4gY2FzZSBvZiBwc2V1ZG8tb3AsIHMtPicuJy5dCi0JICAgICAgICogSW5wdXRfbGluZV9wb2ludGVyLT4nXDAnIHdoZXJlIGMgd2FzLgotCSAgICAgICAqLwotCSAgICAgIGlmIChUQ19TVEFSVF9MQUJFTChjLCBpbnB1dF9saW5lX3BvaW50ZXIpKQotCQl7Ci0JCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKnJlc3QgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotCi0JCSAgICAgIC8qIEluIE1SSSBtb2RlLCBcdHN5bTogc2V0IDAgaXMgcGVybWl0dGVkLiAgKi8KLQotCQkgICAgICBpZiAoKnJlc3QgPT0gJzonKQotCQkJKytyZXN0OwotCQkgICAgICBpZiAoKnJlc3QgPT0gJyAnIHx8ICpyZXN0ID09ICdcdCcpCi0JCQkrK3Jlc3Q7Ci0JCSAgICAgIGlmICgoc3RybmNhc2VjbXAgKHJlc3QsICJFUVUiLCAzKSA9PSAwCi0JCQkgICB8fCBzdHJuY2FzZWNtcCAocmVzdCwgIlNFVCIsIDMpID09IDApCi0JCQkgICYmIChyZXN0WzNdID09ICcgJyB8fCByZXN0WzNdID09ICdcdCcpKQotCQkJewotCQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSByZXN0ICsgMzsKLQkJCSAgZXF1YWxzIChzLCAxKTsKLQkJCSAgY29udGludWU7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBsaW5lX2xhYmVsID0gY29sb24gKHMpOwkvKiB1c2VyLWRlZmluZWQgbGFiZWwgKi8KLQkJICAqaW5wdXRfbGluZV9wb2ludGVyKysgPSAnOic7CS8qIFB1dCAnOicgYmFjayBmb3IgZXJyb3IgbWVzc2FnZXMnIHNha2UuICovCi0JCSAgLyogSW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciAnOicuICovCi0JCSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJz0nCi0JCSAgICAgICB8fCAoKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKLQkJCSAgICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnPScKLSNpZmRlZiBUQ19FUVVBTF9JTl9JTlNOCi0JCQkgICAmJiAhIFRDX0VRVUFMX0lOX0lOU04gKGMsIGlucHV0X2xpbmVfcG9pbnRlcikKLSNlbmRpZgotCQkJICAgKSkKLQkJewotCQkgIGVxdWFscyAocywgMSk7Ci0JCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogZXhwZWN0IHBzZXVkby1vcCBvciBtYWNoaW5lIGluc3RydWN0aW9uICovCi0JCSAgcG9wID0gTlVMTDsKLQotI2RlZmluZSBJR05PUkVfT1BDT0RFX0NBU0UKLSNpZmRlZiBJR05PUkVfT1BDT0RFX0NBU0UKLQkJICB7Ci0JCSAgICBjaGFyICpzMiA9IHM7Ci0JCSAgICB3aGlsZSAoKnMyKQotCQkgICAgICB7Ci0JCQlpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzMikpCi0JCQkgICpzMiA9IHRvbG93ZXIgKCpzMik7Ci0JCQlzMisrOwotCQkgICAgICB9Ci0JCSAgfQotI2VuZGlmCi0KLQkJICBpZiAoZmxhZ19tNjhrX21yaQotI2lmZGVmIE5PX1BTRVVET19ET1QKLQkJICAgICAgfHwgMQotI2VuZGlmCi0JCSAgICAgICkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgYW5kIHRoZSBtODhrIHVzZSBwc2V1ZG8tb3BzCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBhIHBlcmlvZC4gICovCi0JCSAgICAgIHBvcCA9IChwc2V1ZG9fdHlwZVMgKikgaGFzaF9maW5kIChwb19oYXNoLCBzKTsKLQkJICAgICAgaWYgKHBvcCAhPSBOVUxMICYmIHBvcC0+cG9jX2hhbmRsZXIgPT0gTlVMTCkKLQkJCXBvcCA9IE5VTEw7Ci0JCSAgICB9Ci0KLQkJICBpZiAocG9wICE9IE5VTEwKLQkJICAgICAgfHwgKCEgZmxhZ19tNjhrX21yaSAmJiAqcyA9PSAnLicpKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiBQU0VVRE8gLSBPUC4KLQkJICAgICAgICoKLQkJICAgICAgICogV0FSTklORzogYyBoYXMgbmV4dCBjaGFyLCB3aGljaCBtYXkgYmUgZW5kLW9mLWxpbmUuCi0JCSAgICAgICAqIFdlIGxvb2t1cCB0aGUgcHNldWRvLW9wIHRhYmxlIHdpdGggcysxIGJlY2F1c2Ugd2UKLQkJICAgICAgICogYWxyZWFkeSBrbm93IHRoYXQgdGhlIHBzZXVkby1vcCBiZWdpbnMgd2l0aCBhICcuJy4KLQkJICAgICAgICovCi0KLQkJICAgICAgaWYgKHBvcCA9PSBOVUxMKQotCQkJcG9wID0gKHBzZXVkb190eXBlUyAqKSBoYXNoX2ZpbmQgKHBvX2hhc2gsIHMgKyAxKTsKLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgd2UgbWF5IG5lZWQgdG8gaW5zZXJ0IGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGFsaWdubWVudCBkaXJlY3RpdmUuICBXaGF0IGEgaGFjawotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMuICAqLwotCQkgICAgICBpZiAobXJpX3BlbmRpbmdfYWxpZ24KLQkJCSAgJiYgKHBvcCA9PSBOVUxMCi0JCQkgICAgICB8fCAhICgocG9wLT5wb2NfaGFuZGxlciA9PSBjb25zCi0JCQkJICAgICAmJiBwb3AtPnBvY192YWwgPT0gMSkKLQkJCQkgICAgfHwgKHBvcC0+cG9jX2hhbmRsZXIgPT0gc19zcGFjZQotCQkJCQkmJiBwb3AtPnBvY192YWwgPT0gMSkKLSNpZmRlZiB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcAotCQkJCSAgICB8fCB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcCAocG9wKQotI2VuZGlmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZgotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZkZWYKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lmYwotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZlcXMKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2Vsc2UKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2VuZGlmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19nbG9ibAotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWdub3JlKSkpCi0JCQl7Ci0JCQkgIGRvX2FsaWduICgxLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkJCSAgbXJpX3BlbmRpbmdfYWxpZ24gPSAwOwotCQkJICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgZnJhZ19ub3cpOwotCQkJICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIC8qIFByaW50IHRoZSBlcnJvciBtc2cgbm93LCB3aGlsZSB3ZSBzdGlsbCBjYW4gKi8KLQkJICAgICAgaWYgKHBvcCA9PSBOVUxMKQotCQkJewotCQkJICBhc19iYWQgKF8oIlVua25vd24gcHNldWRvLW9wOiAgYCVzJyIpLCBzKTsKLQkJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCQkgIHNfaWdub3JlICgwKTsKLQkJCSAgY29udGludWU7Ci0JCQl9Ci0KLQkJICAgICAgLyogUHV0IGl0IGJhY2sgZm9yIGVycm9yIG1lc3NhZ2VzIGV0Yy4gKi8KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgc2tpcCBvZiB3aGl0ZXNwYWNlIGlzIGNvbXB1bHNvcnkuCi0JCQkgQSB3ZWxsIHNoYXBlZCBzcGFjZSBpcyBzb21ldGltZXMgYWxsIHRoYXQgc2VwYXJhdGVzCi0JCQkga2V5d29yZCBmcm9tIG9wZXJhbmRzLiAqLwotCQkgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQkJaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIElucHV0X2xpbmUgaXMgcmVzdG9yZWQuCi0JCSAgICAgICAqIElucHV0X2xpbmVfcG9pbnRlci0+MXN0IG5vbi1ibGFuayBjaGFyCi0JCSAgICAgICAqIGFmdGVyIHBzZXVkby1vcGVyYXRpb24uCi0JCSAgICAgICAqLwotCQkgICAgICAoKnBvcC0+cG9jX2hhbmRsZXIpIChwb3AtPnBvY192YWwpOwotCi0JCSAgICAgIC8qIElmIHRoYXQgd2FzIC5lbmQsIGp1c3QgZ2V0IG91dCBub3cuICAqLwotCQkgICAgICBpZiAocG9wLT5wb2NfaGFuZGxlciA9PSBzX2VuZCkKLQkJCWdvdG8gcXVpdDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbnF1b3RlID0gMDsKLSNpZmRlZiBRVU9URVNfSU5fSU5TTgotCQkgICAgICBpbnQgaW5lc2NhcGUgPSAwOwotI2VuZGlmCi0KLQkJICAgICAgLyogV0FSTklORzogYyBoYXMgY2hhciwgd2hpY2ggbWF5IGJlIGVuZC1vZi1saW5lLiAqLwotCQkgICAgICAvKiBBbHNvOiBpbnB1dF9saW5lX3BvaW50ZXItPmBcMGAgd2hlcmUgYyB3YXMuICovCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCQkJICAgICB8fCBpbnF1b3RlCi0jaWZkZWYgVENfRU9MX0lOX0lOU04KLQkJCSAgICAgfHwgVENfRU9MX0lOX0lOU04gKGlucHV0X2xpbmVfcG9pbnRlcikKLSNlbmRpZgotCQkJICAgICApCi0JCQl7Ci0JCQkgIGlmIChmbGFnX202OGtfbXJpICYmICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkJCSAgICBpbnF1b3RlID0gISBpbnF1b3RlOwotI2lmZGVmIFFVT1RFU19JTl9JTlNOCi0JCQkgIGlmIChpbmVzY2FwZSkKLQkJCSAgICBpbmVzY2FwZSA9IDA7Ci0JCQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCQkJICAgIGlucXVvdGUgPSAhIGlucXVvdGU7Ci0JCQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xcJykKLQkJCSAgICBpbmVzY2FwZSA9IDE7Ci0jZW5kaWYKLQkJCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCQl9Ci0KLQkJICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCi0JCSAgICAgIGdlbmVyYXRlX2xpbmVub19kZWJ1ZyAoKTsKLQotCQkgICAgICBpZiAobWFjcm9fZGVmaW5lZCkKLQkJCXsKLQkJCSAgc2Igb3V0OwotCQkJICBjb25zdCBjaGFyICplcnI7Ci0KLQkJCSAgaWYgKGNoZWNrX21hY3JvIChzLCAmb3V0LCAnXDAnLCAmZXJyKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoZXJyICE9IE5VTEwpCi0JCQkJYXNfYmFkIChlcnIpOwotCQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLQkJCSAgICAgIGlucHV0X3NjcnViX2luY2x1ZGVfc2IgKCZvdXQsCi0JCQkJCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIpOwotCQkJICAgICAgc2Jfa2lsbCAoJm91dCk7Ci0JCQkgICAgICBidWZmZXJfbGltaXQgPQotCQkJCWlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJCSAgICAgIGNvbnRpbnVlOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAobXJpX3BlbmRpbmdfYWxpZ24pCi0JCQl7Ci0JCQkgIGRvX2FsaWduICgxLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkJCSAgbXJpX3BlbmRpbmdfYWxpZ24gPSAwOwotCQkJICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgZnJhZ19ub3cpOwotCQkJICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIG1kX2Fzc2VtYmxlIChzKTsJLyogQXNzZW1ibGUgMSBpbnN0cnVjdGlvbi4gKi8KLQotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyKysgPSBjOwotCi0JCSAgICAgIC8qIFdlIHJlc3VtZSBsb29wIEFGVEVSIHRoZSBlbmQtb2YtbGluZSBmcm9tCi0JCQkgdGhpcyBpbnN0cnVjdGlvbi4gKi8KLQkJICAgIH0JCS8qIGlmICgqcz09Jy4nKSAqLwotCQl9CQkvKiBpZiBjPT0nOicgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQkJCS8qIGlmIChpc19uYW1lX2JlZ2lubmVyKGMpICovCi0KLQotCSAgLyogRW1wdHkgc3RhdGVtZW50PyAgKi8KLQkgIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgY10pCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoKExPQ0FMX0xBQkVMU19ET0xMQVIgfHwgTE9DQUxfTEFCRUxTX0ZCKQotCSAgICAgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgewotCSAgICAgIC8qIGxvY2FsIGxhYmVsICAoIjQ6IikgKi8KLQkgICAgICBjaGFyICpiYWNrdXAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgICAgICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7Ci0KLQkgICAgICB0ZW1wID0gYyAtICcwJzsKLQotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JCXsKLQkJICB0ZW1wID0gKHRlbXAgKiAxMCkgKyAqaW5wdXRfbGluZV9wb2ludGVyIC0gJzAnOwotCQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCQl9CQkvKiByZWFkIHRoZSB3aG9sZSBudW1iZXIgKi8KLQotCSAgICAgIGlmIChMT0NBTF9MQUJFTFNfRE9MTEFSCi0JCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcKLQkJICAmJiAqKGlucHV0X2xpbmVfcG9pbnRlciArIDEpID09ICc6JykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0JCSAgaWYgKGRvbGxhcl9sYWJlbF9kZWZpbmVkICh0ZW1wKSkKLQkJICAgIHsKLQkJICAgICAgYXNfZmF0YWwgKF8oImxhYmVsIFwiJWQkXCIgcmVkZWZpbmVkIiksIHRlbXApOwotCQkgICAgfQotCi0JCSAgZGVmaW5lX2RvbGxhcl9sYWJlbCAodGVtcCk7Ci0JCSAgY29sb24gKGRvbGxhcl9sYWJlbF9uYW1lICh0ZW1wLCAwKSk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGlmIChMT0NBTF9MQUJFTFNfRkIKLQkJICAmJiAqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJzonKQotCQl7Ci0JCSAgZmJfbGFiZWxfaW5zdGFuY2VfaW5jICh0ZW1wKTsKLQkJICBjb2xvbiAoZmJfbGFiZWxfbmFtZSAodGVtcCwgMCkpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBiYWNrdXA7Ci0JICAgIH0JCQkvKiBsb2NhbCBsYWJlbCAgKCI0OiIpICovCi0KLQkgIGlmIChjICYmIHN0cmNociAobGluZV9jb21tZW50X2NoYXJzLCBjKSkKLQkgICAgewkJCS8qIEl0cyBhIGNvbW1lbnQuICBCZXR0ZXIgc2F5IEFQUCBvciBOT19BUFAgKi8KLQkgICAgICBjaGFyICplbmRzOwotCSAgICAgIGNoYXIgKm5ld19idWY7Ci0JICAgICAgY2hhciAqbmV3X3RtcDsKLQkgICAgICB1bnNpZ25lZCBpbnQgbmV3X2xlbmd0aDsKLQkgICAgICBjaGFyICp0bXBfYnVmID0gMDsKLQotCSAgICAgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQkgICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiQVBQXG4iLCA0KSkKLQkJY29udGludWU7CS8qIFdlIGlnbm9yZSBpdCAqLwotCSAgICAgIHMgKz0gNDsKLQotCSAgICAgIGVuZHMgPSBzdHJzdHIgKHMsICIjTk9fQVBQXG4iKTsKLQotCSAgICAgIGlmICghZW5kcykKLQkJewotCQkgIHVuc2lnbmVkIGludCB0bXBfbGVuOwotCQkgIHVuc2lnbmVkIGludCBudW07Ci0KLQkJICAvKiBUaGUgZW5kIG9mIHRoZSAjQVBQIHdhc24ndCBpbiB0aGlzIGJ1ZmZlci4gIFdlCi0JCSAgICAga2VlcCByZWFkaW5nIGluIGJ1ZmZlcnMgdW50aWwgd2UgZmluZCB0aGUgI05PX0FQUAotCQkgICAgIHRoYXQgZ29lcyB3aXRoIHRoaXMgI0FQUCAgVGhlcmUgaXMgb25lLiAgVGhlIHNwZWNzCi0JCSAgICAgZ3VhcmVudGVlIGl0LiAuIC4gKi8KLQkJICB0bXBfbGVuID0gYnVmZmVyX2xpbWl0IC0gczsKLQkJICB0bXBfYnVmID0geG1hbGxvYyAodG1wX2xlbiArIDEpOwotCQkgIG1lbWNweSAodG1wX2J1ZiwgcywgdG1wX2xlbik7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgbmV3X3RtcCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmYnVmZmVyKTsKLQkJICAgICAgaWYgKCFuZXdfdG1wKQotCQkJYnJlYWs7Ci0JCSAgICAgIGVsc2UKLQkJCWJ1ZmZlcl9saW1pdCA9IG5ld190bXA7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZmZlcjsKLQkJICAgICAgZW5kcyA9IHN0cnN0ciAoYnVmZmVyLCAiI05PX0FQUFxuIik7Ci0JCSAgICAgIGlmIChlbmRzKQotCQkJbnVtID0gZW5kcyAtIGJ1ZmZlcjsKLQkJICAgICAgZWxzZQotCQkJbnVtID0gYnVmZmVyX2xpbWl0IC0gYnVmZmVyOwotCi0JCSAgICAgIHRtcF9idWYgPSB4cmVhbGxvYyAodG1wX2J1ZiwgdG1wX2xlbiArIG51bSk7Ci0JCSAgICAgIG1lbWNweSAodG1wX2J1ZiArIHRtcF9sZW4sIGJ1ZmZlciwgbnVtKTsKLQkJICAgICAgdG1wX2xlbiArPSBudW07Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKCFlbmRzKTsKLQotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGVuZHMgPyBlbmRzICsgOCA6IE5VTEw7Ci0KLQkJICBzID0gdG1wX2J1ZjsKLQkJICBlbmRzID0gcyArIHRtcF9sZW47Ci0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGVuZHMgKyA4OwotCQl9Ci0KLQkgICAgICBzY3J1Yl9zdHJpbmcgPSBzOwotCSAgICAgIHNjcnViX3N0cmluZ19lbmQgPSBlbmRzOwotCi0JICAgICAgbmV3X2xlbmd0aCA9IGVuZHMgLSBzOwotCSAgICAgIG5ld19idWYgPSAoY2hhciAqKSB4bWFsbG9jIChuZXdfbGVuZ3RoKTsKLQkgICAgICBuZXdfdG1wID0gbmV3X2J1ZjsKLQkgICAgICBmb3IgKDs7KQotCQl7Ci0JCSAgaW50IHNwYWNlOwotCQkgIGludCBzaXplOwotCi0JCSAgc3BhY2UgPSAobmV3X2J1ZiArIG5ld19sZW5ndGgpIC0gbmV3X3RtcDsKLQkJICBzaXplID0gZG9fc2NydWJfY2hhcnMgKHNjcnViX2Zyb21fc3RyaW5nLCBuZXdfdG1wLCBzcGFjZSk7Ci0KLQkJICBpZiAoc2l6ZSA8IHNwYWNlKQotCQkgICAgewotCQkgICAgICBuZXdfdG1wICs9IHNpemU7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgbmV3X2J1ZiA9IHhyZWFsbG9jIChuZXdfYnVmLCBuZXdfbGVuZ3RoICsgMTAwKTsKLQkJICBuZXdfdG1wID0gbmV3X2J1ZiArIG5ld19sZW5ndGg7Ci0JCSAgbmV3X2xlbmd0aCArPSAxMDA7Ci0JCX0KLQotCSAgICAgIGlmICh0bXBfYnVmKQotCQlmcmVlICh0bXBfYnVmKTsKLQkgICAgICBvbGRfYnVmZmVyID0gYnVmZmVyOwotCSAgICAgIG9sZF9pbnB1dCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBvbGRfbGltaXQgPSBidWZmZXJfbGltaXQ7Ci0JICAgICAgYnVmZmVyID0gbmV3X2J1ZjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBuZXdfYnVmOwotCSAgICAgIGJ1ZmZlcl9saW1pdCA9IG5ld190bXA7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZICgpOwotCi0jaWZkZWYgdGNfdW5yZWNvZ25pemVkX2xpbmUKLQkgIGlmICh0Y191bnJlY29nbml6ZWRfbGluZSAoYykpCi0JICAgIGNvbnRpbnVlOwotI2VuZGlmCi0KLQkgIC8qIGFzX3dhcm4oIkp1bmsgY2hhcmFjdGVyICVkLiIsYyk7ICBOb3cgZG9uZSBieSBpZ25vcmVfcmVzdCAqLwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07CS8qIFJlcG9ydCB1bmtub3duIGNoYXIgYXMgaWdub3JlZC4gKi8KLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JfQkJCS8qIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXI8YnVmZmVyX2xpbWl0KSAqLwotCi0jaWZkZWYgbWRfYWZ0ZXJfcGFzc19ob29rCi0gICAgICBtZF9hZnRlcl9wYXNzX2hvb2sgKCk7Ci0jZW5kaWYKLQotICAgICAgaWYgKG9sZF9idWZmZXIpCi0JewotCSAgZnJlZSAoYnVmZmVyKTsKLQkgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQkgIGlmIChvbGRfaW5wdXQgIT0gMCkKLQkgICAgewotCSAgICAgIGJ1ZmZlciA9IG9sZF9idWZmZXI7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkX2lucHV0OwotCSAgICAgIGJ1ZmZlcl9saW1pdCA9IG9sZF9saW1pdDsKLQkgICAgICBvbGRfYnVmZmVyID0gMDsKLQkgICAgICBnb3RvIGNvbnRpbjsKLQkgICAgfQotCX0KLSAgICB9CQkJCS8qIHdoaWxlIChtb3JlIGJ1ZmZlcnMgdG8gc2NhbikgKi8KLQotIHF1aXQ6Ci0KLSNpZmRlZiBtZF9jbGVhbnVwCi0gIG1kX2NsZWFudXAoKTsKLSNlbmRpZgotICBpbnB1dF9zY3J1Yl9jbG9zZSAoKTsJCS8qIENsb3NlIHRoZSBpbnB1dCBmaWxlICovCi19Ci0KLS8qIEZvciBtb3N0IE1SSSBwc2V1ZG8tb3BzLCB0aGUgbGluZSBhY3R1YWxseSBlbmRzIGF0IHRoZSBmaXJzdAotICAgbm9ucXVvdGVkIHNwYWNlLiAgVGhpcyBmdW5jdGlvbiBsb29rcyBmb3IgdGhhdCBwb2ludCwgc3R1ZmZzIGEgbnVsbAotICAgaW4sIGFuZCBzZXRzICpTVE9QQ1AgdG8gdGhlIGNoYXJhY3RlciB0aGF0IHVzZWQgdG8gYmUgdGhlcmUsIGFuZAotICAgcmV0dXJucyB0aGUgbG9jYXRpb24uCi0KLSAgIFVudGlsIEkgaGVhciBvdGhlcndpc2UsIEkgYW0gZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhpcyBpcyBvbmx5IHRydWUKLSAgIGZvciB0aGUgbTY4ayBNUkkgYXNzZW1ibGVyLiAgKi8KLQotY2hhciAqCi1tcmlfY29tbWVudF9maWVsZCAoc3RvcGNwKQotICAgICBjaGFyICpzdG9wY3A7Ci17Ci0jaWZkZWYgVENfTTY4SwotCi0gIGNoYXIgKnM7Ci0gIGludCBpbnF1b3RlID0gMDsKLQotICBrbm93IChmbGFnX202OGtfbXJpKTsKLQotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAgKCghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10gJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JfHwgaW5xdW90ZSk7Ci0gICAgICAgcysrKQotICAgIHsKLSAgICAgIGlmICgqcyA9PSAnXCcnKQotCWlucXVvdGUgPSAhIGlucXVvdGU7Ci0gICAgfQotICAqc3RvcGNwID0gKnM7Ci0gICpzID0gJ1wwJzsKLSAgcmV0dXJuIHM7Ci0KLSNlbHNlCi0KLSAgY2hhciAqczsKLQotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXTsgcysrKQotICAgIDsKLSAgKnN0b3BjcCA9ICpzOwotICAqcyA9ICdcMCc7Ci0gIHJldHVybiBzOwotCi0jZW5kaWYKLQotfQotCi0vKiBTa2lwIHRvIHRoZSBlbmQgb2YgYW4gTVJJIGNvbW1lbnQgZmllbGQuICAqLwotCi12b2lkCi1tcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKQotICAgICBjaGFyICpzdG9wOwotICAgICBpbnQgc3RvcGM7Ci17Ci0gIGtub3cgKGZsYWdfbXJpKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdG9wOwotICAqc3RvcCA9IHN0b3BjOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLXZvaWQgCi1zX2Fib3J0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXNfZmF0YWwgKF8oIi5hYm9ydCBkZXRlY3RlZC4gIEFiYW5kb25pbmcgc2hpcC4iKSk7Ci19Ci0KLS8qIEd1dHMgb2YgLmFsaWduIGRpcmVjdGl2ZS4gIE4gaXMgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCB0byBhbGlnbi4KLSAgIEZJTEwgbWF5IGJlIE5VTEwsIG9yIGl0IG1heSBwb2ludCB0byB0aGUgYnl0ZXMgb2YgdGhlIGZpbGwgcGF0dGVybi4KLSAgIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHdoYXRldmVyIEZJTEwgcG9pbnRzIHRvLCBpZiBhbnl0aGluZy4gIE1BWCBpcwotICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuIGRvaW5nIHRoZSBhbGlnbm1lbnQsCi0gICBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotCi1zdGF0aWMgdm9pZCAKLWRvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKmZpbGw7Ci0gICAgIGludCBsZW47Ci0gICAgIGludCBtYXg7Ci17Ci0gIGNoYXIgZGVmYXVsdF9maWxsOwotCi0jaWZkZWYgbWRfZG9fYWxpZ24KLSAgbWRfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4LCBqdXN0X3JlY29yZF9hbGlnbm1lbnQpOwotI2VuZGlmCi0KLSAgaWYgKGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3Vic2VnX3RleHRfcCAobm93X3NlZykpCi0JZGVmYXVsdF9maWxsID0gTk9QX09QQ09ERTsKLSAgICAgIGVsc2UKLQlkZWZhdWx0X2ZpbGwgPSAwOwotICAgICAgZmlsbCA9ICZkZWZhdWx0X2ZpbGw7Ci0gICAgICBsZW4gPSAxOwotICAgIH0KLQotICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIEhBVkUgdG8uIC4gLiAqLwotICBpZiAobiAhPSAwICYmICFuZWVkX3Bhc3NfMikKLSAgICB7Ci0gICAgICBpZiAobGVuIDw9IDEpCi0JZnJhZ19hbGlnbiAobiwgKmZpbGwsIG1heCk7Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBmaWxsLCBsZW4sIG1heCk7Ci0gICAgfQotCi0jaWZkZWYgbWRfZG9fYWxpZ24KLSBqdXN0X3JlY29yZF9hbGlnbm1lbnQ6Ci0jZW5kaWYKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgQSBwb3NpdGl2ZSBBUkcgaXMgYSBkZWZhdWx0IGFsaWdubWVudAotICAgKGluIGJ5dGVzKS4gIEEgbmVnYXRpdmUgQVJHIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbGVuZ3RoIG9mIHRoZQotICAgZmlsbCBwYXR0ZXJuLiAgQllURVNfUCBpcyBub24temVybyBpZiB0aGUgYWxpZ25tZW50IHZhbHVlIHNob3VsZCBiZQotICAgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksIHJhdGhlciB0aGFuIHRoZSBwb3dlciBvZiAyLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxpZ24gKGFyZywgYnl0ZXNfcCkKLSAgICAgaW50IGFyZzsKLSAgICAgaW50IGJ5dGVzX3A7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBhbGlnbjsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0gIG9mZnNldFQgZmlsbCA9IDA7Ci0gIGludCBtYXg7Ci0gIGludCBmaWxsX3A7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChhcmcgPCAwKQotCWFsaWduID0gMDsKLSAgICAgIGVsc2UKLQlhbGlnbiA9IGFyZzsJLyogRGVmYXVsdCB2YWx1ZSBmcm9tIHBzZXVkby1vcCB0YWJsZSAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0gIGlmIChieXRlc19wKQotICAgIHsKLSAgICAgIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyLiAgKi8KLSAgICAgIGlmIChhbGlnbiAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKytpKQotCSAgICA7Ci0JICBpZiAoYWxpZ24gIT0gMSkKLQkgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgIGFsaWduID0gaTsKLQl9Ci0gICAgfQotCi0gIGlmIChhbGlnbiA+IDE1KQotICAgIHsKLSAgICAgIGFsaWduID0gMTU7Ci0gICAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICV1IGFzc3VtZWQiKSwgYWxpZ24pOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgZmlsbF9wID0gMDsKLSAgICAgIG1heCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JZmlsbF9wID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBmaWxsX3AgPSAxOwotCX0KLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCW1heCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBtYXggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGZpbGxfcCkKLSAgICB7Ci0gICAgICBpZiAoYXJnIDwgMCkKLQlhc193YXJuIChfKCJleHBlY3RlZCBmaWxsIHBhdHRlcm4gbWlzc2luZyIpKTsKLSAgICAgIGRvX2FsaWduIChhbGlnbiwgKGNoYXIgKikgTlVMTCwgMCwgbWF4KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgZmlsbF9sZW47Ci0KLSAgICAgIGlmIChhcmcgPj0gMCkKLQlmaWxsX2xlbiA9IDE7Ci0gICAgICBlbHNlCi0JZmlsbF9sZW4gPSAtIGFyZzsKLSAgICAgIGlmIChmaWxsX2xlbiA8PSAxKQotCXsKLQkgIGNoYXIgZmlsbF9jaGFyOwotCi0JICBmaWxsX2NoYXIgPSBmaWxsOwotCSAgZG9fYWxpZ24gKGFsaWduLCAmZmlsbF9jaGFyLCBmaWxsX2xlbiwgbWF4KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBhYlsxNl07Ci0KLQkgIGlmICgoc2l6ZV90KSBmaWxsX2xlbiA+IHNpemVvZiBhYikKLQkgICAgYWJvcnQgKCk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGFiLCBmaWxsLCBmaWxsX2xlbik7Ci0JICBkb19hbGlnbiAoYWxpZ24sIGFiLCBmaWxsX2xlbiwgbWF4KTsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3Agb24gbWFjaGluZXMgd2hlcmUgIi5hbGlnbiA0IiBtZWFucwotICAgYWxpZ24gdG8gYSA0IGJ5dGUgYm91bmRhcnkuICAqLwotCi12b2lkIAotc19hbGlnbl9ieXRlcyAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBzX2FsaWduIChhcmcsIDEpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3Agb24gbWFjaGluZXMgd2hlcmUgIi5hbGlnbiA0IiBtZWFucyBhbGlnbgotICAgdG8gYSAyKio0IGJvdW5kYXJ5LiAgKi8KLQotdm9pZCAKLXNfYWxpZ25fcHR3byAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBzX2FsaWduIChhcmcsIDApOwotfQotCi12b2lkIAotc19jb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBvZmZzZXRUIHRlbXA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKGZsYWdfbXJpKQotCW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5DT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iKSwgKGxvbmcpIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmIChmbGFnX21yaSkKLQltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmIChmbGFnX21yaSkKLQltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSB0ZW1wKQotCWFzX2JhZCAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkJKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKLQkJKGxvbmcpIHRlbXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSB0ZW1wKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICB9Ci0jaWZkZWYgT0JKX1ZNUwotICB7Ci0gICAgZXh0ZXJuIGludCBmbGFnX29uZTsKLSAgICBpZiAoICghdGVtcCkgfHwgIWZsYWdfb25lKQotICAgICAgU19HRVRfT1RIRVIoc3ltYm9sUCkgPSBjb25zdF9mbGFnOwotICB9Ci0jZW5kaWYgLyogbm90IE9CSl9WTVMgKi8KLSAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQkJCQkvKiBzX2NvbW0oKSAqLwotCi0vKiBUaGUgTVJJIENPTU1PTiBwc2V1ZG8tb3AuICBXZSBoYW5kbGUgdGhpcyBieSBjcmVhdGluZyBhIGNvbW1vbgotICAgc3ltYm9sIHdpdGggdGhlIGFwcHJvcHJpYXRlIG5hbWUuICBXZSBtYWtlIHNfc3BhY2UgZG8gdGhlIHJpZ2h0Ci0gICB0aGluZyBieSBpbmNyZWFzaW5nIHRoZSBzaXplLiAgKi8KLQotdm9pZAotc19tcmlfY29tbW9uIChzbWFsbCkKLSAgICAgaW50IHNtYWxsIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqYWxjID0gTlVMTDsKLSAgc3ltYm9sUyAqc3ltOwotICBvZmZzZXRUIGFsaWduOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoISBmbGFnX21yaSkKLSAgICB7Ci0gICAgICBzX2NvbW0gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqbmFtZSkpCi0gICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbHNlCi0gICAgewotICAgICAgZG8KLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0KLSAgICAgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JewotCSAgYWxjID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChTX0dFVF9OQU1FIChsaW5lX2xhYmVsKSkKLQkJCQkgICsgKGlucHV0X2xpbmVfcG9pbnRlciAtIG5hbWUpCi0JCQkJICArIDEpOwotCSAgc3ByaW50ZiAoYWxjLCAiJXMlcyIsIG5hbWUsIFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKTsKLQkgIG5hbWUgPSBhbGM7Ci0JfQotICAgIH0KLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGlmIChhbGMgIT0gTlVMTCkKLSAgICBmcmVlIChhbGMpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhbGlnbiA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bSkgJiYgISBTX0lTX0NPTU1PTiAoc3ltKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnIiksIFNfR0VUX05BTUUgKHN5bSkpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTX1NFVF9FWFRFUk5BTCAoc3ltKTsKLSAgbXJpX2NvbW1vbl9zeW1ib2wgPSBzeW07Ci0KLSNpZmRlZiBTX1NFVF9BTElHTgotICBpZiAoYWxpZ24gIT0gMCkKLSAgICBTX1NFVF9BTElHTiAoc3ltLCBhbGlnbik7Ci0jZW5kaWYKLQotICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICAgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBleHAuWF9hZGRfc3ltYm9sID0gc3ltOwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKGxpbmVfbGFiZWwsICZleHApOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgU19TRVRfU0VHTUVOVCAobGluZV9sYWJlbCwgZXhwcl9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIGp1c3QgaWdub3JlIHRoZSBzbWFsbCBhcmd1bWVudCwgd2hpY2ggZGlzdGluZ3Vpc2hlcwotICAgICBDT01NT04gYW5kIENPTU1PTi5TLiAgSSBkb24ndCBrbm93IHdoYXQgd2UgY2FuIGRvIGFib3V0IGl0LiAgKi8KLQotICAvKiBJZ25vcmUgdGhlIHR5cGUgYW5kIGhwdHlwZS4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLXZvaWQKLXNfZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNlZ1Qgc2VjdGlvbjsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgc2VjdGlvbiA9IHRleHRfc2VjdGlvbjsKLSAgICAgIHRlbXAgKz0gMTAwMDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzZWN0aW9uID0gZGF0YV9zZWN0aW9uOwotCi0gIHN1YnNlZ19zZXQgKHNlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKLQotI2lmZGVmIE9CSl9WTVMKLSAgY29uc3RfZmxhZyA9IDA7Ci0jZW5kaWYKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYXBwZmlsZSBwc2V1ZG8tb3AuICBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5Ci0gICBkb19zY3J1Yl9jaGFycyB3aGVuIGEgcHJlcHJvY2Vzc29yICMgbGluZSBjb21tZW50IGlzIHNlZW4gd2l0aCBhCi0gICBmaWxlIG5hbWUuICBUaGlzIGRlZmF1bHQgZGVmaW5pdGlvbiBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgb2JqZWN0Ci0gICBvciBDUFUgc3BlY2lmaWMgcHNldWRvLW9wcy4gIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyB0aGUgZGVmYXVsdAotICAgZGVmaW5pdGlvbiBmb3IgLmZpbGU7IHRoZSBBUFBGSUxFIGFyZ3VtZW50IGlzIDEgZm9yIC5hcHBmaWxlLCAwIGZvcgotICAgLmZpbGUuICAqLwotCi12b2lkIAotc19hcHBfZmlsZSAoYXBwZmlsZSkKLSAgICAgaW50IGFwcGZpbGU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnM7Ci0gIGludCBsZW5ndGg7Ci0KLSAgLyogU29tZSBhc3NlbWJsZXJzIHRvbGVyYXRlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyAnIicgKi8KLSAgaWYgKChzID0gZGVtYW5kX2NvcHlfc3RyaW5nICgmbGVuZ3RoKSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIGEgZmFrZSAuYXBwZmlsZSwgYSBmYWtlIG5ld2xpbmUgd2FzIGluc2VydGVkIGludG8KLQkgdGhlIGJ1ZmZlci4gIFBhc3NpbmcgLTIgdG8gbmV3X2xvZ2ljYWxfbGluZSB0ZWxscyBpdCB0bwotCSBhY2NvdW50IGZvciBpdC4gICovCi0gICAgICBpbnQgbWF5X29taXQKLQk9ICghIG5ld19sb2dpY2FsX2xpbmUgKHMsIGFwcGZpbGUgPyAtMiA6IC0xKSAmJiBhcHBmaWxlKTsKLQotICAgICAgLyogSW4gTVJJIG1vZGUsIHRoZSBwcmVwcm9jZXNzb3IgbWF5IGhhdmUgaW5zZXJ0ZWQgYW4gZXh0cmFuZW91cwotICAgICAgICAgYmFja3F1b3RlLiAgKi8KLSAgICAgIGlmIChmbGFnX202OGtfbXJpCi0JICAmJiAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycKLQkgICYmIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMV1dKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKCEgbWF5X29taXQpCi0JewotI2lmZGVmIExJU1RJTkcKLQkgIGlmIChsaXN0aW5nKQotCSAgICBsaXN0aW5nX3NvdXJjZV9maWxlIChzKTsKLSNlbmRpZgotCSAgcmVnaXN0ZXJfZGVwZW5kZW5jeSAocyk7Ci0jaWZkZWYgb2JqX2FwcF9maWxlCi0JICBvYmpfYXBwX2ZpbGUgKHMpOwotI2VuZGlmCi0JfQotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSAuYXBwbGluZSBwc2V1ZG8tb3AuICBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5Ci0gICBkb19zY3J1Yl9jaGFycyB3aGVuIGEgcHJlcHJvY2Vzc29yICMgbGluZSBjb21tZW50IGlzIHNlZW4uICBUaGlzCi0gICBkZWZhdWx0IGRlZmluaXRpb24gbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG9iamVjdCBvciBDUFUgc3BlY2lmaWMKLSAgIHBzZXVkby1vcHMuICAqLwotCi12b2lkCi1zX2FwcF9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGw7Ci0KLSAgLyogVGhlIGdpdmVuIG51bWJlciBpcyB0aGF0IG9mIHRoZSBuZXh0IGxpbmUuICAqLwotICBsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkgLSAxOwotICBpZiAobCA8IDApCi0gICAgLyogU29tZSBvZiB0aGUgYmFjayBlbmRzIGNhbid0IGRlYWwgd2l0aCBub24tcG9zaXRpdmUgbGluZSBudW1iZXJzLgotICAgICAgIEJlc2lkZXMsIGl0J3Mgc2lsbHkuICAqLwotICAgIGFzX3dhcm4gKF8oIkxpbmUgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlOyBsaW5lIG51bWJlciAlZCByZWplY3RlZC4iKSwgbCsxKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIGwpOwotI2lmZGVmIExJU1RJTkcKLSAgICAgIGlmIChsaXN0aW5nKQotCWxpc3Rpbmdfc291cmNlX2xpbmUgKGwpOwotI2VuZGlmCi0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5lbmQgcHNldWRvLW9wLiAgQWN0dWFsbHksIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBpbgotICAgcmVhZF9hX3NvdXJjZV9maWxlLiAgKi8KLQotdm9pZAotc19lbmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgcGVybWl0cyB0aGUgc3RhcnQgc3ltYm9sIHRvIGZvbGxvdyAuZW5kLAotICAgICAgICAgYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhhdC4gICovCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KLQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyonCi0JICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICchJykKLQlhc193YXJuIChfKCJzdGFydCBhZGRyZXNzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgdGhlIC5lcnIgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19lcnIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhc19iYWQgKF8oIi5lcnIgZW5jb3VudGVyZWQiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIGZhaWwgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19mYWlsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgb2Zmc2V0VCB0ZW1wOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKHRlbXAgPj0gNTAwKQotICAgIGFzX3dhcm4gKF8oIi5mYWlsICVsZCBlbmNvdW50ZXJlZCIpLCAobG9uZykgdGVtcCk7Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oIi5mYWlsICVsZCBlbmNvdW50ZXJlZCIpLCAobG9uZykgdGVtcCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLXZvaWQgCi1zX2ZpbGwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBleHByZXNzaW9uUyByZXBfZXhwOwotICBsb25nIHNpemUgPSAxOwotICByZWdpc3RlciBsb25nIGZpbGwgPSAwOwotICBjaGFyICpwOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZyZXBfZXhwKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggQlNEIDQuMiBBUywgbm90IGZvciBhbnkgcmF0aW9uYWwgcmVhc29uLiAgKi8KLSNkZWZpbmUgQlNEX0ZJTExfU0laRV9DUk9DS184ICg4KQotICBpZiAoc2l6ZSA+IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZmlsbCBzaXplIGNsYW1wZWQgdG8gJWQuIiksIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCk7Ci0gICAgICBzaXplID0gQlNEX0ZJTExfU0laRV9DUk9DS184OwotICAgIH0KLSAgaWYgKHNpemUgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlNpemUgbmVnYXRpdmU6IC5maWxsIGlnbm9yZWQuIikpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChyZXBfZXhwLlhfb3AgPT0gT19jb25zdGFudCAmJiByZXBfZXhwLlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGlmIChyZXBfZXhwLlhfYWRkX251bWJlciA8IDApCi0JYXNfd2FybiAoXygiUmVwZWF0IDwgMCwgLmZpbGwgaWdub3JlZCIpKTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLQotICBpZiAoc2l6ZSAmJiAhbmVlZF9wYXNzXzIpCi0gICAgewotICAgICAgaWYgKHJlcF9leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHAgPSBmcmFnX3ZhciAocnNfZmlsbCwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwKLQkJCShyZWxheF9zdWJzdGF0ZVQpIDAsIChzeW1ib2xTICopIDAsCi0JCQkob2Zmc2V0VCkgcmVwX2V4cC5YX2FkZF9udW1iZXIsCi0JCQkoY2hhciAqKSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IHJlcGVhdCBjb3VudCwgc28gd2UgY2FuJ3QgdXNlCi0JICAgICByc19maWxsLiAgV2UgY2FuIGdldCB0aGUgc2FtZSByZXN1bHRzIG91dCBvZiByc19zcGFjZSwKLQkgICAgIGJ1dCBpdHMgYXJndW1lbnQgaXMgaW4gYnl0ZXMsIHNvIHdlIG11c3QgbXVsdGlwbHkgdGhlCi0JICAgICByZXBlYXQgY291bnQgYnkgc2l6ZS4gICovCi0KLQkgIHN5bWJvbFMgKnJlcF9zeW07Ci0JICByZXBfc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJnJlcF9leHApOwotCSAgaWYgKHNpemUgIT0gMSkKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25TIHNpemVfZXhwOwotCSAgICAgIHNpemVfZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIHNpemVfZXhwLlhfYWRkX251bWJlciA9IHNpemU7Ci0KLQkgICAgICByZXBfZXhwLlhfb3AgPSBPX211bHRpcGx5OwotCSAgICAgIHJlcF9leHAuWF9hZGRfc3ltYm9sID0gcmVwX3N5bTsKLQkgICAgICByZXBfZXhwLlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnNpemVfZXhwKTsKLQkgICAgICByZXBfZXhwLlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgcmVwX3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyZXBfZXhwKTsKLQkgICAgfQotCi0JICBwID0gZnJhZ192YXIgKHJzX3NwYWNlLCAoaW50KSBzaXplLCAoaW50KSBzaXplLAotCQkJKHJlbGF4X3N1YnN0YXRlVCkgMCwgcmVwX3N5bSwgKG9mZnNldFQpIDAsIChjaGFyICopIDApOwotCX0KLSAgICAgIG1lbXNldCAocCwgMCwgKHVuc2lnbmVkIGludCkgc2l6ZSk7Ci0gICAgICAvKiBUaGUgbWFnaWMgbnVtYmVyIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNCBpcyBmcm9tIEJTRCA0LjIgVkFYCi0gICAgICAgKiBmbGF2b3VyZWQgQVMuICBUaGUgZm9sbG93aW5nIGJpenphcmUgYmVoYXZpb3VyIGlzIHRvIGJlCi0gICAgICAgKiBjb21wYXRpYmxlIHdpdGggYWJvdmUuICBJIGd1ZXNzIHRoZXkgdHJpZWQgdG8gdGFrZSB1cCB0byA4Ci0gICAgICAgKiBieXRlcyBmcm9tIGEgNC1ieXRlIGV4cHJlc3Npb24gYW5kIHRoZXkgZm9yZ290IHRvIHNpZ24KLSAgICAgICAqIGV4dGVuZC4gVW4qeCBTdXguICovCi0jZGVmaW5lIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNCAoNCkKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgZmlsbCwKLQkJCSAgKHNpemUgPiBCU0RfRklMTF9TSVpFX0NST0NLXzQKLQkJCSAgID8gQlNEX0ZJTExfU0laRV9DUk9DS180Ci0JCQkgICA6IChpbnQpIHNpemUpKTsKLSAgICAgIC8qIE5vdGU6IC5maWxsICgpLDAgZW1pdHMgbm8gZnJhZyAoc2luY2Ugd2UgYXJlIGFza2VkIHRvIC5maWxsIDAgYnl0ZXMpCi0gICAgICAgKiBidXQgZW1pdHMgbm8gZXJyb3IgbWVzc2FnZSBiZWNhdXNlIGl0IHNlZW1zIGEgbGVnYWwgdGhpbmcgdG8gZG8uCi0gICAgICAgKiBJdCBpcyBhIGRlZ2VuZXJhdGUgY2FzZSBvZiAuZmlsbCBidXQgY291bGQgYmUgZW1pdHRlZCBieSBhIGNvbXBpbGVyLgotICAgICAgICovCi0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkIAotc19nbG9ibCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIElSUCBhbmQgSVJQQyBwc2V1ZG8tb3BzLiAgKi8KLQotdm9pZAotc19pcnAgKGlycGMpCi0gICAgIGludCBpcnBjOwotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgc2IgczsKLSAgY29uc3QgY2hhciAqZXJyOwotICBzYiBvdXQ7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgc2JfbmV3ICgmcyk7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICBzYl9hZGRfY2hhciAoJnMsICppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci0KLSAgc2JfbmV3ICgmb3V0KTsKLQotICBlcnIgPSBleHBhbmRfaXJwIChpcnBjLCAwLCAmcywgJm91dCwgZ2V0X2xpbmVfc2IsICdcMCcpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCAiJXMiLCBlcnIpOwotCi0gIHNiX2tpbGwgKCZzKTsKLQotICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmb3V0LCBpbnB1dF9saW5lX3BvaW50ZXIpOwotICBzYl9raWxsICgmb3V0KTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3AuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gbWFyawotICAgdGhlIHNlY3Rpb24gdG8gb25seSBiZSBsaW5rZWQgb25jZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHN1cHBvcnRlZAotICAgYnkgbW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzLiAgVGhpcyB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCwKLSAgIHdoaWNoIGlzIHdoYXQgdG8gZG8gYWJvdXQgZHVwbGljYXRlcy4gICovCi0KLXZvaWQKLXNfbGlua29uY2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBlbnVtIGxpbmtvbmNlX3R5cGUgdHlwZTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgdHlwZSA9IExJTktPTkNFX0RJU0NBUkQ7Ci0KLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAocywgImRpc2NhcmQiKSA9PSAwKQotCXR5cGUgPSBMSU5LT05DRV9ESVNDQVJEOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAocywgIm9uZV9vbmx5IikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfT05FX09OTFk7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzLCAic2FtZV9zaXplIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfU0FNRV9TSVpFOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAocywgInNhbWVfY29udGVudHMiKSA9PSAwKQotCXR5cGUgPSBMSU5LT05DRV9TQU1FX0NPTlRFTlRTOwotICAgICAgZWxzZQotCWFzX3dhcm4gKF8oInVucmVjb2duaXplZCAubGlua29uY2UgdHlwZSBgJXMnIiksIHMpOwotCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICB9Ci0KLSNpZmRlZiBvYmpfaGFuZGxlX2xpbmtfb25jZQotICBvYmpfaGFuZGxlX2xpbmtfb25jZSAodHlwZSk7Ci0jZWxzZSAvKiAhIGRlZmluZWQgKG9ial9oYW5kbGVfbGlua19vbmNlKSAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgewotICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgaWYgKChiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpICYgU0VDX0xJTktfT05DRSkgPT0gMCkKLSAgICAgIGFzX3dhcm4gKF8oIi5saW5rb25jZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpKTsKLQotICAgIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpOwotICAgIGZsYWdzIHw9IFNFQ19MSU5LX09OQ0U7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgICAgewotICAgICAgZGVmYXVsdDoKLQlhYm9ydCAoKTsKLSAgICAgIGNhc2UgTElOS09OQ0VfRElTQ0FSRDoKLQlmbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIExJTktPTkNFX09ORV9PTkxZOgotCWZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIExJTktPTkNFX1NBTUVfU0laRToKLQlmbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRTsKLQlicmVhazsKLSAgICAgIGNhc2UgTElOS09OQ0VfU0FNRV9DT05URU5UUzoKLQlmbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFM7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcsIGZsYWdzKSkKLSAgICAgIGFzX2JhZCAoXygiYmZkX3NldF9zZWN0aW9uX2ZsYWdzOiAlcyIpLAotCSAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgfQotI2Vsc2UgLyogISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAqLwotICBhc193YXJuIChfKCIubGlua29uY2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSk7Ci0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAob2JqX2hhbmRsZV9saW5rX29uY2UpICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQgCi1zX2xjb21tX2ludGVybmFsIChuZWVkc19hbGlnbiwgYnl0ZXNfcCkKLSAgICAgLyogMSBpZiB0aGlzIHdhcyBhICIuYnNzIiBkaXJlY3RpdmUsIHdoaWNoIG1heSByZXF1aXJlIGEgM3JkIGFyZ3VtZW50Ci0JKGFsaWdubWVudCk7IDAgaWYgaXQgd2FzIGFuICIubGNvbW0iICgyIGFyZ3Mgb25seSkgICovCi0gICAgIGludCBuZWVkc19hbGlnbjsKLSAgICAgLyogMSBpZiB0aGUgYWxpZ25tZW50IHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgYnl0ZSBib3VuZGFyeSwKLQlyYXRoZXIgdGhhbiB0aGUgcG93ZXIgb2YgMi4gKi8KLSAgICAgaW50IGJ5dGVzX3A7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHNlZ1QgY3VycmVudF9zZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgY29uc3QgaW50IG1heF9hbGlnbm1lbnQgPSAxNTsKLSAgaW50IGFsaWduID0gMDsKLSAgc2VnVCBic3Nfc2VnID0gYnNzX3NlY3Rpb247Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBBY2NlcHQgYW4gb3B0aW9uYWwgY29tbWEgYWZ0ZXIgdGhlIG5hbWUuICBUaGUgY29tbWEgdXNlZCB0byBiZQotICAgICByZXF1aXJlZCwgYnV0IElyaXggNSBjYyBkb2VzIG5vdCBnZW5lcmF0ZSBpdC4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk1pc3Npbmcgc2l6ZSBleHByZXNzaW9uIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJTUyBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChUQ19NSVBTKSB8fCBkZWZpbmVkIChUQ19BTFBIQSkKLSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0gICAgICB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgLyogRm9yIE1JUFMgYW5kIEFscGhhIEVDT0ZGIG9yIEVMRiwgc21hbGwgb2JqZWN0cyBhcmUgcHV0IGluIC5zYnNzLiAgKi8KLSAgICAgIGlmICh0ZW1wIDw9IGJmZF9nZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0KSkKLQl7Ci0JICBic3Nfc2VnID0gc3Vic2VnX25ldyAoIi5zYnNzIiwgMSk7Ci0JICBzZWdfaW5mbyAoYnNzX3NlZyktPmJzcyA9IDE7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGJzc19zZWcsIFNFQ19BTExPQykpCi0JICAgIGFzX3dhcm4gKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiLnNic3NcIjogJXMiKSwKLQkJICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotI2VuZGlmCi0gICBpZiAoIW5lZWRzX2FsaWduKQotICAgICB7Ci0gICAgICAgLyogRklYTUUuIFRoaXMgbmVlZHMgdG8gYmUgbWFjaGluZSBpbmRlcGVuZGVudC4gKi8KLSAgICAgICBpZiAodGVtcCA+PSA4KQotCSBhbGlnbiA9IDM7Ci0gICAgICAgZWxzZSBpZiAodGVtcCA+PSA0KQotCSBhbGlnbiA9IDI7Ci0gICAgICAgZWxzZSBpZiAodGVtcCA+PSAyKQotCSBhbGlnbiA9IDE7Ci0gICAgICAgZWxzZQotCSBhbGlnbiA9IDA7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAgICAgIC8qIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gYSBtb3JlIGdlbmVyYWwgZmFzaGlvbi4gICovCi0gICAgICAgYWxpZ24gPSAzOwotI2VuZGlmCi0KLSAgICAgICByZWNvcmRfYWxpZ25tZW50KGJzc19zZWcsIGFsaWduKTsKLSAgICAgfQotCi0gIGlmIChuZWVkc19hbGlnbikKLSAgICB7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JewotCSAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzaXplIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JewotCSAgYXNfYmFkIChfKCJNaXNzaW5nIGFsaWdubWVudCIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKGJ5dGVzX3ApCi0JewotCSAgLyogQ29udmVydCB0byBhIHBvd2VyIG9mIDIuICAqLwotCSAgaWYgKGFsaWduICE9IDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgICAgIGZvciAoaSA9IDA7IChhbGlnbiAmIDEpID09IDA7IGFsaWduID4+PSAxLCArK2kpCi0JCTsKLQkgICAgICBpZiAoYWxpZ24gIT0gMSkKLQkJYXNfYmFkIChfKCJBbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBhbGlnbiA9IGk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotCXsKLQkgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLQkgIGFzX3dhcm4gKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIpLCBhbGlnbik7Ci0JfQotICAgICAgZWxzZSBpZiAoYWxpZ24gPCAwKQotCXsKLQkgIGFsaWduID0gMDsKLQkgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZS4gMCBhc3N1bWVkLiIpKTsKLQl9Ci0gICAgICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VnLCBhbGlnbik7Ci0gICAgfQkJCQkvKiBpZiBuZWVkcyBhbGlnbiAqLwotICBlbHNlCi0gICAgewotICAgICAgLyogQXNzdW1lIHNvbWUgb2JqZWN0cyBtYXkgcmVxdWlyZSBhbGlnbm1lbnQgb24gc29tZSBzeXN0ZW1zLiAgKi8KLSNpZiBkZWZpbmVkIChUQ19BTFBIQSkgJiYgISBkZWZpbmVkIChWTVMpCi0gICAgICBpZiAodGVtcCA+IDEpCi0JewotCSAgYWxpZ24gPSBmZnMgKHRlbXApIC0gMTsKLQkgIGlmICh0ZW1wICUgKDEgPDwgYWxpZ24pKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLQotICBpZiAoCi0jaWYgZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKQotICAgICAgIFNfR0VUX09USEVSIChzeW1ib2xQKSA9PSAwICYmCi0gICAgICAgU19HRVRfREVTQyAoc3ltYm9sUCkgPT0gMCAmJgotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0gICAgICAgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWcKLQl8fCAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApKSkKLSAgICB7Ci0gICAgICBjaGFyICpwZnJhZzsKLQotICAgICAgc3Vic2VnX3NldCAoYnNzX3NlZywgMSk7Ci0KLSAgICAgIGlmIChhbGlnbikKLQlmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0JCQkJCS8qIGRldGFjaCBmcm9tIG9sZCBmcmFnCSovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlZykKLQlzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSBOVUxMOwotCi0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLSAgICAgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAotCQkJKG9mZnNldFQpIHRlbXAsIChjaGFyICopIDApOwotICAgICAgKnBmcmFnID0gMDsKLQotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlZyk7Ci0KLSNpZmRlZiBPQkpfQ09GRgotICAgICAgLyogVGhlIHN5bWJvbCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgcHJlY2VkaW5nCi0gICAgICAgICAiLmdsb2JsIiBkaXJlY3RpdmUgLS0gYmUgY2FyZWZ1bCBub3QgdG8gc3RlcCBvbiBzdG9yYWdlIGNsYXNzCi0gICAgICAgICBpbiB0aGF0IGNhc2UuICBPdGhlcndpc2UsIHNldCBpdCB0byBzdGF0aWMuICovCi0gICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgIT0gQ19FWFQpCi0JewotCSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19TVEFUKTsKLQl9Ci0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotI2lmZGVmIFNfU0VUX1NJWkUKLSAgICAgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHRlbXApOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iKSwKLQkgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19sY29tbV9pbnRlcm5hbCgpICovCi0KLXZvaWQKLXNfbGNvbW0gKG5lZWRzX2FsaWduKQotICAgICBpbnQgbmVlZHNfYWxpZ247Ci17Ci0gIHNfbGNvbW1faW50ZXJuYWwgKG5lZWRzX2FsaWduLCAwKTsKLX0KLQotdm9pZCBzX2xjb21tX2J5dGVzIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICBzX2xjb21tX2ludGVybmFsIChuZWVkc19hbGlnbiwgMSk7Ci19Ci0KLXZvaWQgCi1zX2xzeW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAvKiB3ZSBwZXJtaXQgQU5ZIGRlZmluZWQgZXhwcmVzc2lvbjogQlNENC4yIGRlbWFuZHMgY29uc3RhbnRzICovCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKnAgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgICYmIGV4cC5YX29wICE9IE9fcmVnaXN0ZXIpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAvKiBGSVhNRS1TT09OIEkgcHVsbGVkIGEgKCYmIHN5bWJvbFAtPnN5X290aGVyID09IDAgJiYKLSAgICAgc3ltYm9sUC0+c3lfZGVzYyA9PSAwKSBvdXQgb2YgdGhpcyB0ZXN0IGJlY2F1c2UgY29mZiBkb2Vzbid0IGhhdmUKLSAgICAgdGhvc2UgZmllbGRzLCBhbmQgSSBjYW4ndCBzZWUgd2hlbiB0aGV5J2QgZXZlciBiZSB0cmlwcGVkLiAgSQotICAgICBkb24ndCB0aGluayBJIHVuZGVyc3RhbmQgd2h5IHRoZXkgd2VyZSBoZXJlIHNvIEkgbWF5IGhhdmUKLSAgICAgaW50cm9kdWNlZCBhIGJ1Zy4gQXMgcmVjZW50bHkgYXMgMS4zNyBkaWRuJ3QgaGF2ZSB0aGlzIHRlc3QKLSAgICAgYW55d2F5LiAgeG94b3JpY2guICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgbmFtZSBtaWdodCBiZSBhbiB1bmRlZmluZWQgLmdsb2JhbCBzeW1ib2w7IGJlIHN1cmUgdG8KLQkga2VlcCB0aGUgImV4dGVybmFsIiBiaXQuICovCi0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLAotCQkgICAgIChleHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgID8gYWJzb2x1dGVfc2VjdGlvbgotCQkgICAgICA6IHJlZ19zZWN0aW9uKSk7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIiksIG5hbWUpOwotICAgIH0KLSAgKnAgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2xzeW0oKSAqLwotCi0vKiBSZWFkIGEgbGluZSBpbnRvIGFuIHNiLiAgKi8KLQotc3RhdGljIGludAotZ2V0X2xpbmVfc2IgKGxpbmUpCi0gICAgIHNiICpsaW5lOwotewotICBjaGFyIHF1b3RlMSwgcXVvdGUyLCBpbnF1b3RlOwotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcbicpCi0gICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgPj0gYnVmZmVyX2xpbWl0KQotICAgIHsKLSAgICAgIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGlmIChidWZmZXJfbGltaXQgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgYXBwLmMgc2V0cyBhbnkgb3RoZXIgY2hhcmFjdGVycyB0byBMRVhfSVNfU1RSSU5HUVVPVEUsIHRoaXMKLSAgICAgY29kZSBuZWVkcyB0byBiZSBjaGFuZ2VkLiAgKi8KLSAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLSAgICBxdW90ZTEgPSAnIic7Ci0gIGVsc2UKLSAgICBxdW90ZTEgPSAnXDAnOwotCi0gIHF1b3RlMiA9ICdcMCc7Ci0gIGlmIChmbGFnX202OGtfbXJpKQotICAgIHF1b3RlMiA9ICdcJyc7Ci0jaWZkZWYgTEVYX0lTX1NUUklOR1FVT1RFCi0gIHF1b3RlMiA9ICdcJyc7Ci0jZW5kaWYKLQotICBpbnF1b3RlID0gJ1wwJzsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JIHx8IChpbnF1b3RlICE9ICdcMCcgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nKSkKLSAgICB7Ci0gICAgICBpZiAoaW5xdW90ZSA9PSAqaW5wdXRfbGluZV9wb2ludGVyKQotCWlucXVvdGUgPSAnXDAnOwotICAgICAgZWxzZSBpZiAoaW5xdW90ZSA9PSAnXDAnKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09IHF1b3RlMSkKLQkgICAgaW5xdW90ZSA9IHF1b3RlMTsKLQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gcXVvdGUyKQotCSAgICBpbnF1b3RlID0gcXVvdGUyOwotCX0KLSAgICAgIHNiX2FkZF9jaGFyIChsaW5lLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotICAgIH0KLSAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAotCSAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1xuJykKLQlidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBEZWZpbmUgYSBtYWNyby4gIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRvIG1hY3JvLmMsIHdoaWNoIGlzIHNoYXJlZAotICAgYmV0d2VlbiBnYXMgYW5kIGdhc3AuICAqLwotCi12b2lkCi1zX21hY3JvIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHNiIHM7Ci0gIHNiIGxhYmVsOwotICBjb25zdCBjaGFyICplcnI7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgc2JfbmV3ICgmcyk7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICBzYl9hZGRfY2hhciAoJnMsICppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci0KLSAgc2JfbmV3ICgmbGFiZWwpOwotICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotICAgIHNiX2FkZF9zdHJpbmcgKCZsYWJlbCwgU19HRVRfTkFNRSAobGluZV9sYWJlbCkpOwotCi0gIGVyciA9IGRlZmluZV9tYWNybyAoMCwgJnMsICZsYWJlbCwgZ2V0X2xpbmVfc2IsICZuYW1lKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgIiVzIiwgZXJyKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JewotCSAgU19TRVRfU0VHTUVOVCAobGluZV9sYWJlbCwgdW5kZWZpbmVkX3NlY3Rpb24pOwotCSAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIDApOwotCSAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCX0KLQotICAgICAgaWYgKCgoZmxhZ19tNjhrX21yaQotI2lmZGVmIE5PX1BTRVVET19ET1QKLQkgICAgfHwgMQotI2VuZGlmCi0JICAgICkKLQkgICAmJiBoYXNoX2ZpbmQgKHBvX2hhc2gsIG5hbWUpICE9IE5VTEwpCi0JICB8fCAoISBmbGFnX202OGtfbXJpCi0JICAgICAgJiYgKm5hbWUgPT0gJy4nCi0JICAgICAgJiYgaGFzaF9maW5kIChwb19oYXNoLCBuYW1lICsgMSkgIT0gTlVMTCkpCi0JYXNfd2FybiAoXygiYXR0ZW1wdCB0byByZWRlZmluZSBwc2V1ZG8tb3AgYCVzJyBpZ25vcmVkIiksCi0JCSBuYW1lKTsKLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJnMpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5tZXhpdCBwc2V1ZG8tb3AsIHdoaWNoIGltbWVkaWF0ZWx5IGV4aXRzIGEgbWFjcm8KLSAgIGV4cGFuc2lvbi4gICovCi0KLXZvaWQKLXNfbWV4aXQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjb25kX2V4aXRfbWFjcm8gKG1hY3JvX25lc3QpOwotICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci19Ci0KLS8qIFN3aXRjaCBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlLiAgKi8KLQotdm9pZAotc19tcmkgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgb24sIG9sZF9mbGFnOwotCi0gIG9uID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIG9sZF9mbGFnID0gZmxhZ19tcmk7Ci0gIGlmIChvbiAhPSAwKQotICAgIHsKLSAgICAgIGZsYWdfbXJpID0gMTsKLSNpZmRlZiBUQ19NNjhLCi0gICAgICBmbGFnX202OGtfbXJpID0gMTsKLSNlbmRpZgotICAgICAgbWFjcm9fbXJpX21vZGUgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZsYWdfbXJpID0gMDsKLSAgICAgIGZsYWdfbTY4a19tcmkgPSAwOwotICAgICAgbWFjcm9fbXJpX21vZGUgKDApOwotICAgIH0KLQotICAvKiBPcGVyYXRvciBwcmVjZWRlbmNlIGNoYW5nZXMgaW4gbTY4ayBNUkkgbW9kZSwgc28gd2UgbmVlZCB0bwotICAgICB1cGRhdGUgdGhlIG9wZXJhdG9yIHJhbmtpbmdzLiAgKi8KLSAgZXhwcl9zZXRfcHJlY2VkZW5jZSAoKTsKLQotI2lmZGVmIE1SSV9NT0RFX0NIQU5HRQotICBpZiAob24gIT0gb2xkX2ZsYWcpCi0gICAgTVJJX01PREVfQ0hBTkdFIChvbik7Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgY2hhbmdpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZG9fb3JnIChzZWdtZW50LCBleHAsIGZpbGwpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IGZpbGw7Ci17Ci0gIGlmIChzZWdtZW50ICE9IG5vd19zZWcgJiYgc2VnbWVudCAhPSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIGFzX2JhZCAoXygiaW52YWxpZCBzZWdtZW50IFwiJXNcIjsgc2VnbWVudCBcIiVzXCIgYXNzdW1lZCIpLAotCSAgICBzZWdtZW50X25hbWUgKHNlZ21lbnQpLCBzZWdtZW50X25hbWUgKG5vd19zZWcpKTsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChmaWxsICE9IDApCi0JYXNfd2FybiAoXygiaWdub3JpbmcgZmlsbCB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotICAgICAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIGFzX2JhZCAoXygib25seSBjb25zdGFudCBvZmZzZXRzIHN1cHBvcnRlZCBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotCSAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotCX0KLSAgICAgIGFic19zZWN0aW9uX29mZnNldCA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBleHAtPlhfYWRkX3N5bWJvbCwKLQkJICAgIGV4cC0+WF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgICpwID0gZmlsbDsKLSAgICB9Ci19Ci0KLXZvaWQgCi1zX29yZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgLyogVGhlIG02OGsgTVJJIGFzc2VtYmxlciBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3IgLm9yZy4gIEl0Ci0gICAgIG1lYW5zIHRvIGNyZWF0ZSBhbiBhYnNvbHV0ZSBzZWN0aW9uIGF0IGEgZ2l2ZW4gYWRkcmVzcy4gIFdlIGNhbid0Ci0gICAgIHN1cHBvcnQgdGhhdC0tdXNlIGEgbGlua2VyIHNjcmlwdCBpbnN0ZWFkLiAgKi8KLSAgaWYgKGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNUkkgc3R5bGUgT1JHIHBzZXVkby1vcCBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgYmVsaWV2ZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCU0QgNC4yIEFTLiAgVGhlcmUgaXMgbm8gc3VjaAotICAgICB0aGluZyBhcyBhIHN1Yi1zZWdtZW50LXJlbGF0aXZlIG9yaWdpbi4gIEFueSBhYnNvbHV0ZSBvcmlnaW4gaXMKLSAgICAgZ2l2ZW4gYSB3YXJuaW5nLCB0aGVuIGFzc3VtZWQgdG8gYmUgc2VnbWVudC1yZWxhdGl2ZS4gIEFueQotICAgICBzZWdtZW50ZWQgb3JpZ2luIGV4cHJlc3Npb24gKCJmb28rNDIiKSBoYWQgYmV0dGVyIGJlIGluIHRoZSByaWdodAotICAgICBzZWdtZW50IG9yIHRoZSAub3JnIGlzIGlnbm9yZWQuCi0KLSAgICAgQlNEIDQuMiBBUyB3YXJucyBpZiB5b3UgdHJ5IHRvIC5vcmcgYmFja3dhcmRzLiBXZSBjYW5ub3QgYmVjYXVzZQotICAgICB3ZSBuZXZlciBrbm93IHN1Yi1zZWdtZW50IHNpemVzIHdoZW4gd2UgYXJlIHJlYWRpbmcgY29kZS4gIEJTRAotICAgICB3aWxsIGNyYXNoIHRyeWluZyB0byBlbWl0IG5lZ2F0aXZlIG51bWJlcnMgb2YgZmlsbGVyIGJ5dGVzIGluCi0gICAgIGNlcnRhaW4gLm9yZ3MuIFdlIGRvbid0IGNyYXNoLCBidXQgc2VlIGFzLXdyaXRlIGZvciB0aGF0IGNvZGUuCi0KLSAgICAgRG9uJ3QgbWFrZSBmcmFnIGlmIG5lZWRfcGFzc18yPT0xLiAgKi8KLSAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHRlbXBfZmlsbCA9IDA7Ci0KLSAgaWYgKCFuZWVkX3Bhc3NfMikKLSAgICBkb19vcmcgKHNlZ21lbnQsICZleHAsIHRlbXBfZmlsbCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19vcmcoKSAqLwotCi0vKiBIYW5kbGUgcGFyc2luZyBmb3IgdGhlIE1SSSBTRUNUL1NFQ1RJT04gcHNldWRvLW9wLiAgVGhpcyBzaG91bGQgYmUKLSAgIGNhbGxlZCBieSB0aGUgb2JqLWZvcm1hdCByb3V0aW5lIHdoaWNoIGhhbmRsZXMgc2VjdGlvbiBjaGFuZ2luZwotICAgd2hlbiBpbiBNUkkgbW9kZS4gIEl0IHdpbGwgY3JlYXRlIGEgbmV3IHNlY3Rpb24sIGFuZCByZXR1cm4gaXQuICBJdAotICAgd2lsbCBzZXQgKlRZUEUgdG8gdGhlIHNlY3Rpb24gdHlwZTogb25lIG9mICdDJyAoY29kZSksICdEJyAoZGF0YSksCi0gICAnTScgKG1peGVkKSwgb3IgJ1InIChyb21hYmxlKS4gIElmIEJGRF9BU1NFTUJMRVIgaXMgZGVmaW5lZCwgdGhlCi0gICBmbGFncyB3aWxsIGJlIHNldCBpbiB0aGUgc2VjdGlvbi4gICovCi0KLXZvaWQKLXNfbXJpX3NlY3QgKHR5cGUpCi0gICAgIGNoYXIgKnR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBUQ19NNjhLCi0KLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzZWdUIHNlZzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIAotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKm5hbWUpKQotICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotICAgIH0KLQotICBuYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgc2VnID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGludCBhbGlnbjsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2VnLCBhbGlnbik7Ci0gICAgfQotCi0gICp0eXBlID0gJ0MnOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgYyA9ICorK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgYyk7Ci0gICAgICBpZiAoYyA9PSAnQycgfHwgYyA9PSAnRCcgfHwgYyA9PSAnTScgfHwgYyA9PSAnUicpCi0JKnR5cGUgPSBjOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIpKTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgewotCWZsYWd3b3JkIGZsYWdzOwotCi0JZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0JaWYgKCp0eXBlID09ICdDJykKLQkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERTsKLQllbHNlIGlmICgqdHlwZSA9PSAnRCcgfHwgKnR5cGUgPT0gJ00nKQotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBOwotCWVsc2UgaWYgKCp0eXBlID09ICdSJykKLQkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19SRUFET05MWSB8IFNFQ19ST007Ci0JaWYgKGZsYWdzICE9IFNFQ19OT19GTEFHUykKLQkgIHsKLQkgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywgZmxhZ3MpKQotCSAgICAgIGFzX3dhcm4gKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKLQkJICAgICAgIGJmZF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgc2VnKSwKLQkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICAvKiBJZ25vcmUgdGhlIEhQIHR5cGUuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTk2MAotCi0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc2VnVCBzZWc7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBuYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgc2VnID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgICp0eXBlID0gJ0MnOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqc2VjdHlwZTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzZWN0eXBlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKCpzZWN0eXBlID09ICdcMCcpCi0JKnR5cGUgPSAnQyc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAidGV4dCIpID09IDApCi0JKnR5cGUgPSAnQyc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAiZGF0YSIpID09IDApCi0JKnR5cGUgPSAnRCc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAicm9tZGF0YSIpID09IDApCi0JKnR5cGUgPSAnUic7Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSBgJXMnIiksIHNlY3R5cGUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBjaGFyICpzZWNjbWQ7Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc2VjY21kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKHNlY2NtZCwgImFic29sdXRlIikgPT0gMCkKLQl7Ci0JICBhc19iYWQgKF8oImFic29sdXRlIHNlY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHNlY2NtZCwgImFsaWduIikgPT0gMCkKLQl7Ci0JICBpbnQgYWxpZ247Ci0KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIHJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgc2VjdGlvbiBjb21tYW5kIGAlcyciKSwgc2VjY21kKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsJICAKLQotI2Vsc2UgLyogISBUQ19JOTYwICovCi0gIC8qIFRoZSBNUkkgYXNzZW1ibGVyIHNlZW1zIHRvIHVzZSBkaWZmZXJlbnQgZm9ybXMgb2YgLnNlY3QgZm9yCi0gICAgIGRpZmZlcmVudCB0YXJnZXRzLiAgKi8KLSAgYXNfYmFkICgiTVJJIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKLSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbmRpZiAvKiAhIFRDX0k5NjAgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLX0KLQotLyogSGFuZGxlIHRoZSAucHJpbnQgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19wcmludCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBsZW47Ci0KLSAgcyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLSAgcHJpbnRmICgiJXNcbiIsIHMpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5wdXJnZW0gcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19wdXJnZW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBkZWxldGVfbWFjcm8gKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnJlcHQgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19yZXB0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGNvdW50OwotICBzYiBvbmU7Ci0gIHNiIG1hbnk7Ci0KLSAgY291bnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBzYl9uZXcgKCZvbmUpOwotICBpZiAoISBidWZmZXJfYW5kX25lc3QgKCJSRVBUIiwgIkVORFIiLCAmb25lLCBnZXRfbGluZV9zYikpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJyZXB0IHdpdGhvdXQgZW5kciIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2JfbmV3ICgmbWFueSk7Ci0gIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICBzYl9hZGRfc2IgKCZtYW55LCAmb25lKTsKLQotICBzYl9raWxsICgmb25lKTsKLQotICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmbWFueSwgaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgc2Jfa2lsbCAoJm1hbnkpOwotICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVxdSwgLmVxdWl2IGFuZCAuc2V0IGRpcmVjdGl2ZXMuICBJZiBFUVVJViBpcyAxLCB0aGVuCi0gICB0aGlzIGlzIC5lcXVpdiwgYW5kIGl0IGlzIGFuIGVycm9yIGlmIHRoZSBzeW1ib2wgaXMgYWxyZWFkeQotICAgZGVmaW5lZC4gICovCi0KLXZvaWQgCi1zX3NldCAoZXF1aXYpCi0gICAgIGludCBlcXVpdjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBkZWxpbTsKLSAgcmVnaXN0ZXIgY2hhciAqZW5kX25hbWU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyoKLSAgICogRXNwZWNpYWwgYXBvbG9naWVzIGZvciB0aGUgcmFuZG9tIGxvZ2ljOgotICAgKiB0aGlzIGp1c3QgZ3JldywgYW5kIGNvdWxkIGJlIHBhcnNlZCBtdWNoIG1vcmUgc2ltcGx5IQotICAgKiBEZWFuIGluIGhhc3RlLgotICAgKi8KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZGVsaW0gPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZW5kX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICplbmRfbmFtZSA9IGRlbGltOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICplbmRfbmFtZSA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKmVuZF9uYW1lID0gZGVsaW07Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgKmVuZF9uYW1lID0gMDsKLQotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFR1cm4gJy4gPSBtdW1ibGUnIGludG8gYSAub3JnIG11bWJsZSAqLwotICAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OwotICAgICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgICBzZWdtZW50ID0gZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmZXhwKTsKLQotICAgICAgaWYgKCFuZWVkX3Bhc3NfMikKLQlkb19vcmcgKHNlZ21lbnQsICZleHAsIDApOwotCi0gICAgICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSA9PSBOVUxMCi0gICAgICAmJiAoc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgLyogV2hlbiBkb2luZyBzeW1ib2wgbGlzdGluZ3MsIHBsYXkgZ2FtZXMgd2l0aCBkdW1teSBmcmFnbWVudHMgbGl2aW5nCi0JIG91dHNpZGUgdGhlIG5vcm1hbCBmcmFnbWVudCBjaGFpbiB0byByZWNvcmQgdGhlIGZpbGUgYW5kIGxpbmUgaW5mbwotICAgICAgICAgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChsaXN0aW5nICYgTElTVElOR19TWU1CT0xTKQotCXsKLQkgIGV4dGVybiBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqbGlzdGluZ190YWlsOwotCSAgZnJhZ1MgKmR1bW15X2ZyYWcgPSAoZnJhZ1MgKikgeG1hbGxvYyAoc2l6ZW9mKGZyYWdTKSk7Ci0JICBtZW1zZXQgKGR1bW15X2ZyYWcsIDAsIHNpemVvZihmcmFnUykpOwotCSAgZHVtbXlfZnJhZy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBkdW1teV9mcmFnLT5saW5lID0gbGlzdGluZ190YWlsOwotCSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCBkdW1teV9mcmFnKTsKLQkgIGR1bW15X2ZyYWctPmZyX3N5bWJvbCA9IHN5bWJvbFA7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQkJCSAgICAKLSNpZmRlZiBPQkpfQ09GRgotICAgICAgLyogInNldCIgc3ltYm9scyBhcmUgbG9jYWwgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuICovCi0gICAgICBTRl9TRVRfTE9DQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSAgICB9CQkJCS8qIG1ha2UgYSBuZXcgc3ltYm9sICovCi0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0KLSAgKmVuZF9uYW1lID0gZGVsaW07Ci0KLSAgaWYgKGVxdWl2Ci0gICAgICAmJiBTX0lTX0RFRklORUQgKHN5bWJvbFApCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSAhPSByZWdfc2VjdGlvbikKLSAgICBhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgcHNldWRvX3NldCAoc3ltYm9sUCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfc2V0KCkgKi8KLQotdm9pZCAKLXNfc3BhY2UgKG11bHQpCi0gICAgIGludCBtdWx0OwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGV4cHJlc3Npb25TIHZhbDsKLSAgY2hhciAqcCA9IDA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotICBpbnQgYnl0ZXM7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgLyogSW4gbTY4ayBNUkkgbW9kZSwgd2UgbmVlZCB0byBhbGlnbiB0byBhIHdvcmQgYm91bmRhcnksIHVubGVzcwotICAgICB0aGlzIGlzIGRzLmIuICAqLwotICBpZiAoZmxhZ19tNjhrX21yaSAmJiBtdWx0ID4gMSkKLSAgICB7Ci0gICAgICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCXsKLQkgIGFic19zZWN0aW9uX29mZnNldCArPSBhYnNfc2VjdGlvbl9vZmZzZXQgJiAxOwotCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGFic19zZWN0aW9uX29mZnNldCk7Ci0JfQotICAgICAgZWxzZSBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLQl7Ci0JICB2YWx1ZVQgdmFsOwotCi0JICB2YWwgPSBTX0dFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wpOwotCSAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCSAgICB7Ci0JICAgICAgU19TRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sLCB2YWwgKyAxKTsKLQkgICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCQl7Ci0JCSAgZXhwcmVzc2lvblMgKnN5bWV4cDsKLQotCQkgIHN5bWV4cCA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAobGluZV9sYWJlbCk7Ci0JCSAga25vdyAoc3ltZXhwLT5YX29wID09IE9fc3ltYm9sKTsKLQkJICBrbm93IChzeW1leHAtPlhfYWRkX3N5bWJvbCA9PSBtcmlfY29tbW9uX3N5bWJvbCk7Ci0JCSAgc3ltZXhwLT5YX2FkZF9udW1iZXIgKz0gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRvX2FsaWduICgxLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxpbmVfbGFiZWwsIGZyYWdfbm93KTsKLQkgICAgICBTX1NFVF9WQUxVRSAobGluZV9sYWJlbCwgZnJhZ19ub3dfZml4ICgpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgYnl0ZXMgPSBtdWx0OwotCi0gIGV4cHJlc3Npb24gKCZleHApOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZXhwcmVzc2lvbiAoJnZhbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgdmFsLlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotCi0gIGlmICh2YWwuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCB2YWwuWF9hZGRfbnVtYmVyIDwgLSAweDgwCi0gICAgICB8fCB2YWwuWF9hZGRfbnVtYmVyID4gMHhmZgotICAgICAgfHwgKG11bHQgIT0gMCAmJiBtdWx0ICE9IDEgJiYgdmFsLlhfYWRkX251bWJlciAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIHZhcmlhYmxlIHNpemUgb3IgZmlsbCB2YWx1ZSIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvZmZzZXRUIGk7Ci0KLQkgIGlmIChtdWx0ID09IDApCi0JICAgIG11bHQgPSAxOwotCSAgYnl0ZXMgPSBtdWx0ICogZXhwLlhfYWRkX251bWJlcjsKLQkgIGZvciAoaSA9IDA7IGkgPCBleHAuWF9hZGRfbnVtYmVyOyBpKyspCi0JICAgIGVtaXRfZXhwciAoJnZhbCwgbXVsdCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIGxvbmcgcmVwZWF0OwotCi0JICByZXBlYXQgPSBleHAuWF9hZGRfbnVtYmVyOwotCSAgaWYgKG11bHQpCi0JICAgIHJlcGVhdCAqPSBtdWx0OwotCSAgYnl0ZXMgPSByZXBlYXQ7Ci0JICBpZiAocmVwZWF0IDw9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBmbGFnX21yaSkKLQkJYXNfd2FybiAoXygiLnNwYWNlIHJlcGVhdCBjb3VudCBpcyB6ZXJvLCBpZ25vcmVkIikpOwotCSAgICAgIGVsc2UgaWYgKHJlcGVhdCA8IDApCi0JCWFzX3dhcm4gKF8oIi5zcGFjZSByZXBlYXQgY291bnQgaXMgbmVnYXRpdmUsIGlnbm9yZWQiKSk7Ci0JICAgICAgZ290byBnZXRvdXQ7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgYXJlIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBqdXN0IGJ1bXAgdGhlIG9mZnNldC4gICovCi0JICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgYWJzX3NlY3Rpb25fb2Zmc2V0ICs9IHJlcGVhdDsKLQkgICAgICBnb3RvIGdldG91dDsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgc2VjcmV0bHkgaW4gYW4gTVJJIGNvbW1vbiBzZWN0aW9uLCB0aGVuCi0JICAgICBjcmVhdGluZyBzcGFjZSBqdXN0IGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uCi0JICAgICBzeW1ib2wuICAqLwotCSAgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBTX1NFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wsCi0JCQkgICBTX0dFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wpICsgcmVwZWF0KTsKLQkgICAgICBnb3RvIGdldG91dDsKLQkgICAgfQotCi0JICBpZiAoIW5lZWRfcGFzc18yKQotCSAgICBwID0gZnJhZ192YXIgKHJzX2ZpbGwsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIChzeW1ib2xTICopIDAsCi0JCQkgIChvZmZzZXRUKSByZXBlYXQsIChjaGFyICopIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJzcGFjZSBhbGxvY2F0aW9uIHRvbyBjb21wbGV4IGluIGFic29sdXRlIHNlY3Rpb24iKSk7Ci0JICAgICAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLQkgICAgfQotCSAgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInNwYWNlIGFsbG9jYXRpb24gdG9vIGNvbXBsZXggaW4gY29tbW9uIHNlY3Rpb24iKSk7Ci0JICAgICAgbXJpX2NvbW1vbl9zeW1ib2wgPSBOVUxMOwotCSAgICB9Ci0JICBpZiAoIW5lZWRfcGFzc18yKQotCSAgICBwID0gZnJhZ192YXIgKHJzX3NwYWNlLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkJICBtYWtlX2V4cHJfc3ltYm9sICgmZXhwKSwgKG9mZnNldFQpIDAsIChjaGFyICopIDApOwotCX0KLQotICAgICAgaWYgKHApCi0JKnAgPSB2YWwuWF9hZGRfbnVtYmVyOwotICAgIH0KLQotIGdldG91dDoKLQotICAvKiBJbiBNUkkgbW9kZSwgYWZ0ZXIgYW4gb2RkIG51bWJlciBvZiBieXRlcywgd2UgbXVzdCBhbGlnbiB0byBhbgotICAgICBldmVuIHdvcmQgYm91bmRhcnksIHVubGVzcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhIGRjLmIsIGRzLmIKLSAgICAgb3IgZGNiLmIuICAqLwotICBpZiAoZmxhZ19tcmkgJiYgKGJ5dGVzICYgMSkgIT0gMCkKLSAgICBtcmlfcGVuZGluZ19hbGlnbiA9IDE7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLS8qIFRoaXMgaXMgbGlrZSBzX3NwYWNlLCBidXQgdGhlIHZhbHVlIGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdpdGgKLSAgIHRoZSBnaXZlbiBwcmVjaXNpb24uICBUaGlzIGlzIGZvciB0aGUgTVJJIGRjYi5zIHBzZXVkby1vcCBhbmQKLSAgIGZyaWVuZHMuICAqLwotCi12b2lkCi1zX2Zsb2F0X3NwYWNlIChmbG9hdF90eXBlKQotICAgICBpbnQgZmxvYXRfdHlwZTsKLXsKLSAgb2Zmc2V0VCBjb3VudDsKLSAgaW50IGZsZW47Ci0gIGNoYXIgdGVtcFtNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVRdOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGNvdW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHZhbHVlIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmIChmbGFnX21yaSkKLQltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIC8qIFNraXAgYW55IDB7bGV0dGVyfSB0aGF0IG1heSBiZSBwcmVzZW50LiAgRG9uJ3QgZXZlbiBjaGVjayBpZiB0aGUKLSAgICogbGV0dGVyIGlzIGxlZ2FsLiAgKi8KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnMCcKLSAgICAgICYmIGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMV0pKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gIC8qIEFjY2VwdCA6eHh4eCwgd2hlcmUgdGhlIHgncyBhcmUgaGV4IGRpZ2l0cywgZm9yIGEgZmxvYXRpbmcgcG9pbnQKLSAgICAgd2l0aCB0aGUgZXhhY3QgZGlnaXRzIHNwZWNpZmllZC4gICovCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzonKQotICAgIHsKLSAgICAgIGZsZW4gPSBoZXhfZmxvYXQgKGZsb2F0X3R5cGUsIHRlbXApOwotICAgICAgaWYgKGZsZW4gPCAwKQotCXsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICBpZiAoZmxhZ19tcmkpCi0JICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICplcnI7Ci0KLSAgICAgIGVyciA9IG1kX2F0b2YgKGZsb2F0X3R5cGUsIHRlbXAsICZmbGVuKTsKLSAgICAgIGtub3cgKGZsZW4gPD0gTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUKTsKLSAgICAgIGtub3cgKGZsZW4gPiAwKTsKLSAgICAgIGlmIChlcnIpCi0JewotCSAgYXNfYmFkIChfKCJCYWQgZmxvYXRpbmcgbGl0ZXJhbDogJXMiKSwgZXJyKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICBpZiAoZmxhZ19tcmkpCi0JICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKC0tY291bnQgPj0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICBwID0gZnJhZ19tb3JlIChmbGVuKTsKLSAgICAgIG1lbWNweSAocCwgdGVtcCwgKHVuc2lnbmVkIGludCkgZmxlbik7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5zdHJ1Y3QgcHNldWRvLW9wLCBhcyBmb3VuZCBpbiBNSVBTIGFzc2VtYmxlcnMuICAqLwotCi12b2lkCi1zX3N0cnVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0gIGFic19zZWN0aW9uX29mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChhYnNvbHV0ZV9zZWN0aW9uLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi12b2lkCi1zX3RleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgKHN1YnNlZ1QpIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotI2lmZGVmIE9CSl9WTVMKLSAgY29uc3RfZmxhZyAmPSB+SU5fREVGQVVMVF9TRUNUSU9OOwotI2VuZGlmCi19CQkJCS8qIHNfdGV4dCgpICovCi0MCi0KLXZvaWQgCi1kZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpCi17Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgLyogUmV0dXJuIGhhdmluZyBhbHJlYWR5IHN3YWxsb3dlZCBlbmQtb2YtbGluZS4gKi8KLX0JCQkJLyogUmV0dXJuIHBvaW50aW5nIGp1c3QgYWZ0ZXIgZW5kLW9mLWxpbmUuICovCi0KLXZvaWQKLWlnbm9yZV9yZXN0X29mX2xpbmUgKCkJCS8qIEZvciBzdXNwZWN0IGxpbmVzOiBnaXZlcyB3YXJuaW5nLiAqLwotewotICBpZiAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoaXNwcmludCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCWFzX2JhZCAoXygiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIGlzIGAlYycuIiksCi0JCSppbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIHZhbHVlZCAweCV4LiIpLAotCQkqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQKLQkgICAgICYmICFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JfQotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBSZXR1cm4gcG9pbnRpbmcganVzdCBhZnRlciBlbmQtb2YtbGluZS4gKi8KLSAga25vdyAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKTsKLX0KLQotdm9pZAotZGlzY2FyZF9yZXN0X29mX2xpbmUgKCkKLXsKLSAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAotICAgICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOyAgICAgICAgIC8qIFJldHVybiBwb2ludGluZyBqdXN0IGFmdGVyIGVuZC1vZi1saW5lLiAqLwotICBrbm93IChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWy0xXV0pOwotfQotCi0vKgotICoJCQlwc2V1ZG9fc2V0KCkKLSAqCi0gKiBJbjoJUG9pbnRlciB0byBhIHN5bWJvbC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+ZXhwcmVzc2lvbi4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+anVzdCBhZnRlciBhbnkgd2hpdGVzcGFjZSBhZnRlciBleHByZXNzaW9uLgotICoJVHJpZWQgdG8gc2V0IHN5bWJvbCB0byB2YWx1ZSBvZiBleHByZXNzaW9uLgotICoJV2lsbCBjaGFuZ2Ugc3ltYm9scyB0eXBlLCB2YWx1ZSwgYW5kIGZyYWc7Ci0gKi8KLXZvaWQKLXBzZXVkb19zZXQgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSNpZiAoZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKSkgJiYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBpbnQgZXh0OwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSAga25vdyAoc3ltYm9sUCk7CQkvKiBOVUxMIHBvaW50ZXIgaXMgbG9naWMgZXJyb3IuICovCi0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgZXh0ID0gU19JU19FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgaWYgKGV4cC5YX29wID09IE9faWxsZWdhbCkKLSAgICBhc19iYWQgKF8oImlsbGVnYWwgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3NpbmcgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICBpZiAoZXhwLlhfYWRkX251bWJlciA+IDApCi0JYXNfYmFkIChfKCJiaWdudW0gaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGV4cC5YX29wID09IE9fc3VidHJhY3QKLQkgICAmJiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgICAgPT0gU19HRVRfU0VHTUVOVCAoZXhwLlhfb3Bfc3ltYm9sKSkKLQkgICAmJiBTRUdfTk9STUFMIChTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSkKLQkgICAmJiAoc3ltYm9sX2dldF9mcmFnIChleHAuWF9hZGRfc3ltYm9sKQotCSAgICAgICA9PSBzeW1ib2xfZ2V0X2ZyYWcgKGV4cC5YX29wX3N5bWJvbCkpKQotICAgIHsKLSAgICAgIGV4cC5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAoU19HRVRfVkFMVUUgKGV4cC5YX2FkZF9zeW1ib2wpCi0JCQkgIC0gU19HRVRfVkFMVUUgKGV4cC5YX29wX3N5bWJvbCkpOwotICAgIH0KLQotICBzd2l0Y2ggKGV4cC5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICBjYXNlIE9fYWJzZW50OgotICAgIGNhc2UgT19iaWc6Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYWJzb2x1dGVfc2VjdGlvbik7Ci0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgICAgIGlmIChleHQpCi0JU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICAgICAgZWxzZQotCVNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCByZWdfc2VjdGlvbik7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgIHx8IGV4cC5YX2FkZF9udW1iZXIgIT0gMCkKLQlzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsICZleHApOwotICAgICAgZWxzZSBpZiAoc3ltYm9sX3NlY3Rpb25fcCAoc3ltYm9sUCkpCi0JYXNfYmFkICgiaW52YWxpZCBhdHRlbXB0IHRvIHNldCB2YWx1ZSBvZiBzZWN0aW9uIHN5bWJvbCIpOwotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnMgPSBleHAuWF9hZGRfc3ltYm9sOwotCi0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTX0dFVF9TRUdNRU5UIChzKSk7Ci0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLQkgIGlmIChleHQpCi0JICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIGVsc2UKLQkgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLAotCQkgICAgICAgZXhwLlhfYWRkX251bWJlciArIFNfR0VUX1ZBTFVFIChzKSk7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIHN5bWJvbF9nZXRfZnJhZyAocykpOwotCSAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltYm9sUCwgcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhlIHZhbHVlIGlzIHNvbWUgY29tcGxleCBleHByZXNzaW9uLgotCSBGSVhNRTogU2hvdWxkIHdlIHNldCB0aGUgc2VnbWVudCB0byBhbnl0aGluZz8gICovCi0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsICZleHApOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyoKLSAqCQkJY29ucygpCi0gKgotICogQ09OU3RydWN0IG1vcmUgZnJhZyBvZiAuYnl0ZXMsIG9yIC53b3JkcyBldGMuCi0gKiBTaG91bGQgbmVlZF9wYXNzXzIgYmUgMSB0aGVuIGVtaXQgbm8gZnJhZyhzKS4KLSAqIFRoaXMgdW5kZXJzdGFuZHMgRVhQUkVTU0lPTlMuCi0gKgotICogQnVnICg/KQotICoKLSAqIFRoaXMgaGFzIGEgc3BsaXQgcGVyc29uYWxpdHkuIFdlIHVzZSBleHByZXNzaW9uKCkgdG8gcmVhZCB0aGUKLSAqIHZhbHVlLiBXZSBjYW4gZGV0ZWN0IGlmIHRoZSB2YWx1ZSB3b24ndCBmaXQgaW4gYSBieXRlIG9yIHdvcmQuCi0gKiBCdXQgd2UgY2FuJ3QgZGV0ZWN0IGlmIGV4cHJlc3Npb24oKSBkaXNjYXJkZWQgc2lnbmlmaWNhbnQgZGlnaXRzCi0gKiBpbiB0aGUgY2FzZSBvZiBhIGxvbmcuIE5vdCB3b3J0aCB0aGUgY3JvY2tzIHJlcXVpcmVkIHRvIGZpeCBpdC4KLSAqLwotCi0vKiBTZWxlY3QgYSBwYXJzZXIgZm9yIGNvbnMgZXhwcmVzc2lvbnMuICAqLwotCi0vKiBTb21lIHRhcmdldHMgbmVlZCB0byBwYXJzZSB0aGUgZXhwcmVzc2lvbiBpbiB2YXJpb3VzIGZhbmN5IHdheXMuCi0gICBZb3UgY2FuIGRlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gdG8gZG8gd2hhdGV2ZXIgeW91IGxpa2UKLSAgIChmb3IgZXhhbXBsZSwgdGhlIEhQUEEgZG9lcyB0aGlzKS4gIE90aGVyd2lzZSwgeW91IGNhbiBkZWZpbmUKLSAgIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMgdG8gcGVybWl0IGJpdGZpZWxkcyB0byBiZSBzcGVjaWZpZWQsIG9yCi0gICBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyB0byBwZXJtaXQgcmVwZWF0IGNvdW50cy4gIElmIG5vbmUgb2YgdGhlc2UKLSAgIGFyZSBkZWZpbmVkLCB3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZW4gb25seSBzaW1wbGUgZXhwcmVzc2lvbnMKLSAgIGFyZSBwZXJtaXR0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotCi0jaWZuZGVmIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTgotI2lmZGVmIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBwYXJzZV9iaXRmaWVsZF9jb25zIChFWFAsIE5CWVRFUykKLXN0YXRpYyB2b2lkIAotcGFyc2VfYml0ZmllbGRfY29ucyBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7Ci0jZW5kaWYKLSNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIHBhcnNlX3JlcGVhdF9jb25zIChFWFAsIE5CWVRFUykKLXN0YXRpYyB2b2lkCi1wYXJzZV9yZXBlYXRfY29ucyBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7Ci0jZW5kaWYKLQotLyogSWYgd2UgaGF2ZW4ndCBnb3R0ZW4gb25lIHlldCwganVzdCBjYWxsIGV4cHJlc3Npb24uICAqLwotI2lmbmRlZiBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBleHByZXNzaW9uIChFWFApCi0jZW5kaWYKLSNlbmRpZgotCi0vKiB3b3JrZXIgdG8gZG8gLmJ5dGUgZXRjIHN0YXRlbWVudHMgKi8KLS8qIGNsb2JiZXJzIGlucHV0X2xpbmVfcG9pbnRlciwgY2hlY2tzICovCi0vKiBlbmQtb2YtbGluZS4gKi8KLXN0YXRpYyB2b2lkIAotY29uc193b3JrZXIgKG5ieXRlcywgcnZhKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCi0gICAgIGludCBydmE7Ci17Ci0gIGludCBjOwotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgbWRfY29uc19hbGlnbgotICBtZF9jb25zX2FsaWduIChuYnl0ZXMpOwotI2VuZGlmCi0KLSAgYyA9IDA7Ci0gIGRvCi0gICAgewotICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JcGFyc2VfbXJpX2NvbnMgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0gICAgICBlbHNlCi0JVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotCi0gICAgICBpZiAocnZhKQotCXsKLQkgIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbCkKLQkgICAgZXhwLlhfb3AgPSBPX3N5bWJvbF9ydmE7Ci0JICBlbHNlCi0JICAgIGFzX2ZhdGFsIChfKCJydmEgd2l0aG91dCBzeW1ib2wiKSk7Ci0JfQotICAgICAgZW1pdF9leHByICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgICAgKytjOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIC8qIEluIE1SSSBtb2RlLCBhZnRlciBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZSBtdXN0IGFsaWduIHRvIGFuCi0gICAgIGV2ZW4gd29yZCBib3VuZGFyeSwgdW5sZXNzIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgZGMuYiwgZHMuYgotICAgICBvciBkY2IuYi4gICovCi0gIGlmIChmbGFnX21yaSAmJiBuYnl0ZXMgPT0gMSAmJiAoYyAmIDEpICE9IDApCi0gICAgbXJpX3BlbmRpbmdfYWxpZ24gPSAxOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotCi12b2lkCi1jb25zIChzaXplKQotICAgICBpbnQgc2l6ZTsKLXsKLSAgY29uc193b3JrZXIgKHNpemUsIDApOwotfQotCi12b2lkIAotc19ydmEgKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBjb25zX3dvcmtlciAoc2l6ZSwgMSk7Ci19Ci0KLS8qIFB1dCB0aGUgY29udGVudHMgb2YgZXhwcmVzc2lvbiBFWFAgaW50byB0aGUgb2JqZWN0IGZpbGUgdXNpbmcKLSAgIE5CWVRFUyBieXRlcy4gIElmIG5lZWRfcGFzc18yIGlzIDEsIHRoaXMgZG9lcyBub3RoaW5nLiAgKi8KLQotdm9pZAotZW1pdF9leHByIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgb3BlcmF0b3JUIG9wOwotICByZWdpc3RlciBjaGFyICpwOwotICB2YWx1ZVQgZXh0cmFfZGlnaXQgPSAwOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFub3RoZXIgcGFzcy4gICovCi0gIGlmIChuZWVkX3Bhc3NfMikKLSAgICByZXR1cm47Ci0KLSNpZm5kZWYgTk9fTElTVElORwotI2lmZGVmIE9CSl9FTEYKLSAgLyogV2hlbiBnY2MgZW1pdHMgRFdBUkYgMSBkZWJ1Z2dpbmcgcHNldWRvLW9wcywgYSBsaW5lIG51bWJlciB3aWxsCi0gICAgIGFwcGVhciBhcyBhIGZvdXIgYnl0ZSBwb3NpdGl2ZSBjb25zdGFudCBpbiB0aGUgLmxpbmUgc2VjdGlvbiwKLSAgICAgZm9sbG93ZWQgYnkgYSAyIGJ5dGUgMHhmZmZmLiAgTG9vayBmb3IgdGhhdCBjYXNlIGhlcmUuICAqLwotICB7Ci0gICAgc3RhdGljIGludCBkd2FyZl9saW5lID0gLTE7Ci0KLSAgICBpZiAoc3RyY21wIChzZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmxpbmUiKSAhPSAwKQotICAgICAgZHdhcmZfbGluZSA9IC0xOwotICAgIGVsc2UgaWYgKGR3YXJmX2xpbmUgPj0gMAotCSAgICAgJiYgbmJ5dGVzID09IDIKLQkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAmJiAoZXhwLT5YX2FkZF9udW1iZXIgPT0gLTEgfHwgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHhmZmZmKSkKLSAgICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGR3YXJmX2xpbmUpOwotICAgIGVsc2UgaWYgKG5ieXRlcyA9PSA0Ci0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPj0gMCkKLSAgICAgIGR3YXJmX2xpbmUgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICBlbHNlCi0gICAgICBkd2FyZl9saW5lID0gLTE7Ci0gIH0KLQotICAvKiBXaGVuIGdjYyBlbWl0cyBEV0FSRiAxIGRlYnVnZ2luZyBwc2V1ZG8tb3BzLCBhIGZpbGUgbmFtZSB3aWxsCi0gICAgIGFwcGVhciBhcyBhIDIgYnl0ZSBUQUdfY29tcGlsZV91bml0ICgweDExKSBmb2xsb3dlZCBieSBhIDIgYnl0ZQotICAgICBBVF9zaWJsaW5nICgweDEyKSBmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSBhZGRyZXNzIG9mIHRoZSBzaWJsaW5nCi0gICAgIGZvbGxvd2VkIGJ5IGEgMiBieXRlIEFUX25hbWUgKDB4MzgpIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZQotICAgICBmaWxlLiAgV2UgbG9vayBmb3IgdGhhdCBjYXNlIGhlcmUuICAqLwotICB7Ci0gICAgc3RhdGljIGludCBkd2FyZl9maWxlID0gMDsKLQotICAgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZGVidWciKSAhPSAwKQotICAgICAgZHdhcmZfZmlsZSA9IDA7Ci0gICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAwCi0JICAgICAmJiBuYnl0ZXMgPT0gMgotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDB4MTEpCi0gICAgICBkd2FyZl9maWxlID0gMTsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDEKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgxMikKLSAgICAgIGR3YXJmX2ZpbGUgPSAyOwotICAgIGVsc2UgaWYgKGR3YXJmX2ZpbGUgPT0gMgotCSAgICAgJiYgbmJ5dGVzID09IDQpCi0gICAgICBkd2FyZl9maWxlID0gMzsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDMKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgzOCkKLSAgICAgIGR3YXJmX2ZpbGUgPSA0OwotICAgIGVsc2UKLSAgICAgIGR3YXJmX2ZpbGUgPSAwOwotCi0gICAgLyogVGhlIHZhcmlhYmxlIGR3YXJmX2ZpbGVfc3RyaW5nIHRlbGxzIHN0cmluZ2VyIHRoYXQgdGhlIHN0cmluZwotICAgICAgIG1heSBiZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuICAqLwotICAgIGlmIChkd2FyZl9maWxlID09IDQpCi0gICAgICBkd2FyZl9maWxlX3N0cmluZyA9IDE7Ci0gICAgZWxzZQotICAgICAgZHdhcmZfZmlsZV9zdHJpbmcgPSAwOwotICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0gIGlmIChjaGVja19laF9mcmFtZSAoZXhwLCAmbmJ5dGVzKSkKLSAgICByZXR1cm47Ci0KLSAgb3AgPSBleHAtPlhfb3A7Ci0KLSAgLyogQWxsb3cgYC53b3JkIDAnIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAob3AgIT0gT19jb25zdGFudCB8fCBleHAtPlhfYWRkX251bWJlciAhPSAwKQotCWFzX2JhZCAoXygiYXR0ZW1wdCB0byBzdG9yZSB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotICAgICAgYWJzX3NlY3Rpb25fb2Zmc2V0ICs9IG5ieXRlczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIGEgbmVnYXRpdmUgYmlnbnVtLiAgKi8KLSAgaWYgKG9wID09IE9fdW1pbnVzCi0gICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAwCi0gICAgICAmJiBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4cC0+WF9hZGRfc3ltYm9sKS0+WF9vcCA9PSBPX2JpZwotICAgICAgJiYgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCktPlhfYWRkX251bWJlciA+IDApCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotCi0gICAgICBleHAgPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4cC0+WF9hZGRfc3ltYm9sKTsKLQotICAgICAgLyogTmVnYXRlIHRoZSBiaWdudW06IG9uZSdzIGNvbXBsZW1lbnQgZWFjaCBkaWdpdCBhbmQgYWRkIDEuICAqLwotICAgICAgY2FycnkgPSAxOwotICAgICAgZm9yIChpID0gMDsgaSA8IGV4cC0+WF9hZGRfbnVtYmVyOyBpKyspCi0JewotCSAgdW5zaWduZWQgbG9uZyBuZXh0OwotCi0JICBuZXh0ID0gKCgofiAoZ2VuZXJpY19iaWdudW1baV0gJiBMSVRUTEVOVU1fTUFTSykpCi0JCSAgICYgTElUVExFTlVNX01BU0spCi0JCSAgKyBjYXJyeSk7Ci0JICBnZW5lcmljX2JpZ251bVtpXSA9IG5leHQgJiBMSVRUTEVOVU1fTUFTSzsKLQkgIGNhcnJ5ID0gbmV4dCA+PiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JfQotCi0gICAgICAvKiBXZSBjYW4gaWdub3JlIGFueSBjYXJyeSBvdXQsIGJlY2F1c2UgaXQgd2lsbCBiZSBoYW5kbGVkIGJ5Ci0JIGV4dHJhX2RpZ2l0IGlmIGl0IGlzIG5lZWRlZC4gICovCi0KLSAgICAgIGV4dHJhX2RpZ2l0ID0gKHZhbHVlVCkgLTE7Ci0gICAgICBvcCA9IE9fYmlnOwotICAgIH0KLQotICBpZiAob3AgPT0gT19hYnNlbnQgfHwgb3AgPT0gT19pbGxlZ2FsKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInplcm8gYXNzdW1lZCBmb3IgbWlzc2luZyBleHByZXNzaW9uIikpOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19iaWcgJiYgZXhwLT5YX2FkZF9udW1iZXIgPD0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX3JlZ2lzdGVyKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInJlZ2lzdGVyIHZhbHVlIHVzZWQgYXMgZXhwcmVzc2lvbiIpKTsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfbW9yZSAoKGludCkgbmJ5dGVzKTsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0gIC8qIElmIHdlIGhhdmUgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gYSB3b3JkLCBzYXZlIGl0IG9uCi0gICAgIHRoZSBicm9rZW5fd29yZHMgbGlzdC4gIFNlZSB0aGUgY29kZSBpbiB3cml0ZS5jLiAgKi8KLSAgaWYgKG9wID09IE9fc3VidHJhY3QgJiYgbmJ5dGVzID09IDIpCi0gICAgewotICAgICAgc3RydWN0IGJyb2tlbl93b3JkICp4OwotCi0gICAgICB4ID0gKHN0cnVjdCBicm9rZW5fd29yZCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBicm9rZW5fd29yZCkpOwotICAgICAgeC0+bmV4dF9icm9rZW5fd29yZCA9IGJyb2tlbl93b3JkczsKLSAgICAgIGJyb2tlbl93b3JkcyA9IHg7Ci0gICAgICB4LT5zZWcgPSBub3dfc2VnOwotICAgICAgeC0+c3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIHgtPmZyYWcgPSBmcmFnX25vdzsKLSAgICAgIHgtPndvcmRfZ29lc19oZXJlID0gcDsKLSAgICAgIHgtPmRpc3BmcmFnID0gMDsKLSAgICAgIHgtPmFkZCA9IGV4cC0+WF9hZGRfc3ltYm9sOwotICAgICAgeC0+c3ViID0gZXhwLT5YX29wX3N5bWJvbDsKLSAgICAgIHgtPmFkZG51bSA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgeC0+YWRkZWQgPSAwOwotICAgICAgbmV3X2Jyb2tlbl93b3JkcysrOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElmIHdlIGhhdmUgYW4gaW50ZWdlciwgYnV0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgdG9vIGxhcmdlIHRvCi0gICAgIHBhc3MgdG8gbWRfbnVtYmVyX3RvX2NoYXJzLCBoYW5kbGUgaXQgYXMgYSBiaWdudW0uICAqLwotICBpZiAob3AgPT0gT19jb25zdGFudCAmJiBuYnl0ZXMgPiBzaXplb2YgKHZhbHVlVCkpCi0gICAgewotICAgICAgdmFsdWVUIHZhbDsKLSAgICAgIGludCBnZW5jbnQ7Ci0KLSAgICAgIGlmICghIGV4cC0+WF91bnNpZ25lZCAmJiBleHAtPlhfYWRkX251bWJlciA8IDApCi0JZXh0cmFfZGlnaXQgPSAodmFsdWVUKSAtMTsKLSAgICAgIHZhbCA9ICh2YWx1ZVQpIGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgZ2VuY250ID0gMDsKLSAgICAgIGRvCi0JewotCSAgZ2VuZXJpY19iaWdudW1bZ2VuY250XSA9IHZhbCAmIExJVFRMRU5VTV9NQVNLOwotCSAgdmFsID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICArK2dlbmNudDsKLQl9Ci0gICAgICB3aGlsZSAodmFsICE9IDApOwotICAgICAgb3AgPSBleHAtPlhfb3AgPSBPX2JpZzsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gZ2VuY250OwotICAgIH0KLQotICBpZiAob3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICByZWdpc3RlciB2YWx1ZVQgZ2V0OwotICAgICAgcmVnaXN0ZXIgdmFsdWVUIHVzZTsKLSAgICAgIHJlZ2lzdGVyIHZhbHVlVCBtYXNrOwotICAgICAgdmFsdWVUIGhpYml0OwotICAgICAgcmVnaXN0ZXIgdmFsdWVUIHVubWFzazsKLQotICAgICAgLyogSkYgPDwgb2YgPj0gbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9iamVjdCBpcyB1bmRlZmluZWQuICBJbgotCSBwYXJ0aWN1bGFyIFNQQVJDIChTdW4gNCkgaGFzIHByb2JsZW1zICovCi0gICAgICBpZiAobmJ5dGVzID49IHNpemVvZiAodmFsdWVUKSkKLQl7Ci0JICBtYXNrID0gMDsKLQkgIGlmIChuYnl0ZXMgPiBzaXplb2YgKHZhbHVlVCkpCi0JICAgIGhpYml0ID0gMDsKLQkgIGVsc2UKLQkgICAgaGliaXQgPSAodmFsdWVUKSAxIDw8IChuYnl0ZXMgKiBCSVRTX1BFUl9DSEFSIC0gMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvbid0IHN0b3JlIHRoZXNlIGJpdHMuICovCi0JICBtYXNrID0gfih2YWx1ZVQpIDAgPDwgKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpOwotCSAgaGliaXQgPSAodmFsdWVUKSAxIDw8IChuYnl0ZXMgKiBCSVRTX1BFUl9DSEFSIC0gMSk7Ci0JfQotCi0gICAgICB1bm1hc2sgPSB+bWFzazsJCS8qIERvIHN0b3JlIHRoZXNlIGJpdHMuICovCi0KLSNpZmRlZiBORVZFUgotICAgICAgIkRvIHRoaXMgbW9kIGlmIHlvdSB3YW50IGV2ZXJ5IG92ZXJmbG93IGNoZWNrIHRvIGFzc3VtZSBTSUdORUQgMidzIGNvbXBsZW1lbnQgZGF0YS4iOwotICAgICAgbWFzayA9IH4odW5tYXNrID4+IDEpOwkvKiBJbmNsdWRlcyBzaWduIGJpdCBub3cuICovCi0jZW5kaWYKLQotICAgICAgZ2V0ID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICB1c2UgPSBnZXQgJiB1bm1hc2s7Ci0gICAgICBpZiAoKGdldCAmIG1hc2spICE9IDAKLQkgICYmICgoZ2V0ICYgbWFzaykgIT0gbWFzawotCSAgICAgIHx8IChnZXQgJiBoaWJpdCkgPT0gMCkpCi0JewkJLyogTGVhZGluZyBiaXRzIGNvbnRhaW4gYm90aCAwcyAmIDFzLiAqLwotCSAgYXNfd2FybiAoXygiVmFsdWUgMHglbHggdHJ1bmNhdGVkIHRvIDB4JWx4LiIpLAotCQkgICAodW5zaWduZWQgbG9uZykgZ2V0LCAodW5zaWduZWQgbG9uZykgdXNlKTsKLQl9Ci0gICAgICAvKiBwdXQgYnl0ZXMgaW4gcmlnaHQgb3JkZXIuICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHVzZSwgKGludCkgbmJ5dGVzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICAgTElUVExFTlVNX1RZUEUgKm51bXM7Ci0KLSAgICAgIGtub3cgKG5ieXRlcyAlIENIQVJTX1BFUl9MSVRUTEVOVU0gPT0gMCk7Ci0KLSAgICAgIHNpemUgPSBleHAtPlhfYWRkX251bWJlciAqIENIQVJTX1BFUl9MSVRUTEVOVU07Ci0gICAgICBpZiAobmJ5dGVzIDwgc2l6ZSkKLQl7Ci0JICBhc193YXJuIChfKCJCaWdudW0gdHJ1bmNhdGVkIHRvICVkIGJ5dGVzIiksIG5ieXRlcyk7Ci0JICBzaXplID0gbmJ5dGVzOwotCX0KLQotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCXsKLQkgIHdoaWxlIChuYnl0ZXMgPiBzaXplKQotCSAgICB7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBleHRyYV9kaWdpdCwgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7Ci0JICAgICAgbmJ5dGVzIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgcCArPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICB9Ci0KLQkgIG51bXMgPSBnZW5lcmljX2JpZ251bSArIHNpemUgLyBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgd2hpbGUgKHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgLS1udW1zOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgKm51bXMsIENIQVJTX1BFUl9MSVRUTEVOVU0pOwotCSAgICAgIHNpemUgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbnVtcyA9IGdlbmVyaWNfYmlnbnVtOwotCSAgd2hpbGUgKHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAqbnVtcywgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7Ci0JICAgICAgKytudW1zOwotCSAgICAgIHNpemUgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgbmJ5dGVzIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgIH0KLQotCSAgd2hpbGUgKG5ieXRlcyA+IDApCi0JICAgIHsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIGV4dHJhX2RpZ2l0LCBDSEFSU19QRVJfTElUVExFTlVNKTsKLQkgICAgICBuYnl0ZXMgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWVtc2V0IChwLCAwLCBuYnl0ZXMpOwotCi0gICAgICAvKiBOb3cgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeFMgdG8gcmVjb3JkIHRoZSBzeW1ib2wgdmFsdWUuCi0JIFRoaXMgaXMgZWFzeSBmb3IgQkZELiAgRm9yIG90aGVyIHRhcmdldHMgaXQgY2FuIGJlIG1vcmUKLQkgY29tcGxleC4gIEZvciB2ZXJ5IGNvbXBsZXggY2FzZXMgKGN1cnJlbnRseSwgdGhlIEhQUEEgYW5kCi0JIE5TMzJLKSwgeW91IGNhbiBkZWZpbmUgVENfQ09OU19GSVhfTkVXIHRvIGRvIHdoYXRldmVyIHlvdQotCSB3YW50LiAgRm9yIHNpbXBsZXIgY2FzZXMsIHlvdSBjYW4gZGVmaW5lIFRDX0NPTlNfUkVMT0MgdG8gYmUKLQkgdGhlIG5hbWUgb2YgdGhlIHJlbG9jIGNvZGUgdGhhdCBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBmaXhTLgotCSBJZiBuZWl0aGVyIGlzIGRlZmluZWQsIHRoZSBjb2RlIHVzZXMgTk9fUkVMT0MgaWYgaXQgaXMKLQkgZGVmaW5lZCwgYW5kIG90aGVyd2lzZSB1c2VzIDAuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIFRDX0NPTlNfRklYX05FVwotICAgICAgVENfQ09OU19GSVhfTkVXIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBuYnl0ZXMsIGV4cCk7Ci0jZWxzZQotICAgICAgewotCWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotCi0Jc3dpdGNoIChuYnl0ZXMpCi0JICB7Ci0JICBjYXNlIDE6Ci0JICAgIHIgPSBCRkRfUkVMT0NfODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHIgPSBCRkRfUkVMT0NfMTY7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICByID0gQkZEX1JFTE9DXzMyOwotCSAgICBicmVhazsKLQkgIGNhc2UgODoKLQkgICAgciA9IEJGRF9SRUxPQ182NDsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBhc19iYWQgKF8oInVuc3VwcG9ydGVkIEJGRCByZWxvY2F0aW9uIHNpemUgJXUiKSwgbmJ5dGVzKTsKLQkgICAgciA9IEJGRF9SRUxPQ18zMjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIChpbnQpIG5ieXRlcywgZXhwLAotCQkgICAgIDAsIHIpOwotICAgICAgfQotI2VuZGlmCi0jZWxzZQotI2lmZGVmIFRDX0NPTlNfRklYX05FVwotICAgICAgVENfQ09OU19GSVhfTkVXIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBuYnl0ZXMsIGV4cCk7Ci0jZWxzZQotICAgICAgLyogRmlndXJlIG91dCB3aGljaCByZWxvYyBudW1iZXIgdG8gdXNlLiAgVXNlIFRDX0NPTlNfUkVMT0MgaWYKLQkgaXQgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIHVzZSBOT19SRUxPQyBpZiBpdCBpcyBkZWZpbmVkLAotCSBvdGhlcndpc2UgdXNlIDAuICAqLwotI2lmbmRlZiBUQ19DT05TX1JFTE9DCi0jaWZkZWYgTk9fUkVMT0MKLSNkZWZpbmUgVENfQ09OU19SRUxPQyBOT19SRUxPQwotI2Vsc2UKLSNkZWZpbmUgVENfQ09OU19SRUxPQyAwCi0jZW5kaWYKLSNlbmRpZgotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIChpbnQpIG5ieXRlcywgZXhwLCAwLAotCQkgICBUQ19DT05TX1JFTE9DKTsKLSNlbmRpZiAvKiBUQ19DT05TX0ZJWF9ORVcgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0gICAgfQotfQotDAotI2lmZGVmIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMKLQotLyogaTk2MCBhc3NlbWJsZXJzLCAoZWcsIGFzbTk2MCksIGFsbG93IGJpdGZpZWxkcyBhZnRlciAiLmJ5dGUiIGFzCi0gICB3OngseTp6LCB3aGVyZSB3IGFuZCB5IGFyZSBiaXR3aWR0aHMgYW5kIHggYW5kIHkgYXJlIHZhbHVlcy4gIFRoZXkKLSAgIHRoZW4gcGFjayB0aGVtIGFsbCB0b2dldGhlci4gV2UgZG8gYSBsaXR0bGUgYmV0dGVyIGluIHRoYXQgd2UgYWxsb3cKLSAgIHRoZW0gaW4gd29yZHMsIGxvbmdzLCBldGMuIGFuZCB3ZSdsbCBwYWNrIHRoZW0gaW4gdGFyZ2V0IGJ5dGUgb3JkZXIKLSAgIGZvciB5b3UuCi0KLSAgIFRoZSBydWxlcyBhcmU6IHBhY2sgbGVhc3Qgc2lnbmlmaWNhdCBiaXQgZmlyc3QsIGlmIGEgZmllbGQgZG9lc24ndAotICAgZW50aXJlbHkgZml0LCBwdXQgaXQgaW4gdGhlIG5leHQgdW5pdC4gIE92ZXJmbG93aW5nIHRoZSBiaXRmaWVsZCBpcwotICAgZXhwbGljaXRseSAqbm90KiBldmVuIGEgd2FybmluZy4gIFRoZSBiaXR3aWR0aCBzaG91bGQgYmUgY29uc2lkZXJlZAotICAgYSAibWFzayIuCi0KLSAgIFRvIHVzZSB0aGlzIGZ1bmN0aW9uIHRoZSB0Yy1YWFguaCBmaWxlIHNob3VsZCBkZWZpbmUKLSAgIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMuICAqLwotCi1zdGF0aWMgdm9pZCAKLXBhcnNlX2JpdGZpZWxkX2NvbnMgKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotewotICB1bnNpZ25lZCBpbnQgYml0c19hdmFpbGFibGUgPSBCSVRTX1BFUl9DSEFSICogbmJ5dGVzOwotICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICh2b2lkKSBleHByZXNzaW9uIChleHApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc6JykKLSAgICB7CQkJLyogYml0ZmllbGRzICovCi0gICAgICBsb25nIHZhbHVlID0gMDsKLQotICAgICAgZm9yICg7OykKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHdpZHRoOwotCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOicpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIGJyZWFrOwotCSAgICB9CQkJLyogbmV4dCBwaWVjZSBpcyBub3QgYSBiaXRmaWVsZCAqLwotCi0JICAvKiBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB3ZSBjYW4ndCBhbGxvdwotCSAgICAgZnVsbCBleHByZXNzaW9ucyB3aXRoIHN5bWJvbAotCSAgICAgZGlmZmVyZW5jZXMgYW5kIHN1Y2guICBUaGUgcmVsb2NhdGlvbgotCSAgICAgZW50cmllcyBmb3Igc3ltYm9scyBub3QgZGVmaW5lZCBpbiB0aGlzCi0JICAgICBhc3NlbWJseSB3b3VsZCByZXF1aXJlIGFyYml0cmFyeSBmaWVsZAotCSAgICAgd2lkdGhzLCBwb3NpdGlvbnMsIGFuZCBtYXNrcyB3aGljaCBtb3N0Ci0JICAgICBvZiBvdXIgY3VycmVudCBvYmplY3QgZm9ybWF0cyBkb24ndAotCSAgICAgc3VwcG9ydC4KLQotCSAgICAgSW4gdGhlIHNwZWNpZmljIGNhc2Ugd2hlcmUgYSBzeW1ib2wKLQkgICAgICppcyogZGVmaW5lZCBpbiB0aGlzIGFzc2VtYmx5LCB3ZQotCSAgICAgKmNvdWxkKiBidWlsZCBmaXh1cHMgYW5kIHRyYWNrIGl0LCBidXQKLQkgICAgIHRoaXMgY291bGQgbGVhZCB0byBjb25mdXNpb24gZm9yIHRoZQotCSAgICAgYmFja2VuZHMuICBJJ20gbGF6eS4gSSdsbCB0YWtlIGFueQotCSAgICAgU0VHX0FCU09MVVRFLiBJIHRoaW5rIHRoYXQgbWVhbnMgdGhhdAotCSAgICAgeW91IGNhbiB1c2UgYSBwcmV2aW91cyAuc2V0IG9yCi0JICAgICAuZXF1IHR5cGUgc3ltYm9sLiAgeG94b3JpY2guICovCi0KLQkgIGlmIChleHAtPlhfb3AgPT0gT19hYnNlbnQpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJ1c2luZyBhIGJpdCBmaWVsZCB3aWR0aCBvZiB6ZXJvIikpOwotCSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICB9CQkJLyogaW1wbGllZCB6ZXJvIHdpZHRoIGJpdGZpZWxkICovCi0KLQkgIGlmIChleHAtPlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCSAgICAgIGFzX2JhZCAoXygiZmllbGQgd2lkdGggXCIlc1wiIHRvbyBjb21wbGV4IGZvciBhIGJpdGZpZWxkIiksIGhvbGQpOwotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnOic7Ci0JICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0JCQkvKiB0b28gY29tcGxleCAqLwotCi0JICBpZiAoKHdpZHRoID0gZXhwLT5YX2FkZF9udW1iZXIpID4gKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZmllbGQgd2lkdGggJWx1IHRvbyBiaWcgdG8gZml0IGluICVkIGJ5dGVzOiB0cnVuY2F0ZWQgdG8gJWQgYml0cyIpLAotCQkgICAgICAgd2lkdGgsIG5ieXRlcywgKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpKTsKLQkgICAgICB3aWR0aCA9IEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXM7Ci0JICAgIH0JCQkvKiB0b28gYmlnICovCi0KLQkgIGlmICh3aWR0aCA+IGJpdHNfYXZhaWxhYmxlKQotCSAgICB7Ci0JICAgICAgLyogRklYTUUtU09NRURBWTogYmFja2luZyB1cCBhbmQgcmVwYXJzaW5nIGlzIHdhc3RlZnVsLiAgKi8KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gdmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JCQkvKiB3b24ndCBmaXQgKi8KLQotCSAgaG9sZCA9ICsraW5wdXRfbGluZV9wb2ludGVyOyAvKiBza2lwICc6JyAqLwotCi0JICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwKTsKLQkgIGlmIChleHAtPlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGNoYXIgY2FjaGUgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0JICAgICAgYXNfYmFkIChfKCJmaWVsZCB2YWx1ZSBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiKSwgaG9sZCk7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGNhY2hlOwotCSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9CQkJLyogdG9vIGNvbXBsZXggKi8KLQotCSAgdmFsdWUgfD0gKCh+KC0xIDw8IHdpZHRoKSAmIGV4cC0+WF9hZGRfbnVtYmVyKQotCQkgICAgPDwgKChCSVRTX1BFUl9DSEFSICogbmJ5dGVzKSAtIGJpdHNfYXZhaWxhYmxlKSk7Ci0KLQkgIGlmICgoYml0c19hdmFpbGFibGUgLT0gd2lkdGgpID09IDAKLQkgICAgICB8fCBpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpCi0JICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIGFsbCB0aGUgYml0ZmllbGRzIHdlJ3JlIGdvbm5hIGdldCAqLwotCi0JICBob2xkID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwKTsKLQl9CQkJLyogZm9yZXZlciBsb29wICovCi0KLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gdmFsdWU7Ci0gICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLT5YX3Vuc2lnbmVkID0gMTsKLSAgICB9CQkJCS8qIGlmIGxvb2tzIGxpa2UgYSBiaXRmaWVsZCAqLwotfQkJCQkvKiBwYXJzZV9iaXRmaWVsZF9jb25zKCkgKi8KLQotI2VuZGlmIC8qIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMgKi8KLQwKLS8qIEhhbmRsZSBhbiBNUkkgc3R5bGUgc3RyaW5nIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnMgKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnCi0gICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycKLQkgIHx8ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdBJwotCSAgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ0UnKSkpCi0gICAgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OIChleHAsIG5ieXRlcyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2NhbjsKLSAgICAgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOwotCi0gICAgICAvKiBBbiBNUkkgc3R5bGUgc3RyaW5nLiAgQ3V0IGludG8gYXMgbWFueSBieXRlcyBhcyB3aWxsIGZpdCBpbnRvCi0JIGEgbmJ5dGUgY2h1bmssIGxlZnQganVzdGlmeSBpZiBuZWNlc3NhcnksIGFuZCBzZXBhcmF0ZSB3aXRoCi0JIGNvbW1hcyBzbyB3ZSBjYW4gdHJ5IGFnYWluIGxhdGVyLiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdBJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0UnKQotCXsKLQkgIGFzX2JhZCAoXygiRUJDRElDIGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmb3IgKHNjYW4gPSAwOyBzY2FuIDwgbmJ5dGVzOyBzY2FuKyspCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkgICAgewotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wnJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQl9Ci0JICAgICAgZWxzZQotCQlicmVhazsKLQkgICAgfQotCSAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8ICgqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCX0KLQotICAgICAgLyogTGVmdCBqdXN0aWZ5ICovCi0gICAgICB3aGlsZSAoc2NhbiA8IG5ieXRlcykKLQl7Ci0JICByZXN1bHQgPDw9IDg7Ci0JICBzY2FuKys7Ci0JfQotICAgICAgLyogQ3JlYXRlIGNvcnJlY3QgZXhwcmVzc2lvbiAqLwotICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gcmVzdWx0OwotICAgICAgLyogRmFrZSBpdCBzbyB0aGF0IHdlIGNhbiByZWFkIHRoZSBuZXh0IGNoYXIgdG9vICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdICE9ICdcJycgfHwKLQkgIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJ1wnJyAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wnJykpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyIC09IDI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXJbMF0gPSAnLCc7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPSAnXCcnOwotCX0KLSAgICAgIGVsc2UKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0MCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLQotLyogUGFyc2UgYSByZXBlYXQgZXhwcmVzc2lvbiBmb3IgY29ucy4gIFRoaXMgaXMgdXNlZCBieSB0aGUgTUlQUwotICAgYXNzZW1ibGVyLiAgVGhlIGZvcm1hdCBpcyBOVU1CRVI6Q09VTlQ7IE5VTUJFUiBhcHBlYXJzIGluIHRoZQotICAgb2JqZWN0IGZpbGUgQ09VTlQgdGltZXMuCi0KLSAgIFRvIHVzZSB0aGlzIGZvciBhIHRhcmdldCwgZGVmaW5lIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX3JlcGVhdF9jb25zIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgZXhwcmVzc2lvblMgY291bnQ7Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGV4cHJlc3Npb24gKGV4cCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzonKQotICAgIHsKLSAgICAgIC8qIE5vIHJlcGVhdCBjb3VudC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBleHByZXNzaW9uICgmY291bnQpOwotICBpZiAoY291bnQuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBjb3VudC5YX2FkZF9udW1iZXIgPD0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJVbnJlc29sdmFibGUgb3Igbm9ucG9zaXRpdmUgcmVwZWF0IGNvdW50OyB1c2luZyAxIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgY29ucyBmdW5jdGlvbiBpcyBnb2luZyB0byBvdXRwdXQgdGhpcyBleHByZXNzaW9uIG9uY2UuICBTbyB3ZQotICAgICBvdXRwdXQgaXQgY291bnQgLSAxIHRpbWVzLiAgKi8KLSAgZm9yIChpID0gY291bnQuWF9hZGRfbnVtYmVyIC0gMTsgaSA+IDA7IGktLSkKLSAgICBlbWl0X2V4cHIgKGV4cCwgbmJ5dGVzKTsKLX0KLQotI2VuZGlmIC8qIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TICovCi0MCi0vKiBQYXJzZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlciByZXByZXNlbnRlZCBhcyBhIGhleCBjb25zdGFudC4gIFRoaXMKLSAgIHBlcm1pdHMgdXNlcnMgdG8gc3BlY2lmeSB0aGUgZXhhY3QgYml0cyB0aGV5IHdhbnQgaW4gdGhlIGZsb2F0aW5nCi0gICBwb2ludCBudW1iZXIuICAqLwotCi1zdGF0aWMgaW50Ci1oZXhfZmxvYXQgKGZsb2F0X3R5cGUsIGJ5dGVzKQotICAgICBpbnQgZmxvYXRfdHlwZTsKLSAgICAgY2hhciAqYnl0ZXM7Ci17Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAoZmxvYXRfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBsZW5ndGggPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIGxlbmd0aCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgbGVuZ3RoID0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgbGVuZ3RoID0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gZmxvYXRpbmcgdHlwZSB0eXBlICclYyciKSwgZmxvYXRfdHlwZSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgZ28gdGhyb3VnaCBleHByZXNzaW9uIHRvIHBhcnNlIHRoZQotICAgICBoZXggY29uc3RhbnQsIGJ1dCBpZiB3ZSBnZXQgYSBiaWdudW0gaXQncyBhIHBhaW4gdG8gc29ydCBpdCBpbnRvCi0gICAgIHRoZSBidWZmZXIgY29ycmVjdGx5LiAgKi8KLSAgaSA9IDA7Ci0gIHdoaWxlIChoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXycpCi0gICAgewotICAgICAgaW50IGQ7Ci0KLSAgICAgIC8qIFRoZSBNUkkgYXNzZW1ibGVyIGFjY2VwdHMgYXJiaXRyYXJ5IHVuZGVyc2NvcmVzIHN0cmV3biBhYm91dAotCSB0aHJvdWdoIHRoZSBoZXggY29uc3RhbnQsIHNvIHdlIGlnbm9yZSB0aGVtIGFzIHdlbGwuICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXycpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChpID49IGxlbmd0aCkKLQl7Ci0JICBhc193YXJuIChfKCJGbG9hdGluZyBwb2ludCBjb25zdGFudCB0b28gbGFyZ2UiKSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgZCA9IGhleF92YWx1ZSAoKmlucHV0X2xpbmVfcG9pbnRlcikgPDwgNDsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ18nKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaWYgKGhleF9wICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICBkICs9IGhleF92YWx1ZSAoKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYnl0ZXNbaV0gPSBkOwotICAgICAgZWxzZQotCWJ5dGVzW2xlbmd0aCAtIGkgLSAxXSA9IGQ7Ci0gICAgICArK2k7Ci0gICAgfQotCi0gIGlmIChpIDwgbGVuZ3RoKQotICAgIHsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQltZW1zZXQgKGJ5dGVzICsgaSwgMCwgbGVuZ3RoIC0gaSk7Ci0gICAgICBlbHNlCi0JbWVtc2V0IChieXRlcywgMCwgbGVuZ3RoIC0gaSk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLS8qCi0gKgkJCWZsb2F0X2NvbnMoKQotICoKLSAqIENPTlN0cnVjdCBzb21lIG1vcmUgZnJhZyBjaGFycyBvZiAuZmxvYXRzIC5mZmxvYXRzIGV0Yy4KLSAqIE1ha2VzIDAgb3IgbW9yZSBuZXcgZnJhZ3MuCi0gKiBJZiBuZWVkX3Bhc3NfMiA9PSAxLCBubyBmcmFncyBhcmUgZW1pdHRlZC4KLSAqIFRoaXMgdW5kZXJzdGFuZHMgb25seSBmbG9hdGluZyBsaXRlcmFscywgbm90IGV4cHJlc3Npb25zLiBTb3JyeS4KLSAqCi0gKiBBIGZsb2F0aW5nIGNvbnN0YW50IGlzIGRlZmluZWQgYnkgYXRvZl9nZW5lcmljKCksIGV4Y2VwdCBpdCBpcyBwcmVjZWRlZAotICogYnkgMGQgMGYgMGcgb3IgMGguIEFmdGVyIG9ic2VydmluZyB0aGUgU1RSQU5HRSB3YXkgbXkgQlNEIEFTIGRvZXMgaXRzCi0gKiByZWFkaW5nLCBJIGRlY2lkZWQgdG8gYmUgaW5jb21wYXRpYmxlLiBUaGlzIGFsd2F5cyB0cmllcyB0byBnaXZlIHlvdQotICogcm91bmRlZCBiaXRzIHRvIHRoZSBwcmVjaXNpb24gb2YgdGhlIHBzZXVkby1vcC4gRm9ybWVyIEFTIGRpZCBwcmVtYXR1cmUKLSAqIHRydW5jYXRhdGlvbiwgcmVzdG9yZWQgbm9pc3kgYml0cyBpbnN0ZWFkIG9mIHRyYWlsaW5nIDBzIEFORCBnYXZlIHlvdQotICogYSBjaG9pY2Ugb2YgMiBmbGF2b3VycyBvZiBub2lzZSBhY2NvcmRpbmcgdG8gd2hpY2ggb2YgMiBmbG9hdGluZy1wb2ludAotICogc2Nhbm5lcnMgeW91IGRpcmVjdGVkIEFTIHRvIHVzZS4KLSAqCi0gKiBJbjoJaW5wdXRfbGluZV9wb2ludGVyLT53aGl0ZXNwYWNlIGJlZm9yZSwgb3IgJzAnIG9mIGZsb251bS4KLSAqCi0gKi8KLQotdm9pZAotZmxvYXRfY29ucyAoZmxvYXRfdHlwZSkKLSAgICAgLyogQ2xvYmJlcnMgaW5wdXRfbGluZS1wb2ludGVyLCBjaGVja3MgZW5kLW9mLWxpbmUuICovCi0gICAgIHJlZ2lzdGVyIGludCBmbG9hdF90eXBlOwkvKiAnZic6LmZmbG9hdCAuLi4gJ0YnOi5mbG9hdCAuLi4gKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgaW50IGxlbmd0aDsJCQkvKiBOdW1iZXIgb2YgY2hhcnMgaW4gYW4gb2JqZWN0LiAqLwotICByZWdpc3RlciBjaGFyICplcnI7CQkvKiBFcnJvciBmcm9tIHNjYW5uaW5nIGZsb2F0aW5nIGxpdGVyYWwuICovCi0gIGNoYXIgdGVtcFtNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVRdOwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBkbwotICAgIHsKLSAgICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+MXN0IGNoYXIgb2YgYSBmbG9udW0gKHdlIGhvcGUhKS4gKi8KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgLyogU2tpcCBhbnkgMHtsZXR0ZXJ9IHRoYXQgbWF5IGJlIHByZXNlbnQuIERvbid0IGV2ZW4gY2hlY2sgaWYgdGhlCi0gICAgICAgKiBsZXR0ZXIgaXMgbGVnYWwuIFNvbWVvbmUgbWF5IGludmVudCBhICJ6IiBmb3JtYXQgYW5kIHRoaXMgcm91dGluZQotICAgICAgICogaGFzIG5vIHVzZSBmb3Igc3VjaCBpbmZvcm1hdGlvbi4gTHVzZXJzIGJld2FyZTogeW91IGdldAotICAgICAgICogZGlhZ25vc3RpY3MgaWYgeW91ciBpbnB1dCBpcyBpbGwtY29uZGl0aW9uZWQuCi0gICAgICAgKi8KLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnCi0JICAmJiBpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICAgICAgLyogQWNjZXB0IDp4eHh4LCB3aGVyZSB0aGUgeCdzIGFyZSBoZXggZGlnaXRzLCBmb3IgYSBmbG9hdGluZwotICAgICAgICAgcG9pbnQgd2l0aCB0aGUgZXhhY3QgZGlnaXRzIHNwZWNpZmllZC4gICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICc6JykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGxlbmd0aCA9IGhleF9mbG9hdCAoZmxvYXRfdHlwZSwgdGVtcCk7Ci0JICBpZiAobGVuZ3RoIDwgMCkKLQkgICAgewotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVyciA9IG1kX2F0b2YgKGZsb2F0X3R5cGUsIHRlbXAsICZsZW5ndGgpOwotCSAga25vdyAobGVuZ3RoIDw9IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCk7Ci0JICBrbm93IChsZW5ndGggPiAwKTsKLQkgIGlmIChlcnIpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkJhZCBmbG9hdGluZyBsaXRlcmFsOiAlcyIpLCBlcnIpOwotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoIW5lZWRfcGFzc18yKQotCXsKLQkgIGludCBjb3VudDsKLQotCSAgY291bnQgPSAxOwotCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc6JykKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25TIGNvdW50X2V4cDsKLQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGV4cHJlc3Npb24gKCZjb3VudF9leHApOwotCSAgICAgIGlmIChjb3VudF9leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCSAgfHwgY291bnRfZXhwLlhfYWRkX251bWJlciA8PSAwKQotCQl7Ci0JCSAgYXNfd2FybiAoXygidW5yZXNvbHZhYmxlIG9yIG5vbnBvc2l0aXZlIHJlcGVhdCBjb3VudDsgdXNpbmcgMSIpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJY291bnQgPSBjb3VudF9leHAuWF9hZGRfbnVtYmVyOwotCSAgICB9Ci0jZW5kaWYKLQotCSAgd2hpbGUgKC0tY291bnQgPj0gMCkKLQkgICAgewotCSAgICAgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCk7Ci0JICAgICAgbWVtY3B5IChwLCB0ZW1wLCAodW5zaWduZWQgaW50KSBsZW5ndGgpOwotCSAgICB9Ci0JfQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIC0taW5wdXRfbGluZV9wb2ludGVyOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIGZsb2F0X2NvbnMoKSAqLwotDAotLyogUmV0dXJuIHRoZSBzaXplIG9mIGEgTEVCMTI4IHZhbHVlICovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1zaXplb2Zfc2xlYjEyOCAodmFsdWUpCi0gICAgIG9mZnNldFQgdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGludCBzaXplID0gMDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgYnl0ZTsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKLSAgICAgIC8qIFNhZGx5LCB3ZSBjYW5ub3QgcmVseSBvbiB0eXBpY2FsIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgYmVoYXZpb3VyLgotCSBGb3J0dW5hdGVseSwgd2UgY2FuIHN0cnVjdHVyZSB0aGluZ3Mgc28gdGhhdCB0aGUgZXh0cmEgd29yayByZWR1Y2VzCi0JIHRvIGEgbm9vcCBvbiBzeXN0ZW1zIHRoYXQgZG8gdGhpbmdzICJwcm9wZXJseSIuICAqLwotICAgICAgdmFsdWUgPSAodmFsdWUgPj4gNykgfCB+KC0ob2Zmc2V0VCkxID4+IDcpOwotICAgICAgc2l6ZSArPSAxOwotICAgIH0KLSAgd2hpbGUgKCEoKCh2YWx1ZSA9PSAwKSAmJiAoKGJ5dGUgJiAweDQwKSA9PSAwKSkKLQkgICB8fCAoKHZhbHVlID09IC0xKSAmJiAoKGJ5dGUgJiAweDQwKSAhPSAwKSkpKTsKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXNpemVvZl91bGViMTI4ICh2YWx1ZSkKLSAgICAgdmFsdWVUIHZhbHVlOwotewotICByZWdpc3RlciBpbnQgc2l6ZSA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0gICAgICB2YWx1ZSA+Pj0gNzsKLSAgICAgIHNpemUgKz0gMTsKLSAgICB9Ci0gIHdoaWxlICh2YWx1ZSAhPSAwKTsKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotaW50Ci1zaXplb2ZfbGViMTI4ICh2YWx1ZSwgc2lnbikKLSAgICAgdmFsdWVUIHZhbHVlOwotICAgICBpbnQgc2lnbjsKLXsKLSAgaWYgKHNpZ24pCi0gICAgcmV0dXJuIHNpemVvZl9zbGViMTI4ICgob2Zmc2V0VCkgdmFsdWUpOwotICBlbHNlCi0gICAgcmV0dXJuIHNpemVvZl91bGViMTI4ICh2YWx1ZSk7Ci19Ci0KLS8qIE91dHB1dCBhIExFQjEyOCB2YWx1ZS4gICovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdXRwdXRfc2xlYjEyOCAocCwgdmFsdWUpCi0gICAgIGNoYXIgKnA7Ci0gICAgIG9mZnNldFQgdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm9yaWcgPSBwOwotICByZWdpc3RlciBpbnQgbW9yZTsKLQotICBkbwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKLQotICAgICAgLyogU2FkbHksIHdlIGNhbm5vdCByZWx5IG9uIHR5cGljYWwgYXJpdGhtZXRpYyByaWdodCBzaGlmdCBiZWhhdmlvdXIuCi0JIEZvcnR1bmF0ZWx5LCB3ZSBjYW4gc3RydWN0dXJlIHRoaW5ncyBzbyB0aGF0IHRoZSBleHRyYSB3b3JrIHJlZHVjZXMKLQkgdG8gYSBub29wIG9uIHN5c3RlbXMgdGhhdCBkbyB0aGluZ3MgInByb3Blcmx5Ii4gICovCi0gICAgICB2YWx1ZSA9ICh2YWx1ZSA+PiA3KSB8IH4oLShvZmZzZXRUKTEgPj4gNyk7Ci0KLSAgICAgIG1vcmUgPSAhKCgoKHZhbHVlID09IDApICYmICgoYnl0ZSAmIDB4NDApID09IDApKQotCQl8fCAoKHZhbHVlID09IC0xKSAmJiAoKGJ5dGUgJiAweDQwKSAhPSAwKSkpKTsKLSAgICAgIGlmIChtb3JlKQotCWJ5dGUgfD0gMHg4MDsKLQotICAgICAgKnArKyA9IGJ5dGU7Ci0gICAgfQotICB3aGlsZSAobW9yZSk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X3VsZWIxMjggKHAsIHZhbHVlKQotICAgICBjaGFyICpwOwotICAgICB2YWx1ZVQgdmFsdWU7Ci17Ci0gIGNoYXIgKm9yaWcgPSBwOwotCi0gIGRvCi0gICAgewotICAgICAgdW5zaWduZWQgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOwotICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICBpZiAodmFsdWUgIT0gMCkKLQkvKiBNb3JlIGJ5dGVzIHRvIGZvbGxvdy4gICovCi0JYnl0ZSB8PSAweDgwOwotCi0gICAgICAqcCsrID0gYnl0ZTsKLSAgICB9Ci0gIHdoaWxlICh2YWx1ZSAhPSAwKTsKLQotICByZXR1cm4gcCAtIG9yaWc7Ci19Ci0KLWludAotb3V0cHV0X2xlYjEyOCAocCwgdmFsdWUsIHNpZ24pCi0gICAgIGNoYXIgKnA7Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IHNpZ247Ci17Ci0gIGlmIChzaWduKQotICAgIHJldHVybiBvdXRwdXRfc2xlYjEyOCAocCwgKG9mZnNldFQpIHZhbHVlKTsKLSAgZWxzZQotICAgIHJldHVybiBvdXRwdXRfdWxlYjEyOCAocCwgdmFsdWUpOwotfQotCi0vKiBEbyB0aGUgc2FtZSBmb3IgYmlnbnVtcy4gIFdlIGNvbWJpbmUgc2l6ZW9mIHdpdGggb3V0cHV0IGhlcmUgaW4gdGhhdAotICAgd2UgZG9uJ3Qgb3V0cHV0IGZvciBOVUxMIHZhbHVlcyBvZiBQLiAgSXQgaXNuJ3QgcmVhbGx5IGFzIGNyaXRpY2FsIGFzCi0gICBmb3IgIm5vcm1hbCIgdmFsdWVzIHRoYXQgdGhpcyBiZSBzdHJlYW1saW5lZC4gICovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdXRwdXRfYmlnX3NsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgTElUVExFTlVNX1RZUEUgKmJpZ251bTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNoYXIgKm9yaWcgPSBwOwotICB2YWx1ZVQgdmFsID0gMDsKLSAgaW50IGxvYWRlZCA9IDA7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgLyogU3RyaXAgbGVhZGluZyBzaWduIGV4dGVuc2lvbnMgb2ZmIHRoZSBiaWdudW0uICAqLwotICB3aGlsZSAoc2l6ZSA+IDAgJiYgYmlnbnVtW3NpemUtMV0gPT0gKExJVFRMRU5VTV9UWVBFKS0xKQotICAgIHNpemUtLTsKLQotICBkbwotICAgIHsKLSAgICAgIGlmIChsb2FkZWQgPCA3ICYmIHNpemUgPiAwKQotCXsKLQkgIHZhbCB8PSAoKmJpZ251bSA8PCBsb2FkZWQpOwotCSAgbG9hZGVkICs9IDggKiBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgc2l6ZS0tOwotCSAgYmlnbnVtKys7Ci0JfQotCi0gICAgICBieXRlID0gdmFsICYgMHg3ZjsKLSAgICAgIGxvYWRlZCAtPSA3OwotICAgICAgdmFsID4+PSA3OwotCi0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXsKLQkgIGlmICgodmFsID09IDAgJiYgKGJ5dGUgJiAweDQwKSA9PSAwKQotCSAgICAgIHx8ICh+KHZhbCB8IH4oKCh2YWx1ZVQpMSA8PCBsb2FkZWQpIC0gMSkpID09IDAKLQkJICAmJiAoYnl0ZSAmIDB4NDApICE9IDApKQotCSAgICBieXRlIHw9IDB4ODA7Ci0JfQotCi0gICAgICBpZiAob3JpZykKLQkqcCA9IGJ5dGU7Ci0gICAgICBwKys7Ci0gICAgfQotICB3aGlsZSAoYnl0ZSAmIDB4ODApOwotCi0gIHJldHVybiBwIC0gb3JpZzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW91dHB1dF9iaWdfdWxlYjEyOCAocCwgYmlnbnVtLCBzaXplKQotICAgICBjaGFyICpwOwotICAgICBMSVRUTEVOVU1fVFlQRSAqYmlnbnVtOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgY2hhciAqb3JpZyA9IHA7Ci0gIHZhbHVlVCB2YWwgPSAwOwotICBpbnQgbG9hZGVkID0gMDsKLSAgdW5zaWduZWQgYnl0ZTsKLQotICAvKiBTdHJpcCBsZWFkaW5nIHplcm9zIG9mZiB0aGUgYmlnbnVtLiAgKi8KLSAgLyogWFhYOiBJcyB0aGlzIG5lZWRlZD8gICovCi0gIHdoaWxlIChzaXplID4gMCAmJiBiaWdudW1bc2l6ZS0xXSA9PSAwKQotICAgIHNpemUtLTsKLQotICBkbwotICAgIHsKLSAgICAgIGlmIChsb2FkZWQgPCA3ICYmIHNpemUgPiAwKQotCXsKLQkgIHZhbCB8PSAoKmJpZ251bSA8PCBsb2FkZWQpOwotCSAgbG9hZGVkICs9IDggKiBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgc2l6ZS0tOwotCSAgYmlnbnVtKys7Ci0JfQotCi0gICAgICBieXRlID0gdmFsICYgMHg3ZjsKLSAgICAgIGxvYWRlZCAtPSA3OwotICAgICAgdmFsID4+PSA3OwotCi0gICAgICBpZiAoc2l6ZSA+IDAgfHwgdmFsKQotCWJ5dGUgfD0gMHg4MDsKLQotICAgICAgaWYgKG9yaWcpCi0JKnAgPSBieXRlOwotICAgICAgcCsrOwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICByZXR1cm4gcCAtIG9yaWc7Ci19Ci0KLXN0YXRpYyBpbnQKLW91dHB1dF9iaWdfbGViMTI4IChwLCBiaWdudW0sIHNpemUsIHNpZ24pCi0gICAgIGNoYXIgKnA7Ci0gICAgIExJVFRMRU5VTV9UWVBFICpiaWdudW07Ci0gICAgIGludCBzaXplLCBzaWduOwotewotICBpZiAoc2lnbikKLSAgICByZXR1cm4gb3V0cHV0X2JpZ19zbGViMTI4IChwLCBiaWdudW0sIHNpemUpOwotICBlbHNlCi0gICAgcmV0dXJuIG91dHB1dF9iaWdfdWxlYjEyOCAocCwgYmlnbnVtLCBzaXplKTsKLX0KLQotLyogR2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGZyYWdtZW50cyBmb3IgYSBnaXZlbiBleHByZXNzaW9uIHRvIGVtaXQgYQotICAgbGViMTI4IHZhbHVlLiAgKi8KLQotdm9pZAotZW1pdF9sZWIxMjhfZXhwcihleHAsIHNpZ24pCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCBzaWduOwotewotICBvcGVyYXRvclQgb3AgPSBleHAtPlhfb3A7Ci0KLSAgaWYgKG9wID09IE9fYWJzZW50IHx8IG9wID09IE9faWxsZWdhbCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJ6ZXJvIGFzc3VtZWQgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnICYmIGV4cC0+WF9hZGRfbnVtYmVyIDw9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19yZWdpc3RlcikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJyZWdpc3RlciB2YWx1ZSB1c2VkIGFzIGV4cHJlc3Npb24iKSk7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotCi0gIGlmIChvcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIC8qIElmIHdlJ3ZlIGdvdCBhIGNvbnN0YW50LCBlbWl0IHRoZSB0aGluZyBkaXJlY3RseSByaWdodCBub3cuICAqLwotCi0gICAgICB2YWx1ZVQgdmFsdWUgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIGludCBzaXplOwotICAgICAgY2hhciAqcDsKLQotICAgICAgc2l6ZSA9IHNpemVvZl9sZWIxMjggKHZhbHVlLCBzaWduKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICAgICAgb3V0cHV0X2xlYjEyOCAocCwgdmFsdWUsIHNpZ24pOwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19iaWcpCi0gICAgewotICAgICAgLyogT19iaWcgaXMgYSBkaWZmZXJlbnQgc29ydCBvZiBjb25zdGFudC4gICovCi0KLSAgICAgIGludCBzaXplOwotICAgICAgY2hhciAqcDsKLQotICAgICAgc2l6ZSA9IG91dHB1dF9iaWdfbGViMTI4IChOVUxMLCBnZW5lcmljX2JpZ251bSwgZXhwLT5YX2FkZF9udW1iZXIsIHNpZ24pOwotICAgICAgcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0gICAgICBvdXRwdXRfYmlnX2xlYjEyOCAocCwgZ2VuZXJpY19iaWdudW0sIGV4cC0+WF9hZGRfbnVtYmVyLCBzaWduKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBPdGhlcndpc2UsIHdlIGhhdmUgdG8gY3JlYXRlIGEgdmFyaWFibGUgc2l6ZWQgZnJhZ21lbnQgYW5kIAotCSByZXNvbHZlIHRoaW5ncyBsYXRlci4gICovCi0KLSAgICAgIGZyYWdfdmFyIChyc19sZWIxMjgsIHNpemVvZl91bGViMTI4ICh+KHZhbHVlVCkwKSwgMCwgc2lnbiwKLQkJbWFrZV9leHByX3N5bWJvbCAoZXhwKSwgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgfQotfQotCi0vKiBQYXJzZSB0aGUgLnNsZWIxMjggYW5kIC51bGViMTI4IHBzZXVkb3MuICAqLwotCi12b2lkCi1zX2xlYjEyOCAoc2lnbikKLSAgICAgaW50IHNpZ247Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBkbyB7Ci0gICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgZW1pdF9sZWIxMjhfZXhwciAoJmV4cCwgc2lnbik7Ci0gIH0gd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyoKLSAqCQkJc3RyaW5nZXIoKQotICoKLSAqIFdlIHJlYWQgMCBvciBtb3JlICcsJyBzZXBhcmF0ZWQsIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLSAqCi0gKiBDYWxsZXIgc2hvdWxkIGhhdmUgY2hlY2tlZCBuZWVkX3Bhc3NfMiBpcyBGQUxTRSBiZWNhdXNlIHdlIGRvbid0IGNoZWNrIGl0LgotICovCi0KLQotdm9pZCAKLXN0cmluZ2VyIChhcHBlbmRfemVybykJCS8qIFdvcmtlciB0byBkbyAuYXNjaWkgZXRjIHN0YXRlbWVudHMuICovCi0gICAgIC8qIENoZWNrcyBlbmQtb2YtbGluZS4gKi8KLSAgICAgcmVnaXN0ZXIgaW50IGFwcGVuZF96ZXJvOwkvKiAwOiBkb24ndCBhcHBlbmQgJ1wwJywgZWxzZSAxICovCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotICBjaGFyICpzdGFydDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgLyoKLSAgICogVGhlIGZvbGxvd2luZyBhd2t3YXJkIGxvZ2ljIGlzIHRvIHBhcnNlIFpFUk8gb3IgbW9yZSBzdHJpbmdzLAotICAgKiBjb21tYSBzZXBhcmF0ZWQuIFJlY2FsbCBhIHN0cmluZyBleHByZXNzaW9uIGluY2x1ZGVzIHNwYWNlcwotICAgKiBiZWZvcmUgdGhlIG9wZW5pbmcgJ1wiJyBhbmQgc3BhY2VzIGFmdGVyIHRoZSBjbG9zaW5nICdcIicuCi0gICAqIFdlIGZha2UgYSBsZWFkaW5nICcsJyBpZiB0aGVyZSBpcyAoc3VwcG9zZWQgdG8gYmUpCi0gICAqIGEgMXN0LCBleHByZXNzaW9uLiBXZSBrZWVwIGRlbWFuZGluZyBleHByZXNzaW9ucyBmb3IgZWFjaAotICAgKiAnLCcuCi0gICAqLwotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBjID0gMDsJCQkvKiBTa2lwIGxvb3AuICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsJLyogQ29tcGVuc2F0ZSBmb3IgZW5kIG9mIGxvb3AuICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyA9ICcsJzsJCQkvKiBEbyBsb29wLiAqLwotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnIHx8IGMgPT0gJzwnIHx8IGMgPT0gJyInKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnXCInOgotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CS8qLT4xc3QgY2hhciBvZiBzdHJpbmcuICovCi0JICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlIChpc19hX2NoYXIgKGMgPSBuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQkgICAgewotCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7Ci0JICAgIH0KLQkgIGlmIChhcHBlbmRfemVybykKLQkgICAgewotCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoMCk7Ci0JICAgIH0KLQkgIGtub3cgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1wiJyk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotI2lmZGVmIE9CSl9FTEYKLQkgIC8qIEluIEVMRiwgd2hlbiBnY2MgaXMgZW1pdHRpbmcgRFdBUkYgMSBkZWJ1Z2dpbmcgb3V0cHV0LCBpdAotICAgICAgICAgICAgIHdpbGwgZW1pdCAuc3RyaW5nIHdpdGggYSBmaWxlbmFtZSBpbiB0aGUgLmRlYnVnIHNlY3Rpb24KLSAgICAgICAgICAgICBhZnRlciBhIHNlcXVlbmNlIG9mIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudCBpbgotICAgICAgICAgICAgIGVtaXRfZXhwciBmb3IgdGhlIHNlcXVlbmNlLiAgZW1pdF9leHByIHdpbGwgc2V0Ci0gICAgICAgICAgICAgZHdhcmZfZmlsZV9zdHJpbmcgdG8gbm9uLXplcm8gaWYgdGhpcyBzdHJpbmcgbWlnaHQgYmUgYQotICAgICAgICAgICAgIHNvdXJjZSBmaWxlIG5hbWUuICAqLwotCSAgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5kZWJ1ZyIpICE9IDApCi0JICAgIGR3YXJmX2ZpbGVfc3RyaW5nID0gMDsKLQkgIGVsc2UgaWYgKGR3YXJmX2ZpbGVfc3RyaW5nKQotCSAgICB7Ci0JICAgICAgYyA9IGlucHV0X2xpbmVfcG9pbnRlclstMV07Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9ICdcMCc7Ci0JICAgICAgbGlzdGluZ19zb3VyY2VfZmlsZSAoc3RhcnQpOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlclstMV0gPSBjOwotCSAgICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0JICBicmVhazsKLQljYXNlICc8JzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYyA9IGdldF9zaW5nbGVfbnVtYmVyICgpOwotCSAgRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc+JykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgPG5uPiIpKTsKLQkgICAgfQotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBicmVhazsKLQljYXNlICcsJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHN0cmluZ2VyKCkgKi8KLQwKLS8qIEZJWE1FLVNPTUVEQVk6IEkgaGFkIHRyb3VibGUgaGVyZSBvbiBjaGFyYWN0ZXJzIHdpdGggdGhlCi0gICAgaGlnaCBiaXRzIHNldC4gIFdlJ2xsIHByb2JhYmx5IGFsc28gaGF2ZSB0cm91YmxlIHdpdGgKLSAgICBtdWx0aWJ5dGUgY2hhcnMsIHdpZGUgY2hhcnMsIGV0Yy4gIEFsc28gYmUgY2FyZWZ1bCBhYm91dAotICAgIHJldHVybmluZyB2YWx1ZXMgYmlnZ2VyIHRoYW4gMSBieXRlLiAgeG94b3JpY2guICovCi0KLXVuc2lnbmVkIGludCAKLW5leHRfY2hhcl9vZl9zdHJpbmcgKCkKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKyAmIENIQVJfTUFTSzsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdcIic6Ci0gICAgICBjID0gTk9UX0FfQ0hBUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnXG4nOgotICAgICAgYXNfd2FybiAoXygiVW50ZXJtaW5hdGVkIHN0cmluZzogTmV3bGluZSBpbnNlcnRlZC4iKSk7Ci0gICAgICBidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0gICAgICBicmVhazsKLQotI2lmbmRlZiBOT19TVFJJTkdfRVNDQVBFUwotICAgIGNhc2UgJ1xcJzoKLSAgICAgIHN3aXRjaCAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLQl7Ci0JY2FzZSAnYic6Ci0JICBjID0gJ1xiJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBjID0gJ1xmJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbic6Ci0JICBjID0gJ1xuJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAncic6Ci0JICBjID0gJ1xyJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAndCc6Ci0JICBjID0gJ1x0JzsKLQkgIGJyZWFrOwotCi0JY2FzZSAndic6Ci0JICBjID0gJ1wwMTMnOwotCSAgYnJlYWs7Ci0KLQljYXNlICdcXCc6Ci0JY2FzZSAnIic6Ci0JICBicmVhazsJCS8qIEFzIGl0c2VsZi4gKi8KLQotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCWNhc2UgJzcnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCSAgewotCSAgICBsb25nIG51bWJlcjsKLQkgICAgaW50IGk7Ci0KLQkgICAgZm9yIChpID0gMCwgbnVtYmVyID0gMDsgaXNkaWdpdCAoYykgJiYgaSA8IDM7IGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyssIGkrKykKLQkgICAgICB7Ci0JCW51bWJlciA9IG51bWJlciAqIDggKyBjIC0gJzAnOwotCSAgICAgIH0KLQkgICAgYyA9IG51bWJlciAmIDB4ZmY7Ci0JICB9Ci0JICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6Ci0JY2FzZSAnWCc6Ci0JICB7Ci0JICAgIGxvbmcgbnVtYmVyOwotCi0JICAgIG51bWJlciA9IDA7Ci0JICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgIHdoaWxlIChpc3hkaWdpdCAoYykpCi0JICAgICAgewotCQlpZiAoaXNkaWdpdCAoYykpCi0JCSAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBjIC0gJzAnOwotCQllbHNlIGlmIChpc3VwcGVyIChjKSkKLQkJICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGMgLSAnQScgKyAxMDsKLQkJZWxzZQotCQkgIG51bWJlciA9IG51bWJlciAqIDE2ICsgYyAtICdhJyArIDEwOwotCQljID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIH0KLQkgICAgYyA9IG51bWJlciAmIDB4ZmY7Ci0JICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdcbic6Ci0JICAvKiBUbyBiZSBjb21wYXRpYmxlIHdpdGggQlNEIDQuMiBhczogZ2l2ZSB0aGUgbHVzZXIgYSBsaW5lZmVlZCEhICovCi0JICBhc193YXJuIChfKCJVbnRlcm1pbmF0ZWQgc3RyaW5nOiBOZXdsaW5lIGluc2VydGVkLiIpKTsKLQkgIGMgPSAnXG4nOwotCSAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0jaWZkZWYgT05MWV9TVEFOREFSRF9FU0NBUEVTCi0JICBhc19iYWQgKF8oIkJhZCBlc2NhcGVkIGNoYXJhY3RlciBpbiBzdHJpbmcsICc/JyBhc3N1bWVkIikpOwotCSAgYyA9ICc/JzsKLSNlbmRpZiAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQotCSAgYnJlYWs7Ci0JfQkJCS8qIHN3aXRjaCBvbiBlc2NhcGVkIGNoYXIgKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmIC8qICEgZGVmaW5lZCAoTk9fU1RSSU5HX0VTQ0FQRVMpICovCi0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gY2hhciAqLwotICByZXR1cm4gKGMpOwotfQkJCQkvKiBuZXh0X2NoYXJfb2Zfc3RyaW5nKCkgKi8KLQwKLXN0YXRpYyBzZWdUCi1nZXRfc2VnbWVudGVkX2V4cHJlc3Npb24gKGV4cFApCi0gICAgIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHBQOwotewotICByZWdpc3RlciBzZWdUIHJldHZhbDsKLQotICByZXR2YWwgPSBleHByZXNzaW9uIChleHBQKTsKLSAgaWYgKGV4cFAtPlhfb3AgPT0gT19pbGxlZ2FsCi0gICAgICB8fCBleHBQLT5YX29wID09IE9fYWJzZW50Ci0gICAgICB8fCBleHBQLT5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgYWRkcmVzcyBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICByZXR2YWwgPSBhYnNvbHV0ZV9zZWN0aW9uOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHNlZ1QgCi1nZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKGV4cFApCi0gICAgIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHBQOwotewotICByZWdpc3RlciBzZWdUIHJldHZhbDsKLQotICBpZiAoKHJldHZhbCA9IGdldF9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoZXhwUCkpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGV4dHJhY3QgdGhlIHVuZGVmaW5lZCBzeW1ib2wgZnJvbSB0aGUKLQkgZXhwcmVzc2lvbi4gICovCi0gICAgICBpZiAoZXhwUC0+WF9hZGRfc3ltYm9sICE9IE5VTEwKLQkgICYmIFNfR0VUX1NFR01FTlQgKGV4cFAtPlhfYWRkX3N5bWJvbCkgIT0gZXhwcl9zZWN0aW9uKQotCWFzX3dhcm4gKF8oInN5bWJvbCBcIiVzXCIgdW5kZWZpbmVkOyB6ZXJvIGFzc3VtZWQiKSwKLQkJIFNfR0VUX05BTUUgKGV4cFAtPlhfYWRkX3N5bWJvbCkpOwotICAgICAgZWxzZQotCWFzX3dhcm4gKF8oInNvbWUgc3ltYm9sIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgcmV0dmFsID0gYWJzb2x1dGVfc2VjdGlvbjsKLSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gIGtub3cgKHJldHZhbCA9PSBhYnNvbHV0ZV9zZWN0aW9uIHx8IFNFR19OT1JNQUwgKHJldHZhbCkpOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbigpICovCi0KLW9mZnNldFQKLWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaWYgKGV4cC5YX29wICE9IE9fYWJzZW50KQotCWFzX2JhZCAoXygiYmFkIG9yIGlycmVkdWNpYmxlIGFic29sdXRlIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgIH0KLSAgcmV0dXJuIGV4cC5YX2FkZF9udW1iZXI7Ci19Ci0KLWNoYXIJCQkJLyogcmV0dXJuIHRlcm1pbmF0b3IgKi8KLWdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICh2YWxfcG9pbnRlcikKLSAgICAgbG9uZyAqdmFsX3BvaW50ZXI7CQkvKiByZXR1cm4gdmFsdWUgb2YgZXhwcmVzc2lvbiAqLwotewotICAvKiBGSVhNRTogdmFsX3BvaW50ZXIgc2hvdWxkIHByb2JhYmx5IGJlIG9mZnNldFQgKi4gICovCi0gICp2YWxfcG9pbnRlciA9IChsb25nKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgcmV0dXJuICgqaW5wdXRfbGluZV9wb2ludGVyKyspOwotfQotDAotLyoKLSAqCQkJZGVtYW5kX2NvcHlfQ19zdHJpbmcoKQotICoKLSAqIExpa2UgZGVtYW5kX2NvcHlfc3RyaW5nLCBidXQgcmV0dXJuIE5VTEwgaWYgdGhlIHN0cmluZyBjb250YWlucyBhbnkgJ1wwJ3MuCi0gKiBHaXZlIGEgd2FybmluZyBpZiB0aGF0IGhhcHBlbnMuCi0gKi8KLWNoYXIgKgotZGVtYW5kX2NvcHlfQ19zdHJpbmcgKGxlbl9wb2ludGVyKQotICAgICBpbnQgKmxlbl9wb2ludGVyOwotewotICByZWdpc3RlciBjaGFyICpzOwotCi0gIGlmICgocyA9IGRlbWFuZF9jb3B5X3N0cmluZyAobGVuX3BvaW50ZXIpKSAhPSAwKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBsZW47Ci0KLSAgICAgIGZvciAobGVuID0gKmxlbl9wb2ludGVyOyBsZW4gPiAwOyBsZW4tLSkKLQl7Ci0JICBpZiAoKnMgPT0gMCkKLQkgICAgewotCSAgICAgIHMgPSAwOwotCSAgICAgIGxlbiA9IDE7Ci0JICAgICAgKmxlbl9wb2ludGVyID0gMDsKLQkgICAgICBhc19iYWQgKF8oIlRoaXMgc3RyaW5nIG1heSBub3QgY29udGFpbiBcJ1xcMFwnIikpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHM7Ci19Ci0MCi0vKgotICoJCQlkZW1hbmRfY29weV9zdHJpbmcoKQotICoKLSAqIERlbWFuZCBzdHJpbmcsIGJ1dCByZXR1cm4gYSBzYWZlICg9cHJpdmF0ZSkgY29weSBvZiB0aGUgc3RyaW5nLgotICogUmV0dXJuIE5VTEwgaWYgd2UgY2FuJ3QgcmVhZCBhIHN0cmluZyBoZXJlLgotICovCi1jaGFyICoKLWRlbWFuZF9jb3B5X3N0cmluZyAobGVuUCkKLSAgICAgaW50ICpsZW5QOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLSAgcmVnaXN0ZXIgaW50IGxlbjsKLSAgY2hhciAqcmV0dmFsOwotCi0gIGxlbiA9IDA7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJLyogU2tpcCBvcGVuaW5nIHF1b3RlLiAqLwotCi0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JewotCSAgb2JzdGFja18xZ3JvdyAoJm5vdGVzLCBjKTsKLQkgIGxlbisrOwotCX0KLSAgICAgIC8qIEpGIHRoaXMgbmV4dCBsaW5lIGlzIHNvIGRlbWFuZF9jb3B5X0Nfc3RyaW5nIHdpbGwgcmV0dXJuIGEKLQkgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gKi8KLSAgICAgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgJ1wwJyk7Ci0gICAgICByZXR2YWwgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJNaXNzaW5nIHN0cmluZyIpKTsKLSAgICAgIHJldHZhbCA9IE5VTEw7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgKmxlblAgPSBsZW47Ci0gIHJldHVybiAocmV0dmFsKTsKLX0JCQkJLyogZGVtYW5kX2NvcHlfc3RyaW5nKCkgKi8KLQwKLS8qCi0gKgkJaXNfaXRfZW5kX29mX3N0YXRlbWVudCgpCi0gKgotICogSW46CUlucHV0X2xpbmVfcG9pbnRlci0+bmV4dCBjaGFyYWN0ZXIuCi0gKgotICogRG86CVNraXAgaW5wdXRfbGluZV9wb2ludGVyIG92ZXIgYWxsIHdoaXRlc3BhY2UuCi0gKgotICogT3V0OgkxIGlmIGlucHV0X2xpbmVfcG9pbnRlci0+ZW5kLW9mLWxpbmUuCi0qLwotaW50IAotaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKQotewotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIHJldHVybiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKTsKLX0JCQkJLyogaXNfaXRfZW5kX29mX3N0YXRlbWVudCgpICovCi0KLXZvaWQgCi1lcXVhbHMgKHN5bV9uYW1lLCByZWFzc2lnbikKLSAgICAgY2hhciAqc3ltX25hbWU7Ci0gICAgIGludCByZWFzc2lnbjsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsJLyogc3ltYm9sIHdlIGFyZSB3b3JraW5nIHdpdGggKi8KLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc9JykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXHQnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgaWYgKHN5bV9uYW1lWzBdID09ICcuJyAmJiBzeW1fbmFtZVsxXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFR1cm4gJy4gPSBtdW1ibGUnIGludG8gYSAub3JnIG11bWJsZSAqLwotICAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OwotICAgICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgICBzZWdtZW50ID0gZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmZXhwKTsKLSAgICAgIGlmICghbmVlZF9wYXNzXzIpCi0JZG9fb3JnIChzZWdtZW50LCAmZXhwLCAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3ltX25hbWUpOwotICAgICAgLyogUGVybWl0IHJlZ2lzdGVyIG5hbWVzIHRvIGJlIHJlZGVmaW5lZC4gICovCi0gICAgICBpZiAoISByZWFzc2lnbgotCSAgJiYgU19JU19ERUZJTkVEIChzeW1ib2xQKQotCSAgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgIT0gcmVnX3NlY3Rpb24pCi0JYXNfYmFkIChfKCJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotICAgICAgcHNldWRvX3NldCAoc3ltYm9sUCk7Ci0gICAgfQotCi0gIGlmIChmbGFnX21yaSkKLSAgICAgewotICAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7IC8qIGNoZWNrIGdhcmJhZ2UgYWZ0ZXIgdGhlIGV4cHJlc3Npb24gKi8KLSAgICAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgfQotfQkJCQkvKiBlcXVhbHMoKSAqLwotCi0vKiAuaW5jbHVkZSAtLSBpbmNsdWRlIGEgZmlsZSBhdCB0aGlzIHBvaW50LiAqLwotCi0vKiBBUkdTVVNFRCAqLwotdm9pZCAKLXNfaW5jbHVkZSAoYXJnKQotICAgICBpbnQgYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5ld2J1ZjsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGludCBpOwotICBGSUxFICp0cnk7Ci0gIGNoYXIgKnBhdGg7Ci0KLSAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLSAgICB7Ci0gICAgICBmaWxlbmFtZSA9IGRlbWFuZF9jb3B5X3N0cmluZyAoJmkpOwotICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JewotCSAgLyogZGVtYW5kX2NvcHlfc3RyaW5nIGhhcyBhbHJlYWR5IHByaW50ZWQgYW4gZXJyb3IgYW5kCi0gICAgICAgICAgICAgY2FsbGVkIGlnbm9yZV9yZXN0X29mX2xpbmUuICAqLwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpID0gMDsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCSAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcKLQkgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1x0JykKLQl7Ci0JICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICppbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICArK2k7Ci0JfQotICAgICAgb2JzdGFja18xZ3JvdyAoJm5vdGVzLCAnXDAnKTsKLSAgICAgIGZpbGVuYW1lID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBwYXRoID0geG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIGkgKyBpbmNsdWRlX2Rpcl9tYXhsZW4gKyA1IC8qIHNsb3AgKi8gKTsKLSAgZm9yIChpID0gMDsgaSA8IGluY2x1ZGVfZGlyX2NvdW50OyBpKyspCi0gICAgewotICAgICAgc3RyY3B5IChwYXRoLCBpbmNsdWRlX2RpcnNbaV0pOwotICAgICAgc3RyY2F0IChwYXRoLCAiLyIpOwotICAgICAgc3RyY2F0IChwYXRoLCBmaWxlbmFtZSk7Ci0gICAgICBpZiAoMCAhPSAodHJ5ID0gZm9wZW4gKHBhdGgsICJyIikpKQotCXsKLQkgIGZjbG9zZSAodHJ5KTsKLQkgIGdvdG8gZ290aXQ7Ci0JfQotICAgIH0KLSAgZnJlZSAocGF0aCk7Ci0gIHBhdGggPSBmaWxlbmFtZTsKLWdvdGl0OgotICAvKiBtYWxsb2MgU3RvcmFnZSBsZWFrIHdoZW4gZmlsZSBpcyBmb3VuZCBvbiBwYXRoLiAgRklYTUUtU09NRURBWS4gKi8KLSAgcmVnaXN0ZXJfZGVwZW5kZW5jeSAocGF0aCk7Ci0gIG5ld2J1ZiA9IGlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSAocGF0aCwgaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQkJCQkvKiBzX2luY2x1ZGUoKSAqLwotCi12b2lkIAotYWRkX2luY2x1ZGVfZGlyIChwYXRoKQotICAgICBjaGFyICpwYXRoOwotewotICBpbnQgaTsKLQotICBpZiAoaW5jbHVkZV9kaXJfY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBpbmNsdWRlX2RpcnMgPSAoY2hhciAqKikgeG1hbGxvYyAoMiAqIHNpemVvZiAoKmluY2x1ZGVfZGlycykpOwotICAgICAgaW5jbHVkZV9kaXJzWzBdID0gIi4iOwkvKiBDdXJyZW50IGRpciAqLwotICAgICAgaW5jbHVkZV9kaXJfY291bnQgPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluY2x1ZGVfZGlyX2NvdW50Kys7Ci0gICAgICBpbmNsdWRlX2RpcnMgPSAoY2hhciAqKikgcmVhbGxvYyAoaW5jbHVkZV9kaXJzLAotCQkJCWluY2x1ZGVfZGlyX2NvdW50ICogc2l6ZW9mICgqaW5jbHVkZV9kaXJzKSk7Ci0gICAgfQotCi0gIGluY2x1ZGVfZGlyc1tpbmNsdWRlX2Rpcl9jb3VudCAtIDFdID0gcGF0aDsJLyogTmV3IG9uZSAqLwotCi0gIGkgPSBzdHJsZW4gKHBhdGgpOwotICBpZiAoaSA+IGluY2x1ZGVfZGlyX21heGxlbikKLSAgICBpbmNsdWRlX2Rpcl9tYXhsZW4gPSBpOwotfQkJCQkvKiBhZGRfaW5jbHVkZV9kaXIoKSAqLwotDAotLyogT3V0cHV0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgdGhlIHNvdXJjZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2ZpbGVfZGVidWcgKCkKLXsKLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfU1RBQlMpCi0gICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUgKCk7Ci19Ci0KLS8qIE91dHB1dCBsaW5lIG51bWJlciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IHNvdXJjZSBsaW5lLiAgKi8KLQotdm9pZAotZ2VuZXJhdGVfbGluZW5vX2RlYnVnICgpCi17Ci0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0gIC8qIEVDT0ZGIGFzc2VtYmxlcnMgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIAotICAgICBGSVhNRTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgaGFuZGxlZCBlbHNld2hlcmUuICAqLwotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19VTlNQRUNJRklFRCkKLSAgICB7Ci0gICAgICBpZiAoRUNPRkZfREVCVUdHSU5HICYmIGVjb2ZmX25vX2N1cnJlbnRfZmlsZSAoKSkKLSAgICAgICAgZGVidWdfdHlwZSA9IERFQlVHX0VDT0ZGOwotICAgICAgZWxzZQotCWRlYnVnX3R5cGUgPSBERUJVR19OT05FOwotICAgIH0KLSNlbmRpZgotCi0gIHN3aXRjaCAoZGVidWdfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19VTlNQRUNJRklFRDoKLSAgICBjYXNlIERFQlVHX05PTkU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1NUQUJTOgotICAgICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfRUNPRkY6Ci0gICAgICBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19EV0FSRjoKLSAgICBjYXNlIERFQlVHX0RXQVJGMjoKLSAgICAgIC8qIEZJWE1FLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogT3V0cHV0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBtYXJrIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgb3IgZW5kIHBvaW50LgotICAgRU5EX1AgaXMgemVybyBmb3IgLmZ1bmMsIGFuZCBub24temVybyBmb3IgLmVuZGZ1bmMuICAqLwotCi12b2lkCi1zX2Z1bmMgKGVuZF9wKQotICAgICBpbnQgZW5kX3A7Ci17Ci0gIGRvX3NfZnVuYyAoZW5kX3AsIE5VTEwpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIHNfZnVuYyBzbyB0YXJnZXRzIGNhbiBjaG9vc2UgYSBkaWZmZXJlbnQgZGVmYXVsdCBwcmVmaXguCi0gICBJZiBERUZBVUxUX1BSRUZJWCBpcyBOVUxMLCB1c2UgdGhlIHRhcmdldCdzICJsZWFkaW5nIGNoYXIiLiAgKi8KLQotdm9pZAotZG9fc19mdW5jIChlbmRfcCwgZGVmYXVsdF9wcmVmaXgpCi0gICAgIGludCBlbmRfcDsKLSAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9wcmVmaXg7Ci17Ci0gIC8qIFJlY29yZCB0aGUgY3VycmVudCBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIGZvcgotICAgICBtaXNwbGFjZWQgLmZ1bmMsLmVuZGZ1bmMsIGFuZCBhbHNvIHNvIHRoYXQgLmVuZGZ1bmMgbmVlZHMgbm8KLSAgICAgYXJndW1lbnRzLiAgKi8KLSAgc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKLSAgc3RhdGljIGNoYXIgKmN1cnJlbnRfbGFiZWw7Ci0KLSAgaWYgKGVuZF9wKQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X25hbWUgPT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgLmZ1bmMiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfU1RBQlMpCi0Jc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgKGN1cnJlbnRfbmFtZSwgY3VycmVudF9sYWJlbCk7Ci0KLSAgICAgIGN1cnJlbnRfbmFtZSA9IGN1cnJlbnRfbGFiZWwgPSBOVUxMOwotICAgIH0KLSAgZWxzZSAvKiAhIGVuZF9wICovCi0gICAgewotICAgICAgY2hhciAqbmFtZSwqbGFiZWw7Ci0gICAgICBjaGFyIGRlbGltMSxkZWxpbTI7Ci0KLSAgICAgIGlmIChjdXJyZW50X25hbWUgIT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIi5lbmRmdW5jIG1pc3NpbmcgZm9yIHByZXZpb3VzIC5mdW5jIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZWxpbTEgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIG5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBkZWxpbTE7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JewotCSAgaWYgKGRlZmF1bHRfcHJlZml4KQotCSAgICBhc3ByaW50ZiAoJmxhYmVsLCAiJXMlcyIsIGRlZmF1bHRfcHJlZml4LCBuYW1lKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgbGVhZGluZ19jaGFyID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgICAgbGVhZGluZ19jaGFyID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChzdGRvdXRwdXQpOwotI2VuZGlmCi0JICAgICAgLyogTWlzc2luZyBlbnRyeSBwb2ludCwgdXNlIGZ1bmN0aW9uJ3MgbmFtZSB3aXRoIHRoZSBsZWFkaW5nCi0JCSBjaGFyIHByZXBlbmRlZC4gICovCi0JICAgICAgaWYgKGxlYWRpbmdfY2hhcikKLQkJYXNwcmludGYgKCZsYWJlbCwgIiVjJXMiLCBsZWFkaW5nX2NoYXIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJbGFiZWwgPSBuYW1lOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgbGFiZWwgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBkZWxpbTIgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGxhYmVsID0geHN0cmR1cCAobGFiZWwpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGRlbGltMjsKLQl9Ci0KLSAgICAgIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1NUQUJTKQotCXN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jIChuYW1lLCBsYWJlbCk7Ci0KLSAgICAgIGN1cnJlbnRfbmFtZSA9IG5hbWU7Ci0gICAgICBjdXJyZW50X2xhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi12b2lkIAotc19pZ25vcmUgKGFyZykKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0KLXZvaWQKLXJlYWRfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAicHNldWRvLW9wIHRhYmxlIiwgcG9faGFzaCk7Ci19Ci0KLS8qIGVuZCBvZiByZWFkLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9yZWFkLmggYi9nYXMvcmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNiMTAzLi4wMDAwMDAwCi0tLSBhL2dhcy9yZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogcmVhZC5oIC0gb2YgcmVhZC5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDkwLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7LyogLT4gY2hhciB3ZSBhcmUgcGFyc2luZyBub3cuICovCi0KLSNkZWZpbmUgUEVSTUlUX1dISVRFU1BBQ0UJLyogRGVmaW5lIHRvIG1ha2Ugd2hpdGVzcGFjZSBiZSBhbGxvd2VkIGluICovCi0vKiBtYW55IHN5bnRhY3RpY2FsbHkgdW5uZWNlc3NhcnkgcGxhY2VzLiAqLwotLyogTm9ybWFsbHkgdW5kZWZpbmVkLiBGb3IgY29tcGF0aWJpbGl0eSAqLwotLyogd2l0aCBhbmNpZW50IEdOVSBjYy4gKi8KLS8qICN1bmRlZiBQRVJNSVRfV0hJVEVTUEFDRSAqLwotCi0jaWZkZWYgUEVSTUlUX1dISVRFU1BBQ0UKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFKCkge2lmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpICsrIGlucHV0X2xpbmVfcG9pbnRlcjt9Ci0jZWxzZQotI2RlZmluZSBTS0lQX1dISVRFU1BBQ0UoKSBrbm93KCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnICkKLSNlbmRpZgotCi0KLSNkZWZpbmUJTEVYX05BTUUJKDEpCS8qIG1heSBjb250aW51ZSBhIG5hbWUgKi8KLSNkZWZpbmUgTEVYX0JFR0lOX05BTUUJKDIpCS8qIG1heSBiZWdpbiBhIG5hbWUgKi8KLSNkZWZpbmUgTEVYX0VORF9OQU1FCSg0KQkvKiBlbmRzIGEgbmFtZSAqLwotCi0jZGVmaW5lIGlzX25hbWVfYmVnaW5uZXIoYykgXAotICAoIGxleF90eXBlWyh1bnNpZ25lZCBjaGFyKSAoYyldICYgTEVYX0JFR0lOX05BTUUgKQotI2RlZmluZSBpc19wYXJ0X29mX25hbWUoYykgXAotICAoIGxleF90eXBlWyh1bnNpZ25lZCBjaGFyKSAoYyldICYgTEVYX05BTUUgICAgICAgKQotI2RlZmluZSBpc19uYW1lX2VuZGVyKGMpIFwKLSAgKCBsZXhfdHlwZVsodW5zaWduZWQgY2hhcikgKGMpXSAmIExFWF9FTkRfTkFNRSAgICkKLQotI2lmbmRlZiBpc19hX2NoYXIKLSNkZWZpbmUgQ0hBUl9NQVNLCSgweGZmKQotI2RlZmluZSBOT1RfQV9DSEFSCShDSEFSX01BU0srMSkKLSNkZWZpbmUgaXNfYV9jaGFyKGMpCSgoKHVuc2lnbmVkKShjKSkgPD0gQ0hBUl9NQVNLKQotI2VuZGlmIC8qIGlzX2FfY2hhcigpICovCi0KLWV4dGVybiBjaGFyIGxleF90eXBlW107Ci1leHRlcm4gY2hhciBpc19lbmRfb2ZfbGluZVtdOwotCi1leHRlcm4gaW50IGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlIENQVSBzcGVjaWZpYyB0YXJnZXQgZmlsZXMgKHRjLSouYykuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdOwotZXh0ZXJuIGNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW107Ci1leHRlcm4gY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdOwotCi0vKiBUYWJsZSBvZiAtSSBkaXJlY3Rvcmllcy4gICovCi1leHRlcm4gY2hhciAqKmluY2x1ZGVfZGlyczsKLWV4dGVybiBpbnQgaW5jbHVkZV9kaXJfY291bnQ7Ci1leHRlcm4gaW50IGluY2x1ZGVfZGlyX21heGxlbjsKLQotLyogVGhlIG9mZnNldCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi1leHRlcm4gYWRkcmVzc1QgYWJzX3NlY3Rpb25fb2Zmc2V0OwotCi0vKiBUaGUgbGFiZWwgb24gYSBsaW5lLCB1c2VkIGJ5IHNvbWUgb2YgdGhlIHBzZXVkby1vcHMuICAqLwotZXh0ZXJuIHN5bWJvbFMgKmxpbmVfbGFiZWw7Ci0KLS8qIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IE1SSSBjb21tb24gc2VjdGlvbnMuICAqLwotZXh0ZXJuIHN5bWJvbFMgKm1yaV9jb21tb25fc3ltYm9sOwotCi0vKiBQb3NzaWJsZSBhcmd1bWVudHMgdG8gLmxpbmtvbmNlLiAgKi8KLWVudW0gbGlua29uY2VfdHlwZQotewotICBMSU5LT05DRV9VTlNFVCA9IDAsCi0gIExJTktPTkNFX0RJU0NBUkQsCi0gIExJTktPTkNFX09ORV9PTkxZLAotICBMSU5LT05DRV9TQU1FX1NJWkUsCi0gIExJTktPTkNFX1NBTUVfQ09OVEVOVFMKLX07Ci0KLWV4dGVybiB2b2lkIHBvcF9pbnNlcnQgUEFSQU1TICgoY29uc3QgcHNldWRvX3R5cGVTICopKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X3N0YWJfc3RyaW5nX29mZnNldAotICBQQVJBTVMgKChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnN0YWJzdHJfc2VjbmFtZSkpOwotZXh0ZXJuIGNoYXIgKmRlbWFuZF9jb3B5X0Nfc3RyaW5nIFBBUkFNUyAoKGludCAqbGVuX3BvaW50ZXIpKTsKLWV4dGVybiBjaGFyIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yCi0gIFBBUkFNUyAoKGxvbmcgKnZhbF9wb2ludGVyKSk7Ci1leHRlcm4gb2Zmc2V0VCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5leHRfY2hhcl9vZl9zdHJpbmcgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc19tcmlfc2VjdCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiBjaGFyICptcmlfY29tbWVudF9maWVsZCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIG1yaV9jb21tZW50X2VuZCBQQVJBTVMgKChjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgYWRkX2luY2x1ZGVfZGlyIFBBUkFNUyAoKGNoYXIgKnBhdGgpKTsKLWV4dGVybiB2b2lkIGNvbnMgUEFSQU1TICgoaW50IG5ieXRlcykpOwotZXh0ZXJuIHZvaWQgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBlbWl0X2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotZXh0ZXJuIHZvaWQgZW1pdF9sZWIxMjhfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGVxdWFscyBQQVJBTVMgKChjaGFyICpzeW1fbmFtZSwgaW50IHJlYXNzaWduKSk7Ci1leHRlcm4gdm9pZCBmbG9hdF9jb25zIFBBUkFNUyAoKGludCBmbG9hdF90eXBlKSk7Ci1leHRlcm4gdm9pZCBpZ25vcmVfcmVzdF9vZl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGRpc2NhcmRfcmVzdF9vZl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgb3V0cHV0X2xlYjEyOCBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50IHNpZ24pKTsKLWV4dGVybiB2b2lkIHBzZXVkb19zZXQgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKLWV4dGVybiB2b2lkIHJlYWRfYV9zb3VyY2VfZmlsZSBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCByZWFkX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJlYWRfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLWV4dGVybiBpbnQgc2l6ZW9mX2xlYjEyOCBQQVJBTVMgKCh2YWx1ZVQsIGludCBzaWduKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gdm9pZCBnZW5lcmF0ZV9saW5lbm9fZGVidWcgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBzX2Fib3J0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19hbGlnbl9ieXRlcyBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2FsaWduX3B0d28gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2FwcF9maWxlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19hcHBfbGluZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfY29tbSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZGF0YSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZGVzYyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZWxzZSBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2VuZCBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2VuZGlmIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfZXJyIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19mYWlsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19maWxsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19mbG9hdF9zcGFjZSBQQVJBTVMgKChpbnQgbXVsdCkpOwotZXh0ZXJuIHZvaWQgc19mdW5jIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZG9fc19mdW5jIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBzX2dsb2JsIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWYgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZmMgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZmRlZiBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lmZXFzIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWdub3JlIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaW5jbHVkZSBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lycCBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2xjb21tIFBBUkFNUyAoKGludCBuZWVkc19hbGlnbikpOwotZXh0ZXJuIHZvaWQgc19sY29tbV9ieXRlcyBQQVJBTVMgKChpbnQgbmVlZHNfYWxpZ24pKTsKLWV4dGVybiB2b2lkIHNfbGViMTI4IFBBUkFNUyAoKGludCBzaWduKSk7Ci1leHRlcm4gdm9pZCBzX2xpbmtvbmNlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19sc3ltIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19tYWNybyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbWV4aXQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX21yaSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbXJpX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfb3JnIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19wcmludCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfcHVyZ2VtIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19yZXB0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19zZXQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3NwYWNlIFBBUkFNUyAoKGludCBtdWx0KSk7Ci1leHRlcm4gdm9pZCBzX3N0YWIgUEFSQU1TICgoaW50IHdoYXQpKTsKLWV4dGVybiB2b2lkIHNfc3RydWN0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc190ZXh0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc3RyaW5nZXIgUEFSQU1TICgoaW50IGFwcGVuZF96ZXJvKSk7Ci1leHRlcm4gdm9pZCBzX3hzdGFiIFBBUkFNUyAoKGludCB3aGF0KSk7Ci1leHRlcm4gdm9pZCBzX3J2YSBQQVJBTVMgKChpbnQpKTsKLQotLyogZW5kIG9mIHJlYWQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3NiLmMgYi9nYXMvc2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjMjNmYy4uMDAwMDAwMAotLS0gYS9nYXMvc2IuYworKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKiBzYi5jIC0gc3RyaW5nIGJ1ZmZlciBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKLSAgICAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzYi5oIgotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgYWJvdXQgbWFuaXB1bGF0aW5nIHN0cmluZ3MuCi0KLSAgIFRoZXkgYXJlIG1hbmFnZWQgaW4gdGhpbmdzIGNhbGxlZCBgc2IncyB3aGljaCBpcyBhbiBhYmJyZXZpYXRpb24KLSAgIGZvciBzdHJpbmcgYnVmZmVycy4gIEFuIHNiIGhhcyB0byBiZSBjcmVhdGVkLCB0aGluZ3MgY2FuIGJlIGdsdWVkCi0gICBvbiB0byBpdCwgYW5kIGF0IHRoZSBlbmQgb2YgaXQncyBsaWZlIGl0IHNob3VsZCBiZSBmcmVlZC4gIFRoZQotICAgY29udGVudHMgc2hvdWxkIG5ldmVyIGJlIHBvaW50ZWQgYXQgd2hpbHN0IGl0IGlzIHN0aWxsIGdyb3dpbmcsCi0gICBzaW5jZSBpdCBjb3VsZCBiZSBtb3ZlZCBhdCBhbnkgdGltZQotCi0gICBlZzoKLSAgIHNiX25ldyAoJmZvbyk7Ci0gICBzYl9ncm93Li4uICgmZm9vLC4uLik7Ci0gICB1c2UgZm9vLT5wdHJbKl07Ci0gICBzYl9raWxsICgmZm9vKTsKLQotKi8KLQotI2RlZmluZSBkc2l6ZSA1Ci0KLXN0YXRpYyB2b2lkIHNiX2NoZWNrIFBBUkFNUyAoKHNiICosIGludCkpOwotCi0vKiBTdGF0aXN0aWNzIG9mIHNiIHN0cnVjdHVyZXMuICAqLwotCi1pbnQgc3RyaW5nX2NvdW50W3NiX21heF9wb3dlcl90d29dOwotCi0vKiBGcmVlIGxpc3Qgb2Ygc2Igc3RydWN0dXJlcy4gICovCi0KLXN0YXRpYyBzYl9saXN0X3ZlY3RvciBmcmVlX2xpc3Q7Ci0KLS8qIGluaXRpYWxpemVzIGFuIHNiLiAqLwotCi12b2lkCi1zYl9idWlsZCAocHRyLCBzaXplKQotICAgICBzYiAqcHRyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgLyogc2VlIGlmIHdlIGNhbiBmaW5kIG9uZSB0byBhbGxvY2F0ZSAqLwotICBzYl9lbGVtZW50ICplOwotCi0gIGlmIChzaXplID4gc2JfbWF4X3Bvd2VyX3R3bykKLSAgICBhYm9ydCAoKTsKLQotICBlID0gZnJlZV9saXN0LnNpemVbc2l6ZV07Ci0gIGlmICghZSkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIHRoZXJlLCBhbGxvY2F0ZSBvbmUgYW5kIHN0aWNrIGludG8gdGhlIGZyZWUgbGlzdCAqLwotICAgICAgZSA9IChzYl9lbGVtZW50ICopIHhtYWxsb2MgKHNpemVvZiAoc2JfZWxlbWVudCkgKyAoMSA8PCBzaXplKSk7Ci0gICAgICBlLT5uZXh0ID0gZnJlZV9saXN0LnNpemVbc2l6ZV07Ci0gICAgICBlLT5zaXplID0gMSA8PCBzaXplOwotICAgICAgZnJlZV9saXN0LnNpemVbc2l6ZV0gPSBlOwotICAgICAgc3RyaW5nX2NvdW50W3NpemVdKys7Ci0gICAgfQotCi0gIC8qIHJlbW92ZSBmcm9tIGZyZWUgbGlzdCAqLwotCi0gIGZyZWVfbGlzdC5zaXplW3NpemVdID0gZS0+bmV4dDsKLQotICAvKiBjb3B5IGludG8gY2FsbGVycyB3b3JsZCAqLwotICBwdHItPnB0ciA9IGUtPmRhdGE7Ci0gIHB0ci0+cG90ID0gc2l6ZTsKLSAgcHRyLT5sZW4gPSAwOwotICBwdHItPml0ZW0gPSBlOwotfQotCi0KLXZvaWQKLXNiX25ldyAocHRyKQotICAgICBzYiAqcHRyOwotewotICBzYl9idWlsZCAocHRyLCBkc2l6ZSk7Ci19Ci0KLS8qIGRlYWxsb2NhdGUgdGhlIHNiIGF0IHB0ciAqLwotCi12b2lkCi1zYl9raWxsIChwdHIpCi0gICAgIHNiICpwdHI7Ci17Ci0gIC8qIHJldHVybiBpdGVtIHRvIGZyZWUgbGlzdCAqLwotICBwdHItPml0ZW0tPm5leHQgPSBmcmVlX2xpc3Quc2l6ZVtwdHItPnBvdF07Ci0gIGZyZWVfbGlzdC5zaXplW3B0ci0+cG90XSA9IHB0ci0+aXRlbTsKLX0KLQotLyogYWRkIHRoZSBzYiBhdCBzIHRvIHRoZSBlbmQgb2YgdGhlIHNiIGF0IHB0ciAqLwotCi12b2lkCi1zYl9hZGRfc2IgKHB0ciwgcykKLSAgICAgc2IgKnB0cjsKLSAgICAgc2IgKnM7Ci17Ci0gIHNiX2NoZWNrIChwdHIsIHMtPmxlbik7Ci0gIG1lbWNweSAocHRyLT5wdHIgKyBwdHItPmxlbiwgcy0+cHRyLCBzLT5sZW4pOwotICBwdHItPmxlbiArPSBzLT5sZW47Ci19Ci0KLS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBzYiBhdCBwdHIgaGFzIHJvb20gZm9yIGFub3RoZXIgbGVuIGNoYXJhY3RlcnMsCi0gICBhbmQgZ3JvdyBpdCBpZiBpdCBkb2Vzbid0LiAqLwotCi1zdGF0aWMgdm9pZAotc2JfY2hlY2sgKHB0ciwgbGVuKQotICAgICBzYiAqcHRyOwotICAgICBpbnQgbGVuOwotewotICBpZiAocHRyLT5sZW4gKyBsZW4gPj0gMSA8PCBwdHItPnBvdCkKLSAgICB7Ci0gICAgICBzYiB0bXA7Ci0gICAgICBpbnQgcG90ID0gcHRyLT5wb3Q7Ci0gICAgICB3aGlsZSAocHRyLT5sZW4gKyBsZW4gPj0gMSA8PCBwb3QpCi0JcG90Kys7Ci0gICAgICBzYl9idWlsZCAoJnRtcCwgcG90KTsKLSAgICAgIHNiX2FkZF9zYiAoJnRtcCwgcHRyKTsKLSAgICAgIHNiX2tpbGwgKHB0cik7Ci0gICAgICAqcHRyID0gdG1wOwotICAgIH0KLX0KLQotLyogbWFrZSB0aGUgc2IgYXQgcHRyIHBvaW50IGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gICovCi0KLXZvaWQKLXNiX3Jlc2V0IChwdHIpCi0gICAgIHNiICpwdHI7Ci17Ci0gIHB0ci0+bGVuID0gMDsKLX0KLQotLyogYWRkIGNoYXJhY3RlciBjIHRvIHRoZSBlbmQgb2YgdGhlIHNiIGF0IHB0ci4gKi8KLQotdm9pZAotc2JfYWRkX2NoYXIgKHB0ciwgYykKLSAgICAgc2IgKnB0cjsKLSAgICAgaW50IGM7Ci17Ci0gIHNiX2NoZWNrIChwdHIsIDEpOwotICBwdHItPnB0cltwdHItPmxlbisrXSA9IGM7Ci19Ci0KLS8qIGFkZCBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHMgdG8gdGhlIGVuZCBvZiBzYiBhdCBwdHIuICovCi0KLXZvaWQKLXNiX2FkZF9zdHJpbmcgKHB0ciwgcykKLSAgICAgc2IgKnB0cjsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaW50IGxlbiA9IHN0cmxlbiAocyk7Ci0gIHNiX2NoZWNrIChwdHIsIGxlbik7Ci0gIG1lbWNweSAocHRyLT5wdHIgKyBwdHItPmxlbiwgcywgbGVuKTsKLSAgcHRyLT5sZW4gKz0gbGVuOwotfQotCi0vKiBhZGQgc3RyaW5nIGF0IHMgb2YgbGVuZ3RoIGxlbiB0byBzYiBhdCBwdHIgKi8KLQotdm9pZAotc2JfYWRkX2J1ZmZlciAocHRyLCBzLCBsZW4pCi0gICAgIHNiICpwdHI7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBsZW47Ci17Ci0gIHNiX2NoZWNrIChwdHIsIGxlbik7Ci0gIG1lbWNweSAocHRyLT5wdHIgKyBwdHItPmxlbiwgcywgbGVuKTsKLSAgcHRyLT5sZW4gKz0gbGVuOwotfQotCi0vKiBwcmludCB0aGUgc2IgYXQgcHRyIHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotCi12b2lkCi1zYl9wcmludCAob3V0ZmlsZSwgcHRyKQotICAgICBGSUxFICpvdXRmaWxlOwotICAgICBzYiAqcHRyOwotewotICBpbnQgaTsKLSAgaW50IG5jID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgcHRyLT5sZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmMpCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQl9Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiJWQiLCBwdHItPnB0cltpXSk7Ci0gICAgICBuYyA9IDE7Ci0gICAgfQotfQotCi12b2lkIAotc2JfcHJpbnRfYXQgKG91dGZpbGUsIGlkeCwgcHRyKQotICAgICBGSUxFICpvdXRmaWxlOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqcHRyOwotewotICBpbnQgaTsKLSAgZm9yIChpID0gaWR4OyBpIDwgcHRyLT5sZW47IGkrKykKLSAgICBwdXRjIChwdHItPnB0cltpXSwgb3V0ZmlsZSk7Ci19Ci0KLS8qIHB1dCBhIG51bGwgYXQgdGhlIGVuZCBvZiB0aGUgc2IgYXQgaW4gYW5kIHJldHVybiB0aGUgc3RhcnQgb2YgdGhlCi0gICBzdHJpbmcsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgYW4gYXJnIHRvIHByaW50ZiAlcy4gKi8KLQotY2hhciAqCi1zYl9uYW1lIChpbikKLSAgICAgc2IgKmluOwotewotICAvKiBzdGljayBhIG51bGwgb24gdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCi0gIHNiX2FkZF9jaGFyIChpbiwgMCk7Ci0gIHJldHVybiBpbi0+cHRyOwotfQotCi0vKiBsaWtlIHNiX25hbWUsIGJ1dCBkb24ndCBpbmNsdWRlIHRoZSBudWxsIGJ5dGUgaW4gdGhlIHN0cmluZy4gICovCi0KLWNoYXIgKgotc2JfdGVybWluYXRlIChpbikKLSAgICAgc2IgKmluOwotewotICBzYl9hZGRfY2hhciAoaW4sIDApOwotICAtLWluLT5sZW47Ci0gIHJldHVybiBpbi0+cHRyOwotfQotCi0vKiBzdGFydCBhdCB0aGUgaW5kZXggaWR4IGludG8gdGhlIHN0cmluZyBpbiBzYiBhdCBwdHIgYW5kIHNraXAKLSAgIHdoaXRlc3BhY2UuIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbiB3aGl0ZXNwYWNlIGNoYXJhY3RlciAqLwotCi1pbnQKLXNiX3NraXBfd2hpdGUgKGlkeCwgcHRyKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqcHRyOwotewotICB3aGlsZSAoaWR4IDwgcHRyLT5sZW4KLQkgJiYgKHB0ci0+cHRyW2lkeF0gPT0gJyAnCi0JICAgICB8fCBwdHItPnB0cltpZHhdID09ICdcdCcpKQotICAgIGlkeCsrOwotICByZXR1cm4gaWR4OwotfQotCi0vKiBzdGFydCBhdCB0aGUgaW5kZXggaWR4IGludG8gdGhlIHNiIGF0IHB0ci4gc2tpcHMgd2hpdGVzcGFjZSwKLSAgIGEgY29tbWEgYW5kIGFueSBmb2xsb3dpbmcgd2hpdGVzcGFjZS4gcmV0dXJuZXMgdGhlIGluZGV4IG9mIHRoZQotICAgbmV4dCBjaGFyYWN0ZXIuICovCi0KLWludAotc2Jfc2tpcF9jb21tYSAoaWR4LCBwdHIpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpwdHI7Ci17Ci0gIHdoaWxlIChpZHggPCBwdHItPmxlbgotCSAmJiAocHRyLT5wdHJbaWR4XSA9PSAnICcKLQkgICAgIHx8IHB0ci0+cHRyW2lkeF0gPT0gJ1x0JykpCi0gICAgaWR4Kys7Ci0KLSAgaWYgKGlkeCA8IHB0ci0+bGVuCi0gICAgICAmJiBwdHItPnB0cltpZHhdID09ICcsJykKLSAgICBpZHgrKzsKLQotICB3aGlsZSAoaWR4IDwgcHRyLT5sZW4KLQkgJiYgKHB0ci0+cHRyW2lkeF0gPT0gJyAnCi0JICAgICB8fCBwdHItPnB0cltpZHhdID09ICdcdCcpKQotICAgIGlkeCsrOwotCi0gIHJldHVybiBpZHg7Ci19CmRpZmYgLS1naXQgYS9nYXMvc2IuaCBiL2dhcy9zYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZkYWYxLi4wMDAwMDAwCi0tLSBhL2dhcy9zYi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyogc2IuaCAtIGhlYWRlciBmaWxlIGZvciBzdHJpbmcgYnVmZmVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcwotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZuZGVmIFNCX0gKLQotI2RlZmluZSBTQl9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIHN0cmluZyBibG9ja3MKLQotICAgSSBoYWQgYSBjb3VwbGUgb2YgY2hvaWNlcyB3aGVuIGRlY2lkaW5nIHVwb24gdGhpcyBkYXRhIHN0cnVjdHVyZS4KLSAgIGdhcyB1c2VzIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIGZvciBhbGwgaXRzIGludGVybmFsIHdvcmsuICBUaGlzCi0gICBvZnRlbiBtZWFucyB0aGF0IHBhcnRzIG9mIHRoZSBwcm9ncmFtIHRoYXQgd2FudCB0byBleGFtaW5lCi0gICBzdWJzdHJpbmdzIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgZGF0YSBpbiB0aGUgc3RyaW5nIHRvIGRvIHRoZQotICAgcmlnaHQgdGhpbmcgKGEgY29tbW9uIG9wZXJhdGlvbiBpcyB0byBzaW5nbGUgb3V0IGEgYml0IG9mIHRleHQgYnkKLSAgIHNhdmluZyBhd2F5IHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQsIG51bGxpbmcgaXQgb3V0LCBvcGVyYXRpbmcgb24KLSAgIHRoZSBzdWJzdHJpbmcgYW5kIHRoZW4gcmVwbGFjaW5nIHRoZSBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVuZGVyIHRoZQotICAgbnVsbCkuICBUaGlzIGlzIGEgcGFpbiBhbmQgSSByZW1lbWJlciBhIGxvYWQgb2YgcHJvYmxlbXMgdGhhdCBJIGhhZCB3aXRoCi0gICBjb2RlIGluIGdhcyB3aGljaCBhbG1vc3QgZ290IHRoaXMgcmlnaHQuICBBbHNvLCBpdCdzIGhhcmRlciB0byBncm93IGFuZAotICAgYWxsb2NhdGUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MgZWZmaWNpZW50bHkuCi0KLSAgIE9ic3RhY2tzIHByb3ZpZGUgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG5lZWRlZCwgYnV0IGFyZSB0b28KLSAgIGNvbXBsaWNhdGVkLCBoZW5jZSB0aGUgc2IuCi0KLSAgIEFuIHNiIGlzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLCBhbmQgaXMgaW5pdGlhbHplZCB0byBwb2ludCB0byBhbgotICAgc2JfZWxlbWVudC4gIHNiX2VsZW1lbnRzIGFyZSBrZXB0IG9uIGEgZnJlZSBsaXN0cywgYW5kIHVzZWQgd2hlbgotICAgbmVlZGVkLCByZXBsYWNlZCBvbnRvIHRoZSBmcmVlIGxpc3Qgd2hlbiB1bnVzZWQuCi0gKi8KLQotI2RlZmluZSBzYl9tYXhfcG93ZXJfdHdvICAgIDMwCS8qIGRvbid0IGFsbG93IHN0cmluZ3MgbW9yZSB0aGFuCi0JCQkgICAgICAgICAgIDJec2JfbWF4X3Bvd2VyX3R3byBsb25nICovCi0vKiBzdHJ1Y3R1cmUgb2YgYW4gc2IgKi8KLXR5cGVkZWYgc3RydWN0IHNiCi0gIHsKLSAgICBjaGFyICpwdHI7CQkJLyogcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAqLwotICAgIGludCBsZW47CQkJLyogaG93IG11Y2ggaXMgdXNlZC4gKi8KLSAgICBpbnQgcG90OwkJCS8qIHRoZSBtYXhpbXVtIGxlbmd0aCBpcyAxPDxwb3QgKi8KLSAgICBzdHJ1Y3QgbGUgKml0ZW07Ci0gIH0KLXNiOwotCi0vKiBTdHJ1Y3R1cmUgb2YgdGhlIGZyZWUgbGlzdCBvYmplY3Qgb2YgYW4gc2IgKi8KLXR5cGVkZWYgc3RydWN0IGxlCi0gIHsKLSAgICBzdHJ1Y3QgbGUgKm5leHQ7Ci0gICAgaW50IHNpemU7Ci0gICAgY2hhciBkYXRhWzFdOwotICB9Ci1zYl9lbGVtZW50OwotCi0vKiBUaGUgZnJlZSBsaXN0ICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc2JfZWxlbWVudCAqc2l6ZVtzYl9tYXhfcG93ZXJfdHdvXTsKLSAgfSBzYl9saXN0X3ZlY3RvcjsKLQotZXh0ZXJuIGludCBzdHJpbmdfY291bnRbc2JfbWF4X3Bvd2VyX3R3b107Ci0KLWV4dGVybiB2b2lkIHNiX2J1aWxkIFBBUkFNUyAoKHNiICosIGludCkpOwotZXh0ZXJuIHZvaWQgc2JfbmV3IFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiB2b2lkIHNiX2tpbGwgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIHZvaWQgc2JfYWRkX3NiIFBBUkFNUyAoKHNiICosIHNiICopKTsKLWV4dGVybiB2b2lkIHNiX3Jlc2V0IFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiB2b2lkIHNiX2FkZF9jaGFyIFBBUkFNUyAoKHNiICosIGludCkpOwotZXh0ZXJuIHZvaWQgc2JfYWRkX3N0cmluZyBQQVJBTVMgKChzYiAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHNiX2FkZF9idWZmZXIgUEFSQU1TICgoc2IgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIHNiX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgc2IgKikpOwotZXh0ZXJuIHZvaWQgc2JfcHJpbnRfYXQgUEFSQU1TICgoRklMRSAqLCBpbnQsIHNiICopKTsKLWV4dGVybiBjaGFyICpzYl9uYW1lIFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiBjaGFyICpzYl90ZXJtaW5hdGUgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIGludCBzYl9za2lwX3doaXRlIFBBUkFNUyAoKGludCwgc2IgKikpOwotZXh0ZXJuIGludCBzYl9za2lwX2NvbW1hIFBBUkFNUyAoKGludCwgc2IgKikpOwotCi0vKiBBY3R1YWxseSBpbiBpbnB1dC1zY3J1Yi5jLiAgKi8KLWV4dGVybiB2b2lkIGlucHV0X3NjcnViX2luY2x1ZGVfc2IgUEFSQU1TICgoc2IgKiwgY2hhciAqKSk7Ci0KLSNlbmRpZiAvKiBTQl9IICovCmRpZmYgLS1naXQgYS9nYXMvc3RhYnMuYyBiL2dhcy9zdGFicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ5YTBiLi4wMDAwMDAwCi0tLSBhL2dhcy9zdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLS8qIEdlbmVyaWMgc3RhYnMgcGFyc2luZyBmb3IgZ2FzLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi1vciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotLyogV2UgbmVlZCB0aGlzLCBkZXNwaXRlIHRoZSBhcHBhcmVudCBvYmplY3QgZm9ybWF0IGRlcGVuZGVuY3ksIHNpbmNlCi0gICBpdCBkZWZpbmVzIHN0YWIgdHlwZXMsIHdoaWNoIGFsbCBvYmplY3QgZm9ybWF0cyBjYW4gdXNlIG5vdy4gKi8KLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotc3RhdGljIHZvaWQgc19zdGFiX2dlbmVyaWMgUEFSQU1TICgoaW50LCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfYXNtX2ZpbGUgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLQotLyogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIG5hbWVzIHVzZWQgZm9yIHRoZSBzdGFiIHNlY3Rpb25zLiAgKi8KLSNpZm5kZWYgU1RBQl9TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TRUNUSU9OX05BTUUgIi5zdGFiIgotI2VuZGlmCi0KLSNpZm5kZWYgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSAiLnN0YWJzdHIiCi0jZW5kaWYKLQotLyogTm9uLXplcm8gaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIC5mdW5jIGZ1bmN0aW9uLCBpbiB3aGljaCBjYXNlCi0gICBzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vIGVtaXRzIGZ1bmN0aW9uIHJlbGF0aXZlIGxpbmUgbnVtYmVyIHN0YWJzLgotICAgT3RoZXJ3aXNlIGl0IGVtaXRzIGxpbmUgbnVtYmVyIHN0YWJzIHdpdGggYWJzb2x1dGUgYWRkcmVzc2VzLiAgTm90ZSB0aGF0Ci0gICBib3RoIGNhc2VzIG9ubHkgYXBwbHkgdG8gYXNzZW1ibGVyIGNvZGUgYXNzZW1ibGVkIHdpdGggLWdzdGFicy4gICovCi1zdGF0aWMgaW50IGluX2RvdF9mdW5jX3A7Ci0KLS8qIExhYmVsIGF0IHN0YXJ0IG9mIGN1cnJlbnQgZnVuY3Rpb24gaWYgaW5fZG90X2Z1bmNfcCAhPSAwLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjdXJyZW50X2Z1bmN0aW9uX2xhYmVsOwotCi0vKgotICogSGFuZGxlIC5zdGFiWCBkaXJlY3RpdmVzLCB3aGljaCB1c2VkIHRvIGJlIG9wZW4tY29kZWQuCi0gKiBTbyBtdWNoIGNyZWVwaW5nIGZlYXR1cmlzbSBvdmVybG9hZGVkIHRoZSBzZW1hbnRpY3MgdGhhdCB3ZSBkZWNpZGVkCi0gKiB0byBwdXQgYWxsIC5zdGFiWCB0aGlua2luZyBpbiBvbmUgcGxhY2UuIEhlcmUuCi0gKgotICogV2UgdHJ5IHRvIG1ha2UgYW55IC5zdGFiWCBkaXJlY3RpdmUgbGVnYWwuIE90aGVyIHBlb3BsZSdzIEFTIHdpbGwgb2Z0ZW4KLSAqIGRvIGFzc2VtYmx5LXRpbWUgY29uc2lzdGVuY3kgY2hlY2tzOiBlZyBhc3NpZ25pbmcgbWVhbmluZyB0byBuX3R5cGUgYml0cwotICogYW5kICJwcm90ZWN0aW5nIiB5b3UgZnJvbSBzZXR0aW5nIHRoZW0gdG8gY2VydGFpbiB2YWx1ZXMuIChUaGV5IGFsc28gemVybwotICogY2VydGFpbiBiaXRzIGJlZm9yZSBlbWl0dGluZyBzeW1ib2xzLiBUdXQgdHV0LikKLSAqCi0gKiBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBhYnNvbHV0ZSB3ZSBlaXRoZXIgZ3JpcGUgb3IgdXNlIHRoZSByZWxvY2F0aW9uCi0gKiBpbmZvcm1hdGlvbi4gT3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycyBzaWxlbnRseSBmb3JnZXQgaW5mb3JtYXRpb24gdGhleQotICogZG9uJ3QgbmVlZCBhbmQgaW52ZW50IGluZm9ybWF0aW9uIHRoZXkgbmVlZCB0aGF0IHlvdSBkaWRuJ3Qgc3VwcGx5LgotICovCi0KLS8qCi0gKiBCdWlsZCBhIHN0cmluZyBkaWN0aW9uYXJ5IGVudHJ5IGZvciBhIC5zdGFiWCBzeW1ib2wuCi0gKiBUaGUgc3ltYm9sIGlzIGFkZGVkIHRvIHRoZSAuPHNlY25hbWU+c3RyIHNlY3Rpb24uCi0gKi8KLQotI2lmbmRlZiBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMAotI2VuZGlmCi0KLXVuc2lnbmVkIGludAotZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoc3RyaW5nLCBzdGFic3RyX3NlY25hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgY29uc3QgY2hhciAqc3RhYnN0cl9zZWNuYW1lOwotewotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgcmV0dmFsOwotICBzZWdUIHNhdmVfc2VnOwotICBzdWJzZWdUIHNhdmVfc3Vic2VnOwotICBzZWdUIHNlZzsKLSAgY2hhciAqcDsKLQotICBpZiAoISBTRVBBUkFURV9TVEFCX1NFQ1RJT05TKQotICAgIGFib3J0ICgpOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoc3RyaW5nKTsKLQotICBzYXZlX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICAvKiBDcmVhdGUgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24uICAqLwotICBzZWcgPSBzdWJzZWdfbmV3IChzdGFic3RyX3NlY25hbWUsIDApOwotCi0gIHJldHZhbCA9IHNlZ19pbmZvIChzZWcpLT5zdGFidS5zdGFiX3N0cmluZ19zaXplOwotICBpZiAocmV0dmFsIDw9IDApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaXJzdCBzdHJpbmcgaXMgZW1wdHkuICAqLwotICAgICAgcCA9IGZyYWdfbW9yZSAoMSk7Ci0gICAgICAqcCA9IDA7Ci0gICAgICByZXR2YWwgPSBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZSA9IDE7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywgU0VDX1JFQURPTkxZIHwgU0VDX0RFQlVHR0lORyk7Ci0gICAgICBpZiAoc2VnLT5uYW1lID09IHN0YWJzdHJfc2VjbmFtZSkKLQlzZWctPm5hbWUgPSB4c3RyZHVwIChzdGFic3RyX3NlY25hbWUpOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChsZW5ndGggPiAwKQotICAgIHsJCQkJLyogT3JkaW5hcnkgY2FzZS4gKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOwotICAgICAgc3RyY3B5IChwLCBzdHJpbmcpOwotCi0gICAgICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZSArPSBsZW5ndGggKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHJldHZhbCA9IDA7Ci0KLSAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0jaWZkZWYgQU9VVF9TVEFCUwotI2lmbmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0jZGVmaW5lIE9CSl9QUk9DRVNTX1NUQUIoU0VHLFcsUyxULE8sRCkJYW91dF9wcm9jZXNzX3N0YWIoVyxTLFQsTyxEKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGFvdXRfcHJvY2Vzc19zdGFiIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1hb3V0X3Byb2Nlc3Nfc3RhYiAod2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykKLSAgICAgaW50IHdoYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHR5cGUsIG90aGVyLCBkZXNjOwotewotICAvKiBQdXQgdGhlIHN0YWIgaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICAvKiBDcmVhdGUgdGhlIHN5bWJvbCBub3csIGJ1dCBvbmx5IGluc2VydCBpdCBpbnRvIHRoZSBzeW1ib2wgY2hhaW4KLSAgICAgYWZ0ZXIgYW55IHN5bWJvbHMgbWVudGlvbmVkIGluIHRoZSB2YWx1ZSBleHByZXNzaW9uIGdldCBpbnRvIHRoZQotICAgICBzeW1ib2wgY2hhaW4uICBUaGlzIGlzIHRvIGF2b2lkICJjb250aW51YXRpb24gc3ltYm9scyIgKHdoZXJlIG9uZQotICAgICBlbmRzIGluICJcIiBhbmQgdGhlIGRlYnVnIGluZm8gaXMgY29udGludWVkIGluIHRoZSBuZXh0IC5zdGFicwotICAgICBkaXJlY3RpdmUpIGZyb20gYmVpbmcgc2VwYXJhdGVkIGJ5IG90aGVyIHJhbmRvbSBzeW1ib2xzLiAgKi8KLSAgc3ltYm9sID0gc3ltYm9sX2NyZWF0ZSAoc3RyaW5nLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwKLQkJCSAgKHN0cnVjdCBmcmFnICopIE5VTEwpOwotICBpZiAod2hhdCA9PSAncycgfHwgd2hhdCA9PSAnbicpCi0gICAgewotICAgICAgLyogUGljayB1cCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbGluZS4gICovCi0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHBzZXVkb19zZXQgKHN5bWJvbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogLnN0YWJkIHNldHMgdGhlIG5hbWUgdG8gTlVMTC4gIFdoeT8gICovCi0gICAgICBTX1NFVF9OQU1FIChzeW1ib2wsIE5VTEwpOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2wsIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2wsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgfQotCi0gIHN5bWJvbF9hcHBlbmQgKHN5bWJvbCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotICBTX1NFVF9UWVBFIChzeW1ib2wsIHR5cGUpOwotICBTX1NFVF9PVEhFUiAoc3ltYm9sLCBvdGhlcik7Ci0gIFNfU0VUX0RFU0MgKHN5bWJvbCwgZGVzYyk7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBjYW4gaGFuZGxlIGRpZmZlcmVudCBraW5kcyBvZiBzdGFicyAocyxuLGQpIGFuZCBkaWZmZXJlbnQKLSAgIGtpbmRzIG9mIHN0YWIgc2VjdGlvbnMuICovCi0KLXN0YXRpYyB2b2lkIAotc19zdGFiX2dlbmVyaWMgKHdoYXQsIHN0YWJfc2VjbmFtZSwgc3RhYnN0cl9zZWNuYW1lKQotICAgICBpbnQgd2hhdDsKLSAgICAgY2hhciAqc3RhYl9zZWNuYW1lOwotICAgICBjaGFyICpzdGFic3RyX3NlY25hbWU7Ci17Ci0gIGxvbmcgbG9uZ2ludDsKLSAgY2hhciAqc3RyaW5nOwotICBpbnQgdHlwZTsKLSAgaW50IG90aGVyOwotICBpbnQgZGVzYzsKLQotICAvKiBUaGUgZ2VuZXJhbCBmb3JtYXQgaXM6Ci0gICAgIC5zdGFicyAiU1RSSU5HIixUWVBFLE9USEVSLERFU0MsVkFMVUUKLSAgICAgLnN0YWJuIFRZUEUsT1RIRVIsREVTQyxWQUxVRQotICAgICAuc3RhYmQgVFlQRSxPVEhFUixERVNDCi0gICAgIEF0IHRoaXMgcG9pbnQgaW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyBhZnRlciB0aGUgcHNldWRvLW9wIGFuZAotICAgICBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZS4gIFRoZSBhcmd1bWVudCB3aGF0IGlzIG9uZSBvZiAncycsICduJyBvcgotICAgICAnZCcgaW5kaWNhdGluZyB3aGljaCB0eXBlIG9mIC5zdGFiIHRoaXMgaXMuICAqLwotCi0gIGlmICh3aGF0ICE9ICdzJykKLSAgICBzdHJpbmcgPSAiIjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSAgICAgIHN0cmluZyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuZ3RoKTsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc193YXJuIChfKCIuc3RhYnM6IE1pc3NpbmcgY29tbWEiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmbG9uZ2ludCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiKSwgd2hhdCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgdHlwZSA9IGxvbmdpbnQ7Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmbG9uZ2ludCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiKSwgd2hhdCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgb3RoZXIgPSBsb25naW50OwotCi0gIGRlc2MgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQotICAgIHsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBhc193YXJuIChfKCIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIiksIHdoYXQpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0KLSNpZmRlZiBUQ19QUEMKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFNvbGFyaXMgb24gUG93ZXJQQyBoYXMgZGVjaWRlZCB0aGF0IC5zdGFiZCBjYW4gdGFrZSA0IGFyZ3VtZW50cywgc28gaWYgd2Ugd2VyZQotICAgICBnaXZlbiA0IGFyZ3VtZW50cywgbWFrZSBpdCBhIC5zdGFibiAqLwotICBlbHNlIGlmICh3aGF0ID09ICdkJykKLSAgICB7Ci0gICAgICBjaGFyICpzYXZlX2xvY2F0aW9uID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB3aGF0ID0gJ24nOwotCX0KLSAgICAgIGVsc2UKLQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2xvY2F0aW9uOwotICAgIH0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0jZW5kaWYgLyogVENfUFBDICovCi0KLSNpZm5kZWYgTk9fTElTVElORwotICBpZiAobGlzdGluZykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgTl9TTElORToKLQkgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGRlc2MpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NPOgotCWNhc2UgTl9TT0w6Ci0JICBsaXN0aW5nX3NvdXJjZV9maWxlIChzdHJpbmcpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiAhIE5PX0xJU1RJTkcgKi8KLQotICAvKiBXZSBoYXZlIG5vdyBnYXRoZXJlZCB0aGUgdHlwZSwgb3RoZXIsIGFuZCBkZXNjIGluZm9ybWF0aW9uLiAgRm9yCi0gICAgIC5zdGFicyBvciAuc3RhYm4sIGlucHV0X2xpbmVfcG9pbnRlciBpcyBub3cgcG9pbnRpbmcgYXQgdGhlCi0gICAgIHZhbHVlLiAgKi8KLQotICBpZiAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUykKLSAgICAvKiBPdXRwdXQgdGhlIHN0YWIgaW5mb3JtYXRpb24gaW4gYSBzZXBhcmF0ZSBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkCi0gICAgICAgYXQgbGVhc3QgZm9yIENPRkYgYW5kIEVMRi4gICovCi0gICAgewotICAgICAgc2VnVCBzYXZlZF9zZWcgPSBub3dfc2VnOwotICAgICAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgZnJhZ1MgKnNhdmVkX2ZyYWcgPSBmcmFnX25vdzsKLSAgICAgIHZhbHVlVCBkb3Q7Ci0gICAgICBzZWdUIHNlZzsKLSAgICAgIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICBzdGF0aWMgc2VnVCBjYWNoZWRfc2VjOwotICAgICAgc3RhdGljIGNoYXIgKmNhY2hlZF9zZWNuYW1lOwotCi0gICAgICBkb3QgPSBmcmFnX25vd19maXggKCk7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICAgICAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGNhY2hlZF9zZWNuYW1lICYmICFzdHJjbXAgKGNhY2hlZF9zZWNuYW1lLCBzdGFiX3NlY25hbWUpKQotCXsKLQkgIHNlZyA9IGNhY2hlZF9zZWM7Ci0JICBzdWJzZWdfc2V0IChzZWcsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzZWcgPSBzdWJzZWdfbmV3IChzdGFiX3NlY25hbWUsIDApOwotCSAgaWYgKGNhY2hlZF9zZWNuYW1lKQotCSAgICBmcmVlIChjYWNoZWRfc2VjbmFtZSk7Ci0JICBjYWNoZWRfc2VjbmFtZSA9IHhzdHJkdXAgKHN0YWJfc2VjbmFtZSk7Ci0JICBjYWNoZWRfc2VjID0gc2VnOwotCX0KLQotICAgICAgaWYgKCEgc2VnX2luZm8gKHNlZyktPmhhZG9uZSkKLQl7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCQkgU0VDX1JFQURPTkxZIHwgU0VDX1JFTE9DIHwgU0VDX0RFQlVHR0lORyk7Ci0jZW5kaWYKLSNpZmRlZiBJTklUX1NUQUJfU0VDVElPTgotCSAgSU5JVF9TVEFCX1NFQ1RJT04gKHNlZyk7Ci0jZW5kaWYKLQkgIHNlZ19pbmZvIChzZWcpLT5oYWRvbmUgPSAxOwotCX0KLQotICAgICAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoc3RyaW5nLCBzdGFic3RyX3NlY25hbWUpOwotICAgICAgaWYgKHdoYXQgPT0gJ3MnKQotCXsKLQkgIC8qIHJlbGVhc2UgdGhlIHN0cmluZyAqLwotCSAgb2JzdGFja19mcmVlICgmbm90ZXMsIHN0cmluZyk7Ci0JfQotCi0gICAgICAvKiBBdCBsZWFzdCBmb3Igbm93LCBzdGFicyBpbiBhIHNwZWNpYWwgc3RhYiBzZWN0aW9uIGFyZSBhbHdheXMKLQkgb3V0cHV0IGFzIDEyIGJ5dGUgYmxvY2tzIG9mIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKDgpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBzdHJvZmYsIDQpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNCwgKHZhbHVlVCkgdHlwZSwgMSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyA1LCAodmFsdWVUKSBvdGhlciwgMSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyA2LCAodmFsdWVUKSBkZXNjLCAyKTsKLQotICAgICAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQotCXsKLQkgIC8qIFBpY2sgdXAgdGhlIHZhbHVlIGZyb20gdGhlIGlucHV0IGxpbmUuICAqLwotCSAgY29ucyAoNCk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqZmFrZTsKLQkgIHN5bWJvbFMgKnN5bWJvbDsKLQkgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgLyogQXJyYW5nZSBmb3IgYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbG9jYXRpb24uICAqLwotCSAgZmFrZSA9IEZBS0VfTEFCRUxfTkFNRTsKLQkgIHN5bWJvbCA9IHN5bWJvbF9uZXcgKGZha2UsIHNhdmVkX3NlZywgZG90LCBzYXZlZF9mcmFnKTsKLQotCSAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cC5YX2FkZF9zeW1ib2wgPSBzeW1ib2w7Ci0JICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLQotCSAgZW1pdF9leHByICgmZXhwLCA0KTsKLQl9Ci0KLSNpZmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0gICAgICBPQkpfUFJPQ0VTU19TVEFCIChzZWcsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpOwotI2VuZGlmCi0KLSAgICAgIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgT0JKX1BST0NFU1NfU1RBQgotICAgICAgT0JKX1BST0NFU1NfU1RBQiAoMCwgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYyk7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUmVndWxhciBzdGFiIGRpcmVjdGl2ZS4gKi8KLQotdm9pZAotc19zdGFiICh3aGF0KQotICAgICBpbnQgd2hhdDsKLXsKLSAgc19zdGFiX2dlbmVyaWMgKHdoYXQsIFNUQUJfU0VDVElPTl9OQU1FLCBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUpOwotfQotCi0vKiAiRXh0ZW5kZWQgc3RhYnMiLCB1c2VkIGluIFNvbGFyaXMgb25seSBub3cuICovCi0KLXZvaWQKLXNfeHN0YWIgKHdoYXQpCi0gICAgIGludCB3aGF0OwotewotICBpbnQgbGVuZ3RoOwotICBjaGFyICpzdGFiX3NlY25hbWUsICpzdGFic3RyX3NlY25hbWU7Ci0gIHN0YXRpYyBjaGFyICpzYXZlZF9zZWNuYW1lLCAqc2F2ZWRfc3Ryc2VjbmFtZTsKLQotICAvKiBAQCBNRU1PUlkgTEVBSzogVGhpcyBhbGxvY2F0ZXMgYSBjb3B5IG9mIHRoZSBzdHJpbmcsIGJ1dCBpbiBtb3N0Ci0gICAgIGNhc2VzIGl0IHdpbGwgYmUgdGhlIHNhbWUgc3RyaW5nLCBzbyB3ZSBjb3VsZCByZWxlYXNlIHRoZSBzdG9yYWdlCi0gICAgIGJhY2sgdG8gdGhlIG9ic3RhY2sgaXQgY2FtZSBmcm9tLiAgKi8KLSAgc3RhYl9zZWNuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW5ndGgpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY29tbWEgbWlzc2luZyBpbiAueHN0YWJzIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVG8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uLCBzaW1wbHkgYWRkICJzdHIiIHRvCi0gICAgIHRoZSBzdGFiIHNlY3Rpb24gbmFtZS4gICovCi0gIGlmIChzYXZlZF9zZWNuYW1lID09IDAgfHwgc3RyY21wIChzYXZlZF9zZWNuYW1lLCBzdGFiX3NlY25hbWUpKQotICAgIHsKLSAgICAgIHN0YWJzdHJfc2VjbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RhYl9zZWNuYW1lKSArIDQpOwotICAgICAgc3RyY3B5IChzdGFic3RyX3NlY25hbWUsIHN0YWJfc2VjbmFtZSk7Ci0gICAgICBzdHJjYXQgKHN0YWJzdHJfc2VjbmFtZSwgInN0ciIpOwotICAgICAgaWYgKHNhdmVkX3NlY25hbWUpCi0JewotCSAgZnJlZSAoc2F2ZWRfc2VjbmFtZSk7Ci0JICBmcmVlIChzYXZlZF9zdHJzZWNuYW1lKTsKLQl9Ci0gICAgICBzYXZlZF9zZWNuYW1lID0gc3RhYl9zZWNuYW1lOwotICAgICAgc2F2ZWRfc3Ryc2VjbmFtZSA9IHN0YWJzdHJfc2VjbmFtZTsKLSAgICB9Ci0gIHNfc3RhYl9nZW5lcmljICh3aGF0LCBzYXZlZF9zZWNuYW1lLCBzYXZlZF9zdHJzZWNuYW1lKTsKLX0KLQotI2lmZGVmIFNfU0VUX0RFU0MKLQotLyogRnJvYiBpbnZlbnRlZCBhdCBSTVMnIHJlcXVlc3QuIFNldCB0aGUgbl9kZXNjIG9mIGEgc3ltYm9sLiAgKi8KLQotdm9pZCAKLXNfZGVzYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCB0ZW1wOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKnAgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgICpwID0gMDsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIHRlbXApOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19kZXNjKCkgKi8KLQotI2VuZGlmIC8qIGRlZmluZWQgKFNfU0VUX0RFU0MpICovCi0KLS8qIEdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgdGhlIG1haW4gc291cmNlIGZpbGUuICAqLwotCi12b2lkCi1zdGFic19nZW5lcmF0ZV9hc21fZmlsZSAoKQotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmVubyk7Ci0gIGdlbmVyYXRlX2FzbV9maWxlIChOX1NPLCBmaWxlKTsKLX0KLQotLyogR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSB0aGUgc291cmNlIGZpbGUuCi0gICBUWVBFIGlzIG9uZSBvZiBOX1NPLCBOX1NPTC4gICovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9hc21fZmlsZSAodHlwZSwgZmlsZSkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmZpbGU7Ci17Ci0gIHN0YXRpYyBjaGFyICpsYXN0X2ZpbGU7Ci0gIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7Ci0gIGNoYXIgKmhvbGQ7Ci0gIGNoYXIgYnVmWzEwMF07Ci0gIGNoYXIgc3ltWzMwXTsKLQotICAvKiBSYXRoZXIgdGhhbiB0cnkgdG8gZG8gdGhpcyBpbiBzb21lIGVmZmljaWVudCBmYXNoaW9uLCB3ZSBqdXN0Ci0gICAgIGdlbmVyYXRlIGEgc3RyaW5nIGFuZCB0aGVuIHBhcnNlIGl0IGFnYWluLiAgVGhhdCBsZXRzIHVzIHVzZSB0aGUKLSAgICAgZXhpc3Rpbmcgc3RhYnMgaG9vaywgd2hpY2ggZXhwZWN0IHRvIHNlZSBhIHN0cmluZywgcmF0aGVyIHRoYW4KLSAgICAgaW52ZW50aW5nIG5ldyBvbmVzLiAgKi8KLQotICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChsYXN0X2ZpbGUgPT0gTlVMTAotICAgICAgfHwgc3RyY21wIChsYXN0X2ZpbGUsIGZpbGUpICE9IDApCi0gICAgewotICAgICAgc3ByaW50ZiAoc3ltLCAiJXNGJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KTsKLSAgICAgICsrbGFiZWxfY291bnQ7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlwiJXNcIiwlZCwwLDAsJXNcbiIsIGZpbGUsIHR5cGUsIHN5bSk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gICAgICBzX3N0YWIgKCdzJyk7Ci0gICAgICBjb2xvbiAoc3ltKTsKLQotICAgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQotCWZyZWUgKGxhc3RfZmlsZSk7Ci0gICAgICBsYXN0X2ZpbGUgPSB4c3RyZHVwIChmaWxlKTsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLX0KLQotLyogR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBsaW5lLiAgVGhpcyBpcwotICAgdXNlZCB0byBwcm9kdWNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibGVyIGZpbGUuICAqLwotCi12b2lkCi1zdGFic19nZW5lcmF0ZV9hc21fbGluZW5vICgpCi17Ci0gIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7Ci0gIGNoYXIgKmhvbGQ7Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBzeW1bMzBdOwotCi0gIC8qIFJhdGhlciB0aGFuIHRyeSB0byBkbyB0aGlzIGluIHNvbWUgZWZmaWNpZW50IGZhc2hpb24sIHdlIGp1c3QKLSAgICAgZ2VuZXJhdGUgYSBzdHJpbmcgYW5kIHRoZW4gcGFyc2UgaXQgYWdhaW4uICBUaGF0IGxldHMgdXMgdXNlIHRoZQotICAgICBleGlzdGluZyBzdGFicyBob29rLCB3aGljaCBleHBlY3QgdG8gc2VlIGEgc3RyaW5nLCByYXRoZXIgdGhhbgotICAgICBpbnZlbnRpbmcgbmV3IG9uZXMuICAqLwotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZW5vKTsKLQotICBnZW5lcmF0ZV9hc21fZmlsZSAoTl9TT0wsIGZpbGUpOwotCi0gIHNwcmludGYgKHN5bSwgIiVzTCVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCk7Ci0gICsrbGFiZWxfY291bnQ7Ci0KLSAgaWYgKGluX2RvdF9mdW5jX3ApCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgYWxsb2NhICgxMDAgKyBzdHJsZW4gKGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwpKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVkLDAsJWQsJXMtJXNcbiIsIE5fU0xJTkUsIGxpbmVubywKLQkgICAgICAgc3ltLCBjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKDEwMCk7Ci0gICAgICBzcHJpbnRmIChidWYsICIlZCwwLCVkLCVzXG4iLCBOX1NMSU5FLCBsaW5lbm8sIHN5bSk7Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gIHNfc3RhYiAoJ24nKTsKLSAgY29sb24gKHN5bSk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLX0KLQotLyogRW1pdCBhIGZ1bmN0aW9uIHN0YWIuCi0gICBBbGwgYXNzZW1ibGVyIGZ1bmN0aW9ucyBhcmUgYXNzdW1lZCB0byBoYXZlIHJldHVybiB0eXBlIGB2b2lkJy4gICovCi0KLXZvaWQKLXN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jIChmdW5jbmFtZSwgc3RhcnRsYWJuYW1lKQotICAgICBjb25zdCBjaGFyICpmdW5jbmFtZTsKLSAgICAgY29uc3QgY2hhciAqc3RhcnRsYWJuYW1lOwotewotICBzdGF0aWMgaW50IHZvaWRfZW1pdHRlZF9wOwotICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0KLSAgaWYgKCEgdm9pZF9lbWl0dGVkX3ApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gIlwidm9pZDp0MT0xXCIsMTI4LDAsMCwwIjsKLSAgICAgIHNfc3RhYiAoJ3MnKTsKLSAgICAgIHZvaWRfZW1pdHRlZF9wID0gMTsKLSAgICB9Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZW5vKTsKLSAgYXNwcmludGYgKCZidWYsICJcIiVzOkYxXCIsJWQsMCwlZCwlcyIsCi0JICAgIGZ1bmNuYW1lLCBOX0ZVTiwgbGluZW5vICsgMSwgc3RhcnRsYWJuYW1lKTsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmOwotICBzX3N0YWIgKCdzJyk7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLSAgY3VycmVudF9mdW5jdGlvbl9sYWJlbCA9IHhzdHJkdXAgKHN0YXJ0bGFibmFtZSk7Ci0gIGluX2RvdF9mdW5jX3AgPSAxOwotfQotCi0vKiBFbWl0IGEgc3RhYiB0byByZWNvcmQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLiAgKi8KLQotdm9pZAotc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgKGZ1bmNuYW1lLCBzdGFydGxhYm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0bGFibmFtZTsKLXsKLSAgc3RhdGljIGludCBsYWJlbF9jb3VudDsKLSAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqYnVmOwotICBjaGFyIHN5bVszMF07Ci0KLSAgc3ByaW50ZiAoc3ltLCAiJXNlbmRmdW5jJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KTsKLSAgKytsYWJlbF9jb3VudDsKLSAgY29sb24gKHN5bSk7Ci0KLSAgYXNwcmludGYgKCZidWYsICJcIlwiLCVkLDAsMCwlcy0lcyIsIE5fRlVOLCBzeW0sIHN0YXJ0bGFibmFtZSk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgc19zdGFiICgncycpOwotICBmcmVlIChidWYpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0gIGluX2RvdF9mdW5jX3AgPSAwOwotICBjdXJyZW50X2Z1bmN0aW9uX2xhYmVsID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9zdGFtcC1oLmluIGIvZ2FzL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2dhcy9zdHJ1Yy1zeW1ib2wuaCBiL2dhcy9zdHJ1Yy1zeW1ib2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3MzU2Ni4uMDAwMDAwMAotLS0gYS9nYXMvc3RydWMtc3ltYm9sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyogc3RydWN0X3N5bWJvbC5oIC0gSW50ZXJuYWwgc3ltYm9sIHN0cnVjdHVyZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX19zdHJ1Y19zeW1ib2xfaF9fCi0jZGVmaW5lIF9fc3RydWNfc3ltYm9sX2hfXwotCi0vKiBUaGUgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzeW1ib2wuICBOb3RlIHRoYXQgdGhlIHN5bWJvbCB0YWJsZQotICAgaG9sZHMgcG9pbnRlcnMgYm90aCB0byB0aGlzIGFuZCB0byBsb2NhbF9zeW1ib2wgc3RydWN0dXJlcy4gIFNlZQotICAgYmVsb3cuICAqLwotCi1zdHJ1Y3Qgc3ltYm9sCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBCRkQgc3ltYm9sICovCi0gIGFzeW1ib2wgKmJzeW07Ci0jZWxzZQotICAvKiBUaGUgKDQtb3JpZ2luKSBwb3NpdGlvbiBvZiBzeV9uYW1lIGluIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIG9iamVjdAotICAgICBmaWxlLiAgVGhpcyB3aWxsIGJlIDAgZm9yIChuYW1lbGVzcykgLnN0YWJkIHN5bWJvbHMuCi0KLSAgICAgTm90IHVzZWQgdW50aWwgd3JpdGVfb2JqZWN0X2ZpbGUoKSB0aW1lLiAqLwotICB1bnNpZ25lZCBsb25nIHN5X25hbWVfb2Zmc2V0OwotCi0gIC8qIFdoYXQgd2Ugd3JpdGUgaW4gLm8gZmlsZSAoaWYgcGVybWl0dGVkKS4gICovCi0gIG9ial9zeW1ib2xfdHlwZSBzeV9zeW1ib2w7Ci0KLSAgLyogVGhlIDI0IGJpdCBzeW1ib2wgbnVtYmVyLiAgU3ltYm9sIG51bWJlcnMgc3RhcnQgYXQgMCBhbmQgYXJlIHVuc2lnbmVkLiAqLwotICBsb25nIHN5X251bWJlcjsKLSNlbmRpZgotCi0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgZXhwcmVzc2lvblMgc3lfdmFsdWU7Ci0KLSAgLyogRm9yd2FyZHMgYW5kIChvcHRpb25hbGx5KSBiYWNrd2FyZHMgY2hhaW4gcG9pbnRlcnMuICAqLwotICBzdHJ1Y3Qgc3ltYm9sICpzeV9uZXh0OwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgc3RydWN0IHN5bWJvbCAqc3lfcHJldmlvdXM7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGZyYWcgdGhpcyBzeW1ib2wgaXMgYXR0YWNoZWQgdG8sIGlmIGFueS4KLSAgICAgT3RoZXJ3aXNlLCBOVUxMLiAgKi8KLSAgc3RydWN0IGZyYWcgKnN5X2ZyYWc7Ci0KLSAgdW5zaWduZWQgaW50IHdyaXR0ZW4gOiAxOwotICAvKiBXaGV0aGVyIHN5bWJvbCB2YWx1ZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlc29sdmVkICh1c2VkIGR1cmluZwotICAgICBmaW5hbCBwYXNzIG92ZXIgc3ltYm9sIHRhYmxlKS4gICovCi0gIHVuc2lnbmVkIGludCBzeV9yZXNvbHZlZCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCB2YWx1ZSBpcyBjdXJyZW50bHkgYmVpbmcgcmVzb2x2ZWQgKHVzZWQgdG8KLSAgICAgZGV0ZWN0IGxvb3BzIGluIHN5bWJvbCBkZXBlbmRlbmNpZXMpLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3Jlc29sdmluZyA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCB2YWx1ZSBpcyB1c2VkIGluIGEgcmVsb2MuICBUaGlzIGlzIHVzZWQgdG8KLSAgICAgZW5zdXJlIHRoYXQgc3ltYm9scyB1c2VkIGluIHJlbG9jcyBhcmUgd3JpdHRlbiBvdXQsIGV2ZW4gaWYgdGhleQotICAgICBhcmUgbG9jYWwgYW5kIHdvdWxkIG90aGVyd2lzZSBub3QgYmUuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfdXNlZF9pbl9yZWxvYyA6IDE7Ci0KLSAgLyogV2hldGhlciB0aGUgc3ltYm9sIGlzIHVzZWQgYXMgYW4gb3BlcmFuZCBvciBpbiBhbiBleHByZXNzaW9uLiAgCi0gICAgIE5PVEU6ICBOb3QgYWxsIHRoZSBiYWNrZW5kcyBrZWVwIHRoaXMgaW5mb3JtYXRpb24gYWNjdXJhdGU7Ci0gICAgIGJhY2tlbmRzIHdoaWNoIHVzZSB0aGlzIGJpdCBhcmUgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaXQgd2hlbgotICAgICBhIHN5bWJvbCBpcyB1c2VkIGluIGJhY2tlbmQgcm91dGluZXMuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfdXNlZCA6IDE7Ci0KLSAgLyogVGhpcyBpcyBzZXQgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIGFuIE1SSSBjb21tb24gc2VjdGlvbi4KLSAgICAgV2UgaGFuZGxlIHN1Y2ggc2VjdGlvbnMgYXMgc2luZ2xlIGNvbW1vbiBzeW1ib2xzLCBzbyBzeW1ib2xzCi0gICAgIGRlZmluZWQgd2l0aGluIHRoZW0gbXVzdCBiZSB0cmVhdGVkIHNwZWNpYWxseSBieSB0aGUgcmVsb2NhdGlvbgotICAgICByb3V0aW5lcy4gICovCi0gIHVuc2lnbmVkIGludCBzeV9tcmlfY29tbW9uIDogMTsKLQotI2lmZGVmIE9CSl9TWU1GSUVMRF9UWVBFCi0gIE9CSl9TWU1GSUVMRF9UWVBFIHN5X29iajsKLSNlbmRpZgotCi0jaWZkZWYgVENfU1lNRklFTERfVFlQRQotICBUQ19TWU1GSUVMRF9UWVBFIHN5X3RjOwotI2VuZGlmCi19OwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBBIHBvaW50ZXIgaW4gdGhlIHN5bWJvbCBtYXkgcG9pbnQgdG8gZWl0aGVyIGEgY29tcGxldGUgc3ltYm9sCi0gICAoc3RydWN0IHN5bWJvbCBhYm92ZSkgb3IgdG8gYSBsb2NhbCBzeW1ib2wgKHN0cnVjdCBsb2NhbF9zeW1ib2wKLSAgIGRlZmluZWQgaGVyZSkuICBUaGUgc3ltYm9sIGNvZGUgY2FuIGRldGVjdCB0aGUgY2FzZSBieSBleGFtaW5pbmcKLSAgIHRoZSBmaXJzdCBmaWVsZC4gIEl0IGlzIGFsd2F5cyBOVUxMIGZvciBhIGxvY2FsIHN5bWJvbC4KLQotICAgV2UgZG8gdGhpcyBiZWNhdXNlIHdlIG9yZGluYXJpbHkgb25seSBuZWVkIGEgc21hbGwgYW1vdW50IG9mCi0gICBpbmZvcm1hdGlvbiBmb3IgYSBsb2NhbCBzeW1ib2wuICBUaGUgc3ltYm9sIHRhYmxlIHRha2VzIHVwIGEgbG90IG9mCi0gICBzcGFjZSwgYW5kIHN0b3JpbmcgbGVzcyBpbmZvcm1hdGlvbiBmb3IgYSBsb2NhbCBzeW1ib2wgY2FuIG1ha2UgYQotICAgYmlnIGRpZmZlcmVuY2UgaW4gYXNzZW1ibGVyIG1lbW9yeSB1c2FnZSB3aGVuIGFzc2VtYmxpbmcgYSBsYXJnZQotICAgZmlsZS4gICovCi0KLXN0cnVjdCBsb2NhbF9zeW1ib2wKLXsKLSAgLyogVGhpcyBwb2ludGVyIGlzIGFsd2F5cyBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIGxvY2FsCi0gICAgIHN5bWJvbC4gICovCi0gIGFzeW1ib2wgKmxzeV9tYXJrZXI7Ci0KLSAgLyogVGhlIHN5bWJvbCBzZWN0aW9uLiAgVGhpcyBhbHNvIHNlcnZlcyBhcyBhIGZsYWcuICBJZiB0aGlzIGlzCi0gICAgIHJlZ19zZWN0aW9uLCB0aGVuIHRoaXMgc3ltYm9sIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgcmVndWxhcgotICAgICBzeW1ib2wsIGFuZCBzeV9zeW0gcG9pbnRzIHRvIGl0LiAgKi8KLSAgc2VnVCBsc3lfc2VjdGlvbjsKLQotICAvKiBUaGUgc3ltYm9sIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpsc3lfbmFtZTsKLQotICAvKiBUaGUgc3ltYm9sIGZyYWcgb3IgdGhlIHJlYWwgc3ltYm9sLCBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgaW4KLSAgICAgc3lfc2VjdGlvbi4gIElmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZnVsbHkgcmVzb2x2ZWQsIGxzeV9mcmFnIGlzCi0gICAgIHNldCB0byBOVUxMLiAgKi8KLSAgdW5pb24KLSAgewotICAgIGZyYWdTICpsc3lfZnJhZzsKLSAgICBzeW1ib2xTICpsc3lfc3ltOwotICB9IHU7Ci0KLSAgLyogVGhlIG9mZnNldCB3aXRoaW4gdGhlIGZyYWcuICAqLwotICB2YWx1ZVQgbHN5X29mZnNldDsKLX07Ci0KLSNkZWZpbmUgbG9jYWxfc3ltYm9sX2NvbnZlcnRlZF9wKGwpICgobCktPmxzeV9zZWN0aW9uID09IHJlZ19zZWN0aW9uKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfbWFya19jb252ZXJ0ZWQobCkgKChsKS0+bHN5X3NlY3Rpb24gPSByZWdfc2VjdGlvbikKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AobCkgKChsKS0+dS5sc3lfZnJhZyA9PSBOVUxMKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfbWFya19yZXNvbHZlZChsKSAoKGwpLT51LmxzeV9mcmFnID0gTlVMTCkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX2dldF9mcmFnKGwpICgobCktPnUubHN5X2ZyYWcpCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9zZXRfZnJhZyhsLCBmKSAoKGwpLT51LmxzeV9mcmFnID0gKGYpKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfZ2V0X3JlYWxfc3ltYm9sKGwpICgobCktPnUubHN5X3N5bSkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX3NldF9yZWFsX3N5bWJvbChsLCBzKSAoKGwpLT51LmxzeV9zeW0gPSAocykpCi0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNlbmRpZiAvKiBfX3N0cnVjX3N5bWJvbF9oX18gKi8KLQotLyogZW5kIG9mIHN0cnVjLXN5bWJvbC5oICovCmRpZmYgLS1naXQgYS9nYXMvc3Vic2Vncy5jIGIvZ2FzL3N1YnNlZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiZjcwZC4uMDAwMDAwMAotLS0gYS9nYXMvc3Vic2Vncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYzICswLDAgQEAKLS8qIHN1YnNlZ3MuYyAtIHN1YnNlZ21lbnRzIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBTZWdtZW50cyAmIHN1Yi1zZWdtZW50cy4KLSAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLWZyY2hhaW5TICpmcmNoYWluX3Jvb3QsICpmcmNoYWluX25vdzsKLQotc3RhdGljIHN0cnVjdCBvYnN0YWNrIGZyY2hhaW5zOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi1zZWdtZW50X2luZm9fdHlwZSBzZWdtZW50X2luZm9bU0VHX01BWElNVU1fT1JESU5BTF07Ci0KLSNlbHNlCi0vKiBDb21tZW50ZWQgaW4gInN1YnNlZ3MuaCIuICovCi1mcmNoYWluUyAqZGF0YTBfZnJjaGFpblAsICpic3MwX2ZyY2hhaW5QOwotCi0jZW5kaWYgLyogTUFOWV9TRUdNRU5UUyAqLwotY2hhciBjb25zdCAqY29uc3Qgc2VnX25hbWVbXSA9Ci17Ci0gICJhYnNvbHV0ZSIsCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICAiZTAiLCAiZTEiLCAiZTIiLCAiZTMiLCAiZTQiLCAiZTUiLCAiZTYiLCAiZTciLCAiZTgiLCAiZTkiLAotICAiZTEwIiwgImUxMSIsICJlMTIiLCAiZTEzIiwgImUxNCIsICJlMTUiLCAiZTE2IiwgImUxNyIsICJlMTgiLCAiZTE5IiwKLSAgImUyMCIsICJlMjEiLCAiZTIyIiwgImUyMyIsICJlMjQiLCAiZTI1IiwgImUyNiIsICJlMjciLCAiZTI4IiwgImUyOSIsCi0gICJlMzAiLCAiZTMxIiwgImUzMiIsICJlMzMiLCAiZTM0IiwgImUzNSIsICJlMzYiLCAiZTM3IiwgImUzOCIsICJlMzkiLAotI2Vsc2UKLSAgInRleHQiLAotICAiZGF0YSIsCi0gICJic3MiLAotI2VuZGlmIC8qIE1BTllfU0VHTUVOVFMgKi8KLSAgInVua25vd24iLAotICAiQVNTRU1CTEVSLUlOVEVSTkFMLUxPR0lDLUVSUk9SISIsCi0gICJleHByIiwKLSAgImRlYnVnIiwKLSAgInRyYW5zZmVydCB2ZWN0b3IgcHJlbG9hZCIsCi0gICJ0cmFuc2ZlcnQgdmVjdG9yIHBvc3Rsb2FkIiwKLSAgInJlZ2lzdGVyIiwKLSAgIiIsCi19OwkJCQkvKiBVc2VkIGJ5IGVycm9yIHJlcG9ydGVycywgZHVtcGVycyBldGMuICovCi0jZWxzZSAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIEdhcyBzZWdtZW50IGluZm9ybWF0aW9uIGZvciBiZmRfYWJzX3NlY3Rpb25fcHRyIGFuZAotICAgYmZkX3VuZF9zZWN0aW9uX3B0ci4gICovCi1zdGF0aWMgc2VnbWVudF9pbmZvX3R5cGUgKmFic19zZWdfaW5mbzsKLXN0YXRpYyBzZWdtZW50X2luZm9fdHlwZSAqdW5kX3NlZ19pbmZvOwotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgdm9pZCBzdWJzZWdfc2V0X3Jlc3QgUEFSQU1TICgoc2VnVCwgc3Vic2VnVCkpOwotCi1zdGF0aWMgZnJhZ1MgZHVtbXlfZnJhZzsKLQotc3RhdGljIGZyY2hhaW5TIGFic29sdXRlX2ZyY2hhaW47Ci0MCi12b2lkCi1zdWJzZWdzX2JlZ2luICgpCi17Ci0gIC8qIENoZWNrIHRhYmxlKHMpIHNlZ19uYW1lW10sIHNlZ19OX1RZUEVbXSBpcyBpbiBjb3JyZWN0IG9yZGVyICovCi0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBrbm93IChTRUdfQUJTT0xVVEUgPT0gMCk7Ci0gIGtub3cgKFNFR19URVhUID09IDEpOwotICBrbm93IChTRUdfREFUQSA9PSAyKTsKLSAga25vdyAoU0VHX0JTUyA9PSAzKTsKLSAga25vdyAoU0VHX1VOS05PV04gPT0gNCk7Ci0gIGtub3cgKFNFR19HT09GID09IDUpOwotICBrbm93IChTRUdfRVhQUiA9PSA2KTsKLSAga25vdyAoU0VHX0RFQlVHID09IDcpOwotICBrbm93IChTRUdfTlRWID09IDgpOwotICBrbm93IChTRUdfUFRWID09IDkpOwotICBrbm93IChTRUdfUkVHSVNURVIgPT0gMTApOwotICBrbm93IChTRUdfTUFYSU1VTV9PUkRJTkFMID09IFNFR19SRUdJU1RFUik7Ci0jZW5kaWYKLQotICBvYnN0YWNrX2JlZ2luICgmZnJjaGFpbnMsIGNodW5rc2l6ZSk7Ci0jaWYgX19HTlVDX18gPj0gMgotICBvYnN0YWNrX2FsaWdubWVudF9tYXNrICgmZnJjaGFpbnMpID0gX19hbGlnbm9mX18gKGZyY2hhaW5TKSAtIDE7Ci0jZW5kaWYKLQotICBmcmNoYWluX3Jvb3QgPSBOVUxMOwotICBmcmNoYWluX25vdyA9IE5VTEw7CQkvKiBXYXJuIG5ld19zdWJzZWcoKSB0aGF0IHdlIGFyZSBib290aW5nLiAqLwotCi0gIGZyYWdfbm93ID0gJmR1bW15X2ZyYWc7Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBub3dfc3Vic2VnID0gNDI7CQkvKiBMaWUgZm9yIDFzdCBjYWxsIHRvIHN1YnNlZ19uZXcuICovCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICAgIHsKLQlzdWJzZWdfc2V0IChpLCAwKTsKLQlzZWdtZW50X2luZm9baV0uZnJjaGFpblAgPSBmcmNoYWluX25vdzsKLSAgICAgIH0KLSAgfQotI2Vsc2UKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIDApOwkvKiAuZGF0YSAwICovCi0gIGRhdGEwX2ZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0KLSAgc3Vic2VnX3NldCAoU0VHX0JTUywgMCk7Ci0gIGJzczBfZnJjaGFpblAgPSBmcmNoYWluX25vdzsKLQotI2VuZGlmIC8qICEgTUFOWV9TRUdNRU5UUyAqLwotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0gIGFic29sdXRlX2ZyY2hhaW4uZnJjaF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfc3Vic2VnID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGFic29sdXRlX2ZyY2hhaW4uZml4X3Jvb3QgPSBhYnNvbHV0ZV9mcmNoYWluLmZpeF90YWlsID0gMDsKLSNlbmRpZgotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfZnJhZ19ub3cgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gIGFic29sdXRlX2ZyY2hhaW4uZnJjaF9yb290ID0gYWJzb2x1dGVfZnJjaGFpbi5mcmNoX2xhc3QgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci19Ci0MCi0vKgotICoJCQlzdWJzZWdfY2hhbmdlKCkKLSAqCi0gKiBDaGFuZ2UgdGhlIHN1YnNlZ21lbnQgd2UgYXJlIGluLCBCVVQgRE8gTk9UIE1BS0UgQSBORVcgRlJBRyBmb3IgdGhlCi0gKiBzdWJzZWdtZW50LiBJZiB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBzdWJzZWdtZW50LCBjaGFuZ2Ugbm90aGluZy4KLSAqIFRoaXMgaXMgdXNlZCBlZyBhcyBhIHdvcmtlciBmb3Igc3Vic2VnX3NldCBbd2hpY2ggZG9lcyBtYWtlIGEgbmV3IGZyYWdfbm93XQotICogYW5kIGZvciBjaGFuZ2luZyBzZWdtZW50cyBhZnRlciB3ZSBoYXZlIHJlYWQgdGhlIHNvdXJjZS4gV2UgY29uc3RydWN0IGVnCi0gKiBmaXhTcyBldmVuIGFmdGVyIHRoZSBzb3VyY2UgZmlsZSBpcyByZWFkLCBzbyB3ZSBkbyBoYXZlIHRvIGtlZXAgdGhlCi0gKiBzZWdtZW50IGNvbnRleHQgY29ycmVjdC4KLSAqLwotdm9pZAotc3Vic2VnX2NoYW5nZSAoc2VnLCBzdWJzZWcpCi0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBpbnQgc3Vic2VnOwotewotICBub3dfc2VnID0gc2VnOwotICBub3dfc3Vic2VnID0gc3Vic2VnOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gICAgc2VnaW5mbyA9IChzZWdtZW50X2luZm9fdHlwZSAqKSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VnKTsKLSAgICBpZiAoISBzZWdpbmZvKQotICAgICAgewotCXNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2VnaW5mbykpOwotCW1lbXNldCAoKFBUUikgc2VnaW5mbywgMCwgc2l6ZW9mICgqc2VnaW5mbykpOwotCXNlZ2luZm8tPmZpeF9yb290ID0gTlVMTDsKLQlzZWdpbmZvLT5maXhfdGFpbCA9IE5VTEw7Ci0Jc2VnaW5mby0+YmZkX3NlY3Rpb24gPSBzZWc7Ci0Jc2VnaW5mby0+c3ltID0gMDsKLQlpZiAoc2VnID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0JICBhYnNfc2VnX2luZm8gPSBzZWdpbmZvOwotCWVsc2UgaWYgKHNlZyA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotCSAgdW5kX3NlZ19pbmZvID0gc2VnaW5mbzsKLQllbHNlCi0JICBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VnLCAoUFRSKSBzZWdpbmZvKTsKLSAgICAgIH0KLSAgfQotI2Vsc2UKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0gIHNlZ19maXhfcm9vdFAgPSAmc2VnbWVudF9pbmZvW3NlZ10uZml4X3Jvb3Q7Ci0gIHNlZ19maXhfdGFpbFAgPSAmc2VnbWVudF9pbmZvW3NlZ10uZml4X3RhaWw7Ci0jZWxzZQotICBpZiAoc2VnID09IFNFR19EQVRBKQotICAgIHsKLSAgICAgIHNlZ19maXhfcm9vdFAgPSAmZGF0YV9maXhfcm9vdDsKLSAgICAgIHNlZ19maXhfdGFpbFAgPSAmZGF0YV9maXhfdGFpbDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlZyA9PSBTRUdfVEVYVCkKLSAgICB7Ci0gICAgICBzZWdfZml4X3Jvb3RQID0gJnRleHRfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJnRleHRfZml4X3RhaWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAga25vdyAoc2VnID09IFNFR19CU1MpOwotICAgICAgc2VnX2ZpeF9yb290UCA9ICZic3NfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJmJzc19maXhfdGFpbDsKLSAgICB9Ci0KLSNlbmRpZgotI2VuZGlmCi19Ci0MCi1zdGF0aWMgdm9pZAotc3Vic2VnX3NldF9yZXN0IChzZWcsIHN1YnNlZykKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICByZWdpc3RlciBmcmNoYWluUyAqZnJjUDsJLyogY3Jhd2wgZnJjaGFpbiBjaGFpbiAqLwotICByZWdpc3RlciBmcmNoYWluUyAqKmxhc3RQUDsJLyogYWRkcmVzcyBvZiBsYXN0IHBvaW50ZXIgKi8KLSAgZnJjaGFpblMgKm5ld1A7CQkvKiBhZGRyZXNzIG9mIG5ldyBmcmNoYWluICovCi0KLSAgbXJpX2NvbW1vbl9zeW1ib2wgPSBOVUxMOwotCi0gIGlmIChmcmFnX25vdyAmJiBmcmNoYWluX25vdykKLSAgICBmcmNoYWluX25vdy0+ZnJjaF9mcmFnX25vdyA9IGZyYWdfbm93OwotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3cgPT0gMAotCSAgfHwgbm93X3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbgotCSAgfHwgbm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JICB8fCBmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKLQotICBzdWJzZWdfY2hhbmdlIChzZWcsIChpbnQpIHN1YnNlZyk7Ci0KLSAgaWYgKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGZyY2hhaW5fbm93ID0gJmFic29sdXRlX2ZyY2hhaW47Ci0gICAgICBmcmFnX25vdyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXNzZXJ0IChmcmNoYWluX25vdyA9PSAwCi0JICB8fCBub3dfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uCi0JICB8fCBmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKLQotICAvKgotICAgKiBBdHRlbXB0IHRvIGZpbmQgb3IgbWFrZSBhIGZyY2hhaW4gZm9yIHRoYXQgc3ViIHNlZy4KLSAgICogQ3Jhd2wgYWxvbmcgY2hhaW4gb2YgZnJjaGFpblNzLCBiZWdpbnMgQCBmcmNoYWluX3Jvb3QuCi0gICAqIElmIHdlIG5lZWQgdG8gbWFrZSBhIGZyY2hhaW5TLCBsaW5rIGl0IGludG8gY29ycmVjdAotICAgKiBwb3NpdGlvbiBvZiBjaGFpbiByb290ZWQgaW4gZnJjaGFpbl9yb290LgotICAgKi8KLSAgZm9yIChmcmNQID0gKihsYXN0UFAgPSAmZnJjaGFpbl9yb290KTsKLSAgICAgICBmcmNQICYmIGZyY1AtPmZyY2hfc2VnIDw9IHNlZzsKLSAgICAgICBmcmNQID0gKihsYXN0UFAgPSAmZnJjUC0+ZnJjaF9uZXh0KSkKLSAgICB7Ci0gICAgICBpZiAoZnJjUC0+ZnJjaF9zZWcgPT0gc2VnCi0JICAmJiBmcmNQLT5mcmNoX3N1YnNlZyA+PSBzdWJzZWcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogZnJjUDoJCUFkZHJlc3Mgb2YgdGhlIDFzdCBmcmNoYWluUyBpbiBjb3JyZWN0IHNlZ21lbnQgd2l0aAotICAgKgkJZnJjaF9zdWJzZWcgPj0gc3Vic2VnLgotICAgKgkJV2Ugd2FudCB0byBlaXRoZXIgdXNlIHRoaXMgZnJjaGFpblMsIG9yIHdlIHdhbnQKLSAgICoJCXRvIGluc2VydCBhIG5ldyBmcmNoYWluUyBqdXN0IGJlZm9yZSBpdC4KLSAgICoKLSAgICoJCUlmIGZyY1A9PU5VTEwsIHRoZW4gd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluCi0gICAqCQlvZiBmcmNoYWluUy1zLiBBIE5VTEwgZnJjUCBtZWFucyB3ZSBmZWxsIG9mZiB0aGUgZW5kCi0gICAqCQlvZiB0aGUgY2hhaW4gbG9va2luZyBmb3IgYQotICAgKgkJZnJjaF9zdWJzZWcgPj0gc3Vic2VnLCBzbyB3ZQotICAgKgkJbXVzdCBtYWtlIGEgbmV3IGZyY2hhaW5TLgotICAgKgotICAgKgkJSWYgd2UgZXZlciBtYWludGFpbiBhIHBvaW50ZXIgdG8KLSAgICoJCXRoZSBsYXN0IGZyY2hhaW5TIGluIHRoZSBjaGFpbiwgd2UgY2hhbmdlIHRoYXQgcG9pbnRlcgotICAgKgkJT05MWSB3aGVuIGZyY1A9PU5VTEwuCi0gICAqCi0gICAqIGxhc3RQUDoJQWRkcmVzcyBvZiB0aGUgcG9pbnRlciB3aXRoIHZhbHVlIGZyY1A7Ci0gICAqCQlOZXZlciBOVUxMLgotICAgKgkJTWF5IHBvaW50IHRvIGZyY2hhaW5fcm9vdC4KLSAgICoKLSAgICovCi0gIGlmICghZnJjUAotICAgICAgfHwgKGZyY1AtPmZyY2hfc2VnID4gc2VnCi0JICB8fCBmcmNQLT5mcmNoX3N1YnNlZyA+IHN1YnNlZykpCS8qIEtpbmt5IGxvZ2ljIG9ubHkgd29ya3Mgd2l0aCAyIHNlZ21lbnRzLiAqLwotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBUaGlzIHNob3VsZCBiZSB0aGUgb25seSBjb2RlIHRoYXQgY3JlYXRlcyBhIGZyY2hhaW5TLgotICAgICAgICovCi0gICAgICBuZXdQID0gKGZyY2hhaW5TICopIG9ic3RhY2tfYWxsb2MgKCZmcmNoYWlucywgc2l6ZW9mIChmcmNoYWluUykpOwotICAgICAgbmV3UC0+ZnJjaF9zdWJzZWcgPSBzdWJzZWc7Ci0gICAgICBuZXdQLT5mcmNoX3NlZyA9IHNlZzsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBuZXdQLT5maXhfcm9vdCA9IE5VTEw7Ci0gICAgICBuZXdQLT5maXhfdGFpbCA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgIG9ic3RhY2tfYmVnaW4gKCZuZXdQLT5mcmNoX29ic3RhY2ssIGNodW5rc2l6ZSk7Ci0jaWYgX19HTlVDX18gPj0gMgotICAgICAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoJm5ld1AtPmZyY2hfb2JzdGFjaykgPSBfX2FsaWdub2ZfXyAoZnJhZ1MpIC0gMTsKLSNlbmRpZgotICAgICAgbmV3UC0+ZnJjaF9mcmFnX25vdyA9IGZyYWdfYWxsb2MgKCZuZXdQLT5mcmNoX29ic3RhY2spOwotICAgICAgbmV3UC0+ZnJjaF9mcmFnX25vdy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0KLSAgICAgIG5ld1AtPmZyY2hfcm9vdCA9IG5ld1AtPmZyY2hfbGFzdCA9IG5ld1AtPmZyY2hfZnJhZ19ub3c7Ci0KLSAgICAgICpsYXN0UFAgPSBuZXdQOwotICAgICAgbmV3UC0+ZnJjaF9uZXh0ID0gZnJjUDsJLyogcGVyaGFwcyBOVUxMICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICB7Ci0Jc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0Jc2VnaW5mbyA9IHNlZ19pbmZvIChzZWcpOwotCWlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZyY2hhaW5QID09IGZyY1ApCi0JICBzZWdpbmZvLT5mcmNoYWluUCA9IG5ld1A7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIAotICAgICAgZnJjUCA9IG5ld1A7Ci0gICAgfQotICAvKgotICAgKiBIZXJlIHdpdGggZnJjUCBwb2ludGluZyB0byB0aGUgZnJjaGFpblMgZm9yIHN1YnNlZy4KLSAgICovCi0gIGZyY2hhaW5fbm93ID0gZnJjUDsKLSAgZnJhZ19ub3cgPSBmcmNQLT5mcmNoX2ZyYWdfbm93OwotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci19Ci0KLS8qCi0gKgkJCXN1YnNlZ19zZXQoc2VnVCwgc3Vic2VnVCkKLSAqCi0gKiBJZiB5b3UgYXR0ZW1wdCB0byBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgc3Vic2VnbWVudCwgbm90aGluZyBoYXBwZW5zLgotICoKLSAqIEluOglzZWdULCBzdWJzZWdUIGNvZGUgZm9yIG5ldyBzdWJzZWdtZW50LgotICoJZnJhZ19ub3cgLT4gaW5jb21wbGV0ZSBmcmFnIGZvciBjdXJyZW50IHN1YnNlZ21lbnQuCi0gKglJZiBmcmFnX25vdz09TlVMTCwgdGhlbiB0aGVyZSBpcyBubyBvbGQsIGluY29tcGxldGUgZnJhZywgc28KLSAqCXRoZSBvbGQgZnJhZyBpcyBub3QgY2xvc2VkIG9mZi4KLSAqCi0gKiBPdXQ6CW5vd19zdWJzZWcsIG5vd19zZWcgdXBkYXRlZC4KLSAqCUZyY2hhaW5fbm93IHBvaW50cyB0byB0aGUgKHBvc3NpYmx5IG5ldykgc3RydWN0IGZyY2hhaW4gZm9yIHRoaXMKLSAqCXN1Yi1zZWdtZW50LgotICoJRnJjaGFpbl9yb290IHVwZGF0ZWQgaWYgbmVlZGVkLgotICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi1zZWdUCi1zdWJzZWdfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgKGludCkgU0VHX01BWElNVU1fT1JESU5BTDsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICAgIHMgPSBzZWdtZW50X25hbWUgKChzZWdUKSBpKTsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ25hbWUsIHMpID09IDAKLQkgIHx8IChzZWduYW1lWzBdID09ICcuJwotCSAgICAgICYmIHN0cmNtcCAoc2VnbmFtZSArIDEsIHMpID09IDApKQotCXsKLQkgIHN1YnNlZ19zZXQgKChzZWdUKSBpLCBzdWJzZWcpOwotCSAgcmV0dXJuIChzZWdUKSBpOwotCX0KLSNpZmRlZiBvYmpfc2VnbWVudF9uYW1lCi0gICAgICBzID0gb2JqX3NlZ21lbnRfbmFtZSAoKHNlZ1QpIGkpOwotICAgICAgaWYgKHN0cmNtcCAoc2VnbmFtZSwgcykgPT0gMAotCSAgfHwgKHNlZ25hbWVbMF0gPT0gJy4nCi0JICAgICAgJiYgc3RyY21wIChzZWduYW1lICsgMSwgcykgPT0gMCkpCi0JewotCSAgc3Vic2VnX3NldCAoKHNlZ1QpIGksIHN1YnNlZyk7Ci0JICByZXR1cm4gKHNlZ1QpIGk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgb2JqX2FkZF9zZWdtZW50Ci0gIHsKLSAgICBzZWdUIG5ld19zZWc7Ci0gICAgbmV3X3NlZyA9IG9ial9hZGRfc2VnbWVudCAoc2VnbmFtZSk7Ci0gICAgc3Vic2VnX3NldCAobmV3X3NlZywgc3Vic2VnKTsKLSAgICByZXR1cm4gbmV3X3NlZzsKLSAgfQotI2Vsc2UKLSAgYXNfYmFkIChfKCJBdHRlbXB0IHRvIHN3aXRjaCB0byBub25leGlzdGVudCBzZWdtZW50IFwiJXNcIiIpLCBzZWduYW1lKTsKLSAgcmV0dXJuIG5vd19zZWc7Ci0jZW5kaWYKLX0KLQotdm9pZAotc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpCS8qIGJlZ2luIGFzc2VtYmx5IGZvciBhIG5ldyBzdWItc2VnbWVudCAqLwotICAgICByZWdpc3RlciBzZWdUIHNlZzsJCS8qIFNFR19EQVRBIG9yIFNFR19URVhUICovCi0gICAgIHJlZ2lzdGVyIHN1YnNlZ1Qgc3Vic2VnOwotewotI2lmbmRlZiBNQU5ZX1NFR01FTlRTCi0gIGtub3cgKHNlZyA9PSBTRUdfREFUQQotCXx8IHNlZyA9PSBTRUdfVEVYVAotCXx8IHNlZyA9PSBTRUdfQlNTCi0JfHwgc2VnID09IFNFR19BQlNPTFVURSk7Ci0jZW5kaWYKLQotICBpZiAoc2VnICE9IG5vd19zZWcgfHwgc3Vic2VnICE9IG5vd19zdWJzZWcpCi0gICAgewkJCQkvKiB3ZSBqdXN0IGNoYW5nZWQgc3ViLXNlZ21lbnRzICovCi0gICAgICBzdWJzZWdfc2V0X3Jlc3QgKHNlZywgc3Vic2VnKTsKLSAgICB9Ci0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLX0KLQotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zZWdUCi1zdWJzZWdfZ2V0IChzZWduYW1lLCBmb3JjZV9uZXcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIGludCBmb3JjZV9uZXc7Ci17Ci0gIHNlZ1Qgc2VjcHRyOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgY29uc3QgY2hhciAqbm93X3NlZ19uYW1lID0gKG5vd19zZWcKLQkJCSAgICAgID8gYmZkX2dldF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgbm93X3NlZykKLQkJCSAgICAgIDogMCk7Ci0KLSAgaWYgKCFmb3JjZV9uZXcKLSAgICAgICYmIG5vd19zZWdfbmFtZQotICAgICAgJiYgKG5vd19zZWdfbmFtZSA9PSBzZWduYW1lCi0JICB8fCAhc3RyY21wIChub3dfc2VnX25hbWUsIHNlZ25hbWUpKSkKLSAgICByZXR1cm4gbm93X3NlZzsKLQotICBpZiAoIWZvcmNlX25ldykKLSAgICBzZWNwdHIgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN0ZG91dHB1dCwgc2VnbmFtZSk7Ci0gIGVsc2UKLSAgICBzZWNwdHIgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoc3Rkb3V0cHV0LCBzZWduYW1lKTsKLQotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8pCi0gICAgewotICAgICAgLyogQ2hlY2sgd2hldGhlciBvdXRwdXRfc2VjdGlvbiBpcyBzZXQgZmlyc3QgYmVjYXVzZSBzZWNwdHIgbWF5Ci0gICAgICAgICBiZSBiZmRfYWJzX3NlY3Rpb25fcHRyLiAgKi8KLSAgICAgIGlmIChzZWNwdHItPm91dHB1dF9zZWN0aW9uICE9IHNlY3B0cikKLQlzZWNwdHItPm91dHB1dF9zZWN0aW9uID0gc2VjcHRyOwotICAgICAgc2VnaW5mbyA9IChzZWdtZW50X2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKCpzZWdpbmZvKSk7Ci0gICAgICBtZW1zZXQgKChQVFIpIHNlZ2luZm8sIDAsIHNpemVvZiAoKnNlZ2luZm8pKTsKLSAgICAgIHNlZ2luZm8tPmZpeF9yb290ID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmZpeF90YWlsID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmJmZF9zZWN0aW9uID0gc2VjcHRyOwotICAgICAgaWYgKHNlY3B0ciA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCWFic19zZWdfaW5mbyA9IHNlZ2luZm87Ci0gICAgICBlbHNlIGlmIChzZWNwdHIgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLQl1bmRfc2VnX2luZm8gPSBzZWdpbmZvOwotICAgICAgZWxzZQotCWJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YSAoc3Rkb3V0cHV0LCBzZWNwdHIsIChQVFIpIHNlZ2luZm8pOwotICAgICAgc2VnaW5mby0+ZnJjaGFpblAgPSBOVUxMOwotICAgICAgc2VnaW5mby0+bGluZW5vX2xpc3RfaGVhZCA9IHNlZ2luZm8tPmxpbmVub19saXN0X3RhaWwgPSBOVUxMOwotICAgICAgc2VnaW5mby0+c3ltID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmRvdCA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gc2VjcHRyOwotfQotCi1zZWdUCi1zdWJzZWdfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0KLSAgc2VjcHRyID0gc3Vic2VnX2dldCAoc2VnbmFtZSwgMCk7Ci0gIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gIHJldHVybiBzZWNwdHI7Ci19Ci0KLS8qIExpa2Ugc3Vic2VnX25ldywgZXhjZXB0IGEgbmV3IHNlY3Rpb24gaXMgYWx3YXlzIGNyZWF0ZWQsIGV2ZW4gaWYKLSAgIGEgc2VjdGlvbiB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cy4gICovCi1zZWdUCi1zdWJzZWdfZm9yY2VfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0KLSAgc2VjcHRyID0gc3Vic2VnX2dldCAoc2VnbmFtZSwgMSk7Ci0gIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gIHJldHVybiBzZWNwdHI7Ci19Ci0KLXZvaWQKLXN1YnNlZ19zZXQgKHNlY3B0ciwgc3Vic2VnKQotICAgICBzZWdUIHNlY3B0cjsKLSAgICAgc3Vic2VnVCBzdWJzZWc7Ci17Ci0gIGlmICghIChzZWNwdHIgPT0gbm93X3NlZyAmJiBzdWJzZWcgPT0gbm93X3N1YnNlZykpCi0gICAgc3Vic2VnX3NldF9yZXN0IChzZWNwdHIsIHN1YnNlZyk7Ci0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLX0KLQotI2lmbmRlZiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJMAotI2VuZGlmCi0KLS8qIEdldCB0aGUgZ2FzIGluZm9ybWF0aW9uIHdlIGFyZSBzdG9yaW5nIGZvciBhIHNlY3Rpb24uICAqLwotCi1zZWdtZW50X2luZm9fdHlwZSAqCi1zZWdfaW5mbyAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSAgaWYgKHNlYyA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotICAgIHJldHVybiBhYnNfc2VnX2luZm87Ci0gIGVsc2UgaWYgKHNlYyA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotICAgIHJldHVybiB1bmRfc2VnX2luZm87Ci0gIGVsc2UKLSAgICByZXR1cm4gKHNlZ21lbnRfaW5mb190eXBlICopIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YSAoc3Rkb3V0cHV0LCBzZWMpOwotfQotCi1zeW1ib2xTICoKLXNlY3Rpb25fc3ltYm9sIChzZWMpCi0gICAgIHNlZ1Qgc2VjOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBzeW1ib2xTICpzOwotCi0gIGlmIChzZWdpbmZvID09IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChzZWdpbmZvLT5zeW0pCi0gICAgcmV0dXJuIHNlZ2luZm8tPnN5bTsKLQotI2lmbmRlZiBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUyAxCi0jZW5kaWYKLQotICBpZiAoISBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHx8IHN5bWJvbF90YWJsZV9mcm96ZW4KLSNlbmRpZgotICAgICAgKQotICAgIHsKLSAgICAgIC8qIEhlcmUgd2Uga25vdyBpdCB3b24ndCBiZSBnb2luZyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgcyA9IHN5bWJvbF9jcmVhdGUgKHNlYy0+bmFtZSwgc2VjLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHMgPSBzeW1ib2xfZmluZF9iYXNlIChzZWMtPm5hbWUsIDApOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlzID0gc3ltYm9sX25ldyAoc2VjLT5uYW1lLCBzZWMsIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHMpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgU19TRVRfU0VHTUVOVCAocywgc2VjKTsKLQkgICAgICBzeW1ib2xfc2V0X2ZyYWcgKHMsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIFNfQ0xFQVJfRVhURVJOQUwgKHMpOwotCi0gIC8qIFVzZSB0aGUgQkZEIHNlY3Rpb24gc3ltYm9sLCBpZiBwb3NzaWJsZS4gICovCi0gIGlmIChvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYykpCi0gICAgc3ltYm9sX3NldF9iZmRzeW0gKHMsIHNlYy0+c3ltYm9sKTsKLQotICBzZWdpbmZvLT5zeW0gPSBzOwotICByZXR1cm4gczsKLX0KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzZWdtZW50IGlzIHRob3VnaHQgdG8gaG9sZCB0ZXh0LiAgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi1jb25zdCBjaGFyICogY29uc3Qgbm9udGV4dF9zZWN0aW9uX25hbWVzW10gPQotewotICAiLmVoX2ZyYW1lIiwKLSAgIi5nY2NfZXhjZXB0X3RhYmxlIiwKLSNpZmRlZiBPQkpfQ09GRgotI2lmbmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICAiLmVoX2ZyYW0iLAotICAiLmdjY19leGMiLAotI2VuZGlmCi0jZW5kaWYKLSAgTlVMTAotfTsKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotaW50Ci1zdWJzZWdfdGV4dF9wIChzZWMpCi0gICAgIHNlZ1Qgc2VjOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgcmV0dXJuIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjKSAmIFNFQ19DT0RFKSAhPSAwOwotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0gIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKLQotICBpZiAoc2VjID09IGRhdGFfc2VjdGlvbiB8fCBzZWMgPT0gYnNzX3NlY3Rpb24pCi0gICAgcmV0dXJuIDA7Ci0KLSAgZm9yIChwID0gbm9udGV4dF9zZWN0aW9uX25hbWVzOyAqcCAhPSBOVUxMOyArK3ApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWMpLCAqcCkgPT0gMCkKLQlyZXR1cm4gMDsKLQotI2lmZGVmIG9ial9zZWdtZW50X25hbWUKLSAgICAgIGlmIChzdHJjbXAgKG9ial9zZWdtZW50X25hbWUgKHNlYyksICpwKSA9PSAwKQotCXJldHVybiAwOwotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiAxOwotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi19Ci0KLXZvaWQKLXN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgZnJjaGFpblMgKmZyY2hwOwotICBmcHJpbnRmIChmaWxlLCAiZnJhZyBjaGFpbnM6XG4iKTsKLSAgZm9yIChmcmNocCA9IGZyY2hhaW5fcm9vdDsgZnJjaHA7IGZyY2hwID0gZnJjaHAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBpbnQgY291bnQgPSAwOwotICAgICAgZnJhZ1MgKmZyYWdwOwotCi0gICAgICAvKiBJZiBmcmNoX3N1YnNlZyBpcyBub24temVybywgaXQncyBwcm9iYWJseSBiZWVuIGNoYWluZWQgb250bwotCSB0aGUgZW5kIG9mIGEgcHJldmlvdXMgc3Vic2VjdGlvbi4gIERvbid0IGNvdW50IGl0IGFnYWluLiAgKi8KLSAgICAgIGlmIChmcmNocC0+ZnJjaF9zdWJzZWcgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2tpcCBnYXMtaW50ZXJuYWwgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKHNlZ21lbnRfbmFtZSAoZnJjaHAtPmZyY2hfc2VnKVswXSA9PSAnKicpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAoZnJhZ3AgPSBmcmNocC0+ZnJjaF9yb290OyBmcmFncDsgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dCkKLQl7Ci0jaWYgMAotCSAgc3dpdGNoIChmcmFncC0+ZnJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIHJzX2ZpbGw6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgImYiKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfYWxpZ246Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgImEiKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfYWxpZ25fY29kZToKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiYyIpOyBicmVhazsKLQkgICAgY2FzZSByc19vcmc6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIm8iKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIm0iKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfc3BhY2U6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgInMiKTsgYnJlYWs7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiMCIpOyBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiPyIpOyBicmVhazsKLQkgICAgfQotI2VuZGlmCi0JICBjb3VudCsrOwotCX0KLSAgICAgIGZwcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIlx0JXAgJS0xMHNcdCUxMGQgZnJhZ3NcbiIsIGZyY2hwLAotCSAgICAgICBzZWdtZW50X25hbWUgKGZyY2hwLT5mcmNoX3NlZyksIGNvdW50KTsKLSAgICB9Ci19Ci0KLS8qIGVuZCBvZiBzdWJzZWdzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9zdWJzZWdzLmggYi9nYXMvc3Vic2Vncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQwZDViLi4wMDAwMDAwCi0tLSBhL2dhcy9zdWJzZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyogc3Vic2Vncy5oIC0+IHN1YnNlZ3MuYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBGb3IgZXZlcnkgc3ViLXNlZ21lbnQgdGhlIHVzZXIgbWVudGlvbnMgaW4gdGhlIEFTc2VtYmxlciBwcm9ncmFtLAotICogd2UgbWFrZSBvbmUgc3RydWN0IGZyY2hhaW4uIEVhY2ggc3ViLXNlZ21lbnQgaGFzIGV4YWN0bHkgb25lIHN0cnVjdCBmcmNoYWluCi0gKiBhbmQgdmljZSB2ZXJzYS4KLSAqCi0gKiBTdHJ1Y3QgZnJjaGFpbidzIGFyZSBmb3J3YXJkIGNoYWluZWQgKGluIGFzY2VuZGluZyBvcmRlciBvZiBzdWItc2VnbWVudAotICogY29kZSBudW1iZXIpLiBUaGUgY2hhaW4gcnVucyB0aHJvdWdoIGZyY2hfbmV4dCBvZiBlYWNoIHN1YnNlZ21lbnQuCi0gKiBUaGlzIG1ha2VzIGl0IGhhcmQgdG8gZmluZCBhIHN1YnNlZ21lbnQncyBmcmFncwotICogaWYgcHJvZ3JhbW1lciB1c2VzIGEgbG90IG9mIHRoZW0uIE1vc3QgcHJvZ3JhbXMgb25seSB1c2UgdGV4dDAgYW5kCi0gKiBkYXRhMCwgc28gdGhleSBkb24ndCBzdWZmZXIuIEF0IGxlYXN0IHRoaXMgd2F5OgotICogKDEpCVRoZXJlIGFyZSBubyAiYXJiaXRyYXJ5IiByZXN0cmljdGlvbnMgb24gaG93IG1hbnkgc3Vic2VnbWVudHMKLSAqCWNhbiBiZSBwcm9ncmFtbWVkOwotICogKDIpCVN1YnNlZ21lbnRzJyBmcmNoYWluLXMgYXJlIChsYXRlcikgY2hhaW5lZCB0b2dldGhlciBpbiB0aGUgb3JkZXIgaW4KLSAqCXdoaWNoIHRoZXkgYXJlIGVtaXR0ZWQgZm9yIG9iamVjdCBmaWxlIHZpeiB0ZXh0IHRoZW4gZGF0YS4KLSAqCi0gKiBGcm9tIGVhY2ggc3RydWN0IGZyY2hhaW4gZGFuZ2xlcyBhIGNoYWluIG9mIHN0cnVjdCBmcmFncy4gVGhlIGZyYWdzCi0gKiByZXByZXNlbnQgY29kZSBmcmFnbWVudHMsIGZvciB0aGF0IHN1Yi1zZWdtZW50LCBmb3J3YXJkIGNoYWluZWQuCi0gKi8KLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotc3RydWN0IGZyY2hhaW4JCQkvKiBjb250cm9sIGJ1aWxkaW5nIG9mIGEgZnJhZyBjaGFpbiAqLwotewkJCQkvKiBGUkNIID0gRlJhZ21lbnQgQ0hhaW4gY29udHJvbCAqLwotICBzdHJ1Y3QgZnJhZyAqZnJjaF9yb290OwkvKiAxc3Qgc3RydWN0IGZyYWcgaW4gY2hhaW4sIG9yIE5VTEwgKi8KLSAgc3RydWN0IGZyYWcgKmZyY2hfbGFzdDsJLyogbGFzdCBzdHJ1Y3QgZnJhZyBpbiBjaGFpbiwgb3IgTlVMTCAqLwotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaF9uZXh0OwkvKiBuZXh0IGluIGNoYWluIG9mIHN0cnVjdCBmcmNoYWluLXMgKi8KLSAgc2VnVCBmcmNoX3NlZzsJCS8qIFNFR19URVhUIG9yIFNFR19EQVRBLiAqLwotICBzdWJzZWdUIGZyY2hfc3Vic2VnOwkJLyogc3Vic2VnbWVudCBudW1iZXIgb2YgdGhpcyBjaGFpbiAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZml4UyAqZml4X3Jvb3Q7CQkvKiBSb290IG9mIGZpeHVwcyBmb3IgdGhpcyBzdWJzZWdtZW50LiAgKi8KLSAgZml4UyAqZml4X3RhaWw7CQkvKiBMYXN0IGZpeHVwIGZvciB0aGlzIHN1YnNlZ21lbnQuICAqLwotI2VuZGlmCi0gIHN0cnVjdCBvYnN0YWNrIGZyY2hfb2JzdGFjazsJLyogZm9yIG9iamVjdHMgaW4gdGhpcyBmcmFnIGNoYWluICovCi0gIGZyYWdTICpmcmNoX2ZyYWdfbm93OwkJLyogZnJhZ19ub3cgZm9yIHRoaXMgc3Vic2VnbWVudCAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZnJjaGFpbiBmcmNoYWluUzsKLQotLyogQWxsIHN1YnNlZ21lbnRzJyBjaGFpbnMgaGFuZyBvZmYgaGVyZS4gIE5VTEwgbWVhbnMgbm8gZnJjaGFpbnMgeWV0LiAgKi8KLWV4dGVybiBmcmNoYWluUyAqZnJjaGFpbl9yb290OwotCi0vKiBGcmNoYWluIHdlIGFyZSBhc3NlbWJsaW5nIGludG8gbm93LiAgVGhhdCBpcywgdGhlIGN1cnJlbnQgc2VnbWVudCdzCi0gICBmcmFnIGNoYWluLCBldmVuIGlmIGl0IGNvbnRhaW5zIG5vIChjb21wbGV0ZSkgZnJhZ3MuICovCi1leHRlcm4gZnJjaGFpblMgKmZyY2hhaW5fbm93OwotCi0KLXR5cGVkZWYgc3RydWN0IHNlZ21lbnRfaW5mb19zdHJ1Y3QKLXsKLSAgZnJjaGFpblMgKmZyY2hhaW5QOwotICB1bnNpZ25lZCBpbnQgaGFkb25lIDogMTsKLQotICAvKiBUaGlzIGZpZWxkIGlzIHNldCBpZiB0aGlzIGlzIGEgLmJzcyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IHJlYWxseQotICAgICBoYXZlIGFueSBjb250ZW50cy4gIE9uY2UgdXBvbiBhIHRpbWUgYSAuYnNzIHNlY3Rpb24gZGlkIG5vdCBoYXZlCi0gICAgIGFueSBmcmFncywgYnV0IHRoYXQgaXMgbm8gbG9uZ2VyIHRydWUuICBUaGlzIGZpZWxkIHByZXZlbnQgdGhlCi0gICAgIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBmcm9tIGJlaW5nIHNldCBmb3IgdGhlIHNlY3Rpb24gZXZlbiBpZgotICAgICB0aGVyZSBhcmUgZnJhZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgYnNzIDogMTsKLQotICBpbnQgdXNlcl9zdHVmZjsKLQotICAvKiBGaXh1cHMgZm9yIHRoaXMgc2VnbWVudC4gIElmIEJGRF9BU1NFTUJMRVIsIHRoaXMgaXMgb25seSB2YWxpZAotICAgICBhZnRlciB0aGUgZnJjaGFpbnMgYXJlIHJ1biB0b2dldGhlci4gICovCi0gIGZpeFMgKmZpeF9yb290OwotICBmaXhTICpmaXhfdGFpbDsKLQotI2lmIGRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIHNjbmhkcjsKLSAgZW51bSBsaW5rb25jZV90eXBlIGxpbmtvbmNlOwotICBjb25zdCBjaGFyICpuYW1lOwotI2VuZGlmCi0KLSAgc3ltYm9sUyAqZG90OwotCi0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZW5vX2xpc3RfaGVhZDsKLSAgc3RydWN0IGxpbmVub19saXN0ICpsaW5lbm9fbGlzdF90YWlsOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBXaGljaCBCRkQgc2VjdGlvbiBkb2VzIHRoaXMgZ2FzIHNlZ21lbnQgY29ycmVzcG9uZCB0bz8gICovCi0gIGFzZWN0aW9uICpiZmRfc2VjdGlvbjsKLQotICAvKiBOVUxMLCBvciBwb2ludGVyIHRvIHRoZSBnYXMgc3ltYm9sIHRoYXQgaXMgdGhlIHNlY3Rpb24gc3ltYm9sIGZvcgotICAgICB0aGlzIHNlY3Rpb24uICBzeW0tPmJzeW0gYW5kIGJmZF9zZWN0aW9uLT5zeW1ib2wgc2hvdWxkIGJlIHRoZSBzYW1lLiAgKi8KLSAgc3ltYm9sUyAqc3ltOwotI2VuZGlmCi0KLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBDdXJyZW50IHNpemUgb2Ygc2VjdGlvbiBob2xkaW5nIHN0YWJzIHN0cmluZ3MuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBzdGFiX3N0cmluZ19zaXplOwotICAgICAgLyogSW5pdGlhbCBmcmFnIGZvciBFTEYuICAqLwotICAgICAgY2hhciAqcDsKLSAgICB9Ci0gIHN0YWJ1OwotCi0jaWZkZWYgTkVFRF9MSVRFUkFMX1BPT0wKLSAgdW5zaWduZWQgbG9uZyBsaXRlcmFsX3Bvb2xfc2l6ZTsKLSNlbmRpZgotCi0jaWZkZWYgVENfU0VHTUVOVF9JTkZPX1RZUEUKLSAgVENfU0VHTUVOVF9JTkZPX1RZUEUgdGNfc2VnbWVudF9pbmZvX2RhdGE7Ci0jZW5kaWYKLX0gc2VnbWVudF9pbmZvX3R5cGU7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLWV4dGVybiBzZWdtZW50X2luZm9fdHlwZSAqc2VnX2luZm8gUEFSQU1TICgoc2VnVCkpOwotZXh0ZXJuIHN5bWJvbFMgKnNlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKHNlZ1QpKTsKLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0KLWV4dGVybiBzZWdtZW50X2luZm9fdHlwZSBzZWdtZW50X2luZm9bXTsKLQotI2RlZmluZSBzZWdfaW5mbyhTRUMpCSgmc2VnbWVudF9pbmZvW1NFQ10pCi0KLSNlbHNlCi0KLS8qIFNlbnRpbmVsIGZvciBmcmNoYWluIGNyYXdsaW5nLiAgUG9pbnRzIHRvIHRoZSAxc3QgZGF0YS1zZWdtZW50Ci0gICBmcmNoYWluLiAgKFdoaWNoIGlzIHBvaW50ZWQgdG8gYnkgdGhlIGxhc3QgdGV4dC1zZWdtZW50IGZyY2hhaW4uKSAqLwotZXh0ZXJuIGZyY2hhaW5TICpkYXRhMF9mcmNoYWluUDsKLWV4dGVybiBmcmNoYWluUyAqYnNzMF9mcmNoYWluUDsKLQotLyogRHVtbXkgc28gc3R1ZmYgY2FuIGNvbXBpbGUuICBTaG91bGQgbmV2ZXIgYmUgdXNlZC4gICovCi1zdHJ1Y3Qgc2VnX2luZm9fdHJhc2ggewotICBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIHN0YWJfc3RyaW5nX3NpemUgOiAxOwotICB9IHN0YWJ1OwotICB1bnNpZ25lZCBoYWRvbmUgOiAxOwotfTsKLSNkZWZpbmUgc2VnX2luZm8oUykJKGFib3J0ICgpLCAoc3RydWN0IHNlZ19pbmZvX3RyYXNoICopIDApCi0KLSNlbmRpZgotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLWV4dGVybiB2b2lkIHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLQotLyogZW5kIG9mIHN1YnNlZ3MuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N5bWJvbHMuYyBiL2dhcy9zeW1ib2xzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZGVjZDguLjAwMDAwMDAKLS0tIGEvZ2FzL3N5bWJvbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MDQgKzAsMCBAQAotLyogc3ltYm9scy5jIC1zeW1ib2wgdGFibGUtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAjZGVmaW5lIERFQlVHX1NZTVMgLyAqIHRvIGRlYnVnIHN5bWJvbCBsaXN0IG1haW50ZW5hbmNlICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIJCS8qIEZvciAic3ltYm9scy5oIiAqLwotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgInN0cnVjLXN5bWJvbC5oIgotCi0vKiBUaGlzIGlzIG5vbi16ZXJvIGlmIHN5bWJvbHMgYXJlIGNhc2Ugc2Vuc2l0aXZlLCB3aGljaCBpcyB0aGUKLSAgIGRlZmF1bHQuICAqLwotaW50IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUgPSAxOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLWV4dGVybiBpbnQgbmV3X2Jyb2tlbl93b3JkczsKLSNlbmRpZgotCi0vKiBzeW1ib2wtbmFtZSA9PiBzdHJ1Y3Qgc3ltYm9sIHBvaW50ZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpzeV9oYXNoOwotCi0vKiBUYWJsZSBvZiBsb2NhbCBzeW1ib2xzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpsb2NhbF9oYXNoOwotCi0vKiBCZWxvdyBhcmUgY29tbWVudGVkIGluICJzeW1ib2xzLmgiLiAqLwotc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotc3ltYm9sUyAqc3ltYm9sX2xhc3RQOwotc3ltYm9sUyBhYnNfc3ltYm9sOwotCi0jaWZkZWYgREVCVUdfU1lNUwotI2RlZmluZSBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gdmVyaWZ5X3N5bWJvbF9jaGFpbgotI2Vsc2UKLSNkZWZpbmUgZGVidWdfdmVyaWZ5X3N5bWNoYWluKHJvb3QsIGxhc3QpICgodm9pZCkgMCkKLSNlbmRpZgotCi1zdHJ1Y3Qgb2JzdGFjayBub3RlczsKLQotc3RhdGljIHZvaWQgZmJfbGFiZWxfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgbG9uZyBkb2xsYXJfbGFiZWxfaW5zdGFuY2UgUEFSQU1TICgobG9uZykpOwotc3RhdGljIGxvbmcgZmJfbGFiZWxfaW5zdGFuY2UgUEFSQU1TICgobG9uZykpOwotCi1zdGF0aWMgdm9pZCBwcmludF9iaW5hcnkgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIGV4cHJlc3Npb25TICopKTsKLQotLyogc3ltYm9sX25ldygpCi0gIAotICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIG5ldyBzeW1ib2wuICBEaWUgaWYgd2UgY2FuJ3QgbWFrZSBhIG5ldwotICAgc3ltYm9sLiAgRmlsbCBpbiB0aGUgc3ltYm9sJ3MgdmFsdWVzLiAgQWRkIHN5bWJvbCB0byBlbmQgb2Ygc3ltYm9sCi0gICBjaGFpbi4KLSAKLSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgZ2VuZXJhbCBjYXNlIG9mIGNyZWF0aW5nIGEKLSAgIHN5bWJvbC4gIEhvd2V2ZXIsIGlmIHRoZSBvdXRwdXQgZmlsZSBzeW1ib2wgdGFibGUgaGFzIGFscmVhZHkgYmVlbgotICAgc2V0LCBhbmQgeW91IGFyZSBjZXJ0YWluIHRoYXQgdGhpcyBzeW1ib2wgd29uJ3QgYmUgd2FudGVkIGluIHRoZQotICAgb3V0cHV0IGZpbGUsIHlvdSBjYW4gY2FsbCBzeW1ib2xfY3JlYXRlLiAgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfbmV3IChuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCB2YWx1OwotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IHN5bWJvbF9jcmVhdGUgKG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpOwotCi0gIC8qCi0gICAqIExpbmsgdG8gZW5kIG9mIHN5bWJvbCBjaGFpbi4KLSAgICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgZXh0ZXJuIGludCBzeW1ib2xfdGFibGVfZnJvemVuOwotICAgIGlmIChzeW1ib2xfdGFibGVfZnJvemVuKQotICAgICAgYWJvcnQgKCk7Ci0gIH0KLSNlbmRpZgotICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gIHJldHVybiBzeW1ib2xQOwotfQotCi0vKiBTYXZlIGEgc3ltYm9sIG5hbWUgb24gYSBwZXJtYW5lbnQgb2JzdGFjaywgYW5kIGNvbnZlcnQgaXQgYWNjb3JkaW5nCi0gICB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2F2ZV9zeW1ib2xfbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgdW5zaWduZWQgaW50IG5hbWVfbGVuZ3RoOwotICBjaGFyICpyZXQ7Ci0KLSAgbmFtZV9sZW5ndGggPSBzdHJsZW4gKG5hbWUpICsgMTsJLyogKzEgZm9yIFwwICovCi0gIG9ic3RhY2tfZ3JvdyAoJm5vdGVzLCBuYW1lLCBuYW1lX2xlbmd0aCk7Ci0gIHJldCA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOwotCi0jaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQotICBpZiAocmV0WzBdID09ICdfJykKLSAgICArK3JldDsKLSNlbmRpZgotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHJldCA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAocmV0KTsKLSNlbmRpZgotCi0gIGlmICghIHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqczsKLQotICAgICAgZm9yIChzID0gKHVuc2lnbmVkIGNoYXIgKikgcmV0OyAqcyAhPSAnXDAnOyBzKyspCi0JaWYgKGlzbG93ZXIgKCpzKSkKLQkgICpzID0gdG91cHBlciAoKnMpOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi1zeW1ib2xTICoKLXN5bWJvbF9jcmVhdGUgKG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBJdCBpcyBjb3BpZWQsIHRoZSBjYWxsZXIgY2FuIGRlc3Ryb3kvbW9kaWZ5ICovCi0gICAgIHNlZ1Qgc2VnbWVudDsJCS8qIFNlZ21lbnQgaWRlbnRpZmllciAoU0VHXzxzb21ldGhpbmc+KSAqLwotICAgICB2YWx1ZVQgdmFsdTsJCS8qIFN5bWJvbCB2YWx1ZSAqLwotICAgICBmcmFnUyAqZnJhZzsJCS8qIEFzc29jaWF0ZWQgZnJhZ21lbnQgKi8KLXsKLSAgY2hhciAqcHJlc2VydmVkX2NvcHlfb2ZfbmFtZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lID0gc2F2ZV9zeW1ib2xfbmFtZSAobmFtZSk7Ci0KLSAgc3ltYm9sUCA9IChzeW1ib2xTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChzeW1ib2xTKSk7Ci0KLSAgLyogc3ltYm9sIG11c3QgYmUgYm9ybiBpbiBzb21lIGZpeGVkIHN0YXRlLiAgVGhpcyBzZWVtcyBhcyBnb29kIGFzIGFueS4gKi8KLSAgbWVtc2V0IChzeW1ib2xQLCAwLCBzaXplb2YgKHN5bWJvbFMpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgc3ltYm9sUC0+YnN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoc3Rkb3V0cHV0KTsKLSAgaWYgKHN5bWJvbFAtPmJzeW0gPT0gTlVMTCkKLSAgICBhc19wZXJyb3IgKCIlcyIsICJiZmRfbWFrZV9lbXB0eV9zeW1ib2wiKTsKLSAgc3ltYm9sUC0+YnN5bS0+dWRhdGEucCA9IChQVFIpIHN5bWJvbFA7Ci0jZW5kaWYKLSAgU19TRVRfTkFNRSAoc3ltYm9sUCwgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7Ci0KLSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2VnbWVudCk7Ci0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWx1KTsKLSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgKHN5bWJvbFApOwotCi0gIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnOwotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gIHN5bWJvbFAtPnN5X251bWJlciA9IH4wOwotICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIH4wOwotI2VuZGlmCi0KLSAgb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0KLSNpZmRlZiB0Y19zeW1ib2xfbmV3X2hvb2sKLSAgdGNfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gIHJldHVybiBzeW1ib2xQOwotfQotDAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogTG9jYWwgc3ltYm9sIHN1cHBvcnQuICBJZiB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBpdCwgd2Uga2VlcCBvbmx5IGEKLSAgIHNtYWxsIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmb3IgbG9jYWwgc3ltYm9scy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NhbF9zeW1ib2xfbWFrZSBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlZ1QsCi0JCQkJCQkgICAgICAgdmFsdWVULCBmcmFnUyAqKSk7Ci1zdGF0aWMgc3ltYm9sUyAqbG9jYWxfc3ltYm9sX2NvbnZlcnQgUEFSQU1TICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSk7Ci0KLS8qIFVzZWQgZm9yIHN0YXRpc3RpY3MuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb2NhbF9zeW1ib2xfY291bnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb2NhbF9zeW1ib2xfY29udmVyc2lvbl9jb3VudDsKLQotLyogVGhpcyBtYWNybyBpcyBjYWxsZWQgd2l0aCBhIHN5bWJvbCBhcmd1bWVudCBwYXNzZWQgYnkgcmVmZXJlbmNlLgotICAgSXQgcmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wuICBJZiBuZWNlc3NhcnksIGl0Ci0gICBjaGFuZ2VzIGl0cyBhcmd1bWVudCB0byB0aGUgcmVhbCBzeW1ib2wuICAqLwotCi0jZGVmaW5lIExPQ0FMX1NZTUJPTF9DSEVDSyhzKQkJCQkJCVwKLSAgKHMtPmJzeW0gPT0gTlVMTAkJCQkJCQlcCi0gICA/IChsb2NhbF9zeW1ib2xfY29udmVydGVkX3AgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpCQlcCi0gICAgICA/IChzID0gbG9jYWxfc3ltYm9sX2dldF9yZWFsX3N5bWJvbCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyksCVwKLQkgMCkJCQkJCQkJCVwKLSAgICAgIDogMSkJCQkJCQkJCVwKLSAgIDogMCkKLQotLyogQ3JlYXRlIGEgbG9jYWwgc3ltYm9sIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgbG9jYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbG9jYWxfc3ltYm9sICoKLWxvY2FsX3N5bWJvbF9tYWtlIChuYW1lLCBzZWN0aW9uLCBvZmZzZXQsIGZyYWcpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHNlZ1Qgc2VjdGlvbjsKLSAgICAgdmFsdWVUIG9mZnNldDsKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGNoYXIgKm5hbWVfY29weTsKLSAgc3RydWN0IGxvY2FsX3N5bWJvbCAqcmV0OwotCi0gICsrbG9jYWxfc3ltYm9sX2NvdW50OwotCi0gIG5hbWVfY29weSA9IHNhdmVfc3ltYm9sX25hbWUgKG5hbWUpOwotCi0gIHJldCA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mICpyZXQpOwotICByZXQtPmxzeV9tYXJrZXIgPSBOVUxMOwotICByZXQtPmxzeV9uYW1lID0gbmFtZV9jb3B5OwotICByZXQtPmxzeV9zZWN0aW9uID0gc2VjdGlvbjsKLSAgbG9jYWxfc3ltYm9sX3NldF9mcmFnIChyZXQsIGZyYWcpOwotICByZXQtPmxzeV9vZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgaGFzaF9qYW0gKGxvY2FsX2hhc2gsIG5hbWVfY29weSwgKFBUUikgcmV0KTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBDb252ZXJ0IGEgbG9jYWwgc3ltYm9sIGludG8gYSByZWFsIHN5bWJvbC4gIE5vdGUgdGhhdCB3ZSBkbyBub3QKLSAgIHJlY2xhaW0gdGhlIHNwYWNlIHVzZWQgYnkgdGhlIGxvY2FsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBzeW1ib2xTICoKLWxvY2FsX3N5bWJvbF9jb252ZXJ0IChsb2NzeW0pCi0gICAgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bTsKLXsKLSAgc3ltYm9sUyAqcmV0OwotCi0gIGFzc2VydCAobG9jc3ltLT5sc3lfbWFya2VyID09IE5VTEwpOwotICBpZiAobG9jYWxfc3ltYm9sX2NvbnZlcnRlZF9wIChsb2NzeW0pKQotICAgIHJldHVybiBsb2NhbF9zeW1ib2xfZ2V0X3JlYWxfc3ltYm9sIChsb2NzeW0pOwotCi0gICsrbG9jYWxfc3ltYm9sX2NvbnZlcnNpb25fY291bnQ7Ci0KLSAgcmV0ID0gc3ltYm9sX25ldyAobG9jc3ltLT5sc3lfbmFtZSwgbG9jc3ltLT5sc3lfc2VjdGlvbiwgbG9jc3ltLT5sc3lfb2Zmc2V0LAotCQkgICAgbG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pKTsKLQotICBpZiAobG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AgKGxvY3N5bSkpCi0gICAgcmV0LT5zeV9yZXNvbHZlZCA9IDE7Ci0KLSAgLyogTG9jYWwgc3ltYm9scyBhcmUgYWx3YXlzIGVpdGhlciBkZWZpbmVkIG9yIHVzZWQuICAqLwotICByZXQtPnN5X3VzZWQgPSAxOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHJldCk7Ci0KLSAgbG9jYWxfc3ltYm9sX21hcmtfY29udmVydGVkIChsb2NzeW0pOwotICBsb2NhbF9zeW1ib2xfc2V0X3JlYWxfc3ltYm9sIChsb2NzeW0sIHJldCk7Ci0KLSAgaGFzaF9qYW0gKGxvY2FsX2hhc2gsIGxvY3N5bS0+bHN5X25hbWUsIE5VTEwpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIExPQ0FMX1NZTUJPTF9DSEVDSyhzKSAwCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9jb252ZXJ0KHMpICgoc3ltYm9sUyAqKSBzKQotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0MCi0KLS8qCi0gKgkJCWNvbG9uKCkKLSAqCi0gKiBXZSBoYXZlIGp1c3Qgc2VlbiAiPG5hbWU+OiIuCi0gKiBDcmVhdGVzIGEgc3RydWN0IHN5bWJvbCB1bmxlc3MgaXQgYWxyZWFkeSBleGlzdHMuCi0gKgotICogR3JpcGVzIGlmIHdlIGFyZSByZWRlZmluaW5nIGEgc3ltYm9sIGluY29tcGF0aWJseSAoYW5kIGlnbm9yZXMgaXQpLgotICoKLSAqLwotc3ltYm9sUyAqCi1jb2xvbiAoc3ltX25hbWUpCQkvKiBqdXN0IHNlZW4gIng6IiAtIHJhdHRsZSBzeW1ib2xzICYgZnJhZ3MgKi8KLSAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7CS8qIHN5bWJvbCBuYW1lLCBhcyBhIGNhbm5vbmljYWwgc3RyaW5nICovCi0gICAgIC8qIFdlIGNvcHkgdGhpcyBzdHJpbmc6IE9LIHRvIGFsdGVyIGxhdGVyLiAqLwotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwkvKiBzeW1ib2wgd2UgYXJlIHdvcmtpbmcgd2l0aCAqLwotCi0gIC8qIFN1biBsb2NhbCBsYWJlbHMgZ28gb3V0IG9mIHNjb3BlIHdoZW5ldmVyIGEgbm9uLWxvY2FsIHN5bWJvbCBpcwotICAgICBkZWZpbmVkLiAgKi8KLSAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIpCi0gICAgewotICAgICAgaW50IGxvY2FsOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbG9jYWwgPSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoc3Rkb3V0cHV0LCBzeW1fbmFtZSk7Ci0jZWxzZQotICAgICAgbG9jYWwgPSBMT0NBTF9MQUJFTCAoc3ltX25hbWUpOwotI2VuZGlmCi0KLSAgICAgIGlmICghIGxvY2FsKQotCWRvbGxhcl9sYWJlbF9jbGVhciAoKTsKLSAgICB9Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICBpZiAobmV3X2Jyb2tlbl93b3JkcykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKmE7Ci0gICAgICBpbnQgcG9zc2libGVfYnl0ZXM7Ci0gICAgICBmcmFnUyAqZnJhZ190bXA7Ci0gICAgICBjaGFyICpmcmFnX29wY29kZTsKLQotICAgICAgZXh0ZXJuIGNvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemU7Ci0gICAgICBleHRlcm4gY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplOwotICAgICAgcG9zc2libGVfYnl0ZXMgPSAobWRfc2hvcnRfanVtcF9zaXplCi0JCQkrIG5ld19icm9rZW5fd29yZHMgKiBtZF9sb25nX2p1bXBfc2l6ZSk7Ci0KLSAgICAgIGZyYWdfdG1wID0gZnJhZ19ub3c7Ci0gICAgICBmcmFnX29wY29kZSA9IGZyYWdfdmFyIChyc19icm9rZW5fd29yZCwKLQkJCSAgICAgIHBvc3NpYmxlX2J5dGVzLAotCQkJICAgICAgcG9zc2libGVfYnl0ZXMsCi0JCQkgICAgICAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkJICAgICAgKHN5bWJvbFMgKikgYnJva2VuX3dvcmRzLAotCQkJICAgICAgKG9mZnNldFQpIDAsCi0JCQkgICAgICBOVUxMKTsKLQotICAgICAgLyogV2Ugd2FudCB0byBzdG9yZSB0aGUgcG9pbnRlciB0byB3aGVyZSB0byBpbnNlcnQgdGhlIGp1bXAgdGFibGUgaW4gdGhlCi0JIGZyX29wY29kZSBvZiB0aGUgcnNfYnJva2VuX3dvcmQgZnJhZy4gIFRoaXMgcmVxdWlyZXMgYSBsaXR0bGUKLQkgaGFja2VyeS4gICovCi0gICAgICB3aGlsZSAoZnJhZ190bXAKLQkgICAgICYmIChmcmFnX3RtcC0+ZnJfdHlwZSAhPSByc19icm9rZW5fd29yZAotCQkgfHwgZnJhZ190bXAtPmZyX29wY29kZSkpCi0JZnJhZ190bXAgPSBmcmFnX3RtcC0+ZnJfbmV4dDsKLSAgICAgIGtub3cgKGZyYWdfdG1wKTsKLSAgICAgIGZyYWdfdG1wLT5mcl9vcGNvZGUgPSBmcmFnX29wY29kZTsKLSAgICAgIG5ld19icm9rZW5fd29yZHMgPSAwOwotCi0gICAgICBmb3IgKGEgPSBicm9rZW5fd29yZHM7IGEgJiYgYS0+ZGlzcGZyYWcgPT0gMDsgYSA9IGEtPm5leHRfYnJva2VuX3dvcmQpCi0JYS0+ZGlzcGZyYWcgPSBmcmFnX3RtcDsKLSAgICB9Ci0jZW5kaWYgLyogV09SS0lOR19ET1RfV09SRCAqLwotCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChzeW1fbmFtZSkpICE9IDApCi0gICAgewotI2lmZGVmIFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTgotICAgICAgaWYgKFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTiAoc3ltYm9sUCkpCi0JcmV0dXJuIHN5bWJvbFA7Ci0jZW5kaWYKLSAgICAgIC8qCi0gICAgICAgKglOb3cgY2hlY2sgZm9yIHVuZGVmaW5lZCBzeW1ib2xzCi0gICAgICAgKi8KLSAgICAgIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotCXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NzeW0gPSAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzeW1ib2xQOwotCi0JICBpZiAobG9jc3ltLT5sc3lfc2VjdGlvbiAhPSB1bmRlZmluZWRfc2VjdGlvbgotCSAgICAgICYmIChsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkgIT0gZnJhZ19ub3cKLQkJICB8fCBsb2NzeW0tPmxzeV9zZWN0aW9uICE9IG5vd19zZWcKLQkJICB8fCBsb2NzeW0tPmxzeV9vZmZzZXQgIT0gZnJhZ19ub3dfZml4ICgpKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZC4iKSwgc3ltX25hbWUpOwotCSAgICAgIHJldHVybiBzeW1ib2xQOwotCSAgICB9Ci0KLQkgIGxvY3N5bS0+bHN5X3NlY3Rpb24gPSBub3dfc2VnOwotCSAgbG9jYWxfc3ltYm9sX3NldF9mcmFnIChsb2NzeW0sIGZyYWdfbm93KTsKLQkgIGxvY3N5bS0+bHN5X29mZnNldCA9IGZyYWdfbm93X2ZpeCAoKTsKLSNlbmRpZgotCX0KLSAgICAgIGVsc2UgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLQl7Ci0JICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApCi0JICAgIHsKLQkgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0jaWZkZWYgT0JKX1ZNUwotCSAgICAgIFNfU0VUX09USEVSKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOwotI2VuZGlmCi0JICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgbm93X3NlZyk7Ci0jaWZkZWYgTl9VTkRGCi0JICAgICAga25vdyAoTl9VTkRGID09IDApOwotI2VuZGlmIC8qIGlmIHdlIGhhdmUgb25lLCBpdCBiZXR0ZXIgYmUgemVyby4gKi8KLQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCVRoZXJlIGFyZSBzdGlsbCBzZXZlcmFsIGNhc2VzIHRvIGNoZWNrOgotCSAgICAgICAqCQlBIC5jb21tLy5sY29tbSBzeW1ib2wgYmVpbmcgcmVkZWZpbmVkIGFzCi0JICAgICAgICoJCQlpbml0aWFsaXplZCBkYXRhIGlzIE9LCi0JICAgICAgICoJCUEgLmNvbW0vLmxjb21tIHN5bWJvbCBiZWluZyByZWRlZmluZWQgd2l0aAotCSAgICAgICAqCQkJYSBsYXJnZXIgc2l6ZSBpcyBhbHNvIE9LCi0JICAgICAgICoKLQkgICAgICAgKiBUaGlzIG9ubHkgdXNlZCB0byBiZSBhbGxvd2VkIG9uIFZNUyBnYXMsIGJ1dCBTdW4gY2MKLQkgICAgICAgKiBvbiB0aGUgc3BhcmMgYWxzbyBkZXBlbmRzIG9uIGl0LgotCSAgICAgICAqLwotCi0JICAgICAgaWYgKCgoIVNfSVNfREVCVUcgKHN5bWJvbFApCi0JCSAgICAmJiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgU19JU19DT01NT04gKHN5bWJvbFApKQotCQkgICAgJiYgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkpCi0JCSAgIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCQkgICYmIChub3dfc2VnID09IGRhdGFfc2VjdGlvbgotCQkgICAgICB8fCBub3dfc2VnID09IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApKSkKLQkJewotCQkgIC8qCi0JCSAgICoJU2VsZWN0IHdoaWNoIG9mIHRoZSAyIGNhc2VzIHRoaXMgaXMKLQkJICAgKi8KLQkJICBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24pCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqICAgTmV3IC5jb21tIGZvciBwcmV2IC5jb21tIHN5bWJvbC4KLQkJICAgICAgICoJSWYgdGhlIG5ldyBzaXplIGlzIGxhcmdlciB3ZSBqdXN0Ci0JCSAgICAgICAqCWNoYW5nZSBpdHMgdmFsdWUuICBJZiB0aGUgbmV3IHNpemUKLQkJICAgICAgICoJaXMgc21hbGxlciwgd2UgaWdub3JlIHRoaXMgc3ltYm9sCi0JCSAgICAgICAqLwotCQkgICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApCi0JCQkgIDwgKCh1bnNpZ25lZCkgZnJhZ19ub3dfZml4ICgpKSkKLQkJCXsKLQkJCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBJdCBpcyBhIC5jb21tLy5sY29tbSBiZWluZyBjb252ZXJ0ZWQgdG8gaW5pdGlhbGl6ZWQKLQkJCSBkYXRhLiAgKi8KLQkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotI2lmZGVmIE9CSl9WTVMKLQkJICAgICAgU19TRVRfT1RIRVIoc3ltYm9sUCwgY29uc3RfZmxhZyk7Ci0jZW5kaWYKLQkJICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIG5vd19zZWcpOwkvKiBrZWVwIE5fRVhUIGJpdCAqLwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0jaWYgZGVmaW5lZCAoU19HRVRfT1RIRVIpICYmIGRlZmluZWQgKFNfR0VUX0RFU0MpCi0JCSAgYXNfZmF0YWwgKF8oIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lZC4lZC4lbGQuIiksCi0JCQkgICAgc3ltX25hbWUsCi0JCQkgICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSksCi0JCQkgICAgU19HRVRfT1RIRVIgKHN5bWJvbFApLCBTX0dFVF9ERVNDIChzeW1ib2xQKSwKLQkJCSAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApKTsKLSNlbHNlCi0JCSAgYXNfZmF0YWwgKF8oIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lbGQuIiksCi0JCQkgICAgc3ltX25hbWUsCi0JCQkgICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSksCi0JCQkgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSk7Ci0jZW5kaWYKLQkJfQotCSAgICB9CQkJLyogaWYgdGhlIHVuZGVmaW5lZCBzeW1ib2wgaGFzIG5vIHZhbHVlICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvbid0IGJsb3cgdXAgaWYgdGhlIGRlZmluaXRpb24gaXMgdGhlIHNhbWUgKi8KLQkgIGlmICghKGZyYWdfbm93ID09IHN5bWJvbFAtPnN5X2ZyYWcKLQkJJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IGZyYWdfbm93X2ZpeCAoKQotCQkmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBub3dfc2VnKSkKLQkgICAgYXNfZmF0YWwgKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQuIiksIHN5bV9uYW1lKTsKLQl9CQkJLyogaWYgdGhpcyBzeW1ib2wgaXMgbm90IHlldCBkZWZpbmVkICovCi0KLSAgICB9Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBlbHNlIGlmICghIGZsYWdfa2VlcF9sb2NhbHMgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKHN0ZG91dHB1dCwgc3ltX25hbWUpKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBsb2NhbF9zeW1ib2xfbWFrZSAoc3ltX25hbWUsIG5vd19zZWcsCi0JCQkJCSAgICAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSAgICAgICBmcmFnX25vdyk7Ci0gICAgfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChzeW1fbmFtZSwgbm93X3NlZywgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJICAgIGZyYWdfbm93KTsKLSNpZmRlZiBPQkpfVk1TCi0gICAgICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgY29uc3RfZmxhZyk7Ci0jZW5kaWYgLyogT0JKX1ZNUyAqLwotCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLSAgICB9CQkJCS8qIGlmIHdlIGhhdmUgc2VlbiB0aGlzIHN5bWJvbCBiZWZvcmUgKi8KLQotICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCBpcyBhY3R1YWxseSBiZWluZyBkZWZpbmVkIHdpdGhpbiBhbiBNUkkgY29tbW9uCi0gICAgICAgICBzZWN0aW9uLiAgVGhpcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotCXN5bWJvbFAgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPSBtcmlfY29tbW9uX3N5bWJvbDsKLSAgICAgIHN5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCk7Ci0gICAgICBzeW1ib2xQLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgZXhwcl9zZWN0aW9uKTsKLSAgICAgIHN5bWJvbFAtPnN5X21yaV9jb21tb24gPSAxOwotICAgIH0KLQotI2lmZGVmIHRjX2Zyb2JfbGFiZWwKLSAgdGNfZnJvYl9sYWJlbCAoc3ltYm9sUCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9sYWJlbAotICBvYmpfZnJvYl9sYWJlbCAoc3ltYm9sUCk7Ci0jZW5kaWYKLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQwKLQotLyoKLSAqCQkJc3ltYm9sX3RhYmxlX2luc2VydCgpCi0gKgotICogRGllIGlmIHdlIGNhbid0IGluc2VydCB0aGUgc3ltYm9sLgotICoKLSAqLwotCi12b2lkIAotc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyb3Jfc3RyaW5nOwotCi0gIGtub3cgKHN5bWJvbFApOwotICBrbm93IChTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltYm9sUCkpCi0gICAgewotICAgICAgZXJyb3Jfc3RyaW5nID0gaGFzaF9qYW0gKGxvY2FsX2hhc2gsIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkJICAgICAgIChQVFIpIHN5bWJvbFApOwotICAgICAgaWYgKGVycm9yX3N0cmluZyAhPSBOVUxMKQotCWFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3ltYm9sIHRhYmxlIGZhaWxlZDogJXMiKSwKLQkJICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgZXJyb3Jfc3RyaW5nKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKChlcnJvcl9zdHJpbmcgPSBoYXNoX2phbSAoc3lfaGFzaCwgU19HRVRfTkFNRSAoc3ltYm9sUCksIChQVFIpIHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN5bWJvbCB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLCBlcnJvcl9zdHJpbmcpOwotICAgIH0JCQkJLyogb24gZXJyb3IgKi8KLX0JCQkJLyogc3ltYm9sX3RhYmxlX2luc2VydCgpICovCi0MCi0vKgotICoJCQlzeW1ib2xfZmluZF9vcl9tYWtlKCkKLSAqCi0gKiBJZiBhIHN5bWJvbCBuYW1lIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgaXQgYXMgdW5kZWZpbmVkLCBhbmQgaW5zZXJ0Ci0gKiBpdCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuIFJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0gKi8KLXN5bWJvbFMgKgotc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCi0gIGlmIChzeW1ib2xQID09IE5VTEwpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmICghIGZsYWdfa2VlcF9sb2NhbHMgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKHN0ZG91dHB1dCwgbmFtZSkpCi0JewotCSAgc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKChjaGFyICopIG5hbWUpOwotCSAgaWYgKHN5bWJvbFAgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHN5bWJvbFA7Ci0KLQkgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBsb2NhbF9zeW1ib2xfbWFrZSAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJCQkgICAodmFsdWVUKSAwLAotCQkJCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLQkgIHJldHVybiBzeW1ib2xQOwotCX0KLSNlbmRpZgotCi0gICAgICBzeW1ib2xQID0gc3ltYm9sX21ha2UgKG5hbWUpOwotCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLSAgICB9CQkJCS8qIGlmIHN5bWJvbCB3YXNuJ3QgZm91bmQgKi8KLQotICByZXR1cm4gKHN5bWJvbFApOwotfQkJCQkvKiBzeW1ib2xfZmluZF9vcl9tYWtlKCkgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfbWFrZSAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAvKiBMZXQgdGhlIG1hY2hpbmUgZGVzY3JpcHRpb24gZGVmYXVsdCBpdCwgZS5nLiBmb3IgcmVnaXN0ZXIgbmFtZXMuICovCi0gIHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sICgoY2hhciAqKSBuYW1lKTsKLQotICBpZiAoIXN5bWJvbFApCi0gICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAodmFsdWVUKSAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIHJldHVybiAoc3ltYm9sUCk7Ci19CQkJCS8qIHN5bWJvbF9tYWtlKCkgKi8KLQotLyoKLSAqCQkJc3ltYm9sX2ZpbmQoKQotICoKLSAqIEltcGxlbWVudCBzeW1ib2wgdGFibGUgbG9va3VwLgotICogSW46CUEgc3ltYm9sJ3MgbmFtZSBhcyBhIHN0cmluZzogJ1wwJyBjYW4ndCBiZSBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuCi0gKiBPdXQ6CU5VTEwgaWYgdGhlIG5hbWUgd2FzIG5vdCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBlbHNlIHRoZSBhZGRyZXNzCi0gKglvZiBhIHN0cnVjdCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZS4KLSAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgcmV0dXJuIChzeW1ib2xfZmluZF9iYXNlIChuYW1lLCAxKSk7Ci0jZWxzZSAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi0gIHJldHVybiAoc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgMCkpOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLX0JCQkJLyogc3ltYm9sX2ZpbmQoKSAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kX2Jhc2UgKG5hbWUsIHN0cmlwX3VuZGVyc2NvcmUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzdHJpcF91bmRlcnNjb3JlOwotewotICBpZiAoc3RyaXBfdW5kZXJzY29yZSAmJiAqbmFtZSA9PSAnXycpCi0gICAgbmFtZSsrOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHsKLSAgICBjaGFyICpjb3B5OwotICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKG5hbWUpICsgMTsKLQotICAgIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKGxlbik7Ci0gICAgbWVtY3B5IChjb3B5LCBuYW1lLCBsZW4pOwotICAgIG5hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKGNvcHkpOwotICB9Ci0jZW5kaWYKLQotICBpZiAoISBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKQotICAgIHsKLSAgICAgIGNoYXIgKmNvcHk7Ci0gICAgICBjb25zdCBjaGFyICpvcmlnOwotICAgICAgdW5zaWduZWQgY2hhciBjOwotCi0gICAgICBvcmlnID0gbmFtZTsKLSAgICAgIG5hbWUgPSBjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIHdoaWxlICgoYyA9ICpvcmlnKyspICE9ICdcMCcpCi0JewotCSAgaWYgKGlzbG93ZXIgKGMpKQotCSAgICBjID0gdG91cHBlciAoYyk7Ci0JICAqY29weSsrID0gYzsKLQl9Ci0gICAgICAqY29weSA9ICdcMCc7Ci0gICAgfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jc3ltOwotCi0gICAgbG9jc3ltID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgaGFzaF9maW5kIChsb2NhbF9oYXNoLCBuYW1lKTsKLSAgICBpZiAobG9jc3ltICE9IE5VTEwpCi0gICAgICByZXR1cm4gKHN5bWJvbFMgKikgbG9jc3ltOwotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gKChzeW1ib2xTICopIGhhc2hfZmluZCAoc3lfaGFzaCwgbmFtZSkpOwotfQotCi0vKgotICogT25jZSB1cG9uIGEgdGltZSwgc3ltYm9scyB3ZXJlIGtlcHQgaW4gYSBzaW5nbHkgbGlua2VkIGxpc3QuICBBdAotICogbGVhc3QgY29mZiBuZWVkcyB0byBiZSBhYmxlIHRvIHJlYXJyYW5nZSB0aGVtIGZyb20gdGltZSB0byB0aW1lLCBmb3IKLSAqIHdoaWNoIGEgZG91Ymx5IGxpbmtlZCBsaXN0IGlzIG11Y2ggbW9yZSBjb252ZW5pZW50LiAgTG9pYyBkaWQgdGhlc2UKLSAqIGFzIG1hY3JvcyB3aGljaCBzZWVtZWQgZGFuZ2Vyb3VzIHRvIG1lIHNvIHRoZXkncmUgbm93IGZ1bmN0aW9ucy4KLSAqIHhveG9yaWNoLgotICovCi0KLS8qIExpbmsgc3ltYm9sIEFERE1FIGFmdGVyIHN5bWJvbCBUQVJHRVQgaW4gdGhlIGNoYWluLiAqLwotdm9pZCAKLXN5bWJvbF9hcHBlbmQgKGFkZG1lLCB0YXJnZXQsIHJvb3RQUCwgbGFzdFBQKQotICAgICBzeW1ib2xTICphZGRtZTsKLSAgICAgc3ltYm9sUyAqdGFyZ2V0OwotICAgICBzeW1ib2xTICoqcm9vdFBQOwotICAgICBzeW1ib2xTICoqbGFzdFBQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChhZGRtZSkpCi0gICAgYWJvcnQgKCk7Ci0gIGlmICh0YXJnZXQgIT0gTlVMTCAmJiBMT0NBTF9TWU1CT0xfQ0hFQ0sgKHRhcmdldCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHRhcmdldCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGtub3cgKCpyb290UFAgPT0gTlVMTCk7Ci0gICAgICBrbm93ICgqbGFzdFBQID09IE5VTEwpOwotICAgICAgYWRkbWUtPnN5X25leHQgPSBOVUxMOwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgICAgIGFkZG1lLT5zeV9wcmV2aW91cyA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgICpyb290UFAgPSBhZGRtZTsKLSAgICAgICpsYXN0UFAgPSBhZGRtZTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIHRoZSBsaXN0IGlzIGVtcHR5ICovCi0KLSAgaWYgKHRhcmdldC0+c3lfbmV4dCAhPSBOVUxMKQotICAgIHsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gICAgICB0YXJnZXQtPnN5X25leHQtPnN5X3ByZXZpb3VzID0gYWRkbWU7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKCpsYXN0UFAgPT0gdGFyZ2V0KTsKLSAgICAgICpsYXN0UFAgPSBhZGRtZTsKLSAgICB9CQkJCS8qIGlmIHdlIGhhdmUgYSBuZXh0ICovCi0KLSAgYWRkbWUtPnN5X25leHQgPSB0YXJnZXQtPnN5X25leHQ7Ci0gIHRhcmdldC0+c3lfbmV4dCA9IGFkZG1lOwotCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICBhZGRtZS0+c3lfcHJldmlvdXMgPSB0YXJnZXQ7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0gIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoc3ltYm9sX3Jvb3RQLCBzeW1ib2xfbGFzdFApOwotfQotCi0vKiBTZXQgdGhlIGNoYWluIHBvaW50ZXJzIG9mIFNZTUJPTCB0byBudWxsLiAqLwotdm9pZCAKLXN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLSAgICBhYm9ydCAoKTsKLSAgc3ltYm9sUC0+c3lfbmV4dCA9IE5VTEw7Ci0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICBzeW1ib2xQLT5zeV9wcmV2aW91cyA9IE5VTEw7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLS8qIFJlbW92ZSBTWU1CT0xQIGZyb20gdGhlIGxpc3QuICovCi12b2lkIAotc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgcm9vdFBQLCBsYXN0UFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIHN5bWJvbFMgKipyb290UFA7Ci0gICAgIHN5bWJvbFMgKipsYXN0UFA7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChzeW1ib2xQID09ICpyb290UFApCi0gICAgewotICAgICAgKnJvb3RQUCA9IHN5bWJvbFAtPnN5X25leHQ7Ci0gICAgfQkJCQkvKiBpZiBpdCB3YXMgdGhlIHJvb3QgKi8KLQotICBpZiAoc3ltYm9sUCA9PSAqbGFzdFBQKQotICAgIHsKLSAgICAgICpsYXN0UFAgPSBzeW1ib2xQLT5zeV9wcmV2aW91czsKLSAgICB9CQkJCS8qIGlmIGl0IHdhcyB0aGUgdGFpbCAqLwotCi0gIGlmIChzeW1ib2xQLT5zeV9uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfbmV4dC0+c3lfcHJldmlvdXMgPSBzeW1ib2xQLT5zeV9wcmV2aW91czsKLSAgICB9CQkJCS8qIGlmIG5vdCBsYXN0ICovCi0KLSAgaWYgKHN5bWJvbFAtPnN5X3ByZXZpb3VzICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfcHJldmlvdXMtPnN5X25leHQgPSBzeW1ib2xQLT5zeV9uZXh0OwotICAgIH0JCQkJLyogaWYgbm90IGZpcnN0ICovCi0KLSAgZGVidWdfdmVyaWZ5X3N5bWNoYWluICgqcm9vdFBQLCAqbGFzdFBQKTsKLX0KLQotLyogTGluayBzeW1ib2wgQURETUUgYmVmb3JlIHN5bWJvbCBUQVJHRVQgaW4gdGhlIGNoYWluLiAqLwotdm9pZCAKLXN5bWJvbF9pbnNlcnQgKGFkZG1lLCB0YXJnZXQsIHJvb3RQUCwgbGFzdFBQKQotICAgICBzeW1ib2xTICphZGRtZTsKLSAgICAgc3ltYm9sUyAqdGFyZ2V0OwotICAgICBzeW1ib2xTICoqcm9vdFBQOwotICAgICBzeW1ib2xTICoqbGFzdFBQIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKGFkZG1lKSkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAodGFyZ2V0KSkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAodGFyZ2V0LT5zeV9wcmV2aW91cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHRhcmdldC0+c3lfcHJldmlvdXMtPnN5X25leHQgPSBhZGRtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBrbm93ICgqcm9vdFBQID09IHRhcmdldCk7Ci0gICAgICAqcm9vdFBQID0gYWRkbWU7Ci0gICAgfQkJCQkvKiBpZiBub3QgZmlyc3QgKi8KLQotICBhZGRtZS0+c3lfcHJldmlvdXMgPSB0YXJnZXQtPnN5X3ByZXZpb3VzOwotICB0YXJnZXQtPnN5X3ByZXZpb3VzID0gYWRkbWU7Ci0gIGFkZG1lLT5zeV9uZXh0ID0gdGFyZ2V0OwotCi0gIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoKnJvb3RQUCwgKmxhc3RQUCk7Ci19Ci0KLSNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCi0KLXZvaWQgCi12ZXJpZnlfc3ltYm9sX2NoYWluIChyb290UCwgbGFzdFApCi0gICAgIHN5bWJvbFMgKnJvb3RQOwotICAgICBzeW1ib2xTICpsYXN0UDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IHJvb3RQOwotCi0gIGlmIChzeW1ib2xQID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoOyBzeW1ib2xfbmV4dCAoc3ltYm9sUCkgIT0gTlVMTDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYXNzZXJ0IChzeW1ib2xQLT5ic3ltICE9IE5VTEwpOwotI2VuZGlmCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICAgICAgYXNzZXJ0IChzeW1ib2xQLT5zeV9uZXh0LT5zeV9wcmV2aW91cyA9PSBzeW1ib2xQKTsKLSNlbHNlCi0gICAgICAvKiBXYWxrIHRoZSBsaXN0IGFueXdheXMsIHRvIG1ha2Ugc3VyZSBwb2ludGVycyBhcmUgc3RpbGwgZ29vZC4gICovCi0gICAgICA7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotICAgIH0KLQotICBhc3NlcnQgKGxhc3RQID09IHN5bWJvbFApOwotfQotCi12b2lkCi12ZXJpZnlfc3ltYm9sX2NoYWluXzIgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBzeW1ib2xTICpwID0gc3ltLCAqbiA9IHN5bTsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gIHdoaWxlIChzeW1ib2xfcHJldmlvdXMgKHApKQotICAgIHAgPSBzeW1ib2xfcHJldmlvdXMgKHApOwotI2VuZGlmCi0gIHdoaWxlIChzeW1ib2xfbmV4dCAobikpCi0gICAgbiA9IHN5bWJvbF9uZXh0IChuKTsKLSAgdmVyaWZ5X3N5bWJvbF9jaGFpbiAocCwgbik7Ci19Ci0KLS8qIFJlc29sdmUgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBmaW5hbAotICAgcGFzcyBvdmVyIHRoZSBzeW1ib2wgdGFibGUgdG8gcmVzb2x2ZSBhbnkgc3ltYm9scyB3aXRoIGNvbXBsZXgKLSAgIHZhbHVlcy4gICovCi0KLXZhbHVlVAotcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bXAsIGZpbmFsaXplKQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgZmluYWxpemU7Ci17Ci0gIGludCByZXNvbHZlZDsKLSAgdmFsdWVUIGZpbmFsX3ZhbDsKLSAgc2VnVCBmaW5hbF9zZWc7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bXApKQotICAgIHsKLSAgICAgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bSA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bXA7Ci0KLSAgICAgIGlmIChsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCAobG9jc3ltKSkKLQlyZXR1cm4gbG9jc3ltLT5sc3lfb2Zmc2V0OwotCi0gICAgICBmaW5hbF92YWwgPSAobG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pLT5mcl9hZGRyZXNzCi0JCSAgICsgbG9jc3ltLT5sc3lfb2Zmc2V0KTsKLQotICAgICAgaWYgKGZpbmFsaXplKQotCXsKLQkgIGxvY3N5bS0+bHN5X29mZnNldCA9IGZpbmFsX3ZhbDsKLQkgIGxvY2FsX3N5bWJvbF9tYXJrX3Jlc29sdmVkIChsb2NzeW0pOwotCX0KLQotICAgICAgcmV0dXJuIGZpbmFsX3ZhbDsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoc3ltcC0+c3lfcmVzb2x2ZWQpCi0gICAgewotICAgICAgaWYgKHN5bXAtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudCkKLQlyZXR1cm4gKHZhbHVlVCkgc3ltcC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLQotICByZXNvbHZlZCA9IDA7Ci0gIGZpbmFsX3NlZyA9IFNfR0VUX1NFR01FTlQgKHN5bXApOwotCi0gIGlmIChzeW1wLT5zeV9yZXNvbHZpbmcpCi0gICAgewotICAgICAgaWYgKGZpbmFsaXplKQotCWFzX2JhZCAoXygiU3ltYm9sIGRlZmluaXRpb24gbG9vcCBlbmNvdW50ZXJlZCBhdCAlcyIpLCBTX0dFVF9OQU1FIChzeW1wKSk7Ci0gICAgICBmaW5hbF92YWwgPSAwOwotICAgICAgcmVzb2x2ZWQgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmFkZF9zeW1ib2wsICpvcF9zeW1ib2w7Ci0gICAgICBvZmZzZXRUIGxlZnQsIHJpZ2h0OwotICAgICAgc2VnVCBzZWdfbGVmdCwgc2VnX3JpZ2h0OwotICAgICAgb3BlcmF0b3JUIG9wOwotCi0gICAgICBzeW1wLT5zeV9yZXNvbHZpbmcgPSAxOwotCi0gICAgICAvKiBIZWxwIG91dCB3aXRoIENTRS4gICovCi0gICAgICBhZGRfc3ltYm9sID0gc3ltcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotICAgICAgb3Bfc3ltYm9sID0gc3ltcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2w7Ci0gICAgICBmaW5hbF92YWwgPSBzeW1wLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0gICAgICBvcCA9IHN5bXAtPnN5X3ZhbHVlLlhfb3A7Ci0KLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAob3ApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fYWJzZW50OgotCSAgZmluYWxfdmFsID0gMDsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0KLQljYXNlIE9fY29uc3RhbnQ6Ci0JICBmaW5hbF92YWwgKz0gc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKLQkgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uKQotCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCSAgcmVzb2x2ZWQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fc3ltYm9sOgotCWNhc2UgT19zeW1ib2xfcnZhOgotCSAgbGVmdCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0JZG9fc3ltYm9sOgotCi0JICBpZiAoc3ltcC0+c3lfbXJpX2NvbW1vbikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgaW5zaWRlIGFuIE1SSSBjb21tb24gc2VjdGlvbi4gIFRoZQotICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIHJvdXRpbmVzIGFyZSBnb2luZyB0byBoYW5kbGUgaXQgc3BlY2lhbGx5LgotICAgICAgICAgICAgICAgICBEb24ndCBjaGFuZ2UgdGhlIHZhbHVlLiAgKi8KLQkgICAgICByZXNvbHZlZCA9IHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoZmluYWxpemUgJiYgZmluYWxfdmFsID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChhZGRfc3ltYm9sKSkKLQkJYWRkX3N5bWJvbCA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKQotCQkJCQkJICAgYWRkX3N5bWJvbCk7Ci0JICAgICAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltcCwgYWRkX3N5bWJvbCk7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgaGF2ZSBlcXVhdGVkIHRoaXMgc3ltYm9sIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAga2VlcCBYX29wIHNldCB0byBPX3N5bWJvbCwgYW5kIHdlIGRvbid0IGNoYW5nZQotICAgICAgICAgICAgIFhfYWRkX251bWJlci4gIFRoaXMgcGVybWl0cyB0aGUgcm91dGluZSB3aGljaCB3cml0ZXMgb3V0Ci0gICAgICAgICAgICAgcmVsb2NhdGlvbiB0byBkZXRlY3QgdGhpcyBjYXNlLCBhbmQgY29udmVydCB0aGUKLSAgICAgICAgICAgICByZWxvY2F0aW9uIHRvIGJlIGFnYWluc3QgdGhlIHN5bWJvbCB0byB3aGljaCB0aGlzIHN5bWJvbAotICAgICAgICAgICAgIGlzIGVxdWF0ZWQuICAqLwotCSAgaWYgKCEgU19JU19ERUZJTkVEIChhZGRfc3ltYm9sKSB8fCBTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbCkpCi0JICAgIHsKLQkgICAgICBpZiAoZmluYWxpemUpCi0JCXsKLQkJICBTX1NFVF9TRUdNRU5UIChzeW1wLCBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sKSk7Ci0JCSAgc3ltcC0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOwotCQkgIHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCA9IGFkZF9zeW1ib2w7Ci0JCSAgc3ltcC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID0gZmluYWxfdmFsOwotCQl9Ci0JICAgICAgZmluYWxfdmFsID0gMDsKLQkgICAgICByZXNvbHZlZCA9IHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKTsKLQkgICAgICBnb3RvIGV4aXRfZG9udF9zZXRfdmFsdWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbmFsX3ZhbCArPSBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzICsgbGVmdDsKLQkgICAgICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbiB8fCBmaW5hbF9zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCWZpbmFsX3NlZyA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2wpOwotCSAgICB9Ci0KLQkgIHJlc29sdmVkID0gc3ltYm9sX3Jlc29sdmVkX3AgKGFkZF9zeW1ib2wpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fdW1pbnVzOgotCWNhc2UgT19iaXRfbm90OgotCWNhc2UgT19sb2dpY2FsX25vdDoKLQkgIGxlZnQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbCwgZmluYWxpemUpOwotCi0JICBpZiAob3AgPT0gT191bWludXMpCi0JICAgIGxlZnQgPSAtbGVmdDsKLQkgIGVsc2UgaWYgKG9wID09IE9fbG9naWNhbF9ub3QpCi0JICAgIGxlZnQgPSAhbGVmdDsKLQkgIGVsc2UKLQkgICAgbGVmdCA9IH5sZWZ0OwotCi0JICBmaW5hbF92YWwgKz0gbGVmdCArIHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3M7Ci0JICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbiB8fCBmaW5hbF9zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JICAgIGZpbmFsX3NlZyA9IGFic29sdXRlX3NlY3Rpb247Ci0KLQkgIHJlc29sdmVkID0gc3ltYm9sX3Jlc29sdmVkX3AgKGFkZF9zeW1ib2wpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fbXVsdGlwbHk6Ci0JY2FzZSBPX2RpdmlkZToKLQljYXNlIE9fbW9kdWx1czoKLQljYXNlIE9fbGVmdF9zaGlmdDoKLQljYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6Ci0JY2FzZSBPX2JpdF9vcl9ub3Q6Ci0JY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0JY2FzZSBPX2JpdF9hbmQ6Ci0JY2FzZSBPX2FkZDoKLQljYXNlIE9fc3VidHJhY3Q6Ci0JY2FzZSBPX2VxOgotCWNhc2UgT19uZToKLQljYXNlIE9fbHQ6Ci0JY2FzZSBPX2xlOgotCWNhc2UgT19nZToKLQljYXNlIE9fZ3Q6Ci0JY2FzZSBPX2xvZ2ljYWxfYW5kOgotCWNhc2UgT19sb2dpY2FsX29yOgotCSAgbGVmdCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0JICByaWdodCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChvcF9zeW1ib2wsIGZpbmFsaXplKTsKLQkgIHNlZ19sZWZ0ID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbCk7Ci0JICBzZWdfcmlnaHQgPSBTX0dFVF9TRUdNRU5UIChvcF9zeW1ib2wpOwotCi0JICAvKiBTaW1wbGlmeSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiBhIGNvbnN0YW50IGJ5IGZvbGRpbmcgdGhlCi0JICAgICBjb25zdGFudCBpbnRvIFhfYWRkX251bWJlci4gICovCi0JICBpZiAob3AgPT0gT19hZGQgfHwgb3AgPT0gT19zdWJ0cmFjdCkKLQkgICAgewotCSAgICAgIGlmIChzZWdfcmlnaHQgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkJewotCQkgIGlmIChvcCA9PSBPX2FkZCkKLQkJICAgIGZpbmFsX3ZhbCArPSByaWdodDsKLQkJICBlbHNlCi0JCSAgICBmaW5hbF92YWwgLT0gcmlnaHQ7Ci0JCSAgb3AgPSBPX3N5bWJvbDsKLQkJICBvcF9zeW1ib2wgPSBOVUxMOwotCQkgIGdvdG8gZG9fc3ltYm9sOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc2VnX2xlZnQgPT0gYWJzb2x1dGVfc2VjdGlvbiAmJiBvcCA9PSBPX2FkZCkKLQkJewotCQkgIG9wID0gT19zeW1ib2w7Ci0JCSAgZmluYWxfdmFsICs9IGxlZnQ7Ci0JCSAgYWRkX3N5bWJvbCA9IG9wX3N5bWJvbDsKLQkJICBsZWZ0ID0gcmlnaHQ7Ci0JCSAgb3Bfc3ltYm9sID0gTlVMTDsKLQkJICBnb3RvIGRvX3N5bWJvbDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFN1YnRyYWN0aW9uIGlzIHBlcm1pdHRlZCBpZiBib3RoIG9wZXJhbmRzIGFyZSBpbiB0aGUgc2FtZQotCSAgICAgc2VjdGlvbi4gIE90aGVyd2lzZSwgYm90aCBvcGVyYW5kcyBtdXN0IGJlIGFic29sdXRlLiAgV2UKLQkgICAgIGFscmVhZHkgaGFuZGxlZCB0aGUgY2FzZSBvZiBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiBhCi0JICAgICBjb25zdGFudCBhYm92ZS4gIFRoaXMgd2lsbCBwcm9iYWJseSBuZWVkIHRvIGJlIGNoYW5nZWQKLQkgICAgIGZvciBhbiBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgYXJiaXRyYXJ5Ci0JICAgICBleHByZXNzaW9ucywgc3VjaCBhcyBJRUVFLTY5NS4gICovCi0JICAvKiBEb24ndCBlbWl0IG1lc3NhZ2VzIHVubGVzcyB3ZSdyZSBmaW5hbGl6aW5nIHRoZSBzeW1ib2wgdmFsdWUsCi0JICAgICBvdGhlcndpc2Ugd2UgbWF5IGdldCB0aGUgc2FtZSBtZXNzYWdlIG11bHRpcGxlIHRpbWVzLiAgKi8KLQkgIGlmICgoc2VnX2xlZnQgIT0gYWJzb2x1dGVfc2VjdGlvbgotCSAgICAgICB8fCBzZWdfcmlnaHQgIT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgICAmJiAob3AgIT0gT19zdWJ0cmFjdAotCQkgIHx8IHNlZ19sZWZ0ICE9IHNlZ19yaWdodAotCQkgIHx8IHNlZ19sZWZ0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICAgICYmIGZpbmFsaXplKQotCSAgICB7Ci0JICAgICAgY2hhciAqZmlsZTsKLQkgICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCSAgICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltcCwgJmZpbGUsICZsaW5lKSkKLQkJewotCQkgIGlmIChzZWdfbGVmdCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJCQkgIF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIiksCi0JCQkJICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpKTsKLQkJICBpZiAoc2VnX3JpZ2h0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAotCQkJCSAgXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24iKSwKLQkJCQkgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sKSk7Ci0JCSAgaWYgKHNlZ19sZWZ0ICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JCSAgICAgICYmIHNlZ19yaWdodCAhPSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygiaW52YWxpZCBzZWN0aW9uIGZvciBvcGVyYXRpb24iKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoc2VnX2xlZnQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWQgKF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIHNldHRpbmcgJXMiKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJICBpZiAoc2VnX3JpZ2h0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkIChfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2wpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJICBpZiAoc2VnX2xlZnQgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkJICAgICAgJiYgc2VnX3JpZ2h0ICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIHNlY3Rpb24gZm9yIG9wZXJhdGlvbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgZm9yIGRpdmlzaW9uIGJ5IHplcm8uICAqLwotCSAgaWYgKChvcCA9PSBPX2RpdmlkZSB8fCBvcCA9PSBPX21vZHVsdXMpICYmIHJpZ2h0ID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiBzZWdfcmlnaHQgaXMgbm90IGFic29sdXRlX3NlY3Rpb24sIHRoZW4gd2UndmUKLSAgICAgICAgICAgICAgICAgYWxyZWFkeSBpc3N1ZWQgYSB3YXJuaW5nIGFib3V0IHVzaW5nIGEgYmFkIHN5bWJvbC4gICovCi0JICAgICAgaWYgKHNlZ19yaWdodCA9PSBhYnNvbHV0ZV9zZWN0aW9uICYmIGZpbmFsaXplKQotCQl7Ci0JCSAgY2hhciAqZmlsZTsKLQkJICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCQkgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltcCwgJmZpbGUsICZsaW5lKSkKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygiZGl2aXNpb24gYnkgemVybyIpKTsKLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oImRpdmlzaW9uIGJ5IHplcm8gd2hlbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCQl9Ci0KLQkgICAgICByaWdodCA9IDE7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChzeW1wLT5zeV92YWx1ZS5YX29wKQotCSAgICB7Ci0JICAgIGNhc2UgT19tdWx0aXBseToJCWxlZnQgKj0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fZGl2aWRlOgkJbGVmdCAvPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19tb2R1bHVzOgkJbGVmdCAlPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgkJbGVmdCA8PD0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6CQlsZWZ0ID4+PSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOglsZWZ0IHw9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9vcl9ub3Q6CQlsZWZ0IHw9IH5yaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOglsZWZ0IF49IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9hbmQ6CQlsZWZ0ICY9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2FkZDoJCQlsZWZ0ICs9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX3N1YnRyYWN0OgkJbGVmdCAtPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19lcToJbGVmdCA9IGxlZnQgPT0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19uZToJbGVmdCA9IGxlZnQgIT0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sdDoJbGVmdCA9IGxlZnQgPCAgcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sZToJbGVmdCA9IGxlZnQgPD0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19nZToJbGVmdCA9IGxlZnQgPj0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19ndDoJbGVmdCA9IGxlZnQgPiAgcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sb2dpY2FsX2FuZDoJbGVmdCA9IGxlZnQgJiYgcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9vcjoJbGVmdCA9IGxlZnQgfHwgcmlnaHQ7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkJYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgZmluYWxfdmFsICs9IHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3MgKyBsZWZ0OwotCSAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24gfHwgZmluYWxfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCSAgcmVzb2x2ZWQgPSAoc3ltYm9sX3Jlc29sdmVkX3AgKGFkZF9zeW1ib2wpCi0JCSAgICAgICYmIHN5bWJvbF9yZXNvbHZlZF9wIChvcF9zeW1ib2wpKTsKLSAgIAkgIGJyZWFrOwotCi0JY2FzZSBPX3JlZ2lzdGVyOgotCWNhc2UgT19iaWc6Ci0JY2FzZSBPX2lsbGVnYWw6Ci0JICAvKiBHaXZlIGFuIGVycm9yIChiZWxvdykgaWYgbm90IGluIGV4cHJfc2VjdGlvbi4gIFdlIGRvbid0Ci0JICAgICB3YW50IHRvIHdvcnJ5IGFib3V0IGV4cHJfc2VjdGlvbiBzeW1ib2xzLCBiZWNhdXNlIHRoZXkKLQkgICAgIGFyZSBmaWN0aW9uYWwgKHRoZXkgYXJlIGNyZWF0ZWQgYXMgcGFydCBvZiBleHByZXNzaW9uCi0JICAgICByZXNvbHV0aW9uKSwgYW5kIGFueSBwcm9ibGVtcyBtYXkgbm90IGFjdHVhbGx5IG1lYW4KLQkgICAgIGFueXRoaW5nLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3ltcC0+c3lfcmVzb2x2aW5nID0gMDsKLSAgICB9Ci0KLSAgaWYgKGZpbmFsaXplKQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1wLCBmaW5hbF92YWwpOwotCi0jaWYgZGVmaW5lZCAoT0JKX0FPVVQpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgICAgIC8qIFRoZSBvbGQgYS5vdXQgYmFja2VuZCBkb2VzIG5vdCBoYW5kbGUgU19TRVRfU0VHTUVOVCBjb3JyZWN0bHkKLSAgICAgICAgIGZvciBhIHN0YWIgc3ltYm9sLCBzbyB3ZSB1c2UgdGhpcyBiYWQgaGFjay4gICovCi0gICAgICBpZiAoZmluYWxfc2VnICE9IFNfR0VUX1NFR01FTlQgKHN5bXApKQotI2VuZGlmCi0JU19TRVRfU0VHTUVOVCAoc3ltcCwgZmluYWxfc2VnKTsKLSAgICB9Ci0KLWV4aXRfZG9udF9zZXRfdmFsdWU6Ci0gIC8qIERvbid0IHdvcnJ5IGlmIHdlIGNhbid0IHJlc29sdmUgYW4gZXhwcl9zZWN0aW9uIHN5bWJvbC4gICovCi0gIGlmIChmaW5hbGl6ZSkKLSAgICB7Ci0gICAgICBpZiAocmVzb2x2ZWQpCi0Jc3ltcC0+c3lfcmVzb2x2ZWQgPSAxOwotICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ltcCkgIT0gZXhwcl9zZWN0aW9uKQotCXsKLQkgIGFzX2JhZCAoXygiY2FuJ3QgcmVzb2x2ZSB2YWx1ZSBmb3Igc3ltYm9sIFwiJXNcIiIpLCBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JICBzeW1wLT5zeV9yZXNvbHZlZCA9IDE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmluYWxfdmFsOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1zdGF0aWMgdm9pZCByZXNvbHZlX2xvY2FsX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICosIFBUUikpOwotCi0vKiBBIHN0YXRpYyBmdW5jdGlvbiBwYXNzZWQgdG8gaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1yZXNvbHZlX2xvY2FsX3N5bWJvbCAoa2V5LCB2YWx1ZSkKLSAgICAgY29uc3QgY2hhciAqa2V5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiB2YWx1ZTsKLXsKLSAgaWYgKHZhbHVlICE9IE5VTEwpCi0gICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHZhbHVlLCAxKTsKLX0KLQotI2VuZGlmCi0KLS8qIFJlc29sdmUgYWxsIGxvY2FsIHN5bWJvbHMuICAqLwotCi12b2lkCi1yZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMgKCkKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGhhc2hfdHJhdmVyc2UgKGxvY2FsX2hhc2gsIHJlc29sdmVfbG9jYWxfc3ltYm9sKTsKLSNlbmRpZgotfQotCi0vKiBEb2xsYXIgbGFiZWxzIGxvb2sgbGlrZSBhIG51bWJlciBmb2xsb3dlZCBieSBhIGRvbGxhciBzaWduLiAgRWcsICI0MiQiLgotICAgVGhleSBhcmUgKnJlYWxseSogbG9jYWwuICBUaGF0IGlzLCB0aGV5IGdvIG91dCBvZiBzY29wZSB3aGVuZXZlciB3ZSBzZWUgYQotICAgbGFiZWwgdGhhdCBpc24ndCBsb2NhbC4gIEFsc28sIGxpa2UgZmIgbGFiZWxzLCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUKLSAgIGluc3RhbmNlcyBvZiBhIGRvbGxhciBsYWJlbC4gIFRoZXJlZm9yLCB3ZSBuYW1lIGVuY29kZSBlYWNoIGluc3RhbmNlIHdpdGgKLSAgIHRoZSBpbnN0YW5jZSBudW1iZXIsIGtlZXAgYSBsaXN0IG9mIGRlZmluZWQgc3ltYm9scyBzZXBhcmF0ZSBmcm9tIHRoZSByZWFsCi0gICBzeW1ib2wgdGFibGUsIGFuZCB3ZSB0cmVhdCB0aGVzZSBidWdnZXJzIGFzIGEgc3BhcnNlIGFycmF5LiAgKi8KLQotc3RhdGljIGxvbmcgKmRvbGxhcl9sYWJlbHM7Ci1zdGF0aWMgbG9uZyAqZG9sbGFyX2xhYmVsX2luc3RhbmNlczsKLXN0YXRpYyBjaGFyICpkb2xsYXJfbGFiZWxfZGVmaW5lczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvbGxhcl9sYWJlbF9jb3VudDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvbGxhcl9sYWJlbF9tYXg7Ci0KLWludCAKLWRvbGxhcl9sYWJlbF9kZWZpbmVkIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBrbm93ICgoZG9sbGFyX2xhYmVscyAhPSBOVUxMKSB8fCAoZG9sbGFyX2xhYmVsX2NvdW50ID09IDApKTsKLQotICBmb3IgKGkgPSBkb2xsYXJfbGFiZWxzOyBpIDwgZG9sbGFyX2xhYmVscyArIGRvbGxhcl9sYWJlbF9jb3VudDsgKytpKQotICAgIGlmICgqaSA9PSBsYWJlbCkKLSAgICAgIHJldHVybiBkb2xsYXJfbGFiZWxfZGVmaW5lc1tpIC0gZG9sbGFyX2xhYmVsc107Ci0KLSAgLyogaWYgd2UgZ2V0IGhlcmUsIGxhYmVsIGlzbid0IGRlZmluZWQgKi8KLSAgcmV0dXJuIDA7Ci19CQkJCS8qIGRvbGxhcl9sYWJlbF9kZWZpbmVkKCkgKi8KLQotc3RhdGljIGxvbmcKLWRvbGxhcl9sYWJlbF9pbnN0YW5jZSAobGFiZWwpCi0gICAgIGxvbmcgbGFiZWw7Ci17Ci0gIGxvbmcgKmk7Ci0KLSAga25vdyAoKGRvbGxhcl9sYWJlbHMgIT0gTlVMTCkgfHwgKGRvbGxhcl9sYWJlbF9jb3VudCA9PSAwKSk7Ci0KLSAgZm9yIChpID0gZG9sbGFyX2xhYmVsczsgaSA8IGRvbGxhcl9sYWJlbHMgKyBkb2xsYXJfbGFiZWxfY291bnQ7ICsraSkKLSAgICBpZiAoKmkgPT0gbGFiZWwpCi0gICAgICByZXR1cm4gKGRvbGxhcl9sYWJlbF9pbnN0YW5jZXNbaSAtIGRvbGxhcl9sYWJlbHNdKTsKLQotICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZW4ndCBzZWVuIHRoZSBsYWJlbCBiZWZvcmUsIHRoZXJlZm9yZSBpdHMgaW5zdGFuY2UKLSAgICAgY291bnQgaXMgemVyby4gICovCi0gIHJldHVybiAwOwotfQotCi12b2lkIAotZG9sbGFyX2xhYmVsX2NsZWFyICgpCi17Ci0gIG1lbXNldCAoZG9sbGFyX2xhYmVsX2RlZmluZXMsICdcMCcsICh1bnNpZ25lZCBpbnQpIGRvbGxhcl9sYWJlbF9jb3VudCk7Ci19Ci0KLSNkZWZpbmUgRE9MTEFSX0xBQkVMX0JVTVBfQlkgMTAKLQotdm9pZCAKLWRlZmluZV9kb2xsYXJfbGFiZWwgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGZvciAoaSA9IGRvbGxhcl9sYWJlbHM7IGkgPCBkb2xsYXJfbGFiZWxzICsgZG9sbGFyX2xhYmVsX2NvdW50OyArK2kpCi0gICAgaWYgKCppID09IGxhYmVsKQotICAgICAgewotCSsrZG9sbGFyX2xhYmVsX2luc3RhbmNlc1tpIC0gZG9sbGFyX2xhYmVsc107Ci0JZG9sbGFyX2xhYmVsX2RlZmluZXNbaSAtIGRvbGxhcl9sYWJlbHNdID0gMTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgLyogaWYgd2UgZ2V0IHRvIGhlcmUsIHdlIGRvbid0IGhhdmUgbGFiZWwgbGlzdGVkIHlldC4gKi8KLQotICBpZiAoZG9sbGFyX2xhYmVscyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRvbGxhcl9sYWJlbHMgPSAobG9uZyAqKSB4bWFsbG9jIChET0xMQVJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfZGVmaW5lcyA9IHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9tYXggPSBET0xMQVJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGRvbGxhcl9sYWJlbF9jb3VudCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChkb2xsYXJfbGFiZWxfY291bnQgPT0gZG9sbGFyX2xhYmVsX21heCkKLSAgICB7Ci0gICAgICBkb2xsYXJfbGFiZWxfbWF4ICs9IERPTExBUl9MQUJFTF9CVU1QX0JZOwotICAgICAgZG9sbGFyX2xhYmVscyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBkb2xsYXJfbGFiZWxzLAotCQkJCQkgZG9sbGFyX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBkb2xsYXJfbGFiZWxfaW5zdGFuY2VzLAotCQkJCQkgIGRvbGxhcl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9kZWZpbmVzID0geHJlYWxsb2MgKGRvbGxhcl9sYWJlbF9kZWZpbmVzLCBkb2xsYXJfbGFiZWxfbWF4KTsKLSAgICB9CQkJCS8qIGlmIHdlIG5lZWRlZCB0byBncm93ICovCi0KLSAgZG9sbGFyX2xhYmVsc1tkb2xsYXJfbGFiZWxfY291bnRdID0gbGFiZWw7Ci0gIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXNbZG9sbGFyX2xhYmVsX2NvdW50XSA9IDE7Ci0gIGRvbGxhcl9sYWJlbF9kZWZpbmVzW2RvbGxhcl9sYWJlbF9jb3VudF0gPSAxOwotICArK2RvbGxhcl9sYWJlbF9jb3VudDsKLX0KLQotLyoKLSAqCQkJZG9sbGFyX2xhYmVsX25hbWUoKQotICoKLSAqIENhbGxlciBtdXN0IGNvcHkgcmV0dXJuZWQgbmFtZTogd2UgcmUtdXNlIHRoZSBhcmVhIGZvciB0aGUgbmV4dCBuYW1lLgotICoKLSAqIFRoZSBtdGggb2NjdXJlbmNlIG9mIGxhYmVsIG46IGlzIHR1cm5lZCBpbnRvIHRoZSBzeW1ib2wgIkxuXkFtIgotICogd2hlcmUgbiBpcyB0aGUgbGFiZWwgbnVtYmVyIGFuZCBtIGlzIHRoZSBpbnN0YW5jZSBudW1iZXIuICJMIiBtYWtlcwotICogaXQgYSBsYWJlbCBkaXNjYXJkZWQgdW5sZXNzIGRlYnVnZ2luZyBhbmQgIl5BIignXDEnKSBlbnN1cmVzIG5vCi0gKiBvcmRpbmFyeSBzeW1ib2wgU0hPVUxEIGdldCB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwgbGFiZWwKLSAqIHN5bWJvbC4gVGhlIGZpcnN0ICI0OiIgaXMgIkw0XkExIiAtIHRoZSBtIG51bWJlcnMgYmVnaW4gYXQgMS4KLSAqCi0gKiBmYiBsYWJlbHMgZ2V0IHRoZSBzYW1lIHRyZWF0bWVudCwgZXhjZXB0IHRoYXQgXkIgaXMgdXNlZCBpbiBwbGFjZSBvZiBeQS4KLSAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIGxvY2FsIGxhYmVsIG5hbWUuICovCi1kb2xsYXJfbGFiZWxfbmFtZSAobiwgYXVnZW5kKQotICAgICByZWdpc3RlciBsb25nIG47CQkvKiB3ZSBqdXN0IHNhdyAibiQ6IiA6IG4gYSBudW1iZXIgKi8KLSAgICAgcmVnaXN0ZXIgaW50IGF1Z2VuZDsJLyogMCBmb3IgY3VycmVudCBpbnN0YW5jZSwgMSBmb3IgbmV3IGluc3RhbmNlICovCi17Ci0gIGxvbmcgaTsKLSAgLyogUmV0dXJuZWQgdG8gY2FsbGVyLCB0aGVuIGNvcGllZC4gIHVzZWQgZm9yIGNyZWF0ZWQgbmFtZXMgKCI0ZiIpICovCi0gIHN0YXRpYyBjaGFyIHN5bWJvbF9uYW1lX2J1aWxkWzI0XTsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgY2hhciAqcTsKLSAgY2hhciBzeW1ib2xfbmFtZV90ZW1wb3JhcnlbMjBdOwkvKiBidWlsZCB1cCBhIG51bWJlciwgQkFDS1dBUkRTICovCi0KLSAga25vdyAobiA+PSAwKTsKLSAga25vdyAoYXVnZW5kID09IDAgfHwgYXVnZW5kID09IDEpOwotICBwID0gc3ltYm9sX25hbWVfYnVpbGQ7Ci0jaWZkZWYgTE9DQUxfTEFCRUxfUFJFRklYCi0gICpwKysgPSBMT0NBTF9MQUJFTF9QUkVGSVg7Ci0jZW5kaWYKLSAgKnArKyA9ICdMJzsKLQotICAvKiBOZXh0IGNvZGUganVzdCBkb2VzIHNwcmludGYoIHt9LCAiJWQiLCBuKTsgKi8KLSAgLyogbGFiZWwgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBuOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCA9ICotLXEpICE9ICdcMCcpCi0gICAgKytwOwotCi0gICpwKysgPSAxOwkJCS8qIF5BICovCi0KLSAgLyogaW5zdGFuY2UgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBkb2xsYXJfbGFiZWxfaW5zdGFuY2UgKG4pICsgYXVnZW5kOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCsrID0gKi0tcSkgIT0gJ1wwJyk7OwotCi0gIC8qIFRoZSBsYWJlbCwgYXMgYSAnXDAnIGVuZGVkIHN0cmluZywgc3RhcnRzIGF0IHN5bWJvbF9uYW1lX2J1aWxkLiAqLwotICByZXR1cm4gc3ltYm9sX25hbWVfYnVpbGQ7Ci19Ci0KLS8qCi0gKiBTb21ib2R5IGVsc2UncyBpZGVhIG9mIGxvY2FsIGxhYmVscy4gVGhleSBhcmUgbWFkZSBieSAibjoiIHdoZXJlIG4KLSAqIGlzIGFueSBkZWNpbWFsIGRpZ2l0LiBSZWZlciB0byB0aGVtIHdpdGgKLSAqICAibmIiIGZvciBwcmV2aW91cyAoYmFja3dhcmQpIG46Ci0gKiAgb3IgIm5mIiBmb3IgbmV4dCAoZm9yd2FyZCkgbjouCi0gKgotICogV2UgZG8gYSBsaXR0bGUgYmV0dGVyIGFuZCBsZXQgbiBiZSBhbnkgbnVtYmVyLCBub3QganVzdCBhIHNpbmdsZSBkaWdpdCwgYnV0Ci0gKiBzaW5jZSB0aGUgb3RoZXIgZ3V5J3MgYXNzZW1ibGVyIG9ubHkgZG9lcyB0ZW4sIHdlIHRyZWF0IHRoZSBmaXJzdCB0ZW4KLSAqIHNwZWNpYWxseS4KLSAqCi0gKiBMaWtlIHNvbWVvbmUgZWxzZSdzIGFzc2VtYmxlciwgd2UgaGF2ZSBvbmUgc2V0IG9mIGxvY2FsIGxhYmVsIGNvdW50ZXJzIGZvcgotICogZW50aXJlIGFzc2VtYmx5LCBub3Qgb25lIHNldCBwZXIgKHN1YilzZWdtZW50IGxpa2UgaW4gbW9zdCBhc3NlbWJsZXJzLiBUaGlzCi0gKiBpbXBsaWVzIHRoYXQgb25lIGNhbiByZWZlciB0byBhIGxhYmVsIGluIGFub3RoZXIgc2VnbWVudCwgYW5kIGluZGVlZCBzb21lCi0gKiBjcnVmdHkgY29tcGlsZXJzIGhhdmUgZG9uZSBqdXN0IHRoYXQuCi0gKgotICogU2luY2UgdGhlcmUgY291bGQgYmUgYSBMT1Qgb2YgdGhlc2UgdGhpbmdzLCB0cmVhdCB0aGVtIGFzIGEgc3BhcnNlIGFycmF5LgotICovCi0KLSNkZWZpbmUgRkJfTEFCRUxfU1BFQ0lBTCAoMTApCi0KLXN0YXRpYyBsb25nIGZiX2xvd19jb3VudGVyW0ZCX0xBQkVMX1NQRUNJQUxdOwotc3RhdGljIGxvbmcgKmZiX2xhYmVsczsKLXN0YXRpYyBsb25nICpmYl9sYWJlbF9pbnN0YW5jZXM7Ci1zdGF0aWMgbG9uZyBmYl9sYWJlbF9jb3VudDsKLXN0YXRpYyBsb25nIGZiX2xhYmVsX21heDsKLQotLyogdGhpcyBtdXN0IGJlIG1vcmUgdGhhbiBGQl9MQUJFTF9TUEVDSUFMICovCi0jZGVmaW5lIEZCX0xBQkVMX0JVTVBfQlkgKEZCX0xBQkVMX1NQRUNJQUwgKyA2KQotCi1zdGF0aWMgdm9pZCAKLWZiX2xhYmVsX2luaXQgKCkKLXsKLSAgbWVtc2V0ICgodm9pZCAqKSBmYl9sb3dfY291bnRlciwgJ1wwJywgc2l6ZW9mIChmYl9sb3dfY291bnRlcikpOwotfQkJCQkvKiBmYl9sYWJlbF9pbml0KCkgKi8KLQotLyogYWRkIG9uZSB0byB0aGUgaW5zdGFuY2UgbnVtYmVyIG9mIHRoaXMgZmIgbGFiZWwgKi8KLXZvaWQgCi1mYl9sYWJlbF9pbnN0YW5jZV9pbmMgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGlmIChsYWJlbCA8IEZCX0xBQkVMX1NQRUNJQUwpCi0gICAgewotICAgICAgKytmYl9sb3dfY291bnRlcltsYWJlbF07Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChmYl9sYWJlbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBmYl9sYWJlbHMgKyBGQl9MQUJFTF9TUEVDSUFMOwotCSAgIGkgPCBmYl9sYWJlbHMgKyBmYl9sYWJlbF9jb3VudDsgKytpKQotCXsKLQkgIGlmICgqaSA9PSBsYWJlbCkKLQkgICAgewotCSAgICAgICsrZmJfbGFiZWxfaW5zdGFuY2VzW2kgLSBmYl9sYWJlbHNdOwotCSAgICAgIHJldHVybjsKLQkgICAgfQkJCS8qIGlmIHdlIGZpbmQgaXQgKi8KLQl9CQkJLyogZm9yIGVhY2ggZXhpc3RpbmcgbGFiZWwgKi8KLSAgICB9Ci0KLSAgLyogaWYgd2UgZ2V0IHRvIGhlcmUsIHdlIGRvbid0IGhhdmUgbGFiZWwgbGlzdGVkIHlldC4gKi8KLQotICBpZiAoZmJfbGFiZWxzID09IE5VTEwpCi0gICAgewotICAgICAgZmJfbGFiZWxzID0gKGxvbmcgKikgeG1hbGxvYyAoRkJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfaW5zdGFuY2VzID0gKGxvbmcgKikgeG1hbGxvYyAoRkJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfbWF4ID0gRkJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGZiX2xhYmVsX2NvdW50ID0gRkJfTEFCRUxfU1BFQ0lBTDsKLQotICAgIH0KLSAgZWxzZSBpZiAoZmJfbGFiZWxfY291bnQgPT0gZmJfbGFiZWxfbWF4KQotICAgIHsKLSAgICAgIGZiX2xhYmVsX21heCArPSBGQl9MQUJFTF9CVU1QX0JZOwotICAgICAgZmJfbGFiZWxzID0gKGxvbmcgKikgeHJlYWxsb2MgKChjaGFyICopIGZiX2xhYmVscywKLQkJCQkgICAgIGZiX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfaW5zdGFuY2VzID0gKGxvbmcgKikgeHJlYWxsb2MgKChjaGFyICopIGZiX2xhYmVsX2luc3RhbmNlcywKLQkJCQkJICAgICAgZmJfbGFiZWxfbWF4ICogc2l6ZW9mIChsb25nKSk7Ci0gICAgfQkJCQkvKiBpZiB3ZSBuZWVkZWQgdG8gZ3JvdyAqLwotCi0gIGZiX2xhYmVsc1tmYl9sYWJlbF9jb3VudF0gPSBsYWJlbDsKLSAgZmJfbGFiZWxfaW5zdGFuY2VzW2ZiX2xhYmVsX2NvdW50XSA9IDE7Ci0gICsrZmJfbGFiZWxfY291bnQ7Ci19Ci0KLXN0YXRpYyBsb25nIAotZmJfbGFiZWxfaW5zdGFuY2UgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGlmIChsYWJlbCA8IEZCX0xBQkVMX1NQRUNJQUwpCi0gICAgewotICAgICAgcmV0dXJuIChmYl9sb3dfY291bnRlcltsYWJlbF0pOwotICAgIH0KLQotICBpZiAoZmJfbGFiZWxzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gZmJfbGFiZWxzICsgRkJfTEFCRUxfU1BFQ0lBTDsKLQkgICBpIDwgZmJfbGFiZWxzICsgZmJfbGFiZWxfY291bnQ7ICsraSkKLQl7Ci0JICBpZiAoKmkgPT0gbGFiZWwpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKGZiX2xhYmVsX2luc3RhbmNlc1tpIC0gZmJfbGFiZWxzXSk7Ci0JICAgIH0JCQkvKiBpZiB3ZSBmaW5kIGl0ICovCi0JfQkJCS8qIGZvciBlYWNoIGV4aXN0aW5nIGxhYmVsICovCi0gICAgfQotCi0gIC8qIFdlIGRpZG4ndCBmaW5kIHRoZSBsYWJlbCwgc28gdGhpcyBtdXN0IGJlIGEgcmVmZXJlbmNlIHRvIHRoZQotICAgICBmaXJzdCBpbnN0YW5jZS4gICovCi0gIHJldHVybiAwOwotfQotCi0vKgotICoJCQlmYl9sYWJlbF9uYW1lKCkKLSAqCi0gKiBDYWxsZXIgbXVzdCBjb3B5IHJldHVybmVkIG5hbWU6IHdlIHJlLXVzZSB0aGUgYXJlYSBmb3IgdGhlIG5leHQgbmFtZS4KLSAqCi0gKiBUaGUgbXRoIG9jY3VyZW5jZSBvZiBsYWJlbCBuOiBpcyB0dXJuZWQgaW50byB0aGUgc3ltYm9sICJMbl5CbSIKLSAqIHdoZXJlIG4gaXMgdGhlIGxhYmVsIG51bWJlciBhbmQgbSBpcyB0aGUgaW5zdGFuY2UgbnVtYmVyLiAiTCIgbWFrZXMKLSAqIGl0IGEgbGFiZWwgZGlzY2FyZGVkIHVubGVzcyBkZWJ1Z2dpbmcgYW5kICJeQiIoJ1wyJykgZW5zdXJlcyBubwotICogb3JkaW5hcnkgc3ltYm9sIFNIT1VMRCBnZXQgdGhlIHNhbWUgbmFtZSBhcyBhIGxvY2FsIGxhYmVsCi0gKiBzeW1ib2wuIFRoZSBmaXJzdCAiNDoiIGlzICJMNF5CMSIgLSB0aGUgbSBudW1iZXJzIGJlZ2luIGF0IDEuCi0gKgotICogZG9sbGFyIGxhYmVscyBnZXQgdGhlIHNhbWUgdHJlYXRtZW50LCBleGNlcHQgdGhhdCBeQSBpcyB1c2VkIGluIHBsYWNlIG9mIF5CLiAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIGxvY2FsIGxhYmVsIG5hbWUuICovCi1mYl9sYWJlbF9uYW1lIChuLCBhdWdlbmQpCi0gICAgIGxvbmcgbjsJCQkvKiB3ZSBqdXN0IHNhdyAibjoiLCAibmYiIG9yICJuYiIgOiBuIGEgbnVtYmVyICovCi0gICAgIGxvbmcgYXVnZW5kOwkJLyogMCBmb3IgbmIsIDEgZm9yIG46LCBuZiAqLwotewotICBsb25nIGk7Ci0gIC8qIFJldHVybmVkIHRvIGNhbGxlciwgdGhlbiBjb3BpZWQuICB1c2VkIGZvciBjcmVhdGVkIG5hbWVzICgiNGYiKSAqLwotICBzdGF0aWMgY2hhciBzeW1ib2xfbmFtZV9idWlsZFsyNF07Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGNoYXIgKnE7Ci0gIGNoYXIgc3ltYm9sX25hbWVfdGVtcG9yYXJ5WzIwXTsJLyogYnVpbGQgdXAgYSBudW1iZXIsIEJBQ0tXQVJEUyAqLwotCi0gIGtub3cgKG4gPj0gMCk7Ci0gIGtub3cgKGF1Z2VuZCA9PSAwIHx8IGF1Z2VuZCA9PSAxKTsKLSAgcCA9IHN5bWJvbF9uYW1lX2J1aWxkOwotICAqcCsrID0gJ0wnOwotCi0gIC8qIE5leHQgY29kZSBqdXN0IGRvZXMgc3ByaW50Zigge30sICIlZCIsIG4pOyAqLwotICAvKiBsYWJlbCBudW1iZXIgKi8KLSAgcSA9IHN5bWJvbF9uYW1lX3RlbXBvcmFyeTsKLSAgZm9yICgqcSsrID0gMCwgaSA9IG47IGk7ICsrcSkKLSAgICB7Ci0gICAgICAqcSA9IGkgJSAxMCArICcwJzsKLSAgICAgIGkgLz0gMTA7Ci0gICAgfQotICB3aGlsZSAoKCpwID0gKi0tcSkgIT0gJ1wwJykKLSAgICArK3A7Ci0KLSAgKnArKyA9IDI7CQkJLyogXkIgKi8KLQotICAvKiBpbnN0YW5jZSBudW1iZXIgKi8KLSAgcSA9IHN5bWJvbF9uYW1lX3RlbXBvcmFyeTsKLSAgZm9yICgqcSsrID0gMCwgaSA9IGZiX2xhYmVsX2luc3RhbmNlIChuKSArIGF1Z2VuZDsgaTsgKytxKQotICAgIHsKLSAgICAgICpxID0gaSAlIDEwICsgJzAnOwotICAgICAgaSAvPSAxMDsKLSAgICB9Ci0gIHdoaWxlICgoKnArKyA9ICotLXEpICE9ICdcMCcpOzsKLQotICAvKiBUaGUgbGFiZWwsIGFzIGEgJ1wwJyBlbmRlZCBzdHJpbmcsIHN0YXJ0cyBhdCBzeW1ib2xfbmFtZV9idWlsZC4gKi8KLSAgcmV0dXJuIChzeW1ib2xfbmFtZV9idWlsZCk7Ci19CQkJCS8qIGZiX2xhYmVsX25hbWUoKSAqLwotCi0vKgotICogZGVjb2RlIG5hbWUgdGhhdCBtYXkgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSBmb29fbGFiZWxfbmFtZSgpIGFib3ZlLiAgSWYKLSAqIHRoZSBuYW1lIHdhc24ndCBnZW5lcmF0ZWQgYnkgZm9vX2xhYmVsX25hbWUoKSwgdGhlbiByZXR1cm4gaXQgdW5hbHRlcmVkLgotICogVGhpcyBpcyB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KLSAqLwotCi1jaGFyICoKLWRlY29kZV9sb2NhbF9sYWJlbF9uYW1lIChzKQotICAgICBjaGFyICpzOwotewotICBjaGFyICpwOwotICBjaGFyICpzeW1ib2xfZGVjb2RlOwotICBpbnQgbGFiZWxfbnVtYmVyOwotICBpbnQgaW5zdGFuY2VfbnVtYmVyOwotICBjaGFyICp0eXBlOwotICBjb25zdCBjaGFyICptZXNzYWdlX2Zvcm1hdCA9IF8oIlwiJWRcIiAoaW5zdGFuY2UgbnVtYmVyICVkIG9mIGEgJXMgbGFiZWwpIik7Ci0KLSAgaWYgKHNbMF0gIT0gJ0wnKQotICAgIHJldHVybiBzOwotCi0gIGZvciAobGFiZWxfbnVtYmVyID0gMCwgcCA9IHMgKyAxOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApOyArK3ApCi0gICAgbGFiZWxfbnVtYmVyID0gKDEwICogbGFiZWxfbnVtYmVyKSArICpwIC0gJzAnOwotCi0gIGlmICgqcCA9PSAxKQotICAgIHR5cGUgPSAiZG9sbGFyIjsKLSAgZWxzZSBpZiAoKnAgPT0gMikKLSAgICB0eXBlID0gImZiIjsKLSAgZWxzZQotICAgIHJldHVybiBzOwotCi0gIGZvciAoaW5zdGFuY2VfbnVtYmVyID0gMCwgcCsrOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApOyArK3ApCi0gICAgaW5zdGFuY2VfbnVtYmVyID0gKDEwICogaW5zdGFuY2VfbnVtYmVyKSArICpwIC0gJzAnOwotCi0gIHN5bWJvbF9kZWNvZGUgPSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHN0cmxlbiAobWVzc2FnZV9mb3JtYXQpICsgMzApOwotICBzcHJpbnRmIChzeW1ib2xfZGVjb2RlLCBtZXNzYWdlX2Zvcm1hdCwgbGFiZWxfbnVtYmVyLCBpbnN0YW5jZV9udW1iZXIsIHR5cGUpOwotCi0gIHJldHVybiBzeW1ib2xfZGVjb2RlOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLiAgKi8KLQotdmFsdWVUCi1TX0dFVF9WQUxVRSAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9vZmZzZXQ7Ci0jZW5kaWYKLQotICBpZiAoIXMtPnN5X3Jlc29sdmVkICYmIHMtPnN5X3ZhbHVlLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAocywgMSk7Ci0gIGlmIChzLT5zeV92YWx1ZS5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgc3RhdGljIHN5bWJvbFMgKnJlY3VyOwotCi0gICAgICAvKiBGSVhNRTogSW4gbm9uIEJGRCBhc3NlbWJsZXJzLCBTX0lTX0RFRklORUQgYW5kIFNfSVNfQ09NTU9OCi0gICAgICAgICBtYXkgY2FsbCBTX0dFVF9WQUxVRS4gIFdlIHVzZSBhIHN0YXRpYyBzeW1ib2wgdG8gYXZvaWQgdGhlCi0gICAgICAgICBpbW1lZGlhdGUgcmVjdXJzaW9uLiAgKi8KLSAgICAgIGlmIChyZWN1ciA9PSBzKQotCXJldHVybiAodmFsdWVUKSBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0gICAgICByZWN1ciA9IHM7Ci0gICAgICBpZiAoISBzLT5zeV9yZXNvbHZlZAotCSAgfHwgcy0+c3lfdmFsdWUuWF9vcCAhPSBPX3N5bWJvbAotCSAgfHwgKFNfSVNfREVGSU5FRCAocykgJiYgISBTX0lTX0NPTU1PTiAocykpKQotCWFzX2JhZCAoXygiQXR0ZW1wdCB0byBnZXQgdmFsdWUgb2YgdW5yZXNvbHZlZCBzeW1ib2wgJXMiKSwKLQkJU19HRVRfTkFNRSAocykpOwotICAgICAgcmVjdXIgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICh2YWx1ZVQpIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLX0KLQotLyogU2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLVNfU0VUX1ZBTFVFIChzLCB2YWwpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIHZhbHVlVCB2YWw7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9vZmZzZXQgPSB2YWw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgcy0+c3lfdmFsdWUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IChvZmZzZXRUKSB2YWw7Ci0gIHMtPnN5X3ZhbHVlLlhfdW5zaWduZWQgPSAwOwotfQotCi12b2lkCi1jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChkZXN0LCBzcmMpCi0gICAgIHN5bWJvbFMgKmRlc3QsICpzcmM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKGRlc3QpKQotICAgIGRlc3QgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgZGVzdCk7Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHNyYykpCi0gICAgc3JjID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHNyYyk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIEluIGFuIGV4cHJlc3Npb24sIHRyYW5zZmVyIHRoZSBzZXR0aW5ncyBvZiB0aGVzZSBmbGFncy4KLSAgICAgVGhlIHVzZXIgY2FuIG92ZXJyaWRlIGxhdGVyLCBvZiBjb3Vyc2UuICAqLwotI2RlZmluZSBDT1BJRURfU1lNRkxBR1MJKEJTRl9GVU5DVElPTiB8IEJTRl9PQkpFQ1QpCi0gIGRlc3QtPmJzeW0tPmZsYWdzIHw9IHNyYy0+YnN5bS0+ZmxhZ3MgJiBDT1BJRURfU1lNRkxBR1M7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTCi0gIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTIChkZXN0LCBzcmMpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLWludAotU19JU19GVU5DVElPTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgZmxhZ3MgPSBzLT5ic3ltLT5mbGFnczsKLQotICByZXR1cm4gKGZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwOwotfQotCi1pbnQKLVNfSVNfRVhURVJOQUwgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotCi0gIGZsYWdzID0gcy0+YnN5bS0+ZmxhZ3M7Ci0KLSAgLyogc2FuaXR5IGNoZWNrICovCi0gIGlmICgoZmxhZ3MgJiBCU0ZfTE9DQUwpICYmIChmbGFncyAmIEJTRl9HTE9CQUwpKQotICAgIGFib3J0ICgpOwotCi0gIHJldHVybiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwOwotfQotCi1pbnQKLVNfSVNfV0VBSyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMDsKLX0KLQotaW50Ci1TX0lTX0NPTU1PTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBiZmRfaXNfY29tX3NlY3Rpb24gKHMtPmJzeW0tPnNlY3Rpb24pOwotfQotCi1pbnQKLVNfSVNfREVGSU5FRCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKS0+bHN5X3NlY3Rpb24gIT0gdW5kZWZpbmVkX3NlY3Rpb247Ci0gIHJldHVybiBzLT5ic3ltLT5zZWN0aW9uICE9IHVuZGVmaW5lZF9zZWN0aW9uOwotfQotCi1pbnQKLVNfSVNfREVCVUcgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICBpZiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1TX0lTX0xPQ0FMIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMTsKLQotICBmbGFncyA9IHMtPmJzeW0tPmZsYWdzOwotCi0gIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoKGZsYWdzICYgQlNGX0xPQ0FMKSAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uIChzLT5ic3ltKSA9PSByZWdfc2VjdGlvbikKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZQotICAgICAgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkgPT0gMAotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uIChzLT5ic3ltKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybiAxOwotCi0gIG5hbWUgPSBTX0dFVF9OQU1FIChzKTsKLSAgcmV0dXJuIChuYW1lICE9IE5VTEwKLQkgICYmICEgU19JU19ERUJVRyAocykKLQkgICYmIChzdHJjaHIgKG5hbWUsICdcMDAxJykKLQkgICAgICB8fCBzdHJjaHIgKG5hbWUsICdcMDAyJykKLQkgICAgICB8fCAoISBmbGFnX2tlZXBfbG9jYWxzCi0JCSAgJiYgKGJmZF9pc19sb2NhbF9sYWJlbCAoc3Rkb3V0cHV0LCBzLT5ic3ltKQotCQkgICAgICB8fCAoZmxhZ19tcmkKLQkJCSAgJiYgbmFtZVswXSA9PSAnPycKLQkJCSAgJiYgbmFtZVsxXSA9PSAnPycpKSkpKTsKLX0KLQotaW50Ci1TX0lTX0VYVEVSTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgcmV0dXJuIFNfSVNfRVhURVJOQUwgKHMpOwotfQotCi1pbnQKLVNfSVNfU1RBQkQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHJldHVybiBTX0dFVF9OQU1FIChzKSA9PSAwOwotfQotCi1DT05TVCBjaGFyICoKLVNfR0VUX05BTUUgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9uYW1lOwotICByZXR1cm4gcy0+YnN5bS0+bmFtZTsKLX0KLQotc2VnVAotU19HRVRfU0VHTUVOVCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKS0+bHN5X3NlY3Rpb247Ci0gIHJldHVybiBzLT5ic3ltLT5zZWN0aW9uOwotfQotCi12b2lkCi1TX1NFVF9TRUdNRU5UIChzLCBzZWcpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBEb24ndCByZWFzc2lnbiBzZWN0aW9uIHN5bWJvbHMuICBUaGUgZGlyZWN0IHJlYXNvbiBpcyB0byBwcmV2ZW50IHNlZwotICAgICBmYXVsdHMgYXNzaWduaW5nIGJhY2sgdG8gY29uc3QgZ2xvYmFsIHN5bWJvbHMgc3VjaCBhcyAqQUJTKiwgYnV0IGl0Ci0gICAgIHNob3VsZG4ndCBoYXBwZW4gYW55d2F5LiAgKi8KLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBpZiAoc2VnID09IHJlZ19zZWN0aW9uKQotCXMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gICAgICBlbHNlCi0JewotCSAgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfc2VjdGlvbiA9IHNlZzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmIChzLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICB7Ci0gICAgICBpZiAocy0+YnN5bS0+c2VjdGlvbiAhPSBzZWcpCi0JYWJvcnQoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzLT5ic3ltLT5zZWN0aW9uID0gc2VnOwotfQotCi12b2lkCi1TX1NFVF9FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgaWYgKChzLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIExldCAud2VhayBvdmVycmlkZSAuZ2xvYmFsLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0xPQ0FMfEJTRl9XRUFLKTsKLX0KLQotdm9pZAotU19DTEVBUl9FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuOwotICBpZiAoKHMtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDApCi0gICAgewotICAgICAgLyogTGV0IC53ZWFrIG92ZXJyaWRlLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9MT0NBTDsKLSAgcy0+YnN5bS0+ZmxhZ3MgJj0gfihCU0ZfR0xPQkFMfEJTRl9XRUFLKTsKLX0KLQotdm9pZAotU19TRVRfV0VBSyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTHxCU0ZfTE9DQUwpOwotfQotCi12b2lkCi1TX1NFVF9OQU1FIChzLCBuYW1lKQotICAgICBzeW1ib2xTICpzOwotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9uYW1lID0gbmFtZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPm5hbWUgPSBuYW1lOwotfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLQotLyogUmV0dXJuIHRoZSBwcmV2aW91cyBzeW1ib2wgaW4gYSBjaGFpbi4gICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX3ByZXZpb3VzIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHMtPnN5X3ByZXZpb3VzOwotfQotCi0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0vKiBSZXR1cm4gdGhlIG5leHQgc3ltYm9sIGluIGEgY2hhaW4uICAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9uZXh0IChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHMtPnN5X25leHQ7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGFzIGFuIGV4cHJlc3Npb24uICAqLwotCi1leHByZXNzaW9uUyAqCi1zeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHJldHVybiAmcy0+c3lfdmFsdWU7Ci19Ci0KLS8qIFNldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgdG8gYW4gZXhwcmVzc2lvbi4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAocywgZXhwKQotICAgICBzeW1ib2xTICpzOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqZXhwOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV92YWx1ZSA9ICpleHA7Ci19Ci0KLS8qIFNldCB0aGUgZnJhZyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfZnJhZyAocywgZikKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgZnJhZ1MgKmY7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMsIGYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBzLT5zeV9mcmFnID0gZjsKLX0KLQotLyogUmV0dXJuIHRoZSBmcmFnIG9mIGEgc3ltYm9sLiAgKi8KLQotZnJhZ1MgKgotc3ltYm9sX2dldF9mcmFnIChzKQotICAgICBzeW1ib2xTICpzOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHMtPnN5X2ZyYWc7Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gdXNlZC4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3VzZWQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+c3lfdXNlZCA9IDE7Ci19Ci0KLS8qIENsZWFyIHRoZSBtYXJrIG9mIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gdXNlZC4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl91c2VkIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV91c2VkID0gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gdXNlZC4gICovCi0KLWludAotc3ltYm9sX3VzZWRfcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiBzLT5zeV91c2VkOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHVzZWQgaW4gYSByZWxvYy4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X3VzZWRfaW5fcmVsb2MgPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHVzZWQgaW4gYSByZWxvYy4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPnN5X3VzZWRfaW5fcmVsb2MgPSAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiB1c2VkIGluIGEgcmVsb2MuICAqLwotCi1pbnQKLXN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gcy0+c3lfdXNlZF9pbl9yZWxvYzsKLX0KLQotLyogTWFyayBhIHN5bWJvbCBhcyBhbiBNUkkgY29tbW9uIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX21yaV9jb21tb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X21yaV9jb21tb24gPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLiAgKi8KLQotdm9pZAotc3ltYm9sX2NsZWFyX21yaV9jb21tb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+c3lfbXJpX2NvbW1vbiA9IDA7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLiAgKi8KLQotaW50Ci1zeW1ib2xfbXJpX2NvbW1vbl9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPnN5X21yaV9jb21tb247Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gd3JpdHRlbi4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3dyaXR0ZW4gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+d3JpdHRlbiA9IDE7Ci19Ci0KLS8qIENsZWFyIHRoZSBtYXJrIG9mIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbi4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl93cml0dGVuIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPndyaXR0ZW4gPSAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuLiAgKi8KLQotaW50Ci1zeW1ib2xfd3JpdHRlbl9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPndyaXR0ZW47Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgaGFzIGhhdmluZyBiZWVuIHJlc29sdmVkLiAgKi8KLQotdm9pZAotc3ltYm9sX21hcmtfcmVzb2x2ZWQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBsb2NhbF9zeW1ib2xfbWFya19yZXNvbHZlZCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gIHMtPnN5X3Jlc29sdmVkID0gMTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gcmVzb2x2ZWQuICAqLwotCi1pbnQKLXN5bWJvbF9yZXNvbHZlZF9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSNlbmRpZgotICByZXR1cm4gcy0+c3lfcmVzb2x2ZWQ7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wuICAqLwotCi1pbnQKLXN5bWJvbF9zZWN0aW9uX3AgKHMpCi0gICAgIHN5bWJvbFMgKnMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICByZXR1cm4gKHMtPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwOwotI2Vsc2UKLSAgLyogRklYTUUgKi8KLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaXMgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbC4gICovCi0KLWludAotc3ltYm9sX2VxdWF0ZWRfcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBzLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYSBjb25zdGFudCB2YWx1ZS4gICovCi0KLWludAotc3ltYm9sX2NvbnN0YW50X3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAxOwotICByZXR1cm4gcy0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50OwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBSZXR1cm4gdGhlIEJGRCBzeW1ib2wgZm9yIGEgc3ltYm9sLiAgKi8KLQotYXN5bWJvbCAqCi1zeW1ib2xfZ2V0X2JmZHN5bSAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcmV0dXJuIHMtPmJzeW07Ci19Ci0KLS8qIFNldCB0aGUgQkZEIHN5bWJvbCBmb3IgYSBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X2JmZHN5bSAocywgYnN5bSkKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgYXN5bWJvbCAqYnN5bTsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+YnN5bSA9IGJzeW07Ci19Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBPQkpfU1lNRklFTERfVFlQRQotCi0vKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBvYmplY3QgZm9ybWF0IGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLU9CSl9TWU1GSUVMRF9UWVBFICoKLXN5bWJvbF9nZXRfb2JqIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICByZXR1cm4gJnMtPnN5X29iajsKLX0KLQotLyogU2V0IHRoZSBvYmplY3QgZm9ybWF0IGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfb2JqIChzLCBvKQotICAgICBzeW1ib2xTICpzOwotICAgICBPQkpfU1lNRklFTERfVFlQRSAqbzsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+c3lfb2JqID0gKm87Ci19Ci0KLSNlbmRpZiAvKiBPQkpfU1lNRklFTERfVFlQRSAqLwotCi0jaWZkZWYgVENfU1lNRklFTERfVFlQRQotCi0vKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBwcm9jZXNzb3IgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotVENfU1lNRklFTERfVFlQRSAqCi1zeW1ib2xfZ2V0X3RjIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICByZXR1cm4gJnMtPnN5X3RjOwotfQotCi0vKiBTZXQgdGhlIHByb2Nlc3NvciBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X3RjIChzLCBvKQotICAgICBzeW1ib2xTICpzOwotICAgICBUQ19TWU1GSUVMRF9UWVBFICpvOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV90YyA9ICpvOwotfQotCi0jZW5kaWYgLyogVENfU1lNRklFTERfVFlQRSAqLwotCi12b2lkCi1zeW1ib2xfYmVnaW4gKCkKLXsKLSAgc3ltYm9sX2xhc3RQID0gTlVMTDsKLSAgc3ltYm9sX3Jvb3RQID0gTlVMTDsJCS8qIEluIGNhc2Ugd2UgaGF2ZSAwIHN5bWJvbHMgKCEhKSAqLwotICBzeV9oYXNoID0gaGFzaF9uZXcgKCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBsb2NhbF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0jZW5kaWYKLQotICBtZW1zZXQgKChjaGFyICopICgmYWJzX3N5bWJvbCksICdcMCcsIHNpemVvZiAoYWJzX3N5bWJvbCkpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZiBkZWZpbmVkIChFTUlUX1NFQ1RJT05fU1lNQk9MUykgfHwgIWRlZmluZWQgKFJFTE9DX1JFUVVJUkVTX1NZTUJPTCkKLSAgYWJzX3N5bWJvbC5ic3ltID0gYmZkX2Fic19zZWN0aW9uLnN5bWJvbDsKLSNlbmRpZgotI2Vsc2UKLSAgLyogQ2FuJ3QgaW5pdGlhbGlzZSBhIHVuaW9uLiBTaWdoLiAqLwotICBTX1NFVF9TRUdNRU5UICgmYWJzX3N5bWJvbCwgYWJzb2x1dGVfc2VjdGlvbik7Ci0jZW5kaWYKLSAgYWJzX3N5bWJvbC5zeV92YWx1ZS5YX29wID0gT19jb25zdGFudDsKLSAgYWJzX3N5bWJvbC5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotCi0gIGlmIChMT0NBTF9MQUJFTFNfRkIpCi0gICAgZmJfbGFiZWxfaW5pdCAoKTsKLX0KLQotCi0MCi1pbnQgaW5kZW50X2xldmVsOwotCi0vKiBNYXhpbXVtIGluZGVudCBsZXZlbC4KLSAgIEF2YWlsYWJsZSBmb3IgbW9kaWZpY2F0aW9uIGluc2lkZSBhIGdkYiBzZXNzaW9uLiAgKi8KLWludCBtYXhfaW5kZW50X2xldmVsID0gODsKLQotI2lmIDAKLQotc3RhdGljIHZvaWQKLWluZGVudCAoKQotewotICBwcmludGYgKCIlKnMiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci19Ci0KLSNlbmRpZgotCi12b2lkCi1wcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgc3ltKQotICAgICBGSUxFICpmaWxlOwotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBTX0dFVF9OQU1FIChzeW0pOwotICBpZiAoIW5hbWUgfHwgIW5hbWVbMF0pCi0gICAgbmFtZSA9ICIodW5uYW1lZCkiOwotICBmcHJpbnRmIChmaWxlLCAic3ltICVseCAlcyIsICh1bnNpZ25lZCBsb25nKSBzeW0sIG5hbWUpOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bSkpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bSA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bTsKLSAgICAgIGlmIChsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkgIT0gJnplcm9fYWRkcmVzc19mcmFnCi0JICAmJiBsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkgIT0gTlVMTCkKLQlmcHJpbnRmIChmaWxlLCAiIGZyYWcgJWx4IiwgKGxvbmcpIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKSk7Ci0gICAgICBpZiAobG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AgKGxvY3N5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiByZXNvbHZlZCIpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiBsb2NhbCIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN5bS0+c3lfZnJhZyAhPSAmemVyb19hZGRyZXNzX2ZyYWcpCi0JZnByaW50ZiAoZmlsZSwgIiBmcmFnICVseCIsIChsb25nKSBzeW0tPnN5X2ZyYWcpOwotICAgICAgaWYgKHN5bS0+d3JpdHRlbikKLQlmcHJpbnRmIChmaWxlLCAiIHdyaXR0ZW4iKTsKLSAgICAgIGlmIChzeW0tPnN5X3Jlc29sdmVkKQotCWZwcmludGYgKGZpbGUsICIgcmVzb2x2ZWQiKTsKLSAgICAgIGVsc2UgaWYgKHN5bS0+c3lfcmVzb2x2aW5nKQotCWZwcmludGYgKGZpbGUsICIgcmVzb2x2aW5nIik7Ci0gICAgICBpZiAoc3ltLT5zeV91c2VkX2luX3JlbG9jKQotCWZwcmludGYgKGZpbGUsICIgdXNlZC1pbi1yZWxvYyIpOwotICAgICAgaWYgKHN5bS0+c3lfdXNlZCkKLQlmcHJpbnRmIChmaWxlLCAiIHVzZWQiKTsKLSAgICAgIGlmIChTX0lTX0xPQ0FMIChzeW0pKQotCWZwcmludGYgKGZpbGUsICIgbG9jYWwiKTsKLSAgICAgIGlmIChTX0lTX0VYVEVSTiAoc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiIGV4dGVybiIpOwotICAgICAgaWYgKFNfSVNfREVCVUcgKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiBkZWJ1ZyIpOwotICAgICAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiIGRlZmluZWQiKTsKLSAgICB9Ci0gIGZwcmludGYgKGZpbGUsICIgJXMiLCBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bSkpKTsKLSAgaWYgKHN5bWJvbF9yZXNvbHZlZF9wIChzeW0pKQotICAgIHsKLSAgICAgIHNlZ1QgcyA9IFNfR0VUX1NFR01FTlQgKHN5bSk7Ci0KLSAgICAgIGlmIChzICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAgICAgJiYgcyAhPSBleHByX3NlY3Rpb24pCi0JZnByaW50ZiAoZmlsZSwgIiAlbHgiLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bSkpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5kZW50X2xldmVsIDwgbWF4X2luZGVudF9sZXZlbAotCSAgICYmIFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0gICAgewotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiXG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgImNvbnN0YW50ICVseCIsCi0JCSAobG9uZykgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bSktPmxzeV9vZmZzZXQpOwotICAgICAgZWxzZQotI2VuZGlmCi0JcHJpbnRfZXhwcl8xIChmaWxlLCAmc3ltLT5zeV92YWx1ZSk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgICAgaW5kZW50X2xldmVsLS07Ci0gICAgfQotICBmZmx1c2ggKGZpbGUpOwotfQotCi12b2lkCi1wcmludF9zeW1ib2xfdmFsdWUgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpbmRlbnRfbGV2ZWwgPSAwOwotICBwcmludF9zeW1ib2xfdmFsdWVfMSAoc3RkZXJyLCBzeW0pOwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYmluYXJ5IChmaWxlLCBuYW1lLCBleHApCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBpbmRlbnRfbGV2ZWwrKzsKLSAgZnByaW50ZiAoZmlsZSwgIiVzXG4lKnM8IiwgbmFtZSwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICBmcHJpbnRmIChmaWxlLCAiPlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9vcF9zeW1ib2wpOwotICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICBpbmRlbnRfbGV2ZWwtLTsKLX0KLQotdm9pZAotcHJpbnRfZXhwcl8xIChmaWxlLCBleHApCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGZwcmludGYgKGZpbGUsICJleHByICVseCAiLCAobG9uZykgZXhwKTsKLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgICAgZnByaW50ZiAoZmlsZSwgImlsbGVnYWwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19hYnNlbnQ6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiYWJzZW50Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiY29uc3RhbnQgJWx4IiwgKGxvbmcpIGV4cC0+WF9hZGRfbnVtYmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIGZwcmludGYgKGZpbGUsICJzeW1ib2xcbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICBtYXliZV9wcmludF9hZGRudW06Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9udW1iZXIpCi0JZnByaW50ZiAoZmlsZSwgIlxuJSpzJWx4IiwgaW5kZW50X2xldmVsICogNCwgIiIsCi0JCSAobG9uZykgZXhwLT5YX2FkZF9udW1iZXIpOwotICAgICAgaW5kZW50X2xldmVsLS07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAicmVnaXN0ZXIgIyVkIiwgKGludCkgZXhwLT5YX2FkZF9udW1iZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2JpZzoKLSAgICAgIGZwcmludGYgKGZpbGUsICJiaWciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT191bWludXM6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAidW1pbnVzIC08Iik7Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgICAgZ290byBtYXliZV9wcmludF9hZGRudW07Ci0gICAgY2FzZSBPX2JpdF9ub3Q6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiYml0X25vdCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX211bHRpcGx5OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibXVsdGlwbHkiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2RpdmlkZToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImRpdmlkZSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbW9kdWx1czoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgIm1vZHVsdXMiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2xlZnRfc2hpZnQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsc2hpZnQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3JpZ2h0X3NoaWZ0OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAicnNoaWZ0IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiYml0X2lvciIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImJpdF94b3IiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2JpdF9hbmQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJiaXRfYW5kIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19lcToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImVxIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19uZToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgIm5lIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sdDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImx0IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sZToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxlIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19nZToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImdlIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19ndDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImd0IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sb2dpY2FsX2FuZDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxvZ2ljYWxfYW5kIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sb2dpY2FsX29yOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibG9naWNhbF9vciIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYWRkOgotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiYWRkXG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+XG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9vcF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICAgIGdvdG8gbWF5YmVfcHJpbnRfYWRkbnVtOwotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgZnByaW50ZiAoZmlsZSwgInN1YnRyYWN0XG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+XG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9vcF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICAgIGdvdG8gbWF5YmVfcHJpbnRfYWRkbnVtOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAie3Vua25vd24gb3Bjb2RlICVkfSIsIChpbnQpIGV4cC0+WF9vcCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGZmbHVzaCAoc3Rkb3V0KTsKLX0KLQotdm9pZAotcHJpbnRfZXhwciAoZXhwKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBwcmludF9leHByXzEgKHN0ZGVyciwgZXhwKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotdm9pZAotc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgInN5bWJvbCB0YWJsZSIsIHN5X2hhc2gpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAibWluaSBsb2NhbCBzeW1ib2wgdGFibGUiLCBsb2NhbF9oYXNoKTsKLSAgZnByaW50ZiAoZmlsZSwgIiVsdSBtaW5pIGxvY2FsIHN5bWJvbHMgY3JlYXRlZCwgJWx1IGNvbnZlcnRlZFxuIiwKLQkgICBsb2NhbF9zeW1ib2xfY291bnQsIGxvY2FsX3N5bWJvbF9jb252ZXJzaW9uX2NvdW50KTsKLSNlbmRpZgotfQotCi0vKiBlbmQgb2Ygc3ltYm9scy5jICovCmRpZmYgLS1naXQgYS9nYXMvc3ltYm9scy5oIGIvZ2FzL3N5bWJvbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiNzNhZi4uMDAwMDAwMAotLS0gYS9nYXMvc3ltYm9scy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qIHN5bWJvbHMuaCAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotLyogVGhlIEJGRCBjb2RlIHdhbnRzIHRvIHdhbGsgdGhlIGxpc3QgaW4gYm90aCBkaXJlY3Rpb25zLiAgKi8KLSN1bmRlZiAgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotI2RlZmluZSBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0jZW5kaWYKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBUaGUgbm9uLUJGRCBjb2RlIGV4cGVjdHMgdG8gYmUgYWJsZSB0byBtYW5pcHVsYXRlIHRoZSBzeW1ib2wgZmllbGRzCi0gICBkaXJlY3RseS4gICovCi0jaW5jbHVkZSAic3RydWMtc3ltYm9sLmgiCi0jZW5kaWYKLQotZXh0ZXJuIHN0cnVjdCBvYnN0YWNrIG5vdGVzOwkvKiBlZyBGaXhTIGxpdmUgaGVyZS4gKi8KLQotZXh0ZXJuIHN0cnVjdCBvYnN0YWNrIGNvbmRfb2JzdGFjazsJLyogdGhpcyBpcyB3aGVyZSB3ZSB0cmFjayAuaWZkZWYvLmVuZGlmCi0JCQkJICAgICAgIChpZiB3ZSBkbyB0aGF0IGF0IGFsbCkuICAqLwotCi1leHRlcm4gc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwkvKiBhbGwgdGhlIHN5bWJvbCBub2RlcyAqLwotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9sYXN0UDsJLyogbGFzdCBzdHJ1Y3Qgc3ltYm9sIHdlIG1hZGUsIG9yIE5VTEwgKi8KLQotZXh0ZXJuIHN5bWJvbFMgYWJzX3N5bWJvbDsKLQotZXh0ZXJuIGludCBzeW1ib2xfdGFibGVfZnJvemVuOwotCi0vKiBUaGlzIGlzIG5vbi16ZXJvIGlmIHN5bWJvbHMgYXJlIGNhc2Ugc2Vuc2l0aXZlLCB3aGljaCBpcyB0aGUKLSAgIGRlZmF1bHQuICAqLwotZXh0ZXJuIGludCBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOwotCi1jaGFyICpkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChjaGFyICpzKSk7Ci1zeW1ib2xTICpzeW1ib2xfZmluZCBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lKSk7Ci1zeW1ib2xTICpzeW1ib2xfZmluZF9iYXNlIFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUsIGludCBzdHJpcF91bmRlcnNjb3JlKSk7Ci1zeW1ib2xTICpzeW1ib2xfZmluZF9vcl9tYWtlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLXN5bWJvbFMgKnN5bWJvbF9tYWtlIFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUpKTsKLXN5bWJvbFMgKnN5bWJvbF9uZXcgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSwgc2VnVCBzZWdtZW50LCB2YWx1ZVQgdmFsdWUsCi0JCQkgICAgIGZyYWdTICogZnJhZykpOwotc3ltYm9sUyAqc3ltYm9sX2NyZWF0ZSBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lLCBzZWdUIHNlZ21lbnQsIHZhbHVlVCB2YWx1ZSwKLQkJCQlmcmFnUyAqIGZyYWcpKTsKLXN5bWJvbFMgKmNvbG9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN5bV9uYW1lKSk7Ci12b2lkIGxvY2FsX2NvbG9uIFBBUkFNUyAoKGludCBuKSk7Ci12b2lkIHN5bWJvbF9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIHN5bWJvbF9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOwotdm9pZCBzeW1ib2xfdGFibGVfaW5zZXJ0IFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci12YWx1ZVQgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLXZvaWQgcmVzb2x2ZV9sb2NhbF9zeW1ib2xfdmFsdWVzIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCBwcmludF9zeW1ib2xfdmFsdWUgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci12b2lkIHByaW50X2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotdm9pZCBwcmludF9leHByXzEgUEFSQU1TICgoRklMRSAqLCBleHByZXNzaW9uUyAqKSk7Ci12b2lkIHByaW50X3N5bWJvbF92YWx1ZV8xIFBBUkFNUyAoKEZJTEUgKiwgc3ltYm9sUyAqKSk7Ci0KLWludCBkb2xsYXJfbGFiZWxfZGVmaW5lZCBQQVJBTVMgKChsb25nIGwpKTsKLXZvaWQgZG9sbGFyX2xhYmVsX2NsZWFyIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgZGVmaW5lX2RvbGxhcl9sYWJlbCBQQVJBTVMgKChsb25nIGwpKTsKLWNoYXIgKmRvbGxhcl9sYWJlbF9uYW1lIFBBUkFNUyAoKGxvbmcgbCwgaW50IGF1Z2VuZCkpOwotCi12b2lkIGZiX2xhYmVsX2luc3RhbmNlX2luYyBQQVJBTVMgKChsb25nIGxhYmVsKSk7Ci1jaGFyICpmYl9sYWJlbF9uYW1lIFBBUkFNUyAoKGxvbmcgbiwgbG9uZyBhdWdlbmQpKTsKLQotZXh0ZXJuIHZvaWQgY29weV9zeW1ib2xfYXR0cmlidXRlcyBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotCi0vKiBHZXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHN5bWJvbHMuICBUaGVzZSB1c2VkIHRvIGJlIG1hY3Jvcy4gICovCi1leHRlcm4gdmFsdWVUIFNfR0VUX1ZBTFVFIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgU19TRVRfVkFMVUUgUEFSQU1TICgoc3ltYm9sUyAqLCB2YWx1ZVQpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBpbnQgU19JU19GVU5DVElPTiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19FWFRFUk5BTCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19XRUFLIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0NPTU1PTiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19ERUZJTkVEIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0RFQlVHIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0xPQ0FMIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0VYVEVSTiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19TVEFCRCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBDT05TVCBjaGFyICpTX0dFVF9OQU1FIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHNlZ1QgU19HRVRfU0VHTUVOVCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNfU0VUX1NFR01FTlQgUEFSQU1TICgoc3ltYm9sUyAqLCBzZWdUKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9FWFRFUk5BTCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNfU0VUX05BTUUgUEFSQU1TICgoc3ltYm9sUyAqLCBjaGFyICopKTsKLWV4dGVybiB2b2lkIFNfQ0xFQVJfRVhURVJOQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9XRUFLIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2VuZGlmCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotc3RydWN0IGJyb2tlbl93b3JkCi0gIHsKLSAgICAvKiBMaW5rZWQgbGlzdCAtLSBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBwZXIgIi53b3JkIHgteStDIgotICAgICAgIGV4cHJlc3Npb24uICAqLwotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqbmV4dF9icm9rZW5fd29yZDsKLSAgICAvKiBTZWdtZW50IGFuZCBzdWJzZWdtZW50IGZvciBicm9rZW4gd29yZC4gICovCi0gICAgc2VnVCBzZWc7Ci0gICAgc3Vic2VnVCBzdWJzZWc7Ci0gICAgLyogV2hpY2ggZnJhZyBpcyB0aGlzIGJyb2tlbiB3b3JkIGluPyAgKi8KLSAgICBmcmFnUyAqZnJhZzsKLSAgICAvKiBXaGVyZSBpbiB0aGUgZnJhZyBpcyBpdD8gICovCi0gICAgY2hhciAqd29yZF9nb2VzX2hlcmU7Ci0gICAgLyogV2hlcmUgdG8gYWRkIHRoZSBicmVhay4gICovCi0gICAgZnJhZ1MgKmRpc3BmcmFnOwkJLyogd2hlcmUgdG8gYWRkIHRoZSBicmVhayAqLwotICAgIC8qIE9wZXJhbmRzIG9mIGV4cHJlc3Npb24uICAqLwotICAgIHN5bWJvbFMgKmFkZDsKLSAgICBzeW1ib2xTICpzdWI7Ci0gICAgb2Zmc2V0VCBhZGRudW07Ci0KLSAgICBpbnQgYWRkZWQ7CQkJLyogbmFzdHkgdGhpbmcgaGFwcGVuZCB5ZXQ/ICovCi0gICAgLyogMTogYWRkZWQgYW5kIGhhcyBhIGxvbmctanVtcCAqLwotICAgIC8qIDI6IGFkZGVkIGJ1dCB1c2VzIHNvbWVvbmUgZWxzZXMgbG9uZy1qdW1wICovCi0KLSAgICAvKiBQb2ludGVyIHRvIGJyb2tlbl93b3JkIHdpdGggYSBzaW1pbGFyIGxvbmctanVtcC4gICovCi0gICAgc3RydWN0IGJyb2tlbl93b3JkICp1c2VfanVtcDsKLSAgfTsKLWV4dGVybiBzdHJ1Y3QgYnJva2VuX3dvcmQgKmJyb2tlbl93b3JkczsKLSNlbmRpZiAvKiBuZGVmIFdPUktJTkdfRE9UX1dPUkQgKi8KLQotLyoKLSAqIEN1cnJlbnQgbWVhbnMgZm9yIGdldHRpbmcgZnJvbSBzeW1ib2xzIHRvIHNlZ21lbnRzIGFuZCB2aWNlIHZlcnNlLgotICogVGhpcyB3aWxsIGNoYW5nZSBmb3IgaW5maW5pdGUtc2VnbWVudHMgc3VwcG9ydCAoZS5nLiBDT0ZGKS4KLSAqLwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwkvKiBzdWJzZWcuYyAqLwotCi0jZGVmaW5lCVNFR01FTlRfVE9fU1lNQk9MX1RZUEUoc2VnKSAgKCBzZWdfTl9UWVBFIFsoaW50KSAoc2VnKV0gKQotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsvKiBzdWJzZWcuYyAqLwotCi0jZGVmaW5lCU5fUkVHSVNURVIJMzAJLyogRmFrZSBOX1RZUEUgdmFsdWUgZm9yIFNFR19SRUdJU1RFUiAqLwotCi12b2lkIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci0KLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0KLXZvaWQgc3ltYm9sX2luc2VydCBQQVJBTVMgKChzeW1ib2xTICogYWRkbWUsIHN5bWJvbFMgKiB0YXJnZXQsCi0JCQkgICAgc3ltYm9sUyAqKiByb290UCwgc3ltYm9sUyAqKiBsYXN0UCkpOwotdm9pZCBzeW1ib2xfcmVtb3ZlIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQLCBzeW1ib2xTICoqIHJvb3RQLAotCQkJICAgIHN5bWJvbFMgKiogbGFzdFApKTsKLQotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9wcmV2aW91cyBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotdm9pZCB2ZXJpZnlfc3ltYm9sX2NoYWluIFBBUkFNUyAoKHN5bWJvbFMgKiByb290UCwgc3ltYm9sUyAqIGxhc3RQKSk7Ci12b2lkIHZlcmlmeV9zeW1ib2xfY2hhaW5fMiBQQVJBTVMgKChzeW1ib2xTICogc3ltUCkpOwotCi12b2lkIHN5bWJvbF9hcHBlbmQgUEFSQU1TICgoc3ltYm9sUyAqIGFkZG1lLCBzeW1ib2xTICogdGFyZ2V0LAotCQkJICAgIHN5bWJvbFMgKiogcm9vdFAsIHN5bWJvbFMgKiogbGFzdFApKTsKLQotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9uZXh0IFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi1leHRlcm4gZXhwcmVzc2lvblMgKnN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiBQQVJBTVMgKChzeW1ib2xTICosCi0JCQkJCQkgY29uc3QgZXhwcmVzc2lvblMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX3NldF9mcmFnIFBBUkFNUyAoKHN5bWJvbFMgKiwgZnJhZ1MgKikpOwotZXh0ZXJuIGZyYWdTICpzeW1ib2xfZ2V0X2ZyYWcgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya191c2VkIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX2NsZWFyX3VzZWQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF91c2VkX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF91c2VkX2luX3JlbG9jX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya19tcmlfY29tbW9uIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX2NsZWFyX21yaV9jb21tb24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9tcmlfY29tbW9uX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya193cml0dGVuIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX2NsZWFyX3dyaXR0ZW4gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF93cml0dGVuX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya19yZXNvbHZlZCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX3Jlc29sdmVkX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9zZWN0aW9uX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9lcXVhdGVkX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9jb25zdGFudF9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGFzeW1ib2wgKnN5bWJvbF9nZXRfYmZkc3ltIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX3NldF9iZmRzeW0gUEFSQU1TICgoc3ltYm9sUyAqLCBhc3ltYm9sICopKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX1NZTUZJRUxEX1RZUEUKLU9CSl9TWU1GSUVMRF9UWVBFICpzeW1ib2xfZ2V0X29iaiBQQVJBTVMgKChzeW1ib2xTICopKTsKLXZvaWQgc3ltYm9sX3NldF9vYmogUEFSQU1TICgoc3ltYm9sUyAqLCBPQkpfU1lNRklFTERfVFlQRSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NZTUZJRUxEX1RZUEUKLVRDX1NZTUZJRUxEX1RZUEUgKnN5bWJvbF9nZXRfdGMgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci12b2lkIHN5bWJvbF9zZXRfdGMgUEFSQU1TICgoc3ltYm9sUyAqLCBUQ19TWU1GSUVMRF9UWVBFICopKTsKLSNlbmRpZgotCi0vKiBlbmQgb2Ygc3ltYm9scy5oICovCmRpZmYgLS1naXQgYS9nYXMvdGMuaCBiL2dhcy90Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQwNDZjLi4wMDAwMDAwCi0tLSBhL2dhcy90Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qIHRjLmggLSB0YXJnZXQgY3B1IGRlcGVuZGVudAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW4gdGhlb3J5IChtaW5lLCBhdCBsZWFzdCEpIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIKLSAgIHNob3VsZCBvbmx5IGhhdmUgdG8gaW5jbHVkZSBvbmUgZmlsZS4gIFRoaXMgb25lLiAgLS0gSkYgKi8KLQotZXh0ZXJuIGNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXTsKLQotLyogSkYgbW92ZWQgdGhpcyBoZXJlIGZyb20gYXMuaCB1bmRlciB0aGUgdGhlb3J5IHRoYXQgbm9ib2R5IGV4Y2VwdCBNQUNISU5FLmMKLSAgIGFuZCB3cml0ZS5jIGNhcmUgYWJvdXQgaXQgYW55d2F5LiAqLwotCi1zdHJ1Y3QgcmVsYXhfdHlwZQotewotICAvKiBGb3J3YXJkIHJlYWNoLiBTaWduZWQgbnVtYmVyLiA+IDAuICovCi0gIGxvbmcgcmx4X2ZvcndhcmQ7Ci0gIC8qIEJhY2t3YXJkIHJlYWNoLiBTaWduZWQgbnVtYmVyLiA8IDAuICovCi0gIGxvbmcgcmx4X2JhY2t3YXJkOwotCi0gIC8qIEJ5dGVzIGxlbmd0aCBvZiB0aGlzIGFkZHJlc3MuICovCi0gIHVuc2lnbmVkIGNoYXIgcmx4X2xlbmd0aDsKLQotICAvKiBOZXh0IGxvbmdlciByZWxheC1zdGF0ZS4gIDAgbWVhbnMgdGhlcmUgaXMgbm8gJ25leHQnIHJlbGF4LXN0YXRlLiAqLwotICByZWxheF9zdWJzdGF0ZVQgcmx4X21vcmU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCByZWxheF90eXBlIHJlbGF4X3R5cGVTOwotCi1leHRlcm4gY29uc3QgaW50IG1kX3JlbG9jX3NpemU7CS8qIFNpemUgb2YgYSByZWxvY2F0aW9uIHJlY29yZCAqLwotCi1jaGFyICptZF9hdG9mIFBBUkFNUyAoKGludCB3aGF0X3N0YXRlbWVudF90eXBlLCBjaGFyICpsaXRlcmFsUCwgaW50ICpzaXplUCkpOwotI2lmbmRlZiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAotaW50IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFBBUkFNUyAoKGZyYWdTICogZnJhZ1AsIHNlZ1Qgc2VnbWVudCkpOwotI2VuZGlmCi1pbnQgbWRfcGFyc2Vfb3B0aW9uIFBBUkFNUyAoKGludCBjLCBjaGFyICphcmcpKTsKLXZvaWQgbWRfc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICopKTsKLWxvbmcgbWRfcGNyZWxfZnJvbSBQQVJBTVMgKChmaXhTICogZml4UCkpOwotc2hvcnQgdGNfY29mZl9maXgycnR5cGUgUEFSQU1TICgoZml4UyAqIGZpeFApKTsKLXZvaWQgbWRfYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyKSk7Ci12b2lkIG1kX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLSNpZm5kZWYgbWRfY3JlYXRlX2xvbmdfanVtcAotdm9pZCBtZF9jcmVhdGVfbG9uZ19qdW1wIFBBUkFNUyAoKGNoYXIgKnB0ciwgYWRkcmVzc1QgZnJvbV9hZGRyLAotCQkJCSAgYWRkcmVzc1QgdG9fYWRkciwgZnJhZ1MgKiBmcmFnLAotCQkJCSAgc3ltYm9sUyAqIHRvX3N5bWJvbCkpOwotI2VuZGlmCi0jaWZuZGVmIG1kX2NyZWF0ZV9zaG9ydF9qdW1wCi12b2lkIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIFBBUkFNUyAoKGNoYXIgKnB0ciwgYWRkcmVzc1QgZnJvbV9hZGRyLAotCQkJCSAgIGFkZHJlc3NUIHRvX2FkZHIsIGZyYWdTICogZnJhZywKLQkJCQkgICBzeW1ib2xTICogdG9fc3ltYm9sKSk7Ci0jZW5kaWYKLXZvaWQgbWRfbnVtYmVyX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgdmFsdWVUIHZhbCwgaW50IG4pKTsKLQotI2lmbmRlZiBtZF9vcGVyYW5kCi12b2lkIG1kX29wZXJhbmQgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotI2VuZGlmCi0KLSNpZmRlZiBNRF9BUFBMWV9GSVgzCi1pbnQgbWRfYXBwbHlfZml4MyBQQVJBTVMgKChmaXhTICogZml4UCwgdmFsdWVUICp2YWwsIHNlZ1Qgc2VnKSk7Ci0jZW5kaWYKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQgbWRfYXBwbHlfZml4IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCB2YWx1ZVQgKnZhbCkpOwotI2lmbmRlZiBtZF9jb252ZXJ0X2ZyYWcKLXZvaWQgbWRfY29udmVydF9mcmFnIFBBUkFNUyAoKGJmZCAqIGhlYWRlcnMsIHNlZ1Qgc2VjLCBmcmFnUyAqIGZyYWdQKSk7Ci0jZW5kaWYKLSNpZm5kZWYgdGNfaGVhZGVyc19ob29rCi12b2lkIHRjX2hlYWRlcnNfaG9vayBQQVJBTVMgKChzZWdUICosIGZpeFMgKikpOwotI2VuZGlmCi0jaWZuZGVmIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotZXh0ZXJuIGFyZWxlbnQgKnRjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLSNlbHNlCi1leHRlcm4gYXJlbGVudCAqKnRjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLSNlbmRpZgotI2Vsc2UgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLXZvaWQgbWRfYXBwbHlfZml4IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCBsb25nIHZhbCkpOwotI2lmbmRlZiBtZF9jb252ZXJ0X2ZyYWcKLXZvaWQgbWRfY29udmVydF9mcmFnIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycywgc2VnVCwgZnJhZ1MgKiBmcmFnUCkpOwotI2VuZGlmCi0KLSNpZm5kZWYgdGNfY3Jhd2xfc3ltYm9sX2NoYWluCi12b2lkIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNlbmRpZiAvKiB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gKi8KLQotI2lmbmRlZiB0Y19oZWFkZXJzX2hvb2sKLXZvaWQgdGNfaGVhZGVyc19ob29rIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2VuZGlmIC8qIHRjX2hlYWRlcnNfaG9vayAqLwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBtZF9zZWN0aW9uX2FsaWduCi12YWx1ZVQgbWRfc2VjdGlvbl9hbGlnbiBQQVJBTVMgKChzZWdUIHNlZywgdmFsdWVUIHNpemUpKTsKLSNlbmRpZgotCi0jaWZuZGVmIG1kX3VuZGVmaW5lZF9zeW1ib2wKLXN5bWJvbFMgKm1kX3VuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotI2VuZGlmCi0KLS8qIGVuZCBvZiB0Yy5oICovCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2dhcy90ZXN0c3VpdGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjg4N2Q5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMjYwMCArMCwwIEBACi1UdWUgTm92IDMwIDIzOjAyOjAxIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAve2FtMzMucywgYW0zM18yLnMsIGFtMzNfMy5zfTogTmV3IHRlc3QgZmlsZXMuCi0JKiBnYXMvbW4xMDMwMC97YW0zM180LnMsIGFtMzNfNS5zLCBhbTMzXzYuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAve2FtMzNfNy5zLCBhbTMzXzguc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBSdW4gdGhlIGFtMzMgdGVzdHMuCi0KLTE5OTktMTEtMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sYS5kOiBBZGp1c3QgZm9yIG5ldyBsYSBtYWNybyBleHBhbnNpb24uCi0JQ2hhbmdlIG1hdGNoZXMgZm9yIGV4cGxpY2l0IGFkZHJlc3NlcyB0byBtYXRjaGVzIGZvcgotCWFueSBhZGRyZXNzLgotCSogZ2FzL21pcHMvbGEteGdvdC5kOiBTYW1lLgotCSogZ2FzL21pcHMvbGEtc3ZyNHBpYy5kOiBTYW1lLgotCi0xOTk5LTExLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JUmVtb3ZlIHJlbG9jIGdlbmVyYXRpbmcgcmVmZXJlbmNlcyB0byBsb2NhbCBsYWJlbHMgaW4gdGVzdCBjb2RlLgotCVNvbWUgQVJNIHRhcmdldHMgKGVnIFBFKSBnZW5lcmF0ZSBhIHJlbG9jIGJhc2VkIG9uIHRoZSBsYWJlbCwKLQl3aGlsc3Qgb3RoZXJzIChlZyBFTEYpIGdlbmVyYXRlIGEgcmVsb2MgYmFzZWQgb24gdGhlIHNlY3Rpb24KLQlzeW1ib2wuICBUaGlzIG1lYW50IHRoYXQgdGhlIGRpc2Fzc2VtYmxlZCBvdXRwdXRzIHdvdWxkIGRpZmZlci4KLQkKLQkqIGdhcy9hcm0vaW5zdC5zOiBDaGFuZ2UgdGVzdCBvZiBCTFBMIGluc3RydWN0aW9uLgotCSogZ2FzL2FybS9pbnN0LmQ6IENoYW5nZSBleHBlY3RlZCBkZWNvZGUgb2YgQkxQTCBpbnN0cnVjdGlvbi4KLQkqIGdhcy9hcm0vYXJtN3QuczogUmVtb3ZlIHVzZSBvZiAuTEMwIGxhYmVsIGluIC53b3JkIGRpcmVjdGl2ZS4KLQlSZW1vdmUgLnJkYXRhIHNlY3Rpb24sIHNpbmNlIHRoaXMgY2Fubm90IGV4aXN0IGluIGFuIGFybS1hb3V0Ci0JdGFyZ2V0LgotCSogZ2FzL2FybS9hcm03dC5kOiBDaGFuZ2UgZXhwZWN0ZWQgcmVsb2MgZ2VuZXJhdGVkIGZvciAud29yZAotCWRpcmVjdGl2ZS4KLQotMTk5OS0xMC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9hcm03dC5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IG9iamR1bXAgb3V0cHV0LgotCSogZ2FzL2FybS9pbnN0LnM6IEZpeCBlcnJvbmVvdXMgdGVzdCBjYXNlLgotCSogZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3Qgb2JqZHVtcCBvdXRwdXQuCi0KLU1vbiBPY3QgMTEgMTM6Mzc6NTEgMTk5OSAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IEFsbG93ICcjLi4uJyB0byBtZWFuICJzb21lCi0gCWluZGV0ZXJtaW5hdGUgbnVtYmVyIG9mIGV4dHJhIGxpbmVzIGhlcmUiLgotCi0JKiBnYXMvZWxmL2VsZi5leHA6IFJlbW92ZSBYRkFJTHMuCi0JKiBnYXMvZWxmL3NlY3Rpb24wLmQ6IE1ha2UgcGFzcyBvbiBNSVBTIChhbmQgaG9wZWZ1bGx5IGFscGhhKS4KLQkqIGdhcy9lbGYvc2VjdGlvbjEuZDogTGlrZXdpc2UuCi0KLVRodSBPY3QgIDcgMDA6MTI6MDQgTURUIDE5OTkJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QxMHY6IE5ldyBkaXJlY3RvcnkuCi0JKiBnYXMvZDEwdi9kMTAuZXhwOiBOZXcgZmlsZS4KLQkqIGdhcy9kMTB2L2luc3QuczogTmV3IGZpbGUuCi0JKiBnYXMvZDEwdi9pbnN0LmQ6IE5ldyBmaWxlLgotCi1UaHUgT2N0ICA3IDEyOjUyOjI1IDE5OTkgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvZWxmLXJlbC5zOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL2VsZi1yZWwuZDogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9lbGYtcmVsMi5kOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL2UzMi1yZWwyLmQ6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvZWxmLXJlbDIuczogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogQWRkIGVsZi1yZWwsIGVsZi1yZWwyLgotCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczEuZDogVHdlYWsgYSBsaXR0bGUgc28gaXQgcGFzc2VzCi0JZXZlbiBpZiB0aGUgQ1BVIGlzIHNldCB0byBzb21ldGhpbmcgYnkgZGVmYXVsdC4KLQotTW9uIE9jdCAgNCAxODoyNTo0OSAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9lcnJvci5leHA6IE5ldyB0ZXN0Y2FzZSBkcml2ZXIuCi0JKiBnYXMvbTMyci9tMzJyeC5leHA6IE5ldyB0ZXN0Y2FzZSBkcml2ZXIuCi0JKiBnYXMvbTMyci9mc2xvdHguW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvbTMycnguW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvcmVsYXgtcy5bc2RdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbTMyci9pbnRlcmZlcmUuczogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvd3JvbmdzaXplLnM6IE5ldyB0ZXN0Y2FzZS4KLQotMTk5OS0wOS0xNyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9pMzg2LmV4cDogRW5hYmxlIHJlbG9jIGFuZCB3aGl0ZSB0ZXN0cyBmb3IgQ09GRi4KLQkqIGdhcy9pMzg2L3JlbG9jLmQ6IEFjY2VwdCBkaXIzMiByZWxvY3MuCi0KLTE5OTktMDktMTIgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBjb2ZmdGFnIHRlc3QgZm9yIGkqODYtKi1pbnRlcml4Ki4KLQkqIGxpYi9nYXMtZGVmcy5leHA6IEFkZCBwZXJyb3IgaWYgY2FuIG5vdCByZWFkIC5kIGZpbGUuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogZ2FzL3BqL3twai5leHAsIG9wcy5jLCBvcHMuZH06IE5ldyB0ZXN0cyBmb3IgcGljb0phdmEuCi0KLTE5OTktMDktMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cDogQWRkIFtpc3RhcmdldCAic3Ryb25nYXJtKi0qLSoiXSB0byBydW4KLQlkdW1wICB0ZXN0ICJlbnRyeTAiIGluc3RlYWQgb2YgImVudHJ5MSIuCi0JCi0xOTk5LTA5LTAxICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLSAKLSAgICAgICAgKiBnYXMvdnRhYmxlL3Z0YWJsZS5leHA6IEFkZGVkIFtpc3RhcmdldCAiYXJtKi0qLSoiXSB0byBydW4gZHVtcCAKLSAgICAgICAgdGVzdCAiZW50cnkwIiBpbnN0ZWFkIG9mICJlbnRyeTEiLiAgQVJNIHRhcmdldHMgdXNlIFJFTCByZWxvY3MsCi0gICAgICAgIGFuZCBzaG91bGQgdXNlIHRoZSB0ZXN0IGVudHJ5MC4KLQotMTk5OS0wOS0wMSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBnYXMvaTM4Ni9uYWtlZC5kOiBGaXggZm9yIGNvZmYgdGFyZ2V0cy4KLQotTW9uIEF1ZyAzMCAxMjoxODo0MCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkLyouczogVXNlIC5jb2RlIGluc3RlYWQgb2YgLlNQQUNFLy5TVUJTUEEgZm9yCi0Jc2VjdGlvbmluZy4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogRGlzYWJsZSB0ZXN0cyBub3QgYXBwcm9wcmlhdGUgZm9yCi0JUEE2NC4KLQotCSogZ2FzL2hwcGEvcmVsb2MvKi5zOiBVc2UgLmNvZGUgaW5zdGVhZCBvZiAuU1BBQ0UvLlNVQlNQQSBmb3IKLQlzZWN0aW9uaW5nLgotCSogZ2FzL2hwcGEvcGFyc2UvcGFyc2UuZXhwOiBEaXNhYmxlIHRlc3RzIG5vdCBhcHByb3ByaWF0ZSBmb3IgUEE2NC4KLQlSZXZhbXAgYWRkcmVzcyBleHByZXNzaW9ucyBzbGlnaHRseSB0byBoYW5kbGUgYW4gYXJiaXRyYXJ5IHNpemVkCi0JYWRkcmVzcy4KLQotCSogZ2FzL2hwcGEvcGFyc2UvKi5zOiBVc2UgLmNvZGUgaW5zdGVhZCBvZiAuU1BBQ0UvLlNVQlNQQSBmb3IKLQlzZWN0aW9uaW5nLgotCSogZ2FzL2hwcGEvcGFyc2UvcGFyc2UuZXhwOiBEaXNhYmxlIHRlc3RzIG5vdCBhcHByb3ByaWF0ZSBmb3IgUEE2NC4KLQotCSogZ2FzL2hwcGEvYmFzaWMvKi5zOiBVc2UgLmNvZGUgaW5zdGVhZCBvZiAuU1BBQ0UvLlNVQlNQQSBmb3IKLQlzZWN0aW9uaW5nLgotCi0xOTk5LTA4LTMwICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L25ha2VkLnMsIGdhcy9pMzg2L25ha2VkLmQ6IFRlc3Qtc3VpdGUgYWRkaXRpb24gZm9yCi0JYWxsb3dfbmFrZWRfcmVnIHBhcnNpbmcuCi0JKiBnYXMvaTM4Ni9pMzg2LmV4cDogQ2FsbCBpdC4KLQotMTk5OS0wOC0yOSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni93aGl0ZS5zLCBnYXMvaTM4Ni93aGl0ZS5sOiBBZGQgc3BhY2UgaW4gRlAgcmVnIHRlc3RzLgotCi1TYXQgQXVnIDI4IDAwOjE2OjEyIDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6ICBBZGQgbmV3IHRlc3RzIHNoaWZ0Mi5zLAotCXNoaWZ0My5zLCBleHRyYWN0Mi5zLCBleHRyYWN0My5zLCBkZXBvc2l0Mi5zLCBhbmQgZGVwb3NpdDMucy4KLQkqIGdhcy9ocHBhL2Jhc2ljL3NoaWZ0Mi5zLCBzaGlmdDMucywgZXh0cmFjdDIucywKLQlleHRyYWN0My5zLCBkZXBvc2l0Mi5zLCBkZXBvc2l0My5zOiAgTmV3LgotCi0JKiBnYXMvaHBwYS9iYXNpYy9hZGQucyxhZGRpLnMsZGNvci5zLHNobGFkZC5zLHN1Yi5zLHN1Ymkucyx1bml0LnM6Ci0JQWRkIG5ldyBzeW50YXggdmVyc2lvbnMgb2YgaW5zdHJ1Y3Rpb25zIHRvIHRlc3RzLiAKLQkqIGdhcy9ocHBhL2Jhc2ljL2FkZDIucyxkY29yMi5zLHBlcmYucyxwdXJnZTIucyxzaGxhZGQyLnMsc3ViMi5zLAotCXN5c3RlbTIucywgdW5pdDIuczogIE5ldyB0ZXN0cy4KLQkqIGhwcGEvYmFzaWMvYmFzaWMuZXhwOiBBZGQgbmV3IHRlc3RzLgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6Ci0JKiBnYXMvaHBwYS9iYXNpYy9tZWRpYS5zOiAgQWRkIHRlc3QgY2FzZXMgZm9yIG5ldyBpbnN0cnVjdGlvbnMuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9fYnJhbmNoMixkb19tZWRpYSk6IE5ldy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2JyYW5jaDIuczogIE5ldy4KLQkqIGdhcy9ocHBhL2Jhc2ljL21lZGlhLnM6ICBOZXcuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9fZnBfY29tcDIpOiAgTmV3LgotCSogZ2FzL2hwcGEvYmFzaWMvZnBfY29tcDIuczogIE5ldy4KLQotMTk5OS0wOC0yMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9nZW5lcmFsLnMsIGdhcy9pMzg2L2dlbmVyYWwubDogQWRkIC5jb2RlMTZnY2MKLQlkaXNwbGFjZW1lbnQgY2hlY2tzIHdpdGggYXV0byBhZGRyZXNzIHByZWZpeC4KLQotMTk5OS0wOC0xNyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBnYXMvZWxmL2VsZi5leHA6IEV4cGVjdGVkIHRvIGZhaWwgb24gYWxwaGEqLSotKi4KLQotMTk5OS0wOC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGdhcy9pMzg2L2Zsb2F0LnMsIGdhcy9pMzg2L2Zsb2F0Lmw6IE1vZGlmeSB0byB3b3JrIGNvcnJlY3RseQotCXdoZW4gZ2FzIHVzZXMgMioqNCBhbGlnbm1lbnQgZm9yIC50ZXh0LgotCSogZ2FzL2kzODYvZ2VuZXJhbC5zLCBnYXMvaTM4Ni9nZW5lcmFsLmw6IExpa2V3aXNlLgotCSogZ2FzL2kzODYva2F0bWFpLnMsIGdhcy9pMzg2L2thdG1haS5kOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L21vZHJtLnMsIGdhcy9pMzg2L21vZHJtLmw6IExpa2V3aXNlLgotCSogZ2FzL2kzODYvcHJlZml4LnMsIGdhcy9pMzg2L3ByZWZpeC5kOiBMaWtld2lzZS4KLQotMTk5OS0wNy0yNyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9yZWxvYy5kOiBGaXggc28gdGhhdCB0ZXN0IHBhc3NlcyB3aGVuIGVuYWJsZS10YXJnZXRzCi0JaW5jbHVkZXMgNjQtYml0IGJmZCB0YXJnZXQuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvaTM4Ni9rYXRtYWkuZDogVHdlYWsgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGdhcy9lbGYvZWxmLmV4cDogRG9uJ3QgcnVuIHRlc3RzIG9uICIqLSotbGludXgqYW91dCoiIG9yCi0JIiotKi1saW51eCpvbGRsZCoiLgotCSogZ2FzL3Z0YWJsZS92dGFibGUuZXhwOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L3JlbG9jLmQ6IE1vZGlmeSBleHBlY3RlZCByZWxvYyBuYW1lcyB0byBhY2NlcHQgYS5vdXQKLQluYW1lcy4KLQotCSogZ2FzL2kzODYvYW1kLnM6IEFkZCBhIHN5bWJvbCBzbyBhLm91dCB0ZXN0cyB3aWxsIHdvcmsuCi0JKiBnYXMvaTM4Ni9rYXRtYWkuczogTGlrZXdpc2UuCi0JKiBnYXMvaTM4Ni9hbWQuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0JKiBnYXMvaTM4Ni9rYXRtYWkuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLTE5OTktMDYtMTAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvbWlwcy9zeW5jLmQ6IFBhc3MgLW1pcHMyIHRvIHRoZSBhc3NlbWJsZXIuCi0KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzLnM6IFR3ZWFrIGNvZGUgc28gdGhhdCB0aGUgdGVzdHMgcGFzcyBmb3IKLQltaXBzLWVsZiB0YXJnZXQgYXMgd2VsbCBhcyBtaXBzNjQtZWxmIHRhcmdldC4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzMS5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczIuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczQuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9lbGYvZWxmLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBtaXBzKi0qLSouCi0KLQkqIGdhcy9hbGwvaXRibC10ZXN0LmMgKG1haW4pOiBVcGRhdGUgaXRibF9nZXRfcmVnX3ZhbCBjYWxsIGZvciBuZXcKLQlwYXJhbWV0ZXIuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZ2FzL3NwYXJjL3N5bnRoNjQuczogQWRkIGNoZWNrcyBmb3Igc2luZ2xlIHJlZ2lzdGVyIHNpZ254L2NscnV3LgotCSogZ2FzL3NwYXJjL3NldDY0LnM6IEFkZCB0ZXN0cyBmb3Igc2V0dXcgYW5kIHNldHN3IHN5bnRoZXRpYyBpbnNucy4KLQkqIGdhcy9zcGFyYy9wcmVmZXRjaC5kOiBBZGQgLTY0IGFzIHN3aXRjaC4KLQkqIGdhcy9zcGFyYy9yZHByLmQ6IERpdHRvLgotCSogZ2FzL3NwYXJjL3dycHIuZDogRGl0dG8uCi0JKiBnYXMvc3BhcmMvc3ludGg2NC5kOiBEaXR0bywgcmVmbGVjdCBzeW50aDY0LnMgY2hhbmdlcy4KLQkqIGdhcy9zcGFyYy9yZWxvYzY0LmQ6IEFkZCAtNjQgYXMgc3dpdGNoLCBiZSBtb3JlIHRvbGVyYW50LCBhcwotCWN1cnJlbnQgZ2FzIG91dHB1dHMgJWhpKDApIGFuZCBub3QgJWhpKDB4MCkuCi0JKiBnYXMvc3BhcmMvc2V0NjQuZDogQWRkIC02NCBhcyBzd2l0Y2gsIHJlZmxlY3Qgc2V0NjQucyBjaGFuZ2VzIGFuZAotCW9wdGltaXphdGlvbnMgZm9yIHNldHggaW5zdHJ1Y3Rpb24uCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBEbyBzcGFyYzY0Ki0qLSogY2hlY2tzIGlmIGl0IGlzIGFueSBvZiB0aGUKLQljb21waWxlZC1pbiB0YXJnZXRzLgotCi0xOTk5LTA2LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvbWFjcm9zL2lycC5zOiBVc2UgYGZvbycgYW5kIGBiYXInIGluc3RlYWQgb2YgYHInIGFuZCBgcycuCi0JKiBnYXMvbWFjcm9zL3JlcHQucywgZ2FzL21hY3Jvcy90ZXN0Mi5zLCBnYXMvbWFjcm9zL3Rlc3QzLnM6IExpa2V3aXNlLgotCSogZ2FzL21hY3Jvcy97aXJwLHJlcHQsdGVzdDIsdGVzdDN9LmQ6IFVwZGF0ZS4KLQotMTk5OS0wNi0wNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2VsZi9lbGYuZXhwOiBOZXcgZGlyZWN0b3J5LgotCSogZ2FzL2VsZi9zZWN0aW9uMC5bc2RdOiBOZXcgdGVzdC4KLQkqIGdhcy9lbGYvc2VjdGlvbjEuW3NkXTogTmV3IHRlc3QuCi0KLTE5OTktMDYtMDMgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZCwgZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZSB0byBtYXRjaCBjdXJyZW50IGdhcywKLSAJYmZkIGFuZCBvcGNvZGVzLgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ2FzL3Z0YWJsZS92dGFibGUuZXhwOiBEb24ndCBydW4gdGVzdCBmb3IgaTk2MCB5ZXQuCi0KLTE5OTktMDUtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tY29yZS9hbGxpbnNuLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IG9iamR1bXAgb3V0cHV0LgotCi0xOTk5LTA1LTEyICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L29wY29kZS5kOiBNb2RpZnkgY2FsbHcgdG8gc3VpdCBkaXNhc20gZml4LgotCi0JKiBnYXMvaTM4Ni9hbWQuZDogTW9kaWZ5IGEgJyhiYWQpJyB0byBTSU1EIGluc3RydWN0aW9uLgotCi0JKiBnYXMvaTM4Ni9hbWQuczogUGFkIHRvIG11bHRpcGxlIG9mIDgKLQkqIGdhcy9pMzg2L2FtZC5kOiBIZXJlIHRvby4KLQotCSogZ2FzL2kzODYvcHJlZml4LltzZF06IEFsaWduIHdpdGggbm9wcwotCSogZ2FzL2kzODYvcmVsb2MuW3NkXTogSGVyZSB0b28uCi0KLQkqIGdhcy9pMzg2L2thdG1haS5bc2RdOiBOZXcgZm9yIFBJSUkgU0lNRAotCSogZ2FzL2kzODYvaTM4Ni5leHA6IENhbGwgaXQuCi0KLTE5OTktMDUtMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tY29yZS9hbGxpbnNuLmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyCi0Jb3BlcmF0aW9ucy4gCi0KLTE5OTktMDQtMTYgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBnYXMvaTM4Ni9hbWQuczogQWRkIE5PUHMgdG8gYWxpZ24gZm9yIGNvZmYgdGFyZ2V0cwotCSogZ2FzL2kzODYvYW1kLmQ6IGFuZCBjaGVjayBmb3IgdGhlbS4KLQotVGh1IEFwciAxNSAxNTowMzo0MyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9fY29wcm1lbSk6IE5vIGxvbmdlciBleHBlY3RlZCB0byBmaWxlLgotCi1XZWQgQXByIDE0IDEzOjQzOjA2IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnM6IERvIG5vdCB1c2UgaW1tZWRpYXRlIHZhbHVlIHdoZXJlIHdlCi0JcmVhbGx5IHdhbnQgYSByZWdpc3Rlci4KLQkqIGdhcy9ocHBhL2Jhc2ljL2NvcHJtZW0uczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9iYXNpYy9jb3BybWVtLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvc3BvcC5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL2Jhc2ljL2ltZW0uczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9lbnRyeWJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2V4cHJidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9maXh1cDdidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTMuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2xhc2JlbGRpZmZzLnM6IExpa2V3aXNlLgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2ltZW0pOiBIYW5kbGUgbXVsdGlwbGUgZW5jb2RpbmdzCi0JZm9yIGxvYWRzIGFuZCBzdG9yZXMgdXNpbmcgcmVnICsgc21hbGwgZCBhZGRyZXNzZXMuCi0JTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlIGZvciBtaXMtcGFyc2Ugb2YgaW1tICVyZWcuCi0KLTE5OTktMDQtMTMgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvbTMycnguZCAoY21wdV9fcmFjaCk6IEZpeCBleHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbTMyci9tMzJyeC5zIChiY19fYWRkLGFkZF9fYmMpOiBFeHBsaWNpdGx5IHNwZWNpZnkgc2hvcnQgYnJhbmNoCi0Jc28gYnJhbmNoIHJlbGF4YXRpb24gcmVzdHJpY3Rpb25zIHdvbid0IGludGVyZmVyZSB3aXRoIHBhcmFsbGVsaXphdGlvbgotCWF0dGVtcHRzLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbWNvcmU6IE5ldyBEaXJlY3RvcnkuCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5leHA6IE5ldyBGaWxlOiBFeHBlY3QgZmlsZSBmb3IgTUNvcmUgYXNzZW1ibHkKLQl0ZXN0cy4KLQkqIGdhcy9tY29yZS9hbGxpbnNuLnM6IE5ldyBGaWxlOiBTb3VyY2UgZmlsZSBmb3IgTUNvcmUgYXNzZW1ibHkKLQl0ZXN0cy4KLQkqIGdhcy9tY29yZS9hbGxpbnNuLmQ6IE5ldyBGaWxlOiBFeHBlY3RlZCBvdXRwdXQgZmlsZSBmb3IgTUNvcmUKLQlhc3NlbWJseSB0ZXN0cy4KLQotMTk5OS0wMy0yMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9tMzJyeC5bc2RdOiBGaXggYSBmZXcgbW9yZSB0ZXN0Y2FzZXMuCi0KLTE5OTktMDMtMTYgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9kMzAuZXhwIChydW5fbGlzdF90ZXN0KTogQWRkIG5ldyB0ZXN0cywKLSAgICAgICAgbGFiZWwsIGd1YXJkLWRlYnVnLCBzZXJpYWwsIHdhcm5fb2RkcmVnLCBiaXR0ZXN0LCBhbmQgbXVsLgotCi0JKiBnYXMvZDMwdi9vcHQuczogRml4IHNvbWUgd2FybmluZ3MgYW5kIGFkZCBhIGZldyBsYWJlbHMKLSAgICAgICAgdG8ga2VlcCB0aGluZ3MgZnJvbSBwYXJhbGxlbGl6aW5nIHdoZXJlIHdlIGRvbid0IHdhbnQgdGhlbSB0by4KLQotCSogZ2FzL2QzMHYvcmVsb2MuczogRml4IHdhcm5pbmcuCi0gICAgICAgIAotCSogZ2FzL2QzMHYvb3B0LmQsIHJlbG9jLmQsIGluc3QuZDogUmVidWlsZC4KLQotCSogZ2FzL2QzMHYvbGFiZWwuczogTmV3IHRlc3QuIENoZWNrIHRoYXQgbGFiZWxzIGFyZSBhbGlnbmVkIAotICAgICAgICBvbiA4LWJ5dGUgYm91bmRhcmllcy4KLQotCSogZ2FzL2QzMHYvZ3VhcmQtZGVidWcuczogTmV3IHRlc3QuIFRlc3Qgb3V0cHV0IHdpdGggIi1nIi4KLQotCSogZ2FzL2QzMHYvc2VyaWFsLnM6IE5ldyB0ZXN0LiBDaGVjayBmb3Igd2FybmluZ3Mgd2l0aCAKLSAgICAgICAgaWxsZWdhbCBzZXJpYWwgaW5zdHJ1Y3Rpb25zLgotCi0JKiBnYXMvZDMwdi93YXJuX29kZHJlZy5zOiBOZXcgdGVzdC4gQ0hlY2sgZm9yIHdhcm5pbmdzIHdoZW4KLSAgICAgICAgb2RkLW51bWJlcmVkIHJlZ2lzdGVycyBhcmUgdXNlZCBmb3Igc29tZSBpbnN0cnVjdGlvbnMuCi0KLQkqIGdhcy9kMzB2L2JpdHRlc3QuczogTmV3IHRlc3QuIENoZWNrIGZvciBiaXQgb3BlcmF0aW9uIAotICAgICAgICBpbnN0cnVjdGlvbnMgKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1QpIGluIHRoZSBJVS4KLQotCSogZ2FzL2QzMHYvbXVsLnM6IE5ldyB0ZXN0LiBDaGVjayBmb3IgcmVzdHJpY3RlZCBzZXF1ZW5jZXMKLSAgICAgICAgaW4gYSBidW5jaCBvZiBkaWZmZXJlbnQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zLgotCQotCSogZ2FzL3Z0YWJsZS92dGFibGUuZXhwIChydW5fbGlzdF90ZXN0KTogRG9uJ3QKLQlydW4gdGVzdCBvbiBEMzBWLgotCi0xOTk5LTAzLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IEV4cGVjdCBzdHJvbmdhcm0tY29mZiB0YXJnZXQgdG8gZmFpbCBjb2ZmdGFnCi0JdGVzdC4gCi0KLTE5OTktMDItMTMgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biB0aGUgbmV3IHRlc3RzLCBiZWxvdy4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzMS5kLCBnYXMvbWlwcy9lbGZfZV9mbGFnczIuZCwKLQlnYXMvbWlwcy9lbGZfZV9mbGFnczMuZCwgZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQ6IE5ldyBmaWxlcy4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzLmMsIGdhcy9taXBzL2VsZl9lX2ZsYWdzLnM6IE5ldyBmaWxlcy4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IERvY3VtZW50LiAgSXQncyBub3QKLSAJcmVhbGx5IHRyaXZpYWwuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBDbGVhbiB1cCBsb2dpYyBmb3IgZ3Vlc3NpbmcKLQkkcHJvZ3JhbSAodGhlIGR1bXAgdG9vbCkuCi0KLTE5OTktMDItMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBQcmVmaXggYWxsIHwgd2l0aCBcLgotCShwdXNoLHBvcCk6IEZpeCBleHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbTMyci9yZWxheC0xLmQ6IEVtaXR0ZWQgbm9wcyBhcmUgc2VyaWFsLCBub3QgcGFyYWxsZWwuCi0JKiBnYXMvbTMyci9mc2xvdC5kOiBQcmVmaXggYWxsIHwgd2l0aCBcLgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvdnRhYmxlL2luaGVyaXQwLnM6IERvIG5vdCB1c2UgJ0AnIHByZWZpeCB0byAudHlwZSBvcGVyYXRvci4KLQlTb21lIHBvcnRzIHVzZSBpdCBhcyBhIGNvbW1lbnQgaW5pdGlhdG9yLgotCi0JKiBnYXMvdnRhYmxlL2VudHJ5MS5kOiBEbyBub3QgbG9vayBmb3IgYW4gYWRkZW5kLiAgU29tZSBwb3J0cyB1c2UKLQlSRUwgcmVsb2NhdGlvbnMgYW5kIHNvIGRvIG5vdCBoYXZlIG9uZS4KLQotMTk5OC0xMi0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXggdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBzeW50YXguCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IEZpeCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dAotCi0xOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLTE5OTgtMTItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogUmVwbGFjZSBpbGxlZ2FsIGluc25zIHdpdGggbGVnYWwgdmVyc2lvbnMuCi0KLQkqIGdhcy9mcjMwL2FsbGluc24uZDogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCi1UaHUgTm92IDE5IDE1OjU5OjUxIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBSZW9yZGVyIGluc25zIGZvciBiZXR0ZXIgc2ltdWxhdGlvbi4KLQotVGh1IE5vdiAxOSAwNzo1MDo0NCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvc3luYy5bc2RdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIGl0LgotCi1XZWQgTm92IDE4IDExOjI3OjU2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zIChkbW92KTogQ29ycmVjdCBoZXggbGl0ZXJhbHMuCi0KLVR1ZSBOb3YgMTcgMTU6MjQ6MjAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBNb3ZlZCBjdXJyZW50bHkgdW4tYXNzZW1ibGlhYmxlIGluc3RydWN0aW9ucwotCXRvIGVuZCBvZiBmaWxlLgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IEFkZGVkIGRpc2Fzc2VtYmx5IG9mIGN1cnJlbnRseSBhc3NlbWJsaWFibGUKLQlvcGNvZGVzLgotCi1Nb24gTm92IDE2IDE2OjUwOjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogRml4IHN5bnRheCBlcnJvcnMuCi0KLU1vbiBOb3YgMTYgMTk6Mjc6NTIgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IEZpeGVkIG1vcmUgdHlwb3MuCi0KLUZyaSBOb3YgMTMgMTM6MTU6MDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXhlZCB0eXBvcyBhbmQgYWRkZWQgc29tZSB0ZXN0cyBvZiB1cHBlcgotCWNhc2UgdnMgbG93ZXIgY2FzZS4KLQotVHVlIE5vdiAxMCAxNDo1NDo0NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IE5ldyBmaWxlLgotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBOZXcgZmlsZS4KLQkqIGdhcy9mcjMwL2FsbGluc24uZXhwOiBOZXcgZmlsZS4KLQkqIGdhcy9mcjMwL2ZyMzAuZXhwOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgMiAyMDoxNjo1MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9mc2xvdC5bc2RdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbTMyci9tMzJyLmV4cDogUnVuIGl0LgotCi1UdWUgT2N0IDIwIDExOjM1OjA2IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvaTM4Ni5leHA6IFJ1biBBTUQgaW5zbiB0ZXN0LgotCSogZ2FzL2kzODYvYW1kLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2kzODYvYW1kLmQ6IE5ldyB0ZXN0IHJlc3VsdHMuCi0KLVN1biBTZXAgMjAgMDE6MDA6MDEgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGdhcy92dGFibGUvaW5oZXJpdDEubDogUmVxdWlyZSBvbmx5IHRoZSB3b3JkIEdBUyBzb21ld2VyZSBpbiB0aGUKLQlmaXJzdCBsaW5lIG9mIHRoZSBsaXN0aW5nLgotCi1UdWUgU2VwICAxIDEwOjIwOjAzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9wcGMvYXN0ZXN0LmQ6IEFkanVzdCByZWdleHBzIHRvIG1hdGNoIGEgNjQtYml0IGhvc3QuCi0JKiBnYXMvcHBjL2FzdGVzdDIuZDogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMzEgMTM6MjU6MDcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3Z0YWJsZS97ZW50cnkwLmQsZW50cnkxLmQsaW5oZXJpdDAuZH06IEZpeCBwYXR0ZXJuIG1hdGNoaW5nCi0Jb2Ygd2hpdGVzcGFjZSBmb3IgNjQtYml0IGhvc3RzLgotCi1Nb24gQXVnIDMxIDEyOjQ1OjQ5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cDogTmV3LgotCSogZ2FzL3Z0YWJsZS97ZW50cnkwLnMsZW50cnkwLmR9OiBOZXcuCi0JKiBnYXMvdnRhYmxlL3tlbnRyeTEucyxlbnRyeTEuZH06IE5ldy4KLQkqIGdhcy92dGFibGUve2luaGVyaXQwLnMsaW5oZXJpdDAuZH06IE5ldy4KLQkqIGdhcy92dGFibGUve2luaGVyaXQxLnMsaW5oZXJpdDEubH06IE5ldy4KLQotVGh1IEF1ZyAyMCAyMzoxODowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9pMzg2L3doaXRlLmw6IFJldmVydCBwYXRjaCBvZiBBdWd1c3QgMTIuCi0KLVdlZCBBdWcgMTIgMTE6NTQ6MzcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC91ZGYuczogTmV3IHRlc3QuCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFJ1biBpdC4KLQotV2VkIEF1ZyAxMiAxMzoyNTozOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L2dlbmVyYWwubDogVGVzdCBhbmRiICR+MHg4MCxmb28uCi0JKiBnYXMvaTM4Ni9nZW5lcmFsLnM6IFVwZGF0ZS4KLQotCSogZ2FzL2kzODYvd2hpdGUubDogRXhwZWN0IHdhcm5pbmcgZm9yIHN0YW5kLWFsb25lIHNzIHByZWZpeC4KLQotVHVlIEp1bCAyMSAxMjo0Njo1OSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L3doaXRlLnM6IEFkZCBzb21lIG1vcmUgd2hpdGVzcGFjZSB0ZXN0cy4KLQkqIGdhcy9pMzg2L3doaXRlLmw6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotTW9uIEp1bCAxMyAxODoxNToxMSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2Lyo6IEFsbCBuZXcgaTM4NiB0ZXN0c3VpdGUuCi0KLTE5OTgtMDctMDIgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfaW5pdCk6IENvbXBsYWluIGlmIHRhcmdldCBuYW1lIGlzbid0IGluCi0JY2Fub25pY2FsIGZvcm0uCi0KLVdlZCBKdWwgIDEgMTU6MzU6MDkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBFeHBlY3QgQVJNIGFuZCBUaHVtYiBjb2ZmdGFnIHRlc3QgdG8gZmFpbC4KLQotV2VkIEp1bCAgMSAxNzozMTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9wcGMvc2ltcHNoZnQuczogQWRkIGFsaWdubWVudCBzbyB0aGF0IGl0IHdvcmtzIG9uIEFJWC4KLQkqIGdhcy9wcGMvc2ltcHNoZnQuZDogQ2hhbmdlIGFjY29yZGluZ2x5LiAgT25seSBkdW1wIHRoZSAudGV4dAotCXNlY3Rpb24uCi0KLVR1ZSBKdW4gMjMgMTU6MTQ6NDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3Y4NTAvaGlsbzIuczogVXNlIHIxIGFzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgbW92ZWEKLQlpbnN0cnVjdGlvbiwgc2luY2UgcjAgaXMgcmVhZCBvbmx5LgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHA6IEZpeCBuYW1lcyBvZiBzcGVjaWFsIGFyZWEgcmVsb2NhdGlvbnMuCi0JU2V0IC1td2Fybi1zaWduZWQtb3ZlcmZsb3cgZmxhZyB3aGVuIHJ1bm5pbmcgcmFuZ2UucyB0ZXN0LgotCi1TdW4gSnVuIDIxIDEyOjQ0OjQzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L3JlbG9jLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLVdlZCBKdW4gMTcgMTQ6MDI6MTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvZGVsYXkuZDogQWRkIC1tY3B1PU5OTk4gdG8gZ2FzIGZsYWdzIHRvIGxldCB0ZXN0IGNhc2UKLSAJcnVuIG9uIGRpZmZlcmVudGx5IHRhcmdldGVkIGFzc2VtYmxlci4KLQkqIGdhcy9taXBzL3tsZC1pbG9ja3MtYWRkcjMyLGxkLXN2cjRwaWMuZH06IERpdHRvLgotCSogZ2FzL21pcHMve2xkLXhnb3QuZCxsaWYtc3ZyNHBpYy5kLGxpZi14Z290LmR9OiBTYW1lLgotCSogZ2FzL21pcHMve21pcHMxNi5kLG1pcHM0LmQsbm9kZWxheS5kfTogQWdhaW4uCi0JKiBnYXMvbWlwcy97dHJ1bmMuZCx1bGQuZCx1bGgteGdvdC5kLHVzZC5kfTogQW5kIHRoZW4gc29tZS4KLQkKLQkqIGdhcy9taXBzL2xkLWlsb2Nrcy5kOiBSZW1vdmVkIGRpc2Fzc2VtYmxlciBmbGFncyB0byBsZXQgdGFyZ2V0Ci0gCWRlZmF1bHRzIGdvIHVubW9kaWZpZWQuICBSZXBsYWNlZCAkZjQvJGY1IHdpdGggJGZwWzQ1XSwgYXMgdGhlCi0Jb3JpZ2luYWwgYGxkLmQnIGhhZC4gIEZpbmQgYGxkLnMnLgotCSogZ2FzL21pcHMvbXVsLWlsb2Nrcy5kOiBOZWFybHkgZGl0dG8uCi0JCi1UaHUgSnVuIDExIDE2OjUwOjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2luc3QuZDogRXhwZWN0IHJlcGVhdGkgaW5zdHJ1Y2l0b25zIHRvIGJlIGNvbWJpbmVkLgotCi0JKiBnYXMvZDMwdi9pbnN0LnM6IEFkZCBub3AgdG8ga2VlcCBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb25zIGF0Ci0JZXhwZWN0ZWQgYWRkcmVzc2VzLgotCi1Nb24gSnVuICA4IDE4OjQ3OjExIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2FycmF5LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciByZXN1bHRzLgotCSogZ2FzL2QzMHYvcmVsb2MuZDogUGFydGlhbGx5IHVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlcgotCXJlc3VsdHMuIAotCi1GcmkgSnVuICA1IDE5OjE1OjU5IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5zOiBGb3IgYWxsIHBjIHJlbGF0aXZlIGFkZHJlc3NlcyBjaGFuZ2UgdHN0bAotCXRvIHBlYSBzaW5jZSB0aGUgZm9ybWVyIGRvZXMgbm90IGFsbG93IHBjcmVsIG9uIG02ODAwMC4gIERvIG5vdAotCW1ha2UgbGFiZWwgZm9vIGdsb2JhbCwgc28gdGhhdCByZWZlcmVuY2VzIHRvIGl0IGNhbiBiZSByZWxheGVkIG9uCi0JRUxGIHRhcmdldHMuCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5kLCBnYXMvbTY4ay9vcDY4MDAwLmQ6IFVwZGF0ZWQuCi0KLVR1ZSBKdW4gIDIgMTU6MDg6MzYgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZ2FzL3BwYy9wcGMuZXhwOiBSdW4gc2ltcHNoZnQgdGVzdC4KLQkqIGdhcy9wcGMvc2ltcHNoZnQuZDogTmV3IGZpbGUuCi0JKiBnYXMvcHBjL3NpbXBzaGZ0LnM6IE5ldyBmaWxlLgotCi1Nb24gSnVuICAxIDE3OjAwOjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvZGl2LWlsb2Nrcy5kOiBIYW5kbGUgYm90aCAiYnJlYWsiIGluc3RydWN0aW9uIHZhcmlhbnRzLgotCSogZ2FzL21pcHMve2Rpdi5kLCBtdWwtaWxvY2tzLmQsIG11bC5kfTogTGlrZXdpc2UuCi0JCi1GcmkgTWF5IDI5IDEyOjA3OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkanVzdCBpbG9ja3MgaW5pdGlhbGl6YXRpb24gdG8gbWF0Y2ggY3VycmVudAotCWFzc2VtYmxlciBkZWZhdWx0cyBtb3JlIGNsb3NlbHkuCi0KLQkqIGdhcy9zaC9mcC5zOiBSZW1vdmUgZnRzdC9uYW4uICBUaGUgYXNzZW1ibGVyIG5vIGxvbmdlciBzdXBwb3J0cwotCXRoZSBpbnN0cnVjdGlvbi4KLQkqIGdhcy9zaC9iYXNpYy5leHA6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotV2VkIE1heSAyNyAxNToyNjo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9hbGlnbi5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCSogZ2FzL2QzMHYvaW5zdC5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCSogZ2FzL2QzMHYvaW5zdC5zOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgcnVsZXMuCi0JKiBnYXMvZDMwdi9vcHQuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQotRnJpIE1heSAyMiAxNTo1Njo1MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLmQ6IEhhbmRsZSA2NCBiaXQgYmZkX3ZtYS4KLQkqIGdhcy9tMzJyL3VwcGVyY2FzZS5kOiBMaWtld2lzZS4KLQotVGh1IE1heSAyMSAxNTowMzowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL3RodW1iLnM6IEFkZCBwZXJpb2QgdG8gc3RhcnQgb2YgbGFiZWxzIHRvIHByZXZlbnQKLQlhc3NlbWJsZXIgdGhpbmtpbmcgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbiBlbnRyeSBwb2ludHMuCi0KLVR1ZSBNYXkgMTkgMTg6MTc6MTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzMTYuZDogQ29ycmVjdCB0byByZWZsZWN0IGJ1ZyBmaXggdG8gZGlzYXNzZW1ibGVyLgotCi1Nb24gTWF5IDE4IDEzOjExOjQ1IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3tkaXYsbGQsbXVsfS5kOiBBZGQgYXNzZW1ibGVyIC1tY3B1PSBmbGFnIHRvIG1hdGNoCi0gCWRpc2Fzc2VtYmxlci4KLQkKLUZyaSBNYXkgMTUgMTQ6NTE6MDEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBEaXN0aW5ndWlzaCBjaGFpbnMgd2l0aCAzMi1iaXQgYWRkcmVzc2VzLgotCSogZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kIDogTmV3LgotCi1XZWQgTWF5IDEzIDE1OjA2OjMxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL3VwcGVyY2FzZS5bc2RdOiBUZXN0IGZvciBISUdILFNISUdILExPVyxTREEuCi0KLVRodSBNYXkgIDcgMTM6MDU6MjUgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvYnJlYWsyMC5bc2RdOiBOZXcgdGVzdHMgZm9yIDIwLWJpdCBvcGVyYW5kIGJyZWFrIGFuZAotIAlzZGRicCBpbnN0cnVjdGlvbnMuIAotCSogZ2FzL21pcHMvdHJhcDIwLltzZF06IE5ldyB0ZXN0cyBmb3IgMjAtYml0IG9wZXJhbmQgdHJhcAotIAlpbnN0cnVjdGlvbnMuIAotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biB0aGVtLgotCi1UaHUgQXByIDMwIDExOjU1OjAxIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L3tpbnN0LGFycmF5LG9wdCxyZWxvY30uZDogQWNjZXB0IDxzeW1ib2wrb2Zmc2V0PiBsYWJlbHMKLSAJaW4gZGlzYXNzZW1ibHksIHdoZXJlIHRoZSBvZmZzZXQgaXMgaW4gaGV4IGFuZCBoYXMgYSAiMHgiIHByZWZpeC4KLQkKLVR1ZSBBcHIgMjggMTY6Mzg6MzQgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGluZW5vLltzZF06IEFzc2VtYmx5IHNvdXJjZSBsaW5lIG51bWJlciB0ZXN0LgotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZGVkIGxpbmVubyB0ZXN0LgotCi1XZWQgQXByICA4IDE4OjQ1OjE3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Rlc3RzdWl0ZS9hbGwvZ2FzLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlcyBmb3IKLQlkaWZmZXJlbmNlIG9mIHVuZGVmaW5lZCBzeW1ib2xzIG9uIG1uMTB4MDAgdGFyZ2V0cy4KLQotTW9uIE1hciAyMyAxMDo0NzozMyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2FsaWduLnM6IEJhY2sgb3V0ICIuc2VjdGlvbiB0ZXh0IiBjaGFuZ2UgYmVsb3c7Ci0JdXNlICIudGV4dCIgYWdhaW4uCi0JKiBnYXMvbWFjcm9zL3NlbWkuczogRGl0dG8uCi0JCi1GcmkgTWFyIDIwIDE4OjUxOjQ5IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvYWxpZ24uczogSWRlbnRpZnkgIi50ZXh0IiBzZWN0aW9uIGV4cGxpY2l0bHkuCi0JKiBnYXMvbWFjcm9zL3NlbWkuczogRGl0dG8uCi0JCi0JCi0JCi1Nb24gTWFyICAyIDEzOjMwOjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLltzZF0gKGxkaThhLGxkaTE2YSk6IERlbGV0ZS4KLQkobGRpMTYpOiBJbXByb3ZlIHRlc3QuCi0JKG5vcCk6IEZpeCB0ZXN0LgotCi1UaHUgRmViIDEyIDIwOjEyOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC9tYWNyby5vdXQ6IEFkanVzdCB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQga2V5d29yZAotCWFyZ3VtZW50cyBhcmUgbm93IHBlcm1pdHRlZCBhZnRlciBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KLQotV2VkIEZlYiAgNCAxNToyNzo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2FybTd0LmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQotV2VkIEZlYiAgNCAxNTo0MDowMCAxOTk4ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBnYXMvcHBjL3BwYy5leHA6IE5ldyBmaWxlLgotCSogZ2FzL3BwYy9hc3Rlc3QucywgZ2FzL3BwYy9hc3Rlc3QuZDogTmV3IHRlc3QuCi0JKiBnYXMvcHBjL2FzdGVzdDIucywgZ2FzL3BwYy9hc3Rlc3QyLmQ6IE5ldyB0ZXN0LgotCi1TdW4gRmViICAxIDIxOjQzOjU0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvNDAxMC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KLQkqIGdhcy9taXBzLzQwMTAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogZ2FzL21pcHMvNDEwMC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KLQkqIGdhcy9taXBzLzQxMDAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogZ2FzL21pcHMvNDY1MC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KLQkqIGdhcy9taXBzLzQ2NTAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1GcmkgSmFuIDMwIDE0OjA5OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tb3ZlbWwuZDogQWRkIHRlc3QgY29tbWVudHMsIGZpeCByZWdleHBzLgotCi1UaHUgSmFuIDI5IDEzOjM0OjQ5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL3thbGxpbnNuLGhpZ2gtMX0uZDogQWxsb3cgIyBjb25zdGFudCBwcmVmaXggdG8gYmUgbWlzc2luZy4KLQotVGh1IEphbiAyOSAwOTo0Mzo1MCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9tcmlfbW92ZW1sLltzZF06IE1vdmVkIHRvIC4uLgotCSogZ2FzL21yaS9tb3ZlbWwuW3NkXTogLi4uIGhlcmUuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KLQotVHVlIEphbiAyNyAyMTo1NTo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzLzQwMTAuczogQWRkIDQwMTAgdGVzdHMuCi0JKiBnYXMvbWlwcy80MDEwLmQ6IEV4cGVjdGVkIG91dHB1dC4KLQkqIGdhcy9taXBzLzQxMDAuczogQWRkIDQwMTAgdGVzdHMuCi0JKiBnYXMvbWlwcy80MTAwLmQ6IEV4cGVjdGVkIG91dHB1dC4KLQkqIGdhcy9taXBzLzQ2NTAuczogQWRkIDQwMTAgdGVzdHMuCi0JKiBnYXMvbWlwcy80NjUwLmQ6IEV4cGVjdGVkIG91dHB1dC4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gdGhlIG5ldyB0ZXN0cy4KLQkqIGdhcy9taXBzLyouZDogUGFzcyB0aGUgcmlnaHQgcHJvY2Vzc29yIG1vZGVsIHRvIG9iamR1bXAuCi0JRml4IG1pbm9yIGNhc2VzIHdoZXJlIGV4cGVjdGVkIG91dHB1dCB3YXMgd3JvbmcgZHVlIHRvIG9wY29kZQotCWNvbmZsaWN0cy4KLQotVHVlIEphbiAyNyAwNTozNTowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9tcmlfbW92ZW1sLltzZF06IE5ldyB0ZXN0Y2FzZS4KLQotVGh1IEphbiAyMiAxNzoyOTowNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9oaWdoLTEuZDogQWRkIGhhc2ggcHJlZml4IHRvIGNvbnN0YW50cy4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5zOiBBZGQgaGFzaCBwcmVmaXggdG8gc29tZSBjb25zdGFudHMuCi0JKiBnYXMvbTMyci9hbGxpbnNuLmQ6IEFkZCBoYXNoIHByZWZpeCB0byBjb25zdGFudHMuCi0KLVdlZCBKYW4gMjEgMjE6MjQ6MDggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBnYXMvbTg4ay9pbml0LmQ6IEZpeCBoZXhhZGVjaW1hbCBvZmZzZXRzLgotCi1XZWQgSmFuIDE0IDE3OjQ5OjIyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL3VwcGVyY2FzZS5kOiBGaXggd2hpdGUgc3BhY2UgbWF0Y2hpbmcuCi0JKiBnYXMvbTMyci9yZWxheC0xLmQ6IEZpeCB3aGl0ZSBzcGFjZSBtYXRjaGluZy4KLQotV2VkIEphbiAxNCAxNTo0NDozMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzL2Rpdi5kOiBVcGRhdGUgZm9yIHJlY2VudCBhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9taXBzL2Rpdi1pbG9ja3MuZDogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTQgMTE6MTM6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24uZCAoY21wdWkpOiBVcGRhdGUgb3V0cHV0IHRvIG5ldyBmb3JtYXQuCi0KLVRodSBEZWMgMTggMTE6MTA6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi0JKiBnYXMvYXJtL2FybTd0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi1UdWUgRGVjIDE2IDIyOjE5OjI1IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sYi14Z290LmQsIGdhcy9taXBzL3JvbC5kLCBnYXMvbWlwcy9qYWwtc3ZyNHBpYy5kLAotCWdhcy9taXBzL2phbC14Z290LmQ6IEFkZCBhc3NlbWJsZXIgb3B0aW9uIHRvIHNlbGVjdCBhIHNwZWNpZmljCi0JdGFyZ2V0IGNoaXAsIHRoZSBSMzAwMC4KLQkqIGdhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQ6IE5ldyB0ZXN0LCBzcGVjaWZpY2FsbHkgc2VsZWN0aW5nCi0JUjM5MDAuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5leHA6IERvbid0IHJ1biBJRUVFIEZQIHRlc3RzIGZvciBWYXgKLQl0YXJnZXRzLgotCi1XZWQgT2N0IDE1IDEwOjQwOjE0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuczogVHdlYWsgc2xpZ2h0bHkgdG8gd29yayBvbiB0aGUgUEEuCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyCi0JY2hhbmdlcy4KLQotVGh1IE9jdCAgOSAxODoxMDo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc2V0NjQuW3NkXTogYHNldCcgZG9lc24ndCB0YWtlIG5lZ2F0aXZlIGFyZ3VtZW50cy4KLQotVGh1IE9jdCAgOSAxMjo1OTo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZDogTGlrZXdpc2UuCi0KLVdlZCBPY3QgIDggMTY6MjI6NTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3JlbG9jNjQuW3NkXTogQWRkIHRlc3RjYXNlcyBmb3IgJWhpeCwlbG94LgotCi1XZWQgT2N0ICA4IDE1OjEyOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3N5bnRoLmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL3NwYXJjL3N5bnRoNjQuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9taXBzL2JlcS5zOiBBZGQgLnRleHQgdG8gLmdsb2JsIHRvIG1hcmsgdGhlIHN5bWJvbCB0byBhcyBhCi0JZnVuY3Rpb24gc3ltYm9sLgotCSogZ2FzL21pcHMvamFsLnM6IExpa2V3aXNlLgotCi1UdWUgT2N0ICA3IDEzOjMwOjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9yZWxvYzY0LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IFJ1biBpdC4KLQotU2F0IE9jdCAgNCAxOToxNDoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cDogQWNjZXB0IG02OGsgbGlzdGluZyBmb3JtYXQuCi0KLUZyaSBPY3QgIDMgMTU6NDY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5leHA6IFJlbW92ZSBzZXR1cF94ZmFpbDsgaXQgc2hvdWxkIG5vdwotCXdvcmsuICBDb3JyZWN0IGZvciBiaWcgZW5kaWFuIGFuZCBmb3IgdGFicyBpbiBpbnB1dCBmaWxlLgotCi0JKiBnYXMvYWxwaGEvZnAuZXhwOiBDaGVjayBmb3IgYWxwaGEtKi1vc2YqLCBub3QgYWxwaGEtKi1vc2YxKi4KLQkqIGdhcy9hbHBoYS9mcC5zOiBDaGFuZ2UgY29tbWVudCBjaGFyYWN0ZXJzIGZyb20gISB0byAjLgotCi1UaHUgU2VwIDE4IDExOjE3OjUzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGxldC5kOiBVcGRhdGUgdG8gbmV3IG9iamR1bXAgb3V0cHV0IGZvcm1hdC4KLQkqIGdhcy9zcGFyYy97YXNpLmQsbWVtYmFyLmQscHJlZmV0Y2guZCxyZHByLmQsd3Jwci5kfTogTGlrZXdpc2UuCi0JKiBnYXMvc3BhcmMvc2V0NjQuW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL3NwYXJjL3NwbGV0LTIuW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIHRoZW0uCi0KLVR1ZSBTZXAgMTYgMTU6Mjc6MDggMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGdhcy9kMzB2L2luc3QuczogQWRkIHNvbWUgbmV3IHRlc3RzLiAKLQotIAkqIGdhcy9kMzB2L3tpbnN0LCBvcHQsIHJlbG9jfS5kOiBVcGRhdGUgcmVzdWx0cyB3aXRoCi0gCW5ldyBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotCSogZ2FzL2QzMHYvaW5zdC5bc2RdOiBVcGRhdGUgZXhhbXBsZXMgZm9yIGQqaSBpbnN0cnVjdGlvbnMuIAotCi0JKiBnYXMvZDMwdi8qLmQ6IFVwZGF0ZSBhbGwgdGVzdCByZXN1bHRzIGJlY2F1c2UKLSAJb2YgbmV3ICIucyIgYW5kICIubCIgZXh0ZW5zaW9ucy4KLQotCSogZ2FzL2QzMHYvaW5zdC5bc2RdOiBDb3JyZWN0IGVudHJ5IGZvciBtdWx4MmguCi0JKiBnYXMvZDMwdi9vcHQuW3NkXTogQ29ycmVjdCBzdDJ3IGluc3RydWN0aW9uLiAKLQotCSogZ2FzL2QzMHYvYWxpZ24uZDogQ2hhbmdlIGV4cGVjdGVkIG91dHB1dC4KLQotCSogZ2FzL2QzMHYvcmVsb2MuW3NkXTogQWRkIHRlc3QgY2FzZS4gCi0KLQkqIGdhcy9kMzB2L2FycmF5LltzZF06IE5ldyB0ZXN0IGNhc2UuCi0KLQkqIGdhcy9kMzB2L29wdC5bc2RdOiBBZGRlZCBtb3JlIHRlc3QgY2FzZXMuIAotCi0JKiBnYXMvZDMwdi9vcHQuczogQWRkIHRlc3QgY2FzZXMuCi0JKiBnYXMvZDMwdi9yZWxvYy5zOiBGaXggYSB0ZXN0IGNhc2UuCQotCSogZ2FzL2QzMHYve29wdCxyZWxvY30uZDogUmVnZW5lcmF0ZS4KLQotTW9uIFNlcCAgOCAxNDoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9oaWdoLTEuW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvbTMyci5leHA6IFJ1biBpdC4KLQotTW9uIEF1ZyAyNSAxMTowNDoyNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9yZWxheC0xLltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnIuZXhwOiBSdW4gaXQuCi0KLVRodSBBdWcgMTQgMjM6NDk6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FyYzogTmV3IGRpcmVjdG9yeQotCSogZ2FzL2FyYy97YXJjLmV4cCxhbGlhcy5bc2RdLGJyYW5jaC5bc2RdLGZsYWcuW3NkXSxpbnNuMy5bc2RdLGouW3NkXSwKLQlsZC5bc2RdLG1hdGguW3NkXSxzc2hpZnQuW3NkXSxzdC5bc2RdLHdhcm4ue2V4cCxzfX06IE5ldyBmaWxlcy4KLQotV2VkIEF1ZyAgNiAwMDozMzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IEFTIGFuZCBHQVNQIHRvIGFzLW5ldywgbm90IGFzLm5ldy4KLQotVHVlIEF1ZyAgNSAxMjozMzoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IE5NIHRvIG5tLW5ldywgbm90IG5tLm5ldywgdG8gbWF0Y2gKLQlyZWNlbnQgY2hhbmdlIGluIGJpbnV0aWxzIGJ1aWxkIGRpcmVjdG9yeS4KLQotVGh1IEp1bCAzMSAxNToyMTo1MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL3JhbmdlLnM6IE5ldyB0ZXN0LgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gaXQuCi0KLVR1ZSBKdWwgMjkgMTQ6MzU6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9oaWxvMi5zOiBOZXcgdGVzdC4KLQkqIGdhcy92ODUwL2ZlcHN3LnM6IE5ldyB0ZXN0LgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotVHVlIEp1bCAxNSAxMzowMzoxNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci91cHBlcmNhc2UuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvbTMyci5leHA6IE5ldyBmaWxlLgotCi1Nb24gSnVuIDE2IDE0OjMyOjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvcGNyZWwuZDogVXBkYXRlIGZvciBtNjhrIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL202OGsvb3BlcmFuZHMuZDogTGlrZXdpc2UuCi0KLU1vbiBKdW4gIDIgMTY6NTA6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9hcm0uZXhwOiBBZGRlZCBjaGFuZ2VzIGZyb20gYXJtVC05NzAzMjgtYnJhbmNoLgotCi1Nb24gSnVuICAyIDEyOjA5OjAyIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogVGhlIHIzOTAwIGhhcyBpbnRlcmxvY2tzIGZvciBtdWwsIGJ1dAotCW5vdCBkaXYuCi0KLU1vbiBKdW4gIDIgMTI6MDM6MzIgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQC5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9tdWwue2Qsc306IEVuZCB0aGUgdGVzdHMgd2l0aCBuby1vcHMuIAotCi1Nb24gSnVuICAyIDExOjQ4OjU4IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IEltcHJvdmUgbWVzc2FnZXMgd2hlbiBvbmUKLQlmaWxlIGlzIHNob3J0ZXIgdGhhbiB0aGUgb3RoZXIuCi0KLVdlZCBNYXkgIDcgMTY6MTg6MzAgMTk5NyAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBnYXMvbTg4ay9pbml0LntzLGR9OiBOZXcgY2hlY2tzIGZvciBwcm9wZXIgcGFkZGluZyBvZgotCS5pbml0IHNlY3Rpb25zLgotCSogZ2FzL204OGsvbTg4LmV4cDogUnVuIHRoZW0uCi0KLQkqIGdhcy9tNjhrL3QyLmQ6IE5ldyBmaWxlIGZvciBjaGVjayBvZiBwcmVzZW5jZSBvZiBzZWN0aW9uCi0Jc3ltYm9scyBvbiB0aGUgbTY4ay1tb3Rvcm9sYS1zeXN2LgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIHQyIGlmIFtpc3RhcmdldCBtNjgqLW1vdG9yb2xhLXN5c3ZdLgotCi1XZWQgTWF5ICA3IDE2OjEyOjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBEb24ndCBydW4gY29mZnRhZyB0ZXN0IGZvciBtODhrLWNvZmYuCi0KLQkqIGdhcy9taXBzL2xpZmxvYXQuczogVXBkYXRlIGZvciByZWNlbnQgY2hhbmdlcyB0byBmbG9hdGluZyBwb2ludAotCWhhbmRsaW5nLgotCSogZ2FzL21pcHMvbGlmLWVtcGljLmQsIGdhcy9taXBzL2xpZi1zdnI0cGljLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvbGlmLXhnb3QuZCwgZ2FzL21pcHMvbGlmbG9hdC5kOiBMaWtld2lzZS4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEhhbmRsZSBJcml4IDYgbGlrZSBJcml4IDUuCi0KLVNhdCBBcHIgMTkgMjM6MTY6MzUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BwZXRyYS5hcHBsaS5zZT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEhhbmRsZSBPcGVuQlNEIGxpa2UgTmV0QlNELgotCi1XZWQgQXByIDE2IDEyOjIwOjI0IDE5OTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9kMzAuZXhwOiBBZGQgb3B0aW1pemVyIHRlc3QgY2FzZS4KLQkqIGdhcy9kMzB2L29wdC5zOiBBZGQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdGVzdHMuCi0JKiBnYXMvZDMwdi9vcHQuZDogUmVidWlsZC4KLQotVHVlIEFwciAxNSAxODoxMDowMSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMve2RlbGF5LmQsbm9kZWxheS5kfTogYWRkZWQuCi0KLU1vbiBBcHIgIDcgMTI6NTc6NDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBVcGRhdGUgdG8gbmV3IG9iamR1bXAgb3V0cHV0IHN0eWxlLgotCi1GcmkgQXByICA0IDEzOjE5OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9mbG9hdC5zOiBQdXQgYSB0YWIgYmVmb3JlIC50ZXh0LCB0byBrZWVwIHRoZSBQQSBoYXBweS4KLQotCSogZ2FzL2FybS9hcm0uZXhwOiBPbmx5IHJ1biBpbnN0IGFuZCBhcm03dCBvbiB0YXJnZXRzIHdoaWNoIGNhbgotCWhhbmRsZSAtRUwuICBBZGQgc2V0dXBfeGZhaWwgZm9yIHRodW1iLgotCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZDogRG9uJ3QgZmFpbCBpZiBCRkQgaXMgNjQgYml0cy4KLQotVGh1IEFwciAgMyAxODoyNjo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLntleHAscy5kfTogTmV3IHRlc3RjYXNlcy4KLQotVGh1IE1hciAyNyAwMDo0MjoyOCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvZDMwLmV4cDogQWRkIHRlc3QgY2FzZSByZWxvYy4KLQkqIGdhcy9kMzB2L3JlbG9jLltzZF06IE5ldyBmaWxlcyB0byB0ZXN0IHJlbG9jYXRpb25zLgotCi1TYXQgTWFyIDE1IDE3OjIxOjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvYXJtL2FybTd0LmQ6IExpa2V3aXNlLgotCi1UdWUgTWFyIDExIDEzOjMxOjU2IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBnYXMvbTY4ay9vcDY4MDAwLmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGFzc2VtYmxlciBidWcgZml4LgotCi1XZWQgTWFyICA1IDEzOjAxOjI0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiB4ZmFpbCBhIGNvdXBsZSB0ZXN0cyBmb3IgdGhlIG1uMTAzMDAuCi0KLU1vbiBNYXIgIDMgMTE6NDE6MDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWRkLmQsIGZsb2F0LmQsIHJlZ29wczIuZCwgcmVsb2NzMS5kLCByZWxvY3MxYi5kLAotCXJlbG9jczIuZCwgcmVsb2NzMmIuZH06IEFkanVzdCB0byBvYmpkdW1wIGZvcm1hdCB0d2Vha3MuCi0KLVRodSBGZWIgMjcgMTU6MjE6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWxpZ24uZCwgYWxpZ24ubHN0LCBhbGlnbi5zfSBOZXcgdGVzdCBmb3IgdGhlCi0JIi5hbGlnbiIgcHNldWRvcC4KLQkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgYWxpZ24gdGVzdC4KLQkKLVdlZCBGZWIgMjYgMjA6MzY6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97ZmxvYXQuZCwgZmxvYXQubHN0LCBmbG9hdC5zfTogTmV3IHRlc3RzIGZvcgotCXNpbXBsZSBmbG9hdGluZyBwb2ludCBvcGVyYW5kcy4KLQkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgZmxvYXQgdGVzdC4KLQotV2VkIEZlYiAyNiAxNToxNjowNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3tyZWdvcHMyLmQsIHJlZ29wczIubHN0LCByZWdvcHMyLnMsIHJlZ29wczMuZCwKLSAJcmVnb3BzMy5sc3QsIHJlZ29wczMucywgcmVnb3BzNC5kLCByZWdvcHM0LmxzdCwgcmVnb3BzNC5zfToKLQlOZXcgdGVzdHMgZm9yIDptIGFuZCA6cyBvcGVyYW5kIG1vZGlmaWVycy4KLQkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgcmVnb3BzMiwgcmVnb3BzMywgYW5kIHJlZ29wczQgdGVzdHMuCi0KLVR1ZSBGZWIgMjUgMTM6NDU6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWFjcm9zL3NlbWkuczogRm9yY2UgdGhlIGZpbmFsIGFsaWdubWVudCB0byB1c2UgYSBmaWxsIHZhbHVlCi0Jb2YgMC4KLQotCSogZ2FzL2FsbC9jb25kLnMsIGdhcy9hbGwvY29uZC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9hbGwvZ2FzLmV4cDogUnVuIGl0LgotCi1Nb24gRmViIDI0IDEwOjUyOjEyIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwKGdhc19pbml0KTogQWRkZWQgbmV3IHBhcmFtZXRlciBmb3Igc2NyaXB0Ci0JbmFtZS4KLQotTW9uIEZlYiAyNCAxMDo0MDoyOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3thZGQuZCwgYml0bnVtLmQsIGNjb2RlLmQsIGNyZWdvcHMuZCwgZW5kbWFzay5kLAotCXJlZ29wcy5kLCByZWxvY3MxLmQsIAotCShyZWxvY3MxLmMpOiBBZGQgZmlsZSBmb3IgcmVmZXJlbmNlLgotCShyZWxvY3MxYi5kKTogU3BsaXQgcmVsb2MgdGFibGUgY29udGVudHMgdGVzdCB0byBkaWZmZXJlbnQgdGVzdCBmaWxlLgotCShyZWxvY3MyLmMpOiBBZGQgdGVzdCB0aGF0IHVzZXMgdmFyaW91cyB0eXBlcyAoY2hhciwgc2hvcnQsIGludCwgLi4uKSBvZgotCXN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyB3aXRoIGRhdGEgc2h1ZmZsaW5nIHRvIGdlbmVyYXRlIGxvdHMgb2YgbGQvc3QKLQlpbnN0cnVjdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMuCi0JKHJlbG9jczIuZCk6IE5ldyBmaWxlLCBleHBlY3RlZCBjb2RlIGZvciByZWxvY3MyIHRlc3QuCi0JKHJlbG9jczIubHN0KTogTmV3IGZpbGUsIFRJIGFzc2VtYmxlciBsaXN0aW5nIGZvciByZWZlcmVuY2UuCi0JKHJlbG9jczIucyk6IE5ldyBmaWxlLCBhc3NlbWJseSBzb3VyY2UgZm9yIHJlbG9jczIgdGVzdC4KLQkocmVsb2NzMmIuZCk6IE5ldyBmaWxlLCBleHBlY3RlZCByZWxvYyB0YWJsZSBjb250ZW50cyBmb3IgcmVsb2NzMiB0ZXN0LgotCSh0aWM4MC5leHApOiBSdW4gdGhlIHJlbG9jczFiLCByZWxvY3MyLCBhbmQgcmVsb2NzMmIgdGVzdHMuCi0KLVN1biBGZWIgMjMgMTc6NTQ6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2l0YmwtdGVzdC5jKG1haW4pOiBVcGRhdGUgZnVuY3Rpb24gY2FsbHMuCi0JUmVtb3ZlIHBhcmFtZXRlcnMgZnJvbSBpdGJsX2dldF9yZWdfdmFsIGFuZAotCWNoYW5nZSBpdGJsX2dldF9pbnNuX25hbWUgdG8gaXRibF9nZXRfZmllbGQuCi0KLVN1biBGZWIgMjMgMTc6MjI6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9pdGJsOiBBZGQgY29tbWVudHMuCi0JKiBnYXMvbWlwcy9pdGJsLnM6IEFkZCBjb21tZW50cy4gIFByZWZpeCByZWdpc3RlciBuYW1lcyB3aXRoICQuCi0JKiBnYXMvYWxsL2l0Ymw6IEdlbmVyaWMgdGFibGUgZm9yIHRlc3RpbmcgZm9yIGl0Ymwgc3VwcG9ydC4KLQkqIGdhcy9hbGwvaXRibC5zOiBHZW5lcmljIGFzc2VtYmx5IGZvciB0ZXN0aW5nIGZvciBpdGJsIHN1cHBvcnQuCi0JKiBnYXMvbWlwcy9pdGJsLXRlc3QuYzogTW92ZWQgdG8gZ2FzL2FsbC4KLQkqIGdhcy9hbGwvaXRibC10ZXN0LmM6IE1vdmVkIGZyb20gZ2FzL21pcHMuCi0KLVNhdCBGZWIgMjIgMjA6MjQ6MjMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWRkLmxzdCwgYml0bnVtLmxzdCwgY2NvZGUubHN0LCBjcmVnb3BzLmxzdCwKLSAJZW5kbWFzay5sc3QsIHJlZ29wcy5sc3R9OiBSZW1vdmUgXk0ncyBmcm9tIGVuZCBvZiBsaW5lcy4KLQkqIGdhcy90aWM4MC9iaXRudW0uczogQWRkIGNvbW1lbnQgdG8gZWFjaCBsaW5lIHNob3dpbmcgdmFsdWUKLQl0aGF0IHN5bWJvbGljIEJJVE5VTSBhc3NlbWJsZXMgdG8uICBBZGQgY292ZXJhZ2UgZm9yIHJhdwotCW51bWVyaWMgdmFsdWVzIGZvciB0aGUgQklUTlVNIG9wZXJhbmQuCi0JKiBnYXMvdGljODAvYml0bnVtLmQ6IFVwZGF0ZSBkdWUgdG8gYml0bnVtLnMgY2hhbmdlcy4KLQkqIGdhcy90aWM4MC9yZWdvcHMuZDogVXBkYXRlIGR1ZSB0byBvcGNvZGUgbGlicmFyeSBhZGRpdGlvbnMKLQlvZiBmbG9hdGluZyBwb2ludCB0ZXN0IEJJVE5VTSB2YWx1ZXMgdGhhdCBhcmUgYW1iaWd1b3VzIHdpdGgKLQl0aGUgaW50ZWdyYWwgb25lcy4KLQkqIGdhcy90aWM4MC9yZWxvY3MxLnM6IE5ldyB0ZXN0IGNhc2UgdGhhdCB0ZXN0cyBzaW1wbGUgcmVsb2NzLgotCSogZ2FzL3RpYzgwL3JlbG9jczEuZDogRXhwZWN0ZWQgb3V0cHV0IGZvciBhYm92ZS4KLQkqIGdhcy90aWM4MC9yZWxvY3MxLmxzdDogVEkgYXNzZW1ibGVyIGxpc3RpbmcgZm9yIGFib3ZlLgotCSogZ2FzL3RpYzgwL3RpYzgwLmV4cDogQWRkIHJlbG9jczEgdGVzdC4KLQotRnJpIEZlYiAyMSAxNDoyMzoxNCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYve2FsaWduLmQsIGFsaWduLnMsIGQzMC5leHAsIGd1YXJkLmQsIGd1YXJkLnMsCi0JaW5zdC5kLCBpbnN0LnMsIG9wdC5kLCBvcHQuc306IFRlc3QgZmlsZXMgZm9yIEQzMFYuCi0KLVdlZCBGZWIgMTkgMDA6NTU6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWFjcm9zL3NlbWkucywgZ2FzL21hY3Jvcy9zZW1pLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21hY3Jvcy9tYWNyb3MuZXhwOiBSdW4gaXQuCi0JKiBnYXMvbXJpL3NlbWkucywgZ2FzL21yaS9zZW1pLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0KLVR1ZSBGZWIgMTggMTM6Mzc6MDYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKGFsaWduNCB0ZXN0cyk6IFR3ZWFrIGV4cGVjdGVkCi0Jb3V0cHV0LgotCQotRnJpIEZlYiAxNCAxNzo1NjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvYWxpZ24uZCwgZ2FzL2FsbC9hbGlnbi5zOiBOZXcgdGVzdC4KLQkqIGdhcy9hbGwvZ2FzLmV4cDogUnVuIGl0LgotCi1UaHUgRmViIDEzIDE0OjQ0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IENvcnJlY3QgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi0KLVdlZCBGZWIgMTIgMTI6MzM6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9saWYtc3ZyNHBpYy5kOiBQYXNzIC1FQiB3aGVuIHJ1bm5pbmcgdGhlIGFzc2VtYmxlci4KLQkqIGdhcy9taXBzL2xpZi14Z290LmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdWxoLXN2cjRwaWMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91bGgteGdvdC5kOiBMaWtld2lzZS4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IFVwZGF0ZSBmb3IgeWV0IGFub3RoZXIgY2hhbmdlIGluIGRpc2Fzc2VtYmx5Ci0Jb3V0cHV0ICh0aGlzIG9uZSBpcyBzcGFjaW5nIG9ubHkpLgotCi1UdWUgRmViIDExIDE0OjQ1OjM5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FkZC5kLCBhZGQubHN0LCBhZGQucywgYml0bnVtLmQsIGJpdG51bS5sc3QsIGJpdG51bS5zLAotIAljY29kZS5kLCBjY29kZS5sc3QsIGNjb2RlLnMsIGNyZWdvcHMuZCwgY3JlZ29wcy5sc3QsIGNyZWdvcHMucywKLQllbmRtYXNrLmQsIGVuZG1hc2subHN0LCBlbmRtYXNrLnMsIHJlZ29wcy5kLCByZWdvcHMubHN0LCByZWdvcHMucywKLQl0aWM4MC5leHB9OiBOZXcgZmlsZXMgZm9yIFRJYzgwIHRlc3QgY2FzZXMuCi0KLVR1ZSBGZWIgMTEgMTU6NDY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzMTYuZDogVXBkYXRlIGZvciBjaGFuZ2UgaW4gZGlzYXNzZW1ibHkgb3V0cHV0LgotCi1Nb24gRmViIDEwIDIyOjI0OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGdhcy9taXBzL2l0YmwtdGVzdC5jOiBBZGQgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIGZpeCBpbmRlbnRhdGlvbi4gICAKLQotTW9uIEZlYiAxMCAxNzo1NDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2l0YmwtdGVzdC5jOiBOZXcgZmlsZS4gIFN0YW5kLWFsb25lIGFzc2VtYmxlciBhbmQgCi0JZGlzc2Fzc2VtYmxlciBmb3IgaXRibCBzdXBwb3J0LgotCi1Nb24gRmViIDEwIDE3OjIwOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvaXRibDogTmV3IGZpbGUuICBJbnN0cnVjdGlvbiBTcGVjIGZvciB0ZXN0aW5nIC0taXRibAotCW9wdGlvbi4KLQkqIGdhcy9taXBzL2l0YmwuczogTmV3IGZpbGUuICBBc3NlbWJseSB3aXRoIG5lMncgaW5zdHJ1Y3Rpb25zCi0Jc3BlY2lmaWVkIGluIGl0YmwuCi0KLUZyaSBGZWIgIDcgMTY6NDI6NTMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGdhc3AvZ2FzcC5leHA6IFVzZSBwcnVuZV93YXJuaW5ncyBpbnN0ZWFkIG9mIHBydW5lX3N5c3RlbV9jcnVkLgotCSogbGliL2dhcy1kZWZzLmV4cDogRGl0dG8uCi0KLU1vbiBGZWIgIDMgMTU6NDY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2luc3QuZCwgZ2FzL2FybS9hcm03dC5kOiBQYXNzIC0tcHJlZml4LWFkZHJlc3NlcyB0bwotCW9iamR1bXAuICBVcGRhdGUgZm9yIGN1cnJlbnQgcmVsb2NhdGlvbiBwcmludGluZyBzdHlsZS4KLQotVGh1IEphbiAzMCAxMTo1NzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMxNi5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi1UaHUgSmFuIDIzIDAzOjE1OjA2IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogc2V0IGlsb2NrcyBmb3IgYWxsIDQxMDAvNDMwMAotCi1UaHUgSmFuICAyIDE2OjQ5OjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LnMsIGdhcy9taXBzL21pcHMxNi5kOiBOZXcgdGVzdC4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gbWlwczE2IHRlc3QuCi0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gZGxpIHRlc3QgdW5jb25kaXRpb25hbGx5LgotCSogZ2FzL21pcHMvZGxpLnM6IEFkZCB0ZXh0IHN5bWJvbC4gIEFkZCBub3BzIHRvIHJvdW5kIHRvIDE2IGJ5dGUKLQlib3VuZGFyeS4KLQkqIGdhcy9taXBzL2RsaS5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBEZWMgMzEgMTM6MDM6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3ludGguZDogVXNlIC0tcHJlZml4LWFkZHJlc3NlcyBmb3Igb2JqZHVtcC4KLQkqIGdhcy9zcGFyYy9zeW50aDY0LmQ6IExpa2V3aXNlLgotCi1UdWUgRGVjIDI0IDE2OjMwOjU4IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy8qLWlsb2Nrcy5kOiBGaXggcmVnZXhwcyB0byByZXNlbWJsZSBkaXNhc3NlbWJsZWQgb3V0cHV0LgotCi1GcmkgRGVjIDEzIDEzOjA1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvKi5bc2RdOiBBZGQgZXhwbGljaXQgbm9wcywgc29tZXRpbWVzIGNvbnRyb2xsZWQgYnkKLQkuaWZkZWYsIHRvIGFjY29tb2RhdGUgY2hhbmdlIHRvIGF2b2lkIGRlZmF1bHQgYWxpZ25tZW50IG9uCi0JZW1iZWRkZWQgc3lzdGVtcy4KLQotV2VkIERlYyAxMSAwOToyNjowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMjAwL2Jhc2ljLmV4cCAoZG9fbW92Yik6IEZpeCBiaXQgcGF0dGVybiBmb3IKLQkibW92YiBkbSwoYW4pIi4KLQotVHVlIERlYyAxMCAxMzowMTowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVXBkYXRlIGFmdGVyIGVuZGlhbm5lc3MgY2hhbmdlcyB0bwotCXRoZSBhc3NlbWJsZXIuCi0KLQkqIGdhcy9tbjEwMjAwL3ttb3YxLnMsbW92Mi5zLG1vdjMucyxtb3Y0LnMsbW92eC5zfTogTmV3IHRlc3RzLgotCSogZ2FzL21uMTAyMDAve21vdmIucywgbW92YnUuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAyMDAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotTW9uIERlYyAgOSAxNzowODozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMjAwLyouczogTmV3IHRlc3RzIGZvciB0aGUgbW4xMDIwMCBhc3NlbWJsZXIuCi0JKiBnYXMvbW4xMDIwMC9iYXNpYy5leHA6IFJ1biB0aGVtLgotCi1GcmkgRGVjICA2IDE1OjM1OjA0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvKi5zOiBSZW1vdmUgJyQnIHJlZ2lzdGVyIHByZWZpeGluZy4KLQotTW9uIE5vdiAyNSAxNjozNTozMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwOiBGaXggcGF0dGVybnMsIHlvdSBjYW4ndCBhc3N1bWUKLQlcciB3aWxsIGJlIHByZXNlbnQuCi0KLU1vbiBOb3YgMjUgMTM6NDU6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay8qLmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvbXJpLyouZDogTGlrZXdpc2UuCi0KLU1vbiBOb3YgMjUgMTE6Mzg6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC8qLnM6IFVzZSAnJCcgYXMgcmVnaXN0ZXIgcHJlZml4IGZvcgotCWFsbCByZWdpc3RlciBvcGVyYW5kcy4KLQotVGh1IE5vdiAyMSAxMTo1Mjo1NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogeGZhaWwgYSBjb3VwbGUgdGVzdHMgZm9yIHRoZSBtbjEwMzAwLgotCi1XZWQgTm92IDIwIDExOjMxOjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvb3RoZXIuczogVXBkYXRlIGZvciBjb3JyZWN0IHN5bnRheCBvbiBhCi0JZmV3IGluc3RydWN0aW9ucyAodGhvc2Ugd2l0aCByZWdpc3RlciBsaXN0cykuCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIE5vdiAxOSAxMzozNjo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL21vdm0uczogVXBkYXRlIGZvciBjb3JyZWN0IHN5bnRheC4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVXBkYXRlIGV4cGVjdGVkIG1vdm0gYml0IHBhdHRlcm5zLgotCi1GcmkgTm92IDE1IDEzOjU3OjQyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvb3RoZXIuczogUHV0IHBhcmVucyBhcm91bmQgcmVnaXN0ZXIKLQlhcmd1bWVudCBpbiBjYWxscyBhbmQgam1wIGluc3RydWN0aW9ucy4KLQotV2VkIE5vdiAxMyAxMzoxNjowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9mZnh4MS5kOiBVcGRhdGUgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotTW9uIE5vdiAxMSAxNjowMzoyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUGFzcyAiLS1wcmVmaXgtYWRkcmVzc2VzIiB0byBvYmpkdW1wCi0JYXMgbmVlZGVkLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBMaWtld2lzZS4KLQotVGh1IE5vdiAgNyAwMDoyNzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgb3Bjb2RlIGluc2VydGlvbiBmb3IKLQlleHRlbmRlZCBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvbW4xMDMwMC9leHRlbmQuczogVHdlYWsgY29uc3RhbnRzIGZvciBiZXR0ZXIKLQl0ZXN0c3VpdGUgY292ZXJhZ2UuCi0KLVdlZCBOb3YgIDYgMTM6NTA6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFRlc3QgaW5zZXJ0aW9uIG9mIG9wZXJhbmRzCi0JaW50byBjYWxsIGFuZCBqbXAgaW5zdHJ1Y3Rpb25zIHdpdGggMzJiaXQgb2Zmc2V0cy4KLQlGaXggdHlwbyBpbiBiaXQgdGVzdCBwYXR0ZXJucy4KLQkqIGdhcy9tbjEwMzAwL290aGVyLnM6IFR3ZWFrIGNvbnN0YW50cyB0byBpbXByb3ZlCi0JdGVzdHN1aXRlIGNvdmVyYWdlLgotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFRlc3QgaW5zZXJ0aW9uIG9mIDMyYml0IG9wZXJhbmQKLQlpbiBjYWxscywgYnRzdCwgYmNsciAmIGJzZXQgaW5zdHJ1Y3Rpb25zLgotCi0JKiBnYXMvbW4xMDMwMC8qLnM6IFR3ZWFrIGNvbnN0YW50cyBpbiAzMmJpdCBpbnNucyBmb3IKLQliZXR0ZXIgdGVzdGluZyBjb3ZlcmFnZS4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVGVzdCBpbnNlcnRpb24gb2YgbW9zdCAzMmJpdAotCW9wZXJhbmRzLgotCi1UdWUgTm92ICA1IDEzOjMzOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIGluZGV4ZWQgbW92LAotCW1vdmJ1LCBtb3ZodSBpbnN0cnVjdGlvbnMuICBDaGVjayBiaXQgcGF0dGVybnMgZm9yIG1vcmUgYml0Ci0Jb3BlcmF0aW9ucy4gIENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgdmFyaW91cyAxNmJpdCBjYWxsLCByZXRmCi0JYW5kIHJldCBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvbW4xMDMwMC9vdGhlci5zOiBVcGRhdGUgb3BlcmFuZHMgZm9yIGJldHRlciB0ZXN0IGNvdmVyYWdlLgotCi1Nb24gTm92ICA0IDEyOjU1OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIGEgY291cGxlIG1vcmUKLQltb3YgYW5kIGNtcCBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBPY3QgMjkgMTc6MDU6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy8qLmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLVdlZCBPY3QgMTYgMjI6Mzk6NTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9yZWxvYy5zOiBOZXcgdGVzdHMuCi0JKiBnYXMvdjg1MC9iYXNpYy5leHA6IFJ1biB0aGVtLgotCi1Nb24gT2N0IDE0IDEzOjUyOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHM6IEFkZCBzeW1ib2xzIHRvIHNldmVyYWwgdGVzdHN1aXRlcywgc2luY2UgdGhlIEVMRgotCWFzc2VtYmxlciBub3cgYWx3YXlzIGJ1aWxkcyBhIHN5bWJvbCB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdAotCW9iamR1bXAgd2lsbCBubyBsb25nZXIgcmVwb3J0IGBObyBzeW1ib2xzIGluIEZJTEUnLiAgQ2hhbmdlIHRoZQotCWV4cGVjdGVkIG91dHB1dCBhY2NvcmRpbmdseS4KLQotVGh1IE9jdCAxMCAxMzoxMTo0OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBpbnN0cnVjdGlvbnMKLQl3aXRoIGEgc2luZ2xlIDhiaXQgb3IgMTZiaXQgaW1tZWRpYXRlIG9wZXJhbmQuCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBtYW55Ci0JaW5zdHJ1Y3Rpb25zLiAgQWRkIG1pc3NpbmcgdGVzdCBpbiBkb19tb3YxLgotCSogZ2FzL21uMTAzMDAvbW92MS5zOiBBZGQgbWlzc2luZyB0ZXN0LgotCi1XZWQgT2N0ICA5IDE0OjE1OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAve2FkZC5zLCBiY2MucywgYml0LnMsIGNtcC5zLCBleHQuc306IE5ldyB0ZXN0cy4KLQkqIGdhcy9tbjEwMzAwL3tleHRlbmQucyBsb2dpY2FsLnMsIGxvb3AucywgbW92MS5zfTogTGlrZXdpc2UuCi0JKiBnYXMvbW4xMDMwMC97bW92Mi5zLCBtb3YzLnMsIG1vdjQucywgbW92YnUuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAve21vdmh1LnMsIG1vdm0ucywgbXVsZGl2LnMsIG90aGVyLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL3tzaGlmdC5zLCBzdWIuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotVGh1IE9jdCAgMyAwOTo1NzowMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMjAwLCBnYXMvbW4xMDMwMDogTmV3IGRpcmVjdG9yaWVzIGZvciBNYXRzdXNoaXRhCi0JbW4xMDIwMCBhbmQgbW4xMDMwMCB0ZXN0cy4KLQotVHVlIE9jdCAgMSAxNTozODoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc192ZXJzaW9uKTogRml4IGZvciBjdXJyZW50IHZlcnNpb24KLQlwcmludGluZy4KLQotU3VuIFNlcCAyOSAwNzo1NTo1OCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BsZXQuZDogRml4IHR5cG8gaW4gY3B1c2hhIHJlc3VsdC4KLQotTW9uIFNlcCAyMyAxMjozMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2Ztb3ZlbWwucywgZ2FzL202OGsvZm1vdmVtbC5kOiBBZGQgdGVzdHMgZm9yIGZtb3ZlbXguCi0KLVdlZCBTZXAgMTggMTI6MTQ6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2NvZmZ0YWcuczogVXNlIC5wMmFsaWduIHJhdGhlciB0aGFuIC5hbGlnbi4KLQotRnJpIFNlcCAxMyAxNToyODowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9tYWNzLnM6IEFkZCAic3RtYWMiIGluc3RydWN0aW9ucy4KLQkqIGdhcy9oODMwMC9iYXNpYy5leHA6IFRlc3QgdGhlbS4KLQotVGh1IFNlcCAxMiAxMDoyODo0NCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vdGh1bWIucyAoYmFjayk6IENoZWNrIGFzc2VtYmx5IG9mIFRodW1iIEJMLgotCi1Nb24gU2VwICA5IDE0OjM3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczQucywgZ2FzL21pcHMvbWlwczQuZDogVXNlICRmY2NOIGZvciBjb25kaXRpb24gY29kZQotCXJlZ2lzdGVycy4KLQotRnJpIFNlcCAgNiAxODoyMzo1NCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9taXBzL2RsaS57cyxkfTogTW9yZSB0ZXN0IGNhc2VzIGFkZGVkLgotCi1XZWQgU2VwICA0IDExOjQ3OjI5IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZCBjaGVjayBmb3IgZGxpIG1hY3JvIGluc3RydWN0aW9uLgotCSogZ2FzL21pcHMvZGxpLntzLGR9OiBBZGRlZC4KLQotU2F0IEF1ZyAzMSAwMToyNTowMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWVtKTogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBzaG9ydAotCWxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLiAgUmVtb3ZlIHhmYWlscyBmb3Igc2hvcnQgbG9hZC9zdG9yZQotCWluc3RydWN0aW9ucy4KLQkqIGdhcy92ODUwL21lbS5zOiBPZmZzZXRzIGZvciBzaG9ydCBsb2FkL3N0b3JlIG9wZXJhbmRzCi0JYXJlIHVuc2lnbmVkLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2JyYW5jaCk6IENoZWNrIG9mZnNldHMgaW4gYnJhbmNoIGluc25zLgotCShkb19qdW1wcyk6IExpa2V3aXNlLgotCQotRnJpIEF1ZyAzMCAwMDozNzo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL21pc2MuczogVHdlYWsgcmVnaXN0ZXIgbnVtYmVycyBmb3IgYmV0dGVyIHRlc3RpbmcuCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21pc2MpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLQkqIGdhcy92ODUwL2hpbG8uczogTmV3IHRlc3RmaWxlLgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gaGlsbyB0ZXN0cy4KLQotVGh1IEF1ZyAyOSAxMTozMjoyMyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZDogRXhwbGljaXRseSBmb3JjZSBsaXR0bGUtZW5kaWFuIGFzc2VtYmx5LgotCi1GcmkgQXVnIDIzIDExOjAyOjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19tb3ZlKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0JKiBnYXMvdjg1MC9tb3ZlLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWVtKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0JeGZhaWwgc3N0IGFuZCBzbGQgdGVzdHMuCi0JKGRvX21vdik6IFJlbW92ZSBib2d1cyB4ZmFpbC4KLQkqIGdhcy92ODUwL21lbS5zOiBzc3QgYW5kIHNsZCBpbnN0cnVjdGlvbnMgY2FuIG9ubHkgaW5kZXggZnJvbQotCSJlcCIgcmVnaXN0ZXIuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbG9naWNhbCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCVVwZGF0ZSBhZGRyZXNzZXMuCi0JKiBnYXMvdjg1MC9sb2dpY2FsLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fanVtcCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLAotCWJ1dCBub3QgZGlzcGxhY2VtZW50cyAoeWV0KS4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19jb21wYXJlKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fYnJhbmNoKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMsCi0JYnV0IG5vdCBkaXNwbGFjZW1lbnRzICh5ZXQpLgotCQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19iaXQpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19hcml0aCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgkKLQkqIGdhcy92ODUwL2FyaXRoLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWlzYyk6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMKLQlhc3NlbWJsaW5nICJsZHNyIiBhbmQgInN0c3IiIG9wY29kZXMuCi0JKiBnYXMvdjg1MC9taXNjLnM6IFJlLWVuYWJsZSBhc3NlbWJsaW5nIG9mICJsZHNyIiBhbmQgInN0c3IiCi0Jb3Bjb2Rlcy4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19taXNjKTogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlcwotCWFzc2VtYmxpbmcgInRyYXAiIG9wY29kZXMuCi0JKiBnYXMvdjg1MC9taXNjLnM6IFJlLWVuYWJsZSBhc3NlbWJsaW5nIG9mICJ0cmFwIiBvcGNvZGVzLgotCi0JKiBnYXMvdjg1MDogTmV3IGRpcmVjdG9yeSB3aXRoIHY4NTAgdGVzdHMuCi0KLUZyaSBBdWcgMTYgMDA6MTk6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9iYXNpYy9wdXJnZS5zOiBVc2UgIiVzcjQiIG9uIHBpdGxiLCBwaXRsYmUKLQlmaWMgYW5kIGZpY2UgaW5zdHJ1Y3Rpb25zIHRvIHRlc3QgM2JpdCBzcGFjZSBpZGVudGlmaWVycy4KLQkqIGdhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zOiBTaW1pbGFybHkgZm9yIGlpdGxiYSBhbmQKLQlpaXRsYnAuCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVGh1IEF1ZyAxNSAxNjoyNTowNSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vYXJtLmV4cDogQ2hhbmdlIGluc3QucyB0ZXN0IHRvIGNoZWNrIG9iamR1bXAuCi0JKiBnYXMvYXJtL2luc3QuZDogQWRkZWQuCi0JCi1UaHUgQXVnIDE1IDE2OjA2OjAyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL2FybS90aHVtYi5zOiBBZGRlZC4KLQkqIGdhcy9hcm0vaW1tZWQuczogQWRkZWQuCi0JKiBnYXMvYXJtL2FyY2g0dC5zOiBBZGRlZC4KLQkqIGdhcy9hcm0vYXJtLmV4cDogVXBkYXRlZCB0byBydW4gdGhlIG5ldyB0ZXN0cy4KLQotVHVlIEF1ZyAgNiAxMTowNjoyOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9taXNjaC5zOiBSZWVuYWJsZSAiZWVwbW92LnciIHRlc3QuCi0JKiBnYXMvaDgzMDAvbWlzY3MuczogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBDaGVjayBmb3IgY29ycmVjdCBhc3NlbWJseSBvZiAiZWVwbW92LnciCi0Jb24gdGhlIEg4LzMwMEggYW5kIEg4L1MuICBEb24ndCBleHBlY3QgaXQgdG8gZmFpbC4KLQotV2VkIEp1bCAzMSAxMDo1Nzo0NCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvYXNpLnM6IFVwZGF0ZSBBU0lfQVNfSUZfVVNFUl97UFJJTUFSWSxTRUNPTkRBUll9X0xJVFRMRS4KLQotV2VkIEp1bCAzMSAxNTo1NToxMiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuczogQWRkZWQuCi0JKiBnYXMvYXJtL2FybTd0LmQ6IEFkZGVkLgotCSogZ2FzL2FybS9hcm0uZXhwOiBVcGRhdGVkIHRvIHJ1biB0aGUgbmV3IHRlc3QuCi0KLU1vbiBKdWwgIDggMTQ6Mjc6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9wY3JlbC5kOiBSZW5hbWUgZnJvbSBzY2h3YWIuZC4KLQkqIGdhcy9tNjhrL3BjcmVsLnM6IFJlbmFtZSBmcm9tIHNjaHdhYi5zLgotCi1Nb24gSnVsICA4IDE0OjIzOjI2IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBnYXMvbTY4ay9zY2h3YWIuZDogQ29ycmVjdCBmb3IgRUxGIGZvcm1hdC4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biAic2Nod2FiIiB0ZXN0IGZvciBhbGwgdGFyZ2V0cy4KLQotVGh1IEp1bCAgNCAxNDoyMzozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBdm9pZCBET1MgZmlsZSBuYW1pbmcgcHJvYmxlbXM6Ci0JKiBnYXMvaDgzMDAvYnJhbmNoLnM6IFJlbmFtZSBmcm9tIGJyYW5jaGVzLnMuCi0JKiBnYXMvaDgzMDAvYnJhbmNoaC5zOiBSZW5hbWUgZnJvbSBicmFuY2hlc2gucy4KLQkqIGdhcy9oODMwMC9icmFuY2hzLnM6IFJlbmFtZSBmcm9tIGJyYW5jaGVzcy5zLgotCSogZ2FzL2g4MzAwL3JvdHNoLnM6IFJlbmFtZSBmcm9tIHJvdHNoaWZ0LnMuCi0JKiBnYXMvaDgzMDAvcm90c2hoLnM6IFJlbmFtZSBmcm9tIHJvdHNoaWZ0aC5zLgotCSogZ2FzL2g4MzAwL3JvdHNocy5zOiBSZW5hbWUgZnJvbSByb3RzaGlmdHMucy4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVGh1IEp1bCAgNCAxNDowMTo0NiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGQgbmV3IHRlc3RzIGZvciBwcm9jZXNzb3JzIHdpdGggaW50ZXJsb2NrcwotIAlvbiBkaXYgYW5kIG11bC4KLQkqIGdhcy9taXBzL2Rpdi1pbG9ja3MuZDogQWRkZWQuCi0JKiBnYXMvbWlwcy9tdWwtaWxvY2tzLmQ6IEFkZGVkLgotCQotV2VkIEp1bCAgMyAxNDoyMDowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogUmVtb3ZlIHNldHVwX3hmYWlsIGZvciBoODMwMCotKi0qIGZvciB0d28gdGVzdHMKLQl3aGljaCBub3cgcGFzcy4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IEZpeCByZWdleHAgb2YgbW92MzJidWcgdGVzdCB0byB3b3JrIG9uIGEgNjQKLQliaXQgaG9zdC4KLQotU2F0IEp1biAyOSAxODoyMTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciB2YXgqLSotdm1zKiBmb3IgOTMwNTA5YQotCXRlc3QuCi0JKiBnYXMvdmF4L3F1YWQuZXhwOiBFeHBlY3QgYSBub3AgYWZ0ZXIgdGhlIG1vdnEuCi0KLVR1ZSBKdW4gMTggMTI6Mzk6NDkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9oODMwMC9jYnJhbmNoaC5zOiBTd2l0Y2ggaW50byBoODMwMGggbW9kZS4KLQkqIGdhcy9oODMwMC9oODMwMC5leHAgKEg4LzMwMEggbWlzYyB0ZXN0cyk6IEZpeCB0ZXN0IG5hbWVzLgotCi0JKiBnYXMvaDgzMDAve2FkZHN1YnMucyxiaXRvcHMxcy5zLGJpdG9wczJzLnN9OiBOZXcgdGVzdHMgZm9yIHRoZQotCUg4L1MuCi0JKiBnYXMvaDgzMDAve2JpdG9wczMucyxiaXRvcHM0LnMsY2JyYW5jaHMucyxsb2dpY2Fscy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAve2JyYW5jaGVzcy5zLGNvbXBhcmVzLnMsbWFjcy5zLGRlY2ltYWxzLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9oODMwMC97aW5jZGVjcy5zLGRpdm11bHMucyxtaXNjcy5zLG11bHRpcGxlcy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAve21vdmJzLnMsbW92d3Mucyxtb3Zscy5zLHB1c2hwb3BzLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9oODMwMC97cm90c2hpZnRzLnMsZXh0ZW5kcy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBSdW4gdGhlbS4KLQotTW9uIEp1biAxMCAxNDoxNDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvY29mZnRhZy5zLCBnYXMvYWxsL2NvZmZ0YWcuZDogTmV3IHRlc3QgZm9yIENPRkYgZW51bSB0YWcKLQl3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBnbG9iYWwgdmFyaWFibGUuCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBjb2ZmdGFnIHRlc3QgZm9yIGFueSBDT0ZGIHRhcmdldC4KLQotVGh1IEp1biAgNiAxMjozMDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFBhc3MgLW02ODAyMCB3aGVuIGFzc2VtYmxpbmcgdGhlIGRpc3BlcnIucwotCXRlc3QuCi0KLUZyaSBNYXkgMzEgMTA6MTE6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBGaXggYWRkLmwgdGVzdCBmb3IgSDgvMzAwSC4KLQotV2VkIE1heSAyOSAxNjozNTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2phbC14Z290LmQ6IENvcnJlY3QgZm9yIDY0IGJpdCBvdXRwdXQuCi0KLVRodSBBcHIgMjUgMTk6MzE6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogT25seSBydW4gc3BhcmNsZXQgdGVzdHMgaWYgc3BhcmNsZXQuCi0KLVdlZCBBcHIgMjQgMTc6MDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9vcDY4MDAwLmQ6IEFkZCBzdGF0ZW1lbnRzIG5vdyBjYXVnaHQgYnkgZ2FzLgotCi1Nb24gQXByIDIyIDE2OjQ1OjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGxldC5bZHNdOiBOZXcgdGVzdHMgZm9yIHNwYXJjbGV0IGV4dGVuc2lvbnMuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gdGhlbS4KLQotTW9uIEFwciAxNSAxNzoyNToxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xhLmQ6IFVwZGF0ZWQgZm9yIEFwcmlsIDUgTUlQUyBhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9taXBzL2xiLmQsIGdhcy9taXBzL2xkLmQsIGdhcy9taXBzL3NiLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdWxkLmQsIGdhcy9taXBzL3VsaC5kLCBnYXMvbWlwcy91bHcuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91c2QuZCwgZ2FzL21pcHMvdXNoLmQsIGdhcy9taXBzL3Vzdy5kOiBMaWtld2lzZS4KLQotV2VkIEFwciAxMCAxNDoyNzo1MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9tb3YzMmJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biBpdC4KLQotRnJpIEFwciAgNSAxMDoxMzoyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC97YWRkc3ViaC5zLGJpdG9wczFoLnMsYml0b3BzMmguc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve2JpdG9wczNoLnMsYml0b3BzNGgucyxicmFuY2hlc2guc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve2NicmFuY2hoLnMsY29tcGFyZWgucyxkZWNpbWFsaC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97ZGl2bXVsaC5zLGluY2RlY2gucyxsb2dpY2FsaC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97bWlzY2gucyxtb3ZiaC5zLG1vdndoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL3twdXNocG9waC5zLHJvdHNoaWZ0aC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biB0aGVtLgotCi0JKiBnYXMvaDgzMDAve21vdmIucyxtb3Z3LnN9OiBDb3JyZWN0IHByZWRlY3JlbWVudCBzeW50YXguCi0KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IEZpeCB0eXBvcyBpbiBiaXRvcHM0IGFuZCBtb3ZiIHRlc3RzLgotCi0JKiBnYXMvaDgzMDAve2FkZHN1Yi5zLGJpdG9wczEucyxiaXRvcHMyLnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve2JpdG9wczMucyxiaXRvcHM0LnMsYnJhbmNoZXMuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97Y2JyYW5jaC5zLGNvbXBhcmUucyxkZWNpbWFsLnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve2Rpdm11bC5zLGluY2RlYy5zLGxvZ2ljYWwuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97bWlzYy5zLG1vdmIucyxtb3Z3LnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve3B1c2hwb3Aucyxyb3RzaGlmdC5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogUnVuIHRoZW0uCi0KLUZyaSBNYXIgMTUgMTc6MTY6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3ludGguZDogRG9uJ3QgcmVxdWlyZSBzcGFyYyBpbiB0aGUgZmlsZSBmb3JtYXQsIHNpbmNlCi0JaXQgd29uJ3QgYmUgdGhlcmUgb24gU3VuT1MuCi0KLVRodSBNYXIgIDcgMTQ6NTE6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zeW50aC5bZHNdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gaXQuCi0KLUZyaSBNYXIgIDEgMTI6MDE6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IHhmYWlsIGRpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZCBzeW1ib2xzCi0JYW5kIGRpZmZlcmVuY2Ugb2YgZm9yd2FyZCByZWZlcmVuY2VzIGZvciB0aGUgaDgzMDAuCi0KLVRodSBGZWIgMjIgMTY6NDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sYi14Z290LmQ6IENvcnJlY3QuCi0KLU1vbiBGZWIgMTkgMDI6NDM6MzYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy97YXNpLG1lbWJhcixwcmVmZXRjaCxyZHByLHN5bnRoNjQsd3Jwcn0uZDogUGFzcyAtQXY5Ci0JdG8gZ2FzLgotCSogZ2FzL3NwYXJjL2FkZGVuZC5leHA6IEV4ZWN1dGUgZm9yIGFueSBzcGFyYyBjcHUuCi0JKiBnYXMvc3BhcmMve21pc21hdGNoLmV4cCxtaXNtLTEuc306IE5ldyB0ZXN0LgotCi1XZWQgRmViIDE0IDEzOjQ5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvamFsLXhnb3QuZCwgZ2FzL21pcHMvbGEteGdvdC5kOiBOZXcgdGVzdHMuCi0JKiBnYXMvbWlwcy9sYi14Z290LmQsIGdhcy9taXBzL2xkLXhnb3QuZDogTmV3IHRlc3RzLgotCSogZ2FzL21pcHMvbGlmLXhnb3QuZCwgZ2FzL21pcHMvdWxoLXhnb3QuZDogTmV3IHRlc3RzLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBuZXcgdGVzdHMgaWYgc3ZyNHBpYy4KLQotU2F0IEphbiAyNyAxMzoyNzo0NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZy5leHAgKGdhcy1kZy10ZXN0KTogRGVsZXRlIGRlZmF1bHRfZmxhZ3MgYW5kIGxpYnMgYXJncy4KLQotRnJpIEphbiAyNiAxNDoyNDowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogVXBkYXRlIGZvciBvYmpkdW1wIGNoYW5nZXMuCi0KLVdlZCBKYW4gMTAgMTI6NDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy8qLmQ6IFVwZGF0ZSBmb3IgY2hhbmdlcyB0byBkaXNhc3NlbWJsZXIuCi0KLVdlZCBKYW4gIDMgMjI6NTk6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy91bGgtc3ZyNHBpYy5kOiBVcGRhdGUgZm9yIHRjLW1pcHMuYyBsb2FkX2FkZHJlc3MKLSAJY2hhbmdlLgotCi1GcmkgTm92IDE3IDEwOjMyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9pbW1jb25zdC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgotCSogZ2FzL21yaS9jb25zdGFudHMuczogVGVzdCBpbW1lZGlhdGUgY29uc3RhbnRzLgotCSogZ2FzL21yaS9jb25zdGFudHMuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGdhcy9tNjhrL2xpbmsuczogQWRkIG5vcCB0byBwYWQgdG8gZWlnaHQgYnl0ZSBib3VuZGFyeS4KLQkqIGdhcy9tNjhrL2xpbmsuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVN1biBOb3YgMTIgMjE6Mjg6MTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1TdW4gTm92ICA1IDEyOjQ5OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvYmVxLnM6IERlY2xhcmUgdGV4dF9sYWJlbCBnbG9iYWwuCi0JKiBnYXMvbWlwcy9qYWwuczogTGlrZXdpc2UuCi0KLUZyaSBOb3YgIDMgMTI6MzU6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9saW5rLnM6IFVzZSAiJiIgaW5zdGVhZCBvZiAiIyIgZm9yIGltbWVkaWF0ZSB2YWx1ZXMuCi0KLQkqIGdhcy9tNjhrL2Ztb3ZlbWwucywgZ2FzL202OGsvZm1vdmVtbC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KLQotVGh1IE5vdiAgMiAyMzoxMTowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2xpbmsucywgZ2FzL202OGsvbGluay5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KLQotVHVlIE9jdCAyNCAxMDo1NzoyMCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogVGVzdCBsY2kgYW5kIHN5bmNkbWEgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotRnJpIE9jdCAgNiAxNzoxMzozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvb3BlcmFuZHMuZDogRG9uJ3QgcmVxdWlyZSBhIGZpeGVkIG51bWJlciBvZiBsZWFkaW5nCi0JemVyb3MgaW4gYW55IG51bWJlci4KLQotCSogZ2FzL202OGsvb3BlcmFuZHMucywgZ2FzL202OGsvYml0ZmllbGQuczogVXNlICImIiBpbnN0ZWFkIG9mICIjIgotCWZvciBpbW1lZGlhdGUgdmFsdWVzLgotCi1GcmkgT2N0ICA2IDEwOjU0OjEzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtLmV4cDogUmVuYW1lZCBmcm9tIGdhcy5leHAuCi0JKiBnYXMvYXJtL2xlLWZwY29uc3QuW3NkXTogTmV3IHRlc3RjYXNlLgotCi1GcmkgU2VwIDI5IDE1OjEyOjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBPbmx5IHJ1biB0ZXN0cyBmb3IgbTY4ayB0YXJnZXQuCi0KLU1vbiBTZXAgMjUgMTI6MzE6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgYXJtKi0qLSogZm9yIGNvbnN0YW50cwotCXRlc3QuCi0KLVRodSBTZXAgMjEgMDE6MjY6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9zaC9mcC5zIChmbWFjKTogVXBkYXRlIGZvciBuZXcgYXNzZW1ibHkgc3ludGF4LgotCi1Nb24gU2VwIDE4IDE0OjA0OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX3J1bik6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQuCi0JKHJ1bl9kdW1wX3Rlc3QsIG9iamR1bXApOiBMaWtld2lzZS4KLQotVGh1IFNlcCAxNCAxMzoxMDoxMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMve3dyZHIuW2RzXSxyZHByLltkc119OiBOZXcgdGVzdHMuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gdGhlbS4KLQotV2VkIFNlcCAxMyAxNjozNTo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFJlbW92ZTsgdGhlIHRlc3RzdWl0ZSBpcyBub3cgcnVuCi0JZGlyZWN0bHkgZnJvbSB0aGUgZ2FzIE1ha2VmaWxlLgotCi1Nb24gU2VwIDExIDExOjQ0OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9lbXB0eS5zOiBOZXcgZmlsZS4KLQkqIGdhcy9tcmkvbXJpLmV4cDogVGVzdCBhc3NlbWJsaW5nIGVtcHR5LnMuCi0JKiBnYXMvbXJpL2NvbW1lbnQuczogQWRkIGEgY291cGxlIG1vcmUgY29tbWVudCB2YXJpYW50cy4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgeGZhaWwgZm9yIHRoZSBleHByIHRlc3QgZm9yIGFsbCBocHBhCi0JdGFyZ2V0cy4KLQotV2VkIFNlcCAgNiAyMTozOToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvY29tbWVudC5zLCBnYXMvbXJpL2NvbW1lbnQuZDogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KLQkqIGdhcy9tcmkvZXhwci5zOiBSZW1vdmUgd2hpdGVzcGFjZSBpbiBvcGVyYW5kIGZpZWxkLgotCSogZ2FzL21yaS9mb3IuczogQWRkIGNvbW1lbnRzIGZvciBmdXJ0aGVyIHRlc3RpbmcuCi0JKiBnYXMvbWFjcm9zL3Rlc3QyLnM6IFB1dCBpbiBhbiB1cHBlciBjYXNlIEVMU0UgdG8gdGVzdCBjYXNlCi0JaW5zZW5zaXRpdml0eS4KLQotV2VkIEF1ZyAzMCAxNjoxMjowMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMve3ByZWZldGNoLltkc10sc3ludGg2NC5bZHNdfTogTmV3IHRlc3RzLgotCi1UdWUgQXVnIDI5IDE4OjU5OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IE5ldyBmaWxlLgotCSogZ2FzL3NwYXJjL3thc2kuW2RzXSxtZW1iYXIuW2RzXX06IE5ldyB0ZXN0cy4KLQotTW9uIEF1ZyAyMSAxNDozOToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tYWNyb3MvKjogTmV3IHRlc3RzIGZvciBtYWNyb3MuCi0KLQkqIGdhcy9tcmkvY29tbW9uLnM6IFVzZSBkYXRhLCBub3QgLmRhdGEuCi0KLQkqIGdhc3AvcGwzLm91dDogVXBkYXRlIGZvciBjaGFuZ2VzIGluIGNvbW1lbnRlZCBzb3VyY2Ugb3V0cHV0IHdoZW4KLQlMT0NBTCBpcyB1c2VkLgotCi1TYXQgQXVnIDE5IDE3OjM2OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC9nYXNwLmV4cCAoZ2FzcF90ZXN0KTogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiB0aGUgb3V0cHV0Ci0Jb2YgZGlmZi4KLQkqIGxpYi9nYXMtZGVmcy5leHA6IERlZmluZSBwcnVuZV9zeXN0ZW1fY3J1ZCBpZiBpdCBpcyBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0KLUZyaSBBdWcgMTggMTE6MDk6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwL21yaS8qLm91dDogVXNlIDssIG5vdCAhLCBmb3IgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1XZWQgQXVnIDE2IDEyOjI0OjEyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBDaGFuZ2UgaHBwYSotKi0qIGV4cGVjdGVkIGZhaWx1cmVzIHRvIG9ubHkKLQlleHBlY3QgZmFpbHVyZSBmb3IgdGFyZ2V0cyB3aGljaCB1c2UgU09NLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogSWYgdGhlIHByb2dyYW0gdG8gcnVuIGRvZXMgbm90Ci0gICAgICAgIGV4aXN0LCBtYXJrIHRoZSB0ZXN0IGFzIHVudGVzdGVkLgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgaTk2MCBiLm91dCB0YXJnZXRzIGZvcgotCWNvbW1vbiB0ZXN0LgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogTmFtZSB0aGUgb3V0cHV0IGZpbGUgZHVtcC5vLAotCXJhdGhlciB0aGFuIHVzaW5nIGFuIGltcGxpY2l0IGEub3V0LgotCi0JKiBnYXMvbXJpL2Zvci5zOiBBZGQgbm9wIHRvIHJvdW5kIG91dCB0byBmb3VyIGJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbXJpL3JlcGVhdC5zOiBMaWtld2lzZS4KLQkqIGdhcy9tcmkvd2hpbGUuczogTGlrZXdpc2UuCi0JKiBnYXMvbXJpL2Zvci5kOiBFeHBlY3RlZCBhZGRlZCBub3AuCi0JKiBnYXMvbXJpL3JlcGVhdC5kOiBMaWtld2lzZS4KLQkqIGdhcy9tcmkvd2hpbGUuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9taXBzLyouZDogQ2hhbmdlIGFsbCB0ZXN0IG5hbWVzIHRvIHNheSBNSVBTLgotCi1UdWUgQXVnIDE1IDE1OjQyOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9mb3IuZCwgZ2FzL21yaS9mb3IuczogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL2lmLmQsIGdhcy9tcmkvaWYuczogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL3JlcGVhdC5kLCBnYXMvbXJpL3JlcGVhdC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvd2hpbGUuZCwgZ2FzL21yaS93aGlsZS5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIHRoZSBuZXcgdGVzdHMuCi0KLU1vbiBBdWcgMTQgMTY6MDM6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2V4cHIuZDogUGVybWl0IGxlYWRpbmcgemVyb2VzLCBpbiBjYXNlIHdlJ3JlIHVzaW5nIGEKLSAgICAgICAgNjQtYml0IEJGRC4KLQotCSogZ2FzcC9tcmkvKjogTmV3IHRlc3RzLgotCSogZ2FzcC9nYXNwLmV4cDogUnVuIHRoZW0uICBBbHNvLCBjbGVhbiB1cCB0aGUgdGVzdCBuYW1lcyB1c2VkIGluCi0JcGFzcyBhbmQgZmFpbC4KLQotU3VuIEF1ZyAxMyAwMDozOToyNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL3NoL2Jhc2ljLmV4cDogVXBkYXRlIG5vdyB0aGF0IHdlIGtub3cgdGhlIHJpZ2h0Ci0JYml0IHBhdHRlcnMgZm9yIHRoZSBuZXcgc3RzIGluc3RydWN0aW9ucy4KLQotVGh1IEF1ZyAxMCAwMDo0NjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvY2hhci5kOiBGaXggZm9yIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMuCi0JKiBnYXMvbXJpL2Zsb2F0LmQ6IExpa2V3aXNlLgotCi1XZWQgQXVnICA5IDE1OjM0OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9zdHJ1Y3QucywgZ2FzL2FsbC9zdHJ1Y3QuZDogTmV3IHRlc3QuCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBpdC4KLQotVHVlIEF1ZyAgOCAxNzoxMTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvY29tbW9uLnMsIGdhcy9tcmkvY29tbW9uLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0KLU1vbiBBdWcgIDcgMjI6Mzk6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgYTI5ayotKi0qIGZvciBjb25zdGFudHMKLQl0ZXN0LgotCi0JKiBnYXNwL2NyYXNoMS5vdXQsIGdhc3AvbWFjcm8ub3V0LCBnYXNwL3NmdW5jLm91dDogQ29tcGxldGUKLQl0cnVuY2F0ZWQgZmlsZXMsIHNvIHRoYXQgdGhlIHRlc3RzIHBhc3MuCi0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBocHBhKi0qLSogZm9yIGVxdSwKLQljb25zdGFudHMsIGFuZCBleHByLgotCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gc2Nod2FiIHRlc3Qgb24gaHB1eCosIG5vdCBqdXN0IGhwdXguICBSdW4KLQlvbiB2eHdvcmtzKiwgbm90IGp1c3Qgdnh3b3JrczUuMS4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZmFpbF9waGFzZSwgcGFzc19waGFzZSk6IFJlbW92ZS4KLQkocnVuX2R1bXBfdGVzdCk6IEp1c3QgY2FsbCBwYXNzIG9yIGZhaWwuCi0KLQkqIGdhcy9tNjhrL29wZXJhbmRzLnMsIGdhcy9tNjhrL29wZXJhbmRzLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvb3A2ODAwMC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2Nhcy5zLCBnYXMvbTY4ay9jYXMuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9iaXRmaWVsZC5zLCBnYXMvbTY4ay9iaXRmaWVsZC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL3NjaHdhYi5kOiBSdW4gb2JqZHVtcCB3aXRoIC1qIC50ZXh0LiAgQWRqdXN0IGZvcgotCWNoYW5nZXMgdG8gZGlzYXNzZW1ibGVyLgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIG5ldyB0ZXN0cy4gIFJ1biBzY2h3YWIgdGVzdCBmb3IKLQltNjhrLSotY29mZiouCi0KLU1vbiBBdWcgIDcgMDM6MDE6MzIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9zaC8qOiBOZXcgdGVzdHMgZm9yIHRoZSBoaXRhY2hpLXNoLgotCi1UdWUgQXVnICAxIDE4OjAyOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS8qOiBOZXcgdGVzdHMgZm9yIE1SSSBtb2RlLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogU3VwcG9ydCB1c2luZyBvYmpjb3B5LiAgRHVtcAotCXByb2dyYW0gZXhlY3V0aW9ucyB0byB0aGUgbG9nIGZpbGUgYmVmb3JlIHJ1bm5pbmcgdGhlbS4gIFVzZSB0aGUKLQlzaW1wbGUgcHJvZ3JhbSBuYW1lLCByYXRoZXIgdGhhbiB0aGUgcGF0aCB0byB0aGUgYmluYXJ5IGJlaW5nIHJ1biwKLQlpbiBwYXNzL2ZhaWwgbWVzc2FnZXMuCi0JKHJlZ2V4cF9kaWZmKTogSWYgdGhlIHJlZ2V4cCBmaWxlIGhhcyB0aGUgc3BlY2lhbCBjb21tZW50ICNwYXNzLAotCXN0b3AgY2hlY2tpbmcgYXQgdGhhdCBwb2ludC4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IE5NLCBOTUZMQUdTLCBPQkpDT1BZLCBhbmQgT0JKQ09QWUZMQUdTLAotCWlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHNldC4KLQotVHVlIEF1ZyAgMSAxMTo0MTozMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHN1cGVyZmx1b3VzIHJ1bnRlc3QgZ2FzcC4KLQotTW9uIEp1bCAzMSAxODoxOToyNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0gCSogZ2FzcC8qOiBOZXcuCi0JKiBNYWtlZmlsZS5pbjogVXNlIGdhc3AgdGVzdHMuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IEFkZCBnYXNwIHN0dWZmLgotCi1UaHUgSnVsIDIwIDE4OjU2OjQ4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IERpc2FibGUgdGVzdHMgdGhhdCBhcmUgbm90IGFwcHJvcHJpYXRlIGZvcgotCXRoZSBQQS4KLQotVGh1IEp1bCAxMyAxODoyMjo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIHNjaHdhYiB0ZXN0IGZvciBtNjhrIHZ4d29ya3M1LjEuCi0KLVdlZCBKdW4gMjEgMjE6Mjg6NTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvc2Nod2FiLio6IE5ldyB0ZXN0IGJhc2VkIG9uIGEgdGVzdCBjYXNlIGZyb20gQW5kcmVhcwotCVNjaHdhYi4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdCBmb3Igc29tZSBhb3V0IGNvbmZpZ3VyYXRpb25zLgotCi1Nb24gSnVuIDEyIDIyOjI3OjE4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLVN1biBNYXkgMjEgMjA6MjY6MTggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogRGlzYWJsZSBhbGlnbjQgdGVzdHMgZm9yCi0JRUxGIHRhcmdldHMuCi0KLVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCQotCi0JKiBhcm0vYXJtN2RtLnM6IE5ldyBmaWxlIC0tIHRlc3RzIGZvciBBUk03RE0gaW5zdHJ1Y3Rpb25zLgotCSogYXJtL2FybTYuczogQ29ycmVjdCBib2d1cyB0ZXN0cy4KLQkqIGFybS9nYXMuZXhwIChhcm02LnMpOiBJcyBub3cgYSB2YWxpZCB0ZXN0LgotCShhcm03ZG0ucyk6IE5ldyB0ZXN0LgotCSogYXJtL2Zsb2F0LnM6IEFkZCBsb2FkL3N0b3JlIG11bHRpcGxlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIAotCXRlc3RzLgotCi1XZWQgTWF5ICAzIDEzOjE0OjQ0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1UdWUgTWF5ICAyIDE2OjM3OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xkLmQ6IE1vZGlmaWVkIGZvciBnYXMgZGVsYXktc2xvdCBmaXhlcy4KLQotU2F0IEFwciAyOSAyMzozNToxOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGcuZXhwOiBOZXcgZmlsZS4KLQotVHVlIEFwciAxMSAxMzo1Nzo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzNC5kOiBBbGxvdyBtb3JlIHRoYW4gZXhhY3RseSA4IHplcm9zIGluIGJjMSoKLQl0YXJnZXRzLgotCi1Nb24gQXByIDEwIDE1OjM2OjM5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHBhc3NfcGhhc2UpOiBOZXcgcHJvYy4KLQkocnVuX2R1bXBfdGVzdCk6IE5vdGUgcGFzc2luZyBvciBmYWlsaW5nIG9mIGVhY2ggcGhhc2Ugb2YgdGhpcwotCXRlc3QsIGluc3RlYWQgb2YgZmFpbHVyZSBvZiBwaGFzZXMgb3IgcGFzc2luZyBvZiBjb21wbGV0ZSB0ZXN0LgotCUVuc3VyZSB0ZXN0IGZpbGUgbmFtZSBpcyBpbiByZXBvcnRlZCBtZXNzYWdlLgotCi1TYXQgQXByICA4IDEyOjQ2OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IEhhbmRsZSBhcmd1bWVudHMgd2l0aCBwYXRocy4KLQlBbHdheXMgcmVzb2x2ZSB0ZXN0Y2FzZSBzdGF0dXMgYmVmb3JlIHJldHVybmluZy4KLQlJZiBgc2x1cnBfb3B0aW9ucycgZmFpbHMsIHJldHVybiBhbmQgZG9uJ3QgZG8gdGVzdC4KLQkoc2x1cnBfb3B0aW9ucyk6IEZpeCAiY2FuJ3Qgb3BlbiIgZXJyb3IgbWVzc2FnZS4KLQlSZXR1cm4gLTEgdG8gaW5kaWNhdGUgZXJyb3IuCi0KLU1vbiBNYXIgMjAgMjI6NDU6MzAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2NvbW1vbi5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1GcmkgTWFyIDEwIDE5OjA3OjA5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9oODMwMC9mZnh4MS5zOiBBZGQgLndvcmQgMCBhdCB0aGUgZW5kIHRvIGVsaW1pbmF0ZQotCXVuY2VydGFpbnR5IGFzIHRvIHdoZXRoZXIgdGhlcmUgc2hvdWxkIGJlIHRyYWlsaW5nIGJ5dGVzIGluIHRoZQotCW91dHB1dCBmaWxlLgotCSogZ2FzL2g4MzAwL2ZmeHgxLmQ6IEFkanVzdCByZWxvYyB2YWx1ZXMgdG8gcGVybWl0IGFuIGFkZGVuZCB2YWx1ZQotCW9mIDB4MDAwMDAwMDBmZmZmZmZmZiBvbiA2NC1iaXQgaG9zdHMuICAoSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMKLQljb3JyZWN0LikgIEVuZCB3aXRoICIuLi4iIHRvIG1hdGNoIHRyYWlsaW5nIHplcm8gYnl0ZXMuCi0KLVdlZCBNYXIgIDggMTU6NTA6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzNC5kLCBnYXMvbWlwcy9taXBzNC5zOiBOZXcgZmlsZXMuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG5ldyB0ZXN0LgotCi1UaHUgRmViIDIzIDE3OjU4OjUwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogQWRkIGluZGV4aW5nIHZhcmlhbnRzLgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBUZXN0IHRoZW0uCi0KLVdlZCBGZWIgMTUgMTU6NDM6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy91bGQuZDogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy91bGQuczogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy91c2QuZDogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy91c2QuczogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG5ldyB0ZXN0cy4KLQotVGh1IEZlYiAgOSAxMDo1NzozOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX2FwcGx5YnVnX3Rlc3QpOiBSdW4gaXQuCi0KLVRodSBGZWIgIDIgMDA6MzQ6NTUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAgICAgICAgKiBnYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAoZG9fcGljX3JlbG9jYXRpb25fdGVzdCk6IFJ1biBpdC4KLQotRnJpIEphbiAyNyAxNDowMjowMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZCwgZ2FzL2g4MzAwL2ZmeHgxLnMsIGdhcy9oODMwMC9jbXBzaTIucywKLQlnYXMvaDgzMDAvaDgzMDAuZXhwOiBOZXcgdGVzdHMuCi0KLU1vbiBKYW4gMjMgMjE6NDQ6MjYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9fc3lzdGVtKTogVXBkYXRlLgotCi1XZWQgSmFuIDExIDE3OjIwOjI1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBEb24ndCBydW4gdGhlIG1lbW9yeS1hY2Nlc3MgdGVzdHMgaWYgdGhlCi0JZm9ybWF0IGlzIGEub3V0LCBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0Ci0JaXMgdXNlZCB3aXRoIG90aGVyIGZvcm1hdHMuCi0KLVR1ZSBKYW4gMTAgMTE6NDI6MTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCAoYWxpZ240LnMpOiBGaXggZ2xpdGNoIGluCi0JcmVnZXhwIHRvIGF2b2lkIGxvc2luZyB3aXRob3V0IGEgY29udHJvbGxpbmcgdHR5LgotCi1GcmkgRGVjIDMwIDE4OjA4OjIwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9pMzg2L3B1c2h3Lmw6IEZpeGVkIHdoaXRlc3BhY2UgdG8gbWF0Y2ggY3VycmVudCBsaXN0aW5nCi0Jc3R5bGUuCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogTWFyayB0ZXN0IHAxNDgwLnMgZXhwZWN0ZWQgdG8gcGFzcywgZXZlbiB3aXRoCi0JbGlzdGluZ3MgZW5hYmxlZC4KLQotVGh1IERlYyAxNSAxODoxNDoyNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQVNfRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VUKTogRG9uJ3Qgc2V0LgotCSh1bmluc3RhbGwpOiBEb24ndCBzZXQgT0JKRFVNUCBhbmQgT0JKRFVNUEZMQUdTIGluIHNpdGUuZXhwLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBEZWZhdWx0IE9CSkRVTVAgYW5kIE9CSkRVTVBGTEFHUy4gIFVzZQotCWZpbmRmaWxlIGFuZCB0cmFuc2Zvcm0gcHJvY2VkdXJlcyB0byBkZXRlcm1pbmUgb2JqZHVtcCBwcm9ncmFtCi0JbmFtZS4KLQotCSogZ2FzL21pcHMvYWJzLnMsIGdhcy9taXBzL2Rpdi5zOiBGb3JjZSBzb21lIHBhZGRpbmcgYXQgdGhlIGVuZCwKLQlpbiBjYXNlIHRoZSBmb3JtYXQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IHJlcXVpcmUgaXQuCi0JKiBnYXMvbWlwcy9iZXEuZCwgZ2FzL21pcHMvamFsLmQ6IEhhbmRsZSBNSVBTX0pNUCBhcyBhbiBhbHRlcm5hdGUKLQluYW1lIGZvciB0aGUgcmVsb2MgdHlwZS4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZmlsZV9jb250ZW50cywgdmVyYm9zZV9ldmFsKTogTmV3IHByb2NzLgotCShydW5fZHVtcF90ZXN0KTogSWYgdmVyYm9zaXR5IGxldmVsIGlzIG92ZXIgMywgcHJpbnQgb3V0IGR1bXAKLQljb21tYW5kIGFuZCBpdHMgb3V0cHV0LgotCi1UdWUgRGVjIDEzIDE4OjIxOjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvamFsLXN2cjRwaWMuZDogRml4IDAtc3RyaW5ncyB0byB3b3JrIHdpdGggNjQtYml0IGhvc3RlZAotCWRpc2Fzc2VtYmx5LgotCi1GcmkgRGVjICA5IDE5OjU0OjA0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cCAoY29tbWVudC5zIHRlc3QpOiBNYWtlIHRoZSAiXHIiIG9wdGlvbmFsLCBzaW5jZQotCWl0IGRlcGVuZHMgb24gdHR5IG1vZGVzLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfc3RhcnQpOiBUcnkgdXNpbmcgLW5vdHR5Y29weSBpbnN0ZWFkIG9mCi0JLW5vdHR5aW5pdC4KLQotCSogZ2FzL2FybS9nYXMuZXhwOiBUaGUgYXJtNiB0ZXN0IHNob3VsZCByZXBvcnQgZXJyb3JzLCBmb3Igbm93LgotCi1UaHUgRGVjICA4IDIwOjE5OjA5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHA6IFVzZSAtaSBpbiBleHBlY3RfYWZ0ZXIgY29tbWFuZC4KLQotV2VkIERlYyAgNyAxNjo0OToxNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9tdWwuZCxqYWwuZDogRml4IDAtc3RyaW5ncyB0byB3b3JrIHdpdGggNjQtYml0IGhvc3RlZAotCWRpc2Fzc2VtYmx5LgotCi0JKiBnYXMvaWVlZS1mcDogUmVuYW1lZCBmcm9tIGllZWUuZnAuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHA6IE1ha2Ugc3VyZSB0aW1lb3V0IGlzIGF0IGxlYXN0IDIgbWludXRlcy4KLQotV2VkIE5vdiAzMCAxMDo0ODowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcGFyc2U6IFJlbmFtZWQgZnJvbSBnYXMvaHBwYS9tb3JlLnBhcnNlLgotCi1Nb24gTm92IDI4IDAwOjQwOjI2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cCAobm9zdWJzcGFjZS5zKTogTm8gbG9uZ2VyIGV4cGVjdGVkCi0JdG8gZmFpbC4gIEZpeCBjb21tZW50cyBmb3IgdGhlIHRlc3QuICBUd2VhayB0ZXN0IG5hbWUuCi0KLVR1ZSBOb3YgMjIgMjM6Mzg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTWlub3IgdHdlYWtzIHRvIG1hdGNoIGN1cnJlbnQgUEEgRUxGCi0Jb3V0cHV0LiAKLQotRnJpIE5vdiAxOCAxNzo1Njo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xkLmQ6IEFkanVzdCB0byB3b3JrIGZvciBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbgotCWNvZGUuCi0JKiBnYXMvbWlwcy9sZC5zLCBnYXMvbWlwcy9saWYtZW1waWMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy9saWZsb2F0LmQsIGdhcy9taXBzL3VsaC1lbXBpYy5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3VsaC5kLCBnYXMvbWlwcy91bHcuZCwgZ2FzL21pcHMvdXNoLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdXN3LmQ6IExpa2V3aXNlLgotCi1UdWUgTm92IDE1IDExOjA5OjU3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIChpbXBvcnRidWcpOiBUd2VhayB0byBtYXRjaAotCWN1cnJlbnQgZXhwZWN0ZWQgUEEgRUxGIG91dHB1dC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAoZG9fcl9ub19yZWxvYyk6IExpa2V3aXNlLgotCShkb19wbGFiZWxfcmVsb2NhdGlvbl90ZXN0KTogTGlrZXdpc2UuCi0KLVRodSBOb3YgIDMgMTg6MTQ6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9wMTQ4MC5zOiBVc2UgbGFyZ2VyIGNvbnN0YW50LCBzbyBleHByZXNzaW9uIGNhbiBoYXZlIGEKLQlwb3NpdGl2ZSB2YWx1ZS4KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRXhwZWN0IHAxNDgwLnMgd2l0aG91dCBsaXN0aW5ncyB0byBwYXNzLgotCi1UaHUgTm92ICAzIDE1OjQzOjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvdWxoLmQsIGdhcy9taXBzL3Vsdy5kLCBnYXMvbWlwcy91c2guZCwgZ2FzL21pcHMvdXN3LmQ6Ci0JQ29ycmVjdCB0ZXN0IGNhc2VzLgotCi1UaHUgT2N0IDIwIDAwOjU1OjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9ibGVidWczLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLU1vbiBPY3QgMTcgMDI6MzM6NTMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTMuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotU3VuIE9jdCAxNiAyMjoyNTo1NiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChyX25vX3JlbG9jKTogVHdlYWsgb3V0cHV0IHRvIG1hdGNoCi0JY3VycmVudCByZWFsaXR5LgotCi1XZWQgU2VwIDI4IDIxOjIxOjM0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UuczogUmVuYW1lZCBmcm9tIHJlbG9jcmVkdWNlLnMKLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTIuczogUmVuYW1lZCBmcm9tIHJlbG9jcmVkdWNlMi5zCi0JKiBnYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnM6IFJlbmFtZWQgZnJvbSByX25vX3JlbG9jYnVnLnMKLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQotV2VkIFNlcCAyOCAxMzoyNToxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzL2JlcS5kLCBnYXMvbWlwcy9iZXEuczogVGVzdCB0aGF0IHVuY29uZGl0aW9uYWwgYnJhbmNoCi0Jb3ZlcmZsb3dzIGFyZSBjb3JyZWN0bHkgY29udmVydGVkIHRvIGp1bXBzLgotCi1Nb24gU2VwIDI2IDE3OjQxOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHM6IEFkZCB0ZXN0IGNhc2VzIGZvciBQSUMgY29kZSwgYm90aCBTVlI0IHN0eWxlIGFuZAotCS1tZW1iZWRkZWQtcGljIHN0eWxlLgotCi1GcmkgU2VwIDIzIDE0OjQ1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHM6IE5ldyBkaXJlY3Rvcnkgd2l0aCBNSVBTIHNwZWNpZmljIHRlc3QgY2FzZXMuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBQZXJtaXQgdGhlIC5kIGZpbGUgdG8gc3BlY2lmeQotCXRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhc3NlbWJsZS4KLQkocmVnZXhwX2RpZmYpOiBQdXQgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSBpbiB0aGUgbG9nIGZpbGUuCi0KLVdlZCBTZXAgMjEgMTM6NDQ6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBEb24ndCB0cnkgdG8gdXNlIHNoZWxsIHJlZGlyZWN0aW9uLCBzaW5jZSBUQ0wKLQlkb2Vzbid0IHN1cHBvcnQgaXQuICBSZWRpcmVjdCBzdGRvdXQgdXNpbmcgPiBpbnN0ZWFkIG9mIDE+LCBhbmQKLQlkb24ndCBib3RoZXIgdG8gcmVkaXJlY3Qgc3RkZXJyIHNpbmNlIFRDTCByZWRpcmVjdHMgaXQgYW55aG93LgotCShydW5fZHVtcF90ZXN0KTogUGFzcyBhcHByb3ByaWF0ZSBhcmd1bWVudHMgdG8gcHJvZ3JhbSwgZGVmYXVsdGluZwotCXRvIC1yLgotCi1TYXQgU2VwIDE3IDAxOjA0OjU2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhcy92YXg6IE5ldyBkaXJlY3RvcnkuCi0JKiBnYXMvdmF4L3txdWFkLnMscXVhZC5leHB9OiBOZXcgdGVzdCwgZm9yIGltbWVkaWF0ZSBxdWFkd29yZAotCXZhbHVlcy4KLQotTW9uIFNlcCAxMiAyMjoxOToxMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvY2J1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX2Z1bmN0aW9uX3JlbG9jX2J1Zyk6IFVwZGF0ZQotCWV4cGVjdGVkIG91dHB1dC4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBnYXMvYXJtLyo6IE5ldyBzdWJ0cmVlLiAgQWRkIEFSTSB0ZXN0cy4KLQotTW9uIEF1ZyAgOCAxMjoxMzozMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBBY2NlcHQgYW55IGNoYXJhY3RlcgotCWJldHdlZW4gZm9vJ3MgdHlwZSBhbmQgZm9vIGl0c2VsZi4KLQotRnJpIEp1bCAxNSAxOTowOToyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogTmV3IHJvdXRpbmUgZm9yIHJ1bm5pbmcgdGhlCi0JYXNzZW1ibGVyLCBydW5uaW5nIG9iamR1bXAgb3Igbm0gKG5vdCBmdWxseSBzdXBwb3J0ZWQpIG9uIHRoZQotCXJlc3VsdGluZyBvYmplY3QgZmlsZSwgYW5kIGNvbXBhcmluZyB0aGUgcmVzdWx0cyBhZ2FpbnN0IGEgZmlsZSBvZgotCXJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gdGhlIHRlc3Qgc3VpdGUsIGFsbCBpbiBvbmUgY29tbWFuZC4KLQlPcHRpb25zIGZvciB0aGUgYXNzZW1ibGVyIGFuZCBvYmpkdW1wIGFyZSByZWFkIGZyb20gY29tbWVudHMgYXQKLQl0aGUgc3RhcnQgb2YgdGhlIC5kIGZpbGUuCi0JKGZhaWxfcGhhc2UsIHNsdXJwX29wdGlvbnMpOiBOZXcgYXV4aWxpYXJ5IHJvdXRpbmVzLgotCShyZWdleHBfZGlmZik6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4gIEZpeCBidWdzIGluIGFjdHVhbGx5IGRvaW5nCi0JdGhlIHJlZ2V4cCB0ZXN0LgotCi0JKiBnYXMvc3VuNC9hZGRlbmQuZXhwOiBVc2UgcnVuX2R1bXBfdGVzdC4KLQkqIGdhcy9zdW40L2FkZGVuZC5kOiBGaXggcmVndWxhciBleHByZXNzaW9ucyBzbyB0aGF0IHRoZXkgd29yay4KLQotVGh1IEp1bCAgNyAxMTo1NTozMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2NyZWR1Y2UyLnM6IE1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb24gdGVzdHMuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biB0aGVtLgotCi1UaHUgSnVuIDMwIDE4OjQ5OjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogTG9vayBmb3IgImFzLm5ldyIgaW4gIiRiYXNlX2Rpci8uLiIsIHdoZXJlCi0JaXQgZ290IGNvbXBpbGVkLCBub3QgaW4gIiRiYXNlX2RpciIuCi0JKiBjb25maWcvdW5rbm93bi5leHA6IERlbGV0ZWQuCi0KLVN1biBKdW4gMjYgMTM6MjM6NTQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9saWIvZ2FzLWRlZnMuZXhwIChnYXNfZmluaXNoKTogQ2FsbCAiY2xvc2UiIGFuZCAid2FpdCIKLQliZWZvcmUgZXhpdGluZy4gIEVuY2xvc2UgYm90aCBjYWxscyBpbnNpZGUgYSAiY2F0Y2giLgotCShvYmpkdW1wX2ZpbmlzaCk6IExpa2V3aXNlLgotCi1GcmkgSnVuIDEwIDEwOjIzOjM1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKHJvdW5kbW9kZSB0ZXN0KTogVHdlYWsgZXhwZWN0ZWQgb3V0cHV0Ci0JZm9yIFNPTSB0byBtYXRjaCBjdXJyZW50IHRlc3RjYXNlLgotCi1UaHUgSnVuICAyIDE5OjQ2OjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhcy9pMzg2L3twdXNody5zLHB1c2h3Lmx9OiBOZXcgdGVzdC4KLQkqIGdhcy9pMzg2L2FsbC5leHA6IFJ1biBpdC4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlIGNvbmZpZyBmaWxlcyBhbmQgZ2FzLnN1bS4KLQotRnJpIE1heSAyNyAxMjoyNDoxOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvbTY4ay9kaXNwZXJyLnM6IFVzZSAlIGZvciByZWdpc3RlcnMuCi0KLQkqIGdhcy9tNjhrLWNvZmYvZ2FzLmV4cDogRXhwZWN0IGZhaWx1cmUgZm9yIHAyMzg5YS5zLgotCi1UdWUgTWF5IDE3IDE0OjUzOjA4IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cDogUmVwbGFjZSBlcnJvciBwcm9jIGNhbGxzIHdpdGggcGVycm9yIGNhbGxzLgotCi1Nb24gTWF5IDE2IDEzOjE5OjE2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFR3ZWFrIGV4cGVjdGVkIG91dHB1dCB0byBtYXRjaCBuZXcKLQlFTEYgY29kZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zOiBBdm9pZCAiUyIgYW5kICJEIiBtb2RlcywgRUxGIGRvZXMKLQlub3Qgc3VwcG9ydCB0aGVtLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBUd2VhayBleHBlY3RlZCBvdXRwdXQgdG8gbWF0Y2gKLQluZXcgRUxGIGNvZGUuCi0KLVRodSBNYXkgIDUgMTc6Mjc6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW5hbWVkIGZyb20gdW5peC1nYXMuZXhwLgotCi1Nb24gQXByIDExIDEwOjMxOjAwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogU2V0IFRDTF9MSUJSQVJZIGZvciBydW50ZXN0LgotCi1Nb24gQXByIDExIDA3OjU0OjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2NhbGxpbmZvYnVnLnM6IEFkZCBtaXNzaW5nIG5hbWUgZm9yCi0JcHJvY2VkdXJlLgotCi0JKiBnYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcuczogUGxhY2UgdGhlIHRyYW1wb2xpbmUgaW4gdGhlCi0JJERBVEEkIHJhdGhlciB0aGFuICRMSVQkIHN1YnNwYWNlLgotCi1TdW4gTWFyIDI3IDE0OjA1OjMzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotVGh1IE1hciAxNyAxMzozODowNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLVdlZCBNYXIgMTYgMTE6NTc6MDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcmVncG9wYnVnLnM6IEFkZCB0cml2aWFsIC5lcXUgdGVzdC4KLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnM6IE5ldyB0ZXN0IChleHBlY3RlZCB0byBmYWlsKS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2NhbGxpbmZvYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvb21yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9yZWdwb3BidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi1Nb24gRmViIDI4IDE0OjEwOjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKG9iamR1bXApOiBOZXcgcHJvYy4KLQkob2JqZHVtcF9zdGFydCk6IERlbGV0ZWQgdW51c2VkIHByb2MuCi0JKG9iamR1bXBfc3RhcnRfY29tbW9uKTogTWVyZ2VkIGludG8gb2JqZHVtcF9zdGFydF9ub19zdWJkaXIuCi0KLQkqIGdhcy9hbHBoYS9mcC5leHA6IFVzZSBvYmpkdW1wIGluc3RlYWQgb2YKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciwgc2luY2UgdGhlIGZvcm1lciBhY3R1YWxseSB3YWl0cyBmb3IKLQlvYmpkdW1wIHRvIGZpbmlzaC4gIFNwZWNpZnkgLnJkYXRhIHNlY3Rpb24gb25seS4gIE1ha2UgY29tbWVudAotCWluZGljYXRlIEFscGhhIGFyY2hpdGVjdHVyZSByYXRoZXIgdGhhbiBTUEFSQy4KLQkqIGdhcy9hbHBoYS9mcC5kOiBPbWl0IC5yZWdpbmZvIHBhdHRlcm5zLiAgSnVzdCB1c2UgIi4iIHRvIG1hdGNoCi0JYWdhaW5zdCBBU0NJSSBjb2RlIDB4MmEgKCIqIiwgc3BlY2lhbCBpbiByZWdleHApLgotCSogZ2FzL3N1bjQvYWRkZW5kLmV4cDogVXNlIG9iamR1bXAgaW5zdGVhZCBvZgotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyLgotCi1UaHUgRmViIDI0IDA3OjExOjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHAgKG5vIHN1YnNwYWNlIHRlc3QpOiBPbmx5IGV4cGVjdAotCWEgZmFpbHVyZSBpZiBnYXMgaXMgbm90IHByb2R1Y2luZyBhbiBFTEYgb2JqZWN0LgotCi1Nb24gRmViIDE0IDA5OjI0OjAzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFJ1biBpdC4KLQotVGh1IEZlYiAxMCAwMDozNDoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvYWxwaGEvZnAuKjogTmV3IGZpbGVzLgotCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBSZXBvcnQgbm90ZWQgbWlzbWF0Y2ggYXQKLQl2ZXJib3NpdHkgbGV2ZWwgMyBvciBhYm92ZSBvbmx5LgotCi1Nb24gRmViICA3IDE1OjUzOjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS8qLyouZXhwOiBDaGFuZ2UgeGZhaWxzIHRvIGNoZWNrIGZvciBQQSBFTEYgcmF0aGVyIHRoYW4KLQlQQSBPU0YxLgotCi1GcmkgRmViICA0IDIzOjQyOjE0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3htcHl1YnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotRnJpIEZlYiAgNCAxNzoxMzoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IE5ldyBwcm9jZWR1cmUsIHZhZ3VlbHkgYmFzZWQgb24KLQkic2ltcGxlX2RpZmYiIGZyb20gbGlua2VyIHRlc3Qgc3VpdGUuCi0JKiBnYXMvc3VuNC9hZGRlbmQuZXhwOiBVc2UgaXQuCi0JKiBnYXMvc3VuNC9hZGRlbmQuZDogTmV3IGZpbGUuCi0KLVN1biBKYW4gMzAgMjM6MzQ6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBBZGp1c3QgcmVnZXhwIGZvciB4OTMwNTA5LnMgZm9yIGN1cnJlbnQgbGlzdGluZwotCWZvcm1hdC4KLQotVGh1IEphbiAyMCAxNjo0NDo1MSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cCwgbGliL2dhcy1kZWZzLmV4cCwgc3VuNC9hZGRlbmQuZXhwLAotCXNwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cDogVHdlYWtlZCB0byBmaXggYSBmZXcgYnVncyBhbmQgdG8gcnVuCi0Jd2VsbCB1bmRlciBlaXRoZXIgdmVyc2lvbiBvZiBleHBlY3QuCi0KLU1vbiBKYW4gMTcgMDA6MjU6MDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZwX21pc2MuczogRGVsZXRlIGNvcHIgaW5zdHJ1Y3Rpb24uICBJdCdzIHRlc3RlZAotCWVsc2V3aGVyZSBub3cuCi0JKiBnYXMvaHBwYS9iYXNpYy97Y29wciwgY29wcm1lbSwgc3BvcH0uczogTmV3IHRlc3RzLgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotVGh1IEphbiAxMyAxMTo1OToyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBObyBsb25nZXIgZXhwZWN0IGRpZmZlcmVuY2Ugb2YgZm9yd2FyZAotCXJlZmVyZW5jZXMgdG8gZmFpbC4KLQkqIGdhcy9hbGwveDkzMDUwOS5zOiBGaXggdGVzdGNhc2UgdG8gbWF0Y2ggaG93IHRoZSBleHBlY3QgY29kZSB3YXMKLQl3cml0dGVuLgotCi1XZWQgSmFuIDEyIDEzOjQxOjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLiAgTGF0ZXN0IHRlc3QKLQlmb3IgY3Jvc3Mtc3Vic3BhY2UgY2FsbCBidWdzIGlzIG5vIGxvbmdlciBleHBlY3RlZCB0byBmYWlsLgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3Byb2NidWcuczogQWRkIHRlc3QgZm9yIGFub3RoZXIgYnVnIHJlbGF0aW5nCi0JdG8gaGF2aW5nIGEgZnVuY3Rpb24ncyBsYWJlbCBmb2xsb3cgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotVHVlIEphbiAxMSAyMTo0Nzo0OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBBZGQgdGVzdCBmb3IgY3Jvc3Mtc3Vic3BhY2UgY2FsbCBidWcKLQlmb3VuZCB3aGlsZSB3b3JraW5nIG9uIG11bHRpcGxlICRDT0RFJCBzdWJzcGFjZSBzdXBwb3J0LgotCi1Nb24gSmFuIDEwIDA5OjU0OjE1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogcHJvY2J1Zy5zIGlzIG5vIGxvbmdlciBleHBlY3RlZAotCXRvIGZhaWwuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3Byb2NidWcuczogQWRkIG1pc3NpbmcgLnByb2NlbmQuCi0KLU1vbiBKYW4gIDMgMTA6MDc6NDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvbGFiZWxidWcuczogQWRkIHRlc3RjYXNlIGZvciBidWcgaW4gbGFzdAotCWFwcC5jIGNoYW5nZS4KLQotV2VkIERlYyAyOSAxMTozMjozOSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9sYWJlbGJ1Zy5zOiBBZGQgbW9yZSBjb2xvbmxlc3MgbGFiZWwgdGVzdHMuCi0KLVdlZCBEZWMgMTUgMDg6MjQ6MzEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc2l0ZS5leHApOiBEb24ndCBzZXQgQVNGTEFHUy4gIFF1b3RlIHZhbHVlIG9mCi0JT0JKRFVNUEZMQUdTIGluIGNhc2UgaXQncyBlbXB0eS4gIFVzZSB0ZW1wb3JhcnkgbmFtZXMgdW50aWwgdGhlCi0JZW5kOyBtYWtlIGNyZWF0aW5nIHNpdGUuZXhwIHRoZSBmaW5hbCBzdGVwLgotCShjaGVjayk6IFBhc3MgaW4gQVNGTEFHUy4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBVc2UgYWxsX29uZXMgcHJvYy4gIENoYW5nZSByZWdleHAgZm9yIG1hdGNoaW5nCi0JQyBjb21tZW50cyB0byBhdm9pZCBidWdzIGluIGxhdGVzdCBleHBlY3QgY29kZS4KLQotV2VkIERlYyAgOCAxNDozMDoxNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL202OGsvZGlzcGVyci5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KLQotU3VuIERlYyAgNSAxOToyNDo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuICBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KLQotV2VkIERlYyAgMSAxMDo0NDoxOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gdGhlIGZpcnN0IGhhbGYgb2YgYm9ndXMgUl9FWElUCi0JdGVzdCBmb3IgRUxGLiAgCi0KLVR1ZSBOb3YgMzAgMTM6NDM6MjEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBUZXN0IGZvciBlcnJvciBvbiBmb3Igc3Vic3BhY2UKLQlkaXJlY3RpdmUgaXMgYW4gWEZBSUwgZm9yIFNPTSBhc3NtZWJsZXJzLgotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJlbW92ZSBYRkFJTCBmb3IgcmVsb2NhdGlvbiBvbgotCWNyb3NzLXN1YnNwYWNlIGNhbGwgdGVzdC4KLQotU3VuIE5vdiAyOCAxMjoxMjo1MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9hcHBidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotU2F0IE5vdiAyNyAyMjo1MDowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2FsbC9wMjQyNS5zOiBJbnNlcnQgYSB0YWIgYmVmb3JlIGFzc2VtYmxlciBkaXJlY3RpdmVzIHNvCi0JdGhhdCB0aGUgZGlyZWN0aXZlcyBhcmUgbm90IGludGVycHJldGVkIGFzIGxhYmVscy4KLQotCSogZ2FzL2hwcGEvYmFzaWMvd2VpcmQuczogU3luYyB3aXRoIEdEQiB2ZXJzaW9uLgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2xhYmVsYnVnLnM6IE5ldyB0ZXN0LgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi1XZWQgTm92IDI0IDAxOjI1OjAzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS9yZWxvYy9leGl0YnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVN1biBOb3YgMjEgMjI6MTE6MTAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTWlub3IgZml4ZXMgc28gdGhhdCBTT00gJiBFTEYgY2FuCi0Jc2hhcmUgdGhlIHNhbWUgdGVzdCBjb2RlLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2NyZWR1Y2UuczogTGlrZXdpc2UuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZtZW0uczogQWRkIHF1YWR3b3JkIEZQIHN0b3JlIGluc3RydWN0aW9ucy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogVGVzdCBxdWFkd29yZCBGUCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0KLVN1biBOb3YgIDcgMDA6MzE6NDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlIGZvcgotCWZpZWxkIHNlbGVjdG9yIG9uIGJsZSBpbnN0cnVjdGlvbiB0ZXN0LgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMgZm9yCi0Jc3lzdGVtIGluc3RydWN0aW9uIHRlc3RzIG5vdyB0aGF0IHByb2JlaSBpcyBmaXhlZC4KLQotU2F0IE5vdiAgNiAyMjo0NTowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotVGh1IE5vdiAgNCAxNzowMTozMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1UaHUgTm92IDA0IDA5OjA5OjQ5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVR1ZSBOb3YgIDIgMjI6MTI6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2Uve2RlZmJ1Zy5zLCBzdGRyZWcuc306IE5ldyB0ZXN0cy4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gdGhlbS4KLQotTW9uIE5vdiAgMSAyMzozNzo1OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChyZWxvY19yZWR1Y2UpOiBDb3JyZWN0IG9mZnNldHMgYXQKLQl3aGljaCBzcGVjaWZpYyByZWxvY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgZm91bmQuCi0JCi1TYXQgT2N0IDMwIDE0OjEyOjMxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKHNzX2FsaWduKTogUmVtb3ZlIE9TRiB4ZmFpbC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IEFkZCBuZXcgdGVzdC4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2Uvc3NidWcuczogTmV3IHRlc3QgdG8gbWFrZSBzdXJlIG5vbi1kZWZhdWx0Ci0Jc2VjdGlvbnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IERpc2FibGUgKGFuZCBmYWlsKSBwMTQ4MC5zIGZvciBhbGwgUEEgdGFyZ2V0cy4KLQotRnJpIE9jdCAyOSAxNjoyOTowNiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9jYWxsZGF0YWJ1Zy5zOiBDb2xvbml6ZS4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBGaXggdHlwb3MuCi0KLVRodSBPY3QgMjggMjE6NDA6MDYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3tiYXNpYywgbW9yZS5wYXJzZSwgcmVsb2MsIHVuc29ydGVkfTogTmV3IGRpcmVjdG9yaWVzLgotCSogZ2FzL2hwcGEvKi8qLmV4cDogTmV3IHRlc3QgZHJpdmVycy4KLQkqIGdhcy9ocHBhLyovKi5zOiBOZXcgdGVzdCBmaWxlcy4KLQotTW9uIE9jdCAyNSAwOTo0MDo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZ2FzL3N1bjQ6IE5ldyBkaXJlY3RvcnkuCi0JKiBnYXMvc3VuNC9hZGRlbmQucyxhZGRlbmQuZXhwOiBOZXcgdGVzdCBjYXNlLgotCSogZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMsYWRkZW5kLmV4cDogU29sYXJpcyB2ZXJzaW9uIG9mIHNhbWUKLQl0ZXN0IGNhc2UuCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogQ2hlY2sgYConIGluIEMgY29tbWVudHMuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGFsbF9vbmVzKTogTmV3IHByb2NlZHVyZSwgZm9yIGEgcHJlZGljYXRlIHRvCi0Jc2ltcGxpZnkgc29tZSB0ZXN0cy4KLQkod2FudF9ub19vdXRwdXQpOiBSZXR1cm4gemVybyBvciBub256ZXJvLCBkZXBlbmRpbmcgb24gc3VjY2VzcyBvcgotCWZhaWx1cmUuCi0JKGdhc190ZXN0X29sZCk6IFJldHVybiB2YWx1ZSBmcm9tIHdhbnRfbm9fb3V0cHV0LgotCShvYmpkdW1wX3N0YXJ0X2NvbW1vbik6IFNwbGl0IG9mZiBmcm9tIG9iamR1bXBfc3RhcnQuCi0JKG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyKTogTmV3IHByb2NlZHVyZS4KLQotV2VkIE9jdCAyMCAwNzoyNTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9kaWZmMS5zLCBnYXMvbTY4ay9waWMxLnM6IE5ldyB0ZXN0cy4KLQkqIGdhcy9hbGwvZ2FzLmV4cCwgZ2FzL202OGsvYWxsLmV4cDogUnVuIHRoZW0uCi0KLQkqIE1ha2VmaWxlLmluIChPQkpEVU1QX0ZPUl9UQVJHRVQpOiBEZWZpbmUgc2ltaWxhciB0bwotCUFTX0ZPUl9UQVJHRVQuCi0JKGNoZWNrKTogRG9uJ3QgcGFzcyBBU0ZMQUdTIHZhcmlhYmxlLgotCShzaXRlLmV4cCk6IFB1dCBBU0ZMQUdTLCBPQkpEVU1QLCBPQkpEVU1QRkxBR1MgaW50byBzaXRlLmV4cC4KLQotCUZyb20gSmVmZiBMYXc6Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKG9iamR1bXBfc3RhcnQsIG9iamR1bXBfZmluaXNoKTogTmV3IGZ1bmN0aW9ucwotCXNvIHRoYXQgdGVzdHMgY2FuIHBhcnNlIHRoZSBvdXRwdXQgb2Ygb2JqZHVtcCBsb29raW5nIGZvciBlcnJvcnMKLQlpbiByZWxvY2F0aW9uIGVudGlyZXMsIGZpbGUgaGVhZGVycyBhbmQgdGhlIGxpa2UuCi0KLVRodSBTZXAgMjMgMTY6MjA6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBnYXMvaWVlZS5mcC94OTMwNTA5YS5leHA6IEN1cnJlbnRseSBleHBlY3RlZCB0byBmYWlsIGFsd2F5cy4KLQkqIGdhcy9hbGwvZ2FzLmV4cCAocDE0ODAucywgeDkzMDUwOS5zKTogRGl0dG8uICBCcmVhayB1cCBnYXNfdGVzdAotCWNhbGwgc28gaXQgbm8gbG9uZ2VyIHBlcmZvcm1zIG11bHRpcGxlIHRlc3RzLgotCSogZ2FzL202OGsvYWxsLmV4cCAodDIucyk6IERvbid0IGJvdGhlciB3aXRoIGxpc3RpbmdzLgotCShwMjQxMC5zKTogRG9uJ3QgcGFzcyB1bndhbnRlZCBhcmd1bWVudHMgdG8gZ2FzX3Rlc3RfZXJyb3IuCi0KLVdlZCBBdWcgMjUgMTY6NTA6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWIvZG8qOiBSZW1vdmUgUkNTIGlkIHN0cmluZ3MuCi0KLU1vbiBNYXkgMTcgMTU6MDk6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZmxvYXQucywgZ2FzL2FsbC9wMTQ4MC5zLCBnYXMvbTY4ay9wMjQxMC5zOiBOZXcgdGVzdHMuCi0JKiBnYXMvYWxsL2dhcy5leHAsIGdhcy9tNjhrL2FsbC5leHA6IFJ1biB0aGVtLgotCSogZ2FzL2kzODY6IE5ldyBkaXJlY3RvcnkuCi0KLU1vbiBNYXkgMTAgMTQ6NTA6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIEFkZGVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIHRvIGNhdGVnb3JpemUgdGVzdHMgYnkgdGFyZ2V0cy4KLQkqIEFkZGVkIG5ldyB0ZXN0cyBhbGwveDkzMDUwOS5zLCBpZWVlLmZwL3g5MzA1MDlhLnMsIG02OGsvcDI2NjMucywKLQlhbmQgcmVmaW5lZCBzb21lIHRvIGV4YW1pbmUgdGhlIGFzc2VtYmxlciBsaXN0aW5nIG91dHB1dC4KLQkqIGxpYi9nYXMtZGVmcy5leHA6IFJlbmFtZWQgZ2FzX3N0YXJ0IHRvIGdhc19ydW4uICBBZGRlZCBzb21lCi0JZXhwZWN0X2FmdGVyIHBhdHRlcm5zLgotCShnYXNfc3RhcnQsIGdhc19maW5pc2gpOiBOZXcgcHJvY3MsIGZvciB0ZXN0cyB0aGF0IGV4YW1pbmUgcHJvY2VzcwotCW91dHB1dC4KLQkqIGNvbmZpZy91bml4LWdhcy5leHA6IEludm9rZSBnYXNfaW5pdCBkaXJlY3RseSwgaW5zdGVhZCBvZgotCXJlcXVpcmluZyB0ZXN0IC5leHAgZmlsZXMgZG8gaXQuCi0KLVdlZCBBcHIgMjEgMDE6MjQ6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBnYXMvZ2FzLmV4cDogSGFuZGxlIG5ldyB0ZXN0cywgYW5kIGNoYW5nZXMgdG8gdGVzdGluZyBwcm9jcy4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAod2FudF9ub19vdXRwdXQpOiBOZXcgcHJvYzsgc3VjY2VzcyBpZmYgb3V0cHV0Ci0JaXMgZW1wdHkuCi0JKGdhc190ZXN0X29sZCk6IEZ1bmN0aW9uYWxseSBzYW1lIGFzIG9sZCBnYXNfdGVzdC4KLQkoZ2FzX3Rlc3RfaWdub3JlX3N0ZG91dCk6IFJld3JpdHRlbiB0byB1c2Ugd2FudF9ub19vdXRwdXQuCi0JKGdhc190ZXN0KTogTmV3IGFyZ3VtZW50IGxpc3RzIHNldCBvZiBvcHRpb25zIHRvIGJlIHRyaWVkIGluCi0JY29tYmluYXRpb25zLiAgT3B0aW9uIHdpdGggdHJhaWxpbmcgIj4iIGluZGljYXRlcyBzdGFuZGFyZCBvdXRwdXQKLQlzaG91bGQgYmUgaWdub3JlZC4KLQotCSogZ2FzL3AyNDI1YS5zOiBVc2UgJS1mb3JtIGZvciByZWdpc3RlcnMsIHNvIHRoaXMgdGVzdCBjYW4gYmUgcnVuCi0Jb24gbTY4ay1jb2ZmIHRhcmdldHMgdG9vLgotCi0JKiBnYXMvcDI0MzBhLnM6IE5ldyB0ZXN0IGNhc2UsIHdoaXRlc3BhY2UgJmMgbWF0Y2hlcyBjdXN0b21lcgotCXJlcG9ydCBtb3JlIGNsb3NlbHkuICBHZXRzIGRpZmZlcmVudCByZXN1bHRzIGZyb20gcDI0MzAuczsgdGhpcyBpcwotCWJhZCwgYW5kIG5vdCB5ZXQgdGVzdGVkIGZvci4KLQotTW9uIEFwciAgNSAxMjoyNzoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZ2FzL3AyMzg5YS5zLCBnYXMvcDI0MTEucywgZ2FzL3QyLnM6IE5ldyB0ZXN0IGNhc2VzLgotCSogbGliL3J1bjogTmV3IHNjcmlwdC4KLQkqIGdhcy9nYXMtZGVmcy5leHAgKGdhc19zdGFydCk6IFRha2VzIG5ldyBhcmdzLCBhc3NlbWJsZXIgb3B0aW9ucwotCWFuZCByZWRpcmVjdGlvbiBvcHRpb25zLiAgVXNlICJydW4iIHNjcmlwdCBzbyByZWRpcmVjdGlvbiB3b3Jrcy4KLQkoZ2FzX3Rlc3QpOiBOb3cgdGFrZXMgYXNzZW1ibGVyIG9wdGlvbnMgYXMgc2VwYXJhdGUgYXJnIGZyb20gaW5wdXQKLQlmaWxlIG5hbWUuCi0JKGdhc190ZXN0X2lnbm9yZV9zdGRvdXQpOiBOZXcgcHJvYy4gIERpc2NhcmRzIG91dHB1dC4KLQkoZ2FzX3Rlc3RfZXJyb3IpOiBOZXcgcHJvYy4gIEV4cGVjdHMgYXNzZW1ibGVyIHRvIGdlbmVyYXRlIG91dHB1dC4KLQkodGFyZ2V0X2NwdV9mYW1pbHkgc2V0dGluZyk6IEhhbmRsZSBpNDg2LT5pMzg2IGFsc28uCi0KLQkqIGxpYi9kbyo6IFNjcmlwdHMgbW92ZWQgaGVyZSBmcm9tIGdhcy90ZXN0c2NyaXB0cy4gIE1heSBiZSB1c2VmdWwKLQlzb21lZGF5IGZvciB3cml0aW5nIG1vcmUgdGVzdCBjYXNlczsgbm90IGN1cnJlbnRseSB1c2VkLgotCi1UdWUgTWFyIDMwIDExOjQ1OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZ2FzL3NvbC1nY2MucywgZ2FzL3NvbC1jYy5zLCBnYXMvcDI0MjVhLnMsIGdhcy9wMjM4OS5zOiBOZXcgdGVzdAotCWNhc2VzLgotCSogZ2FzL2dhcy5leHA6IEVuYWJsZSB0aGVtIGZvciBhcHByb3ByaWF0ZSB0YXJnZXRzLiAgUmVtb3ZlZCBzb21lCi0JdXNlbGVzcyBjb21tZW50cyAmYy4gIENoYW5nZWQgbTY4ayB0YXJnZXQgdGVzdCB0byBiZSBtb3JlIGdlbmVyYWwuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc19leGl0LCBnYXNfaW5pdCk6IE5ldyBwcm9jcy4KLQkqIGdhcy9nYXMuZXhwOiBDYWxsIGdhc19pbml0LgotCi1Nb24gTWFyIDI5IDAwOjAwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBUZXN0IHN1aXRlIGNyZWF0ZWQuCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzRhMDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1sb2FkX2xpYiBnYXMtZGVmcy5leHAKLQotZ2xvYmFsIEFTCi1pZiAhW2luZm8gZXhpc3RzIEFTXSB0aGVuIHsKLSAgICBzZXQgQVMgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9hcy1uZXcgIi4uL2FzLW5ldyIgW3RyYW5zZm9ybSBhc11dCi19Ci0KLWdsb2JhbCBHQVNQCi1pZiAhW2luZm8gZXhpc3RzIEdBU1BdIHRoZW4gewotICAgIHNldCBHQVNQIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vZ2FzcC1uZXcgIi4uL2dhc3AtbmV3IiBbdHJhbnNmb3JtIGdhc3BdXQotfQotCi1nbG9iYWwgQVNGTEFHUwotaWYgIVtpbmZvIGV4aXN0cyBBU0ZMQUdTXSB0aGVuIHsKLSAgICBzZXQgQVNGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkRVTVBdIHRoZW4gewotICAgIHNldCBPQkpEVU1QIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvb2JqZHVtcCBcCi0JCQkgICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9vYmpkdW1wIFwKLQkJCSAgW3RyYW5zZm9ybSBvYmpkdW1wXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpEVU1QRkxBR1Mge30KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBOTV0gdGhlbiB7Ci0gICAgc2V0IE5NIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvbm0tbmV3IFwKLQkJICAgICAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvbm0tbmV3IFwKLQkJICAgICBbdHJhbnNmb3JtIG5tXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgTk1GTEFHUyB7fQotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkNPUFldIHRoZW4gewotICAgIHNldCBPQkpDT1BZIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvb2JqY29weV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpDT1BZRkxBR1Mge30KLX0KLQotZ2FzX2luaXQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZWRlNjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNuYW1lOiBhbGlnbgotCi0jIFRlc3QgdGhlIGFsaWdubWVudCBwc2V1ZG8tb3AuCi0KLS4qOiAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgZmYwMGZmMDEgZmYwMjAyMDIgZmZmZjAzMDMgMDQwNDA0MDQgIC4uLi4uLi4uLi4uLi4uLi4KLSAwMDEwIGZmZmZmZmZmIDA1MDUwNTA1IGZmMDkwYTBhIDBhMGEwYTBhICAuLi4uLi4uLi4uLi4uLi4uCi0gMDAyMCBmZjAwZmYwMSBmZjAyMDIwMiBmZmZmMDMwMyAwNDA0MDQwNCAgLi4uLi4uLi4uLi4uLi4uLgotIDAwMzAgZmZmZmZmZmYgMDUwNTA1MDUgZmYwOTBhMGEgMGEwYTBhMGEgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljY2NhMTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKiBUZXN0IHRoZSBhbGlnbm1lbnQgcHNldWRvLW9wcy4gICovCi0JLnRleHQKLQotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbiAxLDAKLQotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbiAxLDEKLQotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbiAyLDIKLQotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ253IDIsMHgwMzAzCi0KLQkucDJhbGlnbiAzLDQKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ25sIDMsMHgwNTA1MDUwNQotCi0JLnAyYWxpZ24gMSw2Ci0JLnAyYWxpZ24gMSw3Ci0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMyw4LDUKLQkuYnl0ZQk5Ci0JLnAyYWxpZ24gMywweGEKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTIsMAotCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ24JMiwxCi0KLQkuYnl0ZQkweGZmCi0JLmJhbGlnbgk0LDIKLQotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJhbGlnbncgNCwweDAzMDMKLQotCS5iYWxpZ24JOCw0Ci0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ25sIDgsMHgwNTA1MDUwNQotCi0JLmJhbGlnbiAyLDYKLQkuYmFsaWduIDIsNwotCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ24JOCw4LDUKLQkuYnl0ZQk5Ci0JLmJhbGlnbgk4LDB4YQotCi0JLnAyYWxpZ24gNQotCS5iYWxpZ24gMzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg5OGI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jb2JqZHVtcDogLXQKLSNuYW1lOiBjb2ZmdGFnCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotU1lNQk9MIFRBQkxFOgotXFsgIDBcXVwoc2VjIC0yXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAxMDNcKSBcKG54IDFcKSAweDArMDAwMCBmb28uYwotRmlsZSAKLVxbICAyXF1cKHNlYyAgMVwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICA2XCkgXChueCAwXCkgMHgwKzAwMDAgZ2NjMl9jb21waWxlZC4KLVxbICAzXF1cKHNlYyAgMVwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICA2XCkgXChueCAwXCkgMHgwKzAwMDAgX19fZ251X2NvbXBpbGVkX2MKLVxbICA0XF1cKHNlYyAtMlwpXChmbCAweDAwXClcKHR5ICAgYVwpXChzY2wgIDE1XCkgXChueCAxXCkgMHgwKzAwMDAgX3Rva2VuCi1BVVggbG5ubyAwIHNpemUgMHg0IHRhZ25keCAwIGVuZG5keCAxMAotXFsgIDZcXVwoc2VjIC0xXClcKGZsIDB4MDBcKVwodHkgICBiXClcKHNjbCAgMTZcKSBcKG54IDBcKSAweDArMDAwMCBfb3BlcmF0b3IKLVxbICA3XF1cKHNlYyAtMVwpXChmbCAweDAwXClcKHR5ICAgYlwpXChzY2wgIDE2XCkgXChueCAwXCkgMHgwKzAwMDEgX2ZsYWdzCi1cWyAgOFxdXChzZWMgLTFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsIDEwMlwpIFwobnggMVwpIDB4MCswMDA0IC5lb3MKLUFVWCBsbm5vIDAgc2l6ZSAweDQgdGFnbmR4IDQKLVxbIDEwXF1cKHNlYyAgMVwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICAzXCkgXChueCAxXCkgMHhbMC05YS1mXSsgLnRleHQKLUFVWCBzY25sZW4gMHhbMC05YS1mXSsgbnJlbG9jIDAgbmxubm8gMAotXFsgMTJcXVwoc2VjICAyXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDNcKSBcKG54IDFcKSAweFswLTlhLWZdKyAuZGF0YQotQVVYIHNjbmxlbiAweFswLTlhLWZdKyBucmVsb2MgMCBubG5ubyAwCi1cWyAxNFxdXChzZWMgIDNcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgM1wpIFwobnggMVwpIDB4WzAtOWEtZl0rIC5ic3MKLUFVWCBzY25sZW4gMHhbMC05YS1mXSsgbnJlbG9jIDAgbmxubm8gMAotXFsgMTZcXVwoc2VjICAyXClcKGZsIDB4MDBcKVwodHkgICAyXClcKHNjbCAgIDJcKSBcKG54IDBcKSAweDArMDAwMCBfdG9rZW4KLVxbIDE3XF1cKHNlYyAgMlwpXChmbCAweDAwXClcKHR5ICAgYVwpXChzY2wgICAyXCkgXChueCAxXCkgMHhbMC05YS1mXSsgX3doYXQKLUFVWCBsbm5vIDAgc2l6ZSAweDQgdGFnbmR4IDQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU2NTk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBUaGlzIGZpbGUgd2FzIGNvbXBpbGVkIGZyb20gdGhpcyBDIHNvdXJjZToKLQljaGFyIHRva2VuID0wOwotCWVudW0gdG9rZW4gewotCSAgICAgICAgb3BlcmF0b3IsCi0JICAgICAgICBmbGFncwotCX07Ci0JIAotCWVudW0gdG9rZW4gd2hhdD0gb3BlcmF0b3I7Ci0gKi8KLQotCS5maWxlCSJmb28uYyIKLWdjYzJfY29tcGlsZWQuOgotX19fZ251X2NvbXBpbGVkX2M6Ci0uZ2xvYmwgX3Rva2VuCi0uZGF0YQotX3Rva2VuOgotCS5ieXRlIDAKLS50ZXh0Ci0JLmRlZglfdG9rZW4KLQkuc2NsCTE1Ci0JLnR5cGUJMDEyCi0JLnNpemUJNAotCS5lbmRlZgotCS5kZWYJX29wZXJhdG9yCi0JLnZhbAkwCi0JLnNjbAkxNgotCS50eXBlCTAxMwotCS5lbmRlZgotCS5kZWYJX2ZsYWdzCi0JLnZhbAkxCi0JLnNjbAkxNgotCS50eXBlCTAxMwotCS5lbmRlZgotCS5kZWYJLmVvcwotCS52YWwJNAotCS5zY2wJMTAyCi0JLnRhZwlfdG9rZW4KLQkuc2l6ZQk0Ci0JLmVuZGVmCi0uZ2xvYmwgX3doYXQKLS5kYXRhCi0JLnAyYWxpZ24gMgotX3doYXQ6Ci0JLmxvbmcgMAotLnRleHQKLQkuZGVmCV90b2tlbgotCS52YWwJX3Rva2VuCi0JLnNjbAkyCi0JLnR5cGUJMDIKLQkuZW5kZWYKLQkuZGVmCV93aGF0Ci0JLnZhbAlfd2hhdAotCS5zY2wJMgotCS50YWcJX3Rva2VuCi0JLnNpemUJNAotCS50eXBlCTAxMgotCS5lbmRlZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbW1lbnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmM2NDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbW1lbnQucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBUaGlzIHRlc3QgZmlsZSBpcyB0byBzZWUgd2hldGhlciBjb21tZW50cyBnZXQgd3JpdHRlbiBpbnRvIGxpc3RpbmdzCi0jIGNvcnJlY3RseS4gIFRoZSBmaWxlIGhhcyBubyByZWFsIGNvbnRlbnRzLgotLyogQyBjb21tZW50cyB0b28hICovCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlMzk0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgb3V0cHV0IG9mIGdhcyAtYWxjIGNvbmQucy4KLQotLipjb25kLnMuKgotCi0KLSAgIDFbIAldKy5pZgkwCi0gICA4WyAJXSsuZWxzZQotICAgOVsgCV0rLmlmCTEKLSAgMTBbIAldKy5lbmRjCi0gIDExIDAwMDAgMFswMl0wMCA/MDAwWzAyXVsgCV0rLmxvbmdbIAldKzIKLSAgMTJbIAldKy5pZgkwCi0gIDE0WyAJXSsuZWxzZQotICAxNSAwMDA0IDBbMDRdMDAgPzAwMFswNF1bIAldKy5sb25nWyAJXSs0Ci0gIDE2WyAJXSsuZW5kYwotICAxN1sgCV0rLmVuZGMKLSAgMTggMDAwOCAwMDAwID8wMDAwWyAJXSsucDJhbGlnbiA1LDAKLSAgMThbIAldKzAwMDAgPzAwMDAgCi0gIDE4WyAJXSswMDAwID8wMDAwIAotICAxOFsgCV0rMDAwMCA/MDAwMCAKLSAgMThbIAldKzAwMDAgPzAwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ODMyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5pZgkwCi0JLmlmCTEKLQkuZW5kYwotCS5sb25nCTAKLQkuaWYJMAotCS5sb25nCTEKLQkuZW5kYwotCS5lbHNlCi0JLmlmCTEKLQkuZW5kYwotCS5sb25nCTIKLQkuaWYJMAotCS5sb25nCTMKLQkuZWxzZQotCS5sb25nCTQKLQkuZW5kYwotCS5lbmRjCi0JLnAyYWxpZ24gNSwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZGlmZjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9kaWZmMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGE4OWZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9kaWZmMS5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIERpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZCBzeW1ib2xzLgotIyBUaGUgYXNzZW1ibGVyIHNob3VsZCByZWplY3QgdGhpcy4KLQkudGV4dAotCS5nbG9ibCBfZm9vCi1fZm9vOgkubG9uZyBfYSAtIF9iCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk4Y2FkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLnRleHQKLWZvbzoJLnNpbmdsZQkwcjEuMjM0NWUrMDYKLQkuc2luZ2xlIDBmMy4xNDE1OQotCS5kb3VibGUgMHIyLjcxODI4MgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZ2FzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzOTcwNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZ2FzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0jCi0jIFRoZXNlIHRlc3RzIHNob3VsZCBiZSB2YWxpZCBvbiBhbGwgdGFyZ2V0cy4KLSMKLQotIyBJIHRoaW5rIGN1cnJlbnRseSBhbGwgdGFyZ2V0cyBmYWlsIHRoaXMgb25lIHdoZW4gbGlzdGluZ3MgYXJlIGVuYWJsZWQuCi1nYXNfdGVzdCAicDI0MjUucyIgIiIgICAiIiAicGNyZWwgdmFsdWVzIGluIGFzc2lnbm1lbnQiCi0KLSMgcDE0ODAucyB1c2VzIGEgIi5zcGFjZSIgZGlyZWN0aXZlIHdoaWNoIGZvciBtb3N0IGFzc2VtYmxlcnMgbWVhbnMKLSMgImFsbG9jYXRlIHNvbWUgc3BhY2UiLiAgT24gdGhlIFBBIGl0IG1lYW5zICJzd2l0Y2ggaW50byB0aGlzIHNwYWNlIi4KLSMKLSMgVGhlcmVmb3JlIHRoaXMgdGVzdCAoYXMgaXQgaXMgY3VycmVudGx5IHdyaXR0ZW4pIGlzIGNvbXBsZXRlbHkgYm9ndXMKLSMgZm9yIGFueSBQQSB0YXJnZXQuICBEbyBub3QgYm90aGVyIHRyeWluZyB0byBydW4gaXQgYW5kIGp1c3QgY2xhaW0KLSMgaXQgZmFpbHMuCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICBzZXR1cF94ZmFpbCAqLSotKgotICAgIGZhaWwgInNpbXBsaWZpYWJsZSBkb3VibGUgc3VidHJhY3Rpb24iCi19IGVsc2UgewotICAgIGdhc190ZXN0ICJwMTQ4MC5zIiAiIiAiLWE+IiAic2ltcGxpZmlhYmxlIGRvdWJsZSBzdWJ0cmFjdGlvbiIKLX0KLQotZ2FzX3Rlc3QgImZsb2F0LnMiICIiICAgIiIgInNpbXBsZSBGUCBjb25zdGFudHMiCi0KLSMgVGhpcyB0ZXN0IGlzIG1lYW5pbmdsZXNzIGZvciB0aGUgUEE7IHRoZSBkaWZmZXJlbmNlIG9mIHR3byB1bmRlZmluZWQKLSMgc3ltYm9scyBpcyBzb21ldGhpbmcgdGhhdCBpcyAoYW5kIG11c3QgYmUpIHN1cHBvcnRlZCBvbiB0aGUgUEEuCi1pZiAhW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3RfZXJyb3IgImRpZmYxLnMiICIiICJkaWZmZXJlbmNlIG9mIHR3byB1bmRlZmluZWQgc3ltYm9scyIKLX0KLQotcHJvYyBkb19jb21tZW50IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbW1lbnQuczogY29tbWVudHMgaW4gbGlzdGluZ3MiCi0gICAgc2V0IHgxIDAKLSAgICBzZXQgeDIgMAotICAgIHNldCB4MyAwCi0gICAgc2V0IHdoaXRlIHtbIFx0XSp9Ci0gICAgZ2FzX3N0YXJ0ICJjb21tZW50LnMiICItYWwiCi0gICAgd2hpbGUgMSB7Ci0jIEFwcGFyZW50bHkgQ1JMRiBpcyByZWNlaXZlZCB3aGVuIHVzaW5nIHB0eXMgZm9yIHN1YnByb2Nlc3NlczsgaGVuY2UgdGhlCi0jIFxyXG4gZm9yIGxpbmUgMy4KLQlleHBlY3QgewotCSAgICAtcmUgIl4gKzFcWyBcdFxdKyMgVGhpc1xbXlxuXF0qXG4iCQl7IHNldCB4MSAxIH0KLQkgICAgLXJlICJeICsyXFsgXHRcXSsjIGNvcnJlY3RseVxbXlxuXF0qXG4iCXsgc2V0IHgyIDEgfQotCSAgICAtcmUgIl4gKzNcWyBcdFxdKy8uIEMgY29tbWVudHMgdG9vLiAuL1xyP1xuIiB7IHNldCB4MyAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmIFthbGxfb25lcyAkeDEgJHgyICR4M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotZG9fY29tbWVudAotCi0jCi0jIFRlc3QgeDkzMDUwOWEgLS0gY29ycmVjdCBhc3NlbWJseSBvZiBkaWZmZXJlbmNlcyBpbnZvbHZpbmcgZm9yd2FyZAotIyByZWZlcmVuY2VzLgotIwotCi1wcm9jIGRvXzkzMDUwOWEge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGlmZmVyZW5jZSBiZXR3ZWVuIGZvcndhcmQgcmVmZXJlbmNlcyIKLSAgICBzZXQgeCAwCi0gICAgZ2FzX3N0YXJ0ICJ4OTMwNTA5LnMiICItYWwiCi0gICAgd2hpbGUgMSB7Ci0jIFdlIG5lZWQgdG8gYWNjb21vZGF0ZSBib3RoIGJ5dGUgb3JkZXJzIGhlcmUuCi0jIElmICIubG9uZyIgbWVhbnMgYW4gOC1ieXRlIHZhbHVlIG9uIHNvbWUgdGFyZ2V0IHNvbWVkYXksIHRoaXMgdGVzdCB3aWxsIGhhdmUKLSMgdG8gYmUgZml4ZWQuCi0JZXhwZWN0IHsKLQkgICAgLXJlICJeICsxIC4uLi4gMDAwMCAqMDAwMCIgeyBmYWlsICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXiArMSAuLi4uIDA0MDAgKjAwMDAiIHsgcGFzcyAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIl4gKzEgLi4uLiAwMDAwICowMDA0IiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIiB7IH0KLQkgICAgdGltZW91dCB7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YgeyBicmVhayB9Ci0JfQotICAgIH0KLSAgICBnYXNfZmluaXNoCi0gICAgaWYgISR4IHRoZW4geyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLSMgVGhpcyB0ZXN0IGlzIG1lYW5pbmdsZXNzIGZvciB0aGUgUEE7IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzCi0jIG11c3Qgbm90IGJlIHJlc29sdmVkIGJ5IHRoZSBhc3NlbWJsZXIuCi1pZiAhW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyB0aGUgdmF4IGZhaWxzIGJlY2F1c2UgVk1TIGNhbiBhcHBhcmVudGx5IGFjdHVhbGx5IGhhbmRsZSB0aGlzCi0gICAgIyBjYXNlIGluIHJlbG9jcywgc28gZ2FzIGRvZXNuJ3QgaGFuZGxlIGl0IGl0c2VsZi4KLSAgICBzZXR1cF94ZmFpbCAidmF4Ki0qLXZtcyoiCi0gICAgc2V0dXBfeGZhaWwgIm1uMTAzMDAqLSotKiIKLSAgICBzZXR1cF94ZmFpbCAibW4xMDIwMCotKi0qIgotICAgIGRvXzkzMDUwOWEKLX0KLQotY2FzZSAkdGFyZ2V0X3RyaXBsZXQgaW4gewotICAgIHsgaHBwYSotKi0qIH0geyB9Ci0gICAgZGVmYXVsdCB7Ci0JcnVuX2R1bXBfdGVzdCBzdHJ1Y3QKLQlydW5fZHVtcF90ZXN0IGFsaWduCi0gICAgfQotfQotCi0jIFRoaXMgdGVzdCBpcyBmb3IgYW55IENPRkYgdGFyZ2V0LgotIyBXZSBvbWl0IG04OGsgQ09GRiBiZWNhdXNlIGl0IHVzZXMgd2VpcmQgcHNldWRvLW9wIG5hbWVzLgotIyBXZSBvbWl0IHRoZSBBUk0gdG9vbGNoYWlucyBiZWNhdXNlIHRoZXkgZGVmaW5lIGxvY2FscyB0bwotIyAgc3RhcnQgd2l0aCAnLicsIHdoaWNoIGVsaW1pbmF0ZXMgLmVvcywgLnRleHQgZXRjIGZyb20gdGhlIG91dHB1dC4KLWlmIHsgICAoW2lzdGFyZ2V0ICotKi1jb2ZmKl0gJiYgIVtpc3RhcmdldCBtODgqLSotKl0gJiYgIVtpc3RhcmdldCAqYXJtKi0qLWNvZmZdICYmICFbaXN0YXJnZXQgdGh1bWIqLSotY29mZl0pIFwKLSAgICAgfHwoW2lzdGFyZ2V0ICotKi1wZSpdICYmICFbaXN0YXJnZXQgYXJtKi0qLXBlKl0gJiYgIVtpc3RhcmdldCB0aHVtYiotKi1wZSpdKSBcCi0gICAgIHx8IFtpc3RhcmdldCBhMjlrLSotdWRpKl0gXAotICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLWVibW9uKl0gXAotICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLXN5bSpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi12eHdvcmtzKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWFpeCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1zY28qXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotaXNjKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWdvMzIqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotY3lnd2luKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLSpudF0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWludGVyaXgqXSBcCi0gICAgIHx8IChbaXN0YXJnZXQgaTk2MC0qLXZ4d29ya3M1LipdICYmICFbaXN0YXJnZXQgaTk2MC0qLXZ4d29ya3M1LjAqXSkgfSB7Ci0gICAgcnVuX2R1bXBfdGVzdCBjb2ZmdGFnCi19Ci0KLSMgVGVzdCBvbWl0dGluZyBjb25kaXRpb25hbHMgZnJvbSBsaXN0aW5ncy4KLXByb2MgdGVzdF9jb25kIHt9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotCi0gICAgc2V0IHRlc3RuYW1lICJjb25kaXRpb25hbCBsaXN0aW5ncyIKLSAgICBnYXNfcnVuIGNvbmQucyAtYWxjICI+ZHVtcC5vdXQiCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCWZhaWwgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiB7IFtyZWdleHBfZGlmZiBkdW1wLm91dCAkc3JjZGlyLyRzdWJkaXIvY29uZC5kXSB9IHsKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0KLSAgICB9Ci19Ci0KLXRlc3RfY29uZAotCi0jIEZJWE1FOiB0aGlzIGlzIGhlcmUgY2F1c2Ugb2YgYSBidWcgaW4gRGVqYUdudSAxLjEuMS4gV2hlbiBpdCBpcyBubyBsb25nZXIKLSMgICAgICAgIGluIHVzZSwgdGhlbiB0aGlzIGNhbiBiZSByZW1vdmVkLgotaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgdW5zZXQgZXJyb3JJbmZvCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzY2ZGZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCi0gICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgotICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCi0gICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KLSAgICA7IFRoZSAicDxuPiIgcmVwcmVzZW50IHByb2Nlc3NvcnMgb2YgYSBtdWx0aS1wcm9jZXNzb3Igc3lzdGVtLgotCi0gICAgcDEgZHJlZyBkMSAxICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQxIiBmb3IgQ09QMSBoYXMgdmFsdWUgMQotICAgIHAxIGNyZWcgYzMgMyAgICAgICAgOyBjdHJsIHJlZ2lzdGVyICJjMyIgZm9yIENPUDEgaGFzIHZhbHVlIDMKLSAgICBwMyBpbnNuIGZpZSAweDFlOjI0LTIwICAgICAgOyBmdW5jdGlvbiAiZmlsbCIgZm9yIENPUDMgaGFzIHZhbHVlIDMxCi0gICAgcDMgZHJlZyBkMyAzICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotICAgIHAzIGNyZWcgYzIgMjIgICAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0gICAgcDMgaW5zbiBmZWUgMHgxZToyNC0yMCxkcmVnOjE3LTEzLGNyZWc6MTItOCxpbW1lZDo3LTAKLQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZnVtIDB4MDFlMDAwMDEgZHJlZzoxNy0xMyBjcmVnOjEyLTgKLSAgICBwMyBpbnNuIGZvaCAweGY6MjQtMjEgZHJlZzoyMC0xNiBpbW1lZDoxNS0wCi0KLSAgICBwMyBpbnNuIHBpZyAweDE6MjQtMjEqWzB4MTAwfDB4Ml0sIGRyZWc6MjAtMTYsIGltbWVkOjE1LTAqMHgxMDAwMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzQ1NGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLQotCi0vKiBpdGJsLXRlc3QuYwotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogU3RhbmQtYWxvbmUgdGVzdCBmb3IgaW5zdHJ1Y3Rpb24gc3BlY2lmaWNhdGlvbiB0YWJsZSBzdXBwb3J0LgotICAgUnVuIHVzaW5nICJpdGJsLXRlc3QgPGl0Ymw+IDxhc20ucz4iCi0gICB3aGVyZSA8aXRibD4gaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uIHRhYmxlLAotICAgYW5kIDxhc20ucz4gaXMgdGhlIG5hbWUgb2YgdGhlIGFzc2VtYmxlciBmaWUuICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLQotc3RhdGljIGludCB0ZXN0X3JlZyAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKLQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCk7Ci0KLWludCAKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgdW5zaWduZWQgaW50IGluc247Ci0gIEZJTEUgKmZhczsKLSAgaW50IGFsaW5lID0gMDsKLSAgY2hhciBzWzgxXSwgKm5hbWU7Ci0KLSAgaWYgKGFyZ2MgPCAzKQotICAgIHsKLSAgICAgIHByaW50ZiAoInVzYWdlOiAlcyBpdGJsIGFzbS5zXG4iLCBhcmd2WzBdKTsKLSAgICAgIGV4aXQgKDApOwotICAgIH0KLSAgaWYgKGl0YmxfcGFyc2UgKGFyZ3ZbMV0pICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbGVkIHRvIHBhcnNlIGl0YmxcbiIpOwotICAgICAgZXhpdCAoMCk7Ci0gICAgfQotCi0gIGZhcyA9IGZvcGVuIChhcmd2WzJdLCAiciIpOwotICBpZiAoZmFzID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbGVkIHRvIG9wZW4gYXNtIGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOwotICAgICAgZXhpdCAoMCk7Ci0gICAgfQotICB3aGlsZSAoZmdldHMgKHMsIDgwLCBmYXMpKQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBhbGluZSsrOwotCi0gICAgICBpZiAocCA9IHN0cmNociAocywgJzsnKSwgcCkJLyogc3RyaXAgY29tbWVudHMgKi8KLQkqcCA9IDA7Ci0gICAgICBpZiAocCA9IHN0cmNociAocywgJyMnKSwgcCkJLyogc3RyaXAgY29tbWVudHMgKi8KLQkqcCA9IDA7Ci0gICAgICBwID0gcyArIHN0cmxlbiAocykgLSAxOwotICAgICAgd2hpbGUgKHAgPj0gcyAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJykpCS8qIHN0cmlwIHRyYWlsaW5nIHNwYWNlcyAqLwotCXAtLTsKLSAgICAgICoocCArIDEpID0gMDsKLSAgICAgIHAgPSBzOwotICAgICAgd2hpbGUgKCpwICYmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXG4nKSkJLyogc3RyaXAgbGVhZGluZyBzcGFjZXMgKi8KLQlwKys7Ci0gICAgICBpZiAoISpwKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gaXRibF9nZXRfZmllbGQgKCZwKTsKLSAgICAgIGluc24gPSBpdGJsX2Fzc2VtYmxlIChuYW1lLCBwKTsKLSAgICAgIGlmIChpbnNuID09IDApCi0JcHJpbnRmICgibGluZSAlZDogSW52YWxpZCBpbnN0cnVjdGlvbiAoJXMpXG4iLCBhbGluZSwgcyk7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBidWZbMTI4XTsKLQkgIHByaW50ZiAoImxpbmUgJWQ6IGluc24oJXMpID0gMHgleClcbiIsIGFsaW5lLCBzLCBpbnNuKTsKLQkgIGlmICghaXRibF9kaXNhc3NlbWJsZSAoYnVmLCBpbnNuKSkKLQkgICAgcHJpbnRmICgibGluZSAlZDogQ2FuJ3QgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb24gIgotCQkgICAgIigweCV4KVxuIiwgYWxpbmUsIGluc24pOwotCSAgZWxzZQotCSAgICBwcmludGYgKCJsaW5lICVkOiBkaXNhc20oMHgleCkgPSAlcylcbiIsIGFsaW5lLCBpbnNuLCBidWYpOwotCX0KLSAgICB9Ci0KLSAgdGVzdF9yZWcgKDEsIGVfZHJlZywgImQxIiwgMSk7Ci0gIHRlc3RfcmVnICgzLCBlX2NyZWcsICJjMiIsIDIyKTsKLSAgdGVzdF9yZWcgKDMsIGVfZHJlZywgImQzIiwgMyk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgCi10ZXN0X3JlZyAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKLQkgIHVuc2lnbmVkIGxvbmcgdmFsKQotewotICBjaGFyICpuOwotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgbiA9IGl0YmxfZ2V0X25hbWUgKHByb2Nlc3NvciwgdHlwZSwgdmFsKTsKLSAgaWYgKCFuIHx8IHN0cmNtcCAobiwgbmFtZSkpCi0gICAgcHJpbnRmICgiRXJyb3IgLSByZWcgbmFtZSBub3QgZm91bmQgZm9yIHByb2Vzc29yPSVkLCB0eXBlPSVkLCB2YWw9JWRcbiIsCi0JICAgIHByb2Nlc3NvciwgdHlwZSwgdmFsKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIm5hbWU9JXMgZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgdmFsPSVkXG4iLAotCSAgICBuLCBwcm9jZXNzb3IsIHR5cGUsIHZhbCk7Ci0KLSAgLyogV2UgcmVxdWlyZSB0aGF0IG5hbWVzIGJlIHVuaXF1ZSBhbW91bmcgcHJvY2Vzc29ycyBhbmQgdHlwZXMuICovCi0gIGlmICghIGl0YmxfZ2V0X3JlZ192YWwgKG5hbWUsICZ2KQotICAgICAgfHwgdiAhPSB2YWwpCi0gICAgcHJpbnRmICgiRXJyb3IgLSByZWcgdmFsIG5vdCBmb3VuZCBmb3IgcHJvY2Vzc29yPSVkLCB0eXBlPSVkLCBuYW1lPSVzXG4iLAotCSAgICBwcm9jZXNzb3IsIHR5cGUsIG5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmICgidmFsPTB4JXggZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgbmFtZT0lc1xuIiwKLQkgICAgdiwgcHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1MWFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi0gICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgotICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCi0gICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KLQotICAgIDsgQXNzZW1ibGUgcHJvY2Vzc29yIGluc3RydWN0aW9ucyBhcyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIGZlZSAkZDMsJGMyLDB4MSAJOyAgMHg0ZmYwNzYwMQotICAgIGZpZSAJICAJOyAgMHg0ZmYwMDAwMAotICAgIGZvaCAkMiwweDEwMAotICAgIGZ1bSAkZDMsJGMyICAgICAJOyAgMHg0ZmYwNzYwMQotICAgIHBpZyAkMiwweDEwMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMTQ4MC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDBiYTgxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMTQ4MC5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zdGFydDoJLmxvbmcgMCwgMSwgMiwgMywgNCwgNSwgNiwgNwotCS5zcGFjZSAweDgwIC0gKC4gLSBzdGFydCkKLWZvbzoJLmxvbmcgNDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AyNDI1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWRjOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AyNDI1LnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkudGV4dAotCS5nbG9ibCBfZnJvYm5pdHoKLV9mcm9ibml0ejoKLQkubG9uZyAxLCAyLCAzLCA0LCA1LCA2LCA3LCBHUlVNUCwgNDIKLQlHUlVNUD0uLV9mcm9ibml0egotCUhBTEZHUlVNUD1HUlVNUC8yCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzVkZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBzdHJ1Y3QKLQotIyBUZXN0IHRoZSAuc3RydWN0IHBzZXVkby1vcC4KLQotMCswMCBBIHcxCi0wKzAyIEEgdzIKLTArMDQgQSB3MwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWNmZDBiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuZ2xvYmwJdzEKLQkuZ2xvYmwJdzIKLQkuZ2xvYmwJdzMKLQkubG9uZwkwCi0JLnN0cnVjdAkwCi13MToJLnNob3J0CTAKLXcyOgkuc2hvcnQJMAotdzM6CS5zaG9ydAkwCi0JLnRleHQKLQkubG9uZwkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwveDkzMDUwOS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5OTk5MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwveDkzMDUwOS5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JLmxvbmcgTDItTDEKLUwxOgkubG9uZyAweDEyMzQKLUwyOgkubG9uZyAweDU2NzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZmN2U5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotLio6ICAgICBmaWxlIGZvcm1hdCBlY29mZi1saXR0bGVhbHBoYQotCi1Db250ZW50cyBvZiBzZWN0aW9uIC5yZGF0YToKLSAwMDAwIDcxYTM3OTA5IDRmOTMwYTQwIDU0NDE3ODlhIGNkNGI4ODFiICBxLnkuTy4uQFRBeC4uSy4uCi0gMDAxMCAyYTQwNGY5MyA3OTA5NzFhMyA3ODlhNTQ0MCA1NDQxNzg5YSAgLkBPLnkucS54LlRAVEF4LgotIDAwMjAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYzg4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jCi0jIEFscGhhIE9TRi8xIHRlc3RzCi0jCi0KLWlmIFtpc3RhcmdldCBhbHBoYS0qLW9zZipdIHRoZW4gewotICAgIHNldCB0ZXN0bmFtZSAiZnAgY29uc3RhbnRzIChwYXJ0IDIpIgotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZwLnMiICIiICJmcCBjb25zdGFudHMgKHBhcnQgMSkiXSB0aGVuIHsKLQlvYmpkdW1wICItcyAtaiAucmRhdGEgPiBhLmR1bXAiCi0JaWYgeyBbcmVnZXhwX2RpZmYgImEuZHVtcCIgIiRzcmNkaXIvJHN1YmRpci9mcC5kIl0gPT0gMCB9IHRoZW4gewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ViYmJlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLnJkYXRhCi0jIFRoZXNlIHRocmVlIGZvcm1hdHMgYXJlIDggYnl0ZXMgZWFjaC4KLQkudF9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg3MSwgMHhhMywgMHg3OSwgMHgwOSwgMHg0ZiwgMHg5MywgMHgwYSwgMHg0MAotCS5kX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDU0LCAweDQxLCAweDc4LCAweDlhLCAweGNkLCAweDRiLCAweDg4LCAweDFiCi0JLmdfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4MmEsIDB4NDAsIDB4NGYsIDB4OTMsIDB4NzksIDB4MDksIDB4NzEsIDB4YTMKLSMgVGhlIG5leHQgdHdvIGFyZSBmb3VyIGJ5dGVzIGVhY2guCi0JLnNfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NzgsIDB4OWEsIDB4NTQsIDB4NDAsIDAsIDAsIDAsIDAKLQkuZl9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg1NCwgMHg0MSwgMHg3OCwgMHg5YSwgMCwgMCwgMCwgMAotCS5sb25nIDAsIDAsIDAsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFjZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgQElDKzBAMDA4MjAwCUBPQ0AgcjAscjEKLTAwMDAwMDA0IEBJQyszQDZlMzgwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCBASUMrMEAxZmZlMDAJQE9DQCByMCwwCi0wMDAwMDAwYyBASUMrMEAzZmZmZmYJQE9DQCByMSwtMQotMDAwMDAwMTAgQElDKzdAZTEwNDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgQElDKzdAZTE4N2ZmCUBPQ0AgLTEscjMKLTAwMDAwMDE4IEBJQyswQDlmZmVmZglAT0NAIHI0LDI1NQotMDAwMDAwMWMgQElDKzdAZTI4YWZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCBASUMrMEBkZmZmMDAJQE9DQCByNiwtMjU2Ci0wMDAwMDAyNCBASUMrN0BlMzhmMDAJQE9DQCAtMjU2LHI3Ci0wMDAwMDAyOCBASUMrMUAxZjdjMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIEBJQysxQDNmN2MwMAlAT0NAIHI5LC0yNTcKLTAwMDAwMDM4IEBJQys3QGM1MTQwMAlAT0NAIDUxMSxyMTAKLTAwMDAwMDQwIEBJQysxQDdmN2MwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCBASUMrN0BjNjE4MDAJQE9DQCAzMDU0MTk4OTYscjEyCi0wMDAwMDA1MCBASUMrN0BmZjdjZmYJQE9DQCAyNTUsMjU2Ci0wMDAwMDA1OCBASUMrN0BkZmZlZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCBASUMrMEAxZjdjMDAJQE9DQCByMCwwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiBmb28KLTAwMDAwMDY4IEBJQyswQDAwODIwMAlAT0NAIHIwLHIxCi0wMDAwMDA2YyBASUMrMEA2MjA4MDAJQE9DQCByMyxyNAotMDAwMDAwNzAgQElDKzBAYzM4ZTAxCUBPQ0AuZXEgcjYscjcKLTAwMDAwMDc0IEBJQysxQDI1MTQwMQlAT0NALmVxIHI5LHIxMAotMDAwMDAwNzggQElDKzFAODY5YTAyCUBPQ0AubmUgcjEyLHIxMwotMDAwMDAwN2MgQElDKzFAZTgyMDAyCUBPQ0AubmUgcjE1LHIxNgotMDAwMDAwODAgQElDKzJANDlhNjAzCUBPQ0AucCByMTgscjE5Ci0wMDAwMDA4NCBASUMrMkBhYjJjMDMJQE9DQC5wIHIyMSxyMjIKLTAwMDAwMDg4IEBJQyszQDBjYjIwNAlAT0NALm4gcjI0LHIyNQotMDAwMDAwOGMgQElDKzNANmUzODA0CUBPQ0AubiBmcCxzcAotMDAwMDAwOTAgQElDKzNAY2ZiZTA1CUBPQ0AuYyBpbGluazIsYmxpbmsKLTAwMDAwMDk0IEBJQys0QDMxNDQwNQlAT0NALmMgcjMzLHIzNAotMDAwMDAwOTggQElDKzRAOTJjYTA1CUBPQ0AuYyByMzYscjM3Ci0wMDAwMDA5YyBASUMrNEBmNDUwMDYJQE9DQC5uYyByMzkscjQwCi0wMDAwMDBhMCBASUMrNUA1NWQ2MDYJQE9DQC5uYyByNDIscjQzCi0wMDAwMDBhNCBASUMrNUBiNzVjMDYJQE9DQC5uYyByNDUscjQ2Ci0wMDAwMDBhOCBASUMrNkAxOGUyMDcJQE9DQC52IHI0OCxyNDkKLTAwMDAwMGFjIEBJQys2QDdhNjgwNwlAT0NALnYgcjUxLHI1MgotMDAwMDAwYjAgQElDKzZAZGJlZTA4CUBPQ0AubnYgcjU0LHI1NQotMDAwMDAwYjQgQElDKzdAM2Q3NDA4CUBPQ0AubnYgcjU3LHI1OAotMDAwMDAwYjggQElDKzdAOWU3ODA5CUBPQ0AuZ3QgbHBfY291bnQsbHBfY291bnQKLTAwMDAwMGJjIEBJQyswQDFmN2MwYQlAT0NALmdlIHIwLDAKLTAwMDAwMGM0IEBJQys3QGMwODIwYglAT0NALmx0IDEscjEKLTAwMDAwMGNjIEBJQys3QGRmN2MwYwlAT0NALmxlIDIsMgotMDAwMDAwZDQgQElDKzBANjE4NjBkCUBPQ0AuaGkgcjMscjMKLTAwMDAwMGQ4IEBJQyswQDgyMDgwZQlAT0NALmxzIHI0LHI0Ci0wMDAwMDBkYyBASUMrMEBhMjhhMGYJQE9DQC5wbnogcjUscjUKLTAwMDAwMGUwIEBJQyswQDAwODMwMAlAT0NALmYgcjAscjEKLTAwMDAwMGU0IEBJQyswQDVlZmEwMQlAT0NALmYgcjIsMQotMDAwMDAwZTggQElDKzdAYTE4NjAxCUBPQ0AuZiAxLHIzCi0wMDAwMDBlYyBASUMrN0BhMjA4MDAJQE9DQC5mIDAscjQKLTAwMDAwMGYwIEBJQyswQGJmN2QwMAlAT0NALmYgcjUsNTEyCi0wMDAwMDBmOCBASUMrN0BjMzBkMDAJQE9DQC5mIDUxMixyNgotMDAwMDAxMDAgQElDKzdAZGY3ZDAwCUBPQ0AuZiA1MTIsNTEyCi0wMDAwMDEwOCBASUMrMEAwMDgzMDEJQE9DQC5lcS5mIHIwLHIxCi0wMDAwMDEwYyBASUMrMEAzZjdkMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMTE0IEBJQys3QGMxMDUwYglAT0NALmx0LmYgMCxyMgotMDAwMDAxMWMgQElDKzdAYzEwNTA5CUBPQ0AuZ3QuZiAxLHIyCi0wMDAwMDEyNCBASUMrMEAxZjdkMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAxMmMgQElDKzdAYzEwNTBhCUBPQ0AuZ2UuZiA1MTIscjIKLTAwMDAwMTM0IEBJQys3QGRmN2QwNAlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI0NDQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIyBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuYWwgcjAscjEKLQlAT0NALnJhIHIzLHI0Ci0JQE9DQC5lcSByNixyNwotCUBPQ0AueiByOSxyMTAKLQlAT0NALm5lIHIxMixyMTMKLQlAT0NALm56IHIxNSxyMTYKLQlAT0NALnBsIHIxOCxyMTkKLQlAT0NALnAgcjIxLHIyMgotCUBPQ0AubWkgcjI0LHIyNQotCUBPQ0AubiByMjcscjI4Ci0JQE9DQC5jcyByMzAscjMxCi0JQE9DQC5jIHIzMyxyMzQKLQlAT0NALmxvIHIzNixyMzcKLQlAT0NALmNjIHIzOSxyNDAKLQlAT0NALm5jIHI0MixyNDMKLQlAT0NALmhzIHI0NSxyNDYKLQlAT0NALnZzIHI0OCxyNDkKLQlAT0NALnYgcjUxLHI1MgotCUBPQ0AudmMgcjU0LHI1NQotCUBPQ0AubnYgcjU3LHI1OAotCUBPQ0AuZ3QgcjYwLHI2MAotCUBPQ0AuZ2UgcjAsMAotCUBPQ0AubHQgMSxyMQotCUBPQ0AubGUgMiwyCi0JQE9DQC5oaSByMyxyMwotCUBPQ0AubHMgcjQscjQKLQlAT0NALnBueiByNSxyNQotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMQotCUBPQ0AuZiByMiwxCi0JQE9DQC5mIDEscjMKLQlAT0NALmYgMCxyNAotCUBPQ0AuZiByNSw1MTIKLQlAT0NALmYgNTEyLHI2Ci0JQE9DQC5mIDUxMiw1MTIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEKLQlAT0NALm5lLmYgcjEsMAotCUBPQ0AubHQuZiAwLHIyCi0JQE9DQC5ndC5mIDEscjIKLQlAT0NALmxlLmYgcjAsNTEyCi0JQE9DQC5nZS5mIDUxMixyMgotCUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FyYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTg0NTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FyYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyBBUkMgZ2FzIHRlc3RzdWl0ZQotCi0jIFRlc3QgYW4gaW5zbiBmcm9tIGEgdGVtcGxhdGUgLnMvLmQuCi0jIFRoZSBiZXN0IHdheSB0byBjcmVhdGUgdGhlIC5kIGZpbGUgaXMgdG8gcnVuIHRoZSB0ZXN0cyB3aXRob3V0IGl0LCBsZXQKLSMgZGVqYWdudSBjcmFzaCwgcnVuIGFzLm5ldyBvbiB0aGUganVzdCBidWlsdCAucyBmaWxlLCBydW4gb2JqZHVtcCAtZHIgb24KLSMgdGhlIHJlc3VsdCBvZiB0aGF0LCBjb3B5IHRoZSByZXN1bHQgaW50byB0aGUgLmQgZmlsZSwgYW5kIGVkaXQgaW4gdGhlCi0jIG5lY2Vzc2FyeSBwYXR0ZXJucyAoQE9DQCwgZXRjLikuICBTb3VuZHMgY29tcGxpY2F0ZWQgYnV0IGl0J3MgZWFzeS4gIFRoZQotIyBjYXRjaCBpcyB0aGF0IHdlIGFzc3VtZSBhIHdvcmtpbmcgYXNzZW1ibGVyIGlzIHVzZWQgdG8gYnVpbGQgaXQuICBUaGF0J3MKLSMgb2J2aW91c2x5IG5vdCBlbnRpcmVseSBrb3NoZXIsIGJ1dCBvbmNlIHRoZSAuZCBmaWxlIGlzIGNyZWF0ZWQgb25lIGNhbgotIyB2ZXJpZnkgaXQncyBjb250ZW50cyBvdmVyIHRpbWUuCi0jCi0jIFRlbXBsYXRlIHBhdHRlcm5zOgotIyBAT0NAIC0gcGxhY2Vob2xkZXIgZm9yIHRoZSBvcGNvZGUKLSMgQElDKz9AIC0gcGxhY2UgaG9sZGVyIGZvciB0aGUgaW5zbiBjb2RlCi0jIEBJMys/P0AgLSBwbGFjZSBob2xkZXIgZm9yIHRoZSBvcGVyYXRpb24gY29kZSBvZiBjb2RlIDMgaW5zbnMuCi0KLXByb2MgdGVzdF90ZW1wbGF0ZV9pbnNuIHsgY3B1IHRtcGwgb3Bjb2RlIGljb2RlIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyIG9iamRpcgotCi0gICAgIyBDaGFuZ2UgQE9DQCBpbiB0aGUgdGVtcGxhdGUgZmlsZSB0byAkb3Bjb2RlCi0KLSAgICBzZXQgaW5fZmQgW29wZW4gJHNyY2Rpci8kc3ViZGlyLyR0bXBsLnMgcl0KLSAgICBzZXQgb3V0X2ZkIFtvcGVuICRvYmpkaXIvJG9wY29kZS5zIHddCi0gICAgIyBGSVhNRTogY2hlY2sgcmV0dXJuIGNvZGVzCi0KLSAgICBwdXRzICRvdXRfZmQgIlx0LmNwdSAkY3B1XG4iCi0gICAgd2hpbGUgeyBbZ2V0cyAkaW5fZmQgbGluZV0gPj0gMCB9IHsKLQlyZWdzdWIgIkBPQ0AiICRsaW5lICRvcGNvZGUgbGluZQotCXB1dHMgJG91dF9mZCAkbGluZQotICAgIH0KLQotICAgIGNsb3NlICRpbl9mZAotICAgIGNsb3NlICRvdXRfZmQKLQotICAgICMgQ3JlYXRlIG91dHB1dCB0ZW1wbGF0ZS4KLQotICAgIHNldCBpbl9mZCBbb3BlbiAkc3JjZGlyLyRzdWJkaXIvJHRtcGwuZCByXQotICAgIHNldCBvdXRfZmQgW29wZW4gJG9iamRpci8kb3Bjb2RlLmQgd10KLSAgICAjIEZJWE1FOiBjaGVjayByZXR1cm4gY29kZXMKLQotICAgIHdoaWxlIHsgW2dldHMgJGluX2ZkIGxpbmVdID49IDAgfSB7Ci0JcmVnc3ViICJAT0NAIiAkbGluZSAkb3Bjb2RlIGxpbmUKLQkjc2VuZF91c2VyICIkbGluZVxuIgotCWlmIFtzdHJpbmcgbWF0Y2ggIipASUMrP0AqIiAkbGluZV0gewotCSAgICAjIEluc2VydCB0aGUgb3Bjb2RlLiAgSXQgb2NjdXBpZXMgdGhlIHRvcCA1IGJpdHMuCi0JICAgIHJlZ2V4cCAiXiguKilASUNcXCsoLilAKC4qKSQiICRsaW5lIGp1bmsgbGVmdHBhcnQgbiByaWdodHBhcnQKLQkgICAgc2V0IG4gW2V4cHIgKCRpY29kZSA8PCAzKSArICRuXQotCSAgICBzZXQgbiBbZm9ybWF0ICIlMDJ4IiAkbl0KLQkgICAgcHV0cyAkb3V0X2ZkICIkbGVmdHBhcnQkbiRyaWdodHBhcnQiCi0JfSBlbHNlaWYgW3N0cmluZyBtYXRjaCAiKkBJMys/P0AqIiAkbGluZV0gewotCSAgICAjIEluc2VydCBpbnNuIDMgY29kZSAocmVnaXN0ZXIgQyBmaWVsZCkKLQkgICAgIyBiMTU9OC8wLCBiOD0xLzAgKHRoZWlyIHJlc3BlY3RpdmUgaGV4IHZhbHVlcyBpbiB0aGUgb2JqZHVtcCkKLQkgICAgcmVnZXhwICJeKC4qKUBJM1xcKyguKSguKUAoLiopJCIgJGxpbmUganVuayBsZWZ0cGFydCBiMTUgYjggcmlnaHRwYXJ0Ci0JICAgIHNldCBuIFtleHByICgkaWNvZGUgPDwgMSkgKyAoJGIxNSA8PCA0KSArICgkYjggPDwgMCldCi0JICAgIHNldCBuIFtmb3JtYXQgIiUwMngiICRuXQotCSAgICBwdXRzICRvdXRfZmQgIiRsZWZ0cGFydCRuJHJpZ2h0cGFydCIKLQl9IGVsc2UgewotCSAgICBwdXRzICRvdXRfZmQgJGxpbmUKLQl9Ci0gICAgfQotCi0gICAgY2xvc2UgJGluX2ZkCi0gICAgY2xvc2UgJG91dF9mZAotCi0gICAgIyBGaW5hbGx5LCBydW4gdGhlIHRlc3QuCi0KLSAgICBydW5fZHVtcF90ZXN0ICRvYmpkaXIvJG9wY29kZQotCi0gICAgIyAibWFrZSBjbGVhbiIgd29uJ3QgZGVsZXRlIHRoZXNlLCBzbyBmb3Igbm93IHdlIG11c3QuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG9iamRpci8kb3Bjb2RlLnMgJG9iamRpci8kb3Bjb2RlLmQiCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cy4KLQotaWYgW2lzdGFyZ2V0IGFyYyotKi0qXSB0aGVuIHsKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggYWRjIDkKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGFkZCA4Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBhbmQgMTIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGJpYyAxNAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggb3IgMTMKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIHNiYyAxMQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggc3ViIDEwCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCB4b3IgMTUKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIG1vdiAxMgotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIHJsYyA5Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYWxpYXMgYXNsIDgKLSMgYGxzbCcgZ2V0cyBkdW1wZWQgYXMgYGFzbCcgc28gdGhpcyBtdXN0IGJlIHRlc3RlZCBlbHNld2hlcmUuCi0jICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYWxpYXMgbHNsIDgKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBhc3IgMQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBsc3IgMgotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCByb3IgMwotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBycmMgNAotCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYnJhbmNoIGIgNAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBibCA1Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYnJhbmNoIGxwIDYKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImoiCi0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBzZXhiIDUKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBzZXh3IDYKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBleHRiIDcKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBleHR3IDgKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImZsYWciCi0jICAgIHJ1bl9kdW1wX3Rlc3QgIm5vcCIKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImxkIgotICAgIHJ1bl9kdW1wX3Rlc3QgInN0IgotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWIwMTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDx0ZXh0X2xhYmVsPiBASUMrN0BmZmZmODAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDA0IDx0ZXh0X2xhYmVsXCs0PiBASUMrN0BmZmZmMDAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDA4IDx0ZXh0X2xhYmVsXCs4PiBASUMrN0BmZmZlODAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDBjIDx0ZXh0X2xhYmVsXCtjPiBASUMrN0BmZmZlMDEJQE9DQGVxIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTAgPHRleHRfbGFiZWxcKzEwPiBASUMrN0BmZmZkODEJQE9DQGVxIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTQgPHRleHRfbGFiZWxcKzE0PiBASUMrN0BmZmZkMDIJQE9DQG5lIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTggPHRleHRfbGFiZWxcKzE4PiBASUMrN0BmZmZjODIJQE9DQG5lIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMWMgPHRleHRfbGFiZWxcKzFjPiBASUMrN0BmZmZjMDMJQE9DQHAgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyMCA8dGV4dF9sYWJlbFwrMjA+IEBJQys3QGZmZmI4MwlAT0NAcCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDI0IDx0ZXh0X2xhYmVsXCsyND4gQElDKzdAZmZmYjA0CUBPQ0BuIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMjggPHRleHRfbGFiZWxcKzI4PiBASUMrN0BmZmZhODQJQE9DQG4gMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyYyA8dGV4dF9sYWJlbFwrMmM+IEBJQys3QGZmZmEwNQlAT0NAYyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDMwIDx0ZXh0X2xhYmVsXCszMD4gQElDKzdAZmZmOTg1CUBPQ0BjIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMzQgPHRleHRfbGFiZWxcKzM0PiBASUMrN0BmZmY5MDUJQE9DQGMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzOCA8dGV4dF9sYWJlbFwrMzg+IEBJQys3QGZmZjg4NglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzYyA8dGV4dF9sYWJlbFwrM2M+IEBJQys3QGZmZjgwNglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0MCA8dGV4dF9sYWJlbFwrNDA+IEBJQys3QGZmZjc4NglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0NCA8dGV4dF9sYWJlbFwrNDQ+IEBJQys3QGZmZjcwNwlAT0NAdiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDQ4IDx0ZXh0X2xhYmVsXCs0OD4gQElDKzdAZmZmNjg3CUBPQ0B2IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNGMgPHRleHRfbGFiZWxcKzRjPiBASUMrN0BmZmY2MDgJQE9DQG52IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTAgPHRleHRfbGFiZWxcKzUwPiBASUMrN0BmZmY1ODgJQE9DQG52IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTQgPHRleHRfbGFiZWxcKzU0PiBASUMrN0BmZmY1MDkJQE9DQGd0IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTggPHRleHRfbGFiZWxcKzU4PiBASUMrN0BmZmY0OGEJQE9DQGdlIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNWMgPHRleHRfbGFiZWxcKzVjPiBASUMrN0BmZmY0MGIJQE9DQGx0IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjAgPHRleHRfbGFiZWxcKzYwPiBASUMrN0BmZmYzOGMJQE9DQGxlIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjQgPHRleHRfbGFiZWxcKzY0PiBASUMrN0BmZmYzMGQJQE9DQGhpIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjggPHRleHRfbGFiZWxcKzY4PiBASUMrN0BmZmYyOGUJQE9DQGxzIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNmMgPHRleHRfbGFiZWxcKzZjPiBASUMrN0BmZmYyMGYJQE9DQHBueiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4gQElDKzdAZmZmZjgwCUBPQ0AgMDAwMDAwNzAgPHRleHRfbGFiZWxcKzcwPgotCQlSRUxPQzogMDAwMDAwNzAgUl9BUkNfQjIyX1BDUkVMIGV4dGVybmFsX3RleHRfbGFiZWwKLTAwMDAwMDc0IDx0ZXh0X2xhYmVsXCs3ND4gQElDKzBAMDAwMDAwCUBPQ0AgMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PgotMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PiBASUMrN0BmZmYwYTAJQE9DQC5kIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwN2MgPHRleHRfbGFiZWxcKzdjPiBASUMrN0BmZmYwMDAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDgwIDx0ZXh0X2xhYmVsXCs4MD4gQElDKzdAZmZlZmMwCUBPQ0AuamQgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4NCA8dGV4dF9sYWJlbFwrODQ+IEBJQys3QGZmZWYyMQlAT0NAZXEuZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDg4IDx0ZXh0X2xhYmVsXCs4OD4gQElDKzdAZmZlZTgyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDhjIDx0ZXh0X2xhYmVsXCs4Yz4gQElDKzdAZmZlZTQ2CUBPQ0BuYy5qZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMTYxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIEBPQ0AgdGVzdAotCQotdGV4dF9sYWJlbDoKLQotIyBDb25kaXRpb24gdGVzdHMKLQlAT0NACXRleHRfbGFiZWwKLQlAT0NAYWwJdGV4dF9sYWJlbAotCUBPQ0ByYQl0ZXh0X2xhYmVsCi0JQE9DQGVxCXRleHRfbGFiZWwKLQlAT0NAegl0ZXh0X2xhYmVsCi0JQE9DQG5lCXRleHRfbGFiZWwKLQlAT0NAbnoJdGV4dF9sYWJlbAotCUBPQ0BwbAl0ZXh0X2xhYmVsCi0JQE9DQHAJdGV4dF9sYWJlbAotCUBPQ0BtaQl0ZXh0X2xhYmVsCi0JQE9DQG4JdGV4dF9sYWJlbAotCUBPQ0Bjcwl0ZXh0X2xhYmVsCi0JQE9DQGMJdGV4dF9sYWJlbAotCUBPQ0Bsbwl0ZXh0X2xhYmVsCi0JQE9DQGNjCXRleHRfbGFiZWwKLQlAT0NAbmMJdGV4dF9sYWJlbAotCUBPQ0Bocwl0ZXh0X2xhYmVsCi0JQE9DQHZzCXRleHRfbGFiZWwKLQlAT0NAdgl0ZXh0X2xhYmVsCi0JQE9DQHZjCXRleHRfbGFiZWwKLQlAT0NAbnYJdGV4dF9sYWJlbAotCUBPQ0BndAl0ZXh0X2xhYmVsCi0JQE9DQGdlCXRleHRfbGFiZWwKLQlAT0NAbHQJdGV4dF9sYWJlbAotCUBPQ0BsZQl0ZXh0X2xhYmVsCi0JQE9DQGhpCXRleHRfbGFiZWwKLQlAT0NAbHMJdGV4dF9sYWJlbAotCUBPQ0BwbnoJdGV4dF9sYWJlbAotCi0JQE9DQAlleHRlcm5hbF90ZXh0X2xhYmVsCi0KLQlAT0NACTAKLQotIyBEZWxheSBzbG90cwotCUBPQ0AuZAl0ZXh0X2xhYmVsCi0JQE9DQC5uZAl0ZXh0X2xhYmVsCi0JQE9DQC5qZAl0ZXh0X2xhYmVsCi0KLSMgQ29uZGl0aW9uIHRlc3RzIGFuZCBkZWxheSBzbG90cwotCUBPQ0BlcS5kCXRleHRfbGFiZWwKLQlAT0NAbmUubmQJdGV4dF9sYWJlbAotCUBPQ0BjYy5qZAl0ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmMzZkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGZsYWcKLQotIyBUZXN0IHRoZSBmbGFnIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLU5vIHN5bWJvbHMgaW4gImEub3V0Ii4KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxZmEwMDAwMAlmbGFnIHIwCi0wMDAwMDAwNCAxZmJmODAwMQlmbGFnIDEKLTAwMDAwMDA4IDFmYmY4MDAyCWZsYWcgMgotMDAwMDAwMGMgMWZiZjgwMDQJZmxhZyA0Ci0wMDAwMDAxMCAxZmJmODAwOAlmbGFnIDgKLTAwMDAwMDE0IDFmYmY4MDEwCWZsYWcgMTYKLTAwMDAwMDE4IDFmYmY4MDIwCWZsYWcgMzIKLTAwMDAwMDFjIDFmYmY4MDQwCWZsYWcgNjQKLTAwMDAwMDIwIDFmYmY4MDgwCWZsYWcgMTI4Ci0wMDAwMDAyNCAxZmJmMDAwMAlmbGFnIC0yMTQ3NDgzNjQ3Ci0wMDAwMDAyYyAxZmEwMDAwYglmbGFnLmx0IHIwCi0wMDAwMDAzMCAxZmJmMDAwOQlmbGFnLmd0IDEKLTAwMDAwMDM4IDFmYmYwMDA5CWZsYWcuZ3QgMgotMDAwMDAwNDAgMWZiZjAwMDkJZmxhZy5ndCA0Ci0wMDAwMDA0OCAxZmJmMDAwOQlmbGFnLmd0IDgKLTAwMDAwMDUwIDFmYmYwMDA5CWZsYWcuZ3QgMTYKLTAwMDAwMDU4IDFmYmYwMDA5CWZsYWcuZ3QgMzIKLTAwMDAwMDYwIDFmYmYwMDA5CWZsYWcuZ3QgNjQKLTAwMDAwMDY4IDFmYmYwMDA5CWZsYWcuZ3QgMTI4Ci0wMDAwMDA3MCAxZmJmMDAwYQlmbGFnLmdlIC0yMTQ3NDgzNjQ3CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2N2FhNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBmbGFnIHRlc3QKLQotCWZsYWcJcjAKLQotCWZsYWcJMQotCWZsYWcJMgotCWZsYWcJNAotCWZsYWcJOAotCWZsYWcJMTYKLQlmbGFnCTMyCi0JZmxhZwk2NAotCWZsYWcJMTI4Ci0KLQlmbGFnCTB4ODAwMDAwMDEKLQotCWZsYWcubHQJcjAKLQotCWZsYWcuZ3QJMQotCWZsYWcuZ3QJMgotCWZsYWcuZ3QJNAotCWZsYWcuZ3QJOAotCWZsYWcuZ3QJMTYKLQlmbGFnLmd0CTMyCi0JZmxhZy5ndAk2NAotCWZsYWcuZ3QJMTI4Ci0KLQlmbGFnLmdlCTB4ODAwMDAwMDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjA3YTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMTgwMEBJMys4MEAwMAlAT0NAIHIwLHIxCi0wMDAwMDAwNCAxYjZlQEkzKzAwQDAwCUBPQ0AgZnAsc3AKLTAwMDAwMDA4IDE4MWZASTMrODBAMDAJQE9DQCByMCwwCi0wMDAwMDAwYyAxODNmQEkzKzgxQGZmCUBPQ0AgcjEsLTEKLTAwMDAwMDEwIDFmZTFASTMrMDBAMDAJQE9DQCAwLHIyCi0wMDAwMDAxNCAxZmUxQEkzKzgxQGZmCUBPQ0AgLTEscjMKLTAwMDAwMDE4IDE4OWZASTMrODBAZmYJQE9DQCByNCwyNTUKLTAwMDAwMDFjIDFmZTJASTMrODBAZmYJQE9DQCAyNTUscjUKLTAwMDAwMDIwIDE4ZGZASTMrODFAMDAJQE9DQCByNiwtMjU2Ci0wMDAwMDAyNCAxZmUzQEkzKzgxQDAwCUBPQ0AgLTI1NixyNwotMDAwMDAwMjggMTkxZkBJMyswMEAwMAlAT0NAIHI4LDI1NgotMDAwMDAwMzAgMTkzZkBJMyswMEAwMAlAT0NAIHI5LC0yNTcKLTAwMDAwMDM4IDFmYzVASTMrMDBAMDAJQE9DQCA1MTEscjEwCi0wMDAwMDA0MCAxOTdmQEkzKzAwQDAwCUBPQ0AgcjExLDExMTE2Mzg1OTQKLTAwMDAwMDQ4IDFmYzZASTMrMDBAMDAJQE9DQCAzMDU0MTk4OTYscjEyCi0wMDAwMDA1MCAxZmZmQEkzKzAwQGZmCUBPQ0AgMjU1LDI1NgotMDAwMDAwNTggMWZkZkBJMys4MEBmZglAT0NAIDI1NiwyNTUKLTAwMDAwMDYwIDE4MWZASTMrMDBAMDAJQE9DQCByMCwwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiBmb28KLTAwMDAwMDY4IDE5NDVASTMrODBAMDEJQE9DQC5lcSByMTAscjExCi0wMDAwMDA2YyAxOTg2QEkzKzgwQDAyCUBPQ0AubmUgcjEyLHIxMwotMDAwMDAwNzAgMTlkZkBJMyswMEAwYglAT0NALmx0IHIxNCwwCi0wMDAwMDA3OCAxOWZmQEkzKzAwQDA5CUBPQ0AuZ3QgcjE1LDUxMgotMDAwMDAwODAgMTgwMEBJMys4MUAwMAlAT0NALmYgcjAscjEKLTAwMDAwMDg0IDE4NWVASTMrODBAMDEJQE9DQC5mIHIyLDEKLTAwMDAwMDg4IDFmYTJASTMrMDBAMDAJQE9DQC5mIDAscjQKLTAwMDAwMDhjIDE4YmZASTMrMDFAMDAJQE9DQC5mIHI1LDUxMgotMDAwMDAwOTQgMWZjM0BJMyswMUAwMAlAT0NALmYgNTEyLHI2Ci0wMDAwMDA5YyAxZmRmQEkzKzAxQDAwCUBPQ0AuZiA1MTIsNTEyCi0wMDAwMDBhNCAxODAwQEkzKzgxQDAxCUBPQ0AuZXEuZiByMCxyMQotMDAwMDAwYTggMTgzZkBJMyswMUAwMglAT0NALm5lLmYgcjEsMAotMDAwMDAwYjAgMWZjMUBJMyswMUAwYglAT0NALmx0LmYgMCxyMgotMDAwMDAwYjggMWZjMUBJMyswMUAwOQlAT0NALmd0LmYgMSxyMgotMDAwMDAwYzAgMTgxZkBJMyswMUAwYwlAT0NALmxlLmYgcjAsNTEyCi0wMDAwMDBjOCAxZmMxQEkzKzAxQDBhCUBPQ0AuZ2UuZiA1MTIscjIKLTAwMDAwMGQwIDFmZGZASTMrMDFAMDQJQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyZmI4OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgSW5zbiAzIEBPQ0AgdGVzdAotCi0jIHJlZyxyZWcKLQlAT0NAIHIwLHIxCi0JQE9DQCBmcCxzcAotCi0jIHNoaW1tIHZhbHVlcwotCUBPQ0AgcjAsMAotCUBPQ0AgcjEsLTEKLQlAT0NAIDAscjIKLQlAT0NAIC0xLHIzCi0JQE9DQCByNCwyNTUKLQlAT0NAIDI1NSxyNQotCUBPQ0AgcjYsLTI1NgotCUBPQ0AgLTI1NixyNwotCi0jIGxpbW0gdmFsdWVzCi0JQE9DQCByOCwyNTYKLQlAT0NAIHI5LC0yNTcKLQlAT0NAIDUxMSxyMTAKLQlAT0NAIHIxMSwweDQyNDI0MjQyCi0JQE9DQCAweDEyMzQ1Njc4LHIxMgotCi0jIHNoaW1tIGFuZCBsaW1tCi0JQE9DQCAyNTUsMjU2Ci0JQE9DQCAyNTYsMjU1Ci0KLSMgc3ltYm9scwotCUBPQ0AgcjAsZm9vCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0JQE9DQC5lcSByMTAscjExCi0JQE9DQC5uZSByMTIscjEzCi0JQE9DQC5sdCByMTQsMAotCUBPQ0AuZ3QgcjE1LDUxMgotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMQotCUBPQ0AuZiByMiwxCi0JQE9DQC5mIDAscjQKLQlAT0NALmYgcjUsNTEyCi0JQE9DQC5mIDUxMixyNgotCUBPQ0AuZiA1MTIsNTEyCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uICsgZmxhZyBzZXR0aW5nCi0JQE9DQC5lcS5mIHIwLHIxCi0JQE9DQC5uZS5mIHIxLDAKLQlAT0NALmx0LmYgMCxyMgotCUBPQ0AuZ3QuZiAxLHIyCi0JQE9DQC5sZS5mIHIwLDUxMgotCUBPQ0AuZ2UuZiA1MTIscjIKLQlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxMDNmMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5kCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGoKLQotIyBUZXN0IHRoZSBqIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDx0ZXh0X2xhYmVsPiAzODAwMDAwMAlqIHIwCi0wMDAwMDAwNCA8dGV4dF9sYWJlbFwrND4gMzgwMDAwMjAJai5kIHIwCi0wMDAwMDAwOCA8dGV4dF9sYWJlbFwrOD4gMzgwMDAwNDAJai5qZCByMAotMDAwMDAwMGMgPHRleHRfbGFiZWxcK2M+IDM4MDAwMDAwCWogcjAKLTAwMDAwMDEwIDx0ZXh0X2xhYmVsXCsxMD4gMzgwMDgwMDAJaiByMQotMDAwMDAwMTQgPHRleHRfbGFiZWxcKzE0PiAzODAwODAyMAlqLmQgcjEKLTAwMDAwMDE4IDx0ZXh0X2xhYmVsXCsxOD4gMzgwMDgwNDAJai5qZCByMQotMDAwMDAwMWMgPHRleHRfbGFiZWxcKzFjPiAzODAwODAwMAlqIHIxCi0wMDAwMDAyMCA8dGV4dF9sYWJlbFwrMjA+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAwMjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDI4IDx0ZXh0X2xhYmVsXCsyOD4gMzgxZjAwMDAJaiAwCi0JCVJFTE9DOiAwMDAwMDAyYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwMzAgPHRleHRfbGFiZWxcKzMwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMDM0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDAzOCA8dGV4dF9sYWJlbFwrMzg+IDM4MWYwMDAxCWplcSAwCi0JCVJFTE9DOiAwMDAwMDAzYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNDAgPHRleHRfbGFiZWxcKzQwPiAzODFmMDAwMQlqZXEgMAotCQlSRUxPQzogMDAwMDAwNDQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDQ4IDx0ZXh0X2xhYmVsXCs0OD4gMzgxZjAwMDIJam5lIDAKLQkJUkVMT0M6IDAwMDAwMDRjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA1MCA8dGV4dF9sYWJlbFwrNTA+IDM4MWYwMDAyCWpuZSAwCi0JCVJFTE9DOiAwMDAwMDA1NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNTggPHRleHRfbGFiZWxcKzU4PiAzODFmMDAwMwlqcCAwCi0JCVJFTE9DOiAwMDAwMDA1YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNjAgPHRleHRfbGFiZWxcKzYwPiAzODFmMDAwMwlqcCAwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNjggPHRleHRfbGFiZWxcKzY4PiAzODFmMDAwNAlqbiAwCi0JCVJFTE9DOiAwMDAwMDA2YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNzAgPHRleHRfbGFiZWxcKzcwPiAzODFmMDAwNAlqbiAwCi0JCVJFTE9DOiAwMDAwMDA3NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA3YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwODAgPHRleHRfbGFiZWxcKzgwPiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA4NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwODggPHRleHRfbGFiZWxcKzg4PiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA4YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwOTAgPHRleHRfbGFiZWxcKzkwPiAzODFmMDAwNglqbmMgMAotCQlSRUxPQzogMDAwMDAwOTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDk4IDx0ZXh0X2xhYmVsXCs5OD4gMzgxZjAwMDYJam5jIDAKLQkJUkVMT0M6IDAwMDAwMDljIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBhMCA8dGV4dF9sYWJlbFwrYTA+IDM4MWYwMDA2CWpuYyAwCi0JCVJFTE9DOiAwMDAwMDBhNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYTggPHRleHRfbGFiZWxcK2E4PiAzODFmMDAwNwlqdiAwCi0JCVJFTE9DOiAwMDAwMDBhYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwYjAgPHRleHRfbGFiZWxcK2IwPiAzODFmMDAwNwlqdiAwCi0JCVJFTE9DOiAwMDAwMDBiNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYjggPHRleHRfbGFiZWxcK2I4PiAzODFmMDAwOAlqbnYgMAotCQlSRUxPQzogMDAwMDAwYmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGMwIDx0ZXh0X2xhYmVsXCtjMD4gMzgxZjAwMDgJam52IDAKLQkJUkVMT0M6IDAwMDAwMGM0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBjOCA8dGV4dF9sYWJlbFwrYzg+IDM4MWYwMDA5CWpndCAwCi0JCVJFTE9DOiAwMDAwMDBjYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwZDAgPHRleHRfbGFiZWxcK2QwPiAzODFmMDAwYQlqZ2UgMAotCQlSRUxPQzogMDAwMDAwZDQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGQ4IDx0ZXh0X2xhYmVsXCtkOD4gMzgxZjAwMGIJamx0IDAKLQkJUkVMT0M6IDAwMDAwMGRjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBlMCA8dGV4dF9sYWJlbFwrZTA+IDM4MWYwMDBjCWpsZSAwCi0JCVJFTE9DOiAwMDAwMDBlNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwZTggPHRleHRfbGFiZWxcK2U4PiAzODFmMDAwZAlqaGkgMAotCQlSRUxPQzogMDAwMDAwZWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGYwIDx0ZXh0X2xhYmVsXCtmMD4gMzgxZjAwMGUJamxzIDAKLQkJUkVMT0M6IDAwMDAwMGY0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBmOCA8dGV4dF9sYWJlbFwrZjg+IDM4MWYwMDBmCWpwbnogMAotCQlSRUxPQzogMDAwMDAwZmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMTAwIDx0ZXh0X2xhYmVsXCsxMDA+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAxMDQgUl9BUkNfMzIgZXh0ZXJuYWxfdGV4dF9sYWJlbAotMDAwMDAxMDggPHRleHRfbGFiZWxcKzEwOD4gMzgxZjAwMDAJaiAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2MWFmMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBqIHRlc3QKLQkKLXRleHRfbGFiZWw6CQotCWoJcjAKLQlqLmQJcjAKLQlqLmpkCXIwCi0Jai5uZAlyMAotCi0Jai5mCVtyMV0KLQlqLmQuZglbcjFdCi0Jai5qZC5mCVtyMV0KLQlqLm5kLmYJW3IxXQotCi0Jagl0ZXh0X2xhYmVsCi0JamFsCXRleHRfbGFiZWwKLQlqcmEJdGV4dF9sYWJlbAotCWplcQl0ZXh0X2xhYmVsCi0JanoJdGV4dF9sYWJlbAotCWpuZQl0ZXh0X2xhYmVsCi0Jam56CXRleHRfbGFiZWwKLQlqcGwJdGV4dF9sYWJlbAotCWpwCXRleHRfbGFiZWwKLQlqbWkJdGV4dF9sYWJlbAotCWpuCXRleHRfbGFiZWwKLQlqY3MJdGV4dF9sYWJlbAotCWpjCXRleHRfbGFiZWwKLQlqbG8JdGV4dF9sYWJlbAotCWpjYwl0ZXh0X2xhYmVsCi0Jam5jCXRleHRfbGFiZWwKLQlqaHMJdGV4dF9sYWJlbAotCWp2cwl0ZXh0X2xhYmVsCi0JanYJdGV4dF9sYWJlbAotCWp2Ywl0ZXh0X2xhYmVsCi0Jam52CXRleHRfbGFiZWwKLQlqZ3QJdGV4dF9sYWJlbAotCWpnZQl0ZXh0X2xhYmVsCi0Jamx0CXRleHRfbGFiZWwKLQlqbGUJdGV4dF9sYWJlbAotCWpoaQl0ZXh0X2xhYmVsCi0JamxzCXRleHRfbGFiZWwKLQlqcG56CXRleHRfbGFiZWwKLQotCWoJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCi0JagkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRkMGExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGxkL2xyCi0KLSMgVGVzdCB0aGUgbGQvbHIgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMDgwMDgwMDAJbGQgcjAsXFtyMVxdCi0wMDAwMDAwNCAwMDQxODgwMAlsZCByMixcW3IzLHI0XF0KLTAwMDAwMDA4IDA4YTMwMDAxCWxkIHI1LFxbcjYsMVxdCi0wMDAwMDAwYyAwOGU0MDFmZglsZCByNyxcW3I4LC0xXF0KLTAwMDAwMDEwIDA5MjUwMGZmCWxkIHI5LFxbcjEwLDI1NVxdCi0wMDAwMDAxNCAwOTY2MDEwMAlsZCByMTEsXFtyMTIsLTI1NlxdCi0wMDAwMDAxOCAwMWE3N2MwMAlsZCByMTMsXFtyMTQsMjU2XF0KLTAwMDAwMDIwIDAxZTg3YzAwCWxkIHIxNSxcW3IxNiwtMjU3XF0KLTAwMDAwMDI4IDAyM2YzODAwCWxkIHIxNyxcWzMwNTQxOTg5NixzcFxdCi0wMDAwMDAzMCAwYTdmMDAwMAlsZCByMTksXFswXF0KLQkJUkVMT0M6IDAwMDAwMDM0IFJfQVJDXzMyIGZvbwotMDAwMDAwMzggMGE5ZjAwMDAJbGQgcjIwLFxbNFxdCi0JCVJFTE9DOiAwMDAwMDAzYyBSX0FSQ18zMiBmb28KLTAwMDAwMDQwIDA4MWY4NDAwCWxkYiByMCxcWzBcXQotMDAwMDAwNDQgMDgxZjg4MDAJbGR3IHIwLFxbMFxdCi0wMDAwMDA0OCAwODFmODIwMAlsZC54IHIwLFxbMFxdCi0wMDAwMDA0YyAwODFmOTAwMAlsZC5hIHIwLFxbMFxdCi0wMDAwMDA1MCAwODFmYzAwMAlsZC5kaSByMCxcWzBcXQotMDAwMDAwNTQgMDgwMDU2MDAJbGRiLnguYS5kaSByMCxcW3IwXF0KLTAwMDAwMDU4IDA4MDBhMDAwCWxyIHIwLFxbcjFcXQotMDAwMDAwNWMgMDg1ZmEwMDAJbHIgcjIsXFtzdGF0dXNcXQotMDAwMDAwNjAgMDg3ZjIwMDAJbHIgcjMsXFszMDU0MTk4OTZcXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNjcxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgbGQvbHIgdGVzdAotCQotCWxkCXIwLFtyMV0KLQlsZAlyMixbcjMscjRdCi0JbGQJcjUsW3I2LDFdCi0JbGQJcjcsW3I4LC0xXQotCWxkCXI5LFtyMTAsMjU1XQotCWxkCXIxMSxbcjEyLC0yNTZdCi0JbGQJcjEzLFtyMTQsMjU2XQotCWxkCXIxNSxbcjE2LC0yNTddCi0JbGQJcjE3LFsweDEyMzQ1Njc4LHIyOF0KLQlsZAlyMTksW2Zvb10KLQlsZAlyMjAsW2Zvbys0XQotCi0JbGRiCXIwLFswXQotCWxkdwlyMCxbMF0KLQlsZC54CXIwLFswXQotCWxkLmEJcjAsWzBdCi0JbGQuZGkJcjAsWzBdCi0JbGRiLnguYS5kaSByMCxbcjBdCi0KLQlscglyMCxbcjFdCi0JbHIJcjIsW3N0YXR1c10KLQlscglyMyxbMHgxMjM0NTY3OF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I3OWM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLmQKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgQElDKzBAMDA4NDAwCUBPQ0AgcjAscjEscjIKLTAwMDAwMDA0IEBJQyszQDRkYjgwMAlAT0NAIHIyNixmcCxzcAotMDAwMDAwMDggQElDKzNAYWYzZTAwCUBPQ0AgaWxpbmsxLGlsaW5rMixibGluawotMDAwMDAwMGMgQElDKzdANWRmODAwCUBPQ0AgcjU4LHI1OSxscF9jb3VudAotMDAwMDAwMTAgQElDKzBAMDBmZTAwCUBPQ0AgcjAscjEsMAotMDAwMDAwMTQgQElDKzBAMWY4NDAwCUBPQ0AgcjAsMCxyMgotMDAwMDAwMTggQElDKzdAZTA4NDAwCUBPQ0AgMCxyMSxyMgotMDAwMDAwMWMgQElDKzBAMDBmZmZmCUBPQ0AgcjAscjEsLTEKLTAwMDAwMDIwIEBJQyswQDFmODVmZglAT0NAIHIwLC0xLHIyCi0wMDAwMDAyNCBASUMrN0BlMDg1ZmYJQE9DQCAtMSxyMSxyMgotMDAwMDAwMjggQElDKzBAMDBmZWZmCUBPQ0AgcjAscjEsMjU1Ci0wMDAwMDAyYyBASUMrMEAxZjg0ZmYJQE9DQCByMCwyNTUscjIKLTAwMDAwMDMwIEBJQys3QGUwODRmZglAT0NAIDI1NSxyMSxyMgotMDAwMDAwMzQgQElDKzBAMDBmZjAwCUBPQ0AgcjAscjEsLTI1NgotMDAwMDAwMzggQElDKzBAMWY4NTAwCUBPQ0AgcjAsLTI1NixyMgotMDAwMDAwM2MgQElDKzdAZTA4NTAwCUBPQ0AgLTI1NixyMSxyMgotMDAwMDAwNDAgQElDKzBAMDBmYzAwCUBPQ0AgcjAscjEsMjU2Ci0wMDAwMDA0OCBASUMrMEAxZjA0MDAJQE9DQCByMCwtMjU3LHIyCi0wMDAwMDA1MCBASUMrN0BjMDg0MDAJQE9DQCA1MTEscjEscjIKLTAwMDAwMDU4IEBJQyswQDFmMDQwMAlAT0NAIHIwLDExMTE2Mzg1OTQscjIKLTAwMDAwMDYwIEBJQys3QGMwZmMwMAlAT0NAIDMwNTQxOTg5NixyMSwzMDU0MTk4OTYKLTAwMDAwMDY4IEBJQyswQDFmZmNmZglAT0NAIHIwLDI1NSwyNTYKLTAwMDAwMDcwIEBJQyswQDFmN2VmZglAT0NAIHIwLDI1NiwyNTUKLTAwMDAwMDc4IEBJQys3QGUwZmNmZglAT0NAIDI1NSxyMSwyNTYKLTAwMDAwMDgwIEBJQys3QGZmMDRmZglAT0NAIDI1NSwyNTYscjIKLTAwMDAwMDg4IEBJQys3QGMwZmVmZglAT0NAIDI1NixyMSwyNTUKLTAwMDAwMDkwIEBJQys3QGRmODRmZglAT0NAIDI1NiwyNTUscjIKLTAwMDAwMDk4IEBJQyswQDAwZmMwMAlAT0NAIHIwLHIxLDAKLQkJUkVMT0M6IDAwMDAwMDljIFJfQVJDXzMyIGZvbwotMDAwMDAwYTAgQElDKzBAMDA4NDAwCUBPQ0AgcjAscjEscjIKLTAwMDAwMGE0IEBJQyswQDYyMGEwMAlAT0NAIHIzLHI0LHI1Ci0wMDAwMDBhOCBASUMrMEBjMzkwMDEJQE9DQC5lcSByNixyNyxyOAotMDAwMDAwYWMgQElDKzFAMjUxNjAxCUBPQ0AuZXEgcjkscjEwLHIxMQotMDAwMDAwYjAgQElDKzFAODY5YzAyCUBPQ0AubmUgcjEyLHIxMyxyMTQKLTAwMDAwMGI0IEBJQysxQGU4MjIwMglAT0NALm5lIHIxNSxyMTYscjE3Ci0wMDAwMDBiOCBASUMrMkA0OWE4MDMJQE9DQC5wIHIxOCxyMTkscjIwCi0wMDAwMDBiYyBASUMrMkBhYjJlMDMJQE9DQC5wIHIyMSxyMjIscjIzCi0wMDAwMDBjMCBASUMrM0AwY2I0MDQJQE9DQC5uIHIyNCxyMjUscjI2Ci0wMDAwMDBjNCBASUMrM0A2ZTNhMDQJQE9DQC5uIGZwLHNwLGlsaW5rMQotMDAwMDAwYzggQElDKzNAY2ZjMDA1CUBPQ0AuYyBpbGluazIsYmxpbmsscjMyCi0wMDAwMDBjYyBASUMrNEAzMTQ2MDUJQE9DQC5jIHIzMyxyMzQscjM1Ci0wMDAwMDBkMCBASUMrNEA5MmNjMDUJQE9DQC5jIHIzNixyMzcscjM4Ci0wMDAwMDBkNCBASUMrNEBmNDUyMDYJQE9DQC5uYyByMzkscjQwLHI0MQotMDAwMDAwZDggQElDKzVANTVkODA2CUBPQ0AubmMgcjQyLHI0MyxyNDQKLTAwMDAwMGRjIEBJQys1QGI3NWUwNglAT0NALm5jIHI0NSxyNDYscjQ3Ci0wMDAwMDBlMCBASUMrNkAxOGU0MDcJQE9DQC52IHI0OCxyNDkscjUwCi0wMDAwMDBlNCBASUMrNkA3YTZhMDcJQE9DQC52IHI1MSxyNTIscjUzCi0wMDAwMDBlOCBASUMrNkBkYmYwMDgJQE9DQC5udiByNTQscjU1LHI1NgotMDAwMDAwZWMgQElDKzdAM2Q3NjA4CUBPQ0AubnYgcjU3LHI1OCxyNTkKLTAwMDAwMGYwIEBJQys3QDllMDAwOQlAT0NALmd0IGxwX2NvdW50LGxwX2NvdW50LHIwCi0wMDAwMDBmNCBASUMrMEAwMDdjMGEJQE9DQC5nZSByMCxyMCwwCi0wMDAwMDBmYyBASUMrMEAzZjAyMGIJQE9DQC5sdCByMSwxLHIxCi0wMDAwMDEwNCBASUMrN0BjMDg0MGMJQE9DQC5sZSAyLHIxLHIyCi0wMDAwMDEwYyBASUMrMEA3ZjA2MGQJQE9DQC5oaSByMywzLHIzCi0wMDAwMDExNCBASUMrN0BkZjA4MGUJQE9DQC5scyA0LDQscjQKLTAwMDAwMTFjIEBJQys3QGMyZmMwZglAT0NALnBueiA1LHI1LDUKLTAwMDAwMTI0IEBJQyswQDAwODUwMAlAT0NALmYgcjAscjEscjIKLTAwMDAwMTI4IEBJQyswQDAwZmEwMQlAT0NALmYgcjAscjEsMQotMDAwMDAxMmMgQElDKzBAMWU4NDAxCUBPQ0AuZiByMCwxLHIyCi0wMDAwMDEzMCBASUMrN0BhMDg0MDAJQE9DQC5mIDAscjEscjIKLTAwMDAwMTM0IEBJQyswQDAwZmQwMAlAT0NALmYgcjAscjEsNTEyCi0wMDAwMDEzYyBASUMrMEAxZjA1MDAJQE9DQC5mIHIwLDUxMixyMgotMDAwMDAxNDQgQElDKzdAYzA4NTAwCUBPQ0AuZiA1MTIscjEscjIKLTAwMDAwMTRjIEBJQyswQDAwODUwMQlAT0NALmVxLmYgcjAscjEscjIKLTAwMDAwMTUwIEBJQyswQDAwZmQwMglAT0NALm5lLmYgcjAscjEsMAotMDAwMDAxNTggQElDKzBAMWYwNTBiCUBPQ0AubHQuZiByMCwwLHIyCi0wMDAwMDE2MCBASUMrN0BjMDg1MDkJQE9DQC5ndC5mIDAscjEscjIKLTAwMDAwMTY4IEBJQyswQDAwZmQwYwlAT0NALmxlLmYgcjAscjEsNTEyCi0wMDAwMDE3MCBASUMrMEAxZjA1MGEJQE9DQC5nZS5mIHIwLDUxMixyMgotMDAwMDAxNzggQElDKzdAYzA4NTA0CUBPQ0Aubi5mIDUxMixyMSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTE2OWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGgucworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSMgQE9DQCB0ZXN0Ci0KLSMgU3RheSBhd2F5IGZyb20gb3BlcmFuZHMgd2l0aCBkdXBsaWNhdGUgYXJndW1lbnRzIChlZzoJYWRkIHIwLHIxLHIxKS4KLSMgVGhleSB3aWxsIGJlIGRpc2Fzc2VtYmxlZCBhcyB0aGV5J3JlIG1hY3JvIGNvdW50ZXJwYXJ0cyAoZWc6IGFzbCByMCxyMSkuCi0KLSMgcmVnLHJlZyxyZWcKLQlAT0NAIHIwLHIxLHIyCi0JQE9DQCByMjYsZnAsc3AKLQlAT0NAIGlsaW5rMSxpbGluazIsYmxpbmsKLQlAT0NAIHI1OCxyNTksbHBfY291bnQKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLHIxLDAKLQlAT0NAIHIwLDAscjIKLQlAT0NAIDAscjEscjIKLQlAT0NAIHIwLHIxLC0xCi0JQE9DQCByMCwtMSxyMgotCUBPQ0AgLTEscjEscjIKLQlAT0NAIHIwLHIxLDI1NQotCUBPQ0AgcjAsMjU1LHIyCi0JQE9DQCAyNTUscjEscjIKLQlAT0NAIHIwLHIxLC0yNTYKLQlAT0NAIHIwLC0yNTYscjIKLQlAT0NAIC0yNTYscjEscjIKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjAscjEsMjU2Ci0JQE9DQCByMCwtMjU3LHIyCi0JQE9DQCA1MTEscjEscjIKLQlAT0NAIHIwLDB4NDI0MjQyNDIscjIKLQlAT0NAIDB4MTIzNDU2NzgscjEsMHgxMjM0NTY3OAotCi0jIHNoaW1tIGFuZCBsaW1tCi0JQE9DQCByMCwyNTUsMjU2Ci0JQE9DQCByMCwyNTYsMjU1Ci0JQE9DQCAyNTUscjEsMjU2Ci0JQE9DQCAyNTUsMjU2LHIyCi0JQE9DQCAyNTYscjEsMjU1Ci0JQE9DQCAyNTYsMjU1LHIyCi0KLSMgc3ltYm9scwotCUBPQ0AgcjAscjEsZm9vCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0JQE9DQC5hbCByMCxyMSxyMgotCUBPQ0AucmEgcjMscjQscjUKLQlAT0NALmVxIHI2LHI3LHI4Ci0JQE9DQC56IHI5LHIxMCxyMTEKLQlAT0NALm5lIHIxMixyMTMscjE0Ci0JQE9DQC5ueiByMTUscjE2LHIxNwotCUBPQ0AucGwgcjE4LHIxOSxyMjAKLQlAT0NALnAgcjIxLHIyMixyMjMKLQlAT0NALm1pIHIyNCxyMjUscjI2Ci0JQE9DQC5uIHIyNyxyMjgscjI5Ci0JQE9DQC5jcyByMzAscjMxLHIzMgotCUBPQ0AuYyByMzMscjM0LHIzNQotCUBPQ0AubG8gcjM2LHIzNyxyMzgKLQlAT0NALmNjIHIzOSxyNDAscjQxCi0JQE9DQC5uYyByNDIscjQzLHI0NAotCUBPQ0AuaHMgcjQ1LHI0NixyNDcKLQlAT0NALnZzIHI0OCxyNDkscjUwCi0JQE9DQC52IHI1MSxyNTIscjUzCi0JQE9DQC52YyByNTQscjU1LHI1NgotCUBPQ0AubnYgcjU3LHI1OCxyNTkKLQlAT0NALmd0IHI2MCxyNjAscjAKLQlAT0NALmdlIHIwLHIwLDAKLQlAT0NALmx0IHIxLDEscjEKLQlAT0NALmxlIDIscjEscjIKLQlAT0NALmhpIHIzLDMscjMKLQlAT0NALmxzIDQsNCxyNAotCUBPQ0AucG56IDUscjUsNQotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMSxyMgotCUBPQ0AuZiByMCxyMSwxCi0JQE9DQC5mIHIwLDEscjIKLQlAT0NALmYgMCxyMSxyMgotCUBPQ0AuZiByMCxyMSw1MTIKLQlAT0NALmYgcjAsNTEyLHIyCi0JQE9DQC5mIDUxMixyMSxyMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMSxyMgotCUBPQ0AubmUuZiByMCxyMSwwCi0JQE9DQC5sdC5mIHIwLDAscjIKLQlAT0NALmd0LmYgMCxyMSxyMgotCUBPQ0AubGUuZiByMCxyMSw1MTIKLQlAT0NALmdlLmYgcjAsNTEyLHIyCi0JQE9DQC5uLmYgNTEyLHIxLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjA3YTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDE4MDBASTMrODBAMDAJQE9DQCByMCxyMQotMDAwMDAwMDQgMWI2ZUBJMyswMEAwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCAxODFmQEkzKzgwQDAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgMTgzZkBJMys4MUBmZglAT0NAIHIxLC0xCi0wMDAwMDAxMCAxZmUxQEkzKzAwQDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgMWZlMUBJMys4MUBmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCAxODlmQEkzKzgwQGZmCUBPQ0AgcjQsMjU1Ci0wMDAwMDAxYyAxZmUyQEkzKzgwQGZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCAxOGRmQEkzKzgxQDAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgMWZlM0BJMys4MUAwMAlAT0NAIC0yNTYscjcKLTAwMDAwMDI4IDE5MWZASTMrMDBAMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIDE5M2ZASTMrMDBAMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCAxZmM1QEkzKzAwQDAwCUBPQ0AgNTExLHIxMAotMDAwMDAwNDAgMTk3ZkBJMyswMEAwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCAxZmM2QEkzKzAwQDAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgMWZmZkBJMyswMEBmZglAT0NAIDI1NSwyNTYKLTAwMDAwMDU4IDFmZGZASTMrODBAZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCAxODFmQEkzKzAwQDAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCAxOTQ1QEkzKzgwQDAxCUBPQ0AuZXEgcjEwLHIxMQotMDAwMDAwNmMgMTk4NkBJMys4MEAwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDcwIDE5ZGZASTMrMDBAMGIJQE9DQC5sdCByMTQsMAotMDAwMDAwNzggMTlmZkBJMyswMEAwOQlAT0NALmd0IHIxNSw1MTIKLTAwMDAwMDgwIDE4MDBASTMrODFAMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDA4NCAxODVlQEkzKzgwQDAxCUBPQ0AuZiByMiwxCi0wMDAwMDA4OCAxZmEyQEkzKzAwQDAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDA4YyAxOGJmQEkzKzAxQDAwCUBPQ0AuZiByNSw1MTIKLTAwMDAwMDk0IDFmYzNASTMrMDFAMDAJQE9DQC5mIDUxMixyNgotMDAwMDAwOWMgMWZkZkBJMyswMUAwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAwYTQgMTgwMEBJMys4MUAwMQlAT0NALmVxLmYgcjAscjEKLTAwMDAwMGE4IDE4M2ZASTMrMDFAMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMGIwIDFmYzFASTMrMDFAMGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMGI4IDFmYzFASTMrMDFAMDkJQE9DQC5ndC5mIDEscjIKLTAwMDAwMGMwIDE4MWZASTMrMDFAMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAwYzggMWZjMUBJMyswMUAwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDBkMCAxZmRmQEkzKzAxQDA0CUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmYTY2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIFNpbmdsZSBzaGlmdCBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuZXEgcjEwLHIxMQotCUBPQ0AubmUgcjEyLHIxMwotCUBPQ0AubHQgcjE0LDAKLQlAT0NALmd0IHIxNSw1MTIKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAwLHI0Ci0JQE9DQC5mIHI1LDUxMgotCUBPQ0AuZiA1MTIscjYKLQlAT0NALmYgNTEyLDUxMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMQotCUBPQ0AubmUuZiByMSwwCi0JQE9DQC5sdC5mIDAscjIKLQlAT0NALmd0LmYgMSxyMgotCUBPQ0AubGUuZiByMCw1MTIKLQlAT0NALmdlLmYgNTEyLHIyCi0JQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhOTlhOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzdC9zcgotCi0jIFRlc3QgdGhlIHN0L3NyIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDEwMDA4MDAwCXN0IHIwLFxbcjFcXQotMDAwMDAwMDQgMTAwMzBhMDEJc3QgcjUsXFtyNiwxXF0KLTAwMDAwMDA4IDEwMDQwZmZmCXN0IHI3LFxbcjgsLTFcXQotMDAwMDAwMGMgMTAwNTEyZmYJc3QgcjksXFtyMTAsMjU1XF0KLTAwMDAwMDEwIDEwMDYxNzAwCXN0IHIxMSxcW3IxMiwtMjU2XF0KLTAwMDAwMDE0IDEwMWYyNjAwCXN0IHIxOSxcWzBcXQotCQlSRUxPQzogMDAwMDAwMTggUl9BUkNfMzIgZm9vCi0wMDAwMDAxYyAxMDFmMjgwMAlzdCByMjAsXFs0XF0KLQkJUkVMT0M6IDAwMDAwMDIwIFJfQVJDXzMyIGZvbwotMDAwMDAwMjQgMTA1ZjAwMDAJc3RiIHIwLFxbMFxdCi0wMDAwMDAyYyAxMDlmMDAwMAlzdHcgcjAsXFswXF0KLTAwMDAwMDM0IDExMWYwMDAwCXN0LmEgcjAsXFswXF0KLTAwMDAwMDNjIDE0MWYwMDAwCXN0LmRpIHIwLFxbMFxdCi0wMDAwMDA0NCAxNTQwMDAwMAlzdGIuYS5kaSByMCxcW3IwXF0KLTAwMDAwMDQ4IDEyMDA4MDAwCXNyIHIwLFxbcjFcXQotMDAwMDAwNGMgMTIxZjg0MDAJc3IgcjIsXFtzdGF0dXNcXQotMDAwMDAwNTAgMTIxZjA2MDAJc3IgcjMsXFszMDU0MTk4OTZcXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZjE5OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgc3Qvc3IgdGVzdAotCQotCXN0CXIwLFtyMV0KLQlzdAlyNSxbcjYsMV0KLQlzdAlyNyxbcjgsLTFdCi0Jc3QJcjksW3IxMCwyNTVdCi0Jc3QJcjExLFtyMTIsLTI1Nl0KLQlzdAlyMTksW2Zvb10KLQlzdAlyMjAsW2Zvbys0XQotCi0Jc3RiCXIwLFswXQotCXN0dwlyMCxbMF0KLQlzdC5hCXIwLFswXQotCXN0LmRpCXIwLFswXQotCXN0Yi5hLmRpIHIwLFtyMF0KLQotCXNyCXIwLFtyMV0KLQlzcglyMixbc3RhdHVzXQotCXNyCXIzLFsweDEyMzQ1Njc4XQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZmMTI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgVGVzdCBhc3NlbWJsZXIgd2FybmluZ3MuCi0KLWlmIFtpc3RhcmdldCBhcmMqLSotKl0gewotCi0gICAgbG9hZF9saWIgZ2FzLWRnLmV4cAotCi0gICAgZGctaW5pdAotCi0gICAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyL3dhcm4qLnNdXSAiIiAiIgotCi0gICAgZGctZmluaXNoCi0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmNiNDM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgQVJDIHNwZWNpZmljIGFzc2VtYmxlciB3YXJuaW5ncwotOwotOyB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IGFyYy0qLSogfSB9Ci0KLQliLmQgZm9vCi0JbW92IHIwLDI1Ngk7IHsgZGctd2FybmluZyAiOCBieXRlIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiICI4IGJ5dGUgaW5zbiBpbiBkZWxheSBzbG90IiB9Ci0KLQlqLmQgZm9vCQk7IHsgZGctd2FybmluZyAiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IiAiOCBieXRlIGp1bXAgd2l0aCBkZWxheSBzbG90IiB9Ci0JbW92IHIwLHIxCi0KLQlzdWIuZiAwLHIwLHIyCi0JYmVxIGZvbwkJOyB7IGRnLXdhcm5pbmcgImNvbmRpdGlvbmFsIGJyYW5jaCBmb2xsb3dzIHNldCBvZiBmbGFncyIgImNjIHNldC9icmFuY2ggbm9wIHRlc3QiIH0KLQotZm9vOgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FyY2g0dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FyY2g0dC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI4ZjdmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCWJ4CXIwCi0JYnhlcQlyMQotCi1mb286CQotCWxkcmgJcjMsIGZvbwotCWxkcnNoCXI0LCBbcjVdCi0JbGRyc2IJcjQsIFtyMSwgcjNdCi0JbGRyc2gJcjEsIFtyNCwgcjRdIQotCWxkcmVxc2IJcjEsIFtyNSwgLXIzXQotCWxkcm5laAlyMiwgW3I2XSwgcjcKLQlsZHJjY3NoIHIyLCBbcjddLCArcjgKLQlsZHJzYglyMiwgW3IzLCAjMjU1XQotCWxkcnNoCXIxLCBbcjQsICMtMjUwXQotCWxkcnNiCXIxLCBbcjUsICMrMjQwXQotCi0Jc3RyaAlyMiwgYmFyCi0Jc3RybmVoCXIzLCBbcjNdCi1iYXI6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFjNTRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0uZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIwotIyBTb21lIEFSTSB0ZXN0cwotIwotaWYgW2lzdGFyZ2V0IGFybS0qLSpdIHRoZW4gewotICAgIHJ1bl9kdW1wX3Rlc3QgImluc3QiCi0KLSAgICBnYXNfdGVzdCAiYXJtMy5zIiAiIiAkc3Rkb3B0bGlzdCAiQXJtIDMgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImFybTYucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSA2IGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcm03ZG0ucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSA3RE0gaW5zdHJ1Y3Rpb25zIgotCi0gICAgcnVuX2R1bXBfdGVzdCAiYXJtN3QiCi0KLSAgICBnYXNfdGVzdCAidGh1bWIucyIgIiIgJHN0ZG9wdGxpc3QgIlRodW1iIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcmNoNHQucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSBhcmNoaXRlY3R1cmUgNHQgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImNvcHJvLnMiICIiICRzdGRvcHRsaXN0ICJDbyBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImltbWVkLnMiICIiICRzdGRvcHRsaXN0ICJpbW1lZGlhdGUgZXhwcmVzc2lvbnMiCi0KLSAgICBnYXNfdGVzdCAiZmxvYXQucyIgIiIgJHN0ZG9wdGxpc3QgIkNvcmUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIgotfQotCi0jIE5vdCBhbGwgYXJtIHRhcmdldHMgYXJlIGJpLWVuZGlhbiwgc28gb25seSBydW4gdGhpcyB0ZXN0IG9uIG9uZXMKLSMgd2Uga25vdyB0aGF0IGFyZS4gIEZJWE1FOiBXZSBzaG91bGQgcHJvYmFibHkgYWxzbyBrZXkgb2ZmIGFybWViL2FybWVsLgotCi1pZiBbaXN0YXJnZXQgYXJtLSotcGVdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJsZS1mcGNvbnN0IgotCi0gICAgIyBTaW5jZSBiaWctZW5kaWFuIG51bWJlcnMgaGF2ZSB0aGUgbm9ybWFsIGZvcm1hdCwgdGhpcyBkb2Vzbid0IGV4aXN0LgotICAgICNydW5fZHVtcF90ZXN0ICJiZS1mcGNvbnN0IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2Y5MTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTMucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0Jc3dwCXIwLCByMSwgW3I4XQotCXN3cGIJcjIsIHIzLCBbcjNdCi0Jc3dwZ2ViCXI0LCByMSwgW3I0XQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtNi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MTcxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtNi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0JCi0JbXJzCXI4LCBjcHNyCi0JbXJzZXEJcjksIGNwc3JfYWxsCi0JbXJzCXIyLCBzcHNyCi0KLQltc3IJY3BzciwgcjEKLQltc3JuZQljcHNyX2ZsZywgIzB4ZjAwMDAwMDAKLQltc3IJc3Bzcl9mbGcsIHI4Ci0JbXNyCXNwc3JfYWxsLCByOQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN2RtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN2RtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTZjNzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0JCi0Jc211bGwJcjAsIHIxLCByMiwgcjMKLQl1bXVsbAlyMCwgcjEsIHIyLCByMwotCXNtbGFsCXIwLCByMSwgcjIsIHIzCi0JdW1sYWwJcjAsIHIxLCByNCwgcjMKLQotCXNtdWxsbmUJcjAsIHIxLCByMywgcjQKLQlzbXVsbHMJcjEsIHIwLCByOSwgcjExCi0JdW1sYWxlcXMgcjIsIHI5LCByNCwgcjkKLQlzbWxhbGdlIHIxNCwgcjEwLCByOCwgcjE0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIxNGVlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLS1zaG93LXJhdy1pbnNuCi0jbmFtZTogQVJNIGFybTd0Ci0jYXM6IC1tYXJtN3QgLUVMCi0KLSMgVGVzdCB0aGUgaGFsZndvcmQgYW5kIHNpZ25leHRlbmQgbWVtb3J5IHRyYW5zZmVyczoKLQotLio6ICtmaWxlIGZvcm1hdCAuKmFybS4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8W14+XSo+IGUxZDEwMGIwID8JbGRyaAlyMCwgXFtyMVxdCi0wMDAwMDAwNCA8W14+XSo+IGUxZjEwMGIwID8JbGRyaAlyMCwgXFtyMVxdIQotMDAwMDAwMDggPFtePl0qPiBlMTkxMDBiMiA/CWxkcmgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMDBjIDxbXj5dKj4gZTFiMTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwMTAgPFtePl0qPiBlMWQxMDBiYyA/CWxkcmgJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDAxNCA8W14+XSo+IGUxZjEwMGJjID8JbGRyaAlyMCwgXFtyMSwgIzEyXF0hCi0wMDAwMDAxOCA8W14+XSo+IGUxNTEwMGJjID8JbGRyaAlyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDAxYyA8W14+XSo+IGUwOTEwMGIyID8JbGRyaAlyMCwgXFtyMVxdLCByMgotMDAwMDAwMjAgPFtePl0qPiBlM2EwMGNmZiA/CW1vdglyMCwgIzY1MjgwCTsgMHhmZjAwCi0wMDAwMDAyNCA8W14+XSo+IGUxZGYwYmI0ID8JbGRyaAlyMCwgXFtwYywgI2I0XF0JOyAwMDAwMDBlMCA8W14+XSo+Ci0wMDAwMDAyOCA8W14+XSo+IGUxZGYwYWJjID8JbGRyaAlyMCwgXFtwYywgI2FjXF0JOyAwMDAwMDBkYyA8W14+XSo+Ci0wMDAwMDAyYyA8W14+XSo+IGUxYzEwMGIwID8Jc3RyaAlyMCwgXFtyMVxdCi0wMDAwMDAzMCA8W14+XSo+IGUxZTEwMGIwID8Jc3RyaAlyMCwgXFtyMVxdIQotMDAwMDAwMzQgPFtePl0qPiBlMTgxMDBiMiA/CXN0cmgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMDM4IDxbXj5dKj4gZTFhMTAwYjIgPwlzdHJoCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwM2MgPFtePl0qPiBlMWMxMDBiYyA/CXN0cmgJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDA0MCA8W14+XSo+IGUxZTEwMGJjID8Jc3RyaAlyMCwgXFtyMSwgIzEyXF0hCi0wMDAwMDA0NCA8W14+XSo+IGUxNDEwMGJjID8Jc3RyaAlyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDA0OCA8W14+XSo+IGUwODEwMGIyID8Jc3RyaAlyMCwgXFtyMVxdLCByMgotMDAwMDAwNGMgPFtePl0qPiBlMWNmMDhiOCA/CXN0cmgJcjAsIFxbcGMsICM4OFxdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwNTAgPFtePl0qPiBlMWQxMDBkMCA/CWxkcnNiCXIwLCBcW3IxXF0KLTAwMDAwMDU0IDxbXj5dKj4gZTFmMTAwZDAgPwlsZHJzYglyMCwgXFtyMVxdIQotMDAwMDAwNTggPFtePl0qPiBlMTkxMDBkMiA/CWxkcnNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDA1YyA8W14+XSo+IGUxYjEwMGQyID8JbGRyc2IJcjAsIFxbcjEsIHIyXF0hCi0wMDAwMDA2MCA8W14+XSo+IGUxZDEwMGRjID8JbGRyc2IJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDA2NCA8W14+XSo+IGUxZjEwMGRjID8JbGRyc2IJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwNjggPFtePl0qPiBlMTUxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAtIzEyXF0KLTAwMDAwMDZjIDxbXj5dKj4gZTA5MTAwZDIgPwlsZHJzYglyMCwgXFtyMVxdLCByMgotMDAwMDAwNzAgPFtePl0qPiBlM2EwMDBkZSA/CW1vdglyMCwgIzIyMgk7IDB4ZGUKLTAwMDAwMDc0IDxbXj5dKj4gZTFkZjA2ZDAgPwlsZHJzYglyMCwgXFtwYywgIzYwXF0JOyAwMDAwMDBkYyA8W14+XSo+Ci0wMDAwMDA3OCA8W14+XSo+IGUxZDEwMGYwID8JbGRyc2gJcjAsIFxbcjFcXQotMDAwMDAwN2MgPFtePl0qPiBlMWYxMDBmMCA/CWxkcnNoCXIwLCBcW3IxXF0hCi0wMDAwMDA4MCA8W14+XSo+IGUxOTEwMGYyID8JbGRyc2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMDg0IDxbXj5dKj4gZTFiMTAwZjIgPwlsZHJzaAlyMCwgXFtyMSwgcjJcXSEKLTAwMDAwMDg4IDxbXj5dKj4gZTFkMTAwZmMgPwlsZHJzaAlyMCwgXFtyMSwgIzEyXF0KLTAwMDAwMDhjIDxbXj5dKj4gZTFmMTAwZmMgPwlsZHJzaAlyMCwgXFtyMSwgIzEyXF0hCi0wMDAwMDA5MCA8W14+XSo+IGUxNTEwMGZjID8JbGRyc2gJcjAsIFxbcjEsIC0jMTJcXQotMDAwMDAwOTQgPFtePl0qPiBlMDkxMDBmMiA/CWxkcnNoCXIwLCBcW3IxXF0sIHIyCi0wMDAwMDA5OCA8W14+XSo+IGUzYTAwY2ZmID8JbW92CXIwLCAjNjUyODAJOyAweGZmMDAKLTAwMDAwMDljIDxbXj5dKj4gZTFkZjAzZmMgPwlsZHJzaAlyMCwgXFtwYywgIzNjXF0JOyAwMDAwMDBlMCA8W14+XSo+Ci0wMDAwMDBhMCA8W14+XSo+IGUxZGYwM2Y0ID8JbGRyc2gJcjAsIFxbcGMsICMzNFxdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwYTQgPFtePl0qPiBlMTkxMDBiMiA/CWxkcmgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGE4IDxbXj5dKj4gMTE5MTAwYjIgPwlsZHJuZWgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGFjIDxbXj5dKj4gODE5MTAwYjIgPwlsZHJoaWgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGIwIDxbXj5dKj4gYjE5MTAwYjIgPwlsZHJsdGgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGI0IDxbXj5dKj4gZTE5MTAwZjIgPwlsZHJzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYjggPFtePl0qPiAxMTkxMDBmMiA/CWxkcm5lc2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGJjIDxbXj5dKj4gODE5MTAwZjIgPwlsZHJoaXNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBjMCA8W14+XSo+IGIxOTEwMGYyID8JbGRybHRzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYzQgPFtePl0qPiBlMTkxMDBkMiA/CWxkcnNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBjOCA8W14+XSo+IDExOTEwMGQyID8JbGRybmVzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwY2MgPFtePl0qPiA4MTkxMDBkMiA/CWxkcmhpc2IJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGQwIDxbXj5dKj4gYjE5MTAwZDIgPwlsZHJsdHNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBkNCA8W14+XSo+IGUxZGYwMGY0ID8JbGRyc2gJcjAsIFxbcGMsICM0XF0JOyAwMDAwMDBlMCA8W14+XSo+Ci0wMDAwMDBkOCA8W14+XSo+IGUxZGYwMGY0ID8JbGRyc2gJcjAsIFxbcGMsICM0XF0JOyAwMDAwMDBlNCA8W14+XSo+Ci0wMDAwMDBkYyA8W14+XSo+IDAwMDAwMDAwID8JYW5kZXEJcjAsIHIwLCByMAotWwkJXSpkYzouKmZyZWQKLTAwMDAwMGUwIDxbXj5dKj4gMDAwMGMwZGUgPwkuKgotMDAwMDAwZTQgPFtePl0qPiAwMDAwZGVhZCA/CS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTU1NzUyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5zCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotCS50ZXh0Ci0JLmFsaWduCTAKLQotbG9hZGhhbGZ3b3JkczoKLQlsZHJoCXIwLCBbcjFdCi0JbGRyaAlyMCwgW3IxXSEKLQlsZHJoCXIwLCBbcjEsIHIyXQotCWxkcmgJcjAsIFtyMSwgcjJdIQotCWxkcmgJcjAsIFtyMSwjMHgwQ10KLQlsZHJoCXIwLCBbcjEsIzB4MENdIQotCWxkcmgJcjAsIFtyMSwjLTB4MENdCi0JbGRyaAlyMCwgW3IxXSwgcjIKLQlsZHJoCXIwLCA9MHhGRjAwCi0JbGRyaAlyMCwgPTB4QzBERQotCWxkcmgJcjAsIC5MMgotCi1zdG9yZWhhbGZ3b3JkczoKLQlzdHJoCXIwLCBbcjFdCi0Jc3RyaAlyMCwgW3IxXSEKLQlzdHJoCXIwLCBbcjEsIHIyXQotCXN0cmgJcjAsIFtyMSwgcjJdIQotCXN0cmgJcjAsIFtyMSwjMHgwQ10KLQlzdHJoCXIwLCBbcjEsIzB4MENdIQotCXN0cmgJcjAsIFtyMSwjLTB4MENdCi0Jc3RyaAlyMCwgW3IxXSwgcjIKLQlzdHJoCXIwLCAuTDIKLQotbG9hZHNpZ25lZGJ5dGVzOgotCWxkcnNiCXIwLCBbcjFdCi0JbGRyc2IJcjAsIFtyMV0hCi0JbGRyc2IJcjAsIFtyMSwgcjJdCi0JbGRyc2IJcjAsIFtyMSwgcjJdIQotCWxkcnNiCXIwLCBbcjEsIzB4MENdCi0JbGRyc2IJcjAsIFtyMSwjMHgwQ10hCi0JbGRyc2IJcjAsIFtyMSwjLTB4MENdCi0JbGRyc2IJcjAsIFtyMV0sIHIyCi0JbGRyc2IJcjAsID0weERFCi0JbGRyc2IJcjAsIC5MMgotCi1sb2Fkc2lnbmVkaGFsZndvcmRzOgotCWxkcnNoCXIwLCBbcjFdCi0JbGRyc2gJcjAsIFtyMV0hCi0JbGRyc2gJcjAsIFtyMSwgcjJdCi0JbGRyc2gJcjAsIFtyMSwgcjJdIQotCWxkcnNoCXIwLCBbcjEsICMweDBDXQotCWxkcnNoCXIwLCBbcjEsICMweDBDXSEKLQlsZHJzaAlyMCwgW3IxLCAjLTB4MENdCi0JbGRyc2gJcjAsIFtyMV0sIHIyCi0JbGRyc2gJcjAsID0weEZGMDAKLQlsZHJzaAlyMCwgPTB4QzBERQotCWxkcnNoCXIwLCAuTDIKLQkKLW1pc2M6Ci0JbGRyYWxoCXIwLCBbcjEsIHIyXQotCWxkcm5laAlyMCwgW3IxLCByMl0KLQlsZHJoaWgJcjAsIFtyMSwgcjJdCi0JbGRybHRoCXIwLCBbcjEsIHIyXQotCi0JbGRyYWxzaAlyMCwgW3IxLCByMl0KLQlsZHJuZXNoCXIwLCBbcjEsIHIyXQotCWxkcmhpc2gJcjAsIFtyMSwgcjJdCi0JbGRybHRzaAlyMCwgW3IxLCByMl0KLQotCWxkcmFsc2IJcjAsIFtyMSwgcjJdCi0JbGRybmVzYglyMCwgW3IxLCByMl0KLQlsZHJoaXNiCXIwLCBbcjEsIHIyXQotCWxkcmx0c2IJcjAsIFtyMSwgcjJdCi0KLQlsZHJzaAlyMCwgPTB4QzBERQotCWxkcnNoCXIwLCA9MHhERUFECi0KLQkuYWxpZ24KLS5MMjoKLQkud29yZAlmcmVkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vY29wcm8ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9jb3Byby5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmM5YjkyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9jb3Byby5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0JY2RwCXAxLCA0LCBjcjEsIGNyMiwgY3IzCi0JY2RwZXEJNCwgMywgYzEsIGM0LCBjcjUsIDUKLQotCWxkYwk1LCBjcjksIFtyM10KLQlsZGNsCTEsIGNyMTQsIFtyMSwgIzMyXQotCWxkY21pCTAsIGNyMCwgW3IyLCAjMTAyMF0hCi0JbGRjcGxsCXA3LCBjMSwgW3IzXSwgIzY0Ci0JbGRjCXAwLCBjOCwgZm9vCi1mb286Ci0KLQlzdGMJNSwgY3IwLCBbcjNdCi0Jc3RjbAkzLCBjcjE1LCBbcjAsICM4XQotCXN0Y2VxCXA0LCBjcjEyLCBbcjIsICMxMDBdIQotCXN0Y2NjCXA2LCBjOCwgW3I0XSwgIzQ4Ci0Jc3RjCXAxLCBjNywgYmFyCi1iYXI6Ci0KLQltcmMJMiwgMywgcjUsIGMxLCBjMgotCW1yY2dlCXA0LCA1LCByMTUsIGNyMSwgY3IyLCA3Ci0KLQltY3IJcDcsIDEsIHIxNSwgY3IxLCBjcjEKLQltY3JsdAk1LCAxLCByOCwgY3IyLCBjcjksIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2Zsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWVlOTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2Zsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0JbXZmZQlmMCwgZjEKLQltdmZlcWUJZjMsIGY1Ci0JbXZmZXFkCWY0LCAjMS4wCi0JbXZmcwlmNCwgZjcKLQltdmZzcAlmMCwgZjEKLQltdmZkbQlmMywgZjQKLQltdmZleglmNywgZjcKLQotCWFkZmUJZjAsIGYxLCAjMi4wCi0JYWRmZXFlCWYxLCBmMiwgIzAuNQotCWFkZnNtCWYzLCBmNCwgZjUKLQkKLQlzdWZkCWYwLCBmMCwgIzIuMAotCXN1ZnMJZjEsIGYyLCAjMTAuMAotCXN1Zm5lZXogZjMsIGY0LCBmNQotCi0JcnNmcwlmMSwgZjEsICMwLjAKLQlyc2ZkcAlmMywgZjAsICM1LjAKLQlyc2ZsZWQJZjcsIGY2LCBmMAotCi0JbXVmZAlmMCwgZjAsIGYwCi0JbXVmZXoJZjEsIGYyLCAjMy4wCi0JbXVmYWxzCWYwLCBmMCwgIzQuMAotCi0JZHZmZAlmMCwgZjAsICMxLjAwMDAKLQlkdmZleglmMCwgZjEsICMxMGUwCi0JZHZmbWlzbSBmMywgZjQsIGY1Ci0KLQlyZGZlCWYwLCBmMSwgIzEuMGUxCi0JcmRmcwlmMywgZjcsICMwZjEKLQlyZGZjY2RwCWY0LCBmNCwgZjMKLQotCXBvd2QJZjAsIGYyLCBmMwotCXBvd3MJZjEsIGYzLCAjMGUxZTEKLQlwb3djc2V6CWY0LCBmNywgIzEKLQotCXJwd3MJZjcsIGY2LCBmNwotCXJwd2VxZAlmMCwgZjEsIGYyCi0JcnB3ZW0JZjIsIGYyLCBmMwotCi0Jcm1mZAlmMSwgZjIsICMzCi0Jcm1mdnNzCWYzLCBmNCwgZjQKLQlybWZlcAlmNCwgZjcsIGYwCi0KLQlmbWxzCWYwLCBmMSwgZjIKLQlmbWxlcXMJZjEsIGYzLCBmNQotCWZtbHBsc3oJZjQsIGY2LCBmMAotCi0JZmR2cwlmMSwgZjMsICMxMAotCWZkdnNwCWYwLCBmMSwgZjIKLQlmZHZoc3NtCWY0LCBmNCwgZjQKLQotCWZyZHMJZjEsIGYxLCAjMS4wCi0JZnJkZ3RzCWYyLCBmMSwgZjAKLQlmcmRndHN6CWY0LCBmNCwgZjUKLQotCXBvbGQJZjAsIGYxLCBmMgotCXBvbHN6CWY0LCBmNiwgIzMuMAotCXBvbGVxZQlmNSwgZjYsIGY3Ci0KLQltbmZzCWYwLCBmMQotCW1uZmQJZjAsICMzLjAKLQltbmZleglmMCwgIzQuMAotCW1uZmVxZXogZjAsIGY1Ci0JbW5mc3AJZjAsIGY0Ci0JbW5mZG0JZjEsIGY3Ci0KLQlhYnNkCWYwLCBmMQotCWFic3NwCWYxLCAjMy4wCi0JYWJzZXFlCWY0LCBmNQotCi0Jcm5kcwlmMSwgZjIKLQlybmRkCWYzLCBmNAotCXJuZGVxZXoJZjYsICM0LjAKLQotCXNxdHMJZjUsIGY1Ci0Jc3F0ZHAJZjYsIGY2Ci0Jc3F0cGxleiBmNywgZjYKLQotCWxvZ3MJZjAsICMxMAotCWxvZ2UJZjAsICMwZjEwCi0JbG9nbmVkeglmMCwgZjEKLQotCWxnbmUJZjEsIGYyCi0JbGduZHoJZjEsIGYzCi0JbGdudmNzCWYzLCBmNAotCi0JZXhwcwlmMSwgZjMKLQlleHBlbQlmMywgIzEwLjAKLQlleHBwbGQJZjYsIGY3Ci0KLQlzaW5kCWYwLCBmMQotCXNpbnNtCWYxLCBmMgotCXNpbmd0ZQlmNCwgIzUKLQotCWNvc2QJZjEsIGYzCi0JY29zZW0JZjQsIGY1Ci0JY29zbmVkcAlmNiwgZjEKLQotCXRhbmUJZjEsIGY1Ci0JdGFuc3oJZjQsIGY3Ci0JdGFuZ2VkeglmMSwgIzQuMAotCi0JYXNuZQlmNCwgZjUKLQlhc25zcAlmNiwgIzVlLTEKLQlhc25taWR6CWY1LCBmNQotCi0JYWNzcwlmNSwgZjYKLQlhY3NkCWY2LCBmMAotCWFjc2hzZW0JZjEsICMwLjA1ZTEKLQotCWF0bmUJZjAsIGY1Ci0JYXRuc3oJZjEsICM1Ci0JYXRubHRkCWYzLCBmMgotCi0JdXJkZQlmNSwgZjQKLQlucm1lCWY2LCBmNQotCW5ybXBsZHoJZjcsIGY1Ci0KLQlmbHRzcAlmMCwgcjgKLQlmbHRlCWYxLCByMAotCWZsdGVxZHoJZjUsIHI3Ci0KLQlmaXgJcjAsIGYxCi0JZml4eglyMSwgZjcKLQlmaXhjc20JcjUsIGY1Ci0KLQl3ZmMJcjAKLQl3ZnMJcjEKLQlyZnNlcQlyMgotCXJmYwlyNAotCi0JY21mCWYwLCAjMQotCWNtZglmMSwgZjIKLQljbWZlcQlmMCwgZjEKLQotCWNuZglmMCwgIzMKLQljbmYJZjEsICMwLjUKLQljbmZ2cwlmMywgZjQKLQotCWNtZmUJZjAsIGYxCi0JY21mZWVxCWYxLCBmMgotCWNtZmVxZQlmMywgIzUuMAotCi0JY25mZQlmMSwgZjMKLQljbmZlZXEJZjMsIGY0Ci0JY25mZXFlCWY0LCBmNwotCWNuZmFsZQlmNCwgIzUuMAotCi0JbGZtCWYwLCA0LCBbcjBdCi0JbGZtCWYwLCA0LCBbcjAsICMwXQotCWxmbQlmMSwgNCwgW3IxLCAjNjRdCi0Jc2ZtCWYyLCA0LCBbcjE0LCAjMTAyMF0hCi0Jc2ZtZXEJZjcsIDMsIFtyOF0sICMtMTAyMAotCi0JbGZtZmQJZjYsIDIsIFtyMTVdCi0Jc2ZtZWEJZjcsIDEsIFtyOF0hCi0JbGZtZXFlYQlmNSwgNCwgW3I2XQotCXNmbW5lZmQJZjQsIDMsIFtyMl0KLQlzZm1uZWZkCWY0LCAzLCBbcjJdIQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW1tZWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMDkyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW1tZWQucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUAJVGVzdHMgZm9yIGNvbXBsZXggaW1tZWRpYXRlIGV4cHJlc3Npb25zIC0gbm9uZSBvZiB0aGVzZSBuZWVkIAotQAlyZWxvY2F0aW9ucwotCS50ZXh0Ci1iYXI6Ci0JbW92CXIwLCAjMAotCW1vdglyMCwgIyguIC0gYmFyIC0gOCkKLQlsZHIJcjAsIGJhcgotCWxkcglyMCwgW3BjLCAjIChiYXIgLSAuIC04KV0KLQkuc3BhY2UgNDA5NgotCW1vdglyMCwgIyguIC0gYmFyIC0gOCkgJiAweGZmCi0JbGRyCXIwLCBbcGMsICMgKGJhciAtIC4gLTgpICYgMHhmZl0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY2YWRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLS1zaG93LXJhdy1pbnNuCi0jbmFtZTogQVJNIGJhc2ljIGluc3RydWN0aW9ucwotI2FzOiAtbWFybTIgLUVMCi0KLSMgVGVzdCB0aGUgc3RhbmRhcmQgQVJNIGluc3RydWN0aW9uczoKLQotLio6ICtmaWxlIGZvcm1hdCAuKmFybS4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8W14+XSo+IGUzYTAwMDAwID8JbW92CXIwLCAjMAk7IDB4MAotMDAwMDAwMDQgPFtePl0qPiBlMWEwMTAwMiA/CW1vdglyMSwgcjIKLTAwMDAwMDA4IDxbXj5dKj4gZTFhMDMxODQgPwltb3YJcjMsIHI0LCBsc2wgIzMKLTAwMDAwMDBjIDxbXj5dKj4gZTFhMDU3MzYgPwltb3YJcjUsIHI2LCBsc3IgcjcKLTAwMDAwMDEwIDxbXj5dKj4gZTFhMDhhNTkgPwltb3YJcjgsIHI5LCBhc3IgcjEwCi0wMDAwMDAxNCA8W14+XSo+IGUxYTBiZDFjID8JbW92CXIxMSwgcjEyLCBsc2wgc3AKLTAwMDAwMDE4IDxbXj5dKj4gZTFhMGUwNmYgPwltb3YJbHIsIHBjLCBycngKLTAwMDAwMDFjIDxbXj5dKj4gZTFhMDEwMDIgPwltb3YJcjEsIHIyCi0wMDAwMDAyMCA8W14+XSo+IDAxYTAyMDAzID8JbW92ZXEJcjIsIHIzCi0wMDAwMDAyNCA8W14+XSo+IDExYTA0MDA1ID8JbW92bmUJcjQsIHI1Ci0wMDAwMDAyOCA8W14+XSo+IGIxYTA2MDA3ID8JbW92bHQJcjYsIHI3Ci0wMDAwMDAyYyA8W14+XSo+IGExYTA4MDA5ID8JbW92Z2UJcjgsIHI5Ci0wMDAwMDAzMCA8W14+XSo+IGQxYTBhMDBiID8JbW92bGUJcjEwLCByMTEKLTAwMDAwMDM0IDxbXj5dKj4gYzFhMGMwMGQgPwltb3ZndAlyMTIsIHNwCi0wMDAwMDAzOCA8W14+XSo+IDMxYTAxMDAyID8JbW92Y2MJcjEsIHIyCi0wMDAwMDAzYyA8W14+XSo+IDIxYTAxMDAzID8JbW92Y3MJcjEsIHIzCi0wMDAwMDA0MCA8W14+XSo+IDQxYTAzMDA2ID8JbW92bWkJcjMsIHI2Ci0wMDAwMDA0NCA8W14+XSo+IDUxYTA3MDA5ID8JbW92cGwJcjcsIHI5Ci0wMDAwMDA0OCA8W14+XSo+IDYxYTAxMDA4ID8JbW92dnMJcjEsIHI4Ci0wMDAwMDA0YyA8W14+XSo+IDcxYTA5ZmExID8JbW92dmMJcjksIHIxLCBsc3IgIzMxCi0wMDAwMDA1MCA8W14+XSo+IDgxYTA4MDBmID8JbW92aGkJcjgsIHBjCi0wMDAwMDA1NCA8W14+XSo+IDkxYTBmMDBlID8JbW92bHMJcGMsIGxyCi0wMDAwMDA1OCA8W14+XSo+IDIxYTA5MDA4ID8JbW92Y3MJcjksIHI4Ci0wMDAwMDA1YyA8W14+XSo+IDMxYTAxMDAzID8JbW92Y2MJcjEsIHIzCi0wMDAwMDA2MCA8W14+XSo+IGUxYjAwMDA4ID8JbW92cwlyMCwgcjgKLTAwMDAwMDY0IDxbXj5dKj4gMzFiMDAwMDcgPwltb3ZjY3MJcjAsIHI3Ci0wMDAwMDA2OCA8W14+XSo+IGUyODEwMDBhID8JYWRkCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDA2YyA8W14+XSo+IGUwODMyMDA0ID8JYWRkCXIyLCByMywgcjQKLTAwMDAwMDcwIDxbXj5dKj4gZTA4NjUyODcgPwlhZGQJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDA3NCA8W14+XSo+IGUwODIxMTEzID8JYWRkCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwNzggPFtePl0qPiBlMjAxMDAwYSA/CWFuZAlyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwN2MgPFtePl0qPiBlMDAzMjAwNCA/CWFuZAlyMiwgcjMsIHI0Ci0wMDAwMDA4MCA8W14+XSo+IGUwMDY1Mjg3ID8JYW5kCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwODQgPFtePl0qPiBlMDAyMTExMyA/CWFuZAlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMDg4IDxbXj5dKj4gZTIyMTAwMGEgPwllb3IJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMDhjIDxbXj5dKj4gZTAyMzIwMDQgPwllb3IJcjIsIHIzLCByNAotMDAwMDAwOTAgPFtePl0qPiBlMDI2NTI4NyA/CWVvcglyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMDk0IDxbXj5dKj4gZTAyMjExMTMgPwllb3IJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDA5OCA8W14+XSo+IGUyNDEwMDBhID8Jc3ViCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDA5YyA8W14+XSo+IGUwNDMyMDA0ID8Jc3ViCXIyLCByMywgcjQKLTAwMDAwMGEwIDxbXj5dKj4gZTA0NjUyODcgPwlzdWIJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBhNCA8W14+XSo+IGUwNDIxMTEzID8Jc3ViCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwYTggPFtePl0qPiBlMmExMDAwYSA/CWFkYwlyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwYWMgPFtePl0qPiBlMGEzMjAwNCA/CWFkYwlyMiwgcjMsIHI0Ci0wMDAwMDBiMCA8W14+XSo+IGUwYTY1Mjg3ID8JYWRjCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwYjQgPFtePl0qPiBlMGEyMTExMyA/CWFkYwlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGI4IDxbXj5dKj4gZTJjMTAwMGEgPwlzYmMJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMGJjIDxbXj5dKj4gZTBjMzIwMDQgPwlzYmMJcjIsIHIzLCByNAotMDAwMDAwYzAgPFtePl0qPiBlMGM2NTI4NyA/CXNiYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGM0IDxbXj5dKj4gZTBjMjExMTMgPwlzYmMJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBjOCA8W14+XSo+IGUyNjEwMDBhID8JcnNiCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDBjYyA8W14+XSo+IGUwNjMyMDA0ID8JcnNiCXIyLCByMywgcjQKLTAwMDAwMGQwIDxbXj5dKj4gZTA2NjUyODcgPwlyc2IJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBkNCA8W14+XSo+IGUwNjIxMTEzID8JcnNiCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwZDggPFtePl0qPiBlMmUxMDAwYSA/CXJzYwlyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwZGMgPFtePl0qPiBlMGUzMjAwNCA/CXJzYwlyMiwgcjMsIHI0Ci0wMDAwMDBlMCA8W14+XSo+IGUwZTY1Mjg3ID8JcnNjCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwZTQgPFtePl0qPiBlMGUyMTExMyA/CXJzYwlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGU4IDxbXj5dKj4gZTM4MTAwMGEgPwlvcnIJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMGVjIDxbXj5dKj4gZTE4MzIwMDQgPwlvcnIJcjIsIHIzLCByNAotMDAwMDAwZjAgPFtePl0qPiBlMTg2NTI4NyA/CW9ycglyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGY0IDxbXj5dKj4gZTE4MjExMTMgPwlvcnIJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBmOCA8W14+XSo+IGUzYzEwMDBhID8JYmljCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDBmYyA8W14+XSo+IGUxYzMyMDA0ID8JYmljCXIyLCByMywgcjQKLTAwMDAwMTAwIDxbXj5dKj4gZTFjNjUyODcgPwliaWMJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDEwNCA8W14+XSo+IGUxYzIxMTEzID8JYmljCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAxMDggPFtePl0qPiBlM2UwMDAwYSA/CW12bglyMCwgIzEwCTsgMHhhCi0wMDAwMDEwYyA8W14+XSo+IGUxZTAyMDA0ID8JbXZuCXIyLCByNAotMDAwMDAxMTAgPFtePl0qPiBlMWUwNTI4NyA/CW12bglyNSwgcjcsIGxzbCAjNQotMDAwMDAxMTQgPFtePl0qPiBlMWUwMTExMyA/CW12bglyMSwgcjMsIGxzbCByMQotMDAwMDAxMTggPFtePl0qPiBlMzEwMDAwYSA/CXRzdAlyMCwgIzEwCTsgMHhhCi0wMDAwMDExYyA8W14+XSo+IGUxMTIwMDA0ID8JdHN0CXIyLCByNAotMDAwMDAxMjAgPFtePl0qPiBlMTE1MDI4NyA/CXRzdAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxMjQgPFtePl0qPiBlMTExMDExMyA/CXRzdAlyMSwgcjMsIGxzbCByMQotMDAwMDAxMjggPFtePl0qPiBlMzMwMDAwYSA/CXRlcQlyMCwgIzEwCTsgMHhhCi0wMDAwMDEyYyA8W14+XSo+IGUxMzIwMDA0ID8JdGVxCXIyLCByNAotMDAwMDAxMzAgPFtePl0qPiBlMTM1MDI4NyA/CXRlcQlyNSwgcjcsIGxzbCAjNQotMDAwMDAxMzQgPFtePl0qPiBlMTMxMDExMyA/CXRlcQlyMSwgcjMsIGxzbCByMQotMDAwMDAxMzggPFtePl0qPiBlMzUwMDAwYSA/CWNtcAlyMCwgIzEwCTsgMHhhCi0wMDAwMDEzYyA8W14+XSo+IGUxNTIwMDA0ID8JY21wCXIyLCByNAotMDAwMDAxNDAgPFtePl0qPiBlMTU1MDI4NyA/CWNtcAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxNDQgPFtePl0qPiBlMTUxMDExMyA/CWNtcAlyMSwgcjMsIGxzbCByMQotMDAwMDAxNDggPFtePl0qPiBlMzcwMDAwYSA/CWNtbglyMCwgIzEwCTsgMHhhCi0wMDAwMDE0YyA8W14+XSo+IGUxNzIwMDA0ID8JY21uCXIyLCByNAotMDAwMDAxNTAgPFtePl0qPiBlMTc1MDI4NyA/CWNtbglyNSwgcjcsIGxzbCAjNQotMDAwMDAxNTQgPFtePl0qPiBlMTcxMDExMyA/CWNtbglyMSwgcjMsIGxzbCByMQotMDAwMDAxNTggPFtePl0qPiBlMzMwZjAwYSA/CXRlcXAJcjAsICMxMAk7IDB4YQotMDAwMDAxNWMgPFtePl0qPiBlMTMyZjAwNCA/CXRlcXAJcjIsIHI0Ci0wMDAwMDE2MCA8W14+XSo+IGUxMzVmMjg3ID8JdGVxcAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxNjQgPFtePl0qPiBlMTMxZjExMyA/CXRlcXAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTY4IDxbXj5dKj4gZTM3MGYwMGEgPwljbW5wCXIwLCAjMTAJOyAweGEKLTAwMDAwMTZjIDxbXj5dKj4gZTE3MmYwMDQgPwljbW5wCXIyLCByNAotMDAwMDAxNzAgPFtePl0qPiBlMTc1ZjI4NyA/CWNtbnAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTc0IDxbXj5dKj4gZTE3MWYxMTMgPwljbW5wCXIxLCByMywgbHNsIHIxCi0wMDAwMDE3OCA8W14+XSo+IGUzNTBmMDBhID8JY21wcAlyMCwgIzEwCTsgMHhhCi0wMDAwMDE3YyA8W14+XSo+IGUxNTJmMDA0ID8JY21wcAlyMiwgcjQKLTAwMDAwMTgwIDxbXj5dKj4gZTE1NWYyODcgPwljbXBwCXI1LCByNywgbHNsICM1Ci0wMDAwMDE4NCA8W14+XSo+IGUxNTFmMTEzID8JY21wcAlyMSwgcjMsIGxzbCByMQotMDAwMDAxODggPFtePl0qPiBlMzEwZjAwYSA/CXRzdHAJcjAsICMxMAk7IDB4YQotMDAwMDAxOGMgPFtePl0qPiBlMTEyZjAwNCA/CXRzdHAJcjIsIHI0Ci0wMDAwMDE5MCA8W14+XSo+IGUxMTVmMjg3ID8JdHN0cAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxOTQgPFtePl0qPiBlMTExZjExMyA/CXRzdHAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTk4IDxbXj5dKj4gZTAwMDAyOTEgPwltdWwJcjAsIHIxLCByMgotMDAwMDAxOWMgPFtePl0qPiBlMDExMDM5MiA/CW11bHMJcjEsIHIyLCByMwotMDAwMDAxYTAgPFtePl0qPiAxMDAwMDA5MSA/CW11bG5lCXIwLCByMSwgcjAKLTAwMDAwMWE0IDxbXj5dKj4gOTAxOTA3OTggPwltdWxsc3MJcjksIHI4LCByNwotMDAwMDAxYTggPFtePl0qPiBlMDIxYmE5OSA/CW1sYQlyMSwgcjksIHIxMCwgcjExCi0wMDAwMDFhYyA8W14+XSo+IGUwMzNjOTk0ID8JbWxhcwlyMywgcjQsIHI5LCByMTIKLTAwMDAwMWIwIDxbXj5dKj4gYjAyOWQ3OTggPwltbGFsdAlyOSwgcjgsIHI3LCBzcAotMDAwMDAxYjQgPFtePl0qPiBhMDM0ZTM5MSA/CW1sYWdlcwlyNCwgcjEsIHIzLCBscgotMDAwMDAxYjggPFtePl0qPiBlNTkxMDAwMCA/CWxkcglyMCwgXFtyMVxdCi0wMDAwMDFiYyA8W14+XSo+IGU3OTExMDAyID8JbGRyCXIxLCBcW3IxLCByMlxdCi0wMDAwMDFjMCA8W14+XSo+IGU3YjMyMDA0ID8JbGRyCXIyLCBcW3IzLCByNFxdIQotMDAwMDAxYzQgPFtePl0qPiBlNTkyMjAyMCA/CWxkcglyMiwgXFtyMiwgIzMyXF0KLTAwMDAwMWM4IDxbXj5dKj4gZTc5MzI0MjQgPwlsZHIJcjIsIFxbcjMsIHI0LCBsc3IgIzhcXQotMDAwMDAxY2MgPFtePl0qPiAwN2I1NDQ4NCA/CWxkcmVxCXI0LCBcW3I1LCByNCwgbHNsICM5XF0hCi0wMDAwMDFkMCA8W14+XSo+IDE0OTU0MDA2ID8JbGRybmUJcjQsIFxbcjVcXSwgIzYKLTAwMDAwMWQ0IDxbXj5dKj4gZTZiMjEwMDMgPwlsZHJ0CXIxLCBcW3IyXF0sIHIzCi0wMDAwMDFkOCA8W14+XSo+IGU2OTQyNDI1ID8JbGRyCXIyLCBcW3I0XF0sIHI1LCBsc3IgIzgKLTAwMDAwMWRjIDxbXj5dKj4gZTUxZjAwMDggPwlsZHIJcjAsIFxbcGMsICNmZmZmZmZmOFxdCTsgMDAwMDAxZGMgPFtePl0qPgotMDAwMDAxZTAgPFtePl0qPiBlNWQ0MzAwMCA/CWxkcmIJcjMsIFxbcjRcXQotMDAwMDAxZTQgPFtePl0qPiAxNGY4NTAwMCA/CWxkcm5lYnQJcjUsIFxbcjhcXQotMDAwMDAxZTggPFtePl0qPiBlNTgxMDAwMCA/CXN0cglyMCwgXFtyMVxdCi0wMDAwMDFlYyA8W14+XSo+IGU3ODExMDAyID8Jc3RyCXIxLCBcW3IxLCByMlxdCi0wMDAwMDFmMCA8W14+XSo+IGU3YTQzMDAzID8Jc3RyCXIzLCBcW3I0LCByM1xdIQotMDAwMDAxZjQgPFtePl0qPiBlNTgyMjAyMCA/CXN0cglyMiwgXFtyMiwgIzMyXF0KLTAwMDAwMWY4IDxbXj5dKj4gZTc4MzI0MjQgPwlzdHIJcjIsIFxbcjMsIHI0LCBsc3IgIzhcXQotMDAwMDAxZmMgPFtePl0qPiAwN2E1NDQ4NCA/CXN0cmVxCXI0LCBcW3I1LCByNCwgbHNsICM5XF0hCi0wMDAwMDIwMCA8W14+XSo+IDE0ODU0MDA2ID8Jc3RybmUJcjQsIFxbcjVcXSwgIzYKLTAwMDAwMjA0IDxbXj5dKj4gZTY4MjEwMDMgPwlzdHIJcjEsIFxbcjJcXSwgcjMKLTAwMDAwMjA4IDxbXj5dKj4gZTZhNDI0MjUgPwlzdHJ0CXIyLCBcW3I0XF0sIHI1LCBsc3IgIzgKLTAwMDAwMjBjIDxbXj5dKj4gZTUwZjEwMDQgPwlzdHIJcjEsIFxbcGMsICNmZmZmZmZmY1xdCTsgMDAwMDAyMTAgPFtePl0qPgotMDAwMDAyMTAgPFtePl0qPiBlNWM3MTAwMCA/CXN0cmIJcjEsIFxbcjdcXQotMDAwMDAyMTQgPFtePl0qPiBlNGUwMjAwMCA/CXN0cmJ0CXIyLCBcW3IwXF0KLTAwMDAwMjE4IDxbXj5dKj4gZTg5MDAwMDIgPwlsZG1pYQlyMCwge3IxfQotMDAwMDAyMWMgPFtePl0qPiAwOTkyMDAzOCA/CWxkbWVxaWIJcjIsIHtyMywgcjQsIHI1fQotMDAwMDAyMjAgPFtePl0qPiBlODUzZmZmZiA/CWxkbWRhCXIzLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIHNwLCBsciwgcGN9XF4KLTAwMDAwMjI0IDxbXj5dKj4gZTkzYjA1ZmYgPwlsZG1kYglyMTEhLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjEwfQotMDAwMDAyMjggPFtePl0qPiBlOTkxMDBmNyA/CWxkbWliCXIxLCB7cjAsIHIxLCByMiwgcjQsIHI1LCByNiwgcjd9Ci0wMDAwMDIyYyA8W14+XSo+IGU4OTIwMWY4ID8JbGRtaWEJcjIsIHtyMywgcjQsIHI1LCByNiwgcjcsIHI4fQotMDAwMDAyMzAgPFtePl0qPiBlOTEzMDAwMyA/CWxkbWRiCXIzLCB7cjAsIHIxfQotMDAwMDAyMzQgPFtePl0qPiBlODc0MDMwMCA/CWxkbWRhCXI0ISwge3I4LCByOX1cXgotMDAwMDAyMzggPFtePl0qPiBlODgwMDAwMiA/CXN0bWlhCXIwLCB7cjF9Ci0wMDAwMDIzYyA8W14+XSo+IDA5ODIwMDM4ID8Jc3RtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0wMDAwMDI0MCA8W14+XSo+IGU4NDNmZmZmID8Jc3RtZGEJcjMsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgc3AsIGxyLCBwY31cXgotMDAwMDAyNDQgPFtePl0qPiBlOTJhMDVmZiA/CXN0bWRiCXIxMCEsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByMTB9Ci0wMDAwMDI0OCA8W14+XSo+IGU4MDEwMDA3ID8Jc3RtZGEJcjEsIHtyMCwgcjEsIHIyfQotMDAwMDAyNGMgPFtePl0qPiBlOTAyMDAxOCA/CXN0bWRiCXIyLCB7cjMsIHI0fQotMDAwMDAyNTAgPFtePl0qPiBlODgzMDAwMyA/CXN0bWlhCXIzLCB7cjAsIHIxfQotMDAwMDAyNTQgPFtePl0qPiBlOWU0MDMwMCA/CXN0bWliCXI0ISwge3I4LCByOX1cXgotMDAwMDAyNTggPFtePl0qPiBlZjEyMzQ1NiA/CXN3aQkweDAwMTIzNDU2Ci0wMDAwMDI1YyA8W14+XSo+IDJmMDAwMDMzID8Jc3dpY3MJMHgwMDAwMDAzMwotMDAwMDAyNjAgPFtePl0qPiBlYmZmZmZmZSA/CWJsCTAwMDAwMjYwIDxbXj5dKj4KLVsJCV0qMjYwOi4qX3dvbWJhdC4qCi0wMDAwMDI2NCA8W14+XSo+IDViZmZmZmZlID8JYmxwbAkwMDAwMDI2NCA8W14+XSo+Ci1bCQldKjI2NDouKkFSTS4qaG9odW0KLTAwMDAwMjY4IDxbXj5dKj4gZWFmZmZmZmUgPwliCTAwMDAwMjY4IDxbXj5dKj4KLVsJCV0qMjY4Oi4qX3dpYmJsZS4qCi0wMDAwMDI2YyA8W14+XSo+IGRhZmZmZmZlID8JYmxlCTAwMDAwMjZjIDxbXj5dKj4KLVsJCV0qMjZjOi4qdGVzdGVyZnVuYy4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwMzc1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLUAJVGVzdCBmaWxlIGZvciBBUk0vR0FTIC0tIGJhc2ljIGluc3RydWN0aW9ucwotCi0udGV4dAotLmFsaWduCi0JbW92CXIwLCAjMAotCW1vdglyMSwgcjIKLQltb3YJcjMsIHI0LCBsc2wgIzMKLQltb3YJcjUsIHI2LCBsc3IgcjcKLQltb3YJcjgsIHI5LCBhc3IgcjEwCi0JbW92CXIxMSwgcjEyLCBhc2wgcjEzCi0JbW92CXIxNCwgcjE1LCBycngKLQltb3ZhbAlyMSwgcjIKLQltb3ZlcQlyMiwgcjMKLQltb3ZuZQlyNCwgcjUKLQltb3ZsdAlyNiwgcjcKLQltb3ZnZQlyOCwgcjkKLQltb3ZsZQlyMTAsIHIxMQotCW1vdmd0CXIxMiwgcjEzCi0JbW92Y2MJcjEsIHIyCi0JbW92Y3MJcjEsIHIzCi0JbW92bWkJcjMsIHI2Ci0JbW92cGwJcjcsIHI5Ci0JbW92dnMJcjEsIHI4Ci0JbW92dmMJcjksIHIxLCBsc3IgIzMxCi0JbW92aGkJcjgsIHIxNQotCW1vdmxzCXIxNSwgcjE0Ci0JbW92aHMJcjksIHI4Ci0JbW92dWwJcjEsIHIzCi0JbW92cwlyMCwgcjgKLQltb3Z1bHMJcjAsIHI3Ci0JCi0JYWRkCXIwLCByMSwgIzEwCi0JYWRkCXIyLCByMywgcjQKLQlhZGQJcjUsIHI2LCByNywgYXNsICM1Ci0JYWRkCXIxLCByMiwgcjMsIGxzbCByMQotCi0JYW5kCXIwLCByMSwgIzEwCi0JYW5kCXIyLCByMywgcjQKLQlhbmQJcjUsIHI2LCByNywgYXNsICM1Ci0JYW5kCXIxLCByMiwgcjMsIGxzbCByMQotCi0JZW9yCXIwLCByMSwgIzEwCi0JZW9yCXIyLCByMywgcjQKLQllb3IJcjUsIHI2LCByNywgYXNsICM1Ci0JZW9yCXIxLCByMiwgcjMsIGxzbCByMQotCi0Jc3ViCXIwLCByMSwgIzEwCi0Jc3ViCXIyLCByMywgcjQKLQlzdWIJcjUsIHI2LCByNywgYXNsICM1Ci0Jc3ViCXIxLCByMiwgcjMsIGxzbCByMQotCi0JYWRjCXIwLCByMSwgIzEwCi0JYWRjCXIyLCByMywgcjQKLQlhZGMJcjUsIHI2LCByNywgYXNsICM1Ci0JYWRjCXIxLCByMiwgcjMsIGxzbCByMQotCi0Jc2JjCXIwLCByMSwgIzEwCi0Jc2JjCXIyLCByMywgcjQKLQlzYmMJcjUsIHI2LCByNywgYXNsICM1Ci0Jc2JjCXIxLCByMiwgcjMsIGxzbCByMQotCi0JcnNiCXIwLCByMSwgIzEwCi0JcnNiCXIyLCByMywgcjQKLQlyc2IJcjUsIHI2LCByNywgYXNsICM1Ci0JcnNiCXIxLCByMiwgcjMsIGxzbCByMQotCi0JcnNjCXIwLCByMSwgIzEwCi0JcnNjCXIyLCByMywgcjQKLQlyc2MJcjUsIHI2LCByNywgYXNsICM1Ci0JcnNjCXIxLCByMiwgcjMsIGxzbCByMQotCi0Jb3JyCXIwLCByMSwgIzEwCi0Jb3JyCXIyLCByMywgcjQKLQlvcnIJcjUsIHI2LCByNywgYXNsICM1Ci0Jb3JyCXIxLCByMiwgcjMsIGxzbCByMQotCi0JYmljCXIwLCByMSwgIzEwCi0JYmljCXIyLCByMywgcjQKLQliaWMJcjUsIHI2LCByNywgYXNsICM1Ci0JYmljCXIxLCByMiwgcjMsIGxzbCByMQotCi0JbXZuCXIwLCAjMTAKLQltdm4JcjIsIHI0Ci0JbXZuCXI1LCByNywgYXNsICM1Ci0JbXZuCXIxLCByMywgbHNsIHIxCi0KLQl0c3QJcjAsICMxMAotCXRzdAlyMiwgcjQKLQl0c3QJcjUsIHI3LCBhc2wgIzUKLQl0c3QJcjEsIHIzLCBsc2wgcjEKLQotCXRlcQlyMCwgIzEwCi0JdGVxCXIyLCByNAotCXRlcQlyNSwgcjcsIGFzbCAjNQotCXRlcQlyMSwgcjMsIGxzbCByMQotCi0JY21wCXIwLCAjMTAKLQljbXAJcjIsIHI0Ci0JY21wCXI1LCByNywgYXNsICM1Ci0JY21wCXIxLCByMywgbHNsIHIxCi0KLQljbW4JcjAsICMxMAotCWNtbglyMiwgcjQKLQljbW4JcjUsIHI3LCBhc2wgIzUKLQljbW4JcjEsIHIzLCBsc2wgcjEKLQotCXRlcXAJcjAsICMxMAotCXRlcXAJcjIsIHI0Ci0JdGVxcAlyNSwgcjcsIGFzbCAjNQotCXRlcXAJcjEsIHIzLCBsc2wgcjEKLQotCWNtbnAJcjAsICMxMAotCWNtbnAJcjIsIHI0Ci0JY21ucAlyNSwgcjcsIGFzbCAjNQotCWNtbnAJcjEsIHIzLCBsc2wgcjEKLQotCWNtcHAJcjAsICMxMAotCWNtcHAJcjIsIHI0Ci0JY21wcAlyNSwgcjcsIGFzbCAjNQotCWNtcHAJcjEsIHIzLCBsc2wgcjEKLQotCXRzdHAJcjAsICMxMAotCXRzdHAJcjIsIHI0Ci0JdHN0cAlyNSwgcjcsIGFzbCAjNQotCXRzdHAJcjEsIHIzLCBsc2wgcjEKLQotCW11bAlyMCwgcjEsIHIyCi0JbXVscwlyMSwgcjIsIHIzCi0JbXVsbmUJcjAsIHIxLCByMAotCW11bGxzcwlyOSwgcjgsIHI3Ci0KLQltbGEJcjEsIHI5LCByMTAsIHIxMQotCW1sYXMJcjMsIHI0LCByOSwgcjEyCi0JbWxhbHQJcjksIHI4LCByNywgcjEzCi0JbWxhZ2VzCXI0LCByMSwgcjMsIHIxNAotCi0JbGRyCXIwLCBbcjFdCi0JbGRyCXIxLCBbcjEsIHIyXQotCWxkcglyMiwgW3IzLCByNF0hCi0JbGRyCXIyLCBbcjIsICMzMl0KLQlsZHIJcjIsIFtyMywgcjQsIGxzciAjOF0KLQlsZHJlcQlyNCwgW3I1LCByNCwgYXNsICM5XSEKLQlsZHJuZQlyNCwgW3I1XSwgIzYKLQlsZHJ0CXIxLCBbcjJdLCByMwotCWxkcglyMiwgW3I0XSwgcjUsIGxzciAjOAotZm9vOgotCWxkcglyMCwgZm9vCi0JbGRyYglyMywgW3I0XQotCWxkcm5lYnQJcjUsIFtyOF0KLQkKLQlzdHIJcjAsIFtyMV0KLQlzdHIJcjEsIFtyMSwgcjJdCi0Jc3RyCXIzLCBbcjQsIHIzXSEKLQlzdHIJcjIsIFtyMiwgIzMyXQotCXN0cglyMiwgW3IzLCByNCwgbHNyICM4XQotCXN0cmVxCXI0LCBbcjUsIHI0LCBhc2wgIzldIQotCXN0cm5lCXI0LCBbcjVdLCAjNgotCXN0cglyMSwgW3IyXSwgcjMKLQlzdHJ0CXIyLCBbcjRdLCByNSwgbHNyICM4Ci0Jc3RyCXIxLCBiYXIKLWJhcjoKLQlzdHJhbGIJcjEsIFtyN10KLQlzdHJidAlyMiwgW3IwXQotCi0JbGRtaWEJcjAsIHtyMX0KLQlsZG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLQlsZG1hbGRhCXIzLCB7cjAtcjE1fV4KLQlsZG1kYglyMTEhLCB7cjAtcjgsIHIxMH0KLQlsZG1lZAlyMSwge3IwLCByMSwgcjJ9fDB4ZjAKLQlsZG1mZAlyMiwge3IzLCByNH0re3I1LCByNiwgcjcsIHI4fQotCWxkbWVhCXIzLCAzCi0JbGRtZmEJcjQhLCB7cjgsIHI5fV4KLQkKLQlzdG1pYQlyMCwge3IxfQotCXN0bWVxaWIJcjIsIHtyMywgcjQsIHI1fQotCXN0bWFsZGEJcjMsIHtyMC1yMTV9XgotCXN0bWRiCXIxMCEsIHtyMC1yOCwgcjEwfQotCXN0bWVkCXIxLCB7cjAsIHIxLCByMn0KLQlzdG1mZAlyMiwge3IzLCByNH0KLQlzdG1lYQlyMywgMwotCXN0bWZhCXI0ISwge3I4LCByOX1eCi0KLQlzd2kJMHgxMjM0NTYKLQlzd2locwkweDMzCi0KLQlibAlfd29tYmF0Ci0JYmxwbAlob2h1bQotCWIJX3dpYmJsZQotCWJsZQl0ZXN0ZXJmdW5jCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0ZTBlMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jb2JqZHVtcDogLXMKLSNhczogLUVMCi0jbmFtZTogYXJtIGxpdHRsZS1lbmRpYW4gZnBjb25zdAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qYXJtLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIGNkY2M4YzNmIDAwMDAwMDAwIDk5OTlmMTNmIDlhOTk5OTk5IC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzYzNkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIFRlc3QgZnAgY29uc3RhbnRzLgotIyBUaGVzZSBuZWVkIEFSTSBzcGVjaWZpYyBzdXBwb3J0IGJlY2F1c2UgOCBieXRlIGZwIGNvbnN0YW50cyBpbiBsaXR0bGUKLSMgZW5kaWFuIG1vZGUgYXJlIHJlcHJlc2VudGVkIGFibm9ybWFsbHkuCi0JCi0JLnRleHQKLQkuZmxvYXQgMS4xCi0JLmZsb2F0IDAKLQkuZG91YmxlIDEuMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL3RodW1iLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0YjgyZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0JLnRleHQKLQkuY29kZSAxNgotLmZvbzoJCi0JbHNsCXIyLCByMSwgIzMKLQlsc3IJcjMsIHI0LCAjMzEKLXdpYmJsZS9kYXRhOgkKLQlhc3IJcjcsIHIwLCAjNQotCi0JbHNsCXIxLCByMiwgIzAKLQlsc3IJcjMsIHI0LCAjMAotCWFzcglyNCwgcjUsICMwCi0KLQlsc3IJcjYsIHI3LCAjMzIKLQlhc3IJcjAsIHIxLCAjMzIKLQotCWFkZAlyMSwgcjIsIHIzCi0JYWRkCXIyLCByNCwgIzIKLQlzdWIJcjMsIHI1LCByNwotCXN1YglyMiwgcjQsICM3Ci0KLQltb3YJcjQsICMyNTUKLQljbXAJcjMsICMyNTAKLQlhZGQJcjYsICMxMjMKLQlzdWIJcjUsICMxMjgKLQotCWFuZAlyMywgcjUKLQllb3IJcjQsIHI2Ci0JbHNsCXIxLCByMAotCWxzcglyMiwgcjMKLQlhc3IJcjQsIHI2Ci0JYWRjCXI1LCByNwotCXNiYwlyMCwgcjQKLQlyb3IJcjEsIHI0Ci0JdHN0CXIyLCByNQotCW5lZwlyMSwgcjEKLQljbXAJcjIsIHIzCi0JY21uCXIxLCByNAotCW9ycglyMCwgcjMKLQltdWwJcjQsIHI1Ci0JYmljCXI1LCByNwotCW12bglyNSwgcjUKLQotCWFkZAlyMSwgcjEzCi0JYWRkCXIxMiwgcjIKLQlhZGQJcjksIHI5Ci0JY21wCXIxLCByMTQKLQljbXAJcjgsIHIwCi0JY21wCXIxMiwgcjE0Ci0JbW92CXIwLCByOQotCW1vdglyOSwgcjQKLQltb3YJcjgsIHI4Ci0JYngJcjcKLQlieAlyOAotCS5hbGlnbiAwCi0JYngJcGMKLQotCWxkcglyMywgW3BjLCAjMTI4XQotCWxkcglyNCwgYmFyCi0KLQlzdHIJcjAsIFtyMSwgcjJdCi0Jc3RyYglyMSwgW3IyLCByNF0KLQlsZHIJcjUsIFtyNiwgcjddCi0JbGRyYglyMiwgW3I0LCByNV0KLQkKLQkuYWxpZ24gMAotYmFyOgkKLQlzdHJoCXIxLCBbcjIsIHIzXQotCWxkcmgJcjMsIFtyNCwgcjBdCi0JbGRzYglyMSwgW3I2LCByN10KLQlsZHNoCXIyLCBbcjAsIHI1XQotCi0Jc3RyCXIzLCBbcjMsICMxMjRdCi0JbGRyCXIxLCBbcjQsICMxMjRdCi0JbGRyCXI1LCBbcjVdCi0Jc3RyYglyMSwgW3I1LCAjMzFdCi0Jc3RyYglyMSwgW3I0LCAjNV0KLQlzdHJiCXIyLCBbcjZdCi0KLQlzdHJoCXI0LCBbcjUsICM2Ml0KLQlsZHJoCXI1LCBbcjAsICM0XQotCWxkcmgJcjMsIFtyMl0KLQotCXN0cglyMywgW3IxMywgIzEwMjBdCi0JbGRyCXIxLCBbcjEzLCAjNDRdCi0JbGRyCXIyLCBbcjEzXQotCi0JYWRkCXI3LCByMTUsICMxMDIwCi0JYWRkCXI0LCByMTMsICM1MTIKLQotCWFkZAlyMTMsICMyNjgKLQlhZGQJcjEzLCAjLTEwNAotCXN1YglyMTMsICMyNjgKLQlzdWIJcjEzLCAjLTEwOAotCi0JcHVzaAl7cjAsIHIxLCByMiwgcjR9Ci0JcHVzaAl7cjAsIHIzLXI3LCBscn0KLQlwb3AJe3IzLCByNCwgcjd9Ci0JcG9wCXtyMC1yNywgcjE1fQotCi0Jc3RtaWEJcjMhLCB7cjAsIHIxLCByNC1yN30KLQlsZG1pYQlyMCEsIHtyMS1yN30KLQotCWJlcQliYXIKLQlibmUJYmFyCi0JYmNzCWJhcgotCWJjYwliYXIKLQlibWkJYmFyCi0JYnBsCWJhcgotCWJ2cwliYXIKLQlidmMJYmFyCi0JYmhpCWJhcgotCWJscwliYXIKLQliZ2UJYmFyCi0JYmd0CWJhcgotCWJsdAliYXIKLQliZ3QJYmFyCi0JYmxlCWJhcgotCWJoaQliYXIKLQlibG8JYmFyCi0JYnVsCWJhcgotCi1jbG9zZToKLQlsc2wJcjQsIHI1LCAjbmVhciAtIGNsb3NlCi1uZWFyOgotCWFkZAlyMiwgcjMsICNuZWFyIC0gY2xvc2UKLQotCWFkZAlzcCwgc3AsICMxMjcgPDwgMgotCXN1YglzcCwgc3AsICMxMjcgPDwgMgotCWFkZAlyMCwgc3AsICMyNTUgPDwgMgotCWFkZAlyMCwgcGMsICMyNTUgPDwgMgotCi0JYWRkCXNwLCBzcCwgI2JhciAtIC5mb28KLQlzdWIJc3AsIHNwLCAjYmFyIC0gLmZvbwotCWFkZAlyMCwgc3AsICNiYXIgLSAuZm9vCi0JYWRkCXIwLCBwYywgI2JhciAtIC5mb28KLQotCWFkZAlyMSwgI2JhciAtIC5mb28KLQltb3YJcjYsICNiYXIgLSAuZm9vCi0JY21wCXI3LCAjYmFyIC0gLmZvbwotCi0Jbm9wCi0Jbm9wCi0KLQkuYXJtCi0ubG9jYWxiYXI6Ci0JYgkubG9jYWxiYXIKLQliCS53b21iYXQKLQlibAkubG9jYWxiYXIKLQlibAkud29tYmF0Ci0KLQlieAlyMAotCXN3aQkweDEyMzQ1NgotCi0JLnRodW1iCi0JQCBUaGUgZm9sbG93aW5nIHdpbGwgYmUgZGlzYXNzZW1ibGVkIGluY29ycmVjdGx5IGlmIHdlIGRvIG5vdAotCUAgaGF2ZSBhIFRodW1iIHN5bWJvbCBkZWZpbmVkIGJlZm9yZSB0aGUgZmlyc3QgVGh1bWIgaW5zdHJ1Y3Rpb246Ci1tb3JldGh1bWI6Ci0JYWRyCXIwLCBmb3J3YXJkb25seQotCi0JYgkuZm9vCi0JYgkud29tYmF0Ci0JYmwJLmZvbwotCWJsCS53b21iYXQKLQotCWJ4CXIwCi0KLQlzd2kJMHhmZgotCS5hbGlnbgkwCi1mb3J3YXJkb25seToKLQliZXEJLndvbWJhdAotCWJuZQkud29tYmF0Ci0JYmNzCS53b21iYXQKLQliY2MJLndvbWJhdAotCWJtaQkud29tYmF0Ci0JYnBsCS53b21iYXQKLQlidnMJLndvbWJhdAotCWJ2Ywkud29tYmF0Ci0JYmhpCS53b21iYXQKLQlibHMJLndvbWJhdAotCWJnZQkud29tYmF0Ci0JYmd0CS53b21iYXQKLQlibHQJLndvbWJhdAotCWJndAkud29tYmF0Ci0JYmxlCS53b21iYXQKLQliaGkJLndvbWJhdAotCWJsbwkud29tYmF0Ci0JYnVsCS53b21iYXQKLQotLmJhY2s6Ci0JYmwJLmxvY2FsCi0JLnNwYWNlCSgxIDw8IDExKQlAIGxlYXZlIHNwYWNlIHRvIGZvcmNlIGxvbmcgb2Zmc2V0cwotLmxvY2FsOgotCWJsCS5iYWNrCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2QxMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2QxMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDM3MjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9kMTAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIwotIyBEcml2ZXIgZm9yIEQxMFYgYXNzZW1ibGVyIHRlc3RzdWl0ZQotIwotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICBnbG9iYWwgc3JjZGlyIHN1YmRpcgotICBzZXQgdGVzdG5hbWUgIkQxMFYgJG5hbWUiCi0gIHNldCBmaWxlICRzcmNkaXIvJHN1YmRpci8kbmFtZQotICBnYXNfcnVuICR7bmFtZX0ucyAkb3B0cyAiPiZkdW1wLm91dCIKLSAgaWYge1tyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmwiXSB9IHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotICAgIHJldHVybgotICB9Ci0gIHBhc3MgJHRlc3RuYW1lCi19Ci0KLWlmIHtbaXN0YXJnZXQgZDEwdi0qLSpdfSB7Ci0gIHJ1bl9kdW1wX3Rlc3QgImluc3QiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2luc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvaW5zdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNkYWZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvaW5zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQxMFYgYmFzaWMgaW5zdHJ1Y3Rpb24gdGVzdCBvdXRwdXQKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMTB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxzdGFydD46Ci0gICAwOglhOSAwNCBjMiAyOSAJc2FjCXIwLCBhMAk8LQlzYWNoaQlyMSwgYTAKLSAgIDQ6CWE5IDA2IGMyIDJkIAlyYWMJcjAsIGEwLCAtMHgyCTwtCXJhY2hpCXIxLCBhMCwgLTB4MgotICAgODoJMmYgMDAgMzIgMjYgCW5vcAkJfHwJc2xhZQlhMCwgcjMKLSAgIGM6CWYyIDExIDA4IDAwIAlsZAlyMSwgQDB4ODAwCi0gIDEwOglmMyAwMSAwOCAwMCAJbGQydwlyMCwgQDB4ODAwCi0gIDE0OglmNyAwMSAwOCAwMCAJc3QydwlyMCwgQDB4ODAwCi0gIDE4OglmNiAxMSAwOCAwMCAJc3QJcjEsIEAweDgwMAotICAxYzoJNmYgMDAgNWUgMDAgCW5vcAkJLT4Jbm9wCQotICAyMDoJNmYgMDAgNWUgMDAgCW5vcAkJLT4Jbm9wCQotICAyNDoJMmYgMDAgNWUgMDAgCW5vcAkJfHwJbm9wCQotICAyODoJYWYgMDAgNWUgMDAgCW5vcAkJPC0Jbm9wCQotICAyYzoJMjMgMTEgZGUgMDAgCW5vdAlyMQl8fAlub3AJCi0gIDMwOgk2MyAyMSBkZSAwMCAJbm90CXIyCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvaW5zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9pbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGZhNzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9pbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIHRlc3QgYWxsIGluc3RydWN0aW9ucy4gRklYTUU6IG1hbnkgaW5zdHJ1Y3Rpb25zIG1pc3NpbmcuCi0KLXN0YXJ0OgotCXNhY2hpCXIxLCBhMAotCXNhYwlyMCwgYTAKLQkjCi0JIyBkaXNhc3NlbWJsZXIgdGVzdC4gc2FjaGkmc2FjIHNob3VsZCBub3QgCi0JIyBiZSBjb25mdXNlZCB3aXRoIHJhY2hpJnJhYwotCSMKLQlyYWNoaQlyMSwgYTAsIC0weDIKLQlyYWMJcjAsIGEwLCAtMHgyCi0Jc2xhZQlhMCwgcjMKLQlsZAlyMSwgQDB4MDgwMAotCWxkMncJcjAsIEAweDA4MDAKLQlzdDJ3CXIwLCBAMHgwODAwCi0Jc3QJcjEsIEAweDA4MDAKLQotIyBWTElXIHN5bnRheCB0ZXN0Ci0Jbm9wCi0Jbm9wCi0Jbm9wCS0+CW5vcAotCW5vcAl8fAlub3AKLQlub3AJPC0Jbm9wCi0KLSMgdHJ5IGNoYW5naW5nIHNlY3Rpb25zCi0Jbm90CXIxCi0JLnNlY3Rpb24gLmZvbwotCWFkZDMJcjEwLHIxMiw2Ci0JLnRleHQKLQlub3QJcjIKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2NzY4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBhbGlnbm1lbnQgdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxzdGFydD46Ci0gICAwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgIDg6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAxMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDE4OgkwMGYwMDAwMCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMjA6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAyODoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDMwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMDM5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIHRlc3RzIHByb3BlciBoYW5kbGluZyBvZiBhbGlnbnMgb24gRDMwVgotCi0JLnRleHQKLQkuYWxpZ24gMwotc3RhcnQ6Ci0JYWJzCXIyMSxyNDIKLQkuYWxpZ24gMwotCWFicwlyMjEscjQyCi0JLmFsaWduIDQKLQlhYnMJcjIxLHI0MgotCS5hbGlnbiA0Ci0JYWJzCXIyMSxyNDIKLQkKLQkuZGF0YQotCS5sb25nCTB4ZGVhZGJlZWYKLQkKLQkudGV4dAotCWFicwlyMjEscjQyCi0KLQkuZGF0YQotCS5hbGlnbiA0Ci0JLmxvbmcJMHhkZWFkYmVlZgotCQotCS50ZXh0Ci0JLmFsaWduIDMKLQlhYnMJcjIxLHI0MgotCS5lbmQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFiYzMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGFycmF5IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8X19mb28tMHg0OD46Ci0gICAwOgk4ODA4MjBjMCA4MDAwMDA0OCAJYWRkLmwJcjIsIHIzLCAweDQ4Ci0JCQkwOiBSX0QzMFZfMzIJLnRleHQKLSAgIDg6CTg4MDgyMGMwIDgwMDAwMDQ5IAlhZGQubAlyMiwgcjMsIDB4NDkKLQkJCTg6IFJfRDMwVl8zMgkudGV4dAotICAxMDoJODgwODIwYzAgODAwMDAwNGEgCWFkZC5sCXIyLCByMywgMHg0YQotCQkJMTA6IFJfRDMwVl8zMgkudGV4dAotICAxODoJODgwODIwYzAgODAwMDAwNGIgCWFkZC5sCXIyLCByMywgMHg0YgotCQkJMTg6IFJfRDMwVl8zMgkudGV4dAotICAyMDoJODgwODIwYzAgODAwMDAwNGMgCWFkZC5sCXIyLCByMywgMHg0YwotCQkJMjA6IFJfRDMwVl8zMgkudGV4dAotICAyODoJODgwODIwYzAgODAwMDAwNGQgCWFkZC5sCXIyLCByMywgMHg0ZAotCQkJMjg6IFJfRDMwVl8zMgkudGV4dAotICAzMDoJODgwODIwYzAgODAwMDAwNGUgCWFkZC5sCXIyLCByMywgMHg0ZQotCQkJMzA6IFJfRDMwVl8zMgkudGV4dAotICAzODoJODgwODIwYzAgODAwMDAwNGYgCWFkZC5sCXIyLCByMywgMHg0ZgotCQkJMzg6IFJfRDMwVl8zMgkudGV4dAotICA0MDoJODgwODIwYzAgODAwMDAwNTAgCWFkZC5sCXIyLCByMywgMHg1MAotCQkJNDA6IFJfRDMwVl8zMgkudGV4dAotCi0wKzAwNDggPF9fZm9vPjoKLSAgNDg6CTEyMzQ1Njc4IDEyMzQ1Njc4IAkubG9uZwkweDEyMzQ1Njc4CXx8CS5sb25nCTB4MTIzNDU2NzgKLSAgNTA6CTEyMzQ1Njc4IDAwMDAwMDAwICAgICAgCS5sb25nCTB4MTIzNDU2NzgJfHwJYnJhLnMJcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExODdkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIEQzMFYgYXJyYXkgdGVzdAotCS50ZXh0Ci0JYWRkIHIyLCByMyAsIF9fZm9vCi0JYWRkIHIyLCByMyAsIF9fZm9vKzEKLQlhZGQgcjIsIHIzICwgX19mb28rMgotCWFkZCByMiwgcjMgLCBfX2ZvbyszCi0JYWRkIHIyLCByMyAsIF9fZm9vKzQKLQlhZGQgcjIsIHIzICwgX19mb28rNQotCWFkZCByMiwgcjMgLCBfX2Zvbys2Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzcKLQlhZGQgcjIsIHIzICwgX19mb28rOAotX19mb286Ci0JLmludCAweDEyMzQ1Njc4Ci0gICAgICAgIC5pbnQgMHgxMjM0NTY3OAotICAgICAgICAuaW50IDB4MTIzNDU2NzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmFiNDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBiaXR0ZXN0IG9wdAotI2FzOiAtV08KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwMGYwMDAwMCA4NDQwMTA4MyAJbm9wCQktPglsZHcucwlyMSwgQFwocjIsIHIzXCkKLSAgIDg6CTA0NDA2MTQ0IDAwZjAwMDAwIAlsZHcucwlyNiwgQFwocjUsIHI0XCkJfHwJbm9wCQotICAxMDoJMDBmMDAwMDAgODIyMDEwODMgCW5vcAkJLT4JYnNldAlyMSwgcjIsIHIzCi0gIDE4Ogk4MGYwMDAwMCAwMjAwMTA4MyAJbm9wCQk8LQlidHN0CWYxLCByMiwgcjMKLSAgMjA6CTAwZjAwMDAwIDAyMzAxMDgzIAlub3AJCXx8CWJjbHIJcjEsIHIyLCByMwotICAyODoJMDBmMDAwMDAgODIxMDEwODMgCW5vcAkJLT4JYm5vdAlyMSwgcjIsIHIzCi0gIDMwOgkwMjEwMTA4MyA4MGYwMDAwMCAJYm5vdAlyMSwgcjIsIHIzCS0+CW5vcAkKLSAgMzg6CTA0N2MwMTA1IDAyMjAxMDgzIAltb2RkZWMJcjQsIDB4NQl8fAlic2V0CXIxLCByMiwgcjMKLSAgNDA6CTAyMjAxMDgzIDg0N2MwMTA1IAlic2V0CXIxLCByMiwgcjMJLT4JbW9kZGVjCXI0LCAweDUKLSAgNDg6CTAyMjAxMDgzIDA4YzA0MTQ2IAlic2V0CXIxLCByMiwgcjMJfHwJam9pbmxsLnMJcjQsIHI1LCByNgotICA1MDoJMDIyMDEwODMgMDhjMDQxNDYgCWJzZXQJcjEsIHIyLCByMwl8fAlqb2lubGwucwlyNCwgcjUsIHI2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkMWI3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QubAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjogV2FybmluZzogU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnRzdCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYmNsciBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYm5vdCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlcgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBiaXR0ZXN0LnMKLSAgIDIgICAgICAgICAgICAgIAkjCi0gICAzICAgICAgICAgICAgICAJIyBCaXQgb3BlcmF0aW9uIGluc3RydWN0aW9ucyBcKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1RcKSBzaG91bGQgbm90IGJlIHBsYWNlZCBpbiBJVS4KLSAgIDQgICAgICAgICAgICAgIAkjIElmIHRoZSB1c2VyIHNwZWNpZmljYWxseSBpbmRpY2F0ZXMgdGhleSBzaG91bGQgYmUgaW4gdGhlIElVLCBHQVMgd2lsbAotICAgNSAgICAgICAgICAgICAgCSMgZ2VuZXJhdGUgd2FybmluZ3MuIFRoZSByZWFzb24gd2h5IHRoaXMgaXMgbm90IGFuIGVycm9yIGlzIHRoYXQgdGhvc2UgaW5zdHJ1Y3Rpb25zIAotICAgNiAgICAgICAgICAgICAgCSMgd2lsbCBmYWlsIGluIElVIG9ubHkgb2NjYXNpb25hbGx5LiBUaHVzIEdBUyBzaG91bGQgcGFjayB0aGVtIGluIE1VIGZvcgotICAgNyAgICAgICAgICAgICAgCSMgc2FmZXR5LCBhbmQgaXQganVzdCBuZWVkcyB0byBkcmF3IGF0dGVudGlvbiB3aGVuIGEgdmlvbGF0aW9uIGlzIGdpdmVuLiAKLSAgIDggICAgICAgICAgICAgIAkKLSAgIDkgICAgICAgICAgICAgIAkJCi0gIDEwIDAwMDAgMDBGMDAwMDAgCQlub3AgLT4gbGR3IFIxLCBAXChSMixSM1wpCi0gIDEwICAgICAgODQ0MDEwODMgCi0gIDExIDAwMDggMDQ0MDYxNDQgCSAgICAgICAgbm9wIHx8IGxkdyBSNiwgQFwoUjUsUjRcKQotLiogIFdhcm5pbmc6U3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAgICAgICAgIAkgICAgICAgIAotICAxMyAwMDEwIDAwRjAwMDAwIAkgICAgICAgIG5vcCAtPiBCU0VUIFIxLCBSMiwgUjMgCi0uKiAgV2FybmluZzpFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLSAgMTMgICAgICA4MjIwMTA4MyAKLSAgMTQgMDAxOCA4MEYwMDAwMCAJICAgICAgICBub3AgPC0gQlRTVCBGMSwgUjIsIFIzIAotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJ0c3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE0ICAgICAgMDIwMDEwODMgCi0gIDE1IDAwMjAgMDBGMDAwMDAgCSAgICAgICAgbm9wIHx8IEJDTFIgUjEsIFIyLCBSMwotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJjbHIgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE1ICAgICAgMDIzMDEwODMgCi0gIDE2IDAwMjggMDBGMDAwMDAgCSAgICAgICAgbm9wIC0+IEJOT1QgUjEsIFIyLCBSMwotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJub3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE2ICAgICAgODIxMDEwODMgCi0gIDE3IDAwMzAgMDIxMDEwODMgCSAgICAgICAgQk5PVCByMSwgcjIsIHIzIC0+IG5vcAotICAxNyAgICAgIDgwRjAwMDAwIAotICAxOCAgICAgICAgICAgICAgCSAgICAgICAgCi0gIDE5IDAwMzggMDQ3QzAxMDUgCSAgICAgICAgYnNldCByMSwgcjIsIHIzIHx8IG1vZGRlYyByNCwgNQotLiogIFdhcm5pbmc6U3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLSAgMTkgICAgICAwMjIwMTA4MyAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgICAgICAgICAgICAgIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyMiAwMDQwIDAyMjAxMDgzIAkgICAgICAgIG1vZGRlYyByNCwgNQotICAyMiAgICAgIDg0N0MwMTA1IAotICAyMyAgICAgICAgICAgICAgCQotICAyNCAgICAgICAgICAgICAgCSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gIDI1IDAwNDggMDIyMDEwODMgCSAgICAgICAgam9pbmxsIHI0LCByNSwgcjYKLSAgMjUgICAgICA4OEMwNDE0NiAKLSAgMjYgICAgICAgICAgICAgIAkKLSAgMjcgICAgICAgICAgICAgIAkgICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gIDI4IDAwNTAgODIyMDEwODMgCSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gIDI4ICAgICAgMDhDMDQxNDYgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzlhNTZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBiaXR0ZXN0LnMKLSMKLSMgQml0IG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1QpIHNob3VsZCBub3QgYmUgcGxhY2VkIGluIElVLgotIyBJZiB0aGUgdXNlciBzcGVjaWZpY2FsbHkgaW5kaWNhdGVzIHRoZXkgc2hvdWxkIGJlIGluIHRoZSBJVSwgR0FTIHdpbGwKLSMgZ2VuZXJhdGUgd2FybmluZ3MuIFRoZSByZWFzb24gd2h5IHRoaXMgaXMgbm90IGFuIGVycm9yIGlzIHRoYXQgdGhvc2UgaW5zdHJ1Y3Rpb25zIAotIyB3aWxsIGZhaWwgaW4gSVUgb25seSBvY2Nhc2lvbmFsbHkuIFRodXMgR0FTIHNob3VsZCBwYWNrIHRoZW0gaW4gTVUgZm9yCi0jIHNhZmV0eSwgYW5kIGl0IGp1c3QgbmVlZHMgdG8gZHJhdyBhdHRlbnRpb24gd2hlbiBhIHZpb2xhdGlvbiBpcyBnaXZlbi4gCi0KLQkKLQlub3AgLT4gbGR3IFIxLCBAKFIyLFIzKQotICAgICAgICBub3AgfHwgbGR3IFI2LCBAKFI1LFI0KQotICAgICAgICAKLSAgICAgICAgbm9wIC0+IEJTRVQgUjEsIFIyLCBSMyAKLSAgICAgICAgbm9wIDwtIEJUU1QgRjEsIFIyLCBSMyAKLSAgICAgICAgbm9wIHx8IEJDTFIgUjEsIFIyLCBSMwotICAgICAgICBub3AgLT4gQk5PVCBSMSwgUjIsIFIzCi0gICAgICAgIEJOT1QgcjEsIHIyLCByMyAtPiBub3AKLSAgICAgICAgCi0gICAgICAgIGJzZXQgcjEsIHIyLCByMyB8fCBtb2RkZWMgcjQsIDUKLQotICAgICAgICBic2V0IHIxLCByMiwgcjMKLSAgICAgICAgbW9kZGVjIHI0LCA1Ci0KLSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0KLSAgICAgICAgam9pbmxsIHI0LCByNSwgcjYKLSAgICAgICAgYnNldCByMSwgcjIsIHIzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2QzMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2QzMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIwZTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyBEMzBWIGFzc2VtYmxlciB0ZXN0cwotIwotCi1wcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7Ci0gIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gIHNldCB0ZXN0bmFtZSAiRDMwViAkbmFtZSIKLSAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gIGdhc19ydW4gJHtuYW1lfS5zICRvcHRzICI+JmR1bXAub3V0IgotICBpZiB7W3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0ubCJdIH0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCi0gICAgcmV0dXJuCi0gIH0KLSAgcGFzcyAkdGVzdG5hbWUKLX0KLQotaWYge1tpc3RhcmdldCBkMzB2LSotKl19IHsKLSAgcnVuX2R1bXBfdGVzdCAiaW5zdCIKLSAgcnVuX2R1bXBfdGVzdCAiYWxpZ24iCi0gIHJ1bl9kdW1wX3Rlc3QgImd1YXJkIgotICBydW5fZHVtcF90ZXN0ICJndWFyZC1kZWJ1ZyIKLSAgcnVuX2R1bXBfdGVzdCAicmVsb2MiCi0gIHJ1bl9kdW1wX3Rlc3QgIm9wdCIKLSAgcnVuX2R1bXBfdGVzdCAiYXJyYXkiCi0gIHJ1bl9kdW1wX3Rlc3QgImxhYmVsIgotICBydW5fbGlzdF90ZXN0ICJ3YXJuX29kZHJlZyIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAiYml0dGVzdCIgIi1hbCIKLSAgcnVuX2R1bXBfdGVzdCAiYml0dGVzdCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsIiAiLWFsIgotICBydW5fbGlzdF90ZXN0ICJzZXJpYWwyIiAiLWFsIgotICBydW5fbGlzdF90ZXN0ICJzZXJpYWwyTyIgIi1hbCAtTyIKLSAgcnVuX2R1bXBfdGVzdCAibXVsIgotfQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTE1NGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI29iamR1bXA6IC1sZHIKLSNuYW1lOiBEMzBWIGRlYnVnICgtZykgdGVzdAotI2FzOiAtZwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLS4qOlswLTldKwotICAgMDoJMDgwMDEwODMgMDBmMDAwMDAgCWFkZC5zCXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gICA4OgkwODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMTA6CTE4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy90eAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAxODoJMjgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL2Z4CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDIwOgkzODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMveHQJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMjg6CTQ4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy94ZglyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAzMDoJNTgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3R0CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDM4Ogk2ODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMvdGYJcjEsIHIyLCByMwl8fAlub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjBmN2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBTYW1lIGFzIGd1YXJkLnMgYnV0IGhlcmUgd2UgYXJlIHRlc3RpbmcgZGVidWcgKC1nKSBhc3NlbWJseQotIyBPbiB0aGUgRDMwViwgYXNzZW1ibGluZyB3aXRoIC1nIHNob3VsZCBkaXNhYmxlIHRoZSBWTElXIHBhY2tpbmcKLSMgYW5kIHB1dCBvbmx5IG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZS4JCi0KLQkudGV4dAotCi0JYWRkCXIxLHIyLHIzCi0JYWRkL2FsCXIxLHIyLHIzCi0JYWRkL3R4CXIxLHIyLHIzCi0JYWRkL2Z4CXIxLHIyLHIzCi0JYWRkL3h0CXIxLHIyLHIzCi0JYWRkL3hmCXIxLHIyLHIzCi0JYWRkL3R0CXIxLHIyLHIzCi0JYWRkL3RmCXIxLHIyLHIzCi0KLQkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZhMmRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGd1YXJkZWQgZXhlY3V0aW9uIHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8LnRleHQ+OgotICAgMDoJMDgwMDEwODMgODgwMDEwODMgCWFkZC5zCXIxLCByMiwgcjMJLT4JYWRkLnMJcjEsIHIyLCByMwotICAgODoJMTgwMDEwODMgYTgwMDEwODMgCWFkZC5zL3R4CXIxLCByMiwgcjMJLT4JYWRkLnMvZngJcjEsIHIyLCByMwotICAxMDoJMzgwMDEwODMgYzgwMDEwODMgCWFkZC5zL3h0CXIxLCByMiwgcjMJLT4JYWRkLnMveGYJcjEsIHIyLCByMwotICAxODoJNTgwMDEwODMgZTgwMDEwODMgCWFkZC5zL3R0CXIxLCByMiwgcjMJLT4JYWRkLnMvdGYJcjEsIHIyLCByMwotICAyMDoJMDgwMDEwODMgODgwMDEwODMgCWFkZC5zCXIxLCByMiwgcjMJLT4JYWRkLnMJcjEsIHIyLCByMwotICAyODoJMTgwMDEwODMgYTgwMDEwODMgCWFkZC5zL3R4CXIxLCByMiwgcjMJLT4JYWRkLnMvZngJcjEsIHIyLCByMwotICAzMDoJMzgwMDEwODMgYzgwMDEwODMgCWFkZC5zL3h0CXIxLCByMiwgcjMJLT4JYWRkLnMveGYJcjEsIHIyLCByMwotICAzODoJNTgwMDEwODMgZTgwMDEwODMgCWFkZC5zL3R0CXIxLCByMiwgcjMJLT4JYWRkLnMvdGYJcjEsIHIyLCByMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDljZDMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgRDMwViBndWFyZGVkIGV4ZWN1dGlvbiBhc3NlbWJseSB0ZXN0Ci0KLQkudGV4dAotCi0JYWRkCXIxLHIyLHIzCi0JYWRkL2FsCXIxLHIyLHIzCi0JYWRkL3R4CXIxLHIyLHIzCi0JYWRkL2Z4CXIxLHIyLHIzCi0JYWRkL3h0CXIxLHIyLHIzCi0JYWRkL3hmCXIxLHIyLHIzCi0JYWRkL3R0CXIxLHIyLHIzCi0JYWRkL3RmCXIxLHIyLHIzCi0KLSMgY2hlY2sgY2FzZSBzZW5zaXRpdml0eSB0b28KLQlBREQJcjEscjIscjMKLQlBREQvQUwJcjEscjIscjMKLQlBREQvdHgJcjEscjIscjMKLQlhZGQvRlgJcjEscjIscjMKLQlBREQvWFQJcjEscjIscjMKLQlBREQvWEYJcjEscjIscjMKLQlhZGQvVFQJcjEscjIscjMKLQlBREQvdGYJcjEscjIscjMKLQkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2MWNiZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBiYXNpYyBpbnN0cnVjdGlvbiB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8c3RhcnQ+OgotICAgMDoJMDg4MTVhODAgODgwMDEwODMgCWFicwlyMjEsIHI0MgktPglhZGQucwlyMSwgcjIsIHIzCi0gICA4OgkwODBiMmNkYSAwMGYwMDAwMCAJYWRkLnMJcjUwLCByNTEsIDB4MWEJfHwJbm9wCQotICAxMDoJODgwYjJjZjcgOGFiMWJlZWYgCWFkZC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDE4OgkwODEwMTA4MyA4ODFiMmNkYSAJYWRkMmgucwlyMSwgcjIsIHIzCS0+CWFkZDJoLnMJcjUwLCByNTEsIDB4MWEKLSAgMjA6CTg4MWIyY2Y3IDhhYjFiZWVmIAlhZGQyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDI4OgkwODQwMTA4MyA4ODRiMmNkYSAJYWRkYy5zCXIxLCByMiwgcjMJLT4JYWRkYy5zCXI1MCwgcjUxLCAweDFhCi0gIDMwOgk4ODRiMmNmNyA4YWIxYmVlZiAJYWRkYy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDM4OgkwOTAwMTA4MyA4OTBiMmNkYSAJYWRkaGxsbC5zCXIxLCByMiwgcjMJLT4JYWRkaGxsbC5zCXI1MCwgcjUxLCAweDFhCi0gIDQwOgk4OTBiMmNmNyA4YWIxYmVlZiAJYWRkaGxsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDQ4OgkwOTEwMTA4MyA4OTFiMmNkYSAJYWRkaGxsaC5zCXIxLCByMiwgcjMJLT4JYWRkaGxsaC5zCXI1MCwgcjUxLCAweDFhCi0gIDUwOgk4OTFiMmNmNyA4YWIxYmVlZiAJYWRkaGxsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDU4OgkwOTIwMTA4MyA4OTJiMmNkYSAJYWRkaGxobC5zCXIxLCByMiwgcjMJLT4JYWRkaGxobC5zCXI1MCwgcjUxLCAweDFhCi0gIDYwOgk4OTJiMmNmNyA4YWIxYmVlZiAJYWRkaGxobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDY4OgkwOTMwMTA4MyA4OTNiMmNkYSAJYWRkaGxoaC5zCXIxLCByMiwgcjMJLT4JYWRkaGxoaC5zCXI1MCwgcjUxLCAweDFhCi0gIDcwOgk4OTNiMmNmNyA4YWIxYmVlZiAJYWRkaGxoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDc4OgkwOTQwMTA4MyA4OTRiMmNkYSAJYWRkaGhsbC5zCXIxLCByMiwgcjMJLT4JYWRkaGhsbC5zCXI1MCwgcjUxLCAweDFhCi0gIDgwOgk4OTRiMmNmNyA4YWIxYmVlZiAJYWRkaGhsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDg4OgkwOTUwMTA4MyA4OTViMmNkYSAJYWRkaGhsaC5zCXIxLCByMiwgcjMJLT4JYWRkaGhsaC5zCXI1MCwgcjUxLCAweDFhCi0gIDkwOgk4OTViMmNmNyA4YWIxYmVlZiAJYWRkaGhsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDk4OgkwOTYwMTA4MyA4OTZiMmNkYSAJYWRkaGhobC5zCXIxLCByMiwgcjMJLT4JYWRkaGhobC5zCXI1MCwgcjUxLCAweDFhCi0gIGEwOgk4OTZiMmNmNyA4YWIxYmVlZiAJYWRkaGhobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGE4OgkwOTcwMTA4MyA4OTdiMmNkYSAJYWRkaGhoaC5zCXIxLCByMiwgcjMJLT4JYWRkaGhoaC5zCXI1MCwgcjUxLCAweDFhCi0gIGIwOgk4OTdiMmNmNyA4YWIxYmVlZiAJYWRkaGhoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGI4OgkwODYwMTA4MyA4ODZiMmNkYSAJYWRkcy5zCXIxLCByMiwgcjMJLT4JYWRkcy5zCXI1MCwgcjUxLCAweDFhCi0gIGMwOgk4ODZiMmNmNyA4YWIxYmVlZiAJYWRkcy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGM4OgkwODcwMTA4MyA4ODdiMmNkYSAJYWRkczJoLnMJcjEsIHIyLCByMwktPglhZGRzMmgucwlyNTAsIHI1MSwgMHgxYQotICBkMDoJODg3YjJjZjcgOGFiMWJlZWYgCWFkZHMyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGQ4OgkwMzgwMTA4MyA4MzhiMmNkYSAJYW5kLnMJcjEsIHIyLCByMwktPglhbmQucwlyNTAsIHI1MSwgMHgxYQotICBlMDoJODM4YjJjZjcgOGFiMWJlZWYgCWFuZC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGU4OgkwMjgwMDA0MiA4Mjg4MzEwNSAJYW5kZmcJZjAsIGYxLCBmMgktPglhbmRmZwlmMywgcywgMHg1Ci0gIGYwOgkwOGEwMTA4MyA4OGE4NDE0NiAJYXZnLnMJcjEsIHIyLCByMwktPglhdmcucwlyNCwgcjUsIDB4NgotICBmODoJODhhYjJjZjcgOGFiMWJlZWYgCWF2Zy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gMTAwOgkwOGIwMTA4MyA4OGI4NDE0NiAJYXZnMmgucwlyMSwgcjIsIHIzCS0+CWF2ZzJoLnMJcjQsIHI1LCAweDYKLSAxMDg6CTg4YmIyY2Y3IDhhYjFiZWVmIAlhdmcyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gMTEwOgkwMjMwMTA4MyA4MjM4NDE0NiAJYmNscglyMSwgcjIsIHIzCS0+CWJjbHIJcjQsIHI1LCAweDYKLSAxMTg6CTAyMTAxMDgzIDgyMTg1Y2M2IAlibm90CXIxLCByMiwgcjMJLT4JYm5vdAlyNSwgcjUxLCAweDYKLSAxMjA6CTAwMDAwMDI5IDAwZjAwMDAwIAlicmEucwlyNDEJfHwJbm9wCQotIDEyODoJMDAwODAwMDggMDBmMDAwMDAgCWJyYS5zCTQwCVwoMTY4IDxzdGFydFwrMHgxNjg+XCkJfHwJbm9wCQotIDEzMDoJMDAwODFlMDEgMDBmMDAwMDAgCWJyYS5zCWYwMDgJXChmMTM4IDxzdGFydFwrMHhmMTM4PlwpCXx8CW5vcAkKLSAxMzg6CTAwNDY5MDJhIDAwZjAwMDAwIAlicmF0bnoucwlyNDEsIHI0Mgl8fAlub3AJCi0gMTQwOgk4MDRjMTAwMCA4MDAwZjAwZCAJYnJhdG56LmwJcjEsIGYwMGQJXChmMTRkIDxzdGFydFwrMHhmMTRkPlwpCi0gMTQ4Ogk4MDRjMTAzNyA4YWIxZjAwZCAJYnJhdG56LmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMTU1IDxzdGFydFwrMHhkZWFkZjE1NT5cKQotIDE1MDoJMDA0MjkwMmEgMDBmMDAwMDAgCWJyYXR6ci5zCXI0MSwgcjQyCXx8CW5vcAkKLSAxNTg6CTgwNDgxMDAwIDgwMDBmMDBkIAlicmF0enIubAlyMSwgZjAwZAlcKGYxNjUgPHN0YXJ0XCsweGYxNjU+XCkKLSAxNjA6CTgwNDgxMDM3IDhhYjFmMDBkIAlicmF0enIubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYxNmQgPHN0YXJ0XCsweGRlYWRmMTZkPlwpCi0gMTY4OgkwMjIwMTA4MyA4MjI4NWNjNiAJYnNldAlyMSwgcjIsIHIzCS0+CWJzZXQJcjUsIHI1MSwgMHg2Ci0gMTcwOgkwMDIwMDAyOSAwMGYwMDAwMCAJYnNyLnMJcjQxCXx8CW5vcAkKLSAxNzg6CTAwMjgxZTAxIDAwZjAwMDAwIAlic3IucwlmMDA4CVwoZjE4MCA8c3RhcnRcKzB4ZjE4MD5cKQl8fAlub3AJCi0gMTgwOgk4MDI4MDAzNyA4YWIxZjAwZCAJYnNyLmwJLTIxNTIwZmYzCVwoZGVhZGYxOGQgPHN0YXJ0XCsweGRlYWRmMThkPlwpCi0gMTg4OgkwMDY2OTAyYSAwMGYwMDAwMCAJYnNydG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDE5MDoJODA2YzEwMDAgODAwMGYwMGQgCWJzcnRuei5sCXIxLCBmMDBkCVwoZjE5ZCA8c3RhcnRcKzB4ZjE5ZD5cKQotIDE5ODoJODA2YzEwMzcgOGFiMWYwMGQgCWJzcnRuei5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjFhNSA8c3RhcnRcKzB4ZGVhZGYxYTU+XCkKLSAxYTA6CTAwNjI5MDJhIDAwZjAwMDAwIAlic3J0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMWE4Ogk4MDY4MTAwMCA4MDAwZjAwZCAJYnNydHpyLmwJcjEsIGYwMGQJXChmMWI1IDxzdGFydFwrMHhmMWI1PlwpCi0gMWIwOgk4MDY4MTAzNyA4YWIxZjAwZCAJYnNydHpyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMWJkIDxzdGFydFwrMHhkZWFkZjFiZD5cKQotIDFiODoJMDIwMDEwODMgODIwODVjYzYgCWJ0c3QJZjEsIHIyLCByMwktPglidHN0CXYsIHI1MSwgMHg2Ci0gMWMwOgkwMmMwMDBjMSA4MmMwOTUxNSAJY21wZXEucwlmMCwgcjMsIHIxCS0+CWNtcG5lLnMJZjEsIHIyMCwgcjIxCi0gMWM4OgkwMmMxMjdlMCA4MmMxYjBjNCAJY21wZ3QucwlmMiwgcjMxLCByMzIJLT4JY21wZ2UucwlmMywgcjMsIHI0Ci0gMWQwOgkwMmMyNDBjNCA4MmMyZDBjNCAJY21wbHQucwlzLCByMywgcjQJLT4JY21wbGUucwl2LCByMywgcjQKLSAxZDg6CTAyYzM2MGM0IDgyYzNmMGM0IAljbXBwcy5zCXZhLCByMywgcjQJLT4JY21wbmcucwljLCByMywgcjQKLSAxZTA6CTAyZDEyN2UwIDgyZDFiMGM0IAljbXB1Z3QucwlmMiwgcjMxLCByMzIJLT4JY21wdWdlLnMJZjMsIHIzLCByNAotIDFlODoJMDJkMjQwYzQgODJkMmQwYzQgCWNtcHVsdC5zCXMsIHIzLCByNAktPgljbXB1bGUucwl2LCByMywgcjQKLSAxZjA6CTAxMDAxMDA4IDgxMDgxMDIwIAlkYnJhLnMJcjEsIHI4CS0+CWRicmEucwlyMSwgMTAwCVwoMmYwIDxzdGFydFwrMHgyZjA+XCkKLSAxZjg6CTgxMDgxMDM3IDhhYjFmMDBkIAlkYnJhLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMjA1IDxzdGFydFwrMHhkZWFkZjIwNT5cKQotIDIwMDoJMDE0MDIwMWYgODE0ODIwMjAgCWRicmFpLnMJMTAsIHIzMQktPglkYnJhaS5zCTEwLCAxMDAJXCgzMDAgPHN0YXJ0XCsweDMwMD5cKQotIDIwODoJODE0ODIwMzcgOGFiMWYwMGQgCWRicmFpLmwJMTAsIC0yMTUyMGZmMwlcKGRlYWRmMjE1IDxzdGFydFwrMHhkZWFkZjIxNT5cKQotIDIxMDoJMDEyMDEwMDggMDBmMDAwMDAgCWRic3IucwlyMSwgcjgJfHwJbm9wCQotIDIxODoJMDEyODEwMjAgMDBmMDAwMDAgCWRic3IucwlyMSwgMTAwCVwoMzE4IDxzdGFydFwrMHgzMTg+XCkJfHwJbm9wCQotIDIyMDoJODEyODEwMzcgOGFiMWYwMGQgCWRic3IubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYyMmQgPHN0YXJ0XCsweGRlYWRmMjJkPlwpCi0gMjI4OgkwMTYwNDAxZiAwMGYwMDAwMCAJZGJzcmkucwkyMCwgcjMxCXx8CW5vcAkKLSAyMzA6CTAxNjg0MDIwIDAwZjAwMDAwIAlkYnNyaS5zCTIwLCAxMDAJXCgzMzAgPHN0YXJ0XCsweDMzMD5cKQl8fAlub3AJCi0gMjM4Ogk4MTY4NDAzNyA4YWIxZjAwZCAJZGJzcmkubAkyMCwgLTIxNTIwZmYzCVwoZGVhZGYyNDUgPHN0YXJ0XCsweGRlYWRmMjQ1PlwpCi0gMjQwOgkwMTEwMTAyMCAwMGYwMDAwMCAJZGptcC5zCXIxLCByMzIJfHwJbm9wCQotIDI0ODoJODExODEwMDAgODAwMGYwMGQgCWRqbXAubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyNTA6CTgxMTgxMDM3IDhhYjFmMDBkIAlkam1wLmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyNTg6CTAxNTA2MDIwIDAwZjAwMDAwIAlkam1waS5zCTMwLCByMzIJfHwJbm9wCQotIDI2MDoJODE1ODYwMDAgODAwMGYwMGQgCWRqbXBpLmwJMzAsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjY4Ogk4MTU4NjAzNyA4YWIxZjAwZCAJZGptcGkubAkzMCwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDI3MDoJMDEzMDEwMjAgMDBmMDAwMDAgCWRqc3IucwlyMSwgcjMyCXx8CW5vcAkKLSAyNzg6CTgxMzgxMDAwIDgwMDBmMDBkIAlkanNyLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjgwOgk4MTM4MTAzNyA4YWIxZjAwZCAJZGpzci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMjg4OgkwMTcwMjAyMCAwMGYwMDAwMCAJZGpzcmkucwkxMCwgcjMyCXx8CW5vcAkKLSAyOTA6CTgxNzg0MDAwIDgwMDBmMDBkIAlkanNyaS5sCTIwLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI5ODoJODE3ODgwMzcgOGFiMWYwMGQgCWRqc3JpLmwJNDAsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyYTA6CTAwMTAwMDI5IDAwZjAwMDAwIAlqbXAucwlyNDEJfHwJbm9wCQotIDJhODoJMDAxODFlMDEgMDBmMDAwMDAgCWptcC5zCWYwMDggPHN0YXJ0XCsweGYwMDg+CXx8CW5vcAkKLSAyYjA6CTgwMTgwMDM3IDhhYjFmMDBkIAlqbXAubAlkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmI4OgkwMDU2OTAyYSAwMGYwMDAwMCAJam1wdG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDJjMDoJODA1YzEwMDAgODAwMGYwMGQgCWptcHRuei5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDJjODoJODA1YzEwMzcgOGFiMWYwMGQgCWptcHRuei5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmQwOgkwMDUyOTAyYSAwMGYwMDAwMCAJam1wdHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDJkODoJODA1ODEwMDAgODAwMGYwMGQgCWptcHR6ci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDJlMDoJODA1ODEwMzcgOGFiMWYwMGQgCWptcHR6ci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmU4OgkwOGMwMTA4NCA4OGM4MTA4ZiAJam9pbmxsLnMJcjEsIHIyLCByNAktPglqb2lubGwucwlyMSwgcjIsIDB4ZgotIDJmMDoJODhjODEwYjcgOGFiMWYwMGQgCWpvaW5sbC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDJmODoJMDhkMDEwODQgODhkODEwOGYgCWpvaW5saC5zCXIxLCByMiwgcjQJLT4Jam9pbmxoLnMJcjEsIHIyLCAweGYKLSAzMDA6CTg4ZDgxMGI3IDhhYjFmMDBkIAlqb2lubGgubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAzMDg6CTA4ZTAxMDg0IDg4ZTgxMDhmIAlqb2luaGwucwlyMSwgcjIsIHI0CS0+CWpvaW5obC5zCXIxLCByMiwgMHhmCi0gMzEwOgk4OGU4MTBiNyA4YWIxZjAwZCAJam9pbmhsLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gMzE4OgkwOGYwMTA4NCA4OGY4MTA4ZiAJam9pbmhoLnMJcjEsIHIyLCByNAktPglqb2luaGgucwlyMSwgcjIsIDB4ZgotIDMyMDoJODhmODEwYjcgOGFiMWYwMGQgCWpvaW5oaC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDMyODoJMDAzMDAwMjkgMDBmMDAwMDAgCWpzci5zCXI0MQl8fAlub3AJCi0gMzMwOgkwMDM4MWUwMSAwMGYwMDAwMCAJanNyLnMJZjAwOCA8c3RhcnRcKzB4ZjAwOD4JfHwJbm9wCQotIDMzODoJODAzODAwMzcgOGFiMWYwMGQgCWpzci5sCWRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNDA6CTAwNzY5MDJhIDAwZjAwMDAwIAlqc3J0bnoucwlyNDEsIHI0Mgl8fAlub3AJCi0gMzQ4Ogk4MDdjMTAwMCA4MDAwZjAwZCAJanNydG56LmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMzUwOgk4MDdjMTAzNyA4YWIxZjAwZCAJanNydG56LmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNTg6CTAwNzI5MDJhIDAwZjAwMDAwIAlqc3J0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMzYwOgk4MDc4MTAwMCA4MDAwZjAwZCAJanNydHpyLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMzY4Ogk4MDc4MTAzNyA4YWIxZjAwZCAJanNydHpyLmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNzA6CTA0MzA2MWM4IDg0MzQ2MWM4IAlsZDJoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkMmgucwlyNiwgQFwocjdcKywgcjhcKQotIDM3ODoJMDQzYzYxYzggODQzODYxZGEgCWxkMmgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkMmgucwlyNiwgQFwocjcsIDB4MWFcKQotIDM4MDoJODQzODYxYzAgODAwMDEyMzQgCWxkMmgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gMzg4OgkwNDYwNjFjOCA4NDY0NjFjOCAJbGQydy5zCXI2LCBAXChyNywgcjhcKQktPglsZDJ3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzOTA6CTA0NmM2MWM4IDg0Njg2MWRhIAlsZDJ3LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZDJ3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzOTg6CTg0Njg2MWMwIDgwMDAxMjM0IAlsZDJ3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNhMDoJMDQ1MDYxYzggODQ1NDYxYzggCWxkNGJoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkNGJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzYTg6CTA0NWM2MWM4IDg0NTg2MWRhIAlsZDRiaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQ0YmgucwlyNiwgQFwocjcsIDB4MWFcKQotIDNiMDoJODQ1ODYxYzAgODAwMDEyMzQgCWxkNGJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNiODoJMDRkMDYxYzggODRkNDYxYzggCWxkNGJodS5zCXI2LCBAXChyNywgcjhcKQktPglsZDRiaHUucwlyNiwgQFwocjdcKywgcjhcKQotIDNjMDoJMDRkYzYxYzggODRkODYxZGEgCWxkNGJodS5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQ0Ymh1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzYzg6CTg0ZDg2MWMwIDgwMDAxMjM0IAlsZDRiaHUubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gM2QwOgkwNDAwNjFjOCA4NDA0NjFjOCAJbGRiLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkYi5zCXI2LCBAXChyN1wrLCByOFwpCi0gM2Q4OgkwNDBjNjFjOCA4NDA4NjFkYSAJbGRiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGIucwlyNiwgQFwocjcsIDB4MWFcKQotIDNlMDoJODQwODYxYzAgODAwMDEyMzQgCWxkYi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzZTg6CTA0OTA2MWM4IDg0OTQ2MWM4IAlsZGJ1LnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkYnUucwlyNiwgQFwocjdcKywgcjhcKQotIDNmMDoJMDQ5YzYxYzggODQ5ODYxZGEgCWxkYnUucwlyNiwgQFwocjctLCByOFwpCS0+CWxkYnUucwlyNiwgQFwocjcsIDB4MWFcKQotIDNmODoJODQ5ODYxYzAgODAwMDEyMzQgCWxkYnUubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDAwOgkwNDIwNjFjOCA4NDI0NjFjOCAJbGRoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNDA4OgkwNDJjNjFjOCA4NDI4NjFkYSAJbGRoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGgucwlyNiwgQFwocjcsIDB4MWFcKQotIDQxMDoJODQyODYxYzAgODAwMDEyMzQgCWxkaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA0MTg6CTA0MTA2MWM4IDg0MTQ2MWM4IAlsZGhoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkaGgucwlyNiwgQFwocjdcKywgcjhcKQotIDQyMDoJMDQxYzYxYzggODQxODYxZGEgCWxkaGgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkaGgucwlyNiwgQFwocjcsIDB4MWFcKQotIDQyODoJODQxODYxYzAgODAwMDEyMzQgCWxkaGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDMwOgkwNGEwNjFjOCA4NGE0NjFjOCAJbGRodS5zCXI2LCBAXChyNywgcjhcKQktPglsZGh1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0Mzg6CTA0YWM2MWM4IDg0YTg2MWRhIAlsZGh1LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGh1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0NDA6CTg0YTg2MWMwIDgwMDAxMjM0IAlsZGh1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQ0ODoJMDQ0MDYxYzggODQ0NDYxYzggCWxkdy5zCXI2LCBAXChyNywgcjhcKQktPglsZHcucwlyNiwgQFwocjdcKywgcjhcKQotIDQ1MDoJMDQ0YzYxYzggODQ0ODYxZGEgCWxkdy5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGR3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0NTg6CTg0NDg2MWMwIDgwMDAxMjM0IAlsZHcubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDYwOgk4YjQ4MTA5ZiAwYjQwMTA4NCAJbWFjMAlyMSwgcjIsIDB4MWYJPC0JbWFjMAlyMSwgcjIsIHI0Ci0gNDY4Ogk4YjRjMTA5ZiAwYjQ0MTA4NCAJbWFjMQlyMSwgcjIsIDB4MWYJPC0JbWFjMQlyMSwgcjIsIHI0Ci0gNDcwOgk4YjU4MTA5ZiAwYjUwMTA4NCAJbWFjczAJcjEsIHIyLCAweDFmCTwtCW1hY3MwCXIxLCByMiwgcjQKLSA0Nzg6CThiNWMxMDlmIDBiNTQxMDg0IAltYWNzMQlyMSwgcjIsIDB4MWYJPC0JbWFjczEJcjEsIHIyLCByNAotIDQ4MDoJMDQ3YzAwNGEgODQ3NDAwNGEgCW1vZGRlYwlyMSwgMHhhCS0+CW1vZGluYwlyMSwgMHhhCi0gNDg4Ogk4YjY4MTA5ZiAwYjYwMTA4NCAJbXN1YjAJcjEsIHIyLCAweDFmCTwtCW1zdWIwCXIxLCByMiwgcjQKLSA0OTA6CThiNmMxMDlmIDBiNjQxMDg0IAltc3ViMQlyMSwgcjIsIDB4MWYJPC0JbXN1YjEJcjEsIHIyLCByNAotIDQ5ODoJOGIwODEwOGEgMGIwMDEwODQgCW11bAlyMSwgcjIsIDB4YQk8LQltdWwJcjEsIHIyLCByNAotIDRhMDoJOGI3ODEwOWYgMGI3MDEwODQgCW1zdWJzMAlyMSwgcjIsIDB4MWYJPC0JbXN1YnMwCXIxLCByMiwgcjQKLSA0YTg6CThiN2MxMDlmIDBiNzQxMDg0IAltc3ViczEJcjEsIHIyLCAweDFmCTwtCW1zdWJzMQlyMSwgcjIsIHI0Ci0gNGIwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gNGI4Ogk4YTA4MTA4YSAwYTAwMTA4NCAJbXVsMmgJcjEsIHIyLCAweGEJPC0JbXVsMmgJcjEsIHIyLCByNAotIDRjMDoJOGE0ODEwOGEgMGE0MDEwODQgCW11bGh4bGwJcjEsIHIyLCAweGEJPC0JbXVsaHhsbAlyMSwgcjIsIHI0Ci0gNGM4Ogk4YTU4MTA4YSAwYTUwMTA4NCAJbXVsaHhsaAlyMSwgcjIsIDB4YQk8LQltdWxoeGxoCXIxLCByMiwgcjQKLSA0ZDA6CThhNjgxMDhhIDBhNjAxMDg0IAltdWxoeGhsCXIxLCByMiwgMHhhCTwtCW11bGh4aGwJcjEsIHIyLCByNAotIDRkODoJOGE3ODEwOGEgMGE3MDEwODQgCW11bGh4aGgJcjEsIHIyLCAweGEJPC0JbXVsaHhoaAlyMSwgcjIsIHI0Ci0gNGUwOgk4YjkwMDA0NCAwYTEwODA4NCAJbXVseHMJYTAsIHIxLCByNAk8LQltdWx4MmgJcjgsIHIyLCByNAotIDRlODoJOGI4ODEwOGEgMGI4MDAwNDQgCW11bHgJYTEsIHIyLCAweGEJPC0JbXVseAlhMCwgcjEsIHI0Ci0gNGYwOgk4YmY4MjA0YSAwYmYwMTAwNCAJbXZmYWNjCXIyLCBhMSwgMHhhCTwtCW12ZmFjYwlyMSwgYTAsIHI0Ci0gNGY4Ogk4Yjk4MTA4YSAwYTE4ODA4YSAJbXVseHMJYTEsIHIyLCAweGEJPC0JbXVseDJoCXI4LCByMiwgMHhhCi0gNTAwOgkwMWUwYTA4MCA4MWUwYTFjMCAJbXZmc3lzCXIxMCwgcGMJLT4JbXZmc3lzCXIxMCwgcnB0X2MKLSA1MDg6CTAxZTBhMDAwIDgxZTBhMDAyIAltdmZzeXMJcjEwLCBwc3cJLT4JbXZmc3lzCXIxMCwgcHN3aAotIDUxMDoJMDFlMGEwMDEgODFlMGEwMDMgCW12ZnN5cwlyMTAsIHBzd2wJLT4JbXZmc3lzCXIxMCwgZjAKLSA1MTg6CTAxZTBhMTAzIDhhZjAxMDg0IAltdmZzeXMJcjEwLCBzCS0+CW12dGFjYwlhMSwgcjIsIHI0Ci0gNTIwOgkwMGUwNzI4MCA4MGUwMDI4MCAJbXZ0c3lzCXJwdF9jLCByMTAJLT4JbXZ0c3lzCXBzdywgcjEwCi0gNTI4OgkwMGUwMDI4MiA4MGUwMDI4MSAJbXZ0c3lzCXBzd2gsIHIxMAktPgltdnRzeXMJcHN3bCwgcjEwCi0gNTMwOgkwMGUwMDI4MyA4MGUwMzI4MyAJbXZ0c3lzCWYwLCByMTAJLT4JbXZ0c3lzCWYzLCByMTAKLSA1Mzg6CTAwZTA0MjgzIDgwZTA1MjgzIAltdnRzeXMJcywgcjEwCS0+CW12dHN5cwl2LCByMTAKLSA1NDA6CTAwZTA2MjgzIDgwZTA3MjgzIAltdnRzeXMJdmEsIHIxMAktPgltdnRzeXMJYywgcjEwCi0gNTQ4OgkwMGYwMDAwMCA4MzkwMTA4MCAJbm9wCQktPglub3QJcjEsIHIyCi0gNTUwOgkwMjkwMTA4MCA4M2EwMTA4NCAJbm90ZmcJZjEsIGYyCS0+CW9yLnMJcjEsIHIyLCByNAotIDU1ODoJMDNhODEwOWEgMDBmMDAwMDAgCW9yLnMJcjEsIHIyLCAweDFhCXx8CW5vcAkKLSA1NjA6CTgzYTgxMGI3IDhhYjFmMDBkIAlvci5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDU2ODoJMDJhMDEwODQgODJhODQwODEgCW9yZmcJZjEsIGYyLCBzCS0+CW9yZmcJcywgZjIsIDB4MQotIDU3MDoJMDA4MDAwMDAgMDBmMDAwMDAgCXJlaXQJCXx8CW5vcAkKLSA1Nzg6CTAxODAxMDAyIDAwZjAwMDAwIAlyZXBlYXQucwlyMSwgcjIJfHwJbm9wCQotIDU4MDoJODE4ODQwMDAgODAwMGRlYWQgCXJlcGVhdC5sCXI0LCBkZWFkCVwoZTQyZCA8c3RhcnRcKzB4ZTQyZD5cKQotIDU4ODoJODE4ODQwMzcgOGFiMWYwMGQgCXJlcGVhdC5sCXI0LCAtMjE1MjBmZjMJXChkZWFkZjU5NSA8c3RhcnRcKzB4ZGVhZGY1OTU+XCkKLSA1OTA6CTAxYTBhMDAxIDgxYThhMjAwIAlyZXBlYXRpLnMJYQlcKDU5YSA8c3RhcnRcKzB4NTlhPlwpLCByMQktPglyZXBlYXRpLnMJYQlcKDU5YSA8c3RhcnRcKzB4NTlhPlwpLCAxMDAwCVwoMTU5MCA8c3RhcnRcKzB4MTU5MD5cKQotIDU5ODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDVhMDoJMDM0MDEwODQgODM0ODEwOGEgCXJvdAlyMSwgcjIsIHI0CS0+CXJvdAlyMSwgcjIsIDB4YQotIDVhODoJMDM1MDEwODQgODM1ODEwOGEgCXJvdDJoCXIxLCByMiwgcjQJLT4Jcm90MmgJcjEsIHIyLCAweGEKLSA1YjA6CThhODgxMDhhIDBhODAxMDg0IAlzYXQJcjEsIHIyLCAweGEJPC0Jc2F0CXIxLCByMiwgcjQKLSA1Yjg6CThhOTgxMDhhIDBhOTAxMDg0IAlzYXQyaAlyMSwgcjIsIDB4YQk8LQlzYXQyaAlyMSwgcjIsIHI0Ci0gNWMwOgk4YmM4MTA4YSAwYmMwMTA4NCAJc2F0aGwJcjEsIHIyLCAweGEJPC0Jc2F0aGwJcjEsIHIyLCByNAotIDVjODoJOGJkODEwOGEgMGJkMDEwODQgCXNhdGhoCXIxLCByMiwgMHhhCTwtCXNhdGhoCXIxLCByMiwgcjQKLSA1ZDA6CThhYTgxMDhhIDBhYTAxMDg0IAlzYXR6CXIxLCByMiwgMHhhCTwtCXNhdHoJcjEsIHIyLCByNAotIDVkODoJOGFiODEwOGEgMGFiMDEwODQgCXNhdHoyaAlyMSwgcjIsIDB4YQk8LQlzYXR6MmgJcjEsIHIyLCByNAotIDVlMDoJMDMwMDEwODQgODMwODEwOGEgCXNyYQlyMSwgcjIsIHI0CS0+CXNyYQlyMSwgcjIsIDB4YQotIDVlODoJMDMxMDEwODQgODMxODEwOGEgCXNyYTJoCXIxLCByMiwgcjQJLT4Jc3JhMmgJcjEsIHIyLCAweGEKLSA1ZjA6CTAzNjAxMDg0IDgzNjgxMDhhIAlzcmMJcjEsIHIyLCByNAktPglzcmMJcjEsIHIyLCAweGEKLSA1Zjg6CTAzMjAxMDg0IDgzMjgxMDhhIAlzcmwJcjEsIHIyLCByNAktPglzcmwJcjEsIHIyLCAweGEKLSA2MDA6CTAzMzAxMDg0IDgzMzgxMDhhIAlzcmwyaAlyMSwgcjIsIHI0CS0+CXNybDJoCXIxLCByMiwgMHhhCi0gNjA4OgkwNTMwNjFjOCA4NTM0NjFjOCAJc3QyaC5zCXI2LCBAXChyNywgcjhcKQktPglzdDJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2MTA6CTA1M2M2MWM4IDg1Mzg2MWRhIAlzdDJoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdDJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2MTg6CTg1Mzg2MWMwIDgwMDAxMjM0IAlzdDJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDYyMDoJMDU2MDYxYzggODU2NDYxYzggCXN0MncucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3Qydy5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjI4OgkwNTZjNjFjOCA4NTY4NjFkYSAJc3Qydy5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3Qydy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjMwOgk4NTY4NjFjMCA4MDAwMTIzNCAJc3Qydy5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2Mzg6CTA1NTA2MWM4IDg1NTQ2MWM4IAlzdDRoYi5zCXI2LCBAXChyNywgcjhcKQktPglzdDRoYi5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjQwOgkwNTVjNjFjOCA4NTU4NjFkYSAJc3Q0aGIucwlyNiwgQFwocjctLCByOFwpCS0+CXN0NGhiLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2NDg6CTg1NTg2MWMwIDgwMDAxMjM0IAlzdDRoYi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2NTA6CTA1MDA2MWM4IDg1MDQ2MWM4IAlzdGIucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RiLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2NTg6CTA1MGM2MWM4IDg1MDg2MWRhIAlzdGIucwlyNiwgQFwocjctLCByOFwpCS0+CXN0Yi5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjYwOgk4NTA4NjFjMCA4MDAwMTIzNCAJc3RiLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY2ODoJMDUyMDYxYzggODUyNDYxYzggCXN0aC5zCXI2LCBAXChyNywgcjhcKQktPglzdGgucwlyNiwgQFwocjdcKywgcjhcKQotIDY3MDoJMDUyYzYxYzggODUyODYxZGEgCXN0aC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3RoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2Nzg6CTg1Mjg2MWMwIDgwMDAxMjM0IAlzdGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjgwOgkwNTEwNjFjOCA4NTE0NjFjOCAJc3RoaC5zCXI2LCBAXChyNywgcjhcKQktPglzdGhoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2ODg6CTA1MWM2MWM4IDg1MTg2MWRhIAlzdGhoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdGhoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2OTA6CTg1MTg2MWMwIDgwMDAxMjM0IAlzdGhoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY5ODoJMDU0MDYxYzggODU0NDYxYzggCXN0dy5zCXI2LCBAXChyNywgcjhcKQktPglzdHcucwlyNiwgQFwocjdcKywgcjhcKQotIDZhMDoJMDU0YzYxYzggODU0ODYxZGEgCXN0dy5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3R3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2YTg6CTg1NDg2MWMwIDgwMDAxMjM0IAlzdHcubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNmIwOgkwODIwMTA4MyA4ODJiMmNkYSAJc3ViLnMJcjEsIHIyLCByMwktPglzdWIucwlyNTAsIHI1MSwgMHgxYQotIDZiODoJODgyYjJjZjcgOGFiMWJlZWYgCXN1Yi5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmMwOgkwODMwMTA4MyA4ODNiMmNkYSAJc3ViMmgucwlyMSwgcjIsIHIzCS0+CXN1YjJoLnMJcjUwLCByNTEsIDB4MWEKLSA2Yzg6CTg4M2IyY2Y3IDhhYjFiZWVmIAlzdWIyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmQwOgkwODUwMTA4MyA4ODViMmNkYSAJc3ViYi5zCXIxLCByMiwgcjMJLT4Jc3ViYi5zCXI1MCwgcjUxLCAweDFhCi0gNmQ4Ogk4ODViMmNmNyA4YWIxYmVlZiAJc3ViYi5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmUwOgkwOTgwMTA4MyA4OThiMmNkYSAJc3ViaGxsbC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxsbC5zCXI1MCwgcjUxLCAweDFhCi0gNmU4Ogk4OThiMmNmNyA4YWIxYmVlZiAJc3ViaGxsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmYwOgkwOTkwMTA4MyA4OTliMmNkYSAJc3ViaGxsaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxsaC5zCXI1MCwgcjUxLCAweDFhCi0gNmY4Ogk4OTliMmNmNyA4YWIxYmVlZiAJc3ViaGxsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzAwOgkwOWEwMTA4MyA4OWFiMmNkYSAJc3ViaGxobC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxobC5zCXI1MCwgcjUxLCAweDFhCi0gNzA4Ogk4OWFiMmNmNyA4YWIxYmVlZiAJc3ViaGxobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzEwOgkwOWIwMTA4MyA4OWJiMmNkYSAJc3ViaGxoaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxoaC5zCXI1MCwgcjUxLCAweDFhCi0gNzE4Ogk4OWJiMmNmNyA4YWIxYmVlZiAJc3ViaGxoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzIwOgkwOWMwMTA4MyA4OWNiMmNkYSAJc3ViaGhsbC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhsbC5zCXI1MCwgcjUxLCAweDFhCi0gNzI4Ogk4OWNiMmNmNyA4YWIxYmVlZiAJc3ViaGhsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzMwOgkwOWQwMTA4MyA4OWRiMmNkYSAJc3ViaGhsaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhsaC5zCXI1MCwgcjUxLCAweDFhCi0gNzM4Ogk4OWRiMmNmNyA4YWIxYmVlZiAJc3ViaGhsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzQwOgkwOWUwMTA4MyA4OWViMmNkYSAJc3ViaGhobC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhobC5zCXI1MCwgcjUxLCAweDFhCi0gNzQ4Ogk4OWViMmNmNyA4YWIxYmVlZiAJc3ViaGhobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzUwOgkwOWYwMTA4MyA4OWZiMmNkYSAJc3ViaGhoaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhoaC5zCXI1MCwgcjUxLCAweDFhCi0gNzU4Ogk4OWZiMmNmNyA4YWIxYmVlZiAJc3ViaGhoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzYwOgkwMDkwMDAwMSAwMGYwMDAwMCAJdHJhcC5zCXIxCXx8CW5vcAkKLSA3Njg6CTAwOTgwMDBhIDAwZjAwMDAwIAl0cmFwLnMJMHhhCXx8CW5vcAkKLSA3NzA6CTAzYjAxMDg0IDgzYjgxMDhhIAl4b3IucwlyMSwgcjIsIHI0CS0+CXhvci5zCXIxLCByMiwgMHhhCi0gNzc4Ogk4M2I4MTBiNyA4YWIxZjAwZCAJeG9yLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gNzgwOgkwMmIwMTA4NCA4MmI4MTEwYSAJeG9yZmcJZjEsIGYyLCBzCS0+CXhvcmZnCWYxLCBzLCAweGEKLSA3ODg6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSA3OTA6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSA3OTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSA3YTA6CTgwZjAwMDAwIDAwZjAwMDAwIAlub3AJCTwtCW5vcAkKLSA3YTg6CTAzOTAxMDgwIDAwZjAwMDAwIAlub3QJcjEsIHIyCXx8CW5vcAkKLSA3YjA6CTAzOTAyMGMwIDgwZjAwMDAwIAlub3QJcjIsIHIzCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNjYxMWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotIyB0ZXN0IGFsbCBpbnN0cnVjdGlvbnMKLQotc3RhcnQ6Ci0JYWJzCXIyMSxyNDIKLQotCWFkZAlyMSxyMixyMwotCWFkZAlyNTAscjUxLDB4MWEKLQlhZGQJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGQyaAlyMSxyMixyMwotCWFkZDJoCXI1MCxyNTEsMHgxYQotCWFkZDJoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkYwlyMSxyMixyMwotCWFkZGMJcjUwLHI1MSwweDFhCi0JYWRkYwlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsbGwJcjEscjIscjMKLQlhZGRobGxsCXI1MCxyNTEsMHgxYQotCWFkZGhsbGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGxoCXIxLHIyLHIzCi0JYWRkaGxsaAlyNTAscjUxLDB4MWEKLQlhZGRobGxoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGxobAlyMSxyMixyMwotCWFkZGhsaGwJcjUwLHI1MSwweDFhCi0JYWRkaGxobAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsaGgJcjEscjIscjMKLQlhZGRobGhoCXI1MCxyNTEsMHgxYQotCWFkZGhsaGgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFkZGhobGwJcjEscjIscjMKLQlhZGRoaGxsCXI1MCxyNTEsMHgxYQotCWFkZGhobGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRoaGxoCXIxLHIyLHIzCi0JYWRkaGhsaAlyNTAscjUxLDB4MWEKLQlhZGRoaGxoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGhobAlyMSxyMixyMwotCWFkZGhoaGwJcjUwLHI1MSwweDFhCi0JYWRkaGhobAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhoaGgJcjEscjIscjMKLQlhZGRoaGhoCXI1MCxyNTEsMHgxYQotCWFkZGhoaGgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCi0JYWRkcwlyMSxyMixyMwotCWFkZHMJcjUwLHI1MSwweDFhCi0JYWRkcwlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0JYWRkczJoCXIxLHIyLHIzCi0JYWRkczJoCXI1MCxyNTEsMHgxYQotCWFkZHMyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0JYW5kCXIxLHIyLHIzCi0JYW5kCXI1MCxyNTEsMHgxYQotCWFuZAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFuZGZnCWYwLGYxLGYyCi0JYW5kZmcJZjMsZjQsNQotCQotCWF2ZwlyMSxyMixyMwotCWF2ZwlyNCxyNSw2Ci0JYXZnCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYXZnMmgJcjEscjIscjMKLQlhdmcyaAlyNCxyNSw2Ci0JYXZnMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQliY2xyCXIxLHIyLHIzCi0JYmNscglyNCxyNSw2Ci0JCi0JYm5vdAlyMSxyMixyMwotCWJub3QJcjUscjUxLDYKLQkJCQotCWJyYQlyNDEKLQlicmEJMHg0MAotCWJyYQkweGYwMGQKLQotCWJyYXRueglyNDEscjQyCi0JYnJhdG56CXIxLDB4ZjAwZAotCWJyYXRueglyMSwweGRlYWRmMDBkCi0KLQlicmF0enIJcjQxLHI0MgotCWJyYXR6cglyMSwweGYwMGQKLQlicmF0enIJcjEsMHhkZWFkZjAwZAotCi0JYnNldAlyMSxyMixyMwotCWJzZXQJcjUscjUxLDYKLQotCWJzcglyNDEKLQlic3IJMHhmMDBkCi0JYnNyCTB4ZGVhZGYwMGQKLQotCWJzcnRueglyNDEscjQyCi0JYnNydG56CXIxLDB4ZjAwZAotCWJzcnRueglyMSwweGRlYWRmMDBkCi0KLQlic3J0enIJcjQxLHI0MgotCWJzcnR6cglyMSwweGYwMGQKLQlic3J0enIJcjEsMHhkZWFkZjAwZAotCi0JYnRzdAlmMSxyMixyMwotCWJ0c3QJZjUscjUxLDYKLQkJCQkJCQotCWNtcGVxCWYwLHIzLHIxCi0JY21wbmUJZjEscjIwLHIyMQotCWNtcGd0CWYyLHIzMSxyMzIKLQljbXBnZQlmMyxyMyxyNAotCWNtcGx0CWY0LHIzLHI0Ci0JY21wbGUJZjUscjMscjQKLQljbXBwcwlmNixyMyxyNAotCWNtcG5nCWY3LHIzLHI0CQkJCQotCi0JY21wdWd0CWYyLHIzMSxyMzIKLQljbXB1Z2UJZjMscjMscjQKLQljbXB1bHQJZjQscjMscjQKLQljbXB1bGUJZjUscjMscjQKLQkJCi0JZGJyYQlyMSxyOCAKLQlkYnJhCXIxLDB4MTAwCi0JZGJyYQlyMSwweGRlYWRmMDBkCi0KLQlkYnJhaQkweDEwLHIzMQotCWRicmFpCTB4MTAsMHgxMDAKLQlkYnJhaQkweDEwLDB4ZGVhZGYwMGQKLQotCWRic3IJcjEscjggfHwgbm9wCi0JZGJzcglyMSwweDEwMCB8fCBub3AKLQlkYnNyCXIxLDB4ZGVhZGYwMGQKLQotCWRic3JpCTB4MjAscjMxIHx8IG5vcAotCWRic3JpCTB4MjAsMHgxMDAgfHwgbm9wCi0JZGJzcmkJMHgyMCwweGRlYWRmMDBkCi0KLQlkam1wCXIxLHIzMgotCWRqbXAJcjEsMHhmMDBkCi0JZGptcAlyMSwweGRlYWRmMDBkCi0KLQlkam1waQkweDMwLHIzMgotCWRqbXBpCTB4MzAsMHhmMDBkCi0JZGptcGkJMHgzMCwweGRlYWRmMDBkCi0KLQlkanNyCXIxLHIzMgotCWRqc3IJcjEsMHhmMDBkCi0JZGpzcglyMSwweGRlYWRmMDBkCi0KLQlkanNyaQkweDEwLHIzMgotCWRqc3JpCTB4MjAsMHhmMDBkCi0JZGpzcmkJMHg0MCwweGRlYWRmMDBkCi0JCi0Jam1wCXI0MQotCWptcAkweGYwMGQKLQlqbXAJMHhkZWFkZjAwZAotCi0Jam1wdG56CXI0MSxyNDIKLQlqbXB0bnoJcjEsMHhmMDBkCi0Jam1wdG56CXIxLDB4ZGVhZGYwMGQKLQotCWptcHR6cglyNDEscjQyCi0Jam1wdHpyCXIxLDB4ZjAwZAotCWptcHR6cglyMSwweGRlYWRmMDBkCi0KLQlqb2lubGwJcjEscjIscjQKLQlqb2lubGwJcjEscjIsMHhmCi0Jam9pbmxsCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2lubGgJcjEscjIscjQKLQlqb2lubGgJcjEscjIsMHhmCi0Jam9pbmxoCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2luaGwJcjEscjIscjQKLQlqb2luaGwJcjEscjIsMHhmCi0Jam9pbmhsCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2luaGgJcjEscjIscjQKLQlqb2luaGgJcjEscjIsMHhmCi0Jam9pbmhoCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqc3IJcjQxCi0JanNyCTB4ZjAwZAotCWpzcgkweGRlYWRmMDBkCi0KLQlqc3J0bnoJcjQxLHI0MgotCWpzcnRueglyMSwweGYwMGQKLQlqc3J0bnoJcjEsMHhkZWFkZjAwZAotCi0JanNydHpyCXI0MSxyNDIKLQlqc3J0enIJcjEsMHhmMDBkCi0JanNydHpyCXIxLDB4ZGVhZGYwMGQKLQkJCQkJCi0JbGQyaAlyNixAKHI3LHI4KQotCWxkMmgJcjYsQChyNysscjgpCi0JbGQyaAlyNixAKHI3LSxyOCkKLQlsZDJoCXI2LEAocjcsMHgxYSkKLQlsZDJoCXI2LEAocjcsMHgxMjM0KQotCQotCWxkMncJcjYsQChyNyxyOCkKLQlsZDJ3CXI2LEAocjcrLHI4KQotCWxkMncJcjYsQChyNy0scjgpCi0JbGQydwlyNixAKHI3LDB4MWEpCi0JbGQydwlyNixAKHI3LDB4MTIzNCkKLQkKLQlsZDRiaAlyNixAKHI3LHI4KQotCWxkNGJoCXI2LEAocjcrLHI4KQotCWxkNGJoCXI2LEAocjctLHI4KQotCWxkNGJoCXI2LEAocjcsMHgxYSkKLQlsZDRiaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkNGJodQlyNixAKHI3LHI4KQotCWxkNGJodQlyNixAKHI3KyxyOCkKLQlsZDRiaHUJcjYsQChyNy0scjgpCi0JbGQ0Ymh1CXI2LEAocjcsMHgxYSkKLQlsZDRiaHUJcjYsQChyNywweDEyMzQpCi0KLQlsZGIJcjYsQChyNyxyOCkKLQlsZGIJcjYsQChyNysscjgpCi0JbGRiCXI2LEAocjctLHI4KQotCWxkYglyNixAKHI3LDB4MWEpCi0JbGRiCXI2LEAocjcsMHgxMjM0KQotCi0JbGRidQlyNixAKHI3LHI4KQotCWxkYnUJcjYsQChyNysscjgpCi0JbGRidQlyNixAKHI3LSxyOCkKLQlsZGJ1CXI2LEAocjcsMHgxYSkKLQlsZGJ1CXI2LEAocjcsMHgxMjM0KQotCi0JbGRoCXI2LEAocjcscjgpCi0JbGRoCXI2LEAocjcrLHI4KQotCWxkaAlyNixAKHI3LSxyOCkKLQlsZGgJcjYsQChyNywweDFhKQotCWxkaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkaGgJcjYsQChyNyxyOCkKLQlsZGhoCXI2LEAocjcrLHI4KQotCWxkaGgJcjYsQChyNy0scjgpCi0JbGRoaAlyNixAKHI3LDB4MWEpCi0JbGRoaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkaHUJcjYsQChyNyxyOCkKLQlsZGh1CXI2LEAocjcrLHI4KQotCWxkaHUJcjYsQChyNy0scjgpCi0JbGRodQlyNixAKHI3LDB4MWEpCi0JbGRodQlyNixAKHI3LDB4MTIzNCkKLQotCWxkdwlyNixAKHI3LHI4KQotCWxkdwlyNixAKHI3KyxyOCkKLQlsZHcJcjYsQChyNy0scjgpCi0JbGR3CXI2LEAocjcsMHgxYSkKLQlsZHcJcjYsQChyNywweDEyMzQpCi0JCQkJCQkJCi0JbWFjMAlyMSxyMixyNAotCW1hYzAJcjEscjIsMHgxZgotCW1hYzEJcjEscjIscjQKLQltYWMxCXIxLHIyLDB4MWYKLQotCW1hY3MwCXIxLHIyLHI0Ci0JbWFjczAJcjEscjIsMHgxZgotCW1hY3MxCXIxLHIyLHI0Ci0JbWFjczEJcjEscjIsMHgxZgotCi0JbW9kZGVjCXIxLDB4YQotCi0JbW9kaW5jCXIxLDB4YQotCi0JbXN1YjAJcjEscjIscjQKLQltc3ViMAlyMSxyMiwweDFmCi0JbXN1YjEJcjEscjIscjQKLQltc3ViMQlyMSxyMiwweDFmCi0KLQltdWwJcjEscjIscjQKLQltdWwJcjEscjIsMHhhCi0KLQltc3ViczAJcjEscjIscjQKLQltc3ViczAJcjEscjIsMHgxZgotCW1zdWJzMQlyMSxyMixyNAotCW1zdWJzMQlyMSxyMiwweDFmCi0KLQltdWwyaAlyMSxyMixyNAotCW11bDJoCXIxLHIyLDB4YQotCQotCW11bGh4bGwJcjEscjIscjQKLQltdWxoeGxsCXIxLHIyLDB4YQotCi0JbXVsaHhsaAlyMSxyMixyNAotCW11bGh4bGgJcjEscjIsMHhhCi0KLQltdWxoeGhsCXIxLHIyLHI0Ci0JbXVsaHhobAlyMSxyMiwweGEKLQotCW11bGh4aGgJcjEscjIscjQKLQltdWxoeGhoCXIxLHIyLDB4YQotCi0JbXVseDJoCXI4LHIyLHI0Ci0JbXVseHMJYTAscjEscjQKLQkKLQltdWx4CWEwLHIxLHI0Ci0JbXVseAlhMSxyMiwweGEKLQotCW12ZmFjYwlyMSxhMCxyNAotCW12ZmFjYwlyMixhMSwweGEKLQotCW11bHgyaAlyOCxyMiwweGEKLQltdWx4cwlhMSxyMiwweGEKLQkJCi0JbXZmc3lzCXIxMCxwYwotCW12ZnN5cwlyMTAscnB0X2MKLQltdmZzeXMJcjEwLHBzdwotCW12ZnN5cwlyMTAscHN3aAotCW12ZnN5cwlyMTAscHN3bAotCW12ZnN5cwlyMTAsZjAKLQltdmZzeXMJcjEwLFMKLQotCW12dGFjYwlhMSxyMixyNAotCi0JbXZ0c3lzCXJwdF9jLCByMTAKLQltdnRzeXMJcHN3LCByMTAKLQltdnRzeXMJcHN3aCwgcjEwCi0JbXZ0c3lzCXBzd2wsIHIxMAotCW12dHN5cwlmMCwgcjEwCi0JbXZ0c3lzCWYzLCByMTAKLQltdnRzeXMJUywgcjEwCi0JbXZ0c3lzCVYsIHIxMAotCW12dHN5cwlWQSwgcjEwCi0JbXZ0c3lzCUMsIHIxMAotCi0Jbm9wCi0KLQlub3QJcjEscjIKLQotCW5vdGZnCWYxLGYyCi0KLQlvcglyMSxyMixyNAotCW9yCXIxLHIyLDB4MWEKLQlvcglyMSxyMiwweGRlYWRmMDBkCi0KLQlvcmZnCWYxLGYyLGY0Ci0Jb3JmZwlmNCxmMiwweDEKLQkKLQlyZWl0Ci0KLQlyZXBlYXQJcjEscjIKLQlyZXBlYXQJcjQsMHhkZWFkCi0JcmVwZWF0CXI0LDB4ZGVhZGYwMGQKLQotCXJlcGVhdGkJMHhhLHIxCi0JcmVwZWF0aQkweGEsMHgxMDAxCi0KLQlub3AgfHwgbm9wCi0JCi0Jcm90CXIxLHIyLHI0Ci0Jcm90CXIxLHIyLDB4YQotCi0Jcm90MmgJcjEscjIscjQKLQlyb3QyaAlyMSxyMiwweGEKLQotCXNhdAlyMSxyMixyNAotCXNhdAlyMSxyMiwweGEKLQotCXNhdDJoCXIxLHIyLHI0Ci0Jc2F0MmgJcjEscjIsMHhhCi0KLQlzYXRobAlyMSxyMixyNAotCXNhdGhsCXIxLHIyLDB4YQotCi0Jc2F0aGgJcjEscjIscjQKLQlzYXRoaAlyMSxyMiwweGEKLQkJCi0Jc2F0eglyMSxyMixyNAotCXNhdHoJcjEscjIsMHhhCi0KLQlzYXR6MmgJcjEscjIscjQKLQlzYXR6MmgJcjEscjIsMHhhCi0JCQkKLQlzcmEJcjEscjIscjQKLQlzcmEJcjEscjIsMHhhCi0KLQlzcmEyaAlyMSxyMixyNAotCXNyYTJoCXIxLHIyLDB4YQotCi0Jc3JjCXIxLHIyLHI0Ci0Jc3JjCXIxLHIyLDB4YQotCQotCXNybAlyMSxyMixyNAotCXNybAlyMSxyMiwweGEKLQotCXNybDJoCXIxLHIyLHI0Ci0Jc3JsMmgJcjEscjIsMHhhCi0KLQkKLQlzdDJoCXI2LEAocjcscjgpCi0Jc3QyaAlyNixAKHI3KyxyOCkKLQlzdDJoCXI2LEAocjctLHI4KQotCXN0MmgJcjYsQChyNywweDFhKQotCXN0MmgJcjYsQChyNywweDEyMzQpCi0JCQotCXN0MncJcjYsQChyNyxyOCkKLQlzdDJ3CXI2LEAocjcrLHI4KQotCXN0MncJcjYsQChyNy0scjgpCi0Jc3QydwlyNixAKHI3LDB4MWEpCi0Jc3QydwlyNixAKHI3LDB4MTIzNCkKLQotCXN0NGhiCXI2LEAocjcscjgpCi0Jc3Q0aGIJcjYsQChyNysscjgpCi0Jc3Q0aGIJcjYsQChyNy0scjgpCi0Jc3Q0aGIJcjYsQChyNywweDFhKQotCXN0NGhiCXI2LEAocjcsMHgxMjM0KQotCi0Jc3RiCXI2LEAocjcscjgpCi0Jc3RiCXI2LEAocjcrLHI4KQotCXN0YglyNixAKHI3LSxyOCkKLQlzdGIJcjYsQChyNywweDFhKQotCXN0YglyNixAKHI3LDB4MTIzNCkKLQotCXN0aAlyNixAKHI3LHI4KQotCXN0aAlyNixAKHI3KyxyOCkKLQlzdGgJcjYsQChyNy0scjgpCi0Jc3RoCXI2LEAocjcsMHgxYSkKLQlzdGgJcjYsQChyNywweDEyMzQpCi0KLQlzdGhoCXI2LEAocjcscjgpCi0Jc3RoaAlyNixAKHI3KyxyOCkKLQlzdGhoCXI2LEAocjctLHI4KQotCXN0aGgJcjYsQChyNywweDFhKQotCXN0aGgJcjYsQChyNywweDEyMzQpCi0KLQlzdHcJcjYsQChyNyxyOCkKLQlzdHcJcjYsQChyNysscjgpCi0Jc3R3CXI2LEAocjctLHI4KQotCXN0dwlyNixAKHI3LDB4MWEpCi0Jc3R3CXI2LEAocjcsMHgxMjM0KQotCQkJCQkJCQkKLQlzdWIJcjEscjIscjMKLQlzdWIJcjUwLHI1MSwweDFhCi0Jc3ViCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViMmgJcjEscjIscjMKLQlzdWIyaAlyNTAscjUxLDB4MWEKLQlzdWIyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmIJcjEscjIscjMKLQlzdWJiCXI1MCxyNTEsMHgxYQotCXN1YmIJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGxsCXIxLHIyLHIzCi0Jc3ViaGxsbAlyNTAscjUxLDB4MWEKLQlzdWJobGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxsaAlyMSxyMixyMwotCXN1YmhsbGgJcjUwLHI1MSwweDFhCi0Jc3ViaGxsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhsaGwJcjEscjIscjMKLQlzdWJobGhsCXI1MCxyNTEsMHgxYQotCXN1YmhsaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGhoCXIxLHIyLHIzCi0Jc3ViaGxoaAlyNTAscjUxLDB4MWEKLQlzdWJobGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQkKLQlzdWJoaGxsCXIxLHIyLHIzCi0Jc3ViaGhsbAlyNTAscjUxLDB4MWEKLQlzdWJoaGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGhsaAlyMSxyMixyMwotCXN1YmhobGgJcjUwLHI1MSwweDFhCi0Jc3ViaGhsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhoaGwJcjEscjIscjMKLQlzdWJoaGhsCXI1MCxyNTEsMHgxYQotCXN1YmhoaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJoaGhoCXIxLHIyLHIzCi0Jc3ViaGhoaAlyNTAscjUxLDB4MWEKLQlzdWJoaGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQotCXRyYXAJcjEKLQl0cmFwCTB4YQotCi0JeG9yCXIxLHIyLHI0Ci0JeG9yCXIxLHIyLDB4YQotCXhvcglyMSxyMiwweGRlYWRmMDBkCi0KLQl4b3JmZwlmMSxmMixmNAotCXhvcmZnCWYxLGY0LDB4YQotCi0jIFZMSVcgc3ludGF4IHRlc3QKLQlub3AKLQlub3AKLQlub3AJLT4Jbm9wCi0Jbm9wCXx8CW5vcAotCW5vcAk8LQlub3AKLQotIyB0cnkgY2hhbmdpbmcgc2VjdGlvbnMKLQlub3QJcjEscjIKLQkuc2VjdGlvbiAuZm9vCi0JYWRkCXIxMCxyMTIsNgotCS50ZXh0Ci0Jbm90CXIyLHIzCi0Jbm9wCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI5ZjgxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNvYmpkdW1wOiAtbGRyCi0jbmFtZTogRDMwViBkZWJ1ZyAoLWcpIHRlc3QKLSNhczogLWcKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxfYWJjLTB4MTg+OgotLipsYWJlbC1kZWJ1Zy5zOjQKLSAgIDA6CTEwMDgwMDAzIDAwZjAwMDAwIAlicmEuc1wvdHgJMTgJXCgxOCA8X2FiYz5cKQlcfFx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczo1Ci0gICA4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gIDEwOgkwZTAwMDAwNCAwMGYwMDAwMCAJLmxvbmcJMHhlMDAwMDA0CXx8CW5vcAkKLQotMDAwMDAwMTggPF9hYmM+OgotLipsYWJlbC1kZWJ1Zy5zOjgKLSAgMTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczo5Ci0gIDIwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6MTAKLSAgMjg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczoxMQotICAzMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQwYWE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgbGFiZWxzIHNob3VsZCBiZSBhbGlnbmVkIG9uIDgtYnl0ZSBib3VuZHJpZXMKLQkKLQkudGV4dAotCWJyYS5zL3R4IF9hYmMgICB8fCBub3AgCi0Jbm9wICAgICB8fCBub3AgCi0JLndvcmQgMHgwZTAwMDAwNAotX2FiYzoKLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjZmNkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBsYWJlbCBhbGlnbm1lbnQgdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9hYmMtMHgxOD46Ci0gICAwOgkxMDA4MDAwMyAwMGYwMDAwMCAJYnJhLnMvdHgJMTgJKDE4IDxfYWJjPikJfHwJbm9wCQotICAgODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotICAxMDoJMGUwMDAwMDQgMDBmMDAwMDAgCS5sb25nCTB4ZTAwMDAwNAl8fAlub3AJCi0KLTAwMDAwMDE4IDxfYWJjPjoKLSAgMTg6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSAgMjA6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0MGFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRyaWVzCi0JCi0JLnRleHQKLQlicmEucy90eCBfYWJjICAgfHwgbm9wIAotCW5vcCAgICAgfHwgbm9wIAotCS53b3JkIDB4MGUwMDAwMDQKLV9hYmM6Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMGE1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYWxpZ25tZW50IHRlc3QKLSNhczogLVdPCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJOGExMDUxODcgMGExMDIwYzQgCW11bHgyaAlyNSwgcjYsIHI3CTwtCW11bHgyaAlyMiwgcjMsIHI0Ci0gICA4OgkwMGYwMDAwMCAwYTEwODI0YSAJbm9wCQl8fAltdWx4MmgJcjgsIHI5LCByMTAKLSAgMTA6CTAwZjAwMDAwIDBhMTBiMzBkIAlub3AJCXx8CW11bHgyaAlyMTEsIHIxMiwgcjEzCi0gIDE4Ogk4YTExMTQ5MyAwYTEwZTNkMCAJbXVseDJoCXIxNywgcjE4LCByMTkJPC0JbXVseDJoCXIxNCwgcjE1LCByMTYKLSAgMjA6CThhMTE3NjE5IDBhMTE0NTU2IAltdWx4MmgJcjIzLCByMjQsIHIyNQk8LQltdWx4MmgJcjIwLCByMjEsIHIyMgotICAyODoJOGIwMWQ3OWYgMGExMWE2ZGMgCW11bAlyMjksIHIzMCwgcjMxCTwtCW11bHgyaAlyMjYsIHIyNywgcjI4Ci0gIDMwOgk4YjAwNTE4NyAwYjAwMjBjNCAJbXVsCXI1LCByNiwgcjcJPC0JbXVsCXIyLCByMywgcjQKLSAgMzg6CThhMTBiMzBkIDBhMTA4MjRhIAltdWx4MmgJcjExLCByMTIsIHIxMwk8LQltdWx4MmgJcjgsIHI5LCByMTAKLSAgNDA6CTgwZjAwMDAwIDBiMDBlM2QwIAlub3AJCTwtCW11bAlyMTQsIHIxNSwgcjE2Ci0gIDQ4OgkwMGYwMDAwMCAwYTExMTQ5MyAJbm9wCQl8fAltdWx4MmgJcjE3LCByMTgsIHIxOQotICA1MDoJOGIwMTc2MTkgMGExMTQ1NTYgCW11bAlyMjMsIHIyNCwgcjI1CTwtCW11bHgyaAlyMjAsIHIyMSwgcjIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2Nzg1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyAgT25lIG9mIHRoZSBydWxlIG9uIHJlc3RyaWN0ZWQgc2VxdWVuY2UgaXMgY29uc2VjdXRpdmUgSVUgaW5zdHJ1Y3Rpb24gCi0jICAgICAgIElVOiBNVUwsIE1BQywgTUFDUywgTVNVQiwgTVNVQlMgIChhKSAgICAKLSMgICAgICAgSVU6IE1VTEhYcHAsIE1VTFgySCwgTVVMMkggICAgICAoYikKLSMgVGhpcyBtZWFucyB0aGF0IGluc3RydWN0aW9ucyBpbiBncm91cCAoYSkgYW5kIGluIChiKSBzaG91bGQgbm90IGJlIGV4ZWN1dGVkCi0jIGluIElVIGluIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiB0aGUgb3JkZXIgKGEpLT4oYikuIEl0IGRvZXMgbmVpdGhlciBwcm9oaWJpdAotIyBleGVjdXRpb25zIGluIHRoZSByZXZlcnNlIG9yZGVyIChiKS0+IChhKSBub3IgY29uc2VjdXRpdmUgZXhlY3V0aW9uIG9mCi0jIGdyb3VwIChhKS0+KGEpIG9yIChiKS0+KGIpCi0KLQltdWx4MmggcjUscjYscjcJCTwtCW11bHgyaCByMixyMyxyNAotCW5vcAl8fAltdWx4MmggcjgscjkscjEwCi0Jbm9wCXx8CW11bHgyaCByMTEscjEyLHIxMyAgICAgICAKLQltdWx4MmggcjE0LHIxNSxyMTYKLQltdWx4MmggcjE3LHIxOCxyMTkgICAgICAKLQltdWx4MmggcjIzLHIyNCxyMjUgICAgIDwtCW11bHgyaCByMjAscjIxLHIyMgotCW11bCAgICByMjkscjMwLHIzMSAgICAgPC0JbXVseDJoIHIyNixyMjcscjI4Ci0JbXVsICAgIHI1LCByNiwgcjcgICAgICA8LQltdWwgcjIsIHIzLCByNAotCW11bHgyaCByMTEsIHIxMiwgcjEzICAgPC0JbXVseDJoIHI4LCByOSwgcjEwCi0JbXVseDJoIHIxNywgcjE4LCByMTkgICA8LQltdWwgcjE0LCByMTUsIHIxNgotCW11bCAgICByMjMsIHIyNCwgcjI1ICAgPC0JbXVseDJoIHIyMCwgcjIxLCByMjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJmYTljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBvcHRpbWl6YXRpb24gdGVzdAotI2FzOiAtTwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgIDA6CTA4ODAxMDgwIDA4ODAzMTAwIAlhYnMJcjEsIHIyCXx8CWFicwlyMywgcjQKLSAgIDg6CTAyOTAwMTAwIDAyOTAxMDgwIAlub3RmZwlmMCwgcwl8fAlub3RmZwlmMSwgZjIKLSAgMTA6CTA4ODAxMDgwIDAyOTAxMDgwIAlhYnMJcjEsIHIyCXx8CW5vdGZnCWYxLCBmMgotICAxODoJMDgwMDEwODMgODI5MDcwMDAgCWFkZC5zCXIxLCByMiwgcjMJLT4Jbm90ZmcJYywgZjAKLSAgMjA6CTA4MDAxMDgzIDgyOTAwMWMwIAlhZGQucwlyMSwgcjIsIHIzCS0+CW5vdGZnCWYwLCBjCi0gIDI4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDI4IDxzdGFydFwrMHgyOD5cKQl8fAlub3AJCi0gIDMwOgkwODgwMTA4MCA4ODgwMTA4MCAJYWJzCXIxLCByMgktPglhYnMJcjEsIHIyCi0gIDM4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDM4IDxzdGFydFwrMHgzOD5cKQl8fAlub3AJCi0gIDQwOgkwMDJiZmZmZiAwMGYwMDAwMCAJYnNyLnMJLTgJXCgzOCA8c3RhcnRcKzB4Mzg+XCkJfHwJbm9wCQotICA0ODoJMDg4MDEwODAgODg4MDEwODAgCWFicwlyMSwgcjIJLT4JYWJzCXIxLCByMgotICA1MDoJMDAyODAwMDAgMDg4MDEwODAgCWJzci5zCTAJXCg1MCA8c3RhcnRcKzB4NTA+XCkJfHwJYWJzCXIxLCByMgotICA1ODoJMDQwMDEwODMgODUwMDcyMDkgCWxkYi5zCXIxLCBAXChyMiwgcjNcKQktPglzdGIucwlyNywgQFwocjgsIHI5XCkKLSAgNjA6CTA1MDA3MjA5IDg0MDAxMDgzIAlzdGIucwlyNywgQFwocjgsIHI5XCkJLT4JbGRiLnMJcjEsIEBcKHIyLCByM1wpCi0gIDY4OgkwNDAwNzIwOSA4NDAwMTA4MyAJbGRiLnMJcjcsIEBcKHI4LCByOVwpCS0+CWxkYi5zCXIxLCBAXChyMiwgcjNcKQotICA3MDoJMDUwMDcyMDkgODUwMDEwODMgCXN0Yi5zCXI3LCBAXChyOCwgcjlcKQktPglzdGIucwlyMSwgQFwocjIsIHIzXCkKLSAgNzg6CTA4MDAzMGM2IDg1NDgyMGMwIAlhZGQucwlyMywgcjMsIHI2CS0+CXN0dy5zCXIyLCBAXChyMywgMHgwXCkKLSAgODA6CTAyYzI4MTA1IDkwMTgwMDAwIAljbXBsZS5zCWYwLCByNCwgcjUJLT4Jam1wLnMvdHgJMCA8c3RhcnQ+Ci0gIDg4OgkwMmMyODEwNSBhMDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL2Z4CTAgPHN0YXJ0PgotICA5MDoJMzAxODAwMDAgMDJjMjgxMDUgCWptcC5zL3h0CTAgPHN0YXJ0Pgl8fAljbXBsZS5zCWYwLCByNCwgcjUKLSAgOTg6CTQwMTgwMDAwIDAyYzI4MTA1IAlqbXAucy94ZgkwIDxzdGFydD4JfHwJY21wbGUucwlmMCwgcjQsIHI1Ci0gIGEwOgkwMmMyODEwNSBkMDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL3R0CTAgPHN0YXJ0PgotICBhODoJMDJjMjgxMDUgZTAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy90ZgkwIDxzdGFydD4KLSAgYjA6CTEwMTgwMDAwIDAyYzI5MTA1IAlqbXAucy90eAkwIDxzdGFydD4JfHwJY21wbGUucwlmMSwgcjQsIHI1Ci0gIGI4OgkwMmMyOTEwNSBiMDE4MDAwMCAJY21wbGUucwlmMSwgcjQsIHI1CS0+CWptcC5zL3h0CTAgPHN0YXJ0PgotICBjMDoJMDgwODQwMDEgODJjMjgxMDUgCWFkZC5zCXI0LCByMCwgMHgxCS0+CWNtcGxlLnMJZjAsIHI0LCByNQotICBjODoJMDgwODQwMDEgMDJjMjgwYzUgCWFkZC5zCXI0LCByMCwgMHgxCXx8CWNtcGxlLnMJZjAsIHIzLCByNQotICBkMDoJMDQ2MDQwMDYgODg2MDU0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJLT4JYWRkcy5zCXI1LCByMTksIHIyMAotICBkODoJMDQ2MDQwMDYgODg2MDMxNTQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJLT4JYWRkcy5zCXIzLCByNSwgcjIwCi0gIGUwOgkwNDYwNDAwNiAwODYwNjRkNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjYsIHIxOSwgcjIwCi0gIGU4OgkwNDYwNDAwNiAwODYwNzRkNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjcsIHIxOSwgcjIwCi0gIGYwOgkwNDYwNDAwNiAwODYwNzAxNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjcsIHIwLCByMjAKLSAgZjg6CTA1NjA0MDA2IDA4NjA1NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNSwgcjE5LCByMjAKLSAxMDA6CTA1NjA0MDA2IDA4NjAzMTU0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyMywgcjUsIHIyMAotIDEwODoJMDU2MDQwMDYgMDg2MDY0ZDQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI2LCByMTksIHIyMAotIDExMDoJMDU2MDQwMDYgMDg2MDc0ZDQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMTksIHIyMAotIDExODoJMDU2MDQwMDYgMDg2MDcwMTQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMCwgcjIwCi0gMTIwOgkwNTYwYTBjNCA4NTYyOGFlYyAJc3Qydy5zCXIxMCwgQFwocjMsIHI0XCkJLT4Jc3Qydy5zCXI0MCwgQFwocjQzLCByNDRcKQotIDEyODoJMDU0MDEwODMgODQ0MjlhYWIgCXN0dy5zCXIxLCBAXChyMiwgcjNcKQktPglsZHcucwlyNDEsIEBcKHI0MiwgcjQzXCkKLSAxMzA6CTA0NDAxMDgzIDg0MDI5YWFiIAlsZHcucwlyMSwgQFwocjIsIHIzXCkJLT4JbGRiLnMJcjQxLCBAXChyNDIsIHI0M1wpCi0gMTM4OgkwNDQ0NDE4YiA4ODY4OTE4MiAJbGR3LnMJcjQsIEBcKHI2XCssIHIxMVwpCS0+CWFkZHMucwlyOSwgcjYsIDB4MgotIDE0MDoJMDQ0YzQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNi0sIHIxMVwpCXx8CWFkZHMucwlyOSwgcjYsIDB4MgotIDE0ODoJMDU0YzQxOGIgODg2ODkxODIgCXN0dy5zCXI0LCBAXChyNi0sIHIxMVwpCS0+CWFkZHMucwlyOSwgcjYsIDB4MgotIDE1MDoJMDQ0MDQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNiwgcjExXCkJfHwJYWRkcy5zCXI5LCByNiwgMHgyCi0gMTU4OgkwNDQwNDE4YiAwODY4OTE4MiAJbGR3LnMJcjQsIEBcKHI2LCByMTFcKQl8fAlhZGRzLnMJcjksIHI2LCAweDIKLSAxNjA6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotIDE2ODoJMDAzODAwMDAgMDg4MDEwODAgCWpzci5zCTAgPHN0YXJ0Pgl8fAlhYnMJcjEsIHIyCi0gMTcwOgkwODgwMTA4MCAwMGYwMDAwMCAJYWJzCXIxLCByMgl8fAlub3AJCi0gMTc4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDE3OCA8c3RhcnRcKzB4MTc4PlwpCXx8CW5vcAkKLSAxODA6CTAwMjgwMDAwIDA4ODAxMDgwIAlic3IucwkwCVwoMTgwIDxzdGFydFwrMHgxODA+XCkJfHwJYWJzCXIxLCByMgotIDE4ODoJMDg4MDEwODAgMDBmMDAwMDAgCWFicwlyMSwgcjIJfHwJbm9wCQotCi0wMDAwMDE5MCA8bGFiZWwxPjoKLSAxOTA6CTA1NjAyMDgzIDg5MDA0MTQ2IAlzdDJ3LnMJcjIsIEBcKHIyLCByM1wpCS0+CWFkZGhsbGwucwlyNCwgcjUsIHI2Ci0KLTAwMDAwMTk4IDxsYWJlbDI+OgotIDE5ODoJMDU1MDgyMDkgODk5MGEyY2MgCXN0NGhiLnMJcjgsIEBcKHI4LCByOVwpCS0+CXN1YmhsbGgucwlyMTAsIHIxMSwgcjEyCi0KLTAwMDAwMWEwIDxsYWJlbDM+OgotIDFhMDoJMDQ2MGUzOGYgOGE2MTA0NTIgCWxkMncucwlyMTQsIEBcKHIxNCwgcjE1XCkJLT4JbXVsaHhobAlyMTYsIHIxNywgcjE4Ci0KLTAwMDAwMWE4IDxsYWJlbDQ+OgotIDFhODoJMDQ0MTM1MTUgOGExMTY1ZDggCWxkdy5zCXIxOSwgQFwocjIwLCByMjFcKQktPgltdWx4MmgJcjIyLCByMjMsIHIyNAotCi0wMDAwMDFiMCA8bGFiZWw1PjoKLSAxYjA6CTA0MjE5NjliIDhhMDFjNzVlIAlsZGgucwlyMjUsIEBcKHIyNiwgcjI3XCkJLT4JbXVsMmgJcjI4LCByMjksIHIzMAotCi0wMDAwMDFiOCA8bGFiZWw2PjoKLSAxYjg6CTgwZjAwMDAwIDBiMDAxMDgzIAlub3AJCTwtCW11bAlyMSwgcjIsIHIzCi0gMWMwOgkwODAwNzIwOSAwYTQwNDE0NiAJYWRkLnMJcjcsIHI4LCByOQl8fAltdWxoeGxsCXI0LCByNSwgcjYKLQotMDAwMDAxYzggPGxhYmVsNz46Ci0gMWM4OgkwNDQwNTE4MCAwYjAwMjBjNCAJbGR3LnMJcjUsIEBcKHI2LCByMFwpCXx8CW11bAlyMiwgcjMsIHI0Ci0gMWQwOgk4MGYwMDAwMCAwYjAwNzIwOSAJbm9wCQk8LQltdWwJcjcsIHI4LCByOQotIDFkODoJMDQ0MGEyYzAgMDBmMDAwMDAgCWxkdy5zCXIxMCwgQFwocjExLCByMFwpCXx8CW5vcAkKLSAxZTA6CTgwZjAwMDAwIDBiMDBjMzRlIAlub3AJCTwtCW11bAlyMTIsIHIxMywgcjE0Ci0gMWU4OgkwNDQwZjQwMCAwYjQ0MjBjNCAJbGR3LnMJcjE1LCBAXChyMTYsIHIwXCkJfHwJbWFjMQlyMiwgcjMsIHI0Ci0gMWYwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gMWY4OgkwNDQwNTE4MCAwMGYwMDAwMCAJbGR3LnMJcjUsIEBcKHI2LCByMFwpCXx8CW5vcAkKLSAyMDA6CTgwZjAwMDAwIDBiNDA3MjA5IAlub3AJCTwtCW1hYzAJcjcsIHI4LCByOQotIDIwODoJMDQ0MGEyYzAgODQ0MGEyYzAgCWxkdy5zCXIxMCwgQFwocjExLCByMFwpCS0+CWxkdy5zCXIxMCwgQFwocjExLCByMFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczMzMwMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLSMgRDMwViBwYXJhbGxlbCBvcHRpbWl6YXRpb24gdGVzdAotIyBhc3NlbWJsZSB3aXRoICItTyIKLQkKLQkudGV4dAotc3RhcnQ6CQotCWFicwlyMSxyMgotCWFicwlyMyxyNAotCi0Jbm90ZmcJZjAsZjQKLQlub3RmZwlmMSxmMgotCQkKLQlhYnMJcjEscjIKLQlub3RmZwlmMSxmMgotCi0jIGJvdGggY2hhbmdlIEMgZmxhZwotCWFkZAlyMSxyMixyMwotCW5vdGZnCUMsZjAKLQotIyBvbmUgdXNlcyBhbmQgb25lIGNoYW5nZXMgQyBmbGFnCQotCWFkZAlyMSxyMixyMwotCW5vdGZnCWYwLEMKLQotCWJyYQkuCi0JYWJzCXIxLHIyCi0KLQlhYnMJcjEscjIJCi0JYnJhCS4KLQotCWJzcgkuCi0JYWJzCXIxLHIyCi0JCi0JYWJzCXIxLHIyCQotCWFicwlyMSxyMgkKLQlic3IJLgotCQotCWxkYglyMSxAKHIyLHIzKQotCXN0YglyNyxAKHI4LHI5KQotCi0Jc3RiCXI3LEAocjgscjkpCQotCWxkYglyMSxAKHIyLHIzKQotCi0JbGRiCXI3LEAocjgscjkpCQotCWxkYglyMSxAKHIyLHIzKQotCi0Jc3RiCXI3LEAocjgscjkpCQotCXN0YglyMSxAKHIyLHIzKQotCi0JYWRkICAgICByMywgcjMsIHI2Ci0Jc3R3ICAgICByMiwgQChyMywgMCkKLQkJCQotIyBzaG91bGQgYmUgc2VyaWFsIGJlY2F1c2Ugb2YgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3R4ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC9meCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAveHQgIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3hmICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC90dCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvdGYgIDB4MAotCQkJCQkKLSAgICAgICAgY21wbGUgICBmMSxyNCxyNQotICAgICAgICBqbXAvdHggIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjEscjQscjUKLSAgICAgICAgam1wL3h0ICAweDAKLQotCSMgc2VyaWFsIGJlY2F1c2Ugb2YgdGhlIHI0IGRlcGVuZGVuY3kKLQlhZGQJcjQsIHIwLCAxCi0JY21wbGUJZjAsIHI0LCByNQotCi0JIyBwYXJhbGxlbAotCWFkZAlyNCwgcjAsIDEKLQljbXBsZQlmMCwgcjMsIHI1Ci0KLQkjIHNlcmlhbCBiZWNhdXNlIGxkMncgbG9hZHMgcjUKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNSxyMTkscjIwCi0KLQkjIHNlcmlhbCBiZWNhdXNlIGxkMncgbG9hZHMgcjUKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyMyxyNSxyMjAKLQotCSMgcGFyYWxsZWwgZXZlbiB0aG91Z2ggbGQydyB1c2VzIHI2IGFuZCBhZGRzIGNoYW5nZXMgaXQKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNixyMTkscjIwCi0KLQkjIHBhcmFsbGVsCi0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjcscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCWxkMncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIwLHIyMAotCi0JIyBwYXJhbGxlbCBldmVuIHRob3VnaCBzdDJ3IHVzZXMgcjUgYW5kIGFkZHMgbW9kaWZpZXMgaXQKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNSxyMTkscjIwCi0KLQkjIHBhcmFsbGVsLCBib3RoIHVzZSBidXQgZG9uJ3QgbW9kaWZ5IHI1Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjMscjUscjIwCi0KLQkjIHBhcmFsbGVsIGV2ZW4gdGhvdWdoIHN0MncgdXNlcyByNiBhbmQgYWRkcyBjaGFuZ2VzIGl0Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjYscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMCxyMjAKLQkJCQkJCQotIyB0ZXN0IG1lbW9yeSBkZXBlbmRlbmNpZXMKLQotCSMgYWx3YXlzIHNlcmlhbCBiZWNhdXNlIG9uZSBjb3VsZCBvdmVyd3JpdGUgdGhlIG90aGVyCi0Jc3QydwlyMTAsQChyMyxyNCkKLQlzdDJ3CXI0MCxAKHI0MyxyNDQpCi0KLQkjIGFsd2F5cyBzZXJpYWwKLQlzdHcJcjEsQChyMixyMykKLQlsZHcJcjQxLEAocjQyLHI0MykJCQkKLQotCSMgcmVhZHMgY2FuIGhhcHBlbiBpbiBwYXJhbGxlbCBidXQgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIAotCSMgZG9lc24ndCBzdXBwb3J0IGl0Ci0JbGR3CXIxLEAocjIscjMpCi0JbGRiCXI0MSxAKHI0MixyNDMpCQkJCi0KLSMgdGVzdCBwb3N0IGluY3JlbWVudCBhbmQgZGVjcmVtZW50IGRlcGVuZGVuY2llcwotCi0JIyBzZXJpYWwKLQlsZHcJcjQsQChyNisscjExKQotCWFkZHMJcjkscjYsMgotCi0JIyBwYXJhbGxlbCwgbW9kaWZpY2F0aW9uIHRvIHI2IGhhcHBlbnMgbGFzdAotCWFkZHMJcjkscjYsMgkKLQlsZHcJcjQsQChyNi0scjExKQotCi0JIyBzZXJpYWwKLQlzdHcJcjQsQChyNi0scjExKQotCWFkZHMJcjkscjYsMgotCQotCSMgcGFyYWxsZWwKLQlsZHcJcjQsQChyNixyMTEpCi0JYWRkcwlyOSxyNiwyCi0KLQkjIHBhcmFsbGVsCi0JYWRkcwlyOSxyNiwyCQotCWxkdwlyNCxAKHI2LHIxMSkKLQkKLSMgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGEgam1wLCBkb24ndCBwYXJhbGxlbGl6ZQotCWptcAkwCi0JYWJzCXIxLHIyCQotCi0JanNyCTAKLQlhYnMJcjEscjIJCi0KLQkuYWxpZ24JMwotCQotCWJyYQkwCi0JYWJzCXIxLHIyCQotCQotCWJzcgkwCi0JYWJzCXIxLHIyCQotCi0jIEV4cGxpY2l0bHkgcHJvaGliaXRlZCBmcm9tIHBhcmFsbGVsIGV4ZWN1dGlvbi4KLSMgVGhlIGxhYmVscyBhcmUgaGVyZSB0byBwcmV2ZW50IGluc3RydWN0aW9uIHBhaXJzCi0jICBmcm9tIGJlaW5nIG1lcmdlZCB3aXRoIGZvbGxvd2luZyBwYWlycy4KLQkKLWxhYmVsMToJCi0Jc3QydyAgICAgcjIsIEAocjIsIHIzKQotCWFkZGhsbGwgIHI0LCByNSwgcjYKLWxhYmVsMjoKLQlzdDRoYiAgICByOCwgQChyOCwgcjkpCi0Jc3ViaGxsaCAgcjEwLCByMTEsIHIxMgotbGFiZWwzOgotCWxkMncgICAgIHIxNCwgQChyMTQsIHIxNSkKLQltdWxoeGhsICByMTYsIHIxNywgcjE4Ci1sYWJlbDQ6Ci0JbGR3ICAgICAgcjE5LCBAKHIyMCwgcjIxKQotCW11bHgyaCAgIHIyMiwgcjIzLCByMjQKLWxhYmVsNToKLQlsZGggICAgICByMjUsIEAocjI2LCByMjcpCi0JbXVsMmggICAgcjI4LCByMjksIHIzMAotCi0jIEluc2VydGlvbiBvZiBOT1BzIHJlcXVpcmVkIHRvIHByZXZlbnQgcGlwZWxpbmUgY2xhc2hlcy4KLQotbGFiZWw2OgotCW11bCByMSxyMixyMwotCW11bGh4bGwgcjQscjUscjYKLSAgICAgICAgYWRkIHI3LCByOCwgcjkKLWxhYmVsNzoKLQkKLSAgICAgICAgbXVsICByMixyMyxyNAotICAgICAgICBsZHcgIHI1LCBAKHI2LHIwKQotIAotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSA8LSBtdWwgcjcscjgscjkKLQkKLSAgICAgICAgbXVsICByMTIscjEzLHIxNCAtPiBsZHcgcjE1LCBAKHIxNiwgcjApCi0KLSAgICAgICAgbWFjMSByMixyMyxyNAotICAgICAgICBsZHcgIHI1LCBAKHI2LHIwKQotIAotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSA8LSBtYWMwIHI3LHI4LHI5Ci0gICAgICAgIGxkdyAgcjEwLCBAKHIxMSwgcjApIAotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGUyNzgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIHJlbG9jYXRpb24gdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgICAgICAwOgk4ODA4MjAwMCA4MDAwMDAyOCAJYWRkLmwJcjIsIHIwLCAweDI4Ci0JCQkwOiBSX0QzMFZfMzIJLnRleHQKLSAgICAgICA4Ogk4ODA4NDAwMCA4MDAwMDAwMCAJYWRkLmwJcjQsIHIwLCAweDAKLQkJCTg6IFJfRDMwVl8zMgkuZGF0YQotICAgICAgMTA6CTg4MDg0MDAwIDgwMDAwMDA2IAlhZGQubAlyNCwgcjAsIDB4NgotCQkJMTA6IFJfRDMwVl8zMgkuZGF0YQotICAgICAgMTg6CTg4MDg0MDAwIDgwMDAwMDAwIAlhZGQubAlyNCwgcjAsIDB4MAotCQkJMTg6IFJfRDMwVl8zMgl1bmsKLSAgICAgIDIwOgk4MDA4MDAwMCA4MDAwMDAxOCAJYnJhLmwJMTgJXCgzOCA8Y29udD5cKQotCi0wMDAwMDAyOCA8aGVsbG8+OgotICAgICAgMjg6CTQ4NjU2YzZjIDZmMjA1NzZmIAkubG9uZwkweDQ4NjU2YzZjCXx8CS5sb25nCTB4NmYyMDU3NmYKLSAgICAgIDMwOgk3MjZjNjQwYSAwMGYwMDAwMCAJLmxvbmcJMHg3MjZjNjQwYQl8fAlub3AJCi0KLTAwMDAwMDM4IDxjb250PjoKLSAgICAgIDM4Ogk4MDE4MDAwMCA4MDAwMDA0OCAJam1wLmwJNDggPGNvbnQyPgotCQkJMzg6IFJfRDMwVl8zMgkudGV4dAotICAgICAgNDA6CTA4ODAyMGMwIDAwZjAwMDAwIAlhYnMJcjIsIHIzCXx8CW5vcAkKLQotMDAwMDAwNDggPGNvbnQyPjoKLSAgICAgIDQ4OgkwMDBiZmZmNyAwMGYwMDAwMCAJYnJhLnMJLTQ4CVwoMCA8c3RhcnQ+XCkJfHwJbm9wCQotICAgICAgNTA6CTAwMDgwMjA1IDAwZjAwMDAwIAlicmEucwkxMDI4CVwoMTA3OCA8ZXhpdD5cKQl8fAlub3AJCi0gICAgICA1ODoJMDAxODAwMDAgMDBmMDAwMDAgCWptcC5zCTAgPHN0YXJ0Pgl8fAlub3AJCi0gICAgICA2MDoJMDA2YzFmZmIgMDBmMDAwMDAgCWJzcnRuei5zCXIxLCAtMjgJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA2ODoJMDA2YzFmZmEgMDBmMDAwMDAgCWJzcnRuei5zCXIxLCAtMzAJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA3MDoJMDA0YzFmZjkgMDBmMDAwMDAgCWJyYXRuei5zCXIxLCAtMzgJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA3ODoJMDA0YzFmZjggMDBmMDAwMDAgCWJyYXRuei5zCXIxLCAtNDAJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA4MDoJMDA1YzEwMDcgMDBmMDAwMDAgCWptcHRuei5zCXIxLCAzOCA8Y29udD4JfHwJbm9wCQotCQkJODA6IFJfRDMwVl8xNQkudGV4dAotICAgICAgODg6CTAwNmMxMWYxIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgZjg4CVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAgIDkwOgkwMDVjMTAwMCAwMGYwMDAwMCAJam1wdG56LnMJcjEsIDAgPHN0YXJ0Pgl8fAlub3AJCi0JCQk5MDogUl9EMzBWXzE1CXVuawotICAgICAgOTg6CTAwNmMxMDAwIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgMAlcKDk4IDxjb250MlwrMHg1MD5cKQl8fAlub3AJCi0JCQk5ODogUl9EMzBWXzE1X1BDUkVMCXVuawotICAgICAgYTA6CTgwNWMxMDAwIDgwMDAwMDAwIAlqbXB0bnoubAlyMSwgMCA8c3RhcnQ+Ci0JCQlhMDogUl9EMzBWXzMyCXVuawotICAgICAgYTg6CTgwNmMxMDAwIDgwMDAwMDAwIAlic3J0bnoubAlyMSwgMAlcKGE4IDxjb250MlwrMHg2MD5cKQotCQkJYTg6IFJfRDMwVl8zMl9QQ1JFTAl1bmsKLSAgICAgIGIwOgkwMDA4MDFlYyAwMGYwMDAwMCAJYnJhLnMJZjYwCVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAgIGI4Ogk4MDA4MDAwMCA4MDAwMGY1OCAJYnJhLmwJZjU4CVwoMTAxMCA8Zm9vPlwpCi0gICAgICBjMDoJMDAwYmZmZTggMDBmMDAwMDAgCWJyYS5zCS1jMAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIGM4Ogk4MDE4MDAwMCA4MDAwMDAwMCAJam1wLmwJMCA8c3RhcnQ+Ci0JCQljODogUl9EMzBWXzMyCS50ZXh0Ci0gICAgICBkMDoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJZDA6IFJfRDMwVl8zMgkudGV4dAotICAgICAgZDg6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotCQkJZDg6IFJfRDMwVl8yMQkudGV4dAotICAgICAgZTA6CTAwMTgwMjAyIDAwZjAwMDAwIAlqbXAucwkxMDEwIDxmb28+CXx8CW5vcAkKLQkJCWUwOiBSX0QzMFZfMjEJLnRleHQKLSAgICAgIGU4OgkwMDBiZmZlMyAwMGYwMDAwMCAJYnJhLnMJLWU4CVwoMCA8c3RhcnQ+XCkJfHwJbm9wCQotICAgICAgZjA6CTgwMDgwMDAwIDgwMDAwMDAwIAlicmEubAkwCVwoZjAgPGNvbnQyXCsweGE4PlwpCi0JCQlmMDogUl9EMzBWXzMyX1BDUkVMCXVua25vd24KLSAgICAgIGY4Ogk4MDE4MDAwMCA4MDAwMDAwMCAJam1wLmwJMCA8c3RhcnQ+Ci0JCQlmODogUl9EMzBWXzMyCXVua25vd24KLSAgICAgMTAwOgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLQkJCTEwMDogUl9EMzBWXzIxCXVua25vd24KLSAgICAgMTA4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDEwOCA8Y29udDJcKzB4YzA+XCkJfHwJbm9wCQotCQkJMTA4OiBSX0QzMFZfMjFfUENSRUwJdW5rbm93bgotCS4uLgotCi0wMDAwMTAxMCA8Zm9vPjoKLSAgICAxMDEwOgkwODAwMTAwMCAwMGYwMDAwMCAJYWRkLnMJcjEsIHIwLCByMAl8fAlub3AJCi0gICAgMTAxODoJODQ2YmMwMDAgODAwMDEwNzAgCWxkMncubAlyNjAsIEBcKHIwLCAweDEwNzBcKQotCQkJMTAxODogUl9EMzBWXzMyCS50ZXh0Ci0gICAgMTAyMDoJMDgwM2UwMDAgODAyODAwMGIgCWFkZC5zCXI2MiwgcjAsIHIwCS0+CWJzci5zCTU4CVwoMTA3OCA8ZXhpdD5cKQotICAgIDEwMjg6CTAwMmJmZmZkIDAwZjAwMDAwIAlic3IucwktMTgJXCgxMDEwIDxmb28+XCkJfHwJbm9wCQotICAgIDEwMzA6CTAwMGJmZTAzIDAwZjAwMDAwIAlicmEucwktZmU4CVwoNDggPGNvbnQyPlwpCXx8CW5vcAkKLSAgICAxMDM4OgkwMDBiZmUwMiAwMGYwMDAwMCAJYnJhLnMJLWZmMAlcKDQ4IDxjb250Mj5cKQl8fAlub3AJCi0gICAgMTA0MDoJMDAyODAwMDcgMDBmMDAwMDAgCWJzci5zCTM4CVwoMTA3OCA8ZXhpdD5cKQl8fAlub3AJCi0gICAgMTA0ODoJMDAxODAyMGYgMDBmMDAwMDAgCWptcC5zCTEwNzggPGV4aXQ+CXx8CW5vcAkKLQkJCTEwNDg6IFJfRDMwVl8yMQkudGV4dAotICAgIDEwNTA6CTAwMTgwMjBmIDAwZjAwMDAwIAlqbXAucwkxMDc4IDxleGl0Pgl8fAlub3AJCi0JCQkxMDUwOiBSX0QzMFZfMjEJLnRleHQKLSAgICAxMDU4OgkwMDE4MDIwZiAwMGYwMDAwMCAJam1wLnMJMTA3OCA8ZXhpdD4JfHwJbm9wCQotCQkJMTA1ODogUl9EMzBWXzIxCS50ZXh0Ci0gICAgMTA2MDoJODAyODAwMDAgODAwMDAwMTggCWJzci5sCTE4CVwoMTA3OCA8ZXhpdD5cKQotICAgIDEwNjg6CTgwMTgwMDAwIDgwMDAxMDc4IAlqbXAubAkxMDc4IDxleGl0PgotCQkJMTA2ODogUl9EMzBWXzMyCS50ZXh0Ci0KLTAwMDAxMDcwIDxsb25nemVybz46Ci0JLi4uCi0KLTAwMDAxMDc4IDxleGl0PjoKLSAgICAxMDc4OgkwMDEwMDAzZSAwMGYwMDAwMCAJam1wLnMJcjYyCXx8CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5OWJmOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jIEQzMFYgcmVsb2NhdGlvbiB0ZXN0Ci0JCi0JLnRleHQKLXN0YXJ0OgotCWFkZAlyMiwgcjAsIGhlbGxvCi0JYWRkCXI0LCByMCwgYmFyCi0JYWRkCXI0LCByMCwgYmFyMgotCWFkZAlyNCwgcjAsIHVuawkKLQlicmEJY29udAotaGVsbG86CS5hc2NpaSAiSGVsbG8gV29ybGRcbiIKLQkuYWxpZ24gMwotY29udDoJam1wCWNvbnQyCi0JYWJzCXIyLHIzCi1jb250MjoKLQlicmEJc3RhcnQJfHwJbm9wCi0JYnJhLnMJZXhpdAotCWptcAkwCXx8CW5vcAotCWJzcnRuei5zCXIxLGNvbnQKLQlic3J0bnoJcjEsY29udAkKLQlicmF0bnoucwlyMSxjb250Ci0JYnJhdG56CXIxLGNvbnQKLQlqbXB0bnoucwlyMSxjb250CQkKLQlic3J0bnoucwlyMSwgZm9vCi0Jam1wdG56LnMJcjEsIHVuawkKLQlic3J0bnoucwlyMSwgdW5rCi0Jam1wdG56CXIxLCB1bmsJCi0JYnNydG56CXIxLCB1bmsKLQlicmEucwlmb28KLQlicmEJZm9vCQotCWJyYQlzdGFydAotCWptcAlzdGFydAotCWptcAlzdGFydAotCWptcC5zCXN0YXJ0Ci0Jam1wLnMJZm9vCi0JYnJhCXN0YXJ0Ci0JYnJhCXVua25vd24KLQlqbXAJdW5rbm93bgotCWptcC5zCXVua25vd24JCi0JYnJhLnMJdW5rbm93bgotCQotCS5kYXRhCi1iYXI6CS5hc2NpegkiWFlaWlkiCi1iYXIyOgkubG9uZwkweGRlYWRiZWVmCi0JCi0JLnRleHQKLQkuc3BhY2UgMHhGMDAsMAotCi1mb286Ci0JYWRkCXIxLHIwLHIwCi0JbGQydwlyNjAsIEAocjAsbG9uZ3plcm8pCi0JYWRkCXI2MixyMCxyMAotCWJzci5zCWV4aXQKLQlic3Iucwlmb28KLQlicmEucwljb250MgotCWJyYS5zCWNvbnQyCQkJCQotCWJzci5zCWV4aXQJCi0Jam1wLnMJZXhpdAotCWptcC5zCWV4aXQKLQlqbXAucwlleGl0CQkKLQlic3IJZXhpdAotCWptcAlleGl0Ci0KLWxvbmd6ZXJvOgotCS5xdWFkCTAKLQotCS50ZXh0Ci1leGl0OgkKLQlqbXAJcjYyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhNWE2Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgc2VyaWFsLnMKLSAgIDIgICAgICAgICAgICAgIAkjCi0gICAzICAgICAgICAgICAgICAJIyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCB0aGUgcmlnaHQtc3ViaW5zdHJ1Y3Rpb25zCi0gICA0ICAgICAgICAgICAgICAJIyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLiAgR0FTIHNob3VsZCBkZXRlY3QgdGhpcy4KLSAgIDUgICAgICAgICAgICAgIAkJCi0gICA2IFw/XD9cP1w/IDAwMDAwMEYwIAkJdHJhcCByMjEgLT4gYWRkIHIyLCByMCwgcjAgOyByaWdodCBpbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLgotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwMDAwMEYwIAotICAgNiAgICAgIDAwMDAwMEYwIAotICAgNiAgICAgIDAwMDAwMDkwIAotICAgNiAgICAgIDAwMTUwMEYwIAotICAgNyBcP1w/XD9cPyAwODAwMjAwMCAJCWRidCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA3ICAgICAgMDBCMDAwMDAgCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA4IFw/XD9cP1w/IDA4MDAyMDAwIAkJcnRkICAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDggICAgICAwMEEwMDAwMCAKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDkgXD9cP1w/XD8gMDgwMDIwMDAgCQlyZWl0ICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgOSAgICAgIDAwRjAwMDAwIAotICAgOSAgICAgIDAwODAwMDAwIAotICAgOSAgICAgIDAwRjAwMDAwIAotICAxMCBcP1w/XD9cPyAwODAwMjAwMCAJCW12dHN5cyBwc3csICByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0gIDEwICAgICAgMDBGMDAwMDAgCi0gIDEwICAgICAgMDBFMDAwNDAgCi0gIDEwICAgICAgODgwMDIwMDAgCi0gIDExIFw/XD9cP1w/IDAwRTAwMDQyIAkJbXZ0c3lzIHBzd2gsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLSAgMTEgICAgICA4ODAwMjAwMCAKLSAgMTIgXD9cP1w/XD8gMDBFMDAwNDEgCQltdnRzeXMgcHN3bCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotICAxMiAgICAgIDg4MDAyMDAwIAotICAxMyBcP1w/XD9cPyAwMEUwMDA0MyAJCW12dHN5cyBmMCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICA7IE9LCi0gIDEzICAgICAgODgwMDIwMDAgCi0gIDE0IFw/XD9cP1w/IDAwRTBBMDQwIAkJbXZ0c3lzIG1vZF9zLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgIDsgT0sKLSAgMTQgICAgICA4ODAwMjAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTk1ZDYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIHNlcmlhbC5zCi0jCi0jIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIHRoZSByaWdodC1zdWJpbnN0cnVjdGlvbnMKLSMgd2lsbCBuZXZlciBiZSBleGVjdXRlZC4gIEdBUyBzaG91bGQgZGV0ZWN0IHRoaXMuCi0JCi0JdHJhcCByMjEgLT4gYWRkIHIyLCByMCwgcjAgOyByaWdodCBpbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLgotCWRidCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi0JcnRkICAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLQlyZWl0ICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotCW12dHN5cyBwc3csICByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0JbXZ0c3lzIHBzd2gsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLQltdnRzeXMgcHN3bCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotCW12dHN5cyBmMCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICA7IE9LCi0JbXZ0c3lzIG1vZF9zLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgIDsgT0sKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZTA0ZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjU6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjExOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTM6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE0OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxOTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjQ6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0gICAyICAgICAgICAgICAgICAJCQotICAgMyAgICAgICAgICAgICAgCQkudGV4dAotICAgNCAgICAgICAgICAgICAgCQkKLSAgIDUgXD9cP1w/XD8gMDAwMDAwRjAgCQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwMEIgCi0gICA1ICAgICAgRkZGRjAwRjAgCi0gICA2IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNiAgICAgIDAwMkJGRkZGIAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgICAgICAgICAgCQotICAgOCBcP1w/XD9cPyAwODA4MzAwMCAJCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMTAwQkZGRkYgCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgIDkgICAgICAxMDJCRkZGRiAKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgICAgICAgICAgICAgIAkKLSAgMTEgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTEgICAgICAwMDJCRkZGRiAKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgXD9cP1w/XD8gMDAyQkZGRkUgCQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAwMDJCRkZGRiAKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTMgXD9cP1w/XD8gMzAyQkZGRkUgCQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDEzICAgICAgMTAyQkZGRkYgCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDE0IFw/XD9cP1w/IDAwMkJGRkZFIAkJYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNCAgICAgIDAwRjAwMDAwIAotICAxNCAgICAgIDEwMkJGRkZGIAotICAxNCAgICAgIDAwRjAwMDAwIAotICAxNSAgICAgICAgICAgICAgCQotICAxNiBcP1w/XD9cPyAyMDJCRkZGRSAJCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE2ICAgICAgMDAwQkZGRkYgCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE3IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTcgICAgICAwMDBCRkZGRiAKLQxHQVMgTElTVElORyAuKgotCi0KLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTggXD9cP1w/XD8gMTAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTggICAgICAxMDBCRkZGRiAKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTkgXD9cP1w/XD8gMDAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTkgICAgICAwMEYwMDAwMCAKLSAgMTkgICAgICAxMDBCRkZGRiAKLSAgMTkgICAgICAwMEYwMDAwMCAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgXD9cP1w/XD8gMjAwODAwMDEgCQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMSAgICAgIDAwMkJGRkZGIAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMiBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIyICAgICAgMDAyQkZGRkYgCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIzIFw/XD9cP1w/IDEwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDIzICAgICAgMTAyQkZGRkYgCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDI0IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI0ICAgICAgMDBGMDAwMDAgCi0gIDI0ICAgICAgMTAyQkZGRkYgCi0gIDI0ICAgICAgMDBGMDAwMDAgCi0gIDI1ICAgICAgICAgICAgICAJCi0gIDI2IFw/XD9cP1w/IDIwMDgwMDAxIAkJYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjYgICAgICAwMDBCRkZGRiAKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjcgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyNyAgICAgIDAwMEJGRkZGIAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyOCBcP1w/XD9cPyAxMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOCAgICAgIDEwMEJGRkZGIAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOSBcP1w/XD9cPyAwMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyOSAgICAgIDAwRjAwMDAwIAotICAyOSAgICAgIDEwMEJGRkZGIAotICAyOSAgICAgIDAwRjAwMDAwIAotICAyOSAgICAgIDIwMjgwMDAxIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MzE1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLQkKLQkudGV4dAotCQotCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0KLQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWViMDVjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTI6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLSAgIDIgICAgICAgICAgICAgIAkJCi0gICAzICAgICAgICAgICAgICAJCS50ZXh0Ci0gICA0ICAgICAgICAgICAgICAJCQotICAgNSBcP1w/XD9cPyAwMDAwMDBGMCAJCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDUgICAgICAwMDAwMDBGMCAKLSAgIDUgICAgICAwMDAwMDBGMCAKLSAgIDUgICAgICAwMDAwMDAwQiAKLSAgIDUgICAgICBGRkZGMDBGMCAKLSAgIDYgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA2ICAgICAgMDBGMDAwMDAgCi0gICA2ICAgICAgMDAyQkZGRkYgCi0gICA2ICAgICAgMDBGMDAwMDAgCi0gICA3ICAgICAgICAgICAgICAJCi0gICA4IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDggICAgICAxMDBCRkZGRiAKLSAgIDggICAgICA4ODA4MzAwMCAKLSAgIDkgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotICAgOSAgICAgIDg4MDgzMDAwIAotICAxMCAgICAgICAgICAgICAgCQotICAxMSBcP1w/XD9cPyAwMDJCRkZGRiAJCWJzciAtMyAtPiBic3IgLTEwCTsgICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMSAgICAgIDAwRjAwMDAwIAotICAxMiBcP1w/XD9cPyAwMDJCRkZGRSAJCWJzciAtMyAtPiBic3IveHQgLTEwICAgIDsgICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMiAgICAgIDAwRjAwMDAwIAotICAxMiAgICAgIDAwMkJGRkZGIAotICAxMiAgICAgIDAwRjAwMDAwIAotICAxMyBcP1w/XD9cPyAzMDJCRkZGRSAJCWJzci90eCAtMyAtPiBic3IgLTEwICAgIDsgICAgICAgVmFsaWQKLSAgMTMgICAgICAwMEYwMDAwMCAKLSAgMTMgICAgICAxMDJCRkZGRiAKLSAgMTMgICAgICA4MDJCRkZGRSAKLSAgMTQgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYnNyL2Z4IC0xMCA7ICAgICAgIFZhbGlkCi0gIDE0ICAgICAgQTAyQkZGRkUgCi0gIDE1ICAgICAgICAgICAgICAJCi0gIDE2IFw/XD9cP1w/IDAwMEJGRkZGIAkJYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTYgICAgICAwMEYwMDAwMCAKLSAgMTcgXD9cP1w/XD8gMDAwODAwMDEgCQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNyAgICAgIDAwRjAwMDAwIAotICAxNyAgICAgIDAwMEJGRkZGIAotICAxNyAgICAgIDAwRjAwMDAwIAotICAxOCBcP1w/XD9cPyAxMDA4MDAwMSAJCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotICAxOCAgICAgIDAwRjAwMDAwIAotICAxOCAgICAgIDEwMEJGRkZGIAotICAxOCAgICAgIDgwMDgwMDAxIAotICAxOSBcP1w/XD9cPyAxMDBCRkZGRiAJCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotICAxOSAgICAgIEEwMDgwMDAxIAotICAyMCAgICAgICAgICAgICAgCQotICAyMSBcP1w/XD9cPyAwMDJCRkZGRiAJCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIxICAgICAgMDBGMDAwMDAgCi0gIDIyIFw/XD9cP1w/IDAwMDgwMDAxIAkJYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQxHQVMgTElTVElORyAuKgotCi0KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjIgICAgICAwMEYwMDAwMCAKLSAgMjIgICAgICAwMDJCRkZGRiAKLSAgMjIgICAgICAwMEYwMDAwMCAKLSAgMjMgXD9cP1w/XD8gMTAwODAwMDEgCQlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLSAgMjMgICAgICAwMEYwMDAwMCAKLSAgMjMgICAgICAxMDJCRkZGRiAKLSAgMjMgICAgICA4MDA4MDAwMSAKLSAgMjQgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLSAgMjQgICAgICBBMDA4MDAwMSAKLSAgMjUgICAgICAgICAgICAgIAkKLSAgMjYgXD9cP1w/XD8gMDAwQkZGRkYgCQlicmEgLTMgLT4gYnNyIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNiAgICAgIDAwRjAwMDAwIAotICAyNyBcP1w/XD9cPyAwMDI4MDAwMSAJCWJyYSAtMyAtPiBic3IvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI3ICAgICAgMDBGMDAwMDAgCi0gIDI3ICAgICAgMDAwQkZGRkYgCi0gIDI3ICAgICAgMDBGMDAwMDAgCi0gIDI4IFw/XD9cP1w/IDEwMjgwMDAxIAkJYnJhL3R4IC0zIC0+IGJzciAxMCAgICAgOyAgICAgIFZhbGlkCi0gIDI4ICAgICAgMDBGMDAwMDAgCi0gIDI4ICAgICAgMTAwQkZGRkYgCi0gIDI4ICAgICAgODAyODAwMDEgCi0gIDI5IFw/XD9cP1w/IDEwMEJGRkZGIAkJYnJhL3R4IC0zIC0+IGJzci9meCAxMCAgOyAgICAgIFZhbGlkCi0gIDI5ICAgICAgQTAyODAwMDEgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTMxNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBEMzBWIHNlcmlhbCBleGVjdXRpb24gdGVzdAotCQotCS50ZXh0Ci0JCi0JYnJhIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotCWJzciAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQotCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLQotCWJzciAtMyAtPiBic3IgLTEwCTsgICAgICAgSW52YWxpZAotCWJzciAtMyAtPiBic3IveHQgLTEwICAgIDsgICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBic3IgLTEwICAgIDsgICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYnNyL2Z4IC0xMCA7ICAgICAgIFZhbGlkCi0KLQlicmEgLTMgLT4gYnJhICAxMCAgICAgICA7ICAgICAgSW52YWxpZAotCWJyYSAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnJhL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0KLQlicmEgLTMgLT4gYnNyIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotCWJyYSAtMyAtPiBic3IvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhL3R4IC0zIC0+IGJzciAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnJhL3R4IC0zIC0+IGJzci9meCAxMCAgOyAgICAgIFZhbGlkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI0M2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjU6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6NjogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjo3OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjg6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6OTogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMDogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMTogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMjogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEdBUyBzaG91bGQgcHJpbnQgYSB3YXJuaW5nICB3aGVuIGFuIG9kZCByZWdpc3RlciBpcyB1c2VkIGFzIGEgdGFyZ2V0IAotICAgMiAgICAgICAgICAgICAgCSMgb2YgbXVsdGktd29yZCBpbnN0cnVjdGlvbnM6IGxkMncsIGxkNGJoLCBsZDRiaHUsIGxkMmgsIHN0MncsIHN0NGhiLCBzdDJoLCAKLSAgIDMgICAgICAgICAgICAgIAkjIGFuZCBtdWx4MmgKLSAgIDQgICAgICAgICAgICAgIAkKLSAgIDUgMDAwMCAwNTY4MTAwMCAJc3QydyByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA1ICAgICAgMDBGMDAwMDAgCi0gICA2IDAwMDggMDQ2ODEwMDAgCWxkMncgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAwMDEwIDA0NTgxMDAwIAlsZDRiaCByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA4IDAwMTggMDREODEwMDAgCWxkNGJodSByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IDAwMjAgMDQzODEwMDAgCWxkMmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgOSAgICAgIDAwRjAwMDAwIAotICAxMCAwMDI4IDA1NTgxMDAwIAlzdDRoYiByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gIDEwICAgICAgMDBGMDAwMDAgCi0gIDExIDAwMzAgMDUzODEwMDAgCXN0MmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMSAgICAgIDAwRjAwMDAwIAotICAxMiAwMDM4IDAwRjAwMDAwIAlub3AJfHwJbXVseDJoIHIxLCByNSwgcjYgICAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMiAgICAgIDBBMTAxMTQ2IApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDlmNzUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgR0FTIHNob3VsZCBwcmludCBhIHdhcm5pbmcgIHdoZW4gYW4gb2RkIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYSB0YXJnZXQgCi0jIG9mIG11bHRpLXdvcmQgaW5zdHJ1Y3Rpb25zOiBsZDJ3LCBsZDRiaCwgbGQ0Ymh1LCBsZDJoLCBzdDJ3LCBzdDRoYiwgc3QyaCwgCi0jIGFuZCBtdWx4MmgKLQotc3QydyByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQydyByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQ0YmggcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkNGJodSByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQyaCByMSwgQChyMCwgMCkJfHwJbm9wIAotc3Q0aGIgcjEsIEAocjAsIDApCXx8CW5vcCAKLXN0MmggcjEsIEAocjAsIDApCXx8CW5vcCAKLW5vcAl8fAltdWx4MmggcjEsIHI1LCByNiAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL2VsZi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvZWxmLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZjJhYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvZWxmLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMKLSMgZWxmIHRlc3RzCi0jCi0KLSMgV2UncmUgdGVzdGluZyBiaXRzIGluIG9iai1lbGYgLS0gZG9uJ3QgcnVuIG9uIGFueXRoaW5nIGVsc2UuCi1pZiB7IChbaXN0YXJnZXQgIiotKi1lbGYqIl0JCQotICAgICAgfHwgW2lzdGFyZ2V0ICIqLSotbGludXgqIl0KLSAgICAgIHx8IFtpc3RhcmdldCAic3BhcmMqLSotc29sYXJpcyoiXQotICAgICAgfHwgW2lzdGFyZ2V0ICJtaXBzKi0qLWlyaXg2KiJdKQotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0KLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXQotfSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzZWN0aW9uMCIgCi0gICAgcnVuX2R1bXBfdGVzdCAic2VjdGlvbjEiIAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3NGE2NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAuZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNvYmpkdW1wOiAtcwotI25hbWU6IGVsZiBzZWN0aW9uMAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci1Db250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOgotIDAwMDAgMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uICAgICAgICAgICAgICAKLSMgVGhlIE1JUFMgaW5jbHVkZXMgYSAnc2VjdGlvbiAucmVnaW5mbycgYW5kIHN1Y2ggaGVyZS4KLSMuLi4KLUNvbnRlbnRzIG9mIHNlY3Rpb24gQToKLSAwMDAwIDAxMDEwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgCi1Db250ZW50cyBvZiBzZWN0aW9uIEI6Ci0gMDAwMCAwMjAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4gICAgICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBDOgotIDAwMDAgMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzhmMGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0uZGF0YQotCS5ieXRlIDAKLS5zZWN0aW9uIEEKLQkuYnl0ZSAxCi0ucHVzaHNlY3Rpb24gQgotCS5ieXRlIDIKLS5wdXNoc2VjdGlvbiBDCi0JLmJ5dGUgMwotLnBvcHNlY3Rpb24KLQkuYnl0ZSAyCi0ucG9wc2VjdGlvbgotCS5ieXRlIDEKLS5wcmV2aW91cwotCS5ieXRlIDAKLS5wcmV2aW91cwotCS5ieXRlIDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDUyZjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLXMKLSNuYW1lOiBlbGYgc2VjdGlvbjEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotQ29udGVudHMgb2Ygc2VjdGlvbiAuZGF0YToKLSAwMDAwIDAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgCi0jIFRoZSBNSVBTIGluY2x1ZGVzIGEgJ3NlY3Rpb24gLnJlZ2luZm8nIGFuZCBzdWNoIGhlcmUuCi0jLi4uCi1Db250ZW50cyBvZiBzZWN0aW9uIEE6Ci0gMDAwMCAwMTAxMDEwMSAwMTAxICAgICAgICAgICAgICAgICAgICAgICAgLi4uLi4uICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBCOgotIDAwMDAgMDIwMjAyMDIgMDIgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4uICAgICAgICAgICAKLUNvbnRlbnRzIG9mIHNlY3Rpb24gQzoKLSAwMDAwIDAzMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLiAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkyYWRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLmRhdGEKLQkuYnl0ZSAwCi0uc2VjdGlvbiBBCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMAotLnByZXZpb3VzCi0JLmJ5dGUgMQotLnB1c2hzZWN0aW9uIEIKLQkuYnl0ZSAyCi0ucHJldmlvdXMKLQkuYnl0ZSAxCi0ucHJldmlvdXMKLQkuYnl0ZSAyCi0ucHVzaHNlY3Rpb24gQwotCS5ieXRlIDMKLS5wcmV2aW91cwotCS5ieXRlIDIKLS5wcmV2aW91cwotCS5ieXRlIDMKLS5wb3BzZWN0aW9uCi0JLmJ5dGUgMgotLnByZXZpb3VzCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMgotLnBvcHNlY3Rpb24KLQkuYnl0ZSAxCi0ucHJldmlvdXMKLQkuYnl0ZSAwCi0ucHJldmlvdXMKLQkuYnl0ZSAxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFjNzYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5kCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBhbGxpbnNuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxhZGQ+OgotICAgMDoJYTYgMDEgICAgICAgCWFkZCByMCxyMQotICAgMjoJYTQgMDIgICAgICAgCWFkZCAweDAscjIKLQotMCswMDA0IDxhZGQyPjoKLSAgIDQ6CWE1IGYzICAgICAgIAlhZGQyIC0xLHIzCi0KLTArMDAwNiA8YWRkYz46Ci0gICA2OglhNyA0NSAgICAgICAJYWRkYyByNCxyNQotCi0wKzAwMDggPGFkZG4+OgotICAgODoJYTIgNjcgICAgICAgCWFkZG4gcjYscjcKLSAgIGE6CWEwIGY4ICAgICAgIAlhZGRuIDB4ZixyOAotCi0wKzAwMGMgPGFkZG4yPjoKLSAgIGM6CWExIDA5ICAgICAgIAlhZGRuMiAtMTYscjkKLQotMCswMDBlIDxzdWI+OgotICAgZToJYWMgYWIgICAgICAgCXN1YiByMTAscjExCi0KLTArMDAxMCA8c3ViYz46Ci0gIDEwOglhZCBjZCAgICAgICAJc3ViYyByMTIscjEzCi0KLTArMDAxMiA8c3Vibj46Ci0gIDEyOglhZSBlZiAgICAgICAJc3VibiByMTQscjE1Ci0KLTArMDAxNCA8Y21wPjoKLSAgMTQ6CWFhIGRlICAgICAgIAljbXAgcjEzLHIxNAotICAxNjoJYTggMWYgICAgICAgCWNtcCAweDEscjE1Ci0KLTArMDAxOCA8Y21wMj46Ci0gIDE4OglhOSAxMCAgICAgICAJY21wMiAtMTUscjAKLQotMCswMDFhIDxhbmQ+OgotICAxYToJODIgMTIgICAgICAgCWFuZCByMSxyMgotICAxYzoJODQgMzQgICAgICAgCWFuZCByMyxAcjQKLQotMCswMDFlIDxhbmRoPjoKLSAgMWU6CTg1IDU2ICAgICAgIAlhbmRoIHI1LEByNgotCi0wKzAwMjAgPGFuZGI+OgotICAyMDoJODYgNzggICAgICAgCWFuZGIgcjcsQHI4Ci0KLTArMDAyMiA8b3I+OgotICAyMjoJOTIgOWEgICAgICAgCW9yIHI5LHIxMAotICAyNDoJOTQgYmMgICAgICAgCW9yIHIxMSxAcjEyCi0KLTArMDAyNiA8b3JoPjoKLSAgMjY6CTk1IGRlICAgICAgIAlvcmggcjEzLEByMTQKLQotMCswMDI4IDxvcmI+OgotICAyODoJOTYgZmQgICAgICAgCW9yYiByMTUsQHIxMwotCi0wKzAwMmEgPGVvcj46Ci0gIDJhOgk5YSBlZiAgICAgICAJZW9yIHIxNCxyMTUKLSAgMmM6CTljIDAxICAgICAgIAllb3IgcjAsQHIxCi0KLTArMDAyZSA8ZW9yaD46Ci0gIDJlOgk5ZCAyMyAgICAgICAJZW9yaCByMixAcjMKLQotMCswMDMwIDxlb3JiPjoKLSAgMzA6CTllIDQ1ICAgICAgIAllb3JiIHI0LEByNQotCi0wKzAwMzIgPGJhbmRsPjoKLSAgMzI6CTgwIGY2ICAgICAgIAliYW5kbCAweGYsQHI2Ci0KLTArMDAzNCA8bmFkaD46Ci0gIDM0Ogk4MSA3NyAgICAgICAJYmFuZGggMHg3LEByNwotCi0wKzAwMzYgPGJvcmw+OgotICAzNjoJOTAgMzggICAgICAgCWJvcmwgMHgzLEByOAotCi0wKzAwMzggPGJvcmg+OgotICAzODoJOTEgZDkgICAgICAgCWJvcmggMHhkLEByOQotCi0wKzAwM2EgPGJlb3JsPjoKLSAgM2E6CTk4IGZhICAgICAgIAliZW9ybCAweGYsQHIxMAotCi0wKzAwM2MgPGJlb3JoPjoKLSAgM2M6CTk5IDFiICAgICAgIAliZW9yaCAweDEsQHIxMQotCi0wKzAwM2UgPGJ0c3RsPjoKLSAgM2U6CTg4IDBjICAgICAgIAlidHN0bCAweDAsQHIxMgotCi0wKzAwNDAgPGJ0c3RoPjoKLSAgNDA6CTg5IDhkICAgICAgIAlidHN0aCAweDgsQHIxMwotCi0wKzAwNDIgPG11bD46Ci0gIDQyOglhZiBlZiAgICAgICAJbXVsIHIxNCxyMTUKLQotMCswMDQ0IDxtdWx1PjoKLSAgNDQ6CWFiIGRlICAgICAgIAltdWx1IHIxMyxyMTQKLQotMCswMDQ2IDxtdWx1aD46Ci0gIDQ2OgliYiBmMCAgICAgICAJbXVsdWggcjE1LHIwCi0KLTArMDA0OCA8bXVsaD46Ci0gIDQ4OgliZiAxMiAgICAgICAJbXVsaCByMSxyMgotCi0wKzAwNGEgPGRpdjBzPjoKLSAgNGE6CTk3IDQzICAgICAgIAlkaXYwcyByMwotCi0wKzAwNGMgPGRpdjB1PjoKLSAgNGM6CTk3IDU0ICAgICAgIAlkaXYwdSByNAotCi0wKzAwNGUgPGRpdjE+OgotICA0ZToJOTcgNjUgICAgICAgCWRpdjEgcjUKLQotMCswMDUwIDxkaXYyPjoKLSAgNTA6CTk3IDc2ICAgICAgIAlkaXYyIHI2Ci0KLTArMDA1MiA8ZGl2Mz46Ci0gIDUyOgk5ZiA2MCAgICAgICAJZGl2MwotCi0wKzAwNTQgPGRpdjRzPjoKLSAgNTQ6CTlmIDcwICAgICAgIAlkaXY0cwotCi0wKzAwNTYgPGxzbD46Ci0gIDU2OgliNiA3OCAgICAgICAJbHNsIHI3LHI4Ci0gIDU4OgliNCAzOSAgICAgICAJbHNsIDB4MyxyOQotCi0wKzAwNWEgPGxzbDI+OgotICA1YToJYjUgMGEgICAgICAgCWxzbDIgMHgwLHIxMAotCi0wKzAwNWMgPGxzcj46Ci0gIDVjOgliMiBiYyAgICAgICAJbHNyIHIxMSxyMTIKLSAgNWU6CWIwIGZkICAgICAgIAlsc3IgMHhmLHIxMwotCi0wKzAwNjAgPGxzcjI+OgotICA2MDoJYjEgZmUgICAgICAgCWxzcjIgMHhmLHIxNAotCi0wKzAwNjIgPGFzcj46Ci0gIDYyOgliYSBmZCAgICAgICAJYXNyIHIxNSxyMTMKLSAgNjQ6CWI4IDZlICAgICAgIAlhc3IgMHg2LHIxNAotCi0wKzAwNjYgPGFzcjI+OgotICA2NjoJYjkgN2YgICAgICAgCWFzcjIgMHg3LHIxNQotCi0wKzAwNjggPGxkaV84PjoKLSAgNjg6CWNmIGYyICAgICAgIAlsZGk6OCAweGZmLHIyCi0KLTArMDA2YSA8bGQ+OgotICA2YToJMDQgMzQgICAgICAgCWxkIEByMyxyNAotICA2YzoJMDAgNTYgICAgICAgCWxkIEBcKHIxMyxyNVwpLHI2Ci0gIDZlOgkyNyBmNyAgICAgICAJbGQgQFwocjE0LDUwOFwpLHI3Ci0gIDcwOgkwMyBmOCAgICAgICAJbGQgQFwocjE1LDB4M2NcKSxyOAotICA3MjoJMDcgMDkgICAgICAgCWxkIEByMTVcKyxyOQotICA3NDoJMDcgOTAgICAgICAgCWxkIEByMTVcKyxwcwotICA3NjoJMDcgODAgICAgICAgCWxkIEByMTVcKyx0YnIKLSAgNzg6CTA3IDgxICAgICAgIAlsZCBAcjE1XCsscnAKLSAgN2E6CTA3IDgyICAgICAgIAlsZCBAcjE1XCssc3NwCi0KLTArMDA3YyA8bGR1aD46Ci0gIDdjOgkwNSBhYiAgICAgICAJbGR1aCBAcjEwLHIxMQotICA3ZToJMDEgY2QgICAgICAgCWxkdWggQFwocjEzLHIxMlwpLHIxMwotICA4MDoJNDggMGYgICAgICAgCWxkdWggQFwocjE0LC0yNTZcKSxyMTUKLQotMCswMDgyIDxsZHViPjoKLSAgODI6CTA2IGRlICAgICAgIAlsZHViIEByMTMscjE0Ci0gIDg0OgkwMiBmMCAgICAgICAJbGR1YiBAXChyMTMscjE1XCkscjAKLSAgODY6CTY4IDAxICAgICAgIAlsZHViIEBcKHIxNCwtMTI4XCkscjEKLQotMCswMDg4IDxzdD46Ci0gIDg4OgkxNCAzMiAgICAgICAJc3QgcjIsQHIzCi0gIDhhOgkxMCA1NCAgICAgICAJc3QgcjQsQFwocjEzLHI1XCkKLSAgOGM6CTM4IDA2ICAgICAgIAlzdCByNixAXChyMTQsLTUxMlwpCi0gIDhlOgkxMyBmNyAgICAgICAJc3QgcjcsQFwocjE1LDB4M2NcKQotICA5MDoJMTcgMDggICAgICAgCXN0IHI4LEAtcjE1Ci0gIDkyOgkxNyA4NCAgICAgICAJc3QgbWRoLEAtcjE1Ci0gIDk0OgkxNyA5MCAgICAgICAJc3QgcHMsQC1yMTUKLQotMCswMDk2IDxzdGg+OgotICA5NjoJMTUgYTkgICAgICAgCXN0aCByOSxAcjEwCi0gIDk4OgkxMSBjYiAgICAgICAJc3RoIHIxMSxAXChyMTMscjEyXCkKLSAgOWE6CTU0IDBkICAgICAgIAlzdGggcjEzLEBcKHIxNCwxMjhcKQotCi0wKzAwOWMgPHN0Yj46Ci0gIDljOgkxNiBmZSAgICAgICAJc3RiIHIxNCxAcjE1Ci0gIDllOgkxMiAxMCAgICAgICAJc3RiIHIwLEBcKHIxMyxyMVwpCi0gIGEwOgk3OCAwMiAgICAgICAJc3RiIHIyLEBcKHIxNCwtMTI4XCkKLQotMCswMGEyIDxtb3Y+OgotICBhMjoJOGIgMzQgICAgICAgCW1vdiByMyxyNAotICBhNDoJYjcgNTUgICAgICAgCW1vdiBtZGwscjUKLSAgYTY6CTE3IDE2ICAgICAgIAltb3YgcHMscjYKLSAgYTg6CWIzIDM3ICAgICAgIAltb3YgcjcsdXNwCi0gIGFhOgkwNyAxOCAgICAgICAJbW92IHI4LHBzCi0KLTArMDBhYyA8am1wPjoKLSAgYWM6CTk3IDA5ICAgICAgIAlqbXAgQHI5Ci0KLTArMDBhZSA8cmV0PjoKLSAgYWU6CTk3IDIwICAgICAgIAlyZXQKLQotMCswMGIwIDxicmE+OgotICBiMDoJZTAgYTcgICAgICAgCWJyYSAwIFw8YWRkXD4KLQotMCswMGIyIDxibm8+OgotICBiMjoJZTEgYTYgICAgICAgCWJubyAwIFw8YWRkXD4KLQotMCswMGI0IDxiZXE+OgotICBiNDoJZTIgYTUgICAgICAgCWJlcSAwIFw8YWRkXD4KLQotMCswMGI2IDxibmU+OgotICBiNjoJZTMgYTQgICAgICAgCWJuZSAwIFw8YWRkXD4KLQotMCswMGI4IDxiYz46Ci0gIGI4OgllNCBhMyAgICAgICAJYmMgMCBcPGFkZFw+Ci0KLTArMDBiYSA8Ym5jPjoKLSAgYmE6CWU1IGEyICAgICAgIAlibmMgMCBcPGFkZFw+Ci0KLTArMDBiYyA8Ym4+OgotICBiYzoJZTYgYTEgICAgICAgCWJuIDAgXDxhZGRcPgotCi0wKzAwYmUgPGJwPjoKLSAgYmU6CWU3IGEwICAgICAgIAlicCAwIFw8YWRkXD4KLQotMCswMGMwIDxidj46Ci0gIGMwOgllOCA5ZiAgICAgICAJYnYgMCBcPGFkZFw+Ci0KLTArMDBjMiA8Ym52PjoKLSAgYzI6CWU5IDllICAgICAgIAlibnYgMCBcPGFkZFw+Ci0KLTArMDBjNCA8Ymx0PjoKLSAgYzQ6CWVhIDlkICAgICAgIAlibHQgMCBcPGFkZFw+Ci0KLTArMDBjNiA8YmdlPjoKLSAgYzY6CWViIDljICAgICAgIAliZ2UgMCBcPGFkZFw+Ci0KLTArMDBjOCA8YmxlPjoKLSAgYzg6CWVjIDliICAgICAgIAlibGUgMCBcPGFkZFw+Ci0KLTArMDBjYSA8Ymd0PjoKLSAgY2E6CWVkIDlhICAgICAgIAliZ3QgMCBcPGFkZFw+Ci0KLTArMDBjYyA8YmxzPjoKLSAgY2M6CWVlIDk5ICAgICAgIAlibHMgMCBcPGFkZFw+Ci0KLTArMDBjZSA8YmhpPjoKLSAgY2U6CWVmIDk4ICAgICAgIAliaGkgMCBcPGFkZFw+Ci0KLTArMDBkMCA8am1wX2Q+OgotICBkMDoJOWYgMGIgICAgICAgCWptcDpkIEByMTEKLSAgZDI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGQ0IDxyZXRfZD46Ci0gIGQ0Ogk5ZiAyMCAgICAgICAJcmV0OmQKLSAgZDY6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGQ4IDxicmFfZD46Ci0gIGQ4OglmMCBmYiAgICAgICAJYnJhOmQgZDAgXDxqbXBfZFw+Ci0gIGRhOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBkYyA8Ym5vX2Q+OgotICBkYzoJZjEgZjkgICAgICAgCWJubzpkIGQwIFw8am1wX2RcPgotICBkZToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZTAgPGJlcV9kPjoKLSAgZTA6CWYyIGY3ICAgICAgIAliZXE6ZCBkMCBcPGptcF9kXD4KLSAgZTI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGU0IDxibmVfZD46Ci0gIGU0OglmMyBmNSAgICAgICAJYm5lOmQgZDAgXDxqbXBfZFw+Ci0gIGU2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBlOCA8YmNfZD46Ci0gIGU4OglmNCBmMyAgICAgICAJYmM6ZCBkMCBcPGptcF9kXD4KLSAgZWE6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGVjIDxibmNfZD46Ci0gIGVjOglmNSBmMSAgICAgICAJYm5jOmQgZDAgXDxqbXBfZFw+Ci0gIGVlOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBmMCA8Ym5fZD46Ci0gIGYwOglmNiBlZiAgICAgICAJYm46ZCBkMCBcPGptcF9kXD4KLSAgZjI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGY0IDxicF9kPjoKLSAgZjQ6CWY3IGVkICAgICAgIAlicDpkIGQwIFw8am1wX2RcPgotICBmNjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZjggPGJ2X2Q+OgotICBmODoJZjggZWIgICAgICAgCWJ2OmQgZDAgXDxqbXBfZFw+Ci0gIGZhOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBmYyA8Ym52X2Q+OgotICBmYzoJZjkgZTkgICAgICAgCWJudjpkIGQwIFw8am1wX2RcPgotICBmZToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMDAgPGJsdF9kPjoKLSAxMDA6CWZhIGU3ICAgICAgIAlibHQ6ZCBkMCBcPGptcF9kXD4KLSAxMDI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTA0IDxiZ2VfZD46Ci0gMTA0OglmYiBlNSAgICAgICAJYmdlOmQgZDAgXDxqbXBfZFw+Ci0gMTA2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDEwOCA8YmxlX2Q+OgotIDEwODoJZmMgZTMgICAgICAgCWJsZTpkIGQwIFw8am1wX2RcPgotIDEwYToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMGMgPGJndF9kPjoKLSAxMGM6CWZkIGUxICAgICAgIAliZ3Q6ZCBkMCBcPGptcF9kXD4KLSAxMGU6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTEwIDxibHNfZD46Ci0gMTEwOglmZSBkZiAgICAgICAJYmxzOmQgZDAgXDxqbXBfZFw+Ci0gMTEyOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDExNCA8YmhpX2Q+OgotIDExNDoJZmYgZGQgICAgICAgCWJoaTpkIGQwIFw8am1wX2RcPgotIDExNjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMTggPGxkcmVzPjoKLSAxMTg6CWJjIDgyICAgICAgIAlsZHJlcyBAcjJcKywweDgKLQotMCswMTFhIDxzdHJlcz46Ci0gMTFhOgliZCBmMyAgICAgICAJc3RyZXMgMHhmLEByM1wrCi0KLTArMDExYyA8bm9wPjoKLSAxMWM6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTFlIDxhbmRjY3I+OgotIDExZToJODMgZmYgICAgICAgCWFuZGNjciAweGZmCi0KLTArMDEyMCA8b3JjY3I+OgotIDEyMDoJOTMgN2QgICAgICAgCW9yY2NyIDB4N2QKLQotMCswMTIyIDxzdGlsbT46Ci0gMTIyOgk4NyA2MSAgICAgICAJc3RpbG0gMHg2MQotCi0wKzAxMjQgPGFkZHNwPjoKLSAxMjQ6CWEzIDgwICAgICAgIAlhZGRzcCAtNTEyCi0KLTArMDEyNiA8ZXh0c2I+OgotIDEyNjoJOTcgODkgICAgICAgCWV4dHNiIHI5Ci0KLTArMDEyOCA8ZXh0dWI+OgotIDEyODoJOTcgOWEgICAgICAgCWV4dHViIHIxMAotCi0wKzAxMmEgPGV4dHNoPjoKLSAxMmE6CTk3IGFiICAgICAgIAlleHRzaCByMTEKLQotMCswMTJjIDxleHR1aD46Ci0gMTJjOgk5NyBiYyAgICAgICAJZXh0dWggcjEyCi0KLTArMDEyZSA8ZW50ZXI+OgotIDEyZToJMGYgZmYgICAgICAgCWVudGVyIDB4M2ZjCi0KLTArMDEzMCA8bGVhdmU+OgotIDEzMDoJOWYgOTAgICAgICAgCWxlYXZlCi0KLTArMDEzMiA8eGNoYj46Ci0gMTMyOgk4YSBlZiAgICAgICAJeGNoYiBAcjE0LHIxNQotCi0wKzAxMzQgPGxkaV8zMj46Ci0gMTM0Ogk5ZiA4MCAxMiAzNCAJbGRpOjMyIDB4MTIzNDU2NzgscjAKLSAxMzg6CTU2IDc4IAotCi0wKzAxM2EgPGNvcG9wPjoKLSAxM2E6CTlmIGNmIDAxIDM0IAljb3BvcCAweGYsMHgxLGNyMyxjcjQKLSAxM2U6CTlmIGNmIDA0IDU2IAljb3BvcCAweGYsMHg0LGNyNSxjcjYKLSAxNDI6CTlmIGNmIGZmIDcwIAljb3BvcCAweGYsMHhmZixjcjcsY3IwCi0KLTArMDE0NiA8Y29wbGQ+OgotIDE0NjoJOWYgZDAgMDAgNDAgCWNvcGxkIDB4MCwweDAscjQsY3IwCi0KLTArMDE0YSA8Y29wc3Q+OgotIDE0YToJOWYgZTcgMDIgMTUgCWNvcHN0IDB4NywweDIsY3IxLHI1Ci0KLTArMDE0ZSA8Y29wc3Y+OgotIDE0ZToJOWYgZjggMDMgMjYgCWNvcHN2IDB4OCwweDMsY3IyLHI2Ci0KLTArMDE1MiA8bGRtMD46Ci0gMTUyOgk4YyA4ZCAgICAgICAJbGRtMCBcKHIwLHIyLHIzLHI3XCkKLQotMCswMTU0IDxsZG0xPjoKLSAxNTQ6CThkIDg5ICAgICAgIAlsZG0xIFwocjgscjExLHIxNVwpCi0KLTArMDE1NiA8c3RtMD46Ci0gMTU2Ogk4ZSAzMCAgICAgICAJc3RtMCBcKHIyLHIzXCkKLQotMCswMTU4IDxzdG0xPjoKLSAxNTg6CThmIDA2ICAgICAgIAlzdG0xIFwocjEzLHIxNFwpCi0KLTArMDE1YSA8Y2FsbD46Ci0gMTVhOglkNyA1MiAgICAgICAJY2FsbCAwIFw8YWRkXD4KLSAxNWM6CTk3IDFhICAgICAgIAljYWxsIEByMTAKLQotMCswMTVlIDxjYWxsX2Q+OgotIDE1ZToJZGYgNTAgICAgICAgCWNhbGw6ZCAwIFw8YWRkXD4KLSAxNjA6CTlmIGEwICAgICAgIAlub3AKLSAxNjI6CTlmIDFjICAgICAgIAljYWxsOmQgQHIxMgotIDE2NDoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxNjYgPGRtb3Y+OgotIDE2NjoJMDggMjIgICAgICAgCWRtb3YgQDB4ODgscjEzCi0gMTY4OgkxOCAxNSAgICAgICAJZG1vdiByMTMsQDB4NTQKLSAxNmE6CTBjIDExICAgICAgIAlkbW92IEAweDQ0LEByMTNcKwotIDE2YzoJMWMgMDAgICAgICAgCWRtb3YgQHIxM1wrLEAweDAKLSAxNmU6CTBiIDBiICAgICAgIAlkbW92IEAweDJjLEAtcjE1Ci0gMTcwOgkxYiAwOSAgICAgICAJZG1vdiBAcjE1XCssQDB4MjQKLQotMCswMTcyIDxkbW92aD46Ci0gMTcyOgkwOSA0NCAgICAgICAJZG1vdmggQDB4ODgscjEzCi0gMTc0OgkxOSAyOSAgICAgICAJZG1vdmggcjEzLEAweDUyCi0gMTc2OgkwZCAxYSAgICAgICAJZG1vdmggQDB4MzQsQHIxM1wrCi0gMTc4OgkxZCAyOSAgICAgICAJZG1vdmggQHIxM1wrLEAweDUyCi0KLTArMDE3YSA8ZG1vdmI+OgotIDE3YToJMGEgOTEgICAgICAgCWRtb3ZiIEAweDkxLHIxMwotIDE3YzoJMWEgNTMgICAgICAgCWRtb3ZiIHIxMyxAMHg1MwotIDE3ZToJMGUgNDcgICAgICAgCWRtb3ZiIEAweDQ3LEByMTNcKwotIDE4MDoJMWUgMDAgICAgICAgCWRtb3ZiIEByMTNcKyxAMHgwCi0KLTArMDE4MiA8bGRpXzIwPjoKLSAxODI6CTliIGYxIGZmIGZmIAlsZGk6MjAgMHhmZmZmZixyMQotCi0wKzAxODYgPGZpbmlzaD46Ci0gMTg2Ogk5ZiA4MCAwMCAwMCAJbGRpOjMyIDB4ODAwMCxyMAotIDE4YToJODAgMDAgCi0gMThjOgliMyAyMCAgICAgICAJbW92IHIwLHNzcAotIDE4ZToJOWYgODAgMDAgMDAgCWxkaTozMiAweDEscjAKLSAxOTI6CTAwIDAxIAotIDE5NDoJMWYgMGEgICAgICAgCWludCAweGEKLQotMCswMTk2IDxpbnRlPjoKLSAxOTY6CTlmIDMwICAgICAgIAlpbnRlCi0KLTArMDE5OCA8cmV0aT46Ci0gMTk4Ogk5NyAzMCAgICAgICAJcmV0aQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjY2ZlMTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBGUjMwIGFzc2VtYmxlciB0ZXN0c3VpdGUuCi0KLWlmIFtpc3RhcmdldCBmcjMwKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhbGxpbnNuIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzZDI0YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24ucworKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0gLmRhdGEKLWZvb2RhdGE6IC53b3JkIDQyCi0JIC50ZXh0Ci1mb290ZXh0OgotCS5nbG9iYWwgYWRkCi1hZGQ6Ci0JYWRkIHIwLCByMQotCWFkZCAjMCwgcjIKLQkuZ2xvYmFsIGFkZDIKLWFkZDI6Ci0JYWRkMiAjLTEsIHIzCi0JLmdsb2JhbCBhZGRjCi1hZGRjOgotCWFkZGMgcjQsIHI1Ci0JLmdsb2JhbCBhZGRuCi1hZGRuOgotCWFkZG4gcjYsIHI3Ci0JYWRkbiAjMTUsIHI4Ci0JLmdsb2JhbCBhZGRuMgotYWRkbjI6Ci0JYWRkbjIgIy0xNiwgcjkKLQkuZ2xvYmFsIHN1Ygotc3ViOgotCXN1YiByMTAsIHIxMQotCS5nbG9iYWwgc3ViYwotc3ViYzoKLQlzdWJjIHIxMiwgcjEzCi0JLmdsb2JhbCBzdWJuCi1zdWJuOgotCXN1Ym4gcjE0LCByMTUKLQkuZ2xvYmFsIGNtcAotY21wOgotCWNtcCBhYywgZnAKLQljbXAgIzEsIHNwCi0JLmdsb2JhbCBjbXAyCi1jbXAyOgotCWNtcDIgIy0xNSwgcjAKLQkuZ2xvYmFsIGFuZAotYW5kOgotCWFuZCByMSwgcjIKLQlhbmQgcjMsIEByNAotCS5nbG9iYWwgYW5kaAotYW5kaDoKLQlhbmRoIHI1LCBAcjYKLQkuZ2xvYmFsIGFuZGIKLWFuZGI6Ci0JYW5kYiByNywgQHI4Ci0JLmdsb2JhbCBvcgotb3I6Ci0Jb3IgcjksIHIxMAotCW9yIHIxMSwgQHIxMgotCS5nbG9iYWwgb3JoCi1vcmg6Ci0Jb3JoIHIxMywgQHIxNAotCS5nbG9iYWwgb3JiCi1vcmI6Ci0Jb3JiIHIxNSwgQGFjCi0JLmdsb2JhbCBlb3IKLWVvcjoKLQllb3IgZnAsIHNwCi0JZW9yIHIwLCBAcjEKLQkuZ2xvYmFsIGVvcmgKLWVvcmg6Ci0JZW9yaCByMiwgQHIzCi0JLmdsb2JhbCBlb3JiCi1lb3JiOgotCWVvcmIgcjQsIEByNQotCS5nbG9iYWwgYmFuZGwKLWJhbmRsOgotCWJhbmRsICMxNSwgQHI2Ci0JLmdsb2JhbCBiYW5kaAotbmFkaDoKLQliYW5kaCAjNywgQHI3Ci0JLmdsb2JhbCBib3JsCi1ib3JsOgotCWJvcmwgIzMsIEByOAotCS5nbG9iYWwgYm9yaAotYm9yaDoKLQlib3JoICMxMywgQHI5Ci0JLmdsb2JhbCBiZW9ybAotYmVvcmw6Ci0JYmVvcmwgIzE1LCBAcjEwCi0JLmdsb2JhbCBiZW9yaAotYmVvcmg6Ci0JYmVvcmggIzEsIEByMTEKLQkuZ2xvYmFsIGJ0c3RsCi1idHN0bDoKLQlidHN0bCAjMCwgQHIxMgotCS5nbG9iYWwgYnRzdGgKLWJ0c3RoOgotCWJ0c3RoICM4LCBAcjEzCi0JLmdsb2JhbCBtdWwKLW11bDoKLQltdWwgcjE0LCByMTUKLQkuZ2xvYmFsIG11bHUKLW11bHU6Ci0JbXVsdSBhYywgZnAKLQkuZ2xvYmFsIG11bHVoCi1tdWx1aDoJCi0JbXVsdWggc3AsIHIwCi0JLmdsb2JhbCBtdWxoCi1tdWxoOgkKLQltdWxoIHIxLCByMgotCS5nbG9iYWwgZGl2MHMKLWRpdjBzOgotCWRpdjBzIHIzCi0JLmdsb2JhbCBkaXYwdQotZGl2MHU6Ci0JZGl2MHUgcjQKLQkuZ2xvYmFsIGRpdjEKLWRpdjE6Ci0JZGl2MSByNQotCS5nbG9iYWwgZGl2MgotZGl2MjoKLQlkaXYyIHI2Ci0JLmdsb2JhbCBkaXYzCi1kaXYzOgotCWRpdjMKLQkuZ2xvYmFsIGRpdjRzCi1kaXY0czoKLQlkaXY0cwotCS5nbG9iYWwgbHNsCi1sc2w6Ci0JbHNsIHI3LCByOAotCWxzbCAjMywgcjkKLQkuZ2xvYmFsIGxzbDIKLWxzbDI6Ci0JbHNsMiAjMCwgcjEwCi0JLmdsb2JhbCBsc3IKLWxzcjoKLQlsc3IgcjExLCByMTIKLQlsc3IgIzE1LCByMTMKLQkuZ2xvYmFsIGxzcjIKLWxzcjI6Ci0JbHNyMiAjMTUsIHIxNAotCS5nbG9iYWwgYXNyCi1hc3I6Ci0JYXNyIHIxNSwgYWMKLQlhc3IgIzYsIGZwCi0JLmdsb2JhbCBhc3IyCi1hc3IyOgotCWFzcjIgIzcsIHNwCi0JLmdsb2JhbCBsZGlfOAotbGRpXzg6Ci0JbGRpOjggIzB4ZmYsIHIyCi0JLmdsb2JhbCBsZAotbGQ6Ci0JbGQgQHIzLCByNAotCWxkIEAoUjEzLCByNSksIHI2Ci0JbGQgQChSMTQsIDB4MWZjKSwgcjcKLQlsZCBAKFIxNSwgMHgzYyksIHI4Ci0JbGQgQHIxNSssIHI5Ci0JbGQgQHIxNSssIHBzCi0JbGQgQFIxNSssIHRicgotCWxkIEByMTUrLCBycAotCWxkIEBSMTUrLCBzc3AKLQkuZ2xvYmFsIGxkdWgKLWxkdWg6Ci0JbGR1aCBAcjEwLCByMTEKLQlsZHVoIEAocjEzLCByMTIpLCByMTMKLQlsZHVoIEAocjE0LCAjLTI1NiksIHIxNQotCS5nbG9iYWwgbGR1YgotbGR1YjoKLQlsZHViIEBhYywgZnAKLQlsZHViIEAocjEzLCBzcCksIHIwCi0JbGR1YiBAKHIxNCwgLTEyOCksIHIxCi0JLmdsb2JhbCBzdAotc3Q6Ci0Jc3QgcjIsIEByMwotCXN0IHI0LCBAKHIxMywgcjUpCi0Jc3QgcjYsIEAocjE0LCAtNTEyKQotCXN0IHI3LCBAKHIxNSwgMHgzYykKLQlzdCByOCwgQCAtIHIxNQotCXN0IE1ESCwgQC1yMTUKLQlzdCBQUywgQCAtIHIxNQotCS5nbG9iYWwgbHN0aAotc3RoOgotCXN0aCByOSwgQHIxMAotCXN0aCByMTEsIEAocjEzLCByMTIpCi0Jc3RoIHIxMywgQChyMTQsIDEyOCkKLQkuZ2xvYmFsIHN0Ygotc3RiOgotCVNUQiByMTQsIEByMTUKLQlzdGIgcjAsIEAocjEzLCByMSkKLQlTVEIgcjIsIEAocjE0LCAtMTI4KQotCS5nbG9iYWwgbW92Ci1tb3Y6Ci0JbW92IHIzLCByNAotCU1PViBtZGwsIHI1Ci0JbW92IHBzLCByNgotCW1vdiByNywgdXNwCi0JbW92IHI4LCBwcwotCS5nbG9iYWwgam1wCi1qbXA6Ci0Jam1wIEByOQotCS5nbG9iYWwgcmV0Ci1yZXQ6Ci0JcmV0Ci0JLmdsb2JhbCBicmEKLWJyYToKLQlicmEgZm9vdGV4dAotCS5nbG9iYWwgYm5vCi1ibm86Ci0JYm5vIGZvb3RleHQKLQkuZ2xvYmFsIGJlcQotYmVxOgotCWJlcSBmb290ZXh0Ci0JLmdsb2JhbCBibmUKLWJuZToKLQlibmUgZm9vdGV4dAotCS5nbG9iYWwgYmMKLWJjOgotCWJjIGZvb3RleHQKLQkuZ2xvYmFsIGJuYwotYm5jOgotCWJuYyBmb290ZXh0Ci0JLmdsb2JhbCBibgotYm46Ci0JYm4gZm9vdGV4dAotCS5nbG9iYWwgYnAKLWJwOgotCWJwIGZvb3RleHQKLQkuZ2xvYmFsIGJ2Ci1idjoKLQlidiBmb290ZXh0Ci0JLmdsb2JhbCBibnYKLWJudjoKLQlibnYgZm9vdGV4dAotCS5nbG9iYWwgYmx0Ci1ibHQ6Ci0JYmx0IGZvb3RleHQKLQkuZ2xvYmFsIGJnZQotYmdlOgotCWJnZSBmb290ZXh0Ci0JLmdsb2JhbCBibGUKLWJsZToKLQlibGUgZm9vdGV4dAotCS5nbG9iYWwgYmd0Ci1iZ3Q6Ci0JYmd0IGZvb3RleHQKLQkuZ2xvYmFsIGJscwotYmxzOgotCWJscyBmb290ZXh0Ci0JLmdsb2JhbCBiaGkKLWJoaToKLQliaGkgZm9vdGV4dAotZGVsYXlfZm9vdGV4dDoJCQotCS5nbG9iYWwgam1wX2QKLWptcF9kOgotCWptcDpkIEByMTEKLQlub3AKLQkuZ2xvYmFsIHJldF9kCi1yZXRfZDoKLQlyZXQ6ZAotCW5vcAotCS5nbG9iYWwgYnJhX2QKLWJyYV9kOgotCWJyYTpEIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJub19kCi1ibm9fZDoKLQlibm86ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBiZXFfZAotYmVxX2Q6Ci0JYmVxOkQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm5lX2QKLWJuZV9kOgotCWJuZTpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJjX2QKLWJjX2Q6Ci0JYmM6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibmNfZAotYm5jX2Q6Ci0JYm5jOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm5fZAotYm5fZDoKLQlibjpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJwX2QKLWJwX2Q6Ci0JYnA6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBidl9kCi1idl9kOgotCWJ2OmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm52X2QKLWJudl9kOgotCWJudjpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJsdF9kCi1ibHRfZDoKLQlibHQ6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBiZ2VfZAotYmdlX2Q6Ci0JYmdlOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmxlX2QKLWJsZV9kOgotCWJsZTpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJndF9kCi1iZ3RfZDoKLQliZ3Q6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibHNfZAotYmxzX2Q6Ci0JYmxzOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmhpX2QKLWJoaV9kOgotCWJoaTpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGxkcmVzCi1sZHJlczoKLQlsZHJlcyBAcjIrLCAjOAotCS5nbG9iYWwgc3RyZXMKLXN0cmVzOgotCXN0cmVzICMxNSwgQHIzKwotCS5nbG9iYWwgbm9wCi1ub3A6Ci0Jbm9wCi0JLmdsb2JhbCBhbmRjY3IKLWFuZGNjcjoKLQlhbmRjY3IgIzI1NQotCS5nbG9iYWwgb3JjY3IKLW9yY2NyOgotCW9yY2NyICMxMjUKLQkuZ2xvYmFsIHN0aWxtCi1zdGlsbToKLQlzdGlsbSAjOTcKLQkuZ2xvYmFsIGFkZHNwCi1hZGRzcDoKLQlhZGRzcCAjLTUxMgotCS5nbG9iYWwgZXh0c2IKLWV4dHNiOgotCWV4dHNiIHI5Ci0JLmdsb2JhbCBleHR1YgotZXh0dWI6Ci0JZXh0dWIgcjEwCi0JLmdsb2JhbCBleHRzaAotZXh0c2g6Ci0JZXh0c2ggcjExCi0JLmdsb2JhbCBleHR1aAotZXh0dWg6Ci0JZXh0dWggcjEyCi0JLmdsb2JhbCBlbnRlcgotZW50ZXI6Ci0JZW50ZXIgIzEwMjAKLQkuZ2xvYmFsIGxlYXZlCi1sZWF2ZToKLQlsZWF2ZSAKLQkuZ2xvYmFsIHhjaGIKLXhjaGI6Ci0JeGNoYiBAcjE0LCByMTUKLQkuZ2xvYmFsIGxkaV8zMgotbGRpXzMyOgotCWxkaTozMiAjMHgxMjM0NTY3OCwgcjAKLQkuZ2xvYmFsIGNvcG9wCi1jb3BvcDoKLQljb3BvcCAjMTUsICMxLCBjcjMsIGNyNAotCWNvcG9wICMxNSwgIzQsIGNyNSwgY3I2Ci0JY29wb3AgIzE1LCAjMjU1LCBjcjcsIGNyMAotCS5nbG9iYWwgY29wbGQKLWNvcGxkOgotCWNvcGxkICMwLCAjMCwgcjQsIGNyMAotCS5nbG9iYWwgY29wc3QKLWNvcHN0OgotCWNvcHN0ICM3LCAjMiwgY3IxLCByNQotCS5nbG9iYWwgY29wc3YKLWNvcHN2OgotCWNvcHN2ICM4LCAjMywgY3IyLCByNgotCS5nbG9iYWwgbGRtMAotbGRtMDoKLQlsZG0wIChyMCwgcjIsIHIzLCByNykKLQkuZ2xvYmFsIGxkbTEKLWxkbTE6Ci0JbGRtMSAocjgsIHIxMSwgcjE1KQotCS5nbG9iYWwgc3RtMAotc3RtMDoKLQlzdG0wIChyMiwgcjMpCi0JLmdsb2JhbCBzdG0xCi1zdG0xOgotCXN0bTEgKHIxMywgcjE0KQotCS5nbG9iYWwgY2FsbAotY2FsbDoKLQljYWxsIGZvb3RleHQKLQljYWxsIEByMTAKLQkuZ2xvYmFsIGNhbGxfZAotY2FsbF9kOgotCWNhbGw6RCBmb290ZXh0Ci0Jbm9wCi0JY2FsbDpkIEByMTIKLQlub3AKLQkuZ2xvYmFsIGRtb3YKLWRtb3Y6Ci0JZG1vdiBAMHg4OCwgcjEzCi0JZG1vdiByMTMsIEAweDU0Ci0JZG1vdiBAMHg0NCwgQHIxMysKLQlkbW92IEBSMTMrLCBAMHgyCi0JZG1vdiBAMHgyYywgQC1yMTUKLQlkbW92IEByMTUrLCBAMzgKLQkuZ2xvYmFsIGRtb3ZoCi1kbW92aDoKLQlkbW92aCBAMHg4OCwgcjEzCi0JZG1vdmggcjEzLCBAMHg1MgotCWRtb3ZoIEAweDM0LCBAcjEzICsKLQlkbW92aCBAcjEzKywgQDB4NTIKLQkuZ2xvYmFsIGRtb3ZiCi1kbW92YjoKLQlkbW92YiBAMHg5MSwgcjEzCi0JZG1vdmIgcjEzLCBAMHg1MwotCWRtb3ZiIEA3MSwgQHIxMysKLQlkbW92YiBAcjEzKywgQDB4MAotCS5nbG9iYWwgbGRpXzIwCi1sZGlfMjA6Ci0gCWxkaToyMCAjMHgwMDBmZmZmZiwgcjEKLWZpbmlzaDoJCi0gICAgICAgIGxkaTozMiAjMHg4MDAwLHIwCi0JbW92ICAgIHIwLHNzcAotICAgICAgICBsZGk6MzIgIzEscjAKLQlpbnQgICAgIzEwCi0JLmdsb2JhbCBpbnRlCi1pbnRlOgotCWludGUKLQkuZ2xvYmFsIHJldGkKLXJldGk6Ci0JcmV0aQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9mcjMwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvZnIzMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Mjg2YjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9mcjMwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBGUjMwIHRlc3RjYXNlcwotCi1pZiBbaXN0YXJnZXQgZnIzMCotKi0qXSB7Ci0jICAgIHJ1bl9kdW1wX3Rlc3QgImhpZ2gtMSIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMmIwZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLnRleHQKLWg4MzAwX2FkZF9zdWI6Ci0JYWRkLmIgIzE2LHIxbAotCWFkZC5iIHIxaCxyMWwKLQlhZGQudyByMSxyMgotCWFkZHMgIzEscjQKLQlhZGRzICMyLHI1Ci0JYWRkeCByMGwscjFsCi0JYWRkeCAjMTYscjJoCi0Jc3ViLmIgcjBsLHIxbAotCXN1Yi53IHIwLHIxCi0Jc3VicyAjMSxyNAotCXN1YnMgIzIscjUKLQlzdWJ4IHIwbCxyMWwKLQlzdWJ4ICMxNixyMmgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjg4NWQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YmgucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9hZGRfc3ViOgotCWFkZC5iICMxNixyMWwKLQlhZGQuYiByMWgscjFsCi0JYWRkLncgIzMyLHIxCi0JYWRkLncgcjEscjIKLQlhZGQubCAjNjQsZXIxCi0JYWRkLmwgZXIxLGVyMgotCWFkZHMgIzEsZXI0Ci0JYWRkcyAjMixlcjUKLQlhZGRzICM0LGVyNgotCWFkZHggcjBsLHIxbAotCWFkZHggIzE2LHIyaAotCXN1Yi5iIHIwbCxyMWwKLQlzdWIudyAjMTYscjEKLQlzdWIudyByMCxyMQotCXN1Yi5sICM2NCxlcjEKLQlzdWIubCBlcjEsZXIyCi0Jc3VicyAjMSxlcjQKLQlzdWJzICMyLGVyNQotCXN1YnMgIzQsZXI2Ci0Jc3VieCByMGwscjFsCi0Jc3VieCAjMTYscjJoCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiMzY5OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYWRkX3N1YjoKLQlhZGQuYiAjMTYscjFsCi0JYWRkLmIgcjFoLHIxbAotCWFkZC53ICMzMixyMQotCWFkZC53IHIxLHIyCi0JYWRkLmwgIzY0LGVyMQotCWFkZC5sIGVyMSxlcjIKLQlhZGRzICMxLGVyNAotCWFkZHMgIzIsZXI1Ci0JYWRkcyAjNCxlcjYKLQlhZGR4IHIwbCxyMWwKLQlhZGR4ICMxNixyMmgKLQlzdWIuYiByMGwscjFsCi0Jc3ViLncgIzE2LHIxCi0Jc3ViLncgcjAscjEKLQlzdWIubCAjNjQsZXIxCi0Jc3ViLmwgZXIxLGVyMgotCXN1YnMgIzEsZXI0Ci0Jc3VicyAjMixlcjUKLQlzdWJzICM0LGVyNgotCXN1YnggcjBsLHIxbAotCXN1YnggIzE2LHIyaAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTA3YTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9iaXRfb3BzXzE6Ci0JYmFuZCAjMCxyMGwKLQliYW5kICMwLEByMAotCWJhbmQgIzAsQDY0OjgKLQliY2xyICMwLHIwbAotCWJjbHIgIzAsQHIwCi0JYmNsciAjMCxANjQ6OAotCWJjbHIgcjFsLHIwbAotCWJjbHIgcjFsLEByMAotCWJjbHIgcjFsLEA2NDo4Ci0JYmlhbmQgIzAscjBsCi0JYmlhbmQgIzAsQHIwCi0JYmlhbmQgIzAsQDY0OjgKLQliaWxkICMwLHIwbAotCWJpbGQgIzAsQHIwCi0JYmlsZCAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMWgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzOWE1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2JpdF9vcHNfMToKLQliYW5kICMwLHIwbAotCWJhbmQgIzAsQGVyMAotCWJhbmQgIzAsQDY0OjgKLQliY2xyICMwLHIwbAotCWJjbHIgIzAsQGVyMAotCWJjbHIgIzAsQDY0OjgKLQliY2xyIHIxbCxyMGwKLQliY2xyIHIxbCxAZXIwCi0JYmNsciByMWwsQDY0OjgKLQliaWFuZCAjMCxyMGwKLQliaWFuZCAjMCxAZXIwCi0JYmlhbmQgIzAsQDY0OjgKLQliaWxkICMwLHIwbAotCWJpbGQgIzAsQGVyMAotCWJpbGQgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NTk5ZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMXMucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19iaXRfb3BzXzE6Ci0JYmFuZCAjMCxyMGwKLQliYW5kICMwLEBlcjAKLQliYW5kICMwLEA2NDo4Ci0JYmFuZCAjMCxAMTI4OjE2Ci0JYmFuZCAjMCxANjU1MzY6MzIKLQliY2xyICMwLHIwbAotCWJjbHIgIzAsQGVyMAotCWJjbHIgIzAsQDY0OjgKLQliY2xyICMwLEAxMjg6MTYKLQliY2xyICMwLEA2NTUzNjozMgotCWJjbHIgcjFsLHIwbAotCWJjbHIgcjFsLEBlcjAKLQliY2xyIHIxbCxANjQ6OAotCWJjbHIgcjFsLEAxMjg6MTYKLQliY2xyIHIxbCxANjU1MzY6MzIKLQliaWFuZCAjMCxyMGwKLQliaWFuZCAjMCxAZXIwCi0JYmlhbmQgIzAsQDY0OjgKLQliaWFuZCAjMCxAMTI4OjE2Ci0JYmlhbmQgIzAsQDY1NTM2OjMyCi0JYmlsZCAjMCxyMGwKLQliaWxkICMwLEBlcjAKLQliaWxkICMwLEA2NDo4Ci0JYmlsZCAjMCxAMTI4OjE2Ci0JYmlsZCAjMCxANjU1MzY6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTk2ZTVhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczIucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYml0X29wc18yOgotCWJpb3IgIzAscjBsCi0JYmlvciAjMCxAcjAKLQliaW9yICMwLEA2NDo4Ci0JYmlzdCAjMCxyMGwKLQliaXN0ICMwLEByMAotCWJpc3QgIzAsQDY0OjgKLQliaXhvciAjMCxyMGwKLQliaXhvciAjMCxAcjAKLQliaXhvciAjMCxANjQ6OAotCWJsZCAjMCxyMGwKLQlibGQgIzAsQHIwCi0JYmxkICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmJlNzRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYml0X29wc18yOgotCWJpb3IgIzAscjBsCi0JYmlvciAjMCxAZXIwCi0JYmlvciAjMCxANjQ6OAotCWJpc3QgIzAscjBsCi0JYmlzdCAjMCxAZXIwCi0JYmlzdCAjMCxANjQ6OAotCWJpeG9yICMwLHIwbAotCWJpeG9yICMwLEBlcjAKLQliaXhvciAjMCxANjQ6OAotCWJsZCAjMCxyMGwKLQlibGQgIzAsQGVyMAotCWJsZCAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMycy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3MDUyMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMycy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JpdF9vcHNfMjoKLQliaW9yICMwLHIwbAotCWJpb3IgIzAsQGVyMAotCWJpb3IgIzAsQDY0OjgKLQliaW9yICMwLEAxMjg6MTYKLQliaW9yICMwLEA2NTUzNjozMgotCWJpc3QgIzAscjBsCi0JYmlzdCAjMCxAZXIwCi0JYmlzdCAjMCxANjQ6OAotCWJpc3QgIzAsQDEyODoxNgotCWJpc3QgIzAsQDY1NTM2OjMyCi0JYml4b3IgIzAscjBsCi0JYml4b3IgIzAsQGVyMAotCWJpeG9yICMwLEA2NDo4Ci0JYml4b3IgIzAsQDEyODoxNgotCWJpeG9yICMwLEA2NTUzNjozMgotCWJsZCAjMCxyMGwKLQlibGQgIzAsQGVyMAotCWJsZCAjMCxANjQ6OAotCWJsZCAjMCxAMTI4OjE2Ci0JYmxkICMwLEA2NTUzNjozMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM5YmZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczMucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYml0X29wc18zOgotCWJub3QgIzAscjBsCi0JYm5vdCAjMCxAcjAKLQlibm90ICMwLEA2NDo4Ci0JYm5vdCByMWwscjBsCi0JYm5vdCByMWwsQHIwCi0JYm5vdCByMWwsQDY0OjgKLQlic2V0ICMwLHIwbAotCWJzZXQgIzAsQHIwCi0JYnNldCAjMCxANjQ6OAotCWJzZXQgcjFsLHIwbAotCWJzZXQgcjFsLEByMAotCWJzZXQgcjFsLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGVkYTYwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYml0X29wc18zOgotCWJub3QgIzAscjBsCi0JYm5vdCAjMCxAZXIwCi0JYm5vdCAjMCxANjQ6OAotCWJub3QgcjFsLHIwbAotCWJub3QgcjFsLEBlcjAKLQlibm90IHIxbCxANjQ6OAotCWJzZXQgIzAscjBsCi0JYnNldCAjMCxAZXIwCi0JYnNldCAjMCxANjQ6OAotCWJzZXQgcjFsLHIwbAotCWJzZXQgcjFsLEBlcjAKLQlic2V0IHIxbCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2NGUwNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JpdF9vcHNfMzoKLQlibm90ICMwLHIwbAotCWJub3QgIzAsQGVyMAotCWJub3QgIzAsQDY0OjgKLQlibm90ICMwLEAxMjg6MTYKLQlibm90ICMwLEA2NTUzNjozMgotCWJub3QgcjFsLHIwbAotCWJub3QgcjFsLEBlcjAKLQlibm90IHIxbCxANjQ6OAotCWJub3QgcjFsLEAxMjg6MTYKLQlibm90IHIxbCxANjU1MzY6MzIKLQlic2V0ICMwLHIwbAotCWJzZXQgIzAsQGVyMAotCWJzZXQgIzAsQDY0OjgKLQlic2V0ICMwLEAxMjg6MTYKLQlic2V0ICMwLEA2NTUzNjozMgotCWJzZXQgcjFsLHIwbAotCWJzZXQgcjFsLEBlcjAKLQlic2V0IHIxbCxANjQ6OAotCWJzZXQgcjFsLEAxMjg6MTYKLQlic2V0IHIxbCxANjU1MzY6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U2NmQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczQucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYml0X29wc180OgotCWJvciAjMCxyMGwKLQlib3IgIzAsQHIwCi0JYm9yICMwLEA2NDo4Ci0JYnN0ICMwLHIwbAotCWJzdCAjMCxAcjAKLQlic3QgIzAsQDY0OjgKLQlidHN0ICMwLHIwbAotCWJ0c3QgIzAsQHIwCi0JYnRzdCAjMCxANjQ6OAotCWJ0c3QgcjFsLHIwbAotCWJ0c3QgcjFsLEByMAotCWJ0c3QgcjFsLEA2NDo4Ci0JYnhvciAjMCxyMGwKLQlieG9yICMwLEByMAotCWJ4b3IgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzVlMTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNGgucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9iaXRfb3BzXzQ6Ci0JYm9yICMwLHIwbAotCWJvciAjMCxAZXIwCi0JYm9yICMwLEA2NDo4Ci0JYnN0ICMwLHIwbAotCWJzdCAjMCxAZXIwCi0JYnN0ICMwLEA2NDo4Ci0JYnRzdCAjMCxyMGwKLQlidHN0ICMwLEBlcjAKLQlidHN0ICMwLEA2NDo4Ci0JYnRzdCByMWwscjBsCi0JYnRzdCByMWwsQGVyMAotCWJ0c3QgcjFsLEA2NDo4Ci0JYnhvciAjMCxyMGwKLQlieG9yICMwLEBlcjAKLQlieG9yICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0cy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY0N2I2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYml0X29wc180OgotCWJvciAjMCxyMGwKLQlib3IgIzAsQGVyMAotCWJvciAjMCxANjQ6OAotCWJvciAjMCxAMTI4OjE2Ci0JYm9yICMwLEA2NTUzNjozMgotCWJzdCAjMCxyMGwKLQlic3QgIzAsQGVyMAotCWJzdCAjMCxANjQ6OAotCWJzdCAjMCxAMTI4OjE2Ci0JYnN0ICMwLEA2NTUzNjozMgotCWJ0c3QgIzAscjBsCi0JYnRzdCAjMCxAZXIwCi0JYnRzdCAjMCxANjQ6OAotCWJ0c3QgIzAsQDEyODoxNgotCWJ0c3QgIzAsQDY1NTM2OjMyCi0JYnRzdCByMWwscjBsCi0JYnRzdCByMWwsQGVyMAotCWJ0c3QgcjFsLEA2NDo4Ci0JYnRzdCByMWwsQDEyODoxNgotCWJ0c3QgcjFsLEA2NTUzNjozMgotCWJ4b3IgIzAscjBsCi0JYnhvciAjMCxAZXIwCi0JYnhvciAjMCxANjQ6OAotCWJ4b3IgIzAsQDEyODoxNgotCWJ4b3IgIzAsQDY1NTM2OjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODA2MTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLWg4MzAwX2JyYW5jaGVzOgotCWJzciBoODMwMF9icmFuY2hlcwotCWptcCBoODMwMF9icmFuY2hlcwotCWptcCBAcjAKLQlqbXAgQEAxNjo4Ci0JanNyIGg4MzAwX2JyYW5jaGVzCi0JanNyIEByMAotCWpzciBAQDE2OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JjNjJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaGgucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9icmFuY2hlczoKLQlic3IgaDgzMDBoX2JyYW5jaGVzOjgKLQlic3IgaDgzMDBoX2JyYW5jaGVzOjE2Ci0Jam1wIGg4MzAwaF9icmFuY2hlcwotCWptcCBAZXIwCi0Jam1wIEBAMTY6OAotCWpzciBoODMwMGhfYnJhbmNoZXMKLQlqc3IgQGVyMAotCWpzciBAQDE2OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNocy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNocy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjMzZTE3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaHMucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19icmFuY2hlczoKLQlic3IgaDgzMDBzX2JyYW5jaGVzOjgKLQlic3IgaDgzMDBzX2JyYW5jaGVzOjE2Ci0Jam1wIGg4MzAwc19icmFuY2hlcwotCWptcCBAZXIwCi0Jam1wIEBAMTY6OAotCWpzciBoODMwMHNfYnJhbmNoZXMKLQlqc3IgQGVyMAotCWpzciBAQDE2OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNkNTNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2gucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkudGV4dAotaDgzMDBfY2JyYW5jaDoKLQlicmEgaDgzMDBfY2JyYW5jaAotCWJ0IGg4MzAwX2NicmFuY2gKLQlicm4gaDgzMDBfY2JyYW5jaAotCWJmIGg4MzAwX2NicmFuY2gKLQliaGkgaDgzMDBfY2JyYW5jaAotCWJscyBoODMwMF9jYnJhbmNoCi0JYmNjIGg4MzAwX2NicmFuY2gKLQliaHMgaDgzMDBfY2JyYW5jaAotCWJjcyBoODMwMF9jYnJhbmNoCi0JYmxvIGg4MzAwX2NicmFuY2gKLQlibmUgaDgzMDBfY2JyYW5jaAotCWJlcSBoODMwMF9jYnJhbmNoCi0JYnZjIGg4MzAwX2NicmFuY2gKLQlidnMgaDgzMDBfY2JyYW5jaAotCWJwbCBoODMwMF9jYnJhbmNoCi0JYm1pIGg4MzAwX2NicmFuY2gKLQliZ2UgaDgzMDBfY2JyYW5jaAotCWJsdCBoODMwMF9jYnJhbmNoCi0JYmd0IGg4MzAwX2NicmFuY2gKLQlibGUgaDgzMDBfY2JyYW5jaAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0ZTFhMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCS50ZXh0Ci0JLmg4MzAwaAotaDgzMDBoX2NicmFuY2g6Ci0JYnJhIGg4MzAwaF9jYnJhbmNoOjgKLQlidCBoODMwMGhfY2JyYW5jaDo4Ci0JYnJuIGg4MzAwaF9jYnJhbmNoOjgKLQliZiBoODMwMGhfY2JyYW5jaDo4Ci0JYmhpIGg4MzAwaF9jYnJhbmNoOjgKLQlibHMgaDgzMDBoX2NicmFuY2g6OAotCWJjYyBoODMwMGhfY2JyYW5jaDo4Ci0JYmhzIGg4MzAwaF9jYnJhbmNoOjgKLQliY3MgaDgzMDBoX2NicmFuY2g6OAotCWJsbyBoODMwMGhfY2JyYW5jaDo4Ci0JYm5lIGg4MzAwaF9jYnJhbmNoOjgKLQliZXEgaDgzMDBoX2NicmFuY2g6OAotCWJ2YyBoODMwMGhfY2JyYW5jaDo4Ci0JYnZzIGg4MzAwaF9jYnJhbmNoOjgKLQlicGwgaDgzMDBoX2NicmFuY2g6OAotCWJtaSBoODMwMGhfY2JyYW5jaDo4Ci0JYmdlIGg4MzAwaF9jYnJhbmNoOjgKLQlibHQgaDgzMDBoX2NicmFuY2g6OAotCWJndCBoODMwMGhfY2JyYW5jaDo4Ci0JYmxlIGg4MzAwaF9jYnJhbmNoOjgKLQlicmEgaDgzMDBoX2NicmFuY2g6MTYKLQlidCBoODMwMGhfY2JyYW5jaDoxNgotCWJybiBoODMwMGhfY2JyYW5jaDoxNgotCWJmIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmhpIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmxzIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmNjIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmhzIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmNzIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmxvIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYm5lIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmVxIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnZjIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnZzIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnBsIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYm1pIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmdlIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmx0IGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmd0IGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmxlIGg4MzAwaF9jYnJhbmNoOjE2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNocy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIyMmVhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0JLnRleHQKLQkuaDgzMDBzCi1oODMwMHNfY2JyYW5jaDoKLQlicmEgaDgzMDBzX2NicmFuY2g6OAotCWJ0IGg4MzAwc19jYnJhbmNoOjgKLQlicm4gaDgzMDBzX2NicmFuY2g6OAotCWJmIGg4MzAwc19jYnJhbmNoOjgKLQliaGkgaDgzMDBzX2NicmFuY2g6OAotCWJscyBoODMwMHNfY2JyYW5jaDo4Ci0JYmNjIGg4MzAwc19jYnJhbmNoOjgKLQliaHMgaDgzMDBzX2NicmFuY2g6OAotCWJjcyBoODMwMHNfY2JyYW5jaDo4Ci0JYmxvIGg4MzAwc19jYnJhbmNoOjgKLQlibmUgaDgzMDBzX2NicmFuY2g6OAotCWJlcSBoODMwMHNfY2JyYW5jaDo4Ci0JYnZjIGg4MzAwc19jYnJhbmNoOjgKLQlidnMgaDgzMDBzX2NicmFuY2g6OAotCWJwbCBoODMwMHNfY2JyYW5jaDo4Ci0JYm1pIGg4MzAwc19jYnJhbmNoOjgKLQliZ2UgaDgzMDBzX2NicmFuY2g6OAotCWJsdCBoODMwMHNfY2JyYW5jaDo4Ci0JYmd0IGg4MzAwc19jYnJhbmNoOjgKLQlibGUgaDgzMDBzX2NicmFuY2g6OAotCWJyYSBoODMwMHNfY2JyYW5jaDoxNgotCWJ0IGg4MzAwc19jYnJhbmNoOjE2Ci0JYnJuIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmYgaDgzMDBzX2NicmFuY2g6MTYKLQliaGkgaDgzMDBzX2NicmFuY2g6MTYKLQlibHMgaDgzMDBzX2NicmFuY2g6MTYKLQliY2MgaDgzMDBzX2NicmFuY2g6MTYKLQliaHMgaDgzMDBzX2NicmFuY2g6MTYKLQliY3MgaDgzMDBzX2NicmFuY2g6MTYKLQlibG8gaDgzMDBzX2NicmFuY2g6MTYKLQlibmUgaDgzMDBzX2NicmFuY2g6MTYKLQliZXEgaDgzMDBzX2NicmFuY2g6MTYKLQlidmMgaDgzMDBzX2NicmFuY2g6MTYKLQlidnMgaDgzMDBzX2NicmFuY2g6MTYKLQlicGwgaDgzMDBzX2NicmFuY2g6MTYKLQlibWkgaDgzMDBzX2NicmFuY2g6MTYKLQliZ2UgaDgzMDBzX2NicmFuY2g6MTYKLQlibHQgaDgzMDBzX2NicmFuY2g6MTYKLQliZ3QgaDgzMDBzX2NicmFuY2g6MTYKLQlibGUgaDgzMDBzX2NicmFuY2g6MTYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY21wc2kyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jbXBzaTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZjAzYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jbXBzaTIucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgMSAibGliZ2NjMS5TIgotOzsgbGliZ2NjMSByb3V0aW5lcyBmb3IgdGhlIEhpdGFjaGkgaDgvMzAwIGNwdS4KLTs7IENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluLgotOzsgc2FjQGN5Z251cy5jb20KLQkuc2VjdGlvbiAudGV4dAotCS5hbGlnbiAyCi0JLmdsb2JhbCBfX19jbXBzaTIKLV9fX2NtcHNpMjoKLQljbXAudwlyMiAscjAgCi0JYm5lCS5MMgotCWNtcC53CXIzICxyMSAKLQlibmUJLkwyCi0JbW92LncJIzEscjAgCi0JcnRzCi0uTDI6Ci0JY21wLncJcjAgLHIyIAotCWJndAkuTDQKLQlibmUJLkwzCi0JY21wLncJcjEgLHIzIAotCWJscwkuTDMKLS5MNDoKLQlzdWIudwlyMCAscjAgCi0JcnRzCi0uTDM6Ci0JbW92LncJIzIscjAgCi0uTDU6Ci0JcnRzCi0JLmVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMxYTQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmUucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9jbXA6Ci0JY21wLmIgIzAscjBsCi0JY21wLmIgcjBoLHIwbAotCWNtcC53IHIwLHIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODFlODhlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfY21wOgotCWNtcC5iICMwLHIwbAotCWNtcC5iIHIwaCxyMGwKLQljbXAudyAjMzIscjAKLQljbXAudyByMCxyMQotCWNtcC5sICM2NCxlcjAKLQljbXAubCBlcjAsZXIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNmM2ZlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfY21wOgotCWNtcC5iICMwLHIwbAotCWNtcC5iIHIwaCxyMGwKLQljbXAudyAjMzIscjAKLQljbXAudyByMCxyMQotCWNtcC5sICM2NCxlcjAKLQljbXAubCBlcjAsZXIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0YzBhMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfZGVjaW1hbDoKLQlkYWEgcjBsCi0JZGFzIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5MjQwNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfZGVjaW1hbDoKLQlkYWEgcjBsCi0JZGFzIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4MDJmYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFscy5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfZGVjaW1hbDoKLQlkYWEgcjBsCi0JZGFzIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzM3MmNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX2Rpdl9tdWw6Ci0JZGl2eHUgcjBsLHIxCi0JbXVseHUgcjBsLHIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2MGY4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfZGl2X211bDoKLQlkaXZ4dS5iIHIwbCxyMQotCWRpdnh1LncgcjAsZXIxCi0JZGl2eHMuYiByMGwscjEKLQlkaXZ4cy53IHIwLGVyMQotCW11bHh1LmIgcjBsLHIxCi0JbXVseHUudyByMCxlcjEKLQltdWx4cy5iIHIwbCxyMQotCW11bHhzLncgcjAsZXIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2MGY4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfZGl2X211bDoKLQlkaXZ4dS5iIHIwbCxyMQotCWRpdnh1LncgcjAsZXIxCi0JZGl2eHMuYiByMGwscjEKLQlkaXZ4cy53IHIwLGVyMQotCW11bHh1LmIgcjBsLHIxCi0JbXVseHUudyByMCxlcjEKLQltdWx4cy5iIHIwbCxyMQotCW11bHhzLncgcjAsZXIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNGM4My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9leHRlbmQ6Ci0JZXh0cy53IHIwCi0JZXh0cy5sIGVyMAotCWV4dHUudyByMAotCWV4dHUubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjZlOWJhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZHMucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2V4dGVuZDoKLQlleHRzLncgcjAKLQlleHRzLmwgZXIwCi0JZXh0dS53IHIwCi0JZXh0dS5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0NTVkNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI29iamR1bXA6IC0tcHJlZml4LWFkZHJlc3NlcyAtZHIKLSNuYW1lOiBGRnh4MQotCi0jIFRlc3QgZm9yIEZGeHg6OCBhZGRyZXNzaW5nLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qaDgzMDAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCS4uLgotCQkJMDogMTYJbWFpbgotMCswNDAwIDxtYWluPiBmOCA3ZiAgICAgICAgICAgICBtb3YuYgkjMHg3ZixyMGwKLTArMDQwMiA8bWFpblsrXSgweHwpMj4gMjggYmIgICAgICAgICAgICAgbW92LmIJQDB4YmI6OCxyMGwKLTArMDQwNCA8bWFpblsrXSgweHwpND4gNmEgODggZmYgYjkgICAgICAgbW92LmIJcjBsLEAweGZmYjk6MTYKLTArMDQwOCA8bWFpblsrXSgweHwpOD4gZjggMDEgICAgICAgICAgICAgbW92LmIJIzB4MSxyMGwKLTArMDQwYSA8bG9vcD4gNmEgODggZmYgYmIgICAgICAgbW92LmIJcjBsLEAweGZmYmI6MTYKLTArMDQwZSA8ZGVsYXk+IDc5IDAxIDAwIDAwICAgICAgIG1vdi53CSMweDAscjEKLTArMDQxMiA8ZGVsb29wPiAwYiAwMSAgICAgICAgICAgICBhZGRzCSMweDEsZXIxCi0wKzA0MTQgPGRlbG9vcFsrXSgweHwpMj4gNDYgMDAgICAgICAgICAgICAgYm5lCS4wIFwoNDE2XCkKLQkJCTQxNTogRElTUDgJZGVsb29wWytdMHhmZmZmZmZmZgotMCswNDE2IDxkZWxvb3BbK10oMHh8KTQ+IDEyIDg4ICAgICAgICAgICAgIHJvdGwJcjBsCi0wKzA0MTggPGRlbG9vcFsrXSgweHwpNj4gNDAgMDAgICAgICAgICAgICAgYnJhCS4wIFwoNDFhXCkKLQkJCTQxOTogRElTUDgJbG9vcFsrXTB4ZmZmZmZmZmYKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ZjODQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLmVxdSAgICBwNmRkciwgIDB4ZmZiOSAgICAgICAgICA7MHg3ZiBmb3Igb3V0cHV0IAotCS5lcXUgICAgcDZkciwgICAgMHhmZmJiCi0JLmVxdSAgICBzZWVkLCAgICAweDAxCi0JLnRleHQKLQkub3JnICAgIDAKLXJlc2V0OiAgLndvcmQgICBtYWluICAgICAgICAgICAgO3Jlc2V0IHZlY3RvciAKLTsKLQkub3JnICAgIDB4NDAwCi1tYWluOiAgIG1vdi5iICAgIzB4N2YscjBsICAgICAgIDtwb3J0IDYgZGRyID0gN0YgCi0JbW92LmIgICBAMHhmZmJiOjgscjBsICAgOyoqKnRlc3QqKioKLQltb3YuYiAgIHIwbCxAcDZkZHI6MTYKLTsKLQltb3YuYiAgICNzZWVkLHIwbCAgICAgICA7c3RhcnQgd2l0aCAwMDAwMDAxCi1sb29wOiAgIG1vdi5iICAgcjBsLEBwNmRyOjE2ICAgIDtvdXRwdXQgdG8gcG9ydCA2IAotZGVsYXk6ICBtb3YudyAgICMweDAwMDAscjEKLWRlbG9vcDogYWRkcy53ICAjMSxyMQotCWJuZSAgICAgZGVsb29wOjggICAgICAgIDtub3QgPSAwCi0Jcm90bCAgICByMGwKLSAgICAgICAgYnJhICAgICBsb29wOjgKLQkud29yZAkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9oODMwMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9oODMwMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiN2Q0MWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaDgzMDAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4MyArMCwwIEBACi0jCi0jIFNvbWUgSDgvMzAwIHRlc3RzCi0jCi1wcm9jIGRvX2g4MzAwX2FkZF9zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkc3ViLnM6IGg4MzAwIGFkZC9zdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGRzdWIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDg5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwODE5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDkxMlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDBCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDkyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxODg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMTkwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDFCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMUU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IEIyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogaDgzMDAgbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEU5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxNjkxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IEM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxNDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIEQ4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxNTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDE3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxNzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfY2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjYnJhbmNoLnM6IGg4MzAwIGNvbmRpdGlvbmFsIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNicmFuY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA0MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNDMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA0NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDQ4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA0OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNEEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDRCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA0QzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNEQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDRFMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA0RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfYml0b3BzMSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMxLnM6IGg4MzAwIGJpdG9wcyB0ZXN0cyAjMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczEucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc2MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2Mjk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0QwMDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RjQwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc2ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNzc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDdDMDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgN0U0MDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9iaXRvcHMyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczIuczogaDgzMDAgYml0b3BzIHRlc3RzICMyIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDc1ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9iaXRvcHMzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczMuczogaDgzMDAgYml0b3BzIHRlc3RzICMzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdEMDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0Y0MDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2MTk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDcwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjA5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdEMDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0Y0MDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9iaXRvcHM0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczQuczogaDgzMDAgYml0b3BzIHRlc3RzICM0IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzNC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDczMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3NTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogaDgzMDAgYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUEwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNUIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDVFMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDVGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2NvbXBhcmUge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZS5zOiBoODMwMCBjb21wYXJlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29tcGFyZS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9kZWNpbWFsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRlY2ltYWwuczogaDgzMDAgZGVjaW1hbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRlY2ltYWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfaW5jZGVjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImluY2RlYy5zOiBoODMwMCBpbmNkZWMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbmNkZWMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfZGl2bXVsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRpdm11bC5zOiBoODMwMCBkaXZtdWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkaXZtdWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfbWlzYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtaXNjLnM6IGg4MzAwIG1pc2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtaXNjLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDA3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAwMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU2NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1NDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMDE4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldHVwX3hmYWlsICJoODMwMCotKi0qIgotICAgIGZhaWwgImg4MzAwIG1vdmZwZS9tb3Z0cGUgdGVzdHMiCi19Ci0KLXByb2MgZG9faDgzMDBfbW92YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZiLnM6IGg4MzAwIG1vdmIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZiLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwQzg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgRjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDY4MThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2RTE4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZDMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAyODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNkEwODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2ODk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkU5ODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2Qzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDZBODgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX21vdncge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92dy5zOiBoODMwMCBtb3Z3IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92dy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDc5MDAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDZGMTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDZCMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDZGOTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZCODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX3B1c2hwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAicHVzaHBvcC5zOiBoODMwMCBwdXNocG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVzaHBvcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9yb3RhdGVfc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAicm90c2guczogaDgzMDAgcm90YXRlIGFuZCBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInJvdHNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTM4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTA4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDExODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9hZGRfc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZHN1YmguczogaDgzMDBoIGFkZC9zdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGRzdWJoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA4OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDgxOVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5MTEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDkxMlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBMTEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwQTkyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMEIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDBCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwQjk2XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggMEU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDkyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAxODg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzkzMTAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiAxOTAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0EzMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDFBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyAxQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMUI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDFCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAxRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgQjIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWxoLnM6IGg4MzAwaCBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEU5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxNjkxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzk2MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2NjExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0E2MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxRjA2NjExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IEM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxNDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNzk0MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0E0MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxRjA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIEQ4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxNTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzk1MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA2NTExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0E1MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxRjA2NTExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDE3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCAxNzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMTdCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDE3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSAxNzEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMTczMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDI3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9jYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNicmFuY2hoLnM6IGg4MzAwaCBjb25kaXRpb25hbCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjYnJhbmNoaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDQyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA0MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDQ2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA0NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNDgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDQ5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyA0QTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNEIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDRDMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA0RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgNEUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDRGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDU4MDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA1ODEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDU4MjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgNTgzMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDU4NDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyA1ODUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDU4NjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgNTg3MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA1ODgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVjIDU4OTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNThBMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NCA1OEIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY4IDU4QzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmMgNThEMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA1OEUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDc0IDU4RjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNDBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci1wcm9jIGRvX2g4MzAwaF9iaXRvcHMxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczFoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzEiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMxaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3MjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDYyOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzY4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9iaXRvcHMyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczJoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMyaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDc1ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfYml0b3BzMyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMzaC5zOiBoODMwMGggYml0b3BzIHRlc3RzICMzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzM2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDcxMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3RDAwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdGNDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjE5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3MDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0QwMDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RjQwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDYwOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3RDAwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdGNDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2JpdG9wczQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzNGguczogaDgzMDBoIGJpdG9wcyB0ZXN0cyAjNCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczRoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2Mzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDc1MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSA3QzAwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDdFNDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2hoLnM6IGg4MzAwaCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2hoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUMwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1QTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUUwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA1RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNUYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2NvbXBhcmUge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZWguczogaDgzMDBoIGNvbXBhcmUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21wYXJlaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTIwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMUY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2RlY2ltYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVjaW1hbGguczogaDgzMDBoIGRlY2ltYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZWNpbWFsaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfaW5jZGVjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImluY2RlY2guczogaDgzMDBoIGluY2RlYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImluY2RlY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMUJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDFCNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxQkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDBCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAwQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2Rpdm11bCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkaXZtdWxoLnM6IGg4MzAwaCBkaXZtdWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkaXZtdWxoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAxRDA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDFEMDUzMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxQzA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDFDMDUyMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfbWlzYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtaXNjaC5zOiBoODMwMGggbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1pc2NoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDdCRDQ1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTQwNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxNDA2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDE0MDZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAwMTQwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMDE0MDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNTY3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDU0NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgMDIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxNDA2OTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgMDE0MDZGODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAwMTQwNkQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDAxNDA2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YSAwMTQwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldHVwX3hmYWlsICJoODMwMCotKi0qIgotICAgIGZhaWwgImg4MzAwaCBtb3ZmcGUvbW92dHBlIHRlc3RzIgotfQotCi1wcm9jIGRvX2g4MzAwaF9tb3ZiIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmJoLnM6IGg4MzAwaCBtb3ZiIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92YmgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBDODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiBGODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNjgxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZFMTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzgxMDZBMjhcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2QzE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZBMDgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkEyODAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY4OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RTk4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QUE4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA2QTg4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDZBQTgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX21vdncge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92d2guczogaDgzMDBoIG1vdncgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Z3aC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDc5MDAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDZGMTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNzgxMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNkIwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZGOTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNzgxMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNkI4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9tb3ZsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmxoLnM6IGg4MzAwaCBtb3ZsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92bGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QTAwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEwMDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTAwNkYxMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMDEwMDc4MTBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDAxMDA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDEwMDZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxMDA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMDEwMDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMTAwNkY5MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMDEwMDc4OTBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDAxMDA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMDEwMDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDAxMDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9wdXNocG9wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInB1c2hwb3BoLnM6IGg4MzAwaCBwdXNocG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVzaHBvcGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwMTAwNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9yb3RhdGVfc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAicm90c2hoLnM6IGg4MzAwaCByb3RhdGUgYW5kIHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicm90c2hoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDEzQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDEyMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMTMxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDEzMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxMDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMTA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDEwQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSAxMTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMTE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDExQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMTAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDEwMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxMTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMTExMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDExMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2V4dGVuZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRlbmRoLnM6IGg4MzAwaCBleHRlbmQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRlbmRoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxN0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTdGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDE3NTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxNzcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2FkZF9zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkc3Vicy5zOiBoODMwMHMgYWRkL3N1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZHN1YnMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDg5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwODE5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzkxMTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwOTEyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0ExMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDBBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMEI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDBCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAwRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgOTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDE4ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3OTMxMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDE5MDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3QTMxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMUE5MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDFCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMUI5NlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDFFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCBCMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbHMuczogaDgzMDBzIGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2Fscy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgRTkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE2OTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTYxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTYxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFGMDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwNjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMDE0MTA2MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSBDODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTQ5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc5NDEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNjQxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdBNDEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwMUYwNjQxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDA0MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAwMTQxMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgRDgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDE1ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCA3OTUxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzZSA3QTUxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgMDFGMDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCAwNTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgMDE0MTA1MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSAxNzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgMTc5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDE3QjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCAxNzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMTcxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDE3MzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAzMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfY2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjYnJhbmNocy5zOiBoODMwMHMgY29uZGl0aW9uYWwgYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY2JyYW5jaHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA0MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNDMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA0NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDQ4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA0OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNEEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDRCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA0QzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNEQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDRFMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA0RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNTgwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDU4MTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCA1ODIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDU4MzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNTg0MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDU4NTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCA1ODYwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDU4NzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNTg4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YyA1ODkwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDU4QTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjQgNThCMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2OCA1OEMwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZjIDU4RDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzAgNThFMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3NCA1OEYwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDQwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotcHJvYyBkb19oODMwMHNfYml0b3BzMSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMxcy5zOiBoODMwMHMgYml0b3BzIHRlc3RzICMxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMXMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc2MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzYwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc2MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDcyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RDAwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDdGNDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzIwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcyMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDYyOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3RDAwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdGNDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjI5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYyOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDc2ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3QzAwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdFNDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzY4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc2ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDc3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MiA3QzAwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY2IDdFNDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc3ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDI1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19iaXRvcHMyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczJzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMycy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NDgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzQ4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNjc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2NzgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA3NTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgN0MwMDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3RTQwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc1ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NTgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA3NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgN0MwMDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSA3RTQwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc3MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfYml0b3BzMyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMzcy5zOiBoODMwMHMgYml0b3BzIHRlc3RzICMzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzM3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDcxMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3RDAwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdGNDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzEwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcxMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDYxOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RDAwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDdGNDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjE5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYxOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDcwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3RDAwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdGNDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzAwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcwMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDYwOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3RDAwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdGNDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjA5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYwOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19iaXRvcHM0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczRzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzQiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHM0cy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NDAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzQwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNjcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjcwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDdDMDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0U0MDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzMwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNjM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDdDMDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgN0U0MDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MzkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjM5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNzUwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYyIDdDMDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjYgN0U0MDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NTAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzUwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2hzLnM6IGg4MzAwcyBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2hzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUMwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1QTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUUwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA1RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNUYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2NvbXBhcmUge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZXMuczogaDgzMDBzIGNvbXBhcmUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21wYXJlcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTIwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMUY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2RlY2ltYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVjaW1hbHMuczogaDgzMDBzIGRlY2ltYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZWNpbWFscy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfaW5jZGVjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImluY2RlY3MuczogaDgzMDBzIGluY2RlYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImluY2RlY3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMUJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDFCNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxQkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDBCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAwQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2Rpdm11bCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkaXZtdWxzLnM6IGg4MzAwcyBkaXZtdWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkaXZtdWxzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAxRDA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDFEMDUzMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxQzA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDFDMDUyMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbWlzYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtaXNjcy5zOiBoODMwMHMgbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1pc2NzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDdCRDQ1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTQxMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAzMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwMTQwNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDAxNDA2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDE0MDZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwMTQwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMDE0MDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTQxNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxNDE2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAwMTQxNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMDE0MTZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAwMTQxNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMDE0MTZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1ZSAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNTY3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYyIDU0NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NCAwMTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjYgMDIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY4IDAyMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YSAwMTQwNjk4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZlIDAxNDA2RjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3NCAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwN2UgMDE0MDZEODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA4MiAwMTQwNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwODggMDE0MDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA5MCAwMTQxNjk4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDk0IDAxNDE2RjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA5YSAwMTQxNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwYTQgMDE0MTZEODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDBhOCAwMTQxNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwYWUgMDE0MTZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMzZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLSAgICBzZXR1cF94ZmFpbCAiaDgzMDAqLSotKiIKLSAgICBmYWlsICJoODMwMHMgbW92ZnBlL21vdnRwZSB0ZXN0cyIKLX0KLQotcHJvYyBkb19oODMwMHNfbW92YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Zicy5zOiBoODMwMHMgbW92YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmJzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwQzg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgRjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDY4MThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2RTE4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDc4MTA2QTI4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNkMxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDI4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA2QTA4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZBMjgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA2ODk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkU5ODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA3ODEwNkFBOFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDZDOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAzODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgNkE4ODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA2QUE4MDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19tb3Z3IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdndzLnM6IGg4MzAwcyBtb3Z3IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92d3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3OTAwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2RjEwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDc4MTA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZCMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RjkwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDZCODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1wcm9jIGRvX2g4MzAwc19tb3ZsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmxzLnM6IGg4MzAwcyBtb3ZsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92bHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QTAwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEwMDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTAwNkYxMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMDEwMDc4MTBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDAxMDA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDEwMDZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxMDA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMDEwMDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMTAwNkY5MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMDEwMDc4OTBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDAxMDA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMDEwMDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDAxMDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19wdXNocG9wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInB1c2hwb3BzLnM6IGg4MzAwcyBwdXNocG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVzaHBvcHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwMTAwNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19yb3RhdGVfc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAicm90c2hzLnM6IGg4MzAwcyByb3RhdGUgYW5kIHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicm90c2hzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTJDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTJCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDEyRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTNDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDEzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAxM0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMTNCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDEzRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMTI0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDEyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSAxMjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMTIzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDEyNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMTM0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDEzMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxMzUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMTMzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDEzNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAxMDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMTBDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDEwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiAxMEQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMTBCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDEwRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyAxMTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2UgMTFDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDExOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAxMUQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgMTFCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDExRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgMTA0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDEwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSAxMDUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgMTAzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDEwNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCAxMTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMTE0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDExMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YSAxMTUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWMgMTEzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVlIDExNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2V4dGVuZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRlbmRzLnM6IGg4MzAwcyBleHRlbmQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRlbmRzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxN0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTdGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDE3NTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxNzcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX21hYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtYWNzLnM6IGg4MzAwcyBtYWMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtYWNzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwMUEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDMyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAzMzFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAwMTYwNkQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAyMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMjMxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX211bHRpcGxlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm11bHRpcGxlcy5zOiBoODMwMHMgbXVsdGlwbGUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtdWx0aXBsZXMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDAxMTA2RDcxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDEyMDZENzJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTMwNkQ3M1xbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxMTA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDEyMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwMTMwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9tb3YzMmJ1ZyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YzMmJ1Zy5zOiBoODMwMGggbW92MzJidWcgdGVzdCIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJtb3YzMmJ1Zy5zIiAiIiAiUHJvcGVyIHJlbG9jYXRpb24gZm9yIG1vdi5sIChwYXJ0IDEpIl0gdGhlbiB7Ci0gICAgICAgIG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiMDAwMDAwMDJcW15cblxdKjMyXFteXG5cXSpfYS4weDAqODhjYTZjMDBcW15cblxdKlxuIgotCQkJCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCXRpbWVvdXQgCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgaDgzMDAqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBoODMwMCBpbnN0cnVjdGlvbiBwYXJzZXIKLSAgICBkb19oODMwMF9hZGRfc3ViCi0gICAgZG9faDgzMDBfbG9naWNhbAotICAgIGRvX2g4MzAwX2NicmFuY2gKLSAgICBkb19oODMwMF9iaXRvcHMxCi0gICAgZG9faDgzMDBfYml0b3BzMgotICAgIGRvX2g4MzAwX2JpdG9wczMKLSAgICBkb19oODMwMF9iaXRvcHM0Ci0gICAgZG9faDgzMDBfYnJhbmNoCi0gICAgZG9faDgzMDBfY29tcGFyZQotICAgIGRvX2g4MzAwX2RlY2ltYWwKLSAgICBkb19oODMwMF9pbmNkZWMKLSAgICBkb19oODMwMF9kaXZtdWwKLSAgICBkb19oODMwMF9taXNjCi0gICAgZG9faDgzMDBfbW92YgotICAgIGRvX2g4MzAwX21vdncKLSAgICBkb19oODMwMF9wdXNocG9wCi0gICAgZG9faDgzMDBfcm90YXRlX3NoaWZ0Ci0KLSAgICAjIE5vdyB0ZXN0IHRoZSBoODMwMGggaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICAgZG9faDgzMDBoX2FkZF9zdWIKLSAgICBkb19oODMwMGhfbG9naWNhbAotICAgIGRvX2g4MzAwaF9jYnJhbmNoCi0gICAgZG9faDgzMDBoX2JpdG9wczEKLSAgICBkb19oODMwMGhfYml0b3BzMgotICAgIGRvX2g4MzAwaF9iaXRvcHMzCi0gICAgZG9faDgzMDBoX2JpdG9wczQKLSAgICBkb19oODMwMGhfYnJhbmNoCi0gICAgZG9faDgzMDBoX2NvbXBhcmUKLSAgICBkb19oODMwMGhfZGVjaW1hbAotICAgIGRvX2g4MzAwaF9pbmNkZWMKLSAgICBkb19oODMwMGhfZGl2bXVsCi0gICAgZG9faDgzMDBoX21pc2MKLSAgICBkb19oODMwMGhfbW92YgotICAgIGRvX2g4MzAwaF9tb3Z3Ci0gICAgZG9faDgzMDBoX21vdmwKLSAgICBkb19oODMwMF9wdXNocG9wCi0gICAgZG9faDgzMDBoX3JvdGF0ZV9zaGlmdAotICAgIGRvX2g4MzAwaF9leHRlbmQKLQotICAgICMgTm93IHRlc3QgdGhlIGg4MzAwcyBpbnN0cnVjdGlvbiBwYXJzZXIKLSAgICBkb19oODMwMHNfYWRkX3N1YgotICAgIGRvX2g4MzAwc19sb2dpY2FsCi0gICAgZG9faDgzMDBzX2NicmFuY2gKLSAgICBkb19oODMwMHNfYml0b3BzMQotICAgIGRvX2g4MzAwc19iaXRvcHMyCi0gICAgZG9faDgzMDBzX2JpdG9wczMKLSAgICBkb19oODMwMHNfYml0b3BzNAotICAgIGRvX2g4MzAwc19icmFuY2gKLSAgICBkb19oODMwMHNfY29tcGFyZQotICAgIGRvX2g4MzAwc19kZWNpbWFsCi0gICAgZG9faDgzMDBzX2luY2RlYwotICAgIGRvX2g4MzAwc19kaXZtdWwKLSAgICBkb19oODMwMHNfbWlzYwotICAgIGRvX2g4MzAwc19tb3ZiCi0gICAgZG9faDgzMDBzX21vdncKLSAgICBkb19oODMwMHNfbW92bAotICAgIGRvX2g4MzAwX3B1c2hwb3AKLSAgICBkb19oODMwMHNfcm90YXRlX3NoaWZ0Ci0gICAgZG9faDgzMDBzX2V4dGVuZAotICAgIGRvX2g4MzAwc19tYWMKLSAgICBkb19oODMwMHNfbXVsdGlwbGUKLQotICAgIGRvX2g4MzAwaF9tb3YzMmJ1ZwotCi0gICAgIyBOb3cgc29tZSByYW5kb20gdGVzdHMKLSAgICBzZXQgc3ZyNHBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVsZipdIHx8IFtpc3RhcmdldCAqLSotaXJpeDUqXSBdCi0gICAgc2V0IGVtcGljIFtleHByIFtpc3RhcmdldCAqLSotZWNvZmYqXSB8fCBbaXN0YXJnZXQgKi0qLXVsdHJpeCpdIHx8IFtpc3RhcmdldCAqLSotaXJpeFxbMS00XF0qXSBdCi0gICAgc2V0IGFvdXQgW2V4cHIgW2lzdGFyZ2V0ICotKi1ic2QqXSB8fCBbaXN0YXJnZXQgKi0qLW5ldGJzZCpdXQotCi0gICAgcnVuX2R1bXBfdGVzdCAiZmZ4eDEiCi0gICAgZ2FzX3Rlc3QgImNtcHNpMi5zIiAiIiAiIiAiY21wc2kyLnMiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE4ODI3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX2luY2RlYzoKLQlkZWMgcjBsCi0JaW5jIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOTNmYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2luY2RlYzoKLQlkZWMuYiByMGwKLQlkZWMudyAjMSxyMAotCWRlYy53ICMyLHIwCi0JZGVjLmwgIzEsZXIwCi0JZGVjLmwgIzIsZXIwCi0JaW5jLmIgcjBsCi0JaW5jLncgIzEscjAKLQlpbmMudyAjMixyMAotCWluYy5sICMxLGVyMAotCWluYy5sICMyLGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDU3MDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2luY2RlYzoKLQlkZWMuYiByMGwKLQlkZWMudyAjMSxyMAotCWRlYy53ICMyLHIwCi0JZGVjLmwgIzEsZXIwCi0JZGVjLmwgIzIsZXIwCi0JaW5jLmIgcjBsCi0JaW5jLncgIzEscjAKLQlpbmMudyAjMixyMAotCWluYy5sICMxLGVyMAotCWluYy5sICMyLGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2UzYjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9sb2dpY2FsOgotCWFuZCAjMTYscjFsCi0JYW5kIHIxbCxyMWgKLQlhbmRjICMxNixjY3IKLQlvciAjMTYscjBsCi0Jb3IgcjFsLHIwbAotCW9yYyAjMTYsY2NyCi0JeG9yICMxNixyMGwKLQl4b3IgcjBsLHIxbAotCXhvcmMgIzE2LGNjcgotCW5lZyByMGwKLQlub3QgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTk1ZjExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbG9naWNhbDoKLQlhbmQuYiAjMTYscjFsCi0JYW5kLmIgcjFsLHIxaAotCWFuZC53ICMzMixyMQotCWFuZC53IHIxLHIxCi0JYW5kLmwgIzY0LGVyMQotCWFuZC5sIGVyMSxlcjEKLQlhbmRjICMxNixjY3IKLQlvci5iICMxNixyMGwKLQlvci5iIHIxbCxyMGwKLQlvci53ICMzMixyMQotCW9yLncgcjEscjEKLQlvci5sICM2NCxlcjEKLQlvci5sIGVyMSxlcjEKLQlvcmMgIzE2LGNjcgotCXhvci5iICMxNixyMGwKLQl4b3IuYiByMGwscjFsCi0JeG9yLncgIzMyLHIxCi0JeG9yLncgcjEscjEKLQl4b3IubCAjNjQsZXIxCi0JeG9yLmwgZXIxLGVyMQotCXhvcmMgIzE2LGNjcgotCW5lZy5iIHIwbAotCW5lZy53IHIwCi0JbmVnLmwgZXIwCi0Jbm90LmIgcjBsCi0Jbm90LncgcjAKLQlub3QubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzRjYmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbHMucworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19sb2dpY2FsOgotCWFuZC5iICMxNixyMWwKLQlhbmQuYiByMWwscjFoCi0JYW5kLncgIzMyLHIxCi0JYW5kLncgcjEscjEKLQlhbmQubCAjNjQsZXIxCi0JYW5kLmwgZXIxLGVyMQotCWFuZGMgIzE2LGNjcgotCWFuZGMgIzE2LGV4cgotCW9yLmIgIzE2LHIwbAotCW9yLmIgcjFsLHIwbAotCW9yLncgIzMyLHIxCi0Jb3IudyByMSxyMQotCW9yLmwgIzY0LGVyMQotCW9yLmwgZXIxLGVyMQotCW9yYyAjMTYsY2NyCi0Jb3JjICMxNixleHIKLQl4b3IuYiAjMTYscjBsCi0JeG9yLmIgcjBsLHIxbAotCXhvci53ICMzMixyMQotCXhvci53IHIxLHIxCi0JeG9yLmwgIzY0LGVyMQotCXhvci5sIGVyMSxlcjEKLQl4b3JjICMxNixjY3IKLQl4b3JjICMxNixleHIKLQluZWcuYiByMGwKLQluZWcudyByMAotCW5lZy5sIGVyMAotCW5vdC5iIHIwbAotCW5vdC53IHIwCi0Jbm90LmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21hY3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21hY3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkZjZkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tYWNzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbWFjOgotCWNscm1hYwotCWxkbWFjIGVyMCxtYWNoCi0JbGRtYWMgZXIxLG1hY2wKLQltYWMgQGVyMCssQGVyMSsKLQlzdG1hYyBtYWNoLGVyMAotCXN0bWFjIG1hY2wsZXIxCi0JCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2ZjgwOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLWg4MzAwX21pc2M6Ci0JZWVwbW92Ci0JbGRjICMwLGNjcgotCWxkYyByMGwsY2NyCi07CW1vdmZwZSAxNjoxNixyMGwKLTsJbW92dHBlIHIwbCwxNjoxNgotCW5vcAotCXJ0ZQotCXJ0cwotCXNsZWVwCi0Jc3RjIGNjcixyMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWNiM2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY2gucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9taXNjOgotCWVlcG1vdi5iCi0gCWVlcG1vdi53Ci0JbGRjLmIgIzAsY2NyCi0JbGRjLmIgcjBsLGNjcgotCWxkYy53IEBlcjAsY2NyCi0JbGRjLncgQCgxNjoxNixlcjApLGNjcgotCWxkYy53IEAoMzI6MjQsZXIwKSxjY3IKLQlsZGMudyBAZXIwKyxjY3IKLQlsZGMudyBAaDgzMDBoX21pc2M6MTYsY2NyCi0JbGRjLncgQGg4MzAwaF9taXNjOjI0LGNjcgotOwltb3ZmcGUgMTY6MTYscjBsCi07CW1vdnRwZSByMGwsMTY6MTYKLQlub3AKLQlydGUKLQlydHMKLQlzbGVlcAotCXN0Yy5iIGNjcixyMGwKLQlzdGMudyBjY3IsQGVyMAotCXN0Yy53IGNjcixAKDE2OjE2LGVyMCkKLQlzdGMudyBjY3IsQCgzMjoyNCxlcjApCi0Jc3RjLncgY2NyLEAtZXIwCi0Jc3RjLncgY2NyLEBoODMwMGhfbWlzYzoxNgotCXN0Yy53IGNjcixAaDgzMDBoX21pc2M6MjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzN2ExNzcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY3MucworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19taXNjOgotCWVlcG1vdi5iCi0gCWVlcG1vdi53Ci0JbGRjLmIgIzAsY2NyCi0JbGRjLmIgcjBsLGNjcgotCWxkYy5iICMwLGV4cgotCWxkYy5iIHIwbCxleHIKLQlsZGMudyBAZXIwLGNjcgotCWxkYy53IEAoMTY6MTYsZXIwKSxjY3IKLQlsZGMudyBAKDMyOjMyLGVyMCksY2NyCi0JbGRjLncgQGVyMCssY2NyCi0JbGRjLncgQGg4MzAwc19taXNjOjE2LGNjcgotCWxkYy53IEBoODMwMHNfbWlzYzozMixjY3IKLQlsZGMudyBAZXIwLGV4cgotCWxkYy53IEAoMTY6MTYsZXIwKSxleHIKLQlsZGMudyBAKDMyOjMyLGVyMCksZXhyCi0JbGRjLncgQGVyMCssZXhyCi0JbGRjLncgQGg4MzAwc19taXNjOjE2LGV4cgotCWxkYy53IEBoODMwMHNfbWlzYzozMixleHIKLTsJbW92ZnBlIDE2OjE2LHIwbAotOwltb3Z0cGUgcjBsLDE2OjE2Ci0Jbm9wCi0JcnRlCi0JcnRzCi0Jc2xlZXAKLQlzdGMuYiBjY3IscjBsCi0Jc3RjLmIgZXhyLHIwbAotCXN0Yy53IGNjcixAZXIwCi0Jc3RjLncgY2NyLEAoMTY6MTYsZXIwKQotCXN0Yy53IGNjcixAKDMyOjMyLGVyMCkKLQlzdGMudyBjY3IsQC1lcjAKLQlzdGMudyBjY3IsQGg4MzAwc19taXNjOjE2Ci0Jc3RjLncgY2NyLEBoODMwMHNfbWlzYzozMgotCXN0Yy53IGV4cixAZXIwCi0Jc3RjLncgZXhyLEAoMTY6MTYsZXIwKQotCXN0Yy53IGV4cixAKDMyOjMyLGVyMCkKLQlzdGMudyBleHIsQC1lcjAKLQlzdGMudyBleHIsQGg4MzAwc19taXNjOjE2Ci0Jc3RjLncgZXhyLEBoODMwMHNfbWlzYzozMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92MzJidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdjMyYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzkzZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92MzJidWcucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS5oODMwMGgKLQkuZ2xvYmFsIF9hCi1ibGFoOgotCW1vdi5sICAgI19hLTIwMDAwMDAwMDAsZXIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDQwYzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9tb3ZiOgotCW1vdi5iIHIwbCxyMWwKLQltb3YuYiAjMTYscjBsCi0JbW92LmIgQHIxLHIwbAotCW1vdi5iIEAoMTY6MTYscjEpLHIwbAotCW1vdi5iIEByMSsscjBsCi0JbW92LmIgQDE2OjgscjBsCi0JbW92LmIgQGg4MzAwX21vdmI6MTYscjBsCi0JbW92LmIgcjBsLEByMQotCW1vdi5iIHIwbCxAKDE2OjE2LHIxKQotCW1vdi5iIHIwbCxALXIxCi0JbW92LmIgcjBsLEAxNjo4Ci0JbW92LmIgcjBsLEBoODMwMF9tb3ZiOjE2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDcxMWY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbW92YjoKLQltb3YuYiByMGwscjFsCi0JbW92LmIgIzE2LHIwbAotCW1vdi5iIEBlcjEscjBsCi0JbW92LmIgQCgxNjoxNixlcjEpLHIwbAotCW1vdi5iIEAoMzI6MjQsZXIxKSxyMGwKLQltb3YuYiBAZXIxKyxyMGwKLQltb3YuYiBAMTY6OCxyMGwKLQltb3YuYiBAaDgzMDBoX21vdmI6MTYscjBsCi0JbW92LmIgQGg4MzAwaF9tb3ZiOjI0LHIwbAotCW1vdi5iIHIwbCxAZXIxCi0JbW92LmIgcjBsLEAoMTY6MTYsZXIxKQotCW1vdi5iIHIwbCxAKDMyOjI0LGVyMSkKLQltb3YuYiByMGwsQC1lcjEKLQltb3YuYiByMGwsQDE2OjgKLQltb3YuYiByMGwsQGg4MzAwaF9tb3ZiOjE2Ci0JbW92LmIgcjBsLEBoODMwMGhfbW92YjoyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zicy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1MDAyYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zicy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21vdmI6Ci0JbW92LmIgcjBsLHIxbAotCW1vdi5iICMxNixyMGwKLQltb3YuYiBAZXIxLHIwbAotCW1vdi5iIEAoMTY6MTYsZXIxKSxyMGwKLQltb3YuYiBAKDMyOjMyLGVyMSkscjBsCi0JbW92LmIgQGVyMSsscjBsCi0JbW92LmIgQDE2OjgscjBsCi0JbW92LmIgQGg4MzAwc19tb3ZiOjE2LHIwbAotCW1vdi5iIEBoODMwMHNfbW92YjozMixyMGwKLQltb3YuYiByMGwsQGVyMQotCW1vdi5iIHIwbCxAKDE2OjE2LGVyMSkKLQltb3YuYiByMGwsQCgzMjozMixlcjEpCi0JbW92LmIgcjBsLEAtZXIxCi0JbW92LmIgcjBsLEAxNjo4Ci0JbW92LmIgcjBsLEBoODMwMHNfbW92YjoxNgotCW1vdi5iIHIwbCxAaDgzMDBzX21vdmI6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzc4ZTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bGgucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9tb3ZsOgotCW1vdi5sIGVyMCxlcjEKLQltb3YubCAjNjQsZXIwCi0JbW92LmwgQGVyMSxlcjAKLQltb3YubCBAKDE2OjE2LGVyMSksZXIwCi0JbW92LmwgQCgzMjoyNCxlcjEpLGVyMAotCW1vdi5sIEBlcjErLGVyMAotCW1vdi5sIEBoODMwMGhfbW92bDoxNixlcjAKLQltb3YubCBAaDgzMDBoX21vdmw6MjQsZXIwCi0JbW92LmwgZXIwLEBlcjEKLQltb3YubCBlcjAsQCgxNjoxNixlcjEpCi0JbW92LmwgZXIwLEAoMzI6MjQsZXIxKQotCW1vdi5sIGVyMCxALWVyMQotCW1vdi5sIGVyMCxAaDgzMDBoX21vdmw6MTYKLQltb3YubCBlcjAsQGg4MzAwaF9tb3ZsOjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zscy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQzNzY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbW92bDoKLQltb3YubCBlcjAsZXIxCi0JbW92LmwgIzY0LGVyMAotCW1vdi5sIEBlcjEsZXIwCi0JbW92LmwgQCgxNjoxNixlcjEpLGVyMAotCW1vdi5sIEAoMzI6MzIsZXIxKSxlcjAKLQltb3YubCBAZXIxKyxlcjAKLQltb3YubCBAaDgzMDBzX21vdmw6MTYsZXIwCi0JbW92LmwgQGg4MzAwc19tb3ZsOjMyLGVyMAotCW1vdi5sIGVyMCxAZXIxCi0JbW92LmwgZXIwLEAoMTY6MTYsZXIxKQotCW1vdi5sIGVyMCxAKDMyOjMyLGVyMSkKLQltb3YubCBlcjAsQC1lcjEKLQltb3YubCBlcjAsQGg4MzAwc19tb3ZsOjE2Ci0JbW92LmwgZXIwLEBoODMwMHNfbW92bDozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzY0ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92dy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9tb3Z3OgotCW1vdi53IHIwLHIxCi0JbW92LncgIzE2LHIwCi0JbW92LncgQHIxLHIwCi0JbW92LncgQCgxNjoxNixyMSkscjAKLQltb3YudyBAcjErLHIwCi0JbW92LncgQGg4MzAwX21vdnc6MTYscjAKLQltb3YudyByMCxAcjEKLQltb3YudyByMCxAKDE2OjE2LHIxKQotCW1vdi53IHIwLEAtcjEKLQltb3YudyByMCxAaDgzMDBfbW92dzoxNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1MDU3Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3aC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX21vdnc6Ci0JbW92LncgcjAscjEKLQltb3YudyAjMTYscjAKLQltb3YudyBAZXIxLHIwCi0JbW92LncgQCgxNjoxNixlcjEpLHIwCi0JbW92LncgQCgzMjoyNCxlcjEpLHIwCi0JbW92LncgQGVyMSsscjAKLQltb3YudyBAaDgzMDBoX21vdnc6MTYscjAKLQltb3YudyBAaDgzMDBoX21vdnc6MjQscjAKLQltb3YudyByMCxAZXIxCi0JbW92LncgcjAsQCgxNjoxNixlcjEpCi0JbW92LncgcjAsQCgzMjoyNCxlcjEpCi0JbW92LncgcjAsQC1lcjEKLQltb3YudyByMCxAaDgzMDBoX21vdnc6MTYKLQltb3YudyByMCxAaDgzMDBoX21vdnc6MjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjIxZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d3MucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tb3Z3OgotCW1vdi53IHIwLHIxCi0JbW92LncgIzE2LHIwCi0JbW92LncgQGVyMSxyMAotCW1vdi53IEAoMTY6MTYsZXIxKSxyMAotCW1vdi53IEAoMzI6MzIsZXIxKSxyMAotCW1vdi53IEBlcjErLHIwCi0JbW92LncgQGg4MzAwc19tb3Z3OjE2LHIwCi0JbW92LncgQGg4MzAwc19tb3Z3OjMyLHIwCi0JbW92LncgcjAsQGVyMQotCW1vdi53IHIwLEAoMTY6MTYsZXIxKQotCW1vdi53IHIwLEAoMzI6MzIsZXIxKQotCW1vdi53IHIwLEAtZXIxCi0JbW92LncgcjAsQGg4MzAwc19tb3Z3OjE2Ci0JbW92LncgcjAsQGg4MzAwc19tb3Z3OjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL211bHRpcGxlcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbXVsdGlwbGVzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDc5YjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbXVsdGlwbGVzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbXVsdGlwbGU6Ci0JbGRtLmwgQHNwKyxlcjAtZXIxCi0JbGRtLmwgQHNwKyxlcjAtZXIyCi0JbGRtLmwgQHNwKyxlcjAtZXIzCi0Jc3RtLmwgZXIwLWVyMSxALXNwCi0Jc3RtLmwgZXIwLWVyMixALXNwCi0Jc3RtLmwgZXIwLWVyMyxALXNwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3AucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3AucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxYjczNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfcHVzaF9wb3A6Ci0JcG9wIHIwCi0JcHVzaCByMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9waC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0OTYzOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9waC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfcHVzaF9wb3A6Ci0JcG9wLncgcjAKLQlwb3AubCBlcjAKLQlwdXNoLncgcjAKLQlwdXNoLmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFkZjA0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19wdXNoX3BvcDoKLQlwb3AudyByMAotCXBvcC5sIGVyMAotCXB1c2gudyByMAotCXB1c2gubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWE4N2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2gucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotaDgzMDBfcm90YXRlX3NoaWZ0OgotCXJvdGwgcjBsCi0Jcm90ciByMGwKLQlyb3R4bCByMGwKLQlyb3R4ciByMGwKLQlzaGFsIHIwbAotCXNoYXIgcjBsCi0Jc2hsbCByMGwKLQlzaGxyIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2FiZTQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX3JvdGF0ZV9zaGlmdDoKLQlyb3RsLmIgcjBsCi0Jcm90bC53IHIwCi0Jcm90bC5sIGVyMAotCXJvdHIuYiByMGwKLQlyb3RyLncgcjAKLQlyb3RyLmwgZXIwCi0Jcm90eGwuYiByMGwKLQlyb3R4bC53IHIwCi0Jcm90eGwubCBlcjAKLQlyb3R4ci5iIHIwbAotCXJvdHhyLncgcjAKLQlyb3R4ci5sIGVyMAotCXNoYWwuYiByMGwKLQlzaGFsLncgcjAKLQlzaGFsLmwgZXIwCi0Jc2hhci5iIHIwbAotCXNoYXIudyByMAotCXNoYXIubCBlcjAKLQlzaGxsLmIgcjBsCi0Jc2hsbC53IHIwCi0Jc2hsbC5sIGVyMAotCXNobHIuYiByMGwKLQlzaGxyLncgcjAKLQlzaGxyLmwgZXIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNocy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM0MWNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNocy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX3JvdGF0ZV9zaGlmdDoKLQlyb3RsLmIgcjBsCi0Jcm90bC5iICMyLHIwbAotCXJvdGwudyByMAotCXJvdGwudyAjMixyMAotCXJvdGwubCBlcjAKLQlyb3RsLmwgIzIsZXIwCi0Jcm90ci5iIHIwbAotCXJvdHIuYiAjMixyMGwKLQlyb3RyLncgcjAKLQlyb3RyLncgIzIscjAKLQlyb3RyLmwgZXIwCi0Jcm90ci5sICMyLGVyMAotCXJvdHhsLmIgcjBsCi0Jcm90eGwuYiAjMixyMGwKLQlyb3R4bC53IHIwCi0Jcm90eGwudyAjMixyMAotCXJvdHhsLmwgZXIwCi0Jcm90eGwubCAjMixlcjAKLQlyb3R4ci5iIHIwbAotCXJvdHhyLmIgIzIscjBsCi0Jcm90eHIudyByMAotCXJvdHhyLncgIzIscjAKLQlyb3R4ci5sIGVyMAotCXJvdHhyLmwgIzIsZXIwCi0Jc2hhbC5iIHIwbAotCXNoYWwuYiAjMixyMGwKLQlzaGFsLncgcjAKLQlzaGFsLncgIzIscjAKLQlzaGFsLmwgZXIwCi0Jc2hhbC5sICMyLGVyMAotCXNoYXIuYiByMGwKLQlzaGFyLmIgIzIscjBsCi0Jc2hhci53IHIwCi0Jc2hhci53ICMyLHIwCi0Jc2hhci5sIGVyMAotCXNoYXIubCAjMixlcjAKLQlzaGxsLmIgcjBsCi0Jc2hsbC5iICMyLHIwbAotCXNobGwudyByMAotCXNobGwudyAjMixyMAotCXNobGwubCBlcjAKLQlzaGxsLmwgIzIsZXIwCi0Jc2hsci5iIHIwbAotCXNobHIuYiAjMixyMGwKLQlzaGxyLncgcjAKLQlzaGxyLncgIzIscjAKLQlzaGxyLmwgZXIwCi0Jc2hsci5sICMyLGVyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9SRUFETUUgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiMTc0YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLU5vdGVzIG9uIGhvdyB0aGUgSFBQQSB0ZXN0c3VpdGUgaXMgb3JnYW5pemVkOgotCi1iYXNpYy5wYXJzZSAtLSB0aGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2luZwotdGVzdHMgYW5kIGEgc2ltcGxlIC5zdGFiIHBhcnNpbmcgdGVzdC4gIFRoaXMgd291bGQgYmUgd2hlcmUgeW91J2QKLWFkZCBjb2RlIHRvIG1ha2Ugc3VyZSBuZXcgaW5zdHJ1Y3Rpb25zIGFyZSBwYXJzZWQgY29ycmVjdGx5LCBuZXcKLWNvbXBsZXRlcnMgKHN1Y2ggYXMgY2FjaGUgaGl0cykgYXJlIHBhcnNlZCBjb3JyZWN0bHksIGV0Yy4KLQotSXQncyBhbHNvIGEgcmVhc29uYWJsZSBwbGFjZSB0byBtYWtlIHN1cmUgcGFyc2luZyBvZiB0aGUgdmFyaW91cwotYXNzZW1ibGVyIGRpcmVjdGl2ZXMgaXMgaGFuZGxlZCBjb3JyZWN0bHkuICBJZiB5b3UncmUgZ29pbmcgdG8gYWRkCi1zdWNoIGNvZGUsIHRyeSB0byBiZSByZWFzb25hYmx5IGNvbXBsZXRlLiAgQWRkIHRlc3QgY29kZSBmb3IgZWFjaAotYmFzaWMgZGlyZWN0aXZlIGFuZCB0ZXN0IGFsbCAob3IgYSBub3Rld29ydGh5KSBzdWJzZXQgb2YgYXJndW1lbnRzLgotCi1JdCBzaG91bGQgb25seSBiZSBuZWNlc3NhcnkgdG8gaGF2ZSBhbiBhc3NlbWJsZXIgdG8gcnVuIHRoZXNlIHRlc3RzOwotY2FsbGluZyBvYmpkdW1wX3N0YXJ0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHNob3VsZCBub3QgYmUgZG9uZSBmcm9tCi10aGlzIGRpcmVjdG9yeS4KLQotCi1tb3JlLnBhcnNlIC0tIHRoaXMgaXMgd2hlcmUgeW91IHNob3VsZCBwdXQgYWRkaXRpb25hbCBwYXJzaW5nIHRlc3RzLCBzdWNoCi1hcyB0ZXN0cyB0byBjaGVjayBtb2RlIHNlbGVjdG9yIHBhcnNpbmcsIHN0cmluZyBwYXJzaW5nLCBleHByZXNzaW9uIHBhcnNpbmcsCi1ldGMuICBJdCdzIGFsc28gYSByZWFzb25hYmxlIHBsYWNlIHRvIHB1dCBwYXJzaW5nIHRlc3RzIHdoaWNoIGFyZSBub3QgY29tcGxldGUKLWVub3VnaCAod2hhdGV2ZXIgdGhhdCBtZWFucykgZm9yIGJhc2ljLnBhcnNlLiAgCi0KLUl0IHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSB0byBoYXZlIGFuIGFzc2VtYmxlciB0byBydW4gdGhlc2UgdGVzdHM7Ci1jYWxsaW5nIG9iamR1bXBfc3RhcnQgb3Igc29tZXRoaW5nIHNpbWlsYXIgc2hvdWxkIG5vdCBiZSBkb25lIGZyb20KLXRoaXMgZGlyZWN0b3J5LgotCi0KLXJlbG9jIC0tIHRoaXMgaXMgd2hlcmUgeW91IHRlc3RzIHdoaWNoIGV4YW1pbmUgcmVsb2NhdGlvbnMgcHJvZHVjZWQKLWJ5IEdBUyBiZWxvbmcuICBUbyBydW4gdGhlc2UgdGVzdHMgeW91IG11c3QgaGF2ZSBhIGZ1bmN0aW9uaW5nIG9iamR1bXAuCi0KLQotdW5zb3J0ZWQgLS0gdGhpcyBpcyB3aGVyZSBldmVyeXRoaW5nIGVsc2UgZ29lcy4gIEFzIGdyb3VwcyBvZiByZWxhdGVkIHRlc3RzCi1lbmQgdXAgaW4gdGhpcyBkaXJlY3RvcnksIHRoZXkgc2hvdWxkIGJlIGJyb2tlbiBvdXQgaW50byBhIG5ldyBjbGFzcyBvZgotdGVzdHMuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3ZjIzYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGFkZC9zaD9hZGQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWFkZCAgJXI0LCVyNSwlcjYKLQlhZGQsPSAgJXI0LCVyNSwlcjYKLQlhZGQsPCAgJXI0LCVyNSwlcjYKLQlhZGQsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLG51diAgJXI0LCVyNSwlcjYKLQlhZGQsem52ICAlcjQsJXI1LCVyNgotCWFkZCxzdiAgJXI0LCVyNSwlcjYKLQlhZGQsb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRyICAlcjQsJXI1LCVyNgotCWFkZCw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLD4gICVyNCwlcjUsJXI2Ci0JYWRkLHV2ICAlcjQsJXI1LCVyNgotCWFkZCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRsICAlcjQsJXI1LCVyNgotCWFkZGwsPSAgJXI0LCVyNSwlcjYKLQlhZGRsLDwgICVyNCwlcjUsJXI2Ci0JYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRsLHN2ICAlcjQsJXI1LCVyNgotCWFkZGwsb2QgICVyNCwlcjUsJXI2Ci0JYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlhZGRsLDw+ICAlcjQsJXI1LCVyNgotCWFkZGwsPj0gICVyNCwlcjUsJXI2Ci0JYWRkbCw+ICAlcjQsJXI1LCVyNgotCWFkZGwsdXYgICVyNCwlcjUsJXI2Ci0JYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCWFkZG8gICVyNCwlcjUsJXI2Ci0JYWRkbyw9ICAlcjQsJXI1LCVyNgotCWFkZG8sPCAgJXI0LCVyNSwlcjYKLQlhZGRvLDw9ICAlcjQsJXI1LCVyNgotCWFkZG8sbnV2ICAlcjQsJXI1LCVyNgotCWFkZG8sem52ICAlcjQsJXI1LCVyNgotCWFkZG8sc3YgICVyNCwlcjUsJXI2Ci0JYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRvLHRyICAlcjQsJXI1LCVyNgotCWFkZG8sPD4gICVyNCwlcjUsJXI2Ci0JYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRvLD4gICVyNCwlcjUsJXI2Ci0JYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGRvLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkYyAgJXI0LCVyNSwlcjYKLQlhZGRjLD0gICVyNCwlcjUsJXI2Ci0JYWRkYyw8ICAlcjQsJXI1LCVyNgotCWFkZGMsPD0gICVyNCwlcjUsJXI2Ci0JYWRkYyxudXYgICVyNCwlcjUsJXI2Ci0JYWRkYyx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkYyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRjLG9kICAlcjQsJXI1LCVyNgotCWFkZGMsdHIgICVyNCwlcjUsJXI2Ci0JYWRkYyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRjLD49ICAlcjQsJXI1LCVyNgotCWFkZGMsPiAgJXI0LCVyNSwlcjYKLQlhZGRjLHV2ICAlcjQsJXI1LCVyNgotCWFkZGMsdm56ICAlcjQsJXI1LCVyNgotCWFkZGMsbnN2ICAlcjQsJXI1LCVyNgotCWFkZGMsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRjbyAgJXI0LCVyNSwlcjYKLQlhZGRjbyw9ICAlcjQsJXI1LCVyNgotCWFkZGNvLDwgICVyNCwlcjUsJXI2Ci0JYWRkY28sPD0gICVyNCwlcjUsJXI2Ci0JYWRkY28sbnV2ICAlcjQsJXI1LCVyNgotCWFkZGNvLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRjbyx0ciAgJXI0LCVyNSwlcjYKLQlhZGRjbyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRjbyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRjbyw+ICAlcjQsJXI1LCVyNgotCWFkZGNvLHV2ICAlcjQsJXI1LCVyNgotCWFkZGNvLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkY28sZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsbCAgJXI0LCVyNSwlcjYKLQlhZGQsbCw9ICAlcjQsJXI1LCVyNgotCWFkZCxsLDwgICVyNCwlcjUsJXI2Ci0JYWRkLGwsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLGwsbnV2ICAlcjQsJXI1LCVyNgotCWFkZCxsLHpudiAgJXI0LCVyNSwlcjYKLQlhZGQsbCxzdiAgJXI0LCVyNSwlcjYKLQlhZGQsbCxvZCAgJXI0LCVyNSwlcjYKLQlhZGQsbCx0ciAgJXI0LCVyNSwlcjYKLQlhZGQsbCw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsbCw+PSAgJXI0LCVyNSwlcjYKLQlhZGQsbCw+ICAlcjQsJXI1LCVyNgotCWFkZCxsLHV2ICAlcjQsJXI1LCVyNgotCWFkZCxsLHZueiAgJXI0LCVyNSwlcjYKLQlhZGQsbCxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsdHN2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsPSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LDwgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiw8PSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LG51diAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LHpudiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LHN2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3Ysb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdix0ciAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LDw+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiw+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsdXYgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdix2bnogICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxjICAlcjQsJXI1LCVyNgotCWFkZCxjLD0gICVyNCwlcjUsJXI2Ci0JYWRkLGMsPCAgJXI0LCVyNSwlcjYKLQlhZGQsYyw8PSAgJXI0LCVyNSwlcjYKLQlhZGQsYyxudXYgICVyNCwlcjUsJXI2Ci0JYWRkLGMsem52ICAlcjQsJXI1LCVyNgotCWFkZCxjLHN2ICAlcjQsJXI1LCVyNgotCWFkZCxjLG9kICAlcjQsJXI1LCVyNgotCWFkZCxjLHRyICAlcjQsJXI1LCVyNgotCWFkZCxjLDw+ICAlcjQsJXI1LCVyNgotCWFkZCxjLD49ICAlcjQsJXI1LCVyNgotCWFkZCxjLD4gICVyNCwlcjUsJXI2Ci0JYWRkLGMsdXYgICVyNCwlcjUsJXI2Ci0JYWRkLGMsdm56ICAlcjQsJXI1LCVyNgotCWFkZCxjLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsYyxldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxjLHRzdiAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3YsPSAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3YsPCAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3YsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLGMsdHN2LG51diAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3Ysem52ICAlcjQsJXI1LCVyNgotCWFkZCxjLHRzdixzdiAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3Ysb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLHRyICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsYyw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGMsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLD4gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLHV2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsYyx2bnogICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGMsZXYgICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTBmNTE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkMi5zCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGFkZC9zaD9hZGQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWFkZCwqICAlcjQsJXI1LCVyNgotCWFkZCwqPSAgJXI0LCVyNSwlcjYKLQlhZGQsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLCo8PSAgJXI0LCVyNSwlcjYKLQlhZGQsKm51diAgJXI0LCVyNSwlcjYKLQlhZGQsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsKnN2ICAlcjQsJXI1LCVyNgotCWFkZCwqb2QgICVyNCwlcjUsJXI2Ci0JYWRkLCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsKjw+ICAlcjQsJXI1LCVyNgotCWFkZCwqPj0gICVyNCwlcjUsJXI2Ci0JYWRkLCo+ICAlcjQsJXI1LCVyNgotCWFkZCwqdXYgICVyNCwlcjUsJXI2Ci0JYWRkLCp2bnogICVyNCwlcjUsJXI2Ci0JYWRkLCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLCpldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxsLCogICVyNCwlcjUsJXI2Ci0JYWRkLGwsKj0gICVyNCwlcjUsJXI2Ci0JYWRkLGwsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKjw9ICAlcjQsJXI1LCVyNgotCWFkZCxsLCpudXYgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKm9kICAlcjQsJXI1LCVyNgotCWFkZCxsLCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqPD4gICVyNCwlcjUsJXI2Ci0JYWRkLGwsKj49ICAlcjQsJXI1LCVyNgotCWFkZCxsLCo+ICAlcjQsJXI1LCVyNgotCWFkZCxsLCp1diAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqdm56ICAlcjQsJXI1LCVyNgotCWFkZCxsLCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKmV2ICAlcjQsJXI1LCVyNgotCi0JYWRkLHRzdiwqICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKj0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqPCAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCo8PSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCpudXYgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqem52ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKnN2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKm9kICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKnRyICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKjw+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKj49ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKj4gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqdXYgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqdm56ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKm5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCpldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxkYywqICAlcjQsJXI1LCVyNgotCWFkZCxkYywqPSAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCo8PSAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKm51diAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKnN2ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqb2QgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKjw+ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqPj0gICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCo+ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqdXYgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCp2bnogICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCpldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxkYyx0c3YsKiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsdHN2LCo9ICAlcjQsJXI1LCVyNgotCWFkZCxkYyx0c3YsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLHRzdiwqPD0gICVyNCwlcjUsJXI2Ci0JYWRkLGRjLHRzdiwqbnV2ICAlcjQsJXI1LCVyNgotCWFkZCxkYyx0c3YsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsdHN2LCpzdiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsdHN2LCpvZCAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCo8PiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCo+PSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCo+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsZGMsKnV2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsZGMsKnZueiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixkYywqZXYgICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDUxNzFjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGFkZCBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWFkZGkgIDEyMywlcjUsJXI2Ci0JYWRkaSw9ICAxMjMsJXI1LCVyNgotCWFkZGksPCAgMTIzLCVyNSwlcjYKLQlhZGRpLDw9ICAxMjMsJXI1LCVyNgotCWFkZGksbnV2ICAxMjMsJXI1LCVyNgotCWFkZGksem52ICAxMjMsJXI1LCVyNgotCWFkZGksc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRyICAxMjMsJXI1LCVyNgotCWFkZGksPD4gIDEyMywlcjUsJXI2Ci0JYWRkaSw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpLD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx1diAgMTIzLCVyNSwlcjYKLQlhZGRpLHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpLGV2ICAxMjMsJXI1LCVyNgotCi0JYWRkaW8gIDEyMywlcjUsJXI2Ci0JYWRkaW8sPSAgMTIzLCVyNSwlcjYKLQlhZGRpbyw8ICAxMjMsJXI1LCVyNgotCWFkZGlvLDw9ICAxMjMsJXI1LCVyNgotCWFkZGlvLG51diAgMTIzLCVyNSwlcjYKLQlhZGRpbyx6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaW8sc3YgIDEyMywlcjUsJXI2Ci0JYWRkaW8sb2QgIDEyMywlcjUsJXI2Ci0JYWRkaW8sdHIgIDEyMywlcjUsJXI2Ci0JYWRkaW8sPD4gIDEyMywlcjUsJXI2Ci0JYWRkaW8sPj0gIDEyMywlcjUsJXI2Ci0JYWRkaW8sPiAgMTIzLCVyNSwlcjYKLQlhZGRpbyx1diAgMTIzLCVyNSwlcjYKLQlhZGRpbyx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaW8sbnN2ICAxMjMsJXI1LCVyNgotCWFkZGlvLGV2ICAxMjMsJXI1LCVyNgotCi0JYWRkaXQgIDEyMywlcjUsJXI2Ci0JYWRkaXQsPSAgMTIzLCVyNSwlcjYKLQlhZGRpdCw8ICAxMjMsJXI1LCVyNgotCWFkZGl0LDw9ICAxMjMsJXI1LCVyNgotCWFkZGl0LG51diAgMTIzLCVyNSwlcjYKLQlhZGRpdCx6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaXQsc3YgIDEyMywlcjUsJXI2Ci0JYWRkaXQsb2QgIDEyMywlcjUsJXI2Ci0JYWRkaXQsdHIgIDEyMywlcjUsJXI2Ci0JYWRkaXQsPD4gIDEyMywlcjUsJXI2Ci0JYWRkaXQsPj0gIDEyMywlcjUsJXI2Ci0JYWRkaXQsPiAgMTIzLCVyNSwlcjYKLQlhZGRpdCx1diAgMTIzLCVyNSwlcjYKLQlhZGRpdCx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaXQsbnN2ICAxMjMsJXI1LCVyNgotCWFkZGl0LGV2ICAxMjMsJXI1LCVyNgotCi0JYWRkaXRvICAxMjMsJXI1LCVyNgotCWFkZGl0byw9ICAxMjMsJXI1LCVyNgotCWFkZGl0byw8ICAxMjMsJXI1LCVyNgotCWFkZGl0byw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sbnV2ICAxMjMsJXI1LCVyNgotCWFkZGl0byx6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHN2ICAxMjMsJXI1LCVyNgotCWFkZGl0byxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sdHIgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLDw+ICAxMjMsJXI1LCVyNgotCWFkZGl0byw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sdXYgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sbnN2ICAxMjMsJXI1LCVyNgotCWFkZGl0byxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGksdHN2ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LD0gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsPCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdiw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdixudXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3Ysem52ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHN2ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LG9kICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRyICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LDw+ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LD49ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3Ysdm56ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdixldiAgMTIzLCVyNSwlcjYKLQotCWFkZGksdGMgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyw9ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsPCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLDw9ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsbnV2ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsem52ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSx0YyxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHRyICAxMjMsJXI1LCVyNgotCWFkZGksdGMsPD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx1diAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLGV2ICAxMjMsJXI1LCVyNgotCi0JYWRkaSx0Yyx0c3YgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0c3YsPSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHRzdiw8ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsdHN2LDw9ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsdHN2LG51diAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHRzdix6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0c3Ysc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0c3Ysb2QgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsdHIgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsPD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsPj0gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsPiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdix0Yyx1diAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdix0Yyx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsbnN2ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRjLGV2ICAxMjMsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiMDY4NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM4NjQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyaXN0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19pbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImltZW0uczogaW50ZWdlciBtZW1vcnkgbG9hZHMgYW5kIHN0b3JlcyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImltZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA0ODlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMEM4MDEwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDQ0OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwQzgwMTA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDA5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDBDODAxMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyA2ODlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMEM5QTEyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDY0OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwQzlBMTI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgNjA5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDBDOUExMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCA0QzlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgNkM5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDBDODUwMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwQzg1MjA5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMEM4NTAwQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDBDODUyMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwQzg1MDA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMEM4NTIwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDBDODUwMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwQzg1MjA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMEM4NTAwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDBDODUyMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwQzg1MDAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMEM4NTIwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDBDODUwMTlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwQzg1MjE5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMEM4NTAxQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDBDODUyMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwQzg1MDFEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMEM4NTIxREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDBDODUwMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwQzg1MjFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMEM4MDEwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDBDODAzMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwQzgwMTBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMEM4MDEwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDBDODAzMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwQzgwMTA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMEM4MDEwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDBDODAzMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwQzgwMTAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMEM4MDExOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDBDODAzMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwQzgwMTFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMEM4MDExREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDBDODAzMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwQzgwMTFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMEM5QTEyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDBDOUEzMkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwQzlBMTJBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMEM5QTEyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDBDOUEzMjYwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwQzlBMTI2MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMEM5QTEyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDBDOUEzMjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwQzlBMTIyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMEM5QTEzODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDBDOUEzM0EwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwQzlBMTNBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMEM5QTEzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDBDOUExMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwQzlBMzMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMEM5QTEzMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDBDOUEzMzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19pbW1lZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbW1lZC5zOiBpbW1lZGlhdGUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbW1lZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDM3NUEwMDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyMzRERkJENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjhBREZCRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQgCi0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTg1RjFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEU4NUYxRkVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFODFGMUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRTgxRjFGREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEU4NUYzRkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBFODVGM0ZDRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRTg0NDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEU4NDQ0MDAyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBFODA0NDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTgwNDQwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEU4NDBDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBFODQwQzAwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRTA0MDQ0NkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEUwNDA0NDZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBFNDQwNDQ2Q1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRTQ0MDQ0NkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIENCNDQxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBDQjQ0M0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggQ0I0NDVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIENCNDQ3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBDQjQ0OUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgQ0I0NEJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IENCNDRERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBDQjQ0RkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgQ0I0NDFGQjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IENCNDQzRkFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBDQjQ0NUZBN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgQ0I0NDdGOUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIENCNDQ5Rjk3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBDQjQ0QkY4RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggQ0I0NERGODdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIENCNDRGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBDRjRBMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgQ0Y0QTNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IENGNEE1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBDRjRBN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgQ0Y0QTlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IENGNEFCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBDRjRBREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgQ0Y0QUZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIENGNEExRkI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBDRjRBM0ZBRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggQ0Y0QTVGQTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIENGNEE3RjlGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBDRjRBOUY5N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgQ0Y0QUJGOEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IENGNEFERjg3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBDRjRBRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgODA4MDFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDgwODAzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCA4MDgwNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgODA4MDdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDgwODA5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCA4MDgwQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggODA4MERGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDgwODBGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCA4ODgwMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgODg4MDNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDg4ODA1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyA4ODgwN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgODg4MDlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDg4ODBCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCA4ODgwREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgODg4MEZGN0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDgwODAxRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCA4MDgwM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggODA4MDVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDgwODA3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCA4MDgwOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgODA4MEJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDgwODBERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyA4MDgwRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgODg4MDFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDg4ODAzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCA4ODgwNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgODg4MDdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDg4ODA5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCA4ODgwQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggODg4MERGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDg4ODBGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCA4NDgwMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgODQ4MDVGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IDg0ODA3RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyA4NDgwOUZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgODQ4MEJGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IDg0ODBERkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCA4NDgwRkZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgOEM4MDFGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIDhDODAzRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCA4QzgwNUZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggOEM4MDdGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIDhDODA5RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCA4QzgwQkY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgOEM4MERGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IDhDODBGRTg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyA4NDgwMUY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODAgODQ4MDNGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg0IDg0ODA1RjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4OCA4NDgwN0Y2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgODQ4MDlGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTkwIDg0ODBCRjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5NCA4NDgwREY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTggODQ4MEZGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTljIDhDODAxRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhMCA4QzgwM0YzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTQgOEM4MDVGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE4IDhDODA3RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYyA4QzgwOUYxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgOEM4MEJGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI0IDhDODBERjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiOCA4QzgwRkYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYmMgQTA4MTFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWMwIEEwODEzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjNCBBMDgxNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzggQTA4MTdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNjIEEwODE5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkMCBBMDgxQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgQTA4MURGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ4IEEwODFGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYyBBODgxMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTAgQTg4MTNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU0IEE4ODE1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlOCBBODgxN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZWMgQTg4MTlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWYwIEE4ODFCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmNCBBODgxREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjggQTg4MUZGN0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWZjIEEwODExRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwMCBBMDgxM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDQgQTA4MTVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA4IEEwODE3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwYyBBMDgxOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTAgQTA4MUJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE0IEEwODFERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxOCBBMDgxRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMWMgQTg4MTFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjIwIEE4ODEzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyNCBBODgxNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjggQTg4MTdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjJjIEE4ODE5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzMCBBODgxQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzQgQTg4MURGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM4IEE4ODFGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzYyBBNDlGMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDAgQTQ5RjNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQ0IEE0OUY1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0OCBBNDlGN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNGMgQTQ5RjlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjUwIEE0OUZCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1NCBBNDlGREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTggQTQ5RkZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjVjIEFDOUYxRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2MCBBQzlGM0ZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjQgQUM5RjVGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjY4IEFDOUY3RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2YyBBQzlGOUY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzAgQUM5RkJGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjc0IEFDOUZERjg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3OCBBQzlGRkM4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyN2MgQTQ5RjFGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjgwIEE0OUYzRjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4NCBBNDlGNUY2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODggQTQ5RjdGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjhjIEE0OUY5RjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5MCBBNDlGQkY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTQgQTQ5RkRGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjk4IEE0OUZGRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5YyBBQzlGMUYzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTAgQUM5RjNGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmE0IEFDOUY1RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhOCBBQzlGN0YxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYWMgQUM5RjlGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmIwIEFDOUZCRjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiNCBBQzlGREYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjggQUM5RkZFRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmJjIEMwMDQ1RkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjMCBDMDA0REZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYzQgQzAwNDVGRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmM4IEMwMDRERkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjYyBDNEE0NUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyZDAgQzRBNERGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmQ0IEM0QTQ1RkM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJkOCBDNEE0REZCRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTgzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JyYW5jaDIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoMi5zOiBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2gyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQzAwNDVGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEMwMDRERkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBDMDA0NUZFN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQzAwNERGREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEMwMDQ3RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBDMDA0RkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQzAwNDdGQzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEMwMDRGRkJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBDNEE0N0ZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgQzRBNEZGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEM0QTQ3RkE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBDNEE0RkY5RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRTgwMDQwMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEU4MDA0MDBEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBFODAwNEY5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRTgwMDQwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEU4MDQ0MDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkLnM6IGFkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0ODcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEE3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDE3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDc3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDJGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDhGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0Q0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEVGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0M0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDVGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEJGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRERjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0REEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDA4QTQwRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCAwOEE0MkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggMDhBNDRFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDA4QTQ2RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCAwOEE0OEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgMDhBNEFFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDA4QTRDRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyAwOEE0RUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgMDhBNDFFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDA4QTQzRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCAwOEE0NUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgMDhBNDdFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDA4QTQ5RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCAwOEE0QkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggMDhBNERFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIDA4QTRGRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCAwOEE0MDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgMDhBNDI3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IDA4QTQ0NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyAwOEE0NjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgMDhBNDg3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IDA4QTRBNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCAwOEE0QzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgMDhBNEU3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIDA4QTQxNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCAwOEE0MzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggMDhBNDU3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIDA4QTQ3NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCAwOEE0OTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgMDhBNEI3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IDA4QTRENzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyAwOEE0RjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgMDhBNDBGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IDA4QTQyRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCAwOEE0NEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgMDhBNDZGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIDA4QTQ4RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCAwOEE0QUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggMDhBNENGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIDA4QTRFRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCAwOEE0MUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgMDhBNDNGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IDA4QTQ1RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyAwOEE0N0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgMDhBNDlGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IDA4QTRCRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCAwOEE0REYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgMDhBNEZGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE0NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hZGQyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZDIuczogYWRkMiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0EyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwOEE0MDcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDhBNDI3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDA4QTQ0NzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwOEE0NjcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMDhBNDg3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDA4QTRBNzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwOEE0QzcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMDhBNEU3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDA4QTQxNzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwOEE0MzcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMDhBNDU3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDA4QTQ3NzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAwOEE0OTcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMDhBNEI3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDA4QTRENzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAwOEE0RjcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMDhBNDBGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDA4QTQyRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAwOEE0NEYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMDhBNDZGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDA4QTQ4RjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAwOEE0QUYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMDhBNENGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDA4QTRFRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAwOEE0MUYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMDhBNDNGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDA4QTQ1RjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAwOEE0N0YyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMDhBNDlGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDA4QTRCRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAwOEE0REYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMDhBNEZGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTgwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoMWFkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaDFhZGQuczogc2gxYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2gxYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2gyYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoMmFkZC5zOiBzaDJhZGQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaDJhZGQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0E4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaDNhZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2gzYWRkLnM6IHNoM2FkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoM2FkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NobGFkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGxhZGQuczogc2hsYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hsYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMDhBNDA2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4QTQyNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAwOEE0NDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMDhBNDY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDA4QTQ4Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAwOEE0QTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMDhBNEM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDA4QTRFNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAwOEE0MTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMDhBNDM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDA4QTQ1Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAwOEE0NzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMDhBNDk2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDA4QTRCNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAwOEE0RDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMDhBNEY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDA4QTQwQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAwOEE0MkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMDhBNDRBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDA4QTQ2QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAwOEE0OEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMDhBNEFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDA4QTRDQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAwOEE0RUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgMDhBNDFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDA4QTQzQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAwOEE0NUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgMDhBNDdBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDA4QTQ5QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAwOEE0QkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggMDhBNERBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDA4QTRGQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCAwOEE0MEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgMDhBNDJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IDA4QTQ0RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyAwOEE0NkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgMDhBNDhFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IDA4QTRBRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCAwOEE0Q0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgMDhBNEVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIDA4QTQxRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCAwOEE0M0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggMDhBNDVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIDA4QTQ3RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCAwOEE0OUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgMDhBNEJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IDA4QTRERTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyAwOEE0RkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODAgMDhBNDA2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg0IDA4QTQyNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4OCAwOEE0NDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgMDhBNDY2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTkwIDA4QTQ4NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5NCAwOEE0QTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTggMDhBNEM2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTljIDA4QTRFNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhMCAwOEE0MTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTQgMDhBNDM2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE4IDA4QTQ1NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYyAwOEE0NzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgMDhBNDk2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI0IDA4QTRCNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiOCAwOEE0RDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYmMgMDhBNEY2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWMwIDA4QTQwQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjNCAwOEE0MkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzggMDhBNDRBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNjIDA4QTQ2QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkMCAwOEE0OEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgMDhBNEFBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ4IDA4QTRDQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYyAwOEE0RUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTAgMDhBNDFBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU0IDA4QTQzQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlOCAwOEE0NUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZWMgMDhBNDdBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWYwIDA4QTQ5QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmNCAwOEE0QkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjggMDhBNERBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWZjIDA4QTRGQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwMCAwOEE0MEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDQgMDhBNDJFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA4IDA4QTQ0RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwYyAwOEE0NkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTAgMDhBNDhFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE0IDA4QTRBRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxOCAwOEE0Q0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMWMgMDhBNEVFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjIwIDA4QTQxRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyNCAwOEE0M0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjggMDhBNDVFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjJjIDA4QTQ3RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzMCAwOEE0OUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzQgMDhBNEJFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM4IDA4QTRERUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzYyAwOEE0RkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTQ0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NobGFkZDIge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hsYWRkMi5zOiBzaGxhZGQyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hsYWRkMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0E2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0E2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0U2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MjZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDQ2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2NkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0ODZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEE2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RTZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDE2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NTZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDc2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5NkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QjZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEQ2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MEFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDJBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0QUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NkFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDhBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0Q0FBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEVBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0M0FBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDVBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3QUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OUFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEJBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTREQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RkFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NEVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4RUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1RUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0VBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0REVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDA4QTQwNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCAwOEE0MjZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggMDhBNDQ2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDA4QTQ2NkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCAwOEE0ODZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgMDhBNEE2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDA4QTRDNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyAwOEE0RTZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgMDhBNDE2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDA4QTQzNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCAwOEE0NTZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgMDhBNDc2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDA4QTQ5NkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCAwOEE0QjZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggMDhBNEQ2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIDA4QTRGNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCAwOEE0MEFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgMDhBNDJBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IDA4QTQ0QUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyAwOEE0NkFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgMDhBNDhBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IDA4QTRBQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCAwOEE0Q0FFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgMDhBNEVBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIDA4QTQxQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCAwOEE0M0FFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggMDhBNDVBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIDA4QTQ3QUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCAwOEE0OUFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgMDhBNEJBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IDA4QTREQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyAwOEE0RkFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgMDhBNDBFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IDA4QTQyRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCAwOEE0NEVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgMDhBNDZFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIDA4QTQ4RUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCAwOEE0QUVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggMDhBNENFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIDA4QTRFRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCAwOEE0MUVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgMDhBNDNFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IDA4QTQ1RUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyAwOEE0N0VFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgMDhBNDlFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IDA4QTRCRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCAwOEE0REVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgMDhBNEZFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE0NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDA1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNEM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0NzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDk1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0RDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0OEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDdEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDg0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0QzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0MzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRENEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0RENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDA4QTQwQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCAwOEE0MkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggMDhBNDRDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDA4QTQ2QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCAwOEE0OEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgMDhBNEFDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDA4QTRDQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyAwOEE0RUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgMDhBNDFDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDA4QTQzQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCAwOEE0NUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgMDhBNDdDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDA4QTQ5QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCAwOEE0QkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggMDhBNERDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIDA4QTRGQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCAwOEE0MDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgMDhBNDI1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IDA4QTQ0NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyAwOEE0NjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgMDhBNDg1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IDA4QTRBNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCAwOEE0QzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgMDhBNEU1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIDA4QTQxNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCAwOEE0MzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggMDhBNDU1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIDA4QTQ3NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCAwOEE0OTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgMDhBNEI1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IDA4QTRENTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyAwOEE0RjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgMDhBNDBEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IDA4QTQyRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCAwOEE0NEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgMDhBNDZEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIDA4QTQ4RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCAwOEE0QUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggMDhBNENEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIDA4QTRFRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCAwOEE0MUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgMDhBNDNEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IDA4QTQ1RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyAwOEE0N0QwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgMDhBNDlEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IDA4QTRCRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCAwOEE0REQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgMDhBNEZEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQwIDA4QTQwNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0NCAwOEE0MjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDggMDhBNDQ0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjRjIDA4QTQ2NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1MCAwOEE0ODRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTQgMDhBNEE0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjU4IDA4QTRDNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1YyAwOEE0RTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjAgMDhBNDE0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjY0IDA4QTQzNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2OCAwOEE0NTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNmMgMDhBNDc0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjcwIDA4QTQ5NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3NCAwOEE0QjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzggMDhBNEQ0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjdjIDA4QTRGNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4MCAwOEE0MENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODQgMDhBNDJDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjg4IDA4QTQ0Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4YyAwOEE0NkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTAgMDhBNDhDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjk0IDA4QTRBQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5OCAwOEE0Q0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOWMgMDhBNEVDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmEwIDA4QTQxQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhNCAwOEE0M0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTggMDhBNDVDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmFjIDA4QTQ3Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiMCAwOEE0OUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjQgMDhBNEJDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmI4IDA4QTREQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiYyAwOEE0RkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTc2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3N1YjIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViMi5zOiBzdWIyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3ViMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0MyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0MyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDA1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NDUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDY1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4NTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QTUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNEM1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MTUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDM1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1NTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0NzUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDk1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0RDUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEY1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MkQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDREMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2RDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0OEQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEFEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RUQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDFEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NUQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDdEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5RDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QkQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEREMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MDRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDI0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0NEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NjRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDg0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBNEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0QzRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEU0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxNEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0MzRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDU0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3NEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OTRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEI0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRENEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RjRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NENFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4Q0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUNFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUNFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1Q0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0NFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0RENFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTk2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRzLnM6IGRzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29tY2xyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbWNsci5zOiBjb21jbHIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21jbHIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0Njg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0Qzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0Mzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTREODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0Rjg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgOTBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDkwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCA5MEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgOTBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDkwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCA5MEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggOTBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDkwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCA5MEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgOTBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDkwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyA5MEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgOTBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDkwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCA5MEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgOTBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0RTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTQzMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0NTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDcyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTRGMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0MDI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDIyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ0Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0NjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEUyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTQxMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MzI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDUyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ3Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0RjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0NDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNDYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTRFMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0MTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDMyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ1MjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0NzIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTQwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0MjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDQwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQ2MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0RTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQzMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0NTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNDcwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRGMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb191bml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInVuaXQuczogdW5pdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInVuaXQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0NDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NjM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0ODM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0QzM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0RTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0MTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0NTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0NzM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0OTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0RDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0RjM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0MDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0NDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0Njk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0ODk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0Qzk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0RTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0MTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0Nzk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0OTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0RDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0Rjk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0NDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0ODlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0QzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0RTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0MTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0NTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0NzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0OTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0RDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0RjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0MDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0NDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0NjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0ODlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0QzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0RTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0MTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0NTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0NzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0OTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0RDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb191bml0MiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJ1bml0Mi5zOiB1bml0MiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInVuaXQyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDAzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDQzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDYzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDgzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNEMzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEUzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNDEzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNDUzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDczQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDkzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNEQzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNEYzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDA5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNDQ5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNDY5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNDg5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNEM5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNEU5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDE5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDU5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDc5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNDk5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNEQ5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEY5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDA5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDQ5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDY5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDg5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNEM5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEU5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNDE5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNDU5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDc5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDk5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNEQ5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNEY5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGNvciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkY29yLnM6IGRjb3IgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkY29yLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDg4MDBCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDg4MDRCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDg4MDZCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDg4MDhCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDg4MENCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDg4MEVCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDg4MDFCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDg4MDVCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDg4MDdCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDg4MDlCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDg4MERCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDg4MEZCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDg4MDBCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDg4MDRCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDg4MDZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDg4MDhCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDg4MENCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDg4MEVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDg4MDFCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDg4MDVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDg4MDdCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDg4MDlCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDg4MERCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDg4MEZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDg4MDBCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDg4MDRCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDg4MDZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDg4MDhCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDg4MENCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDg4MEVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDg4MDFCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDg4MDVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDg4MDdCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDg4MDlCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDg4MERCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDg4MEZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGNvcjIge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGNvcjIuczogZGNvcjIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkY29yMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4ODAwQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4ODA0QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4ODA2QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4ODA4QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4ODBDQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4ODBFQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4ODAxQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4ODA1QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4ODA3QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4ODA5QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4ODBEQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4ODBGQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4ODAwQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4ODA0QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4ODA2QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4ODA4QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4ODBDQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4ODBFQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4ODAxQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4ODA1QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4ODA3QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4ODA5QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4ODBEQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4ODBGQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FkZGkge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkaS5zOiBhZGRpIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkaS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEI0QTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBCNEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQjRBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEI0QTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBCNEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgQjRBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEI0QTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBCNEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgQjRBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEI0QTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBCNEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgQjRBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEI0QTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBCNEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggQjRBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEI0QTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBCNEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgQjRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEI0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBCNEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgQjRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEI0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBCNEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgQjRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEI0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBCNEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggQjRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEI0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBCNEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgQjRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEI0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBCNEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgQjBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEIwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBCMEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgQjBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEIwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBCMEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggQjBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEIwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBCMEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgQjBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEIwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBCMEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgQjBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEIwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBCMEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgQjBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEIwQTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBCMEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggQjBBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEIwQTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBCMEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgQjBBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEIwQTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBCMEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgQjBBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEIwQTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBCMEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgQjBBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEIwQTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBCMEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggQjBBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEIwQTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCBCNEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgQjRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEI0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyBCNEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgQjRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IEI0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCBCNEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgQjRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIEI0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCBCNEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggQjRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIEI0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCBCNEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgQjRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IEI0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyBCNEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgQjBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IEIwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCBCMEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgQjBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIEIwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCBCMEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggQjBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIEIwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCBCMEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgQjBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IEIwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyBCMEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgQjBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IEIwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCBCMEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgQjBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIEIwQTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCBCMEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggQjBBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIEIwQTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCBCMEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgQjBBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IEIwQTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyBCMEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgQjBBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IEIwQTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCBCMEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgQjBBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIEIwQTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCBCMEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggQjBBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIEIwQTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViaSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdWJpLnM6IHN1YmkgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWJpLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOTRBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDk0QTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA5NEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgOTRBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDk0QTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCA5NEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggOTRBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDk0QTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCA5NEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgOTRBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDk0QTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyA5NEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgOTRBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDk0QTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCA5NEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgOTRBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDk0QTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCA5NEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggOTRBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDk0QTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCA5NEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgOTRBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDk0QTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyA5NEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgOTRBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDk0QTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCA5NEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgOTRBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDk0QTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCA5NEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggOTRBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDk0QTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCA5NEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgOTRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDk0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyA5NEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgOTRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDk0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCA5NEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgOTRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDk0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCA5NEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggOTRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDk0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCA5NEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgOTRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDk0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyA5NEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQwQTQwMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQwQTQyMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQwQTQ0MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQwQTQ2MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQwQTQ4MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQwQTRBMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQwQTRDMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQwQTRFMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQwQTQwQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQwQTQyQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQwQTQ0QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQwQTQ2QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQwQTQ4QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQwQTRBQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQwQTRDQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQwQTRFQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoaWZ0MiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGlmdDIuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMEE0MDAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMEE0MjAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMEE0NDAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMEE0NjAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMEE0ODAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMEE0QTAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMEE0QzAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMEE0RTAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMEE0MEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMEE0MkI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMEE0NEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMEE0NkI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMEE0OEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMEE0QUI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMEE0Q0I0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMEE0RUI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGlmdDMge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQzLnM6IHNoaWZ0MyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoaWZ0My5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQwQTQwMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQwQTQyMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQwQTQ0MjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQwQTQ2MjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQwQTQ4MjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQwQTRBMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQwQTRDMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQwQTRFMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQwQTQwRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQwQTQyRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQwQTQ0RjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQwQTQ2RjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQwQTQ4RjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQwQTRBRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQwQTRDRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQwQTRFRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dHJhY3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0cmFjdC5zOiBleHRyYWN0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0cmFjdC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQwODYxOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQwODYzOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQwODY1OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQwODY3OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQwODY5OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQwODZCOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQwODZEOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQwODZGOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQwODYxQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQwODYzQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQwODY1Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQwODY3Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQwODY5Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQwODZCQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQwODZEQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQwODZGQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQwODYxMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQwODYzMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEQwODY1MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQwODY3MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQwODY5MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEQwODZCMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQwODZEMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQwODZGMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEQwODYxNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQwODYzNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQwODY1NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEQwODY3NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQwODY5NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQwODZCNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEQwODZENDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQwODZGNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dHJhY3QyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dHJhY3QyLnM6IGV4dHJhY3QyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0cmFjdDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMDg2MThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMDg2MzhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMDg2NThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMDg2NzhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMDg2OThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMDg2QjhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMDg2RDhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMDg2RjhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMDg2MUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMDg2M0NCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMDg2NUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMDg2N0NCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMDg2OUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMDg2QkNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMDg2RENCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMDg2RkNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBEMDg2MTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBEMDg2MzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBEMDg2NTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBEMDg2NzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBEMDg2OTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBEMDg2QjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBEMDg2RDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBEMDg2RjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBEMDg2MTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBEMDg2MzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBEMDg2NTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBEMDg2NzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBEMDg2OTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBEMDg2QjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBEMDg2RDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBEMDg2RjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRyYWN0MyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRyYWN0My5zOiBleHRyYWN0MyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dHJhY3QzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDg4NjAxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDg4NjIxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDg4NjQxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDg4NjYxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDg4NjgxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDg4NkExNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDg4NkMxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDg4NkUxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDg4NjA1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDg4NjI1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDg4NjQ1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDg4NjY1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDg4Njg1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDg4NkE1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDg4NkM1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDg4NkU1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDA4NjEyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDA4NjMyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDA4NjUyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDA4NjcyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDA4NjkyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDA4NkIyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDA4NkQyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDA4NkYyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDA4NjE2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDA4NjM2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDA4NjU2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDA4Njc2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDA4Njk2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDA4NkI2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDA4NkQ2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDA4NkY2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGVwb3NpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZXBvc2l0LnM6IGRlcG9zaXQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZXBvc2l0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDRDNDBCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDRDNDJCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDRDNDRCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDRDNDZCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDRDNDhCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDRDNEFCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDRDNENCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDRDNEVCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDRDNDBGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDRDNDJGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDRDNDRGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDRDNDZGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDRDNDhGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDRDNEFGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDRDNENGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDRDNEVGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDRDNDAwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDRDNDIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDRDNDQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDRDNDYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDRDNDgwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDRDNEEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDRDNEMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDRDNEUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDRDNDA0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDRDNDI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDRDNDQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDRDNDY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDRDNDg0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDRDNEE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDRDNEM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDRDNEU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRDRERjE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRDRERjM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggRDRERjU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRDRERjc0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRDRERjk0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgRDRERkI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRDRERkQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRDRERkY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgRDRERjEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRDRERjMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRDRERjUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgRDRERjcwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRDRERjkwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRDRERkIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggRDRERkQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRDRERkYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRDRERjFGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgRDRERjNGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRDRERjVGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRDRERjdGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgRDRERjlGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRDRERkJGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRDRERkRGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgRDRERkZGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRDRERjFCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgRDRERjNCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggRDRERjVCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRDRERjdCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRDRERjlCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgRDRERkJCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRDRERkRCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRDRERkZCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGVwb3NpdDIge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVwb3NpdDIuczogZGVwb3NpdDIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZXBvc2l0Mi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ0QzQwQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQ0QzQyQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ0QzQ0QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQ0QzQ2QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQ0QzQ4QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQ0QzRBQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQ0QzRDQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQ0QzRFQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQ0QzQwRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQ0QzQyRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQ0QzQ0RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQ0QzQ2RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQ0QzQ4RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQ0QzRBRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQ0QzRDRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQ0QzRFRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQ0QzQwMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQ0QzQyMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEQ0QzQ0MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQ0QzQ2MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQ0QzQ4MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEQ0QzRBMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQ0QzRDMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQ0QzRFMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEQ0QzQwNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQ0QzQyNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQ0QzQ0NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEQ0QzQ2NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQ0QzQ4NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQ0QzRBNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEQ0QzRDNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQ0QzRFNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEQ0REYxNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEQ0REYzNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEQ0REY1NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEQ0REY3NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEQ0REY5NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEQ0REZCNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEQ0REZENDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEQ0REZGNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEQ0REYxMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEQ0REYzMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEQ0REY1MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEQ0REY3MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEQ0REY5MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEQ0REZCMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEQ0REZEMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEQ0REZGMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEQ0REYxRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEQ0REYzRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEQ0REY1Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEQ0REY3Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEQ0REY5Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEQ0REZCRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEQ0REZERjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEQ0REZGRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEQ0REYxQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEQ0REYzQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEQ0REY1Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEQ0REY3Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEQ0REY5Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEQ0REZCQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEQ0REZEQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEQ0REZGQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTY0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2RlcG9zaXQzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRlcG9zaXQzLnM6IGRlcG9zaXQzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGVwb3NpdDMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMEM0MEFCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjBDNDJBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwQzQ0QUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGMEM0NkFCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjBDNDhBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYwQzRBQUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGMEM0Q0FCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjBDNEVBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwQzQwRUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGMEM0MkVCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjBDNDRFQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwQzQ2RUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGMEM0OEVCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRjBDNEFFQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEYwQzRDRUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBGMEM0RUVCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDRDNDAyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQ0QzQyMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBENEM0NDIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDRDNDYyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQ0QzQ4MjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBENEM0QTIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDRDNEMyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQ0QzRFMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBENEM0MDYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDRDNDI2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQ0QzQ0NjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBENEM0NjYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDRDNDg2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQ0QzRBNjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBENEM0QzYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDRDNEU2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEQ0REYxNjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBENERGMzYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggRDRERjU2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEQ0REY3NjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBENERGOTYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgRDRERkI2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEQ0REZENjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBENERGRjYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgRDRERjEyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEQ0REYzMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBENERGNTIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgRDRERjcyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEQ0REY5MjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBENERGQjIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggRDRERkQyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEQ0REZGMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBGNERGMEVCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgRjRERjJFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEY0REY0RUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyBGNERGNkVCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgRjRERjhFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEY0REZBRUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCBGNERGQ0VCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgRjRERkVFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEY0REYwQUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBGNERGMkFCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggRjRERjRBQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEY0REY2QUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCBGNERGOEFCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgRjRERkFBQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEY0REZDQUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBGNERGRUFCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3lzdGVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN5c3RlbS5zOiBzeXN0ZW0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzeXN0ZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAxODAwNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMEMwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwMDAwMENBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwMDA1MEQ2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwMDA1MEU2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwMDA0MTg2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwMEEwMTBBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwMDA0MTgyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwMTQ0MTg0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwMDAwMDRBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwMTQwMDhBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwMDAwMDQwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwMDEwMDQwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAxNDAwMDREMlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwNEE2MTE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwNEExMzE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwNEE2MTFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwNEExMzFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwNEE0MTM0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwNEE0MTM2NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwNEE0MTMwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwNEE0MTMyNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwNEE0MTMwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwNEE0MTA0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwNEE0MjA0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwNEE0MTAwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwNEE0MjAwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zeXN0ZW0yIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN5c3RlbTIuczogc3lzdGVtMiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN5c3RlbTIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMEMwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMENBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwMzlCMEQ2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwMzlCMEU2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwMTYwNDhBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwNEE2MTE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwNEExMzE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwNEE2MTFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwNEExMzFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3B1cmdlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInB1cmdlLnM6IHB1cmdlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVyZ2UucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwNEE0MTIwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwNEE0MTIyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNEE0MjIwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwNEE0MjIyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwNEE0MTI0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwNEE0MTI2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwNEE0MjI0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwNEE0MjI2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwNEE0MTM4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwNEE0MTNBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwNEE0MTI4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwNEE0MTJBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwNEE0MjI4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwNEE0MjJBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwNEE0MTJDMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwNEE0MTJFMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwNEE0MjJDMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwNEE0MjJFMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3B1cmdlMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXJnZTIuczogcHVyZ2UyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVyZ2UyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDRBNDE2MDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDRBNDE2MjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDRBNDI2MDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDRBNDI2MjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCi0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnBfbWlzYy5zOiBmcF9taXNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfbWlzYy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwMDAyNDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZtZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAiZm1lbS5zOiBmbWVtIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZm1lbS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDI0QTQwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNEE0MjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjRBNDAwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDI0QTQyMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAyQ0E0MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMkNBNDIwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDJDQTQwMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAyQ0E0MjAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMjRBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDI0QTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAyNEE0MDIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMjRBNDIyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDJDQTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAyQ0E0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMkNBNDAyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDJDQTQyMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzQ0E0MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgM0NBNDIyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDNDQTQwMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzQ0E0MjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMjRBMDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDI0QTAzMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAyNEEwMTAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMkNBMDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDJDQTAzMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAyQ0EwMTAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMjRBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDI0QTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAyNEEwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMkNBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDJDQTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAyQ0EwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgM0NBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDNDQTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzQ0EwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZnBfY29tcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcF9jb21wLnM6IGZwX2NvbXAgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcF9jb21wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzBBMDQwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwQTA0ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMEEwNTgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzI4MDQwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDMyODA0ODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMEEwNjAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMzBBMDY4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDMwQTA3ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMjgwNjAxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMzI4MDY4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDMwQTA4MDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMEEwODgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMzBBMDk4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDMyODA4MDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMjgwODgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMzBBMEEwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDMwQTBBODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMEEwQjgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMzI4MEEwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDMyODBBODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMDg4MDYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMzA4ODBFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDMwODgxRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMjk4MDYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMzI5ODBFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDMyOTgxRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMDg4MjYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMzA4ODJFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDMwODgzRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMjk4MjYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMzI5ODJFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDMyOTgzRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMDg4NDYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMzA4ODRFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDMwODg1RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMjk4NDYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMzI5ODRFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDMyOTg1RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMDg4NjYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMzA4ODZFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDMwODg3RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMjk4NjYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMzI5ODZFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDMyOTg3RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMDg4ODYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMzA4ODhFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDMwODg5RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMjk4ODYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMzI5ODhFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDMyOTg5RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAxODAxMjBFMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMUExMUE0RDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDk4MDEyMEUyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCA5QTExQTREMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMzg4NTQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTU1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX2NvbXAyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2NvbXAyLnM6IGZwX2NvbXAyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfY29tcDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBCOEFBNjM4RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQjhBQTZBMEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEJBNUIyNTk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBCQTVCMkMxNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQjhBQTYzQUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEI4QUE2QTJFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBCQTVCMjVCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQkE1QjJDMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDM4QTBDMDRBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMEEwQzgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzBBMEQ4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDNBODBDMDk4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMjgwQzgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzhBMEUwNEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDMwQTBFODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMEEwRjgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgM0E4MEUwOThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDMyODBFODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9jb252IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2NvbnYuczogZnBfY29udiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2NvbnYucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMEEwMDIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzBBMDIyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwQTA2MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMEEwMEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMzBBMDJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDMwQTA2QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMEEwMUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMzBBMDNBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDMwQTA3QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMjgwMDIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzI4MDIyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDMyODA2MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMjgwMEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzI4MDJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDMyODA2QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMjgwMUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMzI4MDNBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDMyODA3QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMEEwODIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMzBBMEEyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDMwQTBFMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMEEwOEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMzBBMEFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDMwQTBFQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMEEwOUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMzBBMEJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDMwQTBGQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMjgwODIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMzI4MEEyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDMyODBFMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMjgwOEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMzI4MEFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDMyODBFQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMjgwOUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMzI4MEJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDMyODBGQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMEExMDIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMzBBMTIyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDMwQTE2MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMEExMEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMzBBMTJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDMwQTE2QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMEExMUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMzBBMTNBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDMwQTE3QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMjgxMDIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMzI4MTIyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDMyODE2MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMjgxMEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMzI4MTJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDMyODE2QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAzMjgxMUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMzI4MTNBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDMyODE3QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzMEExODIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMzBBMUEyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDMwQTFFMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAzMEExOEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMzBBMUFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDMwQTFFQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAzMEExOUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMzBBMUJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDMwQTFGQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAzMjgxODIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMzI4MUEyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDMyODFFMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAzMjgxOEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMzI4MUFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDMyODFFQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAzMjgxOUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMzI4MUJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDMyODFGQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT03Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9mY21wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2ZjbXAuczogZnBfZmNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2ZjbXAucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDg1MDQwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMDg1MDQwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMDg1MDQwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMDg1MDQwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAzMDg1MDQwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMDg1MDQwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMDg1MDQwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAzMDg1MDQwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMDg1MDQwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMDg1MDQwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAzMDg1MDQwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMDg1MDQwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMDg1MDQwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAzMDg1MDQwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMDg1MDQwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMDg1MDQwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzMDg1MDQxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMDg1MDQxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMDg1MDQxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzMDg1MDQxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMDg1MDQxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMDg1MDQxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAzMDg1MDQxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMDg1MDQxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMDg1MDQxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAzMDg1MDQxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMDg1MDQxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMDg1MDQxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAzMDg1MDQxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMDg1MDQxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMDg1MDQxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAzMDg1MDQxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMDg1MEMwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMDg1MEMwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzMDg1MEMwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMDg1MEMwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMDg1MEMwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAzMDg1MEMwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMDg1MEMwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMDg1MEMwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAzMDg1MEMwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMDg1MEMwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMDg1MEMwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAzMDg1MEMwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMDg1MEMwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMDg1MEMwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAzMDg1MEMwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMDg1MEMwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMDg1MEMxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAzMDg1MEMxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAzMDg1MEMxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAzMDg1MEMxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAzMDg1MEMxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAzMDg1MEMxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzMDg1MEMxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAzMDg1MEMxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAzMDg1MEMxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAzMDg1MEMxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAzMDg1MEMxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAzMDg1MEMxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAzMDg1MEMxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAzMDg1MEMxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAzMDg1MEMxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAzMDg1MEMxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAzMDg1MUMwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAzMDg1MUMwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAzMDg1MUMwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAzMDg1MUMwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAzMDg1MUMwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAzMDg1MUMwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAzMDg1MUMwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAzMDg1MUMwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAzMDg1MUMwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAzMDg1MUMwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAzMDg1MUMwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAzMDg1MUMwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAzMDg1MUMwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAzMDg1MUMwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAzMDg1MUMwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAzMDg1MUMwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCAzMDg1MUMxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAzMDg1MUMxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAzMDg1MUMxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyAzMDg1MUMxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAzMDg1MUMxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAzMDg1MUMxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCAzMDg1MUMxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAzMDg1MUMxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAzMDg1MUMxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCAzMDg1MUMxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAzMDg1MUMxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAzMDg1MUMxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCAzMDg1MUMxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAzMDg1MUMxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAzMDg1MUMxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyAzMDg1MUMxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05Nl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tZWRpYSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtZWRpYS5zOiBtZWRpYSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1lZGlhLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDk2NzAzQ0NcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDk2NzAzNENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDk2NzAzMENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDk2NzAyQ0NcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjgwNzhCNEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDk2NzA3NENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDk2NzA3OENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDk2NzA3Q0NcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjhFMENGNEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjhFMENGNEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjhFMENCNEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDk2NzA1NENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDk2NzA1OENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDk2NzA1Q0NcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMEFDRTAxQzlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMEFDRTAxNDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMEFDRTAxMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRkFDRTg0MDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkFDRUM0MDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRkFDRTgwMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRkFDRUMwMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRkFENjBFNDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRkFENjRBODlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRkFENjYzMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3BlY2lhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzcGVjaWFsLnM6IHNwZWNpYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzcGVjaWFsLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDRBNDE2ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA0QTQxNkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNEE0MUE4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDRBNDFBQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcGVyZiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwZXJmLnM6IHBlcmYgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJwZXJmLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLQotICAgICMgVGhlIHRoaXJkIG9uZSBpcyBxdWVzdGlvbmFibGUuICBIUCBhcyBkb2Vzbid0IGdlbmVyYXRlIHdoYXQgdGhlIGJvb2sKLSAgICAjIHNheXMuICBJdCBvdXRwdXRzIHRoZSBudWxsaWZ5IGZsYWcgYXQgMzAgaW5zdGVhZC4KLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDAwMDY4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzAwMDAyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwMDAwMkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3Nwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAic3BvcC5zOiBzcG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgICMgVGhpcyB0aWNrbGVzIGEgYnVnIGluIHRoZSBleHByZXNzaW9uIHBhcnNlci4KLSAgICBnYXNfc3RhcnQgInNwb3AucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAxMDAwMDEwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMTAwMDE5MTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDEwMDAwMTI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAxMDAwMTkzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMTAwMDJCMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDEwMDM5QjA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAxMDAwMkIyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMTAwMzlCMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDEwQTAwNTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAxMEEwMUQxM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMTBBMDA1MjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDEwQTAxRDMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAxMEM1MDcwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMTBDNTFGMTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDEwQzUwNzI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAxMEM1MUYzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29wciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb3ByLnM6IGNvcHIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb3ByLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzAwMDAxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwMDAwNzEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMDAwMDEyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzAwMDA3MzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29wcm1lbSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb3BybWVtLnM6IGNvcHIgbWVtb3J5IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29wcm1lbS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDI0ODUwMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNDg1MjExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjQ4NTAxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDI0ODUyMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAyQzg1MDExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMkM4NTIxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDJDODUwMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAyQzg1MjEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMjQ4NTAzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDI0ODUyMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAyNDg1MDMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMjQ4NTIzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDJDODUwMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAyQzg1MjMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMkM4NTAzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDJDODUyMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAyNDgwMTExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMjQ4MDMxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDI0ODAxMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAyQzgwMTExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMkM4MDMxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDJDODAxMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAyNDgwMTMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMjQ4MDMzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDI0ODAxMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAyQzgwMTMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMkM4MDMzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDJDODAxMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mbWVtX0xSX3Rlc3RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZtZW1MUmJ1Zy5zOiBMUiByZWdpc3RlciBzZWxlY3Rpb24gb24gZnAgbWVtIGluc3RydWN0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZtZW1MUmJ1Zy5zIiAiLWFsIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgY29ycmVjdGx5IGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuIAotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNzQwMTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjc0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI3NTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyRjQwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkY0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJGNTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyNzQwMTA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMjc0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI3NTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyRjQwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMkY0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDJGNTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyNzQwMTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMjc0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDI3NTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyRjQwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMkY0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDJGNTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAyNzQwMTA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMjc0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDI3NTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyRjQwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMkY0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDJGNTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyNzU5MDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMjc1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAyNzU5MDA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMjc1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAyNzU5MDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMjc1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAyNzU5MDA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMjc1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBFODQwQzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTUwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19pbWVtCi0gICAgZG9faW1tZWQKLSAgICBkb19icmFuY2gKLSAgICBkb19hZGQKLSAgICBkb19hZGQyCi0gICAgZG9fc2gxYWRkCi0gICAgZG9fc2gyYWRkCi0gICAgZG9fc2gzYWRkCi0gICAgZG9fc2hsYWRkCi0gICAgZG9fc2hsYWRkMgotICAgIGRvX3N1YgotICAgIGRvX3N1YjIKLSAgICBkb19kcwotICAgIGRvX2NvbWNscgotICAgIGRvX2xvZ2ljYWwKLSAgICBkb191bml0Ci0gICAgZG9fdW5pdDIKLSAgICBkb19kY29yCi0gICAgZG9fZGNvcjIKLSAgICBkb19hZGRpCi0gICAgZG9fc3ViaQotICAgIGRvX3NoaWZ0Ci0gICAgZG9fc2hpZnQyCi0gICAgZG9fc2hpZnQzCi0gICAgZG9fZXh0cmFjdAotICAgIGRvX2V4dHJhY3QyCi0gICAgZG9fZXh0cmFjdDMKLSAgICBkb19kZXBvc2l0Ci0gICAgZG9fZGVwb3NpdDIKLSAgICBkb19kZXBvc2l0MwotICAgIGRvX3N5c3RlbQotICAgIGRvX3N5c3RlbTIKLSAgICBkb19wdXJnZQotICAgIGRvX3B1cmdlMgotICAgIGRvX2ZwX21pc2MKLSAgICBkb19mbWVtCi0gICAgZG9fZnBfY29tcAotICAgIGRvX2ZwX2NvbnYKLSAgICBkb19mcF9mY21wCi0gICAgZG9fc3BlY2lhbAotICAgIGRvX3BlcmYKLSAgICBkb19zcG9wCi0gICAgZG9fY29wcgotICAgIGRvX2NvcHJtZW0KLQotICAgICMgVGhlICJ3ZWlyZC5zIiBmaWxlIGZyb20gdGhlIGdkYiB0ZXN0c3VpdGUuICBTaW1wbHkgdmVyaWZ5IGl0Ci0gICAgIyBhc3NlbWJsZXMuCi0gICAgZ2FzX3Rlc3QgIndlaXJkLnMiICIiICIiICJzdGFicyBwYXJzaW5nIgotCi0gICAgIyBUZXN0IHRoYXQgd2UgY29ycmVjdGx5IGFzc2VtYmxlIHNvbWUgRlAgbWVtb3J5IHRlc3RzIHdoaWNoCi0gICAgIyBML1IgcmVnaXN0ZXIgc2VsZWN0cy4gIChSZWdyZXNzaW9uIHRlc3QgZm9yIGEgYnVnIFRlZ2UgZm91bmQpLgotICAgIGRvX2ZtZW1fTFJfdGVzdHMKLQotICAgICMgUEEyLjAgdGVzdHMKLSAgICBkb19mcF9jb21wMgotICAgIGRvX2JyYW5jaDIKLSAgICBkb19tZWRpYQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNDk2MTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucworKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBNb3JlIGJyYW5jaGluZyBpbnN0cnVjdGlvbnMgdGhhbiB5b3UgZXZlciBrbmV3IHdoYXQgdG8gZG8gd2l0aC4KLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotYnJhbmNoX3Rlc3RzOiAKLQlibCBicmFuY2hfdGVzdHMsJXIyCi0JYmwsbiBicmFuY2hfdGVzdHMsJXIyCi0JYiBicmFuY2hfdGVzdHMKLQliLG4gYnJhbmNoX3Rlc3RzCi0JZ2F0ZSBicmFuY2hfdGVzdHMsJXIyCi0JZ2F0ZSxuIGJyYW5jaF90ZXN0cywlcjIKLQlibHIgJXI0LCVyMgotCWJscixuICVyNCwlcjIKLQlibHIgJXI0LCVyMAotCWJscixuICVyNCwlcjAKLQlidiAlcjAoJXIyKQotCWJ2LG4gJXIwKCVyMikKLQliZSAweDEyMzQoJXNyMSwlcjIpCi0JYmUsbiAweDEyMzQoJXNyMSwlcjIpCi0JYmxlIDB4MTIzNCglc3IxLCVyMikKLQlibGUsbiAweDEyMzQoJXNyMSwlcjIpCi0KLW1vdmJfdGVzdHM6IAotCW1vdmIgJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPSAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLG9kICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLHRyICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDw+ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD49ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLGV2ICVyNCwlcjI2LG1vdmJfdGVzdHMKLW1vdmJfbnVsbGlmaWVkX3Rlc3RzOiAKLQltb3ZiLG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPSxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDwsbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixvZCxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLHRyLG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPD4sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw+PSxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLGV2LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCi1tb3ZpYl90ZXN0czogCi0JbW92aWIgNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPSA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLG9kIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLHRyIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLDw+IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD49IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLGV2IDUsJXIyNixtb3ZpYl90ZXN0cwotbW92aWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQltb3ZpYixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD0sbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsb2QsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYix0cixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLDw+LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPj0sbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixldixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCi1jb21iX3Rlc3RzOiAKLQljb21iICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDwgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDw9ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsc3YgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixvZCAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHRyICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+Pj0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+PiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG5zdiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLGV2ICVyMCwlcjQsY29tYl90ZXN0cwotY29tYl9udWxsaWZpZWRfdGVzdHM6IAotCWNvbWIsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDwsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PCxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixzdixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsb2QsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHRyLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4+PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG5zdixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsZXYsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQotY29taWJfdGVzdHM6IAotCWNvbWliIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPCAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw9IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDwgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PD0gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixzdiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG9kIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsdHIgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD49IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsbnN2IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsZXYgMCwlcjQsY29tYl90ZXN0cwotCi1jb21pYl9udWxsaWZpZWRfdGVzdHM6IAotCWNvbWliLG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw9LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDwsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsc3YsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG9kLG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYix0cixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD4sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD49LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+Pj0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixuc3YsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLGV2LG4gMCwlcjQsY29taWJfdGVzdHMKLQotCi0KLWFkZGJfdGVzdHM6IAotCWFkZGIgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw9ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPCAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw9ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnV2ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsem52ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsc3YgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixvZCAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHRyICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPD4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+PSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix1diAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHZueiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG5zdiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLGV2ICVyMSwlcjQsYWRkYl90ZXN0cwotYWRkYl9udWxsaWZpZWRfdGVzdHM6IAotCWFkZGIsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD0sbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDwsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw9LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixudXYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHpudixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsc3YsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG9kLG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix0cixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPD4sbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD49LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix1dixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdm56LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixuc3YsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLGV2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0KLWFkZGliX3Rlc3RzOiAKLQlhZGRpYiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw9IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDwgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD0gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnV2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHpudiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixzdiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixvZCAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix0ciAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8PiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+PSAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHV2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHZueiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixuc3YgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsZXYgLTEsJXI0LGNvbWJfdGVzdHMKLQotYWRkaWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQlhZGRpYixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD0sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD0sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixudXYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix6bnYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixzdixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG9kLG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdHIsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8PixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD49LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdm56LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnN2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsZXYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQotCi07IE5lZWRzIHRvIGNoZWNrIGxvdHMgb2Ygc3R1ZmYgKGxpa2UgY29ybmVyIGJpdCBjYXNlcykKLWJiX3Rlc3RzOiAKLQlidmIsPCAlcjQsYmJfdGVzdHMKLQlidmIsPj0gJXI0LGJiX3Rlc3RzCi0JYnZiLDwsbiAlcjQsYmJfdGVzdHMKLQlidmIsPj0sbiAlcjQsYmJfdGVzdHMKLQliYiw8ICVyNCw1LGJiX3Rlc3RzCi0JYmIsPj0gJXI0LDUsYmJfdGVzdHMKLQliYiw8LG4gJXI0LDUsYmJfdGVzdHMKLQliYiw+PSxuICVyNCw1LGJiX3Rlc3RzCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUwYmQ1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IE1vcmUgYnJhbmNoaW5nIGluc3RydWN0aW9ucyB0aGFuIHlvdSBldmVyIGtuZXcgd2hhdCB0byBkbyB3aXRoLgotOyBQQSAyLjAgdmVyc2lvbnMgYW5kIG5ldyBzeW50YXguCi0KLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi1iYl90ZXN0czoJCi0JYmIsPCAlcjQsJXNhcixiYl90ZXN0cwotCWJiLD49ICVyNCwlc2FyLGJiX3Rlc3RzCi0JYmIsPCxuICVyNCwlY3IxMSxiYl90ZXN0cwotCWJiLD49LG4gJXI0LCVjcjExLGJiX3Rlc3RzCi0JYmIsKjwgJXI0LCVzYXIsYmJfdGVzdHMKLQliYiwqPj0gJXI0LCVzYXIsYmJfdGVzdHMKLQliYiwqPCxuICVyNCwlY3IxMSxiYl90ZXN0cwotCWJiLCo+PSxuICVyNCwlY3IxMSxiYl90ZXN0cwotCWJiLCo8ICVyNCw1LGJiX3Rlc3RzCi0JYmIsKj49ICVyNCw1LGJiX3Rlc3RzCi0JYmIsKjwsbiAlcjQsNSxiYl90ZXN0cwotCWJiLCo+PSxuICVyNCw1LGJiX3Rlc3RzCi0JCi1icmFuY2hfc3RhY2s6CQotCWNscmJ0cwotCXBvcGJ0cyAxCi0JcG9wYnRzIDQ5OQotCXB1c2hub20KLQlwdXNoYnRzICVyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvbWNsci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiZmJhZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvbWNsci5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQljb21jbHIgJXI0LCVyNSwlcjYKLQljb21jbHIsPSAlcjQsJXI1LCVyNgotCWNvbWNsciw8ICVyNCwlcjUsJXI2Ci0JY29tY2xyLDw9ICVyNCwlcjUsJXI2Ci0JY29tY2xyLDw8ICVyNCwlcjUsJXI2Ci0JY29tY2xyLDw8PSAlcjQsJXI1LCVyNgotCWNvbWNscixzdiAlcjQsJXI1LCVyNgotCWNvbWNscixvZCAlcjQsJXI1LCVyNgotCWNvbWNscix0ciAlcjQsJXI1LCVyNgotCWNvbWNsciw8PiAlcjQsJXI1LCVyNgotCWNvbWNsciw+PSAlcjQsJXI1LCVyNgotCWNvbWNsciw+ICVyNCwlcjUsJXI2Ci0JY29tY2xyLD4+PSAlcjQsJXI1LCVyNgotCWNvbWNsciw+PiAlcjQsJXI1LCVyNgotCWNvbWNscixuc3YgJXI0LCVyNSwlcjYKLQljb21jbHIsZXYgJXI0LCVyNSwlcjYKLQotCWNvbWljbHIgMTIzLCVyNSwlcjYKLQljb21pY2xyLD0gMTIzLCVyNSwlcjYKLQljb21pY2xyLDwgMTIzLCVyNSwlcjYKLQljb21pY2xyLDw9IDEyMywlcjUsJXI2Ci0JY29taWNsciw8PCAxMjMsJXI1LCVyNgotCWNvbWljbHIsPDw9IDEyMywlcjUsJXI2Ci0JY29taWNscixzdiAxMjMsJXI1LCVyNgotCWNvbWljbHIsb2QgMTIzLCVyNSwlcjYKLQljb21pY2xyLHRyIDEyMywlcjUsJXI2Ci0JY29taWNsciw8PiAxMjMsJXI1LCVyNgotCWNvbWljbHIsPj0gMTIzLCVyNSwlcjYKLQljb21pY2xyLD4gMTIzLCVyNSwlcjYKLQljb21pY2xyLD4+PSAxMjMsJXI1LCVyNgotCWNvbWljbHIsPj4gMTIzLCVyNSwlcjYKLQljb21pY2xyLG5zdiAxMjMsJXI1LCVyNgotCWNvbWljbHIsZXYgMTIzLCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3ByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxNDZhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHIucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWNvcHJfdGVzdHM6IAotCWNvcHIsNCw1Ci0JY29wciw0LDExNQotCWNvcHIsNCw1LG4KLQljb3ByLDQsMTE1LG4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDU2Y2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBjb3ByIG1lbW9yeSB0ZXN0cyB3aGljaCBhbHNvIHRlc3QgdGhlIHZhcmlvdXMgCi07IGFkZHJlc3NpbmcgbW9kZXMgYW5kIGNvbXBsZXRlcnMuCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLTsgCi1jb3ByX2luZGV4aW5nX2xvYWQgCi0KLQljbGR3eCw0ICVyNSglc3IwLCVyNCksJXIyNgotCWNsZHd4LDQscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGR3eCw0LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3gsNCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0ICVyNSglc3IwLCVyNCksJXIyNgotCWNsZGR4LDQscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQotY29wcl9pbmRleGluZ19zdG9yZSAKLQljc3R3eCw0ICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdHd4LDQscyAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3R3eCw0LG0gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0d3gsNCxzbSAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0ICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdGR4LDQscyAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0LG0gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCxzbSAlcjI2LCVyNSglc3IwLCVyNCkKLQotY29wcl9zaG9ydF9tZW1vcnkgCi0JY2xkd3MsNCAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3MsNCxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3MsNCxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JY3N0d3MsNCAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0d3MsNCxtYiAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0d3MsNCxtYSAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCxtYiAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCxtYSAlcjI2LDAoJXNyMCwlcjQpCi0KLTsgZ2FzIGZ1Y2tzIHRoaXMgdXAgdGhpbmtzIGl0IGdldHMgdGhlIGV4cHJlc3Npb24gNCBtb2R1bG8gNQotOwljbGR3eCw0ICVyNSgwLCVyNCksJXIlcjI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWJmYzNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvci5zCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgZGVjaW1hbCBjb3JyZWN0aW9uIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlkY29yICVyNCwlcjUKLQlkY29yLHNieiAlcjQsJXI1Ci0JZGNvcixzaHogJXI0LCVyNQotCWRjb3Isc2RjICVyNCwlcjUKLQlkY29yLHNiYyAlcjQsJXI1Ci0JZGNvcixzaGMgJXI0LCVyNQotCWRjb3IsdHIgJXI0LCVyNQotCWRjb3IsbmJ6ICVyNCwlcjUKLQlkY29yLG5oeiAlcjQsJXI1Ci0JZGNvcixuZGMgJXI0LCVyNQotCWRjb3IsbmJjICVyNCwlcjUKLQlkY29yLG5oYyAlcjQsJXI1Ci0KLQlpZGNvciAlcjQsJXI1Ci0JaWRjb3Isc2J6ICVyNCwlcjUKLQlpZGNvcixzaHogJXI0LCVyNQotCWlkY29yLHNkYyAlcjQsJXI1Ci0JaWRjb3Isc2JjICVyNCwlcjUKLQlpZGNvcixzaGMgJXI0LCVyNQotCWlkY29yLHRyICVyNCwlcjUKLQlpZGNvcixuYnogJXI0LCVyNQotCWlkY29yLG5oeiAlcjQsJXI1Ci0JaWRjb3IsbmRjICVyNCwlcjUKLQlpZGNvcixuYmMgJXI0LCVyNQotCWlkY29yLG5oYyAlcjQsJXI1Ci0KLQlkY29yLGkgJXI0LCVyNQotCWRjb3IsaSxzYnogJXI0LCVyNQotCWRjb3IsaSxzaHogJXI0LCVyNQotCWRjb3IsaSxzZGMgJXI0LCVyNQotCWRjb3IsaSxzYmMgJXI0LCVyNQotCWRjb3IsaSxzaGMgJXI0LCVyNQotCWRjb3IsaSx0ciAlcjQsJXI1Ci0JZGNvcixpLG5ieiAlcjQsJXI1Ci0JZGNvcixpLG5oeiAlcjQsJXI1Ci0JZGNvcixpLG5kYyAlcjQsJXI1Ci0JZGNvcixpLG5iYyAlcjQsJXI1Ci0JZGNvcixpLG5oYyAlcjQsJXI1Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvcjIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvcjIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkZGMxZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEyLjAgZGVjaW1hbCBjb3JyZWN0aW9uIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlkY29yLCogJXI0LCVyNQotCWRjb3IsKnNieiAlcjQsJXI1Ci0JZGNvciwqc2h6ICVyNCwlcjUKLQlkY29yLCpzZGMgJXI0LCVyNQotCWRjb3IsKnNiYyAlcjQsJXI1Ci0JZGNvciwqc2hjICVyNCwlcjUKLQlkY29yLCp0ciAlcjQsJXI1Ci0JZGNvciwqbmJ6ICVyNCwlcjUKLQlkY29yLCpuaHogJXI0LCVyNQotCWRjb3IsKm5kYyAlcjQsJXI1Ci0JZGNvciwqbmJjICVyNCwlcjUKLQlkY29yLCpuaGMgJXI0LCVyNQotCi0JZGNvcixpLCogJXI0LCVyNQotCWRjb3IsaSwqc2J6ICVyNCwlcjUKLQlkY29yLGksKnNoeiAlcjQsJXI1Ci0JZGNvcixpLCpzZGMgJXI0LCVyNQotCWRjb3IsaSwqc2JjICVyNCwlcjUKLQlkY29yLGksKnNoYyAlcjQsJXI1Ci0JZGNvcixpLCp0ciAlcjQsJXI1Ci0JZGNvcixpLCpuYnogJXI0LCVyNQotCWRjb3IsaSwqbmh6ICVyNCwlcjUKLQlkY29yLGksKm5kYyAlcjQsJXI1Ci0JZGNvcixpLCpuYmMgJXI0LCVyNQotCWRjb3IsaSwqbmhjICVyNCwlcjUKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhN2RjYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQucworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JemRlcCAlcjQsNSwxMCwlcjYKLQl6ZGVwLD0gJXI0LDUsMTAsJXI2Ci0JemRlcCw8ICVyNCw1LDEwLCVyNgotCXpkZXAsb2QgJXI0LDUsMTAsJXI2Ci0JemRlcCx0ciAlcjQsNSwxMCwlcjYKLQl6ZGVwLDw+ICVyNCw1LDEwLCVyNgotCXpkZXAsPj0gJXI0LDUsMTAsJXI2Ci0JemRlcCxldiAlcjQsNSwxMCwlcjYKLQotCWRlcCAlcjQsNSwxMCwlcjYKLQlkZXAsPSAlcjQsNSwxMCwlcjYKLQlkZXAsPCAlcjQsNSwxMCwlcjYKLQlkZXAsb2QgJXI0LDUsMTAsJXI2Ci0JZGVwLHRyICVyNCw1LDEwLCVyNgotCWRlcCw8PiAlcjQsNSwxMCwlcjYKLQlkZXAsPj0gJXI0LDUsMTAsJXI2Ci0JZGVwLGV2ICVyNCw1LDEwLCVyNgotCi0JenZkZXAgJXI0LDUsJXI2Ci0JenZkZXAsPSAlcjQsNSwlcjYKLQl6dmRlcCw8ICVyNCw1LCVyNgotCXp2ZGVwLG9kICVyNCw1LCVyNgotCXp2ZGVwLHRyICVyNCw1LCVyNgotCXp2ZGVwLDw+ICVyNCw1LCVyNgotCXp2ZGVwLD49ICVyNCw1LCVyNgotCXp2ZGVwLGV2ICVyNCw1LCVyNgotCi0JdmRlcCAlcjQsNSwlcjYKLQl2ZGVwLD0gJXI0LDUsJXI2Ci0JdmRlcCw8ICVyNCw1LCVyNgotCXZkZXAsb2QgJXI0LDUsJXI2Ci0JdmRlcCx0ciAlcjQsNSwlcjYKLQl2ZGVwLDw+ICVyNCw1LCVyNgotCXZkZXAsPj0gJXI0LDUsJXI2Ci0JdmRlcCxldiAlcjQsNSwlcjYKLQotCXZkZXBpIC0xLDUsJXI2Ci0JdmRlcGksPSAtMSw1LCVyNgotCXZkZXBpLDwgLTEsNSwlcjYKLQl2ZGVwaSxvZCAtMSw1LCVyNgotCXZkZXBpLHRyIC0xLDUsJXI2Ci0JdmRlcGksPD4gLTEsNSwlcjYKLQl2ZGVwaSw+PSAtMSw1LCVyNgotCXZkZXBpLGV2IC0xLDUsJXI2Ci0KLQl6dmRlcGkgLTEsNSwlcjYKLQl6dmRlcGksPSAtMSw1LCVyNgotCXp2ZGVwaSw8IC0xLDUsJXI2Ci0JenZkZXBpLG9kIC0xLDUsJXI2Ci0JenZkZXBpLHRyIC0xLDUsJXI2Ci0JenZkZXBpLDw+IC0xLDUsJXI2Ci0JenZkZXBpLD49IC0xLDUsJXI2Ci0JenZkZXBpLGV2IC0xLDUsJXI2Ci0KLQlkZXBpIC0xLDQsMTAsJXI2Ci0JZGVwaSw9IC0xLDQsMTAsJXI2Ci0JZGVwaSw8IC0xLDQsMTAsJXI2Ci0JZGVwaSxvZCAtMSw0LDEwLCVyNgotCWRlcGksdHIgLTEsNCwxMCwlcjYKLQlkZXBpLDw+IC0xLDQsMTAsJXI2Ci0JZGVwaSw+PSAtMSw0LDEwLCVyNgotCWRlcGksZXYgLTEsNCwxMCwlcjYKLQotCXpkZXBpIC0xLDQsMTAsJXI2Ci0JemRlcGksPSAtMSw0LDEwLCVyNgotCXpkZXBpLDwgLTEsNCwxMCwlcjYKLQl6ZGVwaSxvZCAtMSw0LDEwLCVyNgotCXpkZXBpLHRyIC0xLDQsMTAsJXI2Ci0JemRlcGksPD4gLTEsNCwxMCwlcjYKLQl6ZGVwaSw+PSAtMSw0LDEwLCVyNgotCXpkZXBpLGV2IC0xLDQsMTAsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiNzU5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBEZXBvc2l0IGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlkZXB3LHogJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LD0gJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LDwgJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LG9kICVyNCw1LDEwLCVyNgotCWRlcHcseix0ciAlcjQsNSwxMCwlcjYKLQlkZXB3LHosPD4gJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LD49ICVyNCw1LDEwLCVyNgotCWRlcHcseixldiAlcjQsNSwxMCwlcjYKLQotCWRlcHcgJXI0LDUsMTAsJXI2Ci0JZGVwdyw9ICVyNCw1LDEwLCVyNgotCWRlcHcsPCAlcjQsNSwxMCwlcjYKLQlkZXB3LG9kICVyNCw1LDEwLCVyNgotCWRlcHcsdHIgJXI0LDUsMTAsJXI2Ci0JZGVwdyw8PiAlcjQsNSwxMCwlcjYKLQlkZXB3LD49ICVyNCw1LDEwLCVyNgotCWRlcHcsZXYgJXI0LDUsMTAsJXI2Ci0KLQlkZXB3LHoJJXI0LCVzYXIsNSwlcjYKLQlkZXB3LHosPSAlcjQsJXNhciw1LCVyNgotCWRlcHcseiw8ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LG9kICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LHRyICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LDw+ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LD49ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LGV2ICVyNCwlc2FyLDUsJXI2Ci0KLQlkZXB3ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyw9ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyw8ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyxvZCAlcjQsJXNhciw1LCVyNgotCWRlcHcsdHIgJXI0LCVzYXIsNSwlcjYKLQlkZXB3LDw+ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyw+PSAlcjQsJXNhciw1LCVyNgotCWRlcHcsZXYgJXI0LCVzYXIsNSwlcjYKLQotCWRlcHdpIC0xLCVzYXIsNSwlcjYKLQlkZXB3aSw9IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSw8IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSxvZCAtMSwlc2FyLDUsJXI2Ci0JZGVwd2ksdHIgLTEsJXNhciw1LCVyNgotCWRlcHdpLDw+IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSw+PSAtMSwlc2FyLDUsJXI2Ci0JZGVwd2ksZXYgLTEsJXNhciw1LCVyNgotCi0JZGVwd2kseiAtMSwlc2FyLDUsJXI2Ci0JZGVwd2kseiw9IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSx6LDwgLTEsJXNhciw1LCVyNgotCWRlcHdpLHosb2QgLTEsJXNhciw1LCVyNgotCWRlcHdpLHosdHIgLTEsJXNhciw1LCVyNgotCWRlcHdpLHosPD4gLTEsJXNhciw1LCVyNgotCWRlcHdpLHosPj0gLTEsJXNhciw1LCVyNgotCWRlcHdpLHosZXYgLTEsJXNhciw1LCVyNgotCi0JZGVwd2kgLTEsNCwxMCwlcjYKLQlkZXB3aSw9IC0xLDQsMTAsJXI2Ci0JZGVwd2ksPCAtMSw0LDEwLCVyNgotCWRlcHdpLG9kIC0xLDQsMTAsJXI2Ci0JZGVwd2ksdHIgLTEsNCwxMCwlcjYKLQlkZXB3aSw8PiAtMSw0LDEwLCVyNgotCWRlcHdpLD49IC0xLDQsMTAsJXI2Ci0JZGVwd2ksZXYgLTEsNCwxMCwlcjYKLQotCWRlcHdpLHoJLTEsNCwxMCwlcjYKLQlkZXB3aSx6LD0gLTEsNCwxMCwlcjYKLQlkZXB3aSx6LDwgLTEsNCwxMCwlcjYKLQlkZXB3aSx6LG9kIC0xLDQsMTAsJXI2Ci0JZGVwd2kseix0ciAtMSw0LDEwLCVyNgotCWRlcHdpLHosPD4gLTEsNCwxMCwlcjYKLQlkZXB3aSx6LD49IC0xLDQsMTAsJXI2Ci0JZGVwd2kseixldiAtMSw0LDEwLCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI3MTE3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdDMucworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQSAyLjAgRGVwb3NpdCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZGVwZCx6LCogJXI0LDEwLDUsJXI2Ci0JZGVwZCx6LCo9ICVyNCwxMCw1LCVyNgotCWRlcGQseiwqPCAlcjQsMTAsNSwlcjYKLQlkZXBkLHosKm9kICVyNCwxMCw1LCVyNgotCWRlcGQseiwqdHIgJXI0LDEwLDUsJXI2Ci0JZGVwZCx6LCo8PiAlcjQsMTAsNSwlcjYKLQlkZXBkLHosKj49ICVyNCwxMCw1LCVyNgotCWRlcGQseiwqZXYgJXI0LDEwLDUsJXI2Ci0KLQlkZXBkLCogJXI0LDEwLDUsJXI2Ci0JZGVwZCwqPSAlcjQsMTAsNSwlcjYKLQlkZXBkLCo8ICVyNCwxMCw1LCVyNgotCWRlcGQsKm9kICVyNCwxMCw1LCVyNgotCWRlcGQsKnRyICVyNCwxMCw1LCVyNgotCWRlcGQsKjw+ICVyNCwxMCw1LCVyNgotCWRlcGQsKj49ICVyNCwxMCw1LCVyNgotCWRlcGQsKmV2ICVyNCwxMCw1LCVyNgotCi0JZGVwZCx6LCogJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKj0gJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKjwgJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKm9kICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCx6LCp0ciAlcjQsJXNhciw1LCVyNgotCWRlcGQseiwqPD4gJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKj49ICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCx6LCpldiAlcjQsJXNhciw1LCVyNgotCi0JZGVwZCwqICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCwqPSAlcjQsJXNhciw1LCVyNgotCWRlcGQsKjwgJXI0LCVzYXIsNSwlcjYKLQlkZXBkLCpvZCAlcjQsJXNhciw1LCVyNgotCWRlcGQsKnRyICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCwqPD4gJXI0LCVzYXIsNSwlcjYKLQlkZXBkLCo+PSAlcjQsJXNhciw1LCVyNgotCWRlcGQsKmV2ICVyNCwlc2FyLDUsJXI2Ci0KLQlkZXBkaSwqIC0xLCVzYXIsNSwlcjYKLQlkZXBkaSwqPSAtMSwlc2FyLDUsJXI2Ci0JZGVwZGksKjwgLTEsJXNhciw1LCVyNgotCWRlcGRpLCpvZCAtMSwlc2FyLDUsJXI2Ci0JZGVwZGksKnRyIC0xLCVzYXIsNSwlcjYKLQlkZXBkaSwqPD4gLTEsJXNhciw1LCVyNgotCWRlcGRpLCo+PSAtMSwlc2FyLDUsJXI2Ci0JZGVwZGksKmV2IC0xLCVzYXIsNSwlcjYKLQotCWRlcGRpLHosKiAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqPSAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqPCAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqb2QgLTEsJXNhciw1LCVyNgotCWRlcGRpLHosKnRyIC0xLCVzYXIsNSwlcjYKLQlkZXBkaSx6LCo8PiAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqPj0gLTEsJXNhciw1LCVyNgotCWRlcGRpLHosKmV2IC0xLCVzYXIsNSwlcjYKLQotCWRlcGRpLCogLTEsMTAsNCwlcjYKLQlkZXBkaSwqPSAtMSwxMCw0LCVyNgotCWRlcGRpLCo8IC0xLDEwLDQsJXI2Ci0JZGVwZGksKm9kIC0xLDEwLDQsJXI2Ci0JZGVwZGksKnRyIC0xLDEwLDQsJXI2Ci0JZGVwZGksKjw+IC0xLDEwLDQsJXI2Ci0JZGVwZGksKj49IC0xLDEwLDQsJXI2Ci0JZGVwZGksKmV2IC0xLDEwLDQsJXI2Ci0KLQlkZXBkaSx6LCogLTEsMTAsNCwlcjYKLQlkZXBkaSx6LCo9IC0xLDEwLDQsJXI2Ci0JZGVwZGkseiwqPCAtMSwxMCw0LCVyNgotCWRlcGRpLHosKm9kIC0xLDEwLDQsJXI2Ci0JZGVwZGkseiwqdHIgLTEsMTAsNCwlcjYKLQlkZXBkaSx6LCo8PiAtMSwxMCw0LCVyNgotCWRlcGRpLHosKj49IC0xLDEwLDQsJXI2Ci0JZGVwZGkseiwqZXYgLTEsMTAsNCwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5ZDQ0NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWRzICVyNCwlcjUsJXI2Ci0JZHMsPSAlcjQsJXI1LCVyNgotCWRzLDwgJXI0LCVyNSwlcjYKLQlkcyw8PSAlcjQsJXI1LCVyNgotCWRzLDw8ICVyNCwlcjUsJXI2Ci0JZHMsPDw9ICVyNCwlcjUsJXI2Ci0JZHMsc3YgJXI0LCVyNSwlcjYKLQlkcyxvZCAlcjQsJXI1LCVyNgotCWRzLHRyICVyNCwlcjUsJXI2Ci0JZHMsPD4gJXI0LCVyNSwlcjYKLQlkcyw+PSAlcjQsJXI1LCVyNgotCWRzLD4gJXI0LCVyNSwlcjYKLQlkcyw+Pj0gJXI0LCVyNSwlcjYKLQlkcyw+PiAlcjQsJXI1LCVyNgotCWRzLG5zdiAlcjQsJXI1LCVyNgotCWRzLGV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2I1YThkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlleHRydSAlcjQsNSwxMCwlcjYKLQlleHRydSw9ICVyNCw1LDEwLCVyNgotCWV4dHJ1LDwgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsb2QgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsdHIgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPD4gJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPj0gJXI0LDUsMTAsJXI2Ci0JZXh0cnUsZXYgJXI0LDUsMTAsJXI2Ci0KLQlleHRycyAlcjQsNSwxMCwlcjYKLQlleHRycyw9ICVyNCw1LDEwLCVyNgotCWV4dHJzLDwgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsb2QgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsdHIgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPD4gJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPj0gJXI0LDUsMTAsJXI2Ci0JZXh0cnMsZXYgJXI0LDUsMTAsJXI2Ci0KLQl2ZXh0cnUgJXI0LDUsJXI2Ci0JdmV4dHJ1LD0gJXI0LDUsJXI2Ci0JdmV4dHJ1LDwgJXI0LDUsJXI2Ci0JdmV4dHJ1LG9kICVyNCw1LCVyNgotCXZleHRydSx0ciAlcjQsNSwlcjYKLQl2ZXh0cnUsPD4gJXI0LDUsJXI2Ci0JdmV4dHJ1LD49ICVyNCw1LCVyNgotCXZleHRydSxldiAlcjQsNSwlcjYKLQotCXZleHRycyAlcjQsNSwlcjYKLQl2ZXh0cnMsPSAlcjQsNSwlcjYKLQl2ZXh0cnMsPCAlcjQsNSwlcjYKLQl2ZXh0cnMsb2QgJXI0LDUsJXI2Ci0JdmV4dHJzLHRyICVyNCw1LCVyNgotCXZleHRycyw8PiAlcjQsNSwlcjYKLQl2ZXh0cnMsPj0gJXI0LDUsJXI2Ci0JdmV4dHJzLGV2ICVyNCw1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc1YmE3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdDIucworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZXh0cncsdSAlcjQsNSwxMCwlcjYKLQlleHRydyx1LD0gJXI0LDUsMTAsJXI2Ci0JZXh0cncsdSw8ICVyNCw1LDEwLCVyNgotCWV4dHJ3LHUsb2QgJXI0LDUsMTAsJXI2Ci0JZXh0cncsdSx0ciAlcjQsNSwxMCwlcjYKLQlleHRydyx1LDw+ICVyNCw1LDEwLCVyNgotCWV4dHJ3LHUsPj0gJXI0LDUsMTAsJXI2Ci0JZXh0cncsdSxldiAlcjQsNSwxMCwlcjYKLQotCWV4dHJ3LHMgJXI0LDUsMTAsJXI2Ci0JZXh0cncscyw9ICVyNCw1LDEwLCVyNgotCWV4dHJ3LHMsPCAlcjQsNSwxMCwlcjYKLQlleHRydyxzLG9kICVyNCw1LDEwLCVyNgotCWV4dHJ3LHRyICVyNCw1LDEwLCVyNgotCWV4dHJ3LDw+ICVyNCw1LDEwLCVyNgotCWV4dHJ3LD49ICVyNCw1LDEwLCVyNgotCWV4dHJ3LGV2ICVyNCw1LDEwLCVyNgotCi0JZXh0cncsdSAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsPSAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsPCAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsb2QgJXI0LCVzYXIsNSwlcjYKLQlleHRydyx1LHRyICVyNCwlc2FyLDUsJXI2Ci0JZXh0cncsdSw8PiAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsPj0gJXI0LCVzYXIsNSwlcjYKLQlleHRydyx1LGV2ICVyNCwlc2FyLDUsJXI2Ci0JCi0JZXh0cncscyAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHMsPSAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHMsPCAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHMsb2QgJXI0LCVzYXIsNSwlcjYKLQlleHRydyx0ciAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LDw+ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cncsPj0gJXI0LCVzYXIsNSwlcjYKLQlleHRydyxldiAlcjQsJXNhciw1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAxY2ViLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdDMucworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWV4dHJkLHUsKiAlcjQsMTAsNSwlcjYKLQlleHRyZCx1LCo9ICVyNCwxMCw1LCVyNgotCWV4dHJkLHUsKjwgJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqb2QgJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqdHIgJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqPD4gJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqPj0gJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqZXYgJXI0LDEwLDUsJXI2Ci0KLQlleHRyZCxzLCogJXI0LDEwLDUsJXI2Ci0JZXh0cmQscywqPSAlcjQsMTAsNSwlcjYKLQlleHRyZCxzLCo8ICVyNCwxMCw1LCVyNgotCWV4dHJkLHMsKm9kICVyNCwxMCw1LCVyNgotCWV4dHJkLCp0ciAlcjQsMTAsNSwlcjYKLQlleHRyZCwqPD4gJXI0LDEwLDUsJXI2Ci0JZXh0cmQsKj49ICVyNCwxMCw1LCVyNgotCWV4dHJkLCpldiAlcjQsMTAsNSwlcjYKLQotCWV4dHJkLHUsKiAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHUsKj0gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCx1LCo8ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsdSwqb2QgJXI0LCVzYXIsNSwlcjYKLQlleHRyZCx1LCp0ciAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHUsKjw+ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsdSwqPj0gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCx1LCpldiAlcjQsJXNhciw1LCVyNgotCQotCWV4dHJkLHMsKiAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHMsKj0gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCxzLCo8ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQscywqb2QgJXI0LCVzYXIsNSwlcjYKLQlleHRyZCwqdHIgJXI0LCVzYXIsNSwlcjYKLQlleHRyZCwqPD4gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCwqPj0gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCwqZXYgJXI0LCVzYXIsNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDJiZTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZsZHd4ICVyNCglc3IwLCVyNSksJWZyNgotCWZsZHd4LHMgJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3gsbSAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGR3eCxzbSAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCxzICVyNCglc3IwLCVyNSksJWZyNgotCWZsZGR4LG0gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHgsc20gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZnN0d3ggJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0d3gscyAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3R3eCxtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHd4LHNtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4ICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4LHMgJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0ZHgsbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCxzbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCxzICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHF4LG0gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXgsc20gJWZyNiwlcjQoJXNyMCwlcjUpCi0KLQlmbGR3cyAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3MsbWIgMCglc3IwLCVyNSksJWZyNgotCWZsZHdzLG1hIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGRkcyAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHMsbWIgMCglc3IwLCVyNSksJWZyNgotCWZsZGRzLG1hIDAoJXNyMCwlcjUpLCVmcjYKLQlmc3R3cyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0d3MsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHdzLG1hICVmcjYsMCglc3IwLCVyNSkKLQlmc3RkcyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0ZHMsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdGRzLG1hICVmcjYsMCglc3IwLCVyNSkKLQlmc3RxcyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0cXMsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHFzLG1hICVmcjYsMCglc3IwLCVyNSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMzMGJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0JLmNvZGUKLQkuZXhwb3J0CQlmCi1mCi0JLnByb2MKLQkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscwotCS5lbnRyeQotCi0JZnN0d3MJCSVmcjZSLDAoJXIyNikKLQlmc3R3cwkJJWZyNkwsNCglcjI2KQotCWZzdHdzCQklZnI2LDgoJXIyNikKLQotCWZzdGRzCQklZnI2UiwwKCVyMjYpCi0JZnN0ZHMJCSVmcjZMLDQoJXIyNikKLQlmc3RkcwkJJWZyNiw4KCVyMjYpCi0KLQlmbGR3cwkJMCglcjI2KSwlZnI2UgotCWZsZHdzCQk0KCVyMjYpLCVmcjZMCi0JZmxkd3MJCTgoJXIyNiksJWZyNgotCi0JZmxkZHMJCTAoJXIyNiksJWZyNlIKLQlmbGRkcwkJNCglcjI2KSwlZnI2TAotCWZsZGRzCQk4KCVyMjYpLCVmcjYKLQotCWZzdHdzCQklZnI2UiwwKCVzcjAsJXIyNikKLQlmc3R3cwkJJWZyNkwsNCglc3IwLCVyMjYpCi0JZnN0d3MJCSVmcjYsOCglc3IwLCVyMjYpCi0KLQlmc3RkcwkJJWZyNlIsMCglc3IwLCVyMjYpCi0JZnN0ZHMJCSVmcjZMLDQoJXNyMCwlcjI2KQotCWZzdGRzCQklZnI2LDgoJXNyMCwlcjI2KQotCi0JZmxkd3MJCTAoJXNyMCwlcjI2KSwlZnI2UgotCWZsZHdzCQk0KCVzcjAsJXIyNiksJWZyNkwKLQlmbGR3cwkJOCglc3IwLCVyMjYpLCVmcjYKLQotCWZsZGRzCQkwKCVzcjAsJXIyNiksJWZyNlIKLQlmbGRkcwkJNCglc3IwLCVyMjYpLCVmcjZMCi0JZmxkZHMJCTgoJXNyMCwlcjI2KSwlZnI2Ci0KLQlmc3R3eAkJJWZyNlIsJXIyNSglcjI2KQotCWZzdHd4CQklZnI2TCwlcjI1KCVyMjYpCi0JZnN0d3gJCSVmcjYsJXIyNSglcjI2KQotCi0JZnN0ZHgJCSVmcjZSLCVyMjUoJXIyNikKLQlmc3RkeAkJJWZyNkwsJXIyNSglcjI2KQotCWZzdGR4CQklZnI2LCVyMjUoJXIyNikKLQotCWZsZHd4CQklcjI1KCVyMjYpLCVmcjZSCi0JZmxkd3gJCSVyMjUoJXIyNiksJWZyNkwKLQlmbGR3eAkJJXIyNSglcjI2KSwlZnI2Ci0KLQlmbGRkeAkJJXIyNSglcjI2KSwlZnI2UgotCWZsZGR4CQklcjI1KCVyMjYpLCVmcjZMCi0JZmxkZHgJCSVyMjUoJXIyNiksJWZyNgotCi0JZnN0d3gJCSVmcjZSLCVyMjUoJXNyMCwlcjI2KQotCWZzdHd4CQklZnI2TCwlcjI1KCVzcjAsJXIyNikKLQlmc3R3eAkJJWZyNiwlcjI1KCVzcjAsJXIyNikKLQotCWZzdGR4CQklZnI2UiwlcjI1KCVzcjAsJXIyNikKLQlmc3RkeAkJJWZyNkwsJXIyNSglc3IwLCVyMjYpCi0JZnN0ZHgJCSVmcjYsJXIyNSglc3IwLCVyMjYpCi0KLQlmbGR3eAkJJXIyNSglc3IwLCVyMjYpLCVmcjZSCi0JZmxkd3gJCSVyMjUoJXNyMCwlcjI2KSwlZnI2TAotCWZsZHd4CQklcjI1KCVzcjAsJXIyNiksJWZyNgotCi0JZmxkZHgJCSVyMjUoJXNyMCwlcjI2KSwlZnI2UgotCWZsZGR4CQklcjI1KCVzcjAsJXIyNiksJWZyNkwKLQlmbGRkeAkJJXIyNSglc3IwLCVyMjYpLCVmcjYKLQotCWJ2CQklcjAoJXIyKQotCW5vcAotCi0JLmV4aXQKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4ZTJkNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAucworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZmNweSxzZ2wgJWZyNSwlZnIxMAotCWZjcHksZGJsICVmcjUsJWZyMTAKLQlmY3B5LHF1YWQgJWZyNSwlZnIxMAotCWZjcHksc2dsICVmcjIwLCVmcjI0Ci0JZmNweSxkYmwgJWZyMjAsJWZyMjQKLQotCWZhYnMsc2dsICVmcjUsJWZyMTAKLQlmYWJzLGRibCAlZnI1LCVmcjEwCi0JZmFicyxxdWFkICVmcjUsJWZyMTAKLQlmYWJzLHNnbCAlZnIyMCwlZnIyNAotCWZhYnMsZGJsICVmcjIwLCVmcjI0Ci0KLQlmc3FydCxzZ2wgJWZyNSwlZnIxMAotCWZzcXJ0LGRibCAlZnI1LCVmcjEwCi0JZnNxcnQscXVhZCAlZnI1LCVmcjEwCi0JZnNxcnQsc2dsICVmcjIwLCVmcjI0Ci0JZnNxcnQsZGJsICVmcjIwLCVmcjI0Ci0KLQlmcm5kLHNnbCAlZnI1LCVmcjEwCi0JZnJuZCxkYmwgJWZyNSwlZnIxMAotCWZybmQscXVhZCAlZnI1LCVmcjEwCi0JZnJuZCxzZ2wgJWZyMjAsJWZyMjQKLQlmcm5kLGRibCAlZnIyMCwlZnIyNAotCQotCWZhZGQsc2dsICVmcjQsJWZyOCwlZnIxMgotCWZhZGQsZGJsICVmcjQsJWZyOCwlZnIxMgotCWZhZGQscXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmYWRkLHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZhZGQsZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZmFkZCxxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmc3ViLHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmc3ViLGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmc3ViLHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZnN1YixzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmc3ViLGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZzdWIscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZm1weSxzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZm1weSxkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZm1weSxxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZtcHksc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZm1weSxkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmbXB5LHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZkaXYsc2dsICVmcjQsJWZyOCwlZnIxMgotCWZkaXYsZGJsICVmcjQsJWZyOCwlZnIxMgotCWZkaXYscXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmZGl2LHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZkaXYsZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZmRpdixxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmcmVtLHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmcmVtLGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmcmVtLHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZnJlbSxzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmcmVtLGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZyZW0scXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZm1weWFkZCxzZ2wgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKLQlmbXB5YWRkLGRibCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAotCWZtcHlzdWIsc2dsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCi0JZm1weXN1YixkYmwgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKLQotCXhtcHl1ICVmcjQsJWZyNSwlZnI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTAyYjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZm1weWZhZGQsc2dsICVmcjVSLCVmcjEwTCwlZnIxM1IsJWZyMTRMCi0JZm1weWZhZGQsZGJsICVmcjUsJWZyMTAsJWZyMTMsJWZyMTQKLQlmbXB5ZmFkZCxzZ2wgJWZyMThSLCVmcjI3TCwlZnI2UiwlZnIyMUwKLQlmbXB5ZmFkZCxkYmwgJWZyMTgsJWZyMjcsJWZyNiwlZnIyMQotCi0JZm1weW5mYWRkLHNnbCAlZnI1UiwlZnIxMEwsJWZyMTNSLCVmcjE0TAotCWZtcHluZmFkZCxkYmwgJWZyNSwlZnIxMCwlZnIxMywlZnIxNAotCWZtcHluZmFkZCxzZ2wgJWZyMThSLCVmcjI3TCwlZnI2UiwlZnIyMUwKLQlmbXB5bmZhZGQsZGJsICVmcjE4LCVmcjI3LCVmcjYsJWZyMjEKLQotCWZuZWcsc2dsICVmcjUsJWZyMTBSCi0JZm5lZyxkYmwgJWZyNSwlZnIxMAotCWZuZWcscXVhZCAlZnI1LCVmcjEwCi0JZm5lZyxzZ2wgJWZyMjBSLCVmcjI0TAotCWZuZWcsZGJsICVmcjIwLCVmcjI0Ci0KLQlmbmVnYWJzLHNnbCAlZnI1LCVmcjEwUgotCWZuZWdhYnMsZGJsICVmcjUsJWZyMTAKLQlmbmVnYWJzLHF1YWQgJWZyNSwlZnIxMAotCWZuZWdhYnMsc2dsICVmcjIwUiwlZnIyNEwKLQlmbmVnYWJzLGRibCAlZnIyMCwlZnIyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbnYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29udi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmU4YTFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29udi5zCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY252ZmYsc2dsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLHNnbCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmZixzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZmLGRibCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmZixkYmwsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmZixxdWFkLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLHF1YWQsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZmYsc2dsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixzZ2wsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZmLHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZmLGRibCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZmYsZGJsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQotCWZjbnZ4ZixzZ2wsc2dsICVmcjUsJWZyMTAKLQlmY252eGYsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudnhmLHNnbCxxdWFkICVmcjUsJWZyMTAKLQlmY252eGYsZGJsLHNnbCAlZnI1LCVmcjEwCi0JZmNudnhmLGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixkYmwscXVhZCAlZnI1LCVmcjEwCi0JZmNudnhmLHF1YWQsc2dsICVmcjUsJWZyMTAKLQlmY252eGYscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixxdWFkLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZ4ZixzZ2wsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252eGYsc2dsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252eGYsZGJsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLGRibCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQscXVhZCAlZnIyMCwlZnIyNAotCi0JZmNudmZ4LHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxzZ2wsZGJsICVmcjUsJWZyMTAKLQlmY252Zngsc2dsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeCxkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252ZngsZGJsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LGRibCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZngscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxxdWFkLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LHF1YWQscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4LHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Zngsc2dsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeCxzZ2wscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeCxkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LGRibCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZngsZGJsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxxdWFkICVmcjIwLCVmcjI0Ci0KLQlmY252Znh0LHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252Znh0LGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252Znh0LHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252Znh0LHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeHQscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9mY21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzMTQ5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZjbXAsc2dsLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLHNnbCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLHNnbCw/ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPSAlZnI0LCVmcjUKLQlmY21wLHNnbCw9VCAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT8+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCw8ICVmcjQsJWZyNQotCWZjbXAsc2dsLD88ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPzw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPiAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PiAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT88ICVmcjQsJWZyNQotCWZjbXAsc2dsLD49ICVmcjQsJWZyNQotCWZjbXAsc2dsLD8+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT1UICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw9PiAlZnI0LCVmcjUKLQlmY21wLHNnbCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLHNnbCx0cnVlICVmcjQsJWZyNQotCi0JZmNtcCxkYmwsZmFsc2U/ICVmcjQsJWZyNQotCWZjbXAsZGJsLGZhbHNlICVmcjQsJWZyNQotCWZjbXAsZGJsLD8gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsITw9PiAlZnI0LCVmcjUKLQlmY21wLGRibCw9ICVmcjQsJWZyNQotCWZjbXAsZGJsLD1UICVmcjQsJWZyNQotCWZjbXAsZGJsLD89ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz49ICVmcjQsJWZyNQotCWZjbXAsZGJsLDwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPzwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT49ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PiAlZnI0LCVmcjUKLQlmY21wLGRibCw8PSAlZnI0LCVmcjUKLQlmY21wLGRibCw/PD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT88PSAlZnI0LCVmcjUKLQlmY21wLGRibCw+ICVmcjQsJWZyNQotCWZjbXAsZGJsLD8+ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPzwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPj0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPz49ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PSAlZnI0LCVmcjUKLQlmY21wLGRibCw8PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPVQgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT8gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD0+ICVmcjQsJWZyNQotCWZjbXAsZGJsLHRydWU/ICVmcjQsJWZyNQotCWZjbXAsZGJsLHRydWUgJWZyNCwlZnI1Ci0KLQlmY21wLHF1YWQsZmFsc2U/ICVmcjQsJWZyNQotCWZjbXAscXVhZCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw9PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPVQgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD89ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD88ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD88PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PCAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8+PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE9ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPVQgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/ICVmcjQsJWZyNQotCWZjbXAscXVhZCw8PT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLHRydWU/ICVmcjQsJWZyNQotCWZjbXAscXVhZCx0cnVlICVmcjQsJWZyNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX21pc2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyNDkzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX21pc2MucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWZwdV9taXNjX3Rlc3RzOiAKLQlmdGVzdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4YjA4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBpbnRlZ2VyX21lbW9yeV90ZXN0cyxDT0RFCi0JLkVYUE9SVCBpbnRlZ2VyX2luZGV4aW5nX2xvYWQsQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9sb2FkX3Nob3J0X21lbW9yeSxDT0RFCi0JLkVYUE9SVCBpbnRlZ2VyX3N0b3JlX3Nob3J0X21lbW9yeSxDT0RFCi0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLTsgQmFzaWMgaW50ZWdlciBtZW1vcnkgdGVzdHMgd2hpY2ggYWxzbyB0ZXN0IHRoZSB2YXJpb3VzIAotOyBhZGRyZXNzaW5nIG1vZGVzIGFuZCBjb21wbGV0ZXJzLgotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi07IAotaW50ZWdlcl9tZW1vcnlfdGVzdHM6IAotCWxkdyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRoIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGIgMCglc3IwLCVyNCksJXIyNgotCXN0dyAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RoICVyMjYsMCglc3IwLCVyNCkKLQlzdGIgJXIyNiwwKCVzcjAsJXI0KQotCi07IFNob3VsZCBtYWtlIHN1cmUgcHJlL3Bvc3QgbW9kZXMgYXJlIHJlY29nbml6ZWQgY29ycmVjdGx5LgotCWxkd20gMCglc3IwLCVyNCksJXIyNgotCXN0d20gJXIyNiwwKCVzcjAsJXI0KQotCi1pbnRlZ2VyX2luZGV4aW5nX2xvYWQ6IAotCWxkd3ggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGR3eCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkd3gsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHd4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRoeCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHgsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkYnggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRieCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkYngsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkd2F4ICVyNSglcjQpLCVyMjYKLQlsZHdheCxzICVyNSglcjQpLCVyMjYKLQlsZHdheCxtICVyNSglcjQpLCVyMjYKLQlsZHdheCxzbSAlcjUoJXI0KSwlcjI2Ci0JbGRjd3ggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3gscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGN3eCxtICVyNSglc3IwLCVyNCksJXIyNgotCWxkY3d4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCi1pbnRlZ2VyX2xvYWRfc2hvcnRfbWVtb3J5OiAKLQlsZHdzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdhcyAwKCVyNCksJXIyNgotCWxkd2FzLG1iIDAoJXI0KSwlcjI2Ci0JbGR3YXMsbWEgMCglcjQpLCVyMjYKLQlsZGN3cyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3MsbWIgMCglc3IwLCVyNCksJXIyNgotCWxkY3dzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQotaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnk6IAotCXN0d3MgJXIyNiwwKCVzcjAsJXI0KQotCXN0d3MsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0d3MsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0d2FzICVyMjYsMCglcjQpCi0Jc3R3YXMsbWIgJXIyNiwwKCVyNCkKLQlzdHdhcyxtYSAlcjI2LDAoJXI0KQotCXN0YnlzICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxiICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxlICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxiLG0gJXIyNiwwKCVzcjAsJXI0KQotCXN0YnlzLGUsbSAlcjI2LDAoJXNyMCwlcjQpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltbWVkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltbWVkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDAwMTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWltbWVkaWF0ZV90ZXN0czogCi0JbGRvIDUoJXIyNiksJXIyNgotCWxkaWwgTCUweGRlYWRiZWVmLCVyMjYKLQlhZGRpbCBMJTB4ZGVhZGJlZWYsJXI1Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjJjNTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCW9yICVyNCwlcjUsJXI2Ci0Jb3IsPSAlcjQsJXI1LCVyNgotCW9yLDwgJXI0LCVyNSwlcjYKLQlvciw8PSAlcjQsJXI1LCVyNgotCW9yLG9kICVyNCwlcjUsJXI2Ci0Jb3IsdHIgJXI0LCVyNSwlcjYKLQlvciw8PiAlcjQsJXI1LCVyNgotCW9yLD49ICVyNCwlcjUsJXI2Ci0Jb3IsPiAlcjQsJXI1LCVyNgotCW9yLGV2ICVyNCwlcjUsJXI2Ci0KLQl4b3IgJXI0LCVyNSwlcjYKLQl4b3IsPSAlcjQsJXI1LCVyNgotCXhvciw8ICVyNCwlcjUsJXI2Ci0JeG9yLDw9ICVyNCwlcjUsJXI2Ci0JeG9yLG9kICVyNCwlcjUsJXI2Ci0JeG9yLHRyICVyNCwlcjUsJXI2Ci0JeG9yLDw+ICVyNCwlcjUsJXI2Ci0JeG9yLD49ICVyNCwlcjUsJXI2Ci0JeG9yLD4gJXI0LCVyNSwlcjYKLQl4b3IsZXYgJXI0LCVyNSwlcjYKLQotCWFuZCAlcjQsJXI1LCVyNgotCWFuZCw9ICVyNCwlcjUsJXI2Ci0JYW5kLDwgJXI0LCVyNSwlcjYKLQlhbmQsPD0gJXI0LCVyNSwlcjYKLQlhbmQsb2QgJXI0LCVyNSwlcjYKLQlhbmQsdHIgJXI0LCVyNSwlcjYKLQlhbmQsPD4gJXI0LCVyNSwlcjYKLQlhbmQsPj0gJXI0LCVyNSwlcjYKLQlhbmQsPiAlcjQsJXI1LCVyNgotCWFuZCxldiAlcjQsJXI1LCVyNgotCi0JYW5kY20gJXI0LCVyNSwlcjYKLQlhbmRjbSw9ICVyNCwlcjUsJXI2Ci0JYW5kY20sPCAlcjQsJXI1LCVyNgotCWFuZGNtLDw9ICVyNCwlcjUsJXI2Ci0JYW5kY20sb2QgJXI0LCVyNSwlcjYKLQlhbmRjbSx0ciAlcjQsJXI1LCVyNgotCWFuZGNtLDw+ICVyNCwlcjUsJXI2Ci0JYW5kY20sPj0gJXI0LCVyNSwlcjYKLQlhbmRjbSw+ICVyNCwlcjUsJXI2Ci0JYW5kY20sZXYgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9tZWRpYS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9tZWRpYS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA5NzdlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbWVkaWEucworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQTIuMCBtdWx0aW1lZGlhIChoYWxmd29yZCkgaW5zdHJ1Y3Rpb24gdGVzdHMKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0JaGFkZCAlcjcsJXIxMSwlcjEyCi0JaGFkZCxzcyAlcjcsJXIxMSwlcjEyCi0JaGFkZCx1cyAlcjcsJXIxMSwlcjEyCi0KLQloYXZnICVyNywlcjExLCVyMTIKLQloc2hsICVyNywxMywlcjExCi0JaHNobGFkZCAlcjcsMSwlcjExLCVyMTIKLQloc2hsYWRkICVyNywyLCVyMTEsJXIxMgotCWhzaGxhZGQgJXI3LDMsJXIxMSwlcjEyCi0JaHNociAlcjcsMTMsJXIxMQotCWhzaHIscyAlcjcsMTMsJXIxMQotCWhzaHIsdSAlcjcsMTMsJXIxMQotCWhzaHJhZGQgJXI3LDEsJXIxMSwlcjEyCi0JaHNocmFkZCAlcjcsMiwlcjExLCVyMTIKLQloc2hyYWRkICVyNywzLCVyMTEsJXIxMgotCi0JaHN1YiAlcjE0LCVyMjIsJXI5Ci0JaHN1YixzcyAlcjE0LCVyMjIsJXI5Ci0JaHN1Yix1cyAlcjE0LCVyMjIsJXI5Ci0KLQltaXhoLGwgJXIxNCwlcjIyLCVyOQotCW1peGgsciAlcjE0LCVyMjIsJXI5Ci0JbWl4dyxsICVyMTQsJXIyMiwlcjkKLQltaXh3LHIgJXIxNCwlcjIyLCVyOQotCi0JcGVybWgsMDMyMSAlcjIyLCVyOQotCXBlcm1oLDIyMjIgJXIyMiwlcjkKLQlwZXJtaCwzMDMwICVyMjIsJXI5Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcGVyZi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wZXJmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDAyZTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wZXJmLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEyLjAgcGVyZm9ybWFuY2UgbW9uaXRvciBpbnN0cnVjdGlvbiB0ZXN0cwotCi0KLQlwbWVuYgotCXBtZGlzCi0JcG1kaXMsbgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzJlZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlwZHRsYiAlcjQoJXNyMCwlcjUpCi0JcGR0bGIsbSAlcjQoJXNyMCwlcjUpCi0JcGl0bGIgJXI0KCVzcjQsJXI1KQotCXBpdGxiLG0gJXI0KCVzcjQsJXI1KQotCXBkdGxiZSAlcjQoJXNyMCwlcjUpCi0JcGR0bGJlLG0gJXI0KCVzcjAsJXI1KQotCXBpdGxiZSAlcjQoJXNyNCwlcjUpCi0JcGl0bGJlLG0gJXI0KCVzcjQsJXI1KQotCXBkYyAlcjQoJXNyMCwlcjUpCi0JcGRjLG0gJXI0KCVzcjAsJXI1KQotCWZkYyAlcjQoJXNyMCwlcjUpCi0JZmRjLG0gJXI0KCVzcjAsJXI1KQotCWZpYyAlcjQoJXNyNCwlcjUpCi0JZmljLG0gJXI0KCVzcjQsJXI1KQotCWZkY2UgJXI0KCVzcjAsJXI1KQotCWZkY2UsbSAlcjQoJXNyMCwlcjUpCi0JZmljZSAlcjQoJXNyNCwlcjUpCi0JZmljZSxtICVyNCglc3I0LCVyNSkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcHVyZ2UyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTI4ODUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZTIucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkubGV2ZWwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQTIuMCBwdXJnZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JcGR0bGIsbCAlcjQoJXNyMCwlcjUpCi0JcGR0bGIsbCxtICVyNCglc3IwLCVyNSkKLQlwaXRsYixsICVyNCglc3I0LCVyNSkKLQlwaXRsYixsLG0gJXI0KCVzcjQsJXI1KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDFhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gxYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTlkMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDFhZGQucworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2gxYWRkICAlcjQsJXI1LCVyNgotCXNoMWFkZCw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLDw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxldiAgJXI0LCVyNSwlcjYKLQotCXNoMWFkZGwgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLDw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsem52ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHRyICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCx1diAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gxYWRkbyAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxudXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxzdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLG9kICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8PiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD49ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLHV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdm56ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sZXYgICVyNCwlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMmFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBjOGQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNoMmFkZCAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPCAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsem52ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxzdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHRyICAlcjQsJXI1LCVyNgotCXNoMmFkZCw8PiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDJhZGRsICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLDw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCXNoMmFkZG8gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sbnV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sem52ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHRyICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLGV2ICAlcjQsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoM2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIwYzk3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoM2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzaDNhZGQgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLDwgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLDw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHpudiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLG9kICAlcjQsJXI1LCVyNgotCXNoM2FkZCx0ciAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLD49ICAlcjQsJXI1LCVyNgotCXNoM2FkZCw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZCx1diAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsdm56ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gzYWRkbCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw8ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxzdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLG9kICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsdHIgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw8PiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLD49ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsdm56ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsbnN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDNhZGRvICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLDwgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw8PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLG51diAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHpudiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sb2QgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyx0ciAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLDw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPj0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sdXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyx2bnogICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxldiAgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODM4YzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hpZnQucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JdnNoZCAlcjQsJXI1LCVyNgotCXZzaGQsPSAlcjQsJXI1LCVyNgotCXZzaGQsPCAlcjQsJXI1LCVyNgotCXZzaGQsb2QgJXI0LCVyNSwlcjYKLQl2c2hkLHRyICVyNCwlcjUsJXI2Ci0JdnNoZCw8PiAlcjQsJXI1LCVyNgotCXZzaGQsPj0gJXI0LCVyNSwlcjYKLQl2c2hkLGV2ICVyNCwlcjUsJXI2Ci0KLQlzaGQgJXI0LCVyNSw1LCVyNgotCXNoZCw9ICVyNCwlcjUsNSwlcjYKLQlzaGQsPCAlcjQsJXI1LDUsJXI2Ci0Jc2hkLG9kICVyNCwlcjUsNSwlcjYKLQlzaGQsdHIgJXI0LCVyNSw1LCVyNgotCXNoZCw8PiAlcjQsJXI1LDUsJXI2Ci0Jc2hkLD49ICVyNCwlcjUsNSwlcjYKLQlzaGQsZXYgJXI0LCVyNSw1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiZWUzYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEgMi4wIGZvcm1hdCBzaGlmdCByaWdodCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2hycHcgJXI0LCVyNSwlc2FyLCVyNgotCXNocnB3LD0gJXI0LCVyNSwlc2FyLCVyNgotCXNocnB3LDwgJXI0LCVyNSwlc2FyLCVyNgotCXNocnB3LG9kICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwdyx0ciAlcjQsJXI1LCVjcjExLCVyNgotCXNocnB3LDw+ICVyNCwlcjUsJWNyMTEsJXI2Ci0Jc2hycHcsPj0gJXI0LCVyNSwlY3IxMSwlcjYKLQlzaHJwdyxldiAlcjQsJXI1LCVjcjExLCVyNgotCi0Jc2hycHcgJXI0LCVyNSw1LCVyNgotCXNocnB3LD0gJXI0LCVyNSw1LCVyNgotCXNocnB3LDwgJXI0LCVyNSw1LCVyNgotCXNocnB3LG9kICVyNCwlcjUsNSwlcjYKLQlzaHJwdyx0ciAlcjQsJXI1LDUsJXI2Ci0Jc2hycHcsPD4gJXI0LCVyNSw1LCVyNgotCXNocnB3LD49ICVyNCwlcjUsNSwlcjYKLQlzaHJwdyxldiAlcjQsJXI1LDUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdDMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwMDAzOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0My5zCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBIDIuMCBzaGlmdCByaWdodCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2hycGQsKiAlcjQsJXI1LCVzYXIsJXI2Ci0Jc2hycGQsKj0gJXI0LCVyNSwlc2FyLCVyNgotCXNocnBkLCo8ICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwZCwqb2QgJXI0LCVyNSwlc2FyLCVyNgotCXNocnBkLCp0ciAlcjQsJXI1LCVjcjExLCVyNgotCXNocnBkLCo8PiAlcjQsJXI1LCVjcjExLCVyNgotCXNocnBkLCo+PSAlcjQsJXI1LCVjcjExLCVyNgotCXNocnBkLCpldiAlcjQsJXI1LCVjcjExLCVyNgotCi0Jc2hycGQsKiAlcjQsJXI1LDUsJXI2Ci0Jc2hycGQsKj0gJXI0LCVyNSw1LCVyNgotCXNocnBkLCo8ICVyNCwlcjUsNSwlcjYKLQlzaHJwZCwqb2QgJXI0LCVyNSw1LCVyNgotCXNocnBkLCp0ciAlcjQsJXI1LDUsJXI2Ci0Jc2hycGQsKjw+ICVyNCwlcjUsNSwlcjYKLQlzaHJwZCwqPj0gJXI0LCVyNSw1LCVyNgotCXNocnBkLCpldiAlcjQsJXI1LDUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hsYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NobGFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjA4NDc4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hsYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgc2hsYWRkIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzaGxhZGQgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCw8ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLDw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLG51diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx6bnYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsb2QgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHIgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx1diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx2bnogICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGV2ICAlcjQsMSwlcjUsJXI2Ci0KLQlzaGxhZGQsbCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCw8ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsPD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCxudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCx6bnYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCxzdiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLG9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsdHIgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCw8PiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLD49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsPiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLHV2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsbnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsZXYgICVyNCwxLCVyNSwlcjYKLQotCXNobGFkZCx0c3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDwgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHpudiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3Ysc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LG9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix0ciAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsPD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix1diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3Ysdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixuc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LGV2ICAlcjQsMSwlcjUsJXI2Ci0KLQlzaGxhZGQgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCw8ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLDw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLG51diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx6bnYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsb2QgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHIgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx1diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx2bnogICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGV2ICAlcjQsMiwlcjUsJXI2Ci0KLQlzaGxhZGQsbCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCw8ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsPD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCxudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCx6bnYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCxzdiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLG9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsdHIgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCw8PiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLD49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsPiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLHV2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsbnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsZXYgICVyNCwyLCVyNSwlcjYKLQotCXNobGFkZCx0c3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDwgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHpudiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3Ysc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LG9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix0ciAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsPD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix1diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3Ysdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixuc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LGV2ICAlcjQsMiwlcjUsJXI2Ci0KLQlzaGxhZGQgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCw8ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLDw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLG51diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx6bnYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsb2QgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHIgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx1diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx2bnogICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGV2ICAlcjQsMywlcjUsJXI2Ci0KLQlzaGxhZGQsbCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCw8ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsPD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCxudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCx6bnYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCxzdiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLG9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsdHIgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCw8PiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLD49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsPiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLHV2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsbnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsZXYgICVyNCwzLCVyNSwlcjYKLQotCXNobGFkZCx0c3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDwgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdixudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHpudiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3Ysc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LG9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdix0ciAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsPD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdix1diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3Ysdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdixuc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LGV2ICAlcjQsMywlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hsYWRkMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGxhZGQyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYmI2N2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGxhZGQyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBMi4wIHNobGFkZCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2hsYWRkLCogICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKjwgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKjw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCpudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKnpudiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKm9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCp0ciAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqPD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKj49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCo+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCp1diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCpuc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKmV2ICAlcjQsMSwlcjUsJXI2Ci0KLQlzaGxhZGQsbCwqICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqPCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCo8PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCpudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqem52ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKm9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnRyICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKjw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqdXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKm5zdiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCpldiAgJXI0LDEsJXI1LCVyNgotCi0Jc2hsYWRkLHRzdiwqICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKjwgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKm51diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKnpudiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqb2QgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp0ciAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKjw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp2bnogICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpuc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpldiAgJXI0LDEsJXI1LCVyNgotCi0Jc2hsYWRkLCogICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKjwgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKjw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCpudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKnpudiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKm9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCp0ciAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqPD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKj49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCo+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCp1diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCpuc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKmV2ICAlcjQsMiwlcjUsJXI2Ci0KLQlzaGxhZGQsbCwqICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqPCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCo8PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCpudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqem52ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKm9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnRyICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKjw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqdXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKm5zdiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCpldiAgJXI0LDIsJXI1LCVyNgotCi0Jc2hsYWRkLHRzdiwqICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKjwgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKm51diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKnpudiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqb2QgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp0ciAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKjw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp2bnogICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpuc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpldiAgJXI0LDIsJXI1LCVyNgotCi0Jc2hsYWRkLCogICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKjwgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKjw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCpudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKnpudiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKm9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCp0ciAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqPD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKj49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCo+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCp1diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCpuc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKmV2ICAlcjQsMywlcjUsJXI2Ci0KLQlzaGxhZGQsbCwqICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqPCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCo8PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCpudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqem52ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKm9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKnRyICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKjw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKj49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKj4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqdXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKm5zdiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCpldiAgJXI0LDMsJXI1LCVyNgotCi0Jc2hsYWRkLHRzdiwqICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKjwgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKm51diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKnpudiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqb2QgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp0ciAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKjw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp2bnogICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpuc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpldiAgJXI0LDMsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NwZWNpYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFjZTlhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCWdmdyAlcjQoJXNyMCwlcjUpCi0JZ2Z3LG0gJXI0KCVzcjAsJXI1KQotCWdmciAlcjQoJXNyMCwlcjUpCi0JZ2ZyLG0gJXI0KCVzcjAsJXI1KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcG9wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3Nwb3AucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmNjRkNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3Nwb3AucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLXNwb3BfdGVzdHM6IAotCXNwb3AwLDQsNQotCXNwb3AwLDQsMTE1Ci0Jc3BvcDAsNCw1LG4KLQlzcG9wMCw0LDExNSxuCi0Jc3BvcDEsNCw1ICVyNQotCXNwb3AxLDQsMTE1ICVyNQotCXNwb3AxLDQsNSxuICVyNQotCXNwb3AxLDQsMTE1LG4gJXI1Ci0Jc3BvcDIsNCw1ICVyNQotCXNwb3AyLDQsMTE1ICVyNQotCXNwb3AyLDQsNSxuICVyNQotCXNwb3AyLDQsMTE1LG4gJXI1Ci0Jc3BvcDMsNCw1ICVyNSwlcjYKLQlzcG9wMyw0LDExNSAlcjUsJXI2Ci0Jc3BvcDMsNCw1LG4gJXI1LCVyNgotCXNwb3AzLDQsMTE1LG4gJXI1LCVyNgotCi07IEdhcyBmdWNrcyB0aGlzIHVwLi4uICBUaGlua3MgaXQgaGFzIHRoZSBleHByZXNzaW9uIDUgbW9kIHI1LgotOwlzcG9wMSw0LDUgJXI1CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMmNhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc3ViICVyNCwlcjUsJXI2Ci0Jc3ViLD0gJXI0LCVyNSwlcjYKLQlzdWIsPCAlcjQsJXI1LCVyNgotCXN1Yiw8PSAlcjQsJXI1LCVyNgotCXN1Yiw8PCAlcjQsJXI1LCVyNgotCXN1Yiw8PD0gJXI0LCVyNSwlcjYKLQlzdWIsc3YgJXI0LCVyNSwlcjYKLQlzdWIsb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHIgJXI0LCVyNSwlcjYKLQlzdWIsPD4gJXI0LCVyNSwlcjYKLQlzdWIsPj0gJXI0LCVyNSwlcjYKLQlzdWIsPiAlcjQsJXI1LCVyNgotCXN1Yiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsPj4gJXI0LCVyNSwlcjYKLQlzdWIsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJvICVyNCwlcjUsJXI2Ci0Jc3Vibyw9ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8PSAlcjQsJXI1LCVyNgotCXN1Ym8sPDwgJXI0LCVyNSwlcjYKLQlzdWJvLDw8PSAlcjQsJXI1LCVyNgotCXN1Ym8sc3YgJXI0LCVyNSwlcjYKLQlzdWJvLG9kICVyNCwlcjUsJXI2Ci0Jc3Vibyx0ciAlcjQsJXI1LCVyNgotCXN1Ym8sPD4gJXI0LCVyNSwlcjYKLQlzdWJvLD49ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJvLD4+ICVyNCwlcjUsJXI2Ci0Jc3Vibyxuc3YgJXI0LCVyNSwlcjYKLQlzdWJvLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJiICVyNCwlcjUsJXI2Ci0Jc3ViYiw9ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8PSAlcjQsJXI1LCVyNgotCXN1YmIsPDwgJXI0LCVyNSwlcjYKLQlzdWJiLDw8PSAlcjQsJXI1LCVyNgotCXN1YmIsc3YgJXI0LCVyNSwlcjYKLQlzdWJiLG9kICVyNCwlcjUsJXI2Ci0Jc3ViYix0ciAlcjQsJXI1LCVyNgotCXN1YmIsPD4gJXI0LCVyNSwlcjYKLQlzdWJiLD49ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJiLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViYixuc3YgJXI0LCVyNSwlcjYKLQlzdWJiLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJibyAlcjQsJXI1LCVyNgotCXN1YmJvLD0gJXI0LCVyNSwlcjYKLQlzdWJibyw8ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPD0gJXI0LCVyNSwlcjYKLQlzdWJibyw8PCAlcjQsJXI1LCVyNgotCXN1YmJvLDw8PSAlcjQsJXI1LCVyNgotCXN1YmJvLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sb2QgJXI0LCVyNSwlcjYKLQlzdWJibyx0ciAlcjQsJXI1LCVyNgotCXN1YmJvLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj0gJXI0LCVyNSwlcjYKLQlzdWJibyw+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj49ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj4gJXI0LCVyNSwlcjYKLQlzdWJibyxuc3YgJXI0LCVyNSwlcjYKLQlzdWJibyxldiAlcjQsJXI1LCVyNgotCi0Jc3VidCAlcjQsJXI1LCVyNgotCXN1YnQsPSAlcjQsJXI1LCVyNgotCXN1YnQsPCAlcjQsJXI1LCVyNgotCXN1YnQsPD0gJXI0LCVyNSwlcjYKLQlzdWJ0LDw8ICVyNCwlcjUsJXI2Ci0Jc3VidCw8PD0gJXI0LCVyNSwlcjYKLQlzdWJ0LHN2ICVyNCwlcjUsJXI2Ci0Jc3VidCxvZCAlcjQsJXI1LCVyNgotCXN1YnQsdHIgJXI0LCVyNSwlcjYKLQlzdWJ0LDw+ICVyNCwlcjUsJXI2Ci0Jc3VidCw+PSAlcjQsJXI1LCVyNgotCXN1YnQsPiAlcjQsJXI1LCVyNgotCXN1YnQsPj49ICVyNCwlcjUsJXI2Ci0Jc3VidCw+PiAlcjQsJXI1LCVyNgotCXN1YnQsbnN2ICVyNCwlcjUsJXI2Ci0Jc3VidCxldiAlcjQsJXI1LCVyNgotCi0Jc3VidG8gJXI0LCVyNSwlcjYKLQlzdWJ0byw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPCAlcjQsJXI1LCVyNgotCXN1YnRvLDw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPDwgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PD0gJXI0LCVyNSwlcjYKLQlzdWJ0byxzdiAlcjQsJXI1LCVyNgotCXN1YnRvLG9kICVyNCwlcjUsJXI2Ci0Jc3VidG8sdHIgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PiAlcjQsJXI1LCVyNgotCXN1YnRvLD49ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPiAlcjQsJXI1LCVyNgotCXN1YnRvLD4+PSAlcjQsJXI1LCVyNgotCXN1YnRvLD4+ICVyNCwlcjUsJXI2Ci0Jc3VidG8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3VidG8sZXYgJXI0LCVyNSwlcjYKLQotCXN1Yix0c3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LD0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LDwgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw8PCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixzdiAlcjQsJXI1LCVyNgotCXN1Yix0c3Ysb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw8PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsPj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LD4+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsPj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LG5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZXYgJXI0LCVyNSwlcjYKLQotCXN1YixiICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPSAlcjQsJXI1LCVyNgotCXN1YixiLDwgJXI0LCVyNSwlcjYKLQlzdWIsYiw8PSAlcjQsJXI1LCVyNgotCXN1YixiLDw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsc3YgJXI0LCVyNSwlcjYKLQlzdWIsYixvZCAlcjQsJXI1LCVyNgotCXN1YixiLHRyICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPD4gJXI0LCVyNSwlcjYKLQlzdWIsYiw+PSAlcjQsJXI1LCVyNgotCXN1YixiLD4gJXI0LCVyNSwlcjYKLQlzdWIsYiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsYiw+PiAlcjQsJXI1LCVyNgotCXN1YixiLG5zdiAlcjQsJXI1LCVyNgotCXN1YixiLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsYix0c3YgJXI0LCVyNSwlcjYKLQlzdWIsYix0c3YsPSAlcjQsJXI1LCVyNgotCXN1YixiLHRzdiw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsdHN2LDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsdHN2LDw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsdHN2LDw8PSAlcjQsJXI1LCVyNgotCXN1YixiLHRzdixzdiAlcjQsJXI1LCVyNgotCXN1YixiLHRzdixvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYix0ciAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw8PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixiLD4+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYixuc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGIsZXYgJXI0LCVyNSwlcjYKLQotCXN1Yix0YyAlcjQsJXI1LCVyNgotCXN1Yix0Yyw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLDwgJXI0LCVyNSwlcjYKLQlzdWIsdGMsPD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsPDwgJXI0LCVyNSwlcjYKLQlzdWIsdGMsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLG9kICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLD49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLD4gJXI0LCVyNSwlcjYKLQlzdWIsdGMsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLG5zdiAlcjQsJXI1LCVyNgotCXN1Yix0YyxldiAlcjQsJXI1LCVyNgotCi0Jc3ViLHRjLHRzdiAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsPSAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsPCAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsPD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LDw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiw8PD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdixvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsdHIgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0Yyw+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsPiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0Yyw+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0YyxldiAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YjIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwNDM1ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YjIucworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzdWIsKiAlcjQsJXI1LCVyNgotCXN1YiwqPSAlcjQsJXI1LCVyNgotCXN1YiwqPCAlcjQsJXI1LCVyNgotCXN1YiwqPD0gJXI0LCVyNSwlcjYKLQlzdWIsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLCo8PD0gJXI0LCVyNSwlcjYKLQlzdWIsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLCpvZCAlcjQsJXI1LCVyNgotCXN1YiwqdHIgJXI0LCVyNSwlcjYKLQlzdWIsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLCo+PSAlcjQsJXI1LCVyNgotCXN1YiwqPiAlcjQsJXI1LCVyNgotCXN1YiwqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLCo+PiAlcjQsJXI1LCVyNgotCXN1YiwqbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLCpldiAlcjQsJXI1LCVyNgotCi0Jc3ViLHRzdiwqICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKjwgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo8PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCpvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKm5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKmV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsZGIsKiAlcjQsJXI1LCVyNgotCXN1YixkYiwqPSAlcjQsJXI1LCVyNgotCXN1YixkYiwqPCAlcjQsJXI1LCVyNgotCXN1YixkYiwqPD0gJXI0LCVyNSwlcjYKLQlzdWIsZGIsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCo8PD0gJXI0LCVyNSwlcjYKLQlzdWIsZGIsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCpvZCAlcjQsJXI1LCVyNgotCXN1YixkYiwqdHIgJXI0LCVyNSwlcjYKLQlzdWIsZGIsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCo+PSAlcjQsJXI1LCVyNgotCXN1YixkYiwqPiAlcjQsJXI1LCVyNgotCXN1YixkYiwqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCo+PiAlcjQsJXI1LCVyNgotCXN1YixkYiwqbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCpldiAlcjQsJXI1LCVyNgotCi0Jc3ViLGRiLHRzdiwqICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLHRzdiwqPSAlcjQsJXI1LCVyNgotCXN1YixkYix0c3YsKjwgJXI0LCVyNSwlcjYKLQlzdWIsZGIsdHN2LCo8PSAlcjQsJXI1LCVyNgotCXN1YixkYix0c3YsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLHRzdiwqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLHRzdiwqc3YgJXI0LCVyNSwlcjYKLQlzdWIsZGIsdHN2LCpvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixkYiwqPD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCo+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCo+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCo+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKm5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKmV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsdGMsKiAlcjQsJXI1LCVyNgotCXN1Yix0YywqPSAlcjQsJXI1LCVyNgotCXN1Yix0YywqPCAlcjQsJXI1LCVyNgotCXN1Yix0YywqPD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCo8PD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCpvZCAlcjQsJXI1LCVyNgotCXN1Yix0YywqdHIgJXI0LCVyNSwlcjYKLQlzdWIsdGMsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCo+PSAlcjQsJXI1LCVyNgotCXN1Yix0YywqPiAlcjQsJXI1LCVyNgotCXN1Yix0YywqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCo+PiAlcjQsJXI1LCVyNgotCXN1Yix0YywqbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCpldiAlcjQsJXI1LCVyNgotCi0Jc3ViLHRjLHRzdiwqICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiwqPSAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsKjwgJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LCo8PSAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiwqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiwqc3YgJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LCpvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0YywqPD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCo+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCo+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCo+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKm5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKmV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YmkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA0M2RhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzdWJpIDEyMywlcjUsJXI2Ci0Jc3ViaSw9IDEyMywlcjUsJXI2Ci0Jc3ViaSw8IDEyMywlcjUsJXI2Ci0Jc3ViaSw8PSAxMjMsJXI1LCVyNgotCXN1YmksPDwgMTIzLCVyNSwlcjYKLQlzdWJpLDw8PSAxMjMsJXI1LCVyNgotCXN1Ymksc3YgMTIzLCVyNSwlcjYKLQlzdWJpLG9kIDEyMywlcjUsJXI2Ci0Jc3ViaSx0ciAxMjMsJXI1LCVyNgotCXN1YmksPD4gMTIzLCVyNSwlcjYKLQlzdWJpLD49IDEyMywlcjUsJXI2Ci0Jc3ViaSw+IDEyMywlcjUsJXI2Ci0Jc3ViaSw+Pj0gMTIzLCVyNSwlcjYKLQlzdWJpLD4+IDEyMywlcjUsJXI2Ci0Jc3ViaSxuc3YgMTIzLCVyNSwlcjYKLQlzdWJpLGV2IDEyMywlcjUsJXI2Ci0KLQlzdWJpbyAxMjMsJXI1LCVyNgotCXN1YmlvLD0gMTIzLCVyNSwlcjYKLQlzdWJpbyw8IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPD0gMTIzLCVyNSwlcjYKLQlzdWJpbyw8PCAxMjMsJXI1LCVyNgotCXN1YmlvLDw8PSAxMjMsJXI1LCVyNgotCXN1YmlvLHN2IDEyMywlcjUsJXI2Ci0Jc3ViaW8sb2QgMTIzLCVyNSwlcjYKLQlzdWJpbyx0ciAxMjMsJXI1LCVyNgotCXN1YmlvLDw+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj0gMTIzLCVyNSwlcjYKLQlzdWJpbyw+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj49IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj4gMTIzLCVyNSwlcjYKLQlzdWJpbyxuc3YgMTIzLCVyNSwlcjYKLQlzdWJpbyxldiAxMjMsJXI1LCVyNgotCi0Jc3ViaSx0c3YgMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw9IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPCAxMjMsJXI1LCVyNgotCXN1YmksdHN2LDw9IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPDwgMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw8PD0gMTIzLCVyNSwlcjYKLQlzdWJpLHRzdixzdiAxMjMsJXI1LCVyNgotCXN1YmksdHN2LG9kIDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsdHIgMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw8PiAxMjMsJXI1LCVyNgotCXN1YmksdHN2LD49IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPiAxMjMsJXI1LCVyNgotCXN1YmksdHN2LD4+PSAxMjMsJXI1LCVyNgotCXN1YmksdHN2LD4+IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsbnN2IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsZXYgMTIzLCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTg0NmI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWJyZWFrIDUsMTIKLQlyZmkKLQlyZmlyCi0Jc3NtIDUsJXI0Ci0JcnNtIDUsJXI0Ci0JbXRzbSAlcjQKLQlsZHNpZCAoJXNyMCwlcjUpLCVyNAotCW10c3AgJXI0LCVzcjAKLQltdGN0bCAlcjQsJWNyMTAKLQltZnNwICVzcjAsJXI0Ci0JbWZjdGwgJWNyMTAsJXI0Ci0Jc3luYwotCXN5bmNkbWEKLQlkaWFnIDEyMzQKLQotCXByb2JlciAoJXNyMCwlcjUpLCVyNiwlcjcKLQlwcm9iZXJpICglc3IwLCVyNSksMSwlcjcKLQlwcm9iZXcgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmV3aSAoJXNyMCwlcjUpLDEsJXI3Ci0JCi0JbHBhICVyNCglc3IwLCVyNSksJXI2Ci0JbHBhLG0gJXI0KCVzcjAsJXI1KSwlcjYKLQlsaGEgJXI0KCVzcjAsJXI1KSwlcjYKLQlsaGEsbSAlcjQoJXNyMCwlcjUpLCVyNgotCWxjaSAlcjQoJXNyMCwlcjUpLCVyNgotCi0JaWR0bGJhICVyNCwoJXNyMCwlcjUpCi0JaWl0bGJhICVyNCwoJXNyNCwlcjUpCi0JaWR0bGJwICVyNCwoJXNyMCwlcjUpCi0JaWl0bGJwICVyNCwoJXNyNCwlcjUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjczM2E4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBMi4wIHN5c3RlbSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JcmZpCi0JcmZpLHIKLQlzc20gOTIzLCVyNAotCXJzbSA5MjMsJXI0Ci0JbWZjdGwsdyAlY3IxMSwlcjQKLQotCXByb2JlLHIgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmVpLHIgKCVzcjAsJXI1KSwxLCVyNwotCXByb2JlLHcgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmVpLHcgKCVzcjAsJXI1KSwxLCVyNwotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyZmVmZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIHVuaXQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0JdXhvciAlcjQsJXI1LCVyNgotCXV4b3Isc2J6ICVyNCwlcjUsJXI2Ci0JdXhvcixzaHogJXI0LCVyNSwlcjYKLQl1eG9yLHNkYyAlcjQsJXI1LCVyNgotCXV4b3Isc2JjICVyNCwlcjUsJXI2Ci0JdXhvcixzaGMgJXI0LCVyNSwlcjYKLQl1eG9yLHRyICVyNCwlcjUsJXI2Ci0JdXhvcixuYnogJXI0LCVyNSwlcjYKLQl1eG9yLG5oeiAlcjQsJXI1LCVyNgotCXV4b3IsbmRjICVyNCwlcjUsJXI2Ci0JdXhvcixuYmMgJXI0LCVyNSwlcjYKLQl1eG9yLG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sc2RjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdHIgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbSxuZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtdCAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2J6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY210LHNkYyAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2JjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY210LHRyICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuYnogJXI0LCVyNSwlcjYKLQl1YWRkY210LG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbXQsbmRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuYmMgJXI0LCVyNSwlcjYKLQl1YWRkY210LG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtLHRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLHNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsc2RjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLHNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsdHIgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxuZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLG5oYyAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA3ZGFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdDIucworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQTIuMCB1bml0IGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotCXV4b3IsKiAlcjQsJXI1LCVyNgotCXV4b3IsKnNieiAlcjQsJXI1LCVyNgotCXV4b3IsKnNoeiAlcjQsJXI1LCVyNgotCXV4b3IsKnNkYyAlcjQsJXI1LCVyNgotCXV4b3IsKnNiYyAlcjQsJXI1LCVyNgotCXV4b3IsKnNoYyAlcjQsJXI1LCVyNgotCXV4b3IsKnRyICVyNCwlcjUsJXI2Ci0JdXhvciwqbmJ6ICVyNCwlcjUsJXI2Ci0JdXhvciwqbmh6ICVyNCwlcjUsJXI2Ci0JdXhvciwqbmRjICVyNCwlcjUsJXI2Ci0JdXhvciwqbmJjICVyNCwlcjUsJXI2Ci0JdXhvciwqbmhjICVyNCwlcjUsJXI2Ci0KLQl1YWRkY20sKiAlcjQsJXI1LCVyNgotCXVhZGRjbSwqc2J6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpzaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sKnNkYyAlcjQsJXI1LCVyNgotCXVhZGRjbSwqc2JjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sKnRyICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpuYnogJXI0LCVyNSwlcjYKLQl1YWRkY20sKm5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbSwqbmRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpuYmMgJXI0LCVyNSwlcjYKLQl1YWRkY20sKm5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtLHRjLCogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKnNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0Yywqc2h6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpzZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKnNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0Yywqc2hjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCp0ciAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YywqbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpuaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKm5kYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YywqbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpuaGMgJXI0LCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvd2VpcmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvd2VpcmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmNGVhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3dlaXJkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzAgKzAsMCBAQAotCS5zdGFicyAid2VpcmQuYyIsMHg2NCwwLDAsTGFiZWwwCi1MYWJlbDA6Ci0JLnN0YWJzICJpbnR0eXBlOnQxPWJ1NDswOzMyOyIsMHg4MCwwLDAsMAotCi0KLQkuc3RhYnMgInN5bTMyOiAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAidHlwZTMyOnQzMj0gICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQotCS5zdGFicyAiYXR0cjEwNDpHNDA0PUBoICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDU6RzQwNT1AaSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgInZhcjA6RzMwMD1AYTg7MSIsMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHZhcjAKLQkuZGF0YQotCS5hbGlnbiA0Ci12YXIwOgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInN5bTMzOiEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM1OiMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM2OiQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM3OiUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM4OiYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM5OicgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQwOiggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQxOikgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQyOiogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQzOisgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ0OiwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ1Oi0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5leHBvcnQgYXR0cjEyMgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTIzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTI0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyNDoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJzeW00NjouICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00NzovICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00ODowICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00OToxICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01MDoyICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgImF0dHI5NjpHMzk2PUBgICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5NzpHMzk3PUBhICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5ODpHMzk4PUBiICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5OTpHMzk5PUBjICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAic3ltNTE6MyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTI6NCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTM6NSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTQ6NiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTU6NyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTY6OCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTc6OSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTg6OiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTk6OyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjA6PCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjE6PSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjI6PiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjM6PyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjQ6QCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjU6QSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjY6QiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjc6QyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjg6RCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjk6RSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzA6RiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzE6RyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzI6SCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzM6SSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzQ6SiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzU6SyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzY6TCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzc6TSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzg6TiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzk6TyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODA6UCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODE6USAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODI6UiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODM6UyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODQ6VCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODU6VSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODY6ViAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODc6VyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODg6WCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODk6WSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTA6WiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTE6WyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJzeW05MzpdICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05NDpeICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05NTpfICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05NjpgICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05NzphICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05ODpiICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05OTpjICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDA6ZCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTAxOmUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwMjpmICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDM6ZyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA0OmggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwNTppICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDY6aiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA3OmsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwODpsICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDk6bSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTEwOm4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExMTpvICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTI6cCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTEzOnEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExNDpyICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTU6cyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE2OnQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExNzp1ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTg6diAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE5OncgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyMDp4ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjE6eSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTIyOnogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyMzp7ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjQ6fCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTI1On0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyNjp+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgInR5cGUzMzp0MzM9ISAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTM1OnQzNT0jICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzY6dDM2PSQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUzNzp0Mzc9JSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTM4OnQzOD0mICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzk6dDM5PScgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0MDp0NDA9KCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQxOnQ0MT0pICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDI6dDQyPSogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0Mzp0NDM9KyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ0OnQ0ND0sICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDU6dDQ1PS0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0Njp0NDY9LiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ3OnQ0Nz0vICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDg6dDQ4PTAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0OTp0NDk9MSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTUwOnQ1MD0yICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTE6dDUxPTMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1Mjp0NTI9NCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTUzOnQ1Mz01ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTQ6dDU0PTYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1NTp0NTU9NyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU2OnQ1Nj04ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTc6dDU3PTkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1ODp0NTg9OiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU5OnQ1OT07ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjA6dDYwPTwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2MTp0NjE9PSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTYyOnQ2Mj0+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjM6dDYzPT8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2NDp0NjQ9QCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTY1OnQ2NT1BICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjY6dDY2PUIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2Nzp0Njc9QyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLmV4cG9ydCBhdHRyNjYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2NwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2NzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjY4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjk6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAidHlwZTY4OnQ2OD1EICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjk6dDY5PUUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3MDp0NzA9RiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTcxOnQ3MT1HICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzI6dDcyPUggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3Mzp0NzM9SSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc0OnQ3ND1KICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzU6dDc1PUsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3Njp0NzY9TCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc3OnQ3Nz1NICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzg6dDc4PU4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3OTp0Nzk9TyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTgwOnQ4MD1QICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODE6dDgxPVEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4Mjp0ODI9UiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTgzOnQ4Mz1TICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODQ6dDg0PVQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4NTp0ODU9VSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTg2OnQ4Nj1WICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODc6dDg3PVcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAiYXR0cjY5OkczNjk9QEUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjcwOkczNzA9QEYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjcxOkczNzE9QEcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJ0eXBlODg6dDg4PVggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4OTp0ODk9WSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTkwOnQ5MD1aICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTE6dDkxPVsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAidHlwZTkzOnQ5Mz1dICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTQ6dDk0PV4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5NTp0OTU9XyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk2OnQ5Nj1gICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTc6dDk3PWEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5ODp0OTg9YiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk5OnQ5OT1jICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTAwOnQxMDA9ZCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwMTp0MTAxPWUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDI6dDEwMj1mICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTAzOnQxMDM9ZyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwNDp0MTA0PWggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDU6dDEwNT1pICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA2OnQxMDY9aiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwNzp0MTA3PWsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDg6dDEwOD1sICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA5OnQxMDk9bSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExMDp0MTEwPW4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTE6dDExMT1vICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTEyOnQxMTI9cCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExMzp0MTEzPXEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTQ6dDExND1yICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE1OnQxMTU9cyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExNjp0MTE2PXQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTc6dDExNz11ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE4OnQxMTg9diAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExOTp0MTE5PXcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjA6dDEyMD14ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTIxOnQxMjE9eSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyMjp0MTIyPXogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjM6dDEyMz17ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTI0OnQxMjQ9fCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyNTp0MTI1PX0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjY6dDEyNj1+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgImF0dHIzMjpHMzMyPUAgICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIzMzpHMzMzPUAhICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIzNTpHMzM0PUAjICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAicHJpbWFyeTpHMjAwPWVyZWQ6MCxncmVlbjoxLGJsdWU6Miw7IiwgMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjM2OkczMzU9QCQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLmV4cG9ydCBwcmltYXJ5Ci0JLmRhdGEKLQkuYWxpZ24gNAotcHJpbWFyeToKLQkubG9uZyA0MgotCi0JLnN0YWJzICJhdHRyMzc6RzMzNz1AJSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgImNvbnN0Njk6Yz1lMSw2OSIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImNvbnN0NzA6Yz1lMTkwPWJzMjswOzE2Oyw3MCIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImF0dHIzODpHMzM4PUAmICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYmFkX25lZzB0eXBlOnQyMDE9czhmaWVsZDA6MSwwLDMyO2ZpZWxkMjotNTM0LDMyLDY0O2ZpZWxkMzotMSw5NiwzMjs7IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYmFkX25lZzA6RzIwMSIsIDB4MjAsMCwwLCAwCi0KLQkuZXhwb3J0IGJhZF9uZWcwCi0JLmRhdGEKLQkuYWxpZ24gNAotYmFkX25lZzA6Ci0JLmxvbmcgNDIKLQkubG9uZyA0MywgNDQsIDQ1Ci0KLQkuc3RhYnMgImF0dHIzOTpHMzM5PUAnICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0MTpHMzQxPUApICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0MjpHMzQyPUAqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0MzpHMzQzPUArICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0NDpHMzQ0PUAsICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0NjpHMzQ2PUAuICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0NzpHMzQ3PUAvICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI1ODpHMzU4PUA6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjU5OkczNTk9QDtAICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjYwOkczNjA9QDwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjYxOkczNjE9QD0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjYyOkczNjI9QD4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjYzOkczNjM9QD8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY0OkczNjQ9QEAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY1OkczNjU9QEEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY2OkczNjY9QEIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY3OkczNjc9QEMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY4OkczNjg9QEQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjcyOkczNzI9QEggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjczOkczNzM9QEkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc0OkczNzQ9QEogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc1OkczNzU9QEsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc2OkczNzY9QEwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc3OkczNzc9QE0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc4OkczNzg9QE4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc5OkczNzk9QE8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjgwOkczODA9QFAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjgxOkczODE9QFEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjgyOkczODI9QFIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjgzOkczODM9QFMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg0OkczODQ9QFQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg1OkczODU9QFUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg2OkczODY9QFYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg3OkczODc9QFcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg4OkczODg9QFggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg5OkczODk9QFkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjkwOkczOTA9QFogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjkxOkczOTE9QFsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyOTM6RzM5Mz1AXSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQotCS5leHBvcnQgX2NvbW1vbjAKLQkuZGF0YQotCS5hbGlnbiA0Ci1fY29tbW9uMDoKLQkubG9uZyA0MgotCS5sb25nIDI0Ci0JLmxvbmcgMjIKLQkuZXhwb3J0IGNvbW1vbjAKLQkuZGF0YQotCS5hbGlnbiA0Ci1jb21tb24wOgotCS5sb25nIDQyCi0JLmxvbmcgMjQKLQkubG9uZyAyMgotCS5zdGFicyAgImNvbW1vbjAiLDB4ZTIsMCwwLDAKLQkuc3RhYnMgImNvbW1vbjB2YXIwOlMxIiwgMHgyMCwwLDAsIDAKLQkuc3RhYnMgImNvbW1vbjB2YXIxOlMxIiwgMHgyMCwwLDAsIDQKLQkuc3RhYnMgImNvbW1vbjB2YXIyOlMxIiwgMHgyMCwwLDAsIDgKLQkuc3RhYnMgICJjb21tb24wIiwweGU0LDAsMCwwCi0KLQkuc3RhYnMgImF0dHI5NDpHMzk0PUBeICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5NTpHMzk1PUBfICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDA6RzQwMD1AZCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTAxOkc0MDE9QGUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwMjpHNDAyPUBmICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDM6RzQwMz1AZyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTA2Okc0MDY9QGogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwNzpHNDA3PUBrICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDg6RzQwOD1AbCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTA5Okc0MDk9QG0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExMDpHNDEwPUBuICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTE6RzQxMT1AbyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTEyOkc0MTI9QHAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExMzpHNDEzPUBxICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTQ6RzQxND1AciAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE1Okc0MTU9QHMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExNjpHNDE2PUB0ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTc6RzQxNz1AdSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE4Okc0MTg9QHYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExOTpHNDE5PUB3ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjA6RzQyMD1AeCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTIxOkc0MjE9QHkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyMjpHNDIyPUB6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjM6RzQyMz1AeyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTI0Okc0MjQ9QHwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyNTpHNDI1PUB9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjY6RzQyNj1AfiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuZXhwb3J0IGF0dHIzMgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzMjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjMzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjMzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzNgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzNjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjM3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjM3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzOQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzOToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQ0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQ0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0NwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0NzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjU4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjU4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNTkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNTk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2MAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2MDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjYxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjYxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjY0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3MAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3MDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjcxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjcxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3OToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjgwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjgwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjgzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjgzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODQ6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAiZmxvYXQ3MnR5cGU6dDIwMj1SODc7OTsiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJpbnQyNTZ2YXI6RzIwMz1idTMyOzA7MjU2OyIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBpbnQyNTZ2YXIKLQkuZGF0YQotCS5hbGlnbiA0Ci1pbnQyNTZ2YXI6Ci0JLmxvbmcgNDIKLQkubG9uZyAweDJiLCAweDJjLCAweDJkLCAweDJkLCAweDJjLCAweDJiLCAweDJhCi0KLQotCS5zdGFicyAiY29uc3RoOmM9ZTEsNDI5NDk2NzI5NiIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImNvbnN0aDI6Yz1lMSwtNzM0NzIzOTg1NzMyNjQyNzU4OTI4NDc1Njc4OTg3MjM0NTYzMjg0OTM3NDU2IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYmFkX25lZzBjb25zdDpjPVMyMDEsMTI4LDEyOCwxMTIyMjIxMTM0MzQzNDM0NTY1NjU2NTY3Nzg4ODg3NyIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImJhZF90eXBlMDp0KC0zLDcpIiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImJhZF90eXBlMTp0KDQyLDYpIiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYXJyYXlfaW5kZXgwOnQyMDU9cjE7MDs1OyIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJhcnJheTA6RzIwNj1hMjA1OzEiLCAweDIwLDAsMCwgMAotCS5leHBvcnQgYXJyYXkwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXJyYXkwOgotCS5sb25nIDQyCi0JLmxvbmcgNDMsIDQ0LCA0NSwgNDYsIDQ3Ci0KLQkuc3RhYnMgImFycmF5X2luZGV4MTp0MjA3PSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJhcnJheTE6RzIwOD1hZWFpMV9yZWQ6MCxhaTFfZ3JlZW46MSxhaTFfYmx1ZToyLDs7MSIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBhcnJheTEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hcnJheTE6Ci0JLmxvbmcgNDIKLQkubG9uZyA0MywgNDQKLQotCS5zdGFicyAiaW50dHlwZV9vbmU6dDIwOT0xIiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImludHR5cGVfdHdvOnQyMTA9MSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJvbmVfdmFyOkcyMDkiLCAweDIwLDAsMCwgMAotCS5leHBvcnQgb25lX3ZhcgotCS5kYXRhCi0JLmFsaWduIDQKLW9uZV92YXI6Ci0JLmxvbmcgNDIKLQkuc3RhYnMgInR3b192YXI6RzIxMCIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB0d29fdmFyCi0JLmRhdGEKLQkuYWxpZ24gNAotdHdvX3ZhcjoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJpbnRwOnQyMTE9KjEiLCAweDgwLDAsMCwgMAotCS5zdGFicyAicG9pbnRlcl90b19pbnRfdmFyOkcyMTI9KjEiLCAweDgwLDAsMCwgMAotCS5zdGFicyAiaW50cF92YXI6RzIxMSIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBpbnRwX3ZhcgotCS5kYXRhCi0JLmFsaWduIDQKLWludHBfdmFyOgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInVucmVjb2dfY29uc3Q6Yz14amtzZGZsc2tkMzMsNDs0NzM7IiwgMHg4MCwwLDAsIDAKLQotCS5leHBvcnQgYXR0cjg1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4NwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4NzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjg4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5MAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5MDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjkxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjkxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5OToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwMAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTAxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTAyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwMjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwMwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwNToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwNgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwOQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTEwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTExCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExMToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExMgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTEzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExNDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExNQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExNzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExOAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTIwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyMDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyMQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTI1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTI2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyNjoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJ2YXIxOkczMDE9QHMzMjsxIiwweDIwLDAsMCwgMAotCS5leHBvcnQgdmFyMQotCS5kYXRhCi0JLmFsaWduIDQKLXZhcjE6Ci0JLmxvbmcgNDIKLQkuc3RhYnMgInZhcjI6RzMwMj1AcDQyOzEiLDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB2YXIyCi0JLmRhdGEKLQkuYWxpZ24gNAotdmFyMjoKLQkubG9uZyA0MgotCS5zdGFicyAidmFyMzpHMzAzPUBQOzEiLDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB2YXIzCi0JLmRhdGEKLQkuYWxpZ24gNAotdmFyMzoKLQkubG9uZyA0MgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCS5zdGFicyAidl9jb21iOkc0NDg9czI0ITIsMDIwLDQ0NT1zMTIhMSwxMjAsNDQ0PXM0eDoxLDAsMzI7OzskdmI0NDQ6NDQ2PSo0NDQsMDthOi8wMSwzMiwzMjs7OzAyNjQsNDQ3PXMxMiExLDEyMCw0NDQ7JHZiNDQ0OjQ0NiwwO2I6LzAxLDMyLDMyOzs7Y29tYjovMDEsMTI4LDMyOzsiLCAweDIwLDAsMCwgMAotCi0JLmV4cG9ydCB2X2NvbWIKLQkuYWxpZ24gMQotdl9jb21iOgotCS5sb25nIHZfY29tYl9zaGFyZWQgCi0JLmxvbmcgNDMgCi0JLmxvbmcgdl9jb21iX3NoYXJlZCAKLQkubG9uZyA0NCAKLQkubG9uZyA0NSAKLXZfY29tYl9zaGFyZWQ6Ci0JLmxvbmcgNDIgCi0KLQkuc3RhYnMgInN5bTkyOlxcICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTI6dDkyPVxcICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJhdHRyOTI6RzM5Mj1AXFwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTRhZjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjEucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiAxCi0JLmFsaWduIDgKLQlub3AKLTsgIjgiIGFzc3VtZWQgaWYgbm8gYWxpZ25tZW50IGdpdmVuLgotCS5hbGlnbgotCW5vcAotCS5hbGlnbiA0MDk2Ci0Jbm9wCi0KLQotCS5kYXRhCi0KLSAgICAgICAgLkFMSUdOICA4Ci0kTDAwQlNTOgotaG9tZV9idWZmOgotICAgICAgICAuQkxPQ0sgIDEwMjQKLSAgICAgICAgLkFMSUdOICA4Ci1jdXJyZW50X2J1ZmY6Ci0gICAgICAgIC5CTE9DSyAgMTAyNAotICAgICAgICAuQUxJR04gIDQKLWxvY2tfZmlsZToKLSAgICAgICAgLkJMT0NLICA0Ci0gICAgICAgIC5BTElHTiAgOAotTDMzMi5uYW1lOgotICAgICAgICAuQkxPQ0sgIDMwCi0gICAgICAgIC5BTElHTiAgNAotTDM1Mi5sYXN0X2Nhc2Vfd2E6Ci0gICAgICAgIC5CTE9DSyAgNAotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmEzNThlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiAzCi0KLQkKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FwcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hcHBidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzN2Y5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FwcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyAxICJjcnQwLnMiCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTNmNDI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvb2JhcixFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUZSLEFSR1cxPUZVLEFSR1cyPUZSLEFSR1czPUZVLFJUTlZBTD1GUgotZm9vYmFyCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCWxkbyAtNjQoJXIzMCksJXIyMAotCWFkZGlsIExSJ3gtJGdsb2JhbCQsJXIyNwotCWZsZGRzIDgoJXIyMCksJWZyNAotCWZsZGRzIDAoJXIyMCksJWZyMjIKLQlsZG8gUlIneC0kZ2xvYmFsJCglcjEpLCVyMTkKLQlmbXB5c3ViLHNnbCAlZnI1TCwlZnI3TCwlZnI1TCwlZnIyMkwsJWZyNEwKLQlidiAlcjAoJXIyKQotCWZzdGRzICVmcjUsMCglcjE5KQotCS5FWElUCi0JLlBST0NFTkQKLQkuYnNzCi0KLXgJLmNvbW0gOAoteQkuY29tbSA4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxMmFiNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS5kYXRhCi0KLQotZm9vOgotCS5ibG9jawotYmFyOgotCS5ibG9jayAweDdmZmZmZmZmCi1jb206Ci0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmZDE5OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmRhdGEKLWZvbzoKLQkuYmxvY2sgLTEKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwNmEwZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLUxDJDAwMDA6Ci0JLlNUUklORyAiJWQgJWxmICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGVycm9yX18zQUFBaWlkaQotCS5FWFBPUlQgZXJyb3JfXzNBQUFpaWRpLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9RlIsQVJHVzQ9RlUsUlROVkFMPUdSCi1lcnJvcl9fM0FBQWlpZGk6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZG8gLTgoJXIwKSwlcjYKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNiwlcjcKLQlzdHcgJXIyNSwwKCVyNykKLQlsZG8gLTEyKCVyMCksJXI4Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjgsJXI5Ci0Jc3R3ICVyMjQsMCglcjkpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC0yNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkbyAtMjgoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JbGRpbCBMJ0xDJDAwMDAsJXIyNgotCWxkbyBSJ0xDJDAwMDAoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlmbGRkcyAwKCVyMjApLCVmcjcKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1GUixBUkdXMz1GVQotCWJsIHByaW50ZiwlcjIKLQlub3AKLQlibCxuIEwkMDAwMiwlcjAKLQlibCxuIEwkMDAwMSwlcjAKLUwkMDAwMjoKLUwkMDAwMToKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgb2tfXzNBQUFpZGkKLQkuRVhQT1JUIG9rX18zQUFBaWRpLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUsUlROVkFMPUdSCi1va19fM0FBQWlkaToKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JY29weSAlcjI2LCVyNQotCWxkbyAtOCglcjApLCVyNgotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI2LCVyNwotCXN0dyAlcjI1LDAoJXI3KQotCWxkbyAtMTYoJXIwKSwlcjgKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOCwlcjkKLQlmc3RkcyAlZnI3LDAoJXI5KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtMTYoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTIwKCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JZmxkZHMgMCglcjIwKSwlZnI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUKLQlibCBwcmludGYsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMDQsJXIwCi0JYmwsbiBMJDAwMDMsJXIwCi1MJDAwMDQ6Ci1MJDAwMDM6Ci0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5hbGlnbiA4Ci1MQyQwMDAxOgotCTsgLmRvdWJsZSA1LjUwMDAwMDAwMDAwMDAwMDAwMDAwZSswMAotCS53b3JkIDEwNzUxODM2MTYgOyA9IDB4NDAxNjAwMDAKLQkud29yZCAwIDsgPSAweDAKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbgotCS5FWFBPUlQgbWFpbixQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCS5DQUxMIAotCWJsIF9fbWFpbiwlcjIKLQlub3AKLQlsZG8gLTI0KCVyMCksJXIxOQotCWxkbyAtMzIoJXIzMCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDAxLCVyMjAKLQlsZG8gUidMQyQwMDAxKCVyMjApLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQoJXIyMSksJXIyMwotCXN0dyAlcjIyLDAoJXIxOSkKLQlzdHcgJXIyMyw0KCVyMTkpCi0JbGRvIDMoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksLTYwKCVyMzApCi0JbGRvIDgoJXI0KSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JbGRvIDQoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBlcnJvcl9fM0FBQWlpZGksJXIyCi0Jbm9wCi0JbGRvIDMoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksLTUyKCVyMzApCi0JbGRvIDgoJXI0KSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JbGRpbCBMJ0xDJDAwMDEsJXIxOQotCWxkbyBSJ0xDJDAwMDEoJXIxOSksJXIyMAotCWZsZGRzIDAoJXIyMCksJWZyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVCi0JYmwgb2tfXzNBQUFpZGksJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDA1LCVyMAotCWJsLG4gTCQwMDA1LCVyMAotTCQwMDA1OgotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsaW5mb2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsaW5mb2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzY4ZTg3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuZXhwb3J0IGRpdnUsbWlsbGljb2RlCi0JLnByb2MKLQkuY2FsbGluZm8gbWlsbGljb2RlCi1kaXZ1Ci0JLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZGVmYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2RlZmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDgyNjU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZGVmYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLmltcG9ydAlfc2V0ZXJybm8KLSAJLmV4cG9ydCAgIHZmb3JrICAhCS5sYWJlbCAgIHZmb3JrICAhCS5wcm9jIQkuY2FsbGluZm8gbm9fY2FsbHMhCS5lbnRyeSAhCSAJLmxhYmVsCV9fdmZvcmsgICEJbXRzcAklcjAsJXNyMCEJbGRpbAlMJTB4YzAwMDAwMDQsJXIxIQlibGUJUiUweGMwMDAwMDA0KCVzcjAsJXIxKSEJbGRpCTY2ICAgLCVyMjIgIQliLG4JeXl5IQliLG4JX192Zm9yayAhCWIJX3NldGVycm5vIQljb3B5CSVyMjgsJXIyNiEJLmxhYmVsCXl5eSAKLQlhZGQsPQklcjAsJXIyOSwlcjAJCSAKLQljb3B5CSVyMCwlcjI4CQkgCi0JYnYsbgkoJXIyKQotCS5leGl0Ci0gCS5wcm9jZW5kIAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0ZjczNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLlBBUkFNIGZvbyxSVE5WQUw9R1IKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsTk9fQ0FMTFMsRU5UUllfR1I9MSxFTlRSWV9GUj0xMQotCS5FTlRSWQotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cG9ydGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjkwNDFmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0gICAgICAgIC5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwcmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHByYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDRkMmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHByYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbgk4Ci0JLmV4cG9ydAlpY29kZSxkYXRhCi1pY29kZToKLQkucHJvYwotCS5jYWxsaW5mbwlmcmFtZT0wLG5vX2NhbGxzCi0JLmVudHJ5Ci0JYnYsbgklcjAoJXIyKQotCS5leGl0Ci0Jbm9wCi0JLnByb2NlbmQKLQotCTsKLQk7IEZJUlNULCBhcmd2IGFycmF5IG9mIHBvaW50ZXJzIHRvIGFyZ3MsIDFzdCBpcyBzYW1lIGFzIHBhdGguCi0JOwotCS5hbGlnbgk4Ci1pY19hcmd2OgotCS53b3JkCWljX2FyZ3YxLWljb2RlCTsgc2Vjb25kLCBwb2ludGVyIHRvIDFzdCBhcmd1bWVudAotCS53b3JkCWljX3BhdGgtaWNvZGUJCTsgZmlyc3QsICBwb2ludGVyIHRvIGluaXQgcGF0aAotCS53b3JkCTAJCQk7IGZvdXJ0aCwgTlVMTCBhcmd2IHRlcm1pbmF0b3IgKHBhZCkKLQkud29yZAkwCQkJOyB0aGlyZCwgIE5VTEwgYXJndiB0ZXJtaW5hdG9yCi0KLWljX3BhdGg6Ci0JLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKLQkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKLQkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCi0KLWljX2FyZ3YxOgotCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCi0JLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCi0JLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgotCi0JLmV4cG9ydAlzemljb2RlLGRhdGEKLXN6aWNvZGU6Ci0JLndvcmQJc3ppY29kZS1pY29kZQotCS53b3JkCTAJCQk7IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZmlsbGVyIGF0IGVuZAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2ZpeHVwN2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9maXh1cDdidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4NDJiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2ZpeHVwN2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjE2NyArMCwwIEBACi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi0JLmNvZGUKLQkuYWxpZ24gNAotCS5FWFBPUlQgYWxsb2NfdHlwZSxDT0RFCi0JLkVYUE9SVCBhbGxvY190eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1hbGxvY190eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjcsMzIoJXI0KQotCXN0dyAlcjYsMzYoJXI0KQotCXN0dyAlcjUsNDAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAwMiwlcjAKLQlub3AKLQlsZG8gNTIoJXIwKSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCB4bWFsbG9jLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjcKLQlibCxuIEwkMDAwMywlcjAKLUwkMDAwMjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxMjAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyNCkKLQlsZG8gNTIoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMTYoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDA0LCVyMAotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZHcgMTYoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwMDUsJXIwCi1MJDAwMDQ6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDAwNTogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyAxNiglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyAyNCglcjQpLCVyMTkKLQljb21jbHIsPSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMDA2LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgNDAoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JZGVwaSAtMSwxLDEsJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi1MJDAwMDY6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxMiglcjIwKSwlcjIwCi0JbGR3IDI0KCVyMjEpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDI0KCVyMjEpLCVyMjIKLQl1YWRkY20gJXIwLCVyMjIsJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjE5KSwlcjE5Ci0JbGR3IDQoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDE2KCVyMjApLCVyMjAKLQlsZHcgNCglcjIxKSwlcjIxCi0Jc3ViICVyMjAsJXIyMSwlcjIwCi0JY29tY2xyLD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDAwNywlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQljb3B5ICVyMjEsJXIxOQotCWJsLG4gTCQwMDA4LCVyMAotTCQwMDA3OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwMDg6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw4KCVyMTkpCi0JbGR3IDI0KCVyNCksJXI3Ci1MJDAwMDM6IAotCWNvcHkgJXI3LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCXN0dyAlcjAsMCglcjcpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDEyKCVyNykKLQlsZG8gLTEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI3KQotCWNvcHkgJXI3LCVyMjgKLQlibCxuIEwkMDAwMSwlcjAKLUwkMDAwMTogCi0JbGR3IDMyKCVyNCksJXI3Ci0JbGR3IDM2KCVyNCksJXI2Ci0JbGR3IDQwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWtlX3BvaW50ZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX3BvaW50ZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbWFrZV9wb2ludGVyX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOSwxNiglcjQpCi0Jc3R3ICVyOCwyMCglcjQpCi0Jc3R3ICVyNywyNCglcjQpCi0Jc3R3ICVyNiwyOCglcjQpCi0Jc3R3ICVyNSwzMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyMCglcjE5KSwlcjkKLQljb21pY2xyLDw+IDAsJXI5LCVyMAotCWJsIEwkMDAxMCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMTEsJXIwCi0Jbm9wCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotCWJsLG4gTCQwMDEyLCVyMAotTCQwMDExOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDEzLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMDksJXIwCi1MJDAwMTM6IAotTCQwMDEyOiAKLUwkMDAxMDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAxNSwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDE0LCVyMAotCW5vcAotCWJsLG4gTCQwMDE1LCVyMAotTCQwMDE1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMTYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotTCQwMDE2OiAKLQlibCxuIEwkMDAxNywlcjAKLUwkMDAxNDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyOQotCWxkdyAxMiglcjkpLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLQljb3B5ICVyOSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjkpCi1MJDAwMTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjAoJXIxOSkKLQlsZG8gNCglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyOSkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZGggMzIoJXI5KSwlcjE5Ci0JY29weSAlcjE5LCVyMjAKLQlkZXBpIC0xLDMxLDEsJXIyMAotCXN0aCAlcjIwLDMyKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDIwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyMCglcjE5KQotTCQwMDE4OiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMDksJXIwCi1MJDAwMDk6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3BvaW50ZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfcG9pbnRlcl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcG9pbnRlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfcG9pbnRlcl90eXBlLCVyMgotCW5vcAotCWJsLG4gTCQwMDE5LCVyMAotTCQwMDE5OiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFrZV9yZWZlcmVuY2VfdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX3JlZmVyZW5jZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1tYWtlX3JlZmVyZW5jZV90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjksMTYoJXI0KQotCXN0dyAlcjgsMjAoJXI0KQotCXN0dyAlcjcsMjQoJXI0KQotCXN0dyAlcjYsMjgoJXI0KQotCXN0dyAlcjUsMzIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjQoJXIxOSksJXI5Ci0JY29taWNsciw8PiAwLCVyOSwlcjAKLQlibCBMJDAwMjEsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDIyLCVyMAotCW5vcAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLQlibCxuIEwkMDAyMywlcjAKLUwkMDAyMjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyNCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDIwLCVyMAotTCQwMDI0OiAKLUwkMDAyMzogCi1MJDAwMjE6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMjYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyNSwlcjAKLQlub3AKLQlibCxuIEwkMDAyNiwlcjAKLUwkMDAyNjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDI3LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLUwkMDAyNzogCi0JYmwsbiBMJDAwMjgsJXIwCi1MJDAwMjU6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjkKLQlsZHcgMTIoJXI5KSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JY29weSAlcjksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI5KQotTCQwMDI4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI0KCVyMTkpCi0JbGRvIDQoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjkpCi0JbGRvIDE2KCVyMCksJXIxOQotCXN0dyAlcjE5LDAoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjQoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDI5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI0KCVyMTkpCi1MJDAwMjk6IAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLUwkMDAyMDogCi0JbGR3IDE2KCVyNCksJXI5Ci0JbGR3IDIwKCVyNCksJXI4Ci0JbGR3IDI0KCVyNCksJXI3Ci0JbGR3IDI4KCVyNCksJXI2Ci0JbGR3IDMyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfcmVmZXJlbmNlX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3JlZmVyZW5jZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcmVmZXJlbmNlX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiw4KCVyNCkKLQlzdHcgJXI1LDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgbWFrZV9yZWZlcmVuY2VfdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDAzMCwlcjAKLUwkMDAzMDogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG1ha2VfZnVuY3Rpb25fdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX2Z1bmN0aW9uX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLW1ha2VfZnVuY3Rpb25fdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI5LDE2KCVyNCkKLQlzdHcgJXI4LDIwKCVyNCkKLQlzdHcgJXI3LDI0KCVyNCkKLQlzdHcgJXI2LDI4KCVyNCkKLQlzdHcgJXI1LDMyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI4KCVyMTkpLCVyOQotCWNvbWljbHIsPD4gMCwlcjksJXIwCi0JYmwgTCQwMDMyLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAzMywlcjAKLQlub3AKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi0JYmwsbiBMJDAwMzQsJXIwCi1MJDAwMzM6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAzMSwlcjAKLUwkMDAzNTogCi1MJDAwMzQ6IAotTCQwMDMyOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDM3LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzYsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwMzcsJXIwCi1MJDAwMzc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAzOCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi1MJDAwMzg6IAotCWJsLG4gTCQwMDM5LCVyMAotTCQwMDM2OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXI5Ci0JbGR3IDEyKCVyOSksJXIxOQotCXN0dyAlcjE5LDgoJXI0KQotCWNvcHkgJXI5LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyOSkKLUwkMDAzOTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDE2KCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyOCglcjE5KQotCWxkbyAxKCVyMCksJXIxOQotCXN0dyAlcjE5LDgoJXI5KQotCWxkbyA2KCVyMCksJXIxOQotCXN0dyAlcjE5LDAoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjgoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDQwLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI4KCVyMTkpCi1MJDAwNDA6IAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAzMSwlcjAKLUwkMDAzMTogCi0JbGR3IDE2KCVyNCksJXI5Ci0JbGR3IDIwKCVyNCksJXI4Ci0JbGR3IDI0KCVyNCksJXI3Ci0JbGR3IDI4KCVyNCksJXI2Ci0JbGR3IDMyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfZnVuY3Rpb25fdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfZnVuY3Rpb25fdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX2Z1bmN0aW9uX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiw4KCVyNCkKLQlzdHcgJXI1LDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgbWFrZV9mdW5jdGlvbl90eXBlLCVyMgotCW5vcAotCWJsLG4gTCQwMDQxLCVyMAotTCQwMDQxOiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX21lbWJlcl90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9tZW1iZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX21lbWJlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsOCglcjQpCi0Jc3R3ICVyNywxMiglcjQpCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIDI0KCVyNCksJXIxCi0JZnN0ZHMsbWEgJWZyMTIsOCglcjEpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LC0xNiglcjMwKQotCWZsZHdzIC0xNiglcjMwKSwlZnIxMgotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWZzdHdzICVmcjEyLC0xNiglcjMwKQotCWxkdyAtMTYoJXIzMCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlsZHcgMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzbWFzaF90b19tZW1iZXJfdHlwZSwlcjIKLQlub3AKLQlmc3R3cyAlZnIxMiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjgKLQlibCxuIEwkMDA0MiwlcjAKLUwkMDA0MjogCi0JbGR3IDgoJXI0KSwlcjgKLQlsZHcgMTIoJXI0KSwlcjcKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gMjQoJXI0KSwlcjEKLQlmbGRkcyxtYSA4KCVyMSksJWZyMTIKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGFsbG9jYXRlX3N0dWJfbWV0aG9kLENPREUKLQkuRVhQT1JUIGFsbG9jYXRlX3N0dWJfbWV0aG9kLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1hbGxvY2F0ZV9zdHViX21ldGhvZDogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDQoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMTUoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA0MywlcjAKLUwkMDA0MzogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgYnVpbHRpbl90eXBlX2ludCxEQVRBCi0JLmFsaWduIDQKLQkuRVhQT1JUIGNyZWF0ZV9hcnJheV90eXBlLENPREUKLQkuRVhQT1JUIGNyZWF0ZV9hcnJheV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1jcmVhdGVfYXJyYXlfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMCw1NiglcjQpCi0Jc3R3ICVyOSw2MCglcjQpCi0Jc3R3ICVyOCw2NCglcjQpCi0Jc3R3ICVyNyw2OCglcjQpCi0Jc3R3ICVyNiw3MiglcjQpCi0Jc3R3ICVyNSw3NiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAyKCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTYoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDAoJXIyMCksJXIyMAotCWxkdyA4KCVyMjEpLCVyMjEKLQlzdHcgJXIyMCwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyNQotCXN0dyAlcjIxLC0xNiglcjMwKQotCWZsZHdzIC0xNiglcjMwKSwlZnI1UgotCXhtcHl1ICVmcjUsJWZyNVIsJWZyNAotCWZzdHdzICVmcjRSLC0xNiglcjMwKQotCWxkdyAtMTYoJXIzMCksJXIyNAotCXN0dyAlcjI0LDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdGggJXIyMCwzNCglcjE5KQotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNTAsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZG8gMTIwKCVyMjApLCVyMTkKLQlzdHcgJXIxOSwxNiglcjQpCi0JbGR3IDE2KCVyNCksJXIxOQotCXN0dyAlcjE5LDIwKCVyNCkKLQlsZG8gMTYoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMjQoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyNCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDQ1LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMjYKLQlsZHcgMjQoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwNDYsJXIwCi1MJDAwNDU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA0NjogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyAyNCglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDE2KCVyNCksJXIxOQotCXN0dyAlcjE5LDI4KCVyNCkKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDMyKCVyNCkKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMzIoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDA0NywlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDQ3OiAKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDI4KCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDI4KCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwNDgsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDA0OSwlcjAKLUwkMDA0ODogCi0JY29weSAlcjAsJXIxOQotTCQwMDQ5OiAKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyAzMiglcjQpLCVyMTAKLQlibCxuIEwkMDA1MSwlcjAKLUwkMDA1MDogCi0JbGRvIDE2KCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMAotTCQwMDUxOiAKLQlzdHcgJXIxMCwzNiglcjkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDQoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMiglcjApLCVyMjAKLQlzdGggJXIyMCwzNCglcjE5KQotCWxkdyAxMiglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA1NywlcjAKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZG8gMTIwKCVyMjApLCVyMTkKLQlzdHcgJXIxOSwzNiglcjQpCi0JbGR3IDM2KCVyNCksJXIxOQotCXN0dyAlcjE5LDQwKCVyNCkKLQlsZG8gMzIoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI0KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyA0NCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDUyLCVyMAotCW5vcAotCWxkdyA0MCglcjQpLCVyMjYKLQlsZHcgNDQoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwNTMsJXIwCi1MJDAwNTI6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA1MzogCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkdyA0MCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyA0NCglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDM2KCVyNCksJXIxOQotCXN0dyAlcjE5LDQ4KCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDUyKCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgNTIoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDA1NCwlcjAKLQlub3AKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDU0OiAKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDQ4KCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDQ4KCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwNTUsJXIwCi0Jbm9wCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDA1NiwlcjAKLUwkMDA1NTogCi0JY29weSAlcjAsJXIxOQotTCQwMDU2OiAKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyA1MiglcjQpLCVyMTAKLQlibCxuIEwkMDA1OCwlcjAKLUwkMDA1NzogCi0JbGRvIDMyKCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMAotTCQwMDU4OiAKLQlzdHcgJXIxMCwzNiglcjkpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAzNiglcjE5KSwlcjIwCi0Jc3R3ICVyMCwwKCVyMjApCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyAxNiglcjApLCVyMjAKLQlsZHcgMzYoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZG8gLTEoJXIyMCksJXIyMQotCXN0dyAlcjIxLDAoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDM2KCVyMjApLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTYoJXIwKSwlcjIwCi0JbGR3IDM2KCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAzNiglcjE5KSwlcjIwCi0JbGR3IDEyKCVyNCksJXIxOQotCXN0dyAlcjE5LDgoJXIyMCkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsNDQoJXIxOSkKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA0NCwlcjAKLUwkMDA0NDogCi0JbGR3IDU2KCVyNCksJXIxMAotCWxkdyA2MCglcjQpLCVyOQotCWxkdyA2NCglcjQpLCVyOAotCWxkdyA2OCglcjQpLCVyNwotCWxkdyA3MiglcjQpLCVyNgotCWxkdyA3NiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgc21hc2hfdG9fbWVtYmVyX3R5cGUsQ09ERQotCS5FWFBPUlQgc21hc2hfdG9fbWVtYmVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotc21hc2hfdG9fbWVtYmVyX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTAsMTYoJXI0KQotCXN0dyAlcjksMjAoJXI0KQotCXN0dyAlcjgsMjQoJXI0KQotCXN0dyAlcjcsMjgoJXI0KQotCXN0dyAlcjYsMzIoJXI0KQotCXN0dyAlcjUsMzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTEyKCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdHcgJXIyMCw4KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxNCglcjApLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi1MJDAwNTk6IAotCWxkdyAxNiglcjQpLCVyMTAKLQlsZHcgMjAoJXI0KSwlcjkKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIHNtYXNoX3RvX21ldGhvZF90eXBlLENPREUKLQkuRVhQT1JUIHNtYXNoX3RvX21ldGhvZF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLXNtYXNoX3RvX21ldGhvZF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEyLDE2KCVyNCkKLQlzdHcgJXIxMSwyMCglcjQpCi0Jc3R3ICVyMTAsMjQoJXI0KQotCXN0dyAlcjksMjgoJXI0KQotCXN0dyAlcjgsMzIoJXI0KQotCXN0dyAlcjcsMzYoJXI0KQotCXN0dyAlcjYsNDAoJXI0KQotCXN0dyAlcjUsNDQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtMTYoJXIwKSwlcjExCi0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjExLCVyMTIKLQlzdHcgJXIyMywwKCVyMTIpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXN0dyAlcjIwLDEyKCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtMTIoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTYoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtMTYoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsNDgoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTUoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotTCQwMDYwOiAKLQlsZHcgMTYoJXI0KSwlcjEyCi0JbGR3IDIwKCVyNCksJXIxMQotCWxkdyAyNCglcjQpLCVyMTAKLQlsZHcgMjgoJXI0KSwlcjkKLQlsZHcgMzIoJXI0KSwlcjgKLQlsZHcgMzYoJXI0KSwlcjcKLQlsZHcgNDAoJXI0KSwlcjYKLQlsZHcgNDQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzdHJuY21wLENPREUKLQkuYWxpZ24gNAotTEMkMDAwMDogCi0JLlNUUklORyAic3RydWN0IFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDE6IAotCS5TVFJJTkcgInVuaW9uIFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDI6IAotCS5TVFJJTkcgImVudW0gXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgdHlwZV9uYW1lX25vX3RhZyxDT0RFCi0JLkVYUE9SVCB0eXBlX25hbWVfbm9fdGFnLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi10eXBlX25hbWVfbm9fdGFnOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JY29weSAlcjI2LCVyNQotCWxkdyA0KCVyNSksJXI2Ci0JY29taWNsciw8PiAwLCVyNiwlcjAKLQlibCBMJDAwNjIsJXIwCi0Jbm9wCi0JbGR3IDAoJXI1KSwlcjE5Ci0JY29taWNsciw8PiA0LCVyMTksJXIwCi0JYmwgTCQwMDY2LCVyMAotCW5vcAotCWNvbWljbHIsPj0gNCwlcjE5LCVyMAotCWJsIEwkMDA3MiwlcjAKLQlub3AKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAwNjQsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzAsJXIwCi1MJDAwNzI6IAotCWNvbWljbHIsPD4gNSwlcjE5LCVyMAotCWJsIEwkMDA2OCwlcjAKLQlub3AKLQlibCxuIEwkMDA3MCwlcjAKLUwkMDA2NDogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAwLCVyMjUKLQlsZG8gUidMQyQwMDAwKCVyMjUpLCVyMjUKLQlsZG8gNyglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2NSwlcjAKLQlub3AKLQlsZG8gNyglcjYpLCVyNgotTCQwMDY1OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA2NjogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAxLCVyMjUKLQlsZG8gUidMQyQwMDAxKCVyMjUpLCVyMjUKLQlsZG8gNiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2NywlcjAKLQlub3AKLQlsZG8gNiglcjYpLCVyNgotTCQwMDY3OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA2ODogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAyLCVyMjUKLQlsZG8gUidMQyQwMDAyKCVyMjUpLCVyMjUKLQlsZG8gNSglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2OSwlcjAKLQlub3AKLQlsZG8gNSglcjYpLCVyNgotTCQwMDY5OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA3MDogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjM6IAotTCQwMDYyOiAKLQljb3B5ICVyNiwlcjI4Ci0JYmwsbiBMJDAwNjEsJXIwCi1MJDAwNjE6IAotCWxkdyA4KCVyNCksJXI2Ci0JbGR3IDEyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgY3VycmVudF9sYW5ndWFnZSxEQVRBCi0JLklNUE9SVCBzdHJjbXAsQ09ERQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lLENPREUKLQkuRVhQT1JUIGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JYWRkaWwgTCdjdXJyZW50X2xhbmd1YWdlLSRnbG9iYWwkLCVyMjcKLQlsZHcgUidjdXJyZW50X2xhbmd1YWdlLSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDA3NDogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA3NSwlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyA0KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA3NywlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDAoJXIyMCksJXIyOAotCWJsLG4gTCQwMDczLCVyMAotTCQwMDc3OiAKLUwkMDA3NjogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDQoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMDc0LCVyMAotTCQwMDc1OiAKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAwNzMsJXIwCi1MJDAwNzM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGxvb2t1cF9zeW1ib2wsQ09ERQotCS5JTVBPUlQgZXJyb3IsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDAzOiAKLQkuU1RSSU5HICJObyB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKLWxvb2t1cF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMiw4KCVyNCkKLQlzdHcgJXIxMSwxMiglcjQpCi0Jc3R3ICVyMTAsMTYoJXI0KQotCXN0dyAlcjksMjAoJXI0KQotCXN0dyAlcjgsMjQoJXI0KQotCXN0dyAlcjcsMjgoJXI0KQotCXN0dyAlcjYsMzIoJXI0KQotCXN0dyAlcjUsMzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjExCi0JY29taWNsciw8PiAwLCVyMTEsJXIwCi0JYmwgTCQwMDgwLCVyMAotCW5vcAotCWxkdyA4KCVyMTEpLCVyMTkKLQljb21pY2xyLD0gOCwlcjE5LCVyMAotCWJsIEwkMDA4MCwlcjAKLQlub3AKLQlibCxuIEwkMDA3OSwlcjAKLUwkMDA4MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMgotCWNvbWljbHIsPD4gMCwlcjEyLCVyMAotCWJsIEwkMDA4MSwlcjAKLQlub3AKLQljb3B5ICVyMTIsJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotCWJsLG4gTCQwMDgyLCVyMAotTCQwMDgxOiAKLQljb21pY2xyLD0gMCwlcjEyLCVyMAotCWJsIEwkMDA4MywlcjAKLQlub3AKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA4MywlcjAKLQlub3AKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAwNzgsJXIwCi0JYmwsbiBMJDAwODQsJXIwCi1MJDAwODM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDAzLCVyMjYKLQlsZG8gUidMQyQwMDAzKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA4NDogCi1MJDAwODI6IAotTCQwMDc5OiAKLQlsZHcgMTIoJXIxMSksJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotTCQwMDc4OiAKLQlsZHcgOCglcjQpLCVyMTIKLQlsZHcgMTIoJXI0KSwlcjExCi0JbGR3IDE2KCVyNCksJXIxMAotCWxkdyAyMCglcjQpLCVyOQotCWxkdyAyNCglcjQpLCVyOAotCWxkdyAyOCglcjQpLCVyNwotCWxkdyAzMiglcjQpLCVyNgotCWxkdyAzNiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGFsbG9jYSxDT0RFCi0JLklNUE9SVCBzdHJsZW4sQ09ERQotCS5JTVBPUlQgc3RyY3B5LENPREUKLQkuYWxpZ24gNAotTEMkMDAwNDogCi0JLlNUUklORyAidW5zaWduZWQgXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lLENPREUKLQkuRVhQT1JUIGxvb2t1cF91bnNpZ25lZF90eXBlbmFtZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkbyAxMCglcjE5KSwlcjIwCi0JbGRvIDcoJXIyMCksJXIyMQotCWNvcHkgJXIyMSwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIyNgotCWxkaWwgTCdMQyQwMDA0LCVyMjUKLQlsZG8gUidMQyQwMDA0KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMjAKLQlsZG8gOSglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWNvcHkgJXIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGxvb2t1cF90eXBlbmFtZSwlcjIKLQlub3AKLQlibCxuIEwkMDA4NSwlcjAKLUwkMDA4NTogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDA1OiAKLQkuU1RSSU5HICJzaWduZWQgXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3NpZ25lZF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfc2lnbmVkX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfc2lnbmVkX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkbyA4KCVyMTkpLCVyMjAKLQlsZG8gNyglcjIwKSwlcjIxCi0JY29weSAlcjIxLCVyMTkKLQlsZG8gNjMoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMjUsMjYsJXIxOQotCXpkZXAgJXIxOSwyNSwyNiwlcjIwCi0JbGRvIC05NiglcjMwKSwlcjE5Ci0JYWRkICVyMzAsJXIyMCwlcjMwCi0JbGRvIDcoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMjgsMjksJXIxOQotCXpkZXAgJXIxOSwyOCwyOSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAwNSwlcjI1Ci0JbGRvIFInTEMkMDAwNSglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyMAotCWxkbyA3KCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3R5cGVuYW1lLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDA4NywlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA4NiwlcjAKLUwkMDA4NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwODYsJXIwCi1MJDAwODY6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwNjogCi0JLlNUUklORyAiTm8gc3RydWN0IHR5cGUgbmFtZWQgJXMuXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAwNzogCi0JLlNUUklORyAiVGhpcyBjb250ZXh0IGhhcyBjbGFzcywgdW5pb24gb3IgZW51bSAlcywgbm90IGEgc3RydWN0Llx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3QsQ09ERQotCS5FWFBPUlQgbG9va3VwX3N0cnVjdCxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX3N0cnVjdDogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQljb21pY2xyLD0gMCwlcjksJXIwCi0JYmwgTCQwMDg5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA2LCVyMjYKLQlsZG8gUidMQyQwMDA2KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA4OTogCi0JbGR3IDEyKCVyOSksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDMsJXIyMCwlcjAKLQlibCBMJDAwOTAsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDcsJXIyNgotCWxkbyBSJ0xDJDAwMDcoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDkwOiAKLQlsZHcgMTIoJXI5KSwlcjI4Ci0JYmwsbiBMJDAwODgsJXIwCi1MJDAwODg6IAotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDA4OiAKLQkuU1RSSU5HICJObyB1bmlvbiB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDk6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHN0cnVjdCBvciBlbnVtICVzLCBub3QgYSB1bmlvbi5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdW5pb24sQ09ERQotCS5FWFBPUlQgbG9va3VwX3VuaW9uLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1sb29rdXBfdW5pb246IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDA5MiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwOCwlcjI2Ci0JbGRvIFInTEMkMDAwOCglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTI6IAotCWxkdyAxMiglcjkpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMDkzLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA5LCVyMjYKLQlsZG8gUidMQyQwMDA5KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5MzogCi0JbGR3IDEyKCVyOSksJXIyOAotCWJsLG4gTCQwMDkxLCVyMAotTCQwMDkxOiAKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAxMDogCi0JLlNUUklORyAiTm8gZW51bSB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTE6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHN0cnVjdCBvciB1bmlvbiAlcywgbm90IGFuIGVudW0uXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2VudW0sQ09ERQotCS5FWFBPUlQgbG9va3VwX2VudW0sRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9lbnVtOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWNvbWljbHIsPSAwLCVyOSwlcjAKLQlibCBMJDAwOTUsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTAsJXIyNgotCWxkbyBSJ0xDJDAwMTAoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk1OiAKLQlsZHcgMTIoJXI5KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNSwlcjIwLCVyMAotCWJsIEwkMDA5NiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAxMSwlcjI2Ci0JbGRvIFInTEMkMDAxMSglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTY6IAotCWxkdyAxMiglcjkpLCVyMjgKLQlibCxuIEwkMDA5NCwlcjAKLUwkMDA5NDogCi0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzdHJjYXQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDEyOiAKLQkuU1RSSU5HICI8XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAxMzogCi0JLlNUUklORyAiID5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDE0OiAKLQkuU1RSSU5HICJObyB0ZW1wbGF0ZSB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF90ZW1wbGF0ZV90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF90ZW1wbGF0ZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCi1sb29rdXBfdGVtcGxhdGVfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMSwxNiglcjQpCi0Jc3R3ICVyMTAsMjAoJXI0KQotCXN0dyAlcjksMjQoJXI0KQotCXN0dyAlcjgsMjgoJXI0KQotCXN0dyAlcjcsMzIoJXI0KQotCXN0dyAlcjYsMzYoJXI0KQotCXN0dyAlcjUsNDAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlhZGQgJXIxMSwlcjE5LCVyMjAKLQlsZG8gNCglcjIwKSwlcjE5Ci0JbGRvIDcoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAxMiwlcjI1Ci0JbGRvIFInTEMkMDAxMiglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjYKLQlsZHcgNCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkaWwgTCdMQyQwMDEzLCVyMjUKLQlsZG8gUidMQyQwMDEzKCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNhdCwlcjIKLQlub3AKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwOTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTQsJXIyNgotCWxkbyBSJ0xDJDAwMTQoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk4OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAwOTksJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDcsJXIyNgotCWxkbyBSJ0xDJDAwMDcoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk5OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyOAotCWJsLG4gTCQwMDk3LCVyMAotTCQwMDk3OiAKLQlsZHcgMTYoJXI0KSwlcjExCi0JbGR3IDIwKCVyNCksJXIxMAotCWxkdyAyNCglcjQpLCVyOQotCWxkdyAyOCglcjQpLCVyOAotCWxkdyAzMiglcjQpLCVyNwotCWxkdyAzNiglcjQpLCVyNgotCWxkdyA0MCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGN1cnJlbnRfdGFyZ2V0LERBVEEKLQkuSU1QT1JUIGZmbHVzaCxDT0RFCi0JLklNUE9SVCBfX2lvYixEQVRBCi0JLklNUE9SVCBmcHJpbnRmLENPREUKLQkuYWxpZ24gNAotTEMkMDAxNTogCi0JLlNUUklORyAiVHlwZSBceDAwIgotCS5JTVBPUlQgdHlwZV9wcmludCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTY6IAotCS5TVFJJTkcgIlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTc6IAotCS5TVFJJTkcgIiBpcyBub3QgYSBzdHJ1Y3R1cmUgb3IgdW5pb24gdHlwZS5ceDAwIgotCS5JTVBPUlQgY2hlY2tfc3R1Yl90eXBlLENPREUKLQkuYWxpZ24gNAotTEMkMDAxODogCi0JLlNUUklORyAiIGhhcyBubyBjb21wb25lbnQgbmFtZWQgXHgwMCIKLQkuSU1QT1JUIGZwdXRzX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDAxOTogCi0JLlNUUklORyAiLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3N0cnVjdF9lbHRfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgotbG9va3VwX3N0cnVjdF9lbHRfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMSwyNCglcjQpCi0Jc3R3ICVyMTAsMjgoJXI0KQotCXN0dyAlcjksMzIoJXI0KQotCXN0dyAlcjgsMzYoJXI0KQotCXN0dyAlcjcsNDAoJXI0KQotCXN0dyAlcjYsNDQoJXI0KQotCXN0dyAlcjUsNDgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAxLCVyMjAsJXIwCi0JYmwgTCQwMTAyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDE2KCVyMCksJXIxOQotCWNvbWNsciw8PiAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTAyLCVyMAotCW5vcAotCWJsLG4gTCQwMTAxLCVyMAotTCQwMTAyOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi1MJDAxMDE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAzLCVyMjAsJXIwCi0JYmwgTCQwMTAzLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMTAzLCVyMAotCW5vcAotCWFkZGlsIEwnY3VycmVudF90YXJnZXQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA3NiglcjE5KSwlcjExCi0JY29weSAlcjExLCVyMjIKLQkuQ0FMTAlBUkdXMD1HUgotCWJsICQkZHluY2FsbCwlcjMxCi0JY29weSAlcjMxLCVyMgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMTYsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzE2KCVyMSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmZsdXNoLCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE1LCVyMjUKLQlsZG8gUidMQyQwMDE1KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDE2LCVyMjUKLQlsZG8gUidMQyQwMDE2KCVyMjUpLCVyMjUKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjQKLQlsZG8gLTEoJXIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCB0eXBlX3ByaW50LCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDE3LCVyMjYKLQlsZG8gUidMQyQwMDE3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMTAzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBjaGVja19zdHViX3R5cGUsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzNCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSwxNiwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDEwNDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw+PSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTA1LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDEwNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMDcsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMDc6IAotTCQwMTA2OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTA0LCVyMAotTCQwMTA1OiAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDEwODogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JY29taWNsciw8PSAwLCVyMTksJXIwCi0JYmwgTCQwMTA5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDgoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfc3RydWN0X2VsdF90eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDE2KCVyNCkKLQlsZHcgMTYoJXI0KSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTExLCVyMAotCW5vcAotCWxkdyAxNiglcjQpLCVyMjgKLQlibCxuIEwkMDEwMCwlcjAKLUwkMDExMTogCi1MJDAxMTA6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAxMDgsJXIwCi1MJDAxMDk6IAotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTEyLCVyMAotCW5vcAotCWNvcHkgJXIwLCVyMjgKLQlibCxuIEwkMDEwMCwlcjAKLUwkMDExMjogCi0JYWRkaWwgTCdjdXJyZW50X3RhcmdldC0kZ2xvYmFsJCwlcjI3Ci0JbGR3IFInY3VycmVudF90YXJnZXQtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JbGR3IDc2KCVyMTkpLCVyMTEKLQljb3B5ICVyMTEsJXIyMgotCS5DQUxMCUFSR1cwPUdSCi0JYmwgJCRkeW5jYWxsLCVyMzEKLQljb3B5ICVyMzEsJXIyCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCsxNiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMTYoJXIxKSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmZmx1c2gsJXIyCi0Jbm9wCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTUsJXIyNQotCWxkbyBSJ0xDJDAwMTUoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnByaW50ZiwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTYsJXIyNQotCWxkbyBSJ0xDJDAwMTYoJXIyNSksJXIyNQotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNAotCWxkbyAtMSglcjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHR5cGVfcHJpbnQsJXIyCi0Jbm9wCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTgsJXIyNQotCWxkbyBSJ0xDJDAwMTgoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnByaW50ZiwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBmcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDAxOSwlcjI2Ci0JbGRvIFInTEMkMDAxOSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLQlsZG8gLTEoJXIwKSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMDA6IAotCWxkdyAyNCglcjQpLCVyMTEKLQlsZHcgMjgoJXI0KSwlcjEwCi0JbGR3IDMyKCVyNCksJXI5Ci0JbGR3IDM2KCVyNCksJXI4Ci0JbGR3IDQwKCVyNCksJXI3Ci0JbGR3IDQ0KCVyNCksJXI2Ci0JbGR3IDQ4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmaWxsX2luX3ZwdHJfZmllbGRubyxDT0RFCi0JLkVYUE9SVCBmaWxsX2luX3ZwdHJfZmllbGRubyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSCi1maWxsX2luX3ZwdHJfZmllbGRubzogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ0KCVyMTkpLCVyMjAKLQljb21pY2xyLD4gMCwlcjIwLCVyMAotCWJsIEwkMDExNCwlcjAKLQlub3AKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLUwkMDExNTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxMTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmaWxsX2luX3ZwdHJfZmllbGRubywlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlsZHcgNDQoJXIyMCksJXIxOQotCWNvbWljbHIsPD0gMCwlcjE5LCVyMAotCWJsIEwkMDExOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwyNywyOCwlcjIyCi0JbGR3IDM2KCVyMjApLCVyMjEKLQlhZGQgJXIyMiwlcjIxLCVyMjAKLQlsZHcgOCglcjIwKSwlcjIxCi0JbGR3IDQ0KCVyMjEpLCVyMjAKLQlzdHcgJXIyMCw0NCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI3LDI4LCVyMjIKLQlsZHcgMzYoJXIyMCksJXIyMQotCWFkZCAlcjIyLCVyMjEsJXIyMAotCWxkdyA4KCVyMjApLCVyMjEKLQlsZHcgNDAoJXIyMSksJXIyMAotCXN0dyAlcjIwLDQwKCVyMTkpCi0JYmwsbiBMJDAxMTYsJXIwCi1MJDAxMTg6IAotTCQwMTE3OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAxMTUsJXIwCi1MJDAxMTY6IAotTCQwMTE0OiAKLUwkMDExMzogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5FWFBPUlQgc3R1Yl9ub25hbWVfY29tcGxhaW50LERBVEEKLQkuYWxpZ24gNAotTEMkMDAyMDogCi0JLlNUUklORyAic3R1YiB0eXBlIGhhcyBOVUxMIG5hbWVceDAwIgotCS5kYXRhCi0KLQkuYWxpZ24gNAotc3R1Yl9ub25hbWVfY29tcGxhaW50OiAKLQkud29yZCBMQyQwMDIwCi0JLndvcmQgMAotCS53b3JkIDAKLQkuSU1QT1JUIGNvbXBsYWluLENPREUKLQkuSU1QT1JUIG1lbWNweSxDT0RFCi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBjaGVja19zdHViX3R5cGUsQ09ERQotCS5FWFBPUlQgY2hlY2tfc3R1Yl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IKLWNoZWNrX3N0dWJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gNCglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMjAsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgdHlwZV9uYW1lX25vX3RhZywlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEyMSwlcjAKLQlub3AKLQlhZGRpbCBMJ3N0dWJfbm9uYW1lX2NvbXBsYWludC0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInc3R1Yl9ub25hbWVfY29tcGxhaW50LSRnbG9iYWwkKCVyMSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGNvbXBsYWluLCVyMgotCW5vcAotCWJsLG4gTCQwMTE5LCVyMAotTCQwMTIxOiAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyA4KCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTIyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDEyKCVyMjApLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1jcHksJXIyCi0Jbm9wCi1MJDAxMjI6IAotTCQwMTIwOiAKLUwkMDExOTogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgZ2RiX21hbmdsZV9uYW1lLENPREUKLQkuSU1QT1JUIGNwbHVzX2RlbWFuZ2xlLENPREUKLQkuYWxpZ24gNAotTEMkMDAyMTogCi0JLlNUUklORyAiSW50ZXJuYWw6IENhbm5vdCBkZW1hbmdsZSBtYW5nbGVkIG5hbWUgYCVzJy5ceDAwIgotCS5JTVBPUlQgc3RyY2hyLENPREUKLQkuSU1QT1JUIHBhcnNlX2FuZF9ldmFsX3R5cGUsQ09ERQotCS5JTVBPUlQgYnVpbHRpbl90eXBlX3ZvaWQsREFUQQotCS5JTVBPUlQgZnJlZSxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGNoZWNrX3N0dWJfbWV0aG9kLENPREUKLQkuRVhQT1JUIGNoZWNrX3N0dWJfbWV0aG9kLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLWNoZWNrX3N0dWJfbWV0aG9kOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjExLDY0KCVyNCkKLQlzdHcgJXIxMCw2OCglcjQpCi0Jc3R3ICVyOSw3MiglcjQpCi0Jc3R3ICVyOCw3NiglcjQpCi0Jc3R3ICVyNyw4MCglcjQpCi0Jc3R3ICVyNiw4NCglcjQpCi0Jc3R3ICVyNSw4OCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC0xMiglcjApLCVyOQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI5LCVyMTAKLQlzdHcgJXIyNCwwKCVyMTApCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC0xMiglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGR3IDAoJXIyMSksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgZ2RiX21hbmdsZV9uYW1lLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRvIDMoJXIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBjcGx1c19kZW1hbmdsZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwxNiglcjQpCi0Jc3R3ICVyMCwyOCglcjQpCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMzIoJXI0KQotCWxkdyAxNiglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEyNCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDAyMSwlcjI2Ci0JbGRvIFInTEMkMDAyMSglcjI2KSwlcjI2Ci0JbGR3IDEyKCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAxMjQ6IAotCWxkdyAxNiglcjQpLCVyMjYKLQlsZG8gNDAoJXIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjaHIsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyNCglcjQpCi1MJDAxMjU6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxMjYsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MCglcjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTI3LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTI4LCVyMAotTCQwMTI3OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQxKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMjksJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTMwLCVyMAotTCQwMTI5OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ0KCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMzEsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTMxLCVyMAotCW5vcAotCWxkdyAzMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMzIoJXI0KQotTCQwMTMxOiAKLUwkMDEzMDogCi1MJDAxMjg6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWJsLG4gTCQwMTI1LCVyMAotTCQwMTI2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMzcsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI0KQotCWxkdyA0NCglcjQpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjQpCi0JbGR3IDMyKCVyNCksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCXN0dyAlcjIwLDUyKCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNTIoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzMiwlcjAKLQlub3AKLQlsZHcgNDgoJXI0KSwlcjI2Ci0JbGR3IDUyKCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMTMzLCVyMAotTCQwMTMyOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxMzM6IAotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgNTIoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA0NCglcjQpLCVyMTkKLQlzdHcgJXIxOSw1NiglcjQpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw2MCglcjQpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDYwKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxMzQsJXIwCi0Jbm9wCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDEzNDogCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgNTYoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDU2KCVyNCksJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTM1LCVyMAotCW5vcAotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxMzYsJXIwCi1MJDAxMzU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDEzNjogCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgNjAoJXI0KSwlcjExCi0JYmwsbiBMJDAxMzgsJXIwCi1MJDAxMzc6IAotCWxkdyAzMiglcjQpLCVyMjAKLQlsZG8gMiglcjIwKSwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMjAKLQljb3B5ICVyMjAsJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotTCQwMTM4OiAKLQlzdHcgJXIxMSwzNiglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCXN0dyAlcjE5LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBsb29rdXBfcG9pbnRlcl90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGR3IDM2KCVyNCksJXIyMAotCXN0dyAlcjE5LDAoJXIyMCkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSwzMiglcjQpCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzOSwlcjAKLQlub3AKLQlzdHcgJXIwLDI4KCVyNCkKLUwkMDE0MDogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDE0MSwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JY29taWNsciw+PSAwLCVyMTksJXIwCi0JYmwgTCQwMTQyLCVyMAotCW5vcAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDQoJXIwKSwlcjIwCi0JY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDMsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0MywlcjAKLQlub3AKLQlibCxuIEwkMDE0MiwlcjAKLUwkMDE0MzogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjI2Ci0JY29weSAlcjE5LCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHBhcnNlX2FuZF9ldmFsX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZHcgMzIoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjEKLQlsZHcgMzYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0Jc3R3ICVyMTksMCglcjIwKQotCWxkdyAzMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMzIoJXI0KQotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjAoJXI0KQotTCQwMTQyOiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQwKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDQsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi0JYmwsbiBMJDAxNDUsJXIwCi1MJDAxNDQ6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDEoJXIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0NiwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi1MJDAxNDY6IAotTCQwMTQ1OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlibCxuIEwkMDE0MCwlcjAKLUwkMDE0MTogCi1MJDAxMzk6IAotCWxkbyAtMiglcjApLCVyMTkKLQlsZHcgMjQoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ2KCVyMCksJXIyMAotCWNvbWNsciw8PiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTQ3LCVyMAotCW5vcAotCWxkdyAzMiglcjQpLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWxkdyAzNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV92b2lkLSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfdm9pZC0kZ2xvYmFsJCglcjEpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JYmwsbiBMJDAxNDgsJXIwCi1MJDAxNDc6IAotCWxkdyAzMiglcjQpLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWxkdyAzNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlzdHcgJXIwLDAoJXIxOSkKLUwkMDE0ODogCi0JbGR3IDE2KCVyNCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JemRlcCAlcjIxLDMwLDMxLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAyMCglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGR3IDQoJXIxOSksJXIyMAotCXN0dyAlcjIwLDQwKCVyNCkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkdyAzNiglcjQpLCVyMjAKLQlzdHcgJXIyMCw0OCglcjE5KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGRoIDMyKCVyMjApLCVyMjEKLQljb3B5ICVyMjEsJXIyMAotCWRlcGkgMCwyOSwxLCVyMjAKLQlzdGggJXIyMCwzMiglcjE5KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIDAsNCwxLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotTCQwMTIzOiAKLQlsZHcgNjQoJXI0KSwlcjExCi0JbGR3IDY4KCVyNCksJXIxMAotCWxkdyA3MiglcjQpLCVyOQotCWxkdyA3NiglcjQpLCVyOAotCWxkdyA4MCglcjQpLCVyNwotCWxkdyA4NCglcjQpLCVyNgotCWxkdyA4OCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUsQ09ERQotCS5FWFBPUlQgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUgotYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOCwzMiglcjQpCi0Jc3R3ICVyNywzNiglcjQpCi0Jc3R3ICVyNiw0MCglcjQpCi0Jc3R3ICVyNSw0NCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE1MCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjcKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxNTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI0KQotCWxkbyAyNCglcjApLCVyMTkKLQlzdHcgJXIxOSwxNiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNTEsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAxNiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDE1MiwlcjAKLUwkMDE1MTogCi0JY29weSAlcjAsJXIxOQotTCQwMTUyOiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDI0KCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNTMsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDE1MzogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTU0LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxNTUsJXIwCi1MJDAxNTQ6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE1NTogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMjQoJXI0KSwlcjgKLQlibCxuIEwkMDE1NywlcjAKLUwkMDE1NjogCi0JbGRvIDI0KCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI4Ci1MJDAxNTc6IAotCXN0dyAlcjgsNDgoJXI3KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlsZHdzLG1hIDQoJXIyMiksJXIyMAotCXN0d3MsbWEgJXIxOSw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlzdHdzLG1hICVyMjAsNCglcjIxKQotCWxkd3MsbWEgNCglcjIyKSwlcjIwCi0Jc3R3cyxtYSAlcjE5LDQoJXIyMSkKLQlsZHdzLG1hIDQoJXIyMiksJXIxOQotCXN0d3MsbWEgJXIyMCw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMjAKLQlzdHdzLG1hICVyMTksNCglcjIxKQotCXN0dyAlcjIwLDAoJXIyMSkKLUwkMDE1MDogCi1MJDAxNDk6IAotCWxkdyAzMiglcjQpLCVyOAotCWxkdyAzNiglcjQpLCVyNwotCWxkdyA0MCglcjQpLCVyNgotCWxkdyA0NCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIG9ic2F2ZXN0cmluZyxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGluaXRfdHlwZSxDT0RFCi0JLkVYUE9SVCBpbml0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUixSVE5WQUw9R1IKLWluaXRfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxNCw4KCVyNCkKLQlzdHcgJXIxMywxMiglcjQpCi0Jc3R3ICVyMTIsMTYoJXI0KQotCXN0dyAlcjExLDIwKCVyNCkKLQlzdHcgJXIxMCwyNCglcjQpCi0Jc3R3ICVyOSwyOCglcjQpCi0Jc3R3ICVyOCwzMiglcjQpCi0Jc3R3ICVyNywzNiglcjQpCi0Jc3R3ICVyNiw0MCglcjQpCi0Jc3R3ICVyNSw0NCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC0xMiglcjApLCVyOQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI5LCVyMTAKLQlzdHcgJXIyNCwwKCVyMTApCi0JbGRvIC0xNiglcjApLCVyMTEKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyMTEsJXIxMgotCXN0dyAlcjIzLDAoJXIxMikKLQlsZG8gLTIwKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMwotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTMpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXIxMykKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRoIDMyKCVyMTMpLCVyMjAKLQlsZGggMiglcjE5KSwlcjE5Ci0Jb3IgJXIyMCwlcjE5LCVyMjAKLQlzdGggJXIyMCwzMiglcjEzKQotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU5LCVyMAotCW5vcAotCWxkbyAtMjAoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU5LCVyMAotCW5vcAotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTQKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgc3RybGVuLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGRvIC0yMCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gMTIwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE0KSwlcjI2Ci0JY29weSAlcjE5LCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgb2JzYXZlc3RyaW5nLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0Jc3R3ICVyMTksNCglcjEzKQotCWJsLG4gTCQwMTYwLCVyMAotTCQwMTU5OiAKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDQoJXIxMykKLUwkMDE2MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMywlcjIwLCVyMAotCWJsIEwkMDE2MiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMTYyLCVyMAotCW5vcAotCWJsLG4gTCQwMTYxLCVyMAotTCQwMTYyOiAKLQlzdHcgJXIxOSw0OCglcjEzKQotTCQwMTYxOiAKLQljb3B5ICVyMTMsJXIyOAotCWJsLG4gTCQwMTU4LCVyMAotTCQwMTU4OiAKLQlsZHcgOCglcjQpLCVyMTQKLQlsZHcgMTIoJXI0KSwlcjEzCi0JbGR3IDE2KCVyNCksJXIxMgotCWxkdyAyMCglcjQpLCVyMTEKLQlsZHcgMjQoJXI0KSwlcjEwCi0JbGR3IDI4KCVyNCksJXI5Ci0JbGR3IDMyKCVyNCksJXI4Ci0JbGR3IDM2KCVyNCksJXI3Ci0JbGR3IDQwKCVyNCksJXI2Ci0JbGR3IDQ0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDIyOiAKLQkuU1RSSU5HICJpbnRlcm5hbCBlcnJvciAtIGludmFsaWQgZnVuZGFtZW50YWwgdHlwZSBpZCAlZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjM6IAotCS5TVFJJTkcgImludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgdHlwZSBpZCAlZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjQ6IAotCS5TVFJJTkcgInZvaWRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI1OiAKLQkuU1RSSU5HICJib29sZWFuXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNjogCi0JLlNUUklORyAic3RyaW5nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNzogCi0JLlNUUklORyAiY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjg6IAotCS5TVFJJTkcgInNpZ25lZCBjaGFyXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyOTogCi0JLlNUUklORyAidW5zaWduZWQgY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzA6IAotCS5TVFJJTkcgInNob3J0XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzMTogCi0JLlNUUklORyAidW5zaWduZWQgc2hvcnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMyOiAKLQkuU1RSSU5HICJpbnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMzOiAKLQkuU1RSSU5HICJ1bnNpZ25lZCBpbnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM0OiAKLQkuU1RSSU5HICJmaXhlZCBkZWNpbWFsXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzNTogCi0JLlNUUklORyAibG9uZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzY6IAotCS5TVFJJTkcgInVuc2lnbmVkIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM3OiAKLQkuU1RSSU5HICJsb25nIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM4OiAKLQkuU1RSSU5HICJzaWduZWQgbG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzOTogCi0JLlNUUklORyAidW5zaWduZWQgbG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MDogCi0JLlNUUklORyAiZmxvYXRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQxOiAKLQkuU1RSSU5HICJkb3VibGVceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQyOiAKLQkuU1RSSU5HICJmbG9hdGluZyBkZWNpbWFsXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MzogCi0JLlNUUklORyAibG9uZyBkb3VibGVceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ0OiAKLQkuU1RSSU5HICJjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0NTogCi0JLlNUUklORyAiZG91YmxlIGNvbXBsZXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ2OiAKLQkuU1RSSU5HICJsb25nIGRvdWJsZSBjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9mdW5kYW1lbnRhbF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEyLDMyKCVyNCkKLQlzdHcgJXIxMSwzNiglcjQpCi0Jc3R3ICVyMTAsNDAoJXI0KQotCXN0dyAlcjksNDQoJXI0KQotCXN0dyAlcjgsNDgoJXI0KQotCXN0dyAlcjcsNTIoJXI0KQotCXN0dyAlcjYsNTYoJXI0KQotCXN0dyAlcjUsNjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWNvcHkgJXIwLCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw9IDAsJXIyMCwlcjAKLQlibCBMJDAxNjUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyNSglcjApLCVyMTkKLQljb21jbHIsPD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDE2NSwlcjAKLQlub3AKLQlibCxuIEwkMDE2NCwlcjAKLUwkMDE2NTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMjIsJXIyNgotCWxkbyBSJ0xDJDAwMjIoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotCWJsLG4gTCQwMTY2LCVyMAotTCQwMTY0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDE5NiglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAxNjcsJXIwCi0Jbm9wCi0JbGRvIDEwNCglcjApLCVyMTEKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjEyCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxMjAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyNCkKLQlzdHcgJXIxMSwxNiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNjgsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAxNiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDE2OSwlcjAKLUwkMDE2ODogCi0JY29weSAlcjAsJXIxOQotTCQwMTY5OiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDI0KCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNzAsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDE3MDogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTcxLCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxNzIsJXIwCi1MJDAxNzE6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE3MjogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMjQoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTk2KCVyMTIpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxOTYoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMTEsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotTCQwMTY3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JbGR3IDE5NiglcjE5KSwlcjE5Ci0JYWRkICVyMjAsJXIxOSwlcjEwCi0JbGR3IDAoJXIxMCksJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDE3MywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JYWRkaSx1diAtMjYsJXIyMCwlcjAKLQlibHIsbiAlcjIwLCVyMAotCWIsbiBMJDAxNzUKLUwkMDIwMjogCi0JYiBMJDAxNzYKLQlub3AKLQliIEwkMDE3NwotCW5vcAotCWIgTCQwMTc5Ci0Jbm9wCi0JYiBMJDAxODAKLQlub3AKLQliIEwkMDE4MQotCW5vcAotCWIgTCQwMTgyCi0Jbm9wCi0JYiBMJDAxODMKLQlub3AKLQliIEwkMDE4NAotCW5vcAotCWIgTCQwMTg1Ci0Jbm9wCi0JYiBMJDAxODYKLQlub3AKLQliIEwkMDE4NwotCW5vcAotCWIgTCQwMTg5Ci0Jbm9wCi0JYiBMJDAxOTAKLQlub3AKLQliIEwkMDE5MQotCW5vcAotCWIgTCQwMTkyCi0Jbm9wCi0JYiBMJDAxOTMKLQlub3AKLQliIEwkMDE5NAotCW5vcAotCWIgTCQwMTk1Ci0Jbm9wCi0JYiBMJDAxOTYKLQlub3AKLQliIEwkMDE5OAotCW5vcAotCWIgTCQwMTk5Ci0Jbm9wCi0JYiBMJDAyMDAKLQlub3AKLQliIEwkMDIwMQotCW5vcAotCWIgTCQwMTc4Ci0Jbm9wCi0JYiBMJDAxODgKLQlub3AKLQliIEwkMDE5NwotCW5vcAotTCQwMTc1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAyMywlcjI2Ci0JbGRvIFInTEMkMDAyMyglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOSglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjQsJXIyMwotCWxkbyBSJ0xDJDAwMjQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE3NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI1LCVyMjMKLQlsZG8gUidMQyQwMDI1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gMTIoJXIwKSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDI2LCVyMjMKLQlsZG8gUidMQyQwMDI2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjcsJXIyMwotCWxkbyBSJ0xDJDAwMjcoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI4LCVyMjMKLQlsZG8gUidMQyQwMDI4KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAyOSwlcjIzCi0JbGRvIFInTEMkMDAyOSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTgyOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDMwLCVyMjMKLQlsZG8gUidMQyQwMDMwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMiglcjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzMCwlcjIzCi0JbGRvIFInTEMkMDAzMCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzEsJXIyMwotCWxkbyBSJ0xDJDAwMzEoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzMiwlcjIzCi0JbGRvIFInTEMkMDAzMiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzIsJXIyMwotCWxkbyBSJ0xDJDAwMzIoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDMzLCVyMjMKLQlsZG8gUidMQyQwMDMzKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzQsJXIyMwotCWxkbyBSJ0xDJDAwMzQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4OTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzNSwlcjIzCi0JbGRvIFInTEMkMDAzNSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTkwOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzUsJXIyMwotCWxkbyBSJ0xDJDAwMzUoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM2LCVyMjMKLQlsZG8gUidMQyQwMDM2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTI6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzcsJXIyMwotCWxkbyBSJ0xDJDAwMzcoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM4LCVyMjMKLQlsZG8gUidMQyQwMDM4KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzOSwlcjIzCi0JbGRvIFInTEMkMDAzOSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQwLCVyMjMKLQlsZG8gUidMQyQwMDQwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDEsJXIyMwotCWxkbyBSJ0xDJDAwNDEoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MiwlcjIzCi0JbGRvIFInTEMkMDA0MiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDE2KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MywlcjIzCi0JbGRvIFInTEMkMDA0MyglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk5OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ0LCVyMjMKLQlsZG8gUidMQyQwMDQ0KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAyMDA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ1LCVyMjMKLQlsZG8gUidMQyQwMDQ1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAyMDE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ2LCVyMjMKLQlsZG8gUidMQyQwMDQ2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzQ6IAotCXN0dyAlcjksMCglcjEwKQotTCQwMTczOiAKLUwkMDE2NjogCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMTYzLCVyMAotTCQwMTYzOiAKLQlsZHcgMzIoJXI0KSwlcjEyCi0JbGR3IDM2KCVyNCksJXIxMQotCWxkdyA0MCglcjQpLCVyMTAKLQlsZHcgNDQoJXI0KSwlcjkKLQlsZHcgNDgoJXI0KSwlcjgKLQlsZHcgNTIoJXI0KSwlcjcKLQlsZHcgNTYoJXI0KSwlcjYKLQlsZHcgNjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBwdXRzX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA0NzogCi0JLlNUUklORyAiIFx4MDAiCi0JLklNUE9SVCBwcmludGZfZmlsdGVyZWQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDQ4OiAKLQkuU1RSSU5HICIxXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0OTogCi0JLlNUUklORyAiMFx4MDAiCi0JLmFsaWduIDQKLXByaW50X2JpdF92ZWN0b3I6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCwxNiglcjQpCi0Jc3R3ICVyNywyMCglcjQpCi0Jc3R3ICVyNiwyNCglcjQpCi0Jc3R3ICVyNSwyOCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0Jc3R3ICVyMCw4KCVyNCkKLUwkMDIwNDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JbGR3IDAoJXIxOSksJXIxOQotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyMDUsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JY29taWNsciw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMDgsJXIwCi0Jbm9wCi0JbGRvIDcoJXIxOSksJXIxOQotTCQwMjA4OiAKLQlleHRycyAlcjE5LDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMjA3LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDQ3LCVyMjYKLQlsZG8gUidMQyQwMDQ3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMDc6IAotCWxkdyA4KCVyNCksJXIyMAotCWV4dHJzICVyMjAsMjgsMjksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlhZGQgJXIxOSwlcjIxLCVyMjAKLQlsZGIgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JZXh0cnUgJXIyMCwzMSwzLCVyMjEKLQlzdWJpLD4+PSAzMSwlcjIxLCVyMjAKLQljb3B5ICVyMCwlcjIwCi0JbXRzYXIgJXIyMAotCXZleHRycyAlcjE5LDMyLCVyMTkKLQlleHRydSAlcjE5LDMxLDEsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIwOSwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA0OCwlcjI2Ci0JbGRvIFInTEMkMDA0OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMTAsJXIwCi1MJDAyMDk6IAotCWxkaWwgTCdMQyQwMDQ5LCVyMjYKLQlsZG8gUidMQyQwMDQ5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIxMDogCi1MJDAyMDY6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDIwNCwlcjAKLUwkMDIwNTogCi1MJDAyMDM6IAotCWxkdyAxNiglcjQpLCVyOAotCWxkdyAyMCglcjQpLCVyNwotCWxkdyAyNCglcjQpLCVyNgotCWxkdyAyOCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsQ09ERQotCS5hbGlnbiA0Ci1wcmludF9hcmdfdHlwZXM6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCw4KCVyNCkKLQlzdHcgJXI3LDEyKCVyNCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjEyLCVyMAotCW5vcAotTCQwMjEzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIxNCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA0KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gOSwlcjIwLCVyMAotCWJsIEwkMDIxNSwlcjAKLQlub3AKLQlibCxuIEwkMDIxNCwlcjAKLUwkMDIxNTogCi0JYmwsbiBMJDAyMTMsJXIwCi1MJDAyMTQ6IAotTCQwMjEyOiAKLUwkMDIxMTogCi0JbGR3IDgoJXI0KSwlcjgKLQlsZHcgMTIoJXI0KSwlcjcKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBwcmludGZpX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA1MDogCi0JLlNUUklORyAiZm5fZmllbGRsaXN0cyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTE6IAotCS5TVFJJTkcgIlslZF0gbmFtZSAnJXMnICgweCV4KSBsZW5ndGggJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1MjogCi0JLlNUUklORyAiWyVkXSBwaHlzbmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDUzOiAKLQkuU1RSSU5HICJ0eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NDogCi0JLlNUUklORyAiYXJncyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTU6IAotCS5TVFJJTkcgImZjb250ZXh0IDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NjogCi0JLlNUUklORyAiaXNfY29uc3QgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NzogCi0JLlNUUklORyAiaXNfdm9sYXRpbGUgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1ODogCi0JLlNUUklORyAiaXNfcHJpdmF0ZSAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU5OiAKLQkuU1RSSU5HICJpc19wcm90ZWN0ZWQgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MDogCi0JLlNUUklORyAiaXNfc3R1YiAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDYxOiAKLQkuU1RSSU5HICJ2b2Zmc2V0ICV1XHgwYVx4MDAiCi0JLmFsaWduIDQKLWR1bXBfZm5fZmllbGRsaXN0czogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTAsJXIyNQotCWxkbyBSJ0xDJDAwNTAoJXIyNSksJXIyNQotCWxkdyAyMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsOCglcjQpCi1MJDAyMTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMjE4LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjQpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMzAsMzEsJXIyMQotCWFkZCAlcjIxLCVyMjIsJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIxCi0JbGR3IDIwKCVyMjApLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQ4KCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjMKLQl6ZGVwICVyMjMsMzAsMzEsJXIyMgotCWFkZCAlcjIyLCVyMjMsJXIyMgotCXpkZXAgJXIyMiwyOSwzMCwlcjIyCi0JbGR3IDIwKCVyMjEpLCVyMjMKLQlhZGQgJXIyMiwlcjIzLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIzCi0JemRlcCAlcjIzLDMwLDMxLCVyMjIKLQlhZGQgJXIyMiwlcjIzLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMgotCWxkdyAyMCglcjIxKSwlcjIzCi0JYWRkICVyMjIsJXIyMywlcjIxCi0JbGR3IDQoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01NiglcjMwKQotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTEsJXIyNQotCWxkbyBSJ0xDJDAwNTEoJXIyNSksJXIyNQotCWxkdyA4KCVyNCksJXIyNAotCWxkdyAwKCVyMjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0Jc3R3ICVyMCwxMiglcjQpCi1MJDAyMjA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgNCglcjE5KSwlcjE5Ci0JY29tY2xyLDwgJXIyMCwlcjE5LCVyMAotCWJsIEwkMDIyMSwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDQoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxMiglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMQotCWFkZCAlcjIxLCVyMjIsJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDUyLCVyMjUKLQlsZG8gUidMQyQwMDUyKCVyMjUpLCVyMjUKLQlsZHcgMTIoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTMsJXIyNQotCWxkbyBSJ0xDJDAwNTMoJXIyNSksJXIyNQotCWxkdyA0KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjE5Ci0JYWRkICVyMTksJXIyMCwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAxMCglcjIxKSwlcjIwCi0JbGR3IDQoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjAsJXIyMiwlcjIxCi0JbGR3IDQoJXIyMSksJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTQsJXIyNQotCWxkbyBSJ0xDJDAwNTQoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjE5LCVyMjEsJXIyMAotCWxkdyA0KCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgNDgoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2FyZ190eXBlcywlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTUsJXIyNQotCWxkbyBSJ0xDJDAwNTUoJXIyNSksJXIyNQotCWxkdyAxMiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDArMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTYsJXIyNQotCWxkbyBSJ0xDJDAwNTYoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDErMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTcsJXIyNQotCWxkbyBSJ0xDJDAwNTcoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDIrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTgsJXIyNQotCWxkbyBSJ0xDJDAwNTgoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDMrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTksJXIyNQotCWxkbyBSJ0xDJDAwNTkoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDQrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjAsJXIyNQotCWxkbyBSJ0xDJDAwNjAoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDgrMjQtMSwyNCwlcjIyCi0JbGRvIC0yKCVyMjIpLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDYxLCVyMjUKLQlsZG8gUidMQyQwMDYxKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyMjogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JYmwsbiBMJDAyMjAsJXIwCi1MJDAyMjE6IAotTCQwMjE5OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAyMTcsJXIwCi1MJDAyMTg6IAotTCQwMjE2OiAKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwNjI6IAotCS5TVFJJTkcgIm5fYmFzZWNsYXNzZXMgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MzogCi0JLlNUUklORyAibmZuX2ZpZWxkcyAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY0OiAKLQkuU1RSSU5HICJuZm5fZmllbGRzX3RvdGFsICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjU6IAotCS5TVFJJTkcgInZpcnR1YWxfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqMHgleClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY2OiAKLQkuU1RSSU5HICJceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2NzogCi0JLlNUUklORyAicHJpdmF0ZV9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjg6IAotCS5TVFJJTkcgInByb3RlY3RlZF9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLXByaW50X2NwbHVzX3N0dWZmOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsMTYoJXI0KQotCXN0dyAlcjcsMjAoJXI0KQotCXN0dyAlcjYsMjQoJXI0KQotCXN0dyAlcjUsMjgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjIsJXIyNQotCWxkbyBSJ0xDJDAwNjIoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAyKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjMsJXIyNQotCWxkbyBSJ0xDJDAwNjMoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZHcgNDgoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NCwlcjI1Ci0JbGRvIFInTEMkMDA2NCglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjQsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjIxCi0JbGRoIDAoJXIyMSksJXIyMgotCWV4dHJzICVyMjIsMzEsMTYsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNDgoJXIyMiksJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NSwlcjI1Ci0JbGRvIFInTEMkMDA2NSglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQlsZHcgOCglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgOCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzNCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjUsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMjYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY3LCVyMjUKLQlsZG8gUidMQyQwMDY3KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAxMiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAxMiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMjcsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY4LCVyMjUKLQlsZG8gUidMQyQwMDY4KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAxNiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAxNiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNzogCi1MJDAyMjU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQljb21pY2xyLDwgMCwlcjE5LCVyMAotCWJsIEwkMDIyOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZHVtcF9mbl9maWVsZGxpc3RzLCVyMgotCW5vcAotTCQwMjI4OiAKLUwkMDIyMzogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDY5OiAKLQkuU1RSSU5HICJ0eXBlIG5vZGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDcwOiAKLQkuU1RSSU5HICJuYW1lICclcycgKDB4JXgpXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzE6IAotCS5TVFJJTkcgIjxOVUxMPlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzI6IAotCS5TVFJJTkcgImNvZGUgMHgleCBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDczOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1VOREVGKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzQ6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUFRSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzU6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQVJSQVkpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NjogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9TVFJVQ1QpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9VTklPTilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc4OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0VOVU0pXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3OTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9GVU5DKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODA6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfSU5UKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODE6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRkxUKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODI6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfVk9JRClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDgzOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1NFVClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg0OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1JBTkdFKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODU6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUEFTQ0FMX0FSUkFZKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODY6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRVJST1IpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4NzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9NRU1CRVIpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4ODogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9NRVRIT0QpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4OTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9SRUYpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MDogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9DSEFSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTE6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQk9PTClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDkyOiAKLQkuU1RSSU5HICIoVU5LTk9XTiBUWVBFIENPREUpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MzogCi0JLlNUUklORyAibGVuZ3RoICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTQ6IAotCS5TVFJJTkcgIm9iamZpbGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk1OiAKLQkuU1RSSU5HICJ0YXJnZXRfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTY6IAotCS5TVFJJTkcgInBvaW50ZXJfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTc6IAotCS5TVFJJTkcgInJlZmVyZW5jZV90eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5ODogCi0JLlNUUklORyAiZnVuY3Rpb25fdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTk6IAotCS5TVFJJTkcgImZsYWdzIDB4JXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAwOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1VOU0lHTkVEXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwMTogCi0JLlNUUklORyAiIFRZUEVfRkxBR19TSUdORURceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAyOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1NUVUJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAzOiAKLQkuU1RSSU5HICJuZmllbGRzICVkIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNDogCi0JLlNUUklORyAiWyVkXSBiaXRwb3MgJWQgYml0c2l6ZSAlZCB0eXBlIDB4JXggbmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA1OiAKLQkuU1RSSU5HICJ2cHRyX2Jhc2V0eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNjogCi0JLlNUUklORyAidnB0cl9maWVsZG5vICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDc6IAotCS5TVFJJTkcgImFyZ190eXBlcyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDg6IAotCS5TVFJJTkcgImNwbHVzX3N0dWZmIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwOTogCi0JLlNUUklORyAidHlwZV9zcGVjaWZpYyAweCV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDExMDogCi0JLlNUUklORyAiICh1bmtub3duIGRhdGEgZm9ybSlceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCByZWN1cnNpdmVfZHVtcF90eXBlLENPREUKLQkuRVhQT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUgotcmVjdXJzaXZlX2R1bXBfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDE2KCVyNCkKLQlzdHcgJXI3LDIwKCVyNCkKLQlzdHcgJXI2LDI0KCVyNCkKLQlzdHcgJXI1LDI4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjksJXIyNQotCWxkbyBSJ0xDJDAwNjkoJXIyNSksJXIyNQotCWxkdyAwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNCglcjIyKSwlcjIxCi0JbGRvIC00KCVyMCksJXIyMgotCWxkbyAtMzIoJXI0KSwlcjI0Ci0JYWRkICVyMjQsJXIyMiwlcjIzCi0JbGR3IDAoJXIyMyksJXIyMgotCWxkdyA0KCVyMjIpLCVyMjMKLQljb21pY2xyLD0gMCwlcjIzLCVyMAotCWJsIEwkMDIzMCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA3MSwlcjIxCi0JbGRvIFInTEMkMDA3MSglcjIxKSwlcjIxCi1MJDAyMzA6IAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA3MCwlcjI1Ci0JbGRvIFInTEMkMDA3MCglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCWNvcHkgJXIyMSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNzIsJXIyNQotCWxkbyBSJ0xDJDAwNzIoJXIyNSksJXIyNQotCWxkdyAwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlhZGRpLHV2IC0xOSwlcjIwLCVyMAotCWJscixuICVyMjAsJXIwCi0JYixuIEwkMDI1MQotTCQwMjUyOiAKLQliIEwkMDIzMgotCW5vcAotCWIgTCQwMjMzCi0Jbm9wCi0JYiBMJDAyMzQKLQlub3AKLQliIEwkMDIzNQotCW5vcAotCWIgTCQwMjM2Ci0Jbm9wCi0JYiBMJDAyMzcKLQlub3AKLQliIEwkMDIzOAotCW5vcAotCWIgTCQwMjM5Ci0Jbm9wCi0JYiBMJDAyNDAKLQlub3AKLQliIEwkMDI0MQotCW5vcAotCWIgTCQwMjQyCi0Jbm9wCi0JYiBMJDAyNDMKLQlub3AKLQliIEwkMDI0NAotCW5vcAotCWIgTCQwMjQ1Ci0Jbm9wCi0JYiBMJDAyNDYKLQlub3AKLQliIEwkMDI0NwotCW5vcAotCWIgTCQwMjQ4Ci0Jbm9wCi0JYiBMJDAyNDkKLQlub3AKLQliIEwkMDI1MAotCW5vcAotTCQwMjMyOiAKLQlsZGlsIEwnTEMkMDA3MywlcjI2Ci0JbGRvIFInTEMkMDA3MyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzM6IAotCWxkaWwgTCdMQyQwMDc0LCVyMjYKLQlsZG8gUidMQyQwMDc0KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNDogCi0JbGRpbCBMJ0xDJDAwNzUsJXIyNgotCWxkbyBSJ0xDJDAwNzUoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM1OiAKLQlsZGlsIEwnTEMkMDA3NiwlcjI2Ci0JbGRvIFInTEMkMDA3NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzY6IAotCWxkaWwgTCdMQyQwMDc3LCVyMjYKLQlsZG8gUidMQyQwMDc3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNzogCi0JbGRpbCBMJ0xDJDAwNzgsJXIyNgotCWxkbyBSJ0xDJDAwNzgoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM4OiAKLQlsZGlsIEwnTEMkMDA3OSwlcjI2Ci0JbGRvIFInTEMkMDA3OSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzk6IAotCWxkaWwgTCdMQyQwMDgwLCVyMjYKLQlsZG8gUidMQyQwMDgwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MDogCi0JbGRpbCBMJ0xDJDAwODEsJXIyNgotCWxkbyBSJ0xDJDAwODEoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQxOiAKLQlsZGlsIEwnTEMkMDA4MiwlcjI2Ci0JbGRvIFInTEMkMDA4MiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDI6IAotCWxkaWwgTCdMQyQwMDgzLCVyMjYKLQlsZG8gUidMQyQwMDgzKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MzogCi0JbGRpbCBMJ0xDJDAwODQsJXIyNgotCWxkbyBSJ0xDJDAwODQoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ0OiAKLQlsZGlsIEwnTEMkMDA4NSwlcjI2Ci0JbGRvIFInTEMkMDA4NSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDU6IAotCWxkaWwgTCdMQyQwMDg2LCVyMjYKLQlsZG8gUidMQyQwMDg2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0NjogCi0JbGRpbCBMJ0xDJDAwODcsJXIyNgotCWxkbyBSJ0xDJDAwODcoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ3OiAKLQlsZGlsIEwnTEMkMDA4OCwlcjI2Ci0JbGRvIFInTEMkMDA4OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDg6IAotCWxkaWwgTCdMQyQwMDg5LCVyMjYKLQlsZG8gUidMQyQwMDg5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0OTogCi0JbGRpbCBMJ0xDJDAwOTAsJXIyNgotCWxkbyBSJ0xDJDAwOTAoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjUwOiAKLQlsZGlsIEwnTEMkMDA5MSwlcjI2Ci0JbGRvIFInTEMkMDA5MSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNTE6IAotCWxkaWwgTCdMQyQwMDkyLCVyMjYKLQlsZG8gUidMQyQwMDkyKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzMTogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDkzLCVyMjUKLQlsZG8gUidMQyQwMDkzKCVyMjUpLCVyMjUKLQlsZHcgOCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTQsJXIyNQotCWxkbyBSJ0xDJDAwOTQoJXIyNSksJXIyNQotCWxkdyAxMiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTUsJXIyNQotCWxkbyBSJ0xDJDAwOTUoJXIyNSksJXIyNQotCWxkdyAxNiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTYoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1MywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotTCQwMjUzOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk2LCVyMjUKLQlsZG8gUidMQyQwMDk2KCVyMjUpLCVyMjUKLQlsZHcgMjAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk3LCVyMjUKLQlsZG8gUidMQyQwMDk3KCVyMjUpLCVyMjUKLQlsZHcgMjQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk4LCVyMjUKLQlsZG8gUidMQyQwMDk4KCVyMjUpLCVyMjUKLQlsZHcgMjgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDMyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTksJXIyNQotCWxkbyBSJ0xDJDAwOTkoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMzEsMSwlcjE5Ci0JZXh0cnMgJXIxOSwzMSwxNiwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjU0LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTAwLCVyMjYKLQlsZG8gUidMQyQwMTAwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyNTQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWxkbyAyKCVyMCksJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIxOQotCWV4dHJzICVyMTksMzEsMTYsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1NSwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDEwMSwlcjI2Ci0JbGRvIFInTEMkMDEwMSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjU1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gNCglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNTYsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAxMDIsJXIyNgotCWxkbyBSJ0xDJDAxMDIoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI1NjogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDM0KCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTAzLCVyMjUKLQlsZG8gUidMQyQwMTAzKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAzNiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsOCglcjQpCi1MJDAyNTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzQoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyNTgsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI3LDI4LCVyMjIKLQlsZHcgMzYoJXIyMCksJXIyMQotCWFkZCAlcjIyLCVyMjEsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDQoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDgoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01NiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDEyKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNjAoJXIzMCkKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI3LDI4LCVyMjMKLQlsZHcgMzYoJXIyMSksJXIyMgotCWFkZCAlcjIzLCVyMjIsJXIyMQotCWxkdyAxMiglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTY0KCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwyNywyOCwlcjIzCi0JbGR3IDM2KCVyMjEpLCVyMjIKLQlhZGQgJXIyMywlcjIyLCVyMjEKLQlsZHcgMTIoJXIyMSksJXIyMgotCWNvbWljbHIsPSAwLCVyMjIsJXIwCi0JYmwgTCQwMjYwLCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDcxLCVyMjEKLQlsZG8gUidMQyQwMDcxKCVyMjEpLCVyMjEKLQlzdHcgJXIyMSwtNjQoJXIzMCkKLUwkMDI2MDogCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDEwNCwlcjI1Ci0JbGRvIFInTEMkMDEwNCglcjI1KSwlcjI1Ci0JbGR3IDgoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNjEsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDQoJXIyMSksJXIyMAotCWxkdyA4KCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKLQlub3AKLUwkMDI2MTogCi1MJDAyNTk6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDI1NywlcjAKLUwkMDI1ODogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwNSwlcjI1Ci0JbGRvIFInTEMkMDEwNSglcjI1KSwlcjI1Ci0JbGR3IDQwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjYyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDIoJXIyMSksJXIyMAotCWxkdyA0MCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi1MJDAyNjI6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDYsJXIyNQotCWxkbyBSJ0xDJDAxMDYoJXIyNSksJXIyNQotCWxkdyA0NCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JY29taWNsciw8PiA2LCVyMTksJXIwCi0JYmwgTCQwMjY1LCVyMAotCW5vcAotCWNvbWljbHIsPj0gNiwlcjE5LCVyMAotCWJsIEwkMDI3MCwlcjAKLQlub3AKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAyNjYsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyNjcsJXIwCi1MJDAyNzA6IAotCWNvbWljbHIsPD4gMTUsJXIxOSwlcjAKLQlibCBMJDAyNjQsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyNjcsJXIwCi1MJDAyNjQ6IAotTCQwMjY1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTA3LCVyMjUKLQlsZG8gUidMQyQwMTA3KCVyMjUpLCVyMjUKLQlsZHcgNDgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDQ4KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9hcmdfdHlwZXMsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyNjMsJXIwCi1MJDAyNjY6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDgsJXIyNQotCWxkbyBSJ0xDJDAxMDgoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9jcGx1c19zdHVmZiwlcjIKLQlub3AKLQlibCxuIEwkMDI2MywlcjAKLUwkMDI2NzogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwOSwlcjI1Ci0JbGRvIFInTEMkMDEwOSglcjI1KSwlcjI1Ci0JbGR3IDQ4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjY4LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTEwLCVyMjYKLQlsZG8gUidMQyQwMTEwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI2ODogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjYzLCVyMAotTCQwMjYzOiAKLUwkMDIyOTogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9nbG9iYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZ2xvYmFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODJmNDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9nbG9iYWwucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5jb2RlCi0JLklNUE9SVCBmb28sZGF0YQotCi0JLmFsaWduIDQKLTsgT2ZmaWNpYWwgZ2FzIGNvZGUgd2lsbCBub3QgYWNjZXB0IHN5bS0kZ2xvYmFsJC4KLQlhZGRpbCBMJWZvby0kZ2xvYmFsJCwlcjI3Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhZjlkMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xhYmVsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci07IEEgY29tbWVudC4gIFRoaXMgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIGxhYmVsLCBidXQgYm90aCBvZiB0aGUKLTsgZm9sbG93aW5nIHN0YXRlbWVudHMgc2hvdWxkLgotbGFiZWxfd2l0aG91dF9jb2xvbgotbGFiZWxfd2l0aF9jb2xvbjoKLQotOyBBIHByb2JsZW0gdGVnZSBmb3VuZC4uLgotOyBJbnB1dCBzY3J1YmJpbmcgaW4gZ2FzIG1ha2VzIGxpZmUgYSByZWFsIG5pZ2h0bWFyZSBmb3IgYXNzZW1ibGVycwotOyBpbiB3aGljaCB0aGUgKnBvc2l0aW9uKiB3aXRoaW4gYSBsaW5lIGRldGVybWluZXMgaG93IHRvIGludGVycHJldAotOyBhIHN0cmVhbSBhIGNoYXJhY3RlcnMuICBUaGVzZSB0ZXN0IG9uZSBwYXJ0aWN1bGFyIGNhc2Ugd2hlcmUgZ2FzCi07IGhhZCB0aGUgdGVuZGVuY3kgdG8gZGVsZXRlIHRoZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIG9wY29kZSBhbmQKLTsgb3BlcmFuZHMgaWYgYSBsYWJlbCB3aXRob3V0IGEgY29sb24gYmVnYW4gYSBsaW5lLCBhbmQgdGhlIG9wZXJhbmRzCi07IHN0YXJ0ZWQgd2l0aCBhIG5vbi1udW1lcmljIGNoYXJhY3Rlci4KLUwkMQlhZGQgJXIyLCVyMiwlcjIKLUwkMjoJYWRkICVyMiwlcjIsJXIyCi1MJDMKLQlhZGQgJXIyLCVyMiwlcjIKLQotTCQ0CWFkZCAlcjIsJXIyLCVyMgotTCQ1OglhZGQgJXIyLCVyMiwlcjIKLUwkNgotCWFkZCAlcjIsJXIyLCVyMgotCi07IEFuIGluc3RydWN0aW9uIG9yIHBzZXVkby1vcCBtYXkgYmVnaW4gYW55d2hlcmUgYWZ0ZXIgY29sdW1uIDAuCi0gYixuIGxhYmVsX3dpdGhvdXRfY29sb24KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGluZXNlcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjg0YjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLWZvbzoKLQkuV09SRCAwICEuSU1QT1JUICRiYXIkLERBVEEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sc2VsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xzZWxidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzN2U4Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xzZWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuY29kZQotCi0JLmFsaWduIDQKLTsgSW4gZ2FzLTEuMzYgdGhlIGxkaWwgaW5zdHJ1Y3Rpb24gdXNpbmcgcGFyZW50aGVzaXMgZ2VuZXJhdGVkCi07IGdhcmJhZ2UgYml0cyB3aGlsZSB0aGUgb25lIHdpdGhvdXQgcGFyZW5zIHdvcmtlZCBmaW5lLgotCWxkaWwgTCUoMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyKSwlcjIxCi0JbGRvIEwlKDB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMikgKCVyMjEpLCVyMjEKLQlsZGlsIEwlMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyLCVyMjEKLQlsZG8gTCUweDAwMDQwMDAwIHwgMHgwMDAwMDAwOCB8IDB4MDAwMDAwMDIgKCVyMjEpLCVyMjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL25vc3Vic3BhY2UucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwNDYwMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL25vc3Vic3BhY2UucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuU1BBQ0UgJFRFWFQkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbXBuX2FkZF9uCi0JLkVYUE9SVCBtcG5fYWRkX24sUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUixSVE5WQUw9R1IKLW1wbl9hZGRfbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0KLQlhZGQJJXIwLCVyMCwlcjAJCTsgcmVzZXQgY3kKLUxvb3A6Ci0JbGR3cyxtYQkgNCgwLCVyMjUpLCVyMjAKLQlsZHdzLG1hCSA0KDAsJXIyNCksJXIxOQotCi0JYWRkYwkgJXIxOSwlcjIwLCVyMTkKLQlhZGRpYiw8PiAtMSwlcjIzLExvb3AKLQlzdHdzLG1hCSAlcjE5LDQoMCwlcjI2KQotCi0JYnYJMCgyKQotCSBhZGRjCSVyMCwlcjAsJXIyOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkNjc0ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX3N0cmluZ190ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdHJpbmdlci5zOiBUZXN0IGVtYmVkZGVkIHF1b3RlcyBhbmQgb2N0YWwgZXNjYXBlcyBpbiBzdHJpbmdzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3RyaW5nZXIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMzY5NkU2M1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rICAgICAgNkM3NTY0NjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDZCMkU2NDY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICA2NjIyMEEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDkzMDc4MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDMyMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbHNlbF90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxzZWxidWdzLnM6IGxzZWxidWciCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsc2VsYnVnLnMiICItYWwiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4gCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIyQTA0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzNkI1MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjJBMDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDM2QjUwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3ZhbGlkX2FsaWduX3Rlc3RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFsaWduMS5zOiB2YWxpZCBhbGlnbm1lbnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhbGlnbjEucyIgIi1hbCIKLQotICAgICMgTWFrZSBzdXJlIHdlIGNvcnJlY3RseSBoYW5kbGUgZmllbGQgc2VsZWN0b3JzLiAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMTAwMCAwODAwMDI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDBcW15cblxdKkJMT0NLXFteXG5cXSoxMDI0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDQwMFxbXlxuXF0qQkxPQ0tcW15cblxdKjEwMjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODAwXFteXG5cXSpCTE9DS1xbXlxuXF0qNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MDRcW15cblxdKkFMSUdOXFteXG5cXSo4XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgwOFxbXlxuXF0qQkxPQ0tcW15cblxdKjMwXFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgyNlxbXlxuXF0qQUxJR05cW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODI4XFteXG5cXSpCTE9DS1xbXlxuXF0qNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgICMgR0FTLTIuMCBkb2VzIG5vdCBhbHdheXMgcGFyc2UgISBhcyBhIGxpbmUgc2VwYXJhdG9yIHdoZW4gaXQgc2hvdWxkLgotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0ICJsaW5lc2VwYnVnLnMiICIiICIiICJsaW5lIHNlcGFyYXRvciBidWciCi0KLSAgICAjIE1ha2Ugc3VyZSBHQVMgYWNjZXB0cyBzeW50YXggZm9yIGFjY2Vzc2luZyBzdGF0aWMgZGF0YS4KLSAgICBnYXNfdGVzdCAiZ2xvYmFsLnMiICIiICIiICJjaGVjayBmb3Igc3ltLVwkZ2xvYmFsXCQgYWNjZXB0YW5jZSIKLQotICAgICMgR0FTLTIuMCAoYW5kIDEuMzYgZm9yIHRoYXQgbWF0dGVyKSBjYW4gbm90IGhhbmRsZSBhIC5wcm9jIHdoaWNoCi0gICAgIyBoYXMgbm8gbGFiZWwgYmVmb3JlIGl0LgotICAgIGdhc190ZXN0ICJwcm9jYnVnLnMiICIiICIiICJMYWJlbCBmb2xsb3dpbmcgLnByb2MiCi0KLSAgICAjIE9uZSBpcyByZXF1aXJlZCB0byBleHBsaWNpdGx5IElNUE9SVCBhbnkgbm9uLWxvY2FsIHN5bWJvbCB1c2VkCi0gICAgIyBpbiBhbiBhc3NlbWJseSBmaWxlLiAgTWFrZSBzdXJlIHdlIGdpdmUgYW4gZXJyb3IgaWYgd2UgdXNlCi0gICAgIyBhbiB1bmRlZmluZWQgc3ltYm9sLgotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0X2Vycm9yICJ1bmRlZmJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIHdoZW4gdXNpbmcgdW5kZWZpbmVkIHN5bWJvbCIKLQotICAgICMgVGhpcyBmaWxlIGhhcyBjb2RlIGFuZCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBiZWZvcmUgc3dpdGNoaW5nIGludG8gYW55Ci0gICAgIyBzcGFjZS9zdWJzcGFjZSBwYWlyLiAgVGhpcyBzaG91bGQgcmVwb3J0IGFuIGVycm9yIGZvciBTT00gKGl0IGlzIG5vdAotICAgICMgYW4gZXJyb3IgZm9yIEVMRi4gIFRoZSBmaWxlIGFsc28gaGFzIG1pc21hdGNoZWQgZW50cnkvZXhpdCBhbmQKLSAgICAjIHByb2MvcHJvY2VuZCBwYWlycyB3aGljaCBhcmUgZXJyb3JzIGZvciBib3RoIFNPTSBhbmQgRUxGLgotICAgIGdhc190ZXN0X2Vycm9yICJub3N1YnNwYWNlLnMiICIiICJDaGVjayBmb3IgZXJyb3IocykgaW4gaW5wdXQgZmlsZSAiCi0KLSAgICAjIFRoaXMgZmlsZSBzaG91bGQgcmV0dXJuIGVycm9ycyBmb3IgYm90aCB0aGUgRU5UUllfR1IgYW5kIEVOVFJZX0ZSCi0gICAgIyBkaXJlY3RpdmVzICh0aGV5IGFyZSBvdXQtb2YtcmFuZ2UpCi0gICAgZ2FzX3Rlc3RfZXJyb3IgImVudHJ5YnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gZW50cnlfZ3IgYW5kIGVudHJ5X2ZyIgotCi0gICAgIyBNYWtlIHN1cmUgZW1iZWRkZWQgcXVvdGVzIGFuZCBvY3RhbCBlc2NhcGVzIGluIHN0cmluZ3Mgd29yawotICAgIGRvX3N0cmluZ190ZXN0cwotCi0gICAgIyBNYWtlIHN1cmUgd2UgZG8gbm90IGRpZSBvbiBhIC52ZXJzaW9uIGRpcmVjdGl2ZQotICAgIGdhc190ZXN0ICJ2ZXJzaW9uYnVnLnMiICIiICIiICIudmVyc2lvbiBkaXJlY3RpdmUiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBnaXZlIGFuIGVycm9yIG9uIGEgYm9ndXMgLnNwYWNlIGRpcmVjdGl2ZS4KLSAgICAjIHJlY2VudCB2ZXJzaW9uIG9mIGdhczIgd2VudCBpbnRvIGluZmluaXRlIGxvb3BzIHByaW50aW5nCi0gICAgIyBlcnJvcnMgb24gdGhpcyB0ZXN0LgotICAgIGdhc190ZXN0X2Vycm9yICJzcGFjZWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIC5zcGFjZSBkaXJlY3RpdmUiCi0KLSAgICAjIEdBUyBzaG91bGQgZ2l2ZSBhbiBlcnJvciBmb3IgdGhpcyB0ZXN0LgotICAgIGdhc190ZXN0X2Vycm9yICJjYWxsZGF0YWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGludmFsaWQgYWd1bWVudHMgb24gLmNhbGwiCi0KLSAgICAjIE9sZCB2ZXJzaW9ucyBvZiBnYXMgaW5jb3JyZWN0bHkgZ2F2ZSBlcnJvcnMgb24gc29tZSB2YWxpZCAuRVhQT1JUIGxpbmVzCi0gICAgZ2FzX3Rlc3QgImV4cG9ydGJ1Zy5zIiAiIiAiIiAic3ludGF4IGNoZWNrIGZvciBhbiBvbGQgLkVYUE9SVCBidWciCi0KLSAgICAjIE9sZCB2ZXJzaW9ucyBvZiBnYXMgY2hva2VkIG9uIHRoaXMgZmlsZSBmb3Igc29tZSByZWFzb24KLSAgICBnYXNfdGVzdCAiZml4dXA3YnVnLnMiICIiICIiICJjaGVjayBmb3Igb2xkIFwiZml4dXA3XCIgZ2FzIGJ1ZyIKLQotICAgICMgVGVzdCBhbiBMJSBzZWxlY3RvciBwYXJzaW5nIGJ1ZyB3aGljaCBleGlzdGVkIGluIGdhcy0xLjM2ICAgCi0gICAgZG9fbHNlbF90ZXN0Ci0KLSAgICAjIEZpcnN0IGNoZWNrIGhvdyBzb21lIHZhbGlkIGFsaWdubWVudHMgYXJlIGhhbmRsZWQuCi0gICAgZG9fdmFsaWRfYWxpZ25fdGVzdHMKLQotICAgICMgTm93IGNoZWNrIHRvIG1ha2Ugc3VyZSBhbiBpbnZhbGlkIGFyZ3VtZW50IGlzIGZsYWdnZWQgYXMgYW4gZXJyb3IuCi0gICAgZ2FzX3Rlc3RfZXJyb3IgImFsaWduMi5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIGFyZ3VtZW50IHRvIC5hbGlnbiIKLQotICAgICMgR0FTIGNhbid0IGhhbmRsZSB1cHBlciBib3VuZCBmb3IgYSBQQSAuYmxvY2tbel0gZGlyZWN0aXZlCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qCi0gICAgZ2FzX3Rlc3QgImJsb2NrMS5zIiAiIiAiIiAiQ2hlY2sgbWluL21heCB2YWx1ZXMgZm9yIC5ibG9jayIKLQotICAgICMgTm93IGNoZWNrIGZvciBhbiBpbnZhbGlkIGFyZ3VtZW50Ci0gICAgZ2FzX3Rlc3RfZXJyb3IgImJsb2NrMi5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIGFyZ3VtZW50IHRvIC5ibG9jayIKLQotICAgICMgR0FTLTEuMzYgY2hva2VkIG9uIHRoaXMgZmlsZS4KLSAgICAjIEZJWE1FLiAgU2hvdWxkIGNoZWNrIHJlbG9jYXRpb25zIG1hZGUgZm9yIHRoaXMgdGVzdCEKLSAgICBnYXNfdGVzdCAiZXhwcmJ1Zy5zIiAiIiAiIiAiQ2hlY2sgZm9yIHN5bTEtc3ltMiBhY2NlcHRhbmNlIgotCi0gICAgIyBCYWQgdGhpbmdzIGhhcHBlbiBpbiB0aGUgUEEgRUxGIGJhY2tlbmQgKG90aGVycyB0b28/KSBpZiBhIG5vbi1kZWZhdWx0Ci0gICAgIyBzZWN0aW9uIGlzIGNyZWF0ZWQuLi4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSplbGYqCi0gICAgc2V0dXBfeGZhaWwgaHBwYSp3LSotKgotICAgIGdhc190ZXN0ICJzc2J1Zy5zIiAiIiAiIiAiQ2hlY2sgZm9yIGFjY2VwdGFuY2Ugb2Ygbm9uLWRlZmF1bHQgc3Vic3BhY2VzIgotCi0gICAgIyBUbyBiZSBjb21wYXRhYmxlIHdpdGggY2VydGFpbiAiZmVhdHVyZXMiIG9mIHRoZSBIUCBjb21waWxlcgotICAgICMgbm9uLWV4aXN0YW50IHJlZ2lzdGVycyBzaG91bGQgZGVmYXVsdCB0byAlcjAuCi0gICAgZ2FzX3Rlc3QgImRlZmJ1Zy5zIiAiIiAiIiAiTWlzc2luZyByZWdpc3RlciBzaG91bGQgZGVmYXVsdCB0byAlJXIwIgotCi0gICAgIyBNYWtlIHN1cmUgR0FTIHVuZGVyc3RhbmRzIGEgcmVhc29uYWJsZSBzZXQgb2Ygc3RhbmRhcmQgcHJlZGVmaW5lZAotICAgICMgcmVnaXN0ZXJzLiAgZWcgJXJwLCAlZHAsICVzcCwgZXRjLgotICAgIGdhc190ZXN0ICJzdGRyZWcucyIgIiIgIiIgIlRlc3Qgc3RhbmRhcmQgcHJlZGVmaW5lZCByZWdpc3RlcnMiCi0KLSAgICAjIE1ha2Ugc3VyZSBHQVMgd2lsbCBhY2NlcHQgYSBsYWJlbCB3aXRob3V0IGEgY29sb24uCi0gICAgZ2FzX3Rlc3QgImxhYmVsYnVnLnMiICIiICIiICJUZXN0IGxhYmVsIHdpdGhvdXQgY29sb24iCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBncm9rICMgbGluZSBkaXJlY3RpdmVzLgotICAgIGdhc190ZXN0ICJhcHBidWcucyIgIiIgIiIgIlRlc3QgYWNjZXB0YW5jZSBvZiAjbGluZSBkaXJlY3RpdmVzIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgZ2l2ZSBlcnJvcnMgaWYgYSBmbG9hdGluZyBwb2ludCBmb3JtYXQgaXMgc3BlY2lmaWVkCi0gICAgIyBmb3IgYW4geG1weXUgaW5zdHJ1Y3Rpb24gKGludGVnZXIgbXVsdGlwbGUpCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInhtcHl1YnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gYm9ndXMgYXJndW1lbnQgdG8geG1weXUiCi0KLSAgICAjIE1ha2Ugc3VyZSBnYXMgaGFuZGxlcyB2YXJpb3VzIGtpbmRzIG9mIC5yZWcgcHNldWRvLW9wcwotICAgIGdhc190ZXN0ICJyZWdwb3BidWcucyIgIiIgIiIgIlRlc3QgZm9yIGJ1Z3MgaW4gLnJlZyBwc2V1ZG8tb3AiCi0KLSAgICAjIENoZWNrIHNvbWUgYnVncyB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gcGFyc2luZyAuY2FsbGluZm8gZGlyZWN0aXZlcwotICAgIGdhc190ZXN0ICJjYWxsaW5mb2J1Zy5zIiAiIiAiIiAiVGVzdCBmb3IgYnVncyBpbiAuY2FsbGluZm8gZGlyZWN0aXZlIgotCi0gICAgIyBDaGVjayBmb3IgYm9ndXMgcmVnaXN0ZXJzIGluIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZC9mbXB5c3ViCi0gICAgIyBpbnN0cnVjdGlvbnMKLSAgICBnYXNfdGVzdF9lcnJvciAiYmFkZm1weWFkZC5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJhZCBmbXB5YWRkIGluc24iCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcHJvY2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTM1OGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5leHBvcnQgZGl2dSxlbnRyeQotCS5wcm9jCi0JLmNhbGxpbmZvCi1kaXZ1OglzdHdzLG1hCQklcjQsNCglcjUpCQk7IHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JLnByb2NlbmQKLQotCS5leHBvcnQgZGl2dTIsZW50cnkKLQkucHJvYwotCS5jYWxsaW5mbwotCS5lbnRyeQotZGl2dTI6CXN0d3MsbWEJCSVyNCw0KCVyNSkJCTsgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKLQkuZXhpdAotCS5wcm9jZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3JlZ3BvcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1N2Q5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3JlZ3BvcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0JLmNvZGUKLQotcjAJLnJlZwklcjAKLXNoaWZ0CS5yZWcJJXNhcgotZnByZWcxMAkucmVnCSVmcjEwCi1zaGlmdDIJLnJlZwlzaGlmdAotCi07IE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgYm90Y2ggLmVxdS4uLgoteWFiYmEJLmVxdQlyMCArIHNoaWZ0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NwYWNlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NwYWNlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2I0MDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zdGFydDoJLmxvbmcgMCwgMSwgMiwgMywgNCwgNSwgNiwgNwotCS5zcGFjZSAweDIwIC0gKC4gLSBzdGFydCkKLWZvbzoJLmxvbmcgNDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3NidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3NidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2MGUwZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TVUJTUEEgJFNIT1JUQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdGRyZWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZjY2OGM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5leHBvcnQgZm9vCi1mb286Ci0JLnByb2MKLQkuY2FsbGluZm8gbm9fY2FsbHMKLQkuZW50cnkKLQlsZGkgMTUsJXNwCi0JbGRpIDE1LCVycAotCWxkaSAxNSwlZHAKLQlsZGkgMTUsJXJldDAKLQlsZGkgMTUsJXJldDEKLQlsZGkgMTUsJWFyZzAKLQlsZGkgMTUsJWFyZzEKLQlsZGkgMTUsJWFyZzIKLQlsZGkgMTUsJWFyZzMKLQkuZXhpdAotIAkucHJvY2VuZCAJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0cmluZ2VyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0cmluZ2VyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDBiMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS5kYXRhCi0KLQotOyBHQVMgdXNlZCB0byBtaXMtcGFyc2UgdGhlIGVtYmVkZGVkIHF1b3RlcwotCS5TVFJJTkcgIiNpbmNsdWRlIFwiYXdrLmRlZlwiXHgwYVx4MDAiCi0KLTsgT2N0YWwgZXNjYXBlcyB1c2VkIHRvIGNvbnN1bWUgPiAzIGNoYXJzIHdoaWNoIGxlZCB0byB0aGlzCi07IHN0cmluZyBiZWluZyBzY3Jld2VkIGluIGEgYmlnIHdheS4KLQkuU1RSSU5HICJcMDExMHgxMjMiCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmNhNTNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdW5kZWZidWcucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS5jb2RlCi0KLQkuYWxpZ24gNAotCWJsIHNvbWV3aGVyZSwlcjIKLQlub3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS92ZXJzaW9uYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZiMjIxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS5jb2RlCi0KLQkuVkVSU0lPTiAiYWJjMTIzIgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTA4NDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS94bXB5dWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBObyBmb3JtYXQgc2VsZWN0b3IgZm9yIHhtcHl1IQotCXhtcHl1LHNnbCAlZnI0LCVmcjUsJWZyNgotCXhtcHl1LGRibCAlZnI0LCVmcjUsJWZyNgotCXhtcHl1LHF1YWQgJWZyNCwlZnI1LCVmcjYKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2I3Y2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuZGF0YQotCi0JLmFsaWduIDQKLXRhYl9fXzIKLQkud29yZCBMJDAwMDIKLQkud29yZCBMJDAwMDMKLQkud29yZCBMJDAwMDQKLQkuY29kZQotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGV4ZWN1dGUsQ09ERQotCS5FWFBPUlQgZXhlY3V0ZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotZXhlY3V0ZQotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlhZGRpbCBMJ2J1Zi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInYnVmLSRnbG9iYWwkKCVyMSksJXIyMAotCWxkaWwgTCdMJDAwMDIsJXIxOQotCW1vdmIsPD4gJXIyNiwlcjI2LEwkMDAwMgotCWxkbyBSJ0wkMDAwMiglcjE5KSwlcjIyCi0JY29weSAlcjAsJXIyMQotCWFkZGlsIEwndGFiX19fMi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFIndGFiX19fMi0kZ2xvYmFsJCglcjEpLCVyMjMKLQlhZGRpbCBMJ29wdGFiLSRnbG9iYWwkLCVyMjcKLQlsZG8gUidvcHRhYi0kZ2xvYmFsJCglcjEpLCVyMjAKLUwkMDAwOQotCXNoMmFkZCAlcjIxLCVyMjMsJXIxOQotCWxkaCAyKCVyMTkpLCVyMTkKLQlsZG8gMSglcjIxKSwlcjIxCi0Jc3ViICVyMTksJXIyMiwlcjE5Ci0JY29taWIsPj0gMiwlcjIxLEwkMDAwOQotCXN0aHMsbWEgJXIxOSwyKCVyMjApCi0JYnYsbiAlcjAoJXIyKQotTCQwMDAyCi0JbGRpIDEyMCwlcjE5Ci0Jc3RicyxtYSAlcjE5LDEoJXIyMCkKLQlsZGhzLG1hIDIoJXIyNiksJXIxOQotCWFkZCAlcjIyLCVyMTksJXIxOQotCWJ2LG4gJXIwKCVyMTkpCi1MJDAwMDMKLQlsZGkgMTIxLCVyMTkKLQlzdGJzLG1hICVyMTksMSglcjIwKQotCWxkaHMsbWEgMiglcjI2KSwlcjE5Ci0JYWRkICVyMjIsJXIxOSwlcjE5Ci0JYnYsbiAlcjAoJXIxOSkKLUwkMDAwNAotCWxkaSAxMjIsJXIxOQotCXN0YiAlcjE5LDAoJXIyMCkKLQlidiAlcjAoJXIyKQotCXN0YnMsbWIgJXIwLDEoJXIyMCkKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgc3RyY21wLENPREUKLQotCS5hbGlnbiA0Ci1MJEMwMDAwCi0JLlNUUklORyAieHl4eXpceDAwIgotCS5JTVBPUlQgYWJvcnQsQ09ERQotCS5JTVBPUlQgZXhpdCxDT0RFCi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW4KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCWxkbyAxMjgoJXIzMCksJXIzMAotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhlY3V0ZSwlcjIKLQljb3B5ICVyMCwlcjI2Ci0JYWRkaWwgTCdvcHRhYi0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIxOQotCWxkbyBSJ29wdGFiLSRnbG9iYWwkKCVyMTkpLCVyMjEKLQlsZGggMiglcjIxKSwlcjIwCi0JbGRoIFInb3B0YWItJGdsb2JhbCQoJXIxOSksJXIxOQotCWFkZGlsIEwncC0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIyMgotCXN0aCAlcjIwLFIncC0kZ2xvYmFsJCglcjIyKQotCWxkbyBSJ3AtJGdsb2JhbCQoJXIyMiksJXIyNgotCXN0aCAlcjIwLDQoJXIyNikKLQlzdGggJXIxOSwyKCVyMjYpCi0JbGRoIDQoJXIyMSksJXIxOQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhlY3V0ZSwlcjIKLQlzdGggJXIxOSw2KCVyMjYpCi0JYWRkaWwgTCdidWYtJGdsb2JhbCQsJXIyNwotCWNvcHkgJXIxLCVyMTkKLQlsZG8gUididWYtJGdsb2JhbCQoJXIxOSksJXIyNgotCWxkaWwgTCdMJEMwMDAwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIKLQlsZG8gUidMJEMwMDAwKCVyMjUpLCVyMjUKLQljb21pYiw9LG4gMCwlcjI4LEwkMDAxMQotCS5DQUxMIAotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDExCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGl0LCVyMgotCWNvcHkgJXIwLCVyMjYKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmRhdGEKLQotb3B0YWIJLmNvbW0gMTAKLWJ1ZgkuY29tbSAxMAotcAkuY29tbSAxMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmRlN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuSU1QT1JUCSQkZHluY2FsbCxNSUxMSUNPREUgOyBDb2RlIGZvciBkeW5hbWljIGZ1bmN0aW9uIGNhbGxzLgotCi1fc2lndHJhbXA6Ci0JbGRpbAlMJSQkZHluY2FsbCwlcjIJOyAgIHdob3NlIGFkZHJlc3MgaXMgaW4gcjIyLgotCWJsZQlSJSQkZHluY2FsbCglc3I0LCVyMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDQ0MzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0KLSAgCWxkaWwJTCUweGMwMDAxMDA0LCVyMQotICAJYmxlCVIlMHhjMDAwMTAwNCglc3I3LCVyMSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWczLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTgxY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWczLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLmltcG9ydCB5YWJiYSxjb2RlCi0KLSAgCWJsZQlSJXlhYmJhKCVzcjQsJXIwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9leGl0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0Zjc4YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvbyxDT0RFCi0JLkVYUE9SVCBmb28sRU5UUlksUFJJVl9MRVY9MwotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ2ZTQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5jb2RlCi0JYixuCSQkZm9vCi0Jbm9wCi0Jbm9wCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTUlMTElDT0RFJAotJCRmb286Ci0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmZTkzYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBnLENPREUKLQkuRVhQT1JUIGcsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKLWcKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXIyNiwtMzYoJXIzKQotCXN0dyAlcjI1LC00MCglcjMpCi0Jc3R3ICVyMjQsLTQ0KCVyMykKLQlsZHcgLTM2KCVyMyksJXIyNgotCWxkdyAtNDAoJXIzKSwlcjI1Ci0JbGR3IC00NCglcjMpLCVyMTkKLQljb3B5ICVyMTksJXIyMgotCS5DQUxMCUFSR1cwPUdSCi0JYmwgJCRkeW5jYWxsLCVyMzEKLQljb3B5ICVyMzEsJXIyCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCxuIEwkMDAwMiwlcjAKLQlsZHcgLTM2KCVyMyksJXIyOAotCWJsLG4gTCQwMDAxLCVyMAotCWJsLG4gTCQwMDAzLCVyMAotTCQwMDAyCi0JbGR3IC00MCglcjMpLCVyMjgKLQlibCxuIEwkMDAwMSwlcjAKLUwkMDAwMwotTCQwMDAxCi0JbGR3IC0yMCglcjMpLCVyMgotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1mMl9fXzQKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxOT19DQUxMUyxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsNjQoJXIzMCkKLQlzdHcgJXIyOSw4KCVyMykKLQlzdHcgJXIyNiwtMzYoJXIzKQotCXN0dyAlcjI1LC00MCglcjMpCi0JbGR3IC0zNiglcjMpLCVyMTkKLQlsZHcgLTQwKCVyMyksJXIyMAotCWNvbWNsciw+PSAlcjIwLCVyMTksJXIxOQotCWxkaSAxLCVyMTkKLQljb3B5ICVyMTksJXIyOAotCWJsLG4gTCQwMDA1LCVyMAotTCQwMDA1Ci0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLmRhdGEKLQotCS5hbGlnbiA0Ci1MJFRSQU1QMDAwMAotCWxkdwkzNiglcjIyKSwlcjIxCi0JYmIsPj0sbgklcjIxLDMwLC4rMTYKLQlkZXBpCTAsMzEsMiwlcjIxCi0JbGR3CTQoJXIyMSksJXIxOQotCWxkdwkwKCVyMjEpLCVyMjEKLQlsZHNpZAkoJXIyMSksJXIxCi0JbXRzcAklcjEsJXNyMAotCWJlCTAoJXNyMCwlcjIxKQotCWxkdwk0MCglcjIyKSwlcjI5Ci0JLndvcmQJMAotCS53b3JkCTAKLQkuY29kZQotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGYsQ09ERQotCS5FWFBPUlQgZixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotZgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDE5MiglcjMwKQotCWxkbyAxNiglcjMpLCVyMTkKLQlhZGRpbCBMJ0wkVFJBTVAwMDAwLSRnbG9iYWwkLCVyMjcKLQlsZG8gUidMJFRSQU1QMDAwMC0kZ2xvYmFsJCglcjEpLCVyMjIKLQlsZG8gNDAoJXIwKSwlcjIwCi0JbGR3cyxtYSA0KCVyMjIpLCVyMjEKLQlhZGRpYiw+PSAtNCwlcjIwLC4tNAotCXN0d3MsbWEgJXIyMSw0KCVyMTkpCi0JbGRpbCBMJ2YyX19fNCwlcjIwCi0JbGRvIFInZjJfX180KCVyMjApLCVyMTkKLQlzdHcgJXIxOSw1MiglcjMpCi0JbGRvIDgoJXIzKSwlcjE5Ci0Jc3R3ICVyMTksNTYoJXIzKQotCWxkbyAxNiglcjMpLCVyMTkKLQlsZG8gNDgoJXIzKSwlcjIwCi0JZmRjICVyMCglcjE5KQotCWZkYyAlcjAoJXIyMCkKLQlzeW5jCi0JbGRvIDMyKCVyMTkpLCVyMjIKLQltZnNwICVzcjAsJXIyMQotCWxkc2lkICglcjE5KSwlcjIwCi0JbXRzcCAlcjIwLCVzcjAKLQlmaWMgJXIwKCVzcjAsJXIxOSkKLQlmaWMgJXIwKCVzcjAsJXIyMikKLQlzeW5jCi0JbXRzcCAlcjIxLCVzcjAKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JbGRpIDEsJXIyNgotCWxkaSAyLCVyMjUKLQljb3B5ICVyMTksJXIyNAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgZywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWNvbWljbHIsPD4gMiwlcjE5LCVyMAotCWJsLG4gTCQwMDA2LCVyMAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgYWJvcnQsJXIyCi0Jbm9wCi1MJDAwMDYKLUwkMDAwNAotCWxkdyAtMjAoJXIzKSwlcjIKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIF9fbWFpbixDT0RFCi0JLklNUE9SVCBleGl0LENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsMTI4KCVyMzApCi0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBmLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMjYKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGV4aXQsJXIyCi0Jbm9wCi1MJDAwMDcKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTE2Yjg3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLXM6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXIzMCwxMiglcjQpCi0JbGRpbCBMJ0wkMDAwNywlcjE5Ci0JbGRvIFInTCQwMDA3KCVyMTkpLCVyMTkKLQljb21pYiw+PSAwLCVyMjYsTCQwMDAyCi0Jc3R3ICVyMTksOCglcjQpCi1MJDAwMDM6Ci1MJDAwMDI6Ci0JYiBMJDAwMDEKLQlsZG8gMSglcjApLCVyMjgKLUwkMDAwNzoKLQlsZGlsIEwnTCQwMDAyLCVyMTkKLQlsZG8gUidMJDAwMDIoJXIxOSksJXIxOQotCWNvbWIsPSAlcjI5LCVyMTksTCQwMDAyCi0JbGRvIC04KCVyNCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkxMzhiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb28sQ09ERQotCS5FWFBPUlQgZm9vLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1mb28KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQkuQ0FMTCAKLQlibCBiYXIsJXIyCi0JbGRvIDY0KCVyMzApLCVyMzAKLQkuYmxvY2t6IDI2MjE0NAotCWxkdyAtODQoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZG8gLTY0KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGJhcixDT0RFCi0JLkVYUE9SVCBiYXIsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWJhcgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGYzYWJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi0JLmRhdGEKLWJvZ28KLQkuQUxJR04JOAotCS5XT1JEICBib2dvKzQJOyA9IDB4NAotCS5TVFJJTkcJIlx4MDBceDAwXHgwMHtceDAwXHgwMFx4MDFceEM4XHgwMFx4MDBceDAzXHgxNSIKLQkuZGF0YQotCS5FWFBPUlQJYm9nbwotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjRhNDY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLkVYUE9SVCBmLERBVEEKLQkuZGF0YQotCS5hbGlnbiA0Ci1mOgotCS53b3JkIFAlYWJvcnQKLQkud29yZCBQJWFib3J0Ci0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgcHJpbnRmLENPREUKLQkuY29kZQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS5TVFJJTkcgImZyb2JceDBhXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQlsZG8gMTI4KCVyMzApLCVyMzAKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwMDAsJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmLCVyMgotCWxkbyBSJ0xDJDAwMDAoJXIyNiksJXIyNgotCWxkdyAtMTQ4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGRvIC0xMjgoJXIzMCksJXIzMAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNWRlYmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0JLkNPUFlSSUdIVCAiTWV0YVdhcmUgSW5jb3Jwb3JhdGVkLCAxOTkyIgotCS5WRVJTSU9OCSJoYzIuNmEgLU8xIHQzLmNcbiIKLQotCS5kYXRhCi0JLkFMSUdOCTgKLSRMMDBEQVRBCi0JLkFMSUdOCTgKLQkuRVhQT1JUCXMKLXMKLQkuV09SRAkweDAKLQkuQkxPQ0taCTc4NjQyNQotCS5CTE9DS1oJNwotCi0JLmNvZGUKLUwkMDAxLjMKLWcJLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCTtsZG8JMTIwKCVyMCksJXIyOCAtLT4gdG8gZGVsYXkgc2xvdAotCWJ2CSVyMCglcjIpCi0JLkVYSVQKLQlsZG8JMTIwKCVyMCksJXIyOAotCS5QUk9DRU5ECi0KLQotCS5kYXRhCi0JLkFMSUdOCTQKLQkuRVhQT1JUCWwKLWwKLQkuV09SRAlQJ2cKLQkuSU1QT1JUCWNvbW1vbixEQVRBCTsgY29tbW9uIHNlY3Rpb24sIHNpemU9MAotCS5JTVBPUlQJJGdsb2JhbCQsREFUQQotCS5FWFBPUlQJZyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjI2ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UucworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQotCS5jb2RlCi0JLmFsaWduIDQKLQkuUEFSQU0gZm9vLFJUTlZBTD1HUgotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCi0JLmFsaWduIDQKLUxDJDAwMDA6Ci0JLndvcmQgUCVmb28KLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBiYXIsQ09ERQotCS5FWFBPUlQgYmFyLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1iYXI6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlsZGlsIEwnTEMkMDAwMCwlcjE5Ci0JbGR3IFInTEMkMDAwMCglcjE5KSwlcjI2Ci0Jc3R3ICVyMiwtMjAoJXIzMCkKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZvbywlcjIKLQlsZG8gMTI4KCVyMzApLCVyMzAKLQlsZHcgLTE0OCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkbyAtMTI4KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzNmYTM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQKLQotCS5hbGlnbiA4Ci1MJFAwMDAwCi0JLndvcmQgMHgxMjM0NTY3OAotCS53b3JkIDB4MAotCi0JLmFsaWduIDgKLUwkQzAwMDAKLQkud29yZCAweDNmZjAwMDAwCi0JLndvcmQgMHgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgZyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1GUgotZwotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlzdHcgJXIxOSwtMzIoJXIzMCkKLQlsZHcgVCdMJEMwMDAwKCVyMTkpLCVyMjAKLQlidiAlcjAoJXIyKQotCWZsZGRzIDAoJXIyMCksJWZyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGFib3J0LENPREUKLQkuSU1QT1JUIGV4aXQsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KLQkuYWxpZ24gOAotTCRDMDAwMQotCS53b3JkIDB4M2ZmMDAwMDAKLQkud29yZCAweDAKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0Jc3R3ICVyMTksLTMyKCVyMzApCi0Jc3R3ICVyNCwtMTI4KCVyMzApCi0KLQljb3B5ICVyMTksJXI0Ci0JLkNBTEwgCi0JYmwgZywlcjIKLQljb3B5ICVyNCwlcjE5Ci0JY29weSAlcjQsJXIxOQotCWxkdyBUJ0wkQzAwMDEoJXIxOSksJXIyMAotCWZsZGRzIDAoJXIyMCksJWZyOAotCWZjbXAsZGJsLD0gJWZyNCwlZnI4Ci0JZnRlc3QKLQlhZGQsdHIgJXIwLCVyMCwlcjAKLQliLG4gTCQwMDAzCi0JLkNBTEwgCi0JYmwgYWJvcnQsJXIyCi0Jbm9wCi1MJDAwMDMKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGV4aXQsJXIyCi0JbGRpIDAsJXIyNgotCW5vcAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NmE3OTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0JLmRhdGEKLQkuYWxpZ24gOAotYmxhaAotCTsgLmRvdWJsZSAwZSswMAotCS53b3JkIDAgOyA9IDB4MAotCS53b3JkIDAgOyA9IDB4MAotCS5FWFBPUlQgZm9vLERBVEEKLQkuYWxpZ24gOAotZm9vCi0JOyAuZG91YmxlIDBlKzAwCi0JLndvcmQgMCA7ID0gMHgwCi0JLndvcmQgMCA7ID0gMHgwCi0JLkVYUE9SVCB5YWJiYSxEQVRBCi0JLmFsaWduIDQKLXlhYmJhCi0JLndvcmQgMQotCS5jb2RlCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgYmFyLENPREUKLQkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotYmFyCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsTk9fQ0FMTFMsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDY0KCVyMzApCi0JYWRkaWwgTCd5YWJiYS0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFIneWFiYmEtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JbGRpIDIsJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLUwkMDAwMQotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4MWJkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDY5OSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnLnM6IFRlc3QgZm9yIHByb3BlciByZWxvY2F0aW9uIGZvciBCTEUgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYmxlYnVnLnMiICIiICJQcm9wZXIgcmVsb2NhdGlvbiBmb3IgQkxFIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLSAgICAgICAgaWYgIVtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgIyBBdCBvbmUgdGltZSBib3RoIHZlcnNpb25zIG9mIHRoZSBhc3NlbWJsZXIgd291bGQgaW5jb3JyZWN0bHkgdXNlIAotCSAgICAjIGEgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSBCTEUgaW5zdHJ1Y3Rpb24uCi0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCQkgICAgLXJlICJeMCs0XFteXG5cXSpBQlNfQ0FMTFxbXlxuXF0qXG4iCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQkgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCSAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgICMgQXQgb25lIHRpbWUgYm90aCB2ZXJzaW9ucyBvZiB0aGUgYXNzZW1ibGVyIHdvdWxkIGluY29ycmVjdGx5IHVzZSAKLQkgICAgIyBhIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIGEgQkxFIGluc3RydWN0aW9uLgotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkJICAgIC1yZSAiXjArXFteXG5cXSpESVIyMUxcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQkgICAgLXJlICJeMCs0XFteXG5cXSpESVIxN1JcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQkgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19yZWxvY2F0aW9uX3JlZHVjdGlvbl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyZWR1Y2UuczogVGVzdCByZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIHRoZW4gewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZS5zIiAiIiAiUmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0MSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHJlbG9jYXRpb25zIGludm9sdmluZyBwcm9jZWR1cmUgbGFiZWxzIAotCSMgYXJlIG5vdCByZWR1Y2VkIHRvIGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgc29tZSBvdGhlciBzeW1ib2wuCi0JIyBEb2luZyBzbyBtYWtlcyBnZW5lcmF0aW5nIHBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWJzIGltcG9zc2libGUuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjArNFxbXlxuXF0qUExBQkVMXFteXG5cXSpmb29cW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjArMTRcW15cblxdKlBDUkVMXFteXG5cXSpmb29cW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlMi5zOiBNb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9uIHRlc3RzIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZTIucyIgIiIgIk1vcmUgcmVsb2NhdGlvbiAgcmVkdWN0aW9ucyAocGFydDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRvIG1ha2Ugc3VyZSBETFQgcmVsYXRpdmUgcmVsb2NzIGFyZSBub3QgcmVkdWNlZCB0byBzeW0rYWRkZW5kCi0JIyBEb2luZyBzbyBkb2Vzbid0IHdvcmsgYXMgb25lIG1pZ2h0IGV4cGVjdAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wKzRcW15cblxdKkRMVFxbXlxuXF0qTC5DMDAwMFxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMCsxY1xbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAwXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wKzMwXFteXG5cXSpETFRcW15cblxdKkwuQzAwMDFcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjArNDhcW15cblxdKkRMVFxbXlxuXF0qTC5DMDAwMVxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgc2V0IHRlc3RuYW1lICJyZWR1Y2UzLnM6IFRlc3QgZXZlbiBtb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9ucyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyZWR1Y2UzLnMiICIiICJFdmVuIG1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0MSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHJlbG9jYXRpb25zIGludm9sdmluZyBwcm9jZWR1cmUgbGFiZWxzIAotCSMgYXJlIG5vdCByZWR1Y2VkIHRvIGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgc29tZSBvdGhlciBzeW1ib2wuCi0JIyBEb2luZyBzbyBtYWtlcyBnZW5lcmF0aW5nIHBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWJzIGltcG9zc2libGUuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjArY1xbXlxuXF0qeWFiYmFcW15cblwrXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMCtjXFteXG5cXSp5YWJiYVwrXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggMDsgYnJlYWsgfQotCQktcmUgIl4wKzEwXFteXG5cXSp5YWJiYVxbXlxuXCtcXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wKzEwXFteXG5cXSp5YWJiYVwrXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggMDsgYnJlYWsgfQotCQktcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmxlX21vZGVfc2VsZWN0b3JfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJibGVidWcyLnM6IGJsZWJ1ZzIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJibGVidWcyLnMiICItYWwiCi0KLSAgICAjIEdBUyB1c2VzIHRvbyBtYW55IGJpdHMgb24gdGhlIEJMRSBpbnN0cnVjdGlvbi4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjAyMDI4MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEU0MjBFMDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnMy5zOiBibGVidWczIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmxlYnVnMy5zIiAiLWFsIgotCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU0MDAyMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3BsYWJlbF9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAicGxhYmVsYnVnLnM6IE9sZCBnYXMtMS4zNiBwbGFiZWwgYnVnIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInBsYWJlbGJ1Zy5zIiAiIiAiT2xkIGdhcy0xLjM2IHBsYWJlbCBidWcgKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRoYXQgd2UgbWFrZSBQTEFCRUwgcmVsb2NhdGlvbiBlbnRyaWVzIHdoZW4gdGhleSdyZSBuZWVkZWQuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjArXFteXG5cXSpQTEFCRUxcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjArNFxbXlxuXF0qUExBQkVMXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotICAgIAkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX3NlbGVjdG9yX3Njb3BlX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAic2VsZWN0b3JidWcuczogVGVzdCBzY29wZSBvZiBmaWVsZCBzZWxlY3RvciIgCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIHRoZW4gewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInNlbGVjdG9yYnVnLnMiICIiICJUZXN0IHNjb3BlIG9mIGZpZWxkIHNlbGVjdG9yIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHJlbG9jYXRpb24gZW50cnkgYWZ0ZXIgdGhlIHBsYWJlbCBpcyBjb3JyZWN0LgotCSMgSWYgYW4gb2xkIGZpZWxkIHNlbGVjdG9yIHdhcyBpbmNvcnJlY3RseSAiY2FycmllZCIgb3ZlciwgdGhlbiAKLQkjIHRoaXMgdGVzdCB3aWxsIGZhaWwuCi0gICAgICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMCsxNFxbXlxuXF0qRElSMzJcW15cblxdKlxuIgotCQkJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjArMTRcW15cblxdKlBMQUJFTFxbXlxuXF0qZm9vXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMCB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICAgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0gICAgICAgICAgICB9Ci0JfSBlbHNlIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMCsxNFxbXlxuXF0qREFUQV9PTkVcW15cblxdKlxuIgotCQkJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjArMTRcW15cblxdKlBMQUJFTFxbXlxuXF0qZm9vXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMCB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICAgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fbG9jYWxfbGFiZWxfYXNfb3BlcmFuZF90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxhYmVsb3BidWcuczogVGVzdCBsb2NhbCBsYWJlbCBhcyBvcGVyYW5kIChub24tYnJhbmNoaW5nKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJsYWJlbG9wYnVnLnMiICIiICJMb2NhbCBsYWJlbCBhcyBvcGVyYW5kIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGFuZGxlIGRpZmZlcmVuY2Ugb2YgbG9jYWwgbGFibGVzIGFzIGFuIG9wZXJhbmQKLQkjIHRvIGEgbm9uLWJyYW5jaGluZyBpbnN0cnVjdGlvbiBjb3JyZWN0bHkuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wKzJjXFteXG5cXSoweDArMjRcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMCszMFxbXlxuXF0qMHgwKzI0XFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2V4aXRfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4aXRidWcuczogVGVzdCBmb3IgYm9ndXMgUl9FWElUIHJlbG9jYXRpb24gKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgIyBFbGYgKG9zZikgZG9lcyBub3QgdXNlIEVOVFJZL0VYSVQgcmVsb2NhdGlvbnMuCi0gICAgIyBJIGd1ZXNzIHdlIGNvdWxkIGxvb2sgYXQgdGhlIHVud2luZCBzdWJzcGFjZXMgaXQgYnVpbGRzLi4uCi0gICAgIyBVbnRpbCB0aGVuLCBtYWtlIHN1cmUgaXQgc3RpbGwgYXNzZW1ibGVzLgotICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQlnYXNfdGVzdF9vbGQgImV4aXRidWcucyIgIiIgIlRlc3QgZm9yIGJvZ3VzIFJfRVhJVCByZWxvY2F0aW9uIChwYXJ0IDEpIgotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJleGl0YnVnLnMiICIiICJUZXN0IGZvciBib2d1cyBSX0VYSVQgcmVsb2NhdGlvbiAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgTm90ZSB0aGF0IGEgbWF0Y2ggaGVyZSBpcyByZWFsbHkgYSBGQUlMVVJFIQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtcW15cblxdKlJfRVhJVFxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0wXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19jcm9zc19zcGFjZV9maXh1cF90ZXN0XzEge30gewotICAgIHNldCB0ZXN0bmFtZSAiZml4dXBidWcuczogVGVzdCBjcm9zcyBzcGFjZSBqdW1wL2NhbGwgZml4dXAgYnVnIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtpc3RhcmdldCBocHBhKnctKi0qXSB0aGVuIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZpeHVwYnVnLnMiICIiICJUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGEgZml4dXAvcmVsb2NhdGlvbiBmb3IgdGhlIGNyb3NzLXNwYWNlCi0JIyBicmFuY2gvY2FsbAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtcW15cblxdKlBDUkVMX0NBTExcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8yIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZpeHVwYnVnLnM6IFRlc3QgY3Jvc3Mgc3BhY2UganVtcC9jYWxsIGZpeHVwIGJ1ZyAocGFydCAzKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSp3LSotKl0gdGhlbiB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnYXNfc3RhcnQgImZpeHVwYnVnLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTgwMDAwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcm91bmRfbW9kZV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJvdW5kbW9kZS5zOiBUZXN0IHN3aXRjaGluZyBvZiByb3VuZGluZyBtb2RlcyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyb3VuZG1vZGUucyIgIiIgIlRlc3Qgc3dpdGNoIG9mIHJvdW5kaW5nIG1vZGVzKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGNvcnJlY3QgcmVsb2NhdGlvbnMgdG8gc3dpdGNoIHJvdW5kaW5nIG1vZGVzLgotCSMgQWxzbyBtYWtlIHN1cmUgKGZvciBTT00pIHRoYXQgcmVkdW5kYW50IHJvdW5kaW5nIG1vZGUgcmVsb2NhdGlvbnMKLQkjIHdlcmUgZWxpbWluYXRlZC4KLQlpZiB7IFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB8fCBbaXN0YXJnZXQgaHBwYSp3LSotKl0gfSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMCtcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzRcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCs4XFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCtjXFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArMTBcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzE0XFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArMThcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzFjXFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0gICAgICAgICAgICB9Ci0JfSBlbHNlIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMCtcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArNFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXjArOFxbXlxuXF0qUl9OX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCtjXFteXG5cXSpSX05fTU9ERVxbXlxuXF0qXG4iIAotCQkJeyBmYWlsICR0ZXN0bmFtZSB9Ci0JICAgICAgICAgICAgLXJlICJeMCsxMFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCsxNFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXjArMWNcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiB7W2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHx8IFtpc3RhcmdldCBocHBhKnctKi0qXSB9IHRoZW4gewotCSAgICBpZiBbZXhwciAkeD09OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQl9IGVsc2UgewotCSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQl9Ci0gICAgfQotfQotCi1wcm9jIGRvX2Z1bmN0aW9uX3JlbG9jX2J1ZyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmdW5jcmVsb2NidWcuczogVGVzdCBmb3IgcmVsb2MgYnVnIGluIG5vbi1wbGFiZWwgZnVuY3Rpb24gcmVmZXJlbmNlIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZ1bmNyZWxvY2J1Zy5zIiAiIiAiVGVzdCBmb3IgcmVsb2MgYnVnIGluIG5vbi1wbGFiZWwgZnVuY3Rpb24gcmVmZXJlbmNlIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGNvcnJlY3QgcmVsb2NhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZS4KLQkjIGJyYW5jaC9jYWxsCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wK2NjXFteXG5cXSpmMl9fXzRcW15cbitcXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXjArZDBcW15cblxdKmYyX19fNFxbXlxuK1xdKlxuIiAgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLQlzZXQgdGVzdG5hbWUgImZ1bmNyZWxvY2J1Zy5zOiBUZXN0IGZvciByZWxvYyBidWcgaW4gbm9uLXBsYWJlbCBmdW5jdGlvbiByZWZlcmVuY2UgKHBhcnQzKSIKLQlzZXQgeCAwCi0KLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCi0JIyBNYWtlIHN1cmUgd2UgZGlkbid0IHB1dCBhbnl0aGluZyBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmIQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtjY1xbXlxuXF0qbGRpbCAwLHIyMFxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIl4wK2QwXFteXG5cXSpsZG8gMFxbXChcXStyMjBcW1wpXF0rLHIxOVxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotCi19Ci0KLXByb2MgZG9fcl9ub19yZWxvYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyX25vX3JlbG9jLnM6IFRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiA0LWJ5dGUgUl9OT19SRUxDT0FUSU9OIGZpeHVwcyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyX25vX3JlbG9jLnMiICIiICJUZXN0IGZvciByZWxvYyBidWcgaW4gNC1ieXRlIFJfTk9fUkVMT0NBVElPTiBmaXh1cHMgKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGEgY29ycmVjdCByZWxvY2F0aW9uIGZvciB0aGUgcmVmZXJlbmNlLgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtjMDAwNFxbXlxuXF0qUExBQkVMXFteXG5dKmdcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIH0KLX0KLQotcHJvYyBkb19waWNfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInBpY3JlbG9jLnM6IFRlc3QgZm9yIHByb3BlciBQSUMgcmVsb2NhdGlvbiAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSp3LSotKl0gdGhlbiB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnYXNfc3RhcnQgInBpY3JlbG9jLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMDAwMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYXBwbHlfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhcHBseWJ1Zy5zOiBUZXN0IGZvciBwcm9wZXIgZml4dXAgYXBwbGlhdGlvbiAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGdhc19zdGFydCAiYXBwbHlidWcucyIgIi1hbCIKLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDAwMDAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDAwMDAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyBNYWtlIHN1cmUgd2UgcHV0IHRoZSByaWdodCByZWxvY2F0aW9uIGVudHJ5IG9uIGEgQkxFIGluc3RydWN0aW9uLgotICAgIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgTWFrZSBzdXJlIHJlbG9jYXRpb24gcmVkdWN0aW9ucyBhcmUgbm90IHRvbyBhZ3Jlc3NpdmUgYWJvdXQKLSAgICAjIGFkanVzdGluZyByZWxvY2F0aW9ucyBhZ2FpbnN0IHNvbWUgc3ltYm9scy4KLSAgICBkb19yZWxvY2F0aW9uX3JlZHVjdGlvbl90ZXN0cwotCi0gICAgIyBDaGVjayB0aGF0IG1vZGUgc2VsZWN0b3JzIG9uIGEgYmxlIGluc3RydWN0aW9uIGFjdHVhbGx5IHdvcmsuCi0gICAgZG9fYmxlX21vZGVfc2VsZWN0b3JfdGVzdAotCi0gICAgIyBDaGVjayB0aGF0IHdlIHRha2UgdGhlIC04IGFkanVzdG1lbnQgaW50byBhY2NvdW50IHdoZW4gemVyb2luZwotICAgICMgb3V0IHRoZSBkaXNwbGFjZW1lbnQgZmllbGQgaW4gYSBibGUgaW5zdHJ1Y3Rpb24gd2l0aCBhIHJlbG9jCi0gICAgZG9fYmxlX3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyAxLjM2IHNpbXBseSBkaWRuJ3QgZ2VuZXJhdGUgYWxsIHRoZSBwbGFiZWxzIGl0IHNob3VsZCBoYXZlLiAgTWFrZQotICAgICMgc3VyZSBnYXMtMiBkb2VzLgotICAgIGRvX3BsYWJlbF9yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgTWFrZSBzdXJlIGEgZmllbGQgc2VsZWN0b3Igb25seSBlZmZlY3RzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uCi0gICAgIyBvciBhc3NlbWJsZXIgZGlyZWN0aXZlLgotICAgIGRvX3NlbGVjdG9yX3Njb3BlX3Rlc3QKLQotICAgICMgVGhpcyBzaG91bGQgcmVhbGx5IGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gIEl0IHdvdWxkIG1ha2UgbGlmZSBtdWNoCi0gICAgIyBlYXNpZXIgb24gdGhlIG9wdGltaXppbmcgbGlua2VyLiAgVW50aWwgdGhlbiBqdXN0IG1ha2Ugc3VyZSB0aGUgCi0gICAgIyBkaWZmZXJlbmNlIGlzIGNvbXB1dGVkIGNvcnJlY3RseS4KLSAgICBkb19sb2NhbF9sYWJlbF9hc19vcGVyYW5kX3Rlc3QKLQotICAgICMgR0FTMiBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgUl9FWElUIHJlbG9jYXRpb25zIHdoZW4gLmV4aXQgZGlyZWN0aXZlcwotICAgICMgd2VyZSBub3QgaW4gdGhlIHNvdXJjZSBjb2RlLgotICAgIGRvX2V4aXRfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIEdBUzIgaW5jb3JyZWN0bHkgdGhvdWdodCBpdCBjb3VsZCBhcHBseSBhIGZpeHVwIGZvciBhIHBjLXJlbGF0aXZlCi0gICAgIyBicmFuY2gvY2FsbCB3aGljaCBjcm9zc2VkIGRpZmZlcmVudCBzdWJzcGFjZXMuCi0gICAgIyBBbHNvIGNoZWNrIHRoYXQgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBpcyBjb3JyZWN0Ci0gICAgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8xCi0gICAgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8yCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBzd2l0Y2ggcm91bmRpbmcgbW9kZXMgY29ycmVjdGx5Ci0gICAgZG9fcm91bmRfbW9kZV90ZXN0Ci0KLSAgICAjIFRlc3QgZm9yIGEgYnVnIGZvdW5kIHdoZW4gYSBmdW5jdGlvbiB3YXMgdXNlZCBpbiBhIG5vbi1icmFuY2hpbmcKLSAgICAjIGluc3RydWN0aW9uICp3aXRob3V0KiBhIHBsYWJlbCAoZm9yIHBvcnRhYmxlIHJ1bnRpbWUgbW9kZWwpCi0gICAgZG9fZnVuY3Rpb25fcmVsb2NfYnVnCi0KLSAgICAjIFRlc3QgZm9yIGFuIG9mZi1ieS1vbmUgYnVnIGluIHRoZSBoYW5kbGluZyBvZiA0LWJ5dGUgUl9OT19SRUxPQ0FUSU9OCi0gICAgIyBmaXh1cHMuCi0gICAgZG9fcl9ub19yZWxvYwotCi0gICAgIyBUZXN0IGEgcmVsb2NhdGlvbiBwcm9ibGVtIHdoaWNoIHNob3dzIHVwIHdoZW4gYnVpbGRpbmcgc2hhcmVkCi0gICAgIyBsaWJyYXJpZXMgaW4gU09NCi0gICAgZG9fcGljX3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyBUZXN0IGEgcHJvYmxlbSB3aXRoIG1kX2FwcGx5X2ZpeCB0aGF0IHdhcyBpbnRyb2R1Y2VkIHdoZW4gZml4aW5nCi0gICAgIyB0aGUgcGljIHJlbG9jYXRpb24gdGVzdC4KLSAgICBkb19hcHBseV90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSBnYXMgZG9lc24ndCByZXNvbHZlIGxvbmctY2FsbHMgd2hpY2ggYXJlIHRvIGJlIGZpeGVkCi0gICAgIyBieSB0aGUgbGlua2VyCi0gICAgZ2FzX3Rlc3QgImxvbmdjYWxsLnMiICIiICIiICJBdm9pZCByZXNvbHZpbmcgbG9uZy1jYWxscyIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY1MzczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLklNUE9SVCBmb28sZGF0YQotCi07IFN3aXRjaCBpbi9vdXQgb2YgZGlmZmVyZW50IHJvdW5kaW5nIG1vZGVzLgotOyBBbHNvIG1ha2Ugc3VyZSB3ZSAib3B0aW1pemUiIGF3YXkgdXNlbGVzcyByb3VuZGluZyBtb2RlIHJlbG9jYXRpb25zCi0JYWRkaWwgICBMUidmb28tMHgxMjM0NSwlcjI3Ci0JbGRvCVJSJ2Zvby0weDEyMzQ1KCVyMSksJXIxCi0JYWRkaWwgICBMJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYyNzgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGludFZlY19lcnJvcl9oYW5kbGVyLERBVEEKLQkuZGF0YQotCi1pbnRWZWNfZXJyb3JfaGFuZGxlcjoKLQkud29yZCBQJWRlZmF1bHRfaW50VmVjX2Vycm9yX2hhbmRsZXJfX0ZQQ2MKLQotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvbyxDT0RFCi0JLkVYUE9SVCBmb28sRU5UUlksUFJJVl9MRVY9MwotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAKLQkuRU5UUlkKLQkuc3RhYmQgNjgsMCw0MQotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQyNDA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuYmxvY2t6IDQKLQotbWFpbjoKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MAotCS5FTlRSWQotCW5vcAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduNC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjJmOTliLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkuc3BhY2UgJFRFWFQkCi0JLnN1YnNwYSAkWUFCQkEkCi0JLnN1YnNwYSAkTUlMTElDT0RFJAotCS5hbGlnbiA2NApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIwY2MzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcucworKysgL2Rldi9udWxsCkBAIC0xLDM0ODggKzAsMCBAQAotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5kYXRhCi0KLQkuYWxpZ24gNAotZG9uZV9fXzIKLQkud29yZCAwCi0JLklNUE9SVCBtZW1zZXQsQ09ERQotCS5FWFBPUlQgcmVfc3ludGF4X29wdGlvbnMsREFUQQotCS5hbGlnbiA0Ci1yZV9zeW50YXhfb3B0aW9ucwotCS53b3JkIDAKLQotCS5hbGlnbiA0Ci1yZV9lcnJvcl9tc2cKLQkud29yZCAwCi0JLndvcmQgTCRDMDAwMAotCS53b3JkIEwkQzAwMDEKLQkud29yZCBMJEMwMDAyCi0JLndvcmQgTCRDMDAwMwotCS53b3JkIEwkQzAwMDQKLQkud29yZCBMJEMwMDA1Ci0JLndvcmQgTCRDMDAwNgotCS53b3JkIEwkQzAwMDcKLQkud29yZCBMJEMwMDA4Ci0JLndvcmQgTCRDMDAwOQotCS53b3JkIEwkQzAwMTAKLQkud29yZCBMJEMwMDExCi0JLndvcmQgTCRDMDAxMgotCS53b3JkIEwkQzAwMTMKLQkud29yZCBMJEMwMDE0Ci0JLndvcmQgTCRDMDAxNQotCS5jb2RlCi0KLQkuYWxpZ24gNAotTCRDMDAxNQotCS5TVFJJTkcgIlVubWF0Y2hlZCApIG9yIFxcKVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTQKLQkuU1RSSU5HICJSZWd1bGFyIGV4cHJlc3Npb24gdG9vIGJpZ1x4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTMKLQkuU1RSSU5HICJQcmVtYXR1cmUgZW5kIG9mIHJlZ3VsYXIgZXhwcmVzc2lvblx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTIKLQkuU1RSSU5HICJJbnZhbGlkIHByZWNlZGluZyByZWd1bGFyIGV4cHJlc3Npb25ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDExCi0JLlNUUklORyAiTWVtb3J5IGV4aGF1c3RlZFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTAKLQkuU1RSSU5HICJJbnZhbGlkIHJhbmdlIGVuZFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDkKLQkuU1RSSU5HICJJbnZhbGlkIGNvbnRlbnQgb2YgXFx7XFx9XHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwOAotCS5TVFJJTkcgIlVubWF0Y2hlZCBcXHtceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA3Ci0JLlNUUklORyAiVW5tYXRjaGVkICggb3IgXFwoXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwNgotCS5TVFJJTkcgIlVubWF0Y2hlZCBbIG9yIFteXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwNQotCS5TVFJJTkcgIkludmFsaWQgYmFjayByZWZlcmVuY2VceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA0Ci0JLlNUUklORyAiVHJhaWxpbmcgYmFja3NsYXNoXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwMwotCS5TVFJJTkcgIkludmFsaWQgY2hhcmFjdGVyIGNsYXNzIG5hbWVceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDAyCi0JLlNUUklORyAiSW52YWxpZCBjb2xsYXRpb24gY2hhcmFjdGVyXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwMQotCS5TVFJJTkcgIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwMAotCS5TVFJJTkcgIk5vIG1hdGNoXHgwMCIKLQkuRVhQT1JUIHJlX21heF9mYWlsdXJlcyxEQVRBCi0JLmRhdGEKLQotCS5hbGlnbiA0Ci1yZV9tYXhfZmFpbHVyZXMKLQkud29yZCAyMDAwCi0JLklNUE9SVCBtYWxsb2MsQ09ERQotCS5JTVBPUlQgcmVhbGxvYyxDT0RFCi0JLklNUE9SVCBmcmVlLENPREUKLQkuSU1QT1JUIHN0cmNtcCxDT0RFCi0JLmNvZGUKLQotCS5hbGlnbiA0Ci1MJEMwMDE2Ci0JLlNUUklORyAiYWxudW1ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE3Ci0JLlNUUklORyAiYWxwaGFceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE4Ci0JLlNUUklORyAiYmxhbmtceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE5Ci0JLlNUUklORyAiY250cmxceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIwCi0JLlNUUklORyAiZGlnaXRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIxCi0JLlNUUklORyAiZ3JhcGhceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIyCi0JLlNUUklORyAibG93ZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIzCi0JLlNUUklORyAicHJpbnRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI0Ci0JLlNUUklORyAicHVuY3RceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI1Ci0JLlNUUklORyAic3BhY2VceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI2Ci0JLlNUUklORyAidXBwZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI3Ci0JLlNUUklORyAieGRpZ2l0XHgwMCIKLQkuSU1QT1JUIF9fYWxudW0sREFUQQotCS5JTVBPUlQgX19jdHlwZTIsREFUQQotCS5JTVBPUlQgX19jdHlwZSxEQVRBCi0JLklNUE9SVCBhdF9iZWdsaW5lX2xvY19wLENPREUKLQkuSU1QT1JUIGF0X2VuZGxpbmVfbG9jX3AsQ09ERQotCS5JTVBPUlQgc3RvcmVfb3AxLENPREUKLQkuSU1QT1JUIGluc2VydF9vcDEsQ09ERQotCS5JTVBPUlQgc3RvcmVfb3AyLENPREUKLQkuSU1QT1JUIGluc2VydF9vcDIsQ09ERQotCS5JTVBPUlQgY29tcGlsZV9yYW5nZSxDT0RFCi0JLklNUE9SVCBncm91cF9pbl9jb21waWxlX3N0YWNrLENPREUKLQkuY29kZQotCi0JLmFsaWduIDQKLXJlZ2V4X2NvbXBpbGUKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0zMjAsQ0FMTFMsU0FWRV9SUCxFTlRSWV9HUj0xOAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApIDsjIDg5ODkgcmVsb2FkX291dHNpKzIvNgotCWxkbyAzMjAoJXIzMCksJXIzMCA7IyA4OTkxIGFkZHNpMy8yCi0Jc3R3ICVyMTgsLTE2OCglcjMwKSA7IyA4OTkzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNywtMTY0KCVyMzApIDsjIDg5OTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjE2LC0xNjAoJXIzMCkgOyMgODk5NyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTUsLTE1NiglcjMwKSA7IyA4OTk5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNCwtMTUyKCVyMzApIDsjIDkwMDEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEzLC0xNDgoJXIzMCkgOyMgOTAwMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTIsLTE0NCglcjMwKSA7IyA5MDA1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMSwtMTQwKCVyMzApIDsjIDkwMDcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEwLC0xMzYoJXIzMCkgOyMgOTAwOSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyOSwtMTMyKCVyMzApIDsjIDkwMTEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjgsLTEyOCglcjMwKSA7IyA5MDEzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LC0xMjQoJXIzMCkgOyMgOTAxNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNiwtMTIwKCVyMzApIDsjIDkwMTcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjUsLTExNiglcjMwKSA7IyA5MDE5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LC0xMTIoJXIzMCkgOyMgOTAyMSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMywtMTA4KCVyMzApIDsjIDkwMjMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjI2LC0yNzYoJXIzMCkgOyMgNCByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDAsJXI5IDsjIDI1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMCwlcjggOyMgMjggcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjAsLTI2MCglcjMwKSA7IyAzNCByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDAsJXIxMCA7IyAzMSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDY0MCwlcjI2IDsjIDM3IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODc3NCByZWxvYWRfb3V0c2krMi81Ci0JY29weSAlcjI0LCVyMTUgOyMgOCByZWxvYWRfb3V0c2krMi8xCi0Jc3R3ICVyMSwtMjk2KCVyMzApIDsjIDIzMjUgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIyMywlcjUgOyMgMTAgcmVsb2FkX291dHNpKzIvMQotCWFkZGwgJXIxLCVyMjUsJXIxNiA7IyAxOSBhZGRzaTMvMQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbWFsbG9jLCVyMiA7IyAzOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyAyMCglcjUpLCVyMTQgOyMgMjIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+IDAsJXIyOCxMJDAwMjEgOyMgNDggYmxldSsxCi0Jc3R3ICVyMjgsLTMxMiglcjMwKSA7IyA0MyByZWxvYWRfb3V0c2krMi82Ci1MJDA5NTMKLQlibCBMJDA4NjcsJXIwIDsjIDUzIGp1bXAKLQlsZGkgMTIsJXIyOCA7IyA1MSByZWxvYWRfb3V0c2krMi8yCi1MJDAwMjEKLQlsZGkgMzIsJXIxOSA7IyA1OCByZWxvYWRfb3V0c2krMi8yCi0Jc3R3ICVyMTksLTMwOCglcjMwKSA7IyA1OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCwtMzA0KCVyMzApIDsjIDYyIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNSwxMiglcjUpIDsjIDY1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIwLDgoJXI1KSA7IyA4NSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCwyNCglcjUpIDsjIDg4IHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRpbCBMUidkb25lX19fMi0kZ2xvYmFsJCwlcjI3IDsjIDkyIHBpYzJfbG9fc3VtKzEKLQlsZHcgMjgoJXI1KSwlcjE5IDsjIDY4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgUlInZG9uZV9fXzItJGdsb2JhbCQoJXIxKSwlcjIwIDsjIDk0IHJlbG9hZF9vdXRzaSsyLzUKLQlkZXBpIDAsMywxLCVyMTkgOyMgNjkgYW5kc2kzLzIKLQlkZXBpIDAsNiwyLCVyMTkgOyMgODAgYW5kc2kzLzIKLQljb21pYiw8PiAwLCVyMjAsTCQwMDIyIDsjIDk1IGJsZXUrMQotCXN0dyAlcjE5LDI4KCVyNSkgOyMgODIgcmVsb2FkX291dHNpKzIvNgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCwlcjI3IDsjIDk5IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKCVyMSksJXI0IDsjIDEwMCBtb3ZoaS0yCi0JY29weSAlcjQsJXIyNiA7IyAxMDEgcmVsb2FkX291dHNpKzIvMQotCWxkaSAwLCVyMjUgOyMgMTAyIHJlbG9hZF9vdXRzaSsyLzIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIgOyMgMTA0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDI1NiwlcjI0IDsjIDEwMyByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEsJXIyMCA7IyA4NzMyIG1vdnFpKzEvMgotCWxkbyA5NyglcjQpLCVyMTkgOyMgODczNiBhZGRzaTMvMgotCWxkbyAxMjIoJXI0KSwlcjQgOyMgODczOCBhZGRzaTMvMgotCXN0YnMsbWEgJXIyMCwxKCVyMTkpIDsjIDExNSBtb3ZxaSsxLzYKLUwkMTE1NQotCWNvbWIsPj0sbiAlcjQsJXIxOSxMJDExNTUgOyMgMTIxIGJsZXUrMQotCXN0YnMsbWEgJXIyMCwxKCVyMTkpIDsjIDExNSBtb3ZxaSsxLzYKLQlsZGkgMSwlcjIxIDsjIDg3MTcgbW92cWkrMS8yCi0JYWRkaWwgTFIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkLCVyMjcgOyMgODcxMiBwaWMyX2xvX3N1bSsxCi0JbGRvIFJSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCglcjEpLCVyMTkgOyMgODcxNSBtb3ZoaS0yCi0JbGRvIDY1KCVyMTkpLCVyMjAgOyMgODcyMSBhZGRzaTMvMgotCWxkbyA5MCglcjE5KSwlcjE5IDsjIDg3MjMgYWRkc2kzLzIKLQlzdGJzLG1hICVyMjEsMSglcjIwKSA7IyAxMzggbW92cWkrMS82Ci1MJDExNTYKLQljb21iLD49LG4gJXIxOSwlcjIwLEwkMTE1NiA7IyAxNDQgYmxldSsxCi0Jc3RicyxtYSAlcjIxLDEoJXIyMCkgOyMgMTM4IG1vdnFpKzEvNgotCWxkaSA0OCwlcjIwIDsjIDE1MSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDU3LCVyMjIgOyMgNzk3NiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEsJXIyMSA7IyA4NzA3IG1vdnFpKzEvMgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCs0OCwlcjI3IDsjIDg3MDUgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQrNDgoJXIxKSwlcjE5IDsjIDg3MTEgbW92aGktMgotTCQwMDM3Ci0JbGRvIDEoJXIyMCksJXIyMCA7IyAxNjQgYWRkc2kzLzIKLQljb21iLD49ICVyMjIsJXIyMCxMJDAwMzcgOyMgMTY3IGJsZXUrMQotCXN0YnMsbWEgJXIyMSwxKCVyMTkpIDsjIDE2MSBtb3ZxaSsxLzYKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQsJXIyNyA7IyAxNzQgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQoJXIxKSwlcjE5IDsjIDE3NSBtb3ZoaS0yCi0JbGRpIDEsJXIyMCA7IyAxNzYgbW92cWkrMS8yCi0Jc3RiICVyMjAsOTUoJXIxOSkgOyMgMTc3IG1vdnFpKzEvNgotCWFkZGlsIExSJ2RvbmVfX18yLSRnbG9iYWwkLCVyMjcgOyMgMTc4IHBpYzJfbG9fc3VtKzEKLQlsZGkgMSwlcjE5IDsjIDE4MCByZWxvYWRfb3V0c2krMi8yCi0Jc3R3ICVyMTksUlInZG9uZV9fXzItJGdsb2JhbCQoJXIxKSA7IyAxODEgcmVsb2FkX291dHNpKzIvNgotTCQwMDIyCi0JbGR3IDQoJXI1KSwlcjE5IDsjIDE4NyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwMDM5IDsjIDE4OSBibGV1KzEKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTkzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9LG4gMCwlcjI2LEwkMDA0MCA7IyAxOTUgYmxldSsxCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAyMDUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNSA7IyAyMDMgcmVsb2FkX291dHNpKzIvMgotCWJsIEwkMTE1NywlcjAgOyMgMjExIGp1bXAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMjIzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDA0MAotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbWFsbG9jLCVyMiA7IyAyMTkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNiA7IyAyMTcgcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjI4LDAoJXI1KSA7IyAyMjMgcmVsb2FkX291dHNpKzIvNgotTCQxMTU3Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDIyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4gMCwlcjE5LEwkMDA0MiA7IyAyMzAgYmxldSsxCi0JbGRpIDMyLCVyMTkgOyMgMjQzIHJlbG9hZF9vdXRzaSsyLzIKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDIzNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMjMyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDIzOCBqdW1wCi0JbGRpIDEyLCVyMjggOyMgNTEgcmVsb2FkX291dHNpKzIvMgotTCQwMDQyCi0Jc3R3ICVyMTksNCglcjUpIDsjIDI0NCByZWxvYWRfb3V0c2krMi82Ci1MJDAwMzkKLQlsZHcgMCglcjUpLCVyNiA7IyAyNDkgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgNzk4MSByZWxvYWRfb3V0c2krMi81Ci0JY29tY2xyLDw+ICVyMTYsJXIxOSwlcjAgOyMgNzk4MiBibGV1KzEKLQlibCBMJDAwNDQsJXIwCi0JY29weSAlcjYsJXIxMiA7IyAyNTMgcmVsb2FkX291dHNpKzIvMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMzNCByZWxvYWRfb3V0c2krMi81Ci1MJDExNzgKLQlsZGJzLG1hIDEoJXIxOSksJXI3IDsjIDI3NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAwNDcgOyMgMjgyIGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjMzNyByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDI4MyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyODYgemVyb19leHRlbmRxaXNpMi8yCi1MJDAwNDcKLQlsZG8gLTEwKCVyNyksJXIxOSA7IyA3ODk1IGFkZHNpMy8yCi0JYWRkaSx1diAtMTE1LCVyMTksJXIwIDsjIDc4OTYgY2FzZXNpMAotCWJscixuICVyMTksJXIwCi0JYixuIEwkMDA3NgotTCQwODYzCi0JYmwgTCQwMzc2LCVyMAotCW5vcCA7IyA5MDkyIHN3aXRjaF9qdW1wCi1MJDA5NTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkwOTUgc3dpdGNoX2p1bXAKLUwkMDk1NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTA5OCBzd2l0Y2hfanVtcAotTCQwOTU2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTAxIHN3aXRjaF9qdW1wCi1MJDA5NTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMDQgc3dpdGNoX2p1bXAKLUwkMDk1OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEwNyBzd2l0Y2hfanVtcAotTCQwOTU5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTEwIHN3aXRjaF9qdW1wCi1MJDA5NjAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMTMgc3dpdGNoX2p1bXAKLUwkMDk2MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExNiBzd2l0Y2hfanVtcAotTCQwOTYyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTE5IHN3aXRjaF9qdW1wCi1MJDA5NjMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMjIgc3dpdGNoX2p1bXAKLUwkMDk2NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEyNSBzd2l0Y2hfanVtcAotTCQwOTY1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTI4IHN3aXRjaF9qdW1wCi1MJDA5NjYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMzEgc3dpdGNoX2p1bXAKLUwkMDk2NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEzNCBzd2l0Y2hfanVtcAotTCQwOTY4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTM3IHN3aXRjaF9qdW1wCi1MJDA5NjkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDAgc3dpdGNoX2p1bXAKLUwkMDk3MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE0MyBzd2l0Y2hfanVtcAotTCQwOTcxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQ2IHN3aXRjaF9qdW1wCi1MJDA5NzIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDkgc3dpdGNoX2p1bXAKLUwkMDk3MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE1MiBzd2l0Y2hfanVtcAotTCQwOTc0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTU1IHN3aXRjaF9qdW1wCi1MJDA5NzUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNTggc3dpdGNoX2p1bXAKLUwkMDk3NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE2MSBzd2l0Y2hfanVtcAotTCQwOTc3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTY0IHN3aXRjaF9qdW1wCi1MJDA5NzgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNjcgc3dpdGNoX2p1bXAKLUwkMDk3OQotCWJsIEwkMDA3NywlcjAgOyMgOTE3MCBzd2l0Y2hfanVtcAotCWxkdyAtMjk2KCVyMzApLCVyMjYgOyMgMjM0OSByZWxvYWRfb3V0c2krMi81Ci1MJDA5ODAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNzMgc3dpdGNoX2p1bXAKLUwkMDk4MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE3NiBzd2l0Y2hfanVtcAotTCQwOTgyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTc5IHN3aXRjaF9qdW1wCi1MJDA5ODMKLQlibCBMJDAzNjgsJXIwCi0Jbm9wIDsjIDkxODIgc3dpdGNoX2p1bXAKLUwkMDk4NAotCWJsIEwkMDM3MiwlcjAKLQlub3AgOyMgOTE4NSBzd2l0Y2hfanVtcAotTCQwOTg1Ci0JYmwgTCQwMTA0LCVyMAotCW5vcCA7IyA5MTg4IHN3aXRjaF9qdW1wCi1MJDA5ODYKLQlibCBMJDExNTgsJXIwIDsjIDkxOTEgc3dpdGNoX2p1bXAKLQlsZGkgMTAyNiwlcjE5IDsjIDY2MiByZWxvYWRfb3V0c2krMi8yCi1MJDA5ODcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxOTQgc3dpdGNoX2p1bXAKLUwkMDk4OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE5NyBzd2l0Y2hfanVtcAotTCQwOTg5Ci0JYmwgTCQwMTk2LCVyMCA7IyA5MjAwIHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODAyNyByZWxvYWRfb3V0c2krMi81Ci1MJDA5OTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMDMgc3dpdGNoX2p1bXAKLUwkMDk5MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIwNiBzd2l0Y2hfanVtcAotTCQwOTkyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjA5IHN3aXRjaF9qdW1wCi1MJDA5OTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMTIgc3dpdGNoX2p1bXAKLUwkMDk5NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIxNSBzd2l0Y2hfanVtcAotTCQwOTk1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjE4IHN3aXRjaF9qdW1wCi1MJDA5OTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMjEgc3dpdGNoX2p1bXAKLUwkMDk5NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIyNCBzd2l0Y2hfanVtcAotTCQwOTk4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjI3IHN3aXRjaF9qdW1wCi1MJDA5OTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzAgc3dpdGNoX2p1bXAKLUwkMTAwMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIzMyBzd2l0Y2hfanVtcAotTCQxMDAxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjM2IHN3aXRjaF9qdW1wCi1MJDEwMDIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzkgc3dpdGNoX2p1bXAKLUwkMTAwMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI0MiBzd2l0Y2hfanVtcAotTCQxMDA0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjQ1IHN3aXRjaF9qdW1wCi1MJDEwMDUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNDggc3dpdGNoX2p1bXAKLUwkMTAwNgotCWJsIEwkMDEwMSwlcjAgOyMgOTI1MSBzd2l0Y2hfanVtcAotCWxkaSAxMDI2LCVyMTkgOyMgNjYyIHJlbG9hZF9vdXRzaSsyLzIKLUwkMTAwNwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI1NCBzd2l0Y2hfanVtcAotTCQxMDA4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjU3IHN3aXRjaF9qdW1wCi1MJDEwMDkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjAgc3dpdGNoX2p1bXAKLUwkMTAxMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI2MyBzd2l0Y2hfanVtcAotTCQxMDExCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjY2IHN3aXRjaF9qdW1wCi1MJDEwMTIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjkgc3dpdGNoX2p1bXAKLUwkMTAxMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI3MiBzd2l0Y2hfanVtcAotTCQxMDE0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjc1IHN3aXRjaF9qdW1wCi1MJDEwMTUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNzggc3dpdGNoX2p1bXAKLUwkMTAxNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI4MSBzd2l0Y2hfanVtcAotTCQxMDE3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjg0IHN3aXRjaF9qdW1wCi1MJDEwMTgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyODcgc3dpdGNoX2p1bXAKLUwkMTAxOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5MCBzd2l0Y2hfanVtcAotTCQxMDIwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjkzIHN3aXRjaF9qdW1wCi1MJDEwMjEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTYgc3dpdGNoX2p1bXAKLUwkMTAyMgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5OSBzd2l0Y2hfanVtcAotTCQxMDIzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzAyIHN3aXRjaF9qdW1wCi1MJDEwMjQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMDUgc3dpdGNoX2p1bXAKLUwkMTAyNQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMwOCBzd2l0Y2hfanVtcAotTCQxMDI2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzExIHN3aXRjaF9qdW1wCi1MJDEwMjcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMTQgc3dpdGNoX2p1bXAKLUwkMTAyOAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMxNyBzd2l0Y2hfanVtcAotTCQxMDI5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzIwIHN3aXRjaF9qdW1wCi1MJDEwMzAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMjMgc3dpdGNoX2p1bXAKLUwkMTAzMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyNiBzd2l0Y2hfanVtcAotTCQxMDMyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzI5IHN3aXRjaF9qdW1wCi1MJDEwMzMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMzIgc3dpdGNoX2p1bXAKLUwkMTAzNAotCWJsIEwkMDIxNiwlcjAgOyMgOTMzNSBzd2l0Y2hfanVtcAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQxOCByZWxvYWRfb3V0c2krMi81Ci1MJDEwMzUKLQlibCBMJDAzODcsJXIwIDsjIDkzMzggc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDM3OTcgcmVsb2FkX291dHNpKzIvNQotTCQxMDM2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzQxIHN3aXRjaF9qdW1wCi1MJDEwMzcKLQlibCBMJDAwNTMsJXIwIDsjIDkzNDQgc3dpdGNoX2p1bXAKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODc3NyByZWxvYWRfb3V0c2krMi81Ci1MJDEwMzgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNDcgc3dpdGNoX2p1bXAKLUwkMTAzOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1MCBzd2l0Y2hfanVtcAotTCQxMDQwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzUzIHN3aXRjaF9qdW1wCi1MJDEwNDEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTYgc3dpdGNoX2p1bXAKLUwkMTA0MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1OSBzd2l0Y2hfanVtcAotTCQxMDQzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzYyIHN3aXRjaF9qdW1wCi1MJDEwNDQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNjUgc3dpdGNoX2p1bXAKLUwkMTA0NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM2OCBzd2l0Y2hfanVtcAotTCQxMDQ2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzcxIHN3aXRjaF9qdW1wCi1MJDEwNDcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNzQgc3dpdGNoX2p1bXAKLUwkMTA0OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM3NyBzd2l0Y2hfanVtcAotTCQxMDQ5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzgwIHN3aXRjaF9qdW1wCi1MJDEwNTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzODMgc3dpdGNoX2p1bXAKLUwkMTA1MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4NiBzd2l0Y2hfanVtcAotTCQxMDUyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzg5IHN3aXRjaF9qdW1wCi1MJDEwNTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzOTIgc3dpdGNoX2p1bXAKLUwkMTA1NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM5NSBzd2l0Y2hfanVtcAotTCQxMDU1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzk4IHN3aXRjaF9qdW1wCi1MJDEwNTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MDEgc3dpdGNoX2p1bXAKLUwkMTA1NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQwNCBzd2l0Y2hfanVtcAotTCQxMDU4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDA3IHN3aXRjaF9qdW1wCi1MJDEwNTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTAgc3dpdGNoX2p1bXAKLUwkMTA2MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQxMyBzd2l0Y2hfanVtcAotTCQxMDYxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDE2IHN3aXRjaF9qdW1wCi1MJDEwNjIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTkgc3dpdGNoX2p1bXAKLUwkMTA2MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQyMiBzd2l0Y2hfanVtcAotTCQxMDY0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDI1IHN3aXRjaF9qdW1wCi1MJDEwNjUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0Mjggc3dpdGNoX2p1bXAKLUwkMTA2NgotCWJsIEwkMDM4MywlcjAgOyMgOTQzMSBzd2l0Y2hfanVtcAotCWxkaSA0NjA4LCVyMjAgOyMgMzc3OCByZWxvYWRfb3V0c2krMi8yCi1MJDEwNjcKLQlibCBMJDAzODAsJXIwCi0Jbm9wIDsjIDk0MzQgc3dpdGNoX2p1bXAKLUwkMTA2OAotCWJsLG4gTCQwMDc2LCVyMCA7IyA3ODk5IGp1bXAKLUwkMDA1MwotCWxkdyAtMjk2KCVyMzApLCVyMjUgOyMgMjM0MyByZWxvYWRfb3V0c2krMi81Ci0JbGRvIDEoJXIxKSwlcjE5IDsjIDMwNiBhZGRzaTMvMgotCWNvbWIsPSxuICVyMTksJXIyNSxMJDAwNTUgOyMgMzA4IGJsZXUrMQotCWJiLDwgJXIxNSwyOCxMJDAwNTUgOyMgMzEzIGJsZXUrMwotCWxkdyAtMjc2KCVyMzApLCVyMjYgOyMgMzE1IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGF0X2JlZ2xpbmVfbG9jX3AsJXIyIDsjIDMyMSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxNSwlcjI0IDsjIDMxOSByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgMzI0IGV4dGVuZHFpc2kyCi0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDMyNiBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDA1NQotCWxkdyAwKCVyNSksJXI0IDsjIDc5ODYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3OTg5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc5ODcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc5ODggYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAwNjAgOyMgNzk5MCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg3MDEgcmVsb2FkX291dHNpKzIvMwotTCQwMDYxCi0JY29tY2xyLDw+ICVyMywlcjIwLCVyMCA7IyAzNTcgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDM2NyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAwNjYgOyMgMzc1IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAzNjkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDM3OCByZWxvYWRfb3V0c2krMi82Ci1MJDAwNjYKLQlsZHcgMCglcjUpLCVyMjYgOyMgMzg1IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDM4OSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAzODcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAzOTcgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDM5MyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDA1OSA7IyA0MDcgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0MDkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDEyIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDEzIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMDY5IDsjIDQxOCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQxNiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQxOSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDIyIGFkZHNpMy8xCi1MJDAwNjkKLQljb21pYiw9IDAsJXI4LEwkMDA3MCA7IyA0MjUgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MjYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDI5IGFkZHNpMy8xCi1MJDAwNzAKLQljb21pYiw9IDAsJXI5LEwkMDA1OSA7IyA0MzIgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MzMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDM2IGFkZHNpMy8xCi1MJDAwNTkKLQlsZHcgMCglcjUpLCVyNCA7IyAzMzcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAzNDEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMzM4IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzMzkgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAwNjEKLQlub3AgOyMgMzQzIGJsZXUrMQotTCQwMDYwCi0JbGRpIDgsJXIxOSA7IyA0NTggbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA0NzkganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDU5IG1vdnFpKzEvNgotTCQwMDc3Ci0JY29tYiw9LG4gJXIxNiwlcjI2LEwkMDA3OSA7IyA0ODUgYmxldSsxCi0JYmIsPCAlcjE1LDI4LEwkMDA3OSA7IyA0OTAgYmxldSszCi0JY29weSAlcjE2LCVyMjUgOyMgNDk0IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGF0X2VuZGxpbmVfbG9jX3AsJXIyIDsjIDQ5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxNSwlcjI0IDsjIDQ5NiByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgNTAxIGV4dGVuZHFpc2kyCi0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDUwMyBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDA3OQotCWxkdyAwKCVyNSksJXI0IDsjIDc5OTQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3OTk3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc5OTUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc5OTYgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAwODQgOyMgNzk5OCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2OTkgcmVsb2FkX291dHNpKzIvMwotTCQwMDg1Ci0JY29tY2xyLDw+ICVyMywlcjIwLCVyMCA7IyA1MzQgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDU0NCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAwOTAgOyMgNTUyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NDYgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDU1NSByZWxvYWRfb3V0c2krMi82Ci1MJDAwOTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNTYyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU2NiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA1NjQgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA1NzQgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU3MCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDA4MyA7IyA1ODQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA1ODYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTg5IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNTkwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMDkzIDsjIDU5NSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU5MyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDU5NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNTk5IGFkZHNpMy8xCi1MJDAwOTMKLQljb21pYiw9IDAsJXI4LEwkMDA5NCA7IyA2MDIgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2MDMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjA2IGFkZHNpMy8xCi1MJDAwOTQKLQljb21pYiw9IDAsJXI5LEwkMDA4MyA7IyA2MDkgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2MTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjEzIGFkZHNpMy8xCi1MJDAwODMKLQlsZHcgMCglcjUpLCVyNCA7IyA1MTQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA1MTggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNTE1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA1MTYgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAwODUKLQlub3AgOyMgNTIwIGJsZXUrMQotTCQwMDg0Ci0JbGRpIDksJXIxOSA7IyA2MzUgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NTYganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjM2IG1vdnFpKzEvNgotTCQwODc3Ci0JYmwgTCQwMTEwLCVyMCA7IyA4OTcganVtcAotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgMjM5MSByZWxvYWRfb3V0c2krMi82Ci1MJDAxMDEKLUwkMTE1OAotCWFuZCAlcjE1LCVyMTksJXIxOSA7IyA2NjMgYW5kc2kzLzEKLQljb21pY2xyLD0gMCwlcjE5LCVyMCA7IyA2NjUgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAxMDQKLQljb21pYiw8PiAwLCVyOCxMJDAxMDUgOyMgNjc0IGJsZXUrMQotCWxkaSAwLCVyMTMgOyMgNzExIHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyw+PSAlcjE1LDI2LDEsJXIwIDsjIDY4MSBibGV1KzMKLQlleHRycyw8ICVyMTUsMjcsMSwlcjAgOyMgNzAwIG1vdnNpLTQKLQlub3AKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDEwNQotCWxkaSAwLCVyMTEgOyMgNzE0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMCwlcjIyIDsjIDcxNiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDQzLCVyMjQgOyMgODY4OCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDYzLCVyMjMgOyMgODY5MCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDQyLCVyMjggOyMgODY5MiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDIsJXIxOSA7IyA4Njk0IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjE5LCVyMjUgOyMgODY5NSBhbmRzaTMvMQotCWxkaSA5MiwlcjI2IDsjIDg2OTcgcmVsb2FkX291dHNpKzIvMgotTCQwMTA5Ci0JY29tYiw9ICVyMjQsJXI3LEwkMDExMiA7IyA3MjcgYmxldSsxCi0JY29weSAlcjExLCVyMTkgOyMgODc4MCByZWxvYWRfb3V0c2krMi8xCi0JZGVwaSAtMSwzMSwxLCVyMTkgOyMgNzI5IGlvcnNpMysxLzIKLQlibCBMJDAxMTMsJXIwIDsjIDczMSBqdW1wCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzMwIGV4dGVuZHFpc2kyCi1MJDAxMTIKLQlleHRycyAlcjExLDMxLDgsJXIxOSA7IyA3MzQgZXh0ZW5kcWlzaTIKLUwkMDExMwotTCQxMTU5Ci0JY29tYiw9ICVyMjMsJXI3LEwkMDExNCA7IyA3NDQgYmxldSsxCi0JY29weSAlcjE5LCVyMTEgOyMgNzM3IHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMjIsJXIxOSA7IyA4NzgzIHJlbG9hZF9vdXRzaSsyLzEKLQlkZXBpIC0xLDMxLDEsJXIxOSA7IyA3NDYgaW9yc2kzKzEvMgotCWJsIEwkMDExNSwlcjAgOyMgNzQ4IGp1bXAKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NDcgZXh0ZW5kcWlzaTIKLUwkMDExNAotCWV4dHJzICVyMjIsMzEsOCwlcjE5IDsjIDc1MSBleHRlbmRxaXNpMgotTCQwMTE1Ci0JbGR3IC0yOTYoJXIzMCksJXIyMSA7IyAyMzU1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIxLEwkMDExMCA7IyA3NTcgYmxldSsxCi0JY29weSAlcjE5LCVyMjIgOyMgNzU0IHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMjEsJXIyMCA7IyA4NzQzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGJzLG1hIDEoJXIyMCksJXI3IDsjIDc3NiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAxMTggOyMgNzgxIGJsZXUrMQotCXN0dyAlcjIwLC0yOTYoJXIzMCkgOyMgMjM2NCByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDc4MiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA3ODUgemVyb19leHRlbmRxaXNpMi8yCi1MJDAxMTgKLQljb21iLD0gJXIyOCwlcjcsTCQwMTA5Ci0Jbm9wIDsjIDgwMiBibGV1KzEKLQljb21pYiw8PixuIDAsJXIyNSxMJDA4NjkgOyMgODA3IGJsZXUrMQotCWNvbWIsPSAlcjI0LCVyNyxMJDExNTkgOyMgODExIGJsZXUrMQotCWV4dHJzICVyMTEsMzEsOCwlcjE5IDsjIDczNCBleHRlbmRxaXNpMgotCWNvbWIsPSAlcjIzLCVyNyxMJDAxMDkgOyMgODE1IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMCByZWxvYWRfb3V0c2krMi81Ci0JYmwsbiBMJDExNjAsJXIwIDsjIDgyNyBqdW1wCi1MJDA4NjkKLQljb21iLDw+ICVyMjYsJXI3LEwkMDEyNiA7IyA4MzEgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDAwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21jbHIsPD4gJXIxNiwlcjIwLCVyMCA7IyA4MzUgYmxldSsxCi0JYmwgTCQwOTAzLCVyMAotCWxkbyAxKCVyMjApLCVyMTkgOyMgODYzIGFkZHNpMy8yCi0JbGRiIDEoJXIyMSksJXIzIDsjIDg2MCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAxMjkgOyMgODY1IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjM3OSByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyMywlcjE5IDsjIDg2NiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMyA7IyA4NjkgemVyb19leHRlbmRxaXNpMi8yCi1MJDAxMjkKLQljb21iLD0gJXIyNCwlcjMsTCQwMTA5IDsjIDg4NiBibGV1KzEKLQljb3B5ICVyMywlcjcgOyMgOTAzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21iLDw+ICVyMjMsJXIzLEwkMDg3NwotCW5vcCA7IyA4OTAgYmxldSsxCi0JYmwsbiBMJDAxMDksJXIwIDsjIDkwNSBqdW1wCi1MJDAxMjYKLUwkMTE2MAotCWxkbyAtMSglcjE5KSwlcjE5IDsjIDkxMCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjM5NyByZWxvYWRfb3V0c2krMi82Ci1MJDAxMTAKLQljb21pY2xyLDw+IDAsJXI4LCVyMCA7IyA5MjcgYmxldSsxCi0JYmwgTCQxMTYxLCVyMAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIyMixMJDAxMzcgOyMgOTM0IGJsZXUrMQotCWxkdyAwKCVyNSksJXIzIDsjIDgwMDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDA1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMDMgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwMDQgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAxMzkgOyMgODAwNiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2ODYgcmVsb2FkX291dHNpKzIvMwotTCQwMTQwCi0JY29tY2xyLDw+ICVyNCwlcjIwLCVyMCA7IyA5NjEgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDk3MSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxNDUgOyMgOTc5IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA5NzMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDk4MiByZWxvYWRfb3V0c2krMi82Ci1MJDAxNDUKLQlsZHcgMCglcjUpLCVyMjYgOyMgOTg5IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDk5MyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA5OTEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMDAxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA5OTcgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxMzggOyMgMTAxMSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDEwMTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTAxNiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDEwMTcgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxNDggOyMgMTAyMiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDEwMjAgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxMDIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxMDI2IGFkZHNpMy8xCi1MJDAxNDgKLQljb21pYiw9IDAsJXI4LEwkMDE0OSA7IyAxMDI5IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTAzMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxMDMzIGFkZHNpMy8xCi1MJDAxNDkKLQljb21pYiw9IDAsJXI5LEwkMDEzOCA7IyAxMDM2IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTAzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxMDQwIGFkZHNpMy8xCi1MJDAxMzgKLQlsZHcgMCglcjUpLCVyMyA7IyA5NDEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA5NDUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgOTQyIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA5NDMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAxNDAKLQlub3AgOyMgOTQ3IGJsZXUrMQotTCQwMTM5Ci0JY29taWIsPSAwLCVyMTQsTCQwMTU0IDsjIDEwNjMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDAzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgLTIoJXIxOSksJXIxOSA7IyAxMDY2IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjE5LCVyMTkgOyMgMTA2NyBhZGRzaTMvMQotCWJsIEwkMDk0NywlcjAgOyMgMTA3MSBqdW1wCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMDY5IG1vdnFpKzEvNQotTCQwMTU0Ci0JbGRiIC0yKCVyMTkpLCVyMTkgOyMgMTA3NSBtb3ZxaSsxLzUKLUwkMDk0NwotCWNvbWliLD0gMCwlcjE0LEwkMDE1NiA7IyAxMDc5IGJsZXUrMQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDEwNzYgZXh0ZW5kcWlzaTIKLQlsZGIgNDYoJXIxNCksJXIxOSA7IyAxMDgxIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDEwODIgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxOSwlcjIwLEwkMDE1NyA7IyAxMDg0IGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQxMTYyLCVyMCA7IyAxMDg1IGp1bXAKLUwkMDE1NgotCWxkaSA0NiwlcjE5IDsjIDEwODkgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjIwLEwkMTE2MiA7IyAxMDkxIGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotTCQwMTU3Ci0JY29taWIsPSAwLCVyMTEsTCQwMTUzIDsjIDEwOTYgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDA5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLDw8PSAlcjE2LCVyMTksTCQxMTYyIDsjIDEwOTggYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPSxuIDAsJXIxNCxMJDAxNTggOyMgMTEwMCBibGV1KzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDExMDMgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyMTksJXIxOSA7IyAxMTA0IGFkZHNpMy8xCi1MJDAxNTgKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDExMTIgbW92cWkrMS81Ci0JY29taWIsPSAwLCVyMTQsTCQwMTYwIDsjIDExMTYgYmxldSsxCi0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgMTExMyBleHRlbmRxaXNpMgotCWxkYiAxMCglcjE0KSwlcjE5IDsjIDExMTggbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTExOSBleHRlbmRxaXNpMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwMTYxIDsjIDExMjEgYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JYmwsbiBMJDExNjIsJXIwIDsjIDExMjIganVtcAotTCQwMTYwCi0JY29taWIsPD4gMTAsJXIyMCxMJDExNjIgOyMgMTEyNiBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE2MQotCWJiLDwgJXIxNSwyNSxMJDExNjIgOyMgMTEzNCBibGV1KzMKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMTIsJXIyNiA7IyAxMTQwIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyNiwlcjI1IDsjIDExNDIgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjgsJXI2LCVyMjQgOyMgMTEzNyBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgc3RvcmVfb3AxLCVyMiA7IyAxMTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGRvIC0zKCVyMjQpLCVyMjQgOyMgMTE0NCBhZGRzaTMvMgotCWJsIEwkMDE2MiwlcjAgOyMgMTE1MSBqdW1wCi0JbGRpIDEsJXIxMyA7IyAxMTQ5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE1MwotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotTCQxMTYyCi0JY29weSAlcjYsJXIyNSA7IyAxMTYxIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDExNTYgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgMTE2NSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtNiglcjI0KSwlcjI0IDsjIDExNjMgYWRkc2kzLzIKLUwkMDE2MgotCWxkbyAzKCVyNiksJXI2IDsjIDExNjggYWRkc2kzLzIKLUwkMDEzNwotCWxkdyAwKCVyNSksJXIzIDsjIDgwMTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDEzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMTEgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwMTIgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAxNjQgOyMgODAxNCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2ODQgcmVsb2FkX291dHNpKzIvMwotTCQwMTY1Ci0JY29tY2xyLDw+ICVyNCwlcjIwLCVyMCA7IyAxMTk1IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxMjA1IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDE3MCA7IyAxMjEzIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxMjA3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyAxMjE2IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDE3MAotCWxkdyAwKCVyNSksJXIyNiA7IyAxMjIzIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDEyMjcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTIyNSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDEyMzUgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDEyMzEgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxNjMgOyMgMTI0NSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDEyNDcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTI1MCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDEyNTEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxNzMgOyMgMTI1NiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDEyNTQgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxMjU3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxMjYwIGFkZHNpMy8xCi1MJDAxNzMKLQljb21pYiw9IDAsJXI4LEwkMDE3NCA7IyAxMjYzIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTI2NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxMjY3IGFkZHNpMy8xCi1MJDAxNzQKLQljb21pYiw9IDAsJXI5LEwkMDE2MyA7IyAxMjcwIGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTI3MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxMjc0IGFkZHNpMy8xCi1MJDAxNjMKLQlsZHcgMCglcjUpLCVyMyA7IyAxMTc1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTE3OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMTc2IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyAxMTc3IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTY1Ci0Jbm9wIDsjIDExODEgYmxldSsxCi1MJDAxNjQKLQlsZGkgMTQsJXIyNiA7IyA4Nzg2IHJlbG9hZF9vdXRzaSsyLzIKLQljb21pY2xyLD0gMCwlcjEzLCVyMCA7IyAxMzEwIGJlcS0xLzIKLQlsZGkgMTUsJXIyNgotCWNvcHkgJXI4LCVyMjUgOyMgMTMxMiByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyAxMzE0IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyAxMzE4IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyAxMzE2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjkgOyMgMTMyMSByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPD4gMCwlcjExLEwkMDA0MyA7IyAxMzI2IGJsZXUrMQotCWxkbyAzKCVyNiksJXI2IDsjIDEzMjMgYWRkc2kzLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDE5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAyMiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDIwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDIxIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTgyIDsjIDgwMjMgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NjgyIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE4MwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgMTM1MiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxMzYyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDE4OCA7IyAxMzcwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxMzY0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyAxMzczIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDE4OAotCWxkdyAwKCVyNSksJXIyNiA7IyAxMzgwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDEzODQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTM4MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDEzOTIgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDEzODggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxODEgOyMgMTQwMiBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDE0MDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTQwNyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDE0MDggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxOTEgOyMgMTQxMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDE0MTEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxNDE0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxNDE3IGFkZHNpMy8xCi1MJDAxOTEKLQljb21pYiw9IDAsJXI4LEwkMDE5MiA7IyAxNDIwIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTQyMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxNDI0IGFkZHNpMy8xCi1MJDAxOTIKLQljb21pYiw9IDAsJXI5LEwkMDE4MSA7IyAxNDI3IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTQyOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxNDMxIGFkZHNpMy8xCi1MJDAxODEKLQlsZHcgMCglcjUpLCVyMyA7IyAxMzMyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTMzNiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMzMzIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyAxMzM0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTgzCi0Jbm9wIDsjIDEzMzggYmxldSsxCi1MJDAxODIKLQlsZGkgMTgsJXIyNiA7IyAxNDU0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDE0NTYgcmVsb2FkX291dHNpKzIvMQotCWxkaSAzLCVyMjQgOyMgMTQ1OCByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyAxNDYyIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyAxNDYwIHJlbG9hZF9vdXRzaSsyLzEKLQlibCBMJDAwNDMsJXIwIDsjIDE0NzAganVtcAotCWxkbyAzKCVyNiksJXI2IDsjIDE0NjQgYWRkc2kzLzIKLUwkMDE5NgotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDMwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwMjggc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwMjkgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjAxIDsjIDgwMzEgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDE0NzUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY4MCByZWxvYWRfb3V0c2krMi8zCi1MJDAyMDIKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE1MDMgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTUxMyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyMDcgOyMgMTUyMSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTUxNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTUyNCByZWxvYWRfb3V0c2krMi82Ci1MJDAyMDcKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTUzMSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxNTM1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE1MzMgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxNTQzIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxNTM5IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjAwIDsjIDE1NTMgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxNTU1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE1NTggYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAxNTU5IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjEwIDsjIDE1NjQgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNTYyIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMTU2NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTU2OCBhZGRzaTMvMQotTCQwMjEwCi0JY29taWIsPSAwLCVyOCxMJDAyMTEgOyMgMTU3MSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDE1NzIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTU3NSBhZGRzaTMvMQotTCQwMjExCi0JY29taWIsPSAwLCVyOSxMJDAyMDAgOyMgMTU3OCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDE1Nzkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTU4MiBhZGRzaTMvMQotTCQwMjAwCi0JbGR3IDAoJXI1KSwlcjQgOyMgMTQ4MyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE0ODcgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTQ4NCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTQ4NSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDIwMgotCW5vcCA7IyAxNDg5IGJsZXUrMQotTCQwMjAxCi0JbGRpIDIsJXIxOSA7IyAxNjA0IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgMTYxNyBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyAxNjA1IG1vdnFpKzEvNgotTCQwMjE2Ci0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MDIgOyMgMTYyNiBibGV1KzEKLQlsZGkgMCwlcjEzIDsjIDE2MjMgcmVsb2FkX291dHNpKzIvMgotCWxkdyAwKCVyNSksJXIzIDsjIDgwMzUgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDM4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMzYgc3Vic2kzLzEKLQlsZG8gMzQoJXIxOSksJXIxOSA7IyA4MDM3IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIxOSA7IyA4MDM5IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODY3OCByZWxvYWRfb3V0c2krMi8zCi1MJDAyMjAKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDE2NjEgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTY3MSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAyMjUgOyMgMTY3OSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTY3MyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTY4MiByZWxvYWRfb3V0c2krMi82Ci1MJDAyMjUKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTY4OSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxNjkzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE2OTEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxNzAxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxNjk3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMjE4IDsjIDE3MTEgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxNzEzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE3MTYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxNzE3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjI4IDsjIDE3MjIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNzIwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTcyMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTcyNiBhZGRzaTMvMQotTCQwMjI4Ci0JY29taWIsPSAwLCVyOCxMJDAyMjkgOyMgMTcyOSBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDE3MzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTczMyBhZGRzaTMvMQotTCQwMjI5Ci0JY29taWIsPSAwLCVyOSxMJDAyMTggOyMgMTczNiBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDE3Mzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTc0MCBhZGRzaTMvMQotTCQwMjE4Ci0JbGR3IDAoJXI1KSwlcjMgOyMgMTY0MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE2NDUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTY0MiBzdWJzaTMvMQotCWxkbyAzNCglcjE5KSwlcjE5IDsjIDE2NDMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMjAKLQlub3AgOyMgMTY0NyBibGV1KzEKLUwkMDIxOQotCWxkdyAwKCVyNSksJXI0IDsjIDgwNDMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwNDQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwNDUgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjM3IDsjIDgwNDcgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDE3NjMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY3NiByZWxvYWRfb3V0c2krMi8zCi1MJDAyMzgKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE3OTEgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTgwMSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyNDMgOyMgMTgwOSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTgwMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTgxMiByZWxvYWRfb3V0c2krMi82Ci1MJDAyNDMKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTgxOSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxODIzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE4MjEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxODMxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxODI3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjM2IDsjIDE4NDEgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxODQzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE4NDYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAxODQ3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjQ2IDsjIDE4NTIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxODUwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMTg1MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTg1NiBhZGRzaTMvMQotTCQwMjQ2Ci0JY29taWIsPSAwLCVyOCxMJDAyNDcgOyMgMTg1OSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDE4NjAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTg2MyBhZGRzaTMvMQotTCQwMjQ3Ci0JY29taWIsPSAwLCVyOSxMJDAyMzYgOyMgMTg2NiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDE4Njcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTg3MCBhZGRzaTMvMQotTCQwMjM2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMTc3MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE3NzUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTc3MiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTc3MyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDIzOAotCW5vcCA7IyAxNzc3IGJsZXUrMQotTCQwMjM3Ci0JY29weSAlcjYsJXIyMiA7IyAxOTA5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gMSglcjYpLCVyNiA7IyAxODkxIGFkZHNpMy8yCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDIxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDE4OTMgbW92cWkrMS81Ci0JbGRpIDk0LCVyMjEgOyMgMTg5NiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTg5NCBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIyMSwlcjE5LEwkMDI1MSA7IyAxODk4IGJsZXUrMQotCWxkaSAzLCVyMjAgOyMgODA1MSBtb3ZxaSsxLzIKLQlsZGkgNCwlcjIwIDsjIDE5MDAgbW92cWkrMS8yCi1MJDAyNTEKLQlzdGIgJXIyMCwwKCVyMjIpIDsjIDE5MTEgbW92cWkrMS82Ci0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDI0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIwKSwlcjE5IDsjIDE5MjMgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTkyNCBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIyMSwlcjE5LEwkMDI1NCA7IyAxOTI4IGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMTkzMCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjQyNyByZWxvYWRfb3V0c2krMi82Ci1MJDAyNTQKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDUyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA1NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yOTYoJXIzMCksJXIxIDsjIDI0MzMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODA1MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODA1NCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDAyNTkgOyMgODA1NiBibGV1KzEKLQlzdHcgJXIxLC0yNjgoJXIzMCkgOyMgODc4OSByZWxvYWRfb3V0c2krMi82Ci0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4Njc0IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDI2MAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgMTk2MiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxOTcyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDI2NSA7IyAxOTgwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxOTc0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyAxOTgzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDI2NQotCWxkdyAwKCVyNSksJXIyNiA7IyAxOTkwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDE5OTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTk5MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDIwMDIgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDE5OTggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAyNTggOyMgMjAxMiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDIwMTQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMjAxNyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDIwMTggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAyNjggOyMgMjAyMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDIwMjEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyAyMDI0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAyMDI3IGFkZHNpMy8xCi1MJDAyNjgKLQljb21pYiw9IDAsJXI4LEwkMDI2OSA7IyAyMDMwIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgMjAzMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAyMDM0IGFkZHNpMy8xCi1MJDAyNjkKLQljb21pYiw9IDAsJXI5LEwkMDI1OCA7IyAyMDM3IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgMjAzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAyMDQxIGFkZHNpMy8xCi1MJDAyNTgKLQlsZHcgMCglcjUpLCVyNCA7IyAxOTQyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTk0NiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxOTQzIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAxOTQ0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMjYwCi0Jbm9wIDsjIDE5NDggYmxldSsxCi1MJDAyNTkKLQlsZGkgMzIsJXIxOSA7IyAyMDYzIG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgMjA2NCBtb3ZxaSsxLzYKLQljb3B5ICVyNiwlcjI2IDsjIDIwNzcgcmVsb2FkX291dHNpKzIvMQotCWxkaSAwLCVyMjUgOyMgMjA3OSByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyIDsjIDIwODMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNCA7IyAyMDgxIHJlbG9hZF9vdXRzaSsyLzIKLQlsZGIgLTIoJXI2KSwlcjE5IDsjIDIwODcgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPD4gNCwlcjE5LEwkMDI3NCA7IyAyMDg5IGJsZXUrMQotCWxkaSA5MywlcjE3IDsjIDg2MjIgcmVsb2FkX291dHNpKzIvMgotCWJiLD49LG4gJXIxNSwyMyxMJDAyNzQgOyMgMjA5NCBtb3ZzaS00Ci0JbGRiIDEoJXI2KSwlcjE5IDsjIDIwOTcgbW92cWkrMS81Ci0JZGVwaSAtMSwyOSwxLCVyMTkgOyMgMjA5OSBpb3JzaTMrMS8yCi0Jc3RiICVyMTksMSglcjYpIDsjIDIxMDEgbW92cWkrMS82Ci1MJDAyNzQKLQlsZGkgNCwlcjE4IDsjIDg2MjggcmVsb2FkX291dHNpKzIvMgotCWFuZCAlcjE1LCVyMTgsJXIxIDsjIDg2MjkgYW5kc2kzLzEKLQlzdHcgJXIxLC0yNTIoJXIzMCkgOyMgODc5MiByZWxvYWRfb3V0c2krMi82Ci0JbGRvIC0yODgoJXIzMCksJXIxMSA7IyA4NjMyIGFkZHNpMy8yCi1MJDAyNzUKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0MzYgcmVsb2FkX291dHNpKzIvNQotTCQxMTY1Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MDIgOyMgMjEwOSBibGV1KzEKLQljb3B5ICVyMjAsJXIyMSA7IyA4NzQ1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGJzLG1hIDEoJXIyMSksJXI3IDsjIDIxMzQgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMjgwIDsjIDIxMzkgYmxldSsxCi0Jc3R3ICVyMjEsLTI5NiglcjMwKSA7IyAyNDQ1IHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgMjE0MCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyMTQzIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMjgwCi0JYmIsPj0gJXIxNSwzMSxMJDAyODUgOyMgMjE1OSBtb3ZzaS00Ci0JbGRpIDkyLCVyMTkgOyMgMjE2MSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PixuICVyMTksJXI3LEwkMDI4NSA7IyAyMTYzIGJsZXUrMQotCWNvbWIsPSAlcjE2LCVyMjEsTCQwOTAzIDsjIDIxNjcgYmxldSsxCi0JbGRvIDEoJXIyMSksJXIxOSA7IyAyMTk1IGFkZHNpMy8yCi0JbGRiIDEoJXIyMCksJXIzIDsjIDIxOTIgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMjg4IDsjIDIxOTcgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyNDYwIHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRsICVyMTQsJXIzLCVyMTkgOyMgMjE5OCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMyA7IyAyMjAxIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMjg4Ci0JZXh0cnUgJXIzLDI4LDI5LCVyMTkgOyMgMjIxNiBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjE5LCVyMTkgOyMgMjIxOSBhZGRzaTMvMQotCWJsIEwkMDk0OCwlcjAgOyMgMjIzNSBqdW1wCi0JZXh0cnUgJXIzLDMxLDMsJXIyMCA7IyAyMjIyIGFuZHNpMy8xCi1MJDAyODUKLQljb21iLDw+LG4gJXIxNywlcjcsTCQwMjkzIDsjIDIyNDMgYmxldSsxCi0JbGR3IC0yNjgoJXIzMCksJXIxIDsjIDg3OTggcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjQ2NiByZWxvYWRfb3V0c2krMi81Ci0JbGRvIDEoJXIxKSwlcjE5IDsjIDIyNDQgYWRkc2kzLzIKLQljb21iLDw+LG4gJXIxOSwlcjIwLEwkMDI3NiA7IyAyMjQ2IGJsZXUrMQotTCQwMjkzCi0JY29taWIsPSAwLCVyMTMsTCQwMjk0IDsjIDIyNTMgYmxldSsxCi0JbGRpIDQ1LCVyMSA7IyA4ODAxIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMSwlcjcsTCQxMTYzIDsjIDIyNTcgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNTI0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0NjkgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjI1OSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMjYwIGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMTcsJXIxOSxMJDA4OTUgOyMgMjI2NCBibGV1KzEKLUwkMDI5NAotCWxkaSA0NSwlcjEgOyMgODgwNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2MyA7IyAyMjgwIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg4MDcgcmVsb2FkX291dHNpKzIvNQotCWxkbyAtMiglcjIwKSwlcjE5IDsjIDIyODEgYWRkc2kzLzIKLQljb21iLD4+LG4gJXIxLCVyMTksTCQxMTc5IDsjIDIyODMgYmxldSsxCi0JbGRiIC0yKCVyMjApLCVyMTkgOyMgMjI4NSBtb3ZxaSsxLzUKLQlsZGkgOTEsJXIxIDsjIDg4MTAgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIyODYgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxLCVyMTksTCQxMTYzIDsjIDIyOTAgYmxldSsxCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg4MTMgcmVsb2FkX291dHNpKzIvNQotTCQxMTc5Ci0JbGRvIC0zKCVyMjApLCVyMTkgOyMgMjI5NCBhZGRzaTMvMgotCWNvbWIsPj4sbiAlcjEsJXIxOSxMJDAyOTcgOyMgMjI5NiBibGV1KzEKLQlsZGIgLTMoJXIyMCksJXIxOSA7IyAyMjk4IG1vdnFpKzEvNQotCWxkaSA5MSwlcjEgOyMgODgxNiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjI5OSBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIxLCVyMTksTCQxMTY0IDsjIDIzMDMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgLTIoJXIyMCksJXIxOSA7IyAyMzA1IG1vdnFpKzEvNQotCWxkaSA5NCwlcjIwIDsjIDIzMDggcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIzMDYgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIyMCwlcjE5LEwkMTE2MyA7IyAyMzEwIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci1MJDAyOTcKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0ODcgcmVsb2FkX291dHNpKzIvNQotTCQxMTY0Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAyMzE1IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIzMTYgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMTcsJXIxOSxMJDAzMDIgOyMgMjMyMCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotTCQxMTYzCi0JbGRiIDAoJXIyMCksJXIxOSA7IyAyNTI2IG1vdnFpKzEvNQotCWxkaSA0NSwlcjEgOyMgODgxOSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjUyNyBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjEsJXIxOSxMJDAzMDAgOyMgMjUzMSBibGV1KzEKLQlsZGIgMSglcjIwKSwlcjE5IDsjIDI1MzUgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjUzNiBleHRlbmRxaXNpMgotCWNvbWIsPSxuICVyMTcsJXIxOSxMJDAzMDAgOyMgMjU0MCBibGV1KzEKLQljb21iLD0gJXIxNiwlcjIwLEwkMDkyMiA7IyAyNTUwIGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMjU1OSBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjU2MSByZWxvYWRfb3V0c2krMi82Ci1MJDAzMDIKLQlzdHcgJXI2LC01MiglcjMwKSA7IyAyNTg4IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gLTI5NiglcjMwKSwlcjI2IDsjIDI1OTAgYWRkc2kzLzIKLQljb3B5ICVyMTYsJXIyNSA7IyAyNTkyIHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMTQsJXIyNCA7IyAyNTk0IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGNvbXBpbGVfcmFuZ2UsJXIyIDsjIDI1OTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyMyA7IyAyNTk2IHJlbG9hZF9vdXRzaSsyLzEKLQltb3ZiLD0gJXIyOCwlcjQsTCQxMTY1IDsjIDI2MDMgZGVjcmVtZW50X2FuZF9icmFuY2hfdW50aWxfemVybysyLzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0MzYgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMjYwNyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMjYwNSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAyNjExIGp1bXAKLQljb3B5ICVyNCwlcjI4IDsjIDI2MDkgcmVsb2FkX291dHNpKzIvMQotTCQwMzAwCi0JbGR3IC0yNTIoJXIzMCksJXIxIDsjIDg4MjIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzA5IDsjIDI2MjQgYmxldSsxCi0JbGRpIDkxLCVyMSA7IyA4ODI1IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMSwlcjcsTCQxMTY2IDsjIDI2MjggYmxldSsxCi0JbGRpIDAsJXIxMyA7IyAzNjI0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI2MzAgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjApLCVyMTkgOyMgMjYzMiBtb3ZxaSsxLzUKLQlsZGkgNTgsJXIxIDsjIDg4MjggcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI2MzMgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIxLCVyMTksTCQxMTY2IDsjIDI2MzcgYmxldSsxCi0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgMjY0NyBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI2NTYgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI2NTggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDI2ODkgYmxldSsxCi0JbGRpIDAsJXIzIDsjIDI2ODQgcmVsb2FkX291dHNpKzIvMgotTCQwMzE3Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNzA5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkyMiA7IyAyNzExIGJsZXUrMQotCWxkbyAxKCVyMTkpLCVyMjAgOyMgMjcyMCBhZGRzaTMvMgotCXN0dyAlcjIwLC0yOTYoJXIzMCkgOyMgMjcyMiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwMzIxIDsjIDI3MjkgYmxldSsxCi0JbGRiIDAoJXIxOSksJXI3IDsjIDI3MjUgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDI3MzAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjczMyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDMyMQotCWxkaSA1OCwlcjEgOyMgODgzMSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMSwlcjcsTCQxMTY3IDsjIDI3NTAgYmxldSsxCi0JYWRkbCAlcjExLCVyMywlcjE5IDsjIDI3ODkgYWRkc2kzLzEKLQljb21iLD0sbiAlcjE3LCVyNyxMJDExNjcgOyMgMjc1NCBibGV1KzEKLQljb21iLD0sbiAlcjE2LCVyMjAsTCQxMTY3IDsjIDI3NTggYmxldSsxCi0JY29taWIsPSA2LCVyMyxMJDExNjcgOyMgMjc2MCBibGV1KzEKLQljb3B5ICVyMywlcjIwIDsjIDI3NzAgcmVsb2FkX291dHNpKzIvMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMjc3MSBhZGRzaTMvMgotCWV4dHJ1ICVyMTksMzEsOCwlcjMgOyMgMjc3MiB6ZXJvX2V4dGVuZHFpc2kyLzEKLQlhZGRsICVyMTEsJXIyMCwlcjIwIDsjIDI3NzYgYWRkc2kzLzEKLQlibCBMJDAzMTcsJXIwIDsjIDI3ODMganVtcAotCXN0YiAlcjcsMCglcjIwKSA7IyAyNzc4IG1vdnFpKzEvNgotTCQxMTY3Ci0JY29tYiw8PiAlcjEsJXI3LEwkMDMyOCA7IyAyNzk2IGJsZXUrMQotCXN0YiAlcjAsMCglcjE5KSA7IyAyNzkxIG1vdnFpKzEvNgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjc5OCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAyODAwIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI4MDEgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMTcsJXIxOSxMJDExNjggOyMgMjgwNSBibGV1KzEKLQlsZGkgMjU1LCVyMTkgOyMgODA2OSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjExLCVyMjYgOyMgMjgxMyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE2LCVyMSA7IyA4ODM1IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNiglcjEpLCVyMSA7IyA4ODM2IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjgxNyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMjgxNSByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjExLCVyMjYgOyMgMjgyOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE3LCVyMSA7IyA4ODM3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNyglcjEpLCVyMSA7IyA4ODM4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4MzEgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjgyMSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4MzMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjQ0KCVyMzApIDsjIDg4NDEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4NDUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOCwlcjEgOyMgODg0MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTgoJXIxKSwlcjEgOyMgODg0MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODQ3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4Mzcgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODQ5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIzNiglcjMwKSA7IyA4ODQ2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODYxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTksJXIxIDsjIDg4NDcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE5KCVyMSksJXIxIDsjIDg4NDggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg2MyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODUzIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg2NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMjgoJXIzMCkgOyMgODg1MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjg3NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIwLCVyMSA7IyA4ODUyIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMCglcjEpLCVyMSA7IyA4ODUzIG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4NzkgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjg2OSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4ODEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjIwKCVyMzApIDsjIDg4NTYgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4OTMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMSwlcjEgOyMgODg1NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjEoJXIxKSwlcjEgOyMgODg1OCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODk1IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4ODUgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODk3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIxMiglcjMwKSA7IyA4ODYxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTA5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjIsJXIxIDsjIDg4NjIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIyKCVyMSksJXIxIDsjIDg4NjMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjkxMSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTAxIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjkxMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMDQoJXIzMCkgOyMgODg2NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjkyNSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIzLCVyMSA7IyA4ODY3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMyglcjEpLCVyMSA7IyA4ODY4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5MjcgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjkxNyBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5MjkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTk2KCVyMzApIDsjIDg4NzEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5NDEgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNCwlcjEgOyMgODg3MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjQoJXIxKSwlcjEgOyMgODg3MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyOTQzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5MzMgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTQ1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTE4OCglcjMwKSA7IyA4ODc2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTU3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjUsJXIxIDsjIDg4NzcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI1KCVyMSksJXIxIDsjIDg4NzggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjk1OSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTQ5IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xODAoJXIzMCkgOyMgODg4MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk3MyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI2LCVyMTkgOyMgMjk3MCBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjYoJXIxOSksJXIzIDsjIDI5NzEgbW92aGktMgotCWNvcHkgJXIzLCVyMjUgOyMgMjk3NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTY1IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk3NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xNzIoJXIzMCkgOyMgODg4NCByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk4OSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI3LCVyMTkgOyMgMjk4NiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjcoJXIxOSksJXI0IDsjIDI5ODcgbW92aGktMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMTMgOyMgMjk4MSBzY2MKLQlsZGkgMSwlcjEzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5OTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjI1IDsjIDI5OTEgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwMDUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNywlcjEgOyMgODg4NSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTcoJXIxKSwlcjEgOyMgODg4NiBtb3ZoaS0yCi0JY29taWNsciw8PiAwLCVyMjgsJXI3IDsjIDI5OTcgc2NjCi0JbGRpIDEsJXI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwMDkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwMDcgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDEzIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwMTggcmVsb2FkX291dHNpKzIvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDIyIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjMsJXIyNSA7IyAzMDIwIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAyNiBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDMxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjIsJXIxIDsjIDg4ODcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIyKCVyMSksJXIxIDsjIDg4ODggbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDM1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDMzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAzOSBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDQ0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjAsJXIxIDsjIDg4ODkgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIwKCVyMSksJXIxIDsjIDg4OTAgbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDQ4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDQ2IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzA1MiBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDU3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTYsJXIxIDsjIDg4OTEgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE2KCVyMSksJXIxIDsjIDg4OTIgbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDYxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDU5IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzA2NSBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDcwIHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA3NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI0LCVyMjUgOyMgMzA3MiByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNzggYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA4MyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI1LCVyMSA7IyA4ODkzIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNSglcjEpLCVyMSA7IyA4ODk0IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA4NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA4NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwOTEgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA5NiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIzLCVyMSA7IyA4ODk1IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMyglcjEpLCVyMSA7IyA4ODk2IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEwMCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA5OCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMDQgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI0LCVyMSA7IyA4ODk3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNCglcjEpLCVyMSA7IyA4ODk4IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzExMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzExMSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMTcgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEyMiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIxLCVyMSA7IyA4ODk5IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMSglcjEpLCVyMSA7IyA4OTAwIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEyNiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzEyNCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMzAgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEzNSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE5LCVyMSA7IyA4OTAxIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOSglcjEpLCVyMSA7IyA4OTAyIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEzOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzEzNyByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxNDMgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzE0OCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE4LCVyMSA7IyA4OTAzIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOCglcjEpLCVyMSA7IyA4OTA0IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzE1MiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzE1MCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPD4sbiAwLCVyMjgsTCQwOTAwIDsjIDMxNTYgYmxldSsxCi1MJDAzMjkKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDMxNzMgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTIyIDsjIDMxNzUgYmxldSsxCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzMTg0IGFkZHNpMy8yCi0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MDIgOyMgMzIxNCBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDMxODYgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyMjIgOyMgMzIyNyByZWxvYWRfb3V0c2krMi8yCi0JYWRkaWwgTFInX19hbG51bS0kZ2xvYmFsJCwlcjI3IDsjIDg1OTYgcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyMiA7IyA4OTA3IHJlbG9hZF9vdXRzaSsyLzEKLQlhZGRpbCBMUidfX2N0eXBlMi0kZ2xvYmFsJCwlcjI3IDsjIDg1OTggcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyMjMgOyMgODkxMCByZWxvYWRfb3V0c2krMi8xCi0JYWRkaWwgTFInX19jdHlwZS0kZ2xvYmFsJCwlcjI3IDsjIDg2MDAgcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyNCA7IyA4OTEzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMzIsJXIyNSA7IyA4NjA1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMiwlcjI0IDsjIDg2MDcgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxNiwlcjMxIDsjIDg2MDkgcmVsb2FkX291dHNpKzIvMgotCWxkaSA4LCVyMjkgOyMgODYxMSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEyOCwlcjI4IDsjIDg2MTMgcmVsb2FkX291dHNpKzIvMgotCWxkaSAyNTUsJXIyNiA7IyA4NjE1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI0NCglcjMwKSwlcjEgOyMgODkxNiByZWxvYWRfb3V0c2krMi81Ci1MJDExNzMKLQljb21pYiw9LG4gMCwlcjEsTCQwMzQzIDsjIDMyNDAgYmxldSsxCi0Jc3R3ICVyMjIsUlInX19hbG51bS0kZ2xvYmFsJCglcjIpIDsjIDMyNDQgcmVsb2FkX291dHNpKzIvNgotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDMyNDggcmVsb2FkX291dHNpKzIvNQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIyMSA7IyAzMjYwIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMyNTMgYWRkc2kzLzEKLQlhZGRsICVyMjEsJXIyMiwlcjIxIDsjIDMyNjUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjIwIDsjIDMyNTUgbW92cWkrMS81Ci0JbGRiIDAoJXIyMSksJXIxOSA7IyAzMjY3IG1vdnFpKzEvNQotCWV4dHJ1ICVyMjAsMzEsMSwlcjIwIDsjIDMyNTYgYW5kc2kzLzEKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzI3MCBhbmRzaTMvMQotCW9yICVyMjAsJXIxOSwlcjIwIDsjIDMyNzggeG9yZGkzLTEKLQljb21pYiw8PiAwLCVyMjAsTCQxMTY5IDsjIDMyODAgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0MwotCWxkdyAtMjM2KCVyMzApLCVyMSA7IyA4OTE5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0NCA7IyAzMjg1IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDMyODkgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzI5MCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzI5MiBtb3ZxaSsxLzUKLQliYiw8ICVyMTksMzEsTCQxMTY5IDsjIDMyOTYgYmxldSszCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0NAotCWxkdyAtMjI4KCVyMzApLCVyMSA7IyA4OTIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9LG4gMCwlcjEsTCQwMzQ1IDsjIDMzMDEgYmxldSsxCi0JY29tYiw9ICVyMjUsJXIyMixMJDExNjkgOyMgMzMwNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzMzMwIHplcm9fZXh0ZW5kcWlzaTIvMQotCWNvbWliLD0gOSwlcjIyLEwkMTE3MCA7IyAzMzA3IGJsZXUrMQotCWV4dHJ1ICVyMTksMjgsMjksJXIyMSA7IyAzMzMyIGxzaHJzaTMvMgotTCQwMzQ1Ci0JbGR3IC0yMjAoJXIzMCksJXIxIDsjIDg5MjUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQxIDsjIDMzMTIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDMzMTYgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzMxNyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzMxOSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI1LCVyMTkgOyMgMzMyMiBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM0MSA7IyAzMzI1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNjkKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzMzMiBsc2hyc2kzLzIKLUwkMTE3MAotCWFkZGwgJXI2LCVyMjEsJXIyMSA7IyAzMzM1IGFkZHNpMy8xCi0JZXh0cnUgJXIxOSwzMSwzLCVyMTkgOyMgMzMzOSBhbmRzaTMvMQotCXN1YmkgMzEsJXIxOSwlcjE5IDsjIDMzNDAgc3Vic2kzLzIKLQlsZGIgMCglcjIxKSwlcjIwIDsjIDMzNDMgbW92cWkrMS81Ci0JbXRzYXIgJXIxOSA7IyA4OTI4IHJlbG9hZF9vdXRzaSsyLzcKLQl2ZGVwaSAtMSwxLCVyMjAgOyMgMzM0OCB2ZGVwaV9pb3IKLQlzdGIgJXIyMCwwKCVyMjEpIDsjIDMzNTAgbW92cWkrMS82Ci1MJDAzNDEKLQlsZHcgLTIxMiglcjMwKSwlcjEgOyMgODkzMSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDggOyMgMzM1NCBibGV1KzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzM1OCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzU5IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzYxIG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMTgsJXIxOSA7IyAzMzY0IGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzMzY3IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDgKLQlsZHcgLTIwNCglcjMwKSwlcjEgOyMgODkzNCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDkgOyMgMzM3MiBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMzc2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzNzcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzNzkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNCwlcjE5IDsjIDMzODIgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcxIDsjIDMzODUgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzQyNiB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0OQotCWxkdyAtMTk2KCVyMzApLCVyMSA7IyA4OTM3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1MCA7IyAzMzkwIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzMzk0IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzOTUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzOTcgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNCwlcjE5IDsjIDM0MDAgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcxIDsjIDM0MDMgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzQyNiB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1MAotCWxkdyAtMTg4KCVyMzApLCVyMSA7IyA4OTQwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0NiA7IyAzNDA4IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDM0MTIgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQxMyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQxNSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzQxOCBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM0NiA7IyAzNDIxIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNzEKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzQyOCBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzQzMSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDM0MzUgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzNDM2IHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzNDM5IG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODk0MyByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDM0NDQgdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzNDQ2IG1vdnFpKzEvNgotTCQwMzQ2Ci0JbGR3IC0xODAoJXIzMCksJXIxIDsjIDg5NDYgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzUzIDsjIDM0NTAgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0NTQgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ1NSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ1NyBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjMxLCVyMTkgOyMgMzQ2MCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzIgOyMgMzQ2MyBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzUzCi0JbGR3IC0xNzIoJXIzMCksJXIxIDsjIDg5NDkgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzU0IDsjIDM0NjggYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0NzIgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ3MyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ3NSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI5LCVyMTkgOyMgMzQ3OCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzIgOyMgMzQ4MSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzU0Ci0JY29taWIsPSAwLCVyMTMsTCQwMzU1IDsjIDM0ODYgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0OTAgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ5MSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ5MyBtb3ZxaSsxLzUKLQliYiw8ICVyMTksMzEsTCQxMTcyIDsjIDM0OTcgYmxldSszCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1NQotCWNvbWliLD0gMCwlcjcsTCQwMzM5IDsjIDM1MDIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM1MDYgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzUwNyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzUwOSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI4LCVyMTkgOyMgMzUxMiBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDMzOSA7IyAzNTE1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM1MjAgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNzIKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzUyMiBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzUyNSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDM1MjkgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzNTMwIHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzNTMzIG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODk1MiByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDM1MzggdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzNTQwIG1vdnFpKzEvNgotTCQwMzM5Ci0JbGRvIDEoJXIyMiksJXIyMiA7IyAzNTQ2IGFkZHNpMy8yCi0JY29tYiw+PSxuICVyMjYsJXIyMixMJDExNzMgOyMgMzIzMyBibGV1KzEKLQlsZHcgLTI0NCglcjMwKSwlcjEgOyMgODkxNiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwMjc1LCVyMCA7IyAzNTU5IGp1bXAKLQlsZGkgMSwlcjEzIDsjIDM1NTYgcmVsb2FkX291dHNpKzIvMgotTCQwMzI4Ci0JbGRpIDI1NSwlcjE5IDsjIDgwNjkgcmVsb2FkX291dHNpKzIvMgotTCQxMTY4Ci0JY29tYiw9ICVyMTksJXIzLEwkMDM1OSA7IyA4MDcwIGJsZXUrMQotCWNvcHkgJXIxOSwlcjIxIDsjIDg1OTUgcmVsb2FkX291dHNpKzIvMQotTCQwMzYwCi0JbGRvIC0xKCVyMyksJXIyMCA7IyAzNTcxIGFkZHNpMy8yCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzNTgzIHJlbG9hZF9vdXRzaSsyLzUKLQlleHRydSAlcjIwLDMxLDgsJXIzIDsjIDM1NzIgemVyb19leHRlbmRxaXNpMi8xCi0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgMzU4NCBhZGRzaTMvMgotCWNvbWIsPD4gJXIyMSwlcjMsTCQwMzYwIDsjIDM1NzcgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzNTg4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDM1OQotCWxkYiAxMSglcjYpLCVyMTkgOyMgMzU5OSBtb3ZxaSsxLzUKLQlkZXBpIC0xLDI4LDEsJXIxOSA7IyAzNjAxIGlvcnNpMysxLzIKLQlzdGIgJXIxOSwxMSglcjYpIDsjIDM2MDMgbW92cWkrMS82Ci0JbGRiIDcoJXI2KSwlcjE5IDsjIDM2MDYgbW92cWkrMS81Ci0JbGRpIDAsJXIxMyA7IyAzNjEzIHJlbG9hZF9vdXRzaSsyLzIKLQlkZXBpIC0xLDI5LDEsJXIxOSA7IyAzNjA4IGlvcnNpMysxLzIKLQlibCBMJDAyNzUsJXIwIDsjIDM2MTgganVtcAotCXN0YiAlcjE5LDcoJXI2KSA7IyAzNjEwIG1vdnFpKzEvNgotTCQwMzA5Ci0JbGRpIDAsJXIxMyA7IyAzNjI0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2NgotCWV4dHJ1ICVyNywyMSs4LTEsOCwlcjE5IDsjIDM2MjcgZXh0enYKLQlhZGRsICVyNiwlcjE5LCVyMTkgOyMgMzYzMCBhZGRzaTMvMQotCWV4dHJ1ICVyNywzMSwzLCVyMjAgOyMgMzYzMyBhbmRzaTMvMQotTCQwOTQ4Ci0Jc3ViaSAzMSwlcjIwLCVyMjAgOyMgMzYzNCBzdWJzaTMvMgotCWxkYiAwKCVyMTkpLCVyMjEgOyMgMzYzNyBtb3ZxaSsxLzUKLQltdHNhciAlcjIwIDsjIDg5NTUgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMSA7IyAzNjQyIHZkZXBpX2lvcgotCWJsIEwkMDI3NSwlcjAgOyMgMzY1MyBqdW1wCi0Jc3RiICVyMjEsMCglcjE5KSA7IyAzNjQ0IG1vdnFpKzEvNgotTCQwMjc2Ci0JbGRiIC0xKCVyNiksJXIyMCA7IyA4MDc0IG1vdnFpKzEvNQotCWV4dHJ1ICVyMjAsMzEsOCwlcjE5IDsjIDgwNzUgemVyb19leHRlbmRxaXNpMi8xCi0JY29taWIsPSAwLCVyMTksTCQwMzY0IDsjIDgwNzYgYmxldSsxCi0JYWRkbCAlcjE5LCVyNiwlcjE5IDsjIDgwNzkgYWRkc2kzLzEKLQlsZGIgLTEoJXIxOSksJXIxOSA7IyA4MDgyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLDw+IDAsJXIxOSxMJDAzNjQgOyMgODA4MyBibGV1KzEKLQlsZG8gLTEoJXIyMCksJXIxOSA7IyA4MjQyIGFkZHNpMy8yCi0JYmwgTCQxMTgzLCVyMCA7IyA4MjUzIGp1bXAKLQlzdGIgJXIxOSwtMSglcjYpIDsjIDM2ODggbW92cWkrMS82Ci1MJDAzNjUKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyAzNjg2IGFkZHNpMy8yCi0Jc3RiICVyMTksLTEoJXI2KSA7IyAzNjg4IG1vdnFpKzEvNgotTCQxMTgzCi0JZXh0cnUgJXIxOSwzMSw4LCVyMTkgOyMgMzY2MiB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNjQgOyMgMzY2NCBibGV1KzEKLQlhZGRsICVyMTksJXI2LCVyMTkgOyMgMzY2OCBhZGRzaTMvMQotCWxkYiAtMSglcjE5KSwlcjE5IDsjIDM2NzIgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSxuIDAsJXIxOSxMJDAzNjUgOyMgMzY3NCBibGV1KzEKLQlsZGIgLTEoJXI2KSwlcjE5IDsjIDM2ODMgbW92cWkrMS81Ci1MJDAzNjQKLQlsZGIgLTEoJXI2KSwlcjE5IDsjIDM3MDAgemVyb19leHRlbmRxaXNpMi8yCi0JYmwgTCQwMDQzLCVyMCA7IyAzNzA1IGp1bXAKLQlhZGRsICVyNiwlcjE5LCVyNiA7IyAzNzAxIGFkZHNpMy8xCi1MJDAzNjgKLQliYiw+PSxuICVyMTUsMTgsTCQwMDc2IDsjIDM3MTMgbW92c2ktNAotCWJsIEwkMTE4MSwlcjAgOyMgMzcyMSBqdW1wCi0JbGR3IDI0KCVyNSksJXIxOSA7IyAzODYxIHJlbG9hZF9vdXRzaSsyLzUKLUwkMDM3MgotCWJiLD49LG4gJXIxNSwxOCxMJDAwNzYgOyMgMzczMCBtb3ZzaS00Ci0JYmwsbiBMJDAzNzQsJXIwIDsjIDM3MzgganVtcAotTCQwMzc2Ci0JYmIsPj0sbiAlcjE1LDIwLEwkMDA3NiA7IyAzNzQ3IG1vdnNpLTQKLQlibCxuIEwkMDM3OCwlcjAgOyMgMzc1NSBqdW1wCi1MJDAzODAKLQliYiw+PSxuICVyMTUsMTYsTCQwMDc2IDsjIDM3NjQgbW92c2ktNAotCWJsLG4gTCQwMzc4LCVyMCA7IyAzNzcyIGp1bXAKLUwkMDM4MwotCWFuZCAlcjE1LCVyMjAsJXIxOSA7IyAzNzc5IGFuZHNpMy8xCi0JY29tYiw9ICVyMjAsJXIxOSxMJDExNzQgOyMgMzc4MyBibGV1KzEKLQlsZGkgLTEsJXI0IDsjIDUwNzQgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQwMDc2LCVyMCA7IyAzNzkxIGp1bXAKLUwkMDM4NwotCWNvbWIsPSxuICVyMTYsJXIxOSxMJDA5MDMgOyMgMzc5OSBibGV1KzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMzgzMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDM4MjYgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDM4MjggcmVsb2FkX291dHNpKzIvNgotCWxkbyAtMzkoJXI3KSwlcjE5IDsjIDc0NDYgYWRkc2kzLzIKLQlhZGRpLHV2IC04NiwlcjE5LCVyMCA7IyA3NDQ3IGNhc2VzaTAKLQlibHIsbiAlcjE5LCVyMAotCWIsbiBMJDAzOTcKLUwkMDgxNwotCWJsIEwkMDc1OSwlcjAgOyMgOTQzNyBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgyMDQgcmVsb2FkX291dHNpKzIvNQotTCQxMDY5Ci0JYmwgTCQwMzk1LCVyMAotCW5vcCA7IyA5NDQwIHN3aXRjaF9qdW1wCi1MJDEwNzAKLQlibCBMJDA0MjIsJXIwCi0Jbm9wIDsjIDk0NDMgc3dpdGNoX2p1bXAKLUwkMTA3MQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ0NiBzd2l0Y2hfanVtcAotTCQxMDcyCi0JYmwgTCQwODExLCVyMAotCW5vcCA7IyA5NDQ5IHN3aXRjaF9qdW1wCi1MJDEwNzMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NTIgc3dpdGNoX2p1bXAKLUwkMTA3NAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ1NSBzd2l0Y2hfanVtcAotTCQxMDc1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDU4IHN3aXRjaF9qdW1wCi1MJDEwNzYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NjEgc3dpdGNoX2p1bXAKLUwkMTA3NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ2NCBzd2l0Y2hfanVtcAotTCQxMDc4Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDY3IHN3aXRjaF9qdW1wCi1MJDEwNzkKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0NzAgc3dpdGNoX2p1bXAKLUwkMTA4MAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ3MyBzd2l0Y2hfanVtcAotTCQxMDgxCi0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDc2IHN3aXRjaF9qdW1wCi1MJDEwODIKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0Nzkgc3dpdGNoX2p1bXAKLUwkMTA4MwotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ4MiBzd2l0Y2hfanVtcAotTCQxMDg0Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDg1IHN3aXRjaF9qdW1wCi1MJDEwODUKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0ODggc3dpdGNoX2p1bXAKLUwkMTA4NgotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ5MSBzd2l0Y2hfanVtcAotTCQxMDg3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDk0IHN3aXRjaF9qdW1wCi1MJDEwODgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0OTcgc3dpdGNoX2p1bXAKLUwkMTA4OQotCWJsIEwkMDY1OSwlcjAgOyMgOTUwMCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxNjQgcmVsb2FkX291dHNpKzIvNQotTCQxMDkwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTAzIHN3aXRjaF9qdW1wCi1MJDEwOTEKLQlibCBMJDA2NzksJXIwIDsjIDk1MDYgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTcyIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5MgotCWJsIEwkMDgxMSwlcjAKLQlub3AgOyMgOTUwOSBzd2l0Y2hfanVtcAotTCQxMDkzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTEyIHN3aXRjaF9qdW1wCi1MJDEwOTQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MTUgc3dpdGNoX2p1bXAKLUwkMTA5NQotCWJsIEwkMDcxOSwlcjAgOyMgOTUxOCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxODggcmVsb2FkX291dHNpKzIvNQotTCQxMDk2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTIxIHN3aXRjaF9qdW1wCi1MJDEwOTcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MjQgc3dpdGNoX2p1bXAKLUwkMTA5OAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUyNyBzd2l0Y2hfanVtcAotTCQxMDk5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTMwIHN3aXRjaF9qdW1wCi1MJDExMDAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MzMgc3dpdGNoX2p1bXAKLUwkMTEwMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzNiBzd2l0Y2hfanVtcAotTCQxMTAyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTM5IHN3aXRjaF9qdW1wCi1MJDExMDMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NDIgc3dpdGNoX2p1bXAKLUwkMTEwNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU0NSBzd2l0Y2hfanVtcAotTCQxMTA1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTQ4IHN3aXRjaF9qdW1wCi1MJDExMDYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NTEgc3dpdGNoX2p1bXAKLUwkMTEwNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU1NCBzd2l0Y2hfanVtcAotTCQxMTA4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTU3IHN3aXRjaF9qdW1wCi1MJDExMDkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NjAgc3dpdGNoX2p1bXAKLUwkMTExMAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU2MyBzd2l0Y2hfanVtcAotTCQxMTExCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTY2IHN3aXRjaF9qdW1wCi1MJDExMTIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Njkgc3dpdGNoX2p1bXAKLUwkMTExMwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU3MiBzd2l0Y2hfanVtcAotTCQxMTE0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTc1IHN3aXRjaF9qdW1wCi1MJDExMTUKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Nzggc3dpdGNoX2p1bXAKLUwkMTExNgotCWJsIEwkMDYzOSwlcjAgOyMgOTU4MSBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxNTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTE3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTg0IHN3aXRjaF9qdW1wCi1MJDExMTgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1ODcgc3dpdGNoX2p1bXAKLUwkMTExOQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5MCBzd2l0Y2hfanVtcAotTCQxMTIwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTkzIHN3aXRjaF9qdW1wCi1MJDExMjEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTYgc3dpdGNoX2p1bXAKLUwkMTEyMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5OSBzd2l0Y2hfanVtcAotTCQxMTIzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjAyIHN3aXRjaF9qdW1wCi1MJDExMjQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MDUgc3dpdGNoX2p1bXAKLUwkMTEyNQotCWJsIEwkMDczOSwlcjAgOyMgOTYwOCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxOTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTI2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjExIHN3aXRjaF9qdW1wCi1MJDExMjcKLQlibCBMJDA2OTksJXIwIDsjIDk2MTQgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTgwIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTEyOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYxNyBzd2l0Y2hfanVtcAotTCQxMTI5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjIwIHN3aXRjaF9qdW1wCi1MJDExMzAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MjMgc3dpdGNoX2p1bXAKLUwkMTEzMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyNiBzd2l0Y2hfanVtcAotTCQxMTMyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjI5IHN3aXRjaF9qdW1wCi1MJDExMzMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MzIgc3dpdGNoX2p1bXAKLUwkMTEzNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYzNSBzd2l0Y2hfanVtcAotTCQxMTM1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjM4IHN3aXRjaF9qdW1wCi1MJDExMzYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NDEgc3dpdGNoX2p1bXAKLUwkMTEzNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY0NCBzd2l0Y2hfanVtcAotTCQxMTM4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjQ3IHN3aXRjaF9qdW1wCi1MJDExMzkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTAgc3dpdGNoX2p1bXAKLUwkMTE0MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY1MyBzd2l0Y2hfanVtcAotTCQxMTQxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjU2IHN3aXRjaF9qdW1wCi1MJDExNDIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTkgc3dpdGNoX2p1bXAKLUwkMTE0MwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY2MiBzd2l0Y2hfanVtcAotTCQxMTQ0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjY1IHN3aXRjaF9qdW1wCi1MJDExNDUKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2Njggc3dpdGNoX2p1bXAKLUwkMTE0NgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY3MSBzd2l0Y2hfanVtcAotTCQxMTQ3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5Njc0IHN3aXRjaF9qdW1wCi1MJDExNDgKLQlibCBMJDA2MTksJXIwIDsjIDk2Nzcgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTQ4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE0OQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY4MCBzd2l0Y2hfanVtcAotTCQxMTUwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjgzIHN3aXRjaF9qdW1wCi1MJDExNTEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2ODYgc3dpdGNoX2p1bXAKLUwkMTE1MgotCWJsIEwkMDUwNiwlcjAKLQlub3AgOyMgOTY4OSBzd2l0Y2hfanVtcAotTCQxMTUzCi0JYmwgTCQwNDcyLCVyMCA7IyA5NjkyIHN3aXRjaF9qdW1wCi0JbGRpbCBMJzMzNzkyLCVyMTkgOyMgNDcyNCBhZGRfaGlnaF9jb25zdCszCi1MJDExNTQKLQlibCxuIEwkMDM5NywlcjAgOyMgNzQ1MCBqdW1wCi1MJDAzOTUKLQliYiw8LG4gJXIxNSwxOCxMJDAzOTcgOyMgMzg1MyBibGV1KzMKLQlsZHcgMjQoJXI1KSwlcjE5IDsjIDM4NjEgcmVsb2FkX291dHNpKzIvNQotTCQxMTgxCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzODYyIGFkZHNpMy8yCi0Jc3R3ICVyMTksMjQoJXI1KSA7IyAzODY2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM4NzEgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTU4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMwOCglcjMwKSwlcjE5IDsjIDM4NzMgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxIDsjIDM4NjggYWRkc2kzLzIKLQljb21iLDw+ICVyMTksJXIyMCxMJDAzOTggOyMgMzg3NSBibGV1KzEKLQlzdHcgJXIxLC0yNjAoJXIzMCkgOyMgODk2MSByZWxvYWRfb3V0c2krMi82Ci0JemRlcCAlcjIwLDI4LDI5LCVyMjUgOyMgMzg4NSBhc2hsc2kzKzEKLQlzaDFhZGRsICVyMjAsJXIyNSwlcjI1IDsjIDM4ODYgYXNobHNpMy0yCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzODkwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDM4OTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQl6ZGVwICVyMjUsMjksMzAsJXIyNSA7IyAzODkyIGFzaGxzaTMrMQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAzOTAzIGJsZXUrMQotCXN0dyAlcjI4LC0zMTIoJXIzMCkgOyMgMzg5OCByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDgoJXIzMCksJXIxOSA7IyAzOTEyIHJlbG9hZF9vdXRzaSsyLzUKLQl6ZGVwICVyMTksMzAsMzEsJXIxOSA7IyAzOTE0IGFzaGxzaTMrMQotCXN0dyAlcjE5LC0zMDgoJXIzMCkgOyMgMzkxNiByZWxvYWRfb3V0c2krMi82Ci1MJDAzOTgKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM5MjEgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjEgOyMgMzkyMyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDM5MzMgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIyMCwlcjIwLCVyMjAgOyMgMzkyOCBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMjAsJXIyMSwlcjIxIDsjIDM5MzEgYXNobHNpMy0yCi0Jc3ViICVyMTIsJXIxOSwlcjE5IDsjIDM5MzQgc3Vic2kzLzEKLQlzdHcgJXIxOSwwKCVyMjEpIDsjIDM5MzYgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgMzkzOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyAzOTQxIHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDM5NDYgYXNobHNpMy0yCi0JY29taWIsPSAwLCVyMTAsTCQwNDAwIDsjIDM5NTEgYmxldSsxCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyAzOTQ5IGFzaGxzaTMtMgotCWxkdyAwKCVyNSksJXIxOSA7IyAzOTUzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXIxMCwlcjE5LCVyMTkgOyMgMzk1NCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzk1NSBhZGRzaTMvMgotCWJsIEwkMDQwMSwlcjAgOyMgMzk1OCBqdW1wCi0Jc3R3ICVyMTksNCglcjIwKSA7IyAzOTU3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQwMAotCXN0dyAlcjAsNCglcjIwKSA7IyAzOTYyIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQwMQotCWxkdyAtMzA0KCVyMzApLCVyMjAgOyMgMzk2NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMSA7IyAzOTY4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgMzk3OCByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjIwLCVyMjAsJXIyMCA7IyAzOTczIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIyMCwlcjIxLCVyMjEgOyMgMzk3NiBhc2hsc2kzLTIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyAzOTc5IHN1YnNpMy8xCi0Jc3R3ICVyMTksMTIoJXIyMSkgOyMgMzk4MSByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyAzOTg0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDM5ODYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTY0IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDM5OTEgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyAzOTk0IGFzaGxzaTMtMgotCWxkaSAyNTUsJXIxOSA7IyAzOTk5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw8ICVyMTksJXIxLEwkMDQwMiA7IyA0MDAxIGJsZXUrMQotCXN0dyAlcjEsMTYoJXIyMCkgOyMgMzk5NiByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyA0MDA1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIxIDsjIDQwMDcgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIxOSA7IyA0MDE3IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMjAsJXIyMCwlcjIwIDsjIDQwMTIgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjIwLCVyMjEsJXIyMSA7IyA0MDE1IGFzaGxzaTMtMgotCXN1YiAlcjYsJXIxOSwlcjE5IDsjIDQwMTggc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDQwMTkgYWRkc2kzLzIKLQlzdHcgJXIxOSw4KCVyMjEpIDsjIDQwMjEgcmVsb2FkX291dHNpKzIvNgotCWxkdyAwKCVyNSksJXI0IDsjIDgwODcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwODggc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwODkgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0MDcgOyMgODA5MSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1OTMgcmVsb2FkX291dHNpKzIvMwotTCQwNDA4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0MDQ5IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQwNTkgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDEzIDsjIDQwNjcgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQwNjEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQwNzAgcmVsb2FkX291dHNpKzIvNgotTCQwNDEzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDQwNzcgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDA4MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0MDc5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDA4OSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDA4NSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQwNiA7IyA0MDk5IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDEwMSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQxNiA7IyA0MTEwIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0MTA0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNDExMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDExNCBhZGRzaTMvMQotTCQwNDE2Ci0JY29taWIsPSAwLCVyOCxMJDA0MTcgOyMgNDExNyBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDQxMTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDEyMSBhZGRzaTMvMQotTCQwNDE3Ci0JY29taWIsPSAwLCVyOSxMJDA0MDYgOyMgNDEyNCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDQxMjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDEyOCBhZGRzaTMvMQotTCQwNDA2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNDAyOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQwMzMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDAzMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDAzMSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQwOAotCW5vcCA7IyA0MDM1IGJsZXUrMQotTCQwNDA3Ci0JbGRpIDUsJXIxOSA7IyA0MTUwIG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDE1MSBtb3ZxaSsxLzYKLQlsZGIgLTI1NyglcjMwKSwlcjEgOyMgNDE1NiBtb3ZxaSsxLzUKLQlzdGJzLG1hICVyMSwxKCVyNikgOyMgODk2OCBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyMCwxKCVyNikgOyMgNDE1OSBtb3ZxaSsxLzYKLUwkMDQwMgotCWxkaSAwLCVyMTAgOyMgNDE4MiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXI4IDsjIDQxODUgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI2LCVyMTIgOyMgNDE4OCByZWxvYWRfb3V0c2krMi8xCi0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA0MTc0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGkgMCwlcjkgOyMgNDE5MSByZWxvYWRfb3V0c2krMi8yCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA0MTc1IGFkZHNpMy8yCi0JYmwgTCQwMDQzLCVyMCA7IyA0MTkzIGp1bXAKLQlzdHcgJXIxOSwtMzA0KCVyMzApIDsjIDQxNzkgcmVsb2FkX291dHNpKzIvNgotTCQwNDIyCi0JYmIsPCAlcjE1LDE4LEwkMDM5NyA7IyA0MjAxIGJsZXUrMwotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDIwNyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwMzc0IDsjIDQyMDkgYmxldSsxCi0JYmIsPj0sbiAlcjE1LDE0LEwkMDk1MCA7IyA0MjE1IG1vdnNpLTQKLQlibCxuIEwkMDM5NywlcjAgOyMgNDIzMCBqdW1wCi1MJDAzNzQKLQljb21pYiw9LG4gMCwlcjEwLEwkMDQyNyA7IyA0MjM3IGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgwOTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDk4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwOTYgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwOTcgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0MzIgOyMgODA5OSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1OTEgcmVsb2FkX291dHNpKzIvMwotTCQwNDMzCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0MjY2IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQyNzYgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDM4IDsjIDQyODQgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQyNzggcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQyODcgcmVsb2FkX291dHNpKzIvNgotTCQwNDM4Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDQyOTQgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDI5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0Mjk2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDMwNiBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDMwMiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQzMSA7IyA0MzE2IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDMxOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0MzIxIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDMyMiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQ0MSA7IyA0MzI3IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNDMyNSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQzMjggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQzMzEgYWRkc2kzLzEKLUwkMDQ0MQotCWNvbWliLD0gMCwlcjgsTCQwNDQyIDsjIDQzMzQgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MzM1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQzMzggYWRkc2kzLzEKLUwkMDQ0MgotCWNvbWliLD0gMCwlcjksTCQwNDMxIDsjIDQzNDEgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MzQyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQzNDUgYWRkc2kzLzEKLUwkMDQzMQotCWxkdyAwKCVyNSksJXI0IDsjIDQyNDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0MjUwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQyNDcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDQyNDggYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0MzMKLQlub3AgOyMgNDI1MiBibGV1KzEKLUwkMDQzMgotCWxkaSAxOSwlcjE5IDsjIDQzNjcgbW92cWkrMS8yCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0MzY4IG1vdnFpKzEvNgotCXVhZGRjbSAlcjYsJXIxMCwlcjI0IDsjIDQzODEgYWRkZGkzKzEKLQlsZGkgMTMsJXIyNiA7IyA0Mzg0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA0Mzg2IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNDM5MCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDQzODggYWRkc2kzLzIKLUwkMDQyNwotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDM5NSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwNDQ3IDsjIDQzOTcgYmxldSsxCi0JYmIsPCxuICVyMTUsMTQsTCQwMDc2IDsjIDQ0MDMgYmxldSszCi1MJDA5NTAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDQ0MTQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDQ0MTIgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNDQxOCBqdW1wCi0JbGRpIDE2LCVyMjggOyMgNDQxNiByZWxvYWRfb3V0c2krMi8yCi1MJDA0NDcKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyA0NDI3IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTMwNCglcjMwKSA7IyA0NDMxIHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDQ0MzYgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIxOSwlcjE5LCVyMTkgOyMgNDQ0MSBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMTksJXIyMCwlcjIwIDsjIDQ0NDQgYXNobHNpMy0yCi0JbGR3IDAoJXI1KSwlcjIxIDsjIDQ0NDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyMjApLCVyMTkgOyMgNDQ0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXIyMCksJXIyMCA7IyA0NDY0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyMCxMJDA0NTAgOyMgNDQ2NiBibGV1KzEKLQlhZGRsICVyMjEsJXIxOSwlcjEyIDsjIDQ0NDkgYWRkc2kzLzEKLQlhZGRsICVyMjEsJXIyMCwlcjE5IDsjIDQ0ODMgYWRkc2kzLzEKLQlibCBMJDA0NTEsJXIwIDsjIDQ0ODUganVtcAotCWxkbyAtMSglcjE5KSwlcjEwIDsjIDQ0ODQgYWRkc2kzLzIKLUwkMDQ1MAotCWxkaSAwLCVyMTAgOyMgNDQ4OSByZWxvYWRfb3V0c2krMi8yCi1MJDA0NTEKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQ0OTMgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjAgOyMgNDQ5NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjIxIDsjIDQ1MDUgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIxOSwlcjE5LCVyMTkgOyMgNDUwMCBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMTksJXIyMCwlcjIwIDsjIDQ1MDMgYXNobHNpMy0yCi0JbGR3IDEyKCVyMjApLCVyMTkgOyMgNDUwNyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDE2KCVyMjApLCVyNyA7IyA0NTIzIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMjEsJXIxOSwlcjggOyMgNDUwOCBhZGRzaTMvMQotCWxkaSAyNTUsJXIxOSA7IyA0NTI5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw8ICVyMTksJXI3LEwkMDA0MyA7IyA0NTMxIGJsZXUrMQotCWxkaSAwLCVyOSA7IyA0NTI2IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgOCglcjIwKSwlcjE5IDsjIDQ1NTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTcxIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMjEsJXIxOSwlcjE5IDsjIDQ1NTEgYWRkc2kzLzEKLQlzdWIgJXIxLCVyNywlcjIwIDsjIDQ1NTcgc3Vic2kzLzEKLQlzdGIgJXIyMCwwKCVyMTkpIDsjIDQ1NTkgbW92cWkrMS82Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODEwMyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxMDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODEwNCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODEwNSBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDQ1NyA7IyA4MTA3IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU4OSByZWxvYWRfb3V0c2krMi8zCi1MJDA0NTgKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDQ1ODcgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDU5NyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA0NjMgOyMgNDYwNSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNDU5OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNDYwOCByZWxvYWRfb3V0c2krMi82Ci1MJDA0NjMKLQlsZHcgMCglcjUpLCVyMjYgOyMgNDYxNSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA0NjE5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDQ2MTcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0NjI3IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA0NjIzIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNDU2IDsjIDQ2MzcgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0NjM5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQ2NDIgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA0NjQzIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNDY2IDsjIDQ2NDggYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0NjQ2IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNDY0OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDY1MiBhZGRzaTMvMQotTCQwNDY2Ci0JY29taWIsPSAwLCVyOCxMJDA0NjcgOyMgNDY1NSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDQ2NTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDY1OSBhZGRzaTMvMQotTCQwNDY3Ci0JY29taWIsPSAwLCVyOSxMJDA0NTYgOyMgNDY2MiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDQ2NjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDY2NiBhZGRzaTMvMQotTCQwNDU2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNDU2NyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ1NzEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDU2OCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDU2OSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ1OAotCW5vcCA7IyA0NTczIGJsZXUrMQotTCQwNDU3Ci0JbGRpIDYsJXIxOSA7IyA0Njg4IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDY4OSBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyNywxKCVyNikgOyMgNDY5NCBtb3ZxaSsxLzYKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk3NCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyMSwlcjcsJXIxOSA7IyA0NzAwIHN1YnNpMy8xCi0JYmwgTCQwMDQzLCVyMCA7IyA0NzIwIGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ3MDIgbW92cWkrMS82Ci1MJDA0NzIKLQlsZG8gUiczMzc5MiglcjE5KSwlcjE5IDsjIDQ3MjUgbW92aGktMgotCWFuZCAlcjE1LCVyMTksJXIxOSA7IyA0NzI2IGFuZHNpMy8xCi0JY29taWIsPD4sbiAwLCVyMTksTCQwMzk3IDsjIDQ3MjggYmxldSsxCi1MJDAzNzgKLQliYiw8LG4gJXIxNSwyMSxMJDAwNzYgOyMgNDczOSBibGV1KzMKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTExIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODExNCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTEyIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTEzIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDc2IDsjIDgxMTUgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTg3IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQ3NwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNDc2OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0Nzc4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDQ4MiA7IyA0Nzg2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0NzgwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA0Nzg5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQ4MgotCWxkdyAwKCVyNSksJXIyNiA7IyA0Nzk2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQ4MDAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDc5OCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQ4MDggYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQ4MDQgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA0NzUgOyMgNDgxOCBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ4MjAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDgyMyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDQ4MjQgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0ODUgOyMgNDgyOSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQ4MjcgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA0ODMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0ODMzIGFkZHNpMy8xCi1MJDA0ODUKLQljb21pYiw9IDAsJXI4LEwkMDQ4NiA7IyA0ODM2IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNDgzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0ODQwIGFkZHNpMy8xCi1MJDA0ODYKLQljb21pYiw9IDAsJXI5LEwkMDQ3NSA7IyA0ODQzIGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNDg0NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0ODQ3IGFkZHNpMy8xCi1MJDA0NzUKLQlsZHcgMCglcjUpLCVyMyA7IyA0NzQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNDc1MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA0NzQ5IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA0NzUwIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNDc3Ci0Jbm9wIDsjIDQ3NTQgYmxldSsxCi1MJDA0NzYKLQlsZGkgMTQsJXIyNiA7IyA0ODczIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTIsJXIyNSA7IyA0ODc1IHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA0ODcwIHN1YnNpMy8xCi0JbGRvIDMoJXIyNCksJXIyNCA7IyA0ODc3IGFkZHNpMy8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyA0ODgxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyA0ODc5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjkgOyMgNDg4NCByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPSAwLCVyMTAsTCQwNDkwIDsjIDQ4ODkgYmxldSsxCi0JbGRvIDMoJXI2KSwlcjYgOyMgNDg4NiBhZGRzaTMvMgotCWxkaSAxMywlcjI2IDsjIDQ4OTQgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMCwlcjI1IDsjIDQ4OTYgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXIyNSwlcjI0IDsjIDQ4OTEgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNDkwMCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDQ4OTggYWRkc2kzLzIKLUwkMDQ5MAotCWxkdyAwKCVyNSksJXIzIDsjIDgxMTkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTIyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgxMjAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxMjEgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNDkyIDsjIDgxMjMgYmxldSsxCi0JY29weSAlcjYsJXIxMCA7IyA0OTA0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg1ODUgcmVsb2FkX291dHNpKzIvMwotTCQwNDkzCi0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyA0OTI5IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQ5MzkgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwNDk4IDsjIDQ5NDcgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQ5NDEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDQ5NTAgcmVsb2FkX291dHNpKzIvNgotTCQwNDk4Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDQ5NTcgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDk2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0OTU5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDk2OSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDk2NSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDQ5MSA7IyA0OTc5IGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDk4MSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDUwMSA7IyA0OTkwIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0OTg0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNDk5MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDk5NCBhZGRzaTMvMQotTCQwNTAxCi0JY29taWIsPSAwLCVyOCxMJDA1MDIgOyMgNDk5NyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDQ5OTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNTAwMSBhZGRzaTMvMQotTCQwNTAyCi0JY29taWIsPSAwLCVyOSxMJDA0OTEgOyMgNTAwNCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDUwMDUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNTAwOCBhZGRzaTMvMQotTCQwNDkxCi0JbGR3IDAoJXI1KSwlcjMgOyMgNDkwOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ5MTMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDkxMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDkxMSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ5MwotCW5vcCA7IyA0OTE1IGJsZXUrMQotTCQwNDkyCi0JbGRvIDMoJXI2KSwlcjYgOyMgNTAzMCBhZGRzaTMvMgotCWxkaSAwLCVyOCA7IyA1MDMzIHJlbG9hZF9vdXRzaSsyLzIKLQlibCBMJDAwNDMsJXIwIDsjIDUwMzgganVtcAotCWNvcHkgJXI2LCVyMTIgOyMgNTAzNiByZWxvYWRfb3V0c2krMi8xCi1MJDA1MDYKLQliYiw+PSAlcjE1LDIyLEwkMDM5NyA7IyA1MDQ2IG1vdnNpLTQKLQlsZGkgNDYwOCwlcjIwIDsjIDUwNDggcmVsb2FkX291dHNpKzIvMgotCWFuZCAlcjE1LCVyMjAsJXIxOSA7IyA1MDQ5IGFuZHNpMy8xCi0JY29tYiw9ICVyMjAsJXIxOSxMJDAzOTcgOyMgNTA1MyBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUwNTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4OTc3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gLTIoJXIyMCksJXIxOSA7IyA1MDU2IGFkZHNpMy8yCi0JY29tYiw8PiAlcjEsJXIxOSxMJDExNzUgOyMgNTA1OCBibGV1KzEKLQlsZGkgLTEsJXI0IDsjIDUwNzQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSxuICVyMTYsJXIyMCxMJDAzOTcgOyMgNTA2MiBibGV1KzEKLUwkMTE3NAotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTA3OSByZWxvYWRfb3V0c2krMi81Ci1MJDExNzUKLQljb3B5ICVyNCwlcjExIDsjIDUwNzYgcmVsb2FkX291dHNpKzIvMQotCWNvbWIsPD4gJXIxNiwlcjIwLEwkMDUxNyA7IyA1MDg1IGJsZXUrMQotCWxkbyAtMSglcjIwKSwlcjIzIDsjIDUwODAgYWRkc2kzLzIKLQliYiw+PSxuICVyMTUsMTksTCQwOTE1IDsjIDUwOTIgbW92c2ktNAotCWJsIEwkMTE4MiwlcjAgOyMgNTEwNyBqdW1wCi0Jc3R3ICVyMjMsLTI5NiglcjMwKSA7IyA1OTY4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDUxNwotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTEzNCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTEzNiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTE1IDsjIDUxNDMgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUxMzkgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUxNDQgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTE0NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDUxNQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4MjU3IHBpYzJfbG9fc3VtKzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjEpLCVyMjEgOyMgODI1OSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDgyNjAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDgyNjEgbW92cWkrMS81Ci0JYmIsPj0gJXIxOSwyOSxMJDA1MTMgOyMgODI2NSBtb3ZzaS00Ci0JbGRpIDQsJXIyMCA7IyA4MjYzIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMjAsJXIyMiA7IyA4NTgzIHJlbG9hZF9vdXRzaSsyLzEKLUwkMDUyMgotCWNvbWljbHIsPCAtMSwlcjExLCVyMCA7IyA4MTI4IG1vdnNpY2MrMS8xCi0JbGRpIDAsJXIxMQotCXNoMmFkZGwgJXIxMSwlcjExLCVyMTkgOyMgNTE4OCBhc2hsc2kzLTIKLQlzaDFhZGRsICVyMTksJXI3LCVyMTkgOyMgNTE5MSBhc2hsc2kzLTIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUxOTQgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwNTEzIDsjIDUxOTYgYmxldSsxCi0JbGRvIC00OCglcjE5KSwlcjExIDsjIDUxOTIgYWRkc2kzLzIKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUyMTUgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUyMTcgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUyMCA7IyA1MjI0IGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MjIwIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1MjI1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUyMjggemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MjAKLQlhZGRsICVyMjEsJXI3LCVyMTkgOyMgNTE2NiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNTE2OCBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjIyLCVyMTkgOyMgNTE3MiBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDA1MjIKLQlub3AgOyMgNTE3NCBibGV1KzEKLUwkMDUxMwotCWxkaSA0NCwlcjE5IDsjIDUyNTIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjcsTCQwNTMyIDsjIDUyNTQgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MjU5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDUzMyA7IyA1MjYxIGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTI3OCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTI4MCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTM1IDsjIDUyODcgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUyODMgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUyODggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTI5MSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDUzNQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4MjY5IHBpYzJfbG9fc3VtKzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjEpLCVyMjEgOyMgODI3MSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDgyNzIgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDgyNzMgbW92cWkrMS81Ci0JYmIsPj0gJXIxOSwyOSxMJDA1MzMgOyMgODI3NyBtb3ZzaS00Ci0JbGRpIDQsJXIyMCA7IyA4Mjc1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMjAsJXIyMiA7IyA4NTc4IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU0MgotCWNvbWljbHIsPCAtMSwlcjQsJXIwIDsjIDgxMzIgbW92c2ljYysxLzEKLQlsZGkgMCwlcjQKLQlzaDJhZGRsICVyNCwlcjQsJXIxOSA7IyA1MzMyIGFzaGxzaTMtMgotCXNoMWFkZGwgJXIxOSwlcjcsJXIxOSA7IyA1MzM1IGFzaGxzaTMtMgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTMzOCByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA1MzMgOyMgNTM0MCBibGV1KzEKLQlsZG8gLTQ4KCVyMTkpLCVyNCA7IyA1MzM2IGFkZHNpMy8yCi0JbGRvIDEoJXIyMCksJXIxOSA7IyA1MzU5IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1MzYxIHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA1NDAgOyMgNTM2OCBibGV1KzEKLQlsZGIgMCglcjIwKSwlcjcgOyMgNTM2NCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTM2OSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA1MzcyIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwNTQwCi0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDUzMTAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDUzMTIgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyMiwlcjE5IDsjIDUzMTYgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQwNTQyCi0Jbm9wIDsjIDUzMTggYmxldSsxCi1MJDA1MzMKLQljb21pY2xyLDwgLTEsJXI0LCVyMCA7IyA4MTM2IGJlcS0xLzQKLQl6ZGVwaSAtMSwzMSwxNSwlcjQKLQlibCxuIEwkMDU1MywlcjAgOyMgNTQwMSBqdW1wCi1MJDA1MzIKLQljb3B5ICVyMTEsJXI0IDsjIDU0MDYgcmVsb2FkX291dHNpKzIvMQotTCQwNTUzCi0JY29taWIsPiAwLCVyMTEsTCQwOTUxIDsjIDU0MTAgYmxldSsxCi0JemRlcGkgLTEsMzEsMTUsJXIxOSA7IyA1NDEyIHJlbG9hZF9vdXRzaSsyLzQKLQljb21iLDwsbiAlcjE5LCVyNCxMJDA5NTEgOyMgNTQxNCBibGV1KzEKLQljb21iLDwsbiAlcjQsJXIxMSxMJDA5NTEgOyMgNTQxNiBibGV1KzEKLQliYiw8ICVyMTUsMTksTCQxMTc2IDsjIDU0NTEgYmxldSszCi0JbGRpIDEyNSwlcjE5IDsjIDU1MTQgcmVsb2FkX291dHNpKzIvMgotCWxkaSA5MiwlcjE5IDsjIDU0NTUgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjcsTCQwOTE1IDsjIDU0NTcgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1NDczIHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDkyMiA7IyA1NDc1IGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTQ4NCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTQ4NiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTU4IDsjIDU0OTMgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDU0ODkgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDU0OTQgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTQ5NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDU1OAotCWxkaSAxMjUsJXIxOSA7IyA1NTE0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE3NgotCWNvbWIsPSxuICVyMTksJXI3LEwkMDU2NiA7IyA1NTE2IGJsZXUrMQotTCQwOTUxCi0JYmIsPCxuICVyMTUsMTksTCQwNTExIDsjIDU1MjMgYmxldSszCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA1NTM0IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA1NTMyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDU1MzgganVtcAotCWxkaSAxMCwlcjI4IDsjIDU1MzYgcmVsb2FkX291dHNpKzIvMgotTCQwNTY2Ci0JY29taWIsPD4sbiAwLCVyOCxMJDA1NjkgOyMgNTU0NSBibGV1KzEKLQliYiw8LG4gJXIxNSwyNixMJDA5MTcgOyMgNTU1MiBibGV1KzMKLQliYiw+PSxuICVyMTUsMjcsTCQwNTExIDsjIDU1NzEgbW92c2ktNAotCWNvcHkgJXI2LCVyOCA7IyA1NTc0IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU2OQotCWNvbWliLDw+IDAsJXI0LEwkMDU3NCA7IyA1NTg3IGJsZXUrMQotCWxkaSAxMCwlcjEzIDsjIDg5ODAgcmVsb2FkX291dHNpKzIvMgotCWxkdyAwKCVyNSksJXIzIDsjIDgxMzkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTQyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgxNDAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxNDEgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA1NzYgOyMgODE0MyBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg1NzMgcmVsb2FkX291dHNpKzIvMwotTCQwNTc3Ci0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyA1NjEzIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDU2MjMgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwNTgyIDsjIDU2MzEgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDU2MjUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDU2MzQgcmVsb2FkX291dHNpKzIvNgotTCQwNTgyCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDU2NDEgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNTY0NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA1NjQzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNTY1MyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNTY0OSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDU3NSA7IyA1NjYzIGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNTY2NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA1NjY4IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXIzLCVyMTkgOyMgNTY2OSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDU4NSA7IyA1Njc0IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNTY3MiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDU2NzUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDU2NzggYWRkc2kzLzEKLUwkMDU4NQotCWNvbWliLD0gMCwlcjgsTCQwNTg2IDsjIDU2ODEgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyA1NjgyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDU2ODUgYWRkc2kzLzEKLUwkMDU4NgotCWNvbWliLD0gMCwlcjksTCQwNTc1IDsjIDU2ODggYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyA1Njg5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDU2OTIgYWRkc2kzLzEKLUwkMDU3NQotCWxkdyAwKCVyNSksJXIzIDsjIDU1OTMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA1NTk3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU1OTQgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDU1OTUgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA1NzcKLQlub3AgOyMgNTU5OSBibGV1KzEKLUwkMDU3NgotCWxkaSAxMiwlcjI2IDsjIDU3MTggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTcyMCByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyA1NzIyIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyA1NzI2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyA1NzI0IHJlbG9hZF9vdXRzaSsyLzEKLQlibCBMJDA1OTAsJXIwIDsjIDU3MzAganVtcAotCWxkbyAzKCVyNiksJXI2IDsjIDU3MjggYWRkc2kzLzIKLUwkMDU3NAotCWNvbWljbHIsPiAyLCVyNCwlcjAgOyMgODI4MiBiZXEtMS8yCi0JbGRpIDIwLCVyMTMKLQlsZHcgMCglcjUpLCVyMyA7IyA4Mjg1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODI4OCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4Mjg2IHN1YnNpMy8xCi0JYWRkbCAlcjE5LCVyMTMsJXIxOSA7IyA4Mjg3IGFkZHNpMy8xCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwODY4IDsjIDgyODkgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNyA7IyA4NTcxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDU5NQotCWNvbWIsPSAlcjcsJXIyMCxMJDA5NDQgOyMgNTc2OSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1Nzc5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNywlcjE5LEwkMDYwMCA7IyA1Nzg3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NzgxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LDQoJXI1KSA7IyA1NzkwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDYwMAotCWxkdyAwKCVyNSksJXIyNiA7IyA1Nzk3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU4MDEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTc5OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDU4MDkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU4MDUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA1OTMgOyMgNTgxOSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU4MjEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTgyNCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDU4MjUgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2MDMgOyMgNTgzMCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU4MjggYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA1ODMxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA1ODM0IGFkZHNpMy8xCi1MJDA2MDMKLQljb21pYiw9IDAsJXI4LEwkMDYwNCA7IyA1ODM3IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNTgzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA1ODQxIGFkZHNpMy8xCi1MJDA2MDQKLQljb21pYiw9IDAsJXI5LEwkMDU5MyA7IyA1ODQ0IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNTg0NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA1ODQ4IGFkZHNpMy8xCi1MJDA1OTMKLQlsZHcgMCglcjUpLCVyMyA7IyA1NzQ5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTc1MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1NzUwIHN1YnNpMy8xCi0JYWRkbCAlcjE5LCVyMTMsJXIxOSA7IyA1NzUxIGFkZHNpMy8xCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNTk1Ci0Jbm9wIDsjIDU3NTUgYmxldSsxCi1MJDA4NjgKLQljb21pYiw+PSAxLCVyNCxMJDA2MDggOyMgNTg3MiBibGV1KzEKLQlsZG8gNSglcjYpLCVyMTkgOyMgNTg3MCBhZGRzaTMvMgotCXN1YiAlcjE5LCVyOCwlcjE5IDsjIDU4NzQgc3Vic2kzLzEKLQlibCBMJDA2MDksJXIwIDsjIDU4NzYganVtcAotCWxkbyAyKCVyMTkpLCVyMjQgOyMgNTg3NSBhZGRzaTMvMgotTCQwNjA4Ci0Jc3ViICVyMTksJXI4LCVyMTkgOyMgNTg3OSBzdWJzaTMvMQotCWxkbyAtMyglcjE5KSwlcjI0IDsjIDU4ODAgYWRkc2kzLzIKLUwkMDYwOQotCWxkaSAyMCwlcjI2IDsjIDU4ODUgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTg4NyByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjExLCVyMjMgOyMgNTg5MSByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1ODkzIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTg4MyByZWxvYWRfb3V0c2krMi82Ci0JbGRvIDUoJXI2KSwlcjYgOyMgNTg5NSBhZGRzaTMvMgotCWxkaSAyMiwlcjI2IDsjIDU5MDAgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTkwMiByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDUsJXIyNCA7IyA1OTA0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTEsJXIyMyA7IyA1OTA2IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluc2VydF9vcDIsJXIyIDsjIDU5MDggY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXI2LC01MiglcjMwKSA7IyA1ODk4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw+PSAxLCVyNCxMJDA1OTAgOyMgNTkxMyBibGV1KzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTEwIGFkZHNpMy8yCi0JbGRpIDIxLCVyMjYgOyMgNTkyMSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjYsJXIyNSA7IyA1OTIzIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDU5MTcgc3Vic2kzLzEKLQlsZG8gMiglcjI0KSwlcjI0IDsjIDU5MjUgYWRkc2kzLzIKLQlsZG8gLTEoJXI0KSwlcjQgOyMgNTkxOSBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgc3RvcmVfb3AyLCVyMiA7IyA1OTI5IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyMyA7IyA1OTI3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTMxIGFkZHNpMy8yCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTkzNiByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDIyLCVyMjYgOyMgNTkzOCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjgsJXIyNSA7IyA1OTQwIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyOCwlcjI0IDsjIDU5NDIgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluc2VydF9vcDIsJXIyIDsjIDU5NDYgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjIzIDsjIDU5NDQgcmVsb2FkX291dHNpKzIvMQotCWxkbyA1KCVyNiksJXI2IDsjIDU5NDggYWRkc2kzLzIKLUwkMDU5MAotCWJsIEwkMDA0MywlcjAgOyMgNTk2MyBqdW1wCi0JbGRpIDAsJXI5IDsjIDU5NTYgcmVsb2FkX291dHNpKzIvMgotTCQwNTExCi0Jc3R3ICVyMjMsLTI5NiglcjMwKSA7IyA1OTY4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMTE4MgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTk3NyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgNTk3OSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjIxIDsjIDU5ODggYWRkc2kzLzIKLQlsZGIgMCglcjIwKSwlcjIwIDsjIDU5OTIgbW92cWkrMS81Ci0Jc3R3ICVyMjEsLTI5NiglcjMwKSA7IyA1OTkwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA2MTIgOyMgNTk5NyBibGV1KzEKLQlleHRydSAlcjIwLDMxLDgsJXI3IDsjIDU5OTMgemVyb19leHRlbmRxaXNpMi8xCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDU5OTggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNjAwMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDYxMgotCWJiLDwgJXIxNSwxOSxMJDAwNzYgOyMgNjAxOSBibGV1KzMKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODk4MyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw+Pj0gJXIxLCVyMjEsTCQwMDc2IDsjIDYwMjUgYmxldSsxCi0JZXh0cnMgJXIyMCwzMSw4LCVyMjAgOyMgNjAzMCBleHRlbmRxaXNpMgotCWxkaSA5MiwlcjE5IDsjIDYwMzIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSxuICVyMTksJXIyMCxMJDAzOTcgOyMgNjAzNCBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAgOyMgNjA0MiBqdW1wCi1MJDA2MTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE1MSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTQ5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTUwIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDYyNCA7IyA4MTUyIGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyA2MDQ3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjkgcmVsb2FkX291dHNpKzIvMwotTCQwNjI1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2MDc1IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDYwODUgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjMwIDsjIDYwOTMgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDYwODcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDYwOTYgcmVsb2FkX291dHNpKzIvNgotTCQwNjMwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDYxMDMgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjEwNyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2MTA1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjExNSBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDYxMTEgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2MjMgOyMgNjEyNSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDYxMjcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjEzMCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDYxMzEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2MzMgOyMgNjEzNiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDYxMzQgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2MTM3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2MTQwIGFkZHNpMy8xCi1MJDA2MzMKLQljb21pYiw9IDAsJXI4LEwkMDYzNCA7IyA2MTQzIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjE0NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2MTQ3IGFkZHNpMy8xCi1MJDA2MzQKLQljb21pYiw9IDAsJXI5LEwkMDYyMyA7IyA2MTUwIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjE1MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2MTU0IGFkZHNpMy8xCi1MJDA2MjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2MDU1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjA1OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MDU2IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2MDU3IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjI1Ci0Jbm9wIDsjIDYwNjEgYmxldSsxCi1MJDA2MjQKLQlsZGkgMjMsJXIxOSA7IyA2MTc2IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjE4OSBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2MTc3IG1vdnFpKzEvNgotTCQwNjM5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE1NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE1OCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA2NDQgOyMgODE2MCBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNjE5NCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY3IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDY0NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjIyMiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2MjMyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDY1MCA7IyA2MjQwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2MjM0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2MjQzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDY1MAotCWxkdyAwKCVyNSksJXIyNiA7IyA2MjUwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYyNTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjI1MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDYyNjIgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2MjU4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjQzIDsjIDYyNzIgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2Mjc0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDYyNzcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2Mjc4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjUzIDsjIDYyODMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2MjgxIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjI4NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjI4NyBhZGRzaTMvMQotTCQwNjUzCi0JY29taWIsPSAwLCVyOCxMJDA2NTQgOyMgNjI5MCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDYyOTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjI5NCBhZGRzaTMvMQotTCQwNjU0Ci0JY29taWIsPSAwLCVyOSxMJDA2NDMgOyMgNjI5NyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDYyOTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjMwMSBhZGRzaTMvMQotTCQwNjQzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjIwMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYyMDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjIwMyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjIwNCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDY0NQotCW5vcCA7IyA2MjA4IGJsZXUrMQotTCQwNjQ0Ci0JbGRpIDI0LCVyMTkgOyMgNjMyMyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDYzMzYganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjMyNCBtb3ZxaSsxLzYKLUwkMDY1OQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTY3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNjUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNjYgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA2NjQgOyMgODE2OCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjUgcmVsb2FkX291dHNpKzIvMwotTCQwNjY1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2MzY2IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDYzNzYgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjcwIDsjIDYzODQgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDYzNzggcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDYzODcgcmVsb2FkX291dHNpKzIvNgotTCQwNjcwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDYzOTQgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjM5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2Mzk2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjQwNiBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY0MDIgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2NjMgOyMgNjQxNiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY0MTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjQyMSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY0MjIgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2NzMgOyMgNjQyNyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY0MjUgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2NDI4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2NDMxIGFkZHNpMy8xCi1MJDA2NzMKLQljb21pYiw9IDAsJXI4LEwkMDY3NCA7IyA2NDM0IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjQzNSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2NDM4IGFkZHNpMy8xCi1MJDA2NzQKLQljb21pYiw9IDAsJXI5LEwkMDY2MyA7IyA2NDQxIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjQ0MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2NDQ1IGFkZHNpMy8xCi1MJDA2NjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2MzQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjM1MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MzQ3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2MzQ4IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjY1Ci0Jbm9wIDsjIDYzNTIgYmxldSsxCi1MJDA2NjQKLQlsZGkgMjUsJXIxOSA7IyA2NDY3IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjQ4MCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2NDY4IG1vdnFpKzEvNgotTCQwNjc5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNzUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE3MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE3NCBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDY4NCA7IyA4MTc2IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2MyByZWxvYWRfb3V0c2krMi8zCi1MJDA2ODUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY1MTAgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjUyMCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA2OTAgOyMgNjUyOCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjUyMiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjUzMSByZWxvYWRfb3V0c2krMi82Ci1MJDA2OTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjUzOCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2NTQyIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY1NDAgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2NTUwIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjU0NiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDY4MyA7IyA2NTYwIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjU2MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2NTY1IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjU2NiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDY5MyA7IyA2NTcxIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjU2OSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDY1NzIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDY1NzUgYWRkc2kzLzEKLUwkMDY5MwotCWNvbWliLD0gMCwlcjgsTCQwNjk0IDsjIDY1NzggYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2NTc5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDY1ODIgYWRkc2kzLzEKLUwkMDY5NAotCWNvbWliLD0gMCwlcjksTCQwNjgzIDsjIDY1ODUgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2NTg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDY1ODkgYWRkc2kzLzEKLUwkMDY4MwotCWxkdyAwKCVyNSksJXI0IDsjIDY0OTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2NDk0IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY0OTEgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY0OTIgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA2ODUKLQlub3AgOyMgNjQ5NiBibGV1KzEKLUwkMDY4NAotCWxkaSAyNiwlcjE5IDsjIDY2MTEgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NjI0IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDY2MTIgbW92cWkrMS82Ci1MJDA2OTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE4MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTgxIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTgyIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzA0IDsjIDgxODQgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTYxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDcwNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjY1NCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2NjY0IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDcxMCA7IyA2NjcyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2NjY2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2Njc1IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDcxMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2NjgyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDY2ODYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjY4NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY2OTQgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2NjkwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzAzIDsjIDY3MDQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NzA2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY3MDkgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2NzEwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzEzIDsjIDY3MTUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2NzEzIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjcxNiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjcxOSBhZGRzaTMvMQotTCQwNzEzCi0JY29taWIsPSAwLCVyOCxMJDA3MTQgOyMgNjcyMiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY3MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjcyNiBhZGRzaTMvMQotTCQwNzE0Ci0JY29taWIsPSAwLCVyOSxMJDA3MDMgOyMgNjcyOSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY3MzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjczMyBhZGRzaTMvMQotTCQwNzAzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjYzNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDY2MzggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjYzNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjYzNiBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDcwNQotCW5vcCA7IyA2NjQwIGJsZXUrMQotTCQwNzA0Ci0JbGRpIDI3LCVyMTkgOyMgNjc1NSBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY3NjgganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjc1NiBtb3ZxaSsxLzYKLUwkMDcxOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTkxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxODkgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxOTAgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA3MjQgOyMgODE5MiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTkgcmVsb2FkX291dHNpKzIvMwotTCQwNzI1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2Nzk4IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY4MDggYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNzMwIDsjIDY4MTYgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY4MTAgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY4MTkgcmVsb2FkX291dHNpKzIvNgotTCQwNzMwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY4MjYgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjgzMCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2ODI4IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjgzOCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY4MzQgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA3MjMgOyMgNjg0OCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY4NTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjg1MyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY4NTQgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA3MzMgOyMgNjg1OSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY4NTcgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2ODYwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2ODYzIGFkZHNpMy8xCi1MJDA3MzMKLQljb21pYiw9IDAsJXI4LEwkMDczNCA7IyA2ODY2IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjg2NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2ODcwIGFkZHNpMy8xCi1MJDA3MzQKLQljb21pYiw9IDAsJXI5LEwkMDcyMyA7IyA2ODczIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjg3NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2ODc3IGFkZHNpMy8xCi1MJDA3MjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2Nzc4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjc4MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2Nzc5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2NzgwIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNzI1Ci0Jbm9wIDsjIDY3ODQgYmxldSsxCi1MJDA3MjQKLQlsZGkgMjgsJXIxOSA7IyA2ODk5IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjkxMiBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2OTAwIG1vdnFpKzEvNgotTCQwNzM5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxOTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE5NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE5OCBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDc0NCA7IyA4MjAwIGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU1NyByZWxvYWRfb3V0c2krMi8zCi1MJDA3NDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY5NDIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjk1MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3NTAgOyMgNjk2MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjk1NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjk2MyByZWxvYWRfb3V0c2krMi82Ci1MJDA3NTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjk3MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2OTc0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY5NzIgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2OTgyIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjk3OCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc0MyA7IyA2OTkyIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjk5NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2OTk3IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjk5OCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDc1MyA7IyA3MDAzIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzAwMSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDcwMDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDcwMDcgYWRkc2kzLzEKLUwkMDc1MwotCWNvbWliLD0gMCwlcjgsTCQwNzU0IDsjIDcwMTAgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MDExIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDcwMTQgYWRkc2kzLzEKLUwkMDc1NAotCWNvbWliLD0gMCwlcjksTCQwNzQzIDsjIDcwMTcgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MDE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDcwMjEgYWRkc2kzLzEKLUwkMDc0MwotCWxkdyAwKCVyNSksJXI0IDsjIDY5MjIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2OTI2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY5MjMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY5MjQgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3NDUKLQlub3AgOyMgNjkyOCBibGV1KzEKLUwkMDc0NAotCWxkaSAxMCwlcjE5IDsjIDcwNDMgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA3MDU2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDcwNDQgbW92cWkrMS82Ci1MJDA3NTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIwNyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjA1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MjA2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzY0IDsjIDgyMDggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTU1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDc2NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzA4NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3MDk2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDc3MCA7IyA3MTA0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3MDk4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3MTA3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDc3MAotCWxkdyAwKCVyNSksJXIyNiA7IyA3MTE0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDcxMTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzExNiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDcxMjYgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3MTIyIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzYzIDsjIDcxMzYgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3MTM4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDcxNDEgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3MTQyIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzczIDsjIDcxNDcgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3MTQ1IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzE0OCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzE1MSBhZGRzaTMvMQotTCQwNzczCi0JY29taWIsPSAwLCVyOCxMJDA3NzQgOyMgNzE1NCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDcxNTUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzE1OCBhZGRzaTMvMQotTCQwNzc0Ci0JY29taWIsPSAwLCVyOSxMJDA3NjMgOyMgNzE2MSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDcxNjIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzE2NSBhZGRzaTMvMQotTCQwNzYzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNzA2NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDcwNzAgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzA2NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzA2OCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDc2NQotCW5vcCA7IyA3MDcyIGJsZXUrMQotTCQwNzY0Ci0JbGRpIDExLCVyMTkgOyMgNzE4NyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDcyMDAganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzE4OCBtb3ZxaSsxLzYKLUwkMDc4NwotCWJiLDwgJXIxNSwxNyxMJDAwNzYgOyMgNzIxNiBibGV1KzMKLQlsZG8gLTQ4KCVyNyksJXIxOSA7IyA3MjI0IGFkZHNpMy8yCi0JbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5ODYgcmVsb2FkX291dHNpKzIvNQotCWV4dHJ1ICVyMTksMzEsOCwlcjMgOyMgNzIyNSB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21iLDw8ICVyMSwlcjMsTCQwOTM5IDsjIDcyMzAgYmxldSsxCi0JbGRvIC0zMTIoJXIzMCksJXIyNiA7IyA3MjQ0IGFkZHNpMy8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBncm91cF9pbl9jb21waWxlX3N0YWNrLCVyMiA7IyA3MjQ4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjMsJXIyNSA7IyA3MjQ2IHJlbG9hZF9vdXRzaSsyLzEKLQlleHRycyAlcjI4LDMxLDgsJXIyOCA7IyA3MjUxIGV4dGVuZHFpc2kyCi0JY29taWIsPD4sbiAwLCVyMjgsTCQwMDc2IDsjIDcyNTMgYmxldSsxCi0JbGR3IDAoJXI1KSwlcjQgOyMgODIxMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMTUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIxMyBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgODIxNCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA3OTUgOyMgODIxNiBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNzI2MCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyNyA7IyA4NTUzIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDc5NgotCWNvbWIsPSAlcjcsJXIyMCxMJDA5NDQgOyMgNzI4OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3Mjk4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNywlcjE5LEwkMDgwMSA7IyA3MzA2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3MzAwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LDQoJXI1KSA7IyA3MzA5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDgwMQotCWxkdyAwKCVyNSksJXIyNiA7IyA3MzE2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDczMjAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzMxOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDczMjggYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3MzI0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzk0IDsjIDczMzggYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3MzQwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDczNDMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3MzQ0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODA0IDsjIDczNDkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3MzQ3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzM1MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzM1MyBhZGRzaTMvMQotTCQwODA0Ci0JY29taWIsPSAwLCVyOCxMJDA4MDUgOyMgNzM1NiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDczNTcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzM2MCBhZGRzaTMvMQotTCQwODA1Ci0JY29taWIsPSAwLCVyOSxMJDA3OTQgOyMgNzM2MyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDczNjQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzM2NyBhZGRzaTMvMQotTCQwNzk0Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzI2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDcyNzIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzI2OSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgNzI3MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDc5NgotCW5vcCA7IyA3Mjc0IGJsZXUrMQotTCQwNzk1Ci0JbGRpIDcsJXIxOSA7IyA3Mzg5IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzM5MCBtb3ZxaSsxLzYKLQlibCBMJDAwNDMsJXIwIDsjIDc0MDUganVtcAotCXN0YnMsbWEgJXIzLDEoJXI2KSA7IyA3MzkzIG1vdnFpKzEvNgotTCQwODExCi0JYmIsPCAlcjE1LDMwLEwkMDEwNAotCW5vcCA7IyA3NDE0IGJsZXUrMwotTCQwMzk3Ci0JY29taWIsPSAwLCVyMTQsTCQwODE1IDsjIDc0MjkgYmxldSsxCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDc0MzAgYWRkc2kzLzEKLQlibCBMJDA4MTYsJXIwIDsjIDc0MzQganVtcAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNzQzMyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDgxNQotCWNvcHkgJXI3LCVyMTkgOyMgNzQzOCByZWxvYWRfb3V0c2krMi8xCi1MJDA4MTYKLQljb3B5ICVyMTksJXI3IDsjIDc0NDEgcmVsb2FkX291dHNpKzIvMQotTCQwMDc2Ci0JY29taWIsPSxuIDAsJXI5LEwkMDgyMCA7IyA3NDYwIGJsZXUrMQotCWxkYiAwKCVyOSksJXIyMCA7IyA3NDYzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXI5LCVyMjAsJXIxOSA7IyA3NDY0IGFkZHNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3NDY1IGFkZHNpMy8yCi0JY29tYiw8PiAlcjYsJXIxOSxMJDA4MjAgOyMgNzQ2NyBibGV1KzEKLQlsZGkgMjU1LCVyMTkgOyMgNzQ3MiByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzQ3NCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIxIDsjIDc0NzYgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgNzQ3OCBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIyMCA7IyA3NDc5IGV4dGVuZHFpc2kyCi0JbGRpIDQyLCVyMTkgOyMgNzQ4MSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzQ4MyBibGV1KzEKLQlsZGkgOTQsJXIxOSA7IyA3NDkwIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwODIwIDsjIDc0OTIgYmxldSsxCi0JYmIsPj0gJXIxNSwzMCxMJDA4MjEgOyMgNzQ5NyBtb3ZzaS00Ci0JbGRpIDkyLCVyMTkgOyMgNzUwNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PixuICVyMTksJXIyMCxMJDA4MjIgOyMgNzUwNiBibGV1KzEKLQlsZGIgMSglcjIxKSwlcjE5IDsjIDc1MTAgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgNzUxMSBleHRlbmRxaXNpMgotTCQwODIxCi0JbGRpIDQzLCVyMTkgOyMgNzUzNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzUzNiBibGV1KzEKLQlsZGkgNjMsJXIxOSA7IyA3NTQzIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwODIwIDsjIDc1NDUgYmxldSsxCi1MJDA4MjIKLQliYiw+PSxuICVyMTUsMjIsTCQwODE5IDsjIDc1NTMgbW92c2ktNAotCWJiLD49ICVyMTUsMTksTCQwODIzIDsjIDc1NTggbW92c2ktNAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgNzU2MCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyA3NTYyIG1vdnFpKzEvNQotCWxkaSAxMjMsJXIyMCA7IyA3NTY1IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NTYzIGV4dGVuZHFpc2kyCi0JY29tYiw9LG4gJXIyMCwlcjE5LEwkMDgyMCA7IyA3NTY3IGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgyMjggcmVsb2FkX291dHNpKzIvNQotCWJsLG4gTCQxMTc3LCVyMCA7IyA3NTY4IGp1bXAKLUwkMDgyMwotCWxkdyAtMjk2KCVyMzApLCVyMjEgOyMgNzU3MiByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIyMSksJXIxOSA7IyA3NTc0IG1vdnFpKzEvNQotCWxkaSA5MiwlcjIwIDsjIDc1NzcgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDc1NzUgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIyMCwlcjE5LEwkMDgxOSA7IyA3NTc5IGJsZXUrMQotCWxkYiAxKCVyMjEpLCVyMTkgOyMgNzU4MyBtb3ZxaSsxLzUKLQlsZGkgMTIzLCVyMjAgOyMgNzU4NiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzU4NCBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjIwLCVyMTksTCQwODE5IDsjIDc1ODggYmxldSsxCi1MJDA4MjAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjIwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIyMyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjIxIHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA4MjIyIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDgyOSA7IyA4MjI0IGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyA3NTk2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTEgcmVsb2FkX291dHNpKzIvMwotTCQwODMwCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA3NjI0IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDc2MzQgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwODM1IDsjIDc2NDIgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDc2MzYgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDc2NDUgcmVsb2FkX291dHNpKzIvNgotTCQwODM1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDc2NTIgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNzY1NiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA3NjU0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNzY2NCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDc2NjAgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA4MjggOyMgNzY3NCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc2NzYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNzY3OSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDc2ODAgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA4MzggOyMgNzY4NSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDc2ODMgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3Njg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3Njg5IGFkZHNpMy8xCi1MJDA4MzgKLQljb21pYiw9IDAsJXI4LEwkMDgzOSA7IyA3NjkyIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzY5MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3Njk2IGFkZHNpMy8xCi1MJDA4MzkKLQljb21pYiw9IDAsJXI5LEwkMDgyOCA7IyA3Njk5IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzcwMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3NzAzIGFkZHNpMy8xCi1MJDA4MjgKLQlsZHcgMCglcjUpLCVyNCA7IyA3NjA0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzYwOCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3NjA1IHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA3NjA2IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwODMwCi0Jbm9wIDsjIDc2MTAgYmxldSsxCi1MJDA4MjkKLQlsZGkgMSwlcjE5IDsjIDc3MjUgbW92cWkrMS8yCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA3NzI2IG1vdnFpKzEvNgotCXN0YnMsbWEgJXIwLDEoJXI2KSA7IyA3NzI5IG1vdnFpKzEvNgotCWxkbyAtMSglcjYpLCVyOSA7IyA3NzQxIGFkZHNpMy8yCi1MJDA4MTkKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjI4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE3NwotCWxkdyA0KCVyNSksJXIyMCA7IyA4MjMxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgyMjkgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgyMzAgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA4NDggOyMgODIzMiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NDkgcmVsb2FkX291dHNpKzIvMwotTCQwODQ5Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA3NzcxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDc3ODEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwODU0IDsjIDc3ODkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDc3ODMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDc3OTIgcmVsb2FkX291dHNpKzIvNgotTCQwODU0Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDc3OTkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNzgwMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA3ODAxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNzgxMSBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDc4MDcgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA4NDcgOyMgNzgyMSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc4MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNzgyNiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDc4Mjcgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA4NTcgOyMgNzgzMiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDc4MzAgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3ODMzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3ODM2IGFkZHNpMy8xCi1MJDA4NTcKLQljb21pYiw9IDAsJXI4LEwkMDg1OCA7IyA3ODM5IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzg0MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3ODQzIGFkZHNpMy8xCi1MJDA4NTgKLQljb21pYiw9IDAsJXI5LEwkMDg0NyA7IyA3ODQ2IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzg0NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3ODUwIGFkZHNpMy8xCi1MJDA4NDcKLQlsZHcgMCglcjUpLCVyNCA7IyA3NzUxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzc1NSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3NzUyIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3NzUzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwODQ5Ci0Jbm9wIDsjIDc3NTcgYmxldSsxCi1MJDA4NDgKLQlzdGJzLG1hICVyNywxKCVyNikgOyMgNzg3MiBtb3ZxaSsxLzYKLQlsZGIgMCglcjkpLCVyMTkgOyMgNzg4NSBtb3ZxaSsxLzUKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc4ODggYWRkc2kzLzIKLQlzdGIgJXIxOSwwKCVyOSkgOyMgNzg5MCBtb3ZxaSsxLzYKLUwkMDA0MwotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMyOCByZWxvYWRfb3V0c2krMi81Ci1MJDExNjEKLQljb21jbHIsPSAlcjE2LCVyMTksJXIwIDsjIDI1OCBibGV1KzEKLQlibCBMJDExNzgsJXIwCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyMzM0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMDA0NAotCWNvbWliLD0gMCwlcjEwLEwkMDg2NSA7IyA3OTEzIGJsZXUrMQotCWxkaSAxMywlcjI2IDsjIDc5MTggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMCwlcjI1IDsjIDc5MjAgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXIyNSwlcjI0IDsjIDc5MTUgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNzkyNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDc5MjIgYWRkc2kzLzIKLUwkMDg2NQotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNzkyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwODY2IDsjIDc5MzAgYmxldSsxCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3OTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3OTQ0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgNzk0OSByZWxvYWRfb3V0c2krMi81Ci0JbGRpIDAsJXIyOCA7IyA3OTU1IHJlbG9hZF9vdXRzaSsyLzIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyA3OTUwIHN1YnNpMy8xCi0JYmwgTCQwODY3LCVyMCA7IyA3OTU3IGp1bXAKLQlzdHcgJXIxOSw4KCVyNSkgOyMgNzk1MiByZWxvYWRfb3V0c2krMi82Ci1MJDA4OTUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDIyNjkgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDIyNjcgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMjI3MyBqdW1wCi0JbGRpIDExLCVyMjggOyMgMjI3MSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MDAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDMxNjEgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDMxNTkgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMzE2NSBqdW1wCi0JbGRpIDQsJXIyOCA7IyAzMTYzIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkwMgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMzIxOCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzIxNiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAzMjIyIGp1bXAKLQlsZGkgNywlcjI4IDsjIDMyMjAgcmVsb2FkX291dHNpKzIvMgotTCQwOTAzCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAzODAzIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzODAxIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDM4MDcganVtcAotCWxkaSA1LCVyMjggOyMgMzgwNSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MTUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDU0NjEgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDU0NTkgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNTQ2NSBqdW1wCi0JbGRpIDksJXIyOCA7IyA1NDYzIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkxNwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNTU1NyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNTU1NSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyA1NTYxIGp1bXAKLQlsZGkgMTMsJXIyOCA7IyA1NTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkyMgotCWJsIEwkMDg2NywlcjAgOyMgNTk4MyBqdW1wCi0JbGRpIDE0LCVyMjggOyMgNTk4MSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MzkKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDcyMzUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDcyMzMgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNzIzOSBqdW1wCi0JbGRpIDYsJXIyOCA7IyA3MjM3IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDk0NAotCWJsIEwkMDg2NywlcjAgOyMgNzc3NSBqdW1wCi0JbGRpIDE1LCVyMjggOyMgNzc3MyByZWxvYWRfb3V0c2krMi8yCi1MJDA4NjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDc5MzUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDc5MzMgcmVsb2FkX291dHNpKzIvNQotCWxkaSA4LCVyMjggOyMgNzkzNyByZWxvYWRfb3V0c2krMi8yCi1MJDA4NjcKLQlsZHcgLTM0MCglcjMwKSwlcjIgOyMgOTAyNiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNjgoJXIzMCksJXIxOCA7IyA5MDI4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE2NCglcjMwKSwlcjE3IDsjIDkwMzAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTYwKCVyMzApLCVyMTYgOyMgOTAzMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNTYoJXIzMCksJXIxNSA7IyA5MDM0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE1MiglcjMwKSwlcjE0IDsjIDkwMzYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTQ4KCVyMzApLCVyMTMgOyMgOTAzOCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNDQoJXIzMCksJXIxMiA7IyA5MDQwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE0MCglcjMwKSwlcjExIDsjIDkwNDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTM2KCVyMzApLCVyMTAgOyMgOTA0NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMzIoJXIzMCksJXI5IDsjIDkwNDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTI4KCVyMzApLCVyOCA7IyA5MDQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEyNCglcjMwKSwlcjcgOyMgOTA1MCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMjAoJXIzMCksJXI2IDsjIDkwNTIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTE2KCVyMzApLCVyNSA7IyA5MDU0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTExMiglcjMwKSwlcjQgOyMgOTA1NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMDgoJXIzMCksJXIzIDsjIDkwNTggcmVsb2FkX291dHNpKzIvNQotCWJ2ICVyMCglcjIpIDsjIDkwNjEgcmV0dXJuX2ludGVybmFsCi0JbGRvIC0zMjAoJXIzMCksJXIzMCA7IyA5MDYwIGFkZHNpMy8yCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5kYXRhCi0KLQkuYWxpZ24gMQotcmVfc3ludGF4X3RhYmxlCi0JLmJsb2NrIDI1NgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9jb21tb24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwN2ZkMDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9jb21tb24ucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5jb2RlCi10ZXh0X3N5bWJvbDoJCi0JLmxvbmcJMQotCS5sb25nCWV4dGVybmFsX3N5bWJvbAotCS5kYXRhCi1kYXRhX3N5bWJvbDoKLQkubG9uZwkyCi1jb21tb25fc3ltYm9sCS5jb21tCTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9mcmFnYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjlhODYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9mcmFnYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkuY29kZQotCW5vcAkJCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9nbG9iYWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZjA1ZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9nbG9iYWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQotCS5zcGFjZSAkUFJJVkFURSQKLQkuc3Vic3BhICRHTE9CQUwkCi0JLmV4cG9ydCAkZ2xvYmFsJAotJGdsb2JhbCQKLQkuc3BhY2UgJFRFWFQkCi0JLnN1YnNwYSAkQ09ERSQKLQotCS5wcm9jCi0JLmNhbGxpbmZvCi1pdmFhZGRyCi0Jbm9wCi0Jbm9wCi0JYWRkaWwgTCVpdmFhZGRyLSRnbG9iYWwkLCVkcAotCWxkbyAgIFIlaXZhYWRkci0kZ2xvYmFsJCglcjEpLCVyMTkKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlN2UwNGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGZvbyxEQVRBCi0JLmRhdGEKLQotCS5hbGlnbiA0Ci1mb286Ci0JLndvcmQgMAotCS5JTVBPUlQgX19tYWluLENPREUKLQotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCS5pbXBvcnQgZm9vCi0Jc3R3ICVyMiwtMjAoMCwlcjMwKQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSw2NCglcjMwKQotCS5DQUxMIAotCWJsIF9fbWFpbiwlcjIKLQlub3AKLUwkMDAwMToKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xhYmVsZGlmZnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbGFiZWxkaWZmcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQ3ZWMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbGFiZWxkaWZmcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotOyBTaG91bGQgY2hlY2sgdG8gbWFrZSBzdXJlIHNvbWV0aGluZyB1c2VmdWwgZ2V0cyBwdXQgb24gdGhvc2UgLndvcmQKLTsgc3RhdGVtZW50cy4KLQkuY29kZQotCi0JLmFsaWduCTgKLQkuZXhwb3J0CWljb2RlLGRhdGEKLWljb2RlOgotCS5wcm9jCi0JLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKLQkuZW50cnkKLQlidixuCSVyMCglcjIpCi0JLmV4aXQKLQlub3AKLQkucHJvY2VuZAotCi0JOwotCTsgRklSU1QsIGFyZ3YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYXJncywgMXN0IGlzIHNhbWUgYXMgcGF0aC4KLQk7Ci0JLmFsaWduCTgKLWljX2FyZ3Y6Ci0JLndvcmQJaWNfYXJndjEtaWNvZGUJOyBzZWNvbmQsIHBvaW50ZXIgdG8gMXN0IGFyZ3VtZW50Ci0JLndvcmQJaWNfcGF0aC1pY29kZQkJOyBmaXJzdCwgIHBvaW50ZXIgdG8gaW5pdCBwYXRoCi0JLndvcmQJMAkJCTsgZm91cnRoLCBOVUxMIGFyZ3YgdGVybWluYXRvciAocGFkKQotCS53b3JkCTAJCQk7IHRoaXJkLCAgTlVMTCBhcmd2IHRlcm1pbmF0b3IKLQotaWNfcGF0aDoKLQkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcwotCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAotCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKLQotaWNfYXJndjE6Ci0JLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKLQkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKLQkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCi0KLQkuZXhwb3J0CXN6aWNvZGUsZGF0YQotc3ppY29kZToKLQkud29yZAlzemljb2RlLWljb2RlCi0JLndvcmQJMAkJCTsgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBmaWxsZXIgYXQgZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xvY2FsbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbG9jYWxsYWJlbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM1N2I5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbG9jYWxsYWJlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0KLUxhYmVsOgotTCQwMTIzNDoKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9zc19hbGlnbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9zc19hbGlnbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTk4ZWIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvc3NfYWxpZ24ucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTY0LEFDQ0VTUz0zMQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLXN5bTE6CS5XT1JEIDIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4N2ZkOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX3N1YnNwYWNlX2FsaWduX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAic3NfYWxpZ24uczogVGVzdCBzdWJzcGFjZSBhbGlnbm1lbnQgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgeyBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gfHwgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIH0gdGhlbiB7Ci0gICAgICByZXR1cm4gCi0gICAgfQotCi0gICAgaWYgW2dhc190ZXN0X29sZCAic3NfYWxpZ24ucyIgIiIgInN1YnNwYWNlIGFsaWdubWVudCAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1oIgotCi0gICAgIyBDaGVjayB0aGUgaGVhZGVycyBmb3IgdGhlIGNvcnJlY3QgYWxpZ25tZW50IHZhbHVlIGZvciB0aGUKLSAgICAjIHRoZSAkREFUQSQgc3Vic3BhY2UgKHNvbSkuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCAgewotCQktcmUgIkRBVEFcW15cblxdKiAyLi42XFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2xvY2FsX2xhYmVsX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9jYWxsYWJlbC5zOiBFbGltaW5hdGlvbiBvZiBsb2NhbCBsYWJlbHMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibG9jYWxsYWJlbC5zIiAiIiAiRWxpbWluYXRpb24gb2YgbG9jYWwgbGFiZWxzIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXQiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDBcW15cblxdKkxhYmVsXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXjAwMDAwMDAwXFteXG5cXSpMXCQwMTIzNFxbXlxuXF0qXG4iCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fZnJjaGFpbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZyYWdidWcuczogVGVzdCBidWcgaW4gZnJhZyBjaGFpbmluZyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmcmFnYnVnLnMiICIiICJUZXN0IGJ1ZyBpbiBmcmFnIGNoYWluaW5nIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjB4MDAwMDAwMDBcW15cblxdKm5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIl4weDAwMDAwMDA0XFteXG5cXSpub3BcW15cblxdKlxuIgkJeyBzZXQgeCAwIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19hbGlnbjNfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbGlnbjMuczogVGVzdCBmb3IgYWxpZ25tZW50IGJ1ZyB3aGVuIHN3aXRjaGluZyBzdWJzcGFjZXMgKHBhcnQyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiB7IFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB8fCBbaXN0YXJnZXQgaHBwYSp3LSotKl0gfSB0aGVuIHsKLSAgICAgIHJldHVybiAKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJhbGlnbjMucyIgIiIgIlRlc3QgZm9yIGFsaWdubWVudCBidWcgd2hlbiBzd2l0Y2hpbmcgc3Vic3BhY2VzIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSogPG1haW4+IG5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIlxbXlxuXF0qIDwuKmVuZF9tYWluPiBub3BcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKiA8bWFpbisuKj4gbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fYWxpZ240X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWxpZ240LnM6IE1vcmUgc3Vic3BhY2UgYWxpZ25tZW50IHRlc3RzIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgeyBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gfHwgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIH0gdGhlbiB7Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYWxpZ240LnMiICIiICJNb3JlIHN1YnNwYWNlIGFsaWdubWVudCB0ZXN0cyAocGFydDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1oIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSpNSUxMSUNPREVcW15cblxdKjIuLjZcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpZQUJCQVxbXlxuXF0qMi4uM1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19pbXBvcnRfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbXBvcnRidWcuczogVGVzdCBmb3IgYnVnIGluIC5pbXBvcnQgZGlyZWN0aXZlIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiaW1wb3J0YnVnLnMiICIiICJUZXN0IGZvciBidWcgaW4gLmltcG9ydCBkaXJlY3RpdmUgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXN5bXMiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJcW15cblxdKi5EQVRBLi5mb29cW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKi5kYXRhLipmb29cW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19jb21tb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21tb24uczogVGVzdCBmb3IgYnVnIGluIC5jb21tIGhhbmRsaW5nIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiY29tbW9uLnMiICIiICJUZXN0IGZvciBidWcgaW4gLmNvbW0gaGFuZGxpbmcgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXN5bXMiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJcW15cblxdKi5DT00uKmNvbW1vbl9zeW1ib2xcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIE1ha2Ugc3VyZSBzdWJzcGFjZSBhbGlnbm1lbnQgcmVxdWVzdHMgZnJvbSB0aGUgc3Vic3BhY2UgZGlyZWN0aXZlcwotICAgICMgYXJlIGhvbm9yZWQKLSAgICBkb19zdWJzcGFjZV9hbGlnbl90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSB0aGUgY29ycmVjdCBsYWJlbHMgZW5kIHVwIGluIHRoZSBzeW1ib2wgdGFibGUKLSAgICBkb19sb2NhbF9sYWJlbF90ZXN0Ci0KLSAgICAjIEdBUy0xLjM2IGNob2tlZCBvbiB0aGlzIGZpbGUuCi0gICAgZ2FzX3Rlc3QgImxhYmVsZGlmZnMucyIgIiIgIiIgIkRpZmZlcmVuY2Ugb2YgbGFiZWxzIgotCi0gICAgIyBUZXN0IGEgcmVjZW50IGJ1ZyB3aGVyZSBmcmFnIGNoYWluaW5nIHdhc24ndCB3b3JraW5nIGNvcnJlY3RseS4KLSAgICBkb19mcmNoYWluX3Rlc3QKLQotICAgICMgVGVzdCBidWcgd2hlcmUgc3dpdGNoaW5nIGJldHdlZW4gc3Vic3BhY2VzIGNyZWF0ZXMgYm9ndXMgYWxpZ25tZW50cwotICAgIGRvX2FsaWduM190ZXN0Ci0KLSAgICAjIFRlc3QgYnVnIHdoZXJlIHN3aXRjaGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBjcmVhdGVzIGJvZ3VzIGFsaWdubWVudHMKLSAgICBkb19hbGlnbjRfdGVzdAotCi0gICAgIyBUZXN0IGEgcHJvYmxlbSB3aGVyZSAkZ2xvYmFsJCBpcyBkZWZpbmVkLCB0aGVuIHVzZWQgd2l0aGluIHRoZQotICAgICMgc2FtZSBzb3VyY2UgZmlsZS4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdCAiZ2xvYmFsYnVnLnMiICIiICIiICJVc2UgXCRnbG9iYWxcJCBpbiBmaWxlIHdoaWNoIGRlZmluZXMgaXQiCi0KLSAgICAjIFRlc3QgdGhhdCBpbXBvcnRpbmcgYSBkZWZpbmVkIHN5bWJvbCBkb2Vzbid0IHNjcmV3IHVwIHRoZSBzeW1ib2wncwotICAgICMgc3BhY2Uvc3Vic3BhY2UuCi0gICAgZG9faW1wb3J0X3Rlc3QKLQotICAgICMgVGVzdCBmb3IgYSBidWdsZXQgaW4gdGhlIGhhbmRsaW5nIG9mIGNvbW1vbiBzeW1ib2xzCi0gICAgZG9fY29tbW9uX3Rlc3QKLQotICAgICMgVGVzdCBmb3IgYW4gb2ZmLWJ5LTIgYnVnIGluIHJhbmdlIGNoZWNrIGZvciBjb25kaXRpb25hbCBicmFuY2hlcwotICAgIGdhc190ZXN0X2Vycm9yICJicmxlbmJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yKHMpIGluIGJyYW5jaCBsZW5ndGgiCi0KLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjE2NzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IGFtZAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMGYgMGQgMDMgWyAJXSpwcmVmZXRjaCBcKCVlYnhcKQotICAgMzoJMGYgMGQgMGMgNzUgMDAgMTAgMDAgMDAgWyAJXSpwcmVmZXRjaHcgMHgxMDAwXCgsJWVzaSwyXCkKLSAgIGI6CTBmIDBlIFsgCV0qZmVtbXMgIAotICAgZDoJMGYgMGYgMDAgYmYgWyAJXSpwYXZndXNiIFwoJWVheFwpLCVtbTAKLSAgMTE6CTBmIDBmIDQ4IDAyIDFkIFsgCV0qcGYyaWQgIDB4MlwoJWVheFwpLCVtbTEKLSAgMTY6CTBmIDBmIDkwIDAwIDAxIDAwIDAwIGFlIFsgCV0qcGZhY2MgIDB4MTAwXCglZWF4XCksJW1tMgotICAxZToJMGYgMGYgMWUgOWUgWyAJXSpwZmFkZCAgXCglZXNpXCksJW1tMwotICAyMjoJMGYgMGYgNjYgMDIgYjAgWyAJXSpwZmNtcGVxIDB4MlwoJWVzaVwpLCVtbTQKLSAgMjc6CTBmIDBmIGFlIDkwIDkwIDAwIDAwIDkwIFsgCV0qcGZjbXBnZSAweDkwOTBcKCVlc2lcKSwlbW01Ci0gIDJmOgkwZiAwZiA3NCA3NSAwMCBhMCBbIAldKnBmY21wZ3QgMHgwXCglZWJwLCVlc2ksMlwpLCVtbTYKLSAgMzU6CTBmIDBmIDdjIDc1IDAyIGE0IFsgCV0qcGZtYXggIDB4MlwoJWVicCwlZXNpLDJcKSwlbW03Ci0gIDNiOgkwZiAwZiA4NCA3NSA5MCA5MCA5MCA5MCA5NCBbIAldKnBmbWluICAweDkwOTA5MDkwXCglZWJwLCVlc2ksMlwpLCVtbTAKLSAgNDQ6CTBmIDBmIDBkIDA0IDAwIDAwIDAwIGI0IFsgCV0qcGZtdWwgIDB4NCwlbW0xCi0gIDRjOgkyZSAwZiAwZiA1NCBjMyAwNyA5NiBbIAldKnBmcmNwICAlY3M6MHg3XCglZWJ4LCVlYXgsOFwpLCVtbTIKLSAgNTM6CTBmIDBmIGQ4IGE2IFsgCV0qcGZyY3BpdDEgJW1tMCwlbW0zCi0gIDU3OgkwZiAwZiBlMSBiNiBbIAldKnBmcmNwaXQyICVtbTEsJW1tNAotICA1YjoJMGYgMGYgZWEgYTcgWyAJXSpwZnJzcWl0MSAlbW0yLCVtbTUKLSAgNWY6CTBmIDBmIGYzIDk3IFsgCV0qcGZyc3FydCAlbW0zLCVtbTYKLSAgNjM6CTBmIDBmIGZjIDlhIFsgCV0qcGZzdWIgICVtbTQsJW1tNwotICA2NzoJMGYgMGYgYzUgYWEgWyAJXSpwZnN1YnIgJW1tNSwlbW0wCi0gIDZiOgkwZiAwZiBjZSAwZCBbIAldKnBpMmZkICAlbW02LCVtbTEKLSAgNmY6CTBmIDBmIGQ3IGI3IFsgCV0qcGZtdWxocncgJW1tNywlbW0yCi0gIDczOgkyZSAwZiBbIAldKlwoYmFkXCkgIAotICA3NToJMGYgNTQgYzMgWyAJXSphbmRwcyAgJXhtbTMsJXhtbTAKLSAgNzg6CTA3IFsgCV0qcG9wICAgICVlcwotICA3OToJYzMgWyAJXSpyZXQgICAgCi0gIDdhOgk5MCBbIAldKm5vcCAgICAKLSAgN2I6CTkwIFsgCV0qbm9wICAgIAotICA3YzoJOTAgWyAJXSpub3AgICAgCi0gIDdkOgk5MCBbIAldKm5vcCAgICAKLSAgN2U6CTkwIFsgCV0qbm9wICAgIAotICA3ZjoJOTAgWyAJXSpub3AgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOWM2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotI0FNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zCi0KLS50ZXh0Ci1mb286Ci0gcHJlZmV0Y2gJKCVlYngpCi0gcHJlZmV0Y2h3CTB4MTAwMCgsJWVzaSwyKQotIGZlbW1zCi0gcGF2Z3VzYgkoJWVheCksJW1tMAotIHBmMmlkCQkyKCVlYXgpLCVtbTEKLSBwZmFjYwkJMHgxMDAoJWVheCksJW1tMgotIHBmYWRkCQkoJWVzaSksJW1tMwotIHBmY21wZXEJMiglZXNpKSwlbW00Ci0gcGZjbXBnZQkweDkwOTAoJWVzaSksJW1tNQotIHBmY21wZ3QJKCVlYnAsJWVzaSwyKSwlbW02Ci0gcGZtYXgJCTIoJWVicCwlZXNpLDIpLCVtbTcKLSBwZm1pbgkJMHg5MDkwOTA5MCglZWJwLCVlc2ksMiksJW1tMAotIHBmbXVsCQk0LCVtbTEKLSBwZnJjcAkJJWNzOjcoJWVieCwlZWF4LDgpLCVtbTIKLSBwZnJjcGl0MQklbW0wLCVtbTMKLSBwZnJjcGl0MgklbW0xLCVtbTQKLSBwZnJzcWl0MQklbW0yLCVtbTUKLSBwZnJzcXJ0CSVtbTMsJW1tNgotIHBmc3ViCQklbW00LCVtbTcKLSBwZnN1YnIJCSVtbTUsJW1tMAotIHBpMmZkCQklbW02LCVtbTEKLSBwbXVsaHJ3CSVtbTcsJW1tMgotCi0jIFRoaXMgaXMgYSAzRE5vdyEgaW5zdHJ1Y3Rpb24sIHdpdGggYSBwcmVmaXgsIHRoYXQgaXNuJ3QgcXVpdGUgcmlnaHQKLSMgRXZlcnl0aGluZydzIGdvb2QgYmFyIHRoZSBvcGNvZGUgc3VmZml4Ci0uYnl0ZSAweDJlLCAweDBmLCAweDBmLCAweDU0LCAweGMzLCAweDA3LCAweGMzCi0KLSMgUGFkIG91dCB0byBhIGdvb2QgYWxpZ25tZW50Ci0gLmJ5dGUgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1NmY1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LmwKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MzogV2FybmluZzouKmZhZGRwLioKLS4qOjE0OiBXYXJuaW5nOi4qZnN1YnAuKgotLio6MjU6IFdhcm5pbmc6Lipmc3VicnAuKgotLio6MzY6IFdhcm5pbmc6LipmbXVscC4qCi0uKjo0NzogV2FybmluZzouKmZkaXZwLioKLS4qOjU4OiBXYXJuaW5nOi4qZmRpdnJwLioKLSAgIDEgWyAJXSoucHNpemUgMAotICAgMiBbIAldKi50ZXh0Ci0gICAzIDAwMDAgREVDMSBbIAldKmZhZGQKLS4qV2FybmluZzouKmZhZGRwLioKLSAgIDQgMDAwMiBEOEMzIFsgCV0qZmFkZAklc3RcKDNcKQotICAgNSAwMDA0IEQ4QzMgWyAJXSpmYWRkCSVzdFwoM1wpLCVzdAotICAgNiAwMDA2IERDQzMgWyAJXSpmYWRkCSVzdCwlc3RcKDNcKQotICAgNyAwMDA4IEQ4MDMgWyAJXSpmYWRkcwlcKCVlYnhcKQotICAgOCAwMDBhIERDMDMgWyAJXSpmYWRkbAlcKCVlYnhcKQotICAgOSAwMDBjIERFMDMgWyAJXSpmaWFkZHMJXCglZWJ4XCkKLSAgMTAgMDAwZSBEQTAzIFsgCV0qZmlhZGRsCVwoJWVieFwpCi0gIDExIDAwMTAgREVDMSBbIAldKmZhZGRwCi0gIDEyIDAwMTIgREVDMyBbIAldKmZhZGRwCSVzdFwoM1wpCi0gIDEzIDAwMTQgREVDMyBbIAldKmZhZGRwCSVzdCwlc3RcKDNcKQotICAxNCAwMDE2IERFRTEgWyAJXSpmc3ViCi0uKldhcm5pbmc6Lipmc3VicC4qCi0gIDE1IDAwMTggRDhFMyBbIAldKmZzdWIJJXN0XCgzXCkKLSAgMTYgMDAxYSBEOEUzIFsgCV0qZnN1Ygklc3RcKDNcKSwlc3QKLSAgMTcgMDAxYyBEQ0UzIFsgCV0qZnN1Ygklc3QsJXN0XCgzXCkKLSAgMTggMDAxZSBEODIzIFsgCV0qZnN1YnMJXCglZWJ4XCkKLSAgMTkgMDAyMCBEQzIzIFsgCV0qZnN1YmwJXCglZWJ4XCkKLSAgMjAgMDAyMiBERTIzIFsgCV0qZmlzdWJzCVwoJWVieFwpCi0gIDIxIDAwMjQgREEyMyBbIAldKmZpc3VibAlcKCVlYnhcKQotICAyMiAwMDI2IERFRTEgWyAJXSpmc3VicAotICAyMyAwMDI4IERFRTMgWyAJXSpmc3VicAklc3RcKDNcKQotICAyNCAwMDJhIERFRTMgWyAJXSpmc3VicAklc3QsJXN0XCgzXCkKLSAgMjUgMDAyYyBERUU5IFsgCV0qZnN1YnIKLS4qV2FybmluZzouKmZzdWJycC4qCi0gIDI2IDAwMmUgRDhFQiBbIAldKmZzdWJyCSVzdFwoM1wpCi0gIDI3IDAwMzAgRDhFQiBbIAldKmZzdWJyCSVzdFwoM1wpLCVzdAotICAyOCAwMDMyIERDRUIgWyAJXSpmc3Vicgklc3QsJXN0XCgzXCkKLSAgMjkgMDAzNCBEODJCIFsgCV0qZnN1YnJzCVwoJWVieFwpCi0gIDMwIDAwMzYgREMyQiBbIAldKmZzdWJybAlcKCVlYnhcKQotICAzMSAwMDM4IERFMkIgWyAJXSpmaXN1YnJzCVwoJWVieFwpCi0gIDMyIDAwM2EgREEyQiBbIAldKmZpc3VicmwJXCglZWJ4XCkKLSAgMzMgMDAzYyBERUU5IFsgCV0qZnN1YnJwCi0gIDM0IDAwM2UgREVFQiBbIAldKmZzdWJycAklc3RcKDNcKQotICAzNSAwMDQwIERFRUIgWyAJXSpmc3VicnAJJXN0LCVzdFwoM1wpCi0gIDM2IDAwNDIgREVDOSBbIAldKmZtdWwKLS4qV2FybmluZzouKmZtdWxwLioKLSAgMzcgMDA0NCBEOENCIFsgCV0qZm11bAklc3RcKDNcKQotICAzOCAwMDQ2IEQ4Q0IgWyAJXSpmbXVsCSVzdFwoM1wpLCVzdAotICAzOSAwMDQ4IERDQ0IgWyAJXSpmbXVsCSVzdCwlc3RcKDNcKQotICA0MCAwMDRhIEQ4MEIgWyAJXSpmbXVscwlcKCVlYnhcKQotICA0MSAwMDRjIERDMEIgWyAJXSpmbXVsbAlcKCVlYnhcKQotICA0MiAwMDRlIERFMEIgWyAJXSpmaW11bHMJXCglZWJ4XCkKLSAgNDMgMDA1MCBEQTBCIFsgCV0qZmltdWxsCVwoJWVieFwpCi0gIDQ0IDAwNTIgREVDOSBbIAldKmZtdWxwCi0gIDQ1IDAwNTQgREVDQiBbIAldKmZtdWxwCSVzdFwoM1wpCi0gIDQ2IDAwNTYgREVDQiBbIAldKmZtdWxwCSVzdCwlc3RcKDNcKQotICA0NyAwMDU4IERFRjEgWyAJXSpmZGl2Ci0uKldhcm5pbmc6LipmZGl2cC4qCi0gIDQ4IDAwNWEgRDhGMyBbIAldKmZkaXYJJXN0XCgzXCkKLSAgNDkgMDA1YyBEOEYzIFsgCV0qZmRpdgklc3RcKDNcKSwlc3QKLSAgNTAgMDA1ZSBEQ0YzIFsgCV0qZmRpdgklc3QsJXN0XCgzXCkKLSAgNTEgMDA2MCBEODMzIFsgCV0qZmRpdnMJXCglZWJ4XCkKLSAgNTIgMDA2MiBEQzMzIFsgCV0qZmRpdmwJXCglZWJ4XCkKLSAgNTMgMDA2NCBERTMzIFsgCV0qZmlkaXZzCVwoJWVieFwpCi0gIDU0IDAwNjYgREEzMyBbIAldKmZpZGl2bAlcKCVlYnhcKQotICA1NSAwMDY4IERFRjEgWyAJXSpmZGl2cAotICA1NiAwMDZhIERFRjMgWyAJXSpmZGl2cAklc3RcKDNcKQotICA1NyAwMDZjIERFRjMgWyAJXSpmZGl2cAklc3QsJXN0XCgzXCkKLSAgNTggMDA2ZSBERUY5IFsgCV0qZmRpdnIKLS4qV2FybmluZzouKmZkaXZycC4qCi0gIDU5IDAwNzAgRDhGQiBbIAldKmZkaXZyCSVzdFwoM1wpCi0gIDYwIDAwNzIgRDhGQiBbIAldKmZkaXZyCSVzdFwoM1wpLCVzdAotICA2MSAwMDc0IERDRkIgWyAJXSpmZGl2cgklc3QsJXN0XCgzXCkKLSAgNjIgMDA3NiBEODNCIFsgCV0qZmRpdnJzCVwoJWVieFwpCi0gIDYzIDAwNzggREMzQiBbIAldKmZkaXZybAlcKCVlYnhcKQotICA2NCAwMDdhIERFM0IgWyAJXSpmaWRpdnJzCVwoJWVieFwpCi0gIDY1IDAwN2MgREEzQiBbIAldKmZpZGl2cmwJXCglZWJ4XCkKLSAgNjYgMDA3ZSBERUY5IFsgCV0qZmRpdnJwCi0gIDY3IDAwODAgREVGQiBbIAldKmZkaXZycAklc3RcKDNcKQotICA2OCAwMDgyIERFRkIgWyAJXSpmZGl2cnAJJXN0LCVzdFwoM1wpCi0gIDY5IFsgCV0qCi0gIDcwIDAwODQgMDAwMDAwMDAgWyAJXSoucDJhbGlnbgk0LDAKLSAgNzAgICAgICAwMDAwMDAwMCAKLSAgNzAgICAgICAwMDAwMDAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkMzBiNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0ucHNpemUgMAotLnRleHQKLQlmYWRkCi0JZmFkZAklc3QoMykKLQlmYWRkCSVzdCgzKSwlc3QKLQlmYWRkCSVzdCwlc3QoMykKLQlmYWRkcwkoJWVieCkKLQlmYWRkbAkoJWVieCkKLQlmaWFkZHMJKCVlYngpCi0JZmlhZGRsCSglZWJ4KQotCWZhZGRwCi0JZmFkZHAJJXN0KDMpCi0JZmFkZHAJJXN0LCVzdCgzKQotCWZzdWIKLQlmc3ViCSVzdCgzKQotCWZzdWIJJXN0KDMpLCVzdAotCWZzdWIJJXN0LCVzdCgzKQotCWZzdWJzCSglZWJ4KQotCWZzdWJsCSglZWJ4KQotCWZpc3VicwkoJWVieCkKLQlmaXN1YmwJKCVlYngpCi0JZnN1YnAKLQlmc3VicAklc3QoMykKLQlmc3VicAklc3QsJXN0KDMpCi0JZnN1YnIKLQlmc3Vicgklc3QoMykKLQlmc3Vicgklc3QoMyksJXN0Ci0JZnN1YnIJJXN0LCVzdCgzKQotCWZzdWJycwkoJWVieCkKLQlmc3VicmwJKCVlYngpCi0JZmlzdWJycwkoJWVieCkKLQlmaXN1YnJsCSglZWJ4KQotCWZzdWJycAotCWZzdWJycAklc3QoMykKLQlmc3VicnAJJXN0LCVzdCgzKQotCWZtdWwKLQlmbXVsCSVzdCgzKQotCWZtdWwJJXN0KDMpLCVzdAotCWZtdWwJJXN0LCVzdCgzKQotCWZtdWxzCSglZWJ4KQotCWZtdWxsCSglZWJ4KQotCWZpbXVscwkoJWVieCkKLQlmaW11bGwJKCVlYngpCi0JZm11bHAKLQlmbXVscAklc3QoMykKLQlmbXVscAklc3QsJXN0KDMpCi0JZmRpdgotCWZkaXYJJXN0KDMpCi0JZmRpdgklc3QoMyksJXN0Ci0JZmRpdgklc3QsJXN0KDMpCi0JZmRpdnMJKCVlYngpCi0JZmRpdmwJKCVlYngpCi0JZmlkaXZzCSglZWJ4KQotCWZpZGl2bAkoJWVieCkKLQlmZGl2cAotCWZkaXZwCSVzdCgzKQotCWZkaXZwCSVzdCwlc3QoMykKLQlmZGl2cgotCWZkaXZyCSVzdCgzKQotCWZkaXZyCSVzdCgzKSwlc3QKLQlmZGl2cgklc3QsJXN0KDMpCi0JZmRpdnJzCSglZWJ4KQotCWZkaXZybAkoJWVieCkKLQlmaWRpdnJzCSglZWJ4KQotCWZpZGl2cmwJKCVlYngpCi0JZmRpdnJwCi0JZmRpdnJwCSVzdCgzKQotCWZkaXZycAklc3QsJXN0KDMpCi0KLQkucDJhbGlnbgk0LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwN2U3NjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjEwOiBXYXJuaW5nOi4qCi0uKjoxMjogV2FybmluZzouKgotLio6MTk6IFdhcm5pbmc6LioKLS4qOjIyOiBXYXJuaW5nOi4qCi0uKjo4MTogV2FybmluZzouKgotLio6ODI6IFdhcm5pbmc6LioKLS4qOjgzOiBXYXJuaW5nOi4qCi0uKjo4NDogV2FybmluZzouKgotLio6ODU6IFdhcm5pbmc6LioKLS4qOjg2OiBXYXJuaW5nOi4qCi0uKjo4NzogV2FybmluZzouKgotLio6ODg6IFdhcm5pbmc6LioKLS4qOjg5OiBXYXJuaW5nOi4qCi0uKjo5MDogV2FybmluZzouKgotLio6OTE6IFdhcm5pbmc6LioKLS4qOjkyOiBXYXJuaW5nOi4qCi0uKjo5MzogV2FybmluZzouKgotLio6OTQ6IFdhcm5pbmc6LioKLS4qOjk1OiBXYXJuaW5nOi4qCi0uKjo5NjogV2FybmluZzouKgotLio6OTc6IFdhcm5pbmc6LioKLS4qOjk4OiBXYXJuaW5nOi4qCi0uKjo5OTogV2FybmluZzouKgotLio6MTAwOiBXYXJuaW5nOi4qCi0uKjoxMDE6IFdhcm5pbmc6LioKLS4qOjEzNTogV2FybmluZzouKgotICAgMSAgICAgICAgICAgICAgICAgICAgICAgCS5wc2l6ZSAwCi0gICAyICAgICAgICAgICAgICAgICAgICAgICAJLnRleHQKLSAgIDMgICAgICAgICAgICAgICAgICAgICAgIAkjIHRlc3QgdmFyaW91cyBzZWdtZW50IHJlZyBpbnNucwotICAgNCAwMDAwIDFFICAgICAgICAgICAgICAgIAkJcHVzaAklZHMKLSAgIDUgMDAwMSAxRSAgICAgICAgICAgICAgICAJCXB1c2hsCSVkcwotICAgNiAwMDAyIDFGICAgICAgICAgICAgICAgIAkJcG9wCSVkcwotICAgNyAwMDAzIDFGICAgICAgICAgICAgICAgIAkJcG9wbAklZHMKLSAgIDggMDAwNCA4Q0Q4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVheAotICAgOSAwMDA2IDhDRDggICAgICAgICAgICAgIAkJbW92bAklZHMsJWVheAotICAxMCAwMDA4IDhDRDggICAgICAgICAgICAgIAkJbW92bAklZHMsJWF4Ci0uKldhcm5pbmc6LioKLSAgMTEgMDAwYSA4RUQ4ICAgICAgICAgICAgICAJCW1vdgklZWF4LCVkcwotICAxMiAwMDBjIDhFRDggICAgICAgICAgICAgIAkJbW92bAklYXgsJWRzCi0uKldhcm5pbmc6LioKLSAgMTMgMDAwZSA4RUQ4ICAgICAgICAgICAgICAJCW1vdmwJJWVheCwlZHMKLSAgMTQgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgMTUgMDAxMCA2NjFFICAgICAgICAgICAgICAJCXB1c2h3CSVkcwotICAxNiAwMDEyIDY2MUYgICAgICAgICAgICAgIAkJcG9wdwklZHMKLSAgMTcgMDAxNCA2NjhDRDggICAgICAgICAgICAJCW1vdgklZHMsJWF4Ci0gIDE4IDAwMTcgNjY4Q0Q4ICAgICAgICAgICAgCQltb3Z3CSVkcywlYXgKLSAgMTkgMDAxYSA2NjhDRDggICAgICAgICAgICAJCW1vdncJJWRzLCVlYXgKLS4qV2FybmluZzouKgotICAyMCAwMDFkIDhFRDggICAgICAgICAgICAgIAkJbW92CSVheCwlZHMKLSAgMjEgMDAxZiA4RUQ4ICAgICAgICAgICAgICAJCW1vdncJJWF4LCVkcwotICAyMiAwMDIxIDhFRDggICAgICAgICAgICAgIAkJbW92dwklZWF4LCVkcwotLipXYXJuaW5nOi4qCi0gIDIzICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDI0ICAgICAgICAgICAgICAgICAgICAgICAJIyB0ZXN0IHZhcmlvdXMgcHVzaGVzCi0gIDI1IDAwMjMgNkEwQSAgICAgICAgICAgICAgCQlwdXNobAlcJDEwCi0gIDI2IDAwMjUgNjY2QTBBICAgICAgICAgICAgCQlwdXNodwlcJDEwCi0gIDI3IDAwMjggNkEwQSAgICAgICAgICAgICAgCQlwdXNoCVwkMTAKLSAgMjggMDAyYSA2OEU4MDMwMCAwMCAgICAgICAJCXB1c2hsCVwkMTAwMAotICAyOSAwMDJmIDY2NjhFODAzICAgICAgICAgIAkJcHVzaHcJXCQxMDAwCi0gIDMwIDAwMzMgNjhFODAzMDAgMDAgICAgICAgCQlwdXNoCVwkMTAwMAotICAzMSAwMDM4IEZGMzU1NzAwIDAwMDAgICAgIAkJcHVzaGwJMWYKLSAgMzIgMDAzZSA2NkZGMzU1NyAwMDAwMDAgICAJCXB1c2h3CTFmCi0gIDMzIDAwNDUgRkYzNTU3MDAgMDAwMCAgICAgCQlwdXNoCTFmCi0gIDM0IDAwNGIgRkZCMzBDMDAgMDAwMCAgICAgCQlwdXNoCVwoMWYtLlwpXCglZWJ4XCkKLSAgMzUgMDA1MSBGRjM1MDYwMCAwMDAwICAgICAJCXB1c2gJMWYtLgotICAzNiAgICAgICAgICAgICAgICAgICAgICAgCSMgdGhlc2UsIGFuZCBvdGhlcnMgbGlrZSB0aGVtIHNob3VsZCBoYXZlIG5vIG9wZXJhbmQgc2l6ZSBwcmVmaXgKLSAgMzcgMDA1NyAwRjAwRDEgICAgICAgICAgICAJMToJbGxkdAklY3gKLSAgMzggMDA1YSAwRjAxRjAgICAgICAgICAgICAJCWxtc3cJJWF4Ci0gIDM5ICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDQwICAgICAgICAgICAgICAgICAgICAgICAJIyBKdXN0IHRvIG1ha2Ugc3VyZSB0aGVzZSBkb24ndCBiZWNvbWUgaWxsZWdhbCBkdWUgdG8gb3Zlci1lbnRodXNpYXN0aWMKLSAgNDEgICAgICAgICAgICAgICAgICAgICAgIAkjIHJlZ2lzdGVyIGNoZWNraW5nCi0gIDQyIDAwNWQgNjYwRkJFRjggICAgICAgICAgCQltb3ZzYncJJWFsLCVkaQotICA0MyAwMDYxIDBGQkVDOCAgICAgICAgICAgIAkJbW92c2JsCSVhbCwlZWN4Ci0gIDQ0IDAwNjQgMEZCRkM4ICAgICAgICAgICAgCQltb3Zzd2wJJWF4LCVlY3gKLSAgNDUgMDA2NyA2NjBGQjZGOCAgICAgICAgICAJCW1vdnpidwklYWwsJWRpCi0gIDQ2IDAwNmIgMEZCNkM4ICAgICAgICAgICAgCQltb3Z6YmwJJWFsLCVlY3gKLSAgNDcgMDA2ZSAwRkI3QzggICAgICAgICAgICAJCW1vdnp3bAklYXgsJWVjeAotICA0OCAgICAgICAgICAgICAgICAgICAgICAgCQotICA0OSAwMDcxIEVDICAgICAgICAgICAgICAgIAkJaW4JJWR4LCVhbAotICA1MCAwMDcyIDY2RUQgICAgICAgICAgICAgIAkJaW4JJWR4LCVheAotICA1MSAwMDc0IEVEICAgICAgICAgICAgICAgIAkJaW4JJWR4LCVlYXgKLSAgNTIgMDA3NSBFQyAgICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWFsCi0gIDUzIDAwNzYgNjZFRCAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVheAotICA1NCAwMDc4IEVEICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlZWF4Ci0gIDU1IDAwNzkgRUMgICAgICAgICAgICAgICAgCQlpbmIJJWR4LCVhbAotICA1NiAwMDdhIDY2RUQgICAgICAgICAgICAgIAkJaW53CSVkeCwlYXgKLSAgNTcgMDA3YyBFRCAgICAgICAgICAgICAgICAJCWlubAklZHgsJWVheAotICA1OCAwMDdkIEVDICAgICAgICAgICAgICAgIAkJaW5iCSVkeAotICA1OSAwMDdlIDY2RUQgICAgICAgICAgICAgIAkJaW53CSVkeAotICA2MCAwMDgwIEVEICAgICAgICAgICAgICAgIAkJaW5sCSVkeAotICA2MSAwMDgxIEU0RkYgICAgICAgICAgICAgIAkJaW5iCVwkMjU1Ci0gIDYyIDAwODMgNjZFNTAyICAgICAgICAgICAgCQlpbncJXCQyCi0gIDYzIDAwODYgRTUwNCAgICAgICAgICAgICAgCQlpbmwJXCQ0Ci0gIDY0IDAwODggRUYgICAgICAgICAgICAgICAgCQlvdXRsCSVlYXgsJWR4Ci0gIDY1IDAwODkgRTYyQSAgICAgICAgICAgICAgCQlvdXQJJWFsLCBcJDQyCi0gIDY2IDAwOGIgNjZFNTBEICAgICAgICAgICAgCQlpbglcJDEzLCAlYXgKLSAgNjcgICAgICAgICAgICAgICAgICAgICAgIAkjIFRoZXNlIGFyZSB1c2VkIGluIEFJWC4KLSAgNjggMDA4ZSA2NkVEICAgICAgICAgICAgICAJCWludwlcKCVkeFwpCi0gIDY5IDAwOTAgNjZFRiAgICAgICAgICAgICAgCQlvdXR3CVwoJWR4XCkKLSAgNzAgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgNzEgMDA5MiBBNCAgICAgICAgICAgICAgICAJCW1vdnNiCi0gIDcyIDAwOTMgNjZBNyAgICAgICAgICAgICAgCQljbXBzdwotICA3MyAwMDk1IEFGICAgICAgICAgICAgICAgIAkJc2Nhc2wKLSAgNzQgMDA5NiBENyAgICAgICAgICAgICAgICAJCXhsYXRiCi0gIDc1IDAwOTcgMkVBNSAgICAgICAgICAgICAgCQltb3ZzbAklY3M6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gIDc2IDAwOTkgMEY5MzAzICAgICAgICAgICAgCQlzZXRhZQlcKCVlYnhcKQotICA3NyAwMDljIDBGOTMwMyAgICAgICAgICAgIAkJc2V0YWViCVwoJWVieFwpCi0gIDc4IDAwOWYgMEY5M0MwICAgICAgICAgICAgCQlzZXRhZQklYWwKLSAgNzkgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgODAgICAgICAgICAgICAgICAgICAgICAgIAkjdGhlc2Ugc2hvdWxkIGdpdmUgd2FybmluZ3MKLSAgODEgMDBhMiAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWF4Ci0uKldhcm5pbmc6LioKLSAgODIgMDBhNCAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWVheAotLipXYXJuaW5nOi4qCi0gIDgzIDAwYTYgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVieAotLipXYXJuaW5nOi4qCi0gIDg0IDAwYTkgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVlYngKLS4qV2FybmluZzouKgotICA4NSAwMGFjIEQ5QzEgICAgICAgICAgICAgIAkJZmxkbAklc3RcKDFcKQotLipXYXJuaW5nOi4qCi0gIDg2IDAwYWUgREREMiAgICAgICAgICAgICAgCQlmc3RsCSVzdFwoMlwpCi0uKldhcm5pbmc6LioKLSAgODcgMDBiMCBERERCICAgICAgICAgICAgICAJCWZzdHBsCSVzdFwoM1wpCi0uKldhcm5pbmc6LioKLSAgODggMDBiMiBEOEQ0ICAgICAgICAgICAgICAJCWZjb21sCSVzdFwoNFwpCi0uKldhcm5pbmc6LioKLSAgODkgMDBiNCBEOEREICAgICAgICAgICAgICAJCWZjb21wbAklc3RcKDVcKQotLipXYXJuaW5nOi4qCi0gIDkwIDAwYjYgREVDMSAgICAgICAgICAgICAgCQlmYWRkcAklc3RcKDFcKSwlc3QKLS4qV2FybmluZzouKgotICA5MSAwMGI4IERFQ0EgICAgICAgICAgICAgIAkJZm11bHAJJXN0XCgyXCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTIgMDBiYSBERUUzICAgICAgICAgICAgICAJCWZzdWJwCSVzdFwoM1wpLCVzdAotLipXYXJuaW5nOi4qCi0gIDkzIDAwYmMgREVFQyAgICAgICAgICAgICAgCQlmc3VicnAJJXN0XCg0XCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTQgMDBiZSBERUY1ICAgICAgICAgICAgICAJCWZkaXZwCSVzdFwoNVwpLCVzdAotLipXYXJuaW5nOi4qCi0gIDk1IDAwYzAgREVGRSAgICAgICAgICAgICAgCQlmZGl2cnAJJXN0XCg2XCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTYgMDBjMiBERUMxICAgICAgICAgICAgICAJCWZhZGQKLS4qV2FybmluZzouKgotICA5NyAwMGM0IERFRTEgICAgICAgICAgICAgIAkJZnN1YgotLipXYXJuaW5nOi4qCi0gIDk4IDAwYzYgREVDOSAgICAgICAgICAgICAgCQlmbXVsCi0uKldhcm5pbmc6LioKLSAgOTkgMDBjOCBERUYxICAgICAgICAgICAgICAJCWZkaXYKLS4qV2FybmluZzouKgotIDEwMCAwMGNhIERFRTkgICAgICAgICAgICAgIAkJZnN1YnIKLS4qV2FybmluZzouKgotIDEwMSAwMGNjIERFRjkgICAgICAgICAgICAgIAkJZmRpdnIKLS4qV2FybmluZzouKgotIDEwMiAgICAgICAgICAgICAgICAgICAgICAgCSN0aGVzZSBzaG91bGQgYWxsIGJlIGxlZ2FsCi0gMTAzIDAwY2UgMEZBMzE1NTYgMzQxMjAwICAgCQlidGwJJWVkeCwgMHgxMjM0NTYKLSAxMDQgMDBkNSAwRkEzRDAgICAgICAgICAgICAJCWJ0bAklZWR4LCAlZWF4Ci0gMTA1IDAwZDggMEMwMSAgICAgICAgICAgICAgCQlvcmIJXCQxLCVhbAotIDEwNiAwMGRhIDgwQ0IwMSAgICAgICAgICAgIAkJb3JiCVwkMSwlYmwKLSAxMDcgMDBkZCBBMTExMDAwMCAwMCAgICAgICAJCW1vdmwJMTcsJWVheAotIDEwOCAwMGUyIEExMTEwMDAwIDAwICAgICAgIAkJbW92CTE3LCVlYXgKLSAxMDkgMDBlNyA2NkVEICAgICAgICAgICAgICAJCWludwklZHgsJWF4Ci0gMTEwIDAwZTkgRUQgICAgICAgICAgICAgICAgCQlpbmwJJWR4LCVlYXgKLSAxMTEgMDBlYSA2NkVEICAgICAgICAgICAgICAJCWludwlcKCVkeFwpLCVheAotIDExMiAwMGVjIEVEICAgICAgICAgICAgICAgIAkJaW5sCVwoJWR4XCksJWVheAotIDExMyAwMGVkIEVDICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYWwKLSAxMTQgMDBlZSA2NkVEICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWF4Ci0gMTE1IDAwZjAgRUQgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVlYXgKLSAxMTYgMDBmMSAwRkI2MTQzNyAgICAgICAgICAJCW1vdnpibAlcKCVlZGksJWVzaVwpLCVlZHgKLSAxMTcgMDBmNSAwRkI2NDUxQyAgICAgICAgICAJCW1vdnpibAkyOFwoJWVicFwpLCVlYXgKLSAxMTggMDBmOSAwRkI2QzAgICAgICAgICAgICAJCW1vdnpibAklYWwsJWVheAotIDExOSAwMGZjIDBGQjZGMSAgICAgICAgICAgIAkJbW92emJsCSVjbCwlZXNpCi0gMTIwIDAwZmYgMjZENyAgICAgICAgICAgICAgCQl4bGF0CSVlczpcKCVlYnhcKQotIDEyMSAwMTAxIEQ3ICAgICAgICAgICAgICAgIAkJeGxhdAotIDEyMiAwMTAyIEQ3ICAgICAgICAgICAgICAgIAkJeGxhdGIKLSAxMjMgMDEwMyBEREQ4ICAgICAgICAgICAgICAJMToJZnN0cAklc3RcKDBcKQotIDEyNCAwMTA1IEUyRkMgICAgICAgICAgICAgIAkJbG9vcAkxYgotIDEyNSAwMTA3IEY2RjEgICAgICAgICAgICAgIAkJZGl2YiAgICAlY2wgCi0gMTI2IDAxMDkgNjZGN0YxICAgICAgICAgICAgCQlkaXZ3ICAgICVjeCAKLSAxMjcgMDEwYyBGN0YxICAgICAgICAgICAgICAJCWRpdmwgICAgJWVjeAotIDEyOCAwMTBlIEY2RjEgICAgICAgICAgICAgIAkJZGl2CSVjbAotIDEyOSAwMTEwIDY2RjdGMSAgICAgICAgICAgIAkJZGl2CSVjeAotIDEzMCAwMTEzIEY3RjEgICAgICAgICAgICAgIAkJZGl2CSVlY3gKLSAxMzEgMDExNSBGNkYxICAgICAgICAgICAgICAJCWRpdgklY2wsJWFsCi0gMTMyIDAxMTcgNjZGN0YxICAgICAgICAgICAgCQlkaXYJJWN4LCVheAotIDEzMyAwMTFhIEY3RjEgICAgICAgICAgICAgIAkJZGl2CSVlY3gsJWVheAotIDEzNCAwMTFjIDhFREUgICAgICAgICAgICAgIAkJbW92CSVzaSwlZHMKLSAxMzUgMDExZSA4RURFICAgICAgICAgICAgICAJCW1vdmwJJXNpLCVkcwkJIyB3YXJuaW5nIGhlcmUKLS4qV2FybmluZzouKgotIDEzNiAwMTIwIDFFICAgICAgICAgICAgICAgIAkJcHVzaGwJJWRzCi0gMTM3IDAxMjEgMUUgICAgICAgICAgICAgICAgCQlwdXNoCSVkcwotIDEzOCAwMTIyIEEwMDAwMDAwIDAwICAgICAgIAkJbW92CTAsJWFsCi0gMTM5IDAxMjcgNjZBMTAwMDAgMDEwMCAgICAgCQltb3YJMHgxMDAwMCwlYXgKLSAxNDAgMDEyZCA4OUMzICAgICAgICAgICAgICAJCW1vdgklZWF4LCVlYngKLSAxNDEgMDEyZiA5QyAgICAgICAgICAgICAgICAJCXB1c2hmCi0gMTQyIDAxMzAgOUMgICAgICAgICAgICAgICAgCQlwdXNoZmwKLSAxNDMgMDEzMSA2NjlDICAgICAgICAgICAgICAJCXB1c2hmdwotIDE0NCAwMTMzIDlEICAgICAgICAgICAgICAgIAkJcG9wZgotIDE0NSAwMTM0IDlEICAgICAgICAgICAgICAgIAkJcG9wZmwKLSAxNDYgMDEzNSA2NjlEICAgICAgICAgICAgICAJCXBvcGZ3Ci0gMTQ3IDAxMzcgODkzNDFEMDAgMDAwMDAwICAgCQltb3YJJWVzaSxcKCwlZWJ4LDFcKQotIDE0OCAwMTNlIDgwMjUwMDAwIDAwMDA3RiAgIAkJYW5kYglcJH4weDgwLGZvbwotIDE0OSAgICAgICAgICAgICAgICAgICAgICAgCQotIDE1MCAgICAgICAgICAgICAgICAgICAgICAgCSNjaGVjayAxNi1iaXQgY29kZSBhdXRvIGFkZHJlc3MgcHJlZml4Ci0gMTUxICAgICAgICAgICAgICAgICAgICAgICAJLmNvZGUxNmdjYwotIDE1MiAwMTQ1IDY3NjY4RDk1IDAwRkZGRkZGIAkJbGVhbAktMjU2XCglZWJwXCksJWVkeAotIDE1MyAwMTRkIDY3ODg4NTdGIEZGRkZGRiAgIAkJbW92CSVhbCwtMTI5XCglZWJwXCkKLSAxNTQgMDE1NCA2Nzg4NjU4MCAgICAgICAgICAJCW1vdgklYWgsLTEyOFwoJWVicFwpCi0gMTU1IDAxNTggNjc2NjhEOUQgMjBGOUZGRkYgCQlsZWFsCS0xNzYwXCglZWJwXCksJWVieAotIDE1NiAwMTYwIDY3NjY4OTg0IDI0OEMwMDAwIAkJbW92bAklZWF4LDE0MFwoJWVzcFwpCi0gMTU2ICAgICAgMDAKLSAxNTcgICAgICAgICAgICAgICAgICAgICAgIAkKLSAxNTggICAgICAgICAgICAgICAgICAgICAgIAkJIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotIDE1OSAwMTY5IDAwMDAwMDAwIDAwMDAwMFsgCV0qLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTZiNjhkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS5wc2l6ZSAwCi0udGV4dAotIyB0ZXN0IHZhcmlvdXMgc2VnbWVudCByZWcgaW5zbnMKLQlwdXNoCSVkcwotCXB1c2hsCSVkcwotCXBvcAklZHMKLQlwb3BsCSVkcwotCW1vdgklZHMsJWVheAotCW1vdmwJJWRzLCVlYXgKLQltb3ZsCSVkcywlYXgKLQltb3YJJWVheCwlZHMKLQltb3ZsCSVheCwlZHMKLQltb3ZsCSVlYXgsJWRzCi0KLQlwdXNodwklZHMKLQlwb3B3CSVkcwotCW1vdgklZHMsJWF4Ci0JbW92dwklZHMsJWF4Ci0JbW92dwklZHMsJWVheAotCW1vdgklYXgsJWRzCi0JbW92dwklYXgsJWRzCi0JbW92dwklZWF4LCVkcwotCi0jIHRlc3QgdmFyaW91cyBwdXNoZXMKLQlwdXNobAkkMTAKLQlwdXNodwkkMTAKLQlwdXNoCSQxMAotCXB1c2hsCSQxMDAwCi0JcHVzaHcJJDEwMDAKLQlwdXNoCSQxMDAwCi0JcHVzaGwJMWYKLQlwdXNodwkxZgotCXB1c2gJMWYKLQlwdXNoCSgxZi0uKSglZWJ4KQotCXB1c2gJMWYtLgotIyB0aGVzZSwgYW5kIG90aGVycyBsaWtlIHRoZW0gc2hvdWxkIGhhdmUgbm8gb3BlcmFuZCBzaXplIHByZWZpeAotMToJbGxkdAklY3gKLQlsbXN3CSVheAotCi0jIEp1c3QgdG8gbWFrZSBzdXJlIHRoZXNlIGRvbid0IGJlY29tZSBpbGxlZ2FsIGR1ZSB0byBvdmVyLWVudGh1c2lhc3RpYwotIyByZWdpc3RlciBjaGVja2luZwotCW1vdnNidwklYWwsJWRpCi0JbW92c2JsCSVhbCwlZWN4Ci0JbW92c3dsCSVheCwlZWN4Ci0JbW92emJ3CSVhbCwlZGkKLQltb3Z6YmwJJWFsLCVlY3gKLQltb3Z6d2wJJWF4LCVlY3gKLQotCWluCSVkeCwlYWwKLQlpbgklZHgsJWF4Ci0JaW4JJWR4LCVlYXgKLQlpbgkoJWR4KSwlYWwKLQlpbgkoJWR4KSwlYXgKLQlpbgkoJWR4KSwlZWF4Ci0JaW5iCSVkeCwlYWwKLQlpbncJJWR4LCVheAotCWlubAklZHgsJWVheAotCWluYgklZHgKLQlpbncJJWR4Ci0JaW5sCSVkeAotCWluYgkkMjU1Ci0JaW53CSQyCi0JaW5sCSQ0Ci0Jb3V0bAklZWF4LCVkeAotCW91dAklYWwsICQ0MgotCWluCSQxMywgJWF4Ci0jIFRoZXNlIGFyZSB1c2VkIGluIEFJWC4KLQlpbncJKCVkeCkKLQlvdXR3CSglZHgpCi0KLQltb3ZzYgotCWNtcHN3Ci0Jc2Nhc2wKLQl4bGF0YgotCW1vdnNsCSVjczooJWVzaSksJWVzOiglZWRpKQotCXNldGFlCSglZWJ4KQotCXNldGFlYgkoJWVieCkKLQlzZXRhZQklYWwKLQotI3RoZXNlIHNob3VsZCBnaXZlIHdhcm5pbmdzCi0Jb3JiCSQxLCVheAotCW9yYgkkMSwlZWF4Ci0Jb3JiCSQxLCVieAotCW9yYgkkMSwlZWJ4Ci0JZmxkbAklc3QoMSkKLQlmc3RsCSVzdCgyKQotCWZzdHBsCSVzdCgzKQotCWZjb21sCSVzdCg0KQotCWZjb21wbAklc3QoNSkKLQlmYWRkcAklc3QoMSksJXN0Ci0JZm11bHAJJXN0KDIpLCVzdAotCWZzdWJwCSVzdCgzKSwlc3QKLQlmc3VicnAJJXN0KDQpLCVzdAotCWZkaXZwCSVzdCg1KSwlc3QKLQlmZGl2cnAJJXN0KDYpLCVzdAotCWZhZGQKLQlmc3ViCi0JZm11bAotCWZkaXYKLQlmc3VicgotCWZkaXZyCi0jdGhlc2Ugc2hvdWxkIGFsbCBiZSBsZWdhbAotCWJ0bAklZWR4LCAweDEyMzQ1NgotCWJ0bAklZWR4LCAlZWF4Ci0Jb3JiCSQxLCVhbAotCW9yYgkkMSwlYmwKLQltb3ZsCTE3LCVlYXgKLQltb3YJMTcsJWVheAotCWludwklZHgsJWF4Ci0JaW5sCSVkeCwlZWF4Ci0JaW53CSglZHgpLCVheAotCWlubAkoJWR4KSwlZWF4Ci0JaW4JKCVkeCksJWFsCi0JaW4JKCVkeCksJWF4Ci0JaW4JKCVkeCksJWVheAotCW1vdnpibAkoJWVkaSwlZXNpKSwlZWR4Ci0JbW92emJsCTI4KCVlYnApLCVlYXgKLQltb3Z6YmwJJWFsLCVlYXgKLQltb3Z6YmwJJWNsLCVlc2kKLQl4bGF0CSVlczooJWVieCkKLQl4bGF0Ci0JeGxhdGIKLTE6CWZzdHAJJXN0KDApCi0JbG9vcAkxYgotCWRpdmIgICAgJWNsIAotCWRpdncgICAgJWN4IAotCWRpdmwgICAgJWVjeAotCWRpdgklY2wKLQlkaXYJJWN4Ci0JZGl2CSVlY3gKLQlkaXYJJWNsLCVhbAotCWRpdgklY3gsJWF4Ci0JZGl2CSVlY3gsJWVheAotCW1vdgklc2ksJWRzCi0JbW92bAklc2ksJWRzCQkjIHdhcm5pbmcgaGVyZQotCXB1c2hsCSVkcwotCXB1c2gJJWRzCi0JbW92CTAsJWFsCi0JbW92CTB4MTAwMDAsJWF4Ci0JbW92CSVlYXgsJWVieAotCXB1c2hmCi0JcHVzaGZsCi0JcHVzaGZ3Ci0JcG9wZgotCXBvcGZsCi0JcG9wZncKLQltb3YJJWVzaSwoLCVlYngsMSkKLQlhbmRiCSR+MHg4MCxmb28KLQotI2NoZWNrIDE2LWJpdCBjb2RlIGF1dG8gYWRkcmVzcyBwcmVmaXgKLS5jb2RlMTZnY2MKLQlsZWFsCS0yNTYoJWVicCksJWVkeAotCW1vdgklYWwsLTEyOSglZWJwKQotCW1vdgklYWgsLTEyOCglZWJwKQotCWxlYWwJLTE3NjAoJWVicCksJWVieAotCW1vdmwJJWVheCwxNDAoJWVzcCkKLQotCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLQkucDJhbGlnbgk0LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaTM4Ni5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDAxMTM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaTM4Ni5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jCi0jIGkzODYgdGVzdHMKLSMKLXByb2MgcnVuX2xpc3RfdGVzdCB7IG5hbWUgb3B0cyB9IHsKLSAgICBnbG9iYWwgc3JjZGlyIHN1YmRpcgotICAgIHNldCB0ZXN0bmFtZSAiaTM4NiAkbmFtZSIKLSAgICBzZXQgZmlsZSAkc3JjZGlyLyRzdWJkaXIvJG5hbWUKLSAgICBnYXNfcnVuICR7bmFtZX0ucyAkb3B0cyAiPiZkdW1wLm91dCIKLSAgICBpZiB7IFtyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmwiXSB9IHRoZW4gewotCWZhaWwgJHRlc3RuYW1lCi0JdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCi0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLQotaWYgW2lzdGFyZ2V0ICJpKjg2LSotKiJdIHRoZW4gewotCi0gICAgcnVuX2xpc3RfdGVzdCAiZmxvYXQiICItYWwiCi0gICAgcnVuX2xpc3RfdGVzdCAiZ2VuZXJhbCIgIi1hbCAtLWxpc3RpbmctbGhzLXdpZHRoPTIiCi0gICAgcnVuX2xpc3RfdGVzdCAiaW52YWwiICItYWwiCi0gICAgcnVuX2xpc3RfdGVzdCAibW9kcm0iICItYWwgLS1saXN0aW5nLWxocy13aWR0aD0yIgotICAgIHJ1bl9kdW1wX3Rlc3QgIm5ha2VkIgotICAgIHJ1bl9kdW1wX3Rlc3QgIm9wY29kZSIKLSAgICBydW5fZHVtcF90ZXN0ICJwcmVmaXgiCi0gICAgcnVuX2R1bXBfdGVzdCAiYW1kIgotICAgIHJ1bl9kdW1wX3Rlc3QgImthdG1haSIKLQotICAgICMgVGhlIHJlbG9jIGFuZCB3aGl0ZSB0ZXN0cyByZXF1aXJlIHN1cHBvcnQgZm9yIDggYW5kIDE2IGJpdAotICAgICMgcmVsb2NzLCBzbyB3ZSBvbmx5IHJ1biB0aGVtIGZvciBFTEYgYW5kIENPRkYgdGFyZ2V0cy4KLSAgICBpZiB7W2lzdGFyZ2V0ICIqLSotZWxmKiJdIHx8IFtpc3RhcmdldCAiKi0qLWxpbnV4KiJdIHx8IFtpc3RhcmdldCAiKi0qLWNvZmYqIl19IHRoZW4gewotCXJ1bl9kdW1wX3Rlc3QgInJlbG9jIgotCXJ1bl9saXN0X3Rlc3QgIndoaXRlIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MyIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODk0OTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjM6IEVycm9yOiAuKgotLio6NDogRXJyb3I6IC4qCi0uKjo1OiBFcnJvcjogLioKLS4qOjY6IEVycm9yOiAuKgotLio6NzogRXJyb3I6IC4qCi0uKjo4OiBFcnJvcjogLioKLS4qOjk6IEVycm9yOiAuKgotLio6MTA6IEVycm9yOiAuKgotLio6MTE6IEVycm9yOiAuKgotLio6MTI6IEVycm9yOiAuKgotLio6MTM6IEVycm9yOiAuKgotLio6MTQ6IEVycm9yOiAuKgotLio6MTU6IEVycm9yOiAuKgotLio6MTY6IEVycm9yOiAuKgotLio6MTc6IEVycm9yOiAuKgotLio6MTg6IEVycm9yOiAuKgotLio6MTk6IEVycm9yOiAuKgotLio6MjA6IEVycm9yOiAuKgotLio6MjE6IEVycm9yOiAuKgotLio6MjI6IEVycm9yOiAuKgotLio6MjM6IEVycm9yOiAuKgotLio6MjQ6IEVycm9yOiAuKgotLio6MjU6IEVycm9yOiAuKgotLio6MjY6IEVycm9yOiAuKgotLio6Mjc6IEVycm9yOiAuKgotLio6Mjg6IEVycm9yOiAuKgotLio6Mjk6IEVycm9yOiAuKgotLio6MzA6IEVycm9yOiAuKgotLio6MzE6IEVycm9yOiAuKgotLio6MzI6IEVycm9yOiAuKgotLio6MzM6IEVycm9yOiAuKgotLio6MzQ6IEVycm9yOiAuKgotLio6MzU6IEVycm9yOiAuKgotLio6MzY6IEVycm9yOiAuKgotLio6Mzc6IEVycm9yOiAuKgotLio6Mzg6IEVycm9yOiAuKgotLio6Mzk6IEVycm9yOiAuKgotLio6NDA6IEVycm9yOiAuKgotLio6NDE6IEVycm9yOiAuKgotLio6NDI6IEVycm9yOiAuKgotLio6NDM6IEVycm9yOiAuKgotLio6NDQ6IEVycm9yOiAuKgotLio6NDU6IEVycm9yOiAuKgotLio6NDY6IEVycm9yOiAuKgotLio6NDc6IEVycm9yOiAuKgotLio6NDg6IEVycm9yOiAuKgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxIFsgCV0qCS50ZXh0Ci0gICAyIFsgCV0qIyBBbGwgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgaWxsZWdhbAotICAgMyBbIAldKgltb3YJXCglZHhcKSwlYWwKLSAgIDQgWyAJXSoJbW92CVwoJWVheCwlZXNwLDJcKSwlYWwKLSAgIDUgWyAJXSoJc2V0YWUJJWVheAotICAgNiBbIAldKglwdXNoYgklZHMKLSAgIDcgWyAJXSoJcG9wYgklZHMKLSAgIDggWyAJXSoJcHVzaGIJJWFsCi0gICA5IFsgCV0qCXBvcGIJJWFsCi0gIDEwIFsgCV0qCXB1c2hiCSVhaAotICAxMSBbIAldKglwb3BiCSVhaAotICAxMiBbIAldKglwdXNoYgklYXgKLSAgMTMgWyAJXSoJcG9wYgklYXgKLSAgMTQgWyAJXSoJcHVzaGIJJWVheAotICAxNSBbIAldKglwb3BiCSVlYXgKLSAgMTYgWyAJXSoJbW92YgklZHMsJWF4Ci0gIDE3IFsgCV0qCW1vdmIJJWRzLCVlYXgKLSAgMTggWyAJXSoJbW92YgklYXgsJWRzCi0gIDE5IFsgCV0qCW1vdmIJJWVheCwlZHMKLSAgMjAgWyAJXSoJbW92ZGIJJWVheCwlbW0wCi0gIDIxIFsgCV0qCW1vdnFiCTAsJW1tMAotICAyMiBbIAldKglsZHNiCTAsJWVheAotICAyMyBbIAldKglzZXRuZXcJMAotICAyNCBbIAldKgltb3ZkdwklZWF4LCVtbTAKLSAgMjUgWyAJXSoJbW92cXcJMCwlbW0wCi0gIDI2IFsgCV0qCWRpdgklY3gsJWFsCi0gIDI3IFsgCV0qCWRpdgklY2wsJWF4Ci0gIDI4IFsgCV0qCWRpdgklZWN4LCVhbAotICAyOSBbIAldKglpbXVsCTEwLCVieCwlZWN4Ci0gIDMwIFsgCV0qCWltdWwJMTAsJWJ4LCVhbAotICAzMSBbIAldKglwb3BhYgotICAzMiBbIAldKglzdGlsCi0gIDMzIFsgCV0qCWFhYWIKLSAgMzQgWyAJXSoJY3dkZWwKLSAgMzUgWyAJXSoJY3dkdwotICAzNiBbIAldKgljYWxsd3cJMAotICAzNyBbIAldKmZvbzoJamF3CWZvbwotICAzOCBbIAldKglqY3h6dwlmb28KLSAgMzkgWyAJXSoJamVjeHpsCWZvbwotICA0MCBbIAldKglsb29wYglmb28KLSAgNDEgWyAJXSoJeGxhdHcJJWVzOiVieAotICA0MiBbIAldKgl4bGF0bAklZXM6JWJ4Ci0gIDQzIFsgCV0qCWludGwJMgotICA0NCBbIAldKglpbnQzYgotICA0NSBbIAldKglobHRiCi0gIDQ2IFsgCV0qCWZzdGIJJXN0XCgwXCkKLSAgNDcgWyAJXSoJZmNvbXBsbAkyOFwoJWVicFwpCi0gIDQ4IFsgCV0qCWZsZGx3CVwoJWVheFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzN2ExOGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotCS50ZXh0Ci0jIEFsbCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBpbGxlZ2FsCi0JbW92CSglZHgpLCVhbAotCW1vdgkoJWVheCwlZXNwLDIpLCVhbAotCXNldGFlCSVlYXgKLQlwdXNoYgklZHMKLQlwb3BiCSVkcwotCXB1c2hiCSVhbAotCXBvcGIJJWFsCi0JcHVzaGIJJWFoCi0JcG9wYgklYWgKLQlwdXNoYgklYXgKLQlwb3BiCSVheAotCXB1c2hiCSVlYXgKLQlwb3BiCSVlYXgKLQltb3ZiCSVkcywlYXgKLQltb3ZiCSVkcywlZWF4Ci0JbW92YgklYXgsJWRzCi0JbW92YgklZWF4LCVkcwotCW1vdmRiCSVlYXgsJW1tMAotCW1vdnFiCTAsJW1tMAotCWxkc2IJMCwlZWF4Ci0Jc2V0bmV3CTAKLQltb3ZkdwklZWF4LCVtbTAKLQltb3ZxdwkwLCVtbTAKLQlkaXYJJWN4LCVhbAotCWRpdgklY2wsJWF4Ci0JZGl2CSVlY3gsJWFsCi0JaW11bAkxMCwlYngsJWVjeAotCWltdWwJMTAsJWJ4LCVhbAotCXBvcGFiCi0Jc3RpbAotCWFhYWIKLQljd2RlbAotCWN3ZHcKLQljYWxsd3cJMAotZm9vOglqYXcJZm9vCi0JamN4encJZm9vCi0JamVjeHpsCWZvbwotCWxvb3BiCWZvbwotCXhsYXR3CSVlczolYngKLQl4bGF0bAklZXM6JWJ4Ci0JaW50bAkyCi0JaW50M2IKLQlobHRiCi0JZnN0Ygklc3QoMCkKLQlmY29tcGxsCTI4KCVlYnApCi0JZmxkbHcJKCVlYXgpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwODU4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IGthdG1haQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMGYgNTggMDEgWyAJXSphZGRwcyAgXCglZWN4XCksJXhtbTAKLSAgIDM6CTBmIDU4IGNhIFsgCV0qYWRkcHMgICV4bW0yLCV4bW0xCi0gICA2OglmMyAwZiA1OCAxMyBbIAldKmFkZHNzICBcKCVlYnhcKSwleG1tMgotICAgYToJZjMgMGYgNTggZGMgWyAJXSphZGRzcyAgJXhtbTQsJXhtbTMKLSAgIGU6CTBmIDU1IDY1IDAwIFsgCV0qYW5kbnBzIDB4MFwoJWVicFwpLCV4bW00Ci0gIDEyOgkwZiA1NSBlZSBbIAldKmFuZG5wcyAleG1tNiwleG1tNQotICAxNToJMGYgNTQgMzcgWyAJXSphbmRwcyAgXCglZWRpXCksJXhtbTYKLSAgMTg6CTBmIDU0IGY4IFsgCV0qYW5kcHMgICV4bW0wLCV4bW03Ci0gIDFiOgkwZiBjMiBjMSAwMiBbIAldKmNtcGxlcHMgJXhtbTEsJXhtbTAKLSAgMWY6CTBmIGMyIDBhIDAzIFsgCV0qY21wdW5vcmRwcyBcKCVlZHhcKSwleG1tMQotICAyMzoJZjMgMGYgYzIgZDIgMDQgWyAJXSpjbXBuZXFzcyAleG1tMiwleG1tMgotICAyODoJZjMgMGYgYzIgMWMgMjQgMDUgWyAJXSpjbXBubHRzcyBcKCVlc3AsMVwpLCV4bW0zCi0gIDJlOgkwZiBjMiBlNSAwNiBbIAldKmNtcG5sZXBzICV4bW01LCV4bW00Ci0gIDMyOgkwZiBjMiAyZSAwNyBbIAldKmNtcG9yZHBzIFwoJWVzaVwpLCV4bW01Ci0gIDM2OglmMyAwZiBjMiBmNyAwMCBbIAldKmNtcGVxc3MgJXhtbTcsJXhtbTYKLSAgM2I6CWYzIDBmIGMyIDM4IDAxIFsgCV0qY21wbHRzcyBcKCVlYXhcKSwleG1tNwotICA0MDoJMGYgYzIgYzEgMDAgWyAJXSpjbXBlcXBzICV4bW0xLCV4bW0wCi0gIDQ0OgkwZiBjMiAwYSAwMCBbIAldKmNtcGVxcHMgXCglZWR4XCksJXhtbTEKLSAgNDg6CWYzIDBmIGMyIGQyIDAwIFsgCV0qY21wZXFzcyAleG1tMiwleG1tMgotICA0ZDoJZjMgMGYgYzIgMWMgMjQgMDAgWyAJXSpjbXBlcXNzIFwoJWVzcCwxXCksJXhtbTMKLSAgNTM6CTBmIGMyIGU1IDAxIFsgCV0qY21wbHRwcyAleG1tNSwleG1tNAotICA1NzoJMGYgYzIgMmUgMDEgWyAJXSpjbXBsdHBzIFwoJWVzaVwpLCV4bW01Ci0gIDViOglmMyAwZiBjMiBmNyAwMSBbIAldKmNtcGx0c3MgJXhtbTcsJXhtbTYKLSAgNjA6CWYzIDBmIGMyIDM4IDAxIFsgCV0qY21wbHRzcyBcKCVlYXhcKSwleG1tNwotICA2NToJMGYgYzIgMDEgMDIgWyAJXSpjbXBsZXBzIFwoJWVjeFwpLCV4bW0wCi0gIDY5OgkwZiBjMiBjYSAwMiBbIAldKmNtcGxlcHMgJXhtbTIsJXhtbTEKLSAgNmQ6CWYzIDBmIGMyIDEzIDAyIFsgCV0qY21wbGVzcyBcKCVlYnhcKSwleG1tMgotICA3MjoJZjMgMGYgYzIgZGMgMDIgWyAJXSpjbXBsZXNzICV4bW00LCV4bW0zCi0gIDc3OgkwZiBjMiA2NSAwMCAwMyBbIAldKmNtcHVub3JkcHMgMHgwXCglZWJwXCksJXhtbTQKLSAgN2M6CTBmIGMyIGVlIDAzIFsgCV0qY21wdW5vcmRwcyAleG1tNiwleG1tNQotICA4MDoJZjMgMGYgYzIgMzcgMDMgWyAJXSpjbXB1bm9yZHNzIFwoJWVkaVwpLCV4bW02Ci0gIDg1OglmMyAwZiBjMiBmOCAwMyBbIAldKmNtcHVub3Jkc3MgJXhtbTAsJXhtbTcKLSAgOGE6CTBmIGMyIGMxIDA0IFsgCV0qY21wbmVxcHMgJXhtbTEsJXhtbTAKLSAgOGU6CTBmIGMyIDBhIDA0IFsgCV0qY21wbmVxcHMgXCglZWR4XCksJXhtbTEKLSAgOTI6CWYzIDBmIGMyIGQyIDA0IFsgCV0qY21wbmVxc3MgJXhtbTIsJXhtbTIKLSAgOTc6CWYzIDBmIGMyIDFjIDI0IDA0IFsgCV0qY21wbmVxc3MgXCglZXNwLDFcKSwleG1tMwotICA5ZDoJMGYgYzIgZTUgMDUgWyAJXSpjbXBubHRwcyAleG1tNSwleG1tNAotICBhMToJMGYgYzIgMmUgMDUgWyAJXSpjbXBubHRwcyBcKCVlc2lcKSwleG1tNQotICBhNToJZjMgMGYgYzIgZjcgMDUgWyAJXSpjbXBubHRzcyAleG1tNywleG1tNgotICBhYToJZjMgMGYgYzIgMzggMDUgWyAJXSpjbXBubHRzcyBcKCVlYXhcKSwleG1tNwotICBhZjoJMGYgYzIgMDEgMDYgWyAJXSpjbXBubGVwcyBcKCVlY3hcKSwleG1tMAotICBiMzoJMGYgYzIgY2EgMDYgWyAJXSpjbXBubGVwcyAleG1tMiwleG1tMQotICBiNzoJZjMgMGYgYzIgMTMgMDYgWyAJXSpjbXBubGVzcyBcKCVlYnhcKSwleG1tMgotICBiYzoJZjMgMGYgYzIgZGMgMDYgWyAJXSpjbXBubGVzcyAleG1tNCwleG1tMwotICBjMToJMGYgYzIgNjUgMDAgMDcgWyAJXSpjbXBvcmRwcyAweDBcKCVlYnBcKSwleG1tNAotICBjNjoJMGYgYzIgZWUgMDcgWyAJXSpjbXBvcmRwcyAleG1tNiwleG1tNQotICBjYToJZjMgMGYgYzIgMzcgMDcgWyAJXSpjbXBvcmRzcyBcKCVlZGlcKSwleG1tNgotICBjZjoJZjMgMGYgYzIgZjggMDcgWyAJXSpjbXBvcmRzcyAleG1tMCwleG1tNwotICBkNDoJMGYgMmYgYzEgWyAJXSpjb21pc3MgJXhtbTEsJXhtbTAKLSAgZDc6CTBmIDJmIDBhIFsgCV0qY29taXNzIFwoJWVkeFwpLCV4bW0xCi0gIGRhOgkwZiAyYSBkMyBbIAldKmN2dHBpMnBzICVtbTMsJXhtbTIKLSAgZGQ6CTBmIDJhIDFjIDI0IFsgCV0qY3Z0cGkycHMgXCglZXNwLDFcKSwleG1tMwotICBlMToJZjMgMGYgMmEgZTUgWyAJXSpjdnRzaTJzcyAlZWJwLCV4bW00Ci0gIGU1OglmMyAwZiAyYSAyZSBbIAldKmN2dHNpMnNzIFwoJWVzaVwpLCV4bW01Ci0gIGU5OgkwZiAyZCBmNyBbIAldKmN2dHBzMnBpICV4bW03LCVtbTYKLSAgZWM6CTBmIDJkIDM4IFsgCV0qY3Z0cHMycGkgXCglZWF4XCksJW1tNwotICBlZjoJZjMgMGYgMmQgMDEgWyAJXSpjdnRzczJzaSBcKCVlY3hcKSwlZWF4Ci0gIGYzOglmMyAwZiAyZCBjYSBbIAldKmN2dHNzMnNpICV4bW0yLCVlY3gKLSAgZjc6CTBmIDJjIDEzIFsgCV0qY3Z0dHBzMnBpIFwoJWVieFwpLCVtbTIKLSAgZmE6CTBmIDJjIGRjIFsgCV0qY3Z0dHBzMnBpICV4bW00LCVtbTMKLSAgZmQ6CWYzIDBmIDJjIDY1IDAwIFsgCV0qY3Z0dHNzMnNpIDB4MFwoJWVicFwpLCVlc3AKLSAxMDI6CWYzIDBmIDJjIGVlIFsgCV0qY3Z0dHNzMnNpICV4bW02LCVlYnAKLSAxMDY6CTBmIDVlIGMxIFsgCV0qZGl2cHMgICV4bW0xLCV4bW0wCi0gMTA5OgkwZiA1ZSAwYSBbIAldKmRpdnBzICBcKCVlZHhcKSwleG1tMQotIDEwYzoJZjMgMGYgNWUgZDMgWyAJXSpkaXZzcyAgJXhtbTMsJXhtbTIKLSAxMTA6CWYzIDBmIDVlIDFjIDI0IFsgCV0qZGl2c3MgIFwoJWVzcCwxXCksJXhtbTMKLSAxMTU6CTBmIGFlIDU1IDAwIFsgCV0qbGRteGNzciAweDBcKCVlYnBcKQotIDExOToJMGYgYWUgMWUgWyAJXSpzdG14Y3NyIFwoJWVzaVwpCi0gMTFjOgkwZiBhZSBmOCBbIAldKnNmZW5jZSAKLSAxMWY6CTBmIDVmIGMxIFsgCV0qbWF4cHMgICV4bW0xLCV4bW0wCi0gMTIyOgkwZiA1ZiAwYSBbIAldKm1heHBzICBcKCVlZHhcKSwleG1tMQotIDEyNToJZjMgMGYgNWYgZDMgWyAJXSptYXhzcyAgJXhtbTMsJXhtbTIKLSAxMjk6CWYzIDBmIDVmIDFjIDI0IFsgCV0qbWF4c3MgIFwoJWVzcCwxXCksJXhtbTMKLSAxMmU6CTBmIDVkIGU1IFsgCV0qbWlucHMgICV4bW01LCV4bW00Ci0gMTMxOgkwZiA1ZCAyZSBbIAldKm1pbnBzICBcKCVlc2lcKSwleG1tNQotIDEzNDoJZjMgMGYgNWQgZjcgWyAJXSptaW5zcyAgJXhtbTcsJXhtbTYKLSAxMzg6CWYzIDBmIDVkIDM4IFsgCV0qbWluc3MgIFwoJWVheFwpLCV4bW03Ci0gMTNjOgkwZiAyOCBjMSBbIAldKm1vdmFwcyAleG1tMSwleG1tMAotIDEzZjoJMGYgMjkgMTEgWyAJXSptb3ZhcHMgJXhtbTIsXCglZWN4XCkKLSAxNDI6CTBmIDI4IDEyIFsgCV0qbW92YXBzIFwoJWVkeFwpLCV4bW0yCi0gMTQ1OgkwZiAxNiBkYyBbIAldKm1vdmxocHMgJXhtbTQsJXhtbTMKLSAxNDg6CTBmIDE3IDJjIDI0IFsgCV0qbW92aHBzICV4bW01LFwoJWVzcCwxXCkKLSAxNGM6CTBmIDE2IDJlIFsgCV0qbW92aHBzIFwoJWVzaVwpLCV4bW01Ci0gMTRmOgkwZiAxMiBmNyBbIAldKm1vdmhscHMgJXhtbTcsJXhtbTYKLSAxNTI6CTBmIDEzIDA3IFsgCV0qbW92bHBzICV4bW0wLFwoJWVkaVwpCi0gMTU1OgkwZiAxMiAwMCBbIAldKm1vdmxwcyBcKCVlYXhcKSwleG1tMAotIDE1ODoJMGYgNTAgY2EgWyAJXSptb3Ztc2twcyAleG1tMiwlZWN4Ci0gMTViOgkwZiAxMCBkMyBbIAldKm1vdnVwcyAleG1tMywleG1tMgotIDE1ZToJMGYgMTEgMjIgWyAJXSptb3Z1cHMgJXhtbTQsXCglZWR4XCkKLSAxNjE6CTBmIDEwIDY1IDAwIFsgCV0qbW92dXBzIDB4MFwoJWVicFwpLCV4bW00Ci0gMTY1OglmMyAwZiAxMCBlZSBbIAldKm1vdnNzICAleG1tNiwleG1tNQotIDE2OToJZjMgMGYgMTEgM2UgWyAJXSptb3ZzcyAgJXhtbTcsXCglZXNpXCkKLSAxNmQ6CWYzIDBmIDEwIDM4IFsgCV0qbW92c3MgIFwoJWVheFwpLCV4bW03Ci0gMTcxOgkwZiA1OSBjMSBbIAldKm11bHBzICAleG1tMSwleG1tMAotIDE3NDoJMGYgNTkgMGEgWyAJXSptdWxwcyAgXCglZWR4XCksJXhtbTEKLSAxNzc6CWYzIDBmIDU5IGQyIFsgCV0qbXVsc3MgICV4bW0yLCV4bW0yCi0gMTdiOglmMyAwZiA1OSAxYyAyNCBbIAldKm11bHNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTgwOgkwZiA1NiBlNSBbIAldKm9ycHMgICAleG1tNSwleG1tNAotIDE4MzoJMGYgNTYgMmUgWyAJXSpvcnBzICAgXCglZXNpXCksJXhtbTUKLSAxODY6CTBmIDUzIGY3IFsgCV0qcmNwcHMgICV4bW03LCV4bW02Ci0gMTg5OgkwZiA1MyAzOCBbIAldKnJjcHBzICBcKCVlYXhcKSwleG1tNwotIDE4YzoJZjMgMGYgNTMgMDEgWyAJXSpyY3BzcyAgXCglZWN4XCksJXhtbTAKLSAxOTA6CWYzIDBmIDUzIGNhIFsgCV0qcmNwc3MgICV4bW0yLCV4bW0xCi0gMTk0OgkwZiA1MiAxMyBbIAldKnJzcXJ0cHMgXCglZWJ4XCksJXhtbTIKLSAxOTc6CTBmIDUyIGRjIFsgCV0qcnNxcnRwcyAleG1tNCwleG1tMwotIDE5YToJZjMgMGYgNTIgNjUgMDAgWyAJXSpyc3FydHNzIDB4MFwoJWVicFwpLCV4bW00Ci0gMTlmOglmMyAwZiA1MiBlZSBbIAldKnJzcXJ0c3MgJXhtbTYsJXhtbTUKLSAxYTM6CTBmIGM2IDM3IDAyIFsgCV0qc2h1ZnBzIFwkMHgyLFwoJWVkaVwpLCV4bW02Ci0gMWE3OgkwZiBjNiBmOCAwMyBbIAldKnNodWZwcyBcJDB4MywleG1tMCwleG1tNwotIDFhYjoJMGYgNTEgYzEgWyAJXSpzcXJ0cHMgJXhtbTEsJXhtbTAKLSAxYWU6CTBmIDUxIDBhIFsgCV0qc3FydHBzIFwoJWVkeFwpLCV4bW0xCi0gMWIxOglmMyAwZiA1MSBkMiBbIAldKnNxcnRzcyAleG1tMiwleG1tMgotIDFiNToJZjMgMGYgNTEgMWMgMjQgWyAJXSpzcXJ0c3MgXCglZXNwLDFcKSwleG1tMwotIDFiYToJMGYgNWMgZTUgWyAJXSpzdWJwcyAgJXhtbTUsJXhtbTQKLSAxYmQ6CTBmIDVjIDJlIFsgCV0qc3VicHMgIFwoJWVzaVwpLCV4bW01Ci0gMWMwOglmMyAwZiA1YyBmNyBbIAldKnN1YnNzICAleG1tNywleG1tNgotIDFjNDoJZjMgMGYgNWMgMzggWyAJXSpzdWJzcyAgXCglZWF4XCksJXhtbTcKLSAxYzg6CTBmIDJlIDAxIFsgCV0qdWNvbWlzcyBcKCVlY3hcKSwleG1tMAotIDFjYjoJMGYgMmUgY2EgWyAJXSp1Y29taXNzICV4bW0yLCV4bW0xCi0gMWNlOgkwZiAxNSAxMyBbIAldKnVucGNraHBzIFwoJWVieFwpLCV4bW0yCi0gMWQxOgkwZiAxNSBkYyBbIAldKnVucGNraHBzICV4bW00LCV4bW0zCi0gMWQ0OgkwZiAxNCA2NSAwMCBbIAldKnVucGNrbHBzIDB4MFwoJWVicFwpLCV4bW00Ci0gMWQ4OgkwZiAxNCBlZSBbIAldKnVucGNrbHBzICV4bW02LCV4bW01Ci0gMWRiOgkwZiA1NyAzNyBbIAldKnhvcnBzICBcKCVlZGlcKSwleG1tNgotIDFkZToJMGYgNTcgZjggWyAJXSp4b3JwcyAgJXhtbTAsJXhtbTcKLSAxZTE6CTBmIGUwIGMxIFsgCV0qcGF2Z2IgICVtbTEsJW1tMAotIDFlNDoJMGYgZTAgMGEgWyAJXSpwYXZnYiAgXCglZWR4XCksJW1tMQotIDFlNzoJMGYgZTMgZDMgWyAJXSpwYXZndyAgJW1tMywlbW0yCi0gMWVhOgkwZiBlMyAxYyAyNCBbIAldKnBhdmd3ICBcKCVlc3AsMVwpLCVtbTMKLSAxZWU6CTBmIGM1IGM4IDAwIFsgCV0qcGV4dHJ3IFwkMHgwLCVtbTEsJWVheAotIDFmMjoJMGYgYzQgMDkgMDEgWyAJXSpwaW5zcncgXCQweDEsXCglZWN4XCksJW1tMQotIDFmNjoJMGYgYzQgZDIgMDIgWyAJXSpwaW5zcncgXCQweDIsJWVkeCwlbW0yCi0gMWZhOgkwZiBlZSBjMSBbIAldKnBtYXhzdyAlbW0xLCVtbTAKLSAxZmQ6CTBmIGVlIDBhIFsgCV0qcG1heHN3IFwoJWVkeFwpLCVtbTEKLSAyMDA6CTBmIGRlIGQyIFsgCV0qcG1heHViICVtbTIsJW1tMgotIDIwMzoJMGYgZGUgMWMgMjQgWyAJXSpwbWF4dWIgXCglZXNwLDFcKSwlbW0zCi0gMjA3OgkwZiBlYSBlNSBbIAldKnBtaW5zdyAlbW01LCVtbTQKLSAyMGE6CTBmIGVhIDJlIFsgCV0qcG1pbnN3IFwoJWVzaVwpLCVtbTUKLSAyMGQ6CTBmIGRhIGY3IFsgCV0qcG1pbnViICVtbTcsJW1tNgotIDIxMDoJMGYgZGEgMzggWyAJXSpwbWludWIgXCglZWF4XCksJW1tNwotIDIxMzoJMGYgZDcgZTggWyAJXSpwbW92bXNrYiAlbW01LCVlYXgKLSAyMTY6CTBmIGU0IGU1IFsgCV0qcG11bGh1dyAlbW01LCVtbTQKLSAyMTk6CTBmIGU0IDJlIFsgCV0qcG11bGh1dyBcKCVlc2lcKSwlbW01Ci0gMjFjOgkwZiBmNiBmNyBbIAldKnBzYWRidyAlbW03LCVtbTYKLSAyMWY6CTBmIGY2IDM4IFsgCV0qcHNhZGJ3IFwoJWVheFwpLCVtbTcKLSAyMjI6CTBmIDcwIGRhIDAxIFsgCV0qcHNodWZ3IFwkMHgxLCVtbTIsJW1tMwotIDIyNjoJMGYgNzAgNzUgMDAgMDQgWyAJXSpwc2h1ZncgXCQweDQsMHgwXCglZWJwXCksJW1tNgotIDIyYjoJMGYgZjcgYzcgWyAJXSptYXNrbW92cSAlbW03LCVtbTAKLSAyMmU6CTBmIDJiIDMzIFsgCV0qbW92bnRwcyAleG1tNixcKCVlYnhcKQotIDIzMToJMGYgZTcgMTAgWyAJXSptb3ZudHEgJW1tMixcKCVlYXhcKQotIDIzNDoJMGYgMTggMDYgWyAJXSpwcmVmZXRjaG50YSBcKCVlc2lcKQotIDIzNzoJMGYgMTggMGMgOTggWyAJXSpwcmVmZXRjaHQwIFwoJWVheCwlZWJ4LDRcKQotIDIzYjoJMGYgMTggMTIgWyAJXSpwcmVmZXRjaHQxIFwoJWVkeFwpCi0gMjNlOgkwZiAxOCAxOSBbIAldKnByZWZldGNodDIgXCglZWN4XCkKLSAyNDE6CTJlIDBmIFsgCV0qXChiYWRcKSAgCi0gMjQzOgljMiAwYSAwOCBbIAldKnJldCAgICBcJDB4ODBhCi0gMjQ2Ogk5MCBbIAldKm5vcCAgICAKLSAyNDc6CTkwIFsgCV0qbm9wICAgIAotIDI0ODoJNjUgWyAJXSpncwotIDI0OToJMGYgWyAJXSpzZmVuY2UuKlwoYmFkXCkuKgotIDI0YToJYWUgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVhbAotIDI0YjoJZmYgMDAgWyAJXSppbmNsICAgXCglZWF4XCkKLSAyNGQ6CTAwIDAwIFsgCV0qYWRkICAgICVhbCxcKCVlYXhcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGQxNWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkucworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0jUElJSSBTSU1EIGluc3RydWN0aW9ucwotCi0udGV4dAotZm9vOgotIGFkZHBzCQkoJWVjeCksJXhtbTAKLSBhZGRwcwkJJXhtbTIsJXhtbTEKLSBhZGRzcwkJKCVlYngpLCV4bW0yCi0gYWRkc3MJCSV4bW00LCV4bW0zCi0gYW5kbnBzCQkweDAoJWVicCksJXhtbTQKLSBhbmRucHMJCSV4bW02LCV4bW01Ci0gYW5kcHMJCSglZWRpKSwleG1tNgotIGFuZHBzCQkleG1tMCwleG1tNwotIGNtcHBzCQkkMHgyLCV4bW0xLCV4bW0wCi0gY21wcHMJCSQweDMsKCVlZHgpLCV4bW0xCi0gY21wc3MJCSQweDQsJXhtbTIsJXhtbTIKLSBjbXBzcwkJJDB4NSwoJWVzcCwxKSwleG1tMwotIGNtcHBzCQkkMHg2LCV4bW01LCV4bW00Ci0gY21wcHMJCSQweDcsKCVlc2kpLCV4bW01Ci0gY21wc3MJCSQweDAsJXhtbTcsJXhtbTYKLSBjbXBzcwkJJDB4MSwoJWVheCksJXhtbTcKLSBjbXBlcXBzCSV4bW0xLCV4bW0wCi0gY21wZXFwcwkoJWVkeCksJXhtbTEKLSBjbXBlcXNzCSV4bW0yLCV4bW0yCi0gY21wZXFzcwkoJWVzcCwxKSwleG1tMwotIGNtcGx0cHMJJXhtbTUsJXhtbTQKLSBjbXBsdHBzCSglZXNpKSwleG1tNQotIGNtcGx0c3MJJXhtbTcsJXhtbTYKLSBjbXBsdHNzCSglZWF4KSwleG1tNwotIGNtcGxlcHMJKCVlY3gpLCV4bW0wCi0gY21wbGVwcwkleG1tMiwleG1tMQotIGNtcGxlc3MJKCVlYngpLCV4bW0yCi0gY21wbGVzcwkleG1tNCwleG1tMwotIGNtcHVub3JkcHMJMHgwKCVlYnApLCV4bW00Ci0gY21wdW5vcmRwcwkleG1tNiwleG1tNQotIGNtcHVub3Jkc3MJKCVlZGkpLCV4bW02Ci0gY21wdW5vcmRzcwkleG1tMCwleG1tNwotIGNtcG5lcXBzCSV4bW0xLCV4bW0wCi0gY21wbmVxcHMJKCVlZHgpLCV4bW0xCi0gY21wbmVxc3MJJXhtbTIsJXhtbTIKLSBjbXBuZXFzcwkoJWVzcCwxKSwleG1tMwotIGNtcG5sdHBzCSV4bW01LCV4bW00Ci0gY21wbmx0cHMJKCVlc2kpLCV4bW01Ci0gY21wbmx0c3MJJXhtbTcsJXhtbTYKLSBjbXBubHRzcwkoJWVheCksJXhtbTcKLSBjbXBubGVwcwkoJWVjeCksJXhtbTAKLSBjbXBubGVwcwkleG1tMiwleG1tMQotIGNtcG5sZXNzCSglZWJ4KSwleG1tMgotIGNtcG5sZXNzCSV4bW00LCV4bW0zCi0gY21wb3JkcHMJMHgwKCVlYnApLCV4bW00Ci0gY21wb3JkcHMJJXhtbTYsJXhtbTUKLSBjbXBvcmRzcwkoJWVkaSksJXhtbTYKLSBjbXBvcmRzcwkleG1tMCwleG1tNwotIGNvbWlzcwkJJXhtbTEsJXhtbTAKLSBjb21pc3MJCSglZWR4KSwleG1tMQotIGN2dHBpMnBzCSVtbTMsJXhtbTIKLSBjdnRwaTJwcwkoJWVzcCwxKSwleG1tMwotIGN2dHNpMnNzCSVlYnAsJXhtbTQKLSBjdnRzaTJzcwkoJWVzaSksJXhtbTUKLSBjdnRwczJwaQkleG1tNywlbW02Ci0gY3Z0cHMycGkJKCVlYXgpLCVtbTcKLSBjdnRzczJzaQkoJWVjeCksJWVheAotIGN2dHNzMnNpCSV4bW0yLCVlY3gKLSBjdnR0cHMycGkJKCVlYngpLCVtbTIKLSBjdnR0cHMycGkJJXhtbTQsJW1tMwotIGN2dHRzczJzaQkweDAoJWVicCksJWVzcAotIGN2dHRzczJzaQkleG1tNiwlZWJwCi0gZGl2cHMJCSV4bW0xLCV4bW0wCi0gZGl2cHMJCSglZWR4KSwleG1tMQotIGRpdnNzCQkleG1tMywleG1tMgotIGRpdnNzCQkoJWVzcCwxKSwleG1tMwotIGxkbXhjc3IJMHgwKCVlYnApCi0gc3RteGNzcgkoJWVzaSkKLSBzZmVuY2UKLSBtYXhwcwkJJXhtbTEsJXhtbTAKLSBtYXhwcwkJKCVlZHgpLCV4bW0xCi0gbWF4c3MJCSV4bW0zLCV4bW0yCi0gbWF4c3MJCSglZXNwLDEpLCV4bW0zCi0gbWlucHMJCSV4bW01LCV4bW00Ci0gbWlucHMJCSglZXNpKSwleG1tNQotIG1pbnNzCQkleG1tNywleG1tNgotIG1pbnNzCQkoJWVheCksJXhtbTcKLSBtb3ZhcHMJCSV4bW0xLCV4bW0wCi0gbW92YXBzCQkleG1tMiwoJWVjeCkKLSBtb3ZhcHMJCSglZWR4KSwleG1tMgotIG1vdmxocHMJJXhtbTQsJXhtbTMKLSBtb3ZocHMJCSV4bW01LCglZXNwLDEpCi0gbW92aHBzCQkoJWVzaSksJXhtbTUKLSBtb3ZobHBzCSV4bW03LCV4bW02Ci0gbW92bHBzCQkleG1tMCwoJWVkaSkKLSBtb3ZscHMJCSglZWF4KSwleG1tMAotIG1vdm1za3BzCSV4bW0yLCVlY3gKLSBtb3Z1cHMJCSV4bW0zLCV4bW0yCi0gbW92dXBzCQkleG1tNCwoJWVkeCkKLSBtb3Z1cHMJCTB4MCglZWJwKSwleG1tNAotIG1vdnNzCQkleG1tNiwleG1tNQotIG1vdnNzCQkleG1tNywoJWVzaSkKLSBtb3ZzcwkJKCVlYXgpLCV4bW03Ci0gbXVscHMJCSV4bW0xLCV4bW0wCi0gbXVscHMJCSglZWR4KSwleG1tMQotIG11bHNzCQkleG1tMiwleG1tMgotIG11bHNzCQkoJWVzcCwxKSwleG1tMwotIG9ycHMJCSV4bW01LCV4bW00Ci0gb3JwcwkJKCVlc2kpLCV4bW01Ci0gcmNwcHMJCSV4bW03LCV4bW02Ci0gcmNwcHMJCSglZWF4KSwleG1tNwotIHJjcHNzCQkoJWVjeCksJXhtbTAKLSByY3BzcwkJJXhtbTIsJXhtbTEKLSByc3FydHBzCSglZWJ4KSwleG1tMgotIHJzcXJ0cHMJJXhtbTQsJXhtbTMKLSByc3FydHNzCTB4MCglZWJwKSwleG1tNAotIHJzcXJ0c3MJJXhtbTYsJXhtbTUKLSBzaHVmcHMJCSQweDIsKCVlZGkpLCV4bW02Ci0gc2h1ZnBzCQkkMHgzLCV4bW0wLCV4bW03Ci0gc3FydHBzCQkleG1tMSwleG1tMAotIHNxcnRwcwkJKCVlZHgpLCV4bW0xCi0gc3FydHNzCQkleG1tMiwleG1tMgotIHNxcnRzcwkJKCVlc3AsMSksJXhtbTMKLSBzdWJwcwkJJXhtbTUsJXhtbTQKLSBzdWJwcwkJKCVlc2kpLCV4bW01Ci0gc3Vic3MJCSV4bW03LCV4bW02Ci0gc3Vic3MJCSglZWF4KSwleG1tNwotIHVjb21pc3MJKCVlY3gpLCV4bW0wCi0gdWNvbWlzcwkleG1tMiwleG1tMQotIHVucGNraHBzCSglZWJ4KSwleG1tMgotIHVucGNraHBzCSV4bW00LCV4bW0zCi0gdW5wY2tscHMJMHgwKCVlYnApLCV4bW00Ci0gdW5wY2tscHMJJXhtbTYsJXhtbTUKLSB4b3JwcwkJKCVlZGkpLCV4bW02Ci0geG9ycHMJCSV4bW0wLCV4bW03Ci0gcGF2Z2IJCSVtbTEsJW1tMAotIHBhdmdiCQkoJWVkeCksJW1tMQotIHBhdmd3CQklbW0zLCVtbTIKLSBwYXZndwkJKCVlc3AsMSksJW1tMwotIHBleHRydwkJJDB4MCwlbW0xLCVlYXgKLSBwaW5zcncJCSQweDEsKCVlY3gpLCVtbTEKLSBwaW5zcncJCSQweDIsJWVkeCwlbW0yCi0gcG1heHN3CQklbW0xLCVtbTAKLSBwbWF4c3cJCSglZWR4KSwlbW0xCi0gcG1heHViCQklbW0yLCVtbTIKLSBwbWF4dWIJCSglZXNwLDEpLCVtbTMKLSBwbWluc3cJCSVtbTUsJW1tNAotIHBtaW5zdwkJKCVlc2kpLCVtbTUKLSBwbWludWIJCSVtbTcsJW1tNgotIHBtaW51YgkJKCVlYXgpLCVtbTcKLSBwbW92bXNrYgklbW01LCVlYXgKLSBwbXVsaHV3CSVtbTUsJW1tNAotIHBtdWxodXcJKCVlc2kpLCVtbTUKLSBwc2FkYncJCSVtbTcsJW1tNgotIHBzYWRidwkJKCVlYXgpLCVtbTcKLSBwc2h1ZncJCSQweDEsJW1tMiwlbW0zCi0gcHNodWZ3CQkkMHg0LDB4MCglZWJwKSwlbW02Ci0gbWFza21vdnEJJW1tNywlbW0wCi0gbW92bnRwcwkleG1tNiwoJWVieCkKLSBtb3ZudHEJCSVtbTIsKCVlYXgpCi0gcHJlZmV0Y2hudGEJKCVlc2kpCi0gcHJlZmV0Y2h0MAkoJWVheCwlZWJ4LDQpCi0gcHJlZmV0Y2h0MQkoJWVkeCkKLSBwcmVmZXRjaHQyCSglZWN4KQotCi0jIEEgU0lNRCBpbnN0cnVjdGlvbiB3aXRoIGEgYmFkIGV4dGVuc2lvbiBieXRlCi0uYnl0ZSAweDJFLDB4MEYsMHhDMiwweDBBLDB4MDgKLSBub3AKLSBub3AKLSMgQSBiYWQgc2ZlbmNlIG1vZHJtIGJ5dGUKLS5ieXRlIDB4NjUsMHgwRiwweEFFLDB4ZmYKLSMgUGFkIG91dCB0byBnb29kIGFsaWdubWVudAotIC5wMmFsaWduIDQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNiMDk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ubAorKysgL2Rldi9udWxsCkBAIC0xLDE5ODQgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjEyODogV2FybmluZzouKgotLio6MTI5OiBXYXJuaW5nOi4qCi0uKjoxMzA6IFdhcm5pbmc6LioKLS4qOjEzMTogV2FybmluZzouKgotLio6MTMyOiBXYXJuaW5nOi4qCi0uKjoxMzM6IFdhcm5pbmc6LioKLS4qOjEzNDogV2FybmluZzouKgotLio6MTM1OiBXYXJuaW5nOi4qCi0uKjoxOTI6IFdhcm5pbmc6LioKLS4qOjE5MzogV2FybmluZzouKgotLio6MTk0OiBXYXJuaW5nOi4qCi0uKjoxOTU6IFdhcm5pbmc6LioKLS4qOjE5NjogV2FybmluZzouKgotLio6MTk3OiBXYXJuaW5nOi4qCi0uKjoxOTg6IFdhcm5pbmc6LioKLS4qOjE5OTogV2FybmluZzouKgotLio6MjU2OiBXYXJuaW5nOi4qCi0uKjoyNTc6IFdhcm5pbmc6LioKLS4qOjI1ODogV2FybmluZzouKgotLio6MjU5OiBXYXJuaW5nOi4qCi0uKjoyNjA6IFdhcm5pbmc6LioKLS4qOjI2MTogV2FybmluZzouKgotLio6MjYyOiBXYXJuaW5nOi4qCi0uKjoyNjM6IFdhcm5pbmc6LioKLS4qOjM4NDogV2FybmluZzouKgotLio6Mzg1OiBXYXJuaW5nOi4qCi0uKjozODY6IFdhcm5pbmc6LioKLS4qOjM4NzogV2FybmluZzouKgotLio6Mzg4OiBXYXJuaW5nOi4qCi0uKjozODk6IFdhcm5pbmc6LioKLS4qOjM5MDogV2FybmluZzouKgotLio6MzkxOiBXYXJuaW5nOi4qCi0uKjo0NDg6IFdhcm5pbmc6LioKLS4qOjQ0OTogV2FybmluZzouKgotLio6NDUwOiBXYXJuaW5nOi4qCi0uKjo0NTE6IFdhcm5pbmc6LioKLS4qOjQ1MjogV2FybmluZzouKgotLio6NDUzOiBXYXJuaW5nOi4qCi0uKjo0NTQ6IFdhcm5pbmc6LioKLS4qOjQ1NTogV2FybmluZzouKgotLio6NTEyOiBXYXJuaW5nOi4qCi0uKjo1MTM6IFdhcm5pbmc6LioKLS4qOjUxNDogV2FybmluZzouKgotLio6NTE1OiBXYXJuaW5nOi4qCi0uKjo1MTY6IFdhcm5pbmc6LioKLS4qOjUxNzogV2FybmluZzouKgotLio6NTE4OiBXYXJuaW5nOi4qCi0uKjo1MTk6IFdhcm5pbmc6LioKLS4qOjY0MDogV2FybmluZzouKgotLio6NjQxOiBXYXJuaW5nOi4qCi0uKjo2NDI6IFdhcm5pbmc6LioKLS4qOjY0MzogV2FybmluZzouKgotLio6NjQ0OiBXYXJuaW5nOi4qCi0uKjo2NDU6IFdhcm5pbmc6LioKLS4qOjY0NjogV2FybmluZzouKgotLio6NjQ3OiBXYXJuaW5nOi4qCi0uKjo3MDQ6IFdhcm5pbmc6LioKLS4qOjcwNTogV2FybmluZzouKgotLio6NzA2OiBXYXJuaW5nOi4qCi0uKjo3MDc6IFdhcm5pbmc6LioKLS4qOjcwODogV2FybmluZzouKgotLio6NzA5OiBXYXJuaW5nOi4qCi0uKjo3MTA6IFdhcm5pbmc6LioKLS4qOjcxMTogV2FybmluZzouKgotLio6NzY4OiBXYXJuaW5nOi4qCi0uKjo3Njk6IFdhcm5pbmc6LioKLS4qOjc3MDogV2FybmluZzouKgotLio6NzcxOiBXYXJuaW5nOi4qCi0uKjo3NzI6IFdhcm5pbmc6LioKLS4qOjc3MzogV2FybmluZzouKgotLio6Nzc0OiBXYXJuaW5nOi4qCi0uKjo3NzU6IFdhcm5pbmc6LioKLS4qOjgxMjogV2FybmluZzouKgotLio6ODIwOiBXYXJuaW5nOi4qCi0uKjo4Mjg6IFdhcm5pbmc6LioKLS4qOjgzMzogV2FybmluZzouKgotLio6ODM0OiBXYXJuaW5nOi4qCi0uKjo4MzU6IFdhcm5pbmc6LioKLS4qOjk2MTogV2FybmluZzouKgotLio6OTYyOiBXYXJuaW5nOi4qCi0uKjo5NjM6IFdhcm5pbmc6LioKLS4qOjk2NDogV2FybmluZzouKgotLio6OTY1OiBXYXJuaW5nOi4qCi0uKjo5NjY6IFdhcm5pbmc6LioKLS4qOjk2NzogV2FybmluZzouKgotLio6OTY4OiBXYXJuaW5nOi4qCi0uKjoxMDI1OiBXYXJuaW5nOi4qCi0uKjoxMDI2OiBXYXJuaW5nOi4qCi0uKjoxMDI3OiBXYXJuaW5nOi4qCi0uKjoxMDI4OiBXYXJuaW5nOi4qCi0uKjoxMDI5OiBXYXJuaW5nOi4qCi0uKjoxMDMwOiBXYXJuaW5nOi4qCi0uKjoxMDMxOiBXYXJuaW5nOi4qCi0uKjoxMDMyOiBXYXJuaW5nOi4qCi0uKjoxMDg5OiBXYXJuaW5nOi4qCi0uKjoxMDkwOiBXYXJuaW5nOi4qCi0uKjoxMDkxOiBXYXJuaW5nOi4qCi0uKjoxMDkyOiBXYXJuaW5nOi4qCi0uKjoxMDkzOiBXYXJuaW5nOi4qCi0uKjoxMDk0OiBXYXJuaW5nOi4qCi0uKjoxMDk1OiBXYXJuaW5nOi4qCi0uKjoxMDk2OiBXYXJuaW5nOi4qCi0uKjoxMjE3OiBXYXJuaW5nOi4qCi0uKjoxMjE4OiBXYXJuaW5nOi4qCi0uKjoxMjE5OiBXYXJuaW5nOi4qCi0uKjoxMjIwOiBXYXJuaW5nOi4qCi0uKjoxMjIxOiBXYXJuaW5nOi4qCi0uKjoxMjIyOiBXYXJuaW5nOi4qCi0uKjoxMjIzOiBXYXJuaW5nOi4qCi0uKjoxMjI0OiBXYXJuaW5nOi4qCi0uKjoxMjgxOiBXYXJuaW5nOi4qCi0uKjoxMjgyOiBXYXJuaW5nOi4qCi0uKjoxMjgzOiBXYXJuaW5nOi4qCi0uKjoxMjg0OiBXYXJuaW5nOi4qCi0uKjoxMjg1OiBXYXJuaW5nOi4qCi0uKjoxMjg2OiBXYXJuaW5nOi4qCi0uKjoxMjg3OiBXYXJuaW5nOi4qCi0uKjoxMjg4OiBXYXJuaW5nOi4qCi0uKjoxMzQ1OiBXYXJuaW5nOi4qCi0uKjoxMzQ2OiBXYXJuaW5nOi4qCi0uKjoxMzQ3OiBXYXJuaW5nOi4qCi0uKjoxMzQ4OiBXYXJuaW5nOi4qCi0uKjoxMzQ5OiBXYXJuaW5nOi4qCi0uKjoxMzUwOiBXYXJuaW5nOi4qCi0uKjoxMzUxOiBXYXJuaW5nOi4qCi0uKjoxMzUyOiBXYXJuaW5nOi4qCi0uKjoxNDczOiBXYXJuaW5nOi4qCi0uKjoxNDc0OiBXYXJuaW5nOi4qCi0uKjoxNDc1OiBXYXJuaW5nOi4qCi0uKjoxNDc2OiBXYXJuaW5nOi4qCi0uKjoxNDc3OiBXYXJuaW5nOi4qCi0uKjoxNDc4OiBXYXJuaW5nOi4qCi0uKjoxNDc5OiBXYXJuaW5nOi4qCi0uKjoxNDgwOiBXYXJuaW5nOi4qCi0uKjoxNTM3OiBXYXJuaW5nOi4qCi0uKjoxNTM4OiBXYXJuaW5nOi4qCi0uKjoxNTM5OiBXYXJuaW5nOi4qCi0uKjoxNTQwOiBXYXJuaW5nOi4qCi0uKjoxNTQxOiBXYXJuaW5nOi4qCi0uKjoxNTQyOiBXYXJuaW5nOi4qCi0uKjoxNTQzOiBXYXJuaW5nOi4qCi0uKjoxNTQ0OiBXYXJuaW5nOi4qCi0uKjoxNjAxOiBXYXJuaW5nOi4qCi0uKjoxNjAyOiBXYXJuaW5nOi4qCi0uKjoxNjAzOiBXYXJuaW5nOi4qCi0uKjoxNjA0OiBXYXJuaW5nOi4qCi0uKjoxNjA1OiBXYXJuaW5nOi4qCi0uKjoxNjA2OiBXYXJuaW5nOi4qCi0uKjoxNjA3OiBXYXJuaW5nOi4qCi0uKjoxNjA4OiBXYXJuaW5nOi4qCi0uKjoxNjQ1OiBXYXJuaW5nOi4qCi0uKjoxNjUzOiBXYXJuaW5nOi4qCi0uKjoxNjYxOiBXYXJuaW5nOi4qCi0uKjoxNjY2OiBXYXJuaW5nOi4qCi0uKjoxNjY3OiBXYXJuaW5nOi4qCi0uKjoxNjY4OiBXYXJuaW5nOi4qCi0gICAxICAgICAgICAgICAgICAgICAgICAgICAJLnBzaXplIDAKLSAgIDIgICAgICAgICAgICAgICAgICAgICAgIAkudGV4dAotICAgMyAwMDAwIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4XCkKLSAgIDQgMDAwMyAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeFwpCi0gICA1IDAwMDYgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHhcKQotICAgNiAwMDA5IDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4XCkKLSAgIDcgMDAwYyAzNjhDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjAKLSAgIDggMDAxMyAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaVwpCi0gICA5IDAwMTYgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGlcKQotICAxMCAwMDE5IDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheFwpCi0gIDExIDAwMWQgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4XCkKLSAgMTIgMDAyMSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHhcKQotICAxMyAwMDI1IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieFwpCi0gIDE0IDAwMjkgOEM1RDEyICAgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwXCkKLSAgMTUgMDAyYyAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2lcKQotICAxNiAwMDMwIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaVwpCi0gIDE3IDAwMzQgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4XCkKLSAgMTggMDAzYiAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3hcKQotICAxOSAwMDQyIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeFwpCi0gIDIwIDAwNDkgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4XCkKLSAgMjEgMDA1MCA4QzlENzg1NiAzNDEyICAgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnBcKQotICAyMiAwMDU2IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaVwpCi0gIDIzIDAwNWQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpXCkKLSAgMjQgMDA2NCA4Q0Q4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVheAotICAyNSAwMDY2IDhDRDkgICAgICAgICAgICAgIAkJbW92CSVkcywlZWN4Ci0gIDI2IDAwNjggOENEQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlZHgKLSAgMjcgMDA2YSA4Q0RCICAgICAgICAgICAgICAJCW1vdgklZHMsJWVieAotICAyOCAwMDZjIDhDREMgICAgICAgICAgICAgIAkJbW92CSVkcywlZXNwCi0gIDI5IDAwNmUgOENERCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYnAKLSAgMzAgMDA3MCA4Q0RFICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzaQotICAzMSAwMDcyIDhDREYgICAgICAgICAgICAgIAkJbW92CSVkcywlZWRpCi0gIDMyIDAwNzQgMzY4QzFDMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCwxXCkKLSAgMzMgMDA3OCAzNjhDMUMwMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDFcKQotICAzNCAwMDdjIDM2OEMxQzAyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsMVwpCi0gIDM1IDAwODAgMzY4QzFDMDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCwxXCkKLSAgMzYgMDA4NCA4QzFDMDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDFcKQotICAzNyAwMDg3IDM2OEMxQzA1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCwxXCkKLSAgMzggMDA4ZiAzNjhDMUMwNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDFcKQotICAzOSAwMDkzIDM2OEMxQzA3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsMVwpCi0gIDQwIDAwOTcgMzY4QzFDMDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCwxXCkKLSAgNDEgMDA5YiAzNjhDMUMwOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDFcKQotICA0MiAwMDlmIDM2OEMxQzBBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsMVwpCi0gIDQzIDAwYTMgMzY4QzFDMEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCwxXCkKLSAgNDQgMDBhNyA4QzFDMEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDFcKQotICA0NSAwMGFhIDM2OEMxQzBEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCwxXCkKLSAgNDYgMDBiMiAzNjhDMUMwRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDFcKQotICA0NyAwMGI2IDM2OEMxQzBGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsMVwpCi0gIDQ4IDAwYmEgMzY4QzFDMTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCwxXCkKLSAgNDkgMDBiZSAzNjhDMUMxMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDFcKQotICA1MCAwMGMyIDM2OEMxQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsMVwpCi0gIDUxIDAwYzYgMzY4QzFDMTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCwxXCkKLSAgNTIgMDBjYSA4QzFDMTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDFcKQotICA1MyAwMGNkIDM2OEMxQzE1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCwxXCkKLSAgNTQgMDBkNSAzNjhDMUMxNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDFcKQotICA1NSAwMGQ5IDM2OEMxQzE3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsMVwpCi0gIDU2IDAwZGQgMzY4QzFDMTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCwxXCkKLSAgNTcgMDBlMSAzNjhDMUMxOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDFcKQotICA1OCAwMGU1IDM2OEMxQzFBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsMVwpCi0gIDU5IDAwZTkgMzY4QzFDMUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCwxXCkKLSAgNjAgMDBlZCA4QzFDMUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDFcKQotICA2MSAwMGYwIDM2OEMxQzFEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCwxXCkKLSAgNjIgMDBmOCAzNjhDMUMxRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDFcKQotICA2MyAwMGZjIDM2OEMxQzFGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsMVwpCi0gIDY0IDAxMDAgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsMVwpCi0gIDY1IDAxMDMgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsMVwpCi0gIDY2IDAxMDYgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsMVwpCi0gIDY3IDAxMDkgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsMVwpCi0gIDY4IDAxMGMgOEMxQzI0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsMVwpCi0gIDY5IDAxMGYgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCwxXCkKLSAgNzAgMDExNiAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwxXCkKLSAgNzEgMDExOSAzNjhDMUYgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwxXCkKLSAgNzIgMDExYyAzNjhDMUMyOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDFcKQotICA3MyAwMTIwIDM2OEMxQzI5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsMVwpCi0gIDc0IDAxMjQgMzY4QzFDMkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCwxXCkKLSAgNzUgMDEyOCAzNjhDMUMyQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDFcKQotICA3NiAwMTJjIDhDMUMyQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsMVwpCi0gIDc3IDAxMmYgMzY4QzFDMkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDFcKQotICA3OCAwMTM3IDM2OEMxQzJFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsMVwpCi0gIDc5IDAxM2IgMzY4QzFDMkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCwxXCkKLSAgODAgMDEzZiAzNjhDMUMzMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDFcKQotICA4MSAwMTQzIDM2OEMxQzMxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksMVwpCi0gIDgyIDAxNDcgMzY4QzFDMzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSwxXCkKLSAgODMgMDE0YiAzNjhDMUMzMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDFcKQotICA4NCAwMTRmIDhDMUMzNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksMVwpCi0gIDg1IDAxNTIgMzY4QzFDMzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDFcKQotICA4NiAwMTVhIDM2OEMxQzM2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksMVwpCi0gIDg3IDAxNWUgMzY4QzFDMzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSwxXCkKLSAgODggMDE2MiAzNjhDMUMzOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDFcKQotICA4OSAwMTY2IDM2OEMxQzM5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksMVwpCi0gIDkwIDAxNmEgMzY4QzFDM0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSwxXCkKLSAgOTEgMDE2ZSAzNjhDMUMzQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDFcKQotICA5MiAwMTcyIDhDMUMzQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksMVwpCi0gIDkzIDAxNzUgMzY4QzFDM0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDFcKQotICA5NCAwMTdkIDM2OEMxQzNFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksMVwpCi0gIDk1IDAxODEgMzY4QzFDM0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSwxXCkKLSAgOTYgMDE4NSAzNjhDMUM0MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDJcKQotICA5NyAwMTg5IDM2OEMxQzQxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsMlwpCi0gIDk4IDAxOGQgMzY4QzFDNDIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCwyXCkKLSAgOTkgMDE5MSAzNjhDMUM0MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDJcKQotIDEwMCAwMTk1IDhDMUM0NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsMlwpCi0gMTAxIDAxOTggMzY4QzFDNDUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDJcKQotIDEwMiAwMWEwIDM2OEMxQzQ2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsMlwpCi0gMTAzIDAxYTQgMzY4QzFDNDcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCwyXCkKLSAxMDQgMDFhOCAzNjhDMUM0OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDJcKQotIDEwNSAwMWFjIDM2OEMxQzQ5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsMlwpCi0gMTA2IDAxYjAgMzY4QzFDNEEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCwyXCkKLSAxMDcgMDFiNCAzNjhDMUM0QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDJcKQotIDEwOCAwMWI4IDhDMUM0QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsMlwpCi0gMTA5IDAxYmIgMzY4QzFDNEQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDJcKQotIDExMCAwMWMzIDM2OEMxQzRFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsMlwpCi0gMTExIDAxYzcgMzY4QzFDNEYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCwyXCkKLSAxMTIgMDFjYiAzNjhDMUM1MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDJcKQotIDExMyAwMWNmIDM2OEMxQzUxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsMlwpCi0gMTE0IDAxZDMgMzY4QzFDNTIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCwyXCkKLSAxMTUgMDFkNyAzNjhDMUM1MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDJcKQotIDExNiAwMWRiIDhDMUM1NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsMlwpCi0gMTE3IDAxZGUgMzY4QzFDNTUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDJcKQotIDExOCAwMWU2IDM2OEMxQzU2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsMlwpCi0gMTE5IDAxZWEgMzY4QzFDNTcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCwyXCkKLSAxMjAgMDFlZSAzNjhDMUM1OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDJcKQotIDEyMSAwMWYyIDM2OEMxQzU5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsMlwpCi0gMTIyIDAxZjYgMzY4QzFDNUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCwyXCkKLSAxMjMgMDFmYSAzNjhDMUM1QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDJcKQotIDEyNCAwMWZlIDhDMUM1QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsMlwpCi0gMTI1IDAyMDEgMzY4QzFDNUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDJcKQotIDEyNiAwMjA5IDM2OEMxQzVFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsMlwpCi0gMTI3IDAyMGQgMzY4QzFDNUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCwyXCkKLSAxMjggMDIxMSAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDEyOSAwMjE0IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gMTMwIDAyMTcgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSAxMzEgMDIxYSAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDEzMiAwMjFkIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gMTMzIDAyMjAgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCwyXCkKLS4qV2FybmluZzouKgotIDEzNCAwMjI3IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gMTM1IDAyMmEgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxMzYgMDIyZCAzNjhDMUM2OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDJcKQotIDEzNyAwMjMxIDM2OEMxQzY5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsMlwpCi0gMTM4IDAyMzUgMzY4QzFDNkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCwyXCkKLSAxMzkgMDIzOSAzNjhDMUM2QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDJcKQotIDE0MCAwMjNkIDhDMUM2QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsMlwpCi0gMTQxIDAyNDAgMzY4QzFDNkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDJcKQotIDE0MiAwMjQ4IDM2OEMxQzZFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsMlwpCi0gMTQzIDAyNGMgMzY4QzFDNkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCwyXCkKLSAxNDQgMDI1MCAzNjhDMUM3MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDJcKQotIDE0NSAwMjU0IDM2OEMxQzcxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksMlwpCi0gMTQ2IDAyNTggMzY4QzFDNzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSwyXCkKLSAxNDcgMDI1YyAzNjhDMUM3MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDJcKQotIDE0OCAwMjYwIDhDMUM3NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksMlwpCi0gMTQ5IDAyNjMgMzY4QzFDNzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDJcKQotIDE1MCAwMjZiIDM2OEMxQzc2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksMlwpCi0gMTUxIDAyNmYgMzY4QzFDNzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSwyXCkKLSAxNTIgMDI3MyAzNjhDMUM3OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDJcKQotIDE1MyAwMjc3IDM2OEMxQzc5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksMlwpCi0gMTU0IDAyN2IgMzY4QzFDN0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSwyXCkKLSAxNTUgMDI3ZiAzNjhDMUM3QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDJcKQotIDE1NiAwMjgzIDhDMUM3QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksMlwpCi0gMTU3IDAyODYgMzY4QzFDN0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDJcKQotIDE1OCAwMjhlIDM2OEMxQzdFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksMlwpCi0gMTU5IDAyOTIgMzY4QzFDN0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSwyXCkKLSAxNjAgMDI5NiAzNjhDMUM4MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDRcKQotIDE2MSAwMjlhIDM2OEMxQzgxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsNFwpCi0gMTYyIDAyOWUgMzY4QzFDODIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCw0XCkKLSAxNjMgMDJhMiAzNjhDMUM4MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDRcKQotIDE2NCAwMmE2IDhDMUM4NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsNFwpCi0gMTY1IDAyYTkgMzY4QzFDODUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDRcKQotIDE2NiAwMmIxIDM2OEMxQzg2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsNFwpCi0gMTY3IDAyYjUgMzY4QzFDODcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCw0XCkKLSAxNjggMDJiOSAzNjhDMUM4OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDRcKQotIDE2OSAwMmJkIDM2OEMxQzg5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsNFwpCi0gMTcwIDAyYzEgMzY4QzFDOEEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCw0XCkKLSAxNzEgMDJjNSAzNjhDMUM4QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDRcKQotIDE3MiAwMmM5IDhDMUM4QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsNFwpCi0gMTczIDAyY2MgMzY4QzFDOEQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDRcKQotIDE3NCAwMmQ0IDM2OEMxQzhFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsNFwpCi0gMTc1IDAyZDggMzY4QzFDOEYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCw0XCkKLSAxNzYgMDJkYyAzNjhDMUM5MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDRcKQotIDE3NyAwMmUwIDM2OEMxQzkxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsNFwpCi0gMTc4IDAyZTQgMzY4QzFDOTIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCw0XCkKLSAxNzkgMDJlOCAzNjhDMUM5MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDRcKQotIDE4MCAwMmVjIDhDMUM5NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsNFwpCi0gMTgxIDAyZWYgMzY4QzFDOTUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDRcKQotIDE4MiAwMmY3IDM2OEMxQzk2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsNFwpCi0gMTgzIDAyZmIgMzY4QzFDOTcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCw0XCkKLSAxODQgMDJmZiAzNjhDMUM5OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDRcKQotIDE4NSAwMzAzIDM2OEMxQzk5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsNFwpCi0gMTg2IDAzMDcgMzY4QzFDOUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCw0XCkKLSAxODcgMDMwYiAzNjhDMUM5QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDRcKQotIDE4OCAwMzBmIDhDMUM5QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsNFwpCi0gMTg5IDAzMTIgMzY4QzFDOUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDRcKQotIDE5MCAwMzFhIDM2OEMxQzlFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsNFwpCi0gMTkxIDAzMWUgMzY4QzFDOUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCw0XCkKLSAxOTIgMDMyMiAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDE5MyAwMzI1IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTk0IDAzMjggMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxOTUgMDMyYiAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDE5NiAwMzJlIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTk3IDAzMzEgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCw0XCkKLS4qV2FybmluZzouKgotIDE5OCAwMzM4IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTk5IDAzM2IgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSAyMDAgMDMzZSAzNjhDMUNBOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDRcKQotIDIwMSAwMzQyIDM2OEMxQ0E5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsNFwpCi0gMjAyIDAzNDYgMzY4QzFDQUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCw0XCkKLSAyMDMgMDM0YSAzNjhDMUNBQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDRcKQotIDIwNCAwMzRlIDhDMUNBQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsNFwpCi0gMjA1IDAzNTEgMzY4QzFDQUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDRcKQotIDIwNiAwMzU5IDM2OEMxQ0FFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsNFwpCi0gMjA3IDAzNWQgMzY4QzFDQUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCw0XCkKLSAyMDggMDM2MSAzNjhDMUNCMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDRcKQotIDIwOSAwMzY1IDM2OEMxQ0IxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksNFwpCi0gMjEwIDAzNjkgMzY4QzFDQjIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSw0XCkKLSAyMTEgMDM2ZCAzNjhDMUNCMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDRcKQotIDIxMiAwMzcxIDhDMUNCNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksNFwpCi0gMjEzIDAzNzQgMzY4QzFDQjUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDRcKQotIDIxNCAwMzdjIDM2OEMxQ0I2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksNFwpCi0gMjE1IDAzODAgMzY4QzFDQjcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSw0XCkKLSAyMTYgMDM4NCAzNjhDMUNCOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDRcKQotIDIxNyAwMzg4IDM2OEMxQ0I5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksNFwpCi0gMjE4IDAzOGMgMzY4QzFDQkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSw0XCkKLSAyMTkgMDM5MCAzNjhDMUNCQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDRcKQotIDIyMCAwMzk0IDhDMUNCQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksNFwpCi0gMjIxIDAzOTcgMzY4QzFDQkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDRcKQotIDIyMiAwMzlmIDM2OEMxQ0JFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksNFwpCi0gMjIzIDAzYTMgMzY4QzFDQkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSw0XCkKLSAyMjQgMDNhNyAzNjhDMUNDMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDhcKQotIDIyNSAwM2FiIDM2OEMxQ0MxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsOFwpCi0gMjI2IDAzYWYgMzY4QzFDQzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCw4XCkKLSAyMjcgMDNiMyAzNjhDMUNDMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDhcKQotIDIyOCAwM2I3IDhDMUNDNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsOFwpCi0gMjI5IDAzYmEgMzY4QzFDQzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDhcKQotIDIzMCAwM2MyIDM2OEMxQ0M2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsOFwpCi0gMjMxIDAzYzYgMzY4QzFDQzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCw4XCkKLSAyMzIgMDNjYSAzNjhDMUNDOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDhcKQotIDIzMyAwM2NlIDM2OEMxQ0M5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsOFwpCi0gMjM0IDAzZDIgMzY4QzFDQ0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCw4XCkKLSAyMzUgMDNkNiAzNjhDMUNDQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDhcKQotIDIzNiAwM2RhIDhDMUNDQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsOFwpCi0gMjM3IDAzZGQgMzY4QzFDQ0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDhcKQotIDIzOCAwM2U1IDM2OEMxQ0NFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsOFwpCi0gMjM5IDAzZTkgMzY4QzFDQ0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCw4XCkKLSAyNDAgMDNlZCAzNjhDMUNEMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDhcKQotIDI0MSAwM2YxIDM2OEMxQ0QxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsOFwpCi0gMjQyIDAzZjUgMzY4QzFDRDIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCw4XCkKLSAyNDMgMDNmOSAzNjhDMUNEMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDhcKQotIDI0NCAwM2ZkIDhDMUNENCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsOFwpCi0gMjQ1IDA0MDAgMzY4QzFDRDUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDhcKQotIDI0NiAwNDA4IDM2OEMxQ0Q2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsOFwpCi0gMjQ3IDA0MGMgMzY4QzFDRDcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCw4XCkKLSAyNDggMDQxMCAzNjhDMUNEOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDhcKQotIDI0OSAwNDE0IDM2OEMxQ0Q5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsOFwpCi0gMjUwIDA0MTggMzY4QzFDREEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCw4XCkKLSAyNTEgMDQxYyAzNjhDMUNEQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDhcKQotIDI1MiAwNDIwIDhDMUNEQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsOFwpCi0gMjUzIDA0MjMgMzY4QzFDREQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDhcKQotIDI1NCAwNDJiIDM2OEMxQ0RFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsOFwpCi0gMjU1IDA0MmYgMzY4QzFDREYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCw4XCkKLSAyNTYgMDQzMyAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDI1NyAwNDM2IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gMjU4IDA0MzkgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAyNTkgMDQzYyAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDI2MCAwNDNmIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gMjYxIDA0NDIgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCw4XCkKLS4qV2FybmluZzouKgotIDI2MiAwNDQ5IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMjYzIDA0NGMgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAyNjQgMDQ0ZiAzNjhDMUNFOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDhcKQotIDI2NSAwNDUzIDM2OEMxQ0U5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsOFwpCi0gMjY2IDA0NTcgMzY4QzFDRUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCw4XCkKLSAyNjcgMDQ1YiAzNjhDMUNFQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDhcKQotIDI2OCAwNDVmIDhDMUNFQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsOFwpCi0gMjY5IDA0NjIgMzY4QzFDRUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDhcKQotIDI3MCAwNDZhIDM2OEMxQ0VFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsOFwpCi0gMjcxIDA0NmUgMzY4QzFDRUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCw4XCkKLSAyNzIgMDQ3MiAzNjhDMUNGMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDhcKQotIDI3MyAwNDc2IDM2OEMxQ0YxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksOFwpCi0gMjc0IDA0N2EgMzY4QzFDRjIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSw4XCkKLSAyNzUgMDQ3ZSAzNjhDMUNGMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDhcKQotIDI3NiAwNDgyIDhDMUNGNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksOFwpCi0gMjc3IDA0ODUgMzY4QzFDRjUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDhcKQotIDI3OCAwNDhkIDM2OEMxQ0Y2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksOFwpCi0gMjc5IDA0OTEgMzY4QzFDRjcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSw4XCkKLSAyODAgMDQ5NSAzNjhDMUNGOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDhcKQotIDI4MSAwNDk5IDM2OEMxQ0ZBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksOFwpCi0gMjgyIDA0OWQgMzY4QzFDRjkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkaSw4XCkKLSAyODMgMDRhMSAzNjhDMUNGQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDhcKQotIDI4NCAwNGE1IDhDMUNGQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksOFwpCi0gMjg1IDA0YTggMzY4QzFDRkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDhcKQotIDI4NiAwNGIwIDM2OEMxQ0ZFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksOFwpCi0gMjg3IDA0YjQgMzY4QzFDRkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSw4XCkKLSAyODggMDRiOCAzNjhDNUMwMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCwxXCkKLSAyODkgMDRiZCAzNjhDNUMwMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCwxXCkKLSAyOTAgMDRjMiAzNjhDNUMwMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCwxXCkKLSAyOTEgMDRjNyAzNjhDNUMwMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCwxXCkKLSAyOTIgMDRjYyA4QzVDMDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCwxXCkKLSAyOTMgMDRkMCA4QzVDMDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCwxXCkKLSAyOTQgMDRkNCAzNjhDNUMwNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCwxXCkKLSAyOTUgMDRkOSAzNjhDNUMwNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCwxXCkKLSAyOTYgMDRkZSAzNjhDNUMwOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCwxXCkKLSAyOTcgMDRlMyAzNjhDNUMwOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCwxXCkKLSAyOTggMDRlOCAzNjhDNUMwQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCwxXCkKLSAyOTkgMDRlZCAzNjhDNUMwQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCwxXCkKLSAzMDAgMDRmMiA4QzVDMEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCwxXCkKLSAzMDEgMDRmNiA4QzVDMEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCwxXCkKLSAzMDIgMDRmYSAzNjhDNUMwRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCwxXCkKLSAzMDMgMDRmZiAzNjhDNUMwRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCwxXCkKLSAzMDQgMDUwNCAzNjhDNUMxMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCwxXCkKLSAzMDUgMDUwOSAzNjhDNUMxMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCwxXCkKLSAzMDYgMDUwZSAzNjhDNUMxMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCwxXCkKLSAzMDcgMDUxMyAzNjhDNUMxMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCwxXCkKLSAzMDggMDUxOCA4QzVDMTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCwxXCkKLSAzMDkgMDUxYyA4QzVDMTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCwxXCkKLSAzMTAgMDUyMCAzNjhDNUMxNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCwxXCkKLSAzMTEgMDUyNSAzNjhDNUMxNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCwxXCkKLSAzMTIgMDUyYSAzNjhDNUMxOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCwxXCkKLSAzMTMgMDUyZiAzNjhDNUMxOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCwxXCkKLSAzMTQgMDUzNCAzNjhDNUMxQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCwxXCkKLSAzMTUgMDUzOSAzNjhDNUMxQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCwxXCkKLSAzMTYgMDUzZSA4QzVDMUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCwxXCkKLSAzMTcgMDU0MiA4QzVDMUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCwxXCkKLSAzMTggMDU0NiAzNjhDNUMxRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCwxXCkKLSAzMTkgMDU0YiAzNjhDNUMxRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCwxXCkKLSAzMjAgMDU1MCAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsMVwpCi0gMzIxIDA1NTQgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LDFcKQotIDMyMiAwNTU4IDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwxXCkKLSAzMjMgMDU1YyAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsMVwpCi0gMzI0IDA1NjAgOEM1QzI0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLDFcKQotIDMyNSAwNTY0IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwxXCkKLSAzMjYgMDU2NyAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksMVwpCi0gMzI3IDA1NmIgMzY4QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLDFcKQotIDMyOCAwNTZmIDM2OEM1QzI4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDFcKQotIDMyOSAwNTc0IDM2OEM1QzI5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDFcKQotIDMzMCAwNTc5IDM2OEM1QzJBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDFcKQotIDMzMSAwNTdlIDM2OEM1QzJCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDFcKQotIDMzMiAwNTgzIDhDNUMyQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDFcKQotIDMzMyAwNTg3IDhDNUMyRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDFcKQotIDMzNCAwNThiIDM2OEM1QzJFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDFcKQotIDMzNSAwNTkwIDM2OEM1QzJGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDFcKQotIDMzNiAwNTk1IDM2OEM1QzMwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDFcKQotIDMzNyAwNTlhIDM2OEM1QzMxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDFcKQotIDMzOCAwNTlmIDM2OEM1QzMyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDFcKQotIDMzOSAwNWE0IDM2OEM1QzMzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDFcKQotIDM0MCAwNWE5IDhDNUMzNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDFcKQotIDM0MSAwNWFkIDhDNUMzNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDFcKQotIDM0MiAwNWIxIDM2OEM1QzM2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDFcKQotIDM0MyAwNWI2IDM2OEM1QzM3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDFcKQotIDM0NCAwNWJiIDM2OEM1QzM4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDFcKQotIDM0NSAwNWMwIDM2OEM1QzM5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDFcKQotIDM0NiAwNWM1IDM2OEM1QzNBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDFcKQotIDM0NyAwNWNhIDM2OEM1QzNCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDFcKQotIDM0OCAwNWNmIDhDNUMzQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDFcKQotIDM0OSAwNWQzIDhDNUMzRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDFcKQotIDM1MCAwNWQ3IDM2OEM1QzNFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDFcKQotIDM1MSAwNWRjIDM2OEM1QzNGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDFcKQotIDM1MiAwNWUxIDM2OEM1QzQwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDJcKQotIDM1MyAwNWU2IDM2OEM1QzQxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDJcKQotIDM1NCAwNWViIDM2OEM1QzQyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDJcKQotIDM1NSAwNWYwIDM2OEM1QzQzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDJcKQotIDM1NiAwNWY1IDhDNUM0NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDJcKQotIDM1NyAwNWY5IDhDNUM0NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDJcKQotIDM1OCAwNWZkIDM2OEM1QzQ2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDJcKQotIDM1OSAwNjAyIDM2OEM1QzQ3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDJcKQotIDM2MCAwNjA3IDM2OEM1QzQ4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDJcKQotIDM2MSAwNjBjIDM2OEM1QzQ5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDJcKQotIDM2MiAwNjExIDM2OEM1QzRBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDJcKQotIDM2MyAwNjE2IDM2OEM1QzRCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDJcKQotIDM2NCAwNjFiIDhDNUM0QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDJcKQotIDM2NSAwNjFmIDhDNUM0RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDJcKQotIDM2NiAwNjIzIDM2OEM1QzRFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDJcKQotIDM2NyAwNjI4IDM2OEM1QzRGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDJcKQotIDM2OCAwNjJkIDM2OEM1QzUwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDJcKQotIDM2OSAwNjMyIDM2OEM1QzUxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDJcKQotIDM3MCAwNjM3IDM2OEM1QzUyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDJcKQotIDM3MSAwNjNjIDM2OEM1QzUzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDJcKQotIDM3MiAwNjQxIDhDNUM1NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDJcKQotIDM3MyAwNjQ1IDhDNUM1NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDJcKQotIDM3NCAwNjQ5IDM2OEM1QzU2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDJcKQotIDM3NSAwNjRlIDM2OEM1QzU3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDJcKQotIDM3NiAwNjUzIDM2OEM1QzU4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDJcKQotIDM3NyAwNjU4IDM2OEM1QzU5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDJcKQotIDM3OCAwNjVkIDM2OEM1QzVBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDJcKQotIDM3OSAwNjYyIDM2OEM1QzVCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDJcKQotIDM4MCAwNjY3IDhDNUM1QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDJcKQotIDM4MSAwNjZiIDhDNUM1RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDJcKQotIDM4MiAwNjZmIDM2OEM1QzVFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDJcKQotIDM4MyAwNjc0IDM2OEM1QzVGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDJcKQotIDM4NCAwNjc5IDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDM4NSAwNjdkIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDM4NiAwNjgxIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDM4NyAwNjg1IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDM4OCAwNjg5IDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDM4OSAwNjhkIDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDM5MCAwNjkwIDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDM5MSAwNjk0IDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDM5MiAwNjk4IDM2OEM1QzY4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDJcKQotIDM5MyAwNjlkIDM2OEM1QzY5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDJcKQotIDM5NCAwNmEyIDM2OEM1QzZBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDJcKQotIDM5NSAwNmE3IDM2OEM1QzZCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDJcKQotIDM5NiAwNmFjIDhDNUM2QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDJcKQotIDM5NyAwNmIwIDhDNUM2RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDJcKQotIDM5OCAwNmI0IDM2OEM1QzZFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDJcKQotIDM5OSAwNmI5IDM2OEM1QzZGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDJcKQotIDQwMCAwNmJlIDM2OEM1QzcwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDJcKQotIDQwMSAwNmMzIDM2OEM1QzcxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDJcKQotIDQwMiAwNmM4IDM2OEM1QzcyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDJcKQotIDQwMyAwNmNkIDM2OEM1QzczIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDJcKQotIDQwNCAwNmQyIDhDNUM3NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDJcKQotIDQwNSAwNmQ2IDhDNUM3NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDJcKQotIDQwNiAwNmRhIDM2OEM1Qzc2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDJcKQotIDQwNyAwNmRmIDM2OEM1Qzc3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDJcKQotIDQwOCAwNmU0IDM2OEM1Qzc4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDJcKQotIDQwOSAwNmU5IDM2OEM1Qzc5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDJcKQotIDQxMCAwNmVlIDM2OEM1QzdBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDJcKQotIDQxMSAwNmYzIDM2OEM1QzdCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDJcKQotIDQxMiAwNmY4IDhDNUM3QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDJcKQotIDQxMyAwNmZjIDhDNUM3RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDJcKQotIDQxNCAwNzAwIDM2OEM1QzdFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDJcKQotIDQxNSAwNzA1IDM2OEM1QzdGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDJcKQotIDQxNiAwNzBhIDM2OEM1QzgwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDRcKQotIDQxNyAwNzBmIDM2OEM1QzgxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDRcKQotIDQxOCAwNzE0IDM2OEM1QzgyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDRcKQotIDQxOSAwNzE5IDM2OEM1QzgzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDRcKQotIDQyMCAwNzFlIDhDNUM4NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDRcKQotIDQyMSAwNzIyIDhDNUM4NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDRcKQotIDQyMiAwNzI2IDM2OEM1Qzg2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDRcKQotIDQyMyAwNzJiIDM2OEM1Qzg3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDRcKQotIDQyNCAwNzMwIDM2OEM1Qzg4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDRcKQotIDQyNSAwNzM1IDM2OEM1Qzg5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDRcKQotIDQyNiAwNzNhIDM2OEM1QzhBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDRcKQotIDQyNyAwNzNmIDM2OEM1QzhCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDRcKQotIDQyOCAwNzQ0IDhDNUM4QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDRcKQotIDQyOSAwNzQ4IDhDNUM4RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDRcKQotIDQzMCAwNzRjIDM2OEM1QzhFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDRcKQotIDQzMSAwNzUxIDM2OEM1QzhGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDRcKQotIDQzMiAwNzU2IDM2OEM1QzkwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDRcKQotIDQzMyAwNzViIDM2OEM1QzkxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDRcKQotIDQzNCAwNzYwIDM2OEM1QzkyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDRcKQotIDQzNSAwNzY1IDM2OEM1QzkzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDRcKQotIDQzNiAwNzZhIDhDNUM5NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDRcKQotIDQzNyAwNzZlIDhDNUM5NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDRcKQotIDQzOCAwNzcyIDM2OEM1Qzk2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDRcKQotIDQzOSAwNzc3IDM2OEM1Qzk3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDRcKQotIDQ0MCAwNzdjIDM2OEM1Qzk4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDRcKQotIDQ0MSAwNzgxIDM2OEM1Qzk5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDRcKQotIDQ0MiAwNzg2IDM2OEM1QzlBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDRcKQotIDQ0MyAwNzhiIDM2OEM1QzlCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDRcKQotIDQ0NCAwNzkwIDhDNUM5QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDRcKQotIDQ0NSAwNzk0IDhDNUM5RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDRcKQotIDQ0NiAwNzk4IDM2OEM1QzlFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDRcKQotIDQ0NyAwNzlkIDM2OEM1QzlGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDRcKQotIDQ0OCAwN2EyIDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDQ0OSAwN2E2IDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDQ1MCAwN2FhIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDQ1MSAwN2FlIDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDQ1MiAwN2IyIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDQ1MyAwN2I2IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDQ1NCAwN2I5IDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDQ1NSAwN2JkIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDQ1NiAwN2MxIDM2OEM1Q0E4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDRcKQotIDQ1NyAwN2M2IDM2OEM1Q0E5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDRcKQotIDQ1OCAwN2NiIDM2OEM1Q0FBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDRcKQotIDQ1OSAwN2QwIDM2OEM1Q0FCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDRcKQotIDQ2MCAwN2Q1IDhDNUNBQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDRcKQotIDQ2MSAwN2Q5IDhDNUNBRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDRcKQotIDQ2MiAwN2RkIDM2OEM1Q0FFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDRcKQotIDQ2MyAwN2UyIDM2OEM1Q0FGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDRcKQotIDQ2NCAwN2U3IDM2OEM1Q0IwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDRcKQotIDQ2NSAwN2VjIDM2OEM1Q0IxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDRcKQotIDQ2NiAwN2YxIDM2OEM1Q0IyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDRcKQotIDQ2NyAwN2Y2IDM2OEM1Q0IzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDRcKQotIDQ2OCAwN2ZiIDhDNUNCNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDRcKQotIDQ2OSAwN2ZmIDhDNUNCNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDRcKQotIDQ3MCAwODAzIDM2OEM1Q0I2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDRcKQotIDQ3MSAwODA4IDM2OEM1Q0I3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDRcKQotIDQ3MiAwODBkIDM2OEM1Q0I4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDRcKQotIDQ3MyAwODEyIDM2OEM1Q0I5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDRcKQotIDQ3NCAwODE3IDM2OEM1Q0JBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDRcKQotIDQ3NSAwODFjIDM2OEM1Q0JCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDRcKQotIDQ3NiAwODIxIDhDNUNCQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDRcKQotIDQ3NyAwODI1IDhDNUNCRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDRcKQotIDQ3OCAwODI5IDM2OEM1Q0JFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDRcKQotIDQ3OSAwODJlIDM2OEM1Q0JGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDRcKQotIDQ4MCAwODMzIDM2OEM1Q0MwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDhcKQotIDQ4MSAwODM4IDM2OEM1Q0MxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDhcKQotIDQ4MiAwODNkIDM2OEM1Q0MyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDhcKQotIDQ4MyAwODQyIDM2OEM1Q0MzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDhcKQotIDQ4NCAwODQ3IDhDNUNDNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDhcKQotIDQ4NSAwODRiIDhDNUNDNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDhcKQotIDQ4NiAwODRmIDM2OEM1Q0M2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDhcKQotIDQ4NyAwODU0IDM2OEM1Q0M3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDhcKQotIDQ4OCAwODU5IDM2OEM1Q0M4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDhcKQotIDQ4OSAwODVlIDM2OEM1Q0M5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDhcKQotIDQ5MCAwODYzIDM2OEM1Q0NBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDhcKQotIDQ5MSAwODY4IDM2OEM1Q0NCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDhcKQotIDQ5MiAwODZkIDhDNUNDQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDhcKQotIDQ5MyAwODcxIDhDNUNDRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDhcKQotIDQ5NCAwODc1IDM2OEM1Q0NFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDhcKQotIDQ5NSAwODdhIDM2OEM1Q0NGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDhcKQotIDQ5NiAwODdmIDM2OEM1Q0QwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDhcKQotIDQ5NyAwODg0IDM2OEM1Q0QxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDhcKQotIDQ5OCAwODg5IDM2OEM1Q0QyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDhcKQotIDQ5OSAwODhlIDM2OEM1Q0QzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDhcKQotIDUwMCAwODkzIDhDNUNENDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDhcKQotIDUwMSAwODk3IDhDNUNENTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDhcKQotIDUwMiAwODliIDM2OEM1Q0Q2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDhcKQotIDUwMyAwOGEwIDM2OEM1Q0Q3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDhcKQotIDUwNCAwOGE1IDM2OEM1Q0Q4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDhcKQotIDUwNSAwOGFhIDM2OEM1Q0Q5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDhcKQotIDUwNiAwOGFmIDM2OEM1Q0RBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDhcKQotIDUwNyAwOGI0IDM2OEM1Q0RCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDhcKQotIDUwOCAwOGI5IDhDNUNEQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDhcKQotIDUwOSAwOGJkIDhDNUNERDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDhcKQotIDUxMCAwOGMxIDM2OEM1Q0RFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDhcKQotIDUxMSAwOGM2IDM2OEM1Q0RGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDhcKQotIDUxMiAwOGNiIDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDUxMyAwOGNmIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDUxNCAwOGQzIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDUxNSAwOGQ3IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDUxNiAwOGRiIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDUxNyAwOGRmIDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDUxOCAwOGUyIDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDUxOSAwOGU2IDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDUyMCAwOGVhIDM2OEM1Q0U4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDhcKQotIDUyMSAwOGVmIDM2OEM1Q0U5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDhcKQotIDUyMiAwOGY0IDM2OEM1Q0VBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDhcKQotIDUyMyAwOGY5IDM2OEM1Q0VCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDhcKQotIDUyNCAwOGZlIDhDNUNFQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDhcKQotIDUyNSAwOTAyIDhDNUNFRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDhcKQotIDUyNiAwOTA2IDM2OEM1Q0VFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDhcKQotIDUyNyAwOTBiIDM2OEM1Q0VGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDhcKQotIDUyOCAwOTEwIDM2OEM1Q0YwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDhcKQotIDUyOSAwOTE1IDM2OEM1Q0YxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDhcKQotIDUzMCAwOTFhIDM2OEM1Q0YyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDhcKQotIDUzMSAwOTFmIDM2OEM1Q0YzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDhcKQotIDUzMiAwOTI0IDhDNUNGNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDhcKQotIDUzMyAwOTI4IDhDNUNGNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDhcKQotIDUzNCAwOTJjIDM2OEM1Q0Y2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDhcKQotIDUzNSAwOTMxIDM2OEM1Q0Y3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDhcKQotIDUzNiAwOTM2IDM2OEM1Q0Y4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDhcKQotIDUzNyAwOTNiIDM2OEM1Q0ZBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDhcKQotIDUzOCAwOTQwIDM2OEM1Q0Y5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDhcKQotIDUzOSAwOTQ1IDM2OEM1Q0ZCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDhcKQotIDU0MCAwOTRhIDhDNUNGQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDhcKQotIDU0MSAwOTRlIDhDNUNGRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDhcKQotIDU0MiAwOTUyIDM2OEM1Q0ZFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDhcKQotIDU0MyAwOTU3IDM2OEM1Q0ZGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDhcKQotIDU0NCAwOTVjIDM2OEM5QzAwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDFcKQotIDU0NSAwOTY0IDM2OEM5QzAxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDFcKQotIDU0NiAwOTZjIDM2OEM5QzAyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDFcKQotIDU0NyAwOTc0IDM2OEM5QzAzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDFcKQotIDU0OCAwOTdjIDhDOUMwNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDFcKQotIDU0OSAwOTgzIDhDOUMwNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDFcKQotIDU1MCAwOThhIDM2OEM5QzA2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDFcKQotIDU1MSAwOTkyIDM2OEM5QzA3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDFcKQotIDU1MiAwOTlhIDM2OEM5QzA4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDFcKQotIDU1MyAwOWEyIDM2OEM5QzA5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDFcKQotIDU1NCAwOWFhIDM2OEM5QzBBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDFcKQotIDU1NSAwOWIyIDM2OEM5QzBCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDFcKQotIDU1NiAwOWJhIDhDOUMwQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDFcKQotIDU1NyAwOWMxIDhDOUMwRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDFcKQotIDU1OCAwOWM4IDM2OEM5QzBFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDFcKQotIDU1OSAwOWQwIDM2OEM5QzBGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDFcKQotIDU2MCAwOWQ4IDM2OEM5QzEwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDFcKQotIDU2MSAwOWUwIDM2OEM5QzExIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDFcKQotIDU2MiAwOWU4IDM2OEM5QzEyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDFcKQotIDU2MyAwOWYwIDM2OEM5QzEzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDFcKQotIDU2NCAwOWY4IDhDOUMxNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDFcKQotIDU2NSAwOWZmIDhDOUMxNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDFcKQotIDU2NiAwYTA2IDM2OEM5QzE2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDFcKQotIDU2NyAwYTBlIDM2OEM5QzE3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDFcKQotIDU2OCAwYTE2IDM2OEM5QzE4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDFcKQotIDU2OSAwYTFlIDM2OEM5QzE5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDFcKQotIDU3MCAwYTI2IDM2OEM5QzFBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDFcKQotIDU3MSAwYTJlIDM2OEM5QzFCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDFcKQotIDU3MiAwYTM2IDhDOUMxQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDFcKQotIDU3MyAwYTNkIDhDOUMxRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDFcKQotIDU3NCAwYTQ0IDM2OEM5QzFFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDFcKQotIDU3NSAwYTRjIDM2OEM5QzFGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDFcKQotIDU3NiAwYTU0IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwxXCkKLSA1NzcgMGE1YiAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsMVwpCi0gNTc4IDBhNjIgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDFcKQotIDU3OSAwYTY5IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwxXCkKLSA1ODAgMGE3MCA4QzlDMjQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsMVwpCi0gNTgxIDBhNzcgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDFcKQotIDU4MiAwYTdkIDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwxXCkKLSA1ODMgMGE4NCAzNjhDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksMVwpCi0gNTg0IDBhOGIgMzY4QzlDMjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMVwpCi0gNTg1IDBhOTMgMzY4QzlDMjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMVwpCi0gNTg2IDBhOWIgMzY4QzlDMkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMVwpCi0gNTg3IDBhYTMgMzY4QzlDMkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMVwpCi0gNTg4IDBhYWIgOEM5QzJDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMVwpCi0gNTg5IDBhYjIgOEM5QzJENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMVwpCi0gNTkwIDBhYjkgMzY4QzlDMkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMVwpCi0gNTkxIDBhYzEgMzY4QzlDMkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMVwpCi0gNTkyIDBhYzkgMzY4QzlDMzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMVwpCi0gNTkzIDBhZDEgMzY4QzlDMzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMVwpCi0gNTk0IDBhZDkgMzY4QzlDMzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMVwpCi0gNTk1IDBhZTEgMzY4QzlDMzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMVwpCi0gNTk2IDBhZTkgOEM5QzM0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMVwpCi0gNTk3IDBhZjAgOEM5QzM1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMVwpCi0gNTk4IDBhZjcgMzY4QzlDMzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMVwpCi0gNTk5IDBhZmYgMzY4QzlDMzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMVwpCi0gNjAwIDBiMDcgMzY4QzlDMzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMVwpCi0gNjAxIDBiMGYgMzY4QzlDMzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMVwpCi0gNjAyIDBiMTcgMzY4QzlDM0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMVwpCi0gNjAzIDBiMWYgMzY4QzlDM0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMVwpCi0gNjA0IDBiMjcgOEM5QzNDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMVwpCi0gNjA1IDBiMmUgOEM5QzNENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMVwpCi0gNjA2IDBiMzUgMzY4QzlDM0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMVwpCi0gNjA3IDBiM2QgMzY4QzlDM0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMVwpCi0gNjA4IDBiNDUgMzY4QzlDNDAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMlwpCi0gNjA5IDBiNGQgMzY4QzlDNDEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMlwpCi0gNjEwIDBiNTUgMzY4QzlDNDIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsMlwpCi0gNjExIDBiNWQgMzY4QzlDNDMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMlwpCi0gNjEyIDBiNjUgOEM5QzQ0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMlwpCi0gNjEzIDBiNmMgOEM5QzQ1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsMlwpCi0gNjE0IDBiNzMgMzY4QzlDNDYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMlwpCi0gNjE1IDBiN2IgMzY4QzlDNDcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMlwpCi0gNjE2IDBiODMgMzY4QzlDNDggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsMlwpCi0gNjE3IDBiOGIgMzY4QzlDNDkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMlwpCi0gNjE4IDBiOTMgMzY4QzlDNEEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMlwpCi0gNjE5IDBiOWIgMzY4QzlDNEIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsMlwpCi0gNjIwIDBiYTMgOEM5QzRDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMlwpCi0gNjIxIDBiYWEgOEM5QzRENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMlwpCi0gNjIyIDBiYjEgMzY4QzlDNEUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsMlwpCi0gNjIzIDBiYjkgMzY4QzlDNEYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMlwpCi0gNjI0IDBiYzEgMzY4QzlDNTAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMlwpCi0gNjI1IDBiYzkgMzY4QzlDNTEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsMlwpCi0gNjI2IDBiZDEgMzY4QzlDNTIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMlwpCi0gNjI3IDBiZDkgMzY4QzlDNTMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMlwpCi0gNjI4IDBiZTEgOEM5QzU0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsMlwpCi0gNjI5IDBiZTggOEM5QzU1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMlwpCi0gNjMwIDBiZWYgMzY4QzlDNTYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMlwpCi0gNjMxIDBiZjcgMzY4QzlDNTcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsMlwpCi0gNjMyIDBiZmYgMzY4QzlDNTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMlwpCi0gNjMzIDBjMDcgMzY4QzlDNTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMlwpCi0gNjM0IDBjMGYgMzY4QzlDNUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsMlwpCi0gNjM1IDBjMTcgMzY4QzlDNUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMlwpCi0gNjM2IDBjMWYgOEM5QzVDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMlwpCi0gNjM3IDBjMjYgOEM5QzVENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsMlwpCi0gNjM4IDBjMmQgMzY4QzlDNUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMlwpCi0gNjM5IDBjMzUgMzY4QzlDNUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMlwpCi0gNjQwIDBjM2QgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQxIDBjNDQgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQyIDBjNGIgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQzIDBjNTIgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQ0IDBjNTkgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ1IDBjNjAgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ2IDBjNjYgMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ3IDBjNmQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ4IDBjNzQgMzY4QzlDNjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMlwpCi0gNjQ5IDBjN2MgMzY4QzlDNjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMlwpCi0gNjUwIDBjODQgMzY4QzlDNkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMlwpCi0gNjUxIDBjOGMgMzY4QzlDNkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMlwpCi0gNjUyIDBjOTQgOEM5QzZDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMlwpCi0gNjUzIDBjOWIgOEM5QzZENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMlwpCi0gNjU0IDBjYTIgMzY4QzlDNkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMlwpCi0gNjU1IDBjYWEgMzY4QzlDNkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMlwpCi0gNjU2IDBjYjIgMzY4QzlDNzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMlwpCi0gNjU3IDBjYmEgMzY4QzlDNzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMlwpCi0gNjU4IDBjYzIgMzY4QzlDNzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMlwpCi0gNjU5IDBjY2EgMzY4QzlDNzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMlwpCi0gNjYwIDBjZDIgOEM5Qzc0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMlwpCi0gNjYxIDBjZDkgOEM5Qzc1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMlwpCi0gNjYyIDBjZTAgMzY4QzlDNzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMlwpCi0gNjYzIDBjZTggMzY4QzlDNzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMlwpCi0gNjY0IDBjZjAgMzY4QzlDNzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMlwpCi0gNjY1IDBjZjggMzY4QzlDNzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMlwpCi0gNjY2IDBkMDAgMzY4QzlDN0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMlwpCi0gNjY3IDBkMDggMzY4QzlDN0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMlwpCi0gNjY4IDBkMTAgOEM5QzdDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMlwpCi0gNjY5IDBkMTcgOEM5QzdENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMlwpCi0gNjcwIDBkMWUgMzY4QzlDN0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMlwpCi0gNjcxIDBkMjYgMzY4QzlDN0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMlwpCi0gNjcyIDBkMmUgMzY4QzlDODAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsNFwpCi0gNjczIDBkMzYgMzY4QzlDODEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsNFwpCi0gNjc0IDBkM2UgMzY4QzlDODIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsNFwpCi0gNjc1IDBkNDYgMzY4QzlDODMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsNFwpCi0gNjc2IDBkNGUgOEM5Qzg0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsNFwpCi0gNjc3IDBkNTUgOEM5Qzg1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsNFwpCi0gNjc4IDBkNWMgMzY4QzlDODYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsNFwpCi0gNjc5IDBkNjQgMzY4QzlDODcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsNFwpCi0gNjgwIDBkNmMgMzY4QzlDODggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsNFwpCi0gNjgxIDBkNzQgMzY4QzlDODkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsNFwpCi0gNjgyIDBkN2MgMzY4QzlDOEEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsNFwpCi0gNjgzIDBkODQgMzY4QzlDOEIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsNFwpCi0gNjg0IDBkOGMgOEM5QzhDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsNFwpCi0gNjg1IDBkOTMgOEM5QzhENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsNFwpCi0gNjg2IDBkOWEgMzY4QzlDOEUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsNFwpCi0gNjg3IDBkYTIgMzY4QzlDOEYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsNFwpCi0gNjg4IDBkYWEgMzY4QzlDOTAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsNFwpCi0gNjg5IDBkYjIgMzY4QzlDOTEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsNFwpCi0gNjkwIDBkYmEgMzY4QzlDOTIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsNFwpCi0gNjkxIDBkYzIgMzY4QzlDOTMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsNFwpCi0gNjkyIDBkY2EgOEM5Qzk0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsNFwpCi0gNjkzIDBkZDEgOEM5Qzk1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsNFwpCi0gNjk0IDBkZDggMzY4QzlDOTYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsNFwpCi0gNjk1IDBkZTAgMzY4QzlDOTcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsNFwpCi0gNjk2IDBkZTggMzY4QzlDOTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsNFwpCi0gNjk3IDBkZjAgMzY4QzlDOTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsNFwpCi0gNjk4IDBkZjggMzY4QzlDOUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsNFwpCi0gNjk5IDBlMDAgMzY4QzlDOUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsNFwpCi0gNzAwIDBlMDggOEM5QzlDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsNFwpCi0gNzAxIDBlMGYgOEM5QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsNFwpCi0gNzAyIDBlMTYgMzY4QzlDOUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsNFwpCi0gNzAzIDBlMWUgMzY4QzlDOUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsNFwpCi0gNzA0IDBlMjYgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA1IDBlMmQgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA2IDBlMzQgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA3IDBlM2IgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA4IDBlNDIgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gNzA5IDBlNDkgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gNzEwIDBlNGYgMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gNzExIDBlNTYgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gNzEyIDBlNWQgMzY4QzlDQTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsNFwpCi0gNzEzIDBlNjUgMzY4QzlDQTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsNFwpCi0gNzE0IDBlNmQgMzY4QzlDQUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsNFwpCi0gNzE1IDBlNzUgMzY4QzlDQUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsNFwpCi0gNzE2IDBlN2QgOEM5Q0FDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsNFwpCi0gNzE3IDBlODQgOEM5Q0FENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsNFwpCi0gNzE4IDBlOGIgMzY4QzlDQUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsNFwpCi0gNzE5IDBlOTMgMzY4QzlDQUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsNFwpCi0gNzIwIDBlOWIgMzY4QzlDQjAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksNFwpCi0gNzIxIDBlYTMgMzY4QzlDQjEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksNFwpCi0gNzIyIDBlYWIgMzY4QzlDQjIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksNFwpCi0gNzIzIDBlYjMgMzY4QzlDQjMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksNFwpCi0gNzI0IDBlYmIgOEM5Q0I0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksNFwpCi0gNzI1IDBlYzIgOEM5Q0I1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksNFwpCi0gNzI2IDBlYzkgMzY4QzlDQjYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksNFwpCi0gNzI3IDBlZDEgMzY4QzlDQjcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksNFwpCi0gNzI4IDBlZDkgMzY4QzlDQjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksNFwpCi0gNzI5IDBlZTEgMzY4QzlDQjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksNFwpCi0gNzMwIDBlZTkgMzY4QzlDQkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksNFwpCi0gNzMxIDBlZjEgMzY4QzlDQkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksNFwpCi0gNzMyIDBlZjkgOEM5Q0JDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksNFwpCi0gNzMzIDBmMDAgOEM5Q0JENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksNFwpCi0gNzM0IDBmMDcgMzY4QzlDQkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksNFwpCi0gNzM1IDBmMGYgMzY4QzlDQkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksNFwpCi0gNzM2IDBmMTcgMzY4QzlDQzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsOFwpCi0gNzM3IDBmMWYgMzY4QzlDQzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsOFwpCi0gNzM4IDBmMjcgMzY4QzlDQzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsOFwpCi0gNzM5IDBmMmYgMzY4QzlDQzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsOFwpCi0gNzQwIDBmMzcgOEM5Q0M0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsOFwpCi0gNzQxIDBmM2UgOEM5Q0M1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsOFwpCi0gNzQyIDBmNDUgMzY4QzlDQzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsOFwpCi0gNzQzIDBmNGQgMzY4QzlDQzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsOFwpCi0gNzQ0IDBmNTUgMzY4QzlDQzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsOFwpCi0gNzQ1IDBmNWQgMzY4QzlDQzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsOFwpCi0gNzQ2IDBmNjUgMzY4QzlDQ0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsOFwpCi0gNzQ3IDBmNmQgMzY4QzlDQ0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsOFwpCi0gNzQ4IDBmNzUgOEM5Q0NDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsOFwpCi0gNzQ5IDBmN2MgOEM5Q0NENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsOFwpCi0gNzUwIDBmODMgMzY4QzlDQ0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsOFwpCi0gNzUxIDBmOGIgMzY4QzlDQ0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsOFwpCi0gNzUyIDBmOTMgMzY4QzlDRDAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsOFwpCi0gNzUzIDBmOWIgMzY4QzlDRDEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsOFwpCi0gNzU0IDBmYTMgMzY4QzlDRDIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsOFwpCi0gNzU1IDBmYWIgMzY4QzlDRDMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsOFwpCi0gNzU2IDBmYjMgOEM5Q0Q0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsOFwpCi0gNzU3IDBmYmEgOEM5Q0Q1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsOFwpCi0gNzU4IDBmYzEgMzY4QzlDRDYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsOFwpCi0gNzU5IDBmYzkgMzY4QzlDRDcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsOFwpCi0gNzYwIDBmZDEgMzY4QzlDRDggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsOFwpCi0gNzYxIDBmZDkgMzY4QzlDRDkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsOFwpCi0gNzYyIDBmZTEgMzY4QzlDREEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsOFwpCi0gNzYzIDBmZTkgMzY4QzlDREIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsOFwpCi0gNzY0IDBmZjEgOEM5Q0RDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsOFwpCi0gNzY1IDBmZjggOEM5Q0RENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsOFwpCi0gNzY2IDBmZmYgMzY4QzlDREUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsOFwpCi0gNzY3IDEwMDcgMzY4QzlDREYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsOFwpCi0gNzY4IDEwMGYgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gNzY5IDEwMTYgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcwIDEwMWQgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcxIDEwMjQgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcyIDEwMmIgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gNzczIDEwMzIgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gNzc0IDEwMzggMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gNzc1IDEwM2YgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gNzc2IDEwNDYgMzY4QzlDRTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsOFwpCi0gNzc3IDEwNGUgMzY4QzlDRTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsOFwpCi0gNzc4IDEwNTYgMzY4QzlDRUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsOFwpCi0gNzc5IDEwNWUgMzY4QzlDRUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsOFwpCi0gNzgwIDEwNjYgOEM5Q0VDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsOFwpCi0gNzgxIDEwNmQgOEM5Q0VENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsOFwpCi0gNzgyIDEwNzQgMzY4QzlDRUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsOFwpCi0gNzgzIDEwN2MgMzY4QzlDRUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsOFwpCi0gNzg0IDEwODQgMzY4QzlDRjAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksOFwpCi0gNzg1IDEwOGMgMzY4QzlDRjEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksOFwpCi0gNzg2IDEwOTQgMzY4QzlDRjIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksOFwpCi0gNzg3IDEwOWMgMzY4QzlDRjMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksOFwpCi0gNzg4IDEwYTQgOEM5Q0Y0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksOFwpCi0gNzg5IDEwYWIgOEM5Q0Y1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksOFwpCi0gNzkwIDEwYjIgMzY4QzlDRjYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksOFwpCi0gNzkxIDEwYmEgMzY4QzlDRjcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksOFwpCi0gNzkyIDEwYzIgMzY4QzlDRjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksOFwpCi0gNzkzIDEwY2EgMzY4QzlDRkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksOFwpCi0gNzk0IDEwZDIgMzY4QzlDRjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksOFwpCi0gNzk1IDEwZGEgMzY4QzlDRkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksOFwpCi0gNzk2IDEwZTIgOEM5Q0ZDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksOFwpCi0gNzk3IDEwZTkgOEM5Q0ZENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksOFwpCi0gNzk4IDEwZjAgMzY4QzlDRkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksOFwpCi0gNzk5IDEwZjggMzY4QzlDRkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksOFwpCi0gODAwIDExMDAgOEM1QzA1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCwxXCkKLSA4MDEgMTEwNCA4QzVDMEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDFcKQotIDgwMiAxMTA4IDhDNUMxNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsMVwpCi0gODAzIDExMGMgOEM1QzFEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCwxXCkKLSA4MDQgMTExMCA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwxXCkKLSA4MDUgMTExMyA4QzVDMkQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDFcKQotIDgwNiAxMTE3IDhDNUMzNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksMVwpCi0gODA3IDExMWIgOEM1QzNEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSwxXCkKLSA4MDggMTExZiA4QzVDNDUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWF4LDJcKQotIDgwOSAxMTIzIDhDNUM0RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlY3gsMlwpCi0gODEwIDExMjcgOEM1QzU1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkeCwyXCkKLSA4MTEgMTEyYiA4QzVDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJ4LDJcKQotIDgxMiAxMTJmIDhDNUQwMCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gODEzIDExMzIgOEM1QzZEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCwyXCkKLSA4MTQgMTEzNiA4QzVDNzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDJcKQotIDgxNSAxMTNhIDhDNUM3RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksMlwpCi0gODE2IDExM2UgOEM1Qzg1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCw0XCkKLSA4MTcgMTE0MiA4QzVDOEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDRcKQotIDgxOCAxMTQ2IDhDNUM5NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsNFwpCi0gODE5IDExNGEgOEM1QzlEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCw0XCkKLSA4MjAgMTE0ZSA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDgyMSAxMTUxIDhDNUNBRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYnAsNFwpCi0gODIyIDExNTUgOEM1Q0I1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVzaSw0XCkKLSA4MjMgMTE1OSA4QzVDQkQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWRpLDRcKQotIDgyNCAxMTVkIDhDNUNDNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsOFwpCi0gODI1IDExNjEgOEM1Q0NEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCw4XCkKLSA4MjYgMTE2NSA4QzVDRDUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDhcKQotIDgyNyAxMTY5IDhDNUNERDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsOFwpCi0gODI4IDExNmQgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSA4MjkgMTE3MCA4QzVDRUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDhcKQotIDgzMCAxMTc0IDhDNUNGNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksOFwpCi0gODMxIDExNzggOEM1Q0ZEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSw4XCkKLSA4MzIgMTE3YyAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCwxXCkKLSA4MzMgMTE4MyAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCwyXCkKLS4qV2FybmluZzouKgotIDgzNCAxMThhIDM2OEMxRDEyIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MHgxMlwoLDRcKQotLipXYXJuaW5nOi4qCi0gODM1IDExOTEgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsOFwpCi0uKldhcm5pbmc6LioKLSA4MzYgMTE5OCA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheFwpCi0gODM3IDExOWEgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3hcKQotIDgzOCAxMTljIDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4XCkKLSA4MzkgMTE5ZSA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieFwpCi0gODQwIDExYTAgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczowCi0gODQxIDExYTYgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2lcKQotIDg0MiAxMWE4IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpXCkKLSA4NDMgMTFhYSA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXhcKQotIDg0NCAxMWFkIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeFwpCi0gODQ1IDExYjAgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4XCkKLSA4NDYgMTFiMyA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnhcKQotIDg0NyAxMWI2IDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicFwpCi0gODQ4IDExYmEgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpXCkKLSA4NDkgMTFiZCA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGlcKQotIDg1MCAxMWMwIDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheFwpCi0gODUxIDExYzYgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4XCkKLSA4NTIgMTFjYyA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHhcKQotIDg1MyAxMWQyIDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieFwpCi0gODU0IDExZDggM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwXCkKLSA4NTUgMTFkZiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2lcKQotIDg1NiAxMWU1IDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaVwpCi0gODU3IDExZWIgOENEOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYXgKLSA4NTggMTFlZCA4Q0Q5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVjeAotIDg1OSAxMWVmIDhDREEgICAgICAgICAgICAgIAkJbW92CSVkcywlZWR4Ci0gODYwIDExZjEgOENEQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYngKLSA4NjEgMTFmMyA4Q0RDICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzcAotIDg2MiAxMWY1IDhDREQgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJwCi0gODYzIDExZjcgOENERSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc2kKLSA4NjQgMTFmOSA4Q0RGICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkaQotIDg2NSAxMWZiIDhDMUMwMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsMVwpCi0gODY2IDExZmUgOEMxQzAxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCwxXCkKLSA4NjcgMTIwMSA4QzFDMDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDFcKQotIDg2OCAxMjA0IDhDMUMwMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsMVwpCi0gODY5IDEyMDcgM0U4QzFDMDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCwxXCkKLSA4NzAgMTIwYiA4QzFDMDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsMVwpCi0gODcxIDEyMTIgOEMxQzA2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCwxXCkKLSA4NzIgMTIxNSA4QzFDMDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDFcKQotIDg3MyAxMjE4IDhDMUMwOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsMVwpCi0gODc0IDEyMWIgOEMxQzA5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCwxXCkKLSA4NzUgMTIxZSA4QzFDMEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDFcKQotIDg3NiAxMjIxIDhDMUMwQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsMVwpCi0gODc3IDEyMjQgM0U4QzFDMEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCwxXCkKLSA4NzggMTIyOCA4QzFDMEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsMVwpCi0gODc5IDEyMmYgOEMxQzBFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCwxXCkKLSA4ODAgMTIzMiA4QzFDMEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDFcKQotIDg4MSAxMjM1IDhDMUMxMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsMVwpCi0gODgyIDEyMzggOEMxQzExICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCwxXCkKLSA4ODMgMTIzYiA4QzFDMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDFcKQotIDg4NCAxMjNlIDhDMUMxMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsMVwpCi0gODg1IDEyNDEgM0U4QzFDMTQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCwxXCkKLSA4ODYgMTI0NSA4QzFDMTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsMVwpCi0gODg3IDEyNGMgOEMxQzE2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCwxXCkKLSA4ODggMTI0ZiA4QzFDMTcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDFcKQotIDg4OSAxMjUyIDhDMUMxOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsMVwpCi0gODkwIDEyNTUgOEMxQzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCwxXCkKLSA4OTEgMTI1OCA4QzFDMUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDFcKQotIDg5MiAxMjViIDhDMUMxQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsMVwpCi0gODkzIDEyNWUgM0U4QzFDMUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCwxXCkKLSA4OTQgMTI2MiA4QzFDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsMVwpCi0gODk1IDEyNjkgOEMxQzFFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCwxXCkKLSA4OTYgMTI2YyA4QzFDMUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDFcKQotIDg5NyAxMjZmIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDFcKQotIDg5OCAxMjcxIDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LDFcKQotIDg5OSAxMjczIDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDFcKQotIDkwMCAxMjc1IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDFcKQotIDkwMSAxMjc3IDNFOEMxQzI0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLDFcKQotIDkwMiAxMjdiIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsMVwpCi0gOTAzIDEyODEgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksMVwpCi0gOTA0IDEyODMgOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksMVwpCi0gOTA1IDEyODUgOEMxQzI4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCwxXCkKLSA5MDYgMTI4OCA4QzFDMjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDFcKQotIDkwNyAxMjhiIDhDMUMyQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsMVwpCi0gOTA4IDEyOGUgOEMxQzJCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCwxXCkKLSA5MDkgMTI5MSAzRThDMUMyQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDFcKQotIDkxMCAxMjk1IDhDMUMyRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCwxXCkKLSA5MTEgMTI5YyA4QzFDMkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDFcKQotIDkxMiAxMjlmIDhDMUMyRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsMVwpCi0gOTEzIDEyYTIgOEMxQzMwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSwxXCkKLSA5MTQgMTJhNSA4QzFDMzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDFcKQotIDkxNSAxMmE4IDhDMUMzMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksMVwpCi0gOTE2IDEyYWIgOEMxQzMzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSwxXCkKLSA5MTcgMTJhZSAzRThDMUMzNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDFcKQotIDkxOCAxMmIyIDhDMUMzNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSwxXCkKLSA5MTkgMTJiOSA4QzFDMzYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDFcKQotIDkyMCAxMmJjIDhDMUMzNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksMVwpCi0gOTIxIDEyYmYgOEMxQzM4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSwxXCkKLSA5MjIgMTJjMiA4QzFDMzkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDFcKQotIDkyMyAxMmM1IDhDMUMzQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksMVwpCi0gOTI0IDEyYzggOEMxQzNCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSwxXCkKLSA5MjUgMTJjYiAzRThDMUMzQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDFcKQotIDkyNiAxMmNmIDhDMUMzRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSwxXCkKLSA5MjcgMTJkNiA4QzFDM0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDFcKQotIDkyOCAxMmQ5IDhDMUMzRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksMVwpCi0gOTI5IDEyZGMgOEMxQzQwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVheCwyXCkKLSA5MzAgMTJkZiA4QzFDNDEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDJcKQotIDkzMSAxMmUyIDhDMUM0MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsMlwpCi0gOTMyIDEyZTUgOEMxQzQzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVheCwyXCkKLSA5MzMgMTJlOCAzRThDMUM0NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDJcKQotIDkzNCAxMmVjIDhDMUM0NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCwyXCkKLSA5MzUgMTJmMyA4QzFDNDYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWF4LDJcKQotIDkzNiAxMmY2IDhDMUM0NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYXgsMlwpCi0gOTM3IDEyZjkgOEMxQzQ4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCwyXCkKLSA5MzggMTJmYyA4QzFDNDkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWN4LDJcKQotIDkzOSAxMmZmIDhDMUM0QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlY3gsMlwpCi0gOTQwIDEzMDIgOEMxQzRCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCwyXCkKLSA5NDEgMTMwNSAzRThDMUM0QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWN4LDJcKQotIDk0MiAxMzA5IDhDMUM0RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVjeCwyXCkKLSA5NDMgMTMxMCA4QzFDNEUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDJcKQotIDk0NCAxMzEzIDhDMUM0RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlY3gsMlwpCi0gOTQ1IDEzMTYgOEMxQzUwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkeCwyXCkKLSA5NDYgMTMxOSA4QzFDNTEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDJcKQotIDk0NyAxMzFjIDhDMUM1MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZHgsMlwpCi0gOTQ4IDEzMWYgOEMxQzUzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkeCwyXCkKLSA5NDkgMTMyMiAzRThDMUM1NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDJcKQotIDk1MCAxMzI2IDhDMUM1NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkeCwyXCkKLSA5NTEgMTMyZCA4QzFDNTYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWR4LDJcKQotIDk1MiAxMzMwIDhDMUM1NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsMlwpCi0gOTUzIDEzMzMgOEMxQzU4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVieCwyXCkKLSA5NTQgMTMzNiA4QzFDNTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJ4LDJcKQotIDk1NSAxMzM5IDhDMUM1QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsMlwpCi0gOTU2IDEzM2MgOEMxQzVCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVieCwyXCkKLSA5NTcgMTMzZiAzRThDMUM1QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJ4LDJcKQotIDk1OCAxMzQzIDhDMUM1RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCwyXCkKLSA5NTkgMTM0YSA4QzFDNUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJ4LDJcKQotIDk2MCAxMzRkIDhDMUM1RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYngsMlwpCi0gOTYxIDEzNTAgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSA5NjIgMTM1MiA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDk2MyAxMzU0IDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gOTY0IDEzNTYgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSA5NjUgMTM1OCAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDk2NiAxMzVjIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsMlwpCi0uKldhcm5pbmc6LioKLSA5NjcgMTM2MiA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDk2OCAxMzY0IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gOTY5IDEzNjYgOEMxQzY4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCwyXCkKLSA5NzAgMTM2OSA4QzFDNjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDJcKQotIDk3MSAxMzZjIDhDMUM2QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsMlwpCi0gOTcyIDEzNmYgOEMxQzZCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCwyXCkKLSA5NzMgMTM3MiAzRThDMUM2QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDJcKQotIDk3NCAxMzc2IDhDMUM2RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCwyXCkKLSA5NzUgMTM3ZCA4QzFDNkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDJcKQotIDk3NiAxMzgwIDhDMUM2RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsMlwpCi0gOTc3IDEzODMgOEMxQzcwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSwyXCkKLSA5NzggMTM4NiA4QzFDNzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDJcKQotIDk3OSAxMzg5IDhDMUM3MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksMlwpCi0gOTgwIDEzOGMgOEMxQzczICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSwyXCkKLSA5ODEgMTM4ZiAzRThDMUM3NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDJcKQotIDk4MiAxMzkzIDhDMUM3NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSwyXCkKLSA5ODMgMTM5YSA4QzFDNzYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDJcKQotIDk4NCAxMzlkIDhDMUM3NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksMlwpCi0gOTg1IDEzYTAgOEMxQzc4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSwyXCkKLSA5ODYgMTNhMyA4QzFDNzkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDJcKQotIDk4NyAxM2E2IDhDMUM3QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksMlwpCi0gOTg4IDEzYTkgOEMxQzdCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSwyXCkKLSA5ODkgMTNhYyAzRThDMUM3QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDJcKQotIDk5MCAxM2IwIDhDMUM3RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSwyXCkKLSA5OTEgMTNiNyA4QzFDN0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDJcKQotIDk5MiAxM2JhIDhDMUM3RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksMlwpCi0gOTkzIDEzYmQgOEMxQzgwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVheCw0XCkKLSA5OTQgMTNjMCA4QzFDODEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDRcKQotIDk5NSAxM2MzIDhDMUM4MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsNFwpCi0gOTk2IDEzYzYgOEMxQzgzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVheCw0XCkKLSA5OTcgMTNjOSAzRThDMUM4NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDRcKQotIDk5OCAxM2NkIDhDMUM4NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCw0XCkKLSA5OTkgMTNkNCA4QzFDODYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWF4LDRcKQotIDEwMDAgMTNkNyA4QzFDODcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDRcKQotIDEwMDEgMTNkYSA4QzFDODggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWN4LDRcKQotIDEwMDIgMTNkZCA4QzFDODkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWN4LDRcKQotIDEwMDMgMTNlMCA4QzFDOEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDRcKQotIDEwMDQgMTNlMyA4QzFDOEIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWN4LDRcKQotIDEwMDUgMTNlNiAzRThDMUM4QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWN4LDRcKQotIDEwMDYgMTNlYSA4QzFDOEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsNFwpCi0gMTAwNyAxM2YxIDhDMUM4RSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlY3gsNFwpCi0gMTAwOCAxM2Y0IDhDMUM4RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlY3gsNFwpCi0gMTAwOSAxM2Y3IDhDMUM5MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsNFwpCi0gMTAxMCAxM2ZhIDhDMUM5MSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZHgsNFwpCi0gMTAxMSAxM2ZkIDhDMUM5MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZHgsNFwpCi0gMTAxMiAxNDAwIDhDMUM5MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsNFwpCi0gMTAxMyAxNDAzIDNFOEMxQzk0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZHgsNFwpCi0gMTAxNCAxNDA3IDhDMUM5NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkeCw0XCkKLSAxMDE1IDE0MGUgOEMxQzk2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCw0XCkKLSAxMDE2IDE0MTEgOEMxQzk3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkeCw0XCkKLSAxMDE3IDE0MTQgOEMxQzk4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVieCw0XCkKLSAxMDE4IDE0MTcgOEMxQzk5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCw0XCkKLSAxMDE5IDE0MWEgOEMxQzlBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVieCw0XCkKLSAxMDIwIDE0MWQgOEMxQzlCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVieCw0XCkKLSAxMDIxIDE0MjAgM0U4QzFDOUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCw0XCkKLSAxMDIyIDE0MjQgOEMxQzlEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJ4LDRcKQotIDEwMjMgMTQyYiA4QzFDOUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJ4LDRcKQotIDEwMjQgMTQyZSA4QzFDOUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDRcKQotIDEwMjUgMTQzMSA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDEwMjYgMTQzMyA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDEwMjcgMTQzNSA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDEwMjggMTQzNyA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDEwMjkgMTQzOSAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDEwMzAgMTQzZCA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMSAxNDQzIDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMiAxNDQ1IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMyAxNDQ3IDhDMUNBOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsNFwpCi0gMTAzNCAxNDRhIDhDMUNBOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYnAsNFwpCi0gMTAzNSAxNDRkIDhDMUNBQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsNFwpCi0gMTAzNiAxNDUwIDhDMUNBQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsNFwpCi0gMTAzNyAxNDUzIDNFOEMxQ0FDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYnAsNFwpCi0gMTAzOCAxNDU3IDhDMUNBRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCw0XCkKLSAxMDM5IDE0NWUgOEMxQ0FFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCw0XCkKLSAxMDQwIDE0NjEgOEMxQ0FGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVicCw0XCkKLSAxMDQxIDE0NjQgOEMxQ0IwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSw0XCkKLSAxMDQyIDE0NjcgOEMxQ0IxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSw0XCkKLSAxMDQzIDE0NmEgOEMxQ0IyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVzaSw0XCkKLSAxMDQ0IDE0NmQgOEMxQ0IzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSw0XCkKLSAxMDQ1IDE0NzAgM0U4QzFDQjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSw0XCkKLSAxMDQ2IDE0NzQgOEMxQ0I1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZXNpLDRcKQotIDEwNDcgMTQ3YiA4QzFDQjYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDRcKQotIDEwNDggMTQ3ZSA4QzFDQjcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDRcKQotIDEwNDkgMTQ4MSA4QzFDQjggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWRpLDRcKQotIDEwNTAgMTQ4NCA4QzFDQjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDRcKQotIDEwNTEgMTQ4NyA4QzFDQkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDRcKQotIDEwNTIgMTQ4YSA4QzFDQkIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWRpLDRcKQotIDEwNTMgMTQ4ZCAzRThDMUNCQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDRcKQotIDEwNTQgMTQ5MSA4QzFDQkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksNFwpCi0gMTA1NSAxNDk4IDhDMUNCRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZGksNFwpCi0gMTA1NiAxNDliIDhDMUNCRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksNFwpCi0gMTA1NyAxNDllIDhDMUNDMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsOFwpCi0gMTA1OCAxNGExIDhDMUNDMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYXgsOFwpCi0gMTA1OSAxNGE0IDhDMUNDMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsOFwpCi0gMTA2MCAxNGE3IDhDMUNDMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsOFwpCi0gMTA2MSAxNGFhIDNFOEMxQ0M0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYXgsOFwpCi0gMTA2MiAxNGFlIDhDMUNDNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCw4XCkKLSAxMDYzIDE0YjUgOEMxQ0M2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCw4XCkKLSAxMDY0IDE0YjggOEMxQ0M3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCw4XCkKLSAxMDY1IDE0YmIgOEMxQ0M4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCw4XCkKLSAxMDY2IDE0YmUgOEMxQ0M5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCw4XCkKLSAxMDY3IDE0YzEgOEMxQ0NBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCw4XCkKLSAxMDY4IDE0YzQgOEMxQ0NCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCw4XCkKLSAxMDY5IDE0YzcgM0U4QzFDQ0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCw4XCkKLSAxMDcwIDE0Y2IgOEMxQ0NEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDhcKQotIDEwNzEgMTRkMiA4QzFDQ0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDhcKQotIDEwNzIgMTRkNSA4QzFDQ0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDhcKQotIDEwNzMgMTRkOCA4QzFDRDAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDhcKQotIDEwNzQgMTRkYiA4QzFDRDEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDhcKQotIDEwNzUgMTRkZSA4QzFDRDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDhcKQotIDEwNzYgMTRlMSA4QzFDRDMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDhcKQotIDEwNzcgMTRlNCAzRThDMUNENCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDhcKQotIDEwNzggMTRlOCA4QzFDRDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsOFwpCi0gMTA3OSAxNGVmIDhDMUNENiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsOFwpCi0gMTA4MCAxNGYyIDhDMUNENyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsOFwpCi0gMTA4MSAxNGY1IDhDMUNEOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsOFwpCi0gMTA4MiAxNGY4IDhDMUNEOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsOFwpCi0gMTA4MyAxNGZiIDhDMUNEQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsOFwpCi0gMTA4NCAxNGZlIDhDMUNEQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsOFwpCi0gMTA4NSAxNTAxIDNFOEMxQ0RDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsOFwpCi0gMTA4NiAxNTA1IDhDMUNERDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCw4XCkKLSAxMDg3IDE1MGMgOEMxQ0RFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCw4XCkKLSAxMDg4IDE1MGYgOEMxQ0RGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCw4XCkKLSAxMDg5IDE1MTIgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkwIDE1MTQgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkxIDE1MTYgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkyIDE1MTggOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkzIDE1MWEgM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSAxMDk0IDE1MWUgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczpcKCw4XCkKLS4qV2FybmluZzouKgotIDEwOTUgMTUyNCA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDEwOTYgMTUyNiA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDEwOTcgMTUyOCA4QzFDRTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJwLDhcKQotIDEwOTggMTUyYiA4QzFDRTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDhcKQotIDEwOTkgMTUyZSA4QzFDRUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDhcKQotIDExMDAgMTUzMSA4QzFDRUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJwLDhcKQotIDExMDEgMTUzNCAzRThDMUNFQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDhcKQotIDExMDIgMTUzOCA4QzFDRUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsOFwpCi0gMTEwMyAxNTNmIDhDMUNFRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYnAsOFwpCi0gMTEwNCAxNTQyIDhDMUNFRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsOFwpCi0gMTEwNSAxNTQ1IDhDMUNGMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksOFwpCi0gMTEwNiAxNTQ4IDhDMUNGMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlc2ksOFwpCi0gMTEwNyAxNTRiIDhDMUNGMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksOFwpCi0gMTEwOCAxNTRlIDhDMUNGMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksOFwpCi0gMTEwOSAxNTUxIDNFOEMxQ0Y0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlc2ksOFwpCi0gMTExMCAxNTU1IDhDMUNGNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSw4XCkKLSAxMTExIDE1NWMgOEMxQ0Y2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSw4XCkKLSAxMTEyIDE1NWYgOEMxQ0Y3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVzaSw4XCkKLSAxMTEzIDE1NjIgOEMxQ0Y4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSw4XCkKLSAxMTE0IDE1NjUgOEMxQ0ZBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkaSw4XCkKLSAxMTE1IDE1NjggOEMxQ0Y5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSw4XCkKLSAxMTE2IDE1NmIgOEMxQ0ZCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSw4XCkKLSAxMTE3IDE1NmUgM0U4QzFDRkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSw4XCkKLSAxMTE4IDE1NzIgOEMxQ0ZEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWRpLDhcKQotIDExMTkgMTU3OSA4QzFDRkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDhcKQotIDExMjAgMTU3YyA4QzFDRkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDhcKQotIDExMjEgMTU3ZiA4QzVDMDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCwxXCkKLSAxMTIyIDE1ODMgOEM1QzAxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsMVwpCi0gMTEyMyAxNTg3IDhDNUMwMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDFcKQotIDExMjQgMTU4YiA4QzVDMDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCwxXCkKLSAxMTI1IDE1OGYgM0U4QzVDMDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsMVwpCi0gMTEyNiAxNTk0IDNFOEM1QzA1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDFcKQotIDExMjcgMTU5OSA4QzVDMDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCwxXCkKLSAxMTI4IDE1OWQgOEM1QzA3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsMVwpCi0gMTEyOSAxNWExIDhDNUMwODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDFcKQotIDExMzAgMTVhNSA4QzVDMDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCwxXCkKLSAxMTMxIDE1YTkgOEM1QzBBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsMVwpCi0gMTEzMiAxNWFkIDhDNUMwQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDFcKQotIDExMzMgMTViMSAzRThDNUMwQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCwxXCkKLSAxMTM0IDE1YjYgM0U4QzVDMEQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsMVwpCi0gMTEzNSAxNWJiIDhDNUMwRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDFcKQotIDExMzYgMTViZiA4QzVDMEYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCwxXCkKLSAxMTM3IDE1YzMgOEM1QzEwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsMVwpCi0gMTEzOCAxNWM3IDhDNUMxMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDFcKQotIDExMzkgMTVjYiA4QzVDMTIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCwxXCkKLSAxMTQwIDE1Y2YgOEM1QzEzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsMVwpCi0gMTE0MSAxNWQzIDNFOEM1QzE0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDFcKQotIDExNDIgMTVkOCAzRThDNUMxNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCwxXCkKLSAxMTQzIDE1ZGQgOEM1QzE2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsMVwpCi0gMTE0NCAxNWUxIDhDNUMxNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDFcKQotIDExNDUgMTVlNSA4QzVDMTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCwxXCkKLSAxMTQ2IDE1ZTkgOEM1QzE5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsMVwpCi0gMTE0NyAxNWVkIDhDNUMxQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDFcKQotIDExNDggMTVmMSA4QzVDMUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCwxXCkKLSAxMTQ5IDE1ZjUgM0U4QzVDMUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsMVwpCi0gMTE1MCAxNWZhIDNFOEM1QzFEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDFcKQotIDExNTEgMTVmZiA4QzVDMUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCwxXCkKLSAxMTUyIDE2MDMgOEM1QzFGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsMVwpCi0gMTE1MyAxNjA3IDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwxXCkKLSAxMTU0IDE2MGEgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDFcKQotIDExNTUgMTYwZCA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsMVwpCi0gMTE1NiAxNjEwIDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwxXCkKLSAxMTU3IDE2MTMgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDFcKQotIDExNTggMTYxOCAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsMVwpCi0gMTE1OSAxNjFjIDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwxXCkKLSAxMTYwIDE2MWYgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDFcKQotIDExNjEgMTYyMiA4QzVDMjgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCwxXCkKLSAxMTYyIDE2MjYgOEM1QzI5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsMVwpCi0gMTE2MyAxNjJhIDhDNUMyQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDFcKQotIDExNjQgMTYyZSA4QzVDMkIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCwxXCkKLSAxMTY1IDE2MzIgM0U4QzVDMkMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsMVwpCi0gMTE2NiAxNjM3IDNFOEM1QzJEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDFcKQotIDExNjcgMTYzYyA4QzVDMkUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCwxXCkKLSAxMTY4IDE2NDAgOEM1QzJGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsMVwpCi0gMTE2OSAxNjQ0IDhDNUMzMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDFcKQotIDExNzAgMTY0OCA4QzVDMzExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSwxXCkKLSAxMTcxIDE2NGMgOEM1QzMyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksMVwpCi0gMTE3MiAxNjUwIDhDNUMzMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDFcKQotIDExNzMgMTY1NCAzRThDNUMzNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSwxXCkKLSAxMTc0IDE2NTkgM0U4QzVDMzUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksMVwpCi0gMTE3NSAxNjVlIDhDNUMzNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDFcKQotIDExNzYgMTY2MiA4QzVDMzcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSwxXCkKLSAxMTc3IDE2NjYgOEM1QzM4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksMVwpCi0gMTE3OCAxNjZhIDhDNUMzOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWRpLDFcKQotIDExNzkgMTY2ZSA4QzVDM0ExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSwxXCkKLSAxMTgwIDE2NzIgOEM1QzNCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksMVwpCi0gMTE4MSAxNjc2IDNFOEM1QzNDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDFcKQotIDExODIgMTY3YiAzRThDNUMzRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSwxXCkKLSAxMTgzIDE2ODAgOEM1QzNFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksMVwpCi0gMTE4NCAxNjg0IDhDNUMzRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDFcKQotIDExODUgMTY4OCA4QzVDNDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCwyXCkKLSAxMTg2IDE2OGMgOEM1QzQxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsMlwpCi0gMTE4NyAxNjkwIDhDNUM0MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDJcKQotIDExODggMTY5NCA4QzVDNDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCwyXCkKLSAxMTg5IDE2OTggM0U4QzVDNDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsMlwpCi0gMTE5MCAxNjlkIDNFOEM1QzQ1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDJcKQotIDExOTEgMTZhMiA4QzVDNDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCwyXCkKLSAxMTkyIDE2YTYgOEM1QzQ3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsMlwpCi0gMTE5MyAxNmFhIDhDNUM0ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDJcKQotIDExOTQgMTZhZSA4QzVDNDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCwyXCkKLSAxMTk1IDE2YjIgOEM1QzRBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsMlwpCi0gMTE5NiAxNmI2IDhDNUM0QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDJcKQotIDExOTcgMTZiYSAzRThDNUM0QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCwyXCkKLSAxMTk4IDE2YmYgM0U4QzVDNEQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsMlwpCi0gMTE5OSAxNmM0IDhDNUM0RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDJcKQotIDEyMDAgMTZjOCA4QzVDNEYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCwyXCkKLSAxMjAxIDE2Y2MgOEM1QzUwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsMlwpCi0gMTIwMiAxNmQwIDhDNUM1MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDJcKQotIDEyMDMgMTZkNCA4QzVDNTIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCwyXCkKLSAxMjA0IDE2ZDggOEM1QzUzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsMlwpCi0gMTIwNSAxNmRjIDNFOEM1QzU0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDJcKQotIDEyMDYgMTZlMSAzRThDNUM1NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCwyXCkKLSAxMjA3IDE2ZTYgOEM1QzU2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsMlwpCi0gMTIwOCAxNmVhIDhDNUM1NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDJcKQotIDEyMDkgMTZlZSA4QzVDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCwyXCkKLSAxMjEwIDE2ZjIgOEM1QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsMlwpCi0gMTIxMSAxNmY2IDhDNUM1QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDJcKQotIDEyMTIgMTZmYSA4QzVDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCwyXCkKLSAxMjEzIDE2ZmUgM0U4QzVDNUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsMlwpCi0gMTIxNCAxNzAzIDNFOEM1QzVEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDJcKQotIDEyMTUgMTcwOCA4QzVDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCwyXCkKLSAxMjE2IDE3MGMgOEM1QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsMlwpCi0gMTIxNyAxNzEwIDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDEyMTggMTcxMyA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAxMjE5IDE3MTYgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMCAxNzE5IDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDEyMjEgMTcxYyAzRThDNUMyNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAxMjIyIDE3MjEgM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMyAxNzI1IDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDEyMjQgMTcyOCA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxMjI1IDE3MmIgOEM1QzY4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsMlwpCi0gMTIyNiAxNzJmIDhDNUM2OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDJcKQotIDEyMjcgMTczMyA4QzVDNkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCwyXCkKLSAxMjI4IDE3MzcgOEM1QzZCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsMlwpCi0gMTIyOSAxNzNiIDNFOEM1QzZDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDJcKQotIDEyMzAgMTc0MCAzRThDNUM2RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCwyXCkKLSAxMjMxIDE3NDUgOEM1QzZFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsMlwpCi0gMTIzMiAxNzQ5IDhDNUM2RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDJcKQotIDEyMzMgMTc0ZCA4QzVDNzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSwyXCkKLSAxMjM0IDE3NTEgOEM1QzcxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksMlwpCi0gMTIzNSAxNzU1IDhDNUM3MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDJcKQotIDEyMzYgMTc1OSA4QzVDNzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSwyXCkKLSAxMjM3IDE3NWQgM0U4QzVDNzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksMlwpCi0gMTIzOCAxNzYyIDNFOEM1Qzc1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDJcKQotIDEyMzkgMTc2NyA4QzVDNzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSwyXCkKLSAxMjQwIDE3NmIgOEM1Qzc3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksMlwpCi0gMTI0MSAxNzZmIDhDNUM3ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDJcKQotIDEyNDIgMTc3MyA4QzVDNzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSwyXCkKLSAxMjQzIDE3NzcgOEM1QzdBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZGksMlwpCi0gMTI0NCAxNzdiIDhDNUM3QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDJcKQotIDEyNDUgMTc3ZiAzRThDNUM3QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSwyXCkKLSAxMjQ2IDE3ODQgM0U4QzVDN0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksMlwpCi0gMTI0NyAxNzg5IDhDNUM3RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDJcKQotIDEyNDggMTc4ZCA4QzVDN0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSwyXCkKLSAxMjQ5IDE3OTEgOEM1QzgwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsNFwpCi0gMTI1MCAxNzk1IDhDNUM4MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDRcKQotIDEyNTEgMTc5OSA4QzVDODIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCw0XCkKLSAxMjUyIDE3OWQgOEM1QzgzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsNFwpCi0gMTI1MyAxN2ExIDNFOEM1Qzg0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDRcKQotIDEyNTQgMTdhNiAzRThDNUM4NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCw0XCkKLSAxMjU1IDE3YWIgOEM1Qzg2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsNFwpCi0gMTI1NiAxN2FmIDhDNUM4NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDRcKQotIDEyNTcgMTdiMyA4QzVDODgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCw0XCkKLSAxMjU4IDE3YjcgOEM1Qzg5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsNFwpCi0gMTI1OSAxN2JiIDhDNUM4QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDRcKQotIDEyNjAgMTdiZiA4QzVDOEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCw0XCkKLSAxMjYxIDE3YzMgM0U4QzVDOEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsNFwpCi0gMTI2MiAxN2M4IDNFOEM1QzhEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDRcKQotIDEyNjMgMTdjZCA4QzVDOEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCw0XCkKLSAxMjY0IDE3ZDEgOEM1QzhGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsNFwpCi0gMTI2NSAxN2Q1IDhDNUM5MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDRcKQotIDEyNjYgMTdkOSA4QzVDOTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCw0XCkKLSAxMjY3IDE3ZGQgOEM1QzkyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsNFwpCi0gMTI2OCAxN2UxIDhDNUM5MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDRcKQotIDEyNjkgMTdlNSAzRThDNUM5NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCw0XCkKLSAxMjcwIDE3ZWEgM0U4QzVDOTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsNFwpCi0gMTI3MSAxN2VmIDhDNUM5NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDRcKQotIDEyNzIgMTdmMyA4QzVDOTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCw0XCkKLSAxMjczIDE3ZjcgOEM1Qzk4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsNFwpCi0gMTI3NCAxN2ZiIDhDNUM5OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDRcKQotIDEyNzUgMTdmZiA4QzVDOUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCw0XCkKLSAxMjc2IDE4MDMgOEM1QzlCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsNFwpCi0gMTI3NyAxODA3IDNFOEM1QzlDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDRcKQotIDEyNzggMTgwYyAzRThDNUM5RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCw0XCkKLSAxMjc5IDE4MTEgOEM1QzlFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsNFwpCi0gMTI4MCAxODE1IDhDNUM5RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDRcKQotIDEyODEgMTgxOSA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxMjgyIDE4MWMgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTI4MyAxODFmIDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDEyODQgMTgyMiA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxMjg1IDE4MjUgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4NiAxODJhIDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDEyODcgMTgyZSA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSAxMjg4IDE4MzEgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4OSAxODM0IDhDNUNBODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJwLDRcKQotIDEyOTAgMTgzOCA4QzVDQTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVicCw0XCkKLSAxMjkxIDE4M2MgOEM1Q0FBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYnAsNFwpCi0gMTI5MiAxODQwIDhDNUNBQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJwLDRcKQotIDEyOTMgMTg0NCAzRThDNUNBQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVicCw0XCkKLSAxMjk0IDE4NDkgM0U4QzVDQUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYnAsNFwpCi0gMTI5NSAxODRlIDhDNUNBRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJwLDRcKQotIDEyOTYgMTg1MiA4QzVDQUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVicCw0XCkKLSAxMjk3IDE4NTYgOEM1Q0IwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlc2ksNFwpCi0gMTI5OCAxODVhIDhDNUNCMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZXNpLDRcKQotIDEyOTkgMTg1ZSA4QzVDQjIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVzaSw0XCkKLSAxMzAwIDE4NjIgOEM1Q0IzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlc2ksNFwpCi0gMTMwMSAxODY2IDNFOEM1Q0I0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZXNpLDRcKQotIDEzMDIgMTg2YiAzRThDNUNCNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVzaSw0XCkKLSAxMzAzIDE4NzAgOEM1Q0I2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlc2ksNFwpCi0gMTMwNCAxODc0IDhDNUNCNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZXNpLDRcKQotIDEzMDUgMTg3OCA4QzVDQjgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkaSw0XCkKLSAxMzA2IDE4N2MgOEM1Q0I5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksNFwpCi0gMTMwNyAxODgwIDhDNUNCQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDRcKQotIDEzMDggMTg4NCA4QzVDQkIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkaSw0XCkKLSAxMzA5IDE4ODggM0U4QzVDQkMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZGksNFwpCi0gMTMxMCAxODhkIDNFOEM1Q0JEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWRpLDRcKQotIDEzMTEgMTg5MiA4QzVDQkUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkaSw0XCkKLSAxMzEyIDE4OTYgOEM1Q0JGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZGksNFwpCi0gMTMxMyAxODlhIDhDNUNDMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWF4LDhcKQotIDEzMTQgMTg5ZSA4QzVDQzExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVheCw4XCkKLSAxMzE1IDE4YTIgOEM1Q0MyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYXgsOFwpCi0gMTMxNiAxOGE2IDhDNUNDMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWF4LDhcKQotIDEzMTcgMThhYSAzRThDNUNDNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVheCw4XCkKLSAxMzE4IDE4YWYgM0U4QzVDQzUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYXgsOFwpCi0gMTMxOSAxOGI0IDhDNUNDNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWF4LDhcKQotIDEzMjAgMThiOCA4QzVDQzcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVheCw4XCkKLSAxMzIxIDE4YmMgOEM1Q0M4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlY3gsOFwpCi0gMTMyMiAxOGMwIDhDNUNDOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWN4LDhcKQotIDEzMjMgMThjNCA4QzVDQ0ExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVjeCw4XCkKLSAxMzI0IDE4YzggOEM1Q0NCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlY3gsOFwpCi0gMTMyNSAxOGNjIDNFOEM1Q0NDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWN4LDhcKQotIDEzMjYgMThkMSAzRThDNUNDRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVjeCw4XCkKLSAxMzI3IDE4ZDYgOEM1Q0NFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlY3gsOFwpCi0gMTMyOCAxOGRhIDhDNUNDRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWN4LDhcKQotIDEzMjkgMThkZSA4QzVDRDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkeCw4XCkKLSAxMzMwIDE4ZTIgOEM1Q0QxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZHgsOFwpCi0gMTMzMSAxOGU2IDhDNUNEMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWR4LDhcKQotIDEzMzIgMThlYSA4QzVDRDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkeCw4XCkKLSAxMzMzIDE4ZWUgM0U4QzVDRDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZHgsOFwpCi0gMTMzNCAxOGYzIDNFOEM1Q0Q1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWR4LDhcKQotIDEzMzUgMThmOCA4QzVDRDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkeCw4XCkKLSAxMzM2IDE4ZmMgOEM1Q0Q3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZHgsOFwpCi0gMTMzNyAxOTAwIDhDNUNEODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJ4LDhcKQotIDEzMzggMTkwNCA4QzVDRDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVieCw4XCkKLSAxMzM5IDE5MDggOEM1Q0RBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYngsOFwpCi0gMTM0MCAxOTBjIDhDNUNEQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJ4LDhcKQotIDEzNDEgMTkxMCAzRThDNUNEQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVieCw4XCkKLSAxMzQyIDE5MTUgM0U4QzVDREQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYngsOFwpCi0gMTM0MyAxOTFhIDhDNUNERTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJ4LDhcKQotIDEzNDQgMTkxZSA4QzVDREYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVieCw4XCkKLSAxMzQ1IDE5MjIgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0NiAxOTI1IDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDEzNDcgMTkyOCA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxMzQ4IDE5MmIgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0OSAxOTJlIDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDEzNTAgMTkzMyAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxMzUxIDE5MzcgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMTM1MiAxOTNhIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDEzNTMgMTkzZCA4QzVDRTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCw4XCkKLSAxMzU0IDE5NDEgOEM1Q0U5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsOFwpCi0gMTM1NSAxOTQ1IDhDNUNFQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDhcKQotIDEzNTYgMTk0OSA4QzVDRUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCw4XCkKLSAxMzU3IDE5NGQgM0U4QzVDRUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsOFwpCi0gMTM1OCAxOTUyIDNFOEM1Q0VEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDhcKQotIDEzNTkgMTk1NyA4QzVDRUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCw4XCkKLSAxMzYwIDE5NWIgOEM1Q0VGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsOFwpCi0gMTM2MSAxOTVmIDhDNUNGMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDhcKQotIDEzNjIgMTk2MyA4QzVDRjExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSw4XCkKLSAxMzYzIDE5NjcgOEM1Q0YyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksOFwpCi0gMTM2NCAxOTZiIDhDNUNGMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDhcKQotIDEzNjUgMTk2ZiAzRThDNUNGNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSw4XCkKLSAxMzY2IDE5NzQgM0U4QzVDRjUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksOFwpCi0gMTM2NyAxOTc5IDhDNUNGNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDhcKQotIDEzNjggMTk3ZCA4QzVDRjcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSw4XCkKLSAxMzY5IDE5ODEgOEM1Q0Y4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksOFwpCi0gMTM3MCAxOTg1IDhDNUNGQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDhcKQotIDEzNzEgMTk4OSA4QzVDRjkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSw4XCkKLSAxMzcyIDE5OGQgOEM1Q0ZCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksOFwpCi0gMTM3MyAxOTkxIDNFOEM1Q0ZDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDhcKQotIDEzNzQgMTk5NiAzRThDNUNGRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSw4XCkKLSAxMzc1IDE5OWIgOEM1Q0ZFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksOFwpCi0gMTM3NiAxOTlmIDhDNUNGRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDhcKQotIDEzNzcgMTlhMyA4QzlDMDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwxXCkKLSAxMzc4IDE5YWEgOEM5QzAxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMVwpCi0gMTM3OSAxOWIxIDhDOUMwMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDFcKQotIDEzODAgMTliOCA4QzlDMDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwxXCkKLSAxMzgxIDE5YmYgM0U4QzlDMDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMVwpCi0gMTM4MiAxOWM3IDNFOEM5QzA1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDFcKQotIDEzODMgMTljZiA4QzlDMDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwxXCkKLSAxMzg0IDE5ZDYgOEM5QzA3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMVwpCi0gMTM4NSAxOWRkIDhDOUMwODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDFcKQotIDEzODYgMTllNCA4QzlDMDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwxXCkKLSAxMzg3IDE5ZWIgOEM5QzBBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMVwpCi0gMTM4OCAxOWYyIDhDOUMwQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDFcKQotIDEzODkgMTlmOSAzRThDOUMwQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwxXCkKLSAxMzkwIDFhMDEgM0U4QzlDMEQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMVwpCi0gMTM5MSAxYTA5IDhDOUMwRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDFcKQotIDEzOTIgMWExMCA4QzlDMEY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwxXCkKLSAxMzkzIDFhMTcgOEM5QzEwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMVwpCi0gMTM5NCAxYTFlIDhDOUMxMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDFcKQotIDEzOTUgMWEyNSA4QzlDMTI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwxXCkKLSAxMzk2IDFhMmMgOEM5QzEzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMVwpCi0gMTM5NyAxYTMzIDNFOEM5QzE0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDFcKQotIDEzOTggMWEzYiAzRThDOUMxNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwxXCkKLSAxMzk5IDFhNDMgOEM5QzE2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMVwpCi0gMTQwMCAxYTRhIDhDOUMxNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDFcKQotIDE0MDEgMWE1MSA4QzlDMTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwxXCkKLSAxNDAyIDFhNTggOEM5QzE5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMVwpCi0gMTQwMyAxYTVmIDhDOUMxQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDFcKQotIDE0MDQgMWE2NiA4QzlDMUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwxXCkKLSAxNDA1IDFhNmQgM0U4QzlDMUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMVwpCi0gMTQwNiAxYTc1IDNFOEM5QzFEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDFcKQotIDE0MDcgMWE3ZCA4QzlDMUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwxXCkKLSAxNDA4IDFhODQgOEM5QzFGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMVwpCi0gMTQwOSAxYThiIDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwxXCkKLSAxNDEwIDFhOTEgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDFcKQotIDE0MTEgMWE5NyA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsMVwpCi0gMTQxMiAxYTlkIDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwxXCkKLSAxNDEzIDFhYTMgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDFcKQotIDE0MTQgMWFhYiAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsMVwpCi0gMTQxNSAxYWIyIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwxXCkKLSAxNDE2IDFhYjggOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDFcKQotIDE0MTcgMWFiZSA4QzlDMjg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCwxXCkKLSAxNDE4IDFhYzUgOEM5QzI5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMVwpCi0gMTQxOSAxYWNjIDhDOUMyQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDFcKQotIDE0MjAgMWFkMyA4QzlDMkI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCwxXCkKLSAxNDIxIDFhZGEgM0U4QzlDMkMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMVwpCi0gMTQyMiAxYWUyIDNFOEM5QzJEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDFcKQotIDE0MjMgMWFlYSA4QzlDMkU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCwxXCkKLSAxNDI0IDFhZjEgOEM5QzJGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMVwpCi0gMTQyNSAxYWY4IDhDOUMzMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDFcKQotIDE0MjYgMWFmZiA4QzlDMzE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSwxXCkKLSAxNDI3IDFiMDYgOEM5QzMyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMVwpCi0gMTQyOCAxYjBkIDhDOUMzMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDFcKQotIDE0MjkgMWIxNCAzRThDOUMzNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSwxXCkKLSAxNDMwIDFiMWMgM0U4QzlDMzUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMVwpCi0gMTQzMSAxYjI0IDhDOUMzNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDFcKQotIDE0MzIgMWIyYiA4QzlDMzc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSwxXCkKLSAxNDMzIDFiMzIgOEM5QzM4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMVwpCi0gMTQzNCAxYjM5IDhDOUMzOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDFcKQotIDE0MzUgMWI0MCA4QzlDM0E3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSwxXCkKLSAxNDM2IDFiNDcgOEM5QzNCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMVwpCi0gMTQzNyAxYjRlIDNFOEM5QzNDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDFcKQotIDE0MzggMWI1NiAzRThDOUMzRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSwxXCkKLSAxNDM5IDFiNWUgOEM5QzNFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMVwpCi0gMTQ0MCAxYjY1IDhDOUMzRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDFcKQotIDE0NDEgMWI2YyA4QzlDNDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwyXCkKLSAxNDQyIDFiNzMgOEM5QzQxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMlwpCi0gMTQ0MyAxYjdhIDhDOUM0Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDJcKQotIDE0NDQgMWI4MSA4QzlDNDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwyXCkKLSAxNDQ1IDFiODggM0U4QzlDNDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMlwpCi0gMTQ0NiAxYjkwIDNFOEM5QzQ1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDJcKQotIDE0NDcgMWI5OCA4QzlDNDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwyXCkKLSAxNDQ4IDFiOWYgOEM5QzQ3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMlwpCi0gMTQ0OSAxYmE2IDhDOUM0ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDJcKQotIDE0NTAgMWJhZCA4QzlDNDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwyXCkKLSAxNDUxIDFiYjQgOEM5QzRBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMlwpCi0gMTQ1MiAxYmJiIDhDOUM0Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDJcKQotIDE0NTMgMWJjMiAzRThDOUM0QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwyXCkKLSAxNDU0IDFiY2EgM0U4QzlDNEQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMlwpCi0gMTQ1NSAxYmQyIDhDOUM0RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDJcKQotIDE0NTYgMWJkOSA4QzlDNEY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwyXCkKLSAxNDU3IDFiZTAgOEM5QzUwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMlwpCi0gMTQ1OCAxYmU3IDhDOUM1MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDJcKQotIDE0NTkgMWJlZSA4QzlDNTI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwyXCkKLSAxNDYwIDFiZjUgOEM5QzUzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMlwpCi0gMTQ2MSAxYmZjIDNFOEM5QzU0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDJcKQotIDE0NjIgMWMwNCAzRThDOUM1NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwyXCkKLSAxNDYzIDFjMGMgOEM5QzU2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMlwpCi0gMTQ2NCAxYzEzIDhDOUM1Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDJcKQotIDE0NjUgMWMxYSA4QzlDNTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwyXCkKLSAxNDY2IDFjMjEgOEM5QzU5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMlwpCi0gMTQ2NyAxYzI4IDhDOUM1QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDJcKQotIDE0NjggMWMyZiA4QzlDNUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwyXCkKLSAxNDY5IDFjMzYgM0U4QzlDNUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMlwpCi0gMTQ3MCAxYzNlIDNFOEM5QzVEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDJcKQotIDE0NzEgMWM0NiA4QzlDNUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwyXCkKLSAxNDcyIDFjNGQgOEM5QzVGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMlwpCi0gMTQ3MyAxYzU0IDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDE0NzQgMWM1YSA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc1IDFjNjAgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3NiAxYzY2IDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDE0NzcgMWM2YyAzRThDOUMyNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc4IDFjNzQgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3OSAxYzdiIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDE0ODAgMWM4MSA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxNDgxIDFjODcgOEM5QzY4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMlwpCi0gMTQ4MiAxYzhlIDhDOUM2OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDJcKQotIDE0ODMgMWM5NSA4QzlDNkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCwyXCkKLSAxNDg0IDFjOWMgOEM5QzZCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMlwpCi0gMTQ4NSAxY2EzIDNFOEM5QzZDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDJcKQotIDE0ODYgMWNhYiAzRThDOUM2RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCwyXCkKLSAxNDg3IDFjYjMgOEM5QzZFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMlwpCi0gMTQ4OCAxY2JhIDhDOUM2Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDJcKQotIDE0ODkgMWNjMSA4QzlDNzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSwyXCkKLSAxNDkwIDFjYzggOEM5QzcxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMlwpCi0gMTQ5MSAxY2NmIDhDOUM3Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDJcKQotIDE0OTIgMWNkNiA4QzlDNzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSwyXCkKLSAxNDkzIDFjZGQgM0U4QzlDNzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMlwpCi0gMTQ5NCAxY2U1IDNFOEM5Qzc1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDJcKQotIDE0OTUgMWNlZCA4QzlDNzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSwyXCkKLSAxNDk2IDFjZjQgOEM5Qzc3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMlwpCi0gMTQ5NyAxY2ZiIDhDOUM3ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDJcKQotIDE0OTggMWQwMiA4QzlDNzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSwyXCkKLSAxNDk5IDFkMDkgOEM5QzdBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMlwpCi0gMTUwMCAxZDEwIDhDOUM3Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDJcKQotIDE1MDEgMWQxNyAzRThDOUM3QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSwyXCkKLSAxNTAyIDFkMWYgM0U4QzlDN0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMlwpCi0gMTUwMyAxZDI3IDhDOUM3RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDJcKQotIDE1MDQgMWQyZSA4QzlDN0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSwyXCkKLSAxNTA1IDFkMzUgOEM5QzgwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsNFwpCi0gMTUwNiAxZDNjIDhDOUM4MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDRcKQotIDE1MDcgMWQ0MyA4QzlDODI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCw0XCkKLSAxNTA4IDFkNGEgOEM5QzgzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsNFwpCi0gMTUwOSAxZDUxIDNFOEM5Qzg0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDRcKQotIDE1MTAgMWQ1OSAzRThDOUM4NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCw0XCkKLSAxNTExIDFkNjEgOEM5Qzg2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsNFwpCi0gMTUxMiAxZDY4IDhDOUM4Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDRcKQotIDE1MTMgMWQ2ZiA4QzlDODg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCw0XCkKLSAxNTE0IDFkNzYgOEM5Qzg5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsNFwpCi0gMTUxNSAxZDdkIDhDOUM4QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDRcKQotIDE1MTYgMWQ4NCA4QzlDOEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCw0XCkKLSAxNTE3IDFkOGIgM0U4QzlDOEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsNFwpCi0gMTUxOCAxZDkzIDNFOEM5QzhEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDRcKQotIDE1MTkgMWQ5YiA4QzlDOEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCw0XCkKLSAxNTIwIDFkYTIgOEM5QzhGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsNFwpCi0gMTUyMSAxZGE5IDhDOUM5MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDRcKQotIDE1MjIgMWRiMCA4QzlDOTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCw0XCkKLSAxNTIzIDFkYjcgOEM5QzkyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsNFwpCi0gMTUyNCAxZGJlIDhDOUM5Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDRcKQotIDE1MjUgMWRjNSAzRThDOUM5NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCw0XCkKLSAxNTI2IDFkY2QgM0U4QzlDOTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsNFwpCi0gMTUyNyAxZGQ1IDhDOUM5Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDRcKQotIDE1MjggMWRkYyA4QzlDOTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCw0XCkKLSAxNTI5IDFkZTMgOEM5Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsNFwpCi0gMTUzMCAxZGVhIDhDOUM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDRcKQotIDE1MzEgMWRmMSA4QzlDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCw0XCkKLSAxNTMyIDFkZjggOEM5QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsNFwpCi0gMTUzMyAxZGZmIDNFOEM5QzlDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDRcKQotIDE1MzQgMWUwNyAzRThDOUM5RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCw0XCkKLSAxNTM1IDFlMGYgOEM5QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsNFwpCi0gMTUzNiAxZTE2IDhDOUM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDRcKQotIDE1MzcgMWUxZCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxNTM4IDFlMjMgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTUzOSAxZTI5IDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDE1NDAgMWUyZiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxNTQxIDFlMzUgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0MiAxZTNkIDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDE1NDMgMWU0NCA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSAxNTQ0IDFlNGEgOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0NSAxZTUwIDhDOUNBODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDRcKQotIDE1NDYgMWU1NyA4QzlDQTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCw0XCkKLSAxNTQ3IDFlNWUgOEM5Q0FBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsNFwpCi0gMTU0OCAxZTY1IDhDOUNBQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDRcKQotIDE1NDkgMWU2YyAzRThDOUNBQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCw0XCkKLSAxNTUwIDFlNzQgM0U4QzlDQUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsNFwpCi0gMTU1MSAxZTdjIDhDOUNBRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDRcKQotIDE1NTIgMWU4MyA4QzlDQUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVicCw0XCkKLSAxNTUzIDFlOGEgOEM5Q0IwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksNFwpCi0gMTU1NCAxZTkxIDhDOUNCMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDRcKQotIDE1NTUgMWU5OCA4QzlDQjI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSw0XCkKLSAxNTU2IDFlOWYgOEM5Q0IzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksNFwpCi0gMTU1NyAxZWE2IDNFOEM5Q0I0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDRcKQotIDE1NTggMWVhZSAzRThDOUNCNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSw0XCkKLSAxNTU5IDFlYjYgOEM5Q0I2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksNFwpCi0gMTU2MCAxZWJkIDhDOUNCNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDRcKQotIDE1NjEgMWVjNCA4QzlDQjg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSw0XCkKLSAxNTYyIDFlY2IgOEM5Q0I5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksNFwpCi0gMTU2MyAxZWQyIDhDOUNCQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDRcKQotIDE1NjQgMWVkOSA4QzlDQkI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSw0XCkKLSAxNTY1IDFlZTAgM0U4QzlDQkMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZGksNFwpCi0gMTU2NiAxZWU4IDNFOEM5Q0JEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDRcKQotIDE1NjcgMWVmMCA4QzlDQkU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSw0XCkKLSAxNTY4IDFlZjcgOEM5Q0JGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZGksNFwpCi0gMTU2OSAxZWZlIDhDOUNDMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDhcKQotIDE1NzAgMWYwNSA4QzlDQzE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCw4XCkKLSAxNTcxIDFmMGMgOEM5Q0MyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsOFwpCi0gMTU3MiAxZjEzIDhDOUNDMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDhcKQotIDE1NzMgMWYxYSAzRThDOUNDNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCw4XCkKLSAxNTc0IDFmMjIgM0U4QzlDQzUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsOFwpCi0gMTU3NSAxZjJhIDhDOUNDNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDhcKQotIDE1NzYgMWYzMSA4QzlDQzc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVheCw4XCkKLSAxNTc3IDFmMzggOEM5Q0M4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsOFwpCi0gMTU3OCAxZjNmIDhDOUNDOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDhcKQotIDE1NzkgMWY0NiA4QzlDQ0E3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCw4XCkKLSAxNTgwIDFmNGQgOEM5Q0NCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsOFwpCi0gMTU4MSAxZjU0IDNFOEM5Q0NDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDhcKQotIDE1ODIgMWY1YyAzRThDOUNDRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCw4XCkKLSAxNTgzIDFmNjQgOEM5Q0NFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsOFwpCi0gMTU4NCAxZjZiIDhDOUNDRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDhcKQotIDE1ODUgMWY3MiA4QzlDRDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCw4XCkKLSAxNTg2IDFmNzkgOEM5Q0QxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsOFwpCi0gMTU4NyAxZjgwIDhDOUNEMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDhcKQotIDE1ODggMWY4NyA4QzlDRDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCw4XCkKLSAxNTg5IDFmOGUgM0U4QzlDRDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsOFwpCi0gMTU5MCAxZjk2IDNFOEM5Q0Q1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDhcKQotIDE1OTEgMWY5ZSA4QzlDRDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCw4XCkKLSAxNTkyIDFmYTUgOEM5Q0Q3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsOFwpCi0gMTU5MyAxZmFjIDhDOUNEODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDhcKQotIDE1OTQgMWZiMyA4QzlDRDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCw4XCkKLSAxNTk1IDFmYmEgOEM5Q0RBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYngsOFwpCi0gMTU5NiAxZmMxIDhDOUNEQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDhcKQotIDE1OTcgMWZjOCAzRThDOUNEQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCw4XCkKLSAxNTk4IDFmZDAgM0U4QzlDREQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYngsOFwpCi0gMTU5OSAxZmQ4IDhDOUNERTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDhcKQotIDE2MDAgMWZkZiA4QzlDREY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVieCw4XCkKLSAxNjAxIDFmZTYgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwMiAxZmVjIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDE2MDMgMWZmMiA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA0IDFmZjggOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwNSAxZmZlIDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDE2MDYgMjAwNiAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA3IDIwMGQgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMTYwOCAyMDEzIDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDE2MDkgMjAxOSA4QzlDRTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCw4XCkKLSAxNjEwIDIwMjAgOEM5Q0U5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsOFwpCi0gMTYxMSAyMDI3IDhDOUNFQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDhcKQotIDE2MTIgMjAyZSA4QzlDRUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCw4XCkKLSAxNjEzIDIwMzUgM0U4QzlDRUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsOFwpCi0gMTYxNCAyMDNkIDNFOEM5Q0VEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDhcKQotIDE2MTUgMjA0NSA4QzlDRUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCw4XCkKLSAxNjE2IDIwNGMgOEM5Q0VGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsOFwpCi0gMTYxNyAyMDUzIDhDOUNGMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDhcKQotIDE2MTggMjA1YSA4QzlDRjE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSw4XCkKLSAxNjE5IDIwNjEgOEM5Q0YyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksOFwpCi0gMTYyMCAyMDY4IDhDOUNGMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDhcKQotIDE2MjEgMjA2ZiAzRThDOUNGNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSw4XCkKLSAxNjIyIDIwNzcgM0U4QzlDRjUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksOFwpCi0gMTYyMyAyMDdmIDhDOUNGNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDhcKQotIDE2MjQgMjA4NiA4QzlDRjc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSw4XCkKLSAxNjI1IDIwOGQgOEM5Q0Y4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksOFwpCi0gMTYyNiAyMDk0IDhDOUNGQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDhcKQotIDE2MjcgMjA5YiA4QzlDRjk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSw4XCkKLSAxNjI4IDIwYTIgOEM5Q0ZCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksOFwpCi0gMTYyOSAyMGE5IDNFOEM5Q0ZDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDhcKQotIDE2MzAgMjBiMSAzRThDOUNGRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSw4XCkKLSAxNjMxIDIwYjkgOEM5Q0ZFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksOFwpCi0gMTYzMiAyMGMwIDhDOUNGRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDhcKQotIDE2MzMgMjBjNyAzRThDNUMwNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWF4LDFcKQotIDE2MzQgMjBjYyAzRThDNUMwRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWN4LDFcKQotIDE2MzUgMjBkMSAzRThDNUMxNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWR4LDFcKQotIDE2MzYgMjBkNiAzRThDNUMxRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJ4LDFcKQotIDE2MzcgMjBkYiAzRThDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwxXCkKLSAxNjM4IDIwZGYgM0U4QzVDMkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCwxXCkKLSAxNjM5IDIwZTQgM0U4QzVDMzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSwxXCkKLSAxNjQwIDIwZTkgM0U4QzVDM0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSwxXCkKLSAxNjQxIDIwZWUgM0U4QzVDNDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCwyXCkKLSAxNjQyIDIwZjMgM0U4QzVDNEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCwyXCkKLSAxNjQzIDIwZjggM0U4QzVDNTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCwyXCkKLSAxNjQ0IDIwZmQgM0U4QzVDNUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCwyXCkKLSAxNjQ1IDIxMDIgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSAxNjQ2IDIxMDYgM0U4QzVDNkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCwyXCkKLSAxNjQ3IDIxMGIgM0U4QzVDNzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSwyXCkKLSAxNjQ4IDIxMTAgM0U4QzVDN0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSwyXCkKLSAxNjQ5IDIxMTUgM0U4QzVDODUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCw0XCkKLSAxNjUwIDIxMWEgM0U4QzVDOEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCw0XCkKLSAxNjUxIDIxMWYgM0U4QzVDOTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCw0XCkKLSAxNjUyIDIxMjQgM0U4QzVDOUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCw0XCkKLSAxNjUzIDIxMjkgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSAxNjU0IDIxMmQgM0U4QzVDQUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCw0XCkKLSAxNjU1IDIxMzIgM0U4QzVDQjUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSw0XCkKLSAxNjU2IDIxMzcgM0U4QzVDQkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSw0XCkKLSAxNjU3IDIxM2MgM0U4QzVDQzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCw4XCkKLSAxNjU4IDIxNDEgM0U4QzVDQ0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCw4XCkKLSAxNjU5IDIxNDYgM0U4QzVDRDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCw4XCkKLSAxNjYwIDIxNGIgM0U4QzVDREQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCw4XCkKLSAxNjYxIDIxNTAgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxNjYyIDIxNTQgM0U4QzVDRUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCw4XCkKLSAxNjYzIDIxNTkgM0U4QzVDRjUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSw4XCkKLSAxNjY0IDIxNWUgM0U4QzVDRkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSw4XCkKLSAxNjY1IDIxNjMgOEMxRDEyMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczoweDEyXCgsMVwpCi0gMTY2NiAyMTY5IDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDJcKQotLipXYXJuaW5nOi4qCi0gMTY2NyAyMTZmIDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDRcKQotLipXYXJuaW5nOi4qCi0gMTY2OCAyMTc1IDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDhcKQotLipXYXJuaW5nOi4qCi0gMTY2OSBbIAldKgotIDE2NzAgWyAJXSogICAgIAkJIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotIDE2NzEgMjE3YiAwMDAwMDAwMCAwMFsgCV0qLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDQ0NmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTY3MSArMCwwIEBACi0ucHNpemUgMAotLnRleHQKLQltb3YJJWRzLCVzczooJWVheCkKLQltb3YJJWRzLCVzczooJWVjeCkKLQltb3YJJWRzLCVzczooJWVkeCkKLQltb3YJJWRzLCVzczooJWVieCkKLQltb3YJJWRzLCVzczowCi0JbW92CSVkcywlc3M6KCVlc2kpCi0JbW92CSVkcywlc3M6KCVlZGkpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2kpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnApCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSkKLQltb3YJJWRzLCVlYXgKLQltb3YJJWRzLCVlY3gKLQltb3YJJWRzLCVlZHgKLQltb3YJJWRzLCVlYngKLQltb3YJJWRzLCVlc3AKLQltb3YJJWRzLCVlYnAKLQltb3YJJWRzLCVlc2kKLQltb3YJJWRzLCVlZGkKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJXNzOigsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVzczooLCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJXNzOigsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVzcCwxKQotCW1vdgklZHMsJXNzOigsMSkKLQltb3YJJWRzLCVzczooJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVzczooLCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJXNzOigsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVzczooLCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVheCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJXNzOigsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVzczooLCVlYngsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsMikKLQltb3YJJWRzLCVzczooLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVheCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVieCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJXNzOigsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVzczooLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJXNzOigsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVzczooLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVieCw0KQotCW1vdgklZHMsJXNzOiglZXNwLDQpCi0JbW92CSVkcywlc3M6KCw0KQotCW1vdgklZHMsJXNzOiglZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJXNzOigsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVzczooLCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJXNzOigsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVzczooLCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJXNzOigsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVzcCw4KQotCW1vdgklZHMsJXNzOigsOCkKLQltb3YJJWRzLCVzczooJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVzczooLCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJXNzOigsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCwxKQotCW1vdgklZHMsJXNzOjB4MTIoLDIpCi0JbW92CSVkcywlc3M6MHgxMigsNCkKLQltb3YJJWRzLCVzczoweDEyKCw4KQotCW1vdgklZHMsJWRzOiglZWF4KQotCW1vdgklZHMsJWRzOiglZWN4KQotCW1vdgklZHMsJWRzOiglZWR4KQotCW1vdgklZHMsJWRzOiglZWJ4KQotCW1vdgklZHMsJWRzOjAKLQltb3YJJWRzLCVkczooJWVzaSkKLQltb3YJJWRzLCVkczooJWVkaSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGkpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2kpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpKQotCW1vdgklZHMsJWVheAotCW1vdgklZHMsJWVjeAotCW1vdgklZHMsJWVkeAotCW1vdgklZHMsJWVieAotCW1vdgklZHMsJWVzcAotCW1vdgklZHMsJWVicAotCW1vdgklZHMsJWVzaQotCW1vdgklZHMsJWVkaQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJWRzOigsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVkczooLCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVieCwxKQotCW1vdgklZHMsJWRzOiglZXNwLDEpCi0JbW92CSVkcywlZHM6KCwxKQotCW1vdgklZHMsJWRzOiglZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCwxKQotCW1vdgklZHMsJWRzOigsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVkczooLCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVheCwyKQotCW1vdgklZHMsJWRzOigsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVkczooLCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYngsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVieCwyKQotCW1vdgklZHMsJWRzOigsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsMikKLQltb3YJJWRzLCVkczooJWVzcCwyKQotCW1vdgklZHMsJWRzOigsMikKLQltb3YJJWRzLCVkczooJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVkczooLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVheCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlZGksMikKLQltb3YJJWRzLCVkczooJWVieCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJWRzOigsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlZGksMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVkczooLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJWRzOigsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVkczooLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsNCkKLQltb3YJJWRzLCVkczooLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVieCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJWRzOigsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVkczooLCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJWRzOigsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVkczooLCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVieCw4KQotCW1vdgklZHMsJWRzOiglZXNwLDgpCi0JbW92CSVkcywlZHM6KCw4KQotCW1vdgklZHMsJWRzOiglZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCw4KQotCW1vdgklZHMsJWRzOigsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVkczooLCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoLDEpCi0JbW92CSVkcywlZHM6MHgxMigsMikKLQltb3YJJWRzLCVkczoweDEyKCw0KQotCW1vdgklZHMsJWRzOjB4MTIoLDgpCi0KLQkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCi0JLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L25ha2VkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L25ha2VkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNmUzMDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9uYWtlZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotI29iamR1bXA6IC1kcncKLSNuYW1lOiBpMzg2IG5ha2VkIHJlZwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qaTM4Ni4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJNjYgMjYgZmYgMjMgWyAJXSpqbXB3ICAgXColZXM6XCglZWJ4XCkKLSAgIDQ6CThhIDI1IDUwIDAwIDAwIDAwIFsgCV0qbW92ICAgIDB4NTAsJWFoCi0gICBhOgliMiAyMCBbIAldKm1vdiAgICBcJDB4MjAsJWRsCi0gICBjOgliYiAwMCAwMCAwMCAwMCBbIAldKm1vdiAgICBcJDB4MCwlZWJ4CWQ6IChSXzM4Nl8pPyhkaXIpPzMyCS50ZXh0Ci0gIDExOglkOSBjOSBbIAldKmZ4Y2ggICAlc3RcKDFcKQotICAxMzoJMzYgOGMgYTQgODEgZDIgMDQgMDAgMDAgWyAJXSptb3ZsICAgJWZzLCVzczoweDRkMlwoJWVjeCwlZWF4LDRcKQotICAxYjoJOGMgMmMgZWQgMDAgMDAgMDAgMDAgWyAJXSptb3ZsICAgJWdzLDB4MFwoLCVlYnAsOFwpCi0gIDIyOgkyNiA4OCAyNSAwMCAwMCAwMCAwMCBbIAldKm1vdiAgICAlYWgsJWVzOjB4MAotICAyOToJMmUgOGIgNzQgMTQgODAgWyAJXSptb3YgICAgJWNzOjB4ZmZmZmZmODBcKCVlc3AsJWVkeCwxXCksJWVzaQotICAyZToJZjMgNjUgYTUgWyAJXSpyZXB6IG1vdnNsICVnczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSAgMzE6CWVjIFsgCV0qaW4gICAgIFwoJWR4XCksJWFsCi0gIDMyOgk2NiBlZiBbIAldKm91dCAgICAlYXgsXCglZHhcKQotICAzNDoJNjcgZDIgMTQgWyAJXSphZGRyMTYgcmNsYiAlY2wsXCglc2lcKQotICAzNzoJMGYgMjAgZDAgWyAJXSptb3YgICAgJWNyMiwlZWF4Ci0gIDNhOgkwZiA3MiBkMCAwNCBbIAldKnBzcmxkICBcJDB4NCwlbW0wCi0gIDNlOgk2NiA0NyBbIAldKmluYyAgICAlZGkKLSAgNDA6CTY2IDUxIFsgCV0qcHVzaCAgICVjeAotICA0MjoJNjYgNTggWyAJXSpwb3AgICAgJWF4Ci0gIDQ0Ogk2NiA4NyBkZCBbIAldKnhjaGcgICAlYngsJWJwCi0gIDQ3Ogk2YSAwMiBbIAldKnB1c2ggICBcJDB4MgotICA0OToJMDAgMDAgWyAJXSphZGQgICAgJWFsLFwoJWVheFwpCi0gIDRiOgkwMCAwMCBbIAldKmFkZCAgICAlYWwsXCglZWF4XCkKLSAgNGQ6CTAwIDAwIFsgCV0qYWRkICAgICVhbCxcKCVlYXhcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9uYWtlZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9uYWtlZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJjYzRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbmFrZWQucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS5hdHRfc3ludGF4IG5vcHJlZml4Ci0KLWZvbzoJam1wdyBlczoqKGVieCkKLQltb3YgKDB4OCoweGEpLGFoCi0JbW92ICQoOCo0KSxkbAotCW1vdiAkZm9vLGVieAotCWZ4Y2ggc3QoMSkKLQltb3YgZnMsc3M6MTIzNChlY3gsZWF4LDQpCi0JbW92IGdzLGRzOigsZWJwLDgpCi0JbW92IGFoLGVzOjAKLQltb3YgY3M6LTEyOChlc3AsZWR4KSxlc2kKLQlyZXAgbW92c2wgZ3M6KGVzaSksZXM6KGVkaSkKLQlpbiBkeCxhbAotCW91dHcgKGR4KQotIGFkZHIxNiByY2xiIGNsLChzaSkKLQltb3YgY3IyLGVheAotCXBzcmxkICQ0LG1tMAotCWluYyBkaQotCXB1c2ggY3gKLQlwb3AgYXgKLQl4Y2hnIGJ4LGJwCi0JcHVzaGwgJDIKLQotIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmNDlkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5kCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLSNhczogLUoKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IG9wY29kZQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMDAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICAgNjoJMDEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgIGM6CTAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgMTI6CTAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDE4OgkwNCA5MCBbIAldKmFkZCAgICBcJDB4OTAsJWFsCi0gIDFhOgkwNSA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICBcJDB4OTA5MDkwOTAsJWVheAotICAxZjoJMDYgWyAJXSpwdXNoICAgJWVzCi0gIDIwOgkwNyBbIAldKnBvcCAgICAlZXMKLSAgMjE6CTA4IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgMjc6CTA5IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDJkOgkwYSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDMzOgkwYiA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICAzOToJMGMgOTAgWyAJXSpvciAgICAgXCQweDkwLCVhbAotICAzYjoJMGQgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgNDA6CTBlIFsgCV0qcHVzaCAgICVjcwotICA0MToJMTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICA0NzoJMTEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNGQ6CTEyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgNTM6CTEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDU5OgkxNCA5MCBbIAldKmFkYyAgICBcJDB4OTAsJWFsCi0gIDViOgkxNSA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICBcJDB4OTA5MDkwOTAsJWVheAotICA2MDoJMTYgWyAJXSpwdXNoICAgJXNzCi0gIDYxOgkxNyBbIAldKnBvcCAgICAlc3MKLSAgNjI6CTE4IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNjg6CTE5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDZlOgkxYSA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDc0OgkxYiA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICA3YToJMWMgOTAgWyAJXSpzYmIgICAgXCQweDkwLCVhbAotICA3YzoJMWQgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgODE6CTFlIFsgCV0qcHVzaCAgICVkcwotICA4MjoJMWYgWyAJXSpwb3AgICAgJWRzCi0gIDgzOgkyMCA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDg5OgkyMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICA4ZjoJMjIgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICA5NToJMjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgOWI6CTI0IDkwIFsgCV0qYW5kICAgIFwkMHg5MCwlYWwKLSAgOWQ6CTI1IDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIGEyOgkyNyBbIAldKmRhYSAgICAKLSAgYTM6CTI4IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgYTk6CTI5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGFmOgkyYSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIGI1OgkyYiA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICBiYjoJMmMgOTAgWyAJXSpzdWIgICAgXCQweDkwLCVhbAotICBiZDoJMmQgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgYzI6CTJmIFsgCV0qZGFzICAgIAotICBjMzoJMzAgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICBjOToJMzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgY2Y6CTMyIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgZDU6CTMzIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIGRiOgkzNCA5MCBbIAldKnhvciAgICBcJDB4OTAsJWFsCi0gIGRkOgkzNSA5MCA5MCA5MCA5MCBbIAldKnhvciAgICBcJDB4OTA5MDkwOTAsJWVheAotICBlMjoJMzcgWyAJXSphYWEgICAgCi0gIGUzOgkzOCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGU5OgkzOSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICBlZjoJM2EgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICBmNToJM2IgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgZmI6CTNjIDkwIFsgCV0qY21wICAgIFwkMHg5MCwlYWwKLSAgZmQ6CTNkIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gMTAyOgkzZiBbIAldKmFhcyAgICAKLSAxMDM6CTQwIFsgCV0qaW5jICAgICVlYXgKLSAxMDQ6CTQxIFsgCV0qaW5jICAgICVlY3gKLSAxMDU6CTQyIFsgCV0qaW5jICAgICVlZHgKLSAxMDY6CTQzIFsgCV0qaW5jICAgICVlYngKLSAxMDc6CTQ0IFsgCV0qaW5jICAgICVlc3AKLSAxMDg6CTQ1IFsgCV0qaW5jICAgICVlYnAKLSAxMDk6CTQ2IFsgCV0qaW5jICAgICVlc2kKLSAxMGE6CTQ3IFsgCV0qaW5jICAgICVlZGkKLSAxMGI6CTQ4IFsgCV0qZGVjICAgICVlYXgKLSAxMGM6CTQ5IFsgCV0qZGVjICAgICVlY3gKLSAxMGQ6CTRhIFsgCV0qZGVjICAgICVlZHgKLSAxMGU6CTRiIFsgCV0qZGVjICAgICVlYngKLSAxMGY6CTRjIFsgCV0qZGVjICAgICVlc3AKLSAxMTA6CTRkIFsgCV0qZGVjICAgICVlYnAKLSAxMTE6CTRlIFsgCV0qZGVjICAgICVlc2kKLSAxMTI6CTRmIFsgCV0qZGVjICAgICVlZGkKLSAxMTM6CTUwIFsgCV0qcHVzaCAgICVlYXgKLSAxMTQ6CTUxIFsgCV0qcHVzaCAgICVlY3gKLSAxMTU6CTUyIFsgCV0qcHVzaCAgICVlZHgKLSAxMTY6CTUzIFsgCV0qcHVzaCAgICVlYngKLSAxMTc6CTU0IFsgCV0qcHVzaCAgICVlc3AKLSAxMTg6CTU1IFsgCV0qcHVzaCAgICVlYnAKLSAxMTk6CTU2IFsgCV0qcHVzaCAgICVlc2kKLSAxMWE6CTU3IFsgCV0qcHVzaCAgICVlZGkKLSAxMWI6CTU4IFsgCV0qcG9wICAgICVlYXgKLSAxMWM6CTU5IFsgCV0qcG9wICAgICVlY3gKLSAxMWQ6CTVhIFsgCV0qcG9wICAgICVlZHgKLSAxMWU6CTViIFsgCV0qcG9wICAgICVlYngKLSAxMWY6CTVjIFsgCV0qcG9wICAgICVlc3AKLSAxMjA6CTVkIFsgCV0qcG9wICAgICVlYnAKLSAxMjE6CTVlIFsgCV0qcG9wICAgICVlc2kKLSAxMjI6CTVmIFsgCV0qcG9wICAgICVlZGkKLSAxMjM6CTYwIFsgCV0qcHVzaGEgIAotIDEyNDoJNjEgWyAJXSpwb3BhICAgCi0gMTI1Ogk2MiA5MCA5MCA5MCA5MCA5MCBbIAldKmJvdW5kICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDEyYjoJNjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphcnBsICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDEzMToJNjggOTAgOTAgOTAgOTAgWyAJXSpwdXNoICAgXCQweDkwOTA5MDkwCi0gMTM2Ogk2OSA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxNDA6CTZhIDkwIFsgCV0qcHVzaCAgIFwkMHhmZmZmZmY5MAotIDE0MjoJNmIgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMTQ5Ogk2YyBbIAldKmluc2IgICBcKCVkeFwpLCVlczpcKCVlZGlcKQotIDE0YToJNmQgWyAJXSppbnNsICAgXCglZHhcKSwlZXM6XCglZWRpXCkKLSAxNGI6CTZlIFsgCV0qb3V0c2IgICVkczpcKCVlc2lcKSxcKCVkeFwpCi0gMTRjOgk2ZiBbIAldKm91dHNsICAlZHM6XCglZXNpXCksXCglZHhcKQotIDE0ZDoJNzAgOTAgWyAJXSpqbyAgICAgKDB4KT9kZi4qCi0gMTRmOgk3MSA5MCBbIAldKmpubyAgICAoMHgpP2UxLioKLSAxNTE6CTcyIDkwIFsgCV0qamIgICAgICgweCk/ZTMuKgotIDE1MzoJNzMgOTAgWyAJXSpqYWUgICAgKDB4KT9lNS4qCi0gMTU1Ogk3NCA5MCBbIAldKmplICAgICAoMHgpP2U3LioKLSAxNTc6CTc1IDkwIFsgCV0qam5lICAgICgweCk/ZTkuKgotIDE1OToJNzYgOTAgWyAJXSpqYmUgICAgKDB4KT9lYi4qCi0gMTViOgk3NyA5MCBbIAldKmphICAgICAoMHgpP2VkLioKLSAxNWQ6CTc4IDkwIFsgCV0qanMgICAgICgweCk/ZWYuKgotIDE1ZjoJNzkgOTAgWyAJXSpqbnMgICAgKDB4KT9mMS4qCi0gMTYxOgk3YSA5MCBbIAldKmpwICAgICAoMHgpP2YzLioKLSAxNjM6CTdiIDkwIFsgCV0qam5wICAgICgweCk/ZjUuKgotIDE2NToJN2MgOTAgWyAJXSpqbCAgICAgKDB4KT9mNy4qCi0gMTY3Ogk3ZCA5MCBbIAldKmpnZSAgICAoMHgpP2Y5LioKLSAxNjk6CTdlIDkwIFsgCV0qamxlICAgICgweCk/ZmIuKgotIDE2YjoJN2YgOTAgWyAJXSpqZyAgICAgKDB4KT9mZC4qCi0gMTZkOgk4MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2IgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTc0Ogk4MSA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2wgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTdlOgk4MyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2wgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTg1Ogk4NCA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gMThiOgk4NSA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDE5MToJODYgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE5NzoJODcgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOWQ6CTg4IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAxYTM6CTg5IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMWE5Ogk4YSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gMWFmOgk4YiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDFiNToJOGMgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZsICAgJXNzLDB4OTA5MDkwOTBcKCVlYXhcKQotIDFiYjoJOGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZWEgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxYzE6CThlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlc3MKLSAxYzc6CThmIDgwIDkwIDkwIDkwIDkwIFsgCV0qcG9wbCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDFjZDoJOTAgWyAJXSpub3AgICAgCi0gMWNlOgk5MSBbIAldKnhjaGcgICAlZWF4LCVlY3gKLSAxY2Y6CTkyIFsgCV0qeGNoZyAgICVlYXgsJWVkeAotIDFkMDoJOTMgWyAJXSp4Y2hnICAgJWVheCwlZWJ4Ci0gMWQxOgk5NCBbIAldKnhjaGcgICAlZWF4LCVlc3AKLSAxZDI6CTk1IFsgCV0qeGNoZyAgICVlYXgsJWVicAotIDFkMzoJOTYgWyAJXSp4Y2hnICAgJWVheCwlZXNpCi0gMWQ0Ogk5NyBbIAldKnhjaGcgICAlZWF4LCVlZGkKLSAxZDU6CTk4IFsgCV0qY3d0bCAgIAotIDFkNjoJOTkgWyAJXSpjbHRkICAgCi0gMWQ3Ogk5YSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmxjYWxsICBcJDB4OTA5MCxcJDB4OTA5MDkwOTAKLSAxZGU6CTliIFsgCV0qZndhaXQKLSAxZGY6CTljIFsgCV0qcHVzaGYgIAotIDFlMDoJOWQgWyAJXSpwb3BmICAgCi0gMWUxOgk5ZSBbIAldKnNhaGYgICAKLSAxZTI6CTlmIFsgCV0qbGFoZiAgIAotIDFlMzoJYTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MCwlYWwKLSAxZTg6CWExIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTAsJWVheAotIDFlZDoJYTIgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWFsLDB4OTA5MDkwOTAKLSAxZjI6CWEzIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVlYXgsMHg5MDkwOTA5MAotIDFmNzoJYTQgWyAJXSptb3ZzYiAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotIDFmODoJYTUgWyAJXSptb3ZzbCAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotIDFmOToJYTYgWyAJXSpjbXBzYiAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQotIDFmYToJYTcgWyAJXSpjbXBzbCAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQotIDFmYjoJYTggOTAgWyAJXSp0ZXN0ICAgXCQweDkwLCVhbAotIDFmZDoJYTkgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgXCQweDkwOTA5MDkwLCVlYXgKLSAyMDI6CWFhIFsgCV0qc3RvcyAgICVhbCwlZXM6XCglZWRpXCkKLSAyMDM6CWFiIFsgCV0qc3RvcyAgICVlYXgsJWVzOlwoJWVkaVwpCi0gMjA0OglhYyBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWFsCi0gMjA1OglhZCBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWVheAotIDIwNjoJYWUgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVhbAotIDIwNzoJYWYgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVlYXgKLSAyMDg6CWIwIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYWwKLSAyMGE6CWIxIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlY2wKLSAyMGM6CWIyIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlZGwKLSAyMGU6CWIzIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYmwKLSAyMTA6CWI0IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYWgKLSAyMTI6CWI1IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlY2gKLSAyMTQ6CWI2IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlZGgKLSAyMTY6CWI3IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYmgKLSAyMTg6CWI4IDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gMjFkOgliOSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVjeAotIDIyMjoJYmEgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlZHgKLSAyMjc6CWJiIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWJ4Ci0gMjJjOgliYyA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVzcAotIDIzMToJYmQgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlYnAKLSAyMzY6CWJlIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZXNpCi0gMjNiOgliZiA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVkaQotIDI0MDoJYzAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI0NzoJYzEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI0ZToJYzIgOTAgOTAgWyAJXSpyZXQgICAgXCQweDkwOTAKLSAyNTE6CWMzIFsgCV0qcmV0ICAgIAotIDI1MjoJYzQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZXMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAyNTg6CWM1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGRzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMjVlOgljNiA4MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmIgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjY1OgljNyA4MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmwgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjZmOgljOCA5MCA5MCA5MCBbIAldKmVudGVyICBcJDB4OTA5MCxcJDB4OTAKLSAyNzM6CWM5IFsgCV0qbGVhdmUgIAotIDI3NDoJY2EgOTAgOTAgWyAJXSpscmV0ICAgXCQweDkwOTAKLSAyNzc6CWNiIFsgCV0qbHJldCAgIAotIDI3ODoJY2MgWyAJXSppbnQzICAgCi0gMjc5OgljZCA5MCBbIAldKmludCAgICBcJDB4OTAKLSAyN2I6CWNlIFsgCV0qaW50byAgIAotIDI3YzoJY2YgWyAJXSppcmV0ICAgCi0gMjdkOglkMCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGIgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyODM6CWQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsbCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDI4OToJZDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI4ZjoJZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI5NToJZDQgOTAgWyAJXSphYW0gICAgXCQweGZmZmZmZjkwCi0gMjk3OglkNSA5MCBbIAldKmFhZCAgICBcJDB4ZmZmZmZmOTAKLSAyOTk6CWQ3IFsgCV0qeGxhdCAgICVkczpcKCVlYnhcKQotIDI5YToJZDggOTAgOTAgOTAgOTAgOTAgWyAJXSpmY29tcyAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmEwOglkOSA5MCA5MCA5MCA5MCA5MCBbIAldKmZzdHMgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYTY6CWRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmljb21sIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJhYzoJZGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaXN0bCAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmIyOglkYyA5MCA5MCA5MCA5MCA5MCBbIAldKmZjb21sICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYjg6CWRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qZnN0bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJiZToJZGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaWNvbSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmM0OglkZiA5MCA5MCA5MCA5MCA5MCBbIAldKmZpc3QgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyY2E6CWUwIDkwIFsgCV0qbG9vcG5lICgweCk/MjVjLioKLSAyY2M6CWUxIDkwIFsgCV0qbG9vcGUgICgweCk/MjVlLioKLSAyY2U6CWUyIDkwIFsgCV0qbG9vcCAgICgweCk/MjYwLioKLSAyZDA6CWUzIDkwIFsgCV0qamVjeHogICgweCk/MjYyLioKLSAyZDI6CWU0IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlYWwKLSAyZDQ6CWU1IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlZWF4Ci0gMmQ2OgllNiA5MCBbIAldKm91dCAgICAlYWwsXCQweDkwCi0gMmQ4OgllNyA5MCBbIAldKm91dCAgICAlZWF4LFwkMHg5MAotIDJkYToJZTggOTAgOTAgOTAgOTAgWyAJXSpjYWxsICAgKDB4KT85MDkwOTM2Zi4qCi0gMmRmOgllOSA5MCA5MCA5MCA5MCBbIAldKmptcCAgICAoMHgpPzkwOTA5Mzc0LioKLSAyZTQ6CWVhIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGptcCAgIFwkMHg5MDkwLFwkMHg5MDkwOTA5MAotIDJlYjoJZWIgOTAgWyAJXSpqbXAgICAgKDB4KT8yN2QuKgotIDJlZDoJZWMgWyAJXSppbiAgICAgXCglZHhcKSwlYWwKLSAyZWU6CWVkIFsgCV0qaW4gICAgIFwoJWR4XCksJWVheAotIDJlZjoJZWUgWyAJXSpvdXQgICAgJWFsLFwoJWR4XCkKLSAyZjA6CWVmIFsgCV0qb3V0ICAgICVlYXgsXCglZHhcKQotIDJmMToJZjQgWyAJXSpobHQgICAgCi0gMmYyOglmNSBbIAldKmNtYyAgICAKLSAyZjM6CWY2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90YiAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJmOToJZjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3RsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmZmOglmOCBbIAldKmNsYyAgICAKLSAzMDA6CWY5IFsgCV0qc3RjICAgIAotIDMwMToJZmEgWyAJXSpjbGkgICAgCi0gMzAyOglmYiBbIAldKnN0aSAgICAKLSAzMDM6CWZjIFsgCV0qY2xkICAgIAotIDMwNDoJZmQgWyAJXSpzdGQgICAgCi0gMzA1OglmZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNhbGwgICBcKjB4OTA5MDkwOTBcKCVlYXhcKQotIDMwYjoJMGYgMDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpsbGR0ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMzEyOgkwZiAwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmxnZHQgICAweDkwOTA5MDkwXCglZWF4XCkKLSAzMTk6CTBmIDAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGFyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzIwOgkwZiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmxzbCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDMyNzoJMGYgMDYgWyAJXSpjbHRzICAgCi0gMzI5OgkwZiAwOCBbIAldKmludmQgICAKLSAzMmI6CTBmIDA5IFsgCV0qd2JpbnZkIAotIDMyZDoJMGYgMGIgWyAJXSp1ZDJhICAgCi0gMzJmOgkwZiAyMCBkMCBbIAldKm1vdiAgICAlY3IyLCVlYXgKLSAzMzI6CTBmIDIxIGQwIFsgCV0qbW92ICAgICVkYjIsJWVheAotIDMzNToJMGYgMjIgZDAgWyAJXSptb3YgICAgJWVheCwlY3IyCi0gMzM4OgkwZiAyMyBkMCBbIAldKm1vdiAgICAlZWF4LCVkYjIKLSAzM2I6CTBmIDI0IGQwIFsgCV0qbW92ICAgICV0cjIsJWVheAotIDMzZToJMGYgMjYgZDAgWyAJXSptb3YgICAgJWVheCwldHIyCi0gMzQxOgkwZiAzMCBbIAldKndybXNyICAKLSAzNDM6CTBmIDMxIFsgCV0qcmR0c2MgIAotIDM0NToJMGYgMzIgWyAJXSpyZG1zciAgCi0gMzQ3OgkwZiAzMyBbIAldKnJkcG1jICAKLSAzNDk6CTBmIDQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm8gIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzUwOgkwZiA0MSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZubyAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM1NzoJMGYgNDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YiAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNWU6CTBmIDQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmFlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzY1OgkwZiA0NCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZlICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM2YzoJMGYgNDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bmUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNzM6CTBmIDQ2IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmJlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzdhOgkwZiA0NyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM4MToJMGYgNDggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cyAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzODg6CTBmIDQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5zIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzhmOgkwZiA0YSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZwICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM5NjoJMGYgNGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzOWQ6CTBmIDRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmwgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2E0OgkwZiA0ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNhYjoJMGYgNGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bGUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYjI6CTBmIDRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2I5OgkwZiA2MCA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2xidyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNjMDoJMGYgNjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tsd2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzYzc6CTBmIDYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNrbGRxIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2NlOgkwZiA2MyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2tzc3diIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2Q1OgkwZiA2NCA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBndGIgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZGM6CTBmIDY1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGd0dyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNlMzoJMGYgNjYgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZ3RkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2VhOgkwZiA2NyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2t1c3diIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2YxOgkwZiA2OCA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2hidyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNmODoJMGYgNjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tod2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZmY6CTBmIDZhIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNraGRxIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDA2OgkwZiA2YiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2tzc2R3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDBkOgkwZiA2ZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmQgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQxNDoJMGYgNmYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZxICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MWI6CTBmIDcxIGQwIDkwIFsgCV0qcHNybHcgIFwkMHg5MCwlbW0wCi0gNDFmOgkwZiA3MiBkMCA5MCBbIAldKnBzcmxkICBcJDB4OTAsJW1tMAotIDQyMzoJMGYgNzMgZDAgOTAgWyAJXSpwc3JscSAgXCQweDkwLCVtbTAKLSA0Mjc6CTBmIDc0IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGVxYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQyZToJMGYgNzUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZXF3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDM1OgkwZiA3NiA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBlcWQgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0M2M6CTBmIDc3IFsgCV0qZW1tcyAgIAotIDQzZToJMGYgN2UgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZkICAgJW1tMiwweDkwOTA5MDkwXCglZWF4XCkKLSA0NDU6CTBmIDdmIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92cSAgICVtbTIsMHg5MDkwOTA5MFwoJWVheFwpCi0gNDRjOgkwZiA4MCA5MCA5MCA5MCA5MCBbIAldKmpvICAgICAoMHgpPzkwOTA5NGUyLioKLSA0NTI6CTBmIDgxIDkwIDkwIDkwIDkwIFsgCV0qam5vICAgICgweCk/OTA5MDk0ZTguKgotIDQ1ODoJMGYgODIgOTAgOTAgOTAgOTAgWyAJXSpqYiAgICAgKDB4KT85MDkwOTRlZS4qCi0gNDVlOgkwZiA4MyA5MCA5MCA5MCA5MCBbIAldKmphZSAgICAoMHgpPzkwOTA5NGY0LioKLSA0NjQ6CTBmIDg0IDkwIDkwIDkwIDkwIFsgCV0qamUgICAgICgweCk/OTA5MDk0ZmEuKgotIDQ2YToJMGYgODUgOTAgOTAgOTAgOTAgWyAJXSpqbmUgICAgKDB4KT85MDkwOTUwMC4qCi0gNDcwOgkwZiA4NiA5MCA5MCA5MCA5MCBbIAldKmpiZSAgICAoMHgpPzkwOTA5NTA2LioKLSA0NzY6CTBmIDg3IDkwIDkwIDkwIDkwIFsgCV0qamEgICAgICgweCk/OTA5MDk1MGMuKgotIDQ3YzoJMGYgODggOTAgOTAgOTAgOTAgWyAJXSpqcyAgICAgKDB4KT85MDkwOTUxMi4qCi0gNDgyOgkwZiA4OSA5MCA5MCA5MCA5MCBbIAldKmpucyAgICAoMHgpPzkwOTA5NTE4LioKLSA0ODg6CTBmIDhhIDkwIDkwIDkwIDkwIFsgCV0qanAgICAgICgweCk/OTA5MDk1MWUuKgotIDQ4ZToJMGYgOGIgOTAgOTAgOTAgOTAgWyAJXSpqbnAgICAgKDB4KT85MDkwOTUyNC4qCi0gNDk0OgkwZiA4YyA5MCA5MCA5MCA5MCBbIAldKmpsICAgICAoMHgpPzkwOTA5NTJhLioKLSA0OWE6CTBmIDhkIDkwIDkwIDkwIDkwIFsgCV0qamdlICAgICgweCk/OTA5MDk1MzAuKgotIDRhMDoJMGYgOGUgOTAgOTAgOTAgOTAgWyAJXSpqbGUgICAgKDB4KT85MDkwOTUzNi4qCi0gNGE2OgkwZiA4ZiA5MCA5MCA5MCA5MCBbIAldKmpnICAgICAoMHgpPzkwOTA5NTNjLioKLSA0YWM6CTBmIDkwIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0byAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRiMzoJMGYgOTEgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRubyAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGJhOgkwZiA5MiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGIgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0YzE6CTBmIDkzIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YWUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRjODoJMGYgOTQgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRlICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGNmOgkwZiA5NSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5lICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZDY6CTBmIDk2IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YmUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRkZDoJMGYgOTcgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRhICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGU0OgkwZiA5OCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldHMgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZWI6CTBmIDk5IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bnMgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRmMjoJMGYgOWEgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRwICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGY5OgkwZiA5YiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5wICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MDA6CTBmIDljIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUwNzoJMGYgOWQgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRnZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTBlOgkwZiA5ZSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGxlICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MTU6CTBmIDlmIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0ZyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUxYzoJMGYgYTAgWyAJXSpwdXNoICAgJWZzCi0gNTFlOgkwZiBhMSBbIAldKnBvcCAgICAlZnMKLSA1MjA6CTBmIGEyIFsgCV0qY3B1aWQgIAotIDUyMjoJMGYgYTMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidCAgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Mjk6CTBmIGE0IDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgIFwkMHg5MCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDUzMToJMGYgYTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgJWNsLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTM4OgkwZiBhOCBbIAldKnB1c2ggICAlZ3MKLSA1M2E6CTBmIGE5IFsgCV0qcG9wICAgICVncwotIDUzYzoJMGYgYWEgWyAJXSpyc20gICAgCi0gNTNlOgkwZiBhYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0cyAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU0NToJMGYgYWMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgXCQweDkwLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTRkOgkwZiBhZCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICAlY2wsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NTQ6CTBmIGFmIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTViOgkwZiBiMCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcHhjaGcgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDU2MjoJMGYgYjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTY5OgkwZiBiMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxzcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU3MDoJMGYgYjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHIgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Nzc6CTBmIGI0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGZzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTdlOgkwZiBiNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxncyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU4NToJMGYgYjYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z6YmwgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1OGM6CTBmIGI3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92endsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTkzOgkwZiBiOSBbIAldKnVkMmIgICAKLSA1OTU6CTBmIGJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRjICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTljOgkwZiBiYyA5MCA5MCA5MCA5MCA5MCBbIAldKmJzZiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDVhMzoJMGYgYmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpic3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1YWE6CTBmIGJlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c2JsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWIxOgkwZiBiZiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnN3bCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDViODoJMGYgYzAgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDViZjoJMGYgYzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1YzY6CTBmIGM4IFsgCV0qYnN3YXAgICVlYXgKLSA1Yzg6CTBmIGM5IFsgCV0qYnN3YXAgICVlY3gKLSA1Y2E6CTBmIGNhIFsgCV0qYnN3YXAgICVlZHgKLSA1Y2M6CTBmIGNiIFsgCV0qYnN3YXAgICVlYngKLSA1Y2U6CTBmIGNjIFsgCV0qYnN3YXAgICVlc3AKLSA1ZDA6CTBmIGNkIFsgCV0qYnN3YXAgICVlYnAKLSA1ZDI6CTBmIGNlIFsgCV0qYnN3YXAgICVlc2kKLSA1ZDQ6CTBmIGNmIFsgCV0qYnN3YXAgICVlZGkKLSA1ZDY6CTBmIGQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNybHcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWRkOgkwZiBkMiA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmxkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVlNDoJMGYgZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JscSAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZWI6CTBmIGQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcG11bGx3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWYyOgkwZiBkOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJ1c2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1Zjk6CTBmIGQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnVzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYwMDoJMGYgZGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYW5kICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MDc6CTBmIGRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHVzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYwZToJMGYgZGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdXN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjE1OgkwZiBkZiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhbmRuICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYxYzoJMGYgZTEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JhdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MjM6CTBmIGUyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNyYWQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjJhOgkwZiBlNSA5MCA5MCA5MCA5MCA5MCBbIAldKnBtdWxodyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYzMToJMGYgZTggOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3Vic2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2Mzg6CTBmIGU5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjNmOgkwZiBlYiA5MCA5MCA5MCA5MCA5MCBbIAldKnBvciAgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY0NjoJMGYgZWMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkc2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NGQ6CTBmIGVkIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjU0OgkwZiBlZiA5MCA5MCA5MCA5MCA5MCBbIAldKnB4b3IgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY1YjoJMGYgZjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc2xsdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NjI6CTBmIGYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNsbGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjY5OgkwZiBmMyA5MCA5MCA5MCA5MCA5MCBbIAldKnBzbGxxICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY3MDoJMGYgZjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwbWFkZHdkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjc3OgkwZiBmOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJiICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY3ZToJMGYgZjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3VidyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2ODU6CTBmIGZhIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YmQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjhjOgkwZiBmYyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRiICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY5MzoJMGYgZmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2OWE6CTBmIGZlIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNmExOgk2NiAwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmE4Ogk2NiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmFmOgk2NiAwNSA5MCA5MCBbIAldKmFkZCAgICBcJDB4OTA5MCwlYXgKLSA2YjM6CTY2IDA2IFsgCV0qcHVzaHcgICVlcwotIDZiNToJNjYgMDcgWyAJXSpwb3B3ICAgJWVzCi0gNmI3Ogk2NiAwOSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmJlOgk2NiAwYiA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmM1Ogk2NiAwZCA5MCA5MCBbIAldKm9yICAgICBcJDB4OTA5MCwlYXgKLSA2Yzk6CTY2IDBlIFsgCV0qcHVzaHcgICVjcwotIDZjYjoJNjYgMTEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZkMjoJNjYgMTMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZkOToJNjYgMTUgOTAgOTAgWyAJXSphZGMgICAgXCQweDkwOTAsJWF4Ci0gNmRkOgk2NiAxNiBbIAldKnB1c2h3ICAlc3MKLSA2ZGY6CTY2IDE3IFsgCV0qcG9wdyAgICVzcwotIDZlMToJNjYgMTkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZlODoJNjYgMWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZlZjoJNjYgMWQgOTAgOTAgWyAJXSpzYmIgICAgXCQweDkwOTAsJWF4Ci0gNmYzOgk2NiAxZSBbIAldKnB1c2h3ICAlZHMKLSA2ZjU6CTY2IDFmIFsgCV0qcG9wdyAgICVkcwotIDZmNzoJNjYgMjEgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZmZToJNjYgMjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDcwNToJNjYgMjUgOTAgOTAgWyAJXSphbmQgICAgXCQweDkwOTAsJWF4Ci0gNzA5Ogk2NiAyOSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzEwOgk2NiAyYiA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzE3Ogk2NiAyZCA5MCA5MCBbIAldKnN1YiAgICBcJDB4OTA5MCwlYXgKLSA3MWI6CTY2IDMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3MjI6CTY2IDMzIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3Mjk6CTY2IDM1IDkwIDkwIFsgCV0qeG9yICAgIFwkMHg5MDkwLCVheAotIDcyZDoJNjYgMzkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDczNDoJNjYgM2IgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDczYjoJNjYgM2QgOTAgOTAgWyAJXSpjbXAgICAgXCQweDkwOTAsJWF4Ci0gNzNmOgk2NiA0MCBbIAldKmluYyAgICAlYXgKLSA3NDE6CTY2IDQxIFsgCV0qaW5jICAgICVjeAotIDc0MzoJNjYgNDIgWyAJXSppbmMgICAgJWR4Ci0gNzQ1Ogk2NiA0MyBbIAldKmluYyAgICAlYngKLSA3NDc6CTY2IDQ0IFsgCV0qaW5jICAgICVzcAotIDc0OToJNjYgNDUgWyAJXSppbmMgICAgJWJwCi0gNzRiOgk2NiA0NiBbIAldKmluYyAgICAlc2kKLSA3NGQ6CTY2IDQ3IFsgCV0qaW5jICAgICVkaQotIDc0ZjoJNjYgNDggWyAJXSpkZWMgICAgJWF4Ci0gNzUxOgk2NiA0OSBbIAldKmRlYyAgICAlY3gKLSA3NTM6CTY2IDRhIFsgCV0qZGVjICAgICVkeAotIDc1NToJNjYgNGIgWyAJXSpkZWMgICAgJWJ4Ci0gNzU3Ogk2NiA0YyBbIAldKmRlYyAgICAlc3AKLSA3NTk6CTY2IDRkIFsgCV0qZGVjICAgICVicAotIDc1YjoJNjYgNGUgWyAJXSpkZWMgICAgJXNpCi0gNzVkOgk2NiA0ZiBbIAldKmRlYyAgICAlZGkKLSA3NWY6CTY2IDUwIFsgCV0qcHVzaCAgICVheAotIDc2MToJNjYgNTEgWyAJXSpwdXNoICAgJWN4Ci0gNzYzOgk2NiA1MiBbIAldKnB1c2ggICAlZHgKLSA3NjU6CTY2IDUzIFsgCV0qcHVzaCAgICVieAotIDc2NzoJNjYgNTQgWyAJXSpwdXNoICAgJXNwCi0gNzY5Ogk2NiA1NSBbIAldKnB1c2ggICAlYnAKLSA3NmI6CTY2IDU2IFsgCV0qcHVzaCAgICVzaQotIDc2ZDoJNjYgNTcgWyAJXSpwdXNoICAgJWRpCi0gNzZmOgk2NiA1OCBbIAldKnBvcCAgICAlYXgKLSA3NzE6CTY2IDU5IFsgCV0qcG9wICAgICVjeAotIDc3MzoJNjYgNWEgWyAJXSpwb3AgICAgJWR4Ci0gNzc1Ogk2NiA1YiBbIAldKnBvcCAgICAlYngKLSA3Nzc6CTY2IDVjIFsgCV0qcG9wICAgICVzcAotIDc3OToJNjYgNWQgWyAJXSpwb3AgICAgJWJwCi0gNzdiOgk2NiA1ZSBbIAldKnBvcCAgICAlc2kKLSA3N2Q6CTY2IDVmIFsgCV0qcG9wICAgICVkaQotIDc3ZjoJNjYgNjAgWyAJXSpwdXNoYXcgCi0gNzgxOgk2NiA2MSBbIAldKnBvcGF3ICAKLSA3ODM6CTY2IDYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYm91bmQgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3OGE6CTY2IDY4IDkwIDkwIFsgCV0qcHVzaHcgIFwkMHg5MDkwCi0gNzhlOgk2NiA2OSA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4OTA5MCwweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzk3Ogk2NiA2YSA5MCBbIAldKnB1c2h3ICBcJDB4ZmZmZmZmOTAKLSA3OWE6CTY2IDZiIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gN2EyOgk2NiA2ZCBbIAldKmluc3cgICBcKCVkeFwpLCVlczpcKCVlZGlcKQotIDdhNDoJNjYgNmYgWyAJXSpvdXRzdyAgJWRzOlwoJWVzaVwpLFwoJWR4XCkKLSA3YTY6CTY2IDgxIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjdyAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdhZjoJNjYgODMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGN3ICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdiNzoJNjYgODUgOTAgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdiZToJNjYgODcgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdjNToJNjYgODkgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdjYzoJNjYgOGIgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDdkMzoJNjYgOGMgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z3ICAgJXNzLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdkYToJNjYgOGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZWEgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDdlMToJNjYgOGYgODAgOTAgOTAgOTAgOTAgWyAJXSpwb3B3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gN2U4Ogk2NiA5MSBbIAldKnhjaGcgICAlYXgsJWN4Ci0gN2VhOgk2NiA5MiBbIAldKnhjaGcgICAlYXgsJWR4Ci0gN2VjOgk2NiA5MyBbIAldKnhjaGcgICAlYXgsJWJ4Ci0gN2VlOgk2NiA5NCBbIAldKnhjaGcgICAlYXgsJXNwCi0gN2YwOgk2NiA5NSBbIAldKnhjaGcgICAlYXgsJWJwCi0gN2YyOgk2NiA5NiBbIAldKnhjaGcgICAlYXgsJXNpCi0gN2Y0Ogk2NiA5NyBbIAldKnhjaGcgICAlYXgsJWRpCi0gN2Y2Ogk2NiA5OCBbIAldKmNidHcgICAKLSA3Zjg6CTY2IDk5IFsgCV0qY3d0ZCAgIAotIDdmYToJNjYgOWEgOTAgOTAgOTAgOTAgWyAJXSpsY2FsbHcgXCQweDkwOTAsXCQweDkwOTAKLSA4MDA6CTY2IDljIFsgCV0qcHVzaGZ3IAotIDgwMjoJNjYgOWQgWyAJXSpwb3BmdyAgCi0gODA0Ogk2NiBhMSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwLCVheAotIDgwYToJNjYgYTMgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWF4LDB4OTA5MDkwOTAKLSA4MTA6CTY2IGE1IFsgCV0qbW92c3cgICVkczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSA4MTI6CTY2IGE3IFsgCV0qY21wc3cgICVlczpcKCVlZGlcKSwlZHM6XCglZXNpXCkKLSA4MTQ6CTY2IGE5IDkwIDkwIFsgCV0qdGVzdCAgIFwkMHg5MDkwLCVheAotIDgxODoJNjYgYWIgWyAJXSpzdG9zICAgJWF4LCVlczpcKCVlZGlcKQotIDgxYToJNjYgYWQgWyAJXSpsb2RzICAgJWRzOlwoJWVzaVwpLCVheAotIDgxYzoJNjYgYWYgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVheAotIDgxZToJNjYgYjggOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWF4Ci0gODIyOgk2NiBiOSA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlY3gKLSA4MjY6CTY2IGJhIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVkeAotIDgyYToJNjYgYmIgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWJ4Ci0gODJlOgk2NiBiYyA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlc3AKLSA4MzI6CTY2IGJkIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVicAotIDgzNjoJNjYgYmUgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJXNpCi0gODNhOgk2NiBiZiA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlZGkKLSA4M2U6CTY2IGMxIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsdyAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA4NDY6CTY2IGMyIDkwIDkwIFsgCV0qcmV0dyAgIFwkMHg5MDkwCi0gODRhOgk2NiBjMyBbIAldKnJldHcgICAKLSA4NGM6CTY2IGM0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4NTM6CTY2IGM1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGRzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4NWE6CTY2IGM3IDgwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92dyAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDg2MzoJNjYgYzggOTAgOTAgOTAgWyAJXSplbnRlcncgXCQweDkwOTAsXCQweDkwCi0gODY4Ogk2NiBjOSBbIAldKmxlYXZldyAKLSA4NmE6CTY2IGNhIDkwIDkwIFsgCV0qbHJldHcgIFwkMHg5MDkwCi0gODZlOgk2NiBjYiBbIAldKmxyZXR3ICAKLSA4NzA6CTY2IGNmIFsgCV0qaXJldHcgIAotIDg3MjoJNjYgZDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2x3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gODc5Ogk2NiBkMyA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbHcgICAlY2wsMHg5MDkwOTA5MFwoJWVheFwpCi0gODgwOgk2NiBlNSA5MCBbIAldKmluICAgICBcJDB4OTAsJWF4Ci0gODgzOgk2NiBlNyA5MCBbIAldKm91dCAgICAlYXgsXCQweDkwCi0gODg2Ogk2NiBlOCA4ZiA5MCBbIAldKmNhbGx3ICAoMHgpPzk5MTkuKgotIDg4YToJNjYgZWEgOTAgOTAgOTAgOTAgWyAJXSpsam1wdyAgXCQweDkwOTAsXCQweDkwOTAKLSA4OTA6CTY2IGVkIFsgCV0qaW4gICAgIFwoJWR4XCksJWF4Ci0gODkyOgk2NiBlZiBbIAldKm91dCAgICAlYXgsXCglZHhcKQotIDg5NDoJNjYgZjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3R3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gODliOgk2NiBmZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNhbGx3ICBcKjB4OTA5MDkwOTBcKCVlYXhcKQotIDhhMjoJNjYgMGYgMDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsYXIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhhYToJNjYgMGYgMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc2wgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhiMjoJNjYgMGYgNDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92byAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhiYToJNjYgMGYgNDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bm8gMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhjMjoJNjYgMGYgNDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YiAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhjYToJNjYgMGYgNDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YWUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhkMjoJNjYgMGYgNDQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZSAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhkYToJNjYgMGYgNDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bmUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhlMjoJNjYgMGYgNDYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YmUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhlYToJNjYgMGYgNDcgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YSAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhmMjoJNjYgMGYgNDggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cyAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhmYToJNjYgMGYgNDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnMgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkwMjoJNjYgMGYgNGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cCAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkwYToJNjYgMGYgNGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkxMjoJNjYgMGYgNGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bCAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkxYToJNjYgMGYgNGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92Z2UgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkyMjoJNjYgMGYgNGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bGUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkyYToJNjYgMGYgNGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZyAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkzMjoJNjYgMGYgYTAgWyAJXSpwdXNodyAgJWZzCi0gOTM1Ogk2NiAwZiBhMSBbIAldKnBvcHcgICAlZnMKLSA5Mzg6CTY2IDBmIGEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnQgICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NDA6CTY2IDBmIGE0IDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgIFwkMHg5MCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTQ5Ogk2NiAwZiBhNSA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICAlY2wsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk1MToJNjYgMGYgYTggWyAJXSpwdXNodyAgJWdzCi0gOTU0Ogk2NiAwZiBhOSBbIAldKnBvcHcgICAlZ3MKLSA5NTc6CTY2IDBmIGFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRzICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NWY6CTY2IDBmIGFjIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgIFwkMHg5MCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTY4Ogk2NiAwZiBhZCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICAlY2wsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk3MDoJNjYgMGYgYWYgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDk3ODoJNjYgMGYgYjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5ODA6CTY2IDBmIGIyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5ODg6CTY2IDBmIGIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRyICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5OTA6CTY2IDBmIGI0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGZzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5OTg6CTY2IDBmIGI1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGdzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YTA6CTY2IDBmIGI2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92emJ3IDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YTg6CTY2IDBmIGJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRjICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5YjA6CTY2IDBmIGJjIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNmICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5Yjg6CTY2IDBmIGJkIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YzA6CTY2IDBmIGJlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c2J3IDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5Yzg6CTY2IDBmIGMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeGFkZCAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM1OTY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotLnRleHQKLWZvbzoKLSBhZGQgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBhZGQgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGFkZCAgICAkMHg5MCwlYWwKLSBhZGQgICAgJDB4OTA5MDkwOTAsJWVheAotIHB1c2ggICAlZXMKLSBwb3AgICAgJWVzCi0gb3IgICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gb3IgICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBvciAgICAgJDB4OTAsJWFsCi0gb3IgICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJWNzCi0gYWRjICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBhZGMgICAgJDB4OTAsJWFsCi0gYWRjICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJXNzCi0gcG9wICAgICVzcwotIHNiYiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHNiYiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gc2JiICAgICQweDkwLCVhbAotIHNiYiAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gcHVzaCAgICVkcwotIHBvcCAgICAlZHMKLSBhbmQgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBhbmQgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGFuZCAgICAkMHg5MCwlYWwKLSBhbmQgICAgJDB4OTA5MDkwOTAsJWVheAotIGRhYQotIHN1YiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHN1YiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gc3ViICAgICQweDkwLCVhbAotIHN1YiAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gZGFzCi0geG9yICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0geG9yICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSB4b3IgICAgJDB4OTAsJWFsCi0geG9yICAgICQweDkwOTA5MDkwLCVlYXgKLSBhYWEKLSBjbXAgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBjbXAgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtcCAgICAkMHg5MCwlYWwKLSBjbXAgICAgJDB4OTA5MDkwOTAsJWVheAotIGFhcwotIGluYyAgICAlZWF4Ci0gaW5jICAgICVlY3gKLSBpbmMgICAgJWVkeAotIGluYyAgICAlZWJ4Ci0gaW5jICAgICVlc3AKLSBpbmMgICAgJWVicAotIGluYyAgICAlZXNpCi0gaW5jICAgICVlZGkKLSBkZWMgICAgJWVheAotIGRlYyAgICAlZWN4Ci0gZGVjICAgICVlZHgKLSBkZWMgICAgJWVieAotIGRlYyAgICAlZXNwCi0gZGVjICAgICVlYnAKLSBkZWMgICAgJWVzaQotIGRlYyAgICAlZWRpCi0gcHVzaCAgICVlYXgKLSBwdXNoICAgJWVjeAotIHB1c2ggICAlZWR4Ci0gcHVzaCAgICVlYngKLSBwdXNoICAgJWVzcAotIHB1c2ggICAlZWJwCi0gcHVzaCAgICVlc2kKLSBwdXNoICAgJWVkaQotIHBvcCAgICAlZWF4Ci0gcG9wICAgICVlY3gKLSBwb3AgICAgJWVkeAotIHBvcCAgICAlZWJ4Ci0gcG9wICAgICVlc3AKLSBwb3AgICAgJWVicAotIHBvcCAgICAlZXNpCi0gcG9wICAgICVlZGkKLSBwdXNoYQotIHBvcGEKLSBib3VuZCAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYXJwbCAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gcHVzaCAgICQweDkwOTA5MDkwCi0gaW11bCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHB1c2ggICAkMHhmZmZmZmY5MAotIGltdWwgICAkMHhmZmZmZmY5MCwweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBpbnNiICAgKCVkeCksJWVzOiglZWRpKQotIGluc2wgICAoJWR4KSwlZXM6KCVlZGkpCi0gb3V0c2IgICVkczooJWVzaSksKCVkeCkKLSBvdXRzbCAgJWRzOiglZXNpKSwoJWR4KQotIGpvICAgICAuKzItMHg3MAotIGpubyAgICAuKzItMHg3MAotIGpiICAgICAuKzItMHg3MAotIGphZSAgICAuKzItMHg3MAotIGplICAgICAuKzItMHg3MAotIGpuZSAgICAuKzItMHg3MAotIGpiZSAgICAuKzItMHg3MAotIGphICAgICAuKzItMHg3MAotIGpzICAgICAuKzItMHg3MAotIGpucyAgICAuKzItMHg3MAotIGpwICAgICAuKzItMHg3MAotIGpucCAgICAuKzItMHg3MAotIGpsICAgICAuKzItMHg3MAotIGpnZSAgICAuKzItMHg3MAotIGpsZSAgICAuKzItMHg3MAotIGpnICAgICAuKzItMHg3MAotIGFkY2IgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjbCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCkKLSBhZGNsICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZsICAgJXNzLDB4OTA5MDkwOTAoJWVheCkKLSBsZWEgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92bCAgIDB4OTA5MDkwOTAoJWVheCksJXNzCi0gcG9wbCAgIDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWVheCwlZWF4Ci0geGNoZyAgICVlYXgsJWVjeAotIHhjaGcgICAlZWF4LCVlZHgKLSB4Y2hnICAgJWVheCwlZWJ4Ci0geGNoZyAgICVlYXgsJWVzcAotIHhjaGcgICAlZWF4LCVlYnAKLSB4Y2hnICAgJWVheCwlZXNpCi0geGNoZyAgICVlYXgsJWVkaQotIGN3dGwKLSBjbHRkCi0gbGNhbGwgICQweDkwOTAsJDB4OTA5MDkwOTAKLSBmd2FpdAotIHB1c2hmCi0gcG9wZgotIHNhaGYKLSBsYWhmCi0gbW92ICAgIDB4OTA5MDkwOTAsJWFsCi0gbW92ICAgIDB4OTA5MDkwOTAsJWVheAotIG1vdiAgICAlYWwsMHg5MDkwOTA5MAotIG1vdiAgICAlZWF4LDB4OTA5MDkwOTAKLSBtb3ZzYiAgJWRzOiglZXNpKSwlZXM6KCVlZGkpCi0gbW92c2wgICVkczooJWVzaSksJWVzOiglZWRpKQotIGNtcHNiICAlZXM6KCVlZGkpLCVkczooJWVzaSkKLSBjbXBzbCAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCi0gdGVzdCAgICQweDkwLCVhbAotIHRlc3QgICAkMHg5MDkwOTA5MCwlZWF4Ci0gc3RvcyAgICVhbCwlZXM6KCVlZGkpCi0gc3RvcyAgICVlYXgsJWVzOiglZWRpKQotIGxvZHMgICAlZHM6KCVlc2kpLCVhbAotIGxvZHMgICAlZHM6KCVlc2kpLCVlYXgKLSBzY2FzICAgJWVzOiglZWRpKSwlYWwKLSBzY2FzICAgJWVzOiglZWRpKSwlZWF4Ci0gbW92ICAgICQweDkwLCVhbAotIG1vdiAgICAkMHg5MCwlY2wKLSBtb3YgICAgJDB4OTAsJWRsCi0gbW92ICAgICQweDkwLCVibAotIG1vdiAgICAkMHg5MCwlYWgKLSBtb3YgICAgJDB4OTAsJWNoCi0gbW92ICAgICQweDkwLCVkaAotIG1vdiAgICAkMHg5MCwlYmgKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVheAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWN4Ci0gbW92ICAgICQweDkwOTA5MDkwLCVlZHgKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVieAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZXNwCi0gbW92ICAgICQweDkwOTA5MDkwLCVlYnAKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVzaQotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWRpCi0gcmNsYiAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSByY2xsICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIHJldCAgICAkMHg5MDkwCi0gcmV0Ci0gbGVzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGxkcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZiICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIG1vdmwgICAkMHg5MDkwOTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gZW50ZXIgICQweDkwOTAsJDB4OTAKLSBsZWF2ZQotIGxyZXQgICAkMHg5MDkwCi0gbHJldAotIGludDMKLSBpbnQgICAgJDB4OTAKLSBpbnRvCi0gaXJldAotIHJjbGIgICAweDkwOTA5MDkwKCVlYXgpCi0gcmNsbCAgIDB4OTA5MDkwOTAoJWVheCkKLSByY2xiICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKLSByY2xsICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKLSBhYW0gICAgJDB4ZmZmZmZmOTAKLSBhYWQgICAgJDB4ZmZmZmZmOTAKLSB4bGF0ICAgJWRzOiglZWJ4KQotIGZjb21zICAweDkwOTA5MDkwKCVlYXgpCi0gZnN0cyAgIDB4OTA5MDkwOTAoJWVheCkKLSBmaWNvbWwgMHg5MDkwOTA5MCglZWF4KQotIGZpc3RsICAweDkwOTA5MDkwKCVlYXgpCi0gZmNvbWwgIDB4OTA5MDkwOTAoJWVheCkKLSBmc3RsICAgMHg5MDkwOTA5MCglZWF4KQotIGZpY29tICAweDkwOTA5MDkwKCVlYXgpCi0gZmlzdCAgIDB4OTA5MDkwOTAoJWVheCkKLSBsb29wbmUgLisyLTB4NzAKLSBsb29wZSAgLisyLTB4NzAKLSBsb29wICAgLisyLTB4NzAKLSBqZWN4eiAgLisyLTB4NzAKLSBpbiAgICAgJDB4OTAsJWFsCi0gaW4gICAgICQweDkwLCVlYXgKLSBvdXQgICAgJWFsLCQweDkwCi0gb3V0ICAgICVlYXgsJDB4OTAKLSBjYWxsICAgLis1KzB4OTA5MDkwOTAKLSBqbXAgICAgLis1KzB4OTA5MDkwOTAKLSBsam1wICAgJDB4OTA5MCwkMHg5MDkwOTA5MAotIGptcCAgICAuKzItMHg3MAotIGluICAgICAoJWR4KSwlYWwKLSBpbiAgICAgKCVkeCksJWVheAotIG91dCAgICAlYWwsKCVkeCkKLSBvdXQgICAgJWVheCwoJWR4KQotIGhsdAotIGNtYwotIG5vdGIgICAweDkwOTA5MDkwKCVlYXgpCi0gbm90bCAgIDB4OTA5MDkwOTAoJWVheCkKLSBjbGMKLSBzdGMKLSBjbGkKLSBzdGkKLSBjbGQKLSBzdGQKLSBjYWxsICAgKjB4OTA5MDkwOTAoJWVheCkKLSBsbGR0ICAgMHg5MDkwOTA5MCglZWF4KQotIGxnZHQgICAweDkwOTA5MDkwKCVlYXgpCi0gbGFyICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGxzbCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbHRzCi0gaW52ZAotIHdiaW52ZAotIHVkMmEKLSBtb3YgICAgJWNyMiwlZWF4Ci0gbW92ICAgICVkYjIsJWVheAotIG1vdiAgICAlZWF4LCVjcjIKLSBtb3YgICAgJWVheCwlZGIyCi0gbW92ICAgICV0cjIsJWVheAotIG1vdiAgICAlZWF4LCV0cjIKLSB3cm1zcgotIHJkdHNjCi0gcmRtc3IKLSByZHBtYwotIGNtb3ZvICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bm8gMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmIgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZhZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92ZSAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5lIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZiZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92YSAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdnMgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZucyAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92cCAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5wIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZsICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92Z2UgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmxlIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZnICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBwdW5wY2tsYncgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNrbHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2xkcSAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrc3N3YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZ3RiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBndHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGd0ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrdXN3YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2toYncgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNraHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2hkcSAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrc3NkdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBtb3ZkICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gbW92cSAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmx3ICAkMHg5MCwlbW0wCi0gcHNybGQgICQweDkwLCVtbTAKLSBwc3JscSAgJDB4OTAsJW1tMAotIHBjbXBlcWIgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGVxdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZXFkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIGVtbXMKLSBtb3ZkICAgJW1tMiwweDkwOTA5MDkwKCVlYXgpCi0gbW92cSAgICVtbTIsMHg5MDkwOTA5MCglZWF4KQotIGpvICAgICAuKzYrMHg5MDkwOTA5MAotIGpubyAgICAuKzYrMHg5MDkwOTA5MAotIGpiICAgICAuKzYrMHg5MDkwOTA5MAotIGphZSAgICAuKzYrMHg5MDkwOTA5MAotIGplICAgICAuKzYrMHg5MDkwOTA5MAotIGpuZSAgICAuKzYrMHg5MDkwOTA5MAotIGpiZSAgICAuKzYrMHg5MDkwOTA5MAotIGphICAgICAuKzYrMHg5MDkwOTA5MAotIGpzICAgICAuKzYrMHg5MDkwOTA5MAotIGpucyAgICAuKzYrMHg5MDkwOTA5MAotIGpwICAgICAuKzYrMHg5MDkwOTA5MAotIGpucCAgICAuKzYrMHg5MDkwOTA5MAotIGpsICAgICAuKzYrMHg5MDkwOTA5MAotIGpnZSAgICAuKzYrMHg5MDkwOTA5MAotIGpsZSAgICAuKzYrMHg5MDkwOTA5MAotIGpnICAgICAuKzYrMHg5MDkwOTA5MAotIHNldG8gICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bm8gIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRiICAgMHg5MDkwOTA5MCglZWF4KQotIHNldGFlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0ZSAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRuZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGJlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0YSAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRzICAgMHg5MDkwOTA5MCglZWF4KQotIHNldG5zICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0cCAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRucCAgMHg5MDkwOTA5MCglZWF4KQotIHNldGwgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0Z2UgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRsZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGcgICAweDkwOTA5MDkwKCVlYXgpCi0gcHVzaCAgICVmcwotIHBvcCAgICAlZnMKLSBjcHVpZAotIGJ0ICAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaGxkICAgJDB4OTAsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICVjbCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNoICAgJWdzCi0gcG9wICAgICVncwotIHJzbQotIGJ0cyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaHJkICAgJDB4OTAsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICVjbCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBpbXVsICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21weGNoZyAlZGwsMHg5MDkwOTA5MCglZWF4KQotIGNtcHhjaGcgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbHNzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGJ0ciAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsZnMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbGdzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdnpibCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3Z6d2wgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gdWQyYgotIGJ0YyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBic2YgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gYnNyICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdnNibCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3Zzd2wgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0geGFkZCAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0geGFkZCAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGJzd2FwICAlZWF4Ci0gYnN3YXAgICVlY3gKLSBic3dhcCAgJWVkeAotIGJzd2FwICAlZWJ4Ci0gYnN3YXAgICVlc3AKLSBic3dhcCAgJWVicAotIGJzd2FwICAlZXNpCi0gYnN3YXAgICVlZGkKLSBwc3JsdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNybGQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmxxICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwbXVsbHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YnVzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3VidXN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhbmQgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkdXNiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGR1c3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFuZG4gIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmF3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JhZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG11bGh3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3Vic3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG9yICAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGRzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkc3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHhvciAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzbGx3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc2xsZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNsbHEgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBtYWRkd2QgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YmIgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJ3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3ViZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZGIgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGR3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gYWRkICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYWRkICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVlcwotIHBvcHcgICAlZXMKLSBvciAgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBvciAgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBvciAgICAgJDB4OTA5MCwlYXgKLSBwdXNodyAgJWNzCi0gYWRjICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYWRjICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVzcwotIHBvcHcgICAlc3MKLSBzYmIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBzYmIgICAgJDB4OTA5MCwlYXgKLSBwdXNodyAgJWRzCi0gcG9wdyAgICVkcwotIGFuZCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFuZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGFuZCAgICAkMHg5MDkwLCVheAotIHN1YiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHN1YiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHN1YiAgICAkMHg5MDkwLCVheAotIHhvciAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHhvciAgICAkMHg5MDkwLCVheAotIGNtcCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGNtcCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtcCAgICAkMHg5MDkwLCVheAotIGluYyAgICAlYXgKLSBpbmMgICAgJWN4Ci0gaW5jICAgICVkeAotIGluYyAgICAlYngKLSBpbmMgICAgJXNwCi0gaW5jICAgICVicAotIGluYyAgICAlc2kKLSBpbmMgICAgJWRpCi0gZGVjICAgICVheAotIGRlYyAgICAlY3gKLSBkZWMgICAgJWR4Ci0gZGVjICAgICVieAotIGRlYyAgICAlc3AKLSBkZWMgICAgJWJwCi0gZGVjICAgICVzaQotIGRlYyAgICAlZGkKLSBwdXNoICAgJWF4Ci0gcHVzaCAgICVjeAotIHB1c2ggICAlZHgKLSBwdXNoICAgJWJ4Ci0gcHVzaCAgICVzcAotIHB1c2ggICAlYnAKLSBwdXNoICAgJXNpCi0gcHVzaCAgICVkaQotIHBvcCAgICAlYXgKLSBwb3AgICAgJWN4Ci0gcG9wICAgICVkeAotIHBvcCAgICAlYngKLSBwb3AgICAgJXNwCi0gcG9wICAgICVicAotIHBvcCAgICAlc2kKLSBwb3AgICAgJWRpCi0gcHVzaGF3Ci0gcG9wYXcKLSBib3VuZCAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNodyAgJDB4OTA5MAotIGltdWwgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gcHVzaHcgICQweGZmZmZmZjkwCi0gaW11bCAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gaW5zdyAgICglZHgpLCVlczooJWVkaSkKLSBvdXRzdyAgJWRzOiglZXNpKSwoJWR4KQotIGFkY3cgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCkKLSBhZGN3ICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhjaGcgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIG1vdncgICAlc3MsMHg5MDkwOTA5MCglZWF4KQotIGxlYSAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHBvcHcgICAweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVheCwlY3gKLSB4Y2hnICAgJWF4LCVkeAotIHhjaGcgICAlYXgsJWJ4Ci0geGNoZyAgICVheCwlc3AKLSB4Y2hnICAgJWF4LCVicAotIHhjaGcgICAlYXgsJXNpCi0geGNoZyAgICVheCwlZGkKLSBjYnR3Ci0gY3d0ZAotIGxjYWxsdyAkMHg5MDkwLCQweDkwOTAKLSBwdXNoZncKLSBwb3BmdwotIG1vdiAgICAweDkwOTA5MDkwLCVheAotIG1vdiAgICAlYXgsMHg5MDkwOTA5MAotIG1vdnN3ICAlZHM6KCVlc2kpLCVlczooJWVkaSkKLSBjbXBzdyAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCi0gdGVzdCAgICQweDkwOTAsJWF4Ci0gc3RvcyAgICVheCwlZXM6KCVlZGkpCi0gbG9kcyAgICVkczooJWVzaSksJWF4Ci0gc2NhcyAgICVlczooJWVkaSksJWF4Ci0gbW92ICAgICQweDkwOTAsJWF4Ci0gbW92ICAgICQweDkwOTAsJWN4Ci0gbW92ICAgICQweDkwOTAsJWR4Ci0gbW92ICAgICQweDkwOTAsJWJ4Ci0gbW92ICAgICQweDkwOTAsJXNwCi0gbW92ICAgICQweDkwOTAsJWJwCi0gbW92ICAgICQweDkwOTAsJXNpCi0gbW92ICAgICQweDkwOTAsJWRpCi0gcmNsdyAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSByZXR3ICAgJDB4OTA5MAotIHJldHcKLSBsZXMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBsZHMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3Z3ICAgJDB4OTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gZW50ZXJ3ICQweDkwOTAsJDB4OTAKLSBsZWF2ZXcKLSBscmV0dyAgJDB4OTA5MAotIGxyZXR3Ci0gaXJldHcKLSByY2x3ICAgMHg5MDkwOTA5MCglZWF4KQotIHJjbHcgICAlY2wsMHg5MDkwOTA5MCglZWF4KQotIGluICAgICAkMHg5MCwlYXgKLSBvdXQgICAgJWF4LCQweDkwCi0gY2FsbHcgIC4rMysweDkwOTAKLSBsam1wdyAgJDB4OTA5MCwkMHg5MDkwCi0gaW4gICAgICglZHgpLCVheAotIG91dCAgICAlYXgsKCVkeCkKLSBub3R3ICAgMHg5MDkwOTA5MCglZWF4KQotIGNhbGx3ICAqMHg5MDkwOTA5MCglZWF4KQotIGxhciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGxzbCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZvICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZubyAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZiICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZhZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZlICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZuZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZiZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZhICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZzICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZucyAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZwICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZucCAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZsICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZnZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZsZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZnICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHB1c2h3ICAlZnMKLSBwb3B3ICAgJWZzCi0gYnQgICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICQweDkwLCVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICVjbCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIHB1c2h3ICAlZ3MKLSBwb3B3ICAgJWdzCi0gYnRzICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICQweDkwLCVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICVjbCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIGltdWwgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtcHhjaGcgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsc3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBidHIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsZnMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBsZ3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3Z6YncgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBidGMgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBic2YgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBic3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3ZzYncgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSB4YWRkICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRiNjU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBwcmVmaXgKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTliIDY3IDI2IGQ5IDNjIFsgCV0qYWRkcjE2IGZzdGN3ICVlczpcKCVzaVwpCi0gICA1Ogk5YiBkZiBlMCBbIAldKmZzdHN3ICAlYXgKLSAgIDg6CTliIGRmIGUwIFsgCV0qZnN0c3cgICVheAotICAgYjoJOWIgZGYgZTAgWyAJXSpmc3RzdyAgJWF4Ci0gICBlOgk5YiA2NyBkZiBlMCBbIAldKmFkZHIxNiBmc3RzdyAlYXgKLSAgMTI6CWYzIDY3IDY2IDM2IGE3IFsgCV0qcmVweiBhZGRyMTYgY21wc3cgJWVzOlwoJWRpXCksJXNzOlwoJXNpXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjVkZmZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0udGV4dAotZm9vOgotIGFkZHIxNiBmc3RjdyAlZXM6KCVzaSkKLSBmc3RzdwotIGZzdHN3ICVheAotIGZzdHN3ICVlYXgKLSBhZGRyMTYgZnN0c3cgJWF4Ci0gYWRkcjE2IHJlcCBjbXBzdyAlZXM6KCVkaSksJXNzOiglc2kpCi0KLSMgR2V0IGEgZ29vZCBhbGlnbm1lbnQuCi0gLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTVlZWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcncKLSNuYW1lOiBpMzg2IHJlbG9jCi0KLS4qOiArZmlsZSBmb3JtYXQgLippMzg2LioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPGZvbz46Ci0gICAwOgliMyAwMCBbIAldKm1vdiAgICBcJDB4MCwlYmwJMTogKFJfMzg2Xyk/OAkudGV4dAotICAgMjoJNjggMDAgMDAgMDAgMDAgWyAJXSpwdXNoICAgXCQweDAJMzogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgIDc6CTA1IDAwIDAwIDAwIDAwIFsgCV0qYWRkICAgIFwkMHgwLCVlYXgJODogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgIGM6CTgxIGMzIDAwIDAwIDAwIDAwIFsgCV0qYWRkICAgIFwkMHgwLCVlYngJZTogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgMTI6CTY5IGQyIDAwIDAwIDAwIDAwIFsgCV0qaW11bCAgIFwkMHgwLCVlZHgsJWVkeAkxNDogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgMTg6CTlhIDAwIDAwIDAwIDAwIDAwIDAwIFsgCV0qbGNhbGwgIFwkMHgwLFwkMHgwCTE5OiAoUl8zODZfKT8oZGlyKT8zMgkudGV4dAotICAxZjoJNjYgNjggMDAgMDAgWyAJXSpwdXNodyAgXCQweDAJMjE6IChSXzM4Nl8pPzE2CS50ZXh0Ci0gIDIzOgk5MCBbIAldKm5vcCAgICAKLSAgMjQ6CTkwIFsgCV0qbm9wICAgIAotICAyNToJOTAgWyAJXSpub3AgICAgCi0gIDI2Ogk5MCBbIAldKm5vcCAgICAKLSAgMjc6CTkwIFsgCV0qbm9wICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmY5NWI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS50ZXh0Ci1mb286CW1vdgkkZm9vLCAlYmwKLQlwdXNoCSRmb28KLQlhZGQJJGZvbywgJWVheAotCWFkZAkkZm9vLCAlZWJ4Ci0JaW11bAkkZm9vLCAlZWR4Ci0JbGNhbGwJJDAsICRmb28KLQlwdXNodwkkZm9vCi0KLSMgUGFkIG91dCB0byBhIGdvb2QgYWxpZ25tZW50Ci0gLmJ5dGUgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDkxNTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJIyB0ZXN0IGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UsIGFuZCB1cHBlci1jYXNlCi0gICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLlRlWHQgCi0gICAzIDAwMDAgMzYgICAgICAgICAgICAgICAgICAgICAgICAgCQlzcyAKLSAgIDQgMDAwMSA4ODAzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdiAlIGFsICwgXCggJSBlYnggXCkgCi0gICA1IDAwMDMgQzcwNUQ3MTEgMDAwMDdCMDAgMDAwMCAgICAgCSAgICAgICAgbU92bCBcJCAxMjMgLCA0NTY3IAotICAgNiAwMDBkIDY3OEE3ODdCICAgICAgICAgICAgICAgICAgIAkgQUREcjE2CW1vdiAxMjMgXCggJSBieCAsICUgc2kgLCAxIFwpICwgJSBiaCAKLSAgIDcgMDAxMSBGRkUwICAgICAgICAgICAgICAgICAgICAgICAJCWptcCBcKiAlIGVheCAKLSAgIDggMDAxMyA2NjI2RkYyMyAgICAgICAgICAgICAgICAgICAJZm9vOglqbXB3ICUgZXMgOiBcKiBcKCAlIGVieCBcKQkKLSAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgCi0gIDEwIDAwMTcgQTA1MDAwMDAgMDAgICAgICAgICAgICAgICAgCQltb3YgXCggMHg4IFwqIDBYYSBcKSAsICUgYWwgCi0gIDExIDAwMWMgQjAyMCAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgXCggOCBcKiA0IFwpICwgJSBhbCAKLSAgMTIgMDAxZSBCNzEzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdiBcJCBmb28gLCAlIGJIIAotICAxMyAwMDIwIEI3MTMgICAgICAgICAgICAgICAgICAgICAgIAkJbW92YiBcJCBmb28gLCAlIEJIIAotICAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkKLSAgMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkuQ09ERTE2CQotICAxNiAwMDIyIDY2QjgxMzAwIDAwMDAgICAgICAgICAgICAgIAkJTW92IFwkIGZvbyAsICVlQXgJCi0gIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLkNvZGUzMiAKLSAgMTggMDAyOCA2NkI4MTMwMCAgICAgICAgICAgICAgICAgICAJCW1vdiBcJCBmb28gLCAlYXgJCi0gIDE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDIwIDAwMmMgRDlDOSAgICAgICAgICAgICAgICAgICAgICAgCQlmeGNoICAgJXN0ICBcKCAgMSAgXCkgCi0gIDIxIDAwMmUgRDlDOSAgICAgICAgICAgICAgICAgICAgICAgCQlmeGNoICAgJSAgICAgICAgICAgc3RcKDFcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWVjY2ZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgdGVzdCBoYW5kbGluZyBvZiB3aGl0ZXNwYWNlLCBhbmQgdXBwZXItY2FzZQotLlRlWHQgCi0Jc3MgCi0JbW92ICUgYWwgLCAoICUgZWJ4ICkgCi0gICAgICAgIG1PdmwgJCAxMjMgLCA0NTY3IAotIEFERHIxNgltb3YgMTIzICggJSBieCAsICUgc2kgLCAxICkgLCAlIGJoIAotCWptcCAqICUgZWF4IAotZm9vOglqbXB3ICUgZXMgOiAqICggJSBlYnggKQkKLSAKLQltb3YgKCAweDggKiAwWGEgKSAsICUgYWwgCi0JbW92ICQgKCA4ICogNCApICwgJSBhbCAKLQltb3YgJCBmb28gLCAlIGJIIAotCW1vdmIgJCBmb28gLCAlIEJIIAotCQotLkNPREUxNgkKLQlNb3YgJCBmb28gLCAlZUF4CQotLkNvZGUzMiAKLQltb3YgJCBmb28gLCAlYXgJCi0KLQlmeGNoICAgJXN0ICAoICAxICApIAotCWZ4Y2ggICAlICAgICAgICAgICBzdCgxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4OGQyYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgUmVwb3J0ZWQgOTMvMDUvMDkgYnkgSmltIFdpbHNvbjogSUVFRSBzaW5nbGUtcHJlY2lzaW9uIEZMVF9NSU4gdmFsdWUgZ2V0cwotIyBhc3NlbWJsZWQgaW5jb3JyZWN0bHkuICAoT2ZmIGJ5IG9uZSB1bHAuKQotCi1wcm9jIGRvdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJJRUVFIEZMVF9NSU4sIHNpbmdsZS1wcmVjaXNpb24iCi0gICAgc2V0IHggMAotICAgIGdhc19zdGFydCAieDkzMDUwOWEucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiAwMDAwODAwMFxbIAlcXSsuc2luZ2xlIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICIgMDA4MDAwMDBcWyAJXF0rLnNpbmdsZSIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiIDAwODAgMDAwMFxbIAlcXSsuc2luZ2xlIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICIgLi4uLi4uLi4gKy5zaW5nbGUiIHsgZmFpbCAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iIHsgfQotCSAgICB0aW1lb3V0IHsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZiB7IGJyZWFrIH0KLQl9Ci0gICAgfQotICAgIGdhc19maW5pc2gKLSAgICBpZiAhJHggdGhlbiB7IGZhaWwgIiR0ZXN0bmFtZSAobGlzdGluZyBkaWRuJ3QgbWF0Y2gpIiB9Ci19Ci0KLWlmICFbaXN0YXJnZXQgdmF4Ki0qLSpdIHRoZW4gewotICAgIGRvdGVzdAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjFiMzM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotICAgICAgICAuZ2xvYmFsIF9mbHRfbWluCi0JLmRhdGEKLSAgICAgICAgLmFsaWduIDQKLV9mbHRfbWluOgotICAgICAgICAuc2luZ2xlIDByMS4xNzU0OTQzNWUtMzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTY1ZTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGFsbGluc24KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPGFkZD46Ci0gICAwOgkwZCBhZCBmMCAwMCAJYWRkIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAwNCA8YWRkMz46Ci0gICA0Ogk4ZCBhZCAwMCAwMCAJYWRkMyBmcCxmcCxbI10qMAotCi0wKzAwMDggPGFuZD46Ci0gICA4OgkwZCBjZCBmMCAwMCAJYW5kIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAwYyA8YW5kMz46Ci0gICBjOgk4ZCBjZCAwMCAwMCAJYW5kMyBmcCxmcCxbI10qMHgwCi0KLTArMDAxMCA8b3I+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+OgotIDFlNDoJMmQgZWYgZjAgMDAgCXBvcCBmcCBcfFx8IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZGRkMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBNMzJSIGFzc2VtYmxlciB0ZXN0c3VpdGUuCi0KLWlmIFtpc3RhcmdldCBtMzJyKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhbGxpbnNuIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiNDU2OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24ucworKysgL2Rldi9udWxsCkBAIC0xLDUwMSArMCwwIEBACi0gLmRhdGEKLWZvb2RhdGE6IC53b3JkIDQyCi0gLnRleHQKLWZvb3RleHQ6Ci0JLnRleHQKLQkuZ2xvYmFsIGFkZAotYWRkOgotCWFkZCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBhZGQzCi1hZGQzOgotCWFkZDMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgYW5kCi1hbmQ6Ci0JYW5kIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGFuZDMKLWFuZDM6Ci0JYW5kMyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBvcgotb3I6Ci0Jb3IgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgb3IzCi1vcjM6Ci0Jb3IzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIHhvcgoteG9yOgotCXhvciBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCB4b3IzCi14b3IzOgotCXhvcjMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgYWRkaQotYWRkaToKLQlhZGRpIGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHYKLWFkZHY6Ci0JYWRkdiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBhZGR2MwotYWRkdjM6Ci0JYWRkdjMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgYWRkeAotYWRkeDoKLQlhZGR4IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGJjOAotYmM4OgotCWJjIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmM4X3MKLWJjOF9zOgotCWJjLnMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiYzI0Ci1iYzI0OgotCWJjIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmMyNF9sCi1iYzI0X2w6Ci0JYmMubCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJlcQotYmVxOgotCWJlcSBmcCxmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJlcXoKLWJlcXo6Ci0JYmVxeiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJnZXoKLWJnZXo6Ci0JYmdleiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJndHoKLWJndHo6Ci0JYmd0eiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsZXoKLWJsZXo6Ci0JYmxleiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsdHoKLWJsdHo6Ci0JYmx0eiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuZXoKLWJuZXo6Ci0JYm5leiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsOAotYmw4OgotCWJsIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmw4X3MKLWJsOF9zOgotCWJsLnMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibDI0Ci1ibDI0OgotCWJsIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmwyNF9sCi1ibDI0X2w6Ci0JYmwubCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuYzgKLWJuYzg6Ci0JYm5jIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5jOF9zCi1ibmM4X3M6Ci0JYm5jLnMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmMyNAotYm5jMjQ6Ci0JYm5jIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5jMjRfbAotYm5jMjRfbDoKLQlibmMubCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuZQotYm5lOgotCWJuZSBmcCxmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJyYTgKLWJyYTg6Ci0JYnJhIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYnJhOF9zCi1icmE4X3M6Ci0JYnJhLnMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBicmEyNAotYnJhMjQ6Ci0JYnJhIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYnJhMjRfbAotYnJhMjRfbDoKLQlicmEubCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGNtcAotY21wOgotCWNtcCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBjbXBpCi1jbXBpOgotCWNtcGkgZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgY21wdQotY21wdToKLQljbXB1IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGNtcHVpCi1jbXB1aToKLQljbXB1aSBmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBkaXYKLWRpdjoKLQlkaXYgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgZGl2dQotZGl2dToKLQlkaXZ1IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHJlbQotcmVtOgotCXJlbSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCByZW11Ci1yZW11OgotCXJlbXUgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgamwKLWpsOgotCWpsIGZwCi0JLnRleHQKLQkuZ2xvYmFsIGptcAotam1wOgotCWptcCBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZAotbGQ6Ci0JbGQgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkXzIKLWxkXzI6Ci0JbGQgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRfZAotbGRfZDoKLQlsZCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkX2QyCi1sZF9kMjoKLQlsZCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkYgotbGRiOgotCWxkYiBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGRiXzIKLWxkYl8yOgotCWxkYiBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGJfZAotbGRiX2Q6Ci0JbGRiIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRiX2QyCi1sZGJfZDI6Ci0JbGRiIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGRoCi1sZGg6Ci0JbGRoIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZGhfMgotbGRoXzI6Ci0JbGRoIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkaF9kCi1sZGhfZDoKLQlsZGggZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGhfZDIKLWxkaF9kMjoKLQlsZGggZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHViCi1sZHViOgotCWxkdWIgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWJfMgotbGR1Yl8yOgotCWxkdWIgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGR1Yl9kCi1sZHViX2Q6Ci0JbGR1YiBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWJfZDIKLWxkdWJfZDI6Ci0JbGR1YiBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWgKLWxkdWg6Ci0JbGR1aCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGR1aF8yCi1sZHVoXzI6Ci0JbGR1aCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoX2QKLWxkdWhfZDoKLQlsZHVoIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGR1aF9kMgotbGR1aF9kMjoKLQlsZHVoIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGRfcGx1cwotbGRfcGx1czoKLQlsZCBmcCxAZnArCi0JLnRleHQKLQkuZ2xvYmFsIGxkMjQKLWxkMjQ6Ci0JbGQyNCBmcCxmb29kYXRhCi0JLnRleHQKLQkuZ2xvYmFsIGxkaTgKLWxkaTg6Ci0JbGRpIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgbGRpMTYKLWxkaTE2OgotCWxkaSBmcCwyNTYKLQkudGV4dAotCS5nbG9iYWwgbG9jawotbG9jazoKLQlsb2NrIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtYWNoaQotbWFjaGk6Ci0JbWFjaGkgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbWFjbG8KLW1hY2xvOgotCW1hY2xvIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG1hY3doaQotbWFjd2hpOgotCW1hY3doaSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtYWN3bG8KLW1hY3dsbzoKLQltYWN3bG8gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsCi1tdWw6Ci0JbXVsIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bGhpCi1tdWxoaToKLQltdWxoaSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWxsbwotbXVsbG86Ci0JbXVsbG8gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsd2hpCi1tdWx3aGk6Ci0JbXVsd2hpIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bHdsbwotbXVsd2xvOgotCW11bHdsbyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdgotbXY6Ci0JbXYgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNoaQotbXZmYWNoaToKLQltdmZhY2hpIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjbG8KLW12ZmFjbG86Ci0JbXZmYWNsbyBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY21pCi1tdmZhY21pOgotCW12ZmFjbWkgZnAKLQkudGV4dAotCS5nbG9iYWwgbXZmYwotbXZmYzoKLQltdmZjIGZwLHBzdwotCS50ZXh0Ci0JLmdsb2JhbCBtdnRhY2hpCi1tdnRhY2hpOgotCW12dGFjaGkgZnAKLQkudGV4dAotCS5nbG9iYWwgbXZ0YWNsbwotbXZ0YWNsbzoKLQltdnRhY2xvIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12dGMKLW12dGM6Ci0JbXZ0YyBmcCxwc3cKLQkudGV4dAotCS5nbG9iYWwgbmVnCi1uZWc6Ci0JbmVnIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG5vcAotbm9wOgotCW5vcAotCS50ZXh0Ci0JLmdsb2JhbCBub3QKLW5vdDoKLQlub3QgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgcmFjCi1yYWM6Ci0JLnRleHQKLQkuZ2xvYmFsIHJhY2gKLXJhY2g6Ci0JLnRleHQKLQkuZ2xvYmFsIHJ0ZQotcnRlOgotCS50ZXh0Ci0JLmdsb2JhbCBzZXRoCi1zZXRoOgotCXNldGggZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzbGwKLXNsbDoKLQlzbGwgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc2xsMwotc2xsMzoKLQlzbGwzIGZwLGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc2xsaQotc2xsaToKLQlzbGxpIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3JhCi1zcmE6Ci0Jc3JhIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHNyYTMKLXNyYTM6Ci0Jc3JhMyBmcCxmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNyYWkKLXNyYWk6Ci0Jc3JhaSBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNybAotc3JsOgotCXNybCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzcmwzCi1zcmwzOgotCXNybDMgZnAsZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzcmxpCi1zcmxpOgotCXNybGkgZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzdAotc3Q6Ci0Jc3QgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN0XzIKLXN0XzI6Ci0Jc3QgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RfZAotc3RfZDoKLQlzdCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0X2QyCi1zdF9kMjoKLQlzdCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIHN0Ygotc3RiOgotCXN0YiBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgc3RiXzIKLXN0Yl8yOgotCXN0YiBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGJfZAotc3RiX2Q6Ci0Jc3RiIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RiX2QyCi1zdGJfZDI6Ci0Jc3RiIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgc3RoCi1zdGg6Ci0Jc3RoIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdGhfMgotc3RoXzI6Ci0Jc3RoIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0aF9kCi1zdGhfZDoKLQlzdGggZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGhfZDIKLXN0aF9kMjoKLQlzdGggZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9wbHVzCi1zdF9wbHVzOgotCXN0IGZwLEArZnAKLQkudGV4dAotCS5nbG9iYWwgc3RfbWludXMKLXN0X21pbnVzOgotCXN0IGZwLEAtZnAKLQkudGV4dAotCS5nbG9iYWwgc3ViCi1zdWI6Ci0Jc3ViIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN1YnYKLXN1YnY6Ci0Jc3VidiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdWJ4Ci1zdWJ4OgotCXN1YnggZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgdHJhcAotdHJhcDoKLQl0cmFwIDAKLQkudGV4dAotCS5nbG9iYWwgdW5sb2NrCi11bmxvY2s6Ci0JdW5sb2NrIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBwdXNoCi1wdXNoOgotCXB1c2ggZnAKLQkudGV4dAotCS5nbG9iYWwgcG9wCi1wb3A6Ci0JcG9wIGZwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2Vycm9yLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZXJyb3IuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg4NzE5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZXJyb3IuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBUZXN0IGFzc2VtYmxlciB3YXJuaW5ncyBhbmQgZXJyb3JzLgotCi1pZiBbaXN0YXJnZXQgbTMyci0qLSpdIHsKLQotICAgIGxvYWRfbGliIGdhcy1kZy5leHAKLQotICAgIGRnLWluaXQKLQotICAgIGRnLXJ1bnRlc3QgIiRzcmNkaXIvJHN1YmRpci93cm9uZ3NpemUucyIgIiIgIiIKLSAgICBkZy1ydW50ZXN0ICIkc3JjZGlyLyRzdWJkaXIvaW50ZXJmZXJlLnMiICIiICIiCi0gICAgZGctcnVudGVzdCAiJHNyY2Rpci8kc3ViZGlyL291dG9mcmFuZ2UucyIgIiIgIiIKLQotICAgIGRnLWZpbmlzaAotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Y2YwMmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGZzbG90Ci0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswIDxibD46Ci0gKjA6CTdlIDAwIGYwIDAwIAlibCAwIDxibD4gXHxcfCBub3AKLSAqNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzggPGJsX3M+OgotICo4Ogk3ZSAwMCBmMCAwMCAJYmwgOCA8Ymxfcz4gXHxcfCBub3AKLSAqYzoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzEwIDxicmE+OgotICoxMDoJN2YgMDAgZjAgMDAgCWJyYSAxMCA8YnJhPiBcfFx8IG5vcAotICoxNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzE4IDxicmFfcz46Ci0gKjE4Ogk3ZiAwMCBmMCAwMCAJYnJhIDE4IDxicmFfcz4gXHxcfCBub3AKLSAqMWM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsyMCA8amw+OgotICoyMDoJMWUgYzAgZjAgMDAgCWpsIHIwIFx8XHwgbm9wCi0gKjI0Ogk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMjggPHRyYXA+OgotICoyODoJMTAgZjQgZjAgMDAgCXRyYXAgWyNdKjB4NCBcfFx8IG5vcAotICoyYzoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZiNjY0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgVGVzdCB0aGUgRklMTC1TTE9UIGF0dHJpYnV0ZS4KLSMgVGhlIEZJTEwtU0xPVCBhdHRyaWJ1dGUgZW5zdXJlcyB0aGUgbmV4dCBpbnNuIGJlZ2lucyBvbiBhIDMyIGJ5dGUgYm91bmRhcnkuCi0jIFRoaXMgaXMgbmVlZGVkIGZvciBleGFtcGxlIHdpdGggYmwgYmVjYXVzZSB0aGUgc3Vicm91dGluZSB3aWxsIHJldHVybgotIyB0byBhIDMyIGJpdCBib3VuZGFyeS4KLQotCS50ZXh0Ci1ibDoKLQlibCBibAotCWxkaSByMCwjOAotYmxfczoKLQlibC5zIGJsX3MKLQlsZGkgcjAsIzgKLQotYnJhOgotCWJyYSBicmEKLQlsZGkgcjAsIzgKLWJyYV9zOgotCWJyYS5zIGJyYV9zCi0JbGRpIHIwLCM4Ci0KLWpsOgotCWpsIHIwCi0JbGRpIHIwLCM4Ci0KLXRyYXA6Ci0JdHJhcCAjNAotCWxkaSByMCwjOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdHguZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3R4LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTJkMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdHguZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNhczogLW0zMnJ4Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogZnNsb3R4Ci0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswIDxiY2w+OgotICowOgk3OCAwMCBmMCAwMCAJYmNsIDAgPGJjbD4gXHxcfCBub3AKLSAqNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzggPGJjbF9zPjoKLSAqODoJNzggMDAgZjAgMDAgCWJjbCA4IDxiY2xfcz4gXHxcfCBub3AKLSAqYzoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzEwIDxibmNsPjoKLSAgMTA6CTc5IDAwIGYwIDAwIAlibmNsIDEwIDxibmNsPiBcfFx8IG5vcAotICAxNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzE4IDxibmNsX3M+OgotICAxODoJNzkgMDAgZjAgMDAgCWJuY2wgMTggPGJuY2xfcz4gXHxcfCBub3AKLSAgMWM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3R4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90eC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2ZiMjMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3R4LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIFRlc3QgdGhlIEZJTEwtU0xPVCBhdHRyaWJ1dGUuCi0jIFRoZSBGSUxMLVNMT1QgYXR0cmlidXRlIGVuc3VyZXMgdGhlIG5leHQgaW5zbiBiZWdpbnMgb24gYSAzMiBieXRlIGJvdW5kYXJ5LgotIyBUaGlzIGlzIG5lZWRlZCBmb3IgZXhhbXBsZSB3aXRoIGJsIGJlY2F1c2UgdGhlIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4KLSMgdG8gYSAzMiBiaXQgYm91bmRhcnkuCi0KLQkudGV4dAotYmNsOgotCWJjbCBiY2wKLQlsZGkgcjAsIzgKLWJjbF9zOgotCWJjbC5zIGJjbF9zCi0JbGRpIHIwLCM4Ci0KLWJuY2w6Ci0JYm5jbCBibmNsCi0JbGRpIHIwLCM4Ci1ibmNsX3M6Ci0JYm5jbC5zIGJuY2xfcwotCWxkaSByMCwjOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Y2NiOGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEuZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBoaWdoLTEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKiA8Zm9vPjoKLSAqMDoJZDQgYzAgMDAgMDEgCXNldGggcjQsWyNdKjB4MQotWyAJXSowOiBSX00zMlJfSEkxNl9VTE8JLnRleHQKLSAqNDoJODQgZTQgMDAgMDAgCW9yMyByNCxyNCxbI10qMHgwCi1bIAldKjQ6IFJfTTMyUl9MTzE2CS50ZXh0Ci0gKjg6CWQ0IGMwIDEyIDM0IAlzZXRoIHI0LFsjXSoweDEyMzQKLSAqYzoJODQgZTQgODcgNjUgCW9yMyByNCxyNCxbI10qMHg4NzY1Ci0gKjEwOglkNCBjMCAxMiAzNSAJc2V0aCByNCxbI10qMHgxMjM1Ci0gKjE0Ogk4NCBlNCA4NyA2NSAJb3IzIHI0LHI0LFsjXSoweDg3NjUKLSAqMTg6CWQ0IGMwIDg3IDY1IAlzZXRoIHI0LFsjXSoweDg3NjUKLSAqMWM6CTg0IGU0IDQzIDIxIAlvcjMgcjQscjQsWyNdKjB4NDMyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNWQxZDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTsgVGVzdCBoaWdoL3NoaWdoIGhhbmRsaW5nLgotCi1mb286Ci0Jc2V0aCByNCwjaGlnaChmb28rMHgxMDAwMCkKLQlvcjMgIHI0LHI0LCNsb3coZm9vKzB4MTAwMDApCi0KLQlzZXRoIHI0LCNoaWdoKDB4MTIzNDg3NjUpCi0Jb3IzICByNCxyNCwjbG93KDB4MTIzNDg3NjUpCi0KLQlzZXRoIHI0LCNzaGlnaCgweDEyMzQ4NzY1KQotCW9yMyAgcjQscjQsI2xvdygweDEyMzQ4NzY1KQotCi0Jc2V0aCByNCwjc2hpZ2goMHg4NzY1NDMyMSkKLQlvcjMgIHI0LHI0LCNsb3coMHg4NzY1NDMyMSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaW50ZXJmZXJlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ludGVyZmVyZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzVlY2RlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaW50ZXJmZXJlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgZXJyb3IgbWVzc2FnZXMgaW4gaW5zdGFuY2VzIHdoZXJlIG91dHB1dCBvcGVyYW5kcyBpbnRlcmZlcmUuCi0KLTsgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBtMzJyLSotKiB9IH0KLTsgeyBkZy1vcHRpb25zIC1tMzJyeCB9Ci0KLWludGVyZmVyZToKLQl0cmFwICMxICAgICAgfHwgY21wICByMywgcjQJOyB7IGRnLWVycm9yICJ3cml0ZSB0byB0aGUgc2FtZSIgfQotCQk7IHsgZGctd2FybmluZyAic2FtZSIgIm91dC0+aW4iIHsgdGFyZ2V0ICotKi0qIH0geyA3IH0gfQotCXJ0ZSAgICAgICAgICB8fCBhZGR4IHIzLCByNAk7IHsgZGctZXJyb3IgIndyaXRlIHRvIHRoZSBzYW1lIiB9Ci0JCTsgeyBkZy13YXJuaW5nICJzYW1lIiAib3V0LT5pbiIgeyB0YXJnZXQgKi0qLSogfSB7IDkgfSB9Ci0JY21wICByMSwgcjIgIHx8IGFkZHggcjMsIHI0CTsgeyBkZy1lcnJvciAid3JpdGUgdG8gdGhlIHNhbWUiIH0KLQkJOyB7IGRnLXdhcm5pbmcgInNhbWUiICJvdXQtPmluIiB7IHRhcmdldCAqLSotKiB9IHsgMTEgfSB9Ci0JbXZ0YyByMCwgcHN3IHx8IGFkZHggcjEsIHI0CTsgeyBkZy1lcnJvciAid3JpdGUgdG8gdGhlIHNhbWUiIH0KLQkJOyB7IGRnLXdhcm5pbmcgInNhbWUiICJvdXQtPmluIiB7IHRhcmdldCAqLSotKiB9IHsgMTMgfSB9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnIuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMjM2NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIE0zMlIgdGVzdGNhc2VzCi0KLWlmIFtpc3RhcmdldCBtMzJyKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJoaWdoLTEiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsYXgtMSIKLSAgICBydW5fZHVtcF90ZXN0ICJ1cHBlcmNhc2UiCi0gICAgcnVuX2R1bXBfdGVzdCAiZnNsb3QiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MTNkZDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLSNhczogLW0zMnJ4IC0tbm8td2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHMgLS1oaWRkZW4gLU8KLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBtMzJyeAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8YmNsPjoKLSAgIDA6CTc4IDAwIGYwIDAwIAliY2wgMCA8YmNsPiBcfFx8IG5vcAotCi0wKzAwMDQgPGJuY2w+OgotICAgNDoJNzkgZmYgZjAgMDAgCWJuY2wgMCA8YmNsPiBcfFx8IG5vcAotCi0wKzAwMDggPGNtcHo+OgotICAgODoJMDAgN2QgZjAgMDAgCWNtcHogZnAgXHxcfCBub3AKLQotMCswMDBjIDxjbXBlcT46Ci0gICBjOgkwZCA2ZCBmMCAwMCAJY21wZXEgZnAsZnAgXHxcfCBub3AKLQotMCswMDEwIDxtYWNsaDE+OgotICAxMDoJNWQgY2QgZjAgMDAgCW1hY2xoMSBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMTQgPG1zYmxvPjoKLSAgMTQ6CTVkIGRkIGYwIDAwIAltc2JsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMTggPG11bHd1MT46Ci0gIDE4Ogk1ZCBhZCBmMCAwMCAJbXVsd3UxIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAxYyA8bWFjd3UxPjoKLSAgMWM6CTVkIGJkIGYwIDAwIAltYWN3dTEgZnAsZnAgXHxcfCBub3AKLQotMCswMDIwIDxzYWRkPjoKLSAgMjA6CTUwIGU0IGYwIDAwIAlzYWRkIFx8XHwgbm9wCi0KLTArMDAyNCA8c2F0Yj46Ci0gIDI0Ogk4ZCA2ZCAwMyAwMCAJc2F0YiBmcCxmcAotCi0wKzAwMjggPG11bGhpPjoKLSAgMjg6CTNkIDhkIGYwIDAwIAltdWxoaSBmcCxmcCxhMSBcfFx8IG5vcAotCi0wKzAwMmMgPG11bGxvPjoKLSAgMmM6CTNkIDFkIGYwIDAwIAltdWxsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMzAgPGRpdmg+OgotICAzMDoJOWQgMGQgMDAgMTAgCWRpdmggZnAsZnAKLQotMCswMDM0IDxtYWNoaT46Ci0gIDM0OgkzZCBjZCBmMCAwMCAJbWFjaGkgZnAsZnAsYTEgXHxcfCBub3AKLQotMCswMDM4IDxtYWNsbz46Ci0gIDM4OgkzZCA1ZCBmMCAwMCAJbWFjbG8gZnAsZnAgXHxcfCBub3AKLQotMCswMDNjIDxtdmZhY2hpPjoKLSAgM2M6CTVkIGY0IGYwIDAwIAltdmZhY2hpIGZwLGExIFx8XHwgbm9wCi0KLTArMDA0MCA8bXZmYWNtaT46Ci0gIDQwOgk1ZCBmNiBmMCAwMCAJbXZmYWNtaSBmcCxhMSBcfFx8IG5vcAotCi0wKzAwNDQgPG12ZmFjbG8+OgotICA0NDoJNWQgZjUgZjAgMDAgCW12ZmFjbG8gZnAsYTEgXHxcfCBub3AKLQotMCswMDQ4IDxtdnRhY2hpPjoKLSAgNDg6CTVkIDc0IGYwIDAwIAltdnRhY2hpIGZwLGExIFx8XHwgbm9wCi0KLTArMDA0YyA8bXZ0YWNsbz46Ci0gIDRjOgk1ZCA3MSBmMCAwMCAJbXZ0YWNsbyBmcCBcfFx8IG5vcAotCi0wKzAwNTAgPHJhYz46Ci0gIDUwOgk1NCA5MCBmMCAwMCAJcmFjIGExIFx8XHwgbm9wCi0KLTArMDA1NCA8cmFjX2RzPjoKLSAgNTQ6CTU0IDkwIGYwIDAwIAlyYWMgYTEgXHxcfCBub3AKLQotMCswMDU4IDxyYWNfZHNpPjoKLSAgNTg6CTUwIDk0IGYwIDAwIAlyYWMgYTAsYTEgXHxcfCBub3AKLQotMCswMDVjIDxyYWNoPjoKLSAgNWM6CTU0IDgwIGYwIDAwIAlyYWNoIGExIFx8XHwgbm9wCi0KLTArMDA2MCA8cmFjaF9kcz46Ci0gIDYwOgk1MCA4NCBmMCAwMCAJcmFjaCBhMCxhMSBcfFx8IG5vcAotCi0wKzAwNjQgPHJhY2hfZHNpPjoKLSAgNjQ6CTU0IDgxIGYwIDAwIAlyYWNoIGExLGEwLCMweDIgXHxcfCBub3AKLQotMCswMDY4IDxiY19fYWRkPjoKLSAgNjg6CTdjIGU2IDhkIGFkIAliYyAwIDxiY2w+IFx8XHwgYWRkIGZwLGZwCi0gIDZjOgk3YyBlNSAwZCBhZCAJYmMgMCA8YmNsPiAtPiBhZGQgZnAsZnAKLQotMCswMDcwIDxiY2xfX2FkZGk+OgotICA3MDoJNzggZTQgY2QgNGQgCWJjbCAwIDxiY2w+IFx8XHwgYWRkaSBmcCwjNzcKLSAgNzQ6CTc4IGUzIGNkIDRkIAliY2wgMCA8YmNsPiBcfFx8IGFkZGkgZnAsIzc3Ci0KLTArMDA3OCA8YmxfX2FkZHY+OgotICA3ODoJN2UgZTIgOGQgOGQgCWJsIDAgPGJjbD4gXHxcfCBhZGR2IGZwLGZwCi0gIDdjOgk3ZSBlMSA4ZCA4ZCAJYmwgMCA8YmNsPiBcfFx8IGFkZHYgZnAsZnAKLQotMCswMDgwIDxibmNfX2FkZHg+OgotICA4MDoJN2QgZTAgOGQgOWQgCWJuYyAwIDxiY2w+IFx8XHwgYWRkeCBmcCxmcAotICA4NDoJN2QgZGYgMGQgOWQgCWJuYyAwIDxiY2w+IC0+IGFkZHggZnAsZnAKLQotMCswMDg4IDxibmNsX19hbmQ+OgotICA4ODoJNzkgZGUgOGQgY2QgCWJuY2wgMCA8YmNsPiBcfFx8IGFuZCBmcCxmcAotICA4YzoJMGQgY2QgNzkgZGQgCWFuZCBmcCxmcCAtPiBibmNsIDAgPGJjbD4KLQotMCswMDkwIDxicmFfX2NtcD46Ci0gIDkwOgk3ZiBkYyA4ZCA0ZCAJYnJhIDAgPGJjbD4gXHxcfCBjbXAgZnAsZnAKLSAgOTQ6CTdmIGRiIDhkIDRkIAlicmEgMCA8YmNsPiBcfFx8IGNtcCBmcCxmcAotCi0wKzAwOTggPGpsX19jbXBlcT46Ci0gIDk4OgkxZSBjZCA4ZCA2ZCAJamwgZnAgXHxcfCBjbXBlcSBmcCxmcAotICA5YzoJMWUgY2QgOGQgNmQgCWpsIGZwIFx8XHwgY21wZXEgZnAsZnAKLQotMCswMGEwIDxqbXBfX2NtcHU+OgotICBhMDoJMWYgY2QgOGQgNWQgCWptcCBmcCBcfFx8IGNtcHUgZnAsZnAKLSAgYTQ6CTFmIGNkIDhkIDVkIAlqbXAgZnAgXHxcfCBjbXB1IGZwLGZwCi0KLTArMDBhOCA8bGRfX2NtcHo+OgotICBhODoJMmQgY2QgODAgNzEgCWxkIGZwLEBmcCBcfFx8IGNtcHogcjEKLSAgYWM6CTJkIGNkIDgwIDcxIAlsZCBmcCxAZnAgXHxcfCBjbXB6IHIxCi0KLTArMDBiMCA8bGRfX2xkaT46Ci0gIGIwOgkyZCBlMSBlMiA0ZCAJbGQgZnAsQHIxXCsgXHxcfCBsZGkgcjIsIzc3Ci0gIGI0OgkyZCBlMSBlMiA0ZCAJbGQgZnAsQHIxXCsgXHxcfCBsZGkgcjIsIzc3Ci0KLTArMDBiOCA8bGRiX19tdj46Ci0gIGI4OgkyZCA4ZCA5MiA4ZCAJbGRiIGZwLEBmcCBcfFx8IG12IHIyLGZwCi0gIGJjOgkyZCA4ZCAxMiA4ZCAJbGRiIGZwLEBmcCAtPiBtdiByMixmcAotCi0wKzAwYzAgPGxkaF9fbmVnPjoKLSAgYzA6CTJkIGFkIDgyIDNkIAlsZGggZnAsQGZwIFx8XHwgbmVnIHIyLGZwCi0gIGM0OgkyZCBhZCAwMiAzZCAJbGRoIGZwLEBmcCAtPiBuZWcgcjIsZnAKLQotMCswMGM4IDxsZHViX19ub3A+OgotICBjODoJMmQgOWQgZjAgMDAgCWxkdWIgZnAsQGZwIFx8XHwgbm9wCi0gIGNjOgkyZCA5ZCBmMCAwMCAJbGR1YiBmcCxAZnAgXHxcfCBub3AKLQotMCswMGQwIDxsZHVoX19ub3Q+OgotICBkMDoJMmQgYmQgODIgYmQgCWxkdWggZnAsQGZwIFx8XHwgbm90IHIyLGZwCi0gIGQ0OgkyZCBiZCAwMiBiZCAJbGR1aCBmcCxAZnAgLT4gbm90IHIyLGZwCi0KLTArMDBkOCA8bG9ja19fb3I+OgotICBkODoJMmQgZGQgODIgZWQgCWxvY2sgZnAsQGZwIFx8XHwgb3IgcjIsZnAKLSAgZGM6CTJkIGRkIDAyIGVkIAlsb2NrIGZwLEBmcCAtPiBvciByMixmcAotCi0wKzAwZTAgPG12ZmNfX3N1Yj46Ci0gIGUwOgkxZCA5MSA4MiAyZCAJbXZmYyBmcCxjYnIgXHxcfCBzdWIgcjIsZnAKLSAgZTQ6CTFkIDkxIDAyIDJkIAltdmZjIGZwLGNiciAtPiBzdWIgcjIsZnAKLQotMCswMGU4IDxtdnRjX19zdWJ2PjoKLSAgZTg6CTEyIGFkIDgyIDBkIAltdnRjIGZwLHNwaSBcfFx8IHN1YnYgcjIsZnAKLSAgZWM6CTEyIGFkIDgyIDBkIAltdnRjIGZwLHNwaSBcfFx8IHN1YnYgcjIsZnAKLQotMCswMGYwIDxydGVfX3N1Yng+OgotICBmMDoJMTAgZDYgODIgMmQgCXJ0ZSBcfFx8IHN1YiByMixmcAotICBmNDoJMTAgZDYgMDIgMWQgCXJ0ZSAtPiBzdWJ4IHIyLGZwCi0KLTArMDBmOCA8c2xsX194b3I+OgotICBmODoJMWQgNDEgODIgZGQgCXNsbCBmcCxyMSBcfFx8IHhvciByMixmcAotICBmYzoJMWQgNDEgMDIgZGQgCXNsbCBmcCxyMSAtPiB4b3IgcjIsZnAKLQotMCswMTAwIDxzbGxpX19tYWNoaT46Ci0gMTAwOgk1ZCA1NiBiMiA0ZCAJc2xsaSBmcCwjMHgxNiBcfFx8IG1hY2hpIHIyLGZwCi0gMTA0Ogk1ZCA1NiAzMiA0ZCAJc2xsaSBmcCwjMHgxNiAtPiBtYWNoaSByMixmcAotCi0wKzAxMDggPHNyYV9fbWFjbGgxPjoKLSAxMDg6CTFkIDJkIGQyIGNkIAlzcmEgZnAsZnAgXHxcfCBtYWNsaDEgcjIsZnAKLSAxMGM6CTFkIDJkIDUyIGNkIAlzcmEgZnAsZnAgLT4gbWFjbGgxIHIyLGZwCi0KLTArMDExMCA8c3JhaV9fbWFjbG8+OgotIDExMDoJNWQgMzYgYjIgNWQgCXNyYWkgZnAsIzB4MTYgXHxcfCBtYWNsbyByMixmcAotIDExNDoJNWQgMzYgMzIgNWQgCXNyYWkgZnAsIzB4MTYgLT4gbWFjbG8gcjIsZnAKLQotMCswMTE4IDxzcmxfX21hY3doaT46Ci0gMTE4OgkxZCAwZCBiMiA2ZCAJc3JsIGZwLGZwIFx8XHwgbWFjd2hpIHIyLGZwCi0gMTFjOgkxZCAwZCAzMiA2ZCAJc3JsIGZwLGZwIC0+IG1hY3doaSByMixmcAotCi0wKzAxMjAgPHNybGlfX21hY3dsbz46Ci0gMTIwOgk1ZCAxNiBiMiA3ZCAJc3JsaSBmcCwjMHgxNiBcfFx8IG1hY3dsbyByMixmcAotIDEyNDoJNWQgMTYgMzIgN2QgCXNybGkgZnAsIzB4MTYgLT4gbWFjd2xvIHIyLGZwCi0KLTArMDEyOCA8c3RfX21hY3d1MT46Ci0gMTI4OgkyZCA0ZCBkMiBiZCAJc3QgZnAsQGZwIFx8XHwgbWFjd3UxIHIyLGZwCi0gMTJjOgkyZCA0ZCBkMiBiZCAJc3QgZnAsQGZwIFx8XHwgbWFjd3UxIHIyLGZwCi0KLTArMDEzMCA8c3RfX21zYmxvPjoKLSAxMzA6CTJkIDZkIGQyIGRkIAlzdCBmcCxAXCtmcCBcfFx8IG1zYmxvIHIyLGZwCi0gMTM0OgkyZCA2ZCA1MiBkZCAJc3QgZnAsQFwrZnAgLT4gbXNibG8gcjIsZnAKLQotMCswMTM4IDxzdF9fbXVsPjoKLSAxMzg6CTJkIDdkIDkyIDZkIAlzdCBmcCxALWZwIFx8XHwgbXVsIHIyLGZwCi0gMTNjOgkyZCA3ZCAxMiA2ZCAJc3QgZnAsQC1mcCAtPiBtdWwgcjIsZnAKLQotMCswMTQwIDxzdGJfX211bGhpPjoKLSAxNDA6CTJkIDBkIGIyIDBkIAlzdGIgZnAsQGZwIFx8XHwgbXVsaGkgcjIsZnAKLSAxNDQ6CTJkIDBkIGIyIDBkIAlzdGIgZnAsQGZwIFx8XHwgbXVsaGkgcjIsZnAKLQotMCswMTQ4IDxzdGhfX211bGxvPjoKLSAxNDg6CTJkIDJkIGIyIDFkIAlzdGggZnAsQGZwIFx8XHwgbXVsbG8gcjIsZnAKLSAxNGM6CTJkIDJkIGIyIDFkIAlzdGggZnAsQGZwIFx8XHwgbXVsbG8gcjIsZnAKLQotMCswMTUwIDx0cmFwX19tdWx3aGk+OgotIDE1MDoJMTAgZjIgYjIgMmQgCXRyYXAgIzB4MiBcfFx8IG11bHdoaSByMixmcAotIDE1NDoJMTAgZjIgZjAgMDAgCXRyYXAgIzB4MiBcfFx8IG5vcAotIDE1ODoJMzIgMmQgZjAgMDAgCW11bHdoaSByMixmcCBcfFx8IG5vcAotCi0wKzAxNWMgPHVubG9ja19fbXVsd2xvPjoKLSAxNWM6CTJkIDVkIGIyIDNkIAl1bmxvY2sgZnAsQGZwIFx8XHwgbXVsd2xvIHIyLGZwCi0gMTYwOgkyZCA1ZCBiMiAzZCAJdW5sb2NrIGZwLEBmcCBcfFx8IG11bHdsbyByMixmcAotCi0wKzAxNjQgPGFkZF9fbXVsd3UxPjoKLSAxNjQ6CTBkIGFkIGQyIGFkIAlhZGQgZnAsZnAgXHxcfCBtdWx3dTEgcjIsZnAKLSAxNjg6CTBkIGFkIDUyIGFkIAlhZGQgZnAsZnAgLT4gbXVsd3UxIHIyLGZwCi0KLTArMDE2YyA8YWRkaV9fbXZmYWNoaT46Ci0gMTZjOgk0ZCA0ZCBkMiBmMCAJYWRkaSBmcCwjNzcgXHxcfCBtdmZhY2hpIHIyCi0gMTcwOgk0ZCA0ZCBkMiBmMCAJYWRkaSBmcCwjNzcgXHxcfCBtdmZhY2hpIHIyCi0KLTArMDE3NCA8YWRkdl9fbXZmYWNsbz46Ci0gMTc0OgkwZCA4ZCBkMiBmNSAJYWRkdiBmcCxmcCBcfFx8IG12ZmFjbG8gcjIsYTEKLSAxNzg6CTBkIDhkIGQyIGY1IAlhZGR2IGZwLGZwIFx8XHwgbXZmYWNsbyByMixhMQotCi0wKzAxN2MgPGFkZHhfX212ZmFjbWk+OgotIDE3YzoJMGQgOWQgZDIgZjIgCWFkZHggZnAsZnAgXHxcfCBtdmZhY21pIHIyCi0gMTgwOgkwZCA5ZCBkMiBmMiAJYWRkeCBmcCxmcCBcfFx8IG12ZmFjbWkgcjIKLQotMCswMTg0IDxhbmRfX212dGFjaGk+OgotIDE4NDoJMGQgY2QgZDIgNzAgCWFuZCBmcCxmcCBcfFx8IG12dGFjaGkgcjIKLSAxODg6CTBkIGNkIGQyIDcwIAlhbmQgZnAsZnAgXHxcfCBtdnRhY2hpIHIyCi0KLTArMDE4YyA8Y21wX19tdnRhY2xvPjoKLSAxOGM6CTBkIDRkIGQyIDcxIAljbXAgZnAsZnAgXHxcfCBtdnRhY2xvIHIyCi0gMTkwOgkwZCA0ZCBkMiA3MSAJY21wIGZwLGZwIFx8XHwgbXZ0YWNsbyByMgotCi0wKzAxOTQgPGNtcGVxX19yYWM+OgotIDE5NDoJMGQgNmQgZDQgOTAgCWNtcGVxIGZwLGZwIFx8XHwgcmFjIGExCi0gMTk4OgkwZCA2ZCBkNCA5MCAJY21wZXEgZnAsZnAgXHxcfCByYWMgYTEKLQotMCswMTljIDxjbXB1X19yYWNoPjoKLSAxOWM6CTBkIDVkIGQwIDg0IAljbXB1IGZwLGZwIFx8XHwgcmFjaCBhMCxhMQotIDFhMDoJMGQgNWQgZDQgODQgCWNtcHUgZnAsZnAgXHxcfCByYWNoIGExLGExCi0KLTArMDFhNCA8Y21wel9fc2FkZD46Ci0gMWE0OgkwMCA3ZCBkMCBlNCAJY21weiBmcCBcfFx8IHNhZGQKLSAxYTg6CTAwIDdkIGQwIGU0IAljbXB6IGZwIFx8XHwgc2FkZAotCi0wKzAxYWMgPHNjPjoKLSAxYWM6CTc0IDAxIGQwIGU0IAlzYyBcfFx8IHNhZGQKLQotMCswMWIwIDxzbmM+OgotIDFiMDoJNzUgMDEgZDAgZTQgCXNuYyBcfFx8IHNhZGQKLQotMCswMWI0IDxqYz46Ci0gMWI0OgkxYyBjZCBmMCAwMCAJamMgZnAgXHxcfCBub3AKLQotMCswMWI4IDxqbmM+OgotIDFiODoJMWQgY2QgZjAgMDAgCWpuYyBmcCBcfFx8IG5vcAotCi0wKzAxYmMgPHBjbXBiej46Ci0gMWJjOgkwMyA3ZCBmMCAwMCAJcGNtcGJ6IGZwIFx8XHwgbm9wCi0KLTArMDFjMCA8c2F0PjoKLSAxYzA6CThkIDZkIDAwIDAwIAlzYXQgZnAsZnAKLQotMCswMWM0IDxzYXRoPjoKLSAxYzQ6CThkIDZkIDAyIDAwIAlzYXRoIGZwLGZwCi0KLTArMDFjOCA8amNfX3BjbXBiej46Ci0gMWM4OgkxYyBjZCA4MyA3ZCAJamMgZnAgXHxcfCBwY21wYnogZnAKLSAxY2M6CTFjIGNkIDAzIDdkIAlqYyBmcCAtPiBwY21wYnogZnAKLQotMCswMWQwIDxqbmNfX2xkaT46Ci0gMWQwOgkxZCBjZCBlZCA0ZCAJam5jIGZwIFx8XHwgbGRpIGZwLCM3NwotIDFkNDoJMWQgY2QgNmQgNGQgCWpuYyBmcCAtPiBsZGkgZnAsIzc3Ci0KLTArMDFkOCA8c2NfX212PjoKLSAxZDg6CTc0IDAxIDlkIDgyIAlzYyBcfFx8IG12IGZwLHIyCi0gMWRjOgk3NCAwMSA5ZCA4MiAJc2MgXHxcfCBtdiBmcCxyMgotCi0wKzAxZTAgPHNuY19fbmVnPjoKLSAxZTA6CTc1IDAxIDhkIDMyIAlzbmMgXHxcfCBuZWcgZnAscjIKLSAxZTQ6CTc1IDAxIDhkIDMyIAlzbmMgXHxcfCBuZWcgZnAscjIKLQotMCswMWU4IDxub3BfX3NhZGQ+OgotIDFlODoJNzAgMDAgZDAgZTQgCW5vcCBcfFx8IHNhZGQKLQotMCswMWVjIDxzYWRkX19ub3A+OgotIDFlYzoJNzAgMDAgZDAgZTQgCW5vcCBcfFx8IHNhZGQKLQotMCswMWYwIDxzYWRkX19ub3BfcmV2ZXJzZT46Ci0gMWYwOgk3MCAwMCBkMCBlNCAJbm9wIFx8XHwgc2FkZAotCi0wKzAxZjQgPGFkZF9fbm90PjoKLSAxZjQ6CTAwIGExIDgzIGI1IAlhZGQgcjAscjEgXHxcfCBub3QgcjMscjUKLQotMCswMWY4IDxhZGRfX25vdF9kZXN0X2NsYXNoPjoKLSAxZjg6CTAzIGE0IDAzIGI1IAlhZGQgcjMscjQgLT4gbm90IHIzLHI1Ci0KLTArMDFmYyA8YWRkX19ub3RfX3NyY19jbGFzaD46Ci0gMWZjOgkwMyBhNCAwNSBiMyAJYWRkIHIzLHI0IC0+IG5vdCByNSxyMwotCi0wKzAyMDAgPGFkZF9fbm90X19ub19jbGFzaD46Ci0gMjAwOgkwMyBhNCA4NCBiNSAJYWRkIHIzLHI0IFx8XHwgbm90IHI0LHI1Ci0KLTArMDIwNCA8bXVsX19zcmE+OgotIDIwNDoJMTMgMjQgOTEgNjIgCXNyYSByMyxyNCBcfFx8IG11bCByMSxyMgotCi0wKzAyMDggPG11bF9fc3JhX19yZXZlcnNlX3NyY19jbGFzaD46Ci0gMjA4OgkxMyAyNCA5MSA2MyAJc3JhIHIzLHI0IFx8XHwgbXVsIHIxLHIzCi0KLTArMDIwYyA8YmNfX2FkZF8+OgotIDIwYzoJN2MgMDQgMDEgYTIgCWJjIDIxYyA8bGFiZWw+IC0+IGFkZCByMSxyMgotCi0wKzAyMTAgPGFkZF9fYmM+OgotIDIxMDoJN2MgMDMgODMgYTQgCWJjIDIxYyA8bGFiZWw+IFx8XHwgYWRkIHIzLHI0Ci0KLTArMDIxNCA8YmNfX2FkZF9fZm9yY2VkX3BhcmFsbGVsPjoKLSAyMTQ6CTdjIDAyIDg1IGE2IAliYyAyMWMgPGxhYmVsPiBcfFx8IGFkZCByNSxyNgotCi0wKzAyMTggPGFkZF9fYmNfX2ZvcmNlZF9wYXJhbGxlbD46Ci0gMjE4Ogk3YyAwMSA4NyBhOCAJYmMgMjFjIDxsYWJlbD4gXHxcfCBhZGQgcjcscjgKLQotMCswMjFjIDxsYWJlbD46Ci0gMjFjOgk3MCAwMCBmMCAwMCAJbm9wIFx8XHwgbm9wCi0KLTArMDIyMCA8bXVsd2hpPjoKLSAyMjA6CTNkIDJkIDNkIGFkIAltdWx3aGkgZnAsZnAgLT4gbXVsd2hpIGZwLGZwLGExCi0KLTArMDIyNCA8bXVsd2xvPjoKLSAyMjQ6CTNkIDNkIDNkIGJkIAltdWx3bG8gZnAsZnAgLT4gbXVsd2xvIGZwLGZwLGExCi0KLTArMDIyOCA8bWFjd2hpPjoKLSAyMjg6CTNkIDZkIDNkIGVkIAltYWN3aGkgZnAsZnAgLT4gbWFjd2hpIGZwLGZwLGExCi0KLTArMDIyYyA8bWFjd2xvPjoKLSAyMmM6CTNkIDdkIDNkIGZkIAltYWN3bG8gZnAsZnAgLT4gbWFjd2xvIGZwLGZwLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycnguZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQzM2RlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycnguZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIE0zMlJ4IGFzc2VtYmxlciB0ZXN0c3VpdGUuCi0KLWlmIFtpc3RhcmdldCBtMzJyKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJtMzJyeCIKLSAgICBydW5fZHVtcF90ZXN0ICJmc2xvdHgiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsYXgtMiIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycngucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycngucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2ZGFiMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotIyBUZXN0IG5ldyBpbnN0cnVjdGlvbnMKLWJyYW5jaHBvaW50OgotCQotCS50ZXh0Ci0JLmdsb2JhbCBiY2wKLWJjbDoKLQliY2wgYnJhbmNocG9pbnQKLQotCS50ZXh0Ci0JLmdsb2JhbCBibmNsCi1ibmNsOgotCWJuY2wgYnJhbmNocG9pbnQKLQotCS50ZXh0Ci0JLmdsb2JhbCBjbXB6Ci1jbXB6OgotCWNtcHogZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBjbXBlcQotY21wZXE6Ci0JY21wZXEgZnAsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgbWFjbGgxCi1tYWNsaDE6Ci0JbWFjbGgxIGZwLCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBtYWNzbDAKLW1zYmxvOgotCW1zYmxvIGZwLCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdWx3dTEKLW11bHd1MToKLQltdWx3dTEgZnAsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG1hY3d1MQotbWFjd3UxOgotCW1hY3d1MSBmcCwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgc2FkZAotc2FkZDoKLQlzYWRkCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHNhdGIKLXNhdGI6Ci0Jc2F0YiBmcCwgZnAKLQotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdWxoaQotbXVsaGk6Ci0JbXVsaGkgZnAsIGZwLCBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdWxsbwotbXVsbG86Ci0JbXVsbG8gZnAsIGZwLCBhMAotCQotCS50ZXh0Ci0JLmdsb2JhbCBkaXZoCi1kaXZoOgotCWRpdmggZnAsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG1hY2hpCi1tYWNoaToKLQltYWNoaSBmcCwgZnAsIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG1hY2xvCi1tYWNsbzoKLQltYWNsbyBmcCwgZnAsIGEwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjaGkKLW12ZmFjaGk6Ci0JbXZmYWNoaSBmcCwgYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNtaQotbXZmYWNtaToKLQltdmZhY21pIGZwLCBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY2xvCi1tdmZhY2xvOgotCW12ZmFjbG8gZnAsIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG12dGFjaGkKLW12dGFjaGk6Ci0JbXZ0YWNoaSBmcCwgYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgbXZ0YWNsbwotbXZ0YWNsbzoKLQltdnRhY2xvIGZwLCBhMAotCQotCS50ZXh0Ci0JLmdsb2JhbCByYWMKLXJhYzoKLQlyYWMgYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgcmFjX2RzCi1yYWNfZHM6Ci0JcmFjIGExLCBhMAotCQotCS50ZXh0Ci0JLmdsb2JhbCByYWNfZHNpCi1yYWNfZHNpOgotCXJhYyBhMCwgYTEsICMxCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHJhY2gKLXJhY2g6Ci0JcmFjaCBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCByYWNoX2RzCi1yYWNoX2RzOgotCXJhY2ggYTAsIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHJhY2hfZHNpCi1yYWNoX2RzaToKLQlyYWNoIGExLCBhMCwgIzIKLQkKLSMgVGVzdCBleHBsaWNpdGx5IHBhcmFsbGVsIGFuZCBpbXBsaWNpdGx5IHBhcmFsbGVsIGluc3RydWN0aW9ucwotIyBJbmNsdWRpbmcgYXBwYXJlbnQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgcmVvcmRlcmluZy4KLQkudGV4dAotCS5nbG9iYWwgYmNfX2FkZAotYmNfX2FkZDoKLQliYyBiY2wgfHwgYWRkIGZwLCBmcAotIyBVc2UgYmMucyBoZXJlIGFzIGJjIGlzIHJlbGF4YWJsZSBhbmQgdGh1cyBhIG5vcCB3aWxsIGJlIGVtaXR0ZWQuCi0JYmMucyBiY2wKLQlhZGQgZnAsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgYmNsX19hZGRpCi1iY2xfX2FkZGk6CQotCWJjbCBiY2wgfHwgYWRkaSBmcCwgIzc3Ci0JYWRkaSBmcCwgIzc3Ci0jIFVzZSBiY2wucyBoZXJlIGFzIGJjbCBpcyByZWxheGFibGUgYW5kIHRodXMgdGhlIHBhcmFsbGVsaXphdGlvbiB3b24ndCBoYXBwZW4uCi0JYmNsLnMgYmNsCi0KLQkudGV4dAotCS5nbG9iYWwgYmxfX2FkZHYKLWJsX19hZGR2OgotCWJsIGJjbCB8fCBhZGR2IGZwLCBmcAotCWFkZHYgZnAsIGZwCi0jIFVzZSBibC5zIGhlcmUgYXMgYmwgaXMgcmVsYXhhYmxlIGFuZCB0aHVzIHRoZSBwYXJhbGxlbGl6YXRpb24gd29uJ3QgaGFwcGVuLgotCWJsLnMgYmNsCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGJuY19fYWRkeAotYm5jX19hZGR4OgotCWJuYyBiY2wgfHwgYWRkeCBmcCwgZnAKLSMgVXNlIGJuYy5zIGhlcmUgYXMgYm5jIGlzIHJlbGF4YWJsZSBhbmQgdGh1cyB0aGUgcGFyYWxsZWxpemF0aW9uIGF0dGVtcHQgd29uJ3QKLSMgaGFwcGVuLiAgVGhpbmdzIHN0aWxsIHdvbid0IGJlIHBhcmFsbGVsaXplZCwgYnV0IHdlIHdhbnQgdGhpcyB0ZXN0IHRvIHRyeS4KLQlibmMucyBiY2wKLQlhZGR4IGZwLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIGJuY2xfX2FuZAotYm5jbF9fYW5kOgotCWJuY2wgYmNsIHx8IGFuZCBmcCwgZnAKLQlhbmQgZnAsIGZwCi0JYm5jbCBiY2wKLQotCS50ZXh0Ci0JLmdsb2JhbCBicmFfX2NtcAotYnJhX19jbXA6Ci0JYnJhIGJjbCB8fCBjbXAgZnAsIGZwCi0JY21wIGZwLCBmcAotIyBVc2UgYnJhLnMgaGVyZSBhcyBicmEgaXMgcmVsYXhhYmxlIGFuZCB0aHVzIHRoZSBwYXJhbGxlbGl6YXRpb24gd29uJ3QgaGFwcGVuLgotCWJyYS5zIGJjbAotCQotCS50ZXh0Ci0JLmdsb2JhbCBqbF9fY21wZXEKLWpsX19jbXBlcToKLQlqbCBmcCB8fCBjbXBlcSBmcCwgZnAKLQljbXBlcSBmcCwgZnAKLQlqbCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBqbXBfX2NtcHUKLWptcF9fY21wdToKLQlqbXAgZnAgfHwgY21wdSBmcCwgZnAKLQljbXB1IGZwLCBmcAotCWptcCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBsZF9fY21wegotbGRfX2NtcHo6Ci0JbGQgZnAsIEBmcCB8fCBjbXB6IHIxCi0JY21weiByMQotCWxkIGZwLCBAZnAgCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGxkX19sZGkKLWxkX19sZGk6Ci0JbGQgZnAsIEByMSsgfHwgbGRpIHIyLCAjNzcKLQlsZCBmcCwgQHIxKyAKLQlsZGkgcjIsICM3NwotCQotCS50ZXh0Ci0JLmdsb2JhbCBsZGJfX212Ci1sZGJfX212OgotCWxkYiBmcCwgQGZwIHx8IG12IHIyLCBmcAotCWxkYiBmcCwgQGZwIAotCW12IHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIGxkaF9fbmVnCi1sZGhfX25lZzoKLQlsZGggZnAsIEBmcCB8fCBuZWcgcjIsIGZwCi0JbGRoIGZwLCBAZnAKLQluZWcgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgbGR1Yl9fbm9wCi1sZHViX19ub3A6Ci0JbGR1YiBmcCwgQGZwIHx8IG5vcAotCWxkdWIgZnAsIEBmcCAKLQlub3AKLQotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoX19ub3QKLWxkdWhfX25vdDoKLQlsZHVoIGZwLCBAZnAgfHwgbm90IHIyLCBmcAotCWxkdWggZnAsIEBmcAotCW5vdCByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBsb2NrX19vcgotbG9ja19fb3I6Ci0JbG9jayBmcCwgQGZwIHx8IG9yIHIyLCBmcAotCWxvY2sgZnAsIEBmcAotCW9yIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmNfX3N1YgotbXZmY19fc3ViOgotCW12ZmMgZnAsIGNyMSB8fCBzdWIgcjIsIGZwCi0JbXZmYyBmcCwgY3IxCi0Jc3ViIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIG12dGNfX3N1YnYKLW12dGNfX3N1YnY6Ci0JbXZ0YyBmcCwgY3IyIHx8IHN1YnYgcjIsIGZwCi0JbXZ0YyBmcCwgY3IyCi0Jc3VidiByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBydGVfX3N1YngKLXJ0ZV9fc3VieDoKLQlydGUgfHwgc3ViIHIyLCBmcAotCXJ0ZQotCXN1YnggcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc2xsX194b3IKLXNsbF9feG9yOgotCXNsbCBmcCwgcjEgfHwgeG9yIHIyLCBmcAotCXNsbCBmcCwgcjEKLQl4b3IgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc2xsaV9fbWFjaGkKLXNsbGlfX21hY2hpOgotCXNsbGkgZnAsICMyMiB8fCBtYWNoaSByMiwgZnAKLQlzbGxpIGZwLCAjMjIKLQltYWNoaSByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzcmFfX21hY2xoMQotc3JhX19tYWNsaDE6Ci0Jc3JhIGZwLCBmcCB8fCBtYWNsaDEgcjIsIGZwCi0Jc3JhIGZwLCBmcAotCW1hY2xoMSByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzcmFpX19tYWNsbwotc3JhaV9fbWFjbG86Ci0Jc3JhaSBmcCwgIzIyIHx8IG1hY2xvIHIyLCBmcAotCXNyYWkgZnAsICMyMgotCW1hY2xvIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHNybF9fbWFjd2hpCi1zcmxfX21hY3doaToKLQlzcmwgZnAsIGZwIHx8IG1hY3doaSByMiwgZnAKLQlzcmwgZnAsIGZwCi0JbWFjd2hpIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHNybGlfX21hY3dsbwotc3JsaV9fbWFjd2xvOgotCXNybGkgZnAsICMyMiB8fCBtYWN3bG8gcjIsIGZwCi0Jc3JsaSBmcCwgIzIyCi0JbWFjd2xvIHIyLCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9fbWFjd3UxCi1zdF9fbWFjd3UxOgotCXN0IGZwLCBAZnAgfHwgbWFjd3UxIHIyLCBmcAotCXN0IGZwLCBAZnAKLQltYWN3dTEgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc3RfX21zYmxvCi1zdF9fbXNibG86Ci0Jc3QgZnAsIEArZnAgfHwgbXNibG8gcjIsIGZwCi0Jc3QgZnAsIEArZnAgCi0JbXNibG8gcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc3RfX211bAotc3RfX211bDoKLQlzdCBmcCwgQC1mcCB8fCBtdWwgcjIsIGZwCi0Jc3QgZnAsIEAtZnAKLQltdWwgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc3RiX19tdWxoaQotc3RiX19tdWxoaToKLQlzdGIgZnAsIEBmcCB8fCBtdWxoaSByMiwgZnAKLQlzdGIgZnAsIEBmcAotCW11bGhpIHIyLCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBzdGhfX211bGxvCi1zdGhfX211bGxvOgotCXN0aCBmcCwgQGZwIHx8IG11bGxvIHIyLCBmcAotCXN0aCBmcCwgQGZwIAotCW11bGxvIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHRyYXBfX211bHdoaQotdHJhcF9fbXVsd2hpOgotCXRyYXAgIzIgfHwgbXVsd2hpIHIyLCBmcAotCXRyYXAgIzIKLQltdWx3aGkgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgdW5sb2NrX19tdWx3bG8KLXVubG9ja19fbXVsd2xvOgotCXVubG9jayBmcCwgQGZwIHx8IG11bHdsbyByMiwgZnAKLQl1bmxvY2sgZnAsIEBmcAotCW11bHdsbyByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRfX211bHd1MQotYWRkX19tdWx3dTE6Ci0JYWRkIGZwLCBmcCB8fCBtdWx3dTEgcjIsIGZwCi0JYWRkIGZwLCBmcAotCW11bHd1MSByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRpX19tdmZhY2hpCi1hZGRpX19tdmZhY2hpOgotCWFkZGkgZnAsICM3NyB8fCBtdmZhY2hpIHIyLCBhMAotCWFkZGkgZnAsICM3NwotCW12ZmFjaGkgcjIsIGEwCi0KLQkudGV4dAotCS5nbG9iYWwgYWRkdl9fbXZmYWNsbwotYWRkdl9fbXZmYWNsbzoKLQlhZGR2IGZwLCBmcCB8fCBtdmZhY2xvIHIyLCBhMQotCWFkZHYgZnAsIGZwCi0JbXZmYWNsbyByMiwgYTEKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGR4X19tdmZhY21pCi1hZGR4X19tdmZhY21pOgotCWFkZHggZnAsIGZwIHx8IG12ZmFjbWkgcjIsIGEwCi0JYWRkeCBmcCwgZnAKLQltdmZhY21pIHIyLCBhMAotCi0JLnRleHQKLQkuZ2xvYmFsIGFuZF9fbXZ0YWNoaQotYW5kX19tdnRhY2hpOgotCWFuZCBmcCwgZnAgfHwgbXZ0YWNoaSByMiwgYTAKLQlhbmQgZnAsIGZwCi0JbXZ0YWNoaSByMiwgYTAKLQkKLQkudGV4dAotCS5nbG9iYWwgY21wX19tdnRhY2xvCi1jbXBfX212dGFjbG86Ci0JY21wIGZwLCBmcCB8fCBtdnRhY2xvIHIyLCBhMAotCWNtcCBmcCwgZnAKLQltdnRhY2xvIHIyLCBhMAotCi0JLnRleHQKLQkuZ2xvYmFsIGNtcGVxX19yYWMKLWNtcGVxX19yYWM6Ci0JY21wZXEgZnAsIGZwIHx8IHJhYyBhMQotCWNtcGVxIGZwLCBmcAotCXJhYyBhMQotCi0JLnRleHQKLQkuZ2xvYmFsIGNtcHVfX3JhY2gKLWNtcHVfX3JhY2g6Ci0JY21wdSBmcCwgZnAgfHwgcmFjaCBhMCwgYTEKLQljbXB1IGZwLCBmcAotCXJhY2ggYTEsIGExLCAjMQotCi0JLnRleHQKLQkuZ2xvYmFsIGNtcHpfX3NhZGQKLWNtcHpfX3NhZGQ6Ci0JY21weiBmcCB8fCBzYWRkCi0JY21weiBmcAotCXNhZGQKLQotCi0JCi0jIFRlc3QgcHJpdmF0ZSBpbnN0cnVjdGlvbnMJCi0JLnRleHQKLQkuZ2xvYmFsIHNjCi1zYzoKLQlzYwotCXNhZGQKLQkKLQkudGV4dAotCS5nbG9iYWwgc25jCi1zbmM6Ci0Jc25jCi0Jc2FkZCAKLQkKLQkudGV4dAotCS5nbG9iYWwgamMKLWpjOgotCWpjIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGpuYwotam5jOgotCWpuYyBmcAotCQkKLQkudGV4dAotCS5nbG9iYWwgcGNtcGJ6Ci1wY21wYno6Ci0JcGNtcGJ6IGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHNhdAotc2F0OgotCXNhdCBmcCwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgc2F0aAotc2F0aDoKLQlzYXRoIGZwLCBmcCAKLQotCi0jIFRlc3QgcGFyYWxsZWwgdmVyc2lvbnMgb2YgdGhlIHByaXZhdGUgaW5zdHJ1Y3Rpb25zCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGpjX19wY21wYnoKLWpjX19wY21wYno6Ci0JamMgZnAgfHwgcGNtcGJ6IGZwCi0JamMgZnAgCi0JcGNtcGJ6IGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGpuY19fbGRpCi1qbmNfX2xkaToKLQlqbmMgZnAgfHwgbGRpIGZwLCAjNzcKLQlqbmMgZnAKLQlsZGkgZnAsICM3NwotCQotCS50ZXh0Ci0JLmdsb2JhbCBzY19fbXYKLXNjX19tdjoKLQlzYyB8fCBtdiBmcCwgcjIKLQlzYyAKLQltdiBmcCwgcjIKLQotCS50ZXh0Ci0JLmdsb2JhbCBzbmNfX25lZwotc25jX19uZWc6Ci0Jc25jIHx8IG5lZyBmcCwgcjIKLQlzbmMgCi0JbmVnIGZwLCByMgotCQotIyBUZXN0IGF1dG9tYXRpYyBhbmQgZXhwbGljaXQgcGFyYWxsZWxpc2F0aW9uIG9mIGluc3RydWN0aW9ucwotCS50ZXh0Ci0JLmdsb2JhbCBub3BfX3NhZGQKLW5vcF9fc2FkZDoKLQlub3AKLQlzYWRkCi0KLQkudGV4dAotCS5nbG9iYWwgc2FkZF9fbm9wCi1zYWRkX19ub3A6Ci0Jc2FkZAotCW5vcAotCi0JLnRleHQKLQkuZ2xvYmFsIHNhZGRfX25vcF9yZXZlcnNlCi1zYWRkX19ub3BfcmV2ZXJzZToKLQlzYWRkIHx8IG5vcAotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZF9fbm90Ci1hZGRfX25vdDoKLQlhZGQgIHIwLCByMQotCW5vdCAgcjMsIHI1Ci0KLQkudGV4dAotCS5nbG9iYWwgYWRkX19ub3RfX2Rlc3RfY2xhc2gKLWFkZF9fbm90X2Rlc3RfY2xhc2g6Ci0JYWRkICByMywgcjQKLQlub3QgIHIzLCByNQotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZF9fbm90X19zcmNfY2xhc2gKLWFkZF9fbm90X19zcmNfY2xhc2g6Ci0JYWRkICByMywgcjQKLQlub3QgIHI1LCByMwotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZF9fbm90X19ub19jbGFzaAotYWRkX19ub3RfX25vX2NsYXNoOgotCWFkZCAgcjMsIHI0Ci0Jbm90ICByNCwgcjUKLQotCS50ZXh0Ci0JLmdsb2JhbCBtdWxfX3NyYQotbXVsX19zcmE6Ci0JbXVsICByMSwgcjIKLQlzcmEgIHIzLCByNAotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdWxfX3NyYV9fcmV2ZXJzZV9zcmNfY2xhc2gKLW11bF9fc3JhX19yZXZlcnNlX3NyY19jbGFzaDoKLQltdWwgIHIxLCByMwotCXNyYSAgcjMsIHI0Ci0JCi0JLnRleHQKLQkuZ2xvYmFsIGJjX19hZGRfCi1iY19fYWRkXzoKLQliYy5zIGxhYmVsCi0JYWRkIHIxLCByMgotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZF9fYmMKLWFkZF9fYmM6Ci0JYWRkIHIzLCByNAotCWJjLnMgIGxhYmVsCi0KLQkudGV4dAotCS5nbG9iYWwgYmNfX2FkZF9fZm9yY2VkX3BhcmFsbGVsCi1iY19fYWRkX19mb3JjZWRfcGFyYWxsZWw6Ci0JYmMgbGFiZWwgfHwgYWRkIHI1LCByNgotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZF9fYmNfX2ZvcmNlZF9wYXJhbGxlbAotYWRkX19iY19fZm9yY2VkX3BhcmFsbGVsOgotCWFkZCByNywgcjggfHwgYmMgbGFiZWwKLWxhYmVsOgotCW5vcAotCi07IEFkZGl0aW9uYWwgdGVzdGNhc2VzLgotOyBUaGVzZSBpbnNucyB3ZXJlIGFkZGVkIHRvIHRoZSBjaGlwIGxhdGVyLgotCi0JLnRleHQKLW11bHdoaToKLQltdWx3aGkgZnAsIGZwLCBhMAotCW11bHdoaSBmcCwgZnAsIGExCi0JCi1tdWx3bG86Ci0JbXVsd2xvIGZwLCBmcCwgYTAKLQltdWx3bG8gZnAsIGZwLCBhMQotCi1tYWN3aGk6Ci0JbWFjd2hpIGZwLCBmcCwgYTAKLQltYWN3aGkgZnAsIGZwLCBhMQotCi1tYWN3bG86Ci0JbWFjd2xvIGZwLCBmcCwgYTAKLQltYWN3bG8gZnAsIGZwLCBhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9vdXRvZnJhbmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL291dG9mcmFuZ2UucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwZDMxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL291dG9mcmFuZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi07IFRlc3QgZXJyb3IgbWVzc2FnZXMgd2hlcmUgYnJhbmNoZXMgYXJlIG91dCBvZiByYW5nZS4KLQotOyB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IG0zMnItKi0qIH0gfQotCi0JLnRleHQKLQkuZ2xvYmFsIGZvbwotZm9vOgotCWJsLnMgbGFiZWwKLQkJOyB7IGRnLWVycm9yICJvdXQgb2YgcmFuZ2UiICJvdXQgb2YgcmFuZ2UgYmwucyIgeyB0YXJnZXQgKi0qLSogfSB7IDggfSB9Ci0JYm5jLnMgbGFiZWwKLQkJOyB7IGRnLWVycm9yICJvdXQgb2YgcmFuZ2UiICJvdXQgb2YgcmFuZ2UgYm5jLnMiIHsgdGFyZ2V0ICotKi0qIH0geyAxMCB9IH0KLQlicmEucyBsYWJlbAotCQk7IHsgZGctZXJyb3IgIm91dCBvZiByYW5nZSIgIm91dCBvZiByYW5nZSBicmEucyIgeyB0YXJnZXQgKi0qLSogfSB7IDEyIH0gfQotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLWxhYmVsOgotCWptcCByMTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNGZjYjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogcmVsYXgtMQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAqIDxEb2VzTm90V29yaz46Ci0gKjA6CTcwIDAwIDcwIDAwICoJbm9wIC0+IG5vcAotCi0wKjQgPFdvcms+OgotICo0Ogk3MCAwMCA3MCAwMCAqCW5vcCAtPiBub3AKLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLmJyYW5jaDoKLQotMCogPGJyYW5jaD46Ci0gKjA6CWZmIDAwIDAwIDAxIAlicmEgNCA8V29yaz4KLVsgCV0qMDogUl9NMzJSXzI2X1BDUkVMCS50ZXh0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGUxMmMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotOyBUZXN0IHJlbGF4YXRpb24gaW50byBub24temVybyBvZmZzZXQgdG8gZGlmZmVyZW50IHNlZ21lbnQuCi0KLQkuc2VjdGlvbiAuYnJhbmNoLCAiYXgiLEBwcm9nYml0cwotCS5iYWxpZ24gNAotYnJhbmNoOgotICAgICAgICBicmEgV29yawotCi0KLQkuc2VjdGlvbiAudGV4dAotICAgICAgICAuYmFsaWduIDQKLURvZXNOb3RXb3JrOgotCW5vcAotCW5vcAotCi1Xb3JrOgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0yLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4M2U4Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTIuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNhczogLS1tMzJyeAotI29iamR1bXA6IC1kcgotI25hbWU6IHJlbGF4LTIKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAgPGxhYmVsMT46Ci0gICAwOglmZCAwMCAwMCA4MyAJYm5jIDIwYyA8bGFiZWwzPgotICAgNDoJNzAgMDAgZjAgMDAgCW5vcCBcfFx8IG5vcAotICAgODoJNDMgMDMgYzIgMDIgCWFkZGkgcjMsWyNdMyBcfFx8IGFkZGkgcjIsWyNdMgotCi0wKzBjIDxsYWJlbDI+OgotCS4uLgotCi0wKzAyMGMgPGxhYmVsMz46Ci0gMjBjOgk3MCAwMCBmMCAwMCAJbm9wIFx8XHwgbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzlkZWM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotOyBUZXN0IHdoZXRoZXIgcGFyYWxsZWwgaW5zbnMgZ2V0IGluYXBwcm9wcmlhdGVseSBtb3ZlZCBkdXJpbmcgcmVsYXhhdGlvbi4KLQotICAgICAgICAudGV4dAotbGFiZWwxOgotICAgICAgICBibmMgICAgIGxhYmVsMwotICAgICAgICBub3AKLSAgICAgICAgYWRkaSAgICByMywgIzMgfHwgYWRkaSAgcjIsICMyCi1sYWJlbDI6Ci0gICAgICAgIC5zcGFjZSA1MTIKLWxhYmVsMzoKLSAgICAgICAgbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiMTM0NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IHVwcGVyY2FzZQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8Zm9vPjoKLSAgIDA6CTEwIDgxIDEwIDkxICoJbXYgcjAscjEgLT4gbXZmYyByMCxjYnIKLQotMCswMDA0IDxoaWdoPjoKLSAgIDQ6CWQwIGMwIDAwIDAwIAlzZXRoIHIwLCMweDAKLVsgCV0qNDogUl9NMzJSX0hJMTZfVUxPCVsuXXRleHQKLQotMCswMDA4IDxzaGlnaD46Ci0gICA4OglkMCBjMCAwMCAwMCAJc2V0aCByMCwjMHgwCi1bIAldKjg6IFJfTTMyUl9ISTE2X1NMTwlbLl10ZXh0Ci0KLTArMDAwYyA8bG93PjoKLSAgIGM6CTgwIGUwIDAwIDBjIAlvcjMgcjAscjAsIzB4YwotWyAJXSpjOiBSX00zMlJfTE8xNglbLl10ZXh0Ci0KLTArMDAxMCA8c2RhPjoKLSAgMTA6CTgwIGEwIDAwIDAwIAlhZGQzIHIwLHIwLCMwCi1bIAldKjEwOiBSX00zMlJfU0RBMTYJc2RhdmFyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhZWFmZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JhbCBmb28KLWZvbzoKLQltdiBSMCxSMQotCW12ZmMgUjAsQ0JSCi0KLWhpZ2g6Ci0Jc2V0aCByMCwjSElHSChoaWdoKQotc2hpZ2g6Ci0Jc2V0aCByMCwjU0hJR0goc2hpZ2gpCi1sb3c6Ci0Jb3IzIHIwLHIwLCNMT1cobG93KQotc2RhOgotCWFkZDMgcjAscjAsI1NEQShzZGF2YXIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3dyb25nc2l6ZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci93cm9uZ3NpemUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4ZjQ3OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3dyb25nc2l6ZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotOyBUZXN0IGVycm9yIG1lc3NhZ2VzIGluIGluc3RhbmNlcyB3aGVyZSBhbiBpbnNuIG9mIGEgcGFydGljdWxhciBzaXplCi07IGlzIHJlcXVpcmVkLgotCi07IHsgZGctZG8gYXNzZW1ibGUgeyB0YXJnZXQgbTMyci0qLSogfSB9Ci0KLXdyb25nc2l6ZToKLQljbXBpIHI4LCMxMCAtPiBsZGkgcjAsIzggIDsgeyBkZy1lcnJvciAibm90IGEgMTYgYml0IGluc3RydWN0aW9uIiB9Ci0JbGRpIHIwLCM4IC0+IGNtcGkgcjgsIzEwICA7IHsgZGctZXJyb3IgIm5vdCBhIDE2IGJpdCBpbnN0cnVjdGlvbiIgfQotCWNtcGkgcjgsIzEwIHx8IGxkaSByMCwjOCAgOyB7IGRnLWVycm9yICJub3QgYSAxNiBiaXQgaW5zdHJ1Y3Rpb24iIH0KLQlsZGkgcjAsIzggfHwgY21waSByOCwjMTAgIDsgeyBkZy1lcnJvciAibm90IGEgMTYgYml0IGluc3RydWN0aW9uIiB9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvZ2FzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9nYXMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdlZWZhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9nYXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIwotIyBTb21lIG02OGstY29mZiB0ZXN0cwotIwotaWYgW2lzdGFyZ2V0IG02OCotKi1jb2ZmXSB0aGVuIHsKLSAgICBnYXNfdGVzdCAicDI0MzAucyIgIiIgJHN0ZG9wdGxpc3QgImxvY2FsIGJyYW5jaCBub3QgaW4gdGV4dCBzZWN0aW9uIgotCi0gICAgZ2FzX3Rlc3QgInAyNDMwYS5zIiAiIiAkc3Rkb3B0bGlzdCAibG9jYWwgYnJhbmNoIG5vdCBpbiB0ZXh0IHNlY3Rpb24iCi0KLSAgICBnYXNfdGVzdCAidDEucyIgIiIgJHN0ZG9wdGxpc3QgIm11bHRpcGxlIC5maWxlIGRpcmVjdGl2ZXMiCi0KLSAgICBnYXNfdGVzdCAicDIzODkucyIgIiIgJHN0ZG9wdGxpc3QgImJzcyBmaWxsIgotCi0gICAgc2V0dXBfeGZhaWwgbTY4Ki0qLWNvZmYKLSAgICBnYXNfdGVzdF9lcnJvciAicDIzODlhLnMiICIiICJkZXRlY3QgYnNzIGZpbGwgd2l0aCBub24temVybyBkYXRhIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhOTNlOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODkucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgIEkgcmVhY2hlZCBhIHBvaW50IHdoZXJlIHRoZSBmaWxlIGxvb2tzCi0jIGNsZWFuIGFuZCBjb21wbGllcyB3aXRoIGdhcyBzeW50YXgsIGJ1dCBpdCBjb3JlIGR1bXBzIGdhcy4gSGVyZSdzIGEKLSMgbGl0dGxlIGdkYiBpbmZvOgotIwotIyBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBzaWduYWwgMTEsIFNlZ21lbnRhdGlvbiBmYXVsdC4KLSMgIzAgIDB4NjMyM2MgaW4gbWVtY3B5ICgpCi0jIChnZGIpIGJ0Ci0jICMwICAweDYzMjNjIGluIG1lbWNweSAoKQotIyAjMSAgMHhmMmIwIGluIGZpbGxfc2VjdGlvbiAoYWJmZD0weGVhZWU4LCBmaWxlaGRyPTB4OGE3ZjQsIAotIyAgICAgZmlsZV9jdXJzb3I9MHhmN2ZmZjY1NCkgYXQgb2JqLWZvcm1hdC5jOjUzNAotIyAjMiAgMHgxMTJhOCBpbiB3cml0ZV9vYmplY3RfZmlsZSAoKSBhdCBvYmotZm9ybWF0LmM6MTc4NgotIyAjMyAgMHgxM2VmOCBpbiBtYWluIChhcmdjPTUsIGFyZ3Y9MHhmN2ZmZjdiYykgYXQgLi4vLi4vcDMvZ2FzL2FzLmM6MzEwCi0jIChnZGIpIAotIwotIyBnYXMgZGlkIG1hbmFnZSB0byBjcmVhdGUgdGhlIC5vIGZpbGUgYXQgdGhpcyBwb2ludC4KLQotCS5ic3MKLQotX0FTSUNfSU5UX1RCTDogICAuc3BhY2UgMzIsMAl8IGtlZXAgaW50ZXJydXB0IHJvdXRpbmVzIGhlcmUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OWEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OWEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiMjc2NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODlhLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQkuYnNzCi0KLV9BU0lDX0lOVF9UQkw6ICAgLnNwYWNlIDMyLDEJfCBrZWVwIGludGVycnVwdCByb3V0aW5lcyBoZXJlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTcyM2Q5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMC5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIFRoaXMgZGlmZmVycyBmcm9tIHAyNDMwYS5zICh0aGUgY3VzdG9tZXIncyBhY3R1YWwgc291cmNlIGZpbGUpIG9ubHkKLSMgaW4gd2hpdGVzcGFjZSBhbmQgY29tbWVudHMuICBTdHJhbmdlbHksIHRoaXMgZmlsZSBnYXZlIG5vIHByb2JsZW1zLi4uCi0KLQkuc2VjdCBmb28KLXRhZzoKLQlicmEgdGFnCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzBhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzBhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMWZiMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwYS5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0gICAgLnNlY3QgZm9vCi0KLXRhZzoKLQlicmEgdGFnCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvdDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi90MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzAxNWYyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi90MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyAxICJsaWJnY2MxLlMiCi0jIDQyICJsaWJ4eXoxLlMiCi0jIDI1OSAibGliZ2NjMS5TIgotCS50ZXh0Ci0JLnByb2MKLXwjUFJPQyMgMDQKLQkuZ2xvYmwJIF9fbXVsc2kzICAgICAgCi0gX19tdWxzaTMgICAgICA6Ci18I1BST0xPR1VFIyAwCi0JbGluawkgICVhNiAgICAgICAsIzAKLQlhZGRsCSMtTEYxNCwgICVzcCAgICAgICAKLQltb3ZlbWwJI0xTMTQsICAlc3AgICAgICAgQAotfCNQUk9MT0dVRSMgMQotCW1vdmV3CSAgJWE2ICAgICAgIEAoMHg4KSwgICAlZDAgICAgICAgCSAKLQltdWx1dwkgICVhNiAgICAgICBAKDB4ZSksICAgJWQwICAgICAgIAkgCi0JbW92ZXcJICAlYTYgICAgICAgQCgweGEpLCAgICVkMSAgICAgICAJIAotCW11bHV3CSAgJWE2ICAgICAgIEAoMHhjKSwgICAlZDEgICAgICAgCSAKLQlhZGR3CSAgJWQxICAgICAgICwgICAlZDAgICAgICAgCi0JbHNsbAkjOCwgICAlZDAgICAgICAgCi0JbHNsbAkjOCwgICAlZDAgICAgICAgCi0JbW92ZXcJICAlYTYgICAgICAgQCgweGEpLCAgICVkMSAgICAgICAJIAotCW11bHV3CSAgJWE2ICAgICAgIEAoMHhlKSwgICAlZDEgICAgICAgCSAKLQlhZGRsCSAgJWQxICAgICAgICwgICAlZDAgICAgICAgCi0JanJhCUxFMTQKLUxFMTQ6Ci18I1BST0xPR1VFIyAyCi0JbW92ZW1sCSAgJXNwICAgICAgIEAsICNMUzE0Ci0JdW5sawkgICVhNiAgICAgICAKLXwjUFJPTE9HVUUjIDMKLQlydHMKLQlMRjE0ID0gNAotCUxTMTQgPSAweDAwMDIJCSAKLQlMRkYxNCA9IDAKLSMgMzU0ICJsaWJnY2MxLlMiCi0JTFNTMTQgPSAweDAKLQlMVjE0ID0gMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9hbGwuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9hbGwuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGFiMmEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYWxsLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMKLSMgU29tZSBnZW5lcmljIG02OGsgdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBtNjgqLSotKl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3QgInQyLnMiICIiICIiICJjcm9zcy1zZWN0aW9uIGJyYW5jaCIKLSAgICBpZiBbaXN0YXJnZXQgbTY4Ki1tb3Rvcm9sYS1zeXN2XSB0aGVuIHsKLQlydW5fZHVtcF90ZXN0IHQyCi0gICAgfQotCi0gICAgZ2FzX3Rlc3QgInBpYzEucyIgIiIgIiIgIlBJQyBnZW5lcmF0aW9uIgotCi0gICAgZ2FzX3Rlc3QgImRpc3BlcnIucyIgIi1tNjgwMjAiICIiICJJbmNvcnJlY3QgRGlzcGxhY2VtZW50IHRvbyBsb25nIGVycm9yIgotCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInAyNDEwLnMiICIiICJvdXQtb2YtcmFuZ2UgJ2JyYXMnIgotCi0gICAgcnVuX2R1bXBfdGVzdCBwY3JlbAotICAgIHJ1bl9kdW1wX3Rlc3Qgb3BlcmFuZHMKLSAgICBydW5fZHVtcF90ZXN0IGNhcwotICAgIHJ1bl9kdW1wX3Rlc3QgYml0ZmllbGQKLSAgICBydW5fZHVtcF90ZXN0IGxpbmsKLSAgICBydW5fZHVtcF90ZXN0IGZtb3ZlbWwKLQotICAgIHNldCB0ZXN0bmFtZSAiNjgwMDAgb3BlcmFuZHMiCi0gICAgZ2FzX3J1biAib3BlcmFuZHMucyIgIi1tNjgwMDAiICIyPmVyci5vdXQiCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggImNoaWxkIHByb2Nlc3MgZXhpdGVkIGFibm9ybWFsbHkiICRjb21wX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCXZlcmJvc2UgIiRjb21wX291dHB1dCIgMwotCWZhaWwgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiBbcmVnZXhwX2RpZmYgImVyci5vdXQiICIkc3JjZGlyLyRzdWJkaXIvb3A2ODAwMC5kIl0gdGhlbiB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgcGFzcyAkdGVzdG5hbWUKLQl9Ci0gICAgfQotfQotaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgdW5zZXQgZXJyb3JJbmZvCi0gICAgfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIxYmRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBiaXRmaWVsZAotCi0jIFRlc3QgaGFuZGxpbmcgb2YgYml0ZmllbGQgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGJmZXh0cyAlYTBALDEsMiwlZDAKLTArMDA0IDxmb29cKygweHwpND4gYmZleHRzICVhMEAsMSw2LCVkMAotMCswMDggPGZvb1wrKDB4fCk4PiBiZmV4dHMgJWEwQCwzLDIsJWQwCi0wKzAwYyA8Zm9vXCsoMHh8KWM+IGJmZXh0cyAlYTBALDMsNiwlZDAKLTArMDEwIDxmb29cKygweHwpMTA+IGJmZXh0cyAlYTBALDEsMiwlZDAKLTArMDE0IDxmb29cKygweHwpMTQ+IGJmZXh0cyAlYTBALDEsNiwlZDAKLTArMDE4IDxmb29cKygweHwpMTg+IGJmZXh0cyAlYTBALDMsMiwlZDAKLTArMDFjIDxmb29cKygweHwpMWM+IGJmZXh0cyAlYTBALDMsNiwlZDAKLTArMDIwIDxmb29cKygweHwpMjA+IGJmc2V0ICVhMEAsMSwyCi0wKzAyNCA8Zm9vXCsoMHh8KTI0PiBiZnNldCAlYTBALDEsNgotMCswMjggPGZvb1wrKDB4fCkyOD4gYmZzZXQgJWEwQCwzLDIKLTArMDJjIDxmb29cKygweHwpMmM+IGJmc2V0ICVhMEAsMyw2Ci0wKzAzMCA8Zm9vXCsoMHh8KTMwPiBiZnNldCAlYTBALDEsMgotMCswMzQgPGZvb1wrKDB4fCkzND4gYmZzZXQgJWEwQCwxLDYKLTArMDM4IDxmb29cKygweHwpMzg+IGJmc2V0ICVhMEAsMywyCi0wKzAzYyA8Zm9vXCsoMHh8KTNjPiBiZnNldCAlYTBALDMsNgotMCswNDAgPGZvb1wrKDB4fCk0MD4gYmZleHRzICVhMEAsJWQxLCVkMiwlZDAKLTArMDQ0IDxmb29cKygweHwpNDQ+IGJmZXh0cyAlYTBALCVkMSwlZDIsJWQwCi0wKzA0OCA8Zm9vXCsoMHh8KTQ4PiBiZnNldCAlYTBALCVkMSwlZDIKLTArMDRjIDxmb29cKygweHwpNGM+IGJmc2V0ICVhMEAsJWQxLCVkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDJmNzU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgVGVzdCBoYW5kbGluZyBvZiBiaXRmaWVsZCBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KLQkudGV4dAotCS5nbG9ibAlmb28KLWZvbzoJCi0JYmZleHRzCSglYTApeyYxOiYyfSwlZDAKLQliZmV4dHMJKCVhMCl7JjE6JigyKzQpfSwlZDAKLQliZmV4dHMJKCVhMCl7JigxKzIpOiYyfSwlZDAKLQliZmV4dHMJKCVhMCl7JigxKzIpOiYoMis0KX0sJWQwCi0JYmZleHRzCSVhMEAsJjEsJjIsJWQwCi0JYmZleHRzCSVhMEAsJjEsJigyKzQpLCVkMAotCWJmZXh0cwklYTBALCYxKzIsJjIsJWQwCi0JYmZleHRzCSVhMEAsJigxKzIpLCYoMis0KSwlZDAKLQliZnNldAkoJWEwKXsmMTomMn0KLQliZnNldAkoJWEwKXsmMTomKDIrNCl9Ci0JYmZzZXQJKCVhMCl7JigxKzIpOiYyfQotCWJmc2V0CSglYTApeyYoMSsyKTomKDIrNCl9Ci0JYmZzZXQJJWEwQCwmMSwmMgotCWJmc2V0CSVhMEAsJjEsJigyKzQpCi0JYmZzZXQJJWEwQCwmMSsyLCYyCi0JYmZzZXQJJWEwQCwmKDErMiksJigyKzQpCi0JYmZleHRzCSglYTApeyVkMTolZDJ9LCVkMAotCWJmZXh0cwklYTBALCVkMSwlZDIsJWQwCi0JYmZzZXQJKCVhMCl7JWQxOiVkMn0KLQliZnNldAklYTBALCVkMSwlZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzA5NzMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogY2FzCi0KLSMgVGVzdCBwYXJzaW5nIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgY2FzIGluc3RydWN0aW9uCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGNhc3cgJWQwLCVkMSwlYTBACi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGNhc3cgJWQwLCVkMSwlYTBACi0wKzAwOCA8Zm9vXCsoMHh8KTg+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDBlIDxmb29cKygweHwpZT4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LEBcKCVkMFwpLEBcKCVkMVwpCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAxYSA8Zm9vXCsoMHh8KTFhPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsQFwoJWQwXCksQFwoJWQxXCkKLTArMDI2IDxmb29cKygweHwpMjY+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDJjIDxmb29cKygweHwpMmM+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCxAXCglZDBcKSxAXCglZDFcKQotMCswMzIgPGZvb1wrKDB4fCkzMj4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswMzggPGZvb1wrKDB4fCkzOD4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswM2UgPGZvb1wrKDB4fCkzZT4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LEBcKCVkMFwpLEBcKCVkMVwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY0ZTdmNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBUZXN0IHBhcnNpbmcgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBjYXMgaW5zdHJ1Y3Rpb24KLQkudGV4dAotCS5nbG9ibAlmb28KLWZvbzoJCi0JY2FzCSVkMCwlZDEsKCVhMCkKLQljYXMJJWQwLCVkMSwlYTBACi0JY2FzMgklZDA6JWQyLCVkMzolZDQsKCVhMCk6KCVhMSkKLQljYXMyCSVkMDolZDIsJWQzOiVkNCwoJWQwKTooJWQxKQotCWNhczIJJWQwOiVkMiwlZDM6JWQ0LCVhMEA6JWExQAotCWNhczIJJWQwOiVkMiwlZDM6JWQ0LEAoJWEwKTpAKCVhMSkKLQljYXMyCSVkMDolZDIsJWQzOiVkNCxAKCVkMCk6QCglZDEpCi0JY2FzMgklZDAsJWQyLCVkMywlZDQsKCVhMCksKCVhMSkKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCwoJWQwKSwoJWQxKQotCWNhczIJJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotCWNhczIJJWQwLCVkMiwlZDMsJWQ0LEAoJWEwKSxAKCVhMSkKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCxAKCVkMCksQCglZDEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Rpc3BlcnIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZGlzcGVyci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2QzYjdiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZGlzcGVyci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI05PX0FQUAotZ2NjMl9jb21waWxlZC46Ci1fX19nbnVfY29tcGlsZWRfYzoKLS50ZXh0Ci0JLmV2ZW4KLS5nbG9ibCBfZm9vCi1fZm9vOgotCWxpbmsgJWE2LCMtMTIKLQlmbW92ZXggJWE2QCgtMTIpLCVmcDAKLQlmbW92ZXggJWZwMCwlc3BALQotCWpic3IgX2JhcgotCWFkZHF3ICM4LCVzcAotCWFkZHF3ICM0LCVzcAotTDE6Ci0JdW5sayAlYTYKLQlydHMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTI3OTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogZm1vdmVtbAotCi0jIFRlc3QgaGFuZGxpbmcgb2YgZm1vdmVtbCBhbmQgZm1vdmVteCBpbnN0cnVjdGlvbnMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGZtb3ZlbCAlZnBjciwlYTBACi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGZtb3ZlbCAlZnBzciwlYTBACi0wKzAwOCA8Zm9vXCsoMHh8KTg+IGZtb3ZlbCAlZnBpYXIsJWEwQAotMCswMGMgPGZvb1wrKDB4fCljPiBmbW92ZW1sICVmcHNyLyVmcGNyLCVhMEAKLTArMDEwIDxmb29cKygweHwpMTA+IGZtb3ZlbWwgJWZwaWFyLyVmcGNyLCVhMEAKLTArMDE0IDxmb29cKygweHwpMTQ+IGZtb3ZlbWwgJWZwaWFyLyVmcHNyLCVhMEAKLTArMDE4IDxmb29cKygweHwpMTg+IGZtb3ZlbWwgJWZwaWFyLyVmcHNyLyVmcGNyLCVhMEAKLTArMDFjIDxmb29cKygweHwpMWM+IGZtb3ZlbCAlZnBjciwlZDAKLTArMDIwIDxmb29cKygweHwpMjA+IGZtb3ZlbCAlZnBzciwlZDAKLTArMDI0IDxmb29cKygweHwpMjQ+IGZtb3ZlbCAlZnBpYXIsJWQwCi0wKzAyOCA8Zm9vXCsoMHh8KTI4PiBmbW92ZWwgJWZwaWFyLCVhMAotMCswMmMgPGZvb1wrKDB4fCkyYz4gZm1vdmVsICVhMEAsJWZwY3IKLTArMDMwIDxmb29cKygweHwpMzA+IGZtb3ZlbCAlYTBALCVmcHNyCi0wKzAzNCA8Zm9vXCsoMHh8KTM0PiBmbW92ZWwgJWEwQCwlZnBpYXIKLTArMDM4IDxmb29cKygweHwpMzg+IGZtb3ZlbWwgJWEwQCwlZnBzci8lZnBjcgotMCswM2MgPGZvb1wrKDB4fCkzYz4gZm1vdmVtbCAlYTBALCVmcGlhci8lZnBjcgotMCswNDAgPGZvb1wrKDB4fCk0MD4gZm1vdmVtbCAlYTBALCVmcGlhci8lZnBzcgotMCswNDQgPGZvb1wrKDB4fCk0ND4gZm1vdmVtbCAlYTBALCVmcGlhci8lZnBzci8lZnBjcgotMCswNDggPGZvb1wrKDB4fCk0OD4gZm1vdmVsICVkMCwlZnBjcgotMCswNGMgPGZvb1wrKDB4fCk0Yz4gZm1vdmVsICVkMCwlZnBzcgotMCswNTAgPGZvb1wrKDB4fCk1MD4gZm1vdmVsICVkMCwlZnBpYXIKLTArMDU0IDxmb29cKygweHwpNTQ+IGZtb3ZlbCAlYTAsJWZwaWFyCi0wKzA1OCA8Zm9vXCsoMHh8KTU4PiBmbW92ZWwgIzEsJWZwY3IKLTArMDYwIDxmb29cKygweHwpNjA+IGZtb3ZlbCAjMSwlZnBzcgotMCswNjggPGZvb1wrKDB4fCk2OD4gZm1vdmVsICMxLCVmcGlhcgotMCswNzAgPGZvb1wrKDB4fCk3MD4gZm1vdmVtbCAjMSwlZnBzci8lZnBjcgotMCswNzggPGZvb1wrKDB4fCk3OD4gZm1vdmVtbCAjMSwlZnBpYXIvJWZwY3IKLTArMDgwIDxmb29cKygweHwpODA+IGZtb3ZlbWwgIzEsJWZwaWFyLyVmcHNyCi0wKzA4OCA8Zm9vXCsoMHh8KTg4PiBmbW92ZW1sICMxLCVmcGlhci8lZnBzci8lZnBjcgotMCswOTAgPGZvb1wrKDB4fCk5MD4gZm1vdmVteCAlZnAxLCVhMEAKLTArMDk0IDxmb29cKygweHwpOTQ+IGZtb3ZlbXggJWZwNCwlYTBACi0wKzA5OCA8Zm9vXCsoMHh8KTk4PiBmbW92ZW14ICVmcDcsJWEwQAotMCswOWMgPGZvb1wrKDB4fCk5Yz4gZm1vdmVteCAlZnAxLyVmcDMsJWEwQAotMCswYTAgPGZvb1wrKDB4fClhMD4gZm1vdmVteCAlZnAxLSVmcDQsJWEwQAotMCswYTQgPGZvb1wrKDB4fClhND4gZm1vdmVteCAlZnAwLyVmcDcsJWEwQAotMCswYTggPGZvb1wrKDB4fClhOD4gZm1vdmVteCAlZnAwLSVmcDcsJWEwQAotMCswYWMgPGZvb1wrKDB4fClhYz4gZm1vdmVteCAlYTBALCVmcDAKLTArMGIwIDxmb29cKygweHwpYjA+IGZtb3ZlbXggJWEwQCwlZnAxCi0wKzBiNCA8Zm9vXCsoMHh8KWI0PiBmbW92ZW14ICVhMEAsJWZwNwotMCswYjggPGZvb1wrKDB4fCliOD4gZm1vdmVteCAlYTBALCVmcDAvJWZwMwotMCswYmMgPGZvb1wrKDB4fCliYz4gZm1vdmVteCAlYTBALCVmcDAvJWZwNAotMCswYzAgPGZvb1wrKDB4fCljMD4gZm1vdmVteCAlYTBALCVmcDItJWZwNAotMCswYzQgPGZvb1wrKDB4fCljND4gZm1vdmVteCAlYTBALCVmcDEtJWZwNwotMCswYzggPGZvb1wrKDB4fCljOD4gZm1vdmVteCAlZnAwLCVhMEAtCi0wKzBjYyA8Zm9vXCsoMHh8KWNjPiBmbW92ZW14ICVmcDAtJWZwNywlYTBALQotMCswZDAgPGZvb1wrKDB4fClkMD4gZm1vdmVteCAlZnAwLyVmcDQsJWEwQC0KLTArMGQ0IDxmb29cKygweHwpZDQ+IGZtb3ZlbXggJWEwQFwrLCVmcDcKLTArMGQ4IDxmb29cKygweHwpZDg+IGZtb3ZlbXggJWEwQFwrLCVmcDAtJWZwNwotMCswZGMgPGZvb1wrKDB4fClkYz4gZm1vdmVteCAlYTBAXCssJWZwMy8lZnA3Ci0wKzBlMCA8Zm9vXCsoMHh8KWUwPiBmbW92ZW14ICVkMCwlYTBALQotMCswZTQgPGZvb1wrKDB4fCllND4gZm1vdmVteCAlYTBAXCssJWQwCi0wKzBlOCA8Zm9vXCsoMHh8KWU4PiBmbW92ZW14ICVmcDEvJWZwNSwlYTBALQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MjI0Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwucworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMgVGVzdCBoYW5kbGluZyBvZiB0aGUgZm1vdmVtbCBhbmQgZm1vdmVteCBpbnN0cnVjdGlvbnMuCi0JLnRleHQKLQkuZ2xvYmwJZm9vCi1mb286Ci0JZm1vdmVtbCAlZnBjciwlYTBACi0JZm1vdmVtbCAlZnBzciwlYTBACi0JZm1vdmVtbCAlZnBpYXIsJWEwQAotCWZtb3ZlbWwgJWZwY3IvJWZwc3IsJWEwQAotCWZtb3ZlbWwJJWZwY3IvJWZwaWFyLCVhMEAKLQlmbW92ZW1sCSVmcHNyLyVmcGlhciwlYTBACi0JZm1vdmVtbAklZnBjci8lZnBzci8lZnBpYXIsJWEwQAotCWZtb3ZlbWwJJWZwY3IsJWQwCi0JZm1vdmVtbAklZnBzciwlZDAKLQlmbW92ZW1sCSVmcGlhciwlZDAKLQlmbW92ZW1sCSVmcGlhciwlYTAKLQlmbW92ZW1sICVhMEAsJWZwY3IKLQlmbW92ZW1sICVhMEAsJWZwc3IKLQlmbW92ZW1sICVhMEAsJWZwaWFyCi0JZm1vdmVtbCAlYTBALCVmcHNyLyVmcGNyCi0JZm1vdmVtbAklYTBALCVmcGlhci8lZnBjcgotCWZtb3ZlbWwJJWEwQCwlZnBpYXIvJWZwc3IKLQlmbW92ZW1sCSVhMEAsJWZwc3IvJWZwaWFyLyVmcGNyCi0JZm1vdmVtbAklZDAsJWZwY3IKLQlmbW92ZW1sCSVkMCwlZnBzcgotCWZtb3ZlbWwJJWQwLCVmcGlhcgotCWZtb3ZlbWwJJWEwLCVmcGlhcgotCWZtb3ZlbWwJJjEsJWZwY3IKLQlmbW92ZW1sCSYxLCVmcHNyCi0JZm1vdmVtbAkmMSwlZnBpYXIKLQlmbW92ZW1sCSYxLCVmcGNyLyVmcHNyCi0JZm1vdmVtbAkmMSwlZnBjci8lZnBpYXIKLQlmbW92ZW1sCSYxLCVmcHNyLyVmcGlhcgotCWZtb3ZlbWwJJjEsJWZwaWFyLyVmcHNyLyVmcGNyCi0KLQlmbW92ZW14ICVmcDEsJWEwQAotCWZtb3ZlbXggJWZwNCwlYTBACi0JZm1vdmVteCAlZnA3LCVhMEAKLQlmbW92ZW14ICVmcDEvJWZwMywlYTBACi0JZm1vdmVteAklZnAxLSVmcDQsJWEwQAotCWZtb3ZlbXgJJWZwMC8lZnA3LCVhMEAKLQlmbW92ZW14CSVmcDAtJWZwNywlYTBACi0JZm1vdmVteCAlYTBALCVmcDAKLQlmbW92ZW14ICVhMEAsJWZwMQotCWZtb3ZlbXggJWEwQCwlZnA3Ci0JZm1vdmVteCAlYTBALCVmcDAvJWZwMwotCWZtb3ZlbXgJJWEwQCwlZnAwLyVmcDQKLQlmbW92ZW14CSVhMEAsJWZwMi0lZnA0Ci0JZm1vdmVteAklYTBALCVmcDEtJWZwNwotCWZtb3ZlbXgJJjEsJWEwQC0KLQlmbW92ZW14CSYweGZmLCVhMEAtCi0JZm1vdmVteAkmMHgxMSwlYTBALQotCWZtb3ZlbXgJJWEwQCssJjEKLQlmbW92ZW14CSVhMEArLCYweGZmCi0JZm1vdmVteAklYTBAKywmMHgxMQotCWZtb3ZlbXgJJWQwLCVhMEAtCi0JZm1vdmVteAklYTBAKywlZDAKLQlmbW92ZW14CSZzeW0sJWEwQC0KLQlzeW0JPQkweDIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUyNjNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5kCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IGxpbmsKLQotIyBUZXN0IGhhbmRsaW5nIG9mIGxpbmsgaW5zdHJ1Y3Rpb24uCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGxpbmt3ICVmcCwjMAotMCswMDQgPGZvb1wrKDB4fCk0PiBsaW5rdyAlZnAsIy00Ci0wKzAwOCA8Zm9vXCsoMHh8KTg+IGxpbmt3ICVmcCwjLTMyNzY3Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IGxpbmt3ICVmcCwjLTMyNzY4Ci0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBsaW5rbCAlZnAsIy0zMjc2OQotMCswMTYgPGZvb1wrKDB4fCkxNj4gbGlua3cgJWZwLCMzMjc2NwotMCswMWEgPGZvb1wrKDB4fCkxYT4gbGlua2wgJWZwLCMzMjc2OAotMCswMjAgPGZvb1wrKDB4fCkyMD4gbGlua2wgJWZwLCMzMjc2OQotMCswMjYgPGZvb1wrKDB4fCkyNj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMyMWRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyBUZXN0IGhhbmRsaW5nIG9mIGxpbmsgaW5zdHJ1Y3Rpb24uCi0JLnRleHQKLQkuZ2xvYmwJZm9vCi1mb286Ci0JbGluawklYTYsJjAKLQlsaW5rCSVhNiwmLTQKLQlsaW5rCSVhNiwmLTB4N2ZmZgotCWxpbmsJJWE2LCYtMHg4MDAwCi0JbGluawklYTYsJi0weDgwMDEKLQlsaW5rCSVhNiwmMHg3ZmZmCi0JbGluawklYTYsJjB4ODAwMAotCWxpbmsJJWE2LCYweDgwMDEKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3A2ODAwMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcDY4MDAwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGQ1YTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcDY4MDAwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgc3RkZXJyIG91dHB1dCBvZiBnYXMgLW02ODAwMCBvbiBvcGVyYW5kcy5zLgotIyBXZSBkb24ndCBib3RoZXIgdG8gbWF0Y2ggdGhlIGV4YWN0IGVycm9yIG1lc3NhZ2UsIGJ1dCBpbnN0ZWFkIGp1c3QKLSMgbG9vayBmb3IgdGhlIHN0YXRlbWVudHMgd2hpY2ggc2hvdWxkIGZhaWwuCi0KLS4qb3BlcmFuZHMuczogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLipzdGF0ZW1lbnQgYHRzdGwgJWEwJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6dzo0XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOnc6OFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDpsOjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6bDo0XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOmw6OFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwXCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwXCo0XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwXCo4XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAud1wqNFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC53XCo4XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLmxcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAubFwqNFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC5sXCo4XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTEud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgOFwoJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDhcKCVkMC53XCoyLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCA4XCglYTEud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCglYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCglZDAud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVkMCwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMS53XCoyLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWQwLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCglZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAwMCwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMDAwXCglYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJXphMUBcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlemExQFwoMTAwMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlemExLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlZDAsJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWExLndcKjIsJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglemExLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVkMCwlemExXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMDAwLCV6YTFcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMDAwXCglemExXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJXpkMTp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMCwlemQxOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCglemQxOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWEwLCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJXpkMSwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6YTEud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWEwLCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglemQxLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJXpkMS53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTBcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDBcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDBcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTBcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFswXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFswXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwLCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCglZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMDp3OjIsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDAsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTEsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTE6dzoyLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDAsJWEwXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTAsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVkMCwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTAsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDAsJWEwXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCg4LCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCg4LCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDhcKCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoJXBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlZDAsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVhMS53XCoyLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlYTEsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJXBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJWQwLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVhMSwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAwMCwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwMDBcKCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCV6cGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWQwLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLndcKjIsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlYTEsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCV6cGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglZDAsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVhMSwlenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwMDAsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDAwMFwoJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGNcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGNcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGNcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGNcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGNcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwY1xdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwLCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwLCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCglZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMDp3OjIsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMCwlcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGMsJWExXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMTp3OjIsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwYywlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXBjXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTEsJXBjXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwYywlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwYywlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJWQwLCVwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDAsJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwLCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCglZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMDp3OjIsJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTEsJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjLCVhMVxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTE6dzoyLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwYywlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXpwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCV6cGNcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGMsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslZDAsJXpwY1xdXCknIGlnbm9yZWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzODNjMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IG9wZXJhbmRzCi0KLSMgVGVzdCBoYW5kbGluZyBvZiBNSVQgYW5kIE1vdG9yb2xhIHN5bnRheCBvcGVyYW5kcwotIyBJZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSwgc2VlIGFsc28gb3A2ODAwMC5kLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiB0c3RsICVkMAotMCswMDIgPGZvb1wrKDB4fCkyPiB0c3RsICVhMAotMCswMDQgPGZvb1wrKDB4fCk0PiB0c3RsICVhMEAKLTArMDA2IDxmb29cKygweHwpNj4gdHN0bCAlYTBACi0wKzAwOCA8Zm9vXCsoMHh8KTg+IHRzdGwgJWEwQFwrCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IHRzdGwgJWEwQFwrCi0wKzAwYyA8Zm9vXCsoMHh8KWM+IHRzdGwgJWEwQC0KLTArMDBlIDxmb29cKygweHwpZT4gdHN0bCAlYTBALQotMCswMTAgPGZvb1wrKDB4fCkxMD4gdHN0bCAlYTBAXCg4XCkKLTArMDE0IDxmb29cKygweHwpMTQ+IHRzdGwgJWEwQFwoOFwpCi0wKzAxOCA8Zm9vXCsoMHh8KTE4PiB0c3RsICVhMEBcKDhcKQotMCswMWMgPGZvb1wrKDB4fCkxYz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKLTArMDI0IDxmb29cKygweHwpMjQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOndcKQotMCswMjggPGZvb1wrKDB4fCkyOD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzoyXCkKLTArMDJjIDxmb29cKygweHwpMmM+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6NFwpCi0wKzAzMCA8Zm9vXCsoMHh8KTMwPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjhcKQotMCswMzQgPGZvb1wrKDB4fCkzND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzAzOCA8Zm9vXCsoMHh8KTM4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDNjIDxmb29cKygweHwpM2M+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6MlwpCi0wKzA0MCA8Zm9vXCsoMHh8KTQwPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjRcKQotMCswNDQgPGZvb1wrKDB4fCk0ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo4XCkKLTArMDQ4IDxmb29cKygweHwpNDg+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpCi0wKzA0YyA8Zm9vXCsoMHh8KTRjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDUwIDxmb29cKygweHwpNTA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswNTQgPGZvb1wrKDB4fCk1ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDoyXCkKLTArMDU4IDxmb29cKygweHwpNTg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6NFwpCi0wKzA1YyA8Zm9vXCsoMHh8KTVjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjhcKQotMCswNjAgPGZvb1wrKDB4fCk2MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6d1wpCi0wKzA2NCA8Zm9vXCsoMHh8KTY0PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKLTArMDY4IDxmb29cKygweHwpNjg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCi0wKzA2YyA8Zm9vXCsoMHh8KTZjPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjRcKQotMCswNzAgPGZvb1wrKDB4fCk3MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzo4XCkKLTArMDc0IDxmb29cKygweHwpNzQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswNzggPGZvb1wrKDB4fCk3OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzA3YyA8Zm9vXCsoMHh8KTdjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjJcKQotMCswODAgPGZvb1wrKDB4fCk4MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo0XCkKLTArMDg0IDxmb29cKygweHwpODQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6OFwpCi0wKzA4OCA8Zm9vXCsoMHh8KTg4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDhjIDxmb29cKygweHwpOGM+IHRzdGwgJWEwQFwoMCswMDgsJWExOnc6MlwpCi0wKzA5MCA8Zm9vXCsoMHh8KTkwPiB0c3RsICVhMUBcKDArMDA4LCVhMDpsXCkKLTArMDk0IDxmb29cKygweHwpOTQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCi0wKzA5OCA8Zm9vXCsoMHh8KTk4PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjJcKQotMCswOWMgPGZvb1wrKDB4fCk5Yz4gdHN0bCAlYTBAXCgwKzAwOCwlYTE6dzoyXCkKLTArMGEwIDxmb29cKygweHwpYTA+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpCi0wKzBhNCA8Zm9vXCsoMHh8KWE0PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKQotMCswYTggPGZvb1wrKDB4fClhOD4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGFlIDxmb29cKygweHwpYWU+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBiNCA8Zm9vXCsoMHh8KWI0PiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKQotMCswYjggPGZvb1wrKDB4fCliOD4gdHN0bCBAXCgwKzNlOFwpCi0wKzBiZSA8Zm9vXCsoMHh8KWJlPiB0c3RsICVhMEBcKDArMTg2YTBcKQotMCswYzYgPGZvb1wrKDB4fCljNj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGNjIDxmb29cKygweHwpY2M+IHRzdGwgJWEwQFwoMCszZTgsJWQwOmxcKQotMCswZDIgPGZvb1wrKDB4fClkMj4gdHN0bCAlYTBAXCgwKzNlOCwlYTE6dzoyXCkKLTArMGQ4IDxmb29cKygweHwpZDg+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBkZSA8Zm9vXCsoMHh8KWRlPiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXCkKLTArMGU0IDxmb29cKygweHwpZTQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBlYSA8Zm9vXCsoMHh8KWVhPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCswZjAgPGZvb1wrKDB4fClmMD4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXCkKLTArMGY0IDxmb29cKygweHwpZjQ+IHRzdGwgJWEwQFwoMCsxODZhMFwpCi0wKzBmYyA8Zm9vXCsoMHh8KWZjPiB0c3RsICVhMEBcKDArMTg2YTBcKQotMCsxMDQgPGZvb1wrKDB4fCkxMDQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzEwYSA8Zm9vXCsoMHh8KTEwYT4gdHN0bCBAXCgwKzE4NmEwXCkKLTArMTEyIDxmb29cKygweHwpMTEyPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCsxMTggPGZvb1wrKDB4fCkxMTg+IHRzdGwgQFwoMCszZTgsJWQwOmxcKQotMCsxMWUgPGZvb1wrKDB4fCkxMWU+IHRzdGwgQFwoMCszZTgsJWExOnc6MlwpCi0wKzEyNCA8Zm9vXCsoMHh8KTEyND4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMTJhIDxmb29cKygweHwpMTJhPiB0c3RsIEBcKDArM2U4LCVkMDpsXCkKLTArMTMwIDxmb29cKygweHwpMTMwPiB0c3RsIEBcKDArMTg2YTBcKQotMCsxMzggPGZvb1wrKDB4fCkxMzg+IHRzdGwgQFwoMCsxODZhMFwpCi0wKzE0MCA8Zm9vXCsoMHh8KTE0MD4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE0NiA8Zm9vXCsoMHh8KTE0Nj4gdHN0bCBAXCgwKzNlOFwpCi0wKzE0YyA8Zm9vXCsoMHh8KTE0Yz4gdHN0bCBAXCgwKzAwMFwpCi0wKzE1MCA8Zm9vXCsoMHh8KTE1MD4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE1NiA8Zm9vXCsoMHh8KTE1Nj4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE1YyA8Zm9vXCsoMHh8KTE1Yz4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE2MiA8Zm9vXCsoMHh8KTE2Mj4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE2OCA8Zm9vXCsoMHh8KTE2OD4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE2ZSA8Zm9vXCsoMHh8KTE2ZT4gdHN0bCBAXCgwKzNlOFwpCi0wKzE3NCA8Zm9vXCsoMHh8KTE3ND4gdHN0bCBAXCgwKzNlOFwpCi0wKzE3YSA8Zm9vXCsoMHh8KTE3YT4gdHN0bCBAXCgwKzAwMFwpCi0wKzE3ZSA8Zm9vXCsoMHh8KTE3ZT4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzE4NiA8Zm9vXCsoMHh8KTE4Nj4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzE4YyA8Zm9vXCsoMHh8KTE4Yz4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCsxOTQgPGZvb1wrKDB4fCkxOTQ+IHRzdGwgQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxOWMgPGZvb1wrKDB4fCkxOWM+IHRzdGwgQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxYTIgPGZvb1wrKDB4fCkxYTI+IHRzdGwgQFwoMCszZThcKUBcKDArN2QwXCkKLTArMWFhIDxmb29cKygweHwpMWFhPiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMWIwIDxmb29cKygweHwpMWIwPiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWI0IDxmb29cKygweHwpMWI0PiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzdkMFwpCi0wKzFiYSA8Zm9vXCsoMHh8KTFiYT4gdHN0bCBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFjMCA8Zm9vXCsoMHh8KTFjMD4gdHN0bCBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzFjNCA8Zm9vXCsoMHh8KTFjND4gdHN0bCBAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCsxY2EgPGZvb1wrKDB4fCkxY2E+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxZDIgPGZvb1wrKDB4fCkxZDI+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxZDggPGZvb1wrKDB4fCkxZDg+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwXCkKLTArMWUwIDxmb29cKygweHwpMWUwPiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMWU4IDxmb29cKygweHwpMWU4PiB0c3RsIEBcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWVlIDxmb29cKygweHwpMWVlPiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMFwpCi0wKzFmNiA8Zm9vXCsoMHh8KTFmNj4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFmYyA8Zm9vXCsoMHh8KTFmYz4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzIwMCA8Zm9vXCsoMHh8KTIwMD4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCsyMDYgPGZvb1wrKDB4fCkyMDY+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsyMGMgPGZvb1wrKDB4fCkyMGM+IHRzdGwgQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsyMTAgPGZvb1wrKDB4fCkyMTA+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwXCkKLTArMjE2IDxmb29cKygweHwpMjE2PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjFlIDxmb29cKygweHwpMjFlPiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjI0IDxmb29cKygweHwpMjI0PiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjJjIDxmb29cKygweHwpMjJjPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjMyIDxmb29cKygweHwpMjMyPiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjM4IDxmb29cKygweHwpMjM4PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjNjIDxmb29cKygweHwpMjNjPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjQyIDxmb29cKygweHwpMjQyPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjQ2IDxmb29cKygweHwpMjQ2PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjRlIDxmb29cKygweHwpMjRlPiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjU2IDxmb29cKygweHwpMjU2PiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXClAXCgwKzdkMFwpCi0wKzI1ZSA8Zm9vXCsoMHh8KTI1ZT4gdHN0bCAlYTFAXCgwKzNlOCwlYTA6bFwpQFwoMCs3ZDBcKQotMCsyNjYgPGZvb1wrKDB4fCkyNjY+IHRzdGwgJWEwQFwoMCszZTgsJWExOnc6MlwpQFwoMCs3ZDBcKQotMCsyNmUgPGZvb1wrKDB4fCkyNmU+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyNzQgPGZvb1wrKDB4fCkyNzQ+IHRzdGwgJWEwQFwoMCszZTgsJWQwOmxcKUBcKDArMDAwXCkKLTArMjdhIDxmb29cKygweHwpMjdhPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjgyIDxmb29cKygweHwpMjgyPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjg4IDxmb29cKygweHwpMjg4PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjhlIDxmb29cKygweHwpMjhlPiB0c3RsICVhMEBcKDArMDAwLCVkMDpsXClAXCgwKzdkMFwpCi0wKzI5NCA8Zm9vXCsoMHh8KTI5ND4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzI5OCA8Zm9vXCsoMHh8KTI5OD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6bFwpQFwoMCswMDBcKQotMCsyOWMgPGZvb1wrKDB4fCkyOWM+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyYTIgPGZvb1wrKDB4fCkyYTI+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyYTYgPGZvb1wrKDB4fCkyYTY+IHBlYSAlcGNAXCgwKzJiMCA8Zm9vXCsoMHh8KTJiMD5cKQotMCsyYWEgPGZvb1wrKDB4fCkyYWE+IHBlYSAlcGNAXCgwKzJiNCA8Zm9vXCsoMHh8KTJiND5cKQotMCsyYWUgPGZvb1wrKDB4fCkyYWU+IHBlYSAlcGNAXCgwKzJiOCA8Zm9vXCsoMHh8KTJiOD5cKQotMCsyYjIgPGZvb1wrKDB4fCkyYjI+IHBlYSAlcGNAXCgwKzAwMCA8Zm9vPlwpCi0wKzJiNiA8Zm9vXCsoMHh8KTJiNj4gcGVhICVwY0BcKDArMmMwIDxmb29cKygweHwpMmMwPiwlZDA6dzoyXCkKLTArMmJhIDxmb29cKygweHwpMmJhPiBwZWEgJXBjQFwoMCsyYmMgPGZvb1wrKDB4fCkyYmM+LCVkMDp3OjJcKQotMCsyYmUgPGZvb1wrKDB4fCkyYmU+IHBlYSAlcGNAXCgwKzJjOCA8Zm9vXCsoMHh8KTJjOD4sJWQwOnc6MlwpCi0wKzJjMiA8Zm9vXCsoMHh8KTJjMj4gcGVhICVwY0BcKDArMmNjIDxmb29cKygweHwpMmNjPiwlZDA6bFwpCi0wKzJjNiA8Zm9vXCsoMHh8KTJjNj4gcGVhICVwY0BcKDArMmQwIDxmb29cKygweHwpMmQwPiwlYTA6bFwpCi0wKzJjYSA8Zm9vXCsoMHh8KTJjYT4gcGVhICVwY0BcKDArMmQ0IDxmb29cKygweHwpMmQ0PiwlZDA6dzoyXCkKLTArMmNlIDxmb29cKygweHwpMmNlPiBwZWEgJXBjQFwoMCsyZDggPGZvb1wrKDB4fCkyZDg+LCVkMDpsXCkKLTArMmQyIDxmb29cKygweHwpMmQyPiBwZWEgJXBjQFwoMCsyZGMgPGZvb1wrKDB4fCkyZGM+LCVhMDpsXCkKLTArMmQ2IDxmb29cKygweHwpMmQ2PiBwZWEgJXBjQFwoMCsyZDggPGZvb1wrKDB4fCkyZDg+LCVkMDp3OjJcKQotMCsyZGEgPGZvb1wrKDB4fCkyZGE+IHBlYSAlcGNAXCgwKzJkYyA8Zm9vXCsoMHh8KTJkYz4sJWQwOmxcKQotMCsyZGUgPGZvb1wrKDB4fCkyZGU+IHBlYSAlcGNAXCgwKzJlMCA8Zm9vXCsoMHh8KTJlMD4sJWEwOmxcKQotMCsyZTIgPGZvb1wrKDB4fCkyZTI+IHBlYSAlcGNAXCgwKzZjYyA8Lio+LCVkMDp3OjJcKQotMCsyZTggPGZvb1wrKDB4fCkyZTg+IHBlYSAlcGNAXCgwKzE4OThhIDwuKj5cKQotMCsyZjAgPGZvb1wrKDB4fCkyZjA+IHBlYSAlcGNAXCgwKzZkYSA8Lio+LCVkMDp3OjJcKQotMCsyZjYgPGZvb1wrKDB4fCkyZjY+IHBlYSAlcGNAXCgwKzZlMCA8Lio+LCVkMDpsXCkKLTArMmZjIDxmb29cKygweHwpMmZjPiBwZWEgJXBjQFwoMCs2ZTYgPC4qPiwlYTE6dzoyXCkKLTArMzAyIDxmb29cKygweHwpMzAyPiBwZWEgJXBjQFwoMCs2ZWMgPC4qPiwlYTE6bFwpCi0wKzMwOCA8Zm9vXCsoMHh8KTMwOD4gcGVhICVwY0BcKDArNmYyIDwuKj4sJWQwOnc6MlwpCi0wKzMwZSA8Zm9vXCsoMHh8KTMwZT4gcGVhICVwY0BcKDArNmY4IDwuKj4sJWQwOmxcKQotMCszMTQgPGZvb1wrKDB4fCkzMTQ+IHBlYSAlcGNAXCgwKzZmZSA8Lio+LCVhMTpsXCkKLTArMzFhIDxmb29cKygweHwpMzFhPiBwZWEgJXBjQFwoMCsxODliYyA8Lio+XCkKLTArMzIyIDxmb29cKygweHwpMzIyPiBwZWEgJXBjQFwoMCsxODljNCA8Lio+XCkKLTArMzJhIDxmb29cKygweHwpMzJhPiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKQotMCszMzAgPGZvb1wrKDB4fCkzMzA+IHBlYSAlenBjQFwoMCsxODZhMFwpCi0wKzMzOCA8Zm9vXCsoMHh8KTMzOD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXCkKLTArMzNlIDxmb29cKygweHwpMzNlPiBwZWEgJXpwY0BcKDArM2U4LCVkMDpsXCkKLTArMzQ0IDxmb29cKygweHwpMzQ0PiBwZWEgJXpwY0BcKDArM2U4LCVhMTp3OjJcKQotMCszNGEgPGZvb1wrKDB4fCkzNGE+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKQotMCszNTAgPGZvb1wrKDB4fCkzNTA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpCi0wKzM1NiA8Zm9vXCsoMHh8KTM1Nj4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpCi0wKzM1YyA8Zm9vXCsoMHh8KTM1Yz4gcGVhICV6cGNAXCgwKzNlOCwlYTE6bFwpCi0wKzM2MiA8Zm9vXCsoMHh8KTM2Mj4gcGVhICV6cGNAXCgwKzE4NmEwXCkKLTArMzZhIDxmb29cKygweHwpMzZhPiBwZWEgJXpwY0BcKDArMTg2YTBcKQotMCszNzIgPGZvb1wrKDB4fCkzNzI+IHBlYSAlcGNAXCgwKzc1YyA8Lio+XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMzdhIDxmb29cKygweHwpMzdhPiBwZWEgJXBjQFwoMCs3NjQgPC4qPlwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzM4MCA8Zm9vXCsoMHh8KTM4MD4gcGVhICVwY0BcKDArNzZhIDwuKj5cKUBcKDArN2QwXCkKLTArMzg4IDxmb29cKygweHwpMzg4PiBwZWEgJXBjQFwoMCszOGEgPGZvb1wrKDB4fCkzOGE+XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMzhlIDxmb29cKygweHwpMzhlPiBwZWEgJXBjQFwoMCszOTAgPGZvb1wrKDB4fCkzOTA+XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMzkyIDxmb29cKygweHwpMzkyPiBwZWEgJXBjQFwoMCszOTQgPGZvb1wrKDB4fCkzOTQ+XClAXCgwKzdkMFwpCi0wKzM5OCA8Zm9vXCsoMHh8KTM5OD4gcGVhICVwY0BcKDArNzgyIDwuKj5cKUBcKDArN2QwLCVkMDp3OjJcKQotMCszYTAgPGZvb1wrKDB4fCkzYTA+IHBlYSAlcGNAXCgwKzc4YSA8Lio+XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2E2IDxmb29cKygweHwpM2E2PiBwZWEgJXBjQFwoMCs3OTAgPC4qPlwpQFwoMCs3ZDBcKQotMCszYWUgPGZvb1wrKDB4fCkzYWU+IHBlYSAlcGNAXCgwKzNiMCA8Zm9vXCsoMHh8KTNiMD5cKUBcKDArN2QwLCVkMDp3OjJcKQotMCszYjQgPGZvb1wrKDB4fCkzYjQ+IHBlYSAlcGNAXCgwKzNiNiA8Zm9vXCsoMHh8KTNiNj5cKUBcKDArMDAwLCVkMDp3OjJcKQotMCszYjggPGZvb1wrKDB4fCkzYjg+IHBlYSAlcGNAXCgwKzNiYSA8Zm9vXCsoMHh8KTNiYT5cKUBcKDArN2QwXCkKLTArM2JlIDxmb29cKygweHwpM2JlPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2M2IDxmb29cKygweHwpM2M2PiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2NjIDxmb29cKygweHwpM2NjPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMFwpCi0wKzNkNCA8Zm9vXCsoMHh8KTNkND4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzNkYSA8Zm9vXCsoMHh8KTNkYT4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzNkZSA8Zm9vXCsoMHh8KTNkZT4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCszZTQgPGZvb1wrKDB4fCkzZTQ+IHBlYSAlenBjQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCszZWMgPGZvb1wrKDB4fCkzZWM+IHBlYSAlenBjQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCszZjIgPGZvb1wrKDB4fCkzZjI+IHBlYSAlenBjQFwoMCszZThcKUBcKDArN2QwXCkKLTArM2ZhIDxmb29cKygweHwpM2ZhPiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArNDAwIDxmb29cKygweHwpNDAwPiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArNDA0IDxmb29cKygweHwpNDA0PiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzdkMFwpCi0wKzQwYSA8Zm9vXCsoMHh8KTQwYT4gcGVhICVwY0BcKDArN2Y0IDwuKj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0MTIgPGZvb1wrKDB4fCk0MTI+IHBlYSAlcGNAXCgwKzdmYyA8Lio+LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDE4IDxmb29cKygweHwpNDE4PiBwZWEgJXBjQFwoMCs0MWEgPGZvb1wrKDB4fCk0MWE+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDFlIDxmb29cKygweHwpNDFlPiBwZWEgJXBjQFwoMCs0MjAgPGZvb1wrKDB4fCk0MjA+LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDIyIDxmb29cKygweHwpNDIyPiBwZWEgJXBjQFwoMCs4MGMgPC4qPiwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQyYSA8Zm9vXCsoMHh8KTQyYT4gcGVhICVwY0BcKDArODE0IDwuKj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0MzIgPGZvb1wrKDB4fCk0MzI+IHBlYSAlcGNAXCgwKzgxYyA8Lio+LCVkMDpsXClAXCgwKzdkMFwpCi0wKzQzYSA8Zm9vXCsoMHh8KTQzYT4gcGVhICVwY0BcKDArODI0IDwuKj4sJWExOmxcKUBcKDArN2QwXCkKLTArNDQyIDxmb29cKygweHwpNDQyPiBwZWEgJXBjQFwoMCs4MmMgPC4qPiwlYTE6bFwpQFwoMCs3ZDBcKQotMCs0NGEgPGZvb1wrKDB4fCk0NGE+IHBlYSAlcGNAXCgwKzgzNCA8Lio+LCVhMTp3OjJcKUBcKDArN2QwXCkKLTArNDUyIDxmb29cKygweHwpNDUyPiBwZWEgJXBjQFwoMCs4M2MgPC4qPiwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQ1OCA8Zm9vXCsoMHh8KTQ1OD4gcGVhICVwY0BcKDArODQyIDwuKj4sJWQwOmxcKUBcKDArMDAwXCkKLTArNDVlIDxmb29cKygweHwpNDVlPiBwZWEgJXBjQFwoMCs4NDggPC4qPiwlYTE6bFwpQFwoMCswMDBcKQotMCs0NjQgPGZvb1wrKDB4fCk0NjQ+IHBlYSAlcGNAXCgwKzQ2NiA8Zm9vXCsoMHh8KTQ2Nj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0NmEgPGZvb1wrKDB4fCk0NmE+IHBlYSAlcGNAXCgwKzQ2YyA8Zm9vXCsoMHh8KTQ2Yz4sJWEwOmxcKUBcKDArN2QwXCkKLTArNDcwIDxmb29cKygweHwpNDcwPiBwZWEgJXBjQFwoMCs0NzIgPGZvb1wrKDB4fCk0NzI+LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDc0IDxmb29cKygweHwpNDc0PiBwZWEgJXBjQFwoMCs0NzYgPGZvb1wrKDB4fCk0NzY+LCVkMDpsXClAXCgwKzAwMFwpCi0wKzQ3OCA8Zm9vXCsoMHh8KTQ3OD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQ4MCA8Zm9vXCsoMHh8KTQ4MD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQ4NiA8Zm9vXCsoMHh8KTQ4Nj4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQ4YyA8Zm9vXCsoMHh8KTQ4Yz4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQ5MCA8Zm9vXCsoMHh8KTQ5MD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQ5OCA8Zm9vXCsoMHh8KTQ5OD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzRhMCA8Zm9vXCsoMHh8KTRhMD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpQFwoMCs3ZDBcKQotMCs0YTggPGZvb1wrKDB4fCk0YTg+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKUBcKDArN2QwXCkKLTArNGIwIDxmb29cKygweHwpNGIwPiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXClAXCgwKzdkMFwpCi0wKzRiOCA8Zm9vXCsoMHh8KTRiOD4gcGVhICV6cGNAXCgwKzNlOCwlYTE6dzoyXClAXCgwKzdkMFwpCi0wKzRjMCA8Zm9vXCsoMHh8KTRjMD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzRjNiA8Zm9vXCsoMHh8KTRjNj4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpQFwoMCswMDBcKQotMCs0Y2MgPGZvb1wrKDB4fCk0Y2M+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKUBcKDArMDAwXCkKLTArNGQyIDxmb29cKygweHwpNGQyPiBwZWEgJXpwY0BcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNGQ4IDxmb29cKygweHwpNGQ4PiBwZWEgJXpwY0BcKDArMDAwLCVhMDpsXClAXCgwKzdkMFwpCi0wKzRkZSA8Zm9vXCsoMHh8KTRkZT4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzRlMiA8Zm9vXCsoMHh8KTRlMj4gcGVhICV6cGNAXCgwKzAwMCwlZDA6bFwpQFwoMCswMDBcKQotMCs0ZTYgPGZvb1wrKDB4fCk0ZTY+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgotMCs0ZWEgPGZvb1wrKDB4fCk0ZWE+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgotMCs0ZWUgPGZvb1wrKDB4fCk0ZWU+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgotMCs0ZjIgPGZvb1wrKDB4fCk0ZjI+IHRzdGwgMCsxODZhMCA8Lio+Ci0wKzRmOCA8Zm9vXCsoMHh8KTRmOD4gdHN0bCAwKzAwOCA8Zm9vXCsoMHh8KTg+Ci0wKzRmZSA8Zm9vXCsoMHh8KTRmZT4gdHN0bCAwKzAwOCA8Zm9vXCsoMHh8KTg+Ci0wKzUwNCA8Zm9vXCsoMHh8KTUwND4gYWRkaWIgIzEsJWQwCi0wKzUwOCA8Zm9vXCsoMHh8KTUwOD4gYWRkaXcgIzEsJWQwCi0wKzUwYyA8Zm9vXCsoMHh8KTUwYz4gYWRkaWwgIzEsJWQwCi0wKzUxMiA8Zm9vXCsoMHh8KTUxMj4gYWRkcWIgIzEsJWQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWY1NmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLSMgVGVzdCBoYW5kbGluZyBvZiBNSVQgYW5kIE1vdG9yb2xhIHN5bnRheCBvcGVyYW5kcwotIyBJZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSwgc2VlIGFsc28gb3A2ODAwMC5kLgotCS50ZXh0Ci1mb286CQotCXwgRGF0YSByZWdpc3RlciBkaXJlY3QKLQl0c3RsCSVkMAotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGRpcmVjdAotCXRzdGwJJWEwCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3QKLQl0c3RsCSVhMEAKLQl0c3RsCSglYTApCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0aW5jcmVtZW50Ci0JdHN0bAklYTBAKwotCXRzdGwJKCVhMCkrCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmVkZWNyZW1lbnQKLQl0c3RsCSVhMEAtCi0JdHN0bAktKCVhMCkKLQotCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotCXRzdGwJJWEwQCg4KQotCXRzdGwJKDgsJWEwKQotCXRzdGwJOCglYTApCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBpbmRleCAoOC1iaXQgZGlzcGxhY2VtZW50KQotCXRzdGwJJWEwQCg4LCVkMCkKLQl0c3RsCSVhMEAoOCwlZDA6dykKLQl0c3RsCSVhMEAoOCwlZDA6dzoxKQotCXRzdGwJJWEwQCg4LCVkMDp3OjIpCi0JdHN0bAklYTBAKDgsJWQwOnc6NCkKLQl0c3RsCSVhMEAoOCwlZDA6dzo4KQotCXRzdGwJJWEwQCg4LCVkMDpsKQotCXRzdGwJJWEwQCg4LCVkMDpsOjEpCi0JdHN0bAklYTBAKDgsJWQwOmw6MikKLQl0c3RsCSVhMEAoOCwlZDA6bDo0KQotCXRzdGwJJWEwQCg4LCVkMDpsOjgpCi0JdHN0bAklYTBAKCVkMDp3OjIpCi0JdHN0bAkoOCwlYTAsJWQwKQotCXRzdGwJKDgsJWEwLCVkMCoxKQotCXRzdGwJKDgsJWEwLCVkMCoyKQotCXRzdGwJKDgsJWEwLCVkMCo0KQotCXRzdGwJKDgsJWEwLCVkMCo4KQotCXRzdGwJKDgsJWEwLCVkMC53KQotCXRzdGwJKDgsJWEwLCVkMC53KjEpCi0JdHN0bAkoOCwlYTAsJWQwLncqMikKLQl0c3RsCSg4LCVhMCwlZDAudyo0KQotCXRzdGwJKDgsJWEwLCVkMC53KjgpCi0JdHN0bAkoOCwlYTAsJWQwLmwpCi0JdHN0bAkoOCwlYTAsJWQwLmwqMSkKLQl0c3RsCSg4LCVhMCwlZDAubCoyKQotCXRzdGwJKDgsJWEwLCVkMC5sKjQpCi0JdHN0bAkoOCwlYTAsJWQwLmwqOCkKLQl0c3RsCSg4LCVkMCwlYTApCi0JdHN0bAkoOCwlYTEudyoyLCVhMCkKLQl0c3RsCSg4LCVhMSwlYTApCi0JdHN0bAk4KCVhMCwlZDAudyoyKQotCXRzdGwJOCglZDAudyoyLCVhMCkKLQl0c3RsCTgoJWExLncqMiwlYTApCi0JdHN0bAkoJWEwLCVkMC53KjIpCi0JdHN0bAkoJWQwLncqMiwlYTApCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBpbmRleCAoYmFzZSBkaXNwbGFjZW1lbnQpCi0JdHN0bAklYTBAKDEwMDAsJWQwOnc6MikKLQl0c3RsCUAoMTAwMCwlZDA6dzoyKQotCXRzdGwJQCglZDA6dzoyKQotCXRzdGwJQCgxMDAwKQotCXRzdGwJJWEwQCgxMDAwMDApCi0JdHN0bAkoMTAwMCwlYTAsJWQwLncqMikKLQl0c3RsCSgxMDAwLCVkMCwlYTApCi0JdHN0bAkoMTAwMCwlYTEudyoyLCVhMCkKLQl0c3RsCTEwMDAoJWEwLCVkMC53KjIpCi0JdHN0bAkxMDAwKCVkMCwlYTApCi0JdHN0bAkoMTAwMCwlZDAudyoyKQotCXRzdGwJMTAwMCglZDAudyoyKQotCXRzdGwJKCVkMC53KjIpCi0JdHN0bAkoMTAwMDAwLCVhMCkKLQl0c3RsCTEwMDAwMCglYTApCi0JdHN0bAklemExQCgxMDAwLCVkMDp3OjIpCi0JdHN0bAklemExQCgxMDAwMDApCi0JdHN0bAkoMTAwMCwlemExLCVkMC53KjIpCi0JdHN0bAkoMTAwMCwlZDAsJXphMSkKLQl0c3RsCSgxMDAwLCVhMS53KjIsJXphMSkKLQl0c3RsCTEwMDAoJXphMSwlZDAudyoyKQotCXRzdGwJMTAwMCglZDAsJXphMSkKLQl0c3RsCSgxMDAwMDAsJXphMSkKLQl0c3RsCTEwMDAwMCglemExKQotCXRzdGwJJWEwQCgxMDAwLCV6ZDE6dzoyKQotCXRzdGwJQCgxMDAwLCV6ZDE6dzoyKQotCXRzdGwJQCglemQxOnc6MikKLQl0c3RsCSgxMDAwLCVhMCwlemQxLncqMikKLQl0c3RsCSgxMDAwLCV6ZDEsJWEwKQotCXRzdGwJKDEwMDAsJXphMS53KjIsJWEwKQotCXRzdGwJMTAwMCglYTAsJXpkMS53KjIpCi0JdHN0bAkxMDAwKCV6ZDEsJWEwKQotCXRzdGwJKDEwMDAsJXpkMS53KjIpCi0JdHN0bAkxMDAwKCV6ZDEudyoyKQotCXRzdGwJKCV6ZDEudyoyKQotCi0JfCBNZW1vcnkgaW5kaXJlY3QgcG9zdGluZGV4ZWQKLQl0c3RsCSVhMEAoMTAwMClAKDIwMDAsJWQwOnc6MikKLQl0c3RsCSVhMEAoMTAwMClAKCVkMDp3OjIpCi0JdHN0bAklYTBAKDEwMDApQCgyMDAwKQotCXRzdGwJQCgxMDAwKUAoMjAwMCwlZDA6dzoyKQotCXRzdGwJQCgxMDAwKUAoJWQwOnc6MikKLQl0c3RsCUAoMTAwMClAKDIwMDApCi0JdHN0bAklYTBAKDApQCgyMDAwLCVkMDp3OjIpCi0JdHN0bAklYTBAKDApQCglZDA6dzoyKQotCXRzdGwJJWEwQCgwKUAoMjAwMCkKLQl0c3RsCUAoMClAKDIwMDAsJWQwOnc6MikKLQl0c3RsCUAoMClAKCVkMDp3OjIpCi0JdHN0bAlAKDApQCgyMDAwKQotCXRzdGwJKFsxMDAwLCVhMF0sJWQwOnc6MiwyMDAwKQotCXRzdGwJKFsxMDAwLCVhMF0sJWQwOnc6MikKLQl0c3RsCShbMTAwMCwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDBdLCVkMDp3OjIsMjAwMCkKLQl0c3RsCShbMTAwMF0sJWQwOnc6MikKLQl0c3RsCShbMTAwMF0sMjAwMCkKLQl0c3RsCShbJWEwXSwlZDA6dzoyLDIwMDApCi0JdHN0bAkoWyVhMF0sJWQwOnc6MikKLQl0c3RsCShbJWEwXSwyMDAwKQotCXRzdGwJKFswXSwlZDA6dzoyLDIwMDApCi0JdHN0bAkoWzBdLCVkMDp3OjIpCi0JdHN0bAkoWzBdLDIwMDApCi0KLQl8IE1lbW9yeSBpbmRpcmVjdCBwcmVpbmRleGVkCi0JdHN0bAklYTBAKDEwMDAsJWQwOnc6MilAKDIwMDApCi0JdHN0bAklYTBAKDEwMDAsJWQwOnc6MilAKDApCi0JdHN0bAlAKDEwMDAsJWQwOnc6MilAKDIwMDApCi0JdHN0bAlAKDEwMDAsJWQwOnc6MilAKDApCi0JdHN0bAklYTBAKCVkMDp3OjIpQCgyMDAwKQotCXRzdGwJJWEwQCglZDA6dzoyKUAoMCkKLQl0c3RsCUAoJWQwOnc6MilAKDIwMDApCi0JdHN0bAlAKCVkMDp3OjIpQCgwKQotCXRzdGwJKFsxMDAwLCVhMCwlZDA6dzoyXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVkMDp3OjIsJWEwXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVkMCwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWExLCVhMF0sMjAwMCkKLQl0c3RsCShbMTAwMCwlYTE6dzoyLCVhMF0sMjAwMCkKLQl0c3RsCShbMTAwMCwlYTAsJWQwOnc6Ml0pCi0JdHN0bAkoWzEwMDAsJWQwLCVhMF0pCi0JdHN0bAkoWzEwMDAsJWQwOnc6Ml0sMjAwMCkKLQl0c3RsCShbMTAwMCwlZDA6dzoyXSkKLQl0c3RsCShbJWEwLCVkMDp3OjJdLDIwMDApCi0JdHN0bAkoWyVkMCwlYTBdLDIwMDApCi0JdHN0bAkoWyVhMCwlZDA6dzoyXSkKLQl0c3RsCShbJWQwLCVhMF0pCi0JdHN0bAkoWyVkMDp3OjJdLDIwMDApCi0JdHN0bAkoWyVkMDp3OjJdKQotCi0JfCBQcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLQlwZWEJJXBjQCg4KQotCXBlYQkoOCwlcGMpCi0JcGVhCTgoJXBjKQotCXBlYQlmb28KLQotCXwgUHJvZ3JhbSBjb3VudGVyIGluZGlyZWN0IHdpdGggaW5kZXggKDgtYml0IGRpc3BsYWNlbWVudCkKLQlwZWEJJXBjQCg4LCVkMDp3OjIpCi0JcGVhCSVwY0AoJWQwOnc6MikKLQlwZWEJKDgsJXBjLCVkMC53KjIpCi0JcGVhCSg4LCVkMCwlcGMpCi0JcGVhCSg4LCVhMCwlcGMpCi0JcGVhCTgoJXBjLCVkMC53KjIpCi0JcGVhCTgoJWQwLCVwYykKLQlwZWEJOCglYTAsJXBjKQotCXBlYQkoJXBjLCVkMC53KjIpCi0JcGVhCSglZDAsJXBjKQotCXBlYQkoJWEwLCVwYykKLQotCXwgUHJvZ3JhbSBjb3VudGVyIGluZGlyZWN0IHdpdGggaW5kZXggKGJhc2UgZGlzcGxhY2VtZW50KQotCXBlYQklcGNAKDEwMDAsJWQwOnc6MikKLQlwZWEJJXBjQCgxMDAwMDApCi0JcGVhCSgxMDAwLCVwYywlZDAudyoyKQotCXBlYQkoMTAwMCwlZDAsJXBjKQotCXBlYQkoMTAwMCwlYTEudyoyLCVwYykKLQlwZWEJKDEwMDAsJWExLCVwYykKLQlwZWEJMTAwMCglcGMsJWQwLncqMikKLQlwZWEJMTAwMCglZDAsJXBjKQotCXBlYQkxMDAwKCVhMSwlcGMpCi0JcGVhCSgxMDAwMDAsJXBjKQotCXBlYQkxMDAwMDAoJXBjKQotCXBlYQklenBjQCgxMDAwLCVkMDp3OjIpCi0JcGVhCSV6cGNAKDEwMDAwMCkKLQlwZWEJKDEwMDAsJXpwYywlZDAudyoyKQotCXBlYQkoMTAwMCwlZDAsJXpwYykKLQlwZWEJKDEwMDAsJWExLncqMiwlenBjKQotCXBlYQkoMTAwMCwlYTEsJXpwYykKLQlwZWEJMTAwMCglenBjLCVkMC53KjIpCi0JcGVhCTEwMDAoJWQwLCV6cGMpCi0JcGVhCTEwMDAoJWExLCV6cGMpCi0JcGVhCSgxMDAwMDAsJXpwYykKLQlwZWEJMTAwMDAwKCV6cGMpCi0KLQl8IFByb2dyYW0gY291bnRlciBtZW1vcnkgaW5kaXJlY3QgcG9zdGluZGV4ZWQKLQlwZWEJJXBjQCgxMDAwKUAoMjAwMCwlZDA6dzoyKQotCXBlYQklcGNAKDEwMDApQCglZDA6dzoyKQotCXBlYQklcGNAKDEwMDApQCgyMDAwKQotCXBlYQklcGNAKDApQCgyMDAwLCVkMDp3OjIpCi0JcGVhCSVwY0AoMClAKCVkMDp3OjIpCi0JcGVhCSVwY0AoMClAKDIwMDApCi0JcGVhCShbMTAwMCwlcGNdLCVkMDp3OjIsMjAwMCkKLQlwZWEJKFsxMDAwLCVwY10sJWQwOnc6MikKLQlwZWEJKFsxMDAwLCVwY10sMjAwMCkKLQlwZWEJKFslcGNdLCVkMDp3OjIsMjAwMCkKLQlwZWEJKFslcGNdLCVkMDp3OjIpCi0JcGVhCShbJXBjXSwyMDAwKQotCXBlYQklenBjQCgxMDAwKUAoMjAwMCwlZDA6dzoyKQotCXBlYQklenBjQCgxMDAwKUAoJWQwOnc6MikKLQlwZWEJJXpwY0AoMTAwMClAKDIwMDApCi0JcGVhCSV6cGNAKDApQCgyMDAwLCVkMDp3OjIpCi0JcGVhCSV6cGNAKDApQCglZDA6dzoyKQotCXBlYQklenBjQCgwKUAoMjAwMCkKLQlwZWEJKFsxMDAwLCV6cGNdLCVkMDp3OjIsMjAwMCkKLQlwZWEJKFsxMDAwLCV6cGNdLCVkMDp3OjIpCi0JcGVhCShbMTAwMCwlenBjXSwyMDAwKQotCXBlYQkoWyV6cGNdLCVkMDp3OjIsMjAwMCkKLQlwZWEJKFslenBjXSwlZDA6dzoyKQotCXBlYQkoWyV6cGNdLDIwMDApCi0KLQl8IFByb2dyYW0gY291bnRlciBtZW1vcnkgaW5kaXJlY3QgcHJlaW5kZXhlZAotCXBlYQklcGNAKDEwMDAsJWQwOnc6MilAKDIwMDApCi0JcGVhCSVwY0AoMTAwMCwlZDA6dzoyKUAoMCkKLQlwZWEJJXBjQCglZDA6dzoyKUAoMjAwMCkKLQlwZWEJJXBjQCglZDA6dzoyKUAoMCkKLQlwZWEJKFsxMDAwLCVwYywlZDA6dzoyXSwyMDAwKQotCXBlYQkoWzEwMDAsJWQwOnc6MiwlcGNdLDIwMDApCi0JcGVhCShbMTAwMCwlZDAsJXBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJWExLCVwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVwYywlYTFdLDIwMDApCi0JcGVhCShbMTAwMCwlYTE6dzoyLCVwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVwYywlZDA6dzoyXSkKLQlwZWEJKFsxMDAwLCVkMCwlcGNdKQotCXBlYQkoWzEwMDAsJWExLCVwY10pCi0JcGVhCShbJXBjLCVkMDp3OjJdLDIwMDApCi0JcGVhCShbJXBjLCVhMF0sMjAwMCkKLQlwZWEJKFslcGMsJWQwOnc6Ml0pCi0JcGVhCShbJWQwLCVwY10pCi0JcGVhCSV6cGNAKDEwMDAsJWQwOnc6MilAKDIwMDApCi0JcGVhCSV6cGNAKDEwMDAsJWQwOnc6MilAKDApCi0JcGVhCSV6cGNAKCVkMDp3OjIpQCgyMDAwKQotCXBlYQklenBjQCglZDA6dzoyKUAoMCkKLQlwZWEJKFsxMDAwLCV6cGMsJWQwOnc6Ml0sMjAwMCkKLQlwZWEJKFsxMDAwLCVkMDp3OjIsJXpwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVkMCwlenBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJWExLCV6cGNdLDIwMDApCi0JcGVhCShbMTAwMCwlenBjLCVhMV0sMjAwMCkKLQlwZWEJKFsxMDAwLCVhMTp3OjIsJXpwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCV6cGMsJWQwOnc6Ml0pCi0JcGVhCShbMTAwMCwlZDAsJXpwY10pCi0JcGVhCShbMTAwMCwlYTEsJXpwY10pCi0JcGVhCShbJXpwYywlZDA6dzoyXSwyMDAwKQotCXBlYQkoWyV6cGMsJWEwXSwyMDAwKQotCXBlYQkoWyV6cGMsJWQwOnc6Ml0pCi0JcGVhCShbJWQwLCV6cGNdKQotCi0JfCBBYnNvbHV0ZSBzaG9ydAotCXRzdGwJNAotCXRzdGwJNC53Ci0JdHN0bAkoNCkudwotCi0JfCBBYnNvbHV0ZSBsb25nCi0JdHN0bAkxMDAwMDAKLQl0c3RsCTgubAotCXRzdGwJKDgpLmwKLQotCXwgSW1tZWRpYXRlCi0JYWRkaWIJJjEsJWQwCi0JYWRkaXcJJjEsJWQwCi0JYWRkaWwJJjEsJWQwCi0JYWRkcWIJJjEsJWQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNDEwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNDEwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMDMzN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjQxMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLnRleHQKLXN0YXJ0Oglub3AKLQlub3AKLQlub3AKLQlicmFzIGxhYmVsMQotCWJyYXMgbGFiZWwyCi0uZ2xvYmwgbGFiZWwxCi1sYWJlbDE6CW5vcAotCS5zcGFjZSAweGEwCi0Jbm9wCi0Jbm9wCi0uZ2xvYmwgbGFiZWwyCi1sYWJlbDI6CWJyYXMgbGFiZWwxCi0JYnJhcyBsYWJlbDIKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI2NjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI2NjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzNjUwZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNjYzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi18Ci18IFRoaXMgY29kZSBnZW5lcmF0ZXMgYW4gaW5jb3JyZWN0IHBjIHJlbGF0aXZlIG9mZnNldCAKLXwKLWJ1ZzogICAgICAgbW92ZWwgICM0LCVkNwotICAgICAgICAgICBqc3IgICAgdGFibGUoJXBjLCVkNy53KSAgICAgICAgICAgIHwgd3JvbmcKLSAgICAgICAgICAganNyICAgICVwY0AodGFibGUtLi0yOmIsJWQ3OncpICAgICB8IGNvcnJlY3QgYnV0IGNyeXB0aWMKLSAgICAgICAgICAgbm9wCi0gICAgICAgICAgIG5vcAotdGFibGU6Ci0gICAgICAgICAgIGJyYSAgICBqdW5rCi0gICAgICAgICAgIGJyYSAgICBqdW5rCi0gICAgICAgICAgIGJyYSAgICBqdW5rCi0KLWp1bms6Ci0gICAgbm9wCi0gICAgcnRzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTgzNTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotI25hbWU6IHBjcmVsCi0jb2JqZHVtcDogLWRycyAtaiAudGV4dCAtLXByZWZpeC1hZGRyZXNzZXMKLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgNGU3MTRlNzEgNGNmYTAzMDAgZmZmYTRjZmEgMDMwMGZmZjQgIE5xTnFMLi4uLi5MLi4uLi4KLSAwMDEwIDRjZmIwMzAwIDA4ZWU0MWZhIGZmZWE0MWZhIGZmZTY0MWZhICBMLi4uLi5BLi4uQS4uLkEuCi0gMDAyMCBmZjYyNDFmYiAwOGRlNDFmYiAwOGRhNDFmYiAwOGQ2NDFmYiAgLmJBLi4uQS4uLkEuLi5BLgotIDAwMzAgMDkyMGZmZDIgNDFmYjA5MjAgZmZjYzQxZmIgMDkzMGZmZmYgIC4gLi5BLi4gLi5BLi4wLi4KLSAwMDQwIGZmYzY0MWZiIDA5MzBmZmZmIGZmYmU0ZTcxIDYxZmYwMDAwICAuLkEuLjAuLi4uTnFhLi4uCi0gMDA1MCAwMDU4NjEwMCAwMDUyNjE0ZSA2MTRjNGU3MSA0MWY5MDAwMCAgLlhhLi5SYU5hTE5xQS4uLgotIDAwNjAgMDAoYTZ8MDApNDFmYSAwMDQyNDFmYSAwMGJlNDFmYiAwODNhNDFmYiAgLi5BLi5CQS4uLkEuLjpBLgotIDAwNzAgMDgzNjQxZmIgMDgzMjQxZmIgMDkyMDAwMmUgNDFmYjA5MjAgIC42QS4uMkEuLiAuLkEuLiAKLSAwMDgwIDAwMjg0MWZiIDA5MzAwMDAwIDAwMjI0MWZiIDA5MzAwMDAwICAuXChBLi4wLi4uIkEuLjAuLgotIDAwOTAgMDAxYTQxZmIgMDkzMDAwMDAgMDAxMjQxZmIgMDkyMDAwMGEgIC4uQS4uMC4uLi5BLi4gLi4KLSAwMGEwIDQxZmIwODA0IDRlNzE0ZTcxIDRlNzE0MWZiIDA4ODA0MWZiICBBLi4uTnFOcU5xQS4uLkEuCi0gMDBiMCAwOTIwZmY3ZiA0MWZiMDkyMCA4MDAwNDFmYiAwOTMwZmZmZiAgLiAuLkEuLiAuLkEuLjAuLgotIDAwYzAgN2ZmZjRlNzEgNDFmYjA4N2YgNDFmYjA5MjAgMDA4MDQxZmIgIC4uTnFBLi4uQS4uIC4uQS4KLSAwMGQwIDA5MjA3ZmZmIDQxZmIwOTMwIDAwMDA4MDAwIDRlNzE0MWZhICAuIC4uQS4uMC4uLi5OcUEuCi0gMDBlMCA4MDAwNDFmYiAwMTcwZmZmZiA3ZmZmNGU3MSA0MWZhN2ZmZiAgLi5BLi5wLi4uLk5xQS4uLgotIDAwZjAgNDFmYjAxNzAgMDAwMDgwMDAgNGU3MTQxZmIgMDE3MChmZmZmfDAwMDApICBBLi5wLi4uLk5xQS4ucC4uCi0gMDEwMCAoZmYwNHwwMDAwKTQxZmIgMDkzMChmZmZmfDAwMDApIChmZWZjfDAwMDApNGU3MSA0MWY5MDAwMCAgLi5BLi4wLi4uLk5xQS4uLgotIDAxMTAgMDAwMC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIC4uLi4uLi4uLi4uLi4uLi4KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDwuKj4gbm9wCi0wKzAwMDIgPGxibF9iPiBub3AKLTArMDAwNCA8bGJsX2JcKygweHwpMj4gbW92ZW1sICVwY0BcKDArMDAwMiA8bGJsX2I+XCksJWEwLSVhMQotMCswMDBhIDxsYmxfYlwrKDB4fCk4PiBtb3ZlbWwgJXBjQFwoMCswMDAyIDxsYmxfYj5cKSwlYTAtJWExCi0wKzAwMTAgPGxibF9iXCsoMHh8KWU+IG1vdmVtbCAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAtJWExCi0wKzAwMTYgPGxibF9iXCsoMHh8KTE0PiBsZWEgJXBjQFwoMCswMDAyIDxsYmxfYj5cKSwlYTAKLTArMDAxYSA8bGJsX2JcKygweHwpMTg+IGxlYSAlcGNAXCgwKzAwMDIgPGxibF9iPlwpLCVhMAotMCswMDFlIDxsYmxfYlwrKDB4fCkxYz4gbGVhICVwY0BcKGYrZmY4MiA8Lio+XCksJWEwCi0wKzAwMjIgPGxibF9iXCsoMHh8KTIwPiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwMjYgPGxibF9iXCsoMHh8KTI0PiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwMmEgPGxibF9iXCsoMHh8KTI4PiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwMmUgPGxibF9iXCsoMHh8KTJjPiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwMzQgPGxibF9iXCsoMHh8KTMyPiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwM2EgPGxibF9iXCsoMHh8KTM4PiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwNDIgPGxibF9iXCsoMHh8KTQwPiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwNGEgPGxibF9iXCsoMHh8KTQ4PiBub3AKLTArMDA0YyA8bGJsX2JcKygweHwpNGE+IGJzcmwgMCswMGE2IDxsYmxfYT4KLTArMDA1MiA8bGJsX2JcKygweHwpNTA+IGJzcncgMCswMGE2IDxsYmxfYT4KLTArMDA1NiA8bGJsX2JcKygweHwpNTQ+IGJzcnMgMCswMGE2IDxsYmxfYT4KLTArMDA1OCA8bGJsX2JcKygweHwpNTY+IGJzcnMgMCswMGE2IDxsYmxfYT4KLTArMDA1YSA8bGJsX2JcKygweHwpNTg+IG5vcAotMCswMDVjIDxsYmxfYlwrKDB4fCk1YT4gbGVhICgwKzAwYTYgPGxibF9hPnwwKzAgPC4qPiksJWEwCi0JCQk1ZTogKDMyCVwudGV4dHxSXzY4S18zMglcLnRleHRcKzB4YTYpCi0wKzAwNjIgPGxibF9iXCsoMHh8KTYwPiBsZWEgJXBjQFwoMCswMGE2IDxsYmxfYT5cKSwlYTAKLTArMDA2NiA8bGJsX2JcKygweHwpNjQ+IGxlYSAlcGNAXCgwKzAxMjYgPC4qPlwpLCVhMAotMCswMDZhIDxsYmxfYlwrKDB4fCk2OD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDZlIDxsYmxfYlwrKDB4fCk2Yz4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDcyIDxsYmxfYlwrKDB4fCk3MD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDc2IDxsYmxfYlwrKDB4fCk3ND4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDdjIDxsYmxfYlwrKDB4fCk3YT4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDgyIDxsYmxfYlwrKDB4fCk4MD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDhhIDxsYmxfYlwrKDB4fCk4OD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDkyIDxsYmxfYlwrKDB4fCk5MD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDlhIDxsYmxfYlwrKDB4fCk5OD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMGEwIDxsYmxfYlwrKDB4fCk5ZT4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMGE0IDxsYmxfYlwrKDB4fClhMj4gbm9wCi0wKzAwYTYgPGxibF9hPiBub3AKLTArMDBhOCA8bGJsX2FcKygweHwpMj4gbm9wCi0wKzAwYWEgPGxibF9hXCsoMHh8KTQ+IGxlYSAlcGNAXCgwKzJjIDxsYmxfYlwrKDB4fCkyYT4sJWQwOmxcKSwlYTAKLTArMDBhZSA8bGJsX2FcKygweHwpOD4gbGVhICVwY0BcKDArMmYgPGxibF9iXCsoMHh8KTJkPiwlZDA6bFwpLCVhMAotMCswMGI0IDxsYmxfYVwrKDB4fCllPiBsZWEgJXBjQFwoZis4MGI2IDwuKj4sJWQwOmxcKSwlYTAKLTArMDBiYSA8bGJsX2FcKygweHwpMTQ+IGxlYSAlcGNAXChmKzgwYmIgPC4qPiwlZDA6bFwpLCVhMAotMCswMGMyIDxsYmxfYVwrKDB4fCkxYz4gbm9wCi0wKzAwYzQgPGxibF9hXCsoMHh8KTFlPiBsZWEgJXBjQFwoMCsxNDUgPC4qPiwlZDA6bFwpLCVhMAotMCswMGM4IDxsYmxfYVwrKDB4fCkyMj4gbGVhICVwY0BcKDArMTRhIDwuKj4sJWQwOmxcKSwlYTAKLTArMDBjZSA8bGJsX2FcKygweHwpMjg+IGxlYSAlcGNAXCgwKzgwY2YgPC4qPiwlZDA6bFwpLCVhMAotMCswMGQ0IDxsYmxfYVwrKDB4fCkyZT4gbGVhICVwY0BcKDArODBkNiA8Lio+LCVkMDpsXCksJWEwCi0wKzAwZGMgPGxibF9hXCsoMHh8KTM2PiBub3AKLTArMDBkZSA8bGJsX2FcKygweHwpMzg+IGxlYSAlcGNAXChmKzgwZTAgPC4qPlwpLCVhMAotMCswMGUyIDxsYmxfYVwrKDB4fCkzYz4gbGVhICVwY0BcKGYrODBlMyA8Lio+XCksJWEwCi0wKzAwZWEgPGxibF9hXCsoMHh8KTQ0PiBub3AKLTArMDBlYyA8bGJsX2FcKygweHwpNDY+IGxlYSAlcGNAXCgwKzgwZWQgPC4qPlwpLCVhMAotMCswMGYwIDxsYmxfYVwrKDB4fCk0YT4gbGVhICVwY0BcKDArODBmMiA8Lio+XCksJWEwCi0wKzAwZjggPGxibF9hXCsoMHh8KTUyPiBub3AKLTArMDBmYSA8bGJsX2FcKygweHwpNTQ+IGxlYSAlcGNAXCgoMCswIDwuKj58MCswZmMgPGxibF9hXCsoMHh8KTU2PilcKSwlYTAKLQkJCWZlOiAoRElTUDMyCXVuZGVmfFJfNjhLX1BDMzIJdW5kZWZcKzB4MikKLTArMDEwMiA8bGJsX2FcKygweHwpNWM+IGxlYSAlcGNAXCgoMCswIDwuKj58MCswMTA0IDxsYmxfYVwrKDB4fCk1ZT4pLCVkMDpsXCksJWEwCi0JCQkxMDY6IChESVNQMzIJdW5kZWZ8Ul82OEtfUEMzMgl1bmRlZlwrMHgyKQotMCswMTBhIDxsYmxfYVwrKDB4fCk2ND4gbm9wCi0wKzAxMGMgPGxibF9hXCsoMHh8KTY2PiBsZWEgMCswIDwuKj4sJWEwCi0JCQkxMGU6IChSXzY4S18pPzMyCXVuZGVmCi0wKzAxMTIgPGxibF9hXCsoMHh8KTZjPiBub3AKLTArMDExNCA8bGJsX2FcKygweHwpNmU+IG9yaWIgIzAsJWQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNWMyMmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotCW5vcAotbGJsX2I6CW5vcAotCW1vdmVtbAlsYmxfYiwlYTAtJWExCi0JbW92ZW1sCSVwY0AobGJsX2IpLCVhMC0lYTEKLQltb3ZlbWwJJXBjQChsYmxfYiwlZDApLCVhMC0lYTEKLQlsZWEJbGJsX2IsJWEwCi0JbGVhCSVwY0AobGJsX2IpLCVhMAotCWxlYQklcGNAKGxibF9iLTEyOCksJWEwCi0JbGVhCSVwY0AobGJsX2IsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYjpiLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2ItLi0yOmIsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYjp3LCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2ItLi0yOncsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYjpsLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2ItLi0yOmwsJWQwKSwlYTAKLQlub3AKLQlic3JsCWxibF9hCi0JYnNyCWxibF9hCi0JYnNycwlsYmxfYQotCWpic3IJbGJsX2EKLQlub3AKLQlsZWEJbGJsX2EsJWEwCi0JbGVhCSVwY0AobGJsX2EpLCVhMAotCWxlYQklcGNAKGxibF9hKzEyOCksJWEwCi0JbGVhCSVwY0AobGJsX2EsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYTpiLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2EtLi0yOmIsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYTp3LCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2EtLi0yOncsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYTpsLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2EtLi0yOmwsJWQwKSwlYTAKLQlsZWEJJXBjQCgxODpsLCVkMCksJWEwCi0JbGVhCSVwY0AoMTA6dywlZDApLCVhMAotCWxlYQklcGNAKDQ6YiwlZDApLCVhMAotCW5vcAotbGJsX2E6CW5vcAotCW5vcAotCWxlYQklcGNAKC4tMTI2LCVkMCksJWEwCi0JbGVhCSVwY0AoLi0xMjcsJWQwKSwlYTAKLQlsZWEJJXBjQCguLTMyNzY2LCVkMCksJWEwCi0JbGVhCSVwY0AoLi0zMjc2NywlZDApLCVhMAotCW5vcAotCWxlYQklcGNAKC4rMTI5LCVkMCksJWEwCi0JbGVhCSVwY0AoLisxMzAsJWQwKSwlYTAKLQlsZWEJJXBjQCguKzMyNzY5LCVkMCksJWEwCi0JbGVhCSVwY0AoLiszMjc3MCwlZDApLCVhMAotCW5vcAotCWxlYQklcGNAKC4tMzI3NjYpLCVhMAotCWxlYQklcGNAKC4tMzI3NjcpLCVhMAotCW5vcAotCWxlYQklcGNAKC4rMzI3NjkpLCVhMAotCWxlYQklcGNAKC4rMzI3NzApLCVhMAotCW5vcAotCWxlYQklcGNAKHVuZGVmKSwlYTAKLQlsZWEJJXBjQCh1bmRlZiwlZDApLCVhMAotCW5vcAotCWxlYQl1bmRlZiwlYTAKLQlub3AKLQkubG9uZyAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BpYzEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGljMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTc4Nzc0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGljMS5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgX2ZvbwotX2ZvbzoKLQlsZWFsICVwY0AoX2kpLCAlYTAKLQlsZWFsICVwY0AoX2ktLiksICVhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTEwOWM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1BST0c6IG5tCi0jbmFtZTogcHJlc2VuY2Ugb2Ygc2VjdGlvbiBzeW1ib2xzCi0KLTAwMDAwMDEyIGIgLmJzcwotMDAwMDAwMGUgZCAuZGF0YQotMDAwMDAwMDAgdCAudGV4dAotMDAwMDAwMGUgZCBsb29wMQotMDAwMDAwMDAgdCBsb29wMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjcxZTg2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS50ZXh0Ci1sb29wMjoJCi0JbW92ZS5sCSVkMSwlYTBAKwotCWRiZgklZDAsbG9vcDEKLQkuZGF0YQotbG9vcDE6CWJyYQlsb29wMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkOTI1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBwYWRkaW5nIG9mIC5pbml0IHNlY3Rpb24KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuaW5pdDoKLTAwMDAwMDAwIDwuaW5pdD4gc3VidSAgICAgICAgcjMxLHIzMSwweDEwCi0wMDAwMDAwNCA8LmluaXRcKzB4ND4gc3QgICAgICAgICAgcjEzLHIzMSwweDIwCi0wMDAwMDAwOCA8LmluaXRcKzB4OD4gb3IgICAgICAgICAgcjAscjAscjAKLTAwMDAwMDBjIDwuaW5pdFwrMHhjPiBvciAgICAgICAgICByMCxyMCxyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2ODFjYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotOyBUZXN0IHByb3BlciBwYWRkaW5nIG9mIHRoZSAuaW5pdCBzZWN0aW9uCi0Jc2VjdGlvbgkgLmluaXQsIngiCi0JYWxpZ24JIDQKLQlzdWJ1CSByMzEscjMxLDE2Ci0Jc3QJIHIxMyxyMzEsMzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvbTg4ay5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL204OGsuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA3YzExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvbTg4ay5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jCi0jIFRlc3RzIGZvciBtODhrIHN2cjMgdGFyZ2V0cwotIwotaWYgeyBbaXN0YXJnZXQgbTg4Ki0qLXN5c3YzXSB8fCBbaXN0YXJnZXQgbTg4Ki0qLWNvZmYqIF0gfSB0aGVuIHsKLSAgICBzZXQgdGVzdG5hbWUgIlByb3BlciBwYWRkaW5nIG9mIC5pbml0IHNlY3Rpb24iCi0gICAgcnVuX2R1bXBfdGVzdCBpbml0Ci19Ci1pZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKLSAgICB1bnNldCBlcnJvckluZm8KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9lcnIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9lcnIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NzYzMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvZXJyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkubWFjcm8JbQotCW0KLQkuZW5kbQotCi0JbQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQ3YmNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAuZAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIGlycAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKLU9GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgotMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQotMCswNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMgotMCswOFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMwotMCswY1sgCV0rW2EtekEtWjAtOV9dK1sgCV0rYmFyMQotMCsxMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rYmFyMgotMCsxNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rYmFyMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdkZDU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5pcnAJcGFyYW0sMSwyLDMKLQkubG9uZwlmb29ccGFyYW0KLQkuZW5kcgotCi0JLmlycGMJcGFyYW0sMTIzCi0JLmxvbmcJYmFyXHBhcmFtCi0JLmVuZHIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvbWFjcm9zLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxZTQ4NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvbWFjcm9zLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgUnVuIHNvbWUgdGVzdHMgb2YgZ2FzIG1hY3Jvcy4KLQotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0IHRlc3QxCi19Ci0KLXJ1bl9kdW1wX3Rlc3QgdGVzdDIKLQotcnVuX2R1bXBfdGVzdCB0ZXN0MwotCi1ydW5fZHVtcF90ZXN0IGlycAotCi1ydW5fZHVtcF90ZXN0IHJlcHQKLQotZ2FzX3Rlc3RfZXJyb3IgImVyci5zIiAiIiAibWFjcm8gaW5maW5pdGUgcmVjdXJzaW9uIgotCi1jYXNlICR0YXJnZXRfdHJpcGxldCBpbiB7Ci0gICAgeyBocHBhKi0qLSogfSB7IH0KLSAgICBkZWZhdWx0IHsKLQlydW5fZHVtcF90ZXN0IHNlbWkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyMmQ1Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogbWFjcm8gcmVwdAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKLU9GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgotMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQotMCswNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQotMCswOFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWI2ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCS5yZXB0CTMKLQkubG9uZwlmb28xCi0JLmVuZHIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg5ZTczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNvYmpkdW1wOiAtcyAtaiAudGV4dAotI25hbWU6IHNlbWkKLQotLio6IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci0gMDAwMCAzYjIwM2IyMCAzYTIwM2EyMCAwMDAwMDAwMCAwMDAwMDAwMCAgOyA7IDogOiAuLi4uLi4uLgotIDAwMTAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmUwOTYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0gICAgICAgIC5tYWNybyBzZW1pY29sb24KLSAgICAgICAgLmFzY2lpICI7ICIKLSAgICAgICAgLmVuZG0KLQotICAgICAgICAubWFjcm8gY29sb24KLSAgICAgICAgLmFzY2lpICI6ICIKLSAgICAgICAgLmVuZG0KLQotICAgICAgICBzZW1pY29sb24KLSAgICAgICAgLmFzY2lpICI7ICIKLSAgICAgICAgY29sb24KLSAgICAgICAgLmFzY2lpICI6ICIKLQotCS5wMmFsaWduIDUsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0YjNmYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEuZAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogbWFjcm8gdGVzdCAxCi0KLTArMDEgQSBzMQotMCswMiBBIHMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODhiN2NkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLm1hY3JvCW0gYXJnMSBhcmcyCi0JLmdsb2JsCVxhcmcxCi0JXGFyZzEgPSBcYXJnMgotCS5lbmRtCi0KLQltIHMxLDEKLQltIHMyLDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhN2Q0MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiBtYWNybyB0ZXN0IDIKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKLTArMDRbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzIKLTArMDhbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWIwMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkubWFjcm8JbSBhcmcxIGFyZzIgYXJnMwotCS5sb25nCVxhcmcxCi0JLmlmYwksXGFyZzJcYXJnMwotCS5FTFNFCi0JbQlcYXJnMixcYXJnMwotCS5lbmRpZgotCS5lbmRtCi0KLQltCWZvbzEsZm9vMixmb28zCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjgwYWQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiBtYWNybyB0ZXN0IDMKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MGFhMjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkubWFjcm8JbSBhcmcxIGFyZzIKLQlcYXJnMQotCS5leGl0bQotCVxhcmcyCi0JLmVuZG0KLQotCW0JIi5sb25nIGZvbzEiLC5nYXJiYWdlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNGNlZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBhbGxpbnNuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPGFicz46Ci0gICAwOgkwMWUwICAgICAgCWFicwlyMAotCi0wKzAwMiA8YWRkYz46Ci0gICAyOgkwNjIxICAgICAgCWFkZGMJcjEsIHIyCi0KLTArMDA0IDxhZGRpPjoKLSAgIDQ6CTIwMDMgICAgICAJYWRkaQlyMywgMQotCi0wKzAwNiA8YWRkdT46Ci0gICA2OgkxYzU0ICAgICAgCWFkZHUJcjQsIHI1Ci0KLTArMDA4IDxhbmQ+OgotICAgODoJMTY3NiAgICAgIAlhbmQJcjYsIHI3Ci0KLTArMDBhIDxhbmRpPjoKLSAgIGE6CTJlMjggICAgICAJYW5kaQlyOCwgMgotCi0wKzAwYyA8YW5kbj46Ci0gICBjOgkxZmE5ICAgICAgCWFuZG4JcjksIHIxMAotCi0wKzAwZSA8YXNyPjoKLSAgIGU6CTFhY2IgICAgICAJYXNyCXIxMSwgcjEyCi0KLTArMDEwIDxhc3JjPjoKLSAgMTA6CTNhMGQgICAgICAJYXNyYwlyMTMKLQotMCswMTIgPGFzcmk+OgotICAxMjoJM2JmZSAgICAgIAlhc3JpCXIxNCwgMzEKLQotMCswMTQgPGJjbHJpPjoKLSAgMTQ6CTMwMGYgICAgICAJYmNscmkJcjE1LCAwCi0KLTArMDE2IDxiZj46Ci0gIDE2OgllZmY0ICAgICAgCWJmCTB4MAotCi0wKzAxOCA8Ymdlbmk+OgotICAxODoJMzI3MCAgICAgIAliZ2VuaQlyMCwgNwotCi0wKzAxYSA8QkdFTkk+OgotICAxYToJMzI4MCAgICAgIAliZ2VuaQlyMCwgOAotCi0wKzAxYyA8QkdFTmk+OgotICAxYzoJMzNmMCAgICAgIAliZ2VuaQlyMCwgMzEKLQotMCswMWUgPGJnZW5yPjoKLSAgMWU6CTEzMjEgICAgICAJYmdlbnIJcjEsIHIyCi0KLTArMDIwIDxia3B0PjoKLQkuLi4KLQotMCswMjIgPGJtYXNraT46Ci0gIDIyOgkyYzgzICAgICAgCWJtYXNraQlyMywgOAotCi0wKzAyNCA8Qk1BU0tJPjoKLSAgMjQ6CTJkZjMgICAgICAJYm1hc2tpCXIzLCAzMQotCi0wKzAyNiA8YnI+OgotICAyNjoJZjdmZiAgICAgIAlicgkweDI2Ci0KLTArMDI4IDxicmV2PjoKLSAgMjg6CTAwZjQgICAgICAJYnJldglyNAotCi0wKzAyYSA8YnNldGk+OgotICAyYToJMzVlNSAgICAgIAlic2V0aQlyNSwgMzAKLQotMCswMmMgPGJzcj46Ci0gIDJjOglmZmU5ICAgICAgCWJzcgkweDAKLQotMCswMmUgPGJ0PjoKLSAgMmU6CWU3ZTggICAgICAJYnQJMHgwCi0KLTArMDMwIDxidHN0aT46Ci0gIDMwOgkzN2I2ICAgICAgCWJ0c3RpCXI2LCAyNwotCi0wKzAzMiA8Y2xyYz46Ci0gIDMyOgkwZjAwICAgICAgCWNtcG5lCXIwLCByMAotCi0wKzAzNCA8Y2xyZj46Ci0gIDM0OgkwMWQ3ICAgICAgCWNscmYJcjcKLQotMCswMzYgPGNscnQ+OgotICAzNjoJMDFjOCAgICAgIAljbHJ0CXI4Ci0KLTArMDM4IDxjbXBocz46Ci0gIDM4OgkwY2E5ICAgICAgCWNtcGhzCXI5LCByMTAKLQotMCswM2EgPGNtcGx0PjoKLSAgM2E6CTBkY2IgICAgICAJY21wbHQJcjExLCByMTIKLQotMCswM2MgPGNtcGxlaT46Ci0gIDNjOgkyMmViICAgICAgCWNtcGx0aQlyMTEsIDE1Ci0KLTArMDNlIDxjbXBsdGk+OgotICAzZToJMjNmZCAgICAgIAljbXBsdGkJcjEzLCAzMgotCi0wKzA0MCA8Y21wbmU+OgotICA0MDoJMGZmZSAgICAgIAljbXBuZQlyMTQsIHIxNQotCi0wKzA0MiA8Y21wbmVpPjoKLSAgNDI6CTJhMDAgICAgICAJY21wbmVpCXIwLCAwCi0KLTArMDQ0IDxkZWNmPjoKLSAgNDQ6CTAwOTEgICAgICAJZGVjZglyMQotCi0wKzA0NiA8ZGVjZ3Q+OgotICA0NjoJMDFhMiAgICAgIAlkZWNndAlyMgotCi0wKzA0OCA8ZGVjbHQ+OgotICA0ODoJMDE4MyAgICAgIAlkZWNsdAlyMwotCi0wKzA0YSA8ZGVjbmU+OgotICA0YToJMDFiNCAgICAgIAlkZWNuZQlyNAotCi0wKzA0YyA8ZGVjdD46Ci0gIDRjOgkwMDg1ICAgICAgCWRlY3QJcjUKLQotMCswNGUgPGRpdnM+OgotICA0ZToJMzIxNiAgICAgIAlkaXZzCXI2LCByMQotCi0wKzA1MCA8ZGl2dT46Ci0gIDUwOgkyYzE4ICAgICAgCWRpdnUJcjgsIHIxCi0KLTArMDUyIDxkb3plPjoKLSAgNTI6CTAwMDYgICAgICAJZG96ZQotCi0wKzA1NCA8ZmYxPjoKLSAgNTQ6CTAwZWEgICAgICAJZmYxCXIxMAotCi0wKzA1NiA8aW5jZj46Ci0gIDU2OgkwMGJiICAgICAgCWluY2YJcjExCi0KLTArMDU4IDxpbmN0PjoKLSAgNTg6CTAwYWMgICAgICAJaW5jdAlyMTIKLQotMCswNWEgPGl4aD46Ci0gIDVhOgkxZGVkICAgICAgCWl4aAlyMTMsIHIxNAotCi0wKzA1YyA8aXh3PjoKLSAgNWM6CTE1MGYgICAgICAJaXh3CXIxNSwgcjAKLQotMCswNWUgPGpiZj46Ci0gIDVlOgllZmQwICAgICAgCWJmCTB4MAotCi0wKzA2MCA8amJyPjoKLSAgNjA6CWYwMGUgICAgICAJYnIJMHg3ZQotCi0wKzA2MiA8amJzcj46Ci0gIDYyOgk3ZjBhICAgICAgCWpzcmkJMHguKgotCi0wKzA2NCA8amJ0PjoKLSAgNjQ6CWUwMGMgICAgICAJYnQJMHg3ZQotCi0wKzA2NiA8am1wPjoKLSAgNjY6CTAwYzEgICAgICAJam1wCXIxCi0KLTArMDY4IDxqbXBpPjoKLSAgNjg6CTcwMDkgICAgICAJam1waQkweC4qCi0KLTArMDZhIDxqc3I+OgotICA2YToJMDBkMiAgICAgIAlqc3IJcjIKLQotMCswNmMgPGpzcmk+OgotICA2YzoJN2YwOCAgICAgIAlqc3JpCTB4LioKLQotMCswNmUgPGxkLmI+OgotICA2ZToJYTMwNCAgICAgIAlsZGIJcjMsIFwocjQsIDBcKQotCi0wKzA3MCA8bGQuaD46Ci0gIDcwOgljNTE2ICAgICAgCWxkaAlyNSwgXChyNiwgMlwpCi0KLTArMDcyIDxsZC53PjoKLSAgNzI6CTg3MTggICAgICAJbGQJcjcsIFwocjgsIDRcKQotCi0wKzA3NCA8bGRiPjoKLSAgNzQ6CWE5ZmEgICAgICAJbGRiCXI5LCBcKHIxMCwgMTVcKQotCi0wKzA3NiA8bGRoPjoKLSAgNzY6CWNiZmMgICAgICAJbGRoCXIxMSwgXChyMTIsIDMwXCkKLQotMCswNzggPGxkPjoKLSAgNzg6CThkNWUgICAgICAJbGQJcjEzLCBcKHIxNCwgMjBcKQotCi0wKzA3YSA8bGR3PjoKLSAgN2E6CThkZmUgICAgICAJbGQJcjEzLCBcKHIxNCwgNjBcKQotCi0wKzA3YyA8bGRtPjoKLSAgN2M6CTAwNjIgICAgICAJbGRtCXIyLXIxNSwgXChyMFwpCi0KLTArMDdlIDxmb29sb29wPjoKLSAgN2U6CTAwNDEgICAgICAJbGRxCXI0LXI3LCBcKHIxXCkKLQotMCswODAgPGxvb3B0PjoKLSAgODA6CTA0OGUgICAgICAJbG9vcHQJcjgsIDB4NjQKLQotMCswODIgPExSVz46Ci0gIDgyOgk3OTAzICAgICAgCWxydwlyOSwgMHguKgotCi0wKzA4NCA8bHJ3PjoKLSAgODQ6CTc5MDQgICAgICAJbHJ3CXI5LCAweDQzMjEKLQotMCswODYgPGZvb2xpdD46Ci0gIDg2OgkxMjM0ICAgICAgCW1vdglyNCwgcjMKLQotMCswODggPGxzbD46Ci0gIDg4OgkxYmJhICAgICAgCWxzbAlyMTAsIHIxMQotCi0wKzA4YSA8bHNsYz46Ci0gIDhhOgkzYzBjICAgICAgCWxzbGMJcjEyCi0KLQkuLi4KLQkJCThjOiBBRERSMzIJLnRleHQKLQkJCTkwOiBBRERSMzIJLnRleHQuKgotICA5NDoJMDAwMCAgICAgIAlia3B0Ci0gIDk2Ogk0MzIxICAgICAgCS5zaG9ydCAweDQzMjEKLQotMCswOTggPGxzbGk+OgotICA5ODoJM2RmZCAgICAgIAlsc2xpCXIxMywgMzEKLQotMCswOWEgPGxzcj46Ci0gIDlhOgkwYmZlICAgICAgCWxzcglyMTQsIHIxNQotCi0wKzA5YyA8bHNyYz46Ci0gIDljOgkzZTAwICAgICAgCWxzcmMJcjAKLQotMCswOWUgPGxzcmk+OgotICA5ZToJM2UxMSAgICAgIAlsc3JpCXIxLCAxCi0KLTArMGEwIDxtY2xyaT46Ci0gIGEwOgkzMDY0ICAgICAgCWJjbHJpCXI0LCA2Ci0KLTArMGEyIDxtZmNyPjoKLSAgYTI6CTEwMDIgICAgICAJbWZjcglyMiwgcHNyCi0KLTArMGE0IDxtb3Y+OgotICBhNDoJMTI0MyAgICAgIAltb3YJcjMsIHI0Ci0KLTArMGE2IDxtb3ZmPjoKLSAgYTY6CTBhNjUgICAgICAJbW92ZglyNSwgcjYKLQotMCswYTggPG1vdmk+OgotICBhODoJNjdmNyAgICAgIAltb3ZpCXI3LCAxMjcKLQotMCswYWEgPG1vdnQ+OgotICBhYToJMDI5OCAgICAgIAltb3Z0CXI4LCByOQotCi0wKzBhYyA8bXRjcj46Ci0gIGFjOgkxODBhICAgICAgCW10Y3IJcjEwLCBwc3IKLQotMCswYWUgPG11bHQ+OgotICBhZToJMDNjYiAgICAgIAltdWx0CXIxMSwgcjEyCi0KLTArMGIwIDxtdmM+OgotICBiMDoJMDAyZCAgICAgIAltdmMJcjEzCi0KLTArMGIyIDxtdmN2PjoKLSAgYjI6CTAwM2UgICAgICAJbXZjdglyMTQKLQotMCswYjQgPG5lZz46Ci0gIGI0OgkyODAyICAgICAgCXJzdWJpCXIyLCAwCi0KLTArMGI2IDxub3Q+OgotICBiNjoJMDFmZiAgICAgIAlub3QJcjE1Ci0KLTArMGI4IDxvcj46Ci0gIGI4OgkxZTEwICAgICAgCW9yCXIwLCByMQotCi0wKzBiYSA8cmZpPjoKLSAgYmE6CTAwMDMgICAgICAJcmZpCi0KLTArMGJjIDxyb2xjPjoKLSAgYmM6CTA2NjYgICAgICAJYWRkYwlyNiwgcjYKLQotMCswYmUgPHJvcmk+OgotICBiZToJMzlhOSAgICAgIAlyb3RsaQlyOSwgMjYKLQotMCswYzAgPHJvdGxjPjoKLSAgYzA6CTA2NjYgICAgICAJYWRkYwlyNiwgcjYKLQotMCswYzIgPHJvdGxpPjoKLSAgYzI6CTM4YTIgICAgICAJcm90bGkJcjIsIDEwCi0KLTArMGM0IDxyb3RyaT46Ci0gIGM0OgkzOWE5ICAgICAgCXJvdGxpCXI5LCAyNgotCi0wKzBjNiA8cnN1Yj46Ci0gIGM2OgkxNDQzICAgICAgCXJzdWIJcjMsIHI0Ci0KLTArMGM4IDxyc3ViaT46Ci0gIGM4OgkyODA1ICAgICAgCXJzdWJpCXI1LCAwCi0KLTArMGNhIDxydGU+OgotICBjYToJMDAwMiAgICAgIAlydGUKLQotMCswY2MgPHJ0cz46Ci0gIGNjOgkwMGNmICAgICAgCWptcAlyMTUKLQotMCswY2UgPHNldGM+OgotICBjZToJMGMwMCAgICAgIAljbXBocwlyMCwgcjAKLQotMCswZDAgPHNleHRiPjoKLSAgZDA6CTAxNTYgICAgICAJc2V4dGIJcjYKLQotMCswZDIgPHNleHRoPjoKLSAgZDI6CTAxNzcgICAgICAJc2V4dGgJcjcKLQotMCswZDQgPHN0LmI+OgotICBkNDoJYjgwOSAgICAgIAlzdGIJcjgsIFwocjksIDBcKQotCi0wKzBkNiA8c3QuaD46Ci0gIGQ2OglkYTFiICAgICAgCXN0aAlyMTAsIFwocjExLCAyXCkKLQotMCswZDggPHN0Lnc+OgotICBkODoJOWMxZCAgICAgIAlzdAlyMTIsIFwocjEzLCA0XCkKLQotMCswZGEgPHN0Yj46Ci0gIGRhOgliZWZmICAgICAgCXN0YglyMTQsIFwocjE1LCAxNVwpCi0KLTArMGRjIDxzdGg+OgotICBkYzoJZDBmMSAgICAgIAlzdGgJcjAsIFwocjEsIDMwXCkKLQotMCswZGUgPHN0dz46Ci0gIGRlOgk5MmYzICAgICAgCXN0CXIyLCBcKHIzLCA2MFwpCi0KLTArMGUwIDxzdD46Ci0gIGUwOgk5NDA1ICAgICAgCXN0CXI0LCBcKHI1LCAwXCkKLQotMCswZTIgPHN0bT46Ci0gIGUyOgkwMDdlICAgICAgCXN0bQlyMTQtcjE1LCBcKHIwXCkKLQotMCswZTQgPHN0b3A+OgotICBlNDoJMDAwNCAgICAgIAlzdG9wCi0KLTArMGU2IDxzdHE+OgotICBlNjoJMDA1MSAgICAgIAlzdHEJcjQtcjcsIFwocjFcKQotCi0wKzBlOCA8c3ViYz46Ci0gIGU4OgkwN2Q3ICAgICAgCXN1YmMJcjcsIHIxMwotCi0wKzBlYSA8c3ViaT46Ci0gIGVhOgkyNWZlICAgICAgCXN1YmkJcjE0LCAzMgotCi0wKzBlYyA8c3VidT46Ci0gIGVjOgkwNTM5ICAgICAgCXN1YnUJcjksIHIzCi0KLTArMGVlIDxzeW5jPjoKLSAgZWU6CTAwMDEgICAgICAJc3luYwotCi0wKzBmMCA8dHN0bHQ+OgotICBmMDoJMzdmNSAgICAgIAlidHN0aQlyNSwgMzEKLQotMCswZjIgPHRzdG5lPjoKLSAgZjI6CTJhMDcgICAgICAJY21wbmVpCXI3LCAwCi0KLTArMGY0IDx0cmFwPjoKLSAgZjQ6CTAwMGEgICAgICAJdHJhcAkyCi0KLTArMGY2IDx0c3Q+OgotICBmNjoJMGVlZSAgICAgIAl0c3QJcjE0LCByMTQKLQotMCswZjggPHRzdG5iej46Ci0gIGY4OgkwMTkyICAgICAgCXRzdG5ieglyMgotCi0wKzBmYSA8d2FpdD46Ci0gIGZhOgkwMDA1ICAgICAgCXdhaXQKLQotMCswZmMgPHhvcj46Ci0gIGZjOgkxNzBmICAgICAgCXhvcglyMTUsIHIwCi0KLTArMGZlIDx4c3I+OgotICBmZToJMzgwYiAgICAgIAl4c3IJcjExCi0KLTArMDEwMCA8eHRyYjA+OgotIDEwMDoJMDEzMSAgICAgIAl4dHJiMAlyMSwgcjEKLQotMCswMTAyIDx4dHJiMT46Ci0gMTAyOgkwMTIyICAgICAgCXh0cmIxCXIxLCByMgotCi0wKzAxMDQgPHh0cmIyPjoKLSAxMDQ6CTAxMTAgICAgICAJeHRyYjIJcjEsIHIwCi0KLTArMDEwNiA8eHRyYjM+OgotIDEwNjoJMDEwZCAgICAgIAl4dHJiMwlyMSwgcjEzCi0KLTArMDEwOCA8emV4dGI+OgotIDEwODoJMDE0OCAgICAgIAl6ZXh0YglyOAotCi0wKzAxMGEgPHpleHRoPjoKLSAxMGE6CTAxNjQgICAgICAJemV4dGgJcjQKLSAxMGM6CTBmMDAgICAgICAJY21wbmUJcjAsIHIwCi0gMTBlOgkwZjAwICAgICAgCWNtcG5lCXIwLCByMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1Nzg2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBNKkNvcmUgYXNzZW1ibGVyIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IG1jb3JlLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFsbGluc24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDY4NDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSAuZGF0YQotZm9vZGF0YTogLndvcmQgNDIKLQkgLnRleHQKLWZvb3RleHQ6Ci0KLS5tYWNybyB0ZXN0IGluc24gdGV4dD0iIgotCS5leHBvcnQgXGluc24KLVxpbnNuOgotCVxpbnNuIFx0ZXh0Ci0uZW5kbQotCi0JdGVzdCBhYnMgICByMAkJCi0JdGVzdCBhZGRjICAicjEscjIiCS8vIEEgZG91YmxlIGZvcndhcmQgc2xhc2ggc3RhcnRzIGEgbGluZSBjb21tZW50Ci0JdGVzdCBhZGRpICAicjMsIDEiCSMgU28gZG9lcyBhIGhhc2gKLQl0ZXN0IGFkZHUgICJyNCwgcjUiCS8vIFdoaXRlIHNwYWNlIGJldHdlZW4gb3BlcmFuZHMgc2hvdWxkIGJlIGlnbm9yZWQKLQl0ZXN0IGFuZCAgICJyNixyNyIgICA7CXRlc3QgYW5kaSAgInI4LCMyIiAvLyBBIHNlbWljb2xvbiBzZXBlcmF0ZXMgc3RhdGVtZW50cwotCXRlc3QgYW5kbiAgInI5LCByMTAiCi0JdGVzdCBhc3IgICAicjExLCBSMTIiCS8vIFVwcGVyY2FzZSBSIGlzIGFsbG93ZWQgYXMgYSByZWdpc3RlciBwcmVmaXgKLQl0ZXN0IGFzcmMgICJyMTMiCi0JdGVzdCBhc3JpICAicjE0LCMweDFmIgotCXRlc3QgYmNscmkgInIxNSwwIgotCXRlc3QgYmYgICAgZm9vdGV4dAotCXRlc3QgYmdlbmkgInNwLCA3IgkvLyByMCBjYW4gYWxzbyBiZSByZWZlcmVkIHRvIGFzICdzcCcKLQl0ZXN0IEJHRU5JICJyMCwgOCIJLy8gT2ZmaWNpYWxseSB1cHBlciBjYXNlIG9yIG1peGVkIGNhc2UKLQl0ZXN0IEJHRU5pICJyMCwgMzEiCS8vIG1uZW1vbmljcyBzaG91bGQgbm90IGJlIGFsbG93ZWQsIGJ1dCB3ZSByZWxheCB0aGlzLi4uCi0JdGVzdCBiZ2VuciAicjEsIHIyIgotCXRlc3QgYmtwdAotCXRlc3QgYm1hc2tpICJyMywjOCIKLQl0ZXN0IEJNQVNLSSAicjMsMHgxZiIKLQl0ZXN0IGJyICAgICAuICAvLyBEb3QgbWVhbnMgdGhlIGN1cnJlbnQgYWRkcmVzcwotCXRlc3QgYnJldiAgIHI0Ci0JdGVzdCBic2V0aSAgInI1LDMwIgotCXRlc3QgYnNyICAgIGZvb3RleHQKLQl0ZXN0IGJ0ICAgICBmb290ZXh0Ci0JdGVzdCBidHN0aSAgInI2LCAyNyIKLQl0ZXN0IGNscmMgICAKLQl0ZXN0IGNscmYgICByNwotCXRlc3QgY2xydCAgIHI4Ci0JdGVzdCBjbXBocyAgInI5LHIxMCIKLQl0ZXN0IGNtcGx0ICAicjExLHIxMiIgCi0JdGVzdCBjbXBsZWkgInIxMSwgMTQiIAotCXRlc3QgY21wbHRpICJyMTMsMzIiCi0JdGVzdCBjbXBuZSAgInIxNCwgcjE1IgotCXRlc3QgY21wbmVpICJyMCwwIgotCXRlc3QgZGVjZiAgIHIxCi0JdGVzdCBkZWNndCAgcjIKLQl0ZXN0IGRlY2x0ICByMwotCXRlc3QgZGVjbmUgIHI0Ci0JdGVzdCBkZWN0ICAgcjUKLQl0ZXN0IGRpdnMgICAicjYscjEiCi0JdGVzdCBkaXZ1ICAgInI4LCByMSIKLQl0ZXN0IGRvemUKLQl0ZXN0IGZmMSAgICByMTAKLQl0ZXN0IGluY2YgICByMTEKLQl0ZXN0IGluY3QgICByMTIKLQl0ZXN0IGl4aCAgICAicjEzLHIxNCIKLQl0ZXN0IGl4dyAgICAicjE1LHIwIgotCXRlc3QgamJmICAgIGZvb3RleHQKLQl0ZXN0IGpiciAgICBmb29sb29wCi0JdGVzdCBqYnNyICAgZm9vdGV4dAotCXRlc3QgamJ0ICAgIGZvb2xvb3AKLQl0ZXN0IGptcCAgICByMQotCXRlc3Qgam1waSAgIGZvb3RleHQgCi0JdGVzdCBqc3IgICAgcjIKLQl0ZXN0IGpzcmkgICBmb290ZXh0Ci0JdGVzdCBsZC5iICAgInIzLChyNCwwKSIKLQl0ZXN0IGxkLmggICAicjUgLCAoIHI2LCAjMikiCi0JdGVzdCBsZC53ICAgInI3LCAocjgsIDB4NCkiCi0JdGVzdCBsZGIgICAgInI5LChyMTAsIzB4ZikiCi0JdGVzdCBsZGggICAgInIxMSwgKHIxMiwgMzApIgotCXRlc3QgbGQgICAgICJyMTMsIChyMTQsIDIwKSIKLQl0ZXN0IGxkdyAgICAicjEzLCAocjE0LCA2MCkiCi0JdGVzdCBsZG0gICAgInIyLXIxNSwocjApIgotCS5leHBvcnQgZm9vbG9vcAotZm9vbG9vcDoJCQotCXRlc3QgbGRxICAgICJyNC1yNywocjEpIgotCXRlc3QgbG9vcHQgICJyOCwgZm9vbG9vcCIKLQl0ZXN0IExSVyAgICAicjksIFtmb29saXRdIgotCXRlc3QgbHJ3ICAgICJyOSwgMHg0MzIxIiAgIAkvLyBQQyByZWwgaW5kaXJlY3QKLQkuZ2xvYmFsIGZvb2xpdAotZm9vbGl0OgotCS53b3JkIDB4MTIzNAotCXRlc3QgbHNsICAgICJyMTAscjExIgotCXRlc3QgbHNsYyAgIHIxMgotCS5saXRlcmFscwkJCS8vIER1bXAgbGl0ZXJhbHMgdGFibGUJCi0JdGVzdCBsc2xpICAgInIxMywzMSIKLQl0ZXN0IGxzciAgICAicjE0LHIxNSIKLQl0ZXN0IGxzcmMgICByMAotCXRlc3QgbHNyaSAgICJyMSwxIgotCXRlc3QgbWNscmkgICJyNCwgNjQiCi0JdGVzdCBtZmNyICAgInIyLCBjcjAiCi0JdGVzdCBtb3YgICAgInIzLHI0IgotCXRlc3QgbW92ZiAgICJyNSwgcjYiCi0JdGVzdCBtb3ZpICAgInI3LCAxMjciCi0JdGVzdCBtb3Z0ICAgInI4LCByOSIKLQl0ZXN0IG10Y3IgICAicjEwLCBwc3IiCi0JdGVzdCBtdWx0ICAgInIxMSwgcjEyIgotCXRlc3QgbXZjICAgIHIxMwotCXRlc3QgbXZjdiAgIHIxNAotCXRlc3QgbmVnICAgIHIyCi0JdGVzdCBub3QgICAgcjE1Ci0JdGVzdCBvciAgICAgInIwLHIxIgotCXRlc3QgcmZpCi0JdGVzdCByb2xjICAgInI2LCAxIgotCXRlc3Qgcm9yaSAgICJyOSwgNiIKLQl0ZXN0IHJvdGxjICAicjYsIDEiCi0JdGVzdCByb3RsaSAgInIyLCAjMTAiCi0JdGVzdCByb3RyaSAgInI5LCA2IgotCXRlc3QgcnN1YiAgICJyMywgcjQiCi0JdGVzdCByc3ViaSAgInI1LCAweDAiCi0JdGVzdCBydGUKLQl0ZXN0IHJ0cwotCXRlc3Qgc2V0YwotCXRlc3Qgc2V4dGIgIHI2Ci0JdGVzdCBzZXh0aCAgcjcKLQl0ZXN0IHN0LmIgICAicjgsIChyOSwgMCkiCi0JdGVzdCBzdC5oICAgInIxMCwgKHIxMSwgMikiCi0JdGVzdCBzdC53ICAgInIxMiwgKHIxMywgNCkiCi0JdGVzdCBzdGIgICAgInIxNCwgKHIxNSwgMTUpIgkKLQl0ZXN0IHN0aCAgICAicjAsIChyMSwgMzApIgotCXRlc3Qgc3R3ICAgICJyMiwgKHIzLCAweDNjKSIKLQl0ZXN0IHN0ICAgICAicjQsIChyNSwgMCkiCi0JdGVzdCBzdG0gICAgInIxNCAtIHIxNSAsIChyMCkiCi0JdGVzdCBzdG9wCi0JdGVzdCBzdHEgICAgInI0IC0gcjcgLCAocjEpIgotCXRlc3Qgc3ViYyAgICJyNywgcjEzIgotCXRlc3Qgc3ViaSAgICJyMTQsIDMyIgotCXRlc3Qgc3VidSAgICJyOSwgcjMiCi0JdGVzdCBzeW5jCi0JdGVzdCB0c3RsdCAgcjUKLQl0ZXN0IHRzdG5lICByNwotCXRlc3QgdHJhcCAgIDIKLQl0ZXN0IHRzdCAgICAicjE0LCByMTQiCi0JdGVzdCB0c3RuYnogcjIKLQl0ZXN0IHdhaXQKLQl0ZXN0IHhvciAgICAicjE1LHIwIgotCXRlc3QgeHNyICAgIHIxMQotCXRlc3QgeHRyYjAgICJyMSwgcjEiCi0JdGVzdCB4dHJiMSAgInIxLCByMiIKLQl0ZXN0IHh0cmIyICAicjEsIHIwIgotCXRlc3QgeHRyYjMgICJyMSwgcjEzIgotCXRlc3QgemV4dGIgIHI4Ci0JdGVzdCB6ZXh0aCAgcjQKLQljbHJjCQkJLy8gVGhlc2UgdHdvIGluc3RydWN0aW9ucyBwYWQgdGhlIG9iamVjdCBmaWxlCi0JY2xyYwkJCS8vIG91dCB0byBhIDE2IGJ5dGUgYm91bmRhcnkuCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NmQ1YzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMuZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBhYnMKLQotIyBUZXN0IHRoZSBhYnMgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGJnZXoJXCRhMCwwKzAwMGMgPGZvb1wrKDB4fCljPgotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBuZWcJXCRhMCxcJGEwCi0wKzAwMGMgPFtePl0qPiBiZ2V6CVwkYTEsMCswMDE4IDxmb29cKygweHwpMTg+Ci0wKzAwMTAgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQotMCswMDE0IDxbXj5dKj4gbmVnCVwkYTAsXCRhMQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjE3MmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFicyBtYWNyby4KLWZvbzoKLQlhYnMJJDQKLQlhYnMJJDQsJDUKLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMjFkMWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBhZGQKLQotIyBUZXN0IHRoZSBhZGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGFkZGkJXCRhMCxcJGEwLDAKLTArMDAwNCA8W14+XSo+IGFkZGkJXCRhMCxcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBhZGQJXCRhMCxcJGEwLFwkYXQKLTArMDAxMCA8W14+XSo+IGFkZGkJXCRhMCxcJGEwLC0zMjc2OAotMCswMDE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTggPFtePl0qPiBhZGQJXCRhMCxcJGEwLFwkYXQKLTArMDAxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDIwIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAyNCA8W14+XSo+IGFkZAlcJGEwLFwkYTAsXCRhdAotMCswMDI4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDAyYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZTk2NGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhZGQgbWFjcm8uCi0JCi1mb286Ci0JYWRkCSQ0LCQ0LDAKLQlhZGQJJDQsJDQsMQotCWFkZAkkNCwkNCwweDgwMDAKLQlhZGQJJDQsJDQsLTB4ODAwMAotCWFkZAkkNCwkNCwweDEwMDAwCi0JYWRkCSQ0LCQ0LDB4MWE1YTUKLQkKLSMgYWRkdSBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhZGQgaXM7IGp1c3QgY29uZmlybSB0aGF0IGl0IGlzbid0Ci0jIHRvdGFsbHkgYnJva2VuLgotCWFkZHUJJDQsJDQsMQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjE3MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBhbmQKLQotIyBUZXN0IHRoZSBhbmQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGFuZGkJXCRhMCxcJGEwLDB4MAotMCswMDA0IDxbXj5dKj4gYW5kaQlcJGEwLFwkYTAsMHgxCi0wKzAwMDggPFtePl0qPiBhbmRpCVwkYTAsXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBhbmQJXCRhMCxcJGEwLFwkYXQKLTArMDAxNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE4IDxbXj5dKj4gYW5kCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMjQgPFtePl0qPiBhbmQJXCRhMCxcJGEwLFwkYXQKLTArMDAyOCA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHgwCi0wKzAwMmMgPFtePl0qPiBub3IJXCRhMCxcJGEwLFwkemVybwotMCswMDMwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDEKLTArMDAzNCA8W14+XSo+IG5vcglcJGEwLFwkYTAsXCR6ZXJvCi0wKzAwMzggPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4ODAwMAotMCswMDNjIDxbXj5dKj4gbm9yCVwkYTAsXCRhMCxcJHplcm8KLTArMDA0MCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwNDQgPFtePl0qPiBub3IJXCRhMCxcJGExLFwkYXQKLTArMDA0OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDRjIDxbXj5dKj4gbm9yCVwkYTAsXCRhMSxcJGF0Ci0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1NCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNTggPFtePl0qPiBub3IJXCRhMCxcJGExLFwkYXQKLTArMDA1YyA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHgwCi0wKzAwNjAgPFtePl0qPiB4b3JpCVwkYTAsXCRhMSwweDAKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZjNTdlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYW5kIG1hY3JvLgotCQotZm9vOgotCWFuZAkkNCwkNCwwCi0JYW5kCSQ0LCQ0LDEKLQlhbmQJJDQsJDQsMHg4MDAwCi0JYW5kCSQ0LCQ0LC0weDgwMDAKLQlhbmQJJDQsJDQsMHgxMDAwMAotCWFuZAkkNCwkNCwweDFhNWE1Ci0KLSMgbm9yLCBvciwgYW5kIHhvciBhcmUgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlLiAgVGhlcmUgaXMgYSBzcGVjaWFsCi0jIGNhc2UgZm9yIG5vciwgc28gd2UgdGVzdCBhbGwgdmFyaWFudHMuCi0JCi0Jbm9yCSQ0LCQ1LDAKLQlub3IJJDQsJDUsMQotCW5vcgkkNCwkNSwweDgwMDAKLQlub3IJJDQsJDUsLTB4ODAwMAotCW5vcgkkNCwkNSwweDEwMDAwCi0Jbm9yCSQ0LCQ1LDB4MWE1YTUKLQkKLQlvcgkkNCwkNSwwCi0KLQl4b3IJJDQsJDUsMAotCi0JIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTMyOTM0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmVxCi0KLSMgVGVzdCB0aGUgYmVxIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBiZXEJXCRhMCxcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwYyA8W14+XSo+IG5vcAotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwxCi0wKzAwMTQgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyMCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDJjIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzAgPFtePl0qPiBub3AKLTArMDAzNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDM4IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA0OCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDU0IDxbXj5dKj4gbm9wCi0wKzAwNTggPFtePl0qPiBiZXF6bAlcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1YyA8W14+XSo+IG5vcAotMCswMDYwIDxbXj5dKj4gYm5lemwJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCi0wKzIwMDY4IDxbXj5dKj4gagkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjIwMDY4OiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0wKzIwMDZjIDxbXj5dKj4gbm9wCi0wKzIwMDcwIDxbXj5dKj4gamFsCTArMDAwMCA8dGV4dF9sYWJlbD4KLVsgCV0qMjAwNzA6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJLnRleHQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTIyZWVjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmVxIG1hY3JvLgotCS5nbG9ibAl0ZXh0X2xhYmVsCS50ZXh0Ci10ZXh0X2xhYmVsOgkKLQliZXEJJDQsJDUsdGV4dF9sYWJlbAotCWJlcQkkNCwwLHRleHRfbGFiZWwKLQliZXEJJDQsMSx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJlcQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQliZXEJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYm5lIGlzIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZSBhcyBiZXEuICBKdXN0IHNhbml0eSBjaGVjay4KLQlibmUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IGNoZWNrIGJlcWwgYW5kIGJuZWwKLQkuc2V0CW1pcHMyCi0JYmVxbAkkNCwwLHRleHRfbGFiZWwKLQlibmVsCSQ0LDAsdGV4dF9sYWJlbAotCi0jIFRlc3QgdGhhdCBicmFuY2hlcyB3aGljaCBvdmVyZmxvdyBhcmUgY29udmVydGVkIHRvIGp1bXBzLgotCS5zcGFjZQkweDIwMDAwCi0JYgl0ZXh0X2xhYmVsCi0JYmFsCXRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTNlMjdjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLmQKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmdlCi0KLSMgVGVzdCB0aGUgYmdlIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IGJnZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGJsZXoJXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IGJnZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGJndHoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjggPFtePl0qPiBub3AKLTArMDAyYyA8W14+XSo+IHNsdGkJXCRhdCxcJGEwLDIKLTArMDAzMCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzQgPFtePl0qPiBub3AKLTArMDAzOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwM2MgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA0MCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNDQgPFtePl0qPiBub3AKLTArMDA0OCA8W14+XSo+IHNsdGkJXCRhdCxcJGEwLC0zMjc2OAotMCswMDRjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1MCA8W14+XSo+IG5vcAotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA1YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNjAgPFtePl0qPiBub3AKLTArMDA2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDY4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA2YyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3NCA8W14+XSo+IG5vcAotMCswMDc4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCi0wKzAwN2MgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBiZ3R6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDg4IDxbXj5dKj4gbm9wCi0wKzAwOGMgPFtePl0qPiBibHR6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDkwIDxbXj5dKj4gbm9wCi0wKzAwOTQgPFtePl0qPiBiZ3R6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDk4IDxbXj5dKj4gbm9wCi0wKzAwOWMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYTEKLTArMDBhMCA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMGE0IDxbXj5dKj4gbm9wCi0wKzAwYTggPFtePl0qPiBzbHQJXCRhdCxcJGExLFwkYTAKLTArMDBhYyA8W14+XSo+IGJuZXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWZkODIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBiZ2UgbWFjcm8uCi0JCi10ZXh0X2xhYmVsOgkKLQliZ2UJJDQsJDUsdGV4dF9sYWJlbAotCWJnZQkkNCwkMCx0ZXh0X2xhYmVsCi0JYmdlCSQwLCQ1LHRleHRfbGFiZWwKLQliZ2UJJDQsMCx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDEsdGV4dF9sYWJlbAotCWJnZQkkNCwyLHRleHRfbGFiZWwKLQliZ2UJJDQsMHg4MDAwLHRleHRfbGFiZWwKLQliZ2UJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJnZQkkNCwweDFhNWE1LHRleHRfbGFiZWwKLQotIyBiZ3QgaXMgaGFuZGxlZCBsaWtlIGJnZSwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWJndAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmd0CSQ0LCQwLHRleHRfbGFiZWwKLQliZ3QJJDAsJDUsdGV4dF9sYWJlbAotCWJndAkkNCwwLHRleHRfbGFiZWwKLQotIyBTYW5pdHkgdGVzdCBiZ2VsIGFuZCBiZ3RsCi0JLnNldAltaXBzMgotCWJnZWwJJDQsJDUsdGV4dF9sYWJlbAotCWJndGwJJDQsJDUsdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhNjA0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUuZAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBiZ2V1Ci0KLSMgVGVzdCB0aGUgYmdldSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gYmVxCVwkemVybyxcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxMCA8W14+XSo+IG5vcAotMCswMDE0IDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gc2x0aXUJXCRhdCxcJGEwLDIKLTArMDAyMCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMmMgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwMzAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDM0IDxbXj5dKj4gbm9wCi0wKzAwMzggPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsLTMyNzY4Ci0wKzAwM2MgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDQwIDxbXj5dKj4gbm9wCi0wKzAwNDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0OCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDA0YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA1YyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDA2MCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKLTArMDA2YyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzAgPFtePl0qPiBub3AKLTArMDA3NCA8W14+XSo+IGJuZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzggPFtePl0qPiBub3AKLTArMDA3YyA8W14+XSo+IGJuZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODAgPFtePl0qPiBub3AKLTArMDA4NCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYTEKLTArMDA4OCA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDhjIDxbXj5dKj4gbm9wCi0wKzAwOTAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMSxcJGEwCi0wKzAwOTQgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzdmOTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmdldSBtYWNyby4KLQkKLXRleHRfbGFiZWw6CQotCWJnZXUJJDQsJDUsdGV4dF9sYWJlbAotCWJnZXUJJDAsJDUsdGV4dF9sYWJlbAotCSMgQSBzZWNvbmQgYXJndW1lbnQgb2YgMCBvciAkMCBpcyBhbHdheXMgdHJ1ZQotCWJnZXUJJDQsMSx0ZXh0X2xhYmVsCi0JYmdldQkkNCwyLHRleHRfbGFiZWwKLQliZ2V1CSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdldQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQliZ2V1CSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJnZXUJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmd0dSBpcyBoYW5kbGVkIGxpa2UgYmdldSwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWJndHUJJDQsJDUsdGV4dF9sYWJlbAotCWJndHUJJDQsJDAsdGV4dF9sYWJlbAotCWJndHUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmdldWwgYW5kIGJndHVsCi0JLnNldAltaXBzMgotCWJnZXVsCSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3R1bAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxMGUyMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJsdAotCi0jIFRlc3QgdGhlIGJsdCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBibHR6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBiZ3R6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBibHR6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBibGV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwyCi0wKzAwMzAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDM0IDxbXj5dKj4gbm9wCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDNjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDQ0IDxbXj5dKj4gbm9wCi0wKzAwNDggPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwtMzI3NjgKLTArMDA0YyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNWMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDYwIDxbXj5dKj4gbm9wCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNmMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMDdjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gYmdleglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5MCA8W14+XSo+IG5vcAotMCswMDk0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwYTAgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCi0wKzAwYWMgPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAzMDU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmx0IG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmx0CSQ0LCQ1LHRleHRfbGFiZWwKLQlibHQJJDQsJDAsdGV4dF9sYWJlbAotCWJsdAkkMCwkNSx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDAsdGV4dF9sYWJlbAotCWJsdAkkNCwxLHRleHRfbGFiZWwKLQlibHQJJDQsMix0ZXh0X2xhYmVsCi0JYmx0CSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmx0CSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJsdAkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQlibHQJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmxlIGlzIGhhbmRsZWQgbGlrZSBibHQsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQlibGUJJDQsJDUsdGV4dF9sYWJlbAotCWJsZQkkNCwkMCx0ZXh0X2xhYmVsCi0JYmxlCSQwLCQ1LHRleHRfbGFiZWwKLQlibGUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmx0bCBhbmQgYmxlbAotCS5zZXQJbWlwczIKLQlibHRsCSQ0LCQ1LHRleHRfbGFiZWwKLQlibGVsCSQ0LCQ1LHRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMjYxYzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmx0dQotCi0jIFRlc3QgdGhlIGJsdHUgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IGJuZQlcJHplcm8sXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGJlcXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwyCi0wKzAwMjAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDJjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDMwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gc2x0aXUJXCRhdCxcJGEwLC0zMjc2OAotMCswMDNjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0MCA8W14+XSo+IG5vcAotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDggPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNGMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNWMgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNjAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBzbHR1CVwkYXQsXCRhMSxcJGEwCi0wKzAwNmMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDcwIDxbXj5dKj4gbm9wCi0wKzAwNzQgPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc4IDxbXj5dKj4gbm9wCi0wKzAwN2MgPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwODggPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4YyA8W14+XSo+IG5vcAotMCswMDkwIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDk0IDxbXj5dKj4gYmVxemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGIxYWU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJsdHUgbWFjcm8uCi0JCi10ZXh0X2xhYmVsOgkKLQlibHR1CSQ0LCQ1LHRleHRfbGFiZWwKLQlibHR1CSQwLCQ1LHRleHRfbGFiZWwKLQkjIEEgc2Vjb25kIGFyZ3VtZW50IG9mIDAgb3IgJDAgaXMgYWx3YXlzIGZhbHNlCi0JYmx0dQkkNCwxLHRleHRfbGFiZWwKLQlibHR1CSQ0LDIsdGV4dF9sYWJlbAotCWJsdHUJJDQsMHg4MDAwLHRleHRfbGFiZWwKLQlibHR1CSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJsdHUJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwweDFhNWE1LHRleHRfbGFiZWwKLQotIyBibGV1IGlzIGhhbmRsZWQgbGlrZSBibHR1LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JYmxldQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmxldQkkNCwkMCx0ZXh0X2xhYmVsCi0JYmxldQkkNCwwLHRleHRfbGFiZWwKLQotIyBTYW5pdHkgdGVzdCBibHR1bCBhbmQgYmxldWwKLQkuc2V0CW1pcHMyCi0JYmx0dWwJJDQsJDUsdGV4dF9sYWJlbAotCWJsZXVsCSQ0LCQ1LHRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OThhNGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jYXM6IC1tY3B1PXIzOTAwCi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzkwMAotI25hbWU6IE1JUFMgMjAtYml0IGJyZWFrCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGJyZWFrCi0wKzAwMDQgPFtePl0qPiBicmVhawotMCswMDA4IDxbXj5dKj4gYnJlYWsJMHgxNAotMCswMDBjIDxbXj5dKj4gYnJlYWsJMHgxNCwweDI4Ci0wKzAwMTAgPFtePl0qPiBicmVhawkweDNmZiwweDNmZgotMCswMDE0IDxbXj5dKj4gc2RiYnAKLTArMDAxOCA8W14+XSo+IHNkYmJwCi0wKzAwMWMgPFtePl0qPiBzZGJicAkweDE0Ci0wKzAwMjAgPFtePl0qPiBzZGJicAkweDE0LDB4MjgKLTArMDAyNCA8W14+XSo+IHNkYmJwCTB4M2ZmLDB4M2ZmCi0JLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNWIwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSAyMC1iaXQgYnJlYWsgaW5zdHJ1Y3Rpb25zCi1mb286CQotCWJyZWFrCi0JYnJlYWsJMAotCWJyZWFrCTIwCi0JYnJlYWsJMjAsNDAKLQlicmVhawkxMDIzLDEwMjMKLQkKLQlzZGJicAotCXNkYmJwCTAKLQlzZGJicAkyMAotCXNkYmJwCTIwLDQwCi0Jc2RiYnAJMTAyMywxMDIzCi0JCi0jIGZvcmNlIHNvbWUgcGFkZGluZywgdG8gbWFrZSBvYmpkdW1wIGNvbnNpc3RlbnRseSByZXBvcnQgdGhhdCB0aGVyZSdzIHNvbWUKLSMgaGVyZS4uLgotCS5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGMwZWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGRlbGF5Ci0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotCi0jIAotIyBHYXMgc2hvdWxkIHByb2R1Y2Ugbm9wJ3MgYWZ0ZXIgbXRjMSBhbmQgcmVsYXRlZCAKLSMgaW5zbidzIGlmIHRoZSB0YXJnZXQgZnByIGlzIHVzZWQgaW4gdGhlIAotIyBpbW1lZGlhdGx5IGZvbGxvd2luZyBpbnNuLiAgU2VlIGFsc28gbm9kZWxheS5kLgotIwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBtdGMxCVwkemVybyxcJGYwCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGN2dC5kLncJXCRmMCxcJGYwCi0wKzAwMGMgPFtePl0qPiBtdGMxCVwkemVybyxcJGYxCi0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGN2dC5kLncJXCRmMSxcJGYxCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTJmMDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYWJzIG1hY3JvLgotZm9vOgotCW10YzEJJDAsJGYwCi0JY3Z0LmQudwkkZjAsJGYwCi0gICAgICAgIG10YzEgICAgJDAsJGYxCi0gICAgICAgIGN2dC5kLncgJGYxLCRmMQotICAgICAgICAuc3BhY2UJOAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LWlsb2Nrcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg1NmQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LWlsb2Nrcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBkaXYKLSNzb3VyY2U6IGRpdi5zCi0KLSMgVGVzdCB0aGUgZGl2IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGExLDArMDAxMCA8Zm9vXCsweDEwPgotMCswMDA4IDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwYyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDAxNCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMTggPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDAxYyA8W14+XSo+IGJuZQlcJGEwLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDAyOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDJjIDxbXj5dKj4gYm5leglcJGEyLDArMDAzOCA8Zm9vXCsweDM4PgotMCswMDMwIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDAzNCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDAzOCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDAzYyA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMDUwIDxmb29cKzB4NTA+Ci0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDA0NCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMDUwIDxmb29cKzB4NTA+Ci0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDA1MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDU0IDxbXj5dKj4gbW92ZQlcJGEwLFwkYTAKLTArMDA1OCA8W14+XSo+IG1vdmUJXCRhMCxcJGExCi0wKzAwNWMgPFtePl0qPiBuZWcJXCRhMCxcJGEwCi0wKzAwNjAgPFtePl0qPiBuZWcJXCRhMCxcJGExCi0wKzAwNjQgPFtePl0qPiBsaQlcJGF0LDIKLTArMDA2OCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwNmMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA3MCA8W14+XSo+IGxpCVwkYXQsMgotMCswMDc0IDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDdjIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDA4MCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwODQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA4OCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwOGMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMDkwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwOTQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDk4IDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA5YyA8W14+XSo+IG1mbG8JXCRhMAotMCswMGEwIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDBhNCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYTggPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGIwIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBiNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwYmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGMwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBjOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwY2MgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGQwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBkOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwZGMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGUwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZTQgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKLTArMDBlOCA8W14+XSo+IGJuZXoJXCRhMSwwKzBmNCA8Zm9vXCsweGY0PgotMCswMGVjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAwZjAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwZjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBmOCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxMDQgPGZvb1wrMHgxMDQ+Ci0wKzAwZmMgPFtePl0qPiBkaXZ1CVwkemVybyxcJGExLFwkYTIKLTArMDEwMCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDEwNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTA4IDxbXj5dKj4gbW92ZQlcJGEwLFwkYTAKLTArMDEwYyA8W14+XSo+IGJuZXoJXCRhMiwwKzAxMTggPGZvb1wrMHgxMTg+Ci0wKzAxMTAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTE0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTE4IDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMTFjIDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAxMzAgPGZvb1wrMHgxMzA+Ci0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDEyNCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMTMwIDxmb29cKzB4MTMwPgotMCswMTI4IDxbXj5dKj4gbm9wCi0wKzAxMmMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAxMzAgPFtePl0qPiBtZmhpCVwkYTAKLTArMDEzNCA8W14+XSo+IGxpCVwkYXQsMgotMCswMTM4IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxM2MgPFtePl0qPiBtZmhpCVwkYTAKLTArMDE0MCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxNGMgPGZvb1wrMHgxNGM+Ci0wKzAxNDQgPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDE0OCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDE0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywtMQotMCswMTUwIDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAxNjggPGZvb1wrMHgxNjg+Ci0wKzAxNTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sMQotMCswMTU4IDxbXj5dKj4gZHNsbDMyCVwkYXQsXCRhdCwweDFmCi0wKzAxNWMgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDE2OCA8Zm9vXCsweDE2OD4KLTArMDE2MCA8W14+XSo+IG5vcAotMCswMTY0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTY4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxNmMgPFtePl0qPiBsaQlcJGF0LDIKLTArMDE3MCA8W14+XSo+IGRkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDE3NCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTc4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDE3YyA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTgwIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxODQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMTg4IDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMThjIDxbXj5dKj4gbWZoaQlcJGEwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNWJiMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jYXM6IC1tY3B1PXI0MDAwCi0jbmFtZTogTUlQUyBkaXYKLQotIyBUZXN0IHRoZSBkaXYgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBibmV6CVwkYTEsMCswMDEwIDxmb29cKzB4MTA+Ci0wKzAwMDggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQotMCswMDBjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMDE0IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAwMjggPGZvb1wrMHgyOD4KLTArMDAxOCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMDFjIDxbXj5dKj4gYm5lCVwkYTAsXCRhdCwwKzAwMjggPGZvb1wrMHgyOD4KLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDI4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMmMgPFtePl0qPiBub3AKLTArMDAzMCA8W14+XSo+IGJuZXoJXCRhMiwwKzAwM2MgPGZvb1wrMHgzYz4KLTArMDAzNCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAwMzggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwM2MgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwNDAgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDA1NCA8Zm9vXCsweDU0PgotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwNDggPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDA1NCA8Zm9vXCsweDU0PgotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwNTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA1OCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAwNWMgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQotMCswMDYwIDxbXj5dKj4gbmVnCVwkYTAsXCRhMAotMCswMDY0IDxbXj5dKj4gbmVnCVwkYTAsXCRhMQotMCswMDY4IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNzQgPFtePl0qPiBsaQlcJGF0LDIKLTArMDA3OCA8W14+XSo+IG5vcAotMCswMDdjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDA4MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDg0IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA5MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDk0IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBhMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGE0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDBhOCA8W14+XSo+IG5vcAotMCswMGFjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBiMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGI0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDBiOCA8W14+XSo+IG5vcAotMCswMGJjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBjMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwYzggPFtePl0qPiBub3AKLTArMDBjYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwZDAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGQ4IDxbXj5dKj4gbm9wCi0wKzAwZGMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGUwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBlOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwZWMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGYwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBmOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwZmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTAwIDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAxMGMgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKLTArMDExMCA8W14+XSo+IGJuZXoJXCRhMSwwKzAxMWMgPGZvb1wrMHgxMWM+Ci0wKzAxMTQgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKLTArMDExOCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDExYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMTIwIDxbXj5dKj4gbm9wCi0wKzAxMjQgPFtePl0qPiBibmV6CVwkYTIsMCswMTMwIDxmb29cKzB4MTMwPgotMCswMTI4IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGEyCi0wKzAxMmMgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMzAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEzNCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAxMzggPFtePl0qPiBibmV6CVwkYTIsMCswMTQ0IDxmb29cKzB4MTQ0PgotMCswMTNjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDE0MCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDE0NCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDE0OCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTVjIDxmb29cKzB4MTVjPgotMCswMTRjIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAxNTAgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDE1YyA8Zm9vXCsweDE1Yz4KLTArMDE1NCA8W14+XSo+IG5vcAotMCswMTU4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTVjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxNjAgPFtePl0qPiBsaQlcJGF0LDIKLTArMDE2NCA8W14+XSo+IG5vcAotMCswMTY4IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxNmMgPFtePl0qPiBtZmhpCVwkYTAKLTArMDE3MCA8W14+XSo+IG5vcAotMCswMTc0IDxbXj5dKj4gYm5leglcJGEyLDArMDE4MCA8Zm9vXCsweDE4MD4KLTArMDE3OCA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTdjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTgwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLC0xCi0wKzAxODQgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDE5YyA8Zm9vXCsweDE5Yz4KLTArMDE4OCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywxCi0wKzAxOGMgPFtePl0qPiBkc2xsMzIJXCRhdCxcJGF0LDB4MWYKLTArMDE5MCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMTljIDxmb29cKzB4MTljPgotMCswMTk0IDxbXj5dKj4gbm9wCi0wKzAxOTggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAxOWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDFhMCA8W14+XSo+IGxpCVwkYXQsMgotMCswMWE0IDxbXj5dKj4gbm9wCi0wKzAxYTggPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxYWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDFiMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAxYjQgPFtePl0qPiBub3AKLTArMDFiOCA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMWJjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxYzAgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMWM0IDxbXj5dKj4gbm9wCi0wKzAxYzggPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxY2MgPFtePl0qPiBtZmhpCVwkYTAKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk5OTA2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgZGl2IG1hY3JvLgotZm9vOgotCWRpdgkkMCwkNCwkNQotCWRpdgkkNCwkNQotCWRpdgkkNCwkNSwkNgotCWRpdgkkNCwxCi0JZGl2CSQ0LCQ1LDEKLQlkaXYJJDQsLTEKLQlkaXYJJDQsJDUsLTEKLQlkaXYJJDQsMgotCWRpdgkkNCwkNSwyCi0JZGl2CSQ0LDB4ODAwMAotCWRpdgkkNCwkNSwweDgwMDAKLQlkaXYJJDQsLTB4ODAwMAotCWRpdgkkNCwkNSwtMHg4MDAwCi0JZGl2CSQ0LDB4MTAwMDAKLQlkaXYJJDQsJDUsMHgxMDAwMAotCWRpdgkkNCwweDFhNWE1Ci0JZGl2CSQ0LCQ1LDB4MWE1YTUKLQotIyBkaXZ1IGlzIGxpa2UgZGl2LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JZGl2dQkkMCwkNCwkNQotCWRpdnUJJDQsJDUKLQlkaXZ1CSQ0LCQ1LCQ2Ci0JZGl2dQkkNCwxCi0KLSMgcmVtIGlzIGxpa2UgZGl2LCByZW11IGlzIGxpa2UgZGl2dQotCXJlbQkkNCwkNSwkNgotCXJlbXUJJDQsJDUsMgotCi0jIFNhbml0eSBjaGVjayB0aGUgNjQgYml0IHZlcnNpb25zLgotCS5zZXQJbWlwczMKLQlkZGl2CSQ0LCQ1LCQ2Ci0JZGRpdnUJJDQsJDUsMgotCWRyZW0JJDQsJDUsMHg4MDAwCi0JZHJlbXUJJDQsJDUsLTB4ODAwMAotCi0jIGZvcmNlIHNvbWUgcGFkZGluZywgdG8gbWFrZSBvYmpkdW1wIGNvbnNpc3RlbnRseSByZXBvcnQgdGhhdCB0aGVyZSdzIHNvbWUKLSMgaGVyZS4uLgotCS5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiNDQ1ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBkbGkKLSNhczogLW1pcHMzCi0KLSMgVGVzdCB0aGUgZGxpIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAxMCA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDFjIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAyMCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMjQgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwMjggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHhmZmZmCi0wKzAwMzAgPFtePl0qPiBkc3JsMzIJXCRhMCxcJGEwLDB4MAotMCswMDM0IDxbXj5dKj4gbHVpCVwkYTAsMHhmZmZmCi0wKzAwMzggPFtePl0qPiBkc3JsMzIJXCRhMCxcJGEwLDB4MAotMCswMDNjIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMDQwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMDQ0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhjCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDgwMDAKLTArMDA0YyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0Ci0wKzAwNTAgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDU0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDU4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDEyMzQKLTArMDA1YyA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA2MCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHg1Njc4Ci0wKzAwNjQgPFtePl0qPiBsdWkJXCRhMCwweDgwMDAKLTArMDA2OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0Ci0wKzAwNmMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwNzAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4NTY3OAotMCswMDc0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDc4IDxbXj5dKj4gbGkJXCRhMCwtMzA4NzUKLTArMDA3YyA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDgwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDQzMjEKLTArMDA4NCA8W14+XSo+IGxpCVwkYTAsLTE2Ci0wKzAwODggPFtePl0qPiBsaQlcJGEwLC0yNTYKLTArMDA4YyA8W14+XSo+IGxpCVwkYTAsLTQwOTYKLTArMDA5MCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDk0IDxbXj5dKj4gbHVpCVwkYTAsMHhmZmYwCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhMCwweGZmMDAKLTArMDA5YyA8W14+XSo+IGx1aQlcJGEwLDB4ZjAwMAotMCswMGEwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGE0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBhOCA8W14+XSo+IGxpCVwkYTAsLTE2Ci0wKzAwYWMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMGIwIDxbXj5dKj4gbGkJXCRhMCwtMjU2Ci0wKzAwYjQgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMGI4IDxbXj5dKj4gbGkJXCRhMCwtNDA5NgotMCswMGJjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBjMCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAwYzQgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MTAKLTArMDBjOCA8W14+XSo+IGxpCVwkYTAsMHhmZmYwCi0wKzAwY2MgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MTAKLTArMDBkMCA8W14+XSo+IGxpCVwkYTAsMHhmZjAwCi0wKzAwZDQgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MTAKLTArMDBkOCA8W14+XSo+IGxpCVwkYTAsMHhmMDAwCi0wKzAwZGMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MTAKLTArMDBlMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBlNCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4NAotMCswMGU4IDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGVjIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwZjAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZjQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGMKLTArMDBmOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBmYyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4MTAKLTArMDEwMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDEwNCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4MTQKLTArMDEwOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDEwYyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4MTgKLTArMDExMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDExNCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4MWMKLTArMDExOCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMTFjIDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKLTArMDEyMCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmCi0wKzAxMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmZgotMCswMTI4IDxbXj5dKj4gbHVpCVwkYTAsMHhmZgotMCswMTJjIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDEzMCA8W14+XSo+IGx1aQlcJGEwLDB4ZgotMCswMTM0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDEzOCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAxM2MgPFtePl0qPiBsaQlcJGEwLDQwOTUKLTArMDE0MCA8W14+XSo+IGxpCVwkYTAsMjU1Ci0wKzAxNDQgPFtePl0qPiBsaQlcJGEwLDE1Ci0wKzAxNDggPFtePl0qPiBsdWkJXCRhMCwweDMKLTArMDE0YyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZjCi0wKzAxNTAgPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMTU0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxZQotMCswMTU4IDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDE1YyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgyCi0wKzAxNjAgPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMTY0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDYKLTArMDE2OCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDE2YyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAxNzAgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGEKLTArMDE3NCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDE3OCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MWMKLTArMDE3YyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YQotMCswMTgwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMTg0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxOAotMCswMTg4IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhhCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhMCwweDNmCi0wKzAxOTAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmMwMwotMCswMTk0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMTk4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDE5YyA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDFhMCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjMDAwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3OTUyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5zCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGRsaSBtYWNyby4KLQkKLWZvbzoJCi0JZGxpCSQ0LDAKLQlkbGkJJDQsMQotCWRsaQkkNCwtMQotCWRsaQkkNCwweDgwMDAKLQlkbGkJJDQsLTB4ODAwMAotCWRsaQkkNCwweDEwMDAwCi0JZGxpCSQ0LDB4MWE1YTUKLQlkbGkJJDQsMHg4MDAwMTIzNAotCWRsaQkkNCwweGZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDBmZmZmZmZmZgotCWRsaQkkNCwweGZmZmZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDBmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4ZmZmZmZmZmY4MDAwMTIzNAotCWRsaQkkNCwweGZmZmY4MDAwMTIzNDU2NzgKLQlkbGkJJDQsMHg4MDAwMTIzNDU2NzgwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmODc2NQotCWRsaQkkNCwweGZmZmZmZmZmZmZmZjQzMjEKLQotCWRsaQkkNCwweGZmZmZmZmZmZmZmZmZmZjAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZjAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmZjAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZjAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZjAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZjAwMDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZjAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZjAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZjAwMDAwMDAwMAotCWRsaQkkNCwweGZmZmZmZjAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZjAwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZjAwMDAwMDAwMDAwMAotCWRsaQkkNCwweGZmZjAwMDAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZjAwMDAwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZjAwMDAwMDAwMDAwMDAwMAotCi0JZGxpCSQ0LDB4MGZmZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwZmZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDBmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMGZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDBmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMGZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDBmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMGZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDBmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwMGZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwMDAwZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDAwMDBmCi0KLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDNmZmZjCi0JZGxpCSQ0LDB4MDAwMDNmZmZjMDAwMDAwMAotCWRsaQkkNCwweDAwMDNmZmZjMDAwMDAwMDAKLQlkbGkJJDQsMHgwMDNmZmZjMDAwMDAwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmZmZmZmMwMDAwMAotCWRsaQkkNCwweDAwM2ZmZmZmZmZmYzAwMDAKLQlkbGkJJDQsMHgwMDNmZmZmZmZmZmZjMDAwCi0KLQlkbGkJJDQsMHgwMDNmZmMwM2ZmZmZjMDAwCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2UzMi1yZWwyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2UzMi1yZWwyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNDk0MTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lMzItcmVsMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1zciAtaiAudGV4dAotI25hbWU6IE1JUFMgRUxGIHJlbG9jIDIgKDMyLWJpdCkKLSNzb3VyY2U6IGVsZi1yZWwyLnMKLQotIyBUZXN0IHRoZSBHUFJFTCBhbmQgTElURVJBTCBnZW5lcmF0aW9uLgotIyBGSVhNRTogcmVhbGx5IHRoaXMgc2hvdWxkIGNoZWNrIHRoYXQgdGhlIGNvbnRlbnRzIG9mIC5zZGF0YSwgLmxpdDQsCi0jIGFuZCAubGl0OCBhcmUgY29ycmVjdCB0b28uCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgZWxmLiptaXBzCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFtcLnRleHRcXToKLU9GRlNFVCAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCi0wKzAwMDAwMDAgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDA0IFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAwOCBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMGMgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDEwIFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAxNCBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMTggUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ0XCsweDArMDAwNDAwMAotMCswMDAwMDFjIFJfTUlQU19MSVRFUkFMICAgIFwubGl0NFwrMHgwKzAwMDQwMDAKLTArMDAwMDAyMCBSX01JUFNfTElURVJBTCAgICBcLmxpdDRcKzB4MCswMDA0MDAwCi0wKzAwMDAwMjQgUl9NSVBTX0dQUkVMMTYgICAgXC5zZGF0YVwrMHgwKzAwMDQwMDAKLTArMDAwMDAyOCBSX01JUFNfR1BSRUwxNiAgICBcLnNkYXRhXCsweDArMDAwNDAwMAotMCswMDAwMDJjIFJfTUlQU19HUFJFTDE2ICAgIFwuc2RhdGFcKzB4MCswMDA0MDAwCi0KLQotQ29udGVudHMgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0gMDAwMCBjNzgzYzAwMCBjNzgyYzAwNCBjNzgzYzAwOCBjNzgyYzAwYyAgLioKLSAwMDEwIGM3ODNjMDEwIGM3ODJjMDE0IGM3ODJjMDAwIGM3ODJjMDA0ICAuKgotIDAwMjAgYzc4MmMwMDggOGY4MmMwMDAgOGY4MmMwMDQgOGY4MmMwMDggIC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODBiZGQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotI29iamR1bXA6IC1zciAtaiAudGV4dAotI25hbWU6IE1JUFMgRUxGIHJlbG9jCi0KLSMgVGVzdCB0aGUgSEkxNi9MTzE2IGdlbmVyYXRpb24uCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgZWxmLiptaXBzCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFtcLnRleHRcXToKLU9GRlNFVCAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCi0wKzAwMDAwMDAgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMTggUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMGMgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMWMgUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMDggUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMjAgUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMDQgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMjQgUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMTQgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMjggUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMTAgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMmMgUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMzAgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwNDggUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMzQgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwNGMgUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwMzggUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwNTAgUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwM2MgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwNTQgUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwNDQgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwNTggUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwNDAgUl9NSVBTX0hJMTYgICAgICAgXC50ZXh0Ci0wKzAwMDAwNWMgUl9NSVBTX0xPMTYgICAgICAgXC50ZXh0Ci0KLQotQ29udGVudHMgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0gMDAwMCAzYzAxMDAwMCAzYzAxMDAwMCAzYzAxMDAwMSAzYzAxMDAwMSAgLioKLSAwMDEwIDNjMDEwMDAwIDNjMDEwMDAxIDIwMjEwMDE4IDIwMjEwMDFjICAuKgotIDAwMjAgMjAyMTAwMTggMjAyMTAwMWMgMjAyMTgwMTggMjAyMWZmZmMgIC4qCi0gMDAzMCAzYzAxMDAwMSAzYzAxMDAwMSAzYzAxMDAwMiAzYzAxMDAwMiAgLioKLSAwMDQwIDNjMDEwMDAxIDNjMDEwMDAxIDIwMjFiZmZlIDIwMjFjMDAyICAuKgotIDAwNTAgMjAyMWJmZmUgMjAyMWMwMDIgMjAyMTNmZmUgMjAyMWJmZmEgIC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg1MzQyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotCS50ZXh0Ci0JLmFsaWduIDE1Ci1sMDoKLWwyCT0gbDArNDkxNTAKLQotCS5zZXQJbm9hdAotCS5zZXQJbm9yZW9yZGVyCi0JbHVpCSRhdCwlaGkobDEpCi0JbHVpCSRhdCwlaGkobDErNCkKLQlsdWkJJGF0LCVoaShsMSsweDEwMDAwKQotCWx1aQkkYXQsJWhpKGwxKzB4MTAwMDQpCi0JbHVpCSRhdCwlaGkobDAtNCkKLQlsdWkJJGF0LCVoaShsMSsweDgwMDApCi1sMToJCQotCWFkZGkJJGF0LCRhdCwlbG8obDEpCi0JYWRkaQkkYXQsJGF0LCVsbyhsMSsweDEwMDA0KQotCWFkZGkJJGF0LCRhdCwlbG8obDErMHgxMDAwMCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwxKzQpCi0JYWRkaQkkYXQsJGF0LCVsbyhsMSsweDgwMDApCi0JYWRkaQkkYXQsJGF0LCVsbyhsMC00KQotCi0JbHVpCSRhdCwlaGkobDIpCi0JbHVpCSRhdCwlaGkobDIrNCkKLQlsdWkJJGF0LCVoaShsMisweDEwMDAwKQotCWx1aQkkYXQsJWhpKGwyKzB4MTAwMDQpCi0JbHVpCSRhdCwlaGkobDItNCkKLQlsdWkJJGF0LCVoaShsMisweDgwMDApCi0JYWRkaQkkYXQsJGF0LCVsbyhsMikKLQlhZGRpCSRhdCwkYXQsJWxvKGwyKzQpCi0JYWRkaQkkYXQsJGF0LCVsbyhsMisweDEwMDAwKQotCWFkZGkJJGF0LCRhdCwlbG8obDIrMHgxMDAwNCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwyKzB4ODAwMCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwyLTQpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMGZhY2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI29iamR1bXA6IC1zciAtaiAudGV4dAotI25hbWU6IE1JUFMgRUxGIHJlbG9jIDIKLQotIyBUZXN0IHRoZSBHUFJFTCBhbmQgTElURVJBTCBnZW5lcmF0aW9uLgotIyBGSVhNRTogcmVhbGx5IHRoaXMgc2hvdWxkIGNoZWNrIHRoYXQgdGhlIGNvbnRlbnRzIG9mIC5zZGF0YSwgLmxpdDQsCi0jIGFuZCAubGl0OCBhcmUgY29ycmVjdCB0b28uCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgZWxmLiptaXBzCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFtcLnRleHRcXToKLU9GRlNFVCAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCi0wKzAwMDAwMDAgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDA0IFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAwOCBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMGMgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ0XCsweDArMDAwNDAwMAotMCswMDAwMDEwIFJfTUlQU19MSVRFUkFMICAgIFwubGl0NFwrMHgwKzAwMDQwMDAKLTArMDAwMDAxNCBSX01JUFNfTElURVJBTCAgICBcLmxpdDRcKzB4MCswMDA0MDAwCi0wKzAwMDAwMTggUl9NSVBTX0dQUkVMMTYgICAgXC5zZGF0YVwrMHgwKzAwMDQwMDAKLTArMDAwMDAxYyBSX01JUFNfR1BSRUwxNiAgICBcLnNkYXRhXCsweDArMDAwNDAwMAotMCswMDAwMDIwIFJfTUlQU19HUFJFTDE2ICAgIFwuc2RhdGFcKzB4MCswMDA0MDAwCi0KLQotQ29udGVudHMgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0gMDAwMCBkNzgyYzAwMCBkNzgyYzAwOCBkNzgyYzAxMCBjNzgyYzAwMCAgLioKLSAwMDEwIGM3ODJjMDA0IGM3ODJjMDA4IDhmODJjMDAwIDhmODJjMDA0ICAuKgotIDAwMjAgOGY4MmMwMDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODEyY2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotCS5zZGF0YQotCS5hbGlnbiAyCi0JLnR5cGUgdzEsQG9iamVjdAotCS5zaXplIHcxLDQKLXcxOgkud29yZAkxCi0JLnR5cGUgdzIsQG9iamVjdAotCS5zaXplIHcyLDQKLXcyOgkud29yZAkyCi0JLnR5cGUgdzMsQG9iamVjdAotCS5zaXplIHczLDQKLXczOgkud29yZAkzCi0JCi0JLnRleHQKLQkuYWxpZ24gMgotbDA6Ci0JLnNldAlub3Jlb3JkZXIKLQotICAgICAgICBsaS5kICAgICRmMiwxLjEwMDAwMDAwMDAwMDAwMDAwMDAwZTAKLSAgICAgICAgbGkuZCAgICAkZjIsMi4xMDAwMDAwMDAwMDAwMDAwMDAwMGUwCi0gICAgICAgIGxpLmQgICAgJGYyLDMuMTAwMDAwMDAwMDAwMDAwMDAwMDBlMAotICAgICAgICBsaS5zICAgICRmMiwxLjEwMDAwMDAwMDAwMDAwMDAwMDAwZTAKLSAgICAgICAgbGkucyAgICAkZjIsMi4xMDAwMDAwMDAwMDAwMDAwMDAwMGUwCi0gICAgICAgIGxpLnMgICAgJGYyLDMuMTAwMDAwMDAwMDAwMDAwMDAwMDBlMAotCi0JLnNldAlub21hY3JvCi0JCi0JbHcJJDIsdzEKLQlsdwkkMix3MgotCWx3CSQyLHczCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLmMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTVmOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzbid0IGRpcmVjdGx5IHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGU7IGl0IHVzZXMKLSAgIGVsZl9lX2ZsYWdzLnMuICBIb3dldmVyLCBJIGZpZ3VyZWQgaXQgd291bGQgYmUgbmljZSB0byBwcm92aWRlIHRoZQotICAgc291cmNlIGNvZGUgZnJvbSB3aGljaCB0aGUgLnMgZmlsZSB3YXMgZ2VuZXJhdGVkLgotCi0gICBJdCB3YXMgY29tcGlsZWQgYXMgZm9sbG93czoKLQotICAgbWlwczY0LWVsZi1nY2MgLW00NjUwIC1TIC1PIGVsZl9lX2ZsYWdzLmMKLQotICAgV2UgdXNlIHRoZSAtbTQ2NTAgZmxhZyB0byBnZXQgdGhlIDQ2NTAtc3BlY2lmaWMgJ211bCcgaW5zdHJ1Y3Rpb24KLSAgIGluIHRoZXJlOyB0aGUgdGVzdCBzdWl0ZSB3YW50cyB0byBiZSBzdXJlIHRoYXQgR0FTJ3MgLW00NjUwIGZsYWcKLSAgIHdpbGwgaW5kZWVkIGNhdXNlIGl0IHRvIGdlbmVyYXRlIHRoZSA0NjUwIG11bCBpbnN0cnVjdGlvbiwgYW5kIG5vdAotICAgZXhwYW5kIGl0IGFzIGEgbWFjcm8uCi0KLSAgIElhbiAxMCBKdW5lIDE5OTk6IEkgdHdlYWtlZCB0aGUgcmVzdWx0aW5nIGFzc2VtYmxlciBmaWxlIHNvIHRoYXQgaXQKLSAgIHdvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIGNvZGUgd2hlbiBnYXMgd2FzIGNvbmZpZ3VyZWQgZm9yIG1pcHMtZWxmCi0gICBhbmQgZm9yIG1pcHM2NC1lbGYuICAqLwotCi1pbnQKLWZvbyAoaW50IGEsIGludCBiKQotewotICByZXR1cm4gKGEgKiBiKSArIDE7Ci19Ci0KLWludAotbWFpbiAoKQotewotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjYThjNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0JLmZpbGUJMSAiZWxmX2VfZmxhZ3MuYyIKLWdjYzJfY29tcGlsZWQuOgotX19nbnVfY29tcGlsZWRfYzoKLQkudGV4dAotCS5hbGlnbgkyCi0JLmdsb2JsCWZvbwotCS50ZXh0Ci0JLmVudAlmb28KLWZvbzoKLQkuZnJhbWUJJHNwLDAsJDMxCQkjIHZhcnM9IDAsIHJlZ3M9IDAvMCwgYXJncz0gMCwgZXh0cmE9IDAKLQkubWFzawkweDAwMDAwMDAwLDAKLQkuZm1hc2sJMHgwMDAwMDAwMCwwCi0JbXVsCSQyLCQ0LCQ1Ci0JLnNldAlub3Jlb3JkZXIKLQkuc2V0CW5vbWFjcm8KLQlqCSQzMQotCWFkZHUJJDIsJDIsMQotCS5zZXQJbWFjcm8KLQkuc2V0CXJlb3JkZXIKLQotCS5lbmQJZm9vCi0JLmFsaWduCTIKLQkuZ2xvYmwJbWFpbgotCS50ZXh0Ci0JLmVudAltYWluCi1tYWluOgotCS5mcmFtZQkkc3AsNDAsJDMxCQkjIHZhcnM9IDAsIHJlZ3M9IDEvMCwgYXJncz0gMzIsIGV4dHJhPSAwCi0JLm1hc2sJMHg4MDAwMDAwMCwtOAotCS5mbWFzawkweDAwMDAwMDAwLDAKLQlzdWJ1CSRzcCwkc3AsNDAKLQlzdwkkMzEsMzIoJHNwKQotCWphbAlfX2djY21haW4KLQltb3ZlCSQyLCQwCi0JbHcJJDMxLDMyKCRzcCkKLQlub3AKLQkuc2V0CW5vcmVvcmRlcgotCS5zZXQJbm9tYWNybwotCWoJJDMxCi0JYWRkdQkkc3AsJHNwLDQwCi0JLnNldAltYWNybwotCS5zZXQJcmVvcmRlcgotCi0JLmVuZAltYWluCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhYTJmMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMS5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBuYW1lOiBFTEYgZV9mbGFnczogbm90aGluZyBzcGVjaWFsCi0jIHNvdXJjZTogZWxmX2VfZmxhZ3MucwotIyBvYmpkdW1wOiAtZmQKLQotLio6LipmaWxlIGZvcm1hdC4qbWlwcy4qCi1hcmNoaXRlY3R1cmU6IG1pcHM6WzM0XVswLTldMDAsIGZsYWdzIDB4MDAwMDAwMTE6Ci1IQVNfUkVMT0MsIEhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMDAwMDAwMDAwIDxmb28+OgotICAgMDoJMDA4NTAwMTkgCW11bHR1CVwkYTAsXCRhMQotICAgNDoJMDAwMDEwMTIgCW1mbG8JXCR2MAotICAgODoJMDNlMDAwMDggCWpyCVwkcmEKLSAgIGM6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQotCi0wMDAwMDAwMDAwMDAwMDEwIDxtYWluPjoKLSAgMTA6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCi0gIDE0OglhZmJmMDAyMCAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gIDE4OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KLSAgMWM6CTAwMDAwMDAwIAlub3AKLSAgMjA6CTAwMDAxMDJbMWRdIAltb3ZlCVwkdjAsXCR6ZXJvCi0gIDI0Ogk4ZmJmMDAyMCAJbHcJXCRyYSwzMlwoXCRzcFwpCi0gIDI4OgkwMDAwMDAwMCAJbm9wCi0gIDJjOgkwM2UwMDAwOCAJanIJXCRyYQotICAzMDoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTNiZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczIuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgbmFtZTogRUxGIGVfZmxhZ3M6IC1tNDY1MAotIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKLSMgYXM6IC1tNDY1MAotIyBvYmpkdW1wOiAtZmQKLQotLio6LipmaWxlIGZvcm1hdC4qbWlwcy4qCi1hcmNoaXRlY3R1cmU6IG1pcHM6NDY1MCwgZmxhZ3MgMHgwMDAwMDAxMToKLUhBU19SRUxPQywgSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMDAwMDAwMDAwCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwMDAwMDAwMDAgPGZvbz46Ci0gICAwOgk3MDg1MTAwMiAJbXVsCVwkdjAsXCRhMCxcJGExCi0gICA0OgkwM2UwMDAwOCAJanIJXCRyYQotICAgODoJMjQ0MjAwMDEgCWFkZGl1CVwkdjAsXCR2MCwxCi0KLTAwMDAwMDAwMDAwMDAwMGMgPG1haW4+OgotICAgYzoJMjdiZGZmZDggCWFkZGl1CVwkc3AsXCRzcCwtNDAKLSAgMTA6CWFmYmYwMDIwIAlzdwlcJHJhLDMyXChcJHNwXCkKLSAgMTQ6CTBjMDAwMDAwIAlqYWwJMCA8Zm9vPgotICAxODoJMDAwMDAwMDAgCW5vcAotICAxYzoJMDAwMDEwMmQgCW1vdmUJXCR2MCxcJHplcm8KLSAgMjA6CThmYmYwMDIwIAlsdwlcJHJhLDMyXChcJHNwXCkKLSAgMjQ6CTAwMDAwMDAwIAlub3AKLSAgMjg6CTAzZTAwMDA4IAlqcglcJHJhCi0gIDJjOgkyN2JkMDAyOCAJYWRkaXUJXCRzcCxcJHNwLDQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxMzQ5MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBuYW1lOiBFTEYgZV9mbGFnczogLW1jcHU9NDY1MAotIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKLSMgYXM6IC1tY3B1PTQ2NTAKLSMgb2JqZHVtcDogLWZkCi0KLS4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgotYXJjaGl0ZWN0dXJlOiBtaXBzOjQ2NTAsIGZsYWdzIDB4MDAwMDAwMTE6Ci1IQVNfUkVMT0MsIEhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMDAwMDAwMDAwIDxmb28+OgotICAgMDoJNzA4NTEwMDIgCW11bAlcJHYwLFwkYTAsXCRhMQotICAgNDoJMDNlMDAwMDggCWpyCVwkcmEKLSAgIDg6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQotCi0wMDAwMDAwMDAwMDAwMDBjIDxtYWluPjoKLSAgIGM6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCi0gIDEwOglhZmJmMDAyMCAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gIDE0OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KLSAgMTg6CTAwMDAwMDAwIAlub3AKLSAgMWM6CTAwMDAxMDJkIAltb3ZlCVwkdjAsXCR6ZXJvCi0gIDIwOgk4ZmJmMDAyMCAJbHcJXCRyYSwzMlwoXCRzcFwpCi0gIDI0OgkwMDAwMDAwMCAJbm9wCi0gIDI4OgkwM2UwMDAwOCAJanIJXCRyYQotICAyYzoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2ViYTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgbmFtZTogRUxGIGVfZmxhZ3M6IC1tNDY1MCAtbWNwdT00NjUwCi0jIHNvdXJjZTogZWxmX2VfZmxhZ3MucwotIyBhczogLW00NjUwIC1tY3B1PTQ2NTAKLSMgb2JqZHVtcDogLWZkCi0KLS4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgotYXJjaGl0ZWN0dXJlOiBtaXBzOjQ2NTAsIGZsYWdzIDB4MDAwMDAwMTE6Ci1IQVNfUkVMT0MsIEhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMDAwMDAwMDAwIDxmb28+OgotICAgMDoJNzA4NTEwMDIgCW11bAlcJHYwLFwkYTAsXCRhMQotICAgNDoJMDNlMDAwMDggCWpyCVwkcmEKLSAgIDg6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQotCi0wMDAwMDAwMDAwMDAwMDBjIDxtYWluPjoKLSAgIGM6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCi0gIDEwOglhZmJmMDAyMCAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gIDE0OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KLSAgMTg6CTAwMDAwMDAwIAlub3AKLSAgMWM6CTAwMDAxMDJkIAltb3ZlCVwkdjAsXCR6ZXJvCi0gIDIwOgk4ZmJmMDAyMCAJbHcJXCRyYSwzMlwoXCRzcFwpCi0gIDI0OgkwMDAwMDAwMCAJbm9wCi0gIDI4OgkwM2UwMDAwOCAJanIJXCRyYQotICAyYzoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY4YTc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0gICAgOyBIZXJlLCB0aGUgcHJvY2Vzc29ycyByZXByZXNlbnQgbWlwcyBjb3Byb2Nlc3NvcnMuCi0KLSAgICBwMSBkcmVnIGQxIDEgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDEiIGZvciBDT1AxIGhhcyB2YWx1ZSAxCi0gICAgcDEgY3JlZyBjMyAzICAgICAgICA7IGN0cmwgcmVnaXN0ZXIgImMzIiBmb3IgQ09QMSBoYXMgdmFsdWUgMwotICAgIHAzIGluc24gZmllIDB4MWU6MjQtMjAgICAgICA7IGZ1bmN0aW9uICJmaWxsIiBmb3IgQ09QMyBoYXMgdmFsdWUgMzEKLSAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0gICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLSAgICBwMyBpbnNuIGZlZSAweDFlOjI0LTIwLGRyZWc6MTctMTMsY3JlZzoxMi04LGltbWVkOjctMAotCi0gICAgcDMgZHJlZyBkMyAzICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotICAgIHAzIGNyZWcgYzIgMjIgICAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0gICAgcDMgaW5zbiBmdW0gMHgwMWUwMDAwMSBkcmVnOjE3LTEzIGNyZWc6MTItOAotICAgIHAzIGluc24gZm9oIDB4ZjoyNC0yMSBkcmVnOjIwLTE2IGltbWVkOjE1LTAKLQotICAgIHAzIGluc24gcGlnIDB4MToyNC0yMSpbMHgxMDB8MHgyXSwgZHJlZzoyMC0xNiwgaW1tZWQ6MTUtMCoweDEwMDAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODU1NDViLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCi0gICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgotICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCi0gICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KLQotICAgIDsgQ2FsbCBtaXBzIGNvcHJvY2Vzc29yICJjb2Z1biJzIGFzIGRlZmluZWQgaW4gIml0YmwiLgotCi0gICAgZmVlICRkMywkYzIsMHgxIAk7ICAweDRmZjA3NjAxCi0gICAgZmllIAkgIAk7ICAweDRmZjAwMDAwCi0gICAgZm9oICQyLDB4MTAwCi0gICAgZnVtICRkMywkYzIgICAgIAk7ICAweDRmZjA3NjAxCi0gICAgcGlnICQyLDB4MTAwCi0KLSAgICA7IENhbGwgYSBtaXBzIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIHdpdGggcmVnaXN0ZXIgImQxIiAKLSAgICA7IGRlZmluZWQgaW4gIml0YmwiLgotCi0gICAgTFdDMSAkZDEsMHgxMDAoJDIpCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDZjY2ZhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgamFsLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotI3NvdXJjZTogamFsLnMKLQotIyBUZXN0IHRoZSBqYWwgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGphbHIJXCRhMCxcJHQ5Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGJhbAkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjEwOiBQQ1JFTDE2CS50ZXh0Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGJhbAkwKzAwMTggPHRleHRfbGFiZWxcKygweHwpMTg+Ci1bIAldKjE4OiBQQ1JFTDE2CWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDAxYyA8W14+XSo+IG5vcAotMCswMDIwIDxbXj5dKj4gYgkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjIwOiBQQ1JFTDE2CS50ZXh0Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGIJMCswMDI4IDx0ZXh0X2xhYmVsXCsoMHh8KTI4PgotWyAJXSoyODogUENSRUwxNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1YmU3Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgUjMwMDAgamFsLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDIC1tY3B1PXIzMDAwCi0KLSMgVGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx1aQlcJGdwLDB4MAotWyAJXSowOiBSX01JUFNfSEkxNglfZ3BfZGlzcAotMCswMDA0IDxbXj5dKj4gYWRkaXUJXCRncCxcJGdwLDAKLVsgCV0qNDogUl9NSVBTX0xPMTYJX2dwX2Rpc3AKLTArMDAwOCA8W14+XSo+IGFkZHUJXCRncCxcJGdwLFwkdDkKLTArMDAwYyA8W14+XSo+IHN3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMTAgPFtePl0qPiBqYWxyCVwkdDkKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDAxYyA8W14+XSo+IGphbHIJXCRhMCxcJHQ5Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMjggPFtePl0qPiBub3AKLTArMDAyYyA8W14+XSo+IGx3CVwkdDksMFwoXCRncFwpCi1bIAldKjJjOiBSX01JUFNfR09UMTYJLnRleHQKLTArMDAzMCA8W14+XSo+IG5vcAotMCswMDM0IDxbXj5dKj4gYWRkaXUJXCR0OSxcJHQ5LDAKLVsgCV0qMzQ6IFJfTUlQU19MTzE2CS50ZXh0Ci0wKzAwMzggPFtePl0qPiBqYWxyCVwkdDkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDA0NCA8W14+XSo+IG5vcAotMCswMDQ4IDxbXj5dKj4gbHcJXCR0OSwwXChcJGdwXCkKLVsgCV0qNDg6IFJfTUlQU19DQUxMMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBqYWxyCVwkdDkKLTArMDA1NCA8W14+XSo+IG5vcAotMCswMDU4IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDA1YyA8W14+XSo+IGIJMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg5ZGZhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBqYWwgbWFjcm8gd2l0aCAtS1BJQyBjb2RlLgotCQotdGV4dF9sYWJlbDoJCi0JLnNldAlub3Jlb3JkZXIKLQkuY3Bsb2FkCSQyNQotCS5zZXQJcmVvcmRlcgotCS5jcHJlc3RvcmUJMAotCWphbAkkMjUKLQlqYWwJJDQsJDI1Ci0JamFsCXRleHRfbGFiZWwKLQlqYWwJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCQotIyBUZXN0IGogYXMgd2VsbAkKLQlqCXRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2ZGNhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgUjMwMDAgamFsLXhnb3QKLSNhczogLW1pcHMxIC1LUElDIC14Z290IC1tY3B1PXIzMDAwCi0jc291cmNlOiBqYWwtc3ZyNHBpYy5zCi0KLSMgVGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx1aQlcJGdwLDB4MAotWyAJXSowOiBSX01JUFNfSEkxNglfZ3BfZGlzcAotMCswMDA0IDxbXj5dKj4gYWRkaXUJXCRncCxcJGdwLDAKLVsgCV0qNDogUl9NSVBTX0xPMTYJX2dwX2Rpc3AKLTArMDAwOCA8W14+XSo+IGFkZHUJXCRncCxcJGdwLFwkdDkKLTArMDAwYyA8W14+XSo+IHN3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMTAgPFtePl0qPiBqYWxyCVwkdDkKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDAxYyA8W14+XSo+IGphbHIJXCRhMCxcJHQ5Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMjggPFtePl0qPiBub3AKLTArMDAyYyA8W14+XSo+IGx3CVwkdDksMFwoXCRncFwpCi1bIAldKjJjOiBSX01JUFNfR09UMTYJLnRleHQKLTArMDAzMCA8W14+XSo+IG5vcAotMCswMDM0IDxbXj5dKj4gYWRkaXUJXCR0OSxcJHQ5LDAKLVsgCV0qMzQ6IFJfTUlQU19MTzE2CS50ZXh0Ci0wKzAwMzggPFtePl0qPiBqYWxyCVwkdDkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDA0NCA8W14+XSo+IGx1aQlcJHQ5LDB4MAotWyAJXSo0NDogUl9NSVBTX0NBTExfSEkxNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwNDggPFtePl0qPiBhZGR1CVwkdDksXCR0OSxcJGdwCi0wKzAwNGMgPFtePl0qPiBsdwlcJHQ5LDBcKFwkdDlcKQotWyAJXSo0YzogUl9NSVBTX0NBTExfTE8xNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGphbHIJXCR0OQotMCswMDU4IDxbXj5dKj4gbm9wCi0wKzAwNWMgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDYwIDxbXj5dKj4gYgkwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiNTg2Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGphbAotCi0jIFRlc3QgdGhlIGphbCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGphbHIJXCRhMCxcJHQ5Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGphbAkwKyA8dGV4dF9sYWJlbD4KLVsgCV0qMTA6IChNSVBTX0pNUHxNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJLnRleHQKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gamFsCTArIDx0ZXh0X2xhYmVsPgotWyAJXSoxODogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQlleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwMWMgPFtePl0qPiBub3AKLTArMDAyMCA8W14+XSo+IGoJMCsgPHRleHRfbGFiZWw+Ci1bIAldKjIwOiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGoJMCsgPHRleHRfbGFiZWw+Ci1bIAldKjI4OiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDAyYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWJlOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBqYWwgbWFjcm8uCi0JLmdsb2JsCXRleHRfbGFiZWwJLnRleHQKLXRleHRfbGFiZWw6CQotCWphbAkkMjUKLQlqYWwJJDQsJDI1Ci0JamFsCXRleHRfbGFiZWwKLQlqYWwJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCQotIyBUZXN0IGogYXMgd2VsbAkKLQlqCXRleHRfbGFiZWwKLQlqCWV4dGVybmFsX3RleHRfbGFiZWwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyOTU3MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxhLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotCi0jIFRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAotMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDFjIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMjQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0Ci1bIAldKjUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo1NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0Ci1bIAldKjY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODQKLVsgCV0qNjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MwotWyAJXSo2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKjc0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKjc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA3YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MwotWyAJXSo4MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE1MzgzCi1bIAldKjg0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODQKLVsgCV0qODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA5MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBiMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODQKLVsgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNTM4NAotWyAJXSpiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2MzgzCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYzggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGQwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGQ4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGUwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2MzgzCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBmMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODMKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmY4OiBSRUxISQlleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMjUyCi1bIAldKmZjOiBSRUxMTwlleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAxMDAgPFtePl0qPiBsaQlcJGEwLDI0OAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRmNWUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMucworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotdGV4dF9sYWJlbDoJCi0JbGEJJDQsMAotCWxhCSQ0LDEKLQlsYQkkNCwweDgwMDAKLQlsYQkkNCwtMHg4MDAwCi0JbGEJJDQsMHgxMDAwMAotCWxhCSQ0LDB4MWE1YTUKLQlsYQkkNCwwKCQ1KQotCWxhCSQ0LDEoJDUpCi0JbGEJJDQsMHg4MDAwKCQ1KQotCWxhCSQ0LC0weDgwMDAoJDUpCi0JbGEJJDQsMHgxMDAwMCgkNSkKLQlsYQkkNCwweDFhNWE1KCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxhCSQ0LGRhdGFfbGFiZWwrMQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGEJJDQsZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCi1zZWNvbmRfdGV4dF9sYWJlbDoJCi0JbGEJJDQsZXh0ZXJuYWxfdGV4dF9sYWJlbCAtIHRleHRfbGFiZWwKLQlsYQkkNCxzZWNvbmRfdGV4dF9sYWJlbCAtIHRleHRfbGFiZWwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTMzZTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxhLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDIC0tZGVmc3ltIEtQSUM9MQotI3NvdXJjZTogbGEucwotCi0jIFRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMAotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGExLDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwxCi1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGExLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMxNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMjEzMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYWVmMDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxhLXhnb3QKLSNhczogLW1pcHMxIC1LUElDIC14Z290IC0tZGVmc3ltIEtQSUM9MQotI3NvdXJjZTogbGEucwotCi0jIFRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMAotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGExLDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwxCi1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGExLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMxNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMjEzMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4MzE3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxhCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIGxhIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4YzgxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxhIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsYQkkNCwwCi0JbGEJJDQsMQotCWxhCSQ0LDB4ODAwMAotCWxhCSQ0LC0weDgwMDAKLQlsYQkkNCwweDEwMDAwCi0JbGEJJDQsMHgxYTVhNQotCWxhCSQ0LDAoJDUpCi0JbGEJJDQsMSgkNSkKLQlsYQkkNCwweDgwMDAoJDUpCi0JbGEJJDQsLTB4ODAwMCgkNSkKLQlsYQkkNCwweDEwMDAwKCQ1KQotCWxhCSQ0LDB4MWE1YTUoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbAotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGEJJDQsZGF0YV9sYWJlbCsxCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsYQkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGEJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsYQkkNCxkYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGEJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0JLmlmbmRlZglLUElDCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI0YTMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGItZW1waWMKLSNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljCi0jc291cmNlOiBsYi1waWMucwotCi0jIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qNTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA1OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCi1bIAldKjU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNWMgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo1YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjAgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA2OCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qNjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDZjIDxbXj5dKj4gbGIJXCRhMCwtMTUzODRcKFwkZ3BcKQotWyAJXSo2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNzAgPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRncFwpCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwNzQgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo3NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qNzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDdjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qODA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRncFwpCi1bIAldKjg0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4OCA8W14+XSo+IGxiCVwkYTAsLTE1MzgzXChcJGdwXCkKLVsgCV0qODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDhjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMDkwIDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkYTBcKQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMDk4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBhOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBiMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGI4IDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkYTBcKQotWyAJXSpiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYzAgPFtePl0qPiBsYglcJGEwLC0xNTM4NFwoXCRhMFwpCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBjOCA8W14+XSo+IGxiCVwkYTAsLTE2MzgzXChcJGEwXCkKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBkMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZDggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSpkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSplMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsLTE2MzgzXChcJGEwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGY4IDxbXj5dKj4gbGIJXCRhMCwtMTUzODNcKFwkYTBcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItcGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNmZGY5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGIgbWFjcm8gd2l0aCBQSUMgY29kZS4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGIJJDQsMAotCWxiCSQ0LDEKLQlsYgkkNCwweDgwMDAKLQlsYgkkNCwtMHg4MDAwCi0JbGIJJDQsMHgxMDAwMAotCWxiCSQ0LDB4MWE1YTUKLQlsYgkkNCwwKCQ1KQotCWxiCSQ0LDEoJDUpCi0JbGIJJDQsMHg4MDAwKCQ1KQotCWxiCSQ0LC0weDgwMDAoJDUpCi0JbGIJJDQsMHgxMDAwMCgkNSkKLQlsYgkkNCwweDFhNWE1KCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxiCSQ0LGRhdGFfbGFiZWwrMQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGIJJDQsZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXN2cjRwaWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4ODRkNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGItc3ZyNHBpYwotI2FzOiAtbWlwczEgLUtQSUMKLSNzb3VyY2U6IGxiLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8gd2l0aCAtS1BJQy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGIJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMGMgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMTAgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDAxYyA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDIwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGExXCkKLTArMDAyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMVwpCi0wKzAwMmMgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAzOCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA0OCA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDU4IDxbXj5dKj4gbm9wCi0wKzAwNWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo1YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBub3AKLTArMDA2YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo3MDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IG5vcAotMCswMDc4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjdjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qODg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4YyA8W14+XSo+IG5vcAotMCswMDkwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA5NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjk0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMDk4IDxbXj5dKj4gbm9wCi0wKzAwOWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo5YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMGEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMGE4IDxbXj5dKj4gbm9wCi0wKzAwYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSphYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMGIwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmI0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBiOCA8W14+XSo+IG5vcAotMCswMGJjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qYmM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYzAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYzQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gbm9wCi0wKzAwY2MgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZDA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDQgPFtePl0qPiBub3AKLTArMDBkOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpkYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlMCA8W14+XSo+IG5vcAotMCswMGU0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBlOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmU4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBub3AKLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpmNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBmOCA8W14+XSo+IG5vcAotMCswMGZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qZmM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEwMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMDQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMDggPFtePl0qPiBub3AKLTArMDEwYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjEwYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTEwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDExNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjExNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxMTggPFtePl0qPiBub3AKLTArMDExYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjExYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDEyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMjg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbm9wCi0wKzAxMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxMzQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTM4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gbm9wCi0wKzAxNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTQ4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbm9wCi0wKzAxNTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNTQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTU4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBub3AKLTArMDE2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE2NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNmMgPFtePl0qPiBub3AKLTArMDE3MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE3MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTc4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE3YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE4MCA8W14+XSo+IG5vcAotMCswMTg0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMTg0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxODggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxOGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTkwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTk4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWEwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFhNDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTggPFtePl0qPiBub3AKLTArMDFhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjggPFtePl0qPiBub3AKLTArMDFiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFjMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxYzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYzQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzggPFtePl0qPiBub3AKLTArMDFjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZDQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkOCA8W14+XSo+IG5vcAotMCswMWRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWUwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFlNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFlOCA8W14+XSo+IG5vcAotMCswMWVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMWVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZjQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWY4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWZjIDxbXj5dKj4gbm9wCi0wKzAyMDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoyMDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDIwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIwOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMGMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC1pbG9ja3MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4YmQyNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLXhnb3QtaWxvY2tzCi0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtbWNwdT1yMzkwMAotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDwuKj4gbGIJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDwuKj4gbGIJXCRhMCwxXChcJHplcm9cKQotMCswMDA4IDwuKj4gbHVpCVwkYTAsMHgxCi0wKzAwMGMgPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMTAgPC4qPiBsYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAxNCA8Lio+IGx1aQlcJGEwLDB4MQotMCswMDE4IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDAxYyA8Lio+IGx1aQlcJGEwLDB4MgotMCswMDIwIDwuKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDI0IDwuKj4gbGIJXCRhMCwwXChcJGExXCkKLTArMDAyOCA8Lio+IGxiCVwkYTAsMVwoXCRhMVwpCi0wKzAwMmMgPC4qPiBsdWkJXCRhMCwweDEKLTArMDAzMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8Lio+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAzOCA8Lio+IGxiCVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDAzYyA8Lio+IGx1aQlcJGEwLDB4MQotMCswMDQwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA0OCA8Lio+IGx1aQlcJGEwLDB4MgotMCswMDRjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDwuKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDU0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTU0OiBSX01JUFNfR09UMTYJXC5kYXRhCi0wKzAwNTggPC4qPiBub3AKLTArMDA1YyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQk1YzogUl9NSVBTX0xPMTYJXC5kYXRhCi0wKzAwNjAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDY0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQk2NDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwNmMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJNmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDcwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA3NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJNzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwN2MgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJN2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwODAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDg0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQk4NDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA4YyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQk4YzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwOTQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTk0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwOWMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJOWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhMCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYTQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJYTQ6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMGE4IDwuKj4gbm9wCi0wKzAwYWMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJYWM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAwYjAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCWI0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDBiOCA8Lio+IG5vcAotMCswMGJjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLQkJCWJjOiBSX01JUFNfTE8xNglcLmJzcwotMCswMGMwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBjNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQljNDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMGM4IDwuKj4gbm9wCi0wKzAwY2MgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJY2M6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMGQwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBkNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJZDQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGRjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCWRjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZTQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCWU0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGVjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCWVjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBmNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJZjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZmMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJZmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTA0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxMDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEwYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxMGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDExMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMTQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMTE0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDExOCA8Lio+IG5vcAotMCswMTFjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTExYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDEyMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMjQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMTI0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDEyOCA8Lio+IG5vcAotMCswMTJjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLQkJCTEyYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDEzMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMzQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMTM0OiBSX01JUFNfR09UMTYJXC5kYXRhCi0wKzAxMzggPC4qPiBub3AKLTArMDEzYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxM2M6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMTQwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTQ0IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE0OCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTQ4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0YyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE1MCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxNTA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTU0IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTU4IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE1YyA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTVjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTY0IDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTE2NDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE2YyA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNzAgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE3MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3NCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE3OCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxNzg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxN2MgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxODAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTg0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxODQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE4OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE4YyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxOGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE5MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxOTggPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMTk4OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDE5YyA8Lio+IG5vcAotMCswMWEwIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTFhMDogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDFhNCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhOCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxYWMgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMWFjOiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDFiMCA8Lio+IG5vcAotMCswMWI0IDwuKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLQkJCTFiNDogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDFiOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiYyA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxYzAgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMWMwOiBSX01JUFNfR09UMTYJXC5kYXRhCi0wKzAxYzQgPC4qPiBub3AKLTArMDFjOCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxYzg6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMWNjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWQwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFkNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMWQ0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFkYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxZGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWUwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWU0IDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFlOCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMWU4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWYwIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTFmMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmNCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFmOCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZmMgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTFmYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDIwNCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkyMDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMGMgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjEwIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkyMTA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIxNCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDIxOCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkyMTg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIxYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIyMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMjQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMjI0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDIyOCA8Lio+IG5vcAotMCswMjJjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTIyYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDIzMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIzNCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMzggPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMjM4OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDIzYyA8Lio+IG5vcAotMCswMjQwIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLQkJCTI0MDogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDI0NCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI0OCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyNGMgPC4qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOGM2N2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLXhnb3QKLSNhczogLW1pcHMxIC1LUElDIC14Z290IC1tY3B1PXIzMDAwCi0jc291cmNlOiBsYi1waWMucwotCi0jIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA1OCA8W14+XSo+IG5vcAotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwNjAgPFtePl0qPiBub3AKLTArMDA2NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNzA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gbm9wCi0wKzAwNzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjdjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qODQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qOTA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo5ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5YyA8W14+XSo+IG5vcAotMCswMGEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBhNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSphNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qYWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IG5vcAotMCswMGI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmI4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMGJjIDxbXj5dKj4gbm9wCi0wKzAwYzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpjMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qY2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwZDAgPFtePl0qPiBub3AKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKmQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwZDggPFtePl0qPiBub3AKLTArMDBkYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSplMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwZTQgPFtePl0qPiBub3AKLTArMDBlOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmU4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGVjIDxbXj5dKj4gbm9wCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEwMCA8W14+XSo+IG5vcAotMCswMTA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMDg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxMTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxMTA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMTQgPFtePl0qPiBub3AKLTArMDExOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTFjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTI0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTI4IDxbXj5dKj4gbm9wCi0wKzAxMmMgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTMwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEzMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTM4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBub3AKLTArMDE0MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxNDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNDQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNDggPFtePl0qPiBub3AKLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE0YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTUwIDxbXj5dKj4gbm9wCi0wKzAxNTQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTU4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTVjIDxbXj5dKj4gbm9wCi0wKzAxNjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoxNjA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE2NCA8W14+XSo+IG5vcAotMCswMTY4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDE2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE2YzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxNzAgPFtePl0qPiBub3AKLTArMDE3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE3NDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDE3OCA8W14+XSo+IG5vcAotMCswMTdjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTgwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE4NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxODQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMThjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMThjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5MCA8W14+XSo+IG5vcAotMCswMTk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTk4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE5YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxOWM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxYTQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTggPFtePl0qPiBub3AKLTArMDFhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxYjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWI0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWJjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbm9wCi0wKzAxYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWNjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFjYzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWQ0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDggPFtePl0qPiBub3AKLTArMDFkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZTggPFtePl0qPiBub3AKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjFlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWYwIDxbXj5dKj4gbm9wCi0wKzAxZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZjggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWZjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjAwIDxbXj5dKj4gbm9wCi0wKzAyMDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoyMDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDIwOCA8W14+XSo+IG5vcAotMCswMjBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIxNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyMTggPFtePl0qPiBub3AKLTArMDIxYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjIxYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIyMCA8W14+XSo+IG5vcAotMCswMjI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDIyYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyMmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjM0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IG5vcAotMCswMjNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjQwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDI0NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyNGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyNGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNTAgPFtePl0qPiBub3AKLTArMDI1NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI1OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyNWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjVjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjY0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjY4IDxbXj5dKj4gbm9wCi0wKzAyNmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNzAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI3NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjdjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyODAgPFtePl0qPiBub3AKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI4OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyOGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyOGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyOTAgPFtePl0qPiBub3AKLTArMDI5NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjI5NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjk4IDxbXj5dKj4gbm9wCi0wKzAyOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmE0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMmE4IDxbXj5dKj4gbm9wCi0wKzAyYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoyYWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDJiMCA8W14+XSo+IG5vcAotMCswMmI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDJiYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVjNGM0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIuZAorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGIKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCi1bIAldKjY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSo2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzAgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwN2MgPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODQgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA4OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDhjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo5NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOWMgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSphMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhNCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkZ3BcKQotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSphYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpiMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMGUwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMGU0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBlOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBlYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMGMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTEwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjExNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTFjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMTIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTQ4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTUwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE1NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTVjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTZjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxN2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxODAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxODQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTg4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTk0IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoxOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTk4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAxYTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWJjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFjOCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWQwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMWQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFkNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWRjIDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWUwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWU4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAxZjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSoxZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZmMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMjA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qMjA0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjA4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIxMCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMjEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMjE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDIxYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMjQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjI4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyM2MgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI0OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNTQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjZjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI3MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjc4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI4NCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyOTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjk0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI5NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyOWMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJhOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYjQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJjMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmNjIDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZDggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZTQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJmMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjJmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMDggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMwYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMTQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzE4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMyMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjMyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMyYyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjMyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzMwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMzOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjMzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzM2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzQ0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM1MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjM1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM1NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM1YyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjM1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM2MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNjggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzZjIDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3MCA8W14+XSo+IGxoCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3NCA8W14+XSo+IGxodQlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAzN2MgPFtePl0qPiBsd2wJXCRhMCwwXChcJHplcm9cKQotMCswMzgwIDxbXj5dKj4gbHdyCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM4NCA8W14+XSo+IGx3YzAJXCQ0LDBcKFwkemVyb1wpCi0wKzAzODggPFtePl0qPiBsd2MxCVwkZjQsMFwoXCR6ZXJvXCkKLTArMDM4YyA8W14+XSo+IGx3YzIJXCQ0LDBcKFwkemVyb1wpCi0wKzAzOTAgPFtePl0qPiBsd2MzCVwkNCwwXChcJHplcm9cKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNjY2FmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGIgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxiCSQ0LDAKLQlsYgkkNCwxCi0JbGIJJDQsMHg4MDAwCi0JbGIJJDQsLTB4ODAwMAotCWxiCSQ0LDB4MTAwMDAKLQlsYgkkNCwweDFhNWE1Ci0JbGIJJDQsMCgkNSkKLQlsYgkkNCwxKCQ1KQotCWxiCSQ0LDB4ODAwMCgkNSkKLQlsYgkkNCwtMHg4MDAwKCQ1KQotCWxiCSQ0LDB4MTAwMDAoJDUpCi0JbGIJJDQsMHgxYTVhNSgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYgkkNCxkYXRhX2xhYmVsKzEKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxiCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsYgkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCWxiCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0KLSMgU2V2ZXJhbCBtYWNyb3MgYXJlIGhhbmRsZWQgbGlrZSBsYi4gIFNhbml0eSBjaGVjayB0aGVtLgotCWxidQkkNCwwCi0JbGgJJDQsMAotCWxodQkkNCwwCi0JbHcJJDQsMAotCWx3bAkkNCwwCi0JbHdyCSQ0LDAKLQlsd2MwCSQ0LDAKLQlsd2MxCSQ0LDAKLQlsd2MyCSQ0LDAKLQlsd2MzCSQ0LDAKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5NjFmNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxkLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYyAtLWRlZnN5bSBFTVBJQz0xCi0jc291cmNlOiBsZC1waWMucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA5NCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKLVsgCV0qOTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjQgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSpiNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiOCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSpiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzAgPFtePl0qPiBsdwlcJGEwLC0xNTM4NFwoXCRncFwpCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjNCA8W14+XSo+IGx3CVwkYTEsLTE1MzgwXChcJGdwXCkKLVsgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMGNjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSpjYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSplMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSplNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBlYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRncFwpCi1bIAldKmY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsLTE1MzgzXChcJGdwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSwtMTUzNzlcKFwkZ3BcKQotWyAJXSpmYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMDAgPFtePl0qPiBub3AKLTArMDEwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDEwOCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMTA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAxMGMgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTEwIDxbXj5dKj4gbm9wCi0wKzAxMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTIwIDxbXj5dKj4gbm9wCi0wKzAxMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IG5vcAotMCswMTM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjEzYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBub3AKLTArMDE0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjE0ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IG5vcAotMCswMTU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkYXRcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTVjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQotWyAJXSoxNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTYwIDxbXj5dKj4gbm9wCi0wKzAxNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNjggPFtePl0qPiBsdwlcJGEwLC0xNTM4NFwoXCRhdFwpCi1bIAldKjE2ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGExLC0xNTM4MFwoXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNzAgPFtePl0qPiBub3AKLTArMDE3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjE3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTgwIDxbXj5dKj4gbm9wCi0wKzAxODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxODggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTkwIDxbXj5dKj4gbm9wCi0wKzAxOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxOTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IG5vcAotMCswMWE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjFhYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBub3AKLTArMDFiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFiOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjFiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IG5vcAotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWM4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkYXRcKQotWyAJXSoxYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWNjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQotWyAJXSoxY2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWQwIDxbXj5dKj4gbm9wCi0wKzAxZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLC0xNTM4M1woXCRhdFwpCi1bIAldKjFkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZGMgPFtePl0qPiBsdwlcJGExLC0xNTM3OVwoXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQ2ZDYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotI25hbWU6IE1JUFMgbGQtaWxvY2tzCi0jc291cmNlOiBsZC5zCi0KLSMgVGVzdCB0aGUgbGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8LnRleHQ+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKLTArMDA0OCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDA1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3YyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4MCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA4NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGEwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSpiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGM0IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSpjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzggPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRncFwpCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTBjIDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjExNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE2YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFiNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFiYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFjNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjIwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIxOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIxYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjQgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzOCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMjg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJjMCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJjNCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGF0XCkKLVsgCV0qMmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZTAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmVjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJmOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJmYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDMxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMxOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMxYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMyNCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMzI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDMyOCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGF0XCkKLVsgCV0qMzI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDMyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzM0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzM4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjMzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzQ0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzY0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzY4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM3NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzc4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzN2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzODggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzk0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzk4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2FjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2I4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2MwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2M0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2M4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2NjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2RjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2UwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2U0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2Y4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2ZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjQwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjQwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQxMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQxNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0MTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0M2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ0NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0NjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQ3MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ3NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Nzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ODQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjQ4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ODggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjQ4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0OGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0OTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjQ5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDk4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0OTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGE0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGE4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0YTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGFjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YjQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YmMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0Y2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZDQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGRjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZWMgPFtePl0qPiBsd2MxCVwkZjUsMFwoXCR6ZXJvXCkKLTArMDRmMCA8W14+XSo+IGx3YzEJXCRmNCw0XChcJHplcm9cKQotMCswNGY0IDxbXj5dKj4gbHdjMQlcJGY1LDFcKFwkemVyb1wpCi0wKzA0ZjggPFtePl0qPiBsd2MxCVwkZjQsNVwoXCR6ZXJvXCkKLTArMDRmYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTAwIDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCRhdFwpCi0wKzA1MDQgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKLTArMDUwOCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1MGMgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJHplcm9cKQotMCswNTEwIDxbXj5dKj4gbHdjMQlcJGY1LDBcKFwkYTFcKQotMCswNTE0IDxbXj5dKj4gbHdjMQlcJGY0LDRcKFwkYTFcKQotMCswNTE4IDxbXj5dKj4gbHdjMQlcJGY1LDFcKFwkYTFcKQotMCswNTFjIDxbXj5dKj4gbHdjMQlcJGY0LDVcKFwkYTFcKQotMCswNTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1MjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1MjggPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKLTArMDUyYyA8W14+XSo+IGx3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQotMCswNTMwIDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCRhMVwpCi0wKzA1MzQgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJGExXCkKLTArMDUzOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1Mzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1M2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1NDAgPFtePl0qPiBsd2MxCVwkZjUsLTIzMTMxXChcJGF0XCkKLVsgCV0qNTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTQ0IDxbXj5dKj4gbHdjMQlcJGY0LC0yMzEyN1woXCRhdFwpCi1bIAldKjU0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0OCA8W14+XSo+IG5vcAotMCswNTRjIDxbXj5dKj4gc3djMQlcJGY1LDBcKFwkemVyb1wpCi0wKzA1NTAgPFtePl0qPiBzd2MxCVwkZjQsNFwoXCR6ZXJvXCkKLTArMDU1NCA8W14+XSo+IHN3YzEJXCRmNSwxXChcJHplcm9cKQotMCswNTU4IDxbXj5dKj4gc3djMQlcJGY0LDVcKFwkemVyb1wpCi0wKzA1NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU2MCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNTY0IDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1NjggPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJHplcm9cKQotMCswNTZjIDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCR6ZXJvXCkKLTArMDU3MCA8W14+XSo+IHN3YzEJXCRmNSwwXChcJGExXCkKLTArMDU3NCA8W14+XSo+IHN3YzEJXCRmNCw0XChcJGExXCkKLTArMDU3OCA8W14+XSo+IHN3YzEJXCRmNSwxXChcJGExXCkKLTArMDU3YyA8W14+XSo+IHN3YzEJXCRmNCw1XChcJGExXCkKLTArMDU4MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTg4IDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCRhdFwpCi0wKzA1OGMgPFtePl0qPiBzd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKLTArMDU5MCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkYTFcKQotMCswNTk0IDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCRhMVwpCi0wKzA1OTggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVhMCA8W14+XSo+IHN3YzEJXCRmNSwtMjMxMzFcKFwkYXRcKQotWyAJXSo1YTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE0IDxbXj5dKj4gc3djMQlcJGY0LC0yMzEyN1woXCRhdFwpCi1bIAldKjVhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1YTggPFtePl0qPiBzdwlcJGEwLDBcKFwkemVyb1wpCi0wKzA1YWMgPFtePl0qPiBzdwlcJGExLDRcKFwkemVyb1wpCi0wKzA1YjAgPFtePl0qPiBsdWkJXCRhMCwweDIKLVsgCV0qNWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNWI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNWI4IDxbXj5dKj4gbGQJXCRhMCwtMjMxMzFcKFwkYTBcKQotWyAJXSo1Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1YmMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDVjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDVjNCA8W14+XSo+IHNkCVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVjOCA8W14+XSo+IG5vcAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiMmJkYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy5kCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTUlQUyBsZC1pbG9ja3MKLSNzb3VyY2U6IGxkLnMKLSNhczoKLSMgVGVzdCB0aGUgbGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8LnRleHQ+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKLTArMDA0OCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDA1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3YyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4MCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA4NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGEwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSpiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGM0IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSpjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzggPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRncFwpCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTBjIDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjExNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE2YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFiNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFiYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFjNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjIwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIxOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIxYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjQgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzOCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMjg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJjMCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJjNCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGF0XCkKLVsgCV0qMmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZTAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmVjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJmOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJmYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDMxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMxOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMxYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMyNCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMzI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDMyOCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGF0XCkKLVsgCV0qMzI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDMyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzM0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzM4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjMzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzQ0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzY0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzY4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM3NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzc4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzN2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzODggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzk0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzk4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2FjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2I4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2MwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2M0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2M4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2NjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2RjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2UwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2U0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2Y4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2ZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjQwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjQwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQxMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQxNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0MTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0M2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ0NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0NjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQ3MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ3NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Nzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ODQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjQ4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ODggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjQ4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0OGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0OTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjQ5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDk4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0OTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGE0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGE4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0YTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGFjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YjQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YmMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0Y2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZDQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGRjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZWMgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCR6ZXJvXCkKLTArMDRmMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJHplcm9cKQotMCswNGY0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkemVyb1wpCi0wKzA0ZjggPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCR6ZXJvXCkKLTArMDRmYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTAwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1MDQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDUwOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1MGMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJHplcm9cKQotMCswNTEwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkYTFcKQotMCswNTE0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkYTFcKQotMCswNTE4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkYTFcKQotMCswNTFjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkYTFcKQotMCswNTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1MjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1MjggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDUyYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTMwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhMVwpCi0wKzA1MzQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGExXCkKLTArMDUzOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1Mzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1M2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1NDAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTIzMTMxXChcJGF0XCkKLVsgCV0qNTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTQ0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0yMzEyN1woXCRhdFwpCi1bIAldKjU0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0OCA8W14+XSo+IG5vcAotMCswNTRjIDxbXj5dKj4gc3djMQlcJGZbNDVdLDBcKFwkemVyb1wpCi0wKzA1NTAgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKLTArMDU1NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQotMCswNTU4IDxbXj5dKj4gc3djMQlcJGZbNDVdLDVcKFwkemVyb1wpCi0wKzA1NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU2MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTY0IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1NjggPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQotMCswNTZjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDU3MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJGExXCkKLTArMDU3NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw0XChcJGExXCkKLTArMDU3OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJGExXCkKLTArMDU3YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJGExXCkKLTArMDU4MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTg4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1OGMgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDU5MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQotMCswNTk0IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCi0wKzA1OTggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVhMCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMjMxMzFcKFwkYXRcKQotWyAJXSo1YTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE0IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0yMzEyN1woXCRhdFwpCi1bIAldKjVhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1YTggPFtePl0qPiBzdwlcJGEwLDBcKFwkemVyb1wpCi0wKzA1YWMgPFtePl0qPiBzdwlcJGExLDRcKFwkemVyb1wpCi0wKzA1YjAgPFtePl0qPiBsdWkJXCRhMCwweDIKLVsgCV0qNWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNWI0IDxbXj5dKj4gKGR8KWFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDViOCA8W14+XSo+IGxkCVwkYTAsLTIzMTMxXChcJGEwXCkKLVsgCV0qNWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjViYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzAgPFtePl0qPiAoZHwpYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswNWM0IDxbXj5dKj4gc2QJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo1YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNWM4IDxbXj5dKj4gbm9wCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtcGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Y1MmRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGQgbWFjcm8gd2l0aCBQSUMgY29kZS4KLQkKLQkuc2V0CW1pcHMxCi0KLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGQJJDQsMAotCWxkCSQ0LDEKLQlsZAkkNCwweDgwMDAKLQlsZAkkNCwtMHg4MDAwCi0JbGQJJDQsMHgxMDAwMAotCWxkCSQ0LDB4MWE1YTUKLQlsZAkkNCwwKCQ1KQotCWxkCSQ0LDEoJDUpCi0JbGQJJDQsMHg4MDAwKCQ1KQotCWxkCSQ0LC0weDgwMDAoJDUpCi0JbGQJJDQsMHgxMDAwMCgkNSkKLQlsZAkkNCwweDFhNWE1KCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxkCSQ0LGRhdGFfbGFiZWwrMQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGQJJDQsZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCS5pZm5kZWYJRU1QSUMKLQlub3AKLQlub3AKLQkuZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDNkNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxkLXN2cjRwaWMKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDCi0jc291cmNlOiBsZC1waWMucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjkwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA5NCA8W14+XSo+IG5vcAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qOTg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo5YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBhMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmEwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpiMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiNCA8W14+XSo+IG5vcAotMCswMGI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBiYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpjMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBjYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpkMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQ0IDxbXj5dKj4gbm9wCi0wKzAwZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmUwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGU0IDxbXj5dKj4gbm9wCi0wKzAwZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSplODogUl9NSVBTX0xPMTYJLmJzcwotMCswMGVjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qZWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBmMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmYwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGY0IDxbXj5dKj4gbm9wCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQotWyAJXSpmODogUl9NSVBTX0xPMTYJLmJzcwotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKLVsgCV0qZmM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxMDQgPFtePl0qPiBub3AKLTArMDEwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEwODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEwYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDExMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjExMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMTQgPFtePl0qPiBub3AKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTIwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gbm9wCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTJjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDEzMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEzMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzNCA8W14+XSo+IG5vcAotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDEzYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNDA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0NCA8W14+XSo+IG5vcAotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNTQgPFtePl0qPiBub3AKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjE1ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTVjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNjA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjE2ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTZjIDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMTZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNzA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTc0IDxbXj5dKj4gbm9wCi0wKzAxNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxN2M6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxODA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxODQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxODQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbm9wCi0wKzAxOGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE5ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IG5vcAotMCswMWEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxYWMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBub3AKLTArMDFiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxYmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWMwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzQgPFtePl0qPiBub3AKLTArMDFjOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWQ0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWQ4IDxbXj5dKj4gbm9wCi0wKzAxZGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZTA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFlNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFlNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMWU4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWU4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWVjIDxbXj5dKj4gbm9wCi0wKzAxZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZjQgPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQotWyAJXSoxZjQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmOCA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKjFmODogUl9NSVBTX0xPMTYJLmJzcwotMCswMWZjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWZjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDIwMCA8W14+XSo+IG5vcAotMCswMjA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMjA4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMjBjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjEwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxNCA8W14+XSo+IG5vcAotMCswMjE4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjFjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDIyMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyMjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjggPFtePl0qPiBub3AKLTArMDIyYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIzMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjM4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gbm9wCi0wKzAyNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDI0YyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjI0YzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gbm9wCi0wKzAyNTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjVjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDI2MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjI2MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI2NCA8W14+XSo+IG5vcAotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjZjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMjZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNzAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyNzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI3NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjI3NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI3OCA8W14+XSo+IG5vcAotMCswMjdjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjgwIDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKLVsgCV0qMjgwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyODQgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQotWyAJXSoyODQ6IFJfTUlQU19MTzE2CS5ic3MKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMjYyY2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxkLXhnb3QKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC14Z290Ci0jc291cmNlOiBsZC1waWMucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjkwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA5NCA8W14+XSo+IG5vcAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qOTg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo5YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBhMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwYTggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSphODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYWMgPFtePl0qPiBub3AKLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qYzA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qZDg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZGMgPFtePl0qPiBub3AKLTArMDBlMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwZTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmU4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwZjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSpmMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gbm9wCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDEwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDEwNCA8W14+XSo+IG5vcAotMCswMTA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTA4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxMGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDExMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjExMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDExNCA8W14+XSo+IG5vcAotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qMTE4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLDEwMDRcKFwkYXRcKQotWyAJXSoxMWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEyMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEyMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxMjQgPFtePl0qPiBub3AKLTArMDEyOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEyODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEyYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEyYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEzMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMzA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTM4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTM4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IG5vcAotMCswMTQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTQ4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTUwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTUwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTU0IDxbXj5dKj4gbm9wCi0wKzAxNTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTVjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE2MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNjA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxNjggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxNjg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNmMgPFtePl0qPiBub3AKLTArMDE3MCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE3ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTgwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTgwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxODQgPFtePl0qPiBub3AKLTArMDE4OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxOGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTkwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTkwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTk0IDxbXj5dKj4gbm9wCi0wKzAxOTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxOTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE5YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE5YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWEwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMWE0IDxbXj5dKj4gbm9wCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLDEwMDFcKFwkYXRcKQotWyAJXSoxYTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsMTAwNVwoXCRhdFwpCi1bIAldKjFhYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWIwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDFiNCA8W14+XSo+IG5vcAotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWJjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMWMwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWMwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMWM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxY2MgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxY2M6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQwIDxbXj5dKj4gbm9wCi0wKzAxZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxZTggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxZTg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPFtePl0qPiBub3AKLTArMDFmMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFmNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFmYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDIwNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjIwNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwOCA8W14+XSo+IG5vcAotMCswMjBjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjE4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyMjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyMjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIyNCA8W14+XSo+IG5vcAotMCswMjI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDIzMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyMzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyMzggPFtePl0qPiBub3AKLTArMDIzYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI0MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNDggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNDg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNGMgPFtePl0qPiBub3AKLTArMDI1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI1NCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCi1bIAldKjI1NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjU4IDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKLVsgCV0qMjU4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNWMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNWM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjYwIDxbXj5dKj4gbm9wCi0wKzAyNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyNjg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyNmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyNmM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjcwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDI3OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjI3ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBub3AKLTArMDI4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI4NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjhjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI4YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDI5NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjI5NDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5OCA8W14+XSo+IG5vcAotMCswMjljIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmEwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDJhNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmE4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMmIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMmIwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmI0IDxbXj5dKj4gbm9wCi0wKzAyYjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMmMwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDJjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJjOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDJjYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjJjYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmQwIDxbXj5dKj4gbm9wCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMmRjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDJlMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjJlMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJlNCA8W14+XSo+IG5vcAotMCswMmU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmVjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZjA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDJmNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjJmNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJmOCA8W14+XSo+IG5vcAotMCswMmZjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzAwIDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKLVsgCV0qMzAwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzMDQgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQotWyAJXSozMDQ6IFJfTUlQU19MTzE2CS5ic3MKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4OWNmMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNhczogLW1jcHU9cjQwMDAKLSNuYW1lOiBNSVBTIGxkCi0KLSMgVGVzdCB0aGUgbGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSphNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGMwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBkYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBlMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBlNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpmNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGZjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKjEwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkZ3BcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qMTFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDEyMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTI4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1NCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2MCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2NCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTcwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTc4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxODAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTk0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTljIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFhMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFiNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFiOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFiYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWMwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFjNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFkMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjE0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIxOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjIwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIyNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNjAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IG5vcAotMCswMjk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMjk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gbm9wCi0wKzAyYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmQwIDxbXj5dKj4gbm9wCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMmRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmU4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzAwIDxbXj5dKj4gbm9wCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMxYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjMxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMjAgPFtePl0qPiBub3AKLTArMDMyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMyOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMyYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMyYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMzMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzM2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzNDAgPFtePl0qPiBub3AKLTArMDM0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDM0OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM0ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozNGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDM1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM1OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzNWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzcwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzgwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM4OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzOGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzkwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzk4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzljIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2EwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2EwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2E0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2E4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2E4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2FjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2FjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2IwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2IwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDNiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNiOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswM2MwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2NjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2NjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNkMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNkOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2RjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2RjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2UwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2YwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2ZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2ZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo0MDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0MGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNDEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjQyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Mjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQzMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQ0MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0NGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ3MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ3YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ4MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ4OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ4YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0OTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0OTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0OTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDljIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDRhMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0YTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0YTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNGFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDRiMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGI4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0YmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRjMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRkMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRmMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDRmNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRmOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDUwMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1MDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1MDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo1MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNTBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDUxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNTE0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA1MTggPFtePl0qPiBsd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDUxYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1MjQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDUyOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTJjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDUzMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1MzQgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1MzggPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1M2MgPFtePl0qPiBsd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1NDAgPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1NDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU0OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU0YyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTUwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1NTQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDU1OCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTY0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1NjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NjggPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRhdFwpCi1bIAldKjU2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU2YyA8W14+XSo+IG5vcAotMCswNTcwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDBcKFwkemVyb1wpCi0wKzA1NzQgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKLTArMDU3OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQotMCswNTdjIDxbXj5dKj4gc3djMQlcJGZbNDVdLDVcKFwkemVyb1wpCi0wKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU4NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTg4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1OGMgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQotMCswNTkwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDU5NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJGExXCkKLTArMDU5OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw0XChcJGExXCkKLTArMDU5YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJGExXCkKLTArMDVhMCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJGExXCkKLTArMDVhNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNWE4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNWFjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1YjAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDViNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQotMCswNWI4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCi0wKzA1YmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNWM0IDxbXj5dKj4gc3djMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWM4IDxbXj5dKj4gc3djMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWNjIDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswNWQwIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswNWQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qNWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNWQ4IDxbXj5dKj4gZGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDVkYyA8W14+XSo+IGxkCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjVkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDVlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjVlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1ZTQgPFtePl0qPiBkYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswNWU4IDxbXj5dKj4gc2QJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVlYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWVlM2MwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQucworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGQgbWFjcm8uCi0JCi0JLnNldAltaXBzMQotCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxkCSQ0LDAKLQlsZAkkNCwxCi0JbGQJJDQsMHg4MDAwCi0JbGQJJDQsLTB4ODAwMAotCWxkCSQ0LDB4MTAwMDAKLQlsZAkkNCwweDFhNWE1Ci0JbGQJJDQsMCgkNSkKLQlsZAkkNCwxKCQ1KQotCWxkCSQ0LDB4ODAwMCgkNSkKLQlsZAkkNCwtMHg4MDAwKCQ1KQotCWxkCSQ0LDB4MTAwMDAoJDUpCi0JbGQJJDQsMHgxYTVhNSgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsZAkkNCxkYXRhX2xhYmVsKzEKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxkCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsZAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCWxkCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0KLSMgbC5kIGFuZCBzLmQgYXJlIHNvcnQgb2YgbGlrZSBsZC4KLQlsLmQJJGY0LDAKLQlsLmQJJGY0LDEKLQlsLmQJJGY0LDB4ODAwMAotCWwuZAkkZjQsLTB4ODAwMAotCWwuZAkkZjQsMCgkNSkKLQlsLmQJJGY0LDEoJDUpCi0JbC5kCSRmNCwweDgwMDAoJDUpCi0JbC5kCSRmNCwtMHg4MDAwKCQ1KQotCWwuZAkkZjQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JIyBMaXR0bGUgZW5kaWFuIHdpbGwgaW5zZXJ0IGEgbm9wIGhlcmUuCi0JIyBXZSBwdXQgaXQgaW4gZXhwbGljaXRseSBzbyB0aGF0IGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBhcmUgc2ltaWxhci4KLQlub3AKLQlzLmQJJGY0LDAKLQlzLmQJJGY0LDEKLQlzLmQJJGY0LDB4ODAwMAotCXMuZAkkZjQsLTB4ODAwMAotCXMuZAkkZjQsMCgkNSkKLQlzLmQJJGY0LDEoJDUpCi0Jcy5kCSRmNCwweDgwMDAoJDUpCi0Jcy5kCSRmNCwtMHg4MDAwKCQ1KQotCXMuZAkkZjQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIHNkIGlzIGhhbmRsZWQgbGlrZSBsZC4gIFNhbml0eSBjaGVjayBpdC4KLQlzZAkkNCwwCi0KLSMgU2FuaXR5IGNoZWNrIHRoZSAtbWlwczMgdmVyc2lvbnMKLQkuc2V0CW1pcHMzCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmUyYjIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBsaQotCi0jIFRlc3QgdGhlIGxpIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAxYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzNhNjAxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsaSBtYWNyby4KLQotZm9vOgotCWxpCSQ0LDAKLQlsaQkkNCwxCi0JbGkJJDQsMHg4MDAwCi0JbGkJJDQsLTB4ODAwMAotCWxpCSQ0LDB4MTAwMDAKLQlsaQkkNCwweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwZGNhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxpZmxvYXQtZW1waWMKLSNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljIC0tZGVmc3ltIEVNUElDPTEKLSNzb3VyY2U6IGxpZmxvYXQucwotCi0jIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODQKLVsgCV0qMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkucmRhdGEuKgotMCswMDA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMGMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTE2MzY4XChcJGdwXCkKLVsgCV0qYzogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ4LioKLTArMDAxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMTYzNjRcKFwkZ3BcKQotWyAJXSoxMDogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ4LioKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4M2Y4ZgotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGNkMzYKLTArMDAxYyA8W14+XSo+IGx1aQlcJGF0LDB4M2Y4ZgotMCswMDIwIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGNkMzYKLTArMDAyNCA8W14+XSo+IG10YzEJXCRhdCxcJGY0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDlhN2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxpZmxvYXQtc3ZyNHBpYwotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAgLUtQSUMgLUVCIC0tZGVmc3ltIFNWUjQ9MQotI3NvdXJjZTogbGlmbG9hdC5zCi0KLSMgVGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3Mgd2l0aCAtS1BJQy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMDogUl9NSVBTX0dPVDE2CS5yb2RhdGEKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qYzogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTA6IFJfTUlQU19HT1QxNgkucm9kYXRhCi0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGx3YzEJXCRmNSw4XChcJGF0XCkKLVsgCV0qMTg6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAxYyA8W14+XSo+IGx3YzEJXCRmNCwxMlwoXCRhdFwpCi1bIAldKjFjOiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMjAgPFtePl0qPiBsdWkJXCRhMCwweDNmOGYKLTArMDAyNCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjZDM2Ci0wKzAwMjggPFtePl0qPiBsdWkJXCRhdCwweDNmOGYKLTArMDAyYyA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhjZDM2Ci0wKzAwMzAgPFtePl0qPiBtdGMxCVwkYXQsXCRmNAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjg2ZTJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0LXhnb3QKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC14Z290IC1FQiAtLWRlZnN5bSBYR09UPTEKLSNzb3VyY2U6IGxpZmxvYXQucwotCi0jIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkucm9kYXRhCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjg6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBsd2MxCVwkZjUsOFwoXCRhdFwpCi1bIAldKjE4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsMTJcKFwkYXRcKQotWyAJXSoxYzogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDIwIDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDI4IDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCi0wKzAwMmMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgotMCswMDMwIDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWI1NTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGlmbG9hdAotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3Jvcy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnJvP2RhdGEuKgotMCswMDA0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkucm8/ZGF0YS4qCi0wKzAwMDggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ybz9kYXRhLioKLTArMDAwYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYzogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ4LioKLTArMDAxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qMTA6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDNmOGYKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjZDM2Ci0wKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsWy0wLTldK1woXCRncFwpCi1bIAldKjFjOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDQuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3N2YwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3Jvcy4KLQkKLWZvbzoJCi0JbGkuZAkkNCwxLjEyMzQ1Ci0JbGkuZAkkZjQsMS4xMjM0NQotCQotCWxpLnMJJDQsMS4xMjM0NQotCWxpLnMJJGY0LDEuMTIzNDUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQkuaWZkZWYJU1ZSNAotCW5vcAotCW5vcAotCW5vcAotCS5lbmRpZgotCS5pZmRlZglYR09UCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCi0JLmlmZGVmCUVNUElDCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhNDBmNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5kCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotI29iamR1bXA6IC1kIC1sIC1tbWlwczo0MDAwCi0jbmFtZTogYXNzZW1ibHkgbGluZSBudW1iZXJzCi0jYXM6IC1nIC1tY3B1PXI0MDAwCi0KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8bWFpbi0weDEwPjoKLS4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgotLipbMC05YS1mXSs6LipkZWFkYmVlZi4qCi0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLS4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgotCi0wKzAwMTAgPG1haW4+OgotbWFpblwoXCk6Ci0uKmxpbmVuby5zOjE2Ci0uKjEwOi4qYWRkaXUuKgotLipsaW5lbm8uczoxNwotLioxNDouKnNkLioKLS4qbGluZW5vLnM6MTgKLS4qMTg6LipzZC4qCi0uKmxpbmVuby5zOjE5Ci0uKjFjOi4qbW92ZS4qCi0uKmxpbmVuby5zOjIwCi0uKjIwOi4qamFsLioKLS4qMjQ6Lipub3AKLS4qbGluZW5vLnM6MjEKLS4qMjg6LipsaS4qCi0uKmxpbmVuby5zOjIyCi0uKjJjOi4qc3cuKgotLipsaW5lbm8uczoyMwotLiozMDouKmx3LioKLS4qbGluZW5vLnM6MjQKLS4qMzQ6Liptb3ZlLioKLS4qbGluZW5vLnM6MjUKLS4qMzg6LipzbGwuKgotLipsaW5lbm8uczoyNgotLiozYzouKmFkZHUuKgotLipsaW5lbm8uczoyNwotLio0MDouKnN3LioKLS4qbGluZW5vLnM6MjgKLS4qNDQ6Lipsdy4qCi0uKmxpbmVuby5zOjI5Ci0uKjQ4Oi4qamFsLioKLS4qNGM6Lipub3AKLS4qbGluZW5vLnM6MzAKLS4qNTA6Lipsdy4qCi0uKmxpbmVuby5zOjMxCi0uKjU0Oi4qbW92ZS4qCi0uKmxpbmVuby5zOjMyCi0uKjU4Oi4qYi4qCi0uKjVjOi4qbm9wCi0KLTAwMDAwMDAwMDAwMDAwNjAgPFwkTDE+OgotLipsaW5lbm8uczozNAotLio2MDouKm1vdmUuKgotLipsaW5lbm8uczozNQotLio2NDouKmxkLioKLS4qbGluZW5vLnM6MzYKLS4qNjg6LipsZC4qCi0uKmxpbmVuby5zOjM3Ci0uKjZjOi4qYWRkaXUuKgotLipsaW5lbm8uczozOAotLio3MDouKmpyLioKLS4qNzQ6Lipub3AKLQotMDAwMDAwMDAwMDAwMDA3OCA8Zz46Ci1nXChcKToKLS4qbGluZW5vLnM6NDcKLS4qNzg6LiphZGRpdS4qCi0uKmxpbmVuby5zOjQ4Ci0uKjdjOi4qc2QuKgotLipsaW5lbm8uczo0OQotLio4MDouKm1vdmUuKgotLipsaW5lbm8uczo1MAotLio4NDouKnN3LioKLS4qbGluZW5vLnM6NTEKLS4qODg6Lipsdy4qCi0uKmxpbmVuby5zOjUyCi0uKjhjOi4qYWRkaXUuKgotLipsaW5lbm8uczo1MwotLio5MDouKm1vdmUuKgotLipsaW5lbm8uczo1NAotLio5NDouKmIuKgotLio5ODouKm5vcAotCi0wMDAwMDAwMDAwMDAwMDljIDxcJEwyPjoKLS4qbGluZW5vLnM6NTYKLS4qOWM6Liptb3ZlLioKLS4qbGluZW5vLnM6NTcKLS4qYTA6LipsZC4qCi0uKmxpbmVuby5zOjU4Ci0uKmE0Oi4qYWRkaXUuKgotLipsaW5lbm8uczo1OQotLiphODouKmpyLioKLS4qYWM6Lipub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFmMzMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0JLnRleHQKLQotIyBzb21lIGRhdGEKLQkud29yZAkweGRlYWRiZWVmCi0JLndvcmQJMHhkZWFkYmVlZgotCS53b3JkCTB4ZGVhZGJlZWYKLQkud29yZAkweGRlYWRiZWVmCi0KLSMgc29tZSByZWFsIGNvZGUsIGNvbXBpbGVkIGZyb20gYSB0b3kgQyBwcm9ncmFtCi0JICAgICAgICAuZ2xvYmwgIG1haW4KLSAgICAgICAgLmVudCAgICBtYWluCi1tYWluOgotICAgICAgICAuZnJhbWUgICRmcCwzMiwkMzEgICAgICAgICAgICAgICMgdmFycz0gMTYsIHJlZ3M9IDIvMCwgYXJncz0gMCwgZXh0cmE9IDAKLSAgICAgICAgLm1hc2sgICAweGMwMDAwMDAwLC04Ci0gICAgICAgIC5mbWFzayAgMHgwMDAwMDAwMCwwCi0gICAgICAgIHN1YnUgICAgJHNwLCRzcCwzMgotICAgICAgICBzZCAgICAgICQzMSwyNCgkc3ApCi0gICAgICAgIHNkICAgICAgJGZwLDE2KCRzcCkKLSAgICAgICAgbW92ZSAgICAkZnAsJHNwCi0gICAgICAgIGphbCAgICAgX19tYWluCi0gICAgICAgIGxpICAgICAgJDIsMiAgICAgICAgICAgICAgICAgICAgIyAweDIKLSAgICAgICAgc3cgICAgICAkMiwwKCRmcCkKLSAgICAgICAgbHcgICAgICAkMiwwKCRmcCkKLSAgICAgICAgbW92ZSAgICAkMywkMgotICAgICAgICBzbGwgICAgICQ0LCQzLDEKLSAgICAgICAgYWRkdSAgICAkMiwkNCwkMgotICAgICAgICBzdyAgICAgICQyLDQoJGZwKQotICAgICAgICBsdyAgICAgICQ0LDQoJGZwKQotICAgICAgICBqYWwgICAgIGcKLSAgICAgICAgbHcgICAgICAkMywwKCRmcCkKLSAgICAgICAgbW92ZSAgICAkMiwkMwotICAgICAgICBiICAgICAgICRMMQotJEwxOgotICAgICAgICBtb3ZlICAgICRzcCwkZnAKLSAgICAgICAgbGQgICAgICAkMzEsMjQoJHNwKQotICAgICAgICBsZCAgICAgICRmcCwxNigkc3ApCi0gICAgICAgIGFkZHUgICAgJHNwLCRzcCwzMgotICAgICAgICBqICAgICAgICQzMQotICAgICAgICAuZW5kICAgIG1haW4KLSAgICAgICAgLmFsaWduICAyCi0gICAgICAgIC5nbG9ibCAgZwotICAgICAgICAuZW50ICAgIGcKLWc6Ci0gICAgICAgIC5mcmFtZSAgJGZwLDMyLCQzMSAgICAgICAgICAgICAgIyB2YXJzPSAxNiwgcmVncz0gMS8wLCBhcmdzPSAwLCBleHRyYT0gMAotICAgICAgICAubWFzayAgIDB4NDAwMDAwMDAsLTE2Ci0gICAgICAgIC5mbWFzayAgMHgwMDAwMDAwMCwwCi0gICAgICAgIHN1YnUgICAgJHNwLCRzcCwzMgotICAgICAgICBzZCAgICAgICRmcCwxNigkc3ApCi0gICAgICAgIG1vdmUgICAgJGZwLCRzcAotICAgICAgICBzdyAgICAgICQ0LDAoJGZwKQotICAgICAgICBsdyAgICAgICQyLDAoJGZwKQotICAgICAgICBhZGR1ICAgICQzLCQyLDEKLSAgICAgICAgbW92ZSAgICAkMiwkMwotICAgICAgICBiICAgICAgICRMMgotJEwyOgotICAgICAgICBtb3ZlICAgICRzcCwkZnAKLSAgICAgICAgbGQgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBhZGR1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgaiAgICAgICAkMzEKLSAgICAgICAgLmVuZCAgICBnCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhMGQ1Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSMKLSMgU29tZSBnZW5lcmljIE1JUFMgdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBtaXBzKi0qLSpdIHRoZW4gewotICAgIHNldCBub19taXBzMTYgMAotICAgIHNldCBzdnI0cGljIFtleHByIFtpc3RhcmdldCAqLSotZWxmKl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4NSpdIHx8IFtpc3RhcmdldCAqLSotaXJpeDYqIF0gXQotICAgIHNldCBlbXBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVjb2ZmKl0gfHwgW2lzdGFyZ2V0ICotKi11bHRyaXgqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXhcWzEtNFxdKl0gXQotICAgIHNldCBhb3V0IFtleHByIFtpc3RhcmdldCAqLSotYnNkKl0gfHwgW2lzdGFyZ2V0ICotKi1uZXRic2QqXSB8fCBbaXN0YXJnZXQgKi0qLW9wZW5ic2QqXV0KLSAgICBzZXQgaWxvY2tzIFtpc3RhcmdldCBtaXBzdHgzOSotKi0qXQotICAgIHNldCBncHJfaWxvY2tzIFtleHByIFtpc3RhcmdldCBtaXBzdHgzOSotKi0qXV0KLSAgICBzZXQgYWRkcjMyIFtleHByIFtpc3RhcmdldCBtaXBzdHgzOSotKi0qXV0KLQotCi0KLQotCi0gICAgcnVuX2R1bXBfdGVzdCAiYWJzIgotICAgIHJ1bl9kdW1wX3Rlc3QgImFkZCIKLSAgICBydW5fZHVtcF90ZXN0ICJhbmQiCi0gICAgcnVuX2R1bXBfdGVzdCAiYnJlYWsyMCIKLSAgICBydW5fZHVtcF90ZXN0ICJ0cmFwMjAiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmVxIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJnZSIKLSAgICBydW5fZHVtcF90ZXN0ICJiZ2V1IgotICAgIHJ1bl9kdW1wX3Rlc3QgImJsdCIKLSAgICBydW5fZHVtcF90ZXN0ICJibHR1IgotICAgIGlmICEkaWxvY2tzIHsgcnVuX2R1bXBfdGVzdCAiZGl2IiB9IGVsc2UgeyBydW5fZHVtcF90ZXN0ICJkaXYtaWxvY2tzIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAiZGxpIgotICAgIHJ1bl9kdW1wX3Rlc3QgImphbCIKLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImphbC1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJqYWwteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImphbC1lbXBpYyIgfQotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgImxhIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsYS1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsYS14Z290IiB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGEtZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJsYiIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGItc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsKLQkjIEJvdGggdmVyc2lvbnMgc3BlY2lmeSB0aGUgY3B1LCBzbyB3ZSBjYW4gcnVuIGJvdGggcmVnYXJkbGVzcyBvZgotCSMgdGhlIGludGVybG9ja2luZyBpbiB0aGUgY29uZmlndXJlZCBkZWZhdWx0IGNwdS4KLQlydW5fZHVtcF90ZXN0ICJsYi14Z290IgotCXJ1bl9kdW1wX3Rlc3QgImxiLXhnb3QtaWxvY2tzIgotICAgIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJsYi1lbXBpYyIgfQotICAgIGlmICEkYW91dCB7IAotICAgICAgICBpZiAhJGdwcl9pbG9ja3MgeyAKLSAgICAgICAgICAgIHJ1bl9kdW1wX3Rlc3QgImxkIiAKLSAgICAgICAgfSBlbHNlIHsgCi0gICAgICAgICAgICBpZiAhJGFkZHIzMiB7Ci0gICAgICAgICAgICAgICAgcnVuX2R1bXBfdGVzdCAibGQtaWxvY2tzIgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBydW5fZHVtcF90ZXN0ICJsZC1pbG9ja3MtYWRkcjMyIgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGQtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGQteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLWVtcGljIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAibGkiCi0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAibGlmbG9hdCIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGlmLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi14Z290IiB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGlmLWVtcGljIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQiCi0gICAgaWYgISRpbG9ja3MgeyBydW5fZHVtcF90ZXN0ICJtdWwiIH0gZWxzZSB7IHJ1bl9kdW1wX3Rlc3QgIm11bC1pbG9ja3MiIH0KLSAgICBydW5fZHVtcF90ZXN0ICJyb2wiCi0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAic2IiIH0KLSAgICBydW5fZHVtcF90ZXN0ICJ0cnVuYyIKLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJ1bGgiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgInVsaC1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgInVsaC1lbXBpYyIgfQotICAgIGlmICEkYW91dCB7Ci0JcnVuX2R1bXBfdGVzdCAidWx3IgotCXJ1bl9kdW1wX3Rlc3QgInVsZCIKLQlydW5fZHVtcF90ZXN0ICJ1c2giCi0JcnVuX2R1bXBfdGVzdCAidXN3IgotCXJ1bl9kdW1wX3Rlc3QgInVzZCIKLSAgICB9Ci0gICAgIyBUaGUgbWlwczE2IHRlc3QgY2FuIG9ubHkgYmUgcnVuIG9uIEVMRiwgYmVjYXVzZSBvbmx5IEVMRgotICAgICMgc3VwcG9ydHMgdGhlIG5lY2Vzc2FyeSBtaXBzMTYgcmVsb2MuCi0gICAgaWYgeyAkc3ZyNHBpYyAmJiAhJG5vX21pcHMxNiB9IHsgcnVuX2R1bXBfdGVzdCAibWlwczE2IiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAiZGVsYXkiCi0gICAgcnVuX2R1bXBfdGVzdCAibm9kZWxheSIKLSAgICBydW5fZHVtcF90ZXN0ICJtaXBzNDAxMCIKLSAgICBydW5fZHVtcF90ZXN0ICJtaXBzNDY1MCIKLSAgICBydW5fZHVtcF90ZXN0ICJtaXBzNDEwMCIKLSAgICBydW5fZHVtcF90ZXN0ICJsaW5lbm8iCi0gICAgcnVuX2R1bXBfdGVzdCAic3luYyIKLQotICAgICMgTWFrZSBzdXJlIHRoYXQgLW1jcHU9Rk9PIGFuZCAtbUZPTyBhcmUgZXF1aXZhbGVudC4gIEFzc2VtYmxlIGEgZmlsZQotICAgICMgY29udGFpbmluZyA0NjUwLXNwZWNpZmljIGluc3RydWN0aW9ucyB3aXRoIC1tNDY1MCBhbmQgLW1jcHU9NDY1MCwKLSAgICAjIGFuZCB2ZXJpZnkgdGhhdCB0aGV5J3JlIHRoZSBzYW1lLiAgU3BlY2lmaWNhbGx5LCB3ZSdyZSBjaGVja2luZwotICAgICMgdGhhdCB0aGUgRUZfTUlQU19NQUNIIGZpZWxkIGlzIHNldCwgYW5kIHRoYXQgdGhlIDQ2NTAgJ211bCcKLSAgICAjIGluc3RydWN0aW9uIGRvZXMgZ2V0IHVzZWQuICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBHQVMsIAotICAgICMgb25seSAtbWNwdT00NjUwIHdvdWxkIHNldCB0aGUgRUZfTUlQU19NQUNIIGZpZWxkOyAtbTQ2NTAgd291bGRuJ3QuCi0gICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3MxIgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzMiIKLSAgICBydW5fZHVtcF90ZXN0ICJlbGZfZV9mbGFnczMiCi0gICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3M0IgotICAgIAotICAgIGlmICRzdnI0cGljIHsKLQlydW5fZHVtcF90ZXN0ICJlbGYtcmVsIgotCWlmIFtpc3RhcmdldCBtaXBzNjQqLSotKl0geyAKLQkgICAgcnVuX2R1bXBfdGVzdCAiZWxmLXJlbDIiIAotCX0gewotCSAgICBydW5fZHVtcF90ZXN0ICJlMzItcmVsMiIgCi0JfSAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMWEwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLW1taXBzOjQwMDAKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0jbmFtZTogbWlwczE2Ci0KLSMgVGVzdCB0aGUgbWlwczE2IGluc3RydWN0aW9uIHNldC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAwMCA8ZGF0YTE+OgotICAgMDoJMDAwMDAwMDAgCW5vcAotCi0wKzAwMDAwNCA8aW5zbnMxPjoKLSAgIDQ6CTNiNDAgICAgICAJbGQJXCR2MCwwXChcJHYxXCkKLSAgIDY6CWYwMDAgM2I0MSAJbGQJXCR2MCwxXChcJHYxXCkKLSAgIGE6CWYwMDAgM2I0MiAJbGQJXCR2MCwyXChcJHYxXCkKLSAgIGU6CWYwMDAgM2I0MyAJbGQJXCR2MCwzXChcJHYxXCkKLSAgMTI6CWYwMDAgM2I0NCAJbGQJXCR2MCw0XChcJHYxXCkKLSAgMTY6CTNiNDEgICAgICAJbGQJXCR2MCw4XChcJHYxXCkKLSAgMTg6CTNiNDIgICAgICAJbGQJXCR2MCwxNlwoXCR2MVwpCi0gIDFhOgkzYjQ0ICAgICAgCWxkCVwkdjAsMzJcKFwkdjFcKQotICAxYzoJM2I0OCAgICAgIAlsZAlcJHYwLDY0XChcJHYxXCkKLSAgMWU6CTNiNTAgICAgICAJbGQJXCR2MCwxMjhcKFwkdjFcKQotICAyMDoJZjEwMCAzYjQwIAlsZAlcJHYwLDI1NlwoXCR2MVwpCi0gIDI0OglmMjAwIDNiNDAgCWxkCVwkdjAsNTEyXChcJHYxXCkKLSAgMjg6CWY0MDAgM2I0MCAJbGQJXCR2MCwxMDI0XChcJHYxXCkKLSAgMmM6CWYwMDEgM2I0MCAJbGQJXCR2MCwyMDQ4XChcJHYxXCkKLSAgMzA6CWY3ZmYgM2I1ZiAJbGQJXCR2MCwtMVwoXCR2MVwpCi0gIDM0OglmN2ZmIDNiNWUgCWxkCVwkdjAsLTJcKFwkdjFcKQotICAzODoJZjdmZiAzYjVkIAlsZAlcJHYwLC0zXChcJHYxXCkKLSAgM2M6CWY3ZmYgM2I1YyAJbGQJXCR2MCwtNFwoXCR2MVwpCi0gIDQwOglmN2ZmIDNiNTggCWxkCVwkdjAsLThcKFwkdjFcKQotICA0NDoJZjdmZiAzYjUwIAlsZAlcJHYwLC0xNlwoXCR2MVwpCi0gIDQ4OglmN2ZmIDNiNDAgCWxkCVwkdjAsLTMyXChcJHYxXCkKLSAgNGM6CWY3ZGYgM2I0MCAJbGQJXCR2MCwtNjRcKFwkdjFcKQotICA1MDoJZjc5ZiAzYjQwIAlsZAlcJHYwLC0xMjhcKFwkdjFcKQotICA1NDoJZjcxZiAzYjQwIAlsZAlcJHYwLC0yNTZcKFwkdjFcKQotICA1ODoJZjYxZiAzYjQwIAlsZAlcJHYwLC01MTJcKFwkdjFcKQotICA1YzoJZjQxZiAzYjQwIAlsZAlcJHYwLC0xMDI0XChcJHYxXCkKLSAgNjA6CWYwMWYgM2I0MCAJbGQJXCR2MCwtMjA0OFwoXCR2MVwpCi0gIDY0OglmN2JmIGZjNDAgCWxkCVwkdjAsMCA8ZGF0YTE+Ci0gIDY4OglmNmEwIGZjNTQgCWxkCVwkdjAsNzFjIDxkYXRhMj4KLSAgNmM6CWYwMDEgZmM0MCAJbGQJXCR2MCw4NjggPGJhcj4KLSAgNzA6CWYwYzEgZmM0MCAJbGQJXCR2MCw5MzAgPHF1dXg+Ci0gIDc0OglmODQwICAgICAgCWxkCVwkdjAsMFwoXCRzcFwpCi0gIDc2OglmMDAwIGY4NDEgCWxkCVwkdjAsMVwoXCRzcFwpCi0gIDdhOglmMDAwIGY4NDIgCWxkCVwkdjAsMlwoXCRzcFwpCi0gIDdlOglmMDAwIGY4NDMgCWxkCVwkdjAsM1woXCRzcFwpCi0gIDgyOglmMDAwIGY4NDQgCWxkCVwkdjAsNFwoXCRzcFwpCi0gIDg2OglmODQxICAgICAgCWxkCVwkdjAsOFwoXCRzcFwpCi0gIDg4OglmODQyICAgICAgCWxkCVwkdjAsMTZcKFwkc3BcKQotICA4YToJZjg0NCAgICAgIAlsZAlcJHYwLDMyXChcJHNwXCkKLSAgOGM6CWY4NDggICAgICAJbGQJXCR2MCw2NFwoXCRzcFwpCi0gIDhlOglmODUwICAgICAgCWxkCVwkdjAsMTI4XChcJHNwXCkKLSAgOTA6CWYxMDAgZjg0MCAJbGQJXCR2MCwyNTZcKFwkc3BcKQotICA5NDoJZjIwMCBmODQwIAlsZAlcJHYwLDUxMlwoXCRzcFwpCi0gIDk4OglmNDAwIGY4NDAgCWxkCVwkdjAsMTAyNFwoXCRzcFwpCi0gIDljOglmMDAxIGY4NDAgCWxkCVwkdjAsMjA0OFwoXCRzcFwpCi0gIGEwOglmN2ZmIGY4NWYgCWxkCVwkdjAsLTFcKFwkc3BcKQotICBhNDoJZjdmZiBmODVlIAlsZAlcJHYwLC0yXChcJHNwXCkKLSAgYTg6CWY3ZmYgZjg1ZCAJbGQJXCR2MCwtM1woXCRzcFwpCi0gIGFjOglmN2ZmIGY4NWMgCWxkCVwkdjAsLTRcKFwkc3BcKQotICBiMDoJZjdmZiBmODU4IAlsZAlcJHYwLC04XChcJHNwXCkKLSAgYjQ6CWY3ZmYgZjg1MCAJbGQJXCR2MCwtMTZcKFwkc3BcKQotICBiODoJZjdmZiBmODQwIAlsZAlcJHYwLC0zMlwoXCRzcFwpCi0gIGJjOglmN2RmIGY4NDAgCWxkCVwkdjAsLTY0XChcJHNwXCkKLSAgYzA6CWY3OWYgZjg0MCAJbGQJXCR2MCwtMTI4XChcJHNwXCkKLSAgYzQ6CWY3MWYgZjg0MCAJbGQJXCR2MCwtMjU2XChcJHNwXCkKLSAgYzg6CWY2MWYgZjg0MCAJbGQJXCR2MCwtNTEyXChcJHNwXCkKLSAgY2M6CWY0MWYgZjg0MCAJbGQJXCR2MCwtMTAyNFwoXCRzcFwpCi0gIGQwOglmMDFmIGY4NDAgCWxkCVwkdjAsLTIwNDhcKFwkc3BcKQotICBkNDoJYmI0MCAgICAgIAlsd3UJXCR2MCwwXChcJHYxXCkKLSAgZDY6CWYwMDAgYmI0MSAJbHd1CVwkdjAsMVwoXCR2MVwpCi0gIGRhOglmMDAwIGJiNDIgCWx3dQlcJHYwLDJcKFwkdjFcKQotICBkZToJZjAwMCBiYjQzIAlsd3UJXCR2MCwzXChcJHYxXCkKLSAgZTI6CWJiNDEgICAgICAJbHd1CVwkdjAsNFwoXCR2MVwpCi0gIGU0OgliYjQyICAgICAgCWx3dQlcJHYwLDhcKFwkdjFcKQotICBlNjoJYmI0NCAgICAgIAlsd3UJXCR2MCwxNlwoXCR2MVwpCi0gIGU4OgliYjQ4ICAgICAgCWx3dQlcJHYwLDMyXChcJHYxXCkKLSAgZWE6CWJiNTAgICAgICAJbHd1CVwkdjAsNjRcKFwkdjFcKQotICBlYzoJZjA4MCBiYjQwIAlsd3UJXCR2MCwxMjhcKFwkdjFcKQotICBmMDoJZjEwMCBiYjQwIAlsd3UJXCR2MCwyNTZcKFwkdjFcKQotICBmNDoJZjIwMCBiYjQwIAlsd3UJXCR2MCw1MTJcKFwkdjFcKQotICBmODoJZjQwMCBiYjQwIAlsd3UJXCR2MCwxMDI0XChcJHYxXCkKLSAgZmM6CWYwMDEgYmI0MCAJbHd1CVwkdjAsMjA0OFwoXCR2MVwpCi0gMTAwOglmN2ZmIGJiNWYgCWx3dQlcJHYwLC0xXChcJHYxXCkKLSAxMDQ6CWY3ZmYgYmI1ZSAJbHd1CVwkdjAsLTJcKFwkdjFcKQotIDEwODoJZjdmZiBiYjVkIAlsd3UJXCR2MCwtM1woXCR2MVwpCi0gMTBjOglmN2ZmIGJiNWMgCWx3dQlcJHYwLC00XChcJHYxXCkKLSAxMTA6CWY3ZmYgYmI1OCAJbHd1CVwkdjAsLThcKFwkdjFcKQotIDExNDoJZjdmZiBiYjUwIAlsd3UJXCR2MCwtMTZcKFwkdjFcKQotIDExODoJZjdmZiBiYjQwIAlsd3UJXCR2MCwtMzJcKFwkdjFcKQotIDExYzoJZjdkZiBiYjQwIAlsd3UJXCR2MCwtNjRcKFwkdjFcKQotIDEyMDoJZjc5ZiBiYjQwIAlsd3UJXCR2MCwtMTI4XChcJHYxXCkKLSAxMjQ6CWY3MWYgYmI0MCAJbHd1CVwkdjAsLTI1NlwoXCR2MVwpCi0gMTI4OglmNjFmIGJiNDAgCWx3dQlcJHYwLC01MTJcKFwkdjFcKQotIDEyYzoJZjQxZiBiYjQwIAlsd3UJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMTMwOglmMDFmIGJiNDAgCWx3dQlcJHYwLC0yMDQ4XChcJHYxXCkKLSAxMzQ6CTliNDAgICAgICAJbHcJXCR2MCwwXChcJHYxXCkKLSAxMzY6CWYwMDAgOWI0MSAJbHcJXCR2MCwxXChcJHYxXCkKLSAxM2E6CWYwMDAgOWI0MiAJbHcJXCR2MCwyXChcJHYxXCkKLSAxM2U6CWYwMDAgOWI0MyAJbHcJXCR2MCwzXChcJHYxXCkKLSAxNDI6CTliNDEgICAgICAJbHcJXCR2MCw0XChcJHYxXCkKLSAxNDQ6CTliNDIgICAgICAJbHcJXCR2MCw4XChcJHYxXCkKLSAxNDY6CTliNDQgICAgICAJbHcJXCR2MCwxNlwoXCR2MVwpCi0gMTQ4Ogk5YjQ4ICAgICAgCWx3CVwkdjAsMzJcKFwkdjFcKQotIDE0YToJOWI1MCAgICAgIAlsdwlcJHYwLDY0XChcJHYxXCkKLSAxNGM6CWYwODAgOWI0MCAJbHcJXCR2MCwxMjhcKFwkdjFcKQotIDE1MDoJZjEwMCA5YjQwIAlsdwlcJHYwLDI1NlwoXCR2MVwpCi0gMTU0OglmMjAwIDliNDAgCWx3CVwkdjAsNTEyXChcJHYxXCkKLSAxNTg6CWY0MDAgOWI0MCAJbHcJXCR2MCwxMDI0XChcJHYxXCkKLSAxNWM6CWYwMDEgOWI0MCAJbHcJXCR2MCwyMDQ4XChcJHYxXCkKLSAxNjA6CWY3ZmYgOWI1ZiAJbHcJXCR2MCwtMVwoXCR2MVwpCi0gMTY0OglmN2ZmIDliNWUgCWx3CVwkdjAsLTJcKFwkdjFcKQotIDE2ODoJZjdmZiA5YjVkIAlsdwlcJHYwLC0zXChcJHYxXCkKLSAxNmM6CWY3ZmYgOWI1YyAJbHcJXCR2MCwtNFwoXCR2MVwpCi0gMTcwOglmN2ZmIDliNTggCWx3CVwkdjAsLThcKFwkdjFcKQotIDE3NDoJZjdmZiA5YjUwIAlsdwlcJHYwLC0xNlwoXCR2MVwpCi0gMTc4OglmN2ZmIDliNDAgCWx3CVwkdjAsLTMyXChcJHYxXCkKLSAxN2M6CWY3ZGYgOWI0MCAJbHcJXCR2MCwtNjRcKFwkdjFcKQotIDE4MDoJZjc5ZiA5YjQwIAlsdwlcJHYwLC0xMjhcKFwkdjFcKQotIDE4NDoJZjcxZiA5YjQwIAlsdwlcJHYwLC0yNTZcKFwkdjFcKQotIDE4ODoJZjYxZiA5YjQwIAlsdwlcJHYwLC01MTJcKFwkdjFcKQotIDE4YzoJZjQxZiA5YjQwIAlsdwlcJHYwLC0xMDI0XChcJHYxXCkKLSAxOTA6CWYwMWYgOWI0MCAJbHcJXCR2MCwtMjA0OFwoXCR2MVwpCi0gMTk0OglmNjdmIGIyMGMgCWx3CVwkdjAsMCA8ZGF0YTE+Ci0gMTk4OglmNTgwIGIyMDQgCWx3CVwkdjAsNzFjIDxkYXRhMj4KLSAxOWM6CWY2YzAgYjIwYyAJbHcJXCR2MCw4NjggPGJhcj4KLSAxYTA6CWY3ODAgYjIxMCAJbHcJXCR2MCw5MzAgPHF1dXg+Ci0gMWE0Ogk5MjAwICAgICAgCWx3CVwkdjAsMFwoXCRzcFwpCi0gMWE2OglmMDAwIDkyMDEgCWx3CVwkdjAsMVwoXCRzcFwpCi0gMWFhOglmMDAwIDkyMDIgCWx3CVwkdjAsMlwoXCRzcFwpCi0gMWFlOglmMDAwIDkyMDMgCWx3CVwkdjAsM1woXCRzcFwpCi0gMWIyOgk5MjAxICAgICAgCWx3CVwkdjAsNFwoXCRzcFwpCi0gMWI0Ogk5MjAyICAgICAgCWx3CVwkdjAsOFwoXCRzcFwpCi0gMWI2Ogk5MjA0ICAgICAgCWx3CVwkdjAsMTZcKFwkc3BcKQotIDFiODoJOTIwOCAgICAgIAlsdwlcJHYwLDMyXChcJHNwXCkKLSAxYmE6CTkyMTAgICAgICAJbHcJXCR2MCw2NFwoXCRzcFwpCi0gMWJjOgk5MjIwICAgICAgCWx3CVwkdjAsMTI4XChcJHNwXCkKLSAxYmU6CTkyNDAgICAgICAJbHcJXCR2MCwyNTZcKFwkc3BcKQotIDFjMDoJOTI4MCAgICAgIAlsdwlcJHYwLDUxMlwoXCRzcFwpCi0gMWMyOglmNDAwIDkyMDAgCWx3CVwkdjAsMTAyNFwoXCRzcFwpCi0gMWM2OglmMDAxIDkyMDAgCWx3CVwkdjAsMjA0OFwoXCRzcFwpCi0gMWNhOglmN2ZmIDkyMWYgCWx3CVwkdjAsLTFcKFwkc3BcKQotIDFjZToJZjdmZiA5MjFlIAlsdwlcJHYwLC0yXChcJHNwXCkKLSAxZDI6CWY3ZmYgOTIxZCAJbHcJXCR2MCwtM1woXCRzcFwpCi0gMWQ2OglmN2ZmIDkyMWMgCWx3CVwkdjAsLTRcKFwkc3BcKQotIDFkYToJZjdmZiA5MjE4IAlsdwlcJHYwLC04XChcJHNwXCkKLSAxZGU6CWY3ZmYgOTIxMCAJbHcJXCR2MCwtMTZcKFwkc3BcKQotIDFlMjoJZjdmZiA5MjAwIAlsdwlcJHYwLC0zMlwoXCRzcFwpCi0gMWU2OglmN2RmIDkyMDAgCWx3CVwkdjAsLTY0XChcJHNwXCkKLSAxZWE6CWY3OWYgOTIwMCAJbHcJXCR2MCwtMTI4XChcJHNwXCkKLSAxZWU6CWY3MWYgOTIwMCAJbHcJXCR2MCwtMjU2XChcJHNwXCkKLSAxZjI6CWY2MWYgOTIwMCAJbHcJXCR2MCwtNTEyXChcJHNwXCkKLSAxZjY6CWY0MWYgOTIwMCAJbHcJXCR2MCwtMTAyNFwoXCRzcFwpCi0gMWZhOglmMDFmIDkyMDAgCWx3CVwkdjAsLTIwNDhcKFwkc3BcKQotIDFmZToJOGI0MCAgICAgIAlsaAlcJHYwLDBcKFwkdjFcKQotIDIwMDoJZjAwMCA4YjQxIAlsaAlcJHYwLDFcKFwkdjFcKQotIDIwNDoJOGI0MSAgICAgIAlsaAlcJHYwLDJcKFwkdjFcKQotIDIwNjoJZjAwMCA4YjQzIAlsaAlcJHYwLDNcKFwkdjFcKQotIDIwYToJOGI0MiAgICAgIAlsaAlcJHYwLDRcKFwkdjFcKQotIDIwYzoJOGI0NCAgICAgIAlsaAlcJHYwLDhcKFwkdjFcKQotIDIwZToJOGI0OCAgICAgIAlsaAlcJHYwLDE2XChcJHYxXCkKLSAyMTA6CThiNTAgICAgICAJbGgJXCR2MCwzMlwoXCR2MVwpCi0gMjEyOglmMDQwIDhiNDAgCWxoCVwkdjAsNjRcKFwkdjFcKQotIDIxNjoJZjA4MCA4YjQwIAlsaAlcJHYwLDEyOFwoXCR2MVwpCi0gMjFhOglmMTAwIDhiNDAgCWxoCVwkdjAsMjU2XChcJHYxXCkKLSAyMWU6CWYyMDAgOGI0MCAJbGgJXCR2MCw1MTJcKFwkdjFcKQotIDIyMjoJZjQwMCA4YjQwIAlsaAlcJHYwLDEwMjRcKFwkdjFcKQotIDIyNjoJZjAwMSA4YjQwIAlsaAlcJHYwLDIwNDhcKFwkdjFcKQotIDIyYToJZjdmZiA4YjVmIAlsaAlcJHYwLC0xXChcJHYxXCkKLSAyMmU6CWY3ZmYgOGI1ZSAJbGgJXCR2MCwtMlwoXCR2MVwpCi0gMjMyOglmN2ZmIDhiNWQgCWxoCVwkdjAsLTNcKFwkdjFcKQotIDIzNjoJZjdmZiA4YjVjIAlsaAlcJHYwLC00XChcJHYxXCkKLSAyM2E6CWY3ZmYgOGI1OCAJbGgJXCR2MCwtOFwoXCR2MVwpCi0gMjNlOglmN2ZmIDhiNTAgCWxoCVwkdjAsLTE2XChcJHYxXCkKLSAyNDI6CWY3ZmYgOGI0MCAJbGgJXCR2MCwtMzJcKFwkdjFcKQotIDI0NjoJZjdkZiA4YjQwIAlsaAlcJHYwLC02NFwoXCR2MVwpCi0gMjRhOglmNzlmIDhiNDAgCWxoCVwkdjAsLTEyOFwoXCR2MVwpCi0gMjRlOglmNzFmIDhiNDAgCWxoCVwkdjAsLTI1NlwoXCR2MVwpCi0gMjUyOglmNjFmIDhiNDAgCWxoCVwkdjAsLTUxMlwoXCR2MVwpCi0gMjU2OglmNDFmIDhiNDAgCWxoCVwkdjAsLTEwMjRcKFwkdjFcKQotIDI1YToJZjAxZiA4YjQwIAlsaAlcJHYwLC0yMDQ4XChcJHYxXCkKLSAyNWU6CWFiNDAgICAgICAJbGh1CVwkdjAsMFwoXCR2MVwpCi0gMjYwOglmMDAwIGFiNDEgCWxodQlcJHYwLDFcKFwkdjFcKQotIDI2NDoJYWI0MSAgICAgIAlsaHUJXCR2MCwyXChcJHYxXCkKLSAyNjY6CWYwMDAgYWI0MyAJbGh1CVwkdjAsM1woXCR2MVwpCi0gMjZhOglhYjQyICAgICAgCWxodQlcJHYwLDRcKFwkdjFcKQotIDI2YzoJYWI0NCAgICAgIAlsaHUJXCR2MCw4XChcJHYxXCkKLSAyNmU6CWFiNDggICAgICAJbGh1CVwkdjAsMTZcKFwkdjFcKQotIDI3MDoJYWI1MCAgICAgIAlsaHUJXCR2MCwzMlwoXCR2MVwpCi0gMjcyOglmMDQwIGFiNDAgCWxodQlcJHYwLDY0XChcJHYxXCkKLSAyNzY6CWYwODAgYWI0MCAJbGh1CVwkdjAsMTI4XChcJHYxXCkKLSAyN2E6CWYxMDAgYWI0MCAJbGh1CVwkdjAsMjU2XChcJHYxXCkKLSAyN2U6CWYyMDAgYWI0MCAJbGh1CVwkdjAsNTEyXChcJHYxXCkKLSAyODI6CWY0MDAgYWI0MCAJbGh1CVwkdjAsMTAyNFwoXCR2MVwpCi0gMjg2OglmMDAxIGFiNDAgCWxodQlcJHYwLDIwNDhcKFwkdjFcKQotIDI4YToJZjdmZiBhYjVmIAlsaHUJXCR2MCwtMVwoXCR2MVwpCi0gMjhlOglmN2ZmIGFiNWUgCWxodQlcJHYwLC0yXChcJHYxXCkKLSAyOTI6CWY3ZmYgYWI1ZCAJbGh1CVwkdjAsLTNcKFwkdjFcKQotIDI5NjoJZjdmZiBhYjVjIAlsaHUJXCR2MCwtNFwoXCR2MVwpCi0gMjlhOglmN2ZmIGFiNTggCWxodQlcJHYwLC04XChcJHYxXCkKLSAyOWU6CWY3ZmYgYWI1MCAJbGh1CVwkdjAsLTE2XChcJHYxXCkKLSAyYTI6CWY3ZmYgYWI0MCAJbGh1CVwkdjAsLTMyXChcJHYxXCkKLSAyYTY6CWY3ZGYgYWI0MCAJbGh1CVwkdjAsLTY0XChcJHYxXCkKLSAyYWE6CWY3OWYgYWI0MCAJbGh1CVwkdjAsLTEyOFwoXCR2MVwpCi0gMmFlOglmNzFmIGFiNDAgCWxodQlcJHYwLC0yNTZcKFwkdjFcKQotIDJiMjoJZjYxZiBhYjQwIAlsaHUJXCR2MCwtNTEyXChcJHYxXCkKLSAyYjY6CWY0MWYgYWI0MCAJbGh1CVwkdjAsLTEwMjRcKFwkdjFcKQotIDJiYToJZjAxZiBhYjQwIAlsaHUJXCR2MCwtMjA0OFwoXCR2MVwpCi0gMmJlOgk4MzQwICAgICAgCWxiCVwkdjAsMFwoXCR2MVwpCi0gMmMwOgk4MzQxICAgICAgCWxiCVwkdjAsMVwoXCR2MVwpCi0gMmMyOgk4MzQyICAgICAgCWxiCVwkdjAsMlwoXCR2MVwpCi0gMmM0Ogk4MzQzICAgICAgCWxiCVwkdjAsM1woXCR2MVwpCi0gMmM2Ogk4MzQ0ICAgICAgCWxiCVwkdjAsNFwoXCR2MVwpCi0gMmM4Ogk4MzQ4ICAgICAgCWxiCVwkdjAsOFwoXCR2MVwpCi0gMmNhOgk4MzUwICAgICAgCWxiCVwkdjAsMTZcKFwkdjFcKQotIDJjYzoJZjAyMCA4MzQwIAlsYglcJHYwLDMyXChcJHYxXCkKLSAyZDA6CWYwNDAgODM0MCAJbGIJXCR2MCw2NFwoXCR2MVwpCi0gMmQ0OglmMDgwIDgzNDAgCWxiCVwkdjAsMTI4XChcJHYxXCkKLSAyZDg6CWYxMDAgODM0MCAJbGIJXCR2MCwyNTZcKFwkdjFcKQotIDJkYzoJZjIwMCA4MzQwIAlsYglcJHYwLDUxMlwoXCR2MVwpCi0gMmUwOglmNDAwIDgzNDAgCWxiCVwkdjAsMTAyNFwoXCR2MVwpCi0gMmU0OglmMDAxIDgzNDAgCWxiCVwkdjAsMjA0OFwoXCR2MVwpCi0gMmU4OglmN2ZmIDgzNWYgCWxiCVwkdjAsLTFcKFwkdjFcKQotIDJlYzoJZjdmZiA4MzVlIAlsYglcJHYwLC0yXChcJHYxXCkKLSAyZjA6CWY3ZmYgODM1ZCAJbGIJXCR2MCwtM1woXCR2MVwpCi0gMmY0OglmN2ZmIDgzNWMgCWxiCVwkdjAsLTRcKFwkdjFcKQotIDJmODoJZjdmZiA4MzU4IAlsYglcJHYwLC04XChcJHYxXCkKLSAyZmM6CWY3ZmYgODM1MCAJbGIJXCR2MCwtMTZcKFwkdjFcKQotIDMwMDoJZjdmZiA4MzQwIAlsYglcJHYwLC0zMlwoXCR2MVwpCi0gMzA0OglmN2RmIDgzNDAgCWxiCVwkdjAsLTY0XChcJHYxXCkKLSAzMDg6CWY3OWYgODM0MCAJbGIJXCR2MCwtMTI4XChcJHYxXCkKLSAzMGM6CWY3MWYgODM0MCAJbGIJXCR2MCwtMjU2XChcJHYxXCkKLSAzMTA6CWY2MWYgODM0MCAJbGIJXCR2MCwtNTEyXChcJHYxXCkKLSAzMTQ6CWY0MWYgODM0MCAJbGIJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMzE4OglmMDFmIDgzNDAgCWxiCVwkdjAsLTIwNDhcKFwkdjFcKQotIDMxYzoJYTM0MCAgICAgIAlsYnUJXCR2MCwwXChcJHYxXCkKLSAzMWU6CWEzNDEgICAgICAJbGJ1CVwkdjAsMVwoXCR2MVwpCi0gMzIwOglhMzQyICAgICAgCWxidQlcJHYwLDJcKFwkdjFcKQotIDMyMjoJYTM0MyAgICAgIAlsYnUJXCR2MCwzXChcJHYxXCkKLSAzMjQ6CWEzNDQgICAgICAJbGJ1CVwkdjAsNFwoXCR2MVwpCi0gMzI2OglhMzQ4ICAgICAgCWxidQlcJHYwLDhcKFwkdjFcKQotIDMyODoJYTM1MCAgICAgIAlsYnUJXCR2MCwxNlwoXCR2MVwpCi0gMzJhOglmMDIwIGEzNDAgCWxidQlcJHYwLDMyXChcJHYxXCkKLSAzMmU6CWYwNDAgYTM0MCAJbGJ1CVwkdjAsNjRcKFwkdjFcKQotIDMzMjoJZjA4MCBhMzQwIAlsYnUJXCR2MCwxMjhcKFwkdjFcKQotIDMzNjoJZjEwMCBhMzQwIAlsYnUJXCR2MCwyNTZcKFwkdjFcKQotIDMzYToJZjIwMCBhMzQwIAlsYnUJXCR2MCw1MTJcKFwkdjFcKQotIDMzZToJZjQwMCBhMzQwIAlsYnUJXCR2MCwxMDI0XChcJHYxXCkKLSAzNDI6CWYwMDEgYTM0MCAJbGJ1CVwkdjAsMjA0OFwoXCR2MVwpCi0gMzQ2OglmN2ZmIGEzNWYgCWxidQlcJHYwLC0xXChcJHYxXCkKLSAzNGE6CWY3ZmYgYTM1ZSAJbGJ1CVwkdjAsLTJcKFwkdjFcKQotIDM0ZToJZjdmZiBhMzVkIAlsYnUJXCR2MCwtM1woXCR2MVwpCi0gMzUyOglmN2ZmIGEzNWMgCWxidQlcJHYwLC00XChcJHYxXCkKLSAzNTY6CWY3ZmYgYTM1OCAJbGJ1CVwkdjAsLThcKFwkdjFcKQotIDM1YToJZjdmZiBhMzUwIAlsYnUJXCR2MCwtMTZcKFwkdjFcKQotIDM1ZToJZjdmZiBhMzQwIAlsYnUJXCR2MCwtMzJcKFwkdjFcKQotIDM2MjoJZjdkZiBhMzQwIAlsYnUJXCR2MCwtNjRcKFwkdjFcKQotIDM2NjoJZjc5ZiBhMzQwIAlsYnUJXCR2MCwtMTI4XChcJHYxXCkKLSAzNmE6CWY3MWYgYTM0MCAJbGJ1CVwkdjAsLTI1NlwoXCR2MVwpCi0gMzZlOglmNjFmIGEzNDAgCWxidQlcJHYwLC01MTJcKFwkdjFcKQotIDM3MjoJZjQxZiBhMzQwIAlsYnUJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMzc2OglmMDFmIGEzNDAgCWxidQlcJHYwLC0yMDQ4XChcJHYxXCkKLSAzN2E6CTdiNDAgICAgICAJc2QJXCR2MCwwXChcJHYxXCkKLSAzN2M6CWYwMDAgN2I0MSAJc2QJXCR2MCwxXChcJHYxXCkKLSAzODA6CWYwMDAgN2I0MiAJc2QJXCR2MCwyXChcJHYxXCkKLSAzODQ6CWYwMDAgN2I0MyAJc2QJXCR2MCwzXChcJHYxXCkKLSAzODg6CWYwMDAgN2I0NCAJc2QJXCR2MCw0XChcJHYxXCkKLSAzOGM6CTdiNDEgICAgICAJc2QJXCR2MCw4XChcJHYxXCkKLSAzOGU6CTdiNDIgICAgICAJc2QJXCR2MCwxNlwoXCR2MVwpCi0gMzkwOgk3YjQ0ICAgICAgCXNkCVwkdjAsMzJcKFwkdjFcKQotIDM5MjoJN2I0OCAgICAgIAlzZAlcJHYwLDY0XChcJHYxXCkKLSAzOTQ6CTdiNTAgICAgICAJc2QJXCR2MCwxMjhcKFwkdjFcKQotIDM5NjoJZjEwMCA3YjQwIAlzZAlcJHYwLDI1NlwoXCR2MVwpCi0gMzlhOglmMjAwIDdiNDAgCXNkCVwkdjAsNTEyXChcJHYxXCkKLSAzOWU6CWY0MDAgN2I0MCAJc2QJXCR2MCwxMDI0XChcJHYxXCkKLSAzYTI6CWYwMDEgN2I0MCAJc2QJXCR2MCwyMDQ4XChcJHYxXCkKLSAzYTY6CWY3ZmYgN2I1ZiAJc2QJXCR2MCwtMVwoXCR2MVwpCi0gM2FhOglmN2ZmIDdiNWUgCXNkCVwkdjAsLTJcKFwkdjFcKQotIDNhZToJZjdmZiA3YjVkIAlzZAlcJHYwLC0zXChcJHYxXCkKLSAzYjI6CWY3ZmYgN2I1YyAJc2QJXCR2MCwtNFwoXCR2MVwpCi0gM2I2OglmN2ZmIDdiNTggCXNkCVwkdjAsLThcKFwkdjFcKQotIDNiYToJZjdmZiA3YjUwIAlzZAlcJHYwLC0xNlwoXCR2MVwpCi0gM2JlOglmN2ZmIDdiNDAgCXNkCVwkdjAsLTMyXChcJHYxXCkKLSAzYzI6CWY3ZGYgN2I0MCAJc2QJXCR2MCwtNjRcKFwkdjFcKQotIDNjNjoJZjc5ZiA3YjQwIAlzZAlcJHYwLC0xMjhcKFwkdjFcKQotIDNjYToJZjcxZiA3YjQwIAlzZAlcJHYwLC0yNTZcKFwkdjFcKQotIDNjZToJZjYxZiA3YjQwIAlzZAlcJHYwLC01MTJcKFwkdjFcKQotIDNkMjoJZjQxZiA3YjQwIAlzZAlcJHYwLC0xMDI0XChcJHYxXCkKLSAzZDY6CWYwMWYgN2I0MCAJc2QJXCR2MCwtMjA0OFwoXCR2MVwpCi0gM2RhOglmOTQwICAgICAgCXNkCVwkdjAsMFwoXCRzcFwpCi0gM2RjOglmMDAwIGY5NDEgCXNkCVwkdjAsMVwoXCRzcFwpCi0gM2UwOglmMDAwIGY5NDIgCXNkCVwkdjAsMlwoXCRzcFwpCi0gM2U0OglmMDAwIGY5NDMgCXNkCVwkdjAsM1woXCRzcFwpCi0gM2U4OglmMDAwIGY5NDQgCXNkCVwkdjAsNFwoXCRzcFwpCi0gM2VjOglmOTQxICAgICAgCXNkCVwkdjAsOFwoXCRzcFwpCi0gM2VlOglmOTQyICAgICAgCXNkCVwkdjAsMTZcKFwkc3BcKQotIDNmMDoJZjk0NCAgICAgIAlzZAlcJHYwLDMyXChcJHNwXCkKLSAzZjI6CWY5NDggICAgICAJc2QJXCR2MCw2NFwoXCRzcFwpCi0gM2Y0OglmOTUwICAgICAgCXNkCVwkdjAsMTI4XChcJHNwXCkKLSAzZjY6CWYxMDAgZjk0MCAJc2QJXCR2MCwyNTZcKFwkc3BcKQotIDNmYToJZjIwMCBmOTQwIAlzZAlcJHYwLDUxMlwoXCRzcFwpCi0gM2ZlOglmNDAwIGY5NDAgCXNkCVwkdjAsMTAyNFwoXCRzcFwpCi0gNDAyOglmMDAxIGY5NDAgCXNkCVwkdjAsMjA0OFwoXCRzcFwpCi0gNDA2OglmN2ZmIGY5NWYgCXNkCVwkdjAsLTFcKFwkc3BcKQotIDQwYToJZjdmZiBmOTVlIAlzZAlcJHYwLC0yXChcJHNwXCkKLSA0MGU6CWY3ZmYgZjk1ZCAJc2QJXCR2MCwtM1woXCRzcFwpCi0gNDEyOglmN2ZmIGY5NWMgCXNkCVwkdjAsLTRcKFwkc3BcKQotIDQxNjoJZjdmZiBmOTU4IAlzZAlcJHYwLC04XChcJHNwXCkKLSA0MWE6CWY3ZmYgZjk1MCAJc2QJXCR2MCwtMTZcKFwkc3BcKQotIDQxZToJZjdmZiBmOTQwIAlzZAlcJHYwLC0zMlwoXCRzcFwpCi0gNDIyOglmN2RmIGY5NDAgCXNkCVwkdjAsLTY0XChcJHNwXCkKLSA0MjY6CWY3OWYgZjk0MCAJc2QJXCR2MCwtMTI4XChcJHNwXCkKLSA0MmE6CWY3MWYgZjk0MCAJc2QJXCR2MCwtMjU2XChcJHNwXCkKLSA0MmU6CWY2MWYgZjk0MCAJc2QJXCR2MCwtNTEyXChcJHNwXCkKLSA0MzI6CWY0MWYgZjk0MCAJc2QJXCR2MCwtMTAyNFwoXCRzcFwpCi0gNDM2OglmMDFmIGY5NDAgCXNkCVwkdjAsLTIwNDhcKFwkc3BcKQotIDQzYToJZmEwMCAgICAgIAlzZAlcJHJhLDBcKFwkc3BcKQotIDQzYzoJZjAwMCBmYTAxIAlzZAlcJHJhLDFcKFwkc3BcKQotIDQ0MDoJZjAwMCBmYTAyIAlzZAlcJHJhLDJcKFwkc3BcKQotIDQ0NDoJZjAwMCBmYTAzIAlzZAlcJHJhLDNcKFwkc3BcKQotIDQ0ODoJZjAwMCBmYTA0IAlzZAlcJHJhLDRcKFwkc3BcKQotIDQ0YzoJZmEwMSAgICAgIAlzZAlcJHJhLDhcKFwkc3BcKQotIDQ0ZToJZmEwMiAgICAgIAlzZAlcJHJhLDE2XChcJHNwXCkKLSA0NTA6CWZhMDQgICAgICAJc2QJXCRyYSwzMlwoXCRzcFwpCi0gNDUyOglmYTA4ICAgICAgCXNkCVwkcmEsNjRcKFwkc3BcKQotIDQ1NDoJZmExMCAgICAgIAlzZAlcJHJhLDEyOFwoXCRzcFwpCi0gNDU2OglmYTIwICAgICAgCXNkCVwkcmEsMjU2XChcJHNwXCkKLSA0NTg6CWZhNDAgICAgICAJc2QJXCRyYSw1MTJcKFwkc3BcKQotIDQ1YToJZmE4MCAgICAgIAlzZAlcJHJhLDEwMjRcKFwkc3BcKQotIDQ1YzoJZjAwMSBmYTAwIAlzZAlcJHJhLDIwNDhcKFwkc3BcKQotIDQ2MDoJZjdmZiBmYTFmIAlzZAlcJHJhLC0xXChcJHNwXCkKLSA0NjQ6CWY3ZmYgZmExZSAJc2QJXCRyYSwtMlwoXCRzcFwpCi0gNDY4OglmN2ZmIGZhMWQgCXNkCVwkcmEsLTNcKFwkc3BcKQotIDQ2YzoJZjdmZiBmYTFjIAlzZAlcJHJhLC00XChcJHNwXCkKLSA0NzA6CWY3ZmYgZmExOCAJc2QJXCRyYSwtOFwoXCRzcFwpCi0gNDc0OglmN2ZmIGZhMTAgCXNkCVwkcmEsLTE2XChcJHNwXCkKLSA0Nzg6CWY3ZmYgZmEwMCAJc2QJXCRyYSwtMzJcKFwkc3BcKQotIDQ3YzoJZjdkZiBmYTAwIAlzZAlcJHJhLC02NFwoXCRzcFwpCi0gNDgwOglmNzlmIGZhMDAgCXNkCVwkcmEsLTEyOFwoXCRzcFwpCi0gNDg0OglmNzFmIGZhMDAgCXNkCVwkcmEsLTI1NlwoXCRzcFwpCi0gNDg4OglmNjFmIGZhMDAgCXNkCVwkcmEsLTUxMlwoXCRzcFwpCi0gNDhjOglmNDFmIGZhMDAgCXNkCVwkcmEsLTEwMjRcKFwkc3BcKQotIDQ5MDoJZjAxZiBmYTAwIAlzZAlcJHJhLC0yMDQ4XChcJHNwXCkKLSA0OTQ6CWRiNDAgICAgICAJc3cJXCR2MCwwXChcJHYxXCkKLSA0OTY6CWYwMDAgZGI0MSAJc3cJXCR2MCwxXChcJHYxXCkKLSA0OWE6CWYwMDAgZGI0MiAJc3cJXCR2MCwyXChcJHYxXCkKLSA0OWU6CWYwMDAgZGI0MyAJc3cJXCR2MCwzXChcJHYxXCkKLSA0YTI6CWRiNDEgICAgICAJc3cJXCR2MCw0XChcJHYxXCkKLSA0YTQ6CWRiNDIgICAgICAJc3cJXCR2MCw4XChcJHYxXCkKLSA0YTY6CWRiNDQgICAgICAJc3cJXCR2MCwxNlwoXCR2MVwpCi0gNGE4OglkYjQ4ICAgICAgCXN3CVwkdjAsMzJcKFwkdjFcKQotIDRhYToJZGI1MCAgICAgIAlzdwlcJHYwLDY0XChcJHYxXCkKLSA0YWM6CWYwODAgZGI0MCAJc3cJXCR2MCwxMjhcKFwkdjFcKQotIDRiMDoJZjEwMCBkYjQwIAlzdwlcJHYwLDI1NlwoXCR2MVwpCi0gNGI0OglmMjAwIGRiNDAgCXN3CVwkdjAsNTEyXChcJHYxXCkKLSA0Yjg6CWY0MDAgZGI0MCAJc3cJXCR2MCwxMDI0XChcJHYxXCkKLSA0YmM6CWYwMDEgZGI0MCAJc3cJXCR2MCwyMDQ4XChcJHYxXCkKLSA0YzA6CWY3ZmYgZGI1ZiAJc3cJXCR2MCwtMVwoXCR2MVwpCi0gNGM0OglmN2ZmIGRiNWUgCXN3CVwkdjAsLTJcKFwkdjFcKQotIDRjODoJZjdmZiBkYjVkIAlzdwlcJHYwLC0zXChcJHYxXCkKLSA0Y2M6CWY3ZmYgZGI1YyAJc3cJXCR2MCwtNFwoXCR2MVwpCi0gNGQwOglmN2ZmIGRiNTggCXN3CVwkdjAsLThcKFwkdjFcKQotIDRkNDoJZjdmZiBkYjUwIAlzdwlcJHYwLC0xNlwoXCR2MVwpCi0gNGQ4OglmN2ZmIGRiNDAgCXN3CVwkdjAsLTMyXChcJHYxXCkKLSA0ZGM6CWY3ZGYgZGI0MCAJc3cJXCR2MCwtNjRcKFwkdjFcKQotIDRlMDoJZjc5ZiBkYjQwIAlzdwlcJHYwLC0xMjhcKFwkdjFcKQotIDRlNDoJZjcxZiBkYjQwIAlzdwlcJHYwLC0yNTZcKFwkdjFcKQotIDRlODoJZjYxZiBkYjQwIAlzdwlcJHYwLC01MTJcKFwkdjFcKQotIDRlYzoJZjQxZiBkYjQwIAlzdwlcJHYwLC0xMDI0XChcJHYxXCkKLSA0ZjA6CWYwMWYgZGI0MCAJc3cJXCR2MCwtMjA0OFwoXCR2MVwpCi0gNGY0OglkMjAwICAgICAgCXN3CVwkdjAsMFwoXCRzcFwpCi0gNGY2OglmMDAwIGQyMDEgCXN3CVwkdjAsMVwoXCRzcFwpCi0gNGZhOglmMDAwIGQyMDIgCXN3CVwkdjAsMlwoXCRzcFwpCi0gNGZlOglmMDAwIGQyMDMgCXN3CVwkdjAsM1woXCRzcFwpCi0gNTAyOglkMjAxICAgICAgCXN3CVwkdjAsNFwoXCRzcFwpCi0gNTA0OglkMjAyICAgICAgCXN3CVwkdjAsOFwoXCRzcFwpCi0gNTA2OglkMjA0ICAgICAgCXN3CVwkdjAsMTZcKFwkc3BcKQotIDUwODoJZDIwOCAgICAgIAlzdwlcJHYwLDMyXChcJHNwXCkKLSA1MGE6CWQyMTAgICAgICAJc3cJXCR2MCw2NFwoXCRzcFwpCi0gNTBjOglkMjIwICAgICAgCXN3CVwkdjAsMTI4XChcJHNwXCkKLSA1MGU6CWQyNDAgICAgICAJc3cJXCR2MCwyNTZcKFwkc3BcKQotIDUxMDoJZDI4MCAgICAgIAlzdwlcJHYwLDUxMlwoXCRzcFwpCi0gNTEyOglmNDAwIGQyMDAgCXN3CVwkdjAsMTAyNFwoXCRzcFwpCi0gNTE2OglmMDAxIGQyMDAgCXN3CVwkdjAsMjA0OFwoXCRzcFwpCi0gNTFhOglmN2ZmIGQyMWYgCXN3CVwkdjAsLTFcKFwkc3BcKQotIDUxZToJZjdmZiBkMjFlIAlzdwlcJHYwLC0yXChcJHNwXCkKLSA1MjI6CWY3ZmYgZDIxZCAJc3cJXCR2MCwtM1woXCRzcFwpCi0gNTI2OglmN2ZmIGQyMWMgCXN3CVwkdjAsLTRcKFwkc3BcKQotIDUyYToJZjdmZiBkMjE4IAlzdwlcJHYwLC04XChcJHNwXCkKLSA1MmU6CWY3ZmYgZDIxMCAJc3cJXCR2MCwtMTZcKFwkc3BcKQotIDUzMjoJZjdmZiBkMjAwIAlzdwlcJHYwLC0zMlwoXCRzcFwpCi0gNTM2OglmN2RmIGQyMDAgCXN3CVwkdjAsLTY0XChcJHNwXCkKLSA1M2E6CWY3OWYgZDIwMCAJc3cJXCR2MCwtMTI4XChcJHNwXCkKLSA1M2U6CWY3MWYgZDIwMCAJc3cJXCR2MCwtMjU2XChcJHNwXCkKLSA1NDI6CWY2MWYgZDIwMCAJc3cJXCR2MCwtNTEyXChcJHNwXCkKLSA1NDY6CWY0MWYgZDIwMCAJc3cJXCR2MCwtMTAyNFwoXCRzcFwpCi0gNTRhOglmMDFmIGQyMDAgCXN3CVwkdjAsLTIwNDhcKFwkc3BcKQotIDU0ZToJNjIwMCAgICAgIAlzdwlcJHJhLDBcKFwkc3BcKQotIDU1MDoJZjAwMCA2MjAxIAlzdwlcJHJhLDFcKFwkc3BcKQotIDU1NDoJZjAwMCA2MjAyIAlzdwlcJHJhLDJcKFwkc3BcKQotIDU1ODoJZjAwMCA2MjAzIAlzdwlcJHJhLDNcKFwkc3BcKQotIDU1YzoJNjIwMSAgICAgIAlzdwlcJHJhLDRcKFwkc3BcKQotIDU1ZToJNjIwMiAgICAgIAlzdwlcJHJhLDhcKFwkc3BcKQotIDU2MDoJNjIwNCAgICAgIAlzdwlcJHJhLDE2XChcJHNwXCkKLSA1NjI6CTYyMDggICAgICAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gNTY0Ogk2MjEwICAgICAgCXN3CVwkcmEsNjRcKFwkc3BcKQotIDU2NjoJNjIyMCAgICAgIAlzdwlcJHJhLDEyOFwoXCRzcFwpCi0gNTY4Ogk2MjQwICAgICAgCXN3CVwkcmEsMjU2XChcJHNwXCkKLSA1NmE6CTYyODAgICAgICAJc3cJXCRyYSw1MTJcKFwkc3BcKQotIDU2YzoJZjQwMCA2MjAwIAlzdwlcJHJhLDEwMjRcKFwkc3BcKQotIDU3MDoJZjAwMSA2MjAwIAlzdwlcJHJhLDIwNDhcKFwkc3BcKQotIDU3NDoJZjdmZiA2MjFmIAlzdwlcJHJhLC0xXChcJHNwXCkKLSA1Nzg6CWY3ZmYgNjIxZSAJc3cJXCRyYSwtMlwoXCRzcFwpCi0gNTdjOglmN2ZmIDYyMWQgCXN3CVwkcmEsLTNcKFwkc3BcKQotIDU4MDoJZjdmZiA2MjFjIAlzdwlcJHJhLC00XChcJHNwXCkKLSA1ODQ6CWY3ZmYgNjIxOCAJc3cJXCRyYSwtOFwoXCRzcFwpCi0gNTg4OglmN2ZmIDYyMTAgCXN3CVwkcmEsLTE2XChcJHNwXCkKLSA1OGM6CWY3ZmYgNjIwMCAJc3cJXCRyYSwtMzJcKFwkc3BcKQotIDU5MDoJZjdkZiA2MjAwIAlzdwlcJHJhLC02NFwoXCRzcFwpCi0gNTk0OglmNzlmIDYyMDAgCXN3CVwkcmEsLTEyOFwoXCRzcFwpCi0gNTk4OglmNzFmIDYyMDAgCXN3CVwkcmEsLTI1NlwoXCRzcFwpCi0gNTljOglmNjFmIDYyMDAgCXN3CVwkcmEsLTUxMlwoXCRzcFwpCi0gNWEwOglmNDFmIDYyMDAgCXN3CVwkcmEsLTEwMjRcKFwkc3BcKQotIDVhNDoJZjAxZiA2MjAwIAlzdwlcJHJhLC0yMDQ4XChcJHNwXCkKLSA1YTg6CWNiNDAgICAgICAJc2gJXCR2MCwwXChcJHYxXCkKLSA1YWE6CWYwMDAgY2I0MSAJc2gJXCR2MCwxXChcJHYxXCkKLSA1YWU6CWNiNDEgICAgICAJc2gJXCR2MCwyXChcJHYxXCkKLSA1YjA6CWYwMDAgY2I0MyAJc2gJXCR2MCwzXChcJHYxXCkKLSA1YjQ6CWNiNDIgICAgICAJc2gJXCR2MCw0XChcJHYxXCkKLSA1YjY6CWNiNDQgICAgICAJc2gJXCR2MCw4XChcJHYxXCkKLSA1Yjg6CWNiNDggICAgICAJc2gJXCR2MCwxNlwoXCR2MVwpCi0gNWJhOgljYjUwICAgICAgCXNoCVwkdjAsMzJcKFwkdjFcKQotIDViYzoJZjA0MCBjYjQwIAlzaAlcJHYwLDY0XChcJHYxXCkKLSA1YzA6CWYwODAgY2I0MCAJc2gJXCR2MCwxMjhcKFwkdjFcKQotIDVjNDoJZjEwMCBjYjQwIAlzaAlcJHYwLDI1NlwoXCR2MVwpCi0gNWM4OglmMjAwIGNiNDAgCXNoCVwkdjAsNTEyXChcJHYxXCkKLSA1Y2M6CWY0MDAgY2I0MCAJc2gJXCR2MCwxMDI0XChcJHYxXCkKLSA1ZDA6CWYwMDEgY2I0MCAJc2gJXCR2MCwyMDQ4XChcJHYxXCkKLSA1ZDQ6CWY3ZmYgY2I1ZiAJc2gJXCR2MCwtMVwoXCR2MVwpCi0gNWQ4OglmN2ZmIGNiNWUgCXNoCVwkdjAsLTJcKFwkdjFcKQotIDVkYzoJZjdmZiBjYjVkIAlzaAlcJHYwLC0zXChcJHYxXCkKLSA1ZTA6CWY3ZmYgY2I1YyAJc2gJXCR2MCwtNFwoXCR2MVwpCi0gNWU0OglmN2ZmIGNiNTggCXNoCVwkdjAsLThcKFwkdjFcKQotIDVlODoJZjdmZiBjYjUwIAlzaAlcJHYwLC0xNlwoXCR2MVwpCi0gNWVjOglmN2ZmIGNiNDAgCXNoCVwkdjAsLTMyXChcJHYxXCkKLSA1ZjA6CWY3ZGYgY2I0MCAJc2gJXCR2MCwtNjRcKFwkdjFcKQotIDVmNDoJZjc5ZiBjYjQwIAlzaAlcJHYwLC0xMjhcKFwkdjFcKQotIDVmODoJZjcxZiBjYjQwIAlzaAlcJHYwLC0yNTZcKFwkdjFcKQotIDVmYzoJZjYxZiBjYjQwIAlzaAlcJHYwLC01MTJcKFwkdjFcKQotIDYwMDoJZjQxZiBjYjQwIAlzaAlcJHYwLC0xMDI0XChcJHYxXCkKLSA2MDQ6CWYwMWYgY2I0MCAJc2gJXCR2MCwtMjA0OFwoXCR2MVwpCi0gNjA4OgljMzQwICAgICAgCXNiCVwkdjAsMFwoXCR2MVwpCi0gNjBhOgljMzQxICAgICAgCXNiCVwkdjAsMVwoXCR2MVwpCi0gNjBjOgljMzQyICAgICAgCXNiCVwkdjAsMlwoXCR2MVwpCi0gNjBlOgljMzQzICAgICAgCXNiCVwkdjAsM1woXCR2MVwpCi0gNjEwOgljMzQ0ICAgICAgCXNiCVwkdjAsNFwoXCR2MVwpCi0gNjEyOgljMzQ4ICAgICAgCXNiCVwkdjAsOFwoXCR2MVwpCi0gNjE0OgljMzUwICAgICAgCXNiCVwkdjAsMTZcKFwkdjFcKQotIDYxNjoJZjAyMCBjMzQwIAlzYglcJHYwLDMyXChcJHYxXCkKLSA2MWE6CWYwNDAgYzM0MCAJc2IJXCR2MCw2NFwoXCR2MVwpCi0gNjFlOglmMDgwIGMzNDAgCXNiCVwkdjAsMTI4XChcJHYxXCkKLSA2MjI6CWYxMDAgYzM0MCAJc2IJXCR2MCwyNTZcKFwkdjFcKQotIDYyNjoJZjIwMCBjMzQwIAlzYglcJHYwLDUxMlwoXCR2MVwpCi0gNjJhOglmNDAwIGMzNDAgCXNiCVwkdjAsMTAyNFwoXCR2MVwpCi0gNjJlOglmMDAxIGMzNDAgCXNiCVwkdjAsMjA0OFwoXCR2MVwpCi0gNjMyOglmN2ZmIGMzNWYgCXNiCVwkdjAsLTFcKFwkdjFcKQotIDYzNjoJZjdmZiBjMzVlIAlzYglcJHYwLC0yXChcJHYxXCkKLSA2M2E6CWY3ZmYgYzM1ZCAJc2IJXCR2MCwtM1woXCR2MVwpCi0gNjNlOglmN2ZmIGMzNWMgCXNiCVwkdjAsLTRcKFwkdjFcKQotIDY0MjoJZjdmZiBjMzU4IAlzYglcJHYwLC04XChcJHYxXCkKLSA2NDY6CWY3ZmYgYzM1MCAJc2IJXCR2MCwtMTZcKFwkdjFcKQotIDY0YToJZjdmZiBjMzQwIAlzYglcJHYwLC0zMlwoXCR2MVwpCi0gNjRlOglmN2RmIGMzNDAgCXNiCVwkdjAsLTY0XChcJHYxXCkKLSA2NTI6CWY3OWYgYzM0MCAJc2IJXCR2MCwtMTI4XChcJHYxXCkKLSA2NTY6CWY3MWYgYzM0MCAJc2IJXCR2MCwtMjU2XChcJHYxXCkKLSA2NWE6CWY2MWYgYzM0MCAJc2IJXCR2MCwtNTEyXChcJHYxXCkKLSA2NWU6CWY0MWYgYzM0MCAJc2IJXCR2MCwtMTAyNFwoXCR2MVwpCi0gNjYyOglmMDFmIGMzNDAgCXNiCVwkdjAsLTIwNDhcKFwkdjFcKQotIDY2NjoJNmEwMCAgICAgIAlsaQlcJHYwLDAKLSA2Njg6CTZhMDEgICAgICAJbGkJXCR2MCwxCi0gNjZhOglmMTAwIDZhMDAgCWxpCVwkdjAsMjU2Ci0gNjZlOgk2NzVlICAgICAgCW1vdmUJXCR2MCxcJHM4Ci0gNjcwOgk2NTkyICAgICAgCW1vdmUJXCRzNCxcJHYwCi0gNjcyOgk0MzUwICAgICAgCWRhZGRpdQlcJHYwLFwkdjEsMAotIDY3NDoJNDM1MSAgICAgIAlkYWRkaXUJXCR2MCxcJHYxLDEKLSA2NzY6CTQzNWYgICAgICAJZGFkZGl1CVwkdjAsXCR2MSwtMQotIDY3ODoJZjAxMCA0MzUwIAlkYWRkaXUJXCR2MCxcJHYxLDE2Ci0gNjdjOglmN2ZmIDQzNTAgCWRhZGRpdQlcJHYwLFwkdjEsLTE2Ci0gNjgwOgllMzg4ICAgICAgCWRhZGR1CVwkdjAsXCR2MSxcJGEwCi0gNjgyOglmZDQwICAgICAgCWRhZGRpdQlcJHYwLDAKLSA2ODQ6CWZkNDEgICAgICAJZGFkZGl1CVwkdjAsMQotIDY4NjoJZmQ1ZiAgICAgIAlkYWRkaXUJXCR2MCwtMQotIDY4ODoJZjAyMCBmZDQwIAlkYWRkaXUJXCR2MCwzMgotIDY4YzoJZjdmZiBmZDQwIAlkYWRkaXUJXCR2MCwtMzIKLSA2OTA6CWYwODAgZmQ0MCAJZGFkZGl1CVwkdjAsMTI4Ci0gNjk0OglmNzlmIGZkNDAgCWRhZGRpdQlcJHYwLC0xMjgKLSA2OTg6CWYxN2YgZmU0OCAJZGxhCVwkdjAsMCA8ZGF0YTE+Ci0gNjljOglmMDgwIGZlNDAgCWRsYQlcJHYwLDcxYyA8ZGF0YTI+Ci0gNmEwOglmMWMwIGZlNDggCWRsYQlcJHYwLDg2OCA8YmFyPgotIDZhNDoJZjI4MCBmZTRjIAlkbGEJXCR2MCw5MzAgPHF1dXg+Ci0gNmE4OglmYjAwICAgICAgCWRhZGRpdQlcJHNwLDAKLSA2YWE6CWYwMDAgZmIwMSAJZGFkZGl1CVwkc3AsMQotIDZhZToJZjdmZiBmYjFmIAlkYWRkaXUJXCRzcCwtMQotIDZiMjoJZmIyMCAgICAgIAlkYWRkaXUJXCRzcCwyNTYKLSA2YjQ6CWZiZTAgICAgICAJZGFkZGl1CVwkc3AsLTI1NgotIDZiNjoJZmY0MCAgICAgIAlkYWRkaXUJXCR2MCxcJHNwLDAKLSA2Yjg6CWYwMDAgZmY0MSAJZGFkZGl1CVwkdjAsXCRzcCwxCi0gNmJjOglmN2ZmIGZmNWYgCWRhZGRpdQlcJHYwLFwkc3AsLTEKLSA2YzA6CWZmNDggICAgICAJZGFkZGl1CVwkdjAsXCRzcCwzMgotIDZjMjoJZjdmZiBmZjQwIAlkYWRkaXUJXCR2MCxcJHNwLC0zMgotIDZjNjoJZjA4MCBmZjQwIAlkYWRkaXUJXCR2MCxcJHNwLDEyOAotIDZjYToJZjc5ZiBmZjQwIAlkYWRkaXUJXCR2MCxcJHNwLC0xMjgKLSA2Y2U6CTQzNDAgICAgICAJYWRkaXUJXCR2MCxcJHYxLDAKLSA2ZDA6CTQzNDEgICAgICAJYWRkaXUJXCR2MCxcJHYxLDEKLSA2ZDI6CTQzNGYgICAgICAJYWRkaXUJXCR2MCxcJHYxLC0xCi0gNmQ0OglmMDEwIDQzNDAgCWFkZGl1CVwkdjAsXCR2MSwxNgotIDZkODoJZjdmZiA0MzQwIAlhZGRpdQlcJHYwLFwkdjEsLTE2Ci0gNmRjOgllMzg5ICAgICAgCWFkZHUJXCR2MCxcJHYxLFwkYTAKLSA2ZGU6CTRhMDAgICAgICAJYWRkaXUJXCR2MCwwCi0gNmUwOgk0YTAxICAgICAgCWFkZGl1CVwkdjAsMQotIDZlMjoJNGFmZiAgICAgIAlhZGRpdQlcJHYwLC0xCi0gNmU0Ogk0YTIwICAgICAgCWFkZGl1CVwkdjAsMzIKLSA2ZTY6CTRhZTAgICAgICAJYWRkaXUJXCR2MCwtMzIKLSA2ZTg6CWYwODAgNGEwMCAJYWRkaXUJXCR2MCwxMjgKLSA2ZWM6CTRhODAgICAgICAJYWRkaXUJXCR2MCwtMTI4Ci0gNmVlOglmMTFmIDBhMTQgCWxhCVwkdjAsMCA8ZGF0YTE+Ci0gNmYyOgkwYTBiICAgICAgCWxhCVwkdjAsNzFjIDxkYXRhMj4KLSA2ZjQ6CTBhNWQgICAgICAJbGEJXCR2MCw4NjggPGJhcj4KLSA2ZjY6CTBhOGYgICAgICAJbGEJXCR2MCw5MzAgPHF1dXg+Ci0gNmY4Ogk2MzAwICAgICAgCWFkZGl1CVwkc3AsMAotIDZmYToJZjAwMCA2MzAxIAlhZGRpdQlcJHNwLDEKLSA2ZmU6CWY3ZmYgNjMxZiAJYWRkaXUJXCRzcCwtMQotIDcwMjoJNjMyMCAgICAgIAlhZGRpdQlcJHNwLDI1NgotIDcwNDoJNjNlMCAgICAgIAlhZGRpdQlcJHNwLC0yNTYKLSA3MDY6CTAyMDAgICAgICAJYWRkaXUJXCR2MCxcJHNwLDAKLSA3MDg6CWYwMDAgMDIwMSAJYWRkaXUJXCR2MCxcJHNwLDEKLSA3MGM6CWY3ZmYgMDIxZiAJYWRkaXUJXCR2MCxcJHNwLC0xCi0gNzEwOgkwMjA4ICAgICAgCWFkZGl1CVwkdjAsXCRzcCwzMgotIDcxMjoJZjdmZiAwMjAwIAlhZGRpdQlcJHYwLFwkc3AsLTMyCi0gNzE2OgkwMjIwICAgICAgCWFkZGl1CVwkdjAsXCRzcCwxMjgKLSA3MTg6CWY3OWYgMDIwMCAJYWRkaXUJXCR2MCxcJHNwLC0xMjgKLQotMCswMDA3MWMgPGRhdGEyPjoKLSA3MWM6CTAwMDAwMDAwIAlub3AKLQotMCswMDA3MjAgPGluc25zMj46Ci0gNzIwOgllMzhhICAgICAgCWRzdWJ1CVwkdjAsXCR2MSxcJGEwCi0gNzIyOgllMzhiICAgICAgCXN1YnUJXCR2MCxcJHYxLFwkYTAKLSA3MjQ6CWVhNmIgICAgICAJbmVnCVwkdjAsXCR2MQotIDcyNjoJZWE2YyAgICAgIAlhbmQJXCR2MCxcJHYxCi0gNzI4OgllYTZkICAgICAgCW9yCVwkdjAsXCR2MQotIDcyYToJZWE2ZSAgICAgIAl4b3IJXCR2MCxcJHYxCi0gNzJjOgllYTZmICAgICAgCW5vdAlcJHYwLFwkdjEKLSA3MmU6CTUyMDAgICAgICAJc2x0aQlcJHYwLDAKLSA3MzA6CTUyMDEgICAgICAJc2x0aQlcJHYwLDEKLSA3MzI6CWY3ZmYgNTIxZiAJc2x0aQlcJHYwLC0xCi0gNzM2Ogk1MmZmICAgICAgCXNsdGkJXCR2MCwyNTUKLSA3Mzg6CWYxMDAgNTIwMCAJc2x0aQlcJHYwLDI1NgotIDczYzoJZWE2MiAgICAgIAlzbHQJXCR2MCxcJHYxCi0gNzNlOgk1YTAwICAgICAgCXNsdGl1CVwkdjAsMAotIDc0MDoJNWEwMSAgICAgIAlzbHRpdQlcJHYwLDEKLSA3NDI6CWY3ZmYgNWExZiAJc2x0aXUJXCR2MCwtMQotIDc0NjoJNWFmZiAgICAgIAlzbHRpdQlcJHYwLDI1NQotIDc0ODoJZjEwMCA1YTAwIAlzbHRpdQlcJHYwLDI1NgotIDc0YzoJZWE2MyAgICAgIAlzbHR1CVwkdjAsXCR2MQotIDc0ZToJNzIwMCAgICAgIAljbXBpCVwkdjAsMAotIDc1MDoJNzIwMSAgICAgIAljbXBpCVwkdjAsMQotIDc1MjoJNzJmZiAgICAgIAljbXBpCVwkdjAsMjU1Ci0gNzU0OglmMTAwIDcyMDAgCWNtcGkJXCR2MCwyNTYKLSA3NTg6CWVhNmEgICAgICAJY21wCVwkdjAsXCR2MQotIDc1YToJZjAwMCAzMjYxIAlkc2xsCVwkdjAsXCR2MSwwCi0gNzVlOgkzMjY1ICAgICAgCWRzbGwJXCR2MCxcJHYxLDEKLSA3NjA6CTMyNjEgICAgICAJZHNsbAlcJHYwLFwkdjEsOAotIDc2MjoJZjI0MCAzMjYxIAlkc2xsCVwkdjAsXCR2MSw5Ci0gNzY2OglmN2UwIDMyNjEgCWRzbGwJXCR2MCxcJHYxLDYzCi0gNzZhOgllYjU0ICAgICAgCWRzbGx2CVwkdjAsXCR2MQotIDc2YzoJZjAwMCBlODQ4IAlkc3JsCVwkdjAsMAotIDc3MDoJZTk0OCAgICAgIAlkc3JsCVwkdjAsMQotIDc3MjoJZTg0OCAgICAgIAlkc3JsCVwkdjAsOAotIDc3NDoJZjI0MCBlODQ4IAlkc3JsCVwkdjAsOQotIDc3ODoJZjdlMCBlODQ4IAlkc3JsCVwkdjAsNjMKLSA3N2M6CWViNTYgICAgICAJZHNybHYJXCR2MCxcJHYxCi0gNzdlOglmMDAwIGU4NTMgCWRzcmEJXCR2MCwwCi0gNzgyOgllOTUzICAgICAgCWRzcmEJXCR2MCwxCi0gNzg0OgllODUzICAgICAgCWRzcmEJXCR2MCw4Ci0gNzg2OglmMjQwIGU4NTMgCWRzcmEJXCR2MCw5Ci0gNzhhOglmN2UwIGU4NTMgCWRzcmEJXCR2MCw2MwotIDc4ZToJZWI1NyAgICAgIAlkc3JhdglcJHYwLFwkdjEKLSA3OTA6CWVhMTIgICAgICAJbWZsbwlcJHYwCi0gNzkyOgllYjEwICAgICAgCW1maGkJXCR2MQotIDc5NDoJZjAwMCAzMjYwIAlzbGwJXCR2MCxcJHYxLDAKLSA3OTg6CTMyNjQgICAgICAJc2xsCVwkdjAsXCR2MSwxCi0gNzlhOgkzMjYwICAgICAgCXNsbAlcJHYwLFwkdjEsOAotIDc5YzoJZjI0MCAzMjYwIAlzbGwJXCR2MCxcJHYxLDkKLSA3YTA6CWY3YzAgMzI2MCAJc2xsCVwkdjAsXCR2MSwzMQotIDdhNDoJZWI0NCAgICAgIAlzbGx2CVwkdjAsXCR2MQotIDdhNjoJZjAwMCAzMjYyIAlzcmwJXCR2MCxcJHYxLDAKLSA3YWE6CTMyNjYgICAgICAJc3JsCVwkdjAsXCR2MSwxCi0gN2FjOgkzMjYyICAgICAgCXNybAlcJHYwLFwkdjEsOAotIDdhZToJZjI0MCAzMjYyIAlzcmwJXCR2MCxcJHYxLDkKLSA3YjI6CWY3YzAgMzI2MiAJc3JsCVwkdjAsXCR2MSwzMQotIDdiNjoJZWI0NiAgICAgIAlzcmx2CVwkdjAsXCR2MQotIDdiODoJZjAwMCAzMjYzIAlzcmEJXCR2MCxcJHYxLDAKLSA3YmM6CTMyNjcgICAgICAJc3JhCVwkdjAsXCR2MSwxCi0gN2JlOgkzMjYzICAgICAgCXNyYQlcJHYwLFwkdjEsOAotIDdjMDoJZjI0MCAzMjYzIAlzcmEJXCR2MCxcJHYxLDkKLSA3YzQ6CWY3YzAgMzI2MyAJc3JhCVwkdjAsXCR2MSwzMQotIDdjODoJZWI0NyAgICAgIAlzcmF2CVwkdjAsXCR2MQotIDdjYToJZWE3YyAgICAgIAlkbXVsdAlcJHYwLFwkdjEKLSA3Y2M6CWVhN2QgICAgICAJZG11bHR1CVwkdjAsXCR2MQotIDdjZToJZWE3ZSAgICAgIAlkZGl2CVwkemVybyxcJHYwLFwkdjEKLSA3ZDA6CTJiMDEgICAgICAJYm5leglcJHYxLDdkNCA8aW5zbnMyXCsoMHh8KWI0PgotIDdkMjoJZThlNSAgICAgIAlicmVhawk3Ci0gN2Q0OgllYTEyICAgICAgCW1mbG8JXCR2MAotIDdkNjoJNjUwMCAgICAgIAlub3AKLSA3ZDg6CTY1MDAgICAgICAJbm9wCi0gN2RhOgllYTdmICAgICAgCWRkaXZ1CVwkemVybyxcJHYwLFwkdjEKLSA3ZGM6CTJiMDEgICAgICAJYm5leglcJHYxLDdlMCA8aW5zbnMyXCsoMHh8KWMwPgotIDdkZToJZThlNSAgICAgIAlicmVhawk3Ci0gN2UwOgllYTEyICAgICAgCW1mbG8JXCR2MAotIDdlMjoJNjUwMCAgICAgIAlub3AKLSA3ZTQ6CTY1MDAgICAgICAJbm9wCi0gN2U2OgllYTc4ICAgICAgCW11bHQJXCR2MCxcJHYxCi0gN2U4OgllYTc5ICAgICAgCW11bHR1CVwkdjAsXCR2MQotIDdlYToJZWE3YSAgICAgIAlkaXYJXCR6ZXJvLFwkdjAsXCR2MQotIDdlYzoJMmIwMSAgICAgIAlibmV6CVwkdjEsN2YwIDxpbnNuczJcKygweHwpZDA+Ci0gN2VlOgllOGU1ICAgICAgCWJyZWFrCTcKLSA3ZjA6CWVhMTIgICAgICAJbWZsbwlcJHYwCi0gN2YyOgk2NTAwICAgICAgCW5vcAotIDdmNDoJNjUwMCAgICAgIAlub3AKLSA3ZjY6CWVhN2IgICAgICAJZGl2dQlcJHplcm8sXCR2MCxcJHYxCi0gN2Y4OgkyYjAxICAgICAgCWJuZXoJXCR2MSw3ZmMgPGluc25zMlwrKDB4fClkYz4KLSA3ZmE6CWU4ZTUgICAgICAJYnJlYWsJNwotIDdmYzoJZWExMiAgICAgIAltZmxvCVwkdjAKLSA3ZmU6CWVhMDAgICAgICAJanIJXCR2MAotIDgwMDoJNjUwMCAgICAgIAlub3AKLSA4MDI6CWU4MjAgICAgICAJanIJXCRyYQotIDgwNDoJNjUwMCAgICAgIAlub3AKLSA4MDY6CWVhNDAgICAgICAJamFscglcJHYwCi0gODA4Ogk2NTAwICAgICAgCW5vcAotIDgwYToJZjNmZiAyMjFiIAliZXF6CVwkdjAsNCA8aW5zbnMxPgotIDgwZToJMjI4OCAgICAgIAliZXF6CVwkdjAsNzIwIDxpbnNuczI+Ci0gODEwOgkyMjJiICAgICAgCWJlcXoJXCR2MCw4NjggPGJhcj4KLSA4MTI6CWYwODAgMjIwZCAJYmVxeglcJHYwLDkzMCA8cXV1eD4KLSA4MTY6CWYzZmYgMmExNSAJYm5leglcJHYwLDQgPGluc25zMT4KLSA4MWE6CTJhODIgICAgICAJYm5leglcJHYwLDcyMCA8aW5zbnMyPgotIDgxYzoJMmEyNSAgICAgIAlibmV6CVwkdjAsODY4IDxiYXI+Ci0gODFlOglmMDgwIDJhMDcgCWJuZXoJXCR2MCw5MzAgPHF1dXg+Ci0gODIyOglmM2ZmIDYwMGYgCWJ0ZXF6CTQgPGluc25zMT4KLSA4MjY6CWY3N2YgNjAxYiAJYnRlcXoJNzIwIDxpbnNuczI+Ci0gODJhOgk2MDFlICAgICAgCWJ0ZXF6CTg2OCA8YmFyPgotIDgyYzoJZjA4MCA2MDAwIAlidGVxegk5MzAgPHF1dXg+Ci0gODMwOglmM2ZmIDYxMDggCWJ0bmV6CTQgPGluc25zMT4KLSA4MzQ6CWY3N2YgNjExNCAJYnRuZXoJNzIwIDxpbnNuczI+Ci0gODM4Ogk2MTE3ICAgICAgCWJ0bmV6CTg2OCA8YmFyPgotIDgzYToJNjE3YSAgICAgIAlidG5legk5MzAgPHF1dXg+Ci0gODNjOglmM2ZmIDEwMDIgCWIJNCA8aW5zbnMxPgotIDg0MDoJMTc2ZiAgICAgIAliCTcyMCA8aW5zbnMyPgotIDg0MjoJMTAxMiAgICAgIAliCTg2OCA8YmFyPgotIDg0NDoJMTA3NSAgICAgIAliCTkzMCA8cXV1eD4KLSA4NDY6CWU4MDUgICAgICAJYnJlYWsJMAotIDg0ODoJZTgyNSAgICAgIAlicmVhawkxCi0gODRhOgllZmU1ICAgICAgCWJyZWFrCTYzCi0gODRjOgkxODAwIDAwMDAgCWphbAkwIDxkYXRhMT4KLQkJCTg0YzogUl9NSVBTMTZfMjYJZXh0ZXJuCi0gODUwOgk2NTAwICAgICAgCW5vcAotIDg1MjoJZTgwOSAgICAgIAllbnRyeQkKLSA4NTQ6CWU5MDkgICAgICAJZW50cnkJXCRhMAotIDg1NjoJZWI0OSAgICAgIAllbnRyeQlcJGEwLVwkYTIsXCRzMAotIDg1ODoJZThhOSAgICAgIAllbnRyeQlcJHMwLVwkczEsXCRyYQotIDg1YToJZTgyOSAgICAgIAllbnRyeQlcJHJhCi0gODVjOgllZjA5ICAgICAgCWV4aXQJCi0gODVlOgllZjQ5ICAgICAgCWV4aXQJXCRzMAotIDg2MDoJZWZhOSAgICAgIAlleGl0CVwkczAtXCRzMSxcJHJhCi0gODYyOgllZjI5ICAgICAgCWV4aXQJXCRyYQotIDg2NDoJMDAwMCAgICAgIAlhZGRpdQlcJHMwLFwkc3AsMAotCS4uLgotCi0wKzAwMDg2OCA8YmFyPjoKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY4ZmIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotIyBUZXN0IHRoZSBtaXBzMTYgaW5zdHJ1Y3Rpb24gc2V0LgotCi0JLnNldAltaXBzMTYKLQotCS5tYWNybwlsZHN0IG9wLCByZWcsIGJhc2UKLQlcb3AJXHJlZywwKFxiYXNlKQotCVxvcAlccmVnLDEoXGJhc2UpCi0JXG9wCVxyZWcsMihcYmFzZSkKLQlcb3AJXHJlZywzKFxiYXNlKQotCVxvcAlccmVnLDQoXGJhc2UpCi0JXG9wCVxyZWcsOChcYmFzZSkKLQlcb3AJXHJlZywxNihcYmFzZSkKLQlcb3AJXHJlZywzMihcYmFzZSkKLQlcb3AJXHJlZyw2NChcYmFzZSkKLQlcb3AJXHJlZywxMjgoXGJhc2UpCi0JXG9wCVxyZWcsMjU2KFxiYXNlKQotCVxvcAlccmVnLDUxMihcYmFzZSkKLQlcb3AJXHJlZywxMDI0KFxiYXNlKQotCVxvcAlccmVnLDIwNDgoXGJhc2UpCi0JXG9wCVxyZWcsLTEoXGJhc2UpCi0JXG9wCVxyZWcsLTIoXGJhc2UpCi0JXG9wCVxyZWcsLTMoXGJhc2UpCi0JXG9wCVxyZWcsLTQoXGJhc2UpCi0JXG9wCVxyZWcsLTgoXGJhc2UpCi0JXG9wCVxyZWcsLTE2KFxiYXNlKQotCVxvcAlccmVnLC0zMihcYmFzZSkKLQlcb3AJXHJlZywtNjQoXGJhc2UpCi0JXG9wCVxyZWcsLTEyOChcYmFzZSkKLQlcb3AJXHJlZywtMjU2KFxiYXNlKQotCVxvcAlccmVnLC01MTIoXGJhc2UpCi0JXG9wCVxyZWcsLTEwMjQoXGJhc2UpCi0JXG9wCVxyZWcsLTIwNDgoXGJhc2UpCi0JLmVuZG0KLQotCS5wMmFsaWduIDMKLWRhdGExOgotCS53b3JkCTAKLWluc25zMToKLQlsZHN0CWxkLCAkMiwgJDMKLQlsZAkkMixkYXRhMQotCWxkCSQyLGRhdGEyCi0JbGQJJDIsYmFyCi0JbGQJJDIscXV1eAotCWxkc3QJbGQsICQyLCAkc3AKLQlsZHN0CWx3dSwgJDIsICQzCi0JbGRzdAlsdywgJDIsICQzCi0JbHcJJDIsZGF0YTEKLQlsdwkkMixkYXRhMgotCWx3CSQyLGJhcgotCWx3CSQyLHF1dXgKLQlsZHN0CWx3LCAkMiwgJHNwCi0JbGRzdAlsaCwgJDIsICQzCi0JbGRzdAlsaHUsICQyLCAkMwotCWxkc3QJbGIsICQyLCAkMwotCWxkc3QJbGJ1LCAkMiwgJDMKLQlsZHN0CXNkLCAkMiwgJDMKLQlsZHN0CXNkLCAkMiwgJHNwCi0JbGRzdAlzZCwgJDMxLCAkc3AKLQlsZHN0CXN3LCAkMiwgJDMKLQlsZHN0CXN3LCAkMiwgJHNwCi0JbGRzdAlzdywgJDMxLCAkc3AKLQlsZHN0CXNoLCAkMiwgJDMKLQlsZHN0CXNiLCAkMiwgJDMKLQotCWxpCSQyLDAKLQlsaQkkMiwxCi0JbGkJJDIsMjU2Ci0KLQltb3ZlCSQyLCQzMAotCW1vdmUJJDIwLCQyCi0KLQlkYWRkdQkkMiwkMywwCi0JZGFkZHUJJDIsJDMsMQotCWRhZGR1CSQyLCQzLC0xCi0JZGFkZHUJJDIsJDMsMTYKLQlkYWRkdQkkMiwkMywtMTYKLQlkYWRkdQkkMiwkMywkNAotCWRhZGR1CSQyLDAKLQlkYWRkdQkkMiwxCi0JZGFkZHUJJDIsLTEKLQlkYWRkdQkkMiwzMgotCWRhZGR1CSQyLC0zMgotCWRhZGR1CSQyLDEyOAotCWRhZGR1CSQyLC0xMjgKLQlkbGEJJDIsZGF0YTEKLQlkbGEJJDIsZGF0YTIKLQlkbGEJJDIsYmFyCi0JZGxhCSQyLHF1dXgKLQlkYWRkdQkkc3AsMAotCWRhZGR1CSRzcCwxCi0JZGFkZHUJJHNwLC0xCi0JZGFkZHUJJHNwLDI1NgotCWRhZGR1CSRzcCwtMjU2Ci0JZGFkZHUJJDIsJHNwLDAKLQlkYWRkdQkkMiwkc3AsMQotCWRhZGR1CSQyLCRzcCwtMQotCWRhZGR1CSQyLCRzcCwzMgotCWRhZGR1CSQyLCRzcCwtMzIKLQlkYWRkdQkkMiwkc3AsMTI4Ci0JZGFkZHUJJDIsJHNwLC0xMjgKLQotCWFkZHUJJDIsJDMsMAotCWFkZHUJJDIsJDMsMQotCWFkZHUJJDIsJDMsLTEKLQlhZGR1CSQyLCQzLDE2Ci0JYWRkdQkkMiwkMywtMTYKLQlhZGR1CSQyLCQzLCQ0Ci0JYWRkdQkkMiwwCi0JYWRkdQkkMiwxCi0JYWRkdQkkMiwtMQotCWFkZHUJJDIsMzIKLQlhZGR1CSQyLC0zMgotCWFkZHUJJDIsMTI4Ci0JYWRkdQkkMiwtMTI4Ci0JbGEJJDIsZGF0YTEKLQlsYQkkMixkYXRhMgotCWxhCSQyLGJhcgotCWxhCSQyLHF1dXgKLQlhZGR1CSRzcCwwCi0JYWRkdQkkc3AsMQotCWFkZHUJJHNwLC0xCi0JYWRkdQkkc3AsMjU2Ci0JYWRkdQkkc3AsLTI1NgotCWFkZHUJJDIsJHNwLDAKLQlhZGR1CSQyLCRzcCwxCi0JYWRkdQkkMiwkc3AsLTEKLQlhZGR1CSQyLCRzcCwzMgotCWFkZHUJJDIsJHNwLC0zMgotCWFkZHUJJDIsJHNwLDEyOAotCWFkZHUJJDIsJHNwLC0xMjgKLQotZGF0YTI6Ci0JLndvcmQJMAotaW5zbnMyOgkKLQlkc3VidQkkMiwkMywkNAotCXN1YnUJJDIsJDMsJDQKLQluZWcJJDIsJDMKLQotCWFuZAkkMiwkMwotCW9yCSQyLCQzCi0JeG9yCSQyLCQzCi0Jbm90CSQyLCQzCi0KLQlzbHQJJDIsMAotCXNsdAkkMiwxCi0Jc2x0CSQyLC0xCi0Jc2x0CSQyLDI1NQotCXNsdAkkMiwyNTYKLQlzbHQJJDIsJDMKLQlzbHR1CSQyLDAKLQlzbHR1CSQyLDEKLQlzbHR1CSQyLC0xCi0Jc2x0dQkkMiwyNTUKLQlzbHR1CSQyLDI1NgotCXNsdHUJJDIsJDMKLQljbXAJJDIsMAotCWNtcAkkMiwxCi0JY21wCSQyLDI1NQotCWNtcAkkMiwyNTYKLQljbXAJJDIsJDMKLQotCWRzbGwJJDIsJDMsMAotCWRzbGwJJDIsJDMsMQotCWRzbGwJJDIsJDMsOAotCWRzbGwJJDIsJDMsOQotCWRzbGwJJDIsJDMsNjMKLQlkc2xsCSQyLCQzCi0JZHNybAkkMiwwCi0JZHNybAkkMiwxCi0JZHNybAkkMiw4Ci0JZHNybAkkMiw5Ci0JZHNybAkkMiw2MwotCWRzcmwJJDIsJDMKLQlkc3JhCSQyLDAKLQlkc3JhCSQyLDEKLQlkc3JhCSQyLDgKLQlkc3JhCSQyLDkKLQlkc3JhCSQyLDYzCi0JZHNyYQkkMiwkMwotCi0JbWZsbwkkMgotCW1maGkJJDMKLQotCXNsbAkkMiwkMywwCi0Jc2xsCSQyLCQzLDEKLQlzbGwJJDIsJDMsOAotCXNsbAkkMiwkMyw5Ci0Jc2xsCSQyLCQzLDMxCi0Jc2xsCSQyLCQzCi0Jc3JsCSQyLCQzLDAKLQlzcmwJJDIsJDMsMQotCXNybAkkMiwkMyw4Ci0Jc3JsCSQyLCQzLDkKLQlzcmwJJDIsJDMsMzEKLQlzcmwJJDIsJDMKLQlzcmEJJDIsJDMsMAotCXNyYQkkMiwkMywxCi0Jc3JhCSQyLCQzLDgKLQlzcmEJJDIsJDMsOQotCXNyYQkkMiwkMywzMQotCXNyYQkkMiwkMwotCi0JZG11bHQJJDIsJDMKLQlkbXVsdHUJJDIsJDMKLQlkZGl2CSQyLCQzCi0JZGRpdnUJJDIsJDMKLQotCW11bHQJJDIsJDMKLQltdWx0dQkkMiwkMwotCWRpdgkkMiwkMwotCWRpdnUJJDIsJDMKLQotCWpyCSQyCi0JanIJJDMxCi0JamFscgkkMzEsJDIKLQotCWJlcXoJJDIsaW5zbnMxCi0JYmVxegkkMixpbnNuczIKLQliZXF6CSQyLGJhcgotCWJlcXoJJDIscXV1eAotCWJuZXoJJDIsaW5zbnMxCi0JYm5legkkMixpbnNuczIKLQlibmV6CSQyLGJhcgotCWJuZXoJJDIscXV1eAotCWJ0ZXF6CWluc25zMQotCWJ0ZXF6CWluc25zMgotCWJ0ZXF6CWJhcgotCWJ0ZXF6CXF1dXgKLQlidG5leglpbnNuczEKLQlidG5leglpbnNuczIKLQlidG5legliYXIKLQlidG5leglxdXV4Ci0JYglpbnNuczEKLQliCWluc25zMgotCWIJYmFyCi0JYglxdXV4Ci0KLQlicmVhawkwCi0JYnJlYWsJMQotCWJyZWFrCTYzCi0KLQlqYWwJZXh0ZXJuCi0KLQllbnRyeQotCWVudHJ5CSQ0Ci0JZW50cnkJJDQtJDYsJDE2Ci0JZW50cnkJJDE2LSQxNywkMzEKLQllbnRyeQkkMzEKLQlleGl0Ci0JZXhpdAkkMTYKLQlleGl0CSQxNi0kMTcsJDMxCi0JZXhpdAkkMzEKLQotCS5wMmFsaWduIDMKLWJhcjoJCi0KLQkuc2tpcAkyMDAKLXF1dXg6CQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTZkZTkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQuZAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo1MDAwCi0jbmFtZTogTUlQUyBtaXBzNAotI2FzOiAtbWlwczQgLW1jcHU9cjUwMDAKLQotIyBUZXN0IHRoZSBtaXBzNCBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGJjMWYJMDAwMDAwMDArIDx0ZXh0X2xhYmVsPgotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBiYzFmCVwkZmNjMSwwMDAwMDAwMCsgPHRleHRfbGFiZWw+Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGJjMWZsCVwkZmNjMSwwMDAwMDAwMCsgPHRleHRfbGFiZWw+Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGJjMXQJXCRmY2MxLDAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KLTArMDAxYyA8W14+XSo+IG5vcAotMCswMDIwIDxbXj5dKj4gYmMxdGwJXCRmY2MyLDAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gYy5mLmQJXCRmNCxcJGY2Ci0wKzAwMmMgPFtePl0qPiBjLmYuZAlcJGZjYzEsXCRmNCxcJGY2Ci0wKzAwMzAgPFtePl0qPiBsZHhjMQlcJGYyLFwkYTBcKFwkYTFcKQotMCswMDM0IDxbXj5dKj4gbHd4YzEJXCRmMixcJGEwXChcJGExXCkKLTArMDAzOCA8W14+XSo+IG1hZGQuZAlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwM2MgPFtePl0qPiBtYWRkLnMJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDQwIDxbXj5dKj4gbW92ZglcJGEwLFwkYTEsXCRmY2M0Ci0wKzAwNDQgPFtePl0qPiBtb3ZmLmQJXCRmNCxcJGY2LFwkZmNjMAotMCswMDQ4IDxbXj5dKj4gbW92Zi5zCVwkZjQsXCRmNixcJGZjYzAKLTArMDA0YyA8W14+XSo+IG1vdm4JXCRhMCxcJGEyLFwkYTIKLTArMDA1MCA8W14+XSo+IG1vdm4uZAlcJGY0LFwkZjUsXCRhMgotMCswMDU0IDxbXj5dKj4gbW92bi5zCVwkZjQsXCRmNSxcJGEyCi0wKzAwNTggPFtePl0qPiBtb3Z0CVwkYTAsXCRhMSxcJGZjYzQKLTArMDA1YyA8W14+XSo+IG1vdnQuZAlcJGY0LFwkZjYsXCRmY2MwCi0wKzAwNjAgPFtePl0qPiBtb3Z0LnMJXCRmNCxcJGY2LFwkZmNjMAotMCswMDY0IDxbXj5dKj4gbW92eglcJGEwLFwkYTIsXCRhMgotMCswMDY4IDxbXj5dKj4gbW92ei5kCVwkZjQsXCRmNSxcJGEyCi0wKzAwNmMgPFtePl0qPiBtb3Z6LnMJXCRmNCxcJGY1LFwkYTIKLTArMDA3MCA8W14+XSo+IG1zdWIuZAlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwNzQgPFtePl0qPiBtc3ViLnMJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDc4IDxbXj5dKj4gbm1hZGQuZAlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwN2MgPFtePl0qPiBubWFkZC5zCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDA4MCA8W14+XSo+IG5tc3ViLmQJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDg0IDxbXj5dKj4gbm1zdWIucwlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwODggPFtePl0qPiBwcmVmeAkweDQsXCRhMFwoXCRhMVwpCi0wKzAwOGMgPFtePl0qPiByZWNpcC5kCVwkZjQsXCRmNgotMCswMDkwIDxbXj5dKj4gcmVjaXAucwlcJGY0LFwkZjYKLTArMDA5NCA8W14+XSo+IHJzcXJ0LmQJXCRmNCxcJGY2Ci0wKzAwOTggPFtePl0qPiByc3FydC5zCVwkZjQsXCRmNgotMCswMDljIDxbXj5dKj4gc2R4YzEJXCRmNCxcJGEwXChcJGExXCkKLTArMDBhMCA8W14+XSo+IHN3eGMxCVwkZjQsXCRhMFwoXCRhMVwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGI5NDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgLW1pcHM0IGluc3RydWN0aW9ucy4KLQotdGV4dF9sYWJlbDoJCi0JYmMxZgl0ZXh0X2xhYmVsCi0JYmMxZgkkZmNjMSx0ZXh0X2xhYmVsCi0JYmMxZmwJJGZjYzEsdGV4dF9sYWJlbAotCWJjMXQJJGZjYzEsdGV4dF9sYWJlbAotCWJjMXRsCSRmY2MyLHRleHRfbGFiZWwKLQljLmYuZAkkZjQsJGY2Ci0JYy5mLmQJJGZjYzEsJGY0LCRmNgotCWxkeGMxCSRmMiwkNCgkNSkKLQlsd3hjMQkkZjIsJDQoJDUpCi0JbWFkZC5kCSRmMCwkZjIsJGY0LCRmNgotCW1hZGQucwkkZjAsJGYyLCRmNCwkZjYKLQltb3ZmCSQ0LCQ1LCRmY2M0Ci0JbW92Zi5kCSRmNCwkZjYsJGZjYzAKLQltb3ZmLnMJJGY0LCRmNiwkZmNjMAotCW1vdm4JJDQsJDYsJDYKLQltb3ZuLmQJJGY0LCRmNSwkNgotCW1vdm4ucwkkZjQsJGY1LCQ2Ci0JbW92dAkkNCwkNSwkZmNjNAotCW1vdnQuZAkkZjQsJGY2LCRmY2MwCi0JbW92dC5zCSRmNCwkZjYsJGZjYzAKLQltb3Z6CSQ0LCQ2LCQ2Ci0JbW92ei5kCSRmNCwkZjUsJDYKLQltb3Z6LnMJJGY0LCRmNSwkNgotCW1zdWIuZAkkZjAsJGYyLCRmNCwkZjYKLQltc3ViLnMJJGYwLCRmMiwkZjQsJGY2Ci0Jbm1hZGQuZAkkZjAsJGYyLCRmNCwkZjYKLQlubWFkZC5zCSRmMCwkZjIsJGY0LCRmNgotCW5tc3ViLmQJJGYwLCRmMiwkZjQsJGY2Ci0Jbm1zdWIucwkkZjAsJGYyLCRmNCwkZjYKLQotCSMgV2UgZG9uJ3QgdGVzdCBwcmVmIGJlY2F1c2UgY3VycmVudGx5IHRoZSBkaXNhc3NlbWJsZXIgd2lsbAotCSMgZGlzYXNzZW1ibGUgaXQgYXMgbHdjMy4gIGx3YzMgaXMgY29ycmVjdCBmb3IgbWlwczEgdG8gbWlwczMsCi0JIyB3aGlsZSBwcmVmIGlzIGNvcnJlY3QgZm9yIG1pcHM0LiAgVW5mb3J0dW5hdGVseSwgdGhlCi0JIyBkaXNhc3NlbWJsZXIgZG9lcyBub3Qga25vdyB3aGljaCBhcmNoaXRlY3R1cmUgaXQgaXMKLQkjIGRpc2Fzc2VtYmxpbmcgZm9yLgotCSMgcHJlZgk0LDAoJDQpCi0KLQlwcmVmeAk0LCQ0KCQ1KQotCXJlY2lwLmQJJGY0LCRmNgotCXJlY2lwLnMJJGY0LCRmNgotCXJzcXJ0LmQJJGY0LCRmNgotCXJzcXJ0LnMJJGY0LCRmNgotCXNkeGMxCSRmNCwkNCgkNSkKLQlzd3hjMQkkZjQsJDQoJDUpCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZGUxOTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMTAKLSNuYW1lOiBNSVBTIDQwMTAKLSNhczogLW1jcHU9NDAxMAotCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPHN0dWZmPiBmbHVzaGkKLTArMDAwNCA8c3R1ZmZcKzB4ND4gZmx1c2hkCi0wKzAwMDggPHN0dWZmXCsweDg+IGZsdXNoaWQKLTArMDAwYyA8c3R1ZmZcKzB4Yz4gbWFkZAlcJGEwLFwkYTEKLTArMDAxMCA8c3R1ZmZcKzB4MTA+IG1hZGR1CVwkYTEsXCRhMgotMCswMDE0IDxzdHVmZlwrMHgxND4gZmZjCVwkYTIsXCRhMwotMCswMDE4IDxzdHVmZlwrMHgxOD4gZmZzCVwkYTMsXCR0MAotMCswMDFjIDxzdHVmZlwrMHgxYz4gbXN1YglcJHQwLFwkdDEKLTArMDAyMCA8c3R1ZmZcKzB4MjA+IG1zdWJ1CVwkdDEsXCR0MgotMCswMDI0IDxzdHVmZlwrMHgyND4gc2Vsc2wJXCR0MixcJHQzLFwkdDQKLTArMDAyOCA8c3R1ZmZcKzB4Mjg+IHNlbHNyCVwkdDMsXCR0NCxcJHQ1Ci0wKzAwMmMgPHN0dWZmXCsweDJjPiB3YWl0aQotMCswMDMwIDxzdHVmZlwrMHgzMD4gd2IJMTZcKFwkdDZcKQotMCswMDM0IDxzdHVmZlwrMHgzND4gYWRkY2l1CVwkdDYsXCR0NywxNgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ2ZTI1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQwMTAucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkudGV4dAotCi1zdHVmZjoKLQkuZW50IHN0dWZmCi0JZmx1c2hpCi0JZmx1c2hkCi0JZmx1c2hpZAotCW1hZGQgJDQsJDUKLQltYWRkdSAkNSwkNgotCWZmYyAkNiwkNwotCWZmcyAkNywkOAotCW1zdWIgJDgsJDkKLQltc3VidSAkOSwkMTAKLQlzZWxzbCAkMTAsJDExLCQxMgotCXNlbHNyICQxMSwkMTIsJDEzCi0Jd2FpdGkKLQl3YiAxNigkMTQpCi0JYWRkY2l1ICQxNCwkMTUsMTYKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQxMDAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQxMDAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4NGYxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDEwMAotI25hbWU6IE1JUFMgNDEwMAotI2FzOiAtbWNwdT00MTAwCi0KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8c3R1ZmY+IGRtYWRkMTYJXCRhMCxcJGExCi0JLi4uCi0wKzAwMGMgPHN0dWZmXCsweGM+IG1hZGQxNglcJGExLFwkYTIKLTArMDAxMCA8c3R1ZmZcKzB4MTA+IGhpYmVybmF0ZQotMCswMDE0IDxzdHVmZlwrMHgxND4gc3RhbmRieQotMCswMDE4IDxzdHVmZlwrMHgxOD4gc3VzcGVuZAotMCswMDFjIDxzdHVmZlwrMHgxYz4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjBlMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0KLXN0dWZmOgotCS5lbnQgc3R1ZmYKLQlkbWFkZDE2ICQ0LCQ1Ci0JbWFkZDE2ICQ1LCQ2Ci0JaGliZXJuYXRlCi0Jc3RhbmRieQotCXN1c3BlbmQKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2NDJhNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDY1MAotI25hbWU6IE1JUFMgNDY1MAotI2FzOiAtbWNwdT00NjUwCi0KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8c3R1ZmY+IG1hZAlcJGEwLFwkYTEKLQkuLi4KLTArMDAwYyA8c3R1ZmZcKzB4Yz4gbWFkdQlcJGExLFwkYTIKLQkuLi4KLTArMDAxOCA8c3R1ZmZcKzB4MTg+IG11bAlcJGEyLFwkYTMsXCR0MAotMCswMDFjIDxzdHVmZlwrMHgxYz4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzIyYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQotc3R1ZmY6Ci0JLmVudCBzdHVmZgotCW1hZCAkNCwkNQotCW1hZHUgJDUsJDYKLQltdWwgJDYsJDcsJDgKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLWlsb2Nrcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWVkMmUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwtaWxvY2tzLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1JUFMgbXVsLWlsb2NrcwotI2FzOgotI3NvdXJjZTogbXVsLnMKLQotIyBUZXN0IHRoZSBtdWwgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMDggPFtePl0qPiBtdWx0dQlcJGExLFwkYTIKLTArMDAwYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwwCi0wKzAwMTQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDE4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMWMgPFtePl0qPiBsaQlcJGF0LDEKLTArMDAyMCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwMjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAyOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMmMgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDMwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMzQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDM4IDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDAzYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDQ4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1MCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNTQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDU4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNWMgPFtePl0qPiBtdWx0CVwkYTAsXCRhMQotMCswMDYwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNjQgPFtePl0qPiBzcmEJXCRhMCxcJGEwLDB4MWYKLTArMDA2OCA8W14+XSo+IG1maGkJXCRhdAotMCswMDZjIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzc4IDxmb29cKygweHwpNzg+Ci0wKzAwNzAgPFtePl0qPiBub3AKLTArMDA3NCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDA3OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDdjIDxbXj5dKj4gbXVsdAlcJGExLFwkYTIKLTArMDA4MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDg0IDxbXj5dKj4gc3JhCVwkYTAsXCRhMCwweDFmCi0wKzAwODggPFtePl0qPiBtZmhpCVwkYXQKLTArMDA4YyA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCs5OCA8Zm9vXCsoMHh8KTk4PgotMCswMDkwIDxbXj5dKj4gbm9wCi0wKzAwOTQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwOTggPFtePl0qPiBtZmxvCVwkYTAKLTArMDA5YyA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQotMCswMGEwIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwYTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhOCA8W14+XSo+IGJlcXoJXCRhdCwwK2I0IDxmb29cKygweHwpYjQ+Ci0wKzAwYWMgPFtePl0qPiBub3AKLTArMDBiMCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDBiNCA8W14+XSo+IG11bHR1CVwkYTEsXCRhMgotMCswMGI4IDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwYmMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBjMCA8W14+XSo+IGJlcXoJXCRhdCwwK2NjIDxmb29cKygweHwpY2M+Ci0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDBjYyA8W14+XSo+IGRtdWx0dQlcJGExLFwkYTIKLTArMDBkMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGQ0IDxbXj5dKj4gbGkJXCRhdCwxCi0wKzAwZDggPFtePl0qPiBkbXVsdAlcJGExLFwkYXQKLTArMDBkYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMGUwIDxbXj5dKj4gZG11bHQJXCRhMSxcJGEyCi0wKzAwZTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBlOCA8W14+XSo+IGRzcmEzMglcJGEwLFwkYTAsMHgxZgotMCswMGVjIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwZjAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArZmMgPGZvb1wrKDB4fClmYz4KLTArMDBmNCA8W14+XSo+IG5vcAotMCswMGY4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMGZjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMDAgPFtePl0qPiBkbXVsdHUJXCRhMSxcJGEyCi0wKzAxMDQgPFtePl0qPiBtZmhpCVwkYXQKLTArMDEwOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTBjIDxbXj5dKj4gYmVxeglcJGF0LDArMTE4IDxmb29cKygweHwpMTE4PgotMCswMTEwIDxbXj5dKj4gbm9wCi0wKzAxMTQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiNjI2NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5kCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNhczogLW1jcHU9cjQwMDAKLSNuYW1lOiBNSVBTIG11bAotCi0jIFRlc3QgdGhlIG11bCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbXVsdHUJXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDAxMCA8W14+XSo+IG11bHR1CVwkYTEsXCRhMgotMCswMDE0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMTggPFtePl0qPiBsaQlcJGF0LDAKLTArMDAxYyA8W14+XSo+IG5vcAotMCswMDIwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDAyNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwxCi0wKzAwMmMgPFtePl0qPiBub3AKLTArMDAzMCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwMzQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAzOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwNDQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA0OCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwNGMgPFtePl0qPiBub3AKLTArMDA1MCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwNTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA1OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDVjIDxbXj5dKj4gbm9wCi0wKzAwNjAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDY0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2YyA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNzAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDc0IDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAwODAgPFtePl0qPiBtdWx0CVwkYTAsXCRhMQotMCswMDg0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwODggPFtePl0qPiBzcmEJXCRhMCxcJGEwLDB4MWYKLTArMDA4YyA8W14+XSo+IG1maGkJXCRhdAotMCswMDkwIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzljIDxmb29cKygweHwpOWM+Ci0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDA5YyA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMGE4IDxbXj5dKj4gbXVsdAlcJGExLFwkYTIKLTArMDBhYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMGIwIDxbXj5dKj4gc3JhCVwkYTAsXCRhMCwweDFmCi0wKzAwYjQgPFtePl0qPiBtZmhpCVwkYXQKLTArMDBiOCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCtjNCA8Zm9vXCsoMHh8KWM0PgotMCswMGJjIDxbXj5dKj4gbm9wCi0wKzAwYzAgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwYzQgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDBkMCA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQotMCswMGQ0IDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwZDggPFtePl0qPiBtZmxvCVwkYTAKLTArMDBkYyA8W14+XSo+IGJlcXoJXCRhdCwwK2U4IDxmb29cKygweHwpZTg+Ci0wKzAwZTAgPFtePl0qPiBub3AKLTArMDBlNCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDBlOCA8W14+XSo+IG11bHR1CVwkYTEsXCRhMgotMCswMGVjIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwZjAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBmNCA8W14+XSo+IGJlcXoJXCRhdCwwKzEwMCA8Zm9vXCsoMHh8KTEwMD4KLTArMDBmOCA8W14+XSo+IG5vcAotMCswMGZjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTAwIDxbXj5dKj4gZG11bHR1CVwkYTEsXCRhMgotMCswMTA0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMDggPFtePl0qPiBsaQlcJGF0LDEKLTArMDEwYyA8W14+XSo+IG5vcAotMCswMTEwIDxbXj5dKj4gZG11bHQJXCRhMSxcJGF0Ci0wKzAxMTQgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDEyMCA8W14+XSo+IGRtdWx0CVwkYTEsXCRhMgotMCswMTI0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMjggPFtePl0qPiBkc3JhMzIJXCRhMCxcJGEwLDB4MWYKLTArMDEyYyA8W14+XSo+IG1maGkJXCRhdAotMCswMTMwIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzEzYyA8Zm9vXCsoMHh8KTEzYz4KLTArMDEzNCA8W14+XSo+IG5vcAotMCswMTM4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTNjIDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAxNDggPFtePl0qPiBkbXVsdHUJXCRhMSxcJGEyCi0wKzAxNGMgPFtePl0qPiBtZmhpCVwkYXQKLTArMDE1MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTU0IDxbXj5dKj4gYmVxeglcJGF0LDArMTYwIDxmb29cKygweHwpMTYwPgotMCswMTU4IDxbXj5dKj4gbm9wCi0wKzAxNWMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5ZTM2OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIG11bCBtYWNyby4KLQkKLWZvbzoKLQltdWwJJDQsJDUKLQltdWwJJDQsJDUsJDYKLQltdWwJJDQsJDUsMAotCW11bAkkNCwkNSwxCi0JbXVsCSQ0LCQ1LDB4ODAwMAotCW11bAkkNCwkNSwtMHg4MDAwCi0JbXVsCSQ0LCQ1LDB4MTAwMDAKLQltdWwJJDQsJDUsMHgxYTVhNQotCi0jIG11bG8gYW5kIG11bG91IGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgcmVnaXN0ZXIgYXJndW1lbnRzCQotCW11bG8JJDQsJDUKLQltdWxvCSQ0LCQ1LCQ2Ci0KLQltdWxvdQkkNCwkNQotCW11bG91CSQ0LCQ1LCQ2Ci0KLSMgU2FuaXR5IGNoZWNrIHRoZSA2NCBiaXQgdmVyc2lvbnMuCi0JLnNldAltaXBzMwotCWRtdWwJJDQsJDUsJDYKLQlkbXVsCSQ0LCQ1LDEKLQlkbXVsbwkkNCwkNSwkNgotCWRtdWxvdQkkNCwkNSwkNgotCi0gICAgICAgIC5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL25vZGVsYXkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbm9kZWxheS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzkzMDc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbm9kZWxheS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjUwMDAKLSNuYW1lOiBNSVBTIG5vZGVsYXkKLSNhczogLW1pcHM0IC1tY3B1PXI4MDAwCi0jc291cmNlOiBkZWxheS5zCi0KLSMgRm9yIC1taXBzNCAKLSMgR2FzIHNob3VsZCAqbm90KiBwcm9kdWNlIG5vcCdzIGFmdGVyIG10YzEgYW5kIHJlbGF0ZWQgCi0jIGluc24ncyBpZiB0aGUgdGFyZ2V0IGZwciBpcyB1c2VkIGluIHRoZSBpbW1lZGlhdGx5IAotIyBmb2xsb3dpbmcgaW5zbi4gIFNlZSBhbHNvIGRlbGF5LmQuCi0jCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IG10YzEJXCR6ZXJvLFwkZjAKLTArMDAwNCA8W14+XSo+IGN2dC5kLncJXCRmMCxcJGYwCi0wKzAwMDggPFtePl0qPiBtdGMxCVwkemVybyxcJGYxCi0wKzAwMGMgPFtePl0qPiBjdnQuZC53CVwkZjEsXCRmMQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Y2UxNDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wuZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jYXM6IC1tY3B1PXIzMDAwCi0jbmFtZTogTUlQUyBSMzAwMCByb2wKLQotIyBUZXN0IHRoZSByb2wgYW5kIHJvciBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IG5lZ3UJXCRhdCxcJGExCi0wKzAwMDQgPFtePl0qPiBzcmx2CVwkYXQsXCRhMCxcJGF0Ci0wKzAwMDggPFtePl0qPiBzbGx2CVwkYTAsXCRhMCxcJGExCi0wKzAwMGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDEwIDxbXj5dKj4gbmVndQlcJGF0LFwkYTIKLTArMDAxNCA8W14+XSo+IHNybHYJXCRhdCxcJGExLFwkYXQKLTArMDAxOCA8W14+XSo+IHNsbHYJXCRhMCxcJGExLFwkYTIKLTArMDAxYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjAgPFtePl0qPiBzbGwJXCRhdCxcJGEwLDB4MQotMCswMDI0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDFmCi0wKzAwMjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDJjIDxbXj5dKj4gc2xsCVwkYXQsXCRhMSwweDEKLTArMDAzMCA8W14+XSo+IHNybAlcJGEwLFwkYTEsMHgxZgotMCswMDM0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAzOCA8W14+XSo+IG5lZ3UJXCRhdCxcJGExCi0wKzAwM2MgPFtePl0qPiBzbGx2CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBzcmx2CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDQ4IDxbXj5dKj4gbmVndQlcJGF0LFwkYTIKLTArMDA0YyA8W14+XSo+IHNsbHYJXCRhdCxcJGExLFwkYXQKLTArMDA1MCA8W14+XSo+IHNybHYJXCRhMCxcJGExLFwkYTIKLTArMDA1NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNTggPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4MQotMCswMDVjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDFmCi0wKzAwNjAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDY0IDxbXj5dKj4gc3JsCVwkYXQsXCRhMSwweDEKLTArMDA2OCA8W14+XSo+IHNsbAlcJGEwLFwkYTEsMHgxZgotMCswMDZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3JvbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTlhOTU3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgcm9sIGFuZCByb3IgbWFjcm9zLgotCi1mb286Ci0Jcm9sCSQ0LCQ1Ci0Jcm9sCSQ0LCQ1LCQ2Ci0Jcm9sCSQ0LDEKLQlyb2wJJDQsJDUsMQotCi0Jcm9yCSQ0LCQ1Ci0Jcm9yCSQ0LCQ1LCQ2Ci0Jcm9yCSQ0LDEKLQlyb3IJJDQsJDUsMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWY0YmMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IuZAorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgc2IKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgc2IgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IHNiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDBjIDxbXj5dKj4gc2IJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDEwIDxbXj5dKj4gc2IJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAyMCA8W14+XSo+IHNiCVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAyNCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBzYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAwMzQgPFtePl0qPiBzYglcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBzYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDA0NCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDA1MCA8W14+XSo+IHNiCVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBzYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDZjIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDcwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwNzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDA3YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTAgPFtePl0qPiBzYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDljIDxbXj5dKj4gc2IJXCRhMCwxXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSphNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGMwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGM4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwZGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSpkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGU4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTA0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDExOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE1MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTU4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTc4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTgwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTg0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE4OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDE5NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAxYTAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFhOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDFiNCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxYmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWM4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWQwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWRjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDFlOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWYwIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLVsgCV0qMWYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWZjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDIwNCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi1bIAldKjIwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyMTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyMTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDIyNCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDIzMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDIzYyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI1NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI2MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI2NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyNmMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyNzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjg0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI5MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5OCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI5YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmE4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJiNCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmMwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJjNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyY2MgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyZDggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoyZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyZTQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJlYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJmMCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjJmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyZmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMDggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzE0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDMxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzI0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMmMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDM0NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzNTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNTQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzNWMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzNjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzY4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM2YyA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3MCA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDM3NCA8W14+XSo+IHNoCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3OCA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3YyA8W14+XSo+IHN3YzAJXCQ0LDBcKFwkemVyb1wpCi0wKzAzODAgPFtePl0qPiBzd2MxCVwkZjQsMFwoXCR6ZXJvXCkKLTArMDM4NCA8W14+XSo+IHN3YzIJXCQ0LDBcKFwkemVyb1wpCi0wKzAzODggPFtePl0qPiBzd2MzCVwkNCwwXChcJHplcm9cKQotMCswMzhjIDxbXj5dKj4gc3djMQlcJGY0LDBcKFwkemVyb1wpCi0wKzAzOTAgPFtePl0qPiBzd2wJXCRhMCwwXChcJHplcm9cKQotMCswMzk0IDxbXj5dKj4gc3dyCVwkYTAsMFwoXCR6ZXJvXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjNzM1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3NiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHNiIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlzYgkkNCwwCi0Jc2IJJDQsMQotCXNiCSQ0LDB4ODAwMAotCXNiCSQ0LC0weDgwMDAKLQlzYgkkNCwweDEwMDAwCi0Jc2IJJDQsMHgxYTVhNQotCXNiCSQ0LDAoJDUpCi0Jc2IJJDQsMSgkNSkKLQlzYgkkNCwweDgwMDAoJDUpCi0Jc2IJJDQsLTB4ODAwMCgkNSkKLQlzYgkkNCwweDEwMDAwKCQ1KQotCXNiCSQ0LDB4MWE1YTUoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0Jc2IJJDQsZGF0YV9sYWJlbCsxCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlzYgkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0Jc2IJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlzYgkkNCxkYXRhX2xhYmVsKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlzYgkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCQotIyBTZXZlcmFsIG1hY3JvcyBhcmUgaGFuZGxlZCBsaWtlIHNiLiAgU2FuaXR5IGNoZWNrIHRoZW0uCi0Jc2QJJDQsMAotCXNoCSQ0LDAKLQlzdwkkNCwwCi0Jc3djMAkkNCwwCi0Jc3djMQkkNCwwCi0Jc3djMgkkNCwwCi0Jc3djMwkkNCwwCi0Jcy5zCSRmNCwwCi0Jc3dsCSQ0LDAKLQlzd3IJJDQsMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5YTE4Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IHN5bmMgaW5zdHJ1Y3Rpb25zCi0jYXM6IC1taXBzMgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDxmb28+IDAwMDAwMDBmWyAJXSpzeW5jCi0wKzAwMDQgPGZvb1wrMHg0PiAwMDAwMDQwZlsgCV0qc3luYy5wCi0wKzAwMDggPGZvb1wrMHg4PiAwMDAwMDAwZlsgCV0qc3luYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjMGVkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0Jc3luYwotCXN5bmMucAotCXN5bmMubApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5N2FkYjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNhczogLW1jcHU9cjQwMDAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyAyMC1iaXQgdHJhcAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiB0ZXEJXCR6ZXJvLFwkdjEKLTArMDAwNCA8W14+XSo+IHRlcQlcJHplcm8sXCR2MSwweDEKLTArMDAwOCA8W14+XSo+IHRnZQlcJHplcm8sXCR2MQotMCswMDBjIDxbXj5dKj4gdGdlCVwkemVybyxcJHYxLDB4MwotMCswMDEwIDxbXj5dKj4gdGdldQlcJHplcm8sXCR2MQotMCswMDE0IDxbXj5dKj4gdGdldQlcJHplcm8sXCR2MSwweDcKLTArMDAxOCA8W14+XSo+IHRsdAlcJHplcm8sXCR2MQotMCswMDFjIDxbXj5dKj4gdGx0CVwkemVybyxcJHYxLDB4MWYKLTArMDAyMCA8W14+XSo+IHRsdHUJXCR6ZXJvLFwkdjEKLTArMDAyNCA8W14+XSo+IHRsdHUJXCR6ZXJvLFwkdjEsMHhmZgotMCswMDI4IDxbXj5dKj4gdG5lCVwkemVybyxcJHYxCi0wKzAwMmMgPFtePl0qPiB0bmUJXCR6ZXJvLFwkdjEsMHgzZmYKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZkNjU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgMjAtYml0IHRyYXAgaW5zdHJ1Y3Rpb25zCi1mb286CQotCXRlcQkkMCwkMwotCXRlcQkkMCwkMywxCi0JdGdlCSQwLCQzCi0JdGdlCSQwLCQzLDMKLQl0Z2V1CSQwLCQzCi0JdGdldQkkMCwkMyw3Ci0JdGx0CSQwLCQzCi0JdGx0CSQwLCQzLDMxCi0JdGx0dQkkMCwkMwotCXRsdHUJJDAsJDMsMjU1Ci0JdG5lCSQwLCQzCi0JdG5lCSQwLCQzLDEwMjMKLQkKLSMgZm9yY2Ugc29tZSBwYWRkaW5nLCB0byBtYWtlIG9iamR1bXAgY29uc2lzdGVudGx5IHJlcG9ydCB0aGF0IHRoZXJlJ3Mgc29tZQotIyBoZXJlLi4uCi0JLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczOGFlMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdHJ1bmMKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwCi0KLSMgVGVzdCB0aGUgdHJ1bmMgbWFjcm9zLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBjZmMxCVwkYTAsXCQzMQotMCswMDA0IDxbXj5dKj4gY2ZjMQlcJGEwLFwkMzEKLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gb3JpCVwkYXQsXCRhMCwweDMKLTArMDAxMCA8W14+XSo+IHhvcmkJXCRhdCxcJGF0LDB4MgotMCswMDE0IDxbXj5dKj4gY3RjMQlcJGF0LFwkMzEKLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gY3Z0LncuZAlcJGY0LFwkZjYKLTArMDAyMCA8W14+XSo+IGN0YzEJXCRhMCxcJDMxCi0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCi0wKzAwMmMgPFtePl0qPiBjZmMxCVwkYTAsXCQzMQotMCswMDMwIDxbXj5dKj4gbm9wCi0wKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGEwLDB4MwotMCswMDM4IDxbXj5dKj4geG9yaQlcJGF0LFwkYXQsMHgyCi0wKzAwM2MgPFtePl0qPiBjdGMxCVwkYXQsXCQzMQotMCswMDQwIDxbXj5dKj4gbm9wCi0wKzAwNDQgPFtePl0qPiBjdnQudy5zCVwkZjQsXCRmNgotMCswMDQ4IDxbXj5dKj4gY3RjMQlcJGEwLFwkMzEKLTArMDA0YyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWU5MGYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHRydW5jIG1hY3Jvcy4KLQotZm9vOgotCXRydW5jLncuZAkkZjQsJGY2LCQ0Ci0KLQl0cnVuYy53LnMJJGY0LCRmNiwkNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmUyOWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgdWxkCi0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotCi0jIFRlc3QgdGhlIHVsZCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsZGwJXCRhMCxbMThdXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbGRyCVwkYTAsWzE4XVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMTQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbGRsCVwkYTAsLTMyNzZbMThdXChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbGRyCVwkYTAsLTMyNzZbMThdXChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDM4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA0MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsZGwJXCRhMCxbMThdXChcJGExXCkKLTArMDA0YyA8W14+XSo+IGxkcglcJGEwLFstMC05XStcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA4OCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDkwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYmMgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTM0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE3MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE4NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFhNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFmYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjAwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI4NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmZmJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdWxkIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1bGQJJDQsMAotCXVsZAkkNCwxCi0JdWxkCSQ0LDB4ODAwMAotCXVsZAkkNCwtMHg4MDAwCi0JdWxkCSQ0LDB4MTAwMDAKLQl1bGQJJDQsMHgxYTVhNQotCXVsZAkkNCwwKCQ1KQotCXVsZAkkNCwxKCQ1KQotCXVsZAkkNCxkYXRhX2xhYmVsCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1bGQJJDQsZGF0YV9sYWJlbCsxCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1bGQJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsZAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdWxkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWxkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1ZjA2Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVsaC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMKLSNzb3VyY2U6IHVsaC1waWMucwotCi0jIFRlc3QgdGhlIHVsaCBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2Mzg0Ci1bIAldKjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMDggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDAwYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMTAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qMTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAxOCA8W14+XSo+IGxidQlcJGEwLFswMV1cKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwMjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDI0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAyOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAyYyA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSozNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwMzggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA0MCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA0OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qNTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNTQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA1OCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4NAotWyAJXSo1YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTUzODQKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDc0IDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwODAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDg0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4MwotWyAJXSo4NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDg4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA5YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiYyA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qY2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDAgPFtePl0qPiBsYnUJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGQ4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBkYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2MzgzCi1bIAldKmUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBlNCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGU4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE1MzgzCi1bIAldKmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZjQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGY4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTAwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEwNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1waWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNiMjljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBUZXN0IHVuYWxpZ25lZCBsb2FkIGFuZCBzdG9yZSBtYWNyb3Mgd2l0aCBQSUMgY29kZS4gIFdlIGRvbid0IGJvdGhlcgotIyB0byB0ZXN0IG1vc3QgY2FzZXMuICBUaGUgYWN0dWFsIGxvYWRzIGFuZCBzdG9yZXMgYXJlIHRlc3RlZCBieSB0aGUKLSMgbm9uLVBJQyB0ZXN0IGNhc2UuICBXZSBqdXN0IHdhbnQgdG8gY2hlY2sgdGhhdCB0aGUgaW5pdGlhbCBhZGRyZXNzCi0jIGlzIGxvYWRlZCBjb3JyZWN0bHkuCi0KLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdWxoCSQ0LGRhdGFfbGFiZWwKLQl1bGh1CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVsaHUJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdWx3CSQ0LGRhdGFfbGFiZWwrMQotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bGh1CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCS5pZm5kZWYJWEdPVAotCW5vcAotCW5vcAotCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUzM2JkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWxoLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDIC1FQgotI3NvdXJjZTogdWxoLXBpYy5zCi0KLSMgVGVzdCB0aGUgdW5hbGlnbmVkIGxvYWQgYW5kIHN0b3JlIG1hY3JvcyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSowOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAwMTAgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDAxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDFjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDAyOCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAzMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSozNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAzOCA8W14+XSo+IG5vcAotMCswMDNjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAwNDAgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjQ0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMDUwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA1NCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNjAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDY0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qNjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA2OCA8W14+XSo+IG5vcAotMCswMDZjIDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKLTArMDA3NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjc0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMDc4IDxbXj5dKj4gbm9wCi0wKzAwN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo3YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMDgwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDA4NCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA4YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5NCA8W14+XSo+IG5vcAotMCswMDk4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qOTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDA5YyA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMGEwIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBhYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmFjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBiMCA8W14+XSo+IG5vcAotMCswMGI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qYjQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMGJjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmM0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IG5vcAotMCswMGNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDBkMCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGQ4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBlNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSplODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IG5vcAotMCswMGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDBmNCA8W14+XSo+IHN3bAlcJGEwLDBcKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gc3dyCVwkYTAsM1woXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpmYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IG5vcAotMCswMTA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDEwOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDExMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTE4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTE4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMWMgPFtePl0qPiBub3AKLTArMDEyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxMjQgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDEyOCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEzMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMzggPFtePl0qPiBub3AKLTArMDEzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjEzYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE0NCA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAxNGMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNTAgPFtePl0qPiBub3AKLTArMDE1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjE1NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTU4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE1YyA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAxNjAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTY0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTZjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE3MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmY5Y2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bGgteGdvdAotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAgLUtQSUMgLXhnb3QgLUVCIC0tZGVmc3ltIFhHT1Q9MQotI3NvdXJjZTogdWxoLXBpYy5zCi0KLSMgVGVzdCB0aGUgdW5hbGlnbmVkIGxvYWQgYW5kIHN0b3JlIG1hY3JvcyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSowOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDAwYyA8W14+XSo+IG5vcAotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDAxNCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAxYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMDI4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMjg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDJjIDxbXj5dKj4gbm9wCi0wKzAwMzAgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDAzNCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAzYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNDA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwNDggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSo0ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAwNTQgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDA1OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo1ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA1YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDA2MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjYwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA3MCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwN2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjgwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwODggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSo4ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDhjIDxbXj5dKj4gbm9wCi0wKzAwOTAgPFtePl0qPiBzd2wJXCRhMCwwXChcJGF0XCkKLTArMDA5NCA8W14+XSo+IHN3cglcJGEwLDNcKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qOTg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwOWMgPFtePl0qPiBub3AKLTArMDBhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKmEwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAwYWMgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGI4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwYmMgPFtePl0qPiBub3AKLTArMDBjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKmMwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGQ0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBkOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmQ4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBkYyA8W14+XSo+IG5vcAotMCswMGUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qZTA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwZTQgPFtePl0qPiBub3AKLTArMDBlOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAwZWMgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMGY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBmYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEwMCA8W14+XSo+IG5vcAotMCswMTA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDEwOCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTEwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDExNCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDExYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTIwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTI4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTI4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbm9wCi0wKzAxMzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTM0IDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKLTArMDEzYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxM2M6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxNDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxNDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDggPFtePl0qPiBub3AKLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxNTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxNTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTVjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE2MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE2OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE2ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTZjIDxbXj5dKj4gbm9wCi0wKzAxNzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTc0IDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDE3YyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxODAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTg0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTg0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTg4IDxbXj5dKj4gbm9wCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoxOGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE5MCA8W14+XSo+IG5vcAotMCswMTk0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE5OCA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMTljIDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAxYTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxYTQgPFtePl0qPiBub3AKLTArMDFhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjFhODogUl9NSVBTX0xPMTYJLmJzcwotMCswMWFjIDxbXj5dKj4gbm9wCi0wKzAxYjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMWI0IDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxYmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMWMwIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFjYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGguZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNmQ0YjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGguZAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWxoCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIHVsaCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCxbMTJdXChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbGJ1CVwkYXQsWzEyXVwoXCR6ZXJvXCkKLTArMDAxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDIwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMjggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3Nls3OF1cKFwkemVyb1wpCi0wKzAwMzggPFtePl0qPiBsYnUJXCRhdCwtMzI3Nls3OF1cKFwkemVyb1wpCi0wKzAwM2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA0YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDUwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA1NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNTggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1YyA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhMVwpCi0wKzAwNzQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGExXCkKLTArMDA3OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwN2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDgwIDxbXj5dKj4gbGIJXCRhMCxbMTJdXChcJGExXCkKLTArMDA4NCA8W14+XSo+IGxidQlcJGF0LFsxMl1cKFwkYTFcKQotMCswMDg4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA4YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDljIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwYTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBiOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBjOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBkMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZDQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGQ4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGRjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBlOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSplYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDExNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMTggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTFjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEyMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEyOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDEzMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMzQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxM2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE0NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTRjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSoxNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE4OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjE4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE4YyA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxOTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxOTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFhYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYjAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMWI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFiOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxYmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFjMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWVjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxZjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWY0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjAwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIwNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjA4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIxOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDIyMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyMjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIzYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjRjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyNTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjk4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI5YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJhNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyYTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmFjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyYjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmI0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJjMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyY2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmQwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJkOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZGMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJlMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyZTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJmMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJmOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyZmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzA4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMwYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDMxNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMyMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDMyOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzMmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzMwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSozMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzM2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM0MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzNDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjM0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzU0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzNTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzVjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSozNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzY4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM2YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzcwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM3NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSozN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzg0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzODggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzhjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM5NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjM5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM5OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzOWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNhMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzYTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2E4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2E4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDNhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2I0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzYjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2JjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNjMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2M4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNjYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2QwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNkNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzZDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2UwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNlNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2U4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNlYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzZjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2Y0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2Y0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNmOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzZmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQwMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjQwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDE0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0MTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQyMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQyNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQyOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQzMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDQwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ0NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDQ4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ0YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0NTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ1OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQ2MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0NjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDY4IDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCR6ZXJvXCkKLTArMDQ2YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkemVyb1wpCi0wKzA0NzAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDc0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVjYmI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdWxoIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1bGgJJDQsMAotCXVsaAkkNCwxCi0JdWxoCSQ0LDB4ODAwMAotCXVsaAkkNCwtMHg4MDAwCi0JdWxoCSQ0LDB4MTAwMDAKLQl1bGgJJDQsMHgxYTVhNQotCXVsaAkkNCwwKCQ1KQotCXVsaAkkNCwxKCQ1KQotCXVsaAkkNCxkYXRhX2xhYmVsCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1bGgJJDQsZGF0YV9sYWJlbCsxCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1bGgJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsaAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdWxoCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWxoCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgdWxodSBpcyBoYW5kbGVkIGxpa2UgdWxoLiAgU2FuaXR5IGNoZWNrIGl0LgotCXVsaHUJJDQsMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmRjOTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWx3Ci0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIHVsdyBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsd2wJXCRhMCxbMTRdXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbHdyCVwkYTAsWzE0XVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMTQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHdsCVwkYTAsLTMyNzZbNThdXChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHdyCVwkYTAsLTMyNzZbNThdXChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDM4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA0MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsd2wJXCRhMCxbMTRdXChcJGExXCkKLTArMDA0YyA8W14+XSo+IGx3cglcJGEwLFstMC05XStcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGJjIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlOCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGVjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEwOCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE4NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWI0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWUwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFmMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIwMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjg0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJiNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmMwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTM2ZjFjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdWx3IG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1bHcJJDQsMAotCXVsdwkkNCwxCi0JdWx3CSQ0LDB4ODAwMAotCXVsdwkkNCwtMHg4MDAwCi0JdWx3CSQ0LDB4MTAwMDAKLQl1bHcJJDQsMHgxYTVhNQotCXVsdwkkNCwwKCQ1KQotCXVsdwkkNCwxKCQ1KQotCXVsdwkkNCxkYXRhX2xhYmVsCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1bHcJJDQsZGF0YV9sYWJlbCsxCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1bHcJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsdwkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdWx3CSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWx3CSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjMGI3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyB1c2QKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0KLSMgVGVzdCB0aGUgdXNkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IHNkbAlcJGEwLFsxOF1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBzZHIJXCRhMCxbMThdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxNCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBzZGwJXCRhMCwtMzI3NlsxOF1cKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBzZHIJXCRhMCwtMzI3NlsxOF1cKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMzggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGExXCkKLTArMDA0OCA8W14+XSo+IHNkbAlcJGEwLFsxOF1cKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gc2RyCVwkYTAsWy0wLTldK1woXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwODggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYTggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGJjIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwY2MgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkMCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGVjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZjAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTAwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTA4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEzNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTYwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE3YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTgwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxODQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMThjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFiNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWM0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFlMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWU0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFlYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWYwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIwMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIyNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI0NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjU0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyODQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJhNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmMwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJkMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzNjczNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVzZCBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdXNkCSQ0LDAKLQl1c2QJJDQsMQotCXVzZAkkNCwweDgwMDAKLQl1c2QJJDQsLTB4ODAwMAotCXVzZAkkNCwweDEwMDAwCi0JdXNkCSQ0LDB4MWE1YTUKLQl1c2QJJDQsMCgkNSkKLQl1c2QJJDQsMSgkNSkKLQl1c2QJJDQsZGF0YV9sYWJlbAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdXNkCSQ0LGRhdGFfbGFiZWwrMQotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JdXNkCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c2QJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzZAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzZAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2guZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjBhMTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2guZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdXNoCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIHVzaCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKLTArMDAwOCA8W14+XSo+IHNiCVwkYXQsWzAxXVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IHNiCVwkYTAsWzEyXVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4Ci0wKzAwMTQgPFtePl0qPiBzYglcJGF0LFsxMl1cKFwkemVyb1wpCi0wKzAwMTggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAyMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwMjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDI4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAzNCA8W14+XSo+IHNiCVwkYTAsLTMyNzZbNzhdXChcJHplcm9cKQotMCswMDM4IDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKLTArMDAzYyA8W14+XSo+IHNiCVwkYXQsLTMyNzZbNzhdXChcJHplcm9cKQotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwNmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA3YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhMVwpCi0wKzAwODAgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDg0IDxbXj5dKj4gc2IJXCRhdCxbMDFdXChcJGExXCkKLTArMDA4OCA8W14+XSo+IHNiCVwkYTAsWzEyXVwoXCRhMVwpCi0wKzAwOGMgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDkwIDxbXj5dKj4gc2IJXCRhdCxbMTJdXChcJGExXCkKLTArMDA5NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA5OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA5YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYTAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGFjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBiMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDBjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYzggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBjYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZDAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwZTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGU0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwZTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGVjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBmMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTAwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEwNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTA4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSoxMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDExYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxM2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTQwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTQ4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDE1OCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE2MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTcwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxNzggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTkwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxOTggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTljIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxYTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWIwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDFiNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFiYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWNjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFkMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxZDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxZGMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWUwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjFlNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFlOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZWMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMWYwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFmYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjA4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIwYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyMTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDIyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjIyMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDIyYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyMzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDI0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyNTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyN2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjhjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyOWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMmFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJiMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJiOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyYmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDJjYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZDAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJkNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyZDggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmU0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJlOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyZWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmYwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyZjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmY4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJmYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzA0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMwOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzMGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzEwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzMTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDMxYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMzJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDMzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzM2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMzRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDM2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzNzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzg0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM4OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzOGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzOTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzYTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2E4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDNhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzYjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNiNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzYjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2JjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDNjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzYzggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswM2NjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNkMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2Q0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNkOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzZGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2RjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDNlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzZTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2U4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDNlYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzZjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNmNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzZjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2ZjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2ZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjQwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDA4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDQwYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0MjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0M2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0M2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNDQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0NWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNDYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0N2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0ODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ODQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDg4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDQ4YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0OTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQ5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0OTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDljIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNGEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRhOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0YWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0YjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNGI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDRiYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0YzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0YzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRjOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0Y2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGQwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0ZDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNGQ4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDRkYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0ZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNGU0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRlOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0ZWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGYwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0ZjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNGY4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDRmYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTA4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDUwYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1MTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDUxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1MTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjUyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDUyYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1MzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDUzNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1MzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDU0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1NTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDU1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1NTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1NmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1NzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNTc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDU3YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjU3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDU4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDU4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1ODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNThjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDU5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1OWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1YTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNWFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDViMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNWI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDViOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1YmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTU1ODE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdXNoIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1c2gJJDQsMAotCXVzaAkkNCwxCi0JdXNoCSQ0LDB4ODAwMAotCXVzaAkkNCwtMHg4MDAwCi0JdXNoCSQ0LDB4MTAwMDAKLQl1c2gJJDQsMHgxYTVhNQotCXVzaAkkNCwwKCQ1KQotCXVzaAkkNCwxKCQ1KQotCXVzaAkkNCxkYXRhX2xhYmVsCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1c2gJJDQsZGF0YV9sYWJlbCsxCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1c2gJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzaAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdXNoCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXNoCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkMjhjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1c3cKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgdXN3IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IHN3bAlcJGEwLFsxNF1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBzd3IJXCRhMCxbMTRdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxNCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBzd2wJXCRhMCwtMzI3Nls1OF1cKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBzd3IJXCRhMCwtMzI3Nls1OF1cKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMzggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGExXCkKLTArMDA0OCA8W14+XSo+IHN3bAlcJGEwLFsxNF1cKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gc3dyCVwkYTAsWy0wLTldK1woXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA2YyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA4OCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA5NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYTggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiYyA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwY2MgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkMCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSplNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlYyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDExNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTM0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTcwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTgwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxODQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFiNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFkNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFlMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWU0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFmYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIwNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI0NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI4NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJhNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmM0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJkMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxYzYwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVzdyBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdXN3CSQ0LDAKLQl1c3cJJDQsMQotCXVzdwkkNCwweDgwMDAKLQl1c3cJJDQsLTB4ODAwMAotCXVzdwkkNCwweDEwMDAwCi0JdXN3CSQ0LDB4MWE1YTUKLQl1c3cJJDQsMCgkNSkKLQl1c3cJJDQsMSgkNSkKLQl1c3cJJDQsZGF0YV9sYWJlbAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdXN3CSQ0LGRhdGFfbGFiZWwrMQotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JdXN3CSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c3cJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzdwkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzdwkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjUxYmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9hZGQucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotCWFkZCBkMSxkMgotCWFkZCBkMixhMwotCWFkZCBhMixkMQotCWFkZCBhMyxhMgotCWFkZCAxNixkMQotCWFkZCAyNTYsZDIKLQlhZGQgMTMxMDcxLGQzCi0JYWRkIDE2LGExCi0JYWRkIDI1NixhMgotCWFkZCAxMzEwNzEsYTMKLQlhZGRjIGQxLGQyCi0JYWRkbmYgMTYsYTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iYXNpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTNlYjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19hZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkLnM6IEFkZCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYyMEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYyQzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYyNEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEQ1MTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEY3MUEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGNDYzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEQxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY3MEEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGNDY3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCBGMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZiBGNTBFMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JjYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiY2MuczogQmNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmNjLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTgwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRTkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRTIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRTMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRTUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRTYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRTcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRTQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjVGQzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGNUZEMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEY1RkUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgRjVGRjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBFQTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19iY2N4IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJjY3guczogQmNjeCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJjY3gucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNUU4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY1RTkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjVFMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGNUUyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY1RTMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjVFMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNUU1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY1RTYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjVFNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBGNUU0MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEY1RUMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRjVFRDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNUVFMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEY1RUYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdC5zOiBiaXQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTA1NDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY3MDYwMDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGMDI5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGMDM5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIgK0ZGRkY0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotcHJvYyBkb19jbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiY21wLnM6IGNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNtcC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYyMkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYyRUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYyNkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IERCMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEY3NEEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGNDc5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEVFMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjQ3REZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dC5zOiBleHQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGM0M1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBCMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEI3XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQkFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBCRFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0ZW5kIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dGVuZC5zOiBleHRlbmRlZCBpbnN0cnVjdGlvbiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dGVuZC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1MDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY2RkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY5MDIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkIwMzAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZEMDMwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGNjE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGOTE2MTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZCMTcwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGRDE3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEY2NEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY2NUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEY2NzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY1MDI3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjcwM0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEY3MTBGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGMzE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGNTBBN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY3NDNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNzE0RkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjc0RkZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYzRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb29wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvb3AuczogbG9vcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvb3AucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEOFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEQ5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRDFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBEMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQzXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBENVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEQ2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBENFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIERBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgREJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjEuczogbW92MSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjEucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMjM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMkY5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA4NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYyNzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEYzRjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEYzRDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEYzRTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEYzQzhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIDI5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgNjkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjdDOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY0ODlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92Mi5zOiBtb3YyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92Mi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYxNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEM5MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjRDMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSA3OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGN0I5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjRGOUZGRkYgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjExNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRjczMTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIEY0RDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjMge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92My5zOiBtb3YzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92My5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSA0OTIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNzg5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjQwOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGMUU5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBDMTgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDExIEY0NDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgNTkyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjdBOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY0MTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjQge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92NC5zOiBtb3Y0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92NC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYxQTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY3MjE4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGNDUxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIDg1MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEY5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjQ3MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBERDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY0NzVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92eCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Z4LnM6IG1vdnggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Z4LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjU3OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNzc5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjRCOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGNTU5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY3NjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGNDM5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PThdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZiLnM6IG1vdmIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZiLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjUyOTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGN0Q5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjRBOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGMDZCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGNEM2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIDE5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNTE5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY3OTkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBGNDI5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGMEU5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBDNTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI1IEY0NDVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmJ1IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmJ1LnM6IG1vdmJ1IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92YnUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjUzOTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNzU5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjQ5OUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGMDk2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBDRDAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY0QzlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZodSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZodS5zOiBtb3ZodSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmh1LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjA2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjg2NjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGQTY2MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkM2NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY4QkQwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFCRDAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZDQkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNEE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSAzOTgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIxIEZDQUQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjA3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRjg3NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQTc2MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRkM3NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGODk3MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM5IEZBOTc4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZCBGQzk3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE4ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQzIEY0REFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ1IDA3MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkM4NzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdm0uczogbW92bSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdm0ucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDRTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDRUY4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDRjMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDRkY4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX211bGRpdiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtdWxkaXYuczogbXVsZGl2IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibXVsZGl2LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjM0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjM1QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjM2RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19vdGhlciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJvdGhlci5zOiBvdGhlciB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm90aGVyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkMwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNEUwRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEZEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjRFMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGMDA5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGlmdC5zOiBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoaWZ0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjMzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjMzNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjMzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMjVFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGNzFFRkY3RiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEY0NkFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjcwRUZGN0YgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNDZFRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE5IEYyOTYgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IG1uMTAyMDAqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzZXIuCi0gICAgZG9fYWRkCi0gICAgZG9fYmNjCi0gICAgZG9fYmNjeAotICAgIGRvX2JpdAotICAgIGRvX2NtcAotICAgIGRvX2V4dAotICAgIGRvX2xvZ2ljYWwKLSAgICBkb19tb3YxCi0gICAgZG9fbW92MgotICAgIGRvX21vdjMKLSAgICBkb19tb3Y0Ci0gICAgZG9fbW92YgotICAgIGRvX21vdngKLSAgICBkb19tb3ZidQotICAgIGRvX211bGRpdgotICAgIGRvX290aGVyCi0gICAgZG9fc2hpZnQKLSAgICBkb19zdWIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkyZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0JLnRleHQKLWZvbzoKLQliZXEgZm9vCi0JYm5lIGZvbwotCWJndCBmb28KLQliZ2UgZm9vCi0JYmxlIGZvbwotCWJsdCBmb28KLQliaGkgZm9vCi0JYmNjIGZvbwotCWJscyBmb28JCi0JYmNzIGZvbwotCWJ2YyBmb28KLQlidnMgZm9vCi0JYm5jIGZvbwotCWJucyBmb28KLQlicmEgZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjY3gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjeC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGU3ZWRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjeC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0JYmVxeCBmb28KLQlibmV4IGZvbwotCWJndHggZm9vCi0JYmdleCBmb28KLQlibGV4IGZvbwotCWJsdHggZm9vCi0JYmhpeCBmb28KLQliY2N4IGZvbwotCWJsc3ggZm9vCQotCWJjc3ggZm9vCi0JYnZjeCBmb28KLQlidnN4IGZvbwotCWJuY3ggZm9vCi0JYm5zeCBmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JpdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGI2MGQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCWJ0c3QgNjQsZDEKLQlidHN0IDgxOTIsZDIKLQlic2V0IGQxLChhMikKLQliY2xyIGQxLChhMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvY21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2NtcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzM5MjViLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvY21wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQljbXAgZDEsZDIKLQljbXAgZDIsYTMKLQljbXAgYTMsZDMKLQljbXAgYTMsYTIKLQljbXAgMTYsZDMKLQljbXAgMjU2LGQyCi0JY21wIDEzMTA3MSxkMQotCWNtcCAyNTYsYTIKLQljbXAgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2V4dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9leHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlMDFiYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2V4dC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQlleHQgZDEKLQlleHR4IGQyCi0JZXh0eHUgZDMKLQlleHR4YiBkMgotCWV4dHhidSBkMQotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2xvZ2ljYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwOWQ3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2xvZ2ljYWwucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkudGV4dAotCWFuZCBkMSxkMgotCWFuZCAxMjcsZDIKLQlhbmQgMzI3NjcsZDMKLQlhbmQgMzI3NjcscHN3Ci0Jb3IgZDEsZDIKLQlvciAxMjcsZDIKLQlvciAzMjc2NyxkMwotCW9yIDMyNzY3LHBzdwotCXhvciBkMSxkMgotCXhvciAzMjc2NyxkMwotCW5vdCBkMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyOGUzMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjEucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotCW1vdiBkMSxhMgotCW1vdiBhMixkMQotCW1vdiBkMSxkMgotCW1vdiBhMixhMQotCW1vdiBwc3csZDMKLQltb3YgZDIscHN3Ci0JbW92IG1kcixkMQotCW1vdiBkMixtZHIKLQltb3YgKGEyKSxkMQotCW1vdiAoOCxhMiksZDEKLQltb3YgKDI1NixhMiksZDEKLQltb3YgKDEzMTA3MSxhMiksZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjZlMjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQltb3YgKGQxLGExKSxkMgotCW1vdiAoMzI3NjgpLGQxCi0JbW92ICgxMzEwNzEpLGQxCi0JbW92ICg4LGEyKSxhMQotCW1vdiAoMjU2LGEyKSxhMQotCW1vdiAoMTMxMDcxLGEyKSxhMQotCW1vdiAoZDEsYTEpLGEyCi0gICAgICAgIG1vdiAoMzI3NjgpLGExCi0gICAgICAgIG1vdiAoMTMxMDcxKSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3NDkwYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjMucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotICAgICAgICBtb3YgZDEsKGEyKQotICAgICAgICBtb3YgZDEsKDMyLGEyKQotCW1vdiBkMSwoMjU2LGEyKQotCW1vdiBkMSwoMTMxMDcxLGEyKQotCW1vdiBkMSwoZDIsYTIpCi0JbW92IGQxLCgxMjgpCi0JbW92IGQxLCgxMzEwNzEpCi0JbW92IGExLCgzMixhMikKLQltb3YgYTEsKDI1NixhMikKLQltb3YgYTEsKDEzMTA3MSxhMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Y0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMTg3ZTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Y0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkudGV4dAotCW1vdiBhMSwoZDIsYTIpCi0JbW92IGExLCgxMjgpCi0JbW92IGExLCgxMzEwNzEpCi0JbW92IDgsZDEKLQltb3YgMjU2LGQxCi0JbW92IDEzMTA3MSxkMQotCW1vdiAyNTYsYTEKLQltb3YgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU2NjE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JbW92YiAoOCxhMiksZDEKLQltb3ZiICgyNTYsYTIpLGQxCi0JbW92YiAoMTMxMDcxLGEyKSxkMQotCW1vdmIgKGQyLGEyKSxkMwotCW1vdmIgKDEzMTA3MSksZDIKLQltb3ZiIGQxLChhMikKLQltb3ZiIGQxLCg4LGEyKQotCW1vdmIgZDEsKDI1NixhMikKLQltb3ZiIGQxLCgxMzEwNzEsYTIpCi0JbW92YiBkMSwoZDIsYTIpCi0JbW92YiBkMSwoMjU2KQotCW1vdmIgZDEsKDEzMTA3MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92YnUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92YnUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkOTczYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmJ1LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotCW1vdmJ1IChhMiksZDEKLQltb3ZidSAoOCxhMiksZDEKLQltb3ZidSAoMjU2LGEyKSxkMQotCW1vdmJ1ICgxMzEwNzEsYTIpLGQxCi0JbW92YnUgKGQxLGExKSxkMgotCW1vdmJ1ICgzMjc2OCksZDEKLQltb3ZidSAoMTMxMDcxKSxkMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Z4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdngucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlMWQ3MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdngucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS50ZXh0Ci0JbW92eCAoOCxhMiksZDEKLQltb3Z4ICgyNTYsYTIpLGQxCi0JbW92eCAoMTMxMDcxLGEyKSxkMQotCW1vdnggZDEsKDgsYTIpCi0JbW92eCBkMSwoMjU2LGEyKQotCW1vdnggZDEsKDEzMTA3MSxhMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbXVsZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL211bGRpdi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE3MDI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbXVsZGl2LnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkudGV4dAotCW11bCBkMSxkMgotCW11bHUgZDIsZDMKLQlkaXZ1IGQzLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL290aGVyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL290aGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjk0YmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9vdGhlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0Jam1wIDI1NgotCWptcCAxMzEwNzEKLQlqbXAgKGEyKQotCWpzciAyNTYKLQlqc3IgMTMxMDcxCi0JanNyIChhMikKLQlydHMKLQlydGkKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc2hpZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZTc2OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3NoaWZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCWFzciBkMgotCWxzciBkMwotCXJvciBkMQotCXJvbCBkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc3ViLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTE2NTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zdWIucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCXN1YiBkMSxkMgotCXN1YiBkMixhMwotCXN1YiBhMyxkMwotCXN1YiBhMyxhMgotCXN1YiAzMjc2NyxkMgotCXN1YiAxMzEwNzEsZDIKLQlzdWIgMzI3NjcsYTIKLQlzdWIgMTMxMDcxLGEyCi0Jc3ViYyBkMSxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjU1OGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hZGQucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotCWFkZCBkMSxkMgotCWFkZCBkMixhMwotCWFkZCBhMyxhMgotCWFkZCBhMixkMQotCWFkZCAxNixkMQotCWFkZCAyNTYsZDIKLQlhZGQgMTMxMDcxLGQzCi0JYWRkIDE2LGExCi0JYWRkIDI1NixhMgotCWFkZCAxMzEwNzEsYTMKLQlhZGQgMTYsc3AKLQlhZGQgMjU2LHNwCi0JYWRkIDEzMTA3MSxzcAotCWFkZGMgZDEsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZDNiNmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCWNhbGwgMjU2LFthMixhMyxleHJlZzBdLDkKLQljYWxsIDI1NixbYTIsYTMsZXhyZWcxXSw5Ci0JY2FsbCAyNTYsW2EyLGEzLGV4b3RoZXJdLDkKLQljYWxsIDI1NixbYTIsYTMsYWxsXSw5Ci0JY2FsbCAxMzEwNzEsW2EyLGEzLGV4cmVnMF0sOQotCWNhbGwgMTMxMDcxLFthMixhMyxleHJlZzFdLDkKLQljYWxsIDEzMTA3MSxbYTIsYTMsZXhvdGhlcl0sOQotCWNhbGwgMTMxMDcxLFthMixhMyxhbGxdLDkKLQltb3ZtIChzcCksW2EyLGEzLGV4cmVnMF0KLQltb3ZtIChzcCksW2EyLGEzLGV4cmVnMV0KLQltb3ZtIChzcCksW2EyLGEzLGV4b3RoZXJdCi0JbW92bSAoc3ApLFthMixhMyxhbGxdCi0JbW92bSBbYTIsYTMsZXhyZWcwXSwoc3ApCi0JbW92bSBbYTIsYTMsZXhyZWcxXSwoc3ApCi0JbW92bSBbYTIsYTMsZXhvdGhlcl0sKHNwKQotCW1vdm0gW2EyLGEzLGFsbF0sKHNwKQotCW1vdm0gKHVzcCksW2EyLGEzLGV4cmVnMF0KLQltb3ZtICh1c3ApLFthMixhMyxleHJlZzFdCi0JbW92bSAodXNwKSxbYTIsYTMsZXhvdGhlcl0KLQltb3ZtICh1c3ApLFthMixhMyxhbGxdCi0JbW92bSBbYTIsYTMsZXhyZWcwXSwodXNwKQotCW1vdm0gW2EyLGEzLGV4cmVnMV0sKHVzcCkKLQltb3ZtIFthMixhMyxleG90aGVyXSwodXNwKQotCW1vdm0gW2EyLGEzLGFsbF0sKHVzcCkKLQltb3YgdXNwLGEwCi0JbW92IHNzcCxhMQotCW1vdiBtc3AsYTIKLQltb3YgcGMsYTMKLQltb3YgYTAsdXNwCi0JbW92IGExLHNzcAotCW1vdiBhMixtc3AKLQlzeXNjYWxsIDB4NAotCW1vdiBlcHN3LGQwCi0JbW92IGQxLGVwc3cKLQltb3YgYTAscjEKLQltb3YgZDIscjMKLQltb3YgcjUsYTEKLQltb3YgcjcsZDMKLQltY3N0OSBkMAotCW1jc3Q0OCBkMQotCWdldGNoeCBkMAotCWdldGNseCBkMQotCWFuZCAxMzEwNzIsZXBzdwotCW9yIDY1NTM1LGVwc3cKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM18yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYyYTg3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM18yLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCW1vdiByMCxyMQotCWV4dCByMgotCWV4dGIgcjMscjQKLQlleHRidSByNCxyNQotCWV4dGggcjYscjcKLQlleHRodSByNyxyOAotCWNsciByOQotCWFkZCByMTAscjExCi0JYWRkYyByMTIscjEzCi0Jc3ViIHIxNCxyMTUKLQlzdWJjIHIxNSxyMTQKLQlpbmMgcjEzCi0JaW5jNCByMTIKLQljbXAgcjExLHIxMAotCW1vdiB4cjAsIHIxCi0JbW92IHIxLCB4cjIKLQlhbmQgcjAscjEKLQlvciByMixyMwotCXhvciByNCxyNQotCW5vdCByNgotCWFzciByNyxyOAotCWxzciByOSxyMTAKLQlhc2wgcjExLHIxMgotCWFzbDIgcjEzCi0Jcm9yIHIxNAotCXJvbCByMTUKLQltdWwgcjEscjIKLQltdWx1IHIzLHI0Ci0JZGl2IHI1LHI2Ci0JZGl2dSByNyxyOAotCW1vdiAocjEpLHIyCi0JbW92IHIzLChyNCkKLQltb3ZidSAocjUpLHI2Ci0JbW92YnUgcjcsKHI4KQotCW1vdmh1IChyOSkscjEwCi0JbW92aHUgcjExLChyMTIpCi0JbW92IChyMSspLHIyCi0JbW92IHIzLChyNCspCi0JbW92IChzcCkscjUKLQltb3YgcjYsKHNwKQotCW1vdmJ1IChzcCkscjcKLQltb3ZidSByOCwoc3ApCi0JbW92aHUgKHNwKSxyOQotCW1vdmh1IHIxMCwoc3ApCi0JbW92aHUgKHI2KykscjcKLQltb3ZodSByOCwocjkrKQotCW1hYyByMSxyMgotCW1hY3UgcjMscjQKLQltYWNiIHI1LHI2Ci0JbWFjYnUgcjcscjgKLQltYWNoIHI5LHIxMAotCW1hY2h1IHIxMSxyMTIKLQlkbWFjaCByMTMscjE0Ci0JZG1hY2h1IHIxNSxyMTQKLQlkbXVsaCByMTMscjEyCi0JZG11bGh1IHIxMSxyMTAKLQlzYXQxNiByOSxyOAotCW1jc3RlIHI3LHI2Ci0Jc3dhcCByNSxyNAotCXN3YXBoIHIzLHIyCi0Jc3dodyAgcjEscjAKLQlic2NoIHIxLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmYWRiNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfMy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQltb3YgMTYscjEKLQltb3Z1IDE2LHIxCi0JYWRkIDE2LHIxCi0JYWRkYyAxNixyMQotCXN1YiAxNixyMQotCXN1YmMgMTYscjEKLQljbXAgMTYscjEKLQltb3YgMTYseHIxCi0JYW5kIDE2LHIxCi0Jb3IgMTYscjEKLQl4b3IgMTYscjEKLQlhc3IgMTYscjEKLQlsc3IgMTYscjEKLQlhc2wgMTYscjEKLQltdWwgMTYscjEKLQltdWx1IDE2LHIxCi0JYnRzdCAxNixyMQotCW1vdiAoMTYscjEpLHIyCi0JbW92IHIyLCgxNixyMSkKLQltb3ZidSAoMTYscjEpLHIyCi0JbW92YnUgcjIsKDE2LHIxKQotCW1vdmh1ICgxNixyMSkscjIKLQltb3ZodSByMiwoMTYscjEpCi0JbW92ICgxNixzcCkscjIKLQltb3YgcjIsKDE2LHNwKQotCW1vdmJ1ICgxNixzcCkscjIKLQltb3ZidSByMiwoMTYsc3ApCi0JbW92aHUgKDE2LHNwKSxyMgotCW1vdmh1IHIyLCgxNixzcCkKLQltYWMgMTYscjEKLQltYWN1IDE2LHIxCi0JbWFjYiAxNixyMQotCW1hY2J1IDE2LHIxCi0JbWFjaCAxNixyMQotCW1hY2h1IDE2LHIxCi0JbWNzdGUgMTYscjEKLQlhZGQgcjEscjIscjMKLQltb3YgKHIxKywxNikscjIKLQltb3YgcjEsKHIyKywxNikKLQltb3ZodSAocjErLDE2KSxyMgotCW1vdmh1IHIxLChyMissMTYpCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5MGZkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQltb3YgMHgxZmZlZmYscjIKLQltb3Z1IDB4MWZmZWZmLHIyCi0JYWRkIDB4MWZmZWZmLHIyCi0JYWRkYyAweDFmZmVmZixyMgotCXN1YiAweDFmZmVmZixyMgotCXN1YmMgMHgxZmZlZmYscjIKLQljbXAgMHgxZmZlZmYscjIKLQltb3YgMHgxZmZlZmYseHIyCi0JYW5kIDB4MWZmZWZmLHIyCi0Jb3IgMHgxZmZlZmYscjIKLQl4b3IgMHgxZmZlZmYscjIKLQlhc3IgMHgxZmZlZmYscjIKLQlsc3IgMHgxZmZlZmYscjIKLQlhc2wgMHgxZmZlZmYscjIKLQltdWwgMHgxZmZlZmYscjIKLQltdWx1IDB4MWZmZWZmLHIyCi0JYnRzdCAweDFmZmVmZixyMgotCW1vdiAoMHgxZmZlZmYscjEpLHIyCi0JbW92IHIyLCgweDFmZmVmZixyMSkKLQltb3ZidSAoMHgxZmZlZmYscjEpLHIyCi0JbW92YnUgcjIsKDB4MWZmZWZmLHIxKQotCW1vdmh1ICgweDFmZmVmZixyMSkscjIKLQltb3ZodSByMiwoMHgxZmZlZmYscjEpCi0JbW92ICgweDFmZmVmZixzcCkscjIKLQltb3YgcjIsKDB4MWZmZWZmLHNwKQotCW1vdmJ1ICgweDFmZmVmZixzcCkscjIKLQltb3ZidSByMiwoMHgxZmZlZmYsc3ApCi0JbW92aHUgKDB4MWZmZWZmLHNwKSxyMgotCW1vdmh1IHIyLCgweDFmZmVmZixzcCkKLQltYWMgMHgxZmZlZmYscjIKLQltYWN1IDB4MWZmZWZmLHIyCi0JbWFjYiAweDFmZmVmZixyMgotCW1hY2J1IDB4MWZmZWZmLHIyCi0JbWFjaCAweDFmZmVmZixyMgotCW1hY2h1IDB4MWZmZWZmLHIyCi0JbW92ICgweDFmZmVmZikscjIKLQltb3YgcjIsKDB4MWZmZWZmKQotCW1vdmJ1ICgweDFmZmVmZikscjIKLQltb3ZidSByMiwoMHgxZmZlZmYpCi0JbW92aHUgKDB4MWZmZWZmKSxyMgotCW1vdmh1IHIyLCgweDFmZmVmZikKLQltb3YgKHIxKywweDFmZmVmZikscjIKLQltb3YgcjEsKHIyKywweDFmZmVmZikKLQltb3ZodSAocjErLDB4MWZmZWZmKSxyMgotCW1vdmh1IHIxLChyMissMHgxZmZlZmYpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhYTQyZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNS5zCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQltb3YgMHg3ZmZlZmRmYyxyMgotCW1vdnUgMHg3ZmZlZmRmYyxyMgotCWFkZCAweDdmZmVmZGZjLHIyCi0JYWRkYyAweDdmZmVmZGZjLHIyCi0Jc3ViIDB4N2ZmZWZkZmMscjIKLQlzdWJjIDB4N2ZmZWZkZmMscjIKLQljbXAgMHg3ZmZlZmRmYyxyMgotCW1vdiAweDdmZmVmZGZjLHhyMgotCWFuZCAweDdmZmVmZGZjLHIyCi0Jb3IgMHg3ZmZlZmRmYyxyMgotCXhvciAweDdmZmVmZGZjLHIyCi0JYXNyIDB4N2ZmZWZkZmMscjIKLQlsc3IgMHg3ZmZlZmRmYyxyMgotCWFzbCAweDdmZmVmZGZjLHIyCi0JbXVsIDB4N2ZmZWZkZmMscjIKLQltdWx1IDB4N2ZmZWZkZmMscjIKLQlidHN0IDB4N2ZmZWZkZmMscjIKLQltb3YgKDB4N2ZmZWZkZmMscjEpLHIyCi0JbW92IHIyLCgweDdmZmVmZGZjLHIxKQotCW1vdmJ1ICgweDdmZmVmZGZjLHIxKSxyMgotCW1vdmJ1IHIyLCgweDdmZmVmZGZjLHIxKQotCW1vdmh1ICgweDdmZmVmZGZjLHIxKSxyMgotCW1vdmh1IHIyLCgweDdmZmVmZGZjLHIxKQotCW1vdiAoMHg3ZmZlZmRmYyxzcCkscjIKLQltb3YgcjIsKDB4N2ZmZWZkZmMsc3ApCi0JbW92YnUgKDB4N2ZmZWZkZmMsc3ApLHIyCi0JbW92YnUgcjIsKDB4N2ZmZWZkZmMsc3ApCi0JbW92aHUgKDB4N2ZmZWZkZmMsc3ApLHIyCi0JbW92aHUgcjIsKDB4N2ZmZWZkZmMsc3ApCi0JbWFjIDB4N2ZmZWZkZmMscjIKLQltYWN1IDB4N2ZmZWZkZmMscjIKLQltYWNiIDB4N2ZmZWZkZmMscjIKLQltYWNidSAweDdmZmVmZGZjLHIyCi0JbWFjaCAweDdmZmVmZGZjLHIyCi0JbWFjaHUgMHg3ZmZlZmRmYyxyMgotCWRtYWNoIDB4N2ZmZWZkZmMscjIKLQlkbWFjaHUgMHg3ZmZlZmRmYyxyMgotCWRtdWxoIDB4N2ZmZWZkZmMscjIKLQlkbXVsaHUgMHg3ZmZlZmRmYyxyMgotCW1vdiAoMHg3ZmZlZmRmYykscjIKLQltb3YgcjIsKDB4N2ZmZWZkZmMpCi0JbW92YnUgKDB4N2ZmZWZkZmMpLHIyCi0JbW92YnUgcjIsKDB4N2ZmZWZkZmMpCi0JbW92aHUgKDB4N2ZmZWZkZmMpLHIyCi0JbW92aHUgcjIsKDB4N2ZmZWZkZmMpCi0JbXVsIGQwLGQxLGEwLGExCi0JbXVsdSBkMCxkMSxhMCxhMQotCW1vdiAocjErLDB4N2ZmZWZkZmMpLHIyCi0JbW92IHIxLChyMissMHg3ZmZlZmRmYykKLQltb3ZodSAocjErLDB4N2ZmZWZkZmMpLHIyCi0JbW92aHUgcjEsKHIyKywweDdmZmVmZGZjKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM182LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDY2ZjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzYucworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLQkudGV4dAotCS5hbTMzCi0JYWRkX2FkZCByNCxyMSxyMixyMwotCWFkZF9hZGQgcjQscjEsMixyMwotCWFkZF9zdWIgcjQscjEscjIscjMKLQlhZGRfc3ViIHI0LHIxLDIscjMKLQlhZGRfY21wIHI0LHIxLHIyLHIzCi0JYWRkX2NtcCByNCxyMSwyLHIzCi0JYWRkX21vdiByNCxyMSxyMixyMwotCWFkZF9tb3YgcjQscjEsMixyMwotCWFkZF9hc3IgcjQscjEscjIscjMKLQlhZGRfYXNyIHI0LHIxLDIscjMKLQlhZGRfbHNyIHI0LHIxLHIyLHIzCi0JYWRkX2xzciByNCxyMSwyLHIzCi0JYWRkX2FzbCByNCxyMSxyMixyMwotCWFkZF9hc2wgcjQscjEsMixyMwotCWNtcF9hZGQgcjQscjEscjIscjMKLQljbXBfYWRkIHI0LHIxLDIscjMKLQljbXBfc3ViIHI0LHIxLHIyLHIzCi0JY21wX3N1YiByNCxyMSwyLHIzCi0JY21wX21vdiByNCxyMSxyMixyMwotCWNtcF9tb3YgcjQscjEsMixyMwotCWNtcF9hc3IgcjQscjEscjIscjMKLQljbXBfYXNyIHI0LHIxLDIscjMKLQljbXBfbHNyIHI0LHIxLHIyLHIzCi0JY21wX2xzciByNCxyMSwyLHIzCi0JY21wX2FzbCByNCxyMSxyMixyMwotCWNtcF9hc2wgcjQscjEsMixyMwotCXN1Yl9hZGQgcjQscjEscjIscjMKLQlzdWJfYWRkIHI0LHIxLDIscjMKLQlzdWJfc3ViIHI0LHIxLHIyLHIzCi0Jc3ViX3N1YiByNCxyMSwyLHIzCi0Jc3ViX2NtcCByNCxyMSxyMixyMwotCXN1Yl9jbXAgcjQscjEsMixyMwotCXN1Yl9tb3YgcjQscjEscjIscjMKLQlzdWJfbW92IHI0LHIxLDIscjMKLQlzdWJfYXNyIHI0LHIxLHIyLHIzCi0Jc3ViX2FzciByNCxyMSwyLHIzCi0Jc3ViX2xzciByNCxyMSxyMixyMwotCXN1Yl9sc3IgcjQscjEsMixyMwotCXN1Yl9hc2wgcjQscjEscjIscjMKLQlzdWJfYXNsIHI0LHIxLDIscjMKLQltb3ZfYWRkIHI0LHIxLHIyLHIzCi0JbW92X2FkZCByNCxyMSwyLHIzCi0JbW92X3N1YiByNCxyMSxyMixyMwotCW1vdl9zdWIgcjQscjEsMixyMwotCW1vdl9jbXAgcjQscjEscjIscjMKLQltb3ZfY21wIHI0LHIxLDIscjMKLQltb3ZfbW92IHI0LHIxLHIyLHIzCi0JbW92X21vdiByNCxyMSwyLHIzCi0JbW92X2FzciByNCxyMSxyMixyMwotCW1vdl9hc3IgcjQscjEsMixyMwotCW1vdl9sc3IgcjQscjEscjIscjMKLQltb3ZfbHNyIHI0LHIxLDIscjMKLQltb3ZfYXNsIHI0LHIxLHIyLHIzCi0JbW92X2FzbCByNCxyMSwyLHIzCi0JYWRkX2FkZCA0LHIxLHIyLHIzCi0JYWRkX2FkZCA0LHIxLDIscjMKLQlhZGRfc3ViIDQscjEscjIscjMKLQlhZGRfc3ViIDQscjEsMixyMwotCWFkZF9jbXAgNCxyMSxyMixyMwotCWFkZF9jbXAgNCxyMSwyLHIzCi0JYWRkX21vdiA0LHIxLHIyLHIzCi0JYWRkX21vdiA0LHIxLDIscjMKLQlhZGRfYXNyIDQscjEscjIscjMKLQlhZGRfYXNyIDQscjEsMixyMwotCWFkZF9sc3IgNCxyMSxyMixyMwotCWFkZF9sc3IgNCxyMSwyLHIzCi0JYWRkX2FzbCA0LHIxLHIyLHIzCi0JYWRkX2FzbCA0LHIxLDIscjMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM183LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWVlNWY0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM183LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCWNtcF9hZGQgNCxyMSxyMixyMwotCWNtcF9hZGQgNCxyMSwyLHIzCi0JY21wX3N1YiA0LHIxLHIyLHIzCi0JY21wX3N1YiA0LHIxLDIscjMKLQljbXBfbW92IDQscjEscjIscjMKLQljbXBfbW92IDQscjEsMixyMwotCWNtcF9hc3IgNCxyMSxyMixyMwotCWNtcF9hc3IgNCxyMSwyLHIzCi0JY21wX2xzciA0LHIxLHIyLHIzCi0JY21wX2xzciA0LHIxLDIscjMKLQljbXBfYXNsIDQscjEscjIscjMKLQljbXBfYXNsIDQscjEsMixyMwotCXN1Yl9hZGQgNCxyMSxyMixyMwotCXN1Yl9hZGQgNCxyMSwyLHIzCi0Jc3ViX3N1YiA0LHIxLHIyLHIzCi0Jc3ViX3N1YiA0LHIxLDIscjMKLQlzdWJfY21wIDQscjEscjIscjMKLQlzdWJfY21wIDQscjEsMixyMwotCXN1Yl9tb3YgNCxyMSxyMixyMwotCXN1Yl9tb3YgNCxyMSwyLHIzCi0Jc3ViX2FzciA0LHIxLHIyLHIzCi0Jc3ViX2FzciA0LHIxLDIscjMKLQlzdWJfbHNyIDQscjEscjIscjMKLQlzdWJfbHNyIDQscjEsMixyMwotCXN1Yl9hc2wgNCxyMSxyMixyMwotCXN1Yl9hc2wgNCxyMSwyLHIzCi0JbW92X2FkZCA0LHIxLHIyLHIzCi0JbW92X2FkZCA0LHIxLDIscjMKLQltb3Zfc3ViIDQscjEscjIscjMKLQltb3Zfc3ViIDQscjEsMixyMwotCW1vdl9jbXAgNCxyMSxyMixyMwotCW1vdl9jbXAgNCxyMSwyLHIzCi0JbW92X21vdiA0LHIxLHIyLHIzCi0JbW92X21vdiA0LHIxLDIscjMKLQltb3ZfYXNyIDQscjEscjIscjMKLQltb3ZfYXNyIDQscjEsMixyMwotCW1vdl9sc3IgNCxyMSxyMixyMwotCW1vdl9sc3IgNCxyMSwyLHIzCi0JbW92X2FzbCA0LHIxLHIyLHIzCi0JbW92X2FzbCA0LHIxLDIscjMKLQlhbmRfYWRkIHI0LHIxLHIyLHIzCi0JYW5kX2FkZCByNCxyMSwyLHIzCi0JYW5kX3N1YiByNCxyMSxyMixyMwotCWFuZF9zdWIgcjQscjEsMixyMwotCWFuZF9jbXAgcjQscjEscjIscjMKLQlhbmRfY21wIHI0LHIxLDIscjMKLQlhbmRfbW92IHI0LHIxLHIyLHIzCi0JYW5kX21vdiByNCxyMSwyLHIzCi0JYW5kX2FzciByNCxyMSxyMixyMwotCWFuZF9hc3IgcjQscjEsMixyMwotCWFuZF9sc3IgcjQscjEscjIscjMKLQlhbmRfbHNyIHI0LHIxLDIscjMKLQlhbmRfYXNsIHI0LHIxLHIyLHIzCi0JYW5kX2FzbCByNCxyMSwyLHIzCi0JZG1hY2hfYWRkIHI0LHIxLHIyLHIzCi0JZG1hY2hfYWRkIHI0LHIxLDIscjMKLQlkbWFjaF9zdWIgcjQscjEscjIscjMKLQlkbWFjaF9zdWIgcjQscjEsMixyMwotCWRtYWNoX2NtcCByNCxyMSxyMixyMwotCWRtYWNoX2NtcCByNCxyMSwyLHIzCi0JZG1hY2hfbW92IHI0LHIxLHIyLHIzCi0JZG1hY2hfbW92IHI0LHIxLDIscjMKLQlkbWFjaF9hc3IgcjQscjEscjIscjMKLQlkbWFjaF9hc3IgcjQscjEsMixyMwotCWRtYWNoX2xzciByNCxyMSxyMixyMwotCWRtYWNoX2xzciByNCxyMSwyLHIzCi0JZG1hY2hfYXNsIHI0LHIxLHIyLHIzCi0JZG1hY2hfYXNsIHI0LHIxLDIscjMKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM184LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYTk2ZDkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzgucworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLQkudGV4dAotCS5hbTMzCi0JeG9yX2FkZCByNCxyMSxyMixyMwotCXhvcl9hZGQgcjQscjEsMixyMwotCXhvcl9zdWIgcjQscjEscjIscjMKLQl4b3Jfc3ViIHI0LHIxLDIscjMKLQl4b3JfY21wIHI0LHIxLHIyLHIzCi0JeG9yX2NtcCByNCxyMSwyLHIzCi0JeG9yX21vdiByNCxyMSxyMixyMwotCXhvcl9tb3YgcjQscjEsMixyMwotCXhvcl9hc3IgcjQscjEscjIscjMKLQl4b3JfYXNyIHI0LHIxLDIscjMKLQl4b3JfbHNyIHI0LHIxLHIyLHIzCi0JeG9yX2xzciByNCxyMSwyLHIzCi0JeG9yX2FzbCByNCxyMSxyMixyMwotCXhvcl9hc2wgcjQscjEsMixyMwotCXN3aHdfYWRkIHI0LHIxLHIyLHIzCi0Jc3dod19hZGQgcjQscjEsMixyMwotCXN3aHdfc3ViIHI0LHIxLHIyLHIzCi0Jc3dod19zdWIgcjQscjEsMixyMwotCXN3aHdfY21wIHI0LHIxLHIyLHIzCi0Jc3dod19jbXAgcjQscjEsMixyMwotCXN3aHdfbW92IHI0LHIxLHIyLHIzCi0Jc3dod19tb3YgcjQscjEsMixyMwotCXN3aHdfYXNyIHI0LHIxLHIyLHIzCi0Jc3dod19hc3IgcjQscjEsMixyMwotCXN3aHdfbHNyIHI0LHIxLHIyLHIzCi0Jc3dod19sc3IgcjQscjEsMixyMwotCXN3aHdfYXNsIHI0LHIxLHIyLHIzCi0Jc3dod19hc2wgcjQscjEsMixyMwotCW9yX2FkZCByNCxyMSxyMixyMwotCW9yX2FkZCByNCxyMSwyLHIzCi0Jb3Jfc3ViIHI0LHIxLHIyLHIzCi0Jb3Jfc3ViIHI0LHIxLDIscjMKLQlvcl9jbXAgcjQscjEscjIscjMKLQlvcl9jbXAgcjQscjEsMixyMwotCW9yX21vdiByNCxyMSxyMixyMwotCW9yX21vdiByNCxyMSwyLHIzCi0Jb3JfYXNyIHI0LHIxLHIyLHIzCi0Jb3JfYXNyIHI0LHIxLDIscjMKLQlvcl9sc3IgcjQscjEscjIscjMKLQlvcl9sc3IgcjQscjEsMixyMwotCW9yX2FzbCByNCxyMSxyMixyMwotCW9yX2FzbCByNCxyMSwyLHIzCi0Jc2F0MTZfYWRkIHI0LHIxLHIyLHIzCi0Jc2F0MTZfYWRkIHI0LHIxLDIscjMKLQlzYXQxNl9zdWIgcjQscjEscjIscjMKLQlzYXQxNl9zdWIgcjQscjEsMixyMwotCXNhdDE2X2NtcCByNCxyMSxyMixyMwotCXNhdDE2X2NtcCByNCxyMSwyLHIzCi0Jc2F0MTZfbW92IHI0LHIxLHIyLHIzCi0Jc2F0MTZfbW92IHI0LHIxLDIscjMKLQlzYXQxNl9hc3IgcjQscjEscjIscjMKLQlzYXQxNl9hc3IgcjQscjEsMixyMwotCXNhdDE2X2xzciByNCxyMSxyMixyMwotCXNhdDE2X2xzciByNCxyMSwyLHIzCi0Jc2F0MTZfYXNsIHI0LHIxLHIyLHIzCi0Jc2F0MTZfYXNsIHI0LHIxLDIscjMKLQltb3ZfbGx0IChyMSssNCkscjIKLQltb3ZfbGd0IChyMSssNCkscjIKLQltb3ZfbGdlIChyMSssNCkscjIKLQltb3ZfbGxlIChyMSssNCkscjIKLQltb3ZfbGNzIChyMSssNCkscjIKLQltb3ZfbGhpIChyMSssNCkscjIKLQltb3ZfbGNjIChyMSssNCkscjIKLQltb3ZfbGxzIChyMSssNCkscjIKLQltb3ZfbGVxIChyMSssNCkscjIKLQltb3ZfbG5lIChyMSssNCkscjIKLQltb3ZfbHJhIChyMSssNCkscjIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzMmZmMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE3NDQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19hZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkLnM6IEFkZCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYxNkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYxN0VcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYxNTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IDI5MTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZBQzIwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGQ0MzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRkFEMjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE5IEZDRDNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRjhGRTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGQUZFMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRkNGRUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGMTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19iY2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmNjLnM6IEJjYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJjYy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEM4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEM5MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEMxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEMyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEMzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEMwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEM1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEM2MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEM3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEM0MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY4RTgwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRjhFOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGOEVBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFkIEY4RUIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgQ0EwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdC5zOiBiaXQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGOEVENDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEZBRUUwMDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGQ0VGRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkFGOTA4NDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDExIEZFMDJGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDEwMDQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjA4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRkFGMTA4NDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEZFMDBGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDEwMDQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjUgRjA5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRkFGNTA4NDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJiIEZFMDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIgKzAxMDA0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2NtcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjbXAuczogY21wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY21wLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQTZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMUFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMTlGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBCRVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEFGMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEZBQ0EwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGQ0M5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgQkYxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkFEQTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZDRDlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dC5zOiBleHQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMkQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiAxMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIDE3XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMUFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSAxRFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0ZW5kIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dGVuZC5zOiBleHRlbmRlZCBpbnN0cnVjdGlvbiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dGVuZC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1MDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY2RkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY5MDIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkIwMzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZEMDNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGNjE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGOTE2MTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZCMTcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGRDE3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEY2NEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY2NUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEY2NzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4RTI3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkFFM0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDRTNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGQUZDRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjIxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjhFNjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQUU3RkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkNFN0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGQUZERkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRkFFQkZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEZDRUJGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgRjIzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl5cW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAibG9vcC5zOiBsb29wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9vcC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ4XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBEMVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEQyXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDNcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBEMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEQ1XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRDZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEQ0XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgREFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBEQlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjEge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92MS5zOiBtb3YxIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92MS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDg2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjFEOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgOTlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiAzRVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEYyRjRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEYyRkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEYyRTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEYyRkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIDc2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjgwNjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGQTA2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRkMwNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCA1OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZiBGQUI1MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjMgRjJFN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YyLnM6IG1vdjIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkNCNUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYzMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMxMDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgRkNBNUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDExIEYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEY4MjYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRkEyNjAwMDEgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGQzI2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgNUQwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFCMTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEZDQjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjNBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRkFBMTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIEZDQTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjhGMTIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjMuczogbW92MyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjMucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjgxNjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGQTE2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRkMxNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIDQ2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEZBOTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGQzk1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjM1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDU4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZiBGQzg1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI1IEYwMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEY4MzYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRkEzNjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEZDMzZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgNDcyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92NCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Y0LnM6IG1vdjQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Y0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkE5NDAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEZDOTRGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGM0RBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGQTg0ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRkM4NEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY4RjUyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTkgODUwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgMkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGQ0NERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDk1MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IDI1MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRkNEREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZidSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZidS5zOiBtb3ZidSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmJ1LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjg0NjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGQTQ2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkM0NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY4QjkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFCOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZDQjlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNDI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSAzNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIxIEZDQTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjA1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRjg1NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQTU2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRkM1NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGODk2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM5IEZBOTYwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZCBGQzk2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQzIEY0NUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ1IDA2ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkM4NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZodSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZodS5zOiBtb3ZodSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmh1LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjA2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjg2NjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGQTY2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkM2NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY4QkQwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFCRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZDQkRGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNEE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSAzOTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIxIEZDQURGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjA3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRjg3NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQTc2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRkM3NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGODk3MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM5IEZBOTcwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZCBGQzk3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQzIEY0REFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ1IDA3ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkM4N0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdm0uczogbW92bSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdm0ucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDRTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDRUY4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDRjMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDRkY4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX211bGRpdiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtdWxkaXYuczogbXVsZGl2IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibXVsZGl2LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjI1QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjI2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjI3RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19vdGhlciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJvdGhlci5zOiBvdGhlciB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm90aGVyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSA0NFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDQ5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgNTNcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDQzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IERDRkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgQ0QwMDAxMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswOVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBEREZGRkYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMDMwMjBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGMEYyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGQUZGMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRkNGRkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBERjMwMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IERFMzAwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRjBGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjBGRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgQ0JcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMyBGMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGlmdC5zOiBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoaWZ0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjJCNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjhDQTA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMkFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGOEM3MDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYyOUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY4QzIwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgNTZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGMjg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGMjgyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdWIuczogc3ViIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3ViLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjEyQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjExRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjEzRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRkNDNkZGRkYgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGQ0Q1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb191ZGYge30gewotICAgIHNldCB0ZXN0bmFtZSAidWRmLnM6IHVkZiB0ZXN0cyBwYXJ0IDEiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJ1ZGYucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNjExXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNjIxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGNjMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGNjQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGNjUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGNjYxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGNjcxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNjgxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNjkxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNkExXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNkIxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGNkMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGNkQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNkUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGNkYxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGNTAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGNTExXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNTIxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGNTQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYSBGNTUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGNTYxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGNTcxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGNTgxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBGNTkxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGNUExXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGNUIxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGNUMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYSBGNUQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBGNUUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZSBGNUYxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGOTAxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQzIEY5MTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDYgRjkyMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OSBGOTMxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEY5NDE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGYgRjk1MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MiBGOTYxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU1IEY5NzE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRjk4MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YiBGOTkxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVlIEY5QTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjEgRjlCMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGOUMxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY3IEY5RDE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmEgRjlFMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2ZCBGOUYxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEZCMDFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBGQjExRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRkIyMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEZCMzFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBGQjQxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRkI1MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEZCNjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBGQjcxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRkI4MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEZCOTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBGQkExRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRkJCMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEZCQzFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBGQkQxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRkJFMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEZCRjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBGRDAxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY2ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI2IEZEMTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNjcgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRkQyMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2OCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMiBGRDMxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY5ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEZENDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzAgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2UgRkQ1MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3MSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBGRDYxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcyICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRhIEZENzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzMgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRkQ4MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3NCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNiBGRDkxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc1ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEZEQTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzYgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjIgRkRCMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3NyArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBGREMxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc4ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZlIEZERDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzkgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgRkRFMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4MCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYSBGREYxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzgxICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIEY5MDU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTMgRjkxNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNiBGOTI1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE5IEY5MzU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgRjk0NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExZiBGOTU1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIyIEY5NjU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjUgRjk3NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCBGOTg1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJiIEY5OTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmUgRjlBNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMSBGOUI1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IEY5QzU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzcgRjlENTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYSBGOUU1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNkIEY5RjU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgRkIwNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IEZCMTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCBGQjI1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgRkIzNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIEZCNDUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCBGQjU1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggRkI2NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIEZCNzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCBGQjg1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgRkI5NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IEZCQTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyBGQkI1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgRkJDNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IEZCRDUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCBGQkU1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgRkJGNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIEZEMDUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE0ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODYgRkQxNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTUgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4YyBGRDI1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNiArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTkyIEZEMzUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE3ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTggRkQ0NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTggKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5ZSBGRDU1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExOSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IEZENjUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIwICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWEgRkQ3NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjEgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiMCBGRDg1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMiArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI2IEZEOTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIzICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYmMgRkRBNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjQgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMiBGREI1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyNSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IEZEQzUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI2ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxY2UgRkRENTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjcgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkNCBGREU1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyOCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWRhIEZERjUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI5ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTYwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FtMzNfMSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbTMzLnM6IGFtMzMgdGVzdHMgcGFydCAxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYW0zMy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIENEMDAwMTM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMyArMDlcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgQ0QwMDAxMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswOVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBDRDAwMDEzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzA5XFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIENEMDAwMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDlcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRERGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMDM0MDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBEREZGRkYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAwMzIwOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIERERkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDAzMTA5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRERGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDBGRjA5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgQ0UzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgQ0UzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgQ0UzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgQ0VGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggQ0YzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2EgQ0YzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgQ0YzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2UgQ0ZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRjhDRTM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGOENFMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ2IEY4Q0UzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDkgRjhDRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGOENGMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRmIEY4Q0YzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTIgRjhDRjMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NSBGOENGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEYwMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVhIEYwMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEYwMkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVlIEYwMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEYwMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYyIEYwMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEYwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY2IEYwRTRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEYyRUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZhIEYyRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEY1MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZlIEY1NjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEY1OTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcyIEY1REZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEY2MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc2IEY2NjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY2QzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdhIEY2RDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEZDRkMwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDUgKzAyMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MiBGQ0ZERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ2ICswMDAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM18yIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfMi5zOiBhbTMzIHRlc3RzIHBhcnQgMiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfMi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY5MDgwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjkxODIyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGOTI4MzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEY5Mzg0NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjk0ODY3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOTU4NzhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY5Njg5OVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjk3OEFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGOTg4Q0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIEY5OThFRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRjlBOEZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGOUI4RERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY5QzhDQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjlEOEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYSBGOUU4MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJkIEY5RjgxMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjkwOTAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMyBGOTE5MjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY5Mjk0NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzkgRjkzOTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBGOTQ5NzhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNmIEY5NTk5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDIgRjk2OUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSBGOTc5RERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEY5ODlFRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGIgRjk5OUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0ZSBGOUE5MTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUxIEY5QjkzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRjlDOTU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NyBGOUQ5NzhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVhIEY5MEEyMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWQgRjkxQTM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBGOTJBNjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYzIEY5M0E3OFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjYgRjk0QUE5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OSBGOTVBQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEY5NkEyMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmYgRjk3QTM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MiBGOThBNTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc1IEY5OUE2MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRjlBQTcwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YiBGOUJBODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdlIEY5Q0E5MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODEgRjlEQUEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBGOUVBNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg3IEY5RkE4OVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGEgRjkwQjEyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4ZCBGOTFCMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEY5MkI1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTMgRjkzQjc4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NiBGOTRCOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk5IEY5NUJCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRjk2QkRFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5ZiBGOTdCRkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEyIEY5OEJEQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTUgRjk5QkJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBGOUFCOThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFiIEY5QkI3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWUgRjlDQjU0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMSBGOURCMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEY5RUIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjcgRjlGQjEyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hbTMzXzMge30gewotICAgIHNldCB0ZXN0bmFtZSAiYW0zM18zLnM6IGFtMzMgdGVzdHMgcGFydCAzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYW0zM18zLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkIwODExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEZCMTgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGQjc4MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRkI4ODExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEZCOTgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGQkE4MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkJEODExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZCRjgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGQjA5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRkIxOTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEZCMjkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQjQ5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRkI1OTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEZCNjkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGQkE5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRkJCOTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEZCRTkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBGQjBBMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkIxQTIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEZCMkEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBGQjNBMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRkI0QTIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEZCNUEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBGQjhBMjAxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRkI5QTIwMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEZCQUEyMDEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBGQkJBMjAxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRkJDQTIwMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEZCREEyMDEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBGQjBCMTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRkIxQjExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEZCMkIxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBGQjNCMTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRkI0QjExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEZCNUIxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBGQkJCMTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRkI3QzEyMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEZCNkEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBGQjdBMTIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRkJFQTIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEZCRkExMjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hbTMzXzQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYW0zM180LnM6IGFtMzMgdGVzdHMgcGFydCA0IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYW0zM180LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkQwODIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRkQxODIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRkQ3ODIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkQ4ODIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkQ5ODIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRkRBODIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRkREODIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRkRGODIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZEMDkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGRDE5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRkQyOTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQyIEZENDkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTQgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGRDU5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGUgRkQ2OTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEZEQTkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTcgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YSBGREI5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE4ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRkRFOTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY2IEZEMEEyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjAgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBGRDFBMjFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIxICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzIgRkQyQTIxRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEZEM0EyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjMgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3ZSBGRDRBMjFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI0ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRkQ1QTIxRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhhIEZEOEEyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjYgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBGRDlBMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI3ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTYgRkRBQTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyOCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEZEQkEyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjkgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMiBGRENBMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMwICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRkREQTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFlIEZEMEIyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzIgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBGRDFCMjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMzICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmEgRkQyQjIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEZEM0IyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzUgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNiBGRDRCMjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM2ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRkQ1QjIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQyIEZEMEUyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzggK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCBGRDFFMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM5ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGUgRkQyRTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEZEM0UyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDEgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYSBGRDRFMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQyICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRkQ1RTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY2IEZENkEyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDQgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBGRDdBMTJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ1ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDIgRkRFQTIxRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEZERkExMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDcgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hbTMzXzUge30gewotICAgIHNldCB0ZXN0bmFtZSAiYW0zM181LnM6IGFtMzMgdGVzdHMgcGFydCA1IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYW0zM181LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkUwODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGRTE4MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEZFNzgyMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRkU4ODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGRTk4MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIzIEZFQTgyMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRkVEODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMSBGRUY4MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGRTA5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZiBGRTE5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NiBGRTI5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEzICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0ZCBGRTQ5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBGRTU5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YiBGRTY5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE2ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MiBGRUE5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE3ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OSBGRUI5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE4ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGRUU5MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE5ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NyBGRTBBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIwICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3ZSBGRTFBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIxICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NSBGRTJBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIyICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBGRTNBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIzICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MyBGRTRBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI0ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YSBGRTVBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI1ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMSBGRThBMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI2ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBGRTlBMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI3ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhZiBGRUFBMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI4ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNiBGRUJBMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI5ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiZCBGRUNBMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMwICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBGRURBMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMxICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYiBGRTBCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMyICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMiBGRTFCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMzICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOSBGRTJCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM0ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBGRTNCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM1ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNyBGRTRCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM2ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlZSBGRTVCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM3ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNSBGRTZCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM4ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBGRTdCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM5ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMyBGRThCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQwICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYSBGRTlCMjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQxICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMSBGRTBFMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQyICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCBGRTFFMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQzICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExZiBGRTJFMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ0ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNiBGRTNFMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ1ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyZCBGRTRFMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ2ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCBGRTVFMjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ3ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYiBGQkFEQ0Q4OVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2YgRkJCRENEODlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQzIEZFNkEyMUZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNTAgK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRhIEZFN0ExMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNTEgK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUxIEZFRUEyMUZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNTIgK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IEZFRkExMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNTMgK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEwMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hbTMzXzYge30gewotICAgIHNldCB0ZXN0bmFtZSAiYW0zM182LnM6IGFtMzMgdGVzdHMgcGFydCA2IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYW0zM182LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjcwMDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY3MTA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGNzIwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjczMDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY3NDA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNzUwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjc2MDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY3NzA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGNzgwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjc5MDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEY3QTA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGN0IwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjdDMDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEY3RDA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGNzAxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjcxMTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEY3MjE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBGNzMxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRjc2MTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEY3NzE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBGNzgxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRjc5MTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEY3QTE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBGN0IxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRjdDMTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEY3RDE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBGNzAyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRjcxMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEY3MjI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBGNzMyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRjc0MjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEY3NTI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBGNzYyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRjc3MjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEY3ODI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBGNzkyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRjdBMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEY3QjI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBGN0MyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRjdEMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEY3MDM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBGNzEzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRjcyMzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEY3MzM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBGNzQzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRjc1MzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEY3NjM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBGNzczNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRjc4MzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEY3OTM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBGN0EzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRjdCMzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEY3QzM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBGN0QzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRjcwNDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEY3MTQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBGNzI0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgRjczNDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEY3NDQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBGNzU0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRjc2NDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEY3NzQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBGNzg0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRjc5NDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIEY3QTQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCBGN0I0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggRjdDNDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIEY3RDQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hbTMzXzcge30gewotICAgIHNldCB0ZXN0bmFtZSAiYW0zM183LnM6IGFtMzMgdGVzdHMgcGFydCA3IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYW0zM183LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjcwNTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY3MTU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGNzI1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjczNTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY3NjU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNzc1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjc4NTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY3OTU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGN0E1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjdCNTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEY3QzU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGN0Q1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjcwNjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEY3MTY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGNzI2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjczNjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEY3NDY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBGNzU2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRjc2NjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEY3NzY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBGNzg2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRjc5NjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEY3QTY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBGN0I2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRjdDNjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEY3RDY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBGNzA3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRjcxNzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEY3Mjc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBGNzM3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRjc0NzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEY3NTc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBGNzY3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRjc3NzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEY3ODc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBGNzk3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRjdBNzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEY3Qjc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBGN0M3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRjdENzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEY3MDg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBGNzE4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRjcyODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEY3Mzg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBGNzQ4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRjc1ODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEY3Njg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBGNzc4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRjc4ODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEY3OTg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBGN0E4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRjdCODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEY3Qzg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBGN0Q4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRjcwOTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEY3MTk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBGNzI5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgRjczOTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEY3NDk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBGNzU5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRjc2OTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEY3Nzk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBGNzg5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRjc5OTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIEY3QTk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCBGN0I5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggRjdDOTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIEY3RDk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hbTMzXzgge30gewotICAgIHNldCB0ZXN0bmFtZSAiYW0zM184LnM6IGFtMzMgdGVzdHMgcGFydCA4IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYW0zM184LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjcwQTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY3MUE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGNzJBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjczQTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY3NEE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNzVBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjc2QTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY3N0E0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGNzhBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjc5QTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEY3QUE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGN0JBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjdDQTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEY3REE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGNzBCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjcxQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEY3MkI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBGNzNCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRjc0QjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEY3NUI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBGNzZCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRjc3QjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEY3OEI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBGNzlCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRjdBQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEY3QkI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBGN0NCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRjdEQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEY3MEM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBGNzFDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRjcyQzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEY3M0M0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBGNzRDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRjc1QzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEY3NkM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBGNzdDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRjc4QzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEY3OUM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBGN0FDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRjdCQzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEY3Q0M0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBGN0RDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRjcwRDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEY3MUQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBGNzJENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRjczRDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEY3NEQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBGNzVENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRjc2RDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEY3N0Q0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBGNzhENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRjc5RDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEY3QUQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBGN0JENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRjdDRDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEY3REQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBGN0UwMjE0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgRjdFMDIxNDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEY3RTAyMTQyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBGN0UwMjE0M1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRjdFMDIxNDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEY3RTAyMTQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBGN0UwMjE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRjdFMDIxNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIEY3RTAyMTQ4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCBGN0UwMjE0OVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggRjdFMDIxNEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTY3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0KLWlmIFtpc3RhcmdldCBtbjEwMzAwKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgotICAgIGRvX2FkZAotICAgIGRvX2JjYwotICAgIGRvX2JpdAotICAgIGRvX2NtcAotICAgIGRvX2V4dAotICAgIGRvX2V4dGVuZAotICAgIGRvX2xvZ2ljYWwKLSAgICBkb19sb29wCi0gICAgZG9fbW92MQotICAgIGRvX21vdjIKLSAgICBkb19tb3YzCi0gICAgZG9fbW92NAotICAgIGRvX21vdmJ1Ci0gICAgZG9fbW92aHUKLSAgICBkb19tb3ZtCi0gICAgZG9fbXVsZGl2Ci0gICAgZG9fb3RoZXIKLSAgICBkb19zaGlmdAotICAgIGRvX3N1YgotICAgIGRvX3VkZgotICAgIGRvX2FtMzNfMQotICAgIGRvX2FtMzNfMgotICAgIGRvX2FtMzNfMwotICAgIGRvX2FtMzNfNAotICAgIGRvX2FtMzNfNQotICAgIGRvX2FtMzNfNgotICAgIGRvX2FtMzNfNwotICAgIGRvX2FtMzNfOAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTJkY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iY2MucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQkudGV4dAotZm9vOgotCWJlcSBmb28KLQlibmUgZm9vCi0JYmd0IGZvbwotCWJnZSBmb28KLQlibGUgZm9vCi0JYmx0IGZvbwotCWJoaSBmb28KLQliY2MgZm9vCi0JYmxzIGZvbwkKLQliY3MgZm9vCi0JYnZjIGZvbwotCWJ2cyBmb28KLQlibmMgZm9vCi0JYm5zIGZvbwotCWJyYSBmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JpdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWM1NTE5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLnRleHQKLQlidHN0IDY0LGQxCi0JYnRzdCA4MTkyLGQyCi0JYnRzdCAxMzEwNzEsZDMKLQlidHN0IDY0LCg4LGExKQotCWJ0c3QgNjQsKDEzMTA3MSkKLQlic2V0IGQxLChhMikKLQlic2V0IDY0LCg4LGExKQotCWJzZXQgNjQsKDEzMTA3MSkKLQliY2xyIGQxLChhMikKLQliY2xyIDY0LCg4LGExKQotCWJjbHIgNjQsKDEzMTA3MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvY21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2NtcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjhhNzFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvY21wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLnRleHQKLQljbXAgZDEsZDIKLQljbXAgZDIsYTMKLQljbXAgYTMsZDMKLQljbXAgYTMsYTIKLQljbXAgMTYsZDMKLQljbXAgMjU2LGQyCi0JY21wIDEzMTA3MSxkMQotCWNtcCAxNixhMwotCWNtcCAyNTYsYTIKLQljbXAgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlMmU3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQlleHQgZDEKLQlleHRiIGQyCi0JZXh0YnUgZDMKLQlleHRoIGQyCi0JZXh0aHUgZDEKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0ZW5kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dGVuZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQwNWI3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0ZW5kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLQlwdXR4IGQxCi0JZ2V0eCBkMgotCW11bHEgZDEsZDIKLQltdWxxIDE2LGQyCi0JbXVscSAyNTYsZDMKLQltdWxxIDEzMTA3MSxkMwotCW11bHF1IGQxLGQyCi0JbXVscXUgMTYsZDIKLQltdWxxdSAyNTYsZDMKLQltdWxxdSAxMzEwNzEsZDMKLQlzYXQxNiBkMixkMwotCXNhdDI0IGQzLGQyCi0JYnNjaCBkMSxkMgotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvZ2ljYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5NzZkYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvZ2ljYWwucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotCWFuZCBkMSxkMgotCWFuZCAxMjcsZDIKLQlhbmQgMzI3NjcsZDMKLQlhbmQgMTMxMDcxLGQzCi0JYW5kIDMyNzY3LHBzdwotCW9yIGQxLGQyCi0Jb3IgMTI3LGQyCi0Jb3IgMzI3NjcsZDMKLQlvciAxMzEwNzEsZDMKLQlvciAzMjc2Nyxwc3cKLQl4b3IgZDEsZDIKLQl4b3IgMzI3NjcsZDMKLQl4b3IgMTMxMDcxLGQzCi0Jbm90IGQzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9vcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTE4MjA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9vcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0JbGVxCi0JbG5lCi0JbGd0Ci0JbGdlCi0JbGxlCi0JbGx0Ci0JbGhpCi0JbGNjCi0JbGxzCQotCWxjcwotCWxyYQotCXNldGxiCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NGNjNTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0JLnRleHQKLQltb3YgZDEsZDIKLQltb3YgZDEsYTIKLQltb3YgYTIsZDEKLQltb3YgYTIsYTEKLQltb3Ygc3AsYTIKLQltb3YgYTEsc3AKLQltb3YgZDIscHN3Ci0JbW92IG1kcixkMQotCW1vdiBkMixtZHIKLQltb3YgKGEyKSxkMQotCW1vdiAoOCxhMiksZDEKLQltb3YgKDI1NixhMiksZDEKLQltb3YgKDEzMTA3MSxhMiksZDEKLQltb3YgKDgsc3ApLGQxCi0JbW92ICgyNTYsc3ApLGQxCi0JbW92IHBzdyxkMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkMWVkYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLnRleHQKLSAgICAgICAgbW92ICgxMzEwNzEsc3ApLGQxCi0JbW92IChkMSxhMSksZDIKLQltb3YgKDMyNzY4KSxkMQotCW1vdiAoMTMxMDcxKSxkMQotCW1vdiAoYTIpLGExCi0JbW92ICg4LGEyKSxhMQotCW1vdiAoMjU2LGEyKSxhMQotCW1vdiAoMTMxMDcxLGEyKSxhMQotCW1vdiAoOCxzcCksYTEKLQltb3YgKDI1NixzcCksYTEKLQltb3YgKDEzMTA3MSxzcCksYTEKLQltb3YgKGQxLGExKSxhMgotICAgICAgICBtb3YgKDMyNzY4KSxhMQotICAgICAgICBtb3YgKDEzMTA3MSksYTEKLSAgICAgICAgbW92ICgzMixhMSksc3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWMwYjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLnRleHQKLSAgICAgICAgbW92IGQxLChhMikKLSAgICAgICAgbW92IGQxLCgzMixhMikKLQltb3YgZDEsKDI1NixhMikKLQltb3YgZDEsKDEzMTA3MSxhMikKLQltb3YgZDEsKDMyLHNwKQotCW1vdiBkMSwoMzI3Njgsc3ApCi0JbW92IGQxLCgxMzEwNzEsc3ApCi0JbW92IGQxLChkMixhMikKLQltb3YgZDEsKDEyOCkKLQltb3YgZDEsKDEzMTA3MSkKLQltb3YgYTEsKGEyKQotCW1vdiBhMSwoMzIsYTIpCi0JbW92IGExLCgyNTYsYTIpCi0JbW92IGExLCgxMzEwNzEsYTIpCi0JbW92IGExLCgzMixzcCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3Y0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZDY5YzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3Y0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLQltb3YgYTEsKDMyNzY4LHNwKQotCW1vdiBhMSwoMTMxMDcxLHNwKQotCW1vdiBhMSwoZDIsYTIpCi0JbW92IGExLCgxMjgpCi0JbW92IGExLCgxMzEwNzEpCi0JbW92IHNwLCgzMixhMSkKLQltb3YgOCxkMQotCW1vdiAyNTYsZDEKLQltb3YgMTMxMDcxLGQxCi0JbW92IDgsYTEKLQltb3YgMjU2LGExCi0JbW92IDEzMTA3MSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZidS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZidS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmRiN2JlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkudGV4dAotCW1vdmJ1IChhMiksZDEKLQltb3ZidSAoOCxhMiksZDEKLQltb3ZidSAoMjU2LGEyKSxkMQotCW1vdmJ1ICgxMzEwNzEsYTIpLGQxCi0JbW92YnUgKDgsc3ApLGQxCi0JbW92YnUgKDI1NixzcCksZDEKLQltb3ZidSAoMTMxMDcxLHNwKSxkMQotCW1vdmJ1IChkMSxhMSksZDIKLQltb3ZidSAoMzI3NjgpLGQxCi0JbW92YnUgKDEzMTA3MSksZDEKLQltb3ZidSBkMSwoYTIpCi0JbW92YnUgZDEsKDMyLGEyKQotCW1vdmJ1IGQxLCgyNTYsYTIpCi0JbW92YnUgZDEsKDEzMTA3MSxhMikKLQltb3ZidSBkMSwoMzIsc3ApCi0JbW92YnUgZDEsKDMyNzY4LHNwKQotCW1vdmJ1IGQxLCgxMzEwNzEsc3ApCi0JbW92YnUgZDEsKGQyLGEyKQotCW1vdmJ1IGQxLCgxMjgpCi0JbW92YnUgZDEsKDEzMTA3MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92aHUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92aHUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzN2U4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmh1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLnRleHQKLQltb3ZodSAoYTIpLGQxCi0JbW92aHUgKDgsYTIpLGQxCi0JbW92aHUgKDI1NixhMiksZDEKLQltb3ZodSAoMTMxMDcxLGEyKSxkMQotCW1vdmh1ICg4LHNwKSxkMQotCW1vdmh1ICgyNTYsc3ApLGQxCi0JbW92aHUgKDEzMTA3MSxzcCksZDEKLQltb3ZodSAoZDEsYTEpLGQyCi0JbW92aHUgKDMyNzY4KSxkMQotCW1vdmh1ICgxMzEwNzEpLGQxCi0JbW92aHUgZDEsKGEyKQotCW1vdmh1IGQxLCgzMixhMikKLQltb3ZodSBkMSwoMjU2LGEyKQotCW1vdmh1IGQxLCgxMzEwNzEsYTIpCi0JbW92aHUgZDEsKDMyLHNwKQotCW1vdmh1IGQxLCgzMjc2OCxzcCkKLQltb3ZodSBkMSwoMTMxMDcxLHNwKQotCW1vdmh1IGQxLChkMixhMikKLQltb3ZodSBkMSwoMTI4KQotCW1vdmh1IGQxLCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdm0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92bS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2ZjNjgzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92bS5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQltb3ZtIChzcCksW2EyLGEzXQotCW1vdm0gKHNwKSxbZDIsZDMsYTIsYTMsb3RoZXJdCi0JbW92bSBbYTIsYTNdLChzcCkKLQltb3ZtIFtkMixkMyxhMixhMyxvdGhlcl0sKHNwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tdWxkaXYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbXVsZGl2LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMTFlNWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tdWxkaXYucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JbXVsIGQxLGQyCi0JbXVsdSBkMixkMwotCWRpdiBkMyxkMwotCWRpdnUgZDMsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvb3RoZXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvb3RoZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhZjc0YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL290aGVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLnRleHQKLQljbHIgZDIKLQlpbmMgZDEKLQlpbmMgYTIKLQlpbmM0IGEzCi0Jam1wIChhMikKLQlqbXAgMjU2Ci0Jam1wIDEzMTA3MQotCWNhbGwgMjU2LFthMixhM10sOQotCWNhbGwgMTMxMDcxLFthMixhM10sMzIKLQljYWxscyAoYTIpCi0JY2FsbHMgMjU2Ci0JY2FsbHMgMTMxMDcxCi0JcmV0IFthMixhM10sNwotCXJldGYgW2EyLGEzXSw1Ci0JcmV0cwotCXJ0aQotCXRyYXAKLQlub3AKLQlydG0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc2hpZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4YzljZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3NoaWZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQlhc3IgZDEsZDIKLQlhc3IgNCxkMgotCWxzciBkMixkMwotCWxzciA0LGQzCi0JYXNsIGQzLGQyCi0JYXNsIDQsZDIKLQlhc2wyIGQyCi0Jcm9yIGQxCi0Jcm9sIGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3N1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkYzY2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3N1Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQlzdWIgZDEsZDIKLQlzdWIgZDIsYTMKLQlzdWIgYTMsZDMKLQlzdWIgYTMsYTIKLQlzdWIgMTMxMDcxLGQyCi0Jc3ViIDEzMTA3MSxhMQotCXN1YmMgZDEsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvdWRmLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NiZDEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvdWRmLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotCS50ZXh0Ci0JdWRmMDAgZDAsZDEKLQl1ZGYwMSBkMCxkMQotCXVkZjAyIGQwLGQxCi0JdWRmMDMgZDAsZDEKLQl1ZGYwNCBkMCxkMQotCXVkZjA1IGQwLGQxCi0JdWRmMDYgZDAsZDEKLQl1ZGYwNyBkMCxkMQotCXVkZjA4IGQwLGQxCi0JdWRmMDkgZDAsZDEKLQl1ZGYxMCBkMCxkMQotCXVkZjExIGQwLGQxCi0JdWRmMTIgZDAsZDEKLQl1ZGYxMyBkMCxkMQotCXVkZjE0IGQwLGQxCi0JdWRmMTUgZDAsZDEKLQl1ZGYyMCBkMCxkMQotCXVkZjIxIGQwLGQxCi0JdWRmMjIgZDAsZDEKLQl1ZGYyMyBkMCxkMQotCXVkZjI0IGQwLGQxCi0JdWRmMjUgZDAsZDEKLQl1ZGYyNiBkMCxkMQotCXVkZjI3IGQwLGQxCi0JdWRmMjggZDAsZDEKLQl1ZGYyOSBkMCxkMQotCXVkZjMwIGQwLGQxCi0JdWRmMzEgZDAsZDEKLQl1ZGYzMiBkMCxkMQotCXVkZjMzIGQwLGQxCi0JdWRmMzQgZDAsZDEKLQl1ZGYzNSBkMCxkMQotCXVkZjAwIDEyNyxkMQotCXVkZjAxIDEyNyxkMQotCXVkZjAyIDEyNyxkMQotCXVkZjAzIDEyNyxkMQotCXVkZjA0IDEyNyxkMQotCXVkZjA1IDEyNyxkMQotCXVkZjA2IDEyNyxkMQotCXVkZjA3IDEyNyxkMQotCXVkZjA4IDEyNyxkMQotCXVkZjA5IDEyNyxkMQotCXVkZjEwIDEyNyxkMQotCXVkZjExIDEyNyxkMQotCXVkZjEyIDEyNyxkMQotCXVkZjEzIDEyNyxkMQotCXVkZjE0IDEyNyxkMQotCXVkZjE1IDEyNyxkMQotCXVkZjAwIDMyNzY3LGQxCi0JdWRmMDEgMzI3NjcsZDEKLQl1ZGYwMiAzMjc2NyxkMQotCXVkZjAzIDMyNzY3LGQxCi0JdWRmMDQgMzI3NjcsZDEKLQl1ZGYwNSAzMjc2NyxkMQotCXVkZjA2IDMyNzY3LGQxCi0JdWRmMDcgMzI3NjcsZDEKLQl1ZGYwOCAzMjc2NyxkMQotCXVkZjA5IDMyNzY3LGQxCi0JdWRmMTAgMzI3NjcsZDEKLQl1ZGYxMSAzMjc2NyxkMQotCXVkZjEyIDMyNzY3LGQxCi0JdWRmMTMgMzI3NjcsZDEKLQl1ZGYxNCAzMjc2NyxkMQotCXVkZjE1IDMyNzY3LGQxCi0JdWRmMDAgNjU1MzUsZDEKLQl1ZGYwMSA2NTUzNSxkMQotCXVkZjAyIDY1NTM1LGQxCi0JdWRmMDMgNjU1MzUsZDEKLQl1ZGYwNCA2NTUzNSxkMQotCXVkZjA1IDY1NTM1LGQxCi0JdWRmMDYgNjU1MzUsZDEKLQl1ZGYwNyA2NTUzNSxkMQotCXVkZjA4IDY1NTM1LGQxCi0JdWRmMDkgNjU1MzUsZDEKLQl1ZGYxMCA2NTUzNSxkMQotCXVkZjExIDY1NTM1LGQxCi0JdWRmMTIgNjU1MzUsZDEKLQl1ZGYxMyA2NTUzNSxkMQotCXVkZjE0IDY1NTM1LGQxCi0JdWRmMTUgNjU1MzUsZDEKLQl1ZGZ1MDAgMTI4LGQxCi0JdWRmdTAxIDEyOCxkMQotCXVkZnUwMiAxMjgsZDEKLQl1ZGZ1MDMgMTI4LGQxCi0JdWRmdTA0IDEyOCxkMQotCXVkZnUwNSAxMjgsZDEKLQl1ZGZ1MDYgMTI4LGQxCi0JdWRmdTA3IDEyOCxkMQotCXVkZnUwOCAxMjgsZDEKLQl1ZGZ1MDkgMTI4LGQxCi0JdWRmdTEwIDEyOCxkMQotCXVkZnUxMSAxMjgsZDEKLQl1ZGZ1MTIgMTI4LGQxCi0JdWRmdTEzIDEyOCxkMQotCXVkZnUxNCAxMjgsZDEKLQl1ZGZ1MTUgMTI4LGQxCi0JdWRmdTAwIDMyNzY4LGQxCi0JdWRmdTAxIDMyNzY4LGQxCi0JdWRmdTAyIDMyNzY4LGQxCi0JdWRmdTAzIDMyNzY4LGQxCi0JdWRmdTA0IDMyNzY4LGQxCi0JdWRmdTA1IDMyNzY4LGQxCi0JdWRmdTA2IDMyNzY4LGQxCi0JdWRmdTA3IDMyNzY4LGQxCi0JdWRmdTA4IDMyNzY4LGQxCi0JdWRmdTA5IDMyNzY4LGQxCi0JdWRmdTEwIDMyNzY4LGQxCi0JdWRmdTExIDMyNzY4LGQxCi0JdWRmdTEyIDMyNzY4LGQxCi0JdWRmdTEzIDMyNzY4LGQxCi0JdWRmdTE0IDMyNzY4LGQxCi0JdWRmdTE1IDMyNzY4LGQxCi0JdWRmdTAwIDY1NTM2LGQxCi0JdWRmdTAxIDY1NTM2LGQxCi0JdWRmdTAyIDY1NTM2LGQxCi0JdWRmdTAzIDY1NTM2LGQxCi0JdWRmdTA0IDY1NTM2LGQxCi0JdWRmdTA1IDY1NTM2LGQxCi0JdWRmdTA2IDY1NTM2LGQxCi0JdWRmdTA3IDY1NTM2LGQxCi0JdWRmdTA4IDY1NTM2LGQxCi0JdWRmdTA5IDY1NTM2LGQxCi0JdWRmdTEwIDY1NTM2LGQxCi0JdWRmdTExIDY1NTM2LGQxCi0JdWRmdTEyIDY1NTM2LGQxCi0JdWRmdTEzIDY1NTM2LGQxCi0JdWRmdTE0IDY1NTM2LGQxCi0JdWRmdTE1IDY1NTM2LGQxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1ZjRiNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5kCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jb2JqY29weTogLU8gc3JlYwotI25hbWU6IE1SSSBjaGFyYWN0ZXIgY29uc3RhbnRzCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgY2hhcmFjdGVyIGNvbnN0YW50cwotCi1TMC4qCi1TMTEzLi4uLig2MTYxNjI2MzYxNjI2MzY0NjUwMDAwMDA2MTI3NjIwMCl8KDYxNjE2MjYzNjQ2MzYyNjEwMDAwMDA2NTAwNjIyNzYxKS4qCi0jcGFzcwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMGE4M2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotOyBUZXN0IE1SSSBzdHlsZSBjaGFyYWN0ZXIgY29uc3RhbnRzLgotCi0JZGMuYgknYScKLQlkYy5iCSdhYmMnCi0JZGMubAknYWJjZGUnCi0JZGMubAknYScnYicKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQzNGRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LmQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBjb21tZW50cwotI2FzOiAtTQotCi0jIFRlc3QgTVJJIGNvbW1lbnRzCi0KLTArMDIgQSBSQU0KLTArMDEgQSBST00KLSAqIFUgbGFiZWwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTczMThmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JeHJlZiBsYWJlbAotCXhkZWYJUk9NLFJBTQotCSogdGhpcyBpcyBhIGNvbW1lbnQKLQotCWRjLmwJbGFiZWwJbG9vcCBpZiB3ZSBoYXZlbid0IHJlYWNoIGVuZCB5ZXQKLQkKLVJPTQkJCQlFUVUJJDAwMDAwMDAxCSogd29yZCB3aWRlCi1SQU0JCQkJRVFVCSQwMDAwMDAwMgl3b3JkIHdpZGUKLQlkYy5sCVJBTQotCWRjLmwJMAkscmVhbGx5LGEsY29tbWVudAotOyBhIGNvbW1lbnQKLSA7IGFub3RoZXIgY29tbWVudAotICA7IGFub3RoZXIgY29tbWVudApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWMxNTMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIGNvbW1vbiBzZWN0aW9ucwotI2FzOiAtTQotCi0jIFRlc3QgTVJJIGNvbW1vbiBzZWN0aW9ucwotCi0wKzA4IEMgMDBjb20yCi0wKzA4IEMgY29tMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM1YzZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24ucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTsgVGVzdCBNUkkgY29tbW9uIHNlY3Rpb25zCi0JY29tbW9uCWNvbTEKLQlkcy5sCTEKLWNvbTIJY29tbW9uIDAwCi0JZHMubAkxCi1pbmNvbQlkcy5sCTEKLQljb21tb24JY29tMQotCWRzLmwJMQotCWRhdGEKLQlkYy5sCWNvbTEKLQlkYy5sCWluY29tCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTAwMjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIGNvbnN0YW50cwotI2FzOiAtTQotCi0jIFRlc3QgTVJJIHN0eWxlIGNvbnN0YW50cwotCi0wKjAgVCBmb28KLTAqYSBBIHMwMQotMCphIEEgczAyCi0wKmEgQSBzMDMKLTAqYSBBIHMwNAotMCphIEEgczA1Ci0wKmEgQSBzMDYKLTAqYSBBIHMwNwotMCphIEEgczA4Ci0wKmEgQSBzMDkKLTAqNjEgQSBzMTAKLTAqNjEgQSBzMTEKLTAqNjE2MjYzNjQgQSBzMTIKLTAqNjEyNzYyMDAgQSBzMTMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNGU2Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0JeGRlZglzMDEsczAyLHMwMyxzMDQsczA1LHMwNixzMDcsczA4LHMwOSxzMTAsczExLHMxMixzMTMKLXMwMQllcXUJJTEwMTAKLXMwMgllcXUJMTAxMGIKLXMwMwllcXUJQDEyCi1zMDQJZXF1CTEybwotczA1CWVxdQkxMnEKLXMwNgllcXUJMTAKLXMwNwllcXUJMTBkCi1zMDgJZXF1CSRhCi1zMDkJZXF1CTBhaAotczEwCWVxdQknYScKLXMxMQllcXUJQSdhJwotczEyCWVxdQknYWJjZCcKLXMxMwllcXUJJ2EnJ2InCi0KLQl4ZGVmCWZvbwotZm9vCi0JbW92ZXEubAkjJTEwMTAsZDAKLQltb3ZlcS5sCSMxMDEwYixkMAotCW1vdmVxLmwJI0AxMixkMAotCW1vdmVxLmwJIzEybyxkMAotCW1vdmVxLmwJIzEycSxkMAotCW1vdmVxLmwJIzEwLGQwCi0JbW92ZXEubAkjMTBkLGQwCi0JbW92ZXEubAkjJGEsZDAKLQltb3ZlcS5sCSMwYWgsZDAKLQltb3ZlcS5sCSMnYScsZDAKLQltb3ZlcS5sCSNBJ2EnLGQwCi0Jbm9wCi0KLQllbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VtcHR5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YzJjZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VtcHR5LnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNCVAlNQUNSTwkJOyBlbXB0eSBtYWNybwotCUVORE0KLQotCVNCVAlhcmcxIAotICAgICAgICBTQlQgICAgIGFyZzIgLSBvbmUgdHd3Ci0gICAgICAgIFNCVCAgICAgYXJnMyAtIG9uZSB0d28gdGhyZWUKLSAgICAgICAgU0JUICAgICBhcmc0IC0gb25lIHR3byB0aHJlZSBmb3VyCi0gICAgICAgIFNCVCAgICAgYXJnNSAtIG9uZSB0d28gdGhyZWUgZm91ciBmaXZlCi0gICAgICAgIFNCVCAgICAgYXJnNiAtIG9uZSB0d28gKHRocmVlKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY5YTg2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUuZAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIEVRVQotI2FzOiAtTQotCi0jIFRlc3QgdGhlIE1SSSBFUVUgZGlyZWN0aXZlCi0KLTAqNCBBIFNZTUJPTApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjUxMmExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBUZXN0IHRoZSBNUkkgRVFVIGRpcmVjdGl2ZQotCVhERUYJU1lNQk9MCi1TWU1CT0wJRVFVCTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWRlZTRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgZXhwcmVzc2lvbnMKLSNhczogLU0KLQotIyBUZXN0IGV4cHJlc3Npb25zIGluIE1SSSBtb2RlCi0KLTAwKiBBIHMxCi0wMCoxMiBBIHMyCi0wMCo2IEEgczMKLSgwMDAwMDAwMCk/ZmYqIEEgczQKLTAwKiBBIHM1CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2NzdjMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi07IFRlc3QgZXhwcmVzc2lvbnMgaW4gTVJJIG1vZGUKLQl4ZGVmCXMxLHMyLHMzLHM0LHM1Ci1zMQllcXUJMT4yCi1zMgllcXUJMzw8MSozCi1zMwllcXUJNSEhMwotczQJZXF1CSIwCi1zNQllcXUJKDE+PTIpISgxPD4xKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhNjI3YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpjb3B5OiAtTyBzcmVjCi0jbmFtZTogTVJJIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cwotI2FzOiAtTQotCi0jIFRlc3QgTVJJIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cwotCi1TMC4qCi1TMTE4Li4uLigxMjM0NTY3ODlBQkNERUYwM0Y4MDAwMDA0MTIwMDAwMDQxMjAwMDAwNDIpfChGMERFQkM5QTc4NTYzNDEyMDAwMDgwM0YwMDAwMjA0MTAwMDAyMDQxMDApLioKLVMxMC4uLi4uKEM4MDAwMCl8KDAwQzg0MikuKgotI3Bhc3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzN2Y5YzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTsgVGVzdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMgaW4gTVJJIG1vZGUuCi0KLQlkYy5kCToxMjM0XzU2NzhfOWFiY19kZWYwCi0JZGMucwkxLjAKLQlkYy5zCTFlMQotCWRjLnMJMV9lXzEKLQlkYy5zCTFFMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVmYjk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNUkkgc3RydWN0dXJlZCBmb3IKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIGZvciBwc2V1ZG8tb3AuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGNscncgJWQxCi0wKzAwMiA8Zm9vXCsoMHh8KTI+IG1vdmV3ICMxLCVkMAotMCswMDYgPGZvb1wrKDB4fCk2PiBjbXBpdyAjMTAsJWQwCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IGJsdHMgMCswMTYgPGZvb1wrKDB4fCkxNj4KLTArMDBjIDxmb29cKygweHwpYz4gYWRkdyAlZDAsJWQxCi0wKzAwZSA8Zm9vXCsoMHh8KWU+IGJ2Y3MgMCswMTIgPGZvb1wrKDB4fCkxMj4KLTArMDEwIDxmb29cKygweHwpMTA+IGJyYXMgMCswMTYgPGZvb1wrKDB4fCkxNj4KLTArMDEyIDxmb29cKygweHwpMTI+IGFkZHF3ICMyLCVkMAotMCswMTQgPGZvb1wrKDB4fCkxND4gYnJhcyAwKzAwNiA8Zm9vXCsoMHh8KTY+Ci0wKzAxNiA8Zm9vXCsoMHh8KTE2PiBjbHJ3ICVkMQotMCswMTggPGZvb1wrKDB4fCkxOD4gbW92ZXcgIzEwLCVkMAotMCswMWMgPGZvb1wrKDB4fCkxYz4gY21waXcgIzEsJWQwCi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiBiZ3RzIDArMDMwIDxmb29cKygweHwpMzA+Ci0wKzAyMiA8Zm9vXCsoMHh8KTIyPiBjbXBpdyAjMTAwLCVkMQotMCswMjYgPGZvb1wrKDB4fCkyNj4gYmd0cyAwKzAyYSA8Zm9vXCsoMHh8KTJhPgotMCswMjggPGZvb1wrKDB4fCkyOD4gYnJhcyAwKzAyYyA8Zm9vXCsoMHh8KTJjPgotMCswMmEgPGZvb1wrKDB4fCkyYT4gYWRkdyAlZDAsJWQxCi0wKzAyYyA8Zm9vXCsoMHh8KTJjPiBzdWJxdyAjMSwlZDAKLTArMDJlIDxmb29cKygweHwpMmU+IGJyYXMgMCswMWMgPGZvb1wrKDB4fCkxYz4KLTArMDMwIDxmb29cKygweHwpMzA+IG5vcAotMCswMzIgPGZvb1wrKDB4fCkzMj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MjQ3MjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5zCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIGZvciBwc2V1ZG8tb3AuCi0KLQl4ZGVmCWZvbwotZm9vCi0JY2xyIGQxCi0JZm9yIGQwID0gIzEgdG8gIzEwIGJ5ICMyIGRvCi0JICBhZGQgZDAsZDEgYXJiaXRyYXJ5IHRleHQgJ2luIGNvbW1lbnQgZmllbGQKLQkgIGlmIDx2cz4gdGhlbgotCSAgICBicmVhawotCSAgZW5kaQotCWVuZGYKLQotCWNsciBkMQotCWZvciBkMCA9ICMxMCBkb3dudG8gIzEgZG8KLQkgIGlmIGQxIDxnZT4gIzEwMCB0aGVuCi0JICAgIG5leHQKLQkgIGVuZGkKLQkgIGFkZCBkMCxkMQotCWVuZGYKLQotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyOTcyYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNUkkgc3RydWN0dXJlZCBpZgotI2FzOiAtTQotCi0jIFRlc3QgTVJJIHN0cnVjdHVyZWQgaWYgcHNldWRvLW9wLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBjbXB3ICVkMSwlZDAKLTArMDAyIDxmb29cKygweHwpMj4gYmxlcyAwKzAxNCA8Zm9vXCsoMHh8KTE0PgotMCswMDQgPGZvb1wrKDB4fCk0PiBjbXB3ICVkMiwlZDAKLTArMDA2IDxmb29cKygweHwpNj4gYmxlcyAwKzAxNCA8Zm9vXCsoMHh8KTE0PgotMCswMDggPGZvb1wrKDB4fCk4PiBjbXB3ICVkMSwlZDIKLTArMDBhIDxmb29cKygweHwpYT4gYmxlcyAwKzAxMCA8Zm9vXCsoMHh8KTEwPgotMCswMGMgPGZvb1wrKDB4fCljPiBtb3ZldyAlZDEsJWQzCi0wKzAwZSA8Zm9vXCsoMHh8KWU+IGJyYXMgMCswMTIgPGZvb1wrKDB4fCkxMj4KLTArMDEwIDxmb29cKygweHwpMTA+IG1vdmV3ICVkMiwlZDMKLTArMDEyIDxmb29cKygweHwpMTI+IGJyYXMgMCswMWUgPGZvb1wrKDB4fCkxZT4KLTArMDE0IDxmb29cKygweHwpMTQ+IGNtcHcgJWQwLCVkMQotMCswMTYgPGZvb1wrKDB4fCkxNj4gYmd0cyAwKzAxYyA8Zm9vXCsoMHh8KTFjPgotMCswMTggPGZvb1wrKDB4fCkxOD4gY21wdyAlZDAsJWQyCi0wKzAxYSA8Zm9vXCsoMHh8KTFhPiBibGVzIDArMDFlIDxmb29cKygweHwpMWU+Ci0wKzAxYyA8Zm9vXCsoMHh8KTFjPiBtb3ZldyAlZDAsJWQzCi0wKzAxZSA8Zm9vXCsoMHh8KTFlPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NDZiZTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi07IFRlc3QgTVJJIHN0cnVjdHVyZWQgaWYgcHNldWRvLW9wLgotCi0JeGRlZglmb28KLWZvbwotCWlmIGQxIDxndD4gZDAgYW5kIGQyIDxndD4gZDAgdGhlbgotCSAgaWYgZDEgPGd0PiBkMiB0aGVuCi0JICAgIG1vdmUgZDEsZDMKLQkgIGVsc2UKLQkgICAgbW92ZSBkMixkMwotCSAgZW5kaQotCWVsc2UKLQkgIGlmIGQwIDxndD4gZDEgb3IgZDAgPGd0PiBkMiB0aGVuCi0JICAgIG1vdmUgZDAsZDMKLQkgIGVuZGkKLQllbmRpCi0KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pbW1jb25zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2ltbWNvbnN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmRhMTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2ltbWNvbnN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTVJJIGltbWVkaWF0ZSBjb25zdGFudHMKLSNhczogLU0KLSNzb3VyY2U6IGNvbnN0YW50cy5zCi0KLSMgVGVzdCBNUkkgaW1tZWRpYXRlIGNvbnN0YW50cwotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBtb3ZlcSAjMTAsJWQwCi0wKzAwMiA8Zm9vXCsoMHh8KTI+IG1vdmVxICMxMCwlZDAKLTArMDA0IDxmb29cKygweHwpND4gbW92ZXEgIzEwLCVkMAotMCswMDYgPGZvb1wrKDB4fCk2PiBtb3ZlcSAjMTAsJWQwCi0wKzAwOCA8Zm9vXCsoMHh8KTg+IG1vdmVxICMxMCwlZDAKLTArMDBhIDxmb29cKygweHwpYT4gbW92ZXEgIzEwLCVkMAotMCswMGMgPGZvb1wrKDB4fCljPiBtb3ZlcSAjMTAsJWQwCi0wKzAwZSA8Zm9vXCsoMHh8KWU+IG1vdmVxICMxMCwlZDAKLTArMDEwIDxmb29cKygweHwpMTA+IG1vdmVxICMxMCwlZDAKLTArMDEyIDxmb29cKygweHwpMTI+IG1vdmVxICM5NywlZDAKLTArMDE0IDxmb29cKygweHwpMTQ+IG1vdmVxICM5NywlZDAKLTArMDE2IDxmb29cKygweHwpMTY+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlNTg1OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIGxhYmVsCi0jYXM6IC1NCi0KLSMgVGVzdCB1c2luZyBhbiBNUkkgc3R5bGUgbGFiZWwKLQotMDAwMCogVCBMQUJFTAotWyAJXSpVIFNZTUJPTApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1ZWMyYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotOyBUZXN0IHVzaW5nIGFuIE1SSSBzdHlsZSBsYWJlbAotKiBBbHNvIHRlc3QgTVJJIHN0eWxlIGNvbW1lbnRzCi0hIEFuZCBhbm90aGVyIGNvbW1lbnQKLQlYREVGCUxBQkVMCi1MQUJFTAlEQy5MCVNZTUJPTAkJOyBBbmQgeWV0IGFub3RoZXIgY29tbWVudApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzM2ZmE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IE1SSSBtb3ZlbWwKLSNhczogLU0KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8LnRleHQ+OgotICAgMDoJNGNkZiAwN2ZjICAgICAgCW1vdmVtbCAlc3BAXCssJWQyLSVhMgotICAgNDoJNGNkZiAwN2ZjICAgICAgCW1vdmVtbCAlc3BAXCssJWQyLSVhMgotICAgODoJNDhmOSAwN2ZjIDAwMDAgCW1vdmVtbCAlZDItJWEyLDAgPC50ZXh0PgotICAgZToJMDAwMCAKLSAgMTA6CTQ4ZjkgMDdmYyAwMDAwIAltb3ZlbWwgJWQyLSVhMiwwIDwudGV4dD4KLSAgMTY6CTAwMDAgCi0gIDE4Ogk0Y2Y5IDA3ZmMgMDAwMCAJbW92ZW1sIDAgPC50ZXh0PiwlZDItJWEyCi0gIDFlOgkwMDAwIAotICAyMDoJNGNmOSAwN2ZjIDAwMDAgCW1vdmVtbCAwIDwudGV4dD4sJWQyLSVhMgotICAyNjoJMDAwMCAKLSAgMjg6CTRjZjkgMDdmYyAwMDAxIAltb3ZlbWwgMTYwMDAgPGZkc2E+LCVkMi0lYTIKLSAgMmU6CTYwMDAgCi0gIDMwOgk0Y2Y5IDA3ZmMgMDAwMSAJbW92ZW1sIDE2MDAwIDxmZHNhPiwlZDItJWEyCi0gIDM2Ogk2MDAwIAotICAzODoJNDhmOSAwN2ZjIDAwMDEgCW1vdmVtbCAlZDItJWEyLDE2MDAwIDxmZHNhPgotICAzZToJNjAwMCAKLSAgNDA6CTQ4ZjkgMDdmYyAwMDAxIAltb3ZlbWwgJWQyLSVhMiwxNjAwMCA8ZmRzYT4KLSAgNDY6CTYwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZmM3MjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotYXNkZglyZWcJYTAtYTIvZDItZDcKLWZkc2EJZXF1CSQxNjAwMAotCi0JbW92ZW0ubAkoc3ApKyxhMC1hMi9kMi1kNwotCW1vdmVtLmwJKHNwKSssYXNkZgotCQotCW1vdmVtLmwgYTAtYTIvZDItZDcsc3ltYm9sCi0JbW92ZW0ubAlhc2RmLHN5bWJvbAotCi0JbW92ZW0ubCBzeW1ib2wsYTAtYTIvZDItZDcKLQltb3ZlbS5sCXN5bWJvbCxhc2RmCi0KLQltb3ZlbS5sIGZkc2EsYTAtYTIvZDItZDcKLQltb3ZlbS5sCWZkc2EsYXNkZgotCi0JbW92ZW0ubCBhMC1hMi9kMi1kNyxmZHNhCi0JbW92ZW0ubAlhc2RmLGZkc2EKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tcmkuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21yaS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmNkZWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21yaS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jCi0jIFRlc3QgdGhlIG02OGsgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLSMKLSMgSSBvcmlnaW5hbGx5IHRob3VnaHQgdGhhdCBtb3N0IG9mIHRlc3RzIGFwcGxpZWQgdG8gYW55IE1SSQotIyBhc3NlbWJsZXIsIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCBkaWZmZXJlbnQgTVJJIGFzc2VtYmxlcnMgdXNlCi0jIGRpZmZlcmVudCBzeW50YXhlcy4KLSMKLQotaWYgIVtpc3RhcmdldCAibTY4Ki0qLSoiXSB7Ci0gICAgcmV0dXJuCi19Ci0KLXJ1bl9kdW1wX3Rlc3QgbGFiZWwKLXJ1bl9kdW1wX3Rlc3QgZXF1Ci1ydW5fZHVtcF90ZXN0IGNvbnN0YW50cwotcnVuX2R1bXBfdGVzdCBpbW1jb25zdAotcnVuX2R1bXBfdGVzdCBmbG9hdAotcnVuX2R1bXBfdGVzdCBjaGFyCi1ydW5fZHVtcF90ZXN0IGV4cHIKLXJ1bl9kdW1wX3Rlc3QgY29tbW9uCi1ydW5fZHVtcF90ZXN0IGNvbW1lbnQKLWdhc190ZXN0ICJlbXB0eS5zIiAiLU0iICIiICJNUkkgZW1wdHkgbWFjcm8iCi1ydW5fZHVtcF90ZXN0IGZvcgotcnVuX2R1bXBfdGVzdCBpZgotcnVuX2R1bXBfdGVzdCByZXBlYXQKLXJ1bl9kdW1wX3Rlc3Qgd2hpbGUKLXJ1bl9kdW1wX3Rlc3Qgc2VtaQotcnVuX2R1bXBfdGVzdCBtb3ZlbWwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjNWY2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTVJJIHN0cnVjdHVyZWQgcmVwZWF0Ci0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3RydWN0dXJlZCByZXBlYXQgcHNldWRvLW9wLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBiY2NzIDArMDAwIDxmb28+Ci0wKzAwMiA8Zm9vXCsoMHh8KTI+IGNscncgJWQxCi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGFkZHF3ICMxLCVkMQotMCswMDYgPGZvb1wrKDB4fCk2PiBjbXBpdyAjMTAsJWQxCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IGJndHMgMCswMDQgPGZvb1wrKDB4fCk0PgotMCswMGMgPGZvb1wrKDB4fCljPiBub3AKLTArMDBlIDxmb29cKygweHwpZT4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNGVhMmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIHJlcGVhdCBwc2V1ZG8tb3AuCi0KLQl4ZGVmCWZvbwotZm9vCi0JcmVwZWF0Ci0JdW50aWwJPGNzPgotCi0JY2xyIGQxCi0JcmVwZWF0Ci0JICBhZGQgIzEsZDEKLQl1bnRpbCBkMSA8Z2U+ICMxMAotCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlY2NlMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5kCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNuYW1lOiBNUkkgc2VtaQotI2FzOiAtTQotCi0uKjogLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIDNiMjAzYjIwIDNhMjAzYTIwIDAwMDAwMDAwIDAwMDAwMDAwICA7IDsgOiA6IC4uLi4uLi4uCi0gMDAxMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzA2NzcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNlbWljb2xvbiAgbWFjcm8KLQlkYy5iICAgICc7ICcKLQllbmRtCi0KLWNvbG9uCSAgICBtYWNybwotCWRjLmIgICAgJzogJwotCWVuZG0KLQotCXNlbWljb2xvbgotCWRjLmIJJzsgJwotCWNvbG9uCi0JZGMuYgknOiAnCi0KLQlwMmFsaWduCTUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGQzN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTVJJIHN0cnVjdHVyZWQgd2hpbGUKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHJ1Y3R1cmUgd2hpbGUgcHNldWRvLW9wLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBiY2NzIDArMDA0IDxmb29cKygweHwpND4KLTArMDAyIDxmb29cKygweHwpMj4gYnJhcyAwKzAwMCA8Zm9vPgotMCswMDQgPGZvb1wrKDB4fCk0PiBjbHJ3ICVkMQotMCswMDYgPGZvb1wrKDB4fCk2PiBjbXBpdyAjMTAsJWQxCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IGJsdHMgMCswMTAgPGZvb1wrKDB4fCkxMD4KLTArMDBjIDxmb29cKygweHwpYz4gYWRkcXcgIzEsJWQxCi0wKzAwZSA8Zm9vXCsoMHh8KWU+IGJyYXMgMCswMDYgPGZvb1wrKDB4fCk2PgotMCswMTAgPGZvb1wrKDB4fCkxMD4gbm9wCi0wKzAxMiA8Zm9vXCsoMHh8KTEyPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2JkYmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgTVJJIHN0cnVjdHVyZWQgd2hpbGUgcHNldWRvLW9wLgotCi0JeGRlZglmb28KLWZvbwotCXdoaWxlIDxjcz4gZG8KLQllbmR3Ci0KLQljbHIgZDEKLQl3aGlsZSBkMSA8bGU+ICMxMCBkbwotCSAgYWRkICMxLGQxCi0JZW5kdwotCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BqL29wcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzYxOTcxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BqL29wcy5kCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBwagotI2FzCi0KLSMgdGVzdCBhbGwgdGhlIGluc3RydWN0aW9ucwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLXBqCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxmb28wLTB4MT46Ci0JLi4uCi0KLTAwMDAwMDAxIDxmb28wPjoKLQkuLi4KLQotMDAwMDAwMDIgPGZvbzE+OgotCS4uLgotCi0wMDAwMDAwMyA8Zm9vMj46Ci0JLi4uCi0KLTAwMDAwMDA0IDxmb28zPjoKLQkuLi4KLQotMDAwMDAwMDUgPGZvbzQ+OgotCS4uLgotCi0wMDAwMDAwNiA8Zm9vNT46Ci0JLi4uCi0KLTAwMDAwMDA3IDxmb282PjoKLQkuLi4KLQotMDAwMDAwMDggPGZvbzc+OgotCS4uLgotCi0wMDAwMDAwOSA8Zm9vOD46Ci0JLi4uCi0KLTAwMDAwMDBhIDxmb285PjoKLQkuLi4KLQotMDAwMDAwMGIgPGZvbzEwPjoKLQkuLi4KLQotMDAwMDAwMGMgPGZvbzExPjoKLQkuLi4KLQotMDAwMDAwMGQgPGZvbzEyPjoKLQkuLi4KLQotMDAwMDAwMGUgPGZvbzEzPjoKLQkuLi4KLQotMDAwMDAwMGYgPGZvbzE0PjoKLQkuLi4KLQotMDAwMDAwMTAgPGZvbzE1PjoKLQkuLi4KLQotMDAwMDAwMTEgPGZvbzE2PjoKLQkuLi4KLQotMDAwMDAwMTIgPGZvbzE3PjoKLQkuLi4KLQotMDAwMDAwMTMgPGZvbzE4PjoKLQkuLi4KLQotMDAwMDAwMTQgPGZvbzE5PjoKLSAgMTQ6CTAwICAgICAgICAgIAlub3AKLSAgMTU6CTAxICAgICAgICAgIAlhY29uc3RfbnVsbAotICAxNjoJMDIgICAgICAgICAgCWljb25zdF9tMQotICAxNzoJMDMgICAgICAgICAgCWljb25zdF8wCi0gIDE4OgkwNCAgICAgICAgICAJaWNvbnN0XzEKLSAgMTk6CTA1ICAgICAgICAgIAlpY29uc3RfMgotICAxYToJMDYgICAgICAgICAgCWljb25zdF8zCi0gIDFiOgkwNyAgICAgICAgICAJaWNvbnN0XzQKLSAgMWM6CTA4ICAgICAgICAgIAlpY29uc3RfNQotICAxZDoJMDkgICAgICAgICAgCWxjb25zdF8wCi0gIDFlOgkwYSAgICAgICAgICAJbGNvbnN0XzEKLSAgMWY6CTBiICAgICAgICAgIAlmY29uc3RfMAotICAyMDoJMGMgICAgICAgICAgCWZjb25zdF8xCi0gIDIxOgkwZCAgICAgICAgICAJZmNvbnN0XzIKLSAgMjI6CTBlICAgICAgICAgIAlkY29uc3RfMAotICAyMzoJMGYgICAgICAgICAgCWRjb25zdF8xCi0gIDI0OgkxMCBlNyAgICAgICAJYmlwdXNoCS0yNQotICAyNjoJMTEgYTMgYzYgICAgCXNpcHVzaAktMjM2MTAKLSAgMjk6CTEyIDAwICAgICAgIAlsZGMKLSAgMmI6CTEzIDAwIDAwICAgIAlsZGNfdwotICAyZToJMTQgMDAgMDAgICAgCWxkYzJfdwotICAzMToJMTUgNjkgICAgICAgCWlsb2FkCTEwNQotICAzMzoJMTYgNzMgICAgICAgCWxsb2FkCTExNQotICAzNToJMTcgNTEgICAgICAgCWZsb2FkCTgxCi0gIDM3OgkxOCBmZiAgICAgICAJZGxvYWQJMjU1Ci0gIDM5OgkxOSA0YSAgICAgICAJYWxvYWQJNzQKLSAgM2I6CTFhICAgICAgICAgIAlpbG9hZF8wCi0gIDNjOgkxYiAgICAgICAgICAJaWxvYWRfMQotICAzZDoJMWMgICAgICAgICAgCWlsb2FkXzIKLSAgM2U6CTFkICAgICAgICAgIAlpbG9hZF8zCi0gIDNmOgkxZSAgICAgICAgICAJbGxvYWRfMAotICA0MDoJMWYgICAgICAgICAgCWxsb2FkXzEKLSAgNDE6CTIwICAgICAgICAgIAlsbG9hZF8yCi0gIDQyOgkyMSAgICAgICAgICAJbGxvYWRfMwotICA0MzoJMjIgICAgICAgICAgCWZsb2FkXzAKLSAgNDQ6CTIzICAgICAgICAgIAlmbG9hZF8xCi0gIDQ1OgkyNCAgICAgICAgICAJZmxvYWRfMgotICA0NjoJMjUgICAgICAgICAgCWZsb2FkXzMKLSAgNDc6CTI2ICAgICAgICAgIAlkbG9hZF8wCi0gIDQ4OgkyNyAgICAgICAgICAJZGxvYWRfMQotICA0OToJMjggICAgICAgICAgCWRsb2FkXzIKLSAgNGE6CTI5ICAgICAgICAgIAlkbG9hZF8zCi0gIDRiOgkyYSAgICAgICAgICAJYWxvYWRfMAotICA0YzoJMmIgICAgICAgICAgCWFsb2FkXzEKLSAgNGQ6CTJjICAgICAgICAgIAlhbG9hZF8yCi0gIDRlOgkyZCAgICAgICAgICAJYWxvYWRfMwotICA0ZjoJMmUgICAgICAgICAgCWlhbG9hZAotICA1MDoJMmYgICAgICAgICAgCWxhbG9hZAotICA1MToJMzAgICAgICAgICAgCWZhbG9hZAotICA1MjoJMzEgICAgICAgICAgCWRhbG9hZAotICA1MzoJMzIgICAgICAgICAgCWFhbG9hZAotICA1NDoJMzMgICAgICAgICAgCWJhbG9hZAotICA1NToJMzQgICAgICAgICAgCWNhbG9hZAotICA1NjoJMzUgICAgICAgICAgCXNhbG9hZAotICA1NzoJMzYgZWMgICAgICAgCWlzdG9yZQkyMzYKLSAgNTk6CTM3IDI5ICAgICAgIAlsc3RvcmUJNDEKLSAgNWI6CTM4IGNkICAgICAgIAlmc3RvcmUJMjA1Ci0gIDVkOgkzOSBiYSAgICAgICAJZHN0b3JlCTE4NgotICA1ZjoJM2EgYWIgICAgICAgCWFzdG9yZQkxNzEKLSAgNjE6CTNiICAgICAgICAgIAlpc3RvcmVfMAotICA2MjoJM2MgICAgICAgICAgCWlzdG9yZV8xCi0gIDYzOgkzZCAgICAgICAgICAJaXN0b3JlXzIKLSAgNjQ6CTNlICAgICAgICAgIAlpc3RvcmVfMwotICA2NToJM2YgICAgICAgICAgCWxzdG9yZV8wCi0gIDY2Ogk0MCAgICAgICAgICAJbHN0b3JlXzEKLSAgNjc6CTQxICAgICAgICAgIAlsc3RvcmVfMgotICA2ODoJNDIgICAgICAgICAgCWxzdG9yZV8zCi0gIDY5Ogk0MyAgICAgICAgICAJZnN0b3JlXzAKLSAgNmE6CTQ0ICAgICAgICAgIAlmc3RvcmVfMQotICA2YjoJNDUgICAgICAgICAgCWZzdG9yZV8yCi0gIDZjOgk0NiAgICAgICAgICAJZnN0b3JlXzMKLSAgNmQ6CTQ3ICAgICAgICAgIAlkc3RvcmVfMAotICA2ZToJNDggICAgICAgICAgCWRzdG9yZV8xCi0gIDZmOgk0OSAgICAgICAgICAJZHN0b3JlXzIKLSAgNzA6CTRhICAgICAgICAgIAlkc3RvcmVfMwotICA3MToJNGIgICAgICAgICAgCWFzdG9yZV8wCi0gIDcyOgk0YyAgICAgICAgICAJYXN0b3JlXzEKLSAgNzM6CTRkICAgICAgICAgIAlhc3RvcmVfMgotICA3NDoJNGUgICAgICAgICAgCWFzdG9yZV8zCi0gIDc1Ogk0ZiAgICAgICAgICAJaWFzdG9yZQotICA3NjoJNTAgICAgICAgICAgCWxhc3RvcmUKLSAgNzc6CTUxICAgICAgICAgIAlmYXN0b3JlCi0gIDc4Ogk1MiAgICAgICAgICAJZGFzdG9yZQotICA3OToJNTMgICAgICAgICAgCWFhc3RvcmUKLSAgN2E6CTU0ICAgICAgICAgIAliYXN0b3JlCi0gIDdiOgk1NSAgICAgICAgICAJY2FzdG9yZQotICA3YzoJNTYgICAgICAgICAgCXNhc3RvcmUKLSAgN2Q6CTU3ICAgICAgICAgIAlwb3AKLSAgN2U6CTU4ICAgICAgICAgIAlwb3AyCi0gIDdmOgk1OSAgICAgICAgICAJZHVwCi0gIDgwOgk1YSAgICAgICAgICAJZHVwX3gxCi0gIDgxOgk1YiAgICAgICAgICAJZHVwX3gyCi0gIDgyOgk1YyAgICAgICAgICAJZHVwMgotICA4MzoJNWQgICAgICAgICAgCWR1cDJfeDEKLSAgODQ6CTVlICAgICAgICAgIAlkdXAyX3gyCi0gIDg1Ogk1ZiAgICAgICAgICAJc3dhcAotICA4NjoJNjAgICAgICAgICAgCWlhZGQKLSAgODc6CTYxICAgICAgICAgIAlsYWRkCi0gIDg4Ogk2MiAgICAgICAgICAJZmFkZAotICA4OToJNjMgICAgICAgICAgCWRhZGQKLSAgOGE6CTY0ICAgICAgICAgIAlpc3ViCi0gIDhiOgk2NSAgICAgICAgICAJbHN1YgotICA4YzoJNjYgICAgICAgICAgCWZzdWIKLSAgOGQ6CTY3ICAgICAgICAgIAlkc3ViCi0gIDhlOgk2OCAgICAgICAgICAJaW11bAotICA4ZjoJNjkgICAgICAgICAgCWxtdWwKLSAgOTA6CTZhICAgICAgICAgIAlmbXVsCi0gIDkxOgk2YiAgICAgICAgICAJZG11bAotICA5MjoJNmMgICAgICAgICAgCWlkaXYKLSAgOTM6CTZkICAgICAgICAgIAlsZGl2Ci0gIDk0Ogk2ZSAgICAgICAgICAJZmRpdgotICA5NToJNmYgICAgICAgICAgCWRkaXYKLSAgOTY6CTcwICAgICAgICAgIAlpcmVtCi0gIDk3Ogk3MSAgICAgICAgICAJbHJlbQotICA5ODoJNzIgICAgICAgICAgCWZyZW0KLSAgOTk6CTczICAgICAgICAgIAlkcmVtCi0gIDlhOgk3NCAgICAgICAgICAJaW5lZwotICA5YjoJNzUgICAgICAgICAgCWxuZWcKLSAgOWM6CTc2ICAgICAgICAgIAlmbmVnCi0gIDlkOgk3NyAgICAgICAgICAJZG5lZwotICA5ZToJNzggICAgICAgICAgCWlzaGwKLSAgOWY6CTc5ICAgICAgICAgIAlsc2hsCi0gIGEwOgk3YSAgICAgICAgICAJaXNocgotICBhMToJN2IgICAgICAgICAgCWxzaHIKLSAgYTI6CTdjICAgICAgICAgIAlpdXNocgotICBhMzoJN2QgICAgICAgICAgCWx1c2hyCi0gIGE0Ogk3ZSAgICAgICAgICAJaWFuZAotICBhNToJN2YgICAgICAgICAgCWxhbmQKLSAgYTY6CTgwICAgICAgICAgIAlpb3IKLSAgYTc6CTgxICAgICAgICAgIAlsb3IKLSAgYTg6CTgyICAgICAgICAgIAlpeG9yCi0gIGE5Ogk4MyAgICAgICAgICAJbHhvcgotICBhYToJODQgZjIgN2IgICAgCWlpbmMJMjQyLDEyMwotICBhZDoJODUgICAgICAgICAgCWkybAotICBhZToJODYgICAgICAgICAgCWkyZgotICBhZjoJODcgICAgICAgICAgCWkyZAotICBiMDoJODggICAgICAgICAgCWwyaQotICBiMToJODkgICAgICAgICAgCWwyZgotICBiMjoJOGEgICAgICAgICAgCWwyZAotICBiMzoJOGIgICAgICAgICAgCWYyaQotICBiNDoJOGMgICAgICAgICAgCWYybAotICBiNToJOGQgICAgICAgICAgCWYyZAotICBiNjoJOGUgICAgICAgICAgCWQyaQotICBiNzoJOGYgICAgICAgICAgCWQybAotICBiODoJOTAgICAgICAgICAgCWQyZgotICBiOToJOTEgICAgICAgICAgCWkyYgotICBiYToJOTIgICAgICAgICAgCWkyYwotICBiYjoJOTMgICAgICAgICAgCWkycwotICBiYzoJOTQgICAgICAgICAgCWxjbXAKLSAgYmQ6CTk1ICAgICAgICAgIAlmY21wbAotICBiZToJOTYgICAgICAgICAgCWZjbXBnCi0gIGJmOgk5NyAgICAgICAgICAJZGNtcGwKLSAgYzA6CTk4ICAgICAgICAgIAlkY21wZwotICBjMToJOTkgZmYgNDEgICAgCWlmZXEyIDxmb28xPgotICBjNDoJOWEgZmYgNDcgICAgCWlmbmViIDxmb28xMD4KLSAgYzc6CTliIGZmIDQxICAgIAlpZmx0OCA8Zm9vNz4KLSAgY2E6CTljIGZmIDQ4ICAgIAlpZmdlMTIgPGZvbzE3PgotICBjZDoJOWQgZmYgMzkgICAgCWlmZ3Q2IDxmb281PgotICBkMDoJOWUgZmYgM2EgICAgCWlmbGVhIDxmb285PgotICBkMzoJOWYgZmYgMzggICAgCWlmX2ljbXBlcWIgPGZvbzEwPgotICBkNjoJYTAgZmYgM2EgICAgCWlmX2ljbXBuZTEwIDxmb28xNT4KLSAgZDk6CWExIGZmIDMwICAgIAlpZl9pY21wbHQ5IDxmb284PgotICBkYzoJYTIgZmYgMzEgICAgCWlmX2ljbXBnZWQgPGZvbzEyPgotICBkZjoJYTMgZmYgMjkgICAgCWlmX2ljbXBndDggPGZvbzc+Ci0gIGUyOglhNCBmZiAyYiAgICAJaWZfaWNtcGxlZCA8Zm9vMTI+Ci0gIGU1OglhNSBmZiAyMiAgICAJaWZfYWNtcGVxNyA8Zm9vNj4KLSAgZTg6CWE2IGZmIDIwICAgIAlpZl9hY21wbmU4IDxmb283PgotICBlYjoJYTcgZmYgMWIgICAgCWdvdG82IDxmb281PgotICBlZToJYTggMDAgMDAgICAgCWpzcgotICBmMToJYTkgMDAgICAgICAgCXJldAotICBmMzoJYWEgZmYgZmYgZmYgCXRhYmxlc3dpdGNoIGRlZmF1bHQ6IC4qCi0gIGY3OgkwZiAwMCAwMCAwMCAKLSAgZmI6CTAxIDAwIDAwIDAwIAotICBmZjoJMDUgZmYgZmYgZmYgCi0gMTAzOgkxNCBmZiBmZiBmZiAKLSAxMDc6CTEyIGZmIGZmIGZmIAotIDEwYjoJMWYgZmYgZmYgZmYgCi0gMTBmOgkxNCBmZiBmZiBmZiAKLSAxMTM6CTEyIAotIDExNDoJYWIgMDAgMDAgMDAgCWxvb2t1cHN3aXRjaCBkZWZhdWx0OiAuKgotIDExODoJZmYgZmYgZmUgZjIgCi0gMTFjOgkwMCAwMCAwMCAwMiAKLSAxMjA6CTAwIDAwIDAwIDA3IAotIDEyNDoJZmYgZmYgZmUgZmIgCi0gMTI4OgkwMCAwMCAwMCAyNSAKLSAxMmM6CWZmIGZmIGZlIGZjIAotIDEzMDoJYWMgICAgICAgICAgCWlyZXR1cm4KLSAxMzE6CWFkICAgICAgICAgIAlscmV0dXJuCi0gMTMyOglhZSAgICAgICAgICAJZnJldHVybgotIDEzMzoJYWYgICAgICAgICAgCWRyZXR1cm4KLSAxMzQ6CWIwICAgICAgICAgIAlhcmV0dXJuCi0gMTM1OgliMSAgICAgICAgICAJcmV0dXJuCi0gMTM2OgliMiAwMCAwMCAgICAJZ2V0c3RhdGljCi0gMTM5OgliMyAwMCAwMCAgICAJcHV0c3RhdGljCi0gMTNjOgliNCAwMCAwMCAgICAJZ2V0ZmllbGQKLSAxM2Y6CWI1IDAwIDAwICAgIAlwdXRmaWVsZAotIDE0MjoJYjYgMDAgMDAgICAgCWludm9rZXZpcnR1YWwKLSAxNDU6CWI3IDAwIDAwICAgIAlpbnZva2VzcGVjaWFsCi0gMTQ4OgliOCAwMCAwMCAgICAJaW52b2tlc3RhdGljCi0gMTRiOgliOSAwMCAwMCAwMCAJaW52b2tlaW50ZXJmYWNlCi0gMTRmOgkwMCAKLSAxNTA6CWJiIDAwIDAwICAgIAluZXcKLSAxNTM6CWJjIDAwICAgICAgIAluZXdhcnJheQotIDE1NToJYmQgMDAgMDAgICAgCWFuZXdhcnJheQotIDE1ODoJYmUgICAgICAgICAgCWFycmF5bGVuZ3RoCi0gMTU5OgliZiAgICAgICAgICAJYXRocm93Ci0gMTVhOgljMCAwMCAwMCAgICAJY2hlY2tjYXN0Ci0gMTVkOgljMSAwMCAwMCAgICAJaW5zdGFuY2VvZgotIDE2MDoJYzIgICAgICAgICAgCW1vbml0b3JlbnRlcgotIDE2MToJYzMgICAgICAgICAgCW1vbml0b3JleGl0Ci0gMTYyOgljNCAgICAgICAgICAJd2lkZQotIDE2MzoJYzUgMDAgMDAgMDAgCW11bHRpYW5ld2FycmF5Ci0gMTY3OgljNiAwMCAwMCAgICAJaWZudWxsCi0gMTZhOgljNyAwMCAwMCAgICAJaWZub25udWxsCi0gMTZkOgljOCAwMCAwMCAwMCAJZ290b193Ci0gMTcxOgkwMCAKLSAxNzI6CWM5IDAwIDAwIDAwIAlqc3JfdwotIDE3NjoJMDAgCi0gMTc3OgljYSAgICAgICAgICAJYnJlYWtwb2ludAotIDE3ODoJY2IgICAgICAgICAgCWJ5dGVjb2RlCi0gMTc5OgljYyAgICAgICAgICAJdHJ5Ci0gMTdhOgljZCAgICAgICAgICAJZW5kdHJ5Ci0gMTdiOgljZSAgICAgICAgICAJY2F0Y2gKLSAxN2M6CWNmICAgICAgICAgIAl2YXIKLSAxN2Q6CWQwICAgICAgICAgIAllbmR2YXIKLSAxN2U6CWVkIGIwIGEzICAgIAlzZXRoaQktMjAzMTcKLSAxODE6CWVlIDVhIGE1ICAgIAlsb2FkX3dvcmRfaW5kZXgJOTAsMTY1Ci0gMTg0OgllZiA1ZCA4NSAgICAJbG9hZF9zaG9ydF9pbmRleAk5MywxMzMKLSAxODc6CWYwIDE3IGQ4ICAgIAlsb2FkX2NoYXJfaW5kZXgJMjMsMjE2Ci0gMThhOglmMSBlOSBkZSAgICAJbG9hZF9ieXRlX2luZGV4CTIzMywyMjIKLSAxOGQ6CWYyIGQ0IDJiICAgIAlsb2FkX3VieXRlX2luZGV4CTIxMiw0MwotIDE5MDoJZjMgYjIgNGQgICAgCXN0b3JlX3dvcmRfaW5kZXgJMTc4LDc3Ci0gMTkzOglmNCBjNiAxYiAgICAJbmFfc3RvcmVfd29yZF9pbmRleAkxOTgsMjcKLSAxOTY6CWY1IGI0IGQ0ICAgIAlzdG9yZV9zaG9ydF9pbmRleAkxODAsMjEyCi0gMTk5OglmNiAxMSA4ZSAgICAJc3RvcmVfYnl0ZV9pbmRleAkxNywxNDIKLSAxOWM6CWZmIDAwICAgICAgIAlsb2FkX3VieXRlCQotIDE5ZToJZmYgMDEgICAgICAgCWxvYWRfYnl0ZQkKLSAxYTA6CWZmIDAyICAgICAgIAlsb2FkX2NoYXIJCi0gMWEyOglmZiAwMyAgICAgICAJbG9hZF9zaG9ydAkKLSAxYTQ6CWZmIDA0ICAgICAgIAlsb2FkX3dvcmQJCi0gMWE2OglmZiAwNSAgICAgICAJcHJpdl9yZXRfZnJvbV90cmFwCQotIDFhODoJZmYgMDYgICAgICAgCXByaXZfcmVhZF9kY2FjaGVfdGFnCQotIDFhYToJZmYgMDcgICAgICAgCXByaXZfcmVhZF9kY2FjaGVfZGF0YQkKLSAxYWM6CWZmIDBhICAgICAgIAlsb2FkX2NoYXJfb2UJCi0gMWFlOglmZiAwYiAgICAgICAJbG9hZF9zaG9ydF9vZQkKLSAxYjA6CWZmIDBjICAgICAgIAlsb2FkX3dvcmRfb2UJCi0gMWIyOglmZiAwZCAgICAgICAJcmV0dXJuMAkKLSAxYjQ6CWZmIDBlICAgICAgIAlwcml2X3JlYWRfaWNhY2hlX3RhZwkKLSAxYjY6CWZmIDBmICAgICAgIAlwcml2X3JlYWRfaWNhY2hlX2RhdGEJCi0gMWI4OglmZiAxMCAgICAgICAJbmNsb2FkX3VieXRlCQotIDFiYToJZmYgMTEgICAgICAgCW5jbG9hZF9ieXRlCQotIDFiYzoJZmYgMTIgICAgICAgCW5jbG9hZF9jaGFyCQotIDFiZToJZmYgMTMgICAgICAgCW5jbG9hZF9zaG9ydAkKLSAxYzA6CWZmIDE0ICAgICAgIAluY2xvYWRfd29yZAkKLSAxYzI6CWZmIDE1ICAgICAgIAlpdWNtcAkKLSAxYzQ6CWZmIDE2ICAgICAgIAlwcml2X3Bvd2VyZG93bgkKLSAxYzY6CWZmIDE3ICAgICAgIAljYWNoZV9pbnZhbGlkYXRlCQotIDFjODoJZmYgMWEgICAgICAgCW5jbG9hZF9jaGFyX29lCQotIDFjYToJZmYgMWIgICAgICAgCW5jbG9hZF9zaG9ydF9vZQkKLSAxY2M6CWZmIDFjICAgICAgIAluY2xvYWRfd29yZF9vZQkKLSAxY2U6CWZmIDFkICAgICAgIAlyZXR1cm4xCQotIDFkMDoJZmYgMWUgICAgICAgCWNhY2hlX2ZsdXNoCQotIDFkMjoJZmYgMWYgICAgICAgCWNhY2hlX2luZGV4X2ZsdXNoCQotIDFkNDoJZmYgMjAgICAgICAgCXN0b3JlX2J5dGUJCi0gMWQ2OglmZiAyMiAgICAgICAJc3RvcmVfc2hvcnQJCi0gMWQ4OglmZiAyNCAgICAgICAJc3RvcmVfd29yZAkKLSAxZGE6CWZmIDI1ICAgICAgIAlzb2Z0X3RyYXAJCi0gMWRjOglmZiAyNiAgICAgICAJcHJpdl93cml0ZV9kY2FjaGVfdGFnCQotIDFkZToJZmYgMjcgICAgICAgCXByaXZfd3JpdGVfZGNhY2hlX2RhdGEJCi0gMWUwOglmZiAyYSAgICAgICAJc3RvcmVfc2hvcnRfb2UJCi0gMWUyOglmZiAyYyAgICAgICAJc3RvcmVfd29yZF9vZQkKLSAxZTQ6CWZmIDJkICAgICAgIAlyZXR1cm4yCQotIDFlNjoJZmYgMmUgICAgICAgCXByaXZfd3JpdGVfaWNhY2hlX3RhZwkKLSAxZTg6CWZmIDJmICAgICAgIAlwcml2X3dyaXRlX2ljYWNoZV9kYXRhCQotIDFlYToJZmYgMzAgICAgICAgCW5jc3RvcmVfYnl0ZQkKLSAxZWM6CWZmIDMyICAgICAgIAluY3N0b3JlX3Nob3J0CQotIDFlZToJZmYgMzQgICAgICAgCW5jc3RvcmVfd29yZAkKLSAxZjA6CWZmIDM2ICAgICAgIAlwcml2X3Jlc2V0CQotIDFmMjoJZmYgMzcgICAgICAgCWdldF9jdXJyZW50X2NsYXNzCQotIDFmNDoJZmYgM2EgICAgICAgCW5jc3RvcmVfc2hvcnRfb2UJCi0gMWY2OglmZiAzYyAgICAgICAJbmNzdG9yZV93b3JkX29lCQotIDFmODoJZmYgM2QgICAgICAgCWNhbGwJCi0gMWZhOglmZiAzZSAgICAgICAJemVyb19saW5lCQotIDFmYzoJZmYgM2YgICAgICAgCXByaXZfdXBkYXRlX29wdG9wCQotIDFmZToJZmYgNDAgICAgICAgCXJlYWRfcGMJCi0gMjAwOglmZiA0MSAgICAgICAJcmVhZF92YXJzCQotIDIwMjoJZmYgNDIgICAgICAgCXJlYWRfZnJhbWUJCi0gMjA0OglmZiA0MyAgICAgICAJcmVhZF9vcHRvcAkKLSAyMDY6CWZmIDQ0ICAgICAgIAlwcml2X3JlYWRfb3BsaW0JCi0gMjA4OglmZiA0NSAgICAgICAJcmVhZF9jb25zdF9wb29sCQotIDIwYToJZmYgNDYgICAgICAgCXByaXZfcmVhZF9wc3IJCi0gMjBjOglmZiA0NyAgICAgICAJcHJpdl9yZWFkX3RyYXBiYXNlCQotIDIwZToJZmYgNDggICAgICAgCXByaXZfcmVhZF9sb2NrY291bnQwCQotIDIxMDoJZmYgNDkgICAgICAgCXByaXZfcmVhZF9sb2NrY291bnQxCQotIDIxMjoJZmYgNGMgICAgICAgCXByaXZfcmVhZF9sb2NrYWRkcjAJCi0gMjE0OglmZiA0ZCAgICAgICAJcHJpdl9yZWFkX2xvY2thZGRyMQkKLSAyMTY6CWZmIDUwICAgICAgIAlwcml2X3JlYWRfdXNlcnJhbmdlMQkKLSAyMTg6CWZmIDUxICAgICAgIAlwcml2X3JlYWRfZ2NfY29uZmlnCQotIDIxYToJZmYgNTIgICAgICAgCXByaXZfcmVhZF9icmsxYQkKLSAyMWM6CWZmIDUzICAgICAgIAlwcml2X3JlYWRfYnJrMmEJCi0gMjFlOglmZiA1NCAgICAgICAJcHJpdl9yZWFkX2JyazEyYwkKLSAyMjA6CWZmIDU1ICAgICAgIAlwcml2X3JlYWRfdXNlcnJhbmdlMgkKLSAyMjI6CWZmIDU3ICAgICAgIAlwcml2X3JlYWRfdmVyc2lvbmlkCQotIDIyNDoJZmYgNTggICAgICAgCXByaXZfcmVhZF9oY3IJCi0gMjI2OglmZiA1OSAgICAgICAJcHJpdl9yZWFkX3NjX2JvdHRvbQkKLSAyMjg6CWZmIDVhICAgICAgIAlyZWFkX2dsb2JhbDAJCi0gMjJhOglmZiA1YiAgICAgICAJcmVhZF9nbG9iYWwxCQotIDIyYzoJZmYgNWMgICAgICAgCXJlYWRfZ2xvYmFsMgkKLSAyMmU6CWZmIDVkICAgICAgIAlyZWFkX2dsb2JhbDMJCi0gMjMwOglmZiA2MCAgICAgICAJd3JpdGVfcGMJCi0gMjMyOglmZiA2MSAgICAgICAJd3JpdGVfdmFycwkKLSAyMzQ6CWZmIDYyICAgICAgIAl3cml0ZV9mcmFtZQkKLSAyMzY6CWZmIDYzICAgICAgIAl3cml0ZV9vcHRvcAkKLSAyMzg6CWZmIDY0ICAgICAgIAlwcml2X3dyaXRlX29wbGltCQotIDIzYToJZmYgNjUgICAgICAgCXdyaXRlX2NvbnN0X3Bvb2wJCi0gMjNjOglmZiA2NiAgICAgICAJcHJpdl93cml0ZV9wc3IJCi0gMjNlOglmZiA2NyAgICAgICAJcHJpdl93cml0ZV90cmFwYmFzZQkKLSAyNDA6CWZmIDY4ICAgICAgIAlwcml2X3dyaXRlX2xvY2tjb3VudDAJCi0gMjQyOglmZiA2OSAgICAgICAJcHJpdl93cml0ZV9sb2NrY291bnQxCQotIDI0NDoJZmYgNmMgICAgICAgCXByaXZfd3JpdGVfbG9ja2FkZHIwCQotIDI0NjoJZmYgNmQgICAgICAgCXByaXZfd3JpdGVfbG9ja2FkZHIxCQotIDI0ODoJZmYgNzAgICAgICAgCXByaXZfd3JpdGVfdXNlcnJhbmdlMQkKLSAyNGE6CWZmIDcxICAgICAgIAlwcml2X3dyaXRlX2djX2NvbmZpZwkKLSAyNGM6CWZmIDcyICAgICAgIAlwcml2X3dyaXRlX2JyazFhCQotIDI0ZToJZmYgNzMgICAgICAgCXByaXZfd3JpdGVfYnJrMmEJCi0gMjUwOglmZiA3NCAgICAgICAJcHJpdl93cml0ZV9icmsxMmMJCi0gMjUyOglmZiA3NSAgICAgICAJcHJpdl93cml0ZV91c2VycmFuZ2UyCQotIDI1NDoJZmYgNzkgICAgICAgCXByaXZfd3JpdGVfc2NfYm90dG9tCQotIDI1NjoJZmYgN2EgICAgICAgCXdyaXRlX2dsb2JhbDAJCi0gMjU4OglmZiA3YiAgICAgICAJd3JpdGVfZ2xvYmFsMQkKLSAyNWE6CWZmIDdjICAgICAgIAl3cml0ZV9nbG9iYWwyCQotIDI1YzoJZmYgN2QgICAgICAgCXdyaXRlX2dsb2JhbDMJCi0gMjVlOglmZiBhZSAgICAgICAJdG1fcHV0Y2hhcgkKLSAyNjA6CWZmIGFmICAgICAgIAl0bV9leGl0CQotIDI2MjoJZmYgYjAgICAgICAgCXRtX3RyYXAJCi0gMjY0OglmZiBiMSAgICAgICAJdG1fbWluZm8JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BqL29wcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzgxMDliLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BqL29wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS5MMDoJbm9wCi0uZ2xvYmwgZm9vMAotZm9vMDoKLS5MMToJbm9wCi0uZ2xvYmwgZm9vMQotZm9vMToKLS5MMjoJbm9wCi0uZ2xvYmwgZm9vMgotZm9vMjoKLS5MMzoJbm9wCi0uZ2xvYmwgZm9vMwotZm9vMzoKLS5MNDoJbm9wCi0uZ2xvYmwgZm9vNAotZm9vNDoKLS5MNToJbm9wCi0uZ2xvYmwgZm9vNQotZm9vNToKLS5MNjoJbm9wCi0uZ2xvYmwgZm9vNgotZm9vNjoKLS5MNzoJbm9wCi0uZ2xvYmwgZm9vNwotZm9vNzoKLS5MODoJbm9wCi0uZ2xvYmwgZm9vOAotZm9vODoKLS5MOToJbm9wCi0uZ2xvYmwgZm9vOQotZm9vOToKLS5MMTA6CW5vcAotLmdsb2JsIGZvbzEwCi1mb28xMDoKLS5MMTE6CW5vcAotLmdsb2JsIGZvbzExCi1mb28xMToKLS5MMTI6CW5vcAotLmdsb2JsIGZvbzEyCi1mb28xMjoKLS5MMTM6CW5vcAotLmdsb2JsIGZvbzEzCi1mb28xMzoKLS5MMTQ6CW5vcAotLmdsb2JsIGZvbzE0Ci1mb28xNDoKLS5MMTU6CW5vcAotLmdsb2JsIGZvbzE1Ci1mb28xNToKLS5MMTY6CW5vcAotLmdsb2JsIGZvbzE2Ci1mb28xNjoKLS5MMTc6CW5vcAotLmdsb2JsIGZvbzE3Ci1mb28xNzoKLS5MMTg6CW5vcAotLmdsb2JsIGZvbzE4Ci1mb28xODoKLS5MMTk6CW5vcAotLmdsb2JsIGZvbzE5Ci1mb28xOToKLQlub3AKLQlhY29uc3RfbnVsbAotCWljb25zdF9tMQotCWljb25zdF8wCi0JaWNvbnN0XzEKLQlpY29uc3RfMgotCWljb25zdF8zCi0JaWNvbnN0XzQKLQlpY29uc3RfNQotCWxjb25zdF8wCi0JbGNvbnN0XzEKLQlmY29uc3RfMAotCWZjb25zdF8xCi0JZmNvbnN0XzIKLQlkY29uc3RfMAotCWRjb25zdF8xCi0JYmlwdXNoIC0yNQotCXNpcHVzaCAtMjM2MTAKLQlsZGMKLQlsZGNfdwotCWxkYzJfdwotCWlsb2FkIDEwNQotCWxsb2FkIDExNQotCWZsb2FkIDgxCi0JZGxvYWQgMjU1Ci0JYWxvYWQgNzQKLQlpbG9hZF8wCi0JaWxvYWRfMQotCWlsb2FkXzIKLQlpbG9hZF8zCi0JbGxvYWRfMAotCWxsb2FkXzEKLQlsbG9hZF8yCi0JbGxvYWRfMwotCWZsb2FkXzAKLQlmbG9hZF8xCi0JZmxvYWRfMgotCWZsb2FkXzMKLQlkbG9hZF8wCi0JZGxvYWRfMQotCWRsb2FkXzIKLQlkbG9hZF8zCi0JYWxvYWRfMAotCWFsb2FkXzEKLQlhbG9hZF8yCi0JYWxvYWRfMwotCWlhbG9hZAotCWxhbG9hZAotCWZhbG9hZAotCWRhbG9hZAotCWFhbG9hZAotCWJhbG9hZAotCWNhbG9hZAotCXNhbG9hZAotCWlzdG9yZSAyMzYKLQlsc3RvcmUgNDEKLQlmc3RvcmUgMjA1Ci0JZHN0b3JlIDE4NgotCWFzdG9yZSAxNzEKLQlpc3RvcmVfMAotCWlzdG9yZV8xCi0JaXN0b3JlXzIKLQlpc3RvcmVfMwotCWxzdG9yZV8wCi0JbHN0b3JlXzEKLQlsc3RvcmVfMgotCWxzdG9yZV8zCi0JZnN0b3JlXzAKLQlmc3RvcmVfMQotCWZzdG9yZV8yCi0JZnN0b3JlXzMKLQlkc3RvcmVfMAotCWRzdG9yZV8xCi0JZHN0b3JlXzIKLQlkc3RvcmVfMwotCWFzdG9yZV8wCi0JYXN0b3JlXzEKLQlhc3RvcmVfMgotCWFzdG9yZV8zCi0JaWFzdG9yZQotCWxhc3RvcmUKLQlmYXN0b3JlCi0JZGFzdG9yZQotCWFhc3RvcmUKLQliYXN0b3JlCi0JY2FzdG9yZQotCXNhc3RvcmUKLQlwb3AKLQlwb3AyCi0JZHVwCi0JZHVwX3gxCi0JZHVwX3gyCi0JZHVwMgotCWR1cDJfeDEKLQlkdXAyX3gyCi0Jc3dhcAotCWlhZGQKLQlsYWRkCi0JZmFkZAotCWRhZGQKLQlpc3ViCi0JbHN1YgotCWZzdWIKLQlkc3ViCi0JaW11bAotCWxtdWwKLQlmbXVsCi0JZG11bAotCWlkaXYKLQlsZGl2Ci0JZmRpdgotCWRkaXYKLQlpcmVtCi0JbHJlbQotCWZyZW0KLQlkcmVtCi0JaW5lZwotCWxuZWcKLQlmbmVnCi0JZG5lZwotCWlzaGwKLQlsc2hsCi0JaXNocgotCWxzaHIKLQlpdXNocgotCWx1c2hyCi0JaWFuZAotCWxhbmQKLQlpb3IKLQlsb3IKLQlpeG9yCi0JbHhvcgotCWlpbmMgMjQyLCAxMjMKLQlpMmwKLQlpMmYKLQlpMmQKLQlsMmkKLQlsMmYKLQlsMmQKLQlmMmkKLQlmMmwKLQlmMmQKLQlkMmkKLQlkMmwKLQlkMmYKLQlpMmIKLQlpMmMKLQlpMnMKLQlsY21wCi0JZmNtcGwKLQlmY21wZwotCWRjbXBsCi0JZGNtcGcKLQlpZmVxIC5MMgotCWlmbmUgLkwxMQotCWlmbHQgLkw4Ci0JaWZnZSAuTDE4Ci0JaWZndCAuTDYKLQlpZmxlIC5MMTAKLQlpZl9pY21wZXEgLkwxMQotCWlmX2ljbXBuZSAuTDE2Ci0JaWZfaWNtcGx0IC5MOQotCWlmX2ljbXBnZSAuTDEzCi0JaWZfaWNtcGd0IC5MOAotCWlmX2ljbXBsZSAuTDEzCi0JaWZfYWNtcGVxIC5MNwotCWlmX2FjbXBuZSAuTDgKLQlnb3RvIC5MNgotCWpzcgotCXJldAotLkx0Ogl0YWJsZXN3aXRjaAotCi0JLmFsaWduIDIKLQkubG9uZyAuTDItLkx0Ci0JLmxvbmcgMQotCS5sb25nIDUKLQkubG9uZyAuTDctLkx0Ci0JLmxvbmcgLkw1LS5MdAotCS5sb25nIC5MMTgtLkx0Ci0JLmxvbmcgLkw3LS5MdAotCS5sb25nIC5MNS0uTHQKLS5MbDoJbG9va3Vwc3dpdGNoCi0KLQkuYWxpZ24gMgotCS5sb25nIC5MNi0uTGwKLQkubG9uZyAyCi0JLmxvbmcgNwotCS5sb25nIC5MMTUtLkxsCi0JLmxvbmcgMzcKLQkubG9uZyAuTDE2LS5MbAotCWlyZXR1cm4KLQlscmV0dXJuCi0JZnJldHVybgotCWRyZXR1cm4KLQlhcmV0dXJuCi0JcmV0dXJuCi0JZ2V0c3RhdGljCi0JcHV0c3RhdGljCi0JZ2V0ZmllbGQKLQlwdXRmaWVsZAotCWludm9rZXZpcnR1YWwKLQlpbnZva2VzcGVjaWFsCi0JaW52b2tlc3RhdGljCi0JaW52b2tlaW50ZXJmYWNlCi0JbmV3Ci0JbmV3YXJyYXkKLQlhbmV3YXJyYXkKLQlhcnJheWxlbmd0aAotCWF0aHJvdwotCWNoZWNrY2FzdAotCWluc3RhbmNlb2YKLQltb25pdG9yZW50ZXIKLQltb25pdG9yZXhpdAotCXdpZGUKLQltdWx0aWFuZXdhcnJheQotCWlmbnVsbAotCWlmbm9ubnVsbAotCWdvdG9fdwotCWpzcl93Ci0JYnJlYWtwb2ludAotCWJ5dGVjb2RlCi0JdHJ5Ci0JZW5kdHJ5Ci0JY2F0Y2gKLQl2YXIKLQllbmR2YXIKLQlzZXRoaSAtMjAzMTcKLQlsb2FkX3dvcmRfaW5kZXggOTAsIC05MQotCWxvYWRfc2hvcnRfaW5kZXggOTMsIC0xMjMKLQlsb2FkX2NoYXJfaW5kZXggMjMsIC00MAotCWxvYWRfYnl0ZV9pbmRleCAyMzMsIC0zNAotCWxvYWRfdWJ5dGVfaW5kZXggMjEyLCA0MwotCXN0b3JlX3dvcmRfaW5kZXggMTc4LCA3NwotCW5hX3N0b3JlX3dvcmRfaW5kZXggMTk4LCAyNwotCXN0b3JlX3Nob3J0X2luZGV4IDE4MCwgLTQ0Ci0Jc3RvcmVfYnl0ZV9pbmRleCAxNywgLTExNAotCWxvYWRfdWJ5dGUKLQlsb2FkX2J5dGUKLQlsb2FkX2NoYXIKLQlsb2FkX3Nob3J0Ci0JbG9hZF93b3JkCi0JcHJpdl9yZXRfZnJvbV90cmFwCi0JcHJpdl9yZWFkX2RjYWNoZV90YWcKLQlwcml2X3JlYWRfZGNhY2hlX2RhdGEKLQlsb2FkX2NoYXJfb2UKLQlsb2FkX3Nob3J0X29lCi0JbG9hZF93b3JkX29lCi0JcmV0dXJuMAotCXByaXZfcmVhZF9pY2FjaGVfdGFnCi0JcHJpdl9yZWFkX2ljYWNoZV9kYXRhCi0JbmNsb2FkX3VieXRlCi0JbmNsb2FkX2J5dGUKLQluY2xvYWRfY2hhcgotCW5jbG9hZF9zaG9ydAotCW5jbG9hZF93b3JkCi0JaXVjbXAKLQlwcml2X3Bvd2VyZG93bgotCWNhY2hlX2ludmFsaWRhdGUKLQluY2xvYWRfY2hhcl9vZQotCW5jbG9hZF9zaG9ydF9vZQotCW5jbG9hZF93b3JkX29lCi0JcmV0dXJuMQotCWNhY2hlX2ZsdXNoCi0JY2FjaGVfaW5kZXhfZmx1c2gKLQlzdG9yZV9ieXRlCi0Jc3RvcmVfc2hvcnQKLQlzdG9yZV93b3JkCi0Jc29mdF90cmFwCi0JcHJpdl93cml0ZV9kY2FjaGVfdGFnCi0JcHJpdl93cml0ZV9kY2FjaGVfZGF0YQotCXN0b3JlX3Nob3J0X29lCi0Jc3RvcmVfd29yZF9vZQotCXJldHVybjIKLQlwcml2X3dyaXRlX2ljYWNoZV90YWcKLQlwcml2X3dyaXRlX2ljYWNoZV9kYXRhCi0JbmNzdG9yZV9ieXRlCi0JbmNzdG9yZV9zaG9ydAotCW5jc3RvcmVfd29yZAotCXByaXZfcmVzZXQKLQlnZXRfY3VycmVudF9jbGFzcwotCW5jc3RvcmVfc2hvcnRfb2UKLQluY3N0b3JlX3dvcmRfb2UKLQljYWxsCi0JemVyb19saW5lCi0JcHJpdl91cGRhdGVfb3B0b3AKLQlyZWFkX3BjCi0JcmVhZF92YXJzCi0JcmVhZF9mcmFtZQotCXJlYWRfb3B0b3AKLQlwcml2X3JlYWRfb3BsaW0KLQlyZWFkX2NvbnN0X3Bvb2wKLQlwcml2X3JlYWRfcHNyCi0JcHJpdl9yZWFkX3RyYXBiYXNlCi0JcHJpdl9yZWFkX2xvY2tjb3VudDAKLQlwcml2X3JlYWRfbG9ja2NvdW50MQotCXByaXZfcmVhZF9sb2NrYWRkcjAKLQlwcml2X3JlYWRfbG9ja2FkZHIxCi0JcHJpdl9yZWFkX3VzZXJyYW5nZTEKLQlwcml2X3JlYWRfZ2NfY29uZmlnCi0JcHJpdl9yZWFkX2JyazFhCi0JcHJpdl9yZWFkX2JyazJhCi0JcHJpdl9yZWFkX2JyazEyYwotCXByaXZfcmVhZF91c2VycmFuZ2UyCi0JcHJpdl9yZWFkX3ZlcnNpb25pZAotCXByaXZfcmVhZF9oY3IKLQlwcml2X3JlYWRfc2NfYm90dG9tCi0JcmVhZF9nbG9iYWwwCi0JcmVhZF9nbG9iYWwxCi0JcmVhZF9nbG9iYWwyCi0JcmVhZF9nbG9iYWwzCi0Jd3JpdGVfcGMKLQl3cml0ZV92YXJzCi0Jd3JpdGVfZnJhbWUKLQl3cml0ZV9vcHRvcAotCXByaXZfd3JpdGVfb3BsaW0KLQl3cml0ZV9jb25zdF9wb29sCi0JcHJpdl93cml0ZV9wc3IKLQlwcml2X3dyaXRlX3RyYXBiYXNlCi0JcHJpdl93cml0ZV9sb2NrY291bnQwCi0JcHJpdl93cml0ZV9sb2NrY291bnQxCi0JcHJpdl93cml0ZV9sb2NrYWRkcjAKLQlwcml2X3dyaXRlX2xvY2thZGRyMQotCXByaXZfd3JpdGVfdXNlcnJhbmdlMQotCXByaXZfd3JpdGVfZ2NfY29uZmlnCi0JcHJpdl93cml0ZV9icmsxYQotCXByaXZfd3JpdGVfYnJrMmEKLQlwcml2X3dyaXRlX2JyazEyYwotCXByaXZfd3JpdGVfdXNlcnJhbmdlMgotCXByaXZfd3JpdGVfc2NfYm90dG9tCi0Jd3JpdGVfZ2xvYmFsMAotCXdyaXRlX2dsb2JhbDEKLQl3cml0ZV9nbG9iYWwyCi0Jd3JpdGVfZ2xvYmFsMwotCXRtX3B1dGNoYXIKLQl0bV9leGl0Ci0JdG1fdHJhcAotCXRtX21pbmZvCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9wai9wai5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9wai9wai5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTQwMzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovcGouZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jCi0jIFNvbWUgcGogdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBwaipdIHRoZW4gewotICAgIHJ1bl9kdW1wX3Rlc3QgIm9wcyIKLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFhYjU1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSNvYmpkdW1wOiAtRHIKLSNuYW1lOiBQb3dlclBDIHRlc3QgMQotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLXBvd2VycGMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0KLTArMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTYwIDAwIDAwIDAwIAlub3AKLSAgIDQ6CTYwIDAwIDAwIDAwIAlub3AKLSAgIDg6CTYwIDAwIDAwIDAwIAlub3AKLQotMCswMDAwMDBjIDxhPjoKLSAgIGM6CTQ4IDAwIDAwIDA0IAliCTEwIDxhcGZvdXI+Ci0KLTArMDAwMDAxMCA8YXBmb3VyPjoKLSAgMTA6CTQ4IDAwIDAwIDA4IAliCTE4IDxhcGZvdXJcKzB4OD4KLSAgMTQ6CTQ4IDAwIDAwIDAwIAliCTE0IDxhcGZvdXJcKzB4ND4KLQkJCTE0OiBSX1BQQ19SRUwyNAl4Ci0gIDE4Ogk0OCAwMCAwMCAwNCAJYgkxYyA8YXBmb3VyXCsweGM+Ci0JCQkxODogUl9QUENfUkVMMjQJXC5kYXRhXCsweDQKLSAgMWM6CTQ4IDAwIDAwIDAwIAliCTFjIDxhcGZvdXJcKzB4Yz4KLQkJCTFjOiBSX1BQQ19SRUwyNAl6Ci0gIDIwOgk0OCAwMCAwMCAxNCAJYgkzNCA8YXBmb3VyXCsweDI0PgotCQkJMjA6IFJfUFBDX1JFTDI0CXpcKzB4MTQKLSAgMjQ6CTQ4IDAwIDAwIDA0IAliCTI4IDxhcGZvdXJcKzB4MTg+Ci0gIDI4Ogk0OCAwMCAwMCAwMCAJYgkyOCA8YXBmb3VyXCsweDE4PgotCQkJMjg6IFJfUFBDX1JFTDI0CWEKLSAgMmM6CTRiIGZmIGZmIGU0IAliCTEwIDxhcGZvdXI+Ci0gIDMwOgk0OCAwMCAwMCAwNCAJYgkzNCA8YXBmb3VyXCsweDI0PgotCQkJMzA6IFJfUFBDX1JFTDI0CWFcKzB4NAotICAzNDoJNGIgZmYgZmYgZTAgCWIJMTQgPGFwZm91clwrMHg0PgotICAzODoJNDggMDAgMDAgMDAgCWIJMzggPGFwZm91clwrMHgyOD4KLQkJCTM4OiBSX1BQQ19MT0NBTDI0UEMJYQotICAzYzoJNGIgZmYgZmYgZDQgCWIJMTAgPGFwZm91cj4KLQotICA0MDoJMDAgMDAgMDAgNDAgCVwubG9uZyAweDQwCi0JCQk0MDogUl9QUENfQUREUjMyCVwudGV4dFwrMHg0MAotCi0gIDQ0OgkwMCAwMCAwMCA0YyAJXC5sb25nIDB4NGMKLQkJCTQ0OiBSX1BQQ19BRERSMzIJXC50ZXh0XCsweDRjCi0gIDQ4OgkwMCAwMCAwMCAwMCAJXC5sb25nIDB4MAotCQkJNDg6IFJfUFBDX1JFTDMyCXgKLSAgNGM6CTAwIDAwIDAwIDA0IAlcLmxvbmcgMHg0Ci0JCQk0YzogUl9QUENfUkVMMzIJeFwrMHg0Ci0JXC5cLlwuCi0JCQk1MDogUl9QUENfUkVMMzIJegotCQkJNTQ6IFJfUFBDX1JFTDMyCXkKLQkJCTU4OiBSX1BQQ19BRERSMzIJeAotCQkJNWM6IFJfUFBDX0FERFIzMgl5Ci0JCQk2MDogUl9QUENfQUREUjMyCXoKLSAgNjQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2NDogUl9QUENfQUREUjMyCXhcKzB4ZitmZmZmZmZjCi0gIDY4OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjg6IFJfUFBDX0FERFIzMgl5XCsweGYrZmZmZmZmYwotICA2YzoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTZjOiBSX1BQQ19BRERSMzIJelwrMHhmK2ZmZmZmZmMKLSAgNzA6CWZmIGZmIGZmIDljIAlcLmxvbmcgMHhmZmZmZmY5YwotICA3NDoJZmYgZmYgZmYgOWMgCVwubG9uZyAweGZmZmZmZjljCi0JXC5cLlwuCi0JCQk3ODogUl9QUENfQUREUjMyCWEKLQkJCTdjOiBSX1BQQ19BRERSMzIJYgotCQkJODA6IFJfUFBDX0FERFIzMglhcGZvdXIKLSAgODQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0gIDg4OgkwMCAwMCAwMCAwMiAJXC5sb25nIDB4MgotCQkJODg6IFJfUFBDX0FERFIzMglhcGZvdXJcKzB4MgotICA4YzoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC5kYXRhOgotCi0wKzAwMDAwMDAgPHg+OgotICAgMDoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKLQotMCswMDAwMDA0IDx5PjoKLSAgIDQ6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWYyMTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotCS5zZWN0aW9uICIuZGF0YSIKLQkuZ2xvYmwgeAotCS5nbG9ibCB6Ci14OgkubG9uZyAwCi16CT0gLiArIDQKLWZvdXIJPSB6IC0geCAtIDQKLXk6CS5sb25nIDAKLQkKLQkuc2VjdGlvbiAiLnRleHQiCi1mb286CQotCW5vcCA7IG5vcCA7IG5vcAotCS5nbG9ibCBhCi1hOgliIC4rNAotYjoJYiAuKzgKLQliIHgKLQliIHkKLQliIHoKLQliIHorMjAKLQliIC4rZm91cgotCWIgYQotCWIgYgotCWIgYSs0Ci0JYiBiKzQKLQliIGFAbG9jYWwKLQliIGJAbG9jYWwKLQkubG9uZyAuCi0JLmxvbmcgLis4Ci0JLmxvbmcgeC0uCi0JLmxvbmcgeCs0LS4KLQkubG9uZyB6LS4KLQkubG9uZyB5LS4KLQkubG9uZyB4Ci0JLmxvbmcgeQotCS5sb25nIHoKLQkubG9uZyB4LWZvdXIKLQkubG9uZyB5LWZvdXIKLQkubG9uZyB6LWZvdXIKLQkubG9uZyBhLS4KLQkubG9uZyBiLS4KLQkubG9uZyBhCi0JLmxvbmcgYgotCi1hcGZvdXIJPSBhICsgZm91cgotCS5sb25nIGFwZm91cgotCS5sb25nIGEtYXBmb3VyCi0JLmxvbmcgYXBmb3VyKzIKLQkubG9uZyBhcGZvdXItYgotCi0JLnR5cGUJZm9vLEBmdW5jdGlvbgotCS50eXBlCWEsQGZ1bmN0aW9uCi0JLnR5cGUJYixAZnVuY3Rpb24KLQkudHlwZQlhcGZvdXIsQGZ1bmN0aW9uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0Mi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwZTNiZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0Mi5kCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotI29iamR1bXA6IC1EcgotI25hbWU6IFBvd2VyUEMgdGVzdCAyCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItcG93ZXJwYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAwMDAgPGZvbz46Ci0gICAwOgk2MCAwMCAwMCAwMCAJbm9wCi0gICA0Ogk2MCAwMCAwMCAwMCAJbm9wCi0gICA4Ogk2MCAwMCAwMCAwMCAJbm9wCi0gICBjOgk0OCAwMCAwMCAwNCAJYgkxMCA8Zm9vXCsweDEwPgotICAxMDoJNDggMDAgMDAgMDggCWIJMTggPGZvb1wrMHgxOD4KLSAgMTQ6CTQ4IDAwIDAwIDAwIAliCTE0IDxmb29cKzB4MTQ+Ci0JCQkxNDogUl9QUENfUkVMMjQJeAotICAxODoJNDggMDAgMDAgMDQgCWIJMWMgPGZvb1wrMHgxYz4KLQkJCTE4OiBSX1BQQ19SRUwyNAkuZGF0YVwrMHg0Ci0gIDFjOgk0OCAwMCAwMCAwMCAJYgkxYyA8Zm9vXCsweDFjPgotCQkJMWM6IFJfUFBDX1JFTDI0CXoKLSAgMjA6CTQ4IDAwIDAwIDE0IAliCTM0IDxmb29cKzB4MzQ+Ci0JCQkyMDogUl9QUENfUkVMMjQJelwrMHgxNAotICAyNDoJNDggMDAgMDAgMDQgCWIJMjggPGZvb1wrMHgyOD4KLSAgMjg6CTQ4IDAwIDAwIDAwIAliCTI4IDxmb29cKzB4Mjg+Ci0JCQkyODogUl9QUENfUkVMMjQJYQotICAyYzoJNDggMDAgMDAgNTAgCWIJN2MgPGFwZm91cj4KLSAgMzA6CTQ4IDAwIDAwIDA0IAliCTM0IDxmb29cKzB4MzQ+Ci0JCQkzMDogUl9QUENfUkVMMjQJYVwrMHg0Ci0gIDM0Ogk0OCAwMCAwMCA0YyAJYgk4MCA8YXBmb3VyXCsweDQ+Ci0gIDM4Ogk0OCAwMCAwMCAwMCAJYgkzOCA8Zm9vXCsweDM4PgotCQkJMzg6IFJfUFBDX0xPQ0FMMjRQQwlhCi0gIDNjOgk0OCAwMCAwMCA0MCAJYgk3YyA8YXBmb3VyPgotCi0gIDQwOgkwMCAwMCAwMCA0MCAJLmxvbmcgMHg0MAotCQkJNDA6IFJfUFBDX0FERFIzMgkudGV4dFwrMHg0MAotCi0gIDQ0OgkwMCAwMCAwMCA0YyAJLmxvbmcgMHg0YwotCQkJNDQ6IFJfUFBDX0FERFIzMgkudGV4dFwrMHg0YwotICA0ODoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotCQkJNDg6IFJfUFBDX1JFTDMyCXgKLSAgNGM6CTAwIDAwIDAwIDA0IAkubG9uZyAweDQKLQkJCTRjOiBSX1BQQ19SRUwzMgl4XCsweDQKLQkuLi4KLQkJCTUwOiBSX1BQQ19SRUwzMgl6Ci0JCQk1NDogUl9QUENfUkVMMzIJeQotCQkJNTg6IFJfUFBDX0FERFIzMgl4Ci0JCQk1YzogUl9QUENfQUREUjMyCXkKLQkJCTYwOiBSX1BQQ19BRERSMzIJegotICA2NDoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTY0OiBSX1BQQ19BRERSMzIJeFwrMHhmK2ZmZmZmZmMKLSAgNjg6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2ODogUl9QUENfQUREUjMyCXlcKzB4ZitmZmZmZmZjCi0gIDZjOglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNmM6IFJfUFBDX0FERFIzMgl6XCsweGYrZmZmZmZmYwotICA3MDoJMDAgMDAgMDAgMDggCS5sb25nIDB4OAotICA3NDoJMDAgMDAgMDAgMDggCS5sb25nIDB4OAotCi0wKzAwMDAwNzggPGE+OgotICA3ODoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotCQkJNzg6IFJfUFBDX0FERFIzMglhCi0KLTArMDAwMDA3YyA8YXBmb3VyPjoKLQkuLi4KLQkJCTdjOiBSX1BQQ19BRERSMzIJYgotCQkJODA6IFJfUFBDX0FERFIzMglhcGZvdXIKLSAgODQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0gIDg4OgkwMCAwMCAwMCAwMiAJLmxvbmcgMHgyCi0JCQk4ODogUl9QUENfQUREUjMyCWFwZm91clwrMHgyCi0gIDhjOgkwMCAwMCAwMCAwMCAJLmxvbmcgMHgwCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC5kYXRhOgotCi0wKzAwMDAwMDAgPHg+OgotICAgMDoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotCi0wKzAwMDAwMDQgPHk+OgotICAgNDoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjIyMzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLWZvdXIJPSA0Ci0JLnNlY3Rpb24gIi50ZXh0IgotZm9vOgkKLQlub3AgOyBub3AgOyBub3AKLQkuZ2xvYmwgYQotCWIgLis0Ci0JYiAuKzgKLQliIHgKLQliIHkKLQliIHoKLQliIHorMjAKLQliIC4rZm91cgotCWIgYQotCWIgYgotCWIgYSs0Ci0JYiBiKzQKLQliIGFAbG9jYWwKLQliIGJAbG9jYWwKLQkubG9uZyAuCi0JLmxvbmcgLis4Ci0JLmxvbmcgeC0uCi0JLmxvbmcgeCs0LS4KLQkubG9uZyB6LS4KLQkubG9uZyB5LS4KLQkubG9uZyB4Ci0JLmxvbmcgeQotCS5sb25nIHoKLQkubG9uZyB4LWZvdXIKLQkubG9uZyB5LWZvdXIKLQkubG9uZyB6LWZvdXIKLQkubG9uZyBhLS4KLQkubG9uZyBiLS4KLWE6CS5sb25nIGEKLWI6CS5sb25nIGIKLQotYXBmb3VyCT0gYSArIGZvdXIKLQkubG9uZyBhcGZvdXIKLQkubG9uZyBhLWFwZm91cgotCS5sb25nIGFwZm91cisyCi0JLmxvbmcgYXBmb3VyLWIKLQotCS5zZWN0aW9uICIuZGF0YSIKLQkuZ2xvYmwgeAotCS5nbG9ibCB6Ci14OgkubG9uZyAwCi16CT0gLiArIDQKLXk6CS5sb25nIDAKLQotCS50eXBlCWZvbyxAZnVuY3Rpb24KLQkudHlwZQlhLEBmdW5jdGlvbgotCS50eXBlCWIsQGZ1bmN0aW9uCi0JLnR5cGUJYXBmb3VyLEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvcHBjLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyZmJjMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvcHBjLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgU29tZSBQb3dlclBDIHRlc3RzCi0jCi0KLSMgVGhlc2UgdGVzdHMgYXJlIGN1cnJlbnRseSBFTEYgc3BlY2lmaWMsIG9ubHkgYmVjYXVzZSBub2JvZHkgaGFzCi0jIGNvbnZlcnRlZCB0aGVtIHRvIGxvb2sgZm9yIFhDT0ZGIHJlbG9jYXRpb25zLgotCi1pZiB7IFtpc3RhcmdldCBwb3dlcnBjKi0qLSpic2QqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWVsZipdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotZWFiaSpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotc3lzdjQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWxpbnV4Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1zb2xhcmlzKl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1ydGVtcypdIH0gdGhlbiB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYXN0ZXN0IgotICAgIHJ1bl9kdW1wX3Rlc3QgImFzdGVzdDIiCi19Ci0KLWlmIHsgW2lzdGFyZ2V0IHBvd2VycGMqLSotKl0gfSB0aGVuIHsKLSAgIHJ1bl9kdW1wX3Rlc3QgInNpbXBzaGZ0IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4OTNkNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSNvYmpkdW1wOiAtcyAtaiAudGV4dAotI2FzOiAtbXBwYzY0Ci0jbmFtZTogUG93ZXJQQyB0ZXN0IDMsIHNpbXBsaWZpZWQgc2hpZnRzCi0KLS4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC50ZXh0OgotIDAwMDAgNzg2NDBmZTAgNzg4M2Y4MGUgNzhhNTQ1ZTQgNzg2NDAwMjAgIHhkLi54Li4ueC5FLnhkLiAKLSAwMDEwIDU0NjQwZmZlIDUwODNmODAwIDU0YTU0MDJlIDU0NjQwNDNlICBUZC4uUC4uLlQuQC5UZC4+Ci0gMDAyMCA3ODY0MDAwNCA3ODY0MDdlNCA3ODY0ZjgwNiA3ODY0ZmZlNiAgeGQuLnhkLi54ZC4ueGQuLgotIDAwMzAgNzg2NGY4NDIgNzg2NGZmZTIgNzg2NDAwMGMgNzg2NDA4MGMgIHhkLkJ4ZC4ueGQuLnhkLi4KLSAwMDQwIDc4NjQwZmFjIDc4NjQwN2VjIDc4NjQwMDAwIDc4NjQwODAwICB4ZC4ueGQuLnhkLi54ZC4uCi0gMDA1MCA3ODY0ZjgwMiA3ODY0MDAwMCA3ODY0ZjgwMiA3ODY0MDgwMCAgeGQuLnhkLi54ZC4ueGQuLgotIDAwNjAgNzg2NTIwMTAgNzg2NDA3ZTQgNzg2NGY4MDYgNzg2NDAwMDAgIHhlIC54ZC4ueGQuLnhkLi4KLSAwMDcwIDc4NjRmODQyIDc4NjQwZmUwIDc4NjQwMDAwIDc4NjQwMDQwICB4ZC5CeGQuLnhkLi54ZC5ACi0gMDA4MCA3ODY0MDdlMCA3ODY0MDdlNCA3ODY0MDdhNCA3ODY0MDAwNCAgeGQuLnhkLi54ZC4ueGQuLgotIDAwOTAgNzg2NDAwMDggNzg2NDAwNDggNzg2NDA3ZTggNzg2NDBmYTggIHhkLi54ZC5IeGQuLnhkLi4KLSAwMGEwIDc4NjRmODBhIDU0NjQwMDAwIDU0NjQwMDNlIDU0NjRmODAwICB4ZC4uVGQuLlRkLj5UZC4uCi0gMDBiMCA1NDY0ZjgzZSA1NDY0Zjg3ZSA1NDY0ZmZmZSA1MDY0MDAwMCAgVGQuPlRkLn5UZC4uUGQuLgotIDAwYzAgNTA2NDAwM2UgNTA2NDBmZmUgNTA2NGY4MDAgNTA2NDAwM2UgIFBkLj5QZC4uUGQuLlBkLj4KLSAwMGQwIDUwNjQwN2ZlIDU0NjQwMDNlIDU0NjQwODNlIDU0NjRmODNlICBQZC4uVGQuPlRkLj5UZC4+Ci0gMDBlMCA1NDY0MDAzZSA1NDY0ZjgzZSA1NDY0MDgzZSA1YzY1MjAzZSAgVGQuPlRkLj5UZC4+XFxlID4KLSAwMGYwIDU0NjQwMDNlIDU0NjQwODNjIDU0NjRmODAwIDU0NjQwMDNlICBUZC4+VGQuPFRkLi5UZC4+Ci0gMDEwMCA1NDY0Zjg3ZSA1NDY0MGZmZSA1NDY0MDAzZSA1NDY0MDA3ZSAgVGQuflRkLi5UZC4+VGQufgotIDAxMTAgNTQ2NDA3ZmUgNTQ2NDAwM2UgNTQ2NDAwM2MgNTQ2NDAwMDAgIFRkLi5UZC4+VGQuPFRkLi4KLSAwMTIwIDU0NjQwMDNlIDU0NjQwMDdlIDU0NjQwN2ZlIDU0NjQwZmJjICBUZC4+VGQuflRkLi5UZC4uCi0gMDEzMCA1NDY0ZjgwMCAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgVGQuLi4uLi4gICAgICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmZjk4ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQucworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jIFRoZXNlIGFyZSBhbGwgdGhlIGV4YW1wbGVzIGZyb20gc2VjdGlvbiBGLjQgb2YKLSMgIlBvd2VyUEMgTWljcm9wcm9jZXNzb3IgRmFtaWx5OiBUaGUgUHJvZ3JhbW1pbmcgRW52aXJvbm1lbnRzIi4KLSMgNjQtYml0IGV4YW1wbGVzCi0JZXh0cmRpCSVyNCwlcjMsMSwwCi0JaW5zcmRpCSVyMywlcjQsMSwwCi0Jc2xkaQklcjUsJXI1LDgKLQljbHJsZGkJJXI0LCVyMywzMgotIyAzMi1iaXQgZXhhbXBsZXMKLQlleHRyd2kJJXI0LCVyMywxLDAKLQlpbnNyd2kJJXIzLCVyNCwxLDAKLQlzbHdpCSVyNSwlcjUsOAotCWNscmx3aQklcjQsJXIzLDE2Ci0KLQotIyBUaGVzZSB0ZXN0IHRoZSByZW1haW5pbmcgY29ybmVyIGNhc2VzIGZvciA2NC1iaXQgb3BlcmF0aW9ucy4KLQlleHRsZGkJJXI0LCVyMywxLDAKLQlleHRsZGkJJXI0LCVyMyw2NCwwCi0JZXh0bGRpCSVyNCwlcjMsMSw2MwotCWV4dGxkaQklcjQsJXIzLDY0LDYzICAgICMgYml0IHdlaXJkLCB0aGF0IG9uZS4KLQkKLQlleHRyZGkJJXI0LCVyMyw2MywwCi0JZXh0cmRpCSVyNCwlcjMsMSw2MgotCi0JaW5zcmRpCSVyNCwlcjMsNjQsMAotCWluc3JkaQklcjQsJXIzLDYzLDAKLQlpbnNyZGkJJXI0LCVyMywxLDYyCi0JaW5zcmRpCSVyNCwlcjMsMSw2MwotCi0Jcm90bGRpCSVyNCwlcjMsMAotCXJvdGxkaQklcjQsJXIzLDEKLQlyb3RsZGkJJXI0LCVyMyw2MwotCi0Jcm90cmRpCSVyNCwlcjMsMAotCXJvdHJkaQklcjQsJXIzLDEKLQlyb3RyZGkJJXI0LCVyMyw2MwotCi0Jcm90bGQJJXI1LCVyMywlcjQKLQotCXNsZGkJJXI0LCVyMywwCi0Jc2xkaQklcjQsJXIzLDYzCi0KLQlzcmRpCSVyNCwlcjMsMAotCXNyZGkJJXI0LCVyMywxCi0Jc3JkaQklcjQsJXIzLDYzCi0KLQljbHJsZGkJJXI0LCVyMywwCi0JY2xybGRpCSVyNCwlcjMsMQotCWNscmxkaQklcjQsJXIzLDYzCi0KLQljbHJyZGkJJXI0LCVyMywwCi0JY2xycmRpCSVyNCwlcjMsMQotCWNscnJkaQklcjQsJXIzLDYzCi0JCi0JY2xybHNsZGkJJXI0LCVyMywwLDAKLQljbHJsc2xkaQklcjQsJXIzLDEsMAotCWNscmxzbGRpCSVyNCwlcjMsNjMsMAotCWNscmxzbGRpCSVyNCwlcjMsNjMsMQotCWNscmxzbGRpCSVyNCwlcjMsNjMsNjMKLQkKLSMgVGhlc2UgdGVzdCB0aGUgcmVtYWluaW5nIGNvcm5lciBjYXNlcyBmb3IgMzItYml0IG9wZXJhdGlvbnMuCi0JZXh0bHdpCSVyNCwlcjMsMSwwCi0JZXh0bHdpCSVyNCwlcjMsMzIsMAotCWV4dGx3aQklcjQsJXIzLDEsMzEKLQlleHRsd2kJJXI0LCVyMywzMiwzMSAgICAjIGJpdCB3ZWlyZCwgdGhhdCBvbmUuCi0JCi0JZXh0cndpCSVyNCwlcjMsMzEsMAotCWV4dHJ3aQklcjQsJXIzLDEsMzAKLQkKLQlpbnNsd2kJJXI0LCVyMywxLDAKLQlpbnNsd2kJJXI0LCVyMywzMiwwCi0JaW5zbHdpCSVyNCwlcjMsMSwzMQotCQotCWluc3J3aQklcjQsJXIzLDEsMAotCWluc3J3aQklcjQsJXIzLDMyLDAKLQlpbnNyd2kJJXI0LCVyMywxLDMxCi0JCi0Jcm90bHdpCSVyNCwlcjMsMAotCXJvdGx3aQklcjQsJXIzLDEKLQlyb3Rsd2kJJXI0LCVyMywzMQotCi0Jcm90cndpCSVyNCwlcjMsMAotCXJvdHJ3aQklcjQsJXIzLDEKLQlyb3Ryd2kJJXI0LCVyMywzMQotCi0Jcm90bHcJJXI1LCVyMywlcjQKLQotCXNsd2kJJXI0LCVyMywwCi0Jc2x3aQklcjQsJXIzLDEKLQlzbHdpCSVyNCwlcjMsMzEKLQotCXNyd2kJJXI0LCVyMywwCi0Jc3J3aQklcjQsJXIzLDEKLQlzcndpCSVyNCwlcjMsMzEKLQotCWNscmx3aQklcjQsJXIzLDAKLQljbHJsd2kJJXI0LCVyMywxCi0JY2xybHdpCSVyNCwlcjMsMzEKLQotCWNscnJ3aQklcjQsJXIzLDAKLQljbHJyd2kJJXI0LCVyMywxCi0JY2xycndpCSVyNCwlcjMsMzEKLQkKLQljbHJsc2x3aQklcjQsJXIzLDAsMAotCWNscmxzbHdpCSVyNCwlcjMsMSwwCi0JY2xybHNsd2kJJXI0LCVyMywzMSwwCi0JY2xybHNsd2kJJXI0LCVyMywzMSwxCi0JY2xybHNsd2kJJXI0LCVyMywzMSwzMQotCi0jIEZvcmNlIGFsaWdubWVudCBzbyB0aGF0IHdlIHBhc3MgdGhlIHRlc3Qgb24gQUlYCi0JLnAyYWxpZ24JMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvYmFzaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGRiYjBiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2ZwIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwLnM6IGZsb2F0aW5nIHBvaW50IHRlc3RzIChzaDNlKSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjAwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjAwOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjAwQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjAwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjEwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjA4RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjA5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjEwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjEwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjEwM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjEwRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjEwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRjEwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjA0RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjA1RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjA2RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjAyRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjAzRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRjAwRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjAxRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgNDM1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgNDM1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgNDM2QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgNDM2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgMDM1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggNDM1MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2EgMDM2QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgNDM2MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotaWYgW2lzdGFyZ2V0IHNoKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgotICAgIGRvX2ZwCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9mcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUyZDg2NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9mcC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCS5maWxlCSJ0ZXN0LmMiCi0JLmRhdGEKLQotISBIaXRhY2hpIFNIIGNjMSAoY3lnbnVzLTIuNy4xLTk1MDcyOCkgYXJndW1lbnRzOiAtTyAtZnBlZXBob2xlCi0hIC1mZnVuY3Rpb24tY3NlIC1mcmVnLXN0cnVjdC1yZXR1cm4gLWZkZWxheWVkLWJyYW5jaCAtZmNvbW1vbiAtZmdudS1saW5rZXIKLQotZ2NjMl9jb21waWxlZC46Ci1fX19nbnVfY29tcGlsZWRfYzoKLQkudGV4dAotCS5hbGlnbiAyCi0JLmdsb2JhbAlfZm9vCi1fZm9vOgotCWZtb3YucwlAcjAsZnIwCi0JZm1vdi5zCWZyMCxAcjAKLQlmbW92LnMJQHIwKyxmcjAKLQlmbW92LnMJZnIwLEAtcjAKLQlmbW92LnMJQChyMCxyMCksZnIwCi0JZm1vdi5zCWZyMCxAKHIwLHIwKQotCWZtb3YJZnIwLGZyMQotCWZsZGkwCWZyMAotCWZsZGkxCWZyMAotCWZhZGQJZnIwLGZyMQotCWZzdWIJZnIwLGZyMQotCWZtdWwJZnIwLGZyMQotCWZkaXYJZnIwLGZyMQotCWZtYWMJZnIwLGZyMCxmcjEKLQlmY21wL2VxCWZyMCxmcjEKLQlmY21wL2d0CWZyMCxmcjEKLQlmbmVnCWZyMAotCWZhYnMJZnIwCi0JZnNxcnQJZnIwCi0JZmxvYXQJZnB1bCxmcjAKLQlmdHJjCWZyMCxmcHVsCi0JZnN0cwlmcHVsLGZyMAotCWZsZHMJZnIwLGZwdWwKLQlsZHMJcjMsZnB1bAotCWxkcy5sCUByMyssZnB1bAotCWxkcwlyMyxmcHNjcgotCWxkcy5sCUByMyssZnBzY3IKLQlzdHMJZnB1bCxyMwotCXN0cy5sCWZwdWwsQC1yMwotCXN0cwlmcHNjcixyMwotCXN0cy5sCWZwc2NyLEAtcjMKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzgzOGM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgU29sYXJpcyBvbiBTUEFSQyB0ZXN0cwotIwotCi1pZiBbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXSB0aGVuIHsKLSAgICBzZXQgeDEgMAotICAgIHNldCB4MiAwCi0gICAgc2V0IHgzIDAKLSAgICBzZXQgeDQgMAotICAgIHNldCB4NSAwCi0gICAgc2V0IHg2IDAKLSAgICBzZXQgdGVzdG5hbWUgImFkZGVuZHMgKHBhcnQgMikiCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYWRkZW5kLnMiICIiICJhZGRlbmRzIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0Jd2hpbGUgMSB7Ci0JICAgICMgVGhlc2UgYXJlIHdoYXQgd2UgZ2V0IHVzaW5nIHRoZSBTb2xhcmlzIGFzc2VtYmxlci4KLQkgICAgZXhwZWN0IHsKLQkJLXJlICIwOCBSX1NQQVJDX1dESVNQMjIgK2ZvbzFcWytcXSsweDArMDRcW15cblxdKlxuIgl7IGluY3IgeDEgfQotCQktcmUgIjBjIFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbK1xdKzB4MCswNFxbXlxuXF0qXG4iCXsgaW5jciB4MiB9Ci0JCS1yZSAiMTAgUl9TUEFSQ19XRElTUDIyICtmb28xXFteXG5cXSpcbiIJCXsgaW5jciB4MyB9Ci0JCS1yZSAiMTQgUl9TUEFSQ19XRElTUDIyICtmb28xXFteXG5cXSpcbiIJCXsgaW5jciB4NCB9Ci0JCS1yZSAiMWMgUl9TUEFSQ18zMiArZm9vMVxbXlxuXF0qXG4iCQkJeyBpbmNyIHg1IH0KLQkJLXJlICIyMCBSX1NQQVJDXzMyICtmb28xXFsrXF0rMHgwKzA0XFteXG5cXSpcbiIJCXsgaW5jciB4NiB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQlvYmpkdW1wX2ZpbmlzaAotCWlmIFthbGxfb25lcyAkeDEgJHgyICR4MyAkeDQgJHg1ICR4Nl0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWIxMDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuZ2xvYmFsIGZvbwotZm9vOgotCW5vcAotCW5vcAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMSsweDQKLQliYSBmb28xCi0JYmEgZm9vMQotCW5vcAotCS53b3JkIGZvbzEKLQkud29yZCBmb28xKzQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvZ2FzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvZ2FzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhZjY5MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jCi0jIFNvbGFyaXMtMiBvbiBTUEFSQyB0ZXN0cwotIwotIyBUaGUgdHdvIGNvbXBpbGVycywgY2MgYW5kIGdjYywgZ2VuZXJhdGUgcXVpdGUgZGlmZmVyZW50IGRlYnVnZ2luZwotIyByZWNvcmRzLiAgVmVyaWZ5IHRoYXQgd2UgY2FuIGFjY2VwdCBib3RoLgotIwotaWYgW2lzdGFyZ2V0IHNwYXJjLSotc29sYXJpczIqXSB0aGVuIHsKLSAgICBnYXNfdGVzdCAic29sLWNjLnMiICAiIiAkc3Rkb3B0bGlzdCAiU1BBUkMgU29sYXJpcyBjYyAtZyIKLSAgICBnYXNfdGVzdCAic29sLWdjYy5zIiAiIiAkc3Rkb3B0bGlzdCAiU1BBUkMgU29sYXJpcyBnY2MgLWciCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1jYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyNTBkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1jYy5zCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotCS5zZWN0aW9uICIudGV4dCIJCQkhIFtpbnRlcm5hbF0KLQkucHJvYwk0Ci0JLmdsb2JhbAltYWluCi0JLmFsaWduCTQKLQkuZ2xvYmFsCW1haW4KLW1haW46Ci0hI1BST0xPR1VFIyAwCi0hI1BST0xPR1VFIyAxCi0Jc2F2ZQklc3AsLTk2LCVzcAotCXNldGhpCSVoaSguTDE4KSwlbzAKLQlzZXRoaQklaGkobXNnKSwlbzEKLQlvcgklbzEsJWxvKG1zZyksJW8xCSEgW2ludGVybmFsXQotCWNhbGwJcHJpbnRmLDIKLQlvcgklbzAsJWxvKC5MMTgpLCVvMAkhIFtpbnRlcm5hbF0KLQlyZXQKLQlyZXN0b3JlCSVnMCwwLCVvMAotCS50eXBlCW1haW4sI2Z1bmN0aW9uCi0JLnNpemUJbWFpbiwoLi1tYWluKQotCS5zZWN0aW9uICIuZGF0YSIJCQkhIFtpbnRlcm5hbF0KLQkuYWxpZ24JNAotRGRhdGEuZGF0YToKLQkuc2VjdGlvbiAiLmJzcyIJCQkhIFtpbnRlcm5hbF0KLUJic3MuYnNzOgotCS5zZWN0aW9uICIucm9kYXRhIgkJISBbaW50ZXJuYWxdCi1Ecm9kYXRhLnJvZGF0YToKLQkuZmlsZQkiaGktc29sLmMiCi0JLmdsb2JhbAltc2cKLQkuZ2xvYmFsCW1zZwotbXNnOgotCS5hc2NpaQkiaGVsbG8sIHdvcmxkIVwwIgotCS50eXBlCW1zZywjb2JqZWN0Ci0JLnNpemUJbXNnLDE0Ci0JLnNlY3Rpb24gIi5kYXRhMSIsICN3cml0ZSwgI2FsbG9jICEgW2ludGVybmFsXQotCS5hbGlnbgk0Ci0uTDE4OgotCS5hc2NpaQkiJXNcblwwIgotCS5pZGVudAkiYWNvbXA6IChDRFMpIFNQQVJDb21waWxlcnMgMi4wLjEgMDMgU2VwIDE5OTIiCi0JLnNlY3Rpb24gInRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnN0YWJzCSIvY3lnaW50L3MxL3VzZXJzL3JhZWJ1cm4vIiwxMDAsMCwwLDAKLQkuc3RhYnMJImhpLXNvbC5jIiwxMDAsMCwzLDAKLQkuc3RhYnMJIiIsNTYsMCwwLDAKLQkuc3RhYnMJIiIsNTYsMCwwLDAKLQkuc3RhYnMJIlh0IDsgZyA7IE8gOyBWPTIuMCIsNjAsMCwwLDB4MmJiNzczYmEKLQkuc3RhYnMJImNoYXI6dCgwLDEpPWJzYzE7MDs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaG9ydDp0KDAsMik9YnMyOzA7MTY7IiwxMjgsMCwwLDAKLQkuc3RhYnMJImludDp0KDAsMyk9YnM0OzA7MzI7IiwxMjgsMCwwLDAKLQkuc3RhYnMJImxvbmc6dCgwLDQpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJsb25nIGxvbmc6dCgwLDUpPWJzODswOzY0OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgY2hhcjp0KDAsNik9YnNjMTswOzg7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInNpZ25lZCBzaG9ydDp0KDAsNyk9YnMyOzA7MTY7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInNpZ25lZCBpbnQ6dCgwLDgpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgbG9uZzp0KDAsOSk9YnM0OzA7MzI7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInNpZ25lZCBsb25nIGxvbmc6dCgwLDEwKT1iczg7MDs2NDsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgY2hhcjp0KDAsMTEpPWJ1YzE7MDs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJ1bnNpZ25lZCBzaG9ydDp0KDAsMTIpPWJ1MjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJ1bnNpZ25lZCBpbnQ6dCgwLDEzKT1idTQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgbG9uZzp0KDAsMTQpPWJ1NDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJ1bnNpZ25lZCBsb25nIGxvbmc6dCgwLDE1KT1idTg7MDs2NDsiLDEyOCwwLDAsMAotCS5zdGFicwkiZmxvYXQ6dCgwLDE2KT1SMTs0OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJkb3VibGU6dCgwLDE3KT1SMjs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJsb25nIGRvdWJsZTp0KDAsMTgpPVI2OzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJ2b2lkOnQoMCwxOSk9YnMwOzA7MCIsMTI4LDAsMCwwCi0JLnN0YWJzCSJtc2c6RygwLDIwKT1hcigwLDMpOzA7MTM7KDAsMSkiLDMyLDAsMTQsMAotCS5zdGFicwkibWFpbjpGKDAsMyk7KDAsMyk7KDAsMjEpPSooMCwyMik9KigwLDEpIiwzNiwwLDAsbWFpbgotCS5zdGFicwkibWFpbiIsNDIsMCwwLDAKLQkuc3RhYm4JMTkyLDAsMSwwCi0JLnN0YWJuCTY4LDAsNCwwCi0JLnN0YWJzCSJhcmdjOnAoMCwzKSIsMTYwLDAsNCw2OAotCS5zdGFicwkiYXJndjpwKDAsMjEpIiwxNjAsMCw0LDcyCi0JLnN0YWJzCSJwcmludGY6UCgwLDMpIiwzNiwwLDAsMAotCS5zdGFibgkyMjQsMCwxLDAKLQkuc3RhYnMJIiIsOTgsMCwwLDAKLQkuc2VjdGlvbiAidGV4dCIJCQkhIFtpbnRlcm5hbF0KLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIi9jeWdpbnQvczEvdXNlcnMvcmFlYnVybi8iLDEwMCwwLDAsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiaGktc29sLmMiLDEwMCwwLDMsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiIiw1NiwwLDAsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiIiw1NiwwLDAsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiWHQgOyBnIDsgTyA7IFY9Mi4wIiw2MCwwLDAsMHgyYmI3NzNiYQotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwibXNnIiwzMiwwLDAsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwibWFpbiIsNDIsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1haW4iLDM2LDAsMCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWdjYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTVmZGNkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWdjYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotCS5maWxlCSJoaS1zb2wuYyIKLS5zdGFicyAiLzFoL2Rldm8vc3JjL2dhcy90ZXN0c3VpdGUvZ2FzLyIsMTAwLDAsMCwuTEx0ZXh0MAotLnN0YWJzICJoaS1zb2wuYyIsMTAwLDAsMCwuTEx0ZXh0MAotLnNlY3Rpb24JIi50ZXh0IgotLkxMdGV4dDA6Ci0JLnN0YWJzCSJnY2MyX2NvbXBpbGVkLiIsIDB4M2MsIDAsIDAsIDAKLS5zdGFicyAiaW50OnQxPXIxOy0yMTQ3NDgzNjQ4OzIxNDc0ODM2NDc7IiwxMjgsMCwwLDAKLS5zdGFicyAiY2hhcjp0Mj1yMjswOzEyNzsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIGludDp0Mz1yMTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyIsMTI4LDAsMCwwCi0uc3RhYnMgInVuc2lnbmVkIGludDp0ND1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgImxvbmcgdW5zaWduZWQgaW50OnQ1PXIxOzA7LTE7IiwxMjgsMCwwLDAKLS5zdGFicyAic2hvcnQgaW50OnQ2PXIxOy0zMjc2ODszMjc2NzsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIGxvbmcgaW50OnQ3PXIxOzA7LTE7IiwxMjgsMCwwLDAKLS5zdGFicyAic2hvcnQgdW5zaWduZWQgaW50OnQ4PXIxOzA7NjU1MzU7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBsb25nIHVuc2lnbmVkIGludDp0OT1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNpZ25lZCBjaGFyOnQxMD1yMTstMTI4OzEyNzsiLDEyOCwwLDAsMAotLnN0YWJzICJ1bnNpZ25lZCBjaGFyOnQxMT1yMTswOzI1NTsiLDEyOCwwLDAsMAotLnN0YWJzICJmbG9hdDp0MTI9cjE7NDswOyIsMTI4LDAsMCwwCi0uc3RhYnMgImRvdWJsZTp0MTM9cjE7ODswOyIsMTI4LDAsMCwwCi0uc3RhYnMgImxvbmcgZG91YmxlOnQxND1yMTs4OzA7IiwxMjgsMCwwLDAKLS5zdGFicyAidm9pZDp0MTU9MTUiLDEyOCwwLDAsMAotLnN0YWJzICJtc2c6RzE2PWFyMTswOzEzOzIiLDMyLDAsMCwwCi0JLmdsb2JhbCBtc2cKLS5zZWN0aW9uCSIucm9kYXRhIgotCS5hbGlnbiA4Ci0JLnR5cGUJIG1zZywjb2JqZWN0Ci0JLnNpemUJIG1zZywxNAotbXNnOgotCS5hc2NpegkiaGVsbG8sIHdvcmxkISIKLQkuYWxpZ24gOAotLkxMQzA6Ci0JLmFzY2l6CSIlc1xuIgotLnNlY3Rpb24JIi50ZXh0IgotCS5hbGlnbiA0Ci0uc3RhYnMgIm1haW46RjEiLDM2LDAsMCxtYWluCi0uc3RhYnMgImFyZ2M6UDEiLDY0LDAsMCwyNAotLnN0YWJzICJhcmd2OlAxNz0qMTg9KjIiLDY0LDAsMCwyNQotCS5nbG9iYWwgbWFpbgotCS50eXBlCSBtYWluLCNmdW5jdGlvbgotCS5wcm9jCTA0Ci1tYWluOgotLnN0YWJuIDY4LDAsNCwuTE0xLW1haW4KLS5MTTE6Ci0JISNQUk9MT0dVRSMgMAotCXNhdmUgJXNwLC0xMTIsJXNwCi0JISNQUk9MT0dVRSMgMQotLnN0YWJuIDY4LDAsNSwuTE0yLW1haW4KLS5MTTI6Ci0uTExCQjI6Ci0Jc2V0aGkgJWhpKC5MTEMwKSwlbzAKLQlvciAlbzAsJWxvKC5MTEMwKSwlbzAKLQlzZXRoaSAlaGkobXNnKSwlbzEKLQljYWxsIHByaW50ZiwwCi0Jb3IgJW8xLCVsbyhtc2cpLCVvMQotLnN0YWJuIDY4LDAsNiwuTE0zLW1haW4KLS5MTTM6Ci0uc3RhYm4gNjgsMCw3LC5MTTQtbWFpbgotLkxNNDoKLS5MTEJFMjoKLQlyZXQKLQlyZXN0b3JlICVnMCwwLCVvMAotLkxMZmUxOgotCS5zaXplCSBtYWluLC5MTGZlMS1tYWluCi0uc3RhYm4gMTkyLDAsMCwuTExCQjItbWFpbgotLnN0YWJuIDIyNCwwLDAsLkxMQkUyLW1haW4KLQkuaWRlbnQJIkdDQzogKEdOVSkgY3lnbnVzLTIuMy4zIgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9hc2kuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1ZWExYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9hc2kuZAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSNhczogLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgYXNpCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgljNCA4MCA0MCAwMCAJbGRhICBcWyAlZzEgXF0gXCgwXCksICVnMgotICAgNDoJYzQgODAgNWYgZTAgCWxkYSAgXFsgJWcxIFxdIFwoMjU1XCksICVnMgotICAgODoJYzQgODAgNDIgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUCwgJWcyCi0gICBjOgljNCA4MCA0MiAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAlZzIKLSAgMTA6CWM0IDgwIDQzIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVBfTCwgJWcyCi0gIDE0OgljNCA4MCA0MyAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTX0wsICVnMgotICAxODoJYzQgODAgNTAgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUCwgJWcyCi0gIDFjOgljNCA4MCA1MCAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TLCAlZzIKLSAgMjA6CWM0IDgwIDUwIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORiwgJWcyCi0gIDI0OgljNCA4MCA1MCA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkYsICVnMgotICAyODoJYzQgODAgNTEgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUF9MLCAlZzIKLSAgMmM6CWM0IDgwIDUxIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NfTCwgJWcyCi0gIDMwOgljNCA4MCA1MSA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkZfTCwgJWcyCi0gIDM0OgljNCA4MCA1MSA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkZfTCwgJWcyCi0gIDM4OgljNCA4MCA0MiAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVQLCAlZzIKLSAgM2M6CWM0IDgwIDQyIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVMsICVnMgotICA0MDoJYzQgODAgNDMgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUF9MLCAlZzIKLSAgNDQ6CWM0IDgwIDQzIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVNfTCwgJWcyCi0gIDQ4OgljNCA4MCA1MCAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QLCAlZzIKLSAgNGM6CWM0IDgwIDUwIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1MsICVnMgotICA1MDoJYzQgODAgNTAgNDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUE5GLCAlZzIKLSAgNTQ6CWM0IDgwIDUwIDYwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NORiwgJWcyCi0gIDU4OgljNCA4MCA1MSAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QX0wsICVnMgotICA1YzoJYzQgODAgNTEgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU19MLCAlZzIKLSAgNjA6CWM0IDgwIDUxIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORl9MLCAlZzIKLSAgNjQ6CWM0IDgwIDUxIDYwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NORl9MLCAlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmZlOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIFRlc3QgYXNpJ3MuCi0JLnRleHQKLQlsZHV3YSBbJWcxXTAsJWcyCi0JbGR1d2EgWyVnMV0yNTUsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVAsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVMsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVBfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQUlVU19MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QTkYsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1NORiwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUF9MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BORl9MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TTkZfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9QUklNQVJZLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BU19JRl9VU0VSX1NFQ09OREFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9QUklNQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUllfTElUVExFLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TRUNPTkRBUlksJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BSSU1BUllfTk9GQVVMVCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX05PRkFVTFQsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BSSU1BUllfTElUVExFLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TRUNPTkRBUllfTElUVExFLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX05PRkFVTFRfTElUVExFLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TRUNPTkRBUllfTk9GQVVMVF9MSVRUTEUsJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWI2YjJlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOiAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCBtZW1iYXIKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPC50ZXh0PjoKLSAgIDA6CTgxIDQzIGUwIDAwIAltZW1iYXIgIDAKLSAgIDQ6CTgxIDQzIGUwIDdmIAltZW1iYXIgICNTeW5jfCNNZW1Jc3N1ZXwjTG9va2FzaWRlfCNTdG9yZVN0b3JlfCNMb2FkU3RvcmV8I1N0b3JlTG9hZHwjTG9hZExvYWQKLSAgIDg6CTgxIDQzIGUwIDdmIAltZW1iYXIgICNTeW5jfCNNZW1Jc3N1ZXwjTG9va2FzaWRlfCNTdG9yZVN0b3JlfCNMb2FkU3RvcmV8I1N0b3JlTG9hZHwjTG9hZExvYWQKLSAgIGM6CTgxIDQzIGUwIDQwIAltZW1iYXIgICNTeW5jCi0gIDEwOgk4MSA0MyBlMCAyMCAJbWVtYmFyICAjTWVtSXNzdWUKLSAgMTQ6CTgxIDQzIGUwIDEwIAltZW1iYXIgICNMb29rYXNpZGUKLSAgMTg6CTgxIDQzIGUwIDA4IAltZW1iYXIgICNTdG9yZVN0b3JlCi0gIDFjOgk4MSA0MyBlMCAwNCAJbWVtYmFyICAjTG9hZFN0b3JlCi0gIDIwOgk4MSA0MyBlMCAwMiAJbWVtYmFyICAjU3RvcmVMb2FkCi0gIDI0Ogk4MSA0MyBlMCAwMSAJbWVtYmFyICAjTG9hZExvYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDVlMDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFRlc3QgbWVtYmFyIGFyZ3MKLQkudGV4dAotCW1lbWJhciAwCi0JbWVtYmFyIDEyNwotCW1lbWJhciAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0JbWVtYmFyICNTeW5jCi0JbWVtYmFyICNNZW1Jc3N1ZQotCW1lbWJhciAjTG9va2FzaWRlCi0JbWVtYmFyICNTdG9yZVN0b3JlCi0JbWVtYmFyICNMb2FkU3RvcmUKLQltZW1iYXIgI1N0b3JlTG9hZAotCW1lbWJhciAjTG9hZExvYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbS0xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzVlNDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbS0xLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0hIFRlc3QgYXJjaGl0ZWN0dXJlIG1pc21hdGNoIHdhcm5pbmdzLgotISBXZSBkb24ndCB0ZXN0IGV2ZXJ5IHBvc3NpYmxlIG1pc21hdGNoLCB3ZSBqdXN0IHdhbnQgdG8gYmUgcmVhc29uYWJsZSBzdXJlCi0hIHRoZSBtaXNtYXRjaCBjaGVja2luZyBjb2RlIHdvcmtzLgotIQotISB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IHNwYXJjKi0qLSogfSB9Ci0hIHsgZGctb3B0aW9ucyAtQXY2IH0KLQotISBzcGFyY2xpdGUKLQotCWRpdnNjYyAlZzEsJWcyLCVnMwkhIHsgZGctZXJyb3IgIm1pc21hdGNofHNwYXJjbGl0ZSIgInNwYXJjbGl0ZSBkaXZzY2MgbWlzbWF0Y2giIH0KLQotCXNjYW4gJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHxzcGFyY2xpdGUiICJzcGFyY2xpdGUgc2NhbiBtaXNtYXRjaCIgfQotCi0hIHY5Ci0KLQltb3ZyeiAlZzEsJWcyLCVnMwkhIHsgZGctZXJyb3IgIm1pc21hdGNofHY5IiAidjkgZnAgcmVnIG1pc21hdGNoIiB9Ci0KLSEgdjlhCi0KLQlzaHV0ZG93bgkJISB7IGRnLWVycm9yICJtaXNtYXRjaHx2OWEiICJ2OWEgc2h1dGRvd24gbWlzbWF0Y2giIH0KLQotZm9vOgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbWF0Y2guZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbWF0Y2guZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjg5ZGUyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgVGVzdCBhcmNoaXRlY3R1cmUgbWlzbWF0Y2ggZXJyb3JzLgotIwotIyBHQVMgaXNzdWVzIHR3byBsaW5lcyBvZiBlcnJvciB0ZXh0IGZvciBlYWNoIG1pc21hdGNoOgotIwotIyBtbS1saXRlLnM6NzogRXJyb3I6IEFyY2hpdGVjdHVyZSBtaXNtYXRjaCBvbiAiZGl2c2NjIi4KLSMgbW0tbGl0ZS5zOjc6ICAoUmVxdWlyZXMgc3BhcmNsaXRlOyByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlIGlzIHY4LikKLSMKLSMgVGhlIHN1Z2dlc3RlZCByZWdleHAgYXJndW1lbnQgdG8gZGctZXJyb3IgaXMgIm1pc21hdGNofDxhcmNoPiIuCi0KLWlmIFtpc3RhcmdldCBzcGFyYyotKi0qXSB7Ci0KLSAgICBsb2FkX2xpYiBnYXMtZGcuZXhwCi0KLSAgICBkZy1pbml0Ci0KLSAgICBkZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvbWlzbS0qLnNdXSAiIiAiIgotCi0gICAgZGctZmluaXNoCi0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3ByZWZldGNoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGY0MjE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3ByZWZldGNoLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCBwcmVmZXRjaAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJYzEgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNuX3JlYWRzCi0gICA0OglmZiA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgMzEKLSAgIDg6CWMxIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl9yZWFkcwotICAgYzoJYzMgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNvbmVfcmVhZAotICAxMDoJYzUgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNuX3dyaXRlcwotICAxNDoJYzcgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNvbmVfd3JpdGUKLSAgMTg6CWMxIGU4IDQyIDAwIAlwcmVmZXRjaGEgIFxbICVnMSBcXSAjQVNJX0FJVVAsICNuX3JlYWRzCi0gIDFjOglmZiBlOCA2MCAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gJWFzaSwgMzEKLSAgMjA6CWMxIGU4IDQyIDIwIAlwcmVmZXRjaGEgIFxbICVnMSBcXSAjQVNJX0FJVVMsICNuX3JlYWRzCi0gIDI0OgljMyBlOCA2MCAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gJWFzaSwgI29uZV9yZWFkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjNjhiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci0JcHJlZmV0Y2ggWyVnMV0sMAotCXByZWZldGNoIFslZzFdLDMxCi0JcHJlZmV0Y2ggWyVnMV0sI25fcmVhZHMKLQlwcmVmZXRjaCBbJWcxXSwjb25lX3JlYWQKLQlwcmVmZXRjaCBbJWcxXSwjbl93cml0ZXMKLQlwcmVmZXRjaCBbJWcxXSwjb25lX3dyaXRlCi0JcHJlZmV0Y2hhIFslZzFdI0FTSV9BSVVQLDAKLQlwcmVmZXRjaGEgWyVnMV0lYXNpLDMxCi0JcHJlZmV0Y2hhIFslZzFdI0FTSV9BSVVTLCNuX3JlYWRzCi0JcHJlZmV0Y2hhIFslZzFdJWFzaSwjb25lX3JlYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2ZWE5Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCByZHByCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgk4MyA1MCAwMCAwMCAJcmRwciAgJXRwYywgJWcxCi0gICA0Ogk4NSA1MCA0MCAwMCAJcmRwciAgJXRucGMsICVnMgotICAgODoJODcgNTAgODAgMDAgCXJkcHIgICV0c3RhdGUsICVnMwotICAgYzoJODkgNTAgYzAgMDAgCXJkcHIgICV0dCwgJWc0Ci0gIDEwOgk4YiA1MSAwMCAwMCAJcmRwciAgJXRpY2ssICVnNQotICAxNDoJOGQgNTEgNDAgMDAgCXJkcHIgICV0YmEsICVnNgotICAxODoJOGYgNTEgODAgMDAgCXJkcHIgICVwc3RhdGUsICVnNwotICAxYzoJOTEgNTEgYzAgMDAgCXJkcHIgICV0bCwgJW8wCi0gIDIwOgk5MyA1MiAwMCAwMCAJcmRwciAgJXBpbCwgJW8xCi0gIDI0Ogk5NSA1MiA0MCAwMCAJcmRwciAgJWN3cCwgJW8yCi0gIDI4Ogk5NyA1MiA4MCAwMCAJcmRwciAgJWNhbnNhdmUsICVvMwotICAyYzoJOTkgNTIgYzAgMDAgCXJkcHIgICVjYW5yZXN0b3JlLCAlbzQKLSAgMzA6CTliIDUzIDAwIDAwIAlyZHByICAlY2xlYW53aW4sICVvNQotICAzNDoJOWQgNTMgNDAgMDAgCXJkcHIgICVvdGhlcndpbiwgJXNwCi0gIDM4Ogk5ZiA1MyA4MCAwMCAJcmRwciAgJXdzdGF0ZSwgJW83Ci0gIDNjOglhMSA1MyBjMCAwMCAJcmRwciAgJWZxLCAlbDAKLSAgNDA6CWEzIDU3IGMwIDAwIAlyZHByICAldmVyLCAlbDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NjE5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIFRlc3QgcmRwcgotCS50ZXh0Ci0JcmRwciAldHBjLCVnMQotCXJkcHIgJXRucGMsJWcyCi0JcmRwciAldHN0YXRlLCVnMwotCXJkcHIgJXR0LCVnNAotCXJkcHIgJXRpY2ssJWc1Ci0JcmRwciAldGJhLCVnNgotCXJkcHIgJXBzdGF0ZSwlZzcKLQlyZHByICV0bCwlbzAKLQlyZHByICVwaWwsJW8xCi0JcmRwciAlY3dwLCVvMgotCXJkcHIgJWNhbnNhdmUsJW8zCi0JcmRwciAlY2FucmVzdG9yZSwlbzQKLQlyZHByICVjbGVhbndpbiwlbzUKLQlyZHByICVvdGhlcndpbiwlbzYKLQlyZHByICV3c3RhdGUsJW83Ci0JcmRwciAlZnEsJWwwCi0JcmRwciAldmVyLCVsMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQwZDBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSNhczogLTY0IC1BdjkKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzcGFyYzY0IHJlbG9jNjQKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPGZvbz46Ci0gICAwOgkwMyAwNCA4ZCAxNSAJc2V0aGkgICVoaVwoMHgxMjM0NTQwMFwpLCAlZzEKLSAgIDQ6CTgyIDEwIDYyIDc4IAlvciAgJWcxLCAweDI3OCwgJWcxLioKLSAgIDg6CTAxIDAwIDAwIDAwIAlub3AgCi0gICBjOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJYzogUl9TUEFSQ19ISDIyCS50ZXh0Ci0gIDEwOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTEwOiBSX1NQQVJDX0hNMTAJLnRleHQKLSAgMTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDE4OgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJMTg6IFJfU1BBUkNfSEgyMgkudGV4dFwrMHgxMjM0NTY3ODAwMDAwMDAwCi0gIDFjOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTFjOiBSX1NQQVJDX0hNMTAJLnRleHRcKzB4MTIzNDU2NzgwMDAwMDAwMAotICAyMDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgMjQ6CTAzIDNmIGI3IDJlIAlzZXRoaSAgJWhpXCgweGZlZGNiODAwXCksICVnMQotICAyODoJODIgMTAgNjIgOTggCW9yICAlZzEsIDB4Mjk4LCAlZzEuKgotICAyYzoJMDUgMWQgOTUgMGMgCXNldGhpICAlaGlcKDB4NzY1NDMwMDBcKSwgJWcyCi0gIDMwOgk4NCAxMCA2MiAxMCAJb3IgICVnMSwgMHgyMTAsICVnMgotICAzNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgMzg6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQkzODogUl9TUEFSQ19ISDIyCS50ZXh0Ci0gIDNjOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTNjOiBSX1NQQVJDX0hNMTAJLnRleHQKLSAgNDA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQk0MDogUl9TUEFSQ19MTTIyCS50ZXh0Ci0gIDQ0Ogk4NCAxMCA2MCAwMCAJbW92ICAlZzEsICVnMgotCQkJNDQ6IFJfU1BBUkNfTE8xMAkudGV4dAotICA0ODoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgNGM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk0YzogUl9TUEFSQ19ISDIyCS50ZXh0XCsweGZlZGNiYTk4NzY1NDMyMTAKLSAgNTA6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgotCQkJNTA6IFJfU1BBUkNfSE0xMAkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDU0OgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJNTQ6IFJfU1BBUkNfTE0yMgkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDU4Ogk4NCAxMCA2MCAwMCAJbW92ICAlZzEsICVnMgotCQkJNTg6IFJfU1BBUkNfTE8xMAkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDVjOgkwMSAwMCAwMCAwMCAJbm9wIAotICA2MDoJMDMgMmEgNjEgZDkgCXNldGhpICAlaGlcKDB4YTk4NzY0MDBcKSwgJWcxCi0gIDY0Ogk4MiAxMCA2MSA0MyAJb3IgICVnMSwgMHgxNDMsICVnMS4qCi0gIDY4Ogk4MiAxMCA2MiAxMCAJb3IgICVnMSwgMHgyMTAsICVnMQotICA2YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgNzA6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk3MDogUl9TUEFSQ19INDQJLnRleHQKLSAgNzQ6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgotCQkJNzQ6IFJfU1BBUkNfTTQ0CS50ZXh0Ci0gIDc4Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQotCQkJNzg6IFJfU1BBUkNfTDQ0CS50ZXh0Ci0gIDdjOgkwMSAwMCAwMCAwMCAJbm9wIAotICA4MDoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTgwOiBSX1NQQVJDX0g0NAkudGV4dFwrMHhhOTg3NjU0MzIxMAotICA4NDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQk4NDogUl9TUEFSQ19NNDQJLnRleHRcKzB4YTk4NzY1NDMyMTAKLSAgODg6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCi0JCQk4ODogUl9TUEFSQ19MNDQJLnRleHRcKzB4YTk4NzY1NDMyMTAKLSAgOGM6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDkwOgkwMyAyMiA2YSBmMyAJc2V0aGkgICVoaVwoMHg4OWFiY2MwMFwpLCAlZzEKLSAgOTQ6CTgyIDE4IDdlIDEwIAl4b3IgICVnMSwgLTQ5NiwgJWcxCi0gIDk4OgkwMSAwMCAwMCAwMCAJbm9wIAotICA5YzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTljOiBSX1NQQVJDX0hJWDIyCS50ZXh0Ci0gIGEwOgk4MiAxOCA2MCAwMCAJeG9yICAlZzEsIDAsICVnMQotCQkJYTA6IFJfU1BBUkNfTE9YMTAJLnRleHQKLSAgYTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gIGE4OgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJYTg6IFJfU1BBUkNfSElYMjIJLnRleHRcKzB4ZmZmZmZmZmY3NjU0MzIxMAotICBhYzoJODIgMTggNjAgMDAgCXhvciAgJWcxLCAwLCAlZzEKLQkJCWFjOiBSX1NQQVJDX0xPWDEwCS50ZXh0XCsweGZmZmZmZmZmNzY1NDMyMTAKLSAgYjA6CTAxIDAwIDAwIDAwIAlub3AgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYWQ2YWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBzcGFyYzY0IHNwZWNpYWwgcmVsb2NzCi0KLWZvbzoKLQlzZXRoaSAldWhpKDB4MTIzNDU2NzgwMDAwMDAwMCksJWcxCi0Jb3IgJWcxLCV1bG8oMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlub3AKLQlzZXRoaSAldWhpKGZvbyksJWcxCi0Jb3IgJWcxLCV1bG8oZm9vKSwlZzEKLQlub3AKLQlzZXRoaSAldWhpKGZvbysweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQotCW9yICVnMSwldWxvKGZvbysweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQotCW5vcAotCXNldGhpICVoaCgweGZlZGNiYTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlaG0oMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKLQlzZXRoaSAlbG0oMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzIKLQlvciAlZzEsJWxvKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jbm9wCi0Jc2V0aGkgJWhoKGZvbyksJWcxCi0Jb3IgJWcxLCVobShmb28pLCVnMQotCXNldGhpICVsbShmb28pLCVnMgotCW9yICVnMSwlbG8oZm9vKSwlZzIKLQlub3AKLQlzZXRoaSAlaGgoZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jb3IgJWcxLCVobShmb28rMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKLQlzZXRoaSAlbG0oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jb3IgJWcxLCVsbyhmb28rMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzIKLQlub3AKLQlzZXRoaSAlaDQ0KDB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbTQ0KDB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbDQ0KDB4YTk4NzY1NDMyMTApLCVnMQotCW5vcAotCXNldGhpICVoNDQoZm9vKSwlZzEKLQlvciAlZzEsJW00NChmb28pLCVnMQotCW9yICVnMSwlbDQ0KGZvbyksJWcxCi0Jbm9wCi0Jc2V0aGkgJWg0NChmb28rMHhhOTg3NjU0MzIxMCksJWcxCi0Jb3IgJWcxLCVtNDQoZm9vKzB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbDQ0KGZvbysweGE5ODc2NTQzMjEwKSwlZzEKLQlub3AKLQlzZXRoaSAlaGl4KDB4ZmZmZmZmZmY3NjU0MzIxMCksJWcxCi0JeG9yICVnMSwlbG94KDB4ZmZmZmZmZmY3NjU0MzIxMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJWhpeChmb28pLCVnMQotCXhvciAlZzEsJWxveChmb28pLCVnMQotCW5vcAotCXNldGhpICVoaXgoZm9vKzB4ZmZmZmZmZmY3NjU0MzIxMCksJWcxCi0JeG9yICVnMSwlbG94KGZvbysweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNjAyM2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCBzZXQ2NAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8Zm9vPjoKLSAgIDA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQkwOiBSX1NQQVJDX0hJMjIJLnRleHQKLSAgIDQ6CTg0IDEwIGEwIDAwIAltb3YgICVnMiwgJWcyCSEgMCA8Zm9vPgotCQkJNDogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gICA4OgkwNyAxZCA5NSAwYyAJc2V0aGkgICVoaVwoMHg3NjU0MzAwMFwpLCAlZzMKLSAgIGM6CTg2IDEwIGUyIDEwIAlvciAgJWczLCAweDIxMCwgJWczCSEgNzY1NDMyMTAgPChcKkFCU1wqfGZvbylcKygweHwpMHg3NjU0MzIxMD4KLSAgMTA6CTg4IDEwIDIwIDAwIAljbHIgICVnNAotICAxNDoJMGIgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzUKLSAgMTg6CThhIDExIDYzIGZmIAlvciAgJWc1LCAweDNmZiwgJWc1CSEgZmZmZiA8KFwqQUJTXCp8Zm9vKVwrKDB4fClmZmZmPgotICAxYzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTFjOiBSX1NQQVJDX0hIMjIJLnRleHQKLSAgMjA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQkyMDogUl9TUEFSQ19MTTIyCS50ZXh0Ci0gIDI0Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQotCQkJMjQ6IFJfU1BBUkNfSE0xMAkudGV4dAotICAyODoJODQgMTAgYTAgMDAgCW1vdiAgJWcyLCAlZzIKLQkJCTI4OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAgMmM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICAzMDoJODQgMTAgODAgMDEgCW9yICAlZzIsICVnMSwgJWcyCi0gIDM0Ogk4NiAxMCAzZiBmZiAJbW92ICAtMSwgJWczCi0gIDM4Ogk4NiAxMCAyMCAwMCAJY2xyICAlZzMKLSAgM2M6CTg2IDEwIDIwIDAxIAltb3YgIDEsICVnMwotICA0MDoJODYgMTAgMmYgZmYgCW1vdiAgMHhmZmYsICVnMwotICA0NDoJMDcgMDAgMDAgMDQgCXNldGhpICAlaGlcKDB4MTAwMFwpLCAlZzMKLSAgNDg6CTg2IDEwIDMwIDAwIAltb3YgIC00MDk2LCAlZzMKLSAgNGM6CTA3IDAwIDAwIDA0IAlzZXRoaSAgJWhpXCgweDEwMDBcKSwgJWczCi0gIDUwOgk4NiAxOCBmZiBmZiAJeG9yICAlZzMsIC0xLCAlZzMKLSAgNTQ6CTA3IDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWczCi0gIDU4Ogk4NiAxMCBlMyBmZiAJb3IgICVnMywgMHgzZmYsICVnMwkhIGZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpZmZmZj4KLSAgNWM6CTA3IDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWczCi0gIDYwOgk4NiAxOCBmYyAwMCAJeG9yICAlZzMsIC0xMDI0LCAlZzMKLSAgNjQ6CTA5IDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNAotICA2ODoJODggMTEgMjMgZmYgCW9yICAlZzQsIDB4M2ZmLCAlZzQJISA3ZmZmZmZmZiA8KFwqQUJTXCp8Zm9vKVwrKDB4fCk3ZmZmZmZmZj4KLSAgNmM6CTA5IDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNAotICA3MDoJMDkgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWc0Ci0gIDc0Ogk4OCAxOSAzYyAwMCAJeG9yICAlZzQsIC0xMDI0LCAlZzQKLSAgNzg6CTA5IDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNAotICA3YzoJODggMTkgM2YgZmYgCXhvciAgJWc0LCAtMSwgJWc0Ci0gIDgwOgkwOSAzZiBmZiBmZiAJc2V0aGkgICVoaVwoMHhmZmZmZmMwMFwpLCAlZzQKLSAgODQ6CTg4IDExIDIzIGZmIAlvciAgJWc0LCAweDNmZiwgJWc0CSEgZmZmZmZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpZmZmZmZmZmY+Ci0gIDg4Ogk4OCAxMCAyMCAwMSAJbW92ICAxLCAlZzQKLSAgOGM6CTg5IDI5IDMwIDIwIAlzbGx4ICAlZzQsIDB4MjAsICVnNAotICA5MDoJMDMgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWcxCi0gIDk0OgkwYiAzZiBmZiBmZiAJc2V0aGkgICVoaVwoMHhmZmZmZmMwMFwpLCAlZzUKLSAgOTg6CTgyIDEwIDYzIGZmIAlvciAgJWcxLCAweDNmZiwgJWcxCi0gIDljOgk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQotICBhMDoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gIGE0Ogk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAgYTg6CTBiIDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNQotICBhYzoJOGIgMjkgNzAgMjAgCXNsbHggICVnNSwgMHgyMCwgJWc1Ci0gIGIwOgkwYiAzZiBmZiBmZiAJc2V0aGkgICVoaVwoMHhmZmZmZmMwMFwpLCAlZzUKLSAgYjQ6CThhIDE5IDdjIDAwIAl4b3IgICVnNSwgLTEwMjQsICVnNQotICBiODoJMGIgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWc1Ci0gIGJjOgk4YSAxOSA3YyAwMCAJeG9yICAlZzUsIC0xMDI0LCAlZzUKLSAgYzA6CTAzIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnMQotICBjNDoJMGIgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWc1Ci0gIGM4Ogk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgY2M6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotICBkMDoJMDMgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWcxCi0gIGQ0Ogk4YSAxMCAyMCAwMSAJbW92ICAxLCAlZzUKLSAgZDg6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBkYzoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGUwOgkwYiAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzUKLSAgZTQ6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotICBlODoJOGEgMTEgNjAgMDEgCW9yICAlZzUsIDEsICVnNQotICBlYzoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gIGYwOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAgZjQ6CTBiIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnNQotICBmODoJODIgMTAgMjAgMDEgCW1vdiAgMSwgJWcxCi0gIGZjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAxMDA6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotIDEwNDoJODIgMTAgMjAgMDEgCW1vdiAgMSwgJWcxCi0gMTA4Ogk4YSAxMCAyMCAwMSAJbW92ICAxLCAlZzUKLSAxMGM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotIDExMDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gMTE0OgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJMTE0OiBSX1NQQVJDX0hJMjIJLnRleHQKLSAxMTg6CTg0IDEwIGEwIDAwIAltb3YgICVnMiwgJWcyCSEgMCA8Zm9vPgotCQkJMTE4OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAxMWM6CTA3IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMwotIDEyMDoJODYgMTAgZTIgMTAgCW9yICAlZzMsIDB4MjEwLCAlZzMJISA3NjU0MzIxMCA8KFwqQUJTXCp8Zm9vKVwrMHg3NjU0MzIxMD4KLSAxMjQ6CTg4IDEwIDIwIDAwIAljbHIgICVnNAotIDEyODoJMGIgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzUKLSAxMmM6CThhIDExIDYzIGZmIAlvciAgJWc1LCAweDNmZiwgJWc1CSEgZmZmZiA8KFwqQUJTXCp8Zm9vKVwrMHhmZmZmPgotIDEzMDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzIKLQkJCTEzMDogUl9TUEFSQ19ISTIyCS50ZXh0Ci0gMTM0Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KLQkJCTEzNDogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gMTM4Ogk4NSAzOCA4MCAwMCAJc2lnbnggICVnMgotIDEzYzoJMDcgMWQgOTUgMGMgCXNldGhpICAlaGlcKDB4NzY1NDMwMDBcKSwgJWczCi0gMTQwOgk4NiAxMCBlMiAxMCAJb3IgICVnMywgMHgyMTAsICVnMwkhIDc2NTQzMjEwIDwoXCpBQlNcKnxmb28pXCsweDc2NTQzMjEwPgotIDE0NDoJODggMTAgMjAgMDAgCWNsciAgJWc0Ci0gMTQ4OgkwYiAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnNQotIDE0YzoJOGEgMTEgNjMgZmYgCW9yICAlZzUsIDB4M2ZmLCAlZzUJISBmZmZmIDwoXCpBQlNcKnxmb28pXCsweGZmZmY+Ci0gMTUwOgk4MiAxMCAzZiBmZiAJbW92ICAtMSwgJWcxCi0gMTU0OgkwNSAxZiBmZiBmZiAJc2V0aGkgICVoaVwoMHg3ZmZmZmMwMFwpLCAlZzIKLSAxNTg6CTg0IDEwIGEzIGZmIAlvciAgJWcyLCAweDNmZiwgJWcyCSEgN2ZmZmZmZmYgPChcKkFCU1wqfGZvbylcKzB4N2ZmZmZmZmY+Ci0gMTVjOgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMwotIDE2MDoJODYgMTggZmMgMDAgCXhvciAgJWczLCAtMTAyNCwgJWczCi0gMTY0Ogk4OCAxMCAzZiBmZiAJbW92ICAtMSwgJWc0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1MDM2ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyBzcGFyYzY0IHNldCBpbnNuIGhhbmRsaW5nIChpbmNsdWRlcyBzZXQsIHNldHV3LCBzZXRzdywgc2V0eCkKLQotZm9vOgotCXNldCBmb28sJWcyCi0Jc2V0IDB4NzY1NDMyMTAsJWczCi0Jc2V0IDAsJWc0Ci0Jc2V0IDY1NTM1LCVnNQotCi0Jc2V0eCBmb28sJWcxLCVnMgotCi0Jc2V0eCAtMSwlZzEsJWczCi0Jc2V0eCAwLCVnMSwlZzMKLQlzZXR4IDEsJWcxLCVnMwotCXNldHggNDA5NSwlZzEsJWczCi0Jc2V0eCA0MDk2LCVnMSwlZzMKLQlzZXR4IC00MDk2LCVnMSwlZzMKLQlzZXR4IC00MDk3LCVnMSwlZzMKLQlzZXR4IDY1NTM1LCVnMSwlZzMKLQlzZXR4IC02NTUzNiwlZzEsJWczCi0KLQlzZXR4IDIxNDc0ODM2NDcsJWcxLCVnNAotCXNldHggMjE0NzQ4MzY0OCwlZzEsJWc0Ci0Jc2V0eCAtMjE0NzQ4MzY0OCwlZzEsJWc0Ci0Jc2V0eCAtMjE0NzQ4MzY0OSwlZzEsJWc0Ci0Jc2V0eCA0Mjk0OTY3Mjk1LCVnMSwlZzQKLQlzZXR4IDQyOTQ5NjcyOTYsJWcxLCVnNAotCi0hIEdBUyBkb2Vzbid0IGhhbmRsZSBsYXJnZSBiYXNlMTAgbnVtYmVycyB5ZXQuCi0hCXNldHggOTIyMzM3MjAzNjg1NDc3NTgwNywlZzEsJWc1Ci0hCXNldHggOTIyMzM3MjAzNjg1NDc3NTgwOCwlZzEsJWc1Ci0hCXNldHggLTkyMjMzNzIwMzY4NTQ3NzU4MDgsJWcxLCVnNQotIQlzZXR4IC05MjIzMzcyMDM2ODU0Nzc1ODA5LCVnMSwlZzUKLQotCXNldHggMHg3ZmZmZmZmZmZmZmZmZmZmLCVnMSwlZzUKLQlzZXR4IDB4ODAwMDAwMDAwMDAwMDAwMCwlZzEsJWc1CQkhIHRlc3Qgb25seSBoaDIyIG5lZWRlZAotCXNldHggMHhmZmZmZmZmZjAwMDAwMDAwLCVnMSwlZzUJCSEgdGVzdCBvbmx5IGhtMTAgbmVlZGVkCi0Jc2V0eCAweGZmZmZmZmZmODAwMDAwMDAsJWcxLCVnNQkJISB0ZXN0IHNpZ24tZXh0IG9mIGxvd2VyIDMyCi0Jc2V0eCAweGZmZmYwMDAwZmZmZjAwMDAsJWcxLCVnNQkJISB0ZXN0IGhoMjIsaGkyMgotCXNldHggMHhmZmZmMDAwMDAwMDAwMDAxLCVnMSwlZzUJCSEgdGVzdCBoaDIyLGxvMTAKLQlzZXR4IDB4MDAwMDAwMDFmZmZmMDAwMSwlZzEsJWc1CQkhIHRlc3QgaG0xMCxoaTIyLGxvMTAKLQlzZXR4IDB4MDAwMDAwMDFmZmZmMDAwMCwlZzEsJWc1CQkhIHRlc3QgaG0xMCxoaTIyCi0Jc2V0eCAweDAwMDAwMDAxMDAwMDAwMDEsJWcxLCVnNQkJISB0ZXN0IGhtMTAsbG8xMAotCi0Jc2V0dXcgZm9vLCVnMgotCXNldHV3IDB4NzY1NDMyMTAsJWczCi0Jc2V0dXcgMCwlZzQKLQlzZXR1dyA2NTUzNSwlZzUKLQotCXNldHN3IGZvbywlZzIKLQlzZXRzdyAweDc2NTQzMjEwLCVnMwotCXNldHN3IDAsJWc0Ci0Jc2V0c3cgNjU1MzUsJWc1Ci0Jc2V0c3cgMHhmZmZmZmZmZiwlZzEKLQlzZXRzdyAweDdmZmZmZmZmLCVnMgotCXNldHN3IDB4ZmZmZjAwMDAsJWczCi0Jc2V0c3cgLTEsJWc0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGFyYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGFyYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZGNhYWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BhcmMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBTb21lIGdlbmVyaWMgU1BBUkMgYW5kIFNQQVJDNjQgdGVzdHMKLQotIyBGSVhNRTogVGhlIHRlc3RzIGhlcmUgYXJlbid0IHJlYWxseSBidWxsZXQgcHJvb2YuICBBIG1pc3Rha2UgaW4gdGhlIG9wY29kZQotIyB0YWJsZSBjYW4gc2xpcCB0aHJvdWdoIHNpbmNlIHdlIHVzZSB0aGUgc2FtZSB0YWJsZSBmb3IgYXNzZW1ibHkgYW5kCi0jIGRpc2Fzc2VtYmx5LiAgVGhlIHdheSB0byBmaXggdGhpcyBpcyB0byBpbmNsdWRlIGEgaGV4IGR1bXAgb2YgdGhlIGluc25zCi0jIGFuZCB0ZXN0IHRoYXQgYXMgd2VsbC4gIExhdGVyLgotCi0jIEZpbmQgb3V0IGlmIHRoZXNlIGJpbnV0aWxzIGFyZSBlaXRoZXIgc3BhcmM2NCotKi0qIG9yCi0jIHNwYXJjKi0qLSogd2l0aCAtLWVuYWJsZS10YXJnZXRzPXNwYXJjNjQtKi0qCi1wcm9jIGdhc182NF9jaGVjayB7IH0gewotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotCi0gICAgY2F0Y2ggImV4ZWMgJHNyY2Rpci9saWIvcnVuICROTSAkTk1GTEFHUyAtLWhlbHAiIG5tX2hlbHAKLSAgICByZXR1cm4gW3JlZ2V4cCAiZWxmNjRcW18tXF1zcGFyYyIgJG5tX2hlbHBdOwotfQotCi1pZiBbaXN0YXJnZXQgc3BhcmMqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgInN5bnRoIgotICAgIGlmIFtnYXNfNjRfY2hlY2tdIHsKLQlydW5fZHVtcF90ZXN0ICJhc2kiCi0JcnVuX2R1bXBfdGVzdCAibWVtYmFyIgotCXJ1bl9kdW1wX3Rlc3QgInByZWZldGNoIgotCXJ1bl9kdW1wX3Rlc3QgInNldDY0IgotCXJ1bl9kdW1wX3Rlc3QgInN5bnRoNjQiCi0JcnVuX2R1bXBfdGVzdCAicmRwciIKLQlydW5fZHVtcF90ZXN0ICJ3cnByIgotCXJ1bl9kdW1wX3Rlc3QgInJlbG9jNjQiCi0gICAgfQotfQotCi1pZiBbaXN0YXJnZXQgc3BhcmNsZXQqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgInNwbGV0IgotICAgIHJ1bl9kdW1wX3Rlc3QgInNwbGV0LTIiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTU1MzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2FzOiAtQXNwYXJjbGV0Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPHN0YXJ0PjoKLSAgIDA6CTgxIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjc3IKLSAgIDQ6CTgzIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjZnIKLSAgIDg6CTg1IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjY3JjcgotICAgYzoJODcgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2NwcgotICAxMDoJODkgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2NzcjIKLSAgMTQ6CThiIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjY3JyCi0gIDE4Ogk4ZCBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY3JzdHIKLSAgMWM6CTgzIGIwIDAxIDAwIAljcmRjeHQgICVjY3NyLCAlZzEKLSAgMjA6CTgzIGIwIDQxIDAwIAljcmRjeHQgICVjY2ZyLCAlZzEKLSAgMjQ6CTgzIGIwIDgxIDAwIAljcmRjeHQgICVjY2NyY3IsICVnMQotICAyODoJODMgYjAgYzEgMDAgCWNyZGN4dCAgJWNjcHIsICVnMQotICAyYzoJODMgYjEgMDEgMDAgCWNyZGN4dCAgJWNjc3IyLCAlZzEKLSAgMzA6CTgzIGIxIDQxIDAwIAljcmRjeHQgICVjY2NyciwgJWcxCi0gIDM0Ogk4MyBiMSA4MSAwMCAJY3JkY3h0ICAlY2Nyc3RyLCAlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzNDQ5NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0hIFRlc3Qgc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzLgotCi0JLnRleHQKLQkuZ2xvYmFsIHN0YXJ0Ci1zdGFydDoKLQotCWN3cmN4dCAgICAlZzEsJWNjc3IKLQljd3JjeHQgICAgJWcxLCVjY2ZyCi0JY3dyY3h0ICAgICVnMSwlY2NjcmNyCi0JY3dyY3h0ICAgICVnMSwlY2NwcgotCWN3cmN4dCAgICAlZzEsJWNjc3IyCi0JY3dyY3h0ICAgICVnMSwlY2NjcnIKLQljd3JjeHQgICAgJWcxLCVjY3JzdHIKLQotCWNyZGN4dCAgICAlY2NzciwlZzEKLQljcmRjeHQgICAgJWNjZnIsJWcxCi0JY3JkY3h0ICAgICVjY2NyY3IsJWcxCi0JY3JkY3h0ICAgICVjY3ByLCVnMQotCWNyZGN4dCAgICAlY2NzcjIsJWcxCi0JY3JkY3h0ICAgICVjY2NyciwlZzEKLQljcmRjeHQgICAgJWNjcnN0ciwlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWMwYTIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotI2FzOiAtQXNwYXJjbGV0Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmNsZXQgZXh0ZW5zaW9ucwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxzdGFydD46Ci0gICAwOglhMSA0MCAwMCAwMCAJcmQgICV5LCAlbDAKLSAgIDQ6CWExIDQwIDQwIDAwIAlyZCAgJWFzcjEsICVsMAotICAgODoJYTEgNDMgYzAgMDAgCXJkICAlYXNyMTUsICVsMAotICAgYzoJYTEgNDQgNDAgMDAgCXJkICAlYXNyMTcsICVsMAotICAxMDoJYTEgNDQgODAgMDAgCXJkICAlYXNyMTgsICVsMAotICAxNDoJYTEgNDQgYzAgMDAgCXJkICAlYXNyMTksICVsMAotICAxODoJYTEgNDUgMDAgMDAgCXJkICAlYXNyMjAsICVsMAotICAxYzoJYTEgNDUgNDAgMDAgCXJkICAlYXNyMjEsICVsMAotICAyMDoJYTEgNDUgODAgMDAgCXJkICAlYXNyMjIsICVsMAotICAyNDoJODEgODQgMjAgMDAgCW1vdiAgJWwwLCAleQotICAyODoJODMgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMQotICAyYzoJOWYgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTUKLSAgMzA6CWEzIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE3Ci0gIDM0OglhNSA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IxOAotICAzODoJYTcgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTkKLSAgM2M6CWE5IDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjIwCi0gIDQwOglhYiA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IyMQotICA0NDoJYWQgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMjIKLQotMCs0OCA8dGVzdF91bXVsPjoKLSAgNDg6CTg2IDUwIDQwIDAyIAl1bXVsICAlZzEsICVnMiwgJWczCi0gIDRjOgk4NiA1MCA0MCAwMiAJdW11bCAgJWcxLCAlZzIsICVnMwotCi0wKzUwIDx0ZXN0X3NtdWw+OgotICA1MDoJODYgNTggNDAgMDIgCXNtdWwgICVnMSwgJWcyLCAlZzMKLSAgNTQ6CTg2IDU4IDQwIDAyIAlzbXVsICAlZzEsICVnMiwgJWczCi0KLTArNTggPHRlc3Rfc3RiYXI+OgotICA1ODoJODEgNDMgYzAgMDAgCXN0YmFyIAotICA1YzoJODEgNDMgYzAgMDAgCXN0YmFyIAotICA2MDoJMDAgMDAgMDAgMDEgCXVuaW1wICAweDEKLSAgNjQ6CTgxIGRjIDQwIDAwIAlmbHVzaCAgJWwxCi0KLTArNjggPHRlc3Rfc2Nhbj46Ci0gIDY4OglhNyA2NCA3ZiBmZiAJc2NhbiAgJWwxLCAtMSwgJWwzCi0gIDZjOglhNyA2NCA2MCAwMCAJc2NhbiAgJWwxLCAwLCAlbDMKLSAgNzA6CWE3IDY0IDQwIDExIAlzY2FuICAlbDEsICVsMSwgJWwzCi0KLTArNzQgPHRlc3Rfc2h1ZmZsZT46Ci0gIDc0OglhMyA2YyAyMCAwMSAJc2h1ZmZsZSAgJWwwLCAxLCAlbDEKLSAgNzg6CWEzIDZjIDIwIDAyIAlzaHVmZmxlICAlbDAsIDIsICVsMQotICA3YzoJYTMgNmMgMjAgMDQgCXNodWZmbGUgICVsMCwgNCwgJWwxCi0gIDgwOglhMyA2YyAyMCAwOCAJc2h1ZmZsZSAgJWwwLCA4LCAlbDEKLSAgODQ6CWEzIDZjIDIwIDEwIAlzaHVmZmxlICAlbDAsIDB4MTAsICVsMQotICA4ODoJYTMgNmMgMjAgMTggCXNodWZmbGUgICVsMCwgMHgxOCwgJWwxCi0KLTArOGMgPHRlc3RfdW1hYz46Ci0gIDhjOglhMSBmNCA0MCAxMiAJdW1hYyAgJWwxLCAlbDIsICVsMAotICA5MDoJYTEgZjQgNjAgMDIgCXVtYWMgICVsMSwgMiwgJWwwCi0gIDk0OglhMSBmNCA2MCAwMiAJdW1hYyAgJWwxLCAyLCAlbDAKLQotMCs5OCA8dGVzdF91bWFjZD46Ci0gIDk4OglhMSA3NCA4MCAxNCAJdW1hY2QgICVsMiwgJWw0LCAlbDAKLSAgOWM6CWExIDc0IGEwIDAzIAl1bWFjZCAgJWwyLCAzLCAlbDAKLSAgYTA6CWExIDc0IGEwIDAzIAl1bWFjZCAgJWwyLCAzLCAlbDAKLQotMCthNCA8dGVzdF9zbWFjPjoKLSAgYTQ6CWExIGZjIDQwIDEyIAlzbWFjICAlbDEsICVsMiwgJWwwCi0gIGE4OglhMSBmYyA3ZiBkNiAJc21hYyAgJWwxLCAtNDIsICVsMAotICBhYzoJYTEgZmMgN2YgZDYgCXNtYWMgICVsMSwgLTQyLCAlbDAKLQotMCtiMCA8dGVzdF9zbWFjZD46Ci0gIGIwOglhMSA3YyA4MCAxNCAJc21hY2QgICVsMiwgJWw0LCAlbDAKLSAgYjQ6CWExIDdjIGEwIDdiIAlzbWFjZCAgJWwyLCAweDdiLCAlbDAKLSAgYjg6CWExIDdjIGEwIDdiIAlzbWFjZCAgJWwyLCAweDdiLCAlbDAKLQotMCtiYyA8dGVzdF91bXVsZD46Ci0gIGJjOgk5MCA0YSA4MCAwYyAJdW11bGQgICVvMiwgJW80LCAlbzAKLSAgYzA6CTkwIDRhIGEyIDM0IAl1bXVsZCAgJW8yLCAweDIzNCwgJW8wCi0gIGM0Ogk5MCA0YSBhNSA2NyAJdW11bGQgICVvMiwgMHg1NjcsICVvMAotCi0wK2M4IDx0ZXN0X3NtdWxkPjoKLSAgYzg6CWIwIDZlIDgwIDFjIAlzbXVsZCAgJWkyLCAlaTQsICVpMAotICBjYzoJYjAgNmUgYjAgMDAgCXNtdWxkICAlaTIsIC00MDk2LCAlaTAKLSAgZDA6CWIwIDZmIDJmIGZmIAlzbXVsZCAgJWk0LCAweGZmZiwgJWkwCi0KLTArZDQgPHRlc3RfY29wcm9jZXNzb3I+OgotICBkNDoJODEgYjQgMDAgMTEgCWNwdXNoICAlbDAsICVsMQotICBkODoJODEgYjQgMjAgMDEgCWNwdXNoICAlbDAsIDEKLSAgZGM6CTgxIGI0IDAwIDUxIAljcHVzaGEgICVsMCwgJWwxCi0gIGUwOgk4MSBiNCAyMCA0MSAJY3B1c2hhICAlbDAsIDEKLSAgZTQ6CWExIGIwIDAwIDgwIAljcHVsbCAgJWwwCi0gIGU4OglhMSBiMCAwMSAwMCAJY3JkY3h0ICAlY2NzciwgJWwwCi0gIGVjOglhMSBiMCA0MSAwMCAJY3JkY3h0ICAlY2NmciwgJWwwCi0gIGYwOglhMSBiMCBjMSAwMCAJY3JkY3h0ICAlY2NwciwgJWwwCi0gIGY0OglhMSBiMCA4MSAwMCAJY3JkY3h0ICAlY2NjcmNyLCAlbDAKLSAgZjg6CTgxIGI0IDAwIGMwIAljd3JjeHQgICVsMCwgJWNjc3IKLSAgZmM6CTgzIGI0IDAwIGMwIAljd3JjeHQgICVsMCwgJWNjZnIKLSAxMDA6CTg3IGI0IDAwIGMwIAljd3JjeHQgICVsMCwgJWNjcHIKLSAxMDQ6CTg1IGI0IDAwIGMwIAljd3JjeHQgICVsMCwgJWNjY3JjcgotIDEwODoJMDEgYzAgMDAgMDEgCWNibiAgMTBjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTM4PgotCQkJMTA4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZjgKLSAxMGM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTEwOgkyMSBjMCAwMCAwMSAJY2JuLGEgICAxMTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNDA+Ci0JCQkxMTA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVmMAotIDExNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMTg6CTAzIGMwIDAwIDAxIAljYmUgIDExYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk0OD4KLQkJCTExODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWU4Ci0gMTFjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDEyMDoJMjMgYzAgMDAgMDEgCWNiZSxhICAgMTI0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTUwPgotCQkJMTIwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZTAKLSAxMjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTI4OgkwNSBjMCAwMCAwMSAJY2JmICAxMmMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNTg+Ci0JCQkxMjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVkOAotIDEyYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMzA6CTI1IGMwIDAwIDAxIAljYmYsYSAgIDEzNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk2MD4KLQkJCTEzMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWQwCi0gMTM0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDEzODoJMDcgYzAgMDAgMDEgCWNiZWYgIDEzYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk2OD4KLQkJCTEzODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWM4Ci0gMTNjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE0MDoJMjcgYzAgMDAgMDEgCWNiZWYsYSAgIDE0NCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk3MD4KLQkJCTE0MDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWMwCi0gMTQ0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDE0ODoJMDkgYzAgMDAgMDEgCWNiciAgMTRjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTc4PgotCQkJMTQ4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYjgKLSAxNGM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTUwOgkyOSBjMCAwMCAwMSAJY2JyLGEgICAxNTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpODA+Ci0JCQkxNTA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmViMAotIDE1NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNTg6CTBiIGMwIDAwIDAxIAljYmVyICAxNWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpODg+Ci0JCQkxNTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVhOAotIDE1YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNjA6CTJiIGMwIDAwIDAxIAljYmVyLGEgICAxNjQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpOTA+Ci0JCQkxNjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVhMAotIDE2NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNjg6CTBkIGMwIDAwIDAxIAljYmZyICAxNmMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpOTg+Ci0JCQkxNjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU5OAotIDE2YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNzA6CTJkIGMwIDAwIDAxIAljYmZyLGEgICAxNzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYTA+Ci0JCQkxNzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU5MAotIDE3NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNzg6CTBmIGMwIDAwIDAxIAljYmVmciAgMTdjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWE4PgotCQkJMTc4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlODgKLSAxN2M6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTgwOgkyZiBjMCAwMCAwMSAJY2JlZnIsYSAgIDE4NCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCliMD4KLQkJCTE4MDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTgwCi0gMTg0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDE4ODoJMTEgYzAgMDAgMDEgCWNiYSAgMThjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWI4PgotCQkJMTg4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNzgKLSAxOGM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTkwOgkzMSBjMCAwMCAwMSAJY2JhLGEgICAxOTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYzA+Ci0JCQkxOTA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU3MAotIDE5NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxOTg6CTEzIGMwIDAwIDAxIAljYm5lICAxOWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYzg+Ci0JCQkxOTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU2OAotIDE5YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYTA6CTMzIGMwIDAwIDAxIAljYm5lLGEgICAxYTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZDA+Ci0JCQkxYTA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU2MAotIDFhNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYTg6CTE1IGMwIDAwIDAxIAljYm5mICAxYWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZDg+Ci0JCQkxYTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU1OAotIDFhYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYjA6CTM1IGMwIDAwIDAxIAljYm5mLGEgICAxYjQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZTA+Ci0JCQkxYjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU1MAotIDFiNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYjg6CTE3IGMwIDAwIDAxIAljYm5lZiAgMWJjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWU4PgotCQkJMWI4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNDgKLSAxYmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWMwOgkzNyBjMCAwMCAwMSAJY2JuZWYsYSAgIDFjNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClmMD4KLQkJCTFjMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTQwCi0gMWM0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDFjODoJMTkgYzAgMDAgMDEgCWNibnIgIDFjYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClmOD4KLQkJCTFjODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTM4Ci0gMWNjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDFkMDoJMzkgYzAgMDAgMDEgCWNibnIsYSAgIDFkNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMDA+Ci0JCQkxZDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUzMAotIDFkNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZDg6CTFiIGMwIDAwIDAxIAljYm5lciAgMWRjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTEwOD4KLQkJCTFkODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTI4Ci0gMWRjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDFlMDoJM2IgYzAgMDAgMDEgCWNibmVyLGEgICAxZTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTEwPgotCQkJMWUwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMjAKLSAxZTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWU4OgkxZCBjMCAwMCAwMSAJY2JuZnIgIDFlYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMTg+Ci0JCQkxZTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUxOAotIDFlYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZjA6CTNkIGMwIDAwIDAxIAljYm5mcixhICAgMWY0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTEyMD4KLQkJCTFmMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTEwCi0gMWY0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDFmODoJMWYgYzAgMDAgMDEgCWNibmVmciAgMWZjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTEyOD4KLQkJCTFmODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTA4Ci0gMWZjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDIwMDoJM2YgYzAgMDAgMDEgCWNibmVmcixhICAgMjA0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTEzMD4KLQkJCTIwMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTAwCi0gMjA0OgkwMSAwMCAwMCAwMCAJbm9wIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmQ1MDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQucworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmFsIHN0YXJ0Ci0KLSEJU3RhcnRpbmcgcG9pbnQKLXN0YXJ0OgotCi0hCXRlc3QgYWxsIEFTUnMKLQotCXJkCSVhc3IwLCAlbDAKLQlyZAklYXNyMSwgJWwwCi0JcmQJJWFzcjE1LCAlbDAKLQlyZAklYXNyMTcsICVsMAotCXJkCSVhc3IxOCwgJWwwCi0JcmQJJWFzcjE5LCAlbDAJISBzaG91bGQgc3RvcCB0aGUgcHJvY2Vzc29yCi0JcmQJJWFzcjIwLCAlbDAKLQlyZAklYXNyMjEsICVsMAotCXJkCSVhc3IyMiwgJWwwCi0KLQl3cgklbDAsIDAsICVhc3IwCi0Jd3IJJWwwLCAwLCAlYXNyMQotCXdyCSVsMCwgMCwgJWFzcjE1Ci0Jd3IJJWwwLCAwLCAlYXNyMTcKLQl3cgklbDAsIDAsICVhc3IxOAotCXdyCSVsMCwgMCwgJWFzcjE5Ci0Jd3IJJWwwLCAwLCAlYXNyMjAKLQl3cgklbDAsIDAsICVhc3IyMQotCXdyCSVsMCwgMCwgJWFzcjIyCi0KLSEJdGVzdCBVTVVMIHdpdGggbm8gb3ZlcmZsb3cgaW5zaWRlIFkKLXRlc3RfdW11bDoKLQl1bXVsCSVnMSwgJWcyLCAlZzMKLQotIQl0ZXN0IFVNVUwgd2l0aCBhbiBvdmVyZmxvdyBpbnNpZGUgWQotCi0JdW11bAklZzEsICVnMiwgJWczCSEgJWczIG11c3QgYmUgZXF1YWwgdG8gMAotCi0hCXRlc3QgU01VTCB3aXRoIG5lZ2F0aXZlIHJlc3VsdAotdGVzdF9zbXVsOgotCXNtdWwJJWcxLCAlZzIsICVnMwotCi0hCXRlc3QgU01VTCB3aXRoIHBvc2l0aXZlIHJlc3VsdAotCi0Jc211bAklZzEsICVnMiwgJWczCi0KLSEJdGVzdCBTVEJBUjogdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBzeW50YXhlcwotdGVzdF9zdGJhcjoKLQlzdGJhcgkJCSEgaXMgYSB2YWxpZCBWOCBzeW50YXgsIGF0IGxlYXN0IGEgc3ludGhldGljCi0JCQkJISBpbnN0cnVjdGlvbgotCXJkCSVhc3IxNSwgJWcwCSEgb3RoZXIgc29sdXRpb24KLQotIQl0ZXN0IFVOSU1QCi0JdW5pbXAJMQotCi0hCXRlc3QgRkxVU0gKLQlmbHVzaAklbDEJCSEgaXMgdGhlIG9mZmljaWFsIFY4IHN5bnRheAotCi0hCXRlc3QgU0NBTjogZmluZCBmaXJzdCAwCi10ZXN0X3NjYW46Ci0Jc2NhbgklbDEsIDB4ZmZmZmZmZmYsICVsMwotCi0hCXRlc3Qgc2NhbjogZmluZCBmaXJzdCAxCi0KLQlzY2FuCSVsMSwgMCwgJWwzCi0KLSEJdGVzdCBzY2FuOiBmaW5kIGZpcnN0IGJpdCAhPSBiaXQtMAotCi0Jc2NhbgklbDEsICVsMSwgJWwzCi0KLSEJdGVzdCBTSFVGRkxFCi10ZXN0X3NodWZmbGU6Ci0Jc2h1ZmZsZQklbDAsIDB4MSwgJWwxCi0Jc2h1ZmZsZQklbDAsIDB4MiwgJWwxCi0Jc2h1ZmZsZQklbDAsIDB4NCwgJWwxCi0Jc2h1ZmZsZQklbDAsIDB4OCwgJWwxCi0Jc2h1ZmZsZQklbDAsIDB4MTAsICVsMQotCXNodWZmbGUJJWwwLCAweDE4LCAlbDEKLQotIQl0ZXN0IFVNQUMKLXRlc3RfdW1hYzoKLQl1bWFjCSVsMSwgJWwyLCAlbDAKLQl1bWFjCSVsMSwgMiwgJWwwCi0JdW1hYwkyLCAlbDEsICVsMAotCi0hCXRlc3QgVU1BQ0QKLXRlc3RfdW1hY2Q6Ci0JdW1hY2QJJWwyLCAlbDQsICVsMAotCXVtYWNkCSVsMiwgMywgJWwwCi0JdW1hY2QJMywgJWwyLCAlbDAKLQotIQl0ZXN0IFNNQUMKLXRlc3Rfc21hYzoKLQlzbWFjCSVsMSwgJWwyLCAlbDAKLQlzbWFjCSVsMSwgLTQyLCAlbDAKLQlzbWFjCS00MiwgJWwxLCAlbDAKLQotIQl0ZXN0IFNNQUNECi10ZXN0X3NtYWNkOgotCXNtYWNkCSVsMiwgJWw0LCAlbDAKLQlzbWFjZAklbDIsIDEyMywgJWwwCi0Jc21hY2QJMTIzLCAlbDIsICVsMAotCi0hCXRlc3QgVU1VTEQKLXRlc3RfdW11bGQ6Ci0JdW11bGQJJW8yLCAlbzQsICVvMAotCXVtdWxkCSVvMiwgMHgyMzQsICVvMAotCXVtdWxkCTB4NTY3LCAlbzIsICVvMAotCi0hCXRlc3QgU01VTEQKLXRlc3Rfc211bGQ6Ci0Jc211bGQJJWkyLCAlaTQsICVpMAotCXNtdWxkCSVpMiwgLTQwOTYsICVpMAotCXNtdWxkCTQwOTUsICVpNCwgJWkwCi0KLSEJQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zCi10ZXN0X2NvcHJvY2Vzc29yOgotIQklY2NzcglpcyByZWdpc3RlciAjIDAKLSEJJWNjZnIJaXMgcmVnaXN0ZXIgIyAxCi0hCSVjY3ByCWlzIHJlZ2lzdGVyICMgMwotIQklY2NjcmNyIGlzIHJlZ2lzdGVyICMgMgotCi0hCXRlc3QgQ1BVU0g6IGp1c3Qgc3ludGF4Ci0KLQljcHVzaAklbDAsICVsMQotCWNwdXNoCSVsMCwgMQotCWNwdXNoYQklbDAsICVsMQotCWNwdXNoYQklbDAsIDEKLQotIQl0ZXN0IENQVUxMOiBqdXN0IHN5bnRheAotCi0JY3B1bGwJJWwwCi0KLSEJdGVzdCBDUFJEQ1hUOiBqdXN0IHN5bnRheAotCi0JY3JkY3h0CSVjY3NyLCAlbDAKLQljcmRjeHQJJWNjZnIsICVsMAotCWNyZGN4dAklY2NwciwgJWwwCi0JY3JkY3h0CSVjY2NyY3IsICVsMAotCi0hCXRlc3QgQ1BXUkNYVDoganVzdCBzeW50YXgKLQotCWN3cmN4dAklbDAsICVjY3NyCi0JY3dyY3h0CSVsMCwgJWNjZnIKLQljd3JjeHQJJWwwLCAlY2NwcgotCWN3cmN4dAklbDAsICVjY2NyY3IKLQotIQl0ZXN0IENCY2NjOiBqdXN0IHN5bnRheAotCi0JY2JuCXN0b3AKLQlub3AKLQljYm4sYQlzdG9wCi0Jbm9wCi0JY2JlCXN0b3AKLQlub3AKLQljYmUsYQlzdG9wCi0Jbm9wCi0JY2JmCXN0b3AKLQlub3AKLQljYmYsYQlzdG9wCi0Jbm9wCi0JY2JlZglzdG9wCi0Jbm9wCi0JY2JlZixhCXN0b3AKLQlub3AKLQljYnIJc3RvcAotCW5vcAotCWNicixhCXN0b3AKLQlub3AKLQljYmVyCXN0b3AKLQlub3AKLQljYmVyLGEJc3RvcAotCW5vcAotCWNiZnIJc3RvcAotCW5vcAotCWNiZnIsYQlzdG9wCi0Jbm9wCi0JY2JlZnIJc3RvcAotCW5vcAotCWNiZWZyLGEJc3RvcAotCW5vcAotCWNiYQlzdG9wCi0Jbm9wCi0JY2JhLGEJc3RvcAotCW5vcAotCWNibmUJc3RvcAotCW5vcAotCWNibmUsYQlzdG9wCi0Jbm9wCi0JY2JuZglzdG9wCi0Jbm9wCi0JY2JuZixhCXN0b3AKLQlub3AKLQljYm5lZglzdG9wCi0Jbm9wCi0JY2JuZWYsYQlzdG9wCi0Jbm9wCi0JY2JucglzdG9wCi0Jbm9wCi0JY2JucixhCXN0b3AKLQlub3AKLQljYm5lcglzdG9wCi0Jbm9wCi0JY2JuZXIsYQlzdG9wCi0Jbm9wCi0JY2JuZnIJc3RvcAotCW5vcAotCWNibmZyLGEJc3RvcAotCW5vcAotCWNibmVmcglzdG9wCi0Jbm9wCi0JY2JuZWZyLGEJc3RvcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGguZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjIyYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGguZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNhczogLUF2NwotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBzcGFyYyBzeW50aAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPGZvbz4geG5vciAgJWcxLCAlZzAsICVnMgotMCswMDA0IDxmb29cKygweHwpND4geG5vciAgJWcxLCAlZzAsICVnMQotMCswMDA4IDxmb29cKygweHwpOD4gbmVnICAlZzEsICVnMgotMCswMDBjIDxmb29cKygweHwpYz4gbmVnICAlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTA2NjI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgY29tbW9uICh2OCBvciB2OSkgc3ludGhldGljIGluc25zCi0JLnRleHQKLWZvbzoKLQlub3QgJWcxLCVnMgotCW5vdCAlZzEKLQluZWcgJWcxLCVnMgotCW5lZyAlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2YzhjOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IHNwYXJjNjQgc3ludGg2NAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxmb28tKDB4fCk0PiBpcHJlZmV0Y2ggIDArMDAwNCA8Zm9vPgotMCswMDA0IDxmb28+IHNpZ254ICAlZzEsICVnMgotMCswMDA4IDxmb29cKygweHwpND4gY2xydXcgICVnMSwgJWcyCi0wKzAwMGMgPGZvb1wrKDB4fCk4PiBjYXMgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxMCA8Zm9vXCsoMHh8KWM+IGNhc2wgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxNCA8Zm9vXCsoMHh8KTEwPiBjYXN4ICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTggPGZvb1wrKDB4fCkxND4gY2FzeGwgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxYyA8Zm9vXCsoMHh8KTE4PiBjbHJ4ICBcWyAlZzEgXCsgJWcyIFxdCi0wKzAwMjAgPGZvb1wrKDB4fCkxYz4gY2xyeCAgXFsgJWcxIFxdCi0wKzAwMjQgPGZvb1wrKDB4fCkyMD4gY2xyeCAgXFsgJWcxIFwrIDEgXF0KLTArMDAyOCA8Zm9vXCsoMHh8KTI0PiBjbHJ4ICBcWyAlZzEgXCsgMHgyYSBcXQotMCswMDJjIDxmb29cKygweHwpMjg+IGNscnggIFxbIDB4NDIgXF0KLTArMDAzMCA8Zm9vXCsoMHh8KTJjPiBzaWdueCAgJWcxCi0wKzAwMzQgPGZvb1wrKDB4fCkzMD4gY2xydXcgICVnMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2FiODczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgc3BhcmM2NCBzeW50aGV0aWMgaW5zbnMKLQkudGV4dAotCWlwcmVmZXRjaCBmb28KLWZvbzoKLQlzaWdueCAlZzEsJWcyCi0JY2xydXcgJWcxLCVnMgotCWNhcyBbJWcxXSwlZzIsJWczCi0JY2FzbCBbJWcxXSwlZzIsJWczCi0JY2FzeCBbJWcxXSwlZzIsJWczCi0JY2FzeGwgWyVnMV0sJWcyLCVnMwotCi0JY2xyeCBbJWcxKyVnMl0KLQljbHJ4IFslZzFdCi0JY2xyeCBbJWcxKzFdCi0JY2xyeCBbNDIrJWcxXQotCWNscnggWzB4NDJdCi0KLQlzaWdueCAlZzEKLQljbHJ1dyAlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzYzgwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCB3cnByCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgk4MSA5MCA0MCAwMCAJd3JwciAgJWcxLCAldHBjCi0gICA0Ogk4MyA5MCA4MCAwMCAJd3JwciAgJWcyLCAldG5wYwotICAgODoJODUgOTAgYzAgMDAgCXdycHIgICVnMywgJXRzdGF0ZQotICAgYzoJODcgOTEgMDAgMDAgCXdycHIgICVnNCwgJXR0Ci0gIDEwOgk4OSA5MSA0MCAwMCAJd3JwciAgJWc1LCAldGljawotICAxNDoJOGIgOTEgODAgMDAgCXdycHIgICVnNiwgJXRiYQotICAxODoJOGQgOTEgYzAgMDAgCXdycHIgICVnNywgJXBzdGF0ZQotICAxYzoJOGYgOTIgMDAgMDAgCXdycHIgICVvMCwgJXRsCi0gIDIwOgk5MSA5MiA0MCAwMCAJd3JwciAgJW8xLCAlcGlsCi0gIDI0Ogk5MyA5MiA4MCAwMCAJd3JwciAgJW8yLCAlY3dwCi0gIDI4Ogk5NSA5MiBjMCAwMCAJd3JwciAgJW8zLCAlY2Fuc2F2ZQotICAyYzoJOTcgOTMgMDAgMDAgCXdycHIgICVvNCwgJWNhbnJlc3RvcmUKLSAgMzA6CTk5IDkzIDQwIDAwIAl3cnByICAlbzUsICVjbGVhbndpbgotICAzNDoJOWIgOTMgODAgMDAgCXdycHIgICVzcCwgJW90aGVyd2luCi0gIDM4Ogk5ZCA5MyBjMCAwMCAJd3JwciAgJW83LCAld3N0YXRlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZmQ0NTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBUZXN0IHdycHIKLQkudGV4dAotCXdycHIgJWcxLCV0cGMKLQl3cnByICVnMiwldG5wYwotCXdycHIgJWczLCV0c3RhdGUKLQl3cnByICVnNCwldHQKLQl3cnByICVnNSwldGljawotCXdycHIgJWc2LCV0YmEKLQl3cnByICVnNywlcHN0YXRlCi0Jd3JwciAlbzAsJXRsCi0Jd3JwciAlbzEsJXBpbAotCXdycHIgJW8yLCVjd3AKLQl3cnByICVvMywlY2Fuc2F2ZQotCXdycHIgJW80LCVjYW5yZXN0b3JlCi0Jd3JwciAlbzUsJWNsZWFud2luCi0Jd3JwciAlbzYsJW90aGVyd2luCi0Jd3JwciAlbzcsJXdzdGF0ZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZmY0NTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNvYmpkdW1wOiAtcgotIyBuYW1lIDogYWRkZW5kcwotLio6ICtmaWxlIGZvcm1hdCBhLm91dC1zdW5vcy1iaWcKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcWy50ZXh0XF06Ci1PRkZTRVQgICBUWVBFICtWQUxVRSAKLTArMDggV0RJU1AyMiArZm9vMVwrMHhmK2ZjCi0wKzBjIFdESVNQMjIgK2ZvbzFcKzB4ZitmOAotMCsxMCBXRElTUDIyICtmb28xXCsweGYrZjAKLTArMTQgV0RJU1AyMiArZm9vMVwrMHhmK2VjCi0wKzFjIDMyICtmb28xCi0wKzIwIDMyICtmb28xXCsweDArNAotIzArMjAgMzIgK2ZvbzFcKzB4MCs0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2I0NmUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jCi0jIFN1bk9TNCBvbiBTUEFSQyB0ZXN0cwotIwotCi1pZiBbaXN0YXJnZXQgc3BhcmMtKi1zdW5vczQqXSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhZGRlbmQiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlYjEwOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS5nbG9iYWwgZm9vCi1mb286Ci0Jbm9wCi0Jbm9wCi0JYmEgZm9vMSsweDQKLQliYSBmb28xKzB4NAotCWJhIGZvbzEKLQliYSBmb28xCi0Jbm9wCi0JLndvcmQgZm9vMQotCS53b3JkIGZvbzErNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUgYi9nYXMvdGVzdHN1aXRlL2dhcy90ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0ZDc5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSMKLSMgVGhpcyBpcyBzb3J0IG9mIGEgcHJvdG90eXBlIHRlc3QgY2FzZSwgd2hpY2ggcGFyc2VzIHRoZSBsaXN0aW5nIG91dHB1dAotIyBmcm9tIHRoZSBhc3NlbWJsZXIuICBMYXRlciwgbW9yZSBwcm90b3R5cGVzIHNob3VsZCBiZSBhZGRlZCBmb3IgY2FzZXMKLSMgd2hlcmUgb2JqZHVtcCBnZXRzIHJ1biBvdmVyIHRoZSAubyBmaWxlLCBhbmQgYW55dGhpbmcgZWxzZSBsaWtlIHRoYXQuLi4KLSMKLSMgV2hlbiB5b3Ugd3JpdGUgYSB0ZXN0IGNhc2UgdGhhdCB1c2VzIHRoZSBsaXN0aW5nIG91dHB1dCwganVzdCBjb3B5IHRoaXMKLSMgZmlsZSAodHJpbW1pbmcgZG93biB0aGUgb3Zlcmx5LXZlcmJvc2UgY29tbWVudHMgYSBsaXR0bGUpLCBhbmQKLSMgYWRqdXN0IGl0IHRvIGRvIHdoYXQgeW91IG5lZWQuCi0jCi0jIFJlbWVtYmVyIHRoYXQgYW55ICIuZXhwIiBmaWxlIGZvdW5kIGluIHRoZSB0cmVlIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5Ci0jIGRlamFnbnUuCi0KLSMKLSMgRklSU1QgU0FNUExFIFRFU1QgQ0FTRQotIwotCi1wcm9jIGRvX2ZvbyB7fSB7Ci0jIFRoaXMgc3RyaW5nIGlzIHVzZWQgYmVsb3cgd2hlbiBwcmludGluZyBvdXQgYSBzdWNjZXNzIG9yIGZhaWx1cmUgbWVzc2FnZS4KLSMgSWYgbW9yZSB0aGFuIG9uZSB0ZXN0IGlzIHJ1biBieSBhIGdpdmVuIC5leHAgZmlsZSwgaXQnZCBiZSBuaWNlIHRvIGluY2x1ZGUKLSMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuCi0gICAgc2V0IHRlc3RuYW1lICJmb28uczogbXVsdGktcmVnaXN0ZXIgdHdlYWtpbmcgYW5kIGZyb2JuaWNhdGlvbiIKLQotIyBJIHVzZSB0aGlzIGFzIGEgZmxhZyB0byByZWNvcmQgd2hldGhlciB0aGUgdGVzdCBjYXNlIHBhc3NlZC4gIElmIHRoaXMKLSMgZmxhZyBpcyBzdGlsbCBjbGVhciB3aGVuIEVPRiBpcyByZWFjaGVkLCB0aGlzIHRlc3QgZmFpbHMuICBJZiB0aGVyZSBhcmUKLSMgdHdvIG9yIG1vcmUgcGF0dGVybnMsIGFuZCBJIG5lZWQgdG8gc2VlIGFsbCBvZiB0aGVtLCBJJ2xsIGNyZWF0ZSBOIHZhcmlhYmxlcwotIyBhbmQgY2hlY2sgaWYgdGhlIHN1bSBpcyBOLgotICAgIHNldCB4IDAKLQotIyBDYWxsIGdhc19zdGFydCB3aXRoIHR3byBhcmd1bWVudHM6IFRoZSBpbnB1dCBmaWxlIG5hbWUgKHdoaWNoIGl0J2xsIHNlYXJjaAotIyBmb3IgaW4gJHNyY2Rpci8kc3ViZGlyLCB0aGF0IGlzLCB0aGUgc291cmNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgLmV4cCBmaWxlCi0jIGlzKSwgYW5kIGEgKHBvc3NpYmx5IGVtcHR5KSBzdHJpbmcgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBhc3NlbWJsZXIuCi0gICAgZ2FzX3N0YXJ0ICJmb28ucyIgIi1hbCIKLQotIyBOb3cgSSBqdXN0IGl0ZXJhdGUgb3ZlciBhbGwgdGhlIG91dHB1dCBsaW5lcywgbG9va2luZyBmb3Igd2hhdCBJIHdhbnQKLSMgdG8gc2VlLiAgU2luY2UgZWFjaCBwYXR0ZXJuIGV4cGxpY2l0bHkgd2lsbCBub3Qgc3BhbiBsaW5lIGJyZWFrcywgdGhlcmUncwotIyBhbHNvIGEgcGF0dGVybiBmb3IgbGluZXMgdGhhdCBkb24ndCBtYXRjaCBhbnl0aGluZyBlbHNlLiAgIChJcyBpdCBzYWZlIHRvCi0jIHVzZSAiLioiIGZvciBwYXR0ZXJucyBub3QgY3Jvc3NpbmcgbGluZSBicmVha3M/IEkgZG9uJ3QgdGhpbmsgIiQiIGRvZXMgdGhlCi0jIHJpZ2h0IHRoaW5nIGZvciB0aGF0LCBpbiBhbnkgY2FzZS4gIEkgc2hvdWxkIGNoZWNrIGludG8gd2hldGhlciB0aGUgZXh0cmEKLSMgcGF0dGVybiBpcyBldmVuIG5lZWRlZC4KLQotIyBBcHBhcmVudGx5IENSTEYgaXMgcmVjZWl2ZWQgd2hlbiB1c2luZyBwdHlzIGZvciBzdWJwcm9jZXNzZXM7IGhlbmNlIHRoZQotIyBcclxuIGZvciBtYXRjaGluZyBsaW5lIG51bWJlciAzLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UgdXNlICJ7IC4uLiB9IiBmb3IgdGhlIGV4cGVjdCBjbGF1c2UsIHlvdSBjYW4ndCBoYXZlCi0jIGNvbW1lbnRzIGluc2lkZSBpdC4KLQotIyBUaGlzIHRlc3QgY2FzZSBpcyBraW5kYSBib2d1cyBpbiB0aGF0IHNlZWluZyBlaXRoZXIgYSB3b3JkIG9mIGFsbCB6ZXJvcwotIyBhdCBhZGRyZXNzIHplcm8gb3IgYSBDLXN0eWxlIGNvbW1lbnQgb24gbGluZSB0aHJlZSB0aGF0IHNheXMgIkxvb2tpbmcgZm9yCi0jIEMgY29tbWVudHMiICh3aXRoIHZlcnkgc3BlY2lmaWMgcHVuY3R1YXRpb24gYW5kIHdoaXRlc3BhY2UpIHdpbGwgY2F1c2UKLSMgaXQgdG8gcGFzcyB0aGlzIHRlc3QuICBVc3VhbGx5IAotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMDAwMFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCSAgICAtcmUgIl4gKzNcWyBcdFxdKy8uIExvb2tpbmcgZm9yIEMgY29tbWVudHMuIC4vXHJcbiIJeyBzZXQgeCAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0jIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQgaXNuJ3QKLSMgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmICR4IHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLSMgTm93IGFjdHVhbGx5IHJ1biB0aGUgdGVzdC4gIEl0IGNhbiBiZSBjb25kaXRpb25hbGl6ZWQgaWYgdGhlIHRlc3QgaXMKLSMgbm90IGFwcHJvcHJpYXRlIGZvciBhbGwgdGFyZ2V0cy4gIFRoZSBwcm9jICJpc3RhcmdldCIgY2hlY2tzIGEgZ2VuZXJhbGl6ZWQKLSMgZm9ybSBvZiB0aGUgdGFyZ2V0IG5hbWUsIHNvIHRoYXQgKGUuZy4pICJtNjgzMzItdW5rbm93bi1hb3V0IiB3b3VsZCBtYXRjaAotIyBoZXJlLiAgU28gZmFyLCBJIHRoaW5rIG9ubHkgdGhlIENQVSBuYW1lIGlzIGFjdHVhbGx5IGV2ZXIgYWx0ZXJlZC4KLWlmIFtpc3RhcmdldCBtNjhrLSpdIHRoZW4gewotICAgIGRvX2ZvbwotfQotCi0KLQotCi0jCi0jIFNFQ09ORCBTQU1QTEUgVEVTVCBDQVNFCi0jCi0KLSMgVGhpcyBpcyBhIHRpbnkgYml0IGxpa2UgdGhlIEMgY29tcGlsZXIgdG9ydHVyZSB0ZXN0cywgaW4gdGhhdCBpdCdsbCBydW4KLSMgdGhlIGFzc2VtYmxlciB3aXRoIHRoZSBwb3dlciBzZXQgb2YgdGhlIGxpc3Qgb2Ygb3B0aW9ucyBzdXBwbGllZC4KLSMKLSMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSB0ZXN0IGZpbGUgbmFtZTsgdGhlIHNlY29uZCBpcyBhcmd1bWVudHMgdGhhdAotIyBhcmUgYWx3YXlzIHRvIGJlIHByb3ZpZGVkOyB0aGUgdGhpcmQgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBvcHRpb25zCi0jIHdoaWNoIGFyZSBvcHRpb25hbCAoZW5kaW5nIGluICI+IiBpZiBvdXRwdXQgc2hvdWxkIGJlIGlnbm9yZWQsIGxpa2UgIi1hPiIpOwotIyB0aGUgZm91cnRoIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0LiAgU28gZmFyLCBvbmx5IGJpbmFyeSBvcHRpb25zIGFyZSBoYW5kbGVkCi0jIHRoaXMgd2F5OyBOLXdheSBvcHRpb25zIChsaWtlIENQVSB0eXBlIGZvciBtNjhrKSBhcmVuJ3QgaGFuZGxlZCB5ZXQuCi0jCi0jIFRoZSB2YXJpYWJsZSAkc3Rkb3B0bGlzdCB1c3VhbGx5IGhhcyBhIHJlYXNvbmFibGUgc2V0IG9mIG9wdGlvbmFsIG9wdGlvbnMKLSMgZm9yIHRoaXMgdGFyZ2V0LgotCi0jIE5vLCBQSUMgaXNuJ3Qgc3VwcG9ydGVkIHlldC4gIFRoaXMgaXMgb25seSBhbiBleGFtcGxlLgotZ2FzX3Rlc3QgInF1dXgucyIgIi1LIiAkc3Rkb3B0bGlzdCAidXNlIG9mIHF1dXhlcyBpbiBQSUMgbW9kZSIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZWM3MDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBzaWduZWQgYW5kIHVuc2lnbmVkIGFkZCBpbnN0cnVjdGlvbnMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTBhIDAwIGZiIDYyLioKLSAgIDQ6CWZmIDNmIGFjIDIwLioKLSAgIDg6CTAwIDQwIDJjIDIxLioKLSAgIGM6CTAwIDEwIDdiIDMxIDAwIDQwIDAwIDAwLioKLSAgMTQ6CTAwIDEwIGZiIDQxIGZmIGJmIGZmIGZmLioKLSAgMWM6CTAwIDEwIGJiIDVhIGZmIGZmIGZmIDdmLioKLSAgMjQ6CTAwIDEwIDNiIDZiIDAwIDAwIDAwIDgwLioKLSAgMmM6CTBhIDIwIGZiIDYyLioKLSAgMzA6CWZmIGJmIGFjIDIwLioKLSAgMzQ6CTAwIGMwIDJjIDIxLioKLSAgMzg6CTAwIDMwIDdiIDMxIDAwIDQwIDAwIDAwLioKLSAgNDA6CTAwIDMwIGZiIDQxIGZmIGJmIGZmIGZmLioKLSAgNDg6CTAwIDMwIGJiIDVhIGZmIGZmIGZmIDdmLioKLSAgNTA6CTAwIDMwIDNiIDZiIDAwIDAwIDAwIDgwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJiMzY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMjA6MTM6MzMgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1hZGQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOyBUZXN0IHNpZ25lZCBhbmQgdW5zaWduZWQgYWRkaXRpb24gaW5zdHJ1Y3Rpb24uCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7IFRlc3QgYm91bmRhcnkgY29uZGl0aW9ucyB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nLgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOyBOb3RlIHRoYXQgdW5zaWduZWQgYWRkaXRpb24gc3RpbGwgdXNlcyBzaWduZWQgaW1tZWRpYXRlcy4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1IDAwMDAwMDAwICAgNjJGQjAwMEEgICAgICAgICBhZGQgICAgIHIxMCxyMTEscjEyICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA2IDAwMDAwMDA0ICAgMjBBQzNGRkYgICAgICAgICBhZGQgICAgIDE2MzgzLHIyLHI0ICAgICAgICAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgIDcgMDAwMDAwMDggICAyMTJDNDAwMCAgICAgICAgIGFkZCAgICAgLTE2Mzg0LHI0LHI0ICAgICAgICAgICAgOyBNaW5pbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgOCAwMDAwMDAwQyAgIDMxN0IxMDAwICAgICAgICAgYWRkICAgICAxNjM4NCxyNSxyNiAgICAgICAgICAgICA7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwMTAgICAwMDAwNDAwMCAKLSAgICAgICAgOSAwMDAwMDAxNCAgIDQxRkIxMDAwICAgICAgICAgYWRkICAgICAtMTYzODUscjcscjggICAgICAgICAgICA7IE1heGltdW0gbmVnYXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDE4ICAgRkZGRkJGRkYgCi0gICAgICAgMTAgMDAwMDAwMUMgICA1QUJCMTAwMCAgICAgICAgIGFkZCAgICAgMjE0NzQ4MzY0NyxyMTAscjExICAgICAgOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDIwICAgN0ZGRkZGRkYgCi0gICAgICAgMTEgMDAwMDAwMjQgICA2QjNCMTAwMCAgICAgICAgIGFkZCAgICAgLTIxNDc0ODM2NDgscjEyLHIxMyAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDI4ICAgODAwMDAwMDAgCi0gICAgICAgMTIgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxMyAwMDAwMDAyQyAgIDYyRkIyMDBBICAgICAgICAgYWRkdSAgICByMTAscjExLHIxMiAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNCAwMDAwMDAzMCAgIDIwQUNCRkZGICAgICAgICAgYWRkdSAgICAxNjM4MyxyMixyNCAgICAgICAgICAgICA7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgIDE1IDAwMDAwMDM0ICAgMjEyQ0MwMDAgICAgICAgICBhZGR1ICAgIC0xNjM4NCxyNCxyNCAgICAgICAgICAgIDsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgMTYgMDAwMDAwMzggICAzMTdCMzAwMCAgICAgICAgIGFkZHUgICAgMTYzODQscjUscjYgICAgICAgICAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDNDICAgMDAwMDQwMDAgCi0gICAgICAgMTcgMDAwMDAwNDAgICA0MUZCMzAwMCAgICAgICAgIGFkZHUgICAgLTE2Mzg1LHI3LHI4ICAgICAgICAgICAgOyBNYXhpbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDA0NCAgIEZGRkZCRkZGIAotICAgICAgIDE4IDAwMDAwMDQ4ICAgNUFCQjMwMDAgICAgICAgICBhZGR1ICAgIDIxNDc0ODM2NDcscjEwLHIxMSAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDA0QyAgIDdGRkZGRkZGIAotICAgICAgIDE5IDAwMDAwMDUwICAgNkIzQjMwMDAgICAgICAgICBhZGR1ICAgIC0yMTQ3NDgzNjQ4LHIxMixyMTMgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDA1NCAgIDgwMDAwMDAwIAotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjI5ZWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi07IFRlc3Qgc2lnbmVkIGFuZCB1bnNpZ25lZCBhZGRpdGlvbiBpbnN0cnVjdGlvbi4KLTsgVGVzdCBib3VuZGFyeSBjb25kaXRpb25zIHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxpbmcuCi07IE5vdGUgdGhhdCB1bnNpZ25lZCBhZGRpdGlvbiBzdGlsbCB1c2VzIHNpZ25lZCBpbW1lZGlhdGVzLgotCi0JYWRkCXIxMCxyMTEscjEyCQk7IFJlZ2lzdGVyIGZvcm0KLQlhZGQJMTYzODMscjIscjQJCTsgTWF4aW11bSBwb3NpdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCS0xNjM4NCxyNCxyNAkJOyBNaW5pbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLQlhZGQJMTYzODQscjUscjYJCTsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLQlhZGQJLTE2Mzg1LHI3LHI4CQk7IE1heGltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCTIxNDc0ODM2NDcscjEwLHIxMQk7IE1heGltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCS0yMTQ3NDgzNjQ4LHIxMixyMTMJOyBNaW5pbXVtIG5lZ2F0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCi0JYWRkdQlyMTAscjExLHIxMgkJOyBSZWdpc3RlciBmb3JtCi0JYWRkdQkxNjM4MyxyMixyNAkJOyBNYXhpbXVtIHBvc2l0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLQlhZGR1CS0xNjM4NCxyNCxyNAkJOyBNaW5pbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLQlhZGR1CTE2Mzg0LHI1LHI2CQk7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQktMTYzODUscjcscjgJCTsgTWF4aW11bSBuZWdhdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLQlhZGR1CTIxNDc0ODM2NDcscjEwLHIxMQk7IE1heGltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQktMjE0NzQ4MzY0OCxyMTIscjEzCTsgTWluaW11bSBuZWdhdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY5NjEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCAuYWxpZ24gcHNldWRvIG9wCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOglhYiAwMCAwMCAwMC4qCi0gICA0OgljZCAwMCBlZiAwMC4qCi0gICA4OglmMSAwMCAwMCAwMC4qCi0gICBjOgllZSAwMCAwMCAwMC4qCi0gIDEwOglhYyAwMCAwMCAwMC4qCi0gIDE0OgkwMCAwMCAwMCAwMC4qCi0gIDE4OglhYiAwMCAwMCAwMC4qCi0gIDFjOgkwMCAwMCAwMCAwMC4qCi0gIDIwOglmZSAwMCAwMCAwMC4qCi0JXC5cLlwuCi0gIDMwOglkZSBhZCBiZSBlZi4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTQxNWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0CisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBUaHUgRmViIDI3IDE3OjAyOjIzIDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYWxpZ24ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7ICAgICAgVGVzdCB0aGUgLmFsaWduIGRpcmVjdGl2ZS4KLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAzIDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAudGV4dAotICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQjAwMDAwMAotICAgICAgICA2IDAwMDAwMDAwICAgQUIgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUIKLSAgICAgICAgNyAwMDAwMDAwMSAgICAgICAgICAgICAgICAgICAgLmFsaWduICAgICAgICAgICAgICAgICAgOyBTaG91bGQgZGVmYXVsdCB0byA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhDRDAwRUYwMAotICAgICAgIDEwIDAwMDAwMDA0ICAgQ0QgICAgICAgICAgICAgICAuYnl0ZSAgIDB4Q0QKLSAgICAgICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduICAyICAgICAgICAgICAgICAgOyAgU2hvdWxkIGFsaWduIHRvIHRoZSBuZXh0IDItYnl0ZSBib3VuZGFyeSAocGFkIHdpdGggb25lIG51bGwgYnl0Ci0gICAgICAgMTIgMDAwMDAwMDYgICBFRiAgICAgICAgICAgICAgIC5ieXRlICAgMHhFRgotICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDEKLSAgICAgICAxNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEYxMDAwMDAwCi0gICAgICAgMTYgMDAwMDAwMDcgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgNCAgICAgICAgICAgICAgIDsgIFNob3VsZCBub3QgYWZmZWN0IGFsaWdubWVudCAoYWxyZWFkeSBvbiA0KQotICAgICAgIDE3IDAwMDAwMDA4ICAgRjEgICAgICAgICAgICAgICAuYnl0ZSAgIDB4RjEKLSAgICAgICAxOCAwMDAwMDAwOSAgICAgICAgICAgICAgICAgICAgLmFsaWduICA0ICAgICAgICAgICAgICAgOyAgU2hvdWxkIGFsaWduIHRvIG5leHQgNCBieXRlIGJvdW5kYXJ5Ci0gICAgICAgMTkgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhFRTAwMDAwMCBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBvbiA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgMjEgMDAwMDAwMEMgICBFRSAgICAgICAgICAgICAgIC5ieXRlIDB4RUUKLSAgICAgICAyMiAwMDAwMDAwRCAgICAgICAgICAgICAgICAgICAgLmFsaWduICA4Ci0gICAgICAgMjMgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQzAwMDAwMCAweDAwMDAwMDAwCi0gICAgICAgMjUgMDAwMDAwMTAgICBBQyAgICAgICAgICAgICAgIC5ieXRlICAgMHhBQwotICAgICAgIDI2IDAwMDAwMDExICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDgKLSAgICAgICAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAgMHgwMDAwMDAwMCBzaW5jZSB3ZSBhcmUgYXQgOCBieXRlIGFsaWdubWVudAotICAgICAgIDI5IDAwMDAwMDE4ICAgQUIgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUIKLSAgICAgICAzMCAwMDAwMDAxOSAgICAgICAgICAgICAgICAgICAgLmFsaWduICAxNgotICAgICAgIDMxICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RkUwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAKLSAgICAgICAzMyAwMDAwMDAyMCAgIEZFICAgICAgICAgICAgICAgLmJ5dGUgICAweEZFCi0gICAgICAgMzQgMDAwMDAwMjEgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMTYKLSAgICAgICAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMganVzdCBmb3JjZXMgdGhlIGRpc2Fzc2VtYmxlciB0byBub3QgcHJpbnQgLi4uIGZvciB0cmFpbGluZyBudWxscwotICAgICAgIDM3IDAwMDAwMDMwICAgREUgICAgICAgICAgICAgICAuYnl0ZSAweERFLCAweEFELCAweEJFLCAweEVGCi0gICAgICAgICAgMDAwMDAwMzEgICBBRCAgICAgICAKLSAgICAgICAgICAwMDAwMDAzMiAgIEJFICAgICAgIAotICAgICAgICAgIDAwMDAwMDMzICAgRUYgICAgICAgCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzEyNTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ucworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTs7CVRlc3QgdGhlIC5hbGlnbiBkaXJlY3RpdmUuCi0KLQkudGV4dAotCQotCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAKLQkuYnl0ZQkweEFCCi0JLmFsaWduCQkJOyBTaG91bGQgZGVmYXVsdCB0byA0IGJ5dGUgYWxpZ25tZW50Ci0KLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweENEMDBFRjAwCi0JLmJ5dGUJMHhDRAotCS5hbGlnbgkyCQk7ICBTaG91bGQgYWxpZ24gdG8gdGhlIG5leHQgMi1ieXRlIGJvdW5kYXJ5IChwYWQgd2l0aCBvbmUgbnVsbCBieXRlKQotCS5ieXRlCTB4RUYKLQkuYWxpZ24JMQotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhGMTAwMDAwMAotCS5hbGlnbgk0CQk7ICBTaG91bGQgbm90IGFmZmVjdCBhbGlnbm1lbnQgKGFscmVhZHkgb24gNCkKLQkuYnl0ZQkweEYxCi0JLmFsaWduCTQJCTsgIFNob3VsZCBhbGlnbiB0byBuZXh0IDQgYnl0ZSBib3VuZGFyeQotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhFRTAwMDAwMCBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBvbiA0IGJ5dGUgYWxpZ25tZW50Ci0JLmJ5dGUgMHhFRQotCS5hbGlnbgk4Ci0KLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFDMDAwMDAwIDB4MDAwMDAwMDAKLQkuYnl0ZQkweEFDCi0JLmFsaWduCTgKLQkKLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFCMDAwMDAwIDB4MDAwMDAwMDAgc2luY2Ugd2UgYXJlIGF0IDggYnl0ZSBhbGlnbm1lbnQKLQkuYnl0ZQkweEFCCi0JLmFsaWduCTE2Ci0KLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEZFMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwCi0JLmJ5dGUJMHhGRQotCS5hbGlnbgkxNgotCQotCTs7IFRoaXMganVzdCBmb3JjZXMgdGhlIGRpc2Fzc2VtYmxlciB0byBub3QgcHJpbnQgLi4uIGZvciB0cmFpbGluZyBudWxscwotCS5ieXRlIDB4REUsIDB4QUQsIDB4QkUsIDB4RUYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYWVlOGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBjb3ZlcmFnZSBvZiBzeW1ib2xpYyBCSVROVU0gdmFsdWVzCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwYSA0MCAzOSBmYS4qCi0gICA0OgkwYSA0MCAzOSBmMi4qCi0gICA4OgkwYSA0MCAzOSBlYS4qCi0gICBjOgkwYSA0MCAzOSBlMi4qCi0gIDEwOgkwYSA0MCAzOSBkYS4qCi0gIDE0OgkwYSA0MCAzOSBkMi4qCi0gIDE4OgkwYSA0MCAzOSBjYS4qCi0gIDFjOgkwYSA0MCAzOSBjMi4qCi0gIDIwOgkwYSA0MCAzOSBiYS4qCi0gIDI0OgkwYSA0MCAzOSBiMi4qCi0gIDI4OgkwYSA0MCAzOSBhYS4qCi0gIDJjOgkwYSA0MCAzOSBhMi4qCi0gIDMwOgkwYSA0MCAzOSA5YS4qCi0gIDM0OgkwYSA0MCAzOSA5Mi4qCi0gIDM4OgkwYSA0MCAzOSA4YS4qCi0gIDNjOgkwYSA0MCAzOSA4Mi4qCi0gIDQwOgkwYSA0MCAzOSA3YS4qCi0gIDQ0OgkwYSA0MCAzOSA3Mi4qCi0gIDQ4OgkwYSA0MCAzOSA2YS4qCi0gIDRjOgkwYSA0MCAzOSA2Mi4qCi0gIDUwOgkwYSA0MCAzOSA1YS4qCi0gIDU0OgkwYSA0MCAzOSA1Mi4qCi0gIDU4OgkwYSA0MCAzOSA0YS4qCi0gIDVjOgkwYSA0MCAzOSA0Mi4qCi0gIDYwOgkwYSA0MCAzOSAzYS4qCi0gIDY0OgkwYSA0MCAzOSAzMi4qCi0gIDY4OgkwYSA0MCAzOSAyYS4qCi0gIDZjOgkwYSA0MCAzOSAyMi4qCi0gIDcwOgkwYSA0MCAzOSAxYS4qCi0gIDc0OgkwYSA0MCAzOSAxMi4qCi0gIDc4OgkwYSA0MCAzOSA1YS4qCi0gIDdjOgkwYSA0MCAzOSA1Mi4qCi0gIDgwOgkwYSA0MCAzOSA0YS4qCi0gIDg0OgkwYSA0MCAzOSA0Mi4qCi0gIDg4OgkwYSA0MCAzOSAzYS4qCi0gIDhjOgkwYSA0MCAzOSAzMi4qCi0gIDkwOgkwYSA0MCAzOSAyYS4qCi0gIDk0OgkwYSA0MCAzOSAyMi4qCi0gIDk4OgkwYSA0MCAzOSAxYS4qCi0gIDljOgkwYSA0MCAzOSAxMi4qCi0gIGEwOgkwYSA0MCAzOSAwYS4qCi0gIGE0OgkwYSA0MCAzOSAwMi4qCi0gIGE4OgkwYSA0MCAzOSBmYS4qCi0gIGFjOgkwYSA0MCAzOSBmMi4qCi0gIGIwOgkwYSA0MCAzOSBlYS4qCi0gIGI0OgkwYSA0MCAzOSBlMi4qCi0gIGI4OgkwYSA0MCAzOSBkYS4qCi0gIGJjOgkwYSA0MCAzOSBkMi4qCi0gIGMwOgkwYSA0MCAzOSBjYS4qCi0gIGM0OgkwYSA0MCAzOSBjMi4qCi0gIGM4OgkwYSA0MCAzOSBiYS4qCi0gIGNjOgkwYSA0MCAzOSBiMi4qCi0gIGQwOgkwYSA0MCAzOSBhYS4qCi0gIGQ0OgkwYSA0MCAzOSBhMi4qCi0gIGQ4OgkwYSA0MCAzOSA5YS4qCi0gIGRjOgkwYSA0MCAzOSA5Mi4qCi0gIGUwOgkwYSA0MCAzOSA4YS4qCi0gIGU0OgkwYSA0MCAzOSA4Mi4qCi0gIGU4OgkwYSA0MCAzOSA3YS4qCi0gIGVjOgkwYSA0MCAzOSA3Mi4qCi0gIGYwOgkwYSA0MCAzOSA2YS4qCi0gIGY0OgkwYSA0MCAzOSA2Mi4qCi0gIGY4OgkwYSA0MCAzOSA1YS4qCi0gIGZjOgkwYSA0MCAzOSA1Mi4qCi0gMTAwOgkwYSA0MCAzOSA0YS4qCi0gMTA0OgkwYSA0MCAzOSA0Mi4qCi0gMTA4OgkwYSA0MCAzOSAzYS4qCi0gMTBjOgkwYSA0MCAzOSAzMi4qCi0gMTEwOgkwYSA0MCAzOSAyYS4qCi0gMTE0OgkwYSA0MCAzOSAyMi4qCi0gMTE4OgkwYSA0MCAzOSAxYS4qCi0gMTFjOgkwYSA0MCAzOSAxMi4qCi0gMTIwOgkwYSA0MCAzOSAwYS4qCi0gMTI0OgkwYSA0MCAzOSAwMi4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjMjY4Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ubHN0CisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTYXQgRmViIDIyIDIxOjM3OjE1IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYml0bnVtLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgQklUTlVNIGZpZWxkCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7OyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuICBBbHNvCi0gICAgICAgIDMgICAgICAgICAgICAgICAgICAgICA7OyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLCBhbmQKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIDs7IHRoYXQgdGhlIHJhdyBudW1lcmljIHZhbHVlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgKHN0b3JlZCBhcwotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgOzsgdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIG9wZXJhbmQgbnVtZXJpYyB2YWx1ZS4KLSAgICAgICAgNiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA3IDAwMDAwMDAwICAgRkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS5iICAgICA7ICh+MCAmIDB4MUYpCi0gICAgICAgIDggMDAwMDAwMDQgICBGMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmIgICAgIDsgKH4xICYgMHgxRikKLSAgICAgICAgOSAwMDAwMDAwOCAgIEVBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QuYiAgICAgOyAofjIgJiAweDFGKQotICAgICAgIDEwIDAwMDAwMDBDICAgRTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS5iICAgICA7ICh+MyAmIDB4MUYpCi0gICAgICAgMTEgMDAwMDAwMTAgICBEQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmIgICAgIDsgKH40ICYgMHgxRikKLSAgICAgICAxMiAwMDAwMDAxNCAgIEQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UuYiAgICAgOyAofjUgJiAweDFGKQotICAgICAgIDEzIDAwMDAwMDE4ICAgQ0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxoaS5iICAgICA7ICh+NiAmIDB4MUYpCi0gICAgICAgMTQgMDAwMDAwMUMgICBDMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxzLmIgICAgIDsgKH43ICYgMHgxRikKLSAgICAgICAxNSAwMDAwMDAyMCAgIEJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8uYiAgICAgOyAofjggJiAweDFGKQotICAgICAgIDE2IDAwMDAwMDI0ICAgQjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxocy5iICAgICA7ICh+OSAmIDB4MUYpCi0gICAgICAgMTcgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxOCAwMDAwMDAyOCAgIEFBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEuaCAgICAgOyAofjEwICYgMHgxRikKLSAgICAgICAxOSAwMDAwMDAyQyAgIEEyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbmUuaCAgICAgOyAofjExICYgMHgxRikKLSAgICAgICAyMCAwMDAwMDAzMCAgIDlBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QuaCAgICAgOyAofjEyICYgMHgxRikKLSAgICAgICAyMSAwMDAwMDAzNCAgIDkyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUuaCAgICAgOyAofjEzICYgMHgxRikKLSAgICAgICAyMiAwMDAwMDAzOCAgIDhBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHQuaCAgICAgOyAofjE0ICYgMHgxRikKLSAgICAgICAyMyAwMDAwMDAzQyAgIDgyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UuaCAgICAgOyAofjE1ICYgMHgxRikKLSAgICAgICAyNCAwMDAwMDA0MCAgIDdBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkuaCAgICAgOyAofjE2ICYgMHgxRikKLSAgICAgICAyNSAwMDAwMDA0NCAgIDcyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHMuaCAgICAgOyAofjE3ICYgMHgxRikKLSAgICAgICAyNiAwMDAwMDA0OCAgIDZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8uaCAgICAgOyAofjE4ICYgMHgxRikKLSAgICAgICAyNyAwMDAwMDA0QyAgIDYyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMuaCAgICAgOyAofjE5ICYgMHgxRikKLSAgICAgICAyOCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDI5IDAwMDAwMDUwICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS53ICAgICA7ICh+MjAgJiAweDFGKQotICAgICAgIDMwIDAwMDAwMDU0ICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS53ICAgICA7ICh+MjEgJiAweDFGKQotICAgICAgIDMxIDAwMDAwMDU4ICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxndC53ICAgICA7ICh+MjIgJiAweDFGKQotICAgICAgIDMyIDAwMDAwMDVDICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS53ICAgICA7ICh+MjMgJiAweDFGKQotICAgICAgIDMzIDAwMDAwMDYwICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC53ICAgICA7ICh+MjQgJiAweDFGKQotICAgICAgIDM0IDAwMDAwMDY0ICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxnZS53ICAgICA7ICh+MjUgJiAweDFGKQotICAgICAgIDM1IDAwMDAwMDY4ICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxoaS53ICAgICA7ICh+MjYgJiAweDFGKQotICAgICAgIDM2IDAwMDAwMDZDICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxscy53ICAgICA7ICh+MjcgJiAweDFGKQotICAgICAgIDM3IDAwMDAwMDcwICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsby53ICAgICA7ICh+MjggJiAweDFGKQotICAgICAgIDM4IDAwMDAwMDc0ICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxocy53ICAgICA7ICh+MjkgJiAweDFGKQotICAgICAgIDM5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgNDAgMDAwMDAwNzggICA1QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGVxLmYgICAgIDsgKH4yMCAmIDB4MUYpCi0gICAgICAgNDEgMDAwMDAwN0MgICA1MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmYgICAgIDsgKH4yMSAmIDB4MUYpCi0gICAgICAgNDIgMDAwMDAwODAgICA0QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmYgICAgIDsgKH4yMiAmIDB4MUYpCi0gICAgICAgNDMgMDAwMDAwODQgICA0MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxlLmYgICAgIDsgKH4yMyAmIDB4MUYpCi0gICAgICAgNDQgMDAwMDAwODggICAzQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmYgICAgIDsgKH4yNCAmIDB4MUYpCi0gICAgICAgNDUgMDAwMDAwOEMgICAzMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmYgICAgIDsgKH4yNSAmIDB4MUYpCi0gICAgICAgNDYgMDAwMDAwOTAgICAyQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG91LmYgICAgIDsgKH4yNiAmIDB4MUYpCi0gICAgICAgNDcgMDAwMDAwOTQgICAyMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGluLmYgICAgIDsgKH4yNyAmIDB4MUYpCi0gICAgICAgNDggMDAwMDAwOTggICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGliLmYgICAgIDsgKH4yOCAmIDB4MUYpCi0gICAgICAgNDkgMDAwMDAwOUMgICAxMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG9iLmYgICAgIDsgKH4yOSAmIDB4MUYpCi0gICAgICAgNTAgMDAwMDAwQTAgICAwQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LHVvLmYgICAgIDsgKH4zMCAmIDB4MUYpCi0gICAgICAgNTEgMDAwMDAwQTQgICAwMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG9yLmYgICAgIDsgKH4zMSAmIDB4MUYpCi0gICAgICAgNTIgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICA1MyAwMDAwMDBBOCAgIEZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMAotICAgICAgIDU0IDAwMDAwMEFDICAgRjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxCi0gICAgICAgNTUgMDAwMDAwQjAgICBFQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMjE6Mzc6MTUgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1iaXRudW0ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgIDU2IDAwMDAwMEI0ICAgRTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzCi0gICAgICAgNTcgMDAwMDAwQjggICBEQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDQKLSAgICAgICA1OCAwMDAwMDBCQyAgIEQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsNQotICAgICAgIDU5IDAwMDAwMEMwICAgQ0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw2Ci0gICAgICAgNjAgMDAwMDAwQzQgICBDMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDcKLSAgICAgICA2MSAwMDAwMDBDOCAgIEJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsOAotICAgICAgIDYyIDAwMDAwMENDICAgQjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw5Ci0gICAgICAgNjMgMDAwMDAwRDAgICBBQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEwCi0gICAgICAgNjQgMDAwMDAwRDQgICBBMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDExCi0gICAgICAgNjUgMDAwMDAwRDggICA5QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEyCi0gICAgICAgNjYgMDAwMDAwREMgICA5MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEzCi0gICAgICAgNjcgMDAwMDAwRTAgICA4QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE0Ci0gICAgICAgNjggMDAwMDAwRTQgICA4MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE1Ci0gICAgICAgNjkgMDAwMDAwRTggICA3QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE2Ci0gICAgICAgNzAgMDAwMDAwRUMgICA3MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE3Ci0gICAgICAgNzEgMDAwMDAwRjAgICA2QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE4Ci0gICAgICAgNzIgMDAwMDAwRjQgICA2MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE5Ci0gICAgICAgNzMgMDAwMDAwRjggICA1QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIwCi0gICAgICAgNzQgMDAwMDAwRkMgICA1MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIxCi0gICAgICAgNzUgMDAwMDAxMDAgICA0QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIyCi0gICAgICAgNzYgMDAwMDAxMDQgICA0MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIzCi0gICAgICAgNzcgMDAwMDAxMDggICAzQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI0Ci0gICAgICAgNzggMDAwMDAxMEMgICAzMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI1Ci0gICAgICAgNzkgMDAwMDAxMTAgICAyQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI2Ci0gICAgICAgODAgMDAwMDAxMTQgICAyMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI3Ci0gICAgICAgODEgMDAwMDAxMTggICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI4Ci0gICAgICAgODIgMDAwMDAxMUMgICAxMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI5Ci0gICAgICAgODMgMDAwMDAxMjAgICAwQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDMwCi0gICAgICAgODQgMDAwMDAxMjQgICAwMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDMxCi0gICAgICAgODUgICAgICAgICAgICAgICAgICAgICAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTI2ZTA2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5zCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotOzsgVGVzdCB0aGF0IGFsbCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMgZm9yIHRoZSBCSVROVU0gZmllbGQKLTs7IGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4gIEFsc28KLTs7IHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlzYXNzZW1ibGVkIGNvcnJlY3RseSBhcyBzeW1ib2xpY3MsIGFuZAotOzsgdGhhdCB0aGUgcmF3IG51bWVyaWMgdmFsdWVzIGFyZSBoYW5kbGVkIGNvcnJlY3RseSAoc3RvcmVkIGFzCi07OyB0aGUgb25lJ3MgY29tcGxlbWVudCBvZiB0aGUgb3BlcmFuZCBudW1lcmljIHZhbHVlLgotCi0JYmJvCXIxMCxyOCxlcS5iCTsgKH4wICYgMHgxRikKLQliYm8JcjEwLHI4LG5lLmIJOyAofjEgJiAweDFGKQotCWJibwlyMTAscjgsZ3QuYgk7ICh+MiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsZS5iCTsgKH4zICYgMHgxRikKLQliYm8JcjEwLHI4LGx0LmIJOyAofjQgJiAweDFGKQotCWJibwlyMTAscjgsZ2UuYgk7ICh+NSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxoaS5iCTsgKH42ICYgMHgxRikKLQliYm8JcjEwLHI4LGxzLmIJOyAofjcgJiAweDFGKQotCWJibwlyMTAscjgsbG8uYgk7ICh+OCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxocy5iCTsgKH45ICYgMHgxRikKLQotCWJibwlyMTAscjgsZXEuaAk7ICh+MTAgJiAweDFGKQotCWJibwlyMTAscjgsbmUuaAk7ICh+MTEgJiAweDFGKQotCWJibwlyMTAscjgsZ3QuaAk7ICh+MTIgJiAweDFGKQotCWJibwlyMTAscjgsbGUuaAk7ICh+MTMgJiAweDFGKQotCWJibwlyMTAscjgsbHQuaAk7ICh+MTQgJiAweDFGKQotCWJibwlyMTAscjgsZ2UuaAk7ICh+MTUgJiAweDFGKQotCWJibwlyMTAscjgsaGkuaAk7ICh+MTYgJiAweDFGKQotCWJibwlyMTAscjgsbHMuaAk7ICh+MTcgJiAweDFGKQotCWJibwlyMTAscjgsbG8uaAk7ICh+MTggJiAweDFGKQotCWJibwlyMTAscjgsaHMuaAk7ICh+MTkgJiAweDFGKQotCi0JYmJvCXIxMCxyOCxlcS53CTsgKH4yMCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxuZS53CTsgKH4yMSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxndC53CTsgKH4yMiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsZS53CTsgKH4yMyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsdC53CTsgKH4yNCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxnZS53CTsgKH4yNSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxoaS53CTsgKH4yNiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxscy53CTsgKH4yNyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsby53CTsgKH4yOCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxocy53CTsgKH4yOSAmIDB4MUYpCi0KLQliYm8JcjEwLHI4LGVxLmYJOyAofjIwICYgMHgxRikKLQliYm8JcjEwLHI4LG5lLmYJOyAofjIxICYgMHgxRikKLQliYm8JcjEwLHI4LGd0LmYJOyAofjIyICYgMHgxRikKLQliYm8JcjEwLHI4LGxlLmYJOyAofjIzICYgMHgxRikKLQliYm8JcjEwLHI4LGx0LmYJOyAofjI0ICYgMHgxRikKLQliYm8JcjEwLHI4LGdlLmYJOyAofjI1ICYgMHgxRikKLQliYm8JcjEwLHI4LG91LmYJOyAofjI2ICYgMHgxRikKLQliYm8JcjEwLHI4LGluLmYJOyAofjI3ICYgMHgxRikKLQliYm8JcjEwLHI4LGliLmYJOyAofjI4ICYgMHgxRikKLQliYm8JcjEwLHI4LG9iLmYJOyAofjI5ICYgMHgxRikKLQliYm8JcjEwLHI4LHVvLmYJOyAofjMwICYgMHgxRikKLQliYm8JcjEwLHI4LG9yLmYJOyAofjMxICYgMHgxRikKLQotCWJibwlyMTAscjgsMAotCWJibwlyMTAscjgsMQotCWJibwlyMTAscjgsMgotCWJibwlyMTAscjgsMwotCWJibwlyMTAscjgsNAotCWJibwlyMTAscjgsNQotCWJibwlyMTAscjgsNgotCWJibwlyMTAscjgsNwotCWJibwlyMTAscjgsOAotCWJibwlyMTAscjgsOQotCWJibwlyMTAscjgsMTAKLQliYm8JcjEwLHI4LDExCi0JYmJvCXIxMCxyOCwxMgotCWJibwlyMTAscjgsMTMKLQliYm8JcjEwLHI4LDE0Ci0JYmJvCXIxMCxyOCwxNQotCWJibwlyMTAscjgsMTYKLQliYm8JcjEwLHI4LDE3Ci0JYmJvCXIxMCxyOCwxOAotCWJibwlyMTAscjgsMTkKLQliYm8JcjEwLHI4LDIwCi0JYmJvCXIxMCxyOCwyMQotCWJibwlyMTAscjgsMjIKLQliYm8JcjEwLHI4LDIzCi0JYmJvCXIxMCxyOCwyNAotCWJibwlyMTAscjgsMjUKLQliYm8JcjEwLHI4LDI2Ci0JYmJvCXIxMCxyOCwyNwotCWJibwlyMTAscjgsMjgKLQliYm8JcjEwLHI4LDI5Ci0JYmJvCXIxMCxyOCwzMAotCWJibwlyMTAscjgsMzEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTM4YWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUuZAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIGNvdmVyYWdlIG9mIHN5bWJvbGljIGNvbmRpdGlvbiBjb2RlIHZhbHVlcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDcgYTAgNzkgMDEuKgotICAgNDoJMDcgYTAgNzkgMDkuKgotICAgODoJMDcgYTAgNzkgMTEuKgotICAgYzoJMDcgYTAgNzkgMTkuKgotICAxMDoJMDcgYTAgNzkgMjEuKgotICAxNDoJMDcgYTAgNzkgMjkuKgotICAxODoJMDcgYTAgNzkgMzEuKgotICAxYzoJMDcgYTAgNzkgMzkuKgotICAyMDoJMDcgYTAgNzkgNDEuKgotICAyNDoJMDcgYTAgNzkgNDkuKgotICAyODoJMDcgYTAgNzkgNTEuKgotICAyYzoJMDcgYTAgNzkgNTkuKgotICAzMDoJMDcgYTAgNzkgNjEuKgotICAzNDoJMDcgYTAgNzkgNjkuKgotICAzODoJMDcgYTAgNzkgNzEuKgotICAzYzoJMDcgYTAgNzkgNzkuKgotICA0MDoJMDcgYTAgNzkgODEuKgotICA0NDoJMDcgYTAgNzkgODkuKgotICA0ODoJMDcgYTAgNzkgOTEuKgotICA0YzoJMDcgYTAgNzkgOTkuKgotICA1MDoJMDcgYTAgNzkgYTEuKgotICA1NDoJMDcgYTAgNzkgYTkuKgotICA1ODoJMDcgYTAgNzkgYjEuKgotICA1YzoJMDcgYTAgNzkgYjkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAzNTFjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo0OSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWNjb2RlLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgdGhlIGNvbmRpdGlvbgotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgY29kZXMgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgIEFsc28gdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaXNhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1IDAwMDAwMDAwICAgMDE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5ldi5iICAgICAgICAgICAgIDsgMDAwMDAKLSAgICAgICAgNiAwMDAwMDAwNCAgIDA5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxndDAuYiAgICAgICAgICAgICA7IDAwMDAxCi0gICAgICAgIDcgMDAwMDAwMDggICAxMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZXEwLmIgICAgICAgICAgICAgOyAwMDAxMAotICAgICAgICA4IDAwMDAwMDBDICAgMTk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGdlMC5iICAgICAgICAgICAgIDsgMDAwMTEKLSAgICAgICAgOSAwMDAwMDAxMCAgIDIxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsdDAuYiAgICAgICAgICAgICA7IDAwMTAwCi0gICAgICAgMTAgMDAwMDAwMTQgICAyOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmUwLmIgICAgICAgICAgICAgOyAwMDEwMQotICAgICAgIDExIDAwMDAwMDE4ICAgMzE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGxlMC5iICAgICAgICAgICAgIDsgMDAxMTAKLSAgICAgICAxMiAwMDAwMDAxQyAgIDM5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxhbHcuYiAgICAgICAgICAgICA7IDAwMTExCi0gICAgICAgMTMgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxNCAwMDAwMDAyMCAgIDQxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZXYuaCAgICAgICAgICAgICA7IDAxMDAwCi0gICAgICAgMTUgMDAwMDAwMjQgICA0OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ3QwLmggICAgICAgICAgICAgOyAwMTAwMQotICAgICAgIDE2IDAwMDAwMDI4ICAgNTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGVxMC5oICAgICAgICAgICAgIDsgMDEwMTAKLSAgICAgICAxNyAwMDAwMDAyQyAgIDU5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxnZTAuaCAgICAgICAgICAgICA7IDAxMDExCi0gICAgICAgMTggMDAwMDAwMzAgICA2MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbHQwLmggICAgICAgICAgICAgOyAwMTEwMAotICAgICAgIDE5IDAwMDAwMDM0ICAgNjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5lMC5oICAgICAgICAgICAgIDsgMDExMDEKLSAgICAgICAyMCAwMDAwMDAzOCAgIDcxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsZTAuaCAgICAgICAgICAgICA7IDAxMTEwCi0gICAgICAgMjEgMDAwMDAwM0MgICA3OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsYWx3LmggICAgICAgICAgICAgOyAwMTExMQotICAgICAgIDIyICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjMgMDAwMDAwNDAgICA4MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmV2LncgICAgICAgICAgICAgOyAxMDAwMAotICAgICAgIDI0IDAwMDAwMDQ0ICAgODk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGd0MC53ICAgICAgICAgICAgIDsgMTAwMDEKLSAgICAgICAyNSAwMDAwMDA0OCAgIDkxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxlcTAudyAgICAgICAgICAgICA7IDEwMDEwCi0gICAgICAgMjYgMDAwMDAwNEMgICA5OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ2UwLncgICAgICAgICAgICAgOyAxMDAxMQotICAgICAgIDI3IDAwMDAwMDUwICAgQTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGx0MC53ICAgICAgICAgICAgIDsgMTAxMDAKLSAgICAgICAyOCAwMDAwMDA1NCAgIEE5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZTAudyAgICAgICAgICAgICA7IDEwMTAxCi0gICAgICAgMjkgMDAwMDAwNTggICBCMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbGUwLncgICAgICAgICAgICAgOyAxMDExMAotICAgICAgIDMwIDAwMDAwMDVDICAgQjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGFsdy53ICAgICAgICAgICAgIDsgMTAxMTEKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0YWFjMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotOzsgVGVzdCB0aGF0IGFsbCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMgZm9yIHRoZSBjb25kaXRpb24KLTs7IGNvZGVzIGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4KLTs7ICBBbHNvIHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlzYXNzZW1ibGVkIGNvcnJlY3RseSBhcyBzeW1ib2xpY3MuCi0KLQliY25kLmEJcjcscjUsbmV2LmIJCTsgMDAwMDAKLQliY25kLmEJcjcscjUsZ3QwLmIJCTsgMDAwMDEKLQliY25kLmEJcjcscjUsZXEwLmIJCTsgMDAwMTAKLQliY25kLmEJcjcscjUsZ2UwLmIJCTsgMDAwMTEKLQliY25kLmEJcjcscjUsbHQwLmIJCTsgMDAxMDAKLQliY25kLmEJcjcscjUsbmUwLmIJCTsgMDAxMDEKLQliY25kLmEJcjcscjUsbGUwLmIJCTsgMDAxMTAKLQliY25kLmEJcjcscjUsYWx3LmIJCTsgMDAxMTEKLQotCWJjbmQuYQlyNyxyNSxuZXYuaAkJOyAwMTAwMAotCWJjbmQuYQlyNyxyNSxndDAuaAkJOyAwMTAwMQotCWJjbmQuYQlyNyxyNSxlcTAuaAkJOyAwMTAxMAotCWJjbmQuYQlyNyxyNSxnZTAuaAkJOyAwMTAxMQotCWJjbmQuYQlyNyxyNSxsdDAuaAkJOyAwMTEwMAotCWJjbmQuYQlyNyxyNSxuZTAuaAkJOyAwMTEwMQotCWJjbmQuYQlyNyxyNSxsZTAuaAkJOyAwMTExMAotCWJjbmQuYQlyNyxyNSxhbHcuaAkJOyAwMTExMQotCi0JYmNuZC5hCXI3LHI1LG5ldi53CQk7IDEwMDAwCi0JYmNuZC5hCXI3LHI1LGd0MC53CQk7IDEwMDAxCi0JYmNuZC5hCXI3LHI1LGVxMC53CQk7IDEwMDEwCi0JYmNuZC5hCXI3LHI1LGdlMC53CQk7IDEwMDExCi0JYmNuZC5hCXI3LHI1LGx0MC53CQk7IDEwMTAwCi0JYmNuZC5hCXI3LHI1LG5lMC53CQk7IDEwMTAxCi0JYmNuZC5hCXI3LHI1LGxlMC53CQk7IDEwMTEwCi0JYmNuZC5hCXI3LHI1LGFsdy53CQk7IDEwMTExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjYxZTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgY29udHJvbCByZWdpc3RlciBvcGVyYW5kcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMzQgMDAgMDIgMTAuKgotICAgNDoJMzkgMDAgMDIgMTAuKgotICAgODoJM2EgMDAgMDIgMTAuKgotICAgYzoJMDIgMDAgMDIgMTAuKgotICAxMDoJMDAgMDUgMDIgMTAuKgotICAxNDoJMDAgMDQgMDIgMTAuKgotICAxODoJMDEgMDQgMDIgMTAuKgotICAxYzoJMGEgMDQgMDIgMTAuKgotICAyMDoJMGIgMDQgMDIgMTAuKgotICAyNDoJMGMgMDQgMDIgMTAuKgotICAyODoJMGQgMDQgMDIgMTAuKgotICAyYzoJMGUgMDQgMDIgMTAuKgotICAzMDoJMGYgMDQgMDIgMTAuKgotICAzNDoJMDIgMDQgMDIgMTAuKgotICAzODoJMDMgMDQgMDIgMTAuKgotICAzYzoJMDQgMDQgMDIgMTAuKgotICA0MDoJMDUgMDQgMDIgMTAuKgotICA0NDoJMDYgMDQgMDIgMTAuKgotICA0ODoJMDcgMDQgMDIgMTAuKgotICA0YzoJMDggMDQgMDIgMTAuKgotICA1MDoJMDkgMDQgMDIgMTAuKgotICA1NDoJMzMgMDAgMDIgMTAuKgotICA1ODoJMDEgMDAgMDIgMTAuKgotICA1YzoJMDAgMDAgMDIgMTAuKgotICA2MDoJMTEgMDAgMDIgMTAuKgotICA2NDoJMTQgMDAgMDIgMTAuKgotICA2ODoJMTMgMDAgMDIgMTAuKgotICA2YzoJMTAgMDAgMDIgMTAuKgotICA3MDoJMTIgMDAgMDIgMTAuKgotICA3NDoJMDggMDAgMDIgMTAuKgotICA3ODoJMDYgMDAgMDIgMTAuKgotICA3YzoJMDAgMDMgMDIgMTAuKgotICA4MDoJMDAgNDAgMDIgMTAuKgotICA4NDoJMDEgNDAgMDIgMTAuKgotICA4ODoJMDQgMDAgMDIgMTAuKgotICA4YzoJMDAgMDIgMDIgMTAuKgotICA5MDoJMDEgMDIgMDIgMTAuKgotICA5NDoJMGEgMDIgMDIgMTAuKgotICA5ODoJMGIgMDIgMDIgMTAuKgotICA5YzoJMGMgMDIgMDIgMTAuKgotICBhMDoJMGQgMDIgMDIgMTAuKgotICBhNDoJMGUgMDIgMDIgMTAuKgotICBhODoJMGYgMDIgMDIgMTAuKgotICBhYzoJMDIgMDIgMDIgMTAuKgotICBiMDoJMDMgMDIgMDIgMTAuKgotICBiNDoJMDQgMDIgMDIgMTAuKgotICBiODoJMDUgMDIgMDIgMTAuKgotICBiYzoJMDYgMDIgMDIgMTAuKgotICBjMDoJMDcgMDIgMDIgMTAuKgotICBjNDoJMDggMDIgMDIgMTAuKgotICBjODoJMDkgMDIgMDIgMTAuKgotICBjYzoJMzEgMDAgMDIgMTAuKgotICBkMDoJMzAgMDAgMDIgMTAuKgotICBkNDoJMDIgNDAgMDIgMTAuKgotICBkODoJMGQgMDAgMDIgMTAuKgotICBkYzoJMGEgMDAgMDIgMTAuKgotICBlMDoJMjAgMDAgMDIgMTAuKgotICBlNDoJMjEgMDAgMDIgMTAuKgotICBlODoJMGUgMDAgMDIgMTAuKgotICBlYzoJMGYgMDAgMDIgMTAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlYTU3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo1NiAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWNyZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciBjb250cm9sIHJlZ2lzdGVycwotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbwotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaWFzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLgotICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDUgMDAwMDAwMDAgICAxMDAyMDAzNCAgICAgICAgIHJkY3IgICAgQU5BU1RBVCxyMgotICAgICAgICA2IDAwMDAwMDA0ICAgMTAwMjAwMzkgICAgICAgICByZGNyICAgIEJSSzEscjIKLSAgICAgICAgNyAwMDAwMDAwOCAgIDEwMDIwMDNBICAgICAgICAgcmRjciAgICBCUksyLHIyCi0gICAgICAgIDggMDAwMDAwMEMgICAxMDAyMDAwMiAgICAgICAgIHJkY3IgICAgQ09ORklHLHIyCi0gICAgICAgIDkgMDAwMDAwMTAgICAxMDAyMDUwMCAgICAgICAgIHJkY3IgICAgRExSVSxyMgotICAgICAgIDEwIDAwMDAwMDE0ICAgMTAwMjA0MDAgICAgICAgICByZGNyICAgIERUQUcwLHIyCi0gICAgICAgMTEgMDAwMDAwMTggICAxMDAyMDQwMSAgICAgICAgIHJkY3IgICAgRFRBRzEscjIKLSAgICAgICAxMiAwMDAwMDAxQyAgIDEwMDIwNDBBICAgICAgICAgcmRjciAgICBEVEFHMTAscjIKLSAgICAgICAxMyAwMDAwMDAyMCAgIDEwMDIwNDBCICAgICAgICAgcmRjciAgICBEVEFHMTEscjIKLSAgICAgICAxNCAwMDAwMDAyNCAgIDEwMDIwNDBDICAgICAgICAgcmRjciAgICBEVEFHMTIscjIKLSAgICAgICAxNSAwMDAwMDAyOCAgIDEwMDIwNDBEICAgICAgICAgcmRjciAgICBEVEFHMTMscjIKLSAgICAgICAxNiAwMDAwMDAyQyAgIDEwMDIwNDBFICAgICAgICAgcmRjciAgICBEVEFHMTQscjIKLSAgICAgICAxNyAwMDAwMDAzMCAgIDEwMDIwNDBGICAgICAgICAgcmRjciAgICBEVEFHMTUscjIKLSAgICAgICAxOCAwMDAwMDAzNCAgIDEwMDIwNDAyICAgICAgICAgcmRjciAgICBEVEFHMixyMgotICAgICAgIDE5IDAwMDAwMDM4ICAgMTAwMjA0MDMgICAgICAgICByZGNyICAgIERUQUczLHIyCi0gICAgICAgMjAgMDAwMDAwM0MgICAxMDAyMDQwNCAgICAgICAgIHJkY3IgICAgRFRBRzQscjIKLSAgICAgICAyMSAwMDAwMDA0MCAgIDEwMDIwNDA1ICAgICAgICAgcmRjciAgICBEVEFHNSxyMgotICAgICAgIDIyIDAwMDAwMDQ0ICAgMTAwMjA0MDYgICAgICAgICByZGNyICAgIERUQUc2LHIyCi0gICAgICAgMjMgMDAwMDAwNDggICAxMDAyMDQwNyAgICAgICAgIHJkY3IgICAgRFRBRzcscjIKLSAgICAgICAyNCAwMDAwMDA0QyAgIDEwMDIwNDA4ICAgICAgICAgcmRjciAgICBEVEFHOCxyMgotICAgICAgIDI1IDAwMDAwMDUwICAgMTAwMjA0MDkgICAgICAgICByZGNyICAgIERUQUc5LHIyCi0gICAgICAgMjYgMDAwMDAwNTQgICAxMDAyMDAzMyAgICAgICAgIHJkY3IgICAgRUNPTUNOVEwscjIKLSAgICAgICAyNyAwMDAwMDA1OCAgIDEwMDIwMDAxICAgICAgICAgcmRjciAgICBFSVAscjIKLSAgICAgICAyOCAwMDAwMDA1QyAgIDEwMDIwMDAwICAgICAgICAgcmRjciAgICBFUEMscjIKLSAgICAgICAyOSAwMDAwMDA2MCAgIDEwMDIwMDExICAgICAgICAgcmRjciAgICBGTFRBRFIscjIKLSAgICAgICAzMCAwMDAwMDA2NCAgIDEwMDIwMDE0ICAgICAgICAgcmRjciAgICBGTFREVEgscjIKLSAgICAgICAzMSAwMDAwMDA2OCAgIDEwMDIwMDEzICAgICAgICAgcmRjciAgICBGTFREVEwscjIKLSAgICAgICAzMiAwMDAwMDA2QyAgIDEwMDIwMDEwICAgICAgICAgcmRjciAgICBGTFRPUCxyMgotICAgICAgIDMzIDAwMDAwMDcwICAgMTAwMjAwMTIgICAgICAgICByZGNyICAgIEZMVFRBRyxyMgotICAgICAgIDM0IDAwMDAwMDc0ICAgMTAwMjAwMDggICAgICAgICByZGNyICAgIEZQU1QscjIKLSAgICAgICAzNSAwMDAwMDA3OCAgIDEwMDIwMDA2ICAgICAgICAgcmRjciAgICBJRSxyMgotICAgICAgIDM2IDAwMDAwMDdDICAgMTAwMjAzMDAgICAgICAgICByZGNyICAgIElMUlUscjIKLSAgICAgICAzNyAwMDAwMDA4MCAgIDEwMDI0MDAwICAgICAgICAgcmRjciAgICBJTjBQLHIyCi0gICAgICAgMzggMDAwMDAwODQgICAxMDAyNDAwMSAgICAgICAgIHJkY3IgICAgSU4xUCxyMgotICAgICAgIDM5IDAwMDAwMDg4ICAgMTAwMjAwMDQgICAgICAgICByZGNyICAgIElOVFBFTixyMgotICAgICAgIDQwIDAwMDAwMDhDICAgMTAwMjAyMDAgICAgICAgICByZGNyICAgIElUQUcwLHIyCi0gICAgICAgNDEgMDAwMDAwOTAgICAxMDAyMDIwMSAgICAgICAgIHJkY3IgICAgSVRBRzEscjIKLSAgICAgICA0MiAwMDAwMDA5NCAgIDEwMDIwMjBBICAgICAgICAgcmRjciAgICBJVEFHMTAscjIKLSAgICAgICA0MyAwMDAwMDA5OCAgIDEwMDIwMjBCICAgICAgICAgcmRjciAgICBJVEFHMTEscjIKLSAgICAgICA0NCAwMDAwMDA5QyAgIDEwMDIwMjBDICAgICAgICAgcmRjciAgICBJVEFHMTIscjIKLSAgICAgICA0NSAwMDAwMDBBMCAgIDEwMDIwMjBEICAgICAgICAgcmRjciAgICBJVEFHMTMscjIKLSAgICAgICA0NiAwMDAwMDBBNCAgIDEwMDIwMjBFICAgICAgICAgcmRjciAgICBJVEFHMTQscjIKLSAgICAgICA0NyAwMDAwMDBBOCAgIDEwMDIwMjBGICAgICAgICAgcmRjciAgICBJVEFHMTUscjIKLSAgICAgICA0OCAwMDAwMDBBQyAgIDEwMDIwMjAyICAgICAgICAgcmRjciAgICBJVEFHMixyMgotICAgICAgIDQ5IDAwMDAwMEIwICAgMTAwMjAyMDMgICAgICAgICByZGNyICAgIElUQUczLHIyCi0gICAgICAgNTAgMDAwMDAwQjQgICAxMDAyMDIwNCAgICAgICAgIHJkY3IgICAgSVRBRzQscjIKLSAgICAgICA1MSAwMDAwMDBCOCAgIDEwMDIwMjA1ICAgICAgICAgcmRjciAgICBJVEFHNSxyMgotICAgICAgIDUyIDAwMDAwMEJDICAgMTAwMjAyMDYgICAgICAgICByZGNyICAgIElUQUc2LHIyCi0gICAgICAgNTMgMDAwMDAwQzAgICAxMDAyMDIwNyAgICAgICAgIHJkY3IgICAgSVRBRzcscjIKLSAgICAgICA1NCAwMDAwMDBDNCAgIDEwMDIwMjA4ICAgICAgICAgcmRjciAgICBJVEFHOCxyMgotICAgICAgIDU1IDAwMDAwMEM4ICAgMTAwMjAyMDkgICAgICAgICByZGNyICAgIElUQUc5LHIyCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjU2IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotY3JlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICA1NiAwMDAwMDBDQyAgIDEwMDIwMDMxICAgICAgICAgcmRjciAgICBNSVAscjIKLSAgICAgICA1NyAwMDAwMDBEMCAgIDEwMDIwMDMwICAgICAgICAgcmRjciAgICBNUEMscjIKLSAgICAgICA1OCAwMDAwMDBENCAgIDEwMDI0MDAyICAgICAgICAgcmRjciAgICBPVVRQLHIyCi0gICAgICAgNTkgMDAwMDAwRDggICAxMDAyMDAwRCAgICAgICAgIHJkY3IgICAgUEtUUkVRLHIyCi0gICAgICAgNjAgMDAwMDAwREMgICAxMDAyMDAwQSAgICAgICAgIHJkY3IgICAgUFBFUlJPUixyMgotICAgICAgIDYxIDAwMDAwMEUwICAgMTAwMjAwMjAgICAgICAgICByZGNyICAgIFNZU1NUSyxyMgotICAgICAgIDYyIDAwMDAwMEU0ICAgMTAwMjAwMjEgICAgICAgICByZGNyICAgIFNZU1RNUCxyMgotICAgICAgIDYzIDAwMDAwMEU4ICAgMTAwMjAwMEUgICAgICAgICByZGNyICAgIFRDT1VOVCxyMgotICAgICAgIDY0IDAwMDAwMEVDICAgMTAwMjAwMEYgICAgICAgICByZGNyICAgIFRTQ0FMRSxyMgotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwYWRjZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi07OyBUZXN0IHRoYXQgYWxsIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciBjb250cm9sIHJlZ2lzdGVycwotOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbwotOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaWFzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLgotCi0JcmRjcglBTkFTVEFULHIyCi0JcmRjcglCUksxLHIyCi0JcmRjcglCUksyLHIyCi0JcmRjcglDT05GSUcscjIKLQlyZGNyCURMUlUscjIKLQlyZGNyCURUQUcwLHIyCi0JcmRjcglEVEFHMSxyMgotCXJkY3IJRFRBRzEwLHIyCi0JcmRjcglEVEFHMTEscjIKLQlyZGNyCURUQUcxMixyMgotCXJkY3IJRFRBRzEzLHIyCi0JcmRjcglEVEFHMTQscjIKLQlyZGNyCURUQUcxNSxyMgotCXJkY3IJRFRBRzIscjIKLQlyZGNyCURUQUczLHIyCi0JcmRjcglEVEFHNCxyMgotCXJkY3IJRFRBRzUscjIKLQlyZGNyCURUQUc2LHIyCi0JcmRjcglEVEFHNyxyMgotCXJkY3IJRFRBRzgscjIKLQlyZGNyCURUQUc5LHIyCi0JcmRjcglFQ09NQ05UTCxyMgotCXJkY3IJRUlQLHIyCi0JcmRjcglFUEMscjIKLQlyZGNyCUZMVEFEUixyMgotCXJkY3IJRkxURFRILHIyCi0JcmRjcglGTFREVEwscjIKLQlyZGNyCUZMVE9QLHIyCi0JcmRjcglGTFRUQUcscjIKLQlyZGNyCUZQU1QscjIKLQlyZGNyCUlFLHIyCi0JcmRjcglJTFJVLHIyCi0JcmRjcglJTjBQLHIyCi0JcmRjcglJTjFQLHIyCi0JcmRjcglJTlRQRU4scjIKLQlyZGNyCUlUQUcwLHIyCi0JcmRjcglJVEFHMSxyMgotCXJkY3IJSVRBRzEwLHIyCi0JcmRjcglJVEFHMTEscjIKLQlyZGNyCUlUQUcxMixyMgotCXJkY3IJSVRBRzEzLHIyCi0JcmRjcglJVEFHMTQscjIKLQlyZGNyCUlUQUcxNSxyMgotCXJkY3IJSVRBRzIscjIKLQlyZGNyCUlUQUczLHIyCi0JcmRjcglJVEFHNCxyMgotCXJkY3IJSVRBRzUscjIKLQlyZGNyCUlUQUc2LHIyCi0JcmRjcglJVEFHNyxyMgotCXJkY3IJSVRBRzgscjIKLQlyZGNyCUlUQUc5LHIyCi0JcmRjcglNSVAscjIKLQlyZGNyCU1QQyxyMgotCXJkY3IJT1VUUCxyMgotCXJkY3IJUEtUUkVRLHIyCi0JcmRjcglQUEVSUk9SLHIyCi0JcmRjcglTWVNTVEsscjIKLQlyZGNyCVNZU1RNUCxyMgotCXJkY3IJVENPVU5ULHIyCi0JcmRjcglUU0NBTEUscjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2suZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2suZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkMDg0Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBjb3ZlcmFnZSBvZiBzaGlmdCBpbnN0cnVjdGlvbiBFTkRNQVNLIGZpZWxkCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwNSAwMCBjNyA0OS4qCi0gICA0OgkyNSAwMCBjNyA0OS4qCi0gICA4Ogk0NSAwMCBjNyA0OS4qCi0gICBjOgk2NSAwMCBjNyA0OS4qCi0gIDEwOgk4NSAwMCBjNyA0OS4qCi0gIDE0OglhNSAwMCBjNyA0OS4qCi0gIDE4OgljNSAwMCBjNyA0OS4qCi0gIDFjOgllNSAwMCBjNyA0OS4qCi0gIDIwOgkwNSAwMSBjNyA0OS4qCi0gIDI0OgkyNSAwMSBjNyA0OS4qCi0gIDI4Ogk0NSAwMSBjNyA0OS4qCi0gIDJjOgk2NSAwMSBjNyA0OS4qCi0gIDMwOgk4NSAwMSBjNyA0OS4qCi0gIDM0OglhNSAwMSBjNyA0OS4qCi0gIDM4OgljNSAwMSBjNyA0OS4qCi0gIDNjOgllNSAwMSBjNyA0OS4qCi0gIDQwOgkwNSAwMiBjNyA0OS4qCi0gIDQ0OgkyNSAwMiBjNyA0OS4qCi0gIDQ4Ogk0NSAwMiBjNyA0OS4qCi0gIDRjOgk2NSAwMiBjNyA0OS4qCi0gIDUwOgk4NSAwMiBjNyA0OS4qCi0gIDU0OglhNSAwMiBjNyA0OS4qCi0gIDU4OgljNSAwMiBjNyA0OS4qCi0gIDVjOgllNSAwMiBjNyA0OS4qCi0gIDYwOgkwNSAwMyBjNyA0OS4qCi0gIDY0OgkyNSAwMyBjNyA0OS4qCi0gIDY4Ogk0NSAwMyBjNyA0OS4qCi0gIDZjOgk2NSAwMyBjNyA0OS4qCi0gIDcwOgk4NSAwMyBjNyA0OS4qCi0gIDc0OglhNSAwMyBjNyA0OS4qCi0gIDc4OgljNSAwMyBjNyA0OS4qCi0gIDdjOgllNSAwMyBjNyA0OS4qCi0gIDgwOgkwNSAwMCBjNyA0OS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2subHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTAzYjMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2subHN0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotZW5kbWFzay5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRlc3QgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiB0aGUgZW5kbWFzayBpbiBiaXRzIDUtOS4KLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IFRoZSBtYXNrIHRoYXQgaXMgdXNlZCBpcyBjb21wdXRlZCBhcyAyKipiaXRzLTEgd2hlcmUgYml0cwotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHRoZSBiaXRzIDUtOSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCAwIGFuZCAzMgotICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHksIGFuZCBkaXNhc3NlbWJsZWQgYXMgMC4KLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA2IDAwMDAwMDAwICAgNDlDNzAwMDUgICAgICAgICBzbC5peiAgIDUsMCxyNyxyOQotICAgICAgICA3IDAwMDAwMDA0ICAgNDlDNzAwMjUgICAgICAgICBzbC5peiAgIDUsMSxyNyxyOQotICAgICAgICA4IDAwMDAwMDA4ICAgNDlDNzAwNDUgICAgICAgICBzbC5peiAgIDUsMixyNyxyOQotICAgICAgICA5IDAwMDAwMDBDICAgNDlDNzAwNjUgICAgICAgICBzbC5peiAgIDUsMyxyNyxyOQotICAgICAgIDEwIDAwMDAwMDEwICAgNDlDNzAwODUgICAgICAgICBzbC5peiAgIDUsNCxyNyxyOQotICAgICAgIDExIDAwMDAwMDE0ICAgNDlDNzAwQTUgICAgICAgICBzbC5peiAgIDUsNSxyNyxyOQotICAgICAgIDEyIDAwMDAwMDE4ICAgNDlDNzAwQzUgICAgICAgICBzbC5peiAgIDUsNixyNyxyOQotICAgICAgIDEzIDAwMDAwMDFDICAgNDlDNzAwRTUgICAgICAgICBzbC5peiAgIDUsNyxyNyxyOQotICAgICAgIDE0IDAwMDAwMDIwICAgNDlDNzAxMDUgICAgICAgICBzbC5peiAgIDUsOCxyNyxyOQotICAgICAgIDE1IDAwMDAwMDI0ICAgNDlDNzAxMjUgICAgICAgICBzbC5peiAgIDUsOSxyNyxyOQotICAgICAgIDE2IDAwMDAwMDI4ICAgNDlDNzAxNDUgICAgICAgICBzbC5peiAgIDUsMTAscjcscjkKLSAgICAgICAxNyAwMDAwMDAyQyAgIDQ5QzcwMTY1ICAgICAgICAgc2wuaXogICA1LDExLHI3LHI5Ci0gICAgICAgMTggMDAwMDAwMzAgICA0OUM3MDE4NSAgICAgICAgIHNsLml6ICAgNSwxMixyNyxyOQotICAgICAgIDE5IDAwMDAwMDM0ICAgNDlDNzAxQTUgICAgICAgICBzbC5peiAgIDUsMTMscjcscjkKLSAgICAgICAyMCAwMDAwMDAzOCAgIDQ5QzcwMUM1ICAgICAgICAgc2wuaXogICA1LDE0LHI3LHI5Ci0gICAgICAgMjEgMDAwMDAwM0MgICA0OUM3MDFFNSAgICAgICAgIHNsLml6ICAgNSwxNSxyNyxyOQotICAgICAgIDIyIDAwMDAwMDQwICAgNDlDNzAyMDUgICAgICAgICBzbC5peiAgIDUsMTYscjcscjkKLSAgICAgICAyMyAwMDAwMDA0NCAgIDQ5QzcwMjI1ICAgICAgICAgc2wuaXogICA1LDE3LHI3LHI5Ci0gICAgICAgMjQgMDAwMDAwNDggICA0OUM3MDI0NSAgICAgICAgIHNsLml6ICAgNSwxOCxyNyxyOQotICAgICAgIDI1IDAwMDAwMDRDICAgNDlDNzAyNjUgICAgICAgICBzbC5peiAgIDUsMTkscjcscjkKLSAgICAgICAyNiAwMDAwMDA1MCAgIDQ5QzcwMjg1ICAgICAgICAgc2wuaXogICA1LDIwLHI3LHI5Ci0gICAgICAgMjcgMDAwMDAwNTQgICA0OUM3MDJBNSAgICAgICAgIHNsLml6ICAgNSwyMSxyNyxyOQotICAgICAgIDI4IDAwMDAwMDU4ICAgNDlDNzAyQzUgICAgICAgICBzbC5peiAgIDUsMjIscjcscjkKLSAgICAgICAyOSAwMDAwMDA1QyAgIDQ5QzcwMkU1ICAgICAgICAgc2wuaXogICA1LDIzLHI3LHI5Ci0gICAgICAgMzAgMDAwMDAwNjAgICA0OUM3MDMwNSAgICAgICAgIHNsLml6ICAgNSwyNCxyNyxyOQotICAgICAgIDMxIDAwMDAwMDY0ICAgNDlDNzAzMjUgICAgICAgICBzbC5peiAgIDUsMjUscjcscjkKLSAgICAgICAzMiAwMDAwMDA2OCAgIDQ5QzcwMzQ1ICAgICAgICAgc2wuaXogICA1LDI2LHI3LHI5Ci0gICAgICAgMzMgMDAwMDAwNkMgICA0OUM3MDM2NSAgICAgICAgIHNsLml6ICAgNSwyNyxyNyxyOQotICAgICAgIDM0IDAwMDAwMDcwICAgNDlDNzAzODUgICAgICAgICBzbC5peiAgIDUsMjgscjcscjkKLSAgICAgICAzNSAwMDAwMDA3NCAgIDQ5QzcwM0E1ICAgICAgICAgc2wuaXogICA1LDI5LHI3LHI5Ci0gICAgICAgMzYgMDAwMDAwNzggICA0OUM3MDNDNSAgICAgICAgIHNsLml6ICAgNSwzMCxyNyxyOQotICAgICAgIDM3IDAwMDAwMDdDICAgNDlDNzAzRTUgICAgICAgICBzbC5peiAgIDUsMzEscjcscjkKLSAgICAgICAzOCAwMDAwMDA4MCAgIDQ5QzcwMDA1ICAgICAgICAgc2wuaXogICA1LDMyLHI3LHI5Ci0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZhZWRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2sucworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTs7IFRlc3QgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiB0aGUgZW5kbWFzayBpbiBiaXRzIDUtOS4KLTs7IFRoZSBtYXNrIHRoYXQgaXMgdXNlZCBpcyBjb21wdXRlZCBhcyAyKipiaXRzLTEgd2hlcmUgYml0cwotOzsgYXJlIHRoZSBiaXRzIDUtOSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCAwIGFuZCAzMgotOzsgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHksIGFuZCBkaXNhc3NlbWJsZWQgYXMgMC4KLQotCXNsLml6CTUsMCxyNyxyOQotCXNsLml6CTUsMSxyNyxyOQotCXNsLml6CTUsMixyNyxyOQotCXNsLml6CTUsMyxyNyxyOQotCXNsLml6CTUsNCxyNyxyOQotCXNsLml6CTUsNSxyNyxyOQotCXNsLml6CTUsNixyNyxyOQotCXNsLml6CTUsNyxyNyxyOQotCXNsLml6CTUsOCxyNyxyOQotCXNsLml6CTUsOSxyNyxyOQotCXNsLml6CTUsMTAscjcscjkKLQlzbC5pegk1LDExLHI3LHI5Ci0Jc2wuaXoJNSwxMixyNyxyOQotCXNsLml6CTUsMTMscjcscjkKLQlzbC5pegk1LDE0LHI3LHI5Ci0Jc2wuaXoJNSwxNSxyNyxyOQotCXNsLml6CTUsMTYscjcscjkKLQlzbC5pegk1LDE3LHI3LHI5Ci0Jc2wuaXoJNSwxOCxyNyxyOQotCXNsLml6CTUsMTkscjcscjkKLQlzbC5pegk1LDIwLHI3LHI5Ci0Jc2wuaXoJNSwyMSxyNyxyOQotCXNsLml6CTUsMjIscjcscjkKLQlzbC5pegk1LDIzLHI3LHI5Ci0Jc2wuaXoJNSwyNCxyNyxyOQotCXNsLml6CTUsMjUscjcscjkKLQlzbC5pegk1LDI2LHI3LHI5Ci0Jc2wuaXoJNSwyNyxyNyxyOQotCXNsLml6CTUsMjgscjcscjkKLQlzbC5pegk1LDI5LHI3LHI5Ci0Jc2wuaXoJNSwzMCxyNyxyOQotCXNsLml6CTUsMzEscjcscjkKLQlzbC5pegk1LDMyLHI3LHI5CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlYjg1Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgc2ltcGxlIGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgk4MCAxMiBiZSA1MSAxNiA2OCBhOSA2NS4qCi0gICA4OgkwMCAxMiBiZSA1MSAxNiA2OCBhOSBlNS4qCi0gIDEwOgkwMCAxMCBiZSA1MSA5YSA2ZCA0MSAxOS4qCi0gIDE4Ogk4MCBiMCAzZSA1MiA5YSA2ZCA0MSA5OS4qCi0gIDIwOgkwMCBiMCAzZSA1MiAwMCAwMCAwMCAwMC4qCi0gIDI4Ogk4MCA3MiBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIDMwOgkwMCA3MiBiZSA1MSAwMCAwMCAwMCAzZi4qCi0gIDM4OgkwMCA3MCBiZSA1MSAwMCAwMCA4MCA0NS4qCi0gIDQwOgk4MCA1MiBiZSA1MSAwMCAwMCA4MCBjNS4qCi0gIDQ4OgkwMCA1MiBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIDUwOgkwMCA1MCBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIDU4Ogk4MCA5MyAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDYwOgk4MCA5NSAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDY4Ogk4MCA5MSAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDcwOgk4MCA5NyAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDc4OgkwMCA5MiAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDgwOgkwMCA5NCAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDg4OgkwMCA5MCAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDkwOgkwMCA5NiAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDk4OgkwMCA5MyAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGEwOgkwMCA5NSAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGE4OgkwMCA5MSAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGIwOgkwMCA5NyAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGI4Ogk4MCA5MiAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGMwOgk4MCA5NCAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGM4Ogk4MCA5MCAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGQwOgk4MCA5NiAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGQ4OgkwMCBmMiAzZSA1MCAwMCAwMCAwMCA0MC4qCi0gIGUwOgkwMCBmMCAzZSA1MCAwMCAwMCAwMCA0MC4qCi0gIGU4Ogk4MCAzMiBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIGYwOgkwMCAzMiBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIGY4OgkwMCAzMCBiZSA1MSAwMCAwMCAwMCA0MC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzQ1OTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0CisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDIyOjA5OjA5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotZmxvYXQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAwMDAwMDAwMCAgIDUxQkUxMjgwICAgICAgICAgZmFkZC5zZGQgICAgICAgIDEuMEUyMyxyNixyMTAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMDQgICA2NUE5NjgxNiAKLSAgICAgICAgMiAwMDAwMDAwOCAgIDUxQkUxMjAwICAgICAgICAgZmFkZC5zc2QgICAgICAgIC0xLjBFMjMscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMEMgICBFNUE5NjgxNiAKLSAgICAgICAgMyAwMDAwMDAxMCAgIDUxQkUxMDAwICAgICAgICAgZmFkZC5zc3MgICAgICAgIDEuMEUtMjMscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMTQgICAxOTQxNkQ5QSAKLSAgICAgICAgNCAwMDAwMDAxOCAgIDUyM0VCMDgwICAgICAgICAgZmNtcC5zZCAgICAgICAgIC0xLjBFLTIzLHI4LHIxMCA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMUMgICA5OTQxNkQ5QSAKLSAgICAgICAgNSAwMDAwMDAyMCAgIDUyM0VCMDAwICAgICAgICAgZmNtcC5zcyAgICAgICAgIDAuMCxyOCxyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMjQgICAwMDAwMDAwMCAKLSAgICAgICAgNiAwMDAwMDAyOCAgIDUxQkU3MjgwICAgICAgICAgZmRpdi5zZGQgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMkMgICA0MDAwMDAwMCAKLSAgICAgICAgNyAwMDAwMDAzMCAgIDUxQkU3MjAwICAgICAgICAgZmRpdi5zc2QgICAgICAgIDAuNSxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMzQgICAzRjAwMDAwMCAKLSAgICAgICAgOCAwMDAwMDAzOCAgIDUxQkU3MDAwICAgICAgICAgZmRpdi5zc3MgICAgICAgIDQwOTYuMCxyNixyMTAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwM0MgICA0NTgwMDAwMCAKLSAgICAgICAgOSAwMDAwMDA0MCAgIDUxQkU1MjgwICAgICAgICAgZm1weS5zZGQgICAgICAgIC00MDk2LjAscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNDQgICBDNTgwMDAwMCAKLSAgICAgICAxMCAwMDAwMDA0OCAgIDUxQkU1MjAwICAgICAgICAgZm1weS5zc2QgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNEMgICA0MDAwMDAwMCAKLSAgICAgICAxMSAwMDAwMDA1MCAgIDUxQkU1MDAwICAgICAgICAgZm1weS5zc3MgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNTQgICA0MDAwMDAwMCAKLSAgICAgICAxMiAwMDAwMDA1OCAgIDQwM0U5MzgwICAgICAgICAgZnJuZG0uc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNUMgICA0MDAwMDAwMCAKLSAgICAgICAxMyAwMDAwMDA2MCAgIDQwM0U5NTgwICAgICAgICAgZnJuZG0uc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNjQgICA0MDAwMDAwMCAKLSAgICAgICAxNCAwMDAwMDA2OCAgIDQwM0U5MTgwICAgICAgICAgZnJuZG0uc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNkMgICA0MDAwMDAwMCAKLSAgICAgICAxNSAwMDAwMDA3MCAgIDQwM0U5NzgwICAgICAgICAgZnJuZG0uc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNzQgICA0MDAwMDAwMCAKLSAgICAgICAxNiAwMDAwMDA3OCAgIDQwM0U5MjAwICAgICAgICAgZnJuZG4uc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwN0MgICA0MDAwMDAwMCAKLSAgICAgICAxNyAwMDAwMDA4MCAgIDQwM0U5NDAwICAgICAgICAgZnJuZG4uc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwODQgICA0MDAwMDAwMCAKLSAgICAgICAxOCAwMDAwMDA4OCAgIDQwM0U5MDAwICAgICAgICAgZnJuZG4uc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwOEMgICA0MDAwMDAwMCAKLSAgICAgICAxOSAwMDAwMDA5MCAgIDQwM0U5NjAwICAgICAgICAgZnJuZG4uc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwOTQgICA0MDAwMDAwMCAKLSAgICAgICAyMCAwMDAwMDA5OCAgIDQwM0U5MzAwICAgICAgICAgZnJuZHAuc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwOUMgICA0MDAwMDAwMCAKLSAgICAgICAyMSAwMDAwMDBBMCAgIDQwM0U5NTAwICAgICAgICAgZnJuZHAuc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQTQgICA0MDAwMDAwMCAKLSAgICAgICAyMiAwMDAwMDBBOCAgIDQwM0U5MTAwICAgICAgICAgZnJuZHAuc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQUMgICA0MDAwMDAwMCAKLSAgICAgICAyMyAwMDAwMDBCMCAgIDQwM0U5NzAwICAgICAgICAgZnJuZHAuc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQjQgICA0MDAwMDAwMCAKLSAgICAgICAyNCAwMDAwMDBCOCAgIDQwM0U5MjgwICAgICAgICAgZnJuZHouc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQkMgICA0MDAwMDAwMCAKLSAgICAgICAyNSAwMDAwMDBDMCAgIDQwM0U5NDgwICAgICAgICAgZnJuZHouc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQzQgICA0MDAwMDAwMCAKLSAgICAgICAyNiAwMDAwMDBDOCAgIDQwM0U5MDgwICAgICAgICAgZnJuZHouc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQ0MgICA0MDAwMDAwMCAKLSAgICAgICAyNyAwMDAwMDBEMCAgIDQwM0U5NjgwICAgICAgICAgZnJuZHouc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRDQgICA0MDAwMDAwMCAKLSAgICAgICAyOCAwMDAwMDBEOCAgIDUwM0VGMjAwICAgICAgICAgZnNxcnQuc2QgICAgICAgIDIuMCxyMTAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDIyOjA5OjA5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotZmxvYXQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICAgICAwMDAwMDBEQyAgIDQwMDAwMDAwIAotICAgICAgIDI5IDAwMDAwMEUwICAgNTAzRUYwMDAgICAgICAgICBmc3FydC5zcyAgICAgICAgMi4wLHIxMCAgICAgICAgIDsgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBFNCAgIDQwMDAwMDAwIAotICAgICAgIDMwIDAwMDAwMEU4ICAgNTFCRTMyODAgICAgICAgICBmc3ViLnNkZCAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBFQyAgIDQwMDAwMDAwIAotICAgICAgIDMxIDAwMDAwMEYwICAgNTFCRTMyMDAgICAgICAgICBmc3ViLnNzZCAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBGNCAgIDQwMDAwMDAwIAotICAgICAgIDMyIDAwMDAwMEY4ICAgNTFCRTMwMDAgICAgICAgICBmc3ViLnNzcyAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBGQyAgIDQwMDAwMDAwIAotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGEyYjdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0JZmFkZC5zZGQJMGYxLjBFMjMscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmYWRkLnNzZAkwZi0xLjBFMjMscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmYWRkLnNzcwkwZjEuMEUtMjMscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmY21wLnNkCQkwZi0xLjBFLTIzLHI4LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmNtcC5zcwkJMGYwLjAscjgscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmZGl2LnNkZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZkaXYuc3NkCTBmMC41LHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmRpdi5zc3MJMGY0MDk2LjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmbXB5LnNkZAkwZi00MDk2LjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmbXB5LnNzZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZtcHkuc3NzCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG0uc2QJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbS5zaQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRtLnNzCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG0uc3UJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbi5zZAkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRuLnNpCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG4uc3MJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbi5zdQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRwLnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHAuc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kcC5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRwLnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHouc2QJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kei5zaQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmR6LnNzCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHouc3UJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3FydC5zZAkwZjIuMCxyMTAJCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3FydC5zcwkwZjIuMCxyMTAJCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3ViLnNkZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZzdWIuc3NkCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZnN1Yi5zc3MJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGZhODUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgcmVnaXN0ZXIgb3BlcmFuZHMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTAzIDAwIDNiIDI5LioKLSAgIDQ6CTAzIDIwIDNiIDI5LioKLSAgIDg6CTA1IDIwIDMyIDExLioKLSAgIGM6CTA1IDIwIDMyIDExLioKLSAgMTA6CTBhIDAwIDMzIDczLioKLSAgMTQ6CTBhIDgwIDMyIDczLioKLSAgMTg6CTBhIDQwIDMyIDczLioKLSAgMWM6CTBhIDQwIDM5IDFhLioKLSAgMjA6CTBhIDYwIDM5IGZhLioKLSAgMjQ6CTBhIDAwIDM5IDIyLioKLSAgMjg6CTBhIDIwIDM5IDJhLioKLSAgMmM6CTA0IDgwIGI5IDIxLioKLSAgMzA6CTA0IGEwIGI5IDIxLioKLSAgMzQ6CTA2IDAwIDM5IDAwLioKLSAgMzg6CTA2IDIwIDM5IDAwLioKLSAgM2M6CTBhIDAwIDAzIDAwLioKLSAgNDA6CTA2IDAwIDM4IGY4LioKLSAgNDQ6CTA2IDIwIDM4IGY4LioKLSAgNDg6CTA3IDQwIDMwIDAwLioKLSAgNGM6CTAzIDAwIDNhIDI5LioKLSAgNTA6CTA4IDAwIGI3IDAyLioKLSAgNTQ6CTA4IDAwIGI3IDBhLioKLSAgNTg6CTA0IDA0IGI0IDQxLioKLSAgNWM6CTA0IDI0IGI0IDQxLioKLSAgNjA6CTA0IDQ0IGI0IDQxLioKLSAgNjQ6CTA0IDY0IGI0IDQxLioKLSAgNjg6CTA0IDA0IGI1IDQxLioKLSAgNmM6CTA0IDI0IGI1IDQxLioKLSAgNzA6CTA0IDA0IGI2IDQxLioKLSAgNzQ6CTA0IDI0IGI2IDQxLioKLSAgNzg6CTA0IDQ0IGI2IDQxLioKLSAgN2M6CTA0IDY0IGI2IDQxLioKLSAgODA6CTA1IDIwIDMwIDA4LioKLSAgODQ6CWUzIDQ3IDcxIDMxLioKLSAgODg6CWMyIDA3IDcxIDQ5LioKLSAgOGM6CTAyIDAwIDNlIDMxLioKLSAgOTA6CTAyIDAyIDNlIDMxLioKLSAgOTQ6CTgyIDAyIDNlIDMxLioKLSAgOTg6CTIyIDAyIDNlIDMxLioKLSAgOWM6CWEyIDAyIDNlIDMxLioKLSAgYTA6CTA0IGEwIGJlIDQxLioKLSAgYTQ6CTg0IGEwIGJlIDQxLioKLSAgYTg6CTI0IGEwIGJlIDQxLioKLSAgYWM6CWE0IGEwIGJlIDQxLioKLSAgYjA6CTAyIDYwIDNlIDMxLioKLSAgYjQ6CTAyIDYyIDNlIDMxLioKLSAgYjg6CTgyIDYyIDNlIDMxLioKLSAgYmM6CTIyIDYyIDNlIDMxLioKLSAgYzA6CWEyIDYyIDNlIDMxLioKLSAgYzQ6CTAyIDQwIDNlIDMxLioKLSAgYzg6CTAyIDQyIDNlIDMxLioKLSAgY2M6CTgyIDQyIDNlIDMxLioKLSAgZDA6CTIyIDQyIDNlIDMxLioKLSAgZDQ6CWEyIDQyIDNlIDMxLioKLSAgZDg6CTQyIDQ1IDNlIDMxLioKLSAgZGM6CWUyIDQ3IDNlIDMxLioKLSAgZTA6CTg0IDgxIDNlIDMwLioKLSAgZTQ6CTg0IDgzIDNlIDMwLioKLSAgZTg6CTg0IDg1IDNlIDMwLioKLSAgZWM6CTg0IDg3IDNlIDMwLioKLSAgZjA6CWEyIDgxIDNlIDQwLioKLSAgZjQ6CWEyIDgzIDNlIDQwLioKLSAgZjg6CWEyIDg1IDNlIDQwLioKLSAgZmM6CWEyIDg3IDNlIDQwLioKLSAxMDA6CWM0IDgxIDNlIDMwLioKLSAxMDQ6CWM0IDgzIDNlIDMwLioKLSAxMDg6CWUyIDgxIDNlIDQwLioKLSAxMGM6CWUyIDgzIDNlIDQwLioKLSAxMTA6CTA0IDgwIDNlIDMwLioKLSAxMTQ6CTA0IDgyIDNlIDMwLioKLSAxMTg6CTA0IDg0IDNlIDMwLioKLSAxMWM6CTA0IDg2IDNlIDMwLioKLSAxMjA6CTIyIDgwIDNlIDQwLioKLSAxMjQ6CTIyIDgyIDNlIDQwLioKLSAxMjg6CTIyIDg0IDNlIDQwLioKLSAxMmM6CTIyIDg2IDNlIDQwLioKLSAxMzA6CTQ0IDgwIDNlIDMwLioKLSAxMzQ6CTQ0IDgyIDNlIDMwLioKLSAxMzg6CTYyIDgwIDNlIDQwLioKLSAxM2M6CTYyIDgyIDNlIDQwLioKLSAxNDA6CTA0IDgxIDNlIDMwLioKLSAxNDQ6CTA0IDgzIDNlIDMwLioKLSAxNDg6CTA0IDg1IDNlIDMwLioKLSAxNGM6CTA0IDg3IDNlIDMwLioKLSAxNTA6CTIyIDgxIDNlIDQwLioKLSAxNTQ6CTIyIDgzIDNlIDQwLioKLSAxNTg6CTIyIDg1IDNlIDQwLioKLSAxNWM6CTIyIDg3IDNlIDQwLioKLSAxNjA6CTQ0IDgxIDNlIDMwLioKLSAxNjQ6CTQ0IDgzIDNlIDMwLioKLSAxNjg6CTYyIDgxIDNlIDQwLioKLSAxNmM6CTYyIDgzIDNlIDQwLioKLSAxNzA6CTg0IDgwIDNlIDMwLioKLSAxNzQ6CTg0IDgyIDNlIDMwLioKLSAxNzg6CTg0IDg0IDNlIDMwLioKLSAxN2M6CTg0IDg2IDNlIDMwLioKLSAxODA6CWEyIDgwIDNlIDQwLioKLSAxODQ6CWEyIDgyIDNlIDQwLioKLSAxODg6CWEyIDg0IDNlIDQwLioKLSAxOGM6CWEyIDg2IDNlIDQwLioKLSAxOTA6CWM0IDgwIDNlIDMwLioKLSAxOTQ6CWM0IDgyIDNlIDMwLioKLSAxOTg6CWUyIDgwIDNlIDQwLioKLSAxOWM6CWUyIDgyIDNlIDQwLioKLSAxYTA6CTA2IGUwIDNlIDQwLioKLSAxYTQ6CTA2IGUyIDNlIDQwLioKLSAxYTg6CTI2IGUyIDNlIDQwLioKLSAxYWM6CTAyIDIwIDNlIDMxLioKLSAxYjA6CTAyIDIyIDNlIDMxLioKLSAxYjQ6CTgyIDIyIDNlIDMxLioKLSAxYjg6CTIyIDIyIDNlIDMxLioKLSAxYmM6CWEyIDIyIDNlIDMxLioKLSAxYzA6CWU0IGUzIDMxIDUyLioKLSAxYzQ6CTA0IDgwIGI4IDQxLioKLSAxYzg6CTA0IGEwIGI4IDQxLioKLSAxY2M6CTA0IDAwIGI0IDQxLioKLSAxZDA6CTA0IDIwIGI0IDQxLioKLSAxZDQ6CTA0IDQwIGI0IDQxLioKLSAxZDg6CTA0IDYwIGI0IDQxLioKLSAxZGM6CTA0IDAwIGI1IDQxLioKLSAxZTA6CTA0IDIwIGI1IDQxLioKLSAxZTQ6CTAwIDAwIGZmIDQxLioKLSAxZTg6CTAxIGUwIGIyIDE4LioKLSAxZWM6CTAxIGUwIGIyIDE4LioKLSAxZjA6CTAxIGMwIGIzIDE4LioKLSAxZjQ6CTAxIGEwIGIzIDE4LioKLSAxZjg6CTAxIDYwIGIzIDE4LioKLSAxZmM6CTA2IDgwIDMwIDIwLioKLSAyMDA6CTAwIDIwIDNmIDI5LioKLSAyMDQ6CWUyIDAzIDMxIDUyLioKLSAyMDg6CWU4IDA3IGIxIDMwLioKLSAyMGM6CWU0IGMzIGIxIDMwLioKLSAyMTA6CTg0IDAxIDcxIDMxLioKLSAyMTQ6CTg0IDIxIDcxIDMxLioKLSAyMTg6CTg0IDQxIDcxIDMxLioKLSAyMWM6CTg0IDYxIDcxIDMxLioKLSAyMjA6CTg0IDgxIDcxIDMxLioKLSAyMjQ6CTg0IGExIDcxIDMxLioKLSAyMjg6CTg0IGMxIDcxIDMxLioKLSAyMmM6CTg0IGUxIDcxIDMxLioKLSAyMzA6CTg0IDA5IDcxIDMxLioKLSAyMzQ6CTg0IDI5IDcxIDMxLioKLSAyMzg6CTg0IDQ5IDcxIDMxLioKLSAyM2M6CTg0IDY5IDcxIDMxLioKLSAyNDA6CTg0IDg5IDcxIDMxLioKLSAyNDQ6CTg0IGE5IDcxIDMxLioKLSAyNDg6CTg0IGM5IDcxIDMxLioKLSAyNGM6CTg0IGU5IDcxIDMxLioKLSAyNTA6CTg0IDA1IDcxIDMxLioKLSAyNTQ6CTg0IDI1IDcxIDMxLioKLSAyNTg6CTg0IDQ1IDcxIDMxLioKLSAyNWM6CTg0IDY1IDcxIDMxLioKLSAyNjA6CTg0IDg1IDcxIDMxLioKLSAyNjQ6CTg0IGE1IDcxIDMxLioKLSAyNjg6CTg0IGM1IDcxIDMxLioKLSAyNmM6CTg0IGU1IDcxIDMxLioKLSAyNzA6CTA0IGE0IGIxIDQxLioKLSAyNzQ6CTg0IDBkIDcxIDMxLioKLSAyNzg6CTg0IDJkIDcxIDMxLioKLSAyN2M6CTg0IDRkIDcxIDMxLioKLSAyODA6CTg0IDZkIDcxIDMxLioKLSAyODQ6CTg0IDhkIDcxIDMxLioKLSAyODg6CTg0IGFkIDcxIDMxLioKLSAyOGM6CTg0IGNkIDcxIDMxLioKLSAyOTA6CTg0IGVkIDcxIDMxLioKLSAyOTQ6CTA0IDY0IGIxIDQxLioKLSAyOTg6CTA0IDAwIGI2IDQxLioKLSAyOWM6CTA0IDIwIGI2IDQxLioKLSAyYTA6CTA0IDQwIGI2IDQxLioKLSAyYTQ6CTA0IDYwIGI2IDQxLioKLSAyYTg6CTA3IDQwIDNiIDRhLioKLSAyYWM6CTA3IDYwIDNiIDRhLioKLSAyYjA6CTA4IGEwIGIwIDIxLioKLSAyYjQ6CTBhIDIwIDMwIDAwLioKLSAyYjg6CTAyIDAwIDNjIDAxLioKLSAyYmM6CTgyIDAwIGJjIDAxLioKLSAyYzA6CWEyIDAwIGJjIDAyLioKLSAyYzQ6CTA2IGEwIDcwIDAxLioKLSAyYzg6CTA1IDIwIGIzIDM5LioKLSAyY2M6CTA3IGMwIDMyIDRhLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODg5ZGQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFNpbXBsZSByZWdpc3RlciBmb3JtcwotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgVGhvc2UgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFsc28gdXNlIGFuIGltbWVkaWF0ZSBqdXN0IHVzZSBhIGNvbnN0YW50LgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDQgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIC50ZXh0Ci0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNiAwMDAwMDAwMCAgIDI5M0IwMDAzICAgICAgICAgYWRkICAgICAgICAgICAgIHIzLHI0LHI1Ci0gICAgICAgIDcgMDAwMDAwMDQgICAyOTNCMjAwMyAgICAgICAgIGFkZHUgICAgICAgICAgICByMyxyNCxyNQotICAgICAgICA4IDAwMDAwMDA4ICAgMTEzMjIwMDUgICAgICAgICBhbmQgICAgICAgICAgICAgcjUscjQscjIKLSAgICAgICAgOSAwMDAwMDAwQyAgIDExMzIyMDA1ICAgICAgICAgYW5kLnR0ICAgICAgICAgIHI1LHI0LHIyCi0gICAgICAgMTAgMDAwMDAwMTAgICA3MzMzMDAwQSAgICAgICAgIGFuZC5mZiAgICAgICAgICByMTAscjEyLHIxNAotICAgICAgIDExIDAwMDAwMDE0ICAgNzMzMjgwMEEgICAgICAgICBhbmQuZnQgICAgICAgICAgcjEwLHIxMixyMTQKLSAgICAgICAxMiAwMDAwMDAxOCAgIDczMzI0MDBBICAgICAgICAgYW5kLnRmICAgICAgICAgIHIxMCxyMTIscjE0Ci0gICAgICAgMTMgMDAwMDAwMUMgICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgICAgICAgICByMTAscjgsbG8udwotICAgICAgIDE0IDAwMDAwMDIwICAgRkEzOTYwMEEgICAgICAgICBiYm8uYSAgICAgICAgICAgcjEwLHI4LGVxLmIKLSAgICAgICAxNSAwMDAwMDAyNCAgIDIyMzkwMDBBICAgICAgICAgYmJ6ICAgICAgICAgICAgIHIxMCxyOCxscy53Ci0gICAgICAgMTYgMDAwMDAwMjggICAyQTM5MjAwQSAgICAgICAgIGJiei5hICAgICAgICAgICByMTAscjgsaGkudwotICAgICAgIDE3IDAwMDAwMDJDICAgMjFCOTgwMDQgICAgICAgICBiY25kICAgICAgICAgICAgcjQscjYsbHQwLmIKLSAgICAgICAxOCAwMDAwMDAzMCAgIDIxQjlBMDA0ICAgICAgICAgYmNuZC5hICAgICAgICAgIHI0LHI2LGx0MC5iCi0gICAgICAgMTkgMDAwMDAwMzQgICAwMDM5MDAwNiAgICAgICAgIGJyICAgICAgICAgICAgICByNgotICAgICAgIDIwIDAwMDAwMDM4ICAgMDAzOTIwMDYgICAgICAgICBici5hICAgICAgICAgICAgcjYKLSAgICAgICAyMSAwMDAwMDAzQyAgIDAwMDMwMDBBICAgICAgICAgYnJjciAgICAgICAgICAgIDEwCi0gICAgICAgMjIgMDAwMDAwNDAgICBGODM4MDAwNiAgICAgICAgIGJzciAgICAgICAgICAgICByNixyMzEKLSAgICAgICAyMyAwMDAwMDA0NCAgIEY4MzgyMDA2ICAgICAgICAgYnNyLmEgICAgICAgICAgIHI2LHIzMQotICAgICAgIDI0IDAwMDAwMDQ4ICAgMDAzMDQwMDcgICAgICAgICBjbW5kICAgICAgICAgICAgcjcKLSAgICAgICAyNSAwMDAwMDA0QyAgIDI5M0EwMDAzICAgICAgICAgY21wICAgICAgICAgICAgIHIzLHI0LHI1Ci0gICAgICAgMjYgMDAwMDAwNTAgICAwMkI3MDAwOCAgICAgICAgIGRjYWNoZWMgICAgICAgICByOChyMTApCi0gICAgICAgMjcgMDAwMDAwNTQgICAwQUI3MDAwOCAgICAgICAgIGRjYWNoZWYgICAgICAgICByOChyMTApCi0gICAgICAgMjggMDAwMDAwNTggICA0MUI0MDQwNCAgICAgICAgIGRsZC5iICAgICAgICAgICByNChyNikscjgKLSAgICAgICAyOSAwMDAwMDA1QyAgIDQxQjQyNDA0ICAgICAgICAgZGxkLmggICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDMwIDAwMDAwMDYwICAgNDFCNDQ0MDQgICAgICAgICBkbGQgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzEgMDAwMDAwNjQgICA0MUI0NjQwNCAgICAgICAgIGRsZC5kICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzMiAwMDAwMDA2OCAgIDQxQjUwNDA0ICAgICAgICAgZGxkLnViICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDMzIDAwMDAwMDZDICAgNDFCNTI0MDQgICAgICAgICBkbGQudWggICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzQgMDAwMDAwNzAgICA0MUI2MDQwNCAgICAgICAgIGRzdC5iICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzNSAwMDAwMDA3NCAgIDQxQjYyNDA0ICAgICAgICAgZHN0LmggICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDM2IDAwMDAwMDc4ICAgNDFCNjQ0MDQgICAgICAgICBkc3QgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzcgMDAwMDAwN0MgICA0MUI2NjQwNCAgICAgICAgIGRzdC5kICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzOCAwMDAwMDA4MCAgIDA4MzAyMDA1ICAgICAgICAgZXRyYXAgICAgICAgICAgIHI1Ci0gICAgICAgMzkgMDAwMDAwODQgICAzMTcxNDdFMyAgICAgICAgIGV4dHMgICAgICAgICAgICByMywzMSxyNSxyNgotICAgICAgIDQwIDAwMDAwMDg4ICAgNDk3MTA3QzIgICAgICAgICBleHR1ICAgICAgICAgICAgcjIsMzAscjUscjkKLSAgICAgICA0MSAwMDAwMDA4QyAgIDMxM0UwMDAyICAgICAgICAgZmFkZC5zc3MgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNDIgMDAwMDAwOTAgICAzMTNFMDIwMiAgICAgICAgIGZhZGQuc3NkICAgICAgICByMixyNCxyNgotICAgICAgIDQzIDAwMDAwMDk0ICAgMzEzRTAyODIgICAgICAgICBmYWRkLnNkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA0NCAwMDAwMDA5OCAgIDMxM0UwMjIyICAgICAgICAgZmFkZC5kc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNDUgMDAwMDAwOUMgICAzMTNFMDJBMiAgICAgICAgIGZhZGQuZGRkICAgICAgICByMixyNCxyNgotICAgICAgIDQ2IDAwMDAwMEEwICAgNDFCRUEwMDQgICAgICAgICBmY21wLnNzICAgICAgICAgcjQscjYscjgKLSAgICAgICA0NyAwMDAwMDBBNCAgIDQxQkVBMDg0ICAgICAgICAgZmNtcC5zZCAgICAgICAgIHI0LHI2LHI4Ci0gICAgICAgNDggMDAwMDAwQTggICA0MUJFQTAyNCAgICAgICAgIGZjbXAuZHMgICAgICAgICByNCxyNixyOAotICAgICAgIDQ5IDAwMDAwMEFDICAgNDFCRUEwQTQgICAgICAgICBmY21wLmRkICAgICAgICAgcjQscjYscjgKLSAgICAgICA1MCAwMDAwMDBCMCAgIDMxM0U2MDAyICAgICAgICAgZmRpdi5zc3MgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTEgMDAwMDAwQjQgICAzMTNFNjIwMiAgICAgICAgIGZkaXYuc3NkICAgICAgICByMixyNCxyNgotICAgICAgIDUyIDAwMDAwMEI4ICAgMzEzRTYyODIgICAgICAgICBmZGl2LnNkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1MyAwMDAwMDBCQyAgIDMxM0U2MjIyICAgICAgICAgZmRpdi5kc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTQgMDAwMDAwQzAgICAzMTNFNjJBMiAgICAgICAgIGZkaXYuZGRkICAgICAgICByMixyNCxyNgotICAgICAgIDU1IDAwMDAwMEM0ICAgMzEzRTQwMDIgICAgICAgICBmbXB5LnNzcyAgICAgICAgcjIscjQscjYKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgIDU2IDAwMDAwMEM4ICAgMzEzRTQyMDIgICAgICAgICBmbXB5LnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1NyAwMDAwMDBDQyAgIDMxM0U0MjgyICAgICAgICAgZm1weS5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTggMDAwMDAwRDAgICAzMTNFNDIyMiAgICAgICAgIGZtcHkuZHNkICAgICAgICByMixyNCxyNgotICAgICAgIDU5IDAwMDAwMEQ0ICAgMzEzRTQyQTIgICAgICAgICBmbXB5LmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA2MCAwMDAwMDBEOCAgIDMxM0U0NTQyICAgICAgICAgZm1weS5paWkgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNjEgMDAwMDAwREMgICAzMTNFNDdFMiAgICAgICAgIGZtcHkudXV1ICAgICAgICByMixyNCxyNgotICAgICAgIDYyIDAwMDAwMEUwICAgMzAzRTgxODQgICAgICAgICBmcm5kbS5zcyAgICAgICAgcjQscjYKLSAgICAgICA2MyAwMDAwMDBFNCAgIDMwM0U4Mzg0ICAgICAgICAgZnJuZG0uc2QgICAgICAgIHI0LHI2Ci0gICAgICAgNjQgMDAwMDAwRTggICAzMDNFODU4NCAgICAgICAgIGZybmRtLnNpICAgICAgICByNCxyNgotICAgICAgIDY1IDAwMDAwMEVDICAgMzAzRTg3ODQgICAgICAgICBmcm5kbS5zdSAgICAgICAgcjQscjYKLSAgICAgICA2NiAwMDAwMDBGMCAgIDQwM0U4MUEyICAgICAgICAgZnJuZG0uZHMgICAgICAgIHIyLHI4Ci0gICAgICAgNjcgMDAwMDAwRjQgICA0MDNFODNBMiAgICAgICAgIGZybmRtLmRkICAgICAgICByMixyOAotICAgICAgIDY4IDAwMDAwMEY4ICAgNDAzRTg1QTIgICAgICAgICBmcm5kbS5kaSAgICAgICAgcjIscjgKLSAgICAgICA2OSAwMDAwMDBGQyAgIDQwM0U4N0EyICAgICAgICAgZnJuZG0uZHUgICAgICAgIHIyLHI4Ci0gICAgICAgNzAgMDAwMDAxMDAgICAzMDNFODFDNCAgICAgICAgIGZybmRtLmlzICAgICAgICByNCxyNgotICAgICAgIDcxIDAwMDAwMTA0ICAgMzAzRTgzQzQgICAgICAgICBmcm5kbS5pZCAgICAgICAgcjQscjYKLSAgICAgICA3MiAwMDAwMDEwOCAgIDQwM0U4MUUyICAgICAgICAgZnJuZG0udXMgICAgICAgIHIyLHI4Ci0gICAgICAgNzMgMDAwMDAxMEMgICA0MDNFODNFMiAgICAgICAgIGZybmRtLnVkICAgICAgICByMixyOAotICAgICAgIDc0IDAwMDAwMTEwICAgMzAzRTgwMDQgICAgICAgICBmcm5kbi5zcyAgICAgICAgcjQscjYKLSAgICAgICA3NSAwMDAwMDExNCAgIDMwM0U4MjA0ICAgICAgICAgZnJuZG4uc2QgICAgICAgIHI0LHI2Ci0gICAgICAgNzYgMDAwMDAxMTggICAzMDNFODQwNCAgICAgICAgIGZybmRuLnNpICAgICAgICByNCxyNgotICAgICAgIDc3IDAwMDAwMTFDICAgMzAzRTg2MDQgICAgICAgICBmcm5kbi5zdSAgICAgICAgcjQscjYKLSAgICAgICA3OCAwMDAwMDEyMCAgIDQwM0U4MDIyICAgICAgICAgZnJuZG4uZHMgICAgICAgIHIyLHI4Ci0gICAgICAgNzkgMDAwMDAxMjQgICA0MDNFODIyMiAgICAgICAgIGZybmRuLmRkICAgICAgICByMixyOAotICAgICAgIDgwIDAwMDAwMTI4ICAgNDAzRTg0MjIgICAgICAgICBmcm5kbi5kaSAgICAgICAgcjIscjgKLSAgICAgICA4MSAwMDAwMDEyQyAgIDQwM0U4NjIyICAgICAgICAgZnJuZG4uZHUgICAgICAgIHIyLHI4Ci0gICAgICAgODIgMDAwMDAxMzAgICAzMDNFODA0NCAgICAgICAgIGZybmRuLmlzICAgICAgICByNCxyNgotICAgICAgIDgzIDAwMDAwMTM0ICAgMzAzRTgyNDQgICAgICAgICBmcm5kbi5pZCAgICAgICAgcjQscjYKLSAgICAgICA4NCAwMDAwMDEzOCAgIDQwM0U4MDYyICAgICAgICAgZnJuZG4udXMgICAgICAgIHIyLHI4Ci0gICAgICAgODUgMDAwMDAxM0MgICA0MDNFODI2MiAgICAgICAgIGZybmRuLnVkICAgICAgICByMixyOAotICAgICAgIDg2IDAwMDAwMTQwICAgMzAzRTgxMDQgICAgICAgICBmcm5kcC5zcyAgICAgICAgcjQscjYKLSAgICAgICA4NyAwMDAwMDE0NCAgIDMwM0U4MzA0ICAgICAgICAgZnJuZHAuc2QgICAgICAgIHI0LHI2Ci0gICAgICAgODggMDAwMDAxNDggICAzMDNFODUwNCAgICAgICAgIGZybmRwLnNpICAgICAgICByNCxyNgotICAgICAgIDg5IDAwMDAwMTRDICAgMzAzRTg3MDQgICAgICAgICBmcm5kcC5zdSAgICAgICAgcjQscjYKLSAgICAgICA5MCAwMDAwMDE1MCAgIDQwM0U4MTIyICAgICAgICAgZnJuZHAuZHMgICAgICAgIHIyLHI4Ci0gICAgICAgOTEgMDAwMDAxNTQgICA0MDNFODMyMiAgICAgICAgIGZybmRwLmRkICAgICAgICByMixyOAotICAgICAgIDkyIDAwMDAwMTU4ICAgNDAzRTg1MjIgICAgICAgICBmcm5kcC5kaSAgICAgICAgcjIscjgKLSAgICAgICA5MyAwMDAwMDE1QyAgIDQwM0U4NzIyICAgICAgICAgZnJuZHAuZHUgICAgICAgIHIyLHI4Ci0gICAgICAgOTQgMDAwMDAxNjAgICAzMDNFODE0NCAgICAgICAgIGZybmRwLmlzICAgICAgICByNCxyNgotICAgICAgIDk1IDAwMDAwMTY0ICAgMzAzRTgzNDQgICAgICAgICBmcm5kcC5pZCAgICAgICAgcjQscjYKLSAgICAgICA5NiAwMDAwMDE2OCAgIDQwM0U4MTYyICAgICAgICAgZnJuZHAudXMgICAgICAgIHIyLHI4Ci0gICAgICAgOTcgMDAwMDAxNkMgICA0MDNFODM2MiAgICAgICAgIGZybmRwLnVkICAgICAgICByMixyOAotICAgICAgIDk4IDAwMDAwMTcwICAgMzAzRTgwODQgICAgICAgICBmcm5kei5zcyAgICAgICAgcjQscjYKLSAgICAgICA5OSAwMDAwMDE3NCAgIDMwM0U4Mjg0ICAgICAgICAgZnJuZHouc2QgICAgICAgIHI0LHI2Ci0gICAgICAxMDAgMDAwMDAxNzggICAzMDNFODQ4NCAgICAgICAgIGZybmR6LnNpICAgICAgICByNCxyNgotICAgICAgMTAxIDAwMDAwMTdDICAgMzAzRTg2ODQgICAgICAgICBmcm5kei5zdSAgICAgICAgcjQscjYKLSAgICAgIDEwMiAwMDAwMDE4MCAgIDQwM0U4MEEyICAgICAgICAgZnJuZHouZHMgICAgICAgIHIyLHI4Ci0gICAgICAxMDMgMDAwMDAxODQgICA0MDNFODJBMiAgICAgICAgIGZybmR6LmRkICAgICAgICByMixyOAotICAgICAgMTA0IDAwMDAwMTg4ICAgNDAzRTg0QTIgICAgICAgICBmcm5kei5kaSAgICAgICAgcjIscjgKLSAgICAgIDEwNSAwMDAwMDE4QyAgIDQwM0U4NkEyICAgICAgICAgZnJuZHouZHUgICAgICAgIHIyLHI4Ci0gICAgICAxMDYgMDAwMDAxOTAgICAzMDNFODBDNCAgICAgICAgIGZybmR6LmlzICAgICAgICByNCxyNgotICAgICAgMTA3IDAwMDAwMTk0ICAgMzAzRTgyQzQgICAgICAgICBmcm5kei5pZCAgICAgICAgcjQscjYKLSAgICAgIDEwOCAwMDAwMDE5OCAgIDQwM0U4MEUyICAgICAgICAgZnJuZHoudXMgICAgICAgIHIyLHI4Ci0gICAgICAxMDkgMDAwMDAxOUMgICA0MDNFODJFMiAgICAgICAgIGZybmR6LnVkICAgICAgICByMixyOAotICAgICAgMTEwIDAwMDAwMUEwICAgNDAzRUUwMDYgICAgICAgICBmc3FydC5zcyAgICAgICAgcjYscjgKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDMKLQotICAgICAgMTExIDAwMDAwMUE0ICAgNDAzRUUyMDYgICAgICAgICBmc3FydC5zZCAgICAgICAgcjYscjgKLSAgICAgIDExMiAwMDAwMDFBOCAgIDQwM0VFMjI2ICAgICAgICAgZnNxcnQuZGQgICAgICAgIHI2LHI4Ci0gICAgICAxMTMgMDAwMDAxQUMgICAzMTNFMjAwMiAgICAgICAgIGZzdWIuc3NzICAgICAgICByMixyNCxyNgotICAgICAgMTE0IDAwMDAwMUIwICAgMzEzRTIyMDIgICAgICAgICBmc3ViLnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgIDExNSAwMDAwMDFCNCAgIDMxM0UyMjgyICAgICAgICAgZnN1Yi5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAxMTYgMDAwMDAxQjggICAzMTNFMjIyMiAgICAgICAgIGZzdWIuZHNkICAgICAgICByMixyNCxyNgotICAgICAgMTE3IDAwMDAwMUJDICAgMzEzRTIyQTIgICAgICAgICBmc3ViLmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgIDExOCAwMDAwMDFDMCAgIDUyMzFFM0U0ICAgICAgICAgaW5zICAgICAgICAgICAgIHI0LDMxLHI4LHIxMAotICAgICAgMTE5IDAwMDAwMUM0ICAgNDFCODgwMDQgICAgICAgICBqc3IgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjAgMDAwMDAxQzggICA0MUI4QTAwNCAgICAgICAgIGpzci5hICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyMSAwMDAwMDFDQyAgIDQxQjQwMDA0ICAgICAgICAgbGQuYiAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTIyIDAwMDAwMUQwICAgNDFCNDIwMDQgICAgICAgICBsZC5oICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjMgMDAwMDAxRDQgICA0MUI0NDAwNCAgICAgICAgIGxkICAgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyNCAwMDAwMDFEOCAgIDQxQjQ2MDA0ICAgICAgICAgbGQuZCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTI1IDAwMDAwMURDICAgNDFCNTAwMDQgICAgICAgICBsZC51YiAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjYgMDAwMDAxRTAgICA0MUI1MjAwNCAgICAgICAgIGxkLnVoICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyNyAwMDAwMDFFNCAgIDQxRkYwMDA3ICAgICAgICAgbG1vICAgICAgICAgICAgIHI3LHI4Ci0gICAgICAxMjggMDAwMDAxRTggICAxOEIyRTAwMSAgICAgICAgIG9yICAgICAgICAgICAgICByMSxyMixyMwotICAgICAgMTI5IDAwMDAwMUVDICAgMThCMkUwMDEgICAgICAgICBvci50dCAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEzMCAwMDAwMDFGMCAgIDE4QjNDMDAxICAgICAgICAgb3IuZmYgICAgICAgICAgIHIxLHIyLHIzCi0gICAgICAxMzEgMDAwMDAxRjQgICAxOEIzQTAwMSAgICAgICAgIG9yLmZ0ICAgICAgICAgICByMSxyMixyMwotICAgICAgMTMyIDAwMDAwMUY4ICAgMThCMzYwMDEgICAgICAgICBvci50ZiAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEzMyAwMDAwMDFGQyAgIDIwMzA4MDA2ICAgICAgICAgcmRjciAgICAgICAgICAgIHI2LHI0Ci0gICAgICAxMzQgMDAwMDAyMDAgICAyOTNGMjAwNCAgICAgICAgIHJtbyAgICAgICAgICAgICByNCxyNQotICAgICAgMTM1IDAwMDAwMjA0ICAgNTIzMTAzRTIgICAgICAgICByb3RsICAgICAgICAgICAgcjIsMzEscjgscjEwCi0gICAgICAxMzYgMDAwMDAyMDggICAzMEIxMDdFOCAgICAgICAgIHJvdHIgICAgICAgICAgICByOCwzMSxyMixyNgotICAgICAgMTM3IDAwMDAwMjBDICAgMzBCMUMzRTQgICAgICAgICBzaGwgICAgICAgICAgICAgcjQsMzEscjIscjYKLSAgICAgIDEzOCAwMDAwMDIxMCAgIDMxNzEwMTg0ICAgICAgICAgc2wuZHogICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxMzkgMDAwMDAyMTQgICAzMTcxMjE4NCAgICAgICAgIHNsLmRtICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQwIDAwMDAwMjE4ICAgMzE3MTQxODQgICAgICAgICBzbC5kcyAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0MSAwMDAwMDIxQyAgIDMxNzE2MTg0ICAgICAgICAgc2wuZXogICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDIgMDAwMDAyMjAgICAzMTcxODE4NCAgICAgICAgIHNsLmVtICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQzIDAwMDAwMjI0ICAgMzE3MUExODQgICAgICAgICBzbC5lcyAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0NCAwMDAwMDIyOCAgIDMxNzFDMTg0ICAgICAgICAgc2wuaXogICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDUgMDAwMDAyMkMgICAzMTcxRTE4NCAgICAgICAgIHNsLmltICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ2IDAwMDAwMjMwICAgMzE3MTA5ODQgICAgICAgICBzbGkuZHogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0NyAwMDAwMDIzNCAgIDMxNzEyOTg0ICAgICAgICAgc2xpLmRtICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDggMDAwMDAyMzggICAzMTcxNDk4NCAgICAgICAgIHNsaS5kcyAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ5IDAwMDAwMjNDICAgMzE3MTY5ODQgICAgICAgICBzbGkuZXogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1MCAwMDAwMDI0MCAgIDMxNzE4OTg0ICAgICAgICAgc2xpLmVtICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTEgMDAwMDAyNDQgICAzMTcxQTk4NCAgICAgICAgIHNsaS5lcyAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTUyIDAwMDAwMjQ4ICAgMzE3MUM5ODQgICAgICAgICBzbGkuaXogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1MyAwMDAwMDI0QyAgIDMxNzFFOTg0ICAgICAgICAgc2xpLmltICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTQgMDAwMDAyNTAgICAzMTcxMDU4NCAgICAgICAgIHNyLmR6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU1IDAwMDAwMjU0ICAgMzE3MTI1ODQgICAgICAgICBzci5kbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1NiAwMDAwMDI1OCAgIDMxNzE0NTg0ICAgICAgICAgc3IuZHMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTcgMDAwMDAyNUMgICAzMTcxNjU4NCAgICAgICAgIHNyLmV6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU4IDAwMDAwMjYwICAgMzE3MTg1ODQgICAgICAgICBzci5lbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1OSAwMDAwMDI2NCAgIDMxNzFBNTg0ICAgICAgICAgc3IuZXMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjAgMDAwMDAyNjggICAzMTcxQzU4NCAgICAgICAgIHNyLml6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTYxIDAwMDAwMjZDICAgMzE3MUU1ODQgICAgICAgICBzci5pbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2MiAwMDAwMDI3MCAgIDQxQjFBNDA0ICAgICAgICAgc3JhICAgICAgICAgICAgIHI0LDMyLHI2LHI4Ci0gICAgICAxNjMgMDAwMDAyNzQgICAzMTcxMEQ4NCAgICAgICAgIHNyaS5keiAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTY0IDAwMDAwMjc4ICAgMzE3MTJEODQgICAgICAgICBzcmkuZG0gICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2NSAwMDAwMDI3QyAgIDMxNzE0RDg0ICAgICAgICAgc3JpLmRzICAgICAgICAgIHI0LDEyLHI1LHI2Ci0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICA0Ci0KLSAgICAgIDE2NiAwMDAwMDI4MCAgIDMxNzE2RDg0ICAgICAgICAgc3JpLmV6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjcgMDAwMDAyODQgICAzMTcxOEQ4NCAgICAgICAgIHNyaS5lbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTY4IDAwMDAwMjg4ICAgMzE3MUFEODQgICAgICAgICBzcmkuZXMgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2OSAwMDAwMDI4QyAgIDMxNzFDRDg0ICAgICAgICAgc3JpLml6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNzAgMDAwMDAyOTAgICAzMTcxRUQ4NCAgICAgICAgIHNyaS5pbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTcxIDAwMDAwMjk0ICAgNDFCMTY0MDQgICAgICAgICBzcmwgICAgICAgICAgICAgcjQsMzIscjYscjgKLSAgICAgIDE3MiAwMDAwMDI5OCAgIDQxQjYwMDA0ICAgICAgICAgc3QuYiAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTczIDAwMDAwMjlDICAgNDFCNjIwMDQgICAgICAgICBzdC5oICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxNzQgMDAwMDAyQTAgICA0MUI2NDAwNCAgICAgICAgIHN0ICAgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDE3NSAwMDAwMDJBNCAgIDQxQjY2MDA0ICAgICAgICAgc3QuZCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTc2IDAwMDAwMkE4ICAgNEEzQjQwMDcgICAgICAgICBzdWIgICAgICAgICAgICAgcjcscjgscjkKLSAgICAgIDE3NyAwMDAwMDJBQyAgIDRBM0I2MDA3ICAgICAgICAgc3VidSAgICAgICAgICAgIHI3LHI4LHI5Ci0gICAgICAxNzggMDAwMDAyQjAgICAyMUIwQTAwOCAgICAgICAgIHN3Y3IgICAgICAgICAgICByOCxyNixyNAotICAgICAgMTc5IDAwMDAwMkI0ICAgMDAzMDIwMEEgICAgICAgICB0cmFwICAgICAgICAgICAgcjEwCi0gICAgICAxODAgMDAwMDAyQjggICAwMTNDMDAwMiAgICAgICAgIHZhZGQuc3MgICAgICAgICByMixyNCxyNAotICAgICAgMTgxIDAwMDAwMkJDICAgMDFCQzAwODIgICAgICAgICB2YWRkLnNkICAgICAgICAgcjIscjYscjYKLSAgICAgIDE4MiAwMDAwMDJDMCAgIDAyQkMwMEEyICAgICAgICAgdmFkZC5kZCAgICAgICAgIHIyLHIxMCxyMTAKLSAgICAgIDE4MyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMC5zICAgICAgICAgIHI2Ci0gICAgICAxODQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDEucyAgICAgICAgICByNwotICAgICAgMTg1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bGQwLmQgICAgICAgICAgcjYKLSAgICAgIDE4NiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMS5kICAgICAgICAgIHI4Ci0gICAgICAxODcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSwwLGEzCi0gICAgICAxODggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSwwLHIxMAotICAgICAgMTg5ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksYTEsYTMKLSAgICAgIDE5MCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc3MgICAgICAgIHI3LHI5LGEzLHIxMAotICAgICAgMTkxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksMCxhMAotICAgICAgMTkyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksMCxyMTAKLSAgICAgIDE5MyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LGExLGEyCi0gICAgICAxOTQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NkICAgICAgICByNyxyOSxhMyxyMTAKLSAgICAgIDE5NSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1weS5zcyAgICAgICAgIHIxLHIzLHIzCi0gICAgICAxOTYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtcHkuc2QgICAgICAgICByNSxyNixyNgotICAgICAgMTk3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXB5LmRkICAgICAgICAgcjIscjQscjQKLSAgICAgIDE5OCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LDAsYTAKLSAgICAgIDE5OSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LDAscjEwCi0gICAgICAyMDAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSxhMCxhMQotICAgICAgMjAxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzcyAgICAgICAgcjcscjksYTMscjEwCi0gICAgICAyMDIgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSwwLGEwCi0gICAgICAyMDMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSwwLHIxMAotICAgICAgMjA0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksYTAsYTEKLSAgICAgIDIwNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc2QgICAgICAgIHI3LHI5LGEzLHIxMAotICAgICAgMjA2ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zcyAgICAgICAgcjYsYTIsYTQKLSAgICAgIDIwNyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc2QgICAgICAgIHI2LGEyLGE0Ci0gICAgICAyMDggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc3ViLnNzICAgICAgICByNCxhNCxyNgotICAgICAgMjA5ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zZCAgICAgICAgcjQsYTQscjYKLSAgICAgIDIxMCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zaSAgICAgICAgIHI0LHI2Ci0gICAgICAyMTEgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2kgICAgICAgICByNCxhMAotICAgICAgMjEyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnN1ICAgICAgICAgcjQscjYKLSAgICAgIDIxMyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zdSAgICAgICAgIHI0LGEwCi0gICAgICAyMTQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc3MgICAgICAgICByNCxyNgotICAgICAgMjE1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNzICAgICAgICAgcjQsYTAKLSAgICAgIDIxNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zZCAgICAgICAgIHI0LHI2Ci0gICAgICAyMTcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2QgICAgICAgICByNCxhMAotICAgICAgMjE4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRpICAgICAgICAgcjQscjYKLSAgICAgIDIxOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kaSAgICAgICAgIHI0LGEwCi0gICAgICAyMjAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHUgICAgICAgICByNCxyNgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgNQotCi0gICAgICAyMjEgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHUgICAgICAgICByNCxhMAotICAgICAgMjIyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRzICAgICAgICAgcjQscjYKLSAgICAgIDIyMyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kcyAgICAgICAgIHI0LGEwCi0gICAgICAyMjQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZGQgICAgICAgICByNCxyNgotICAgICAgMjI1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRkICAgICAgICAgcjQsYTAKLSAgICAgIDIyNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5pcyAgICAgICAgIHI0LHI2Ci0gICAgICAyMjcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuaWQgICAgICAgICByNCxyNgotICAgICAgMjI4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnVzICAgICAgICAgcjQscjYKLSAgICAgIDIyOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC51ZCAgICAgICAgIHI0LHI2Ci0gICAgICAyMzAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdC5zICAgICAgICAgICByNgotICAgICAgMjMxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3QuZCAgICAgICAgICAgcjYKLSAgICAgIDIzMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN1Yi5zcyAgICAgICAgIHIyLHI0LHI2Ci0gICAgICAyMzMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdWIuc2QgICAgICAgICByMixyNCxyNgotICAgICAgMjM0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3ViLmRkICAgICAgICAgcjIscjQscjYKLSAgICAgIDIzNSAwMDAwMDJDNCAgIDAxNzBBMDA2ICAgICAgICAgd3JjciAgICAgICAgICAgIHI2LHI1Ci0gICAgICAyMzYgMDAwMDAyQzggICAzOUIzMjAwNSAgICAgICAgIHhub3IgICAgICAgICAgICByNSxyNixyNwotICAgICAgMjM3IDAwMDAwMkNDICAgNEEzMkMwMDcgICAgICAgICB4b3IgICAgICAgICAgICAgcjcscjgscjkKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY5MzUyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLTs7IFNpbXBsZSByZWdpc3RlciBmb3JtcwotOzsgVGhvc2UgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFsc28gdXNlIGFuIGltbWVkaWF0ZSBqdXN0IHVzZSBhIGNvbnN0YW50LgotCi0JLnRleHQKLQotCWFkZAkJcjMscjQscjUKLQlhZGR1CQlyMyxyNCxyNQotCWFuZAkJcjUscjQscjIKLQlhbmQudHQJCXI1LHI0LHIyCi0JYW5kLmZmCQlyMTAscjEyLHIxNAotCWFuZC5mdAkJcjEwLHIxMixyMTQKLQlhbmQudGYJCXIxMCxyMTIscjE0Ci0JYmJvCQlyMTAscjgsbG8udwotCWJiby5hCQlyMTAscjgsZXEuYgotCWJiegkJcjEwLHI4LGxzLncKLQliYnouYQkJcjEwLHI4LGhpLncKLQliY25kCQlyNCxyNixsdDAuYgotCWJjbmQuYQkJcjQscjYsbHQwLmIKLQlicgkJcjYKLQlici5hCQlyNgotCWJyY3IJCTEwCi0JYnNyCQlyNixyMzEKLQlic3IuYQkJcjYscjMxCi0JY21uZAkJcjcKLQljbXAJCXIzLHI0LHI1Ci0JZGNhY2hlYwkJcjgocjEwKQotCWRjYWNoZWYJCXI4KHIxMCkKLQlkbGQuYgkJcjQocjYpLHI4Ci0JZGxkLmgJCXI0KHI2KSxyOAotCWRsZAkJcjQocjYpLHI4Ci0JZGxkLmQJCXI0KHI2KSxyOAotCWRsZC51YgkJcjQocjYpLHI4Ci0JZGxkLnVoCQlyNChyNikscjgKLQlkc3QuYgkJcjQocjYpLHI4Ci0JZHN0LmgJCXI0KHI2KSxyOAotCWRzdAkJcjQocjYpLHI4Ci0JZHN0LmQJCXI0KHI2KSxyOAotCWV0cmFwCQlyNQotCWV4dHMJCXIzLDMxLHI1LHI2Ci0JZXh0dQkJcjIsMzAscjUscjkKLQlmYWRkLnNzcwlyMixyNCxyNgotCWZhZGQuc3NkCXIyLHI0LHI2Ci0JZmFkZC5zZGQJcjIscjQscjYKLQlmYWRkLmRzZAlyMixyNCxyNgotCWZhZGQuZGRkCXIyLHI0LHI2Ci0JZmNtcC5zcwkJcjQscjYscjgKLQlmY21wLnNkCQlyNCxyNixyOAotCWZjbXAuZHMJCXI0LHI2LHI4Ci0JZmNtcC5kZAkJcjQscjYscjgKLQlmZGl2LnNzcwlyMixyNCxyNgotCWZkaXYuc3NkCXIyLHI0LHI2Ci0JZmRpdi5zZGQJcjIscjQscjYKLQlmZGl2LmRzZAlyMixyNCxyNgotCWZkaXYuZGRkCXIyLHI0LHI2Ci0JZm1weS5zc3MJcjIscjQscjYKLQlmbXB5LnNzZAlyMixyNCxyNgotCWZtcHkuc2RkCXIyLHI0LHI2Ci0JZm1weS5kc2QJcjIscjQscjYKLQlmbXB5LmRkZAlyMixyNCxyNgotCWZtcHkuaWlpCXIyLHI0LHI2Ci0JZm1weS51dXUJcjIscjQscjYKLQlmcm5kbS5zcwlyNCxyNgotCWZybmRtLnNkCXI0LHI2Ci0JZnJuZG0uc2kJcjQscjYKLQlmcm5kbS5zdQlyNCxyNgotCWZybmRtLmRzCXIyLHI4Ci0JZnJuZG0uZGQJcjIscjgKLQlmcm5kbS5kaQlyMixyOAotCWZybmRtLmR1CXIyLHI4Ci0JZnJuZG0uaXMJcjQscjYKLQlmcm5kbS5pZAlyNCxyNgotCWZybmRtLnVzCXIyLHI4Ci0JZnJuZG0udWQJcjIscjgKLQlmcm5kbi5zcwlyNCxyNgotCWZybmRuLnNkCXI0LHI2Ci0JZnJuZG4uc2kJcjQscjYKLQlmcm5kbi5zdQlyNCxyNgotCWZybmRuLmRzCXIyLHI4Ci0JZnJuZG4uZGQJcjIscjgKLQlmcm5kbi5kaQlyMixyOAotCWZybmRuLmR1CXIyLHI4Ci0JZnJuZG4uaXMJcjQscjYKLQlmcm5kbi5pZAlyNCxyNgotCWZybmRuLnVzCXIyLHI4Ci0JZnJuZG4udWQJcjIscjgKLQlmcm5kcC5zcwlyNCxyNgotCWZybmRwLnNkCXI0LHI2Ci0JZnJuZHAuc2kJcjQscjYKLQlmcm5kcC5zdQlyNCxyNgotCWZybmRwLmRzCXIyLHI4Ci0JZnJuZHAuZGQJcjIscjgKLQlmcm5kcC5kaQlyMixyOAotCWZybmRwLmR1CXIyLHI4Ci0JZnJuZHAuaXMJcjQscjYKLQlmcm5kcC5pZAlyNCxyNgotCWZybmRwLnVzCXIyLHI4Ci0JZnJuZHAudWQJcjIscjgKLQlmcm5kei5zcwlyNCxyNgotCWZybmR6LnNkCXI0LHI2Ci0JZnJuZHouc2kJcjQscjYKLQlmcm5kei5zdQlyNCxyNgotCWZybmR6LmRzCXIyLHI4Ci0JZnJuZHouZGQJcjIscjgKLQlmcm5kei5kaQlyMixyOAotCWZybmR6LmR1CXIyLHI4Ci0JZnJuZHouaXMJcjQscjYKLQlmcm5kei5pZAlyNCxyNgotCWZybmR6LnVzCXIyLHI4Ci0JZnJuZHoudWQJcjIscjgKLQlmc3FydC5zcwlyNixyOAotCWZzcXJ0LnNkCXI2LHI4Ci0JZnNxcnQuZGQJcjYscjgKLQlmc3ViLnNzcwlyMixyNCxyNgotCWZzdWIuc3NkCXIyLHI0LHI2Ci0JZnN1Yi5zZGQJcjIscjQscjYKLQlmc3ViLmRzZAlyMixyNCxyNgotCWZzdWIuZGRkCXIyLHI0LHI2Ci0JaW5zCQlyNCwzMSxyOCxyMTAKLQlqc3IJCXI0KHI2KSxyOAotCWpzci5hCQlyNChyNikscjgKLQlsZC5iCQlyNChyNikscjgKLQlsZC5oCQlyNChyNikscjgKLQlsZAkJcjQocjYpLHI4Ci0JbGQuZAkJcjQocjYpLHI4Ci0JbGQudWIJCXI0KHI2KSxyOAotCWxkLnVoCQlyNChyNikscjgKLQlsbW8JCXI3LHI4Ci0Jb3IJCXIxLHIyLHIzCi0Jb3IudHQJCXIxLHIyLHIzCi0Jb3IuZmYJCXIxLHIyLHIzCi0Jb3IuZnQJCXIxLHIyLHIzCi0Jb3IudGYJCXIxLHIyLHIzCi0JcmRjcgkJcjYscjQKLQlybW8JCXI0LHI1Ci0Jcm90bAkJcjIsMzEscjgscjEwCi0Jcm90cgkJcjgsMzEscjIscjYKLQlzaGwJCXI0LDMxLHIyLHI2Ci0Jc2wuZHoJCXI0LDEyLHI1LHI2Ci0Jc2wuZG0JCXI0LDEyLHI1LHI2Ci0Jc2wuZHMJCXI0LDEyLHI1LHI2Ci0Jc2wuZXoJCXI0LDEyLHI1LHI2Ci0Jc2wuZW0JCXI0LDEyLHI1LHI2Ci0Jc2wuZXMJCXI0LDEyLHI1LHI2Ci0Jc2wuaXoJCXI0LDEyLHI1LHI2Ci0Jc2wuaW0JCXI0LDEyLHI1LHI2Ci0Jc2xpLmR6CQlyNCwxMixyNSxyNgotCXNsaS5kbQkJcjQsMTIscjUscjYKLQlzbGkuZHMJCXI0LDEyLHI1LHI2Ci0Jc2xpLmV6CQlyNCwxMixyNSxyNgotCXNsaS5lbQkJcjQsMTIscjUscjYKLQlzbGkuZXMJCXI0LDEyLHI1LHI2Ci0Jc2xpLml6CQlyNCwxMixyNSxyNgotCXNsaS5pbQkJcjQsMTIscjUscjYKLQlzci5kegkJcjQsMTIscjUscjYKLQlzci5kbQkJcjQsMTIscjUscjYKLQlzci5kcwkJcjQsMTIscjUscjYKLQlzci5legkJcjQsMTIscjUscjYKLQlzci5lbQkJcjQsMTIscjUscjYKLQlzci5lcwkJcjQsMTIscjUscjYKLQlzci5pegkJcjQsMTIscjUscjYKLQlzci5pbQkJcjQsMTIscjUscjYKLQlzcmEJCXI0LDMyLHI2LHI4Ci0Jc3JpLmR6CQlyNCwxMixyNSxyNgotCXNyaS5kbQkJcjQsMTIscjUscjYKLQlzcmkuZHMJCXI0LDEyLHI1LHI2Ci0Jc3JpLmV6CQlyNCwxMixyNSxyNgotCXNyaS5lbQkJcjQsMTIscjUscjYKLQlzcmkuZXMJCXI0LDEyLHI1LHI2Ci0Jc3JpLml6CQlyNCwxMixyNSxyNgotCXNyaS5pbQkJcjQsMTIscjUscjYKLQlzcmwJCXI0LDMyLHI2LHI4Ci0Jc3QuYgkJcjQocjYpLHI4Ci0Jc3QuaAkJcjQocjYpLHI4Ci0Jc3QJCXI0KHI2KSxyOAotCXN0LmQJCXI0KHI2KSxyOAotCXN1YgkJcjcscjgscjkKLQlzdWJ1CQlyNyxyOCxyOQotCXN3Y3IJCXI4LHI2LHI0Ci0JdHJhcAkJcjEwCi0JdmFkZC5zcwkJcjIscjQscjQKLQl2YWRkLnNkCQlyMixyNixyNgotCXZhZGQuZGQJCXIyLHIxMCxyMTAKLTsJdmxkMC5zCQlyNgotOwl2bGQxLnMJCXI3Ci07CXZsZDAuZAkJcjYKLTsJdmxkMS5kCQlyOAotOwl2bWFjLnNzcwlyNyxyOSwwLGEzCi07CXZtYWMuc3NzCXI3LHI5LDAscjEwCi07CXZtYWMuc3NzCXI3LHI5LGExLGEzCi07CXZtYWMuc3NzCXI3LHI5LGEzLHIxMAotOwl2bWFjLnNzZAlyNyxyOSwwLGEwCi07CXZtYWMuc3NkCXI3LHI5LDAscjEwCi07CXZtYWMuc3NkCXI3LHI5LGExLGEyCi07CXZtYWMuc3NkCXI3LHI5LGEzLHIxMAotOwl2bXB5LnNzCQlyMSxyMyxyMwotOwl2bXB5LnNkCQlyNSxyNixyNgotOwl2bXB5LmRkCQlyMixyNCxyNAotOwl2bXNjLnNzcwlyNyxyOSwwLGEwCi07CXZtc2Muc3NzCXI3LHI5LDAscjEwCi07CXZtc2Muc3NzCXI3LHI5LGEwLGExCi07CXZtc2Muc3NzCXI3LHI5LGEzLHIxMAotOwl2bXNjLnNzZAlyNyxyOSwwLGEwCi07CXZtc2Muc3NkCXI3LHI5LDAscjEwCi07CXZtc2Muc3NkCXI3LHI5LGEwLGExCi07CXZtc2Muc3NkCXI3LHI5LGEzLHIxMAotOwl2bXN1Yi5zcwlyNixhMixhNAotOwl2bXN1Yi5zZAlyNixhMixhNAotOwl2bXN1Yi5zcwlyNCxhNCxyNgotOwl2bXN1Yi5zZAlyNCxhNCxyNgotOwl2cm5kLnNpCQlyNCxyNgotOwl2cm5kLnNpCQlyNCxhMAotOwl2cm5kLnN1CQlyNCxyNgotOwl2cm5kLnN1CQlyNCxhMAotOwl2cm5kLnNzCQlyNCxyNgotOwl2cm5kLnNzCQlyNCxhMAotOwl2cm5kLnNkCQlyNCxyNgotOwl2cm5kLnNkCQlyNCxhMAotOwl2cm5kLmRpCQlyNCxyNgotOwl2cm5kLmRpCQlyNCxhMAotOwl2cm5kLmR1CQlyNCxyNgotOwl2cm5kLmR1CQlyNCxhMAotOwl2cm5kLmRzCQlyNCxyNgotOwl2cm5kLmRzCQlyNCxhMAotOwl2cm5kLmRkCQlyNCxyNgotOwl2cm5kLmRkCQlyNCxhMAotOwl2cm5kLmlzCQlyNCxyNgotOwl2cm5kLmlkCQlyNCxyNgotOwl2cm5kLnVzCQlyNCxyNgotOwl2cm5kLnVkCQlyNCxyNgotOwl2c3QucwkJcjYKLTsJdnN0LmQJCXI2Ci07CXZzdWIuc3MJCXIyLHI0LHI2Ci07CXZzdWIuc2QJCXIyLHI0LHI2Ci07CXZzdWIuZGQJCXIyLHI0LHI2Ci0Jd3JjcgkJcjYscjUKLQl4bm9yCQlyNSxyNixyNwotCXhvcgkJcjcscjgscjkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3ZjRhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCByZWdpc3RlciBvcGVyYW5kcyB3aXRoIDptIG1vZGlmaWVyCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwOCA4MCBiNyAwMi4qCi0gICA0OgkwNCAwMCA5ZSAwMi4qCi0gICA4OglmYyA3ZiA5ZSAwMi4qCi0gICBjOgkwMCA5MCBiNyAwMiA3OCA1NiAzNCAxMi4qCi0gIDE0OgkwMCA5MCBiNyAwMiBlZiBiZSBhZCBkZS4qCi0gIDFjOgkwOCA4MCBiNyAwYS4qCi0gIDIwOgkwNCAwMCA5ZSAwYS4qCi0gIDI0OglmYyA3ZiA5ZSAwYS4qCi0gIDI4OgkwMCA5MCBiNyAwYSA3OCA1NiAzNCAxMi4qCi0gIDMwOgkwMCA5MCBiNyAwYSBlZiBiZSBhZCBkZS4qCi0gIDM4OgkwNCA4NCBiNCA0MS4qCi0gIDNjOgkwNCBhNCBiNCA0MS4qCi0gIDQwOgkwNCBjNCBiNCA0MS4qCi0gIDQ0OgkwNCBlNCBiNCA0MS4qCi0gIDQ4OgkwMCA5NCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIDUwOgkwMCBiNCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIDU4OgkwMCBkNCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIDYwOgkwMCBmNCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIDY4OgkwNCA4NCBiNSA0MS4qCi0gIDZjOgkwNCBhNCBiNSA0MS4qCi0gIDcwOgkwMCA5NCBiNSA0MSAwMCAwMCAwMCBlMC4qCi0gIDc4OgkwMCBiNCBiNSA0MSAwMCAwMCAwMCBlMC4qCi0gIDgwOgkwNCA4NCBiNiA0MS4qCi0gIDg0OgkwNCBhNCBiNiA0MS4qCi0gIDg4OgkwNCBjNCBiNiA0MS4qCi0gIDhjOgkwNCBlNCBiNiA0MS4qCi0gIDkwOgkwMCA5NCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gIDk4OgkwMCBiNCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gIGEwOgkwMCBkNCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gIGE4OgkwMCBmNCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gIGIwOgkwNCA4MCBiNCA0MS4qCi0gIGI0OgkwNCBhMCBiNCA0MS4qCi0gIGI4OgkwNCBjMCBiNCA0MS4qCi0gIGJjOgkwNCBlMCBiNCA0MS4qCi0gIGMwOglmMCA3ZiA5MiA0MS4qCi0gIGM0OglmMCBmZiA5MiA0MS4qCi0gIGM4OglmMCA3ZiA5MyA0MS4qCi0gIGNjOglmMCBmZiA5MyA0MS4qCi0gIGQwOgkwMCA5MCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIGQ4OgkwMCBiMCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIGUwOgkwMCBkMCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIGU4OgkwMCBmMCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIGYwOgkwNCA4MCBiNSA0MS4qCi0gIGY0OgkwNCBhMCBiNSA0MS4qCi0gIGY4OglmMCA3ZiA5NiA0MS4qCi0gIGZjOglmMCBmZiA5NiA0MS4qCi0gMTAwOgkwMCA5MCBiNSA0MSAwMCAwMCAwMCBlMC4qCi0gMTA4OgkwMCBiMCBiNSA0MSAwMCAwMCAwMCBlMC4qCi0gMTEwOgkwNCA4MCBiNiA0MS4qCi0gMTE0OgkwNCBhMCBiNiA0MS4qCi0gMTE4OgkwNCBjMCBiNiA0MS4qCi0gMTFjOgkwNCBlMCBiNiA0MS4qCi0gMTIwOgkwMCA3ZiA5YSA0MS4qCi0gMTI0OgkwMCBmZiA5YSA0MS4qCi0gMTI4OgkwMCA3ZiA5YiA0MS4qCi0gMTJjOgkwMCBmZiA5YiA0MS4qCi0gMTMwOgkwMCA5MCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gMTM4OgkwMCBiMCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gMTQwOgkwMCBkMCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gMTQ4OgkwMCBmMCBiNiA0MSAwMCAwMCAwMCBlMC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTFmYjk3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIubHN0CisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAwMDAwMDAwMCAgIDAyQjc4MDA4ICAgICAgICAgZGNhY2hlYyByOChyMTA6bSkgICAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0gKG1vZGlmaWVkKQotICAgICAgICAyIDAwMDAwMDA0ICAgMDI5RTAwMDQgICAgICAgICBkY2FjaGVjIDQocjEwOm0pICAgICAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAzIDAwMDAwMDA4ICAgMDI5RTdGRkMgICAgICAgICBkY2FjaGVjIC00KHIxMDptKSAgICAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICA0IDAwMDAwMDBDICAgMDJCNzkwMDAgICAgICAgICBkY2FjaGVjIDB4MTIzNDU2NzgocjEwOm0pICAgICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgICAgMDAwMDAwMTAgICAxMjM0NTY3OCAKLSAgICAgICAgNSAwMDAwMDAxNCAgIDAyQjc5MDAwICAgICAgICAgZGNhY2hlYyAweERFQURCRUVGKHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAgIDAwMDAwMDE4ICAgREVBREJFRUYgCi0gICAgICAgIDYgMDAwMDAwMUMgICAwQUI3ODAwOCAgICAgICAgIGRjYWNoZWYgcjgocjEwOm0pICAgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLSAgICAgICAgNyAwMDAwMDAyMCAgIDBBOUUwMDA0ICAgICAgICAgZGNhY2hlZiA0KHIxMDptKSAgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgOCAwMDAwMDAyNCAgIDBBOUU3RkZDICAgICAgICAgZGNhY2hlZiAtNChyMTA6bSkgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgOSAwMDAwMDAyOCAgIDBBQjc5MDAwICAgICAgICAgZGNhY2hlZiAweDEyMzQ1Njc4KHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAgIDAwMDAwMDJDICAgMTIzNDU2NzggCi0gICAgICAgMTAgMDAwMDAwMzAgICAwQUI3OTAwMCAgICAgICAgIGRjYWNoZWYgMHhERUFEQkVFRihyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgICAwMDAwMDAzNCAgIERFQURCRUVGIAotICAgICAgIDExIDAwMDAwMDM4ICAgNDFCNDg0MDQgICAgICAgICBkbGQuYiAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEyIDAwMDAwMDNDICAgNDFCNEE0MDQgICAgICAgICBkbGQuaCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEzIDAwMDAwMDQwICAgNDFCNEM0MDQgICAgICAgICBkbGQgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE0IDAwMDAwMDQ0ICAgNDFCNEU0MDQgICAgICAgICBkbGQuZCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE1IDAwMDAwMDQ4ICAgNDFCNDk0MDAgICAgICAgICBkbGQuYiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDRDICAgRTAwMDAwMDAgCi0gICAgICAgMTYgMDAwMDAwNTAgICA0MUI0QjQwMCAgICAgICAgIGRsZC5oICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNTQgICBFMDAwMDAwMCAKLSAgICAgICAxNyAwMDAwMDA1OCAgIDQxQjRENDAwICAgICAgICAgZGxkICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA1QyAgIEUwMDAwMDAwIAotICAgICAgIDE4IDAwMDAwMDYwICAgNDFCNEY0MDAgICAgICAgICBkbGQuZCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDY0ICAgRTAwMDAwMDAgCi0gICAgICAgMTkgMDAwMDAwNjggICA0MUI1ODQwNCAgICAgICAgIGRsZC51YiAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMjAgMDAwMDAwNkMgICA0MUI1QTQwNCAgICAgICAgIGRsZC51aCAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMjEgMDAwMDAwNzAgICA0MUI1OTQwMCAgICAgICAgIGRsZC51YiAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNzQgICBFMDAwMDAwMCAKLSAgICAgICAyMiAwMDAwMDA3OCAgIDQxQjVCNDAwICAgICAgICAgZGxkLnVoICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA3QyAgIEUwMDAwMDAwIAotICAgICAgIDIzIDAwMDAwMDgwICAgNDFCNjg0MDQgICAgICAgICBkc3QuYiAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDI0IDAwMDAwMDg0ICAgNDFCNkE0MDQgICAgICAgICBkc3QuaCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDI1IDAwMDAwMDg4ICAgNDFCNkM0MDQgICAgICAgICBkc3QgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDI2IDAwMDAwMDhDICAgNDFCNkU0MDQgICAgICAgICBkc3QuZCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDI3IDAwMDAwMDkwICAgNDFCNjk0MDAgICAgICAgICBkc3QuYiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDk0ICAgRTAwMDAwMDAgCi0gICAgICAgMjggMDAwMDAwOTggICA0MUI2QjQwMCAgICAgICAgIGRzdC5oICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwOUMgICBFMDAwMDAwMCAKLSAgICAgICAyOSAwMDAwMDBBMCAgIDQxQjZENDAwICAgICAgICAgZHN0ICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBBNCAgIEUwMDAwMDAwIAotICAgICAgIDMwIDAwMDAwMEE4ICAgNDFCNkY0MDAgICAgICAgICBkc3QuZCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEFDICAgRTAwMDAwMDAgCi0gICAgICAgMzEgMDAwMDAwQjAgICA0MUI0ODAwNCAgICAgICAgIGxkLmIgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMzIgMDAwMDAwQjQgICA0MUI0QTAwNCAgICAgICAgIGxkLmggICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMzMgMDAwMDAwQjggICA0MUI0QzAwNCAgICAgICAgIGxkICAgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMzQgMDAwMDAwQkMgICA0MUI0RTAwNCAgICAgICAgIGxkLmQgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMzUgMDAwMDAwQzAgICA0MTkyN0ZGMCAgICAgICAgIGxkLmIgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDM2IDAwMDAwMEM0ICAgNDE5MkZGRjAgICAgICAgICBsZC5oICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAzNyAwMDAwMDBDOCAgIDQxOTM3RkYwICAgICAgICAgbGQgICAgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgMzggMDAwMDAwQ0MgICA0MTkzRkZGMCAgICAgICAgIGxkLmQgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDM5IDAwMDAwMEQwICAgNDFCNDkwMDAgICAgICAgICBsZC5iICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEQ0ICAgRTAwMDAwMDAgCi0gICAgICAgNDAgMDAwMDAwRDggICA0MUI0QjAwMCAgICAgICAgIGxkLmggICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICAgICAwMDAwMDBEQyAgIEUwMDAwMDAwIAotICAgICAgIDQxIDAwMDAwMEUwICAgNDFCNEQwMDAgICAgICAgICBsZCAgICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEU0ICAgRTAwMDAwMDAgCi0gICAgICAgNDIgMDAwMDAwRTggICA0MUI0RjAwMCAgICAgICAgIGxkLmQgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRUMgICBFMDAwMDAwMCAKLSAgICAgICA0MyAwMDAwMDBGMCAgIDQxQjU4MDA0ICAgICAgICAgbGQudWIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA0NCAwMDAwMDBGNCAgIDQxQjVBMDA0ICAgICAgICAgbGQudWggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA0NSAwMDAwMDBGOCAgIDQxOTY3RkYwICAgICAgICAgbGQudWIgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNDYgMDAwMDAwRkMgICA0MTk2RkZGMCAgICAgICAgIGxkLnVoICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDQ3IDAwMDAwMTAwICAgNDFCNTkwMDAgICAgICAgICBsZC51YiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTA0ICAgRTAwMDAwMDAgCi0gICAgICAgNDggMDAwMDAxMDggICA0MUI1QjAwMCAgICAgICAgIGxkLnVoICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxMEMgICBFMDAwMDAwMCAKLSAgICAgICA0OSAwMDAwMDExMCAgIDQxQjY4MDA0ICAgICAgICAgc3QuYiAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA1MCAwMDAwMDExNCAgIDQxQjZBMDA0ICAgICAgICAgc3QuaCAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA1MSAwMDAwMDExOCAgIDQxQjZDMDA0ICAgICAgICAgc3QgICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA1MiAwMDAwMDExQyAgIDQxQjZFMDA0ICAgICAgICAgc3QuZCAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA1MyAwMDAwMDEyMCAgIDQxOUE3RjAwICAgICAgICAgc3QuYiAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNTQgMDAwMDAxMjQgICA0MTlBRkYwMCAgICAgICAgIHN0LmggICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDU1IDAwMDAwMTI4ICAgNDE5QjdGMDAgICAgICAgICBzdCAgICAgIC0yNTYocjY6bSkscjggICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICA1NiAwMDAwMDEyQyAgIDQxOUJGRjAwICAgICAgICAgc3QuZCAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNTcgMDAwMDAxMzAgICA0MUI2OTAwMCAgICAgICAgIHN0LmIgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxMzQgICBFMDAwMDAwMCAKLSAgICAgICA1OCAwMDAwMDEzOCAgIDQxQjZCMDAwICAgICAgICAgc3QuaCAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDEzQyAgIEUwMDAwMDAwIAotICAgICAgIDU5IDAwMDAwMTQwICAgNDFCNkQwMDAgICAgICAgICBzdCAgICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTQ0ICAgRTAwMDAwMDAgCi0gICAgICAgNjAgMDAwMDAxNDggICA0MUI2RjAwMCAgICAgICAgIHN0LmQgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxNEMgICBFMDAwMDAwMCAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzU1YjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotCWRjYWNoZWMJcjgocjEwOm0pCQk7IFJlZ2lzdGVyIGZvcm0gKG1vZGlmaWVkKQotCWRjYWNoZWMJNChyMTA6bSkJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWMJLTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVjCTB4MTIzNDU2NzgocjEwOm0pCTsgTG9uZyBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlYwkweERFQURCRUVGKHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWYJcjgocjEwOm0pCQk7IFJlZ2lzdGVyIGZvcm0gKG1vZGlmaWVkKQotCWRjYWNoZWYJNChyMTA6bSkJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWYJLTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVmCTB4MTIzNDU2NzgocjEwOm0pCTsgTG9uZyBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlZgkweERFQURCRUVGKHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRsZC5iCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuaAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZC5kCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JZGxkLnViCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51YgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZC51aAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRzdC5iCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuaAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0CXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRzdAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRzdC5kCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuaAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmIJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQuaAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC5kCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCWxkLmIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlsZC5oCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlsZC5kCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQudWIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnVoCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC51YgktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC51aAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC51YgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkLnVoCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0Jc3QuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuaAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmIJLTI1NihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCXN0LmgJLTI1NihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCXN0CS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdC5kCS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0Jc3QuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0CTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0Jc3QuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmEzMDEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzIHdpdGggOnMgbW9kaWZpZXIKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTA0IDBjIGI0IDQxLioKLSAgIDQ6CTA0IDJjIGI0IDQxLioKLSAgIDg6CTA0IDRjIGI0IDQxLioKLSAgIGM6CTA0IDZjIGI0IDQxLioKLSAgMTA6CTA0IDBjIGI1IDQxLioKLSAgMTQ6CTA0IDJjIGI1IDQxLioKLSAgMTg6CTA0IDBjIGI2IDQxLioKLSAgMWM6CTA0IDJjIGI2IDQxLioKLSAgMjA6CTA0IDRjIGI2IDQxLioKLSAgMjQ6CTA0IDZjIGI2IDQxLioKLSAgMjg6CTA0IDA4IGI0IDQxLioKLSAgMmM6CTA0IDI4IGI0IDQxLioKLSAgMzA6CTA0IDQ4IGI0IDQxLioKLSAgMzQ6CTA0IDY4IGI0IDQxLioKLSAgMzg6CTA0IDA4IGI1IDQxLioKLSAgM2M6CTA0IDI4IGI1IDQxLioKLSAgNDA6CTA0IDA4IGI2IDQxLioKLSAgNDQ6CTA0IDI4IGI2IDQxLioKLSAgNDg6CTA0IDQ4IGI2IDQxLioKLSAgNGM6CTA0IDY4IGI2IDQxLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTgwM2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFdlZCBGZWIgMjYgMTQ6MzI6MTkgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxIDAwMDAwMDAwICAgNDFCNDBDMDQgICAgICAgICBkbGQuYiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAyIDAwMDAwMDA0ICAgNDFCNDJDMDQgICAgICAgICBkbGQuaCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAzIDAwMDAwMDA4ICAgNDFCNDRDMDQgICAgICAgICBkbGQgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA0IDAwMDAwMDBDICAgNDFCNDZDMDQgICAgICAgICBkbGQuZCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA1IDAwMDAwMDEwICAgNDFCNTBDMDQgICAgICAgICBkbGQudWIgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA2IDAwMDAwMDE0ICAgNDFCNTJDMDQgICAgICAgICBkbGQudWggIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA3IDAwMDAwMDE4ICAgNDFCNjBDMDQgICAgICAgICBkc3QuYiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA4IDAwMDAwMDFDICAgNDFCNjJDMDQgICAgICAgICBkc3QuaCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA5IDAwMDAwMDIwICAgNDFCNjRDMDQgICAgICAgICBkc3QgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEwIDAwMDAwMDI0ICAgNDFCNjZDMDQgICAgICAgICBkc3QuZCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDExIDAwMDAwMDI4ICAgNDFCNDA4MDQgICAgICAgICBsZC5iICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEyIDAwMDAwMDJDICAgNDFCNDI4MDQgICAgICAgICBsZC5oICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEzIDAwMDAwMDMwICAgNDFCNDQ4MDQgICAgICAgICBsZCAgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE0IDAwMDAwMDM0ICAgNDFCNDY4MDQgICAgICAgICBsZC5kICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE1IDAwMDAwMDM4ICAgNDFCNTA4MDQgICAgICAgICBsZC51YiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE2IDAwMDAwMDNDICAgNDFCNTI4MDQgICAgICAgICBsZC51aCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE3IDAwMDAwMDQwICAgNDFCNjA4MDQgICAgICAgICBzdC5iICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE4IDAwMDAwMDQ0ICAgNDFCNjI4MDQgICAgICAgICBzdC5oICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE5IDAwMDAwMDQ4ICAgNDFCNjQ4MDQgICAgICAgICBzdCAgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIwIDAwMDAwMDRDICAgNDFCNjY4MDQgICAgICAgICBzdC5kICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkODdkNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JZGxkLmIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5oCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5kCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51aAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5oCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5kCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5oCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnVoCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5oCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjA3YzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgcmVnaXN0ZXIgb3BlcmFuZHMgd2l0aCBib3RoIDptIGFuZCA6cyBtb2RpZmllcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDQgOGMgYjQgNDEuKgotICAgNDoJMDQgYWMgYjQgNDEuKgotICAgODoJMDQgY2MgYjQgNDEuKgotICAgYzoJMDQgZWMgYjQgNDEuKgotICAxMDoJMDQgOGMgYjUgNDEuKgotICAxNDoJMDQgYWMgYjUgNDEuKgotICAxODoJMDQgOGMgYjYgNDEuKgotICAxYzoJMDQgYWMgYjYgNDEuKgotICAyMDoJMDQgY2MgYjYgNDEuKgotICAyNDoJMDQgZWMgYjYgNDEuKgotICAyODoJMDQgODggYjQgNDEuKgotICAyYzoJMDQgYTggYjQgNDEuKgotICAzMDoJMDQgYzggYjQgNDEuKgotICAzNDoJMDQgZTggYjQgNDEuKgotICAzODoJMDQgODggYjUgNDEuKgotICAzYzoJMDQgYTggYjUgNDEuKgotICA0MDoJMDQgODggYjYgNDEuKgotICA0NDoJMDQgYTggYjYgNDEuKgotICA0ODoJMDQgYzggYjYgNDEuKgotICA0YzoJMDQgZTggYjYgNDEuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmM2M5YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoyNSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wczQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgMDAwMDAwMDAgICA0MUI0OEMwNCAgICAgICAgIGRsZC5iICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDIgMDAwMDAwMDQgICA0MUI0QUMwNCAgICAgICAgIGRsZC5oICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDMgMDAwMDAwMDggICA0MUI0Q0MwNCAgICAgICAgIGRsZCAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDQgMDAwMDAwMEMgICA0MUI0RUMwNCAgICAgICAgIGRsZC5kICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDUgMDAwMDAwMTAgICA0MUI1OEMwNCAgICAgICAgIGRsZC51YiAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDYgMDAwMDAwMTQgICA0MUI1QUMwNCAgICAgICAgIGRsZC51aCAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDcgMDAwMDAwMTggICA0MUI2OEMwNCAgICAgICAgIGRzdC5iICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDggMDAwMDAwMUMgICA0MUI2QUMwNCAgICAgICAgIGRzdC5oICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDkgMDAwMDAwMjAgICA0MUI2Q0MwNCAgICAgICAgIGRzdCAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTAgMDAwMDAwMjQgICA0MUI2RUMwNCAgICAgICAgIGRzdC5kICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTEgMDAwMDAwMjggICA0MUI0ODgwNCAgICAgICAgIGxkLmIgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTIgMDAwMDAwMkMgICA0MUI0QTgwNCAgICAgICAgIGxkLmggICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTMgMDAwMDAwMzAgICA0MUI0QzgwNCAgICAgICAgIGxkICAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTQgMDAwMDAwMzQgICA0MUI0RTgwNCAgICAgICAgIGxkLmQgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTUgMDAwMDAwMzggICA0MUI1ODgwNCAgICAgICAgIGxkLnViICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTYgMDAwMDAwM0MgICA0MUI1QTgwNCAgICAgICAgIGxkLnVoICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTcgMDAwMDAwNDAgICA0MUI2ODgwNCAgICAgICAgIHN0LmIgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTggMDAwMDAwNDQgICA0MUI2QTgwNCAgICAgICAgIHN0LmggICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTkgMDAwMDAwNDggICA0MUI2QzgwNCAgICAgICAgIHN0ICAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMjAgMDAwMDAwNEMgICA0MUI2RTgwNCAgICAgICAgIHN0LmQgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE3N2U5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQlkbGQuYglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLnViCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51aAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuYglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuYglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5oCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuYglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5oCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0CXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZjA0YjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotZXh0ZXJuIGludCB4ZnVuYyAoaW50IHkpOwotCi1zdGF0aWMgaW50IHNmdW5jIChpbnQgeSkKLXsKLSAgeGZ1bmMgKHkpOwotfQotCi1pbnQgZ2Z1bmMgKGludCB5KQotewotICBzZnVuYyAoeSk7Ci19Ci0KLWludCBicmFuY2hlcyAoaW50IHkpCi17Ci0gIGludCB6OwotCi0gIGZvciAoeiA9IHk7IHogPCB5ICsgMTA7IHorKykKLSAgICB7Ci0gICAgICBpZiAoeiAmIDB4MSkKLQl7Ci0JICBnZnVuYyAoeik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHhmdW5jICh6KTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGNhNmM5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIGdsb2JhbC9sb2NhbCBmdW5jcyAmIGJyYW5jaGVzIChjb2RlKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8X3NmdW5jPjoKLSAgIDA6CWYwIGZmIDZjIDA4LioKLSAgIDQ6CTBjIDAwIDU5IGY4LioKLSAgIDg6CTAwIDAwIDU5IDEwLioKLSAgIGM6CTAwIDkwIDM4IGY4IDAwIDAwIDAwIDAwLioKLSAgMTQ6CTAwIDAwIDUxIDEwLioKLSAgMTg6CTBjIDAwIDUxIGY4LioKLSAgMWM6CTFmIDgwIDM4IDAwLioKLSAgMjA6CTEwIDgwIDZjIDA4LioKLQotMDAwMDAwMjQgPF9nZnVuYz46Ci0gIDI0OglmMCBmZiA2YyAwOC4qCi0gIDI4OgkwYyAwMCA1OSBmOC4qCi0gIDJjOgkwMCAwMCA1OSAxMC4qCi0gIDMwOgkwMCA5MCAzOCBmOCAwMCAwMCAwMCAwMC4qCi0gIDM4OgkwMCAwMCA1MSAxMC4qCi0gIDNjOgkwYyAwMCA1MSBmOC4qCi0gIDQwOgkxZiA4MCAzOCAwMC4qCi0gIDQ0OgkxMCA4MCA2YyAwOC4qCi0KLTAwMDAwMDQ4IDxfYnJhbmNoZXM+OgotICA0ODoJZjAgZmYgNmMgMDguKgotICA0YzoJMGMgMDAgNTkgZjguKgotICA1MDoJMDAgMDAgNTkgMTAuKgotICA1NDoJMDAgMDAgNTEgMTAuKgotICA1ODoJMDQgMDAgNTkgMTAuKgotICA1YzoJMDAgMDAgNTEgMTAuKgotICA2MDoJMDQgMDAgNTEgMTguKgotICA2NDoJMGEgODAgYWMgMTAuKgotICA2ODoJMDMgMDAgYmEgMTAuKgotICA2YzoJMTIgODAgYTUgMzAuKgotICA3MDoJMDQgMDAgNTEgMTAuKgotICA3NDoJMDUgODAgYTQgZjguKgotICA3ODoJMDAgOTAgMzggZjggMjQgMDAgMDAgMDAuKgotICA4MDoJMDQgMDAgNTEgMTAuKgotICA4NDoJMDQgODAgMjQgMDAuKgotICA4ODoJMDAgOTAgMzggZjggMDAgMDAgMDAgMDAuKgotICA5MDoJMDQgMDAgNTEgMTAuKgotICA5NDoJMDQgMDAgNTEgMTAuKgotICA5ODoJMDEgODAgYWMgMTAuKgotICA5YzoJMDQgMDAgNTkgMTAuKgotICBhMDoJMDAgMDAgNTEgMTguKgotICBhNDoJMDQgMDAgNTEgMTAuKgotICBhODoJMGEgODAgZWMgMTguKgotICBhYzoJMDIgMDAgZmEgMTAuKgotICBiMDoJZjAgZmYgYTUgMzguKgotICBiNDoJMGMgMDAgNTEgZjguKgotICBiODoJMWYgODAgMzggMDAuKgotICBiYzoJMTAgODAgNmMgMDguKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhZWIxYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU2F0IEZlYiAyMiAxMzoxOToyOCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlbG9jczEucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIGlzIHRoZSBoYW5kIGhhY2tlZCBvdXRwdXQgb2YgdGhlIFRJIEMgY29tcGlsZXIgZm9yIGEgc2ltcGxlCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7OyB0ZXN0IHByb2dyYW0gdGhhdCBjb250YWlucyBsb2NhbC9nbG9iYWwgZnVuY3Rpb25zLCBsb2NhbC9nbG9iYWwKLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7IGZ1bmN0aW9uIGNhbGxzLCBhbmQgYW4gImlmIiBhbmQgImZvciIgc3RhdGVtZW50LgotICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX3hmdW5jCi0gICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNyAwMDAwMDAwMCAgICAgICAgICAgIF9zZnVuYzoKLSAgICAgICAgOCAwMDAwMDAwMCAgIDA4NkNGRkYwICAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAgOSAwMDAwMDAwNCAgIEY4NTkwMDBDICAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMTAgMDAwMDAwMDggICAxMDU5MDAwMCAgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAxMSAwMDAwMDAwQyAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDEwICAgMDAwMDAwMDAgCi0gICAgICAgMTIgMDAwMDAwMTQgICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAxMyAwMDAwMDAxOCAgIEY4NTEwMDBDICAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMTQgMDAwMDAwMUMgICAwMDM4ODAxRiAgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgIDE1IDAwMDAwMDIwICAgMDg2QzgwMTAgICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0gICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ2Z1bmMKLSAgICAgICAxOCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDE5IDAwMDAwMDI0ICAgICAgICAgICAgX2dmdW5jOgotICAgICAgIDIwIDAwMDAwMDI0ICAgMDg2Q0ZGRjAgICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgIDIxIDAwMDAwMDI4ICAgRjg1OTAwMEMgICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAyMiAwMDAwMDAyQyAgIDEwNTkwMDAwICAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgIDIzIDAwMDAwMDMwICAgRjgzODkwMDAgICAgICAgICAganNyICAgICAgIF9zZnVuYyhyMCkscjMxCi0gICAgICAgICAgMDAwMDAwMzQgICAwMDAwMDAwMCAKLSAgICAgICAyNCAwMDAwMDAzOCAgIDEwNTEwMDAwICAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgIDI1IDAwMDAwMDNDICAgRjg1MTAwMEMgICAgICAgICAgbGQgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAyNiAwMDAwMDA0MCAgIDAwMzg4MDFGICAgICAgICAgIGpzciAgICAgICByMzEocjApLHIwCi0gICAgICAgMjcgMDAwMDAwNDQgICAwODZDODAxMCAgICAgICAgICBhZGR1ICAgICAgMTYscjEscjEKLSAgICAgICAyOCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDI5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2JyYW5jaGVzCi0gICAgICAgMzEgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAzMiAwMDAwMDA0OCAgICAgICAgICAgIF9icmFuY2hlczoKLSAgICAgICAzMyAwMDAwMDA0OCAgIDA4NkNGRkYwICAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAzNCAwMDAwMDA0QyAgIEY4NTkwMDBDICAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMzUgMDAwMDAwNTAgICAxMDU5MDAwMCAgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAzNiAwMDAwMDA1NCAgIDEwNTEwMDAwICAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgIDM3IDAwMDAwMDU4ICAgMTA1OTAwMDQgICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCi0gICAgICAgMzggMDAwMDAwNUMgICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAzOSAwMDAwMDA2MCAgIDE4NTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMwotICAgICAgIDQwIDAwMDAwMDY0ICAgMTBBQzgwMEEgICAgICAgICAgYWRkdSAgICAgIDEwLHIyLHIyCi0gICAgICAgNDEgMDAwMDAwNjggICAxMEJBMDAwMyAgICAgICAgICBjbXAgICAgICAgcjMscjIscjIKLSAgICAgICA0MiAwMDAwMDA2QyAgIDMwQTU4MDEyICAgICAgICAgIGJiby5hICAgICBMMTIscjIsZ2UudwotICAgICAgIDQzIDAwMDAwMDcwICAgICAgICAgICAgTDg6Ci0gICAgICAgNDQgMDAwMDAwNzAgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICA0NSAwMDAwMDA3NCAgIEY4QTQ4MDA1ICAgICAgICAgIGJiei5hICAgICBMMTAscjIsMAotICAgICAgIDQ2IDAwMDAwMDc4ICAgRjgzODkwMDAgICAgICAgICAganNyICAgICAgIF9nZnVuYyhyMCkscjMxCi0gICAgICAgICAgMDAwMDAwN0MgICAwMDAwMDAyNCAKLSAgICAgICA0NyAwMDAwMDA4MCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgIDQ4IDAwMDAwMDg0ICAgMDAyNDgwMDQgICAgICAgICAgYnIuYSAgICAgIEwxMQotICAgICAgIDQ5IDAwMDAwMDg4ICAgICAgICAgICAgTDEwOgotICAgICAgIDUwIDAwMDAwMDg4ICAgRjgzODkwMDAgICAgICAgICAganNyICAgICAgIF94ZnVuYyhyMCkscjMxCi0gICAgICAgICAgMDAwMDAwOEMgICAwMDAwMDAwMCAKLSAgICAgICA1MSAwMDAwMDA5MCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU2F0IEZlYiAyMiAxMzoxOToyOCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlbG9jczEucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgNTIgMDAwMDAwOTQgICAgICAgICAgICBMMTE6Ci0gICAgICAgNTMgMDAwMDAwOTQgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICA1NCAwMDAwMDA5OCAgIDEwQUM4MDAxICAgICAgICAgIGFkZHUgICAgICAxLHIyLHIyCi0gICAgICAgNTUgMDAwMDAwOUMgICAxMDU5MDAwNCAgICAgICAgICBzdCAgICAgICAgNChyMSkscjIKLSAgICAgICA1NiAwMDAwMDBBMCAgIDE4NTEwMDAwICAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMwotICAgICAgIDU3IDAwMDAwMEE0ICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgNTggMDAwMDAwQTggICAxOEVDODAwQSAgICAgICAgICBhZGR1ICAgICAgMTAscjMscjMKLSAgICAgICA1OSAwMDAwMDBBQyAgIDEwRkEwMDAyICAgICAgICAgIGNtcCAgICAgICByMixyMyxyMgotICAgICAgIDYwIDAwMDAwMEIwICAgMzhBNUZGRjAgICAgICAgICAgYmJvLmEgICAgIEw4LHIyLGx0LncKLSAgICAgICA2MSAwMDAwMDBCNCAgICAgICAgICAgIEwxMjoKLSAgICAgICA2MiAwMDAwMDBCNCAgIEY4NTEwMDBDICAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgNjMgMDAwMDAwQjggICAwMDM4ODAxRiAgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgIDY0IDAwMDAwMEJDICAgMDg2QzgwMTAgICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDllMzk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKLTs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGxvY2FsL2dsb2JhbCBmdW5jdGlvbnMsIGxvY2FsL2dsb2JhbAotOzsgZnVuY3Rpb24gY2FsbHMsIGFuZCBhbiAiaWYiIGFuZCAiZm9yIiBzdGF0ZW1lbnQuCi0KLQkuZmlsZQkgICAicmVsb2NzMS5zIgotCi0JLmdsb2JhbAlfeGZ1bmMKLQotX3NmdW5jOgotICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgICAganNyICAgICAgIF94ZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0KLQkuZ2xvYmFsCV9nZnVuYwotCi1fZ2Z1bmM6Ci0gICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCi0gICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQotICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCi0gICAgICAgICBqc3IgICAgICAgX3NmdW5jKHIwKSxyMzEKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgICAgbGQgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIGpzciAgICAgICByMzEocjApLHIwCi0gICAgICAgICBhZGR1ICAgICAgMTYscjEscjEKLQotCi0JLmdsb2JhbAlfYnJhbmNoZXMKLQotX2JyYW5jaGVzOgotICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgICBzdCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgICAgbGQgICAgICAgIDQocjEpLHIzCi0gICAgICAgICBhZGR1ICAgICAgMTAscjIscjIKLSAgICAgICAgIGNtcCAgICAgICByMyxyMixyMgotICAgICAgICAgYmJvLmEgICAgIEwxMixyMixnZS53Ci1MODoKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgICAgYmJ6LmEgICAgIEwxMCxyMiwwCi0gICAgICAgICBqc3IgICAgICAgX2dmdW5jKHIwKSxyMzEKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgICAgYnIuYSAgICAgIEwxMQotTDEwOgotICAgICAgICAganNyICAgICAgIF94ZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLUwxMToKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgICAgYWRkdSAgICAgIDEscjIscjIKLSAgICAgICAgIHN0ICAgICAgICA0KHIxKSxyMgotICAgICAgICAgbGQgICAgICAgIDAocjEpLHIzCi0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGFkZHUgICAgICAxMCxyMyxyMwotICAgICAgICAgY21wICAgICAgIHIyLHIzLHIyCi0gICAgICAgICBiYm8uYSAgICAgTDgscjIsbHQudwotTDEyOgotICAgICAgICAgbGQgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIGpzciAgICAgICByMzEocjApLHIwCi0gICAgICAgICBhZGR1ICAgICAgMTYscjEscjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczFiLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWIzMTYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczFiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNzb3VyY2U6IHJlbG9jczEucwotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIGdsb2JhbC9sb2NhbCBmdW5jcyAmIGJyYW5jaGVzIChyZWxvY3MpCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCi0wMDAwMDAxMCAzMiAgICAgICAgICAgICAgICBfeGZ1bmMKLTAwMDAwMDM0IDMyICAgICAgICAgICAgICAgIC50ZXh0Ci0wMDAwMDA3YyAzMiAgICAgICAgICAgICAgICAudGV4dAotMDAwMDAwOGMgMzIgICAgICAgICAgICAgICAgX3hmdW5jCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMTEyMGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotZXh0ZXJuIGNoYXIgeF9jaGFyOwotZXh0ZXJuIHNob3J0IHhfc2hvcnQ7Ci1zdGF0aWMgaW50IHhfaW50OwotZXh0ZXJuIGxvbmcgeF9sb25nOwotZXh0ZXJuIGZsb2F0IHhfZmxvYXQ7Ci1leHRlcm4gZG91YmxlIHhfZG91YmxlOwotZXh0ZXJuIGNoYXIgKnhfY2hhcl9wOwotCi1zdGF0aWMgY2hhciBzX2NoYXI7Ci1zdGF0aWMgc2hvcnQgc19zaG9ydDsKLXN0YXRpYyBpbnQgc19pbnQ7Ci1zdGF0aWMgbG9uZyBzX2xvbmc7Ci1zdGF0aWMgZmxvYXQgc19mbG9hdDsKLXN0YXRpYyBkb3VibGUgc19kb3VibGU7Ci1zdGF0aWMgY2hhciAqc19jaGFyX3A7Ci0KLWNoYXIgZ19jaGFyOwotc2hvcnQgZ19zaG9ydDsKLWludCBnX2ludDsKLWxvbmcgZ19sb25nOwotZmxvYXQgZ19mbG9hdDsKLWRvdWJsZSBnX2RvdWJsZTsKLWNoYXIgKmdfY2hhcl9wOwotCi1tYWluICgpCi17Ci0gIHhfY2hhciA9IHNfY2hhcjsKLSAgZ19jaGFyID0geF9jaGFyOwotICB4X3Nob3J0ID0gc19zaG9ydDsKLSAgZ19zaG9ydCA9IHhfc2hvcnQ7Ci0gIHhfaW50ID0gc19pbnQ7Ci0gIGdfaW50ID0geF9pbnQ7Ci0gIHhfbG9uZyA9IHNfbG9uZzsKLSAgZ19sb25nID0geF9sb25nOwotICB4X2Zsb2F0ID0gc19mbG9hdDsKLSAgZ19mbG9hdCA9IHhfZmxvYXQ7Ci0gIHhfZG91YmxlID0gc19kb3VibGU7Ci0gIGdfZG91YmxlID0geF9kb3VibGU7Ci0gIHhfY2hhcl9wID0gc19jaGFyX3A7Ci0gIGdfY2hhcl9wID0geF9jaGFyX3A7Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmM2U4N2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgc2ltcGxlIHJlbG9jcywgc3RhdGljIGFuZCBnbG9iYWwgdmFyaWFibGVzIChjb2RlKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8X21haW4+OgotICAgMDoJMDAgMTAgMzQgMTAgMjQgMDIgMDAgMDAuKgotICAgODoJMDAgMTAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICAxMDoJMDAgMTAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICAxODoJMDAgMTAgMzYgMTAgMDQgMDIgMDAgMDAuKgotICAyMDoJMDAgMzAgMzQgMTAgMjQgMDMgMDAgMDAuKgotICAyODoJMDAgMzAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICAzMDoJMDAgMzAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICAzODoJMDAgMzAgMzYgMTAgMDQgMDMgMDAgMDAuKgotICA0MDoJMDAgNTAgMzQgMTAgMzQgMDIgMDAgMDAuKgotICA0ODoJMDAgNTAgMzYgMTAgMzQgMDMgMDAgMDAuKgotICA1MDoJMDAgNTAgMzQgMTAgMzQgMDMgMDAgMDAuKgotICA1ODoJMDAgNTAgMzYgMTAgMTQgMDIgMDAgMDAuKgotICA2MDoJMDAgNTAgMzQgMTAgZjQgMDEgMDAgMDAuKgotICA2ODoJMDAgNTAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICA3MDoJMDAgNTAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICA3ODoJMDAgNTAgMzYgMTAgZjQgMDAgMDAgMDAuKgotICA4MDoJMDAgNTAgMzQgMTAgZjQgMDIgMDAgMDAuKgotICA4ODoJMDAgNTAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICA5MDoJMDAgNTAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICA5ODoJMDAgNTAgMzYgMTAgMTQgMDMgMDAgMDAuKgotICBhMDoJMDAgNzAgMzQgMTAgZTQgMDEgMDAgMDAuKgotICBhODoJMDAgNzAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICBiMDoJMDAgNzAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICBiODoJMDAgNzAgMzYgMTAgZTQgMDIgMDAgMDAuKgotICBjMDoJMDAgNTAgMzQgMTAgNDQgMDMgMDAgMDAuKgotICBjODoJMDAgNTAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICBkMDoJMDAgNTAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICBkODoJMDAgNTAgMzYgMTAgZTQgMDAgMDAgMDAuKgotICBlMDoJMWYgYTAgMzggMDAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5MGE4Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFN1biBGZWIgMjMgMTI6MTY6MzIgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MyLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUgaGFuZCBoYWNrZWQgb3V0cHV0IG9mIHRoZSBUSSBDIGNvbXBpbGVyIGZvciBhIHNpbXBsZQotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgdGVzdCBwcm9ncmFtIHRoYXQgY29udGFpbnMgc3RhdGljLCBnbG9iYWwsIGFuZCBleHRlcm4gZGF0YSB2YXJpYWJsZXMuCi0gICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbGUgICAicmVsb2NzMi5zIgotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2NoYXIKLSAgICAgICAgNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9zaG9ydAotICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2xvbmcKLSAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9mbG9hdAotICAgICAgICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2RvdWJsZQotICAgICAgIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2NoYXJfcAotICAgICAgIDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXIKLSAgICAgICAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19zaG9ydAotICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2ludAotICAgICAgIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2xvbmcKLSAgICAgICAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19mbG9hdAotICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2RvdWJsZQotICAgICAgIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXJfcAotICAgICAgIDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9tYWluCi0gICAgICAgMTkgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyMCAwMDAwMDAwMCAgICAgICAgICAgIF9tYWluOgotICAgICAgIDIxIDAwMDAwMDAwICAgMTAzNDEwMDAgICAgICAgICAgbGQuYiAgICAgIF9zX2NoYXIrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAwNCAgIDAwMDAwMDFDIAotICAgICAgIDIyIDAwMDAwMDA4ICAgMTAzNjEwMDAgICAgICAgICAgc3QuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAwQyAgIDAwMDAwMDAwIAotICAgICAgIDIzIDAwMDAwMDEwICAgMTAzNDEwMDAgICAgICAgICAgbGQuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAxNCAgIDAwMDAwMDAwIAotICAgICAgIDI0IDAwMDAwMDE4ICAgMTAzNjEwMDAgICAgICAgICAgc3QuYiAgICAgIF9nX2NoYXIrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAxQyAgIDAwMDAwMDE0IAotICAgICAgIDI1IDAwMDAwMDIwICAgMTAzNDMwMDAgICAgICAgICAgbGQuaCAgICAgIF9zX3Nob3J0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMjQgICAwMDAwMDAzQyAKLSAgICAgICAyNiAwMDAwMDAyOCAgIDEwMzYzMDAwICAgICAgICAgIHN0LmggICAgICBfeF9zaG9ydCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDJDICAgMDAwMDAwMDAgCi0gICAgICAgMjcgMDAwMDAwMzAgICAxMDM0MzAwMCAgICAgICAgICBsZC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAzNCAgIDAwMDAwMDAwIAotICAgICAgIDI4IDAwMDAwMDM4ICAgMTAzNjMwMDAgICAgICAgICAgc3QuaCAgICAgIF9nX3Nob3J0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwM0MgICAwMDAwMDAzNCAKLSAgICAgICAyOSAwMDAwMDA0MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19pbnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA0NCAgIDAwMDAwMDIwIAotICAgICAgIDMwIDAwMDAwMDQ4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF94X2ludCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDRDICAgMDAwMDAwNDAgCi0gICAgICAgMzEgMDAwMDAwNTAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3hfaW50KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNTQgICAwMDAwMDA0MCAKLSAgICAgICAzMiAwMDAwMDA1OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfZ19pbnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA1QyAgIDAwMDAwMDE4IAotICAgICAgIDMzIDAwMDAwMDYwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2xvbmcrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA2NCAgIDAwMDAwMDEwIAotICAgICAgIDM0IDAwMDAwMDY4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA2QyAgIDAwMDAwMDAwIAotICAgICAgIDM1IDAwMDAwMDcwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA3NCAgIDAwMDAwMDAwIAotICAgICAgIDM2IDAwMDAwMDc4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2xvbmcrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA3QyAgIDAwMDAwMDA0IAotICAgICAgIDM3IDAwMDAwMDgwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwODQgICAwMDAwMDAzMCAKLSAgICAgICAzOCAwMDAwMDA4OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU3VuIEZlYiAyMyAxMjoxNjozMiAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlbG9jczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgICAgMDAwMDAwOEMgICAwMDAwMDAwMCAKLSAgICAgICAzOSAwMDAwMDA5MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDk0ICAgMDAwMDAwMDAgCi0gICAgICAgNDAgMDAwMDAwOTggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfZmxvYXQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA5QyAgIDAwMDAwMDM4IAotICAgICAgIDQxIDAwMDAwMEEwICAgMTAzNDcwMDAgICAgICAgICAgbGQuZCAgICAgIF9zX2RvdWJsZSswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEE0ICAgMDAwMDAwMDggCi0gICAgICAgNDIgMDAwMDAwQTggICAxMDM2NzAwMCAgICAgICAgICBzdC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQUMgICAwMDAwMDAwMCAKLSAgICAgICA0MyAwMDAwMDBCMCAgIDEwMzQ3MDAwICAgICAgICAgIGxkLmQgICAgICBfeF9kb3VibGUrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBCNCAgIDAwMDAwMDAwIAotICAgICAgIDQ0IDAwMDAwMEI4ICAgMTAzNjcwMDAgICAgICAgICAgc3QuZCAgICAgIF9nX2RvdWJsZSswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEJDICAgMDAwMDAwMjggCi0gICAgICAgNDUgMDAwMDAwQzAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3NfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQzQgICAwMDAwMDA0NCAKLSAgICAgICA0NiAwMDAwMDBDOCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBDQyAgIDAwMDAwMDAwIAotICAgICAgIDQ3IDAwMDAwMEQwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2NoYXJfcCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEQ0ICAgMDAwMDAwMDAgCi0gICAgICAgNDggMDAwMDAwRDggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwREMgICAwMDAwMDAwMCAKLSAgICAgICA0OSAwMDAwMDBFMCAgIDAwMzhBMDFGICAgICAgICAgIGpzci5hICAgICByMzEocjApLHIwCi0gICAgICAgNTAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICA1MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyX3AKLSAgICAgICA1MiAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19jaGFyX3AsNCw0Ci0gICAgICAgNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfbG9uZwotICAgICAgIDU0IDAwMDAwMDA0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2xvbmcsNCw0Ci0gICAgICAgNTUgMDAwMDAwMDggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfZG91YmxlLDgsOAotICAgICAgIDU2IDAwMDAwMDEwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2xvbmcsNCw0Ci0gICAgICAgNTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfY2hhcgotICAgICAgIDU4IDAwMDAwMDE0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2NoYXIsMSw0Ci0gICAgICAgNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfaW50Ci0gICAgICAgNjAgMDAwMDAwMTggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfaW50LDQsNAotICAgICAgIDYxIDAwMDAwMDFDICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2NoYXIsMSw0Ci0gICAgICAgNjIgMDAwMDAwMjAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfaW50LDQsNAotICAgICAgIDYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2RvdWJsZQotICAgICAgIDY0IDAwMDAwMDI4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2RvdWJsZSw4LDgKLSAgICAgICA2NSAwMDAwMDAzMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19mbG9hdCw0LDQKLSAgICAgICA2NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19zaG9ydAotICAgICAgIDY3IDAwMDAwMDM0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX3Nob3J0LDIsNAotICAgICAgIDY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2Zsb2F0Ci0gICAgICAgNjkgMDAwMDAwMzggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfZmxvYXQsNCw0Ci0gICAgICAgNzAgMDAwMDAwM0MgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3Nfc2hvcnQsMiw0Ci0gICAgICAgNzEgMDAwMDAwNDAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3hfaW50LDQsNAotICAgICAgIDcyIDAwMDAwMDQ0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2NoYXJfcCw0LDQKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjU3ZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotOzsgVGhpcyBpcyB0aGUgaGFuZCBoYWNrZWQgb3V0cHV0IG9mIHRoZSBUSSBDIGNvbXBpbGVyIGZvciBhIHNpbXBsZQotOzsgdGVzdCBwcm9ncmFtIHRoYXQgY29udGFpbnMgc3RhdGljLCBnbG9iYWwsIGFuZCBleHRlcm4gZGF0YSB2YXJpYWJsZXMuCi0KLQkuZmlsZQkicmVsb2NzMi5zIgotCS5nbG9iYWwJX3hfY2hhcgotCS5nbG9iYWwJX3hfc2hvcnQKLQkuZ2xvYmFsCV94X2xvbmcKLQkuZ2xvYmFsCV94X2Zsb2F0Ci0JLmdsb2JhbAlfeF9kb3VibGUKLQkuZ2xvYmFsCV94X2NoYXJfcAotCS5nbG9iYWwJX2dfY2hhcgotCS5nbG9iYWwJX2dfc2hvcnQKLQkuZ2xvYmFsCV9nX2ludAotCS5nbG9iYWwJX2dfbG9uZwotCS5nbG9iYWwJX2dfZmxvYXQKLQkuZ2xvYmFsCV9nX2RvdWJsZQotCS5nbG9iYWwJX2dfY2hhcl9wCi0JLmdsb2JhbAlfbWFpbgotCi1fbWFpbjoKLSAgICAgICAgIGxkLmIgICAgICBfc19jaGFyKzAocjApLHIyCi0gICAgICAgICBzdC5iICAgICAgX3hfY2hhciswKHIwKSxyMgotICAgICAgICAgbGQuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgIHN0LmIgICAgICBfZ19jaGFyKzAocjApLHIyCi0gICAgICAgICBsZC5oICAgICAgX3Nfc2hvcnQrMChyMCkscjIKLSAgICAgICAgIHN0LmggICAgICBfeF9zaG9ydCswKHIwKSxyMgotICAgICAgICAgbGQuaCAgICAgIF94X3Nob3J0KzAocjApLHIyCi0gICAgICAgICBzdC5oICAgICAgX2dfc2hvcnQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfc19pbnQrMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfeF9pbnQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9pbnQrMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfZ19pbnQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfc19sb25nKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfbG9uZyswKHIwKSxyMgotICAgICAgICAgbGQgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfZ19sb25nKzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfZmxvYXQrMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotICAgICAgICAgbGQgICAgICAgIF94X2Zsb2F0KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfZmxvYXQrMChyMCkscjIKLSAgICAgICAgIGxkLmQgICAgICBfc19kb3VibGUrMChyMCkscjIKLSAgICAgICAgIHN0LmQgICAgICBfeF9kb3VibGUrMChyMCkscjIKLSAgICAgICAgIGxkLmQgICAgICBfeF9kb3VibGUrMChyMCkscjIKLSAgICAgICAgIHN0LmQgICAgICBfZ19kb3VibGUrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfc19jaGFyX3ArMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfZ19jaGFyX3ArMChyMCkscjIKLSAgICAgICAgIGpzci5hICAgICByMzEocjApLHIwCi0KLQkuZ2xvYmFsCV9nX2NoYXJfcAotCS5ic3MJX2dfY2hhcl9wLDQsNAotCS5nbG9iYWwJX2dfbG9uZwotCS5ic3MJX2dfbG9uZyw0LDQKLQkuYnNzCV9zX2RvdWJsZSw4LDgKLQkuYnNzCV9zX2xvbmcsNCw0Ci0JLmdsb2JhbAlfZ19jaGFyCi0JLmJzcwlfZ19jaGFyLDEsNAotCS5nbG9iYWwJX2dfaW50Ci0JLmJzcwlfZ19pbnQsNCw0Ci0JLmJzcwlfc19jaGFyLDEsNAotCS5ic3MJX3NfaW50LDQsNAotCS5nbG9iYWwJX2dfZG91YmxlCi0JLmJzcwlfZ19kb3VibGUsOCw4Ci0JLmJzcwlfc19mbG9hdCw0LDQKLQkuZ2xvYmFsCV9nX3Nob3J0Ci0JLmJzcwlfZ19zaG9ydCwyLDQKLQkuZ2xvYmFsCV9nX2Zsb2F0Ci0JLmJzcwlfZ19mbG9hdCw0LDQKLQkuYnNzCV9zX3Nob3J0LDIsNAotCS5ic3MJX3hfaW50LDQsNAotCS5ic3MJX3NfY2hhcl9wLDQsNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMmIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczJiLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGY5OWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMmIuZAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI3NvdXJjZTogcmVsb2NzMi5zCi0jbmFtZTogVEljODAgc2ltcGxlIHJlbG9jcywgc3RhdGljIGFuZCBnbG9iYWwgdmFyaWFibGVzIChyZWxvY3MpCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCi0wMDAwMDAwNCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDAwYyAzMiAgICAgICAgICAgICAgICBfeF9jaGFyCi0wMDAwMDAxNCAzMiAgICAgICAgICAgICAgICBfeF9jaGFyCi0wMDAwMDAxYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDAyNCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDAyYyAzMiAgICAgICAgICAgICAgICBfeF9zaG9ydAotMDAwMDAwMzQgMzIgICAgICAgICAgICAgICAgX3hfc2hvcnQKLTAwMDAwMDNjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDQ0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDRjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDU0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDVjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDY0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDZjIDMyICAgICAgICAgICAgICAgIF94X2xvbmcKLTAwMDAwMDc0IDMyICAgICAgICAgICAgICAgIF94X2xvbmcKLTAwMDAwMDdjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDg0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDhjIDMyICAgICAgICAgICAgICAgIF94X2Zsb2F0Ci0wMDAwMDA5NCAzMiAgICAgICAgICAgICAgICBfeF9mbG9hdAotMDAwMDAwOWMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwYTQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwYWMgMzIgICAgICAgICAgICAgICAgX3hfZG91YmxlCi0wMDAwMDBiNCAzMiAgICAgICAgICAgICAgICBfeF9kb3VibGUKLTAwMDAwMGJjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGM0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGNjIDMyICAgICAgICAgICAgICAgIF94X2NoYXJfcAotMDAwMDAwZDQgMzIgICAgICAgICAgICAgICAgX3hfY2hhcl9wCi0wMDAwMDBkYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvdGljODAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvdGljODAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWM0NjMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgVEkgVE1TMzIwQzgwIHRlc3RzLgotIwotaWYgW2lzdGFyZ2V0IHRpYzgwKi0qLSpdIHRoZW4gewotCi0gICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wczIiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzMyIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWdvcHM0IgotICAgIHJ1bl9kdW1wX3Rlc3QgImNyZWdvcHMiCi0gICAgcnVuX2R1bXBfdGVzdCAiZmxvYXQiCi0gICAgcnVuX2R1bXBfdGVzdCAiZW5kbWFzayIKLSAgICBydW5fZHVtcF90ZXN0ICJiaXRudW0iCi0gICAgcnVuX2R1bXBfdGVzdCAiY2NvZGUiCi0gICAgcnVuX2R1bXBfdGVzdCAiYWRkIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczEiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMWIiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMiIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWxvY3MyYiIKLSAgICBydW5fZHVtcF90ZXN0ICJhbGlnbiIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYXJpdGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYXJpdGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMTQwZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2FyaXRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgYXJpdGhfb3Bjb2RlcwotYXJpdGhfb3Bjb2RlczoKLQlhZGQgcjUscjYKLQlhZGQgNSxyNgotCWFkZGkgNyxyNSxyNgotCWRpdmggcjUscjYKLQltdWxoIHI1LHI2Ci0JbXVsaCA1LHI2Ci0JbXVsaGkgNyxyNSxyNgotCXNhciByNSxyNgotCXNhciAzMSxyNgotCXNhdGFkZCByNSxyNgotCXNhdGFkZCA1LHI2Ci0Jc2F0c3ViIHI1LHI2Ci0Jc2F0c3ViaSA3LHI1LHI2Ci0Jc2F0c3ViciByNSxyNgotCXNobCByNSxyNgotCXNobCAzMSxyNgotCXNociByNSxyNgotCXNociAzMSxyNgotCXN1YiByNSxyNgotCXN1YnIgcjUscjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iYXNpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNmE2MzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19hcml0aCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhcml0aC5zOiBBcml0aG1ldGljIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhcml0aC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgIyAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNDg5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQzUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgNDUzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDQ1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEU1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEU1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEU1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBFNTM3QTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgQkYzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQzUzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgMjUzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQTUzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgNjUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIDg1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEU1MzdDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBERjMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYSBFNTM3ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgOUYzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgQTUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgODUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdC5zOiBiaXQgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEM2QUYxMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDNjZGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQzYyRjEwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEM2RUYxMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogYnJhbmNoIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2gucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA4RjA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGRUZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFNkZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBEN0ZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBDQkZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBCOUZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBBMUZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSA5M0ZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCA4MkZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGQUY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBFMEY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBEOEY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBDNEY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBCQ0Y1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBBMUY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSA5OUY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCA4MkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGQUVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBFNUVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBEREVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19jb21wYXJlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbXBhcmUuczogY29tcGFyZSBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29tcGFyZS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDY1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEUwMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFODJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRTEyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEUxMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBFOTJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRTkyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEUyMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBFQTJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTMyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEVCMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBFNDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRTQyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEVDMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBFQzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRTUyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEVEMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBFNjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRUUyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEU3MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBFRjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgNjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fanVtcHMge30gewotICAgIHNldCB0ZXN0bmFtZSAianVtcHMuczoganVtcHMgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImp1bXBzLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgODAyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDY1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEJGMDdGQUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNDUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQzUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IDI1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIDg1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSAyNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBBNTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09N10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAibWVtLnM6IG1lbW9yeSBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWVtLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDUzNzA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDI1MzcwNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyNTM3MDUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgNDAzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgNDAzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgNDAzNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgNDYyRjA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IDY2MkYwNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSA2NjJGMDUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgQzAzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgQzAzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgNDEzNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbWlzYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtaXNjLnM6IG1pc2Mgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1pc2MucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFMDA3NjAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTA4NzYwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEUwMDcyMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBFMDA3NDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRTAwNzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZGMDcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBFNzJGMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRTUzRjQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92ZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZlLnM6IG1vdmUgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiAwNTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faGlsbyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJoaWxvLnM6IGhpbG8gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJoaWxvLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjAwRUVGQkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDQxMEVBRURFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA0MTBFQURERVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1wcm9jIGRvX3NpbXBsZV9yZWxvY190ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyZWxvYy5zOiBUZXN0IGZvciBwcm9wZXIgcmVsb2NhdGlvbnMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicmVsb2MucyIgIiIgIlRlc3QgZm9yIHByb3BlciByZWxvY2F0aW9uIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDJcW15cblxdKlJfVjg1MF9MTzE2XFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAwNlxbXlxuXF0qUl9WODUwX0hJMTZfU1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMGFcW15cblxdKlJfVjg1MF9ISTE2XFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAwZVxbXlxuXF0qUl9WODUwX1pEQV8xNl8xNl9PRkZTRVRcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDEyXFteXG5cXSpSX1Y4NTBfVERBXzE2XzE2X09GRlNFVFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMTZcW15cblxdKlJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQl0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCB2ODUwKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgotICAgIGRvX2FyaXRoCi0gICAgZG9fYml0Ci0gICAgZG9fYnJhbmNoCi0gICAgZG9fY29tcGFyZQotICAgIGRvX2p1bXBzCi0gICAgZG9fbG9naWNhbAotICAgIGRvX21lbQotICAgIGRvX21pc2MKLSAgICBkb19tb3ZlCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBoYW5kbGUgbG8oKSBoaSgpIGFuZCBoaTAoKSBjb3JyZWN0bHkuCi0gICAgZG9faGlsbwotCi0gICAgIyBDaGVjayBmb3IgcHJvcGVyIHJlbG9jcyBvbiBsbywgaGksIGhpMCwgemRhb2ZmLCB0ZGFvZmYgYW5kIHNkYW9mZgotICAgICMgZXhwcmVzc2lvbnMKLSAgICBkb19zaW1wbGVfcmVsb2NfdGVzdHMKLQotICAgIGdhc190ZXN0ICJoaWxvMi5zIiAiIiAiIiAiaGkvbG8gcmVncmVzc2lvbiB0ZXN0IgotICAgIGdhc190ZXN0ICJmZXBzdy5zIiAiIiAiIiAiZXFzdyByZWdyZXNzaW9uIHRlc3QiCi0KLSAgICBnYXNfdGVzdF9lcnJvciAicmFuZ2UucyIgIi1td2Fybi1zaWduZWQtb3ZlcmZsb3ciICJDaGVjayBmb3IgcmFuZ2UgZXJyb3Igb24gYnl0ZSBsb2FkL3N0b3JlIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMWFjMDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iaXQucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGJpdAotYml0OgotCWNscjEgNSwxNltyNl0KLQlub3QxIDUsMTZbcjZdCi0Jc2V0MSA1LDE2W3I2XQotCXRzdDEgNSwxNltyNl0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWMxYjQyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgYmNjCi1iY2M6Ci0JYmd0IGJjYwotCWJnZSBiY2MKLQlibHQgYmNjCi0JYmxlIGJjYwotCWJoIGJjYwotCWJubCBiY2MKLQlibCBiY2MKLQlibmggYmNjCi0JYmUgYmNjCi0JYm5lIGJjYwotCWJ2IGJjYwotCWJudiBiY2MKLQlibiBiY2MKLQlicCBiY2MKLQliYyBiY2MKLQlibmMgYmNjCi0JYnogYmNjCi0JYm56IGJjYwotCWJyIGJjYwotCWJzYSBiY2MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9jb21wYXJlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MWM4YTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9jb21wYXJlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgY29tcGFyZQotY29tcGFyZToKLQljbXAgcjUscjYKLQljbXAgNSxyNgotCXNldGYgdixyNQotCXNldGYgbnYscjUKLQlzZXRmIGMscjUKLQlzZXRmIGwscjUKLQlzZXRmIG5jLHI1Ci0Jc2V0ZiBubCxyNQotCXNldGYgeixyNQotCXNldGYgbnoscjUKLQlzZXRmIG5oLHI1Ci0Jc2V0ZiBoLHI1Ci0Jc2V0ZiBzLHI1Ci0Jc2V0ZiBuLHI1Ci0Jc2V0ZiBucyxyNQotCXNldGYgcCxyNQotCXNldGYgdCxyNQotCXNldGYgc2EscjUKLQlzZXRmIGx0LHI1Ci0Jc2V0ZiBnZSxyNQotCXNldGYgbGUscjUKLQlzZXRmIGd0LHI1Ci0JdHN0IHI1LHI2Ci0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2ZlcHN3LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2ZlcHN3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDMzM2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JLnRleHQKLQlsZHNyIHIxNyxmZXBzdwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2N2U1Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8ucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCi0JLnRleHQKLQltb3ZlYSBsbygweGRlYWRiZWVmKSxyMCxyMQotCW1vdmhpIGhpKDB4ZGVhZGJlZWYpLHIxLHIxCi0JbW92aGkgaGkwKDB4ZGVhZGJlZWYpLHIxLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MWQ1OTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLnRleHQKLQkub3JnIDB4MTAwMDAKLQltb3ZlYSBoaShibGFoKSxyMCxyMQotYmxhaDoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvanVtcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvanVtcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczMTY0Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotCS50ZXh0Ci0JLmdsb2JhbCBqdW1wcwotanVtcHM6Ci0JamFybCBqdW1wcyxyNQotCWptcCBbcjVdCi0JanIganVtcHMKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDBiM2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbG9naWNhbHMKLWxvZ2ljYWxzOgotCWFuZCByNSxyNgotCWFuZGkgNyxyNSxyNgotCW5vdCByNSxyNgotCW9yIHI1LHI2Ci0Jb3JpIDcscjUscjYKLQl4b3IgcjUscjYKLQl4b3JpIDcscjUscjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzY5Y2VhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbWVtb3J5Ci1tZW1vcnk6Ci0JbGQuYiA1W3I1XSxyNgotCWxkLmggNFtyNV0scjYKLQlsZC53IDRbcjVdLHI2Ci0Jc2xkLmIgNjRbZXBdLHI2Ci0Jc2xkLmggMTI4W2VwXSxyNgotCXNsZC53IDEyOFtlcF0scjYKLQlzdC5iIHI1LDVbcjZdCi0Jc3QuaCByNSw0W3I2XQotCXN0LncgcjUsNFtyNl0KLQlzc3QuYiByNiw2NFtlcF0KLQlzc3QuaCByNiwxMjhbZXBdCi0Jc3N0LncgcjYsMTI4W2VwXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21pc2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjNGU0Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21pc2MucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotCS50ZXh0Ci0JLmdsb2JhbCBtaXNjCi1taXNjOgotCWRpCi0JZWkKLQloYWx0Ci0Jbm9wCi0JcmV0aQotCXRyYXAgMAotCXRyYXAgMzEKLQlsZHNyIHI3LHBzdwotCXN0c3IgcHN3LHI3CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbW92ZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmE2ZmFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbW92ZS5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbW92ZQotbW92ZToKLQltb3YgcjUscjYKLQltb3YgNSxyNgotCW1vdmVhIDcscjUscjYKLQltb3ZoaSA3LHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JhbmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JhbmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWNjZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JLnRleHQKLQlsZC5iIDB4ZmY2MltyMF0scjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmVsb2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczOGQyNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkudGV4dAotCW1vdmVhIGxvKGZvbykscjAscjEKLQltb3ZoaSBoaShmb28pLHIxLHIxCi0JbW92aGkgaGkwKGZvbykscjEscjEKLQltb3ZlYSB6ZGFvZmYoX2ZvbykscjAscjEKLQltb3ZoaSB0ZGFvZmYoX2ZvbyksZXAscjEKLQltb3ZoaSBzZGFvZmYoX2ZvbyksZ3AscjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3NzBjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1wcm9jIGRvX3F1YWQge30gewotICAgIHNldCB0ZXN0bmFtZSAicXVhZC5zOiBxdWFkd29yZCBpbW1lZGlhdGUgdmFsdWVzIgotICAgIHNldCB4MSAwCi0gICAgc2V0IHgyIDAKLSAgICBzZXQgeDMgMAotICAgIGdhc19zdGFydCAicXVhZC5zIiAiLWFsIgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rMDAwMCsgN0Q4Rjc4NTZcWyBcdFxdK21vdnFcW15cblxdKlxuIiB7IHNldCB4MSAxIH0KLQkgICAgLXJlICJeICsyXFsgXHRcXSszNDEyRERDQ1xbXlxuXF0qXG4iCQkgICB7IHNldCB4MiAxIH0KLQkgICAgLXJlICJeICsyXFsgXHRcXStCQkFBNTAwMVxbIFx0XF0qXHJcbiIJCSAgIHsgc2V0IHgzIDEgfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLSAgICBnYXNfZmluaXNoCi0gICAgaWYgW2FsbF9vbmVzICR4MSAkeDIgJHgzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgdmF4LSotKl0gdGhlbiB7Ci0gICAgZG9fcXVhZAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWQ0YWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbW92cSAkMHhhYWJiY2NkZDEyMzQ1Njc4LHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGJiOTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogdnRhYmxlIGVudHJ5MAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICtUWVBFICtWQUxVRSAKLTArMDAwMDAxMCBSXy4qX0dOVV9WVEVOVFJZICB2dGJsX2EKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Zjg5ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0udGV4dAotLnZ0YWJsZV9lbnRyeSB2dGJsX2EsIDE2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYTZlNGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogdnRhYmxlIGVudHJ5MQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICtUWVBFICtWQUxVRSAKLTArMDAwMDAwMCBSXy4qX0dOVV9WVEVOVFJZICB2dGJsX2EuKgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmODllMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLS50ZXh0Ci0udnRhYmxlX2VudHJ5IHZ0YmxfYSwgMTYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzk1YjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiB2dGFibGUgaW5oZXJpdDAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLmRhdGFcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMDAgUl8uKl9HTlVfVlRJTkhFUklUICBcKkFCU1wqCi0wKzAwMDAwMTAgUl8uKl9HTlVfVlRJTkhFUklUICB2dGJsX2EKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzOGRmNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS5kYXRhCi0KLS50eXBlIHZ0YmxfYSxvYmplY3QKLXZ0YmxfYToKLQkuc3BhY2UgMTYKLS5zaXplIHZ0YmxfYSwxNgotLnZ0YWJsZV9pbmhlcml0IHZ0YmxfYSwgMAotCi0udHlwZSB2dGJsX2Isb2JqZWN0Ci12dGJsX2I6Ci0JLnNwYWNlIDE2Ci0uc2l6ZSB2dGJsX2IsMTYKLS52dGFibGVfaW5oZXJpdCB2dGJsX2IsIHZ0YmxfYQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkNjM1OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEubAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjE6IEVycm9yOiBleHBlY3RlZCBgdnRibF9hJyB0byBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIC52dGFibGVfaW5oZXJpdAotLipHQVMuKgotCi0KLSArMS4qdnRhYmxlX2luaGVyaXQgdnRibF9hLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGQxZDI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLnZ0YWJsZV9pbmhlcml0IHZ0YmxfYSwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvdnRhYmxlLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZTFiYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvdnRhYmxlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMKLSMgdnRhYmxlIHRlc3RzCi0jCi1wcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpciBzdWJkaXIKLSAgICBzZXQgdGVzdG5hbWUgInZ0YWJsZSAkbmFtZSIKLSAgICBzZXQgZmlsZSAkc3JjZGlyLyRzdWJkaXIvJG5hbWUKLSAgICBnYXNfcnVuICR7bmFtZX0ucyAkb3B0cyAiPiZkdW1wLm91dCIKLSAgICBpZiB7IFtyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmwiXSB9IHRoZW4gewotCWZhaWwgJHRlc3RuYW1lCi0JdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCi0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgVnRhYmxlIGJpdHMgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5IEVMRiB0YXJnZXRzLgotaWYgeyAoW2lzdGFyZ2V0ICIqLSotZWxmKiJdCQkKLSAgICAgIHx8IFtpc3RhcmdldCAiKi0qLWxpbnV4KiJdKQotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0KLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXSB9IHRoZW4gewotCi0gICAgIyBub3Qgc3VwcG9ydGVkIGJ5IEQzMFYKLSAgICBpZiB7W2lzdGFyZ2V0ICJkMzB2LSotKiJdfSB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICAjIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IGk5NjAKLSAgICBpZiB7W2lzdGFyZ2V0ICJpOTYwLSotKiJdfSB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICBydW5fZHVtcF90ZXN0ICJpbmhlcml0MCIgCi0gICAgcnVuX2xpc3RfdGVzdCAiaW5oZXJpdDEiICItYWwiCi0KLSAgICAjIFRoZSB2dGFibGUgZW50cnkgcmVzdWx0cyBhcmUgZGlmZmVyZW50IG9uIFJlbCBhbmQgUmVsYSB0YXJnZXRzLgotICAgIGlmIHtbaXN0YXJnZXQgImkqODYtKi0qIl0gCi0JfHwgW2lzdGFyZ2V0ICJtaXBzKi0qLSoiXSAKLQl8fCBbaXN0YXJnZXQgInN0cm9uZ2FybSotKi0qIl0gCi0JfHwgW2lzdGFyZ2V0ICJhcm0qLSotKiJdfSB0aGVuIHsKLQotCXJ1bl9kdW1wX3Rlc3QgImVudHJ5MCIKLQotICAgIH0gZWxzZSB7Ci0KLQlydW5fZHVtcF90ZXN0ICJlbnRyeTEiCi0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMS5IIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzNzMyMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMS5ICisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1GSUxFIDEgRklSU1QgTElORQotCS5JTkNMVURFCSJJTkMyLkgiCi1GSUxFIDEgTEFTVCBMSU5FCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMi5IIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzIuSApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzYzNkYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMi5ICisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JRklMRSAyIEZJUlNUIExJTkUKLQlGSUxFIDIgTEFTVCBMSU5FCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY2NzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi1mb286CS5BU1NJR05DCSJoZWxsbyIKLUJBUjoJLkFTU0lHTkEJMTIrMzQKLQotCVwmZm9vJ2ZvbwotCVwmZm9vXCZmb29cJmZvbyAKLQlcJmZvbyBcJmZvbyBcJmZvbyAKLQlcJkJBUlwmYmFyXCZCQVIKLQotCi0KLQkKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTM3MzNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYXNzaWduLmFzbTo4IENhbid0IGZpbmQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIGJhci4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24ub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTA5YWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0hCi0KLSFmb286CS5BU1NJR05DCSJoZWxsbyIKLSFCQVI6CS5BU1NJR05BCTEyKzM0Ci0hCi0KLSEJXCZmb28nZm9vCi0JaGVsbG9mb28KLSEJXCZmb29cJmZvb1wmZm9vIAotCWhlbGxvaGVsbG9oZWxsbyAKLSEJXCZmb28gXCZmb28gXCZmb28gCi0JaGVsbG8gaGVsbG8gaGVsbG8gCi0hCVwmQkFSXCZiYXJcJkJBUgotCTQ2NDYKLSEKLQotIQotCi0hCi0KLSEJCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkOWYwNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUVMU0UKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMgotCUJBRAotCS5BRUxTRQotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRIDIKLQlCQUQKLQkuQUVMU0UKLQlPSwotCS5BSUYJMSBFUSAyCi0JQkFECi0JLkFFTFNFCi0JT0sKLQkuQUVOREkKLQkuQUVOREkKLQkuQUlGCTEgTFQgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAgMgotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBORSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIExFICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgR1QgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTMgR0UgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMyBMVCAgMgotCUJBRAotCS5BRU5ESQotCS5BSUYJMyBFUSAgMgotCUJBRCAKLQkuQUVOREkKLQkuQUlGCTMgTkUgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMyBMRSAgMgotCUJBRAotCS5BRU5ESQotCS5BSUYJMyBHVCAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkzIEdFICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCSJGT08iIEVRICJCQVIiCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBFUSAiRk9PIgotCU9LCi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBORSAiQkFSIgotCU9LCi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBFUSAiRk9PIgotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRIDEKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JT0sKLQkuQUVMU0UJCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDAKLQlCQUQKLQkuQUVMU0UJCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUVMU0UJCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDAKLQlCQUQKLQkuQUVMU0UJCi0JT0sKLQkuQUVOREkKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWNlZjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMgotIQlCQUQKLSEJLkFFTFNFCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAyCi0hCUJBRAotIQkuQUVMU0UKLSEJT0sKLQlPSwotIQkuQUlGCTEgRVEgMgotIQlCQUQKLSEJLkFFTFNFCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BRU5ESQotIQkuQUlGCTEgTFQgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIE5FICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBMRSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgR1QgIDIKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTMgR0UgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkzIExUICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkzIEVRICAyCi0hCUJBRCAKLSEJLkFFTkRJCi0hCS5BSUYJMyBORSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTMgTEUgIDIKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTMgR1QgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkzIEdFICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJIkZPTyIgRVEgIkJBUiIKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIEVRICJGT08iCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJIkZPTyIgTkUgIkJBUiIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkiRk9PIiBFUSAiRk9PIgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMQotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFFTFNFCQotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAwCi0hCUJBRAotIQkuQUVMU0UJCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxMGNjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotCi0JU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAotCi1mb286CS5NQUNSTwkKLQlISQotYmFyOgkuTUFDUk8JCi0JVEhFUkUKLQliYXIKLQkuRU5ETQkKLQotCi0JLkVORE0KLQlmb28KLQlmb28KLQlmb28KLQlmb28KLQlmb28KLQliYXIKLQotCi0KLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA4ODAyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jcmFzaC5hc206MTggVW5yZWFzb25hYmxlIGV4cGFuc2lvbiAoLXUgdHVybnMgb2ZmIGNoZWNrKS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjk0OGEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMDU5ICswLDAgQEAKLSEKLQotIQlTdHVmZiB0byB0cnkgYW5kIGNyYXNoIGl0Ci0JU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAotIQotCi0hZm9vOgkuTUFDUk8JCi0hCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLSEKLSEJLkVORE0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI2YjMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi0KLQkuTUFDUk8gCWZvbyBhIGIgYz1hCi0JXGEgXGIgXGMgXGQKLQkuRU5ETQotCi0JZm9vIDEgMgotCWZvbyAxIDIgMyA0Ci0JZm9vIDEKLQlmb28gCi0KLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1ZDA3OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSEKLQotIQotCi0hCS5NQUNSTyAJZm9vIGEgYiBjPWEKLSEJXGEgXGIgXGMgXGQKLSEJLkVORE0KLSEKLQotIQlmb28gMSAyCi0hCTEgMiBhIFxkCi0JMSAyIGEgXGQKLSEJZm9vIDEgMiAzIDQKLSEJZm9vIDEKLSEJMSAgYSBcZAotCTEgIGEgXGQKLSEJZm9vIAotIQkgIGEgXGQKLQlhIFxkCi0hCi0KLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhhMDAzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCWZvbwotCWZvbwlmb28KLQlmb28JZm9vCi0JZm9vCi0JLkVORAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMWEyZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQlmb28KLQlmb28KLSEJZm9vCWZvbwotCWZvbwlmb28KLSEJZm9vCWZvbwotCWZvbwlmb28KLSEJZm9vCi0JZm9vCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2YjBhMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0KLWZvbwkuREFUQQkxLDIsMwotYmFyCS5EQVRBCTEsMiwzLDQsNSAsNgotCS5EQVRBLkIJMTIzNDUsMTIsMgotCS5EQVRBLlcgOSwyLDEyLDMsMTMrNDEsZm9vKzkKLQkuREFUQS5MIDJ+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/JwotIwkJZXhpdCAxCi0JZWxzZQotCQllY2hvIGFuZCBzeW1ib2xzIGRpZmZlciBpbiBjb250ZW50LgotCQlleGl0IDEKLQlmaQotZmkKLQotIyBvZiBjb3Vyc2UsIGlmIHRoZXJlIHdlcmUgc3ltYm9sIGRpZmZzLCB0aGVuIHRoZSByZWxvYyBzeW1ib2wgaW5kZXhlcwotIyB3aWxsIGJlIG9mZi4KLQotaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wIC1yID4gL2Rldi9udWxsKQotdGhlbgotCWVjaG8gUmVsb2Mgb2suCi1lbHNlCi0JZWNobyAtbiBSZWxvYyBkaWZmZXJlbmNlcy4uLgotCi0JaWYgKGRvYm90aCAkQk9USCBkb3Vuc29ydHJlbG9jKQotCXRoZW4KLQkJZWNobyBidXQgcmVsb2NzIGFyZSBzaW1wbHkgb3JkZXJlZCBkaWZmZXJlbnRseS4KLQllbHNlCi0JCWVjaG8gYW5kIHJlbG9jcyBkaWZmZXIgaW4gY29udGVudC4KLQkJZXhpdCAxCi0JZmkKLWZpCi0KLWV4aXQKLQotIyBlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2Rvc3RyaXB0ZXN0IGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9zdHJpcHRlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhNTE3MDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9zdHJpcHRlc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIS9iaW4vc2gKLQoteD1zdHJpcHRlc3QueHguJCQKLXk9c3RyaXB0ZXN0Lnl5LiQkCi0KLWNwICQxICR4Ci1zdHJpcCAkeAotY3AgJDIgJHkKLXN0cmlwICR5Ci0KLWRvb2JqY21wICR4ICR5Ci1leGl0Ci0KLSNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdGVzdCBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdGVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTc2OGEyMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIS9iaW4vc2gKLSMgYWQgaG9jIGRlYnVnIHRvb2wKLQoteD0kMQoteT0kMgotCi14b3V0PWBiYXNlbmFtZSAkeGAueHh4LiQkCi15b3V0PWBiYXNlbmFtZSAkeGAueXl5LiQkCi0KLW1rZGlyICR4b3V0Ci1ta2RpciAkeW91dAotCi1mb3IgaSBpbiAqLnMKLWRvCi0JZWNobyBUZXN0aW5nICRpLi4uCi0Jb2JqZWN0PWBiYXNlbmFtZSAkaSAuc2AubwotCSR4ICRpIC1vICR4b3V0LyRvYmplY3QKLQkkeSAkaSAtbyAkeW91dC8kb2JqZWN0Ci0KLSMgaWYgdGhleSBjbXAsIHdlJ3JlIG9rLiAgT3RoZXJ3aXNlIHdlIGhhdmUgdG8gbG9vayBjbG9zZXIuCi0KLQlpZiAoY21wICR4b3V0LyRvYmplY3QgJHlvdXQvJG9iamVjdCkKLQl0aGVuCi0JCWVjaG8gJGkgaXMgb2suCi0JZWxzZQotCQlpZiAoZG9vYmpjbXAgJHhvdXQvJG9iamVjdCAkeW91dC8kb2JqZWN0KQotCQl0aGVuCi0JCQllY2hvIE5vdCB0aGUgc2FtZSBidXQgb2JqY21wIG9rLgotCQllbHNlCi0JCQlleGl0IDEKLQkJZmkKLQlmaQotCi0JZWNobwotZG9uZQotCi1ybSAtcmYgJHhvdXQgJHlvdXQKLQotZXhpdCAwCi0KLSMgRU9GCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNyZWxvYyBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkNjk1MzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNyZWxvYworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyEvYmluL3NoCi0jIG9iamR1bXAgdGhlIHJlbG9jIHRhYmxlLCBidXQgc3RyaXAgb2ZmIHRoZSBoZWFkaW5ncyBhbmQgcmVsb2MKLSMgbnVtYmVycyBhbmQgc29ydCB0aGUgcmVzdWx0LiAgSW50ZW5kZWQgZm9yIHVzZSBpbiBjb21wYXJpbmcgcmVsb2MKLSMgdGFibGVzIHRoYXQgbWF5IG5vdCBiZSBpbiB0aGUgc2FtZSBvcmRlci4KLQotb2JqZHVtcCArcmVsb2MgK29taXQtcmVsb2NhdGlvbi1udW1iZXJzICtvbWl0LXN5bWJvbC1udW1iZXJzICQxIFwKLQl8IHNvcnQKLSNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zc3ltIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0NGRhNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBvYmpkdW1wIHRoZSBzeW1ib2wgdGFibGUsIGJ1dCBzdHJpcCBvZmYgdGhlIGhlYWRpbmdzIGFuZCBzeW1ib2wKLSMgbnVtYmVycyBhbmQgc29ydCB0aGUgcmVzdWx0LiAgSW50ZW5kZWQgZm9yIHVzZSBpbiBjb21wYXJpbmcgc3ltYm9sCi0jIHRhYmxlcyB0aGF0IG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIuCi0KLW9iamR1bXAgK3N5bWJvbHMgK29taXQtc3ltYm9sLW51bWJlcnMgJDEgXAotCXwgc29ydAotI2VvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRlZnMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRlZnMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE1ZjY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEtlbiBSYWVidXJuIChyYWVidXJuQGN5Z251cy5jb20pLgotCi1wcm9jIGdhc192ZXJzaW9uIHt9IHsKLSAgICBnbG9iYWwgQVMKLSAgICBjYXRjaCAiZXhlYyAkQVMgLXZlcnNpb24gPCAvZGV2L251bGwiIHRtcAotICAgICMgU2hvdWxkIGZpbmQgYSB3YXkgdG8gZGlzY2FyZCBjb25zdGFudCBwYXJ0cywga2VlcCB3aGF0ZXZlcidzCi0gICAgIyBsZWZ0LCBzbyB0aGUgdmVyc2lvbiBzdHJpbmcgY291bGQgYmUgYWxtb3N0IGFueXRoaW5nIGF0IGFsbC4uLgotICAgIHJlZ2V4cCAiXFteXG5cXSogKGN5Z251cy18KShcWy0wLTkuYS16QS1aLVxdKylcW1xyXG5cXS4qIiAkdG1wIHZlcnNpb24gY3lnIG51bWJlcgotICAgIGlmICFbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKLSAgICAgICAgcmV0dXJuICJbd2hpY2ggJEFTXSAobm8gdmVyc2lvbiBudW1iZXIpXG4iCi0gICAgfQotICAgIGNsb25lX291dHB1dCAiW3doaWNoICRBU10gJG51bWJlclxuIgotICAgIHVuc2V0IHZlcnNpb24KLX0KLQotcHJvYyBnYXNfcnVuIHsgcHJvZyBhc19vcHRzIHJlZGlyIH0gewotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICB2ZXJib3NlICJFeGVjdXRpbmcgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkc3JjZGlyLyRzdWJkaXIvJHByb2cgJHJlZGlyIgotICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJGFzX29wdHMgJHNyY2Rpci8kc3ViZGlyLyRwcm9nICRyZWRpciIgY29tcF9vdXRwdXQKLSAgICBzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLSAgICB2ZXJib3NlICJvdXRwdXQgd2FzICRjb21wX291dHB1dCIKLSAgICByZXR1cm4gW2xpc3QgJGNvbXBfb3V0cHV0ICIiXTsKLX0KLQotcHJvYyBhbGxfb25lcyB7IGFyZ3MgfSB7Ci0gICAgZm9yZWFjaCB4ICRhcmdzIHsgaWYgW2V4cHIgJHghPTFdIHsgcmV0dXJuIDAgfSB9Ci0gICAgcmV0dXJuIDEKLX0KLQotcHJvYyBnYXNfc3RhcnQgeyBwcm9nIGFzX29wdHMgfSB7Ci0gICAgZ2xvYmFsIEFTCi0gICAgZ2xvYmFsIEFTRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBzcGF3bl9pZAotCi0gICAgdmVyYm9zZSAiU3RhcnRpbmcgJEFTICRBU0ZMQUdTICRhc19vcHRzICRwcm9nIiAyCi0gICAgY2F0Y2ggewotCXNwYXduIC1ub2VjaG8gLW5vdHR5Y29weSAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRhc19vcHRzICRzcmNkaXIvJHN1YmRpci8kcHJvZwotICAgIH0gZm9vCi0gICAgaWYgIVtyZWdleHAge15bMC05XSt9ICRmb29dIHRoZW4gewotCXBlcnJvciAiQ2FuJ3QgcnVuICRzdWJkaXIvJHByb2c6ICRmb28iCi0gICAgfQotfQotCi1wcm9jIGdhc19maW5pc2ggeyB9IHsKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIGNhdGNoICJjbG9zZSIKLSAgICBjYXRjaCAid2FpdCIKLX0KLQotcHJvYyB3YW50X25vX291dHB1dCB7IHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCi0gICAgfQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICIkdGVzdG5hbWUiCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCWZhaWwgIiR0ZXN0bmFtZSIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotcHJvYyBnYXNfdGVzdF9vbGQgeyBmaWxlIGFzX29wdHMgdGVzdG5hbWUgfSB7Ci0gICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiIgotICAgIHJldHVybiBbd2FudF9ub19vdXRwdXQgJHRlc3RuYW1lXQotfQotCi1wcm9jIGdhc190ZXN0IHsgZmlsZSBhc19vcHRzIHZhcl9vcHRzIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgc2V0IGkgMAotICAgIGZvcmVhY2ggd29yZCAkdmFyX29wdHMgewotCXNldCBpZ25vcmVfc3Rkb3V0KCRpKSBbc3RyaW5nIG1hdGNoICIqPiIgJHdvcmRdCi0Jc2V0IG9wdCgkaSkgW3N0cmluZyB0cmltICR3b3JkIHs+fV0KLQlpbmNyIGkKLSAgICB9Ci0gICAgc2V0IG1heCBbZXhwciAxPDwkaV0KLSAgICBmb3Ige3NldCBpIDB9IHtbZXhwciAkaTwkbWF4XX0ge2luY3IgaX0gewotCXNldCBtYXliZV9pZ25vcmVfc3Rkb3V0ICIiCi0Jc2V0IGV4dHJhX29wdHMgIiIKLQlmb3Ige3NldCBiaXQgMH0geygxPDwkYml0KTwkbWF4fSB7aW5jciBiaXR9IHsKLQkgICAgc2V0IG51bSBbZXhwciAxPDwkYml0XQotCSAgICBpZiBbZXhwciAkaSYkbnVtXSB0aGVuIHsKLQkJc2V0IGV4dHJhX29wdHMgIiRleHRyYV9vcHRzICRvcHQoJGJpdCkiCi0JCWlmICRpZ25vcmVfc3Rkb3V0KCRiaXQpIHRoZW4gewotCQkgICAgc2V0IG1heWJlX2lnbm9yZV9zdGRvdXQgIj4vZGV2L251bGwiCi0JCX0KLQkgICAgfQotCX0KLQlzZXQgZXh0cmFfb3B0cyBbc3RyaW5nIHRyaW0gJGV4dHJhX29wdHNdCi0JZ2FzX3J1biAkZmlsZSAiJGFzX29wdHMgJGV4dHJhX29wdHMiICRtYXliZV9pZ25vcmVfc3Rkb3V0Ci0KLQkjIFNob3VsZCBJIGJlIGFibGUgdG8gdXNlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBoZXJlPwotCWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4dHJhX29wdHNdIHRoZW4gewotCSAgICB3YW50X25vX291dHB1dCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICB3YW50X25vX291dHB1dCAiJHRlc3RuYW1lICgkZXh0cmFfb3B0cykiCi0JfQotICAgIH0KLSAgICBpZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKLSAgICAgICAgdW5zZXQgZXJyb3JJbmZvCi0gICAgfQotfQotCi1wcm9jIGdhc190ZXN0X2lnbm9yZV9zdGRvdXQgeyBmaWxlIGFzX29wdHMgdGVzdG5hbWUgfSB7Ci0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0KLSAgICBnYXNfcnVuICRmaWxlICRhc19vcHRzICI+L2Rldi9udWxsIgotICAgIHdhbnRfbm9fb3V0cHV0ICR0ZXN0bmFtZQotfQotCi1wcm9jIGdhc190ZXN0X2Vycm9yIHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiPi9kZXYvbnVsbCIKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKLSAgICB9Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICB9IGVsc2UgewotCXBhc3MgIiR0ZXN0bmFtZSIKLSAgICB9Ci19Ci0KLXByb2MgZ2FzX2V4aXQge30ge30KLQotcHJvYyBnYXNfaW5pdCB7IGFyZ3MgfSB7Ci0gICAgZ2xvYmFsIHRhcmdldF9jcHUKLSAgICBnbG9iYWwgdGFyZ2V0X2NwdV9mYW1pbHkKLSAgICBnbG9iYWwgdGFyZ2V0X2ZhbWlseQotICAgIGdsb2JhbCB0YXJnZXRfdmVuZG9yCi0gICAgZ2xvYmFsIHRhcmdldF9vcwotICAgIGdsb2JhbCBzdGRvcHRsaXN0Ci0KLSAgICBjYXNlICIkdGFyZ2V0X2NwdSIgaW4gewotCSJtNjg/Pz8iCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSBtNjhrIH0KLQkiaVszNF04NiIJCXsgc2V0IHRhcmdldF9jcHVfZmFtaWx5IGkzODYgfQotCWRlZmF1bHQJCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSAkdGFyZ2V0X2NwdSB9Ci0gICAgfQotCi0gICAgc2V0IHRhcmdldF9mYW1pbHkgIiR0YXJnZXRfY3B1X2ZhbWlseS0kdGFyZ2V0X3ZlbmRvci0kdGFyZ2V0X29zIgotICAgIHNldCBzdGRvcHRsaXN0ICItYT4iCi0KLSAgICBpZiAhW2lzdGFyZ2V0ICIqLSotKiJdIHsKLQlwZXJyb3IgIlRhcmdldCBuYW1lIFtpc3RhcmdldF0gaXMgbm90IGEgdHJpcGxlLiIKLSAgICB9Ci0gICAgIyBOZWVkIHRvIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0gICAgcmV0dXJuCi19Ci0KLQotIyBydW5fZHVtcF90ZXN0IEZJTEUgCi0jCi0jIEFzc2VtYmxlIGEgLnMgZmlsZSwgdGhlbiBydW4gc29tZSB1dGlsaXR5IG9uIGl0IGFuZCBjaGVjayB0aGUgb3V0cHV0LgotIyAKLSMgVGhlcmUgc2hvdWxkIGJlIGFuIGFzc2VtYmx5IGxhbmd1YWdlIGZpbGUgbmFtZWQgRklMRS5zIGluIHRoZSB0ZXN0Ci0jIHN1aXRlIGRpcmVjdG9yeSwgYW5kIGEgcGF0dGVybiBmaWxlIGNhbGxlZCBGSUxFLmQuICBgcnVuX2R1bXBfdGVzdCcKLSMgd2lsbCBhc3NlbWJsZSBGSUxFLnMsIHJ1biBzb21lIHRvb2wgbGlrZSBgb2JqZHVtcCcsIGBvYmpjb3B5Jywgb3IKLSMgYG5tJyBvbiB0aGUgLm8gZmlsZSB0byBwcm9kdWNlIHRleHR1YWwgb3V0cHV0LCBhbmQgdGhlbiBhbmFseXplIHRoYXQKLSMgd2l0aCByZWdleHBzLiAgVGhlIEZJTEUuZCBmaWxlIHNwZWNpZmllcyB3aGF0IHByb2dyYW0gdG8gcnVuLCBhbmQKLSMgd2hhdCB0byBleHBlY3QgaW4gaXRzIG91dHB1dC4KLSMKLSMgVGhlIEZJTEUuZCBmaWxlIGJlZ2lucyB3aXRoIHplcm8gb3IgbW9yZSBvcHRpb24gbGluZXMsIHdoaWNoIHNwZWNpZnkKLSMgZmxhZ3MgdG8gcGFzcyB0byB0aGUgYXNzZW1ibGVyLCB0aGUgcHJvZ3JhbSB0byBydW4gdG8gZHVtcCB0aGUKLSMgYXNzZW1ibGVyJ3Mgb3V0cHV0LCBhbmQgdGhlIG9wdGlvbnMgaXQgd2FudHMuICBUaGUgb3B0aW9uIGxpbmVzIGhhdmUKLSMgdGhlIHN5bnRheDoKLSMgCi0jICAgICAgICAgIyBPUFRJT046IFZBTFVFCi0jIAotIyBPUFRJT04gaXMgdGhlIG5hbWUgb2Ygc29tZSBvcHRpb24sIGxpa2UgIm5hbWUiIG9yICJvYmpkdW1wIiwgYW5kCi0jIFZBTFVFIGlzIE9QVElPTidzIHZhbHVlLiAgVGhlIHZhbGlkIG9wdGlvbnMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KLSMgV2hpdGVzcGFjZSBpcyBpZ25vcmVkIGV2ZXJ5d2hlcmUsIGV4Y2VwdCB3aXRoaW4gVkFMVUUuICBUaGUgb3B0aW9uCi0jIGxpc3QgZW5kcyB3aXRoIHRoZSBmaXJzdCBsaW5lIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUgYWJvdmUgc3ludGF4Ci0jIChobW0sIG5vdCBncmVhdCBmb3IgZXJyb3IgZGV0ZWN0aW9uKS4KLSMKLSMgVGhlIGludGVyZXN0aW5nIG9wdGlvbnMgYXJlOgotIyAKLSMgICBuYW1lOiBURVNULU5BTUUKLSMJVGhlIG5hbWUgb2YgdGhpcyB0ZXN0LCBwYXNzZWQgdG8gRGVqYUdOVSdzIGBwYXNzJyBhbmQgYGZhaWwnCi0jICAgICAgIGNvbW1hbmRzLiAgSWYgb21pdHRlZCwgdGhpcyBkZWZhdWx0cyB0byBGSUxFLCB0aGUgcm9vdCBvZiB0aGUKLSMgICAgICAgLnMgYW5kIC5kIGZpbGVzJyBuYW1lcy4KLSMgCi0jICAgYXM6IEZMQUdTCi0jCVdoZW4gYXNzZW1ibGluZyBGSUxFLnMsIHBhc3MgRkxBR1MgdG8gdGhlIGFzc2VtYmxlci4KLSMgCi0jICAgUFJPRzogUFJPR1JBTS1OQU1FCi0jICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHJ1biB0byBhbmFseXplIHRoZSAubyBmaWxlIHByb2R1Y2VkCi0jICAgICAgIGJ5IHRoZSBhc3NlbWJsZXIuICBUaGlzIGNhbiBiZSBvbWl0dGVkOyBydW5fZHVtcF90ZXN0IHdpbGwgZ3Vlc3MKLSMgICAgICAgd2hpY2ggcHJvZ3JhbSB0byBydW4gYnkgc2VlaW5nIHdoaWNoIG9mIHRoZSBmbGFncyBvcHRpb25zIGJlbG93Ci0jCWlzIHByZXNlbnQuCi0jIAotIyAgIG9iamR1bXA6IEZMQUdTCi0jICAgbm06IEZMQUdTCi0jICAgb2JqY29weTogRkxBR1MKLSMJVXNlIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB0byBhbmFseXplIHRoZSAubyBmaWxlLCBhbmQgcGFzcyBpdAotIwlGTEFHUywgaW4gYWRkaXRpb24gdG8gdGhlIC5vIGZpbGUgbmFtZS4KLSMKLSMgICBzb3VyY2U6IFNPVVJDRQotIwlBc3NlbWJsZSB0aGUgZmlsZSBTT1VSQ0Uucy4gIElmIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gRklMRS5zLgotIyAgICAgICBUaGlzIGlzIHVzZWZ1bCBpZiBzZXZlcmFsIC5kIGZpbGVzIHdhbnQgdG8gc2hhcmUgYSAucyBmaWxlLgotIwotIyBFYWNoIG9wdGlvbiBtYXkgb2NjdXIgYXQgbW9zdCBvbmNlLgotIwotIyBBZnRlciB0aGUgb3B0aW9uIGxpbmVzIGNvbWUgcmVnZXhwIGxpbmVzLiAgYHJ1bl9kdW1wX3Rlc3QnIGNhbGxzCi0jIGByZWdleHBfZGlmZicgdG8gY29tcGFyZSB0aGUgb3V0cHV0IG9mIHRoZSBkdW1waW5nIHRvb2wgYWdhaW5zdCB0aGUKLSMgcmVnZXhwcyBpbiBGSUxFLmQuICBgcmVnZXhwX2RpZmYnIGlzIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlOyBzZWUKLSMgZnVydGhlciBjb21tZW50cyB0aGVyZS4KLQotcHJvYyBydW5fZHVtcF90ZXN0IHsgbmFtZSB9IHsKLSAgICBnbG9iYWwgc3ViZGlyIHNyY2RpcgotICAgIGdsb2JhbCBPQkpEVU1QIE5NIEFTIE9CSkNPUFkKLSAgICBnbG9iYWwgT0JKRFVNUEZMQUdTIE5NRkxBR1MgQVNGTEFHUyBPQkpDT1BZRkxBR1MKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIqLyoiICRuYW1lXSB7Ci0Jc2V0IGZpbGUgJG5hbWUKLQlzZXQgbmFtZSBbZmlsZSB0YWlsICRuYW1lXQotICAgIH0gZWxzZSB7Ci0Jc2V0IGZpbGUgIiRzcmNkaXIvJHN1YmRpci8kbmFtZSIKLSAgICB9Ci0gICAgc2V0IG9wdF9hcnJheSBbc2x1cnBfb3B0aW9ucyAiJHtmaWxlfS5kIl0KLSAgICBpZiB7ICRvcHRfYXJyYXkgPT0gLTEgfSB7Ci0JcGVycm9yICJlcnJvciByZWFkaW5nIG9wdGlvbnMgZnJvbSAkZmlsZS5kIgotCXVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCXJldHVybgotICAgIH0KLSAgICBzZXQgb3B0cyhhcykge30KLSAgICBzZXQgb3B0cyhvYmpkdW1wKSB7fQotICAgIHNldCBvcHRzKG5tKSB7fQotICAgIHNldCBvcHRzKG9iamNvcHkpIHt9Ci0gICAgc2V0IG9wdHMobmFtZSkge30KLSAgICBzZXQgb3B0cyhQUk9HKSB7fQotICAgIHNldCBvcHRzKHNvdXJjZSkge30KLQotICAgIGZvcmVhY2ggaSAkb3B0X2FycmF5IHsKLQlzZXQgb3B0X25hbWUgW2xpbmRleCAkaSAwXQotCXNldCBvcHRfdmFsIFtsaW5kZXggJGkgMV0KLQlpZiAhW2luZm8gZXhpc3RzIG9wdHMoJG9wdF9uYW1lKV0gewotCSAgICBwZXJyb3IgInVua25vd24gb3B0aW9uICRvcHRfbmFtZSBpbiBmaWxlICRmaWxlLmQiCi0JICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCSAgICByZXR1cm4KLQl9Ci0JaWYgW3N0cmluZyBsZW5ndGggJG9wdHMoJG9wdF9uYW1lKV0gewotCSAgICBwZXJyb3IgIm9wdGlvbiAkb3B0X25hbWUgbXVsdGlwbHkgc2V0IGluICRmaWxlLmQiCi0JICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCSAgICByZXR1cm4KLQl9Ci0Jc2V0IG9wdHMoJG9wdF9uYW1lKSAkb3B0X3ZhbAotICAgIH0KLQotICAgIGlmIHskb3B0cyhQUk9HKSAhPSAiIn0gewotCXN3aXRjaCAtLSAkb3B0cyhQUk9HKSB7Ci0JICAgIG9iamR1bXAKLQkJeyBzZXQgcHJvZ3JhbSBvYmpkdW1wIH0KLQkgICAgbm0KLQkJeyBzZXQgcHJvZ3JhbSBubSB9Ci0JICAgIG9iamNvcHkKLQkJeyBzZXQgcHJvZ3JhbSBvYmpjb3B5IH0KLQkgICAgZGVmYXVsdAotCQl7IHBlcnJvciAidW5yZWNvZ25pemVkIHByb2dyYW0gb3B0aW9uICRvcHRzKFBST0cpIGluICRmaWxlLmQiCi0JCSAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JCSAgcmV0dXJuIH0KLQl9Ci0gICAgfSBlbHNlIHsKLQkjIEd1ZXNzIHdoaWNoIHByb2dyYW0gdG8gcnVuLCBieSBzZWVpbmcgd2hpY2ggb3B0aW9uIHdhcyBzcGVjaWZpZWQuCi0Jc2V0IHByb2dyYW0gIiIKLQlmb3JlYWNoIHAge29iamR1bXAgb2JqY29weSBubX0gewotCSAgICBpZiB7JG9wdHMoJHApICE9ICIifSB7Ci0JCWlmIHskcHJvZ3JhbSAhPSAiIn0gewotCQkgICAgcGVycm9yICJhbWJpZ3VvdXMgZHVtcCBwcm9ncmFtIGluICRmaWxlLmQiCi0JCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkJICAgIHJldHVybgotCQl9IGVsc2UgewotCQkgICAgc2V0IHByb2dyYW0gJHAKLQkJfQotCSAgICB9Ci0JfQotCWlmIHskcHJvZ3JhbSA9PSAiIn0gewotCSAgICBwZXJyb3IgImR1bXAgcHJvZ3JhbSB1bnNwZWNpZmllZCBpbiAkZmlsZS5kIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIHNldCBwcm9nb3B0czEgJG9wdHMoJHByb2dyYW0pCi0gICAgZXZhbCBzZXQgcHJvZ29wdHMgXCRbc3RyaW5nIHRvdXBwZXIgJHByb2dyYW1dRkxBR1MKLSAgICBldmFsIHNldCBiaW5hcnkgXCRbc3RyaW5nIHRvdXBwZXIgJHByb2dyYW1dCi0gICAgaWYgeyAkb3B0cyhuYW1lKSA9PSAiIiB9IHsKLQlzZXQgdGVzdG5hbWUgIiRzdWJkaXIvJG5hbWUiCi0gICAgfSBlbHNlIHsKLQlzZXQgdGVzdG5hbWUgJG9wdHMobmFtZSkKLSAgICB9Ci0KLSAgICBpZiB7ICRvcHRzKHNvdXJjZSkgPT0gIiIgfSB7Ci0Jc2V0IHNvdXJjZWZpbGUgJHtmaWxlfS5zCi0gICAgfSBlbHNlIHsKLQlzZXQgc291cmNlZmlsZSAkc3JjZGlyLyRzdWJkaXIvJG9wdHMoc291cmNlKQotICAgIH0KLQotICAgIHNlbmRfbG9nICIkQVMgJEFTRkxBR1MgJG9wdHMoYXMpIC1vIGR1bXAubyAkc291cmNlZmlsZVxuIgotICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJG9wdHMoYXMpIC1vIGR1bXAubyAkc291cmNlZmlsZSIgY29tcF9vdXRwdXQKLSAgICBzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCXZlcmJvc2UgIiRjb21wX291dHB1dCIgMwotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyBbd2hpY2ggJGJpbmFyeV0gPT0gMCB9IHsKLQl1bnRlc3RlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiB7ICRwcm9nb3B0czEgPT0gIiIgfSB7IHNldCAkcHJvZ29wdHMxICItciIgfQotICAgIHZlcmJvc2UgInJ1bm5pbmcgJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSIgMwotCi0gICAgIyBPYmpjb3B5LCB1bmxpa2UgdGhlIG90aGVyIHR3bywgd29uJ3Qgc2VuZCBpdHMgb3V0cHV0IHRvIHN0ZG91dCwKLSAgICAjIHNvIHdlIGhhdmUgdG8gcnVuIGl0IHNwZWNpYWxseS4KLSAgICBpZiB7ICRwcm9ncmFtID09ICJvYmpjb3B5IiB9IHsKLQlzZW5kX2xvZyAiJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gZHVtcC5vdXRcbiIKLQljYXRjaCAiZXhlYyAkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIGR1bXAubyBkdW1wLm91dCIgY29tcF9vdXRwdXQKLQlzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIGR1bXAubyA+IGR1bXAub3V0XG4iCi0JY2F0Y2ggImV4ZWMgJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gPiBkdW1wLm91dCIgY29tcF9vdXRwdXQKLQlzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICB2ZXJib3NlX2V2YWwge1tmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdfSAzCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5kIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLXByb2Mgc2x1cnBfb3B0aW9ucyB7IGZpbGUgfSB7Ci0gICAgaWYgW2NhdGNoIHsgc2V0IGYgW29wZW4gJGZpbGUgcl0gfSB4XSB7Ci0JI3BlcnJvciAiY291bGRuJ3Qgb3BlbiBgJGZpbGUnOiAkeCIKLQlwZXJyb3IgIiR4IgotCXJldHVybiAtMQotICAgIH0KLSAgICBzZXQgb3B0X2FycmF5IHt9Ci0gICAgIyB3aGl0ZXNwYWNlIGV4cHJlc3Npb24KLSAgICBzZXQgd3MgIHtbIAldKn0KLSAgICBzZXQgbndzIHtbXiAJXSp9Ci0gICAgIyB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQgYW55d2hlcmUgZXhjZXB0IHdpdGhpbiB0aGUgb3B0aW9ucyBsaXN0OwotICAgICMgb3B0aW9uIG5hbWVzIGFyZSBhbHBoYWJldGljIG9ubHkKLSAgICBzZXQgcGF0ICJeIyR7d3N9KFxbYS16QS1aXF0qKSR3czoke3dzfSguKikkd3NcJCIKLSAgICB3aGlsZSB7IFtnZXRzICRmIGxpbmVdICE9IC0xIH0gewotCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KLQkjIFdoaXRlc3BhY2UgaGVyZSBpcyBzcGFjZS10YWIuCi0JaWYgW3JlZ2V4cCAkcGF0ICRsaW5lIHh4eCBvcHRfbmFtZSBvcHRfdmFsXSB7Ci0JICAgICMgbWF0Y2ghCi0JICAgIGxhcHBlbmQgb3B0X2FycmF5IFtsaXN0ICRvcHRfbmFtZSAkb3B0X3ZhbF0KLQl9IGVsc2UgewotCSAgICBicmVhawotCX0KLSAgICB9Ci0gICAgY2xvc2UgJGYKLSAgICByZXR1cm4gJG9wdF9hcnJheQotfQotCi1wcm9jIG9iamR1bXAgeyBvcHRzIH0gewotICAgIGdsb2JhbCBPQkpEVU1QCi0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgY2F0Y2ggImV4ZWMgJE9CSkRVTVAgJG9wdHMiIGNvbXBfb3V0cHV0Ci0gICAgc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0gICAgdmVyYm9zZSAib2JqZHVtcCBvdXRwdXQ9JGNvbXBfb3V0cHV0XG4iIDMKLX0KLQotcHJvYyBvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciB7IHByb2cgb3B0cyB9IHsKLSAgICBnbG9iYWwgT0JKRFVNUAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIHZlcmJvc2UgIlN0YXJ0aW5nICRPQkpEVU1QICRvcHRzICRwcm9nIiAyCi0gICAgY2F0Y2ggewotCXNwYXduIC1ub2VjaG8gLW5vdHR5aW5pdCAkc3JjZGlyL2xpYi9ydW4gJE9CSkRVTVAgJG9wdHMgJHByb2cKLSAgICB9IGZvbwotICAgIGlmICFbcmVnZXhwIHteWzAtOV0rfSAkZm9vXSB0aGVuIHsKLQlwZXJyb3IgIkNhbid0IHJ1biAkcHJvZzogJGZvbyIKLSAgICB9Ci19Ci0KLXByb2Mgb2JqZHVtcF9maW5pc2ggeyB9IHsKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIGNhdGNoICJjbG9zZSIKLSAgICBjYXRjaCAid2FpdCIKLX0KLQotIyBEZWZhdWx0IHRpbWVvdXQgaXMgMTAgc2Vjb25kcywgbG9zZXMgb24gYSBzbG93IG1hY2hpbmUuICBCdXQgc29tZQotIyBjb25maWd1cmF0aW9ucyBvZiBkZWphZ251IG1heSBvdmVycmlkZSBpdC4KLWlmIHskdGltZW91dDwxMjB9IHRoZW4geyBzZXQgdGltZW91dCAxMjAgfQotCi1leHBlY3RfYWZ0ZXIgLWkgewotICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dCIgfQotICAgICJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiCXsgcGVycm9yICJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiIH0KLSAgICBidWZmZXJfZnVsbAkJCXsgcGVycm9yICJidWZmZXIgZnVsbCIgfQotICAgIGVvZgkJCQl7IHBlcnJvciAiZW9mIiB9Ci19Ci0KLSMgcmVnZXhwX2RpZmYsIGJhc2VkIG9uIHNpbXBsZV9kaWZmIHRha2VuIGZyb20gbGQgdGVzdCBzdWl0ZQotIwljb21wYXJlcyB0d28gZmlsZXMgbGluZS1ieS1saW5lCi0jCWZpbGUxIGNvbnRhaW5zIHN0cmluZ3MsIGZpbGUyIGNvbnRhaW5zIHJlZ2V4cHMgYW5kICMtY29tbWVudHMKLSMJYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQgaW4gZWl0aGVyIGZpbGUKLSMJcmV0dXJucyBub24temVybyBpZiBkaWZmZXJlbmNlcyBleGlzdAotIwotcHJvYyByZWdleHBfZGlmZiB7IGZpbGVfMSBmaWxlXzIgfSB7Ci0KLSAgICBzZXQgZW9mIC0xCi0gICAgc2V0IGVuZF8xIDAKLSAgICBzZXQgZW5kXzIgMAotICAgIHNldCBkaWZmZXJlbmNlcyAwCi0gICAgc2V0IGRpZmZfcGFzcyAwCi0KLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7Ci0Jc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCi0gICAgfSBlbHNlIHsKLQl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCi0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMl0gdGhlbiB7Ci0Jc2V0IGZpbGVfYiBbb3BlbiAkZmlsZV8yIHJdCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkZmlsZV8yIGRvZXNuJ3QgZXhpc3QiCi0JY2xvc2UgJGZpbGVfYQotCXJldHVybiAxCi0gICAgfQotCi0gICAgdmVyYm9zZSAiIFJlZ2V4cC1kaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yIiAyCi0KLSAgICB3aGlsZSB7IDEgfSB7Ci0Jc2V0IGxpbmVfYSAiIgotCXNldCBsaW5lX2IgIiIKLQl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2FdID09IDAgfSB7Ci0JICAgIGlmIHsgW2dldHMgJGZpbGVfYSBsaW5lX2FdID09ICRlb2YgfSB7Ci0JCXNldCBlbmRfMSAxCi0JCWJyZWFrCi0JICAgIH0KLQl9Ci0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9iXSA9PSAwIHx8IFtzdHJpbmcgbWF0Y2ggIiMqIiAkbGluZV9iXSB9IHsKLQkgICAgaWYgWyBzdHJpbmcgbWF0Y2ggIiNwYXNzIiAkbGluZV9iIF0gewotCQlzZXQgZW5kXzIgMQotCQlzZXQgZGlmZl9wYXNzIDEKLQkJYnJlYWsKLQkgICAgfSBlbHNlaWYgWyBzdHJpbmcgbWF0Y2ggIiMuLi4iICRsaW5lX2IgXSB7Ci0JCWlmIHsgW2dldHMgJGZpbGVfYiBsaW5lX2JdID09ICRlb2YgfSB7Ci0JCSAgICBzZXQgZW5kXzIgMQotCQkgICAgYnJlYWsKLQkJfQotCQl2ZXJib3NlICJsb29raW5nIGZvciBcIl4kbGluZV9iJFwiIiAzCi0JCXdoaWxlIHsgIVtyZWdleHAgIl4kbGluZV9iJCIgIiRsaW5lX2EiXSB9IHsKLQkJICAgIHZlcmJvc2UgInNraXBwaW5nICAgIFwiJGxpbmVfYVwiIiAzCi0JCSAgICBpZiB7IFtnZXRzICRmaWxlX2EgbGluZV9hXSA9PSAkZW9mIH0gewotCQkJc2V0IGVuZF8xIDEKLQkJCWJyZWFrCi0JCSAgICB9Ci0JCX0KLQkJYnJlYWsKLQkgICAgfQotCSAgICBpZiB7IFtnZXRzICRmaWxlX2IgbGluZV9iXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzIgMQotCQlicmVhawotCSAgICB9Ci0JfQotCi0gICAgICAgIGlmIHsgJGRpZmZfcGFzcyB9IHsgCi0gICAgICAgICAgICBicmVhayAKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgJiYgJGVuZF8yIH0geyAKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzFcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzEiIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMiB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIgMwotICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJib3NlICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiIiAzCi0gICAgICAgICAgICBpZiAhW3JlZ2V4cCAiXiRsaW5lX2IkIiAiJGxpbmVfYSJdIHsKLQkJc2VuZF9sb2cgInJlZ2V4cF9kaWZmIG1hdGNoIGZhaWx1cmVcbiIKLQkJc2VuZF9sb2cgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCJcbiIKLQkJc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgeyAkZGlmZmVyZW5jZXMgPT0gMCAmJiAhJGRpZmZfcGFzcyAmJiBbZW9mICRmaWxlX2FdICE9IFtlb2YgJGZpbGVfYl0gfSB7Ci0Jc2VuZF9sb2cgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzXG4iCi0JdmVyYm9zZSAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHMiIDMKLQlzZXQgZGlmZmVyZW5jZXMgMQotICAgIH0KLQotICAgIGNsb3NlICRmaWxlX2EKLSAgICBjbG9zZSAkZmlsZV9iCi0KLSAgICByZXR1cm4gJGRpZmZlcmVuY2VzCi19Ci0KLXByb2MgZmlsZV9jb250ZW50cyB7IGZpbGVuYW1lIH0gewotICAgIHNldCBmaWxlIFtvcGVuICRmaWxlbmFtZSByXQotICAgIHNldCBjb250ZW50cyBbcmVhZCAkZmlsZV0KLSAgICBjbG9zZSAkZmlsZQotICAgIHJldHVybiAkY29udGVudHMKLX0KLQotcHJvYyB2ZXJib3NlX2V2YWwgeyBleHByIHsgbGV2ZWwgMSB9IH0gewotICAgIGdsb2JhbCB2ZXJib3NlCi0gICAgaWYgJHZlcmJvc2U+JGxldmVsIHRoZW4geyBldmFsIHZlcmJvc2UgIiRleHByIiAkbGV2ZWwgfQotfQotCi0jIFRoaXMgZGVmaW5pdGlvbiBpcyB0YWtlbiBmcm9tIGFuIHVucmVsZWFzZWQgdmVyc2lvbiBvZiBEZWphR251LiAgT25jZQotIyB0aGF0IHZlcnNpb24gZ2V0cyByZWxlYXNlZCwgYW5kIGhhcyBiZWVuIG91dCBpbiB0aGUgd29ybGQgZm9yIGEgZmV3Ci0jIG1vbnRocyBhdCBsZWFzdCwgaXQgbWF5IGJlIHNhZmUgdG8gZGVsZXRlIHRoaXMgY29weS4KLWlmICFbc3RyaW5nIGxlbmd0aCBbaW5mbyBwcm9jIHBydW5lX3dhcm5pbmdzXV0gewotICAgICMKLSAgICAjIHBydW5lX3dhcm5pbmdzIC0tIGRlbGV0ZSB2YXJpb3VzIHN5c3RlbSB2ZXJib3NpdGllcyBmcm9tIFRFWFQuCi0gICAgIwotICAgICMgQW4gZXhhbXBsZSBpczoKLSAgICAjIGxkLnNvOiB3YXJuaW5nOiAvdXNyL2xpYi9saWJjLnNvLjEuOC4xIGhhcyBvbGRlciByZXZpc2lvbiB0aGFuIGV4cGVjdGVkIDkKLSAgICAjCi0gICAgIyBTaXRlcyB3aXRoIHBhcnRpY3VsYXIgdmVyYm9zZSBvcydzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gc2l0ZS5leHAuCi0gICAgIwotICAgIHByb2MgcHJ1bmVfd2FybmluZ3MgeyB0ZXh0IH0gewotCSMgVGhpcyBpcyBmcm9tIHN1bjQncy4gIERvIGl0IGZvciBhbGwgbWFjaGluZXMgZm9yIG5vdy4KLQkjIFRoZSAiXFwxIiBpcyB0byB0cnkgdG8gcHJlc2VydmUgYSAiXG4iIGJ1dCBvbmx5IGlmIG5lY2Vzc2FyeS4KLQlyZWdzdWIgLWFsbCAiKF58XG4pKGxkLnNvOiB3YXJuaW5nOlxbXlxuXF0qXG4/KSsiICR0ZXh0ICJcXDEiIHRleHQKLQotCSMgSXQgbWlnaHQgYmUgdGVtcHRpbmcgdG8gZ2V0IGNhcnJpZWQgYXdheSBhbmQgZGVsZXRlIGJsYW5rIGxpbmVzLCBldGMuCi0JIyBKdXN0IGRlbGV0ZSAqZXhhY3RseSogd2hhdCB3ZSdyZSBhc2sgdG8sIGFuZCB0aGF0J3MgaXQuCi0JcmV0dXJuICR0ZXh0Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRnLmV4cCBiL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjdmMzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRnLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMgRGVmaW5lIGdhcyBjYWxsYmFja3MgZm9yIGRnLmV4cC4KLQotbG9hZF9saWIgZGcuZXhwCi0KLSMgVGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHN0aWxsIGluIGEgYml0IG9mIGZsdXguCi0jIEl0IHNob3VsZCBiZSB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIGFzc2VtYmxlLCBsaW5rLCBhbmQgcnVuIGEgZmlsZQotIyBidXQgd2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgdGhhdC4gIEFzc2VtYmxlciB0ZXN0Y2FzZXMgYXJlbid0IHVzdWFsbHkKLSMgdGhhdCBlbGFib3JhdGUgYW55d2F5LiAgOi0pCi0KLXByb2MgZ2FzLWRnLXRlc3QgeyBwcm9nIGRvX3doYXQgdG9vbF9mbGFncyB9IHsKLSAgICAjIEZJWE1FOiB0aGUgZ2FzIHRlc3RzdWl0ZSBkb2Vzbid0IGRlZmluZSB0bXBkaXIuICBVc2Ugb3V0ZGlyPwotICAgIHNldCBvdXRwdXRfZmlsZSAiLi9hLm91dCIKLQotICAgIHN3aXRjaCAkZG9fd2hhdCB7Ci0JInByZXByb2Nlc3MiIHsKLQl9Ci0JImFzc2VtYmxlIiB7Ci0JfQotCSJsaW5rIiB7Ci0JfQotCSJydW4iIHsKLQkgICAgIyBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGNhcmUgaWYgYW4gZXhlY3V0YWJsZSB3YXMKLQkgICAgIyBjcmVhdGVkIG9yIG5vdC4gIElmIGl0IHdhcywgZGcuZXhwIHdpbGwgdHJ5IHRvIHJ1biBpdC4KLQkgICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG91dHB1dF9maWxlIgotCX0KLQlkZWZhdWx0IHsKLQkgICAgcGVycm9yICIkZG9fd2hhdDogbm90IGEgdmFsaWQgZGctZG8ga2V5d29yZCIKLQkgICAgcmV0dXJuICIiCi0JfQotICAgIH0KLQotICAgICMgZ2FzX3N0YXJ0IHByZXBlbmRzICRzcmNkaXIvJHN1YmRpciBzbyB3ZSBtdXN0IHJlbW92ZSBpdCBmcm9tIFBST0cKLSAgICAjIGlmIHByZXNlbnQuICBGaXJzdCByZW1vdmUgZXh0cmFuZW91cyAvLydzLgotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gICAgc2V0IGRpciAiJHNyY2Rpci8kc3ViZGlyIgotICAgIHJlZ3N1YiAtYWxsICIvLyIgJGRpciAiLyIgZGlyCi0gICAgcmVnc3ViIC1hbGwgIi8vIiAkcHJvZyAiLyIgcHJvZwotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiRkaXIvKiIgJHByb2ddIHsKLQlyZWdzdWIgIiRkaXIiICRwcm9nICIiIHByb2cKLSAgICB9Ci0KLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBnYXNfc3RhcnQgYnV0IGl0IGRvZXNuJ3Qgc2V0IGNvbXBfb3V0cHV0LgotICAgIHJldHVybiBbZ2FzX3J1biAkcHJvZyAkdG9vbF9mbGFncyAiIl0KLX0KLQotcHJvYyBnYXMtZGctcHJ1bmUgeyBzeXN0ZW0gdGV4dCB9IHsKLSAgICAjc2VuZF91c2VyICJCZWZvcmU6JHRleHRcbiIKLSAgICByZWdzdWIgLWFsbCAiKF58XG4pXFteXG5cXSo6IEFzc2VtYmxlciBtZXNzYWdlczpcW15cblxdKiIgJHRleHQgIiIgdGV4dAotICAgIHJlZ3N1YiAtYWxsICIoXnxcbilcW15cblxdKjogRW5kIG9mIGZpbGUgbm90IGF0IGVuZFxbXlxuXF0qTmV3bGluZSBpbnNlcnRlZC4iICR0ZXh0ICIiIHRleHQKLSAgICAjc2VuZF91c2VyICJBZnRlcjokdGV4dFxuIgotCi0gICAgcmV0dXJuICR0ZXh0Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9ydW4gYi9nYXMvdGVzdHN1aXRlL2xpYi9ydW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0MTUwZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvcnVuCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV2YWwgZXhlYyAkQApkaWZmIC0tZ2l0IGEvZ2FzL3Ztc2NvbmYuc2ggYi9nYXMvdm1zY29uZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0NTM4YS4uMDAwMDAwMAotLS0gYS9nYXMvdm1zY29uZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIS9iaW4vc2gKLQotY2F0IDw8ICdFT0YnCi0kIW1ha2UtZ2FzLmNvbQotJCEgU2V0IHRoZSBkZWYgZGlyIHRvIHByb3BlciBwbGFjZSBmb3IgdXNlIGluIGJhdGNoLiBXb3JrcyBmb3IgaW50ZXJhY3RpdmUgdG8uCi0kZmxubSA9IGYkZW52aXJvbWVudCgiUFJPQ0VEVVJFIikgICAgICEgZ2V0IGN1cnJlbnQgcHJvY2VkdXJlIG5hbWUKLSRzZXQgZGVmYXVsdCAnZiRwYXJzZShmbG5tLCwsIkRFVklDRSIpJydmJHBhcnNlKGZsbm0sLCwiRElSRUNUT1JZIiknCi0kdiA9ICdmJHZlcmlmeSgwKScKLSQhCi0kIQlDb21tYW5kIGZpbGUgdG8gYnVpbGQgYSBHTlUgYXNzZW1ibGVyIG9uIFZNUwotJCEKLSQhCUlmIHlvdSBhcmUgdXNpbmcgYSB2ZXJzaW9uIG9mIEdDQyB0aGF0IHN1cHBvcnRzIGdsb2JhbCBjb25zdGFudHMKLSQhCXlvdSBzaG91bGQgcmVtb3ZlIHRoZSBkZWZpbmU9ImNvbnN0PSIgZnJvbSB0aGUgZ2NjIGxpbmVzLgotJCEKLSQhCUNhdXRpb246ICBWZXJzaW9ucyAxLjM4LjEgYW5kIGVhcmxpZXIgaGFkIGEgYnVnIGluIHRoZSBoYW5kbGluZyBvZgotJCEJc29tZSBzdGF0aWMgY29uc3RhbnRzLiBJZiB5b3UgYXJlIHVzaW5nIHN1Y2ggYSB2ZXJzaW9uIG9mIHRoZQotJCEJYXNzZW1ibGVyLCBhbmQgeW91IHdpc2ggdG8gY29tcGlsZSB3aXRob3V0IHRoZSAiY29uc3Q9IiBoYWNrLAotJCEJeW91IHNob3VsZCBmaXJzdCBidWlsZCB0aGlzIHZlcnNpb24gKndpdGgqIHRoZSAiY29uc3Q9IgotJCEJZGVmaW5pdGlvbiwgYW5kIHRoZW4gdXNlIHRoYXQgYXNzZW1ibGVyIHRvIHJlYnVpbGQgaXQgd2l0aG91dCB0aGUKLSQhCSJjb25zdD0iIGRlZmluaXRpb24uICBGYWlsdXJlIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gYXNzZW1ibGVyCi0kIQl0aGF0IHdpbGwgbXVuZyBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0kIQotJCEJTm90ZTogVGhlIHZlcnNpb24gb2YgZ2FzIHNoaXBwZWQgb24gdGhlIEdDQyBWTVMgdGFwZXMgaGFzIGJlZW4gcGF0Y2hlZAotJCEJdG8gZml4IHRoZSBhYm92ZSBtZW50aW9uZWQgYnVnLgotJCEKLSQJIVRoZSBnY2Mtdm1zIGRyaXZlciB3YXMgbW9kaWZpZWQgdG8gdXNlIGAtMScgcXVpdGUgc29tZSB0aW1lIGFnbywKLSQJIXNvIGRvbid0IGVjaG8gdGhpcyB0ZXh0IGFueSBtb3JlLi4uCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJJZiB0aGlzIGFzc2VtYmxlciBpcyBnb2luZyB0byBiZSB1c2VkIHdpdGggR0NDIDEubiwgeW91IgotJCAhd3JpdGUgc3lzJG91dHB1dCAibmVlZCB0byBtb2RpZnkgdGhlIGRyaXZlciB0byBzdXBwbHkgdGhlIC0xIHN3aXRjaCB0byBnYXMuIgotJCAhd3JpdGUgc3lzJG91dHB1dCAiVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIGEgc21hbGwgY2hhbmdlIGluIGhvdyBnbG9iYWwiCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJjb25zdGFudCB2YXJpYWJsZXMgYXJlIGhhbmRsZWQuICBGYWlsdXJlIHRvIGluY2x1ZGUgdGhpcyIKLSQgIXdyaXRlIHN5cyRvdXRwdXQgIndpbGwgcmVzdWx0IGluIGxpbmtlciB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0IG1pc21hdGNoZWQKLSQgIXdyaXRlIHN5cyRvdXRwdXQgInBzZWN0IGF0dHJpYnV0ZXMuIgotJCEKLSQgZ2FzX2hvc3Q9InZtcyIKLSQgYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpCSEgdmF4PT0xLCBhbHBoYT09MgotJCBhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQgaWYgYXJjaC5lcXMuIlZBWCIKLSQgdGhlbgotJCAgY3B1X3R5cGU9InZheCIKLSQgIG9ial9mb3JtYXQ9InZtcyIKLSQgIGF0b2Y9InZheCIKLSQgZWxzZQotJCAgY3B1X3R5cGU9ImFscGhhIgotJCAgb2JqX2Zvcm1hdD0iZXZheCIKLSQgIGF0b2Y9ImllZWUiCi0kIGVuZGlmCi0kIGVtdWxhdGlvbj0iZ2VuZXJpYyIKLSQhCi0kCUNPUFkJPSAiY29weS9ub0xvZyIKLSQhCi0kIENfREVGUyA6PSIiIlZNUyIiIgotJCEgQ19ERUZTIDo9IiIiVk1TIiIiLCIiImNvbnN0PSIiIgotJCBDX0lOQ0xVREVTCT0gIi9JbmNsdWRlPShbXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy0uaW5jbHVkZS5hb3V0XSkiCi0kIENfRkxBR1MJPSAiL25vVmVyYm9zZS9EZWJ1ZyIgKyBjX2luY2x1ZGVzCi0kIQotJCEKLSQgb24gZXJyb3IgdGhlbiAgZ290byBiYWlsCi0kIGlmIGYkc2VhcmNoKCJbLS5saWJpYmVydHldbGliZXJ0eS5vbGIiKS5lcXMuIiIKLSQgdGhlbglAWy0ubGliaWJlcnR5XXZtc2J1aWxkLmNvbQotJAl3cml0ZSBzeXMkb3V0cHV0ICJOb3cgYnVpbGRpbmcgZ2FzLiIKLSQgZW5kaWYKLSQgaWYgIicncDEnIiAuZXFzLiAiTElOSyIgdGhlbiBnb3RvIExpbmsKLSQhCi0kISAgVGhpcyBoZWxwcyBnY2MgMS5ubiBmaW5kIHRoZSBhb3V0LyogZmlsZXMuCi0kIQotJCBhb3V0X2RldiA9IGYkcGFyc2UoZmxubSwsLCJERVZJQ0UiKQotJCB0bXAgPSBhb3V0X2RldiAtICI6IgotJGlmIGYkdHJubG5tKHRtcCkubmVzLiIiIHRoZW4gYW91dF9kZXYgPSBmJHRybmxubSh0bXApCi0kIGFvdXRfZGlyID0gYW91dF9kZXYrZiRwYXJzZShmbG5tLCwsIkRJUkVDVE9SWSIpJyAtCi0JLSAiR0FTXSIgKyAiSU5DTFVERS5BT1VULl0iIC0gIl1bIgotJGFzc2lnbiAnYW91dF9kaXInIGFvdXQvdHJhbj1jb25jCi0kIG9wY29kZV9kaXIgPSBhb3V0X2RlditmJHBhcnNlKGZsbm0sLCwiRElSRUNUT1JZIiknIC0KLQktICJHQVNdIiArICJJTkNMVURFLk9QQ09ERS5dIiAtICJdWyIKLSRhc3NpZ24gJ29wY29kZV9kaXInIG9wY29kZS90cmFuPWNvbmMKLSQhCi0kIHNldCB2ZXJpZnkKLSQhCi0kIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykvT2JqZWN0PVtddGMtJ2NwdV90eXBlJy5vYmogWy5jb25maWdddGMtJ2NwdV90eXBlJy5jCi0kIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykvT2JqZWN0PVtdb2JqLSdvYmpfZm9ybWF0Jy5vYmogWy5jb25maWddb2JqLSdvYmpfZm9ybWF0Jy5jCi0kIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykvT2JqZWN0PVtdYXRvZi0nYXRvZicub2JqIFsuY29uZmlnXWF0b2YtJ2F0b2YnLmMKLUVPRgotCi1jZmlsZXM9ImBlY2hvICQqIHwgc2VkIC1lICdzL1wuby8uYy9nJyAtZSAncyEuLi9cKFteIC9dKlwpL1woW14gL10qXC5jXCkhWy0uXDFdXDIhZydgIgotCi1mb3IgY2ZpbGUgaW4gJGNmaWxlcyA7IGRvCi0gIGNhc2UgJGNmaWxlIGluCi0gICAgIlstLiIqKQotCWJhc2U9YGVjaG8gJGNmaWxlIHwgc2VkIC1lICdzL1xbLipcXS8vJyAtZSAncy9cLmMkLy8nYAotCWVjaG8gIlwkIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykvT2JqZWN0PVtdJGJhc2Uub2JqICRjZmlsZSIKLQk7OwotICAgICopCi0JZWNobyAiXCQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKSAkY2ZpbGUiCi0JOzsKLSAgZXNhYwotZG9uZQotCi1jYXQgPDwgJ0VPRicKLSRsaW5rOgotJCEnZiR2ZXJpZnkoMCknCi0kIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kIGNyZWF0ZSBnY2MtYXMub3B0Ci0hCi0hCUxpbmtlciBvcHRpb25zIGZpbGUgZm9yIEdOVSBhc3NlbWJsZXIKLSEKLSQgb3Blbi9BcHBlbmQgaWZpbGUkIGdjYy1hcy5vcHQKLSQgd3JpdGUgaWZpbGUkICJ0Yy0nJ2NwdV90eXBlJy5vYmoiCi0kIHdyaXRlIGlmaWxlJCAib2JqLScnb2JqX2Zvcm1hdCcub2JqIgotJCB3cml0ZSBpZmlsZSQgImF0b2YtJydhdG9mJy5vYmoiCi0kIENPUFkgc3lzJGlucHV0OiBpZmlsZSQ6Ci1FT0YKLQotZm9yIG9iaiBpbiAkKiA7IGRvCi0gICMgQ2hhbmdlICJmb28ubyIgaW50byAiZm9vLm9iaiIuCi0gIGVjaG8gJHtvYmp9YmosLSB8IHNlZCAncyEuKi8hIWcnCi1kb25lCi0KLWNhdCA8PCAnRU9GJwotWy0ubGliaWJlcnR5XWxpYmVydHkub2xiL0xpYgotZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9MaWIsc3lzJGxpYnJhcnk6dmF4Y3J0bC5vbGIvTGliCi0hIFRlbGwgbGlua2VyIGV4YWN0bHkgd2hhdCBwc2VjdCBhdHRyaWJ1dGVzIHdlIHdhbnQgLS0gbWF0Y2ggVkFYQ1JUTC4KLXBzZWN0X2F0dHI9RU5WSVJPTixsb25nLHBpYyxvdnIscmVsLGdibCxub3Nocixub2V4ZSxyZCx3cnQKLSQgY2xvc2UgaWZpbGUkCi0kIHNldCB2ZXJpZnk9KFByb2Msbm9JbWFnKQotJCBsaW5rL25vTWFwL0V4ZWM9Z2NjLWFzLmV4ZSBnY2MtYXMub3B0L09wdCx2ZXJzaW9uLm9wdC9PcHQKLSQhCi0kYmFpbDogZXhpdCAkc3RhdHVzICsgMCpmJHZlcmlmeSh2KQkhJ2YkdmVyaWZ5KDApJwotRU9GCmRpZmYgLS1naXQgYS9nYXMvd3JpdGUuYyBiL2dhcy93cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzg2ZWNlLi4wMDAwMDAwCi0tLSBhL2dhcy93cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg3NyArMCwwIEBACi0vKiB3cml0ZS5jIC0gZW1pdCAubyBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyB0aGluZyBzaG91bGQgYmUgc2V0IHVwIHRvIGRvIGJ5dGVvcmRlcmluZyBjb3JyZWN0bHkuICBCdXQuLi4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgotCi0vKiBUaGlzIGxvb2tzIGxpa2UgYSBnb29kIGlkZWEuICBMZXQncyB0cnkgdHVybmluZyBpdCBvbiBhbHdheXMsIGZvciBub3cuICAqLwotI3VuZGVmICBCRkRfRkFTVF9TRUNUSU9OX0ZJTEwKLSNkZWZpbmUgQkZEX0ZBU1RfU0VDVElPTl9GSUxMCi0KLS8qIFRoZSBOT1BfT1BDT0RFIGlzIGZvciB0aGUgYWxpZ25tZW50IGZpbGwgdmFsdWUuICBGaWxsIGl0IHdpdGggYSBub3AKLSAgIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciBkb2VzIG5vdCBjaG9rZSBvbiBpdC4gICovCi0jaWZuZGVmIE5PUF9PUENPREUKLSNkZWZpbmUgTk9QX09QQ09ERSAweDAwCi0jZW5kaWYKLQotI2lmbmRlZiBUQ19BREpVU1RfUkVMT0NfQ09VTlQKLSNkZWZpbmUgVENfQURKVVNUX1JFTE9DX0NPVU5UKEZJWFAsQ09VTlQpCi0jZW5kaWYKLQotI2lmbmRlZiBUQ19GT1JDRV9SRUxPQ0FUSU9OCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgMAotI2VuZGlmCi0KLSNpZm5kZWYgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTihGSVhQLFNFRykgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQotI2VuZGlmCi0KLSNpZm5kZWYJTURfUENSRUxfRlJPTV9TRUNUSU9OCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb20oRklYUCkKLSNlbmRpZgotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLWV4dGVybiBDT05TVCBpbnQgbWRfc2hvcnRfanVtcF9zaXplOwotZXh0ZXJuIENPTlNUIGludCBtZF9sb25nX2p1bXBfc2l6ZTsKLSNlbmRpZgotCi1pbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLXZvaWQgcHJpbnRfZml4dXAgUEFSQU1TICgoZml4UyAqKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZCByZW51bWJlcl9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLS8qIFdlIGdlbmVyYWxseSBhdHRhY2ggcmVsb2NzIHRvIGZyYWcgY2hhaW5zLiAgSG93ZXZlciwgYWZ0ZXIgd2UgaGF2ZQotICAgY2hhaW5lZCB0aGVzZSBhbGwgdG9nZXRoZXIgaW50byBhIHNlZ21lbnQsIGFueSByZWxvY3Mgd2UgYWRkIGFmdGVyCi0gICB0aGF0IG11c3QgYmUgYXR0YWNoZWQgdG8gYSBzZWdtZW50LiAgVGhpcyB3aWxsIGluY2x1ZGUgcmVsb2NzIGFkZGVkCi0gICBpbiBtZF9lc3RpbWF0ZV9zaXplX2Zvcl9yZWxheCwgZm9yIGV4YW1wbGUuICAqLwotc3RhdGljIGludCBmcmFnc19jaGFpbmVkID0gMDsKLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotI2lmbmRlZiBNQU5ZX1NFR01FTlRTCi1zdHJ1Y3QgZnJhZyAqdGV4dF9mcmFnX3Jvb3Q7Ci1zdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7Ci1zdHJ1Y3QgZnJhZyAqYnNzX2ZyYWdfcm9vdDsKLQotc3RydWN0IGZyYWcgKnRleHRfbGFzdF9mcmFnOwkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLXN0cnVjdCBmcmFnICpkYXRhX2xhc3RfZnJhZzsJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi1zdGF0aWMgc3RydWN0IGZyYWcgKmJzc19sYXN0X2ZyYWc7CS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgQkZECi1zdGF0aWMgb2JqZWN0X2hlYWRlcnMgaGVhZGVyczsKLSNlbmRpZgotCi1sb25nIHN0cmluZ19ieXRlX2NvdW50OwotY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsJLyogVHJhY2tzIG9iamVjdCBmaWxlIGJ5dGVzLiAqLwotCi0jaWZuZGVmIE9CSl9WTVMKLWludCBtYWdpY19udW1iZXJfZm9yX29iamVjdF9maWxlID0gREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLXN0YXRpYyBpbnQgbl9maXh1cHM7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgZml4UyAqZml4X25ld19pbnRlcm5hbCBQQVJBTVMgKChmcmFnUyAqLCBpbnQgd2hlcmUsIGludCBzaXplLAotCQkJCSAgICAgICBzeW1ib2xTICphZGQsIHN5bWJvbFMgKnN1YiwKLQkJCQkgICAgICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwKLQkJCQkgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZSkpOwotI2Vsc2UKLXN0YXRpYyBmaXhTICpmaXhfbmV3X2ludGVybmFsIFBBUkFNUyAoKGZyYWdTICosIGludCB3aGVyZSwgaW50IHNpemUsCi0JCQkJICAgICAgIHN5bWJvbFMgKmFkZCwgc3ltYm9sUyAqc3ViLAotCQkJCSAgICAgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLAotCQkJCSAgICAgICBpbnQgcl90eXBlKSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKE9CSl9WTVMpKQotc3RhdGljIGxvbmcgZml4dXBfc2VnbWVudCBQQVJBTVMgKChmaXhTICogZml4UCwgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZSkpOwotI2VuZGlmCi1zdGF0aWMgcmVsYXhfYWRkcmVzc1QgcmVsYXhfYWxpZ24gUEFSQU1TICgocmVsYXhfYWRkcmVzc1QgYWRkciwgaW50IGFsaWduKSk7Ci0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgISBkZWZpbmVkIChCRkQpCi1zdGF0aWMgZnJhZ1MgKmNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgUEFSQU1TICgoc2VnVCwgc3RydWN0IGZyY2hhaW4gKikpOwotI2VuZGlmCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQgY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIgUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOwotc3RhdGljIHZvaWQgY3Z0X2ZyYWdfdG9fZmlsbCBQQVJBTVMgKChzZWdULCBmcmFnUyAqKSk7Ci1zdGF0aWMgdm9pZCByZWxheF9hbmRfc2l6ZV9zZWcgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgYWRqdXN0X3JlbG9jX3N5bXMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHNldF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCEgZGVmaW5lZCAoQkZEKSAmJiAhIGRlZmluZWQgKE9CSl9BT1VUKSkKLXN0YXRpYyB2b2lkIG1lcmdlX2RhdGFfaW50b190ZXh0IFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgISBkZWZpbmVkIChCRkQpCi1zdGF0aWMgdm9pZCBjdnRfZnJhZ190b19maWxsIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICosIHNlZ1QsIGZyYWdTICopKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9zdWJzZWdzIFBBUkFNUyAoKGZyY2hhaW5TICosIGludCwgZnJhZ1MgKiosIGZyYWdTICoqKSk7Ci1zdGF0aWMgdm9pZCByZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLS8qCi0gKgkJCWZpeF9uZXcoKQotICoKLSAqIENyZWF0ZSBhIGZpeFMgaW4gb2JzdGFjayAnbm90ZXMnLgotICovCi1zdGF0aWMgZml4UyAqCi1maXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgc3ViX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwKLQkJICByX3R5cGUpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiwgb3IgNCB1c3VhbGx5LiAqLwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwkvKiBYX2FkZF9zeW1ib2wuICovCi0gICAgIHN5bWJvbFMgKnN1Yl9zeW1ib2w7CS8qIFhfb3Bfc3ltYm9sLiAqLwotICAgICBvZmZzZXRUIG9mZnNldDsJCS8qIFhfYWRkX251bWJlci4gKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2Vsc2UKLSAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2VuZGlmCi17Ci0gIGZpeFMgKmZpeFA7Ci0KLSAgbl9maXh1cHMrKzsKLQotICBmaXhQID0gKGZpeFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKGZpeFMpKTsKLQotICBmaXhQLT5meF9mcmFnID0gZnJhZzsKLSAgZml4UC0+Znhfd2hlcmUgPSB3aGVyZTsKLSAgZml4UC0+Znhfc2l6ZSA9IHNpemU7Ci0gIC8qIFdlJ3ZlIG1hZGUgZnhfc2l6ZSBhIG5hcnJvdyBmaWVsZDsgY2hlY2sgdGhhdCBpdCdzIHdpZGUgZW5vdWdoLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3NpemUgIT0gc2l6ZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImZpZWxkIGZ4X3NpemUgdG9vIHNtYWxsIHRvIGhvbGQgJWQiKSwgc2l6ZSk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbDsKLSAgZml4UC0+Znhfc3Vic3kgPSBzdWJfc3ltYm9sOwotICBmaXhQLT5meF9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGZpeFAtPmZ4X3BjcmVsID0gcGNyZWw7Ci0gIGZpeFAtPmZ4X3BsdCA9IDA7Ci0jaWYgZGVmaW5lZChORUVEX0ZYX1JfVFlQRSkgfHwgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgZml4UC0+Znhfcl90eXBlID0gcl90eXBlOwotI2VuZGlmCi0gIGZpeFAtPmZ4X2ltX2Rpc3AgPSAwOwotICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAwOwotICBmaXhQLT5meF9iaXRfZml4UCA9IDA7Ci0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IDA7Ci0gIGZpeFAtPmZ4X3RjYml0ID0gMDsKLSAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMDsKLSAgZml4UC0+Znhfc2lnbmVkID0gMDsKLQotI2lmZGVmIFVTSU5HX0NHRU4KLSAgZml4UC0+ZnhfY2dlbi5pbnNuID0gTlVMTDsKLSAgZml4UC0+ZnhfY2dlbi5vcGluZm8gPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19GSVhfVFlQRQotICBUQ19JTklUX0ZJWF9EQVRBKGZpeFApOwotI2VuZGlmCi0KLSAgYXNfd2hlcmUgKCZmaXhQLT5meF9maWxlLCAmZml4UC0+ZnhfbGluZSk7Ci0KLSAgLyogVXN1YWxseSwgd2Ugd2FudCByZWxvY3Mgc29ydGVkIG51bWVyaWNhbGx5LCBidXQgd2hpbGUKLSAgICAgY29tcGFyaW5nIHRvIG9sZGVyIHZlcnNpb25zIG9mIGdhcyB0aGF0IGhhdmUgcmVsb2NzCi0gICAgIHJldmVyc2Ugc29ydGVkLCBpdCBpcyBjb252ZW5pZW50IHRvIGhhdmUgdGhpcyBjb21waWxlCi0gICAgIHRpbWUgb3B0aW9uLiAgeG94b3JpY2guICovCi0KLSAgewotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgIGZpeFMgKipzZWdfZml4X3Jvb3RQID0gKGZyYWdzX2NoYWluZWQKLQkJCSAgICA/ICZzZWdfaW5mbyAobm93X3NlZyktPmZpeF9yb290Ci0JCQkgICAgOiAmZnJjaGFpbl9ub3ctPmZpeF9yb290KTsKLSAgICBmaXhTICoqc2VnX2ZpeF90YWlsUCA9IChmcmFnc19jaGFpbmVkCi0JCQkgICAgPyAmc2VnX2luZm8gKG5vd19zZWcpLT5maXhfdGFpbAotCQkJICAgIDogJmZyY2hhaW5fbm93LT5maXhfdGFpbCk7Ci0jZW5kaWYKLQotI2lmZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKLQotICAgIGZpeFAtPmZ4X25leHQgPSAqc2VnX2ZpeF9yb290UDsKLSAgICAqc2VnX2ZpeF9yb290UCA9IGZpeFA7Ci0KLSNlbHNlIC8qIFJFVkVSU0VfU09SVF9SRUxPQ1MgKi8KLQotICAgIGZpeFAtPmZ4X25leHQgPSBOVUxMOwotCi0gICAgaWYgKCpzZWdfZml4X3RhaWxQKQotICAgICAgKCpzZWdfZml4X3RhaWxQKS0+ZnhfbmV4dCA9IGZpeFA7Ci0gICAgZWxzZQotICAgICAgKnNlZ19maXhfcm9vdFAgPSBmaXhQOwotICAgICpzZWdfZml4X3RhaWxQID0gZml4UDsKLQotI2VuZGlmIC8qIFJFVkVSU0VfU09SVF9SRUxPQ1MgKi8KLQotICB9Ci0KLSAgcmV0dXJuIGZpeFA7Ci19Ci0KLS8qIENyZWF0ZSBhIGZpeHVwIHJlbGF0aXZlIHRvIGEgc3ltYm9sIChwbHVzIGEgY29uc3RhbnQpLiAgKi8KLQotZml4UyAqCi1maXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwgcl90eXBlKQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsJLyogWF9hZGRfc3ltYm9sLiAqLwotICAgICBvZmZzZXRUIG9mZnNldDsJCS8qIFhfYWRkX251bWJlci4gKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2Vsc2UKLSAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2VuZGlmCi17Ci0gIHJldHVybiBmaXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwKLQkJCSAgIChzeW1ib2xTICopIE5VTEwsIG9mZnNldCwgcGNyZWwsIHJfdHlwZSk7Ci19Ci0KLS8qIENyZWF0ZSBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBmaXh1cHMKLSAgIGZvciBkaWZmZXJlbmNlIGV4cHJlc3Npb25zLiAgVGhhdCBpcyBpdHNlbGYgbW9yZSB0aGFuIG1vc3Qgb2JqZWN0Ci0gICBmaWxlIGZvcm1hdHMgc3VwcG9ydCBhbnlob3cuICAqLwotCi1maXhTICoKLWZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwgcl90eXBlKQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsgLyogUmVsb2NhdGlvbiB0eXBlICovCi0jZWxzZQotICAgICBpbnQgcl90eXBlOwkJLyogUmVsb2NhdGlvbiB0eXBlICovCi0jZW5kaWYKLXsKLSAgc3ltYm9sUyAqYWRkID0gTlVMTDsKLSAgc3ltYm9sUyAqc3ViID0gTlVMTDsKLSAgb2Zmc2V0VCBvZmYgPSAwOwotCi0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fYWJzZW50OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fYWRkOgotICAgICAgLyogVGhpcyBjb21lcyB1cCB3aGVuIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXysoLi1MMCkgaXMgcmVhZCwgaWYKLQkgdGhlIGRpZmZlcmVuY2UgZXhwcmVzc2lvbiBjYW5ub3QgaW1tZWRpYXRlbHkgYmUgcmVkdWNlZC4gICovCi0gICAgICB7Ci0Jc3ltYm9sUyAqc3RtcCA9IG1ha2VfZXhwcl9zeW1ib2wgKGV4cCk7Ci0JZXhwLT5YX29wID0gT19zeW1ib2w7Ci0JZXhwLT5YX29wX3N5bWJvbCA9IDA7Ci0JZXhwLT5YX2FkZF9zeW1ib2wgPSBzdG1wOwotCWV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLQlyZXR1cm4gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLCByX3R5cGUpOwotICAgICAgfQotCi0gICAgY2FzZSBPX3N5bWJvbF9ydmE6Ci0gICAgICBhZGQgPSBleHAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIG9mZiA9IGV4cC0+WF9hZGRfbnVtYmVyOwotCi0jaWYgZGVmaW5lZChCRkRfQVNTRU1CTEVSKQotICAgICAgcl90eXBlID0gQkZEX1JFTE9DX1JWQTsKLSNlbHNlCi0jaWYgZGVmaW5lZChUQ19SVkFfUkVMT0MpCi0gICAgICByX3R5cGUgPSBUQ19SVkFfUkVMT0M7Ci0jZWxzZQotICAgICAgYXNfZmF0YWwoXygicnZhIG5vdCBzdXBwb3J0ZWQiKSk7Ci0jZW5kaWYKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fdW1pbnVzOgotICAgICAgc3ViID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0gICAgICBvZmYgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgc3ViID0gZXhwLT5YX29wX3N5bWJvbDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGFkZCA9IGV4cC0+WF9hZGRfc3ltYm9sOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgICovCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgb2ZmID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhZGQgPSBtYWtlX2V4cHJfc3ltYm9sIChleHApOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmaXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkLCBzdWIsIG9mZiwKLQkJCSAgIHBjcmVsLCByX3R5cGUpOwotfQotCi0vKiBBcHBlbmQgYSBzdHJpbmcgb250byBhbm90aGVyIHN0cmluZywgYnVtcGluZyB0aGUgcG9pbnRlciBhbG9uZy4gICovCi12b2lkCi1hcHBlbmQgKGNoYXJQUCwgZnJvbVAsIGxlbmd0aCkKLSAgICAgY2hhciAqKmNoYXJQUDsKLSAgICAgY2hhciAqZnJvbVA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotewotICAvKiBEb24ndCB0cnVzdCBtZW1jcHkoKSBvZiAwIGNoYXJzLiAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuOwotCi0gIG1lbWNweSAoKmNoYXJQUCwgZnJvbVAsIGxlbmd0aCk7Ci0gICpjaGFyUFAgKz0gbGVuZ3RoOwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLWludCBzZWN0aW9uX2FsaWdubWVudFtTRUdfTUFYSU1VTV9PUkRJTkFMXTsKLSNlbmRpZgotCi0vKgotICogVGhpcyByb3V0aW5lIHJlY29yZHMgdGhlIGxhcmdlc3QgYWxpZ25tZW50IHNlZW4gZm9yIGVhY2ggc2VnbWVudC4KLSAqIElmIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQgaXMgYWxpZ25lZCBvbiB0aGUgd29yc3QtY2FzZQotICogYm91bmRhcnksIGFsbCBvZiB0aGUgb3RoZXIgYWxpZ25tZW50cyB3aXRoaW4gaXQgd2lsbCB3b3JrLiAgQXQKLSAqIGxlYXN0IG9uZSBvYmplY3QgZm9ybWF0IHJlYWxseSB1c2VzIHRoaXMgaW5mby4KLSAqLwotdm9pZAotcmVjb3JkX2FsaWdubWVudCAoc2VnLCBhbGlnbikKLSAgICAgLyogU2VnbWVudCB0byB3aGljaCBhbGlnbm1lbnQgcGVydGFpbnMgKi8KLSAgICAgc2VnVCBzZWc7Ci0gICAgIC8qIEFsaWdubWVudCwgYXMgYSBwb3dlciBvZiAyIChlLmcuLCAxID0+IDItYnl0ZSBib3VuZGFyeSwgMiA9PiA0LWJ5dGUKLQlib3VuZGFyeSwgZXRjLikgICovCi0gICAgIGludCBhbGlnbjsKLXsKLSAgaWYgKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybjsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmICgodW5zaWduZWQgaW50KSBhbGlnbiA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkKLSAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgYWxpZ24pOwotI2Vsc2UKLSAgaWYgKGFsaWduID4gc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkKLSAgICBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddID0gYWxpZ247Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogUmVzZXQgdGhlIHNlY3Rpb24gaW5kaWNlcyBhZnRlciByZW1vdmluZyB0aGUgZ2FzIGNyZWF0ZWQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotcmVudW1iZXJfc2VjdGlvbnMgKGFiZmQsIHNlYywgY291bnRwYXJnKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGNvdW50cGFyZzsKLXsKLSAgaW50ICpjb3VudHAgPSAoaW50ICopIGNvdW50cGFyZzsKLQotICBzZWMtPmluZGV4ID0gKmNvdW50cDsKLSAgKysqY291bnRwOwotfQotCi0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICEgZGVmaW5lZCAoQkZEKQotCi1zdGF0aWMgZnJhZ1MgKgotY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSAoc2VjdGlvbiwgZnJjaHApCi0gICAgIHNlZ1Qgc2VjdGlvbjsKLSAgICAgc3RydWN0IGZyY2hhaW4gKmZyY2hwOwotewotICBmcmFnUyBkdW1teSwgKnByZXZfZnJhZyA9ICZkdW1teTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGZpeFMgZml4X2R1bW15LCAqcHJldl9maXggPSAmZml4X2R1bW15OwotI2VuZGlmCi0KLSAgZm9yICg7IGZyY2hwICYmIGZyY2hwLT5mcmNoX3NlZyA9PSBzZWN0aW9uOyBmcmNocCA9IGZyY2hwLT5mcmNoX25leHQpCi0gICAgewotICAgICAgcHJldl9mcmFnLT5mcl9uZXh0ID0gZnJjaHAtPmZyY2hfcm9vdDsKLSAgICAgIHByZXZfZnJhZyA9IGZyY2hwLT5mcmNoX2xhc3Q7Ci0gICAgICBhc3NlcnQgKHByZXZfZnJhZy0+ZnJfdHlwZSAhPSAwKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBpZiAoZnJjaHAtPmZpeF9yb290ICE9IChmaXhTICopIE5VTEwpCi0JewotCSAgaWYgKHNlZ19pbmZvIChzZWN0aW9uKS0+Zml4X3Jvb3QgPT0gKGZpeFMgKikgTlVMTCkKLQkgICAgc2VnX2luZm8gKHNlY3Rpb24pLT5maXhfcm9vdCA9IGZyY2hwLT5maXhfcm9vdDsKLQkgIHByZXZfZml4LT5meF9uZXh0ID0gZnJjaHAtPmZpeF9yb290OwotCSAgc2VnX2luZm8gKHNlY3Rpb24pLT5maXhfdGFpbCA9IGZyY2hwLT5maXhfdGFpbDsKLQkgIHByZXZfZml4ID0gZnJjaHAtPmZpeF90YWlsOwotCX0KLSNlbmRpZgotICAgIH0KLSAgYXNzZXJ0IChwcmV2X2ZyYWctPmZyX3R5cGUgIT0gMCk7Ci0gIHByZXZfZnJhZy0+ZnJfbmV4dCA9IDA7Ci0gIHJldHVybiBwcmV2X2ZyYWc7Ci19Ci0KLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1zdGF0aWMgdm9pZAotY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIgKGFiZmQsIHNlY3Rpb24sIHh4eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlZ1Qgc2VjdGlvbjsKLSAgICAgUFRSIHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqaW5mbzsKLQotICAvKiBCRkQgbWF5IGhhdmUgaW50cm9kdWNlZCBpdHMgb3duIHNlY3Rpb25zIHdpdGhvdXQgdXNpbmcKLSAgICAgc3Vic2VnX25ldywgc28gaXQgaXMgcG9zc2libGUgdGhhdCBzZWdfaW5mbyBpcyBOVUxMLiAgKi8KLSAgaW5mbyA9IHNlZ19pbmZvIChzZWN0aW9uKTsKLSAgaWYgKGluZm8gIT0gKHNlZ21lbnRfaW5mb190eXBlICopIE5VTEwpCi0gICBpbmZvLT5mcmNoYWluUC0+ZnJjaF9sYXN0Ci0gICAgID0gY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSAoc2VjdGlvbiwgaW5mby0+ZnJjaGFpblApOwotCi0gIC8qIE5vdyB0aGF0IHdlJ3ZlIGNoYWluZWQgdGhlIGZyYWdzIHRvZ2V0aGVyLCB3ZSBtdXN0IGFkZCBuZXcgZml4dXBzCi0gICAgIHRvIHRoZSBzZWdtZW50LCBub3QgdG8gdGhlIGZyYWcgY2hhaW4uICAqLwotICBmcmFnc19jaGFpbmVkID0gMTsKLX0KLQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLQotc3RhdGljIHZvaWQKLXJlbW92ZV9zdWJzZWdzIChoZWFkLCBzZWcsIHJvb3QsIGxhc3QpCi0gICAgIGZyY2hhaW5TICpoZWFkOwotICAgICBpbnQgc2VnOwotICAgICBmcmFnUyAqKnJvb3Q7Ci0gICAgIGZyYWdTICoqbGFzdDsKLXsKLSAgKnJvb3QgPSBoZWFkLT5mcmNoX3Jvb3Q7Ci0gICpsYXN0ID0gY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSAoc2VnLCBoZWFkKTsKLX0KLQotI2VuZGlmIC8qIEJGRCAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkCi1jdnRfZnJhZ190b19maWxsIChzZWMsIGZyYWdQKQotICAgICBzZWdUIHNlYzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotI2Vsc2UKLXN0YXRpYyB2b2lkCi1jdnRfZnJhZ190b19maWxsIChoZWFkZXJzUCwgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnNQOwotICAgICBzZWdUIHNlYzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotI2VuZGlmCi17Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCi0gICAgewotICAgIGNhc2UgcnNfYWxpZ246Ci0gICAgY2FzZSByc19hbGlnbl9jb2RlOgotICAgIGNhc2UgcnNfb3JnOgotICAgIGNhc2UgcnNfc3BhY2U6Ci0jaWZkZWYgSEFORExFX0FMSUdOCi0gICAgICBIQU5ETEVfQUxJR04gKGZyYWdQKTsKLSNlbmRpZgotICAgICAga25vdyAoZnJhZ1AtPmZyX25leHQgIT0gTlVMTCk7Ci0gICAgICBmcmFnUC0+ZnJfb2Zmc2V0ID0gKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzCi0JCQkgIC0gZnJhZ1AtPmZyX2FkZHJlc3MKLQkJCSAgLSBmcmFnUC0+ZnJfZml4KSAvIGZyYWdQLT5mcl92YXI7Ci0gICAgICBpZiAoZnJhZ1AtPmZyX29mZnNldCA8IDApCi0JewotCSAgYXNfYmFkX3doZXJlIChmcmFnUC0+ZnJfZmlsZSwgZnJhZ1AtPmZyX2xpbmUsCi0JCQlfKCJhdHRlbXB0IHRvIC5vcmcvLnNwYWNlIGJhY2t3YXJkcz8gKCVsZCkiKSwKLQkJCShsb25nKSBmcmFnUC0+ZnJfb2Zmc2V0KTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfZmlsbDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByc19sZWIxMjg6Ci0gICAgICB7Ci0JdmFsdWVUIHZhbHVlID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpOwotCWludCBzaXplOwotCi0Jc2l6ZSA9IG91dHB1dF9sZWIxMjggKGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeCwgdmFsdWUsCi0JCQkgICAgICBmcmFnUC0+ZnJfc3VidHlwZSk7Ci0KLQlmcmFnUC0+ZnJfZml4ICs9IHNpemU7Ci0JZnJhZ1AtPmZyX3R5cGUgPSByc19maWxsOwotCWZyYWdQLT5mcl92YXIgPSAwOwotCWZyYWdQLT5mcl9vZmZzZXQgPSAwOwotCWZyYWdQLT5mcl9zeW1ib2wgPSBOVUxMOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHJzX2NmYToKLSAgICAgIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyAoZnJhZ1ApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIG1kX2NvbnZlcnRfZnJhZyAoc3Rkb3V0cHV0LCBzZWMsIGZyYWdQKTsKLSNlbHNlCi0gICAgICBtZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnNQLCBzZWMsIGZyYWdQKTsKLSNlbmRpZgotCi0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9uZXh0ID09IE5VTEwKLQkgICAgICB8fCAoKG9mZnNldFQpIChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdQLT5mcl9hZGRyZXNzKQotCQkgID09IGZyYWdQLT5mcl9maXgpKTsKLQotICAgICAgLyoKLSAgICAgICAqIEFmdGVyIG1kX2NvbnZlcnRfZnJhZywgd2UgbWFrZSB0aGUgZnJhZyBpbnRvIGEgIi5zcGFjZSAwIi4KLSAgICAgICAqIE1kX2NvbnZlcnRfZnJhZygpIHNob3VsZCBzZXQgdXAgYW55IGZpeFNzIGFuZCBjb25zdGFudHMKLSAgICAgICAqIHJlcXVpcmVkLgotICAgICAgICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLSAgICAgIGJyZWFrOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICBjYXNlIHJzX2Jyb2tlbl93b3JkOgotICAgICAgewotCXN0cnVjdCBicm9rZW5fd29yZCAqbGllOwotCi0JaWYgKGZyYWdQLT5mcl9zdWJ0eXBlKQotCSAgewotCSAgICBmcmFnUC0+ZnJfZml4ICs9IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQkgICAgZm9yIChsaWUgPSAoc3RydWN0IGJyb2tlbl93b3JkICopIChmcmFnUC0+ZnJfc3ltYm9sKTsKLQkJIGxpZSAmJiBsaWUtPmRpc3BmcmFnID09IGZyYWdQOwotCQkgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQotCSAgICAgIGlmIChsaWUtPmFkZGVkID09IDEpCi0JCWZyYWdQLT5mcl9maXggKz0gbWRfbG9uZ19qdW1wX3NpemU7Ci0JICB9Ci0JZnJhZ193YW5lIChmcmFnUCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhZGVmaW5lZCAoQkZEKSAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQKLXJlbGF4X2FuZF9zaXplX3NlZyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgZnJhZ1MgKmZyYWdwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgaW50IHg7Ci0gIHZhbHVlVCBzaXplLCBuZXdzaXplOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0KLSAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYyk7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBpZiAoc2VnaW5mbyAmJiBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICB7Ci0gICAgICByZWxheF9zZWdtZW50IChzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290LCBzZWMpOwotICAgICAgZm9yIChmcmFncCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7IGZyYWdwOyBmcmFncCA9IGZyYWdwLT5mcl9uZXh0KQotCWN2dF9mcmFnX3RvX2ZpbGwgKHNlYywgZnJhZ3ApOwotICAgICAgZm9yIChmcmFncCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0JICAgZnJhZ3AtPmZyX25leHQ7Ci0JICAgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dCkKLQkvKiB3YWxrIHRvIGxhc3QgZWx0ICovOwotICAgICAgc2l6ZSA9IGZyYWdwLT5mcl9hZGRyZXNzICsgZnJhZ3AtPmZyX2ZpeDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzaXplID0gMDsKLQotICBpZiAoc2l6ZSA+IDAgJiYgISBzZWdpbmZvLT5ic3MpCi0gICAgZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotICAvKiBAQCBUaGlzIGlzIGp1c3QgYW4gYXBwcm94aW1hdGlvbi4gICovCi0gIGlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZpeF9yb290KQotICAgIGZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgZWxzZQotICAgIGZsYWdzICY9IH5TRUNfUkVMT0M7Ci0gIHggPSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpOwotICBhc3NlcnQgKHggPT0gdHJ1ZSk7Ci0KLSAgbmV3c2l6ZSA9IG1kX3NlY3Rpb25fYWxpZ24gKHNlYywgc2l6ZSk7Ci0gIHggPSBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBuZXdzaXplKTsKLSAgYXNzZXJ0ICh4ID09IHRydWUpOwotCi0gIC8qIElmIHRoZSBzaXplIGhhZCB0byBiZSByb3VuZGVkIHVwLCBhZGQgc29tZSBwYWRkaW5nIGluIHRoZSBsYXN0Ci0gICAgIG5vbi1lbXB0eSBmcmFnLiAgKi8KLSAgYXNzZXJ0IChuZXdzaXplID49IHNpemUpOwotICBpZiAoc2l6ZSAhPSBuZXdzaXplKQotICAgIHsKLSAgICAgIGZyYWdTICpsYXN0ID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfbGFzdDsKLSAgICAgIGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgICAgIHdoaWxlIChmcmFncC0+ZnJfbmV4dCAhPSBsYXN0KQotCWZyYWdwID0gZnJhZ3AtPmZyX25leHQ7Ci0gICAgICBsYXN0LT5mcl9hZGRyZXNzID0gc2l6ZTsKLSAgICAgIGZyYWdwLT5mcl9vZmZzZXQgKz0gbmV3c2l6ZSAtIHNpemU7Ci0gICAgfQotCi0jaWZkZWYgdGNfZnJvYl9zZWN0aW9uCi0gIHRjX2Zyb2Jfc2VjdGlvbiAoc2VjKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX3NlY3Rpb24KLSAgb2JqX2Zyb2Jfc2VjdGlvbiAoc2VjKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgREVCVUcyCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX3JlbG9jcyAoYWJmZCwgc2VjLCBzdHJlYW1fKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY2hhciAqc3RyZWFtXzsKLXsKLSAgRklMRSAqc3RyZWFtID0gKEZJTEUgKikgc3RyZWFtXzsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgZml4UyAqZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OwotCi0gIGlmICghZml4cCkKLSAgICByZXR1cm47Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCAic2VjICVzIHJlbG9jczpcbiIsIHNlYy0+bmFtZSk7Ci0gIHdoaWxlIChmaXhwKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnMgPSBmaXhwLT5meF9hZGRzeTsKLQotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiICAlMDhseDogdHlwZSAlZCAiLCAodW5zaWduZWQgbG9uZykgZml4cCwKLQkgICAgICAgKGludCkgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JZnByaW50ZiAoc3RyZWFtLCAibm8gc3ltXG4iKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludF9zeW1ib2xfdmFsdWVfMSAoc3RyZWFtLCBzKTsKLQkgIGZwcmludGYgKHN0cmVhbSwgIlxuIik7Ci0JfQotICAgICAgZml4cCA9IGZpeHAtPmZ4X25leHQ7Ci0gICAgfQotfQotI2Vsc2UKLSNkZWZpbmUgZHVtcF9zZWN0aW9uX3JlbG9jcyhBQkZELFNFQyxTVFJFQU0pCSgodm9pZCkgMCkKLSNlbmRpZgotCi0jaWZuZGVmIEVNSVRfU0VDVElPTl9TWU1CT0xTCi0jZGVmaW5lIEVNSVRfU0VDVElPTl9TWU1CT0xTIDEKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3JlbG9jX3N5bXMgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBmaXhTICpmaXhwOwotCi0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGR1bXBfc2VjdGlvbl9yZWxvY3MgKGFiZmQsIHNlYywgc3RkZXJyKTsKLQotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0gICAgICAvKiBpZ25vcmUgaXQgKi87Ci0gICAgZWxzZSBpZiAoZml4cC0+ZnhfYWRkc3kpCi0gICAgICB7Ci0Jc3ltYm9sUyAqc3ltOwotCWFzZWN0aW9uICpzeW1zZWM7Ci0KLSNpZmRlZiBERUJVRzUKLQlmcHJpbnRmIChzdGRlcnIsICJcblxuYWRqdXN0aW5nIGZpeHVwOlxuIik7Ci0JcHJpbnRfZml4dXAgKGZpeHApOwotI2VuZGlmCi0KLQlzeW0gPSBmaXhwLT5meF9hZGRzeTsKLQotCS8qIEFsbCBzeW1ib2xzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBhdCB0aGlzCi0JICAgcG9pbnQuICBJdCBpcyBwb3NzaWJsZSB0byBzZWUgdW5yZXNvbHZlZCBleHByZXNzaW9uCi0JICAgc3ltYm9scywgdGhvdWdoLCBzaW5jZSB0aGV5IGFyZSBub3QgaW4gdGhlIHJlZ3VsYXIgc3ltYm9sCi0JICAgdGFibGUuICAqLwotCWlmIChzeW0gIT0gTlVMTCkKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW0sIDEpOwotCQotCWlmIChmaXhwLT5meF9zdWJzeSAhPSBOVUxMKQotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZpeHAtPmZ4X3N1YnN5LCAxKTsKLQotCS8qIElmIHRoaXMgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCwgY29udmVydAotICAgICAgICAgICB0aGUgZml4dXAgdG8gYmVpbmcgYWdhaW5zdCB0aGF0IHN5bWJvbC4gICovCi0JaWYgKHN5bSAhPSBOVUxMICYmIHN5bWJvbF9lcXVhdGVkX3AgKHN5bSkKLQkgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQkgIHsKLQkgICAgZml4cC0+Znhfb2Zmc2V0ICs9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfbnVtYmVyOwotCSAgICBzeW0gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX3N5bWJvbDsKLQkgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0JICB9Ci0KLQlpZiAoc3ltICE9IE5VTEwgJiYgc3ltYm9sX21yaV9jb21tb25fcCAoc3ltKSkKLQkgIHsKLQkgICAgLyogVGhlc2Ugc3ltYm9scyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgaW4gZml4dXBfc2VnbWVudC4gICovCi0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLQotCXN5bXNlYyA9IFNfR0VUX1NFR01FTlQgKHN5bSk7Ci0KLQlpZiAoc3ltc2VjID09IE5VTEwpCi0JICBhYm9ydCAoKTsKLQkKLQlpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1zZWMpKQotCSAgewotCSAgICAvKiBUaGUgZml4dXBfc2VnbWVudCByb3V0aW5lIHdpbGwgbm90IHVzZSB0aGlzIHN5bWJvbCBpbiBhCi0gICAgICAgICAgICAgICByZWxvY2F0aW9uIHVubGVzcyBUQ19GT1JDRV9SRUxPQ0FUSU9OIHJldHVybnMgMS4gICovCi0JICAgIGlmIChUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhwKSkKLQkgICAgICB7Ci0JCXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLSNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSwotCQlpZiAoZml4cC0+Znhfc3Vic3kgIT0gTlVMTCkKLQkJICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9zdWJzeSk7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLQotCS8qIElmIGl0J3Mgb25lIG9mIHRoZXNlIHNlY3Rpb25zLCBhc3N1bWUgdGhlIHN5bWJvbCBpcwotCSAgIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgb3V0cHV0LiAgVGhlIGNvZGUgaW4KLQkgICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBpbiB0Yy1taXBzLmMgdXNlcyB0aGlzIHRlc3QKLQkgICBhcyB3ZWxsLCBzbyBpZiB5b3UgY2hhbmdlIHRoaXMgY29kZSB5b3Ugc2hvdWxkIGxvb2sgYXQgdGhhdAotCSAgIGNvZGUuICAqLwotCWlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bXNlYykKLQkgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1zZWMpKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0jaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLQkgICAgLyogV2UgaGF2ZSB0aGUgZGlmZmVyZW5jZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sIGFuZCBzb21lCi0JICAgICAgIG90aGVyIHN5bWJvbC4gIE1ha2Ugc3VyZSB0byBtYXJrIHRoZSBvdGhlciBzeW1ib2wgYXMgdXNlZAotCSAgICAgICBpbiBhIHJlbG9jYXRpb24gc28gdGhhdCBpdCB3aWxsIGFsd2F5cyBiZSBvdXRwdXQuICAqLwotCSAgICBpZiAoZml4cC0+Znhfc3Vic3kpCi0JICAgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+Znhfc3Vic3kpOwotI2VuZGlmCi0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLQotCS8qIERvbid0IHRyeSB0byByZWR1Y2UgcmVsb2NzIHdoaWNoIHJlZmVyIHRvIG5vbi1sb2NhbCBzeW1ib2xzCi0gICAgICAgICAgIGluIC5saW5rb25jZSBzZWN0aW9ucy4gIEl0IGNhbiBsZWFkIHRvIGNvbmZ1c2lvbiB3aGVuIGEKLSAgICAgICAgICAgZGVidWdnaW5nIHNlY3Rpb24gcmVmZXJzIHRvIGEgLmxpbmtvbmNlIHNlY3Rpb24uICBJIGhvcGUKLSAgICAgICAgICAgdGhpcyB3aWxsIGFsd2F5cyBiZSBjb3JyZWN0LiAgKi8KLQlpZiAoc3ltc2VjICE9IHNlYyAmJiAhIFNfSVNfTE9DQUwgKHN5bSkpCi0JICB7Ci0JICAgIGJvb2xlYW4gbGlua29uY2U7Ci0KLQkgICAgbGlua29uY2UgPSBmYWxzZTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHN5bXNlYykgJiBTRUNfTElOS19PTkNFKQotCQkhPSAwKQotCSAgICAgIGxpbmtvbmNlID0gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLQkgICAgLyogVGhlIEdOVSB0b29sY2hhaW4gdXNlcyBhbiBleHRlbnNpb24gZm9yIEVMRjogYSBzZWN0aW9uCi0gICAgICAgICAgICAgICBiZWdpbm5pbmcgd2l0aCB0aGUgbWFnaWMgc3RyaW5nIC5nbnUubGlua29uY2UgaXMgYQotICAgICAgICAgICAgICAgbGlua29uY2Ugc2VjdGlvbi4gICovCi0JICAgIGlmIChzdHJuY21wIChzZWdtZW50X25hbWUgKHN5bXNlYyksICIuZ251LmxpbmtvbmNlIiwKLQkJCSBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkKLQkgICAgICBsaW5rb25jZSA9IHRydWU7Ci0jZW5kaWYKLQotCSAgICBpZiAobGlua29uY2UpCi0JICAgICAgewotCQlzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0jaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLQkJaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwpCi0JCSAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+Znhfc3Vic3kpOwotI2VuZGlmCi0JCWdvdG8gZG9uZTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBTaW5jZSB3ZSdyZSByZWR1Y2luZyB0byBzZWN0aW9uIHN5bWJvbHMsIGRvbid0IGF0dGVtcHQgdG8gcmVkdWNlCi0JICAgYW55dGhpbmcgdGhhdCdzIGFscmVhZHkgdXNpbmcgb25lLiAgKi8KLQlpZiAoc3ltYm9sX3NlY3Rpb25fcCAoc3ltKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JLyogV2UgY2FuIG5ldmVyIGFkanVzdCBhIHJlbG9jIGFnYWluc3QgYSB3ZWFrIHN5bWJvbC4gIElmIHdlCi0gICAgICAgICAgIGRpZCwgYW5kIHRoZSB3ZWFrIHN5bWJvbCB3YXMgb3ZlcnJpZGRlbiBieSBhIHJlYWwgc3ltYm9sCi0gICAgICAgICAgIHNvbWV3aGVyZSBlbHNlLCB0aGVuIG91ciByZWxvY2F0aW9uIHdvdWxkIGJlIHBvaW50aW5nIGF0Ci0gICAgICAgICAgIHRoZSB3cm9uZyBhcmVhIG9mIG1lbW9yeS4gICovCi0JaWYgKFNfSVNfV0VBSyAoc3ltKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0jZW5kaWYKLQotCS8qIElzIHRoZXJlIHNvbWUgb3RoZXIgcmVhc29uIHdlIGNhbid0IGFkanVzdCB0aGlzIG9uZT8gIChFLmcuLAotCSAgIGNhbGwvYmFsIGxpbmtzIGluIGk5NjAtYm91dCBzeW1ib2xzLikgICovCi0jaWZkZWYgb2JqX2ZpeF9hZGp1c3RhYmxlCi0JaWYgKCEgb2JqX2ZpeF9hZGp1c3RhYmxlIChmaXhwKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0jZW5kaWYKLQotCS8qIElzIHRoZXJlIHNvbWUgb3RoZXIgKHRhcmdldCBjcHUgZGVwZW5kZW50KSByZWFzb24gd2UgY2FuJ3QgYWRqdXN0Ci0JICAgdGhpcyBvbmU/ICAoRS5nLiByZWxvY2F0aW9ucyBpbnZvbHZpbmcgZnVuY3Rpb24gYWRkcmVzc2VzIG9uCi0JICAgdGhlIFBBLiAgKi8KLSNpZmRlZiB0Y19maXhfYWRqdXN0YWJsZQotCWlmICghIHRjX2ZpeF9hZGp1c3RhYmxlIChmaXhwKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0jZW5kaWYKLQotCS8qIElmIHRoZSBzZWN0aW9uIHN5bWJvbCBpc24ndCBnb2luZyB0byBiZSBvdXRwdXQsIHRoZSByZWxvY3MKLQkgICBhdCBsZWFzdCBzaG91bGQgc3RpbGwgd29yay4gIElmIG5vdCwgZmlndXJlIG91dCB3aGF0IHRvIGRvCi0JICAgd2hlbiB3ZSBydW4gaW50byB0aGF0IGNhc2UuCi0KLQkgICBXZSByZWZldGNoIHRoZSBzZWdtZW50IHdoZW4gY2FsbGluZyBzZWN0aW9uX3N5bWJvbCwgcmF0aGVyCi0JICAgdGhhbiB1c2luZyBzeW1zZWMsIGJlY2F1c2UgU19HRVRfVkFMVUUgbWF5IHdpbmQgdXAgY2hhbmdpbmcKLQkgICB0aGUgc2VjdGlvbiB3aGVuIGl0IGNhbGxzIHJlc29sdmVfc3ltYm9sX3ZhbHVlLiAqLwotCWZpeHAtPmZ4X29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltKTsKLQlmaXhwLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChTX0dFVF9TRUdNRU5UIChzeW0pKTsKLQlzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0jaWZkZWYgREVCVUc1Ci0JZnByaW50ZiAoc3RkZXJyLCAiXG5hZGp1c3RlZCBmaXh1cDpcbiIpOwotCXByaW50X2ZpeHVwIChmaXhwKTsKLSNlbmRpZgotCi0gICAgICBkb25lOgotCTsKLSAgICAgIH0KLSNpZiAxLypkZWYgUkVMT0NfUkVRVUlSRVNfU1lNQk9MKi8KLSAgICBlbHNlCi0gICAgICB7Ci0JLyogVGhlcmUgd2FzIG5vIHN5bWJvbCByZXF1aXJlZCBieSB0aGlzIHJlbG9jYXRpb24uICBIb3dldmVyLAotCSAgIEJGRCBkb2Vzbid0IHJlYWxseSBoYW5kbGUgcmVsb2NhdGlvbnMgd2l0aG91dCBzeW1ib2xzIHdlbGwuCi0JICAgKEF0IGxlYXN0LCB0aGUgQ09GRiBzdXBwb3J0IGRvZXNuJ3QuKSAgU28gZm9yIG5vdyB3ZSBmYWtlIHVwCi0JICAgYSBsb2NhbCBzeW1ib2wgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uICAqLwotCi0JZml4cC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0vKglmaXhwLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYyA9IDE7ICovCi0gICAgICB9Ci0jZW5kaWYKLQotICBkdW1wX3NlY3Rpb25fcmVsb2NzIChhYmZkLCBzZWMsIHN0ZGVycik7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9yZWxvY3MgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBuOwotICBhcmVsZW50ICoqcmVsb2NzOwotICBmaXhTICpmaXhwOwotICBjaGFyICplcnI7Ci0KLSAgLyogSWYgc2VnaW5mbyBpcyBOVUxMLCB3ZSBkaWQgbm90IGNyZWF0ZSB0aGlzIHNlY3Rpb247IGRvbid0IGRvCi0gICAgIGFueXRoaW5nIHdpdGggaXQuICAqLwotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmaXh1cF9zZWdtZW50IChzZWdpbmZvLT5maXhfcm9vdCwgc2VjKTsKLQotICBuID0gMDsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHA7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQotICAgIG4rKzsKLQotI2lmbmRlZiBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKLSAgLyogU2V0IHVwIHJlbG9jIGluZm9ybWF0aW9uIGFzIHdlbGwuICAqLwotICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAobiAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gIG1lbXNldCAoKGNoYXIqKXJlbG9jcywgMCwgbiAqIHNpemVvZiAoYXJlbGVudCopKTsKLQotICBpID0gMDsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHAgIT0gKGZpeFMgKikgTlVMTDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgczsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgbi0tOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIGVxdWF0ZWQgdG8gYW5vdGhlcgotICAgICAgICAgc3ltYm9sLCB0aGVuIHVzZSBnZW5lcmF0ZSB0aGUgcmVsb2MgYWdhaW5zdCB0aGUgbGF0dGVyIHN5bWJvbAotICAgICAgICAgcmF0aGVyIHRoYW4gdGhlIGZvcm1lci4gICovCi0gICAgICBzeW0gPSBmaXhwLT5meF9hZGRzeTsKLSAgICAgIHdoaWxlIChzeW1ib2xfZXF1YXRlZF9wIChzeW0pCi0JICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCXsKLQkgIHN5bWJvbFMgKm47Ci0KLQkgIC8qIFdlIG11c3QgYXZvaWQgbG9vcGluZywgYXMgdGhhdCBjYW4gb2NjdXIgd2l0aCBhIGJhZGx5Ci0JICAgICB3cml0dGVuIHByb2dyYW0uICAqLwotCSAgbiA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfc3ltYm9sOwotCSAgaWYgKG4gPT0gc3ltKQotCSAgICBicmVhazsKLQkgIGZpeHAtPmZ4X29mZnNldCArPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX251bWJlcjsKLQkgIHN5bSA9IG47Ci0JfQotICAgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0KLSAgICAgIHJlbG9jID0gdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApOwotICAgICAgaWYgKCFyZWxvYykKLQl7Ci0JICBuLS07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSNpZiAwCi0gICAgICAvKiBUaGlzIHRlc3QgaXMgdHJpZ2dlcmVkIGluYXBwcm9wcmlhdGVseSBmb3IgdGhlIFNILiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSArIGZpeHAtPmZ4X3NpemUKLQkgID4gZml4cC0+ZnhfZnJhZy0+ZnJfZml4ICsgZml4cC0+ZnhfZnJhZy0+ZnJfb2Zmc2V0KQotCWFib3J0ICgpOwotI2VuZGlmCi0KLSAgICAgIHMgPSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChzdGRvdXRwdXQsIHJlbG9jLAotCQkJCSAgZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkgIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkJICBzZWMsICZlcnIpOwotICAgICAgc3dpdGNoIChzKQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwgXygicmVsb2NhdGlvbiBvdXQgb2YgcmFuZ2UiKSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbjogJXgiKSwKLQkJICAgIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIHMpOwotCX0KLSAgICAgIHJlbG9jc1tpKytdID0gcmVsb2M7Ci0gICAgfQotI2Vsc2UKLSAgbiA9IG4gKiBNQVhfUkVMT0NfRVhQQU5TSU9OOwotICAvKiBTZXQgdXAgcmVsb2MgaW5mb3JtYXRpb24gYXMgd2VsbC4gICovCi0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChuICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQotICBpID0gMDsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHAgIT0gKGZpeFMgKikgTlVMTDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbG9jOwotICAgICAgY2hhciAqZGF0YTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzOwotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgaW50IGo7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9kb25lKQotCXsKLQkgIG4tLTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIHdhcyBlcXVhdGVkIHRvIGFub3RoZXIKLSAgICAgICAgIHN5bWJvbCwgdGhlbiB1c2UgZ2VuZXJhdGUgdGhlIHJlbG9jIGFnYWluc3QgdGhlIGxhdHRlciBzeW1ib2wKLSAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBmb3JtZXIuICAqLwotICAgICAgc3ltID0gZml4cC0+ZnhfYWRkc3k7Ci0gICAgICB3aGlsZSAoc3ltYm9sX2VxdWF0ZWRfcCAoc3ltKQotCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQlzeW0gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX3N5bWJvbDsKLSAgICAgIGZpeHAtPmZ4X2FkZHN5ID0gc3ltOwotCi0gICAgICByZWxvYyA9IHRjX2dlbl9yZWxvYyAoc2VjLCBmaXhwKTsKLQotICAgICAgZm9yIChqID0gMDsgcmVsb2Nbal07IGorKykKLQl7Ci0gICAgICAgICAgcmVsb2NzW2krK10gPSByZWxvY1tqXTsKLSAgICAgICAgICBhc3NlcnQoaSA8PSBuKTsKLQl9Ci0gICAgICBkYXRhID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICsgZml4cC0+Znhfc2l6ZQotCSAgPiBmaXhwLT5meF9mcmFnLT5mcl9maXggKyBmaXhwLT5meF9mcmFnLT5mcl9vZmZzZXQpCi0JYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgICBfKCJpbnRlcm5hbCBlcnJvcjogZml4dXAgbm90IGNvbnRhaW5lZCB3aXRoaW4gZnJhZyIpKTsKLSAgICAgIGZvciAoaiA9IDA7IHJlbG9jW2pdOyBqKyspCi0gICAgICAgIHsKLQkgIHMgPSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChzdGRvdXRwdXQsIHJlbG9jW2pdLAotCQkJCSAgICAgIGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwsCi0JCQkJICAgICAgZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgICAgICBzZWMsICZlcnIpOwotICAgICAgICAgIHN3aXRjaCAocykKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vazoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbiIpLAotCQkJZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0JICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgbiA9IGk7Ci0jZW5kaWYKLQotI2lmZGVmIERFQlVHNAotICB7Ci0gICAgaW50IGksIGosIG5zeW1zOwotICAgIGFzeW1ib2wgKipzeW1wcDsKLSAgICBzeW1wcCA9IGJmZF9nZXRfb3V0c3ltYm9scyAoc3Rkb3V0cHV0KTsKLSAgICBuc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKHN0ZG91dHB1dCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICAgIGlmICgoKCpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JewotCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyBqKyspCi0JICAgIGlmIChzeW1wcFtqXSA9PSAqcmVsb2NzW2ldLT5zeW1fcHRyX3B0cikKLQkgICAgICBicmVhazsKLQkgIGlmIChqID09IG5zeW1zKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChuKQotICAgIGJmZF9zZXRfcmVsb2MgKHN0ZG91dHB1dCwgc2VjLCByZWxvY3MsIG4pOwotICBlbHNlCi0gICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsCi0JCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpCi0JCQkgICAgJiAoZmxhZ3dvcmQpIH5TRUNfUkVMT0MpKTsKLQotI2lmZGVmIFNFVF9TRUNUSU9OX1JFTE9DUwotICBTRVRfU0VDVElPTl9SRUxPQ1MgKHNlYywgcmVsb2NzLCBuKTsKLSNlbmRpZgotCi0jaWZkZWYgREVCVUczCi0gIHsKLSAgICBpbnQgaTsKLSAgICBhcmVsZW50ICpyOwotICAgIGFzeW1ib2wgKnM7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAicmVsb2NzIGZvciBzZWMgJXNcbiIsIHNlYy0+bmFtZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICAgIHsKLQlyID0gcmVsb2NzW2ldOwotCXMgPSAqci0+c3ltX3B0cl9wdHI7Ci0JZnByaW50ZiAoc3RkZXJyLCAiICByZWxvYyAlMmQgQCUwOHggb2ZmICU0eCA6IHN5bSAlLTEwcyBhZGRlbmQgJXhcbiIsCi0JCSBpLCByLCByLT5hZGRyZXNzLCBzLT5uYW1lLCByLT5hZGRlbmQpOwotICAgICAgfQotICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX2NvbnRlbnRzIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwotICBmcmFnUyAqZjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGZyYWdzLiAgKi8KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTAotICAgICAgfHwgISAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0hBU19DT05URU5UUykpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoZiA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gICAgICAgZjsKLSAgICAgICBmID0gZi0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBpbnQgeDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZmlsbF9zaXplOwotICAgICAgY2hhciAqZmlsbF9saXRlcmFsOwotICAgICAgbG9uZyBjb3VudDsKLQotICAgICAgYXNzZXJ0IChmLT5mcl90eXBlID09IHJzX2ZpbGwpOwotICAgICAgaWYgKGYtPmZyX2ZpeCkKLQl7Ci0JICB4ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChzdGRvdXRwdXQsIHNlYywKLQkJCQkJZi0+ZnJfbGl0ZXJhbCwgKGZpbGVfcHRyKSBvZmZzZXQsCi0JCQkJCShiZmRfc2l6ZV90eXBlKSBmLT5mcl9maXgpOwotCSAgaWYgKHggPT0gZmFsc2UpCi0JICAgIHsKLQkgICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLQkgICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCB3cml0ZSAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLQkgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotCSAgICB9Ci0JICBvZmZzZXQgKz0gZi0+ZnJfZml4OwotCX0KLSAgICAgIGZpbGxfbGl0ZXJhbCA9IGYtPmZyX2xpdGVyYWwgKyBmLT5mcl9maXg7Ci0gICAgICBmaWxsX3NpemUgPSBmLT5mcl92YXI7Ci0gICAgICBjb3VudCA9IGYtPmZyX29mZnNldDsKLSAgICAgIGFzc2VydCAoY291bnQgPj0gMCk7Ci0gICAgICBpZiAoZmlsbF9zaXplICYmIGNvdW50KQotCXsKLQkgIGNoYXIgYnVmWzI1Nl07Ci0JICBpZiAoZmlsbF9zaXplID4gc2l6ZW9mKGJ1ZikpCi0JICAgIHsKLQkgICAgICAvKiBEbyBpdCB0aGUgb2xkIHdheS4gQ2FuIHRoaXMgZXZlciBoYXBwZW4/ICovCi0JICAgICAgd2hpbGUgKGNvdW50LS0pCi0JCXsKLQkJICB4ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChzdGRvdXRwdXQsIHNlYywKLQkJCQkJCWZpbGxfbGl0ZXJhbCwKLQkJCQkJCShmaWxlX3B0cikgb2Zmc2V0LAotCQkJCQkJKGJmZF9zaXplX3R5cGUpIGZpbGxfc2l6ZSk7Ci0JCSAgaWYgKHggPT0gZmFsc2UpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCQkgICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCB3cml0ZSAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLQkJICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQkJICAgIH0KLQkJICBvZmZzZXQgKz0gZmlsbF9zaXplOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEJ1aWxkIGEgYnVmZmVyIGZ1bGwgb2YgZmlsbCBvYmplY3RzIGFuZCBvdXRwdXQgaXQgYXMKLQkJIG9mdGVuIGFzIG5lY2Vzc2FyeS4gVGhpcyBzYXZlcyBvbiB0aGUgb3ZlcmhlYWQgb2YKLQkJIHBvdGVudGlhbGx5IGxvdHMgb2YgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGNhbGxzLiAgKi8KLQkgICAgICBpbnQgbl9wZXJfYnVmLCBpOwotCSAgICAgIGlmIChmaWxsX3NpemUgPT0gMSkKLQkJewotCQkgIG5fcGVyX2J1ZiA9IHNpemVvZiAoYnVmKTsKLQkJICBtZW1zZXQgKGJ1ZiwgKmZpbGxfbGl0ZXJhbCwgbl9wZXJfYnVmKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKmJ1ZnA7Ci0JCSAgbl9wZXJfYnVmID0gc2l6ZW9mKGJ1ZikvZmlsbF9zaXplOwotCQkgIGZvciAoaSA9IG5fcGVyX2J1ZiwgYnVmcCA9IGJ1ZjsgaTsgaS0tLCBidWZwICs9IGZpbGxfc2l6ZSkKLQkJICAgIG1lbWNweShidWZwLCBmaWxsX2xpdGVyYWwsIGZpbGxfc2l6ZSk7Ci0JCX0KLQkgICAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudCAtPSBuX3Blcl9idWYpCi0JCXsKLQkJICBuX3Blcl9idWYgPSBuX3Blcl9idWYgPiBjb3VudCA/IGNvdW50IDogbl9wZXJfYnVmOwotCQkgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQkJYnVmLCAoZmlsZV9wdHIpIG9mZnNldCwKLQkJCQkJCShiZmRfc2l6ZV90eXBlKSBuX3Blcl9idWYgKiBmaWxsX3NpemUpOwotCQkgIGlmICh4ICE9IHRydWUpCi0JCSAgICBhc19mYXRhbCAoXygiQ2Fubm90IHdyaXRlIHRvIG91dHB1dCBmaWxlLiIpKTsKLQkJICBvZmZzZXQgKz0gbl9wZXJfYnVmICogZmlsbF9zaXplOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEJGRF9BU1NFTUJMRVIpIHx8ICghZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZChPQkpfQU9VVCkpCi1zdGF0aWMgdm9pZAotbWVyZ2VfZGF0YV9pbnRvX3RleHQgKCkKLXsKLSNpZiBkZWZpbmVkKEJGRF9BU1NFTUJMRVIpIHx8IGRlZmluZWQoTUFOWV9TRUdNRU5UUykKLSAgc2VnX2luZm8gKHRleHRfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX2xhc3QtPmZyX25leHQgPQotICAgIHNlZ19pbmZvIChkYXRhX3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9yb290OwotICBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfbGFzdCA9Ci0gICAgc2VnX2luZm8gKGRhdGFfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX2xhc3Q7Ci0gIHNlZ19pbmZvIChkYXRhX3NlY3Rpb24pLT5mcmNoYWluUCA9IDA7Ci0jZWxzZQotICBmaXhTICp0bXA7Ci0KLSAgdGV4dF9sYXN0X2ZyYWctPmZyX25leHQgPSBkYXRhX2ZyYWdfcm9vdDsKLSAgdGV4dF9sYXN0X2ZyYWcgPSBkYXRhX2xhc3RfZnJhZzsKLSAgZGF0YV9sYXN0X2ZyYWcgPSBOVUxMOwotICBkYXRhX2ZyYWdfcm9vdCA9IE5VTEw7Ci0gIGlmICh0ZXh0X2ZpeF9yb290KQotICAgIHsKLSAgICAgIGZvciAodG1wID0gdGV4dF9maXhfcm9vdDsgdG1wLT5meF9uZXh0OyB0bXAgPSB0bXAtPmZ4X25leHQpOzsKLSAgICAgIHRtcC0+ZnhfbmV4dCA9IGRhdGFfZml4X3Jvb3Q7Ci0gICAgICB0ZXh0X2ZpeF90YWlsID0gZGF0YV9maXhfdGFpbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZXh0X2ZpeF9yb290ID0gZGF0YV9maXhfcm9vdDsKLSAgZGF0YV9maXhfcm9vdCA9IE5VTEw7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSIHx8ICghIEJGRCAmJiAhIE9CSl9BT1VUKSAqLwotCi0jaWYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICFkZWZpbmVkIChCRkQpCi1zdGF0aWMgdm9pZAotcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzICgpCi17Ci0gIGZyYWdTICpmcmFnUDsKLQotICByZWxheF9zZWdtZW50ICh0ZXh0X2ZyYWdfcm9vdCwgU0VHX1RFWFQpOwotICByZWxheF9zZWdtZW50IChkYXRhX2ZyYWdfcm9vdCwgU0VHX0RBVEEpOwotICByZWxheF9zZWdtZW50IChic3NfZnJhZ19yb290LCBTRUdfQlNTKTsKLSAgLyoKLSAgICogTm93IHRoZSBhZGRyZXNzZXMgb2YgZnJhZ3MgYXJlIGNvcnJlY3Qgd2l0aGluIHRoZSBzZWdtZW50LgotICAgKi8KLQotICBrbm93ICh0ZXh0X2xhc3RfZnJhZy0+ZnJfdHlwZSA9PSByc19maWxsICYmIHRleHRfbGFzdF9mcmFnLT5mcl9vZmZzZXQgPT0gMCk7Ci0gIEhfU0VUX1RFWFRfU0laRSAoJmhlYWRlcnMsIHRleHRfbGFzdF9mcmFnLT5mcl9hZGRyZXNzKTsKLSAgdGV4dF9sYXN0X2ZyYWctPmZyX2FkZHJlc3MgPSBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKTsKLQotICAvKgotICAgKiBKb2luIHRoZSAyIHNlZ21lbnRzIGludG8gMSBodWdlIHNlZ21lbnQuCi0gICAqIFRvIGRvIHRoaXMsIHJlLWNvbXB1dGUgZXZlcnkgcm5fYWRkcmVzcyBpbiB0aGUgU0VHX0RBVEEgZnJhZ3MuCi0gICAqIFRoZW4gam9pbiB0aGUgZGF0YSBmcmFncyBhZnRlciB0aGUgdGV4dCBmcmFncy4KLSAgICoKLSAgICogRGV0ZXJtaW5lIGFfZGF0YSBbbGVuZ3RoIG9mIGRhdGEgc2VnbWVudF0uCi0gICAqLwotICBpZiAoZGF0YV9mcmFnX3Jvb3QpCi0gICAgewotICAgICAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1Qgc2xpZGU7Ci0KLSAgICAgIGtub3cgKCh0ZXh0X2xhc3RfZnJhZy0+ZnJfdHlwZSA9PSByc19maWxsKSAmJiAodGV4dF9sYXN0X2ZyYWctPmZyX29mZnNldCA9PSAwKSk7Ci0KLSAgICAgIEhfU0VUX0RBVEFfU0laRSAoJmhlYWRlcnMsIGRhdGFfbGFzdF9mcmFnLT5mcl9hZGRyZXNzKTsKLSAgICAgIGRhdGFfbGFzdF9mcmFnLT5mcl9hZGRyZXNzID0gSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycyk7Ci0gICAgICBzbGlkZSA9IEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpOwkvKiAmIGluIGZpbGUgb2YgdGhlIGRhdGEgc2VnbWVudC4gKi8KLSNpZmRlZiBPQkpfQk9VVAotI2RlZmluZSBSb3VuZFVwKE4sUykgKCgoTikrKFMpLTEpJi0oUykpCi0gICAgICAvKiBGb3IgYi5vdXQ6IElmIHRoZSBkYXRhIHNlY3Rpb24gaGFzIGEgc3RyaWN0IGFsaWdubWVudAotCSByZXF1aXJlbWVudCwgaXRzIGxvYWQgYWRkcmVzcyBpbiB0aGUgLm8gZmlsZSB3aWxsIGJlCi0JIHJvdW5kZWQgdXAgZnJvbSB0aGUgc2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhlc2UKLQkgdHdvIHZhbHVlcyBhcmUgKm5vdCogdGhlIHNhbWUhICBTaW1pbGFybHkgZm9yIHRoZSBic3MKLQkgc2VjdGlvbi4uLi4gICovCi0gICAgICBzbGlkZSA9IFJvdW5kVXAgKHNsaWRlLCAxIDw8IHNlY3Rpb25fYWxpZ25tZW50W1NFR19EQVRBXSk7Ci0jZW5kaWYKLQotICAgICAgZm9yIChmcmFnUCA9IGRhdGFfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLQl7Ci0JICBmcmFnUC0+ZnJfYWRkcmVzcyArPSBzbGlkZTsKLQl9CQkJLyogZm9yIGVhY2ggZGF0YSBmcmFnICovCi0KLSAgICAgIGtub3cgKHRleHRfbGFzdF9mcmFnICE9IDApOwotICAgICAgdGV4dF9sYXN0X2ZyYWctPmZyX25leHQgPSBkYXRhX2ZyYWdfcm9vdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBIX1NFVF9EQVRBX1NJWkUgKCZoZWFkZXJzLCAwKTsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfQk9VVAotICAvKiBTZWUgYWJvdmUgY29tbWVudHMgb24gYi5vdXQgZGF0YSBzZWN0aW9uIGFkZHJlc3MuICAqLwotICB7Ci0gICAgbG9uZyBic3Nfdm1hOwotICAgIGlmIChkYXRhX2xhc3RfZnJhZyA9PSAwKQotICAgICAgYnNzX3ZtYSA9IEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpOwotICAgIGVsc2UKLSAgICAgIGJzc192bWEgPSBkYXRhX2xhc3RfZnJhZy0+ZnJfYWRkcmVzczsKLSAgICBic3Nfdm1hID0gUm91bmRVcCAoYnNzX3ZtYSwgMSA8PCBzZWN0aW9uX2FsaWdubWVudFtTRUdfQlNTXSk7Ci0gICAgYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzID0gYnNzX3ZtYTsKLSAgfQotI2Vsc2UgLyogISBPQkpfQk9VVCAqLwotICBic3NfYWRkcmVzc19mcmFnLmZyX2FkZHJlc3MgPSAoSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKwotCQkJCSBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSk7Ci0KLSNlbmRpZiAvKiAhIE9CSl9CT1VUICovCi0KLSAgLyogU2xpZGUgYWxsIHRoZSBmcmFncyAqLwotICBpZiAoYnNzX2ZyYWdfcm9vdCkKLSAgICB7Ci0gICAgICByZWxheF9hZGRyZXNzVCBzbGlkZSA9IGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzczsKLQotICAgICAgZm9yIChmcmFnUCA9IGJzc19mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCXsKLQkgIGZyYWdQLT5mcl9hZGRyZXNzICs9IHNsaWRlOwotCX0JCQkvKiBmb3IgZWFjaCBic3MgZnJhZyAqLwotICAgIH0KLQotICBpZiAoYnNzX2xhc3RfZnJhZykKLSAgICBIX1NFVF9CU1NfU0laRSAoJmhlYWRlcnMsCi0JCSAgICBic3NfbGFzdF9mcmFnLT5mcl9hZGRyZXNzIC0gYnNzX2ZyYWdfcm9vdC0+ZnJfYWRkcmVzcyk7Ci0gIGVsc2UKLSAgICBIX1NFVF9CU1NfU0laRSAoJmhlYWRlcnMsIDApOwotfQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAmJiAhIEJGRCAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkCi1zZXRfc3ltdGFiICgpCi17Ci0gIGludCBuc3ltczsKLSAgYXN5bWJvbCAqKmFzeW1wcDsKLSAgc3ltYm9sUyAqc3ltcDsKLSAgYm9vbGVhbiByZXN1bHQ7Ci0gIGV4dGVybiBQVFIgYmZkX2FsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLQotICAvKiBDb3VudCBzeW1ib2xzLiAgV2UgY2FuJ3QgcmVseSBvbiBhIGNvdW50IG1hZGUgYnkgdGhlIGxvb3AgaW4KLSAgICAgd3JpdGVfb2JqZWN0X2ZpbGUsIGJlY2F1c2UgKl9mcm9iX2ZpbGUgbWF5IGFkZCBhIG5ldyBzeW1ib2wgb3IKLSAgICAgdHdvLiAgKi8KLSAgbnN5bXMgPSAwOwotICBmb3IgKHN5bXAgPSBzeW1ib2xfcm9vdFA7IHN5bXA7IHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0gICAgbnN5bXMrKzsKLQotICBpZiAobnN5bXMpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGFzeW1wcCA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKHN0ZG91dHB1dCwKLQkJCQkgICAgICAgbnN5bXMgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgc3ltcCA9IHN5bWJvbF9yb290UDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3ltczsgaSsrLCBzeW1wID0gc3ltYm9sX25leHQgKHN5bXApKQotCXsKLQkgIGFzeW1wcFtpXSA9IHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKTsKLQkgIHN5bWJvbF9tYXJrX3dyaXR0ZW4gKHN5bXApOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc3ltcHAgPSAwOwotICByZXN1bHQgPSBiZmRfc2V0X3N5bXRhYiAoc3Rkb3V0cHV0LCBhc3ltcHAsIG5zeW1zKTsKLSAgYXNzZXJ0IChyZXN1bHQgPT0gdHJ1ZSk7Ci0gIHN5bWJvbF90YWJsZV9mcm96ZW4gPSAxOwotfQotI2VuZGlmCi0KLS8qIEZpbmlzaCB0aGUgc3Vic2VnbWVudHMuICBBZnRlciBldmVyeSBzdWItc2VnbWVudCwgd2UgZmFrZSBhbgotICAgIi5hbGlnbiAuLi4iLiAgVGhpcyBjb25mb3JtcyB0byBCU0Q0LjIgYnJhbmUtZGFtYWdlLiAgV2UgdGhlbiBmYWtlCi0gICAiLmZpbGwgMCIgYmVjYXVzZSB0aGF0IGlzIHRoZSBraW5kIG9mIGZyYWcgdGhhdCByZXF1aXJlcyBsZWFzdAotICAgdGhvdWdodC4gICIuYWxpZ24iIGZyYWdzIGxpa2UgdG8gaGF2ZSBhIGZvbGxvd2luZyBmcmFnIHNpbmNlIHRoYXQKLSAgIG1ha2VzIGNhbGN1bGF0aW5nIHRoZWlyIGludGVuZGVkIGxlbmd0aCB0cml2aWFsLiAgKi8KLQotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAoMCkKLSNlbHNlCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgKDIpCi0jZW5kaWYKLSNlbmRpZgotCi12b2lkCi1zdWJzZWdzX2ZpbmlzaCAoKQotewotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpblA7Ci0KLSAgZm9yIChmcmNoYWluUCA9IGZyY2hhaW5fcm9vdDsgZnJjaGFpblA7IGZyY2hhaW5QID0gZnJjaGFpblAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0IChmcmNoYWluUC0+ZnJjaF9zZWcsIGZyY2hhaW5QLT5mcmNoX3N1YnNlZyk7Ci0KLSAgICAgIC8qIFRoaXMgbm93IGdldHMgY2FsbGVkIGV2ZW4gaWYgd2UgaGFkIGVycm9ycy4gIEluIHRoYXQgY2FzZSwKLSAgICAgICAgIGFueSBhbGlnbm1lbnQgaXMgbWVhbmluZ2xlc3MsIGFuZCwgbW9yZW92ZXIsIHdpbGwgbG9vayB3ZWlyZAotICAgICAgICAgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBsaXN0aW5nLiAgKi8KLSAgICAgIGZyYWdfYWxpZ24gKGhhZF9lcnJvcnMgKCkgPyAwIDogU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLAotCQkgIHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpID8gTk9QX09QQ09ERSA6IDAsCi0JCSAgMCk7Ci0KLSAgICAgIC8qIGZyYWdfYWxpZ24gd2lsbCBoYXZlIGxlZnQgYSBuZXcgZnJhZy4KLQkgVXNlIHRoaXMgbGFzdCBmcmFnIGZvciBhbiBlbXB0eSAiLmZpbGwiLgotCi0JIEZvciB0aGlzIHNlZ21lbnQgLi4uCi0JIENyZWF0ZSBhIGxhc3QgZnJhZy4gRG8gbm90IGxlYXZlIGEgImJlaW5nIGZpbGxlZCBpbiBmcmFnIi4gICovCi0KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19ub3ctPmZyX2ZpeCA9IDA7Ci0gICAgICBrbm93IChmcmFnX25vdy0+ZnJfbmV4dCA9PSBOVUxMKTsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIHRoZSBvYmplY3QgZmlsZS4gICovCi0KLXZvaWQKLXdyaXRlX29iamVjdF9maWxlICgpCi17Ci0jaWYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhIGRlZmluZWQgKFdPUktJTkdfRE9UX1dPUkQpCi0gIGZyYWdTICpmcmFnUDsJCQkvKiBUcmFjayBhbG9uZyBhbGwgZnJhZ3MuICovCi0jZW5kaWYKLQotICAvKiBEbyB3ZSByZWFsbHkgd2FudCB0byB3cml0ZSBpdD8gICovCi0gIHsKLSAgICBpbnQgbl93YXJucywgbl9lcnJzOwotICAgIG5fd2FybnMgPSBoYWRfd2FybmluZ3MgKCk7Ci0gICAgbl9lcnJzID0gaGFkX2Vycm9ycyAoKTsKLSAgICAvKiBUaGUgLVogZmxhZyBpbmRpY2F0ZXMgdGhhdCBhbiBvYmplY3QgZmlsZSBzaG91bGQgYmUgZ2VuZXJhdGVkLAotICAgICAgIHJlZ2FyZGxlc3Mgb2Ygd2FybmluZ3MgYW5kIGVycm9ycy4gICovCi0gICAgaWYgKGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCkKLSAgICAgIHsKLQlpZiAobl93YXJucyB8fCBuX2VycnMpCi0JICBhc193YXJuIChfKCIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIGdlbmVyYXRpbmcgYmFkIG9iamVjdCBmaWxlLlxuIiksCi0JCSAgIG5fZXJycywgbl9lcnJzID09IDEgPyAiIiA6ICJzIiwKLQkJICAgbl93YXJucywgbl93YXJucyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlpZiAobl9lcnJzKQotCSAgYXNfZmF0YWwgKF8oIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgbm8gb2JqZWN0IGZpbGUgZ2VuZXJhdGVkLlxuIiksCi0JCSAgICBuX2VycnMsIG5fZXJycyA9PSAxID8gIiIgOiAicyIsCi0JCSAgICBuX3dhcm5zLCBuX3dhcm5zID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICB9Ci0gIH0KLQotI2lmZGVmCU9CSl9WTVMKLSAgLyogVW5kZXIgVk1TIHdlIHRyeSB0byBiZSBjb21wYXRpYmxlIHdpdGggVkFYLTExICJDIi4gIFRodXMsIHdlIGNhbGwKLSAgICAgYSByb3V0aW5lIHRvIGNoZWNrIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJvY2VkdXJlICJfbWFpbiIsCi0gICAgIGFuZCBpZiBzbyAtLSBmaXggaXQgdXAgc28gdGhhdCBpdCBjYW4gYmUgcHJvZ3JhbSBlbnRyeSBwb2ludC4gKi8KLSAgdm1zX2NoZWNrX2Zvcl9tYWluICgpOwotI2VuZGlmIC8qIE9CSl9WTVMgKi8KLQotICAvKiBGcm9tIG5vdyBvbiwgd2UgZG9uJ3QgY2FyZSBhYm91dCBzdWItc2VnbWVudHMuICBCdWlsZCBvbmUgZnJhZyBjaGFpbgotICAgICBmb3IgZWFjaCBzZWdtZW50LiBMaW5rZWQgdGhydSBmcl9uZXh0LiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogUmVtb3ZlIHRoZSBzZWN0aW9ucyBjcmVhdGVkIGJ5IGdhcyBmb3IgaXRzIG93biBwdXJwb3Nlcy4gICovCi0gIHsKLSAgICBhc2VjdGlvbiAqKnNlY2xpc3QsICpzZWM7Ci0gICAgaW50IGk7Ci0KLSAgICBzZWNsaXN0ID0gJnN0ZG91dHB1dC0+c2VjdGlvbnM7Ci0gICAgd2hpbGUgKHNlY2xpc3QgJiYgKnNlY2xpc3QpCi0gICAgICB7Ci0Jc2VjID0gKnNlY2xpc3Q7Ci0Jd2hpbGUgKHNlYyA9PSByZWdfc2VjdGlvbiB8fCBzZWMgPT0gZXhwcl9zZWN0aW9uKQotCSAgewotCSAgICBzZWMgPSBzZWMtPm5leHQ7Ci0JICAgICpzZWNsaXN0ID0gc2VjOwotCSAgICBzdGRvdXRwdXQtPnNlY3Rpb25fY291bnQtLTsKLQkgICAgaWYgKCFzZWMpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JaWYgKCpzZWNsaXN0KQotCSAgc2VjbGlzdCA9ICYoKnNlY2xpc3QpLT5uZXh0OwotICAgICAgfQotICAgIGkgPSAwOwotICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCByZW51bWJlcl9zZWN0aW9ucywgJmkpOwotICB9Ci0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyLCAoY2hhciAqKSAwKTsKLSNlbHNlCi0gIHJlbW92ZV9zdWJzZWdzIChmcmNoYWluX3Jvb3QsIFNFR19URVhULCAmdGV4dF9mcmFnX3Jvb3QsICZ0ZXh0X2xhc3RfZnJhZyk7Ci0gIHJlbW92ZV9zdWJzZWdzIChkYXRhMF9mcmNoYWluUCwgU0VHX0RBVEEsICZkYXRhX2ZyYWdfcm9vdCwgJmRhdGFfbGFzdF9mcmFnKTsKLSAgcmVtb3ZlX3N1YnNlZ3MgKGJzczBfZnJjaGFpblAsIFNFR19CU1MsICZic3NfZnJhZ19yb290LCAmYnNzX2xhc3RfZnJhZyk7Ci0jZW5kaWYKLQotICAvKiBXZSBoYXZlIHR3byBzZWdtZW50cy4gSWYgdXNlciBnYXZlIC1SIGZsYWcsIHRoZW4gd2UgbXVzdCBwdXQgdGhlCi0gICAgIGRhdGEgZnJhZ3MgaW50byB0aGUgdGV4dCBzZWdtZW50LiBEbyB0aGlzIGJlZm9yZSByZWxheGluZyBzbwotICAgICB3ZSBrbm93IHRvIHRha2UgYWR2YW50YWdlIG9mIC1SIGFuZCBtYWtlIHNob3J0ZXIgYWRkcmVzc2VzLiAgKi8KLSNpZiAhZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICB7Ci0gICAgICBtZXJnZV9kYXRhX2ludG9fdGV4dCAoKTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHJlbGF4X2FuZF9zaXplX3NlZywgKGNoYXIgKikgMCk7Ci0jZWxzZQotICByZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgKCk7Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyoKLSAgICoKLSAgICogQ3Jhd2wgdGhlIHN5bWJvbCBjaGFpbi4KLSAgICoKLSAgICogRm9yIGVhY2ggc3ltYm9sIHdob3NlIHZhbHVlIGRlcGVuZHMgb24gYSBmcmFnLCB0YWtlIHRoZSBhZGRyZXNzIG9mCi0gICAqIHRoYXQgZnJhZyBhbmQgc3Vic3VtZSBpdCBpbnRvIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgotICAgKiBBZnRlciB0aGlzLCB0aGVyZSBpcyBqdXN0IG9uZSB3YXkgdG8gbG9va3VwIGEgc3ltYm9sIHZhbHVlLgotICAgKiBWYWx1ZXMgYXJlIGxlZnQgaW4gdGhlaXIgZmluYWwgc3RhdGUgZm9yIG9iamVjdCBmaWxlIGVtaXNzaW9uLgotICAgKiBXZSBhZGp1c3QgdGhlIHZhbHVlcyBvZiAnTCcgbG9jYWwgc3ltYm9scywgZXZlbiBpZiB3ZSBkbwotICAgKiBub3QgaW50ZW5kIHRvIGVtaXQgdGhlbSB0byB0aGUgb2JqZWN0IGZpbGUsIGJlY2F1c2UgdGhlaXIgdmFsdWVzCi0gICAqIGFyZSBuZWVkZWQgZm9yIGZpeC11cHMuCi0gICAqCi0gICAqIFVubGVzcyB3ZSBzYXcgYSAtTCBmbGFnLCByZW1vdmUgYWxsIHN5bWJvbHMgdGhhdCBiZWdpbiB3aXRoICdMJwotICAgKiBmcm9tIHRoZSBzeW1ib2wgY2hhaW4uICAoVGhleSBhcmUgc3RpbGwgcG9pbnRlZCB0byBieSB0aGUgZml4ZXMuKQotICAgKgotICAgKiBDb3VudCB0aGUgcmVtYWluaW5nIHN5bWJvbHMuCi0gICAqIEFzc2lnbiBhIHN5bWJvbCBudW1iZXIgdG8gZWFjaCBzeW1ib2wuCi0gICAqIENvdW50IHRoZSBudW1iZXIgb2Ygc3RyaW5nLXRhYmxlIGNoYXJzIHdlIHdpbGwgZW1pdC4KLSAgICogUHV0IHRoaXMgaW5mbyBpbnRvIHRoZSBoZWFkZXJzIGFzIGFwcHJvcHJpYXRlLgotICAgKgotICAgKi8KLSAga25vdyAoemVyb19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzcyA9PSAwKTsKLSAgc3RyaW5nX2J5dGVfY291bnQgPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLQotICBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluICgmaGVhZGVycyk7Ci0KLSAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID09IHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpKQotICAgIHN0cmluZ19ieXRlX2NvdW50ID0gMDsKLQotICBIX1NFVF9TVFJJTkdfU0laRSAoJmhlYWRlcnMsIHN0cmluZ19ieXRlX2NvdW50KTsKLQotICAvKgotICAgKiBBZGRyZXNzZXMgb2YgZnJhZ3Mgbm93IHJlZmxlY3QgYWRkcmVzc2VzIHdlIHVzZSBpbiB0aGUgb2JqZWN0IGZpbGUuCi0gICAqIFN5bWJvbCB2YWx1ZXMgYXJlIGNvcnJlY3QuCi0gICAqIFNjYW4gdGhlIGZyYWdzLCBjb252ZXJ0aW5nIGFueSAiLm9yZyJzIGFuZCAiLmFsaWduInMgdG8gIi5maWxsInMuCi0gICAqIEFsc28gY29udmVydGluZyBhbnkgbWFjaGluZS1kZXBlbmRlbnQgZnJhZ3MgdXNpbmcgbWRfY29udmVydF9mcmFnKCk7Ci0gICAqLwotICBzdWJzZWdfY2hhbmdlIChTRUdfVEVYVCwgMCk7Ci0KLSAgZm9yIChmcmFnUCA9IHRleHRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbGlua2VkIGFsbCB0aGUgZnJhZ3MgaW50byBhIHNpbmdsZQotICAgICAgICAgY2hhaW4uICBIb3dldmVyLCBjdnRfZnJhZ190b19maWxsIG1heSBjYWxsIG1kX2NvbnZlcnRfZnJhZwotICAgICAgICAgd2hpY2ggbWF5IGNhbGwgZml4X25ldy4gIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgZml4X25ldyBhZGRzCi0gICAgICAgICB0aGUgZml4dXAgdG8gdGhlIHJpZ2h0IHNlY3Rpb24uICAqLwotICAgICAgaWYgKGZyYWdQID09IGRhdGFfZnJhZ19yb290KQotCXN1YnNlZ19jaGFuZ2UgKFNFR19EQVRBLCAwKTsKLQotICAgICAgY3Z0X2ZyYWdfdG9fZmlsbCAoJmhlYWRlcnMsIFNFR19URVhULCBmcmFnUCk7Ci0KLSAgICAgIC8qIFNvbWUgYXNzZXJ0IG1hY3JvcyBkb24ndCB3b3JrIHdpdGggIyBkaXJlY3RpdmVzIG1peGVkIGluLiAgKi8KLSNpZm5kZWYgTkRFQlVHCi0gICAgICBpZiAoIShmcmFnUC0+ZnJfbmV4dCA9PSBOVUxMCi0jaWZkZWYgT0JKX0JPVVQKLQkgICAgfHwgZnJhZ1AtPmZyX25leHQgPT0gZGF0YV9mcmFnX3Jvb3QKLSNlbmRpZgotCSAgICB8fCAoKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ1AtPmZyX2FkZHJlc3MpCi0JCT09IChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX29mZnNldCAqIGZyYWdQLT5mcl92YXIpKSkpCi0JYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICB9Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICB7Ci0gICAgc3RydWN0IGJyb2tlbl93b3JkICpsaWU7Ci0gICAgc3RydWN0IGJyb2tlbl93b3JkICoqcHJldlA7Ci0KLSAgICBwcmV2UCA9ICZicm9rZW5fd29yZHM7Ci0gICAgZm9yIChsaWUgPSBicm9rZW5fd29yZHM7IGxpZTsgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQotICAgICAgaWYgKCFsaWUtPmFkZGVkKQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgc3Vic2VnX2NoYW5nZSAobGllLT5zZWcsIGxpZS0+c3Vic2VnKTsKLQkgIGV4cC5YX29wID0gT19zdWJ0cmFjdDsKLQkgIGV4cC5YX2FkZF9zeW1ib2wgPSBsaWUtPmFkZDsKLQkgIGV4cC5YX29wX3N5bWJvbCA9IGxpZS0+c3ViOwotCSAgZXhwLlhfYWRkX251bWJlciA9IGxpZS0+YWRkbnVtOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBUQ19DT05TX0ZJWF9ORVcKLQkgIFRDX0NPTlNfRklYX05FVyAobGllLT5mcmFnLAotCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDIsICZleHApOwotI2Vsc2UKLQkgIGZpeF9uZXdfZXhwIChsaWUtPmZyYWcsCi0JCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkgICAgICAgMiwgJmV4cCwgMCwgQkZEX1JFTE9DXzE2KTsKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKFRDX1NQQVJDKSB8fCBkZWZpbmVkKFRDX0EyOUspIHx8IGRlZmluZWQoTkVFRF9GWF9SX1RZUEUpCi0JICBmaXhfbmV3X2V4cCAobGllLT5mcmFnLAotCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDIsICZleHAsIDAsIE5PX1JFTE9DKTsKLSNlbHNlCi0jaWZkZWYgVENfTlMzMksKLQkgIGZpeF9uZXdfbnMzMmtfZXhwIChsaWUtPmZyYWcsCi0JCQkgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCQkgICAgIDIsICZleHAsIDAsIDAsIDIsIDAsIDApOwotI2Vsc2UKLQkgIGZpeF9uZXdfZXhwIChsaWUtPmZyYWcsCi0JCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkgICAgICAgMiwgJmV4cCwgMCwgMCk7Ci0jZW5kaWYgLyogVENfTlMzMksgKi8KLSNlbmRpZiAvKiBUQ19TUEFSQ3xUQ19BMjlLfE5FRURfRlhfUl9UWVBFICovCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCSAgKnByZXZQID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkOwotCX0KLSAgICAgIGVsc2UKLQlwcmV2UCA9ICYobGllLT5uZXh0X2Jyb2tlbl93b3JkKTsKLQotICAgIGZvciAobGllID0gYnJva2VuX3dvcmRzOyBsaWU7KQotICAgICAgewotCXN0cnVjdCBicm9rZW5fd29yZCAqdW50cnV0aDsKLQljaGFyICp0YWJsZV9wdHI7Ci0JYWRkcmVzc1QgdGFibGVfYWRkcjsKLQlhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0JaW50IG4sIG07Ci0KLQlzdWJzZWdfY2hhbmdlIChsaWUtPnNlZywgbGllLT5zdWJzZWcpOwotCWZyYWdQID0gbGllLT5kaXNwZnJhZzsKLQotCS8qIEZpbmQgb3V0IGhvdyBtYW55IGJyb2tlbl93b3JkcyBnbyBoZXJlLiAgKi8KLQluID0gMDsKLQlmb3IgKHVudHJ1dGggPSBsaWU7IHVudHJ1dGggJiYgdW50cnV0aC0+ZGlzcGZyYWcgPT0gZnJhZ1A7IHVudHJ1dGggPSB1bnRydXRoLT5uZXh0X2Jyb2tlbl93b3JkKQotCSAgaWYgKHVudHJ1dGgtPmFkZGVkID09IDEpCi0JICAgIG4rKzsKLQotCXRhYmxlX3B0ciA9IGxpZS0+ZGlzcGZyYWctPmZyX29wY29kZTsKLQl0YWJsZV9hZGRyID0gbGllLT5kaXNwZnJhZy0+ZnJfYWRkcmVzcyArICh0YWJsZV9wdHIgLSBsaWUtPmRpc3BmcmFnLT5mcl9saXRlcmFsKTsKLQkvKiBDcmVhdGUgdGhlIGp1bXAgYXJvdW5kIHRoZSBsb25nIGp1bXBzLiAgVGhpcyBpcyBhIHNob3J0Ci0JICAganVtcCBmcm9tIHRhYmxlX3B0ciswIHRvIHRhYmxlX3B0cituKmxvbmdfanVtcF9zaXplLiAgKi8KLQlmcm9tX2FkZHIgPSB0YWJsZV9hZGRyOwotCXRvX2FkZHIgPSB0YWJsZV9hZGRyICsgbWRfc2hvcnRfanVtcF9zaXplICsgbiAqIG1kX2xvbmdfanVtcF9zaXplOwotCW1kX2NyZWF0ZV9zaG9ydF9qdW1wICh0YWJsZV9wdHIsIGZyb21fYWRkciwgdG9fYWRkciwgbGllLT5kaXNwZnJhZywgbGllLT5hZGQpOwotCXRhYmxlX3B0ciArPSBtZF9zaG9ydF9qdW1wX3NpemU7Ci0JdGFibGVfYWRkciArPSBtZF9zaG9ydF9qdW1wX3NpemU7Ci0KLQlmb3IgKG0gPSAwOyBsaWUgJiYgbGllLT5kaXNwZnJhZyA9PSBmcmFnUDsgbSsrLCBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0JICB7Ci0JICAgIGlmIChsaWUtPmFkZGVkID09IDIpCi0JICAgICAgY29udGludWU7Ci0JICAgIC8qIFBhdGNoIHRoZSBqdW1wIHRhYmxlICovCi0JICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBmcm9tID8/PyB0byB0YWJsZV9wdHIrMCAqLwotCSAgICB0b19hZGRyID0gdGFibGVfYWRkciAtIFNfR0VUX1ZBTFVFIChsaWUtPnN1Yik7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICB0b19hZGRyIC09IHN5bWJvbF9nZXRfZnJhZyAobGllLT5zdWIpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0JICAgIG1kX251bWJlcl90b19jaGFycyAobGllLT53b3JkX2dvZXNfaGVyZSwgdG9fYWRkciwgMik7Ci0JICAgIGZvciAodW50cnV0aCA9IGxpZS0+bmV4dF9icm9rZW5fd29yZDsgdW50cnV0aCAmJiB1bnRydXRoLT5kaXNwZnJhZyA9PSBmcmFnUDsgdW50cnV0aCA9IHVudHJ1dGgtPm5leHRfYnJva2VuX3dvcmQpCi0JICAgICAgewotCQlpZiAodW50cnV0aC0+dXNlX2p1bXAgPT0gbGllKQotCQkgIG1kX251bWJlcl90b19jaGFycyAodW50cnV0aC0+d29yZF9nb2VzX2hlcmUsIHRvX2FkZHIsIDIpOwotCSAgICAgIH0KLQotCSAgICAvKiBJbnN0YWxsIHRoZSBsb25nIGp1bXAgKi8KLQkgICAgLyogdGhpcyBpcyBhIGxvbmcganVtcCBmcm9tIHRhYmxlX3B0ciswIHRvIHRoZSBmaW5hbCB0YXJnZXQgKi8KLQkgICAgZnJvbV9hZGRyID0gdGFibGVfYWRkcjsKLQkgICAgdG9fYWRkciA9IFNfR0VUX1ZBTFVFIChsaWUtPmFkZCkgKyBsaWUtPmFkZG51bTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgIHRvX2FkZHIgKz0gc3ltYm9sX2dldF9mcmFnIChsaWUtPmFkZCktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQkgICAgbWRfY3JlYXRlX2xvbmdfanVtcCAodGFibGVfcHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGxpZS0+ZGlzcGZyYWcsIGxpZS0+YWRkKTsKLQkgICAgdGFibGVfcHRyICs9IG1kX2xvbmdfanVtcF9zaXplOwotCSAgICB0YWJsZV9hZGRyICs9IG1kX2xvbmdfanVtcF9zaXplOwotCSAgfQotICAgICAgfQotICB9Ci0jZW5kaWYgLyogbm90IFdPUktJTkdfRE9UX1dPUkQgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZuZGVmCU9CSl9WTVMKLSAgewkJCQkvKiBub3Qgdm1zICovCi0gICAgY2hhciAqdGhlX29iamVjdF9maWxlOwotICAgIGxvbmcgb2JqZWN0X2ZpbGVfc2l6ZTsKLSAgICAvKgotICAgICAqIFNjYW4gZXZlcnkgRml4UyBwZXJmb3JtaW5nIGZpeHVwcy4gV2UgaGFkIHRvIHdhaXQgdW50aWwgbm93IHRvIGRvCi0gICAgICogdGhpcyBiZWNhdXNlIG1kX2NvbnZlcnRfZnJhZygpIG1heSBoYXZlIG1hZGUgc29tZSBmaXhTcy4KLSAgICAgKi8KLSAgICBpbnQgdHJzaXplLCBkcnNpemU7Ci0KLSAgICBzdWJzZWdfY2hhbmdlIChTRUdfVEVYVCwgMCk7Ci0gICAgdHJzaXplID0gbWRfcmVsb2Nfc2l6ZSAqIGZpeHVwX3NlZ21lbnQgKHRleHRfZml4X3Jvb3QsIFNFR19URVhUKTsKLSAgICBzdWJzZWdfY2hhbmdlIChTRUdfREFUQSwgMCk7Ci0gICAgZHJzaXplID0gbWRfcmVsb2Nfc2l6ZSAqIGZpeHVwX3NlZ21lbnQgKGRhdGFfZml4X3Jvb3QsIFNFR19EQVRBKTsKLSAgICBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzLCB0cnNpemUsIGRyc2l6ZSk7Ci0KLSAgICAvKiBGSVhNRSBtb3ZlIHRoaXMgc3R1ZmYgaW50byB0aGUgcHJlLXdyaXRlLWhvb2sgKi8KLSAgICBIX1NFVF9NQUdJQ19OVU1CRVIgKCZoZWFkZXJzLCBtYWdpY19udW1iZXJfZm9yX29iamVjdF9maWxlKTsKLSAgICBIX1NFVF9FTlRSWV9QT0lOVCAoJmhlYWRlcnMsIDApOwotCi0gICAgb2JqX3ByZV93cml0ZV9ob29rICgmaGVhZGVycyk7CS8qIGV4dHJhIGNvZmYgc3R1ZmYgKi8KLQotICAgIG9iamVjdF9maWxlX3NpemUgPSBIX0dFVF9GSUxFX1NJWkUgKCZoZWFkZXJzKTsKLSAgICBuZXh0X29iamVjdF9maWxlX2NoYXJQID0gdGhlX29iamVjdF9maWxlID0geG1hbGxvYyAob2JqZWN0X2ZpbGVfc2l6ZSk7Ci0KLSAgICBvdXRwdXRfZmlsZV9jcmVhdGUgKG91dF9maWxlX25hbWUpOwotCi0gICAgb2JqX2hlYWRlcl9hcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCAmaGVhZGVycyk7Ci0KLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgY29kZS4KLSAgICAgKi8KLSAgICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotICAgICAgewotCXJlZ2lzdGVyIGxvbmcgY291bnQ7Ci0JcmVnaXN0ZXIgY2hhciAqZmlsbF9saXRlcmFsOwotCXJlZ2lzdGVyIGxvbmcgZmlsbF9zaXplOwotCi0JUFJPR1JFU1MgKDEpOwotCWtub3cgKGZyYWdQLT5mcl90eXBlID09IHJzX2ZpbGwpOwotCWFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGZyYWdQLT5mcl9saXRlcmFsLCAodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2ZpeCk7Ci0JZmlsbF9saXRlcmFsID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4OwotCWZpbGxfc2l6ZSA9IGZyYWdQLT5mcl92YXI7Ci0Ja25vdyAoZnJhZ1AtPmZyX29mZnNldCA+PSAwKTsKLQotCWZvciAoY291bnQgPSBmcmFnUC0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKLQkgIHsKLQkgICAgYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZmlsbF9saXRlcmFsLCAodW5zaWduZWQgbG9uZykgZmlsbF9zaXplKTsKLQkgIH0JCQkvKiBmb3IgZWFjaCAgKi8KLQotICAgICAgfQkJCQkvKiBmb3IgZWFjaCBjb2RlIGZyYWcuICovCi0KLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgcmVsb2NhdGlvbnMuCi0gICAgICovCi0gICAgb2JqX2VtaXRfcmVsb2NhdGlvbnMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCB0ZXh0X2ZpeF9yb290LCAocmVsYXhfYWRkcmVzc1QpIDApOwotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpKSk7Ci0jaWZkZWYgVENfSTk2MAotICAgIC8qIE1ha2UgYWRkcmVzc2VzIGluIGRhdGEgcmVsb2NhdGlvbiBkaXJlY3RpdmVzIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZgotICAgICAqIGZpcnN0IGRhdGEgZnJhZ21lbnQsIG5vdCBlbmQgb2YgbGFzdCB0ZXh0IGZyYWdtZW50OiAgYWxpZ25tZW50IG9mIHRoZQotICAgICAqIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQgbWF5IHBsYWNlIGEgZ2FwIGJldHdlZW4gdGhlIHNlZ21lbnRzLgotICAgICAqLwotICAgIG9ial9lbWl0X3JlbG9jYXRpb25zICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZGF0YV9maXhfcm9vdCwgZGF0YTBfZnJjaGFpblAtPmZyY2hfcm9vdC0+ZnJfYWRkcmVzcyk7Ci0jZWxzZSAvKiBUQ19JOTYwICovCi0gICAgb2JqX2VtaXRfcmVsb2NhdGlvbnMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBkYXRhX2ZpeF9yb290LCB0ZXh0X2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgbGluZSBudW1iZXIgZW50cmllcy4KLSAgICAgKi8KLSAgICBPQkpfRU1JVF9MSU5FTk8gKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBsaW5lbm9fcm9vdFAsIHRoZV9vYmplY3RfZmlsZSk7Ci0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfTElORU5PX1NJWkUgKCZoZWFkZXJzKSkpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IHN5bWJvbHMuCi0gICAgICovCi0gICAgb2JqX2VtaXRfc3ltYm9scyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIHN5bWJvbF9yb290UCk7Ci0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfTElORU5PX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFICgmaGVhZGVycykpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCBzdHJpbmdzLgotICAgICAqLwotCi0gICAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID4gMCkKLSAgICAgIHsKLQlvYmpfZW1pdF9zdHJpbmdzICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCk7Ci0gICAgICB9CQkJCS8qIG9ubHkgaWYgd2UgaGF2ZSBhIHN0cmluZyB0YWJsZSAqLwotCi0jaWZkZWYgQkZEX0hFQURFUlMKLSAgICBiZmRfc2VlayAoc3Rkb3V0cHV0LCAwLCAwKTsKLSAgICBiZmRfd3JpdGUgKHRoZV9vYmplY3RfZmlsZSwgMSwgb2JqZWN0X2ZpbGVfc2l6ZSwgc3Rkb3V0cHV0KTsKLSNlbHNlCi0KLSAgICAvKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZSAqLwotICAgIG91dHB1dF9maWxlX2FwcGVuZCAodGhlX29iamVjdF9maWxlLCBvYmplY3RfZmlsZV9zaXplLCBvdXRfZmlsZV9uYW1lKTsKLSAgICBmcmVlICh0aGVfb2JqZWN0X2ZpbGUpOwotI2VuZGlmCi0gIH0JCQkJLyogbm9uIHZtcyBvdXRwdXQgKi8KLSNlbHNlIC8qIE9CSl9WTVMgKi8KLSAgLyoKLSAgICoJTm93IGRvIHRoZSBWTVMtZGVwZW5kZW50IHBhcnQgb2Ygd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUKLSAgICovCi0gIHZtc193cml0ZV9vYmplY3RfZmlsZSAoSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyksCi0JCQkgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycyksCi0JCQkgSF9HRVRfQlNTX1NJWkUgKCZoZWFkZXJzKSwKLQkJCSB0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QpOwotI2VuZGlmIC8qIE9CSl9WTVMgKi8KLSNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotICAvKiBSZXNvbHZlIHN5bWJvbCB2YWx1ZXMuICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHByb2Nlc3NpbmcKLSAgICAgdGhlIHJlbG9jYXRpb25zLiAgKi8KLSAgaWYgKHN5bWJvbF9yb290UCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1wOwotCi0gICAgICBmb3IgKHN5bXAgPSBzeW1ib2xfcm9vdFA7IHN5bXA7IHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0JcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bXAsIDEpOwotICAgIH0KLSAgcmVzb2x2ZV9sb2NhbF9zeW1ib2xfdmFsdWVzICgpOwotCi0gIFBST0dSRVNTICgxKTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci0gIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci0gIG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKTsKLSNlbmRpZgotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBhZGp1c3RfcmVsb2Nfc3ltcywgKGNoYXIgKikwKTsKLQotICAvKiBTZXQgdXAgc3ltYm9sIHRhYmxlLCBhbmQgd3JpdGUgaXQgb3V0LiAgKi8KLSAgaWYgKHN5bWJvbF9yb290UCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1wOwotCi0gICAgICBmb3IgKHN5bXAgPSBzeW1ib2xfcm9vdFA7IHN5bXA7IHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0JewotCSAgaW50IHB1bnQgPSAwOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKHN5bWJvbF9tcmlfY29tbW9uX3AgKHN5bXApKQotCSAgICB7Ci0JICAgICAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bXApKQotCQlhc19iYWQgKF8oIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIpLAotCQkJU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bXAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIG5hbWUgPSBTX0dFVF9OQU1FIChzeW1wKTsKLQkgIGlmIChuYW1lKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTIgPSBkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAoKGNoYXIgKilTX0dFVF9OQU1FIChzeW1wKSk7Ci0JICAgICAgLyogVGhleSBvbmx5IGRpZmZlciBpZiBgbmFtZScgaXMgYSBmYiBvciBkb2xsYXIgbG9jYWwKLQkJIGxhYmVsIG5hbWUuICAqLwotCSAgICAgIGlmIChuYW1lMiAhPSBuYW1lICYmICEgU19JU19ERUZJTkVEIChzeW1wKSkKLQkJYXNfYmFkIChfKCJsb2NhbCBsYWJlbCAlcyBpcyBub3QgZGVmaW5lZCIpLCBuYW1lMik7Ci0JICAgIH0KLQotCSAgLyogRG8gaXQgYWdhaW4sIGJlY2F1c2UgYWRqdXN0X3JlbG9jX3N5bXMgbWlnaHQgaW50cm9kdWNlCi0JICAgICBtb3JlIHN5bWJvbHMuICBUaGV5J2xsIHByb2JhYmx5IG9ubHkgYmUgc2VjdGlvbiBzeW1ib2xzLAotCSAgICAgYnV0IHRoZXknbGwgc3RpbGwgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZXMgY29tcHV0ZWQuICAqLwotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bXAsIDEpOwotCi0JICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLSAgICAgICAgICAgICBzeW1ib2xzLiAgKi8KLQkgIGlmIChzeW1ib2xfZXF1YXRlZF9wIChzeW1wKQotCSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltcCkgfHwgU19JU19DT01NT04gKHN5bXApKSkKLQkgICAgewotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bXAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFNvIGZhciwgY29tbW9uIHN5bWJvbHMgaGF2ZSBiZWVuIHRyZWF0ZWQgbGlrZSB1bmRlZmluZWQgc3ltYm9scy4KLQkgICAgIFB1dCB0aGVtIGluIHRoZSBjb21tb24gc2VjdGlvbiBub3cuICAqLwotCSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltcCkgPT0gMAotCSAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW1wKSAhPSAwKQotCSAgICBTX1NFVF9TRUdNRU5UIChzeW1wLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLSNpZiAwCi0JICBwcmludGYgKCJzeW1ib2wgYCVzJ1xuXHRAJXg6IHZhbHVlPSVkIGZsYWdzPSV4IHNlZz0lc1xuIiwKLQkJICBTX0dFVF9OQU1FIChzeW1wKSwgc3ltcCwKLQkJICBTX0dFVF9WQUxVRSAoc3ltcCksCi0JCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncywKLQkJICBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bXApKSk7Ci0jZW5kaWYKLQotI2lmZGVmIG9ial9mcm9iX3N5bWJvbAotCSAgb2JqX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KTsKLSNlbmRpZgotI2lmZGVmIHRjX2Zyb2Jfc3ltYm9sCi0JICBpZiAoISBwdW50IHx8IHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHN5bXApKQotCSAgICB0Y19mcm9iX3N5bWJvbCAoc3ltcCwgcHVudCk7Ci0jZW5kaWYKLQotCSAgLyogSWYgd2UgZG9uJ3Qgd2FudCB0byBrZWVwIHRoaXMgc3ltYm9sLCBzcGxpY2UgaXQgb3V0IG9mCi0JICAgICB0aGUgY2hhaW4gbm93LiAgSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgMCwgd2UgbmV2ZXIKLQkgICAgIHdhbnQgc2VjdGlvbiBzeW1ib2xzLiAgT3RoZXJ3aXNlLCB3ZSBza2lwIGxvY2FsIHN5bWJvbHMKLQkgICAgIGFuZCBzeW1ib2xzIHRoYXQgdGhlIGZyb2Jfc3ltYm9sIG1hY3JvcyB0b2xkIHVzIHRvIHB1bnQsCi0JICAgICBidXQgd2Uga2VlcCBzdWNoIHN5bWJvbHMgaWYgdGhleSBhcmUgdXNlZCBpbiByZWxvY3MuICAqLwotCSAgaWYgKCghIEVNSVRfU0VDVElPTl9TWU1CT0xTCi0JICAgICAgICYmIHN5bWJvbF9zZWN0aW9uX3AgKHN5bXApKQotCSAgICAgIC8qIE5vdGUgdGhhdCBTX0lTX0VYVEVSTiBhbmQgU19JU19MT0NBTCBhcmUgbm90IGFsd2F5cwotCQkgb3Bwb3NpdGVzLiAgU29tZXRpbWVzIHRoZSBmb3JtZXIgY2hlY2tzIGZsYWdzIGFuZCB0aGUKLQkJIGxhdHRlciBleGFtaW5lcyB0aGUgbmFtZS4uLiAgKi8KLQkgICAgICB8fCAoIVNfSVNfRVhURVJOIChzeW1wKQotCQkgICYmIChTX0lTX0xPQ0FMIChzeW1wKSB8fCBwdW50KQotCQkgICYmICEgc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCAoc3ltcCkpKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltcCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgLyogQWZ0ZXIgc3ltYm9sX3JlbW92ZSwgc3ltYm9sX25leHQoc3ltcCkgc3RpbGwgcmV0dXJucwotCQkgdGhlIG9uZSB0aGF0IGNhbWUgYWZ0ZXIgaXQgaW4gdGhlIGNoYWluLiAgU28gd2UgZG9uJ3QKLQkJIG5lZWQgdG8gZG8gYW55IGV4dHJhIGNsZWFudXAgd29yayBoZXJlLiAgKi8KLQotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB3ZSByZWFsbHkgZ290IGEgdmFsdWUgZm9yIHRoZSBzeW1ib2wuICAqLwotCSAgaWYgKCEgc3ltYm9sX3Jlc29sdmVkX3AgKHN5bXApKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJjYW4ndCByZXNvbHZlIHZhbHVlIGZvciBzeW1ib2wgXCIlc1wiIiksCi0JCSAgICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkgICAgICBzeW1ib2xfbWFya19yZXNvbHZlZCAoc3ltcCk7Ci0JICAgIH0KLQotCSAgLyogU2V0IHRoZSB2YWx1ZSBpbnRvIHRoZSBCRkQgc3ltYm9sLiAgVXAgdGlsIG5vdyB0aGUgdmFsdWUKLQkgICAgIGhhcyBvbmx5IGJlZW4ga2VwdCBpbiB0aGUgZ2FzIHN5bWJvbFMgc3RydWN0LiAgKi8KLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+dmFsdWUgPSBTX0dFVF9WQUxVRSAoc3ltcCk7Ci0JfQotICAgIH0KLQotICBQUk9HUkVTUyAoMSk7Ci0KLSAgLyogTm93IGRvIGFueSBmb3JtYXQtc3BlY2lmaWMgYWRqdXN0bWVudHMgdG8gdGhlIHN5bWJvbCB0YWJsZSwgc3VjaAotICAgICBhcyBhZGRpbmcgZmlsZSBzeW1ib2xzLiAgKi8KLSNpZmRlZiB0Y19hZGp1c3Rfc3ltdGFiCi0gIHRjX2FkanVzdF9zeW10YWIgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfYWRqdXN0X3N5bXRhYgotICBvYmpfYWRqdXN0X3N5bXRhYiAoKTsKLSNlbmRpZgotCi0gIC8qIE5vdyB0aGF0IGFsbCB0aGUgc2l6ZXMgYXJlIGtub3duLCBhbmQgY29udGVudHMgY29ycmVjdCwgd2UgY2FuCi0gICAgIHN0YXJ0IHdyaXRpbmcgdG8gdGhlIGZpbGUuICAqLwotICBzZXRfc3ltdGFiICgpOwotCi0gIC8qIElmICpfZnJvYl9maWxlIGNoYW5nZXMgdGhlIHN5bWJvbCB2YWx1ZSBhdCB0aGlzIHBvaW50LCBpdCBpcwotICAgICByZXNwb25zaWJsZSBmb3IgbW92aW5nIHRoZSBjaGFuZ2VkIHZhbHVlIGludG8gc3ltcC0+YnN5bS0+dmFsdWUKLSAgICAgYXMgd2VsbC4gIEhvcGVmdWxseSBhbGwgc3ltYm9sIHZhbHVlIGNoYW5naW5nIGNhbiBiZSBkb25lIGluCi0gICAgICpfZnJvYl9zeW1ib2wuICAqLwotI2lmZGVmIHRjX2Zyb2JfZmlsZQotICB0Y19mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9maWxlCi0gIG9ial9mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgd3JpdGVfcmVsb2NzLCAoY2hhciAqKSAwKTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLSAgdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0gIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpOwotI2VuZGlmCi0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHdyaXRlX2NvbnRlbnRzLCAoY2hhciAqKSAwKTsKLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi19Ci0jZW5kaWYgLyogISBCRkQgKi8KLQotLyoKLSAqCQkJcmVsYXhfc2VnbWVudCgpCi0gKgotICogTm93IHdlIGhhdmUgYSBzZWdtZW50LCBub3QgYSBjcm93ZCBvZiBzdWItc2VnbWVudHMsIHdlIGNhbiBtYWtlIGZyX2FkZHJlc3MKLSAqIHZhbHVlcy4KLSAqCi0gKiBSZWxheCB0aGUgZnJhZ3MuCi0gKgotICogQWZ0ZXIgdGhpcywgYWxsIGZyYWdzIGluIHRoaXMgc2VnbWVudCBoYXZlIGFkZHJlc3NlcyB0aGF0IGFyZSBjb3JyZWN0Ci0gKiB3aXRoaW4gdGhlIHNlZ21lbnQuIFNpbmNlIHNlZ21lbnRzIGxpdmUgaW4gZGlmZmVyZW50IGZpbGUgYWRkcmVzc2VzLAotICogdGhlc2UgZnJhZyBhZGRyZXNzZXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyBmaW5hbCBvYmplY3QtZmlsZSBhZGRyZXNzZXMuCi0gKi8KLQotI2lmZGVmIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKLQotc3RhdGljIGludCBpc19kbnJhbmdlIFBBUkFNUyAoKGZyYWdTICosIGZyYWdTICopKTsKLQotLyogU3Vicm91dGluZXMgb2YgcmVsYXhfc2VnbWVudC4gICovCi1zdGF0aWMgaW50Ci1pc19kbnJhbmdlIChmMSwgZjIpCi0gICAgIGZyYWdTICpmMTsKLSAgICAgZnJhZ1MgKmYyOwotewotICBmb3IgKDsgZjE7IGYxID0gZjEtPmZyX25leHQpCi0gICAgaWYgKGYxLT5mcl9uZXh0ID09IGYyKQotICAgICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZWxheCBhIGZyYWdtZW50IGJ5IHNjYW5uaW5nIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUuICAqLwotCi1sb25nCi1yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBsb25nIHN0cmV0Y2g7Ci17Ci0gIGNvbnN0IHJlbGF4X3R5cGVTICp0aGlzX3R5cGU7Ci0gIGNvbnN0IHJlbGF4X3R5cGVTICpzdGFydF90eXBlOwotICByZWxheF9zdWJzdGF0ZVQgbmV4dF9zdGF0ZTsKLSAgcmVsYXhfc3Vic3RhdGVUIHRoaXNfc3RhdGU7Ci0gIGxvbmcgYWltLCB0YXJnZXQsIGdyb3d0aDsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0gIGxvbmcgb2Zmc2V0ID0gZnJhZ1AtPmZyX29mZnNldDsKLSAgLyogUmVjb21wdXRlIHdhc19hZGRyZXNzIGJ5IHVuZG9pbmcgIis9IHN0cmV0Y2giIGRvbmUgYnkgcmVsYXhfc2VnbWVudC4gICovCi0gIHVuc2lnbmVkIGxvbmcgd2FzX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyAtIHN0cmV0Y2g7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzOwotICBjb25zdCByZWxheF90eXBlUyAqdGFibGUgPSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFOwotCi0gIHRoaXNfc3RhdGUgPSBmcmFnUC0+ZnJfc3VidHlwZTsKLSAgc3RhcnRfdHlwZSA9IHRoaXNfdHlwZSA9IHRhYmxlICsgdGhpc19zdGF0ZTsKLSAgdGFyZ2V0ID0gb2Zmc2V0OwotCi0gIGlmIChzeW1ib2xQKQotICAgIHsKLSNpZm5kZWYgRElGRl9FWFBSX09LCi0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICAgICAga25vdyAoKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19BQlNPTFVURSkKLQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKQotCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0JTUykKLQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19URVhUKSk7Ci0jZW5kaWYKLSAgICAgIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcpOwotI2VuZGlmCi0gICAgICBrbm93ICghKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHx8IHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHRhcmdldCArPQlTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzOwotCi0gICAgICAvKiBJZiBmcmFnIGhhcyB5ZXQgdG8gYmUgcmVhY2hlZCBvbiB0aGlzIHBhc3MsCi0JIGFzc3VtZSBpdCB3aWxsIG1vdmUgYnkgU1RSRVRDSCBqdXN0IGFzIHdlIGRpZC4KLQkgSWYgdGhpcyBpcyBub3Qgc28sIGl0IHdpbGwgYmUgYmVjYXVzZSBzb21lIGZyYWcKLQkgYmV0d2VlbiBncm93cywgYW5kIHRoYXQgd2lsbCBmb3JjZSBhbm90aGVyIHBhc3MuCi0KLQkgQmV3YXJlIHplcm8tbGVuZ3RoIGZyYWdzLgotCi0JIFRoZXJlIHNob3VsZCBiZSBhIGZhc3RlciB3YXkgdG8gZG8gdGhpcy4gICovCi0KLSAgICAgIGlmIChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzID49IHdhc19hZGRyZXNzCi0JICAmJiBpc19kbnJhbmdlIChmcmFnUCwgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSkpCi0JewotCSAgdGFyZ2V0ICs9IHN0cmV0Y2g7Ci0JfQotICAgIH0KLQotICBhaW0gPSB0YXJnZXQgLSBhZGRyZXNzIC0gZnJhZ1AtPmZyX2ZpeDsKLSNpZmRlZiBUQ19QQ1JFTF9BREpVU1QKLSAgLyogQ3VycmVudGx5IG9ubHkgdGhlIG5zMzJrIGZhbWlseSBuZWVkcyB0aGlzICovCi0gIGFpbSArPSBUQ19QQ1JFTF9BREpVU1QoZnJhZ1ApOwotLyojZWxzZSovCi0gIC8qIFRoaXMgbWFjaGluZSBkb2Vzbid0IHdhbnQgdG8gdXNlIHBjcmVsX2FkanVzdC4KLSAgICAgSW4gdGhhdCBjYXNlLCBwY3JlbF9hZGp1c3Qgc2hvdWxkIGJlIHplcm8uICAqLwotLyogIGFzc2VydCAoZnJhZ1AtPmZyX3RhcmcubnMzMmsucGNyZWxfYWRqdXN0ID09IDApOyovCi0jZW5kaWYKLSNpZmRlZiBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gLyogZm9ybWVybHkgY2FsbGVkIE02OEtfQUlNX0tMVURHRSAqLwotICBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSk7Ci0jZW5kaWYKLQotICBpZiAoYWltIDwgMCkKLSAgICB7Ci0gICAgICAvKiBMb29rIGJhY2t3YXJkcy4gKi8KLSAgICAgIGZvciAobmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7IG5leHRfc3RhdGU7KQotCWlmIChhaW0gPj0gdGhpc190eXBlLT5ybHhfYmFja3dhcmQpCi0JICBuZXh0X3N0YXRlID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIC8qIEdyb3cgdG8gbmV4dCBzdGF0ZS4gKi8KLQkgICAgdGhpc19zdGF0ZSA9IG5leHRfc3RhdGU7Ci0JICAgIHRoaXNfdHlwZSA9IHRhYmxlICsgdGhpc19zdGF0ZTsKLQkgICAgbmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7Ci0JICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTG9vayBmb3J3YXJkcy4gKi8KLSAgICAgIGZvciAobmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7IG5leHRfc3RhdGU7KQotCWlmIChhaW0gPD0gdGhpc190eXBlLT5ybHhfZm9yd2FyZCkKLQkgIG5leHRfc3RhdGUgPSAwOwotCWVsc2UKLQkgIHsKLQkgICAgLyogR3JvdyB0byBuZXh0IHN0YXRlLiAqLwotCSAgICB0aGlzX3N0YXRlID0gbmV4dF9zdGF0ZTsKLQkgICAgdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOwotCSAgICBuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsKLQkgIH0KLSAgICB9Ci0KLSAgZ3Jvd3RoID0gdGhpc190eXBlLT5ybHhfbGVuZ3RoIC0gc3RhcnRfdHlwZS0+cmx4X2xlbmd0aDsKLSAgaWYgKGdyb3d0aCAhPSAwKQotICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gdGhpc19zdGF0ZTsKLSAgcmV0dXJuIGdyb3d0aDsKLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpICovCi0KLS8qIFJlbGF4X2FsaWduLiBBZHZhbmNlIGxvY2F0aW9uIGNvdW50ZXIgdG8gbmV4dCBhZGRyZXNzIHRoYXQgaGFzICdhbGlnbm1lbnQnCi0gICBsb3dlc3Qgb3JkZXIgYml0cyBhbGwgMHMsIHJldHVybiBzaXplIG9mIGFkanVzdG1lbnQgbWFkZS4gICovCi1zdGF0aWMgcmVsYXhfYWRkcmVzc1QKLXJlbGF4X2FsaWduIChhZGRyZXNzLCBhbGlnbm1lbnQpCi0gICAgIHJlZ2lzdGVyIHJlbGF4X2FkZHJlc3NUIGFkZHJlc3M7CS8qIEFkZHJlc3Mgbm93LiAqLwotICAgICByZWdpc3RlciBpbnQgYWxpZ25tZW50OwkvKiBBbGlnbm1lbnQgKGJpbmFyeSkuICovCi17Ci0gIHJlbGF4X2FkZHJlc3NUIG1hc2s7Ci0gIHJlbGF4X2FkZHJlc3NUIG5ld19hZGRyZXNzOwotCi0gIG1hc2sgPSB+KCh+MCkgPDwgYWxpZ25tZW50KTsKLSAgbmV3X2FkZHJlc3MgPSAoYWRkcmVzcyArIG1hc2spICYgKH5tYXNrKTsKLSNpZmRlZiBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZCi0gIGlmIChsaW5rcmVsYXgpCi0gICAgLyogV2UgbXVzdCBwcm92aWRlIGxvdHMgb2YgcGFkZGluZywgc28gdGhlIGxpbmtlciBjYW4gZGlzY2FyZCBpdAotICAgICAgIHdoZW4gbmVlZGVkLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBhZGQgZXh0cmEgc3BhY2UsIGV2ZXIuICAqLwotICAgIG5ld19hZGRyZXNzICs9ICgxIDw8IGFsaWdubWVudCk7Ci0jZW5kaWYKLSAgcmV0dXJuIChuZXdfYWRkcmVzcyAtIGFkZHJlc3MpOwotfQotCi12b2lkCi1yZWxheF9zZWdtZW50IChzZWdtZW50X2ZyYWdfcm9vdCwgc2VnbWVudCkKLSAgICAgc3RydWN0IGZyYWcgKnNlZ21lbnRfZnJhZ19yb290OwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBmcmFnICpmcmFnUDsKLSAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsKLSNpZiAhZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGtub3cgKHNlZ21lbnQgPT0gU0VHX0RBVEEgfHwgc2VnbWVudCA9PSBTRUdfVEVYVCB8fCBzZWdtZW50ID09IFNFR19CU1MpOwotI2VuZGlmCi0gIC8qIEluIGNhc2UgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSB3YW50cyB0byBtYWtlIGZpeFNzLiAqLwotICBzdWJzZWdfY2hhbmdlIChzZWdtZW50LCAwKTsKLQotICAvKiBGb3IgZWFjaCBmcmFnIGluIHNlZ21lbnQ6IGNvdW50IGFuZCBzdG9yZSAgKGEgMXN0IGd1ZXNzIG9mKQotICAgICBmcl9hZGRyZXNzLiAgKi8KLSAgYWRkcmVzcyA9IDA7Ci0gIGZvciAoZnJhZ1AgPSBzZWdtZW50X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgZnJhZ1AtPmZyX2FkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgYWRkcmVzcyArPSBmcmFnUC0+ZnJfZml4OwotCi0gICAgICBzd2l0Y2ggKGZyYWdQLT5mcl90eXBlKQotCXsKLQljYXNlIHJzX2ZpbGw6Ci0JICBhZGRyZXNzICs9IGZyYWdQLT5mcl9vZmZzZXQgKiBmcmFnUC0+ZnJfdmFyOwotCSAgYnJlYWs7Ci0KLQljYXNlIHJzX2FsaWduOgotCWNhc2UgcnNfYWxpZ25fY29kZToKLQkgIHsKLQkgICAgYWRkcmVzc1Qgb2Zmc2V0ID0gcmVsYXhfYWxpZ24gKGFkZHJlc3MsIChpbnQpIGZyYWdQLT5mcl9vZmZzZXQpOwotCi0JICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSAhPSAwICYmIG9mZnNldCA+IGZyYWdQLT5mcl9zdWJ0eXBlKQotCSAgICAgIG9mZnNldCA9IDA7Ci0KLQkgICAgaWYgKG9mZnNldCAlIGZyYWdQLT5mcl92YXIgIT0gMCkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiYWxpZ25tZW50IHBhZGRpbmcgKCVsdSBieXRlcykgbm90IGEgbXVsdGlwbGUgb2YgJWxkIiksCi0JCQkodW5zaWduZWQgbG9uZykgb2Zmc2V0LCAobG9uZykgZnJhZ1AtPmZyX3Zhcik7Ci0JCW9mZnNldCAtPSAob2Zmc2V0ICUgZnJhZ1AtPmZyX3Zhcik7Ci0JICAgICAgfQotCi0JICAgIGFkZHJlc3MgKz0gb2Zmc2V0OwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIHJzX29yZzoKLQljYXNlIHJzX3NwYWNlOgotCSAgLyogQXNzdW1lIC5vcmcgaXMgbnVnYXRvcnkuIEl0IHdpbGwgZ3JvdyB3aXRoIDFzdCByZWxheC4gICovCi0JICBicmVhazsKLQotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBhZGRyZXNzICs9IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCk7Ci0JICBicmVhazsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0JICAvKiBCcm9rZW4gd29yZHMgZG9uJ3QgY29uY2VybiB1cyB5ZXQgKi8KLQljYXNlIHJzX2Jyb2tlbl93b3JkOgotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgcnNfbGViMTI4OgotCSAgLyogSW5pdGlhbCBndWVzcyBpcyBhbHdheXMgMTsgZG9pbmcgb3RoZXJ3aXNlIGNhbiByZXN1bHQgaW4gCi0JICAgICBzdGFibGUgc29sdXRpb25zIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtLiAgKi8KLQkgIGFkZHJlc3MgKz0gZnJhZ1AtPmZyX29mZnNldCA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgcnNfY2ZhOgotCSAgYWRkcmVzcyArPSBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1ApOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLQkgIGJyZWFrOwotCX0JCQkvKiBzd2l0Y2goZnJfdHlwZSkgKi8KLSAgICB9CQkJCS8qIGZvciBlYWNoIGZyYWcgaW4gdGhlIHNlZ21lbnQgKi8KLQotICAvKiBEbyByZWxheCgpLiAgKi8KLSAgewotICAgIGxvbmcgc3RyZXRjaDsJLyogTWF5IGJlIGFueSBzaXplLCAwIG9yIG5lZ2F0aXZlLiAqLwotICAgIC8qIEN1bXVsYXRpdmUgbnVtYmVyIG9mIGFkZHJlc3NlcyB3ZSBoYXZlICovCi0gICAgLyogcmVsYXhlZCB0aGlzIHBhc3MuICovCi0gICAgLyogV2UgbWF5IGhhdmUgcmVsYXhlZCBtb3JlIHRoYW4gb25lIGFkZHJlc3MuICovCi0gICAgbG9uZyBzdHJldGNoZWQ7CS8qIEhhdmUgd2Ugc3RyZXRjaGVkIG9uIHRoaXMgcGFzcz8gKi8KLSAgICAvKiBUaGlzIGlzICdjdXogc3RyZXRjaCBtYXkgYmUgemVybywgd2hlbiwgaW4gZmFjdCBzb21lIHBpZWNlIG9mIGNvZGUKLSAgICAgICBncmV3LCBhbmQgYW5vdGhlciBzaHJhbmsuICBJZiBhIGJyYW5jaCBpbnN0cnVjdGlvbiBkb2Vzbid0IGZpdCBhbnltb3JlLAotICAgICAgIHdlIGNvdWxkIGJlIHNjcm9kLiAgKi8KLQotICAgIGRvCi0gICAgICB7Ci0Jc3RyZXRjaCA9IHN0cmV0Y2hlZCA9IDA7Ci0JZm9yIChmcmFnUCA9IHNlZ21lbnRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLQkgIHsKLQkgICAgbG9uZyBncm93dGggPSAwOwotCSAgICBhZGRyZXNzVCB3YXNfYWRkcmVzczsKLQkgICAgb2Zmc2V0VCBvZmZzZXQ7Ci0JICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLQkgICAgd2FzX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzczsKLQkgICAgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICs9IHN0cmV0Y2g7Ci0JICAgIHN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOwotCSAgICBvZmZzZXQgPSBmcmFnUC0+ZnJfb2Zmc2V0OwotCi0JICAgIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgcnNfZmlsbDoJLyogLmZpbGwgbmV2ZXIgcmVsYXhlcy4gKi8KLQkJZ3Jvd3RoID0gMDsKLQkJYnJlYWs7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotCQkvKiBKRjogIFRoaXMgaXMgUk1TJ3MgaWRlYS4gIEkgZG8gKk5PVCogd2FudCB0byBiZSBibGFtZWQKLQkJICAgZm9yIGl0IEkgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQuICBJIGRvIG5vdCB3YW50IHRvIGhhdmUKLQkJICAgYW55dGhpbmcgdG8gZG8gd2l0aCBpdC4gIFRoaXMgaXMgbm90IHRoZSBwcm9wZXIgd2F5IHRvCi0JCSAgIGltcGxlbWVudCB0aGlzIG1pc2ZlYXR1cmUuICAqLwotCSAgICAgIGNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0JCXsKLQkJICBzdHJ1Y3QgYnJva2VuX3dvcmQgKmxpZTsKLQkJICBzdHJ1Y3QgYnJva2VuX3dvcmQgKnVudHJ1dGg7Ci0KLQkJICAvKiBZZXMgdGhpcyBpcyB1Z2x5IChzdG9yaW5nIHRoZSBicm9rZW5fd29yZCBwb2ludGVyCi0JCSAgICAgaW4gdGhlIHN5bWJvbCBzbG90KS4gIFN0aWxsLCB0aGlzIHdob2xlIGNodW5rIG9mCi0JCSAgICAgY29kZSBpcyB1Z2x5LCBhbmQgSSBkb24ndCBmZWVsIGxpa2UgZG9pbmcgYW55dGhpbmcKLQkJICAgICBhYm91dCBpdC4gIFRoaW5rIG9mIGl0IGFzIHN0dWJib3JubmVzcyBpbiBhY3Rpb24uICAqLwotCQkgIGdyb3d0aCA9IDA7Ci0JCSAgZm9yIChsaWUgPSAoc3RydWN0IGJyb2tlbl93b3JkICopIChmcmFnUC0+ZnJfc3ltYm9sKTsKLQkJICAgICAgIGxpZSAmJiBsaWUtPmRpc3BmcmFnID09IGZyYWdQOwotCQkgICAgICAgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQotCQkgICAgewotCi0JCSAgICAgIGlmIChsaWUtPmFkZGVkKQotCQkJY29udGludWU7Ci0KLQkJICAgICAgb2Zmc2V0ID0gKHN5bWJvbF9nZXRfZnJhZyAobGllLT5hZGQpLT5mcl9hZGRyZXNzCi0JCQkJKyBTX0dFVF9WQUxVRSAobGllLT5hZGQpCi0JCQkJKyBsaWUtPmFkZG51bQotCQkJCS0gKHN5bWJvbF9nZXRfZnJhZyAobGllLT5zdWIpLT5mcl9hZGRyZXNzCi0JCQkJICAgKyBTX0dFVF9WQUxVRSAobGllLT5zdWIpKSk7Ci0JCSAgICAgIGlmIChvZmZzZXQgPD0gLTMyNzY4IHx8IG9mZnNldCA+PSAzMjc2NykKLQkJCXsKLQkJCSAgaWYgKGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQpCi0JCQkgICAgewotCQkJICAgICAgY2hhciBidWZbNTBdOwotCQkJICAgICAgc3ByaW50X3ZhbHVlIChidWYsIChhZGRyZXNzVCkgbGllLT5hZGRudW0pOwotCQkJICAgICAgYXNfd2FybiAoXygiLndvcmQgJXMtJXMrJXMgZGlkbid0IGZpdCIpLAotCQkJCSAgICAgICBTX0dFVF9OQU1FIChsaWUtPmFkZCksCi0JCQkJICAgICAgIFNfR0VUX05BTUUgKGxpZS0+c3ViKSwKLQkJCQkgICAgICAgYnVmKTsKLQkJCSAgICB9Ci0JCQkgIGxpZS0+YWRkZWQgPSAxOwotCQkJICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBmcmFnUC0+ZnJfc3VidHlwZSsrOwotCQkJICAgICAgZ3Jvd3RoICs9IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQkJCSAgICB9Ci0JCQkgIGZvciAodW50cnV0aCA9IGxpZS0+bmV4dF9icm9rZW5fd29yZDsKLQkJCSAgICAgICB1bnRydXRoICYmIHVudHJ1dGgtPmRpc3BmcmFnID09IGxpZS0+ZGlzcGZyYWc7Ci0JCQkgICAgICAgdW50cnV0aCA9IHVudHJ1dGgtPm5leHRfYnJva2VuX3dvcmQpCi0JCQkgICAgaWYgKChzeW1ib2xfZ2V0X2ZyYWcgKHVudHJ1dGgtPmFkZCkKLQkJCQkgPT0gc3ltYm9sX2dldF9mcmFnIChsaWUtPmFkZCkpCi0JCQkJJiYgKFNfR0VUX1ZBTFVFICh1bnRydXRoLT5hZGQpCi0JCQkJICAgID09IFNfR0VUX1ZBTFVFIChsaWUtPmFkZCkpKQotCQkJICAgICAgewotCQkJCXVudHJ1dGgtPmFkZGVkID0gMjsKLQkJCQl1bnRydXRoLT51c2VfanVtcCA9IGxpZTsKLQkJCSAgICAgIH0KLQkJCSAgZ3Jvd3RoICs9IG1kX2xvbmdfanVtcF9zaXplOwotCQkJfQotCQkgICAgfQotCi0JCSAgYnJlYWs7Ci0JCX0JCS8qIGNhc2UgcnNfYnJva2VuX3dvcmQgKi8KLSNlbmRpZgotCSAgICAgIGNhc2UgcnNfYWxpZ246Ci0JICAgICAgY2FzZSByc19hbGlnbl9jb2RlOgotCQl7Ci0JCSAgYWRkcmVzc1Qgb2xkb2ZmLCBuZXdvZmY7Ci0KLQkJICBvbGRvZmYgPSByZWxheF9hbGlnbiAod2FzX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4LAotCQkJCQkoaW50KSBvZmZzZXQpOwotCQkgIG5ld29mZiA9IHJlbGF4X2FsaWduIChhZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCwKLQkJCQkJKGludCkgb2Zmc2V0KTsKLQotCQkgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAob2xkb2ZmID4gZnJhZ1AtPmZyX3N1YnR5cGUpCi0JCQlvbGRvZmYgPSAwOwotCQkgICAgICBpZiAobmV3b2ZmID4gZnJhZ1AtPmZyX3N1YnR5cGUpCi0JCQluZXdvZmYgPSAwOwotCQkgICAgfQotCi0JCSAgZ3Jvd3RoID0gbmV3b2ZmIC0gb2xkb2ZmOwotCQl9Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSByc19vcmc6Ci0JCXsKLQkJICBsb25nIHRhcmdldCA9IG9mZnNldDsKLQkJICBsb25nIGFmdGVyOwotCi0JCSAgaWYgKHN5bWJvbFApCi0JCSAgICB7Ci0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotCQkgICAgICBrbm93ICgoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0FCU09MVVRFKQotCQkJICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkKLQkJCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX1RFWFQpCi0JCQkgICAgfHwgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0JTUyk7Ci0JCSAgICAgIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcpOwotCQkgICAgICBrbm93ICghKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19BQlNPTFVURSkKLQkJCSAgICB8fCAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSNlbmRpZgotCQkgICAgICB0YXJnZXQgKz0gKFNfR0VUX1ZBTFVFIChzeW1ib2xQKQotCQkJCSArIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX2FkZHJlc3MpOwotCQkgICAgfQkJLyogaWYgd2UgaGF2ZSBhIHN5bWJvbCAqLwotCi0JCSAga25vdyAoZnJhZ1AtPmZyX25leHQpOwotCQkgIGFmdGVyID0gZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3M7Ci0JCSAgZ3Jvd3RoID0gdGFyZ2V0IC0gYWZ0ZXI7Ci0JCSAgaWYgKGdyb3d0aCA8IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIEdyb3d0aCBtYXkgYmUgbmVnYXRpdmUsIGJ1dCB2YXJpYWJsZSBwYXJ0IG9mIGZyYWcKLQkJCSBjYW5ub3QgaGF2ZSBmZXdlciB0aGFuIDAgY2hhcnMuICBUaGF0IGlzLCB3ZSBjYW4ndAotCQkJIC5vcmcgYmFja3dhcmRzLiAqLwotCQkgICAgICBhc19iYWRfd2hlcmUgKGZyYWdQLT5mcl9maWxlLCBmcmFnUC0+ZnJfbGluZSwKLQkJCQkgICAgXygiYXR0ZW1wdCB0byAub3JnIGJhY2t3YXJkcyBpZ25vcmVkIikpOwotCi0JCSAgICAgIC8qIFdlJ3ZlIGlzc3VlZCBhbiBlcnJvciBtZXNzYWdlLiAgQ2hhbmdlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcgdG8gYXZvaWQgY2FzY2FkaW5nIGVycm9ycy4gICovCi0JCSAgICAgIGZyYWdQLT5mcl90eXBlID0gcnNfYWxpZ247Ci0JCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMDsKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCA9IDA7Ci0JCSAgICAgIGZyYWdQLT5mcl9maXggPSBhZnRlciAtIGFkZHJlc3M7Ci0JCSAgICAgIGdyb3d0aCA9IHN0cmV0Y2g7Ci0JCSAgICB9Ci0KLQkJICBncm93dGggLT0gc3RyZXRjaDsJLyogVGhpcyBpcyBhbiBhYnNvbHV0ZSBncm93dGggZmFjdG9yICovCi0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGNhc2UgcnNfc3BhY2U6Ci0JCWlmIChzeW1ib2xQKQotCQkgIHsKLQkJICAgIGdyb3d0aCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkJICAgIGlmIChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApICE9ICZ6ZXJvX2FkZHJlc3NfZnJhZwotCQkJfHwgU19JU19DT01NT04gKHN5bWJvbFApCi0JCQl8fCAhIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JCSAgICAgIGFzX2JhZF93aGVyZSAoZnJhZ1AtPmZyX2ZpbGUsIGZyYWdQLT5mcl9saW5lLAotCQkJCSAgICBfKCIuc3BhY2Ugc3BlY2lmaWVzIG5vbi1hYnNvbHV0ZSB2YWx1ZSIpKTsKLQkJICAgIGZyYWdQLT5mcl9zeW1ib2wgPSAwOwotCQkgICAgaWYgKGdyb3d0aCA8IDApCi0JCSAgICAgIHsKLQkJCWFzX3dhcm4gKF8oIi5zcGFjZSBvciAuZmlsbCB3aXRoIG5lZ2F0aXZlIHZhbHVlLCBpZ25vcmVkIikpOwotCQkJZ3Jvd3RoID0gMDsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIGdyb3d0aCA9IDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLSNpZmRlZiBtZF9yZWxheF9mcmFnCi0JCWdyb3d0aCA9IG1kX3JlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKTsKLSNlbHNlCi0jaWZkZWYgVENfR0VORVJJQ19SRUxBWF9UQUJMRQotCQkvKiBUaGUgZGVmYXVsdCB3YXkgdG8gcmVsYXggYSBmcmFnIGlzIHRvIGxvb2sgdGhyb3VnaAotCQkgICBUQ19HRU5FUklDX1JFTEFYX1RBQkxFLiAgKi8KLQkJZ3Jvd3RoID0gcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotI2VuZGlmIC8qIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgKi8KLSNlbmRpZgotCQlicmVhazsKLQotCSAgICAgIGNhc2UgcnNfbGViMTI4OgotCQl7Ci0JCSAgdmFsdWVUIHZhbHVlOwotCQkgIGludCBzaXplOwotCi0JCSAgdmFsdWUgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZ1AtPmZyX3N5bWJvbCwgMCk7Ci0JCSAgc2l6ZSA9IHNpemVvZl9sZWIxMjggKHZhbHVlLCBmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JCSAgZ3Jvd3RoID0gc2l6ZSAtIGZyYWdQLT5mcl9vZmZzZXQ7Ci0JCSAgZnJhZ1AtPmZyX29mZnNldCA9IHNpemU7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHJzX2NmYToKLQkJZ3Jvd3RoID0gZWhfZnJhbWVfcmVsYXhfZnJhZyAoZnJhZ1ApOwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6Ci0JCUJBRF9DQVNFIChmcmFnUC0+ZnJfdHlwZSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgaWYgKGdyb3d0aCkKLQkgICAgICB7Ci0JCXN0cmV0Y2ggKz0gZ3Jvd3RoOwotCQlzdHJldGNoZWQrKzsKLQkgICAgICB9Ci0JICB9CQkJLyogRm9yIGVhY2ggZnJhZyBpbiB0aGUgc2VnbWVudC4gKi8KLSAgICAgIH0KLSAgICB3aGlsZSAoc3RyZXRjaGVkKTsJCS8qIFVudGlsIG5vdGhpbmcgZnVydGhlciB0byByZWxheC4gKi8KLSAgfQkJCQkvKiBkb19yZWxheCAqLwotCi0gIC8qCi0gICAqIFdlIG5vdyBoYXZlIHZhbGlkIGZyX2FkZHJlc3MnZXMgZm9yIGVhY2ggZnJhZy4KLSAgICovCi0KLSAgLyoKLSAgICogQWxsIGZyX2FkZHJlc3MncyBhcmUgY29ycmVjdCwgcmVsYXRpdmUgdG8gdGhlaXIgb3duIHNlZ21lbnQuCi0gICAqIFdlIGhhdmUgbWFkZSBhbGwgdGhlIGZpeFMgd2Ugd2lsbCBldmVyIG1ha2UuCi0gICAqLwotfQkJCQkvKiByZWxheF9zZWdtZW50KCkgKi8KLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICghZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZCAoT0JKX1ZNUykpCi0KLSNpZm5kZWYgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChYKSAoMSkKLSNlbmRpZgotCi0vKiBmaXh1cF9zZWdtZW50KCkKLQotICAgR28gdGhyb3VnaCBhbGwgdGhlIGZpeFMncyBpbiBhIHNlZ21lbnQgYW5kIHNlZSB3aGljaCBvbmVzIGNhbiBiZQotICAgaGFuZGxlZCBub3cuICAoVGhlc2UgY29uc2lzdCBvZiBmaXhTIHdoZXJlIHdlIGhhdmUgc2luY2UgZGlzY292ZXJlZAotICAgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLCBvciB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhZyBpbnZvbHZlZC4pCi0gICBGb3IgZWFjaCBvbmUsIGNhbGwgbWRfYXBwbHlfZml4IHRvIHB1dCB0aGUgZml4IGludG8gdGhlIGZyYWcgZGF0YS4KLQotICAgUmVzdWx0IGlzIGEgY291bnQgb2YgaG93IG1hbnkgcmVsb2NhdGlvbiBzdHJ1Y3RzIHdpbGwgYmUgbmVlZGVkIHRvCi0gICBoYW5kbGUgdGhlIHJlbWFpbmluZyBmaXhTJ3MgdGhhdCB3ZSBjb3VsZG4ndCBjb21wbGV0ZWx5IGhhbmRsZSBoZXJlLgotICAgVGhlc2Ugd2lsbCBiZSBvdXRwdXQgbGF0ZXIgYnkgZW1pdF9yZWxvY2F0aW9ucygpLiAgKi8KLQotc3RhdGljIGxvbmcKLWZpeHVwX3NlZ21lbnQgKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmaXhTICpmaXhQOwotICAgICBzZWdUIHRoaXNfc2VnbWVudF90eXBlOwkvKiBOX1RZUEUgYml0cyBmb3Igc2VnbWVudC4gKi8KLXsKLSAgbG9uZyBzZWdfcmVsb2NfY291bnQgPSAwOwotICBzeW1ib2xTICphZGRfc3ltYm9sUDsKLSAgc3ltYm9sUyAqc3ViX3N5bWJvbFA7Ci0gIHZhbHVlVCBhZGRfbnVtYmVyOwotICBpbnQgc2l6ZTsKLSAgY2hhciAqcGxhY2U7Ci0gIGxvbmcgd2hlcmU7Ci0gIGludCBwY3JlbCwgcGx0OwotICBmcmFnUyAqZnJhZ1A7Ci0gIHNlZ1QgYWRkX3N5bWJvbF9zZWdtZW50ID0gYWJzb2x1dGVfc2VjdGlvbjsKLQotICAvKiBJZiB0aGUgbGlua2VyIGlzIGRvaW5nIHRoZSByZWxheGluZywgd2UgbXVzdCBub3QgZG8gYW55IGZpeHVwcy4KLQotICAgICBXZWxsLCBzdHJpY3RseSBzcGVha2luZyB0aGF0J3Mgbm90IHRydWUgLS0gd2UgY291bGQgZG8gYW55IHRoYXQgYXJlCi0gICAgIFBDLXJlbGF0aXZlIGFuZCBkb24ndCBjcm9zcyByZWdpb25zIHRoYXQgY291bGQgY2hhbmdlIHNpemUuICBBbmQgZm9yIHRoZQotICAgICBpOTYwICh0aGUgb25seSBtYWNoaW5lIGZvciB3aGljaCB3ZSd2ZSBnb3QgYSByZWxheGluZyBsaW5rZXIgcmlnaHQgbm93KSwKLSAgICAgd2UgbWlnaHQgYmUgYWJsZSB0byB0dXJuIGNhbGx4L2NhbGxqIGludG8gYmFsIGFueXdheXMgaW4gY2FzZXMgd2hlcmUgd2UKLSAgICAga25vdyB0aGUgbWF4aW11bSBkaXNwbGFjZW1lbnQuICAqLwotICBpZiAobGlua3JlbGF4KQotICAgIHsKLSAgICAgIGZvciAoOyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLQlzZWdfcmVsb2NfY291bnQrKzsKLSAgICAgIFRDX0FESlVTVF9SRUxPQ19DT1VOVCAoZml4UCwgc2VnX3JlbG9jX2NvdW50KTsKLSAgICAgIHJldHVybiBzZWdfcmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGZvciAoOyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0KLSNpZmRlZiBERUJVRzUKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxucHJvY2Vzc2luZyBmaXh1cDpcbiIpOwotICAgICAgcHJpbnRfZml4dXAgKGZpeFApOwotI2VuZGlmCi0KLQotICAgICAgZnJhZ1AgPSBmaXhQLT5meF9mcmFnOwotICAgICAga25vdyAoZnJhZ1ApOwotICAgICAgd2hlcmUgPSBmaXhQLT5meF93aGVyZTsKLSAgICAgIHBsYWNlID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyB3aGVyZTsKLSAgICAgIHNpemUgPSBmaXhQLT5meF9zaXplOwotICAgICAgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeTsKLSNpZmRlZiBUQ19WQUxJREFURV9GSVgKLSAgICAgIFRDX1ZBTElEQVRFX0ZJWCAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUsIHNraXApOwotI2VuZGlmCi0gICAgICBzdWJfc3ltYm9sUCA9IGZpeFAtPmZ4X3N1YnN5OwotICAgICAgYWRkX251bWJlciA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgIHBjcmVsID0gZml4UC0+ZnhfcGNyZWw7Ci0gICAgICBwbHQgPSBmaXhQLT5meF9wbHQ7Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMCi0JICAmJiBzeW1ib2xfbXJpX2NvbW1vbl9wIChhZGRfc3ltYm9sUCkpCi0JewotCSAga25vdyAoYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCSAgZml4UC0+Znhfb2Zmc2V0ID0gYWRkX251bWJlcjsKLQkgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kgPQotCSAgICBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGFkZF9zeW1ib2xQKS0+WF9hZGRfc3ltYm9sOwotCX0KLQotICAgICAgaWYgKGFkZF9zeW1ib2xQKQotCWFkZF9zeW1ib2xfc2VnbWVudCA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKTsKLQotICAgICAgaWYgKHN1Yl9zeW1ib2xQKQotCXsKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzdWJfc3ltYm9sUCwgMSk7Ci0JICBpZiAoYWRkX3N5bWJvbFAgPT0gTlVMTCB8fCBhZGRfc3ltYm9sX3NlZ21lbnQgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMKQotCQl7Ci0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCQkgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIEl0J3MganVzdCAtc3ltICovCi0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCQl7Ci0JCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gTlVMTDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHBjcmVsCi0JCSAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gdGhpc19zZWdtZW50X3R5cGUpCi0JCXsKLQkJICAvKiBTaG91bGQgdHJ5IGNvbnZlcnRpbmcgdG8gYSBjb25zdGFudC4gICovCi0JCSAgZ290byBiYWRfc3ViX3JlbG9jOwotCQl9Ci0JICAgICAgZWxzZQotCSAgICAgIGJhZF9zdWJfcmVsb2M6Ci0JCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICAgIF8oIk5lZ2F0aXZlIG9mIG5vbi1hYnNvbHV0ZSBzeW1ib2wgJXMiKSwKLQkJCSAgICAgIFNfR0VUX05BTUUgKHN1Yl9zeW1ib2xQKSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhZGRfc3ltYm9sX3NlZ21lbnQKLQkJICAgJiYgU0VHX05PUk1BTCAoYWRkX3N5bWJvbF9zZWdtZW50KSkKLQkgICAgewotCSAgICAgIC8qIERpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIGZyb20gc2FtZSBzZWdtZW50LgotCQkgQ2FuJ3QgbWFrZSBkaWZmZXJlbmNlIG9mIDIgdW5kZWZpbmVkczogJ3ZhbHVlJyBtZWFucwotCQkgc29tZXRoaW5nIGRpZmZlcmVudCBmb3IgTl9VTkRGLiAqLwotI2lmZGVmIFRDX0k5NjAKLQkgICAgICAvKiBNYWtlcyBubyBzZW5zZSB0byB1c2UgdGhlIGRpZmZlcmVuY2Ugb2YgMiBhcmJpdHJhcnkgc3ltYm9scwotCQkgYXMgdGhlIHRhcmdldCBvZiBhIGNhbGwgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChmaXhQLT5meF90Y2JpdCkKLQkJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgICAgXygiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiKSk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKSAtCi0JCVNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0KLQkgICAgICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0JICAgICAgcGNyZWwgPSAwOwkvKiBObyBmdXJ0aGVyIHBjcmVsIHByb2Nlc3NpbmcuICovCi0KLQkgICAgICAvKiBMZXQgdGhlIHRhcmdldCBtYWNoaW5lIG1ha2UgdGhlIGZpbmFsIGRldGVybWluYXRpb24KLQkJIGFzIHRvIHdoZXRoZXIgb3Igbm90IGEgcmVsb2NhdGlvbiB3aWxsIGJlIG5lZWRlZCB0bwotCQkgaGFuZGxlIHRoaXMgZml4dXAuICAqLwotCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSkpCi0JCXsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDA7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBEaWZmZXJlbnQgc2VnbWVudHMgaW4gc3VidHJhY3Rpb24uICovCi0JICAgICAga25vdyAoIShTX0lTX0VYVEVSTkFMIChzdWJfc3ltYm9sUCkKLQkJICAgICAgJiYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkpOwotCi0JICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0JCWFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQotI2lmZGVmIERJRkZfRVhQUl9PSwotCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSB0aGlzX3NlZ21lbnRfdHlwZQotI2lmIDAgLyogRG8gdGhpcyBldmVuIGlmIGl0J3MgYWxyZWFkeSBkZXNjcmliZWQgYXMgcGMtcmVsYXRpdmUuICBGb3IgZXhhbXBsZSwKLQkgb24gdGhlIG02OGssIGFuIG9wZXJhbmQgb2YgInBjQChmb28tLi0yKSIgc2hvdWxkIGFkZHJlc3MgImZvbyIgaW4gYQotCSBwYy1yZWxhdGl2ZSBtb2RlLiAgKi8KLQkJICAgICAgICYmIHBjcmVsCi0jZW5kaWYKLQkJICAgICAgICkKLQkJewotCQkgIC8qIE1ha2UgaXQgcGMtcmVsYXRpdmUuICAqLwotCQkgIGFkZF9udW1iZXIgKz0gKE1EX1BDUkVMX0ZST01fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpCi0JCQkJIC0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKSk7Ci0JCSAgcGNyZWwgPSAxOwotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMTsKLQkJICBzdWJfc3ltYm9sUCA9IDA7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSAwOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSwotCSAgICAgIC8qIFRoZSBQQSBuZWVkcyB0aGlzIGZvciBQSUMgY29kZSBnZW5lcmF0aW9uLiAgV2UgYmFzaWNhbGx5Ci0JCSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nIGlmIHdlIGhhdmUgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvCi0JCSBzeW1ib2xzIGF0IHRoaXMgcG9pbnQuICAqLwotCSAgICAgIGVsc2UgaWYgKDEpCi0JCXsKLQkJICAvKiBMZWF2ZSBpdCBhbG9uZS4gICovCi0JCX0KLSNlbmRpZgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0dQUkVMMzIKLQkJICAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfR1BSRUwxNikKLQkJewotCQkgIC8qIExlYXZlIGl0IGFsb25lLiAgKi8KLQkJfQotI2VuZGlmCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciBidWZbNTBdOwotCQkgIHNwcmludF92YWx1ZSAoYnVmLCBmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKTsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiU3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zIFwiJXNcIiB7JXMgc2VjdGlvbn0gLSBcIiVzXCIgeyVzIHNlY3Rpb259IGF0IGZpbGUgYWRkcmVzcyAlcy4iKSwKLQkJCQlTX0dFVF9OQU1FIChhZGRfc3ltYm9sUCksCi0JCQkJc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCkpLAotCQkJCVNfR0VUX05BTUUgKHN1Yl9zeW1ib2xQKSwKLQkJCQlzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSksCi0JCQkJYnVmKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoYWRkX3N5bWJvbFApCi0JewotCSAgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSB0aGlzX3NlZ21lbnRfdHlwZSAmJiBwY3JlbCAmJiAhcGx0Ci0JICAgICAgJiYgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQIChmaXhQKSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogVGhpcyBmaXh1cCB3YXMgbWFkZSB3aGVuIHRoZSBzeW1ib2wncyBzZWdtZW50IHdhcwotCSAgICAgICAqIFNFR19VTktOT1dOLCBidXQgaXQgaXMgbm93IGluIHRoZSBsb2NhbCBzZWdtZW50LgotCSAgICAgICAqIFNvIHdlIGtub3cgaG93IHRvIGRvIHRoZSBhZGRyZXNzIHdpdGhvdXQgcmVsb2NhdGlvbi4KLQkgICAgICAgKi8KLSNpZmRlZiBUQ19JOTYwCi0JICAgICAgLyogcmVsb2NfY2FsbGooKSBtYXkgcmVwbGFjZSBhICdjYWxsJyB3aXRoIGEgJ2NhbGxzJyBvciBhCi0JCSAnYmFsJywgaW4gd2hpY2ggY2FzZXMgaXQgbW9kaWZpZXMgKmZpeFAgYXMgYXBwcm9wcmlhdGUuCi0JCSBJbiB0aGUgY2FzZSBvZiBhICdjYWxscycsIG5vIGZ1cnRoZXIgd29yayBpcyByZXF1aXJlZCwKLQkJIGFuZCAqZml4UCBoYXMgYmVlbiBzZXQgdXAgdG8gbWFrZSB0aGUgcmVzdCBvZiB0aGUgY29kZQotCQkgYmVsb3cgYSBuby1vcC4gKi8KLQkgICAgICByZWxvY19jYWxsaiAoZml4UCk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0JICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCSAgICAgIGFkZF9udW1iZXIgLT0gTURfUENSRUxfRlJPTV9TRUNUSU9OIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSk7Ci0JICAgICAgcGNyZWwgPSAwOwkvKiBMaWUuIERvbid0IHdhbnQgZnVydGhlciBwY3JlbCBwcm9jZXNzaW5nLiAqLwotCi0JICAgICAgLyogTGV0IHRoZSB0YXJnZXQgbWFjaGluZSBtYWtlIHRoZSBmaW5hbCBkZXRlcm1pbmF0aW9uCi0JCSBhcyB0byB3aGV0aGVyIG9yIG5vdCBhIHJlbG9jYXRpb24gd2lsbCBiZSBuZWVkZWQgdG8KLQkJIGhhbmRsZSB0aGlzIGZpeHVwLiAgKi8KLQkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQl7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAwOwotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24KLQkJICAmJiAhIHBjcmVsKQotCQl7Ci0jaWZkZWYgVENfSTk2MAotCQkgIC8qIFNlZSBjb21tZW50IGFib3V0IHJlbG9jX2NhbGxqKCkgYWJvdmUuICAqLwotCQkgIHJlbG9jX2NhbGxqIChmaXhQKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCi0JCSAgLyogTGV0IHRoZSB0YXJnZXQgbWFjaGluZSBtYWtlIHRoZSBmaW5hbCBkZXRlcm1pbmF0aW9uCi0JCSAgICAgYXMgdG8gd2hldGhlciBvciBub3QgYSByZWxvY2F0aW9uIHdpbGwgYmUgbmVlZGVkIHRvCi0JCSAgICAgaGFuZGxlIHRoaXMgZml4dXAuICAqLwotCi0JCSAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJICAgIHsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgICAgICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGFkZF9zeW1ib2xfc2VnbWVudCkKLSNlbmRpZgotCQkgICAgICAgKQotCQl7Ci0jaWZkZWYgVENfSTk2MAotCQkgIGlmICgoaW50KSBmaXhQLT5meF9iaXRfZml4UCA9PSAxMykKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIENPQlIgaW5zdHJ1Y3Rpb24uICBUaGV5IGhhdmUgb25seSBhCi0JCSAgICAgICAqIDEzLWJpdCBkaXNwbGFjZW1lbnQgYW5kIGFyZSBvbmx5IHRvIGJlIHVzZWQKLQkJICAgICAgICogZm9yIGxvY2FsIGJyYW5jaGVzOiBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZQotCQkgICAgICAgKiByZWxvY2F0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCSAgICBfKCJjYW4ndCB1c2UgQ09CUiBmb3JtYXQgd2l0aCBleHRlcm5hbCBsYWJlbCIpKTsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgICAgICBmaXhQLT5meF9kb25lID0gMTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9CQkvKiBDT0JSICovCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0jaWZkZWYgT0JKX0NPRkYKLSNpZmRlZiBURV9JMzg2QUlYCi0JCSAgaWYgKFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpCi0JCSAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0jZW5kaWYgLyogVEVfSTM4NkFJWCAqLwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0JCSAgKytzZWdfcmVsb2NfY291bnQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzZWdfcmVsb2NfY291bnQrKzsKLSNpZiAhKGRlZmluZWQgKFRDX1Y4NTApICYmIGRlZmluZWQgKE9CSl9FTEYpKQotI2lmICEoZGVmaW5lZCAoVENfTTY4SykgJiYgZGVmaW5lZCAoT0JKX0VMRikpCi0jaWYgIShkZWZpbmVkIChUQ19BUk0pICAmJiBkZWZpbmVkIChPQkpfRUxGKSkKLSNpZiAhKGRlZmluZWQgKFRDX0k5NjApICYmIGRlZmluZWQgKE9CSl9FTEYpKQotI2lmICFkZWZpbmVkIChUQ19JMzg2KSB8fCAhKGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9DT0ZGKSkgfHwgZGVmaW5lZCAoVEVfUEUpCi0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocGNyZWwpCi0JewotCSAgYWRkX251bWJlciAtPSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKTsKLQkgIGlmIChhZGRfc3ltYm9sUCA9PSAwKQotCSAgICB7Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgICBmaXhQLT5meF9hZGRzeSA9ICZhYnNfc3ltYm9sOwotI2Vsc2UKLQkgICAgICBmaXhQLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSNlbmRpZgotCSAgICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeFAtPmZ4X2FkZHN5KTsKLQkgICAgICArK3NlZ19yZWxvY19jb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCFmaXhQLT5meF9kb25lKQotCXsKLSNpZmRlZiBNRF9BUFBMWV9GSVgzCi0JICBtZF9hcHBseV9maXgzIChmaXhQLCAmYWRkX251bWJlciwgdGhpc19zZWdtZW50X3R5cGUpOwotI2Vsc2UKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICBtZF9hcHBseV9maXggKGZpeFAsICZhZGRfbnVtYmVyKTsKLSNlbHNlCi0JICBtZF9hcHBseV9maXggKGZpeFAsIGFkZF9udW1iZXIpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBUQ19IQU5ETEVTX0ZYX0RPTkUKLQkgIC8qIElmIHRoZSB0Yy0qIGZpbGVzIGhhdmVuJ3QgYmVlbiBjb252ZXJ0ZWQsIGFzc3VtZSBpdCdzIGhhbmRsaW5nCi0JICAgICBpdCB0aGUgb2xkIHdheSwgd2hlcmUgYSBudWxsIGZ4X2FkZHN5IG1lYW5zIHRoYXQgdGhlIGZpeCBoYXMKLQkgICAgIGJlZW4gYXBwbGllZCBjb21wbGV0ZWx5LCBhbmQgbm8gZnVydGhlciB3b3JrIGlzIG5lZWRlZC4gICovCi0JICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiBmaXhQLT5meF9wY3JlbCA9PSAwKQotCSAgICBmaXhQLT5meF9kb25lID0gMTsKLSNlbmRpZgotCX0KLQotICAgICAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCAmJiAhZml4UC0+Znhfbm9fb3ZlcmZsb3cgJiYgc2l6ZSA+IDApCi0JewotCSAgaWYgKChzaXplX3QpIHNpemUgPCBzaXplb2YgKHZhbHVlVCkpCi0JICAgIHsKLQkgICAgICB2YWx1ZVQgbWFzazsKLQotCSAgICAgIG1hc2sgPSAwOwotCSAgICAgIG1hc2stLTsJCS8qIHNldCBhbGwgYml0cyB0byBvbmUgKi8KLQkgICAgICBtYXNrIDw8PSBzaXplICogOCAtIChmaXhQLT5meF9zaWduZWQgPyAxIDogMCk7Ci0JICAgICAgaWYgKChhZGRfbnVtYmVyICYgbWFzaykgIT0gMCAmJiAoYWRkX251bWJlciAmIG1hc2spICE9IG1hc2spCi0JCXsKLQkJICBjaGFyIGJ1Zls1MF0sIGJ1ZjJbNTBdOwotCQkgIHNwcmludF92YWx1ZSAoYnVmLCBmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKTsKLQkJICBpZiAoYWRkX251bWJlciA+IDEwMDApCi0JCSAgICBzcHJpbnRfdmFsdWUgKGJ1ZjIsIGFkZF9udW1iZXIpOwotCQkgIGVsc2UKLQkJICAgIHNwcmludGYgKGJ1ZjIsICIlbGQiLCAobG9uZykgYWRkX251bWJlcik7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIlZhbHVlIG9mICVzIHRvbyBsYXJnZSBmb3IgZmllbGQgb2YgJWQgYnl0ZXMgYXQgJXMiKSwKLQkJCQlidWYyLCBzaXplLCBidWYpOwotCQl9IC8qIGdlbmVyaWMgZXJyb3IgY2hlY2tpbmcgKi8KLQkgICAgfQotI2lmZGVmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKLQkgIC8qIFdhcm4gaWYgYSAud29yZCB2YWx1ZSBpcyB0b28gbGFyZ2Ugd2hlbiB0cmVhdGVkIGFzIGEgc2lnbmVkCi0JICAgICBudW1iZXIuICBXZSBhbHJlYWR5IGtub3cgaXQgaXMgbm90IHRvbyBuZWdhdGl2ZS4gIFRoaXMgaXMgdG8KLQkgICAgIGNhdGNoIG92ZXItbGFyZ2Ugc3dpdGNoZXMgZ2VuZXJhdGVkIGJ5IGdjYyBvbiB0aGUgNjhrLiAgKi8KLQkgIGlmICghZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2sKLQkgICAgICAmJiBzaXplID09IDIKLQkgICAgICAmJiBhZGRfbnVtYmVyID4gMHg3ZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIlNpZ25lZCAud29yZCBvdmVyZmxvdzsgc3dpdGNoIG1heSBiZSB0b28gbGFyZ2U7ICVsZCBhdCAweCVseCIpLAotCQkJICAobG9uZykgYWRkX251bWJlciwKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7Ci0jZW5kaWYKLQl9CQkJLyogbm90IGEgYml0IGZpeCAqLwotCi0jaWZkZWYgVENfVkFMSURBVEVfRklYCi0gICAgc2tpcDogIEFUVFJJQlVURV9VTlVTRURfTEFCRUwKLSAgICAgIDsKLSNlbmRpZgotI2lmZGVmIERFQlVHNQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAicmVzdWx0OlxuIik7Ci0gICAgICBwcmludF9maXh1cCAoZml4UCk7Ci0jZW5kaWYKLSAgICB9CQkJCS8qIEZvciBlYWNoIGZpeFMgaW4gdGhpcyBzZWdtZW50LiAqLwotCi0gIFRDX0FESlVTVF9SRUxPQ19DT1VOVCAoZml4UCwgc2VnX3JlbG9jX2NvdW50KTsKLSAgcmV0dXJuIHNlZ19yZWxvY19jb3VudDsKLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICghZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZCAoT0JKX1ZNUykpICovCi0KLXZvaWQKLW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBpZiAoKHNpemVfdCkgbiA+IHNpemVvZiAodmFsKSB8fCBuIDw9IDApCi0gICAgYWJvcnQgKCk7Ci0gIHdoaWxlIChuLS0pCi0gICAgewotICAgICAgYnVmW25dID0gdmFsICYgMHhmZjsKLSAgICAgIHZhbCA+Pj0gODsKLSAgICB9Ci19Ci0KLXZvaWQKLW51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBpZiAoKHNpemVfdCkgbiA+IHNpemVvZiAodmFsKSB8fCBuIDw9IDApCi0gICAgYWJvcnQgKCk7Ci0gIHdoaWxlIChuLS0pCi0gICAgewotICAgICAgKmJ1ZisrID0gdmFsICYgMHhmZjsKLSAgICAgIHZhbCA+Pj0gODsKLSAgICB9Ci19Ci0KLXZvaWQKLXdyaXRlX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGZwcmludGYgKGZpbGUsICJmaXh1cHM6ICVkXG4iLCBuX2ZpeHVwcyk7Ci19Ci0KLS8qIGZvciBkZWJ1Z2dpbmcgKi8KLWV4dGVybiBpbnQgaW5kZW50X2xldmVsOwotCi12b2lkCi1wcmludF9maXh1cCAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaW5kZW50X2xldmVsID0gMTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZml4ICVseCAlczolZCIsIChsb25nKSBmaXhwLCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiBwY3JlbCIpOwotICBpZiAoZml4cC0+ZnhfcGNyZWxfYWRqdXN0KQotICAgIGZwcmludGYgKHN0ZGVyciwgIiBwY3JlbF9hZGp1c3Q9JWQiLCBmaXhwLT5meF9wY3JlbF9hZGp1c3QpOwotICBpZiAoZml4cC0+ZnhfaW1fZGlzcCkKLSAgICB7Ci0jaWZkZWYgVENfTlMzMksKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiBpbV9kaXNwPSVkIiwgZml4cC0+ZnhfaW1fZGlzcCk7Ci0jZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGltX2Rpc3AiKTsKLSNlbmRpZgotICAgIH0KLSAgaWYgKGZpeHAtPmZ4X3RjYml0KQotICAgIGZwcmludGYgKHN0ZGVyciwgIiB0Y2JpdCIpOwotICBpZiAoZml4cC0+ZnhfZG9uZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgZG9uZSIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcbiAgICBzaXplPSVkIGZyYWc9JWx4IHdoZXJlPSVsZCBvZmZzZXQ9JWx4IGFkZG51bWJlcj0lbHgiLAotCSAgIGZpeHAtPmZ4X3NpemUsIChsb25nKSBmaXhwLT5meF9mcmFnLCAobG9uZykgZml4cC0+Znhfd2hlcmUsCi0JICAgKGxvbmcpIGZpeHAtPmZ4X29mZnNldCwgKGxvbmcpIGZpeHAtPmZ4X2FkZG51bWJlcik7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmcHJpbnRmIChzdGRlcnIsICJcbiAgICAlcyAoJWQpIiwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSksCi0JICAgZml4cC0+Znhfcl90eXBlKTsKLSNlbHNlCi0jaWZkZWYgTkVFRF9GWF9SX1RZUEUKLSAgZnByaW50ZiAoc3RkZXJyLCAiIHJfdHlwZT0lZCIsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0jZW5kaWYKLSNlbmRpZgotICBpZiAoZml4cC0+ZnhfYWRkc3kpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICArPCIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKHN0ZGVyciwgZml4cC0+ZnhfYWRkc3kpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiPiIpOwotICAgIH0KLSAgaWYgKGZpeHAtPmZ4X3N1YnN5KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuICAgLTwiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChzdGRlcnIsIGZpeHAtPmZ4X3N1YnN5KTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIj4iKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jaWZkZWYgVENfRklYX0RBVEFfUFJJTlQKLSAgVENfRklYX0RBVEFfUFJJTlQgKHN0ZGVyciwgZml4cCk7Ci0jZW5kaWYKLX0KLQotLyogZW5kIG9mIHdyaXRlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy93cml0ZS5oIGIvZ2FzL3dyaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmQyYWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3dyaXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogd3JpdGUuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX193cml0ZV9oX18KLSNkZWZpbmUgX193cml0ZV9oX18KLQotI2lmbmRlZiBUQ19JOTYwCi0jaWZkZWYgaHB1eAotI2RlZmluZSBFWEVDX01BQ0hJTkVfVFlQRSBIUDkwMDBTMjAwX0lECi0jZW5kaWYKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lIFswXSA9PSAnTCcgKQotI2VuZGlmCi0KLSNkZWZpbmUgU19MT0NBTF9OQU1FKHMpIChMT0NBTF9MQUJFTCAoU19HRVRfTkFNRSAocykpKQotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFRoaXMgaXMgdGhlIG5hbWUgb2YgYSBmYWtlIHN5bWJvbCB3aGljaCB3aWxsIG5ldmVyIGFwcGVhciBpbiB0aGUKLSAgIGFzc2VtYmxlciBvdXRwdXQuICBTX0lTX0xPQ0FMIGRldGVjdHMgaXQgYmVjYXVzZSBvZiB0aGUgXDAwMS4gICovCi0jZGVmaW5lIEZBS0VfTEFCRUxfTkFNRSAiTDBcMDAxIgotCi0jaW5jbHVkZSAiYml0X2ZpeC5oIgotCi0vKgotICogRml4U3MgbWF5IGJlIGJ1aWx0IHVwIGluIGFueSBvcmRlci4KLSAqLwotCi1zdHJ1Y3QgZml4Ci17Ci0gIC8qIFRoZXNlIHNtYWxsIGZpZWxkcyBhcmUgZ3JvdXBlZCB0b2dldGhlciBmb3IgY29tcGFjdG5lc3Mgb2YKLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBlZmZpY2llbmN5IG9mIGFjY2VzcyBvbiBzb21lIGFyY2hpdGVjdHVyZXMuICAqLwotCi0gIC8qIHBjLXJlbGF0aXZlIG9mZnNldCBhZGp1c3QgKG9ubHkgdXNlZCBieSBtNjhrKSAqLwotICBjaGFyIGZ4X3BjcmVsX2FkanVzdDsKLQotICAvKiBIb3cgbWFueSBieXRlcyBhcmUgaW52b2x2ZWQ/ICovCi0gIHVuc2lnbmVkIGNoYXIgZnhfc2l6ZTsKLQotICAvKiBJcyB0aGlzIGEgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbj8gICovCi0gIHVuc2lnbmVkIGZ4X3BjcmVsIDogMTsKLQotICAvKiBJcyB0aGlzIGEgcmVsb2NhdGlvbiB0byBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5PyAgSWYgc28sCi0gICAgIHNvbWUgb2YgdGhlIHJlZHVjdGlvbnMgd2UgdHJ5IHRvIGFwcGx5IGFyZSBpbnZhbGlkLiAgQSBiZXR0ZXIgd2F5Ci0gICAgIG1pZ2h0IGJlIHRvIHJlcHJlc2VudCBQTFQgZW50cmllcyB3aXRoIGRpZmZlcmVudCBraW5kcyBvZgotICAgICBzeW1ib2xzLCBhbmQgdXNlIG5vcm1hbCByZWxvY2F0aW9ucyAod2l0aCB1bmRlZmluZWQgc3ltYm9scyk7Ci0gICAgIGxvb2sgaW50byBpdCBmb3IgdmVyc2lvbiAyLjYuICAqLwotICB1bnNpZ25lZCBmeF9wbHQgOiAxOwotCi0gIC8qIElzIHRoaXMgdmFsdWUgYW4gaW1tZWRpYXRlIGRpc3BsYWNlbWVudD8gICovCi0gIC8qIE9ubHkgdXNlZCBvbiBpOTYwIGFuZCBuczMyazsgbWVyZ2UgaXQgaW50byBUQ19GSVhfVFlQRSBzb21ldGltZS4gICovCi0gIHVuc2lnbmVkIGZ4X2ltX2Rpc3AgOiAyOwotCi0gIC8qIEEgYml0IGZvciB0aGUgQ1BVIHNwZWNpZmljIGNvZGUuCi0gICAgIFRoaXMgcHJvYmFibHkgY2FuIGJlIGZvbGRlZCBpbnRvIHRjX2ZpeF9kYXRhLCBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGZ4X3RjYml0IDogMTsKLQotICAvKiBIYXMgdGhpcyByZWxvY2F0aW9uIGFscmVhZHkgYmVlbiBhcHBsaWVkPyAgKi8KLSAgdW5zaWduZWQgZnhfZG9uZSA6IDE7Ci0KLSAgLyogU3VwcHJlc3Mgb3ZlcmZsb3cgY29tcGxhaW50cyBvbiBsYXJnZSBhZGRlbmRzLiAgVGhpcyBpcyB1c2VkCi0gICAgIGluIHRoZSBQb3dlclBDIEVMRiBjb25maWcgdG8gYWxsb3cgbGFyZ2UgYWRkZW5kcyBvbiB0aGUKLSAgICAgQkZEX1JFTE9DX3tMTzE2LEhJMTYsSEkxNl9TfSByZWxvY2F0aW9ucy4KLQotICAgICBAQCBDYW4gdGhpcyBiZSBkZXRlcm1pbmVkIGZyb20gQkZEPyAgKi8KLSAgdW5zaWduZWQgZnhfbm9fb3ZlcmZsb3cgOiAxOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyBzaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuICAqLwotICB1bnNpZ25lZCBmeF9zaWduZWQgOiAxOwotCi0gIC8qIFdoaWNoIGZyYWcgZG9lcyB0aGlzIGZpeCBhcHBseSB0bz8gICovCi0gIGZyYWdTICpmeF9mcmFnOwotCi0gIC8qIFdoZXJlIGlzIHRoZSBmaXJzdCBieXRlIHRvIGZpeCB1cD8gICovCi0gIGxvbmcgZnhfd2hlcmU7Ci0KLSAgLyogTlVMTCBvciBTeW1ib2wgd2hvc2UgdmFsdWUgd2UgYWRkIGluLiAqLwotICBzeW1ib2xTICpmeF9hZGRzeTsKLQotICAvKiBOVUxMIG9yIFN5bWJvbCB3aG9zZSB2YWx1ZSB3ZSBzdWJ0cmFjdC4gKi8KLSAgc3ltYm9sUyAqZnhfc3Vic3k7Ci0KLSAgLyogQWJzb2x1dGUgbnVtYmVyIHdlIGFkZCBpbi4gKi8KLSAgdmFsdWVUIGZ4X29mZnNldDsKLQotICAvKiBOZXh0IGZpeFMgaW4gbGlua2VkIGxpc3QsIG9yIE5VTEwuICAqLwotICBzdHJ1Y3QgZml4ICpmeF9uZXh0OwotCi0gIC8qIElmIE5VTEwsIG5vIGJpdGZpeCdzIHRvIGRvLiAgKi8KLSAgLyogT25seSBpOTYwLWNvZmYgYW5kIG5zMzJrIHVzZSB0aGlzLCBhbmQgaTk2MC1jb2ZmIHN0b3JlcyBhbgotICAgICBpbnRlZ2VyLiAgVGhpcyBjYW4gcHJvYmFibHkgYmUgZm9sZGVkIGludG8gdGNfZml4X2RhdGEsIGJlbG93LgotICAgICBAQCBBbHBoYSBhbHNvIHVzZXMgaXQsIGJ1dCBvbmx5IHRvIGRpc2FibGUgY2VydGFpbiByZWxvY2F0aW9uCi0gICAgIHByb2Nlc3NpbmcuICAqLwotICBiaXRfZml4UyAqZnhfYml0X2ZpeFA7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmeF9yX3R5cGU7Ci0jZWxzZQotI2lmZGVmIE5FRURfRlhfUl9UWVBFCi0gIC8qIEhhY2sgZm9yIG1hY2hpbmVzIHdoZXJlIHRoZSB0eXBlIG9mIHJlbG9jIGNhbid0IGJlCi0gICAgIHdvcmtlZCBvdXQgYnkgbG9va2luZyBhdCBob3cgYmlnIGl0IGlzLiAgKi8KLSAgaW50IGZ4X3JfdHlwZTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgLyogVGhpcyBmaWVsZCBpcyBzb3J0IG9mIG1pc25hbWVkLiAgSXQgYXBwZWFycyB0byBiZSBhIHNvcnQgb2YgcmFuZG9tCi0gICAgIHNjcmF0Y2ggZmllbGQsIGZvciB1c2UgYnkgdGhlIGJhY2sgZW5kcy4gIFRoZSBtYWluIGdhcyBjb2RlIGRvZXNuJ3QKLSAgICAgZG8gYW55dGhpbmcgYnV0IGluaXRpYWxpemUgaXQgdG8gemVyby4gIFRoZSB1c2Ugb2YgaXQgZG9lcyBuZWVkIHRvCi0gICAgIGJlIGNvb3JkaW5hdGVkIGJldHdlZW4gdGhlIGNwdSBhbmQgZm9ybWF0IGZpbGVzLCB0aG91Z2guICBFLmcuLCBzb21lCi0gICAgIGNvZmYgdGFyZ2V0cyBwYXNzIHRoZSBgYWRkZW5kJyBmaWVsZCBmcm9tIHRoZSBjcHUgZmlsZSB2aWEgdGhpcwotICAgICBmaWVsZC4gIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGBmeF9vZmZzZXQnIGZpZWxkIGFib3ZlIGNhbid0IGJlIHVzZWQKLSAgICAgZm9yIHRoYXQ7IGludmVzdGlnYXRlIGxhdGVyIGFuZCBkb2N1bWVudC4gS1IgICovCi0gIHZhbHVlVCBmeF9hZGRudW1iZXI7Ci0KLSAgLyogVGhlIGxvY2F0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBjcmVhdGVkIHRoZSByZWxvYywgdXNlZAotICAgICBpbiBlcnJvciBtZXNzYWdlcy4gICovCi0gIGNoYXIgKmZ4X2ZpbGU7Ci0gIHVuc2lnbmVkIGZ4X2xpbmU7Ci0KLSNpZmRlZiBVU0lOR19DR0VOCi0gIHN0cnVjdCB7Ci0gICAgLyogQ0dFTl9JTlNOIGVudHJ5IGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICBjb25zdCBzdHJ1Y3QgY2dlbl9pbnNuICppbnNuOwotICAgIC8qIFRhcmdldCBzcGVjaWZpYyBkYXRhLCB1c3VhbGx5IHJlbG9jIG51bWJlci4gICovCi0gICAgaW50IG9waW5mbzsKLSAgfSBmeF9jZ2VuOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19GSVhfVFlQRQotICAvKiBMb2NhdGlvbiB3aGVyZSBhIGJhY2tlbmQgY2FuIGF0dGFjaCBhZGRpdGlvbmFsIGRhdGEKLSAgICAgbmVlZGVkIHRvIHBlcmZvcm0gZml4dXBzLiAgKi8KLSAgVENfRklYX1RZUEUgdGNfZml4X2RhdGE7Ci0jZW5kaWYKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGZpeCBmaXhTOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBjaGFyICpuZXh0X29iamVjdF9maWxlX2NoYXJQOwotCi0jaWZuZGVmIE1BTllfU0VHTUVOVFMKLUNPTU1PTiBmaXhTICp0ZXh0X2ZpeF9yb290LCAqdGV4dF9maXhfdGFpbDsJLyogQ2hhaW5zIGZpeFNzLiAqLwotQ09NTU9OIGZpeFMgKmRhdGFfZml4X3Jvb3QsICpkYXRhX2ZpeF90YWlsOwkvKiBDaGFpbnMgZml4U3MuICovCi1DT01NT04gZml4UyAqYnNzX2ZpeF9yb290LCAqYnNzX2ZpeF90YWlsOwkvKiBDaGFpbnMgZml4U3MuICovCi1leHRlcm4gc3RydWN0IGZyYWcgKnRleHRfbGFzdF9mcmFnOwkJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi1leHRlcm4gc3RydWN0IGZyYWcgKmRhdGFfbGFzdF9mcmFnOwkJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi0jZW5kaWYKLUNPTU1PTiBmaXhTICoqc2VnX2ZpeF9yb290UCwgKipzZWdfZml4X3RhaWxQOwkvKiAtPiBvbmUgb2YgYWJvdmUuICovCi0jZW5kaWYKLQotZXh0ZXJuIGxvbmcgc3RyaW5nX2J5dGVfY291bnQ7Ci1leHRlcm4gaW50IHNlY3Rpb25fYWxpZ25tZW50W107Ci0KLWV4dGVybiBiaXRfZml4UyAqYml0X2ZpeF9uZXcKLSAgUEFSQU1TICgoaW50IHNpemUsIGludCBvZmZzZXQsIGxvbmcgYmFzZV90eXBlLCBsb25nIGJhc2VfYWRqLCBsb25nIG1pbiwKLQkgICBsb25nIG1heCwgbG9uZyBhZGQpKTsKLWV4dGVybiB2b2lkIGFwcGVuZCBQQVJBTVMgKChjaGFyICoqY2hhclBQLCBjaGFyICpmcm9tUCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpKTsKLWV4dGVybiB2b2lkIHJlY29yZF9hbGlnbm1lbnQgUEFSQU1TICgoc2VnVCBzZWcsIGludCBhbGlnbikpOwotZXh0ZXJuIHZvaWQgc3Vic2Vnc19maW5pc2ggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgd3JpdGVfb2JqZWN0X2ZpbGUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGxvbmcgcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqLCBsb25nKSk7Ci1leHRlcm4gdm9pZCByZWxheF9zZWdtZW50Ci0gIFBBUkFNUyAoKHN0cnVjdCBmcmFnICogc2VnX2ZyYWdfcm9vdCwgc2VnVCBzZWdfdHlwZSkpOwotCi1leHRlcm4gdm9pZCBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQpKTsKLWV4dGVybiB2b2lkIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gICAgUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCkpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGZpeFMgKmZpeF9uZXcKLSAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBzeW1ib2xTICogYWRkX3N5bWJvbCwKLQkgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlKSk7Ci1leHRlcm4gZml4UyAqZml4X25ld19leHAKLSAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBleHByZXNzaW9uUyAqZXhwLCBpbnQgcGNyZWwsCi0JICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZSkpOwotI2Vsc2UKLWV4dGVybiBmaXhTICpmaXhfbmV3Ci0gIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgc3ltYm9sUyAqIGFkZF9zeW1ib2wsCi0JICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwgaW50IHJfdHlwZSkpOwotZXh0ZXJuIGZpeFMgKmZpeF9uZXdfZXhwCi0gIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgZXhwcmVzc2lvblMgKmV4cCwgaW50IHBjcmVsLAotCSAgIGludCByX3R5cGUpKTsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCB3cml0ZV9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOwotCi0jZW5kaWYgLyogX193cml0ZV9oX18gKi8KLS8qIGVuZCBvZiB3cml0ZS5oICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvd2luZG93cy5taCBiL2dkYi9jb25maWcvaTM4Ni93aW5kb3dzLm1oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTMzYTZlLi4wMDAwMDAwCi0tLSBhL2dkYi9jb25maWcvaTM4Ni93aW5kb3dzLm1oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBnZGJ3aW4ubyBhbmQgc2VyLXdpbjMycy5jIGhhdmUgdG8gYmUgbmFtZWQgYmVjYXVzZSB0aGV5IGhhdmUKLSMgICBfaW5pdGlhbGl6ZSBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGZvdW5kIGJ5IGluaXQuYwotIyBndWkub3JlcyBoYXMgdG8gYmUgbmFtZWQsIG9yIGVsc2UgbXN2YyB3b24ndCBsaW5rIGl0IGluLgotWERFUEZJTEVTID0gXAotCW1zd2luL2dkYndpbi5vIFwKLQltc3dpbi9zZXItd2luMzJzLm8gXAotCW1zd2luL2d1aS5vcmVzIFwKLQltc3dpbi9saWJ3aW5nZGIuYQotCi0kKFhERVBGSUxFUyk6Ci0Jcm9vdG1lPWBwd2RgIDsgZXhwb3J0IHJvb3RtZSA7IFwKLQkoIGNkIG1zd2luIDsgXAotCSAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGFsbCApCi0KLVhNX0ZJTEU9eG0td2luZG93cy5oCi1NTUFMTE9DPQotU0VSX0hBUkRXSVJFID0KZGlmZiAtLWdpdCBhL2dkYi9kb2MvR0RCdm4udGV4aSBiL2dkYi9kb2MvR0RCdm4udGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3MjJiZC4uMDAwMDAwMAotLS0gYS9nZGIvZG9jL0dEQnZuLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1Ac2V0IEdEQlZOIDQuMTgKZGlmZiAtLWdpdCBhL2dkYi9kb2MvcmVtb3RlLnRleGkgYi9nZGIvZG9jL3JlbW90ZS50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTRiMmEyLi4wMDAwMDAwCi0tLSBhL2dkYi9kb2MvcmVtb3RlLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAyICswLDAgQEAKLUBjCQkJCQkJCQktKi0gVGV4aW5mbyAtKi0KLUBjIENvcHlyaWdodCAoYykgMTk5MCAxOTkxIDE5OTIgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBzb3VyY2UgZm9yIHRoZSBHREIgbWFudWFsLgotCi1Abm9kZSBSZW1vdGUgU2VyaWFsCi1Ac3Vic2VjdGlvbiBUaGUgQHZhbHVle0dEQk59IHJlbW90ZSBzZXJpYWwgcHJvdG9jb2wKLQotQGNpbmRleCByZW1vdGUgc2VyaWFsIGRlYnVnZ2luZywgb3ZlcnZpZXcKLVRvIGRlYnVnIGEgcHJvZ3JhbSBydW5uaW5nIG9uIGFub3RoZXIgbWFjaGluZSAodGhlIGRlYnVnZ2luZwotQGRmbnt0YXJnZXR9IG1hY2hpbmUpLCB5b3UgbXVzdCBmaXJzdCBhcnJhbmdlIGZvciBhbGwgdGhlIHVzdWFsCi1wcmVyZXF1aXNpdGVzIGZvciB0aGUgcHJvZ3JhbSB0byBydW4gYnkgaXRzZWxmLiAgRm9yIGV4YW1wbGUsIGZvciBhIEMKLXByb2dyYW0sIHlvdSBuZWVkOgotCi1AZW51bWVyYXRlCi1AaXRlbQotQSBzdGFydHVwIHJvdXRpbmUgdG8gc2V0IHVwIHRoZSBDIHJ1bnRpbWUgZW52aXJvbm1lbnQ7IHRoZXNlIHVzdWFsbHkKLWhhdmUgYSBuYW1lIGxpa2UgQGZpbGV7Y3J0MH0uICBUaGUgc3RhcnR1cCByb3V0aW5lIG1heSBiZSBzdXBwbGllZCBieQoteW91ciBoYXJkd2FyZSBzdXBwbGllciwgb3IgeW91IG1heSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duLgotCi1AaXRlbSAKLVlvdSBwcm9iYWJseSBuZWVkIGEgQyBzdWJyb3V0aW5lIGxpYnJhcnkgdG8gc3VwcG9ydCB5b3VyIHByb2dyYW0ncwotc3Vicm91dGluZSBjYWxscywgbm90YWJseSBtYW5hZ2luZyBpbnB1dCBhbmQgb3V0cHV0LgotCi1AaXRlbQotQSB3YXkgb2YgZ2V0dGluZyB5b3VyIHByb2dyYW0gdG8gdGhlIG90aGVyIG1hY2hpbmUtLS1mb3IgZXhhbXBsZSwgYQotZG93bmxvYWQgcHJvZ3JhbS4gIFRoZXNlIGFyZSBvZnRlbiBzdXBwbGllZCBieSB0aGUgaGFyZHdhcmUKLW1hbnVmYWN0dXJlciwgYnV0IHlvdSBtYXkgaGF2ZSB0byB3cml0ZSB5b3VyIG93biBmcm9tIGhhcmR3YXJlCi1kb2N1bWVudGF0aW9uLgotQGVuZCBlbnVtZXJhdGUKLQotVGhlIG5leHQgc3RlcCBpcyB0byBhcnJhbmdlIGZvciB5b3VyIHByb2dyYW0gdG8gdXNlIGEgc2VyaWFsIHBvcnQgdG8KLWNvbW11bmljYXRlIHdpdGggdGhlIG1hY2hpbmUgd2hlcmUgQHZhbHVle0dEQk59IGlzIHJ1bm5pbmcgKHRoZSBAZGZue2hvc3R9Ci1tYWNoaW5lKS4gIEluIGdlbmVyYWwgdGVybXMsIHRoZSBzY2hlbWUgbG9va3MgbGlrZSB0aGlzOgotCi1AdGFibGUgQGVtcGgKLUBpdGVtIE9uIHRoZSBob3N0LAotQHZhbHVle0dEQk59IGFscmVhZHkgdW5kZXJzdGFuZHMgaG93IHRvIHVzZSB0aGlzIHByb3RvY29sOyB3aGVuIGV2ZXJ5dGhpbmcKLWVsc2UgaXMgc2V0IHVwLCB5b3UgY2FuIHNpbXBseSB1c2UgdGhlIEBzYW1we3RhcmdldCByZW1vdGV9IGNvbW1hbmQKLShAcHhyZWZ7VGFyZ2V0cywsU3BlY2lmeWluZyBhIERlYnVnZ2luZyBUYXJnZXR9KS4KLQotQGl0ZW0gT24gdGhlIHRhcmdldCwKLXlvdSBtdXN0IGxpbmsgd2l0aCB5b3VyIHByb2dyYW0gYSBmZXcgc3BlY2lhbC1wdXJwb3NlIHN1YnJvdXRpbmVzIHRoYXQKLWltcGxlbWVudCB0aGUgQHZhbHVle0dEQk59IHJlbW90ZSBzZXJpYWwgcHJvdG9jb2wuICBUaGUgZmlsZSBjb250YWluaW5nIHRoZXNlCi1zdWJyb3V0aW5lcyBpcyBjYWxsZWQgIGEgQGRmbntkZWJ1Z2dpbmcgc3R1Yn0uCi0KLU9uIGNlcnRhaW4gcmVtb3RlIHRhcmdldHMsIHlvdSBjYW4gdXNlIGFuIGF1eGlsaWFyeSBwcm9ncmFtCi1AY29kZXtnZGJzZXJ2ZXJ9IGluc3RlYWQgb2YgbGlua2luZyBhIHN0dWIgaW50byB5b3VyIHByb2dyYW0uCi1AeHJlZntTZXJ2ZXIsLFVzaW5nIHRoZSBAY29kZXtnZGJzZXJ2ZXJ9IHByb2dyYW19LCBmb3IgZGV0YWlscy4KLUBlbmQgdGFibGUKLQotVGhlIGRlYnVnZ2luZyBzdHViIGlzIHNwZWNpZmljIHRvIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHJlbW90ZQotbWFjaGluZTsgZm9yIGV4YW1wbGUsIHVzZSBAZmlsZXtzcGFyYy1zdHViLmN9IHRvIGRlYnVnIHByb2dyYW1zIG9uCi1Ac2N7c3BhcmN9IGJvYXJkcy4KLQotQGNpbmRleCByZW1vdGUgc2VyaWFsIHN0dWIgbGlzdAotVGhlc2Ugd29ya2luZyByZW1vdGUgc3R1YnMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggQHZhbHVle0dEQk59OgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gaTM4Ni1zdHViLmMKLUBraW5kZXggaTM4Ni1zdHViLmMKLUBjaW5kZXggSW50ZWwKLUBjaW5kZXggaTM4NgotRm9yIEludGVsIDM4NiBhbmQgY29tcGF0aWJsZSBhcmNoaXRlY3R1cmVzLgotCi1AaXRlbSBtNjhrLXN0dWIuYwotQGtpbmRleCBtNjhrLXN0dWIuYwotQGNpbmRleCBNb3Rvcm9sYSA2ODB4MAotQGNpbmRleCBtNjgweDAKLUZvciBNb3Rvcm9sYSA2ODB4MCBhcmNoaXRlY3R1cmVzLgotCi1AaXRlbSBzaC1zdHViLmMKLUBraW5kZXggc2gtc3R1Yi5jCi1AY2luZGV4IEhpdGFjaGkKLUBjaW5kZXggU0gKLUZvciBIaXRhY2hpIFNIIGFyY2hpdGVjdHVyZXMuCi0KLUBpdGVtIHNwYXJjLXN0dWIuYwotQGtpbmRleCBzcGFyYy1zdHViLmMKLUBjaW5kZXggU3BhcmMKLUZvciBAc2N7c3BhcmN9IGFyY2hpdGVjdHVyZXMuCi0KLUBpdGVtIHNwYXJjbC1zdHViLmMKLUBraW5kZXggc3BhcmNsLXN0dWIuYwotQGNpbmRleCBGdWppdHN1Ci1AY2luZGV4IFNwYXJjTGl0ZQotRm9yIEZ1aml0c3UgQHNje3NwYXJjbGl0ZX0gYXJjaGl0ZWN0dXJlcy4KLQotQGVuZCB0YWJsZQotCi1UaGUgQGZpbGV7UkVBRE1FfSBmaWxlIGluIHRoZSBAdmFsdWV7R0RCTn0gZGlzdHJpYnV0aW9uIG1heSBsaXN0IG90aGVyCi1yZWNlbnRseSBhZGRlZCBzdHVicy4KLQotQG1lbnUKLSogU3R1YiBDb250ZW50czo6ICAgICAgIFdoYXQgdGhlIHN0dWIgY2FuIGRvIGZvciB5b3UKLSogQm9vdHN0cmFwcGluZzo6ICAgICAgIFdoYXQgeW91IG11c3QgZG8gZm9yIHRoZSBzdHViCi0qIERlYnVnIFNlc3Npb246OiAgICAgICBQdXR0aW5nIGl0IGFsbCB0b2dldGhlcgotKiBQcm90b2NvbDo6ICAgICAgICAgICAgRGVmaW5pdGlvbiBvZiB0aGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbAotKiBTZXJ2ZXI6OgkJVXNpbmcgdGhlIGBnZGJzZXJ2ZXInIHByb2dyYW0KLSogTmV0V2FyZTo6CQlVc2luZyB0aGUgYGdkYnNlcnZlLm5sbScgcHJvZ3JhbQotQGVuZCBtZW51Ci0KLUBub2RlIFN0dWIgQ29udGVudHMKLUBzdWJzdWJzZWN0aW9uIFdoYXQgdGhlIHN0dWIgY2FuIGRvIGZvciB5b3UKLQotQGNpbmRleCByZW1vdGUgc2VyaWFsIHN0dWIKLVRoZSBkZWJ1Z2dpbmcgc3R1YiBmb3IgeW91ciBhcmNoaXRlY3R1cmUgc3VwcGxpZXMgdGhlc2UgdGhyZWUKLXN1YnJvdXRpbmVzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHNldF9kZWJ1Z190cmFwcwotQGtpbmRleCBzZXRfZGVidWdfdHJhcHMKLUBjaW5kZXggcmVtb3RlIHNlcmlhbCBzdHViLCBpbml0aWFsaXphdGlvbgotVGhpcyByb3V0aW5lIGFycmFuZ2VzIGZvciBAY29kZXtoYW5kbGVfZXhjZXB0aW9ufSB0byBydW4gd2hlbiB5b3VyCi1wcm9ncmFtIHN0b3BzLiAgWW91IG11c3QgY2FsbCB0aGlzIHN1YnJvdXRpbmUgZXhwbGljaXRseSBuZWFyIHRoZQotYmVnaW5uaW5nIG9mIHlvdXIgcHJvZ3JhbS4KLQotQGl0ZW0gaGFuZGxlX2V4Y2VwdGlvbgotQGtpbmRleCBoYW5kbGVfZXhjZXB0aW9uCi1AY2luZGV4IHJlbW90ZSBzZXJpYWwgc3R1YiwgbWFpbiByb3V0aW5lCi1UaGlzIGlzIHRoZSBjZW50cmFsIHdvcmtob3JzZSwgYnV0IHlvdXIgcHJvZ3JhbSBuZXZlciBjYWxscyBpdAotZXhwbGljaXRseS0tLXRoZSBzZXR1cCBjb2RlIGFycmFuZ2VzIGZvciBAY29kZXtoYW5kbGVfZXhjZXB0aW9ufSB0bwotcnVuIHdoZW4gYSB0cmFwIGlzIHRyaWdnZXJlZC4KLQotQGNvZGV7aGFuZGxlX2V4Y2VwdGlvbn0gdGFrZXMgY29udHJvbCB3aGVuIHlvdXIgcHJvZ3JhbSBzdG9wcyBkdXJpbmcKLWV4ZWN1dGlvbiAoZm9yIGV4YW1wbGUsIG9uIGEgYnJlYWtwb2ludCksIGFuZCBtZWRpYXRlcyBjb21tdW5pY2F0aW9ucwotd2l0aCBAdmFsdWV7R0RCTn0gb24gdGhlIGhvc3QgbWFjaGluZS4gIFRoaXMgaXMgd2hlcmUgdGhlIGNvbW11bmljYXRpb25zCi1wcm90b2NvbCBpcyBpbXBsZW1lbnRlZDsgQGNvZGV7aGFuZGxlX2V4Y2VwdGlvbn0gYWN0cyBhcyB0aGUgQHZhbHVle0dEQk59Ci1yZXByZXNlbnRhdGl2ZSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmU7IGl0IGJlZ2lucyBieSBzZW5kaW5nIHN1bW1hcnkKLWluZm9ybWF0aW9uIG9uIHRoZSBzdGF0ZSBvZiB5b3VyIHByb2dyYW0sIHRoZW4gY29udGludWVzIHRvIGV4ZWN1dGUsCi1yZXRyaWV2aW5nIGFuZCB0cmFuc21pdHRpbmcgYW55IGluZm9ybWF0aW9uIEB2YWx1ZXtHREJOfSBuZWVkcywgdW50aWwgeW91Ci1leGVjdXRlIGEgQHZhbHVle0dEQk59IGNvbW1hbmQgdGhhdCBtYWtlcyB5b3VyIHByb2dyYW0gcmVzdW1lOyBhdCB0aGF0IHBvaW50LAotQGNvZGV7aGFuZGxlX2V4Y2VwdGlvbn0gcmV0dXJucyBjb250cm9sIHRvIHlvdXIgb3duIGNvZGUgb24gdGhlIHRhcmdldAotbWFjaGluZS4gCi0KLUBpdGVtIGJyZWFrcG9pbnQKLUBjaW5kZXggQGNvZGV7YnJlYWtwb2ludH0gc3Vicm91dGluZSwgcmVtb3RlCi1Vc2UgdGhpcyBhdXhpbGlhcnkgc3Vicm91dGluZSB0byBtYWtlIHlvdXIgcHJvZ3JhbSBjb250YWluIGEKLWJyZWFrcG9pbnQuICBEZXBlbmRpbmcgb24gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uLCB0aGlzIG1heSBiZSB0aGUgb25seQotd2F5IGZvciBAdmFsdWV7R0RCTn0gdG8gZ2V0IGNvbnRyb2wuICBGb3IgaW5zdGFuY2UsIGlmIHlvdXIgdGFyZ2V0Ci1tYWNoaW5lIGhhcyBzb21lIHNvcnQgb2YgaW50ZXJydXB0IGJ1dHRvbiwgeW91IHdvbid0IG5lZWQgdG8gY2FsbCB0aGlzOwotcHJlc3NpbmcgdGhlIGludGVycnVwdCBidXR0b24gdHJhbnNmZXJzIGNvbnRyb2wgdG8KLUBjb2Rle2hhbmRsZV9leGNlcHRpb259LS0taW4gZWZmZWN0LCB0byBAdmFsdWV7R0RCTn0uICBPbiBzb21lIG1hY2hpbmVzLAotc2ltcGx5IHJlY2VpdmluZyBjaGFyYWN0ZXJzIG9uIHRoZSBzZXJpYWwgcG9ydCBtYXkgYWxzbyB0cmlnZ2VyIGEgdHJhcDsKLWFnYWluLCBpbiB0aGF0IHNpdHVhdGlvbiwgeW91IGRvbid0IG5lZWQgdG8gY2FsbCBAY29kZXticmVha3BvaW50fSBmcm9tCi15b3VyIG93biBwcm9ncmFtLS0tc2ltcGx5IHJ1bm5pbmcgQHNhbXB7dGFyZ2V0IHJlbW90ZX0gZnJvbSB0aGUgaG9zdAotQHZhbHVle0dEQk59IHNlc3Npb24gZ2V0cyBjb250cm9sLiAgCi0KLUNhbGwgQGNvZGV7YnJlYWtwb2ludH0gaWYgbm9uZSBvZiB0aGVzZSBpcyB0cnVlLCBvciBpZiB5b3Ugc2ltcGx5IHdhbnQKLXRvIG1ha2UgY2VydGFpbiB5b3VyIHByb2dyYW0gc3RvcHMgYXQgYSBwcmVkZXRlcm1pbmVkIHBvaW50IGZvciB0aGUKLXN0YXJ0IG9mIHlvdXIgZGVidWdnaW5nIHNlc3Npb24uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJvb3RzdHJhcHBpbmcKLUBzdWJzdWJzZWN0aW9uIFdoYXQgeW91IG11c3QgZG8gZm9yIHRoZSBzdHViCi0KLUBjaW5kZXggcmVtb3RlIHN0dWIsIHN1cHBvcnQgcm91dGluZXMKLVRoZSBkZWJ1Z2dpbmcgc3R1YnMgdGhhdCBjb21lIHdpdGggQHZhbHVle0dEQk59IGFyZSBzZXQgdXAgZm9yIGEgcGFydGljdWxhcgotY2hpcCBhcmNoaXRlY3R1cmUsIGJ1dCB0aGV5IGhhdmUgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc3Qgb2YgeW91cgotZGVidWdnaW5nIHRhcmdldCBtYWNoaW5lLgotCi1GaXJzdCBvZiBhbGwgeW91IG5lZWQgdG8gdGVsbCB0aGUgc3R1YiBob3cgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKLXNlcmlhbCBwb3J0LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGludCBnZXREZWJ1Z0NoYXIoKQotQGtpbmRleCBnZXREZWJ1Z0NoYXIKLVdyaXRlIHRoaXMgc3Vicm91dGluZSB0byByZWFkIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBzZXJpYWwgcG9ydC4KLUl0IG1heSBiZSBpZGVudGljYWwgdG8gQGNvZGV7Z2V0Y2hhcn0gZm9yIHlvdXIgdGFyZ2V0IHN5c3RlbTsgYQotZGlmZmVyZW50IG5hbWUgaXMgdXNlZCB0byBhbGxvdyB5b3UgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBpZiB5b3Ugd2lzaC4KLQotQGl0ZW0gdm9pZCBwdXREZWJ1Z0NoYXIoaW50KQotQGtpbmRleCBwdXREZWJ1Z0NoYXIKLVdyaXRlIHRoaXMgc3Vicm91dGluZSB0byB3cml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8gdGhlIHNlcmlhbCBwb3J0LgotSXQgbWF5IGJlIGlkZW50aWNhbCB0byBAY29kZXtwdXRjaGFyfSBmb3IgeW91ciB0YXJnZXQgc3lzdGVtOyBhIAotZGlmZmVyZW50IG5hbWUgaXMgdXNlZCB0byBhbGxvdyB5b3UgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBpZiB5b3Ugd2lzaC4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBjb250cm9sIEMsIGFuZCByZW1vdGUgZGVidWdnaW5nCi1AY2luZGV4IGludGVycnVwdGluZyByZW1vdGUgdGFyZ2V0cwotSWYgeW91IHdhbnQgQHZhbHVle0dEQk59IHRvIGJlIGFibGUgdG8gc3RvcCB5b3VyIHByb2dyYW0gd2hpbGUgaXQgaXMKLXJ1bm5pbmcsIHlvdSBuZWVkIHRvIHVzZSBhbiBpbnRlcnJ1cHQtZHJpdmVuIHNlcmlhbCBkcml2ZXIsIGFuZCBhcnJhbmdlCi1mb3IgaXQgdG8gc3RvcCB3aGVuIGl0IHJlY2VpdmVzIGEgQGNvZGV7XkN9IChAc2FtcHtcMDAzfSwgdGhlIGNvbnRyb2wtQwotY2hhcmFjdGVyKS4gIFRoYXQgaXMgdGhlIGNoYXJhY3RlciB3aGljaCBAdmFsdWV7R0RCTn0gdXNlcyB0byB0ZWxsIHRoZQotcmVtb3RlIHN5c3RlbSB0byBzdG9wLgotCi1HZXR0aW5nIHRoZSBkZWJ1Z2dpbmcgdGFyZ2V0IHRvIHJldHVybiB0aGUgcHJvcGVyIHN0YXR1cyB0byBAdmFsdWV7R0RCTn0KLXByb2JhYmx5IHJlcXVpcmVzIGNoYW5nZXMgdG8gdGhlIHN0YW5kYXJkIHN0dWI7IG9uZSBxdWljayBhbmQgZGlydHkgd2F5Ci1pcyB0byBqdXN0IGV4ZWN1dGUgYSBicmVha3BvaW50IGluc3RydWN0aW9uICh0aGUgYGBkaXJ0eScnIHBhcnQgaXMgdGhhdAotQHZhbHVle0dEQk59IHJlcG9ydHMgYSBAY29kZXtTSUdUUkFQfSBpbnN0ZWFkIG9mIGEgQGNvZGV7U0lHSU5UfSkuCi0KLU90aGVyIHJvdXRpbmVzIHlvdSBuZWVkIHRvIHN1cHBseSBhcmU6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gdm9pZCBleGNlcHRpb25IYW5kbGVyIChpbnQgQHZhcntleGNlcHRpb25fbnVtYmVyfSwgdm9pZCAqQHZhcntleGNlcHRpb25fYWRkcmVzc30pCi1Aa2luZGV4IGV4Y2VwdGlvbkhhbmRsZXIKLVdyaXRlIHRoaXMgZnVuY3Rpb24gdG8gaW5zdGFsbCBAdmFye2V4Y2VwdGlvbl9hZGRyZXNzfSBpbiB0aGUgZXhjZXB0aW9uCi1oYW5kbGluZyB0YWJsZXMuICBZb3UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhlIHN0dWIgZG9lcyBub3QgaGF2ZSBhbnkKLXdheSBvZiBrbm93aW5nIHdoYXQgdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZXMgb24geW91ciB0YXJnZXQgc3lzdGVtCi1hcmUgbGlrZSAoZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzb3IncyB0YWJsZSBtaWdodCBiZSBpbiBAc2N7cm9tfSwKLWNvbnRhaW5pbmcgZW50cmllcyB3aGljaCBwb2ludCB0byBhIHRhYmxlIGluIEBzY3tyYW19KS4KLUB2YXJ7ZXhjZXB0aW9uX251bWJlcn0gaXMgdGhlIGV4Y2VwdGlvbiBudW1iZXIgd2hpY2ggc2hvdWxkIGJlIGNoYW5nZWQ7Ci1pdHMgbWVhbmluZyBpcyBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IChmb3IgZXhhbXBsZSwgZGlmZmVyZW50IG51bWJlcnMKLW1pZ2h0IHJlcHJlc2VudCBkaXZpZGUgYnkgemVybywgbWlzYWxpZ25lZCBhY2Nlc3MsIGV0YykuICBXaGVuIHRoaXMKLWV4Y2VwdGlvbiBvY2N1cnMsIGNvbnRyb2wgc2hvdWxkIGJlIHRyYW5zZmVycmVkIGRpcmVjdGx5IHRvCi1AdmFye2V4Y2VwdGlvbl9hZGRyZXNzfSwgYW5kIHRoZSBwcm9jZXNzb3Igc3RhdGUgKHN0YWNrLCByZWdpc3RlcnMsCi1hbmQgc28gb24pIHNob3VsZCBiZSBqdXN0IGFzIGl0IGlzIHdoZW4gYSBwcm9jZXNzb3IgZXhjZXB0aW9uIG9jY3Vycy4gIFNvIGlmCi15b3Ugd2FudCB0byB1c2UgYSBqdW1wIGluc3RydWN0aW9uIHRvIHJlYWNoIEB2YXJ7ZXhjZXB0aW9uX2FkZHJlc3N9LCBpdAotc2hvdWxkIGJlIGEgc2ltcGxlIGp1bXAsIG5vdCBhIGp1bXAgdG8gc3Vicm91dGluZS4KLQotRm9yIHRoZSAzODYsIEB2YXJ7ZXhjZXB0aW9uX2FkZHJlc3N9IHNob3VsZCBiZSBpbnN0YWxsZWQgYXMgYW4gaW50ZXJydXB0Ci1nYXRlIHNvIHRoYXQgaW50ZXJydXB0cyBhcmUgbWFza2VkIHdoaWxlIHRoZSBoYW5kbGVyIHJ1bnMuICBUaGUgZ2F0ZQotc2hvdWxkIGJlIGF0IHByaXZpbGVnZSBsZXZlbCAwICh0aGUgbW9zdCBwcml2aWxlZ2VkIGxldmVsKS4gIFRoZQotQHNje3NwYXJjfSBhbmQgNjhrIHN0dWJzIGFyZSBhYmxlIHRvIG1hc2sgaW50ZXJydXB0cyB0aGVtc2VsdmVzIHdpdGhvdXQKLWhlbHAgZnJvbSBAY29kZXtleGNlcHRpb25IYW5kbGVyfS4KLQotQGl0ZW0gdm9pZCBmbHVzaF9pX2NhY2hlKCkKLUBraW5kZXggZmx1c2hfaV9jYWNoZQotKHNwYXJjIGFuZCBzcGFyY2xpdGUgb25seSkgV3JpdGUgdGhpcyBzdWJyb3V0aW5lIHRvIGZsdXNoIHRoZQotaW5zdHJ1Y3Rpb24gY2FjaGUsIGlmIGFueSwgb24geW91ciB0YXJnZXQgbWFjaGluZS4gIElmIHRoZXJlIGlzIG5vCi1pbnN0cnVjdGlvbiBjYWNoZSwgdGhpcyBzdWJyb3V0aW5lIG1heSBiZSBhIG5vLW9wLgotCi1PbiB0YXJnZXQgbWFjaGluZXMgdGhhdCBoYXZlIGluc3RydWN0aW9uIGNhY2hlcywgQHZhbHVle0dEQk59IHJlcXVpcmVzIHRoaXMKLWZ1bmN0aW9uIHRvIG1ha2UgY2VydGFpbiB0aGF0IHRoZSBzdGF0ZSBvZiB5b3VyIHByb2dyYW0gaXMgc3RhYmxlLgotQGVuZCB0YWJsZQotCi1Abm9pbmRlbnQKLVlvdSBtdXN0IGFsc28gbWFrZSBzdXJlIHRoaXMgbGlicmFyeSByb3V0aW5lIGlzIGF2YWlsYWJsZToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSB2b2lkICptZW1zZXQodm9pZCAqLCBpbnQsIGludCkKLUBraW5kZXggbWVtc2V0Ci1UaGlzIGlzIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9uIEBjb2Rle21lbXNldH0gdGhhdCBzZXRzIGFuIGFyZWEgb2YKLW1lbW9yeSB0byBhIGtub3duIHZhbHVlLiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSBmcmVlIHZlcnNpb25zIG9mCi1AY29kZXtsaWJjLmF9LCBAY29kZXttZW1zZXR9IGNhbiBiZSBmb3VuZCB0aGVyZTsgb3RoZXJ3aXNlLCB5b3UgbXVzdAotZWl0aGVyIG9idGFpbiBpdCBmcm9tIHlvdXIgaGFyZHdhcmUgbWFudWZhY3R1cmVyLCBvciB3cml0ZSB5b3VyIG93bi4KLUBlbmQgdGFibGUKLQotSWYgeW91IGRvIG5vdCB1c2UgdGhlIEdOVSBDIGNvbXBpbGVyLCB5b3UgbWF5IG5lZWQgb3RoZXIgc3RhbmRhcmQKLWxpYnJhcnkgc3Vicm91dGluZXMgYXMgd2VsbDsgdGhpcyB2YXJpZXMgZnJvbSBvbmUgc3R1YiB0byBhbm90aGVyLAotYnV0IGluIGdlbmVyYWwgdGhlIHN0dWJzIGFyZSBsaWtlbHkgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uIGxpYnJhcnkKLXN1YnJvdXRpbmVzIHdoaWNoIEBjb2Rle2djY30gZ2VuZXJhdGVzIGFzIGlubGluZSBjb2RlLgotCi0KLUBub2RlIERlYnVnIFNlc3Npb24KLUBzdWJzdWJzZWN0aW9uIFB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyCi0KLUBjaW5kZXggcmVtb3RlIHNlcmlhbCBkZWJ1Z2dpbmcgc3VtbWFyeQotSW4gc3VtbWFyeSwgd2hlbiB5b3VyIHByb2dyYW0gaXMgcmVhZHkgdG8gZGVidWcsIHlvdSBtdXN0IGZvbGxvdyB0aGVzZQotc3RlcHMuCi0KLUBlbnVtZXJhdGUKLUBpdGVtCi1NYWtlIHN1cmUgeW91IGhhdmUgdGhlIHN1cHBvcnRpbmcgbG93LWxldmVsIHJvdXRpbmVzCi0oQHB4cmVme0Jvb3RzdHJhcHBpbmcsLFdoYXQgeW91IG11c3QgZG8gZm9yIHRoZSBzdHVifSk6Ci1AZGlzcGxheQotQGNvZGV7Z2V0RGVidWdDaGFyfSwgQGNvZGV7cHV0RGVidWdDaGFyfSwKLUBjb2Rle2ZsdXNoX2lfY2FjaGV9LCBAY29kZXttZW1zZXR9LCBAY29kZXtleGNlcHRpb25IYW5kbGVyfS4KLUBlbmQgZGlzcGxheQotCi1AaXRlbQotSW5zZXJ0IHRoZXNlIGxpbmVzIG5lYXIgdGhlIHRvcCBvZiB5b3VyIHByb2dyYW06Ci0KLUBleGFtcGxlCi1zZXRfZGVidWdfdHJhcHMoKTsKLWJyZWFrcG9pbnQoKTsKLUBlbmQgZXhhbXBsZQotCi1AaXRlbQotRm9yIHRoZSA2ODB4MCBzdHViIG9ubHksIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSB2YXJpYWJsZSBjYWxsZWQKLUBjb2Rle2V4Y2VwdGlvbkhvb2t9LiAgTm9ybWFsbHkgeW91IGp1c3QgdXNlOgotCi1AZXhhbXBsZQotdm9pZCAoKmV4Y2VwdGlvbkhvb2spKCkgPSAwOwotQGVuZCBleGFtcGxlCi0KLWJ1dCBpZiBiZWZvcmUgY2FsbGluZyBAY29kZXtzZXRfZGVidWdfdHJhcHN9LCB5b3Ugc2V0IGl0IHRvIHBvaW50IHRvIGEKLWZ1bmN0aW9uIGluIHlvdXIgcHJvZ3JhbSwgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbgotQGNvZGV7QHZhbHVle0dEQk59fSBjb250aW51ZXMgYWZ0ZXIgc3RvcHBpbmcgb24gYSB0cmFwIChmb3IgZXhhbXBsZSwgYnVzCi1lcnJvcikuICBUaGUgZnVuY3Rpb24gaW5kaWNhdGVkIGJ5IEBjb2Rle2V4Y2VwdGlvbkhvb2t9IGlzIGNhbGxlZCB3aXRoCi1vbmUgcGFyYW1ldGVyOiBhbiBAY29kZXtpbnR9IHdoaWNoIGlzIHRoZSBleGNlcHRpb24gbnVtYmVyLgotCi1AaXRlbQotQ29tcGlsZSBhbmQgbGluayB0b2dldGhlcjogeW91ciBwcm9ncmFtLCB0aGUgQHZhbHVle0dEQk59IGRlYnVnZ2luZyBzdHViIGZvcgoteW91ciB0YXJnZXQgYXJjaGl0ZWN0dXJlLCBhbmQgdGhlIHN1cHBvcnRpbmcgc3Vicm91dGluZXMuCi0KLUBpdGVtCi1NYWtlIHN1cmUgeW91IGhhdmUgYSBzZXJpYWwgY29ubmVjdGlvbiBiZXR3ZWVuIHlvdXIgdGFyZ2V0IG1hY2hpbmUgYW5kCi10aGUgQHZhbHVle0dEQk59IGhvc3QsIGFuZCBpZGVudGlmeSB0aGUgc2VyaWFsIHBvcnQgb24gdGhlIGhvc3QuCi0KLUBpdGVtCi1AYyBUaGUgInJlbW90ZSIgdGFyZ2V0IG5vdyBwcm92aWRlcyBhIGBsb2FkJyBjb21tYW5kLCBzbyB3ZSBzaG91bGQKLUBjIGRvY3VtZW50IHRoYXQuICBGSVhNRS4KLURvd25sb2FkIHlvdXIgcHJvZ3JhbSB0byB5b3VyIHRhcmdldCBtYWNoaW5lIChvciBnZXQgaXQgdGhlcmUgYnkKLXdoYXRldmVyIG1lYW5zIHRoZSBtYW51ZmFjdHVyZXIgcHJvdmlkZXMpLCBhbmQgc3RhcnQgaXQuCi0KLUBpdGVtCi1UbyBzdGFydCByZW1vdGUgZGVidWdnaW5nLCBydW4gQHZhbHVle0dEQk59IG9uIHRoZSBob3N0IG1hY2hpbmUsIGFuZCBzcGVjaWZ5Ci1hcyBhbiBleGVjdXRhYmxlIGZpbGUgdGhlIHByb2dyYW0gdGhhdCBpcyBydW5uaW5nIGluIHRoZSByZW1vdGUgbWFjaGluZS4KLVRoaXMgdGVsbHMgQHZhbHVle0dEQk59IGhvdyB0byBmaW5kIHlvdXIgcHJvZ3JhbSdzIHN5bWJvbHMgYW5kIHRoZSBjb250ZW50cwotb2YgaXRzIHB1cmUgdGV4dC4KLQotQGNpbmRleCBzZXJpYWwgbGluZSwgQGNvZGV7dGFyZ2V0IHJlbW90ZX0KLVRoZW4gZXN0YWJsaXNoIGNvbW11bmljYXRpb24gdXNpbmcgdGhlIEBjb2Rle3RhcmdldCByZW1vdGV9IGNvbW1hbmQuCi1JdHMgYXJndW1lbnQgc3BlY2lmaWVzIGhvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB0YXJnZXQKLW1hY2hpbmUtLS1laXRoZXIgdmlhIGEgZGV2aWNlbmFtZSBhdHRhY2hlZCB0byBhIGRpcmVjdCBzZXJpYWwgbGluZSwgb3IgYQotVENQIHBvcnQgKHVzdWFsbHkgdG8gYSB0ZXJtaW5hbCBzZXJ2ZXIgd2hpY2ggaW4gdHVybiBoYXMgYSBzZXJpYWwgbGluZQotdG8gdGhlIHRhcmdldCkuICBGb3IgZXhhbXBsZSwgdG8gdXNlIGEgc2VyaWFsIGxpbmUgY29ubmVjdGVkIHRvIHRoZQotZGV2aWNlIG5hbWVkIEBmaWxley9kZXYvdHR5Yn06Ci0KLUBleGFtcGxlCi10YXJnZXQgcmVtb3RlIC9kZXYvdHR5YgotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggVENQIHBvcnQsIEBjb2Rle3RhcmdldCByZW1vdGV9Ci1UbyB1c2UgYSBUQ1AgY29ubmVjdGlvbiwgdXNlIGFuIGFyZ3VtZW50IG9mIHRoZSBmb3JtCi1AY29kZXtAdmFye2hvc3R9OnBvcnR9LiAgRm9yIGV4YW1wbGUsIHRvIGNvbm5lY3QgdG8gcG9ydCAyODI4IG9uIGEKLXRlcm1pbmFsIHNlcnZlciBuYW1lZCBAY29kZXttYW55ZmFybXN9OgotCi1AZXhhbXBsZQotdGFyZ2V0IHJlbW90ZSBtYW55ZmFybXM6MjgyOAotQGVuZCBleGFtcGxlCi1AZW5kIGVudW1lcmF0ZQotCi1Ob3cgeW91IGNhbiB1c2UgYWxsIHRoZSB1c3VhbCBjb21tYW5kcyB0byBleGFtaW5lIGFuZCBjaGFuZ2UgZGF0YSBhbmQgdG8KLXN0ZXAgYW5kIGNvbnRpbnVlIHRoZSByZW1vdGUgcHJvZ3JhbS4KLQotVG8gcmVzdW1lIHRoZSByZW1vdGUgcHJvZ3JhbSBhbmQgc3RvcCBkZWJ1Z2dpbmcgaXQsIHVzZSB0aGUgQGNvZGV7ZGV0YWNofQotY29tbWFuZC4KLQotQGNpbmRleCBpbnRlcnJ1cHRpbmcgcmVtb3RlIHByb2dyYW1zCi1AY2luZGV4IHJlbW90ZSBwcm9ncmFtcywgaW50ZXJydXB0aW5nCi1XaGVuZXZlciBAdmFsdWV7R0RCTn0gaXMgd2FpdGluZyBmb3IgdGhlIHJlbW90ZSBwcm9ncmFtLCBpZiB5b3UgdHlwZSB0aGUKLWludGVycnVwdCBjaGFyYWN0ZXIgKG9mdGVuIEBrZXl7Qy1DfSksIEB2YWx1ZXtHREJOfSBhdHRlbXB0cyB0byBzdG9wIHRoZQotcHJvZ3JhbS4gIFRoaXMgbWF5IG9yIG1heSBub3Qgc3VjY2VlZCwgZGVwZW5kaW5nIGluIHBhcnQgb24gdGhlIGhhcmR3YXJlCi1hbmQgdGhlIHNlcmlhbCBkcml2ZXJzIHRoZSByZW1vdGUgc3lzdGVtIHVzZXMuICBJZiB5b3UgdHlwZSB0aGUKLWludGVycnVwdCBjaGFyYWN0ZXIgb25jZSBhZ2FpbiwgQHZhbHVle0dEQk59IGRpc3BsYXlzIHRoaXMgcHJvbXB0OgotCi1AZXhhbXBsZQotSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHByb2dyYW0uCi1HaXZlIHVwIChhbmQgc3RvcCBkZWJ1Z2dpbmcgaXQpPyAgKHkgb3IgbikKLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgdHlwZSBAa2Jke3l9LCBAdmFsdWV7R0RCTn0gYWJhbmRvbnMgdGhlIHJlbW90ZSBkZWJ1Z2dpbmcgc2Vzc2lvbi4KLShJZiB5b3UgZGVjaWRlIHlvdSB3YW50IHRvIHRyeSBhZ2FpbiBsYXRlciwgeW91IGNhbiB1c2UgQHNhbXB7dGFyZ2V0Ci1yZW1vdGV9IGFnYWluIHRvIGNvbm5lY3Qgb25jZSBtb3JlLikgIElmIHlvdSB0eXBlIEBrYmR7bn0sIEB2YWx1ZXtHREJOfQotZ29lcyBiYWNrIHRvIHdhaXRpbmcuCi0KLUBub2RlIFByb3RvY29sCi1Ac3Vic3Vic2VjdGlvbiBDb21tdW5pY2F0aW9uIHByb3RvY29sCi0KLUBjaW5kZXggZGVidWdnaW5nIHN0dWIsIGV4YW1wbGUKLUBjaW5kZXggcmVtb3RlIHN0dWIsIGV4YW1wbGUKLUBjaW5kZXggc3R1YiBleGFtcGxlLCByZW1vdGUgZGVidWdnaW5nCi1UaGUgc3R1YiBmaWxlcyBwcm92aWRlZCB3aXRoIEB2YWx1ZXtHREJOfSBpbXBsZW1lbnQgdGhlIHRhcmdldCBzaWRlIG9mIHRoZQotY29tbXVuaWNhdGlvbiBwcm90b2NvbCwgYW5kIHRoZSBAdmFsdWV7R0RCTn0gc2lkZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUKLUB2YWx1ZXtHREJOfSBzb3VyY2UgZmlsZSBAZmlsZXtyZW1vdGUuY30uICBOb3JtYWxseSwgeW91IGNhbiBzaW1wbHkgYWxsb3cKLXRoZXNlIHN1YnJvdXRpbmVzIHRvIGNvbW11bmljYXRlLCBhbmQgaWdub3JlIHRoZSBkZXRhaWxzLiAgKElmIHlvdSdyZQotaW1wbGVtZW50aW5nIHlvdXIgb3duIHN0dWIgZmlsZSwgeW91IGNhbiBzdGlsbCBpZ25vcmUgdGhlIGRldGFpbHM6IHN0YXJ0Ci13aXRoIG9uZSBvZiB0aGUgZXhpc3Rpbmcgc3R1YiBmaWxlcy4gIEBmaWxle3NwYXJjLXN0dWIuY30gaXMgdGhlIGJlc3QKLW9yZ2FuaXplZCwgYW5kIHRoZXJlZm9yZSB0aGUgZWFzaWVzdCB0byByZWFkLikKLQotSG93ZXZlciwgdGhlcmUgbWF5IGJlIG9jY2FzaW9ucyB3aGVuIHlvdSBuZWVkIHRvIGtub3cgc29tZXRoaW5nIGFib3V0Ci10aGUgcHJvdG9jb2wtLS1mb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VyaWFsIHBvcnQgdG8geW91cgotdGFyZ2V0IG1hY2hpbmUsIHlvdSBtaWdodCB3YW50IHlvdXIgcHJvZ3JhbSB0byBkbyBzb21ldGhpbmcgc3BlY2lhbCBpZgotaXQgcmVjb2duaXplcyBhIHBhY2tldCBtZWFudCBmb3IgQHZhbHVle0dEQk59LgotCi1JbiB0aGUgZXhhbXBsZXMgYmVsb3csIEBzYW1wezwtfSBhbmQgQHNhbXB7LT59IGFyZSB1c2VkIHRvIGluZGljYXRlCi10cmFuc21pdHRlZCBhbmQgcmVjZWl2ZWQgZGF0YSByZXNwZWN0ZnVsbHkuCi0KLUBjaW5kZXggcHJvdG9jb2wsIEB2YWx1ZXtHREJOfSByZW1vdGUgc2VyaWFsCi1AY2luZGV4IHNlcmlhbCBwcm90b2NvbCwgQHZhbHVle0dEQk59IHJlbW90ZQotQGNpbmRleCByZW1vdGUgc2VyaWFsIHByb3RvY29sCi1BbGwgQHZhbHVle0dEQk59IGNvbW1hbmRzIGFuZCByZXNwb25zZXMgKG90aGVyIHRoYW4gYWNrbm93bGVkZ21lbnRzKQotYXJlIHNlbnQgYXMgYSBAdmFye3BhY2tldH0uICBBIEB2YXJ7cGFja2V0fSBpcyBpbnRyb2R1Y2VkIHdpdGggdGhlCi1jaGFyYWN0ZXIgQHNhbXB7JH0sIHRoaXMgaXMgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgdHdvLWRpZ2l0Ci1AdmFye3NlcXVlbmNlLWlkfSBhbmQgdGhlIGNoYXJhY3RlciBAc2FtcHs6fSwgdGhlIGFjdHVhbAotQHZhcntwYWNrZXQtZGF0YX0sIGFuZCB0aGUgdGVybWluYXRpbmcgY2hhcmFjdGVyIEBzYW1weyN9IGZvbGxvd2VkIGJ5IGEKLXR3by1kaWdpdCBAdmFye2NoZWNrc3VtfToKLQotQGV4YW1wbGUKLUBjb2RleyR9QHZhcntwYWNrZXQtZGF0YX1AY29kZXsjfUB2YXJ7Y2hlY2tzdW19Ci1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotb3IsIHdpdGggdGhlIG9wdGlvbmFsIEB2YXJ7c2VxdWVuY2UtaWR9OgotQGV4YW1wbGUKLUBjb2RleyR9QHZhcntzZXF1ZW5jZS1pZH1AY29kZXs6fUB2YXJ7cGFja2V0LWRhdGF9QGNvZGV7I31AdmFye2NoZWNrc3VtfQotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggY2hlY2tzdW0sIGZvciBAdmFsdWV7R0RCTn0gcmVtb3RlCi1Abm9pbmRlbnQKLVRoZSB0d28tZGlnaXQgQHZhcntjaGVja3N1bX0gaXMgY29tcHV0ZWQgYXMgdGhlIG1vZHVsbyAyNTYgc3VtIG9mIGFsbAotY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSBsZWFkaW5nIEBzYW1weyR9IGFuZCB0aGUgdHJhaWxpbmcgQHNhbXB7I30gKHRoYXQKLWNvbnNpc3Rpbmcgb2YgYm90aCB0aGUgb3B0aW9uYWwgQHZhcntzZXF1ZW5jZS1pZH1AY29kZXs6fSBhbmQgdGhlIGFjdHVhbAotQHZhcntwYWNrZXQtZGF0YX0pLgotCi1AY2luZGV4IHNlcXVlbmNlLWlkLCBmb3IgQHZhbHVle0dEQk59IHJlbW90ZQotQG5vaW5kZW50Ci1UaGUgdHdvLWRpZ2l0IEB2YXJ7c2VxdWVuY2UtaWR9LCB3aGVuIHByZXNlbnQsIGlzIHJldHVybmVkIHdpdGggdGhlCi1hY2tub3dsZWRnbWVudC4gIEJleW9uZCB0aGF0IGl0cyBtZWFuaW5nIGlzIHBvb3JseSBkZWZpbmVkLgotQHZhbHVle0dEQk59IGlzIG5vdCBrbm93biB0byBvdXRwdXQgQHZhcntzZXF1ZW5jZS1pZH1zLgotCi1XaGVuIGVpdGhlciB0aGUgaG9zdCBvciB0aGUgdGFyZ2V0IG1hY2hpbmUgcmVjZWl2ZXMgYSBwYWNrZXQsIHRoZSBmaXJzdAotcmVzcG9uc2UgZXhwZWN0ZWQgaXMgYW4gYWNrbm93bGVkZ21lbnQ6IGVpdGhlciBAc2FtcHsrfSAodG8gaW5kaWNhdGUKLXRoZSBwYWNrYWdlIHdhcyByZWNlaXZlZCBjb3JyZWN0bHkpIG9yIEBzYW1wey19ICh0byByZXF1ZXN0Ci1yZXRyYW5zbWlzc2lvbik6Ci0KLUBleGFtcGxlCi08LSBAY29kZXskfUB2YXJ7cGFja2V0LWRhdGF9QGNvZGV7I31AdmFye2NoZWNrc3VtfQotLT4gQGNvZGV7K30KLUBlbmQgZXhhbXBsZQotQG5vaW5kZW50Ci1JZiB0aGUgcmVjZWl2ZWQgcGFja2V0IGluY2x1ZGVkIGEgQHZhcntzZXF1ZW5jZS1pZH0gdGhhbiB0aGF0IGlzCi1hcHBlbmRlZCB0byBhIHBvc2l0aXZlIGFja25vd2xlZGdtZW50OgotCi1AZXhhbXBsZQotPC0gQGNvZGV7JH1AdmFye3NlcXVlbmNlLWlkfUBjb2Rlezp9QHZhcntwYWNrZXQtZGF0YX1AY29kZXsjfUB2YXJ7Y2hlY2tzdW19Ci0tPiBAY29kZXsrfUB2YXJ7c2VxdWVuY2UtaWR9Ci1AZW5kIGV4YW1wbGUKLQotVGhlIGhvc3QgKEB2YWx1ZXtHREJOfSkgc2VuZHMgQHZhcntjb21tYW5kfXMsIGFuZCB0aGUgdGFyZ2V0ICh0aGUKLWRlYnVnZ2luZyBzdHViIGluY29ycG9yYXRlZCBpbiB5b3VyIHByb2dyYW0pIHNlbmRzIGEgQHZhcntyZXNwb25zZX0uICBJbgotdGhlIGNhc2Ugb2Ygc3RlcCBhbmQgY29udGludWUgQHZhcntjb21tYW5kfXMsIHRoZSByZXNwb25zZSBpcyBvbmx5IHNlbnQKLXdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkICh0aGUgdGFyZ2V0IGhhcyBhZ2FpbiBzdG9wcGVkKS4KLQotQHZhcntwYWNrZXQtZGF0YX0gY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHdpdGggdGhlCi1leGNlcHRpb24gb2YgQHNhbXB7I30gYW5kIEBzYW1weyR9IChzZWUgQHNhbXB7WH0gcGFja2V0IGZvciBhbgotZXhjZXB0aW9uKS4gQHNhbXB7On0gY2FuIG5vdCBhcHBlYXIgYXMgdGhlIHRoaXJkIGNoYXJhY3RlciBpbiBhIHBhY2tldC4KLUZpZWxkcyB3aXRoaW4gdGhlIHBhY2tldCBzaG91bGQgYmUgc2VwYXJhdGVkIHVzaW5nIEBzYW1weyx9IGFuZCBAc2FtcHs7fQotKHVuZm9ydHVuYXRlbHkgc29tZSBwYWNrZXRzIGNob3NlIHRvIHVzZSBAc2FtcHs6fSkuICBFeGNlcHQgd2hlcmUKLW90aGVyd2lzZSBub3RlZCBhbGwgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgaW4gSEVYIHdpdGggbGVhZGluZyB6ZXJvcwotc3VwcHJlc3NlZC4KLQotUmVzcG9uc2UgQHZhcntkYXRhfSBjYW4gYmUgcnVuLWxlbmd0aCBlbmNvZGVkIHRvIHNhdmUgc3BhY2UuICBBIEBzYW1weyp9Ci1tZWFucyB0aGF0IHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhbiBBU0NJSSBlbmNvZGluZyBnaXZpbmcgYSByZXBlYXQgY291bnQKLXdoaWNoIHN0YW5kcyBmb3IgdGhhdCBtYW55IHJlcGV0aXRpb25zIG9mIHRoZSBjaGFyYWN0ZXIgcHJlY2VkaW5nIHRoZQotQHNhbXB7Kn0uICBUaGUgZW5jb2RpbmcgaXMgQGNvZGV7bisyOX0sIHlpZWxkaW5nIGEgcHJpbnRhYmxlIGNoYXJhY3Rlcgotd2hlcmUgQGNvZGV7biA+PTN9ICh3aGljaCBpcyB3aGVyZSBybGUgc3RhcnRzIHRvIHdpbikuICBEb24ndCB1c2UgYW4KLUBjb2Rle24gPiAxMjZ9LgotCi1TbzoKLUBleGFtcGxlCi0iQGNvZGV7MCogfSIKLUBlbmQgZXhhbXBsZQotQG5vaW5kZW50Ci1tZWFucyB0aGUgc2FtZSBhcyAiMDAwMCIuCi0KLVRoZSBlcnJvciByZXNwb25zZSwgcmV0dXJuZWQgZm9yIHNvbWUgcGFja2V0cyBpbmNsdWRlcyBhIHR3byBjaGFyYWN0ZXIKLWVycm9yIG51bWJlci4gIFRoYXQgbnVtYmVyIGlzIG5vdCB3ZWxsIGRlZmluZWQuCi0KLUZvciBhbnkgQHZhcntjb21tYW5kfSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzdHViLCBhbiBlbXB0eSByZXNwb25zZQotKEBzYW1weyQjMDB9KSBzaG91bGQgYmUgcmV0dXJuZWQuICBUaGF0IHdheSBpdCBpcyBwb3NzaWJsZSB0byBleHRlbmQgdGhlCi1wcm90b2NvbC4gIEEgbmV3ZXIgQHZhbHVle0dEQk59IGNhbiB0ZWxsIGlmIGEgcGFja2V0IGlzIHN1cHBvcnRlZCBiYXNlZAotb24gdGhlIHJlc3BvbnNlLgotCi1CZWxvdyBpcyBhIGNvbXBsZXRlIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBkZWZpbmVkIEB2YXJ7Y29tbWFuZH1zIGFuZAotdGhlaXIgY29ycmVzcG9uZGluZyByZXNwb25zZSBAdmFye2RhdGF9OgotCi1AbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC4zMCAuMzAgLjQwCi1AaXRlbSBQYWNrZXQKLUB0YWIgUmVxdWVzdAotQHRhYiBEZXNjcmlwdGlvbgotCi1AaXRlbSBleHRlbmRlZCBvcHMgQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7IX0KLUB0YWIKLVVzZSB0aGUgZXh0ZW5kZWQgcmVtb3RlIHByb3RvY29sLiBTdGlja3kgLS0gb25seSBuZWVkcyB0byBiZSBzZXQgb25jZS4KLVRoZSBleHRlbmRlZCByZW1vdGUgcHJvdG9jb2wgc3VwcG9ydCB0aGUgQHNhbXB7Un0gcGFja2V0LgotQGl0ZW0KLUB0YWIgcmVwbHkgQHNhbXB7fQotQHRhYgotU3R1YnMgdGhhdCBzdXBwb3J0IHRoZSBleHRlbmRlZCByZW1vdGUgcHJvdG9jb2wgcmV0dXJuIEBzYW1we30gd2hpY2gsCi11bmZvcnR1bmF0ZWx5LCBpcyBpZGVudGljYWwgdG8gdGhlIHJlc3BvbnNlIHJldHVybmVkIGJ5IHN0dWJzIHRoYXQgZG8gbm90Ci1zdXBwb3J0IHByb3RvY29sIGV4dGVuc2lvbnMuCi0KLUBpdGVtIGxhc3Qgc2lnbmFsCi1AdGFiIEBjb2Rlez99Ci1AdGFiCi1SZXBseSB0aGUgY3VycmVudCByZWFzb24gZm9yIHN0b3BwaW5nLiAgVGhpcyBpcyB0aGUgc2FtZSByZXBseSBhcyBpcwotZ2VuZXJhdGVkIGZvciBzdGVwIG9yIGNvbnQgOiBAY29kZXtTfUB2YXJ7QUF9IHdoZXJlIEB2YXJ7QUF9IGlzIHRoZQotc2lnbmFsIG51bWJlci4KLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7YX0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHNldCBwcm9ncmFtIGFyZ3VtZW50cyBAc3Ryb25neyhyZXNlcnZlZCl9IEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle0F9QHZhcnthcmdsZW59QGNvZGV7LH1AdmFye2FyZ251bX1AY29kZXssfUB2YXJ7YXJnfUBjb2RleywuLi59Ci1AdGFiCi1Jbml0aWFsaXplZCBAc2FtcHthcmd2W119IGFycmF5IHBhc3NlZCBpbnRvIHByb2dyYW0uIEB2YXJ7YXJnbGVufQotc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGhleCBlbmNvZGVkIGJ5dGUgc3RyZWFtIEB2YXJ7YXJnfS4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle09LfQotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7RX1AdmFye05OfQotCi1AaXRlbSBzZXQgYmF1ZCBAc3Ryb25neyhkZXByZWNhdGVkKX0KLUB0YWIgQGNvZGV7Yn1AdmFye2JhdWR9Ci1AdGFiCi1DaGFuZ2UgdGhlIHNlcmlhbCBsaW5lIHNwZWVkIHRvIEB2YXJ7YmF1ZH0uICBKVEM6IEBlbXBoe1doZW4gZG9lcyB0aGUKLXRyYW5zcG9ydCBsYXllciBzdGF0ZSBjaGFuZ2U/ICBXaGVuIGl0J3MgcmVjZWl2ZWQsIG9yIGFmdGVyIHRoZSBBQ0sgaXMKLXRyYW5zbWl0dGVkLiAgSW4gZWl0aGVyIGNhc2UsIHRoZXJlIGFyZSBwcm9ibGVtcyBpZiB0aGUgY29tbWFuZCBvciB0aGUKLWFja25vd2xlZGdtZW50IHBhY2tldCBpcyBkcm9wcGVkLn0gU3RhbjogQGVtcGh7SWYgcGVvcGxlIHJlYWxseSB3YW50ZWQKLXRvIGFkZCBzb21ldGhpbmcgbGlrZSB0aGlzLCBhbmQgZ2V0IGl0IHdvcmtpbmcgZm9yIHRoZSBmaXJzdCB0aW1lLCB0aGV5Ci1vdWdodCB0byBtb2RpZnkgc2VyLXVuaXguYyB0byBzZW5kIHNvbWUga2luZCBvZiBvdXQtb2YtYmFuZCBtZXNzYWdlIHRvIGEKLXNwZWNpYWxseS1zZXR1cCBzdHViIGFuZCBoYXZlIHRoZSBzd2l0Y2ggaGFwcGVuICJpbiBiZXR3ZWVuIiBwYWNrZXRzLCBzbwotdGhhdCBmcm9tIHJlbW90ZSBwcm90b2NvbCdzIHBvaW50IG9mIHZpZXcsIG5vdGhpbmcgYWN0dWFsbHkKLWhhcHBlbmVkLn0KLQotQGl0ZW0gc2V0IGJyZWFrcG9pbnQgQHN0cm9uZ3soZGVwcmVjYXRlZCl9Ci1AdGFiIEBjb2Rle0J9QHZhcnthZGRyfSxAdmFye21vZGV9Ci1AdGFiCi1TZXQgKEB2YXJ7bW9kZX0gaXMgQHNhbXB7U30pIG9yIGNsZWFyIChAdmFye21vZGV9IGlzIEBzYW1we0N9KSBhCi1icmVha3BvaW50IGF0IEB2YXJ7YWRkcn0uICBAZW1waHtUaGlzIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBAc2FtcHtafSBhbmQKLUBzYW1we3p9IHBhY2tldHMufQotCi1AaXRlbSBjb250aW51ZQotQHRhYiBAY29kZXtjfUB2YXJ7YWRkcn0KLUB0YWIKLUB2YXJ7YWRkcn0gaXMgYWRkcmVzcyB0byByZXN1bWUuIElmIEB2YXJ7YWRkcn0gaXMgb21pdHRlZCwgcmVzdW1lIGF0Ci1jdXJyZW50IGFkZHJlc3MuCi1AaXRlbQotQHRhYiByZXBseQotQHRhYiBzZWUgYmVsb3cKLQotQGl0ZW0gY29udGludWUgd2l0aCBzaWduYWwgQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7Q31AdmFye3NpZ31AY29kZXs7fUB2YXJ7YWRkcn0KLUB0YWIKLUNvbnRpbnVlIHdpdGggc2lnbmFsIEB2YXJ7c2lnfSAoaGV4IHNpZ25hbCBudW1iZXIpLiAgSWYKLUBjb2Rlezt9QHZhcnthZGRyfSBpcyBvbWl0dGVkLCByZXN1bWUgYXQgc2FtZSBhZGRyZXNzLgotQGl0ZW0KLUB0YWIgcmVwbHkKLUB0YWIgc2VlIGJlbG93Ci0KLUBpdGVtIHRvZ2dsZSBkZWJ1ZyBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtkfQotQHRhYgotdG9nZ2xlIGRlYnVnIGZsYWcgKHNlZSAzODYgJiA2OGsgc3R1YnMpCi0KLUBpdGVtIGRldGFjaCBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtEfQotQHRhYiBSZXBseSBPSy4KLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7ZX0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle0V9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtmfQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7Rn0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlYWQgcmVnaXN0ZXJzCi1AdGFiIEBjb2Rle2d9Ci1AdGFiIFJlYWQgZ2VuZXJhbCByZWdpc3RlcnMuCi1AaXRlbQotQHRhYiByZXBseSBAdmFye1hYLi4ufQotQHRhYgotRWFjaCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEgaXMgZGVzY3JpYmVkIGJ5IHR3byBoZXggZGlnaXRzLiAgVGhlIGJ5dGVzCi13aXRoIHRoZSByZWdpc3RlciBhcmUgdHJhbnNtaXR0ZWQgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICBUaGUgc2l6ZSBvZgotZWFjaCByZWdpc3RlciBhbmQgdGhlaXIgcG9zaXRpb24gd2l0aGluIHRoZSBAc2FtcHtnfSBAdmFye3BhY2tldH0gaXMKLWRldGVybWluZWQgYnkgdGhlIEB2YXJ7UkVHSVNURVJfUkFXX1NJWkV9IGFuZCBAdmFye1JFR0lTVEVSX05BTUV9Ci1tYWNyb3MuCi1AaXRlbQotQHRhYiBAY29kZXtFfUB2YXJ7Tk59Ci1AdGFiIGZvciBhbiBlcnJvci4KLQotQGl0ZW0gd3JpdGUgcmVncwotQHRhYiBAY29kZXtHfUB2YXJ7WFguLi59Ci1AdGFiCi1TZWUgQHNhbXB7Z30gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIEB2YXJ7WFguLi59IGRhdGEuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtPS30KLUB0YWIgZm9yIHN1Y2Nlc3MKLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIgZm9yIGFuIGVycm9yCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle2h9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSBzZXQgdGhyZWFkIEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle0h9QHZhcntjfUB2YXJ7dC4uLn0KLUB0YWIKLVNldCB0aHJlYWQgZm9yIHN1YnNlcXVlbnQgb3BlcmF0aW9ucy4gIEB2YXJ7Y30gPSBAc2FtcHtjfSBmb3IgdGhyZWFkCi11c2VkIGluIHN0ZXAgYW5kIGNvbnRpbnVlOyBAdmFye3QuLi59IGNhbiBiZSAtMSBmb3IgYWxsIHRocmVhZHMuCi1AdmFye2N9ID0gQHNhbXB7Z30gZm9yIHRocmVhZCB1c2VkIGluIG90aGVyIG9wZXJhdGlvbnMuICBJZiB6ZXJvLCBwaWNrIGEKLXRocmVhZCwgYW55IHRocmVhZC4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle09LfQotQHRhYiBmb3Igc3VjY2VzcwotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7RX1AdmFye05OfQotQHRhYiBmb3IgYW4gZXJyb3IKLQotQGl0ZW0gY3ljbGUgc3RlcCBAc3Ryb25neyhkcmFmdCl9IEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle2l9QHZhcnthZGRyfUBjb2Rleyx9QHZhcntubm59Ci1AdGFiCi1TdGVwIHRoZSByZW1vdGUgdGFyZ2V0IGJ5IGEgc2luZ2xlIGNsb2NrIGN5Y2xlLiAgSWYgQGNvZGV7LH1AdmFye25ubn0gaXMKLXByZXNlbnQsIGN5Y2xlIHN0ZXAgQHZhcntubm59IGN5Y2xlcy4gIElmIEB2YXJ7YWRkcn0gaXMgcHJlc2VudCwgY3ljbGUKLXN0ZXAgc3RhcnRpbmcgYXQgdGhhdCBhZGRyZXNzLgotCi1AaXRlbSBzaWduYWwgdGhlbiBjeWNsZSBzdGVwIEBzdHJvbmd7KHJlc2VydmVkKX0gQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7SX0KLUB0YWIKLVNlZSBAc2FtcHtpfSBhbmQgQHNhbXB7U30gZm9yIGxpa2VseSBzeW50YXggYW5kIHNlbWFudGljcy4KLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7an0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7Sn0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIGtpbGwgcmVxdWVzdCBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtrfQotQHRhYgotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtsfQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7TH0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlYWQgbWVtb3J5Ci1AdGFiIEBjb2Rle219QHZhcnthZGRyfUBjb2Rleyx9QHZhcntsZW5ndGh9Ci1AdGFiCi1SZWFkIEB2YXJ7bGVuZ3RofSBieXRlcyBvZiBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyBAdmFye2FkZHJ9LgotQGl0ZW0KLUB0YWIgcmVwbHkgQHZhcntYWC4uLn0KLUB0YWIKLUB2YXJ7WFguLi59IGlzIG1lbSBjb250ZW50cy4gQ2FuIGJlIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkIGlmIGFibGUgdG8KLXJlYWQgb25seSBwYXJ0IG9mIHRoZSBkYXRhLgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7RX1AdmFye05OfQotQHRhYiBAdmFye05OfSBpcyBlcnJubwotCi1AaXRlbSB3cml0ZSBtZW0KLUB0YWIgQGNvZGV7TX1AdmFye2FkZHJ9LEB2YXJ7bGVuZ3RofUBjb2Rlezp9QHZhcntYWC4uLn0KLUB0YWIKLVdyaXRlIEB2YXJ7bGVuZ3RofSBieXRlcyBvZiBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyBAdmFye2FkZHJ9LgotQHZhcntYWC4uLn0gaXMgdGhlIGRhdGEuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtPS30KLUB0YWIgZm9yIHN1Y2Nlc3MKLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIKLWZvciBhbiBlcnJvciAodGhpcyBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSBvbmx5IHBhcnQgb2YgdGhlIGRhdGEgd2FzCi13cml0dGVuKS4KLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7bn0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle059Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtvfQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7T30KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlYWQgcmVnIEBzdHJvbmd7KHJlc2VydmVkKX0KLUB0YWIgQGNvZGV7cH1AdmFye24uLi59Ci1AdGFiCi1TZWUgd3JpdGUgcmVnaXN0ZXIuCi1AaXRlbQotQHRhYiByZXR1cm4gQHZhcntyLi4uLn0KLUB0YWIgVGhlIGhleCBlbmNvZGVkIHZhbHVlIG9mIHRoZSByZWdpc3RlciBpbiB0YXJnZXQgYnl0ZSBvcmRlci4KLQotQGl0ZW0gd3JpdGUgcmVnIEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle1B9QHZhcntuLi4ufUBjb2Rlez19QHZhcntyLi4ufQotQHRhYgotV3JpdGUgcmVnaXN0ZXIgQHZhcntuLi4ufSB3aXRoIHZhbHVlIEB2YXJ7ci4uLn0sIHdoaWNoIGNvbnRhaW5zIHR3byBoZXgKLWRpZ2l0cyBmb3IgZWFjaCBieXRlIGluIHRoZSByZWdpc3RlciAodGFyZ2V0IGJ5dGUgb3JkZXIpLgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7T0t9Ci1AdGFiIGZvciBzdWNjZXNzCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtFfUB2YXJ7Tk59Ci1AdGFiIGZvciBhbiBlcnJvcgotCi1AaXRlbSBnZW5lcmFsIHF1ZXJ5IEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle3F9QHZhcntxdWVyeX0KLUB0YWIKLVJlcXVlc3QgaW5mbyBhYm91dCBAdmFye3F1ZXJ5fS4gSW4gZ2VuZXJhbCBAdmFsdWV7R0RCTn0gQHZhcntxdWVyeX0ncwotaGF2ZSBhIGxlYWRpbmcgdXBwZXIgY2FzZSBsZXR0ZXIuICBDdXN0b20gdmVuZG9yIHF1ZXJpZXMgc2hvdWxkIHVzZSBhCi1sZWFkaW5nIGxvd2VyIGNhc2UgbGV0dGVyIGFuZCBhIGNvbXBhbnkgcHJlZml4LCBleDogQHNhbXB7cWZzZi52YXJ9LgotQHZhcntxdWVyeX0gbWF5IG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgYSBAc2FtcHssfSBvciBAc2FtcHs7fQotc2VwYXJhdGVkIGxpc3QuICBTdHVicyBzaG91bGQgZW5zdXJlIHRoYXQgdGhleSBmdWxseSBtYXRjaCBhbnkKLUB2YXJ7cXVlcnl9IG5hbWUuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtYWC4uLn0KLUB0YWIgSGV4IGVuY29kZWQgZGF0YSBmcm9tIHF1ZXJ5LiBUaGUgcmVwbHkgY2FuIG5vdCBiZSBlbXB0eS4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIgZXJyb3IgcmVwbHkKLUBpdGVtCi1AdGFiIHJlcGx5IEBzYW1we30KLUB0YWIgSW5kaWNhdGluZyBhbiB1bnJlY29nbml6ZWQgQHZhcntxdWVyeX0uCi0KLUBpdGVtIGN1cnJlbnQgdGhyZWFkCi1AdGFiIEBjb2Rle3F9QGNvZGV7Q30KLUB0YWIgUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCBpZC4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle1FDfUB2YXJ7cGlkfQotQHRhYgotV2hlcmUgQHZhcntwaWR9IGlzIGEgSEVYIGVuY29kZWQgMTYgYml0IHByb2Nlc3MgaWQuCi1AaXRlbQotQHRhYiByZXBseSAqCi1AdGFiIEFueSBvdGhlciByZXBseSBpbXBsaWVzIHRoZSBvbGQgcGlkLgotCi1AaXRlbSBjb21wdXRlIENSQyBvZiBtZW1vcnkgYmxvY2sKLUB0YWIgQGNvZGV7cX1AY29kZXtDUkM6fUB2YXJ7YWRkcn1AY29kZXssfUB2YXJ7bGVuZ3RofQotQHRhYgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7RX1AdmFye05OfQotQHRhYiBBbiBlcnJvciAoc3VjaCBhcyBtZW1vcnkgZmF1bHQpCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtDfUB2YXJ7Q1JDMzJ9Ci1AdGFiIEEgMzIgYml0IGN5Y2xpYyByZWR1bmRhbmN5IGNoZWNrIG9mIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJlZ2lvbi4KLQotQGl0ZW0gcXVlcnkgQHZhcntMSVNUfSBvciBAdmFye3RocmVhZExJU1R9Ci1AdGFiIEBjb2Rle3F9QGNvZGV7TH1AdmFye3N0YXJ0ZmxhZ31AdmFye3RocmVhZGNvdW50fUB2YXJ7bmV4dHRocmVhZH0KLUB0YWIKLU9idGFpbiB0aHJlYWQgaW5mb3JtYXRpb24gZnJvbSBSVE9TLiAgQHZhcntzdGFydGZsYWd9IGlzIG9uZSBoZXggZGlnaXQ7Ci1AdmFye3RocmVhZGNvdW50fSBpcyB0d28gaGV4IGRpZ2l0czsgYW5kIEB2YXJ7bmV4dHRocmVhZH0gaXMgMTYgaGV4Ci1kaWdpdHMuCi1AaXRlbQotQHRhYiByZXBseSAqCi1AdGFiCi1TZWUgQGNvZGV7cmVtb3RlLmM6cGFyc2VfdGhyZWFkbGlzdF9yZXNwb25zZSgpfS4KLQotQGl0ZW0gcXVlcnkgc2VjdCBvZmZzCi1AdGFiIEBjb2Rle3F9QGNvZGV7T2Zmc2V0c30KLUB0YWIgR2V0IHNlY3Rpb24gb2Zmc2V0cy4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle1RleHQ9fUB2YXJ7eHh4fUBjb2RleztEYXRhPX1AdmFye3l5eX1AY29kZXs7QnNzPX1AdmFye3p6en0KLQotQGl0ZW0gdGhyZWFkIGluZm8gcmVxdWVzdAotQHRhYiBAY29kZXtxfUBjb2Rle1B9QHZhcnttb2RlfUB2YXJ7dGhyZWFkaWR9Ci1AdGFiCi1SZXR1cm5zIGluZm9ybWF0aW9uIG9uIEB2YXJ7dGhyZWFkaWR9LiAgV2hlcmU6IEB2YXJ7bW9kZX0gaXMgYSBoZXgKLWVuY29kZWQgMzIgYml0IG1vZGU7IEB2YXJ7dGhyZWFkaWR9IGlzIGEgaGV4IGVuY29kZWQgNjQgYml0IHRocmVhZCBJRC4KLUBpdGVtCi1AdGFiIHJlcGx5ICoKLUB0YWIKLVNlZSBAY29kZXtyZW1vdGUuYzpyZW1vdGVfdW5wYWNrX3RocmVhZF9pbmZvX3Jlc3BvbnNlKCl9LgotCi1AaXRlbSByZW1vdGUgY29tbWFuZAotQHRhYiBAY29kZXtxfUBjb2Rle1JjbWQsfUB2YXJ7Q09NTUFORH0KLUB0YWIKLUB2YXJ7Q09NTUFORH0gKGhleCBlbmNvZGVkKSBpcyBwYXNzZWQgdG8gdGhlIGxvY2FsIGludGVycHJldGVyIGZvcgotZXhlY3V0aW9uLiBJbnZhbGlkIGNvbW1hbmRzIHNob3VsZCBiZSByZXBvcnRlZCB1c2luZyB0aGUgb3V0cHV0IHN0cmluZy4KLUJlZm9yZSB0aGUgZmluYWwgcmVzdWx0IHBhY2tldCwgdGhlIHRhcmdldCBtYXkgYWxzbyByZXNwb25kIHdpdGggYQotbnVtYmVyIG9mIGludGVybWVkaWF0ZSBAY29kZXtPfUB2YXJ7T1VUUFVUfSBjb25zb2xlIG91dHB1dAotcGFja2V0cy4gQGVtcGh7SW1wbGVtZW50b3JzIHNob3VsZCBub3RlIHRoYXQgcHJvdmlkaW5nIGFjY2VzcyB0byBhCi1zdHVicydzIGludGVycHJldGVyIG1heSBoYXZlIHNlY3VyaXR5IGltcGxpY2F0aW9uc30uCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtPS30KLUB0YWIKLUEgY29tbWFuZCByZXNwb25zZSB3aXRoIG5vIG91dHB1dC4KLUBpdGVtCi1AdGFiIHJlcGx5IEB2YXJ7T1VUUFVUfQotQHRhYgotQSBjb21tYW5kIHJlc3BvbnNlIHdpdGggdGhlIGhleCBlbmNvZGVkIG91dHB1dCBzdHJpbmcgQHZhcntPVVRQVVR9LgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7RX1AdmFye05OfQotQHRhYgotSW5kaWNhdGUgYSBiYWRseSBmb3JtZWQgcmVxdWVzdC4KLQotQGl0ZW0KLUB0YWIgcmVwbHkgQHNhbXB7fQotQHRhYgotV2hlbiBAc2FtcHtxfUBzYW1we1JjbWR9IGlzIG5vdCByZWNvZ25pemVkLgotCi1AaXRlbSBnZW5lcmFsIHNldCBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtRfUB2YXJ7dmFyfUBjb2Rlez19QHZhcnt2YWx9Ci1AdGFiCi1TZXQgdmFsdWUgb2YgQHZhcnt2YXJ9IHRvIEB2YXJ7dmFsfS4gIFNlZSBAc2FtcHtxfSBmb3IgYSBkaXNjdXNzaW5nIG9mCi1uYW1pbmcgY29udmVudGlvbnMuCi0KLUBpdGVtIHJlc2V0IEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIHIKLUB0YWIgcmVzZXQgLS0gc2VlIHNwYXJjIHN0dWIuCi0KLUBpdGVtIHJlbW90ZSByZXN0YXJ0IEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle1J9QHZhcntYWH0KLUB0YWIKLVJlc3RhcnQgdGhlIHJlbW90ZSBzZXJ2ZXIuIEB2YXJ7WFh9IHdoaWxlIG5lZWRlZCBoYXMgbm8gY2xlYXIKLWRlZmluaXRpb24uCi0KLUBpdGVtIHN0ZXAgQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7c31AdmFye2FkZHJ9Ci1AdGFiCi1AdmFye2FkZHJ9IGlzIGFkZHJlc3MgdG8gcmVzdW1lLiAgSWYgQHZhcnthZGRyfSBpcyBvbWl0dGVkLCByZXN1bWUgYXQKLXNhbWUgYWRkcmVzcy4KLUBpdGVtCi1AdGFiIHJlcGx5Ci1AdGFiIHNlZSBiZWxvdwotCi1AaXRlbSBzdGVwIHdpdGggc2lnbmFsIEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle1N9QHZhcntzaWd9QGNvZGV7O31AdmFye2FkZHJ9Ci1AdGFiCi1MaWtlIEBzYW1we0N9IGJ1dCBzdGVwIG5vdCBjb250aW51ZS4KLUBpdGVtCi1AdGFiIHJlcGx5Ci1AdGFiIHNlZSBiZWxvdwotCi1AaXRlbSBzZWFyY2ggQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7dH1AdmFye2FkZHJ9QGNvZGV7On1AdmFye1BQfUBjb2Rleyx9QHZhcntNTX0KLUB0YWIKLVNlYXJjaCBiYWNrd2FyZHMgc3RhcnRpbmcgYXQgYWRkcmVzcyBAdmFye2FkZHJ9IGZvciBhIG1hdGNoIHdpdGggcGF0dGVybgotQHZhcntQUH0gYW5kIG1hc2sgQHZhcntNTX0uICBAdmFye1BQfSBhbmQgQHZhcntNTX0gYXJlIDQKLWJ5dGVzLiBAdmFye2FkZHJ9IG11c3QgYmUgYXQgbGVhc3QgMyBkaWdpdHMuCi0KLUBpdGVtIHRocmVhZCBhbGl2ZSBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtUfUB2YXJ7WFh9Ci1AdGFiIEZpbmQgb3V0IGlmIHRoZSB0aHJlYWQgWFggaXMgYWxpdmUuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtPS30KLUB0YWIgdGhyZWFkIGlzIHN0aWxsIGFsaXZlCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtFfUB2YXJ7Tk59Ci1AdGFiIHRocmVhZCBpcyBkZWFkCi0JCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXt1fQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7VX0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle3Z9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtWfQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7d30KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle1d9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXt4fQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gd3JpdGUgbWVtIChiaW5hcnkpIEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle1h9QHZhcnthZGRyfUBjb2Rleyx9QHZhcntsZW5ndGh9QHZhcns6fUB2YXJ7WFguLi59Ci1AdGFiCi1AdmFye2FkZHJ9IGlzIGFkZHJlc3MsIEB2YXJ7bGVuZ3RofSBpcyBudW1iZXIgb2YgYnl0ZXMsIEB2YXJ7WFguLi59IGlzCi1iaW5hcnkgZGF0YS4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle09LfQotQHRhYiBmb3Igc3VjY2VzcwotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7RX1AdmFye05OfQotQHRhYiBmb3IgYW4gZXJyb3IKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7eX0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle1l9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZW1vdmUgYnJlYWsgb3Igd2F0Y2hwb2ludCBAc3Ryb25neyhkcmFmdCl9IEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle3p9QHZhcnt0fUBjb2Rleyx9QHZhcnthZGRyfUBjb2Rleyx9QHZhcntsZW5ndGh9Ci1AdGFiCi1TZWUgQHNhbXB7Wn0uCi0KLUBpdGVtIGluc2VydCBicmVhayBvciB3YXRjaHBvaW50IEBzdHJvbmd7KGRyYWZ0KX0gQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7Wn1AdmFye3R9QGNvZGV7LH1AdmFye2FkZHJ9QGNvZGV7LH1AdmFye2xlbmd0aH0KLUB0YWIKLUB2YXJ7dH0gaXMgdHlwZTogQHNhbXB7MH0gLSBzb2Z0d2FyZSBicmVha3BvaW50LCBAc2FtcHsxfSAtIGhhcmR3YXJlCi1icmVha3BvaW50LCBAc2FtcHsyfSAtIHdyaXRlIHdhdGNocG9pbnQsIEBzYW1wezN9IC0gcmVhZCB3YXRjaHBvaW50LAotQHNhbXB7NH0gLSBhY2Nlc3Mgd2F0Y2hwb2ludDsgQHZhcnthZGRyfSBpcyBhZGRyZXNzOyBAdmFye2xlbmd0aH0gaXMgaW4KLWJ5dGVzLiAgRm9yIGEgc29mdHdhcmUgYnJlYWtwb2ludCwgQHZhcntsZW5ndGh9IHNwZWNpZmllcyB0aGUgc2l6ZSBvZgotdGhlIGluc3RydWN0aW9uIHRvIGJlIHBhdGNoZWQuICBGb3IgaGFyZHdhcmUgYnJlYWtwb2ludHMgYW5kIHdhdGNocG9pbnRzCi1AdmFye2xlbmd0aH0gc3BlY2lmaWVzIHRoZSBtZW1vcnkgcmVnaW9uIHRvIGJlIG1vbml0b3JlZC4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIgZm9yIGFuIGVycm9yCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtPS30KLUB0YWIgZm9yIHN1Y2Nlc3MKLUBpdGVtCi1AdGFiIEBzYW1we30KLUB0YWIgSWYgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgPG90aGVyPgotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGVuZCBtdWx0aXRhYmxlCi0KLUluIHRoZSBjYXNlIG9mIHRoZSBAc2FtcHtDfSwgQHNhbXB7Y30sIEBzYW1we1N9IGFuZCBAc2FtcHtzfSBwYWNrZXRzLAotdGhlcmUgaXMgbm8gaW1tZWRpYXRlIHJlc3BvbnNlLiAgVGhlIHJlcGx5LCBkZXNjcmliZWQgYmVsb3csIGNvbWVzIHdoZW4KLXRoZSBtYWNoaW5lIHN0b3BzOgotCi1AbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC40IC42Ci0KLUBpdGVtIEBjb2Rle1N9QHZhcntBQX0KLUB0YWIgQHZhcntBQX0gaXMgdGhlIHNpZ25hbCBudW1iZXIKLQotQGl0ZW0gQGNvZGV7VH1AdmFye0FBfUB2YXJ7bi4uLn1AY29kZXs6fUB2YXJ7ci4uLn1AY29kZXs7fUB2YXJ7bi4uLn1AY29kZXs6fUB2YXJ7ci4uLn1AY29kZXs7fUB2YXJ7bi4uLn1AY29kZXs6fUB2YXJ7ci4uLn1AY29kZXs7fQotQHRhYgotQHZhcntBQX0gPSB0d28gaGV4IGRpZ2l0IHNpZ25hbCBudW1iZXI7IEB2YXJ7bi4uLn0gPSByZWdpc3RlciBudW1iZXIKLShoZXgpLCBAdmFye3IuLi59ICA9IHRhcmdldCBieXRlIG9yZGVyZWQgcmVnaXN0ZXIgY29udGVudHMsIHNpemUgZGVmaW5lZAotYnkgQGNvZGV7UkVHSVNURVJfUkFXX1NJWkV9OyBAdmFye24uLi59ID0gQHNhbXB7dGhyZWFkfSwgQHZhcntyLi4ufSA9Ci10aHJlYWQgcHJvY2VzcyBJRCwgdGhpcyBpcyBhIGhleCBpbnRlZ2VyOyBAdmFye24uLi59ID0gb3RoZXIgc3RyaW5nIG5vdAotc3RhcnRpbmcgd2l0aCB2YWxpZCBoZXggZGlnaXQuIEB2YWx1ZXtHREJOfSBzaG91bGQgaWdub3JlIHRoaXMKLUB2YXJ7bi4uLn0sIEB2YXJ7ci4uLn0gcGFpciBhbmQgZ28gb24gdG8gdGhlIG5leHQuICBUaGlzIHdheSB3ZSBjYW4KLWV4dGVuZCB0aGUgcHJvdG9jb2wuCi0KLUBpdGVtIEBjb2Rle1d9QHZhcntBQX0KLUB0YWIKLVRoZSBwcm9jZXNzIGV4aXRlZCwgYW5kIEB2YXJ7QUF9IGlzIHRoZSBleGl0IHN0YXR1cy4gIFRoaXMgaXMgb25seQotYXBwbGljYWJsZSBmb3IgY2VydGFpbnMgc29ydHMgb2YgdGFyZ2V0cy4KLQotQGl0ZW0gQGNvZGV7WH1AdmFye0FBfQotQHRhYgotVGhlIHByb2Nlc3MgdGVybWluYXRlZCB3aXRoIHNpZ25hbCBAdmFye0FBfS4KLQotQGl0ZW0gQGNvZGV7Tn1AdmFye0FBfUBjb2Rlezt9QHZhcnt0dHR0dHR0dH1AY29kZXs7fUB2YXJ7ZGRkZGRkZGR9QGNvZGV7O31AdmFye2JiYmJiYmJifSBAc3Ryb25neyhvYnNvbGV0ZSl9Ci1AdGFiCi1AdmFye0FBfSA9IHNpZ25hbCBudW1iZXI7IEB2YXJ7dHR0dHR0dHR9ID0gYWRkcmVzcyBvZiBzeW1ib2wgIl9zdGFydCI7Ci1AdmFye2RkZGRkZGRkfSA9IGJhc2Ugb2YgZGF0YSBzZWN0aW9uOyBAdmFye2JiYmJiYmJifSA9IGJhc2Ugb2YgYnNzCi1zZWN0aW9uLiBAZW1waHtOb3RlOiBvbmx5IHVzZWQgYnkgQ2lzY28gU3lzdGVtcyB0YXJnZXRzLiAgVGhlIGRpZmZlcmVuY2UKLWJldHdlZW4gdGhpcyByZXBseSBhbmQgdGhlICJxT2Zmc2V0cyIgcXVlcnkgaXMgdGhhdCB0aGUgJ04nIHBhY2tldCBtYXkKLWFycml2ZSBzcG9udGFuZW91c2x5IHdoZXJlYXMgdGhlICdxT2Zmc2V0cycgaXMgYSBxdWVyeSBpbml0aWF0ZWQgYnkgdGhlCi1ob3N0IGRlYnVnZ2VyLn0KLQotQGl0ZW0gQGNvZGV7T31AdmFye1hYLi4ufQotQHRhYgotQHZhcntYWC4uLn0gaXMgaGV4IGVuY29kaW5nIG9mIEFTQ0lJIGRhdGEuIFRoaXMgY2FuIGhhcHBlbiBhdCBhbnkgdGltZQotd2hpbGUgdGhlIHByb2dyYW0gaXMgcnVubmluZyBhbmQgdGhlIGRlYnVnZ2VyIHNob3VsZCBjb250aW51ZSB0byB3YWl0Ci1mb3IgJ1cnLCAnVCcsIGV0Yy4KLQotQGVuZCBtdWx0aXRhYmxlCi0KLUV4YW1wbGUgc2VxdWVuY2Ugb2YgYSB0YXJnZXQgYmVpbmcgcmUtc3RhcnRlZC4gIE5vdGljZSBob3cgdGhlIHJlc3RhcnQKLWRvZXMgbm90IGdldCBhbnkgZGlyZWN0IG91dHB1dDoKLQotQGV4YW1wbGUKLTwtIEBjb2Rle1IwMH0KLS0+IEBjb2Rleyt9Ci1AZW1waHt0YXJnZXQgcmVzdGFydHN9Ci08LSBAY29kZXs/fQotLT4gQGNvZGV7K30KLS0+IEBjb2Rle1QwMDE6MTIzNDEyMzQxMjM0MTIzNH0KLTwtIEBjb2Rleyt9Ci1AZW5kIGV4YW1wbGUKLQotRXhhbXBsZSBzZXF1ZW5jZSBvZiBhIHRhcmdldCBiZWluZyBzdGVwcGVkIGJ5IGEgc2luZ2xlIGluc3RydWN0aW9uOgotCi1AZXhhbXBsZQotPC0gQGNvZGV7RzE0NDUuLi59Ci0tPiBAY29kZXsrfQotPC0gQGNvZGV7c30KLS0+IEBjb2Rleyt9Ci1AZW1waHt0aW1lIHBhc3Nlc30KLS0+IEBjb2Rle1QwMDE6MTIzNDEyMzQxMjM0MTIzNH0KLTwtIEBjb2Rleyt9Ci08LSBAY29kZXtnfQotLT4gQGNvZGV7K30KLS0+IEBjb2RlezE0NTUuLi59Ci08LSBAY29kZXsrfQotQGVuZCBleGFtcGxlCi0KLUBraW5kZXggc2V0IHJlbW90ZWRlYnVnCi1Aa2luZGV4IHNob3cgcmVtb3RlZGVidWcKLUBjaW5kZXggcGFja2V0cywgcmVwb3J0aW5nIG9uIHN0ZG91dAotQGNpbmRleCBzZXJpYWwgY29ubmVjdGlvbnMsIGRlYnVnZ2luZwotSWYgeW91IGhhdmUgdHJvdWJsZSB3aXRoIHRoZSBzZXJpYWwgY29ubmVjdGlvbiwgeW91IGNhbiB1c2UgdGhlIGNvbW1hbmQKLUBjb2Rle3NldCByZW1vdGVkZWJ1Z30uICBUaGlzIG1ha2VzIEB2YWx1ZXtHREJOfSByZXBvcnQgb24gYWxsIHBhY2tldHMgc2VudAotYmFjayBhbmQgZm9ydGggYWNyb3NzIHRoZSBzZXJpYWwgbGluZSB0byB0aGUgcmVtb3RlIG1hY2hpbmUuICBUaGUKLXBhY2tldC1kZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBvbiB0aGUgQHZhbHVle0dEQk59IHN0YW5kYXJkIG91dHB1dAotc3RyZWFtLiAgQGNvZGV7c2V0IHJlbW90ZWRlYnVnIG9mZn0gdHVybnMgaXQgb2ZmLCBhbmQgQGNvZGV7c2hvdwotcmVtb3RlZGVidWd9IHNob3dzIHlvdSBpdHMgY3VycmVudCBzdGF0ZS4KLQotQG5vZGUgU2VydmVyCi1Ac3Vic3Vic2VjdGlvbiBVc2luZyB0aGUgQGNvZGV7Z2Ric2VydmVyfSBwcm9ncmFtCi0KLUBraW5kZXggZ2Ric2VydmVyCi1AY2luZGV4IHJlbW90ZSBjb25uZWN0aW9uIHdpdGhvdXQgc3R1YnMKLUBjb2Rle2dkYnNlcnZlcn0gaXMgYSBjb250cm9sIHByb2dyYW0gZm9yIFVuaXgtbGlrZSBzeXN0ZW1zLCB3aGljaAotYWxsb3dzIHlvdSB0byBjb25uZWN0IHlvdXIgcHJvZ3JhbSB3aXRoIGEgcmVtb3RlIEB2YWx1ZXtHREJOfSB2aWEKLUBjb2Rle3RhcmdldCByZW1vdGV9LS0tYnV0IHdpdGhvdXQgbGlua2luZyBpbiB0aGUgdXN1YWwgZGVidWdnaW5nIHN0dWIuCi0KLUBjb2Rle2dkYnNlcnZlcn0gaXMgbm90IGEgY29tcGxldGUgcmVwbGFjZW1lbnQgZm9yIHRoZSBkZWJ1Z2dpbmcgc3R1YnMsCi1iZWNhdXNlIGl0IHJlcXVpcmVzIGVzc2VudGlhbGx5IHRoZSBzYW1lIG9wZXJhdGluZy1zeXN0ZW0gZmFjaWxpdGllcwotdGhhdCBAdmFsdWV7R0RCTn0gaXRzZWxmIGRvZXMuICBJbiBmYWN0LCBhIHN5c3RlbSB0aGF0IGNhbiBydW4KLUBjb2Rle2dkYnNlcnZlcn0gdG8gY29ubmVjdCB0byBhIHJlbW90ZSBAdmFsdWV7R0RCTn0gY291bGQgYWxzbyBydW4KLUB2YWx1ZXtHREJOfSBsb2NhbGx5ISAgQGNvZGV7Z2Ric2VydmVyfSBpcyBzb21ldGltZXMgdXNlZnVsIG5ldmVydGhlbGVzcywKLWJlY2F1c2UgaXQgaXMgYSBtdWNoIHNtYWxsZXIgcHJvZ3JhbSB0aGFuIEB2YWx1ZXtHREJOfSBpdHNlbGYuICBJdCBpcwotYWxzbyBlYXNpZXIgdG8gcG9ydCB0aGFuIGFsbCBvZiBAdmFsdWV7R0RCTn0sIHNvIHlvdSBtYXkgYmUgYWJsZSB0byBnZXQKLXN0YXJ0ZWQgbW9yZSBxdWlja2x5IG9uIGEgbmV3IHN5c3RlbSBieSB1c2luZyBAY29kZXtnZGJzZXJ2ZXJ9LgotRmluYWxseSwgaWYgeW91IGRldmVsb3AgY29kZSBmb3IgcmVhbC10aW1lIHN5c3RlbXMsIHlvdSBtYXkgZmluZCB0aGF0Ci10aGUgdHJhZGVvZmZzIGludm9sdmVkIGluIHJlYWwtdGltZSBvcGVyYXRpb24gbWFrZSBpdCBtb3JlIGNvbnZlbmllbnQgdG8KLWRvIGFzIG11Y2ggZGV2ZWxvcG1lbnQgd29yayBhcyBwb3NzaWJsZSBvbiBhbm90aGVyIHN5c3RlbSwgZm9yIGV4YW1wbGUKLWJ5IGNyb3NzLWNvbXBpbGluZy4gIFlvdSBjYW4gdXNlIEBjb2Rle2dkYnNlcnZlcn0gdG8gbWFrZSBhIHNpbWlsYXIKLWNob2ljZSBmb3IgZGVidWdnaW5nLgotCi1AdmFsdWV7R0RCTn0gYW5kIEBjb2Rle2dkYnNlcnZlcn0gY29tbXVuaWNhdGUgdmlhIGVpdGhlciBhIHNlcmlhbCBsaW5lCi1vciBhIFRDUCBjb25uZWN0aW9uLCB1c2luZyB0aGUgc3RhbmRhcmQgQHZhbHVle0dEQk59IHJlbW90ZSBzZXJpYWwKLXByb3RvY29sLgotCi1AdGFibGUgQGVtcGgKLUBpdGVtIE9uIHRoZSB0YXJnZXQgbWFjaGluZSwKLXlvdSBuZWVkIHRvIGhhdmUgYSBjb3B5IG9mIHRoZSBwcm9ncmFtIHlvdSB3YW50IHRvIGRlYnVnLgotQGNvZGV7Z2Ric2VydmVyfSBkb2VzIG5vdCBuZWVkIHlvdXIgcHJvZ3JhbSdzIHN5bWJvbCB0YWJsZSwgc28geW91IGNhbgotc3RyaXAgdGhlIHByb2dyYW0gaWYgbmVjZXNzYXJ5IHRvIHNhdmUgc3BhY2UuICBAdmFsdWV7R0RCTn0gb24gdGhlIGhvc3QKLXN5c3RlbSBkb2VzIGFsbCB0aGUgc3ltYm9sIGhhbmRsaW5nLgotCi1UbyB1c2UgdGhlIHNlcnZlciwgeW91IG11c3QgdGVsbCBpdCBob3cgdG8gY29tbXVuaWNhdGUgd2l0aCBAdmFsdWV7R0RCTn07Ci10aGUgbmFtZSBvZiB5b3VyIHByb2dyYW07IGFuZCB0aGUgYXJndW1lbnRzIGZvciB5b3VyIHByb2dyYW0uICBUaGUKLXN5bnRheCBpczoKLQotQHNtYWxsZXhhbXBsZQotdGFyZ2V0PiBnZGJzZXJ2ZXIgQHZhcntjb21tfSBAdmFye3Byb2dyYW19IFsgQHZhcnthcmdzfSBAZG90c3t9IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUB2YXJ7Y29tbX0gaXMgZWl0aGVyIGEgZGV2aWNlIG5hbWUgKHRvIHVzZSBhIHNlcmlhbCBsaW5lKSBvciBhIFRDUAotaG9zdG5hbWUgYW5kIHBvcnRudW1iZXIuICBGb3IgZXhhbXBsZSwgdG8gZGVidWcgRW1hY3Mgd2l0aCB0aGUgYXJndW1lbnQKLUBzYW1we2Zvby50eHR9IGFuZCBjb21tdW5pY2F0ZSB3aXRoIEB2YWx1ZXtHREJOfSBvdmVyIHRoZSBzZXJpYWwgcG9ydAotQGZpbGV7L2Rldi9jb20xfToKLQotQHNtYWxsZXhhbXBsZQotdGFyZ2V0PiBnZGJzZXJ2ZXIgL2Rldi9jb20xIGVtYWNzIGZvby50eHQKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle2dkYnNlcnZlcn0gd2FpdHMgcGFzc2l2ZWx5IGZvciB0aGUgaG9zdCBAdmFsdWV7R0RCTn0gdG8gY29tbXVuaWNhdGUKLXdpdGggaXQuCi0KLVRvIHVzZSBhIFRDUCBjb25uZWN0aW9uIGluc3RlYWQgb2YgYSBzZXJpYWwgbGluZToKLQotQHNtYWxsZXhhbXBsZQotdGFyZ2V0PiBnZGJzZXJ2ZXIgaG9zdDoyMzQ1IGVtYWNzIGZvby50eHQKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXMgZXhhbXBsZSBpcyB0aGUgZmlyc3QgYXJndW1lbnQsCi1zcGVjaWZ5aW5nIHRoYXQgeW91IGFyZSBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGhvc3QgQHZhbHVle0dEQk59IHZpYQotVENQLiAgVGhlIEBzYW1we2hvc3Q6MjM0NX0gYXJndW1lbnQgbWVhbnMgdGhhdCBAY29kZXtnZGJzZXJ2ZXJ9IGlzIHRvCi1leHBlY3QgYSBUQ1AgY29ubmVjdGlvbiBmcm9tIG1hY2hpbmUgQHNhbXB7aG9zdH0gdG8gbG9jYWwgVENQIHBvcnQgMjM0NS4KLShDdXJyZW50bHksIHRoZSBAc2FtcHtob3N0fSBwYXJ0IGlzIGlnbm9yZWQuKSAgWW91IGNhbiBjaG9vc2UgYW55IG51bWJlcgoteW91IHdhbnQgZm9yIHRoZSBwb3J0IG51bWJlciBhcyBsb25nIGFzIGl0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggYW55Ci1UQ1AgcG9ydHMgYWxyZWFkeSBpbiB1c2Ugb24gdGhlIHRhcmdldCBzeXN0ZW0gKGZvciBleGFtcGxlLCBAY29kZXsyM30gaXMKLXJlc2VydmVkIGZvciBAY29kZXt0ZWxuZXR9KS5AZm9vdG5vdGV7SWYgeW91IGNob29zZSBhIHBvcnQgbnVtYmVyIHRoYXQKLWNvbmZsaWN0cyB3aXRoIGFub3RoZXIgc2VydmljZSwgQGNvZGV7Z2Ric2VydmVyfSBwcmludHMgYW4gZXJyb3IgbWVzc2FnZQotYW5kIGV4aXRzLn0gWW91IG11c3QgdXNlIHRoZSBzYW1lIHBvcnQgbnVtYmVyIHdpdGggdGhlIGhvc3QgQHZhbHVle0dEQk59Ci1AY29kZXt0YXJnZXQgcmVtb3RlfSBjb21tYW5kLgotCi1AaXRlbSBPbiB0aGUgQHZhbHVle0dEQk59IGhvc3QgbWFjaGluZSwKLXlvdSBuZWVkIGFuIHVuc3RyaXBwZWQgY29weSBvZiB5b3VyIHByb2dyYW0sIHNpbmNlIEB2YWx1ZXtHREJOfSBuZWVkcwotc3ltYm9scyBhbmQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgU3RhcnQgdXAgQHZhbHVle0dEQk59IGFzIHVzdWFsLAotdXNpbmcgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIGNvcHkgb2YgeW91ciBwcm9ncmFtIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KLShZb3UgbWF5IGFsc28gbmVlZCB0aGUgQHd7QHNhbXB7LS1iYXVkfX0gb3B0aW9uIGlmIHRoZSBzZXJpYWwgbGluZSBpcwotcnVubmluZyBhdCBhbnl0aGluZyBvdGhlciB0aGFuIDk2MDAgYnBzLikgIEFmdGVyIHRoYXQsIHVzZSBAY29kZXt0YXJnZXQKLXJlbW90ZX0gdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb25zIHdpdGggQGNvZGV7Z2Ric2VydmVyfS4gIEl0cyBhcmd1bWVudAotaXMgZWl0aGVyIGEgZGV2aWNlIG5hbWUgKHVzdWFsbHkgYSBzZXJpYWwgZGV2aWNlLCBsaWtlCi1AZmlsZXsvZGV2L3R0eWJ9KSwgb3IgYSBUQ1AgcG9ydCBkZXNjcmlwdG9yIGluIHRoZSBmb3JtCi1AY29kZXtAdmFye2hvc3R9OkB2YXJ7UE9SVH19LiAgRm9yIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLShAdmFsdWV7R0RCUH0pIHRhcmdldCByZW1vdGUgL2Rldi90dHliCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLWNvbW11bmljYXRlcyB3aXRoIHRoZSBzZXJ2ZXIgdmlhIHNlcmlhbCBsaW5lIEBmaWxley9kZXYvdHR5Yn0sIGFuZAotCi1Ac21hbGxleGFtcGxlCi0oQHZhbHVle0dEQlB9KSB0YXJnZXQgcmVtb3RlIHRoZS10YXJnZXQ6MjM0NQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1jb21tdW5pY2F0ZXMgdmlhIGEgVENQIGNvbm5lY3Rpb24gdG8gcG9ydCAyMzQ1IG9uIGhvc3QgQHd7QGZpbGV7dGhlLXRhcmdldH19LgotRm9yIFRDUCBjb25uZWN0aW9ucywgeW91IG11c3Qgc3RhcnQgdXAgQGNvZGV7Z2Ric2VydmVyfSBwcmlvciB0byB1c2luZwotdGhlIEBjb2Rle3RhcmdldCByZW1vdGV9IGNvbW1hbmQuICBPdGhlcndpc2UgeW91IG1heSBnZXQgYW4gZXJyb3Igd2hvc2UKLXRleHQgZGVwZW5kcyBvbiB0aGUgaG9zdCBzeXN0ZW0sIGJ1dCB3aGljaCB1c3VhbGx5IGxvb2tzIHNvbWV0aGluZyBsaWtlCi1Ac2FtcHtDb25uZWN0aW9uIHJlZnVzZWR9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBOZXRXYXJlCi1Ac3Vic3Vic2VjdGlvbiBVc2luZyB0aGUgQGNvZGV7Z2Ric2VydmUubmxtfSBwcm9ncmFtCi0KLUBraW5kZXggZ2Ric2VydmUubmxtCi1AY29kZXtnZGJzZXJ2ZS5ubG19IGlzIGEgY29udHJvbCBwcm9ncmFtIGZvciBOZXRXYXJlIHN5c3RlbXMsIHdoaWNoCi1hbGxvd3MgeW91IHRvIGNvbm5lY3QgeW91ciBwcm9ncmFtIHdpdGggYSByZW1vdGUgQHZhbHVle0dEQk59IHZpYQotQGNvZGV7dGFyZ2V0IHJlbW90ZX0uCi0KLUB2YWx1ZXtHREJOfSBhbmQgQGNvZGV7Z2Ric2VydmUubmxtfSBjb21tdW5pY2F0ZSB2aWEgYSBzZXJpYWwgbGluZSwKLXVzaW5nIHRoZSBzdGFuZGFyZCBAdmFsdWV7R0RCTn0gcmVtb3RlIHNlcmlhbCBwcm90b2NvbC4KLQotQHRhYmxlIEBlbXBoCi1AaXRlbSBPbiB0aGUgdGFyZ2V0IG1hY2hpbmUsCi15b3UgbmVlZCB0byBoYXZlIGEgY29weSBvZiB0aGUgcHJvZ3JhbSB5b3Ugd2FudCB0byBkZWJ1Zy4KLUBjb2Rle2dkYnNlcnZlLm5sbX0gZG9lcyBub3QgbmVlZCB5b3VyIHByb2dyYW0ncyBzeW1ib2wgdGFibGUsIHNvIHlvdQotY2FuIHN0cmlwIHRoZSBwcm9ncmFtIGlmIG5lY2Vzc2FyeSB0byBzYXZlIHNwYWNlLiAgQHZhbHVle0dEQk59IG9uIHRoZQotaG9zdCBzeXN0ZW0gZG9lcyBhbGwgdGhlIHN5bWJvbCBoYW5kbGluZy4KLQotVG8gdXNlIHRoZSBzZXJ2ZXIsIHlvdSBtdXN0IHRlbGwgaXQgaG93IHRvIGNvbW11bmljYXRlIHdpdGgKLUB2YWx1ZXtHREJOfTsgdGhlIG5hbWUgb2YgeW91ciBwcm9ncmFtOyBhbmQgdGhlIGFyZ3VtZW50cyBmb3IgeW91cgotcHJvZ3JhbS4gIFRoZSBzeW50YXggaXM6Ci0KLUBzbWFsbGV4YW1wbGUgCi1sb2FkIGdkYnNlcnZlIFsgQk9BUkQ9QHZhcntib2FyZH0gXSBbIFBPUlQ9QHZhcntwb3J0fSBdCi0gICAgICAgICAgICAgIFsgQkFVRD1AdmFye2JhdWR9IF0gQHZhcntwcm9ncmFtfSBbIEB2YXJ7YXJnc30gQGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AdmFye2JvYXJkfSBhbmQgQHZhcntwb3J0fSBzcGVjaWZ5IHRoZSBzZXJpYWwgbGluZTsgQHZhcntiYXVkfSBzcGVjaWZpZXMKLXRoZSBiYXVkIHJhdGUgdXNlZCBieSB0aGUgY29ubmVjdGlvbi4gIEB2YXJ7cG9ydH0gYW5kIEB2YXJ7bm9kZX0gZGVmYXVsdAotdG8gMCwgQHZhcntiYXVkfSBkZWZhdWx0cyB0byA5NjAwIGJwcy4KLQotRm9yIGV4YW1wbGUsIHRvIGRlYnVnIEVtYWNzIHdpdGggdGhlIGFyZ3VtZW50IEBzYW1we2Zvby50eHR9YW5kCi1jb21tdW5pY2F0ZSB3aXRoIEB2YWx1ZXtHREJOfSBvdmVyIHNlcmlhbCBwb3J0IG51bWJlciAyIG9yIGJvYXJkIDEgCi11c2luZyBhIDE5MjAwIGJwcyBjb25uZWN0aW9uOgotCi1Ac21hbGxleGFtcGxlCi1sb2FkIGdkYnNlcnZlIEJPQVJEPTEgUE9SVD0yIEJBVUQ9MTkyMDAgZW1hY3MgZm9vLnR4dAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gT24gdGhlIEB2YWx1ZXtHREJOfSBob3N0IG1hY2hpbmUsCi15b3UgbmVlZCBhbiB1bnN0cmlwcGVkIGNvcHkgb2YgeW91ciBwcm9ncmFtLCBzaW5jZSBAdmFsdWV7R0RCTn0gbmVlZHMKLXN5bWJvbHMgYW5kIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFN0YXJ0IHVwIEB2YWx1ZXtHREJOfSBhcyB1c3VhbCwKLXVzaW5nIHRoZSBuYW1lIG9mIHRoZSBsb2NhbCBjb3B5IG9mIHlvdXIgcHJvZ3JhbSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCi0oWW91IG1heSBhbHNvIG5lZWQgdGhlIEB3e0BzYW1wey0tYmF1ZH19IG9wdGlvbiBpZiB0aGUgc2VyaWFsIGxpbmUgaXMKLXJ1bm5pbmcgYXQgYW55dGhpbmcgb3RoZXIgdGhhbiA5NjAwIGJwcy4gIEFmdGVyIHRoYXQsIHVzZSBAY29kZXt0YXJnZXQKLXJlbW90ZX0gdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb25zIHdpdGggQGNvZGV7Z2Ric2VydmUubmxtfS4gIEl0cwotYXJndW1lbnQgaXMgYSBkZXZpY2UgbmFtZSAodXN1YWxseSBhIHNlcmlhbCBkZXZpY2UsIGxpa2UKLUBmaWxley9kZXYvdHR5Yn0pLiAgRm9yIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLShAdmFsdWV7R0RCUH0pIHRhcmdldCByZW1vdGUgL2Rldi90dHliCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLWNvbW11bmljYXRpb25zIHdpdGggdGhlIHNlcnZlciB2aWEgc2VyaWFsIGxpbmUgQGZpbGV7L2Rldi90dHlifS4KLUBlbmQgdGFibGUKLQotQG5vZGUgaTk2MC1OaW5keSBSZW1vdGUKLUBzdWJzZWN0aW9uIEB2YWx1ZXtHREJOfSB3aXRoIGEgcmVtb3RlIGk5NjAgKE5pbmR5KQotCi1AY2luZGV4IE5pbmR5Ci1AY2luZGV4IGk5NjAKLUBkZm57TmluZHl9IGlzIGEgUk9NIE1vbml0b3IgcHJvZ3JhbSBmb3IgSW50ZWwgOTYwIHRhcmdldCBzeXN0ZW1zLiAgV2hlbgotQHZhbHVle0dEQk59IGlzIGNvbmZpZ3VyZWQgdG8gY29udHJvbCBhIHJlbW90ZSBJbnRlbCA5NjAgdXNpbmcgTmluZHksIHlvdSBjYW4KLXRlbGwgQHZhbHVle0dEQk59IGhvdyB0byBjb25uZWN0IHRvIHRoZSA5NjAgaW4gc2V2ZXJhbCB3YXlzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhyb3VnaCBjb21tYW5kIGxpbmUgb3B0aW9ucyBzcGVjaWZ5aW5nIHNlcmlhbCBwb3J0LCB2ZXJzaW9uIG9mIHRoZQotTmluZHkgcHJvdG9jb2wsIGFuZCBjb21tdW5pY2F0aW9ucyBzcGVlZDsKLQotQGl0ZW0KLUJ5IHJlc3BvbmRpbmcgdG8gYSBwcm9tcHQgb24gc3RhcnR1cDsKLQotQGl0ZW0KLUJ5IHVzaW5nIHRoZSBAY29kZXt0YXJnZXR9IGNvbW1hbmQgYXQgYW55IHBvaW50IGR1cmluZyB5b3VyIEB2YWx1ZXtHREJOfQotc2Vzc2lvbi4gIEB4cmVme1RhcmdldCBDb21tYW5kcywgLENvbW1hbmRzIGZvciBtYW5hZ2luZyB0YXJnZXRzfS4KLQotQGVuZCBpdGVtaXplCi0KLUBtZW51Ci0qIE5pbmR5IFN0YXJ0dXA6OiAgICAgICAgICAgICAgIFN0YXJ0dXAgd2l0aCBOaW5keQotKiBOaW5keSBPcHRpb25zOjogICAgICAgICAgICAgICBPcHRpb25zIGZvciBOaW5keQotKiBOaW5keSBSZXNldDo6ICAgICAgICAgICAgICAgICBOaW5keSByZXNldCBjb21tYW5kCi1AZW5kIG1lbnUKLQotQG5vZGUgTmluZHkgU3RhcnR1cAotQHN1YnN1YnNlY3Rpb24gU3RhcnR1cCB3aXRoIE5pbmR5Ci0KLUlmIHlvdSBzaW1wbHkgc3RhcnQgQGNvZGV7QHZhbHVle0dEQlB9fSB3aXRob3V0IHVzaW5nIGFueSBjb21tYW5kLWxpbmUKLW9wdGlvbnMsIHlvdSBhcmUgcHJvbXB0ZWQgZm9yIHdoYXQgc2VyaWFsIHBvcnQgdG8gdXNlLCBAZW1waHtiZWZvcmV9IHlvdQotcmVhY2ggdGhlIG9yZGluYXJ5IEB2YWx1ZXtHREJOfSBwcm9tcHQ6Ci0KLUBleGFtcGxlCi1BdHRhY2ggL2Rldi90dHlOTiAtLSBzcGVjaWZ5IE5OLCBvciAicXVpdCIgdG8gcXVpdDogIAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotUmVzcG9uZCB0byB0aGUgcHJvbXB0IHdpdGggd2hhdGV2ZXIgc3VmZml4IChhZnRlciBAc2FtcHsvZGV2L3R0eX0pCi1pZGVudGlmaWVzIHRoZSBzZXJpYWwgcG9ydCB5b3Ugd2FudCB0byB1c2UuICBZb3UgY2FuLCBpZiB5b3UgY2hvb3NlLAotc2ltcGx5IHN0YXJ0IHVwIHdpdGggbm8gTmluZHkgY29ubmVjdGlvbiBieSByZXNwb25kaW5nIHRvIHRoZSBwcm9tcHQKLXdpdGggYW4gZW1wdHkgbGluZS4gIElmIHlvdSBkbyB0aGlzIGFuZCBsYXRlciB3aXNoIHRvIGF0dGFjaCB0byBOaW5keSwKLXVzZSBAY29kZXt0YXJnZXR9IChAcHhyZWZ7VGFyZ2V0IENvbW1hbmRzLCAsQ29tbWFuZHMgZm9yIG1hbmFnaW5nIHRhcmdldHN9KS4KLQotQG5vZGUgTmluZHkgT3B0aW9ucwotQHN1YnN1YnNlY3Rpb24gT3B0aW9ucyBmb3IgTmluZHkKLQotVGhlc2UgYXJlIHRoZSBzdGFydHVwIG9wdGlvbnMgZm9yIGJlZ2lubmluZyB5b3VyIEB2YWx1ZXtHREJOfSBzZXNzaW9uIHdpdGggYQotTmluZHktOTYwIGJvYXJkIGF0dGFjaGVkOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1yIEB2YXJ7cG9ydH0KLVNwZWNpZnkgdGhlIHNlcmlhbCBwb3J0IG5hbWUgb2YgYSBzZXJpYWwgaW50ZXJmYWNlIHRvIGJlIHVzZWQgdG8gY29ubmVjdAotdG8gdGhlIHRhcmdldCBzeXN0ZW0uICBUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtHREJOfSBpcwotY29uZmlndXJlZCBmb3IgdGhlIEludGVsIDk2MCB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAgWW91IG1heSBzcGVjaWZ5Ci1AdmFye3BvcnR9IGFzIGFueSBvZjogYSBmdWxsIHBhdGhuYW1lIChlLmcuIEBzYW1wey1yIC9kZXYvdHR5YX0pLCBhCi1kZXZpY2UgbmFtZSBpbiBAZmlsZXsvZGV2fSAoZS5nLiBAc2FtcHstciB0dHlhfSksIG9yIHNpbXBseSB0aGUgdW5pcXVlCi1zdWZmaXggZm9yIGEgc3BlY2lmaWMgQGNvZGV7dHR5fSAoZS5nLiBAc2FtcHstciBhfSkuCi0KLUBpdGVtIC1PCi0oQW4gdXBwZXJjYXNlIGxldHRlciBgYE8nJywgbm90IGEgemVyby4pICBTcGVjaWZ5IHRoYXQgQHZhbHVle0dEQk59IHNob3VsZCB1c2UKLXRoZSBgYG9sZCcnIE5pbmR5IG1vbml0b3IgcHJvdG9jb2wgdG8gY29ubmVjdCB0byB0aGUgdGFyZ2V0IHN5c3RlbS4KLVRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0dEQk59IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBJbnRlbCA5NjAKLXRhcmdldCBhcmNoaXRlY3R1cmUuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBpZiB5b3Ugc3BlY2lmeSBAc2FtcHstT30sIGJ1dCBhcmUgYWN0dWFsbHkgdHJ5aW5nIHRvCi1jb25uZWN0IHRvIGEgdGFyZ2V0IHN5c3RlbSB0aGF0IGV4cGVjdHMgdGhlIG5ld2VyIHByb3RvY29sLCB0aGUgY29ubmVjdGlvbgotZmFpbHMsIGFwcGVhcmluZyB0byBiZSBhIHNwZWVkIG1pc21hdGNoLiAgQHZhbHVle0dEQk59IHJlcGVhdGVkbHkKLWF0dGVtcHRzIHRvIHJlY29ubmVjdCBhdCBzZXZlcmFsIGRpZmZlcmVudCBsaW5lIHNwZWVkcy4gIFlvdSBjYW4gYWJvcnQKLXRoaXMgcHJvY2VzcyB3aXRoIGFuIGludGVycnVwdC4KLUBlbmQgcXVvdGF0aW9uCi0KLUBpdGVtIC1icmsKLVNwZWNpZnkgdGhhdCBAdmFsdWV7R0RCTn0gc2hvdWxkIGZpcnN0IHNlbmQgYSBAY29kZXtCUkVBS30gc2lnbmFsIHRvIHRoZSB0YXJnZXQKLXN5c3RlbSwgaW4gYW4gYXR0ZW1wdCB0byByZXNldCBpdCwgYmVmb3JlIGNvbm5lY3RpbmcgdG8gYSBOaW5keSB0YXJnZXQuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBNYW55IHRhcmdldCBzeXN0ZW1zIGRvIG5vdCBoYXZlIHRoZSBoYXJkd2FyZSB0aGF0IHRoaXMKLXJlcXVpcmVzOyBpdCBvbmx5IHdvcmtzIHdpdGggYSBmZXcgYm9hcmRzLgotQGVuZCBxdW90YXRpb24KLUBlbmQgdGFibGUKLQotVGhlIHN0YW5kYXJkIEBzYW1wey1ifSBvcHRpb24gY29udHJvbHMgdGhlIGxpbmUgc3BlZWQgdXNlZCBvbiB0aGUgc2VyaWFsCi1wb3J0LgotCi1AYyBAZ3JvdXAKLUBub2RlIE5pbmR5IFJlc2V0Ci1Ac3Vic3Vic2VjdGlvbiBOaW5keSByZXNldCBjb21tYW5kCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcmVzZXQKLUBraW5kZXggcmVzZXQKLUZvciBhIE5pbmR5IHRhcmdldCwgdGhpcyBjb21tYW5kIHNlbmRzIGEgYGBicmVhaycnIHRvIHRoZSByZW1vdGUgdGFyZ2V0Ci1zeXN0ZW07IHRoaXMgaXMgb25seSB1c2VmdWwgaWYgdGhlIHRhcmdldCBoYXMgYmVlbiBlcXVpcHBlZCB3aXRoIGEKLWNpcmN1aXQgdG8gcGVyZm9ybSBhIGhhcmQgcmVzZXQgKG9yIHNvbWUgb3RoZXIgaW50ZXJlc3RpbmcgYWN0aW9uKSB3aGVuCi1hIGJyZWFrIGlzIGRldGVjdGVkLgotQGVuZCB0YWJsZQotQGMgQGVuZCBncm91cAotCi1Abm9kZSBVREkyOUsgUmVtb3RlCi1Ac3Vic2VjdGlvbiBUaGUgVURJIHByb3RvY29sIGZvciBBTUQyOUsKLQotQGNpbmRleCBVREkKLUBjaW5kZXggQU1EMjlLIHZpYSBVREkKLUB2YWx1ZXtHREJOfSBzdXBwb3J0cyBBTUQncyBVREkgKGBgVW5pdmVyc2FsIERlYnVnZ2VyIEludGVyZmFjZScnKQotcHJvdG9jb2wgZm9yIGRlYnVnZ2luZyB0aGUgYTI5ayBwcm9jZXNzb3IgZmFtaWx5LiAgVG8gdXNlIHRoaXMKLWNvbmZpZ3VyYXRpb24gd2l0aCBBTUQgdGFyZ2V0cyBydW5uaW5nIHRoZSBNaW5pTU9OIG1vbml0b3IsIHlvdSBuZWVkIHRoZQotcHJvZ3JhbSBAY29kZXtNT05USVB9LCBhdmFpbGFibGUgZnJvbSBBTUQgYXQgbm8gY2hhcmdlLiAgWW91IGNhbiBhbHNvCi11c2UgQHZhbHVle0dEQk59IHdpdGggdGhlIFVESS1jb25mb3JtYW50IGEyOWsgc2ltdWxhdG9yIHByb2dyYW0KLUBjb2Rle0lTU1RJUH0sIGFsc28gYXZhaWxhYmxlIGZyb20gQU1ELgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHRhcmdldCB1ZGkgQHZhcntrZXl3b3JkfQotQGtpbmRleCB1ZGkKLVNlbGVjdCB0aGUgVURJIGludGVyZmFjZSB0byBhIHJlbW90ZSBhMjlrIGJvYXJkIG9yIHNpbXVsYXRvciwgd2hlcmUKLUB2YXJ7a2V5d29yZH0gaXMgYW4gZW50cnkgaW4gdGhlIEFNRCBjb25maWd1cmF0aW9uIGZpbGUgQGZpbGV7dWRpX3NvY30uCi1UaGlzIGZpbGUgY29udGFpbnMga2V5d29yZCBlbnRyaWVzIHdoaWNoIHNwZWNpZnkgcGFyYW1ldGVycyB1c2VkIHRvCi1jb25uZWN0IHRvIGEyOWsgdGFyZ2V0cy4gIElmIHRoZSBAZmlsZXt1ZGlfc29jfSBmaWxlIGlzIG5vdCBpbiB5b3VyCi13b3JraW5nIGRpcmVjdG9yeSwgeW91IG11c3Qgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAc2FtcHtVRElDT05GfQotdG8gaXRzIHBhdGhuYW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBFQjI5SyBSZW1vdGUKLUBzdWJzZWN0aW9uIFRoZSBFQk1PTiBwcm90b2NvbCBmb3IgQU1EMjlLCi0KLUBjaW5kZXggRUIyOUsgYm9hcmQKLUBjaW5kZXggcnVubmluZyAyOUsgcHJvZ3JhbXMKLQotQU1EIGRpc3RyaWJ1dGVzIGEgMjlLIGRldmVsb3BtZW50IGJvYXJkIG1lYW50IHRvIGZpdCBpbiBhIFBDLCB0b2dldGhlcgotd2l0aCBhIERPUy1ob3N0ZWQgbW9uaXRvciBwcm9ncmFtIGNhbGxlZCBAY29kZXtFQk1PTn0uICBBcyBhIHNob3J0aGFuZAotdGVybSwgdGhpcyBkZXZlbG9wbWVudCBzeXN0ZW0gaXMgY2FsbGVkIHRoZSBgYEVCMjlLJycuICBUbyB1c2UKLUB2YWx1ZXtHREJOfSBmcm9tIGEgVW5peCBzeXN0ZW0gdG8gcnVuIHByb2dyYW1zIG9uIHRoZSBFQjI5SyBib2FyZCwgeW91Ci1tdXN0IGZpcnN0IGNvbm5lY3QgYSBzZXJpYWwgY2FibGUgYmV0d2VlbiB0aGUgUEMgKHdoaWNoIGhvc3RzIHRoZSBFQjI5SwotYm9hcmQpIGFuZCBhIHNlcmlhbCBwb3J0IG9uIHRoZSBVbml4IHN5c3RlbS4gIEluIHRoZSBmb2xsb3dpbmcsIHdlCi1hc3N1bWUgeW91J3ZlIGhvb2tlZCB0aGUgY2FibGUgYmV0d2VlbiB0aGUgUEMncyBAZmlsZXtDT00xfSBwb3J0IGFuZAotQGZpbGV7L2Rldi90dHlhfSBvbiB0aGUgVW5peCBzeXN0ZW0uCi0KLUBtZW51Ci0qIENvbW1zIChFQjI5Syk6OiAgICAgICAgICAgICAgIENvbW11bmljYXRpb25zIHNldHVwCi0qIGdkYi1FQjI5Szo6ICAgICAgICAgICAgICAgICAgIEVCMjlLIGNyb3NzLWRlYnVnZ2luZwotKiBSZW1vdGUgTG9nOjogICAgICAgICAgICAgICAgICBSZW1vdGUgbG9nCi1AZW5kIG1lbnUKLQotQG5vZGUgQ29tbXMgKEVCMjlLKQotQHN1YnN1YnNlY3Rpb24gQ29tbXVuaWNhdGlvbnMgc2V0dXAKLQotVGhlIG5leHQgc3RlcCBpcyB0byBzZXQgdXAgdGhlIFBDJ3MgcG9ydCwgYnkgZG9pbmcgc29tZXRoaW5nIGxpa2UgdGhpcwotaW4gRE9TIG9uIHRoZSBQQzoKLQotQGV4YW1wbGUKLUM6XD4gTU9ERSBjb20xOjk2MDAsbiw4LDEsbm9uZQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBleGFtcGxlLS0tcnVuIG9uIGFuIE1TIERPUyA0LjAgc3lzdGVtLS0tc2V0cyB0aGUgUEMgcG9ydCB0byA5NjAwCi1icHMsIG5vIHBhcml0eSwgZWlnaHQgZGF0YSBiaXRzLCBvbmUgc3RvcCBiaXQsIGFuZCBubyBgYHJldHJ5JycgYWN0aW9uOwoteW91IG11c3QgbWF0Y2ggdGhlIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgd2hlbiBlc3RhYmxpc2hpbmcgdGhlIFVuaXgKLWVuZCBvZiB0aGUgY29ubmVjdGlvbiBhcyB3ZWxsLgotQGMgRklYTUU6IFdobyBrbm93cyB3aGF0IHRoaXMgIm5vIHJldHJ5IGFjdGlvbiIgY3J1ZCBmcm9tIHRoZSBET1MgbWFudWFsIG1heQotQGMgICAgICAgbWVhbj8gIEl0J3Mgb3B0aW9uYWw7IGxlYXZlIGl0IG91dD8gLS0tZG9jQGN5Z251cy5jb20sIDI1ZmViOTEgCi0KLVRvIGdpdmUgY29udHJvbCBvZiB0aGUgUEMgdG8gdGhlIFVuaXggc2lkZSBvZiB0aGUgc2VyaWFsIGxpbmUsIHR5cGUKLXRoZSBmb2xsb3dpbmcgYXQgdGhlIERPUyBjb25zb2xlOgotCi1AZXhhbXBsZQotQzpcPiBDVFRZIGNvbTEKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLShMYXRlciwgaWYgeW91IHdpc2ggdG8gcmV0dXJuIGNvbnRyb2wgdG8gdGhlIERPUyBjb25zb2xlLCB5b3UgY2FuIHVzZQotdGhlIGNvbW1hbmQgQGNvZGV7Q1RUWSBjb259LS0tYnV0IHlvdSBtdXN0IHNlbmQgaXQgb3ZlciB0aGUgZGV2aWNlIHRoYXQKLWhhZCBjb250cm9sLCBpbiBvdXIgZXhhbXBsZSBvdmVyIHRoZSBAZmlsZXtDT00xfSBzZXJpYWwgbGluZSkuCi0KLUZyb20gdGhlIFVuaXggaG9zdCwgdXNlIGEgY29tbXVuaWNhdGlvbnMgcHJvZ3JhbSBzdWNoIGFzIEBjb2Rle3RpcH0gb3IKLUBjb2Rle2N1fSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBQQzsgZm9yIGV4YW1wbGUsCi0KLUBleGFtcGxlCi1jdSAtcyA5NjAwIC1sIC9kZXYvdHR5YQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhlIEBjb2Rle2N1fSBvcHRpb25zIHNob3duIHNwZWNpZnksIHJlc3BlY3RpdmVseSwgdGhlIGxpbmVzcGVlZCBhbmQgdGhlCi1zZXJpYWwgcG9ydCB0byB1c2UuICBJZiB5b3UgdXNlIEBjb2Rle3RpcH0gaW5zdGVhZCwgeW91ciBjb21tYW5kIGxpbmUKLW1heSBsb29rIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0KLUBleGFtcGxlCi10aXAgLTk2MDAgL2Rldi90dHlhCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Zb3VyIHN5c3RlbSBtYXkgcmVxdWlyZSBhIGRpZmZlcmVudCBuYW1lIHdoZXJlIHdlIHNob3cKLUBmaWxley9kZXYvdHR5YX0gYXMgdGhlIGFyZ3VtZW50IHRvIEBjb2Rle3RpcH0uICBUaGUgY29tbXVuaWNhdGlvbnMKLXBhcmFtZXRlcnMsIGluY2x1ZGluZyB3aGljaCBwb3J0IHRvIHVzZSwgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLUBjb2Rle3RpcH0gYXJndW1lbnQgaW4gdGhlIGBgcmVtb3RlJycgZGVzY3JpcHRpb25zIGZpbGUtLS1ub3JtYWxseSB0aGUKLXN5c3RlbSB0YWJsZSBAZmlsZXsvZXRjL3JlbW90ZX0uCi1AYyBGSVhNRTogV2hhdCBpZiBhbnl0aGluZyBuZWVkcyBkb2luZyB0byBtYXRjaCB0aGUgIm4sOCwxLG5vbmUiIHBhcnQgb2YKLUBjIHRoZSBET1Mgc2lkZSdzIGNvbW1zIHNldHVwPyAgY3UgY2FuIHN1cHBvcnQgLW8gKG9kZAotQGMgcGFyaXR5KSwgLWUgKGV2ZW4gcGFyaXR5KS0tLWFwcGFyZW50bHkgbm8gc2V0dGluZ3MgZm9yIG5vIHBhcml0eSBvcgotQGMgZm9yIGNoYXJhY3RlciBzaXplLiAgVGFrZW4gZnJvbSBzdHR5IG1heWJlLi4uPyAgSm9obiBwb2ludHMgb3V0IHRpcAotQGMgY2FuIHNldCB0aGVzZSBhcyBpbnRlcm5hbCB2YXJpYWJsZXMsIGVnIH5zIHBhcml0eT1ub25lOyBtYW4gc3R0eQotQGMgc3VnZ2VzdHMgdGhhdCBpdCAqbWlnaHQqIHdvcmsgdG8gc3R0eSB0aGVzZSBvcHRpb25zIHdpdGggc3RkaW4gb3IKLUBjIHN0ZG91dCByZWRpcmVjdGVkLi4uIC0tLWRvY0BjeWdudXMuY29tLCAyNWZlYjkxCi0KLUBraW5kZXggRUJNT04KLVVzaW5nIHRoZSBAY29kZXt0aXB9IG9yIEBjb2Rle2N1fSBjb25uZWN0aW9uLCBjaGFuZ2UgdGhlIERPUyB3b3JraW5nCi1kaXJlY3RvcnkgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGEgY29weSBvZiB5b3VyIDI5SyBwcm9ncmFtLCB0aGVuCi1zdGFydCB0aGUgUEMgcHJvZ3JhbSBAY29kZXtFQk1PTn0gKGFuIEVCMjlLIGNvbnRyb2wgcHJvZ3JhbSBzdXBwbGllZAotd2l0aCB5b3VyIGJvYXJkIGJ5IEFNRCkuICBZb3Ugc2hvdWxkIHNlZSBhbiBpbml0aWFsIGRpc3BsYXkgZnJvbQotQGNvZGV7RUJNT059IHNpbWlsYXIgdG8gdGhlIG9uZSB0aGF0IGZvbGxvd3MsIGVuZGluZyB3aXRoIHRoZQotQGNvZGV7RUJNT059IHByb21wdCBAc2FtcHsjfS0tLQotCi1AZXhhbXBsZQotQzpcPiBHOgotCi1HOlw+IENEIFx1c3Jcam9lXHdvcmsyOWsKLQotRzpcVVNSXEpPRVxXT1JLMjlLPiBFQk1PTgotQW0yOTAwMCBQQyBDb3Byb2Nlc3NvciBCb2FyZCBNb25pdG9yLCB2ZXJzaW9uIDMuMC0xOAotQ29weXJpZ2h0IDE5OTAgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgotV3JpdHRlbiBieSBHaWJib25zIGFuZCBBc3NvY2lhdGVzLCBJbmMuCi0KLUVudGVyICc/JyBvciAnSCcgZm9yIGhlbHAKLQotUEMgQ29wcm9jZXNzb3IgVHlwZSAgID0gRUIyOUsKLUkvTyBCYXNlICAgICAgICAgICAgICA9IDB4MjA4Ci1NZW1vcnkgQmFzZSAgICAgICAgICAgPSAweGQwMDAwCi0KLURhdGEgTWVtb3J5IFNpemUgICAgICA9IDIwNDhLQgotQXZhaWxhYmxlIEktUkFNIFJhbmdlID0gMHg4MDAwIHRvIDB4MWZmZmZmCi1BdmFpbGFibGUgRC1SQU0gUmFuZ2UgPSAweDgwMDAyMDAwIHRvIDB4ODAxZmZmZmYKLQotUGFnZVNpemUgICAgICAgICAgICAgID0gMHg0MDAKLVJlZ2lzdGVyIFN0YWNrIFNpemUgICA9IDB4ODAwCi1NZW1vcnkgU3RhY2sgU2l6ZSAgICAgPSAweDE4MDAKLQotQ1BVIFBSTCAgICAgICAgICAgICAgID0gMHgzCi1BbTI5MDI3IEF2YWlsYWJsZSAgICAgPSBObwotQnl0ZSBXcml0ZSBBdmFpbGFibGUgID0gWWVzCi0KLSMgfi4KLUBlbmQgZXhhbXBsZQotCi1UaGVuIGV4aXQgdGhlIEBjb2Rle2N1fSBvciBAY29kZXt0aXB9IHByb2dyYW0gKGRvbmUgaW4gdGhlIGV4YW1wbGUgYnkKLXR5cGluZyBAY29kZXt+Ln0gYXQgdGhlIEBjb2Rle0VCTU9OfSBwcm9tcHQpLiAgQGNvZGV7RUJNT059IGtlZXBzCi1ydW5uaW5nLCByZWFkeSBmb3IgQHZhbHVle0dEQk59IHRvIHRha2Ugb3Zlci4KLQotRm9yIHRoaXMgZXhhbXBsZSwgd2UndmUgYXNzdW1lZCB3aGF0IGlzIHByb2JhYmx5IHRoZSBtb3N0IGNvbnZlbmllbnQKLXdheSB0byBtYWtlIHN1cmUgdGhlIHNhbWUgMjlLIHByb2dyYW0gaXMgb24gYm90aCB0aGUgUEMgYW5kIHRoZSBVbml4Ci1zeXN0ZW06IGEgUEMvTkZTIGNvbm5lY3Rpb24gdGhhdCBlc3RhYmxpc2hlcyBgYGRyaXZlIEBjb2Rle0c6fScnIG9uIHRoZQotUEMgYXMgYSBmaWxlIHN5c3RlbSBvbiB0aGUgVW5peCBob3N0LiAgSWYgeW91IGRvIG5vdCBoYXZlIFBDL05GUyBvcgotc29tZXRoaW5nIHNpbWlsYXIgY29ubmVjdGluZyB0aGUgdHdvIHN5c3RlbXMsIHlvdSBtdXN0IGFycmFuZ2Ugc29tZQotb3RoZXIgd2F5LS0tcGVyaGFwcyBmbG9wcHktZGlzayB0cmFuc2Zlci0tLW9mIGdldHRpbmcgdGhlIDI5SyBwcm9ncmFtCi1mcm9tIHRoZSBVbml4IHN5c3RlbSB0byB0aGUgUEM7IEB2YWx1ZXtHREJOfSBkb2VzIEBlbXBoe25vdH0gZG93bmxvYWQgaXQgb3ZlciB0aGUKLXNlcmlhbCBsaW5lLgotCi1Abm9kZSBnZGItRUIyOUsKLUBzdWJzdWJzZWN0aW9uIEVCMjlLIGNyb3NzLWRlYnVnZ2luZwotCi1GaW5hbGx5LCBAY29kZXtjZH0gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGFuIGltYWdlIG9mIHlvdXIgMjlLCi1wcm9ncmFtIG9uIHRoZSBVbml4IHN5c3RlbSwgYW5kIHN0YXJ0IEB2YWx1ZXtHREJOfS0tLXNwZWNpZnlpbmcgYXMgYXJndW1lbnQgdGhlCi1uYW1lIG9mIHlvdXIgMjlLIHByb2dyYW06Ci0KLUBleGFtcGxlCi1jZCAvdXNyL2pvZS93b3JrMjlrCi1AdmFsdWV7R0RCUH0gbXlmb28KLUBlbmQgZXhhbXBsZQotCi1AbmVlZCA1MDAKLU5vdyB5b3UgY2FuIHVzZSB0aGUgQGNvZGV7dGFyZ2V0fSBjb21tYW5kOgotCi1AZXhhbXBsZQotdGFyZ2V0IGFtZC1lYiAvZGV2L3R0eWEgOTYwMCBNWUZPTwotQGMgRklYTUU6IHRlc3QgYWJvdmUgJ3RhcmdldCBhbWQtZWInIGFzIHNwZWxsZWQsIHdpdGggY2FwcyEgIGNhcHMgYXJlIG1lYW50IHRvCi1AYyBlbXBoYXNpemUgdGhhdCB0aGlzIGlzIHRoZSBuYW1lIGFzIHNlZW4gYnkgRE9TIChzaW5jZSBJIHRoaW5rIERPUyBpcwotQGMgc2luZ2xlLW1pbmRlZCBhYm91dCBjYXNlIG9mIGxldHRlcnMpLiAgLS0tZG9jQGN5Z251cy5jb20sIDI1ZmViOTEKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUluIHRoaXMgZXhhbXBsZSwgd2UndmUgYXNzdW1lZCB5b3VyIHByb2dyYW0gaXMgaW4gYSBmaWxlIGNhbGxlZAotQGZpbGV7bXlmb299LiAgTm90ZSB0aGF0IHRoZSBmaWxlbmFtZSBnaXZlbiBhcyB0aGUgbGFzdCBhcmd1bWVudCB0bwotQGNvZGV7dGFyZ2V0IGFtZC1lYn0gc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGFzIGl0IGFwcGVhcnMgdG8gRE9TLgotSW4gb3VyIGV4YW1wbGUgdGhpcyBpcyBzaW1wbHkgQGNvZGV7TVlGT099LCBidXQgaW4gZ2VuZXJhbCBpdCBjYW4gaW5jbHVkZQotYSBET1MgcGF0aCwgYW5kIGRlcGVuZGluZyBvbiB5b3VyIHRyYW5zZmVyIG1lY2hhbmlzbSBtYXkgbm90IHJlc2VtYmxlCi10aGUgbmFtZSBvbiB0aGUgVW5peCBzaWRlLgotCi1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCBhbnkgYnJlYWtwb2ludHMgeW91IHdpc2g7IHdoZW4geW91IGFyZSByZWFkeQotdG8gc2VlIHlvdXIgcHJvZ3JhbSBydW4gb24gdGhlIDI5SyBib2FyZCwgdXNlIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZAotQGNvZGV7cnVufS4KLQotVG8gc3RvcCBkZWJ1Z2dpbmcgdGhlIHJlbW90ZSBwcm9ncmFtLCB1c2UgdGhlIEB2YWx1ZXtHREJOfSBAY29kZXtkZXRhY2h9Ci1jb21tYW5kLgotCi1UbyByZXR1cm4gY29udHJvbCBvZiB0aGUgUEMgdG8gaXRzIGNvbnNvbGUsIHVzZSBAY29kZXt0aXB9IG9yIEBjb2Rle2N1fQotb25jZSBhZ2FpbiwgYWZ0ZXIgeW91ciBAdmFsdWV7R0RCTn0gc2Vzc2lvbiBoYXMgY29uY2x1ZGVkLCB0byBhdHRhY2ggdG8KLUBjb2Rle0VCTU9OfS4gIFlvdSBjYW4gdGhlbiB0eXBlIHRoZSBjb21tYW5kIEBjb2Rle3F9IHRvIHNodXQgZG93bgotQGNvZGV7RUJNT059LCByZXR1cm5pbmcgY29udHJvbCB0byB0aGUgRE9TIGNvbW1hbmQtbGluZSBpbnRlcnByZXRlci4KLVR5cGUgQGNvZGV7Q1RUWSBjb259IHRvIHJldHVybiBjb21tYW5kIGlucHV0IHRvIHRoZSBtYWluIERPUyBjb25zb2xlLAotYW5kIHR5cGUgQGtiZHt+Ln0gdG8gbGVhdmUgQGNvZGV7dGlwfSBvciBAY29kZXtjdX0uCi0KLUBub2RlIFJlbW90ZSBMb2cKLUBzdWJzdWJzZWN0aW9uIFJlbW90ZSBsb2cKLUBraW5kZXggZWIubG9nCi1AY2luZGV4IGxvZyBmaWxlIGZvciBFQjI5SwotCi1UaGUgQGNvZGV7dGFyZ2V0IGFtZC1lYn0gY29tbWFuZCBjcmVhdGVzIGEgZmlsZSBAZmlsZXtlYi5sb2d9IGluIHRoZQotY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgdG8gaGVscCBkZWJ1ZyBwcm9ibGVtcyB3aXRoIHRoZSBjb25uZWN0aW9uLgotQGZpbGV7ZWIubG9nfSByZWNvcmRzIGFsbCB0aGUgb3V0cHV0IGZyb20gQGNvZGV7RUJNT059LCBpbmNsdWRpbmcgZWNob2VzCi1vZiB0aGUgY29tbWFuZHMgc2VudCB0byBpdC4gIFJ1bm5pbmcgQHNhbXB7dGFpbCAtZn0gb24gdGhpcyBmaWxlIGluCi1hbm90aGVyIHdpbmRvdyBvZnRlbiBoZWxwcyB0byB1bmRlcnN0YW5kIHRyb3VibGUgd2l0aCBAY29kZXtFQk1PTn0sIG9yCi11bmV4cGVjdGVkIGV2ZW50cyBvbiB0aGUgUEMgc2lkZSBvZiB0aGUgY29ubmVjdGlvbi4KLQotQG5vZGUgU1QyMDAwIFJlbW90ZQotQHN1YnNlY3Rpb24gQHZhbHVle0dEQk59IHdpdGggYSBUYW5kZW0gU1QyMDAwCi0KLVRvIGNvbm5lY3QgeW91ciBTVDIwMDAgdG8gdGhlIGhvc3Qgc3lzdGVtLCBzZWUgdGhlIG1hbnVmYWN0dXJlcidzCi1tYW51YWwuICBPbmNlIHRoZSBTVDIwMDAgaXMgcGh5c2ljYWxseSBhdHRhY2hlZCwgeW91IGNhbiBydW46Ci0KLUBleGFtcGxlCi10YXJnZXQgc3QyMDAwIEB2YXJ7ZGV2fSBAdmFye3NwZWVkfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotdG8gZXN0YWJsaXNoIGl0IGFzIHlvdXIgZGVidWdnaW5nIGVudmlyb25tZW50LiAgQHZhcntkZXZ9IGlzIG5vcm1hbGx5Ci10aGUgbmFtZSBvZiBhIHNlcmlhbCBkZXZpY2UsIHN1Y2ggYXMgQGZpbGV7L2Rldi90dHlhfSwgY29ubmVjdGVkIHRvIHRoZQotU1QyMDAwIHZpYSBhIHNlcmlhbCBsaW5lLiAgWW91IGNhbiBpbnN0ZWFkIHNwZWNpZnkgQHZhcntkZXZ9IGFzIGEgVENQCi1jb25uZWN0aW9uIChmb3IgZXhhbXBsZSwgdG8gYSBzZXJpYWwgbGluZSBhdHRhY2hlZCB2aWEgYSB0ZXJtaW5hbAotY29uY2VudHJhdG9yKSB1c2luZyB0aGUgc3ludGF4IEBjb2Rle0B2YXJ7aG9zdG5hbWV9OkB2YXJ7cG9ydG51bWJlcn19LgotCi1UaGUgQGNvZGV7bG9hZH0gYW5kIEBjb2Rle2F0dGFjaH0gY29tbWFuZHMgYXJlIEBlbXBoe25vdH0gZGVmaW5lZCBmb3IKLXRoaXMgdGFyZ2V0OyB5b3UgbXVzdCBsb2FkIHlvdXIgcHJvZ3JhbSBpbnRvIHRoZSBTVDIwMDAgYXMgeW91IG5vcm1hbGx5Ci13b3VsZCBmb3Igc3RhbmRhbG9uZSBvcGVyYXRpb24uICBAdmFsdWV7R0RCTn0gcmVhZHMgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0oc3VjaCBhcyBzeW1ib2xzKSBmcm9tIGEgc2VwYXJhdGUsIGRlYnVnZ2luZyB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtCi1hdmFpbGFibGUgb24geW91ciBob3N0IGNvbXB1dGVyLgotQGMgRklYTUUhISBUaGlzIGlzIHRlcnJpYmx5IHZhZ3VlOyB3aGF0IGxpdHRsZSBjb250ZW50IGlzIGhlcmUgaXMKLUBjIGJhc2ljYWxseSBoZWFyc2F5LgotCi1AY2luZGV4IFNUMjAwMCBhdXhpbGlhcnkgY29tbWFuZHMKLVRoZXNlIGF1eGlsaWFyeSBAdmFsdWV7R0RCTn0gY29tbWFuZHMgYXJlIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIHRoZSBTVDIwMDAKLWVudmlyb25tZW50OgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHN0MjAwMCBAdmFye2NvbW1hbmR9Ci1Aa2luZGV4IHN0MjAwMCBAdmFye2NtZH0KLUBjaW5kZXggU1REQlVHIGNvbW1hbmRzIChTVDIwMDApCi1AY2luZGV4IGNvbW1hbmRzIHRvIFNUREJVRyAoU1QyMDAwKQotU2VuZCBhIEB2YXJ7Y29tbWFuZH0gdG8gdGhlIFNUREJVRyBtb25pdG9yLiAgU2VlIHRoZSBtYW51ZmFjdHVyZXIncwotbWFudWFsIGZvciBhdmFpbGFibGUgY29tbWFuZHMuCi0KLUBpdGVtIGNvbm5lY3QKLUBjaW5kZXggY29ubmVjdCAodG8gU1REQlVHKQotQ29ubmVjdCB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgdG8gdGhlIFNUREJVRyBjb21tYW5kIG1vbml0b3IuICBXaGVuCi15b3UgYXJlIGRvbmUgaW50ZXJhY3Rpbmcgd2l0aCBTVERCVUcsIHR5cGluZyBlaXRoZXIgb2YgdHdvIGNoYXJhY3Rlcgotc2VxdWVuY2VzIGdldHMgeW91IGJhY2sgdG8gdGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kIHByb21wdDoKLUBrYmR7QGtleXtSRVR9fi59IChSZXR1cm4sIGZvbGxvd2VkIGJ5IHRpbGRlIGFuZCBwZXJpb2QpIG9yCi1Aa2Jke0BrZXl7UkVUfX5Aa2V5e0MtZH19IChSZXR1cm4sIGZvbGxvd2VkIGJ5IHRpbGRlIGFuZCBjb250cm9sLUQpLgotQGVuZCB0YWJsZQotCi1Abm9kZSBWeFdvcmtzIFJlbW90ZQotQHN1YnNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCBWeFdvcmtzCi0KLUBjaW5kZXggVnhXb3JrcwotCi1AdmFsdWV7R0RCTn0gZW5hYmxlcyBkZXZlbG9wZXJzIHRvIHNwYXduIGFuZCBkZWJ1ZyB0YXNrcyBydW5uaW5nIG9uIG5ldHdvcmtlZAotVnhXb3JrcyB0YXJnZXRzIGZyb20gYSBVbml4IGhvc3QuICBBbHJlYWR5LXJ1bm5pbmcgdGFza3Mgc3Bhd25lZCBmcm9tCi10aGUgVnhXb3JrcyBzaGVsbCBjYW4gYWxzbyBiZSBkZWJ1Z2dlZC4gIEB2YWx1ZXtHREJOfSB1c2VzIGNvZGUgdGhhdCBydW5zIG9uCi1ib3RoIHRoZSBVbml4IGhvc3QgYW5kIG9uIHRoZSBWeFdvcmtzIHRhcmdldC4gIFRoZSBwcm9ncmFtCi1AY29kZXtnZGJ9IGlzIGluc3RhbGxlZCBhbmQgZXhlY3V0ZWQgb24gdGhlIFVuaXggaG9zdC4gIChJdCBtYXkgYmUKLWluc3RhbGxlZCB3aXRoIHRoZSBuYW1lIEBjb2Rle3Z4Z2RifSwgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhCi1AdmFsdWV7R0RCTn0gZm9yIGRlYnVnZ2luZyBwcm9ncmFtcyBvbiB0aGUgaG9zdCBpdHNlbGYuKQotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFZ4V29ya3MtdGltZW91dCBAdmFye2FyZ3N9Ci1Aa2luZGV4IHZ4d29ya3MtdGltZW91dAotQWxsIFZ4V29ya3MtYmFzZWQgdGFyZ2V0cyBub3cgc3VwcG9ydCB0aGUgb3B0aW9uIEBjb2Rle3Z4d29ya3MtdGltZW91dH0uICAKLVRoaXMgb3B0aW9uIGlzIHNldCBieSB0aGUgdXNlciwgYW5kICBAdmFye2FyZ3N9IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiAKLXNlY29uZHMgQHZhbHVle0dEQk59IHdhaXRzIGZvciByZXNwb25zZXMgdG8gcnBjJ3MuICBZb3UgbWlnaHQgdXNlIHRoaXMgaWYgCi15b3VyIFZ4V29ya3MgdGFyZ2V0IGlzIGEgc2xvdyBzb2Z0d2FyZSBzaW11bGF0b3Igb3IgaXMgb24gdGhlIGZhciBzaWRlIAotb2YgYSB0aGluIG5ldHdvcmsgbGluZS4KLUBlbmQgdGFibGUKLQotVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBvbiBjb25uZWN0aW5nIHRvIFZ4V29ya3Mgd2FzIGN1cnJlbnQgd2hlbgotdGhpcyBtYW51YWwgd2FzIHByb2R1Y2VkOyBuZXdlciByZWxlYXNlcyBvZiBWeFdvcmtzIG1heSB1c2UgcmV2aXNlZAotcHJvY2VkdXJlcy4KLQotQGtpbmRleCBJTkNMVURFX1JEQgotVG8gdXNlIEB2YWx1ZXtHREJOfSB3aXRoIFZ4V29ya3MsIHlvdSBtdXN0IHJlYnVpbGQgeW91ciBWeFdvcmtzIGtlcm5lbAotdG8gaW5jbHVkZSB0aGUgcmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2Ugcm91dGluZXMgaW4gdGhlIFZ4V29ya3MKLWxpYnJhcnkgQGZpbGV7cmRiLmF9LiAgVG8gZG8gdGhpcywgZGVmaW5lIEBjb2Rle0lOQ0xVREVfUkRCfSBpbiB0aGUKLVZ4V29ya3MgY29uZmlndXJhdGlvbiBmaWxlIEBmaWxle2NvbmZpZ0FsbC5ofSBhbmQgcmVidWlsZCB5b3VyIFZ4V29ya3MKLWtlcm5lbC4gIFRoZSByZXN1bHRpbmcga2VybmVsIGNvbnRhaW5zIEBmaWxle3JkYi5hfSwgYW5kIHNwYXducyB0aGUKLXNvdXJjZSBkZWJ1Z2dpbmcgdGFzayBAY29kZXt0UmRiVGFza30gd2hlbiBWeFdvcmtzIGlzIGJvb3RlZC4gIEZvciBtb3JlCi1pbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyBhbmQgcmVtYWtpbmcgVnhXb3Jrcywgc2VlIHRoZSBtYW51ZmFjdHVyZXIncwotbWFudWFsLgotQGMgVnhXb3Jrcywgc2VlIHRoZSBAY2l0ZXtWeFdvcmtzIFByb2dyYW1tZXIncyBHdWlkZX0uCi0KLU9uY2UgeW91IGhhdmUgaW5jbHVkZWQgQGZpbGV7cmRiLmF9IGluIHlvdXIgVnhXb3JrcyBzeXN0ZW0gaW1hZ2UgYW5kIHNldAoteW91ciBVbml4IGV4ZWN1dGlvbiBzZWFyY2ggcGF0aCB0byBmaW5kIEB2YWx1ZXtHREJOfSwgeW91IGFyZSByZWFkeSB0bwotcnVuIEB2YWx1ZXtHREJOfS4gIEZyb20geW91ciBVbml4IGhvc3QsIHJ1biBAY29kZXtnZGJ9IChvciBAY29kZXt2eGdkYn0sCi1kZXBlbmRpbmcgb24geW91ciBpbnN0YWxsYXRpb24pLgotCi1AdmFsdWV7R0RCTn0gY29tZXMgdXAgc2hvd2luZyB0aGUgcHJvbXB0OgotCi1AZXhhbXBsZQotKHZ4Z2RiKQotQGVuZCBleGFtcGxlCi0KLUBtZW51Ci0qIFZ4V29ya3MgQ29ubmVjdGlvbjo6ICAgICAgICAgIENvbm5lY3RpbmcgdG8gVnhXb3JrcwotKiBWeFdvcmtzIERvd25sb2FkOjogICAgICAgICAgICBWeFdvcmtzIGRvd25sb2FkCi0qIFZ4V29ya3MgQXR0YWNoOjogICAgICAgICAgICAgIFJ1bm5pbmcgdGFza3MKLUBlbmQgbWVudQotCi1Abm9kZSBWeFdvcmtzIENvbm5lY3Rpb24KLUBzdWJzdWJzZWN0aW9uIENvbm5lY3RpbmcgdG8gVnhXb3JrcwotCi1UaGUgQHZhbHVle0dEQk59IGNvbW1hbmQgQGNvZGV7dGFyZ2V0fSBsZXRzIHlvdSBjb25uZWN0IHRvIGEgVnhXb3JrcyB0YXJnZXQgb24gdGhlCi1uZXR3b3JrLiAgVG8gY29ubmVjdCB0byBhIHRhcmdldCB3aG9zZSBob3N0IG5hbWUgaXMgYGBAY29kZXt0dH0nJywgdHlwZToKLQotQGV4YW1wbGUKLSh2eGdkYikgdGFyZ2V0IHZ4d29ya3MgdHQKLUBlbmQgZXhhbXBsZQotCi1AbmVlZCA3NTAKLUB2YWx1ZXtHREJOfSBkaXNwbGF5cyBtZXNzYWdlcyBsaWtlIHRoZXNlOgotCi1Ac21hbGxleGFtcGxlCi1BdHRhY2hpbmcgcmVtb3RlIG1hY2hpbmUgYWNyb3NzIG5ldC4uLiAKLUNvbm5lY3RlZCB0byB0dC4KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBuZWVkIDEwMDAKLUB2YWx1ZXtHREJOfSB0aGVuIGF0dGVtcHRzIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZXMgb2YgYW55IG9iamVjdCBtb2R1bGVzCi1sb2FkZWQgaW50byB0aGUgVnhXb3JrcyB0YXJnZXQgc2luY2UgaXQgd2FzIGxhc3QgYm9vdGVkLiAgQHZhbHVle0dEQk59IGxvY2F0ZXMKLXRoZXNlIGZpbGVzIGJ5IHNlYXJjaGluZyB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluIHRoZSBjb21tYW5kIHNlYXJjaAotcGF0aCAoQHB4cmVme0Vudmlyb25tZW50LCAsWW91ciBwcm9ncmFtJ3MgZW52aXJvbm1lbnR9KTsgaWYgaXQgZmFpbHMKLXRvIGZpbmQgYW4gb2JqZWN0IGZpbGUsIGl0IGRpc3BsYXlzIGEgbWVzc2FnZSBzdWNoIGFzOgotCi1AZXhhbXBsZQotcHJvZy5vOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5LgotQGVuZCBleGFtcGxlCi0KLVdoZW4gdGhpcyBoYXBwZW5zLCBhZGQgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSB0byB0aGUgc2VhcmNoIHBhdGggd2l0aAotdGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kIEBjb2Rle3BhdGh9LCBhbmQgZXhlY3V0ZSB0aGUgQGNvZGV7dGFyZ2V0fQotY29tbWFuZCBhZ2Fpbi4KLQotQG5vZGUgVnhXb3JrcyBEb3dubG9hZAotQHN1YnN1YnNlY3Rpb24gVnhXb3JrcyBkb3dubG9hZAotCi1AY2luZGV4IGRvd25sb2FkIHRvIFZ4V29ya3MKLUlmIHlvdSBoYXZlIGNvbm5lY3RlZCB0byB0aGUgVnhXb3JrcyB0YXJnZXQgYW5kIHlvdSB3YW50IHRvIGRlYnVnIGFuCi1vYmplY3QgdGhhdCBoYXMgbm90IHlldCBiZWVuIGxvYWRlZCwgeW91IGNhbiB1c2UgdGhlIEB2YWx1ZXtHREJOfQotQGNvZGV7bG9hZH0gY29tbWFuZCB0byBkb3dubG9hZCBhIGZpbGUgZnJvbSBVbml4IHRvIFZ4V29ya3MKLWluY3JlbWVudGFsbHkuICBUaGUgb2JqZWN0IGZpbGUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIEBjb2Rle2xvYWR9Ci1jb21tYW5kIGlzIGFjdHVhbGx5IG9wZW5lZCB0d2ljZTogZmlyc3QgYnkgdGhlIFZ4V29ya3MgdGFyZ2V0IGluIG9yZGVyCi10byBkb3dubG9hZCB0aGUgY29kZSwgdGhlbiBieSBAdmFsdWV7R0RCTn0gaW4gb3JkZXIgdG8gcmVhZCB0aGUgc3ltYm9sCi10YWJsZS4gIFRoaXMgY2FuIGxlYWQgdG8gcHJvYmxlbXMgaWYgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcmllcyBvbgotdGhlIHR3byBzeXN0ZW1zIGRpZmZlci4gIElmIGJvdGggc3lzdGVtcyBoYXZlIE5GUyBtb3VudGVkIHRoZSBzYW1lCi1maWxlc3lzdGVtcywgeW91IGNhbiBhdm9pZCB0aGVzZSBwcm9ibGVtcyBieSB1c2luZyBhYnNvbHV0ZSBwYXRocy4KLU90aGVyd2lzZSwgaXQgaXMgc2ltcGxlc3QgdG8gc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvbiBib3RoIHN5c3RlbXMKLXRvIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIG9iamVjdCBmaWxlIHJlc2lkZXMsIGFuZCB0aGVuIHRvIHJlZmVyZW5jZQotdGhlIGZpbGUgYnkgaXRzIG5hbWUsIHdpdGhvdXQgYW55IHBhdGguICBGb3IgaW5zdGFuY2UsIGEgcHJvZ3JhbQotQGZpbGV7cHJvZy5vfSBtYXkgcmVzaWRlIGluIEBmaWxle0B2YXJ7dnhwYXRofS92dy9kZW1vL3JkYn0gaW4gVnhXb3JrcwotYW5kIGluIEBmaWxle0B2YXJ7aG9zdHBhdGh9L3Z3L2RlbW8vcmRifSBvbiB0aGUgaG9zdC4gIFRvIGxvYWQgdGhpcwotcHJvZ3JhbSwgdHlwZSB0aGlzIG9uIFZ4V29ya3M6Ci0KLUBleGFtcGxlCi0tPiBjZCAiQHZhcnt2eHBhdGh9L3Z3L2RlbW8vcmRiIgotQGVuZCBleGFtcGxlCi12Ci1UaGVuLCBpbiBAdmFsdWV7R0RCTn0sIHR5cGU6Ci0KLUBleGFtcGxlCi0odnhnZGIpIGNkIEB2YXJ7aG9zdHBhdGh9L3Z3L2RlbW8vcmRiIAotKHZ4Z2RiKSBsb2FkIHByb2cubwotQGVuZCBleGFtcGxlCi0KLUB2YWx1ZXtHREJOfSBkaXNwbGF5cyBhIHJlc3BvbnNlIHNpbWlsYXIgdG8gdGhpczoKLQotQHNtYWxsZXhhbXBsZQotUmVhZGluZyBzeW1ib2wgZGF0YSBmcm9tIHdoZXJldmVyL3Z3L2RlbW8vcmRiL3Byb2cuby4uLiBkb25lLgotQGVuZCBzbWFsbGV4YW1wbGUKLQotWW91IGNhbiBhbHNvIHVzZSB0aGUgQGNvZGV7bG9hZH0gY29tbWFuZCB0byByZWxvYWQgYW4gb2JqZWN0IG1vZHVsZQotYWZ0ZXIgZWRpdGluZyBhbmQgcmVjb21waWxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGUuICBOb3RlIHRoYXQKLXRoaXMgbWFrZXMgQHZhbHVle0dEQk59IGRlbGV0ZSBhbGwgY3VycmVudGx5LWRlZmluZWQgYnJlYWtwb2ludHMsCi1hdXRvLWRpc3BsYXlzLCBhbmQgY29udmVuaWVuY2UgdmFyaWFibGVzLCBhbmQgdG8gY2xlYXIgdGhlIHZhbHVlCi1oaXN0b3J5LiAgKFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBpbnRlZ3JpdHkgb2YKLWRlYnVnZ2VyIGRhdGEgc3RydWN0dXJlcyB0aGF0IHJlZmVyZW5jZSB0aGUgdGFyZ2V0IHN5c3RlbSdzIHN5bWJvbAotdGFibGUuKQotCi1Abm9kZSBWeFdvcmtzIEF0dGFjaAotQHN1YnN1YnNlY3Rpb24gUnVubmluZyB0YXNrcwotCi1AY2luZGV4IHJ1bm5pbmcgVnhXb3JrcyB0YXNrcwotWW91IGNhbiBhbHNvIGF0dGFjaCB0byBhbiBleGlzdGluZyB0YXNrIHVzaW5nIHRoZSBAY29kZXthdHRhY2h9IGNvbW1hbmQgYXMKLWZvbGxvd3M6Ci0KLUBleGFtcGxlCi0odnhnZGIpIGF0dGFjaCBAdmFye3Rhc2t9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBAdmFye3Rhc2t9IGlzIHRoZSBWeFdvcmtzIGhleGFkZWNpbWFsIHRhc2sgSUQuICBUaGUgdGFzayBjYW4gYmUgcnVubmluZwotb3Igc3VzcGVuZGVkIHdoZW4geW91IGF0dGFjaCB0byBpdC4gIFJ1bm5pbmcgdGFza3MgYXJlIHN1c3BlbmRlZCBhdAotdGhlIHRpbWUgb2YgYXR0YWNobWVudC4KLQotQG5vZGUgU3BhcmNsZXQgUmVtb3RlCi1Ac3Vic2VjdGlvbiBAdmFsdWV7R0RCTn0gYW5kIFNwYXJjbGV0Ci1AY2luZGV4IFNwYXJjbGV0Ci0KLUB2YWx1ZXtHREJOfSBlbmFibGVzIGRldmVsb3BlcnMgdG8gZGVidWcgdGFza3MgcnVubmluZyBvbiAKLVNwYXJjbGV0IHRhcmdldHMgZnJvbSBhIFVuaXggaG9zdC4gIAotQHZhbHVle0dEQk59IHVzZXMgY29kZSB0aGF0IHJ1bnMgb24KLWJvdGggdGhlIFVuaXggaG9zdCBhbmQgb24gdGhlIFNwYXJjbGV0IHRhcmdldC4gIFRoZSBwcm9ncmFtCi1AY29kZXtnZGJ9IGlzIGluc3RhbGxlZCBhbmQgZXhlY3V0ZWQgb24gdGhlIFVuaXggaG9zdC4gIAotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHRpbWVvdXQgQHZhcnthcmdzfQotQGtpbmRleCByZW1vdGV0aW1lb3V0Ci1AdmFsdWV7R0RCTn0gbm93IHN1cHBvcnRzIHRoZSBvcHRpb24gQGNvZGV7cmVtb3RldGltZW91dH0uICAKLVRoaXMgb3B0aW9uIGlzIHNldCBieSB0aGUgdXNlciwgYW5kICBAdmFye2FyZ3N9IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiAKLXNlY29uZHMgQHZhbHVle0dEQk59IHdhaXRzIGZvciByZXNwb25zZXMuICAKLUBlbmQgdGFibGUKLQotQGtpbmRleCBDb21waWxpbmcKLVdoZW4gY29tcGlsaW5nIGZvciBkZWJ1Z2dpbmcsIGluY2x1ZGUgdGhlIG9wdGlvbnMgIi1nIiB0byBnZXQgZGVidWcgCi1pbmZvcm1hdGlvbiBhbmQgIi1UdGV4dCIgdG8gcmVsb2NhdGUgdGhlIHByb2dyYW0gdG8gd2hlcmUgeW91IHdpc2ggdG8KLWxvYWQgaXQgb24gdGhlIHRhcmdldC4gIFlvdSBtYXkgYWxzbyB3YW50IHRvIGFkZCB0aGUgb3B0aW9ucyAiLW4iIG9yIAotIi1OIiBpbiBvcmRlciB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb25zLgotCi1AZXhhbXBsZQotc3BhcmNsZXQtYW91dC1nY2MgcHJvZy5jIC1UdGV4dCAweDEyMDEwMDAwIC1nIC1vIHByb2cgLU4KLUBlbmQgZXhhbXBsZQotCi1Zb3UgY2FuIHVzZSBvYmpkdW1wIHRvIHZlcmlmeSB0aGF0IHRoZSBhZGRyZXNzZXMgYXJlIHdoYXQgeW91IGludGVuZGVkLgotCi1AZXhhbXBsZQotc3BhcmNsZXQtYW91dC1vYmpkdW1wIC0taGVhZGVycyAtLXN5bXMgcHJvZwotQGVuZCBleGFtcGxlCi0KLUBraW5kZXggUnVubmluZwotT25jZSB5b3UgaGF2ZSBzZXQKLXlvdXIgVW5peCBleGVjdXRpb24gc2VhcmNoIHBhdGggdG8gZmluZCBAdmFsdWV7R0RCTn0sIHlvdSBhcmUgcmVhZHkgdG8KLXJ1biBAdmFsdWV7R0RCTn0uICBGcm9tIHlvdXIgVW5peCBob3N0LCBydW4gQGNvZGV7Z2RifSAKLShvciBAY29kZXtzcGFyY2xldC1hb3V0LWdkYn0sIGRlcGVuZGluZyBvbiB5b3VyIGluc3RhbGxhdGlvbikuCi0KLUB2YWx1ZXtHREJOfSBjb21lcyB1cCBzaG93aW5nIHRoZSBwcm9tcHQ6Ci0KLUBleGFtcGxlCi0oZ2Ric2xldCkKLUBlbmQgZXhhbXBsZQotCi1AbWVudQotKiBTcGFyY2xldCBGaWxlOjogICAgICAgICAgICAgICAgU2V0dGluZyB0aGUgZmlsZSB0byBkZWJ1ZwotKiBTcGFyY2xldCBDb25uZWN0aW9uOjogICAgICAgICAgQ29ubmVjdGluZyB0byBTcGFyY2xldAotKiBTcGFyY2xldCBEb3dubG9hZDo6ICAgICAgICAgICAgU3BhcmNsZXQgZG93bmxvYWQKLSogU3BhcmNsZXQgRXhlY3V0aW9uOjogICAgICAgICAgIFJ1bm5pbmcgYW5kIGRlYnVnZ2luZyAKLUBlbmQgbWVudQotCi1Abm9kZSBTcGFyY2xldCBGaWxlCi1Ac3Vic3Vic2VjdGlvbiBTZXR0aW5nIGZpbGUgdG8gZGVidWcKLQotVGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kIEBjb2Rle2ZpbGV9IGxldHMgeW91IGNob29zZSB3aXRoIHByb2dyYW0gdG8gZGVidWcuCi0KLUBleGFtcGxlCi0oZ2Ric2xldCkgZmlsZSBwcm9nCi1AZW5kIGV4YW1wbGUKLQotQG5lZWQgMTAwMAotQHZhbHVle0dEQk59IHRoZW4gYXR0ZW1wdHMgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlIG9mIEBmaWxle3Byb2d9LgotQHZhbHVle0dEQk59IGxvY2F0ZXMKLXRoZSBmaWxlIGJ5IHNlYXJjaGluZyB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluIHRoZSBjb21tYW5kIHNlYXJjaAotcGF0aC4KLUlmIHRoZSBmaWxlIHdhcyBjb21waWxlZCB3aXRoIGRlYnVnIGluZm9ybWF0aW9uIChvcHRpb24gIi1nIiksIHNvdXJjZQotZmlsZXMgd2lsbCBiZSBzZWFyY2hlZCBhcyB3ZWxsLgotQHZhbHVle0dEQk59IGxvY2F0ZXMKLXRoZSBzb3VyY2UgZmlsZXMgYnkgc2VhcmNoaW5nIHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gdGhlIGRpcmVjdG9yeSBzZWFyY2gKLXBhdGggKEBweHJlZntFbnZpcm9ubWVudCwgLFlvdXIgcHJvZ3JhbSdzIGVudmlyb25tZW50fSkuCi1JZiBpdCBmYWlscwotdG8gZmluZCBhIGZpbGUsIGl0IGRpc3BsYXlzIGEgbWVzc2FnZSBzdWNoIGFzOgotCi1AZXhhbXBsZQotcHJvZzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeS4KLUBlbmQgZXhhbXBsZQotCi1XaGVuIHRoaXMgaGFwcGVucywgYWRkIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcmllcyB0byB0aGUgc2VhcmNoIHBhdGhzIHdpdGgKLXRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZHMgQGNvZGV7cGF0aH0gYW5kIEBjb2Rle2Rpcn0sIGFuZCBleGVjdXRlIHRoZSAKLUBjb2Rle3RhcmdldH0gY29tbWFuZCBhZ2Fpbi4KLQotQG5vZGUgU3BhcmNsZXQgQ29ubmVjdGlvbgotQHN1YnN1YnNlY3Rpb24gQ29ubmVjdGluZyB0byBTcGFyY2xldAotCi1UaGUgQHZhbHVle0dEQk59IGNvbW1hbmQgQGNvZGV7dGFyZ2V0fSBsZXRzIHlvdSBjb25uZWN0IHRvIGEgU3BhcmNsZXQgdGFyZ2V0LgotVG8gY29ubmVjdCB0byBhIHRhcmdldCBvbiBzZXJpYWwgcG9ydCBgYEBjb2Rle3R0eWF9JycsIHR5cGU6Ci0KLUBleGFtcGxlCi0oZ2Ric2xldCkgdGFyZ2V0IHNwYXJjbGV0IC9kZXYvdHR5YQotUmVtb3RlIHRhcmdldCBzcGFyY2xldCBjb25uZWN0ZWQgdG8gL2Rldi90dHlhCi1tYWluICgpIGF0IC4uL3Byb2cuYzozIAotQGVuZCBleGFtcGxlCi0KLUBuZWVkIDc1MAotQHZhbHVle0dEQk59IGRpc3BsYXlzIG1lc3NhZ2VzIGxpa2UgdGhlc2U6Ci0KLUBzbWFsbGV4YW1wbGUKLUNvbm5lY3RlZCB0byB0dHlhLgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgU3BhcmNsZXQgRG93bmxvYWQKLUBzdWJzdWJzZWN0aW9uIFNwYXJjbGV0IGRvd25sb2FkCi0KLUBjaW5kZXggZG93bmxvYWQgdG8gU3BhcmNsZXQKLU9uY2UgY29ubmVjdGVkIHRvIHRoZSBTcGFyY2xldCB0YXJnZXQsIAoteW91IGNhbiB1c2UgdGhlIEB2YWx1ZXtHREJOfQotQGNvZGV7bG9hZH0gY29tbWFuZCB0byBkb3dubG9hZCB0aGUgZmlsZSBmcm9tIHRoZSBob3N0IHRvIHRoZSB0YXJnZXQuCi1UaGUgZmlsZSBuYW1lIGFuZCBsb2FkIG9mZnNldCBzaG91bGQgYmUgZ2l2ZW4gYXMgYXJndW1lbnRzIHRvIHRoZSBAY29kZXtsb2FkfQotY29tbWFuZC4KLVNpbmNlIHRoZSBmaWxlIGZvcm1hdCBpcyBhb3V0LCB0aGUgcHJvZ3JhbSBtdXN0IGJlIGxvYWRlZCB0byB0aGUgc3RhcnRpbmcgCi1hZGRyZXNzLiAgWW91IGNhbiB1c2Ugb2JqZHVtcCB0byBmaW5kIG91dCB3aGF0IHRoaXMgdmFsdWUgaXMuICBUaGUgbG9hZAotb2Zmc2V0IGlzIGFuIG9mZnNldCB3aGljaCBpcyBhZGRlZCB0byB0aGUgVk1BICh2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzKQotb2YgZWFjaCBvZiB0aGUgZmlsZSdzIHNlY3Rpb25zLgotRm9yIGluc3RhbmNlLCBpZiB0aGUgcHJvZ3JhbQotQGZpbGV7cHJvZ30gd2FzIGxpbmtlZCB0byB0ZXh0IGFkZHJlc3MgMHgxMjAxMDAwLCB3aXRoIGRhdGEgYXQgMHgxMjAxMDE2MAotYW5kIGJzcyBhdCAweDEyMDEwMTcwLCBpbiBAdmFsdWV7R0RCTn0sIHR5cGU6Ci0KLUBleGFtcGxlCi0oZ2Ric2xldCkgbG9hZCBwcm9nIDB4MTIwMTAwMDAKLUxvYWRpbmcgc2VjdGlvbiAudGV4dCwgc2l6ZSAweGRiMCB2bWEgMHgxMjAxMDAwMAotQGVuZCBleGFtcGxlCi0KLUlmIHRoZSBjb2RlIGlzIGxvYWRlZCBhdCBhIGRpZmZlcmVudCBhZGRyZXNzIHRoZW4gd2hhdCB0aGUgcHJvZ3JhbSB3YXMgbGlua2VkIAotdG8sIHlvdSBtYXkgbmVlZCB0byB1c2UgdGhlIEBjb2Rle3NlY3Rpb259IGFuZCBAY29kZXthZGQtc3ltYm9sLWZpbGV9IGNvbW1hbmRzIAotdG8gdGVsbCBAdmFsdWV7R0RCTn0gd2hlcmUgdG8gbWFwIHRoZSBzeW1ib2wgdGFibGUuCi0KLUBub2RlIFNwYXJjbGV0IEV4ZWN1dGlvbgotQHN1YnN1YnNlY3Rpb24gUnVubmluZyBhbmQgZGVidWdnaW5nCi0KLUBjaW5kZXggcnVubmluZyBhbmQgZGVidWdnaW5nIFNwYXJjbGV0IHByb2dyYW1zCi1Zb3UgY2FuIG5vdyBiZWdpbiBkZWJ1Z2dpbmcgdGhlIHRhc2sgdXNpbmcgQHZhbHVle0dEQk59J3MgZXhlY3V0aW9uIGNvbnRyb2wKLWNvbW1hbmRzLCBAY29kZXtifSwgQGNvZGV7c3RlcH0sIEBjb2Rle3J1bn0sIGV0Yy4gIFNlZSB0aGUgQHZhbHVle0dEQk59IAotbWFudWFsIGZvciB0aGUgbGlzdCBvZiBjb21tYW5kcy4KLQotQGV4YW1wbGUKLShnZGJzbGV0KSBiIG1haW4KLUJyZWFrcG9pbnQgMSBhdCAweDEyMDEwMDAwOiBmaWxlIHByb2cuYywgbGluZSAzLgotKGdkYnNsZXQpIHJ1biAKLVN0YXJ0aW5nIHByb2dyYW06IHByb2cKLUJyZWFrcG9pbnQgMSwgbWFpbiAoYXJnYz0xLCBhcmd2PTB4ZWZmZmYyMWMpIGF0IHByb2cuYzozCi0zICAgICAgICBjaGFyICpzeW1hcmcgPSAwOwotKGdkYnNsZXQpIHN0ZXAKLTQgICAgICAgIGNoYXIgKmV4ZWNhcmcgPSAiaGVsbG8hIjsKLShnZGJzbGV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotQGVuZCBleGFtcGxlCi0KLUBub2RlIEhpdGFjaGkgUmVtb3RlCi1Ac3Vic2VjdGlvbiBAdmFsdWV7R0RCTn0gYW5kIEhpdGFjaGkgbWljcm9wcm9jZXNzb3JzCi1AdmFsdWV7R0RCTn0gbmVlZHMgdG8ga25vdyB0aGVzZSB0aGluZ3MgdG8gdGFsayB0byB5b3VyCi1IaXRhY2hpIFNILCBIOC8zMDAsIG9yIEg4LzUwMDogCi0KLUBlbnVtZXJhdGUKLUBpdGVtCi10aGF0IHlvdSB3YW50IHRvIHVzZSBAc2FtcHt0YXJnZXQgaG1zfSwgdGhlIHJlbW90ZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlCi1mb3IgSGl0YWNoaSBtaWNyb3Byb2Nlc3NvcnMsIG9yIEBzYW1we3RhcmdldCBlNzAwMH0sIHRoZSBpbi1jaXJjdWl0Ci1lbXVsYXRvciBmb3IgdGhlIEhpdGFjaGkgU0ggYW5kIHRoZSBIaXRhY2hpIDMwMEguICAoQHNhbXB7dGFyZ2V0IGhtc30gaXMKLXRoZSBkZWZhdWx0IHdoZW4gR0RCIGlzIGNvbmZpZ3VyZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgSGl0YWNoaSBTSCwKLUg4LzMwMCwgb3IgSDgvNTAwLikKLQotQGl0ZW0KLXdoYXQgc2VyaWFsIGRldmljZSBjb25uZWN0cyB5b3VyIGhvc3QgdG8geW91ciBIaXRhY2hpIGJvYXJkICh0aGUgZmlyc3QKLXNlcmlhbCBkZXZpY2UgYXZhaWxhYmxlIG9uIHlvdXIgaG9zdCBpcyB0aGUgZGVmYXVsdCkuCi0KLUBpdGVtCi13aGF0IHNwZWVkIHRvIHVzZSBvdmVyIHRoZSBzZXJpYWwgZGV2aWNlLgotQGVuZCBlbnVtZXJhdGUKLQotQG1lbnUKLSogSGl0YWNoaSBCb2FyZHM6OiAgICAgIENvbm5lY3RpbmcgdG8gSGl0YWNoaSBib2FyZHMuCi0qIEhpdGFjaGkgSUNFOjogICAgICAgICBVc2luZyB0aGUgRTcwMDAgSW4tQ2lyY3VpdCBFbXVsYXRvci4KLSogSGl0YWNoaSBTcGVjaWFsOjogICAgIFNwZWNpYWwgQHZhbHVle0dEQk59IGNvbW1hbmRzIGZvciBIaXRhY2hpIG1pY3Jvcy4KLUBlbmQgbWVudQotCi1Abm9kZSBIaXRhY2hpIEJvYXJkcwotQHN1YnN1YnNlY3Rpb24gQ29ubmVjdGluZyB0byBIaXRhY2hpIGJvYXJkcwotCi1AYyBvbmx5IGZvciBVbml4IGhvc3RzCi1Aa2luZGV4IGRldmljZQotQGNpbmRleCBzZXJpYWwgZGV2aWNlLCBIaXRhY2hpIG1pY3JvcwotVXNlIHRoZSBzcGVjaWFsIEBjb2Rle0B2YWx1ZXtHREJQfX0gY29tbWFuZCBAc2FtcHtkZXZpY2UgQHZhcntwb3J0fX0gaWYgeW91Ci1uZWVkIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSBzZXJpYWwgZGV2aWNlLiAgVGhlIGRlZmF1bHQgQHZhcntwb3J0fSBpcyB0aGUKLWZpcnN0IGF2YWlsYWJsZSBwb3J0IG9uIHlvdXIgaG9zdC4gIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgb24gVW5peAotaG9zdHMsIHdoZXJlIGl0IGlzIHR5cGljYWxseSBzb21ldGhpbmcgbGlrZSBAZmlsZXsvZGV2L3R0eWF9LgotCi1Aa2luZGV4IHNwZWVkCi1AY2luZGV4IHNlcmlhbCBsaW5lIHNwZWVkLCBIaXRhY2hpIG1pY3JvcwotQGNvZGV7QHZhbHVle0dEQlB9fSBoYXMgYW5vdGhlciBzcGVjaWFsIGNvbW1hbmQgdG8gc2V0IHRoZSBjb21tdW5pY2F0aW9ucwotc3BlZWQ6IEBzYW1we3NwZWVkIEB2YXJ7YnBzfX0uICBUaGlzIGNvbW1hbmQgYWxzbyBpcyBvbmx5IHVzZWQgZnJvbSBVbml4Ci1ob3N0czsgb24gRE9TIGhvc3RzLCBzZXQgdGhlIGxpbmUgc3BlZWQgYXMgdXN1YWwgZnJvbSBvdXRzaWRlIEdEQiB3aXRoCi10aGUgRE9TIEBrYmR7bW9kZX0gY29tbWFuZCAoZm9yIGluc3RhbmNlLCBAd3tAc2FtcHttb2RlCi1jb20yOjk2MDAsbiw4LDEscH19IGZvciBhIDk2MDAgYnBzIGNvbm5lY3Rpb24pLgotCi1UaGUgQHNhbXB7ZGV2aWNlfSBhbmQgQHNhbXB7c3BlZWR9IGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgb25seSB3aGVuIHlvdQotdXNlIGEgVW5peCBob3N0IHRvIGRlYnVnIHlvdXIgSGl0YWNoaSBtaWNyb3Byb2Nlc3NvciBwcm9ncmFtcy4gIElmIHlvdQotdXNlIGEgRE9TIGhvc3QsCi1AdmFsdWV7R0RCTn0gZGVwZW5kcyBvbiBhbiBhdXhpbGlhcnkgdGVybWluYXRlLWFuZC1zdGF5LXJlc2lkZW50IHByb2dyYW0KLWNhbGxlZCBAY29kZXthc3luY3Rzcn0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgYm9hcmQKLXRocm91Z2ggYSBQQyBzZXJpYWwgcG9ydC4gIFlvdSBtdXN0IGFsc28gdXNlIHRoZSBET1MgQGNvZGV7bW9kZX0gY29tbWFuZAotdG8gc2V0IHVwIHRoZSBzZXJpYWwgcG9ydCBvbiB0aGUgRE9TIHNpZGUuCi0KLVRoZSBmb2xsb3dpbmcgc2FtcGxlIHNlc3Npb24gaWxsdXN0cmF0ZXMgdGhlIHN0ZXBzIG5lZWRlZCB0byBzdGFydCBhCi1wcm9ncmFtIHVuZGVyIEB2YWx1ZXtHREJOfSBjb250cm9sIG9uIGFuIEg4LzMwMC4gIFRoZSBleGFtcGxlIHVzZXMgYQotc2FtcGxlIEg4LzMwMCBwcm9ncmFtIGNhbGxlZCBAZmlsZXt0Lnh9LiAgVGhlIHByb2NlZHVyZSBpcyB0aGUgc2FtZSBmb3IKLXRoZSBIaXRhY2hpIFNIIGFuZCB0aGUgSDgvNTAwLgotCi1GaXJzdCBob29rIHVwIHlvdXIgZGV2ZWxvcG1lbnQgYm9hcmQuICBJbiB0aGlzIGV4YW1wbGUsIHdlIHVzZSBhCi1ib2FyZCBhdHRhY2hlZCB0byBzZXJpYWwgcG9ydCBAY29kZXtDT00yfTsgaWYgeW91IHVzZSBhIGRpZmZlcmVudCBzZXJpYWwKLXBvcnQsIHN1YnN0aXR1dGUgaXRzIG5hbWUgaW4gdGhlIGFyZ3VtZW50IG9mIHRoZSBAY29kZXttb2RlfSBjb21tYW5kLgotV2hlbiB5b3UgY2FsbCBAY29kZXthc3luY3Rzcn0sIHRoZSBhdXhpbGlhcnkgY29tbXMgcHJvZ3JhbSB1c2VkIGJ5IHRoZQotZGVndWdnZXIsIHlvdSBnaXZlIGl0IGp1c3QgdGhlIG51bWVyaWMgcGFydCBvZiB0aGUgc2VyaWFsIHBvcnQncyBuYW1lOwotZm9yIGV4YW1wbGUsIEBzYW1we2FzeW5jc3RyIDJ9IGJlbG93IHJ1bnMgQGNvZGV7YXN5bmNzdHJ9IG9uCi1AY29kZXtDT00yfS4KLQotQGV4YW1wbGUKLUM6XEg4MzAwXFRFU1Q+IGFzeW5jdHNyIDIKLUM6XEg4MzAwXFRFU1Q+IG1vZGUgY29tMjo5NjAwLG4sOCwxLHAKLQotUmVzaWRlbnQgcG9ydGlvbiBvZiBNT0RFIGxvYWRlZAotCi1DT00yOiA5NjAwLCBuLCA4LCAxLCBwCi0KLUBlbmQgZXhhbXBsZQotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gV2UgaGF2ZSBub3RpY2VkIGEgYnVnIGluIFBDLU5GUyB0aGF0IGNvbmZsaWN0cyB3aXRoCi1AY29kZXthc3luY3Rzcn0uICBJZiB5b3UgYWxzbyBydW4gUEMtTkZTIG9uIHlvdXIgRE9TIGhvc3QsIHlvdSBtYXkgbmVlZCB0bwotZGlzYWJsZSBpdCwgb3IgZXZlbiBib290IHdpdGhvdXQgaXQsIHRvIHVzZSBAY29kZXthc3luY3Rzcn0gdG8gY29udHJvbAoteW91ciBkZXZlbG9wbWVudCBib2FyZC4KLUBlbmQgcXVvdGF0aW9uCi0KLUBraW5kZXggdGFyZ2V0IGhtcwotTm93IHRoYXQgc2VyaWFsIGNvbW11bmljYXRpb25zIGFyZSBzZXQgdXAsIGFuZCB0aGUgZGV2ZWxvcG1lbnQgYm9hcmQgaXMKLWNvbm5lY3RlZCwgeW91IGNhbiBzdGFydCB1cCBAdmFsdWV7R0RCTn0uICBDYWxsIEBjb2Rle0B2YWx1ZXtHREJQfX0gd2l0aAotdGhlIG5hbWUgb2YgeW91ciBwcm9ncmFtIGFzIHRoZSBhcmd1bWVudC4gIEBjb2Rle0B2YWx1ZXtHREJQfX0gcHJvbXB0cwoteW91LCBhcyB1c3VhbCwgd2l0aCB0aGUgcHJvbXB0IEBzYW1weyhAdmFsdWV7R0RCUH0pfS4gIFVzZSB0d28gc3BlY2lhbAotY29tbWFuZHMgdG8gYmVnaW4geW91ciBkZWJ1Z2dpbmcgc2Vzc2lvbjogQHNhbXB7dGFyZ2V0IGhtc30gdG8gc3BlY2lmeQotY3Jvc3MtZGVidWdnaW5nIHRvIHRoZSBIaXRhY2hpIGJvYXJkLCBhbmQgdGhlIEBjb2Rle2xvYWR9IGNvbW1hbmQgdG8KLWRvd25sb2FkIHlvdXIgcHJvZ3JhbSB0byB0aGUgYm9hcmQuICBAY29kZXtsb2FkfSBkaXNwbGF5cyB0aGUgbmFtZXMgb2YKLXRoZSBwcm9ncmFtJ3Mgc2VjdGlvbnMsIGFuZCBhIEBzYW1weyp9IGZvciBlYWNoIDJLIG9mIGRhdGEgZG93bmxvYWRlZC4KLShJZiB5b3Ugd2FudCB0byByZWZyZXNoIEB2YWx1ZXtHREJOfSBkYXRhIG9uIHN5bWJvbHMgb3Igb24gdGhlCi1leGVjdXRhYmxlIGZpbGUgd2l0aG91dCBkb3dubG9hZGluZywgdXNlIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZHMKLUBjb2Rle2ZpbGV9IG9yIEBjb2Rle3N5bWJvbC1maWxlfS4gIFRoZXNlIGNvbW1hbmRzLCBhbmQgQGNvZGV7bG9hZH0KLWl0c2VsZiwgYXJlIGRlc2NyaWJlZCBpbiBAcmVme0ZpbGVzLCxDb21tYW5kcyB0byBzcGVjaWZ5IGZpbGVzfS4pCi0KLUBzbWFsbGV4YW1wbGUKLShlZy1DOlxIODMwMFxURVNUKSBAdmFsdWV7R0RCUH0gdC54Ci1HREIgaXMgZnJlZSBzb2Z0d2FyZSBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIGRpc3RyaWJ1dGUgY29waWVzCi0gb2YgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlICJzaG93IGNvcHlpbmciIHRvIHNlZSAKLSB0aGUgY29uZGl0aW9ucy4KLVRoZXJlIGlzIGFic29sdXRlbHkgbm8gd2FycmFudHkgZm9yIEdEQjsgdHlwZSAic2hvdyB3YXJyYW50eSIgCi1mb3IgZGV0YWlscy4KLUdEQiBAdmFsdWV7R0RCVk59LCBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4uLgotKGdkYikgdGFyZ2V0IGhtcwotQ29ubmVjdGVkIHRvIHJlbW90ZSBIOC8zMDAgSE1TIHN5c3RlbS4KLShnZGIpIGxvYWQgdC54Ci0udGV4dCAgIDogMHg4MDAwIC4uIDB4YWJkZSAqKioqKioqKioqKgotLmRhdGEgICA6IDB4YWJkZSAuLiAweGFkMzAgKgotLnN0YWNrICA6IDB4ZjAwMCAuLiAweGYwMTQgKgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQXQgdGhpcyBwb2ludCwgeW91J3JlIHJlYWR5IHRvIHJ1biBvciBkZWJ1ZyB5b3VyIHByb2dyYW0uICBGcm9tIGhlcmUgb24sCi15b3UgY2FuIHVzZSBhbGwgdGhlIHVzdWFsIEB2YWx1ZXtHREJOfSBjb21tYW5kcy4gIFRoZSBAY29kZXticmVha30gY29tbWFuZAotc2V0cyBicmVha3BvaW50czsgdGhlIEBjb2Rle3J1bn0gY29tbWFuZCBzdGFydHMgeW91ciBwcm9ncmFtOwotQGNvZGV7cHJpbnR9IG9yIEBjb2Rle3h9IGRpc3BsYXkgZGF0YTsgdGhlIEBjb2Rle2NvbnRpbnVlfSBjb21tYW5kCi1yZXN1bWVzIGV4ZWN1dGlvbiBhZnRlciBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQuICBZb3UgY2FuIHVzZSB0aGUKLUBjb2Rle2hlbHB9IGNvbW1hbmQgYXQgYW55IHRpbWUgdG8gZmluZCBvdXQgbW9yZSBhYm91dCBAdmFsdWV7R0RCTn0gY29tbWFuZHMuCi0KLVJlbWVtYmVyLCBob3dldmVyLCB0aGF0IEBlbXBoe29wZXJhdGluZyBzeXN0ZW19IGZhY2lsaXRpZXMgYXJlbid0Ci1hdmFpbGFibGUgb24geW91ciBkZXZlbG9wbWVudCBib2FyZDsgZm9yIGV4YW1wbGUsIGlmIHlvdXIgcHJvZ3JhbSBoYW5ncywKLXlvdSBjYW4ndCBzZW5kIGFuIGludGVycnVwdC0tLWJ1dCB5b3UgY2FuIHByZXNzIHRoZSBAc2N7cmVzZXR9IHN3aXRjaCEKLQotVXNlIHRoZSBAc2N7cmVzZXR9IGJ1dHRvbiBvbiB0aGUgZGV2ZWxvcG1lbnQgYm9hcmQKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi10byBpbnRlcnJ1cHQgeW91ciBwcm9ncmFtIChkb24ndCB1c2UgQGtiZHtjdGwtQ30gb24gdGhlIERPUyBob3N0LS0taXQgaGFzCi1ubyB3YXkgdG8gcGFzcyBhbiBpbnRlcnJ1cHQgc2lnbmFsIHRvIHRoZSBkZXZlbG9wbWVudCBib2FyZCk7IGFuZAotCi1AaXRlbQotdG8gcmV0dXJuIHRvIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZCBwcm9tcHQgYWZ0ZXIgeW91ciBwcm9ncmFtIGZpbmlzaGVzCi1ub3JtYWxseS4gIFRoZSBjb21tdW5pY2F0aW9ucyBwcm90b2NvbCBwcm92aWRlcyBubyBvdGhlciB3YXkgZm9yIEB2YWx1ZXtHREJOfQotdG8gZGV0ZWN0IHByb2dyYW0gY29tcGxldGlvbi4KLUBlbmQgaXRlbWl6ZQotCi1JbiBlaXRoZXIgY2FzZSwgQHZhbHVle0dEQk59IHNlZXMgdGhlIGVmZmVjdCBvZiBhIEBzY3tyZXNldH0gb24gdGhlCi1kZXZlbG9wbWVudCBib2FyZCBhcyBhIGBgbm9ybWFsIGV4aXQnJyBvZiB5b3VyIHByb2dyYW0uCi0KLUBub2RlIEhpdGFjaGkgSUNFCi1Ac3Vic3Vic2VjdGlvbiBVc2luZyB0aGUgRTcwMDAgaW4tY2lyY3VpdCBlbXVsYXRvcgotCi1Aa2luZGV4IHRhcmdldCBlNzAwMAotWW91IGNhbiB1c2UgdGhlIEU3MDAwIGluLWNpcmN1aXQgZW11bGF0b3IgdG8gZGV2ZWxvcCBjb2RlIGZvciBlaXRoZXIgdGhlCi1IaXRhY2hpIFNIIG9yIHRoZSBIOC8zMDBILiAgVXNlIG9uZSBvZiB0aGVzZSBmb3JtcyBvZiB0aGUgQHNhbXB7dGFyZ2V0Ci1lNzAwMH0gY29tbWFuZCB0byBjb25uZWN0IEB2YWx1ZXtHREJOfSB0byB5b3VyIEU3MDAwOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHRhcmdldCBlNzAwMCBAdmFye3BvcnR9IEB2YXJ7c3BlZWR9Ci1Vc2UgdGhpcyBmb3JtIGlmIHlvdXIgRTcwMDAgaXMgY29ubmVjdGVkIHRvIGEgc2VyaWFsIHBvcnQuICBUaGUKLUB2YXJ7cG9ydH0gYXJndW1lbnQgaWRlbnRpZmllcyB3aGF0IHNlcmlhbCBwb3J0IHRvIHVzZSAoZm9yIGV4YW1wbGUsCi1Ac2FtcHtjb20yfSkuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGxpbmUgc3BlZWQgaW4gYml0cyBwZXIgc2Vjb25kCi0oZm9yIGV4YW1wbGUsIEBzYW1wezk2MDB9KS4KLQotQGl0ZW0gdGFyZ2V0IGU3MDAwIEB2YXJ7aG9zdG5hbWV9Ci1JZiB5b3VyIEU3MDAwIGlzIGluc3RhbGxlZCBhcyBhIGhvc3Qgb24gYSBUQ1AvSVAgbmV0d29yaywgeW91IGNhbiBqdXN0Ci1zcGVjaWZ5IGl0cyBob3N0bmFtZTsgQHZhbHVle0dEQk59IHVzZXMgQGNvZGV7dGVsbmV0fSB0byBjb25uZWN0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBIaXRhY2hpIFNwZWNpYWwKLUBzdWJzdWJzZWN0aW9uIFNwZWNpYWwgQHZhbHVle0dEQk59IGNvbW1hbmRzIGZvciBIaXRhY2hpIG1pY3JvcwotCi1Tb21lIEB2YWx1ZXtHREJOfSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIG9ubHkgb24gdGhlIEg4LzMwMCBvciB0aGUKLUg4LzUwMCBjb25maWd1cmF0aW9uczoKLQotQHRhYmxlIEBjb2RlCi1Aa2luZGV4IHNldCBtYWNoaW5lCi1Aa2luZGV4IHNob3cgbWFjaGluZQotQGl0ZW0gc2V0IG1hY2hpbmUgaDgzMDAKLUBpdGVteCBzZXQgbWFjaGluZSBoODMwMGgKLUNvbmRpdGlvbiBAdmFsdWV7R0RCTn0gZm9yIG9uZSBvZiB0aGUgdHdvIHZhcmlhbnRzIG9mIHRoZSBIOC8zMDAKLWFyY2hpdGVjdHVyZSB3aXRoIEBzYW1we3NldCBtYWNoaW5lfS4gIFlvdSBjYW4gdXNlIEBzYW1we3Nob3cgbWFjaGluZX0KLXRvIGNoZWNrIHdoaWNoIHZhcmlhbnQgaXMgY3VycmVudGx5IGluIGVmZmVjdC4KLQotQGtpbmRleCBzZXQgbWVtb3J5IEB2YXJ7bW9kfQotQGNpbmRleCBtZW1vcnkgbW9kZWxzLCBIOC81MDAKLUBpdGVtIHNldCBtZW1vcnkgQHZhcnttb2R9Ci1AaXRlbXggc2hvdyBtZW1vcnkKLVNwZWNpZnkgd2hpY2ggSDgvNTAwIG1lbW9yeSBtb2RlbCAoQHZhcnttb2R9KSB5b3UgYXJlIHVzaW5nIHdpdGgKLUBzYW1we3NldCBtZW1vcnl9OyBjaGVjayB3aGljaCBtZW1vcnkgbW9kZWwgaXMgaW4gZWZmZWN0IHdpdGggQHNhbXB7c2hvdwotbWVtb3J5fS4gIFRoZSBhY2NlcHRlZCB2YWx1ZXMgZm9yIEB2YXJ7bW9kfSBhcmUgQGNvZGV7c21hbGx9LAotQGNvZGV7YmlnfSwgQGNvZGV7bWVkaXVtfSwgYW5kIEBjb2Rle2NvbXBhY3R9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBNSVBTIFJlbW90ZQotQHN1YnNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCByZW1vdGUgTUlQUyBib2FyZHMKLQotQGNpbmRleCBNSVBTIGJvYXJkcwotQHZhbHVle0dEQk59IGNhbiB1c2UgdGhlIE1JUFMgcmVtb3RlIGRlYnVnZ2luZyBwcm90b2NvbCB0byB0YWxrIHRvIGEKLU1JUFMgYm9hcmQgYXR0YWNoZWQgdG8gYSBzZXJpYWwgbGluZS4gIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4KLXlvdSBjb25maWd1cmUgQHZhbHVle0dEQk59IHdpdGggQHNhbXB7LS10YXJnZXQ9bWlwcy1pZHQtZWNvZmZ9LgotCi1AbmVlZCAxMDAwCi1Vc2UgdGhlc2UgQHZhbHVle0dEQk59IGNvbW1hbmRzIHRvIHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gdG8geW91ciB0YXJnZXQgYm9hcmQ6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gdGFyZ2V0IG1pcHMgQHZhcntwb3J0fQotQGtpbmRleCB0YXJnZXQgbWlwcyBAdmFye3BvcnR9Ci1UbyBydW4gYSBwcm9ncmFtIG9uIHRoZSBib2FyZCwgc3RhcnQgdXAgQGNvZGV7QHZhbHVle0dEQlB9fSB3aXRoIHRoZQotbmFtZSBvZiB5b3VyIHByb2dyYW0gYXMgdGhlIGFyZ3VtZW50LiAgVG8gY29ubmVjdCB0byB0aGUgYm9hcmQsIHVzZSB0aGUKLWNvbW1hbmQgQHNhbXB7dGFyZ2V0IG1pcHMgQHZhcntwb3J0fX0sIHdoZXJlIEB2YXJ7cG9ydH0gaXMgdGhlIG5hbWUgb2YKLXRoZSBzZXJpYWwgcG9ydCBjb25uZWN0ZWQgdG8gdGhlIGJvYXJkLiAgSWYgdGhlIHByb2dyYW0gaGFzIG5vdCBhbHJlYWR5Ci1iZWVuIGRvd25sb2FkZWQgdG8gdGhlIGJvYXJkLCB5b3UgbWF5IHVzZSB0aGUgQGNvZGV7bG9hZH0gY29tbWFuZCB0bwotZG93bmxvYWQgaXQuICBZb3UgY2FuIHRoZW4gdXNlIGFsbCB0aGUgdXN1YWwgQHZhbHVle0dEQk59IGNvbW1hbmRzLgotCi1Gb3IgZXhhbXBsZSwgdGhpcyBzZXF1ZW5jZSBjb25uZWN0cyB0byB0aGUgdGFyZ2V0IGJvYXJkIHRocm91Z2ggYSBzZXJpYWwKLXBvcnQsIGFuZCBsb2FkcyBhbmQgcnVucyBhIHByb2dyYW0gY2FsbGVkIEB2YXJ7cHJvZ30gdGhyb3VnaCB0aGUKLWRlYnVnZ2VyOgotCi1AZXhhbXBsZQotaG9zdCQgQHZhbHVle0dEQlB9IEB2YXJ7cHJvZ30KLUdEQiBpcyBmcmVlIHNvZnR3YXJlIGFuZCBAZG90c3t9Ci0oZ2RiKSB0YXJnZXQgbWlwcyAvZGV2L3R0eWIKLShnZGIpIGxvYWQgQHZhcntwcm9nfQotKGdkYikgcnVuCi1AZW5kIGV4YW1wbGUKLQotQGl0ZW0gdGFyZ2V0IG1pcHMgQHZhcntob3N0bmFtZX06QHZhcntwb3J0bnVtYmVyfQotT24gc29tZSBAdmFsdWV7R0RCTn0gaG9zdCBjb25maWd1cmF0aW9ucywgeW91IGNhbiBzcGVjaWZ5IGEgVENQCi1jb25uZWN0aW9uIChmb3IgaW5zdGFuY2UsIHRvIGEgc2VyaWFsIGxpbmUgbWFuYWdlZCBieSBhIHRlcm1pbmFsCi1jb25jZW50cmF0b3IpIGluc3RlYWQgb2YgYSBzZXJpYWwgcG9ydCwgdXNpbmcgdGhlIHN5bnRheAotQHNhbXB7QHZhcntob3N0bmFtZX06QHZhcntwb3J0bnVtYmVyfX0uCi0KLUBpdGVtIHRhcmdldCBwbW9uIEB2YXJ7cG9ydH0KLUBraW5kZXggdGFyZ2V0IHBtb24gQHZhcntwb3J0fQotCi1AaXRlbSB0YXJnZXQgZGRiIEB2YXJ7cG9ydH0KLUBraW5kZXggdGFyZ2V0IGRkYiBAdmFye3BvcnR9Ci0KLUBpdGVtIHRhcmdldCBsc2kgQHZhcntwb3J0fQotQGtpbmRleCB0YXJnZXQgbHNpIEB2YXJ7cG9ydH0KLQotQGVuZCB0YWJsZQotCi0KLUBub2luZGVudAotQHZhbHVle0dEQk59IGFsc28gc3VwcG9ydHMgdGhlc2Ugc3BlY2lhbCBjb21tYW5kcyBmb3IgTUlQUyB0YXJnZXRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHNldCBwcm9jZXNzb3IgQHZhcnthcmdzfQotQGl0ZW14IHNob3cgcHJvY2Vzc29yCi1Aa2luZGV4IHNldCBwcm9jZXNzb3IgQHZhcnthcmdzfQotQGtpbmRleCBzaG93IHByb2Nlc3NvcgotVXNlIHRoZSBAY29kZXtzZXQgcHJvY2Vzc29yfSBjb21tYW5kIHRvIHNldCB0aGUgdHlwZSBvZiBNSVBTCi1wcm9jZXNzb3Igd2hlbiB5b3Ugd2FudCB0byBhY2Nlc3MgcHJvY2Vzc29yLXR5cGUtc3BlY2lmaWMgcmVnaXN0ZXJzLgotRm9yIGV4YW1wbGUsIEBjb2Rle3NldCBwcm9jZXNzb3IgQHZhcntyMzA0MX19IHRlbGxzIEB2YWx1ZXtHREJOfSAKLXRvIHVzZSB0aGUgQ1BPIHJlZ2lzdGVycyBhcHByb3ByaWF0ZSBmb3IgdGhlIDMwNDEgY2hpcC4KLVVzZSB0aGUgQGNvZGV7c2hvdyBwcm9jZXNzb3J9IGNvbW1hbmQgdG8gc2VlIHdoYXQgTUlQUyBwcm9jZXNzb3IgQHZhbHVle0dEQk59IAotaXMgdXNpbmcuICBVc2UgdGhlIEBjb2Rle2luZm8gcmVnfSBjb21tYW5kIHRvIHNlZSB3aGF0IHJlZ2lzdGVycwotQHZhbHVle0dEQk59IGlzIHVzaW5nLiAKLQotQGl0ZW0gc2V0IG1pcHNmcHUgZG91YmxlCi1AaXRlbXggc2V0IG1pcHNmcHUgc2luZ2xlCi1AaXRlbXggc2V0IG1pcHNmcHUgbm9uZQotQGl0ZW14IHNob3cgbWlwc2ZwdQotQGtpbmRleCBzZXQgbWlwc2ZwdQotQGtpbmRleCBzaG93IG1pcHNmcHUKLUBjaW5kZXggTUlQUyByZW1vdGUgZmxvYXRpbmcgcG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIE1JUFMgcmVtb3RlCi1JZiB5b3VyIHRhcmdldCBib2FyZCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBNSVBTIGZsb2F0aW5nIHBvaW50Ci1jb3Byb2Nlc3NvciwgeW91IHNob3VsZCB1c2UgdGhlIGNvbW1hbmQgQHNhbXB7c2V0IG1pcHNmcHUgbm9uZX0gKGlmIHlvdQotbmVlZCB0aGlzLCB5b3UgbWF5IHdpc2ggdG8gcHV0IHRoZSBjb21tYW5kIGluIHlvdXIgQHZhbHVle0dEQklOSVR9Ci1maWxlKS4gIFRoaXMgdGVsbHMgQHZhbHVle0dEQk59IGhvdyB0byBmaW5kIHRoZSByZXR1cm4gdmFsdWUgb2YKLWZ1bmN0aW9ucyB3aGljaCByZXR1cm4gZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiAgSXQgYWxzbyBhbGxvd3MKLUB2YWx1ZXtHREJOfSB0byBhdm9pZCBzYXZpbmcgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB3aGVuIGNhbGxpbmcKLWZ1bmN0aW9ucyBvbiB0aGUgYm9hcmQuICBJZiB5b3UgYXJlIHVzaW5nIGEgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IKLXdpdGggb25seSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQsIGFzIG9uIHRoZSBAc2N7cjQ2NTB9Ci1wcm9jZXNzb3IsIHVzZSB0aGUgY29tbWFuZCBAc2FtcHtzZXQgbWlwc2ZwdSBzaW5nbGV9LiAgVGhlIGRlZmF1bHQKLWRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgbWF5IGJlIHNlbGVjdGVkIHVzaW5nCi1Ac2FtcHtzZXQgbWlwc2ZwdSBkb3VibGV9LgotCi1JbiBwcmV2aW91cyB2ZXJzaW9ucyB0aGUgb25seSBjaG9pY2VzIHdlcmUgZG91YmxlIHByZWNpc2lvbiBvciBubwotZmxvYXRpbmcgcG9pbnQsIHNvIEBzYW1we3NldCBtaXBzZnB1IG9ufSB3aWxsIHNlbGVjdCBkb3VibGUgcHJlY2lzaW9uCi1hbmQgQHNhbXB7c2V0IG1pcHNmcHUgb2ZmfSB3aWxsIHNlbGVjdCBubyBmbG9hdGluZyBwb2ludC4KLQotQXMgdXN1YWwsIHlvdSBjYW4gaW5xdWlyZSBhYm91dCB0aGUgQGNvZGV7bWlwc2ZwdX0gdmFyaWFibGUgd2l0aAotQHNhbXB7c2hvdyBtaXBzZnB1fS4KLQotQGl0ZW0gc2V0IHJlbW90ZWRlYnVnIEB2YXJ7bn0KLUBpdGVteCBzaG93IHJlbW90ZWRlYnVnCi1Aa2luZGV4IHNldCByZW1vdGVkZWJ1ZwotQGtpbmRleCBzaG93IHJlbW90ZWRlYnVnCi1AY2luZGV4IEBjb2Rle3JlbW90ZWRlYnVnfSwgTUlQUyBwcm90b2NvbAotQGNpbmRleCBNSVBTIEBjb2Rle3JlbW90ZWRlYnVnfSBwcm90b2NvbAotQGMgRklYTUUhIEZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgeW91IG11c3Qga25vdyBzb21ldGhpbmcgYWJvdXQgdGhlIE1JUFMKLUBjIEZJWE1FLi4ucHJvdG9jb2wuICBXaGVyZSBpcyBpdCBkZXNjcmliZWQ/Ci1Zb3UgY2FuIHNlZSBzb21lIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCBjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBib2FyZAotYnkgc2V0dGluZyB0aGUgQGNvZGV7cmVtb3RlZGVidWd9IHZhcmlhYmxlLiAgSWYgeW91IHNldCBpdCB0byBAY29kZXsxfSB1c2luZwotQHNhbXB7c2V0IHJlbW90ZWRlYnVnIDF9LCBldmVyeSBwYWNrZXQgaXMgZGlzcGxheWVkLiAgSWYgeW91IHNldCBpdAotdG8gQGNvZGV7Mn0sIGV2ZXJ5IGNoYXJhY3RlciBpcyBkaXNwbGF5ZWQuICBZb3UgY2FuIGNoZWNrIHRoZSBjdXJyZW50IHZhbHVlCi1hdCBhbnkgdGltZSB3aXRoIHRoZSBjb21tYW5kIEBzYW1we3Nob3cgcmVtb3RlZGVidWd9LgotCi1AaXRlbSBzZXQgdGltZW91dCBAdmFye3NlY29uZHN9Ci1AaXRlbXggc2V0IHJldHJhbnNtaXQtdGltZW91dCBAdmFye3NlY29uZHN9Ci1AaXRlbXggc2hvdyB0aW1lb3V0Ci1AaXRlbXggc2hvdyByZXRyYW5zbWl0LXRpbWVvdXQKLUBjaW5kZXggQGNvZGV7dGltZW91dH0sIE1JUFMgcHJvdG9jb2wKLUBjaW5kZXggQGNvZGV7cmV0cmFuc21pdC10aW1lb3V0fSwgTUlQUyBwcm90b2NvbAotQGtpbmRleCBzZXQgdGltZW91dAotQGtpbmRleCBzaG93IHRpbWVvdXQKLUBraW5kZXggc2V0IHJldHJhbnNtaXQtdGltZW91dAotQGtpbmRleCBzaG93IHJldHJhbnNtaXQtdGltZW91dAotWW91IGNhbiBjb250cm9sIHRoZSB0aW1lb3V0IHVzZWQgd2hpbGUgd2FpdGluZyBmb3IgYSBwYWNrZXQsIGluIHRoZSBNSVBTCi1yZW1vdGUgcHJvdG9jb2wsIHdpdGggdGhlIEBjb2Rle3NldCB0aW1lb3V0IEB2YXJ7c2Vjb25kc319IGNvbW1hbmQuICBUaGUKLWRlZmF1bHQgaXMgNSBzZWNvbmRzLiAgU2ltaWxhcmx5LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHRpbWVvdXQgdXNlZCB3aGlsZQotd2FpdGluZyBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IG9mIGEgcGFja2V0IHdpdGggdGhlIEBjb2Rle3NldAotcmV0cmFuc21pdC10aW1lb3V0IEB2YXJ7c2Vjb25kc319IGNvbW1hbmQuICBUaGUgZGVmYXVsdCBpcyAzIHNlY29uZHMuCi1Zb3UgY2FuIGluc3BlY3QgYm90aCB2YWx1ZXMgd2l0aCBAY29kZXtzaG93IHRpbWVvdXR9IGFuZCBAY29kZXtzaG93Ci1yZXRyYW5zbWl0LXRpbWVvdXR9LiAgKFRoZXNlIGNvbW1hbmRzIGFyZSBAZW1waHtvbmx5fSBhdmFpbGFibGUgd2hlbgotQHZhbHVle0dEQk59IGlzIGNvbmZpZ3VyZWQgZm9yIEBzYW1wey0tdGFyZ2V0PW1pcHMtaWR0LWVjb2ZmfS4pCi0KLVRoZSB0aW1lb3V0IHNldCBieSBAY29kZXtzZXQgdGltZW91dH0gZG9lcyBub3QgYXBwbHkgd2hlbiBAdmFsdWV7R0RCTn0KLWlzIHdhaXRpbmcgZm9yIHlvdXIgcHJvZ3JhbSB0byBzdG9wLiAgSW4gdGhhdCBjYXNlLCBAdmFsdWV7R0RCTn0gd2FpdHMKLWZvcmV2ZXIgYmVjYXVzZSBpdCBoYXMgbm8gd2F5IG9mIGtub3dpbmcgaG93IGxvbmcgdGhlIHByb2dyYW0gaXMgZ29pbmcKLXRvIHJ1biBiZWZvcmUgc3RvcHBpbmcuCi1AZW5kIHRhYmxlCi0KLUBub2RlIFNpbXVsYXRvcgotQHN1YnNlY3Rpb24gU2ltdWxhdGVkIENQVSB0YXJnZXQKLQotQGNpbmRleCBzaW11bGF0b3IKLUBjaW5kZXggc2ltdWxhdG9yLCBaODAwMAotQGNpbmRleCBaODAwMCBzaW11bGF0b3IKLUBjaW5kZXggc2ltdWxhdG9yLCBIOC8zMDAgb3IgSDgvNTAwCi1AY2luZGV4IEg4LzMwMCBvciBIOC81MDAgc2ltdWxhdG9yCi1AY2luZGV4IHNpbXVsYXRvciwgSGl0YWNoaSBTSAotQGNpbmRleCBIaXRhY2hpIFNIIHNpbXVsYXRvcgotQGNpbmRleCBDUFUgc2ltdWxhdG9yCi1Gb3Igc29tZSBjb25maWd1cmF0aW9ucywgQHZhbHVle0dEQk59IGluY2x1ZGVzIGEgQ1BVIHNpbXVsYXRvciB0aGF0IHlvdQotY2FuIHVzZSBpbnN0ZWFkIG9mIGEgaGFyZHdhcmUgQ1BVIHRvIGRlYnVnIHlvdXIgcHJvZ3JhbXMuCi1DdXJyZW50bHksIHNpbXVsYXRvcnMgYXJlIGF2YWlsYWJsZSBmb3IgQVJNLCBEMTBWLCBEMzBWLCBGUjMwLCBIOC8zMDAsCi1IOC81MDAsIGk5NjAsIE0zMlIsIE1JUFMsIE1OMTAyMDAsIE1OMTAzMDAsIFBvd2VyUEMsIFNILCBTcGFyYywgVjg1MCwKLVc2NSwgYW5kIFo4MDAwLgotCi1AY2luZGV4IHNpbXVsYXRvciwgWjgwMDAKLUBjaW5kZXggWmlsb2cgWjgwMDAgc2ltdWxhdG9yCi1XaGVuIGNvbmZpZ3VyZWQgZm9yIGRlYnVnZ2luZyBaaWxvZyBaODAwMCB0YXJnZXRzLCBAdmFsdWV7R0RCTn0gaW5jbHVkZXMKLWEgWjgwMDAgc2ltdWxhdG9yLgotCi1Gb3IgdGhlIFo4MDAwIGZhbWlseSwgQHNhbXB7dGFyZ2V0IHNpbX0gc2ltdWxhdGVzIGVpdGhlciB0aGUgWjgwMDIgKHRoZQotdW5zZWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgWjgwMDAgYXJjaGl0ZWN0dXJlKSBvciB0aGUgWjgwMDEgKHRoZQotc2VnbWVudGVkIHZhcmlhbnQpLiAgVGhlIHNpbXVsYXRvciByZWNvZ25pemVzIHdoaWNoIGFyY2hpdGVjdHVyZSBpcwotYXBwcm9wcmlhdGUgYnkgaW5zcGVjdGluZyB0aGUgb2JqZWN0IGNvZGUuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gdGFyZ2V0IHNpbSBAdmFye2FyZ3N9Ci1Aa2luZGV4IHNpbQotQGtpbmRleCB0YXJnZXQgc2ltCi1EZWJ1ZyBwcm9ncmFtcyBvbiBhIHNpbXVsYXRlZCBDUFUuICBJZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHNldHVwCi1vcHRpb25zLCBzcGVjaWZ5IHRoZW0gdmlhIEB2YXJ7YXJnc30uCi1AZW5kIHRhYmxlCi0KLUBub2luZGVudAotQWZ0ZXIgc3BlY2lmeWluZyB0aGlzIHRhcmdldCwgeW91IGNhbiBkZWJ1ZyBwcm9ncmFtcyBmb3IgdGhlIHNpbXVsYXRlZAotQ1BVIGluIHRoZSBzYW1lIHN0eWxlIGFzIHByb2dyYW1zIGZvciB5b3VyIGhvc3QgY29tcHV0ZXI7IHVzZSB0aGUKLUBjb2Rle2ZpbGV9IGNvbW1hbmQgdG8gbG9hZCBhIG5ldyBwcm9ncmFtIGltYWdlLCB0aGUgQGNvZGV7cnVufSBjb21tYW5kCi10byBydW4geW91ciBwcm9ncmFtLCBhbmQgc28gb24uCi0KLUFzIHdlbGwgYXMgbWFraW5nIGF2YWlsYWJsZSBhbGwgdGhlIHVzdWFsIG1hY2hpbmUgcmVnaXN0ZXJzIChzZWUKLUBjb2Rle2luZm8gcmVnfSksIHRoZSBaODAwMCBzaW11bGF0b3IgcHJvdmlkZXMgdGhyZWUgYWRkaXRpb25hbCBpdGVtcwotb2YgaW5mb3JtYXRpb24gYXMgc3BlY2lhbGx5IG5hbWVkIHJlZ2lzdGVyczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBjeWNsZXMKLUNvdW50cyBjbG9jay10aWNrcyBpbiB0aGUgc2ltdWxhdG9yLgotCi1AaXRlbSBpbnN0cwotQ291bnRzIGluc3RydWN0aW9ucyBydW4gaW4gdGhlIHNpbXVsYXRvci4KLQotQGl0ZW0gdGltZQotRXhlY3V0aW9uIHRpbWUgaW4gNjB0aHMgb2YgYSBzZWNvbmQuIAotQGVuZCB0YWJsZQotCi1Zb3UgY2FuIHJlZmVyIHRvIHRoZXNlIHZhbHVlcyBpbiBAdmFsdWV7R0RCTn0gZXhwcmVzc2lvbnMgd2l0aCB0aGUgdXN1YWwKLWNvbnZlbnRpb25zOyBmb3IgZXhhbXBsZSwgQHd7QHNhbXB7YiBmcHV0YyBpZiAkY3ljbGVzPjUwMDB9fSBzZXRzIGEKLWNvbmRpdGlvbmFsIGJyZWFrcG9pbnQgdGhhdCBzdXNwZW5kcyBvbmx5IGFmdGVyIGF0IGxlYXN0IDUwMDAKLXNpbXVsYXRlZCBjbG9jayB0aWNrcy4KLQotQGMgbmVlZCB0byBhZGQgbXVjaCBtb3JlIGRldGFpbCBhYm91dCBzaW1zIQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9SRUFETUUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2ZmM3NS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUluZm9ybWF0aW9uIGFib3V0IHRoZSB2YXJpb3VzIGV4ZWN1dGFibGVzIGZvdW5kIGluIHRoaXMgdGVzdDoKLQotICAgICAgICAgICAgIEJGRCAgICAgICAgICAgICAgQ1BVICAgICBPYmpmaWxlCi1FeGVjdXRhYmxlICAgVGFyZ2V0ICAgICAgICAgICBUeXBlICAgIFR5cGUgICAgIEluZm8gYWJvdXQgY29tcGlsYXRpb24gbWFjaGluZQotLS0tLS0tLS0tLSAgIC0tLS0tLSAgICAgICAgICAgLS0tLSAgICAtLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pNDg2LWVsZiAgICAgZWxmLWxpdHRsZSAgICAgICBpNDg2ICAgIEVMRiAgICAgIE5DUiAzMDAwLCAvdXNyL2Njcy9BVFQvY2MKLWk4NjAtZWxmICAgICBlbGYtYmlnICAgICAgICAgIGk4NjAgICAgRUxGICAgICAgU3RyYXR1cwotbTY4ay1lbGYgICAgIGVsZi1iaWcgICAgICAgICAgbTY4ayAgICBFTEYgICAgICBBbWlnYSAzMDAwIFVYLCAvdXNyL2Njcy9iaW4vY2MKLW02OGstYW91dCAgICBhLm91dC1uZXdzb3MzICAgIG02OGsgICAgYS5vdXQgICAgU29ueSBORVdTCi1tNjhrLWFvdXQyICAgYS5vdXQtc3Vub3MtYmlnICBtNjhrICAgIGEub3V0ICAgIFN1bk9TIDQuMSwgZ2NjIGN5Z251cy0yLjAuMQotc3BhcmMtYW91dCAgIGEub3V0LXN1bm9zLWJpZyAgc3BhcmMgICBhLm91dCAgICBTdW4gNCwgU3VuT1MgNC4xLjEsIGdjYyAyLjEKLXNwYXJjLWVsZiAgICBlbGYtYmlnICAgICAgICAgIHNwYXJjICAgRUxGICAgICAgU3VuIDQsIFNvbGFyaXMgMS4wLCBnY2MgMi4wLjIKLW1pcHMtZWNvZmYgICBlY29mZi1iaWdtaXBzICAgIG1pcHMgICAgZWNvZmYgICAgSVJJWCA0LjAuMQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hbm5vdGEyLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hbm5vdGEyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3NTJlLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYW5ub3RhMi5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1jbGFzcyBBIHsKLXB1YmxpYzoKLSAgaW50IHg7Ci0gIGludCB5OwotICBpbnQgZm9vIChpbnQgYXJnKTsKLX07Ci0KLQotaW50IEE6OmZvbyAoaW50IGFyZykKLXsKLSAgeCArPSBhcmc7Ci0gIHJldHVybiBhcmcgKjI7Ci19Ci0KLWludCBtYWluKCkKLXsKLSAgQSBhOwotCi0gIGEueCA9IDA7Ci0gIGEueCA9IDE7Ci0gIGEueSA9IDI7Ci0KLSAgcHJpbnRmICgiYS54IGlzICVkXG4iLCBhLngpOwotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hbm5vdGEyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYW5ub3RhMi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYmM1NTEuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hbm5vdGEyLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTk5Ci0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEVsZW5hIFphbm5vbmkgKGV6YW5ub25pQGN5Z251cy5jb20pCi0KLWlmICR0cmFjZWxldmVsIHRoZW4gewotICAgIHN0cmFjZSAkdHJhY2VsZXZlbAotfQotCi0KLSMKLSMgdGVzdCBydW5uaW5nIHByb2dyYW1zCi0jCi1zZXQgcHJtc19pZCAwCi1zZXQgYnVnX2lkIDAKLQotc2V0IHRlc3RmaWxlICJhbm5vdGEyIgotc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uY2MKLXNldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KLQotaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBjKysgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0gewotICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgotfQotCi0jIGFyZSB3ZSBvbiBhIHRhcmdldCBib2FyZD8gSWYgc28sIGRvbid0IHJ1biB0aGVzZSB0ZXN0cy4KLSMgbm90ZTogdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBjYW5ub3QgdXNlIHJ1bnRvX21haW4gKHdoaWNoIHdvdWxkCi0jIHdvcmsgZm9yIHJlbW90ZSB0YXJnZXRzIHRvbykgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW50IHByb21wdCB3ZSBnZXQKLSMgd2hlbiB1c2luZyBhbm5vdGF0aW9uIGxldmVsIDIuCi0jCi1pZiAhW2lzbmF0aXZlXSB0aGVuIHsKLSAgICByZXR1cm4gMAotfQotCi0KLWdkYl9leGl0Ci1nZGJfc3RhcnQKLWdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgotZ2RiX2xvYWQgJHtiaW5maWxlfQotCi1pZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zdHViXSB7Ci0gICAgZ2RiX3N0ZXBfZm9yX3N0dWI7Ci19Ci0KLSMKLSMgbGluZSBudW1iZXIgd2hlcmUgd2UgbmVlZCB0byBzdG9wIGluIG1haW4KLSMKLXNldCBtYWluX2xpbmUgMjUKLQotIyBUaGUgY29tbWFuZHMgd2UgdGVzdCBoZXJlIHByb2R1Y2UgbWFueSBsaW5lcyBvZiBvdXRwdXQ7IGRpc2FibGUgInByZXNzIAotIyA8cmV0dXJuPiB0byBjb250aW51ZSIgcHJvbXB0cy4KLXNlbmRfZ2RiICJzZXQgaGVpZ2h0IDBcbiIKLWdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgotCi0jCi0jIGJyZWFrIGF0IG1haW4KLSMKLWdkYl90ZXN0ICJicmVhayAyNSIgXAotICAgICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBcCi0gICAgImJyZWFrcG9pbnQgbWFpbiIKLQotCi0jCi0jIE5PVEU6IHRoaXMgcHJvbXB0IGlzIE9LIG9ubHkgd2hlbiB0aGUgYW5ub3RhdGlvbiBsZXZlbCBpcyA+IDEKLSMgTk9URTogV2hlbiB0aGlzIHByb21wdCBpcyBpbiB1c2UgdGhlIGdkYl90ZXN0IHByb2NlZHVyZSBjYW5ub3QgYmUgdXNlZCBiZWNhdXNlCi0jIGl0IGFzc3VtZXMgdGhhdCB0aGUgbGFzdCBjaGFyIG9mIHRoZSBnZGJfcHJvbXB0IGlzIGEgd2hpdGUgc3BhY2UuIFRoaXMgaXMgbm90Ci0jIHRydWUgd2l0aCB0aGlzIGFubm90YXRlZCBwcm9tcHQuIFNvIHdlIG11c3QgdXNlIHNlbmRfZ2RiIGFuZCBnZGJfZXhwZWN0LgotIwotCi1zZXQgb2xkX2dkYl9wcm9tcHQgJGdkYl9wcm9tcHQKLXNldCBnZGJfcHJvbXB0ICJcclxuXDAzMlwwMzJwcmUtcHJvbXB0XHJcbiRnZGJfcHJvbXB0IFxyXG5cMDMyXDAzMnByb21wdFxyXG4iCi0KLXNlbmRfZ2RiICJzZXQgYW5ub3RhdGUgMlxuIiAKLWdkYl9leHBlY3QgewotICAgIC1yZSAic2V0IGFubm90YXRlIDJcclxuJGdkYl9wcm9tcHQkIiB7IHBhc3MgImFubm90YXRpb24gc2V0IGF0IGxldmVsIDIiIH0KLSAgICAtcmUgIi4qJGdkYl9wcm9tcHQkIiAgICAgICB7IGZhaWwgImFubm90YXRpb24gc2V0IGF0IGxldmVsIDIiIH0KLSAgICB0aW1lb3V0CSAgICAgICAgICAgIHsgZmFpbCAiYW5ub3RhdGlvbiBzZXQgYXQgbGV2ZWwgMiAodGltZW91dCkiIH0KLSAgfQotCi1zZW5kX2dkYiAicnVuXG4iCi0gIGdkYl9leHBlY3QgewotICAgIC1yZSAiXHJcblwwMzJcMDMycG9zdC1wcm9tcHRcclxuU3RhcnRpbmcgcHJvZ3JhbTogJGJpbmZpbGUgXChcclxuXHJcblwwMzJcMDMyZnJhbWVzLWludmFsaWRcKStcKFxyXG5cclxuXDAzMlwwMzJicmVha3BvaW50cy1pbnZhbGlkXCkqLipcKFxyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFwpKlxyXG5cclxuXDAzMlwwMzJzdGFydGluZ1woXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXCkrXHJcblxyXG5cMDMyXDAzMmJyZWFrcG9pbnQgMVxyXG5cclxuQnJlYWtwb2ludCAxLCBcclxuXDAzMlwwMzJmcmFtZS1iZWdpbiAwICRoZXhcclxuXHJcblwwMzJcMDMyZnJhbWUtZnVuY3Rpb24tbmFtZVxyXG5tYWluXHJcblwwMzJcMDMyZnJhbWUtYXJnc1xyXG4gXFwoXFwpXHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWJlZ2luXHJcbiBhdCBcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZmlsZVxyXG4uKmFubm90YTIuY2NcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZmlsZS1lbmRcclxuOlxyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1saW5lXHJcbiRtYWluX2xpbmVcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZW5kXHJcblxyXG5cclxuXDAzMlwwMzJzb3VyY2UuKiRzcmNmaWxlOiRtYWluX2xpbmU6Lio6YmVnOiRoZXhcclxuXHJcblwwMzJcMDMyZnJhbWUtZW5kXHJcblxyXG5cMDMyXDAzMnN0b3BwZWRcclxuJGdkYl9wcm9tcHQkIiBcCi0JICAgICAgICAgICAgICAgICAgICB7IHBhc3MgInJ1biB1bnRpbCBtYWluIGJyZWFrcG9pbnQiIH0KLSAgICAtcmUgIi4qJGdkYl9wcm9tcHQkIiAgICAgICB7IGZhaWwgInJ1biB1bnRpbCBtYWluIGJyZWFrcG9pbnQiIH0KLSAgICB0aW1lb3V0CSAgICAgICAgICAgIHsgZmFpbCAicnVuIHVudGlsIG1haW4gYnJlYWtwb2ludCAodGltZW91dCkiIH0KLSAgfQotCi0jCi0jIHByaW50IGNsYXNzICdhJyB3aXRoIHB1YmxpYyBmaWVsZHMuCi0jIHRoaXMgd2lsbCB0ZXN0OgotIyBhbm5vdGF0ZS1maWVsZC1iZWdpbgotIyBhbm5vdGF0ZS1maWVsZC1uYW1lLWVuZAotIyBhbm5vdGF0ZS1maWVsZC12YWx1ZQotIyBhbm5vdGF0ZS1maWVsZC1lbmQKLSMKLXNlbmRfZ2RiICJwcmludCBhXG4iCi1nZGJfZXhwZWN0IHsKLSAgLXJlICJcclxuXDAzMlwwMzJwb3N0LXByb21wdFxyXG5cclxuXDAzMlwwMzJ2YWx1ZS1oaXN0b3J5LWJlZ2luIDEgLVxyXG4uKj0gXHJcblwwMzJcMDMydmFsdWUtaGlzdG9yeS12YWx1ZVxyXG5cXHtcclxuXDAzMlwwMzJmaWVsZC1iZWdpbiAtXHJcbnhcclxuXDAzMlwwMzJmaWVsZC1uYW1lLWVuZFxyXG4gPSBcclxuXDAzMlwwMzJmaWVsZC12YWx1ZVxyXG4xXHJcblwwMzJcMDMyZmllbGQtZW5kXHJcbiwgXHJcblwwMzJcMDMyZmllbGQtYmVnaW4gLVxyXG55XHJcblwwMzJcMDMyZmllbGQtbmFtZS1lbmRcclxuID0gXHJcblwwMzJcMDMyZmllbGQtdmFsdWVcclxuMlxyXG5cMDMyXDAzMmZpZWxkLWVuZFxyXG5cXH1cclxuXHJcblwwMzJcMDMydmFsdWUtaGlzdG9yeS1lbmRcclxuJGdkYl9wcm9tcHQkIiBcCi0JeyBwYXNzICJwcmludCBjbGFzcyIgfQotICAtcmUgIi4qJGdkYl9wcm9tcHQkIiAgICAgeyBmYWlsICJwcmludCBjbGFzcyIgfQotICB0aW1lb3V0CSAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgY2xhc3MgKHRpbWVvdXQpIiB9Ci19Ci0KLSMKLSMgY29udGludWUgdW50aWwgZXhpdAotIyB0aGlzIHdpbGwgdGVzdDoKLSMgYW5ub3RhdGUtZXhpdGVkCi0jCi1zZW5kX2dkYiAiY29udGludWVcbiIKLWdkYl9leHBlY3QgewotICAtcmUgIlxyXG5cMDMyXDAzMnBvc3QtcHJvbXB0XHJcbkNvbnRpbnVpbmcuXHJcblxyXG5cMDMyXDAzMnN0YXJ0aW5nXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXHJcbmEueCBpcyAxXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXHJcblxyXG5cMDMyXDAzMmV4aXRlZCAwXHJcblxyXG5Qcm9ncmFtIGV4aXRlZCBub3JtYWxseS5cclxuXHJcblwwMzJcMDMyZnJhbWVzLWludmFsaWRcclxuXHJcblwwMzJcMDMyc3RvcHBlZFxyXG4kZ2RiX3Byb21wdCQiIFwKLQkgIHsgcGFzcyAiY29udGludWUgdW50aWwgZXhpdCIgfQotICAtcmUgIi4qJGdkYl9wcm9tcHQkIiAgICAgeyBmYWlsICJjb250aW51ZSB0byBleGl0IiB9Ci0gIHRpbWVvdXQJICAgICAgICAgICAgeyBmYWlsICJjb250aW51ZSB0byBleGl0ICh0aW1lb3V0KSIgfQotfQotCi0jCi0jIGRlbGV0ZSBhbGwgYnJlYWtwb2ludHMKLSMKLXNlbmRfZ2RiICJkZWxldGVcbiIKLWdkYl9leHBlY3QgewotICAtcmUgIiAiIHsKLSAgICAgICAgICAgc2VuZF9nZGIgInlcbiIKLSAgICAgICAgICAgZ2RiX2V4cGVjdCB7Ci0JICAgICAtcmUgIiAiIHsgcGFzcyAiZGVsZXRlIGJwcyIgfQotCSAgICAgLXJlICIuKiRnZGJfcHJvbXB0JCIgeyBmYWlsICJkZWxldGUgYnBzIiB9Ci0JICAgICB0aW1lb3V0ICB7IGZhaWwgImRlbGV0ZSBicHMgKHRpbWVvdXQpIiB9Ci0JIH0KLSAgICAgfQotICAtcmUgIi4qJGdkYl9wcm9tcHQkIiB7IGZhaWwgImRlbGV0ZSBicHMiIH0KLSAgdGltZW91dCAgeyBmYWlsICJkZWxldGUgYnBzICh0aW1lb3V0KSIgfQotfQotCi0jCi0jIGJyZWFrIGF0IGZpcnN0IGxpbmUgb2YgbWFpbi4gCi0jCi1zZW5kX2dkYiAiYnJlYWsgMjJcbiIKLWdkYl9leHBlY3QgewotICAtcmUgICJcclxuXDAzMlwwMzJwb3N0LXByb21wdFxyXG5cclxuXDAzMlwwMzJicmVha3BvaW50cy1pbnZhbGlkXHJcbkJyZWFrcG9pbnQuKmF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lLipcclxuJGdkYl9wcm9tcHQkIiBcCi0JICAgIHsgcGFzcyAiYnJlYWtwb2ludCBhdCBtYWluIiB9Ci0gIC1yZSAiLiokZ2RiX3Byb21wdCQiICAgICB7IGZhaWwgImJyZWFrIGF0IG1haW4iIH0KLSAgdGltZW91dAkgICAgICAgICAgICB7IGZhaWwgImJyZWFrIGF0IG1haW4gKHRpbWVvdXQpIiB9Ci19Ci0KLSMKLSMgY2hhbmdlIHZhbHVlIG9mIG1haW5fbGluZQotIwotc2V0IG1haW5fbGluZSAyMgotCi0jCi0jIHJ1biBwcm9ncmFtIHVwIHRvIGJyZWFrcG9pbnQuCi0jCi1zZW5kX2dkYiAicnVuXG4iCi0gIGdkYl9leHBlY3QgewotICAgIC1yZSAiXHJcblwwMzJcMDMycG9zdC1wcm9tcHRcclxuLipTdGFydGluZyBwcm9ncmFtOiAkYmluZmlsZSBcKFxyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFwpK1woXHJcblxyXG5cMDMyXDAzMmJyZWFrcG9pbnRzLWludmFsaWRcKSouKlwoXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXCkqXHJcblxyXG5cMDMyXDAzMnN0YXJ0aW5nXChcclxuXHJcblwwMzJcMDMyZnJhbWVzLWludmFsaWRcKStcclxuXHJcblwwMzJcMDMyYnJlYWtwb2ludCAyXHJcblxyXG5CcmVha3BvaW50IDIsIFxyXG5cMDMyXDAzMmZyYW1lLWJlZ2luIDAgJGhleFxyXG5cclxuXDAzMlwwMzJmcmFtZS1mdW5jdGlvbi1uYW1lXHJcbm1haW5cclxuXDAzMlwwMzJmcmFtZS1hcmdzXHJcbiBcXChcXClcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtYmVnaW5cclxuIGF0IFxyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1maWxlXHJcbi4qYW5ub3RhMi5jY1xyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1maWxlLWVuZFxyXG46XHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWxpbmVcclxuJG1haW5fbGluZVxyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1lbmRcclxuXHJcblxyXG5cMDMyXDAzMnNvdXJjZS4qJHNyY2ZpbGU6JG1haW5fbGluZTouKjpiZWc6JGhleFxyXG5cclxuXDAzMlwwMzJmcmFtZS1lbmRcclxuXHJcblwwMzJcMDMyc3RvcHBlZFxyXG4kZ2RiX3Byb21wdCQiIFwKLQkgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAicnVuIHVudGlsIG1haW4gYnJlYWtwb2ludCIgfQotICAgIC1yZSAiLiokZ2RiX3Byb21wdCQiICAgICAgIHsgZmFpbCAicnVuIHVudGlsIG1haW4gYnJlYWtwb2ludCIgfQotICAgIHRpbWVvdXQJICAgICAgICAgICAgeyBmYWlsICJydW4gdW50aWwgbWFpbiBicmVha3BvaW50ICh0aW1lb3V0KSIgfQotICB9Ci0KLSMKLSMgc2V0IHVwIGEgd2F0Y2ggcG9pbnQgb24gYS54IAotIwotc2VuZF9nZGIgIndhdGNoIGEueFxuIgotZ2RiX2V4cGVjdCB7Ci0gICAtcmUgIlxyXG5cMDMyXDAzMnBvc3QtcHJvbXB0XHJcblxyXG5cMDMyXDAzMmJyZWFrcG9pbnRzLWludmFsaWRcclxuV2F0Y2hwb2ludCAzOiBhLnhcclxuJGdkYl9wcm9tcHQkIiBcCi0JICAgeyBwYXNzICJzZXQgd2F0Y2ggb24gYS54IiB9Ci0gICAtcmUgIi4qJGdkYl9wcm9tcHQkIiAgeyBmYWlsICJzZXQgd2F0Y2ggb24gYS54IiB9Ci0gICB0aW1lb3V0ICAgIHsgZmFpbCAic2V0IHdhdGNoIG9uIGEueCAodGltZW91dCkiIH0KLX0KLQotIwotIyBkbyBhIG5leHQsIHNvIHRoYXQgdGhlIHdhdGNocG9pbnQgdHJpZ2dlcnMuIFRoaXMgd2lsbCB0ZXN0OgotIyBhbm5vdGF0ZS13YXRjaHBvaW50Ci0jCi1zZW5kX2dkYiAibmV4dFxuIgotZ2RiX2V4cGVjdCB7Ci0gICAtcmUgIlxyXG5cMDMyXDAzMnBvc3QtcHJvbXB0XHJcblxyXG5cMDMyXDAzMnN0YXJ0aW5nXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXHJcblxyXG5cMDMyXDAzMndhdGNocG9pbnQgM1xyXG5XYXRjaHBvaW50IDM6IGEueFxyXG5cclxuT2xkIHZhbHVlID0gMFxyXG5OZXcgdmFsdWUgPSAxXHJcblxyXG5cMDMyXDAzMmZyYW1lLWJlZ2luIDAgJGhleFxyXG5cclxuXDAzMlwwMzJmcmFtZS1mdW5jdGlvbi1uYW1lXHJcbm1haW5cclxuXDAzMlwwMzJmcmFtZS1hcmdzXHJcbiBcXChcXClcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtYmVnaW5cclxuIGF0IFxyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1maWxlXHJcbi4qJHNyY2ZpbGVcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZmlsZS1lbmRcclxuOlxyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1saW5lXHJcbiRkZWNpbWFsXHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWVuZFxyXG5cclxuXHJcblwwMzJcMDMyc291cmNlIC4qJHNyY2ZpbGUuKmJlZzokaGV4XHJcblxyXG5cMDMyXDAzMmZyYW1lLWVuZFxyXG5cclxuXDAzMlwwMzJzdG9wcGVkXHJcbiRnZGJfcHJvbXB0JCIgXAotCSAgIHsgcGFzcyAid2F0Y2ggdHJpZ2dlcmVkIG9uIGEueCIgfQotICAgLXJlICIuKiRnZGJfcHJvbXB0JCIgIHsgZmFpbCAid2F0Y2ggdHJpZ2dlcmVkIG9uIGEueCIgfQotICAgdGltZW91dCAgICB7IGZhaWwgIndhdGNoIHRyaWdnZXJlZCBvbiBhLnggKHRpbWVvdXQpIiB9Ci19Ci0KLQotIwotIyBzZW5kIF5DIHRvIGdkYiwgc28gdGhhdCB0aGUgcXVpdCgpIGZ1bmN0aW9uIGdldHMgY2FsbGVkIAotIyBhbmQgYW5ub3RhdGUtcXVpdCBpcyB0ZXN0ZWQKLSMgdGVzdDoKLSMgYW5ub3RhdGUtcXVpdAotIwotc2VuZF9nZGIgIlwwMDMiCi1nZGJfZXhwZWN0IHsKLSAgICAtcmUgIlxyXG5cMDMyXDAzMmVycm9yLWJlZ2luXHJcblF1aXRcclxuXHJcblwwMzJcMDMycXVpdFxyXG4kZ2RiX3Byb21wdCQiIFwKLQkgICAgeyBwYXNzICJhbm5vdGF0ZS1xdWl0IiB9Ci0gICAgLXJlICIuKiRnZGJfcHJvbXB0JCIgeyBmYWlsICJhbm5vdGF0ZS1xdWl0IiB9Ci0gICAgdGltZW91dCB7IGZhaWwgImFubm90YXRlLXF1aXQgKHRpbWVvdXQpIiB9Ci19Ci0KLSMKLSMgRklYTUU6IHRoZSB0ZXN0c3VpdGUgZG9lcyBub3QgY3VycmVudGx5IGhhdmUgdGVzdHMgZm9yIAotIyAgICAgICAgYW5ub3RhdGVfY2F0Y2hwb2ludHMgYW5kIGFubm90YXRlX2Z1bmN0aW9uX2NhbGwKLSMgICAgICAgIGFuZCBhIGZldyB2YXJpYW50cyBvZiB0aGUgYW5ub3RhdGlvbnMgdGhhdCBhcmUgCi0jICAgICAgICB0ZXN0ZWQgKG1hcmtlZCBieSBGSVhNRSBvbiB0aGUgYW5ub3Q/LmV4cCBmaWxlcykKLSMKLQotIyByZWluc3RhbGwgdGhlIG9sZCBwcm9tcHQgZm9yIHRoZSByZXN0IG9mIHRoZSB0ZXN0c3VpdGUuCi0KLXNldCBnZGJfcHJvbXB0ICRvbGRfZ2RiX3Byb21wdApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jcm9zc2xvYWQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jcm9zc2xvYWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmJiN2ExLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY3Jvc3Nsb2FkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCi0jIFJvYiBTYXZveWUgY2hhbmdlZCBpdCB0byB1c2UgZ2RiX3Rlc3QgKHJvYkBjeWdudXMuY29tKQotCi1pZiAkdHJhY2VsZXZlbCB0aGVuIHsKLQlzdHJhY2UgJHRyYWNlbGV2ZWwKLX0KLQotc2V0IHBybXNfaWQgMAotc2V0IGJ1Z19pZCAwCi0KLSMgRklYTUU6IFRoZSBjb25maWd1cmUuaW4gZm9yIHRoaXMgdGVzdCBzaG91bGQgbG9vayBmb3IgLS13aXRoLXRhcmdldHMKLSMgYW5kIGRlYWwgYWNjb3JkaW5nbHkuICBVbnRpbCB0aGF0IGhhcyBiZWVuIGRvbmUsIHNraXAgdGhlIHdob2xlIHRoaW5nLgotIyBXaXRoIGEgbWluaW1hbCBiZmQgKHRoZSBkZWZhdWx0KSwgZmV3IGlmIGFueSBvZiB0aGVzZSB0ZXN0cyB3b3JrLgotCi12ZXJib3NlICJGSVhNRTogYWxsIHRoZSBjcm9zc2xvYWQgdGVzdHMgaWdub3JlZCIKLXJldHVybgotCi1mb3JlYWNoIGkgIm02OGstZWxmIG02OGstYW91dCBtNjhrLWFvdXQyIG1pcHMtZWNvZmYgaTQ4Ni1lbGYgc3BhcmMtYW91dCBpODYwLWVsZiBzcGFyYy1lbGYiIHsKLSAgICByZW1vdGVfZXhlYyBidWlsZCAiY2QgJHtvYmpkaXJ9LyR7c3ViZGlyfSA7IHV1ZGVjb2RlICR7c3JjZGlyfS8ke3N1YmRpcn0vJGkudSAiCi19Ci0KLSMgRklYTUU6IFRoZXNlIHRlc3RzIGRvbid0IHdvcmsgZm9yIHRoZSBpOTYwLCBiZWNhdXNlCi0jIGJmZC9jb25maWcvaTk2MC1ib3V0Lm10IHNldHMgU0VMRUNUX1ZFQ1MuICBJIGNvdWxkIHVzZSBzZXR1cF94ZmFpbAotIyBmb3IgZWFjaCB0ZXN0LCBidXQgcmVib290aW5nIHRoZSBib2FyZCBiZXR3ZWVuIGVhY2ggb25lIHRha2VzIGEgbG9uZwotIyB0aW1lIHNvIEknbSBqdXN0IHB1bnRpbmcgdGhlIHdob2xlIGZpbGUuCi1pZiBbaXN0YXJnZXQgImk5NjAtKi0qIl0gdGhlbiB7Ci0gICAgaWYgJHZlcmJvc2U+MSB0aGVuIHsKLQl3YXJuaW5nICJGSVhNRTogY3Jvc3Nsb2FkIHRlc3QgY2FzZSBkb2Vzbid0IHJ1biBvbiB0aGUgaTk2MC4iCi0gICAgfQotICAgIGNvbnRpbnVlCi19Ci0KLSMgRklYTUU6IFRoZXNlIHRlc3RzIGRvbid0IHdvcmsgZm9yIHRoZSBhMjlrLCBiZWNhdXNlIFNFTEVDVF9WRUNTIGlzCi0jIHVzZWQgd2hlbiBjb21waWxpbmcgYmZkLiAgSXQgd291bGQgYmUgbmljZSBpZiB0aGVyZSB3ZXJlIHNvbWUgYmV0dGVyCi0jIHdheSBvZiBkZXRlY3RpbmcgdGhpcyBjYXNlLgotaWYgW2lzdGFyZ2V0ICJhMjlrLSotKiJdIHRoZW4gewotICAgIGlmICR2ZXJib3NlPjEgdGhlbiB7Ci0Jd2FybmluZyAiRklYTUU6IGNyb3NzbG9hZCB0ZXN0IGNhc2UgZG9lc24ndCBydW4gb24gdGhlIGEyOWsuIgotICAgIH0KLSAgICBjb250aW51ZQotfQotCi0jIFRlc3QgaWYgZ2RiIGNhbiBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUgYmZkIGZvcm1hdCBvZiBhbgotIyBleGVjdXRhYmxlIGFuZCByZWFkIGl0J3Mgc3ltYm9scy4KLQotcHJvYyBiZmRkZWZhdWx0IHt9IHsKLSAgICBnbG9iYWwgR0RCCi0gICAgZ2xvYmFsIEdEQkZMQUdTCi0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgb2JqZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBmaWxlX2xvYWRlZAotCi0gICAgZ2RiX3VubG9hZAotICAgIHNldCBmaWxlX2xvYWRlZCAwCi0gICAgc2VuZF9nZGIgImZpbGUgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXG4iCi0gICAgZ2RiX2V4cGVjdCB7Ci0JLXJlICJBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeS4gIEtpbGwgaXQuKnkgb3Igbi4iIHsKLQkgICAgc2VuZF9nZGIgInlcbiIKLQkgICAgZXhwX2NvbnRpbnVlCi0JfQotCS1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20gJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXFsuXF0rZG9uZVwuLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCIKLQl9Ci0JLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcWy5cXSsubm8gZGVidWdnaW5nIHN5bWJvbHMgZm91bmQuXFsuXF0rZG9uZVwuLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCAoYnV0IG5vIHN5bWJvbHMgZm91bmQpIgotCX0KLQktcmUgIkZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCAoZm9ybWF0IG5vdCByZWNvZ25pemVkKSIKLQkgICAgcmV0dXJuCi0JfQotCS1yZSAiRmlsZSBmb3JtYXQgaXMgYW1iaWd1b3VzLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCAoZm9ybWF0IGlzIGFtYmlndW91cykiCi0JICAgIHJldHVybgotCX0KLQktcmUgIiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IgotCSAgICByZXR1cm4KLQl9Ci0JdGltZW91dCB7Ci0JICAgIGZhaWwgIih0aW1lb3V0KSAkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQiCi0JICAgIHJldHVybgotCX0JCi0gICAgfQotCi0gICAgaWYgW2dkYl90ZXN0ICJpbmZvIHRhcmdldCIgIi4qZmlsZSB0eXBlICRiZmRmb3JtYXQiICIiXT09MCB0aGVuIHsKLQlzZXQgZmlsZV9sb2FkZWQgMQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHdyb25nIGZvcm1hdCBmb3VuZCIKLSAgICB9Ci19Ci0KLSMgVGVzdCBpZiBnZGIgY2FuIHJlYWQgc3ltYm9scyBmcm9tIGFuIGV4ZWN1dGFibGUgd2hlbiB0aGUgYmZkIGZvcm1hdAotIyBpcyBleHBsaWNpdGx5IHNldCB2aWEgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdOVVRBUkdFVC4KLQotcHJvYyBiZmRleHBsaWNpdCB7fSB7Ci0gICAgZ2xvYmFsIEdEQgotICAgIGdsb2JhbCBHREJGTEFHUwotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBvYmpkaXIKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZmlsZV9sb2FkZWQKLQotICAgIGdkYl91bmxvYWQKLSAgICBzZXQgZmlsZV9sb2FkZWQgMAotCi0gICAgIyBPbmNlIEdEQiA0LjEwICh0aGUgbGFzdCB0byBsYWNrIGBzZXQgZ251dGFyZ2V0JykgaXMgZm9yZ290dGVuLAotICAgICMgY2hhbmdlIHRoaXMgdG8gdXNlIHNldCBnbnV0YXJnZXQuCi0gICBpZiBbZ2RiX3Rlc3QgInNldCBlbnYgR05VVEFSR0VUPSRiZmRmb3JtYXQiICIiICIiXSE9MCB0aGVuIHsKLSAgICAgICBmYWlsICJzZXR0aW5nIEdOVVRBUkdFVD0kYmZkZm9ybWF0IGluIGVudmlyb25tZW50IgotICAgICAgIHJldHVybgotICAgIH0KLQotICAgIHNlbmRfZ2RiICJmaWxlICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxuIgotICAgIGdkYl9leHBlY3QgewotCS1yZSAiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuICBLaWxsIGl0Lip5IG9yIG4uIiB7Ci0JICAgIHNlbmRfZ2RiICJ5XG4iCi0JICAgIGV4cF9jb250aW51ZQotCX0KLQktcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxbLlxdK2RvbmVcLi4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IgotCX0KLQktcmUgIkludmFsaWQgdGFyZ2V0LiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBleHBsaWNpdCBmb3JtYXQgKGludmFsaWQgdGFyZ2V0KSIKLQkgICAgcmV0dXJuCi0JfQotCS1yZSAiJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IgotCSAgICByZXR1cm4KLQl9Ci0JdGltZW91dCB7Ci0JICAgIGZhaWwgIih0aW1lb3V0KSAkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IgotCSAgICByZXR1cm4KLQl9CQotICAgIH0KLQotICAgIHNldCBmaWxlX2xvYWRlZCAxCi19Ci0KLXByb2MgdGVzdF9wdHlwZV9mdW5jdGlvbnMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0gICAgc2VuZF9nZGIgInB0eXBlIG1haW5cbiIKLSAgICBnZGJfZXhwZWN0IHsKLQktcmUgInR5cGUgPSBpbnQgXFspKFxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7fQotCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGZ1bmN0aW9uIG1haW4iIDsgcmV0dXJuIH0KLSAgICB9Ci0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X2NoYXJfZnVuYyIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIFxbKShcXSsiIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Nob3J0X2Z1bmMiICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXFspKFxdKyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9pbnRfZnVuYyIgInR5cGUgPSBpbnQgXFspKFxdKyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9sb25nX2Z1bmMiICJ0eXBlID0gKGxvbmd8bG9uZyBpbnR8aW50KSBcWykoXF0rIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2Zsb2F0X2Z1bmMiICJ0eXBlID0gZmxvYXQgXFspKFxdKyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGVfZnVuYyIgInR5cGUgPSBkb3VibGUgXFspKFxdKyIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgZnVuY3Rpb24gdHlwZXMiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIGZ1bmN0aW9uIHR5cGVzIgotfQotCi0jIE5vdGUgdGhhdCBwbGFpbiBjaGFycyBjYW4gYmUgZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZC4KLQotcHJvYyB0ZXN0X3B0eXBlX3BsYWluX3R5cGVzIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyIiAidHlwZSA9KFwgdW5zaWduZWRcIHxcIHNpZ25lZFwgfFwgKWNoYXIiIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Nob3J0IiAidHlwZSA9IHNob3J0IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2ludCIgInR5cGUgPSBpbnQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZyIgInR5cGUgPSBsb25nIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2Zsb2F0IiAidHlwZSA9IGZsb2F0IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2RvdWJsZSIgInR5cGUgPSBkb3VibGUiIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIHBsYWluIEMgdHlwZXMiCi0JICAgIHJldHVybgotICAgIH0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIHBsYWluIEMgdHlwZXMiCi19Ci0KLSMgTm90ZSB0aGF0IGlmIGNvbXBpbGVkIHdpdGggcHJlLUFOU0kgY29tcGlsZXJzLCB0aGUgInNpZ25lZCIga2V5d29yZHMgYXJlCi0jIGRlZmluZWQgYXdheSBhbmQgdGhlIHZhcmlhYmxlcyBkZWZhdWx0IHRvIHBsYWluIHR5cGVzLiAgU28gYWNjZXB0IGVpdGhlci4KLQotcHJvYyB0ZXN0X3B0eXBlX3NpZ25lZF90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfc2lnbmVkX2NoYXIiICJ0eXBlID0oXCBzaWduZWRcIHxcICljaGFyIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaWduZWRfc2hvcnQiICAidHlwZSA9KFwgc2lnbmVkXCB8XCApc2hvcnQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfc2lnbmVkX2ludCIgInR5cGUgPShcIHNpZ25lZFwgfFwgKWludCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9zaWduZWRfbG9uZyIgInR5cGUgPShcIHNpZ25lZFwgfFwgKWxvbmciIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgaWYgW2V4cHIgW3N0cmluZyBtYXRjaCAiZWNvZmYtYmlnbWlwcyIgJGJmZGZvcm1hdF0rW3N0cmluZyBtYXRjaCAicHR5cGUgdl9zaWduZWRfY2hhciIgW2xpbmRleCAkaSAwXV1dPT0yIHRoZW4gewotCQlzZXR1cF94ZmFpbCAiKi0qLSoiCi0JICAgIH0KLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIHNpZ25lZCBDIHR5cGVzIgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBzaWduZWQgQyB0eXBlcyIKLX0KLQotcHJvYyB0ZXN0X3B0eXBlX3Vuc2lnbmVkX3R5cGVzIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBkZXRfZmlsZQotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl91bnNpZ25lZF9jaGFyIiAidHlwZSA9IHVuc2lnbmVkIGNoYXIiIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Vuc2lnbmVkX3Nob3J0IiBcCi0JCSAgInR5cGUgPSAodW5zaWduZWQgc2hvcnR8c2hvcnQgdW5zaWduZWQgaW50KSIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl91bnNpZ25lZF9pbnQiICJ0eXBlID0gdW5zaWduZWQgaW50IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X3Vuc2lnbmVkX2xvbmciIFwKLQkJICAidHlwZSA9ICh1bnNpZ25lZCBsb25nfGxvbmcgdW5zaWduZWQgaW50KSIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgdW5zaWduZWQgQyB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgdW5zaWduZWQgQyB0eXBlcyIKLX0KLQotIyBOb3RlIHRoYXQgcGxhaW4gY2hhcnMgY2FuIGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQuCi0KLXByb2MgdGVzdF9wdHlwZV9hcnJheV90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfY2hhcl9hcnJheSIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIFxcXFsyXFxcXSIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfc2hvcnRfYXJyYXkiICBcCi0JCSAgInR5cGUgPSAoc2hvcnR8c2hvcnQgaW50KSBcXFxbMlxcXF0iIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50X2FycmF5IiAidHlwZSA9IGludCBcXFxbMlxcXF0iIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZ19hcnJheSIgInR5cGUgPSAobG9uZ3xsb25nIGludCkgXFxcWzJcXFxdIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2Zsb2F0X2FycmF5IiAidHlwZSA9IGZsb2F0IFxcXFsyXFxcXSIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGVfYXJyYXkiICJ0eXBlID0gZG91YmxlIFxcXFsyXFxcXSIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgQyBhcnJheSB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgQyBhcnJheSB0eXBlcyIKLX0KLQotcHJvYyB0ZXN0X3B0eXBlX3BvaW50ZXJfdHlwZXMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X2NoYXJfcG9pbnRlciIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIFwqIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydF9wb2ludGVyIiAgInR5cGUgPSAoc2hvcnR8c2hvcnQgaW50KSBcKiIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9pbnRfcG9pbnRlciIgInR5cGUgPSBpbnQgXCoiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZ19wb2ludGVyIiAidHlwZSA9IChsb25nfGxvbmcgaW50KSBcKiIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdF9wb2ludGVyIiAidHlwZSA9IGZsb2F0IFwqIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2RvdWJsZV9wb2ludGVyIiAidHlwZSA9IGRvdWJsZSBcKiIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgQyBwb2ludGVyIHR5cGVzIgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBDIHBvaW50ZXIgdHlwZXMiCi19Ci0KLXByb2MgbG9hZGFuZHRlc3QgeyBhcmdzIH0gewotICAgIGdsb2JhbCB2ZXJib3NlCi0gICAgZ2xvYmFsIEdEQgotICAgIGdsb2JhbCBHREJGTEFHUwotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBvYmpkaXIKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZmlsZV9sb2FkZWQKLQotICAgIHNldCBiaW5maWxlIFsgbGluZGV4ICRhcmdzIDAgXQotICAgIHNldCBiZmRmb3JtYXQgWyBsaW5kZXggJGFyZ3MgMSBdCi0gICAgc2V0IGZpeG1lIFsgbGluZGV4ICRhcmdzIDIgXQotCi0gICAgaWYgIVtmaWxlIGV4aXN0cyAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVdIHRoZW4gewotICAgICAgICBwZXJyb3IgIiRvYmpkaXIvJHN1YmRpci8kYmluZmlsZSBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLSAgICBnZGJfZXhpdAotICAgIGdkYl9zdGFydAotICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0gICAgYmZkZGVmYXVsdAotICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAkYmZkZm9ybWF0ICJlbGYtYmlnIl0gdGhlbiB7Ci0JaWYgW3N0cmluZyBtYXRjaCAkYmluZmlsZSAiaTg2MC1lbGYiXSB0aGVuIHsKLQkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgotCX0KLSAgICB9Ci0gICAgYmZkZXhwbGljaXQKLSAgICBpZiAkZmlsZV9sb2FkZWQ9PTEgdGhlbiB7Ci0JdGVzdF9wdHlwZV9mdW5jdGlvbnMKLSAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLQl0ZXN0X3B0eXBlX3BsYWluX3R5cGVzCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV9zaWduZWRfdHlwZXMKLSAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLQl0ZXN0X3B0eXBlX3Vuc2lnbmVkX3R5cGVzCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV9hcnJheV90eXBlcwotICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotCXRlc3RfcHR5cGVfcG9pbnRlcl90eXBlcwotICAgIH0KLX0KLQotIyBSdW4gdGVzdHMgZm9yIGVhY2ggb2YgdGhlIHRlc3QgZXhlY3V0YWJsZXMuCi0jIElmIHRoZSB0aGlyZCBhcmd1bWVudCBpcyAxLCB0aGUgdGVzdHMgd2lsbCBiZSBleHBlY3RlZCB0byBmYWlsLgotIyBXZSBzaG91bGQgZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlIHRlc3RzIGFuZCBiZmQgZm9ybWF0cwotIyBmcm9tIHRoZSBtYWtlZmlsZSBvciBzb21lIG90aGVyIGNvbnRyb2wgZmlsZSAoRklYTUUpLgotCi1sb2FkYW5kdGVzdCBtNjhrLWVsZgkiZWxmMzItbTY4ayIJCTAKLQotIyBJJ20gZ2V0dGluZyBhbiBYUEFTUyBmb3IgZXhwbGljaXQgZm9ybWF0IG9uIHRoaXMgb25lCi1sb2FkYW5kdGVzdCBtNjhrLWFvdXQJImEub3V0LW5ld3NvczMiCQkxCi0KLWxvYWRhbmR0ZXN0IG02OGstYW91dDIJImEub3V0LXN1bm9zLWJpZyIJMAotbG9hZGFuZHRlc3QgbWlwcy1lY29mZgkiZWNvZmYtYmlnbWlwcyIJCTAKLWxvYWRhbmR0ZXN0IGk0ODYtZWxmCSJlbGYzMi1pMzg2IgkJMAotbG9hZGFuZHRlc3Qgc3BhcmMtYW91dAkiYS5vdXQtc3Vub3MtYmlnIgkwCi1sb2FkYW5kdGVzdCBzcGFyYy1lbGYJImVsZjMyLXNwYXJjIgkJMAotCi0jRklYTUU6ICBpODYwIHN1cHBvcnQgaXMgdW5saWtlbHkgdG8gYmUgd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUKLSMgc28gc3VwcHJlc3MgdGhpcyB0ZXN0IHVudGlsIGl0IGlzIHdvcmtpbmcuICAtZm5mCi0jbG9hZGFuZHRlc3QgaTg2MC1lbGYJImVsZjMyLWk4NjAiCQkwCi0KLWdkYl90ZXN0ICJzZXQgZ251dGFyZ2V0IGF1dG8iICIiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k0ODYtZWxmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k0ODYtZWxmLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjMzOGIuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pNDg2LWVsZi51CisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLWJlZ2luIDc3NyBpNDg2LWVsZgotTT9UNSwxQCQhIDAgICAgICAgICAgICAoICBQICEgICAgVygoJCIjMCAgICFcK0AgICAgICAgIzAgKCAgJQotTSAiQCAlMCAxICA4ICAgIFQgICAgLSggJCIgICAgICJAICAgIEggICAgIDQgICAgICAgICAgUCAgIC0wIAotTSAgICAgICAgICAgICAhLCAgICAgICAgICEgICAgICAgICAgISAgICAtICAgICMyICEgQCAgICAgKiA4IAotTSAiQCYgICAlICAgICAhICAgICQgICAhPCFAICA3KTgkIiAgICAgIjQgICAgMiAoICAgPCAgICAgJCAgIAotTSBAICAgKCAmICAiIEVAMCggICAgICcgICAgICAgICAgIVAgICAgICAgICBPPTctUitWUUk4Ql1MOjYpQwotTStHLU8rQyQgICAsICAgICwgICAgIUAgICAgTCAgICAqICAgICAgICAgICAgICAgISAgICAgICAgICAoIAotTSAgICQgICAgICAgICAgNCAgICAjICAgICIgICAgIEQgICAgJyAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgJCAgICI8QEAwKCcgICAgISggICAgKiAgICBJKUAkIiAgICAgIDEgLydfI1AgICAmIjYhIEAkICAgIAotTSQwICsgIUAgICAhPEFAMCggICAgICEkIFw/XD8gICAgSygoJCIkICAgICAyICAgIClAICAgLyI2ISBAIAotTSAgICAkMCNRX1JUICAgIyxAQDAoICAgICAhKCAgICBSICAgIC8oOCQiIDAgICAgMSAgSCAvUCAgICtSIgotTSEgQCAgICAgJEAgICAkRCAgICFERUAwKCAgICAgISQgXD9dPyAgICBAKTgkIiAgICAgIDEgLydfICVdQwotTTsmNUE7RzVQICVdRTtGMCA3VjVOPUZFUjtWWCA3VjVUOTdBVCAmJVQ5N0FJPSAhPzk2MUE9JiQgOTdBSQotTT0gIT87JkVCN1c5RTxHLUk7VlggN1VdRjwnLVQ4NylUICVdJzMkXSIwNFE/M1Q5JjRUNTQ3VTEhMERRJQotTTdQIT8xJUUuMDRVKTBQIE89Ny1SK1ZRSThCXUw6NilDK0ctTytDJCAgJyI2ISBAJyAwICA9KTgkIiA8JQotTSAgIVhFQDAoIVBEICAnUjYhIEAnIVAgIFBQICAgL1xVOik4JCIvXEU7KTgkIiAgICAgI18pNyI2ISBBSAotTSAgICAgLkdAX19fX19SNVRFQDAoOiBAICAgI0lUL19fX19cRT4pOCQiJkAwICAgIFo8I19fX19fKTdSNgotTSEgQUgmICAgIC5GUF9fX186QCFKIChPTDRLQjxAQDAoQTwhVCM2QjxAQDAoWis7X19fXiNRIDJYQCk4JAotTSIoNyA9IDdIST9fX19WQFhBQDAoWilPX19fXisxMEItNSg0MEIxNUBFQDAoNEhVNSMlKTBaJV9fX19fSAotTUNPX19fXkAhIDAgIEBcMCw0LkIwX19fXzpAIlggMCAgIClIICAgICAhUCNUUF5MJixcI0sgLEcjNThPTAotTVpfNjBEKSNLIUMvIFpQIylQVTYrWy5PVUQpIjBaUDhTUC5MIFI8LTVCXlNLXTkiMEQuTCYsXCNLICxHIwotTTU4T0xaXzYwRCkjSyFDLyBaUCMpUFU2K1suT1VEKSIwWlA4U1AuTCBSPC01Ql5TS105IjBELkwmLFwjSwotTSAsRyM1OE9MWl82MEQpI0shQy8gWlAjKVBVNitbLk9VRCkiMFpQOFNQLkwgUjwtNUJeU0tdOSIwRC5MJgotTSxcI0sgLEcjNThPTFpfNjBEKSNLIUMvIFpQIylQVTYrWy5PVUQpIjBaUDhTUC5MIFI8LTVCXlNLXTkiMAotTUQuTCpXMDUgQUAwKFpQIylQVTYrWy5PUUQpIjBaUEs9ITRCJiEgQ0sgLEcjNThPTFpfJjBEKSNJXFAkIAotTSApIyYhP0I3ISBAIFFANVRFUDAoIDw4JS5JPCQiIClGUVA1TEVQMCggUCFGUVA1PEVQMCghICFGUVA0JAotTUVQMCghMCMnITEiNyEgQCYgICAgUVA3UEVAMCghUCAgICw8JV0pOCQiIEAgICAjJyE2QjchIEApICAgIAotTVFQN1xFQDAoIkAgICAsPCU+KTwkIiBMICAgIkE0KDgkIiosXEVQMChINUImISBCQyMpPCQiKiU0QUAwKAotTUhQQjchIEJAXik8JCIqKzRFUDAoSCcyNyEgQkIuKTwkIiogWkVQMChIT0I2ISBBRkg2UjchIEFGSFdSNwotTSEgQUZINVI3ISBBRkhUQjchIEFGSDAyNyEgQUZIWCI3ISBCQSQpPCQiKiw8RVAwKEg/IjYhIEJDQyk8JAotTSIqJ1RFQDAoSFUiNyEgQkE6KTwkIiovUEVQMChIP1I2ISBCQzApPCQiKiVYRVAwKEhWIjchIEJBLyk8JAotTSIqL0BFUDAoSDBSNyEgQkMrKTwkIiokKEVQMChIUkI3ISBDJyE4MjchIENYRVAwKFFQN0xFUDAoPSk8JAotTSIsPCVCKTwkIiNKNyEgQychPkI3ISBBTEVQMChRUDY8RVAwKDcpPCQiLDwlICk8JCIgMjchIEMnITRSNwotTSEgQDBFUDAoUVA2NEVQMChcKTgkIiw8JTYpPCQiLzI2ISBDJyE3IjchIEFIRVAwKFFQNzxFUDAoXyk4JAotTSIsPCUmKTwkIidCNyEgQychPUI3ISBAXEVQMChRUDZARVAwKCIpPCQiLDwlKSk8JCIgKCAgICMnITEyNwotTSEgQCIgICAgUVA2MEYgMCggMCAgICw8JV8pPCQiICQgICAiQUYpPCQiKiwgRiAwKDlKJjxGIDAoOUouNAotTUYgMChSPC01Ql5TSSFPW19fWSAgICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxBIgotTSAgICAgICAgOjQgICAgICAgICAgICgiNiEgQCAgICAgICAgICAqKiIhIEJSQEAwKFBIKCQiLSoiISBAIQotTSAgICA6ICAgICBQICAgIihAQDAoIzAgICAjQiYhIEAkICAgIFooICQiIDQgICAjTEAwMCghQCAgICJSIQotTSEgQCogICAgPlAgICAgTCAgICAwICAgICUwICAgICAgICAgIyAgICA5KTgkIiAoICAgIEAgICAgJSAgIAotTSAhJCAgICA3ICAgIDooKCQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCAgICAgICAgIAotTSAgICAgIDAgXD9cICAgICBVKCAkIiAgICAgICMgICQgICAgICAuQiAhIEAgICAgICBQICIgICAgICAgTAotTUAwMCggICAgICAsICBQICAgICAgWygkJCIgICAgICAjICAwICAgICAgJkIiISBAICAgICAgUCAlICAgIAotTSAgIihAQDAoICAgICAgLCAhQCAgICAgIEMoKCQiICAgICAgIyAgPCAgICAgIC1SIiEgQCAgICAgIFAgKAotTSAgICAgICBYQUAwKCAgICAgICwgIjAgICAgICAvKDgkIiAgICAgICMgIEggICAgICAlUjYhIEAgICAgIAotTSBQICsgICAgICAhREVAMCggICAgICAsICMgICAgICAgQCk4JCIgICAgICAjICBUICAgICAgLyI2ISBAIAotTSAgICAgUCAuICAgICAgICAgICAgICAgICAgLCAjUCAgICAgICAgICAgICAgICAgIyAhICAgICAgICAgIAotTSAgICAgICAgIFAgMSAgICAgICAgICAgICAgICAgICwgJEAgICAgICAgICAgICAgICAgICMgISwgICAgIAotTSAgICAgICAgICAgICBQIDQgIEggICAgICAgICAgICAgICAwIFw/XDEgICAgICAgICAgICAgICAkIC8nXwotTSYgICAgICAgICAgICAgICAhICNRX1IwICAgICAgICAgICAgICAgMCBcP1xMICAgICAgICAgICAgICAgJAotTSAvJ18tQCAgICAgICAgICAgICAgISAjUV9TVCAgICEsQFAwKCMwICAgISggIiAhKSAgICBcKTgkIiAwIAotTSAgIDEgIFggNUAgICAvMjYhIEAkICAgICQwIC4gJjQgICAgWEFAMCggICAgICEoICIwIUsgICAgXik4JAotTSIgKCAgICAxICBYIEAwICAgIzIkISBAISBAICAkQCAoICg4ICAgI1xFQDAoISAgICAhJCAjQCI0ICAgIAotTSApPCQiIDAgICAgMSAgWCBLMCAgIClSIiEgQDwgICAgJEAgICArOCAgICJERiAwKCAgICAgISQgXD9eWwotTSAgICAhKTwkIiAoICAgIDEgIFggUyAgICApUiMhIEAtICAgICRAICggLiggICAgKEVQMCgiICAgICEkIAotTSNAI0sgICAgJCk8JCIgMCAgICAxICBYIFwwICAgLVIiISBAICAgICAkQCAoIC9AICAgIDRFUDAoISAgIAotTSAhJCAjQCAjIDAgIDgpOCQiIDAgICAgMSAgTCAjICQgICFCNyEgQCQgICAgJDAgLiAiMCEgICA8RVAwKAotTSIgICAgISQgI0AgUCAwICApKTwkIiAwICAgIDEgIFggLiAkICAlUiMhIEAtICAgICRAICggJEwhICAgSAotTUVQMCgkICAgICEkICNAITogMCAgNyg4JCIgICAgICAxIC8nXzgwJCAgI0I3ISBAIiAgICAkMCAuICc0IQotTSAgIFpFUDAoIDAgICAhJCAjQCIlIDAgIC8pPCQiIDAgICAgMSAgWCBDMCQgICQiNyEgQCggICAgJDAgLgotTSAqJCEgICJMQEAwKDAgICAgISggICAiSCAwICA4KTgkIiAwICAgIEEgIEwgTCAkICAtUiMhIEAtICAgIAotTSRAICggK1AhICAjXEBQMCgjMCAgICEoICIgIzEgMCAgMik8JCIgMCAgICAxICBYIFlAJCAgJFI3ISBAJAotTSAgICAkMCAuIC8wISAgI1BFQDAoICAgICAhJCBcP19bIDAgID8oLCQiIFQgICAgMiAgQCAiICggICUiNwotTSEgQCggICAgJDAgLiAhVCIgICE4RVAwKCEgICAgISQgI0AgVCBAICBLKCwkIiBUICAgIDIgIEAgL1AoIAotTSAlUjchIEAiICAgICQwIC4gJFgiICAgLEEgMCgkMCAgICEoICIgITsgQCAgUygoJCIgICAgICAyICAgIAotTTggKCAgJiI3ISBAKCAgICAkMCAuICc4IiAgIUhFUDAoISAgICAhJCAjQCFdIEAgIDspPCQiICggICAgMQotTSAgWCBBMCggICciNyEgQCQgICAgJDAgLiApMCIgICFURVAwKCAwICAgISQgI0AiQiBAICA+KTwkIiAwIAotTSAgIDEgIFggTEAoICAnUjchIEAkICAgICQwIC4gLCAiICAiIEVQMCghICAgICEkICNAIzcgQCAgLyg4JAotTSIgMCAgICAxICBIIFkgKCAgJE4jISBAICAgICAkQCAoIC5QIiAgIiRFUDAoISAgICAhJCAjQCNbIEAgIAotTUIpPCQiIDAgICAgMSAgWCAkUCwgIChSNyEgQCggICAgJDAgLiAiOCMgICJcQEAwKCAgICAgISggICAgUAotTSBQICBFKTwkIiAwICAgIDEgIFggMTAsICApQjchIEAkICAgICQwIC4gJFAjICAhREVAMCggICAgICEkIAotTVw/XUIgUCAgRyk8JCIgMCAgICAxICBYID4wLCAgKiI3ISBAJCAgICAkMCAuIChIIyAgITxFQDAoISAgIAotTSAhJCAiUCI8IFAgIEkpPCQiIUAgICAgMSAgWCBJQCwgICtSNyEgQDggICAgJDAgLiArICMgICM0RVAwKAotTSBAICAgISQgI0AiXSBQICBWKTwkIiAwICAgIDEgIFggUzAsICAtUjchIEAkICAgICQwIC4gLiwjICAgQAotTUEgMCgkMCAgICEoICIgI1EgUCAgTygsJCIgVCAgICAyICBAICBQMCAgKCI2ISBAICAgICAkMCNRX1BQJAotTSAgI0BFUDAoIiAgICAhJCAjQCA6ISAgIFopPCQiIDAgICAgMSAgWCAqQDAgIC5SIyEgQC0gICAgJEAgKAotTSAjVCQgICNMRVAwKCEgICAgISQgI0AhMyEgICBcKTwkIiBAICAgIDEgIFggOCAwICAoQiIhIEAgICAgIAotTSRAICYgJjgkICAjWEVQMCggMCAgICEkICNAIU0hICAgXyk8JCIgMCAgICAxICBYID0wMCAgJlIjISBALQotTSAgICAkQCAoIChIJCAgICBGIDAoRCAgICAhJCAjQCIxISAgIEMoLCQiIFQgICAgMiAgQCBJMDAgICkiOAotTSEgQCQgICAgJDAgLiAqXCQgICI0RiAwKCIgICAgISQgI0AiWCEgICBTKCwkIiBUICAgIDIgIEAgUyAwIAotTSApUjghIEAoICAgICQwIC4gICFJLSNAVitGNUw5QCFDPEcwUStHLCA4VylUOjJZUyAnOUE7JzVFPFJVOAotTT0iWUMgJj1EOEZVRStGLCA8VkE/OSYlVDgyWUMgJi1SPSZYTjxQIVY3Vi1IODcpPzlHNU44UCFWN1ctSQotTTlWWUU5JV1JO0cwID1FXVU7Ry1JOVZZRTklXUk7RzAgN1Y5STtGRCA9RV1VO0ctSTlWWUU5JV1DOiYlUgotTTdWJVI8RiVZICZVQTo2WCA9RV1TOjY9Tjk2MT87Jl1OOVAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTwotTTo2WVQ5NyggN1YtTDk2JU49NyAgN1Y1TjkgIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVCAnOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzlHNU44UCFWN1YxTz02KUw5MCFWN1ZFTj0gIT88VzFBPEcwIDtGXU48JylJOzYlUgotTT4wIT85NllWOjcpTztAIVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdWRU49JV1BPEcpQQotTT4wIVA8RkVNODcpWSAnOT88VkVHO0Y1RDdWLUg4Nyk/OUc1TjhQIVY3VjFPPTYpTDk1XUE8RylBPjAhPwotTTk3MUU+JzAgPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdWLUg4NyggPUVdRgotTTsmXUE9ICFWN1ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZICYlVDk3QUk9ICFFO0c5STxGXU4gJzk/OyZdTgotTTlVXUY9NllDICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUgotTTxGJVkgJzk/OjZZVDdXIU86NllUOTcoIDdWNUQ4NzFBICc5PzxWQU88RzE/OUc1TjhQIVY3VzVOPFZFRwotTTtGNUQ3VkVOPSVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnOT86NllUN1Y5VQotTTtGLCA9RV1TOjY9Tjk2MT88VkFPPEcwID1FXUY7Jl1BPSVdRj02WUMgJjVYOjcwID1FXVU7Ry1JOVZZRQotTTklXUw7VllHN1YlUjxGJVkgJzk/OyZdTjlQIVY3Vy1IO1cpVCAnOT87Jl1OOVVdUDtWRU49JjVSICc5PwotTTxWRUc7RjVEN1YtSDg3KCA9RV1VO0ctSTlWWUU5JV1MO1ZZRyAnOT88VkFPPEcxPzg3KVI4N0QgPUVdVQotTTtHLUk5VllFOSVdUzomXVI9JV1BPEcpQT4wIT87JkVCN1c5RTxHLUk7VlggN1ZVQztXNU49ICFWN1YtSAotTTg3KT88Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAhVjdXLUk5VllFOSVdSQotTTtHMT84NylSODdEIDdVXUY8Jy1UODcpVCAnOT88VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJy0/OyZFTgotTTpQIT8xVFEvMEQlLDdUXSYxRS0lNSVdNDA0KSwxNVwgPUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRQotTTxAIVY3VjFPPTYpTDk1XVA7VkVOPSY1UiAlXT87Jl1OOVYxTz02KUw5NV1VPFY1RCAnOT88VzFSPTYtVAotTSwwIVY3Vy1UPEc1Qz0jKCA9RV1DOiYlUjdWJVI8RiVZICc5PzlGUU84NzE/PCZdSTtHMUU8QCFWN1ctSQotTTlWWUU5JV1MO1ZZRzdXIU86NllUOTcoID1FXUQ7VzVCOyY1PzlHNU44UCFWN1ctSTlWWUU5JV1JO0cxPwotTTlHNU44UCE/MSVFLjA0VSkwUCFWN1Y5TDtWJVQ3ViVSPEYlWSAnOT88VkFPPEcxPzwmXUk7RzFFPEAhVgotTTdXLUk5VllFOSVdTDtWWUc3VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJzk/OyZdTgotTTlVXUE8RylBPjAhPzo2WUk9ICFWN1YtSDg3KCA4VlFVO0ZNRTxAIVY3VzVOPFZFRztGNUQ3Vi1IODcpPwotTTlHNU44UCFVN1ZRSTtGTCA9RV1TOjY9Tjk2MT88VkFPPEcxPzlHNU44UCFTPCZdUj0nLUM4NyggPUVdVQotTTtGRU87QyggPUVdVTtHLUk5VllFOSVdSTtHMT85RzVOOFAhVjdXNU46Nl1OICAgTjo2WVQ5NylQICJZSAotTTg3LUggIllEPjZZUz42VCArRjFZO0ctVDxAIE48RjVMK0chTD0gIE46NllJPSAgTjwmUVQgIllUOTdBVAotTSAiWUY6NllJICJZUjtWMUE9JiQgK0YxQT0mJCArRj1PPSAgTjknRU44NlVJOFAgTjhHLVMgIllTPjZVVAotTTg2KCArRy1UPEcxQThAIE48VkFTPScpVDg2KCArRi1POzZVRTtHMCArRjFFOEc1RyAiWUw6NllFICQgSAotTShSRUw6NilDKzZEUy4jOFo7JkVCOFJVSSxTQFYrVi1TPTJdQzxHMFErRywpLDJYUS4gIUE8U0hAKiUtIwotTTEkNEkoIzROLCIgQCwjME8sM0RPLjMgIDAiQEMqNlFJOEYsTTozLFgtQ0lDPFc0TzhXKVQ6MllTIjMkTgotTSxAIUE8U0hAKiUtIzEkNEkoIzROLCIgQCwjME8sM0RPLjMgIDAiQEMqNlFJOEYsTTwmXVI9I0lHOTZYTwotTT1GJUw9NjVTKzVBVCtGLCksMlhTICQgSChSRUw6NilDLkZFTjhSXVM+NllPO0dFTTxSWUgiMyROLFMsIAotTTAiQEMqNkFFODYwWjs2JVQ6IllIIjMoTiwzJE4sMlhSLVAhQThWXU08I0hAKiUtIzEkNEkoIzROLCIgQAotTSwjME8sM0RPLjMgIDtXIVQ6NlRaKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZK1NEUCAmJVMuQiBINFQtJAotTTEyREAtMlhQKCIgUC0iXFEuMlxZLCAhQThWXU08I0hAKiUtIzEkNEkoIzROLCIgQCwjME8sM0RPLjMgIAotTTg3LFooIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkrU0RQICQgSChSRUw6NilDKzZEUy4jOFo5VjVOK1ctSAotTTdWMUE9JiROOFBEUStDLCA4Ni1POzcgWigiQTMwVDElKjIgVStDIEAoIyBUK1MkWStTRFAgJl1QPSZFTQotTS5CIEg0VC0kMTJEQC0yWFAoIiBQLSJcUS4yXFksICFBPFNIQColLSMxJDRJKCM0TiwiIEAsIzBPLDNETwotTS4zICAwIkBDKjZRSThGLE06MyxYLUNJTDo2KUMrNkRTLiM4TzhXLVUrVi1SPSZYTjxQRFErQzQgODcsWgotTSgiQTMwVDElKjIgVStDIEAoIyBUK1MkWStTRFAgIiFMOSIgWigiQTMwVDElKjIgVStDIEAoIyBUK1MkWQotTStTRFAgICAgK0AgICAhJCAkQCFQJUAgIC4gIUc5JilNOTJZQyAjOCEgMCAgICEkITMoLCQiIiQhLTg4JAotTSIgOCEgICAgICFUICAgIDMgISggM0AkICAjQCA9JV1TPScpVThXMCBNQCA4ICAgICpAICAgIFQgJEAhVQotTSAgICAuICFWN1YtSDg3KT87NjVNOEY1UiAlNCAgMCBDICA4ICEgICAgICAnKlAgICAgVCAkQCJAICAgIAotTS4gIVY3Vy1IO1cpVDdWVUU7NilFPEAhNSAgMCAoUCAmICAwIiAgICAhUkQgICAgLSAhKCBSMCAgICNAIAotTT1FXUk7RzE/OzY1TThGNVIgJTQgIVAgQyAgOCAhIDAgICAgJypAICAgIFQgJEAjUyAgICAuICFWN1ZRTwotTTtGPT87NjVNOEY1UiAlNCAiQCBDICA4ICEgQCAgICAnKlAgICAgVCAkQCA+IDAgIC4gIVY3VjlMO1YlVAotTTdWVUU7NilFPEAhNSAgWCAoUCAmICAwLCAgICAhUlAgICAgLSAhKCAyQCQgICNAID1FXUQ7VzVCOyY1PwotTTs2NU04RjVSICU0ICNQIEMgIDggISEgICAgICchICAgICFMICAgIDMgISggOyAoICAjQCArQyFGODZNRQotTSArOCAmICAgICJIICAgIC0gISggRFAkICAjQCA9RV1DOiYlUjdWVUU7NilFPEAhNSAgJCAoUCAmICAwIAotTSAgICAhUkwgICAgLSAhKCBPQCQgICNAID1FXVM6Jl1SPSVdTTk2VUI5NyggNTAgJCAiLCAhQCAkIEAgIAotTSAgPEkgICAgIzAgMiAuPCEgICBYICc5Pzo2WVQ3VlVFOzYpRTxAITUgIDwgKFAgJiAgMCQgICAgIVJIIAotTSAgIC0gISggJDAoICAjQCA9RV1MO1ZZRzdWVUU7NilFPEAhNSAgSCAoUCAmICAwKCAgICAhUkwgICAgLQotTSAhKCAvICggICNAID1FXUY7Jl1BPSVdTTk2VUI5NyggNTAgLiAiLCAhQCAkIyAgICAgPEwgICAgIzAgMgotTSAmQCIgICBYICc5PzkmXVU4RlFFN1ZVRTs2KUU8QCE1ICBcIChQICYgIDAwICAgICFQMCAgICA8ICAgIAotTSVQIDIgKEwjICAgWCAnMT89NllJO1ZYIE1AICggICAgKkAgICAgVCAkQCJSIEAgIC4gIVY3Vi1IODcpPwotTTs2NU04RjVSICU0ICAwIEMgIDggISAgICAgICcqUCAgICBUICRAIz0gQCAgLiAhVjdXLUg7VylUN1ZVRQotTTs2KUU8QCE1ICAwIChQICYgIDAgICAgICFSRCAgICAtICEoICFALCAgI0AgPUVdSTtHMT87NjVNOEY1UgotTSAlNCAhUCBDICA4ICEgICAgICAnKkAgICAgVCAkQCBQIFAgIC4gIVY3VlFPO0Y9Pzs2NU04RjVSICU0IAotTSJAIEMgIDggISAgICAgICcqUCAgICBUICRAITsgUCAgLiAhVjdWOUw7ViVUN1ZVRTs2KUU8QCE1ICBYIAotTShQICYgIDAgICAgICFSUCAgICAtICEoIEFQLCAgI0AgPUVdRDtXNUI7JjU/OzY1TThGNVIgJTQgI1AgQwotTSAgOCAhICAgICAgJyEgICAgIUwgICAgNyAhKCBKMDAgICNAICtDJUY4Nk1FICs4ICIgICAgIkggICAgLQotTSAhKCBUICwgICNAID1FXUM6JiVSN1ZVRTs2KUU8QCE1ICAkIChQICYgIDAgICAgICFSTCAgICAtICEoIAotTV5QLCAgI0AgPUVdUzomXVI9JV1NOTZVQjk3KCA1MCAkICIsICFAICQgICAgICA8SSAgICAjMCAyICIwJAotTSAgIFggJzk/OjZZVDdWVUU7NilFPEAhNSAgPCAoUCAmICAwICAgICAhUkggICAgLSAhKCAzQDAgICNAIAotTT1FXUw7VllHN1ZVRTs2KUU8QCE1ICBIIChQICYgIDAgICAgICFSTCAgICAtICEoID4wMCAgI0AgPUVdRgotTTsmXUE9JV1NOTZVQjk3KCA1MCAuICIsICFAICQgICAgICA8TCAgICAjMCAyICo0JCAgIFggJzk/OSZdVQotTThGUUU3VlVFOzYpRTxAITUgIFwgKFAgJiAgMCAgICAgIVAwICAgIEogICAgIUAgMiAtPCQgICBYICc5PwotTThWQUE8RV1GPTZZQyAlNCAgMCAxIDRSIyEgQEEgNUYjISBAJCAgICAsMCAgICA4ICRAICwhMCAgLiAhVgotTTdXLUk5VllFOSVdQzomJVI3VjlVO0YsIDUwICIgISQhNygsJCIiJCE6OCwkIiAwICAgIFMgICAgIUAgMgotTSAkLCUgICBYICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAlNCAgUCAxIDZSIyEgQEEgN0YjISBAJAotTSAgICAqUCAgICA4ICRAIVIhMCAgLiAhVjdXLUg7VylUN1Y5VTtGLCA1MCAkICEkIT8oLCQiIiQhQjgsJAotTSIgMCAgICBSICAgICFAIDIgKkAlICAgWCAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA1MCAlICEkIQotTUMoLCQiIiQhRjgsJCIgMCAgICBUICAgICFAIDIgLiAlICAgWCAnOT89NllTOjY9Tjk2MT88VkFPPEcxPwotTTlHNU44UCE1ICA4ICQwJjxAUDAoKDAmSUBQMCghICAgICJEICAgICYgISggIzA4ICAjQCA9RV1JO0cxPwotTTlHNU44UCE1ICA8ICQwJkxAUDAoKDAmWUBQMCghICAgICMgICAgICYgISggMDA4ICAjQCA9RV1TOjY9TgotTTk2MT86NllUN1Y5VTtGLCA1MCAoICEkIU8oLCQiIiQhUjgsJCIgMCAgICBSICAgICFAIDIgJzwmICAgWAotTSAnOT89NllTOjY9Tjk2MT86NllUN1Y5VTtGLCA1MCApICEkIVMoLCQiIiQhVjgsJCIgMCAgICBKICAgIAotTSFAIDIgKjQmICAgWCAnOT87Jl1OOVVdRj02WUMgJTQgIkAgMSA9UiMhIEBBID5GIyEgQCQgICAgLDAgIAotTSAgOCAkQCM6IUAgIC4gIVY3Vy1JOVZZRTklXUw7VllHN1Y5VTtGLCA1MCArICEkIVsoLCQiIiQhXjgsJAotTSIgMCAgICBTICAgICFAIDIgISQnICAgWCAnOT89NllTOjY9Tjk2MT87Jl1OOVVdRj02WUMgJTQgIyAgMQotTSA/UiMhIEBBIDBGJCEgQCQgICAgKlAgICAgOCAkQCEgIVAgIC4gIVY3VjlMO1YlVDdWOVU7RiwgNTAgLgotTSAhJCEjKDAkIiIkISc4MCQiIDAgICAgTCAgICAhQCAyICcgJyAgIFggJzk/OSZdVThGUUU3VjlVO0YsIAotTTUwIC8gISQhKCgwJCIiJCEsODAkIiAwICAgIDUgICAgJTAgMiAqWCcgICIjICA0ICA+SCcgICA1ICAgIAotTSEwIDIgKUgnICAiIyAgNCAgPkgnICAgMCAgICAhMCAyICpIJyAgITUgIDwgISAgICAjUCAgICAhICEoIAotTVpAPCAgKTQgICAiQyAiQCAgIEAgICAgICAgICAgICAgIiAgICAgICAgMCAgICAgKCAgICAgICAiICAgIAotTSInKCArQCAgICFEICAgIDMgISggPlBAICAjQCA7JkVOOlAiViApQCAgICBGICAgICMwIDIgIkQoICAgWAotTSAmWUU+JzAgQFAgJSAgJ0ohUCAgKFAgJiAgMCAgICAgIVJIICAgIC0gISggNFBAICAjQCA7JkVOOlY5VQotTTtGLCBAUCAlICAlUCFQICAoUCAmICAwJCAgICAhUjAgICAgLSAhKCA9UEAgICNAIDxXMVU5RjggPEAiTgotTSFQICAoUCAmICAwKCAgICAhUDAgICAgNSAgICAlMCAyICtEKCAgIiMgIDQgID5IJyAgIDUgICAgITAgMgotTSAqNCggICIjICA0ICA+SCcgICAwICAgICEwIDIgKzQoICAhNSAgPCAhICAgICNQICAgICEgISggXTBAIAotTSApNCAgICJDICJAICAgQCAgICAgICAgICAgICAiICAgICAgICAwICAgICAoICAgICAgICIgICAgIicoIAotTStAICAgIVAgICAgNyAhKCBCMEQgICNAID0nNT87JkVOOlAiViApICAgICBGICAgICMwIDIgIzwpICAgWAotTSAmWUU+JzAgQFAgJSAgJ0ohUCAgKFAgJiAgMCAgICAgIVJIICAgIC0gISggODBEICAjQCA7JkVOOlY5VQotTTtGLCBAUCAlICAlWyIgICAoUCAmICAwICAgICAhUjAgICAgLSAhKCBBMEQgICNAIDxXMVU5RjggPEAiWQotTSIgICAoUCAmICAwICAgICAhUDAgICAgWiAgICAhICAyICw8KSAgIFggIlhSOUYlSzkwIlYgIDAgICAjUwotTSAhTCAgQCAgICYpTD02NCAgMCAgICY9Ujk2NU4gICAgICAhUjk2MCAhICAgICNYICAgICQgISggIjBIIAotTSAjQCA4Vl1MO1cpUyArOCAhICAgIC8sICdQICIgICAgPCZFTjpQICEgICAgPCc1UjwmUUUgICAgICAhWQotTTk2UUw7VzwgISAgICAjKCAgICAkICEoIC9QSCAgI0AgK0MtRjg2TUUgKzggISAgICAvLCAkUCAhICAgIAotTTlGXVI5ICAgICAgIDhWQUU9R0QgISAgICAjJCAgICAkICEoID0gSCAgI0AgOFYlUjxQIlYgIDAgICAjUwotTSAhMCAgMCAgICchTzxHLUM6JjQgICAgICAmKU09UCAkICAgICxAICAgIDAgJEAiSiJAICAuICBOLSY5QQotTTpWNCBNQCAkICAgIFxQIDMgICQgICAhNDRFNSUgICAgICAhJjA0UTMxMCAkICAgICcgICAgITggJEAjJgotTSJAICAuICFCO1ZdTDk2JU4gJyggPSBIICAjJCAgICAkICEoIF5QSCAgI0AgOEc5QTsnLCBNQCAkICAgIAotTVxQIDMgICQgICAhVDxHNUUgICAgICAhRjg2UVM5MCAkICAgICcwICAgITggJEAgOCJQICAuICFCO1ZdTAotTTk2JU4sQCFSICw4KiAgISYgICAgISAgMiAmKCsgICBYICZVSTxWXVI5JjVSOTYwIE1AICQgICAgXFAgQwotTSAgLCAgICFUOicpRTkwICAgICAgPkY1UjtQICEgICAgO1ZZRSAgKCAgICFUPVZcICEgICAgIiwgICAgJgotTSAhKCBCMEwgICNAIDs2JUk7QCE1ICA8ICQwJFRBIDAoKDAkVUFAMCghICAgICI8ICAgICcgISggTCBMIAotTSAjQCA8VyFPPEcxUzhWJVIgJyggL1BIICAiLCAhMCAjRClAJCIiNCAgICAnICEoIFUwTCAgI0AgOFZRVQotTTtGTUU8QCFSICBEKiAgIEMgIDQgIF9SNyEgQEggICAgIVAgMiAvVCsgICBYICZZTztHIVI6NlVBPEdEIAotTTxAIyciMCAgKFAgJSAgLDRFUDAoKTAgICAgPCAkQCBCIyAgIC4gIVA8RkVNODcpWSAnKCBCMEQgICIsIAotTSEwICMpKTwkIiIwICAgICcgISggMUBQICAjQCA9NV1MOjZZSyAnKCBdMEAgICIsICEwICMgKUAkIiI8IAotTSAgICcgISggOzBQICAjQCA8VV1MOjZZSyAoLCAhMCAhWkA8ICAiLCAhMCAjRik8JCIiOCAgICAnICEoIAotTURQUCAgI0AgPUVdVTtGRU87QyggPEAiKyBQICAoUCAlICAuNEYgMCgpMCAgICA8ICRAIlgjICAgLiAhVgotTTdXNU46Nl1OICcoIDsgKCAgIiwgITAgI0cpQCQiIjwgICAgJyAhKCBXUFAgICNAID1FXVM9JylVOFcwUgotTSAnKCAzQCQgICIsICEwICNPKTwkIiI8ICAgICcgISggIUBUICAjQCA9RV1TPScpVThXMFEgJyggK0AgIAotTSAiLCAhMCAjSSk8JCIiXCAgICAnICEoIC0wVCAgI0AgPUVdRDtXNUI7JjU/PCZdSTtHMUU8QCFDICAsIAotTSAwXCAoUCAlICAuQEVQMCgrQCAgICA8ICRAIUMjMCAgLiAhVjdWOUw7ViVUN1chTzo2WVQ5NyggOFAgIwotTSAgJC4gIiwgITAgI1YpPCQiIzggICAgJyAhKCBGMFQgICNAID1FXVU7Ry1JOVZZRTklXUw7VllHN1chTwotTTo2WVQ5NyggOFAgIyAgJCwgIiwgITAgIyYpPCQiIzAgICAgJyAhKCBTMFQgICNAID1FXVM6Nj1OOTYxPwotTTsmXU45VV1QO1ZFTj0mNVIgJiwgIFAgISJQIEMgIDQgIF1SNyEgQE0gICAgIVAgMiAvSC0gICBYICc5PwotTTsmXU45VV1QO1ZFTj0mNVIgJiwgIFAgISJAIEMgIDQgIFciNyEgQFUgICAgIVAgMiAiXC4gICBYICc5PwotTT02WVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KCA4UCAjICAkKSAiLCAhMCAjNik8JCIjLCAgICAnICEoIAotTThAWCAgI0AgPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoIDhQICMgICQoICIsICEwICNFKTwkIiJQIAotTSAgICcgISggQ0BYICAjQCA9RV1JO0cxPzwmXUk7RzFFPEAhQyAgLCAgMDwgKFAgJSAgLSxFUDAoLVAgIAotTSAgPCAkQCMlI0AgIC4gIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoIDhQICMgICQmICIsIAotTSEwICMgKTwkIiM0ICAgICcgISggXkBYICAjQCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhQwotTSAgLCAgMDQgKFAgJSAgLjxFUDAoK0AgICAgPCAkQCBII1AgIC4gIVY3Vy1IO1cpVDdXIU86NllUOTcoIAotTThQICMgICQkICIsICEwICNaKTwkIiM4ICAgICcgISggN0BcICAjQCA9RV1VO0ctSTlWWUU5JV1DOiYlUgotTTdXIU86NllUOTcoIDhQICMgICQjICIsICEwICNCKTwkIiMwICAgICcgISggREBcICAjQCA9RV1TOjY9TgotTTk2MT84VkFBPEVdUDtWRU49JjVSICYsICBQICEgQCBDICA0ICBeUjchIEBNICAgICFQIDIgK1wvICAgWAotTSAnOT84VkFBPEVdUDtWRU49JjVSICYsICBQICEgMCBDICA0ICBYMjchIEBEICAgICAwIDIgLiwvICAiNQotTSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAjUCBMICAgICFQIDIgIFwwICAgWCAnOT85Jl1VOEZRRQotTTdWJVI8RiVZICcoIE9QXCAgIiwgITAgIyopPCQiIjAgICAgISAhKCAsUSAgICk0ICAgIkMgISAgICBAIAotTSAgICAgICQgICAgKDUwIC4gIkwgICAgJyAhKCA3QSAgICNAID1FXUY7Jl1BPSVdQTxHKUE+MCFSICBcMAotTSAgIEMgIDQgIF4iNyEgQEQgICAgIDAgMiAoKDAgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0IAotTSMgIFMgICAgIVAgMiArNDAgICBYICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4wIVIgJVgwICAgQwotTSAgNCAgViI3ISBARCAgICAgMCAyIC1EMCAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgIlAgUQotTSAgICAhUCAyICBIMSAgIFggJzk/PFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgPEAiVSQgICAoUCAlICAtIAotTUVQMCgpICAgICAkICRAIE4kMCAgRTAgICAqLCAkICAgIiAgICAgICAgMCAgICBBNSAgSCAqQCAgICA8IAotTSRAITgkMCAgLiAhVjdWUU87Rj0/ODcpUjg3RCA8QCAqJDAgIChQICUgIC9QRVAwKCkgICAgICQgJEAhXAotTSQwICBFMCAgICosICQgICAiICAgICAgICAwICAgIEE1ICBEICxAICAgIDwgJEAiTiQwICAuICFWN1c1TgotTTxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhUiAlQDEgICBDICA0ICBVIjchIEBEICAgICAwIDIgLSgxICAiNQotTSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAiICBQICAgICFQIDIgICgyICAgWCAnOT88VkVHO0Y1RAotTTdWRU49JV1BPEcpQT4wIVIgKlgxICAgQyAgNCAgWFI3ISBARCAgICAgMCAyICI4MiAgIjUgICAgSFAgMAotTSAgICggICAgICAgISAgICAiJTQgIVAgSSAgICAhUCAyICRcMiAgIFggJzk/OjZZVDdWJVI8RiVZICcoIAotTSBBKCAgIiwgITAgIycpPCQiIjAgICAgISAhKCA8USggICk0ICAgIkMgISAgICBAICAgICAgICQgICAgKAotTTUwICYgIzAgICAgJyAhKCBJUSggICNAID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCFSICRcMgotTSAgIEMgIDQgIFgiNyEgQEQgICAgIDAgMiAsTDIgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0IAotTSEwIFIgICAgIVAgMiAvVDIgICBYICc5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAnKCBJUSggICIsIAotTSEwICMyKTwkIiIwICAgICEgISggKDEsICApNCAgICJDICEgICAgQCAgICAgICAkICAgICg1MCAkICJMIAotTSAgICcgISggMyEsICAjQCA9RV1TOiZdUj0lXUE8RylBPjAhUiAvVDIgICBDICA0ICBXUjchIEBEICAgIAotTSAwIDIgJyAzICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAgUCBTICAgICFQIDIgKiwzICAgWAotTSAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFSICRQMyAgIEMgIDQgIF9CNiEgQEQgICAgIDAgMgotTSAsPDMgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICBAIFEgICAgIVAgMiAvQDMgICBYICc5PwotTTxWRUc7RjVEN1YtSDg3KT84NylSODdEIDxAIkMkUCAgKFAgJSAgLFhFUDAoKSAgICAgJCAkQCA8JSAgIAotTUUwICAgKiwgJCAgICIgICAgICAgIDAgICAgQTUgICQgKkAgICAgPCAkQCEmJSAgIC4gIVY3Vi1IODcpPwotTTg3KVI4N0QgPEAjWCRQICAoUCAlICAvNEVQMCgpICAgICA8ICRAIUolICAgLiAhVjdWMU89NilMOTAhNQotTSAgXCAoUCAlICAsKEVQMCgoUCAgICA8ICRAIi0lICAgLiAhVjdWOUw7ViVUICU0ICNAIEMgIDQgIFNSNwotTSEgQEsgICAgIVAgMiArQDQgICBYICc5Pz02WVM6Nj1OOTYxPzsmXU45UCE1ICBQIChQICUgIC1YRVAwKAotTSowICAgIDwgJEAjQSUgICAuICFWN1ctSTlWWUU5JV1MO1ZZRyAlNCAiUCBDICA0ICBfUjYhIEBCICAgIAotTSFQIDIgICw1ICAgWCAnOT87Jl1OOVAhNSAgSCAoUCAlICAtSEVQMCgqQCAgICA8ICRAIE0lMCAgLiAhVgotTTdXNU48VkVHO0Y1RDdWRU49ICE1ICBEIChQICUgIC9URUAwKCogICAgIDwgJEAhNSUwICAuICFWN1ctSQotTTlWWUU5JV1JO0cwIDUwICggIiwgITAgI1wpOCQiIiQgICAgJyAhKCA9QTQgICNAID1FXUk7RzAgNTAgJwotTSAiLCAhMCAjJCk8JCIiUCAgICAnICEoIEhBNCAgI0AgPUVdVTtHLUk5VllFOSVdUzomXVI9ICE1ICA4IAotTShQICUgICwkRVAwKCpAICAgIDwgJEAjLCUwICAuICFWN1ctSTlWWUU5JV1TOiZdUj0gITUgIDQgKFAgJQotTSAgLTxFUDAoKFAgICAgPCAkQCNPJTAgIC4gIVY3Vy1IO1cpVCAlNCAhICBDICA0ICBWUjchIEBLICAgIAotTSFQIDIgIUg2ICAgWCAnOT89NllTOjY9Tjk2MT84VkFBPEAhNSAgLCAoUCAlICAsWkVQMCgqMCAgICA8IAotTSRAISMlQCAgLiAhVjdXLUk5VllFOSVdQzomJVIgJTQgIEAgQyAgNCAgVzI3ISBAQiAgICAhUCAyICY0NgotTSAgIFggJzk/OFZBQTxAITUgICQgKFAgJSAgL1hFUDAoISAgICAgPCAgICAgICAiMiBAICAzKCwkIidEIAotTSAgI19fUCAgICAhWiAgICBfX1wwICAgID5QICAgL19fKCAgICAnVCAgICNfX1MgICAgIV4gICAgX19dIAotTSAgICA/UCAgIC9fXzQgICAgKCQgICAjX19WICAgICIiICAgIF9fXVAgICAgQFAgICAvX19AICAgICg0IAotTSAgI19fWSAgICAiJiAgICBfX15AICAgIEFQICAgL19fTCAgICAoRCAgICNfX1wgICAgIiogICAgX19fNAotTSAgICBMQCAgIC9fX1ogICAgKzQgICAjX19eWCAgICJWICAgIF9fX1UgICAgTVAgICAvX19fICAgICtEIAotTSAgI19fUCwhICAiWiAgICBfX1wsIDAgIE5QICAgL19fJTAkICArVCAgICNfX1FYISAgIl4gICAgX19cSAotTSAwICBPUCAgIC9fXyxAJCAgLCQgICAjX19TUCEgICMiICAgIF9fXSYgMCAgUFAgICAvX180ICQgICw0IAotTSAgI19fVUghICAjJiAgICBfX11EIDAgIFIwICAgL19fPiAkICAsSCAgICNfX1goISAgIysgICAgX19eLAotTSAwICBTMCAgIC9fX0VAJCAgLFggICAjX19aKCEgICMvICAgIF9fXk4gMCAgVDAgICAvX19OQCQgIC0oIAotTSAgI19fXDAhICAjMyAgICBfX18uIDAgIFUwICAgL19fViAkICAtOCAgICNfX14oISAgIzcgICAgX19fTAotTSAwICBWMCAgIC9fX11AJCAgLUggICAjX19QICIgICM8ICAgIF9fXDQgQCAgVzAgICAvX18nQCggIC1YIAotTSAgI19fUkAiICAjQCAgICBfX1xSIEAgIFgwICAgL19fLyAoICAuKCAgICNfX1Q4IiAgI0QgICAgX19dMAotTSBAICBZMCAgIC9fXzZAKCAgLjggICAjX19WMCIgICNIICAgIF9fXU4gQCAgWjAgICAvX18+ICggIC5IIAotTSAgI19fWCgiICAjTCAgICBfX14sIEAgIFswICAgL19fRUAoICAuXCAgICNfX1ogIiAgI1AgICAgX19eSgotTSBAICBcMCAgIC9fX00gKCAgLyggICAjX19bWCIgICNUICAgIF9fXyggQCAgXUAgICAvX19UQCggIC88IAotTSAgI19fXVgiICAgICAgICBfX19JIEAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgIDAgICAgJCAgICAiICAgIFUoICQiLTAgICAgMyAgICAgICAgICAgIAotTSAgICEgICAgICAgICAgRCAgICAlICAgICBAICAgLkIgISBDSCAgICAxICAgICAsICAgICAgICAgISAgIAotTSAgMCAgICAvICAgICJQICAgICggICAgTEAwMCgrICQgICwgICAgICQgICAgIDAgICAgMCAgICAwICAgIAotTSVQICAgICwgICAgIiAgICBbKCQkIi5QISAgIVsgICAgICAgICAgICAgICAhICAgICAgICAgIVwgICAgKQotTSAgICAgQCAgICZCIiEgQUggQCAgKCAgICAgLCAgICAnICAgICEgICAgIEAgICAgSCAgICAgMCAgICA4IAotTSAgIihAQDAoQiAoICAgJCAgICAgICAgICAgICAgIDAgICAgICAgICArQCAgICAkICAgICYgICAgQygoJAotTSIoUCIgICEwICAgICAgICAgICAgICAgJCAgICAhICAgICMsICAgICEgICAgIUAgICAtUiIhIEM8IEAgIAotTTYwLCAgICAgICAgICAgICAhICAgICAgICAgIFkgICAgIDAgICAgOCAgICBYQUAwKC4gOCAgICQgICAgIAotTSAgICAgICAgICAwICAgICAgICAgL1AgICAgJCAgICAiICAgIC8oOCQiI1AmICAgQCAgICAgICAgICAgIAotTSAgICQgICAgICAgICAkPCAgICAhICAgICBQICAgJVI2ISBBPCFAICAiICAgICAgICAgICAgICAgISAgIAotTSAgICAgICEtICAgICAwICAgICwgICAhREVAMCg5IDggICFQICAgICAgICAgICAgICAgMCAgICAkICAgIAotTTRAICAgIDggICAgIyAgICBAKTgkIiggJiAgIVAgICAgISAgICAgICAgICAkICAgICIgICAgJUwgICAgKAotTSAgICAgUCAgIC8iNiEgQ1AhQCAgTSAkICAgICAgICAgICAgICEgICAgICAgICAhQCAgICAgQCAgICAgIAotTSAgICAgICAgXCA4ICAgICcgICAwICAgICcgICAgIDAgICAgMCAgICA6ICAgICAsICAgICAgICAgICAgIAotTSAvIC0gICM0ISAgICAgICAgICAgICAgISAgICAgICAgICcgICAgICMgICAgICAgICAgICAgICMkJEAgIAotTUQgICAgICAgICAgICAgICAgMCAgICAgICAgIVogICAgIDAgICAgICAgICAgICAgIDUhLCAgIigiICAgIAotTSAgICAgICAgICAkICAgICAgICAgQFAgICAgJCAgICAgICAgICAgICAgJ0A1ICAhUCVAICAgICAgICAgIAotTSAgICQgICAgICAgICAoSCAgICAhICAgICAgICAgICAgICAjSCpQICBEQCggICAgICAgICAgICAgIDAgIAotJSAgICAgICAgCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTg2MC1lbGYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTg2MC1lbGYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZTgzYi4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k4NjAtZWxmLnUKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotYmVnaW4gNzc1IGk4NjAtZWxmCi1NP1Q1LDFAJCIgMCAgICAgICAgICAgICAiICA8ICAgICEgICAzMiAgICAjMCAgIy00ICAgICAgIFQgIiAgCi1NITAgSCAhNCAkMCAgICA4ICAgIFQgICAwLSAgICAgICAgICJAICAgIEggICAgIDQgICAgICAgICAgUCAgCi1NIC0wICAgICAgICAgICAgICAhLCAgICAgICAgICEgICAgICAgICAgISAgICAtICAgJCMwICAgICAgICAoCi1NXCAgICIvICAgICAlICAgMCAgICAgICQgICBERCAgIEkpICAgICAgICAgIjggICAiNyAgICAgOCAgISAgCi1NICAgICBAICAiNFAgICJFLCAgICAgICAgICcgICAgICAgICAgIVAgICAgIE89Ny1SK1ZRSThCXUw6NilDCi1NK0ctTytDJCAgICAgICAsICAgICwgICAgIVAgICAgUCAgICArICAgICAgICAgICAgICAgICAgICAgQCAgCi1NICAgICAgICMgICAgITAgICAgICAgICAmICAgICEgICAgIEQgICAgKiAgICAiICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgISAgICAgMCAgJE0gICAgISwkQCAgICAgICAgSCAgIk4gCi1NICAgICAhJCBfXyQgICAgLyAgIEkqICAgICAwMSAgICsgICAgJiAgICYyMCAgICAgJDAjX1wwICAgIVwgCi1NICErTCAgICBGISggICAgICAgIEYgICBJTyAgICAgIDEgL19RICAgICswICAkUjAgICAgICRAICAgICAgCi1NICMoICAhRDAgICAgISEkICAgSCAgICBfICAgMyIgICAgICAyICAgICAgICAyMCAgKjMgICAgICAkMCNfCi1NXDAgICAlXCAgIkUsICAgICAhJCBfXyQgN1YtTDk2JU49NyAgN1Y1TjkgIT85NllWOjcpTztAIT85NzFFCi1NPicwIDg3MUU+JkVUICVdRTkmJVQ4MCFFPiZFVCAlXUw6Nik/PUY1UjxWRU87QCE/N1Y5UDxXMUE8RzAgCi1NN1Q9LDNUKSEzJV0vMUQ5MzE1MT81JCUiMyQ1PyAlXSQ2NFkhMzRFIyAiXVU8VyhPOyZFQitWUUk4RixOCi1NPFZcTiwwICAgICBJLyAgICBAMCAgICAgICAgSTAgICAhQDAgICAgICAgIEkxICAgIkAwICAgICAgICBJCi1NMiAgICIgMCAgICAgICAgICAqICAgICEgICBAIEggICAgKiAgICAgN19SRFlbIVwgICE/PiozNSAgL0AgCi1NJV9cSS8+UD8gICNEJzAgIDAgI1ggJk9fX187T08wICBbIVwgIC5QPiAgISAgL0AgJV9cSTA+Xl0gICNECi1NJzAgLFshWCAgJk9fX15cN19SRSVbIVwgIC4wPSAhQSAgL0AgOl9fX1ouXl0gICNMJ1AgIFshWCAgJCAgCi1NXiAgN19SRSlbW1QgIC4wPSAiM0wnQCAgOl9fX1g6ICAgICMoICAgNCckICAgODEiX18iQDBQICAnJCAgCi1NIT5QMCAgIzQwQCAvNkAgICBOODAkTSJAICAgIDtfX19YLj8/KjRTTCdAICA7X19fVlVPQCAgK0wkICAgCi1NSCkgICAuODAmMCFPX19fOEggICAgJl9fX1w+QCAgICA7X19fVlo4MiAgKDQ8ICAxQUUoICYoKTImICA/Ci1NWTkkSVshXCAgJlAgIClKJDwwIDQ7X19fVVogICAgIkAkICAgSCAgICAkP0BeICIkJ1AgIUhcJCAgKiBfCi1NICAiQCAgICAwICNYICogICAgIkAgICAgSCAgICAsQCAgIFA8MCFAIUEkK19cKiAwICAiJDBQICAlJiwgCi1NIDgxXyAhIkdYQCAgMCAgKCAqICAgICMoICAgLCckIDggODEiX18iQCQgICBBJCwgICExQyAgJiQ/UCAwCi1NSV4oICAkICAiICJAICAgIFIgICAjIVEgJiAmJDBPX1BIISAgICgxIyAgIDQ4UCAhQSdcICQqP0IgICEgCi1NICBAIEggICAgLEAgICBQPDAhQCFBJCtfXCogMCAgIiQwUCAgJSYsICA4MV8gISJHWEAgIDAgICggKiAgCi1NICAjKCAgICwnJCA4IDgxIl9fIkAkICAgQSQsICAhMUMgICYkP1AgMEleKCAgJCAgIiAiQCAgICBSICAgCi1NIyFRICYgJiQwT19QSCEgICAoMSMgICA0OFAgIUEnXCAkKj9CICAhICAgQCBIICAgICxAICAgUDwwIUAhCi1NQSQrX1wqIDAgICIkMFAgICUmLCAgODFfICEiR1hAICAwICAoICogICAgIyggICAsJyQgOCA4MSJfXyJACi1NJCAgIEEkLCAgITFDICAmJD9QIDBJXiggICQgICIgIkAgICAgUiAgICMhUSAmICYkME9fUEghICAgKDEjCi1NICAgNDhQICFBJ1wgJCo/QiAgISAgIEAgSCAgICAsQCAgIFA8MCFAIUEkK19cKiAwICAiJDBQICAlJiwgCi1NIDgxXyAhIkdYQCAgMCAgKCAqICAgICMoICAgLCckIDggODEiX18iQCQgICBBJCwgICExQyAgJiQ/UCAwCi1NSV4oICAkICAiICJAICAgIFIgICAjIVEgJiAmJDBPX1BIISAgICgxIyAgIDQ4UCAhQSdcICQqP0IgICEgCi1NICBAIEggICAgLEAgICBQPDAhQCFBJCtfXCRAKCA8RiQwUCAgJSYsICA4MV8gISJHWEAgIDAgICggKiAgCi1NICAjKCAgICwnJCA4IDgxIl9fISgiICcpQSQsICAhMUMgICYkP1AgMEleKCAgJCAgIiAiQCAgICBSICAgCi1NIyFRICYgJiQwT19QWyFcICAoMSMgICI0JyAgISNeNCJTIF9FWEQzTCdQICBbIVwgICkwPCAgKjQnICAjCi1NI143QiJBX0VYQ1NMJ1AgIFshXCAgKTA8ICAyNCcgICUnXjdCKyFfRVg9M0wnUCAgWyFcICApMDwgIDo0Ci1NJyAgJydeN0FYMV9FWDw3TCdQICBbIVwgICkwPCAgQjQnICApJ143QVAxX0VYQ0dMJ1AgIFshXCAgKTA8Ci1NICBKNCcgICsnXjdBUzFfRVhER0wnUCAgKV8gOShOUD8gICBPXCJILlshXCAgIj9QJjFDTCdQICArXyBJCi1NVi5QPyAgICdfIkssWyFcICAgX0VYSkNMJ1AgICFfUEoxLlA/ICAgL1k+KChbIVwgICA/XCpAS0wnUCAgCi1NI143QVIuUD8gICA3XyJIXFshXCAgIV9FWERTTCdQICAlX1BKKy5QPyAgID9ZPig4WyFcICAhP1wqPTNMCi1NJ1AgICdeN0I0LlA/ICAgN18iR0FbIVwgICFfRVg+V0wnUCAgJV9QSVE+UD8gICA/WT4pPVshXCAgIT9cCi1NKjwnTCdQICAnXjdCKD5QPyAgIDdfIkhZWyFcICAhX0VYTDdMJ1AgICVfUElTPlA/ICAgP1k+KDFbIVwgCi1NICE/XCpER0wnUCAgJ143Qiw+UD8gICBHXCJILlshXCAgIl9QKks7TCdQICApXyBJVi5QPyAgIE9cIkdYCi1NWyFcICAuP1wqTFNMJ1AgICdeN0I1PlA/ICAjR18iSSRbIVwgICFfRVhMJ0wnUCAgWV9QSiJOUD8gICA/Ci1NWT4pOVshXCAgLj9cKkNTTCdQICAnXjdCTz5QPyAgI0dfIkhMWyFcICAhX0VYRldMJ1AgIFlfUElVLlA/Ci1NICAgP1k+JzFbIVwgIC4/XCo+I0wnUCAgJ143Qic+UD8gICNHXyJHJFshXCAgIV9FWEY3TCdQICBZX1BJCi1NUC5QPyAgID9ZPihJWyFcICAuP1wqQ0NMJ1AgICdeN0IwPlA/ICAjR18iRyxbIVwgICFfRVhLJ0wnUCAgCi1NWV9QSjIuUD8gICA/WT4nSVshXCAgLj9cKkBTTCdQICAnXjdCSz5QPyAgI0dfIkc4WyFcICAhX0VYRydMCi1NJ1AgIFshXCAgKTA8ICAqNCcgICInXjdBXTFfRVg+N0wnUCAgWyFcICApMDwgICY0JyAgISdeN0M6MV9FCi1NWE0nTCdQICAlX1BKOj5QPyAgID9ZPis5WyFcICAhP1wqV0NMJ1AgICdeN0M8LlA/ICAgNDhQICFBJ1wgCi1NJCo/QiAgISAgIEAgSCAgICAkICAiICJAICAgIEggICAgICAgICAgICAgICAwJkQgICAgICAgISJSICAgCi1NICAgICAgICAgICAgICAgICAgIEkzICAgICAgICAgICAgICAyVyAgICRPQCAgISw0ICAgMywgICAgICQgCi1NICAhSCAgICAjICAgJEsgICAgIC0gICA5ICAgICAgMCAgISNIICAgICEwICAkQCAgICAgJiAgIDEsICAgCi1NICBIICAgIVsgICAgIlAgICAhICAgICA1ICAgICAgICAgICwgICJEUCAgICAgQCAgICMgICAgIDQgICAgCi1NIVAgICAhPCAgISlcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCAgICAgCi1NICAgICAgMCBfXyQgICAgICAgIDBVICAgICAgIyAgICEgICAgICAgICQuQCAgICAgIFAgICBAICAgICAgCi1NICEkUCAgICAgICwgICAsICAgICAgICAyICAgICAgICMgICAkICAgICAgICAkR1AgICAgICBQICAhMCAgCi1NICAgICAhKlAgICAgICAsICAgOCAgICAgICAgMlAgICAgICAjICAgJyAgICAgICAgJFQgICAgICAgUCAgCi1NIiAgICAgICAgIUQgICAgICAgLCAgIEQgICAgICAgIDkkICAgICAgIyAgICogICAgICAgICoyMCAgICAgCi1NIFAgICJQICAgICAgICJEUCAgICAgICwgICBQICAgICAgICBJMyAgICAgICMgICAtICAgICAgICAqPCAgCi1NICAgICBQICAjQCAgICAgICAgICAgICAgICAsICAgXCAgICAgICAgICAgICAgICAjICAgMCAgICAgICAgCi1NICAgICAgICAgUCAgJDAgICAgICAgICAgICAgICAgLCAgISggICAgICAgICAgICAgICAgIyAgIDMgICAgCi1NICAgICAgICAgICAgIFAgICUgICAgIDwgICAgICAgICAgIDAgX18kICAgIC4gICAgICAgICAgICQgL19RCi1NICAgICUwICAgICAgICAgICEgI19cMCAgICIkICAgICAgICAgICAwIF9fJCAgICBJICAgICAgICAgICAkCi1NIC9fUSAgICAsUCAgICAgICAgICAhICNfXDAgICAjSCAgIkcgICAgICEhJCAgIFggICAhKSAgIElRICAgCi1NICAwMSAgIC4gICAgNUAgICRfQCAgICBAJEAgICIgICAgJiggICFEICAgICAgISggICBEICAgIUggICBJCi1NUiAgICAgKDEgICAuICAgID9AICAlQkAgICArOCRAICAiICAgICgsICAiRywgICAgISEkICAgWCAgICIxCi1NICAgSVQgICAgIDAxICAgLiAgICBKQCAgJFggICAgISwkQCAgICAgICArLCAgIk4gICAgICAhJCBfXyQgCi1NICAiWCAgIElVICAgICAoMSAgIC4gICAgUjAgICUsICAgICBAJEAgICIgICAgLVwgICJHOCAgICAiISQgCi1NICBYICAgI0ggICBJWCAgICAgMDEgICAuICAgIFtAICAkVEAgICAgICRAICAiICAgIC80ICAiR0QgICAgCi1NISEkICAgWCAgICQgICAgSSogICAgIDAxICAgKyAgICEiMCAgKj5AICAgICQkMCAgI0AgICAyJCAgIkdMCi1NICAgICIhJCAgIFggICAkTSAgIEldICAgICAwMSAgIC4gICAhLTAgICUiICAgICBAJEAgICIgICAgNEAgCi1NICJHWCAgICAkISQgICBYICAgJTcgICA5KSAgICAgIDEgL19RICAgITdAICAqQEAgICAgIiQwICAjQCAgCi1NIDcoICAiSCogICAgIDEkICAgWCAgICYiICAgSiMgICAgIDAxICAgLiAgICFCQCAgKkEgICAgICgkMCAgCi1NI0AgICA5WCAgITMwICAgIEYhKCAgICAgICAmRSAgIEkqICAgICAwQSAgICsgICAhSzAgICU2ICAgICBACi1NJEAgICIgICAgO0QgICJIOCAgICAhISQgICBYICAgJy4gICA1TCAgICAiIDIgICAoICAgIVhQICAqQVAgCi1NICAgJCQwICAjQCAgID8kICAiRlwgICAgICEkIF9fJCAgICdYICAgNDwgICAgIiAyICAgKCAgICIhMCAgCi1NKkIgICAgICgkMCAgI0AgICBBSCAgIkhIICAgICEhJCAgIFggICAoUSAgIDRaICAgICIgMiAgICggICAiCi1NLyAgICpCUCAgICAiJDAgICNAICAgREwgICE3OCAgICAoISggICBAICAgKTggICA3PCAgICAgIDIgICAgCi1NICAgIjcwICAqQyAgICAgKCQwICAjQCAgIEcsICAiSFggICAgISEkICAgWCAgIClaICAgSi8gICAgICgxCi1NICAgLiAgICJAQCAgKkQgICAgICQkMCAgI0AgICBJJCAgIkkkICAgICAxJCAgIFggICAqPyAgIEoyICAgCi1NICAwMSAgIC4gICAiS1AgICpEUCAgICAkJDAgICNAICAgS1QgICJJMCAgICAhISQgICBYICAgKzQgICA5Ci1NJCAgICAgMDEgICAqICAgIlgwICAkXUAgICAgICRAICAiICAgIE5EICAiSTQgICAgISEkICAgWCAgICtYCi1NICAgSjYgICAgIDAxICAgLiAgICMkICAgKkVQICAgICgkMCAgI0AgICBSLCAgIThAICAgICAhKCAgICAgCi1NICAsTSAgIEo5ICAgICAwMSAgIC4gICAjMEAgICpGQCAgICAkJDAgICNAICAgVEQgICJEUCAgICAgISQgCi1NX18kICAgLT8gICBKOyAgICAgMDEgICAuICAgIz1AICAqRyAgICAgJCQwICAjQCAgIFg8ICAiREQgICAgCi1NISEkICAgTCAgIC45ICAgSj4gICAgIUAxICAgLiAgICNIUCAgKkkgICAgIDgkMCAgI0AgICBaVCAgIkpICi1NICAgICBBJCAgIFggICAuWiAgIEpLICAgICAwMSAgIC4gICAjUkAgICpLICAgICAkJDAgICNAICAgXiAgCi1NICE4ICAgICAoISggICBAICAgL04gICA1JCAgICAiIDIgICAoICAgJCAgICAqNFAgICAgICQwI19cMCAgCi1NISBEICAiSlQgICAgIiEkICAgWCAgIDA3ICAgSk8gICAgIDAxICAgLiAgICQpUCAgJThAICAgIEAkQCAgCi1NIiAgICEjSCAgIksgICAgICEhJCAgIFggICAxMCAgIEpRICAgICBAMSAgIC4gICAkNzAgICRLICAgICAgCi1NJEAgICFAICAhJiwgICJLLCAgICAgMSQgICBYICAgMUogICBKVCAgICAgMDEgICAuICAgJDxAICAlJEAgCi1NICAgQCRAICAiICAgISg8ICAiSzggICAgRCEkICAgWCAgIDIuICAgSzogICAgIDAxICAgLiAgICRGICAgCi1NJSlAICAgIEAkQCAgIiAgICEqUCAgIk1QICAgICIhJCAgIFggICAyVSAgIEs+ICAgICBAMSAgIC4gICAkCi1NTzAgICUzQCAgICBAJEAgICIgIUc5JilNOTAhQzxHMFErRywgOFcpVDoyWVMgJzlBOyc1RTxSVTg9IllDCi1NICY9RDhGVUUrRiwgPFZBPzkmJVQ4MllDICYtUj0mWE48UCFWN1c1TjxWRUc7RjVEN1ZFTj0gIVY3Vy1JCi1NOVZZRTklXUk7RzAgPUVdQzomJVI3VjlVO0YsIDdWOUk7RkQgPUVdVTtHLUk5VllFOSVdQzomJVI3ViVSCi1NPEYlWSAmVUE6NlggPUVdUzo2PU45NjE/OyZdTjlQIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUCi1NOTcoIDdWLUw5NiVOPTcgIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/PTZZUzo2PU45NjE/Ci1NPFZBTzxHMT85RzVOOFAhVjdWMU89NilMOTAhVjdWRU49ICE/PFcxQTxHMCA7Rl1OPCcpSTs2JVI+MCE/Ci1NOTZZVjo3KU87QCFWN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VkVOPSVdQTxHKUE+MCFQCi1NPEZFTTg3KVkgJzk/PFZFRztGNUQ3Vi1IODcpPzlHNU44UCFWN1YxTz02KUw5NV1BPEcpQT4wIT85NzFFCi1NPicwID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vi1IODcoID1FXUY7Jl1BCi1NPSAhVjdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAmJVQ5N0FJPSAhRTtHOUk8Rl1OICc5PzsmXU45VV1GCi1NPTZZQyAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDCi1NICc5Pzo2WVQ3VyFPOjZZVDk3KCA3VjVEODcxQSAnOT88VkFPPEcxPzlHNU44UCFWN1c1TjxWRUc7RjVECi1NN1ZFTj0lXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJzk/OjZZVDdWOVU7RiwgCi1NPUVdUzo2PU45NjE/PFZBTzxHMCA9RV1GOyZdQT0lXUY9NllDICY1WDo3MCA9RV1VO0ctSTlWWUU5JV1MCi1NO1ZZRzdWJVI8RiVZICc5PzsmXU45UCFWN1ctSDtXKVQgJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT88VkVHCi1NO0Y1RDdWLUg4NyggPUVdVTtHLUk5VllFOSVdTDtWWUcgJzk/PFZBTzxHMT84NylSODdEID1FXVU7Ry1JCi1NOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCE/OyZFQjdXOUU8Ry1JO1ZYIDdWVUM7VzVOPSAhVjdWLUg4Nyk/Ci1NPCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUk7RzE/Ci1NODcpUjg3RCA3VV1GPCctVDg3KVQgJzk/PFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICctPzsmRU46UCE/Ci1NMVRRLzBEJSw3VF0mMUUtJTUlXTQwNCksMTVcID1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCFWCi1NN1YxTz02KUw5NV1QO1ZFTj0mNVIgJV0/OyZdTjlWMU89NilMOTVdVTxWNUQgJzk/PFcxUj02LVQsMCFWCi1NN1ctVDxHNUM9IyggPUVdQzomJVI3ViVSPEYlWSAnOT85RlFPODcxPzwmXUk7RzFFPEAhVjdXLUk5VllFCi1NOSVdTDtWWUc3VyFPOjZZVDk3KCA9RV1EO1c1QjsmNT85RzVOOFAhVjdXLUk5VllFOSVdSTtHMT85RzVOCi1NOFAhPzElRS4wNFUpMFAhVjdWOUw7ViVUN1YlUjxGJVkgJzk/PFZBTzxHMT88Jl1JO0cxRTxAIVY3Vy1JCi1NOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICc5PzsmXU45VV1BCi1NPEcpQT4wIT86NllJPSAhVjdWLUg4NyggOFZRVTtGTUU8QCFWN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOCi1NOFAhVTdWUUk7RkwgPFchTzxHMVM4ViVSICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsID1FXVU7RkVPCi1NO0MoID1FXVU7RkVPO0AhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQyAgIE46NllUOTcpUCAiWUg4Ny1ICi1NICJZRD42WVM+NlQgK0YxWTtHLVQ8QCBOPEY1TDgyWVA7JzAgK0ZFTjo3MCArRyFMPSAgTj0mNVg9ICBOCi1NOUZFTjowIE48Rl1EODcxQSAiWUQ4NzFBICJZRztXMCArRjFZO0YlTTo2LCArRilTPFAgTjxXRU09JiVCCi1NICJZUz0nKVQ4NiggK0ctSDxXMVI9JiVCICJZQztWVU05NllUICJZRDk2KVU5UCBOOyZFTjkwIEQyJjVBCi1NOSY1Ui5CIE88Il0yMFUsTz03MUk7IyhNLEJYUStXNVM8Ql1TPEYsTzsmRUIrVlFJOEYsTzozQFYsIl1DCi1NPFc0TzhXKVQsMllTKyc4QCxCWFEoI0RSK1MgVStTJFQoIyBXLkMkVi5DKFAoJjFBPUZFRDtWOUYoJDVYCi1NPCIgRCAkIEgoUkUmNSVAQCxCWFErQyBOLDIhUzhWMUUuQl1VPFcoTzhWLVMrVlFJOEJdQzxHMFErRlwgCi1NKSRBRTg2MUU8Q0hAK1cgTzRELTMrVzVUOjZQUiszKE4sMl1VPFcoTzxXKUMrVlFJOEJdTDo2KUMrVkRYCi1NLUMgTzhXLVUrVi1SPSZETjxSUVYoIyhOLDIgWSxCXFAtMlxRLSIgUC1TSFEtQ0hSLDIhRDg3OUk5Jl1GCi1NOUIhJT4nIEApICEgKiIsSTFFMTgoIyhOLDJYUCtDJEA8Vi1EOTNITz03LVIrVi1DPFJdTDo2KE84VylUCi1NOjJZTyAiMSg5NiVEOTcoWigiXVArVSkjNFJdVT0mRUwsQlRSK0MkTz03LVIrVy1SOFJdTDo2KE87JkVCCi1NOFJdUDtXKVQrVj1FO0JdVjg2UVU5NyxNNicwTjhSUVYoIyhOLDIgWSxCXFAtMlxRLSIgUC1TSFItU0hQCi1NLEIhRDg3OUk5Jl1GOUIhJT4nIEApICBEMiY1QTkmNVIuQiBPPCJdMjBVLE89NzFJOyMoTSxCWFErVzVTCi1NPEJdUzxGLE87JkVCK1ZRSThGLE86NllDK1ctWTtGXU4+NlVTK0ZATD1CIFIrQyRALjMoTywjNE8sMzBACi1NLCM8WixDKFosM0RAOSYlVjo2MU85RjhAMTdBUCgiMCApJEFFODYxRTxDSEArVyBPNEQtMytXNVQ6NlBSCi1NKzMoTiwyXVU8VyhPPFcpQytWQUU4NjBPOzYlVDoiWUgrJzhALEJYUSgjRFIrUyBVK1MkVCgjIFcuQyRSCi1NLkM0VygmMUE9RkVEO1Y5RigkNVg8IiBEICYlQztWVVAuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZCi1NICYlUy5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWCtTQFkgJCBIKFJFJjUlQEAsQlhRK0MgTiwyIVM4VjFFCi1NLkJdVTxXKE84Vi1TK1ZRSThCXVY4NlFVOTcsTTYnME47UCFBOFZdTTwjSEAqJS0jMSQ0SSgjNE4sIiBRCi1NLEJcUC4iXFguMCFBPFNIQColLSMxJDRJKCM0TiwiIFEsQlxQLiJcWC4wIEQyJjVBOSY1Ui5CIE88Il0yCi1NMFUsTz03MUk7IyhNLEJYUStXNVM8Ql1TPEYsTzsmRUIrVlFJOEYsTzozQFYsIl1HOTZYTzxWQT85JiVUCi1NODJZQysnOEAsQlhRKCNEUitTIFUrUyRUKCMgVy5DJFcuQzRUKCYxQT1GRUQ7VjlGKCQ1WDwiIEQgJiVDCi1NO1ZVUC5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWCtTQFkgJiVTLkIgSDRULSQxMkRALTJYUCgjJFIrUyBYCi1NK1NAWSAkIEgoUkUmNSVAQCxCWFErQyBOLDIhUzhWMUUuQl1VPFcoTzhWLVMrVlFJOEJdTDo2KUMrRy1PCi1NICIxKDk2JUQ5NyhaKCJdUCtVKSM0Ul1VPSZFTCxCVFIrQyRPPTctUitXLVI4Ul1MOjYoTzsmRUI4Ul1JCi1NLiM4UCtWLVM9Ml1DPEcxTitHLEw9QiBSK0MkQC4zKE8sIzRPLDMwQCwjPFosMzhaLEMoQDkmJVY6NjFPCi1NOUY4QDE3QVAoIjAgMCJAQyo0OTQ2IiBSK0MkTiwiWFEoJy1DOSY0WitXNVM8Ql1DOFcsTzsmRUIrVi1SCi1NPSZYTjtQIEA7JjBALkIgSDRULSQxMkRALTJYUCgjJFIrUyBYK1NAWSAgICAgIlggJDAgMiAgIDY8ICBYCi1NOVYxQjs2NE44UCAhLUAgICAgJCEkMCAgJF8gISgwICAmMCAhIUAgICAgICAgICA9ICEsICRAICAgNFggCi1NLicxPzxXMVI9Ni1UICAiViAgICAmICAgICJIICMwIDIgICAgPTAgWD1FXUM6JiVSN1ZVRTs2KUU8QCAgCi1NNTAgISAiLCAhQDAgICAgICFQICAgIkwgIzAgMiAgICBIICBYPUVdUzomXVI9JV1NOTZVQjk3KCAgJTQgCi1NISAgQyAgOCQgICAgIEA8ICAgIEkgIFQgJEAgICAsRCAuJzk/OjZZVDdWVUU7NilFPEAgIDUwICcgIiwgCi1NIUAwICAgICQhUCAgICJIICMwIDIgICAgXFAgWD1FXUw7VllHN1ZVRTs2KUU8QCAgNTAgKiAiLCAhQDAgCi1NICAgKCFQICAgIkwgIzAgMiAgICEnQCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAgJTQgI0AgQyAgOCQgICAgCi1NIyA8ICAgIEwgIFQgJEAgICA0SCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICA1MCAvICIsICFAMCAgICAwCi1NIVAgICAgMCAgICA7ICEsICRAICAgRlAgLiJYUDlGJUs5MCAgTUAgICAhQCAgICBKICBUICRAICAgOSwgCi1NLic5PzhWQUE8RV1NOTZVQjk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICA7WCAuJzk/Ci1NPFZBTzxHMT87NjVNOEY1UiAgITUgIDAgKFAgJiEgICAgICgnICAgICowIC0gISggICAnRyAjQVY3VkVOCi1NPSVdTTk2VUI5NyggICU0ICFQIEMgIDgkICAgICEgPCAgICBKICBUICRAICAgQSQgLic5PzsmXU45VV1NCi1NOTZVQjk3KCAgJTQgIkAgQyAgOCQgICAgIiA8ICAgIEsgIFQgJEAgICBDUCAuJzk/OUZRTzg3MT87NjVNCi1NOEY1UiAgITUgIFggKFAgJiEgICAgIFAnICAgICsgIC0gISggICApSCAjQVY3VjFPPTYpTDk1XU05NlVCCi1NOTcoICAlNCAjUCBDICA4JCAgICAkIDwgICAgJCAgICAnICA3ICEoICAgLisgI0FUN1c1Tjo2XU4gICJWCi1NICAgICIgICAgIkggIzAgMiAgICJMQCBYPUVdQzomJVI3VlVFOzYpRTxAICA1MCAhICIsICFAMCAgICAgCi1NIVAgICAiTCAjMCAyICAgIlcwIFg9RV1TOiZdUj0lXU05NlVCOTcoICAlNCAhICBDICA4JCAgICAgIDwgCi1NICAgSSAgVCAkQCAgIFA4IC4nOT86NllUN1ZVRTs2KUU8QCAgNTAgJyAiLCAhQDAgICAgICFQICAgIkggCi1NIzAgMiAgICMsICBYPUVdTDtWWUc3VlVFOzYpRTxAICA1MCAqICIsICFAMCAgICAgIVAgICAiTCAjMCAyCi1NICAgIzZQIFg9RV1GOyZdQT0lXU05NlVCOTcoICAlNCAjQCBDICA4JCAgICAgIDwgICAgTCAgVCAkQCAgCi1NIFg8IC4nOT85Jl1VOEZRRTdWVUU7NilFPEAgIDUwIC8gIiwgIUAwICAgICAhUCAgICAwICAgIDsgITwgCi1NJEAgICEqRCAuIlhROUYlSzkwICBNQCAgICBAICAgIEogIFQgJEAgICBdICAuJzk/OFZBQTxFXU05NlVCCi1NOTcoICAlNCAgMCBDICA4JCAgICAgIDwgICAgSyAgVCAkQCAgIF9MIC4nOT88VkFPPEcxPzs2NU04RjVSCi1NICAhNSAgMCAoUCAmISAgICAgICcgICAgKjAgLSAhKCAgIDBEICNBVjdWRU49JV1NOTZVQjk3KCAgJTQgCi1NIVAgQyAgOCQgICAgICA8ICAgIEogIFQgJEAgICEkWCAuJzk/OyZdTjlVXU05NlVCOTcoICAlNCAiQCBDCi1NICA4JCAgICAgIDwgICAgSyAgVCAkQCAgISdEIC4nOT85RlFPODcxPzs2NU04RjVSICAhNSAgWCAoUCAmCi1NISAgICAgICcgICAgKyAgLSAhKCAgIDJFICNBVjdWMU89NilMOTVdTTk2VUI5NyggICU0ICNQIEMgIDgkCi1NICAgICAgPCAgICAkICAgICpAICYgISggICAzNyAjQVY3Vi1IODcpPzlHNU44UCAgNTAgISAxJCAgIS9YCi1NIDIkICAhMDggICAgISAgICAjJCAhQCAyICAgJSMgIFg9RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgICE1Ci1NICAoISQwICAlIiAhKDAgICUkICAgICAkICAgICxQICYgISggICA1IyAjQVY3VzVOPFZFRztGNUQ3Vi1ICi1NODcpPzlHNU44UCAgNTAgIyAxJCAgITEoIDIkICAhMUggICAgISAgICAiTCAhQCAyICAgJTxAIFg9RV1TCi1NOiZdUj0lXUY9NllDICAhNSAgMCEkMCAgJScgISgwICAlKSAgICAgJCAgICAsQCAmICEoICAgNkggI0FWCi1NN1ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICAhNSAgNCEkMCAgJSlAISgwICAlK0AgICAgJCAgICAtICAmCi1NICEoICAgN0AgI0FWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsICAlNCAhQCQxICAgNFAgJEEgICA0Ci1NWCAgICAgMCAgICBJICA4ICRAICAhQFQgLic5Pzo2WVQ3VjlVO0YsICAlNCAhUCQxICAgNFogJEEgICA1Ci1NIiAgICAgMCAgICBQICA4ICRAICAhRCQgLic5PzxWRUc7RjVEN1ZFTj0lXUY9NllDICAhNSAgQCEkMCAgCi1NJTEgISgwICAlMyAgICAgJCAgICAsQCAmICEoICAgOVcgI0FWN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDCi1NICAhNSAgRCEkMCAgJTNAISgwICAlNUAgICAgJCAgICAqQCAmICEoICAgOkUgI0FWN1ZRTztGPT85RzVOCi1NOFAgIDUwICogMSQgICE1QCAyJCAgITYgICAgICEgICAgIyQgIUAgMiAgICZWQCBYPUVdUzo2PU45NjE/Ci1NOyZdTjlVXUY9NllDICAhNSAgTCEkMCAgJThAISgwICAlOkAgICAgJCAgICAsUCAmICEoICAgPDEgI0FWCi1NN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAgIDUwICwgMSQgICE2UCAyJCAgITcwICAgICEgICAgIkwgCi1NIUAgMiAgICcwICBYPUVdRjsmXUE9JV1GPTZZQyAgITUgIFghJDAgICU9QCEoMCAgJT9AICAgICQgICAgCi1NKyAgJiAhKCAgID1QICNBVjdWMU89NilMOTVdRj02WUMgICE1ICBcISQwICAlQCAhKDAgICVCICAgICAkCi1NICAgICUwIDUgISggICA+TiAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgPjogKCwgITAkICAgP0ogICAgCi1NJCAgJSAhKCAgID5KICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIV5IIEUwICAgKiwgKiAgICIgICAgICAgCi1NICAgICAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAgICA5ICEsICRAICAiJ0wgCi1NLiZRSTtGTCAgKzggICAiOCAgICApQCAtICEoICAgQEkgI0FOOTdBVCAgIiMgIDQhICAgJ1pAIEMgIDgkCi1NICAgICAgPCAgICBKICBUICRAICAiJSwgLiZRSTtGTUY9NllDICAiIyAgNCEgICAnPCAgQyAgOCQgICAgCi1NISA8ICAgIEQgIFQgJEAgICInPCAuJy1UPTY5RiAgIVIgICAnS0AgQyAgOCQgICAgIiA8ICAgICQgICAgCi1NJTAgNSAhKCAgIEJZICgsICEwJCAgID9KICAgICUwICUgISggICBCRSAoLCAhMCQgICA/SiAgICAkICAlCi1NICEoICAgQlUgJTQgIVAgICAgMCAgICBcICAkICRAICAiLzQgRTAgICAqLCAqICAgIiAgICAgICAgICAgCi1NICAgKCAgICAgICAgICAkICAgQCAgICAgICAgICBAQCA8QCAgICJYICAgIDwgITwgJEAgICI4RCAuJzFVCi1NN1ZRSTtGTCAgKzggICAiMCAgICApQCAtICEoICAgRFcgI0FOOTdBVCAgIiMgIDQhICAgJ1pAIEMgIDgkCi1NICAgICAgPCAgICBKICBUICRAICAiNiQgLiZRSTtGTUY9NllDICAiIyAgNCEgICAoPlAgQyAgOCQgICAgCi1NICA8ICAgIEQgIFQgJEAgICI4NCAuJy1UPTY5RiAgIVIgICAoTjAgQyAgOCQgICAgICA8ICAgICQgICAgCi1NLkAgJCAhKCAgIEcnICNATixGOUE6VjQgICs4ICAgICQgLywgJlAgICAgKUI7JzVFICAgICAgJUc8RjVFCi1NO0AgICAgICA8RjVEICAgICAgMCAgICBeICAwICRAICAiQEQgLiYtTzsmXVI8UCAgTUAgICAgMCBcUCA/Ci1NICAgICBHIUk7RkwgICAgICA3IVU8RyFMOTAgICAgICA+NjVMOyZdVyAgICAgIDAgICAgUiAgMCAkQCAgCi1NIkNcIC4iWFM5RiVLOTAgIE1AICAgIDAgXFAgMyAgICAgNjlPPEYwICAgICAgJi1IOTc5WSAgICAgIDAgCi1NICAgUSAgMCAkQCAgIkcwIC4mLUE8RywgICs4ICAgICQgLywgJSAgICAgJVA7VylTOFZBRSAgICAgICFCCi1NOzc8ICAgICAhICAgICMoICEgIDIgICAqSkAgWCtDMUY4Nk1FICAiViAgICAhICNTICEsICAgICE1JSk1Ci1NMTAgICAgICAxRCUsNFQ0ICAgICAhICAgICFQICVAIDIgICAqUUAgWDhGXU87JjVBO0AgIDxAICAiRzAgCi1NICAgUSAgMCAkQCAgIk9MIC4mKVY4NlFTICAiViAgICAhICNTICEsICAgICE9JylVOTAgICAgICA5RiVMCi1NPFY0ICAgICAhICAgICFUICVAIDIgICArJiAgWDhGXU87JjVBO0MoICAnKCAgIEsmICAgIDFAICQgISggCi1NICBNQiAjQU06Ny1PPEYxRTxGNUQgICJWICAgICEgI1MgIiwgICAgIz0mQVI5NjQgICAgICAnSUU8RlwgCi1NICAgICA2XU45MCAgICAgIj0nPU8gICAgICAwICAgIEMgIDggJEAgICJYRCAuJlVBOjZYICAlNCAhUCQxCi1NICAgNiogJEEgICA5ICAgICAgMCAgICBHICA8ICRAICAiWyAgLictUDtXKVQ8Vi1BPEAgIDxAICAiQ1wgCi1NKFAgJSBQICAqVkAgICAgRSAgPCAkQCAgIl00IC4mLUw9NllLOTcoICAnKCAgIEgpICIsICEwLCAgIkswCi1NICAgICogICcgISggICBPXSAjQU47VllQPEZFTTg3KVkgICFSICAgKVFQIEMgIDQjICAgSVkgICAgIjQgCi1NIVAgMiAgICwoQCBYPCcpSTs2JVI+MCAgPEAgICI4RCAoUCAlIFAgICo/MCAgICBEICA8ICRAICAjJDggCi1NLic1PzsmRU46UCAgPEAgICIvNCAoUCAlIFAgICpNQCAgICBHICA8ICRAICAjJlQgLictPzsmRU46UCAgCi1NQFAgJSAwICAhXkggKFAgJSBQICAqRkAgICAgRiAgPCAkQCAgIyksIC4nOT89NllJO1ZYUiAgIVIgICAjCi1NQlAgQyAgNCMgICBLPCAgICAiNCAhUCAyICAgLE4gIFg9RV1VO0ZFTztAICA8QCAgIEZQIChQICUgUCAgCi1NKldAICAgIEcgIDwgJEAgICMtXCAuJzk/PFcxUj02LVQsQCAgPEAgICA0WCAoUCAlIFAgICpJICAgICBHCi1NICA8ICRAICAjMDggLic5PzxXMVI9Ni1ULDAgIDxAICAgIlggKFAgJSBQICAqR0AgICAgTyAgPCAkQCAgCi1NIzM0IC4nOT85Jl1VOEZRRTdXIU86NllUOTcoICAmLCAgUCQgI1AgQyAgNCMgICBKPCAgICAiWCAhUCAyCi1NICAgLThQIFg9RV1GOyZdQT0lXVA7VkVOPSY1UiAgIUMgICwhICBYIChQICUgUCAgKkpQICAgIFYgIDwgCi1NJEAgICM5RCAuJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAgIUMgICwhICBQIChQICUgUCAgCi1NKj5AICAgIFQgIDwgJEAgICM8VCAuJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAgIDhQICMgMCArCi1NICIsICEwLCAgIkpQICAgICswICcgISggICBXWiAjQVY3VlFPO0Y9PzwmXUk7RzFFPEAgIDhQICMgMCAqCi1NICIsICEwLCAgIkkgICAgIC0wICcgISggICBYTyAjQVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSCi1NICAhQyAgLCEgIEQgKFAgJSBQICAqQkAgICAgUyAgPCAkQCAgI0YoIC4nOT88VkVHO0Y1RDdWRU49JV1QCi1NO1ZFTj0mNVIgICFDICAsISAgQCAoUCAlIFAgICpGMCAgICBMICA8ICRAICAjSFggLic5Pzo2WVQ3VyFPCi1NOjZZVDk3KCAgJiwgIFAkICFQIEMgIDQjICAgSicgICAgIzwgIVAgMiAgIC5RMCBYPUVdVTtHLUk5VllFCi1NOSVdUzomXVI9JV1QO1ZFTj0mNVIgICFDICAsISAgOCAoUCAlIFAgICo9ICAgICBVICA8ICRAICAjT0ggCi1NLic5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCAgJiwgIFAkICEwIEMgIDQjICAgSjsgICAgIlggCi1NIVAgMiAgIC8qICBYPUVdUzomXVI9JV1QO1ZFTj0mNVIgICFDICAsISAgMCAoUCAlIFAgICpLUCAgICBWCi1NICA8ICRAICAjVVggLic5Pz02WVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgICFDICAsISAgLCAoUCAlCi1NIFAgICpFQCAgICBUICA8ICRAICAjWSggLic5PzxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAICA4UCAjCi1NIDAgIiAiLCAhMCwgICJLICAgICArMCAnICEoICAgXl8gI0FWN1YtSDg3KT88Jl1JO0cxRTxAICA4UCAjCi1NIDAgISAiLCAhMCwgICJJNCAgICApICAhICEoICAgX0MgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgCi1NNTAgLyAgICArICAnICEoICAhIC8gI0FWN1YxTz02KUw5NV1BPEcpQT4wICA8QCAgI1tcIChQICUgUCAgCi1NKj9AICAgIEQgICQgJEAgICQjLCBFMCAgICosICQgICAiICAgICAgICAgICEiICE1ICBYICAgIEsgIDwgCi1NJEAgICQlWCAuJzk/OUZRTzg3MT84NylSODdEICAnKCAgISAvICIsICEwLCAgIkpUICAgICkgICEgISggCi1NICEiIiApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAsICAgICxQICcgISggICEiVSAjQVY3VzVOCi1NPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgICcoICAhIT4gIiwgITAsICAiSFAgICAgKSAgISAhKCAgISM5Ci1NICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICsgICAgLDAgJyAhKCAgISQqICNBVjdXLUk5VllFCi1NOSVdTDtWWUc3ViVSPEYlWSAgIVIgICAwTTAgQyAgNCMgICBKJCAgICAiMCAgMCAyICAgMStAIjUgICAgCi1NSFAgMCAgICggICAgICAgICAgJCggJTQgIkAgICAiSCAhUCAyICAgMTYgIFg9RV1MO1ZZRzdWJVI8RiVZCi1NICAhUiAgIDEiQCBDICA0IyAgIEpRICAgICIwICAwIDIgICAxPyAiNSAgICBIUCAwICAgKCAgICAgICAgCi1NICAkKCAlNCAiMCAgICMoICFQIDIgICAxS0AgWD1FXVU7Ry1JOVZZRTklXUk7RzE/ODcpUjg3RCAgJyggCi1NICElOCAiLCAhMCwgICJIQCAgICApICAhICEoICAhJzIgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgCi1NNTAgKCAgICAsICAnICEoICAhKCIgI0FWN1ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgICcoICAhJk4gIiwgCi1NITAsICAiSTwgICAgKSAgISAhKCAgIShGICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICcgICAgCi1NKjAgJyAhKCAgISkvICNBVjdWRU49JV1BPEcpQT4wICA8QCAgJEAoIChQICUgUCAgKj5QICAgIEQgICQgCi1NJEAgICRHLCBFMCAgICosICQgICAiICAgICAgICAgICEiICE1ICA4ICAgIFQgIDwgJEAgICRKPCAuJzk/Ci1NPTZZUzo2PU45NjE/PFZBTzxHMT84NylSODdEICAnKCAgISkvICIsICEwLCAgIkkwICAgICkgICEgISggCi1NICErKyApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAlICAgICxAICcgISggICErXSAjQVY3Vy1JCi1NOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCAgPEAgICRKPCAoUCAlIFAgICpBQCAgICBEICAkICRAICAkUiQgCi1NRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgMCAgICBLICA8ICRAICAkVFAgLic5PzxWQU88RzE/Ci1NODcpUjg3RCAgJyggICErXSAiLCAhMCwgICJJLCAgICApICAhICEoICAhLVAgKTQgICAiQyAhICAgIEAgCi1NICAgICAgICAgMEAgNTAgIyAgICAsUCAnICEoICAhLkMgI0FWN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSCi1NODdEICAnKCAgIS0sICIsICEwLCAgIkcoICAgICkgICEgISggICEvJyApNCAgICJDICEgICAgQCAgICAgCi1NICAgICAwQCA1MCAiICAgICwwICcgISggICEvWCAjQVY3Vy1JOVZZRTklXUM6JiVSN1YlUjxGJVkgICFSCi1NICAgM0hQIEMgIDQjICAgSiIgICAgIjAgIDAgMiAgIDQnICI1ICAgIEhQIDAgICAoICAgICAgICAgICQoCi1NICU0ICAwICAgIkggIVAgMiAgIDQxQCBYPUVdQzomJVI3ViVSPEYlWSAgIVIgICAzXiAgQyAgNCMgICBKCi1NSiAgICAiMCAhUCAyICAgNDpAIFg9RV1EO1c1QjsmNCAgJTQgI1AgQyAgNCMgICBJViAgICAiLCAhUCAyCi1NICAgNEMwIFg9RV1GOyZdQT0gICA1MCAuICIsICEwLCAgIkgsICAgICpQICcgISggICEyWCAjQVY3VzVOCi1NPFZFRztGNUQ3VlFPO0Y8ICAlNCAjICBDICA0IyAgIEoyICAgICJEICFQIDIgICA0WDAgWD1FXVM6Nj1OCi1NOTYxPzsmXU45UCAgNTAgKyAiLCAhMCwgICJHLCAgICAoQCAnICEoICAhNCMgI0FWN1ZRTztGPCAgJTQgCi1NIkAgQyAgNCMgICBKLiAgICAiSCAhUCAyICAgNSswIFg9RV1VO0ctSTlWWUU5JV1JO0cwICAlNCAiMCBDCi1NICA0IyAgIElQICAgICJAICFQIDIgICA1NTAgWD1FXVM6Nj1OOTYxPzo2WVQgICE1ICBAIChQICUgUCAgCi1NKjwwICAgIEEgIDwgJEAgICU3OCAuJzk/OjZZVCAgITUgIDwgKFAgJSBQICAqPiAgICAgTCAgPCAkQCAgCi1NJTooIC4nOT89NllTOjY9Tjk2MT88VkFPPEcwICAlNCAhQCBDICA0IyAgIElVICAgICJIICFQIDIgICA1Ci1NUyAgWD1FXVM6Nj1OOTYxPzxWQU88RzAgICU0ICEwIEMgIDQjICAgSisgICAgIiwgIVAgMiAgIDVbUCBYCi1NPUVdUzomXVI9ICAgNTAgJCAiLCAhMCwgICJIXCAgICAqUCAnICEoICAhODogI0FWN1c1TjxWRUc7RjVECi1NN1YtSDg3KCAgJTQgIFAgQyAgNCMgICBKIkAgICAiRCAhUCAyICAgNjBQIFg9RV1TOjY9Tjk2MT84VkFBCi1NPEAgIDUwICIgIiwgITAsICAiSSQgICAgKEAgJyAhKCAgITlFICNBVjdWLUg4NyggICU0ICAwIEMgIDQjCi1NICAgSlMgICAgIDAgICAgJyAgICAgICAiREAgICRfICAgICFZX19cICAgICggICAgPk9fXyAgICAsICAgCi1NICdPX19QICAgJUAgICAhXV9fXCAgICIgICAgID9PX18gICAgSiAgICAnX19fUCAgIC0gICAgIiFfX1wgCi1NICAjWCAgICBAT19fICAgISggICAgKC9fX1AgICA0QCAgICIlX19cICAgJVAgICAgQU9fXyAgICFGICAgCi1NICg/X19QICAgPCAgICAiKV9fXCAgICdIICAgIEJPX18gICAiJCAgICArK19fUCAgIENAICAgIlVfX1wgCi1NICApJCAgICBNT19fICAgIjMgICAgKz9fX1AgICBFQCAgICJZX19cICAgKUQgICAgTk9fXyAgICI8ICAgCi1NICtPX19QICAgR1AgICAiXV9fXCAgICooICAgIE9PX18gICAiRSAgICArX19fUCAgIEogICAgIyFfX1wgCi1NICAqTCAgICBQT19fICAgIk4gICAgLC9fX1AgICBMMCAgICMlX19cICAgKzAgICAgUU9fXyAgICJYICAgCi1NICxHX19QICAgTyAgICAjKl9fXCAgICwgICAgIFJfX18gICAjJCAgICAsV19fUCAgIFIgICAgIy5fX1wgCi1NICAsUCAgICBTX19fICAgIzAgICAgLSdfX1AgICBVICAgICMyX19cICAgLUAgICAgVF9fXyAgICM8ICAgCi1NIC03X19QICAgWCAgICAjNl9fXCAgIC4wICAgIFVfX18gICAjSCAgICAtR19fUCAgIFsgICAgIzpfX1wgCi1NICAvICAgICBXL19fICAgI1QgICAgLVdfX1AgICBeICAgICM+X19cICAgL1AgICAgWC9fXyAgICQgICAgCi1NIC4nX19QICAhISAgICAjQl9fXCAgIDBAICAgIFkvX18gICAkLCAgICAuN19fUCAgISQgICAgI0ZfX1wgCi1NICAxMCAgICBaL19fICAgJDggICAgLkdfX1AgICEnICAgICNKX19cICAgMiAgICAgWy9fXyAgICREICAgCi1NIC5XX19QICAhKiAgICAjT19fXCAgIDJQICAgIFwvX18gICAkTyAgICAvJ19fUCAgISxAICAgI1JfX1wgCi1NICAzNCAgICBdL19fICAgJFggICAgLztfX1AgICEvICAgICNXX19cICAgM1AgICAgIC9fXyAgICUkICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQgCi1NICAgISAgICAgQCAgJC0wICAgIzQgICAgJFAgICAgICAgICAgICAgICAwICAgICAgICAgKSAgICAhMCAgCi1NICAoICAhI0ggICAgWiAgICAkQCAgICAjICAgICAgICAgIDAgICAgJCAgICAjUCAgICBMICAgICIgICAxCi1NLCAgICAzICAgICMwICAgICEgICAgICggICAgJCAgICAkICAgICE8ICAgICMgICAgIEAgICRAICAgICggCi1NICAgID5QICAgICAgICAgICAgICAgMCAgICAgICAgID8gICAgISAgICAgKCAgISlcICAgIj8gICAgIyAgCi1NICAgIyAgICAhUCAgICAwICAgICwgICAgKjAgICAgUCAgICAmICAgMkwgICAgSyAgICAgMCAgICAgICAgCi1NICAgICAgIDAgICAgIiAgICAiXCAgICAsICAgICFAICAkTCAgICArICAgICBAICAgICAgICAgICAgICAgCi1NJCAgICAgQCAgICBUICAgICMgICAgIDggICEtICAgICMwICAgITwgICAgICAgICAgICAgICAhICAgICAoCi1NICAgIC5AICAgIFAgICAgJiAgIDkgICAgIjAgICAgIDAgICAgICAgICAgICAgICAwICAgICIgICAgJCAgCi1NICAgISAgICAgQCAgJjEgICAgRDAgICAgJSAgICAgICAgICAgICAgICIgICAgICAgICAhKCAgICAgMCAgCi1NICAsICAiREQgICApKSAgICAgQCAgICAgICAgICAgICAgIDAgICAgICAgICAzQCAgICAkICAgICMgICBJCi1NLCAgICIzICAgICA8ICAgICAgICAgICAgICAgMCAgICAhICAgICUsICAgICYgICAgIFAgICo0UCAgIEUsCi1NICAgIDwgICAgIDAgICAgICAgICAhICAgICBAICAgITwgICAgIiAgICAgLCAgIkcgICAgKVAgICAgPCAgCi1NICAgICAgICAgICAgICBAICAgICAgICAgODAgICAgKCAgICAgICAgICAgICAiPCAgICA8ICAgICAkICAgCi1NICFQICAgICQgICAgJCAgICAmRCAgICAjICAgICAgICAgICAgICEjICAgICRUMCAgICAgICAgICAgICAgCi1NIDAgICAgICAgICFRICAgICBQICAgICAgICAgICAgIDVEMCAgICkkICAgICAgICAgICAgICAgJCAgICAgCi1NICAgID5QICAgICQgICAgICAgICAgICAgJUIoICAgME4gICAgICAgICAgICAgICAhICAgICAgICAgKDAgCi1NICAgISAgICAgICAgICAgICAhSTAgICA2PCAgICAgICAgICAgICAgICEgICAgICAgICAiKyAgICAgMCAgCi0+ICAgICAgICAgICBQUCAgICBJKCAgICAgICAgICAgICAgICQgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dC51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5NWZjMC4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dC51CisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLWJlZ2luIDc3NyBtNjhrLWFvdXQKLU0gICAhIlAgICQgICAgISAgICAgICAgICAjJEAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gJFk2X18hKFVTQiAyXlggISRHTSAgMEYzJEo8OU9SWVRWNCI2OFBDUyAgICQgME8uMCAgJCAwTyJSXDUKLU04P1wgICAlIldPUCAjIlwgOD9cICAgLS42KF0sW0NCIF9fIS43RFlVM0U4ICAkWT4zRzQgICRALiAgICAKLU0gJEM3ICAhUCAmICAgICkuN0RZVTIgWCAgICAgMi08ICAnICA4ICAgIERZPjNHNSgjQCAgICAhKFVQICAKLU08ICFAICAgIjNFWS49NEAuICAgICAkQzcgICFQICYgICAgKS43RFlVMiBYICAgICAyLTwgICcgIDggICAKLU0gRFk+M0c1KCNAICAgICEoVVAgIDwgIUAgICAiM0VZLj00QC4gICAgICRDNyAgISJAJiAgICApLjdEWVUKLU0yIFggICAgIDItPCAgJCogOCAgICBEWT4zRzUoI0AgICAgIShVUCAgMEghQCAgICIzRVkuPTRALiAgICAKLU0gJEM3ICAhIkAmICAgICkuN0RZVTIgWCAgICAgMi08ICAkKiA4ICAgIERZPjNHNSgjQCAgICAhKFVQICAKLU0wSCFAICAgIjNFWS49NEAuICAgICAkQzcgICNSICVQLzggICAgRFk+M0c1KCNAICAgICEoVVAgIFxAITwKLU0jViAgICApLjdEWVUyIFggICAgIDItPCAgJChZICAgMC0hL1wgICQgICEgViRfUCAgQCAgJCNAU18gICMKLU0gICAwLkMvXCAgMCAgISBcLF9QICEwICAkI1lQIUIvICAgIDAwJyAnKFwgICAhISQ8IEBDUCAgICQkQVAKLU0iMi8gICAgMDMnICooXCAgICEhMDwgTENQICAgJCUwQ18kKyggICAgICEhOChfUSA6MCAgICAgMDciL1wKLU0gICAgICAgICQmIDNeMCAgJCMwICAhIUQkX0QgICEgViAgIDA5QS9ZICAgMC4gICAkJkBTXjAgICQjSCAKLU0gISFMLF9EICAhIFwgICAwPCMvWSAgIDAvQCAgJCcwQ14wICAkJCAgICEhXChfRCAgISEkICAgMEEiL1kKLU0gICAwMiAgICQoUENeMCAgJCRQICAhIjQoX0QgICEhMCAgIDBHIi9ZICAgMDUgICAkKjBDXjAgICQlQCAKLU0gISJMKF9EICAhITwgICAwTSIvWSAgIDA4ICAgJCtAQ18gICAkIzAgICEjJChfUCAgISBWICAgMFIiL1wKLU0gICAwLiAgICQsUENfICAgJCNIICAhIzAoX1AgICEgXCAgIDBVIi9cICAgMC9AICAkLUBDXyAgICQkICAKLU0gISM8KF9QICAhISQgICAwWCIvXCAgIDAyICAgJC4wQ18gICAkJFAgICEjSChfUCAgISEwICAgMFsiL1wKLU0gICAwNSAgICQvIENfICAgJCVAICAhI1QoX1AgICEhPCAgIDBeJyAiKFwgICAhJzQ8IChDUCAgICQ9QVAKLU0gMi8gICAgMVgnICEoXCAgICEnPChfRCAgISRcICAgMTEjL1kgICAxKyAgICQzMS43RFlVMCJAQyo2MUIKLU0+J0FYK0csKS0yWFIoIkEiOTcpSzk2UUU+MkRALVJcUSxCXFgtMCAgMidEICAhJ0goJ0QgICEnRDNJITgKLU1DVFlSIkhRLjVAICA4P1wgICAgNitSWCAiJidfICAgICUlQi8zRVkuPTAgIDNFOCAgJFk+M0c1LjVAICAKLU08ICUuMCIvICAgIDNZJyNfM0VZLj0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICEgLCAgICAgJFlVICAhICoiLEk4VylULCJZQyIzME4tQiBIMEY1UjpWNUw5N0RJKCMsTyxTIE8KLU0uIywgICAgICAgICEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICEgMCAgJjAgICAgICAgICAiUDAgICkoICAgITQgICAgJFYwICAgICAgICE0ICAgICZYICAKLU0gICAgICAgICAgICAvOCAgICAgICAgICAgICAgM1ggICAgICAgICAgICAgIDxIICAgICAgICAgICAgICAKLU1DKCAgICAgICAgICAgICAgSVggICAgICAgICAgICAgIFE4ICAgICAgICAgICAgICBXWCAgICAgICAgICAKLU0gICAgXiggICAgICAgICAgICAgISI4ICAgICAgICAgICAgICEnKCAgICAgICAgICAgICAhKiggICAgICAKLU0gICAgICAgISxCICAgICQgICAgICAgICEvIiAgICAkICAgICAgICAhMzIgICAgJCAgICAgICAgITgiICAKLU0gICggICAgICAgICE6UiAgICAoICAgICAgICAhPzIgICAgKCAgICAgICAgIUQyICAgIDAgICAgICAgICEKLU1GQiAgICAwICAgICAgICAhSkIgICAgMCAgICAgICAgIU8iICAgIDAgICAgICAgICFRQiAgICAwICAgICAKLU0gICAhVVIgICAgMCAgICAgICAgIVpCICAgIDAgICAgICAgICFdMiAgICBAICAgICAgICAiIEIgICAgJCAKLU0gICAgICAgIicyICAgICQgICAgICAgICItMiAgICAkICAgICAgICAiNjIgICAgKCAgICAgICAgIj0yICAKLU0gICggICAgICAgICJDQiAgICAoICAgICAgICAiTFIgICAgMCAgICAgICAgIlMyICAgIDAgICAgICAgICIKLU1ZIiAgICAwICAgICAgICAjIVIgICAgMCAgICAgICAgIyYiICAgIDAgICAgICAgICMsIiAgICAwICAgICAKLU0gICAjMkIgICAgMCAgICAgICAgIzlCICAgIEAgICAgICAgICNBIiAgICAkICAgICAgICAjRkIgICAgJCAKLU0gICAgICAgI00iICAgICQgICAgICAgICNUUiAgICAoICAgICAgICAjWkIgICAgKCAgICAgICAgJCEyICAKLU0gICggICAgICAgICQpMiAgICAwICAgICAgICAkLkIgICAgMCAgICAgICAgJDRSICAgIDAgICAgICAgICQKLU08MiAgICAwICAgICAgICAkQSIgICAgMCAgICAgICAgJEdCICAgIDAgICAgICAgICROQiAgICAwICAgICAKLU0gICAkVDIgICAgQCAgICAgICAgJFpIICAgIUNfX19MJSAgICVAUiAgICFAICAgICAgICAlRDIgICAhQCAKLU0gICAgICAgJipYICAgIENfX19MJSAgICZPIiAgICBAICAgICAgICAmUiIgICAgQCAgICAgICAgJzZCMCAKLU0gICQgICAhNCAgICAgJDAgICdEICAgIT4gICAnOjIwICAgJCAgICFIICAgICAkMCAgJ0ggICAhUiAgICcKLU0/UjAgICAkICAgIVwgICAgICQwICAnTCAgICImICAgJ0VSMCAgICggICAiMCAgICAgJDAgICdUICAgIjoKLU0gICAnSVIwICAgKCAgICJEICAgICAkMCAgJ1ggICAiTiAgICdPQjAgICAoICAgIlggICAgICQwICAnXCAKLU0gICMiICAgJ1VSMCAgIDAgICAjLCAgICAgJDAgICgkICAgIzYgICAnWTIwICAgMCAgICNAICAgICAkMCAKLU0gKCggICAjSiAgICdeQjAgICAwICAgI1QgICAgICQwICAoLCAgICNeICAgKCQyMCAgIDAgICAkKCAgICAKLU0gJDAgICg0ICAgJDIgICAoKCIwICAgMCAgICQ8ICAgICAkMCAgKDggICAkRiAgICgtQjAgICAwICAgJFAKLU0gICAgICQwICAoPCAgICRaICAgKDNCMCAgIDAgICAlJCAgICAgJDAgIChEICAgJS4gICAoN0IwICAgQCAKLU0gICU6ICAgICAkMCAgKEggICAlRCAgICg8KCAgIClDX19fTCUgICAoVyIgICApQCAgICAgICAgKFlYICAKLU0gKSNfX19MJSAgICkpUiAgICkgICAgICAgICApLEIgICAgMCAgICAgICAgKTVIICAgIDNfX19MJSAgICkKLU0/MiAgICAwICAgICAgICApQyIgICAgMCAgICAgICAgKUpIICAgIDNfX19MJSAgIClRQiAgICAwICAgICAKLU0gICApVSggICAgM19fX0wlICAgKVxIICAgIDNfX19MJSAgICojSCAgICAzX19fTCUgICAqJlggICAgM18KLU1fX0wlICAgKjIiMCAgIDAgICAlUCAgICAgJDAgICsoICAgJVogICAgICQwICArLCAgICVaICAgICAkMCAKLU0gKzAgICAlWiAgICAgJDAgICs0ICAgJVogICAgICQwICArOCAgICYgICAgICAkMCAgKzwgICAmKCAgICAKLU0gJDAgICtAICAgJjAgICAgICQwICArRCAgICYwICAgICAkMCAgK0ggICAmOCAgICAgJDAgICtMICAgJkAKLU0gICAgICQwICArUCAgICZIICAgICAkMCAgK1QgICAmSCAgICAgJDAgICtYICAgJlAgICAgICQwICArXCAKLU0gICZYICAgICAkMCAgLCAgICAnICAgICAgJDAgICwkICAgJyAgICAgICQwICAsKCAgICcoICAgICAkMCAKLU0gLCwgICAnMCAgICAgJDAgICwwICAgJzggICAgICQwICAsNCAgICc4ICAgICAkMCAgLDggICAnQiAgICAKLU0gJDAgICw8ICAgJ1YgICAgICQwICAsQCAgICdWICAgICAkMCAgLEQgICAnViAgICAgJDAgICxIICAgKCAKLU0gICAgICQwICAsTCAgICgqICAgICAkMCAgLFAgICAoNCAgICAgJDAgICxUICAgKDQgICAgICQwICAsWCAKLU0gICg+ICAgICAkMCAgLFwgICAoSCAgICAgJDAgIC0gICAgKFIgICAgICQwICAtJCAgIChSICAgICAkMCAKLU0gLSggICAoXCAgICAgJDAgIC0sICAgKSYgICAgICQwICAtMCAgICkwICAgICAkMCAgLTQgICApMCAgICAKLU0gJDAgIC04ICAgKTogICAgICQwICAtPCAgIClEICAgICAkMCAgLUAgICApTiAgICAgJDAgIC1EICAgKU4KLU0gICAgICQwICAtSCAgIClYICAgICAkMCAgLUwgICAqLCAgICAgJDAgIC1QICAgKiwgICAgICQwICAtVCAKLU0gICo2ICAgICAkMCAgLVggICAqQCAgICAgJDAgIC1cICAgKkogICAgICQwICAuICAgICpKICAgICAkMCAKLU0gLiQgICAqVCAgICAgJDAgIC4oICAgKl4gICAgICQwICAuLCAgICsoICAgICAkMCAgLjAgICArKCAgICAKLU0gJDAgIC40ICAgKzIgICAgICQwICAuOCAgICs8ICAgICAkMCAgLjwgICArRiAgICAgJDAgIC5AICAgK0YKLU0gICAgICQwICAuRCAgICtQICAgICAkMCAgLkggICArWiAgICAgJDAgIC5MICAgLCQgICAgICQwICAuUCAKLU0gICwkICAgICAkMCAgLlQgICAsLiAgICAgJDAgIC5YICAgLDggICAgICQwICAuXCAgICw4ICAgICAkMCAKLU0gLyAgICAsQCAgICAgJDAgIC8kICAgLEggICAgICQwICAvKCAgICxQICAgICAkMCAgLywgICAsWCAgICAKLU0gJDAgIC8wICAgLFggICAgICQwICAvNCAgIC0iICAgICAkMCAgLzggICAtIiAgICAgJDAgIC88ICAgLSwKLU0gICAqNCAwICAvPCAgIC0wICAgKjUgMCAgICAgICAtMCAgICo3IDAgICAgICAgLiggICAqOFAwICFOKCAKLU0gIC5EICAgKjpQMCAgWTggICAuTCAgICo8UDAgIU4oICAgLlQgICAqPyA8ICE3KCAgISAkICAgKkEwNCAKLU0hMFggICAgICAgICpCUDQgIFdYICAgJVAgICAqRDA0ICBaICAgIC4oICAgKkVQNCAhQlggICAhKiAgICoKLU1IUDwgICkoICAhICggICAqSkBEICFUOCAgISBUICAgKkxARCAhXlggICEgViAgICpQMEQgISY4ICAhIFgKLU0gICAqVEBEICFZSCAgISBaICAgKlZQRCAgJFAgICEgXCAgICpaUEQgID1IICAhIF4gICAqXzBEICFfICAKLU0gISEgICAgKyEgRCAiJDAgICEhJCAgICskQEQgIUggICAhISggICArKEBEICFbRCAgISEsICAgKypARCAKLU0iJiQgICEhMCAgICsuMEQgIS1EICAhITQgICArMkBEICFMQCAgISE4ICAgKzRQRCAhNkwgICEhPCAgICsKLU03MEQgIVcsICAhIUQgICArOlBEICFFVCAgISFGICAgK0AgRCAhJkQgICEhSCAgICtFUEQgIElEICAhIUwKLU0gICArSUBEICAmVCAgISFQICAgK08gRCAhMiwgICEhVCAgICtVIEQgIU1UICAhIVwgICArWDBEICBALCAKLU0gISIkICAgK10wRCAgMEQgICEiLCAgICwiUEQgIDtMICAhIjQgICAsJjBEICAqNCAgISI8ICAgLCtARCAKLU0hVFwgICEiRCAgICwxMEQgIDxUICAhIkwgICAsNSBEICArRCAgISJUICAgLDkgRCAiJSggICEjJCAgICwKLU09IEQgIF9IICAhIyggICAsQlBEICEsQCAgISMsICAgLEkgRCAhQjggICEjMCAgICxNMEQgIUEwICAhIzQKLU0gICAsUzBEICFaUCAgISM4ICAgLFlQRCAhP0ggICEjPCAgICxdQEQgIFxYICAhI0AgICAtIyBEICIoMCAKLU0gISNEICAgLSkgRCAgSlggICEjSCAgIC0tIEQgIU8wICAhI0wgICAtMlBEICFcKCAgISNQICAgLTkgRCAKLU0gTzggICEjVCAgIC09MEQgIVQwICAhI1ggICAtQVBEICFSTCAgISNcICAgLURARCAhUlAgICEkNCAgIC0KLU1HMEQgIVw4ICAhJEwgICAtSUBEICFSICAgISRUICAgLUwgNCAgWkwgICAhNCAgIC1PMDQgIVZcICAgIUgKLU0gICAtVDA0ICFHNCAgICFcICAgLVlQNCAhOFQgICAiMCAgIC1dMDQgISc8ICAgIkQgICAuIkA0ICBILCAKLU0gICJYICAgLigwNCAhWlwgICAjLCAgIC4rMDQgIC8sICAgI0AgICAuMCA0ICEsNCAgICNUICAgLjUwNCAKLU0gLFwgICAkKCAgIC44QDQgISksICAgJDwgICAuPUA0ICBZRCAgICRQICAgLkMgNCAhMjwgICAlJCAgIC4KLU1GQDQgISlUICAgJTogICAuSjBEICFUNCAgISRcICAgLkwwRCAhWDQgICElJCAgIC5OMEQgIVxcICAhJzQKLU0gICAuUEBEICBHPCAgISc4ICAgLlNARCAhKVggICEnPCAgIC5VUEQgIE9AICAhJ0AgICAuWEBEICAyPCAKLU0gISdEICAgLlpQNCAgOkQgICAtVCAgIC5dIDQgIDswICAgLiQgICAuXzA8ICEsOCAgISBQICAgLyFQNCAKLU0gWTggICAuRCAgIC8kMDQgIU4oICAgLkwgICAvJiA0ICIhUCAgIC5UICAgLydQRCAhWTwgICEvRCAgIC8KLU0pRi1SPSMgTjtQIUc5JilNOTJZTyAmPUQ4RlVFK0YsIDo2WVQuRzBRLzcoUS5SVFIsMzBXLSNAUy1DMFgKLU0uUyhRLSM8VC4jLFYtIzxbICYtSDg3KFo9IyhdPEMoWywjTFEsQzxbICZRTztGPFo9IyxdPEMkWyszKFEKLU0tIzxULiMsVi0jQFssQyRULVMwWCxTOFQtU0wgPFZBTzxHMFo9IzBdPEMkWyszLFItUzhYLlMsUi1TOFcKLU0uUCFVO0ctSTlWWUU5IiFDOiYlUi5HMFUvNyhRLlMgWyxDNFUuUCFVO0ctSTlWWUU5IiFTOiZdUj0jSVQKLU0tQ1VSLDNMUC5TOFUtMyxVLlAhVTtHLUk5VllFOSIhTDtWWUcuRzBXLzcoUS5TIFsrMyRbICc1TjxWRUcKLU07RjVEKCZFTj0jSVQuI1VSLDNMUC5SVFEuUCFGOyZdQT0jSVQuM1VSLDNMVC5TIFsgJjFPPTYpTDkzSVQKLU0sMyBdPEMkWy4jTFAuUCFWO1ZFRC5HMFEsM1RRLDAgXy9TXFo9IyRSLzMkID1FXUM6JiVSLkQ8UiAnOT8KLU08VkVHO0Y1RDdWLUg4NyhaMVMoID1FXVU7Ry1JOVZZRTklXUM6JiVSLkQ8VSAnOT88VkFPPEcwWjFTMCAKLU09RV1TOjY9Tjk2MT88VkFPPEcwWjFTMCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0jSSctQCFWN1ZFTj0jSScKLU0sMCFWN1ctSTlWWUU5JV1JO0cwWjFTJCA9RV1VO0ctSTlWWUU5JV1JO0cwWjFTQCA9RV1MO1ZZRy5EPFEKLU0gJzk/PFZFRztGNUQ3VlFPO0Y8WjFTJCA9RV1VO0ctSTlWWUU5JV1MO1ZZRy5EPFggJzk/OUZRTzg3MFoKLU0xU0QgPUVdRDtXNUI7JjRaMVMkUCAnOT84VkFBPEVdQTxHKUE+M0knLDMsXTg3KFEuUyBbLDNMUiAnOT8KLU08VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyRTICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScKLU0sMzBdODcoUS5TIFssM0xVICc5PzxWQU88RzE/ODcpUjg3RFoxUyRVLzYlUiwzTFAuUyRbLSAhVjdXLUkKLU05VllFOSVdUzomXVI9JV1BPEcpQT4zSScsMzQgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1BPEcpQT4zSScKLU0sMzhdODcoUS5TIFssM0xWICc5Pzo2WVQ3ViVSPEYlWS5EPFEtU1VBPEMkWywjTFEuUyQgPUVdUzo2PU4KLU05NjE/OjZZVDdWJVI8RiVZLkQ8US1QIVY3VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUE+M0knLDNAXTg3KFEKLU0uUyBbLDNMWCAnOT87Jl1OOVVdQTxHKUE+M0knLDM8ID1FXVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4zSScKLU0sMzwgPUVdVTtHLUk5VllFOSVdTDtWWUc3ViVSPEYlWS5EPFEuICFWN1Y5TDtWJVQ3ViVSPEYlWS5EPFEKLU0uM1VBPEMkWywjTFEuU0QgPUVdRDtXNUI7JjU/ODcpUjg3RFoxUyhQLzYlUiwzTFAuUyRbLDMgID1FXUMKLU06JiVSN1chTzo2WVQ5NyhaMVMoUS8ySFIgJzk/PFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPENJJyxDJCAKLU09RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTKFIvMkhVICc5PzxWQU88RzE/PCZdSTtHMUUKLU08Q0knLEMsXSpDMCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPENJJyxDLCA9RV1VO0ctSTlWWUUKLU05JV1TOiZdUj0lXVA7VkVOPSY1Ui5EPFItI1RKLUAhVjdWRU49JV1QO1ZFTj0mNVIuRDxSLTNUSiwwIVYKLU03Vy1JOVZZRTklXUk7RzE/PCZdSTtHMUU8Q0knLEM0ID1FXVU7Ry1JOVZZRTklXUk7RzE/PCZdSTtHMUUKLU08Q0knLEM4XSpDQCA9RV1MO1ZZRzdXIU86NllUOTcoWjFTKFUgJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUkKLU07RzFFPENJJyxDNCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdXIU86NllUOTcoWjFTKFYgJzk/OUZRTzg3MT8KLU08Jl1JO0cxRTxDSScsQzxdKkNEID1FXUQ7VzVCOyY1PzwmXUk7RzFFPENJJyxDQF0qQyRQICcxPzxXMVIKLU09Ni1ULkUwUi4zVVMsQzFWN1YtSDg3KT87NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIKLU0uQzBMLDM4TCwzOFs9RV1JO0cxPzs2NU04RjVSLkMkTCxTKEwsUyhbPUVdTDtWWUc3VlVFOzYpRTxDSFEKLU0rIzhUKyMsUi5XOT85RlFPODcxPzs2NU04RjVSLkNETC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKLU0uQyRQKyMkUi4iUFYtI0xbICc5PzxXMVI9Ni1ULDNJJyxDRCA9RV1TPScpVThXMFIuRDxTLCNVUyxDMVYKLU03Vi1IODcpPzs2NU04RjVSLkMoTCwiUFguVzk/PFZBTzxHMT87NjVNOEY1Ui5DMEwsMzhMLDM4Wz1FXUkKLU07RzE/OzY1TThGNVIuQyRMLFMoTCxTKFs9RV1MO1ZZRzdWVUU7NilFPENIUSsjOFQrIyxSLlc5PzlGUU8KLU04NzE/OzY1TThGNVIuQ0RMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFArIyRSLiJQVi0jTFsKLU0gJzE/PTZZSTtWWFo1IyxRLzc0WD1FXUM6JiVSN1ZVRTs2KUU8Q0hSKyMgTC4jTVY3Vy1IO1cpVDdWVUUKLU07NilFPENIVCsjIEwsMzhbPUVdSTtHMT87NjVNOEY1Ui5DJEwsIlBTLENNVjdWUU87Rj0/OzY1TThGNVIKLU0uQyRMLCJQUyxDTVY3VjlMO1YlVDdWVUU7NilFPENIWSsjIEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKLU0uQyRQKyMgTC1DMFsuUCFWN1c1Tjo2XU4uRDxTLDAhVjdXNU46Nl1OLENJJyxTKF09M0FWN1YtSDg3KT8KLU07NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIuQzBMLCJQUS1DTVY3VkVOPSVdTTk2VUIKLU05NyhaLDJQUCsjLFIuVzk/OyZdTjlVXU05NlVCOTcoWiwyUFArIyxSLlc5PzlGUU84NzE/OzY1TThGNVIKLU0uQ0RMLCJQUyxDTVY3VjFPPTYpTDk1XU05NlVCOTcoWiwzIEwsIlBWLSNMWyAnOT84VkFBPEVdRj02WUMKLU0uRDhSICc5PzxWRUc7RjVEN1YtSDg3KT85RzVOOFNJJixAIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU4KLU04U0kmLTAhVjdXLUg7VylUN1Y5VTtGLFoxQzAgPUVdUzo2PU45NjE/PFZBTzxHMT85RzVOOFNJJi0gIVYKLU03VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RixaMUM4ID1FXUk7RzE/OUc1TjhTSSYsMCFWN1ctSTlWWUUKLU05JV1JO0cxPzlHNU44U0kmLDAhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQy5EOFggJzk/OyZdTjlVXUYKLU09NllDLkQ4USAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhTSSYsMCFWN1c1TjxWRUc7RjVEN1ZRTztGPT8KLU05RzVOOFNJJi4gIVY3VjlMO1YlVDdWOVU7RixaMUNEID1FXUQ7VzVCOyY1PzlHNU44U0kmLDMgIDsmRU4KLU06U0k0LFMsXTxTJFUsRllFPicwWixTMF0qQyxTKyMgTCxTKFs7JkVOOlY5VTtGLFosUzRdKkMsVi82OFMKLU0tIlBTLEJQUyxDTVM9JzVGOUNIUy1TVUE8QyRbLCNMUC5TLFgvNiVSLDNMUC5TJFssU0RdODcoUS5TIFsKLU0sQ0xSLjJQVi0iUFEsMzRSLlNMIDxVXUw6NllLLkQ8Uy0gIVQ9NV1MOjZZSy5FMFQsI1VVLDMwVDtGNVgKLU09I0hTLSJQUCsjLFIuVlFJO0ZNRj02WUMuQyxVKyMgTCxTKFs8VzFVOUY4WixTPEwsIlBRLDM0Ui5TTCAKLU09NV1MOjZZSy5EPFQsICFQPEZFTTg3KVkuRDxULDNVRTxGNUQuQyBMOVcpRTk2WFosMlFCOyc1RS5DKEwKLU0uUCFDO1ZRTzxHLFo1IzBSLzY1WTk2UUw7VzxaLCJRUD03KVA7JjRaLDJRUDo2WUsuQyhMLlAhTjtWWVAKLU08RkVNODcpWS5EPFQsQCFDOyc1TjpWNVIuRDxULFNVRThWQUU9R0RaLCJRRjtXKUQuQyRMLlAhQzg3KVMKLU0uRTBULSNVRThGVVcuQyBMPCZdUjxWLUg5M0hRKyNMIDxXIU88RzFTOFYlUi5EPFQtICFCO1ZdTDk2JU4KLU0uRzBULTNVRTFEJSw0VDRaLCJRNDRFNSUuQyRMLlAhQj1GJUw8U0k0LSM4XTk2OUE7Jy1FLkMgTD0nKVUKLU05M0hRKyNMIDhGXU87JjVBO0MoWj0jMFYgJlVJPFZdUjkmNVI5NjBaNSMwVy82NVQ9VlxaLEJRTztGNFoKLU0sMlFaOTcpTy5DIEw9JkFSOTY0WixSUFsgJlVBOjZYWjFDJCArNlFHICVdUzhWLVM6NjAgOTdBST0iWU8KLU0gJjlBOlYtVStGXCA3VjVYOjcwTjtQIUM5NylSO1coTjtQIT85NllWOjcpTztAIVM9JiVSPSAhPzs2JUkKLU07QCE/OTdBST0gIT87Nl1OOFZdTj0nKU87ICFNOFZdVTtHMCA3Vzk/OFZBQTxAIT89RV1TOjY9Tjk2MT8KLU04VkFBPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSICVdVjdXLUg7VylUICVdVjdXLUk5VllFOSVdUzomXVIKLU09ICE/PUVdVTtHLUk5VllFOSVdUzomXVI9ICE/PUVdSTtHMCA3Vzk/PFZFRztGNUQ3VkVOPSAhPz1FXVUKLU07Ry1JOVZZRTklXUk7RzAgN1c5PzsmXU45UCE/PUVdUzo2PU45NjE/OyZdTjlQIT89RV1VO0ctSTlWWUUKLU05JV1MO1ZZRyAlXVY3VjlMO1YlVCAlXVY3VjFPPTYpTDkwIT89RV1DOiYlUjdWJVI8RiVZICVdVjdXLUkKLU05VllFOSVdQzomJVI3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0QgN1c5PzxWQU8KLU08RzE/ODcpUjg3RCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdXLUgKLU07VylUN1YlUjxGJVkgJV1WN1ZFTj0lXUE8RylBPjAhPz1FXVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWSAlXVYKLU03VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUE+MCE/PUVdTDtWWUc3ViVSPEYlWSAlXVY3Vy1JOVZZRTklXUwKLU07VllHN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEIDdXOT85RlFPODcxPzg3KVIKLU04N0QgN1c5PzkmXVU4RlFFN1YlUjxGJVkgJV1WN1YtSDg3KT88Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT8KLU04VkFBPEVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCE/PUVdUzomXVIKLU09JV1QO1ZFTj0mNVIgJV1WN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQKLU03Vy1IO1cpVDdXIU86NllUOTcoIDdXOT86NllUN1chTzo2WVQ5NyggN1c5PzxWRUc7RjVEN1ZFTj0lXVAKLU07VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdWUU87Rj0/PCZdSTtHMUUKLU08QCE/PUVdUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzwmXUkKLU07RzFFPEAhPz1FXUY7Jl1BPSVdUDtWRU49JjVSICVdVjdWMU89NilMOTVdUDtWRU49JjVSICVdVjdXLVQKLU08RzVDPSMkIDdXOT88VzFSPTYtVCxAIT89RV1VO0ZFTztAIT89RV1VO0ZFTztDKCA3Vzk/OFZBQTxFXUYKLU09NllDICVdVjdXLUk5VllFOSVdQzomJVI3VjlVO0YsIDdXOT89NllTOjY9Tjk2MT84VkFBPEVdRj02WUMKLU0gJV1WN1ctSDtXKVQ3VjlVO0YsIDdXOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA3Vzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT85RzVOOFAhPz1FXUk7RzE/OUc1TjhQIT89RV1TOjY9Tjk2MT86NllUN1Y5VTtGLCAKLU03Vzk/PTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgN1c5PzsmXU45VV1GPTZZQyAlXVY3Vy1JOVZZRTklXUwKLU07VllHN1Y5VTtGLCA3Vzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDICVdVjdWOUw7ViVUN1Y5VTtGLCAKLU03Vzk/OSZdVThGUUU3VjlVO0YsIDdXLT87JkVOOlAhPz01XUw6NllLICVdUDxGRU04NylZICVdTjtWWVAKLU08RkVNODcpWSAlXUM7JzVOOlY1UiAlXVM8Jl1SPSctQzg3KCA3VV1EOEYlUjlXLCA3VV1EOEctVThGLCAKLU03VV1EOEctVThGWCA3VV1MOVVdRjsmJUcgJV0/OFZRRTg2WVU8ICE/N1Y1WDo3MCA4VjVSPEZdUiAlXUUKLU08RylOO1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSUgICAgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dDIudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0Mi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTIwOTYxLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0Mi51CisrKyAvZGV2L251bGwKQEAgLTEsMjIwOCArMCwwIEBACi1iZWdpbiA3NzcgbTY4ay1hb3V0MgotTSAwKCEiUCAgQCAgICAsICAgICAgICAgICdCMCAgIiBAICAgICAgICAgICEtXiAgICkhPSdbUCAkKEArRQotTUA0R1MmIDBDUyAgIiAgISpOMCAgKEA5RyAgICY4MCAgKkRBNDIlLE8gRFpZICAgQkYkWlkgICBDOU1bXAotTSAgUE8gJFpZICAgRjAlQi8rUCEuTjAgIClNQS41T18oMi48UCAkQVogOlEoPiAgIDInSCFCRFpaIDM7PwotTV8gICAgIEBNMC9fUDInQCAoJEFOX1xATyAkWlogM1M/XyAgICAhICxAICAgICIhRyIkJ1ogNzlAICAkVAotTSMmWCEiX18qOU8gRC8gICAnX180S09fLCBIK19fQCAgIUgoICBAICAoICswS09fMFQqW19VJEFaIDYpKAotTT4gICArUltfXCJcWiA5QE8uQCZAK1AhKD4gICAzS0ggUy1fXCAgICAmIlUgX15ATytPXywrUltfXCJcWgotTSA3QE8uQCVYK1JbX1QiICJUKltfWiJcIDNLSCBITV9cICAgICYiOCBFKltfUyJcIigiW19aLSJOX1xQTwotTSAkWlogKSM/XyAgICAgUSg+QCRCMidAICAkQVogLEUuTkAhRjQoXE0wL19MMkpbX1UmOCQ2KF1AKERBWAotTSAgIE8gIlxaIDFATy5AJDgrUltfVS06Tl9dIE8gVFpaICQzP18gICAgIVEhXk9bKCs0Q19fIlVZICAoIAotTSAvX1grN0ggOy9fVDImW19aJEFYICAkQDtPX0hUPltfVyRaMDQoXSxXUCAsM0VZLj0yIU8gIFEoPiAgJQotTTghUEA7UCA8MidAIDFWIDIoJlwgIyRBWCAkRUAiIiFPICEhKD4gICMzRCFFIERZVStRQSg0JEFYICApKAotTT4gICAyJ0AgISRZICtXUCAgICFfICAxKD4gICEzRCAgICAgICtXNVM8Ql1MOjYoTzsmME48VlwgK1YxRQotTT1CXVo5NylPICAgICAgIDg4VylULCNIQDtGXEArVzVTPEJdTDo2KE87JjBOPFZcKiAgICApNi1SPSMgWgotTSgiXVU8VyhPOyZFQitWUUQrRy1PKCZVQTwnIUk7RjxAOUYlSTsnNVI5MEggICAgICRWLVI9IyBaKCZZTwotTSgiXUQ5NzhPPkY1UjtQSCBAICAgIEggICAhKCAgICAnICAgICEwICAgICAgICRbWSAgIEVSICAgM0U4IAotTSAkKiA4ICAgIERZPjNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICQqIAotTTggICAgRFk+M0c1LjVAICAwSCFAICAgIjNFWS49NFk2ICAhIkAmICAgICkuN0RZVTNFOCAgJCogOCAgIAotTSBEWT4zRzUuNUAgIDBIIUAgICAiM0VZLj00WTYgICEiQCYgICAgKS43RFlVM0U4ICAkKiA4ICAgIERZPgotTTNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICcgIDggICAgRFk+M0c1LgotTTVAICA8ICFSICYgICAgKS43RFlVM0U4ICAmJ18gICAiMEQoWSAgKlA0IS9cICAkICBLITIkX1AgIEAgIgotTUwlMFNfICAjICAqUDVDL1wgIDAgIEshOCxfUCAhMCAiTCVJUCFCLyAgICpQNycgJyhcICAgSyFAPCBAQwotTVAgICJMJjFQIjIvICAgKlA6JyAqKFwgICBLIUw8IExDUCAgIkwnIENfJCsoICAgICBLIVQoX1EgOjAgIAotTSAgKlA+JCpZICAqUD8hL1kgICpQNCAgIkwoIDNeMCAiTCUoICBLIiIkX0QgIEshNCAgKlBBIy9ZICAqUAotTTVAICJMKEBTXjAgIkwlQCAgSyIsLF9EICBLITogICpQRCIvWSAgKlA3ICAiTClAQ14wICJMJiAgIEsiQAotTShfRCAgSyFEICAqUEoiL1kgICpQOiAgIkwrIENeMCAiTCZQICBLIlgoX0QgIEshUCAgKlBQIi9ZICAqUAotTT0gICJMLEBDXjAgIkwnQCAgSyMwKF9EICBLIVwgICpQVSIvXCAgKlA0ICAiTC4gQ18gICJMJSggIEsjRAotTShfUCAgSyE0ICAqUFoiL1wgICpQNUAgIkwuUENfICAiTCVAICBLI1AoX1AgIEshOiAgKlBdIi9cICAqUAotTTcgICJML0BDXyAgIkwmICAgSyNcKF9QICBLIUQgICpRICIvXCAgKlA6ICAiTDAwQ18gICJMJlAgIEskKAotTShfUCAgSyFQICAqUSMiL1wgICpQPSAgIkwxIENfICAiTCdAICBLJDQ8IChDUCAgIkwxQENQICAiTDFRUAotTSAyLyAgICpRKCIvICAgKlEpIi9ZICAqUSogICJMMyBTXjAgIkw8ICAgSycoM0VZLj0wICAzRTggICJcKwotTStQSSJAJCdZICAqUiMkSjA5UEE4MiUqIDJJIUZeJEogO1ExJ14wICJMQEElXFBQICglKS5EJUUqTVxJTQotTV1CMU5fX0BGO09fXDNFWS49NFk2ICAgTyJEN1kgICpSJSRKMjlQQEA2RFowMkkpRl4kKkcyJ0QgICI1IAotTTg/XCAgICNGKSZbX18kWT4zRzUuNUAgIDJLRCAgQCBcOUBJUCAyLyAgICggLyYmXDNFWS49NENHQCwhLgotTU4wICAqXEEqMCY8LDNLRCAgIk1IMy1cIyA0WVUyJ0AgLzRBWiAhOSg+ICAiM0tEICAiOy4yJ0AgOFRaWQotTSAgIEZWJFUjLUNAWC4jJEA5RlFPODcxSTtGPEA8Jl1JO0cwQDtGXVQoJiVWODZFTDg2KUw5MiBNKzIhUAotTTxGXUc8RiVNKCcpRTw3NUk8RjVTKCZFVCJAICAgICAgICRZNl9fQShVUiIgK0JYICImIDQoXlQgIiAgIgotTUxBQE8rMCAkK1A8QDU0WjA0JFxKPjAgIkxBQSpDNjtCM0tEICAiO1ArUD0uTjAgIClNQTgzVFNOKCgjXwotTV4kWT4zRzQgICRZNl9fUE5DNEFYICBRLk4wICArUEE4M1JJIDJIVUYhJyNfOCFISktAICgqVlggIyAgJAotTSpXRCAgSyg4ICBAQ1MwICJMQUFQICJJTl9fUS43RFlVICAhLl4wICApTiEoPiAgJDNEIUVcRFlVMidAIAotTSA0WSAgICBDUCAgIiAkMVBfVFlVICAgICAgICAzRTggICRBWSAgIEchRFpZICAgVyglQS8zRVkuPTRZNgotTV9fQShVUiIgKkZYICInW18ySFVHPCMgTSAhICJAICAgIDAtRy5DIE0gISAoICAgJjlDIFArMCAwIiAgIAotTSBGPCQ/QCFAIyRBNTNLRCAgIj40NiRcTiAhIE0gISkpUCJcIDNLRCAgI0FWNiRdKkAmUCI/T1xQKzAgMAotTSIgICAgVjwwK1JUICIkWlkgICBQJ0VBLzBKVCAiJClNICEhIkUyTU0gIEAgISQqTSAgUEAhVFNOKCgjXwotTV4kWT4zRzUuNU9fXCtIVEo7QCAoLCJUICQgQCAgICVGKUYgXCwiVCAkIEAgICAlRykkSk0gIEFHJ0IgTQotTSAgMlBLMCAoOFExKDU0WlkgICBJOEVBLywiVCAkIEAgICApR1RDIE0gISAoICAgJTlQMVBfViAiPCAgSgotTTtPX1wzRVkuPTRZNl9eUShVUiMgKkZYICMhUE4gIExQKzAgMCBIICAgICIyIyggICAgIiI5Q1BAKzAgKAotTVQqVCAjKyJNICAxQyAgIlwoJlQgISUpKCpUQCAhISUmX19cLCFAICo5QCAhJ0RBNTNLRCAgIkVCNiRdXgotTV9bIic5QCAhIyYgICAwMFArMCAwP0E7IEFXWCZMKD1GLCFVJl9fXSJFNEFYICAlKDtPX18kIlQgJERHIAotTStQIS5OMCAgKUxZXiA7Iic5UCAgVUAhTSAiICAkJyNfOCAgIFNDIE0gISFeJEwiJz9AKlBBVjhAMkpUIAotTSImPDooIlQgISsiTSAgQUYpJEo1OUIgUCswIDAgSCAgICAiJDlBMSg1NFpZICAgSVlFQS8ySCFHIUcjXwotTTggICBDIyBNICEgIkAgICAgKDFGIC9cRjIlNS5OMCAgKjYpODNVLjU7MSBAOzAgJDREQEsyICAkJDQ7XwotTV9WISwsIlQgJCBAICAgPUcsQiA1MSgiUEswICw7IkBAOzAgJCQoOCwhQCAqOVEgQDswICQ0REBLMiAgJAotTSQiQ19fViA8MiU0QDswICQ8ICAwJCYgJjIlNVAgISAmK1AhLk4wICApXyEwM1MgTSAhICggICAlOVAxUAotTV9WICQ8ICAwIURTTigsI19bJFk+M0c1LjVPX1AyLTxQUCJJTiAgQEg7MCAoKyJUICEpUiwqVFAgISMgTQotTSAhICJAICAgICgxRyEnWCA4IDBOKzAgLCpIPSpFNlAkP0AhQCBCWDUoIlQgIi0iTSAgUjBLMCAkTCg9TAotTSJEQTUzS0QgICJNIDYkXSpBRlxAK1A5KDUhIE0gISkpUCJcIDNLRCAgIjsuTyghRyJAIU0gIiAgJCcjXwotTTggKVAgJFNOLCwjX1wkWT4zRzUuNU9fWDItPEBAIklOICBAUCswIDA/QSsgQVdYIkwoPUcnQyBNICEgIgotTUAgICAgMClGIScjXzgmQVBbXCFNICEhUiBIISEuVCAgJCMgTSAhICggICAmOURZKkswICg5QEkoNTRaWQotTSAgIEpARUEvKCJUICErIk0gIEFGLSMgTSAhICJAICAgICgxRioiSk0gIFEqRTZQJD9AIUAgQlg1KCJUIAotTSItIk0gIFIwSzAgJEwoPUwiREE1M0tEICAiTSA2JF1QICRTTigoI19eJFk+M0c1LjVPXlQyLTxAUCJJTgotTSAgQDArMCAyMjwgTCAjIE0gISAoICAgIjlROEA+MCAiIEkxIVwmWCAqVEAgIidYKCpUPCAjJiFaK1A5LgotTU4wICAtNyE4M1RKIDlQWCA7MCIgICEgTi8gICAgKCFAJ0RBTl9cME8hRFpZICAgWEFFIS8ySCFNIUJYTgotTV9fIU4hQlhcICAgJCAiICc0KCBPICRaWSAgIE8iJUEvKlQgICImPCwgJlQgIiAgMCpUPCAjJiBAKCdEIAotTSBAKjQwPyFOICJNKCAgQV4iIk0nICBQIjs/XV8gISAgOzAgJCAhIEs7MCAoICAxLFtCIyBfWzEuN0RZVQotTTNFO19dIilOICBAQDowIChUPkQgIyIgKEQqRCAhJkgmKFRAICEmICZMKSVMIEIqIDNFWS49NENHUCwgQAotTS4wICIgJFAsMCAgJDlAOFAvICAyOCIwLDAgICM5QDhQLyAgLjghQCwwICAiOUA4UC8gICo4IFAsMCAgIQotTTlAOFAvICAmM0clIV4wICJKWlFAIUItUSAgICAgQik4TF9QICAgICA5TyEuMERTPyBQLS49MCAgICAgIAotTSAkW1kgICBLWiAgIDNFOCAgJyghKFwkICBLKDwoJlggJCVSSCAgUS43RFlVM0U7X1kiWicyS0QgIEAhOAotTTlRSCxOMCAgICAoICBAITg5QCAgUSdYIyhcPCAgQCEsOCAgIE4iVVwgICBLVC9fVDBKW19eJCpOX19RKAotTTtPX0gyJltfXSRBWCAgPS5OMCAgLVohL1tQICwwS0QgIEsoPDNLRCAgI0g4MiZbX10kQU5fXkEoPiAgJwotTTNLRCAgIz5AM15cICMkSlkgICpSJyY8JD9AJUAgR1giKFw8ICBAITgjK0QgICAgIiAgKCA2JjkuP0AsQwotTVFQICIgJFEuTjAgIC5DISpAJjhWMidEICAiU0AyJ0QgIEArJDNLRCAgI0VQNCRdKD4wICArMiEoPjAgIgotTSBMMS5OMCAgLjchMDNUQVkgICgiUSRaWSAgIEdFJUEvM0tEICAjSDgjK0QgICAgIiAgKCA2JjgkPCAlQAotTSBHICArQltfWSRZPjNHNCooJSFMOTYlUzkyIU47VzFFLkIhLTBTOFguI0BRKCc1UDlXKUE5JjRAPSZcQAotTTAzRFMzQiFNODctSygmVUE+MiFCOTIhQTknOUk8ViVCOyY0TiggSCA0VjVFKCQ5TDtWJVQ6NllHKzUhTwotTTo2WVQoJSFSO1Y9Ujg2VU05NyhHPFIhJz02RUQ5MlgqICRZNl9eUShVUyNAKidQICBAIlAqRTBKK0AgLAotTSsiWCAiJiAwTypUICImMCQqJFVAISRHTSAgMEo1JEotOUAxXiAmICQrQlQgIytaJTkuIS5OMCAgLSgwTgotTSAmPSQqKDxAMVQqMDBKQCAhIiUmICBAQTEwICwoJDhAQTJBJzYoPSpDNjw+TypUICImLCwqKFUpWzAgJAotTSpGVCAhJiAoKCQ8QEMyWC0qRTUqQzY7QkZcVEAxUiItKihVLFtDI0BfXlEuN0RZVTNFO19aJEM3LC8gSgotTTtAICgqJTRMJSY4JD4gIUAhQiEmKiJAICMiWEwgIDFGISdIIDggOEAxUkhIICBSXEFWPVROKDVFLiRKJgotTTlWQSpBJjg6KCQ4QCogICg2KCBPICRBWSAgKCBcJFpZICAgVTclIS84JFhKQUVCJipEOEwlNjgkPiAhQAotTS8iISYqIkAgIyYgVDJIPUcsJEolOUFIQDFSIEggIEE4QCJcIDInRCAgQCQkM0tEICAjNTw0JF1AJUJKJwotTSpEPE4lNjgkPkAhQCFCIScqQkAgIytSJzlIUSJFNEE0M0tEICAjNSI2JF0sW0MjUF9eQS43RFlVM0U7XwotTVkkQzcsKCBKO0AgKCglNSpCJjgkPCAhQCEiIEggIFBINCIpSCAgMSpDJjgkP0AhQClCWEwgIFFAKCtaIQotTTkxOEpDJE9MICAwSDU0Siw5QDFeICYgOCtCUCAjJiAyKkhESjIyKTUySEVGIScoIDggMEIqMCAsT0ghQgotTVQrKiA4TFBKQiIiLCg0RCAhJFNOLCgjX1kkWT4zRzUuNU9fRDItPFBeIkBOICBBOEEnWChOKD1EISdAKAotTTggOTZBLjIsWThRKk4wICIgKyFGISdIIDggSEA+MCAiICsgSiogICxOSDFEJSJcJDNLRCAgIy8oNiRdKgotTUAmOCY8ICFAICAjIionUCAgQCJQKkUxQCgrWiY4QFJeQSYwNDI+VCAhIkkjOCEiXEEmNCgyPlQgISJJIwotTTggMEgzMkklKkE0RiswICQySDVGISdYIDggOEAxMlhIICBRKkBWOCQ/ICFAIUIhIysiQCAjK1okOStKXAotTUEmMlYoIlQgIykiJD9AQlBBVigwKkJUICIkQTQzS0QgICJXOjYkXUArQkhNICBATiE9WiQoJDRGJCk6JAotTSpULCAjIiEnKCgtMk4wICIgJzBLMVAgKDIlMS5OMCAgK0kxODNSISUoKDBAMTIgMFQ7RCAgQCJENEtEIAotTSBAIkhOK0QgIEAiODkgOTJOMCAiICdBOEEyICUzLlhQXi9fRDNFWS49NFk2X14hKFVTI1wpIlggIiEgIgotTT9ALyBBVjw2K1ApKD4wICIgMUEuTjAgIC01UTAzVyAgOCAgIFwrMlkgICggTSY0KE0rRCAgQCJYOFBZXgotTSVCLycgICggMScgIDggICBUQlAiNjg4QDFCQDBGO0QgIEAiRDRbRCAgQCJIKidQICBAIlAqRTEqQzY8IAotTSAqKE4rMCAoKUJUICMrUic5I0BKIU1KJE5IPUYlLUIjNFtEICBAIVQyJTEuTjAgICs9STgzViFQTkg9QwotTSUiXCcrUDkoPjAgIiA1PS5OMCAgLTVRUCAmIU4qJFVANStSJzhTUEohXUojTkg5RiVCUCdWKC0zTjAgIgotTSAnMSg1JFpZICAgTVZFQS84IypaQUYsNCtQKSg+MCAiIDc5Lk4wICAtNVEwM1cgIDgjISlbMCAkOCEwTwotTSBEQVkgICghRiRaWSAgIFU3JSEvPCAhQCVCSTQySFVGIC9dQitQME8hRFpZICAgTTIlIS88ICUsW0MjXAotTV9eIS43RFlVM0U7X1wkQzcsLCBIO0AgKCsiWCAkIlhOICBSPkFHKChPSCVFKCRPVDogIEpBUkImNEtEIAotTSBAIVQ0S0QgIEAiSDImVCAhJFpZICAgUCdFQS82JFBAIyRTTiwsI19cJFk+M0c1LjVPX0AyLTxYXiJJTgotTSAgQEAjN1gjUCg9RiQrT1kgICggTSY0KE5fRCAgQCJYOFE5KDU0QVkgICghTkRaWSAgIFU3JSEvPCAhQAotTSAgI1QxXldfXyJAMzA/LSggIlAoMidAICAyXCQyJS0uTjAgICxMIS9bUCAsP09eUEFWOCY8ICFAICAjKgotTStCWCAjJUInPkBCXkE2MCQ9QEFAIiU6J1koX0VDUjgnTigtRSQiXCMrUDEoNFRaWSAgIFEwJiAgIClaXAotTU4wICIgK0FEOEJBXCAgKCBMIkk0KCQ4SiQmICoyPlQgISYgIiokVEo1JEotOUAxXiAmICQrQlQgIytaJQotTTkzSE4rMCAoTyg9RVkrUic4TUhOIS1aJU9ILUUpREE0M0tEICAiVzo2JF0zTjAgIiAnMztOMCAiICowRgotTUFSXCMrUD0oNFRaWSAgIFEwJiBSK1JYICMkWlkgICBPIiVBLypEISpDNjw+NiRNOUEiXCQyJTUoNFRaWQotTSAgIF0iJF9PICBRKDRUWlkgICBQJ0VBLyggVSxbQ0NYX14hLjdEWVUzRTtfWSRDNy8uIEorQCAsKyJYIAotTSIiMSZVPDRGPyAgIiArIUAiIjktOCAxJ1swICQqRS0qQzY4JD9AIUAhIlhNICBSXkE2NCAgLDhIOzAgKAotTU8oUUYnJEEzM0tEICAiVzo2JF87TjAgIiAqMTJOMCAiICpBUCA2ICAgKjJcQyY2XCtAUz5FK1InOStCVQotTVFWLDoySlggJCY8MCtQOSg+MCAiIEQ9Lk4wICAtNVEwM1cjXzgnQlVRVjhOMiUtLk4wICArPUk4M1UqWQotTSAgKCA9LU5ZICAoIEklMlkgICggSilONDImUCAhJFpZICAgUCdFQS88ICVAMURBMzNLRCAgIlc6NiRdNAotTU4wICIgJzBAJS0mWSAgKCBJJTpZICAoIEoiICdEKDoxRSlaKikoPSg7ICAkM0tEICAjID42JF0oOkAgJAotTTNLRCAgIyA+NiRdUCA2ICI8ICEsW0NTQF9eMS43RFlVM0U7X10kQzcoLCEqTjAgIiAmUUYoRFpZICAgWAotTUlCLyAgICggOyRaWSAgIFRBIkkgMkhVRy5EQTUzS0QgICM1IjYkXE4uMCAiICZRM0FdWk4gIEEsPjcgJwotTSAgKCA7JFBZPCA8ICBAIUwrIDxPIURaWSAgIFhYJUEvKkQhUl9bTyE5QDFQICYhLDJLRCAgQCJUOUA4QwotTVMwICIgKzEhXTZAIChcQCAgQCJYKkg8QC4wICIgK0IwTjAgIiArMENQICAiICcjP04wICIgKjEyTjAgIgotTSAnMTJOMCAiICpBKDswICQzS0QgICMgPjYkXVAgNFNOKCwjX10kWT4zRzUuNU9fWDItPEBAJEpZICAoIAotTVEmPDYqR0QgIEAjJCgnRCAgQCMkKF0gICBAIyQ4ICAgQ0RKWSAgKCBQJllQK0NQICAiICQrUD0uTjAgIAotTS4uITgzUkkgPE9eUEA2ODIyJ0QgIEApWTNLRCAgIzU8NiRdUCAmITwyS0QgIEAiVDlAOENTMCAiICswSgotTUFUJ00gIDBDUiAgIiArUENfICAgIEAgICBAIyAwPzVYICIvKCAgKCBOIiBZICAoIE4pIlkgICggTSIvIAotTSAgKCA8LV5ZICAoIEslLlkgICggUCJJWSAgKCBPJ1gwV1tEICBAIlwoIFUsW0IiIF9fQS43RFlVM0U4IAotTSAiIU4gIEBATjAgIiAsMENbQCAoICAoIFEkWT4zRzUuNUAgIDxBOENQMCAiICQxLjdEWVUgICAgICRZNgotTV9eQE5BUlhZICAoIDEkQU5fXlEoPjQgMjUgJE8rQCAoM0tEICAjQlYySCFMIkIvJyAgKCAxJyAgOCApUAotTSAyWE5fXkEuN0RZVTNFO19fIlotMktEICBKWkw5Q0BKPyAgIiBJUFArMCAwIEggICAgJCM5QDBAIzYhSAotTTJeVCAlK09cICAoJScmN0QzS0QgICM4XDJIIUYjJygsKFwkICBAISQ8ICFAMUJJWSAgKk5LJEo1OVIwQAotTTUzIEggISAiQCAgICAwLUclRUEtTl9EICBKWlA5PjFSJiIvISAgKCAxJyAgOCFBKkU2ODIyJ0AgJSRBWAotTSAgJS5OMCAgLzkhMDNSSiAoITRKO09fXDNFWS49NFk2X19BKFVSIiAzS0QgICNCNitAISg+ICAkK1A9LgotTU4wICAvOSEwM1IvICAgKk5LJEpZICAqTksmOCQ8ICFANyIgJ1lYIE8gJFpZICAgTyIlQS8oXCAgIEAqNAotTTlBQE8uMCAiS0pRLk4wICAsIVk4M1QqWSAgKk5LJyAgOCJYQD4wICJLSlEhXCdQIChcQCAgSlpQK0NQIAotTSBAKjwqR0QgIEpaTDggOEpRVyg0V0gkLEFQICIhMVFFXEcgITMuWEBAL19YM0VZLj00WTZfX1BOQzRKWQotTSAgKk5LJjgqM0tEICAjOFwySCFHK0JJWSAgKk5LK09ZICAqTkwmMEAySTVGJERBWCAhMSg+ICAhM0tEIAotTSAjVjA0JFxKQCVBLU5fRCAgSlpQOT4gSjtPX1wzRVkuPTRZNl9fUE5DNEpOICBBRzlESlkgICpOSyY4SgotTSpHUCAgQCo8LCJUICQgKiAgICAhIFY8KjIlNEA7QCAoM0khODNUT00gITJbXyAgIiExUUQtRiM8KkdEIAotTSBKWkxOX0QgIEpaUDkiOSpFNjw4KCU0UCogIDAgSCAgICAkIzlQSE8lMiFOICBBLkQlQS82JFZbXjAgIgotTUtLIUVWQklOX19RLjdEWVUgICAgICAgIDNFO19WJEM3Ly4gTitAICg7UDlcKCtaJjswOV4lRiAgICo4RAotTTtAIDArIlggIyIgJzRYIVIgPiZBK1AlLk4wICAuLDk4M1JIIDJfRCAgSyhAMl81XCAiOTUyJShPIUJcJwotTTNLRCAgI0VGM15cICMkSiA6VTkqQUY8VjA+W19dIikmKC1EQFYyIzkyPltfXSJQNDlQWVIgO1IhOVBASgotTUFCQlwgICBZJiQqRzIlME8hVFpZICAgWTlEX08gIFEqQCZMPDJISUciQFIyICAgWSYmOCIpKExPITRaWQotTSAgIFhVRUEvPCAhQCZCWFkgICggMSJcJTNLRCAgI0M2NiRcSkJSLycgICggMScjXzMuWFxYL184M0VZLgotTT00W1kgICBGWCRBWCAgOS4wJjdSM0c1Ll4wICApTiEoPiAgXjNEIUVcRFlVM09EICAiO0AyJ0AgNjRZIAotTTk/KS49NFtZICAgRlgkQVggJCEuMCY3UjNHNS5eMCAgKU4hKD4gIFYzRCFFXERZVTNPRCAgIjtAMidAIAotTTs0WSA5PykuPTRbWSAgIEZYJEFYICZZLjAmN1IzRzRAK1AgJDVIIVJfLCIhVCtEICBANDwrVCAgISRBWAotTSAhJS4wJjQwKCNEICBANDwoXlwgISAgIiExUS49NFtZICAgRlggICAgICAgICRDR1AsIS5OMCAgLkcgQAotTStQJDBZOEBAPyAgIkxCIEA8IEAgK1JcISciXE8gMVBPK1AkPCtSXCEnJFowV19QICAgIDAzS0QgICNKWAotTTMtXCMgXV9cICAgICIkQVggKE0uMCRbWSAgIEZYJEFYICZRLjAmN1IzRzUuNU9PWDItPEBAIklOICBBIQotTVtAIDArQEBQKzAgMCIgICAgNjg2LCJUICQgQCAgIEFHIiAhTSAgKCAkJiAkPC9dQDpDIE0gISAoICAgIgotTTlUWCI7P19bICEhIVtPUCAqVEAgIiQnTl8gIEsyICAkKldQICAgMCAgIFEoNTJcJytSWCAjJFpZICAgXQotTVgkX08gIFBOICRBNTNLRCAgIj40NiRcIDswICQgISEiSzAgKDBKVCAjJCo1OCEhKDUyXCcrUlggIyRaWQotTSAgIF1YIlggKCA9LFtCIiBeX0EuN0RZVSAgI1IuSVAgICAxLj0wICAgICAgICAgICAgICAgICAgICAjUgotTS5FMDQgIkNSICYwICMoIEVAICAgOUE7Ui5FMCAgIVtSICYwICMoICBAICAgOUAxUCA2ICIwSCEuPTNfUAotTSAgICAgICAhLiBfX19fWCAgICAgICAgIEdfUCAgICNcK1JcIF8kJ08gIDBAKiAkMCgsICwwICAoOVJQQAotTS4wICIgJFBAUCBRICAgMUYiJFpZICAgW1lGIDYjJCAgIFY4KDNLRCAgI0taOCBALDAgICI5QClBNkRZVQotTTA+XCAhIiA4IyQgICImPEooIUAsMCAgJDlAQS5OMCAgLyYhQCZAUSAgIC1GIiRaWSAgIFshRiAsIyQgIAotTSBGOCYzS0QgICNNVitVPCEgLV9cICAgISAkWVVcQSNQUC8oSE8gICAmJFlVXEFDMFAvKDBHICEuPTIpWQotTSAgKCVVIyBJX19YKCAgIC45UEBRPyEhQyAiIUAoRElJX19ZSlokQUggIiBPLyQgIiAgIE8uMCAiTEohLgotTU4wICAuKzs/XyAgICAgUFM/ISFDX19QUz8hISBfX1BARDIlMSAgMEE0MCAoKDUkICMiJTEgISBBNDAgNAotTSg1JCAmIiUxICFRLj0yKVkgICglVSMgSV9fWCggICAuOVApQChESUlfX1lKW0RBSCAiME8vJCAiICAgTwotTS4wICJMSiEuTjAgIC4rOz9fICAgICBQUz8hIUNfX1BTPyEhIV9fUEJEIipIICAwQkogICgoSkAgIyIqSAotTSAhIEJKICA0KEpAICYiKkggIVBQKj9fXiIgICAjRj9WLFZAICgvX1wzRzdSJC8jIFQ/UCAgICA4XEFCXAotTSAiKVxYICAvJSIjOSgtREBWMiM5KC1EQFYyIzkoLURAVjIjOSgtRENfICAgICAjQCAgXiQoR1NAICBYIAotTSgtREBWMiM5KC1EQFYyIzkoLURAVjIpXFggICAgIi1cICAgICAgXDwoV1AgICAgICNRMEM/ICAgICAoKAotTVQvKFxCICAgICAgIFxDUjAgICAgICAhLj0yL1wgICAgIC4gICNYM1ImLSMgXEFCPCAtJ1wgICAgKyIpXAotTVggICwgIis4KE1AQlYiKzgoTUBCViIrOChNQjFfICAgICRQQj8uICAjUTBCViIrOChNQEI/LiAgICAgQAotTSogIDggSCAgICAgLyhUIChUIi1IICFQKTYiLVwgICAgICBHJCghISFaICAoM0tEICAjUz4oIkNfXyQnSAotTSAgQS5OMCAgLy1ZLj00QSAiICAgI1Y4OiBEID9fIi4wICAhKDAgQCAgIF1GIkApICdfUENKICAkICAhLgotTT0wICAgICAgICIhTyAgMEI7UCAoKCJcICMmXSwoQEYyQiZQICAgMSRAOyogOzAgIDAjKCgiICQgICY8JAotTSRNQTNAIigpIiAkICAmOD4oQCNEQiYgIihNQTFSL19cMEQhM0AmM1QoICQiQCAgICAgLUAgQSs4NDxDXwotTV8kKSA0WCFEXSRZVUxcQU4kJiAiJE1BMVIvX1wwRCEzQCYzVDNHNzFQLS8gOCAoMyglJyhfX1EiMCUuIAotTTkvMS49MCAgICAhLjVPX1gyLTwgUCJQTiAgQSwrRiAmICBQTyFEWlkgICBPIiVBLytAIUYhJyAgOCBYTwotTSFCXCczS0QgICRfWDQkXEAhVFNOICwjX14kWT4zRzUuNUAgICtSWCAiJFpZICAgUCdFQS8zRVkuPTRZNgotTV1IIShVU1NcM0tEICAlWFYoJCBANCFVMF9fXSJLT19YP0AkTTFfX1QwSltfXCJVTiAgU19ZIlVOX14zXwotTVoiVU5fXkNfWyJVTl9eU19YIklOICBAPCc2PSYpRlggJCMgSyAhIV4kTCInP0AqUEFWOEAySkwgIiY8OgotTSgiTCAhKyJLICBBRipESjM5QjhQKlAgMCBIICAgICIkOUFJKDRUWlkgICBJWUVBLzJIIUcjJyNfOCAgLgotTT4nICA4ICAuPEcwICkmTCAhIlgzMD5bVlEiVShdSyEhW087JCs0Q1ZNJCdOXUwwTTIvOzQjIDggKTY8IAotTSBCQTNBVkhMLCJMICQgKiAgICAgQSY8KiggPSRAKyJLICBRTSVCPSogIDEoNFRaWSAgIEk4RUEvKSZMIAotTSEiWDM0WDw0UUUqIjggIC1OQiFOX15ASDQlQk5fXkEqQyY4JionRCAgQDREJyFRRyAgVkA0WD1KKyMgSwotTSAhICJAICAgICgxRyJCICcxKCJQSlAgLDsxOEcyQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJSw5MgotTUBGIyQoJltfWiIgMCcgIThLT19INFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJAotTTIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUsOTJARiAgIzI4QDtPX0grISE4S09fSDJIOUoxJS4nOkJQUAotTSpQIDAgSCAgICAiJDlQSEAhVDIgTCpMICMmVDYpVEggISRBMzNLRCAgIkVCNiRcRDpQICQrQS0zQVEzXAotTSAiVTJARDImOCBIQDtPX0grISE4S09fSConRCAgQDRIMj5bW1dSSFkgICglKiIgJjMnUCAgMCAgICBIQAotTTExRFAmICEsPyYgJiAgICAiRjtGOCAgIEIiSFkgICglKyIhTl9eQEwkJUJOX15BKVtPTz8ySDlHICAiWAotTTJIOUc6JyAvUCg4QDExRFAiICNIQ0Y7UjglQEouMCAiITJAQDtPX0grISE4S09fSDI+W1tXVEomOVAgIAotTUJESiY5U0lQI1wiJigkNDksIEAgWihZRlxGIEoqQ0QgIEA0SCgmW19aIlAwNipbX1okR05eXV0qQUY9PAotTTJIOUcjRyAnUCg4QDExRFAiICNGQ0Y7UjA+W1tXUjgoTjwtRCAgUDQnIVEzQVZITCwiTCAkICogICAgIAotTUEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLykmTCAhIlgzNFg8NFFFKiJOPC1FUUYgIAotTSJdOVwsJiAgX0cxNTM2IS4oJFUyMzEgMDI8IVw+KyImOE5ZIV5AIFA8QFZQJiUzKV9fUUZYIyBbJEA5LgotTV5QICJfSCtfN09bKl9QK14vT1oiX11TXkBPXzxfVVtfLC9XTl9MS18sJ0FVPFchTzsmRUg5Ji04NTRdJAotTTBCW1tUVChOXl0pIitPTzEwQltbVCQoTl5cXSIrT08uOCI4PT8gICFeXSlAJ0FVXCAgJ1tUNiA2JzdQIAotTSA/TzA4IFg9PyAgIV5cXUAhQVVcICAnW1NFKS0kITUpUCdQQEwoOUdXR1BDTCg5R1gnUEtMKDlHUEdQTQotTUwoOUdRJ1BQTCg5R1VGITwySltfXSY8OjImW1sgIlxOX14wTytAICgzS0QgICRTSjNeXCAjJCpOX18wLAotTUtAICAgIytfXCZYNCgiW19cJC9WIzIjWl8iVSldSkhNND9fSDghUE07T08kX15ATytPX1AyJltfWiJcTgotTSAgQS5OMCAgM0dZL1tQICw0RFQsJTAgSjlAICBIRSktMiZbW1IkQTUzS0QgICRePjQkXEogJj1UMkpbXwotTV0mPDoyJltbICJcTl9eME8rQCAoM0tEICAkU0ozXlwgIyQqTl9fMCxLQCAgICMrW1ImWDQoIltbUiQvVgotTSMyI1pfIlUpXUpITTQ/X0A4IVBNO09PJF9eIE8rT08oMiZbX1giXE4gIEEuTjAgIDNHWS9bUCAsKCZbXwotTVgiUDA2KltfWCRKJjpAQSRBQVVcICAnW1QySSU4JEBAO09fSCshIThLT19IMkg5Si5EMiYnN1AgID9PMQotTTgjIVwgJCpOX18hQCVBID0yPCFaLCkiJVcoOEIhTjYhVygnPEAiVSZfXyAwJTRCIDA/RCAgQDc9IiMgIAotTSBAICA5TUAsJTAgTjlAICBPJSktIyE0ICpGOCAgKEkyMzRBTl5PUSg1NFpZICAhL0dFIS8qICFHOiRKTgotTV9fMUcmREFOXlAgTytPX0QrUlggIiRaWSAgISxaRF9PICBRIktPX1QjKlggICAgUl5PUU4lIiBOXk9RIwotTV1AVEBeT1BNMj86Sis1J19bJiA8KzZbW1EvX0wrUltaXyRBTl9eUE8rQCAoM0tEICAkWV4zXlwgIyIhTgotTV9eUEokJUJOX15QSjEmIFYoJltfWiJIMDYqW19aJiBKPkAgMCU0QiAwP0QgIEA3PSIjICAgQCAgOVE4MAotTSc0RyA+IyIwQS1KJShAN0VAPUohVkghQFZHS18jITQgKSY8IF9AKSJLT0tYKzdQICBANSReTzEiS09LUAotTSs3UCAgQDUkXk5RQCAgOUgnN1AgID9PMzggICY3QVVcICBLWlpWIC4nN1AgIi9LSzggOD0/ICAwXk5NKgotTUE2UCI+QCRAO09fSCohIThLT19IIyJYIDkvS0o5USAsK0AhJF5OSUciIFBOICZHWlpGOE4ySDFMIyJVXAotTSAgKCUxP0tUMSgxQCdESE5eXSlHIkJVXCAgKCUxX0tUOCBZKitPTzA5UEBNPyAgIiE0R1pdJEhOXlxZRwotTSVCXE5eTzEuTjAgIDQpITgzUkEmRjwiWVE2XCIqQFAsK0AhOF5OSUYiIjhZICAoJSsmICYpQ0QgIEA0SAotTTI+W1tXUSBOXk5NKVAnKChMKCVHIicoMEwoJUclRiEgMkgxRzAnICdQKDBAMFFEUCIgI0ZDJjtSOCMhKgotTUEmPEw8IF8gQSIhIyYzICggLkIsOU8pQCciICQzJ1AgIDAgICAgSEAwUURQJiAhLD8kICQgICAgIkRKJAotTTlOMSFbT08/KUBAQCMpIiNUKDRNMC9LWDJCW1tTVjwgITs6WVBWOFI4ICAlS0BSTiAgICAgP0tYOyAgJQotTUhHSCErNDdaXiYgICE5QE0/ICAiITRPWl0mICAhOFBNPyAgIiE0W1pdJiAgITggMCtPS0oyPCFaNisiJQotTTleQVo7WyIlOVwhWj4rIiU5XSFAICA1RDJINUwgR0gmMkJbW1RWOFgoJltfWiJVMF5OIE06ICAkXk4xMAotTUtPX0gyJltWViRBTl5NQSg7T0s8KCA1MkAiXCArUltaWSJcTl5OIS5OMCAgOD9BL1tQIDg4IzhIO087NAotTT1BIzZDIiFOX15ASFQlQk5fXkJZUFY3UjImW1ZWJEFOXk1BKDtPSzwoIDUyQCJcIDImW1ZRJFpZICAiKAotTTwkX08gITBIMCRKTl5NQUciQlVcICAoJTQ/S1Q4IVkqK09PMjlQSE0/ICAiITUvWl0mIC4yQltbVCY8KAotTSs3UCAgQDU1Xk8wLCtAIFldTUFPJURHTl1NQSFbICAhKUBAQDBUSDA5UCAgU0UqIzgvMSFbT080KUBBKgotTSUmPCQmIVFAIEdAUCgkLDBBJSojMkg1RiFESE5eXF1HIiIhIyQqW19fVSojKzQ3WlwmIC4yQTFHJCUuTgotTV5PIEAwUSI8NEgtKktPS1A7TlEpW09PNCMiWCAsLzs4OVE4SitPSzw0WDVKJCQyJTggUSFbTzsgKkBBWAotTSEmIFg+QCEoO086XjwgIFAhMlwgM0tEICAnQjA0JF0iK087Ij4mMlpBJlc4Iyg0ICAgL0g7IEkhW086XwotTSpAQVghNiAoMD5bVk9CSCg+IDhNMS86WDRYNEghNEpOXk1RTiIgUE4gIyNWViY4JD5CTUAgR0hNKCQwMAotTUE1LiQrNDNaWyIhJCQqW1paREhOXl0lRiEnSCE4IClaICEgTl5cWSlQLCIlOVAgI08iXE5eTzEuTjAgIAotTTQpITgzVCdOXl0wQiBZKihUKCcwS09LUFQqW1ZOIigmREggTTA/S1g4ICAjRERKJTsgKVohREhOXl0tRgotTS0iIU5fXkBNNC9LQCs2QCAhL0tENCpbX1okQU5dTUEoO09LODImW1pXIlwlK1JbWlkiXE5eTiEuTjAgIAotTThMWS9bUCA4OCMoSDtPOlQ9QSM2QyIhTl9eQEhUJUJOX15CWVBWN1IyJltWViRBTl5NQSg7T0s8K1A1KAotTTtPOyQzS0QgIChFJjNeXCAlIkEgMkpbWlYmPCorN1AgIEA1N15PMUAnREhOXl0pRyJCVVwgICglNj9LVAotTTggWSorT08wOVBATT8gICIhNU9aXSBQTiAjR1ZWJlw2Mj5bVlYkJ0wgICRGIiIhIzJBIUcgICs2NEgtQAotTV0kJ05eXTBGIiJATl5NUU4iQiEjJCtQICwlKiM4ITkqJSY4KCgkLDBPICBQOCAwQDBRIjw0SC0zQSY7SgotTTJCW1tTVjgkMkg1TyIiISMkKltfX1UqIyogNEAhOSIlKzQjWlwmIDw0SltaVyRKTl5NUU8hJEg0OUBAQAotTTBRIlwgIyFAISIhIyQpUTJAVS4kOk4hKitPTzE5QDhYPyAgITggKjlTISBOXlxZKVAiKCxQKCVHKEJcTgotTV5PMS5OMCAgNCkhODNUJ05eXTBCIFkqKFQoJzBLT0tQKEA6MkAiVSFeT0EpW09PNDggICIpJEolOyAxWgotTSFGICYySDVGIEdIITJCW1tUVjhUKCZbX1oiVTBeTiBNOiAgJF5OMTBLT19IMiZbVlYhIE5eXF0pUCJcIAotTStQNE8rT0tEK1JbWlgkWlkgICFFS0RfTyAhMUAsQkFOXUshViQtOiwoJltfWiJDMDYqW19aK0cjOT8pKAotTTtPOzgkIltbU1RHICtQIE8hNEFOXUwxLk4wICBCQ1EvW1AgMDI+W1ZWIFBOICJXVlYmOCwrN1AgIEA1PQotTV5PMTIzJiA+MkJbW1RGPCorN1AgIEA1P15PMUAjREhOXl0hRyIiVVwgICglOD9LVCQiW1paREIgMD9EIAotTSBANz0iIyAgICAgIDlSSEYjJiAqKCQsLCQgIUU5UEEyQFIhIzJBIUZcIiEjIyEgIDk2OCQkK1AgMTIhIwotTTJBIUckJSojOC84RiMmICI0SCxAMFRIMDlPQSJLT0tQMkJbW1Q2OCQ+QCVAIEdIICQiW1tTREcgUCg1RwotTSAgJC4rUltaXSRaWSAgITBEJUEvKEAuMkMtIiEoQDoyQCJVIV5PQUAgICNQKCZbX1oiIDAnNCNbVSVCTgotTV9eQSlbT080MD5QICAyOCg4ICAgVSIhTl9eQEg0JUJOX15BKkE2SCYqQ1FfX19fXzJIUUYhQkFZICAoJQotTSknQCA4IDpYQTZQKDRIMD03LzpPOU8xKitPTzE5QDFaIDYgIj5AIDArT08uMjwjIEE2PCgoIDowQSJVIAotTV5PQTMzIjgsRjwxQD9HSCErNDdfXiYhVjI+W1paRCdMICAkRiImIUooJFUyMzFVMF5OSDArT0tKMjwhWAotTT4rIiQ4TiEhXkAgXjxBMlAmJTMpX19RRlRDIFskQDkuXlAgIiBHI1k+T0s+X0FbWTwvRiJeN0tZQk9dMgotTV43S1pXT1JQX0FbX1VPRVpfXTtfUE9GIl9WW1k+T0YqPic1UztWWUw6NkFHOUY1RDhVQTUzVFEnMTQwIAotTSAkSk5eTyFMISdIIDggMEorT0tQMkpbWl4mUCQ+ICFAISJATl5PQE8rT0tUM0tEICAlIjA2JFxNMC86SgotTStSW1pbJFpZICAhMEQlQS9HKDY8QCIgI0QoUjxAKVIkRypbVkpESE5eXSVGPkYgVjRYPUorIyBLICEgIgotTUAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RzJAICQyJS0uTjAgICo2KTgzUjFLICAwTiRVLiclL1AgKCUqIgotTTRYOUpRRiBcNFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJDIlLS5OMCAgKjYpOAotTTNSMUsgIDBOJFUuJygmW1pdITMwNEgpMktPS1QoJltaXSRIMDlLUUAtRS4nOkJQUCpQIDAgSCAgICAiJAotTTlQSEAhVDIgTCpMICMmVDYpVEggISRBMzNLRCAgIkVCNiRcRDpQICQrQS0zQVEzXCAjITJARS5OXk9BSgotTVErRyM5JyEzQVZITCwiTCAkICogICAgIEEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLwotTSkmTCAhIlgzNFg8NFclKiJOPC1FUiYgVjRYPUorIyBLICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RwotTTJAICQyJS0uTjAgICo2KTgzUjFLICAwTiRVLiclL1AgLCUqIjRaW1pcJkskOCNRM0FWSEwsIkwgJCAqIAotTSAgICBBJjwqKCA9JEArIksgIFFNJUI9KiAgMSg0VFpZICAgSThFQS8pJkwgISJYMzRYPEA7T0tMJS0hMgotTUBFKk5eTlBAO09LTDJBIUZPJEhOXl0lRy8mIFY0WD1KKyMgSyAhICJAICAgICgxRyJCICcxKCJQSlAgLAotTTsxOEcyQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJS9QICglKiI0WDlKUUBSTiAgICAgP19YOUEgQAotTTtPX0goJSE4S09fSCgoKSJLT19YJyFVRiAvKCQpVEggISI6JywiTCAkICogICAgIEEmPFAsIkwgJCBAIAotTSAgKUYnKTdLICBATyJEQVggIEhPKlAgKDNLRCAgJSooM15cICMkSiA5UEkoNFRaWSAgIEk4RUEvLCJMIAotTSQgQCAgIDVHIScjXzggKEAgRFNOLy9TVkAkWT4zRzUuNU9cPDItPFxYJEFYICxBIklUQU5fU0EuTjAgIAotTTQjQS9bUCAsPk9dXCAiQU4gIEEoPiAgRTIlMS5OMCAgODBBMDNSWCA5UCAgX0UqJyokPE8uMCAiITMhKAotTTUkWlkgICFBNiUhLytAICwtICBEPiAhRiREQTQzS0QgICUiUDYkXTNAIlAgNEg/OVFXWCAoIDtFQCQ/VgotTSIyI18uIlxZICAoJS0kQTQzS0QgICYlODQkXzlQIjEsNERQMCRERyA8Ry5QQDYpQDA/SCA6RygqTCFBNAotTVI/X1w5RShQLlEoJjNPTCAgT11aICFQIClAIEYgIjggKUAgRiAhOCAuICBSICJQICFQICE4KlggIVAgIgotTS5HUCAgNiBcLkdQICEmIFYuR1AgIFYgUC5HUCAhRiBKIiA8ICAmPCYuR1AgIVYgPi5HUCAiJiA4IiA8IAotTSAmPzAuR1AgIEYgLDxXIU47Jj1GOTQ9JSpCNCAySDlNI0coUk8oJUwiIjotTkg5TCBCSCY0SDk4MlBAJwotTSAgJUcgL1tcIkg8ICAgICI4ICNfMEdYIDJINU00JE9OX1NATCtAIDAoRDhCS0AgLDJJNUYkRyghKkglQAotTSMlIk4gIFFAKiVCTiAgUUAoQiA1NFghUiFbIiE4QUBQLlBIJjNPTCAgT19IX15DX1ovX0JfXitfWi9fSAotTV9eQTJBVUImNiRWXkE2XlgzLlhcWC9cPDNFWS49NFk2X11RKFVTU1gpJlggIidIUisgNEo7QCAsKUJYIAotTSQmICxOSC1HICAjUjYpNTJBNSomKiRJWCAmICI0SDpaQFY8ICAtQSg+ICBFMiUxLk4wICA4MEEwM1JYIAotTTlQICBRJSonKiQ8Ty4wICIhM0EoNSRaWSAgIUE2JSEvK0AgLC0gIEQ+ICFGJCRBNDNLRCAgJSJQNiRcTAotTSAlKidWPD5aQUY6Uj4gJV4gIlxZICAoJS8kQTQzS0QgICYlODQkXzlQIjksNERQMCRURyA8Ry5QQDYpIgotTTA/SCAyJygqTCFBNFI/X1w5QzBQLlEoJjNPTCAgT11WICFQICkgIEQgIjAgKSAgRCAhOCArICBAICIgIAotTSFQICE4KlggIVAgIjYpNUAnIEAnICAhMEU2IDQiIDwgICVCNTggUVM8JllMOVY5RTFUNEopMCEyQTUqJgotTSIgPCAgNjwgX1MgKkFQICAgIClAIC9dVjJIMUcgL1wsMkgxRiAvXDIzLlhcXi9fPDNFWS49NFk2X18xKAotTVVQIyA/QCFcICIpTiAgQUAlJSomV0g8QiFeNiFXSCQyJjRHIVdIJVIsKVohJCElKEAkJ1kgICglVzBAUAotTSAgKCAgJjs6Mkg5RyRAUDEgIjFGIyIhTiAgUEBBVSkpKCBFQCBHICAzLlggUC9fVDNFWS49MilPICAwQAotTStQICg7UykiQDBATyAgICAhVjwkJEwlM0AiISBZKEFAIEIrITQ8Q19fJCkgNFghRF0iICgiICAgIDY8IgotTSxMJCggICAgOVAoMlA0WVUgICBCK1AgKDlQWDAgPiYpJEAjQUIxKCBYOEQyICIpTyAgMEArUCAsO1MgKAotTStQICAgID1HISErITRYIEAwLjIoOCAoQlA1JyhfX1EiMCUuIDkvMEAiIEAgICAlRyBDKyEiICAgICY8IgotTSRMJEArUCAkM0c0ICAgICAoJlwgISIpKDxPXSomNT8pX19RRiAvX1g0WEYzUiIgKTNHNCAgICAgICAhLgotTTVPX1AyLTwgUCIpTiAgQVIgISAxMjwgTiAkJ1kgICglVzBAUCAgKVggJjkkMD9EICBANz0iIyAgIFdAIAotTTlROTIyMSAxMjwgTiAmI0g8QCUyMjEgMTI8IE4gJiAuKCA9XCpbIiY5XllcKzsiJjleOSFeMCAiIT1UKAotTSwgICI+ICFGIScgIDgjKVwsKVInOCBbPEFCICZZOCM8QCcgUEQoPzxAJSkpJCElKVAiWCAwP0QgIEA3PQotTSIjICAgR0AgOU1RKkA2OCIxKDhAIURTTiAsI19cJFk+M0c0ICAgICAgICEuNU9fXDA/RCAgQDc9VD5YIAotTSIhIDA8QC8gQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAJyBANFk+M0c1LjVPX1wwP0QgIEA3PQotTVQ+WCAiISAwPEArIEA0WT4zRzUuNU9fXDA/RCAgQDc9VD5YICIhIDA8QDMgQDRZPjNHNS41T19cMD9EIAotTSBANz1UPlggIiEgMDxEIyBANFk+M0c1LjVPX1wwP0QgIEA3PVQ+WCAiISAwPEBDIEA0WT4zRzUuNU9fXAotTTA/RCAgQDc9VD5YICIhIDA8QSMgQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAPyBANFk+M0c1LgotTTVPX1wwP0QgIEA3PVQ+WCAiISAwIEggICAgIjczRVkuPTRZNl9fUSFeMCAiIT1XMVtAICgkISFSJVwiIQotTTNFWS49NFk2X19RIV4wICIhPVcxW0AgKCQhIVIoLCIhM0VZLj00WTZfX1FQICBSTiAgICA/UCAoNFwhJAotTSAkWT4zRzUuNU9fXCgiWCAiJylfUCglLjdEWVUzRTtfXCRDNyAsIEA7QCAoJEJYICNSWE4gISEzQVZMLAotTSchQlwgNjtWNFRAQCImICI8ICEsW0AjIF9fIS43RFlVM0U7XU8kQzcgLyEqLjAgIkxNIUYhRFpZICAhQAotTURCQE4gIEBKK0AgLDlAICQgREokOUAgIEVHQCA/QCBMLyAgIkxNIEovICAiTE1cTyEyXCYzS0QgICYkSAotTTQkXSpAJjgyNEg9UiNdSiFXKCVSIUtaITs+KSpBJj04MidEICBLKzAyJ0QgIEpbJDNLRCAgKE9YNCRdXgotTSNQOicgICpSVCJQXCAgKlMuNEFZICAoKDUkQVkgICpOUSRaWSAgIitUJSEvK1A9KD4wICJLTDEuTjAgIAotTUJdITAzV0gvV0g2XkFGNzQoI1AgIEpbJDggICNHQiBcICAqUlQmICAgWTBAISIoIFo4JSRALSIhIUggIAotTSBLKyE4ICAjQCRBWCAiXE8hNFpZICAhQSIlIS8ySCFHICAkVitQNS5OMCAgNCkhODNXWVhMKD1OICAsOAotTStQNSg+MCAiS0wxLk4wICBCX0EwM1JYXCAgKk5RJ1AgMidEICBAQTYrUD0uTjAgIDg5ITAzUlggOUAgIAotTU1HICA4ICAjKUJcJzInQCAgNFpZICAhMk4lIS8ySCFGICAiWjwgIUAgICwsK1A9KD4gICIzS0QgICUqWAotTTQkXSpAJjggICohUCAmICAgTyhPIVRBWCAgLS5OMCAgNEtBMDNUSiA5QCAgQUcgIDggICJWIlwnMidAIAotTSEkWlkgICEyTiUhLzJIIUY7JyAgOCAgIlAiXCcyJ0AgITRaWSAgITJOJSEvMkghRjUnICA4ICAiSiJcJwotTTInQCAhRFpZICAhMk4lIS8ySCFGLycgIDggICJEIlwnMidAICFUWlkgICEyTiUhLzJIIUYpJyAgOCAgIgotTT4iICY8QDpQQDYoNiwjTCohRFtbICArXzBPXTxfVztfRC9eSF9cI19WJ1ggNEg5UiFbUiE7MCNfI0RBWQotTSAgKCg2JCpHM0tEICAmJjA0JF0qQCY4ICAuKSg+MCAiTE0hKDtPV1wrUDUuTjAgIDVRIS9bUCAsL0AhTQotTSAgJzoyRD1HLCRBWCAwJSg7T1dcMidEICBANzwzS0QgIChNIDNeXCAjJEFYIDAlKDtPW10yJ0QgIEA8IAotTTNLRCAgKE0gM15cICMkSiQ5QCAhVURBWSAgKlJXVEFOXzxQTyE0WlkgICE3PERfTyAgUE4gJj1QKCQ9KgotTSQmPSQyS0QgIEBBKDlQWE8uMCAiIiRBLk4wICAsIVk4M1IvJyAgKCgyJEFYICMhIVtPVywzXl9fVCIpLwotTSwjUCAiUis4NDxDX18iXFkgICgoMSRaWSAgIiswJF9PICNBKkEmOCAgNlEoPjAgIkxOWE8hNEFYICAtKAotTT4wICIiJUkuTjAgIDZZOS9bUCAwL0AhTCFHICA4ICAhNERJJzlQUShRUlwnM0tEICAjQVY2JF0qQSY4IAotTSAzISg+MCAiTE9VKDtPVywrUDUuTjAgIDYmMS9bUCAsK0AhRyAgIz4oJD0qJCY8VDJLRCAgQEEsOVBYTwotTS4wICIiJFEuTjAgICwhWTgzUi8nICAoKDMkQVggIyEoO09XLCtTRCAgQEEkM0tEICAoTSAzXlwgIyRKJAotTTlAICBVJEFZICAqUyMiXCUyJ0AgITRBWSAgKCg4RFpZICAhO0VEX08gISBeICZQLDBHRCAgQEAyPCAhQAotTSAgIlQyRD1HJEQpWSAgKCgkREMnK1A9Lk4wICAuJzk4M1RKJDlAICBDJEFZICAqUyZSXCUyJ0AgIURBWQotTSAgKCg6VFpZICAhO0VEX08gISBeICZUVDJEPUcjJEMnK1A9Lk4wICAuJzk4M1RKJDlFOSg+MCAiTFJITwotTSE0QVggID0oPjAgIiInOS5OMCAgNlk5L1tQIDAvQCFMIScgIDgjWSoxVjxOMiw8TyFUWlkgICBYPUVBLwotTTgiIEAhJ1gnTCg9QiYjIFsiQDkuXlAgIl8pW11ZT1hcX0o7XlhPXF5fWDtfTkQqRytQMS5OMCAgNEtBMAotTTNUU04gLyNdTyRZPjNHNS41T19cK0g8TytAIDArUlggIiRBWCAgJSg+MCAiIigpLk4wICA2WTkvW1AgMAotTStAIU8sREFYIEAoTytAICwrUD0uTjAgIEJJOS9bUCAsIyggICAgKCI5UFBPIVRaWSAgIFg9RUEvP09cTwotTSFUWlkgICBYPUVBLyggPE4rT19cM0VZLj00WTZfWzEoVVIjQCtSWCAkIlxOICBBKD4gICIyJ0QgIEBCKwotTTNLRCAgJU42M15cICQiSCA7MCAgT0RKJTlASEAvICAiIik5QCAgIlIyJltfUSJcJTNLRCAgI0ImNCRdKgotTUAmOCAgKVBAK09fNDUoIE8gJFpZICAgTyIlQS8rQCFHICAiJitSW19VIlwnK1A1Lk4wICBCSTkvW1AgLAotTUwqW19VJjlCKkZYICMiUCdXKltfVSIhJiQrUCAiRSomKCQ5IiQkQTUrUD0uTjAgIDZDKTAzUlAgOVMpKAotTTswICQrUDkuTjAgIDZDKTAzUlAgOVIhKDswICgrUDkuTjAgIDZGQTAzVEogOVBYTyE0WlkgICBYPUVBLwotTSggPUAlQlwlM0tEICAjQVY2JFxPIVRaWSAgIFAnRUEvPCAhLFtCI0BfWzEuN0RZVTNFO19NJEM3KC4gTwotTStAIDArUlggIiRBWCAgMSg+MCAiIik9Lk4wICA2WTkvW1AgMCsgIU0gICY6Mkg5RiJCIFwgICgoSFYgIAotTSA4WSg7T18kK1A5Lk4wICAuKDkwM1RKIDlAICE+IiBOX10xNEAiXCAzS0QgICJcKDYkXEogJjwgIDYoTwotTStPXzQrUDRPIURaWSAgIipFRF9PICBSUEtPXzQ5QCAhL0JJTiAgUE4hPVpOX10wQDFRIlwgIEkyQVIhJwotTTBBISg7MCAsK1A1Lk4wICA2QykwM1JYIDlQICEiREFNICEgTyFUWlkgICE6LEUhLytAIUcgICNWMiZUIAotTSUiXCczS0QgICVIUjQkXE4gJjwgIC4pKDswIDgrUD0uTjAgIDZDKTAzUlggOVAgIFNEQU0gIVBPIVRaWQotTSAgITo6JSEvK0AhRyAgIloyJlQgKCJcJzNLRCAgJUhSNCRcTiAmPCAgKjkoOzAgRCtQPS5OMCAgNkMpMAotTTNSWCA5UCAgRERBTSAiRE8hVFpZICAhOk4lIS8rQCFHP0RBTSAiSE8hVFpZICAhOyclIS8rQCFHOyRBTQotTSAiTE8hVFpZICAhOyclIS8rQCFHNkRBTSAiUE8hVFpZICAhOyclIS8rQCFHMiRBTSAiVE8hVFpZICAhOwotTSclIS8rQCFHLURBTSAiWE8hVFpZICAhOk4lIS8rQCFHKSRBTSAiXE8hVFpZICAhOk4lIS8ySCFHJEJcJgotTTNLRCAgI0FWNiRcQC8gICJMT1VAJUJcJjNLRCAgI0FWNiRcTyE0WlkgICBQJ0VBLzwgISxbQiNAX1sxLgotTTdEWVUzRTtfXyJaJytCWCAiIiFOICBQQEFUQVggIEhPIVRaWSAgIUEiJSEvK0AhRiEnICA4IEBAMVQoMAotTTRIPEAhUlhOX19RLjdEWVUzRTtfXiJaJyhGWCAiJEgxOVBQQDtAICwoKEVAKERKJzlAMVAgJiBKPEMiXgotTUA2VC48Q0ZeQDZYKDxDIj5AMSonOCAwMk8gIV80REQwJDRHICtAIVIiS1ohOU0pIiYyICkrQltfXiRZPgotTTNHNS41T19UMi08IFAiKU4gIEEqJDY8QCMhJCAiRjgqKCZYICMhIlwgJ11ALUdQIDgiIVIsK1ohOzA5UgotTS47WiE7UDFQICYgRlcoOEIhTjYhVygnPEFXWFBHKD0yMjEgMTI8IE4gJygqT0glRlUiIU4gIFAwQUQoOQotTSggRSxbQCMgX18xLjdEWVUzRTtfXSJaLSpGWCAiJEg1OVVQQDtAICwjITQgIkY4MCQrUCA/ViEwJCtQIAotTSA2ISAwQSFALyIpLTREVDAkNEcgPEQ6UEA2P048RFpQQDY/SDxFMlBANj88PEVGUEA2PzY8RjpQQDY/NgotTTxGWlBANj8wPEcyUEA2PyQ8R0ZQQDY+XjwgIUAjQFA1ICBJRyEnICA4IDEiJzIgLSpGW19dJFk+M0c1LgotTTVPTzwyLTxAUCJJTiAgQE4rQCAwKCQ9KiQmOUoyJTUuTjAgIEMnITgzUlggOVA4QDFUSDA5RTkoPjAgIgotTSIqMS5OMCAgQychODNSWCA5UDhAMVRIMDlDWSouMCAiS0sxRiwkQVkgICgoSjRaWSAgIiw8JUEvK0AhRwotTSFCIScyQSFGIiRBWSAgKChNJiAiK1A9KD4wICJLSzEuTjAgIEJfQTAzUlhcICAqTk0iIE4gIFBCIC5GIQotTTEoIzBAMDogICAqUlAyXCArUD0uTjAgIDgyQTAzVEogOUEwTyFSXE4gITEuTjAgIEJfQTAzVyAgOCAgIQotTVIiXCczS0QgICUiMDYkXVwjSyImO1A5UF9WICAgOykoPjAgIiIrOSg7T1AgM0tEICAoT1g0JF0oNTRBTgotTV8gIS5OMCAgQl0hMDNUQVkgICgoUFRBTl8gIS5OMCAgQl0hMDNSXCcyJltcICRaWSAgIitUJSEvMEo9KAotTTtPUCAzS0QgIChMVjQkXEwgJlE8IytEICAgICIgICggMSY5MDInRCAgQEMlMiZbXCAkWlkgICIrXiUhLwotTTIlNSg7T1AgM0tEICAoTzA0JF0oPjAgIiItUSg7T1AgM0tEICAoTzA0JFxPIVRBTl8gIS5OMCAgQl0hMAotTTNUKkcyJltcICRaWSAgIistRSEvKyAhKkFGVC4rUDxPK0AgNDNLRCAgKE9YNCRcLEtAICAgICQgIyY4IAotTSAuMSg+MCAiIi1ZKDtPUCAzS0QgIChPMDQkXSJJVEFOXyAhLk4wICBCUzkwM1JYIDxPXl5ANjgqM0tEIAotTSAmIS44ICAgTERBWCAhQSg7T09IK1A9Lk4wICBCSTkvW1AgLDxBQlBANjw2M0tEICAmIS4rUD0uTjAgIAotTS4nOTgzVyNfOCAgIEEkQU5eXkEoPjAgIiFOMS5OMCAgQl9BMDNSL05eX0AgIEA7VDJLRCAgQDtYOVBYTwotTS4wICIhT0EuTjAgICwhWTgzVEpOXl9RTzVCXE5eX1EuTjAgICtQQTgzUkkgK1JbW18kQTUrUD0uTjAgIAotTUJJOS9bUCAsTCpbW18mPDQrUD0uTjAgIC4nOTgzVFpZICAhQDNHI184IShDUzAgIiFPQE8hVFpZICAgWAotTT1FQS8oIDksW0IjIF5dUS43RFlVMEtEICBAO1grUD0uTjAgIC4nOTgzVFpZICAhQDNHI184LVEuNU9fXAotTSgjRCAgQEEkM0VZLj00WTZfXyEoVVIjICsjUCAgQENCK0NQICBARUgqR1AgIEBGXTJLRCAgQEAiOUAgIQotTVYkQVggKyEuTjAgICtQQTgzUi8gICAoKCBESlkgICgoIEY9WitQOS5OMCAgNCkhODNVKiArUCEuTjAgIAotTStQQTgzUi8gICAoKCFGPTwrUDhPLjAgIiIgOS5OMCAgQl9BMDNSXCczS0QgICUiMDYkXTJAIlwgM0tEIAotTSAiXCg2JFxDUCAgIiIgSUcrQlwnK1NEICBAQCozS0QgIChPWDQkXSg1NFpZICAhMEQlQS80SCBPICRaWQotTSAgIE8iJUEvKFwgICBAQC45QDlQICYgICA0MSg1MlxZICAoKCNEWlkgICIrXiUhLysjRCAgQEAmP0AgQAotTT4wICIiICkoPCcwICtQOS5OMCAgNkMpMDNSUCA0RDwsMVAgLDs+KV4gIiFZICAoKCBEQVA9IyBPIURaWQotTSAgITosRSEvKyAhMjFQUScgIFFNWEJQWSAgKCgiR1ggKCdEICBAQCIyJyFUOCJcJjNLRCAgJUhSNCRcTAotTSAlKScjJDwgIVZXQj9AIEA+MCAiIiApKDwnMVwrUDkuTjAgIDZDKTAzUlAgNEQ8LDFQICc7PihMLjAgIgotTSIgWEAuMCAiIiAoJkAgICAgKUBPICJcJjNLRCAgJUhSNCRcTCAiIFkgICgoIEA6ICAgICBHIlwgK1A5LgotTU4wICA2QykwM1JQICgjRCAgQEAiIUggICAgIkArUCBPIURaWSAgITosRSEvKyAgQC4wICIiICgmQCAgIAotTSAqME8gIlwmM0tEICAlSFI0JFxMICIgWSAgKCggQDogICAgIEoiXCArUDkuTjAgIDZDKTAzUlAgKCNEIAotTSBAQCIhSCAgICAiTCtQIE8hRFpZICAhOixFIS8oI0QgIEBAIjMuWEBQL19QM0VZLj00WTYgICEoPjAgIgotTUtLMSg+MCAiIU4xLk4wICBCX0EwM1QqWSAgKCZdJEpZICAoJl4mPC4rU0QgIEA7WDNLRCAgIyA+NiRdIgotTU4wICIhT0EiTjAgIiFPUS43RFlVM0U7X18iWic/QCEoPjAgIiI/OFAhVEMgKEAjSUA0MiBUKCQmQCAgIgotTUxNIE8gJFpZICAiK14lIS80RDwsMVAgJzs9OSg+MCAiIj9BKD4wICIhTjEuTjAgIEJfQTAzVEFZICAoKgotTSAkQVkgICpSUCRaWSAgIiteJSEvKF9QICBASCIgICpSTCIvXCAgKCohQCAiTEswTitPX1wzRVkuPTRZNgotTV9fMEA7QCAoJEJYICNbKDA5QDBAIiYgJjJBQUZdJyAgM0VZLj0wICAzRTtfXSJaJygmWCAjIilOICBAPgotTSYrWDE5QEEqJjY7VjwgIUAiQSAxMjwgMigkRyFEKCROK09fVDNFWS49MCAgM0U7X10iWi0oRlggIiIhTgotTSAgUUAlQkkoOCBAMCU7IDE5UDkyMzRINTlPMSolNjwmNERFKiQ2O0ZEXlggIiIgKSpGW19dJFk+M0c1LgotTTVPX1gyLTxAQCJYTiAgQUYhQlhZICAqTzEkSic5UThPK0AgLCtQPS5OMCAgODVBMDNdIicqRCEqJTY4JAotTTwgIUAqIlxOICBRKDU0WlkgICItIiUhLytAIUYiJCpZICAqTzEmICwoJD0iJCUqJyhcPCAgSl0kKCBVLAotTVtCIiBfX0EuN0RZVSAgICAgJFk2XzxBKFVTI0ArIlggJCJVWSAgKlMvL19UP0AkTTFfX1grNDtfXyRBTgotTV89USg7T1dAMiZbX10kQU4gIEEuTjAgIDxFOEA7QCA4KCpbXVkiSU4gITBKK0AgPCgiW11YJ1glTCg9QgotTT8jIFsiQDkuXlAgIiAiWCAjICAsICQ4IDYgITgoIltdWi0iJipIISpBRl02Ml5bXVsiQSUwPzlJKC9XTAotTStAQDhXO08nOT9JQDAnWCEqSD0qQUZcWCpENEgxTUclJk9QICwrTyw5P0FAKiQqNStDRCAgQEhAPEBCXAotTUA2VCw/IEFAIkQqNStDRCAgQEg8PyAsSjFSQSVXSDg4VztPJzk/SEAxNChQOiAgQCE0U04sLiNdUiRZPgotTTNHNS41T1coMi08QFwiSE4gISBNPjAgIkxTU19dJCpOX19ATTE/X1wyJltdVyRBTl8+ISg7T19UMiZYIAotTSIkWlkgICFSNUIhTiAhQEBLT1dEKiJYICciWE4gITBAK09XQD8gNlBBRiggICsoUC5QSCYzT0wgIEAhJAotTSAgUCAjICFSICg4IEFESiU7MFBAMVIgTl9fIjBBMiIgOCA4QDFSIk5fXyFeICRPTl8+UEwhJiAoKCQ4MAotTUc1Kic0SDpeS09fUDs/KEAxLSdOX18hIiQmIUQoJD0iRCIhJCQrUCAsI0lcICAmWkM2XDY/QCc+QS1KJAotTSsgNEAxUSJcICMhMjM1KidPSDlFXEQoVTIgIUAtQiEnMEkgTC4wICIiQiFeIitKJzswWVoiJiAsKCQ9IgotTUQiUFkgICgqJydIIytAOEoxLVIlKCQ8OlQlKidPSDlFXUIhJDBDITggIiAkMy5YQFwvVygzRVkuPTRZNgotTV9eIShVU1NAKiZYICMiWE4gITEuTjAgIDdDOEAwIiEwJyEgSjFUSkwgIDFHICAmICgkPDBPICBNNEg8SgotTTFWICAgNyg6XyAgUDJINUcgICYuJkw6OVMlLSorQEpZUVZQICA4IDpfICBQNERRQFxHWChNPD1MIiJBWQotTSAgKCouJiAuKidEICBASFQ4IDhIPjAgIiJDUSolJjwgIDU4OlcmI1YySlAgIiZYLiggSTZAJDIgTCpQIAotTSImXCAgKUg6WyAgLCZMOFY/ICAhP0AlQCFBSzI0RE0yQVQ3VD4gUSokRjtSMkg1RiMgUEUgIyFHXktQNQotTTlQKTIzMUtcICY0SDsgIChWPE0zMyRKLDpQODpfICBLOCBIOl8gIE0oIFEkQCJBIDImW19fJyAgLCBQTwotTSAkWlkgICFYRCUhLz9AISlbT19cOCAxMkFVKSwjITAgLCY/Vj8gKl5BRlwkP0ApQCInUCNPSDlOICAiXAotTTI/OVhfJCdOX19RNjIiWCgmTVJZUVYvWjggICBJRyAhRChKUEsgICg7QzleICI5JzggQDpdK0AsNEg9MgotTTJSICpUKlAgIitaIDs+WDpRQjknMkMyWCMmPSBPSElMLyJYKylESDpdJ0AsNEg+XkJWV1Y4IlA6XyAgUAotTSZMOV4gJiAmJk9QICwlKicoIlAgIi0iKjEoIl5AJldOP0AhQCEhSzM0SD0nXSdALDJBLUZdJEolOUMwLAotTSkwIFA5X0pcJTY8SjREVUApQjFOICBASitAIDAoITFeITsiJzhAI15RQyBbIkA5Ll5QICJfRzteTy9aXAotTV9JO15LL1pMMEE1LFtDU0BfXiEuN0RZVTNFO11XIlVZICAqUy8vX1Q8QCRNMD9fWCs2WCAkL19cMiZbXQotTVckQU5fPiEoO09fVDImWCAiJFpZICAhUjVEX08gISBPK0AgOCtSWCAlJEFOXz4gTytAIDAzS0QgICYvOAotTSgiWCAmJFk+M0c1LjVPX1wrUlggJSQqRytSWCAkIlxOICBQTytAICgzS0QgICY2TjNFWS49MCAgM0U7XwotTVwkQzcoLCBKO0AgLCsiWCAmIVhOICE8LCFQIFA5QDkqQUY8ICAsWEI7QCAwPEAmI0QyIU4gIEBAJCcoIwotTUwoJUI3QyBbIkA5Ll5QICIgIEAgTCAhMCAkQCwhUCBVOzAgIEhAUCcgIzVOMCRKJjlDUSpLMCgwO1AgIAotTUQkJ00gIFBAKzAoMCQjIChfVEcgP0MiMEFXKCEySCFMIiQyIFAoJSRAJiAiUCglKkAmICwySlQgISY5QgotTTggOSpLMCAkOVVITiswKDA0WDxMIVYgLDJIPU0kQSpcICMhM0FVLiYwXzVIIyBQMSAjRUdaREonOzA5MgotTS03QCw4JCg7PyAgUSAgUEA7QCAoIypAICAgICEgIDFGIUUqTSAgQUAqJEpNIEEhTyJCIE0gQSA7TyAgUAotTSIgUTJLMCgwOCEpKkswKDA7QFA7PyAgUCAgUV4gMk0nIEEgQCswKDAwQzQoIyRTTigsI19cJFk+M0c1LgotTTVPTEwyLTxYUCNVXCAwI11eI1VcIDAjW1wkQU5eXlEoO09XWCtSWCAiJFpZICAhXkJEX08gIFEqS09PTAotTTpCISg7T09KKCJbW1skMiAgSCAgIC9fXytQISg7T1dYM0tEICAnUlYzXlwgIyRBTl5fISg7T1dYM0tEIAotTSAnXyo0JF0qS09PTDtASSFbT09QKzRDW1kmIVQyJltbWSJcTiAgUE8rT09MMidAICBEQU5eXyEuTjAgIAotTUAzKS9bUCA0KCJbW1kmPEg/QCZQQVY5KitSW1tbJEFZICAoKjckQU5eWTEuTjAgIEJPIS9bUCAsMiZbWwotTUUkQVggIilAKCJcTl5eUSg+MCAiIkclKDtPTSQzS0QgIChLUDNeXCAjJEFOXlQxKD4gICwzS0QgICgjTgotTTQkXSg7T00gKCZbW1knICAsIkAgIEQnUCJAOVAgIyBIX19YTyAkWlkgICFYRCUhLz9AIStbT00gOCAxMgotTUFVKS0jITQgLCY/VilGWCAkKU8tPyAuXkFGWD4wPzlZKC9NICtAQEgyVCdOXlQhNjIiUCgoJDw4VCUqJwotTTREVl5BRi9UKCZbW1knICAsIkAgIEU2ICtAIU0pTi4nMD8vOCAiUCgrUDhAO09PRDwgIFAsJ0AmK1AhLgotTU4wICA+KSEwM1VBLTYoOTVBVktCMEMvOCAiIU4gIUBAQzIhTl5eMFAqICAkMiwgQDtAIDQoKCEhW09PUAotTSgiW1tZKyIoOVBITyAkWlkgICIgVEVBLzMuWFhQL0xMM0VZLj00WTZeUjEoVVIjXCpGWCAlIkhOICEgTAotTStAICwrQlggIiIhTiAhQSJEIiEnMkpAICEmOFQ/QCBIIzYgKigkMDBPICBQNEg9MkErWiU4XykhXTdAIAotTSpAQUAiQiElJCtQICwlKic0SDZeQUYvUigmWCAnIiInOCAgIj1DVVwgMCNdXiNVXCAwI1tcJEFOXl5RKAotTTtPV1grUD0uTjAgID9ISS9bUCAsLzZbW1tPV1w9ISY0S09PTDxAIFIrT1daWjhGNEA0UFwoICggICRUMQotTTxBI0JKTTImTSg1RCBCMCUrQDZcQVYsIitAOSwvJ0AnICAtMjpAOicgIDpEVScoMFhKPTJBVDInMiZbWwotTVoiXCcrUCkoPiAgKjImW11eJFpZICAiISxEX08gITBAK09PSDlSOV4gOyInOUQ4TyBEQVkgICgqQURBTgotTV5ZQS5OMCAgQk8hL1tQICwyJltbRiRBWCAiKUAnQlwiMidEICBASjwyJltbMiRaWSAgIipcJF9PICBRKAotTTtPTSgyJ0AgIyRaWSAgIiBbRSEvKCZbW1ogUUhfXyAgISZZViwiQCAhJEMgMSghSiEnWC9UKD9IQCJAIAotTT9AIVwgJiAuKCZbW1okSVA6IDlGIiUqJzUoOl5BJldOT0gxTCJCIU5eXkAgPCAgITJAOE4hIlAkWFg4SgotTSEuLiUoIDowQTJIIDghIEA7T09ILDshSCFFQCY0SD00QTUyJigmW1taJyAgLCJAICBLWiA5Pio5OiAgIgotTSgmW1taLkYkVjZAICEiIU5eXkEqOiAgJDsjISg7T00mLCJAICEkQyAxKCAiQCAgIF9fXE8gIlwoM0tEIAotTSAnUlYzXlwgIyRJTl5UOUciQiFOXl5AIDogICEgIDkoO09PUCtSW1taJFpZICAhX1JFIS8/QCBeK09PUgotTTRYPEwhXi4mMD85SSgvT1YrIEFAISUuJzU4OEAxREkwOV85KDtPTSA8ICBQLUdMQF5fOE8gJFpZICAhWAotTUQlIS8+QCEhW09NICsgQUAhJSolNEg4QDFAUDAgIyFHXSdQID4gLlpBJlhCMD85OSgvTSAqQEBIIzQnTgotTV5UITYyIjgoKCQwQjExIjE0SDUyQUUqJE5ILUNcJS4nOlMrQ0FUJ1Y+MiNbXUJYKDA/NUggIkgoMD5bWwotTV1CQCgrUDRAMVcgICwhIE8gJFpZICAhWEQlIS82KDk4QTU2J09IMURZJChVOiAgQDtAIDwoKDhAO0AgOAotTUUoOEBARCdOXz9AQCtPT0hMKEFHIkJcIDNLRCAgKCMyNiRdLFtCI1xeUjEuN0RZVTNFO0owJEM3Li9QRgotTTtAIDArQlggIic4UDBKW19fIiEnKVUgICEiOkggIDAsSiAgICAgKCAhJjwsIypAICAgICEgIDFGICA5PgotTSomWCAjIFJMICAgIiAgICg7ITAsSyAgICAgJCAhJjg2IypQICAgICEgIEFMIyIhTiAhMV4iKF4wOCAgJgotTSwkJ05fXVBCMVMgXCAgPEBWNScoX19RIVtPXzwwXltfTyMgXCAgPEJWJScoX19QLEtPX19fX19fWSZYKAotTTBKW19YJiAgIDJQLEtAICAgKV9fWSZUKDBKW19QJiAgIC1YQCtPX0Q8QV0qQCZQKDEoIyBANDIgOCArIAotTUA3WD9MKD1GMSIgTl9eMTJAJkgiVCg/SkAiUCA/QCErW09fKDggMSJHNSonT0g5RV4nUCVPSDlMICAiMgotTVk4PSFdR0NIK0BBIVtPX0gwPkAgJSJQKCgkPSJEJUInT0g5RV1GIVIoIltfWSUqIDpAMV4nXSInWkggTAotTSAnWCAyXltfUiYgJDBJVTJBW1omOT9AQCtPX0Q8QV0qQCZQKDEoIyBANDIgOCArIEA3KD9ESCFQID4uQAotTTRYIE4hTjYnUDs5WFIkOiBQOzlYWiUqJitAOVwhO1omOyFTRUFUJ1Y+LkBOIiQnTl9eQSFaICA0KyBAQAotTTFUKjA2KD5eQUY3VjImW19PJFpZICAhUzolQS8ySltfWCY8ViMqUCAgICAhICAxRiIiWEwgIEEyQVYgJgotTStDUCAgIS0kMiZbTDwkQU5bJzEoO05RWCtQPSg7T188M0tEICAmPFAzXlwgJSYgKDBKW0w8JCpOWycwRAotTStOUVBVKltMPSdAIDJKUCAhJjgmMkpQICImUDQjKlAgICAgISAgMUY6QiBMICBBMkArIiI7ViAsSyAgIAotTSAgJCAhJjg6K0JQICIlMidHSCgsQVAgICBAIUMhQlhcICAgIiAnUCE4ITleICJQTCAgQTRBQFImICAgIgotTSAmLCYrI1AgICAoIDImW0o6JEFOWkZRKDtOSVArUDhPIVRBTl9bUS5OMCAgOi4pL1tQIDgqIltKOy1CTgotTVpGQCxLICAgICAkICEmOCAgQCBKK05RUE5KUCAiJlwkKkJQICInWCAySDVPJyRPSyAgUSFbTlFYKyBBIQotTVtOUVhWSEBAMUFLMDRIPTJBS1IlOT8wSjtOUVBWXltMPStPTCAgQU8hIklMICBCXkM2UDgwPkwgIyJQJwotTVcoQztSIiEmJCtQICwlKic0SDpcQzY3Uk9KUCAiJjggICowRzFQKDAoICowQVI9ICAgQl5ARlEsT0pbTAotTTwmMColQzlZKC5RWDRIPUAgRzhQMD85WSguUVgrIEFAIktaTlsnIUQjJSonNEg4QDFAUDAgIyFHW0taTgotTVsnIUQhR1ghKzQ/X18kSk5fXCFHICAkTj9AJE0xX19cOCAgISkkSk5fXCFHICAkPDJKW0o7JlwmPUMhXAotTSAmICYlQltKPCdQIStAOSFdRkRAWkcgTCImIChPSDFMIyUqJzRIOEAxQFAwICMhR1wrWiQ7ICAgWidYIQotTSs0P19fJiAgIC1YSisgIChGSD0qQVY4Pj8gIStbTklQOCAxMkFFKS0jITQgLCY/VlZIOzpLTklMVypbSgotTTsmICI/ICJaQSZcIipAMEAhNDIgKVQgICIrSk5aRlFPIUJATlpGUUAgQkAlTygxTCRET0sgIFM7UVFLXAotTSAjITJBVSomTygxTV0rUiU7IUkrWlAgLFZcPEAhSSJOWkZQOl1AREBaRyEyQVUqJk8oNU1bKVJOWkZSXAotTUtOSUg7I0kqQUZQJD1DIUAhQThWOjIjSjwlKiY6QClcICRPVjoyI0o8JiAqTypbSjomUCo0SDkyMzBQNQotTSAjIUdcK1JOWkZBTChHUCErNDtfXyYgOjA+TCAjIlAoVyg9QCJCISYkK1AgLCUqJzRIOl5LICAoOz8gRwotTTFQKDArUltfXyRHIytQLE8rQCA0MiUtKDUkWlkgICFGKCYgICBDOSpLICAoOzAgISdCICJUKlAgIiBSIAotTSAgICIgJlAgXl4xXiAkT0sgIFEhW05RWCsgQUAiIiEmJk0hMkFVKiZPSltMPCY3Uk9IKUwmRE9LICBRIQotTV03QCArIEM7UEIhJiQrUCAsJSonNEg6XEM2N1IqQDJYSyAgKDtQMEorICAoTkpbSjsmXCYqIltKOyYgIgotTSogNVwgJEokO1EpK1pQICxWXDw6XyAgUDRIPTJBS1IkOz8yXEE2UDoyXkwgIy1PJyggOjBLTklMJk84KQotTSguSVA0SD0yQUtSJTs+UStaUCAsVlw9QCIhS1wgIyEyQVUqJk8qUCAiJldSKVQ8IiQpMicpVCggIilSTgotTVpGUE4hS1pOWkZBTC8kSic7IDFWLCYgJiVDOVkoLklQNEg9SiBHWCAwPzlZKC5JUCsgQUAiS1pOWkZBTAotTSMlKic0SDhAMUBQMCAjIUdbS1pOWkZBTCFHWCErND9fXyJcTl9fUSlQUlwjK1JYICUkQTMyJTEuTjAgIAotTTlCIUAgICQyKyJQICIkMiYjKCggICAoIDsgI1pSIFImICAgIiAmUCBeS1pUQUZYWk0oOUYiIThOWydBXgotTSA2ICQ9QyFeICRPVj4yI0w+JiAqT0pbTDwmMCo0SD0yMzBQNSAjIUdcK1pOWychRCFHWCErND9fXyQqSwotTSBBIUA7R1ggMD5MICMiQCYyXltMPiJIKDggQEAxMSI9NEg9MkEyIE5bJyIwQStaIDk+WV4gJE9LICBSNAotTUFCSCI4IDg6XyAgUDRIPl5BNldWKVQ8IiQrWk5bJyFEKyE4Vj4yI0w+JSonMl85WSguUVg4IEpeS05RUAotTTkgSTJBVSktIyE0ICwmP1BPSltMPCYwJj9AJE0xX19cMkpbX1AmPCY/QCRNMV9fXCtSW19fJEcjK1AsTwotTStAIDQyJS0oNSRaWSAgIUYoIlhLIEEhKVpQICxWPD1AIUFDXCAjITJBUiBLIEEjMEFLWiA7PyEiSlAgKAotTSlUPCIkJChTPiBRLFtDQ1xaRCEuN0RZVTNFO19VIlotKkZYICQiIU4gITEiRCIhTiAgQE00L19YKzZAIAotTSEvX1xaPlggID9fWCpUICAhIlxOICBBLk4wICA9LCE4M1JKICghNVIhOyIhOEEwUC5QSCYzT0wgIEAgUAotTSAgUCAjICBQICMgICwkQU5fX0EoO09fODNLRCAgJzVYNCRcTytAIDQyJTRPK0AgLDImW19WJFpZICAhSwotTU5CSU5fXTEuN0RZVTNFO19PJEM3LiwgSDtAICgoJlggJSQqMD9AIStbT19QMD5bX1wkJ0ggISBMIiJLVAotTT4gIThBW08mOT85QCUjIFsiQDkuXlAgIiAlICArQCBOICUgIDQgITApRlggJC5HTiAgJ19cIj0gICAxKAotTTUkWlkgICFWSEVBLylIIEAkV1glTCg9Q1JEQTQyJltfVCRaWSAgIVcxJSEvK1JYICUkQTMrUlggIyRBTgotTV9dIS5OMCAgOltJLFtDQyBfW1EuN0RZVSAgICAgJFk2X11BKFVQI1goJlggIiBSSCAgICAgQCAkOUAgIQotTShHWCA4IEAsMVAgJTkgUTIxVyAgLCA9KkwgUCw5XlgsMVAgJTkwQSJKICAkOCAgIF9ESSc5VUkiS09fXAotTT5AIFohV0AlRig2M1I2IC5XKDRBTCZQLEYgUTJLT19cNiRETCtPX1xPKDFFWkBSTiAgICAhP19cOyFTRQotTUFCVSZfXzBAK09fVDBLICgjJUJOX18wLEtAICAgITNfXSZXSjwgIFAhXk4oRDpAICImICI0RD1QICMgJwotTTxAMjJAIikhMksiPCMmP04wRltfXkJYSCAgUCxBUCAgX19dQiInIDBYOlxdMC9fWiMoPCBfX19fOEA7QQotTUNVIU5fX0gsQVBfX19fXUIhTkYvNiZbX15AUicvX19fX1YoJlk4XTQ7T19aIyg9X19fX184QDEyO09fWgotTTwgIFArT19aRDpAICIgUU4gICdfXkY0Tj8gISpCNlRIPCAgUCtPX1o9QiI2QCJYKVk4PSNcJ0AsKkEkUgotTStPX1pYWlRIJD46TEMoNEJBQlAkNjg9SllEU04gL0NfViRZPjNHNS41QCAgPCAkUitAICpYWiIhTjAgIgotTUxUMS43RFlVM0U7X10iIU4gIEBNNC9fWCs2QCAhL19cLCJbX14gKSA/XyFGJkIgTl9fQCJAICAvX19dRgotTSJESk5fX1FGIScgIDgkMVAgNiEgLCJbX14gKSA/XyAsMCdfUDlDIEArT19YIEggICNfX185QEkqS09fXAotTTlAMVAgViA8KCJbX14gKiAgIF9fX1BSICAgMCAgJjQkPCAxQCFHICU4IClQIERZPjNHNS41T19EMi08IAotTVwnUCAoQlggIyIgTiAgQV4jLSInPiIiOEAzIVwgISMxUCJYMFhaXEokLkJNQyg8QEFCUCU2NEJRUCYzTAotTTMuWCBcL19EM0VZLj00WTZfXyEoVVIiICpGWCAiIiFOICBQTTQvX1grNkAgIS9fXFo+WCAgP19YKkggSwotTTtPX1wgISFeIiQqVT4gUThBVyg0T0glTV0jIE5fX0AiMCdfUDlWUFArT19YIEQhX1wgUSA/XyFHICAiMgotTVo+WCAyX19YISggICAgL18qVCAgIidYIipUPCAhIiBOX19AIkAgIC9fX1wgQCAgMCAgIEswICAsMidAIAotTSJUQTUzS0QgICc0WjQkXUAmJEpOX19RRjcnWCMqVDwgISYgKjJKW19fJjg6MEpUICEkU04oKCNfXCRZPgotTTNHNEArT19YIEggICNfX185XiFeIEJNJyAgMEs/L19fXyBUICIiIE5fX0AiQCAgL19fXEswICAsMiU1LgotTU4wICA8VkE4M1YjIigiW19eICogICBfX19WPj4oIltfXiAqICAgX19fUEAgICEtRyInWCQqVDwgISYgMgotTT9AMEsxUCAkMidAICEkWlkgICFUSkVBLygiW19eICogICBfX19QIiAgIEAgICYgIF9UWS41T19AMi08IAotTVAiKU4gIEFcICQnTl9fIE4iJCdOX18hIVogIDAoQEBAMVIiUTogIThBRUInT0glRVxDIE5fXyAiMCdfXwotTTlUSFArT19QIEQhX19QUSA/X11HMUcgIjgiWVAhJiBKMkpbX10mOF4ySltfXiY4WDJKW19fJjhSPCAtQAotTSUkSk5fXzFGJ0RKTl9fQUYmJEpOX19RRiRHICAzLlggUC9fQDNFWS49NElOX18pR1cnICE4LlEqO09fUgotTTlbUVAgIyBOX18oLEAgICBAICFESkcgJTgtMS41T188Mi08UFgiQU4gIFFcICQnTl9fIE4iJCdOX18hIQotTVogIDAqQEBAMVIiVDogIThBRUInT0g1RVxCSU4gIENJW0AgIV9fIEpAIk1OX18wICQiTU5fX0AgJSJNTgotTV9fUCAmJ1gwMEs1WCMlQic/ITJeQUZXVCwiW19cICkgP19dRzgjIE5fXyAiMCdfXyMkIV9fVjwgIChJUAotTSAjIE5fXyAiMCdfXyEoICAgI19fKlQgICInWCIqVDwgIScgICwiW19cQCIgICAkICAiTSAgIFEoPiAgLwotTTIlNS5OMCAgPTNJMDNWICw/QCxLMVAgJDggMSJLMCAkMy5YUFgvXzwzRVkuPTcgICwiW19cSCJOX18yIAotTUtPX1hAKltfXyY/Pj9AKEsxUCAkKldTX19cIDEgIEFQICMgTl9fKEswICAsMiU1Lk4wICA8VkE4M1YiXgotTTwgIFArT19SQCpbX10oIk5fX0IgS09fXDlZWCgrQCAnX18pRyInWCQqVDwgISYgMj9AMEsxUCAkMidAIAotTSEkWlkgICFUSkVBLzwgIFArT19SICQiICAiTSAgIFEoPiAgMDggI183ICAgICAgICAkWTZfXzEoVVAjIAotTT8gLEA7QCAsL0JYICJHICAsIDxOICRRXCAgJCAgICAqPCMjMkAhJiE4ICEsPycgJyAgICAiRScuX14hLAotTVtAIyBfXzEuN0RZVTNFO19XJEM3Li9RXCAnQCA+QCBIO0AgMD1AIFYrQCAqKSAtM0BCSU4gIFFALCJcJgotTSggKjBBUyBUIkAgIkAgICBfX1xPICcgICwhNE8gJFpZICAhWV4kX08gIFBOICtaJjkgKTIxIlAnNEg1NAotTTMyWCVPSC1FUkI5TiAhMFAvL19fUCQ4VkAnKDBYSlhXMUAgIi1UMCAhJFNOLi9TX1ckWT4zRzUuNU9fPAotTTItPFhfJ1ggPiAhXCAiQU4gISFWICM4TiAgSEQgVS4iKkZYICMmIFgrUDxAIEkiJSwjMCogICogICAjXwotTV9SXCA8ICBQJTJcIDNLRCAgJ0dYM15cICMiWCAjKD5SVCVYIDkwQTIxIDInTE0hPiAlKiY1JFRKIUtKIwotTTk8KEY7QCA0KCA9LD8gICEgICBHJCM6ITMnUVAhUCAgKVEgQCFUUVwgICQgICI8MC1UJCAgRFFcPCA8IAotTSAiPDA8ICBQISQyIFk4QEIgLSohVCgnMEFTPSAgIDEsW0NDXF9dUS43RFlVICAgICAkWTZfX1BQK0AgKgotTVAuWCAjTSJOICEhLjdEWVUzRTtfXiRDNyAoMV4gI1hOICBLPktAICwoID0sPyAgICAgIEckJygwWFpBLAotTT8nICIgICBHJCgiIjMuWCBBL19YM0VZLj00WTZfX0BOQVJYTiAgQUcmIiFOICBRUCAjIDBXSCBQLy9fXwotTVAkPFBQJygwWEpdRlsiWE5fX0EuN0RZVTNFO19eJEM3KCggTitAICg5UjBKO0AgLCtQPVAgIyA1K1AhLgotTU4wICA+QFEwM1JYICwjU19fXCEnLkwhUiQuKk85TiEsW0IiIF9fQS43RFlVM0U7X14kQzcgKDBQK0AgKgotTVAuWCAjTSJOICEgTiAkUVwgICAgICI8MDxBI0NKJFFcPCAoICAiPDBAKCksW0AiJF9fQS43RFlVM0U7XwotTV8jIE4gIEsgW0AgLjNFWS49NFk2X19BKFVQIiQsIlggIkwjTiAgWE4gJFFcICAgICAiPDA8QSNDSiRRXAotTTwgKCAgIjwwQCgpLFtAIiRfX0EuN0RZVTNFO19eJEM3ICgwXitAIC48ICBQK0AgKltaQzBLQCAwK0AhLAotTT8gICAgICBHJCcoMFhaQSw/JyAiICAgRyQoIiIzLlggQS9fWDNFWS49NFk2X19QUCtAICpQL1BHJC0iTgotTSAgUS43RFlVM0U7X14kQzcgKDFeICNYTiAgSVIkLi5PV0pYICMiICczJ1AgICAgIClRIVIkLi5IMydRUAotTSBAICApUSIgQERTTiAoM19eJFk+M0c1LjVPX1gyLTwgQSJYTiAgQEAhVFFcICAgICAiPDA8QSNDSiRRXAotTTwgKCAgIjwwQCgpLFtAIiRfX0EuN0RZVTNFO19ZJEM3LC8gSDtAICguIlAgIEdYID8gIStbICAmPkAgWgotTStAIC48ICBQISJAIDgiME8hUlwlPCAgUCUyXCAzS0QgICdMQDNeXCAjIlggLCNTX19cIScuTCFSJC4qRwotTTRIOlxBJjc4Mkg9RylET0wgIDhKIU4uJVZcNE8hVFpZICAhW0lFQS8rQCBQLy9fX1AkPFpQJSomPEEjQgotTUlWO0QuNDggIERTTiwvI19ZJFk+M0c1LjVPX0QyLTwgXiIhTiAgQF4qICAiPkAhXCAjOE4gIFkjWiAgJgotTT4gIFghViA4P0AgXiQ+Pk9XSDRQLy9fX1AkPFJQJygwWEpcSiFVKiZPKDFFWSRKJTlQUFAvL19fUCQ0UQotTUAmSCY0SDhRMUAgIjMuWCBeL19EM0VZLj00WTZfXkEoVVAjVChGWCAiJ1AgPkAgWiowICI0WDVLLiVRKQotTStARVAgIyBOICBZWCQpQiBYWDc6QVIpJSpAPV4gI1gxWjpdVCQuNk5XSDhAIVcoMFhKQFJAIConICAjXwotTV9SUCc1NEZTUTYzPigmWCAkIyImMy5YIF0vX0gzRVkuPTRZNl9eQShVUyNAP0AhXCAiQU4gIEErWyAgJgotTT5AIForQCAuOCIwTyFSXCU8ICBQJTJcIDNLRCAgJ0pIM15cICMiWCAsI1NfX1whJy5MIVIkLipHNEg5UAotTSAjIEwgICpcQCY3MjJIPUcpRE9MICA4SiFOLiVWXDRPIVRaWSAgIVtJRUEvK0AgUC8vX19QJDxaUCUqJgotTTxBI0JJVjtELjQ4ICBEU04sLiNfWiRZPjNHNS41T19EMi08UF4iQU4gIEBeKyAgIj8gIEorQCAwMl5QIAotTSFHQCAuIlggI0c4IC1APUApIlwlK1AxUCAjIDUrUCEuTjAgID4/QS9bUCAsKkAgUC8vX19QJDRaUCcoMAotTVhKVTJBS1IjOT1BKkE2PCwsI1NfX1whJS44IUohRSomLjQ4ICBEU04sL0NfWSRZPjNHNS41T19EMi08UAotTVwiQU4gIEBYKyAgIj9AIVwgJE9MICA5WiAjSE4gIFlQICMgJCogIUApIlwnK1A1UCAjIDUrUCEuTjAgIAotTT5SIS9bUCAsK0AgUC8vX19QJDxaUCcoMFhKXTJBS1IkOT1BKkFWPEYyXlAgIUJIJlhYNztRMlwnM0tEIAotTSAnTkY2JFxOICMgXF9fXyAxU0sgNEg5UiQuKk85TjBZMUAgIjMuWFBcL19EM0VZLj00WTZfXUEoVVNDIAotTT9ALEI7QCAoMl5EICMnUCwrNDtfXy1PJjggMTNBVUUtMkk1R14iOU4gIFEqQVZVIDA+RCAjJCpOX18wQAotTSFeLiBEKltfXSJVIF9fQEoyIlAnWTg7PEIiIE5fX0EpXFBIJighNCJAICAgX19cWEAiID08QSNCSiNFIAotTSAgKTVLT19YTlw5Q1cuLic1KDxXMVAgIjJGTCAhRjhILidQICAzSVwgIClAI0QnSyAgOFFMXUAmVi9ZMgotTTMlMS0oIFFSICMoSyAgKlBANjdGNFZMICBCIEkgIEEyQCcoICxCTCAgTkYpRCgkQDtAIDAoKCEiOlAgJAotTTMuWFhQL184M0VZLj00WTZfXlEoVVMjQD8gIEg7QCAoK0JYICMkT0wgIDlAKCJcJzwgIFAlMlwgM0tEIAotTSAnTU40JFxOICMgXF9fXyAxU0sgPEEjQktVKiY8ICBQKyAgIk8oIUVVREonOVI5K1sgICYqQDtDQT1PJQotTStQPS5OMCAgPlo5ODNSWCAsI1NfX1whJy5MITJBRygwWEpdRlkjRSYgICksW0MjQF9eUS43RFlVM0U7XwotTVwkQzcsLCBIO0AgKCpGWCAjJCdMICA4TCInICAsIlAgIEIhJiwjICpfQCogICAjX19YI1wpUSEoMCNNIAotTSAgOVAgIyBMICAoUiswICZMRyAqX0Y4KC5XUCAgMCAiOCIgWz8gICIgIClQICMgTCAgKEAxQyBQIk9YIgotTUAgICBfX14gXyI8MC5UICAiJ1ggL0JQICBFNic6UVNDQV1aJigkPVAgIyAwK1AhKDU0WlkgICFfNCUhLwotTTU4Pl5BRjNIP0AhQCQkKkcyJTUuTjAgID9VITAzV1AwV0g4UCsgICQyLCFcJCkiJk9IIU9YQyBMICAxKAotTVArIic7UUhQKyAgJDIsIjBBUCogICAjX19SXCAyJTUuTjAgID5dMTAzVClNICAxLFtDIyBfXyEuN0RZVQotTSAgIS41T19QLCJYICRHKCAyRCFHJCIhTiAgUEI7QCAoLE1BMjA7KSA5P0EuN0RZVTNFO19fIlotKkZYIAotTSIkQTUzS0QgICMgPjYkXEo7T19cM0VZLj00WTZfViBDW0AgKCAgKCAxIlxOICBRKD4gIE8yJ0QgIEBLPgotTTInRCAgQEpUMiZbXzgkWlkgICIqXCRfTyAhMSg7T11AM0tEICAoU0A2JF0uTjAgIEMhIS43RFlVM0U7XwotTTokQzcvL1BKO0AgKCoiWCAlJClOX19YTTM/X1gySDFNIkdbXys0P19dJiAgIC8xJEEkKk5fXzFAICAjSgotTS83UCAiT19SLzdEICBHOS5fXlBdPjAgIkJNI19bQ1VZICAoUFNPX1ArN1AgIEc5MF9eIE0/ICAiQk0rXwotTVkiVVwgIChQVC9fSDBKW19VJCpOX11BIktPXzwrN1AgIEc5Vl9cQE0/ICAiSD07X1MiVVwgIClWIi9fMAotTSggMTJAJkgiNUgjREAlMiAvNCNfUUYgICApIF0/ICAiX18oXT4wICI9QlNfWyNVWSAgKVZGT19OLzdEIAotTSBATTRfXyBNPyAgIj1CW19YIlVcICApVkcvX0QrN1AgIEBNNl9eQE0/ICAiPUNDX1IiVVwgICopOE9fLAotTSs3UCAgQyIwX10gTT8gICI9RDNfVSJVXCAgKiomT184KzdQICBDIlBfXVBAISUqIDpAMV4jXSInWighNAotTUAjVSBfXDlAJSIgTiAgUV4gSyInOVAjXyNHWCpMKD1HIC9dVCsiWCAkJCdOX15QTiIkJ05fW0BKIiQnTgotTV9eUTwyIkAoKCQ9UCAjIDAoQDksMCEgICgkNFBAIiEnPCAgUCQkUSA4IDk0QTUyJ09IMUVXR1giKzQ/XwotTU0nQCQwPzkoTiJAKDggUEAxJEkwOUBRM0tPXlQ1ODEqS09eVDsuWSpBRlxSK1A5UCAjIE5fW1BPICcgIAotTSwiW19OQlwgPCAgUCtPXlgrUCEoPjAgIiJOMS5OMCAgQkogQDtAIDg/QCRAQVYgICE3OFwrMCAiMD5bXwotTU4iWCgwPltfUiJIKDA+W19OJVEoKiBAQDFXICAsISBAMTIhMDA/ICogIiknPCAgUCQyKSUoRSUjXDBIIAotTSwiRCAgSSEwVyQhNEFVQiVPSDFFVStRTl9cOUQhI1UmX1w6XDU2KCgoJlggJiIiLTgnIVggI0AmISgwIAotTSAgJCBYWFAmQSAgICBAOE8hJFpZICAgTyIlQS8qICFGIkIhTiAhQSJEJiAgIS8oQDtAIDgoKDFQICMgTQotTSAgKE8gJEFNICA4QDtAIDgoISE8QCJcIDNLRCAgKCJQM15cICMiIU4gIUBANCMlTSAgKCAgQiFOICFAQAotTTQjJU0gIDAgISIhTiAhQEo0I0omMEpbX1AkSk5fWzFLICAxJjwgIFArT19SKzQjX0QnICAsIltfUUJVIAotTV9aISFbT19AKzRDX0YkP05fW0ElW09fKDA+W19VIlUoX1kxKjRWPCAgX0FQICMgMyglKFAsIEgiIEggIAotTSAvX188QCBSJFIhMixDIDogICohICAjX19ZIiErNCNfTCcgICwiVCAgQlUgX1pRKktPX1Q7IlFALkMgTQotTSAgMShQJDIgOkAxXiNdIidaKCBNMC9fVDgiMFArMCAkMiwhJEAmSCI1SCNEQCJVIF9fMUAkIiBOX1khXgotTSBLIic5XFFeIksiJzldUCw7QCAiX18pRipHICAsISxAO09eNCglISFcIEggLCEjMTtPX148ICBQJFIhTgotTV9ZMEA0JCdQIkAgUCQuRShUNlQgISBSTiAgICAgP15QOVVQLEtAICAgICdfSyY9RigiW19EJ1giTCg9RwotTSAgIzA/QEpQQVY8ICAsWUAgICMwPCAgUCRSXCAyJTUuTjAgID9AMTAzViAgIFExIklXICAsISxAO09eOAotTSglISFcIEggPCAgUCQiXCAyJTUuTjAgID85QS9bUCAsOCAgIltCIE5fWSFeIEsiJzldIV4iSyInOVs5QAotTSAgKzovIlQgIUJcTl9bIVAgIyAzKCUoUCwgSCAgSCAgIC9fXygmW19GIiEwMicgKiAkQU0gIDkuTjAgIAotTUArIS9bUCAsLlZbX0xAICIoIltfRCdYIkwoPUcnJ1gqTCg9RiAgKjI8ICBQIUJcIDIlNS5OMCAgPzE5MAotTTNWICAgR1kiSVcgICwgOE8gJEE1M0tEICAnVjgzXlwgIyYgICBGOSI7T15KOCA4XT8iPDBfWkhAK09eTAotTUwqW19MJjQkKCJbX0wlOiBENltfSkJATl9aUzhLT15QMD81KiFEKUhfX1hMISU2JjpQICFNJyAgLCJbXwotTV9CKE5fXzIyQCJVIV9ZUFYhIjBOX1pRM0BCQCZYWDBOIUlaTl9bITJBUkgiPCAgUCRSITIsIyAqICAqIAotTSAgI19fUkFOX1lASDUkR1QiQCJcQEZQIipAOSpBVlAgIC0pXiAmICAgLFEoO09eRCggOjBBNEFUIkAhKAotTT03SCZGSD0yQTAqJSAgI19fUlwlM0tEICAnQy4zXlwgJCRJTl9aQUcmJCdVMiA5KDogICQ8ICBQK09eSAotTStQIS5OMCAgPkQhMDNUSU5fWjlHICAiMjA/NSghREFIICApUCAjIE5fWjhPICRaWSAgIVowJSEvOCc5KAotTTtPXkQoIDowQTRBVCJAISg9N0gmRkg9MkEwKiUgICNfX1JcJTNLRCAgJ0UoM15cICQkSU5fWkFHJiQnVQotTTIgOSg6ICAkPCAgUCtPXkgrUCEuTjAgID5GUTAzVElOX1o5RyskJ1UyIDkoOiAgIjwgIFArT15GK1AhLgotTU4wICA+RlEwM1YgMigiW19EJygiTCglRyAvXEw8QEpQQDY+KjI/NSghQ0JOX1owXiBXICAsIC0hXTBIJgotTTJGQ19fRjgkL0AtMzFbWU5fXDlDIycgICwgPjBLT15ALkAhQCBHSCAoIltfUCsiTl9bMUYwIlgmNSg9UAotTSAjICVPSCFCLSMgTCAgKlA7T15KOEJJUCAjIEwgIClSICMoNEAoJUcnI0gnMkpbX10mVCZPSltfRyZYLgotTTwgIFAhMCFVICAkKiFDUCU4IFEzQUU2JDJIOUogL1lMPyAgQCtPXkxUKltfTCNNICAgKVAgIyBNICApIQotTV0wSCYyRkNfX0Y4KDRWVCAgRiAiNEQ5UCAjICYwPzQqIUJYKDJFIUdcJEkmOVQpWCAjQCY8ICBQKzAgIgotTUQoME8gIlwnMiZUICFEWlkgICIgTCRfTyAgUj07MCAiKCJbX0QnWCJMKD1HIidYKkwoPUciJiAuKCAzSQotTUImICQoIDNFQi0lTSAgMTJLT18gNSRNOEtPXjQ2JEk4S09eOCgiW19QKyJOX1sxTyAvT0ooIltfXisiLQotTTlVKEAwIyBNICAqUDQmKSgoJltfXiMlTSAgKCAgQiFOX19AUTswICQgIDFQICMgTSAgKE8gJEFNICA4QAotTStPX1g3KCBPICRaWSAgIiBMJF9PICBQQDtAIDgrUSEuTjAgIEAtKTgzUiFOICFAQEtPX1gzLlhcXy9dSAotTTNFWS49MCAgM0U7XVIkQzcsLiBMK0AgLCs3RCAgSyxcX18xXiAyVSdfX0BNMU9fXDImW11XJEFOXz4hKAotTTtPX1QrUlggIiRaWSAgIVJVIiFOICEwQEtPV0QqRlggJCJITiAhQEArT1dAP0A2UEFWKVwsI0wqIURbWwotTSAgKCArQCAsICBQIDFAITggJUBAK09XSFQoOEpAJEomO1U5K1tPV0wqJDUhXUZEQF8+UE4iIUM9Tlw9RQotTV5GISA/QCRKQVRKJjtTQEoxMkEmVjw0Ol8gIFBOXFFFXiYgSDBJNE4uMCAiIlJBUiIrUiE7MFFcIiYgKgotTTBJNE4uMCAiIlIxXCBSSScqJDc+QUFDPU5cPUVeQiElMEMhSCAiICUzLlhQWC9XKDNFWS49NFk2XzxRKAotTVVSI0ArIlggIyJVWSAgKlMvL19UMEpbX14iVSZfX1EoO09XPDImW11YJEFOX18wTytAICgzS0QgICcrNAotTSgmWCAlIiJOXz4wSitAIDgrQlggJCIgTl8+IVIhOyIhOEAgIEdDIFsiQDkuXlAgIiAkMCAjICAsICcgIAotTUJAIioySDlNIyIhJygiW19cKSImKCghQCFCIScoKltfXCdYIDJeW11bIlAlOCBAQDFBIj00SD0yQUtaTgotTV9fIU1cQiElVD5bX1wkKDA4JSBAMVQqMCgkNDBPICBQLkdQICA7Ui07UTFeID1aJVcoNEAxUSJcICMhMgotTTM1KidPSDlFXEQoVTYgIUApIiEnMEkhXiIrUic7IEBKLyAgIiJTRUAkQkhcICAoKy82ICooJD0iRCJIXAotTSAgKCsxQiAlMy5YQFgvVywzRVkuPTRZNl89UE0+MCAiTFNTX10nKCErNCdfXiJVTiAgU19fJEFOXz1RKAotTTtPV0AyJltfXSJcTiAgQS5OMCAgPE0xL1tQIDArUlggJSJcTiAhISg7T1dAK1JYICMkWlkgICFDViIgTgotTSAhMS43RFlVICAgICAkW1kgICBGWCRBWCAgLS4wJjdSM0c1LjVPX1wrSD0hW0AgLCtAQFAuMCAiIEwgKAotTSAgICE5QUhQLjAgIiBMICggICAoOVBIID4wICIgICgiUCYgJDwvXUAkREFZICAoIkwiXCcrUlggIiRaWQotTSAgIF1YIlhOX19RLjdEWVUgICAgICRZNl9eQE0/J19fX19fX1siVU4gIENfXCJVTl9fI19dI1VcICQrXwotTV8kQU5fXlEoO0AgMCtSWCAjJFpZICAgXVgiIU5fXyEiJCIgTiAgQS43RFlVICAhLl4wICApTiEoPiAgJQotTTNEIUVcRFlVKEZcICEiIU8gIEBAK1AgLDtUUEIiOSooOyAgICEkMiFMSCFNICAhJCxAQCggMCAgOVAwMgotTVYlLiAoQEQoIDAgIDlBWEIgLjIoOCAoQlYlJyhfX1EiMCUuIDkvMEAgMCogICAgICBWICIkTUExUi9fXAotTTBEITNAJjNUKCJcICEkWVVMXEFOJSYgIiRNQTFSL19cMEQhM0AmM1QoIlwgISRZVVQ8IzNQJiAiJFIhMQotTVIvX1wwRCEzQCYzVCgiXCAhJFlVKCZcICEiKU8gIEBAIicrXzJBQTdSP19cOUAjX14lLig8T1wwVjU/KQotTV9fUUYgL19YM0c0ICAiIU8gIDBCO1AgKCggQVJfUSM5NVxHX18mOCBfX0EuPTRZNl9fUE5BVCpHMidAIAotTSFEWlkgICItNCUhLytAIUckIlwnMidAICFEWlkgICItNCUhLzghQTJOMCAiIlRQLE4wICAgICQgIEBNLAotTTlAOS5OMCAgKU8hKD4gICYzS0QgIChVJitQIS5OMCAgQz5ZMDNSWE5fX1EuN0RZVSAgICAgJFk2X18xKAotTVVTIiAqR0QgIEAgIDJIVUcnIkFOICBBKkU2PDQrUVUoNSRaWSAgIixKRSEvK0AhR1siICc4IClQICRTTgotTSwoI19dJFk+M0c1LjVPX1QoJlggIyIpTiAgQDImKygxOUBILCYwIF05TzBAIiYgMjJBJUYjIFBIICNXXwotTV9WOCQoIEFAIEcgIDNFWS49MCAgICAhLjVAICAyJ0QgIEArJDNLRCAgIj40NiRcTytAICgzS0QgIChXWAotTTYkXS43RFlVICAgICAgICAzRTtfXCJaLSgmWCAjIilOICBASjImICgkITZQJDY8JjREVSolNjtUMkE1RwotTSEiICk4IDkqJjY7RDwgIEo7T19QM0VZLj0wICAgICEuXjAgIClOISg+ICA0M0QhRVxEWVUzRTtfVyRDNwotTSwoIE4rQCAoKzZYICMvX1QoID9FQCJJICFIICAgSl0sKiQgTTUvX1hWX1AgIEpfLCs1N19fJEFOX15BKAotTTtPX1QrUD0uTjAgIC1aIS9bUCAsMkghSzAiIE5fX0JQS09fTDlASEArT19cTCpbX1wmPFArNltfWy9fWAotTSoqW19eIiBOX18hUl5cIiErNCNfXyJKTl9fUSJJVEFOX18wTyFUWlkgICBXSCRKIDsgMVBfViAkKCJbXwotTVokU04sKCNfVyRZPjNHNS5eMCAgKU4hKD4gIEUzRCFFXERZVTNFO19WJEM3LCAgSDtAICgyXltfWCRKLAotTTlSMSolJjxAKkhRKDUkWlkgICEwRCVBLypUICAhJSEtKktQICBKKUw8QChLMDAgJDQkVEAuMCAiICQyUAotTU4wICJIXyFEJEIgWSAgKCAxJCdZICAqQkEiQVAjICFAIUJBXCAgKkI7UkosK1E1Lk4wICA0KSE4M1JNIAotTSAgMTAzMkpcICAqQj83KCEqVCQgISQnTl9eIEAjOSIoWUghMkAiXCAyJltfWCRBWCAgKS5OMCAgQ0o5LAotTVtDICBfXUEuN0RZVSAgICAgICAgM09EICAiO0AyJ0AgPjRZIDk/KS49MCAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICQgSChSRS04VylULDJZUygjJE4tQiBYLiJcUCxCXFAuIiEjO1chWQotTTxCIFEuM0BVKCUtVTtCIS06Ni1SO1AgICAgICIgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFEICAgICEgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFJO0ctRTxHMFooJilBOSIhQgotTTsmXUM6UiFTOjdJRSgiQEU5IkRAODcwQCkyLVgiQCFCOyZdQzpXLUk+RjRdLCIhQT0iIEUoV0AqICYpTAotTTtWLUs8VkVaOTNUUCgmJVQoIjRDPiBIIDlHKUU5M0hAOjZRTDk2PUE7IiFBOSYxUjk3LVMoIkBFKFdASQotTSJAIUY8RjVFLkIhQjg2MEA4RlFPOFZMQDxWRVo5MiBIKTYwSSgmJVQoIjRDPiBIIDlHKUU5M0hAOEZRTwotTThWTVMoIjRDPiJQQCkyLVgoJl1WOTcpTDg3ICogJjlSOTY0WigmKUw7Vi1LKCI0Qz4iIVc4NyxAODZRUgotTTk2JUQ+MiFGPEY1RSJAIUY8RjVFLkIhQjsmXUM6UiBFKFdAQD1WJVMoJiVMPEY1QTknREA5RylFOTBIIAotTTxGNUE7JlFPOFNIQDo2UUw5Nj1BOyIhQTkmMVI5Ny1TKCJARShXQEkiQCFSOTYlTDsmXUMuQiFCODYwQAotTThGUU84VkxAPFZFWjkyIEgpNjBJKCYlVCgiNEM+IEggPEY1QTsmUU84U0hAOEYlRCgmKUw7Vi1LPFZFWgotTTkyQEU5IkRAODcwQCkyLVgiQCFSOTYlTDsmXUMuQiFCODYwQDhGUU84VkxAPFZFWjkyIEgpNjBJKCYlVAotTSgiNEM+IEggPEY1QTsmUU84U0hAOEZRTzhWTEApMi1YKCctVDxGJUQ5JlFFPFIhRjxGNUUoJilMO1YtSwotTSgmKU89NllEODcpWSJAIUc5NzFGPEY1RTomMVIuQiFPPTcwQDtWOEA7NjVNO1cpWSAgICAgSlZMICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICIgMCAgICAgIAotTSAgICAgICAgICAgICAgICAgIDgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgSy0sICAgICAgICIhOjAgIEA2SyAgKCVPICAiITYsICBANU8gICglQEAgIgotTSE4WCAgICAgICJUICpQIEAgIyFYICMhOCAiVCAqUCBAICJUICpQIEAgIlQgKlAgQCAjIFEsQyxULTM4VwotTS4jRFAgIixAKlJUTiwjJFIsUzBVLUM8WC42QSwpICBQLDMoUy0jNFYtU0BZLCAgQygiTE0rQyBRLEMsVAotTS0zOFcuI0VIKSAgICAgICAqJllVOyZQSSAjIFEsQyxULTM4Vy4jRUE4Ri1EOTY4ICwjJFIsUzBVLUM8WAotTS40JSIwVDElMUAgICAgICAgICAgICAgICAgICAgICAgKCIgQCgiIEAoIiBAKiJASCoiQEAoIiBAKCIgQAotTSgiIEAoIiBAKCIgQCgiIigkISAwJCEgMCQhIDAkISAwJCEgMDEkMSQxJDEkMSQxJDEhIDAkISAwJCEhIQotTTA0JSEwNCQhIDAkISAwJCEgMCQhIDAkISAwJCEgMCQhIDEgMCQhIDAkJCkiMEQpIjBAKCIgQCgiIEAoIgotTSBAKCIgQCgiIEAoIiBAKCIkISAwJCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICEgQCwkITA4JyIgRCoiUFAtI0BcMCQxKDMlITQ2JVFAOSZBTDwnMVg/KCIkQihSMEUpQjxIKjJISwotTSsiVE4rUyBRLEMsVC0zOFcuI0RaLlNQXS9DXSA4NilDOSY1RjlWQUk6Rk1MOzZZTzwnJVI8VzFVPUc9WAotTT43STs3JVU+N1YhITBELSQxNDknMiRFKjJUUS0zRF0wNDUpMzUlNTY1VUE5NkdNXD83WV8gICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAhICAoKiMgICIiQFggIEBILyAgKCokICAiIkEkICBASDIgICgqJFAgIiJBMCAgQEg1ICAoKgotTSVHXV8/V11fP1ddXyAgKCglICAgICAgICAgICAgICAgICJcICtQIE8gJFEjN1UxKTM0NCAzJCUuMVRFLgotTTFEXCAzJC0/MFRdLDMkJTQxMCEsMFVdLTE1LTMwND0lNFAhLDBVXSM1JUUwMTAhLDBVXS41NFUlNERFIwotTSAgISwwVV0tM1RZJTUkJTI2MCAgMyQlLjFQISwwVV1EOTY5QT02UVQgJCwgK1Y1VDhSXUw7Vi1BOyY0TwotTSAiXCArVzVTPEJdUzomJVI5Ml1MOjYoTzsmXUM4NlFFK1AgTyAiWUM6MCEqODZYKjFGNUIiRFVBPEBJIQotTTwnKCozNiVZIkRJVTtASSo9NlAqMDc1RyJFLUU8IEkvOFcwKjNGXVYiRDFFOFBJKjg2WVU4NylZIkQ5RQotTThHKVU4NylZIkRVQTxGLUgiRCVQPEZFTCJEVUE+MEkqPTZZRSJESVU7J0QqMDc1Rz03LVQiRS1FPCcxRQotTTs2KUU8QEkvOFcxTzhGNVIiRFlPPUY1TThGNVIiRDFFOFY1TThGNVIgJS1VO0BJLTtWWCo1JzVFIkU9RQotTTkgSTQ6JzQqMUcpSSJFLUE9IEkzPTZZRDg3RCozNl1OOSYlWSJFMVU5Ny1EODdEKjVWNUQ7RjVTOSYlWQotTSJFMUg9NylTOSYlWSJEOVI6NjFBPjBJMzg3MVU8RjFBPjAgRTIjSEUzM0hFNFBIRTsyXEU5IlxFPjBIRQotTTgyIEU4QiBFOTIgRTUiIEU2QiBFNjBJITMwSTAzMEhFMDJQQCk0KEApNjRMKCI1OSJAISMgJjFFOUYlVQotTTsnMCAwUCFZOTcsIDtGXCAgICAgK0AgICAgICAgICAgICAgICAgICAgICAiIkIwICBASEgzRiUuICRFTgotTTlGRU46NzFZICAgICAgICIiRDAgIEBJLSAgKCo0MCAgICAhKTtGOUk7RkVUPjAhKTtGOCAzRiUuICAgIAotTSAgICAgICBAOEZFTjg3KVkoJjVYPCZdTjk2WVQoIjVEKCAgQDhGRU44NylZKCY1WDwmXU45NllUKCI1RAotTSggIEA5JjVDOjZVQTsiIUU+JyFPO0Y1Tj0iIEU5IiAgKCYxRThWRU04NlBAOTdBUDtWWUU7RzBAKTYwQAotTSAgICAoJlFJOEYsQDhGJVM5MiFDO1ZZVjk3KVM6Nl1OKCY5STsmNEApNyxAOyZFTjkyIEU5I0hAKTcsIAotTTdVQTgrRiwgIkIhPz0mRU05Ny0/PCZdVzk3KEA5RiVJOyY1RCgmMVU5MiFUO1IhRT4nIU87RjVOPSIgRQotTTkiIEU5IiBFOSIhTDk2OVQ7VzlFPENIQCk2MEAiQCAgICAgIiJSUCAgQExQM0YlLiAkRU45RkVOOjcxWQotTSAkRU45QCEpO0Y5STtGRVQ+MCEuODRYICAgICAgICAgICAgICAgM0wgICVBICY+UCJBSzIgPicgVCA1UwotTS5dTDIrQ15DR1lXQjg7KzxYQklDIStSNClNNjs4NyBFRUwrQz07RDQiUlBBJ1FVSjgrQDMuWiopVEdVUwotTTgvJzdXXDsqV1JMJjo4PFcpK0AmWzY6MztOTDkyPU1PRFhWIj01WVRGQzslO0s8US1JISJRPEBIPjhYRAotTUtAWz5BLCQ7RFwtR1A1PyNSWjtXTTkjQFtCUFYzLUZSN1BUMEVNMT1MKz1YVCYsJjkyUFJGSSRMPjs2UgotTTIzJCBfQiRIUlEmTzknOkRYNDggKFBFVzRRVy4gJDVXQ0wrPks8XCIrPzIlQklAVzxYNVs+PFo0QklQNgotTVlJJzNNLFQtWCQsLjc0UF5eX0U0Xk1SPSo+TDlCMkZPRz8xSD8nV1U+RF4nRDApRV9JSz00LjwzUk8wNQotTSc5Kks6JipEQCZBQzQkNlMyNU1QKixXUStRVjBEVCw+MjAiQldCODBQRCFKJSBQNEdPIl47VEAhUlwiIwotTTA1W15YJkNdXyY6QjBcIlopSiZZXT45WytWSl0kRVRNLz9KQU4yPCxRQCM9KDAjMF82O0E+TyY/XzlaVwotTU9QVzBUNSNfLkswNkc9LjEuJE82SS4zVDAzX04hOShILTtdNENTWVgnXVkzMkwrXFFNLEkhLyFKXzJBQQotTS07TDY2IFw+OSc5NUxWME9OOT4xV0hdUSUiOl5JKl9dIUI5MlI3MTlTJTUjKS80UzQ7XEJBJi8nOSkiSwotTThPMCUgLVIrLDJCXjxJUTNKUzRDIENSSlxTXSdKIUghMyhGTlI+NkNHTVMrWCdeMSxKVVwhPVdRSyM2MAotTSdOJipNXSNZNiBTLCU2O0UqPiAiRzNFTjBVMS0sIFVcUkAlRig7WSwgPUw5JyQkNEZcLEFUKjIlN0ggWwotTURRK18zV0gvQTRCVjIuIjEzU0FVTEZfJjRQJVg8OVZVSyowQCBIVT1ZJigqI0peKihGWCA7NDswJzYmWwotTTA+KF5ESVM1QVBIMShVMThCNi8hKkBRKkNRTTwiKC5BU0E4MzlFXSYyPDEwRUw0LT4+Wls0ND5LWTciQgotTSxZXD5aPF0jJDgyXVYkLCpCPiQyRVwgNko/P0slQTssPjI9N1NZW0hVSCwgIylGITwnVSw0IlQ5XkBfLQotTTtTOFRZQkU8QEA/IldJVSczJSs5QF0nLTBcP0oiTVkrRUE/PUQzNzE+QE9IITs3OUs8QkkxRy8yTDQ2JgotTUBOPyZAKzohS15PQyFGRj03T0JSUSo+NF1KUSBQIldXTFxcOkE7Q1EgVUpKSyY0USZeTVJWJlwoVSRXKwotTU0+UV5dTzQ+MTxKLCZSQURIRyxWNCA6U0IoISE6MzEpMD1FVS8tXTJUR1pZL0o7TEkqVSkpQTNPO05BNQotTUo3Qz04O1U5LjhRQj0vNjswVSM5NylRWjFNJCFDPCo4Ol5LSy4mKzpFLVhJWyhKMEZLPF8pPy8qJlpZSwotTTosL05IWEZXTFpKWyNYX1tTLSdLO0FUIzpaOEpZIT0nOkIqPUxOLEpGWFlcNDw/I1tfPyQ1VkYpP1U3VQotTVhaJUtJWVNLIj5AW15MXE4/VTxAOUpNSSZOSDAiKUhVIzVAV0VfQ0RZNEhCSVZbQ0olOU49LCsqSyU7RgotTSNWWC4kUzhYLjEpUzhPNzc1J0JaWS1NUy01NCogPyE4RkUjOl1HSVJEWjFDMTlBPFpaQy4iJT5AUl5IRAotTU5CLjJQWENCMEMnMDA7SiclVSNOMyxFUDkvRzxOPl1JQD0jN1ZcMS1CTVpXNkRJLi5GOjQlJEBUMkw8UQotTToiWyUnQ1BeMl4hViVDVTJbIlUmL0BTQkNHR1YtXiNKKElQQiEuODQuNjNATSo2TzYrPVw6OEdKSTBeXgotTU9NX0EgIDs5Xk04Sk5cV0lXUUpZQkMmTl9MSyxfRDJNTEoiPTokK0Q2PCA+Uk5GVSk8WltBSjwxQSRPRgotTVg5USdAWSdVKUMpMCc+NSoySjIiWlc6XC41XzUnS0RfVEZfSFY+XDsjRC1CRlkyPUogUSopRClRQyI9SwotTT8tKEo7MCJOKU4hVUlJM1IpU0lJXU1RPEdePlgiSTg+OVdEXVVMNDxYUVsxWDZcPUFRRE5BLTRNMUFMRgotTSkyT1wjXk9GOikjKCMxK0I9TiRBOilWQT8uWiYjKkZOWTtCTTg0JiUlVENROy5MN1JUIkc7PzhASy8mQAotTV8yMEs0TDk5MjIrL1ddSkRaUiJRNDUvXy5MPyggNStQI0chOT5HL05DVzdVXD1AQUwpLixePyEsMUlNUwotTTFWOzo0N1w0PCAuTlMkXCUsMVAhMCE9O1VWVUI7LTY5JlheNTxGQy4gR04lWVRLKyQqOjAlQU5ZLkFaTgotTSpPS0VRXkJSRCU1NiBeO09IWUkwLlAtTVFITjJOSTs2SlpGXUwtRF8rOz8qJi1RMFQjRSdDPjI2RUchVAotTVROSzpLMUpWISRLPlxKTy04Q0tTW0REM01VQk0uOi0pMFtFTD40JFc9KjJONT0gLSs6XVNXVk5ZOkY0RAotTVtJKVQ+MCBWXyAtTCE+ICAhOz1SPSlRVDA8RkZEXkEyLl4pIE5BPV5LIEUqTlcoXFBWXzdQOlwyTkYiUgotTUdQLlhBUidMKURKISRFXC9aJFovVUwsT0QoIUQ7Mj8iISEvQCNNXyMpITJQIzlFM05HXiRcPlRYQkNVTAotTSo2O1kjMiArWC9GK15YT1FVKTRIKk44P001LDxcLkI8VyE1M0s0S0FHRyomN0deI09FUClTIEZDRSZbXAotTTsuNShMWDhSPjxdSVxcSEAwI19FIzE7WDpIRSwjR0dXOEhTOVRaNCslM1khND5LP1crLyZSUDlOMSwnIQotTTRYUj06LURFSzEuRzRAJi5fWy1RTEhUNVkwLzk/MyQ+PFYkX1tYVVI7JFEkISQ+IC1ALS44RklPIFNMLwotTVZKKDgzUT8pSSAwWkdFNTJKKD1dNCRKS1UuPilBPUc4TUAiIStQPF5NPTddKkoqWEtePCgsUCwgW11cVQotTTdAXkY5JFIuMkUmR0IiLj5MMFBRPUM/PDctPC9DX1ZANy1WW1ZOX0lLXilaVjIrWC0oTyQnMi5NIUQ5UgotTThUJU9TQl1FQEZJIl5cID8qKFMtX1hNJzwxSD9ZJUwqQi9UI1lNXE4+Q1hSIVNEVUAkREFST0tLPSglIAotTS0zKiQqUC5bVTxJWCg6PyknLF9QJV1DIVUjP0VUJzZSLiZVSl1QR0RbLFhCLyZJXzQ0RVFdIkdaOlY1KgotTTJFLSsiSU8pTEM2LzFYJ11XTyZbPFlFVVUpIy5QX0klL19QWzhVNEE9WjpCSE1JQkcpNTFZL0YwXSs8MgotTUg+PFBJKiNRTUZCLUBOLjQmSUNNQzBWV0kpMClIJSQ3MSRcR1MjTkYtW0lEIj4sOVhETChHMURLREM8UAotTT0+Nz1AQDUgTzM7VyVLUSBEPjY8PlUnLV9ESFBRQD5WQyUmUCRdMlxWNT8oNkAnWylMTk01WkghQiZBVAotTUojJE41I0A0XVxIXCNDRlQ7X1pBVjA+VlRWSSJFTDpWWS04NSVEM15XMlswTjxHIyhHSyVcVkw3WUdZWwotTVtATz8uV0QnITc/IVxKOVxXIlIxMyNeVFQ8PTJeMTspLEFJITtcMkssKVdQO0UlSy4rKSY1SzRGPDlIWgotTSlIPjpOOVxIRUw2QCo2XyhAIjkyWFIlT11CUz4tUD1eM0EkRTEiRFpKWC8lTVk7SVw7VlhAXk0sXC8sVAotTTIuTVRGUVYxKyJVNE9CRyFWSEVRSkxbIF5XKkw+JCQxV1AySUpGJjZcJDAoJkBcPDAmTFM5UjpDJiFGRgotTTk0S1RMVEU6VFEhViIwTyJZITdXNic6OkIrQSwyQytAUkNPNDsiNScjXyhOTjJZO0w5XVYwWUY2R11AQgotTVpGLiNYKyctJy4rSTdOQT42RkhcPyVbOyMrPzBMSlxXKC0gNyAqMkEgKzUmWVtLT048RFg0OEIiMCotWAotTUpUIlk9NDE5VkYwKE4tQyxEKVMqMTU+TERDUDxbIE1RWDtUXVg/ICdCRztRLjgyNDQ+WjxBR1hPN0Y2KwotTSlZJTUqSSBeXlE/ISQiLVM1ID0wKDJZTSVJLzU3L1tUSzA1NSY3RjsoWy5bWkpUREBMPTJIPyRGQTpZLQotTTVdW1w+I1Q9JzAjUDMxKDI2SEokVzIlJlAqL0IhKCFfMFlPPlkmWFg6SidORjhVR1o3Wk4sVls+VU9IUAotTVkuWFwjOysmO1k0IVUnP1ZfRSM3TDNAR1xAUyY4Ois+MFdLQzFYSV48LEpeQEJPVig+OiM9IkVRRFteIQotTSQrSVkzI009Wyc0REk3VDNRJEdPIUYhTEFXLlROKjcjVCotXD8pOFtHKDtPVSRJPD0zUTtMQFhAMzFMRAotTT9WS0w3Lj8xREkoWVlWQjRdKiE5TCYgQiU8RThBTVYuUUNfSDsyND0kKEQ8VUJLXTZTOk0kUUsyQl0sQAotTUJXMEorRkA3IS8/ISY2MjBURilZUkNJJyBaRVVHXUQgWTVVI0FJIzlCJ0hGJDYkQUxRJiYpKkM4NiM8NwotTTlfVDgwP1smTyQ9IF1TJDNKLDteSyUmN0E4XTNSLCxCOEMyLlciWV8iLyAnQlo7VzwpJDZRPFw2NkkwVwotTVshSylBWkUpXkxDXEA+J1VNO0ItWDpaMyVVQzJLWCA+Mic9V08kLzg9QE0lUFdcOUpZWk4xKkI6Vkc8OwotTVNKVykgMTEiPERTI1o0NjM4IzUsXjFNIERMQSE3OUcoUjlQR0RUIjhVTlZRNVlFMipSNitfNCc3LSQ2WgotTTJdNzFETyY9NiNAVl1ERTtIO0FRWyVKW046SUIoUSswKVIiISswT1VRUDhbVTU+JiRdXykjXEwyNSc/MgotTUktVTk0JDc2PzMzMEc/QDcpTjEiICErJlsxXV9CSkhdWTxKPyc3PTAqNlMoT1RRP08uWl9NOkooPkI8QAotTVtSPClBNEJMWCIrSSc2Ojo/I0kwVS0iVV8jWTApQEVZSEknQTdPLjhOUVQgQ0g1XCU2RlxIPSBZLDc+MQotTVUrPDUgKSMuJkhHUyxQTkIzP0cuKiIpR0JTK1RbMi1bRiRbWipQUDdTJ0Y1TVJePyBDL1VAPiRXS0M1XgotTS1WOkxEVEhaKkxGRFdATUBbS0EyI0s5TEtfJFVXKTFAW0wsKzotKjY1RT5WUVhNSzlaO0crUUdFRThSPAotTVM4MClMIUY+QU89KClDMjgwSSJQQFVSRCsxVkImRjFJXCw7WzE9JiVFSkEoWSM2LVtVOlxERjQgIjcsIQotTSkgNkxEJkEkWzpZXDlXJkI4T04sNkUlTCdWTSUvNjUnLF5BXyIxXl5RRT5PSUNQISklT1xaMVZcOCtRUwotTVkzM1NRSyJNOVtPM1ksVkYvLlw0Xl1UTlRKPEZSXFpHUixcR1RfWS8vQikgNVQ3T0k/RD4tUCNLVU80OwotTScuSUJBVlY0TU9aV0EiJkEoVzojMj0kIUInKiBSJz1dQCEySkBTSVsxNl8/PFMgKlxPVSRWQjcoPlxPVgotTVwsKSZHRVQ5IEU3VT1XTFJfQkE5PyogLDkjNFZMUipUVzJDQC5bVSYmNDIgXDU7P0NZNjhMNVI1LyQ7KwotTTwwOCkpSS9ZKkY5XTdRLVtWTklFQCIsW0xSKDg3KzBJTDQtKT5GOF9RJkkyWVwtSyxFV18qITxFUSxeSwotTT9aMDMuVjQzWTohLVtAJkc4MlQiLVIkW0UmUjA/IEAqTldfTzg4PE5KTElOQSlXTkk9MSBbXCZOSCw9XwotTVMxUi9AKFI+Py1VXkQpOTM9NT46WVJfT1QmOCtSRkZQUyNYMEQwRkUsMl8/PiE2Q1opKz9PXEM0JDBfJwotTV5PO1hJV19ATlE3OUQgTCxFSSAuKEgrRVY8OFA1Q0ArMF9MVj4mKEogUV1QOlRVXj8gJD85N0hCWSVBTgotTUkoTzVHWTIkVFFaJFpARl80NFxTW15SNzFHVjUlRkpcNl8zTkE0OUNIRTErPCUrNTFbLDAxOFRDQzNPVgotTUJAMjokPitAKzJGWF8rIC8pW1ZZQTBCWl0yU0czRT9KN1IpMTA7LltXITI7RkBPU1ZSWUhWPCY9TEU7VQotTTZLOjFZNi9bSyo+Wy4iKVtBJThJOCczJVlDJzkhXzBeIz0xUD5bKyxLQ0VXNVVVPE5MKlwzWTI+TFpHNgotTUlaNlhERS1HMj9IU0cgVF4gO1FZMU5GIjg3STxNSUdBPik8JThYUCsqJlM/WEhBXVRJTT86UT8iJjMnRgotTUZQXzMiQiozXkRSUShHO0gkVUpLLF5DJDlVSilLMUIkKUhJLEVEKjspVzZHWlMsSF9BJE1aTkw0R1xUQAotTT88Vl5BLENKXCVUJ18nREosUzohSFE3LUBdSFYzJkVTNVA/O1s5WlQjMlotMEdEQl0hQVBKVClWST5NWAotTTg3V0QrTjxPViNbQl1GQTkoNS4vLD8/Xi0wUDMgSEBMXl0hI0ZKRiVFIiBdXU4+KSMyPypZNUxCSE86VgotTUs0NTJVOy0qPkQqVD1MWChTLz05K0VETi0nRDRdQlRPICRPVTFQUUpXVUgqLl8wLUhbOUNSMi4vXCgmKAotTSwyN1c2LVY1IVFWS04pUF0yMzJeSTotUjdDQF4kTTpYVV1LUS84IjkpMic4NjRDN08iVUdJJUUyIjU/SwotTUMwXyo5IkApXTRfXlI6KkNVU1hdUE5OQ0YsOVknOzRaUzpaNDokLDFGLVgyVC4sIlAsSkFbUlFSI0w6SQotTSYgNUhJID8jMTImQEchUyk2U18xMSQqVlReKz1OWFkvODAiKDBUSyRSUDksM0AnTVMlXFMnOlBeVEssVgotTT1VKy0xNFRSIjQqW05QPkw+KFEyR1UoM1oiJ0gpI1pOMik5SENEQyg4O0dQJD8kMUtAIjVZWipMQlpeRAotTTg/OjNaIzUuXURfQz9JMEZCUChJOiBWKFNYKU5UNDJZI1BRUyo+RyQ6USFKMC1MSV5GWlxTLDAkMzlWWgotTSM9QzZdRStYMzNLND1aK1k8LVMmTS4yOzA2IVNDRDM6RjhTP11NV01WLF9AMCw5MjE3SiI/LiY8T089VwotTSpDQjxZJzZVSlRASUI5NCUtW1sxPShSPCctJVk2Iz04OyBAQDwiMzlPOE0oJThNRFo/RlM3JiYsLl1UKAotTSpGOEA5IElbQzdeNEU5OTpURDZIT0VXJUZKIVxONDVbWCgzQTM1J1UuOyUiSyQ4QiMnLzkqU0hBKkUyNQotTV9dRzUoKEJTTEpZU1FbRlE/Jj8mTFxYOTU3RjM7PDYjUzYlLUQsRFgnQFNETSUxSl4hUFNXUkNGOTYxOQotTSJDUydETyZaSDM9VlpAPjUgK1BFSV9MJzJDUks8TTNXOCE1RU0uLDxfLzxaKUJVIjE2IzZaNjs4MVpAVQotTUdQVjslV1FRLUVISjQyMUZNNjJDQEguXSJINlw7M1lFRjs8JTo+UF8nXV4vRUpKLl9dTVZcKFolLUw8XwotTSA9VFUqUVRZQV1VV1tSQEcoTydEMEhfRU88P0kmVUhWUjg8QStYSFlWJCMuSVJLNFVFSCdHSzNBKFwkWAotTU4vIz0hSFddSjM2OydIVSZQQjpIQ0w2XFJTSFAkQ0hUOChdXyw1Tk1XIk9DLjcwNV04UDcmRzlWRCQ8OgotTV4iRS9GRkJLP1shJUxALTFEUkYyUFEzIlxLOiVAUDBcMF04MjciKDklSDReO1YlQDgtPyRZWjEmTVFeJwotTSA1PlZHKl47S0peVF47Jy5fIC8xTTwkUldZPUkqX0UpUFRYIDRLUEJQKCIsUzxYIlVeWytDOFxTO19DMwotTV5JIC8nSVYiXTk/SEpHLC0rN04zRi5RLyYuXUJPTipIJTRSLkI3JFxCVzQ0UjwqVSQkMEw6TCZBNF5bIAotTUhAT1ckOi0yRUIvWExZUCNVPTQ5TlM/SiJZRFMnUTtQVVsnOyxfMTlLKCMiPTo1QEBeTVYiR0hDI1wmRwotTVNFMUxINT4nNVA8MjwuNkIzSVQxKz9EMVpFOkY5WDg2NVc+UCsrUFBFNTBIIlQzViYwQSxCWz8nOVZVIgotTS0pI0tfPElKWSo+WlpIWko+V1swJSxXMyI6JEU6Pic9QVosWVwhO0E8ViMzRlwpVE4/XlhHNzZQXElPQgotTTJXR1ZFR0FFQkBbTy82TSBIVC45UEMmSDZcRjpILS08Okg3KC0tXTVZWkksOVRLQywlUi8jPUInVkQ5XwotTUxTNSc7RVxDUV05SF1eMDQ5XTpaUEokMyZZKEhdWV4kUkZJL0NcWEclRkIiJC5OXltGMiE6NTlMIj9GPwotTUNMJDI9PzpAXUdSQiItUTszVjtbOTVdQltVLU4kUEMwPU4vWFguNjshJTpcLiZaOzAgSEolTSdGJVgmWQotTTA3XEdYXyBXKC5KJDBQIiU3SjA+MEBTVUY2Kj8uRlRcQDgzPlg5LyMyOS5fMUssTllYOCUiXkJQVDdcPAotTSY9TlY0WSwiWEEkNzYtNFszVVJRUVgrO1FAQSMtXCQ7Xls3R1JHLyNKMjxHVkhUIF0wMicwSFcoM0pTIgotTVI8IitENi5FJDMsW0s+OSgiTyFfKzlFRyksXUFGKUNEV1AlOjtQT1ZRSFtHRlAtQ1NWVDtNVFI7Ql0uQAotTTkiNypOViRRIDk/Ojw+VExeKiRQXiVVUVwsXU81ICY4NVguRVRXTEVTKTA8VDUzIzgxRVNJKSgpWShWXAotTUVdIk1VISVSVi5PJjBTUjQgKSlPNUk+JzUrQUhfPE5FVUFNUj8lXzA0L1kkICwhJjlVTSQgP1RVJCZCOQotTTFPVzM9LiYjNlhKI0QjMyk7WCNQIUVQOEFdMUw9OzQ3LCQrU1M+XlZYWj1FSFFBWy4gNlZYQCZMWzEySgotTSw9TzhTKU44OkVGXFwvJ0JHLyI9M0ExRiJaRUhaVTYzND4rV0lNOE9bWjBMUUZEKkpTKyQkPkoiUF9aWQotTUFcUSErTC5HOjIjITojUTw6MkIrVU0yPiNWMVw1NCNCPERUTTJWTUdYKDRFWS5UOj5FUklSI1FQSkEyUAotTSxWOlpTMC0vMDwjTTdJV0sjUCVQT1RbSCEnKC5ENUYgTSlKI10qJSFGViYqLUFGNlYvVk8gXTsoSD5RLgotTS47XjQuW0Y4UUcjOyw+LEYrQyAnNEAiLyZJXCFcPEhDVkYuTzVLTyQvIkVVJTtdS0IzMS0gUVo8RF1JXQotTTxeMkRNS1pNWD4oNi8+XC84NTYqMU08STs4UEpNQCdKS1dKUSteUk01MyA4M15XNlZITF0lJDw6LDZSVwotTUY4LlMhT0BJJkBSUjY+KzBLUytFLjE0WF1PXzhRXyRBJUZAWV1WK19EN1o9UV4hXS8tK1daTk0kXT0iPwotTSdfVicrTyNYLUFKKkNWUCNEKFdQLl1DRlZaIkJALkooIFVGRS9ZNCxFLDZOU1QjQVUxIjYxUz46J1dRWQotTUA/QSYnJjVZNzkhK0k8JFYpSVZQRC9dRSAvV1k0JDYuIT9OLTEzIjZLXCotWitZNV05V1gyXjMpIlQpUgotTUNEW0VZUEY0Ikg+TikrL1E+KUdLPV06N0E6QThJXjJRTzNAWkpGU083JTdWMlEmVi0kKylEWVUhUzdQIgotTUxcR1MvOkk0VyMvPlZBRk1ER0ItUiU8NyIyPkNZPkI0VTM/NjE5PlsgJltJL0EpMVAvOCpJXSs+LkAvMwotTS80JlouOUAqQy9TQTVPUTdAViVOTEhBRlgnRyJSNEFAVTFDPlMhUUwqW1tBJ0VEJS9JJEcyVUslNSsmQgotTS0rOFM4OCZMPFtcTFxbSDtZUjJJKlI7XiUuKDZXVEJYVSsmJSJLW0RZQjYjST05V1lMTTs8QTknJylTTQotTTkjIDc/TyBZV0gtRVAuJVsoSDtSPiJUUiw7VixOR0sqI1AiV0JYJD0gVCMsMD5STUcvTElQWl89WCg+KgotTSYqUVArKF0pLyUgWURMIjQvSF4nXTwqXE8tQVsgUDEiVVpITCYpKj9OKTYzR11FMFIrUS9JLkY2OVArOgotTSJQOTZbWkIhSFdDQ1VFUVYuUDQ0TikkQ0tYIyNPSlwuITNFWVJXTD9UJ0UgKTpIKzc3VlFPOCwmLi0yQwotTSpBMzE4IE4tMFMvRDlCSUk4XjFQVVUtSiQ4TFkzLzlVWSYmPFouTyAiKFBdU1NVSEVbXkZLW0Y7QlYuQAotTUAmOyU7T0IvXTxdXTdAJS40SktSWFlTKCxUMUw3Mjo0IyVVU1w2UEI9UTI3I1EqPk8/KFJINkInVCE4OQotTTxEJEAxQUBLST0wRTJCTS1RLys2VVVXXUhYOV0yWl49IiVBOixGQSlLXUtDUTtUQVFRLFJXLS8sWyQ3VAotTUUrMEUvNVgyK1ZHOz08TyEhN05KO0krUU4hRVoqIl44KiQuQi9OKCwgJ0hBICJPMCU1RDRBIzVbXTNFQAotTTUvQVIrPVtZXkY+RSYjO1tRP1NaLkpYTSouKi8hNCpIMDMlXjxHLkJXKVc1K04sRVVOLTRSNSwzUDQyMwotTU5UKFQjO0o7MiZeTCIxUytJV0ddTUk0TU1bKj4/QCg5TVY7MCNVTVk0ISxRM084XTUqSlxUITFcS0ddWAotTTclOjMoVSBEKV9fMEhGQSc7R0hPRSpKLkYgO1FIQ01dWVsuMVw1TDQqVFgpSE4sWj5HLU5RK1s/XTVZMgotTVcqMEkvMUJOJF1VLDgzIzdKQiZDTEA3RjFQQUgwLTwwJjNIQiBSUT4tUiRFTkI0W0UxNSxASzUkNzRVWwotTS82Mzs+SS8xUSNTMks9SEU5MiZCREYpPEgqKUNJMCdTRVBRRU8wMikqUzhePEUkU0RJS0wwVldBIF0kJQotTT1CUCtaN0xOSSRUR1BCPThJKTUsMlE2KDU/TS83PlZATEtJPS0yKUMnVUBENSFfXVc1NSteOVIoKilPKgotTTorJC01KEo+SjEkTUdXXzE7IFooOiwhNVcsJS4zM11PT1dCWzNZU0dCP04uVlo+W0M4IyAlWFRZQFQuNgotTScpPzgkJCA5OzAkSDBVIlg5RSYiN1cuTU4hRDpMPVxLRT03PCBHOS80RFVTUEQyKVUjKlYpTkBYOj1fVgotTVNHOTpPUyY7Vlg4TS1XSEZeQjBIKzZFJjhaWjw+VjBFWzQqSyI7IEktXFBGWi5INjVVQTMiUFZZSSEqLwotTVtYLCRJRl5OR1MzI1EgLyhGVFdIOCAiOCo2OEUwWjFJQUhBMzRITklYIEdfOU5cUE5MSStZISw9JCtQTwotTSoiRjk8PD4nIzQlLUkrS004UildISlXNUsnIVxfMzBDLU9bUT5WTlM/PjVbL0RFL0Y1L0NaODMmPUwkIwotTVIjPjAqMyIuM1ReJl47Qz41N1NXOENbKVFTRDVTMjgnPig6SUBGPzI8TyMjMkhUJDclKTEyP0koW1NPKwotTTcnMzlAVVxfSidaVSYsVy4jM1U0RkwyVS9VXkkmNS0lKUEkNFAoLiRRLV9ZNj5PJVRRJCwhUFApTk0gVQotTVYtQFwgPilNSjRPLy41Iz89T1deSEA8XUddNFZJN1tdXz87PlQ4XiVJRSRITygmUSIyXkpcICciMiJMMAotTS0pXUohQjpQRD04Oyk+IScwISJZIFJZUCdWT15RNE5HV1c4Ly0pMEo5Lyc6RVIsUU1aX1JUNjczIj47WAotTS47TEwkWy9QLC1GSkk1TTouK0FSS0EoM0slNzZWODRcJiYnIElURThQNF5FUThQOyNVJl5MTyQwI01APgotTUItUyMhPT1SPCIoKUMgIko8VkJYLFRQXzowRyEjKiZPLCtQMFQ9UCc5QEsnXiZVVSMvO1lKNTs8PUczIgotTV5EVCgyKyMtJDEsWVBKJ14xI0s3PTdbN10hWjQ8RU1PIldTQSsqPjcjWzMxNFBTVk5XXDQqN1Q9PiEnMwotTS1QR11RQCcvXEhVL0ggJV1LIF0lMkRDUE44NF8tVCFBOiQoIF02KFA1LkEhIVVcIkE/QFEwXyAkNkwtVwotTSJHWiVSUjcqNSwgU0spUURVO0pYTUBCJjVIIk8xJ1AuNzM0TSE1M0IjRSVIIi4vKD80IiJcVzhbR1VeLwotTT0tOCBFLjQ0NSIsWF5MVSJAW1JXQFtWRFQuPDpKTk4uO0JeXShCP1k0VCYuO0UiISpdIyJfJ0UhTy0nUAotTTFEWjEtW0g8WEUgJyohRiAuPkZVMjA+WTBJWi03U0cpMTdKQU43KjQtQEg4OC5IQzheUSE1PC1TSk0iJAotTTdIRi01TTVBJzk8XyJeXCtdPiowJV5WQ0EnSEFQLDJWIlI4REMiNVVULCQiJltSWk9SRz4lOiZQWjhVRAotTT9ET1s3PyQkJVVUOV4xQyYiUDstUTU7TkY3W0MiSFE1NVI4JjBTSThJXVhRNCdIWSEvKEpIMiEyRFYnIgotTSY5NVY3WD85KFFMIVEoRVZAPUgpXz0yQUNMS0QqICkrNCMzOzc5KF1XWztRIURaVkZKPixZNzpOSkpbLAotTTZNKCo8MElFVy4tMzcyK14gID4sQD9fVzNXKE9UTVsmOlVNMU84QFJFJk9UIjA0Ui9IPUkkWEJRVEAsVgotTUhGRCRfV0M6NzJdSlREXEEwWyJORDBJWCQ5V1EwK15XWzpfSiUrOU5LXVpNNVpAST5ePVomTFZCJy8rNwotTVg/MDApOE9fNitBSi4qMl5NSilIIC5dWlpJVFBEMj4pJipGM08hPVdbUCBUM1YsR09YPjcjKkdRLk8nXQotTVhBLC8qU1k4OVFAX19dXU1VSF0nQyUpMEkpOy5AI0REJD1NNiFCXydGKyRIWkZQKDBaLUhbLE1TKyYyMwotTVo1LyQpWClZKUMmIjMhJyFILVdLVUNVKkIxP1k5QSBMKCgwVjQrWClCSCA/TSoyTVEhWjw/WyxQJzpdKgotTSRLVEFGTEUrTjFQL0Y3NUNBN1JOQTFMK0c0XTAjUVY/UlFCK1QiNTQvPTgwIyFPVz1UT0QiLk9HUzI8LAotTU8nUl5LTTEpNUg5NDs5VCpKVjI4KC9RPCY6LVkkQEdZS1cyRjg3KVJEKlpQUDJMMU8kVERJVCg2RF1VXgotTUZHSzA8Q09LWFg/SFRUNDw8L1NJJiYqRk1NRUUnUFs+KjEsRlNGMks+MClfKSQjSjorODs/ME1BXjxNTAotTTwzPlhSTyYuMyRdP0QqKlU5Ly5KKjtZNUgxXk9JTSBWSlI4PFFSM1ItQlVaXSMnP1YySVg6L0ZfKT4gOgotTSJXU19RTFc3UEo+QTMiQFI0LTU4RFMiWDMzVj5JJk5dTlojRVdESkwpNFBGW15GWiJcJzpTKiUrWk9fRwotTTA7MCo0XCw3QjRWSEEgVU9fWFw8M0haXylKQC1fQj5FNlxCKlUwSDYrIDZGKVpbP1BeQ1InKUopVzImMAotTVEyIi5MJEhXJClVNi5QSyEvXVdILzEjNEM/SUNNNi4uPF0iSypBME0gOkk8XzAxLzJcVDoxNTI6RD5PLQotTTRQLiVbIkYsSyJBSSYrLEFKRz0+X08nMydMOiJaM1QgXUA+VC4hUjE1Ik4xOls2RzgxUl1JNTRGNVQ4VwotTSxVODFTIz9RSDNeV1FSVi5BLVMtN1JHKiZJQidLKzVXMTwuQFMmLSAtOzspJE5bVV4oUDZKVyQqWVQ6XwotTS9QOjA+OkguIUgoK0ZDIS1FQiA6PjpeISxHQidPQTA2IC5eSkJKMFcuO0IpKUI1N0wiIzA9KTc6ST1SSAotTVtCI1UvSiItID0+OTdGP0lEIV49QzwiNF8hPkg/SSQkPiQmPTdZSTtCSTEqPTYnLV09TE5YXjIvUEYjXAotTU84RStVNjEyTFVIIC1SXj5JTUdLWFQnNF4mRUtVXT88OylLNFNXKCMoQlImLCExWUw9M0pEQCY1TUciQAotTTVGPU1MVC9KPUxLIEBUTkxLJz1UWkYxKTVXWTQ7XFpRWEteNV1YPTpMXD9ASV46QEwvPlI+PlZISTktPgotTTJROVJOSlVSMyI9OkAjITIwU0BdSktFVTsrUS08RlxdJUU9PiBRLz9CPkUiI1UjX1RfJDJBNUtJLV9SMQotTSZUO19MQ1o+LVYlVjFMJENLUjQ9NTNUUSlCTiNdODghVCMkPFglMFRWVlxdMiVISSs2PilORFMwV1YyMwotTVRBOFRaIV9WTFMuW19dOkQ8SkElLipBJzJGJ1JaX1UmQSAiWCg7X1BFP1ZcPVBISz1NRyhRNiVVPV5FNwotTThNJyQ1OUtfI0c3IEFKKUEwMjVYIClZQCkjNUFFXE9ENjVWX0dYVSpUIzpcNE1ROFQ4WE8oJy1QMyBALAotTSc6NSM4MCVKSE1QQUksSUtZPzQxOVxeMzUuRjFVUTdYWUgqLlhYVV9EJDEkQiEgOUgkQU4rKl9LXVg5RgotTVMxUCNAXEwxK18iRlhBNTUgLl8oMzZMKDU1KVVBXUVEOyVBNU1GQkwlLEdeNl8hJVNXVysoUDpBMEVBQQotTTNQVF9WVUBFI1Y5Q19LQSojSl9YMSVGJlxTPydIQlAmI1NbMz0xMVZZPVwtJz5KVjs5Xj8jMixTRShAJAotTSpEQEciMixEPFlXPCFaPTgrKypCVCY+Lyc3S0IrKzFXNlxbST05KCUxTCdTMCEjOFhPIlQnWyQrVTlFKAotTUY1MT1CXk9UN0ksXzcyVUVVTFdUOEIkKVg4O1AqOCg3VEtNPT4yP1I8Ok41XU5UTCohQ0MnSCdFQlYtXwotTUcsUi1EXF0yKlc9Il9QWS9OSCZeQSg/SF1cRFZVW0dNWFdfKVY4ITdGVEdWUU03OFJUPkZBPiZdJzNLMwotTSFUIT1FNDtEOkFPQSAkT0w9PF49Mj9FM0FXNl46KElSS0xJSiAyRyhQWE8iJi1EL05ZNUpUUyInU0ZPLQotTThRREdNI09CTS9GN1E1RCozWExBLk9WKidcT1VBLFtcJT5MUzhJVzMrRkhKKDFJSFMyQyUzLlwkJkYrPwotTSohKD8nKEs3R1xNRSpERVwkMEldRE5eLj5SUycnIyBHTU1bXzEzLDhPWV9MKSEmMkpKTlJbISo8TzIkSAotTTk8IklXJS9INiIvVV01WjlIJ1g4QltAPEQ2XSY6QUFZWCZEVk0qJ0A7VVo+Lzc7KF85Kl9XXzY0TCtcMQotTVwlSUhISk5ZK1Q2PFBbOE8rSFpGOjghIFtVXj45WlgpOU0zRzxdK0JRMkIuVShSWlgmQiExXVJEUz5GMQotTSBCPkYnOyhSIjA6SD1JU19HUlBQSzwwRiIvSD4iXldGL0dHWyZSVC4zSzswNVxNLDVMS0NROEdZSVtZXgotTVlTQTpULi8zJ1ouI0IlJVlaSyc0MVhXNS1RWVlFKEtMS0o7SDFdLTY/WUsrPChHJjpcVClWMVlYLyhYWwotTTdXTyQvPzJIXDhNNjc6UUk4QDtSWUgmWzZJJkEpLktNODFdX15aQi5dLSs5JSs0XSlTN1RTWEpFTzNdMAotTStUPS1TKS1bU1o3V0NBSU9NQk8mJlgrNDIlKzFFWSY+JV9JUUpUK1AmSE8nOUpBKz8tNEJKWzY7P1EtKAotTUchQThUJThWXUExOzxIPiRYLFVGKS5YXCspUCUuNy81NSY0RDEkRCNWK1ckPyM9WDQkJlsoNlhfRU9eSwotTUc0LlRZLDgpRyNHKzM9TklON0VZTjAmJFQoXjJBXk8xKCw+J144WCUgPEsyJipYOEBRMFZAS19eJFsnNQotTS4uTjA0QVpDLyhWRUhEV15GWVk9UVs8RkZVLU9AJVU4SlNBJUZaOURLLzxeMD1WOlw0JlNAIFRfJEReKQotTVAtQl5JMlgyMiZLRkwrUjpCJ1xdX1ZcKlNeSE4zWyY2PTpTTU8mVjcpIy5IIzswLklIWjdVQDRJViciMAotTUpLLitIWFo2Ql5NT0hXQVYzWldULytBSEApTitINylPXUdZNEJAWlBULF5VRk9AVS5UIUdOMSs9W19NMgotTUU3NzhcOC1fKTBPKSxNXlVeNkNWUjEqW0YzKkAwNllDTkBBO09HPyknJkArI0lLISorRldNPl4rXT02TQotTU83NFdKIFMrOzdAJUVCL0EpRCEuOjsjXVckIlZRNkUwIzI6UjRfMks9UCVWSz4vPVAyID9PL1I/LiM+UQotTUZOQicxSiUlLlhbU1JbSzBPLSIwLDFNIDAoI0E8SjUpLUlOW1YgIFw4NSNTIFZXV0JaQi83PC4kOCJLRgotTV8kXD8sLSdJLEcuKVI3JFFfSjM2VEFZPCREVkNcQShKLCtQUDggVDpbN01cWDIwSTxHOSo1TD5LXidIPwotTUFNOk9cV1pUK146Vks8VjAvXCQwJE47L1U9XyAjKS5cXkBRSytGNC8qXDBbTkZFMUVAITElX0xcKTk3WgotTSUrPF00LS8tSVgpJCszQSJKQzpfUDlaPjZPQlAuRiEwU1lCQjkwIjU/K0whPVJEJVZJI0ctNlREMyc+UwotTVApSCtGSD1TOV1IMT1DOFpcRCpGRVNEWj87LVtbL0BUJjE6UiUrW1MvUl0kMVFcTlIoPC4+NV1fN1A5MwotTV48UjM4PjlBL0NZVSMiNyZPJkkgKDxBXUtEWEUoQF9PQUk5OiAnN0JaWylZN0A2PCVXPS8iQ0NcXC8ySAotTTAvXC44OlpVKVBSKSwqJClORCFbMjAkT1gnMFQ0I1cvLiQuXTpSQEg9PTNZQExcLkU0RVRHVyk4OCEoPgotTSs0RVlYKCs4PT43I1MiLEE/RlpKJT5eWywyVFchM0YzNzQ+TjNON0kyQVNLVi9PPDotMy4pPS1XKEEsLAotTSszJEFSQVA8IVxZNychRShUQEkpXyIiOSMnPC8tKFE1PlAoXUBPQksyTCI+Q1lAJydQLSlEISg4UjVPQwotTT02Sys4WUQmRlw+QiAxL1BQS1A5Tl4oOiE/RlhYSzVIMCE7PysqU08hWl09SVk3TUEqNis6M0RNJVVTOgotTS9IIyJYRT5GWEcoLyNPVl0jO148T1RYQkwoJjovWEdCVV1eVVpCJ01WQkIqWiROXTsjTFMgRyNEL0RAPgotTSIpIj1GWD1VW0pcXjciWilHPzVEIlsxL1s7PiAoUkVMWVtSLE0pLyBKPCROXjZLUSldOCpJWU08JFY7PgotTVQ5O180Ji4xJjQzMUtKOlNTTUtIIkEiK11XQUE6W1ddW1QpSE1MJz0pQkJFQz0sPSlNJE9CKSxAJEA/OQotTTpAMUNfVD9LKSskKFZfWVdPRFtLQDsmQlg6WE43NTNeXzUtLzksV1BMLjJEKElJUCxTM09LXDE5UjtQRAotTTBfRl4+Tz9HKjo+Pz0qUjsnQE4wTyA4SSAgICAgICAhICM4IEdQJF0gQFgjJSAxLiE7VCc3UERWIlQkLQotTUAwX1QkSVAgICAgICAhOCArMCEjICVIIDwgIicgKVQgTSAjKiAuJCBdUCQuIDIwICAgMDogICQxWCEzMgotTSJGLCoyQEosIC8kIlghP0YiVjgxMSEiRyBUKD5RUVkmJDlMLCQyNC0pPlQ8ViBZWyMpWC0mIVhJJFpEKQotTTlCLjMjKVA7JzIpUyEyVDNXIjIpKS5EKUBRSFApLjQwSTBROiU5QEUzIStVJTpcO1wyJlomSSAoI0AgUwotTSJBXDEsIE1fISRMNDlQKjsnIzgvQUIyIyY5OC9IIE5fIEJQJUpQLigoRlA9VVA9TCRLLC01USY/JV5AJAotTSMwTlUgJiQhRFFPXCNfVDQ4IFJOJSBYQSghQjMoSyQvPyIwNiI3TCAjQjhQIixUQlxBRlYkMFgkU0E9RAotTSVWSDM+QEQ8IyNURVMhJyUlP1QxViIvOyJdUENbMVAhIyJcRjkhOCYjTTAyIjFENSVWOEUmUCgrJSUsKAotTTohUVomTVxGNTElOSVSNCMnQVEkI1ssOEhSIy4gKVQpVSE/Xyg8OD0xIjVPKU0oNCghSl8nVDgiSlAjVAotTSdUOCRLIFpOKTNQIVEgJjElVkA9JkA3NSBPJEY4UDFGIlEsNjpBWF0jNywjPDBCXCFMVDBCMTI/I0U8KwotTT8hMk4nTUhGPyFVMCgzUC88MEc/Iz1IKkYgTD8iXkA8XyBbNyZHLEAiQSQiJyEoP19BJzomMkA1QVIlRQotTSUiJDU8QVtOIEZQND5RNkcjUiQ4VSItViUwSCYtUU8nJCNcKSQiICQmOkQ3TCAkQilPSCBOUiwwKEEoMgotTStQJ0InWlwvWUAhLCJULEVEUVBRJlcsNktAUzknN0Q8MkIiQSJFMEEhIDowISYsP1gxK1AoO0wjVlE5PgotTShWXCwlQEYkJjRAJSVQQlAnKEQlTiBMRylLKCVNIDMuJjUkQ0RAKVcjJlgjUUI4JCNZMD4+QTQ7JDVUKAotTUtASkgjOiRBPlAjKiRXICEmMT1cICEkQkNRKlwjL0BGPCAlRyNbXDBKQiBAJFsgQyxBRy4oKkgvJ0BLUwotTSExLCpZQTclKDMgPSAwVCEmVUAhXDBNTiJUODZMUVFDJD8wQzFRQVgjT1AyQFBMTyM2QDE0Ii1NIjdcKwotTStRIzciS1gyIDA9LClGWEEiUCVLIVEkKiUxNiAhXkA4RkE4SihdUDI9MiRGJz8wKkUwJEEjMiAhJFBIOQotTSIpVDAiMEsyJ1AwMjhCJy0kL0w7XEBZPCY7JCE1IURfIiREKjwhQkEnVTg+SCE3Qik2LDBWIFYqJ1UwJwotTT8gX0YiWlAtQDFEMClFMCg/QitCKF00N08iIVggVUQkMiAyPCBGUDJeUCI4ISQwPTBRKikjUyQvLyBIRwotTSQzJC47ISQsIksgMF0wO0EmRCw1KlFSUyMnODc5MjJUIlxUI0VBXjMnIkA1NTAxKiZQND9BUTdQJ0JIOwotTVEiMlQiUlwlNEIuKSk+IDciICJEKExUIipQJlIoL1QzNjFMKSI0ICEnMDlJJkNEOjYiPCUmUShGPkBGSwotTSAkPDMvMTJTJDJQQyYgXlooKzQlXVAuTCVMIDRWMUxZJChQK0cwQzsiP1g6PyAiWiInVDQ/IUgvI09ERQotTUVRJDcmKzw4UFFcPSVdSCo+QixLKUBMJShAIFIjXUAxKDFcKiE5ODdUMjdSIDwkOiBROzQhSkw2PlBAXAotTSJaNC5cIENZKEY8My4hNT0gU1wrOkIvSSIpKEA6MT9HIiJAK1kxR1EkVyQqVDFRUiRPIDg6UDclIUtURgotTUcgVSggJ0wxQjIoSyksWCs9QENWKU4oLjsiIlkhQigvSlFQVCM1TDJSQTUpIiwoICAwJ1snUiQ0XSFaOwotTShMXEAjQilKIT5MRE4xLSwjIFw1VSBHOCJURCBMICM1IkJcRlRQJTUmSTwzW0BCPyg4IEZNQTZFIU1QLAotTSchO1kiTFgmVkFPXSBKOEAxIEhRJSgkMCVQLi8iUjQ3LiA+QydFODErQVQhJVkoKzVAOiYlKFQ6OCInWAotTShMNCJUUEAtISokMSIwMyQmKTxEP0BaQSJNKChRMjRNKDpAIiFQJSYkUjgpU0AjUCJQJDdZIVFDJUQgNgotTSoxKjYgOSA+XSBGISJNIDtSUjpBJ1dAMyIgVFMmLEwgTyBNNCNCUCJTQEhJIENEMUMyM18nRDw6M0EiJQotTScrODFWQFczKU5QPEVATU0nJzQzTSAuLiEpKDpdQjQnJU04MVpQQDIpPzgnWiI1XilDSDpMQjhcIFZYQQotTTBQJz8jTyw+KTBGQyRPWDhRQUQ9IU1MQT9SNlUnPkg3TCIkVCNJTDosMjdNKEE8PCUgXTAgSCwtVEIvTAotTSFfUClUIF5eJEg4QkZAS04lMlREWjEmLSdPLD5AUV0gKS9IIz8wRjMiOiAiNFAqKCRGQEVVMDBNJjIgNgotTTQiMjYiLyxANzI3KSBcLCMnMFpPKEFIRi5QUE4mIVw6WiFSTCVKUCZeUSYzKSNINVgiJk8hXSArUSFVRQotTSNLUDZSIikoKCJEQjxRITooSDwkVlBaTSY8TCApQiw8IUlERSBQSUAkLTAqUTA5MSgyLDxeUSUwIDo4LQotTSxSMkMnUDQyWCFDXSRQICBBISooJFlIKFIwUVInUExCIVE4PSZeICdHMjlDJCI8PUNAIUohT0Q4UiFEXgotTSVQUEU1UDsvKEM8RjVQSy4iSjhCTjAyOiVZSCUuMERIIE84KFVCOV0pSFghMCBeLSJOPC5FUDJIJ1IsOAotTS5AP1AkN1g+KCFZXyNdPCRbQVI2JCpMIilQRUUnM0AuMjAyNyQiNCI5QS1XI0I4IlYwODEjJygjXVAxTgotTSYyVCw4MjoxJE00ICRQTiMjLygkLEBCLyNGLEUvQjtZIS9IOCMhL1ghVVgzVDFcXCRKJDVUISIsIV5cOwotTVsgTzInSEAuXFEwUicmJDxNIjhPJkpIN1kyIiIlMFQiVFBcRydFOCg4IDlKJTZAMFBRQj4hMjQxISExPgotTSZCQCVHQCwgKEIgOUEgTEApIzAlPlAxLyk1LChYQS1cIS84N1ZRNisoSywpUlAkMydfTDIvQC8vICo0OgotTVUgPlUgWDhHIlA2LSAkWDlBQVgoICpMJD9QICQlMCArKCBQOSczOEU7MSo/IEMwPF4gTS4pNDgiVUBHRwotTSY6QDkoQTovKChYOiEhXk0gUCAxJzFcLCBUIEVfUUkwJDEsPiFCJSYgNFAgSzIgUSgzKCAhIUZCIzo0LAotTSohLiYgSTAlXSFKRyYmKDkyUV9SJ09EQDpCMz8oXEQoJDEuPSMzUDpZUUVPJkFMMC1QMlgnVDQwKEBZTAotTSZSMChDMCxFISgoIEExISkmPlwnJFAvPiU4MEFNMCRMIjA4LU9BLjklLlg2VkInPyY6VCAsMTYwJTlAPwotTUAgVVElUlw0WyE9KyVAIDcoQjEnIjpYJi5SKVshK1BGOlErUCJAVEJFQUJNKCZQO1ogUVkmJSAoXjFCMwotTSIiWEQuQFtVKSIoLiYiMCgmKFgtWVFOSSUgOD4rIExBJy1YRScgRCMiVVAiQDE3XiEvPCg9MVZEJE9URAotTVgxTjYiIFgvI0AkIyUwXCVRMFFIJUxALSVQWyMjOjw3UTI4LyEiUDAtMFo6KUBEKlIxQ1shQjw3XiI1QgotTSA6LEJUISonIChMM1xCMzUmLSg5W1A/QCAiIDk5UEogIC9ULCAiI1YhUSQuJTFUJSYwPC1QUFFaIy40LQotTTVRXjMnMSggIzFDSCNALEY/IFI+IFksOFIhXkIoXkAwJ1A1LyNIJDY+QUtAIkZML0MwOjEgKUwqWjFFIQotTSYrWD5NUEc+I15MKiAhLkchKSggMzFEXyFVNDUsUVxKIkhMISsxLD4iMFA6LyI6IyAuTDhLIjlKJVRUMQotTUAyLVsmKSxBO0IyMidYTEZTIUQlJk84Ll0xPkgiPiQiTFFJUiFOJCw8UipKJycsN1AhU1wlQ1QxRTA2XwotTSlGRDhXQSknJEgkLF1BOlslJlQ0R1FIIylIKCFKISRaICIsIkExX18pIlw2KSBHMSUnIDNYUV9ZIVwoQgotTSMhOTYnOiQsKyBKTCIkODwzUFshJi88NCsxNE0oIVwvUDBbVSVDREVJMSwjJElENlghJCopKEA3IyFdJQotTSJAICxQIV8jJUxIKVlSIlcjWDwiNDFHVCVMPCYqMSUsKC8oJE0yKlAjSCAvXzE6PiAkSDY+UTNMIDo0JgotTSEwKiwgSVA2LFA9NyNPJCA+QipXJjY0RVUgLF0hMzwmXiBZJyZHPCtRMVZAKFBMQltRJzIjNFgyUiBOOgotTSNfNDtbITdZJVVMK0QwNVYiX0wqNTBHLiEiWCpZQC0yKD9ILUxAMyUnJEAiSlBKXCNPUDZFQFxRJC5AQQotTSNBNzomQjAqRSFNJyUgXDpHIFNZJUtYJz5QQF0gPzA1PTE7WyZbXC86UC0pKEVcPVswKUkiVkQoUVAhXQotTSZGOEBXUD1FIiAoQ1IhW1snSjhCWTAsWyM4OD8gQioqJUI8QDhQQyIgOEw/RkA7QidZJEBJMUs9IU5cLwotTUVASUkkKTAtVEI6NSU1VDA2MVArIVowQj0hJTohIEgjTUEvKCUqSCArMSczIUxcPSYgXlkoWCxGXFE7VQotTSdITC84IF1EJV1EIC5AKSAoUVAiRiBdLykrNEFOMVs8JUAkIyJAJ0EhViAkTSEvTSdLOD1JMi9HKT5YKgotTUAxJiUhUFA4UVEjSyMgKEBJMTpVIytYRiBQWSEiIiArLCE4SiAkVEM+QUIpIF00K1dRJlwlIUgmPUEgPwotTSMnXCU9QTFfIU88Q1JRMSEgTCgqT0IjTilKQClcUEtfIjxULTMgSU0jSCQqSEA8JyAoSCNHQi4+KDRUMQotTTlCJzwmLCBGKkInTSk0UCNZMTs2Jzg8RSJSIkohSCQqUzIuJSgjVCZPMjkyIC00PlMwTEUhOCwoWSFDUAotTSgoRDM6MTJFIixMOVxSOUkiWjhEJVAuPyY/NCVMIVxOKD8gN0xRWlIiIVA3ViExQSBIMC1PMTxTJl04PQotTURRK1okP0grL0IyMiZCOCRWICBSKC48N1gxNCooVlQ5V0BBOyFCQCUkUFsjI148Oj9RISAkVlwjXVBSMAotTSU6NDJVQEsgJzY0IiUgL1cjNlA3WCFMVCEiJDRWQDZJJTw8ID9RVS4mPTQ9QSEzQSEnIDItQDstIjlUMwotTV0iKlAjXjA9UUI6ViFVUDpcQFZaJTggLyIxLDghTzBGQTA0OCMzOCdVMVIzIURYPkNBMjspNCQkN0BbVgotTSFWJC0jQiQyJjAgIF9ASFopOzQ5MkEtQCA4VCokIVRcKSNMQCogIycoNzggSDFDOCY6VDVKMD5GIl9MNAotTUNQKE8kVVghLlA4MihJRDwkQiZOI0w4Pi8gUy4hUCg8OSBJKCU3VEVEQihCI0NMOEExPVwjQUghKCEhTgotTSVKMC1EUVAmJFMgQi1BQlMjVCRDUCFcMSQwRDE7UFA3Iz4oJkRRPi4hWEQ8U1FBUiImQDlIQTs2Iy1cLwotTTBAKU0jV1w1QiFMUiUkID85MEdbJiUkO0dRVSAhK1AzKEBGSScqIC5BITshKTxARUlRTzAgO0w9TyIkMQotTSVeKD9QUTshIyggPjEiMFokLTxEQ0EoXCcoMEIoIF1NIERARFVRPEImRkQ2UlA1WilKODtMIEY6IiQgNAotTTdQO1ImO1BHIVI7RChbUDozMTIyIz1AOSkyNj8hRSg1MEBdWyIsJDk/MS9JJkhAQi8xN18jXDgmUiBSWAotTSgpXDRQQjtbJk4wNz9QMUIlJzxBLTE6MCY/RDNeQUtAIDxQIVZQNFEiTUQ/OCFGQidKODs6QjpFKSpcLgotTVQyOUokJjwvIFApUyk9RCg5MCJAITJcRVJCJVApJSxDITFSVSdfTDdAMU48J1lUNj8xVlYiNzwgQVAlVAotTSYpWDFfMD9LKF0sJSshNicoWExCREIsQigiQDE9QVxMJ1Q0PCwhJiIlXlAhKjAwOSZUMEVFMCRXKE88QgotTUxRPTojXlRFOzBHLCRGPDEzIFQtIzxMIiJSLlYnLkQ/MFAuViMtXCFIUVglIk5EMiUgNlopKCAmR0I4MAotTSBFIC8vMVcoJSswIjdQTC4nKiwsXyFTVCknXCNaQjFWIDkgIVkyO0IhLkQgLSFNXyMoKCowQS4vIy1MMAotTUMyM0QmTFA0VlFVNCEpPEQjISxRKFtEJS8gJFIiJSRGUSFeUCBdXDtTQThLJk9IOFMgRkwhLzQ/PTAqKgotTSM/SD4zMD01JzhYIjcgMCwnXyQ/WjA7USc6KC9VUDsxIkhQPzEwICEgNzAjMlBSPSVNTDYyIFpIIjZEQAotTUkhK0YgWigvWlFfNSJDUDlJUFNGJlRQQDNAK1UjLEwvLlFaOCA+QDxBQjNPIjxQQiNBVT0oPFg7IzBXRwotTSg6RDc1MV45KFckNyIxPV4iXVwvUUBQWyhRLEJVIVhbIjogMTIhWUEgVCg2RCIzNyA/TC9FIik/JUU8QwotTS8gUDsnNiwvUjBLNSdOREE4QT8qJjZEOE0gKkYlMkA1T0IwUyVQLCogQCFKIVooM0ZATjMpQUQkL0AoXgotTSkiIEEiMVo5JSFcRTAwVlIpRjQ8OiAuOCg4UDNKIjgrKTdAQlUyIi0oLVQ+TSBYJSg3WCtYIVolJDIoIAotTScgOFkkMkglM0EtWShKPENCIVRGIFQwLUBCMFEpIlgsU1AuMCAyKCVWMSUsJVFcMCxAXkMlTyhBUVAiRwotTSgqUClMUUw0JFhUOT1QSEAgQUAqSlAjIScuOCtAMVlaIFEkL19BITghK1RCRSA6NiQ7VDkhMFQ9JjE8JQotTVhBPykhK1QkOzEvXiM1PCQtMD5GJkEsPF9RQCkmV0g2UVA0WiEiSCdDUCknICYgQjMwUCQkTCA8QUA0PgotTSZMSDdNQi8+I1RALTohMD0gSjQ9MzAvSSNGTCVVIEwgJldEL1xRMEsiXFgnWiE9ICNZJEE/IEhDJVYkNAotTVUwIzQkOlAqO1E0SCcpXEJBUEsiJkpIQENRSDQlQTREVEAyQSFXMCZDMU1GKTE0OkdAPz8kJEg9OCIuKQotTSJBNDwjMV8/KCBQJUshSzApL0w0WFI5RiQzLDZYIFAvJVlMPEQhIDMgXVgjPjIiRCdPLD4nIFBDKCY8QgotTUoxLVAlSSQuXVEhPCBULEApUFlKIzwwREtBTU8hVTA8MSElKyBAKDhTQS44IEA8IEVQMT8hWCA7XzAiKQotTSVGQEQvMEc+J1QgMidBV1sjJ1Q/MkFRJChULCtbICZNJClMIjsxKS8gRDBFUUInNCdKUDhEUiNZJFZEKQotTTlQJywnKkw6OjFFRClPXCMpMC4zKD9AMTcwIFgpJTw6XyBdLSgmMDdWIjhTIz5cIk0gM0sgMjAjMDBRVgotTSkrWC5HICQzISRMJVJBSyUhI0BBO1FfKyE3MDMpQExaKThUNkxAI0woL0w1KiIjKShCXC4oICFGJisgLwotTUkwLEkiMlQ8N0AwRCBZXDgxIDxVIjA0OVIwI0omVlwkIzFeLCQrOEI0UDE3Ik4kNFhSLzYkUChBN1A+WwotTSk+NEJdUE4rIUQ8IS8wJ1wkP1xFTkEpICZLQCc6IDNLKUZAPFlAIlAgM1QsPDE3MSJSICVFUChBKDQoRAotTSsiLT4kRSwyPEBFPCNfICVHQU9ZICI4KTEwQEEgNjw2IEIjPCcsOCY0MDAyKUcoIVsgJkolNSBEViE7JwotTSYpNC0/UC1fKSAoISxQXU8gISg8TUA9IiFQVCE4IV41Iz5YRlAwW18oUFg9MzBYUigxLEBMQSFRIypIIgotTTowIEYlU0wtLCFHTiFAPDBTUUFSIV1AQyExN0ckSkQ2NzEsTCQtQDU7IUIkJFRMK0YwPyUnXiApJFBYPQotTSVPIDgsUDA7IjQgNCJBL1okI1RCRzBWUSgxTDRAUDRAKT1YRjJRREAgNVg7TSIkWyYxVDMoISJAIFtENgotTVsxKzQlVzg0QyIlKyBYRCg6IVhPIlNEMElCOzciOjA5UkAkSyFbPC5IMjFUJDs8MD8xIlEmXkAhKjBeSQotTSg1PCFQUFpdIlgwNyhBPSQjXlw1RVAqTykiTEQjQUs0JFc4P1gwODclUkhCRlBaQSkoKC1NUFlOIUJQOAotTSYwJSMlOzguRVIqKCgrRDpaIDdYIzYsRUwhT1YnOTBCPTBQLSFAODQhUSUuJkpIPFpCMSsgQygkV0ImUAotTSJOSDg8IVdHISNMQj5BJF4hOzAoWUFaVSgpNC43ME5IJEUsIVBQV0ghQlA9R1FFTSNcVD8pICUhJDogJgotTT9CL0IgNyw+W1AzOChROCNZMDxMKTEwNFwhNSglWEQwM0EuIyM5KD8oQEE7IVlcPF5SK04mQkQxNUBXRwotTSIhUEJNMEMwJj4sIidQIkQlTVQyXiFbQiIlJCZPIFsqKDU0LC9QVzMiL1A7KDFRLCQvOC9YUC1aJ0EkRQotTTshWCAgI1Q3PVIqRidBMEMpIUhbIzJIJ1IgLVkjUTA5T0E3QyFeMEVKMDtBIlVcIjAhKiYkLVQnVVE7VAotTSJNSEJNUExMIiNAJ1NCKF0jITgiJyBRWykqVDVNIFcyJFNYLD1BVFAgRiQ1REI7TilEPDYnID1BICAkIwotTVQhLVMiXiBDXUAuWyQyPCsgMC5KISVANURRNCshMUg3MEA+VShUUEErIT0pKFYkMFsxIy0gRDwwQlBWVQotTShVTCNGIEolJTFYI1AxPFkiU1A3NTIjQCE0JCEiMi03IS1ELSgyNlklQkw8JEFCLCRDQEVaUTBaKEBIKwotTVtSMzAnXiAtVSBDTSJbQCA0US4jJCEoKCAwUlcoJ1g4KEA1UiFFSD9QITUqIF5APEcwLlojIjxDQVFAPwotTSFGODwqQS4kJTJYKEhCOEggKCQjTiFNWyMhPClcMCEkIiRENyFROzAnVjg4NjIkJiRNLCAqMjZbIE8wNAotTStBJUMmIUwjLyFMXSA3VDUnMiUsJUlQPzohN1gpTVQvW1FdNSlLNDUuQjI+KTRUMUlQU1MpRywrWzAuSAotTSIrLCYmUiw7JDM4LEFAWTglQiwzL1BZJiMkPEBMUFwgI0o8N1ExPlEnLEwrMlE0LyA1MCsgMSE1KCMsKgotTSIhIlQkWlQ1UlBfVylJRCw1IVciIE4oMVQwPV0lNiwhOSIhSCBBVCNKUF5JJFUkPVlCLFYlJDgnSUIoWgotTSg1QClUUT45ITk4QF9RWzgkVyA3NUA8WCIgVCM0IEEwKFhAQEQhOighLzAqTiBGLSFcVCIoUTIyIiEoKgotTVgxRFkmV0w0XiFXIiE2VCUmISA3IFgsMVFQXEUjJDAvKVBXTCNQMCteQENHJ0UsMC9QWiInSzw3XlAoJAotTSNeTC5ZMCY7Jks0PURALT8mL1QpIEI3TSVUNCc2UEY8IShQPlhSJC4mKDgpNVAyVSk5KEFHIU9EJUZYNgotTV8iOj8jPSxGJyFJVSFPPCxIQU84Ii5UPEdRM1QoU1wwPSAvTSFSLDJXQU0wJkE8KlIyJDEoTUw6KjBBOwotTSdWRCdOQio5Il5ILyVBKiAnQlxEQyFNTCdYICMyIVE3IjZcI0cxOiooOlxCQlA6WiZfIDNRMDJJJU84MQotTUBSJy4lR1RDMDAvRidYLDg+MC0gI1xcLEUxRSIiLlxFUkE2MCEwVD0oIFYiJUg8IlxQWkgmMSA8XFFEKgotTSFJVC03Ui9WJ0tANyAiJkYkNEQyJFE4PyVJQDlfUCojIyYwJ0IyJjMgOjA5TkFNKSJdUDk4IUMqJScoJAotTUJSOzkgMlAjKCFYJCdXUDo4MUlaJD9AOT1ATVElNVAvWzE7ICA6XD45QC0pIllAJCIhWEQpKlhHIFBANQotTSIlPDIxQCFRJygwLS4iKT4kIFQnLDFILSZCJDYtUCw7JE4wQkZSLkohJyQiKzBXPyQmVC9PQElEJVBAJwotTVVBRyMhLEA4RjBIWyUrSDFKQChGIk1ANlMiOFIhIzAtJlFDIig9WD1TQFohJzMwJFkhPkYpNDA1TUBLUwotTSgsUC87ITcuICZEK1RCNTMgKEgmPUFZTClFTEY3MFhCIEQ4OVVANE0nQ1QiJEBGXCMzTCNNQFVAJE08PQotTSRCOikpPygnISEvSyJZMDIhMFkkJEw8OiBRVSYkJ1xCM0FfOyFGMChEIDwyIkUoLjMyLigoJVA+PSI0KgotTSlMIDspUUMzKFFQITdAVjghXCAjICE5UyQ1LCs0QiFAIFw8JzJBJUMoQkw9UkBZRCY0UDJEIUcsIEJYKQotTTQyLEkiOVg0J0EyKyY9QCk1QSE4KTM4Ny0wUSIjUTQtRkAgMyYsNDs/IUNBIC4sNVJCOFEkJkAiJkFIXgotTSJMICUuQSItIiAgNkYxPCskQkAqUFBMIykxMERaQjVCIUJUI05AU08jRkxFKUEpNylDWDMqUEcmJjw0QAotTUsxJEwjJiggNyBRQSkrXCM5Qi8wJlwwIDZBL08kKzA0WCEsWCZYNCZDUDdQJlhMQk8xTF0mSigpVCAoXgotTSYiLDVcQCNBIUZQK0FQNEIpSlQlVlBINiNOOClNMigiIzZERVEwXFMgPTQ4VVIiXiU0XDVJQUlCJDFQIQotTSNQXk4gViw/R1FJISBZKCk6IEE1JycsRD4hOTMpPlQoTjBWMCNSJEZIUTw2JTVcOFJAIz4nXyRFMlA4JwotTScrLCQ5QS1SIj5AOzRBO1UoUTREUTA4JilQQD0yIVIrJj5MIy9RQlwjS0QhQkA9NSAiNDFQME5GJS9YPgotTVUiLT0mOigoRTFDTCgzWChUUD5AIlhQQE5ANy4mPDwvJSAwPiA3VCJDMF1KKD4gQjgyO0glRUQrVSFJSQotTSVPICYoQEFVIjBcOSxRWUwgMEQ1KCEzWSAkLEIrIEI6JjA0M15ASUckNSQ4PEBcSyk4XC9aIVZEI11MKQotTTtRIi4oIkwqIDI1TiQrKDArMTg4IVVcQlZCJCQhUCAhXEFIJyJIRDckUUFeKTFYPDFQLzwlIVA1VjItKQotTSZKLCpAIVBMKD0gMFRQQicnWDwzI0AtXyUvIDlGUCNBJkhQOzhQNDUhMCQ8S0AwQCZQUDgxQjFcICEgOAotTSghRD4mWzAwIjIoMCVFTDc3MjpWJSskMCNAWSMkV1A2TzEoKCRHPDY5QV1KKTFAJT0xIkonMEQhQVArQgotTSNWRDFdQSJPJzlIIiQwJzgmQVRGL1FKMiMpSDxWMVdOJkk4Jz9SNFUmREQ/JkE8ICk8NCozIVZXJzVQQgotTTMhQFojV1QgPCAyWSU3LCo0UEY+JVRMKVRQMy4kIUQvVUBNXCBEODQ+IiAyISNARCAwMCkgRUg9JDBAMQotTSZVOC0sUCdJIEkoPTMxQDcjKkgqTDI1NCFBKCBcQEQzIzFEIyJRMjojISQ4UTAgOCEzIEBeMDMhIlU0RgotTUxSLikjTDwvIDBSLCEwLDRVIVtWJDpcMCFQOF0nIzQ0XjIvJCQsVEJRQF1PKU1YOT9QQTQmQ1wqIUE0UwotTSI9WDMmID0tIU9ELCtROCwpS1gmXVEuXyJZTDgwQEdIJlMsLF1APjIhVVA3KSIsMSI3UEA9UFI5IStIKwotTSdBLDQnLyQ0SiE8ISMhXC5QIFdWJ0lAJiJAKkgpPShGSzAyKSQoUCM/MixUKUNQLSFQKUwmOzQjSzInVgotTSA8WC1QUUdeITxERj0xVC8nMzA2TzBbSyhUWCQ+IUUnKU8sNUdSLTgjV1RERDA3OCJcJDsuMEolJUdMKQotTSZBSjoiMyAlWiBHOyk/PD0qIVk7KC5cK1YwK08nTiA8WkEoVCJMRDRbMEhZJVMkKlkhMEEkRlxCU0BfTgotTSItNEJPIiZeIEBMOyggSywkKyRAKUBbNCguIDkoMVZQJiRcLUUyMCYoKEhBOVAgXShdPD0kQF9MKEc8RgotTUlBICEnX0xGRDI1RSMzXDE6MEBMIjMoRkRBQEImJThBQlApJyQhPChFIiMmKTFcQEMiL1shQ1AsWkFUKQotTSkrNCBZUVssKTUsIDRRKiskLSQ1KCBbQyRPKCZbIEVGIVU0LV5BQD0nSUQgI0IiKCJCMDc1UTEgJTtIIQotTUBROigjKTgnNTBGTSdYIDZUQUEgJEosOyshNkYnNURESTFaRCM8TCpOUTlFIExEKCEwST8nMyAzQiEsRwotTShHLDA8UjsqI1tYJS8wTDMhRTggIyImJiUjSEBQIUE4JEEgRC8wMjonJCAyXDAtVyEgVDJeQiVfJkcwNwotTTchUV8nMURGJ0I6KiBMNC9GQCw/ITdAKTcxWDsnTVgkTiBSJCdWPEFJIVc9IVJMQl8hODkiIkAgTzBELAotTSYnXCBWQUApJTNQICAwIyIiSjhFL1ElOSNBLC0xUjMkJE9YQUNSO1ghPFgoJjBXNyIwUCMyMS44I15ENwotTT9BSEEjVEA8STItSylNOEI3IVkhKS5QP1QwQj8lTyAuRFIyKSlNUENYUUYoKC5EQj8xSEAlXTAvTUIyPgotTSRRVDY+ICAtJUNMKE4xI04lP1g4OUAmUiEsND0pMEVaJUBIMjlAS1whIEQxISBQMSFDLCdSMUcvJFQsPQotTVRQMSokWDQgJVBEPSVHPDwrUEcnJUQ8ISkwMkohVkwhSlE3XyEjRC43IChMKUI0NEIhVyAnMDxCWVE1VQotTSBIUDc/MjZbI0ZMOV8gO0AkLEgpVyArViZELEVQMFIlKSZURkhBWDkoSEQsKEEgNCMxMCtEUVEiICNcLgotTTVRIUYhSUw0OlI8ISYwNEIrICxeJixQNFowTzAkWkA9QCFXRSFOQCpEIUJfJD88IFxSIiwjQShDSCIuJAotTSQkLCY0QjVXKFVANCEhPyQoWVQ3WEEnTSA8WCJaMVFWJjggO1hRQyshUiQjSSAwSyAyNCFOUUg3ICQkLgotTVEhI18gTlxFQFIoJyU4IEJTIVkkKDVUMEZBWzEpJjQ8NEBBICMmNDBKUT1CJEwwJCpBKlgnI1wlVCAqNQotTSk0KDA0Mi1SIEkgKShBMlAhVFwwXlIjIignRCsxITNaJSYwPUdAS00oOCg/PDE4SiNYREVXMEReIEIkIwotTTkxSkgoQCguXUBBVCReJClKIEkkIF5QKkMwOUYmXEQ/STEqLCBaJEIxUjBYIUFAQjUxOEAoJChFQzE1TgotTSRANEZBUixNJF9AJyFRI1koPDQiLkI7TyY2MCMwIiYwIFQ4QzFRWlAlUSwhPzBLKyddREBTQC9DJUpEOAotTVJAMl4kWFw0USFMMCA6IDJWMTxYITEkPT8wNzsgVDwnQiE7ViVHJCxSIEgsJSggJU0gXSEkLCA6SEBFNAotTSdLLEQqIDJBIig0LShRXVIoK1BGSFAmVyU8ID8wUTs8ISxURUBBWkclVSRDODE2NSBcSCRJICVUJFQgKQotTSoiNl4oXjgkP1IrTyUmSCRTIEcmKDokRlBCICkoQTA9WFBfLik9TEZMIDdfKCNIL0tRPSspQ0g5TTIhKAotTSQoOD5aQEIqKSEsOEVRI14iTkgsUVBXQCc1TDgzUEE8JC1IKFJAPlcgRywxO0E4WiM1NC4oUSRZKDYoKgotTV5BRFMnVkg7MTE7NyZAWEFLIT5JIlpEIiIgXC4lJkxDVVFXMCI6XCpZQjVaKEBERjIhQFwgUjBALSAoIQotTSBISEEmIFA/KEgkK1gwMiohLyw+UyFeUiVAIDwyMF0xKT1cKSowK1QpP1BFITBMJCZVUCtKUDdLJi4sPAotTUVBVScnXlglVSA3PiIjTEY8MjZGJz1IRkNSJk0mVFwpK0ErXikpUCZTMjg3I1AwMjkiOzUgWlgjODBLPQotTSU0PCAjUCgwI0MgNl1AJT8gICAlPDFdPCRFID80QVYgJUo4LDAwPTsgLyQlOCEnSiMiOD9LMCxNIjZUPAotTVNBJUsnPFxCXEElRiI5LCJMITtLKCMoLSgyKiAkNTQ1Q1BPVSA2UC9LIiI1JCg8QEohOTwlWjwnSFFUXgotTSgxQCkmIjYxITcsQCRQSCIjUkQjKSE4VCFCUDVdQCNdIiQwPFAxQicoSFhFJEBQJCZDSCM2USxZID04JgotTSggXSojPFg2WTAhJCItMEY7QDsxJkQ0RVJQUV0gNyRENFFMLyZOKCdTUSM/IVxIOVMhXy0iOEApKjFUMwotTSA8JCBSQF8gID5INFZCKSAnJiQzRSInQCVQUDVJMSw7JV0gMSdRQlMlTlglXSFXNiM0QDhXQUElIDpQJwotTTQhL1MmIkgpPTE3KCFVREI5IjVEJ0M4LyoyNVsiRDA+NCEvIidPMDVMMTBEJCAoQ1hAJC0nX1QtXzIgSQotTSYlICsyUVggIzc4P1JBVjApRyxAIyA/IiVeWC1DIi9OKCwwJSkiIyMpJiQuRCFLSSlFNDElID5PKDckNwotTVRRXkokIDA0SDBcNSkpXENCMjdIJyNAJ0owSCkjRiw5MSBBWSIyRDY1QidUJTBEO0QgUSshW0hEWTEqOgotTSUwWDlDMUgnKDRIQjFSIFUgX1ggISFUOyFFPDEyQTRXIkhQLUVAIzgoQERDTkIvICk0PCkrICMpJSs8NwotTSFBNk8jPlAnJFAiNCRZSDZFUFU3IkVYMShRPEonJEQjLUAkUCUqIDMiQiZLI1FcOUswPDInW0Q3VzAzRAotTShLMERcMFU+JlwsMkQhOFwjREwoL1AmNiZQNDlfQjpOJSM8JDZRTkElNEBEVyApXSJdPDIgQEJFKDhAOQotTVQiID0mVTw2RzI0OyAnPDEmUigvIjtcRFYxMV0mJEw5TjA2XidLQCAkMV8lIUU8MFpSLkAnOyQqWSEqMQotTSElRCxaIjc/Ii5URDIyOkYmUSguIyBXQSgoPC49QiUoIFtAOSkwPCIpKDApMTFdSik5PDIzUC00J0FYKwotTSNAKygmUjQzOEFWLCBUVCExMiY2JVFMPklAIiYjX1BAQCBIQiMyJC1HQEFEI1IoJENRWEkiWzQyR0FcNAotTSJaWC4+QUE2Jl84KFdBUzcmXzAgVyAnLSQyNDo6MFRfJz80LVMxITMkNjAnT1AhQCRPVDM6MD5DIUwoNgotTUsgSiIgPiA1RDIhUykrXDREUTFIJT00IThBX0shWExELUEzOiY0NCwvQENWJzU0N1MhWlAkTSRFV0I7MgotTSFMOCBNUFAuKEg8JThAOkAmRVQ0MTFITSE5JDknME5NJiksMVMwRikoK1wsSUEpSCkrVCs9QERPJTZAPAotTSNQR1AnUlw8T0EhJyFKWC5FUFomKEIkPjFATkkhISA+NUBLIyZGWDhOUi4nJVlcNVMhNV0mKiQmREI0IgotTSA8VC9FQSUqKEFYKiBAXUYpQTA7JlAiNiYtPD4gQFRTITMgP1AhPTQmTlAyXyBAWyMwKC4+IDJVICcsNgotTSQiISAjLlAhPUIsUyhDODNNQTBCJF4wNjBBSjomXzBFLzBQSSNOJC9IIS1EJy4sOkggNCIpODhEX1I5RgotTSlNJC1bUidfIjRAOlsxMUInJ1QsQ1BVJig2NClPQDhTI01QKypCLFslVSA+RlE6XSczTDtUMChAKFQgQAotTVNRVTYkPUwoK0BXMiFCRDtWQTpeIVxQJVJQOkQlOTwiLkAsNyJBKCwiISxHJEosPEYgOCkpLlg9PFEjSwotTSNRQEYyQUs4KDUgL0chTzUlRjBFOFAsNicyWEVQMCM7JyhMKEVQRCcoPVQ0RCFfIiU3RDhMQU8hIENMKwotTToiITEnIShGLzBdICRdKCpOQDgkKFVYIUJQVjAjLyQoWCE3QCFbMDRfQTMjJzNcLytSKzchNiwzIFI6VwotTSApXCZbUEcmJSlYP18wOzcgSEQyVlE4JCVSKD9FMVxKI1IwI04wITslKSQiMkIiUSEzLCwgMTUhIkYgIgotTV0gWkYkXEQtOiE3QSJWVDBZIFBFIUMgMEUiOVcmSDA1SiFJXCBWTCtHQDVfJFooKU0wWVwiKCw2VUE+OQotTSYmLEUkUSU5KDhIJF5RQE0oPiggKiEpQCVASEYwUCE4IzYkNz5CJT0lITw/KDIxNyZJLCo3MTI9ISwwKgotTSlAN0cgRkQ3NyIjViA6UClBUi4uJExUIiVAMj4oXihAOlI1KiZBLCQlUUo0IUkgKj5AUl0nVEA6PEFWQgotTSJaJDEvQjNUIDsoPTdQKUcoVlA0LkFbSyJGSC86ISxcJ0pcKEtSJVwlKygmJCIjJSQqXDxbQUM7Jz1YQAotTVNBX0AiITQiJlEuSSc7MCVHITI7ID4oMF9SLlUnU1w5NkA9ICNMUDM7ITAzJDA8OkVQM0IoKjQtJ1BZIQotTSZGKDtDMik1Iz5ILlQxIFIgI1A3O0FcSyg3XCI0ISdIJCBILTMhVyEmTiQqQjBRMCgyQDhOME9DJlNIRAotTSQgPT0jI0gyXlFATCNSVCQlICxWKDMoOSIgPiEmRSRCKVAmTyYwNDxLIU8hIS04OilSLiwkNyw0IiEkRwotTSQ7IDUnQDBIKC4wIlxAUF8gNjwiPkEwOicwXCcjUDFSJVM0IC0gODIoIThBLzBPQSNbTDA/QDEuIjs0LAotTU5AXEAnOCg6TyBRTyNEUDc/UEFGISlML11ATl4lQSAkK0FaPykrKCFIMSVcJVFILDQxXzcoQygxVUFSWgotTSItSCooUjcrKUdEKiAwXCMjTDwxMDAxIyZMUDwxUCwoKEc4OVFQPCQkVjA5WEA6TiROICZSMS1ZKT9QIQotTV0iKVgkUDgxUzBUPSJEPCc6QiczJVo8N0tQNTAjUkA3XDFBKyIsQC04UFtLKUZIIiQyJ1YkXFwyOjI3MgotTSZdICU+IDVJIl1ERFIhXDcgLkA7XEA0KCRcMDIzQUY2KTooM0AwUkwjKDQqOyEqQCdDMDNaUDZNKFEwIQotTSYwIjAlPVQvWEE5UiIqUCslQjk6IFhYLj8hNl0oMFxANDBKViNWSCEsIUQmISAwQ1xQQTwjRkwpOUA9OgotTSA6SCs6QD5BIzZMOUwgI1UmLTA2XFBFVik8KDhPMC5XICk4KDgxVFUlVFglQEBLKyAzLERbITpKJUYkJQotTS5QUloiIFxGXEFAQCFNSDJFMFNBIFw4QTdSKl4gJzQ4MTBDQiQtREIoUFU8IEssNzYxJjkiPkArTTBcSQotTSM/ICVZQTlAJkdUQ0lBWTchQ0RDLjFaWCFbQC5IQVpWJSlENEIwU0UoNjwqV1BFOyc9VCEuUURPJzA0KQotTUIgLk8jPlwnQVEoSShMXEMtQVAkIVxIOCMxIE8oQzQpXVBZICk9RDYtUUNTKShYLylAWFAjWSA8MTBHUwotTSk+MCNYMENGJUo8KC0gOzQnLURFUTFZTyddODhLUEJRKUhYRVZALVQiRzQuVyBNNyInXDUzIVJeKFAkPQotTSUwKCMpMiwrPFFPQyhWSCElIFkpJFYsJzxQP1wgRUw0ISFQJyZXPD4oISVBKUhENENBOzkoVSQuPjFBKgotTSNfUCRZUD83KTxYLiohMFwjPShCMFFfLiRdXEItMUpBIyBILk4xUSwkUSwyIlEhJyFKLENGUi8+ITQwKwotTTZBTS8lMDgtQTImVCZXMEQ7MFgjJyEwMSdSO04nRzggOjBOKyc3KCtBQF40KFs4OkIxMzwjPiwkNzExQgotTSYsVDs3QFspKTBARjtRKlsnMkBFVEFNPiNdSDAjQF9FISo4MFAgRV4oMDgsISA1UyY8KENSUVRXJ1gkMgotTURRLCogSDw4LiBTJiRJRCVTMio8JE9UKTZQNkgoKDwjIiI6SyglNEQhIFRWIk1YLCxRMSojSCgzQTA4IgotTSJDLENRQjE/KElEKUxRIVYiXzgzJCFaRihEMD9HIFlPJzc0Q0IwKjsnR1g2N1BDNSReKDU3Ui4jIzRYIQotTUlAXjomTzg0OyAzICFaVCE9UEslIF4wMC5QNTskXTA9XSAuTCIvPEInIi1DKEZAOFVASlEnXyw0WCElIgotTSZXLC4rUU85IU9UIDghUDghLVgjPlIoRCIyIDMyIEJFITg4PjwwT0EoIjw5QCFORiAyTDw/MDozKCEgPwotTUgwOiYmPyw8UUEwOik5VEZdIE5BKT0wJUkwRD4nNCgkNCFHNSZHSChVQCglJDsoMS5RXVQiVEw2RUBXXgotTSdHNCo2QU8oKSZQN08wMCwgLUQjVSE5WShXSCReUUlOIlpUODNQSFMiLyRHIlAgICZVXC5UQFZTKStEPAotTSBBXiEnNSQ1LTFeTCAjRDJUIUJEIFFMNC0iOScgQChATDFHLSIkVEEoQStXJUNcO1MgSkYmPDA1MjAvWgotTSchLEFVUUNPJTNINTggIU8hJlQ9LlAoXCJFKDxTQFk4JjsoJjAxLk4hWFw/SyFeUCAtTDQkMjo7IStAMQotTSlQLUgkWDRFTkFALCQjQCBdUU1OIUtALTpQWTUgV1AtICBdIilBOEVTUFBaISRAKilBXi0lQFBEKFEqVgotTSZaPDJWICNYJlUgICMxIk8gOCQqQEBMWydTLDlbMjBAJjssRkghIFMlMCAxWEFfSikiVDw4QjgrJTk4LAotTUpQM1cmKEAgQUBDViEpJDdPUClVIj5UIi5QMFIjXiw4MlE/XSNdTD47UUFdJDEoIV4gQFokJlAgIyAmLAotTSgmQDpQUTJTIVtQKEcxPzMnNjhBSjAzWycoQDBUQFAnJyE0PFJROzYhVVAkMzIgRSAkRDE2ICgzJUEkMwotTS9SLUcmOCQ4VCAyTyRPPCRPIjI1IVksMiVCIiIhLjBEJkBDWCYoNC1NIUxZKDxcNFZCKSwnJVwiNlIzWAotTScoIDVOUjtOI1YkOzgwKDEoNlQqUCE9RChVICc0ICg9KCY8MCwgRVIjQSwhIzIqOikpKCkyID06IC4kPQotTSYgRS0hWEwhSkBAKyMwRD8rMUEtKD1ENVhQQEUgSEw6UTA8JiVROEI3UFxQIVdUM1RRUiMiIjwxNDE3TQotTSA7NEJPMFROJTogP10gRU0jTVQyS0EzSyc9KCMwMCxcJC1YN00wPjcmUkQtIFI3VyEhXD8tMipSJ0tQLAotTTdQPjUlRSxEQkInJiY5REFQUEg1IypEOiIwXUAlQlQjIiIsISJCMCU/IiQgIzhIQE1BRCcpNDAuJiImRgotTSVYNCIvMC5VKC4gO1pSJk0iSCw5JzInUyc9KCMhICE5Ik4oPCAxSkcpMFg+P1A4MiE5NEA1QFlIJS5AMgotTSxCKjQoUzRDUlE3WCIzTEMoIVRYKFhMNS0xXi8hLSwkRjIjWSkuLEJCMDdWIFgsMjRBXCspN1ggVEFdXQotTSUvLEFOIic0I0xcO1dROVAjViw0MUErMygmLCVaUVsuIyJIOyogRyIlR1ggXTAxMCVZXCgiIFRTJ1M8OwotTTQxWEghTSgxNiFZWCMnSClUISMoIyAgQVVAPiknQCAvXCEuJyclNDosQCEhJ10gNU9QUFsjOlA/OCBSKgotTShBJEYhMCNWIzA8P1JQSCQiMCw0IkFYJSVfXCpAQS1DKFQwLz9SIyEmMzgrUyBcJCFWNCsyMTZFKDNAIQotTT1BWCkiITAwOVFHSCVXLDAwMVQjJS84Ll8xVFkkJUAvVlFILSJaODlLIVwmJk5QLCRCLlcjXTAjVyIsRAotTSc1MCk/QE9OJixUL0tBLTUmIUwqNiI7LSEgWCtZQitbI0pIMCZQUUcjVigqPkBbVykyRCRPMCYqIFBcMwotTVlBXUskVjgsLlE+IihcWDs9UU9DJThYMz0xMFsoOlgqUTIwTiNDLCs0US9FKSE4QyNQRSYkKTBCO0AgPwotTSZMLClFMVc2IEEgN0cwVyEkRFg1KVFIQSQvODIlMD4oIig4I1IgVDAnPjg3UiEyKykzTCgyQiI6JCRUIgotTVdSLyckOzQ9MTFJOSJETDhPQVtDJ05QKiMgJz4nV1wqPVEqSSEpIDUlMTYqIUdcKiRRRzchWlBBRDE1WgotTSVZMD0pUilPIStAM1MxMVIgRiRDIUEnKCEoNCgsUCBMIF5EREwyIF4gLDAlWzAhUSM+NDchQUg8JVgwKgotTTQgV00gSiA2UkIqLCMqVC8yISIyID4gLzkgWVQpI0gxMCBHXiROWDJXITc/KFhUOSRQNj8lIlA0OFBPUAotTSJDTDVBQVU5IjIsK0IhVVMiSkA6WCBBPCA5OCtWITMiIkIgOloxJioiS1BCSVBePCMoKDk9UEY8J088QAotTUEgQyInLFRFL0FXKic9RDM5MF4kJS9ELzAgQCUoQkBBTUAhXCE5PCY6UTNYJ0MoJlcwSFUnLzggWDIvJgotTSdCWCBRMEk4KTNMO0VARC4oUFAhTDAnKidMTEJAIElGIy8oP0ZRSTwlRDw0ISFUNydUQEQlMUhIJ0xAIAotTSciJzcgQFQrNkFVQSI4SDwzMVhaKE1YICEgO1AkJyQgOlIrKyVMNEA4UFswJl4wQVxBOUEhW1BAQzFDJwotTSRHRDMmUUc1IVUwO1QgTEkkNSQxNzEyOycgLCAsIjFJJ0owO1RQTEMnIERCNlI4MCk6PClMMEghJDJYQgotTVpBPVUjQSxFMFErUyYuUDhaITVGKFY4KFRBXj0kKSguJkFDQyEmIEM2MCZQKDgwRj0gJlskPzgzOzAtLQotTSVUODNRMVwsKTJAQ04yIyInIlAgP0A6KCEpQERBMShOJD9IIytBUDchXUAxOlE5USc2OCJBQT1PKU5MQQotTTlCOF8nRkghJTFHJic7ICNBMFQ4J1hILDUwWS0mNDgjQjBZKSQkVDJRIUg7KUgkMSAwMUMoJjQiRzFLPwotTSBFKCE4MDY0IzNMNihRXjUhKTwwRFAmKSYlWCFQMTxLI1QsJUQgUkQgLFQrU1FAOyArUD4qUi4nITRcJwotTThAO18oLCghTyAiQiI8VC5LMFQ6Ikw0IFlRSCgmUSQ5JkItISBaRCRFUVonJSEoNSkiLTooTURGSVAuVQotTSJHSCNDMjY2JSlcJyExUUokLCwuTSBXVykkKDkxME5EIypUMlxBSl8jRkg0SzE1RygqSCEiIiw3IksoJQotTVdRSj4hQTQqR1IwRSUnLERBUC9VKDs8PUJBUj4iQDQ0V1BVOCNSMCpPMTUoKUMgLVcgREknWVw1TTE9SgotTSBeRCBSMT4sJFI8NEYxLCsjM0xGP0E9ICgiXCIlISw8JDtQRi5QNS0iVzw9PSFRNiAyPCtTISBRKT1ULAotTVIhJScmOCA+RCIuNCgrXDlYMFE0JTMwP0ZQPSsmQUg7PkFWIiBXLDBMUCtbI19UIk0hV0EkOkwqJlIjWwotTSIhJDRKMjJJJiM4PEMhNCwkISQuSEBCRiQyVDEsQUEiJC9IIFFQL10pSkw0X1E9RihULDtMMFQqJSk4JgotTSAyNjYhViAlVUI0JSdVMC07QSgmJTA4RyAiIDgkNVgtWSBVUiE0SCxCQTpfJUpAOkNAVEYiWUAmT0FNSQotTSU/MDYtMVk5IVU4PTMhS1ojU1Q5I0E1RyJMICJRUC9MKEAwMFxCOV4oQ0AkIVBRLiBOPCNRUCpMJ1JYNQotTStBPyknR0QjXjBRViFKMDcnUTVLJjw8PlxARyIjK1gzIzBASCE1WC9NQV83IUokKUYhTTUnU1Q8JjEoVgotTSZZUDkvUFYuKD0wLD9RVCslNFQkLSAmQyJDTCU/QUYlKUs8NzsiOjUkVyg9XiA0OCBTODJSUVRSKTc8JQotTURCLkUpTiwlXTE7KiVESDc3QFZeJTJcODsgMEgiTiwiNzAvXSQ3ICZKMStGKThYIS9QRDMoLFAtVlAgVQotTSVaREY8USBOKTNcPz0wQk8lTzxAX0IgTCRaUD9SMi1RIjkgQSxBQyYmLEREI1EoPylPWCRQMTtCIVYwQwotTVBSLDUhMyw1RUIjTScrNENDIipVI01AQz5BPDIoQDxBLFE0NiIxVClQUDUuJTEwMVFBO04oMjA1TyIxLgotTSlEIDpAQDxMJkJYJkNSNyIgKDw8X0E3WiYpPD5FIU5IIzEkIE4wWVclXCgpT1IqTCUkIC5bQVVMKDcwKgotTT8wOTglOExGK1AkVCkqPEInMFAlJycwPEFAIEMpNlQzL1FURiROVC0gUThdJEZIQTJAQjAgXDA/ODBBQQotTSBNUDZIIi1KIFVAKiowKSEoNFw1RUE9LygsPCtdISNYIFU0LFtRTCYoKyg2R1FJQykiSCdLIFw2JylYKgotTVBQOEghSEwgPVAmIiJATD9fMFRKIEtULFQwKyYoSzQ3XlI7SShNSD9bQiJXJV9IRj1RK1YlSSRBOVFbWgotTScuRC1AMFEnIT4wNj4wWU4lVkQ0OyE1SCI9LDo6UiIvKFggMzxRXFMlSCArV1E6JiVOUCdDIFVLKCUoJgotTUBSIVEpPFg2OzExKSkmSEZWQEYhIFogLV9CI1UlIyQ9ODI6JClAVCMyICA6JywwKi8hUy0hJUg9TDFOKAotTSUqREFKIEwgKT48LiJQQCwkXVgqPDBXKiE0XCcxMSFcI0cwI0BQNSglOlwjXyE5XygyLCNYIiBaKSwsLAotTTshR0ogVUA4O0FAUiNUVEQ0Ii0rIjJQQ1VBWyAjMlhCQzBdJCMoSEAjQFxdISNMKUJBR0InNyglW1A/MgotTSUvXCROUSdVISAsQlQwTjolLDAnXVBbVCkzSEFYIDQqJiYsQFNBV1YgREBBOkI4ViRFJCkkQFxTJTwoKQotTUIwWEQiWyw9JzFVJSc2MENaMDxQKDcoO0tSKlAhSVBES0BBKCYqOCRIQFs4JDsgKkcwWiMkJVAjNCBcRQotTSBcVEFcICJLI0FIJyVBIiInXkAxJUAqICFHMENPMD5fJ0YgNjchXjUnPUgyPyElICYnSDQyIUU5JCM8NgotTTYwO1IiSTA4SUInWihMICc4IV9LI1ZYMkUhIyQhXTQxQVFMPCJdLEFaISJYJ15EPFoiJkcgVSAyM0EkMgotTSExTCZcIVJIJiQgNlkhREQgSzwpQyBJPyIxODAsITlNI1UgNlwxLVMnRUA1P1FQQyIuTD47ID9VKFpMKwotTTkiKDQkSShAPSBFOyZFLCFZMV4pJ0s0JElQLzUhXFgwTTBEIiU4NCsrMCpEJFpcMUhRS1QiIjQ8W1BOJAotTSRMSDwyUV5LJV5QLzxQVl0hICwlTlFeRiQhRC5KQjRGIlhQK1RQLlAoS0RAUSBDPShEVEJbMCdXIUMwPQotTSciOCMmWDRDP0IqXyAlSCwyITchITg8L0ciKkIkQiAtUzBYUiREWEMgMTM+KCQsQUciLVkpKUA+XVE/RQotTSc1NEJRUFJYJlYgLCZQVlQjLERFWzIyPSE1WEJcIFhXKDNEL1JAICwgQShELjErISBPRDMsMUcuJkUsNQotTVkxOCUgTFw7MiAxSiEjOEI3ISRbJyIwQVchMUkhQ1BCOCFeMyU/MCNDQV02KEMkNSlAUTspRDQpTyBAXQotTSkuIEYiMFkrIlhAI0QxIykjUFw6WlFLMyUxIEYnMjIxJC1ANSlQVy0lVkgiIDBSOCM5WCE2QSBWIkwgNwotTSFQUk8iLiw0JDE0UCZMOEZPQENBJzBIOV9QQz0pP0AvMlI4WSg5UC5VUT5RI144KEcgQUEkRyQ6NVIlNQotTSQ5QDFIIiVDKCA8QS5AUVAiUFRBQEE9Kyk5VCxdUDYjIFEgQ1IgXTUiJDRAJiFfPCUmWCNfMiQ0KU9MIAotTVFRP1QkPFAtLyElPyE9XENcUF5cJEFEMU4yOVYmXCAjUUI4WiI2KDhCIiMpIztILjZRLyogIlQ1OyFfWQotTSYuQDghUFpdJ1o0QEpRUTkiJzAtVyAyXyRDTCIrUCdfJURMNkZRViAmO1RCWVBCIyEkICheMD9RISZUIgotTS9CKyAjLCQqPjBVQCIiSD8pISY5ITRUO1EiJT8pMVAtXyAxPCUxQCBbIVU4JCg0QlVAMk4gQiA7KVA5NQotTSMtSEBVQT9XITdAIDNCLiYhMERGPjEiPiM+NCJOICdDJTFAKTdQSi8gOUQlW0AwMygzRCc1MT5MIzlMRAotTSBQLjIkNCAoQjFESCcuNCdYUSw5KFs8OkxAT1coKjAuWzFNWyFbMEA+IDc2JEo4RTAyKiUlQFQoUiIuMQotTSIwLEFFMiYsISo4Pl5CIF0oRzg6UTAhJSZUIDw7Iio6ISw0RiYxLzwkNjQmVEBIJCUrSCYrIjVBITlEOQotTSoiMiYhMiAgSFBITyZbMEM+USgwKCBMQlVRWSUjNyA6SVFARiFeXD0/ITZLJEFQM05BOV4nTywyK1AvUgotTSlQLCMhIVQmJy40QjswRT4oI0wpTiBISyAnOCUjQCNDKSogRldQXDwhIyw0T1FbRyQ2VEAoICQyIlU8RAotTS1AVD8iS0guNVBHJyc6PDovQSQlKFIsMyIwQ10hXUQ+NFEmQSRURC9GIDMhI0FYO1NBOEUlMCgkXDA1QwotTSZbWD5dMDRHIU5ALEhCKFUiMVwsKjA6WiZPICIsUVRFJC1EQ0NAMT0oWVhFUEFIXyE1RDFXMFcuIyEoLQotTUpBWjoiV1xBJEIzIyY2NEQoUEhMIFdQIVRBKFImOUQvOzAlWSJCSCEnICFDIkcsRFkwQi8lOSA1K1BQXgotTSZdTEFTMSwiIDFQNzhCMUEjPjQlIUA5IiElUCopITIhJkhcQVVQOC0nIyg/OzEzWCg6UCA1MiFRJ10gOQotTV8xLFEgUVA2KSAnNyhJND1WITRUIzBUMixBWEAlSkQtMzBZUyAsXDpJMFAxI1c8NycwNEonIlghTUFXIQotTSFATDEpUCJXJFY0NC0iK0UkSSAhV1I4JSBbOD5AQThRIz9UMDBAXzEjPzAvKyAyWyc8TDdUUSRaJzkwPgotTU8gI0UjN1AmQ1FFVCBQWEM6IS9JI11ANE8gJkggVFxAX1AyXiQ9LCJeUU9eKDNIJz4hKlwiTTwvIVAgQwotTSU1XCglMFclIy9EMjkyIVAiXDwuLDAwIykwLC9cMCAvKSssPTFRMk0hNkQiUFEmXyQ7NCAjUENKJVwgOQotTS4hWkMoREAoLiE7UiNFKC8hQUBCJzVUQy0wNCIlI0QuREEvLCJAKCRaQCQqJEIgRDogQkkhIzhAOlBRKwotTSU0MChUQT8+JT4sMl0hIkwoK0glNCFZNiNPSCskME42ID8oJyVBMywoNTwvQCEqTiVZODRZITQiKC08OwotTTcgXT4lT1g5OzElXCI9OCNLQCYjJ0xAIS1AQjIgUTRFLSBeOiY2KDIxIEIyJlc0JU9RWC4oX1gzPzAsRwotTSlOOCtCUDYgKT4kREYwXysgSyhAXjBTOCgvNCU4IS1YITBMQjoiJikpRCBBRVFcUSJULEE5UjYgKDowPwotTVQxXj0lLzA9RzFKSSBXUENSMVJZJSosOyxBKj8kQ0RBTzIkXygpXEVCUFMsKFdEMFkwUFgnJCBDLUI5RAotTSZaTChGIFUuJFcgLi9BKiAkXlAkW1FbTyE1QCA0UVNFJ1UsIjxAMj0oNkhGIkIzISVIOEYvIUsqJlBUOQotTVgyOFclTlA5XlBeLyg4OClYIi5dICtIPyogJEckI1gwI0BbJyEoLCdPUSAhIkY8LjQxLlkoJzgpLjE6MgotTShSNCVMQEYlI1VIJUxQUlooTSw2PDIsUyEjQEIzQE0wJFBULVBBUygnV0xESlEsJyM1RENHQUAlJTxIKwotTStQJSUkNlQ+NUBYQyZMSDpQMC9ZKVA0PSZAOUMlRlQ3R0FfOSFKRDxKMDRfJDlQKz8gQiEoJiwuNSBeNAotTScjWEYjMjBcIT0wQzkhOychV0wwWFBTXyUiMD1UQThDICVUJjNRT0ogOCAlPlFUOiBIQCFDMFRUKCNAJQotTVQiIlsiKzRDXFAnQShcJEAsMCshKTNUPTQwTycoVlggPzEnWyguRDQiUipPIlE8MCshP1AlQ0AmJFBKLAotTSVfQEVaIiBeJEQ4I1UwJCgpK0Q8NVBXMidbMCklICQ4JlZQMCNRMlIpJiwsNFBeTCgxUCo7IE4vIEFcPwotTTgwNU0jQEA2XjBeIiFTNCQwUDAoJTgkREQhTjQgSUw5OEI8IiVYUDdKUEZZJi5AOjxSJickJ0QvQkFGKQotTSI8UEQjIjlGIlc0KUZSI0shSkhDKFE3XiRORDQ3UUNYJiw4NkJBLiYpITw4NyItJCVIWDdYQFFYJT80KgotTT1AQyojUkQqIVIuRCk2NCZDIEQoITVAOy0gUkIkJixGIyEvJykmJEA6UClDJEMkOSEgNF8nTFxCPUIgJQotTSVHKD4/ITU3IV8kLCdBPk8iLkA5WzAwOyI6SDJNIENPJ1AkRjVAVksnKFQmOTFQOSZPUDUyUFJZIlc8LgotTUYwUiYoNURGQDBNSyBJTCRQQFEmKSdANzIiLEMnNjwoIDFVQighXDZZQDMmKTFAKEEgXDooMCA6IEIzRwotTSBTLEVDMTcmKSY0JyJAUFsiXThCLlBfSCNeUD1LQic7I1YkJj8hLk4gK0w1ViAtKCgvXEZbUSg7KSE0PQotTUtCOVgiRVQrWjBaRiVELCFdMFg0IjlAQVNCM1MjSjgqSzFQViVPTDROQTBXKEE8KUBBKFooTFg+LSBGUwotTSEmQEBYIiE0JFNANDtAKzwgMEAyI0EqKCQ/XCZZMVBSJilUNEkhOzcpJFhGOFFPUCUlUD8qUVZfIDVIRAotTVVSMk4mS1gxXCBeMyhTKDdWMU1JIjA0JkEiKDwnTyAzLFAiXSQmMCooIUU9Ji9UPStCI1cgPzA8KiEvQgotTSdIRC00QDA/Iy1UQCNRTTgjVEAiPFAnMSVRJDkyQEhEIj5YIyJAJEwlTzwhSCElQCAtJDgkQV1fI0pMPAotTSYhOi8jOywpViI5TidPPCE1UVRLJ1VALyIgPTslIzg2LCIrIydCPDIiUTVbJklIOjEhTzMmKSgmUyIlSgotTSUlPCZSMCtVKEFQJilAOzEhLjAgOlEvIyBPPDkzUEcrKTg8OD5RSUspMFQnJkA6NCgqQDhHIScpJ0hYKgotTSkwPF4hWzwwQ0FSMigiIDosMiAnJEc8PihQTEcmQDAmUlBVLiY4PCAqUDM6IDJAPjIwPzklKkwjLTAgMgotTSE0MDosITFKIDs0LEUwPkokOyAnMEAkPCZcKCIsIEQ8IDogOUhBREMiR0wzT1A3LSM7SEVGUDJfJiNUJQotTVExRjskRFwsTkBaQylFSEYoQD8iJyVMICcgRl0pSFhDNyA6WCg8NCciITMvJzU8IkRASF0mVUg/XTIqQgotTSEkIDVDUCMxIUxQPjwwTyYhKTw0NFBeVyY5SChXQTEvIFVIJDNQMjcpQkQjMDBNRSZVXCo0UEsvKCIoLwotTVoxQSolW0gkTVFMRSNbJDlbITg3J1ogQzdQR0goXihCQlA1MyUmMCxaUEYoJVdERUUhPkIhJUwyMSBbLwotTSBdJEZNMVMjKE1cODwgIF4gQlw0VDFBRSVDUDVDUEVOJSxQQTNBQE4pL0gvJ1FEPiU8KEExQFAkJDswQQotTTkgMikjVFBFKVAlRCE9LCc1MTBfJVs0MydCMl0jR0w5IFIqNyVcVDklQjdIKD88LUlATTkhXDAuI1AuUQotTSBHTDI0UFFPIl0gRU9ALSMmUFQrUFBdJCFeJDRHUiBAJCAgRiJALiUhMkAoPUAzTylCVCY1QTdKJVIwMwotTStRV08lPkgiIyFIIiU0JCBMUCtNJCZML0kxOEMpJ0QgKDIhWSAwOCktUjY3KDVQPlUyJzcmWDxCNEEnJgotTSNFWC09UDYgJykoQDcwUV8hUkw2OjFWJCcnWEFfUV8gKFYkQFRRIDsmQlA6N1A3KykuRCFWMSI0KExMOAotTVVRNlohWzgrWkIjXihNNCBeUUc2J01UJFZSNkMjJlRBSVEyICUhMERBQTA2ICRQOVoxXTYkR0gnP0FHLwotTSdRMD4gMV4tISVQISNRNycjUjghXSBGSCZVRDZaQVExIVA0RixRPyMmUUg4OSE+OSVFVDFcIjkwIDVIPQotTTZCJickLjQxITBDXyc4JCgiMVshIE1MLixBLScmPTAjWDAlNSNePENYMjo8JERYJ0EgJ0ciJEgtV1FfPQotTSQqNDZLIixPI1lcO0RATVEjTjQ4PkIwQCNJMD4qIE1UJE5YQywxNikgOCg2WkFIVSEqLCtfMTxbIF8kJgotTUIxMDkgXiAoQCAjWCE/ICc4UCRdJCRMIl0yJDYgSFA7SlIiMiY1VDBUUiIzITxUQDRCNC4lMUg/IFAiRQotTSZcREVLQE1PJiE0NzBSNjQoXiwxJTFKVyE+KDk2IiBFJFAkOjcxNEsgX1A7NyIsLCMqWDxbIC5HIlFIJwotTTAiMzkiISw4U0IxMCA+UEQ+IV1EJzIgMzpAVEomRUBEMlA0WyJcXEUsIUw6ID5MPSciIkcpKDQ6XSIuRQotTSQoSDBFMSw2KCc8KCQyL0UoT0AhK1E9JicmSDdSIEQpJDpcPj5QQV0jK0xARCFaMiJGVCE7UDBAJCpYNgotTSciNzskUiQvJzFcSCAiRCQ1UEs9JlskMiAyJywgKjA/IiItJyFBLDU8UFghIls8LyMiI0QnRVAjUjFeWAotTSReWDEtQDFQITlUK1AgQUUgRTw7SEI6RCU8TEYjUTsrKEtMM0NBNyIiLCwhQCFHMSEmVDw7UisoIlJcKwotTV5APz4oQlAxOzBJOiFUSCEoIU02JThQLy4wMi4pRDRBNFIgWidJPC48IC1GJlZcIUExViYhXFxAMEA/XgotTSc1RCpeUiBOISk0NCIgIVokRCw8MTFfViktSCxKIiA8JzdIQElCOCIpPyhCM0BOUCgoMEMsMjdeJlYgRwotTSMxOD0hXyQkSiArWSNbND5MMiwkJilQLCFBKDcjUlRCPzE0RCg1NDMzUjslID88MilAJEgoOjwnJUBMSAotTSczLDdVQitVIDooRTEgRlAiJSQ8XUI6SyQzXCk9IEUmKD9EQSAiIyUmXCwkWTAzPCVTPD4xUTwvIV40JQotTVBBVzInKDQiU0BRUShCNCpQMEg9Jlw8OipQSSIiMTguKyI1LylMLCgtISM5JzUwRlQwLTkhKUwnL1ApVQotTSFRQDNFUSdXIkhcKS8hMD0iNyA9SSIjXilIQEYkUC00IVo4OF1CL1sgRjQvRiBLUCAkXDpVQTpXJ0hUQgotTScyOlkkQlwtOUE5XSBdSEFLMVNOKDs0PVoyLzgpOiAmTzA1OyIwVD9SIE9JJlFEMjMiOCUhSlg2STEwWgotTSMsNCBPMEBPIzA8Mz0xNDQkMiQyVDA2XSIvJC9eUEomJ0ZYP14gWTMkVlw6WUIwUCBMWEFWMCYkIExAKAotTVRQPTIiXTw2IyI2XCg+TEEqIS80KTpMRScwPUAkXUQmPFEnXCQxOD9MIEVOJj0wRlIxQUElPVAkOiBAVwotTSQhKDslQFgyIVFcKEdRNjoiWjAqOEE4ISZBKD44IS9NKDUoJ0NRWSAhOSBAJyFfICRULCUyUVpFJiFIRgotTUJRRlgmUTw6QlEwSyc9VD5OUSNZIDVAJCBASFciRCQ/VTEuWiZJTDxAUiw7Jy1IQToxVV0iVjgyQyAuVgotTSguKCk1MVVCIi00IF9SK04nRTw3PlAsVChPNDVDMCdKJS9UIyMyOk0mIiQtO1EpPyFOJDQgMVVOJylcMgotTScxKlMkLUQsJjBSIiFESCpTIFpGJDJIQCMwPishIzQ0J1AyOyQ8NDRHUiUqJEY8LFxRKEIlVFA7JyFNJwotTSZQMDNTIjI3ISgwRVlBRzAgSVggUFAzPyA0QDwlIF5CJUxINE5QKkwoUCgqUkFaViRYXEVVUjsrJ1IwOAotTVAxIiElPywzOSIlNSYmQDwkMSM4JidENlxBQyQkWUg5XyIkKiVPICMgQChKITE4L1ZCIFgkMDgyKyE+KAotTSBXSDMiUEoxJT0gPTxALzAlPCwhOiA8PCM1MDdFQUJLKSYsOUgxIUUkRShEU0I4OCNJNDwhIjU0Il4oMgotTSlRMzomNkQ0IDBCSyY/IEA0MDBWKEdMKCpQKU8mTDQ3WTI1JigzQDcsMEA2KEw4L1ZSJTsoOyA/SzEnTgotTSFFUDg/IjNVJl9URSRQXyEkJ1BAWkAmLCJHPCcuUiZUI1QkJDRBLiIiLjQ6PDElNCM7KDQ4Qio7JzAwOwotTVVBIUEmO1AlXEFIIiInPDFNMEkoKCIoIVUhMFcoLURDMCI1PCFUPDFGIi8+Iik0QVQyJTEhQEgwSiIsVgotTSZKQCA6QTNNKCE0QyBQVCwgR1gmPiI7QCQ7VCQoQilBKUFcKEtATUghTDw2XkAlISFEKCpBUihcIjRcRAotTUMxRDAmPDgrMUEiISNQIClKMEE8Il84PyhBXikpLjQoMCIrNSJCMCBKUTczIEBQQCdBP1sjUzxGKVBGJgotTSI3OCdVMTYhJFUsMjtBMk4iPjw/KyAuVyhRQCU/UDZAIz04KDVAU1UkSiggQCIkIiFZTCVNIFVAJUAkKgotTSVAKikgQDxAI1E/SSVfTEZJQjtcIUpYRioxMUkgMVA+JVBJICgmTEJaUFgsJkAgKz4hKkIgKSwqTFA+NAotTShKLDI1QjROIFYsK18yMlspKDApTkAyMSgzUCM1MV1SICgsLlYwTzQmNkg1MiBDNChMWDcnUCo+IStAJAotTVBAI0QlXUgpXUI2SiYmVCUkQUxBKUZcPVkwXi0oVDAxXTEpIyRRWEQrIUhMKFQkNy4hJl0lIygvLCA/SgotTSFGXEBZISFXIkVMJTZBOk0nPzBFSjIhRCRHJDQ7UiIgICAsQF8gQFYhQlQrXTAwKiU1SCNDQjdVKUdQOgotTTtQJF0iUEgzL0I2QyE3OERSIDFTJkNEJDIiMiEmRSQiKSFPNCQzLClBUilGKSk0M0cyNFgpOFQ4KTEoOQotTSk4SCouMjlEIydMLFpCMDQhRygkM1E5JSIlLCs/MTYlJTswJy8wMz8iWjw0IjIqJSJDXEY/MV5XJUkoRgotTSBRL1ImS0g/LlAkTSZKMCgvQVMtKDVMLiNRSyAlS1Q0UEBPXSlBRDQpUiY4J0MkNywgLjwjJUAzOzBcKQotTSRYWC1LQjUvJS1UJjAwMSQgOyQmKSE8WiVZOC1WMTMqIjZMRkgxVzkoTDA4LCI6IiEhLDJSUFNMJ0YsKQotTVwxXDsmOVggMkIsOyVFSDNIQE0hJEZcM1ciMFolNyQlLEA6NikvMDE1MiNeIiFMMk4hQSspPTQiOSE5UwotTSQ4SC82UTkpIz9cMklRNSkhSVw5KlIiOCgzVENeMUVHIlk0OytQSkYhRVAhKiBGLyE5WCc+QTQqKCpIMAotTS0hLVMpK0BAV0IxNCgqKD06Ujs+JSA0QkQwTVshUzw/JkAxRCBVLCs/UjowJUE8IycxJygnRiQ+KlIkPAotTSUuKCNUMFhcKFogPFEhK0MoPVRDUTI3KCdISEFTQi1MJzNIJjpBRlInU1gnOkIzPiBfPEA+UU88IU4wQAotTSJBN1YhOzBCMCBWISAmXEI2MUtYKDwkJE8hSEMlPDwqWSFaJyBIOCtWQFE/IUA0LidAIkImVlwsRDImQgotTSRDVCE2QjgzJCIgPFxQIFUhUzApRUE2KCQxRDVLMi9NIlpQNkohUF4mJ1hGR1ElNyEjJCpEMjdAJEI4OwotTVBSMEIkTDhFP0FGUSExWEQ+UiNCKDQ8NycwRFYhJDRHITFdJCMyUDdeISNBJEMkNzwhOF0iOVgvJCBfWQotTSI9SDggIiErIzMgRlBSMVAlPFgqTSIjTSJePCFfUjEkJiY4Ni1BTz8kVyAkRVEgOChcNEEzMU9WJCE8QAotTUowPDIkPTgiRkFBQSNTQDI/MFlQKThINF0yOVwoQ1wlJTE7Tyg1TCJKQS4iISNYPkEwLTMlVUwqNiBRIgotTSlQTDFbUCQnJScwQiwxUyQjWVwhUzBIOSZcMCEsQTBAIks0JlZBJl8pJEAmQiBAKiYkVDJMMDslIFhUNwotTVEhUEgnPCQiSDBPVCg9NDEwMEJZKCk4RThRRFwmTkQqREBdOSUiXCNRUUxWKUtQOUpRQSYmICRDXCAvUgotTSIpOEM9UEwlJlhEOl4yIEsmM1QzNjInKSBYRCFFUjdPIjEsKjpAQEshICQ1I1AzOSZFJEQoIjEyKDAoRAotTTlQNlYoW1gmMVEhKiY4VD45MDZbKC4wNSAgIyImP0w8XVAoISM/SCsyMUpTJEpAL10wKDonXUwsPkIzWwotTSIjREEuMVMpJEtEMD4yN1YoS0wuKkA7SyhBJCA9ITZEJylYLzNBS04nVFAwNSFPQiUnMDRNUEhKIz5QQwotTStROD4kR0Q7LjEmLSRUJCVXQTtBKD5cIDgwXSgkOjxAJiE1WiQnOD8/UDsyKDkgRVlCLFkhP0wkUVEiNwotTSBTMDA+QDJCI0AsRl0wOyYhMSRANFA/SClMIDdNUTw0JCxIIz9QXF4iQ0wnXVIlTyI5WCEzIV8hIkhAOwotTV0hLjElRVgxI0IpLCJFWCpIUSwnIC8wI11SPCMhTzQwKiAgISAgICAgICAhICU4IF9QJ1wgVFgkXSA7TgotTSIzVCtYIFs3JEIoNVBBRlYnP1hCRlAgICAgICAhICAhICBIIDkgL0ggICAgICAgISAgKCAgUCAkICAgIAotTSAgICAgICAgICAgICAhICAgMCAiICAwICIgIDAgIiAgMCAiICAwICIgIDAgIiAgMCAiICAmLyAgIDBLMAotTSAgLCAgICAgICAkICBAICMgIDAgITAgJiAgPCAiICApICBIICJQICwgIFQgI0AgMCAhKCAgICE6ICAkRwotTSQuJCAhPzQwIC0yRSAuQU9QODtSICItQyQlWE06XDwgITokIFMuVDtTTS8iJCAgIjgzWEVTRVhAM15eIQotTUE6USE2UlVNIS5aPyQrLSshUTVbUjk/LiAsIUEgK0dVT1pNPEkvJyM4UkQgJzEgICAxVEQkLi1fV1UqNgotTTxXT1EgIDFfMDskS0VHIjVVQFkjQzA2Tyo9TDBMUUoyIiBZNCwgVjU/NDw0JktIQSAkRC08XTMnQi9XXwotTTpCMjQjUFFYISEwMCApIzlFJjUiKy09QjEwJjooQjg3M1I8IEdRXCFPVktNOSZYWEVeVzpJX0dUWjNdLwotTSBQIDglUSBBNlJdVUNbRkpIMyo+WylVMyRYQydNOFggIF4kIF1DMy85QyctMU9ZNVo7UikuREtKJzBeXgotTUQuMDAgJyY1ST8lVz0yRVlaJjZUSlA9RCU7NDFGPFJHJUFPLlAyPUQ4Wig4Uk5eRD5SNy1UPl1QOl1cXgotTSdZV0ogVV0zJC0nLFtCKUFUX0goPj4jJlZCOUdWV0ZLOThYOlFQQCBAWiQgLzZQUChWOiZZVldEKUs4WAotTS08PEw7I0stXDw+XitBTi4gITAwICYtMTgoXzlOIiVUK1sgLjQsRF4wTzNORVc5SCI8MVdZMSVUICAuLgotTUA+JDdMQ09EPi0gOickOCgjV0dVXSo9QllYSTE4TFc1Qlc/OUNRIkgrRCwoSksoOj8oWEFTRCNTQkxYKwotTUEsMCspV1NLRSwuTSkxKSk4MCI6TSgoSVRVSkVSXlQ6TjpdPiYrKzkxWyJXTElVQyUjXiwgVVdbIExIMAotTSAiOC0+Mk9fPyZHT1guUUgnOjc1Mk5NRjJKMDAhUz9UXSNBJixAVCBdUCFNN0QkRT9OWF0rTkwyWkBcQgotTVgjLjRfOzguUClPTT4nUTk0XCBEOUtAM0g/NCAkLEwwRiQkVEIuICpWXEBDIExJX18wNjlGXClXLy4tWAotTVMoW1lXMj1LTzhZRkI7OCAgQiQgQkBQN05YWkQ1Sl4/SjA5J0xDOT0yVV9AQC1SSiJPI15WNCJIQ0gjMAotTTpRSUMoUSAgPjxELVAuRz8qOy8mUkRXLDdFNTxYMlBcSCYkWjI9TzI+LDUsIU06WE5UPjdBUFxAL0AkTgotTUU5RCkgXVxYXzBcNVkiXEM9LzdMVFxfPCIsMCRMLUpcUzdcOUlDLEYgXkQ/IERYJyQqNyZdSk0uMjFNRwotTSswKU4vMDgxNiJHSz1BQzFfPS1BQiIrLFc1XFtFLlosNCtQSjxAITpYMCInPFkjWyozLVM4QikuLTpYKAotTVhMKV1PTS4nXzA3WV1TTS9INTBfOVA9JVVdMEYkNyciJkAgLSQgID5BNiU7O0RcSjoxQVtYQVAkNCMwSwotTStdVEdbRi0wPDlGRlI+RDZDREhOKiE8KDtGXDoyMUVOICAoTVA/PThfLEpWOSRMSDo3UjdALSE4TCw3KAotTSs2TDc9Wzw8WTAzMzNDJDAtSl4rVFcvNDo1U0I0QCUjJC4xW04lVyhUTjk0QVM8KCYoMj4rUUlYUjUjWwotTTssPyNFJzo4NkxRKTNCQElVT0VFVFVSKTUzUCxAWiQgI05PM0s6PSEzXjNXRTNYQTcxU1tXIypfN1FYSQotTVJdNzlLVT8yVigyWlMrXURMKitdTVFGJVdMSFEgPkAwIC0xIUYhOVs3LS8lLiggLlVRXFszXzVLN0hOPgotTUYjLVJcJTwxLCQnIVMvRFAuQ1cqKzVFTjJdIE4/OTU6ICRITUA/TyNULzEyKEJBME1QX1JcVTwzJSEvPAotTTBFVV1VQ0Q5Rj9BOS4hUCBEQTM2QUstV043SkVfRiQyTVYlSiAgTV8kJ0BBODpJUCBMJihQITkwJ0dNIgotTSxXRzUsIDFLKC0wKTAhQVhaWjUvS149VkxVVl8nPV40T1w4UzAjXVtPKFQgIDYkIEcnLDJdJVQnWDk9WAotTVlbJE9TRUZZN0pLOk0jPTlbJUQiVC5HQSJcP0Q/OEIkKDdATkhGRSg/MSUjTygpLT9ULzUkICE6XzcsPwotTVklMEhIPic8M0YqL0YwPTxfXkZeQDpYX1pdQjspLVYwNyk6TyAlUFdGMERXWUpOODUjXjhQRFZTTyIsKgotTTYzVSFeLShCVCMvR0lfL1ZFRTIlQ1pFXktbODxGQCcgJUUoXFgqUyUrT1hAL1IvXUhJXllaQD9XJ0I7WgotTS1XXEMiVSUlIDkyWyQpMVggTz1UUChQOzcwIlBcLDlVSj1OWSUuKzk8TV1FI1RNLD1SQ0AlRldWRDwpMQotTTBcRy8pWTZLNT07QllCPjxKKyZGICNUQSAqUCtZUT4sPF8iIFk2Ik0sJTUvJi9CVypVQy0yOFZLPVVASwotTUU/VU1DR04xTk49PzszKTYyUU5ONk85JD0jRiVHR1EnOj5MICIxICA8S0QsTCZdU0c2WDpMRDggPiVVRAotTUEgLV9YXCxBNy4uSSo9R1gxKSciWCw/UjJKWTQzPl82N0o8NVZNSDgoV1Y8Sj0tXklGXlkgICU9IDpSIQotTT9BXklYPiRFOSEqWz9HOj1IJDtRTiNSIF9KPy8zLjpCVCAlU0s4U0xVQ0FCQjwvJFEwN10nT0I0SDZbNQotTTZEWSkvPixYJy88MD80IlUwT0EuU1NMQT5PREU8Nk8gPjNPVDsuKURKWl47LVwlKjA7Ni1VJjghICJBIAotTSlURFErWCdQLl1fXlNCMSEpIVlfKExcUSIoX0EgK0ZSPTNSIkIhOjNTM1xaOlhGVEFdWChHRDUmOiRWRgotTSMvVztEWSc/KS5QMywmQSQpWUZUMD5aVkA8SyM2ICkxXD1FSCk6KV09RyYtIDRYMCAtTVVFITdSOF4oOgotTTwmJDMgMSBKOS4uUEZfXlAyRiUkSkUwJj1MUiRRLEBcIEg0WlRRJkY+JTA5J1dUKVsxI0M/N0wgKjRTNwotTSdKO1QiIywgLFhTIUU8UTFSI1I8W1khSC02TiZZOj5WJS43UkUhLFteMzM6QzkoWjgrUCJCPVcyREZVOQotTTRfJT0zIy1FNSExRl8tKlYuWDAqKztQMzg6Ryk8ICAnLFEiJi5KTTtGQ0tSL1tLPSxEOztWKSEqNi5BKQotTTFMNEhDLDg/LCVOOiVQQUVAJ1BJQSskJk9XNi9JWFE1JV4iNF0xO1Q5SDtESVtXVjBLN0YsIlAgIDokIAotTTA2SkcqWS8lVSdBXVFOS0NLMk1MKl9SJDJfIVVLQTFVNidMVDhLOVpWWCwxIyU0IkYyXEJdXVpQWyAiQgotTS5cVkRdPDUvQkVNRUJbQi1cXSohK0ZEMCAlNFEiOk04VEo4LClMTTY4OC4nOkFTVFA3NidaJzhMMSQ/LwotTTA6ICVHTEQoIUNaQE5MQ0hZXF8gNT4nWjErK08gN1pQKSIgRTxdJVJeOCdETiA2TiFRNyxAOzJPQylFIgotTTM3LCYsT082R09HMVBUIC5SKS0vMFtALEw4M1U9Pi8pNl8yLDhJL18hQjI3JlpdMl44TjsoOE8/PiM1NAotTVg7LVpVRVwlPjkrX1FKNE0gMTFPJCEsRC0iK1UxIjFdP0NWI0lZMy8mQVoiMlQgUTY/Syw5OjBfIVdGJAotTUs7TVlMWCNJOkclOTo4NEJSNi05Nk9VJEdELTk6JS1JVCw4Llk5XFhbJTM3LUcwICpGJCBPUylTIltAVAotTT4jUFQ4O1pTWkA5KkUpNkxDPyZfOlM8Kl8iI19HWjtTLkxbNEZdQCNSIldMRl1OSVI9WSleJkciU1BAVAotTT1FU0tEUDZRKio3KSVRXEAsRyNPICA4MCApX01eTVIgUzwvOydWQFgrSj1ZNi82Oig6U0Y2NUAzVTpJRgotTTY2QjssMkE5W1pENUgnWyZBM049SkklREFEVFU6M0JDOC8+Q0wwJV0wLlw2RiQwXEkqPVxWP047JyQlKgotTSlWWDdLRT9MOEhGSltSK1tXOzpCW14wN1g7V1IsVjooQCM+VCsjWl9OLVoxJjpRRCItM1Q6RFhVX1ZILgotTTlVOlklJCM7LlxJWCpJTUg6UyslVj82Tzo7UEY5KkwwRVtdTVAjPFxTS0pETDM0QUM0VF5DTTg+WjpLIAotTVEtVTsjXT9cJSNZPyJEID00PyJWPyZKKkBaPT4yMkMrJzleLkswMiZbOFIlXDteQFU2QzY/LkxCKCY0XQotTUxGKCVWUiQgS1BIUylaQV8yQFVBRlcoUUVeTkA7X1VLSDRMK1ldIDpYIzsvSkg1Rjs4ME1ILEc5JDVKUAotTSstVCJRIERHXjtHPkEpQkQtQV9GMkYmRSxTX0pKWlw1I1owJShZKzVaICNEJCAhW0ozWEVaK1pVQTwnXAotTUovMT0nIDw+LyJOSDZQQCxeNyU9KCArNiAhIChGVEpWTFg7SjsrRUUuMCchMjhRWT0/Ri1XKSY7KDZZUQotTVtCLilPPTVNTCswQiFIOjApW09NWk4sIChHUCFGIlonNltbM0dXKzhWMl4nJEE1MFFGTz47RyMvMk1ALwotTVU5NVE7QjpSOUsiTVFDOEQnMTczNkNRIjUgWUNfVy8gUyU3TyVWN1kqLyk1Tyw/V0AtU01XLzFOW1xZPwotTVclL1cgIDdHJCk/Kzo+QEZVVyheTS4ySkFFTjAuMio8LFA9VTJXS0lEMlUnXjc+OjtEI0clQE9YUSBSMgotTVwhI1I3VlAxKTwuKzBMR1lEOVVTIldSTyE/XE1BOyEjPTZETSpYMExJRT9PJC0gP1gwIixcMFZJL0lGOwotTVMxTk4rP0sjITxYOEQuPUIpNFsjTlkzKSRbXThDTyE3ICE+NzpZVE0lNytLUFklXSJSJk1RXi5DU1IuQQotTVxeQiU/NE9WJyNJIChHIVU8OUtdSStKOj5GJz86QV8hJCAiSDk6XDEuSjQhNzUyRl49R1o0Wj0hN04rOwotTTsrIEk0NDIyU1dQTkcjKiVTWD5WSiZENE5QKjE4OUY7QVhDRCYlL0Q8LUguRl5eKCFUVl5JMzxUO04wOQotTUgsQ0dFNDkzQjhETzMoNEchLUNLUDonIVogOSlQSTI1TjdJUDNYJSI9OjRZLkYsK0JSJyI1TU0mPSErXQotTVE0RypGRDdCOEQsWTovMTg1JidbL1EtOk1ONlsyMzZJLl4qQVAkUEIlMUIwSVRZJFYiViZARE49TyRKRwotTTI9JCBPMiwwSVBGIyNEVichWSUkMyJIXSxULjEiN04zWUZPKCslMjo/IDxART8kJkI1QFJEQk5KITFPJQotTUBGJSM6QktFKFZbX1lIPyk3OU87Uk4qWzUnJkc/Qy06R1RcJzMuJjhISS5BLFglXz0uKDMgIVJBIC0zSQotTTslUV07WU9EVj4/WS5WXkE9VihUNDw6KzY+Qz4qXVk4U1NTXzYiKSY/ITZINVc1OSlOPUc0UT1XTVYvSwotTVlAST9YX1RZOjMvSEgjNkghO0YnXUMkLzBSJD8wXU84Nk82NkpRTDlIRkBfICAwMCAuOEFaQ1MwPihVQwotTVlTRlFbWjw3PTJCTjFZVkslLE1dOiZdRi46VV0nXzU2XjhLOTdPWF9MNTxAJ1pAVENMM0Q2VCtOUyY2WAotTTY5XSInQ007UEQsM11FXS5QLFUkR1tVJV5FMUNdIkVCLlIjOUsiQUtAPks9PFNUKl9TQENKU0AtRUgvXwotTVFVICIxVSZfTDpSM0BAOy9EW1YiPVwwLyM/Lj4mV1RbVT9dVClOJ0ouJ0IzTiMuJixcID4wP0NdM0tQRAotTSwuREw0OTxcMS44QkM/XUVXOFlQMT8kS0M9XiMmRDE/JCZEV0hKOjpBPUM9MSEjLUAhTCJOMjAzVjM1KQotTTZTREEvIFFSIV1JPl5ZVzggQUggVD5DMDMgTE0hXTk5XD9BLCc7Q0pAXVMyXTFdTU07Wj8gVFElL0AwTAotTUxZRTJXIFQ+PkA6KypcUF4/Ly81KEVIJCBGJCAgTyYkO0AwQTQmMzIlVilCJzdMMjdWQzA9ST1KTDQ2SwotTSpDKlVBQldCVF9YT00+MUIvMV4xLU5UKl5WWCgtJSZcMCNXPV1ZOU5MQCEySlgjSzdZLidYUUZGJj8rMwotTS05XFNGRTsxT10pTk49QCBVKS0+IClQMCAvMz0iNSk9MTQrQUtLMFQrSi5TSFZcX1M3SU5NIkFXXVRPIQotTVItIUdUT0NAS0pAWzlaVyk1Sy1MUilUK0U5VyEgJU0oQkNVKk9DO1Q0TUdIMzcnOyg8N1knKCQpMkQ3OAotTTpNPkozJ1AoWDo2PD05TiggLjBcICE/WzAzQVw2K1IjMlYlVDdYQigpQ0NKNCwhUkcmVE4uXlRVN0RCLwotTUY8Ml1VWkFZQEE6JEgsSlQ0O0ouMjVTJilNMylcX1JdTE8+RklUM1IzJzI+KEMiT1ZOPjVEQ0wgTV82IQotTUk8UkhYK0w/JkBfVUQ/KVxAKjUjICAuOyQpKDYuJVpPLk09KE9VWTpcVEVGNSpfWiROOTxaR0JRISVINAotTUBVKlVZQS4nRTE2XVYyTVxEKFgwIiBQNlFWQkonKzZAXVAjVk9EOi0/PDQ7UkxQMVlNVlhBTDsyVlUhOQotTTg3OShJXkgpWkU8L19YXT4xKVBPQ0Y8QSApLClbQksyLjg8XDorRzE4UlkgX1ItTCJYX0gkSjswIVxBIgotTVAtWVw6PjRRQVRIIzNbQlhMOCkuQ0FXMjQlQCQrPS9VQls6I0QgRVZaQTI1VCVRLS1fLDVGSD0oIFU5XgotTUFWSEMtSlE+L1tNU1NTQUcvT0kyS1QwNU5BICBFKUU/I187R01dLy8sQ0xKUF8tLi9JMj45T1IqNTExKAotTUw9W147TitdVzBPPUYlKjRFICQiM1o3VllRUVIjIkgyRE8uNU1TWTFJNy5OTDMiV0VKUjIxPUBJO1xNRAotTSEnR1IiR1pOXEg1JzJJJjgmQDVeLE4lVjxMUT4gVSI7IDUiPEs/JydXKlRMLiNVLS1XLyY5XSNKOzpAJgotTTQ5T1JeLDAjWDoqQDRCLFpVUSFTSjQyJVY7Sy8kQUAjPCg8WkZVKzw0TkNFTE9NLiFRPkYrW1ktVV4kKgotTUpeVS9DJitMPlxaWTAiJzQ5SCwgSDE1VVlMU0MqPyokK1AiIVVRI0U5Sik8JyRKRS9eRFwvMDFSKiNaSgotTTQ6Pi4pPSEzIF8vOjBeOChJOFRCJU45QCZGIjxdT1A0VCVANFIpVDo1XU5aTDksREE8OllbIUMoQzA2WQotTSpeKDlWKiM/RC1BNUZBTF5JMkI7VkJFMDolQS1ALzFVKzlRQzxFOyMuUCAzWDAgISwkUyEoVjtRMD0jVgotTUNdOSNTXigrRS9eMVE7X0A4X0c5UktHLV1ORjRIQExTOjI9LTlONFNEXztEMkxLK1xKQk89XEpcRy0uRwotTSoyIz5FUUBVLSBTMSMoICojSUlNV1soRFRTIF9ZXCtfUjRQNDIrRSE/PlQxNVNRIihAL1ogICwwICg1NQotTSxTWywlQCFWS0MiVzBNT0JWIEErOzM4LC0jWStVVydBXjBMKVoxVy1DTVolKTchSyhfXzw2OiRTTyg3QQotTTwzVVY6SDgxJ1xFXl42JD5AVTkuSyJZKV0sMygwVUBQTCkxMkhIWDE/K1tNXSQ/JipSV0g8QFpbWyVVTwotTTdbPVVSVEshTkNAQywyIiQsUSo8TSRANlZAVVJRRCEiT0FeJjonIkIzUSEjRCFFM1EmUCsnJkAhKkE9OgotTSNPRy8oXkFKVS8vJiZcIzssPFFcPlxYIy80TihUQE9FQTxfKE5YO0UxTEotWDgkNEMwUVssSSg0XUUyXQotTTI+JyQpXVI8WkslODJBJ1kkUSBWWiw5Wio5W1QlQ1wqXFRGRlNXPkUoWi5ET0VOIlMqKVIrUzQwMSdeXgotTUcxLlhKLChSM0xFLCxaVlxHT1paPUpQQSxCWSxTMyheJFkmVDwvWzktS008RVg1IiUhS10xTFM9Xi44WAotTUFdKUkhXSQ3JkArUV9DWlVKWlsjTj5ZTycgQCJPSiQgUjZAJiAsSElIO0Y7V0VUTiZQXlZRIiVRMFUiPwotTTBYODY6UkcyOypEKFdULUBFMVRCKCogUDs7MidYXCk+OVw2PlBTTV1UJ0BQWTdeME4tQDtXSVc6WS0/RgotTTElWSRZODM+TERULTdJWSFNQkZCPUBYJ1U9QkMvJDlRQSwrTVMxU0EoQjwgOlEgIEFRJV5OXilaOjZCSAotTUM+UkgiIj0sODZHUzpBSFM9PS5NIUA2SyZOQjswT0s+ODBbPDtHKkZSTiMzWTpOWiwnSSczTT5KUk44UgotTVBUOFZBKzMlXTxGLC1aRyZOLSRbT0JJQ10hOSMlLFQ6Tjs0XSpQSFoxWjFYODs7WFktXEwkM0U5JV1BOAotTVlAIDAiSCVdMy0jVkQwWDNZN1BYRVhSLjNKXzdJXEg6QClWSjBZUkhCVCMrOjFaVzIpLk4xVjEjPkROQwotTUI/WDYiWSc5UDFBXklRTE8gOCJCIyU+QSVSNSlcPU8lPz8/KiRcMS1IPT1CP00nPDM5TVwhSCtVPVxdNwotTV9ERz44TU1aXyJNKTtEIjwgV1owICApLyQmSTpHJ1kyUEM9UjNIRz9NLVdfVSI5PT0kJjpRKkw1U0wgIQotTSRWPE1QV1IqVi0/KFItQiRGN009OkIqXiteVy9QN0NGW1QuPCk/M1omPERCS1VGOFJJQkFeKUVIJ0o3XAotTTknKjFMLD42TTs4V0UzUDlaVDBIPzRWNV0yKzVZRTJKRkQ4IlwsWUE7UCAgICAgICAwICIgIDAgIVAgKgotTSAgWCAkQCA3ICFQIChAIEkgIyQgLiAhICAkRCA0UCE9ICZAIDxQIV8gKEwgRiAiRiArNCBQUCMyIC4oIAotTVxQJCQgMTghKiAkWyA0WCE4QCVXIDhUIUhAJlggPFwhWVAnXyBBQCIsMCkrIEY0IkAgKjwgS0QiVTArUgotTSBRICMrUC0uIFZYI0NALk8gXSAjXEAwNSEjQCQ2UDFfISowJFJAM1AhMTglLzA1RSE4VCVNQDdAIUBIJgotTS0gOT8hSEwmTiA7RSFRKCcwID1PIVlYJ1NAP18iIyAoODBCMyIsOCheQEROIjYoICAgICAgICAgICAgIAotTSAgJCAgMCAhICAkICBAICIgICggIEAgIyAgLCAgUCAjICAwICEgICQgIDAgITAgJSAgNCAhMCAmICA4IAotTSFAICYgIDwgIVAgJyAgPCAiICAoICBAICIgICkgIEQgIjAgKSAgSCAiQCAqICBIICJQICsgIEwgIlAgLAotTSAgUCAjICAsICBUICMwIC0gIFQgI0AgLiAgWCAjQCAvICBcICNQIC8gISAgJCAgMCAhICAkMCAxICEkIAotTSQwIDIgISggJEAgMiAhLCAkUCAzICEsICUgIDQgITAgJSAgNSAhNCAlMCA1ICE4ICVAICAgJDggIDE2QAotTSAgODxAIjQ4ICJIIkQhV1ckSFQhJjA5MCBbTCJYMUk4IVMwOCghVE4mKSxFQ0BINSIiRCAgMCUwJDJMNwotTStRI1EhOSgmNjIwLCAgPCA4IE1KJFYsQTRASyolLjA6UkIwLSAjLCVMIUpFJC1UMV9RQyEkQUgjSkFIRAotTSJQPCE1ICZAIEU4LidQSTghUiw0WzBRJSJfOCdQMCtJIis4K0ggUlYmOVwrUlA5PCgoPC45IDw8KFQ0PAotTUhAIkMkQDwgIDEwMCNDXCdHUUA7IjVUQltSL0wpPDA5MjFdVSA5TEVcMTo0ICBEKzQgVVskQiA1MSAjSwotTSQkJD1cQEQwJ004Ll5RXiwjUUgmUVFYPiAjWChUIFojKTtIQFJBR1AmSzw4OTBaUiYvRChdUFxCJF8kIQotTSswXT0jSyQhRlIwICEgICQjIEZRI11EMEAxT0gnLCw4SEFNSyE+MDojQjkiJFw8OiNSOzoiSDxGLCIwTQotTSFdUCYxQTpUJiJUOlZSIyUoJShBMFEjIyRYXCxYME4uI1AsMkpBKUInPzAgIDI7MCJZLENKUF5HJUdYIQotTUJAKFQmOjBGPUBTJSBRJDpXUS4wJltIMEJRQFMjSSwjPyE6QCAgTDYwIiE8KDwgKihAR1ooTUgzJjA/MAotTSA9SCZMUVA2JydIREZBUlghPEAsU1E0SiJAPCE6Iio3ICRMK1whViElLTQ7OSE8XShOLC9CIF8uJyA4PAotTUxRLzckPSQgOSBARCE7UChSITZCJjE0Ri5AWFgjKiAhXDFdMCM2TCtLMFRbKTk0I1tSNyYkRlgmXUAgKgotTSU3SCtKQFZGJ0AoIV4xJyYjIVQrQVFTNCUjRDgxMEgvIytMOUwiJ1UpOTAgJUBfNydHWEVfMEJNJVtYOwotTUAxTTImN1wpLSAnJCVYTCgwQUxLJlk0M0cyIE8oWFA3KCInXyE0XCAgQSogJzdALFdBK0soOzgiM0IoWAotTSheSCkwMilKJFQsRDghNzsnQjBAXFBISiZFKDRHMEdHI1pYJi9ASysoOiwhU1I8ICAgVEEsISgtJFosKQotTUIhU10iTyBEJCE0MSRbLD4iUTlaIz4kMzVARjEmRExGWSImUSc8XEBGUV5YIlEsOSpSJjwpOCgxO1FTRwotTSAlTC8kIVVPKUIkIyRSJyopLUw6LEFAKCM0NCFLMScnJl0oOTYgIUooSjQiJDBSVCFNLEMsIU1TJ0YwOwotTT4gXiIiXzwgOTAhVyItVCI2MUpAKFQ4OEFQLEYhQVBCRDFBTiE5KDdYQVBKJl5UPCwxIjUpJ1BFIkFIKwotTSY5ICpEIjgrID9MN15AIi8jWkgqWUIvXCkuPCdKUD82I1YwLSwhKi0pP1wsOFBYJignSCBCMTMwJjM0MgotTSUxIDcgKkA9UUBfQCM+VCJEUDQjIitMKyMwKSMjLiQnNEAkTSFLQDcnUiwlKFdUP0VBLVslS1ggIEI1IAotTSJBUEYxMiM1JFosRjowTUgmQzxCJTIjVSMjMDtBMUU/KCNcKUtAOFYmViQlNiE9SCNSVDc5IT5XKDpMLwotTS0yKjgoVDwsXSBYWSEgOCxUIjAuICEgJSQiNl8jJTgwT1EnMSgvOEU3IDM2JTxcMTAiOEIhQ1gpTyBDKgotTSIwQEEpMEMlKF1cIkoxR0YkWkBAOzEnPidcRCknQFkpJjo8QD4xPFckTiBCMiItSyAmWDIsIExNJVggLQotTVNBWVEiRjQmMUFBTCU+PC1bMDVAID9MOCtQRDwjWEw/TDBdOCFQWCBRUV81IEVIPEVBPlQmMFQxIDAnJQotTShLIC5XUS0kKExENVlARV0oLCwiVUE3UChTJC0gIFkkJSVQKTBCISQhQ1glK0BIPiBYPDZDIUhLIEBUKwotTVVSNk4oOCwuTFBWTiQkRDdPMUNeIDk8KDcgI1AmLDAqNlBaRCgzTCFFIFFLI0ZEOFRBICYkSUwgTCApVQotTSJSNEQyIVYvJDdcKzNQKjYhK1g7JFE9Pik+XC1IUCRSIl80ID4hRkIoIDQmUkBHSSk3UENRIS89KT5cKgotTToiOTYnM1Q4SDIxRCIvRCYvMFEiKUwoIS5RK1chLCQgIFEjUCMuJEBCQU45IU88NFcxPl4jTVwzTSFcRAotTSFOXEQ2Ijk9Jk8wPiVRJDwnVTAmLyEyTCYlLCA0UCdaIENMLThQOC0nRUQkX0BXNCRFVDw0MT5DIjgsQgotTS1CKkIpKDhDSjEnSiAhMDAgIClAJjVIOSgxTTIpL0QqXlE0LCg1RDdIQicoKDg0ICdQSzEoVEg/WUFUJQotTSdVKDswIVJaIDJQJlkhJDQlPlg+KlIxWSVSLDZPIVwgIS9INlVCOTwgL0RFOUI3TSktJD5eMCwsICg4NQotTTQgSksiRCw1XTAuUyNfIC5EQUNcJiAgQitRLVYhJDw+TEIyUCA3KDgpUCcyJiwwJkVRVEsoUjw9LEEtOAotTSdEVCUqQCNZIFlQQEVQPFEkUFQnJEA8SSJQQCxZQDtIIDssOi9AIFEmUVQjO0ElICQ9UCNTMS8yKS08LAotTSQxPiMiSFwzW1E6TSdBSDFXUi1LJT5IRkUgN04gMkQlJEAsLigrMDxaIS5UIytMNDZCMzcmXVA6XCBNNwotTSYzNCQ9QEErKShENisyIlwpJERGJSBZUyUqTDYxMT8wJUdYOzAiNFwmNVQ3RlBTJSI9KCVGQFJYJ084RgotTVEiJC4nQUQzKFFDUCAzLEBNUSBSJz9MPVpARzUhLywoKUEsNSNVJDAwQScyIltIOC9ATDUkMzAhSCBBKgotTShdJEJOQilaJUskJiRBMUglMjQyVTFBQidDTCAgUi5QJFA0PioxRy4mSDxCWFEvTSRAPEVSUDJZIEosIQotTTVQNTUjVVwlPDE+ICZeODc2IS1dJC0gIjkhRCEmVzxBV1FGIyI8WEMjIT8sJiokQ00gPE8gJ0QtSFEwKwotTShSTDkxUC9bIC9QIjcxJlYnKFgvS0FSQiAhQDpcIShRJS9MJUJSITImN1Q9XUBAOyEhQDkoMSlZIyxAQgotTU4gUEEnMFQuPlFVUylNREA0IjZLJiYkRlcxNl0oQigpQ0FfRyU0NDAkISRaIDZQIjggPVomU0g/R0EiLAotTSI5VC4jQDs6IFowMDcxWyIpLDQ0MUAuKCAqKDg8IUMpJDFQIyRBIScmPiQvK1FUTiUtLEZZMD1PJEswNQotTSlBVUohQygiTTAjKyRUKEMjIVpZIzMkQT5QT0UgIlRAQTIlQyZYMEVeMCsnI1pAQDUiOkAoMFwvV1BXOQotTSFUODIsUFotISFEOSMxW00hWzQtU0IlUyJMPCQpQFIwJlA8RCxAICQjRSgsWzA8XCkrOCU3MUtOIDBEQgotTUNAUzMhQVBEWiFKXigpWC5YQDQ1KS4oOVcwMkgjLVRDPjFVKCBOWCYwUDk5KUUgK0IwQjskJyA3NVIgTQotTSFNQCRcUSUtIiU4JkNSMD0gQVAxMDFPVydPREZWIVI2JlMkLlAhKFQhWCgrLkEuMCJFRDEiIjNbIj08MAotTTcgQk0jJ1QqOTI5QSQxTCU3UCc4Jk48PENCM0AlRjwpITFaWCNZVDxSUDFLKFpAOToxWFoiIjg0K1I7JwotTSUjSENaIE9RJT1cPDQgTEIoTjAlKyAgPSVaRCREUD0oIVogPVFAXz0lP0AgISBdQCI8SCJXQE9XIyMwPgotTSFBI0MnTFw8LzA0IiJVQCwzQEMpKDwkOUFAKyAhXThFLUBTPidEPCMvQCM3IC8gQlhQQCcpMzQgJiA3PgotTSAsVEI7IV9bKUA8IVUgLTUjTTA3ViA5NyRfIDg2QiAqKSBIJlNARE8mR1hBKiFfWSFHICQuUixMICFURQotTVgiLFIpR0QmKlEmWiAqTClRMCwgITlMMU0xLTYnMEAkNTA0RShJPCBKQjlKKFdIPzNAMUklQlw2LSAgUQotTSNANDNEQFxBJSpANDxRKVMkPiAjVUFHPCRCUDRIMCNWJj1YMzExQ1AkUEg7VkIqXCQlMDlHQChQI1sgPgotTTtRTF4mKTQsSkI1MSAsLDtEIE03IyJYNyIgSkImL1Q6IFFdRiheSC9fIE08JVZMP1ExX1gpSzxDUCBBPwotTSI2IDNJQElOJixQLyBCJSYoVDBCTCBaUylBRDVcMC0nI0ZQOFIhKjYmTEQ3VlFFJCBeXClNQSBdJC0kLgotTSpATDooQzwpTVBRJSYmSDw/Ui5FI0pUQl9BSCIiJSAlISA/QCclKCElMCpUJz0oJjhBQCUhXVAiRkBXUwotTSU4PDxVIFdaKUxAI0lQJk4jQyQhUEA8MiNfOCAnMC40IFNcMlhCKjMgKkQ8OlI2PyE/JDEvQSdEIVRIJgotTSBAUz0mTUw7WiIuKykuMEVfIDs3Jlo4QSBRNFwkUSAiMkE/IiNOMEE7QT9DJy40MEVQQV4oLiAiMCIvXAotTSBdSCpLIUM3JU1YJioyKDsgKjQtN0BDWyFQPDgoMStdISxIOVVBL1IkWSQsKVA+RicpTCREIUQzJjQ4IwotTSwgWCklOEQzJzBUUiVPOC5YICMiJjxAIEAgOE4kKShCTVA5MyNXSDw5MTJJISYsQz8wND4lXCQuVFBQMwotTSIhSEImIjowKUkgLCcxMUolIjAgITIoQCE3WEJJICxTITMkRFMiJyAlIigiRSEyPyk9SDBbIVdPIF0oQwotTSkwUSUgKigsVlEzLilJPCtEMF8pIypMRyEiOFUmIzwtTlBbJCJHOCpPMjYsKE5cQkowPSUoRUwvW1FBOQotTSEgMDBGIU9OJzdAJi5APiMhSjArT1IsLSY/SCdAUDwqKDkkN1NAPE8hO0Q+TlA3ISAiMClQIC1EIjowKAotTS1ASj0nSTgqVVIvNSc3OEJKIiNUJTUsIl8hJS8jTVg9PFFTXiAiPDhIIS5aJktIIUBSOCUkTTwsIFA7SwotTSk8QENHUCJWJVgkICwwNkMpNDwiQlA0SihRQCowMD0jI0U0IFwgJl0jTzQ4KFBbOydNODBCUFInKSYsQQotTSdASUIiSFAiQVBDWCEyKDdRQitaIC5QPkwgOSUoNUgrJ0EvQSREXC5BIjpfIkQ0MlYyOVQmKkw0STEuQgotTShVXCM0MVZSJDw0Q10hXlEgOUw8OlElLCNUSDJTQSRbJUpAOCZRUjghMVgiTjIpJSkyIDkzMExQI19AIwotTTtCJlkjS0AqP0EvRyAwMCddQF0hJV1cOiogOk8oSVA0QiAjXyRBJEUkISxBKSg8IlEiMC4lI1AmJCAsUAotTSZGVDpaUDYjITUkIjIwRyAlUzBDT1IjUydUODEhIi8gKDdcJUMyMyIgLyQsIzBROSNTKEElUU5aISNUOwotTSQhPSUgVFw+J1AqPSNXWCBCIVAuIVZAJjlSLCMnODRGVTFTSCdWUDg0MSRLIzw0KlAgX0shOVA3UjIuMwotTSVVWCBMMTJCJV8sNipBO1YhWzxEJFAsJSFYODsuQTshICpYICAxUzAmLywrN1FEXSNKLD0uIDo6ICw4QgotTUhBP1cmNjQ8PjBeWCEpVCsqUFAmJU04IEQyNEolR1QjTVAgTiMgTCIiUFQ8J1YwLjBBIDcgKjRCTiAmXQotTSMvUDcrQjpWJCwwKzZQODIgJTwwWEA3USMoPD9cIVElJjAsP00xQVElWTxDPjBEKyVMQCVJUVlVIiRUPgotTVhSOVsnLlxBN0BMXyE6LDomICAmIz0gOjxRT1YnIEQ2OiBcICRPXDwqIFYyITtARiUhJkAkQVQxKiEwTgotTSg2JC4rMDAqIDxILCdQRkcgV1A+O0E2PCIsNEQyQi1KJkM0IU0hLlwhTkAxWkBFSCBITDU1QDQmIVxYJwotTSZBT1soODAvNEBUOic8IDE2MVdfIVlcKzhQPy0lLlQkOjIpTiNFWDNaUU5LJlJQRV0hTjQkIiQ8RjI7MgotTSZVKCAqUTJQJzA0JCoiKTMhP1w2UyFJMSUvIEQ2MVRTJDpQKSMwICgkOUA+NEIsMiYgLD8zIEM6IStIRgotTTAhIzMhMDw4LzEnQyQjUCEhICZdJz84IlcwK1UpPTgiWVI3WCFWTDNZIjIvJzc4OEJROyAoLkgtPyEgXwotTSUqSCAtMDBIIC48MUQyM0ElKDAmSkIvNCInVDMqUStGIzI8PkdRJSIlXkAyQzBdLiNTKCEnQicwIUcsQwotTShAPDElLiw/WDEiVyZcTD1OUEg4I1EoOUkyNCMkJjRGVzBQJyg7TDI8QU5PIzU8OSpRWE0iX0BEOTAgKQotTSc8VDlRUTFKI1wwP1ZBNlgmQCQ6MUEqWyY6NCZYUSpcI1BIKDIwTD0kOVA1PiFLJCJISD9DUCouJUlUOgotTV5BK08mUixCQjFTLylGWERNQTMvIThUQjEyMy8pI1giL0AyNyBNIEI2ID00KTkgOiFQOSkjPyArKTEjUwotTSFeXDooIDFHJFJQMlZSLkUmPig6KFEwVyBCMC1WMVZAJD48JzggLSEnSSwrPUIsRSBXNDA8MEAtJDIwPQotTT8xTTUjQSBFPlIoXihfLDRFIE5TIio4M0ohTlIjTlgzMUE0OSg/NCQjIE82IzowKERSNTMoI1ghOjIxOwotTSVTQCVYQDwvIVRUJikxR1QjKTwySCIkOig3PC4pIVBfIyUsKF8gICEkJSBESlAxKCJbND1KIjJbIiA0PwotTUQwTTcnWFgxNTFXNSEzUDJRQEk+Jz1cQiJCISAhKkAnViBcOCVGMC8zUUdBKCgwOksxUVAlNjQgJUEsJAotTSU1MCVbMDZUJShcLz9BK1ImK1wmP1BSMyRcMEVTIENBKUc8KFcwLUshQigxLVAtQyZGVCooUTxDJlQoOAotTSggVUEoOywhPjA3NiVbPDo9QFNRIjkoOTFBJyEjOFwtRjApQyAgQEBEIFs3KFEkQUEiK1kkSVA7PyI6NAotTSNYIEJBQUA9JzVMQDkhKyIjXEQkSSAsVSIxRCtUISApJCpAPV8gUS8hSTwzVyI6TCZLPEBQQVgqKSssQQotTSNAXFkiPEQ1SDAkLCU9TCkqUVswITA4LE4yNDsmRTw+VUE5NihKUDw1UVQxKDkoOjEgI18mRSxDMEE+VgotTSEvXCVcQFg8IytQQkNQKislIlgzLSBeKiM8LDQ/QFdOJStcQDlAIFQnWiA3IUA4RidCKCAqUEIoIj1MRQotTUxAOEcjJkwmPFBWTSNLOEAmUEYzIys4KyciKDUlXlwzWlBFSCIuTDBFIjo/JVwkRV1RNzMpP0g6REAxQgotTSciQEQpQFI4KSIsRlQhOE8pO0wtJiAvQCheJD5AMDc+JTA0OU5BLjYhU1QjSCEwQiA4ODY+IikrIiMwKgotTT0wJSokJSg3PVAwKCgqPCc/MFJQKEggMTMiMlkkVSg2P0EvLSA4QChNUCU6KS8gKFAwQ1gkWVxBRlAuLgotTSFGREJaIEYrKSNAIyBARFYhPyQzUlBISiAtMDYzUCNQJiZYQCdRICwkN0BGJFBDJihfWDBEQFQiJztURQotTT0xPTcgVFQ8VVIoKyRDWDhNMF9CKS5ARl4gWUUkQzwjLFFBTyhWQDRcMCo9ISMgRTRSJlIiUCQ1X1IgUAotTSMkJC4uISUpIUIwKDUwRzoiKFw8P0BWSCUnPCUiUE4xIkZUQiEiN1ojMDwtLyAhLSItVEBYIV8yJS4wKQotTTIiLkgkIlwiKDAnIyJcMDZMIFY+KE5QNjMwLVEnTEAiS1FUXyVbLC5CIFZaJUk4LzNSJ14nQ0AtOTEgIgotTSJHWDxYQSdWIDtcO0shWjUkQSQgW1E6UyBTWCMiUi1BJTpAQTMhJyEiXkhENDFbPShBLEMkUFZRJiBQJQotTUowOjMjPUQhTTA5JCBJJCYuQiYxJUhMNyQwXUghR0w3QSA0QCBDIDM/QS1VJ1dYOEFRWjYoMVQmRkEsJgotTSAgJCNUIDYjKUtcQUMxX1YlNVgwTTAkVictUCsiUUZBJEUkLidRKDwpLyQzIkBHSyVVTC45MVsvIig8LQotTUVSO0cjPDwuMCIsTSY5SCMlME5LJEdIRlkhWTklLCAtNlAzUSJZLD8sUShRIFpQNDRRTSokPlw/XVAtQgotTSIwSDMtIEdCIkIgJ1ZBRlwmIDgpSDBIUic/IEFcQDQuJD1QPlhASV4gJEw9SlBJXShDSEA9QVU+I1I4LQotTS1BXUMpUDglPVA1WScxVCAiMFEgJ0BQIy9QWV4hUzw1SlBTXSQmJCdUQidSIC4sJSYgVE4oOFgwXCElPAotTSdKUDhcQjIhJjtEOj5AXzclTCQiWTIkISU9NCdKMC0+ISs8Ml4hU1gkNSg/VjBFQSU0SCVNITUrIzpEMQotTSMyO1MoOSgmJkAyPCdHXDc4ICItKCZMNyFRI1wkLzhFOiFGNCRfWDNEQV4kIEFMQz1BVjshPjwqXiFELQotTSNVWC9QMDhQJCEoPlJRX0sjVTg8QSAlMyRfPEMnQic8ICNcI0AgViggU1AvSlIxOiAySC1YQSIyIEJEIwotTVBQWEggOzQ7OEFDMCA4RCFFQVlXJDA0NkQhOk8mIUQrNiBbIyA2JEEzIT5bIkpEMyVRVlIgTTg6RDExTAotTSNePDReQUw8KCU4OEhRL1wnOEQ/QCA7JCM+QCpIQVFWKDhQRjExIT8oWTBDU0E6UiEqSClOIUA3KExEPAotTT0hSV0pKCQ6TTEnOyRYLCMgUCouIjpINTQxNU8nJSg4TCFbMig1ODFQUUkiIiU8MzohNywgOighICBIMAotTSY2WCExISMvIExYOl1RTTsoX0gyTkIpJyJaOCBYQClFJyckIFBRW1UhOzwxQ1E0QCk6UDswIjVLKFBcJAotTUZRTjcnOEgpJCFITShPXDNaQUlbITJIM0JRLksiO1RGM1BWWiEsUCcwUDJVKTJQKSRQUSEgWTwpS1E3MwotTSkpICo7ISIsJ1goJT0hSkIoMyQqJlFSXigqUCM7UjotIi5AI1hBN0AgNVg4JUA8JCFaTDNLMCcvJVMgPwotTU8wS0wjNUA6TyBVTyBGUCpNUVBQIjZUODhBQlkjPFwrWiI3VCNQPClGUjs7KUVcNllAKkwkW0wmODFRJQotTSNfKCQ0MF0pJ10sMiUgREYkXFBATzE6KCgzMEUsIFAqIVlEI0swMz4hWkArU0EyPCY5MDBGIVs1J0YgJAotTVZSNCIiXzxBJkBGXCFHWD9UIjhIJU84LV4gNVEnUywkPEAxQCNBKC9aUVI6IFRcJStQLyMgQjg6OUFYVAotTSdbLDBTIVFJIl9EQltBWDEmIiwyPzIrJiFXLEQ2MCwkIyU8Ml9CMUEnUkAgIDFZQCVBSCVeQiBdIS1EOgotTVxRWSkgSVBALEBKNSUsODkjQS5XJko4LS9BKiElMDQvUSI2LCcwUC9IQTgvIVA8IUtRRlEjTVhAWzEjWwotTSdCUCgzIF5YKEE4KjMxWF4kLShGPSBWQyk8KChJMUEnKElEKDdQM0EnICQ3TzIsXSRBMDREIS8/JSJMKQotTSIhWUcnVFAqXUA0NCZUMCcoUjopISU8NyEyJyElLDA/LFA3SSU4LCtOUi9MJy4gKTRQRl4lNzwzPVEqRgotTSMtRDozUiZZJiFQPkEwICsnUCAuMCFPXSg7WDBJUC9KJUtYQkdAQE4hIFxAI1BLJSIrOEVSIDs3JiZUIQotTSFCJVQoMjRBXFBbQidVQDhAQVohIyFELCtRWzMgLkhBO0ItXiBRMC1NMTdVJlU8QixRKCAgSzAvJTEmRQotTSBOVCwjIDpBKDQoNkJCMEcgJThGISA8TyVfNDYzME9fIVMsNTAhRiAlJEhGMjAgMCRASDQnIC5HJSRUNwotTT4wLUwoJ0w6JCAqWyhCMCkzIE0iIjggOiJAPU0hPzBDWkFFVSYxUDJJMFI2IiM8IDMwWVAnKkREQiFMLgotTSY7ODNFUU9ZJ19MIVQxOCEgT0g5QkBUOShGQDsiUV45ITgwJ1oyLV0oUVBDSEE7LiU0UCZUQUA9JlpUMwotTUZBT0QoOyg4KTA9XyBeKCM1MFNIIz4gPDkwMTwoVEglQVE+VSdPXDJQUSgzKDQ4LUpRSUEmUEQxQFEjWgotTSUmKEEmQE5BJ08gMi0hSVEiNEwqXlEzTyk3QEZLIUkiKUlMQlVRVkAgSlQtMFIwKSJYWCE4UEYpKE0wPQotTVFSMU4nUjBAS0FeWyU1KEA1IFNeICNAIV5AMEAhU1giXUBYTiMxMDgpIUA2ICo0PlZRUkwlLjBERTEuXwotTSJfSC0/QT8gKUdARU5BWjcmXDBAOzIrWyBBRCYtQTBWIlxAN1EiOyogNEwxUiEgISUvMEIkUUYmJTk0MQotTTwhOlgpNDgqNTFRPydPWCVBQUY6JVU4OERBVVgoTSgsTDIqKCUtMDg9UUEiJEFMRVBAWjAkOVA8PlE7NwotTSYyKEQsMVsmJixMITkwVjohVFBDX0A8WSVTTDIvUTkoJFZUREQyJ1skISw5JlBaUChBQCZLQU0hIVFIJgotTSwwU1QlWCAiRiIjVyBIQEA/QSUnJTY8LyMyOz0lVzgyJyI3PSVOJDk7QDZAIT5YQE4gMy8lRTQkT1AuPAotTSkkOCVdITolI0YwIVkwLDkiMyg9MjA/XyBTQCdJMThUKSsoRCJCKzQmPkgqMUEyKiUrUCBYIjpRIio8MwotTUYwKTMkTEg8TSEsNyk0KDZfUUwlKThAIC8wNSwhQTgiVUBHOiZHRDsoUFIpIzAsQUxRXDAoPzwvWFAuVAotTSYzKDI6UVcvJ1E8PlohL0IoUzw9WVFKXSczSCspMFpSJU9QIEsxRS8nRTAmUSAgIiAgICAgICAhICAsIAotTSFAICogIFwgJUAgPiAiPCAsMCBcICREIDVQIUYgJzggQVAiOiAqWCBQUCM5IC8gISIwJEMgM1ghNkAlVwotTSA5OCFNQCc3ID9EIicgKSEgRjwiQ0AqViBNXCMiQCxWIFYsI0QwLyAgXyQkKFAxNiEoSCRPUDNWITJYJQotTTlQNkEhPVQmJkA5OCFJPCZVUDw5IVVQJ0ggP0UiIkwoPFBCXCIwOCk0MEY9Ij5MKi5ASioiTUwrKzBOIQotTSAgICAgICAgICAgWiggITU7Rk1OO1c9TigmNVI8Rl1SICBIICAgICAgICAgIEovVCAgKkNfICAiSSA4IAotTSBKMEAgICpELCAgIkkkQCAgSjEyICAqRDsgICJJJ1ggIEoyMCAgKkRIICAiSSpQICBKMl4gICpEVCAgIgotTUkuKCAgSjNOICAqRSEgICJJMSAgIEo0PCAgKkUrQCAiSTNUICBKNS0gICpFNyAgIkk2VCAgSjYhICAqRQotTUUwICJJOzAgIEo3IyAgKkVUQCAiST5IICBKN1cgICpGIzAgIklBUCAgSjhIICAqRi5QICJJRFAgIEo5QgotTSAgKkY/ICAiSUlIICBKOlkgICpGVUAgIklOPCAgSjwmICAqRylQICJJU1ggIEo9OCAgKkc+QCAiSVlAIAotTSBKPyggICpHV1AgIklfWCAgSkAuICAqSCkwICJKJEQgIEpBSiAgKkhAUCAiSilUICBKQlkgICpIVDAgIgotTUovKCAgSkQ0ICAqSSowICJKM1AgIEpFPiAgKkk8MCAiSjdYICBKRjIgICpJSUAgIko7RCAgSkcoICAqSQotTVcgICJKPyggIEpINCAgKkoqICAiSkM4ICBKSS4gICpKOjAgIkpHUCAgSkovICAqSkxQICJKTFQgIEpLSwotTSAgKkpfICAiSlEoICBKTEMgICpLLEAgIkpUWCAgSk09ICAqSzwgICJKV1AgIEpOMyAgICA2VDVSPEZdUgotTSgjICAzRl1UKCZdVztGNVIgJFlPKCctVThWQEA5RkVMOTIhTzxCIUQ6NylFOFcxTzxHRCAzRlxAPFc1QwotTToiIVA8Rl1DOTctUyAkRU49JjVSPEc1UD0mNUQoJy1ZPFcxRTsyIUM4NlFMICRETzNSIUU8RylPPEAhLgotTTtSIVM9Ni1IKCYxRT1GRUM5MiFPPEIhQTkmMVI5Ny1TICQlUjlSIUw6Ny1UKCcxTztSIUw7VllHICQ1WAotTTk2LEA5Rl1SOzYlVCgmNVI8Rl1SICQpQTkiIUY6NlFFKCZZVTs2KUU8QCEuO1IhQzomRUw5JylFO0AhLgotTTtSIU07VylFKCchUjtWLUU8Vy1FPFAhLjtXMEA5NllPPTY9SCgmVUU7Nl1SPjAhMDk3KU06Ny1TOjZdTgotTSgmMUU7RkVFOSAhIjg2MEA4NjFEPEY1UzxQISI7Jl1DOlIhRDk3OUk4VjRAPEY1UT02RVI5NjAgMSY1VgotTTo2LUUoJilVPFdEIDFGRUw5MiFFPiZFUz0nLCAwVylPPFcsTTkmNVY6Ni1FKCZRSTtGTCAzRlxAPFc1QwotTToiIUQ5NzlJOFY0IDNGXVQoJiRAOSZFUjk2LVQ7VylZICRFUygmJEA5JkVSOTYtVDtXKVkgJEVOPUYlTAotTTo2MEA4NylHPTZVRTtHMCAxRkVMOTIhVDg2KUw5MiFPPUY1UjlGUU89UCE0O1ZcQDs2JU4+MiFPPCY1TgotTSgmOUk7JjVTICRFTjg3IVA8Rl1QPEZFQT0mNEA6Nl1DPSZQQDlGXVIoJjFFPUZFQzkwITQ5N0FUKCY5SQotTTsmNEA4RzVTPjAhJjo2UUUoJzFPO1IhTDg3KUc5MCEuO1IhUzwmJUM5MiFMOTY5VCgmXU4oJjFFPUZFQwotTTkwISk7JlFFOVYlTCgnLUU5NkwgNEY1QTkiVU87RlFZKCY5STsmNEA8V0VTPSY1TSAlMU87UiFNODZZWQotTSgmUUk7Rk1TICQpUjtWTUU7QiFQOjchRSAkJVI5VzVNOTZZVCgnMU87UiFMODcpRzkwITI5Ny1VOycwQAotTT0mXU8oJlFBPEY9RSAkXVA5NylBPSZFTztCIVc7VzVMOSIhQjsmXUM6UCEvPCY1Ujg3MUk7VlhAO0ZdVwotTSgmRU4oJyFSO1Y9Ujk3LVMgJF1QOTcpQT0mRU87QiFBOycpRTg2MVkoJkVOKCchUjtWPVI5Ny1TICUtTwotTThWTUU9IiFPPCY1Ujg3MUk7VlhAO1ZYQDtGXU4rNy1POFZNRT0gISQ5Ny1UOjZZQT0mRU87QiFBOSYxUgotTTk3LVMoJylFPDc1STxGNUQgJFVFPFctQTlWNEA9Jl1PKCZRTztGPCA0JylPPSZdQztWUEA9VylPO0Y8QAotTT0nRVA5MiFGO1coQDxWXUM6VjVUICRdUD0mRU87QiFOO1cwQDxXNVA8Jl1SPSY1RCgmKVkoJyFSO1cxTwotTThWXUwgJSFSO1cxTzhWXUwoJllPPSIhUz03IVA7VylUOTYwIDRWXUM6VjVUKCcxWTwmNEA7Rl1UKCctVQotTTwnIU88RzFFOSAhLzwmNVI4NzFJO1ZYQDtGXVQoJy1VPCchTzxHMUU5IiFPO0IhUztWLUs5NzAgNCcpTwotTT0mXUM7VlBAOUYlTTo2UVkoJllPPSIhUz03IVA7VylUOTYwIDA2MUQ8RjVTPFIhRjg2VUk7J0RAO0ZdVAotTSgnLVU8JyFPPEcxRTkiIUI+MiFQPEZdVDtWLU87IiFGODZVSTsnRCAwNjFEPEY1UzxSIUE7JylFODYxWQotTSgmRU4oJzVTOTAhIzg2WEc9IiFBPFctSTlWWEA8RjVRPTY1Uz0mNUQoJiVEOScpRTxXLCAzRjVUPVZdUgotTTpSIUk8UiFEO1c9TiAkWUU9Jz1PPEZMQDo3LEA9NllSOTYlQzomJUI7JjQgM0Y1VD1WXVI6UiFEPEZdUAotTTwmNUQoJi1PO0ZZRThXMUk7VlhAO1ZYQDxGNVM5NzAgNFZdRj0nPUE8RjRAOFYlVTxWNUQoJi1PO0ZZRQotTThXMUk7VlhAODYpTzxHMCAwVl1OO0Y1Qz0mRU87QiFSOTctRT0iIUI+MiFQOTY1UiAkWU8oJilVOUY5RQotTTxCIVM8JiVDOTIhQT1GJUk7JiVCOyY0IDRWXUM6VjVUKCZFUygmJUw8RjVBOSdEQDhWXU47RjVDPSY1RAotTSAlLU84Vk1FPSIhSTxSIU47VzBAOFZdTjtGNUM9JjVEICQtQTtCPVQoJy1FO0YwQDg2OVQ5NyhAPFZdQwotTTpWNVQoJy1IPTcxRDtXPU4gJTFPO1IhTTg2WVkoJylFOUY1Ujk2WUM5NyxaKCYtQTtCPVQoJy1QOyZFQwotTTkwISM7VllOOTYtVDo2XU4oJzFJOzY1RCgmXVU9ICEjO1ZZTjk2LVQ6Nl1OKCcpRTlHNVM5NjAgNSZdTwotTSgmVUE7R0RAOyY1Vjk2UVMoJl1GKCctWTs2KU87JkVDKCZRSTtGTVMgJDlJOyY0QDtGJU05MiFUO1ZcQAotTTsmXU45UCEoO1ctVCgmRVMoJjFPPVZYIDImXVM9IiFJPFIhVTtHKUU4Ni1IODYpTDkwISQ6NylFOFcxTwotTTxHREA7Rl1UKCY1TTwnMVkgJTFPO1IhTTg2WVkoJyFSO1YtRTxXLUU8UCE0O1ZcQDs2JU4+MiFVPFY1UgotTTxQISQ6Ny1DKCclVTtXMUEoJjVYOFY1RTkmNUQgJS1UODZRRSgkWSY0UiFGOjZRRSgmQUE7RjFMOTAhNAotTTtWXEA7NiVOPjIhTDk3OUU7JyxAO1Y4QDxGNU07VzFFKCZFTignIUE9JkAgM0ZdVCgmJEA8VzFSOTYlTQotTSgmMUU9RkVDOTAhNDo2VUU8QiFFPichSTxGNUQgJF1VPSIhTzlCIVM9JylFODZUQDxGNVM7VzVSOFY1UwotTSAkWU8oJlVFPFctQTlWNEA7VjhAOSY1Uzo3KUU5IiFUPjchRSAkWU89IiFBKCYxQT0mJEA7NjVTPFYlRwotTTkwISk5JjVOPSZFRjo2NVIoJylFOzZdVjk2MCAxJjVBOSZRTzhWTEA8VkVUPTYlVDo2XU4oJjFFPSY1QwotTT0mNUQrViVWO1ZFRDk2MCAzRlxAPEY1QztXKUQoJlFPOFZNUygmJVY4NkVMODYpTDkwIS04Ni1IOjZZRQotTSgmRVMoJllPPSIhTztCIVQ6JjRAO0Y1VD1WXVI6UCEvOEZJRThXMEA6NyxAPEY1TTtXMUUgJFFJO0ZMQAotTTomJVMoJilFOTZYQDxWNVY5NylFOSAhITknOUU8RzFJPFY0QDk3KVI7VyhAICUtUjs2XVU7RzBAOTcpUgotTTtXKEAgJC1POzZVVTtGRUM4NzFJO1ZYQDk3KVI7VyhAO1ZYQDxWNU45ICEwPEZdVDtWLU87IiFFPEcpTwotTTxAIS09NlFUOjZBTzwiIUE9JzFFOzchVDk2MCAxNDEvNSQxLzUiJEEoMiQgNEY1TTtXMUUoJiVEOScpRQotTTxXLEA4VkFBO0Y9RTkgISY9NllDPSZFTztCIU47VzBAOjZVUDsmNU05NllUOTYwICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkISAgICAgICAoIiAgICAgMCEgICAgICAgKElAIAotTSAgID0hICAgICAgIChKICAgICBFISAgICAgICAoSiAgICAgVDkgICAgICAgKEogICAgITc5ICAgICAgIAotTShKICAgICE/QCAgICAgICAgICAgICAiIUAgICAgICAgICAgICAgIjNAICAgICAgICAgICAgICJaQCAgIAotTSAgICAgICAgICAjM0AgICAgICAgICAgICAgI1FAICAgICAgICAgICAgICQvQCAgICAgICAgICAgICAkSQotTUAgICAgICAgICAgICAgJStAICAgICAgICAgICAgICVOQCAgICAgICAgICAgICAmK0AgICAgICAgICAgIAotTSAgJkdAICAgICAgICAgICAgICZZQCAgICAgICAgICAgICAnLEAgICAgICAgICAgICAgJ0RAICAgICAgIAotTSAgICAgICdQQCAgICAgICAgICAgICAoTUAgICAgICAgICAgICAgKTpAICAgICAgICAgICAgICouQCAgIAotTSAgICAgICAgICArKEAgICAgICAgICAgICAgK1NAICAgICAgICAgICAgICAgMSAgID4wICAoSiAgICAgIAotTTEgICA+MCAgKEowICAgICAxICAgPjAgIChKSCAgICxEKSAgICAgICAoSiAgICAgIDEgICA+QCAgKEpYIAotTSAgICAxICAgPkAgIChLKCAgICAgMSAgID5AICAoS0AgICAsUykgICAgICAgKEpYICAgICAxICAgPlAgIAotTShLUCAgICAgMSAgID5QICAoTCAgICAgIDEgICA+UCAgKEw4ICAgLSopICAgICAgIChLUCAgICAgMSAgIAotTT8wICAoTEggICAgIDEgICA/MCAgKExYICAgICAxICAgPzAgIChNMCAgIC1DKSAgICAgICAoTEggICAgIAotTTEgICA/QCAgKE1AICAgICAxICAgP0AgIChNUCAgICAgMSAgID9AICAoTiggICAtUykgICAgICAgKE1AIAotTSAgICAxICAgP1AgIChOOCAgICAgMSAgID9QICAoTkggICAgIDEgICA/UCAgKE8gICAgLiopICAgICAgIAotTShOOCAgICAgMSAgIEAwICAoTzAgICAgIDEgICBAMCAgKE9AICAgICAxICAgQDAgIChPWCAgIC5DKSAgIAotTSAgICAoTzAgICAgIDEgICBAQCAgKFAoICAgICAxICAgQEAgIChQOCAgICAgMSAgIEBAICAoUFAgICAuUQotTSkgICAgICAgKFAoICAgICAxICAgQFAgIChRICAgICAgMSAgIEBQICAoUTAgICAgIDEgICBAUCAgKFFIIAotTSAgLyYpICAgICAgIChRICAgICAgMSAgIEEwICAoUVggICAgIDEgICBBMCAgKFIoICAgICAxICAgQTAgIAotTShSQCAgIC89KSAgICAgICAoUVggICAgIDEgICBBQCAgKFJQICAgICAxICAgQUAgIChTICAgICAgMSAgIAotTUFAICAoUzggICAvTCkgICAgICAgKFJQICAgICAxICAgQVAgIChTSCAgICAgMSAgIEFQICAoU1ggICAgIAotTTEgICBBUCAgKFQwICAgMCIpICAgICAgIChTSCAgICAgMSAgIEIwICAoVEAgICAgIDEgICBCMCAgKFRQIAotTSAgICAxICAgQjAgIChVKCAgIDA6KSAgICAgICAoVEAgICAgIDEgICBCQCAgKFU4ICAgICAxICAgQkAgIAotTShVSCAgICAgMSAgIEJAICAoViggICAwSykgICAgICAgKFU4ICAgMF1AICAgICAgICAgICAgIDFXQCAgIAotTSAgICAgICAgICAyS0AgICAgICAgICAgICAgMztAICAgICAgICAgICAgIDNNQCAgICAgICAgICAgICA0NAotTUAgICAgICAgICAgICAgNFBAICAgICAgICAgICAgIDUuQCAgICAgICAgICAgICA1SkAgICAgICAgICAgIAotTSAgNVdAICAgICAgICAgICAgICAgMSAgIExAICAoVjggICAgIDEgICBNMCAgKFcgICAgICAxICAgTUAgIAotTShXOCAgICAgMSAgIE1QICAoV1ggICAgIDEgICBOMCAgKFg4ICAgICAxICAgTkAgIChYWCAgICAgMSAgIAotTU5QICAoWTggICAgIDEgICBPMCAgKFlYICAgICAxICAgT0AgIChaOCAgICAgMSAgIE9QICAoWlggICAgIAotTTEgICBQMCAgKFs4ICAgICAxICAgUEAgIChbWCAgICAgMSAgIFBQICAoXDggICAgIDEgICBRMCAgKFxYIAotTSAgICAxICAgUUAgIChdQCAgICAgMSAgIFIwICAoXkAgICAgIDEgICBSQCAgKF8oICAgICAxICAgUlAgIAotTShfUCAgICAgMSAgIFMwICApIDggICAgIDEgICBTQCAgKSEgICAgICAxICAgU1AgICkhSCAgICAgMSAgIAotTVQwICApIjAgICAgIDEgICBUQCAgKSJYICAgICAxICAgVFAgICkjQCAgICAgMSAgIFUwICApJCggICAgIAotTTEgICBVQCAgKSRQICAgICAxICAgVVAgICklOCAgICAgMSAgIFYwICApJiAgICAgIDEgICBWQCAgKSZIIAotTSAgICAxICAgVyAgICknWCAgICAgMSAgIFcwICApKEAgICAgIDEgICBXQCAgKSkoICAgICAxICAgWCAgIAotTSkpUCAgICAgMSAgIFgwICApKjggICAgIDEgICBYQCAgKSsgICAgICAxICAgWSAgICkrSCAgICAgMSAgIAotTVkwICApLDAgICAgIDEgICBZQCAgKSxYICAgICAxICAgWiAgICktQCAgICAgMSAgIFowICApLiggICAgIAotTTEgICBaQCAgKS5QICAgICAxICAgWyAgICkvOCAgICAgMSAgIFswICApMCAgICAgIDEgICBbUCAgKTBIIAotTSAgICAxICAgXCAgICkxKCAgICAgMSAgIFwwICApMUAgICAgIDEgICBcQCAgKTIgICAgICAxICAgXSAgIAotTSkyOCAgICAgMSAgIF1AICApMyAgICAgIDEgICBdUCAgKTNIICAgICAxICAgXVAgICkzSCAgIDZEKSAgIAotTSAgICAoVjggICA2TCggICAgICAgICAgICAgNlYoICAgICAgICAgICAgIDcoKCAgICAgICAgICAgICA3PAotTSggICAgICAgICAgICAgN0coICAgICAgICAgICAgIDdZKCAgICAgICAgICAgICA4LSggICAgICAgICAgIAotTSAgODYoICAgICAgICAgICAgIDhGKCAgICAgICAgICAgICA4WCggICAgICAgICAgICAgOSIoICAgICAgIAotTSAgICAgIDkzKCAgICAgICAgICAgICA5RiggICAgICAgICAgICAgOVIoICAgICAgICAgICAgIDlfKCAgIAotTSAgICAgICAgICA6OiggICAgICAgICAgICAgOl0oICAgICAgICAgICAgIDtCKCAgICAgICAgICAgICA7XgotTSggICAgICAgICAgICAgPDcoICAgICAgICAgICAgIDxcKCAgICAgICAgICAgICA9NiggICAgICAgICAgIAotTSAgPU0oICAgICAgICAgICAgID4wKCAgICAgICAgICAgICA+SyggICAgICAgICAgICAgPyMoICAgICAgIAotTSAgICAgID9HKCAgICAgICAgICAgICBAJCggICAgICAgICAgICAgQEIoICAgICAgICAgICAgIEBYKCAgIAotTSAgICAgICAgICBBNiggICAgICAgICAgICAgQVYoICAgICAgICAgICAgIEItKCAgICAgICAgICAgICBCSAotTSggICAgICAgICAgICAgQygoICAgICAgICAgICAgIEM9KCAgICAgICAgICAgICBDViggICAgICAgICAgIAotTSAgRDQoICAgICAgICAgICAgIERKKCAgICAgICAgICAgICBFJCggICAgICAgICAgICAgRUMoICAgICAgIAotTSAgICAgIEVbKCAgICAgICAgICAgICBGNCggICAgICAgICAgICAgRkIoICAgICAgICAgICAgIEdAKCAgIAotTSAgICAgICAgICBILSggICAgICAgICAgICAgSSEoICAgICAgICAgICAgIEktKCAgICAgICAgICAgICBKKAotTSggICAgICAgICAgICAgSlMoICAgICAgICAgICAgIEtEKCAgICAgICAgICAgICBLTyggICAgICAgICAgIAotTSAgS1ooICAgICAgICAgICAgIEw+KCAgICAgICAgICAgICBMTSggICAgICAgICAgICAgTSsoICAgICAgIAotTSAgICAgIE05ISAgICAgICApNCAgICBNQiEgICAgICAgKTQgICAgTVE5ICAgICAgICk0ICAgIE46OSAgIAotTSAgICApNCAgICBOU0AgICAgICAgICAgICAgTzVAICAgICAgICAgICAgIE9HQCAgICAgICAgICAgICBQLgotTUAgICAgICAgICAgICAgUEdAICAgICAgICAgICAgIFElQCAgICAgICAgICAgICBRQ0AgICAgICAgICAgIAotTSAgUV1AICAgICAgICAgICAgIFI/QCAgICAgICAgICAgICBTIkAgICAgICAgICAgICAgUz9AICAgICAgIAotTSAgICAgIFNbQCAgICAgICAgICAgICBULUAgICAgICAgICAgICAgVEBAICAgICAgICAgICAgIFRYQCAgIAotTSAgICAgICAgICBVJEAgICAgICAgICAgICAgViJAICAgICAgICAgICAgIFcmQCAgICAgICAgICAgICBYNAotTUAgICAgICAgICAgICAgWStAICAgICAgICAgICAgIFk4QCAgICAgICAgICAgICBZQkAgICAgICAgICAgIAotTSAgWU1AICAgICAgICAgICAgIFo2QCAgICAgICAgICAgICBaXEAgICAgICAgICAgICAgWzEpICAgICAgIAotTSk0ICAgIFtHKCAgICAgICAgICAgICBbXikgICAgICAgKTggICAgXDQhQCAgICAgIiAjUCAgIFxDKSAgIAotTSAgICApOlggICBcTiEgICAgICAgKTxAICAgXFYhICAgICAgICk8QCAgIF0lOSAgICAgICApPEAgICBdTgotTTkgICAgICAgKTxAICAgXidAICAgICAgICAgICAgIF5JQCAgICAgICAgICAgICBeW0AgICAgICAgICAgIAotTSAgX0JAICAgICAgICAgICAgIF9bQCAgICAgICAgICAgICEgOUAgICAgICAgICAgICAhIFdAICAgICAgIAotTSAgICAgISExQCAgICAgICAgICAgICEhU0AgICAgICAgICAgICAhIjZAICAgICAgICAgICAgISJTQCAgIAotTSAgICAgICAgICEjL0AgICAgICAgICAgICAhI0FAICAgICAgICAgICAgISNUQCAgICAgICAgICAgICEkLAotTUAgICAgICAgICAgICAhJDhAICAgICAgICAgICAgISU2QCAgICAgICAgICAgICEmOkAgICAgICAgICAgIAotTSAhJ0hAICAgICAgICAgICAgISg/QCAgICAgICAgICAgICEoTEAgICAgICAgICAgICAhKFZAICAgICAgIAotTSAgICAgISkhQCAgICAgICAgICAgICEpSkAgICAgICAgICAgICAhKjBAICAgICAgICAgICAgISpFKCAgIAotTSAgICAgICAgICEqWSggICAgICAgICAgICAhKzYoICAgICAgICAgICAgIStIISAgICAgICApPEAgICErTAotTTkgICAgICAgKTxAICAgICAxICNfX1AgICk8QCAgIStTISAgICAgICApPEAgICErXSEgICAgICAgKUQgIAotTSAhLCQhICAgICAgIClIQCAgISwuISAgICAgICApTEAgICEsNiEgICAgICAgKUxAICAhLDohICAgICAgIAotTSlNQCAgISxCISAgICAgICApTiAgICEsSyEgICAgICAgKU8gICAhLFMhICAgICAgIClPICAgISxcISAgIAotTSAgICAqVkAgICEtKyEgICAgICAgKlxAICAhLTMhICAgICAgICpdICAgIS1AISAgICAgICAqXSAgICEtSgotTSEgICAgICAgKzRAICAhLVMhICAgICAgIC03ICAgIS1cISAgICAgICAtOkAgICEuJiEgICAgICAgLVogIAotTSAhLiwhICAgICAgIC1aICAgIS41ISAgICAgICAuJyAgICEuPSEgICAgICAgLicgICAhLkEhICAgICAgIAotTS4oICAgIS5JISAgICAgICAuKCAgICEuTSEgICAgICAgLikgICAhLl0hICAgICAgIC4pICAgIS8hISAgIAotTSAgICAuKiAgICEvLyEgICAgICAgLiogICAhLzMhICAgICAgIC4rICAgIS87ISAgICAgICAuKyAgICEvPwotTSEgICAgICAgLiwgICAhL0ohICAgICAgIC4sICAgIS9OISAgICAgICAuLSAgICEvWyEgICAgICAgLi0gIAotTSAhL18hICAgICAgIC4uICAgITAmISAgICAgICAuMUAgICEwMSEgICAgICAgLjYgICAhMDshICAgICAgIAotTS43ICAgITBFISAgICAgICAuQUAgICEwUCEgICAgICAgLkMgICAhMFghICAgICAgIC5HICAgITEiISAgIAotTSAgICAvMEAgICExKiEgICAgICAgLzkgICAhMTMhICAgICAgIC8+ICAgITE8ISAgICAgICAzX0AgICExSQotTSEgICAgICAgM19AICAhMVEhICAgICAgIDQjQCAgITFaISAgICAgICA0KSAgICEyIyEgICAgICAgNCsgIAotTSAhMiohICAgICAgIDQ1QCAgITIzISAgICAgICA0SEAgICEyPCEgICAgICAgNEtAICAhMkghICAgICAgIAotTTgwQCAgITJRISAgICAgICA4MkAgICEyWiEgICAgICAgODVAICAhMyMhICAgICAgIDg5ICAgITMsISAgIAotTSAgICA4P0AgICEzNyEgICAgICAgOF1AICAhM0IhICAgICAgIDlCICAgITNRISAgICAgICA8VkAgICE0IAotTSEgICAgICAgPikgICAhNCohICAgICAgID4/QCAgITQ1ISAgICAgICA+SkAgICE0RCEgICAgICAgQCsgIAotTSAhNFMhICAgICAgIEInICAgITRfISAgICAgICBCSSAgICE1JiEgICAgICAgQkkgICAhNSohICAgICAgIAotTUJKICAgITUzISAgICAgICBCTyAgICE1PSEgICAgICAgQlMgICAhNUQhICAgICAgIEJTICAgITVIISAgIAotTSAgICBCVCAgICE1USEgICAgICAgQl0gICAhNVohICAgICAgIEJfQCAgITYjISAgICAgICBDISAgICE2KwotTSEgICAgICAgQycgICAhNjQhICAgICAgIEMuICAgITY9ISAgICAgICBDMEAgICE2RyEgICAgICAgQzQgIAotTSAhNlQhICAgICAgIEM0ICAgITcjISAgICAgICBDNCAgICE3LCEgICAgICAgQzQgICAhNzAhICAgICAgIAotTUM1ICAgITc5ISAgICAgICBDPkAgICE3QCEgICAgICAgQz5AICAhN0QhICAgICAgIEM/QCAgITdOISAgIAotTSAgICBDSiAgICE3VyEgICAgICAgQ0ogICAhOCAhICAgICAgIENKICAgITgkISAgICAgICBDSyAgICE4KAotTTkgICAgICAgQ0sgICAgICAxICNfX1AgIENLICAgITgvITAgI0ggICApRCAgICE4NSBQICAgICAgICAgIAotTSAhOD8hMCAlI0AgICgiICAgIThFITAgICAgICAoVjggICE4SyEwICM4QCAgKElAICAhOFchMCAmWEAgIAotTSlNQCAgITheIVAgJTxAICIgICAgICE5JyEwICQwICAgKTxAICAhOS8hMCAjSSAgIChJQCAgITk7ITAgIAotTSAgICAoSiAgICE5SCEwICAgICAgKEpYICAhOVwhMCAgICAgIChLUCAgIToyITAgICAgICAoTEggICE6QAotTSEwICAgICAgKE1AICAhOlUhMCAgICAgIChOOCAgITssITAgICAgICAoTzAgICE7OCEwICAgICAgKFAoIAotTSAhO0shMCAgICAgIChRICAgITwgITAgICAgICAoUVggICE8LSEwICAgICAgKFJQICAhPEEhMCAgICAgIAotTShTSCAgITxXITAgICAgICAoVEAgICE9JSEwICAgICAgKFU4ICAhPTQhMCAgICAgICk6WCAgIT08IjAgIAotTSAgICJMJSAgICE9RCIwICAgICAiTCUoICAhPVMiMCAgICAgIkwlMCAgIT4kIjAgICAgICJMJTggICE+LQotTSIwICAgICAiTCVAICAhPj0iMCAgICAgIkwlSCAgIT5PIjAgICAgICJMJVAgICE+ViIwICAgICAiTCYgIAotTSAhPyQiMCAgICAgIkwmMCAgIT80IjAgICAgICJMJkAgICE/PCIwICAgICAiTCZQICAhP0siMCAgICAgIgotTUwnICAgIT9cIjAgICAgICJMJzAgICFAJSIwICAgICAiTCdAICAhQC8iMCAgICAgIkwoICAgIUA9IjAgIAotTSAgICJMKCggICFAUiIwICAgICAiTCgwICAhQSkiMCAgICAgIkwoQCAgIUE4IjAgICAgICJMKFAgICFBTgotTSIwICAgICAiTCkgICAhQiYiMCAgICAgIkwpQCAgIUIzIjAgICAgICJMKiAgICFCRyIwICAgICAiTCpAIAotTSAhQl0iMCAgICAgIkwrICAgIUMrIjAgICAgICJMK0AgICFDQCIwICAgICAiTCwgICAhQ1ciMCAgICAgIgotTUwsQCAgIUQmIjAgICAgICJMLSAgICFENiIwICAgICAiTC4gICAhREYiMCAgICAgIkwuMCAgIURdIjAgIAotTSAgICJMLkAgICFFNiIwICAgICAiTC5QICAhRUciMCAgICAgIkwvICAgIUVfIjAgICAgICJMLzAgICFGOQotTSIwICAgICAiTC9AICAhRkgiMCAgICAgIkwvUCAgIUZeIjAgICAgICJMMCAgICFHNiIwICAgICAiTDAwIAotTSAhR0YiMCAgICAgIkwwQCAgIUddIjAgICAgICJMMFAgICFINiIwICAgICAiTDEgICAhSEciMCAgICAgIgotTUwxMCAgIUhZIjAgICAgICJMMUAgICFJIiIwICAgICAiTDFQICAhSS4iMCAgICAgIkwyICAgIUk5IjAgIAotTSAgICJMMjAgICFJQiIwICAgICAiTDJAICAhSUoiMCAgICAgIkwzICAgIUlSIjAgICAgICJMPCAgICFJWwotTSIwICAgICAiTDxAICAhSiUiMCAgICAgIkw9ICAgIUowIjAgICAgICJMPyAgICFKOyEwICAgICAgKTQgIAotTSAhSk4iMCAgICAgIkxAQCAgIUpdIVAgICAgICIgI0AgICFLLiFQICAgICAiICQgICAhS0AhMCAgICAgIAotTSk4ICAgIUtTIjAgICAgICJMQSAgICFMIiEwICY9ICAgKUhAICAhTCshMCAgICAgIClMWCAgIUwyITAgJgotTVkwICApPEAgICFMPiEwICI+ICAgKlxAICAhTEQhMCAlJkAgICpWQCAgIUxRITAgI0VAICApTyAgICFMWwotTSIwICdCMCAiTEFAICAhTSshMCAmSlAgICtQQCAgIU0zITAgKCcgICApTiAgICFNOiFQICdFUCAiICQwIAotTSAhTUEhMCAkVzAgICo+OCAgIU1KITAgIjlAICApXyAgICFNUyEwICM+MCAgLCFYICAhTVkhUCAlXkAgIgotTSBJMCAgIU4hITAgJjMgICApWTAgICFOKSEwICQ5ICAgKkgoICAhTjMhMCAgL0AgICo2KCAgIU49ITAgIAotTSAgICAuKDggICFORCEwICUpUCAgKlQgICAhTk4hMCAgICAgIC4nOCAgIU5VITAgJyxQICAtNyAgICFOXQotTSEwICYgMCAgKVA4ICAhTyUhMCAlOjAgIC1SICAgIU8tIjAgIyggICJKWlAgICFPMyFQICM8QCAiICRQIAotTSAhTz4hMCAkNTAgICpeQCAgIU9IIVAgJkBQICIgJUAgICFPWiFQICU1MCAiICYgICAhUCEhUCAmSjAgIgotTSAmMCAgIVAqIVAgI1JQICIgJVAgICFQOyFQICM/QCAiICUwICAhUEwhUCAmO1AgIiAlICAgIVBfITAgJwotTVVQICAtWiAgICFRJyEwICMuICAgKl0gICAhUTMhMCAlSSAgIC43ICAgIVE8ITAgJCowICAuQyAgICFRRAotTSEwICJMQCAgLkFAICAhUU4iMCAjSiAgIkxBUCAgIVFcIVAgIytAICIgSVAgICFSIiEwICYtUCAgLDhIIAotTSAhUishMCAjUDAgIC4uICAgIVIxITAgICAgICAuKjggICFSPiEwICZcMCAgLzBAICAhUkUhUCAjUEAgIgotTSArQCAgIVJOIVAgIzMwICIgJyAgICFSWiFQICcsQCAiICsgICAhUyEhUCAiSEAgIiArMCAgIVMqITAgIAotTSAgICAuKzggICFTMSEwICQ/QCAgLTpAICAhUzshMCAgICAgIC4pOCAgIVNKITAgIkhQICAtQ1AgICFTWAotTSEwICQ1UCAgLU0oICAhVCQhMCAlOlAgIC85ICAgIVQsIjAgJz9QICJMQiAgICFUNiEwICAgICAgLi04IAotTSAhVEIhMCAnPiAgIC4xQCAgIVRNITAgI0hQICAuNjggICFUViEwICAgICAgLiw4ICAhVSAiMCAgICAgIgotTUxUUCAgIVUlIVAgIC8wICIhMVAgICFVLCEwICAqMCAgLkcgICAhVTQhMCAkVTAgIC5LQCAgIVU/ITAgIgotTT9AICAvPiAgICFVSCIwICNeQCAiTEogICAhVVEhUCAoPlAgIiE9MCAgIVVbITAgJz5QICAzX0AgICFWIgotTSEwICZeUCAgLzxQICAhVikhMCAjPDAgIDQrICAgIVYvITAgIDVAICA4NUAgICFWNyFQICJRUCAiIT1QIAotTSAhVkAhMCAmVCAgIDRIQCAgIVZIITAgJyMgICA0I0AgICFWUCEwICEmQCAgQjQ4ICAhVlshMCAoQiAgIAotTThMWCAgIVclITAgICJAICA4MEAgICFXLSEwICU0ICAgN0M4ICAhVzkhMCAjXyAgIDMuSCAgIVdEITAgIAotTSkgICA0KSAgICFXTCEwICVRUCAgPikgICAhV14hMCAhRkAgIEJDUCAgIVgpITAgIDpAICA5OlggICFYMwotTSEwICBGQCAgQicgICAhWD4hMCAoIiAgIDg/QCAgIVhIITAgIiUwICAzR1ggICFYUSBQICQ2XiAgICAgIAotTSAhWFshMCAmXCAgIDQ+QCAgIVkkITAgJihAICA0QyggICFZLSEwICVRMCAgNEYoICAhWTYhMCAoITAgIAotTTRHQCAgIVk/IjAgJFNAICJMSjAgICFZTCEwICU+ICAgNDtAICAhWVYhMCAmTTAgIDQ9ICAgIVlfITAgJQotTVUwICA0QCAgICFaKCEwICcoQCAgNDcgICAhWjEhMCAmJUAgIDRESCAgIVo6ITAgJlZAICA0QUAgICFaQwotTSEwICVNUCAgNDVAICAhWkwhMCAlUCAgIDQ6ICAgIVpVITAgJklAICA0OEAgICFaXiEwICAgICAgQkk4IAotTSAhWyQhUCAnQkAgIiIkMCAgIVsrITAgJVAwICA1USAgICFbPCIwICFZMCAiTEsgICAhW0chMCAiXyAgIAotTTdEMCAgIVtUITAgKEcgICBCXSAgICFbXCIwICdPUCAiTEwgICAhXCYhMCAlUVAgIDRLQCAgIVwxITAgIAotTTUwICA4OSAgICFcOSEwICY+MCAgOCkoICAhXEchMCAgNlAgIDVXKCAgIVxaITAgJllQICBCVCAgICFdIgotTSIwICVcMCAiTE0gICAhXSwhMCAgJEAgIDgyQCAgIV00ITAgICAgICBCUzggICFdOiEwICgxMCAgNlk4IAotTSAhXUYhMCAgKDAgIEJfQCAgIV1OIVAgJlogICIhTjAgICFdXiFQICNVICAiIVAgICAhXikhMCAmOCAgIAotTUMnICAgIV4xIVAgIjcgICIiICggICFeOiEwICBTUCAgQzBAICAhXkMiMCAgSEAgIkxTUCAgIV5RIjAgJwotTT0gICJMVCAgICFfKCIwICBIMCAiTFQwICAhX0AiMCAjRCAgIkxUQCAgIV9XITAgJEVAICA8RTggICIgKgotTSEwICM9QCAgOT9YICAiIDAhMCAmTiAgIDhdQCAgIiA3ITAgKEIgICA5UyAgICIgUiEwICU3MCAgPys4IAotTSAiISkhMCAnXiAgIDlCICAgIiE4ITAgJEggICBAMyggICIhUCEwICY0QCAgOi4oICAiIiwhMCAjVFAgIAotTTxWQCAgIiI7ITAgIDFAICBCTyAgICIiRCEwICEzICAgQC0oICAiIlUhMCAmICAgID9ISCAgIiMtITAgJwotTSggICBALlggICIjRSEwICVQUCAgPTdAICAiI1UhMCAkNlAgID0sICAgIiQkITAgJUcgICA8TTAgICIkOgotTSEwICdPICAgOltIICAiJFAhMCAmQyAgID9cSCAgIiUsITAgIFhQICA9VDAgICIlPyEwICZXUCAgPUooIAotTSAiJVEhMCAkLiAgID0zSCAgIiYgITAgIkcgICA9KkggICImMyEwICclMCAgPj9AICAiJjohMCAiKiAgIAotTT4sWCAgIiZVITAgIFkgICA+NEAgICInMCEwICFBMCAgPkQgICAiJ0YhMCAhOCAgID5GUCAgIidcITAgIAotTTIgICA+QFAgICIoLiEwICA3ICAgPkpAICAiKD0hMCAjMDAgID85QCAgIihRITAgJiowICA/JUggICIpJwotTSEwICgrUCAgP0AwICAiKUIhMCAjJyAgID8xOCAgIilWITAgJiEgICA+XTAgICIqLCEwICUrICAgPlVIIAotTSAiKkAhMCAlRSAgID5NWCAgIipOITAgIS4gICA+WjggICIrISEwICMhQCAgPlZYICAiKzUhMCAmKkAgIAotTT5SICAgIitFITAgJF8gICA+TlggICIrUyEwICVPICAgP1UgICAiLCQhMCAoJiAgIEJKICAgIiwsIVAgJwotTVlAICIsKyAgICIsSyFQICNKICAiQkFIICAiLSwhUCAnOCAgIj1EMCAgIi1MIVAgKDxAICIsKSAgICIuIwotTSFQICVYICAiQjYoICAiLjwhUCAoPyAgIj1DQCAgIi5UIVAgIU1AICIiVTggICIvJSFQICRSQCAiPUlQIAotTSAiLzghUCAjSEAgIj1CWCAgIi9KIVAgJlNAICIiVTAgICIvXyFQICdbQCAiPUlIICAiMDYhUCAlLSAgIgotTT1CUCAgIjBMITAgI1gwICBAKyAgICIxJCEwICZWICAgQyEgICAiMSshUCAoRVAgIj1AQCAgIjFCIVAgJgotTSEwICJIPTggICIxWyFQICAgUCAiPUc4ICAiMjMhUCAhVlAgIiwtICAgIjJEIVAgJFtQICJCTSggICIyVwotTSFQICNRUCAiPUUgICAiMykhUCAmXFAgIiwsWCAgIjM+IVAgKCRQICJCTSAgICIzVSFQICU2MCAiPURYIAotTSAiNCshMCAnSEAgIEMuICAgIjQzITAgICAgICBDPlggICI0OSEwICdOICAgQzUgICAiNEEhMCAgICAgIAotTUM0OCAgIjRJITAgIztAICBDP0AgICI0UiFQICVQQCAiSEgwICAiNF8hMCAgICAgIENKOCAgIjUnIVAgIgotTUZAICJIXyAgICI1MSEwICAgICAiICAgICAiNTghUCAgICAgIkpaUCAgIjU/IjAgICAgICJMVFAgICI1RQotTStWUUk4Ql1DPEcwUCtGXCArVlFJOEJdLThXKVQsMllPICY9RDhGVUUrRlwgOVYtQyxFXUM7VlVQOjZRRQotTTkiWCArVi1ZOVZFTj0iXVA7JiVZK1Y5TjlCXUQ5NzlPK1Y9RDhHMUU8VzBPPSMkUCtQIUc5JilNOTJZQwotTSAmRU49I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUgotTS5TIFssMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVwotTS5QIVU7Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWgotTT0jNF08QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTgotTTlSIUw7VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXQotTTxDJFssI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUQotTS5QIVM6Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWgotTT0jJFEvNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUQotTS5TQFssI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUwotTT0nKVU4VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQgotTTk3KFotQlBRLUJQUS1DTTwgJzk/OjZZVDdWVUU7NilFPENIUSsjLFIrIyxSLlc5PzsmXU45VV1NOTZVQgotTTk3KFosUlBWLSJQUyxDTTwgJzk/OUZRTzg3MT87NjVNOEY1Ui5DJFIrI0RWKyMsUi5XOT85Jl1VOEZRRQotTTdWVUU7NilFPENIUSxSUFEsQ0BMLUMwWy5QIVQ3VzVOOjZdTi5FMFEtU1VVLic5PzhWQUE8RV1NOTZVQgotTTk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaLUJQUCsjJFYuVVAgPUVdSTtHMT87NjVNOEY1UgotTS5DJEwsIlBTLENNVjdWUU87Rj0/OzY1TThGNVIuQyxMLCJQUyxDTTwgJzk/OUZRTzg3MT87NjVNOEY1UgotTS5DJFIrIyBMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSLkMkUysjIEwtQzBbLlAhVjdWLUg4Nyk/OUc1TgotTThTSSYsQCFWN1ctSTlWWUU5JV1DOiYlUjdWOVU7RixaMUMkUCAnOT89NllTOjY9Tjk2MT84VkFBPEVdRgotTT02WUMuRDhRLDAhVjdXLUg7VylUN1Y5VTtGLFoxQzggPUVdUzo2PU45NjE/PFZBTzxHMT85RzVOOFNJJgotTS1AIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RixaMUNAID1FXUk7RzE/OUc1TjhTSSYsMCFWN1ctSQotTTlWWUU5JV1JO0cxPzlHNU44U0kmLDAhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQy5EOFQgJzk/OyZdTgotTTlVXUY9NllDLkQ4UyAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhTSSYsUCFWN1c1TjxWRUc7RjVEN1ZRTwotTTtGPT85RzVOOFNJJi0wIVY3VjlMO1YlVDdWOVU7RixaMUMkUiAnOT85Jl1VOEZRRTdWOVU7RixaMUMkUwotTSAmUUk7RkxaNSMkWC83LFEtMylOOTdBVC5DJFkvMkhRLiJQUCsjLFIuVlFJO0ZNRj02WUMuQyhQLzJIUgotTSwzVUYsM0RMLFMoTCxTKFs3ICFTPSc1RjlDSFIsQ1VBPEMkWywjTFAuUyhTLzYlUiwzTFAuUyRbLEMwXQotTTg3KFEuUyBbLENMUS1CUFYtIlBRLDM0Ui5TTCA9JzU/OyZFTjpTSTQsQzRdPTMkVC0mWUU+JzBaLDNETAotTSwiUFMsQ01MOjZZSzlHNU44U0hSLCJQUCsjLFIuVVAgPFcxVTlGOFosQyhMLCJQUSwzNFIuU0wgOFZdTAotTTtXKVMuRTBSLUNVRT42NUw7Jl1XLkMgTDwnNVI8JlFFLkMkTDwmRU46U0hSKyNMIDhWJVI8U0k0LEM8XQotTTk2KU09U0hQKychTzxHLUM6JjRaLDJQWyAmKU87VlFFODZYWj0jKFgvNjUmMDRRMzEzSFArJTEyNTQ0WgotTSwyUFsgJilWODZRUy5FMFIuM1VFOUYlTDxWNFosIlFUPEc1RS5DJEwuUCFCO1ZdTDk2JU4sQ0lULENEIAotTTs2RVM7VylEOTcpRTkjSTQsUyBdOTcxVztTSFIrJl1OOTNIUSsnSUU8RlxaLCJRVDonKUU5M0hTKyNMIAotTTs2JUk7Q0kmLDAhVjdWLUg4NyhaMVMoID1FXVM6Nj1OOTYxPzhWQUE8Q0knLDMgID1FXVU7Ry1JOVZZRQotTTklXUM6JiVSLkQ8USwwIVY3Vy1IO1cpVC5EPFYgJzk/PFZFRztGNUQ3Vy1IO1cpVC5EPFYgJzk/PTZZUwotTTo2PU45NjE/PFZBTzxHMFoxU0AgPUVdSTtHMFoxUyQgPUVdUzo2PU45NjE/OjZZVC5EPFEgJzk/PTZZUwotTTo2PU45NjE/OjZZVC5EPFQgJzk/OyZdTjlTSScsUCFWN1ctSTlWWUU5JV1MO1ZZRy5EPFMgJzk/PTZZUwotTTo2PU45NjE/OyZdTjlTSSctMCFWN1Y5TDtWJVQuRDxRLEAhVjdWMU89NilMOTNJJywzLCA9RV1DOiYlUgotTTdWJVI8RiVZLkQ8UywzVUE8QyRbLCNMUS5TKCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+M0knLFMoXQotTTg3KFEuUyBbLDNMUSwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0RaMVMsUy82JVIsM0xQLlMkWwotTSwzJCA9RV1TOiZdUj0lXUE8RylBPjNJJyxTMF04NyhRLlMgWywzTFYgJzk/PFZFRztGNUQ3Vy1IO1cpVAotTTdWJVI8RiVZLkQ8Uy0gIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZLkQ8Uy0zVUE8QyRbLCNMUQotTS5TQCA9RV1JO0cxPzg3KVI4N0RaMVMsVi82JVIsM0xQLlMkWywwIVY3Vy1JOVZZRTklXUk7RzE/ODcpUgotTTg3RFoxUyxWICc5Pz02WVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWS5EPFMtU1VBPEMkWywjTFEuUzAgPUVdTAotTTtWWUc3ViVSPEYlWS5EPFMuI1VBPEMkWywjTFEuUywgPUVdUzo2PU45NjE/OyZdTjlVXUE8RylBPjNJJwotTSxTQCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZLkQ8Uy4zVUE8QyRbLCNMUS5TNCA9RV1GOyZdQQotTT0lXUE8RylBPjNJJy0jIF04NyhRLlMgWywzTFEsQCFWN1YxTz02KUw5NV1BPEcpQT4zSSctIyRdODcoUQotTS5TIFssM0xRLFAhVjdWLUg4Nyk/PCZdSTtHMUU8Q0knLSMoXSpDKCA9RV1TOjY9Tjk2MT84VkFBPEVdUAotTTtWRU49JjVSLkQ8VCxTVEosMyAgPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KFoxUzBULzJIUQotTSwwIVY3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUvMkhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVAotTTk3KFoxUzBVICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8Q0knLSM4XSpDQCA9RV1JO0cxPwotTTwmXUk7RzFFPENJJy0jPF0qQyQgPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoWjFTMFcgJzk/PTZZUwotTTo2PU45NjE/OjZZVDdXIU86NllUOTcoWjFTMFgvMkhUICc5PzsmXU45VV1QO1ZFTj0mNVIuRDxULjNUSgotTSxQIVY3Vy1JOVZZRTklXUw7VllHN1chTzo2WVQ5NyhaMVMwWSAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUAotTTtWRU49JjVSLkQ8VSwjVEotMCFWN1Y5TDtWJVQ3VyFPOjZZVDk3KFoxUzRRLzJIUSxAIVY3VjFPPTYpTAotTTk1XVA7VkVOPSY1Ui5EPFUsQ1RKLDMsID1FXVM9JylVOFcwUS5EPFEtQCFWN1ctVDxHNUM9IyhaMVM0UwotTS83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFotQlBRLUJQUQotTS1DTTwgJzk/OjZZVDdWVUU7NilFPENIUSsjLFIrIyxSLlc5PzsmXU45VV1NOTZVQjk3KFosUlBWLSJQUwotTSxDTTwgJzk/OUZRTzg3MT87NjVNOEY1Ui5DJFIrI0RWKyMsUi5XOT85Jl1VOEZRRTdWVUU7NilFPENIUQotTSxSUFEsQ0BMLUMwWy5QIVY3VzVOOjZdTi5EPFEtUCFWN1c1Tjo2XU4sQ0knLTMwXT0zQVY3Vi1IODcpPwotTTs2NU04RjVSLkMoTCwiUFguVzk/PFZBTzxHMT87NjVNOEY1Ui5DOEwsIlBRLUNNPCAnOT86NllUN1ZVRQotTTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUU7NilFPENIUysjIEwsUyhbNyAhVjdWOUw7ViVUN1ZVRQotTTs2KUU8Q0hRLEJQUCsjLFIuVzk/OSZdVThGUUU3VlVFOzYpRTxDSFEsUlBQKyM4VC5TTCA8VV1MOjZZSwotTS5EPFEuMCFVN1ZRSTtGTFoxUyhVICchUjo2VUE8R0RaMVM0VS82NVI5NjBaLCJRRzxGNUU7Q0hRKyYpTAotTT02NFosQlBbICZZTztHIVI6NlVBPEdEWjFTKFYgJi1MPTZZSzk3KFoxUzRWLzY1QzomNVY+M0hQKyY5TwotTTxGMFosMlBbICctUDtXKVQ8Vi1BPENJJyxDPCA3VV1NODZFTitGXCA5Vi1DLEVdQztWVVA6NlFFOSJYIAotTStXLUU7RjFBOjJdQThGLE88RkVDOiJdTDg3MUU8VzBPO1YpSjkmRVIrNy1VO0MsTzlWLUMrUCBOK0JcTgotTStCXUQ5NzlPK1Y9QzhSXUw6NilHOFYsUitGLCA6NllULkcwUS83KFEuUlRSLDMwVy0jQFMtQzBYLlMoUQotTS0jPFQuIyxWLSM8WyAmLUg4NyhaPSMoXTxDKFssI0xRLEM8WyAmUU87RjxAOjZZVC5HMFMvNyhRLlJUUgotTSwzMFctI0BTLUMwWC5TKFEtIzxULiMsVi0jPFsgJzVOPFZFRztGNUQoJkVOPSNJVC0jVVIsM0xQLlJUUQotTS5QIUw7VllHKCc1TjxWRUc7RjVEKCZFTj0jSVQtM1VSLDNMUC5SVFEuUCFTOiZdUj0iIUk7RzBaPSM4XQotTTxDJFsrMyxSLVM4WC5TLFItUzhXLlAhTDtWWUcoJlFPO0Y8QDo2WVQuRzBXLzcoUS5TIFsrMyRbICctSAotTTtXKVQoJzVOPFZFRztGNUQoJkVOPSNJVC4jVVIsM0xQLlM4VS0zLFUuUCFMO1ZZRygmUU87RjxAPTZZUwotTTo2PU45NjBAOjZZVC5HMFkvNyhRLlMgWyszJFsgJy1JOVZZRTkiIUM6JiVSLkcwUSwjVVIsM0xNLDMoWAotTS5TJFItU0wgPTZZUzo2PU45NjBAOFZBQTxDSVQsMyRdPEMkWywjTFItMzRbICY5TDtWJVQuRzBRLENVUgotTSwzTFQuUyBbICYxTz02KUw5M0lULDMsXTxDJFsuI0xQLlAhTDtWWUcoJjFPPTYpTDkzSVQsMzBdPEMkWwotTS4jTFAuUCFWO1ZFRC5HMFEtM1RRLTAhUjk2PT84VlFBPFcsWjUjJFYvNjUuM1VdMjE0PTMuQyBMMyRdPwotTTFFISE3VSklMVUsWiwyUSY0JCU/NEQ1JzRTSFIrJDkwN1UpJTFVLFosUlE8ICQ5MDdUXTI3VDkwMDVdMgotTTE0PTMuQzBMMSQlNDA1XTIxND0zLkM0TDEkJTQwNV0vNEVdJjQkJT80RDUnNFNIViskMSE1JCU/M1UpPwotTTFFIT80RDUnNFNIVyslUCAxJCU0MDVdLzRFXSY0JV0vNEVdJjQkJT80RDUnNFNIWCskJSQxJSk/NEQ1JwotTTRTSFkrJD0lM0Q1MjA0UT80RDUnNFNIUSwiUScxNFklNEQlLDdUXTI3VDkwMDVdMjE0PTMuQyRRKyVQIAotTTFUNS4xNSkhMyVdLzRFXSY0JV0yMTQ9My5DJFIrJCUsMyVdMjE0PTMuQyRTKyRRKTM1XTIxND0/MFRRIQotTTRVLSU0U0hRLSJQWyAnIVQ8RjFJOUY5Pz0jSVQsMCFTOjdJRTdXMFo9IyQgPVYtSDg3KT89I0lULiAhTAotTTtWWUc7Jl1OOVNJNCwzPF08U0FIOjY9SC5DLEwsIlBTLENNTDtXPFosUlBTLEJQUyxDTFsgJlFPO0Y9PwotTTsmXU45U0lULDNAXT0zQVMuQyRXKyMgTC1DMFs7JlBaLVJQUCsjOFQuU0wgOUc1TjhVXVA9JyhaPSMkWQotTS8ySFIsI1VGLDM0IDdVXUQ7VV1HOyZdQjg2UT85JzFPPEcsWjFDJFUgJV1FPiZFVDdWMVU7NlVZN1cpRQotTTlDSScsQyRdKkMkIDdVXUQ7VV1HOyZdQjg2UT84VzFPPEcsWjFDJFUgJV1JO0ZFVDo2JUw6N0lFOSJYUAotTSAlXT87NiVJO0NJJiwzNCA3VjVYOjcwTjtQIUc4VixSN1YtTzs3IUk7JjVEK0AgTzxWNU45JiVJK1YlQgotTThSXVI6Ni1IK1ZRQT0mNVM9Il1POEZJRDo3KE08VzVOLFJdRzhWLE8gIlhOK1JYTitWMUU9RlxPOVYtQwotTStWUUk4Rj1DOFMoTjhQIUk7RzBaPSMkXTxDJFsrMyhRLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMIAotTThWQUE8Q0lULENVUixDTFAuUyRSLVNMIDsmXU45UiFJO0cwWj0jLF08QyRbKzMoUS0jPFQuIyxWLSNAWwotTSxDJFQtUzBYLFM4VC1TTCA9NllTOjY9Tjk2MEA6NllULkcwVC83KFEuUyBbKzMkWyAmUU87RjxAPTZZUwotTTo2PU45NjBAOjZZVC5HMFUvNyhRLlMgWyszJFsgJy1IO1cpVCgmRU49I0lULUNVUiwzTE0sUyhXLUNAWwotTSxTKFctQzxbICZRTztGPEA7Jl1OOVIhSTtHMFo9IzxdPEMkWywjTE0sM0wgPFZBTzxHMEA9NllTOjY9TgotTTk2MEA6NllULkcwWC83KFEuUyBbLUM0VSxTNFsgJlFPO0Y8QDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWgotTT0jRF08QyRbLCNMTSwzTCA8VkVHO0Y1RCgmLUg4NyhaPSMkUC83KFEuUlRRLENAWywzKFcuUCFVO0ctSQotTTlWWUU5IiFDOiYlUi5HMFEsM1VSLDNMUC5TKFUtM0wgOUZRTzg3MFo9IyRSLzcoUS5TMFssI0wgOSZdVQotTThGUUUuRzBRLFNVUiwzTFguUyBbICZRTztGPEA5Jl1VOEZRRS5HMFEtI1VSLDNMWC5TIFsgJzlPOjYwWgotTT0jJFUvMyRVICcpRTlVXUM7JiVTPFNJNCwzOF05NFkvN1UpJTFVLFosIlEsM1VdJjQkJT80RDUnNFNIUQotTSskOTAwNV0yMTQ9My5DKEwxRSE/NEQ1JzRTSFMrJVAgMUUhPzNVKT8xRSEhN1UpJTFVLFotIlEkMDUxIQotTTdVKSUxVSxaLTJRJDA1MSE3VF0yN1Q5MDA1XTIxND0zLkM4TDEkJTQwNV0vNEVdJjQlXTIxND0zLkM8TAotTTcgISQwNTEhN1RdMjdUOTA3VF0yN1Q5MDA1XTIxND0zLkNATDA0MSQ0RV0yMTQ9My5DREwxVDUuMTUpIQotTTMlXTIxND0zLkMkUCskPSUzRDUyMDRRPzNVKT8xRSEhN1UpJTFVLFosMyRMNyAhJzE0WSU0RCUsN1RdMgotTTdUOTA3VSklMVUsWiwzKEwwNFEsN1UpJTFVLFosMyxMMyRFLTdVKSUxVV0jMyQlMzRUNTMuQyRUKyNMIAotTTwnMVI5JkVGOUVdVC5HMFEgJy1JPkY1Pz0jSVQsMCFXOFZBQTxFXVQuRzBYICZRTztGPUw7VllHLkUwUQotTS1TVVMuJkFJOVZAWixSUFArIyxSLlZRTz1TSFMrIyxSKyMsUi5TTCA7Jl1OOVVdTDtWWUcuRzBRLiNVVQotTS4nLFosMzxMLCJQVi0jTUw7I0hXKyMgTC1DMFsuUCFGPTZZQzdXIVQ8Q0lULDNEXSpDKFAvNjhRLTAhPwotTTk3QUk9JV1EPTZVTT41XUQ5Ni1MLkQ8USAlXT8wVTEvNEVdLDI1LTQ3VVxaMVMoUS82JVIsM0xQLlMkWwotTSwzRCA3VV0kNSRdMjdUUSk0VTE/N1NJJyxDJCArNlFHICZRSThGPE48UCEtPFc9ST0mLUgrRlwgOTdBSQotTT0iWU8gJl1ON1Y1WDo3ME47UCFXPEZFVDkyWU8gJjVSPEAhPzk3QUk9IllPICYtRTxHKU88QllPICY1UgotTTxGWU8rRlwgOUZRUzhHNUYrRlwgOUZRTzg3MT88Vz1JPSYtSCtGXCAzNkVOOjcwTjtQIUY8JV1HOyZdQgotTTg2UVMrRlwgOzZFTjo3MUY8IllPICZVQTsmUU84UllPICZFUzg3MVQ+MllPICY5STtGMUk7VyBOO1AhSQotTTtWKE47UCFTOjY9Vjk2LE47UCFDOyZdUzkyWU8gJjVSPEAhRjxXMUE9IllPICY1UjxAIUc5NzFEPSYlQgotTTsmNVM6N0lFK0ZcIDk3KVIgJj1FPSchQTlWNVM6N0lFK0ZcIDk3KVIgJkVPOFcxTCtGXCA5NylSICctSQotTTlWKUw7Vi1LK0ZcIDk3KVIgJy1JOVctRT0mVUE8VkxOO1AhRTxHKCA8VilSOlJZTyAnLUk5VzFSODZVUAotTStGXCA3Vy1JOVc5RThSWU8gJjlQPEZFTj0mOE47UCEtOSY1Rjg3NUw9IllPICZVQS4zLU4rRlwgOUchPwotTTxWJVY5MllPICYpQztXIVkrRlwgOFYlTDsmXUMrRlwgOSZdUDxGWVQrRlwgOUchPzhWXU07Nl1OPFJZTwotTSAmKVo5NylPK0ZcIDs2NU08VjVUK0ZcIDxXMVI7JjVOK0ZcIDg3MU86MllPICYtVD43IUU3UllPICZVRQotTTs2LUg8QllPICctRT0mUU84ViVMOTJZTyAnLVQ8Ri1IPEJZTyAnLVQ8Ri1NPCJZTyAnLVQ8Ry1QO0JZTwotTSAnLVQ8RzFPOlJZTyAmNUM7VllWOTcpVCtGXCA5Vi1PO0c5RTxHME47UCFEO1c1QjsmNT85JjVDOjZUTgotTTtQIT89NllQODYtSzdWMUI7JjROO1AhPzhGJVM5NV0zK0ZcIDdWKUE8VjU/OjZQTjtQIT88VyFSOjZZVAotTTlFXVM9NyBOO1AhPz0mRU05Ny0/PCZdVzk3KE47UCFROTYtTztHOUU8RzBOO1AhUjk2JUQrRlwgOTcpUgotTSAnIVI6NllUOUJZTyAnLVA8RkVOPSY4TjtQIU88JjVOK0ZcIDk3KVIgJlVFOzYtUD4yWU8gJy1UPEYtQQotTT0iWU8gJy1UPEYtUD4yWU8gJiVCO1cpVCtGXCA5VjVUOTZZVitGXCA8JjVSPEZdUitGXCA8VzFSPCYpUgotTTpSWU8gJV1COjY9PzwmXVc5NyhOO1AhPzxWVUE7JlE/PCZdVzk3KE47UCFHOTcxUDo2ME47UCFFPEcoIAotTTxWRUc7RiVMK0ZcIDpWRUw7IllPICY1UjxAIT88JjVSPEZdUitGXCA5NylSOyctVCtGXCA9VylJPSY1VgotTStGXCA5NylSICJVTDlQIUw6NilHK0csIDdWNVg6NzAgN1VdJDY0WSEzNEUjICctVDg3KVQgJV1NODZFTgotTSAnLVQ4NylUN1Y5TDtWJVQgJV0/OTdBST0gIT85NllWOjcpTztAIS08Vz1JPSYtSCAmOFYuI0BYLDVdVQotTTxWNUQgJV1WN1YtSDg3KT85RzVOOFAhPz1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAlXVY3VzVOPFZFRwotTTtGNUQ3Vi1IODcpPzlHNU44UCE/PUVdUzomXVI9JV1GPTZZQyAlXVY3Vy1JOVZZRTklXVM6Jl1SPSVdRgotTT02WUMgJV1WN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIDdXOT86NllUN1Y5VTtGLCA3Vzk/PFZFRwotTTtGNUQ3VkVOPSVdRj02WUMgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDICVdVjdWUU87Rj0/OUc1TgotTThQIT89RV1TOjY9Tjk2MT87Jl1OOVVdRj02WUMgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAhPwotTT1FXUY7Jl1BPSVdRj02WUMgJV1WN1YxTz02KUw5NV1GPTZZQyAlXT83VlVBOjZYIDdXOT84VkFBPEAhPwotTT1FXVM6Nj1OOTYxPzhWQUE8QCE/PUVdVTtHLUk5VllFOSVdQzomJVIgJV1WN1ctSDtXKVQgJV1WN1ctSQotTTlWWUU5JV1TOiZdUj0gIT89RV1VO0ctSTlWWUU5JV1TOiZdUj0gIT89RV1JO0cwIDdXOT88VkVHO0Y1RAotTTdWRU49ICE/PUVdVTtHLUk5VllFOSVdSTtHMCA3Vzk/OyZdTjlQIT89RV1TOjY9Tjk2MT87Jl1OOVAhPwotTT1FXVU7Ry1JOVZZRTklXUw7VllHICVdVjdWOUw7ViVUICVdVjdWMU89NilMOTAhPz1FXUM6JiVSN1YlUgotTTxGJVkgJV1WN1ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUgotTTg3RCA3Vzk/PFZBTzxHMT84NylSODdEIDdXOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJV1WN1c1TgotTTxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXVY3VkVOPSVdQTxHKUE+MCE/PUVdUzo2PU45NjE/OjZZVAotTTdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT89RV1MO1ZZRzdWJVI8RiVZICVdVgotTTdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgN1c5PwotTTlGUU84NzE/ODcpUjg3RCA3Vzk/OSZdVThGUUU3ViVSPEYlWSAlXVY3Vi1IODcpPzwmXUk7RzFFPEAhPwotTT1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRQotTTxAIT89RV1TOiZdUj0lXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICVdVgotTTdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggN1c5Pzo2WVQ3VyFPOjZZVDk3KCA3Vzk/PFZFRwotTTtGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJV1WN1ZRTwotTTtGPT88Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RAotTTdWUU87Rj0/PCZdSTtHMUU8QCE/PUVdRjsmXUE9JV1QO1ZFTj0mNVIgJV1WN1YxTz02KUw5NV1QO1ZFTgotTT0mNVIgJV1QPEZFTTg3KVkgJV1OO1ZZUDxGRU04NylZICVdUzwmXVI9Jy1DODcoIDdWLUw9NllLOTcoIAotTTdXLT87JkVOOlAhPz01XUw6NllLICVdVjdXNU46Nl1OICVdVjdXNU46Nl1OLEAhPz1FXVM9JylVOFcwUQotTSAlXVY3Vy1UPEc1Qz0jKCA3VV0/OSZdPzlWUU84RiVMN1YxVDtXKVMgJV0/N1QxNDNVKT8zJEUzNSVdPwotTSAlXT85N0FJPSVdRD02VU0+NV1SOTY4IDdVXUU+JkVUN1YxVTs2VVk3VjFFOFZQIDdVXT85Jl0/OVZRTwotTThGJUw3Vi1UO1cpUyAlXT83VC00M1UpPzMkRTM1JV0/ICVdTztFXUU+JkVUICVdVzxGRVQ5MCE/OzctVwotTTo3MUM6JjlQN1AhLTo2WUk9ICFGOyZdQT0lXVM9VkVUOFZAIDdVXUM7JjVBO0c1UCAlXT85N0FJPSVdSAotTTg2WUQ7JjVSPFAhPzs2JUw7Jl1DICYtRTxHKU88QCE/OTcpUjtGXCA3VV1XPEcxQzomTCA3VV1GOyctQgotTT02OCA3VjlSOTY0IDdVXVM7NilVOUAhPzlGOUw9Ny1IICVdPzlGRU45JilVOUAhPzdXQUY7Jy1CPTY4IAotTTdWOVM9JiVUICVdPzhHNUY8V0VOOFAhPzhWUU88VjQgN1ZFUzg3MVQ+MCE/OUYtTDtXLUUgJV0/OUc9QQotTTsmTCA1RlFJPFcwIDdWOVA3Vy1XOjcxQzogIT87NkVOOjcxRjwlXCA3VjlQN1ctVDg3MUU3VlVDLUNAWAotTS4jJCA3VDlNO1YxRSAlXSY8VzFBPSc1UyAlXUY8JV1TPSYlVDk1XVM9NllGPCYkIDdWOVA3Vy1UODcxRQotTTdXLUs+NjlGPCAhPzlHIT88VzFBPSY1PzxWXUY9Jz1BPEY0IDdXLUk5VzlFOFAhPzE0VTQ0VyFFOFZFQQotTTsgIT85RyFSOjZZVDlAIT87NiRZLFZZPyAlXS05JjVGODc1TD0gIT8xNFU0NFZFRztGJUw7JjVEICVdPwotTTo2XUIgJV1SOTYlTDsmXUMgJV1TOEcpSyAlXUc5NzFQODY9RTxWRVo5MCE/OEYtTzwnRCA3VV1VOEZdVQotTTtGMCA3VV0/OzYlTDsmRU45RlwgN1VdUjtWXVQgJV0/OyYpTz02WUQgJV1JO1YtVDsgIT83VjlJO0YxSQotTTtXICA3Vj1FPSYxVDg2KUw5Ny1JPkY0IDdVXUY3VlVPPEY1Rjo2UUU8UCE/OUVdUDxGNUE7JlFPOFAhPwotTThWJUw7Jl1DICVdPzxWRUc5RzVOOFAhPzxWRUc8VjVUOzYlUzpQIT83Vy1JOVcxUjg2VVAgJV0/PFZFRwotTT1GNUMgJV1TOjY9QjsmXUM6UCE/OTZZRCAmLVU8RilSOlAhRjwlXVM4NzlFICY5UDdXKUU8VzFPPEY0IAotTTdVXUQ7VyFSO0cwIDdVXVM6V0U/OUYwIDdVXVM6V0VCODctRSAlXUI+RjVSO1AhPzhWOVI5NjQgN1YlVAotTTtWRCA3Vy1UPEctUDtAIT83Vi1UPjchRTdQIT87NjVNOFZBUiAlXU05NlVTOTcwIDdXJUY4Vl1OPUY1UgotTT0gIT85Ri1PO0c5RTxHMCA3Vy1UPEYtSDxAIT87Jl1DODZRRThWXU49QCE/N1ZVSzg3KUc7Jy1UICVdUwotTT0nKUw5NlggN1VdRjtXNVI5JkVHOjcxUzw3NUk4VkwgN1clRzhWXU49RjVSPSAhPzlWLU87RzlFPEcwIAotTTdXJUU4Vl1OPUY1Uj0gIT85Ni1PO0c5RTxHMCA3VV1HOTcxQTxGPCA3VV1GPCYlQjg3LUUgJV1JPFchVQotTTtGLVQgJV1JPFY9Ujg3IUggJV1JPFYlUzhWRUkgJV1UO1YlUzhWRUkgJV0/OzYpPzhXNVI3VlVBPiAhPwotTTo3LVg5JkVHOjcwIDdWRVM8VyFBOFY0IDdWRVM4NlFOPTZUIDdWRVM9NyFQOTcoIDdWRVM4VllUPEZQIAotTTdWRVM8JylJO0cwIDdWRVM4NlFQOiYkIDdWRVM5JkVHOjcwIDdWRVM7Jl1XOTcoIDdXKUU4NjAgN1ZRQwotTTtWWVYgJV1HOTcxTDtWLUE7JjU/OFcxWTwmNCA3VV1MODZZRzo2WUY7UCE/OyZdQzg2UUQ9Ji1PO0c4IAotTTdXLVQ8Ri1BPSAhPzdWVVk3VzFJOzY0IDdXLUU9JlFPOFYlTDkwIT88VzFSPSZdSyAlXUk7RkVUN1ctVAotTTg3MUk4VywgN1Y9RT0mUU84ViVMOTVdTj02VUU8RkVDICVdTTk2VUM8J0QgN1VdTDtWLUE7JjVTICVdUwotTT0nKUM7NyAgN1ZdUDk2WCA3Vl1QOTZZTDtWLUE7JjQgN1ctVDxGLVA+MCE/N1YtTzkmNT88VjVUN1ZFTgotTTlGXCA3VV1DPSdFUDk1XVU7ICE/OVY1VDk2WVYgJV0/OScxQztWWVYgJV1TPScpUDhHKUsgJV1GPCVdRAotTTo3KUU4VzFJO1ZYIDdVXUY8JV1DPTcpUjk2WVQ3VjFJPEY1Qz0mRU87QCE/N1Y5UDdWLVU8RylFO0cxPwotTTk3QUM5NyFUOjZdTjxQIT83VjlQN1YtVTxHKUU7RzE/PCcpRThWRVM6Nl1OICVdRDtXNUI7JjU/PSZdPwotTTkmNUM6NlVBOyAhPzlWLVY9ICE/N1Y9Qz1HMCA3VilJO0YlUj41XVQ7VV1EOTYtSTs2JUw3VkVOPSY1RwotTTk3KCA3VV1SOjY9SD0lXVM6JkVGPSVdQjg3LUU3VzFXO1AhPzkmNUM6NlVBOyVdUjtXNU45ICE/N1YpSQotTTlVXUY7Jl1BPSVdVDo2VUU8VV1QO1c9RTxAIT84RkVOODcpWTdXMU83VjFFOFZFTTg2UT85RylBOFcxSQotTTtWWCA3VV1GPCVdTjtXKU04NlFJPkY0IDdXLVA8RkVOPSY4IDdVXUY8RjVFN1YpSTlVXUY7Jl1BPSAhPwotTTdXNU48JiVDOlY1RDdXMU83VilJOVVdRjsmXUE9ICE/N1YpQTxWNT84Vl1OPUY1UjxWRU87RV1BOEZdUgotTT0gIT83VzVOPCYlQzpVXUQ7VzVCOyY0IDdVXUM7JiVTPFVdRDtXNUI7JjQgN1clVTg2MVI9NyFMOTVdVAotTTtVXUQ5Ni1JOzYlTCAlXT89NllQODYtSzk2MT89Jl0/OSY1Qzo2VUE7ICE/N1YpSTlVXUI6NllBPEdFPwotTT0mXT84RkVHN1YxRThWRU04NlAgN1VdVTtHIUE4Vk0/PDc1QTknKVU8JlFFICVdPzhWUUE8Vy0/PDc1QQotTTknKVU8JlFFICVdPzlHIT87JjVGPSctSDo2OVQgJV0/OUchPzxWNVQ3VjVYOFY1UD0mRU87QCE/N1c1TQotTTg2LCA3VV1NPTZRVDo3IUw+NV1CODctRTdXMVc7VV1WOTYtVDtXKCA3VV1NPTZRVDo3IUw+NV1CODctRQotTTdXMUU7RV1WOTYtVDtXKCA3VV1DODcpUj41XVA8Rl1QODY9QT0mNT89Jz1PICVdPzhWJVI8R0U/PCcpTwotTTwmJUc4NzFFN1cxRTtAIT83Vi1BPEcpWTdWRU43VihRLCMgUCwgIT83VyFSO1YxQzdWKFEsIyBQLCAhPwotTTdWVVU7JzFJPCZRWTdWKUE8VjU/PSc9TyAlXT87JjVGPSVdUzomRUY9JV1CODctRTdXMVc7UCE/N1ZVVQotTTsnMUk8JlFZN1YpQTxWNT89JjVON1YpWTdXMVc7UCE/N1ZVVTsnMUk8JlFZN1YpQTxWNT89JjVOICVdPwotTTsmNUY9JV1TOiZFRj0lXUI4Ny1FN1cxRTtAIT83VyFSO1YxPywzIFAsIyE/OEM4VS0zLFYgJV0/PCcpTwotTTklXUItQzRVLFM4IDdVXUM4NylSPjVdTz03MT84QyRQLCMgUCAlXT88JylPOSVcVi0zNFMtRV1CLDMgUAotTSwjICA3VV1MPFZBSTlHMT84QyRQLCMgUCAlXT88JylPOSVdQiwzIFAsIyAgN1VdTT02UT8tQzRVLFM5UwotTTomXVI9ICE/PCcpSTtHMUYgJV0/OyY1QTkmRU45VV1aOTcpTzxVXUI6Nj0/PCZdVzk3KVM3VzFFO0AhPwotTTdWUUU4NjFJO0Y9Pz5GNVI7Vy0/PFZVQTsmUT88Jl1XOTcpUzdXMUU7QCE/N1ZRRTg2MUk7Rj0/PkY1UgotTTtXLT89JkVOPjVdUDtXPUU8Ry0/PSY1TiAlXT88VzFBPEcxPzhGRUc3VyFPPVY1UjxVXVQ5NlggN1VdUwotTT0mJVI9JV1TOzYlTDslXVA7Vz1FPEctPz0mNU4gJV0/PFcxQTxHMT89JkVOPjVdUDtXPUU8Ry0/PSY1TgotTSAlXT84RkVHN1chTz1WNVI8VV1UOTZYIDdVXVM7NiVMOyVdUDtXPUU8Ry0/PSY1TiAlXT89JkVOPjVdUAotTTtXPUU8Ry0/PSY1TiAlXT87NiVYN1YpSTlVXVA7Vz1FPEctPz0mNU4gJV0/OzYlWDdXLU04NlFMN1chTwotTT1WNVI8VV1UOTZYIDdVXU04N0E/PSZFTj41XVA7Vz1FPEctPz0mNU4gJV0/OFZdUD41XUI6Nj0/OUZRTwotTTg3MT85JkVHOjcxUyAlXUE4Rl1SPSAhPzdXLVQ4NylUN1YpSTlVXVA7Vz1FPEctPz0nPU8gJV0/PFcxQQotTTxHMT88VlVBOyZRPzwmXVc5NylTN1cxVztQIT83Vy1UODcpVDdXMUk7R0U/PCZdVzk3KVM3VzFXO1AhPwotTTdWKUk5VV1QO1c9RTxHLT89Jz1PICVdPzxWVUE7JlE/PCZdVzk3KVM3VzFXO1AhPzdXMUk7R0U/PCZdVwotTTk3KVM3VzFXO1AhPzdWVUE+JV1COjY9PzwmXVc5NylTN1cxVztQIT83VlVBPiVdUzs2JUw7JV1QO1c9RQotTTxHLT89Jz1PICVdPzs2JVg3VzFJO0dFPzwmXVc5NylTN1cxVztQIT88JjVSPEZdUiAlXUs6NlFMICVdUwotTTo2PU44NlAgN1Y9RT0nIUk5ICE/N1chRTxHKU88QCE/PFdFUzdWNVI8RlFJPFcwIDdXPVI6NzFFPUAhPwotPTxXRVM3VllFPEcoIDdWNVQ5N0FUICVdRTkmJVQ4MCE/N1Y1TjkgIVIKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWVsZi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QwNWU3Li4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1lbGYudQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi1iZWdpbiA3NzcgbTY4ay1lbGYKLU0/VDUsMUAkIiAwICAgICAgICAgICAgICIgIDAgICAgIUAgICQ+ICAgICMwICAjIjAgICAgICAgVCAiICAKLU0hMCBIICE0ICQwICAgIDggICAgVEAgICAtICAgICAgICAgIkAgICAgSCAgICAgNCAgICAgICAgICBQICAKLU0gLTAgICAgICAgICAgICAgICEsICAgICAgICAgISAgICAgICAgICAhICAgIC0oICAgIzAgICAgICAgICkKLU1DICAgIjhQICAgICUgICBAICAgICAgJCAgIEcgQCAgSVAgICAgICAgICAiNCAgICI2ICAgICA8ICAiICAKLU0gICAgIEAgICI+MiAgIkdEICAgICAgICAgJyAgICAgICAgICAhUCAgICAgTz03LVIrVlFJOEJdTDo2KUMKLU0rRy1PK0MkICAgICAgJiQgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gIDQgICAgICAgICAgUCAgICAgICAgICAgICAgIVAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAKLU0gICAgICAgICAgICsgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAgICAgICAgQCAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0hQCAgICAgICAgICAgICAgICAgICAgICAgICAhICAgICAgICAgIjAyICAgICAgICAiSCAgKyFAICAgICAKLU0kMCNfXDAgICAgXiAgIkckICAgICEhJCAgIEggICAgOEAgIClQICAgICAgMSAvX1EgICAgJ1AgICAgICAKLU0gICE6JEAgICAgICAgIjogICJJNCAgICAgISQgX18kICAgIE0gICAgICAgICAgIDIgICAgICAgICxIICAKLU0hLUAgICAgJCQwICAiICAgICNcICAgICAgICAgICEoICAgICAgICEpQCAgSVIgICAgICAxIC9fUSAgICAKLU03WCAgKj4wICAgICAkMCNfXDAhPzhWUUU4NllVPCAhPzk2WUQgJV1FO0c5STxGXU4gJV1FPSY1WD0gIUEKLU09JjVYOjcwIDdWNUQ4NzFBICY1WDo3MCA3VlFJOEVdVjk3KVM6Nl1OICVdPzlHIVM9JiVSPSAhPzFUUS8KLU0wRCUsN1RdJjFFLSU1JV00MDQpLDE1XCA3VDE5M0QlLTI0LCArVzVTPEJdTDo2KE87JkVCOFJZUztSWFEKLU0gICIgICJHNCAgICUlMCAgICAiICAiRzggICAhJTAgICAgIiAgIkc8ICAgKSUwICAgICIgICJHQCAgICcKLU0lMCAgICAhLj00WVErU0whPCAgICk7OS5eUCVRICAgRUxAICAgICEuXlAlUSAgIEVKQlxcICAgICAmI18KLU1fX19fVyRbWyA3JCAgIjY6K1NQICAgICw4L19fX19fKDNPTCE8MCAgKThITy8gICAgIUFAX19fX19bMS4KLU1eUCVRICAgRT5CXFwgICAgKSYjX19fX19IIlxcQCAgKU8kWllAICAkKiVBLygjUiAgIDBcOV9cICAgIC4KLU0rUCEuTjggICEiQTgzWV9cICAgICMiWjYwPlggISJdKCAgMSpGJjtcKFxCICAiRyQrVEAgIiRaWUAgICQKLU0kJFpZQCAgJDQkWllAICAnSyJaIDNLRiAgIDFEM0c1LjwwICAgICEoI09fX19fUShbUCAgICAzUi1fICAKLU0gNyAgICAgJDwgIUBfUCAgICAzUi1dICAgNyAgICAgJDMuXCAgICAkM0VZLj00QC5fX19fXyRDTyAgICAKLU0hLyhXXCAgITwgICAgIDFQICYjXyAgICAhLyhXVCAgITwgICAgIDEsW1AgICAgMS43RFlVMiBbX19fX1wKLU0yLlwgICAgJFxDP1AgICVQICAgICEnICA4L1wgICAgJFxDPzAgICVQICAgICEkU08gICAgISRZPjNHNSgKLU0jT19fX19RKFtQICAgIDNSLV8gICA3ICAgICAkPCAhQF9QICAgIDNSLV0gICA3ICAgICAkMy5cICAgICQKLU0zRVkuPTRALl9fX19fJENPICAgICEvKFdcICAhPCAgICAgMVAgJiNfICAgICEvKFdUICAhPCAgICAgMSwKLU1bUCAgICAxLjdEWVUyIFtfX19fXDIuXCAgICAkXEM/UCAgJVAgICAgIScgIDgvXCAgICAkXEM/MCAgJVAKLU0gICAgISRTTyAgICAhJFk+M0c1KCNPX19fX1EoW1AgICAgM1ItXyAgIDcgICAgICQ8ICFAX1AgICAgM1IKLU0tXSAgIDcgICAgICQzLlwgICAgJDNFWS49NEAuX19fX18kQ08gICAgIS8oV1wgICE8ICAgICAxUCAmI18KLU0gICAgIS8oV1QgICE8ICAgICAxLFtQICAgIDEuN0RZVTIgW19fX19cMi5cICAgICRcQz9QICAlUCAgICAKLU0hJyAgOC9cICAgICRcQz8wICAlUCAgICAhJFNPICAgICEkWT4zRzUoI09fX19fUShbUCAgICAzUi1fICAKLU0gNyAgICAgJDwgIUBfUCAgICAzUi1dICAgNyAgICAgJDMuXCAgICAkM0VZLj00QC5fX19fXyRDTyAgICAKLU0hLyhXXCAgITwgICAgIDFQICYjXyAgICAhLyhXVCAgITwgICAgIDEsW1AgICAgMS43RFlVMiBbX19fX1wKLU0yLlwgICAgJFxDP1AgICVQICAgICEnICA4L1wgICAgJFxDPzAgICVQICAgICEkU08gICAgISRZPjNHNSgKLU0jT19fX19RKFtQICAgIDNSLV8gICA3ICAgICAkXENRNCAgICAgICAgICAgIDgvXCAgICAkXEM/MCAgJVAKLU0gICAgISRTTyAgICAhJFk+M0c1KCNPX19fX1EoW1AgICAgM1ItXyAgIDcgICAgICRcQ1E0ICAgICAgICAKLU0gICAgOC9cICAgICRcQz8wICAlUCAgICAhJFNPICAgICEkWT4zRzUoI09fX19fUShbUCAgICAzUi1fICAKLU0gNyAgICAgJDBDRiAgIk1EJF9QICA4ICAqTiAzXyAgIkAgIEpJIy9cICAuICAiSzgsX1AgISggICpMQFMKLU1fICAlQCAgSjsiL1wgICAgIUggICpHQENfICAgICA+ICAiSTgoX1AgICAgKEAgIEo3Ii9cICAgICI4ICAKLU0qTTBDXyAgICAgSiAgIklEKF9QICAgICtAICBKWSIvXDBMQCAgKCAgKkpAQ18kIUkgICIgICJJUChfUCAKLU0gICAgQCAgSj0hL1lAICBLOSggICpUIDNeOCAgKk4iICAiSkAkX0YgICJKREAgIEo4Iy9ZQCAgSlYoICAKLU0qTkBTXjggICpMQiAgIkpULF9GICAiSUxAICBKWyIvWUAgIEo+KCAgKkgwQ144ICAqRUIgICJLWChfRiAKLU0gIkk8QCAgSk8iL1lAICBKVSggICpVUENeOCAgKkYyICAiSkwoX0YgICJLREAgIEpTIi9ZQCAgSkooICAKLU0qVFBDXjggICpHIiAgIkowKF9GICAiSVRAICBKRSIvXEAgIEs5KCAgKk8gQ18oICAqTiIgICJNOChfUiAKLU0gIkpEQCAgSl0iL1xAICBKViggICpVMENfKCAgKkxCICAiTCgoX1IgICJJTEAgIEo6Ii9cQCAgSj4oICAKLU0qS0BDXyggICpFQiAgIkwgKF9SICAiSTxAICBKUSIvXEAgIEpVKCAgKk1QQ18oICAqRjIgICJNKChfUiAKLU0gIktEQCAgSkAiL1xAICBKSiggICpUMENfKCAgKkciICAiTCwoX1AgICAgIkAgIEpDIi9cICAgICBIICAKLU0qR1BDXyAgICAgJiAgIlAgKF9QICAgICFAICBLOiIvWUAgIEshKCAgKlcgU144ICArISIgICJQKFxDPzAKLU0gICVQICAgICEkU08gICAgISRZPjNHNS49NFlRICAgICAgICAgICIgICJHRCAgICAgICAgICAiICAgMFAKLU1AICAkMSggICElQiAgIDFMICAgICAwICAgJkAgICAgLEAgICQkICAgICBWICAgRlwgICAgISggICAuQCAKLU0gICAlQCAgIzkgICAgIDogICAqRCAgICAiQCAgICdMICAgICsgICAgJCAgICAhNCAgICAgICAgICBYICAKLU0qPEAgICAgIiAgICAsICAgICEwICAgICcgICAgJVggICBeICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgIDAgICAgICAgICAgISAjX1wwICAgICIgICAjNCAgICAgICwgICAkICAgICAKLU1AICAgWiAgICAgICMgICAiICAgICAoICAgSjAgICAgICBQICAgUCAgICAiICAgLUQgICAgICAsICAgMCAKLU0gICAgQCAgI1ggICAgICAjICAgJSAgICAgKCAgISEgICAgICAgUCAgIUAgICAgIiAgIDA0ICAgICAgLCAKLU0gIDwgICAgIEAgICQ+ICAgICAgIyAgICggICAgICggICI7UCAgICAgIFAgICIwICAgICIgICJHICAgICAKLU0gICwgICBIICAgICBAICBJUiAgICAgICMgICArICAgICAoICAqPjAgICAgICBQICAjICAgICAiICAiSTgKLU0gICAgICAsICAgVCAgICAgICAgICAgICAgICAjICAgLiAgICAgICAgICAgICAgICAgUCAgI1AgICAgICAKLU0gICAgICAgICAgLCAgISAgICAgICAgICAgICAgICAgIyAgIDEgICAgICAgICAgICAgICAgIFAgICRAICAKLU0gICAgICAgICAgICAgICwgICEsICAgICAgICAgICAgICAgICMgICA0ICAgICJAICAgICAgICAgICEgI18KLU1cMCAgICEkICAgICAgICAgICAwIF9fJCAgICA4ICAgICAgICAgICAkIC9fUSAgICApICAgICAgICAgICAKLU0hICNfXDAgICAiUCAgICAgICAgICAgMCBfXyQgICAgViAgICAgICAgICAgJCAvX1EgICAgLzggICEtUCAKLU0gICBSJEAgICIgICAgJEYgICJJOCAgICAhISQgICBUICAgITZAICBKNyAgICAgMDEgICAtICAgIDk4ICAKLU0iO1AgICAgICRAICAiMCAgICZOICAiSUAgICAgIEEkICAgVCAgICIhQCAgJ0sgICAgQSAyICAgKCAgICAKLU1BSCAgKkYwICAgICQkMCAgIzAgICApMiAgIklIICAgICEhJCAgIFQgICAiTUAgICQvICAgICIwMiAgICAKLU0gICAgTUggICshQCAgICAgJDAjX1wwICAgK04gICJJTCAgICAgQSQgICBUICAgIyxAICAlVUAgICAjKDIKLU0gICAoICAgIFhIICAqRyAgICAgKCQwICAjMCAgIC5OICAiSVggICAgISEkICAgVCAgICNRQCAgJD4gICAKLU0gICAyICAgKCAgICBeKCAgKkdQICAgICQkMCAgIzAgICAwLiAgIkckICAgICEhJCAgIEggICAkLEAgIEoKLU1AICAgICAwMSAgIC0gICAhKSggICpIMCAgICAoJDAgICMwICAgMyIgICJKLCAgICAhISQgICBUICAgJFgKLU1AICAlI0AgICAjKDIgICAoICAgITJYICAqSSAgICAgMCQwICAjMCAgIDVKICAgRyAgICAgICEkIF9fJCAKLU0gICVBQCAgSkggICAgICgxICAgLSAgICE9OCAgKkowICAgICEkMCAgIzAgICA4NiAgIkpIICAgICEhJCAKLU0gIFQgICAmLUAgIEpLICAgICBAMSAgIC0gICAhSDggICEiQCAgICE6JEAgICAgICAgOkIgICJHJCAgICAKLU0hIiQgICBIICAgJlBAICAmR0AgICAjKDIgICAoICAgIU8oICAhUCggICAgUiRAICAiICAgID0mICAiSlQKLU0gICAgISEkICAgVCAgICdGQCAgSk4gICAgIDAxICAgLSAgICFdKCAgKkUwICAgICAkMCNfXDAgICA/TiAKLU0gIDVSICAgICxBKCAgIEAgICAoKEAgIEpPICAgICBAMSAgIC0gICAiJzggICpMMCAgICAkJDAgICMwICAKLU0gQzIgICA4KCAgICAsQSggICBAICAgKF9AICBKUiAgICAgKDEgICAtICAgIjNIICAhUzAgICAgXCRAICAKLU0iICAgIEVOICAgMUQgICAgICEoICAgICAgIClAQCAgSlMgICAgIEAxICAgLSAgICI9SCAgKk0wICAgICQKLU0kMCAgIzAgICBHViAgIks4ICAgICBBJCAgIFQgICAqJUAgIEpXICAgICAwMSAgIC0gICAiRSggICpOICAKLU0gICAhJDAgICMwICAgSiogICJLRCAgICAhISQgICBUICAgKlJAICBKWiAgICAgMDEgICAtICAgIlAoICAKLU0qTlAgICAgJCQwICAjMCAgIE0+ICAgMzggICAgISEkICAgQCAgICtEQCAgJFUgICAgICAyICAgKCAgICIKLU1bKCAgKk8gICAgICQkMCAgIzAgICBPTiAgIktUICAgICEhJCAgIFQgICAsM0AgIEpeICAgICBAMSAgIC0KLU0gICAjKUggICElICAgICAgJEAgICAgICAgUyIgICJMICAgICAhISQgICBUICAgLSVAICBLISAgICAgMDEKLU0gICAtICAgIzMoICAqPEAgICAgICQwI19cMCAgIFYqICAiTCggICAgISEkICAgVCAgIC1ZQCAgSyMgICAKLU0gIDAxICAgLSAgICNCSCAgKjwgICAgICQkMCAgIkAgICBZUiAgIkwwICAgICYhJCAgIFQgICAuRkAgIEsKLU0qICAgICFAMSAgIC0gICAjTCggICpUICAgICAiJDAgICMwICAgW1YgICJNJCAgICAhISQgICBUICAgLy0KLU1AICBLMiAgICAgMDEgICAtICAgI1hYICAhVyAgICAgXCRAICAiICAgIF8mICAgOFogICAgLEEoICAgQCAKLU0gIDAjQCAgSVkgICAgICAxIC9fUSAgICQjKCAgKlRQICAgICgkMCAgIzAgICEhSiAgIk00ICAgICEhJCAKLU0gIFQgICAwSkAgICZUICAgICMoMiAgICggICAkLzggICpVQCAgICAkJDAgICMwICAhJS4gICJNPCAgICAKLU0iISQgICBUICAgMUBAICAkJCAgICAgIDIgICAmICAgJDlIICAqVjAgICAgISQwICAjMCAgISZWICAiTUgKLU0gICAgISEkICAgVCAgIDFVQCAgJTAgICAgIygyICAgKCAgICRCSCAgKlcgICAgIjAkMCAgIzAgICEpJiAKLU0gIDZEICAgICxBKCAgIEAgICAyRUAgIEwgICAgICAwMSAgIC0gICAkS1ggICsgQCAgICAoJDAgICMwICAKLU0hK0IgICA5TCAgICAsQSggICBAICAgMyxAICBMJCAgICAgQDEgICAtICZUVi4mTE45NlFGICYtUj0jJE4KLU08UCFDPEcxSStHLCA9RiVMPTY1Uys1QVQrRiwgOVYxQjs2NE44UCFTOiVdRDg3MUErRiwgOFcpVDtCWVMKLU0gJzk/OFZBQTxFXUY9NllDICc5PzxWRUc7RjVEN1ZFTj0gIVY3VzVOPFZFRztGNUQ3VkVOPSAhPzlGRU4KLU06MCFWN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSODdEIDs2JUk7QCFWN1ctSTlWWUU5JV1MO1ZZRyAnOT8KLU09NllTOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhPzhWUUU4NllVPCAhPzk2WUQgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICc5PzkmXVU4RlFFICc5Pzo2WVQKLU0gJV1TPSYlUj0gIU47VllQPEZFTTg3KVkgJV1FO0c5STxGXU4gJzk/PTZZUzo2PU45NjE/OyZdTjlVXVAKLU07VkVOPSY1UiAnOT86NllUN1YlUjxGJVkgJyFSOjZVQTxHRCA9RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMKLU0gJzk/OSZdVThGUUU3ViVSPEYlWSAlXUU9JjVYPSAhVjdXLUk5VllFOSVdQzomJVI3ViVSPEYlWSAnOT8KLU09NllTOjY9Tjk2MT84VkFBPEAhVjdWOUw7ViVUICc5PzxWRUc7RjVEN1ZRTztGPT84NylSODdEIDg3MUUKLU0+JkVUICY1Tj1GRVI7VlggPUVdTDtWWUc3VjlVO0YsID1FXVU7Ry1JOVZZRTklXUw7VllHN1Y5VTtGLCAKLU09RV1TOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgPUVdSTtHMT88Jl1JO0cxRTxAIT85NjFBPSYkID1FXVMKLU06Jl1SPSVdRj02WUMgJzk/PTZZUzo2PU45NjE/OjZZVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzo2WVQKLU03VyFPOjZZVDk3KCA9RV1JO0cxPzlHNU44UCFWN1ctSTlWWUU5JV1TOiZdUj0gIVY3VjlMO1YlVDdWOVUKLU07RiwgOTdBST0gIVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgPUVdTDtWWUcgJzk/PFZBTzxHMCAKLU09RV1MO1ZZRzdXIU86NllUOTcoID1FXVM6Nj1OOTYxPzhWQUE8QCFWN1c1TjxWRUc7RjVEN1ZRTztGPCAKLU09RV1TOiZdUj0lXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJV1MOjYpPz1GNVIKLU08VkVPO0AhPzs2LU89NllUICc5PzhWQUE8RV1QO1ZFTj0mNVIgJzk/PTZZUzo2PU45NjE/OFZBQTxFXVAKLU07VkVOPSY1UiAnOT88VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT83VjlQPFcxQTxHMCA9RV1TOjY9Tjk2MT8KLU06NllUN1chTzo2WVQ5NyggPFVdTDo2WUsgJV0nMyRdIjA0UT8zVDkmNFQ1NDdVMSEwRFElN1AhVjdXLUkKLU05VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgJzk/OSZdVThGUUU3VyFPOjZZVDk3KCA3VV1MO1ZZRzkmXVUKLU04RlFFN1c1Uzk2MCA9RV1TPScpVThXMFEgJzk/PFcxUj02LVQsQCFWN1YtSDg3KT84NylSODdEID1FXUYKLU07Jl1BPSVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VjFPPTYpTDk1XUYKLU09NllDICc5PzxWRUc7RjVEN1ZFTj0lXUY9NllDICVdJDY0WSEzNEUjICc5PzlGUU84NzE/ODcpUjg3RCAKLU09RV1TOiZdUj0lXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIVY3Vy1JOVZZRTklXUMKLU06JiVSN1chTzo2WVQ5NyggPUVdTDtWWUc3ViVSPEYlWSAlXUk7RkVUICc5PzhWQUE8QCFDOyc1TjpWNVIKLU0gJzk/PTZZUzo2PU45NjE/OFZBQTxFXUY9NllDICc1PzsmRU46UCFWN1ctSTlWWUU5JV1TOiZdUj0lXUYKLU09NllDICctUDtXKVQ8Vi1BPEAhVjdXNU46Nl1OLEAhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQyAnOT8KLU09NllJO1ZYICAiWUk7RzFFPEcgICtGQUE8VkAgK0YxWTtHLVk7MCBOOSdFTjxXMVIgIllSOTZRQStHIUwKLU09ICBOOjZZST0gIE48JlFUICJZVDk3QVQgIllGOjZZSSAiWUQ4NzFBICJZRztXMCArRjFZO0YlTTo2LCAKLU0rRilTPFAgTjxXRU09JiVCICJZUz0nKVQ4NiggK0chRTxWNUwgIllTOictVDxHMUE4QCBOOFZdTTs2NU4KLU09ICBOOSY1Qj02PCArRlFJO0Y0IDAiQEMqNlFJOEYsTTszLFIuRlRUK0YxRTlARFErQzAgMCJAQyo2UUkKLU04RixNOzMsUi5GLVM9Ml1DPEcwUStHLCksMlhRLiAgICAgISAqIixJOyZFQjhSVU0sUyhaOzMwTjkmNUYKLU0iMyROLSAhICoiLEk7JkVCOFJVTSxTKFo4Vy1VK1YtUj0mRE48UERRK0MsIDg3LFooIkEjMSUsSSgjNE4KLU0sIiBRK1MoTy4zICAgICAgMCJAQyo2UUk4RixNOzMsUi5GVFQrRjFFOUBEUStDMCAwIkBDKjZRSThGLE0KLU07MyxSLkYtUz0yXUM8RzFOK0csKSwyWFYgIiFMOSIgWigiQSMxJSxJKCM0TiwiIFErUyhPLjMgICAgICAKLU0gIlggJDAgMiAgIDY8ICBYOVYxQjs2NE44UCAhLUAgICAgJCEkOCAgIS1QISg4ICAiO1AhIUAgICAgICAKLU0gICA9ICEsICRAICAgNFggLicxPzxXMVI9Ni1UICAiViAgICAmICAgICJIICMwIDIgICAgPTAgWD1FXUMKLU06JiVSN1ZVRTs2KUU8QCAgNTAgISAiLCAhQDAgICAgICFQICAgIkwgIzAgMiAgICBIICBYPUVdUzomXVIKLU09JV1NOTZVQjk3KCAgJTQgISAgQyAgOCQgICAgIEA8ICAgIEkgIFQgJEAgICAsRCAuJzk/OjZZVDdWVUUKLU07NilFPEAgIDUwICcgIiwgIUAwICAgICQhUCAgICJIICMwIDIgICAgXFAgWD1FXUw7VllHN1ZVRTs2KUUKLU08QCAgNTAgKiAiLCAhQDAgICAgKCFQICAgIkwgIzAgMiAgICEnQCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAKLU0gJTQgI0AgQyAgOCQgICAgIyA8ICAgIEwgIFQgJEAgICA0SCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICAKLU01MCAvICIsICFAMCAgICAwIVAgICAgMCAgICA7ICEsICRAICAgRlAgLidYUDlGJUs5MCAgTUAgICAhQCAKLU0gICBKICBUICRAICAgOSwgLic5PzhWQUE8RV1NOTZVQjk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsKLU0gIFQgJEAgICA7WCAuJzk/PFZBTzxHMT87NjVNOEY1UiAgITUgIDAgKFAgJiEgICAgICgnICAgICowIC0KLU0gISggICAnRyAjQVY3VkVOPSVdTTk2VUI5NyggICU0ICFQIEMgIDgkICAgICEgPCAgICBKICBUICRAICAKLU0gQSQgLic5PzsmXU45VV1NOTZVQjk3KCAgJTQgIkAgQyAgOCQgICAgIiA8ICAgIEsgIFQgJEAgICBDUCAKLU0uJzk/OUZRTzg3MT87NjVNOEY1UiAgITUgIFggKFAgJiEgICAgIFAnICAgICsgIC0gISggICApSCAjQVYKLU03VjFPPTYpTDk1XU05NlVCOTcoICAlNCAjUCBDICA4JCAgICAkIDwgICAgJCAgICAnICA3ICEoICAgLisKLU0gI0FUN1c1Tjo2XU4gICJWICAgICIgICAgIkggIzAgMiAgICJMQCBYPUVdQzomJVI3VlVFOzYpRTxAICAKLU01MCAhICIsICFAMCAgICAgIVAgICAiTCAjMCAyICAgIlcwIFg9RV1TOiZdUj0lXU05NlVCOTcoICAlNCAKLU0hICBDICA4JCAgICAgIDwgICAgSSAgVCAkQCAgIFA4IC4nOT86NllUN1ZVRTs2KUU8QCAgNTAgJyAiLCAKLU0hQDAgICAgICFQICAgIkggIzAgMiAgICMsICBYPUVdTDtWWUc3VlVFOzYpRTxAICA1MCAqICIsICFAMCAKLU0gICAgIVAgICAiTCAjMCAyICAgIzZQIFg9RV1GOyZdQT0lXU05NlVCOTcoICAlNCAjQCBDICA4JCAgICAKLU0gIDwgICAgTCAgVCAkQCAgIFg8IC4nOT85Jl1VOEZRRTdWVUU7NilFPEAgIDUwIC8gIiwgIUAwICAgICAKLU0hUCAgICAwICAgIDsgITwgJEAgICEqRCAuJ1hROUYlSzkwICBNQCAgICBAICAgIEogIFQgJEAgICBdICAKLU0uJzk/OFZBQTxFXU05NlVCOTcoICAlNCAgMCBDICA4JCAgICAgIDwgICAgSyAgVCAkQCAgIF9MIC4nOT8KLU08VkFPPEcxPzs2NU04RjVSICAhNSAgMCAoUCAmISAgICAgICcgICAgKjAgLSAhKCAgIDBEICNBVjdWRU4KLU09JV1NOTZVQjk3KCAgJTQgIVAgQyAgOCQgICAgICA8ICAgIEogIFQgJEAgICEkWCAuJzk/OyZdTjlVXU0KLU05NlVCOTcoICAlNCAiQCBDICA4JCAgICAgIDwgICAgSyAgVCAkQCAgISdEIC4nOT85RlFPODcxPzs2NU0KLU04RjVSICAhNSAgWCAoUCAmISAgICAgICcgICAgKyAgLSAhKCAgIDJFICNBVjdWMU89NilMOTVdTTk2VUIKLU05NyggICU0ICNQIEMgIDgkICAgICAgPCAgICAkICAgICpAICYgISggICAzNyAjQVY3Vi1IODcpPzlHNU4KLU04UCAgNTAgISAxJiAgIDM8IDImICAgNC4gICAgISAgICAjJCAhQCAyICAgJSMgIFg9RV1TOjY9Tjk2MT8KLU04VkFBPEVdRj02WUMgICE1ICAoISQ4ICAhMFghKDggICE0ICAgICAkICAgICxQICYgISggICA1IyAjQVYKLU03VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU44UCAgNTAgIyAxJiAgIDUgIDImICAgNVIgICAgISAgICAiTCAKLU0hQCAyICAgJTxAIFg9RV1TOiZdUj0lXUY9NllDICAhNSAgMCEkOCAgITcoISg4ICAhOjAgICAgJCAgICAKLU0sQCAmICEoICAgNkggI0FWN1ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICAhNSAgNCEkOCAgITowISg4ICAKLU0hPTggICAgJCAgICAtICAmICEoICAgN0AgI0FWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsICAlNCAKLU0hQCQxQCAgJVVAJEFAICAmIiAgICAgMCAgICBJICA4ICRAICAhQFQgLic5Pzo2WVQ3VjlVO0YsICAlNCAKLU0hUCQxQCAgJiIgJEFAICAmLkAgICAgMCAgICBQICA4ICRAICAhRCQgLic5PzxWRUc7RjVEN1ZFTj0lXUYKLU09NllDICAhNSAgQCEkOCAgIUNIISg4ICAhRlAgICAgJCAgICAsQCAmICEoICAgOVcgI0FWN1c1TjxWRUcKLU07RjVEN1ZFTj0lXUY9NllDICAhNSAgRCEkOCAgIUZQISg4ICAhSVggICAgJCAgICAqQCAmICEoICAgOkUKLU0gI0FWN1ZRTztGPT85RzVOOFAgIDUwICogMSYgICA6PiAyJiAgIDswICAgICEgICAgIyQgIUAgMiAgICYKLU1WQCBYPUVdUzo2PU45NjE/OyZdTjlVXUY9NllDICAhNSAgTCEkOCAgIU0gISg4ICAhUCggICAgJCAgICAKLU0sUCAmICEoICAgPDEgI0FWN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAgIDUwICwgMSYgICA8IiAyJiAKLU0gIDxUICAgICEgICAgIkwgIUAgMiAgICcwICBYPUVdRjsmXUE9JV1GPTZZQyAgITUgIFghJDggICFTMCEKLU0oOCAgIVcgICAgICQgICAgKyAgJiAhKCAgID1QICNBVjdWMU89NilMOTVdRj02WUMgICE1ICBcISQ4ICAKLU0hVyAhKDggICFaUCAgICAkICAgICUwIDUgISggICA+TiAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgPjoKLU0gKCwgITAkICAgP0ogICAgJCAgJSAhKCAgID5KICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIV5IIEUwICAKLU0gKiwgKiAgICIgICAgICAgICAgICAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAKLU0gICA5ICEsICRAICAiJ0wgLiZRSTtGTCAgKzggICAiOCAgICApQCAtICEoICAgQEkgI0FOOTdBVCAgIiMKLU0gIDQhICAgJ1pAIEMgIDgkICAgICAgPCAgICBKICBUICRAICAiJSwgLiZRSTtGTUY9NllDICAiIyAgNCEKLU0gICAnPCAgQyAgOCQgICAgISA8ICAgIEQgIFQgJEAgICInPCAuJy1UPTY5RiAgIVIgICAnS0AgQyAgOCQKLU0gICAgIiA8ICAgICQgICAgJTAgNSAhKCAgIEJZICgsICEwJCAgID9KICAgICUwICUgISggICBCRSAoLCAKLU0hMCQgICA/SiAgICAkICAlICEoICAgQlUgJTQgIVAgICAgMCAgICBcICAkICRAICAiLzQgRTAgICAqLCAKLU0qICAgIiAgICAgICAgICAgICAgKCAgICAgICAgICAkICAgQCAgICAgICAgICBAQCA8QCAgICJYICAgIDwKLU0gITwgJEAgICI4RCAuJzFVN1ZRSTtGTCAgKzggICAiMCAgICApQCAtICEoICAgRFcgI0FOOTdBVCAgIiMKLU0gIDQhICAgJ1pAIEMgIDgkICAgICAgPCAgICBKICBUICRAICAiNiQgLiZRSTtGTUY9NllDICAiIyAgNCEKLU0gICAoPlAgQyAgOCQgICAgICA8ICAgIEQgIFQgJEAgICI4NCAuJy1UPTY5RiAgIVIgICAoTjAgQyAgOCQKLU0gICAgICA8ICAgICQgICAgLkAgJCAhKCAgIEcnICNBXixGOUE6VjQgICs4ICAgICQgLywgJlAgICAgKUIKLU07JzVFICAgICAgJUc8RjVFO0AgICAgICA8RjVEICAgICAgMCAgICBeICAwICRAICAiQEQgLiYtTzsmXVIKLU08UCAgTUAgICAgMCBcUCA/ICAgICBHIUk7RkwgICAgICA3IVU8RyFMOTAgICAgICA+NjVMOyZdVyAgICAKLU0gIDAgICAgUiAgMCAkQCAgIkNcIC4nWFM5RiVLOTAgIE1AICAgIDAgXFAgMyAgICAgNjlPPEYwICAgICAKLU0gJi1IOTc5WSAgICAgIDAgICAgUSAgMCAkQCAgIkcwIC4mLUE8RywgICs4ICAgICQgLywgJSAgICAgJVAKLU07VylTOFZBRSAgICAgICFCOzc8ICAgICAhICAgICMoICEgIDIgICAqSkAgWD9DMUY4Nk1FICAiViAgICAKLU0hICNTICEsICAgICE1JSk1MTAgICAgICAxRCUsNFQ0ICAgICAhICAgICFQICVAIDIgICAqUUAgWDhGXU8KLU07JjVBO0AgIDxAICAiRzAgICAgUSAgMCAkQCAgIk9MIC4mKVY4NlFTICAiViAgICAhICNTICEsICAgICEKLU09JylVOTAgICAgICA5RiVMPFY0ICAgICAhICAgICFUICVAIDIgICArJiAgWDhGXU87JjVBO0MoICAnKCAKLU0gIEsmICAgIDFAICQgISggICBNQiAjQU06Ny1PPEYxRTxGNUQgICJWICAgICEgI1MgIiwgICAgIz0mQVIKLU05NjQgICAgICAnSUU8RlwgICAgICA2XU45MCAgICAgIj0nPU8gICAgICAwICAgIEMgIDggJEAgICJYRCAKLU0uJlVBOjZYICAlNCAhUCQxQCAgJ0sgJEFAICApTyAgICAgMCAgICBHICA8ICRAICAiWyAgLictUDtXKVQKLU08Vi1BPEAgIDxAICAiQ1wgKFAgJSBYICArICAgICAgRSAgPCAkQCAgIl00IC4mLUw9NllLOTcoICAnKCAKLU0gIEgpICIsICEwLiAgIk1IICAgICogICcgISggICBPXSAjQU47VllQPEZFTTg3KVkgICFSICAgKVFQIEMKLU0gIDQjQCAgSj8gICAgIjQgIVAgMiAgICwoQCBYPCcpSTs2JVI+MCAgPEAgICI4RCAoUCAlIFggICpIUCAKLU0gICBEICA8ICRAICAjJDggLic1PzsmRU46UCAgPEAgICIvNCAoUCAlIFggICpXICAgICBHICA8ICRAICAKLU0jJlQgLictPzsmRU46UCAgQFAgJSAwICAhXkggKFAgJSBYICAqUDAgICAgRiAgPCAkQCAgIyksIC4nOT8KLU09NllJO1ZYUiAgIVIgICAjQlAgQyAgNCNAICBMIiAgICAiNCAhUCAyICAgLE4gIFg9RV1VO0ZFTztAICAKLU08QCAgIEZQIChQICUgWCAgKyEgICAgIEcgIDwgJEAgICMtXCAuJzk/PFcxUj02LVQsQCAgPEAgICA0WCAKLU0oUCAlIFggICpSQCAgICBHICA8ICRAICAjMDggLic5PzxXMVI9Ni1ULDAgIDxAICAgIlggKFAgJSBYICAKLU0qUSAgICAgTyAgPCAkQCAgIzM0IC4nOT85Jl1VOEZRRTdXIU86NllUOTcoICAmLCAgUCQgI1AgQyAgNCMKLU1AICBLIyAgICAiWCAhUCAyICAgLThQIFg9RV1GOyZdQT0lXVA7VkVOPSY1UiAgIUMgICwhICBYIChQICUKLU0gWCAgKlQwICAgIFYgIDwgJEAgICM5RCAuJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAgIUMKLU0gICwhICBQIChQICUgWCAgKkggICAgIFQgIDwgJEAgICM8VCAuJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUkKLU07RzFFPEAgIDhQICMgMCArICIsICEwLiAgIk0oICAgICswICcgISggICBXWiAjQVY3VlFPO0Y9PzwmXUkKLU07RzFFPEAgIDhQICMgMCAqICIsICEwLiAgIks8ICAgIC0wICcgISggICBYTyAjQVY3VzVOPFZFRztGNUQKLU03VkVOPSVdUDtWRU49JjVSICAhQyAgLCEgIEQgKFAgJSBYICAqTDAgICAgUyAgPCAkQCAgI0YoIC4nOT8KLU08VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgICFDICAsISAgQCAoUCAlIFggICpQICAgICBMICA8ICRAICAKLU0jSFggLic5Pzo2WVQ3VyFPOjZZVDk3KCAgJiwgIFAkICFQIEMgIDQjQCAgSk4gICAgIzwgIVAgMiAgIC4KLU1RMCBYPUVdVTtHLUk5VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgICFDICAsISAgOCAoUCAlIFggICpGQCAKLU0gICBVICA8ICRAICAjT0ggLic5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCAgJiwgIFAkICEwIEMKLU0gIDQjQCAgSyIgICAgIlggIVAgMiAgIC8qICBYPUVdUzomXVI9JV1QO1ZFTj0mNVIgICFDICAsISAgMCAKLU0oUCAlIFggICpVMCAgICBWICA8ICRAICAjVVggLic5Pz02WVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIKLU0gICFDICAsISAgLCAoUCAlIFggICpPMCAgICBUICA8ICRAICAjWSggLic5PzxWRUc7RjVEN1YtSDg3KT8KLU08Jl1JO0cxRTxAICA4UCAjIDAgIiAiLCAhMC4gICJNOCAgICArMCAnICEoICAgXl8gI0FWN1YtSDg3KT8KLU08Jl1JO0cxRTxAICA4UCAjIDAgISAiLCAhMC4gICJLUCAgICApICAhICEoICAgX0MgKTQgICAiQyAhICAKLU0gIEAgICAgICAgICAgMEAgNTAgLyAgICArICAnICEoICAhIC8gI0FWN1YxTz02KUw5NV1BPEcpQT4wICAKLU08QCAgI1tcIChQICUgWCAgKkkgICAgIEQgICQgJEAgICQjLCBFMCAgICosICQgICAiICAgICAgICAgICEKLU0iICE1ICBYICAgIEsgIDwgJEAgICQlWCAuJzk/OUZRTzg3MT84NylSODdEICAnKCAgISAvICIsICEwLiAKLU0gIk0sICAgICkgICEgISggICEiIiApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAsICAgICxQICcKLU0gISggICEiVSAjQVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgICcoICAhIT4gIiwgITAuICAiSywKLU0gICAgKSAgISAhKCAgISM5ICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICsgICAgLDAgJyAhKCAKLU0gISQqICNBVjdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAgIVIgICAwTTAgQyAgNCNAICBKSyAgICAiMCAKLU0gMCAyICAgMStAIjUgICAgSFAgMCAgICggICAgICAgICAgJCggJTQgIkAgICAiSCAhUCAyICAgMTYgIFgKLU09RV1MO1ZZRzdWJVI8RiVZICAhUiAgIDEiQCBDICA0I0AgIEs3ICAgICIwICAwIDIgICAxPyAiNSAgICAKLU1IUCAwICAgKCAgICAgICAgICAkKCAlNCAiMCAgICMoICFQIDIgICAxS0AgWD1FXVU7Ry1JOVZZRTklXUkKLU07RzE/ODcpUjg3RCAgJyggICElOCAiLCAhMC4gICJKXCAgICApICAhICEoICAhJzIgKTQgICAiQyAhICAKLU0gIEAgICAgICAgICAgMEAgNTAgKCAgICAsICAnICEoICAhKCIgI0FWN1ctSTlWWUU5JV1JO0cxPzg3KVIKLU04N0QgICcoICAhJk4gIiwgITAuICAiS1ggICAgKSAgISAhKCAgIShGICk0ICAgIkMgISAgICBAICAgICAKLU0gICAgIDBAIDUwICcgICAgKjAgJyAhKCAgISkvICNBVjdWRU49JV1BPEcpQT4wICA8QCAgJEAoIChQICUKLU0gWCAgKkgwICAgIEQgICQgJEAgICRHLCBFMCAgICosICQgICAiICAgICAgICAgICEiICE1ICA4ICAgIFQKLU0gIDwgJEAgICRKPCAuJzk/PTZZUzo2PU45NjE/PFZBTzxHMT84NylSODdEICAnKCAgISkvICIsICEwLiAKLU0gIktMICAgICkgICEgISggICErKyApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAlICAgICxAICcKLU0gISggICErXSAjQVY3Vy1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCAgPEAgICRKPCAoUCAlIFggICpLMCAKLU0gICBEICAkICRAICAkUiQgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgMCAgICBLICA8ICRAICAKLU0kVFAgLic5PzxWQU88RzE/ODcpUjg3RCAgJyggICErXSAiLCAhMC4gICJLSCAgICApICAhICEoICAhLVAKLU0gKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgIyAgICAsUCAnICEoICAhLkMgI0FWN1c1TjxWRUcKLU07RjVEN1YtSDg3KT84NylSODdEICAnKCAgIS0sICIsICEwLiAgIklAICAgICkgICEgISggICEvJyApNCAKLU0gICJDICEgICAgQCAgICAgICAgICAwQCA1MCAiICAgICwwICcgISggICEvWCAjQVY3Vy1JOVZZRTklXUMKLU06JiVSN1YlUjxGJVkgICFSICAgM0hQIEMgIDQjQCAgSkggICAgIjAgIDAgMiAgIDQnICI1ICAgIEhQIDAKLU0gICAoICAgICAgICAgICQoICU0ICAwICAgIkggIVAgMiAgIDQxQCBYPUVdQzomJVI3ViVSPEYlWSAgIVIKLU0gICAzXiAgQyAgNCNAICBLMCAgICAiMCAhUCAyICAgNDpAIFg9RV1EO1c1QjsmNCAgJTQgI1AgQyAgNCMKLU1AICBKPCAgICAiLCAhUCAyICAgNEMwIFg9RV1GOyZdQT0gICA1MCAuICIsICEwLiAgIkpIICAgICpQICcKLU0gISggICEyWCAjQVY3VzVOPFZFRztGNUQ3VlFPO0Y8ICAlNCAjICBDICA0I0AgIEpZICAgICJEICFQIDIKLU0gICA0WDAgWD1FXVM6Nj1OOTYxPzsmXU45UCAgNTAgKyAiLCAhMC4gICJJRCAgICAoQCAnICEoICAhNCMKLU0gI0FWN1ZRTztGPCAgJTQgIkAgQyAgNCNAICBKVSAgICAiSCAhUCAyICAgNSswIFg9RV1VO0ctSTlWWUUKLU05JV1JO0cwICAlNCAiMCBDICA0I0AgIEo3ICAgICJAICFQIDIgICA1NTAgWD1FXVM6Nj1OOTYxPzo2WVQKLU0gICE1ICBAIChQICUgWCAgKkVAICAgIEEgIDwgJEAgICU3OCAuJzk/OjZZVCAgITUgIDwgKFAgJSBYICAKLU0qR0AgICAgTCAgPCAkQCAgJTooIC4nOT89NllTOjY9Tjk2MT88VkFPPEcwICAlNCAhQCBDICA0I0AgIEoKLU07ICAgICJIICFQIDIgICA1UyAgWD1FXVM6Nj1OOTYxPzxWQU88RzAgICU0ICEwIEMgIDQjQCAgSlIgICAKLU0gIiwgIVAgMiAgIDVbUCBYPUVdUzomXVI9ICAgNTAgJCAiLCAhMC4gICJLOCAgICAqUCAnICEoICAhODoKLU0gI0FWN1c1TjxWRUc7RjVEN1YtSDg3KCAgJTQgIFAgQyAgNCNAICBKSSAgICAiRCAhUCAyICAgNjBQIFgKLU09RV1TOjY9Tjk2MT84VkFBPEAgIDUwICIgIiwgITAuICAiS0AgICAgKEAgJyAhKCAgITlFICNBVjdWLUgKLU04NyggICU0ICAwIEMgIDQjQCAgSzkgICAgIDAgICAgJyAgICAgICAiREggICEtUCAgICFZX19cICAgICAKLU0gICAgPk9fXyAgICAsQCAgICdPX19QICAgJjAgICAhXV9fXCAgICI2ICAgID9PX18gICAgUiAgICAnX18KLU1fUCAgIC9IICAgIiFfX1wgICAkTCAgICBAT19fICAgITdAICAgKC9fX1AgICA5ICAgICIlX19cICAgJyIKLU0gICAgQU9fXyAgICFdICAgICg/X19QICAgQjggICAiKV9fXCAgICk4ICAgIEJPX18gICAiRSAgICArK18KLU1fUCAgIE0gICAgIlVfX1wgICArRiAgICBNT19fICAgIlsgICAgKz9fX1AgICBPMCAgICJZX19cICAgK1wKLU0gICAgTk9fXyAgICMhICAgICtPX19QICAgUFAgICAiXV9fXCAgICw0ICAgIE9PX18gICAjJ0AgICArX18KLU1fUCAgIFJAICAgIyFfX1wgICAsUiAgICBQT19fICAgIy8gICAgLC9fX1AgICBUOCAgICMlX19cICAgLTAKLU0gICAgUU9fXyAgICM2QCAgICxHX19QICAgVlggICAjKl9fXCAgIC1YICAgIFJfX18gICAjQEAgICAsV18KLU1fUCAgIFhQICAgIy5fX1wgICAuNiAgICBTX19fICAgI0ggICAgLSdfX1AgICBaSCAgICMyX19cICAgLlQKLU0gICAgVF9fXyAgICNPQCAgIC03X19QICAgXEAgICAjNl9fXCAgIC8yICAgIFVfX18gICAjVyAgICAtR18KLU1fUCAgIF44ICAgIzpfX1wgICAvUCAgICBXL19fICAgJCEgICAgLVdfX1AgICEgWCAgICM+X19cICAgMDgKLU0gICAgWC9fXyAgICQoQCAgIC4nX19QICAhIlAgICAjQl9fXCAgIDBWICAgIFkvX18gICAkMCAgICAuN18KLU1fUCAgISRIICAgI0ZfX1wgICAxNCAgICBaL19fICAgJDdAICAgLkdfX1AgICEmQCAgICNKX19cICAgMVIKLU0gICAgWy9fXyAgICQ/ICAgIC5XX19QICAhKDggICAjT19fXCAgIDIwICAgIFwvX18gICAkRkAgICAvJ18KLU1fUCAgISowICAgI1JfX1wgICAyTiAgICBdL19fICAgJE4gICAgLztfX1AgICEsKCAgICNXX19cICAgMywKLU0gICAgIC9fXyAgICRYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICQgICAgISAgICAgSCAgIC0wICAgIzQgICAgJFAgICAgICAgICAgICAgICAwICAKLU0gICAgICAgKSAgICAhMCAgICAqICAgI0ggICAgWiAgICA7UCAgICAjICAgICAgICAgIDAgICAgJCAgICAKLU0jUCAgICBMICAgICJAICAiSSAgICBKMCAgICMgICAgICEgICAgICQgICAgJCAgICAkICAgICE8ICAgICMKLU0gICAgIEggICBWMCAgIC1EICAgID5QICAgICAgICAgICAgICAgMCAgICAgICAgID8gICAgISAgICAgKiAKLU0gIC9AICAgI1ggICAgIyAgICAgIyAgICAhUCAgICAwICAgICwgICAgKjAgICAgJCAgICAmQCAgJCQgICAKLU0hISAgICAgJCAgICAgICAgICAgICAgICQgICAgICAgICAiXCAgICAhICAgICFIICAhITAgICAwNCAgICAKLU05ICAgICAgICAgICAgICAgISAgICAhMCAgICBUICAgICAwICAgIDogICAxWCAgICQ+ICAgITQwICAgICAKLU0gICAgICAgICAgMCAgICAgICAgIC5AICAgICQgICAgJkAgIClPICAgIjtQICAgICQgICAgICAgICAgICAKLU0gICAkICAgICAgICAgJCAgICAgISAgICAgWCAgKjwgICAgRyAgICAgIiAgICAgICAgICAgICAgICEgICAKLU0gICAgICAhJiAgICAgMCAgICAuICAiRyggICApUiAgICAhUCAgICAgICAgICAgICAgIDAgICAgJCAgICAKLU0yUCAgICA4ICAgICNAICBJWSAgICI+MCAgICFQICAgICEgICAgICAgICAgJCAgICAiICAgICUwICAgICgKLU0gICAgIFggICpFQCAgIEk4ICAgIVAgICAgICAgICAgICAgICAiICAgICAgICAgITkgICAgIEAgICAgICAKLU0gICAgICAgKjYgICAhUCAgICAgLyAgICAnICAgICAwICAgIDAgICAgODAgICAgLCAgICAgICAgICAgICAKLU0kNUAgICAzNCAgICAgICAgICAgICAgICEgICAgICAgICAmRCAgICAjICAgICAgICAgICAgICE4TCAgICAKLU0gICAgICAgICAgICAgICAgISAgICAgICAgICFQICAgICBQICAgICAgICAgICAgIDYrICAgICkgICAgICAKLU0gICAgICAgICAgJCAgICAgICAgID5AICAgICQgICAgICAgICAgICAgJUtQICAgIy8gICAgICAgICAgICAKLU0gICAkICAgICAgICAgKCwgICAgISAgICAgICAgICAgICAhPiwgICA2PCAgICAgICAgICAgICAgICEgICAKLUogICAgICAiKiAgICAgMCAgICAgICAgICAgICBNXyAgICBJMCAgICAgICAgICAgICAgIDAgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHMtZWNvZmYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwcy1lY29mZi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWY2NTZhLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwcy1lY29mZi51CisrKyAvZGV2L251bGwKQEAgLTEsNjcxICswLDAgQEAKLWJlZ2luIDc3NyBtaXBzLWVjb2ZmCi1NIDYgICIyRzxfJTAgICMgICAgICA4ICBYICA8ISJQKCogICBAICAgICQgICAgKT0gICQgIVAgISAgICAwCi1NICAgICQgIDAgLy9fX19YICAgICAgICAtVCAgICAgICAgICAgJCAiKkAiWVQ5N0FUICAgICAkICFQICEgCi1NIDwgICAhRTAgICAhUCAgICAgICAgICAgICAgICAgICAgIiBOOjZZST0gICAgICEgJlEgIDAhTDAgICAgCi1NKCAgICZRICAgICAgICAgICAgICAgICIgICAgICtGMUE9JiQgICAgMCAgICAkICAgICAgICJJICAgIiAgCi1NICAgICAgICAgICAgICAgICAgICAwIllMOjcwWCAgICAkICAqRCEgICJJICAgICAwICAgSkQgICAgICAgCi1NICAgICAgICAgIEAgICAgTjsmRVQtICAgICEgICJKIDAgIEpAICAgICQgICAqSiAgICAgICAgICAgICAgCi1NICAgMCAgICArRy1EODcxQSAgIDAgIEpQJCAgKkwgICAgJiAgICJKUCAgICAgICAgLCAgICAgICAgICAiCi1NICJZUzhHLVMgICAgJCAgKyQhICAiUSAgICAlICAgICAgICAgICAgICAjICAgICAgICAgICEgIE44Ry1TCi1NICAgICAhICAjJSAwICBRMCAgIjpcICAgICAgICAgICAgICAgICAgICAgICAgICIgPEctUjhQICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgKF5ECi1NICAgXCchICEpWjQgISI+PEJIIERJQCAkICAwMEAqXiVAOTAgUEMgQSlbV19aKl4mQCMiT0ggIDQgICNQCi1NKDBQMCFMPk9BKCYwIyEgITkgICAgICAsJCAlSCAgIEAoOF4kQDkiL0E4JjRDWDogLCBQMCAuTCAgICAgCi1NIyEgIUkgISAoIiQgICAgLSBeICAiICAgICAgR08wICggXiAgIiAgQF4iJCNYICAoICAgICAgICAgICAgCi1NICAgICAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgCi1NICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgCi1NIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBCi1NIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgCi1NICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9ACi1NICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgCi1NICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgJDIgICAgI1ggICggICAgICAvQCAgQCAgICAgCi1NIF4gICIgICAgICEkQCAgIDEoICggIC9AICBAICAgICAgXiAgIiAgICAgICNYICAoICAgICAqLiBAKSBECi1NI0AgIUhYWiBEMjAvICAqQ0NYIjIpIUAgIFo+OEApMEQmMCAkSVlGIEVCMCggIDZHQigiOCkgRCAhSl4pCi1NQClQRCJAICdLWEogSCIwKyAgQk9CWCJEKSBQICI6XixAKkBEIzAgKktYViBLIjAuICBOT0NIIlBRWDIgCi1NKCAgICAgI0dBKCJUUVg+ICQsPiZAITNHQVgiWFlYOiBPKS4vQCkgICAgICBIWF4gUCkuOEApJCAgICAgCi1NSFlCIFBJLjlAKSggICAgIEhZRiBRKD4oQCkwICAgICBJWEIgUig+KUApOCAgICAgSVhGIFMpPipAKUAgCi1NICAgIElYSiBUKF4rQClQICAgICBLWE4gViheLEAqICAgICAgS1hSIFgoXi1AKjAgICAgIEtYViBaKF4uCi1NQCpAICAgICBLWFogXCheL0AqUCAgICAgS1heIF4oXjhAKyAgICAgIEtZQiEgLD4oQCswICAgICBZWEIhCi1NIiw+K0ArQydCSCJcLyAkMCAuMEs4XyNEKkYvVClZRiBEKl45QDEgR0IoIjFLWEIhJSI+KUApKk9COCQ4Ci1NKVhKIEUqXipAMVBHQlgiNktYTiEoIj4sQClCT0MoJEQpWFYgRypeLUAyQEdDSCJAS1haISsiPi9AKjJPCi1NQ1gkUClZQiBKKl44QDMwR0Y4IkxLWUYhLiI+KEArIk9CKCRcKVhGIE0qXilANCBHQkgiWEtYSiExIjArCi1NICAqT0JYJTwpIFAgIEpeLEA2IEQjMCAhS1hWIToiMC4gICZPQ0glRENYXiE2I1AhJCAiTCtWLFBBWUIhCi1NMiAgICAgIkdGKCUwIF4gICIgICAkIiQjWCAgKCAgICAgICAgICAgI1ggICggICAgICAgICAgICAgICAgCi1NKVtXXTQgIiAmIiREI09fX0tbXCAnITFAICEmT0tAIEQvIDAwICBQMCA7MERBICgkJCQgICEwISAmIiYwCi1NM1AgICAgICAgITdAICBAICAgICBEWUIgMCAgICAgIDMgICAjICAgICAhICAgIiwgICEgQSlYLiAxI1AlCi1NJCAiQ0AoISApKjQiJCI+RCBDICwkICdUS1osIkwoXkMgSyBHSSAoXiMhICFdICFAKiIkR0kgKFAjISAiCi1NKCAgICoiJCQwICAxICQgQCgyPkUgIlBEIUAoIiMhICIqKl5EICJARCAwKCIlJCQgIiheRCAiQFwhISAgCi1NKSgwICAiPkUgIlAsJCAoUCkgOCIgSl5AICIyL0kgIEgjISAiXSAgICAgIi9IQCBEICAgICAoXl8gIVBHCi1NTzAqUCBeICAiICAgICAgICAgICApW1dfWCpeXyAhUCwkICwuS1owICggUDAgUkAgICAgIENaMCAoIFAwCi1NITRQICAgICBDW1wgJyI+XSAiICNYICAoICAgICAgICAgICAgICAgICAgICAgIj5dX14iL0BIIFBLWyQgCi1NJipeUCAhMCBAKEBBS1tcICchMSAgICwgMCggQSQgICAlMCAgJCImL0NIIFAgICAgIChXLyAgICAgICAgCi1NJD4gICNQICAkIiYuITAgICAgICAgIChAKCIkLCQgJzcpQSAgISEhICAgLCAwIUBBJCAgICFAIUAkIiYuCi1NITAgICAgICAgITJAX188IigiIEEgICAwKDheXyAhUi9MICA0Q1skICYgL0AgIEBHTzAgQEQqKCAgKSIjCi1NICAgREkwICEkJCwgISIwJiAjVDAgICAsKSA4IC8yMCYgI1QgOCEgQSUkOCAgUjIkICAkI1ggICggKiAwCi1NKDkiQiAgIjBAUCAgKSo0ICAxISNfX0AgOCEgQSUmICAiICAgJCImMEtPX18gICAgICEzLiAgMCAgISBBCi1NIF4gICIgIkAkIiQgICEgQSBeICAiICAgICAgIEAhIEFAKkAgICMyLSAgLDEgICBEIDoxUChIIkkgICQgCi1NS0dAQCQyICAnUCAgICAiIEpAICIgICAgICElICAhSihLICAgQCpMICBZQkwgICwxOCAgNEooUCAgIiZECi1NX19WIVogICEoPlwgISEkICAhLEBBICAkQD5HX19AICAgICAxKCAgLiAgICAgKCdKX19cICAgICAkNCAgCi1NIjhHTF9fViFaUCAgRj5QICAhNUBfXyZMQyAgICBeICAiICAgICAgI1ggIChOKFAgIFoiKiAgKkBCMCAhCi1NIF4gICIqIiggICAgICAgICAgICAgIjAiIF5UICAgICwkLiAgIFAgICAgICgkIDUwICAgICAgL0AgIEAgCi1NICAgICkgKCNaUCAgICBQMFggICMgICAgICBAMCE1ICAgICAgIF4gICIgICAgICAwUCAgOiAoIFgoMSJECi1NICFAIEEwQEolIiAgIiJDISAhICBJQSBAICgoKCpBIEAgIDBIUDAgMCQgICA2UkMhICEgSFAwIDAlIiAgCi1NITAgICAgIFBIQCAjLCgsICBRISMgIEwgICAgICQsICAhUCAgICAgIElBQEFAKiggICIyRSAgJERBICAhCi1NJSovX18qIiJfX1wjWCAgKCAuIDAoMSEgICFARCAwICEkJCQgI1IwISAgKDAwMCAnICAgICAoIkIgICBECi1NSTAgISkoMCAgMjMmX19cMCAgIC5IKCtfX1gyQiAgIERJMCAiKSgwICBCMyZfX1gwICAgKEkoK19fSCJCCi1NICAiJEhQICFIKCggICIyRSAgLERBICAjKSw7X186MiNfX1hIUDAgQCUiICAlQkMhICEiLEhAICBDKiwgCi1NIShSSCAgQixKMCAsQypIICQoUksgITIsSyAgOEMqVCAnKlIiICAiTEBQICRLKEAgIipSKSAgUkxCQCAwCi1NSyhMICUqUiwgIUBESTAgQCkoMCAoIjMmX14gMCAvX0pLKFdfXyJDISAhIDQoICAuKiwkICEoUkIgICIsCi1NSFAgJEMqQCAiKFJJICBSTEBAICBLKCwgISpSKCAgQERJMCAwKSgwICQiMyZfXyAwIC9fUksoR19fIkMhCi1NICAwNCgvXlUgICAgIChSQiAgIERJMCAkKSgwICEiMyZfX1AwIC9fWEsoK19fIkMhICEgIElCQEAlIiAgCi1NITAiJigiIFBIQCAjLCgsICBRISMgIFQgICAgICQsI19LMCAgICAgREk/X18pKDNfX1AiRiYiLiBIQCAgCi1NKSo3X19SMiRfX1w0SF9fXEgoKCAgMC9AICBAIFghIEEkJCAgJiIwISAgLDAwMCAvKSAkICBBISEgIDwgCi1NICAgIEAqK19fUjJFX19cREEvX18pLDtfX1EgICAgWkBAQCAgQSorX19CMkVfX1hEQS9fXiksO19fQSAgCi1NICBCREBAICBAKitfX1gyQ19fVkBAT19fKSo3X18yMiRfX1REUU9fXUkoLCAgIkMhICIgNCggIDYqLCQgCi1NJChSQl9fUixIX19YQypDX10oUklfXyIsSk9fTEMqT19aKFJMX14yLEs/X0BLKCtfXypSI19fQkxCL19UCi1NSyhHX1wqUipfXlJMQl9fSEsoU19ZIjJFX14gREEvX0ApLDtfWCEgIF9eSkxDMCAgKiwkICQhMEAgIFhICi1NUDAgJEMqK19fKFJDX19CLEovX1RDKkdfXCpSIl9fUkxAX19YSyhDX10iMkVfXyBEQS9fUCksO19cISAgCi1NX18qTEIwICAqLCQgISEwQF9bLCAgICAgQyorX18iMkVfX1BEQS9fXCksO19fISAgX19CTEBAICAgICAgCi1NICAgICAgICAgICAgKSAoI1tAICAgIFAwWCAgIyAgICAgIEAwITUgICAgICAgXiAgIiAgICQiJDBAICAvCi1NKSAoICA4XiNAJiAgICAgIComJCAoISBAICBIRCBAICEgIC1QQCNQISQgICArQEBBKSYsICA6UEQgQiJPCi1NQFghQCBeICAiICAgJCIkRCBAICEgXiAgIiAgICAgIi9AWCFAKVtXX1gqXl8gIVJPTDAgOEtbICAlIUFACi1NICBcRDhPX18vIFwwICI3TyBCICAgRyIgLyEkMCAiOFEgQiAhU1ggQUNBQCAgICAgICAgIyAvQCkgICAgCi1NICI4MF9fUCIkMEBLJCIjX14wICAgICIvT1AgPENbICAlKF5RICFAI1ggICgpW1QgKCheLkAnIEdPP19ACi1NLyBcMCAqXlAgIUBFW1AwVS8hIDAgICcvIiJOT09QIDwlIiAgJDI4MCEjMFwmISAgQ1FAKyAgICAgICAzCi1NICAgJSAgICAgIFAwIFc4IiAiIEEkICAgIFAgICAgICwkIC0mIEAgQCg4XjlAJyBGJCAgMCBBRCgqUTBACi1NX18kICAgICBDW1wgJyheUCAhQCNYICAoKVtUICgiPl1fXUJPTCAgOCAoIiAoOl5fICFQNiAgICMpIC9fCi1NX1EgICAiNEQgT19fREAoICMgICAgICBQM0AiIyQ8ICAlIyE4ICBAUDNQICYpICQgIEE3QSAgOCAgIUBBCi1NIyEgIz1AKCAoIiQwICAgIiAkIDgoMCAgJiImMiEgIC0jISAiXSpeQyAiMi9IUCBEISQkICBAICAgICBECi1NIF9fX0RAKCAjICAgICAgUDYgICgkUCAgIUAgICAgIi4hICAoIyEgJiZKXkMgIjIvSFAgREtAICAiKFg5Ci1NICBCQiAgICxLQCAgICAhQCQiJk4mMCAkQ1tcICcoXlAgIUAjWCAgKClbVCAqIj5dX14iT0wgIDggKCIgCi1NKDE4ICAhLk9PUCA8Q1haIDwjUC8kICBFW1AwVS8hIDAgICcvIiJMNCggICopQSAkLSEoICAgLCAgICAgCi1NIyEgIz1AKCAoIiYvRighUClBICAkICg4IiJMNCgvX1ggICAgICEgICAjQCAgISBBREAsICMgICAgICBQCi1NOEAgIiUkICAjIyFIICAyLiEwICBEQDAgIzIwJiAgJCwkIDlQICA0SChYWDkgIEJOICAgICAgIDAoMSAgCi1NICJGTiYwICQsJkAgISE0ICAiIFA7MCBAJCQgICdDIU0gIiIuIEAgKCAgICAgISEgICFIUDswIEBDQEQgCi1NISAgICAgICAyMEBLJCIgICUzIU0gIiAsJCAxNCBAIEAoOSgjICBQICAgICAsJkggISE1ICAgWFA7MCBACi1NLCZMICBBJUAgIExQOzAgQENAKCAiICAgICAgMDAgICcsJlQgKChYLCAgMCAgICAgICRQKCpRMEBfXlggCi1NICAgICwmVCAoISZAICAwICAhQEEkICAgIEIwI19fXCAgIUBBICYgMCg4Xl8gIVIvTCAgOCBeICAiIj5dCi1NICIgR08/XlBLWyAgJypeXyAiUk9MUCBIICoiICg6XlIgIjJPTDAgQEtaMCA0KSgjICBQRCQwISIpISggCi1NIUIwMyAgKFA7QCEyJUJYICkzIUwgIToyI1AgLS8hRDAgICAvUCggIy4sQEFDU0QiSChYIiAgMCAgICAgCi1NICVEKCpRIEAgJFwgICAgIENaQCA0IjAhICBKQDIgICBDQEQgISAgICAgIEUqQCAhS0BIICEpLksgJSwgCi1NICAgICQ2JCAhICAgICAiL0hAITAkICAgOCheXyAiUCwkIDE0IEAgQCgyMCFfX1w0MDAgJENaLCA0ISAgCi1NICAsRCBfX19DWiwgNCAgICAgIDAgICE0ICYgMCgzIUwgITg2MyAgNCwnQCAkSF5NICUgR0kwISxIWlQgCi1NMykoJCAgVk4gICAgIyEgJj4iMCYgICREIDAgISUkJCAhICAgICAiL0hAITAkICAgMTheXyAiUjIjQCAsCi1NKSArX19TNy8gIiAwICAgX0hAXCAjIyFYICEoNj4gIDAgICAgIChYIiAgQCAgICAgJCQgICMgICAgICIuCi1NJjAgJCAgICAgITE5ICBQICAgICBDQEAgICAgICAgIDUgICAoICAgICAjIUkgJDA1KCAgJiAgIDgoMFAwCi1NISlIIiAiIEEkICAgIEAhICYiJCAgIUBBJCYgICBQICAgICAwICAgRCkgK19fWSgjICBQICAgICAsJkggCi1NMSE1IF9aPFA7QCEyIyEgJDUgKCAoIiYuIEAgICAgICAgIjEiX19cJDAwICZLQCggICkuRCAlLCwkIC8oCi1NIEAgSCgxICAgIEoyI1AgLENaTCA0KFgsICAwICAgICBIOEwgIChYLSAgMCAgICAgKTpYICA6WC4gIDIyCi1NI1AgLCAgICAgIydYICIgMyAgICRDWiwgNCEgICAgLEQgX19fQ1osIDQgICAgICAgOCEgQUNbXCArKF5QCi1NICFSL0wwIEBDWyggKSheUyAiQCNYICAoKVtUIDQiPl1fXiJPT1AgNCAoIFgoOFNDICBCMFtQICxDLlggCi1NISAhQCoiJFFeICEkSy40ICEhLCAgIEAhUTMgQ0QvRCAjM1ApJCAgRSowKkAgIUUgQCAkKSgiJDAgICAqCi1NSy4gICApI0ogIFRcIyEgICk4UCJIICAqNiggITsiIEFDKFQgICAgICAgICFIUSBDSy4oICAoU0IgICAgCi1NICAgICEkJCAhICEgJiIkMCAgICIgICA4KDAhICYiJixDQCAgQy5cICEgICAgICAhU1wgQyBQLCgqQSBACi1NICBIICAgICBLWjQgJypeRiAhQCBYIiBBIyEgJS1KXkcgIiIvSTAgPENaOCAmKF5HICIgICAgICAmLCAgCi1NI1AgICQiJjBZICAtS1o8ICggUDAhR0JPSUAgOENaOCAmKF5HICIgMFBAICcgICAwKDkjWSAgUEQgT19fCi1NLVJAICghICAgICpAWiAgLCAgIDAoOF5fICEwR08wIEAgXiAgIiAgICAgIEdPP19IS1tcICUpIiIgIFBECi1NIDAgIiwkWCAkQSchICBQICAgICAsJFwgQEE3QCAgOEQgP19PIyEgJkBSMCQgIEQwICAgUikgK19fUjAhCi1NX15cIDA8IEQtUUQgIEoiOSAgUixAUCAoICAgICAhMUAgIDwgICAgICMhICRXOl5EICFCL0kgIDggICAgCi1NIChSIyAgQCAgICAgQyhAICEgICAgICA0OiAgQCAgIDAoOSIpICBQICAgICAsMkggMSE1ICAhTCAgISBBCi1NRChMICMzUC0kICBFSzAqQCAgTUBAICYtKiImLEtAICAgICAgICAnIz4iLkxDUCAgQygoICAgICAgICAkCi1NMDAgJCAkIDgoMSAgICAoICAhQEEgJCA4KDhSWCAgIixGMCAkICAgICAgLDkwIiwhIFBASiQiICAhICAgCi1NJCIkLCQgNFYgICAgICAgICQiJi9PUCA0KVtUICYgL0AgIEAgICAgIClbV19YKl5fICEwIEAiQEFEKlggCi1NIykiQyAgVFFTUCAkJD4gICMgIUAsIiRcJjEgIClTRUAiICAmUCwgIyYxIEEgIC0oQCNQISQgICAqMEBBCi1NSyooICIiMSggIEAwICAgVEsiQCJIIkMhICAoMCggIDMgICAgICEzICAgOCAgICAgLyAsMCAiMUMkICJMCi1NSFAgKCQgICAhMCFAJCIkXCBRICApJi0gICpSQyAgQCA4ISBBRCpMICMzUCEkICAgIlYiICAiUCgoMjEqCi1NKCAgMCAgID9LIkgiSCpeRSAiIEQhIiAoIyEgJTUqXkYgIVIvSTAgQENaOCAnISEgICBSTEhAIChEKlQgCi1NIykiWSAgVixLUCAoLyAkMCAjNk4gIEAgJjQiIEgqWCAjICBIIiIkRV4iICAkICAgIypQWCBKIFwiUSAgCi1NRCpQICMyNUs4IEAgIURDICAyTDAoM1AhJCAgICMmQiAgIlQoKDpSQiAgQEQyQCAoSyJIIkgoUk4gIEAgCi1NUCIgQUsqWCAhIFAwIUhCT0kwIEBDWjQgKCEhICAgRi9PUCA0RCooICMgICAgICBQM1AgJCU+ICAhKF5fCi1NICEwVDYwISBIK0QgIyheXyAhMEdPMCBAIF4gICIgICAgICIwQ0AgLS8gLDAgICAuPiggIDtRQEFDJiwiCi1NSChSOCAgMCAgICAgICdAMChQMSEgICwgICAgICBeICAiKlIjICAyLEYwICAgICAgICAhOSIiSDAoICAiCi1NICAgICAqUiIgICAjWCAgKCAgICAgICAgICAgICAgICApICgjWjAgICAgUCNYICAoICAgICAjUCEkICJMCi1NKEBQOCBeICAiIjAiX19cR08/XkhLWzggKypeUiAhUk9PUCBUS1s8ICwqXlUgIkIvQ0glUEtbMCApKl5TCi1NICIiT0wwIDggKCIwKDpeUCAhMDFQICAkICAiUCg4XiVAODAwICAgKylZNiE8Ij4iQDcwR0U4JVBLWCohCi1NPyMxLyAgJk9DWCVQLUtAICAwKkAuIiZPRiglVCAkIEgoOl4nQDdCL0FYJVgpIT9fX1IwNF9fWCBYKEBBCi1NICAgUCg4WEMgICAgICAgICAmIDAoMyE5ICAkNyggID0gQiIgKDAhQEAiJi4gQCAgKUQwICFQICQoKChQCi1NMiAgISUwICAjQCAkKCggIigjQEFLWD4hPiEyUCAgKk4oQCAgIEIgSCg4WEMgICAgICAgICAmIiAoOFgiCi1NICAgICAgICAsJEQgIDEkQF9fOCAgICAgIEIwMCgwKCIiIkw0KCAgIyAlJCgqUSBAICZIICAgICAgJiAwCi1NKDAoQEAiJCA1KEBEIEEkKCpRMEBfXUwgICAgIENYSiE/ICAgICAgMiJAICMgICAgICEgICAgMk9BOCYkCi1NJEM0ICEyMyYgICZPQTgmJCQgICA6UCAgJCIkRFFAICErLCQgIEEwQF9cUCAgICAgKUQsICFQICMmKCpPCi1NSFAgWCAqIigoMCAgKCIkLCQgOkBLWDYhQSheK0A3Ui9IUCBYKTZQICEhISwgIFAgMCggQSkmOCdfUCAmCi1NLEwoUDEgICMkKCAgJCAgJixUIEQjMCAkIDowOChQIUBMIiQgMFggQSQgICAiQCM2LCImL0E4JiRDWFohCi1NPyAgICAgICFRN0BDICBfIEBQIVgsIixEUUBAICAgOFJQQCAmLFQgIiFMQEEgUyAoKlEgQCAgMFwgN19fCi1NJCAgIDAwICAkIiRcIDdfXy0iJ0AgMCMhIiJMNCggIC0gLCI4KDNQJD9fXFRBLiAgIyEgJkgqXkYgJEIvCi1NSUAhKCUlPCAhI1AhQCAgMCAgIFMgICAwKDNQIUAgIFQoMiAgICwkUCgwUDAhSiAgUCIgQSUlPCAhMCAgCi1NICAgLCQgOkwgQCBAKDEgICAiQCAgISBBQ1hCIT8gKDMyIiQhLUUgQyk0T19fKlQwICAiTiJQICBDWFIhCi1NPyAoICoiJEVDMCAkJEBUICEzOkIgICYtQ0AgICAgICAgIzcvICAmTUNQICBDQUAgICAgICAgIk9GKCVcCi1NQ1lGIT8hICBfVz5PKEAgICAkIFgoMCNQIiJMMCggICYtLkQgIDhTSCAgICAgICAgS1hCIUAqU0MgICBUCi1NWjAgISQrJCAhKlhJICAiT0FYJVgkICAgISpeJUA4MCBYIkBBS1g2IUEqXidAN0BGKEAgJENbXCAtKF5QCi1NICEyL0wwIDhDWyggJyheUyAiIi9NICBEQ1s0ICooXlYgIlIvTVAgUCBeICAiIj5dICVAMEAgIC0gKCAwCi1NKDIyIl9fUk9ASCVYQyRYICAiMCFfX1ghUDdAREskXCAgKFE5ICAiL0YoJVwgICAgICE8OSAgKCAgICAgCi1NS1gqIUEgL0AgIEAgICAgIClbV19SKl5QICFAIEAoIEEkQCAgLipeXyAhUi4gT19cICAgICAjIS4gICQxCi1NUCAgKCAlIDgoUCggKCIkLCQgODpLWjQgLyheRSAjUi4gT19cICAgICAgITAmIiwgIFFCI0taLCApICJACi1NKCIkLCQgNTRLWjQgLyheQyAiMi9JMCBcJCQgICEwISAoIiQwNCAgIyAgICAgITJAICAwRElQICMkICAgCi1NKDAiICQiJERJUCAjICA8WEBAI0MiIkwwKCAgIiAgICAgICNAJiImT0kgIFQgQCBIKDAgIywoICwkIChQCi1NS1o8ICgoXkQgIzIvSVAgQCAlICgqUSBAICEgICAgICAgID1YQCAhLyYiJCA8IEBLJSIgICJQICAgICAgCi1NPCxAQyAhRSBAWF44QDggICIkQiAgJEUwKDEgICAgMk02ICAgIyEgJTUgIkAoIiQgMCIgQSAoIDAoOF5fCi1NICFSL0wgIDggXiAgIiI+XSAjQCAgICAgICAgICAiMCIgX0wgICAgLCQuICAgUCAgICAgKCQgNTAgICAgCi1NICAvQCAgQCAgICAgKSAoI1sgICAgIFAwWCAgIyAgICAgIEAwITUgICAgICAgXiAgIiAgICAgIi9ASCY4Ci1NIF4gICIgICAgICJPQSgmOCBeICAiICIgJCIkICAgICAgICAgICI+XV9bIk9PUCA8IyEgJkAqXkQgJSIvCi1NSSAhMEtaKCApIjAlNSBALCQgOlwpWjggKiAxISAgPEQgQCAhQ1owICkgUDAhSCwgICAgICQgICAgQCAgCi1NJCIkRCBAICFDW1wgJyI+XSAlICNYICAoICAgICAgICAgICAgICAgICAgICAgI1AjJCAiLDhQSiQpICgjCi1NXjAiIygiJCAgICAsJS4gICEjUCEkICAgOCEgQSBeICAiKlBEIkgwKCQgNTAgICAgICNQIiQgIiwwQEogCi1NICAgICAgIiIiIkwwKCAgIiAgICAgICEgKCIkRCBAL1kgICAgIyEzQF9fMFwgMSAgSyIwKkEgL0AgIEAgCi1NICEgQSAgICAgICAgICAgRCBAMD4gICAgIyEjQCAgLCAgICAgIiEgJTQgICAgICAjWCAgKCAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICNYICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICgiIEAoIiBAKCIgQCoiQEgqIkBAKCIgQCgiIEAoIiBAKCIgQCgiIEAoIiEoJCEgMCQhIDAkISAwCi1NJCEgMCQhIDBBKDIkQSgyJEEoMiRBISAwJCEgMCQhIiFAOCYhQDgkISAwJCEgMCQhIDAkISAwJCEgMCQhCi1NIDAkISAxIDAkISAwJCgqIkBIKiJAQCgiIEAoIiBAKCIgQCgiIEAoIiBAKCIgQCgiJCEgMCQiICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAoIyEgNCYhUEApCi1NIkBMLCMwWC8kISQyJFEwNSVBPDgmMUg7JyFUPidSIEEoQixEKTI4RyoiREoqUlBNK0JcUCwzKFMtIzRWCi1NLVNAWS5DTFwvM1hfMCYlQjhWMUU5Rj1IOjZJSzsmVU47VyFRPEctVD03OVc+J0VaNlVRPTdFXUAwNCkjCi1NMSQ1JjFUQSkyRE0sMzRZLzQlJTI0VTE1NUU9ODY1SVs/J1VeP1AgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISMyJSkjMyQlMzRQICAgICBPOyZFQitWLUg8Ri1MCi1NODctUytQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgISAgOCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAkICAgICAgICAgICAgICAgICAgICAiIDAgICAgICAgISAgOCFAMCAmIDghQCggCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICo9ICQgIkcwICAgCi1NICAgICAgICAwJkQgICAgICAgICAgICAgICAgICAkKyggICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgIDAgICAmJVM4VkVJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICQgICo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgIDwgRCIiQCAgIUQgICAgKyAgICBQOCAgICAgICAgICAgICAgIC0gICAsUiAgICAkWSAgIF1MICAgCi1NICAgICAgICAgICAiJFAgIDMlUCAgIEEsICAhNEogICAhQjAgICVTVCAgICAnQCAgOFFAICAgITwgICFLCi1NQiAgICAoPCAgJlNYLC8gQFgjIDAwLSEgVCQgMCgqIiEgITkgXCMgMCQhJUBQJSBBKCEgMCgwNCUhMDQlCi1NITA0JSEwNCUhMDgnLCEkMSgxJDEoMSQxKDEkMShBLFIkQShCJEEoQiRBKEIkQShCJSIkMSQyJDEkMiQxCi1NJDIkMSQyJDEoMSQxJDIoQiRQJCEsLSIgICBCUDYoLCAiMSQwLC8gNCRBMEY1ISBCKTAmICAgWiBfXyohCi1NICBcMiRQNFBYIyQ3JSEkOCAhPDIkMUAhJDEpMDghIDAkISAwJCEgMCQhIDAkISAwJCEgUCQhIDAkISAwCi1NJCEgMCQhIDAkISAwJCEgUCQiIDAkISAgJCEkMSQwIDAkMSQxMC8gQSxBIDIkOCggIkEgMCQ3JDAoISBACi1NJC4hIFwoJCAiQSgyLCEgQCQhIzA8ISBAJCEjMDwhIEBcIyAwWCgoICMhIDAkISAwJCEgMCghIDAkISAwCi1NJCkiICAgRDAkLSFSJCEgMCQiIDAkLSEwJCEjMDxBIDAoISAwVCggICQsISBUJCAwJDckMCQhIEAkIiAwCi1NWCQjUEAwICokQShQJCIgMCQtIVAkIiAwJC0hUCQiI1AsISNAQEAgLCQhIDAkISAwJCEgQCQhIDAkISAwCi1NRCggICIxIDBUJygwJCEgMCghIDBUJSAwJC0hUiQhIEAkISMwICEgMSQyJDYlIShCISI8NyUjIzAsLSBSCi1NVCMmJCAgSDMsMTAzIFQjMDAxMEMkUiA1JCIkMiRRISBYISBAXCEsIiwtIVYkUjhUKSIjUCg/ISghIUAoCi1NICFAISIgKTImICBIIDEoOCAzKDAoLiBAXCEwMiQhI1AkLyFIIiA4MSUjJDgiIkAnIEQgQFgyI1AkLiBICi1NIUFAKCEhQCAkISNQJC8gVCAxMDIkMSRDKFE0OCYhQCYpICkgVCMnMDIhI1AsQkAoLVIgMlwhI1AkMSNQCi1NLiAkQCQvIDggISQzLiAgMSUhIDEgISlBPC8gJTwpMVBUIzBQWDEgQFgjIDEwQSA1JiQjUCQhPDYoISAwCi1NJEJAQSRRJSBcISgwXCEnUDwxJ1AoQSBQWCIgVyhRJSNcIjgxKEIsMSQ0ISJQJCAwRCcoMyRBIEBYJCBCCi1NJEEgQCguIEUmICkgVCckUyUzJCJAICApQC9fV0EgICslMSQ1KC4gQyQyMDAlQTw0JC8gUiUgIDAkMSQxCi1NICEgMSQxJSIwIiQhMCwhMFwhMEIkMjBBKC8gQCQyI1AkMiQzJCIgMCQxJDEgISAxJDEkICAgICAgICAgCi1NIEAgICAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICFAICcwICAgICAgLiAgICAmPCAgICAgCi1NICAgIDogICAgIDAgICAgOiAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgKCggCi1NICAiJCAgICAmQCAgICcgICAgICYgICAgJyAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9Ci1NICFcICAgIi8gICAgRFAgICAhTCAgICFcICAgICIgICAgIVwgICAgICAgICAgL19fX19cICAgICAgICAgCi1NICAgICAgICAnMCA/ICAgIEdAICAgKiAgICAgPiAgICAgICAgICIkICAgICAgICAgICAgICAgI19fX19fCi1NICAgICAgICAgICAgICAgICAhVCAnUCAgICdEICAgIVkgICAgICAgICAhQCAgICBFICAgICFAICAgICAgCi1NICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICFaICAgID5AICAgICQgICAgUCAgICAqMCAgCi1NICBQICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICA+UCAgICdMICAgICIgICAgCi1NMiAgICAiVCAgICAyICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAnVCAgICFdCi1NICAgICBQICAgJiAgICAgUSAgICAmICAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgCi1NICAhXiAgICA/QCAgICAwICAgIVggICAgLTAgICAhWCAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgCi1NICAgICcwID8gICAgP1AgICAnXCAgICAlICAgIEQgICAgI0QgICAgRCAgICAgICAgICAjX19fX18gICAgCi1NICAgICAgICAgICAgICFUICdQICAgKCQgICAiISAgICAhQCAgICpAICAgIF0gICAgKkAgICAgICAgICAgCi1NX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIiIgICAgQEAgICAgPCAgICMgICAgIDAwICAgIyAgCi1NICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgIEBQICAgKCwgICAgKCAgICBWICAgCi1NICQ0ICAgIFYgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICg0ICAgIiUgICAgCi1NIjAgICAvICAgICEpICAgIC8gICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICImCi1NICAgIEFAICAgIEggICAkKCAgICAzMCAgICQoICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgCi1NJzAgPyAgICBBUCAgICg8ICAgICsgICAhKCAgICAlJCAgICEoICAgICAgICAgICNfX19fXyAgICAgICAgCi1NICAgICAgICAgIVQgJ1AgICAoRCAgICIpICAgICMgICAgM1AgICAhNSAgICAzUCAgICAgICAgICBfX19fCi1NX1AgICAgICAgICAgICAgICAgID0gIVwgICAiKiAgICBCQCAgICBUICAgJTwgICAgQTAgICAlPCAgICAgCi1NICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgTEAgICAvPCAgICAuICAgICAgICAgICQgCi1NICAgICAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgICggICAgIiAgICAgICAgCi1NICAgICAgICIgICAgICggICAgI19fX1VMX19fX19QICAgICAgICAgICAgICJMICA9ICFcICAgIT8gICAgCi1NQFAgICAgICAgICAgICAgICAwICAgICIgICAgIF9fX19fL19fX19cICAgICAgICAgICAgICAiICAnMCA/Ci1NICAgICcwICAgIlggICAgICAgICAgICAgICAkICAgICBAICwgIC9fX19fU19fX19fICAgICAgICAgICAgCi1NICAgQCAhVCAnUCAgICFYICAgIEYgICAgICAgICAoUCAgICAjICAgIChQICAgICAgICAgIF9fX19fUCAgCi1NICAgICAgICAgICAgICAgPSAhXCAgICBTICAgIC4wICAgIEQgICAgICAgICAgMCAgICAgICAgICAgICAgCi1NIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICA4QCAgIClIICAgICAgICAgICAgICAgJCAgICAgCi1NICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAgWCAgICAyICAgICAgICAgICAgCi1NICAgISAgICAgICAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAgLiAgICAkQCAgCi1NICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgCi1NKiAgICAyWCAgICAgICAgICAgICAgICQgICAgICAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgCi1NICFUICdQICAgIFggICAgMyAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgX19fX19QICAgICAgCi1NICAgICAgICAgICA9ICFcICAgIDcgICAgJyAgICAgICAgICEoICAgICEwICAgISogIFAgIF9fX19fL19fCi1NX19cICAgICAgICAgICAgICAiICAnMCA/ICAgICgwICAgIjQgICAgJCAgICAgICAgICAkICAgICBAICQgCi1NIC9fX19fU19fX19fICAgICAgICAgICAgICAgQCAhVCAnUCAgICJIICAgIF0gICAgICAgICAnQCAgICAjCi1NICAgICdIICEgICNfX19fVF9fX19fUCAgICAgICAgICAgICAgKiAgPSAhXCAgICEuICAgIDkwICAgIFggCi1NICAkWCAgICAhMCAgICRaICAwICBfX19fXy9fX19fXCAgICAgICAgICAgICAgIiAgJzAgPyAgICA8QCAgCi1NIChEICAgIEIgICAiQCAgICAgPCAgICJAQCBcICAvX19fXVNfX19fXyAgICAgICAgICAgICAgITAgIVQgCi1NJ1AgICApSCAgICJaICAgIC0wICAhKyAgICAgKSAgICErKCAgICAjX19fX1RfX19fX1AgICAgICAgICAgCi1NICAgICggID0gIVwgICAjMiAgICBXQCAgICU4ICAgNyggICAgIlAgICA3KiAgICAgX19fX18vX19fX1wgCi1NICAgICAgICAgICAgICFAICcwID8gICAgWkAgICAvQCAgICFLICAgJlUgICAgIFQgICAmVUAgICAgL19fCi1NX18zX19fX18gICAgICAgICAgICAgICBAICFUICdQICAgMCwgICAkOyAgICA+ICAgIiNAICAgIC8gICAiCi1NI0AgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgJEkgICAhLCAgICApNCAgICAgCi1NICAgICAwICAgICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgICNAICAgIFwgCi1NICAgICAgICAgICAgICAkICAgICAgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgCi1NICEkICAgID4gICAgICAgICAgICAgICAmICAgICAoI18gICNfX19fPF9fX19fUCAgICAgICAgICAgICAgCi1NNiAgPSAhXCAgICFEICAgIFEwICAgICAgICAsOCAgICAiICAgICw8ICAgICAgICAgIC9fX19fXCAgICAgCi1NICAgICAgICAgICAgJzAgPyAgICBTICAgIC1MICAgIS4gICAjNiAgICAgSCAgICM3QCAkICAvX19fXjNfCi1NX19fXyAgICAgICAgICAgICAgIFggIVQgJ1AgICAuOCAgICQhICAgIDUgICAgICAgICAgISAgICAgICAgCi1NICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAgLiAgICAkQCAgICAgICAgICAgICAgCi1NIDAgICAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgI0AgICAhKCAgICAgCi1NICAgICAgICAgICQgICAgICAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgIVwgCi1NICAgQyAgICAgICAgICBQICAgICMgICAgIFAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9Ci1NICFcICAgIEogICAgLCAgICAgJCAgICAgICAgICAwICAgICIgICAgIF9fX19TL19fX19cICAgICAgICAgCi1NICAgICAlICAnMCA/ICAgICdAICAgIkAgICAgICAgICAgICAgICAkICAgICAgICAgICAgICAgI19fX19fCi1NICAgICAgICAgICAgICAgICAhVCAnUCAgICE8ICAgID8gICAgICAgICAjICAgICAkICAgICJQICAgICAgCi1NICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICBFICAgICtQICAgIEAgICAgICAgICAgMCAgCi1NICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICAjQCAgICEoICAgICAgICAgCi1NIDAgICAgIEwoICArICAgICMgICAgICAoS19fXyAgICAlMCEgIDwgOCggICIgICAgJTAgICAmQEAoICAiCi1NICAgICcwISAgQkA4KCAgJiAgICAnMCAgICBAQCggICQgICAgKjAhICBDIDgoICAqICAgICowICAgIFBACi1NKCAgJiAgICAsMCEgIENQOCggIC4gICAgLDAgICAgQEAoICAoICAgICAwICAgICBAKCAgICAgICAgMCAgCi1NICAgTCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgCi1NIDAgICAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggIiogICAgMEAgICAhQUk4ICApCi1NICAgIDJQICAgICBFOCAgKCAgICA2MCAgICEgRTggICMgICAgOiAgICAiIEU4ICAkICAgID0wICAgJCBFCi1NOCAgJSAgICBAUCAgICYgRTggICYgICAgREAgICAoIEU4ICAnICAgICAgICAgICBBOCAgISAgICBIQCAgCi1NICFBSTggIDEgICAgSVAgICAgIEU4ICAoICAgIE0wICAgISBFOCAgIyAgICBRICAgICIgRTggICQgICAgCi1NVDAgICAkIEU4ICAlICAgIFdQICAgJiBFOCAgJiAgICBbQCAgICggRTggICcgICAgICAgICAgIEE4ICApCi1NICAgIF9AICAgIEFNOCAgOSAgICEhQCAgICAgRTggICggICAhJSAgICAgIEU4ICAjICAgIShQICAgICBFCi1NOCAgJCAgICEsICAgICAgRTggICUgICAhL0AgICAgIEU4ICAmICAgITMwICAgICBFOCAgJyAgICAgICAgCi1NICAgQTggIDEgICAhNzAgICAgQU04ICBBICAgIThAICAgICBFOCAgKCAgICE8ICAgICAgRTggICMgICAhCi1NP1AgICAgIEU4ICAkICAgIUMgICAgICBFOCAgJSAgICFGQCAgICAgRTggICYgICAhSjAgICAgIEU4ICAnCi1NICAgICAgICAgICBBOCAgOSAgICFOMCEgIEUgOCggIicgICAgICAgICAgIDwoICBEICAgICAgICAgIEBACi1NKCAgQiAgICFOMCAgICFAQCggIEEgICAhUTAhICBGQDgoICIpICAgICAgICAgICA8KCAgSCAgICAgICAgCi1NICBAQCggIEYgICAhUTAgICAhQEAoICBFICAgIVYgISAgSCA4KCAiKyAgICAgICAgICAgPCggIEwgICAgCi1NICAgICAgQEAoICBKICAgIVYgICAgIUBAKCAgSSAgICFbMCEgIElAOCggIi0gICAgICAgICAgIDwoICBQCi1NICAgICAgICAgIEBAKCAgTiAgICFbMCAgICFAQCggIE0gICAhXkAhICBLIDgoICIvICAgICAgICAgICA8Ci1NKCAgVCAgICAgICAgICBAQCggIFIgICAhXkAgICAhQEAoICBRICAgIiNAISAgTEA4KCAiMSAgICAgICAgCi1NICAgPCggIFggICAgICAgICAgQEAoICBWICAgIiNAICAgIUBAKCAgVSAgICIpICEgIE4gOCggIjMgICAgCi1NICAgICAgIDwoICBcICAgICAgICAgIEBAKCAgWiAgICIpICAgICFAQCggIFkgICAiK1AhICBPQDgoICI1Ci1NICAgICAgICAgICA8KCAhICAgICAgICAgICBAQCggIF4gICAiK1AgICAhQEAoICBdICAgIjAwISAgUSA4Ci1NKCAiNyAgICAgICAgICAgPCggISQgICAgICAgICAgQEAoICEiICAgIjAwICAgIUBAKCAhISAgICI1MCEgCi1NIFJAOCggIjkgICAgICAgICAgIDwoICEoICAgICAgICAgIEBAKCAhJiAgICI1MCAgICFAQCggISUgICAiCi1NODAhICBUIDgoICI7ICAgICAgICAgICA8KCAhLCAgICAgICAgICBAQCggISogICAiODAgICAhQEAoICEpCi1NICAgIj0gISAgVUA4KCAiPSAgICAgICAgICAgPCggITAgICAgICAgICAgQEAoICEuICAgIj0gICAgIUBACi1NKCAhLSAgICJCMCEgIFcgOCggIj8gICAgICAgICAgIDwoICE0ICAgICAgICAgIFBAKCAhMiAgICJCMCAgCi1NICFQQCggITEgICAiRUAhICBYUDgoICJBICAgICAgICAgICA8KCAhOCAgICAgICAgICEgQCggITYgICAiCi1NRUAgICAiIEAoICE1ICAgIkkgICAgKUFJOCAhPiAgICJKMCAgICAgRTggIkYgICAiS0AgICAiIEU4ICJJCi1NICAgIk1QICAgJCBFOCAiTCAgICAgICAgICAgQTggITkgICAiTzAgICApIU04ICFDICAgIlEwICAgICBFCi1NOCAjJCAgICJSQCAgICAgRTggIycgICAiVFAgICAgIEU4ICMqICAgICAgICAgICBBOCAhPiAgICJWMCAgCi1NICAxUTggIUggICAiV0AgICAgIEU4ICNCICAgIlhAICAgICRFOCAjQyAgICJaICAgICAoRTggI0QgICAgCi1NICAgICAgIEE4ICFDICAgIlswICAgIDFROCAhTSAgICJdICAgICAgRTggI0sgICAiXlAgICAgJEU4ICNMCi1NICAgIyBAICAgIChFOCAjTSAgICAgICAgICAgQTggIUggICAjIVAgICAgMVE4ICFRICAgIyMgICAgICBFCi1NOCAjVCAgICMkQCAgICAkRTggI1UgICAgICAgICAgIEE4ICFNICAgIyVQICAgIDFROCAhVSAgICMnICAgCi1NICAgRTggI1wgICAjKCAgICAgJEU4ICNdICAgICAgICAgICBBOCAhUSAgICMqICAgICAxUTggIVkgICAjCi1NKzAgICAgIEU4ICQkICAgIyxQICAgICRFOCAkJSAgICAgICAgICAgQTggIVUgICAjLiAgICAgIEk4ICQmCi1NICAgIzAgICAgIDFROCAhXiAgICMxQCAgICAgRTggJCwgICAjMyAgICAgJEU4ICQtICAgICAgICAgICBBCi1NOCAhWiAgICM0MCAgICAgSTggJC4gICAjNkAgICAgMVE4ICIlICAgIzkwICAgIChFOCAkNCAgICM6MCAgCi1NICAkRTggJDUgICAjOzAgICAgIEU4ICQ2ICAgIzxAICAgICxFOCAkNyAgICAgICAgICAgQTggIV8gICAjCi1NPiAhICBaUDgoICQ4ICAgICAgICAgICA8KCAiKCAgICAgICAgID0gQCggIiYgICAjPiAgICA+IEAoICIlCi1NICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgJSAhICE5IDgoICAtICAgICUgICAgIEBACi1NKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICIxICAiTCApS19fXyAgICAlICEgCi1NITogOCggIC0gICAgJSAgICAuUEAoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgCi1NI0AhICFJIDgoICAtICAgICNAICAgIzBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAmCi1NICAgICJAISAhTSA4KCAgLSAgICAiQCAgIChQQCggICEgICAgJDAhICFVUFgoICAvICAgICQwICAgJzBACi1NKCAgIyAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICApICAgICNAISAhXSA4KCAgIiAgICAlMCEgCi1NIiFANCtfX18gICAgKEAhICImIDQrX19fICAgICowISAiJkA0K19fXyAgICAsICEgIiZQNCtfX18gICAgCi1NLVAhICInIDQrX19fICAgICNAICAgKkBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAlCi1NICAgICMwISAiKCA4KCAgIiAgICAkUCEgIilANCtfX18gICAgIzAgICAiIEAoICAhICAgICAwICAgICBACi1NKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgCi1NICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICMwISAiKiA4KCAgIiAgICAkUCEgIitANCtfX18gICAgCi1NIzAgICAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggIDkgICAgIzAhICIsIDgoICAiCi1NICAgICUgISAiLyA0K19fXyAgICAnUCEgIjBQNCtfX18gICAgLDAhICIxQDQrX19fICAgIC9QISAiMlA0Ci1NK19fXyAgICAwUCEgIjMwNCtfX18gICAgNDAhICI2MDQrX19fICAgIDcgISAiN1A0K19fXyAgICA5UCEgCi1NIjlANCtfX18gICAgPCAhICI5QDQrX19fICAgID8gISAiPzA0K19fXyAgICBCICEgIkMgNCtfX18gICAgCi1NRFAhICJFMDQrX19fICAgIEdQISAiRzA0K19fXyAgICBMQCEgIkhANCtfX18gICAgUCAhICJKMDQrX19fCi1NICAgIFNAISAiTTA0K19fXyAgICBWMCEgIk5QNCtfX18gICAgWSAhICJQQDQrX19fICAgIFtAISAiUEA0Ci1NK19fXyAgICBeUCEgIlYwNCtfX18gICAhIiAhICJaIDQrX19fICAgICMwICAgUDBAKCAgISAgICAgMCAgCi1NICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICNAISAiXSA4KCAgIiAgICAlMCEgIl5ANCtfX18gICAgCi1NI0AgICAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICggICAgIkEgICJOIClLX19fCi1NICAgICRRICAgQiAoM19fXyAgICAnQCEgIl8gOCggIC0gICAgJ0AgICAkQEAoICAjICAgICkwISAjI0A4Ci1NKCAgLyAgICApMCAgICZAQCggICUgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgMiAgICAiQCEgCi1NIyogOCggIC0gICAgIkAgICAnQEAoICAhICAgICRQISAjMUA4KCAgLyAgICAkUCAgICwgQCggICMgICAgCi1NJkAhICM9QDgoICAxICAgICZAICAgNEBAKCAgJSAgICAoMCEgI1IgOCggIDMgICAgKDAgICBDIEAoICAnCi1NICAgICowISAkNSA4KCAgNSAgICAqMCAgIDFAQCggICkgICAgLEAhICRGQDgoICA3ICAgICxAICAgMFBACi1NKCAgKyAgICAuQCEgJFcwOCggIDkgICAgLkAgICA2MEAoICAtICAgIDBQISAlLUA4KCAgOyAgICAwUCAgCi1NICUgQCggIC8gICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAjICEgJTMgOCggICIgICAgCi1NIyAgICAhIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgI0AhICU0IDgoICAiCi1NICAgICNAICAgISBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAiICAgICAwICAgICBACi1NKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgLSAgICAiQSAgCi1NIl8gKVNfX18gICAgJDEgICJfQClTX19fICAgICYhICAiX1ApU19fXyAgICAnUSAgIyAgKVNfX18gICAgCi1NKUEgICMgMClTX19fICAgICtQISAlNSA4KCAgLSAgICArUCAgIFFAQCggICYgICAgLUAhICYmQDgoICAvCi1NICAgIC1AICAgJCBAKCAgKCAgICAuUCEgJipAOCggIDEgICAgLlAgICAxIEAoICAqICAgICAwICAgICBACi1NKCAgICAgICAgMCAgICAgTCggICUgICAgI0AhICY8IDgoICAiICAgICUwISAmPUA0K19fXyAgICAjQCAgCi1NICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAjQCEgJj4gOCggICIgICAgCi1NJTAhICY/QDQrX19fICAgICNAICAgIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAmCi1NICAgICMgISAmQCA4KCAgLSAgICAjICAgICBQQCggICEgICAgJTAhICZAUDgoICAvICAgICUwICAgIFBACi1NKCAgIyAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgICJQISAmQiA4KCAgLSAgICAiUCAgCi1NICUwQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgKCAgICAjMCEgJkggOCggICIgICAgCi1NIzAgICAiQEAoICAhICAgICRQISAmSkA0K19fXyAgICAlUCEgJksgOCggICYgICAgJyAhICZMUDQrX19fCi1NICAgICVQICAgI0BAKCAgJCAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICNAISAmTyA4Ci1NKCAgIiAgICAlMCEgJlBANCtfX18gICAgI0AgICAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgCi1NICAgTCggICIgICAgIDAgICAgIEAoICAgX19fX19QICAgICAgICAgJCAgICAgL19fX19cICAgICAgICAgCi1NIUAgICAgI19fX19fICAgICAgICAgIEAgICAgIF9fX19fUCAgICAgICAgICogICAgICAgICAgICYgICAgCi1NIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAjCi1NICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAgQCMgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgCi1NICBAIyAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIEAkICMgIF9fICAhICAgICAgICAgICAgICAgCi1NIDAgICAhICQgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICEgJSAjICBfXyAgISAgICAgICAgICAgCi1NICAgICAwICAgISAmICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAiICYgIyAgX18gICEgICAgICAgCi1NICAgICAgICAgMCAgICIgJyAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIiAoICMgIF9fICAhICAgCi1NICAgICAgICAgICAgIDAgICAiICggIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICIgKSAjICBfXyAgCi1NISAgICAgICAgICAgICAgICAwICAgIiAqICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAiICsgIyAgCi1NX18gICEgICAgICAgICAgICAgICAgMCAgICQgIyAhICAgUCAwICAsICQgICQgISAgISAgMCAgNCAkICAmCi1NICEgICFAIDAgIDwgJCAgKCAhICAiICAwICBEICQgICogISAgIlAgMCAgUCAgICNfX19fX19fX19fUFAgCi1NICAjX1wgICEgICAgICBQICAgI19fX19fX19fX19QUCAgICNfXCAgKSAgICAgIFQgICAjX19fX19fX19fCi1NX1BUICAgI19cICAxICAgICAgVCAgICNfX19fX19fX19fUFQgICAjX1wgIDkgICAgICAgICAiNCMgICAgCi1NICAgICowLCAgICAgICAgTSBQICAgICAgICMkJCAgICAgICAgLTAwICAgICAgICBZITAgICAgICAgI1QmCi1NICAgICAgICAwMDggICAgICAgISUhUCAgICAgICAkRCggICAgICAgIDMwQCAgICAgICAhMSIwICAgICAgCi1NICU0KiAgICAgICAgNjBMICAgICwgICAgX19fX19fX19fX1wsICEgIF9fICA2MCAgICAgLCAhKDBfXyAgCi1NNjAgICAgICwgIyxQX18gICAwICAgICNfXCAgJCAgICAgICAgICAgICAgICIgICAgUC9fUCAgMCAgICAgCi1NICAgICAgICAgICQgICApIF9fICAhICAgICAgICAgICAgICAgICAgICEoICwgISAgX18gIDYwICAgICAtCi1NICAgIF9fX19fX19fX19cLCAhICBfXyAgNjAgICAgICwgISgwX18gIDYwICAgICAsICMsUF9fICAgMCAgCi1NICAjX1wgICQgICAgICAgICAgICAgICAiICAgIFAvX1AgIDAgICAgICAgICAgICAgICAkICAgKSBfXyAgCi1NISAgICAgICAgICAgICAgICAgICAhKCAtICAgIF9fICA3QCAgICAgLiAgICBfX19fX19fX19fXCAgICAgCi1NICAgICAgICAgICAuICAgIF9fICA4UCAgICAgLiAgICBfX19fX19fX19fXCAgICAgICAgICAgICAgICAuCi1NICAgIF9fICA6ICAgICAgLiAgICBfX19fX19fX19fXCAgICAgICAgICAgWCAgICNfXCAhTSAgICAgIFggCi1NICAjX19fX19fX19fX1AgICAgICAgICAgI0AgICAvX1AgJyQgICAgICNAICAgL19fX19fX19fX18gICAgCi1NICAgICAgIC4gICAgX18gID0wICAgICAuICAgIF9fX19fX19fX19cICAgICAgICAgICBYICAgI19cICFaCi1NICAgICAgWCAgICNfX19fX19fX19fUCAgICAgICAgICAgICAgICAgICAgICAgICIpIUAgICAgICAgICAmCi1NICAgICBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggCi1NICAgICAgICMhQCAgICAgICAgICYgICAgIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAgUCAgCi1NICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgJCFAICAgICAgICAgJiAgICAgQCAgICAwICAgICYgICAgCi1NIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICAgICAjIUAgICAgICAgICAmCi1NICAgICBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggCi1NICAgICAgICMgUCAwICAgICAgNCMgISAgX19fX19QICAgICAgICAgKCAgICAgL19fX19cICAgICAgICAgCi1NISAgICAgI19fX19fICAgICAgICAgIDAgICAgIF9fX19fUCAgICAgICAgIDggICAgIC9fX19fXCAgICAgCi1NICAgICEgICAgICAgICAgICFAICAgICggICAgJCAgICAhQCAgICBAICAgICogICAgIlAgICAgLCAgICAlCi1NICAgICFQICAgIEQgICAgOiAgICAgICAgITA4ICAgICAgICAnJkAgICAgICAgICAmICAgICBAICAgIDAgCi1NICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggICAgICAgICMmQCAgCi1NICAgICAgNCYgICAgICAgICFQOCAgICAgICAgKSFAICAgICAgICBMJiAgICAgICAgIzA4ICAgICAgICAvCi1NIUAgICAgICAgISQmICAgIF9fX19fUCAgICAgICAgICMgICAgIC9fX19fXCAgICAgICAgICBQICAgICAgCi1NICAgICFAICAgICggICAgJCAgICAhQCAgICBAICAgICogICAgIlAgICAgLCAgICAlICAgICFQICAgIEQgCi1NICAgOiAgICAgICAgICA4ICAgICIgICAgISAgICAgOCAgICAoICAgICJAICAgIEwgICAgIyAgICAhMCAgCi1NICA8ICAgICkgICAgJkAgICAgICAgICAmICAgICBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgCi1NIFAgICAgNCAgICAnICAgICIwICAgIUggICAgICAgICgmQCAwICAgICAgSDogICAgICAgICMhSCAkICNfCi1NX19fXyAgICAgICAgICAwICAgICBfX19fX1AgICAgICAgICAkICAgICAgICAgICAmICAgICBAICAgIDAgCi1NICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggICAgICAgICMhQCAgCi1NICAgICAgNCYgICAgICAgICAgOCAgICAiICAgICEgICAgIDggICAgKCAgICAiQCAgICBMICAgICMgICAgCi1NITAgICAgPCAgICApICAgICZAICAgICAgICAsJiAgICBfX19fX1AgICAgICAgICAjICAgICAvX19fX1wgCi1NICAgICAgICAhUCAgICAjX19fX18gICAgICAgICAgMCAgICAgICYtUj0jJVQ5N0FUK0csIDRVMSE0RTEmCi1NNERUIDdVXVM9JiVSPSAhPzs2XU44Vl1OPScpTzsgIT87Ni1PPTZZVCAlXVM8JylPOFZVTztHLVQ4NylUCi1NICAgTzhGJUI4Ml1DPjchUjk3LVMrVzVTPEJdSTtGLUw9NjFFK1cpRTlWMUU5QllIICAgTzhGJUI4Ml1DCi1NPjchUjk3LVMrVzVTPEJdSTtGLUw9NjFFK1YlUzsyWUggICFDPEcwUT0mRU46NzBOPFAgIDlWMUI7NjROCi1NOFAgXCtTMSQ5NilVOVJcXiAnIVU8JkVMLkJdQz42PUk7RzBPPCZRQT4yXUY7RjhPOVYxQjs2NE44UCBXCi1NLCMoUy0jQFMtQ0QgLTMsWC1AIVQ3Vy1UPEc1Qz0gIVY3Vi1IODcpPzs2NU04RjVSICc5PzxWQU88RzE/Ci1NOzY1TThGNVIgJzk/OjZZVDdWVUU7NilFPEAhVjdWUU87Rj0/OzY1TThGNVIgJzk/OUZRTzg3MT87NjVNCi1NOEY1UiAnOT85Jl1VOEZRRTdWVUU7NilFPEAgTjFDJFEgJzk/OFZBQTxFXU05NlVCOTcoID1FXVM6Jl1SCi1NPSVdTTk2VUI5NyggPUVdSTtHMT87NjVNOEY1UiAnOT87Jl1OOVVdTTk2VUI5NyggPUVdRjsmXUE9JV1NCi1NOTZVQjk3KCA9RV1EO1c1QjsmNT87NjVNOEY1UiAnMT89NllJO1ZYID1FXUM6JiVSN1ZVRTs2KUU8QCFWCi1NN1ctSDtXKVQ3VlVFOzYpRTxAIVY3VkVOPSVdTTk2VUI5NyggPUVdTDtWWUc3VlVFOzYpRTxAIVY3VjlMCi1NO1YlVDdWVUU7NilFPEAhVjdWMU89NilMOTVdTTk2VUI5NyggK0Q4USxQIVY3Vi1IODcpPzs2NU04RjVSCi1NICc5PzxWQU88RzE/OzY1TThGNVIgJzk/OjZZVDdWVUU7NilFPEAhVjdWUU87Rj0/OzY1TThGNVIgJzk/Ci1NOUZRTzg3MT87NjVNOEY1UiAnOT85Jl1VOEZRRTdWVUU7NilFPEAhVjdWLUg4Nyk/OUc1TjhQIVY3Vy1JCi1NOVZZRTklXUM6JiVSN1Y5VTtGLCA9RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgPUVdUzomXVI9JV1GCi1NPTZZQyAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUY9NllDCi1NICc5Pzo2WVQ3VjlVO0YsID1FXVM6Nj1OOTYxPzo2WVQ3VjlVO0YsID1FXVU7Ry1JOVZZRTklXUk7RzE/Ci1NOUc1TjhQIVY3VlFPO0Y9PzlHNU44UCFWN1ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdVTtHLUk5VllFCi1NOSVdTDtWWUc3VjlVO0YsID1FXUY7Jl1BPSVdRj02WUMgJzk/OSZdVThGUUU3VjlVO0YsIDsmRU46UCFOCi1NOTdBVCAmUUk7Rk1GPTZZQyAnLVQ9NjlGICcxVTdWUUk7RkwgO0Y1WD0gIUw6NllLOUc1TjhQIVM9JzVGCi1NOUAgTjFDKFkgJylFOSAhRzxGNUU7QCFCOyc1RSAmLU87Jl1SPFAhWTk2UUw7VzwgPCc1UjwmUUUgJyFJCi1NO0ZMICtEOFMsMCFDOiY1Vj4wIUY7VylEICYtQTxHLCA4RlVXICchTzxHLUM6JjQgK0Q4UyxQISYwNFEzCi1NMTAhNDRFNSUgJilPO1ZRRTg2WCA4RzlBOycsIDlGJUw8VjQgPScpVTkwIUI7Vl1MOTYlTixAIU06Ny1PCi1NPEYxRTxGNUQgJzFXO1AhTztGNCA+RjVSO1AhVDonKUU5MCFNODZFTiAgIUc5NlhPPFcxVThGOVA5Ny1UCi1NODcpVCtGLCA3VV1SOTYlRDk2WVY3Vy1JOVY5UDkwICA4VzFZPCY0TjhQIUY6NylTPSVdQzg2UUwgJV1TCi1NOTcxQzonKUM7JiVTPFAgIDlWNU4rVi1VOTdBST0iWUMgJjVYOjcwICAmPUU9JjVOPUJZQyAmPUU9JjVOCi1NPUAhTj1GVUE9Ji1IICAhRzk2WE88VzFSOFchWStHLCA8VzFSOFchWSAjJEQsIyBQLCMgUCwjIFAsICBECi1NOSZdQzojLCApJjFPOFZAUiAiMUQ7Vi1ILDAgRDkmXUM6IyAgICctWTxSXT87VyFFO0JZUyAlXU88JjVOCi1NICNERCwjIFAsIyBQLCMgUCwgICArVilBOEYkTzhXRVA8RjVTPFJdVTxXKE86NllDOyc1RDkyXVM+NyxOCi1NPFAgICtWKUE4RiRPOFdFUDxGNVM8Ul1VPFcoTzo2WUM7JzVEOTJdUz43LE88V0VTOFYlTDsiWUggICFTCi1NPjcsTzdXKUU4NjBOPFAhPzxGNUE5ICBZKSMgUCwjIFAsIyBQLCMgICAmPUU7Ql1COFZdUD4yWVMgJlVFCi1NOzYtUD4wIUc7VjlPPEc9QTxGMVMgJjlPPEc9QTxGMVM3VilZPSY1QztXIVkgI0RZKSMgUCwjIFAsIyBQCi1NLCMgIDxGNVQgJjlPPEc9QTsmRUc7RiVCOyY0IDlGXVI9VV1DO1chWSxAIUY7VylXN1YtTzwnRFMgJjlPCi1NPEc9QTxGMVMgJjlPPEc9QTxGMVM3UyxSICY5TzxHPUE8RjFTN1MkViAmOU88Rz1BPEYxUzdTMCA5Vl1CCi1NODYtSz1WJVI5JywgOEYlQzpXPUE8RjFTN1YpWT0mNUM7VyFZICNEWSkjIFAsIyBQLCMgUCwjJCA4RiVDCi1NOlYlTDo2PU44NilMOTAhQjg2LUs3Vi1PPCdEUiAmKUE4Vk0/OFZdUD4zLCA4RiVDOlc9QTxGMVMgJilBCi1NOFZNVzg3KUQ8VVxTLEAhQjg2LUs9ViVSOSctPywzOCA4RiVDOlc9QTxGMVM3UzAgICctWTxSXT84VlFPCi1NPFY0TjxQIT84VlFPPFY0IC4yMFAsIyBQLCMgUCwjIFAgICFBPSY1WDo3ME44UCE/N1ZZRT4nMUY7QCE/Ci1NN1Y1WDo3MT85RllTICYlVDk3QUk9ICE/N1YtQTsmUT85N0FJPSY5TjxQICA5RlFTOEc1RitGLCA3Vi1MCi1NOTYlTj03ICA5Ri1MO1ctRSAmOUY7JzVTOiAhPzlGUVM4RzVGICVdWDlGUVM4RzVGICVdVzxHMUM6JkwgCi1NN1Y5STtGMUI9NjggN1YpVTlHLVk7RiwgICctWTxSXUU+JkVUK0csIDdWNVg6NzAgICYtUj0iXUM5NylSCi1NO1coTjxQIT84VjVSPEZdUiAgIUQ4NzFBK0YsICAmVVA3VjFFOUJZQyAgIU04NlFMO1YsTjhQIUE7JlFPCi1NOFcsIDg2UUw7Vi1QICYlTDsmXUM9ICFBOyZRTzhXQCA4NlFMO1YtRTtGMCA7NiVMOyZdQyAmOVI5NjQgCi1NPEY1QTsmUU84UCAgPFdFUytVXUw8VjVFOlJZUyAlXUw8VjVFOlAgWSkjIFAsIyBQLCMgUCwjICAgJy1ZCi1NPFJdPz1XKUk9JjROPFAhPz1XKUk9JjQgLjIwUCwjIFAsIyBQLCMgUCAgIT87Vy1FPEcpTzxCWUMgJV1PCi1NPFY1UjxGXVIgJV1TOTcxTzxWNVI8Rl1SICAhPzo3LUE9JzFZK0YsIDdWRVM4NzFUPjAgIDxXRVMrVV1TCi1NOEcpSytHLCA3Vy1CPEZMIDk3KVIgJV1CPEZMICwyMFAsIyBQLCMgUCwjIFAgICFTPjcsTzdWRU84VzFMCi1NK0csIDdWRU84VzFMICNERCwjIFAsIyBQLCMgUCwgICA4VylUO0ZFTjo3ME48UCAgN1Y1Tj1GRVI7VlggCi1NOTZZVjo3KU87QCE/N1QlUjlWLCA3VV0hPEY9ViAmNVI8RllPICVdPzxXMUE8RzAgN1Y9UCAlXT86Ny1UCi1NODcpVCAlXT88RjVBOSY1Tj1FXVM6Nj1GPCY0IDdXLUU9Ji1IPEYtTDg3LVMgJlVBOjZYIDk3QUk9ICE/Ci1NOzZdTjhWXU49JylPOyAhPzs2LU89NllUICVdUzwnKU84VlVPO0ctVDg3KVQgJzk/OFZBQTxAIVY3Vy1JCi1NOVZZRTklXUM6JiVSICc5Pz02WVM6Nj1OOTYxPzhWQUE8QCFWN1ctSDtXKVQgJzk/PFZFRztGNUQ3Vy1ICi1NO1cpVCAnOT89NllTOjY9Tjk2MT88VkFPPEcwID1FXUk7RzAgPUVdUzo2PU45NjE/OjZZVCAnOT89NllTCi1NOjY9Tjk2MT86NllUICc5PzsmXU45UCFWN1ctSTlWWUU5JV1MO1ZZRyAnOT89NllTOjY9Tjk2MT87Jl1OCi1NOVAhVjdWOUw7ViVUICc5PzkmXVU4RlFFICc5PzhWQUE8RV1BPEcpQT4wIVY3Vy1JOVZZRTklXUM6JiVSCi1NN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXLUg7VylUN1YlUjxGJVkgJzk/Ci1NPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCA9RV1JCi1NO0cxPzg3KVI4N0QgPUVdUzo2PU45NjE/OjZZVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzo2WVQ3ViVSCi1NPEYlWSAnOT87Jl1OOVVdQTxHKUE+MCFWN1ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZICc5Pz02WVM6Nj1OCi1NOTYxPzsmXU45VV1BPEcpQT4wIVY3VjlMO1YlVDdWJVI8RiVZICc5PzkmXVU4RlFFN1YlUjxGJVkgJzk/Ci1NOFZBQTxFXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVECi1NN1YtSDg3KT88Jl1JO0cxRTxAIVY3Vy1IO1cpVDdXIU86NllUOTcoID1FXVM6Nj1OOTYxPzxWQU88RzE/Ci1NPCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCA9RV1JO0cxPzwmXUk7RzFFCi1NPEAhVjdXLUk5VllFOSVdSTtHMT88Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSCi1NICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdXNU48VkVHCi1NO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1Y5TDtWJVQ3VyFPOjZZVDk3KCA9RV1EO1c1QjsmNT88Jl1JCi1NO0cxRTxAIVY3Vy1UPEc1Qz0jJCA9RV1TPScpVThXMFIgJzk/PTZZSTtWWCA9RV1VO0ZFTztDKCA9RV1DCi1NOiYlUjdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1GCi1NPTZZQyAnOT88VkFPPEcxPzlHNU44UCFWN1ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICc5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzE/OUc1TjhQIVY3VkVOPSVdRj02WUMgJzk/PFZFRztGNUQ3VkVOPSVdRj02WUMgJzk/Ci1NPTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgPUVdTDtWWUc3VjlVO0YsID1FXVM6Nj1OOTYxPzsmXU45VV1GCi1NPTZZQyAnOT89NllTOjY9Tjk2MT87Jl1OOVVdRj02WUMgJzk/OUZRTzg3MT85RzVOOFAhVjdWMU89NilMCi1NOTVdRj02WUMgJy0/OyZFTjpQIVU3VlFJO0ZMIDwnKUk7NiVSPjAhTjtWWVA8RkVNODcpWSAmLUw9NllLCi1NOTcoIDxXIU88RzFTOFYlUiAlXUM9J0VQOTAhRzk3MUU7RzggPFcxUjhXIVkgJV1PPCY1TiAlXVI5NiVECi1NICZVRTs2LVA+MCE/OFZRTzxWNCA3VV1UPEYlUDdWOVA5NV1PPUY1UjxGRUQ5MCE/N1YtQTsmUT85N0FJCi1NPSY5TjxQIT84VlFFODZZVTwgIT85N0FJPSAhPzhWNVI8Rl1SICYlVDk3QUk9ICE/OEc1Rjk2WUQ9JiVCCi1NICVdSTtWKCA3Vy1QPEZdQzk2MCA3VlFBPFcxQj02OCA3Vy1JOEc1RiAlXVM7VilVOUAhPzxWVUI9NjggCi1NOUY5TD03LUggJjlDOyZdUzkwIUY8RjVFICVdTDxWNUU6UCE/PiY5TDxWKVU5QCE/OUZRUzhHNUYgJV1XCi1NPEZFVDkwIT89VylUOFZBSyAlXUI9NjlTPjZZQyAlXVM5NzFPPFY1UjxGXVIgJV1GOjZZRDhHNUYgJlVBCi1NOyZRTzhQIT86Ny1BPScxWSAlXUw7Vi1LICVdVTsmXUM6UCE/O0ZRTzhWTCA3VkVMO1YtSyAlXUY7Jl1DCi1NOlAhPz1WUU84VkwgN1YtTDtWLUsgJV1UOyZdQzpQIT84VzFMO1YtSyAlXUQ7Jl1DOlAhPzhWJVMgJV1VCi1NPFVdUjxXMUg8RjVBOSVdUz0mMUk7UCE/PFYpUjpQIT84RylLICcpRTg2UUw7ViwgN1ZdUzk3KVI7VyggCi1NN1ZFTzhXMUwgJjVOOSAhPzs2RU44RylLICVdQz03KUI8RkwgN1Y1TjkgICAgJCAhUCAgICAgJCAgICAgCi1NICAgIDAgICAgICAgICAgKyAgICAgICAgICIkICAgICAgICAgICAgICAgMCAgICAgICAgICQgICAgICAgCi1NICAgJSY4ICAgICAgICAgICAgID8gJCAhUCAgICAgJCAgICEgICAgICkgICAgIEwgICAgIiAgICAgICAgCi1NICAgICAgICAgICAgICAgJCAgICAgICAwICAgICAgICAgIDQgICAgJSc4ICAgICAgICAgICAgICAgJCAhCi1NUCAgICAgJCAgICFEICAgICgwICAgIFQgICAgIiAgICAgICAgICAgICAgICAgICAgICAgJCAgICAgICAwCi1NICAgICAgICAgIEggICAgJSc4ICAgICAgICAgICAgICAgJCAhUCAgICAgJCAgICIlICAgICMwICAgIFwgCi1NICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgISc4ICAgICAgCi1NICAgICAgICAgJCAiNCAgICAgJCAgICIyICAgIz8wICAgISQgICAiKiAgICAoMCAgICxcICAgICAgICAgCi1NICAgJCAgXCAgICAwICAgISZAICAgISAgICAgISAwICAgICAgICFcICAgIF8gJCAlRCAgICAgJCAgIDAvCi1NICAgICkwICAgKUwgICAgJCAgICBcICAgICAoICAgICAgICAgICAgMyAgJCAgICRKICAgICNQICAgISQgCi1NICAgISA4ICAgICAgICVYICAgICEgJCAlSCAgICAgJCAgIDBUICAgICgwICAgKVwgICAgJSAgICBcQCAgCi1NICNMICAgICAgICAgICAgNCAgJCAgICRZICAgICNQICAgISggICAgISA4ICAgICAgICVcICAgIDcgJCAmCi1NRCAgICAgJCAgIDE1ICAgICRQICAgKjAgICAgJCAgICErMCAgICBUICAgICAgICAgICAgNSAgJCAgICUoCi1NICAgICNQICAgISwgICAgISA4ICAgICAgICc4ICAgICwgJCAmVCAgICAgJCAgIDFIICAgICYwICAgKkAgCi1NICAgJiAgICEuQCAgICQgICAgICAgICAgICAgNiAgKCAgICU3ICAgICQwICAgITAgICAgISA4ICAgICAgCi1NICgoICAgIDAgJCAnVCAgICAgJCAgIDIhICAgIC9AICAgKlggICAgKSAgICE+QCAgICJIICAgICAgICAgCi1NICAgOCAgJCAgICVIICAgICEgICAgITQgICAgJSY4ICAgICAgICkoICAgIEogJCAoQCAgICAgJCAgIDJfCi1NICAgICggICAgKzwgICAgJSAgICFJICAgICBAICAgICAgICAgICAgOSAgJCAgICVMICAgICEgICAgIUggCi1NICAgJSY4ICAgICAgICtQICAgICUgJCAoQCAgICAgJCAgIDM/ICAgICgwICAgK1AgICAgIiAgICAgICAgCi1NICAgICAgICAgICAgICAgISAgICAgICAkICAgICAgICAgIVwgICAgJSc4ICAgICAgICAgICAgICAgJCAoCi1NQCAgICAgJCAgIDQgICAgICowICAgK1ggICAgIiAgICAgICAgICAgICAgICAgICAgICAgISAgICAgICAkCi1NICAgICAgICAgIjAgICAgJSc4ICAgICAgICAgICAgICAgJCAoSCAgICAgJCAgIDRJICAgICggICAgLCAgCi1NICAgJSAgICFLICAgICBAICAgICAgICAgICAgOiAgJCAgICVQICAgICEgICAgIkQgICAgJSY4ICAgICAgCi1NICwkICAgICUgJCAoUCAgICAgJCAgIDUpICAgISUgICAgLDQgICAgOSAgICFNICAgICw4ICAgICAgICAgCi1NICAgOyAgJCAgICVUICAgICEgICAgIlggICAgJSY4ICAgICAgICw4ICAgIlQgJCArVCAgICAgJCAgIDk9Ci1NICAgIChAICAgLVggICAgJSAgICI+QCAgICBAICAgICAgICAgICAgPCAgJCAgICVYICAgICEgICAgIywgCi1NICAgJSY4ICAgICAgIDdIICAgICUgJCArXCAgICAgJCAgIDlfICAgIC0gICAgLiwgICAgKCAgICJAQCAgCi1NICJQICAgICAgICAgICAgPSAgKCAgICVcICAgICQwICAgI0AgICAgISA4ICAgICAgIDdcICAgICggJCAsCi1NSCAgICAgJCAgIDpTICAgIDMgICAgLkwgICAgMiAgICJLQCAgIEIoICAgICAgICAgICAgPyAgQCAgICYtCi1NICAgICcwICAgI0QgICAgISA4ICAgICAgIDg8ICAgIjsgJCA1LCAgICAgJCAgIDtfICAgICRAICAgL1QgCi1NICAgJCAgICRUICAgICAwICAgICAgICAgICAgRyAgJCAgICZKICAgICEgICAgI0ggICAgJSY4ICAgICAgCi1NIEIoICAgICIgJCA1MCAgICAgJCAgIDwxICAgICVAICAgMCQgICAgJCAgICRVICAgICAwICAgICAgICAgCi1NICAgSCAgJCAgICZOICAgICEgICAgI1wgICAgIyY4ICAgICAgIEIwICAgICMgJCA1NCAgICAgJCAgIDxHCi1NICAgICIgICAgMDQgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSICAgICMwICAgJCggCi1NICAgISA4ICAgICAgICAgICAgICAgJCA1NCAgICAgJCAgIDxPICAgICJAICAgMDwgICAgIiAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICZfICAgICMwICAgJCwgICAgISA4ICAgICAgICAgICAgICAgJCA1Ci1NNCAgICAgJCAgIDxZICAgIDBQICAgMEQgICAgLSAgICRWICAgIDFMICAgICAgICAgICAgSSAgLCAgICcsCi1NICAgICRQICAgJDAgICAgISA4ICAgICAgIEI8ICAgIU4gJCA5UCAgICAgJCAgID1cICAgIChAICAgMTggCi1NICAgJSAgICVcUCAgICBAICAgICAgICAgICAgTCAgJCAgICc/ICAgICEgICAgJDQgICAgJSY4ICAgICAgCi1NIEk0ICAgICUgJCA5WCAgICAgJCAgID4+ICAgIChAICAgMUwgICAgJSAgICVeUCAgICBAICAgICAgICAgCi1NICAgTSAgJCAgICdDICAgICEgICAgJEggICAgJSY4ICAgICAgIElIICAgICUgJCA6ICAgICAgJCAgID8gCi1NICAgICgwICAgMiAgICAgJiAgICYgUCAgICA4ICAgICAgICAgICAgTiAgKCAgICdHICAgICQwICAgJFwgCi1NICAgISA4ICAgICAgIElcICAgICMgJCA6KCAgICAgJCAgID9BICAgICRQICAgMjggICAgJCAgICYiMCAgCi1NICE0ICAgICAgICAgICAgUCAgJCAgICdYICAgICNQICAgJSAgICAgISA4ICAgICAgIEooICAgICkgJCA6Ci1NQCAgICAgJCAgID9UICAgICowICAgMkggICAgKCAgICYnQCAgICFIICAgICAgICAgICAgUSAgKCAgICgnCi1NICAgICIgICAgJSQgICAgJSY4ICAgICAgIEpMICAgIDAgJCA6XCAgICAgJCAgIEA9ICAgIChAICAgMyggCi1NICAgJSAgICYuICAgICBAICAgICAgICAgICAgUyAgJCAgICgvICAgICEgICAgJTggICAgJSY4ICAgICAgCi1NIEtMICAgICUkJCA7JCAgICAgJCAgIEBfICAgICMgICAgMzwgICAgIiAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgJUwgICAgISc4ICAgICAgICAgICAgICAgICAgICAgICAgJCAgICAhCi1NICAgICBAICAgICggICAgICAgICAgMCAgICAkICAgICIgICAgIEAgICAgICAgICAhICAgICAwICAgICggCi1NICAgIiAgICAgUCAgICAwICAgICUgICAgIUAgICAgPCAgICAoICAgICIwICAgICggICAgIiAgICAgMCAgCi1NICAkICAgICogICAgIDAgICAgKCAgICArICAgICMgICAgIEggICAgISAgICAgQCAgICBMICAgICwgICAgCi1NIkAgICAgJCAgICAiICAgICJQICAgIFAgICAgLSAgICAgMCAgICAoICAgICsgICAgIyAgICAgWCAgICAiCi1NICAgICBAICAgICQgICAgISAgICAjUCAgICAkICAgICIgICAgIlAgICAgUCAgICAwICAgICQwICAgISggCi1NICAgISAgICAgQCAgICBMICAgICwgICAgJFAgICAgJCAgICAiICAgICUgICAgITQgICAgNiAgICAlUCAgCi1NICAkICAgICIgICAgIlAgICAgUCAgICA4ICAgICAwICAgICggICAgKyAgICAjICAgICFEICAgIDogICAgCi1NJlAgICAgJCAgICAiICAgICJQICAgIFAgICAgPCAgICAgMCAgICAoICAgICsgICAgIyAgICAhVCAgICAgCi1NICAgICAhICAiSyAlS19fXyAgICAgICAgICBEMCAgSlAhOl9fX1AgICAgICAgICAxJCAgLCQgNy9fX1wgCi1NICAgICAgICAmISAgIyEwJVNfX18gICAgICAgICAhXDAgIFA4ITxfX19QICAgICAgICAgRSAkICFQIUBACi1NICAoICAgICAgICAgKzEgIEJIIDRLX19fICAgICBQICAgIyQgMCFMPCVMX19fUCAgICA0ICAgIFogJCAlCi1NRCFAQCAgJCAgICAmICAgIDJQISAhOiA4KCAgIiAgICAhICAgICVAIDAgLkwmIiAgQTAgICAgPCAgICE9Ci1NICQgJkQhQEAgICQgICAgICAgICA4QCEgIEJAOCggICQgICAgICAgICAmWCAwIChQJiIgICFAICAgICAgCi1NICAhViAkICIvIUBAICBAICAgICQgICAgQTEgICJRICVQICAoICAgICEgICAgKFAwICBMMSE8ICAiICAgCi1NICAwICAgIjokICArJEA3ICAgQCAgICAkICAgIEpBICAiUTAlUCAgIyAgICAhICAgICsoMCAgTDYhPCAgCi1NIFAgICAgMCAgICMhJCAgKyYgNyAgIEQgICAgJCAgICBUQSAgIlFQJVAgICQgICAgISAgICAtQDAgIExACi1NITwgICEgICAgIDAgICAjRSQgICspIDcgICBIICAgICQgICAgXSEgICJSQCVQICAlICAgICEgICAgL0wwCi1NICBMTCE8ICAhMCAgICAwICAgJCkkICArLCA3ICAgTCAgICAkICAgISYxICAiUzAlUCAgJiAgICAhICAgCi1NIDIkMCAgTFghPCAgIVAgICAgMCAgICRKJCAgKzAgNyAgIFQgICAgJCAgICEtUSAgIlQoJVAgIDMgICAgCi1NISAgICA0TDAgIE0kITwgICYwICAgIDAgICAlQSQgICsyIDcgICFcICAgICQgICAhO1EgICJUUCVQICBFCi1NICAgICEgICAgODAwICBNMCE8ICAqUCAgICAwICAgJjskICArNiA3ICAjJCAgICAkICAgIUlRICAiViAlCi1NUCAgVyAgICAhICAgIDtIMCAgTUghPCAgLzAgICAgMCAgICcvJCAgKzwgNyAgJCwgICAgJCAgICFXISAgCi1NIldAJVAgISkgICAgISAgICA/IDAgIE4gITwgIDNQICAgIDAgICAoJiQgICtCIDcgICU0ICAgICQgICAiCi1NJSEgIDhfICQ4ICE7ICAgICEgICAgQiwwICBOMCE8ICA4MCAgICAwICAgKFIkICArRSA3ICAmKCAgICAkCi1NICAgIjIhICAiWUAlUCAhQyAgICAhICAgIEYgMCAgTjwhPCAgOSAgICAgMCAgIClQJCAgK0ggNyAgJjQgCi1NICAgJCAgICJBUSAgIlowJVAgIUYgICAgISAgICBKIDAgIE5IITwgIDlQICAgIDAgICAqTiQgICtLIDcgCi1NICZAICAgICQgICAiUFEgICJbICVQICFJICAgICEgICAgTUgwICBOVCE8ICA6QCAgICAwICAgK0kkICArCi1NTiA3ICAmTCAgICAkICAgIl9RICAiW1AlUCAhTCAgICAhICAgIFE8MCAgTyAhPCAgOzAgICAgMCAgICxHCi1NJCAgK1EgNyAgJlggICAgJCAgICMuISAgOFwgJDggIVIgICAgISAgICBUKDAgJi84ISYgID4gICAgIDAgCi1NICAtLCQgICtSIDcgICdYICAgICQgICAjNSEgICJdICVQICIkICAgICEgICAgVVQgMCApMCYiICAoMCAgCi1NICAwICAgLUkgJCAiOiFAQCAiNCAgICAkICAgIz8gISAgSCA4KCAgSSAgICAhICAgIFkkIDAgKjgmIiAgCi1NKzAgICAgMCAgIC4+ICQgIkwhQEAgIyQgICAgJCAgICNMQCEgIExAOCggIFUgICAgISAgICBcQCAwICtACi1NJiIgIC4wICAgIDAgICAvMyAkICJeIUBAICNUICAgICQgICAjWTAhICBRIDgoICEhICAgICEgICAgX0QgCi1NMCAsSCYiICAxMCAgICAwICAgMCUgJCAjMCFAQCAkRCAgICAkICAgJCYgISAgVUA4KCAhLSAgICAhICAgCi1NISJUIDAgLVAmIiAgNDAgICAgMCAgIDBaICQgI0MhQEAgJTQgICAgJCAgICQyISAgIl1AJVAgIl4gICAgCi1NISAgICEkXDAgJixQISYgIFcgICAgIDAgICAxNiQgICtXIDcgIC40ICAgICQgICAkN0EgICJeICVQICNOCi1NICAgICEgICAhJkQwICBPRCE8ICBdQCAgICAwICAgMVEkICArWiA3ICAvWCAgICAmICAgJD5RICAgICAkCi1NM19fXyAgICAiICAgISgoIDAgOzAmIiAgIDAgICAgRCAgIDIpICQgJ1QhQEAgICQgICAgKiAgICREICEgCi1NIiggOCggICEgICAgIzAgICEpOCAwIEJAJiIgICAwICAgIFggICAyPCAkIChQIUBAICAkICAgIC8gICAkCi1NSFAhICJdIDgoICAhICAgICFQICAhKkgwICBLMCE6X19fUCAgICEgICAgMl4gJCAsLiFAQCAgNCAgICAxCi1NICAgJFMwISAjKiA4KCAgISAgICAkQCAgIS04IDAhNFAmIiAgIDAgICAhLCAgIDM8ICQgNTAhQEAgICQgCi1NICAgMCAgICRZICEgIl8gOCggICMgICAgJSAgICEuTDAgICpAISRfX19QICAgITAgICAzViQgICQtIDEvCi1NX19cICAgIDUgICAkXlEgICJQICVLX19fICAgICUgICAhMDAwICBLUCE6X19fUCAgICEwICAgNC0kICAwCi1NICAxT19fXCAgICA0ICAgJSUhICAwICAkO19fXyAgICAlICAgITFMMCAmICghJl9fX1AgICAhJCAgIDRCCi1NICQgLVYhQEAgIDQgICAgMSAgICUqMCEgIzFAOCggICMgICAgJUAgICEzICAwIUFIJiIgICIgICAgITwgCi1NICA0VSAkIDlQIUBAICAkICAgIDEgICAlLyAhICQ1IDgoICApICAgICQwICAhNDQgMCBcQCYiICAhUCAgCi1NICFAICAgNS0gJCA5WCFAQCAgJCAgICAxICAgJTUgISAkRkA4KCAgKyAgICAkMCAgITVQIDAhMzgmIiAgCi1NI1AgICAhRCAgIDVFICQgOiMhQEAgICwgICAgMSAgICU8MCEgJFcwOCggIC0gICAgJUAgICE3SCAwITUwCi1NJiIgICFAICAgIUggICA2ISAkIDooIUBAICAkICAgIDUgICAlQjEgICMhUCVTX19fICAgICUwICAhOFwwCi1NICBQQCE8X19fUCAgICE0ICAgNjYkICAsKSA3L19fXCAgICA1ICAgJUcxICAjIkAlU19fXyAgICAlMCAgCi1NITowMCAgUEwhPF9fX1AgICAhNCAgIDZLJCAgLCwgNy9fX1wgICAgNSAgICVMQSAgIyMwJVNfX18gICAgCi1NJTAgICE7RDAgIFBYITxfX19QICAgITQgICA3ICQgICwvIDcvX19cICAgIDUgICAlUiEgICMkICVTX19fCi1NICAgICUwICAhPFwwICBRJCE8X19fUCAgICE0ICAgNzQkICArISA2T19fXCAgICA7ICAgJVlQISAmSCA4Ci1NKCAgISAgICAmUCAgIT5UIDAhSlAmIiAgISAgICAhOCAgIDdSICQgOEohQEAgIEggICAgOSAgICVeQCEgCi1NJkAgOCggICEgICAgJyAgICFALCAwIUtQJiIgICAwICAgIUwgICA4KiQgIkcwITFPX19cICAgIDsgICAmCi1JI0EgICJIICQzX19fICAgICZQICAhQTgwICBKJCEkX19fUCAgX19cICAgOD4kICJHMCExT19fXDsKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1hb3V0LnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWFvdXQudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0ZWVmOS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWFvdXQudQorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi1iZWdpbiA3Nzcgc3BhcmMtYW91dAotTUAwLCEiUCAgKCAgICAiICAgICAgICAgICNZUCAgIiBAICAgICAgICAgICJcJCIgIFQgLkAwKSgjSCQyNQotTSpCICJFICpAISkwIjAgSDcgICAwVSIrQEggLCAgIEMiICYoKEApICAgMCogICAwISAgICAwICAgIkAkIAotTSAgISAgIEAkIDAgICAkICAgLTY8KFogQDAgICggUCQgICAhICAgQCQgMCAgIClXQ09WQE8gICAoS0E3QgotTSohJCAgIEIwJEIoLDAgICAyWSgwKCAiTCQgIChEQC5ANyQgICAkTjQkIiBAQCooQCghKiAgJFwhICAgIAotTVBBLkA3SCJAODBMMkAgISsgMCAgIC5AI0gmIyIgWiFEWEAuQDoqMCUgICYyISggMStQICAiKlg1WERCMAotTSQiICBFISBAITE8QCAgIjYkTiAiRiEgICVEICAgIzI6JCIgIElBICAiKSAiICEzMiBaIURFISBAIVE8QAotTSAgIjYkTiAyRiEgICVEICAgIk46JCAgNCtQICAiKlg1WEcwMSAgIChEIShCJlQgICAiLjIkIiAgSkEgIAotTSIsKCNIJkIgRCAgISBIICAiUlwgICBCTiU+KShEIDMgJEkoMCAhJjQkIiAnJVIgICApODJYISo4JCAgNQotTTAgICAlWUgwKCAjIiBaIVBIIDMgID44Q0gnU0ooWiIgWyIuQEEgLCAgIEMiICYoKFBCLkBCICwgICEjIgotTSAmIkBQQi5AQyAsICAgQiIkJiFEUEIuQEQpIDAoICY/USAgIERBIEA/KCcnWCBCIVogICAkKCAgIUgoMAotTSggNDBAICAkQEEgQDFRIiAgICoiJCIgI0Q9IEAgIEogICAwISAgICBAPC9AIiAkICAgIjAkIiAiREA3QAotTSEtMCVQICIiJCIgJEQ9IEAgKSAwKCdeIiQiICFEPSBAICAgIDAgIE89Ny1SK1ZRSThCXUw5IllTO1AgTwotTTkmNVYrV0lFPEZcICAgICAgICAgJjYtUj0jIFooJllPKCJdVTxXKE87JkVCK1ZRRCtHLU8iQCAgICAgIAotTSAgIEY4VylULCNIQCtXNVM8Ql1MOjYoTzsmME48VlxAOzYlUDwmRU45UiFGODZFTD03KUUiQCAgICAgIAotTSAhMUM8RzBQLkIhTjtSIE85JjVWK1dJRTxGXCogICAgICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AIAotTSApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFBAICAhQDw/QCIoJ0ggICI9WFteMAotTUwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JydYIEIhWiAgIEc+Ll9EKyAwKCAgUAotTUAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAgKVdDT1kiUCQiICAsKCAgIDgnJwotTVggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AIAotTSApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFBAICAhQDw/QCIoJ0ggICAgICAgIAotTUc+Ll9EISQgICBDISBCLiAsKCAgIDgnJ1ggQiFaICAgRz4uX0QhJCAgISMhJkIiSCwoICAgOCcnWCBCIQotTVogICAwTEAgIClXQ09XQSAgICNEIDAgICAhJCAgISMgKkIsMCQwICAkKSgwKCAnMipCKTgkMCAgJCkoMAotTSggKzIqQiVYJDAgICQpKDAoIC8yLEIkUCQwICAkKSgwKCAzMixCJCgkMCAgJCkoMCggNzIsQidAJDAgIAotTSQpKDAoIDsyKEInKCQwICAkKSgwKCA/MihCJkAkMCAgJCkoMCggQzIoQiQgJDAgICQpKDAoIEcyKEIsKAotTSQwICAkKSgwKCBLMihCKSgkMCAgJCkoMCggTzIoQiVAJDAgICQhLCAgIEM0IEYuVFUiKEEqISQgICEgMwotTSAgIDBVIUlATC0wWig4QDEgICAwJFAgICQtMCo4USM0KkImUCQwICAkISwgICEjNCJGKThVIkhBRiEkIAotTSAhIDMgICAwVSBJQT4tMEooLkAxICAgMCRQICAkLTAyODMjNCxCKUgkMCAgJCEsICAhIzQkRiQoVSMoQgotTSwhJCAgISAzICAgMFUhKUFYLTBSKDVAMSAgIDAkUCAgJC0wIjg8QzQoQiUgJDAgICQhLCAgISM0IEYmQAotTVUiKEEuISQgICEgMyAgIDBVIClBIC0wQihCQDEgICAwJFAgICQtMCI4UEM0KEImSCQwICAkISwgICEjNAotTSBGKShVIihBRCEkICAhIDMgICAwVSApQTgtMEIoLiAxICAgMCRQICAkLTAiODJDNChCKUAkMCAgJCEsIAotTSAhIzQmRiYoVSNIQSQhJCAgISA1ICAgMERBKkMkLShCKC9AMSAgIDAlMCAgJCkoMkhFQzIoQiM4JDAgIAotTSQhNCAgISIyJEolWFRCKEFQISQgICEgNSAgIDBEQSpBLC0oQig3IDEgICAwJTAgICQpKDJIMEMyKEIlMAotTSQwICAkITQgICEiMiRKJ0BUQihDICEkICAhIDUgICAwREEqQVItKEIoRSAxICAgMCUwICAkKSgySDojMgotTShCKEAkMCAgJCE0ICAhIjIkSiQgVEIoQTIhJCAgISA1ICAgMERBKkMiLShCKC8gMSAgIDAlMCAgJCkoMgotTUhEQzIoQiMwJDAgICQhNCAgISIyJEolQFRCKEFOISQgICEgNSAgIDBEQSpBKi0oQig2QDEgICAwJTAgIAotTSQpKDJIOEMyKEInOCQwICAkKSgwKCArMihCIygkMCAgJCkoMCggKzIoQihYJDAgICQpKDAoICcyKEInMAotTSQwICAkKSgwKCAnMihCJ0gkMCAgJCEsICAhIzQgRikgVSIoQjwhJCAgISAzICAgMFUhKUEoLTBSKDgiIQotTVFeIChAPkAgIClXQ09ZIDEgICAwVSAoQygoIkJPX1wyQCAgLURBKEMoLSAiOCAyIEhCICAgSCAgIjkwMAotTSggIjYgRiAkREEgQCApKCI4IDMwIEQgK0AqKEAgISpfX19WNCBKICFESSogICAyICAgSDEgICAwSEEoQwotTSgqJEo4ICswISAgMUdcKCAgKiAkL19SIEkiICAtK19fXz0gJCAhJiFRXiAoQD5AICApV0NPWSAxICAgMAotTVRAKEMnKCJCOCAgIkAgIClIIShDJy0gJCAgIj9QQCAgSCAwQCEtICQgICIgSEIgICRLX19eUCQgICAgMQotTSAgIClEIShCQiQgICFFNjIkIiAgQDw/QCIoJ0ggICI9WFteMCRQICAkLSAiOCtSIEhCICAkSCAgISkgMAotTSggJV9fX19HVCIpQE8oJydYIEIhWiAgICAgICAgICAgMCZQICAgMjZfX19fUSAgIDAnQCAgIEY2X19fXwotTU0gICAwKDAgICA2Nl9fX19LICAgMCkgICAkVjZfX19fMyAgICAgNCAgICA2ICAgIDJAICAgICAgICAgIAotTSAgICAmICAgICBIICAgIDcgICAgISAgICAhRCAgICApICAgIDUwICAgIFQgICAgQSAgICAoQCAgICJUIAotTSAgIEcgICAgMV9fX19fXCAgICAgICAgIC1AICAgICNfX19fXyAgICAgICAgICQkICAgICAgICAgIUAgIAotTSAjWCAgICAiICAgICUwICAgIFAgICAgUiAgICAqQCAgICAgICAgIEsgICAgLFAgICAiMCAgICBVICAgIAotTSFQICAgIjAgICAgISAgICAoICAgICAsICAgIDogICAgIiAgICAjQCAgICArICAgICwgICAgIFggICAgPAotTSAgICAjUCAgICFMICAgIDAgICAgKTAgICAhJCAgICA9ICAgICRAICAgIVggICAgMyAgICAnUCAgICEwIAotTSAgIFkgICAgJTAgICAiKCAgICA2ICAgICpQICAgITwgICAhJiAgICAmICAgICIsICAgIDkgICAgLDAgIAotTSAhSCAgICBHICAgICZQICAgIjggICAgPCAgICAqICAgICFUICAgIEogICAgJ0AgICAiRCAgICA/ICAgIAotTS9QICAgIiAgICAhISAgICAoMCAgICJQICAgIEMgICAgK1AgICAiNCAgICBOICAgIClAICAgICAgICAgSAotTSAgICAgICAgICJEICAgIFsgICAgKyAgICAjOCAgICBNICAgIC1QICAgIlggICAgVCAgICArUCAgICNUIAotTSAgIFAgICAgLkAgICAjJCAgICEvICAgICxAICAgICAgICAgUyAgICAwQCAgICMwICAgICAgICAgLTAgIAotTSAkNCAgICBXICAgIC8gICAgI0AgICAhICAgICAuMCAgICAgICAgIFogICAgICAgICAjTCAgICE0ICAgIAotTS8gICAgJSggICAgXSAgICAwUCAgICNYICAgISQgICAgL1AgICAkRCAgICEgICAgIDIgICAgJCggICAgIAotTSAgICAwUCAgICAgICAgISQgICAgMzAgICAkNCAgICEqICAgIDFAICAgJFAgICAhJyAgICAyUCAgICRAIAotTSAgITAgICAgMjAgICAkWCAgICErICAgIDQwICAgJFAgICAhMyAgICAzMCAgICAgICAgIS4gICAgICAgIAotTSAkXCAgICAgICAgIDQgICAgICAgICAhMSAgICAgICAgICUoICAgICAgICAgNFAgICAgICAgICAgITAgJwotTUMgICAsW0AgICAgJyFQICZYMCAgMCxAICAgIC4iMCAlUyAgIDBSQCAgICAzITAgJSNAICAoIiAgICAgOQotTSAwICM4QCAgICAgICAgIEUgMCAmWEAgICAgICAgICBMITAgIz9AICAoW0AgICAgUiFQICU8QCAgMCogIAotTSAgIFshUCAnLjAgIDAgICAgICElIDAgI0ggICAgICAgICAhKyEwICBcUCAgKFFQICAgIT4hMCAnS1AgIAotTShQQCAgICFKIjAgJ1NQICAwLEAgICAhUyEwICJAUCAgKE8wICAgIioiMCAmXSAgIDAtICAgICJBIjAgIwotTV5AICAwLUAgICAiWCIwICczUCAgMC4gICAgIy8iMCAkOjAgIDAuQCAgICNGIjAgIktAICAwLyAgICAjVgotTSIwICg0QCAgMC9AICAgJCYiMCAmQCAgIDAwICAgICQ2IjAgIDMgICAwMEAgICAkRiIwICBOMCAgMDEgIAotTSAgJFYiMCAnUUAgIDAyICAgICRfIjAgJlIgICAwMkAgICAlKCIwICdGQCAgMDMgICAgJTEhMCAkRFAgIAotTShVQCAgICVFITAgJztQICAoSjAgICAlWSIwICIgUCAgMDNAICAgJi0hMCAgU1AgIChUMCAgICY6ITAgIwotTUpQICAoSSAgICAmRyIwICZXMCAgMDQgICAgJlQhMCAkSUAgIClUUCAgICZcIjAgKEEgICAwNEAgICAnNAotTSIwICYlICAgMDUgICAgJ0wiMCAlKFAgIDA1QCAgICgkIjAgJFYwICAwNiAgICAoNSIwICJdQCAgMDZAIAotTSAgKEYiMCAmKUAgIDA3ICAgIChXIjAgJDlAICAwN0AgICApKCIwICcoICAgMDggICAgKTIiMCAlOlAgIAotTTA4QCAgICk8ITAgJFEwICAoUyAgICApUSEwICQ9UCAgKE4gICAgKiYiMCAgSTAgIDA5ICAgICo7IjAgJgotTTcwICAwOUAgICAqUCEwICUpUCAgKFgwICAgKl4hMCAlQzAgIChMUCAgICssIjAgKDEgICAwOiAgICArOgotTSIwICFOUCAgMDpAICAgK0giMCAnPFAgIDA7ICAgICtWIjAgJ1BAICAwO0AgICAsLyIwICRSICAgMDwgIAotTSAgLEgiMCAnXCAgIDA8QCAgICxPIjAgIl4gICAwPSAgICAsWiIwICcxICAgMD1AICAgLSwiMCAhVkAgIAotTTA+ICAgIC0+IjAgJEdAICAwPkAgICAtRyIwICcqUCAgMD8gICAgLVIiMCAnKyAgIDBAQCAgIC1dITAgIwotTUYwICAoVlAgICAuMyEwICY9MCAgKEtAICAgLkkiMCAjU0AgIDBCICAgIC5fIjAgISIwICAwQkAgICAvNQotTSIwICA7MCAgMEMgICAgL0siMCAiPVAgIDBDQCAgIC9XIjAgJzEwICAwRCAgICAvXyEwICRHMCAgKFlQIAotTSAgMC4iMCAoODAgIDBEQCAgIDA9IjAgJV5AICAwRSAgICAwTCIwICdbQCAgMEVAICAgMFsiMCAhUzAgIAotTTBGICAgIDEqIjAgIkYwICAwRkAgICAxOSIwICdBMCAgMEcgICAgMUEiMCAnSyAgIDBQICAgIDFbIjAgJwotTU4wICAwUEAgICAyIyIwICcxQCAgMFEgICAgMisgMCAmPSAgICAgICAgIDI0IVAgIkYgICAwLCAgICAyRgotTSIwICc8MCAgMFFAICAgMlUiMCAiVFAgIDBSICAgIDMkITAgJj4wICApUCAgICAzNyEwICZCMCAgKUhAIAotTSAgM0ohUCAlSCAgIDArQT85NzFFPicwIDdWNUQ4NzFBICVdRTtGMCA8VzFBPEcwIDxXMUE8RzE/OUZRTwotTTg3MCA3VV1FPiZFVCAlXU04NkVOICVdRTtHOUk8Rl1OICVdPzElRS4wNFUpMFAhPzk3QUk9ICE/PUVdUwotTTo2PU45NjE/OjZZVDdWOVU7RiwgN1c5Pzo2WVQ3VjlVO0YsIDdXIVI6NlVBPEdEIDdXOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzlHNU44UCE/PUVdUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRQotTTklXUM6JiVSN1chTzo2WVQ5NyggN1c5Pz02WVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4wIT89RV1VO0ctSQotTTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdWUU87Rj0/PCZdSTtHMUU8QCE/PUVdQzomJVI3VyFPOjZZVAotTTk3KCA3Vzk/PTZZUzo2PU45NjE/OjZZVCAlXVY3Vy1JOVZZRTklXVM6Jl1SPSAhPz1FXUQ7VzVCOyY1PwotTTg3KVI4N0QgN1c5Pz02WUk7VlggN1c5PzlGUU84NzAgN1c5PzxWQU88RzAgN1c5PzxWRUc7RjVEN1ZRTwotTTtGPT85RzVOOFAhPz1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzE/ODcpUgotTTg3RCA3Vzk/OyZdTjlVXUY9NllDICVdVjdWLUg4Nyk/OUc1TjhQIT89RV1JO0cxPzg3KVI4N0QgN1VdPwotTTs2JUk7QCE/PUVdVTtHLUk5VllFOSVdSTtHMT88Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT88VkFPPEcxPwotTTwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCE/PUVdVTtHLUk5VllFOSVdTAotTTtWWUcgJV1WN1Y5TDtWJVQ3VyFPOjZZVDk3KCA3Vzk/PFZBTzxHMT88Jl1JO0cxRTxAIT89RV1VO0ctSQotTTlWWUU5JV1DOiYlUiAlXVY3VzVOOjZdTixAIT89RV1EO1c1QjsmNCA3Vzk/PTZZUzo2PU45NjE/OjZZVAotTTdWOVU7RiwgN1c5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIDdXOT88VkVHO0Y1RDdWUU87Rj0/ODcpUgotTTg3RCA3Vzk/PFZFRztGNUQ3Vi1IODcpPzg3KVI4N0QgN1c5PzlGUU84NzE/OUc1TjhQIT89RV1TOiZdUgotTT0lXUY9NllDICVdVjdXLUk5VllFOSVdSTtHMCA3Vzk/OyZdTjlVXUE8RylBPjAhPz1FXUM6JiVSN1YlUgotTTxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUgotTTdXIU86NllUOTcoIDdXOT86NllUICVdUzwmXVI9Jy1DODcoIDdXOT85Jl1VOEZRRTdXIU86NllUOTcoIAotTTdXOT89NllTOjY9Tjk2MT88VkFPPEcwIDdWLUw9NllLOTcoIDdXOT88VzFSPTYtVCwwIT89RV1TPScpVQotTThXMFIgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1Y5VQotTTtGLCA3Vzk/PFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQQotTT4wIT89RV1TOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgN1ZZTztHIVI6NlVBPEdEIDdXLT87JkVOOlAhPwotTT1FXUQ7VzVCOyY1PzlHNU44UCE/PUVdUzo2PU45NjE/OyZdTjlQIT89RV1JO0cxPzwmXUk7RzFFPEAhPwotTT1FXVM6Nj1OOTYxPzhWQUE8QCE/PUVdRjsmXUE9JV1BPEcpQT4wIT89RV1TOiZdUj0lXUE8RylBPjAhPwotTT01XUw6NllLICVdVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggN1c5PzsmXU45UCE/PUVdQwotTTomJVIgJV1PO0VdRT4mRVQgJV0/OTdBST0lXUQ9NlVNPjVdRDk2LUwgJV0/N1QtNDNVKT8zJEUzNSVdPwotTSAlXT83VDE0M1UpPzMkRTM1JV0/ICVdPzdWMU83Vj1MO1YpQTslXUM9Jl1SPFAhPzdVXUQ7VV1HOyZdQgotTTg2UT85JzFPPEcsIDdVXUU+JkVUN1YxVTs2VVk3VylFOUAgICAgICAgIl1VPFcoTzsmXUM4NlBPOyZFQgotTStWPUM4UlVMOjYoTzxXNU4tIlxSK0MkTy5CXVU8VyhPOyZdQzg2UE87JkVCK1AgICAgICAgICAgICAgMwotTUQoICAgICAgIDAgJiAgICAgJiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAjICAhICMgICAwIjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotTUAgICAkVEAgICQhPCAgISA4ICAgIVdAICAgPkggICAqNiAgICAgICAgICA1ICAgLjIgICAhMCAgICIgIAotTSAgICAvICAgMCAgIyAgICBAPCFAICAkICAgIj1YW15AP19fX18gJCAgICI9WFteQD9fX19eMCQgICAmPQotTVhbXkA/X19fXUAkICAgKj1YW15AP19fX1xQJCAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICQhSQotTSAgICAgICAgICAhIFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAwJiAgICAgICEgICAgICAgWCQgICAgICAgQCggICAgITQkICAgICAgIEJEICAgICFUJAotTSAgICAgICBCRCAgICAiUUQgICAgICAgQkQgICAgJTVEICAgICAgIEJEICAgICVWICAgICAgICAgICAgIAotTSAnXiAgICAgICAgICAgICAgKSYgICAgICAgICAgICAgICtCICAgICAgICAgICAgICAtJiAgICAgICAgIAotTSAgICAgLl4gICAgICAgICAgICAgIDBWICAgICAgICAgICAgICAyPiAgICAgICAgICAgICAgNEYgICAgIAotTSAgICAgICAgIDZSICAgICAgICAgICAgICA4RiAgICAgICAgICAgICAgOjYgICAgICAgICAgICAgIDs+IAotTSAgICAgICAgICAgICA8SiAgICAgICAgICAgICAgPiogICAgICAgICAgICAgID5aICAgICAgICAgICAgIAotTSBIQiAgICAgICAgICAgICAgICEkICAhWSAgIEJEICAgICAhJCAgIVkgICBCRSAgICAgISQgICFZICAgQgotTUcgICAgUUhEICAgICAgIEJEICAgICAhJCAgIVogICBCSSAgICAgISQgICFaICAgQkogICAgICEkICAhWgotTSAgIEJMICAgIFJERCAgICAgICBCSSAgICAgISQgICFbICAgQk4gICAgICEkICAhWyAgIEJPICAgICAhJAotTSAgIVsgICBCUSAgICBUIEQgICAgICAgQk4gICAgICEkICAhXSAgIEJTICAgICAhJCAgIV0gICBCVCAgIAotTSAgISQgICFdICAgQlYgICAgVUREICAgICAgIEJTICAgICAhJCAgIV4gICBCWCAgICAgISQgICFeICAgQgotTVkgICAgICEkICAhXiAgIEJbICAgIFZERCAgICAgICBCWCAgICAgISQgICFfICAgQl0gICAgICEkICAhXwotTSAgIEJeICAgICAhJCAgIV8gICBDICAgICBYIEQgICAgICAgQl0gICAgICEkICAiISAgIEMiICAgICAhJAotTSAgIiEgICBDIyAgICAgISQgICIhICAgQyUgICAgWUREICAgICAgIEMiICAgICAhJCAgIiIgICBDJyAgIAotTSAgISQgICIiICAgQyggICAgICEkICAiIiAgIEMqICAgIFo8RCAgICAgICBDJyAgICAgISQgICIjICAgQwotTSwgICAgICEkICAiIyAgIEMtICAgICAhJCAgIiMgICBDLyAgICBbUEQgICAgICAgQywgICAgICEkICAiJQotTSAgIEMxICAgICAhJCAgIiUgICBDMiAgICAgISQgICIlICAgQzQgICAgXSxEICAgICAgIEMxICAgICAhJAotTSAgIiYgICBDNiAgICAgISQgICImICAgQzcgICAgICEkICAiJiAgIEM5ICAgIF4oRCAgICAgICBDNiAgIAotTSAgISQgICInICAgQzsgICAgICEkICAiJyAgIEM8ICAgICAhJCAgIicgICBDPiAgICBfQEQgICAgICAgQwotTTsgICAgICEkICAiKSAgIENBICAgICAhJCAgIikgICBDQiAgICAgISQgICIpICAgQ0UgICAhISBEICAgIAotTSAgIENBICAgICAhJCAgIiogICBDRyAgICAgISQgICIqICAgQ0ggICAgICEkICAiKiAgIENLICAgISIkRAotTSAgICAgICBDRyAgICEjLiAgICAgICAgICAgICAhKV4gICAgICAgICAgICAgIS1eICAgICAgICAgICAgIAotTSEwOiAgICAgICAgICAgICAhMiogICAgICAgICAgICAgITQiICAgICAgICAgICAgICE1UiAgICAgICAgIAotTSAgICAhNkYgICAgICAgICAgICAgICAhJCAgIlIgICBDTiAgICAgISQgICJVICAgQ1EgICAgICEkICAiVgotTSAgIENTICAgICAhJCAgIlcgICBDViAgICAgISQgICJZICAgQ1kgICAgICEkICAiWiAgIENcICAgICAhJAotTSAgIlsgICBDXyAgICAgISQgICJdICAgRCIgICAgICEkICAiXiAgIEQlICAgICAhJCAgIl8gICBEKCAgIAotTSAgISQgICMhICAgRCsgICAgICEkICAjIiAgIEQuICAgICAhJCAgIyMgICBEMSAgICAgISQgICMlICAgRAotTTQgICAgICEkICAjJiAgIEQ4ICAgICAhJCAgIykgICBEPCAgICAgISQgICMqICAgREAgICAgICEkICAjKwotTSAgIEREICAgICAhJCAgIy0gICBESCAgICAgISQgICMuICAgREwgICAgICEkICAjLyAgIERQICAgICAhJAotTSAgIzEgICBEVCAgICAgISQgICMyICAgRFggICAgICEkICAjMyAgIERcICAgICAhJCAgIzUgICBFICAgIAotTSAgISQgICM2ICAgRSQgICAgICEkICAjNyAgIEUoICAgICAhJCAgIzkgICBFLCAgICAgISQgICM6ICAgRQotTTAgICAgICEkICAjPCAgIEU0ICAgICAhJCAgIz0gICBFOCAgICAgISQgICM+ICAgRTwgICAgICEkICAjQAotTSAgIEVAICAgICAhJCAgI0EgICBFRCAgICAgISQgICNCICAgRUggICAgICEkICAjRCAgIEVMICAgICAhJAotTSAgI0UgICBFUCAgICAgISQgICNGICAgRVQgICAgICEkICAjSCAgIEVYICAgICAhJCAgI0kgICBFXCAgIAotTSAgISQgICNKICAgRiAgICAgICEkICAjTCAgIEYkICAgICAhJCAgI00gICBGKCAgICAgISQgICNPICAgRgotTSwgICAgICEkICAjUCAgIEYvICAgICAhJCAgI1EgICBGMiAgICAgISQgICNSICAgRjUgICAgICEkICAjVAotTSAgIEY4ICAgICAhJCAgI1YgICBGPCAgICAgISQgICNXICAgRkAgICAgICEkICAjVyAgIEZAICAgITk4RAotTSAgICAgICBDTiAgICE5WEAgICAgICAgICAgICAhOkBAICAgICAgICAgICAgITtIQCAgICAgICAgICAgIAotTSE8WEAgICAgICAgICAgICAhPURAICAgICAgICAgICAgIT5MQCAgICAgICAgICAgICE/XEAgICAgICAgIAotTSAgICAhQEBAICAgICAgICAgICAgIUFAQCAgICAgICAgICAgICFCSEAgICAgICAgICAgICAhQzBAICAgIAotTSAgICAgICAgIUQ0QCAgICAgICAgICAgICFFQEAgICAgICAgICAgICAhRjBAICAgICAgICAgICAgIUckQAotTSAgICAgICAgICAgICFIUEAgICAgICAgICAgICAhSlxAICAgICAgICAgICAgIU0wQCAgICAgICAgICAgIAotTSFPIEAgICAgICAgICAgICAhUERAICAgICAgICAgICAgIVJYQCAgICAgICAgICAgICFUQEAgICAgICAgIAotTSAgICAhVVxAICAgICAgICAgICAgIVgoQCAgICAgICAgICAgICFZVEAgICAgICAgICAgICAhWzRAICAgIAotTSAgICAgICAgIV1EQCAgICAgICAgICAgICFfOEAgICAgICAgICAgICAiITBAICAgICAgICAgICAgIiJIQAotTSAgICAgICAgICAgICIkQEAgICAgICAgICAgICAiJkBAICAgICAgICAgICAgIidcQCAgICAgICAgICAgIAotTSIpSEAgICAgICAgICAgICAiK0hAICAgICAgICAgICAgIixcQCAgICAgICAgICAgICIuQEAgICAgICAgIAotTSAgICAiMDhAICAgICAgICAgICAgIjFQQCAgICAgICAgICAgICIzOEAgICAgICAgICAgICAiNTRAICAgIAotTSAgICAgICAgIjZUQCAgICAgICAgICAgICI4OEAgICAgICAgICAgICAiOTBAICAgICAgICAgICAgIkJcQAotTSAgICAgICAgICAgICJDTEAgICAgICAgICAgICAiTFhAICAgICAgICAgICAgIk1EQCAgICAgICAgICAgIAotTSJOMEAgICAgICAgICAgICAiUEBAICAgICAgICAgICAgIlE8QCAgICAgICAgICAgICJTNEAgICAgICAgIAotTSAgICAiVCwkICAgICAgIEZCICAgIlRQJCAgICAgICBGQiAgICJVTCYgICAgICAhIE8gICAiVklEICAgIAotTSAgIEZCICAgIldVRCAgICAgICBGQiAgICJYRiAgICAgICAgICAgICAiWk4gICAgICAgICAgICAgIltWIAotTSAgICAgICAgICAgICJeMiAgICAgICAgICAgICAiX1YgICAgICAgICAgICAgIyFOICAgICAgICAgICAgIAotTSMjRiAgICAgICAgICAgICAjJS4gICAgICAgICAgICAgIyc2ICAgICAgICAgICAgICMpQiAgICAgICAgIAotTSAgICAjKzYgICAgICAgICAgICAgIy0mICAgICAgICAgICAgICMuLiAgICAgICAgICAgICAjLzogICAgIAotTSAgICAgICAgIzBaICAgICAgICAgICAgICMxSiAgICAgICAgICAgICAjNk4gICAgICAgICAgICAgIzdCIAotTSAgICAgICAgICAgICM4KiAgICAgICAgICAgICAjOFYgICAgICAgICAgICAgIzs6ICAgICAgICAgICAgIAotTSM9UiAgICAgICAgICAgICAjPyREICAgICAgIEZCICAgI0A8QCAgICAgICAgICAgICNBWEQgICAgICAgRwotTSAgICAjQzBEICAgICAgIEczICAgI0NcJCAgICAgICBHPiAgICNEPCQgICAgICAgRz4gICAjRTlEICAgIAotTSAgIEc+ICAgI0ZFRCAgICAgICBHPiAgICNHNiAgICAgICAgICAgICAjST4gICAgICAgICAgICAgI0pGIAotTSAgICAgICAgICAgICNNIiAgICAgICAgICAgICAjTkYgICAgICAgICAgICAgI1A+ICAgICAgICAgICAgIAotTSNSNiAgICAgICAgICAgICAjU14gICAgICAgICAgICAgI1YmICAgICAgICAgICAgICNYMiAgICAgICAgIAotTSAgICAjWiYgICAgICAgICAgICAgI1tWICAgICAgICAgICAgICNcXiAgICAgICAgICAgICAjXiogICAgIAotTSAgICAgICAgI19KICAgICAgICAgICAgICQgOiAgICAgICAgICAgICAkJT4gICAgICAgICAgICAgJCYyIAotTSAgICAgICAgICAgICQmWiAgICAgICAgICAgICAkJ0YgICAgICAgICAgICAgJCoqICAgICAgICAgICAgIAotTSQsQiAgICAgICAgICAgICAkLVRAICAgICAgICAgICAgJC8kQCAgICAgICAgICAgICQwWEAgICAgICAgIAotTSAgICAkMiAkICAgICAgIEc+ICAgJDIxRCAgICAgICBHPiAgICAgISQgL19fICAgRz4gICAkMkwlICA+LAotTSAgIFNOICAgJDMoJyAgO0EgICEgUiAgICQzRCkgIDcsICAhIyogICAkM1glICA0LiAgIEAoICAgJDQwJQotTSAgLV4gICBDTiAgICQ0SCcgIDVSICAhIEggICAkNSwlICAjUyAgIEMnICAgJDY4JSAgPk8gICBDIiAgIAotTSQ3KCkgID8vICAhIFIgICAkN0wlICAqIyAgIEJdICAgJDkoKSAgO1QgICEgVCAgICQ6RCkgIC9aICAhIAotTVYgICAkPCApICA9LyAgISBYICAgJD08KSAgMUkgICEgWiAgICQ+WCkgICpOICAhIFwgICAkP1gpICBBMgotTSAgISBeICAgJEBYKSAgOiAgICEhICAgICRBWCkgICEsICAhISIgICAkQlgpICAiWSAgISEkICAgJENYKQotTSAgPyYgICEhKCAgICREPCkgIDsoICAhISogICAkRSApICA+OiAgISEsICAgJEVEJSAgMjMgICBDNiAgIAotTSRGVCUgID1PICAgQkkgICAkSCQpICAoIyAgISEuICAgJEk0JSAgIy8gICBDMSAgICRKKCUgIC5LICAgQgotTUQgICAkSlwpICA7PSAgISEwICAgJEtQJSAgMkYgICBHMyAgICRMMCkgIEIkICAhITIgICAkTVApICA4NAotTSAgISE0ICAgJE8wKSAgNEMgICEhNiAgICRQUCkgIDM5ICAhITggICAkUVQpICArViAgISE6ICAgJFJYKQotTSAgOEYgICEhPCAgICRTXCkgIDFGICAhIT4gICAkVSApICA8QCAgISFAICAgJFVIKSAgNUsgICEhQiAgIAotTSRWMCUgIDMlICAgQywgICAkV0QlICAxVyAgIEJYICAgJFhYKSAgIkUgICEhRCAgICRaLCkgIDk9ICAhIQotTUYgICAkW0AlICA0RyAgIENBICAgJFw4JSAgNi0gICBCUyAgICRdMCkgIEEkICAhIUggICAkXigpICAmWwotTSAgISFKICAgJF8gKSAgPVMgICEhTCAgICRfWCkgID8iICAhIU4gICAlITwpICAzKCAgISFQICAgJSMgKQotTSAgP1AgICEhUiAgICUjPCkgICtYICAhIVQgICAlJCgpICA9JCAgISFWICAgJSUwKSAgJzogICEhWCAgIAotTSUmOCkgIDI+ICAhIVogICAlJlwpICA8SyAgISFcICAgJSdIKSAgPEwgICEiIiAgICUoNCUgIC45ICAgQwotTTsgICAlKUwlICA5VSAgIEJOICAgJSskKSAgLy4gICEiKCAgICUsPCkgICQpICAhIiogICAlLVQpICAhTQotTSAgISIsICAgJS8sKSAgKVcgICEiLiAgICUvXCkgID0lICAhIjAgICAlMDwlICAyPSAgIENHICAgJTE4KQotTSAgQUEgICEiMiAgICUyNCkgIDdaICAhIjQgICAlMzApICA/TiAgISI2ICAgJTQsKSAgJy0gICEiOCAgIAotTSU1KCkgICo5ICAhIjogICAlNiQpICA+JSAgISI8ICAgJTZEKSAgPkwgICEjICAgICU4LCkgID5ZICAhIwotTSIgICAlOEwpICA9JiAgISMkICAgJTksJyAgKjggICEgUCAgICU6NCkgID1RICAhIyYgICAlOzApICArMwotTSAgISMoICAgJTwsJSAgOVkgICBHICAgICU9OCUgIDopICAgRkIgICAlPkQnICA2QCAgISBOICAgJT9JPwotTTdUMTkzRCUtMjQsIDhXKVQsIllPICY9RDhGVUUrRlwgOVYtQyxFXUM7VlVQOjZRRTkiWCArVkFPOzY0TwotTTlWWVUrVj1EOEJdVztXKUsrVllFPVJdRDk3OU8rVj1EOEcxRTxXME89IyRQK1AhRzkmKU05MllDICZFTgotTT0jSVQsM1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcuUCFDOiYlUi5HMFIvNyhSLlMgWwotTSwzKFcuUCFMO1ZZRygmRU49I0lULFNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhVQotTTtHLUk5VllFOSIhSTtHMFo9IzBdPEMkWywjTE0sM0wgOyZdTjlSIVU7Ry1JOVZZRTkiIUk7RzBaPSM0XQotTTxDJFssI0xNLDNMIDxWQU88RzBAOjZZVC5HMFYvNyhRLlJUUyxDPFYuI0xTLEM8Vi1TTCA7Jl1OOVIhTAotTTtWWUcoJkVOPSNJVC1TVVIsM0xQLlJUUS5QIVM6Jl1SPSIhVTtHLUk5VllFOSIhSTtHMFo9I0BdPEMkWwotTSwjTFYtMzRTLTNMIDsmXU45UiFMO1ZZRygnNU48VkVHO0Y1RCgmRU49I0lULjNVUiwzTFAuUlRRLlAhUwotTTo2PU45NjBAOFZBQTxDSVQsMyBdPEMkWyszJFIuI0xRLEM8WyAnNU48VkVHO0Y1RCgmLUg4NyhaPSMkUQotTS83KFEuUyBbLEM0VS5QIUY7Jl1BPSNJVCwzKF08QyRbLSNMUC5QIUQ7VzVCOyY0Wj0jJFMvNyhRLlNAWwotTSwjTCA7Jl1OOVIhRDtXNUI7JjRaPSMkVC83KFEuU0BbLCNMID1GXUk5I0lULDM0XSwzNCA9JV1TPScpVQotTThXMFo1IyRWLzcsUi0nOT84VkFBPEVdTTk2VUI5NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWgotTS1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFosMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTAotTS1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1UgotTS5DJFMrIyRSLiJQVi0jTFsgJzE/PTZZSTtWWFo1IyRXLzc0WD1FXUM6JiVSN1ZVRTs2KUU8Q0hSKyMgTAotTS4jTVY3Vy1IO1cpVDdWVUU7NilFPENIVisjIEwsMzhbPUVdSTtHMT87NjVNOEY1Ui5DJEwsIlBTLENNVgotTTdWUU87Rj0/OzY1TThGNVIuQyxMLCJQUyxDTVY3VjlMO1YlVDdWVUU7NilFPENIUSxCUFArIyxSLlc5PwotTTkmXVU4RlFFN1ZVRTs2KUU8Q0hRLFJQUCsjOFQuU0wgPUVdQzomJVI3VjlVO0YsWjFDKCA9RV1TOjY9TgotTTk2MT84VkFBPEVdRj02WUMuRDhRLCAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TjhTSSYsMyQgPUVdUwotTTomXVI9JV1GPTZZQy5EOFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RixaMUM4ID1FXVU7Ry1JOVZZRQotTTklXVM6Jl1SPSVdRj02WUMuRDhYICc5Pzo2WVQ3VjlVO0YsWjFDJCA9RV1TOjY9Tjk2MT86NllUN1Y5VQotTTtGLFoxQyQgPUVdVTtHLUk5VllFOSVdSTtHMT85RzVOOFNJJi0gIVY3VlFPO0Y9PzlHNU44U0kmLFAhVgotTTdXLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDLCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWOVU7RixaMUM0IAotTT1FXUY7Jl1BPSVdRj02WUMuRDhRLEAhVjdWMU89NilMOTVdRj02WUMuRDhRLFAhTDo2WUsuRTBRLiNVUwotTSwzNFI7RjVYPSNIUS4zVEosM0BMLCJQUyxDTUw6NllLOUc1TjhTSFIsI1RKLEMkXTlDJFkrIyxSKyMsUgotTS5XLVQ9NjlGLkMoUi82JVIsM0xQLlMgWyxDLF04NyhRLlMgWywzTFItI1VBPEMkWywjTFIuUyRWKyM4VAotTSsjJFEtMyhbLlAhVD01XUw6NllLLkUwUi0zVVUsMzBUO0Y1WD0jSFEuMlBQKyMsUi5WUUk7Rk1GPTZZQwotTS5DKFArIyBMLFMoWzxXMVU5RjhaLEMoTCwiUFEsMzRSLlNMIDhWXUw7VylTLkUwUi1DVUU+NjVMOyZdVwotTS5DIEw8JzVSPCZRRS5DJEw8JkVOOlNIUisjTCA4ViVSPFNJNCxDPF05NilNPVNIUCsnIU88Ry1DOiY0WgotTSwyUFsgJilPO1ZRRTg2WFo9IyhYLzY1JjA0UTMxM0hQKyUxMjU0NFosMlBbICYpVjg2UVMuRTBSLjNVRQotTTlGJUw8VjRaLCJRVDxHNUUuQyRMLlAhQjtWXUw5NiVOLENJVCxDRCA7NkVTO1cpRDk3KUU5I0k0LFMgXQotTTk3MVc7U0hSKyZdTjkzSFErJ0lFPEZcWiwiUVQ6JylFOTNIUysjTCA7NiVJO0NJJiwwIVY3Vi1IODcoWgotTTFTKCA9RV1TOjY9Tjk2MT84VkFBPENJJywzICA9RV1VO0ctSTlWWUU5JV1DOiYlUi5EPFEsMCFWN1ctSAotTTtXKVQuRDxWICc5PzxWRUc7RjVEN1ctSDtXKVQuRDxWICc5Pz02WVM6Nj1OOTYxPzxWQU88RzBaMVNAIAotTT1FXUk7RzBaMVMkID1FXVM6Nj1OOTYxPzo2WVQuRDxRICc5Pz02WVM6Nj1OOTYxPzo2WVQuRDxUICc5PwotTTsmXU45U0knLFAhVjdXLUk5VllFOSVdTDtWWUcuRDxTICc5Pz02WVM6Nj1OOTYxPzsmXU45U0knLTAhVgotTTdWOUw7ViVULkQ8USxAIVY3VjFPPTYpTDkzSScsMywgPUVdQzomJVI3ViVSPEYlWS5EPFMsM1VBPEMkWwotTSwjTFEuUyggPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjNJJyxTKF04NyhRLlMgWywzTFEsICFWN1c1TgotTTxWRUc7RjVEN1YtSDg3KT84NylSODdEWjFTLFMvNiVSLDNMUC5TJFssMyQgPUVdUzomXVI9JV1BPEcpQQotTT4zSScsUzBdODcoUS5TIFssM0xWICc5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWS5EPFMtICFWN1c1TgotTTxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWS5EPFMtM1VBPEMkWywjTFEuU0AgPUVdSTtHMT84NylSODdEWgotTTFTLFYvNiVSLDNMUC5TJFssMCFWN1ctSTlWWUU5JV1JO0cxPzg3KVI4N0RaMVMsViAnOT89NllTOjY9TgotTTk2MT86NllUN1YlUjxGJVkuRDxTLVNVQTxDJFssI0xRLlMwID1FXUw7VllHN1YlUjxGJVkuRDxTLiNVQQotTTxDJFssI0xRLlMsID1FXVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4zSScsU0AgPUVdVTtHLUk5VllFOSVdTAotTTtWWUc3ViVSPEYlWS5EPFMuM1VBPEMkWywjTFEuUzQgPUVdRjsmXUE9JV1BPEcpQT4zSSctIyBdODcoUQotTS5TIFssM0xRLEAhVjdWMU89NilMOTVdQTxHKUE+M0knLSMkXTg3KFEuUyBbLDNMUSxQIVY3Vi1IODcpPwotTTwmXUk7RzFFPENJJy0jKF0qQyggPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1Ui5EPFQsU1RKLDMgIAotTT1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyhaMVMwVC8ySFEsMCFWN1ctSDtXKVQ3VyFPOjZZVAotTTk3KFoxUzBVLzJIViAnOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyhaMVMwVSAnOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzwmXUk7RzFFPENJJy0jOF0qQ0AgPUVdSTtHMT88Jl1JO0cxRTxDSSctIzxdKkMkIAotTT1FXVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KFoxUzBXICc5Pz02WVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVAotTTk3KFoxUzBYLzJIVCAnOT87Jl1OOVVdUDtWRU49JjVSLkQ8VC4zVEosUCFWN1ctSTlWWUU5JV1MO1ZZRwotTTdXIU86NllUOTcoWjFTMFkgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1Ui5EPFUsI1RKLTAhVgotTTdWOUw7ViVUN1chTzo2WVQ5NyhaMVM0US8ySFEsQCFWN1YxTz02KUw5NV1QO1ZFTj0mNVIuRDxVLENUSgotTSwzLCA9RV1TPScpVThXMFEuRDxRLUAhVjdXLVQ8RzVDPSMoWjFTNFMvNyxSLSc5PzhWQUE8RV1NOTZVQgotTTk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaLUJQUS1CUFEtQ01WN1ZFTj0lXU05NlVCOTcoWgotTSwyUFMsQlBTLENNVjdWUU87Rj0/OzY1TThGNVIuQyxMLUMwTCxTKFs9RV1GOyZdQT0lXU05NlVCOTcoWgotTSwzKEwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSLkMkUysjJFIuIlBWLSNMWyAnOT89NllJO1ZYWgotTTFTJFcgJzk/PTZZSTtWWFIuRDxVLSNVVS4nOT84VkFBPEVdTTk2VUI5NyhaLEJQUCsjQFs9RV1TOiZdUgotTT0lXU05NlVCOTcoWi1CUFArIyRWLlc5Pzo2WVQ3VlVFOzYpRTxDSFErIyBMLFMoWz1FXUw7VllHN1ZVRQotTTs2KUU8Q0hTKyMgTCxTKFs9RV1GOyZdQT0lXU05NlVCOTcoWiwzKEwsIlBTLENNVjdWMU89NilMOTVdTQotTTk2VUI5NyhaLDMsTCwiUFYtI0xbICctPzsmRU46U0knLDNEID01XUw6NllLLkQ8Ui0wIVA8RkVNODcpWQotTS5EPFUtM1VFPEY1RC5DIEw5VylFOTZYWiwyUUI7JzVFLkMoTC5QIU47VllQPEZFTTg3KVkuRDxSLUAhQwotTTsnNU46VjVSLkQ8VS1DVUU4VkFFPUdEWiwiUUY7VylELkMkTC5QIVM8Jl1SPSctQzg3KFoxUyhXICVdPwotTTs2JUk7QllPICY9QzhTKT84Vl1NPCZFTDk2ME4gJV1JO0ZFVDo2JUw6N0lFOSJYUCAiXUc7RzRPOVYtQwotTStWPUM4UyhPPFcpQytQIE4rVlFJOEY9QzhTKE44UCFJO0cwWj0jJF08QyRbKzMoUS0jPFQuIyxWLSNAWwotTSxDJFQtUzBYLFM4VC1TTCA4VkFBPENJVCxDVVIsQ0xQLlMkUi1TTCA7Jl1OOVIhSTtHMFo9IyxdPEMkWwotTSszKFEtIzxULiMsVi0jQFssQyRULVMwWCxTOFQtU0wgPTZZUzo2PU45NjBAOjZZVC5HMFQvNyhRLlMgWwotTSszJFsgJlFPO0Y8QD02WVM6Nj1OOTYwQDo2WVQuRzBVLzcoUS5TIFsrMyRbICctSDtXKVQoJkVOPSNJVAotTS1DVVIsM0xNLFMoVy1DQFssUyhXLUM8WyAmUU87RjxAOyZdTjlSIUk7RzBaPSM8XTxDJFssI0xNLDNMIAotTTxWQU88RzBAPTZZUzo2PU45NjBAOjZZVC5HMFgvNyhRLlMgWy1DNFUsUzRbICZRTztGPEA7Jl1OOVIhVQotTTtHLUk5VllFOSIhSTtHMFo9I0RdPEMkWywjTE0sM0wgPFZFRztGNUQoJi1IODcoWj0jJFAvNyhRLlJUUQotTSxDQFssMyhXLlAhVTtHLUk5VllFOSIhQzomJVIuRzBRLDNVUiwzTFAuUyhVLTNMIDlGUU84NzBaPSMkUgotTS83KFEuUzBbLCNMIDkmXVU4RlFFLkcwUSxTVVIsM0xYLlMgWyAmUU87RjxAOSZdVThGUUUuRzBRLSNVUgotTSwzTFguUyBbICc5Tzo2MFo9IyRVLzMkVSAnKUU5VV1DOyYlUzxTSTQsMzhdOTRZLzdVKSUxVSxaLCJRJwotTTE0WSU0RCUsN1UpJTFVLFosMlEmNCVdMjE0PTMuQyhMMDRRLDdVKSUxVSxaLFJRLDI0VT80RDUnN1QtLAotTTA1LTMxNSxaLSJQWyAnIVQ8RjFJOUY5Pz0jSVQsMCFTOjdJRTdXMFo9IyQgPVYtSDg3KT89I0lULiAhTAotTTtWWUc7Jl1OOVNJNCwzPF08U0FIOjY9SC5DLEwsIlBTLENNTDtXPFosUlBTLEJQUyxDTFsgJlFPO0Y9PwotTTsmXU45U0lULDNAXT0zQVMuQyRXKyMgTC1DMFs7JlBaLVJQUCsjOFQuU0wgOUc1TjhVXVA9JyhaPSMkWQotTS8ySFIsI1VGLDM0IDdVXUQ7VV1HOyZdQjg2UT85JzFPPEcsWjFDJFUgJV1FPiZFVDdWMVU7NlVZN1cpRQotTTlDSScsQyRdKkMkIDdVXUQ7VV1HOyZdQjg2UT84VzFPPEcsWjFDJFUgJV0/OzYlSTtDSSYsMzQgN1Y1WAotTTo3ME47UCFHOFYsUjdWLU87NyFJOyY1RCtAIE85VllVK1Y9QzhSXUc4VixSK1ctUjhSXCArQl1MOjYpRwotTThWLFIrRiwgOjZZVC5HMFEvNyhRLlJUUiwzMFctI0BTLUMwWC5TKFEtIzxULiMsVi0jPFsgJi1IODcoWgotTT0jKF08QyhbLCNMUSxDPFsgJlFPO0Y8QDo2WVQuRzBTLzcoUS5SVFIsMzBXLSNAUy1DMFguUyhRLSM8VAotTS4jLFYtIzxbICc1TjxWRUc7RjVEKCZFTj0jSVQtI1VSLDNMUC5SVFEuUCFMO1ZZRygnNU48VkVHO0Y1RAotTSgmRU49I0lULTNVUiwzTFAuUlRRLlAhUzomXVI9IiFJO0cwWj0jOF08QyRbKzMsUi1TOFguUyxSLVM4VwotTS5QIUw7VllHKCZRTztGPEA6NllULkcwVy83KFEuUyBbKzMkWyAnLUg7VylUKCc1TjxWRUc7RjVEKCZFTgotTT0jSVQuI1VSLDNMUC5TOFUtMyxVLlAhTDtWWUcoJlFPO0Y8QD02WVM6Nj1OOTYwQDo2WVQuRzBZLzcoUQotTS5TIFsrMyRbICctSTlWWUU5IiFDOiYlUi5HMFEsI1VSLDNMTSwzKFguUyRSLVNMID02WVM6Nj1OOTYwQAotTThWQUE8Q0lULDMkXTxDJFssI0xSLTM0WyAmOUw7ViVULkcwUSxDVVIsM0xULlMgWyAmMU89NilMOTNJVAotTSwzLF08QyRbLiNMUC5QIUw7VllHKCYxTz02KUw5M0lULDMwXTxDJFsuI0xQLlAhVjtWRUQuRzBRLTNUUQotTS0wIVI5Nj0/OFZRQTxXLFo1IyRWLzY1LjNVXTIxND0zLkMgTDFUNS4xNSkhMyVdMjE0PTMuQyRMMUUhPwotTTRENSc0U0hSKyQlLDMlXTIxND0zLkMsTDMkRS03VSklMVVdIzMkJTM0VDUzLkMwTC5QIVA9JylEOjY5RgotTTdXMFo9IyQgPFZFWjk1XVQuRzBRICc9QzomJVI3VzBaPSNAIDsmXU45VlFPO0Y8WjUjJFcvNyxYOiZFRwotTTojSFMrIyBMLFMoWzsmXVcuQyxMLFMoTCxTKFsuUCFMO1ZZRzdWUU87RjxaPSMkWC83NFg8U0hRLVJQUAotTSsjOFQuVlFMLkM8TCwiUFYtI0xbICY5VTtGLT88JzFSLkcwUS4zVEosQyBdOUMkVSAlXUU+JkVUN1YxVQotTTs2VVk3VjFFOFZQWjFTJCA3VV0jNSRdMjdUUSk0VTE/N1NJJyxDJF04NyhRLlMgWywzTFEuMCE/N1QxNAotTTNVKT8zJEUzNSVdPy5EPFIsMCBNOyY8IDsmRUI5UllTICVdRT0mNVg9ICE/OTYxQT0mJCA3VjVOOSAhUwotTT0mJVI9ICE/OzYlSTtAIT85NllWOjcpTztAIT89RV1TOjY9Tjk2MT86NllUN1Y5VTtGLCA3Vzk/OjZZVAotTTdWOVU7RiwgN1chUjo2VUE8R0QgN1c5Pz02WVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhQIT89RV1TOjY9TgotTTk2MT87Jl1OOVVdUDtWRU49JjVSICVdVjdXLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KCA3Vzk/PTZZUwotTTo2PU45NjE/OyZdTjlVXUE8RylBPjAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1YlUjxGJVkgJV1WN1ZRTwotTTtGPT88Jl1JO0cxRTxAIT89RV1DOiYlUjdXIU86NllUOTcoIDdXOT89NllTOjY9Tjk2MT86NllUICVdVgotTTdXLUk5VllFOSVdUzomXVI9ICE/PUVdRDtXNUI7JjU/ODcpUjg3RCA3Vzk/PTZZSTtWWCA3Vzk/OUZRTwotTTg3MCA3Vzk/PFZBTzxHMCA3Vzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44UCE/PUVdUzo2PU45NjE/OFZBQQotTTxFXUY9NllDICVdVjdXLUk5VllFOSVdSTtHMT84NylSODdEIDdXOT87Jl1OOVVdRj02WUMgJV1WN1YtSAotTTg3KT85RzVOOFAhPz1FXUk7RzE/ODcpUjg3RCA3VV0/OzYlSTtAIT89RV1VO0ctSTlWWUU5JV1JO0cxPwotTTwmXUk7RzFFPEAhPz1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCE/PUVdVTtHLUk5VllFOSVdUwotTTomXVI9JV1BPEcpQT4wIT89RV1VO0ctSTlWWUU5JV1MO1ZZRyAlXVY3VjlMO1YlVDdXIU86NllUOTcoIAotTTdXOT88VkFPPEcxPzwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSICVdVjdXNU46Nl1OLEAhPwotTT1FXUQ7VzVCOyY0IDdXOT89NllTOjY9Tjk2MT86NllUN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVAotTTdWOVU7RiwgN1c5PzxWRUc7RjVEN1ZRTztGPT84NylSODdEIDdXOT88VkVHO0Y1RDdWLUg4Nyk/ODcpUgotTTg3RCA3Vzk/OUZRTzg3MT85RzVOOFAhPz1FXVM6Jl1SPSVdRj02WUMgJV1WN1ctSTlWWUU5JV1JO0cwIAotTTdXOT87Jl1OOVVdQTxHKUE+MCE/PUVdQzomJVI3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PwotTTwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggN1c5Pzo2WVQgJV1TPCZdUgotTT0nLUM4NyggN1c5PzkmXVU4RlFFN1chTzo2WVQ5NyggN1c5Pz02WVM6Nj1OOTYxPzxWQU88RzAgN1YtTAotTT02WUs5NyggN1c5PzxXMVI9Ni1ULDAhPz1FXVM9JylVOFcwUiAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PwotTTlHNU44UCE/PUVdVTtHLUk5VllFOSVdQzomJVI3VjlVO0YsIDdXOT88VkVHO0Y1RDdWRU49JV1QO1ZFTgotTT0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhPz1FXVM6Nj1OOTYxPzxWQU88RzE/ODcpUgotTTg3RCA3VllPO0chUjo2VUE8R0QgN1ctPzsmRU46UCE/PUVdRDtXNUI7JjU/OUc1TjhQIT89RV1TOjY9TgotTTk2MT87Jl1OOVAhPz1FXUk7RzE/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/OFZBQTxAIT89RV1GOyZdQQotTT0lXUE8RylBPjAhPz1FXVM6Jl1SPSVdQTxHKUE+MCE/PTVdTDo2WUsgJV1WN1c1TjxWRUc7RjVEN1ctSAotTTtXKVQ3VyFPOjZZVDk3KCA3Vzk/OyZdTjlQIT89RV1DOiYlUiAlXT85N0FJPSVdRD02VU0+NV1EOTYtTAotTSAlXT83VC00M1UpPzMkRTM1JV0/ICVdPzdUMTQzVSk/MyRFMzUlXT8gJV0/N1YxTzdWPUw7VilBOyVdQwotTT0mXVI8UCE/N1VdRDtVXUc7Jl1CODZRPzknMU88RywgN1VdRT4mRVQ3VjFVOzZVWTdXKUU5QCAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKCAgICAgICAgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1lbGYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyMGMwZi4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWVsZi51CisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLWJlZ2luIDc3NyBzcGFyYy1lbGYKLU0/VDUsMUAkIiAwICAgICAgICAgICAgICIgICggICAgISAgJC8lICAgICMwICAjOzAgICAgICAgVCAiICAKLU0hMCBIICE8ICRQICAgIDggICAgVCAgJCAtICAgICAgICAgIkAgICAgSCAgICAgNCAgICAgICAgICBQICAKLU0gLTAgICAgICAgICAgICAgICEkICAgICAgICAgISAgICAgICAgICAhICAgIC0gICEgIzAgICAgICAgIDMKLU09ICAgJFcwICAgICUgICQgICAgICAgJCAgIS5IICAoM0ogICAgICAgICAjTCAgICJNICAgICA8ICAwICAKLU0gICAgIEAgICUgUCAgQTAsICAgICAgICAgKEAgICAgICAgICAhUCAgICAgTz03LVIrVlFJOEJdTDkiWVMKLU07UlhRICAgICAgICAgJSwgICAhSCAgICAyUCAgICAgICAgICAgICAgLkAgICAmKCAgICBXICAgIDUgICAKLU0gICAgICAgICAgICA0UCAgICVcICAgIUQgICAgNCAgICAkICAgICEqICAgIDVQICAgIzggICAgICAgICAKLU0yMCAgICMsICAgIE0gICAgL1AgICAlWCAgICAgICAgICAgICAgIjQgICAgPCAgICAwUCAgICAgICAgITEKLU0gICAgKiAgICAgICAgICEiICAgICAgICAgIjAgICAhOyAgICAsICAgICMkICAgIFIgICAgMVAgICAkNCAKLU0gICEuICAgIDggICAgICAgICAgQyAgICArQCAgICVAICAgICAgICAgLzAgICAgICAgICAgICAgICggICAKLU0gJDAgICAhPCAgICAyICAgICAgICAgICAgICAgKyAgICAgICAgICEvICAgICAgICAgICAgICAhNiAgICAKLU0gICAgICY8ICAgITogICAgNjAgICAmOCAgICAgICAgIC5QICAgICAgICAgICAgICAgICAgICVUICAgICAKLU0gICAgK1AgICAgICAgICFFICAgICAgICAgICAgICAhQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQCAgICJEICAgICAgICAgICAgICAgICAKLU0gICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AgICAgICAgICAgICAgICAgICAKLU0gIjggICAgOyAgICAgICAgICFUICAgICAgICAgICAgICAhSCAgICBeICAgIDAwICAgIkwgICAgVSAgICAKLU0gICAgICAgICAgIDcgICAgICAgICAgICAgICAgICAgICAgICAgIiggICAgICAgICAgICAgICRQICAgICAKLU0gICAgICAgICAkOCAgICBYICAgIDRAICAgIzAgICAhLSAgICAgICAgICNQICAgICAgICAgICAgICAgICAKLU0gICBHICAgICAgICAgJTQgICAgICAgICAgICAgICFAICAgID4gICAgICAgICAgICAgICBZICAgIDhQICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICQgVSAgICAgICMgICAhICAgICAgICEgLkAgICAgICBQICAKLU0gQCAgICAgICAwLzwgICAgICAsICAgLCAgICAgICAkKjcgICAgICAjICAgJCAgICAgICAhI01AICAgICAKLU0gUCAgITAgICAgICAgMFtEICAgICAgLCAgIDggICAgICAgJC8iICAgICAgIyAgICcgICAgICAgISNRMCAKLU0gICAgIFAgICIgICAgICAgIDEtUCAgICAgICwgICBEICAgICAgICQzQCAgICAgICMgICAqICAgICAgICIKLU0kWkAgICAgICBQICAiUCAgICAgICBBMCAgICAgICAsICAgUCAgICAgICAoNCMgICAgICAjICAgLSAgICAKLU0gICAiJSlAICAgICAgUCAgI0AgICAgICAgICAgICAgICAgLCAgIFwgICAgICAgICAgICAgICAgIyAgIDAKLU0gICAgICAgICAgICAgICAgIFAgICQwICAgICAgICAgICAgICAgICwgICEoICAgICAgICAgICAgICAgICMKLU0gICAzICAgICAgICAgICAgICAgICBQICAlICAgICAgICAgICAgICAgICAsICAhNCAgICAgICAgICAgICAKLU0gICAjICAgNiAgICAgMCAiJSlAICAgICgkMCAgI0AgICAgRCAgMS1QICAgICAhKCAgIEQgICAgLyAgKDQKLU1IICAgICAwMSAgIC4gICAgJUAgIiUqQCAgICIwJDAgICNAICAgIVQgIEE0WCAgICAhISQgICBYICAgIFQKLU0gICg1LyAgICAgMDEgICAuICAgIC5AICIlNCAgICAgISQwICAjQCAgICRAICBBNSQgICAgISEkICAgWCAKLU0gICE2ICAoNTIgICAgIEAxICAgLiAgICA3UCAiJTUgICAgICgkMCAgI0AgICAnNCAgQTU4ICAgICIhJCAKLU0gIFggICAiKiAgKDU4ICAgICAwMSAgIC4gICAgR1AgIiU2MCAgICAkJDAgICNAICAgKjwgIEE1SCAgICAKLU0hISQgICBYICAgIlQgICQwOSAgICAhMDIgICAoICAgIFIwICEjWEAgICAgNCRAICAiICAgIC00ICBBNVAKLU0gICAgIiEkICAgWCAgICM+ICAoNT4gICAgIDAxICAgLiAgICBaICAiJTdQICAgICIkMCAgI0AgICAvWCAKLU0gQTVeICAgICBBJCAgIFggICAkLyAgKDVAICAgICBAMSAgIC4gICAhKFAgISNQQCAgICAgJEAgICFQICAKLU0gMkQgIEE2KCAgICAgQSQgICBYICAgJFggICQvUSAgICAhMDIgICAoICAgITEwICIlOFAgICAgJCQwICAKLU0jQCAgIDRUICBBNjAgICAgIEEkICAgWCAgICU6ICAoNUYgICAgIUAxICAgLiAgICE5ICAiJTsgICAgIDgKLU0kMCAgI0AgICA2WCAgQTcoICAgICEhJCAgIFggICAlVSAgKDVTICAgICAwMSAgIC4gICAhQSAgIiU9ICAKLU0gICAkJDAgICNAICAgOVAgIDEhMCAgICAlISggICBAICAgJk8gICg1VSAgICAgMDEgICAuICAgIVFAICIKLU0lPUAgICAgIiQwICAjQCAgIDxYICAwX0wgICAgJSEoICAgQCAgICdEICAoNCMgICAgICAxIC9fUSAgICEKLU1bMCAhJCpAICAgKygkQCAgIiAgICA/KCAgMS4gICAgICEhJCAgIEggICAnXyAgJDBEICAgICFAMiAgICgKLU0gICAiIzAgIiU9SCAgICAiJDAgICNAICAgQiQgIDEgNCAgICAlISggICBAICAgKFMgICg1VyAgICAgMDEKLU0gICAuICAgIjBQICIlPiAgICAgJCQwICAjQCAgIEUoICBBN0ggICAgJCEkICAgWCAgIClBICAkLyUgICAKLU0gJzAyICAgKCAgICI6ICAiJSkwICAgICAkMCNfXDAgICBGXCAgMSBIICAgICUhKCAgIEAgICAqIyAgKDUKLU1eICAgICBAMSAgIC4gICAiQ1AgIiVAICAgICAkJDAgICNAICAgSTwgIDEhWCAgICAmISggICBAICAgKkQKLU0gICQwLyAgICAhMDIgICAoICAgIkwgICIlQDAgICAgKCQwICAjQCAgIEwsICBBOTAgICAgISIkICAgWCAKLU0gICsrICAoNiMgICAgIDAxICAgLiAgICJXICAiJUEgICAgICQkMCAgI0AgICBPKCAgMF84ICAgICUhKCAKLU0gIEAgICAsJiAgKDYlICAgICAwMSAgIC4gICAjJTAgIiVBQCAgICAkJDAgICNAICAgUlQgIDBeUCAgICAKLU0lISggICBAICAgLSIgICg2NyAgICAgIDEgL19RICAgIzFQICIlQVAgICAgJCQwICAjQCAgIFVYICBBOEAKLU0gICAgISEkICAgWCAgIC1MICAoNikgICAgICQxICAgLiAgICM/ICAiJUJAICAgICQkMCAgI0AgICBYUCAKLU0gQThMICAgICEhJCAgIFggICAuPCAgJDNKICAgICAgMSAvX1EgICAjSFAgIiVDICAgICAoJDAgICNAICAKLU0gWyQgIEE4WCAgICAhISQgICBYICAgLyYgICg0ICAgICAgIDEgL19RICAgI1cgICEkICAgICAgNCRAICAKLU0iICAgIF48ICAwXjwgICAgJSEoICAgQCAgIC9aICAoNi8gICAgIDAxICAgLiAgICQiICAiJUQgICAgICEKLU0kMCAgI0AgICEgXCAgQTkkICAgICEhJCAgIFggICAwOiAgKDYyICAgICBAMSAgIC4gICAkKVAgIiReMCAKLU0gICAwJEAgICAgICAhIlAgIEEvOCAgICA2ISggICAgICAgMFMgICgzXCAgICAgQDIgICAgICAgJC4wICIKLU0lRSAgICAgJCQwICAjQCAgISQoICBBOTQgICAgISEkICAgWCAgIDE7ICAoNjYgICAgIDAxICAgLiAnOT8KLU09NllJO1ZYIDdWOUk7RkQgPFVdTDo2WUsgJzU/OyZFTjpQIVY3Vy1JOVZZRTklXVM6Jl1SPSVdUDtWRU4KLU09JjVSICc5Pzo2WVQgJzk/PFZFRztGNUQ3Vi1IODcoID1FXUk7RzE/PCZdSTtHMUU8QCFWN1YxTz02KUwKLU05MCFWN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEID1FXVU7Ry1JOVZZRTklXUk7RzE/ODcpUjg3RCAKLU09RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyggOFZRVTtGTUU8QCFWN1ctSTlWWUU5JV1JO0cwID1FXVUKLU07Ry1JOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1DOiYlUjdWOVU7RiwgPUVdVTtGRU87QyggPFchTzxHMVMKLU04ViVSICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVCAnOT8KLU08VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3VkVOOjcwID1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdUzomXVIKLU09JV1GPTZZQyAnOT85RlFPODcwID1FXUM6JiVSN1YlUjxGJVkgJzk/PFcxUj02LVQsMCFWN1ctVDxHNUMKLU09IyggPUVdTDtWWUcgJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU4KLU09JjVSICc5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIKLU0gJzk/PFZBTzxHMCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICVdJDY0WSEzNEUjICZVQTo2WCAKLU03VlFJOEVdVjk3KVM6Nl1OICc5PzkmXVU4RlFFN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUEKLU0+MCFWN1ctSTlWWUU5JV1JO0cxPzlHNU44UCFWN1c1TjxWRUc7RjVEN1ZRTztGPCA9RV1VO0ctSTlWWUUKLU05JV1JO0cwID1FXUQ7VzVCOyY1Pzg3KVI4N0QgN1ctVDg3KVQgJV1FOSYlVDgwIVY3VzVOPFZFRztGNUQKLU03VkVOPSVdRj02WUMgJzk/OjZZVDdWJVI8RiVZICchUjo2VUE8R0QgPUVdRjsmXUE9JV1GPTZZQyAnOT8KLU07Jl1OOVVdRj02WUMgJzk/PFZFRztGNUQ3VkVOPSVdQTxHKUE+MCFFO0c5STxGXU4gJzk/OSZdVThGUUUKLU03VyFPOjZZVDk3KCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ctSDtXKVQKLU03VjlVO0YsID1FXUM6JiVSN1chTzo2WVQ5NyggPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KCAKLU09RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgN1Y1TjkgIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVIKLU08RiVZICc5PzxWRUc7RjVEN1ZRTztGPCA9RV1VO0ctSTlWWUU5JV1DOiYlUiAnOT88VkFPPEcxPzwmXUkKLU07RzFFPEAhVjdWOUw7ViVUN1chTzo2WVQ5NyggN1Y1VDk3QVQgJzk/OUZRTzg3MT84NylSODdEID1FXVMKLU06Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCA3VD0sM1QpITMlXS8xRDkzMTUxPzUkJSIzJDU/ICc5Pzo2WVQKLU03VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAnOT88VkFPPEcxPzg3KVI4N0QgPUVdQzomJVIKLU0gJllPO0chUjo2VUE8R0QgPUVdTDtWWUc3ViVSPEYlWSAmNVg6NzAgODcxRT4mRVQgJV1FPiZFVCAlXUUKLU07RzlJPEZdTiAnOT89NllTOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhVjdXLUk5VllFOSVdTDtWWUcKLU03VyFPOjZZVDk3KCA7JkVCOFJZUztSWFEgICAgIEE5MCAgIUUkUCAgICAgICBBLzggICFDJTAgICAgICAKLU0gQS9EICAhQiUwICAgICAgIEEvUCAgIUQlMCAgICAiPVhbXkBAPD9AIignSCAgIlwkIiAgWCAuQDAqKCMKLU1IJDI8KFogQEApICAgMCogICAyMCQgICEwICEhKkAkICAgIDEgICEkRCEoQzwkICAwMjghICAgID9fX18KLU1cICQgICAiMCQgIDBEQSAgJDk0TCggKjQgSiAkRSAxICJBPCAgKDY2JE4pMFUiKyAgJCAgICRYISAgICAKLU0wICEhJlAkICAgISAgJCQ8IDAgICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKLU1AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JycKLU1YIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKLU0gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjAKLU1MISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKLU1AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIDEgICEkUDAoQ0IjIiAKLU0gICYhUV4gKEA+QCAgKVdDT1kgMSAgISRQMUhDRCMiICAgJiFRXiAoQD5AICApV0NPWSAxICAiJVAiSEIKLU0wISQgICg2MiQiICFUQkhBMCEkICAoNjIkIiAiVEJIQikhJCAgKDYyJCIgI1RDKEFWISQgICg2MiQiICQKLU1UQyhBQiEkICAoNjIkIiAlVEMoQT9BJCAgKDYyJCIgJlRCKEEvISQgICg2MiQiICdUQihBOiEkICAoNjIKLU0kIiAoVEIoQVghJCAgKDYyJCIgKVRCKEFSISQgICg2MiQiICpUQihCKCEkICAoNjIkIiArVEIoQVchJCAKLU0gKDQzICAhJFUgKUNGLTBCKDhQMSAgIiUkUCAgMS0wOjhaIzQuQiUoJDAgIEExLCAgKDc0IkYpIFUiSEEKLU1EISQgICg0MyAgIiVVIElBMC0wSig9SDEgICIlJFAgIEE9MCo4QjM0KkIlXCQwICBBMSwgICg3NCRGJzgKLU1VIyhCLyEkICAoNDMgICIlVSEpQUItMFIoQ0AxICAiJSRQICBBPTAyODdbNCxCKDwkMCAgQTEsICAoNzQKLU0gRiRcVSIoQV4hJCAgKDQzICAiJVUgKUE6LTBCKEAwMSAgIiUkUCAgQT0wIjg+IzQoQiU4JDAgIEExLCAKLU0gKDc0IEYnKFUiKEIyISQgICg0MyAgIiVVIClCKC0wQig4IDEgICIlJFAgIEE9MCI4PVM0KEIlMCQwICAKLU1BMSwgICg3NCBGJixVIihCLCEkICAoNDMgICIlVSFJQTItMFooPkAxICAiJSUwICBBOSgySEQjMihCKDQKLU0kMCAgQTE0ICAoNjIkSiUgVEIoQiQhJCAgKDQ1ICAiJURBKkIpLShCKEFAMSAgIiUlMCAgQTkoMkg9QzIKLU0oQihIJDAgIEExNCAgKDYyJEomKFRCKEEuISQgICg0NSAgIiVEQSpBP00oQihFMDEgICIlJTAgIEE5KDIKLU1IM1MyKEIlJCQwICBBMTQgICg2MiRKJUhUQihBOCEkICAoNDUgICIlREEqQVgtKEIoPTAxICAiJSUwICAKLU1BOSgySDxDMihCJywkMCAgQTE0ICAoNjIkSihAVEIoQjYhJCAgKDQ1ICAiJURBKkFXLShCKD0gMSAgIiUKLU0lMCAgQTkoMkg4UzIoQihMJDAgIEExNCAgKDYyJEolKFRCKEIjISQgICg2MiQiICJUQihCICEkICAoNjIKLU0kIiAiVEIoQjEhJCAgKDYyJCIgIVRCKEE+ISQgICg2MiQiICFUQihBOSEkICAoNDMgICIlVSApQEgtMEIKLU0oKkAxICAiJSRQICBBPTAyOClDNCxCJVBAPD9AIignSCAgIj1YW15AQDw/QCIoJ0ggICAgICAgICAgICAKLU0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgMExAICAgICAgICEgOjAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICAjIFAKLU1PX19TIDAgICAgLCAgI1BQT19fUCAwICAgICwgICRAUE9fX00gMCAgICAkICAgICAgQTAsICAgICAgICAKLU0gICAgICAgISAgICQ8MCAgICBQICAwXCggICAgIzAgISRXICAgICAkICAkIFogICAgIDQgIDBJPCAgICAKLU0hQCAhIF1QICAgICogICAkPlAgICAgTCAgICAwICAgICUwICAgICAgICAgIyAgKDNKICAgICAoICAgIEQKLU0gICAgJSAgICAgPCAgICA3ICAkLlkgICAgIDwgIDBbOCAgICAiICAgICMgICAgICkgICAgIyAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAgICQgL19RICAgICAgICEKLU0gLTAgICAgICBQICAgMCAgICAgICAwI0ggICAgICAsICAgKCAgICAgICAkI1cgICAgICAjICAgIyAgICAKLU0gICAhIkVQICAgICAgUCAgISAgICAgICAgMFs4ICAgICAgLCAgIDQgICAgICAgJC5ZICAgICAgIyAgICYKLU0gICAgICAgISNQQCAgICAgIFAgICFQICAgICAgIDBcNCAgICAgICwgICBAICAgICAgICQzPCAgICAgICMKLU0gICApICAgICAgICEkWCAgICAgICBQICAiQCAgICAgICBBLkggICAgICAsICAgTCAgICAgICAoNCAgICAKLU0gICAjICAgLCAgICAgICAiJSBQICAgICAgUCAgIzAgICAgICAgQTI4ICAgICAgLCAgIFggICAgICAgICAKLU0gICAgICAgIyAgIC8gICAgICAgICAgICAgICAgIFAgICQgICAgICAgICAgICAgICAgICwgICEkICAgICAKLU0gICAgICAgICAgICMgICAyICAgICAgICAgICAgICAgICBQICAkUCAgICAgICAgICAgICAgICAsICAhMCAKLU0gICAgICAgICAgICAgICAjICAgNSAgICAgICAgICAgICAgICAgUCAgJUAgICAgPCAgICAgICAgICAgMCAKLU1fXyQgICAgLiAgICAgICAgICAgJCAvX1EgICAgJkAgICAgICAgICAgISAjX1wwICAgIiggICAgICAgICAKLU0gIDAgX18kICAgIEkgICg0RiAgICAgQDEgICAuICAgICwwICEkVyAgICAgICRAICAiMCAgICM8ICBBMkAKLU0gICAgISEkICAgWCAgICBeICAoNEogICAgKSAxICAgLiAgICAxMCAiJTNAICAgICQkMCAgI0AgICAlUCAKLU0gQTRcICAgICEhJCAgIFggICAhQiAgKDUwICAgICAkMSAgIC4gICAgPCAgIiU0MCAgICAkJDAgICNAICAKLU0gJ1ggIEE1KCAgICAiISQgICBYICAgIicgICg1NCAgICAgQDEgICAuICAgIEcwICIlNUAgICAgKCQwICAKLU0jQCAgICsoICBBNUAgICAgISEkICAgWCAgICMnICAoNTkgICAgIDAxICAgLiAgICBTUCAiJTZAICAgICQKLU0kMCAgI0AgICAtUCAgMSFEICAgICUhKCAgIEAgICAjUSAgJC9CICAgICEwMiAgICggICAgXzAgIiU3ICAKLU0gICAoJDAgICNAICAgMDggIEE1WCAgICAhISQgICBYICAgJDAgICg1PyAgICAgKDEgICAuICAgISlAICIKLU0lN1ggICAgIiQwICAjQCAgIDM8ICBBNiAgICAgIiEkICAgWCAgICUrICAkLyIgICAgICAyICAgJyAgICEKLU00MCAiJThAICAgICIkMCAgI0AgICA2ICAgMF8kICAgICUhKCAgIEAgICAlTSAgKDVDICAgICAwMSAgIC4KLU0gICAhPTAgIiU5ICAgICAiJDAgICNAICAgOCggIEE2OCAgICAmISQgICBYICAgJiwgICg1TCAgICAhQDEKLU0gICAuICAgIUVAICIlPEAgICAgJCQwICAjQCAgIDlUICBBNywgICAgISEkICAgWCAgICZMICAoNVQgICAKLU0gIDAxICAgLiAgICFRICAhJCUgICAgIDQkQCAgIiAgICA9PCAgQTc0ICAgICEhJCAgIFggICAnTiAgKDUKLU1WICAgICAoMSAgIC4gICAhXUAgISNeUCAgICA0JEAgICIgICAgQFAgIEEwLCAgICAgISQgX18kICAgKDUKLU0gICQwSiAgICBMQDIgICAoICAgIiZAICEkWCAgICAgJCQwICAiQCAgIEI8ICAxIjAgICAgJiEoICAgQCAKLU0gIChVICAoNVZAICAgICgxICAgLiAgICIyMCAhJCEwICAgIDQkQCAgIiAgICBFTCAgQTc8ICAgICEhJCAKLU0gIFggICApSyAgKDVYICAgICAwMSAgIC4gICAiPkAgIiU+QCAgICAwJDAgICNAICAgSEQgIDBcNCAgICAKLU09ISggICBAICAgKjAgICg0RSAgICAgIDEgL19RICAgIkVQICEkIkAgICAgNCRAICAiICAgIEpMICBBN1gKLU0gICAgIiEkICAgWCAgICpXICAoNiAgICAgIDAxICAgLiAgICJPUCAhJCdAICAgIDgkQCAgIiAgICBMUCAKLU0gMSBcICAgICUhKCAgIEAgICArOCAgKDYhICAgICBAMSAgIC4gICAiWlAgIiVFICAgICAkKDAgICNAICAKLU0gTywgIEE4LCAgICAhISQgICBYICAgLCQgICg2JCAgICAgMDEgICAuICAgIyZAICEjXUAgICAgNCRAICAKLU0iICAgIFJYICBBODQgICAgISEkICAgWCAgICxdICAoNiYgICAgIDAxICAgLiAgICM1MCAhI1sgICAgIDQKLU0kQCAgIiAgICBWSCAgQTk8ICAgICAhJCBfXyQgICAtTyAgKDYnICAgICAwMSAgIC4gICAjQUAgIiVCICAKLU0gICAkJDAgICNAICAgWTAgIEE4RCAgICAgMSQgICBYICAgLkQgICg2KiAgICAgMDEgICAuICAgI00gICIKLU0lQlAgICAgJCQwICAjQCAgIFwwICAxLkggICAgICEkIF9fJCAgIC8rICAoNiwgICAgIEAxICAgLiAgICMKLU1WMCAiJUNAICAgICQkMCAgI0AgICBeWCAgQTAgICAgICAhJCBfXyQgICAwJCAgJDAgICAgICEwMiAgICgKLU0gICAkI1AgISNZUCAgICA0JEAgICIgICAhIiggIEE4XCAgICAhISQgICBYICAgMFAgICg2MCAgICAgJDEKLU0gICAuICAgJC1QICIlRDAgICAgJCQwICAjQCAgISQoICBBOSggICAgIiEkICAgWCAgIDEvICAoM1kgICAKLU0gISAyICAgICAgICQ1ICAiJF1AICAgITgkQCAgICAgICElTCAgQS9QICAgICIhKCAgICAgICAxQSAgKDYKLU00ICAgICAwMSAgIC4gICAkOkAgIiVFMCAgICAkJDAgICNAICAhKCwgIEE5OCAgICAhISQgICBYIDlWMUIKLU07NjQgOFcpVDoyWVMgJzlBOyc1RTxSVTg4MllDICY9RDhGVUUrRiwgOFcpVDtCWVMgJzk/PTZZSTtWWCAKLU03VjlJO0ZEIDxVXUw6NllLICc1PzsmRU46UCFWN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAnOT8KLU06NllUICc5PzxWRUc7RjVEN1YtSDg3KCA9RV1JO0cxPzwmXUk7RzFFPEAhVjdWMU89NilMOTAhVjdXNU4KLU08VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA9RV1VO0ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgPUVdUzo2PU4KLU05NjE/OjZZVDdXIU86NllUOTcoIDhWUVU7Rk1FPEAhVjdXLUk5VllFOSVdSTtHMCA9RV1VO0ctSTlWWUUKLU05JV1MO1ZZRzdWOVU7RiwgPUVdQzomJVI3VjlVO0YsID1FXVU7RkVPO0MoIDxXIU88RzFTOFYlUiAnOT8KLU09NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/PFZFRztGNUQKLU03VlFPO0Y9Pzg3KVI4N0QgN1ZFTjo3MCA9RV1TOjY9Tjk2MT88VkFPPEcwID1FXVM6Jl1SPSVdRj02WUMKLU0gJzk/OUZRTzg3MCA9RV1DOiYlUjdWJVI8RiVZICc5PzxXMVI9Ni1ULDAhVjdXLVQ8RzVDPSMoID1FXUwKLU07VllHICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAnOT8KLU08VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICc5PzxWQU8KLU08RzAgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQyAlXSQ2NFkhMzRFIyAmVUE6NlggN1ZRSThFXVYKLU05NylTOjZdTiAnOT85Jl1VOEZRRTdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXLUkKLU05VllFOSVdSTtHMT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFOSVdSTtHMCAKLU09RV1EO1c1QjsmNT84NylSODdEIDdXLVQ4NylUICVdRTkmJVQ4MCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUYKLU09NllDICc5Pzo2WVQ3ViVSPEYlWSAnIVI6NlVBPEdEID1FXUY7Jl1BPSVdRj02WUMgJzk/OyZdTjlVXUYKLU09NllDICc5PzxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhRTtHOUk8Rl1OICc5PzkmXVU4RlFFN1chTzo2WVQKLU05NyggPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCAKLU09RV1DOiYlUjdXIU86NllUOTcoID1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggPUVdVTtHLUkKLU05VllFOSVdQzomJVI3VjlVO0YsIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAnOT8KLU08VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFOSVdQzomJVIgJzk/PFZBTzxHMT88Jl1JO0cxRTxAIVYKLU03VjlMO1YlVDdXIU86NllUOTcoIDdWNVQ5N0FUICc5PzlGUU84NzE/ODcpUjg3RCA9RV1TOjY9Tjk2MT8KLU08VkFPPEcxPzg3KVI4N0QgN1Q9LDNUKSEzJV0vMUQ5MzE1MT81JCUiMyQ1PyAnOT86NllUN1Y5VTtGLCAKLU09RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJzk/PFZBTzxHMT84NylSODdEID1FXUM6JiVSICZZTztHIVIKLU06NlVBPEdEID1FXUw7VllHN1YlUjxGJVkgJjVYOjcwIDg3MUU+JkVUICVdRT4mRVQgJV1FO0c5STxGXU4KLU0gJzk/PTZZUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUw7VllHN1chTzo2WVQKLU05NyggICc5QTsnNUU8UlU4ODJZQyAiXUQ6NzlFK1cpRTsmNUE8VjRPOEJVUz43LUk5RkVYK1c1UzxCXVMKLU08RixPOyZFQitWUUk4RixPICchTzxHME85VjVOK1c5QTsnNUU8UlU4ODJZQyAgICA2JzBALlIhNi8zKE4KLU0sICFNODZFTiAlXUw6Nik/PUY1UjxWRU87QCBPPSZVUCAiXVU8VyhPOFYtUytWUUk4Ql1WODZRVTk3LE0KLU02JiROO1AgIDlWMUI7NjROOFAgTz0mVVArUCFHOSYpTTkyWUMgJj1DOFMpPzhWXU08JkVMOTYwTiAmRU4KLU09I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUi5TIFsKLU0sMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIVUKLU07Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWj0jNF0KLU08QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTjlSIUwKLU07VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXTxDJFsKLU0sI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUS5QIVMKLU06Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWj0jJFEKLU0vNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUS5TQFsKLU0sI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUz0nKVUKLU04VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFoKLU0tQlBRLUJQUS1DTVY3VkVOPSVdTTk2VUI5NyhaLDJQUyxCUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwKLU0tQzBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaLDMoTC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKLU0uQyRTKyMkUi4iUFYtI0xbICcxPz02WUk7VlhaNSMkVy83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwKLU0uI01WN1ctSDtXKVQ3VlVFOzYpRTxDSFYrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVYKLU03VlFPO0Y9Pzs2NU04RjVSLkMsTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFEsQlBQKyMsUi5XOT8KLU05Jl1VOEZRRTdWVUU7NilFPENIUSxSUFArIzhULlNMID1FXUM6JiVSN1Y5VTtGLFoxQyggPUVdUzo2PU4KLU05NjE/OFZBQTxFXUY9NllDLkQ4USwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU44U0kmLDMkID1FXVMKLU06Jl1SPSVdRj02WUMuRDhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1VO0ctSTlWWUUKLU05JV1TOiZdUj0lXUY9NllDLkQ4WCAnOT86NllUN1Y5VTtGLFoxQyQgPUVdUzo2PU45NjE/OjZZVDdWOVUKLU07RixaMUMkID1FXVU7Ry1JOVZZRTklXUk7RzE/OUc1TjhTSSYtICFWN1ZRTztGPT85RzVOOFNJJixQIVYKLU03Vy1JOVZZRTklXUw7VllHN1Y5VTtGLFoxQywgPUVdVTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDNCAKLU09RV1GOyZdQT0lXUY9NllDLkQ4USxAIVY3VjFPPTYpTDk1XUY9NllDLkQ4USxQIUw6NllLLkUwUS4jVVMKLU0sMzRSO0Y1WD0jSFEuM1RKLDNATCwiUFMsQ01MOjZZSzlHNU44U0hSLCNUSixDJF05QyRZKyMsUisjLFIKLU0uVy1UPTY5Ri5DKFIvNiVSLDNMUC5TIFssQyxdODcoUS5TIFssM0xSLSNVQTxDJFssI0xSLlMkVisjOFQKLU0rIyRRLTMoWy5QIVQ9NV1MOjZZSy5FMFItM1VVLDMwVDtGNVg9I0hRLjJQUCsjLFIuVlFJO0ZNRj02WUMKLU0uQyhQKyMgTCxTKFs8VzFVOUY4WixDKEwsIlBRLDM0Ui5TTCA4Vl1MO1cpUy5FMFItQ1VFPjY1TDsmXVcKLU0uQyBMPCc1UjwmUUUuQyRMPCZFTjpTSFIrI0wgOFYlUjxTSTQsQzxdOTYpTT1TSFArJyFPPEctQzomNFoKLU0sMlBbICYpTztWUUU4NlhaPSMoWC82NSYwNFEzMTNIUCslMTI1NDRaLDJQWyAmKVY4NlFTLkUwUi4zVUUKLU05RiVMPFY0WiwiUVQ8RzVFLkMkTC5QIUI7Vl1MOTYlTixDSVQsQ0QgOzZFUztXKUQ5NylFOSNJNCxTIF0KLU05NzFXO1NIUismXU45M0hRKydJRTxGXFosIlFUOicpRTkzSFMrI0wgOzYlSTtDSSYsMCFWN1YtSDg3KFoKLU0xUyggPUVdUzo2PU45NjE/OFZBQTxDSScsMyAgPUVdVTtHLUk5VllFOSVdQzomJVIuRDxRLDAhVjdXLUgKLU07VylULkQ8ViAnOT88VkVHO0Y1RDdXLUg7VylULkQ8ViAnOT89NllTOjY9Tjk2MT88VkFPPEcwWjFTQCAKLU09RV1JO0cwWjFTJCA9RV1TOjY9Tjk2MT86NllULkQ8USAnOT89NllTOjY9Tjk2MT86NllULkQ8VCAnOT8KLU07Jl1OOVNJJyxQIVY3Vy1JOVZZRTklXUw7VllHLkQ8UyAnOT89NllTOjY9Tjk2MT87Jl1OOVNJJy0wIVYKLU03VjlMO1YlVC5EPFEsQCFWN1YxTz02KUw5M0knLDMsID1FXUM6JiVSN1YlUjxGJVkuRDxTLDNVQTxDJFsKLU0sI0xRLlMoID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScsUyhdODcoUS5TIFssM0xRLCAhVjdXNU4KLU08VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyxTLzYlUiwzTFAuUyRbLDMkID1FXVM6Jl1SPSVdQTxHKUEKLU0+M0knLFMwXTg3KFEuUyBbLDNMViAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLSAhVjdXNU4KLU08VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLTNVQTxDJFssI0xRLlNAID1FXUk7RzE/ODcpUjg3RFoKLU0xUyxWLzYlUiwzTFAuUyRbLDAhVjdXLUk5VllFOSVdSTtHMT84NylSODdEWjFTLFYgJzk/PTZZUzo2PU4KLU05NjE/OjZZVDdWJVI8RiVZLkQ8Uy1TVUE8QyRbLCNMUS5TMCA9RV1MO1ZZRzdWJVI8RiVZLkQ8Uy4jVUEKLU08QyRbLCNMUS5TLCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knLFNAID1FXVU7Ry1JOVZZRTklXUwKLU07VllHN1YlUjxGJVkuRDxTLjNVQTxDJFssI0xRLlM0ID1FXUY7Jl1BPSVdQTxHKUE+M0knLSMgXTg3KFEKLU0uUyBbLDNMUSxAIVY3VjFPPTYpTDk1XUE8RylBPjNJJy0jJF04NyhRLlMgWywzTFEsUCFWN1YtSDg3KT8KLU08Jl1JO0cxRTxDSSctIyhdKkMoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIuRDxULFNUSiwzICAKLU09RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTMFQvMkhRLDAhVjdXLUg7VylUN1chTzo2WVQKLU05NyhaMVMwVS8ySFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT88Jl1JO0cxRTxDSSctIzhdKkNAID1FXUk7RzE/PCZdSTtHMUU8Q0knLSM8XSpDJCAKLU09RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyhaMVMwVyAnOT89NllTOjY9Tjk2MT86NllUN1chTzo2WVQKLU05NyhaMVMwWC8ySFQgJzk/OyZdTjlVXVA7VkVOPSY1Ui5EPFQuM1RKLFAhVjdXLUk5VllFOSVdTDtWWUcKLU03VyFPOjZZVDk3KFoxUzBZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIuRDxVLCNUSi0wIVYKLU03VjlMO1YlVDdXIU86NllUOTcoWjFTNFEvMkhRLEAhVjdWMU89NilMOTVdUDtWRU49JjVSLkQ8VSxDVEoKLU0sMywgPUVdUz0nKVU4VzBRLkQ8US1AIVY3Vy1UPEc1Qz0jKFoxUzRTLzcsUi0nOT84VkFBPEVdTTk2VUIKLU05NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFoKLU0sMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTC1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFoKLU0sMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFMrIyRSLiJQVi0jTFsgJzk/PTZZSTtWWFoKLU0xUyRXICc5Pz02WUk7VlhSLkQ8VS0jVVUuJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVIKLU09JV1NOTZVQjk3KFotQlBQKyMkVi5XOT86NllUN1ZVRTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUUKLU07NilFPENIUysjIEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLCJQUyxDTVY3VjFPPTYpTDk1XU0KLU05NlVCOTcoWiwzLEwsIlBWLSNMWyAnLT87JkVOOlNJJywzRCA9NV1MOjZZSy5EPFItMCFQPEZFTTg3KVkKLU0uRDxVLTNVRTxGNUQuQyBMOVcpRTk2WFosMlFCOyc1RS5DKEwuUCFOO1ZZUDxGRU04NylZLkQ8Ui1AIUMKLU07JzVOOlY1Ui5EPFUtQ1VFOFZBRT1HRFosIlFGO1cpRC5DJEwuUCFTPCZdUj0nLUM4NyhaMVMoVyAgIE4KLU06NllUOTcpUCAiWUg4Ny1IICJZRD42WVM+NlQgK0YxWTtHLVQ8QCBOPEY1TDgyWUI8VywgK0cpRTsmJE4KLU08JlFUICJZSTtGRVQgIllUOTdBVCAiWUY6NllJICJZUjtWMUE9JiQgK0chTD0gIE45Vl1UICJZRD42WUEKLU07NkVDICJZQjxXLCArRy1ZOzcxQThAIE48VzFSPSYlQiAiWVM9JiVCK0ZFTjkmNVg8VzFSICJZUz0mJUIKLU08VzFSICJZUzonLVQ8RzFBOEAgTjhWXU07NjVOPSAgTjxXMUE4QllJO0YxRT4gIE48VzFBOEAgIDg3LFoKLU0oJCxAMSY1Vjk2UU88JlVFO0cwQDRWNVQoIiBIMFQxMyoyITM0JCUyMFZdTTwmRUw5NylTKCMoTiwiIFEKLU0uIiEtODdEQCwzRFksQEggICYlUy5CISMoJDFFPUY1TDtXIU05NllUKCUtRT0iIEAqJC0kNFJEQDRVISEKLU00RC1POzchSTsmNVI8UiBSK0MgQCwzQEAzNiVZKCMkWS4zKCogICEgKiIsSTRXNU4zVSxALTJYUCgmOUMKLU08UlhAKCRJVTtGNEAsM0RZLEAgIDg3LFooJCxAMSY1Vjk2UU88JlVFO0cwQDRWNVQoIiBIMFQxMyoyITMKLU00JCUyMFZdTTwmRUw5NylTKCMoTiwiIFEuIiEtODdEQCwzRFksQEggMVQtIy5CIEgxVFk1KjIhQz42PU4KLU09NyxNLEJYUCtDKCAgJiVTLkIhIygkMUU9RjVMO1chTTk2WVQoJS1FPSIgQCokLSQ0UkRANFUhITRELU8KLU07NyFJOyY1UjxSIFIrQyBALDNAQDM2JVkoIyRZLjMoKiAmUUQuQiBINFQ9NSoyITM9NlkvNFJdMzVFKFQKLU0oIkEsMlJUUStDIEkgICAgICAgICAgJCAgICAnICAgIEIwICAgIFVEICAgICAgICAgICAgICM9RCAgICMKLU0gICAgICAgICAmTFggICAgICAgICAgICAgJyBYICAgICAgICAgICAgICRYXCAgICAqQT02IUAgICAlREoKLU0gICAgICAgICAgICAgJVhAICAgICAgICAgICAgICAkICAgIlwgICArIyAgICAgRUQgICAgICAkL0IgICAKLU0gIF1EICAgICAgJC9CICAgICE8XCAgICAgICAgICAgICAiOiAgICAgICAgICAgICAgJEIgICAgICAgICAKLU0gICAgICVKICAgICAgICAgICAgICAoJiAgICAgICAgICAgICAgKUogICAgICAgICAgICAgICtCICAgICAKLU0gICAgICAgICAtOiAgICAgICAgICAgICAgLyIgICAgICAgICAgICAgIDEqICAgICAgICAgICAgICAzNiAKLU0gICAgICAgICAgICAgNSogICAgICAgICAgICAgIDZaICAgICAgICAgICAgICA4IiAgICAgICAgICAgICAKLU0gOS4gICAgICAgICAgICAgIDpOICAgICAgICAgICAgICA7PiAgICAgICAgICAgICAgRSYgICAgICAgICAKLU0gICAgIE4sRCAgICAgICQvQiAgICAgISQgICFZICAgICAgICAgICEkICAhWSAgICAhICAgICAhJCAgIVkKLU0gICAgIyAgICBPKEQgICAgICAkL0cgICAgICEkICAhWiAgICAgICAgICAhJCAgIVogICAgISAgICAgISQKLU0gICFaICAgICMgICAgUEREICAgICAgJC9MICAgICAhJCAgIVsgICAgICAgICAgISQgICFbICAgICEgICAKLU0gICEkICAhWyAgICAjICAgIFIoRCAgICAgICQvUSAgICAgISQgICFdICAgICAgICAgICEkICAhXSAgICAKLU0hICAgICAhJCAgIV0gICAgIyAgICBTKEQgICAgICAkL1YgICAgICEkICAhXiAgICAgICAgICAhJCAgIV4KLU0gICAgISAgICAgISQgICFeICAgICMgICAgVEREICAgICAgJC9bICAgICAhJCAgIV8gICAgICAgICAgISQKLU0gICFfICAgICEgICAgICEkICAhXyAgICAjICAgIFYoRCAgICAgICQwICAgICAgISQgICIhICAgICAgICAKLU0gICEkICAiISAgICAhICAgICAhJCAgIiEgICAgIyAgICBXIEQgICAgICAkMCUgICAgICEkICAiIiAgICAKLU0gICAgICAhJCAgIiIgICAgISAgICAgISQgICIiICAgICMgICAgWDREICAgICAgJDAqICAgICAhJCAgIiMKLU0gICAgICAgICAgISQgICIjICAgICEgICAgICEkICAiIyAgICAjICAgIFlQRCAgICAgICQwLyAgICAgISQKLU0gICIlICAgICAgICAgICEkICAiJSAgICAhICAgICAhJCAgIiUgICAgIyAgICBaTEQgICAgICAkMDQgICAKLU0gICEkICAiJiAgICAgICAgICAhJCAgIiYgICAgISAgICAgISQgICImICAgICMgICAgXCREICAgICAgJDAKLU05ICAgICAhJCAgIicgICAgICAgICAgISQgICInICAgICEgICAgICEkICAiJyAgICAjICAgIF1ERCAgICAKLU0gICQwPiAgICAgISQgICIpICAgICAgICAgICEkICAiKSAgICAhICAgICAhJCAgIikgICAgJCAgICBeSEQKLU0gICAgICAkMEQgICAgICEkICAiKiAgICAgICAgICAhJCAgIiogICAgISAgICAgISQgICIqICAgICQgICAKLU0gX1IgICAgICAgICAgICAgISZCICAgICAgICAgICAgICEqQiAgICAgICAgICAgICAhLF4gICAgICAgICAKLU0gICAgIS5OICAgICAgICAgICAgICEwRiAgICAgICAgICAgICAhMjYgICAgICAgICAgICAgITMqICAgICAKLU0gICAgICAgICE1XEQgICAgICAkMEogICAgICEkICAiUiAgICAgICAgICAhJCAgIlUgICAgISAgICAgISQKLU0gICJWICAgICMgICAgICEkICAiVyAgICAmICAgICAhJCAgIlkgICAgKSAgICAgISQgICJaICAgICwgICAKLU0gICEkICAiWyAgICAvICAgICAhJCAgIl0gICAgMiAgICAgISQgICJeICAgIDUgICAgICEkICAiXyAgICAKLU04ICAgICAhJCAgIyEgICAgOyAgICAgISQgICMiICAgID4gICAgICEkICAjIyAgICBBICAgICAhJCAgIyUKLU0gICAgRCAgICAgISQgICMmICAgIEggICAgICEkICAjKSAgICBMICAgICAhJCAgIyogICAgUCAgICAgISQKLU0gICMrICAgIFQgICAgICEkICAjLSAgICBYICAgICAhJCAgIy4gICAgXCAgICAgISQgICMvICAgISAgICAKLU0gICEkICAjMSAgICEkICAgICAhJCAgIzIgICAhKCAgICAgISQgICMzICAgISwgICAgICEkICAjNSAgICEKLU0wICAgICAhJCAgIzYgICAhNCAgICAgISQgICM3ICAgITggICAgICEkICAjOSAgICE8ICAgICAhJCAgIzoKLU0gICAhQCAgICAgISQgICM8ICAgIUQgICAgICEkICAjPSAgICFIICAgICAhJCAgIz4gICAhTCAgICAgISQKLU0gICNAICAgIVAgICAgICEkICAjQSAgICFUICAgICAhJCAgI0IgICAhWCAgICAgISQgICNEICAgIVwgICAKLU0gICEkICAjRSAgICIgICAgICAhJCAgI0YgICAiJCAgICAgISQgICNIICAgIiggICAgICEkICAjSSAgICIKLU0sICAgICAhJCAgI0ogICAiMCAgICAgISQgICNMICAgIjQgICAgICEkICAjTSAgICI4ICAgICAhJCAgI08KLU0gICAiPCAgICAgISQgICNQICAgIj8gICAgICEkICAjUSAgICJCICAgICAhJCAgI1IgICAiRSAgICAgISQKLU0gICNUICAgIkggICAgICEkICAjViAgICJMICAgICAhJCAgI1cgICAiUCAgICAgISQgICNXICAgIlAgICAKLU0hNjxAICAgICAgICAgICAgITckQCAgICAgICAgICAgICE4LEAgICAgICAgICAgICAhOTxAICAgICAgICAKLU0gICAgITooQCAgICAgICAgICAgICE7MEAgICAgICAgICAgICAhPEBAICAgICAgICAgICAgIT0kQCAgICAKLU0gICAgICAgICE+JEAgICAgICAgICAgICAhPyxAICAgICAgICAgICAgIT9UQCAgICAgICAgICAgICFAWEAKLU0gICAgICAgICAgICAhQiRAICAgICAgICAgICAgIUJUQCAgICAgICAgICAgICFDSEAgICAgICAgICAgICAKLU0hRTRAICAgICAgICAgICAgIUdAQCAgICAgICAgICAgICFJVEAgICAgICAgICAgICAhS0RAICAgICAgICAKLU0gICAgIU0oQCAgICAgICAgICAgICFPPEAgICAgICAgICAgICAhUSRAICAgICAgICAgICAgIVJAQCAgICAKLU0gICAgICAgICFUTEAgICAgICAgICAgICAhVjhAICAgICAgICAgICAgIVdYQCAgICAgICAgICAgICFaKEAKLU0gICAgICAgICAgICAhW1xAICAgICAgICAgICAgIV1UQCAgICAgICAgICAgICFfLEAgICAgICAgICAgICAKLU0iISRAICAgICAgICAgICAgIiMkQCAgICAgICAgICAgICIkQEAgICAgICAgICAgICAiJixAICAgICAgICAKLU0gICAgIigsQCAgICAgICAgICAgICIpQEAgICAgICAgICAgICAiKyRAICAgICAgICAgICAgIixcQCAgICAKLU0gICAgICAgICIuNEAgICAgICAgICAgICAiL1xAICAgICAgICAgICAgIjFYQCAgICAgICAgICAgICIzOEAKLU0gICAgICAgICAgICAiNFxAICAgICAgICAgICAgIjVUQCAgICAgICAgICAgICI/QEAgICAgICAgICAgICAKLU0iQDBAICAgICAgICAgICAgIkk8QCAgICAgICAgICAgICJKKEAgICAgICAgICAgICAiSlRAICAgICAgICAKLU0gICAgIk0kQCAgICAgICAgICAgICJOIEAgICAgICAgICAgICAiT1hAICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgIDAgICAgKCAKLU0gMCM0ICAgIFUgICAgISQgICAgICAgICAgICAgICAkICAgICAgICAgIjAgICAgNCAgICAiICAkIFogICAKLU0gLkAgICArVCAgICAgUCAgICAgICAgICQgICAgISAgICAgXCAgICArICAgICBAICEgXVAgICAvPCAgICYKLU1AICAgICAwICAgIDcgICAgISAgICAhICAgICA3ICAgICBQICAgICggIDBJPCAgICo3ICAgISdMICAgICAKLU0gICAgICAgICAgJCAgICAgICAgICdQICAgIDAgICAgIiAgJC5WICAgI01AICAgICwgICAgIFAgICAgWCAKLU0gICAkICAgICMgICAgIkQgICAgJCAgICAgQCAhI04wICAgW0QgICAgKSAgICAgLCAgICArICAgICEgICAKLU0gIFAgICAgUyAgICAgMCAgICA4ICAwXCggICAvIiAgICAgUCAgICAgICAgICAgICAgIDAgICAgICAgICAKLU0uMCAgICAkICAgICYgICQvJSAgICNRMCAgIDE8ICAgICAgICAgICAgICAgJCAgICAgICAgICNcICAgICEKLU0gICAgIUAgISRXICAgIS1QICAgICMgICAgICAgICAgICAgICAhICAgICAgICAgISUgICAgIDAgICAgKCAKLU0gMS4gICAgM0AgICAgIkAgICAgICAgICAgICAgICBAICAgICAgICAgMzAgICAgJCAgICAnICAoM0ogICAKLU0kWkAgICAhOCAgICAgICAgICAgICAgICQgICAgISAgICAlKCAgICAhICAgICBQICIlICAgICEwICAgICAKLU0jICAgICAgICAgICAgICAgISAgICAgMCAgICE3ICAgICFAICAgICwgIEEwLCAgIDQjICAgIChAICAgICQKLU0gICAgICAgICAgMCAgICAoICAgIDggICAgIEAgICAgIyAgKDRGICAgJSlAICAgJyQgICAgICAgICAgICAKLU0gICAoICAgICAgICAgJjQgICAgIiAgICAgICAgICAgICAhMjggICAmVCAgICAhICAgICA8ICAgICEgICAKLU0gISAgICAhTSAgICAgUCAgICAgICAgICAgICA7OiAgICEpRCAgICAgICAgICAgICAgICQgICAgICAgICAKLU09MCAgICAsICAgICAgICAgICAgICggJCAgICIpICAgICAgICAgICAgICAgISAgICAgICAgICgwICAgICMKLU0gICAgICAgICAgICAgIiIqICAgKyMgICAgICAgICAgICAgICAgMCAgICAgICAgIi0gICAgIFAgICAgICAKLU0gICAgICAgS0VAICAgKyggICAgICAgICAgICAgICAkICAgICAgICAgRVAgICAgJCAgICAgICAgICAgICAKLU0rJEAgICAlKSAgICAgICAgICAgICAgICEgICAgICAgICAqICAgICAhICAgICAgICAgICAgICJWNCAgICAKLU04ICAgICAgICAgICAgICAgISAgICAgUCAgICJMICAgICAwICAgICAgICAgICAgIE1dICAgIi1QICAgICAKLSwgICAgICAgICAgMCAgICAsCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90dWkvTWFrZWZpbGUgYi9nZGIvdHVpL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDg5YzZlLi4wMDAwMDAwCi0tLSBhL2dkYi90dWkvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KLSMgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotYWxsOiBsaWJ0dWkuYQotCi1zcmNkaXI9LgotCi1TSEVMTCA9IC9iaW4vc2gKLQotQ0M9Z2NjCi1DRkxBR1M9LWcgLU8yCi1BUj1hcgotUkFOTElCPXJhbmxpYgotCi0jIEhvc3QgYW5kIHRhcmdldC1kZXBlbmRlbnQgbWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLQotIyBIb3N0OiBTdW4gNCBvciBTcGFyY3N0YXRpb24sIHJ1bm5pbmcgU3VuT1MgNAotWERFUEZJTEVTPSBzZXItdGNwLm8KLVhNX0ZJTEU9IHhtLXN1bjRvczQuaAotTkFUX0ZJTEU9IG5tLXN1bjRvczQuaAotTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIHNwYXJjLW5hdC5vCi1IT1NUX0lQQz0tREJTRF9JUEMKLUdEQlNFUlZFUl9ERVBGSUxFUz0gbG93LXNwYXJjLm8KLSMgU2V0dGluZyBYTV9DTElCUz0tbHJlc29sdiB3b3VsZCBsZXQgdXMgdXNlIHRoZSBETlMsIGJ1dCB0aGF0IHdvdWxkIHNjcmV3Ci0jIGFueW9uZSB3aG8gd2FudHMgdG8gdXNlIE5JUywgd2hpY2ggaW5jbHVkZXMgYXQgbGVhc3Qgb25lIEN5Z251cyBjdXN0b21lcgotIyAoUFIgMzU5MykuICBTbyBsZWF2ZSBpdCB0aGlzIHdheSB1bnRpbC91bmxlc3Mgd2UgZmluZCBhIHJlc29sdmVyIHdoaWNoIGNhbgotIyBnZXQgbmFtZXMgZnJvbSBlaXRoZXIgRE5TIG9yIE5JUyBmcm9tIHRoZSBzYW1lIEdEQiBiaW5hcnkuCi0KLSMgVGFyZ2V0OiBTdW4gNCBvciBTcGFyY3N0YXRpb24sIHJ1bm5pbmcgU3VuT1MgNAotVERFUEZJTEVTPSBzcGFyYy10ZGVwLm8gc29saWIubwotVE1fRklMRT0gdG0tc3VuNG9zNC5oCi0jIEVuZCBvZiBob3N0IGFuZCB0YXJnZXQtZGVwZW5kZW50IG1ha2VmaWxlIGZyYWdtZW50cwotCi0jIFdoZXJlIGlzIG91ciAiaW5jbHVkZSIgZGlyZWN0b3J5PyAgVHlwaWNhbGx5ICQoc3JjZGlyKS8uLi9pbmNsdWRlLgotIyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBoZWFkZXIgZmlsZSBkaXJlY3RvcnkgZm9yIHRoZSBsaWJyYXJ5Ci0jIHJvdXRpbmVzIGluIGxpYmliZXJ0eS4KLUlOQ0xVREVfRElSID0gICQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlCi1JTkNMVURFX0NGTEFHUyA9IC1JJChJTkNMVURFX0RJUikKLQotIyBDb25maWd1cmVkIGJ5IHRoZSAtLXdpdGgtbW1hbGxvYyBvcHRpb24gdG8gY29uZmlndXJlLgotTU1BTExPQyA9IAotTU1BTExPQ19DRkxBR1MgPSAKLQotIyBXaGVyZSBpcyB0aGUgQkZEIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vYmZkLgotQkZEX0RJUiA9IC4uLy4uL2JmZAotQkZEX1NSQyA9ICQoc3JjZGlyKS8kKEJGRF9ESVIpCi1CRkRfQ0ZMQUdTID0gLUkkKEJGRF9ESVIpIC1JJChCRkRfU1JDKQotCi0jIFdoZXJlIGlzIHRoZSBSRUFETElORSBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL3JlYWRsaW5lLgotUkVBRExJTkVfRElSID0gLi4vLi4vcmVhZGxpbmUKLVJFQURMSU5FX1NSQyA9ICQoc3JjZGlyKS8kKFJFQURMSU5FX0RJUikKLVJFQURMSU5FX0NGTEFHUyA9IC1JJChSRUFETElORV9TUkMpCi0KLSMgV2hlcmUgaXMgdGhlIElOVEwgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi9pbnRsLgotSU5UTF9ESVIgPSAuLi8uLi9pbnRsCi1JTlRMX1NSQyA9ICQoc3JjZGlyKS8kKElOVExfRElSKQotSU5UTF9DRkxBR1MgPSAtSSQoSU5UTF9ESVIpIC1JJChJTlRMX1NSQykKLQotIyBXaGVyZSBpcyB0aGUgVENMIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vdGNsLgotVENMX0NGTEFHUyA9IEBUQ0xIRElSQAotCi0jIFdoZXJlIGlzIHRoZSBUSyBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL3RrLgotVEtfQ0ZMQUdTID0gQFRLSERJUkAgQFRLX0JVSUxEX0lOQ0xVREVTQAotCi0jIFdoZXJlIGlzIEl0Y2w/ICBUeXBpY2FsbHkgaW4gLi4vaXRjbC4KLUlUQ0xfQ0ZMQUdTID0gQElUQ0xIRElSQAotCi0jIFdoZXJlIGlzIFRpeD8gIFR5cGljYWxseSBpbiAuLi90aXguCi1USVhfQ0ZMQUdTID0gQFRJWEhESVJACi0KLVgxMV9DRkxBR1MgPSBAVEtfWElOQ0xVREVTQAotCi1FTkFCTEVfSURFPSBARU5BQkxFX0lERUAKLQotR1VJX0NGTEFHU19YID0gLUkkKHNyY2RpcikvLi4vLi4vbGliZ3VpL3NyYwotCi1JREVfQ0ZMQUdTX1ggPSAtSSQoc3JjZGlyKS8uLi8uLi9saWJpZGV0Y2wvc3JjIC1JJChzcmNkaXIpLy4uLy4uL2xpYmlkZS9zcmMgXAotICBgaWYgWyB4IiQoRU5BQkxFX0lERSkiICE9IHggXSA7IHRoZW4gXAotICAgIGVjaG8gLURJREUgLUkkKHNyY2RpcikvLi4vLi4vaWx1L3J1bnRpbWUvbWFpbmxvb3A7XAotICBmaWAKLQotSURFX0NGTEFHUz0kKEdVSV9DRkxBR1NfWCkgJChJREVfQ0ZMQUdTX1gpCi0KLUVOQUJMRV9DRkxBR1M9IAotCi0jIC1JLiBmb3IgY29uZmlnIGZpbGVzLgotIyAtSSQoc3JjZGlyKSBmb3IgZ2RiIGludGVybmFsIGhlYWRlcnMgYW5kIHBvc3NpYmx5IGZvciBnbnUtcmVnZXguaCBhbHNvLgotIyAtSSQoc3JjZGlyKS9jb25maWcgZm9yIG1vcmUgZ2VuZXJpYyBjb25maWcgZmlsZXMuCi0KLSMgSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gYWRkIC1JL3Vzci9pbmNsdWRlL3N5cyBpZgotIyB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgZmNudGwuaCBpbiAvdXNyL2luY2x1ZGUgKHdoaWNoIGlzIHdoZXJlIGl0Ci0jIHNob3VsZCBiZSBhY2NvcmRpbmcgdG8gUG9zaXgpLgotREVGUyA9IC1ESEFWRV9DT05GSUdfSAotR0RCX0NGTEFHUyA9IC1JLiAtSS4uIC1JJChzcmNkaXIpIC1JJChzcmNkaXIpLy4uIC1JJChzcmNkaXIpLy4uL2NvbmZpZyAkKERFRlMpCi0KLSMgTXtILFR9X0NGTEFHUywgaWYgZGVmaW5lZCwgaGF2ZSBob3N0LSBhbmQgdGFyZ2V0LWRlcGVuZGVudCBDRkxBR1MKLSMgZnJvbSB0aGUgY29uZmlnIGRpcmVjdG9yeS4KLUdMT0JBTF9DRkxBR1MgPSAkKE1UX0NGTEFHUykgJChNSF9DRkxBR1MpCi0jUFJPRklMRV9DRkxBR1MgPSAtcGcKLQotIyBJTlRFUk5BTF9DRkxBR1MgaXMgdGhlIGFnZ3JlZ2F0ZSBvZiBhbGwgb3RoZXIgKkNGTEFHUyBtYWNyb3MuCi1JTlRFUk5BTF9DRkxBR1MgPSAkKENGTEFHUykgJChHTE9CQUxfQ0ZMQUdTKSAkKFBST0ZJTEVfQ0ZMQUdTKSBcCi0JJChHREJfQ0ZMQUdTKSAkKFJFQURMSU5FX0NGTEFHUykgJChCRkRfQ0ZMQUdTKSBcCi0JJChNTUFMTE9DX0NGTEFHUykgJChJTkNMVURFX0NGTEFHUykgJChJTlRMX0NGTEFHUykgXAotCSQoRU5BQkxFX0NGTEFHUykKLQotSEVBREVSUyA9IHR1aUlPLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaCB0dWlMYXlvdXQuaCB0dWlTdGFjay5oIFwKLQkgIHR1aVNvdXJjZS5oIHR1aUNvbW1hbmQuaCB0dWlXaW4uaCB0dWlEaXNhc3NlbS5oIFwKLQkgIHR1aVNvdXJjZVdpbi5oIHR1aVJlZ3MuaCB0dWlEYXRhV2luLmgKLQotU09VUkNFUyA9IHR1aS5jIHR1aURhdGEuYyB0dWlTb3VyY2UuYyB0dWlTdGFjay5jIHR1aUlPLmMgXAotCSAgdHVpR2VuZXJhbFdpbi5jIHR1aUxheW91dC5jIHR1aVdpbi5jIHR1aUNvbW1hbmQuYyBcCi0JICB0dWlEaXNhc3NlbS5jIHR1aVNvdXJjZVdpbi5jIHR1aVJlZ3MuYyB0dWlEYXRhV2luLmMKLQotT0JKRUNUUyA9IHR1aS5vIHR1aURhdGEubyB0dWlTb3VyY2UubyB0dWlTdGFjay5vIHR1aUlPLm8gXAotCSAgdHVpR2VuZXJhbFdpbi5vIHR1aUxheW91dC5vIHR1aVdpbi5vIHR1aUNvbW1hbmQubyBcCi0JICB0dWlEaXNhc3NlbS5vIHR1aVNvdXJjZVdpbi5vIHR1aVJlZ3MubyB0dWlEYXRhV2luLm8gXAotCSAgdHVpSW5pdC5vCi0KLQotIyBQcmV2ZW50IFN1biBtYWtlIGZyb20gcHV0dGluZyBpbiB0aGUgbWFjaGluZSB0eXBlLiAgU2V0dGluZwotIyBUQVJHRVRfQVJDSCB0byBub3RoaW5nIHdvcmtzIGZvciBTdW5PUyAzLCA0LjAsIGJ1dCBub3QgZm9yIDQuMS4KLS5jLm86Ci0JJChDQykgLWMgJChJTlRFUk5BTF9DRkxBR1MpICQ8Ci0uU1VGRklYRVM6IC5jcHAKLS5jLmNwcDoKLQkkKENDKSAtRSAkKElOVEVSTkFMX0NGTEFHUykgJDwgPiAkQAotCi1saWJ0dWkuYTogJChPQkpFQ1RTKQotCXJtIC1mIGxpYnR1aS5hCi0JJChBUikgcmMgbGlidHVpLmEgJChPQkpFQ1RTKQotCSQoUkFOTElCKSBsaWJ0dWkuYQotCi10dWkubzogdHVpLmMgdHVpLmggdHVpRGF0YS5oIHR1aUxheW91dC5oIHR1aUlPLmggdHVpUmVncy5oIHR1aVdpbi5oCi10dWlDb21tYW5kLm86IHR1aS5oIHR1aURhdGEuaCB0dWlXaW4uaCB0dWlJTy5oCi10dWlEYXRhLm86IHR1aS5oIHR1aURhdGEuaAotdHVpRGF0YVdpbi5vOiB0dWkuaCB0dWlEYXRhLmggdHVpUmVncy5oCi10dWlEaXNhc3NlbS5vOiB0dWkuaCB0dWlEYXRhLmggdHVpTGF5b3V0LmggdHVpU291cmNlV2luLmggdHVpU3RhY2suaAotdHVpR2VuZXJhbFdpbi5vOiB0dWkuaCB0dWlEYXRhLmggdHVpR2VuZXJhbFdpbi5oCi10dWlJTy5vOiB0dWkuaCB0dWlEYXRhLmggdHVpSU8uaCB0dWlDb21tYW5kLmggdHVpV2luLmgKLXR1aUxheW91dC5vOiB0dWkuaCB0dWlEYXRhLmggdHVpR2VuZXJhbFdpbi5oIHR1aVN0YWNrLmggdHVpUmVncy5oIFwKLQl0dWlEaXNhc3NlbS5oCi10dWlSZWdzLm86IHR1aS5oIHR1aURhdGEuaCB0dWlMYXlvdXQuaCB0dWlXaW4uaAotdHVpU291cmNlLm86IHR1aS5oIHR1aURhdGEuaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oIHR1aVNvdXJjZS5oCi10dWlTb3VyY2VXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aVN0YWNrLmggdHVpU291cmNlV2luLmggdHVpU291cmNlLmggXAotCXR1aURpc2Fzc2VtLmgKLXR1aVN0YWNrLm86IHR1aS5oIHR1aURhdGEuaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oCi10dWlXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oIFwKLQl0dWlEYXRhV2luLmgKLQotdHVpSW5pdC5vOiB0dWlJbml0LmMKLXR1aUluaXQuYzogJChTT1VSQ0VTKQotCUBlY2hvIE1ha2luZyB0dWlJbml0LmMKLQlAcm0gLWYgaW5pdC5jLXRtcAotCUBlY2hvICcvKiBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZS4gICovJyA+aW5pdC5jLXRtcAotCUBlY2hvICcvKiBJdCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIE1ha2VmaWxlLgkqLyc+PmluaXQuYy10bXAKLQlAZWNobyAnI2luY2x1ZGUgImFuc2lkZWNsLmgiJyA+PmluaXQuYy10bXAKLQlAZWNobyAnZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV90dWlfZmlsZXMgUEFSQU1TICgodm9pZCkpOycgPj5pbml0LmMtdG1wCi0JQGVjaG8gJ3ZvaWQgaW5pdGlhbGl6ZV90dWlfZmlsZXMgUEFSQU1TICgodm9pZCkpIHsnID4+aW5pdC5jLXRtcAotCUAtKCBjZCAkKHNyY2RpcikgOyBncmVwICdeX2luaXRpYWxpemVfW2Etel8wLTlBLVpdKiAqKCcgJChTT1VSQ0VTKSApIDI+L2Rldi9udWxsIFwKLQl8IHNlZCAtZSAncy9eLio6Ly8nIC1lICdzL15cKFthLXpfMC05QS1aXSpcKS4qLyAge2V4dGVybiB2b2lkIFwxIFBBUkFNUyAoKHZvaWQpKTsgXDEgKCk7fS8nID4+aW5pdC5jLXRtcAotCUBlY2hvICd9JyA+PmluaXQuYy10bXAKLQlAbXYgaW5pdC5jLXRtcCB0dWlJbml0LmMKLQotY2xlYW46Ci0Jcm0gLWYgKi5vICouYQpkaWZmIC0tZ2l0IGEvZ2RiL3dpbmRvd3MtbmF0LmMgYi9nZGIvd2luZG93cy1uYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZWM2ZC4uMDAwMDAwMAotLS0gYS9nZGIvd2luZG93cy1uYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOTQgKzAsMCBAQAotLyogVGFyZ2V0LXZlY3RvciBvcGVyYXRpb25zIGZvciBjb250cm9sbGluZyB3aW4zMiBjaGlsZCBwcm9jZXNzZXMsIGZvciBHREIuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZSBudGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotLyogYnkgU3RldmUgQ2hhbWJlcmxhaW4sIHNhY0BjeWdudXMuY29tICovCi0KLS8qIFdlIGFzc3VtZSB3ZSdyZSBiZWluZyBidWlsdCB3aXRoIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGN5Z3dpbi4gICovCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiZnJhbWUuaCIJCS8qIHJlcXVpcmVkIGJ5IGluZmVyaW9yLmggKi8KLSNpbmNsdWRlICJpbmZlcmlvci5oIgotI2luY2x1ZGUgInRhcmdldC5oIgotI2luY2x1ZGUgIndhaXQuaCIKLSNpbmNsdWRlICJnZGJjb3JlLmgiCi0jaW5jbHVkZSAiY29tbWFuZC5oIgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgIndpbmRlZnMuaCIKLSNlbHNlIC8qIG90aGVyIFdJTjMyIGNvbXBpbGVyICovCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPGltYWdlaGxwLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJ1aWxkc3ltLmgiCi0jaW5jbHVkZSAic3ltZmlsZS5oIgotI2luY2x1ZGUgIm9iamZpbGVzLmgiCi0jaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgotI2luY2x1ZGUgImdkYnRocmVhZC5oIgotI2luY2x1ZGUgImdkYmNtZC5oIgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBUaGUgdWkncyBldmVudCBsb29wLiAqLwotZXh0ZXJuIGludCAoKnVpX2xvb3BfaG9vaykgUEFSQU1TICgoaW50IHNpZ25vKSk7Ci0KLS8qIElmIHdlJ3JlIG5vdCB1c2luZyB0aGUgb2xkIEN5Z3dpbiBoZWFkZXIgZmlsZSBzZXQsIGRlZmluZSB0aGUKLSAgIGZvbGxvd2luZyB3aGljaCBuZXZlciBzaG91bGQgaGF2ZSBiZWVuIGluIHRoZSBnZW5lcmljIFdpbjMyIEFQSQotICAgaGVhZGVycyBpbiB0aGUgZmlyc3QgcGxhY2Ugc2luY2UgdGhleSB3ZXJlIG91ciBvd24gaW52ZW50aW9uLi4uICovCi0jaWZuZGVmIF9HTlVfSF9XSU5ET1dTX0gKLSNkZWZpbmUgRkxBR19UUkFDRV9CSVQgMHgxMDAKLSNkZWZpbmUgQ09OVEVYVF9ERUJVR0dFUiAoQ09OVEVYVF9GVUxMIHwgQ09OVEVYVF9GTE9BVElOR19QT0lOVCkKLSNlbmRpZgotCi0vKiBUaGUgc3RyaW5nIHNlbnQgYnkgY3lnd2luIHdoZW4gaXQgcHJvY2Vzc2VzIGEgc2lnbmFsLgotICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGluIGEgY3lnd2luIGluY2x1ZGUgZmlsZS4gKi8KLSNkZWZpbmUgQ1lHV0lOX1NJR05BTF9TVFJJTkcgImN5Z3dpbjogc2lnbmFsIgotCi0jZGVmaW5lIENIRUNLKHgpIAljaGVjayAoeCwgX19GSUxFX18sX19MSU5FX18pCi0jZGVmaW5lIERFQlVHX0VYRUMoeCkJaWYgKGRlYnVnX2V4ZWMpCQlwcmludGYgeAotI2RlZmluZSBERUJVR19FVkVOVFMoeCkJaWYgKGRlYnVnX2V2ZW50cykJcHJpbnRmIHgKLSNkZWZpbmUgREVCVUdfTUVNKHgpCWlmIChkZWJ1Z19tZW1vcnkpCXByaW50ZiB4Ci0jZGVmaW5lIERFQlVHX0VYQ0VQVCh4KQlpZiAoZGVidWdfZXhjZXB0aW9ucykJcHJpbnRmIHgKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIGNoaWxkX29wczsKLQotc3RhdGljIHZvaWQgY2hpbGRfc3RvcCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHdpbjMyX2NoaWxkX3RocmVhZF9hbGl2ZSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgY2hpbGRfa2lsbF9pbmZlcmlvciBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byB0cmFjayBpbmZvcm1hdGlvbiB0aGF0IGlzCi0gICBub3QgYXZhaWxhYmxlIGluIGdkYidzIHRocmVhZCBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB0aHJlYWRfaW5mb19zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCB0aHJlYWRfaW5mb19zdHJ1Y3QgKm5leHQ7Ci0gICAgRFdPUkQgaWQ7Ci0gICAgSEFORExFIGg7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgc3VzcGVuZF9jb3VudDsKLSAgICBDT05URVhUIGNvbnRleHQ7Ci0gICAgU1RBQ0tGUkFNRSBzZjsKLSAgfSB0aHJlYWRfaW5mbzsKLQotc3RhdGljIHRocmVhZF9pbmZvIHRocmVhZF9oZWFkID0ge05VTEx9OwotCi0vKiBUaGUgc2F2ZWQgc3RhdGUgZm9yIGEgY29udGludWUgYWZ0ZXIgYnJlYWtpbmcgYmFjayB0byBnZGIuICovCi1zdGF0aWMgRFdPUkQgY29udGludWVfc3RhdHVzOwotCi0vKiBUaGUgcHJvY2VzcyBhbmQgdGhyZWFkIGhhbmRsZXMgZm9yIHRoZSBhYm92ZSBjb250ZXh0LiAqLwotCi1zdGF0aWMgREVCVUdfRVZFTlQgY3VycmVudF9ldmVudDsJLyogVGhlIGN1cnJlbnQgZGVidWcgZXZlbnQgZnJvbQotCQkJCQkgICBXYWl0Rm9yRGVidWdFdmVudCAqLwotc3RhdGljIEhBTkRMRSBjdXJyZW50X3Byb2Nlc3NfaGFuZGxlOwkvKiBDdXJyZW50bHkgZXhlY3V0aW5nIHByb2Nlc3MgKi8KLXN0YXRpYyB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWQ7CS8qIEluZm8gb24gY3VycmVudGx5IHNlbGVjdGVkIHRocmVhZCAqLwotc3RhdGljIERXT1JEIG1haW5fdGhyZWFkX2lkOwkvKiBUaHJlYWQgSUQgb2YgdGhlIG1haW4gdGhyZWFkICovCi0KLS8qIENvdW50cyBvZiB0aGluZ3MuICovCi1zdGF0aWMgaW50IGV4Y2VwdGlvbl9jb3VudCA9IDA7Ci1zdGF0aWMgaW50IGV2ZW50X2NvdW50ID0gMDsKLQotLyogVXNlciBvcHRpb25zLiAqLwotc3RhdGljIGludCBuZXdfY29uc29sZSA9IDA7Ci1zdGF0aWMgaW50IG5ld19ncm91cCA9IDE7Ci1zdGF0aWMgaW50IGRlYnVnX2V4ZWMgPSAwOwkvKiBzaG93IGV4ZWN1dGlvbiAqLwotc3RhdGljIGludCBkZWJ1Z19ldmVudHMgPSAwOwkvKiBzaG93IGV2ZW50cyBmcm9tIGtlcm5lbCAqLwotc3RhdGljIGludCBkZWJ1Z19tZW1vcnkgPSAwOwkvKiBzaG93IHRhcmdldCBtZW1vcnkgYWNjZXNzZXMgKi8KLXN0YXRpYyBpbnQgZGVidWdfZXhjZXB0aW9ucyA9IDA7CS8qIHNob3cgdGFyZ2V0IGV4Y2VwdGlvbnMgKi8KLQotLyogVGhpcyB2ZWN0b3IgbWFwcyBHREIncyBpZGVhIG9mIGEgcmVnaXN0ZXIncyBudW1iZXIgaW50byBhbiBhZGRyZXNzCi0gICBpbiB0aGUgd2luMzIgZXhjZXB0aW9uIGNvbnRleHQgdmVjdG9yLgotCi0gICBJdCBhbHNvIGNvbnRhaW5zIHRoZSBiaXQgbWFzayBuZWVkZWQgdG8gbG9hZCB0aGUgcmVnaXN0ZXIgaW4gcXVlc3Rpb24uCi0KLSAgIE9uZSBkYXkgd2UgY291bGQgcmVhZCBhIHJlZywgd2UgY291bGQgaW5zcGVjdCB0aGUgY29udGV4dCB3ZQotICAgYWxyZWFkeSBoYXZlIGxvYWRlZCwgaWYgaXQgZG9lc24ndCBoYXZlIHRoZSBiaXQgc2V0IHRoYXQgd2UgbmVlZCwKLSAgIHdlIHJlYWQgdGhhdCBzZXQgb2YgcmVnaXN0ZXJzIGluIHVzaW5nIEdldFRocmVhZENvbnRleHQuICBJZiB0aGUKLSAgIGNvbnRleHQgYWxyZWFkeSBjb250YWlucyB3aGF0IHdlIG5lZWQsIHdlIGp1c3QgdW5wYWNrIGl0LiBUaGVuIHRvCi0gICB3cml0ZSBhIHJlZ2lzdGVyLCBmaXJzdCB3ZSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250ZXh0IGNvbnRhaW5zCi0gICB0aGUgb3RoZXIgcmVncyBvZiB0aGUgZ3JvdXAsIGFuZCB0aGVuIHdlIGNvcHkgdGhlIGluZm8gaW4gYW5kIHNldAotICAgb3V0IGJpdC4gKi8KLQotI2RlZmluZSBjb250ZXh0X29mZnNldCh4KSAoKGludCkmKCgoQ09OVEVYVCAqKU5VTEwpLT54KSkKLXN0YXRpYyBjb25zdCBpbnQgbWFwcGluZ3NbXSA9Ci17Ci0gIGNvbnRleHRfb2Zmc2V0IChFYXgpLAotICBjb250ZXh0X29mZnNldCAoRWN4KSwKLSAgY29udGV4dF9vZmZzZXQgKEVkeCksCi0gIGNvbnRleHRfb2Zmc2V0IChFYngpLAotICBjb250ZXh0X29mZnNldCAoRXNwKSwKLSAgY29udGV4dF9vZmZzZXQgKEVicCksCi0gIGNvbnRleHRfb2Zmc2V0IChFc2kpLAotICBjb250ZXh0X29mZnNldCAoRWRpKSwKLSAgY29udGV4dF9vZmZzZXQgKEVpcCksCi0gIGNvbnRleHRfb2Zmc2V0IChFRmxhZ3MpLAotICBjb250ZXh0X29mZnNldCAoU2VnQ3MpLAotICBjb250ZXh0X29mZnNldCAoU2VnU3MpLAotICBjb250ZXh0X29mZnNldCAoU2VnRHMpLAotICBjb250ZXh0X29mZnNldCAoU2VnRXMpLAotICBjb250ZXh0X29mZnNldCAoU2VnRnMpLAotICBjb250ZXh0X29mZnNldCAoU2VnR3MpLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVswICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbMSAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzIgKiAxMF0pLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVszICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbNCAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzUgKiAxMF0pLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVs2ICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbNyAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuQ29udHJvbFdvcmQpLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLlN0YXR1c1dvcmQpLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLlRhZ1dvcmQpLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLkVycm9yU2VsZWN0b3IpLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLkVycm9yT2Zmc2V0KSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5EYXRhU2VsZWN0b3IpLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLkRhdGFPZmZzZXQpLAotfTsKLQotLyogVGhpcyB2ZWN0b3IgbWFwcyB0aGUgdGFyZ2V0J3MgaWRlYSBvZiBhbiBleGNlcHRpb24gKGV4dHJhY3RlZAotICAgZnJvbSB0aGUgREVCVUdfRVZFTlQgc3RydWN0dXJlKSB0byBHREIncyBpZGVhLiAqLwotCi1zdHJ1Y3QgeGxhdGVfZXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgdGhlbTsKLSAgICBlbnVtIHRhcmdldF9zaWduYWwgdXM7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeGxhdGVfZXhjZXB0aW9uCi0gIHhsYXRlW10gPQotewotICB7RVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04sIFRBUkdFVF9TSUdOQUxfU0VHVn0sCi0gIHtTVEFUVVNfU1RBQ0tfT1ZFUkZMT1csIFRBUkdFVF9TSUdOQUxfU0VHVn0sCi0gIHtFWENFUFRJT05fQlJFQUtQT0lOVCwgVEFSR0VUX1NJR05BTF9UUkFQfSwKLSAge0RCR19DT05UUk9MX0MsIFRBUkdFVF9TSUdOQUxfSU5UfSwKLSAge0VYQ0VQVElPTl9TSU5HTEVfU1RFUCwgVEFSR0VUX1NJR05BTF9UUkFQfSwKLSAgey0xLCAtMX19OwotCi0vKiBGaW5kIGEgdGhyZWFkIHJlY29yZCBnaXZlbiBhIHRocmVhZCBpZC4KLSAgIElmIGdldF9jb250ZXh0IHRoZW4gYWxzbyByZXRyaWV2ZSB0aGUgY29udGV4dCBmb3IgdGhpcwotICAgdGhyZWFkLiAqLwotc3RhdGljIHRocmVhZF9pbmZvICoKLXRocmVhZF9yZWMgKERXT1JEIGlkLCBpbnQgZ2V0X2NvbnRleHQpCi17Ci0gIHRocmVhZF9pbmZvICp0aDsKLQotICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOyAodGggPSB0aC0+bmV4dCkgIT0gTlVMTDspCi0gICAgaWYgKHRoLT5pZCA9PSBpZCkKLSAgICAgIHsKLQlpZiAoIXRoLT5zdXNwZW5kX2NvdW50ICYmIGdldF9jb250ZXh0KQotCSAgewotCSAgICBpZiAoZ2V0X2NvbnRleHQgPiAwKQotCSAgICAgIHRoLT5zdXNwZW5kX2NvdW50ID0gU3VzcGVuZFRocmVhZCAodGgtPmgpICsgMTsKLQkgICAgZWxzZSBpZiAoZ2V0X2NvbnRleHQgPCAwKQotCSAgICAgIHRoLT5zdXNwZW5kX2NvdW50ID0gLTE7Ci0KLQkgICAgdGgtPmNvbnRleHQuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9ERUJVR0dFUjsKLQkgICAgR2V0VGhyZWFkQ29udGV4dCAodGgtPmgsICZ0aC0+Y29udGV4dCk7Ci0JICB9Ci0JcmV0dXJuIHRoOwotICAgICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBBZGQgYSB0aHJlYWQgdG8gdGhlIHRocmVhZCBsaXN0ICovCi1zdGF0aWMgdGhyZWFkX2luZm8gKgotY2hpbGRfYWRkX3RocmVhZCAoRFdPUkQgaWQsIEhBTkRMRSBoKQotewotICB0aHJlYWRfaW5mbyAqdGg7Ci0KLSAgaWYgKCh0aCA9IHRocmVhZF9yZWMgKGlkLCBGQUxTRSkpKQotICAgIHJldHVybiB0aDsKLQotICB0aCA9ICh0aHJlYWRfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKCp0aCkpOwotICBtZW1zZXQgKHRoLCAwLCBzaXplb2YgKCp0aCkpOwotICB0aC0+aWQgPSBpZDsKLSAgdGgtPmggPSBoOwotICB0aC0+bmV4dCA9IHRocmVhZF9oZWFkLm5leHQ7Ci0gIHRocmVhZF9oZWFkLm5leHQgPSB0aDsKLSAgYWRkX3RocmVhZCAoaWQpOwotICByZXR1cm4gdGg7Ci19Ci0KLS8qIENsZWFyIG91dCBhbnkgb2xkIHRocmVhZCBsaXN0IGFuZCByZWludGlhbGl6ZSBpdCB0byBhCi0gICBwcmlzdGluZSBzdGF0ZS4gKi8KLXN0YXRpYyB2b2lkCi1jaGlsZF9pbml0X3RocmVhZF9saXN0ICgpCi17Ci0gIHRocmVhZF9pbmZvICp0aCA9ICZ0aHJlYWRfaGVhZDsKLQotICBERUJVR19FVkVOVFMgKCgiZ2RiOiBjaGlsZF9pbml0X3RocmVhZF9saXN0XG4iKSk7Ci0gIGluaXRfdGhyZWFkX2xpc3QgKCk7Ci0gIHdoaWxlICh0aC0+bmV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHRocmVhZF9pbmZvICpoZXJlID0gdGgtPm5leHQ7Ci0gICAgICB0aC0+bmV4dCA9IGhlcmUtPm5leHQ7Ci0gICAgICAodm9pZCkgQ2xvc2VIYW5kbGUgKGhlcmUtPmgpOwotICAgICAgZnJlZSAoaGVyZSk7Ci0gICAgfQotfQotCi0vKiBEZWxldGUgYSB0aHJlYWQgZnJvbSB0aGUgbGlzdCBvZiB0aHJlYWRzICovCi1zdGF0aWMgdm9pZAotY2hpbGRfZGVsZXRlX3RocmVhZCAoRFdPUkQgaWQpCi17Ci0gIHRocmVhZF9pbmZvICp0aDsKLQotICBpZiAoaW5mb192ZXJib3NlKQotICAgIHByaW50Zl91bmZpbHRlcmVkICgiW0RlbGV0aW5nICVzXVxuIiwgdGFyZ2V0X3BpZF90b19zdHIgKGlkKSk7Ci0gIGRlbGV0ZV90aHJlYWQgKGlkKTsKLQotICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOwotICAgICAgIHRoLT5uZXh0ICE9IE5VTEwgJiYgdGgtPm5leHQtPmlkICE9IGlkOwotICAgICAgIHRoID0gdGgtPm5leHQpCi0gICAgY29udGludWU7Ci0KLSAgaWYgKHRoLT5uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgdGhyZWFkX2luZm8gKmhlcmUgPSB0aC0+bmV4dDsKLSAgICAgIHRoLT5uZXh0ID0gaGVyZS0+bmV4dDsKLSAgICAgIENsb3NlSGFuZGxlIChoZXJlLT5oKTsKLSAgICAgIGZyZWUgKGhlcmUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrIChCT09MIG9rLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgaWYgKCFvaykKLSAgICBwcmludGZfZmlsdGVyZWQgKCJlcnJvciByZXR1cm4gJXM6JWQgd2FzICVkXG4iLCBmaWxlLCBsaW5lLCBHZXRMYXN0RXJyb3IgKCkpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikKLXsKLSAgY2hhciAqY29udGV4dF9vZmZzZXQgPSAoKGNoYXIgKikgJmN1cnJlbnRfdGhyZWFkLT5jb250ZXh0KSArIG1hcHBpbmdzW3JdOwotICBsb25nIGw7Ci0gIGlmIChyID09IEZDU19SRUdOVU0pCi0gICAgewotICAgICAgbCA9ICooKGxvbmcgKiljb250ZXh0X29mZnNldCkgJiAweGZmZmY7Ci0gICAgICBzdXBwbHlfcmVnaXN0ZXIgKHIsIChjaGFyICopICZsKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHIgPT0gRk9QX1JFR05VTSkKLSAgICB7Ci0gICAgICBsID0gKCooKGxvbmcgKiljb250ZXh0X29mZnNldCkgPj4gMTYpICYgKCgxIDw8IDExKSAtIDEpOwotICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyLCAoY2hhciAqKSAmbCk7Ci0gICAgfQotICBlbHNlIGlmIChyID49IDApCi0gICAgc3VwcGx5X3JlZ2lzdGVyIChyLCAoKGNoYXIgKikgJmN1cnJlbnRfdGhyZWFkLT5jb250ZXh0KSArIG1hcHBpbmdzW3JdKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAociA9IDA7IHIgPCBOVU1fUkVHUzsgcisrKQotCWRvX2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikKLXsKLSAgY3VycmVudF90aHJlYWQgPSB0aHJlYWRfcmVjIChpbmZlcmlvcl9waWQsIFRSVUUpOwotICBkb19jaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikKLXsKLSAgaWYgKHIgPj0gMCkKLSAgICByZWFkX3JlZ2lzdGVyX2dlbiAociwgKChjaGFyICopICZjdXJyZW50X3RocmVhZC0+Y29udGV4dCkgKyBtYXBwaW5nc1tyXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKHIgPSAwOyByIDwgTlVNX1JFR1M7IHIrKykKLQlkb19jaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOwotICAgIH0KLX0KLQotLyogU3RvcmUgYSBuZXcgcmVnaXN0ZXIgdmFsdWUgaW50byB0aGUgY3VycmVudCB0aHJlYWQgY29udGV4dCAqLwotc3RhdGljIHZvaWQKLWNoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCi17Ci0gIGN1cnJlbnRfdGhyZWFkID0gdGhyZWFkX3JlYyAoaW5mZXJpb3JfcGlkLCBUUlVFKTsKLSAgZG9fY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKLX0KLQotI2luY2x1ZGUgPHBzYXBpLmg+Ci1zdGF0aWMgaW50IHBzYXBpX2xvYWRlZCA9IDA7Ci1zdGF0aWMgSE1PRFVMRSBwc2FwaV9tb2R1bGVfaGFuZGxlID0gTlVMTDsKLXN0YXRpYyBCT09MICBXSU5BUEkgKCpwc2FwaV9FbnVtUHJvY2Vzc01vZHVsZXMpKEhBTkRMRSwgSE1PRFVMRSosIERXT1JELCBMUERXT1JEKT0gTlVMTDsKLXN0YXRpYyBCT09MICBXSU5BUEkgKCpwc2FwaV9HZXRNb2R1bGVJbmZvcm1hdGlvbikgKEhBTkRMRSwgSE1PRFVMRSwgTFBNT0RVTEVJTkZPLCBEV09SRCk9IE5VTEw7Ci1zdGF0aWMgRFdPUkQgV0lOQVBJICgqcHNhcGlfR2V0TW9kdWxlRmlsZU5hbWVFeEEpIChIQU5ETEUsIEhNT0RVTEUsIExQU1RSLCBEV09SRCk9IE5VTEw7Ci0KLWludCBwc2FwaV9nZXRfZGxsX25hbWUgKERXT1JEIEJhc2VBZGRyZXNzLCBjaGFyICpkbGxfbmFtZV9yZXQpCi17Ci0gIERXT1JEIGxlbjsKLSAgTU9EVUxFSU5GTyBtaTsKLSAgaW50IGk7Ci0gIEhNT0RVTEUgZGhfYnVmIFsgMSBdOwotICBITU9EVUxFKiBEbGxIYW5kbGUgPSBkaF9idWY7Ci0gIERXT1JEIGNiTmVlZGVkOwotICBCT09MIG9rOwotCi0gIGlmICghcHNhcGlfbG9hZGVkIHx8Ci0gICAgICAgcHNhcGlfRW51bVByb2Nlc3NNb2R1bGVzICAgPT0gTlVMTCB8fAotICAgICAgIHBzYXBpX0dldE1vZHVsZUluZm9ybWF0aW9uID09IE5VTEwgfHwKLSAgICAgICBwc2FwaV9HZXRNb2R1bGVGaWxlTmFtZUV4QSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChwc2FwaV9sb2FkZWQpZ290byBmYWlsZWQ7Ci0gICAgICBwc2FwaV9sb2FkZWQgPSAxOwotICAgICAgcHNhcGlfbW9kdWxlX2hhbmRsZSA9IExvYWRMaWJyYXJ5ICgicHNhcGkuZGxsIik7Ci0gICAgICBpZiAoIXBzYXBpX21vZHVsZV9oYW5kbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBwcmludGZfdW5maWx0ZXJlZCAoImVycm9yIGxvYWRpbmcgcHNhcGkuZGxsOiAldSIsIEdldExhc3RFcnJvciAoKSk7Ki8KLSAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgcHNhcGlfRW51bVByb2Nlc3NNb2R1bGVzICAgPSBHZXRQcm9jQWRkcmVzcyAocHNhcGlfbW9kdWxlX2hhbmRsZSwgIkVudW1Qcm9jZXNzTW9kdWxlcyIgKTsKLSAgICAgIHBzYXBpX0dldE1vZHVsZUluZm9ybWF0aW9uID0gR2V0UHJvY0FkZHJlc3MgKHBzYXBpX21vZHVsZV9oYW5kbGUsICJHZXRNb2R1bGVJbmZvcm1hdGlvbiIpOwotICAgICAgcHNhcGlfR2V0TW9kdWxlRmlsZU5hbWVFeEEgPSAodm9pZCAqKSBHZXRQcm9jQWRkcmVzcyAocHNhcGlfbW9kdWxlX2hhbmRsZSwKLQkJCQkJCQkgICAgIkdldE1vZHVsZUZpbGVOYW1lRXhBIik7Ci0gICAgICBpZiAocHNhcGlfRW51bVByb2Nlc3NNb2R1bGVzICAgPT0gTlVMTCB8fAotICAgICAgICAgICBwc2FwaV9HZXRNb2R1bGVJbmZvcm1hdGlvbiA9PSBOVUxMIHx8Ci0gICAgICAgICAgIHBzYXBpX0dldE1vZHVsZUZpbGVOYW1lRXhBID09IE5VTEwpCi0JZ290byBmYWlsZWQ7Ci0gICAgfQotCi0gIGNiTmVlZGVkID0gMDsKLSAgb2sgPSAoKnBzYXBpX0VudW1Qcm9jZXNzTW9kdWxlcykgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkJICAgICBEbGxIYW5kbGUsCi0JCQkJICAgICBzaXplb2YgKEhNT0RVTEUpLAotCQkJCSAgICAgJmNiTmVlZGVkKTsKLQotICBpZiAoIW9rIHx8ICFjYk5lZWRlZCkKLSAgICBnb3RvIGZhaWxlZDsKLQotICBEbGxIYW5kbGUgPSAoSE1PRFVMRSopIGFsbG9jYSAoY2JOZWVkZWQpOwotICBpZiAoIURsbEhhbmRsZSkKLSAgICBnb3RvIGZhaWxlZDsKLQotICBvayA9ICgqcHNhcGlfRW51bVByb2Nlc3NNb2R1bGVzKSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCQkgICAgIERsbEhhbmRsZSwKLQkJCQkgICAgIGNiTmVlZGVkLAotCQkJCSAgICAgJmNiTmVlZGVkKTsKLSAgaWYgKCFvaykKLSAgICBnb3RvIGZhaWxlZDsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2JOZWVkZWQgLyBzaXplb2YgKEhNT0RVTEUpOyBpKyspCi0gICAgewotICAgICAgaWYgKCEoKnBzYXBpX0dldE1vZHVsZUluZm9ybWF0aW9uKSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCQkJICAgICBEbGxIYW5kbGUgW2ldLAotCQkJCQkgICAgICZtaSwKLQkJCQkJICAgICBzaXplb2YgKG1pKSkpCi0JZXJyb3IgKCJDYW4ndCBnZXQgbW9kdWxlIGluZm8iKTsKLQotICAgICAgbGVuID0gKCpwc2FwaV9HZXRNb2R1bGVGaWxlTmFtZUV4QSkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkJCSAgICBEbGxIYW5kbGUgW2ldLAotCQkJCQkgICAgZGxsX25hbWVfcmV0LAotCQkJCQkgICAgTUFYX1BBVEgpOwotICAgICAgaWYgKGxlbiA9PSAwKQotCWVycm9yICgiRXJyb3IgZ2V0dGluZyBkbGwgbmFtZTogJXVcbiIsIEdldExhc3RFcnJvciAoKSk7IAotCi0gICAgICBpZiAoKERXT1JEKSAobWkubHBCYXNlT2ZEbGwpID09IEJhc2VBZGRyZXNzKQotCXJldHVybiAxOwotICAgIH0KLQotZmFpbGVkOgotICBkbGxfbmFtZV9yZXRbMF0gPSAnXDAnOwotICByZXR1cm4gMDsKLX0KLQotLyogV2FpdCBmb3IgY2hpbGQgdG8gZG8gc29tZXRoaW5nLiAgUmV0dXJuIHBpZCBvZiBjaGlsZCwgb3IgLTEgaW4gY2FzZQotICAgb2YgZXJyb3I7IHN0b3JlIHN0YXR1cyB0aHJvdWdoIGFyZ3VtZW50IHBvaW50ZXIgT1VSU1RBVFVTLiAgKi8KLQotc3RhdGljIGludAotaGFuZGxlX2xvYWRfZGxsIChQVFIgZHVtbXkpCi17Ci0gIExPQURfRExMX0RFQlVHX0lORk8gKmV2ZW50ID0gJmN1cnJlbnRfZXZlbnQudS5Mb2FkRGxsOwotICBEV09SRCBkbGxfbmFtZV9wdHI7Ci0gIERXT1JEIGRvbmU7Ci0gIGNoYXIgZGxsX2J1ZltNQVhfUEFUSCArIDFdOwotICBjaGFyICpwLCAqZGxsX25hbWUgPSBOVUxMOwotICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKLSAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIG1pbmZvOwotICBzdHJ1Y3Qgc2VjdGlvbl9hZGRyX2luZm8gc2VjdGlvbl9hZGRyczsKLQotICBtZW1zZXQgKCZzZWN0aW9uX2FkZHJzLCAwLCBzaXplb2YgKHNlY3Rpb25fYWRkcnMpKTsKLSAgZGxsX2J1ZlswXSA9IGRsbF9idWZbc2l6ZW9mIChkbGxfYnVmKSAtIDFdID0gJ1wwJzsKLQotICBpZiAoIXBzYXBpX2dldF9kbGxfbmFtZSAoKERXT1JEKSAoZXZlbnQtPmxwQmFzZU9mRGxsKSwgZGxsX2J1ZikpCi0gICAgZGxsX2J1ZlswXSA9IGRsbF9idWZbc2l6ZW9mKGRsbF9idWYpIC0gMV0gPSAnXDAnOwotCi0gIGRsbF9uYW1lID0gZGxsX2J1ZjsKLQotICAvKiBBdHRlbXB0IHRvIHJlYWQgdGhlIG5hbWUgb2YgdGhlIGRsbCB0aGF0IHdhcyBkZXRlY3RlZC4KLSAgICAgVGhpcyBpcyBkb2N1bWVudGVkIHRvIHdvcmsgb25seSB3aGVuIGFjdGl2ZWx5IGRlYnVnZ2luZwotICAgICBhIHByb2dyYW0uICBJdCB3aWxsIG5vdCB3b3JrIGZvciBhdHRhY2hlZCBwcm9jZXNzZXMuICovCi0gIGlmIChkbGxfbmFtZSA9PSBOVUxMIHx8ICpkbGxfbmFtZSA9PSAnXDAnKQotICAgIHsKLSAgICAgIGludCBzaXplID0gZXZlbnQtPmZVbmljb2RlID8gc2l6ZW9mIChXQ0hBUikgOiBzaXplb2YgKGNoYXIpOwotICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICBjaGFyIGJbMl07Ci0KLSAgICAgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJIChMUENWT0lEKSBldmVudC0+bHBJbWFnZU5hbWUsCi0JCQkgKGNoYXIgKikgJmRsbF9uYW1lX3B0ciwKLQkJCSBzaXplb2YgKGRsbF9uYW1lX3B0ciksICZkb25lKTsKLQotICAgICAgLyogU2VlIGlmIHdlIGNvdWxkIHJlYWQgdGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcsIGFuZCB0aGF0IHRoZQotICAgICAgICAgYWRkcmVzcyBpc24ndCBudWxsLiAqLwotCi0gICAgICBpZiAoZG9uZSAhPSBzaXplb2YgKGRsbF9uYW1lX3B0cikgfHwgIWRsbF9uYW1lX3B0cikKLQlyZXR1cm4gMTsKLQotICAgICAgZG8KLQl7Ci0JICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCSAgICAgKExQQ1ZPSUQpIChkbGxfbmFtZV9wdHIgKyBsZW4gKiBzaXplKSwKLQkJCSAgICAgJmIsCi0JCQkgICAgIHNpemUsCi0JCQkgICAgICZkb25lKTsKLQkgIGxlbisrOwotCX0KLSAgICAgIHdoaWxlICgoYlswXSAhPSAwIHx8IGJbc2l6ZSAtIDFdICE9IDApICYmIGRvbmUgPT0gc2l6ZSk7Ci0KLSAgICAgIGRsbF9uYW1lID0gYWxsb2NhIChsZW4pOwotCi0gICAgICBpZiAoZXZlbnQtPmZVbmljb2RlKQotCXsKLQkgIFdDSEFSICp1bmljb2RlX2RsbF9uYW1lID0gKFdDSEFSICopIGFsbG9jYSAobGVuICogc2l6ZW9mIChXQ0hBUikpOwotCSAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkgICAgIChMUENWT0lEKSBkbGxfbmFtZV9wdHIsCi0JCQkgICAgIHVuaWNvZGVfZGxsX25hbWUsCi0JCQkgICAgIGxlbiAqIHNpemVvZiAoV0NIQVIpLAotCQkJICAgICAmZG9uZSk7Ci0KLQkgIFdpZGVDaGFyVG9NdWx0aUJ5dGUgKENQX0FDUCwgMCwKLQkJCSAgICAgICB1bmljb2RlX2RsbF9uYW1lLCBsZW4sCi0JCQkgICAgICAgZGxsX25hbWUsIGxlbiwgMCwgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJICAgICAoTFBDVk9JRCkgZGxsX25hbWVfcHRyLAotCQkJICAgICBkbGxfbmFtZSwKLQkJCSAgICAgbGVuLAotCQkJICAgICAmZG9uZSk7Ci0JfQotICAgIH0KLQotICBpZiAoIWRsbF9uYW1lKQotICAgIHJldHVybiAxOwotCi0gIHdoaWxlICgocCA9IHN0cmNociAoZGxsX25hbWUsICdcXCcpKSkKLSAgICAqcCA9ICcvJzsKLQotICAvKiBUaGUgc3ltYm9scyBpbiBhIGRsbCBhcmUgb2Zmc2V0IGJ5IDB4MTAwMCwgd2hpY2ggaXMgdGhlCi0gICAgIHRoZSBvZmZzZXQgZnJvbSAwIG9mIHRoZSBmaXJzdCBieXRlIGluIGFuIGltYWdlIC0gYmVjYXVzZQotICAgICBvZiB0aGUgZmlsZSBoZWFkZXIgYW5kIHRoZSBzZWN0aW9uIGFsaWdubWVudC4KLQotICAgICBGSVhNRTogSXMgdGhpcyB0aGUgcmVhbCByZWFzb24gdGhhdCB3ZSBuZWVkIHRoZSAweDEwMDAgPyAqLwotCi0gIHByaW50Zl91bmZpbHRlcmVkICgiJXg6JXMiLCBldmVudC0+bHBCYXNlT2ZEbGwsIGRsbF9uYW1lKTsKLSAgc2VjdGlvbl9hZGRycy50ZXh0X2FkZHIgPSAoaW50KSBldmVudC0+bHBCYXNlT2ZEbGwgKyAweDEwMDA7Ci0gIHN5bWJvbF9maWxlX2FkZCAoZGxsX25hbWUsIDAsICZzZWN0aW9uX2FkZHJzLCAwLCBPQkpGX1NIQVJFRCk7Ci0gIHByaW50Zl91bmZpbHRlcmVkICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogSGFuZGxlIERFQlVHX1NUUklORyBvdXRwdXQgZnJvbSBjaGlsZCBwcm9jZXNzLgotICAgQ3lnd2luIHByZXBlbmRzIGl0cyBtZXNzYWdlcyB3aXRoIGEgImN5Z3dpbjoiLiAgSW50ZXJwcmV0IHRoaXMgYXMKLSAgIGEgQ3lnd2luIHNpZ25hbC4gIE90aGVyd2lzZSBqdXN0IHByaW50IHRoZSBzdHJpbmcgYXMgYSB3YXJuaW5nLiAqLwotc3RhdGljIGludAotaGFuZGxlX291dHB1dF9kZWJ1Z19zdHJpbmcgKHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQotewotICBjaGFyICpzOwotICBpbnQgZ290YXNpZyA9IEZBTFNFOwotCi0gIGlmICghdGFyZ2V0X3JlYWRfc3RyaW5nCi0gICAgKChDT1JFX0FERFIpIGN1cnJlbnRfZXZlbnQudS5EZWJ1Z1N0cmluZy5scERlYnVnU3RyaW5nRGF0YSwgJnMsIDEwMjQsIDApCi0gICAgICB8fCAhcyB8fCAhKnMpCi0gICAgcmV0dXJuIGdvdGFzaWc7Ci0KLSAgaWYgKHN0cm5jbXAgKHMsIENZR1dJTl9TSUdOQUxfU1RSSU5HLCBzaXplb2YgKENZR1dJTl9TSUdOQUxfU1RSSU5HKSAtIDEpKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChzLCAiY1lnIiwgMykpCi0Jd2FybmluZyAocyk7Ci0gICAgfQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBpbnQgc2lnID0gc3RydG9sIChzICsgc2l6ZW9mIChDWUdXSU5fU0lHTkFMX1NUUklORykgLSAxLCAmcCwgMCk7Ci0gICAgICBnb3Rhc2lnID0gdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QgKHNpZyk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IGdvdGFzaWc7Ci0gICAgICBpZiAoZ290YXNpZykKLQlvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKLSAgICB9Ci0KLSAgZnJlZSAocyk7Ci0gIHJldHVybiBnb3Rhc2lnOwotfQotCi1zdGF0aWMgaW50Ci1oYW5kbGVfZXhjZXB0aW9uIChzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cykKLXsKLSAgaW50IGk7Ci0gIGludCBkb25lID0gMDsKLSAgdGhyZWFkX2luZm8gKnRoOwotCi0gIG91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOwotCi0gIC8qIFJlY29yZCB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB0aHJlYWQgKi8KLSAgdGggPSB0aHJlYWRfcmVjIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsIC0xKTsKLQotICBzd2l0Y2ggKGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUpCi0gICAgewotICAgIGNhc2UgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT046Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIEFDQ0VTU19WSU9MQVRJT04gYXQgMHglMDh4XG4iLAotCSAgICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfU0VHVjsKLSAgICAgIGNvbnRpbnVlX3N0YXR1cyA9IERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNUQVRVU19TVEFDS19PVkVSRkxPVzoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gU1RBQ0tfT1ZFUkZMT1cgYXQgMHglMDh4XG4iLAotCSAgICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfU0VHVjsKLSAgICAgIGNvbnRpbnVlX3N0YXR1cyA9IERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVYQ0VQVElPTl9CUkVBS1BPSU5UOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBCUkVBS1BPSU5UIGF0IDB4JTA4eFxuIiwKLQkgICAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERCR19DT05UUk9MX0M6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIENPTlRST0xfQyBhdCAweCUwOHhcbiIsCi0JICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTlQ7Ci0gICAgICBjb250aW51ZV9zdGF0dXMgPSBEQkdfRVhDRVBUSU9OX05PVF9IQU5ETEVEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFWENFUFRJT05fU0lOR0xFX1NURVA6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIFNJTkdMRV9TVEVQIGF0IDB4JTA4eFxuIiwKLQkgICAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhpcyBtYXkgYmUgYSBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyBleGNlcHRpb24uICBJbgotICAgICAgICAgdGhhdCBjYXNlLCB3ZSB3YW50IHRvIGxldCB0aGUgcHJvZ3JhbSB0cnkgdG8gaGFuZGxlIGl0LCBhbmQKLSAgICAgICAgIG9ubHkgYnJlYWsgaWYgd2Ugc2VlIHRoZSBleGNlcHRpb24gYSBzZWNvbmQgdGltZS4gICovCi0gICAgICBpZiAoY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5kd0ZpcnN0Q2hhbmNlKQotCXJldHVybiAwOwotCi0gICAgICBwcmludGZfdW5maWx0ZXJlZCAoImdkYjogdW5rbm93biB0YXJnZXQgZXhjZXB0aW9uIDB4JTA4eCBhdCAweCUwOHhcbiIsCi0JCSAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlLAotCQljdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9VTktOT1dOOwotICAgICAgY29udGludWVfc3RhdHVzID0gREJHX0VYQ0VQVElPTl9OT1RfSEFORExFRDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZXhjZXB0aW9uX2NvdW50Kys7Ci0gIHJldHVybiAxOwotfQotCi0vKiBSZXN1bWUgYWxsIGFydGlmaWNpYWxseSBzdXNwZW5kZWQgdGhyZWFkcyBpZiB3ZSBhcmUgY29udGludWluZwotICAgZXhlY3V0aW9uICovCi1zdGF0aWMgQk9PTAotY2hpbGRfY29udGludWUgKGludCBpZCkKLXsKLSAgaW50IGk7Ci0gIHRocmVhZF9pbmZvICp0aDsKLSAgQk9PTCByZXM7Ci0KLSAgREVCVUdfRVZFTlRTICgoIkNvbnRpbnVlRGVidWdFdmVudCAoY3BpZD0lZCwgY3RpZD0lZCwgREJHX0NPTlRJTlVFKTtcbiIsCi0JCSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQpKTsKLSAgcmVzID0gQ29udGludWVEZWJ1Z0V2ZW50IChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAotCQkJICAgIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICBjb250aW51ZV9zdGF0dXMpOwotICBjb250aW51ZV9zdGF0dXMgPSAwOwotICBpZiAocmVzKQotICAgIGZvciAodGggPSAmdGhyZWFkX2hlYWQ7ICh0aCA9IHRoLT5uZXh0KSAhPSBOVUxMOykKLSAgICAgIGlmICgoKGlkID09IC0xKSB8fCAoaWQgPT0gdGgtPmlkKSkgJiYgdGgtPnN1c3BlbmRfY291bnQpCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHRoLT5zdXNwZW5kX2NvdW50OyBpKyspCi0JICAgICh2b2lkKSBSZXN1bWVUaHJlYWQgKHRoLT5oKTsKLQkgIHRoLT5zdXNwZW5kX2NvdW50ID0gMDsKLQl9Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotZ2V0X2NoaWxkX2RlYnVnX2V2ZW50IChpbnQgcGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cywKLQkJICAgICAgIERXT1JEICpldmVudF9jb2RlLCBpbnQgKnJldHZhbCkKLXsKLSAgQk9PTCBkZWJ1Z19ldmVudDsKLSAgaW50IGJyZWFrb3V0ID0gMTsKLQotICBpZiAoIShkZWJ1Z19ldmVudCA9IFdhaXRGb3JEZWJ1Z0V2ZW50ICgmY3VycmVudF9ldmVudCwgMjApKSkKLSAgICB7Ci0gICAgICBicmVha291dCA9ICpyZXR2YWwgPSAqZXZlbnRfY29kZSA9IDA7Ci0gICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgZXZlbnRfY291bnQrKzsKLSAgY29udGludWVfc3RhdHVzID0gREJHX0NPTlRJTlVFOwotICAqcmV0dmFsID0gMDsKLQotICBzd2l0Y2ggKCpldmVudF9jb2RlID0gY3VycmVudF9ldmVudC5kd0RlYnVnRXZlbnRDb2RlKQotICAgIHsKLSAgICBjYXNlIENSRUFURV9USFJFQURfREVCVUdfRVZFTlQ6Ci0gICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JXggY29kZT0lcylcbiIsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJICAgICJDUkVBVEVfVEhSRUFEX0RFQlVHX0VWRU5UIikpOwotICAgICAgLyogUmVjb3JkIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyB0aHJlYWQgKi8KLSAgICAgIGNoaWxkX2FkZF90aHJlYWQgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCWN1cnJlbnRfZXZlbnQudS5DcmVhdGVUaHJlYWQuaFRocmVhZCk7Ci0gICAgICBpZiAoaW5mb192ZXJib3NlKQotCXByaW50Zl91bmZpbHRlcmVkICgiW05ldyAlc11cbiIsCi0JCSAgICAgIHRhcmdldF9waWRfdG9fc3RyIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFWElUX1RIUkVBRF9ERUJVR19FVkVOVDoKLSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkgICAgIkVYSVRfVEhSRUFEX0RFQlVHX0VWRU5UIikpOwotICAgICAgY2hpbGRfZGVsZXRlX3RocmVhZCAoY3VycmVudF9ldmVudC5kd1RocmVhZElkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVDoKLSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkgICAgIkNSRUFURV9QUk9DRVNTX0RFQlVHX0VWRU5UIikpOwotICAgICAgY3VycmVudF9wcm9jZXNzX2hhbmRsZSA9IGN1cnJlbnRfZXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oUHJvY2VzczsKLQotICAgICAgbWFpbl90aHJlYWRfaWQgPSBpbmZlcmlvcl9waWQgPSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQ7Ci0gICAgICAvKiBBZGQgdGhlIG1haW4gdGhyZWFkICovCi0gICAgICBjdXJyZW50X3RocmVhZCA9IGNoaWxkX2FkZF90aHJlYWQgKGluZmVyaW9yX3BpZCwKLQkJCSBjdXJyZW50X2V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8uaFRocmVhZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVhJVF9QUk9DRVNTX0RFQlVHX0VWRU5UOgotICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAotCQkgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCSAgICAiRVhJVF9QUk9DRVNTX0RFQlVHX0VWRU5UIikpOwotICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IGN1cnJlbnRfZXZlbnQudS5FeGl0UHJvY2Vzcy5kd0V4aXRDb2RlOwotICAgICAgQ2xvc2VIYW5kbGUgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUpOwotICAgICAgKnJldHZhbCA9IGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQ7Ci0gICAgICBnb3RvIG91dDsKLQotICAgIGNhc2UgTE9BRF9ETExfREVCVUdfRVZFTlQ6Ci0gICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJICAgICJMT0FEX0RMTF9ERUJVR19FVkVOVCIpKTsKLSAgICAgIGNhdGNoX2Vycm9ycyAoaGFuZGxlX2xvYWRfZGxsLCBOVUxMLCAiIiwgUkVUVVJOX01BU0tfQUxMKTsKLSAgICAgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOwkvKiBtYXJrIGFsbCByZWdzIGludmFsaWQgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBVTkxPQURfRExMX0RFQlVHX0VWRU5UOgotICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAotCQkgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCSAgICAiVU5MT0FEX0RMTF9ERUJVR19FVkVOVCIpKTsKLSAgICAgIGJyZWFrOwkJLyogRklYTUU6IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlICovCi0KLSAgICBjYXNlIEVYQ0VQVElPTl9ERUJVR19FVkVOVDoKLSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkgICAgIkVYQ0VQVElPTl9ERUJVR19FVkVOVCIpKTsKLSAgICAgIGlmIChoYW5kbGVfZXhjZXB0aW9uIChvdXJzdGF0dXMpKQkvKiBzZXRzIGNvbnRpbnVlX3N0YXR1cyAqLwotCXsKLQkgICpyZXR2YWwgPSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQ7Ci0JICBnb3RvIG91dDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1VUUFVUX0RFQlVHX1NUUklOR19FVkVOVDoKLSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkgICAgIk9VVFBVVF9ERUJVR19TVFJJTkdfRVZFTlQiKSk7Ci0gICAgICBpZiAoaGFuZGxlX291dHB1dF9kZWJ1Z19zdHJpbmcgKG91cnN0YXR1cykpCi0JewotCSAgKnJldHZhbCA9IG1haW5fdGhyZWFkX2lkOwotCSAgZ290byBvdXQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWRcbiIsCi0JCQkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJCSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQpOwotICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIgICAgICAgICAgICAgICAgIHVua25vd24gZXZlbnQgY29kZSAlZFxuIiwKLQkJCSBjdXJyZW50X2V2ZW50LmR3RGVidWdFdmVudENvZGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGJyZWFrb3V0ID0gMDsKLSAgQ0hFQ0sgKGNoaWxkX2NvbnRpbnVlICgtMSkpOwotICBjb250aW51ZV9zdGF0dXMgPSAwOwotCi1vdXQ6Ci0gIHJldHVybiBicmVha291dDsKLX0KLQotCi0vKiBXYWl0IGZvciBpbnRlcmVzdGluZyBldmVudHMgdG8gb2NjdXIgaW4gdGhlIHRhcmdldCBwcm9jZXNzLiAqLwotc3RhdGljIGludAotY2hpbGRfd2FpdCAoaW50IHBpZCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCi17Ci0gIERXT1JEIGV2ZW50X2NvZGU7Ci0gIGludCByZXR2YWw7Ci0KLSAgLyogV2UgbG9vcCB3aGVuIHdlIGdldCBhIG5vbi1zdGFuZGFyZCBleGNlcHRpb24gcmF0aGVyIHRoYW4gcmV0dXJuCi0gICAgIHdpdGggYSBTUFVSSU9VUyBiZWNhdXNlIHJlc3VtZSBjYW4gdHJ5IGFuZCBzdGVwIG9yIG1vZGlmeSB0aGluZ3MsCi0gICAgIHdoaWNoIG5lZWRzIGEgY3VycmVudF90aHJlYWQtPmguICBCdXQgc29tZSBvZiB0aGVzZSBleGNlcHRpb25zIG1hcmsKLSAgICAgdGhlIGJpcnRoIG9yIGRlYXRoIG9mIHRocmVhZHMsIHdoaWNoIG1lYW4gdGhhdCB0aGUgY3VycmVudCB0aHJlYWQKLSAgICAgaXNuJ3QgbmVjZXNzYXJpbHkgd2hhdCB5b3UgdGhpbmsgaXQgaXMuICovCi0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKGNvbnRpbnVlX3N0YXR1cyAhPSAwKQotCUNIRUNLIChjaGlsZF9jb250aW51ZSAoLTEpKTsKLSAgICAgIGlmIChnZXRfY2hpbGRfZGVidWdfZXZlbnQgKHBpZCwgb3Vyc3RhdHVzLCAmZXZlbnRfY29kZSwgJnJldHZhbCkpCi0JcmV0dXJuIHJldHZhbDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgZGV0YWNoID0gMDsKLQotCSAgaWYgKHVpX2xvb3BfaG9vayAhPSBOVUxMKQotCSAgICBkZXRhY2ggPSB1aV9sb29wX2hvb2sgKDApOwotCi0JICBpZiAoZGV0YWNoKQotCSAgICBjaGlsZF9raWxsX2luZmVyaW9yICgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEF0dGFjaCB0byBwcm9jZXNzIFBJRCwgdGhlbiBpbml0aWFsaXplIGZvciBkZWJ1Z2dpbmcgaXQuICAqLwotCi1zdGF0aWMgdm9pZAotY2hpbGRfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKLSAgICAgY2hhciAqYXJnczsKLSAgICAgaW50IGZyb21fdHR5OwotewotICBCT09MIG9rOwotCi0gIGlmICghYXJncykKLSAgICBlcnJvcl9ub19hcmcgKCJwcm9jZXNzLWlkIHRvIGF0dGFjaCIpOwotCi0gIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQgPSBzdHJ0b3VsIChhcmdzLCAwLCAwKTsKLQotICBvayA9IERlYnVnQWN0aXZlUHJvY2VzcyAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCk7Ci0KLSAgaWYgKCFvaykKLSAgICBlcnJvciAoIkNhbid0IGF0dGFjaCB0byBwcm9jZXNzLiIpOwotCi0gIGV4Y2VwdGlvbl9jb3VudCA9IDA7Ci0gIGV2ZW50X2NvdW50ID0gMDsKLQotICBpZiAoZnJvbV90dHkpCi0gICAgewotICAgICAgY2hhciAqZXhlY19maWxlID0gKGNoYXIgKikgZ2V0X2V4ZWNfZmlsZSAoMCk7Ci0KLSAgICAgIGlmIChleGVjX2ZpbGUpCi0JcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gcHJvZ3JhbSBgJXMnLCAlc1xuIiwgZXhlY19maWxlLAotCQkJICAgdGFyZ2V0X3BpZF90b19zdHIgKGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpKTsKLSAgICAgIGVsc2UKLQlwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyB0byAlc1xuIiwKLQkJCSAgIHRhcmdldF9waWRfdG9fc3RyIChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKSk7Ci0KLSAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7Ci0gICAgfQotCi0gIHB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX2RldGFjaCAoYXJncywgZnJvbV90dHkpCi0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgaWYgKGZyb21fdHR5KQotICAgIHsKLSAgICAgIGNoYXIgKmV4ZWNfZmlsZSA9IGdldF9leGVjX2ZpbGUgKDApOwotICAgICAgaWYgKGV4ZWNfZmlsZSA9PSAwKQotCWV4ZWNfZmlsZSA9ICIiOwotICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJEZXRhY2hpbmcgZnJvbSBwcm9ncmFtOiAlcyAlc1xuIiwgZXhlY19maWxlLAotCQkJIHRhcmdldF9waWRfdG9fc3RyIChpbmZlcmlvcl9waWQpKTsKLSAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7Ci0gICAgfQotICBpbmZlcmlvcl9waWQgPSAwOwotICB1bnB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLX0KLQotLyogUHJpbnQgc3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgd2UncmUgYWNjZXNzaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoaWxkX2ZpbGVzX2luZm8gKGlnbm9yZSkKLSAgICAgc3RydWN0IHRhcmdldF9vcHMgKmlnbm9yZTsKLXsKLSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdFVzaW5nIHRoZSBydW5uaW5nIGltYWdlIG9mICVzICVzLlxuIiwKLSAgICAgIGF0dGFjaF9mbGFnID8gImF0dGFjaGVkIiA6ICJjaGlsZCIsIHRhcmdldF9waWRfdG9fc3RyIChpbmZlcmlvcl9waWQpKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1jaGlsZF9vcGVuIChhcmcsIGZyb21fdHR5KQotICAgICBjaGFyICphcmc7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgZXJyb3IgKCJVc2UgdGhlIFwicnVuXCIgY29tbWFuZCB0byBzdGFydCBhIFVuaXggY2hpbGQgcHJvY2Vzcy4iKTsKLX0KLQotLyogU3RhcnQgYW4gaW5mZXJpb3Igd2luMzIgY2hpbGQgcHJvY2VzcyBhbmQgc2V0cyBpbmZlcmlvcl9waWQgdG8gaXRzIHBpZC4KLSAgIEVYRUNfRklMRSBpcyB0aGUgZmlsZSB0byBydW4uCi0gICBBTExBUkdTIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbS4KLSAgIEVOViBpcyB0aGUgZW52aXJvbm1lbnQgdmVjdG9yIHRvIHBhc3MuICBFcnJvcnMgcmVwb3J0ZWQgd2l0aCBlcnJvcigpLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoaWxkX2NyZWF0ZV9pbmZlcmlvciAoZXhlY19maWxlLCBhbGxhcmdzLCBlbnYpCi0gICAgIGNoYXIgKmV4ZWNfZmlsZTsKLSAgICAgY2hhciAqYWxsYXJnczsKLSAgICAgY2hhciAqKmVudjsKLXsKLSAgY2hhciByZWFsX3BhdGhbTUFYUEFUSExFTl07Ci0gIGNoYXIgKndpbmVudjsKLSAgY2hhciAqdGVtcDsKLSAgaW50IGVudmxlbjsKLSAgaW50IGk7Ci0gIFNUQVJUVVBJTkZPIHNpOwotICBQUk9DRVNTX0lORk9STUFUSU9OIHBpOwotICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgZHVtbXk7Ci0gIEJPT0wgcmV0OwotICBEV09SRCBmbGFnczsKLSAgY2hhciAqYXJnczsKLSAgRFdPUkQgZXZlbnRfY29kZTsKLQotICBpZiAoIWV4ZWNfZmlsZSkKLSAgICB7Ci0gICAgICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgc3BlY2lmaWVkLCB1c2UgYHRhcmdldCBleGVjJy5cbiIpOwotICAgIH0KLQotICBtZW1zZXQgKCZzaSwgMCwgc2l6ZW9mIChzaSkpOwotICBzaS5jYiA9IHNpemVvZiAoc2kpOwotCi0gIGN5Z3dpbjMyX2NvbnZfdG9fd2luMzJfcGF0aCAoZXhlY19maWxlLCByZWFsX3BhdGgpOwotCi0gIGZsYWdzID0gREVCVUdfT05MWV9USElTX1BST0NFU1M7Ci0KLSAgaWYgKG5ld19ncm91cCkKLSAgICBmbGFncyB8PSBDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVA7Ci0KLSAgaWYgKG5ld19jb25zb2xlKQotICAgIGZsYWdzIHw9IENSRUFURV9ORVdfQ09OU09MRTsKLQotICBhcmdzID0gYWxsb2NhIChzdHJsZW4gKHJlYWxfcGF0aCkgKyBzdHJsZW4gKGFsbGFyZ3MpICsgMik7Ci0KLSAgc3RyY3B5IChhcmdzLCByZWFsX3BhdGgpOwotCi0gIHN0cmNhdCAoYXJncywgIiAiKTsKLSAgc3RyY2F0IChhcmdzLCBhbGxhcmdzKTsKLQotICAvKiBQcmVwYXJlIHRoZSBlbnZpcm9ubWVudCB2YXJzIGZvciBDcmVhdGVQcm9jZXNzLiAgKi8KLSAgewotICAgIC8qIFRoaXMgY29kZSB1c2UgdG8gYXNzdW1lIGFsbCBlbnYgdmFycyB3ZXJlIGZpbGUgbmFtZXMgYW5kIHdvdWxkCi0gICAgICAgdHJhbnNsYXRlIHRoZW0gYWxsIHRvIHdpbjMyIHN0eWxlLiAgVGhhdCBvYnZpb3VzbHkgZG9lc24ndCB3b3JrIGluIHRoZQotICAgICAgIGdlbmVyYWwgY2FzZS4gIFRoZSBjdXJyZW50IHJ1bGUgaXMgdGhhdCB3ZSBvbmx5IHRyYW5zbGF0ZSBQQVRILgotICAgICAgIFdlIG5lZWQgdG8gaGFuZGxlIFBBVEggYmVjYXVzZSB3ZSdyZSBhYm91dCB0byBjYWxsIENyZWF0ZVByb2Nlc3MgYW5kCi0gICAgICAgaXQgdXNlcyBQQVRIIHRvIGZpbmQgRExMJ3MuICBGb3J0dW5hdGVseSBQQVRIIGhhcyBhIHdlbGwtZGVmaW5lZCB2YWx1ZQotICAgICAgIGluIGJvdGggcG9zaXggYW5kIHdpbjMyIGVudmlyb25tZW50cy4gIGN5Z3dpbi5kbGwgd2lsbCBjaGFuZ2UgaXQgYmFjawotICAgICAgIHRvIHBvc2l4IHN0eWxlIGlmIG5lY2Vzc2FyeS4gICovCi0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29udl9wYXRoX25hbWVzW10gPQotICAgIHsKLSAgICAgICJQQVRIPSIsCi0gICAgICAwCi0gICAgfTsKLQotICAgIC8qIENyZWF0ZVByb2Nlc3MgdGFrZXMgdGhlIGVudmlyb25tZW50IGxpc3QgYXMgYSBudWxsIHRlcm1pbmF0ZWQgc2V0IG9mCi0gICAgICAgc3RyaW5ncyAoaS5lLiB0d28gbnVsbHMgdGVybWluYXRlIHRoZSBsaXN0KS4gICovCi0KLSAgICAvKiBHZXQgdG90YWwgc2l6ZSBmb3IgZW52IHN0cmluZ3MuICAqLwotICAgIGZvciAoZW52bGVuID0gMCwgaSA9IDA7IGVudltpXSAmJiAqZW52W2ldOyBpKyspCi0gICAgICB7Ci0JaW50IGosIGxlbjsKLQotCWZvciAoaiA9IDA7IGNvbnZfcGF0aF9uYW1lc1tqXTsgaisrKQotCSAgewotCSAgICBsZW4gPSBzdHJsZW4gKGNvbnZfcGF0aF9uYW1lc1tqXSk7Ci0JICAgIGlmIChzdHJuY21wIChjb252X3BhdGhfbmFtZXNbal0sIGVudltpXSwgbGVuKSA9PSAwKQotCSAgICAgIHsKLQkJaWYgKGN5Z3dpbjMyX3Bvc2l4X3BhdGhfbGlzdF9wIChlbnZbaV0gKyBsZW4pKQotCQkgIGVudmxlbiArPSBsZW4KLQkJICAgICsgY3lnd2luMzJfcG9zaXhfdG9fd2luMzJfcGF0aF9saXN0X2J1Zl9zaXplIChlbnZbaV0gKyBsZW4pOwotCQllbHNlCi0JCSAgZW52bGVuICs9IHN0cmxlbiAoZW52W2ldKSArIDE7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQlpZiAoY29udl9wYXRoX25hbWVzW2pdID09IE5VTEwpCi0JICBlbnZsZW4gKz0gc3RybGVuIChlbnZbaV0pICsgMTsKLSAgICAgIH0KLQotICAgIHdpbmVudiA9IGFsbG9jYSAoZW52bGVuICsgMSk7Ci0KLSAgICAvKiBDb3B5IGVudiBzdHJpbmdzIGludG8gbmV3IGJ1ZmZlci4gICovCi0gICAgZm9yICh0ZW1wID0gd2luZW52LCBpID0gMDsgZW52W2ldICYmICplbnZbaV07IGkrKykKLSAgICAgIHsKLQlpbnQgaiwgbGVuOwotCi0JZm9yIChqID0gMDsgY29udl9wYXRoX25hbWVzW2pdOyBqKyspCi0JICB7Ci0JICAgIGxlbiA9IHN0cmxlbiAoY29udl9wYXRoX25hbWVzW2pdKTsKLQkgICAgaWYgKHN0cm5jbXAgKGNvbnZfcGF0aF9uYW1lc1tqXSwgZW52W2ldLCBsZW4pID09IDApCi0JICAgICAgewotCQlpZiAoY3lnd2luMzJfcG9zaXhfcGF0aF9saXN0X3AgKGVudltpXSArIGxlbikpCi0JCSAgewotCQkgICAgbWVtY3B5ICh0ZW1wLCBlbnZbaV0sIGxlbik7Ci0JCSAgICBjeWd3aW4zMl9wb3NpeF90b193aW4zMl9wYXRoX2xpc3QgKGVudltpXSArIGxlbiwgdGVtcCArIGxlbik7Ci0JCSAgfQotCQllbHNlCi0JCSAgc3RyY3B5ICh0ZW1wLCBlbnZbaV0pOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKGNvbnZfcGF0aF9uYW1lc1tqXSA9PSBOVUxMKQotCSAgc3RyY3B5ICh0ZW1wLCBlbnZbaV0pOwotCi0JdGVtcCArPSBzdHJsZW4gKHRlbXApICsgMTsKLSAgICAgIH0KLQotICAgIC8qIEZpbmFsIG5pbCBzdHJpbmcgdG8gdGVybWluYXRlIG5ldyBlbnYuICAqLwotICAgICp0ZW1wID0gMDsKLSAgfQotCi0gIHJldCA9IENyZWF0ZVByb2Nlc3MgKDAsCi0JCSAgICAgICBhcmdzLAkvKiBjb21tYW5kIGxpbmUgKi8KLQkJICAgICAgIE5VTEwsCS8qIFNlY3VyaXR5ICovCi0JCSAgICAgICBOVUxMLAkvKiB0aHJlYWQgKi8KLQkJICAgICAgIFRSVUUsCS8qIGluaGVyaXQgaGFuZGxlcyAqLwotCQkgICAgICAgZmxhZ3MsCS8qIHN0YXJ0IGZsYWdzICovCi0JCSAgICAgICB3aW5lbnYsCi0JCSAgICAgICBOVUxMLAkvKiBjdXJyZW50IGRpcmVjdG9yeSAqLwotCQkgICAgICAgJnNpLAotCQkgICAgICAgJnBpKTsKLSAgaWYgKCFyZXQpCi0gICAgZXJyb3IgKCJFcnJvciBjcmVhdGluZyBwcm9jZXNzICVzLCAoZXJyb3IgJWQpXG4iLCBleGVjX2ZpbGUsIEdldExhc3RFcnJvciAoKSk7Ci0KLSAgZXhjZXB0aW9uX2NvdW50ID0gMDsKLSAgZXZlbnRfY291bnQgPSAwOwotCi0gIGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUgPSBwaS5oUHJvY2VzczsKLSAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCA9IHBpLmR3UHJvY2Vzc0lkOwotICBtZW1zZXQgKCZjdXJyZW50X2V2ZW50LCAwLCBzaXplb2YgKGN1cnJlbnRfZXZlbnQpKTsKLSAgaW5mZXJpb3JfcGlkID0gY3VycmVudF9ldmVudC5kd1RocmVhZElkID0gcGkuZHdUaHJlYWRJZDsKLSAgcHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOwotICBjaGlsZF9pbml0X3RocmVhZF9saXN0ICgpOwotICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOwotICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKLSAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7Ci0gIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKLQotICAvKiBSdW4gdW50aWwgcHJvY2VzcyBhbmQgdGhyZWFkcyBhcmUgbG9hZGVkICovCi0gIGRvCi0gICAgZ2V0X2NoaWxkX2RlYnVnX2V2ZW50IChpbmZlcmlvcl9waWQsICZkdW1teSwgJmV2ZW50X2NvZGUsICZyZXQpOwotICB3aGlsZSAoZXZlbnRfY29kZSAhPSBFWENFUFRJT05fREVCVUdfRVZFTlQpOwotCi0gIHByb2NlZWQgKChDT1JFX0FERFIpIC0gMSwgVEFSR0VUX1NJR05BTF8wLCAwKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX21vdXJuX2luZmVyaW9yICgpCi17Ci0gIGNvbnRpbnVlX3N0YXR1cyA9IERCR19DT05USU5VRTsKLSAgKHZvaWQpIGNoaWxkX2NvbnRpbnVlICgtMSk7Ci0gIHVucHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOwotICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOwotfQotCi0vKiBTZW5kIGEgU0lHSU5UIHRvIHRoZSBwcm9jZXNzIGdyb3VwLiAgVGhpcyBhY3RzIGp1c3QgbGlrZSB0aGUgdXNlciB0eXBlZCBhCi0gICBeQyBvbiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuICovCi0KLXN0YXRpYyB2b2lkCi1jaGlsZF9zdG9wICgpCi17Ci0gIERFQlVHX0VWRU5UUyAoKCJnZGI6IEdlbmVyYXRlQ29uc29sZUN0cmxFdmVudCAoQ1RSTENfRVZFTlQsIDApXG4iKSk7Ci0gIENIRUNLIChHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQgKENUUkxfQ19FVkVOVCwgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCkpOwotICByZWdpc3RlcnNfY2hhbmdlZCAoKTsJCS8qIHJlZnJlc2ggcmVnaXN0ZXIgc3RhdGUgKi8KLX0KLQotaW50Ci1jaGlsZF94ZmVyX21lbW9yeSAoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm91ciwgaW50IGxlbiwKLQkJICAgaW50IHdyaXRlLCBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KQotewotICBEV09SRCBkb25lOwotICBpZiAod3JpdGUpCi0gICAgewotICAgICAgREVCVUdfTUVNICgoImdkYjogd3JpdGUgdGFyZ2V0IG1lbW9yeSwgJWQgYnl0ZXMgYXQgMHglMDh4XG4iLAotCQkgIGxlbiwgbWVtYWRkcikpOwotICAgICAgV3JpdGVQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBWT0lEKSBtZW1hZGRyLCBvdXIsCi0JCQkgIGxlbiwgJmRvbmUpOwotICAgICAgRmx1c2hJbnN0cnVjdGlvbkNhY2hlIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBDVk9JRCkgbWVtYWRkciwgbGVuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBERUJVR19NRU0gKCgiZ2RiOiByZWFkIHRhcmdldCBtZW1vcnksICVkIGJ5dGVzIGF0IDB4JTA4eFxuIiwKLQkJICBsZW4sIG1lbWFkZHIpKTsKLSAgICAgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBDVk9JRCkgbWVtYWRkciwgb3VyLCBsZW4sCi0JCQkgJmRvbmUpOwotICAgIH0KLSAgcmV0dXJuIGRvbmU7Ci19Ci0KLXZvaWQKLWNoaWxkX2tpbGxfaW5mZXJpb3IgKHZvaWQpCi17Ci0gIENIRUNLIChUZXJtaW5hdGVQcm9jZXNzIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAwKSk7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjb250aW51ZV9zdGF0dXMgPSBEQkdfQ09OVElOVUU7Ci0gICAgICBpZiAoIWNoaWxkX2NvbnRpbnVlICgtMSkpCi0JYnJlYWs7Ci0gICAgICBpZiAoIVdhaXRGb3JEZWJ1Z0V2ZW50ICgmY3VycmVudF9ldmVudCwgSU5GSU5JVEUpKQotCWJyZWFrOwotICAgICAgaWYgKGN1cnJlbnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSA9PSBFWElUX1BST0NFU1NfREVCVUdfRVZFTlQpCi0JYnJlYWs7Ci0gICAgfQotCi0gIENIRUNLIChDbG9zZUhhbmRsZSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSkpOwotCi0gIC8qIHRoaXMgbWF5IGZhaWwgaW4gYW4gYXR0YWNoZWQgcHJvY2VzcyBzbyBkb24ndCBjaGVjay4gKi8KLSAgKHZvaWQpIENsb3NlSGFuZGxlIChjdXJyZW50X3RocmVhZC0+aCk7Ci0gIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsJLyogb3IganVzdCBjaGlsZF9tb3Vybl9pbmZlcmlvcj8gKi8KLX0KLQotdm9pZAotY2hpbGRfcmVzdW1lIChpbnQgcGlkLCBpbnQgc3RlcCwgZW51bSB0YXJnZXRfc2lnbmFsIHNpZykKLXsKLSAgaW50IGk7Ci0gIHRocmVhZF9pbmZvICp0aDsKLQotICBERUJVR19FWEVDICgoImdkYjogY2hpbGRfcmVzdW1lIChwaWQ9JWQsIHN0ZXA9JWQsIHNpZz0lZCk7XG4iLAotCSAgICAgICBwaWQsIHN0ZXAsIHNpZykpOwotCi0gIC8qIEdldCBjb250ZXh0IGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgdGhyZWFkICovCi0gIHRoID0gdGhyZWFkX3JlYyAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLCBGQUxTRSk7Ci0gIGlmIChzdGVwKQotICAgIHsKLSNpZmRlZiBpMzg2Ci0gICAgICAvKiBTaW5nbGUgc3RlcCBieSBzZXR0aW5nIHQgYml0ICovCi0gICAgICBjaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKFBTX1JFR05VTSk7Ci0gICAgICB0aC0+Y29udGV4dC5FRmxhZ3MgfD0gRkxBR19UUkFDRV9CSVQ7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKHRoLT5jb250ZXh0LkNvbnRleHRGbGFncykKLSAgICB7Ci0gICAgICBDSEVDSyAoU2V0VGhyZWFkQ29udGV4dCAodGgtPmgsICZ0aC0+Y29udGV4dCkpOwotICAgICAgdGgtPmNvbnRleHQuQ29udGV4dEZsYWdzID0gMDsKLSAgICB9Ci0KLSAgLyogQWxsb3cgY29udGludWluZyB3aXRoIHRoZSBzYW1lIHNpZ25hbCB0aGF0IGludGVycnVwdGVkIHVzLgotICAgICBPdGhlcndpc2UgY29tcGxhaW4uICovCi0KLSAgY2hpbGRfY29udGludWUgKHBpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9wcmVwYXJlX3RvX3N0b3JlICgpCi17Ci0gIC8qIERvIG5vdGhpbmcsIHNpbmNlIHdlIGNhbiBzdG9yZSBpbmRpdmlkdWFsIHJlZ3MgKi8KLX0KLQotc3RhdGljIGludAotY2hpbGRfY2FuX3J1biAoKQotewotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX2Nsb3NlICgpCi17Ci0gIERFQlVHX0VWRU5UUyAoKCJnZGI6IGNoaWxkX2Nsb3NlLCBpbmZlcmlvcl9waWQ9JWRcbiIsIGluZmVyaW9yX3BpZCkpOwotfQotCi1zdHJ1Y3QgdGFyZ2V0X29wcyBjaGlsZF9vcHM7Ci0KLXN0YXRpYyB2b2lkCi1pbml0X2NoaWxkX29wcyAodm9pZCkKLXsKLSAgY2hpbGRfb3BzLnRvX3Nob3J0bmFtZSA9ICJjaGlsZCI7Ci0gIGNoaWxkX29wcy50b19sb25nbmFtZSA9ICJXaW4zMiBjaGlsZCBwcm9jZXNzIjsKLSAgY2hpbGRfb3BzLnRvX2RvYyA9ICJXaW4zMiBjaGlsZCBwcm9jZXNzIChzdGFydGVkIGJ5IHRoZSBcInJ1blwiIGNvbW1hbmQpLiI7Ci0gIGNoaWxkX29wcy50b19vcGVuID0gY2hpbGRfb3BlbjsKLSAgY2hpbGRfb3BzLnRvX2Nsb3NlID0gY2hpbGRfY2xvc2U7Ci0gIGNoaWxkX29wcy50b19hdHRhY2ggPSBjaGlsZF9hdHRhY2g7Ci0gIGNoaWxkX29wcy50b19kZXRhY2ggPSBjaGlsZF9kZXRhY2g7Ci0gIGNoaWxkX29wcy50b19yZXN1bWUgPSBjaGlsZF9yZXN1bWU7Ci0gIGNoaWxkX29wcy50b193YWl0ID0gY2hpbGRfd2FpdDsKLSAgY2hpbGRfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyA9IGNoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVyczsKLSAgY2hpbGRfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyA9IGNoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVyczsKLSAgY2hpbGRfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSBjaGlsZF9wcmVwYXJlX3RvX3N0b3JlOwotICBjaGlsZF9vcHMudG9feGZlcl9tZW1vcnkgPSBjaGlsZF94ZmVyX21lbW9yeTsKLSAgY2hpbGRfb3BzLnRvX2ZpbGVzX2luZm8gPSBjaGlsZF9maWxlc19pbmZvOwotICBjaGlsZF9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQ7Ci0gIGNoaWxkX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9IG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludDsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luaXQgPSB0ZXJtaW5hbF9pbml0X2luZmVyaW9yOwotICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSB0ZXJtaW5hbF9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9IHRlcm1pbmFsX291cnNfZm9yX291dHB1dDsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX291cnMgPSB0ZXJtaW5hbF9vdXJzOwotICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5mbyA9IGNoaWxkX3Rlcm1pbmFsX2luZm87Ci0gIGNoaWxkX29wcy50b19raWxsID0gY2hpbGRfa2lsbF9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX2xvYWQgPSAwOwotICBjaGlsZF9vcHMudG9fbG9va3VwX3N5bWJvbCA9IDA7Ci0gIGNoaWxkX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSBjaGlsZF9jcmVhdGVfaW5mZXJpb3I7Ci0gIGNoaWxkX29wcy50b19tb3Vybl9pbmZlcmlvciA9IGNoaWxkX21vdXJuX2luZmVyaW9yOwotICBjaGlsZF9vcHMudG9fY2FuX3J1biA9IGNoaWxkX2Nhbl9ydW47Ci0gIGNoaWxkX29wcy50b19ub3RpY2Vfc2lnbmFscyA9IDA7Ci0gIGNoaWxkX29wcy50b190aHJlYWRfYWxpdmUgPSB3aW4zMl9jaGlsZF90aHJlYWRfYWxpdmU7Ci0gIGNoaWxkX29wcy50b19zdG9wID0gY2hpbGRfc3RvcDsKLSAgY2hpbGRfb3BzLnRvX3N0cmF0dW0gPSBwcm9jZXNzX3N0cmF0dW07Ci0gIGNoaWxkX29wcy5ET05UX1VTRSA9IDA7Ci0gIGNoaWxkX29wcy50b19oYXNfYWxsX21lbW9yeSA9IDE7Ci0gIGNoaWxkX29wcy50b19oYXNfbWVtb3J5ID0gMTsKLSAgY2hpbGRfb3BzLnRvX2hhc19zdGFjayA9IDE7Ci0gIGNoaWxkX29wcy50b19oYXNfcmVnaXN0ZXJzID0gMTsKLSAgY2hpbGRfb3BzLnRvX2hhc19leGVjdXRpb24gPSAxOwotICBjaGlsZF9vcHMudG9fc2VjdGlvbnMgPSAwOwotICBjaGlsZF9vcHMudG9fc2VjdGlvbnNfZW5kID0gMDsKLSAgY2hpbGRfb3BzLnRvX21hZ2ljID0gT1BTX01BR0lDOwotfQotCi12b2lkCi1faW5pdGlhbGl6ZV9pbmZ0YXJnICgpCi17Ci0gIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOwotICBpbml0X2NoaWxkX29wcyAoKTsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoIm5ldy1jb25zb2xlIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJm5ld19jb25zb2xlLAotCQkgICJTZXQgY3JlYXRpb24gb2YgbmV3IGNvbnNvbGUgd2hlbiBjcmVhdGluZyBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgibmV3LWdyb3VwIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJm5ld19ncm91cCwKLQkJICAiU2V0IGNyZWF0aW9uIG9mIG5ldyBncm91cCB3aGVuIGNyZWF0aW5nIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V4ZWMiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmZGVidWdfZXhlYywKLQkJICAiU2V0IHdoZXRoZXIgdG8gZGlzcGxheSBleGVjdXRpb24gaW4gY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoImRlYnVnZXZlbnRzIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJmRlYnVnX2V2ZW50cywKLQkJICAiU2V0IHdoZXRoZXIgdG8gZGlzcGxheSBrZXJuZWwgZXZlbnRzIGluIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z21lbW9yeSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZkZWJ1Z19tZW1vcnksCi0JCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkgbWVtb3J5IGFjY2Vzc2VzIGluIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V4Y2VwdGlvbnMiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmZGVidWdfZXhjZXB0aW9ucywKLQkgICAgICAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkga2VybmVsIGV4Y2VwdGlvbnMgaW4gY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLX0KLQotLyogRGV0ZXJtaW5lIGlmIHRoZSB0aHJlYWQgcmVmZXJlbmNlZCBieSAicGlkIiBpcyBhbGl2ZQotICAgYnkgInBvbGxpbmciIGl0LiAgSWYgV2FpdEZvclNpbmdsZU9iamVjdCByZXR1cm5zIFdBSVRfT0JKRUNUXzAKLSAgIGl0IG1lYW5zIHRoYXQgdGhlIHBpZCBoYXMgZGllZC4gIE90aGVyd2lzZSBpdCBpcyBhc3N1bWVkIHRvIGJlIGFsaXZlLiAqLwotc3RhdGljIGludAotd2luMzJfY2hpbGRfdGhyZWFkX2FsaXZlIChpbnQgcGlkKQotewotICByZXR1cm4gV2FpdEZvclNpbmdsZU9iamVjdCAodGhyZWFkX3JlYyAocGlkLCBGQUxTRSktPmgsIDApID09IFdBSVRfT0JKRUNUXzAgPwotICAgIEZBTFNFIDogVFJVRTsKLX0KLQotLyogQ29udmVydCBwaWQgdG8gcHJpbnRhYmxlIGZvcm1hdC4gKi8KLWNoYXIgKgotY3lnd2luX3BpZF90b19zdHIgKGludCBwaWQpCi17Ci0gIHN0YXRpYyBjaGFyIGJ1Zls4MF07Ci0gIGlmIChwaWQgPT0gY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCkKLSAgICBzcHJpbnRmIChidWYsICJwcm9jZXNzICVkIiwgcGlkKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGJ1ZiwgInRocmVhZCAlZC4weCV4IiwgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgcGlkKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLSNpZmRlZiBOT1RZRVQKLUNPUkVfQUREUgotd2luMzJfcmVhZF9mcCAoKQotewotICBTVEFDS0ZSQU1FICpzZiA9IGN1cnJlbnRfdGhyZWFkLT5zZjsKLSAgCi0gIG1lbXNldCAoJnNmLCAwLCBzaXplb2Yoc2YpKTsKLSAgc2YtPkFkZHJQQy5PZmZzZXQgPSBjdXJyZW50X3RocmVhZC0+Y29udGV4dC5FaXA7Ci0gIHNmLT5BZGRyUEMuTW9kZSA9IEFkZHJNb2RlRmxhdDsKLSAgc2YtPkFkZHJTdGFjay5PZmZzZXQgPSBjdXJyZW50X3RocmVhZC0+Y29udGV4dC5Fc3A7Ci0gIHNmLT5BZGRyU3RhY2suTW9kZSA9IEFkZHJNb2RlRmxhdDsKLSAgc2YtPkFkZHJGcmFtZS5PZmZzZXQgPSBjdXJyZW50X3RocmVhZC0+Y29udGV4dC5FYnA7Ci0gIGlmICghU3RhY2tXYWxrIChJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NiwgY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJICBjdXJyZW50LT50aHJlYWQtPmgsIHNmLCBOVUxMLCBOVUxMLAotCQkgIFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3MsIFN5bUdldE1vZHVsZUJhc2UsIE5VTEwpKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gKENPUkVfQUREUikgc2YuQWRkckZyYW1lLk9mZnNldDsKLX0KLQotQ09SRV9BRERSCi1jaGlsZF9mcmFtZV9jaGFpbihzdHJ1Y3QgZnJhbWVfaW5mbyAqdGhpc2ZyYW1lKQotewotICBTVEFDS0ZSQU1FICpzZiA9IGN1cnJlbnQtPnRocmVhZC0+c2Y7Ci0jaWYgMAotICBzZi5BZGRyUEMuT2Zmc2V0ID0gdGhpc2ZyYW1lLT5wYzsKLSAgc2YuQWRkclBDLk1vZGUgPSBBZGRyTW9kZUZsYXQ7Ci0gIHNmLkFkZHJTdGFjay5PZmZzZXQgPSB0aGlzZnJhbWUtPjsKLSAgc2YuQWRkclN0YWNrLk1vZGUgPSBBZGRyTW9kZUZsYXQ7Ci0gIHNmLkFkZHJGcmFtZS5PZmZzZXQgPSBjeC0+RWJwOwotI2VuZGlmCi0gIGlmICghU3RhY2tXYWxrIChJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NiwgY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJICBjdXJyZW50LT50aHJlYWQtPmgsICZzZiwgTlVMTCwgTlVMTCwKLQkJICBTeW1GdW5jdGlvblRhYmxlQWNjZXNzLCBTeW1HZXRNb2R1bGVCYXNlLCBOVUxMKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIChDT1JFX0FERFIpIHNmLT5BZGRyRnJhbWUuT2Zmc2V0OwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9ncHJvZi8uZ2RiaW5pdCBiL2dwcm9mLy5nZGJpbml0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTE5NDcyLi4wMDAwMDAwCi0tLSBhL2dwcm9mLy5nZGJpbml0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZGlyIC4uCmRpZmYgLS1naXQgYS9ncHJvZi9DaGFuZ2VMb2cgYi9ncHJvZi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNWU5ZjQuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MyArMCwwIEBACi0xOTk5LTA5LTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiBNYWtlIHN1cmUgdGhhdCBzZW5zaWJsZSB2YWx1ZXMKLQlhcmUgZXh0cmFjdGVkIGZyb20gYSByYXcgaGVhZGVyLgotCi0xOTk5LTA4LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gQnJhZCBMdWNpZXIgPGx1Y2llckBtYXRoLnB1cmR1ZS5lZHU+OgotCSogY29yZWZpbGUuYyAoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogQWRkIGNhc3QgZm9yIHByaW50Zi4KLQotMTk5OS0wNy0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIE1hcmsgRWxicmVjaHQ6Ci0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCi0xOTk5LTA3LTE1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuOS41LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29yZWZpbGUuYyAoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IEFkZCBBVFRSSUJVVEVEX1VOVVNFRC4KLQkqIHN5bS1pZHMuYyAobm9uX2V4aXN0ZW50X2ZpbGUpOiBGdWxseSBpbml0aWFsaXplIHN0cnVjdHVyZS4KLQotMTk5OS0wNy0wMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZCBjYXN0cyBpbiBtYW55IHByaW50IHN0YXRlbWVudHMgdG8gY2FzdCBiZmRfdm1hCi0JdmFsdWVzIHRvIHVuc2lnbmVkIGxvbmcgd2hlbiBjYWxsaW5nIHByaW50Zi4KLQkqIE1ha2VmaWxlLmFtICgkKE9CSkVDVFMpKTogQWRkIGdtb24uaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVuIDE0IDEwOjM1OjI4IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZ3Byb2YudGV4aTogRml4IHR5cG8uCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBCb2IgQnlybmVzIDxieXJuZXNAY3VybC5jb20+OgotCSogY2dfZGZuLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIgotCShERk5fSU5DUl9ERVBUSCk6IERlZmluZSBpbnN0ZWFkIG9mIERGTl9ERVBUSC4KLQkoZGZuX3N0YWNrKTogRGVmaW5lIGFzIHBvaW50ZXIgcmF0aGVyIHRoYW4gYXJyYXkuCi0JKHByZV92aXNpdCk6IFJlYWxsb2NhdGUgZGZuX3N0YWNrIGFzIG5lZWRlZC4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBncHJvZi5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQkqIGdwcm9mLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUKLQlzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIGl0LgotCi0xOTk5LTA0LTA1ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvcmVmaWxlLmMgKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IERvbid0IHVzZSBmaXhlZCBzaXplIGFycmF5Ci0JZm9yIHByZXZfbmFtZSBhbmQgcHJldl9maWxlbmFtZS4KLQotMTk5OS0wNC0wNCAgTWljaGFlbCBIb2htdXRoICA8aG9obXV0aEBpbm5vY2VudC5jb20+Ci0KLQkqIGdwcm9mLmggKEZGX0JTRDQ0KTogRGVmaW5lLgotCSogZ21vbi5oIChzdHJ1Y3QgcmF3X3BoZHIpOiBBZGQgdmVyc2lvbiwgcHJvZnJhdGUsIGFuZCBzcGFyZQotCWZpZWxkcyB1bmNvbmRpdGlvbmFsbHkuCi0JKHN0cnVjdCBvbGRfcmF3X3BoZHIpOiBOZXcgc3RydWN0LgotCSogZ3Byb2YuYyAobWFpbik6IEhhbmRsZSAtTyA0LjRic2QuCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiBIYW5kbGUgQlNEIDQuNCBmb3JtYXQsIGVpdGhlcgotCWF1dG9tYXRpY2FsbHkgb3IgYnkgdXNlciBzcGVjaWZpY2F0aW9uLgotCShnbW9uX291dF93cml0ZSk6IEhhbmRsZSBCU0QgNC40IGZvcm1hdC4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IEJTRDQ0X0ZPUk1BVC4KLQkqIGdwcm9mLnRleGkgKE1pc2NlbGxhbmVvdXMgT3B0aW9ucyk6IERvY3VtZW50IC1PIDQuNGJzZC4KLQkqIGNvbmZpZ3VyZSwgZ2NvbmZpZy5pbjogUmVidWlsZC4KLQotVHVlIEZlYiAxNiAxNzowMTozMyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgQ2hhbmdlIEFNX1BST0dfSU5TVEFMTAotCXRvIEFDX1BST0dfSU5TVEFMTC4gIFJlbW92ZSBBTV9DWUdXSU4zMi4gIENoYW5nZSBBTV9FWEVFWFQgdG8KLQlBQ19FWEVFWFQuICBBZGQgY29tbWVudCB0byBBQ19ERUZJTkUuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBnY29uZmlnLmluOiBSZWJ1aWxkLgotCi1TdW4gRGVjICA2IDIxOjU3OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YudGV4aSAoU3ltc3BlY3MpOiBNZW50aW9uIHRoYXQgeW91IGhhdmUgdG8gYWRkIGFueQotCXVuZGVyc2NvcmUgeW91cnNlbGYgd2hlbiBuYW1pbmcgYSBzeW1ib2wuCi0KLU1vbiBOb3YgIDIgMTU6MDU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLSAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotV2VkIEF1ZyAxMiAxNDo1OTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBdm9pZCBzb21lIG92ZXJmbG93IGNhc2VzOgotCSogYmFzaWNfYmxvY2tzLmggKGJiX21pbl9jYWxscyk6IENoYW5nZSB0byB1bnNpZ25lZCBsb25nLgotCSogY2FsbF9ncmFwaC5oIChjZ190YWxseSk6IENoYW5nZSBjb3VudCBwYXJhbWV0ZXIgdG8gdW5zaWduZWQKLQlsb25nLgotCSogY2dfYXJjcy5oIChBcmMpOiBDaGFuZ2UgY291bnQgZmllbGQgdG8gdW5zaWduZWQgbG9uZy4KLQkoYXJjX2FkZCk6IENoYW5nZSBjb3VudCBwYXJhbWV0ZXIgdG8gdW5zaWduZWQgbG9uZy4KLQkqIHNvdXJjZS5oIChTb3VyY2VfRmlsZSk6IENoYW5nZSBuY2FsbHMgZmllbGQgdG8gdW5zaWduZWQgbG9uZy4KLQkqIHN5bXRhYi5oIChTeW0pOiBDaGFuZ2UgZmllbGRzIG5jYWxscywgYmJfY2FsbHMsIGFuZAotCWNnLnNlbGZfY2FsbHMgdG8gdW5zaWduZWQgbG9uZy4KLQkqIE1hbnkgZmlsZXM6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGN1cnJlbnQgdG9vbHMuCi0KLUZyaSBKdWwgMTAgMTc6Mjk6NDkgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChCU0Q0NF9GT1JNQVQpOiBEZWZpbmUgZm9yIGN5Z3dpbjMyLCB3aW4zMiwgbWluZ3czMgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDEyIDEzOjQwOjA1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KLQkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgotCi1TdW4gTWF5IDEwIDIyOjM1OjMzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotVHVlIE1heSAgNSAxODoyODo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmggKF8pOiBVbmRlZmluZSBCRkQncyB2ZXJzaW9uLgotCi1UdWUgQXByIDI4IDE5OjE3OjMzIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAobWFpbik6IENvbmRpdGlvbmFsbHkgY2FsbCBzZXRsb2NhbGUuCi0JKiBncHJvZi5oOiBJbmNsdWRlIDxsb2NhbGUuaD4gaWYgSEFWRV9MT0NBTEVfSC4KLQkoTENfTUVTU0FHRVMpOiBOb3cgY2FuIGJlIGRlZmluZWQgZXZlbiB3aGVuIEVOQUJMRV9OTFMuCi0KLVR1ZSBBcHIgMjggMTk6NTA6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb3JlZmlsZS5jOiBSZW5hbWUgZnJvbSBjb3JlLmMuCi0JKiBjb3JlZmlsZS5oOiBSZW5hbWUgZnJvbSBjb3JlLmguCi0JKiBNYW55IC5jIGZpbGVzOiBJbmNsdWRlIGNvcmVmaWxlLmggcmF0aGVyIHRoYW4gY29yZS5oLgotCSogTWFrZWZpbGUuYW0gKHNvdXJjZXMpOiBDaGFuZ2UgY29yZS5jIHRvIGNvcmVmaWxlLmMuCi0JKG5vaW5zdF9IRUFERVJTKTogQ2hhbmdlIGNvcmUuaCB0byBjb3JlZmlsZS5oLgotCSgkKE9CSkVDVFMpKTogRGVwZW5kIHVwb24gY29yZWZpbGUuaCByYXRoZXIgdGhhbiBjb3JlLmguCi0JKGNvcmVmaWxlLm8pOiBSZW5hbWUgdGFyZ2V0IGZyb20gY29yZS5vLCBkZXBlbmQgdXBvbiBjb3JlZmlsZS5jLgotCSogTWFrZWZpbGUuaW4sIHBvL1BPVEZJTEVTLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByIDI3IDE2OjUwOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEFwciAyMiAxNjowMToxNyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCi0KLVdlZCBBcHIgMjIgMDA6MDA6MjIgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBzY3JpYmJsZXMuY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuaDogQWRkZWQgaW5jbHVkZXMgYW5kIGRlZmluZXMgZm9yIGdldHRleHQuCi0JKiBjb25maWd1cmUuaW4gKEFMTF9MSU5HVUFTKTogTmV3IG1hY3JvLgotCUNhbGwgQ1lfR05VX0dFVFRFWFQuICBDcmVhdGUgcG8vTWFrZWZpbGUuaW4gYW5kIHBvL01ha2VmaWxlLgotCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAotCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCi0JKiBncHJvZi5jIChtYWluKTogQ2FsbCBzZXRsb2NhbGUsIGJpbmR0ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBOZXcgbWFjcm8uCi0JKElOQ0xVREVTKTogTG9vayBpbiBpbnRsIGRpcnMgZm9yIGhlYWRlcnMuICBEZWZpbmUgTE9DQUxFRElSLgotCShncHJvZl9ERVBFTkRFTkNJRVMpOiBBZGRlZCBJTlRMREVQUy4KLQkoZ3Byb2ZfTERBREQpOiBBZGRlZCBJTlRMTExJQlMuCi0JKFBPVEZJTEVTKTogTmV3IG1hY3JvLgotCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCi0JKiBNYW55IGZpbGVzOiBXcmFwIHVzZXItdmlzaWJsZSBzdHJpbmdzIHdpdGggZ2V0dGV4dCBpbnZvY2F0aW9uLgotCi1UdWUgQXByICA3IDEyOjQzOjM3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gaGpsQGx1Y29uLm9yZyA8SC5KLiBMdT46Ci0JKiBNYWtlZmlsZS5hbSAoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMwIDEyOjQ3OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi1TYXQgTWFyIDI4IDIzOjA5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIGNnX2FyY3MuYyAobnVtX2N5Y2xlcyk6IENoYW5nZSB0byB1bnNpZ25lZCBpbnQuCi0JKG51bWFyY3MpOiBMaWtld2lzZS4KLQkoYXJjX2FkZCk6IENoYW5nZSBtYXhhcmNzIHRvIHVuc2lnbmVkIGludC4KLQkoY2dfYXNzZW1ibGUpOiBDaGFuZ2UgaW5kZXggdG8gdW5zaWduZWQgaW50LgotCSogY2dfYXJjcy5oIChudW1fY3ljbGVzLCBudW1hcmNzKTogVXBkYXRlIGRlY2xhcmF0aW9ucy4KLQkqIGNnX3ByaW50LmMgKGNnX3ByaW50KTogQ2hhbmdlIGluZGV4IHRvIHVuc2lnbmVkIGludC4KLQkoY2dfcHJpbnRfaW5kZXgpOiBDaGFuZ2UgaW5kZXgsIG5uYW1lcywgdG9kbywgaSwgYW5kIGogdG8gdW5zaWduZWQKLQlpbnQuCi0JKGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcpOiBDaGFuZ2Ugc3ltYm9sX2NvdW50IGFuZCBpbmRleDIgdG8KLQl1bnNpZ25lZCBpbnQuCi0JKiBjb3JlLmMgKHN5bWJvbF9tYXBfY291bnQpOiBDaGFuZ2UgdG8gdW5zaWduZWQgaW50LgotCShjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgotCShjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSogaGlzdC5jIChoaXN0X2Fzc2lnbl9zYW1wbGVzKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgotCShoaXN0X3ByaW50KTogQ2hhbmdlIGluZGV4IHRvIHVuc2lnbmVkIGkgbnQuICBBZGQgY2FzdCB0byBhdm9pZAotCXdhcm5pbmcuCi0JKiBzeW1faWRzLmMgKHBhcnNlX3NwZWMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZy4KLQkqIHN5bXRhYi5jIChzeW10YWJfZmluYWxpemUpOiBDaGFuZ2UgaiB0byB1bnNpZ25lZCBpbnQuCi0JKHN5bV9sb29rdXApOiBVcGRhdGUgcHJpbnRmIGZvcm1hdCBzdHJpbmdzLgotCSogc3ltdGFiLmggKFN5bV9UYWJsZSk6IENoYW5nZSBsZW4gdG8gdW5zaWduZWQgaW50LgotCSogdGFob2UuYyAodGFob2VfcmVsYWRkcik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotVHVlIE1hciAyNCAxOTowMDoxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgLS1kZW1hbmdsZSBhbmQgLS1uby1kZW1hbmdsZSBvcHRpb25zOgotCSogZ3Byb2YuaCAoZGVtYW5nbGUpOiBEZWNsYXJlLgotCSogZ3Byb2YuYyAoZGVtYW5nbGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShPUFRJT05fREVNQU5HTEUsIE9QVElPTl9OT19ERU1BTkdMRSk6IERlZmluZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkZW1hbmdsZSIgYW5kICJuby1kZW1hbmdsZSIuCi0JKHVzYWdlKTogTWVudGlvbiAtLWRlbWFuZ2xlIGFuZCAtLW5vLWRlbWFuZ2xlLgotCShtYWluKTogSGFuZGxlIE9QVElPTl9ERU1BTkdMRSBhbmQgT1BUSU9OX05PX0RFTUFOR0xFLgotCSogdXRpbHMuYyAocHJpbnRfbmFtZV9vbmx5KTogT25seSBkZW1hbmdsZSBzeW1ib2wgbmFtZSBpZiBkZW1hbmdsZQotCWlzIHRydWUuCi0JKiBncHJvZi50ZXhpIChPdXRwdXQgT3B0aW9ucyk6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi1GcmkgTWFyIDIwIDE5OjIxOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVRodSBGZWIgMTIgMTQ6MzY6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBncHJvZi5jICh1c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0KLVNhdCBGZWIgIDcgMTU6NDM6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotRnJpIEZlYiAgNiAxMjowMjoyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmMgKGFscGhhX0luc3RydWN0aW9uKTogVXNlIGludCwgbm90IHNpZ25lZC4KLQotRnJpIEZlYiAgNiAwMjowMDoxOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvcmUuYyAoY29yZV9pbml0KTogQWRkaW5nIG1pc3NpbmcgImJyZWFrIi4KLQotVGh1IEZlYiAgNSAxMjo0OTozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVHVlIEZlYiAgMyAxNDoyNToyNSAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+Ci0KLQkqIGJiY29udi5wbDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBiYmNvbnYucGwuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogZ3Byb2YudGV4aTogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBkb2N1bWVudCBhbGwgYXJndW1lbnRzIGFuZAotCW91dHB1dCBmb3JtYXRzLgotCi0JKiBzeW10YWIuYyAoc3ltdGFiX2ZpbmFsaXplKTogUHJlZmVyIGZ1bmN0aW9uIHN5bWJvbHMgb3ZlciBsaW5lCi0Jc3ltYm9scy4KLQkoZGJnX3N5bV9sb29rdXApOiBDb3JyZWN0IGRlYnVnZ2luZyBtZXNzYWdlcy4KLQotCSogZ3Byb2YuYyAobWFpbik6IC0tc3VtIGltcGxpZXMgLS1saW5lLgotCi0JKiBjZ19wcmludC5jIChjZ19wcmludCk6IFdoZW4gZG9pbmcgbGluZSBieSBsaW5lIHByb2ZpbGluZywgZG9uJ3QKLQl1c2UgYSBub24tZnVuY3Rpb24gYXMgYSBtYWluIGxpc3RpbmcgaXRlbS4KLQotCSogY2FsbF9ncmFwaC5jIChjZ190YWxseSk6IFdoZW4gdXNpbmcgbGluZSBieSBsaW5lIHByb2ZpbGluZywgdXNlCi0gCXRoZSBmdW5jdGlvbiBzeW1ib2wgYXMgdGhlIGNoaWxkLgotCi0JKiBzeW10YWIuaCAoTkJCUyk6IERlZmluZS4KLQkoU3ltKTogQWRkIGJiX2FkZHIgYW5kIGJiX2NhbGxzIGZpZWxkcy4KLQkqIGJhc2ljX2Jsb2Nrcy5jIChiYl9yZWFkX3JlYyk6IFNhdmUgbXVsdGlwbGUgYmFzaWMgYmxvY2tzIHBlcgotCXN5bWJvbC4KLQkoYmJfd3JpdGVfYmxvY2tzKTogQWRqdXN0IGZvciBtdWx0aXBsZSBiYXNpYyBibG9ja3MgcGVyIHN5bWJvbC4KLQkocHJpbnRfZXhlY19jb3VudHMpOiBEb24ndCBjaGVjayB3aGV0aGVyIGEgc3ltYm9sIGlzIHRoZSBzdGFydCBvZgotCWEgYmFzaWMgYmxvY2suICBQcmludCBhbGwgYmFzaWMgYmxvY2tzIGZvciBhIHN5bWJvbC4KLQkoYW5ub3RhdGVfd2l0aF9jb3VudCk6IFJld3JpdGUgdG8gcHJpbnQgYWxsIGJhc2ljIGJsb2NrIGNvdW50cyBhbmQKLQl0byBwYXkgYXR0ZW50aW9uIHRvIHdpZHRoIGFyZ3VtZW50LgotCShwcmludF9hbm5vdGF0ZWRfc291cmNlKTogRG9uJ3QgY2hlY2sgd2hldGhlciBzeW1ib2wgaXMgdGhlIHN0YXJ0Ci0Jb2YgYSBiYXNpYyBibG9jay4KLQotCU1ha2UgaXQgcG9zc2libGUgdG8gYnVpbGQgYSBjcm9zcyBncHJvZiwgYWx0aG91Z2ggYSBmZXcgY2FzZXMgYXJlCi0Jc3RpbGwgbm90IGhhbmRsZWQ6Ci0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBNWV9UQVJHRVQuCi0JKiBncHJvZi5oOiBEb24ndCBpbmNsdWRlIE1BQ0hJTkVfSC4gIERvbid0IGRlZmluZSBGT1BFTl9SQiBvcgotCUZPUEVOX1dCOyBqdXN0IGdldCB0aGVtIGZyb20gc3lzZGVwLmguCi0JKiBjb3JlLmggKG1pbl9pbnNuX3NpemUsIG9mZnNldF90b19jb2RlKTogRGVjbGFyZS4KLQkqIGNvcmUuYyAoTUlOX0lOU05fU0laRSk6IERvbid0IGRlZmluZS4KLQkobWluX2luc25fc2l6ZSwgb2Zmc2V0X3RvX2NvZGUpOiBOZXcgdmFyaWFibGVzLgotCShjb3JlX2luaXQpOiBJbml0aWFsaXplIG1pbl9pbnNuX3NpemUgYW5kIG9mZnNldF90b19jb2RlLgotCShmaW5kX2NhbGwpOiBOZXcgZnVuY3Rpb24uCi0JKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IERvbid0IHVzZSBtaW5fZGlzdC4gIFNldCBpc19zdGF0aWMgaW4KLQlwYXNzIDIuCi0JKiBoaXN0LmMgKFVOSVRTX1RPX0NPREUpOiBEZWZpbmUuCi0JKiBncHJvZi5jIChkZWZhdWx0X2V4Y2x1ZGVkX2xpc3QpOiBBZGQgIl9fbWNvdW50X2ludGVybmFsIi4KLQkqIGdtb24uaDogQ2hhbmdlIFRBUkdFVF9hbHBoYSB0byBfX2FscGhhX18uCi0JKiBoZXJ0ei5oOiBJZmRlZiBNQUNILCBkZWZpbmUgaGVydHogYXMgSFouCi0JKiBhbHBoYS5jIChhbHBoYV9JbnN0cnVjdGlvbik6IFJlbmFtZSBmcm9tIEluc3RydWN0aW9uLiAgQ2hhbmdlCi0JYWxsIHJlZmVyZW5jZXMuCi0JKGFscGhhX2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4KLQkqIGFscGhhLmg6IFJlbW92ZS4KLQkqIGR1bW15LmMsIGR1bW15Lmg6IFJlbW92ZS4KLQkqIGkzODYuYyAoaTM4Nl9pc2NhbGwpOiBSZW5hbWUgZnJvbSBpc2NhbGwuICBDaGFuZ2UgYWxsCi0JcmVmZXJlbmNlcy4gIENoZWNrIGZvciBjYWxsIGluc3RydWN0aW9uLCBub3QganVtcCBvciBsY2FsbC4KLQkoaTM4Nl9maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuICBDb3JyZWN0IGZvciBWTUEuCi0JQ29ycmVjdCBjYWxsIGRlc3RpbmF0aW9uIGNvbXB1dGF0aW9uLiAgRG9uJ3QgZGVyZWZlcmVuY2Ugc3ltYm9sIGlmCi0JaXQgaXMgTlVMTC4KLQkqIGkzODYuaDogUmVtb3ZlLgotCSogbnM1MzIuYywgbnM1MzIuaDogUmVtb3ZlLgotCSogc3BhcmMuYyAoQ0FMTCk6IERlZmluZS4KLQkoc3BhcmNfZmluZF9jYWxsKTogUmVuYW1lIGZyb20gZmluZF9jYWxsLgotCSogc3BhcmMuaDogUmVtb3ZlLgotCSogdGFob2UuYzogSW5jbHVkZSBjZ19hcmNzLmgsIGNvcmUuaCwgaGlzdC5oLCBhbmQgc3ltdGFiLmguICBEb24ndAotCWluY2x1ZGUgdGltZV9ob3N0LmguCi0JKENBTExGLCBQQyk6IERlZmluZS4KLQkoZW51bSB0YWhvZV9vcGVybW9kZXMsIHRhaG9lX29wZXJhbmRlbnVtKTogRGVmaW5lLiAgUmVuYW1lIGFsbAotCXJlZmVyZW5jZXMgdG8gb3Blcm1vZGVzIG9yIG9wZXJhbmRlbnVtIHRvIHRoZXNlLgotCSh0YWhvZV9vcGVyYW5kbW9kZSk6IFJlbmFtZSBmcm9tIG9wZXJhbmRtb2RlLiAgQ2FsbCBhYm9ydCBpZgotCXN3aXRjaCBkb2VzIG5vdCByZXR1cm4uCi0JKHRhaG9lX29wZXJhbmRuYW1lKTogUmVuYW1lIGZyb20gb3BlcmFuZG5hbWUuICBDYWxsIGFib3J0IGlmCi0Jc3dpdGNoIGRvZXMgbm90IHJldHVybi4KLQkodGFob2Vfb3BlcmFuZGxlbmd0aCk6IFJlbmFtZSBmcm9tIG9wZXJhbmRsZW5ndGguICBDYWxsIGFib3J0IGlmCi0Jc3dpdGNoIGRvZXMgbm90IHJldHVybi4KLQkodGFob2VfcmVsYWRkcik6IFJlbmFtZSBmcm9tIHJlbGFkZHIuCi0JKHRhaG9lX2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4gIFVzZSBjb3JlX3RleHRfc3BhY2UKLQlyYXRoZXIgdGhhbiB0ZXh0c3BhY2UuCi0JKiB0YWhvZS5oOiBSZW1vdmUuCi0JKiB2YXguYyAoQ0FMTFMsIFBDKTogRGVmaW5lLgotCShlbnVtIG9wZXJtb2Rlcywgb3BlcmFuZGVudW0sIHN0cnVjdCBtb2RlYnl0ZSk6IERlZmluZS4KLQkodmF4X29wZXJhbmRtb2RlKTogUmVuYW1lIGZyb20gb3BlcmFuZG1vZGUuICBDYWxsIGFib3J0IGlmIHN3aXRjaAotCWRvZXMgbm90IHJldHVybi4KLQkodmF4X29wZXJhbmRuYW1lKTogUmVuYW1lIGZyb20gb3BlcmFuZG5hbWUuICBDYWxsIGFib3J0IGlmIHN3aXRjaAotCWRvZXMgbm90IHJldHVybi4KLQkodmF4X29wZXJhbmRsZW5ndGgpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbGVuZ3RoLiAgQ2FsbCBhYm9ydCBpZgotCXN3aXRjaCBkb2VzIG5vdCByZXR1cm4uCi0JKHZheF9yZWxhZGRyKTogUmVuYW1lIGZyb20gcmVsYWRkci4KLQkodmF4X2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4KLQkqIHZheC5oOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IFNldCB0byBjeWdudXMuCi0JKE1ZX1RBUkdFVCk6IFJlbW92ZS4KLQkoSU5DTFVERVMpOiBSZW1vdmUgLURUQVJHRVRfJChNWV9UQVJHRVQpIGFuZCAtRE1BQ0hJTkVfSD0KLQlcIiQoTVlfVEFSR0VUKS5oXCIuCi0JKGdwcm9mX1NPVVJDRVMpOiBBZGQgaTM4Ni5jLCBhbHBoYS5jLCB2YXguYywgdGFob2UuYywgc3BhcmMuYy4KLQkoZ3Byb2ZfREVQRU5ERU5DSUVTKTogUmVtb3ZlICQoTVlfVEFSR0VUKS5vLgotCShncHJvZl9MREFERCk6IExpa2V3aXNlLgotCShub2luc3RfSEVBREVSUyk6IFJlbW92ZSBhbHBoYS5oLCBpMzg2LmgsIG5zNTMyLmgsIHNwYXJjLmgsCi0JdGFob2UuaCwgdmF4LmgsIGR1bW15LmguCi0JKEVYVFJBX0RJU1QpOiBSZW1vdmUgYWxwaGEuYywgaTM4Ni5jLCBuczUzMi5jLCBzcGFyYy5jLCB0YWhvZS5jLAotCXZheC5jLCBkdW1teS5jLgotCSgkKE9CSkVDVFMpKTogRG9uJ3QgZGVwZW5kIHVwb24gJChNWV9UQVJHRVQpLmguCi0JKCQoTVlfVEFSR0VUKS5vKTogUmVtb3ZlIHRhcmdldC4KLQkoaTM4Ni5vLCBhbHBoYS5vLCB2YXgubywgdGFob2Uubywgc3BhcmMubyk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZC4KLQotTW9uIERlYyAyOSAxNDoxNzowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvcmUuYyAoY29yZV9zeW1fY2xhc3MpOiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgdGV4dCBzeW1ib2xzLgotCUZyb20gRGVhbiBHYXVkZXQgPGRnYXVkZXRAYXJjdGljLm9yZz4uCi0KLVdlZCBTZXAgMjQgMTE6MzU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b21ha2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVNhdCBBdWcgIDkgMTY6MjU6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjguMi4gIENhbGwKLQlBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUgc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5Ci0JbGlidG9vbC4gIEFkZCBBTV9DT05GSUdfSEVBREVSLiAgQ2hhbmdlIEFDX1BST0dfSU5TVEFMTCB0bwotCUFNX1BST0dfSU5TVEFMTC4gIEFkZCBBTV9FWEVFWFQuCi0JKiBNYWtlZmlsZS5hbSAoTElOSyk6IFJlbW92ZS4KLQkoZ3Byb2ZfTERGTEFHUyk6IFJlbW92ZQotCShncHJvZl9ERVBFTkRFTkNJRVMpOiBDaGFuZ2UgbGliYmZkLmEgdG8gbGliYmZkLmxhLgotCShncHJvZl9MREFERCk6IExpa2V3aXNlLgotCSgkKE9CSkVDVFMpKTogRGVwZW5kIHVwb24gZ2NvbmZpZy5oIGFuZCAuLi9iZmQvY29uZmlnLmguCi0JKiBncHJvZi5oOiBVbmRlZmluZSBQQUNLQUdFIGFuZCBWRVJTSU9OIGFmdGVyIGluY2x1ZGluZyBCRkQKLQlzeXNkZXAuaCBmaWxlLCB0aGVuIGluY2x1ZGUgbmV3IGdjb25maWcuaCBmaWxlLgotCSogZ3Byb2YuYyAoVkVSU0lPTik6IERvbid0IGRlZmluZS4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBnY29uZmlnLmluOiBOZXcgZmlsZSwgY3JlYXRlZCBieSBhdXRvaGVhZGVyLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZC4KLQotU2F0IEp1biAyOCAyMzoyMDo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjIuCi0KLU1vbiBKdW4gMTYgMTU6MzE6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBBZGQgLURERUJVRy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXByIDE1IDE0OjE5OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUNoYW5nZSB0byB1c2UgYXV0b21ha2U6Ci0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJ1biBBTV9JTklUX0FVVE9NQUtFLCBBTV9NQUlOVEFJTkVSX01PREUsIGFuZAotCUFNX0NZR1dJTjMyLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYWNsb2NhbC4KLQkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIHdpdGggZmlsZSBjcmVhdGVkIGJ5IGF1dG9tYWtlIC0tY3lnbnVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXByICAzIDEzOjIxOjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAoVkVSU0lPTik6IERlZmluZSBhcyAiMi44LjEiLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVRodSBNYXIgMjcgMTc6MTU6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBncHJvZi5jIChtYWluKTogQ29ycmVjdCBjb3B5cmlnaHQgbWVzc2FnZS4KLQotTW9uIE1hciAyNCAxMToxMjoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguYy5vKTogRGVmaW5lIFRBUkdFVF8kKE1ZX1RBUkdFVCkgd2hlbiBjb21waWxpbmcuCi0gIAkqIGdtb24uaDogVXNlIGJ5dGVzIGNvdW50cyByYXRoZXIgdGhhbiBzaXplb2YgaW4gc3RydWN0IHJhd19waGRyCi0gCWFuZCBzdHJ1Y3QgcmF3X2FyYy4KLQotTW9uIE1hciAxNyAxMDo1NDo0NyAxOTk3ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBjZ19hcmNzLmMgKGFyY19hZGQpOiBtZW1zZXQoKSBuZXdseSBhbGxvY2VkIGFyYyB0byBlbnN1cmUKLQlhbGwgZmllbGRzIGFyZSBpbml0aWFsaXplZCB3aXRoIDAuCi0KLVNhdCBNYXIgMTUgMTk6MTc6MzEgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIHN5bXRhYi5oIChmaW5kX2NhbGwpOiBEZWNsYXJlLgotCSogY2dfYXJjcy5jIChjZ19hc3NlbWJsZSk6IERvbid0IGRlY2xhcmUgZmluZF9jYWxsLgotCSogaGlzdC5jIChzY2FsZV9hbmRfYWxpZ25fZW50cmllcyk6IERlY2xhcmUuCi0KLVRodSBGZWIgMjcgMTI6NDY6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBCU0Q0NF9GT1JNQVQgaWYgdGhlIHRhcmdldCBsb29rcyBsaWtlIGEKLQlCU0Q0LjQgZGVyaXZlZCBzeXN0ZW0uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IEFkZCBAREVGU0AuCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiBJbiBCU0Q0NF9GT1JNQVQgY29kZSwgZ2V0IHByb2ZyYXRlCi0JZnJvbSBwcm9mcmF0ZSBmaWVsZCwgbm90IHZlcnNpb24gZmllbGQuCi0KLVRodSBKYW4gMTYgMTc6NDI6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkdW1teS5jIChmaW5kX2NhbGwpOiBDbGVhciBpZ25vcmVfZGlyZWN0X2NhbGxzLgotCi1UdWUgRGVjIDMxIDE1OjQ0OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBBZGQgLURfR05VX1NPVVJDRS4gIFB1dCAkKENGTEFHUykgYXQgdGhlCi0JZW5kLgotCShncHJvZik6IFB1dCAkKENGTEFHUykgYWZ0ZXIgdGhlIG90aGVyIG9wdGlvbnMuCi0KLVR1ZSBOb3YgMjYgMTc6MDg6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi1XZWQgT2N0ICAyIDE1OjIzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuYyAoZmluZF9jYWxsKTogQWxpZ24gcF9sb3dwYyB0byBhdm9pZCBidXMgZXJyb3IuCi0KLVR1ZSBPY3QgIDEgMTU6NTg6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBncHJvZi5jICh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENoYW5nZSB2ZXJzaW9uIHByaW50aW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VIHN0YW5kYXJkcy4KLQotRnJpIEF1ZyAzMCAxMjoxNjoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdtb24uaDogUmVwbGFjZSAjZWxpZiB3aXRoICNlbHNlLyNlbmRpZi4KLQotVGh1IEF1ZyAyOSAxNzowNDoxMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgQXVnIDIyIDE3OjEyOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgSExERU5WLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEhMREVOVik6IE5ldyB2YXJpYWJsZS4KLQkoZ3Byb2YpOiBVc2UgJChITERFTlYpLgotCi1XZWQgQXVnICA3IDE0OjQzOjUxIDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvcmUuYyAocmVhZF9mdW5jdGlvbl9tYXBwaW5ncyk6IENhc3QgeG1hbGxvYyByZXR1cm4uCi0KLVRodSBKdWwgIDQgMTI6MDE6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBncHJvZi5jIChWRVJTSU9OKTogRGVmaW5lIGFzICIyLjcuMSIuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotCSogYmJfZXhpdF9mdW5jLmM6IFJlbmFtZSBmcm9tIF9fYmJfZXhpdF9mdW5jLmMsIHNvIHRoYXQgaXQgY2FuIGJlCi0Jc3RvcmVkIG9uIGEgU3lzdGVtIFYgZmlsZSBzeXN0ZW0uCi0KLVRodSBKdW4gMjcgMTE6MzY6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfSVNDX1BPU0lYLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKGdwcm9mKTogUGFzcyAkKENGTEFHUykgZHVyaW5nIGxpbmsuCi0JKiBoZXJ0ei5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdGltZS5oPjsgbGV0IHN5c2RlcC5oIGhhbmRsZSB0aGF0LgotCUlmIEhBVkVfU0VUSVRJTUVSIGlzIG5vdCBkZWZpbmVkLCB0cnkgdXNpbmcgc3lzY29uZi4KLQotTW9uIEp1biAyNCAxODoyNzoyOCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZXhlY19wcmVmaXgsIGJpbmRpciwgbGliZGlyLCBtYW5kaXIsIGluZm9kaXIsIGRhdGFkaXIsCi0JSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQkoQUNfUFJPR19JTlNUQUxMKTogYWRkZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBKdW4gMjQgMTI6MDM6MDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKLQl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQotVHVlIEp1biAxOCAxNzozNTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvcmUuYyAoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCSogc291cmNlLmMgKHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoKTogTGlrZXdpc2UuCi0KLU1vbiBBcHIgIDggMTQ6NDQ6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE1hciAyMSAxNzoxODoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvcmUuYyAoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IE1vdmUgZmlsZW5hbWUgYW5kIGZ1bmNfbmFtZQotCWluc2lkZSBpZmRlZiB3aGVyZSB0aGV5IGFyZSB1c2VkLgotCi0JKiBjb3JlLmMgKGNvcmVfc3ltX2NsYXNzKTogUGFyZW50aGVzaXplICYmIHdpdGhpbiB8fC4KLQkqIHN5bXRhYi5jIChzeW10YWJfZmluYWxpemUpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24uCi0KLQkqIGNnX3ByaW50LmggKGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcpOiBEZWNsYXJlLgotCShjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyk6IERlY2xhcmUuCi0KLQkqIF9fYmJfZXhpdF9mdW5jLmMgKF9fYmJfZXhpdF9mdW5jKTogUmVwbGFjZSBiY29weSB3aXRoIG1lbWNweS4KLQkqIGNnX2FyY3MuYyAoYXJjX2FkZCk6IExpa2V3aXNlLgotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcpOiBMaWtld2lzZS4KLQotVGh1IE1hciAyMSAxNzowMjowMiAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBncHJvZi5jIChkZWZhdWx0X2V4Y2x1ZGVkX2xpc3QpOiBBZGQgIl9fbWNvdW50Ii4KLQotCSogZ3Byb2YuYyAobWFpbik6IENoYW5nZSBpZmRlZiBfX29zZl9fIHRvIF9fYWxwaGFfXy4KLQotCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogSWYgQlNENDRfRk9STUFUIGlzIGRlZmluZWQsIGdldCB0aGUKLQlwcm9maWxpbmcgcmF0ZSBmcm9tIHRoZSBoZWFkZXIuCi0KLQkqIGdtb24uaCAoc3RydWN0IHJhd19waGRyKTogT25seSBpbmNsdWRlIHBhZCBpZiBib3RoIF9fYWxwaGFfXyBhbmQKLQlfX29zZl9fIGFyZSBkZWZpbmVkLiAgQWRkIG5ldyBmaWVsZHMgaWYgQlNENDRfRk9STUFUIGlzIGRlZmluZWQuCi0KLQkqIGFscGhhLmggKE1JTl9JTlNOX1NJWkUpOiBEZWZpbmUuCi0JKiBjb3JlLmMgKE1JTl9JTlNOX1NJWkUpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDEuCi0JKGNvcmVfc3ltX2NsYXNzKTogSWdub3JlIGRlYnVnZ2luZyBzeW1ib2xzLgotCShjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBVc2UgTUlOX0lOU05fU0laRSB3aGVuIGdhdGhlcmluZyBsaW5lCi0JaW5mb3JtYXRpb24uCi0KLVdlZCBNYXIgMjAgMTg6MTU6NDcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNnX3ByaW50LmMgKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKTogRml4IF9fR05VQ19fIG1pc3NwZWxsZWQKLQlhcyBfX0dOVV9DX18uCi0JKG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMTIgMTI6MTk6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLVN1biBGZWIgMTggMTU6MDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAnZG8gbm90IG1peCcgZnJvbSBuYXRpdmUgbGlua2VyIGJlZm9yZQotIAl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEZlYiAxMyAxNTozMjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEZlYiAgNyAxNDowMzoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IENDLiAgTG9vayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgU2V0Ci0JQkZETElCIGFuZCBITERGTEFHUyBhbmQgc3Vic3RpdHV0ZSB0aGVtLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKExJQlMpOiBVc2UgQEJGRExJQkAuCi0JKEhMREZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShncHJvZik6IFVzZSAkKEhMREZMQUdTKS4KLQotTW9uIEZlYiAgNSAxNjozNDo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KLQlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogTWFrZWZpbGUuaW4gKExJQkRFUFMpOiBOZXcgdmFyaWFibGUuCi0JKExJQlMpOiBVc2UgLUwuLi9iZmQgLWxiZmQuCi0JKGdwcm9mKTogRGVwZW5kIHVwb24gJChMSUJERVBTKSByYXRoZXIgdGhhbiAkKExJQlMpLgotCi1TYXQgRGVjIDMwIDEwOjExOjAzIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAobG9uZ19vcHRpb25zKTogQWRkICItLWZ1bmN0aW9uLW9yZGVyaW5nIiBhbmQKLQkiLS1maWxlLW9yZGVyaW5nIiBvcHRpb25zLgotCSh1c2FnZSk6IEFkZCBuZXcgb3B0aW9ucyB0byB1c2FnZSBtZXNzYWdlLgotCShtYWluKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCSogZ3Byb2YuaCAoU1RZTEVfRlVOQ1RJT05fT1JERVIpOiBEZWZpbmUuCi0JKFNUWUxFX0ZJTEVfT1JERVIpOiBEZWZpbmUuCi0JKGZ1bmN0aW9uX21hcHBpbmdfZmlsZSk6IERlY2xhcmUuCi0JKiBjZ19hcmNzLmMgKGFyY3MsIG51bWFyY3MpOiBOZXcgZ2xvYmFscy4KLQkoYXJjX2FkZCk6IFB1dCBuZXcgYXJjcyBpbnRvIHRoZSBhcmMgYXJyYXkgc28gdGhlIGZ1bmN0aW9uL2ZpbGUKLQlvcmRlcmluZyBjb2RlIGNhbiBleGFtaW5lIHRoZW0uCi0JKiBjZ19hcmNzLmggKHN0cnVjdCBhcmMpOiBOZXcgZmllbGQgImhhc19iZWVuX3BsYWNlZCIuCi0JKGFyY3MsIG51bWFyY3MpOiBEZWNsYXJlIG5ldyBnbG9iYWxzLgotCSogY29yZS5jIChzeW1ib2xfbWFwLCBzeW1ib2xfbWFwX2NvdW50KTogTmV3IGdsb2JhbHMuCi0JKHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MpOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCBpbiBhIGZ1bmN0aW9uCi0JdG8gb2JqZWN0IG1hcCBmaWxlLgotCShjb3JlX2luaXQpOiBDYWxsIHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MgaWYgYSBmdW5jdGlvbiBtYXBwaW5nCi0JZmlsZSBleGlzdHMuCi0JKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBIYW5kbGUgZnVuY3Rpb24gdG8gb2JqZWN0IGZpbGUKLQltYXBwaW5ncy4KLQkqIHN5bXRhYi5oIChzdHJ1Y3Qgc3ltKTogTmV3IGZpZWxkcyAibWFwcGVkIiwgImhhc19iZWVuX3BsYWNlZCIsCi0JIm51c2VzIiwgInByZXYiLgotCSogY2dfcHJpbnQuYyAoY21wX2FyY19jb3VudCk6IE5ldyBmdW5jdGlvbiBmb3Igc29ydGluZyBhcmNzLgotCShjbXBfZnVuX251c2VzKTogTGlrZXdpc2UgZm9yIGZ1bmN0aW9ucy4KLQkoY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcpOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQgYSBzdWdnZXN0ZWQKLQlmdW5jdGlvbiBvcmRlcmluZy4KLQkoY2dfcHJpbnRfZmlsZV9vcmRlcmluZyk6IExpa2V3aXNlIGZvciBvcmRlcmluZyAubyBmaWxlcy4KLQkob3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MpOiBIZWxwZXIgZnVuY3Rpb24gZm9yIGZ1bmN0aW9uCi0JYW5kIG9iamVjdCBmaWxlIG9yZGVyaW5nIGNvZGUuCi0KLVN1biBEZWMgMjQgMjE6MzI6MjcgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb3JlLmMgKGNvcmVfc3ltX2NsYXNzKTogSWdub3JlIHN5bWJvbHMgd2l0aG91dCBCU0ZfRlVOQ1RJT04KLQlzZXQgaWYgaWdub3JlX25vbl9mdW5jdGlvbiBpcyBzZXQuCi0JKiBncHJvZi5oIChpZ25vcmVfbm9uX2Z1bmN0aW9ucyk6IERlY2xhcmUuCi0JKiBncHJvZi5jIChpZ25vcmVfbm9uX2Z1bmN0aW9ucyk6IERlZmluZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJpZ25vcmUtbm9uLWZ1bmN0aW9ucyIuCi0JKHVzYWdlKTogQWRkIG5ldyBvcHRpb25zLgotCShtYWluKTogUmVjb2duaXplICItRCIgYW5kICItLWlnbm9yZS1ub24tZnVuY3Rpb25zIiBvcHRpb24uCi0KLVR1ZSBOb3YgMjEgMTM6MjQ6MzkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgubS5jKTogU3RyaXAgb3V0IGRpcmVjdG9yeSBuYW1lIGZyb20gZnVuY3Rpb24KLQluYW1lLgotCi0JKiBoaXN0LmMgKHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzKTogRG9uJ3QgdXNlIERFRlVOX1ZPSUQuICBEbwotCVVOSVRTX1RPX0NPREUgYWRqdXN0bWVudCB1bmNvbmRpdGlvbmFsbHk7IGNvbXBpbGVyIGNhbiBvcHRpbWl6ZQotCWF3YXkgemVyby1vZmZzZXQgY2FzZS4gIFJlZmVyIHRvIHNjYWxlZF9hZGRyLCBub3QgYWxpZ25lZF9hZGRyLgotCi0JKiB2YXguYzogRG9uJ3QgaW5jbHVkZSB2YXguaCBoZXJlLgotCi1UaHUgTm92IDE2IDAzOjQxOjM3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVmVyc2lvbiAyLjYgcmVsZWFzZWQuCi0KLVdlZCBOb3YgIDggMTE6NDA6MDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBncHJvZi5jIChtYWluKTogQ2FzdCBnZXRlbnYgcmV0dXJuIHZhbHVlLgotCi1Nb24gTm92ICA2IDE1OjA1OjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBOb3YgIDEgMTI6NTE6MjEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiAgUmVuYW1lIHRvIEdFTl9GSUxFUywgdG8gYXZvaWQgY29uZnVzaW9uLgotCShhbGwpOiAgRGVwZW5kIG9uICQoR0VOX0ZJTEVTKSwgbm90IGRpc3RzdHVmZiAod2hpY2ggYWxzbyBkZXBlbmRzCi0Jb24gaW5mbykuCi0KLVdlZCBOb3YgIDEgMTU6MjM6MTUgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIHN5bV9pZHMuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0KLVdlZCBPY3QgMjUgMTM6MjQ6MzEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgQWxzbyBtYWtlIGluZm8uCi0JKG1vc3RseWNsZWFuKTogIERvbid0IHJlbW92ZSBncHJvZi5pbmZvKi4KLQkobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiAgQWxzbyByZW1vdmUgKi5pbmZvKi4KLQotRnJpIE9jdCAgNiAxNjoyNTozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZWNpZXMgZm9yICQoT0JKUykgb24gaGVhZGVyIGZpbGVzLgotCi0JKiBjZ19wcmludC5jIChwcmludF9jeWNsZSwgcHJpbnRfbWVtYmVycywgY2dfcHJpbnRfaW5kZXgpOiBGaXggbmV3Ci0Jc3R5bGUgb3V0cHV0IGZvcm1hdCB0byBtYWtlIGl0IGNvbnNpc3RlbnQuCi0JKiBkdW1teS5jIChmaW5kX2NhbGwpOiBGaXggdHlwbyBpbiBlcnJvciBtZXNzYWdlLgotCi1XZWQgU2VwIDIwIDEzOjIxOjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4KLQotRnJpIFNlcCAgOCAxNDozODowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBpbiAkKHRvb2xkaXIpLgotCi1GcmkgQXVnIDI1IDE1OjMwOjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTlMzMksgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgotCSogY29uZmlndXJlLmluOiBVc2UgbnMzMmssIG5vdCBuczUzMi4KLQkqIG5zNTMyLmM6IEluY2x1ZGUgc3ltdGFiLmguCi0JKGZpbmRfY2FsbCk6IFJlbmFtZWQgZnJvbSBmaW5kY2FsbC4gIFByaW50IGEgbWVzc2FnZS4KLQkqIG5zNTMyLmg6IFJlbW92ZSBkdW1teS5oIGNvbW1lbnRzLgotCi1UdWUgQXVnIDIyIDEwOjAwOjQ1IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSAiYnJva2Vuc2VkIiBoYWNrLCB1bm5lY2Vzc2FyeSBub3cKLQl0aGF0IHdlJ3JlIHVzaW5nIGF1dG9jb25mLgotCi1XZWQgSnVsIDE5IDE4OjQ2OjEzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmMgKGdldF9zcmNfaW5mbyk6IENhc3QgYXJnIDcgb2YgYmZkX2ZpbmRfbmVhcmVzdF9saW5lCi0JdG8gcHJvcGVyIHR5cGUgb2YgInVuc2lnbmVkIGludCAqIi4KLQotRnJpIEp1biAxNiAxNToyOTozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBjaGFuZ2VxdW90ZSBhcm91bmQgdXNlIG9mIFtdLgotCi1Nb24gSnVuIDEyIDEyOjE0OjUyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZSBhbmQKLQkgIGNvbmZpZy5sb2cuCi0KLVdlZCBNYXkgMTcgMTc6NTY6NTMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBBZGRlZCBjb25maWcuc3RhdHVzIHRvIGRlcGVuZGVuY3kgbGlzdC4KLQkgIChjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KLQkgIChTSEVMTCk6IE5ldyBkZWZpbml0aW9uLgotCi1UdWUgQXByIDI1IDIxOjExOjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIG9uICJhbGwiLgotCi1UaHUgQXByIDIwIDE3OjI5OjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gTVlfTUFDSElORSB0byBNWV9UQVJHRVQsCi0JdG8gbWF0Y2ggY29uZmlndXJlIHNjcmlwdC4KLQotV2VkIEFwciAxOSAxMToxOTozNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1jLXByb2cuYXdrOiBDaGFuZ2VkIHJlZmVyZW5jZSB0byAibWFrZS1jLXByb2cuYXdrIiBpbgotCSAgY29tbWVudCBlbWl0dGVkIGJ5IHRoaXMgc2NyaXB0IHRvIGdlbi1jLXByb2cuYXdrLgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBDb252ZXJ0ZWQgdG8gdXNlIGF1dG9jb25mLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4zLgotCSogY29uZmlnL3ttdC1hbHBoYSwgbXQtZHVtbXksIG10LWkzODYsIG10LW5zNTMyLCBtdC1zcGFyYywKLQkgIG10LXRhaG9lLCBtdC12YXh9OiBSZW1vdmVkLgotCi1Nb24gTWFyIDEzIDIxOjQ0OjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIF9fYmJfZXhpdF9mdW5jLmM6IE5ldyBmaWxlLCBmcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nLgotCi0JVGh1IEZlYiAgOSAxNjo1NjowNyAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIEFsbCAqLmM6IE1vcmUgY2xlYW51cCB0b3dhcmRzIEdOVSBmb3JtYXQuCi0KLQkqIGdtb25fb3V0LmggKHN0cnVjdCBnbW9uX2hpc3RfaGRyLCBzdHJ1Y3QgZ21vbl9jZ19hcmNfcmVjb3JkKTogCi0JcmVwbGFjZWQgc2l6ZW9mIChiZmRfdm1hKSBieSBzaXplIChjaGFyKikgYmVjYXVzZSBLZW4gdGVsbHMgbWUKLQl0aGF0IGJmZF92bWEgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IGFzIGJpZyBhcyBhIHBvaW50ZXIuCi0KLQkoR01PTl9SZWNvcmRfdGFnKTogYWRkZWQgZXhwbGljaXQgZW51bWVyYXRpb24gdmFsdWVzIHRvIGVuc3VyZQotCWNvbXBhdGliaWxpdHkgYWNyb3NzIGNvbXBpbGVycy4KLQotCSogZ21vbl9pby5jIChnZXRfdm1hLCBwdXRfdm1hKTogcmVwbGFjZWQgc2l6ZW9mKGJmZF92bWEpIGJ5Ci0Jc2l6ZW9mKGNoYXIqKS4KLQotVHVlIEZlYiAgNyAxNzoyNDoxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBBbGwgKi5jIGFuZCAqLmggZmlsZXM6IFJhbiAiaW5kZW50IC1nbnUiLiAgQ2xlYW5lZCB1cCBhIGNvdXBsZQotCW9mIGNvbnN0cnVjdHMgR05VIGluZGVudCBjb3VsZG4ndCBoYW5kbGUuICBCbG9jayBjb21tZW50cyBub3QgeWV0Ci0JcmV3cml0dGVuIGluIEdOVSBmb3JtYXQuCi0KLQkqIGdwcm9mLmMgKFZFUlNJT04pOiBDaGFuZ2VkIHRvIDIuNiwgdG8gZ2V0IGluIHN5bmMgZm9yIG5leHQKLQliaW51dGlscyByZWxlYXNlLgotCi1TdW4gRmViICA1IDE2OjE5OjQ2IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogc3ltdGFiLmMgKHN5bXRhYl9maW5hbGl6ZSk6IGVuc3VyZSBnbG9iYWxzIHN5bWJvbHMgcmVhbGx5Ci0JYXJlIGZhdm9yZWQgb3ZlciBzdGF0aWMgb25lcy0tLWV2ZW4gaWYgdGhlaXIgbmFtZSBsb29rcyBsZXNzCi0JcHJlZmVyYWJsZTsgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIEhQLVVYOyBmb3IgZXhhbXBsZSwgdGhlcmUKLQlpcyBhIHN0YXRpYyBsYWJlbCBMdGV4dF9zb21ldGhpbmcgdGhhdCBhbGlhc2VzIHRoZSBnbG9iYWwKLQlzeW1ib2wgX3N0YXJ0Ci0KLQkqIGhpc3QuYyAoaGlzdF9wcmludCk6IGF1dG8tc2NhbGluZyBpcyBub3cgaW4gZWZmZWN0IGZvciBGU0Ytc3R5bGUKLQlvdXRwdXQgb25seTsgYWxzbywgYXV0by1zY2FsaW5nIGlzIG5vdyBwZXJmb3JtZWQgYmFzZWQgb24KLQlwZXItY2FsbCwgcmF0aGVyIHRoYW4gdG90YWwgZXhlY3V0aW9uIHRpbWUsIHdoaWNoIGlzIHdoYXQgaXQgd2FzCi0JbWVhbnQgdG8gYmUuCi0KLQkqIGdwcm9mLmggKEZpbGVfRm9ybWF0KTogbmV3IHR5cGUuCi0KLQkqIGdwcm9mLmMgKFZFUlNJT04pOiB1cHBlZCB0byAyLjctLS1zZWVtcyB0byBiZSBjb21wbGV0ZWx5IG91dCBvZgotCXN5bmMgd2l0aCBDeWdudXMgdmVyc2lvbiBudW1iZXJzIHRob3VnaC4uLgotCi0JKGxvbmdfb3B0aW9ucyk6IHJlbmFtZWQgLS1nbW9uLWluZm8gdG8gLS1maWxlLWluZm8sIC0td2lkdGggYWRkZWQsCi0JcmVuYW1lZCAtLW9sZC1maWxlLWZvcm1hdCB0byAtLWZpbGUtZm9ybWF0Ci0JKG1haW4pOiBkaXRvOyBhbHNvIGFkZGVkIHN1cHBvcnQgdG8gcmVhZCBwcm9mIGZpbGVzLCBidXQgYXMKLQltb25fb3V0X3JlYWQoKSBpcyBub3QgaW1wbGVtZW50ZWQsIGl0J3MgI2lmZGVmJ2Qgb3V0IGZvciBub3cKLQotCSh1c2FnZSk6IHVwZGF0ZSB0byByZWZsZWN0IG5ldyBvcHRpb25zLgotCi0JKiBnbW9uX2lvLmM6IHJlcGxhY2VkICJvbGRfZmlsZV9mb3JtYXQiIGJ5IG1vcmUgZ2VuZXJhbAotICAgICAgICAiZmlsZV9mb3JtYXQiIG9wdGlvbgotCi0JKiBnbW9uLmggKHN0cnVjdCByYXdfcGhkcik6IGZpeGVkIGRlY2xhcmF0aW9uIGZvciBPU0YvMS4KLQotCSogY29yZS5jIChjb3JlX3N5bV9jbGFzcyk6IGFkZGVkIGJhY2sgY2hlY2sgZm9yIF9fZ251X2NvbXBpbGVkIGFuZAotCV9fX2dudV9jb21waWxlZCBmb3IgdGhlIGJlbmVmaXQgb2Ygc3lzdGVtcyB3aXRob3V0Ci0JYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgc3VwcG9ydAotCi0JKGdldF9zcmNfaW5mbyk6IG5vdyB0aGUgbGliYmZkIGlzIGZpeGVkLCBpbnZva2UgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkKLQl3aXRoIHNlY3Rpb24tcmVsYXRpdmUgYWRkcmVzc2VzCi0KLQkoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IGdldF9zcmNfaW5mbygpIGNhbGxzIGFyZSBjdXJyZW50bHkKLQllbmFibGVkIGZvciBPU0YvMSBvbmx5LiAgSXQgYXBwZWFycyB0byB3b3JrIGFsbHJpZ2h0IGZvciBTdW5PUwotICAgICAgICA0LjEueCBhcyB3ZWxsLCBidXQgb24gU1BBUkNzIGl0IGdldHMgcGFpbmZ1bGx5IHNsb3cgd2l0aCB0aGUKLSAgICAgICAgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBhb3V0XzMyX2ZpbmRfbmVhcmVzdF9saW5lKCk7Ci0gICAgICAgIHVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgdGhhdCBzdGF0aWMgZnVuY3Rpb25zIHdpbGwgbm90IGhhdmUgdGhlaXIKLQlmaWxlbmFtZSBwcmludGVkIGluIHRoZSBjYWxsLWdyYXBoIGZ1bmN0aW9uIGluZGV4OyBsaW5lLWxldmVsCi0JcHJvZmlsaW5nIHNob3VsZCBzdGlsbCB3b3JrLCBidXQgcmVxdWlyZXMgc29tZSBwYXRpZW5jZQotCi0JKiBjZ19wcmludC5jIChjZ19wcmludF9pbmRleCk6IHNhbml0aXNlZCBwcmludGluZyBvZiBpbmRleCB3aGVuCi0JdXNpbmcgRlNGLXN0eWxlIG91dHB1dDsgaW4gcGFydGljdWxhciwgb3V0cHV0IHdpZHRoIGlzIG5vdyBjb250cm9sbGVkCi0JdmlhIG9wdGlvbiAtLXdpZHRoIGFuZCB0aGUgZnVuY3Rpb24gdHJpZXMgaGFyZCB0byBrZWVwIGNvbHVtbnMKLQlhbGlnbmVkIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIChvY2Nhc2lvbmFsKSBsb25nIG5hbWVzCi0KLQkqIE5PVEVTOiBhIGZpcnN0IHNob3QgYXQgdXBkYXRpbmcgdGhlIGRvY3VtZW50YXRpb24uCi0KLVdlZCBGZWIgIDEgMTk6MDc6NDQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBmaXhlZCBjb21wdXRhdGlvbiBvZiBtaW5fdm1hCi0JYW5kIG1heF92bWEuCi0KLQkqICouYzogcmVtb3ZlZCByY3NpZC4KLQotVHVlIEphbiAzMSAxNjoxODoxOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBMb3RzIG9mIGNoYW5nZXMgZnJvbSBEYXZpZCBNb3NiZXJnZXItVGFuZzoKLQotCVR1ZSBPY3QgMjUgMTk6MjA6MTQgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIGdwcm9mLmMgKG1haW4pOiBwdXQgcGFyZW50aGVzZXMgYXJvdW5kICYgd2l0aGluICYmLgotCi0JKiBiYXNpY19ibG9ja3MuYyAoYmJfcmVhZF9yZWMpOiBwcmludCB3YXJuaW5nIG1lc3NhZ2UgKG9uY2UpIHdoZW4KLQlpZ25vcmluZyBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLgotCi0JKiBzb3VyY2UuYyAoc291cmNlX2ZpbGVfbG9va3VwX25hbWUpOiBjb3JyZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvCi0Jc3RyY21wKCkuCi0KLQkqIGhpc3QuYyAocHJpbnRfaGVhZGVyKTogbWVyZ2VkIEZyaSBPY3QgMjEgMTg6NTg6MDIgMTk5NCBjaGFuZ2UgYnkKLQlLZW4gUmFlYnVybiA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+IGZyb20gYmludXRpbHMtMi41LjEuCi0KLQkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IHRoZSBvdXRwdXQgc3R1bGUgU1RZTEVfR01PTl9JTkZPIGlzIG5vdwotCXN1cHBvcnRlZCBib3RoIGZvciBvbGQgYW5kIG5ldyAodmVyc2lvbmVkKSBnbW9uLm91dCBmaWxlcy4gIE9sZAotCWZpbGVzIGFyZSBpZGVudGlmaWVkIGFzIHZlcnNpb24gMC4KLQotCSogZ21vbi5oIChzdHJ1Y3QgcmF3X2FyYyk6IGNvdW50IGZpZWxkIGlzIG5vdyBzaXplb2YobG9uZykgYnl0ZXMKLQlsb25nIChpbnN0ZWFkIG9mIDQpIGJlY2F1c2UgdGhhdCBpcyB3aGF0IE9TRi8xIHYzLjAgdXNlcy4KLQotCSogY29yZS5jOiBtaW5vciBmaXhlcyBhbmQgZGVidWdnaW5nIGluZm8gY2hhbmdlcy4KLQotCVN1biBTZXAgMTEgMTg6NDc6NDcgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGNvcmUuYyAoY29yZV9pbml0KTogaWYgLnRleHQgY2Fubm90IGJlIGZvdW5kLCB0cnkgJENPREUkICh0aGUKLQluYW1lIG9mIHRoZSB0ZXh0LXNlY3Rpb24gdW5kZXIgSFAtVVgpLgotCi0JKiBoaXN0LmMgKGhpc3RfYXNzaWduX3NhbXBsZXMpOiBmaXhlZCBvZmYtYnktb25lIGJ1ZzogaGlnaHBjCi0JcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0IHNhbXBsaW5nIGJpbiwgc28gaGlzdF9zY2FsZSBzaG91bGQgYmUKLQljb21wdXRlZCBhcyAiaGlzdF9zY2FsZSAvPSBoaXN0X251bV9iaW5zIiwgbm90ICJoaXN0X3NjYWxlIC89Ci0JaGlzdF9udW1fYmlucyAtIDEiLgotCi0JKiBnbW9uX2lvLmMsIGhpc3QuYywgaGlzdC5oOiByZW5hbWVkIGhpc3RfbnVtX3NhbXBsZXMgdG8KLQloaXN0X251bV9iaW5zLgotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGFscGhhLSotKikgZm9yIHBlci10YXJnZXQgY29uZmlnLgotCi0JKiBhbHBoYS5jLCBhbHBoYS5oOiBjcmVhdGVkLgotCi0JKiBncHJvZi5jIChkZWZhdWx0X2V4Y2x1ZGVkX2xpc3QpOiA8bG9jb3JlPiwgPGhpY29yZT4gYWRkZWQuCi0KLQkqIGNvcmUuYyAoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcywgY29yZV9jcmVhdGVfbGluZV9zeW1zKToKLQlleHBsaWNpdGx5IGtlZXAgdHdvIHNlbnRpbmVscyAiPGxvY29yZT4iIGFuZCAiPGhpY29yZT4iIHRoYXQgY2F0Y2gKLQlhbGwgYWRkcmVzc2VzIG91dHNpZGUgdGhlIHRleHQtc3BhY2UuICBUaHVzLCBzeW1fbG9va3VwKCZzeW10YWIsCi0JYWRkcikgY29udGludWVzIHRvIGd1YXJhbnRlZSBub3QgdG8gcmV0dXJuIDAgb24gYW55IGFkZHJlc3MuICBJdAotCWFsc28gYXZvaWRzIGluY29ycmVjdGx5IGNyZWRpdGluZyB0aGUgZmlyc3QvbGFzdCBzeW1ib2wgaW4gdGhlCi0JdGV4dC1zcGFjZS4KLQotCSogY29yZS5jIChjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBhbHdheXMgY3JlYXRlIGZ1bmN0aW9uIHN5bWJvbHMKLQlmaXJzdCwgdGhlbiBtZXJnZSBpbiBsaW5lIHN5bWJvbHM7IHRoaXMgaXMgc28gdGhhdCBpZiBwYXJ0cyBvZiB0aGUKLQlwcm9ncmFtIHdlcmUgY29tcGlsZWQgd2l0aG91dCAtZywgZnVuY3Rpb24tbGV2ZWwgc3ltYm9scyBhcmUKLQlhdmFpbGFibGUgc3RpbGwuCi0KLQkqIHV0aWxzLmMgKHByaW50X25hbWVfb25seSk6IHN1cHBvcnQgZm9yIHByaW50X3BhdGggYWRkZWQuCi0KLQkqIHN5bXRhYi5jIChjbXBfYWRkcik6IGFsc28gdXNlIGlzX2Z1bmMgZmxhZyBpbiBjb21wYXJpc29uLgotCShzeW10YWJfZmluYWxpemUpOiByZXR1cm4gaW1tZWRpYXRlbHkgd2hlbiB0YWJsZSBlbXB0eTsgbm93Ci0JbW9yZSBjYXJlZnVsIGFib3V0IGdldHRpbmcgcmlkIG9mIHRoZSByaWdodCBkdXBsaWNhdGUgc3ltYm9sLgotCi0JKiBzcGFyYy5jIChmaW5kX2NhbGwpOiBtYW55IGZpeGVzLS0tdGhpcyBmdW5jdGlvbiB3YXMgcmF0aGVyCi0JYm90Y2hlZCBpbiBiaW51dGlscy0yLjQgYWxyZWFkeTsgaXQgc2hvdWxkIHdvcmsgYWdhaW4uCi0KLQkqIHNvdXJjZS5jIChzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCk6IFBBVEggaXMgbm93IHN0cmR1cCdlZCAoaXQgaXMKLQlub3QgZ29vZCB0byByZWx5IG9uIGdldF9zcmNfaW5mbygpIHRvIHJldHVybiBkaXN0aW5jdCBzdHJpbmcKLQlwb2ludGVycykuCi0KLQkqIHNlYXJjaF9saXN0LmMgKHNlYXJjaF9saXN0X2FwcGVuZCk6IGFkZGVkIGNhc3QgZm9yIHhtYWxsb2MoKS4KLQotCSogaGlzdC5jOiBhZGRlZCBleHBsaWNpdCBpbml0aWFsaXphdGlvbiB0byBzb21lIG9mIHRoZSBnbG9iYWwKLQl2YXJpYWJsZXM7IGZpeGVkIFNJdGFiIChzY2FsZXMgd2VyZSBvZmYgYnkgYSBmYWN0b3Igb2YgMTApLgotCi0JKiBoaXN0Lmg6IGluY2x1ZGUgb2YgYmZkLmggYWRkZWQuCi0KLQkqIGdwcm9mLmMsIGdwcm9mLmggKHByaW50X3BhdGgpOiBhZGRlZC4KLQotCSogZ3Byb2YuaCAoTUFYKTogZml4ZWQuCi0KLQkqIGdtb25fb3V0Lmg6IHJlbmFtZWQgZ21vbl90aW1lX2hpc3RfaGRyIHRvIGdtb25faGlzdF9oZHIuCi0KLQkqIGdtb25faW8uYzogYWRkZWQgc29tZSBjYXN0cyB0byAobG9uZykgc28gd2UgY2FuIGFsd2F5cyBwcmludCBhcyAlbHgKLQotCSogY29yZS5jIChjb3JlX2dldF90ZXh0X3NwYWNlKTogZml4ZWQgdG8gbWFrZSBpdCB3b3JrLgotCi0JKiBjZ19wcmludC5jIChjZ19wcmludF9pbmRleCk6IGFkZGVkIHN1cHBvcnQgZm9yIHByaW50X3BhdGggb3B0aW9uLgotCi0JKiBjZ19kZm4uaCAoY2dfZGZuKTogd3JhcCBwcm90b3R5cGUgaW4gUEFSQU1TKCkuCi0KLQkqIGNhbGxfZ3JhcGguYywgZ21vbl9pby5jLCBoaXN0LmM6IGF2b2lkIHRha2luZyBhZGRyZXNzIG9mIGFycmF5Ci0JYXMgc29tZSBjb21waWxlcnMgY29tcGxhaW4gKGUuZy4sIERFQydzIE9TRi8xIGNvbXBpbGVyKQotCi0JKiBiYXNpY19ibG9ja3MuYywgZ21vbl9pby5jLCBoaXN0LmMsIHNvdXJjZS5jLCBzeW1faWRzLmMsCi0Jc3ltdGFiLmM6IGNhbGxzIHRvIG1lbXNldCgpIGhhZCAybmQgYW5kIDNyZCBhcmdzIHJldmVyc2VkLgotCi0JU2F0IFNlcCAxMCAyMTo1MzoxMyAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYzogYWRkZWQgIl9tY291bnQiIHRvIGRlZmF1bHRfZXhjbHVkZWRfbGlzdC4KLQkobWFpbik6IGlmIG91dHB1dF9zdHlsZT09MCBhbmQgdGhlcmUgaXMgZWl0aGVyIGEgaGlzdG9ncmFtIG9yIGEKLQljYWxsLWdyYXBoLCBhbHdheXMgZ2VuZXJhdGUgZmxhdCBhbmQgY2FsbC1ncmFwaCwgbm8gbWF0dGVyIHdoYXQKLQlsaW5lX2dyYW51bGFyaXR5IGlzIHNldCB0by4KLQotCSogc291cmNlLmMgKHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lKTogaWYgc2VhcmNoaW5nIGZvciBzZi0+bmFtZQotCWZhaWxzLCB0cnkgYWdhaW4gd2l0aCBmaWxlbmFtZSBvYnRhaW5lZCBhZnRlciBzdHJpcHBpbmcgb2ZmIGFueQotCXBhcnRpYWwgcGF0aCBmcm9tIHNmLT5uYW1lLgotCi0JKiBncHJvZi5oIChTUkNERUJVRyk6IGFkZGVkLgotCi0JKiBzZWFyY2hfbGlzdC5jIChzZWFyY2hfbGlzdF9hcHBlbmQpOiBkaXJlY3RvcmllcyB3ZXJlIGFkZGVkIGluIHdyb25nCi0Jb3JkZXIuCi0KLQkqIHJlaW1wbGVtZW50ZWQgc2VsZWN0aW9uIG1lY2hhbmlzbSBmcm9tIGdyb3VuZCB1cDsgaXQgaXMgbm93IHBvc3NpYmxlCi0JdG8gYWNjdXJhdGVseSBjb250cm9sIHdoYXQgZ2V0cyBpbmNsdWRlZC9leGNsdWRlZCBpbiBlYWNoIG9mIHRoZQotCW91dHB1dCBzdHlsZXM7CWEgInN5bWJvbC1zcGVjaWZpY2F0aW9uIiAoc3BlYykgaXMgdGhlIGJhc2ljIG1lYW5zCi0JdG8gc2VsZWN0IGEgc2V0IG9mIHN5bWJvbHM7IGEgc3BlYyBoYXMgdGhlIHN5bnRheDoKLQotCSAgc3BlYyA9PSAoRklMRU5BTUU6KEZVTkNOQU1FfExJTkVfTlVNKSB8IE5BTUUpLgotCSAgYXJjID09IHNwZWMvc3BlYy4KLQotCWFueSBvZiB0aGUgdGVybWluYWwgc3ltYm9scyBjYW4gYmUgZW1wdHksIGluIHdoaWNoIGNhc2UgdGhleQotCW1hdGNoIGFueXRoaW5nICh3aWxkY2FyZHMpLiAgTkFNRSBpcyBpbnRlcnByZXRlZCBhcyBhIEZJTEVOQU1FCi0JaWYgaXQgY29udGFpbnMgYSBkb3QgKGUuZy4sIGZvby5jKSwgYXMgTElORV9OVU0gaWYgaXQgc3RhcnRzCi0Jd2l0aCBhIGRpZ2l0LCBhbmQgYXMgRlVOQ05BTUUgb3RoZXJ3aXNlLgotCi0JRm9yIGV4YW1wbGUsIHRvIGdldCBhIGNhbGwtZ3JhcGggZGlzcGxheSB0aGF0IGlnbm9yZXMgYXJjcwotCWZyb20gZm9vKCkgdG8gYmFyKCksIHlvdSdkIHNheSAiLS1uby1ncmFwaD1mb28vYmFyIjsgdG8KLQlzaG93IG9ubHkgYXJjcyBpbnRvIGJhcigpIChubyBtYXR0ZXIgd2hhdCB0aGUgY2FsbGVyKSwKLQl5b3UnZCBzYXkgIi0tZ3JhcGg9L2JhciI7IGFuZCB0byBnZXQgYSBjYWxsLWdyYXBoIHdpdGhvdXQKLQlhbnkgYXJjIGluZm8sIHlvdSdkIHNheSAiLS1ncmFwaD0vIjsgIHNpbWlsYXJseSwgdG8KLQlnZXQgYSBmbGF0IHByb2ZpbGUgd2l0aG91dCBtY291bnQsIHlvdSdkIHNheSAiLS1uby1mbGF0PW1jb3VudCIKLQlhbmQgdG8gZ2V0IGEgZmxhdCBwcm9maWxlIHRoYXQgc2hvd3MgaW5jbHVkZXMgYWxsIGZ1bmN0aW9ucwotCXlvdSdkIHNheSAiLS1mbGF0PSIiIiAoaS5lLiwgYW4gZW1wdHkgc3BlYykKLQotCSogaGlzdC5jIChoaXN0X3ByaW50KTogdG9wX3RpbWUgd2Fzbid0IGluaXRpYWxpemVkIHRvIDAuMC4KLQotCUZyaSBTZXAJIDkgMDE6MTA6MjEgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGdtb25fb3V0Lmg6IGFsbCBoZWFkZXJzIG5vdyBkZWNsYXJlZCBpbiB0ZXJtcyBvZiBjaGFyYWN0ZXJzCi0JICB0byBhdm9pZCBnZXR0aW5nIGludG8gdHJvdWJsZSB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMgaW50cm9kdWNpbmcKLQkgIGRpZmZlcmVudCBhbW91bnQgb2YgcGFkZGluZzsgdGhlIGNvZGUgYWxyZWFkeSBhY2Nlc3NlZCB0aGUgZmllbGRzCi0JICB0aHJvdWdoIGJmZCBmdW5jdGlvbnMsIHNvIHRoYXQgZGlkbid0IGhhdmUgdG8gY2hhbmdlLgotCi0JKiBoaXN0LmMgKGhpc3RfcmVhZF9yZWMsIGhpc3Rfd3JpdGVfcmVjKTogYWRkZWQgc3VwcG9ydCBmb3IKLQkgIGNvbGxlY3Rpb24gcGMgaGlzdG9ncmFtcyBtZWFzdXJpbmcgcXVhbnRpdGllcyBvdGhlciB0aGFuIHRpbWU7Ci0JICB0aGUgaGlzdG9ncmFtIGhlYWRlciBub3cgaW5jbHVkZXMgYSBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUKLQkgIGRpbWVuc2lvbiBvZiB0aGUgcXVhbnRpdHkgbWVhc3VyZWQgYnkgdGhlIGhpc3RvZ3JhbSBiaW5zCi0JICAobm9ybWFsbHksIHRoaXMgaXMgInNlY29uZHMiLCBidXQgb3RoZXIgbWVhbmluZ2Z1bCBkaW1lbnNpb25zCi0JICAgaW5jbHVkZSBzdWNoIHRoaW5ncyBhcyAiSS1jYWNoZSBtaXNzZXMiLCAiaW5zdHJ1Y3Rpb24gaXNzdWUgc3RhbGxzIgotCSAgIGV0Yy4pOyB0aGVyZSBpcyBhbHNvIGEgZmllbGQgdG8gc3BlY2lmeSBhIG9uZS1jaGFyYWN0ZXIKLQkgIGFiYnJldmlhdGlvbiBmb3IgdGhlIGRpbWVuc2lvbjsgaW4gdGhlIGNhc2Ugb2YgdGltZSwgdGhpcyB3b3VsZAotCSAgYmUgJ3MnOyBpbiBtb3N0IG90aGVyIGNhc2VzIGl0IHByb2JhYmx5IHdvdWxkIGJlICcxJyAobm90IGEgcGh5c2ljYWwKLQkgIGRpbWVuc2lvbikuCi0KLQlUaHUgU2VwCSA4IDE2OjA1OjA4IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBncHJvZi5jLCBnbW9uX2lvLltjaF06IEJTRF9DT01QQVRJQkxFIGlzIGdvbmUgYW5kIG5ld19maWxlX3ZlcnNpb24KLQkgIGhhcyBiZWNvbWUgb2xkX2ZpbGVfdmVyc2lvbjsgZ21vbl9pby5jIG5vdyBhbHdheXMgc3VwcG9ydHMgb2xkLXN0eWxlCi0JICBnbW9uLm91dCBmaWxlczsgaXQgZmlyc3QgdHJpZXMgdG8gcmVhZCBnbW9uLm91dCBhcyBhIG5ldyB2ZXJzaW9uCi0JICBmaWxlLCBpZiB0aGF0IGZhaWxzLCBpdCB0cmllcyB0byByZWFkIGl0IGluIHRoZSBvbGQgZm9ybWF0OwotCSAgYWx0aG91Z2ggbm90IHZlcnkgbGlrZWx5LCBpdCBpcyBwb3NzaWJsZSBmb3IgZ3Byb2YgdG8gbWlzdGFrZSBhbgotCSAgb2xkLXN0eWxlIGZpbGUgYXMgYSBuZXcgb25lICh0aGUgZmlyc3QgNCBieXRlcyB3b3VsZCBoYXZlIHRvCi0JICBiZSAiZ21vbiItLS1pbmNsdWRpbmcgdGhlIHRyYWlsaW5nICdcMCcpOyBpbiB0aGF0IGNhc2UsIGl0IGlzCi0JICBuZWNlc3NhcnkgdG8gc3BlY2lmeSAtLW9sZC1maWxlLXZlcnNpb24KLQotCSogZ3Byb2YuaDogcmVtb3ZlZCBkZXBlbmRlbmN5IG9uIFNZU1Y7IHRoZSBjb2RlIG5vdyBhbHdheXMgdXNlcwotCSAgc3RycmNocigpLCBtZW1zZXQoKSwgYW5kIG1lbWNweSgpIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGVpdGhlcgotCSAgb2Ygc3RyaW5nLmggb3Igc3RyaW5ncy5oOyB0aGlzIHNob3VsZCBtYWtlIGdwcm9mIGNvbXBpbGUgb24KLQkgIGFueSAoVW5peCkgc3lzdGVtIHdpdGhvdXQgY29uZmlndXJhdGlvbiAocGVyIHN1Z2dlc3Rpb24gb2YKLQkgIHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAodXNhZ2UpOiBmaXhlZCBsb2NhdGlvbiBvZiAtLW5ldy1maWxlLWZvcm1hdCBvcHRpb24uCi0KLQkqIGNnX2FyY3MuYyAocHJvcGFnYXRlX2ZsYWdzKTogZml4ZWQgdHlwbyBpbiBkZWNsYXJhdGlvbi4KLQotCSogZmxhdF9ibC5tOiByZW1vdmVkIGZvcm1mZWVkIGF0IGVuZCBvZiBmaWxlOyB0aGUgZm9ybS1mZWVkCi0JICBpcyBub3cgcHJpbnRlZCBjZ19wcmludC5jIG9ubHkgd2hlbiBuZWNlc3NhcnkuCi0KLQkqIG1ham9yIHJld3JpdGUgb2YgZ3Byb2YtLS10b28gbWFueSBjaGFuZ2VzIHRvIG1lbnRpb24gYWxsIG9mCi0JICB0aGVtLgkgbmV3IGZlYXR1cmVzOgotCi0JKyAtbCBub3cgcmVxdWVzdHMgcHJvZmlsaW5nIGF0IHRoZSBsaW5lIGxldmVsIChhcyBvcHBvc2VkCi0JICB0byBmdW5jdGlvbiBsZXZlbCk7IGluIHRoaXMgbW9kZSwgZ3Byb2YgY3JlYXRlcyBhICJzeW1ib2wiCi0JICAoYWthIG5hbWUtbGlzdCBlbnRyeSkgZm9yIGVhY2ggbGluZSBvZiBzb3VyY2UgY29kZSwgaW5zdGVhZAotCSAgIG9mIG9uZSBwZXIgZnVuY3Rpb24pCi0KLQkrIHN1cHBvcnQgZm9yIGEgbmV3IGdtb24ub3V0IGZpbGUgZm9ybWF0OyB0aGUgbmV3IGZvcm1hdCAKLQkgIGNvbnNpc3RzIG9mIGEgaGVhZGVyIHdpdGggYSBtYWdpYyBhbmQgYSB2ZXJzaW9uIG51bWJlciwKLQkgIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgcHJvZmlsZSBkYXRhOyBwcm9maWxlIGRhdGEKLQkgIGNhbiBhbnkgb2Y6IChhKSBQQyBoaXN0b2dyYW0sIChiKSBjYWxsLWdyYXBoIGFyY3MsIG9yCi0JICAoYykgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50czsgdGhlIHZlcnNpb24gbnVtYmVyIG1ha2VzCi0JICBpdCBwb3NzaWJsZSB0byBleHRlbmQgZ21vbi5vdXQgaW4gYSBiYWNrd2FyZHMgY29tcGF0aWJsZQotCSAgZmFzaGlvbgotCi0JKyBzdXBwb3J0IGZvciB0Y292IHN0eWxlIGFubm90YXRlZCBvdXRwdXQ6IGlmIHRoZSBnbW9uLm91dCBmaWxlCi0JICBjb250YWlucyBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLCB0aGUgdXNlciBjYW4gcmVxdWVzdAotCSAgdGhlIGdlbmVyYXRpb24gb2YgYW5ub3RhdGVkIHNvdXJjZSBmaWxlcywgbXVjaCBsaWtlIFN1bidzCi0JICB0Y292IHVzZWQgdG8gZG8KLQotCSsgbG9uZyBvcHRpb25zCi0KLQkrIG5ldyBzY2hlbWUgdG8gc3VwcHJlc3Mgc3ltYm9scyB0aGF0IGFyZW4ndCBmdW5jdGlvbiBuYW1lcwotCSAgKGUuZy4sIGF2b2lkcyBtaXN0YWtpbmcgYSBnb3RvIGxhYmVsIGFzIGEgZnVuY3Rpb24pCi0KLQkrIHJlb3JnYW5pemVkIHNvdXJjZSBjb2RlIHRvIG1ha2UgaXQgbW9yZSBtYW5hZ2FibGU7IGFzIGEKLQkgIHNpZGUgZWZmZWN0LCBncHJvZiBub3cgY29tcGlsZXMgY2xlYW5seSB3aXRoICJnY2MgLVdhbGwiCi0KLQlUaHUgU2VwCSAxIDE1OjQ2OjQ5IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgaXMgbm93IHVzZWQgYXMgYQotCWZpbmFsIGNyb3NzLWNoZWNrIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGljIHN5bWJvbCBzaG91bGQgYmUKLQljb25zaWRlcmVkIGFzIGEgZnVuY3Rpb24tbmFtZS4KLQotCUZyaSBBdWcJIDUgMTk6MzI6MzYgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IHJlY29nbml6ZSAiLSIgYXMgdGhlIGZpbGVuYW1lIGZvcgotCXN0ZGluOyB0aGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FubmEga2VlcCBnbW9uLm91dCBmaWxlcyBjb21wcmVzc2VkOwotCXRoaXMgd2F5IHlvdSBjYW4gImd6Y2F0IiB0aGUgY29tcHJlc3NlZCBmaWxlIGludG8gZ3Byb2YuCi0KLQkqIGdwcm9mLmM6IGZsYWdfbWluX2NvdW50IG5vdyBpbml0aWFsaXplZCB3aXRoIDEgaW5zdGVhZCBvZiAwLgotCi0JKiBiYXNpY19ibG9ja3MuYyAoYmJfYW5ub3RhdGVfc291cmNlKTogYWRkZWQgc3VwcG9ydCBmb3IgY3JlYXRpbmcKLQkudGNvdiBmaWxlcyB3aGVuIG9wdGlvbiBmbGFnX2Fubm90YXRlX21ha2VfZmlsZXMgaXMgVFJVRS4KLQkoYW5ub3RhdGVfd2l0aF9jb3VudCk6IGFsbCBjb3VudHMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIGNvdW50Ci0Jc3BlY2lmaWVkIGJ5IC1tIGFyZSBub3cgYW5ub3RhdGVkIHdpdGggaGFzaC1tYXJrcy4KLQotCSogZ3Byb2YuYyAobWFpbik6IC1BIGlzIG5vdyBmb2xsb3dlZCBieSBhIHN0cmluZyBvZiBvcHRpb24gY2hhcnMuCi0KLQkqIGJhc2ljX2Jsb2Nrcy5jIChhbm5vdGF0ZV93aXRoX2NvdW50KTogcmVwbGFjZWQgYi0+Y291bnQgd2l0aAotCWNudC4KLQotCSogc291cmNlLmM6IGZsYWdfYW5ub3RhdGVfc291cmNlIHJlcGxhY2VkIGJ5IHNvdXJjZV9sb2NrX21hcC4KLQotCSogc291cmNlLmg6IHNvdXJjZV9sb2NrX21hcCBhZGRlZC4KLQotCSogZ3Byb2YuYyAobWFpbik6IG5ldyBjb21tYW5kLWxpbmUgc3ludGF4OiAtUyBzaW1wbHkgc3BlY2lmaWVzCi0Jd2hpY2ggc291cmNlLWZpbGVzIHVzZXIgaXMgaW50ZXJlc3RlZCBpbjsgLUEgcmVxdWVzdHMgYW5ub3RhdGVkCi0Jc291cmNlIGZpbGVzIGFuZCAtQUEgcmVxdWVzdHMgdGhhdCBhbGwgbGluZXMgaW4gYSBzb3VyY2UgZmlsZQotCWFyZSBhbm5vdGF0ZWQuCi0KLQlUaHUgQXVnCSA0IDIzOjI3OjAzIDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBiYXNpY19ibG9ja3MuYyAoUEFUSF9NQVgpOiBpZiB1bmRlZmluZWQsIGRlZmluZSBhcyAxMDI0LgotCi0JKiBzcGFyYy5jLCBpMzg2LmMsIHRhaG9lLmMsIHZheC5jOiBhZGRlZCBpbmNsdWRlIG9mICJ0aW1lX2hpc3QuaCIKLQlzbyBzX2xvd3BjIGV0Yy4gZ2V0IGRlY2xhcmVkLgotCi0JKiBhcmNzLmggKGRvYXJjcyk6IGNyZWF0ZWQuCi0KLQkqIGFyY3MuYzogcmVvcmRlcmVkIHN0YXRpYyBmdW5jdGlvbnMgc3VjaCB0aGF0IHRoZXkgZ2V0IGRlZmluZWQKLQliZWZvcmUgdXNlLgotCi0JKiBncHJvZi5jIChtYWluKTogYWRkZWQgb3B0aW9uczoKLQkgICAtQTogcmVxdWVzdCBhbm5vdGF0aW9uIG9mIGFsbCBzb3VyY2UgbGluZXMgKHdpdGggLVMpCi0JICAgLW06IG1pbmltdW0gZXhlY3V0aW9uIGNvdW50ICh3aXRoIGRlZmF1bHQgYmFzaWMtYmxvY2sgZGlzcGxheSkKLQkgICAtTjogZm9yY2UgbmV3IGZpbGUgZm9ybWF0IChvbmx5IGlmIEJTRF9DT01QQVRJQkxFIGlzIGRlZmluZWQpCi0JICAgLVM6IGFubm90YXRlIHNvdXJjZSBmaWxlCi0JICAgLXQ6IHNldCB0YWJsZSBsZW5ndGggKHdpdGggLVMpCi0KLQkqIE1ha2VmaWxlIChPQkpTKTogYWRkZWQgYmFzaWNfYmxvY2tzLm8gY2FsbF9ncmFwaC5vIGdtb25faW8ubwotCXNvdXJjZS5vIHRpbWVfaGlzdC5vCi0KLQlGcmkgSnVsCSAxIDE1OjIzOjUwIDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBncHJvZi5jIChhc2duc2FtcGxlcyk6IGNvbXB1dGF0aW9uIG9mICJwY2wiIGFuZCAicGNoIiBkZXBlbmRlZAotCW9uIHRoZSBmYWN0IGJlaW5nIGFibGUgdG8gc3RvcmUgYSBsb25nIGluIGEgZG91YmxlIHdpdGhvdXQgbG9zcyBvZgotCXByZWNpc2lvbjsgdGhpcyBkb2VzIG5vdCBob2xkIG9uIG1hY2hpbmVzIHdpdGggNjQgYml0IGxvbmdzIGFuZCA2NAotCWJpdCBkb3VibGVzLgotCi1GcmkgT2N0IDIxIDE4OjU4OjAyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHByaW50Z3Byb2YuYyAoZmxhdHByb2ZoZWFkZXIpOiBBbHdheXMgc2V0IHRvdGltZSB0byAxLjAgaWYgbm90Ci0JZ3JlYXRlciB0aGFuIDAuMC4gIFN1Z2dlc3RlZCBieSBIYXJvbGQgQXNzaW5rCi0JPGNhcmxvQHNnLnRuLnR1ZGVsZnQubmw+LgotCi1GcmkgU2VwIDIzIDE1OjA2OjQ1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHByaW50Z3Byb2YuYyAocHJpbnRwcm9mKTogVXNlIGZyZWUsIG5vdCBjZnJlZS4KLQkocHJpbnRncHJvZiwgcHJpbnRpbmRleCk6IERpdHRvLgotCi1UaHUgU2VwICAxIDEwOjQwOjQ1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBncHJvZi5oIChrZnJvbWxpc3QsIGt0b2xpc3QsIGZsaXN0LCBGbGlzdCwgZWxpc3QsIEVsaXN0KTogTWFrZQotCWRlY2xzIGV4dGVybiB0byBrZWVwIG5hdGl2ZSBIUCBjb21waWxlciBxdWlldC4KLQotVHVlIEF1ZyAzMCAxMToxMjoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKGZ1bmNzeW1ib2wpOiBJZ25vcmUgX19fZ251X2NvbXBpbGVkIGFzIHdlbGwgYXMKLQlfX2dudV9jb21waWxlZCwgZm9yIHRoZSBiZW5lZml0IG9mIHN5c3RlbXMgd2hpY2ggYWRkIGEgbGVhZGluZwotCXVuZGVyc2NvcmUuCi0KLVdlZCBBdWcgMjQgMTI6NDk6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBpMzg2LSotKiB0byBpWzM0NV04Ni0qLSouCi0KLVN1biBKdWwgMTAgMDA6MzU6MzEgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIG5zNTMyLmMsIG5zNTMyLmg6IE5ldyBGaWxlcy4gbnM1MzIgc3VwcG9ydC4KLQotCSogY29uZmlnL210LW5zNTMyOiBOZXcgRmlsZS4gbnM1MzIgc3VwcG9ydC4KLQotCSogZ3Byb2YuYzogdXNlciByZWdpc3RlciBpbnQgaSBpbnN0ZWFkIG9mIGRlZmF1bHRpbmcgdGhlIGludC4KLQlBbGxvd3MgY29tcGlsYXRpb24gd2l0aCAtRHJlZ2lzdGVyPSBmb3IgZGVidWdnaW5nLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBuczUzMiBzdXBwb3J0LgotCi1UaHUgSnVuIDIzIDExOjIyOjQxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoZ3Byb2YpOiBEZXBlbmQgb24gJChMSUJTKS4KLQotRnJpIE1heSAyNyAxMjoyNDo1NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JRnJvbSBiaW51dGlscy0yLjQgcmVsZWFzZToKLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiBbbmV3XSBidWlsZCBtYWtlZmlsZSBmcm9tIG1ha2VmaWxlLmluIChkb3MpCi0JKiBoZXJ0ei5jOiBhbGxvdyBzdGF0aWMgSEVSVFogKG1zZG9zIG5lZWRzIGl0KQotCSogZ3Byb2YuYzogYWxsb3cgdGFyZ2V0IHRvIHNlbGVjdCAiciIgb3IgInJiIiBmb3IgZm9wZW4KLQkqIGdwcm9mLmM6IGlnbm9yZSBfX2dudV9jb21waWxlZCBzeW1ib2xzCi0JKiBpMzg2Lmg6IGRmaW5lIEZPUEVOX1JCIHRvICJyYiIgZm9yIGRvcy4KLQotVHVlIE1heSAxNyAxNTozMDoyMiAxOTk0ICBFLiBNaWNoYWVsIFNtaXRoIChlbXNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKC5tLmM6KTogIEFkZGVkIC5TVUZGSVhFUyA6IC5tIAotCXNvIGZsYXRfYmwuYyB3b3VsZCBtYWtlIGZyb20gZmxhdF9ibC5tIGZpbGUuCi0KLVRodSBNYXkgIDUgMTk6MjM6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IENoZWNrIGZvciBncHJvZi5pbmZvIGluIGJ1aWxkIGRpciwKLQlmYWxsIGJhY2sgdG8gc3JjZGlyLiAgRGVwZW5kIG9uIGl0LgotCi0JKiBncHJvZi5oIChUUlVFLCBGQUxTRSk6IEFsd2F5cyB1c2UgdW5kZWYgYmVmb3JlIGRlZmluaW5nIHRoZW0uCi0KLU1vbiBBcHIgIDQgMjM6NDc6MzAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChNWV9NQUNISU5FKTogUmVuYW1lZCBmcm9tIE1BQ0hJTkUgdG8gYXZvaWQgbG9zaW5nCi0JbWFrZXMgKG9zZjEpIGluIHdoaWNoIHRoZSB2YWx1ZSBvZiBNQUNISU5FIGNhbiBub3QgYmUgY2hhbmdlZC4KLQkqIGNvbmZpZy8qLm10OiBDaGFuZ2VkIGFwcHJvcHJpYXRlbHkuCi0KLVdlZCBNYXIgMzAgMTY6MTI6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChnZXRzeW10YWIpOiBDaGFuZ2Ugbm9zeW1zIHRvIGxvbmcuICBSZW5hbWUKLQlnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLiAgQ2hlY2sgZm9yCi0JZXJyb3JzIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0KLVR1ZSBNYXIgMjIgMTA6NTA6NTIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdwcm9mLmMgKGZ1bmNzeW1ib2wpOiBVc2UgYmZkX2dldF9zeW1ib2xfaW5mbyBpbnN0ZWFkIG9mCi0JYmZkX2RlY29kZV9zeW1jbGFzcy4KLQotU3VuIE1hciAyMCAxNTo0MDoyMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW46IEF2b2lkIGJ1ZyBpbiBocHV4IHNlZC4KLQotV2VkIERlYyAxNSAyMDoxNjo0MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLnRleGkgKEludm9raW5nKTogYWRkIHRleHQgYWJvdXQgLXYgZmxhZwotCi0JKiBncHJvZi4xOiBhZGQgdGV4dCBhYm91dCAtdiBmbGFnCi0KLVdlZCBEZWMgIDggMTY6NTU6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChWRVJTSU9OKTogZGVmaW5lZCBhIHZlcnNpb24gbWFjcm8sIHByaW50IHRoZSB2YWx1ZSAKLQl3aGVuIHRoZSAtdiBvcHRpb24gaXMgdXNlZAotCi1UdWUgSnVsICA2IDEwOjExOjU2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBJbnN0YWxsIGNvcnJlY3RseS4KLQotVGh1IEp1biAyNCAxNDo0MzoyMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKG1haW4pOiBHZXQgd2hvYW1pIGZyb20gYXJndiwgaW5zdGVhZCBvZiBoYXJkY29kaW5nLgotCVVzZSBpdCBpbiB1c2FnZSBtZXNzYWdlLiAgU3BsaXQgdXNhZ2UgbWVzc2FnZSB0byBmaXQgaW4gODAgY29scy4KLQotU3VuIEp1biAyMCAyMDo1ODowMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFVuZG8gMTUgSnVuZSBjaGFuZ2UuCi0KLVdlZCBKdW4gMTYgMTI6NTQ6NTMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogZ21vbi5oLCBncHJvZi5oOiBzdHJ1Y3RzIG9mIGNoYXJzIHVzZWQgdG8gaG9sZCBleHRlcm5hbAotCXJlcHJlc2VudGF0aW9ucy4KLQkqIGdwcm9mLmMgKGdldHBmaWxlLCBvcGVucGZpbGUsIHJlYWRzYW1wbGVzKTogU3dhcCBkYXRhIGluIHVzaW5nCi0JbmV3IHN0cnVjdHVyZXMuCi0KLVR1ZSBKdW4gMTUgMjM6MDk6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IExvb2sgaW4gLi4vaW5jbHVkZSwgbm90IC4uL2JmZCwgZm9yIGJmZC5oLgotCi1Nb24gSnVuIDE0IDE2OjIyOjU5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydAotCi1Nb24gSnVuICA3IDEyOjU2OjE3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogIEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgotCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KLQotVHVlIE1heSAxOCAyMTo0NDoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogc2hvdWxkIG5vdCBkZXBlbmQgb24gaW5zdGFsbC1pbmZvCi0KLU1vbiBBcHIgMjYgMTI6Mzc6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBncHJvZi5oOiBJbmNsdWRlIGFuc2lkZWNsLmggYmVmb3JlIHN5c2RlcC5oLiAgVW5kZWZpbmUgaHouCi0KLVR1ZSBBcHIgMTMgMTY6MTQ6MDMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE0gTWFrZWZpbGUuaW46ICBBZGQgLWcgdG8gQ0ZMQUdTLgotCUFkcyBMREZMQUdTIGFuZCB1c2UgaW4gcGxhY2Ugb2YgQ0ZMQUdTIHdoZXJlIGFwcHJvcHJpYXRlLgotCSogY29uZmlndXJlLmluOiAgTWFrZSBhIHN5c2RlcC5obGluayBpbiB0aGUgc2FtZSB3YXkgb3RoZXIKLQliZmQtYmFzZWQgZGlyZWN0b3JpZXMgZG8uCi0JKiBncHJvZi5oIChVTklUKTogIFJlcGxhY2Ugbm9uLXN0YW5kYXJkICd1X3Nob3J0JyBieSAndW5zaWduZWQKLQlzaG9ydCcuCi0JKiBncHJvZi5oOiAgI2luY2x1ZGUgc3lzZGVwLmggaW5zdGVhZCBvZiBhIGJ1bmNoIG9mIHN0dWZmLgotCSogZ3Byb2YuYyAobWFpbik6ICBGaXggdHlwbyBncHJvZmYtPmdwcm9mLgotCi1UaHUgTWFyIDI1IDE5OjAwOjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YudGV4aTogYWRkIElORk8tRElSLUVOVFJZCi0KLVR1ZSBNYXIgMjMgMDA6MDM6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayB0YXJnZXQKLQotU2F0IEZlYiAyNyAxODoxNzoxMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKGZ1bmNzeW1ib2wpOiAgSW52ZXJ0IHRlc3QgZm9yIGFmbGFnLgotCi1UaHUgRmViIDI1IDE2OjAxOjUwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogcHJpbnRncHJvZiAoeG1hbGxvYywgeHJlYWxsb2MpOiAgQ2FzdCByZXN1bHRzIG9mIG1hbGxvYwotCWFuZCByZWFsbG9jIHRvIFBUUi4KLQotV2VkIEZlYiAgMyAxMzo1NTozMyAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY3JlYXRlZCBpbmZvLCBpbnN0YWxsLWluZm8sIGR2aQotCi1XZWQgSmFuICA2IDAwOjU4OjA5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCBpbnN0YWxsIHJ1bGUgZm9yICQoUFJPRykKLQotRnJpIE9jdCAgOSAxMToyNTo0MSAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBncHJvZi4xOiB1cGRhdGVkIFNZTk9QU0lTIHRvIG1hdGNoIGFjdHVhbCBiZWhhdmlvci4KLQotTW9uIE9jdCAgNSAxNzo1MDoxNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogZ2VuLWMtcHJvZy5hd2s6ICBOZXcgYXdrIHNjcmlwdCwgbGlnaHRseSBjaGFuZ2VkIGZyb20KLQlwcmV2aW91c2x5IGRlbGV0ZWQgbWFrZS1jLXByb2cuYXdrLiAgQ29udmVydHMgYSB0ZXh0IGZpbGUKLQl0byBhIGMgZnVuY3Rpb24gdGhhdCBwcmludHMgdGhhdCB0ZXh0LgotCSogZmxhdF9ibC5tLCBmc2ZfY2FsbGdfYmwubSwgYnNkX2NhbGxnX2JsLm06ICBOZXcgZmlsZXMuCi0JSW5wdXRzIHRvIGdlbi1jLXByb2cuYXdrLCBjb250YWluaW5nIHRleHQgZGVzY3JpYmluZwotCWdwcm9mIG91dHB1dC4KLQkqIGJsdXJicy5jOiAgUmVtb3ZlZC4gIFVzZSAqX2JsLmMgaW5zdGVhZC4KLQkqIE1ha2VmaWxlLmluOiBVc2UgZ2VuLWNwcm9nLmF3ayB0byBnZW5lcmF0ZSAqX2JsLmMgZmlsZXMKLQlmcm9tICpfYmwubSBmaWxlcy4gIEFsc28sIGltcHJvdmUgKmNsZWFuIHJ1bGVzLgotCSogcHJpbnRncHJvZi5jIChwcmludGdwcm9mKTogIFVzdyBuZXcgZnVuY3Rpb24gbmFtZXMgZnJvbSAqX2JsLmMuCi0JCi0KLVN1biBBdWcgMzAgMTk6NTQ6NTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBncHJvZi5oLCBncHJvZi5jLCBwcmludGZncHJvZi5jOiAgQWRkIHN1cHBvcnQgZm9yIHR3bwotCW91dHB1dCBzdHlsZXM6ICBUaGUgZGVmYXVsdCBpcyBzaW1pbGFyIHRvIHRoZSBvbGQgRlNGIGdwcm9mLAotCXdoaWxlIC1UIHNldHMgdGhlIHZhcmlhYmxlIGJzZF9zdHlsZV9vdXRwdXQsIHdoaWNoIGNhdXNlcwotCW91dHB1dCBtYXRjaGluZyBCZXJrZWxleSdzIGdwcm9mLiAgVGhlIGJpZ2dlc3QgZGlmZmVyZW5jZXMKLQlhcmUgdGhhdCB3aXRoIHRoZSBGU0Ygc3R5bGUgb3V0cHV0LCB0aGUgZmxhdCBwcm9maWxlIGNvbWVzCi0JYmVmb3JlIHRoZSBjYWxsIGdyYXBoOyBudW1iZXJzIGNvbWUgYmVmb3JlIGV4cGxhbmF0aW9uczsKLQlhbmQgdGhlcmUgaXMgbGVzcyBncmF0dWl0b3VzIHdoaXRlIHNwYWNlLgotCSogZ3Byb2YuaCwgZ3Byb2YuYywgcHJpbnRmZ3Byb2YuYzogIE5ldyBkaXNjYXJkX3VuZGVyc2NvcmVzCi0JdmFyaWFibGUgY2F1c2VzIGRpc2NhcmRpbmcgb2YgaW5pdGlhbCB1bmRlcnNjb3JlcyB3aGVuCi0JcHJpbnRpbmcgc3ltYm9sIG5hbWVzLiAgSXQgaXMgc2V0IHVubGVzcyB0aGVyZSBpcyBhICJtYWluIgotCXN5bWJvbCAod2l0aG91dCBhbiB1bmRlcnNjb3JlKS4KLQkqIHByaW50Zmdwcm9mLmM6ICBOZXcgZnVuY3Rpb24gcHJpbnRuYW1lb25seSgpLCBjYWxsZWQKLQlieSBwcmludG5hbWUoKS4gIEl0IGhhbmRsZXMgc3RyaXBwaW5nIG9mIGluaXRpYWwgJ18nLAotCWFzIHdlbGwgYXMgQysrIG5hbWUtZGVtYW5nbGluZy4KLQkqIGdwcm9mLmNhbGxnLCBncHJvZi5mbGF0LCBtYWtlLWMtcHJvZy5hd2s6ICBSZW1vdmVkLgotCUl0IGlzIGp1c3QgYXMgY29udmVuaWVudCB0byBlZGl0IGJsdXJicy5jIGRpcmVjdGx5LgotCSogTWFrZWZpbGUuaW46ICBSZW1vdmVkIHJ1bGUgZm9yIG1ha2luZyBibHVyYnMuYy4KLQkqIGJsdXJicy5jOiAgVGhpcyBpcyBub3cgYSB0cnVlIHNvdXJjZSBmaWxlIChhcyBvcHBvc2VkCi0JdG8gYmVpbmcgZ2VuZXJhdGVkIGZyb20gZ3Byb2YuY2FsbGcgYW5kIGdwcm9mLmZsYXQpLgotCUNoYW5nZSBzdHlsZSB0byB1c2Ugb25lIGxvbmcgc3RyaW5nIGxpdGVyYWwsIGluc3RlYWQgb2YKLQlvbmUgbGl0ZXJhbCBwZXIgb3V0cHV0IGxpbmUuICBBZGQgRlNGLXN0eWxlIGJsdXJiIGZvciBjYWxsIGdyYXBoLgotCi1XZWQgQXVnIDE5IDE0OjM2OjM5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotCi1XZWQgQXVnIDEyIDE1OjE0OjE0IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGFuZ2UgJHtNQUNISU5FfSB0byAkKE1BQ0hJTkUpLgotCi1TdW4gSnVsIDE5IDE3OjM0OjAxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICByZW1vdmVkIGluc3RhbGxhdGlvbiBvZiB0aGUgbm93IHVzZWxlc3MKLQljYWxsLntmbGFnLGNhbGxnfSBmaWxlcy4gIAotCi0JKiBncHJvZi4xOiBub3cgdXNlcyB0aGUgc3RhbmRhcmQgbWFuIG1hY3JvcyBpbnN0ZWFkIG9mIHRoZSBuZXcgQlNECi0JbWFuZG9jIG1hY3Jvcy4gCi0KLVN1biBKdWwgMTIgMTk6MDY6MDAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbW92ZSBob3N0IHNlY3Rpb24sIGV4cGFuZCB0YXJnZXQgc2VjdGlvbi4KLQkqIGNvbmZpZy9tdC17dGFob2UsdmF4fTogIEFkZCwgdG8gbWF0Y2ggZXhpc3Rpbmcgc3VwcG9ydCBmaWxlcy4KLQkqIGNvbmZpZy90bWFrZS0qOiAgUmVtb3ZlIGxlZnRvdmVyIGNydWQuCi0KLQkqIGJsdXJicy5jOiAgTmV3IGZpbGUsIGNyZWF0ZWQgZnJvbSBncHJvZi5mbGF0IGFuZCBncHJvZi5jYWxsZyBieQotCSogbWFrZS1jLXByb2cuYXdrOiAgd2hpY2ggcHJvY2Vzc2VzIHRleHQgZmlsZXMgaW50byBDIHByb2dyYW1zLgotCSogcHJpbnRncHJvZi5jIChmbGF0cHJvZmhlYWRlciwgZ3Byb2ZoZWFkZXIpOiAgQ2FsbCBuZXcgZnVuY3Rpb25zCi0JdG8gcHJpbnQgYmx1cmJzLgotCShwcmludGJsdXJiKTogIFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiAgSW5mcmFzdHJ1Y3R1cmUgdG8gYnVpbGQgYmx1cmJzLgotCSogcGF0aG5hbWVzLmg6ICBoYXMgYmVlbiByZW1vdmVkLiAgR3Byb2Ygbm93IGhhcyBubyBmaWxlbmFtZQotCWRlcGVuZGVuY2llcyBpbiBpdC4KLQkqIGdwcm9mLmM6ICBMaW50LgotCi1TYXQgSnVsIDExIDE4OjA3OjIxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBtYW4xZGlyIGFuZCBpbnN0YWxsIHRoZSBtYW4gcGFnZQotCi1GcmkgSnVsIDEwIDIxOjE0OjA4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdW1teSBpbmZvIGFuZCBpbnN0YWxsLWluZm8gdGFyZ2V0cwotCi1UaHUgSnVuICA0IDExOjM0OjAyIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCi0KLQkqIGxvb2t1cC5jOiBmaXhlZCBmZW5jZXBvc3QgaW4gbmxsb29rdXAgYW5kIGFkZGVkIGRiZ19ubGxvb2t1cCBmb3IKLQloZWxwIGluIGRlYnVnZ2luZyB0aGUgcHJvYmxlbSAod2l0aCAtRERFQlVHKQotCSogZ3Byb2YuYzogc3ltYm9sIHZhbHVlcyBhcmUgbm93IHJlYWwgdmFsdWVzLCBkb24ndCBhZGQgdGhlIHZtYQotCWFueW1vcmUuIChkb25lIGZvciBzb2xhcmlzOyBzaG91bGQgdmVyaWZ5IHRoaXMgb24gb3RoZXIgcGxhdGZvcm1zKQotCSogQ2hhbmdlTG9nOiBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvTWFrZWZpbGUuYW0gYi9ncHJvZi9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxZTRjNS4uMDAwMDAwMAotLS0gYS9ncHJvZi9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUZGSVhFUyA9IC5tCi0KLVNVQkRJUlMgPSBwbwotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLURERUJVRyAtSS4uL2JmZCAtSSQoc3JjZGlyKS8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uL2JmZCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLWJpbl9QUk9HUkFNUyA9IGdwcm9mCi0KLSMjIENvbnZlbmllbmNlIHZhciBsaXN0aW5nIHB1cmUgc291cmNlcy4KLXNvdXJjZXMgPSBiYXNpY19ibG9ja3MuYyBjYWxsX2dyYXBoLmMgY2dfYXJjcy5jIGNnX2Rmbi5jIFwKLQljZ19wcmludC5jIGNvcmVmaWxlLmMgZ21vbl9pby5jIGdwcm9mLmMgaGVydHouYyBoaXN0LmMgc291cmNlLmMgXAotCXNlYXJjaF9saXN0LmMgc3ltdGFiLmMgc3ltX2lkcy5jIHV0aWxzLmMgXAotCWkzODYuYyBhbHBoYS5jIHZheC5jIHRhaG9lLmMgc3BhcmMuYwotZ3Byb2ZfU09VUkNFUyA9ICQoc291cmNlcykgZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jCi1ncHJvZl9ERVBFTkRFTkNJRVMgPSAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExERVBTKQotZ3Byb2ZfTERBREQgPSAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExMSUJTKQotCi1ub2luc3RfSEVBREVSUyA9IFwKLQliYXNpY19ibG9ja3MuaCBjYWxsX2dyYXBoLmggY2dfYXJjcy5oIGNnX2Rmbi5oIGNnX3ByaW50LmggXAotCWNvcmVmaWxlLmggZ21vbi5oIGdtb25faW8uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAotCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmgKLQotRVhUUkFfRElTVCA9IGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYyBiYmNvbnYucGwKLQotQlVJTFRfU09VUkNFUyA9IGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYwotCi1kaXN0c3R1ZmY6ICQoQlVJTFRfU09VUkNFUykgaW5mbwotCi0ubS5jOgotCWF3ayAtZiAkKHNyY2RpcikvZ2VuLWMtcHJvZy5hd2sgPiAuLyQqLmMgXAotCSAgICBGVU5DVElPTj1gKGVjaG8gJCp8c2VkIC1lICdzLC4qLywsZycgLWUgJ3MvX2JsLy8nKWBfYmx1cmIgXAotCSAgICBGSUxFPSQqLm0gJChzcmNkaXIpLyQqLm0KLQotUE9URklMRVMgPSAkKHNvdXJjZXMpICQobm9pbnN0X0hFQURFUlMpCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1pbmZvX1RFWElORk9TID0gZ3Byb2YudGV4aQotbWFuX01BTlMgPSBncHJvZi4xCi0KLSMgRGVwZW5kZW5jaWVzLgotJChPQkpFQ1RTKTogLi4vYmZkL2JmZC5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfcHJpbnQuaCBcCi0JY29yZWZpbGUuaCBnbW9uX2lvLmggZ21vbi5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCi0Jc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaCBcCi0JJChzcmNkaXIpLy4uL2luY2x1ZGUvbGliaWJlcnR5LmggJChzcmNkaXIpLy4uL2JmZC9zeXNkZXAuaCBcCi0JZ2NvbmZpZy5oIC4uL2JmZC9jb25maWcuaAotYmFzaWNfYmxvY2tzLm86IGJhc2ljX2Jsb2Nrcy5jCi1ic2RfY2FsbF9ibC5vOiBic2RfY2FsbF9ibC5jCi1jYWxsX2dyYXBoLm86IGNhbGxfZ3JhcGguYwotY2dfYXJjcy5vOiBjZ19hcmNzLmMKLWNnX2Rmbi5vOiBjZ19kZm4uYwotY2dfcHJpbnQubzogY2dfcHJpbnQuYwotY29yZWZpbGUubzogY29yZWZpbGUuYwotZmxhdF9ibC5vOiBmbGF0X2JsLmMKLWZzZl9jYWxsZ19ibC5vOiBmc2ZfY2FsbGdfYmwuYwotZ21vbl9pby5vOiBnbW9uX2lvLmMKLWdwcm9mLm86IGdwcm9mLmMKLWhlcnR6Lm86IGhlcnR6LmMKLWhpc3QubzogaGlzdC5jCi1zZWFyY2hfbGlzdC5vOiBzZWFyY2hfbGlzdC5jCi1zb3VyY2Uubzogc291cmNlLmMKLXN5bXRhYi5vOiBzeW10YWIuYwotc3ltX2lkcy5vOiBzeW1faWRzLmMKLXV0aWxzLm86IHV0aWxzLmMKLWkzODYubzogaTM4Ni5jCi1hbHBoYS5vOiBhbHBoYS5jCi12YXgubzogdmF4LmMKLXRhaG9lLm86IHRhaG9lLmMKLXNwYXJjLm86IHNwYXJjLmMKZGlmZiAtLWdpdCBhL2dwcm9mL01ha2VmaWxlLmluIGIvZ3Byb2YvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTNmZmUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3MjYgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVMgPSBAQVNACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLVNVRkZJWEVTID0gLm0KLQotU1VCRElSUyA9IHBvCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtRERFQlVHIC1JLi4vYmZkIC1JJChzcmNkaXIpLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vYmZkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotYmluX1BST0dSQU1TID0gZ3Byb2YKLQotc291cmNlcyA9IGJhc2ljX2Jsb2Nrcy5jIGNhbGxfZ3JhcGguYyBjZ19hcmNzLmMgY2dfZGZuLmMgXAotCWNnX3ByaW50LmMgY29yZWZpbGUuYyBnbW9uX2lvLmMgZ3Byb2YuYyBoZXJ0ei5jIGhpc3QuYyBzb3VyY2UuYyBcCi0Jc2VhcmNoX2xpc3QuYyBzeW10YWIuYyBzeW1faWRzLmMgdXRpbHMuYyBcCi0JaTM4Ni5jIGFscGhhLmMgdmF4LmMgdGFob2UuYyBzcGFyYy5jCi0KLWdwcm9mX1NPVVJDRVMgPSAkKHNvdXJjZXMpIGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYwotZ3Byb2ZfREVQRU5ERU5DSUVTID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLWdwcm9mX0xEQUREID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLQotbm9pbnN0X0hFQURFUlMgPSBcCi0JYmFzaWNfYmxvY2tzLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19kZm4uaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb24uaCBnbW9uX2lvLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKLQlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oCi0KLQotRVhUUkFfRElTVCA9IGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYyBiYmNvbnYucGwKLQotQlVJTFRfU09VUkNFUyA9IGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYwotCi1QT1RGSUxFUyA9ICQoc291cmNlcykgJChub2luc3RfSEVBREVSUykKLQotaW5mb19URVhJTkZPUyA9IGdwcm9mLnRleGkKLW1hbl9NQU5TID0gZ3Byb2YuMQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGdjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1iaW5fUFJPR1JBTVMgPSAgZ3Byb2YkKEVYRUVYVCkKLVBST0dSQU1TID0gICQoYmluX1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1ncHJvZl9PQkpFQ1RTID0gIGJhc2ljX2Jsb2Nrcy5vIGNhbGxfZ3JhcGgubyBjZ19hcmNzLm8gY2dfZGZuLm8gXAotY2dfcHJpbnQubyBjb3JlZmlsZS5vIGdtb25faW8ubyBncHJvZi5vIGhlcnR6Lm8gaGlzdC5vIHNvdXJjZS5vIFwKLXNlYXJjaF9saXN0Lm8gc3ltdGFiLm8gc3ltX2lkcy5vIHV0aWxzLm8gaTM4Ni5vIGFscGhhLm8gdmF4Lm8gdGFob2UubyBcCi1zcGFyYy5vIGZsYXRfYmwubyBic2RfY2FsbGdfYmwubyBmc2ZfY2FsbGdfYmwubwotZ3Byb2ZfTERGTEFHUyA9IAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gZ3Byb2YuaW5mbwotRFZJUyA9IGdwcm9mLmR2aQotVEVYSU5GT1MgPSBncHJvZi50ZXhpCi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLU1BTlMgPSAkKG1hbl9NQU5TKQotCi1OUk9GRiA9IG5yb2ZmCi1IRUFERVJTID0gICQobm9pbnN0X0hFQURFUlMpCi0KLURJU1RfQ09NTU9OID0gIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gVE9ETyBcCi1hY2xvY2FsLm00IGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gZ2NvbmZpZy5pbgotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gJChncHJvZl9TT1VSQ0VTKQotT0JKRUNUUyA9ICQoZ3Byb2ZfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmR2aSAuaW5mbyAubG8gLm0gLm8gLnBzIC5zIC50ZXhpIC50ZXhpbmZvIC50eGkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gCi0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKLQotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLSQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotCi1nY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvZ2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWdjb25maWcuaDpnY29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvZ2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGdjb25maWcuaAotCi1tYWludGFpbmVyLWNsZWFuLWhkcjoKLQotbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVM6Ci0KLWNsZWFuLWJpblBST0dSQU1TOgotCS10ZXN0IC16ICIkKGJpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoYmluX1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tYmluUFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVM6Ci0KLWluc3RhbGwtYmluUFJPR1JBTVM6ICQoYmluX1BST0dSQU1TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoYmluZGlyKQotCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWJpblBST0dSQU1TOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQlkb25lCi0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLWdwcm9mJChFWEVFWFQpOiAkKGdwcm9mX09CSkVDVFMpICQoZ3Byb2ZfREVQRU5ERU5DSUVTKQotCUBybSAtZiBncHJvZiQoRVhFRVhUKQotCSQoTElOSykgJChncHJvZl9MREZMQUdTKSAkKGdwcm9mX09CSkVDVFMpICQoZ3Byb2ZfTERBREQpICQoTElCUykKLQotZ3Byb2YuaW5mbzogZ3Byb2YudGV4aQotZ3Byb2YuZHZpOiBncHJvZi50ZXhpCi0KLQotRFZJUFMgPSBkdmlwcwotCi0udGV4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50ZXhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50eGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotLmR2aS5wczoKLQkkKERWSVBTKSAkPCAtbyAkQAotCi1pbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKLQlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKLQkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKLQkgICAgZWxzZSA6IDsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JQCQoUE9TVF9JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCi0JICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKLQkgIGRvbmU7IFwKLQllbHNlIDogOyBmaQotCi11bmluc3RhbGwtaW5mbzoKLQkkKFBSRV9VTklOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWk9eWVzOyBcCi0JZWxzZSBpaT07IGZpOyBcCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAteiAiJGlpIiBcCi0JICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAotCWRvbmUKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAotCWRvbmUKLQotZGlzdC1pbmZvOiAkKElORk9fREVQUykKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1hbWluZm86Ci0JLXJtIC1mIGdwcm9mLmF1eCBncHJvZi5jcCBncHJvZi5jcHMgZ3Byb2YuZHZpIGdwcm9mLmZuIGdwcm9mLmZucyBcCi0JICBncHJvZi5reSBncHJvZi5reXMgZ3Byb2YucHMgZ3Byb2YubG9nIGdwcm9mLnBnIGdwcm9mLnRvYyBcCi0JICBncHJvZi50cCBncHJvZi50cHMgZ3Byb2YudnIgZ3Byb2YudnJzIGdwcm9mLm9wIGdwcm9mLnRyIFwKLQkgIGdwcm9mLmN2IGdwcm9mLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotCi1pbnN0YWxsLW1hbjE6Ci0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChtYW4xZGlyKQotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCi0JICBlbHNlIGZpbGU9JCRpOyBmaTsgXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tYW4xOgotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotaW5zdGFsbC1tYW46ICQoTUFOUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLW1hbjEKLXVuaW5zdGFsbC1tYW46Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtbWFuMQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgZ2NvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUylnY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGdjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogZ2NvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtbWFuCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKSAkKEhFQURFUlMpIGdjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChiaW5kaXIpICQoREVTVERJUikkKG1hbmRpcikvbWFuMQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChCVUlMVF9TT1VSQ0VTKSIgfHwgcm0gLWYgJChCVUlMVF9TT1VSQ0VTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tdGFncyBtb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIFwKLQkJY2xlYW4tYW1pbmZvIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWJpblBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCi0JCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi10YWdzIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLWJpblBST0dSQU1TIGRpc3RjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1iaW5QUk9HUkFNUyBcCi1tYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TIHVuaW5zdGFsbC1iaW5QUk9HUkFNUyBpbnN0YWxsLWJpblBST0dSQU1TIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gXAotbW9zdGx5Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIFwKLW1haW50YWluZXItY2xlYW4tYW1pbmZvIGluc3RhbGwtbWFuMSB1bmluc3RhbGwtbWFuMSBpbnN0YWxsLW1hbiBcCi11bmluc3RhbGwtbWFuIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCi1kaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCi1kdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKLWluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBcCi1hbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotZGlzdHN0dWZmOiAkKEJVSUxUX1NPVVJDRVMpIGluZm8KLQotLm0uYzoKLQlhd2sgLWYgJChzcmNkaXIpL2dlbi1jLXByb2cuYXdrID4gLi8kKi5jIFwKLQkgICAgRlVOQ1RJT049YChlY2hvICQqfHNlZCAtZSAncywuKi8sLGcnIC1lICdzL19ibC8vJylgX2JsdXJiIFwKLQkgICAgRklMRT0kKi5tICQoc3JjZGlyKS8kKi5tCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0jIERlcGVuZGVuY2llcy4KLSQoT0JKRUNUUyk6IC4uL2JmZC9iZmQuaCBjYWxsX2dyYXBoLmggY2dfYXJjcy5oIGNnX3ByaW50LmggXAotCWNvcmVmaWxlLmggZ21vbl9pby5oIGdtb24uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAotCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmggXAotCSQoc3JjZGlyKS8uLi9pbmNsdWRlL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9iZmQvc3lzZGVwLmggXAotCWdjb25maWcuaCAuLi9iZmQvY29uZmlnLmgKLWJhc2ljX2Jsb2Nrcy5vOiBiYXNpY19ibG9ja3MuYwotYnNkX2NhbGxfYmwubzogYnNkX2NhbGxfYmwuYwotY2FsbF9ncmFwaC5vOiBjYWxsX2dyYXBoLmMKLWNnX2FyY3MubzogY2dfYXJjcy5jCi1jZ19kZm4ubzogY2dfZGZuLmMKLWNnX3ByaW50Lm86IGNnX3ByaW50LmMKLWNvcmVmaWxlLm86IGNvcmVmaWxlLmMKLWZsYXRfYmwubzogZmxhdF9ibC5jCi1mc2ZfY2FsbGdfYmwubzogZnNmX2NhbGxnX2JsLmMKLWdtb25faW8ubzogZ21vbl9pby5jCi1ncHJvZi5vOiBncHJvZi5jCi1oZXJ0ei5vOiBoZXJ0ei5jCi1oaXN0Lm86IGhpc3QuYwotc2VhcmNoX2xpc3Qubzogc2VhcmNoX2xpc3QuYwotc291cmNlLm86IHNvdXJjZS5jCi1zeW10YWIubzogc3ltdGFiLmMKLXN5bV9pZHMubzogc3ltX2lkcy5jCi11dGlscy5vOiB1dGlscy5jCi1pMzg2Lm86IGkzODYuYwotYWxwaGEubzogYWxwaGEuYwotdmF4Lm86IHZheC5jCi10YWhvZS5vOiB0YWhvZS5jCi1zcGFyYy5vOiBzcGFyYy5jCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dwcm9mL05PVEVTIGIvZ3Byb2YvTk9URVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWFmMzAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvTk9URVMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotU3VuIEZlYiAgNSAxNjowOToxNiAxOTk1Ci0KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNoYW5nZXMgYW5kIG5ldyBmZWF0dXJlcyBhdmFpbGFibGUgd2l0aCB0aGlzCi12ZXJzaW9uIG9mIEdOVSBncHJvZi4KLQotKiBOZXcgRmVhdHVyZXMKLQotIG8gTG9uZyBvcHRpb25zCi0KLSBvIFN1cHBvcnRzIGdlbmVyYWxpemVkIGZpbGUgZm9ybWF0LCB3aXRob3V0IGJyZWFraW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci0gICBuZXcgZmlsZSBmb3JtYXQgc3VwcG9ydHMgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBhbmQgbm9uLXJlYWx0aW1lCi0gICBoaXN0b2dyYW1zIChzZWUgYmVsb3cpCi0KLSBvIFN1cHBvcnRzIHByb2ZpbGluZyBhdCB0aGUgbGluZSBsZXZlbDogZmxhdCBwcm9maWxlcywgY2FsbC1ncmFwaCBwcm9maWxlcywKLSAgIGFuZCBleGVjdXRpb24tY291bnRzIGNhbiBhbGwgYmUgZGlzcGxheWVkIGF0IGEgbGV2ZWwgdGhhdCBpZGVudGlmaWVzCi0gICBpbmRpdmlkdWFsIGxpbmVzIHJhdGhlciB0aGFuIGp1c3QgZnVuY3Rpb25zCi0KLSBvIFRlc3QtY292ZXJhZ2Ugc3VwcG9ydCAoc2ltaWxhciB0byBTdW4gdGNvdiBwcm9ncmFtKTogc291cmNlIGZpbGVzCi0gICBjYW4gYmUgYW5ub3RhdGVkIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBhIGZ1bmN0aW9uIHdhcyBpbnZva2VkCi0gICBvciB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBiYXNpYy1ibG9jayBpbiBhIGZ1bmN0aW9uIHdhcwotICAgZXhlY3V0ZWQKLQotIG8gR2VuZXJhbGl6ZWQgaGlzdG9ncmFtczogbm90IGp1c3QgZXhlY3V0aW9uLXRpbWUsIGJ1dCBhcmJpdHJhcnkKLSAgIGhpc3RvZ3JhbXMgYXJlIHN1cHBvcnQgKGZvciBleGFtcGxlLCBwZXJmb3JtYW5jZSBjb3VudGVyIGJhc2VkCi0gICBwcm9maWxlcykKLQotIG8gUG93ZXJmdWwgbWVjaGFuaXNtIHRvIHNlbGVjdCBkYXRhIHRvIGJlIGluY2x1ZGVkL2V4Y2x1ZGVkIGZyb20KLSAgIGFuYWx5c2lzIGFuZC9vciBvdXRwdXQKLQotIG8gU3VwcG9ydCBmb3IgREVDIE9TRi8xIHYzLjAKLQotIG8gRnVsbCBjcm9zcy1wbGF0Zm9ybSBwcm9maWxpbmcgc3VwcG9ydDogZ3Byb2YgdXNlcyBCRkQgdG8gc3VwcG9ydAotICAgYXJiaXRyYXJ5LCBub24tbmF0aXZlIG9iamVjdCBmaWxlIGZvcm1hdHMgYW5kIG5vbi1uYXRpdmUgYnl0ZS1vcmRlcnMKLSAgICh0aGlzIGZlYXR1cmUgaGFzIG5vdCBiZWVuIHRlc3RlZCB5ZXQpCi0KLSBvIEluIHRoZSBjYWxsLWdyYXBoIGZ1bmN0aW9uIGluZGV4LCBzdGF0aWMgZnVuY3Rpb24gbmFtZXMgYXJlIG5vdwotICAgcHJpbnRlZCB0b2dldGhlciB3aXRoIHRoZSBmaWxlbmFtZSBpbiB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQKLSAgIChyZXF1aXJlZCBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKSBzdXBwb3J0IGFuZCBzeW1ib2xpYyBkZWJ1Z2dpbmcKLSAgICBpbmZvcm1hdGlvbiB0byBiZSBwcmVzZW50IGluIHRoZSBleGVjdXRhYmxlIGZpbGUpCi0KLSBvIE1ham9yIG92ZXJoYXVsIG9mIHNvdXJjZSBjb2RlIChjb21waWxlcyBjbGVhbmx5IHdpdGggLVdhbGwsIGV0Yy4pCi0KLSogU3VwcG9ydGVkIFBsYXRmb3JtcwotCi1UaGUgY3VycmVudCB2ZXJzaW9uIGlzIGtub3duIHRvIHdvcmsgb246Ci0KLSBvIERFQyBPU0YvMSB2My4wCi0JQWxsIGZlYXR1cmVzIHN1cHBvcnRlZC4KLQotIG8gU3VuT1MgNC4xLngKLQlBbGwgZmVhdHVyZXMgc3VwcG9ydGVkLgotCi0gbyBTb2xhcmlzIDIuMwotCUxpbmUtbGV2ZWwgcHJvZmlsaW5nIHVuc3VwcG9ydGVkIGJlY2F1c2UgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkKLQlpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgZm9yIEVsZiBiaW5hcmllcy4KLQotIG8gSFAtVVggOS4wMQotCUxpbmUtbGV2ZWwgcHJvZmlsaW5nIHVuc3VwcG9ydGVkIGJlY2F1c2UgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkKLQlpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgZm9yIFNPTSBiaW5hcmllcy4KLQotKiBEZXRhaWxlZCBEZXNjcmlwdGlvbgotCi0qKiBVc2VyIEludGVyZmFjZSBDaGFuZ2VzCi0KLVRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggZWFybGllcgotdmVyc2lvbnMgb2YgR05VIGdwcm9mIGFuZCBCZXJrZWxleSBncHJvZi4gIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcwotdGhlIG9wdGlvbiB0byBkZWxldGUgYXJjcyBmcm9tIHRoZSBjYWxsIGdyYXBoLiAgVGhlIG9sZCBzeW50YXgKLXdhczoKLQotCS1rIGZyb21uYW1lIHRvbmFtZQotCi13aGlsZSB0aGUgbmV3IHN5bnRheCBpczoKLQotCS1rIGZyb21uYW1lL3RvbmFtZQotCi1UaGlzIGNoYW5nZSB3YXMgbmVjZXNzYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBsb25nLW9wdGlvbiBwYXJzaW5nLgotQWxzbywgImZyb21uYW1lIiBhbmQgInRvbmFtZSIgY2FuIG5vdyBiZSBhcmJpdHJhcnkgc3ltc3BlY3MgcmF0aGVyCi10aGFuIGp1c3QgZnVuY3Rpb24gbmFtZXMgKHNlZSBiZWxvdyBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygc3ltc3BlY3MpLgotRm9yIGV4YW1wbGUsIG9wdGlvbiAiLWsgZ3Byb2YuYy8iIHN1cHByZXNzZXMgYWxsIGFyY3MgZHVlIHRvIGNhbGxzIG91dAotb2YgZmlsZSAiZ3Byb2YuYyIuCi0KLSoqKiBTeW0gU3BlY3MKLQotSXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRvIGFwcGx5IGdwcm9mIG9ubHkgdG8gc3BlY2lmaWMgcGFydHMgb2YgYQotcHJvZ3JhbS4gIEdOVSBncHJvZiBoYXMgYSBzaW1wbGUgYnV0IHBvd2VyZnVsIG1lY2hhbmlzbSB0byBhY2hpZXZlCi10aGlzLiAgU28gY2FsbGVkIHtcZW0gc3ltc3BlY3NcL30gcHJvdmlkZSB0aGUgZm91bmRhdGlvbiBmb3IgdGhpcwotbWVjaGFuaXNtLiAgQSBzeW1zcGVjIHNlbGVjdHMgdGhlIHBhcnRzIG9mIGEgcHJvZmlsZWQgcHJvZ3JhbSB0byB3aGljaAotYW4gb3BlcmF0aW9uIHNob3VsZCBiZSBhcHBsaWVkIHRvLiAgVGhlIHN5bnRheCBvZiBhIHN5bXNwZWMgaXMKLXNpbXBsZToKLQotCSAgZmlsZW5hbWVfY29udGFpbmluZ19hX2RvdAotCXwgZnVuY25hbWVfbm90X2NvbnRhaW5pbmdfYV9kb3QKLQl8IGxpbmVudW1iZXIKLQl8ICggWyBhbnlfZmlsZW5hbWUgXSBgOicgKCBhbnlfZnVuY25hbWUgfCBsaW5lbnVtYmVyICkgKQotCi1IZXJlIGFyZSBzb21lIGV4YW1wbGVzOgotCi0JbWFpbi5jCQkJU2VsZWN0cyBldmVyeXRoaW5nIGluIGZpbGUgIm1haW4uYyItLS10aGUKLQkJCQlkb3QgaW4gdGhlIHN0cmluZyB0ZWxscyBncHJvZiB0byBpbnRlcnByZXQKLQkJCQl0aGUgc3RyaW5nIGFzIGEgZmlsZW5hbWUsIHJhdGhlciB0aGFuIGFzCi0JCQkJYSBmdW5jdGlvbiBuYW1lLiAgVG8gc2VsZWN0IGEgZmlsZSB3aG9zZQotCQkJCW5hbWUgZG9lcyBjb250YWluIGEgZG90LCBhIHRyYWlsaW5nIGNvbG9uCi0JCQkJc2hvdWxkIGJlIHNwZWNpZmllZC4gIEZvciBleGFtcGxlLCAib2RkOiIgaXMKLQkJCQlpbnRlcnByZXRlZCBhcyB0aGUgZmlsZSBuYW1lZCAib2RkIi4KLQotCW1haW4JCQlTZWxlY3RzIGFsbCBmdW5jdGlvbnMgbmFtZWQgIm1haW4iLiAgTm90aWNlCi0JCQkJdGhhdCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZQotCQkJCXNhbWUgZnVuY3Rpb24gbmFtZSBiZWNhdXNlIHNvbWUgb2YgdGhlCi0JCQkJZGVmaW5pdGlvbnMgbWF5IGJlIGxvY2FsIChpLmUuLCBzdGF0aWMpLgotCQkJCVVubGVzcyBhIGZ1bmN0aW9uIG5hbWUgaXMgdW5pcXVlIGluIGEgcHJvZ3JhbSwKLQkJCQl5b3UgbXVzdCB1c2UgdGhlIGNvbG9uIG5vdGF0aW9uIGV4cGxhaW5lZAotCQkJCWJlbG93IHRvIHNwZWNpZnkgYSBmdW5jdGlvbiBmcm9tIGEgc3BlY2lmaWMKLQkJCQlzb3VyY2UgZmlsZS4gIFNvbWV0aW1lcywgZnVuY3Rpb25uYW1lcyBjb250YWluCi0JCQkJZG90cy4gIEluIHN1Y2ggY2FzZXMsIGl0IGlzIG5lY2Vzc2FyIHRvCi0JCQkJYWRkIGEgbGVhZGluZyBjb2xvbiB0byB0aGUgbmFtZS4gIEZvciBleGFtcGxlLAotCQkJCSI6Lm11bCIgc2VsZWN0cyBmdW5jdGlvbiAiLm11bCIuCi0JCQkJCi0JbWFpbi5jOm1haW4JCVNlbGVjdHMgZnVuY3Rpb24gIm1haW4iIGluIGZpbGUgIm1haW4uYyIuCi0KLQltYWluLmM6MTM0CQlTZWxlY3RzIGxpbmUgMTM0IGluIGZpbGUgIm1haW4uYyIuCi0KLUlNUExFTUVOVEFUSU9OIE5PVEU6IFRoZSBzb3VyY2UgY29kZSB1c2VzIHRoZSB0eXBlIHN5bV9pZCBmb3Igc3ltc3BlY3MuCi1BdCBzb21lIHBvaW50LCB0aGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGNoYW5nZWQgdG8gInN5bV9zcGVjIiB0byBtYWtlCi1yZWFkaW5nIHRoZSBjb2RlIGVhc2llci4KLQotKioqIExvbmcgb3B0aW9ucwotCi1HTlUgZ3Byb2Ygbm93IHN1cHBvcnRzIGxvbmcgb3B0aW9ucy4gIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIGFsbAotc3VwcG9ydGVkIG9wdGlvbnMuICBPcHRpb25zIHRoYXQgYXJlIGxpc3RlZCB3aXRob3V0IGRlc2NyaXB0aW9uCi1vcGVyYXRlIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgY29ycmVzcG9uZGluZyBvcHRpb24gaW4gb2xkZXIKLXZlcnNpb25zIG9mIGdwcm9mLgotCi1TaG9ydCBGb3JtOglMb25nIEZvcm06Ci0tLS0tLS0tLS0tLQktLS0tLS0tLS0tCi0tbAkJLS1saW5lCi0JCQlSZXF1ZXN0IHByb2ZpbGluZyBhdCB0aGUgbGluZS1sZXZlbCByYXRoZXIKLQkJCXRoYW4ganVzdCBhdCB0aGUgZnVuY3Rpb24gbGV2ZWwuICBTb3VyY2UKLQkJCWxpbmVzIGFyZSBpZGVudGlmaWVkIGJ5IHN5bWJvbHMgb2YgdGhlIGZvcm06Ci0KLQkJCQlmdW5jIChmaWxlOmxpbmUpCi0KLQkJCXdoZXJlICJmdW5jIiBpcyB0aGUgZnVuY3Rpb24gbmFtZSwgImZpbGUiIGlzIHRoZQotCQkJZmlsZSBuYW1lIGFuZCAibGluZSIgaXMgdGhlIGxpbmUtbnVtYmVyIHRoYXQKLQkJCWNvcnJlc3BvbmRzIHRvIHRoZSBsaW5lLgotCi0JCQlUbyB3b3JrIHByb3Blcmx5LCB0aGUgYmluYXJ5IG11c3QgY29udGFpbiBzeW1ib2xpYwotCQkJZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBzb3VyY2UKLQkJCWhhdmUgdG8gYmUgdHJhbnNsYXRlZCB3aXRoIG9wdGlvbiAiLWciIHNwZWNpZmllZC4KLQkJCUZ1bmN0aW9ucyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gc3ltYm9saWMgZGVidWdnaW5nCi0JCQlpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXJlIHRyZWF0ZWQgYXMgaWYgIi0tbGluZSIKLQkJCWhhZCBub3QgYmVlbiBzcGVjaWZpZWQuICBIb3dldmVyLCB0aGUgbGluZSBudW1iZXIKLQkJCXByaW50ZWQgd2l0aCBzdWNoIHN5bWJvbHMgaXMgdXN1YWxseSBpbmNvcnJlY3QKLQkJCWFuZCBzaG91bGQgYmUgaWdub3JlZC4KLQotLWEJCS0tbm8tc3RhdGljCi0tQVtzeW1zcGVjXQktLWFubm90YXRlZC1zb3VyY2VbPXN5bXNwZWNdCi0JCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhbm5vdGF0ZWQgc291cmNlCi0JCQlmaWxlcy4gIElmICJzeW1zcGVjIiBpcyBzcGVjaWZpZWQsIHByaW50IG91dHB1dCBvbmx5Ci0JCQlmb3Igc3ltYm9scyBzZWxlY3RlZCBieSAic3ltc3BlYyIuICBJZiB0aGUgb3B0aW9uCi0JCQlpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIGFubm90YXRlZCBvdXRwdXQgaXMKLQkJCWdlbmVyYXRlZCBmb3IgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotCQkJRXhhbXBsZXM6Ci0KLQkJCSAgLUEJCVByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZvciBhbGwKLQkJCQkJc291cmNlIGZpbGVzLgotCQkJICAtQWdwcm9mLmMJUHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZm9yIGZpbGUKLQkJCQkJZ3Byb2YuYy4KLQkJCSAgLUFmb29iYXIJUHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZm9yIGZpbGVzCi0JCQkJCWNvbnRhaW5pbmcgYSBmdW5jdGlvbiBuYW1lZCAiZm9vYmFyIi4KLQkJCQkJVGhlIGVudGlyZSBmaWxlIHdpbGwgYmUgcHJpbnRlZCwgYnV0Ci0JCQkJCW9ubHkgdGhlIGZ1bmN0aW9uIGl0c2VsZiB3aWxsIGJlCi0JCQkJCWFubm90YXRlZCB3aXRoIHByb2ZpbGUgZGF0YS4KLQotLUpbc3ltc3BlY10JLS1uby1hbm5vdGF0ZWQtc291cmNlWz1zeW1zcGVjXQotCQkJU3VwcHJlc3MgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQuICBJZiBzcGVjaWZpZWQKLQkJCXdpdGhvdXQgYXJndW1lbnQsIGFubm90YXRlZCBvdXRwdXQgaXMgc3VwcHJlc3NlZAotCQkJY29tcGxldGVseS4gIFdpdGggYW4gYXJndW1lbnQsIGFubm90YXRlZCBvdXRwdXQKLQkJCWlzIHN1cHByZXNzZWQgb25seSBmb3IgdGhlIHN5bWJvbHMgc2VsZWN0ZWQgYnkKLQkJCSJzeW1zcGVjIi4gIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlCi0JCQl0aW1lcywgYW5ub3RhdGVkIG91dHB1dCBpcyBzdXBwcmVzc2VkIGZvciB0aGUKLQkJCXVuaW9uIG9mIGFsbCBzeW1zcGVjcy4gIFRoaXMgb3B0aW9uIGhhcyBsb3dlcgotCQkJcHJlY2VkZW5jZSB0aGFuIC0tYW5ub3RhdGVkLXNvdXJjZQotCi0tcFtzeW1zcGVjXQktLWZsYXQtcHJvZmlsZVs9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGEgZmxhdCBwcm9maWxlCi0JCQkodW5sZXNzIGFueSBvdGhlciBvdXRwdXQtc3R5bGUgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCSB0aGlzIG9wdGlvbiBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCkuICBJZgotCQkJInN5bXNwZWMiIGlzIHNwZWNpZmllZCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMKLQkJCXNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBpbiBmbGF0IHByb2ZpbGUuICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBmbGF0Ci0JCQlwcm9maWxlIGluY2x1ZGVzIHN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uCi0JCQlvZiBhbGwgc3ltc3BlY3MuCi0JCQkKLS1QW3N5bXNwZWNdCS0tbm8tZmxhdC1wcm9maWxlWz1zeW1zcGVjXQotCQkJU3VwcHJlc3Mgb3V0cHV0IGluIHRoZSBmbGF0IHByb2ZpbGUuICBJZiBnaXZlbgotCQkJd2l0aG91dCBhbiBhcmd1bWVudCwgdGhlIGZsYXQgcHJvZmlsZSBpcyBzdXBwcmVzc2VkCi0JCQljb21wbGV0ZWx5LiAgSWYgInN5bXNwZWMiIGlzIHNwZWNpZmllZCwgc3VwcHJlc3MKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGluIHRoZSBmbGF0IHByb2ZpbGUuICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbiBvZgotCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgaXMgc3VwcHJlc3NlZC4gIFRoaXMgb3B0aW9uCi0JCQloYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIC0tZmxhdC1wcm9maWxlLgotCi0tcVtzeW1zcGVjXQktLWdyYXBoWz1zeW1zcGVjXQotCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBjYWxsLWdyYXBoCi0JCQkodW5sZXNzIGFueSBvdGhlciBvdXRwdXQtc3R5bGUgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCSB0aGlzIG9wdGlvbiBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCkuICBJZiAic3ltc3BlYyIKLQkJCWlzIHNwZWNpZmllZCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMgc2VsZWN0ZWQgYnkKLQkJCSJzeW1zcGVjIiBpbiB0aGUgY2FsbC1ncmFwaC4gIElmIHRoZSBvcHRpb24gaXMKLQkJCXNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIGNhbGwtZ3JhcGggaW5jbHVkZXMKLQkJCXN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotLVFbc3ltc3BlY10JLS1uby1ncmFwaFs9c3ltc3BlY10KLQkJCVN1cHByZXNzIG91dHB1dCBpbiB0aGUgY2FsbC1ncmFwaC4gIElmIGdpdmVuIHdpdGhvdXQKLQkJCWFuIGFyZ3VtZW50LCB0aGUgY2FsbC1ncmFwaCBpcyBzdXBwcmVzc2VkIGNvbXBsZXRlbHkuCi0JCQlXaXRoIGEgInN5bXNwZWMiLCBzdXBwcmVzcyB0aGUgc2VsZWN0ZWQgc3ltYm9scwotCQkJZnJvbSB0aGUgY2FsbC1ncmFwaC4gIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkCi0JCQltdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uIG9mIHRoZSBzZWxlY3RlZCBzeW1ib2xzCi0JCQlpcyBzdXBwcmVzc2VkLiAgVGhpcyBvcHRpb24gaGFzIGxvd2VyIHByZWNlZGVuY2UKLQkJCXRoYW4gLS1ncmFwaC4KLQotLUNbc3ltc3BlY10JLS1leGVjLWNvdW50c1s9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGV4ZWN1dGlvbiBjb3VudHMuCi0JCQlJZiAic3ltc3BlYyIgaXMgcHJlc2VudCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMKLQkJCXNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBpbiB0aGUgZXhlY3V0aW9uIGNvdW50Ci0JCQlsaXN0aW5nLiAgSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUKLQkJCXRpbWVzLCB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcgaW5jbHVkZXMKLQkJCXN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotLVpbc3ltc3BlY10JLS1uby1leGVjLWNvdW50c1s9c3ltc3BlY10KLQkJCVN1cHByZXNzIG91dHB1dCBpbiB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcuCi0JCQlJZiBnaXZlbiB3aXRob3V0IGFuIGFyZ3VtZW50LCB0aGUgbGlzdGluZyBpcwotCQkJc3VwcHJlc3NlZCBjb21wbGV0ZWx5LiAgV2l0aCBhICJzeW1zcGVjIiwgc3VwcHJlc3MKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGZyb20gdGhlIGNhbGwtZ3JhcGguICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbiBvZgotCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgaXMgc3VwcHJlc3NlZC4gIFRoaXMgb3B0aW9uCi0JCQloYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIC0tZXhlYy1jb3VudHMuCi0KLS1pCQktLWZpbGUtaW5mbwotCQkJUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2ZpbGUgZmlsZXMgdGhhdAotCQkJYXJlIHJlYWQuICBUaGUgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlCi0JCQludW1iZXIgYW5kIHR5cGVzIG9mIHJlY29yZHMgcHJlc2VudCBpbiB0aGUKLQkJCXByb2ZpbGUgZmlsZS4gIEN1cnJlbnRseSwgYSBwcm9maWxlIGZpbGUgY2FuCi0JCQljb250YWluIGFueSBudW1iZXIgYW5kIGFueSBjb21iaW5hdGlvbiBvZiBoaXN0b2dyYW0sCi0JCQljYWxsLWdyYXBoLCBvciBiYXNpYy1ibG9jayBjb3VudCByZWNvcmRzLgotCi0tcwkJLS1zdW0KLQotLXgJCS0tYWxsLWxpbmVzCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlCeSBkZWZhdWx0LCBvbmx5IHRoZSBsaW5lcyBhdCB0aGUgYmVnaW5uaW5nIG9mCi0JCQlhIGJhc2ljLWJsb2NrIGFyZSBhbm5vdGF0ZWQuICBJZiB0aGlzIG9wdGlvbiBpcwotCQkJc3BlY2lmaWVkLCBldmVyeSBsaW5lIGluIGEgYmFzaWMtYmxvY2sgaXMgYW5ub3RhdGVkCi0JCQlieSByZXBlYXRpbmcgdGhlIGFubm90YXRpb24gZm9yIHRoZSBmaXJzdCBsaW5lLgotCQkJVGhpcyBvcHRpb24gaXMgaWRlbnRpY2FsIHRvIHRjb3YncyAiLWEiLgotCi0tSSBkaXJzCQktLWRpcmVjdG9yeS1wYXRoPWRpcnMKLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLQkJCVNwZWNpZmllcyB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBiZSBzZWFyY2hlZAotCQkJZm9yIHNvdXJjZSBmaWxlcy4gIFRoZSBhcmd1bWVudCAiZGlycyIgaXMgYSBjb2xvbgotCQkJc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMuICBCeSBkZWZhdWx0LCBncHJvZgotCQkJc2VhcmNoZXMgZm9yIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudAotCQkJd29ya2luZyBkaXJlY3Rvcnkgb25seS4KLQotLXoJCS0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zCi0KLS1tIG51bQkJLS1taW4tY291bnQ9bnVtCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2UgYW5kIGV4ZWN1dGlvbgotCQkJY291bnQgb3V0cHV0IG9ubHkuICBTeW1ib2xzIHRoYXQgYXJlIGV4ZWN1dGVkCi0JCQlsZXNzIHRoYW4gIm51bSIgdGltZXMgYXJlIHN1cHByZXNzZWQuICBGb3IgYW5ub3RhdGVkCi0JCQlzb3VyY2Ugb3V0cHV0LCBzdXBwcmVzc2VkIHN5bWJvbHMgYXJlIG1hcmtlZAotCQkJYnkgZml2ZSBoYXNoLW1hcmtzICgjIyMjIykuICBJbiBhbiBleGVjdXRpb24gY291bnQKLQkJCW91dHB1dCwgc3VwcHJlc3NlZCBzeW1ib2xzIGRvIG5vdCBhcHBlYXIgYXQgYWxsLgotCi0tTAkJLS1wcmludC1wYXRoCi0JCQlOb3JtYWxseSwgc291cmNlIGZpbGVuYW1lcyBhcmUgcHJpbnRlZCB3aXRoIHRoZSBwYXRoCi0JCQljb21wb25lbnQgc3VwcHJlc3NlZC4gIFdpdGggdGhpcyBvcHRpb24sIGdwcm9mCi0JCQljYW4gYmUgZm9yY2VkIHRvIHByaW50IHRoZSBmdWxsIHBhdGhuYW1lIG9mCi0JCQlzb3VyY2UgZmlsZW5hbWVzLiAgVGhlIGZ1bGwgcGF0aG5hbWUgaXMgZGV0ZXJtaW5lZAotCQkJZnJvbSBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGltYWdlIGZpbGUKLQkJCWFuZCBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlcgotCQkJd2FzIGludm9rZWQuCi0KLS15CQktLXNlcGFyYXRlLWZpbGVzCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlOb3JtYWxseSwgZ3Byb2YgcHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZmlsZXMKLQkJCXRvIHN0YW5kYXJkLW91dHB1dC4gIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCWFubm90YXRlZCBzb3VyY2UgZm9yIGEgZmlsZSBuYW1lZCAicGF0aC9maWxlbmFtZSIKLQkJCWlzIGdlbmVyYXRlZCBpbiB0aGUgZmlsZSAiZmlsZW5hbWUtYW5uIi4gIFRoYXQgaXMsCi0JCQlhbm5vdGF0ZWQgb3V0cHV0IGlzIHtcZW0gYWx3YXlzXC99IGdlbmVyYXRlZCBpbgotCQkJZ3Byb2YncyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgQ2FyZSBoYXMgdG8KLQkJCWJlIHRha2VuIGlmIGEgcHJvZ3JhbSBjb25zaXN0cyBvZiBmaWxlcyB0aGF0IGhhdmUKLQkJCWlkZW50aWNhbCBmaWxlbmFtZXMsIGJ1dCBkaXN0aW5jdCBwYXRocy4KLQotLWMJCS0tc3RhdGljLWNhbGwtZ3JhcGgKLQotLXQgbnVtCQktLXRhYmxlLWxlbmd0aD1udW0KLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLQkJCUFmdGVyIGFubm90YXRpbmcgYSBzb3VyY2UgZmlsZSwgZ3Byb2YgZ2VuZXJhdGVzCi0JCQlhbiBleGVjdXRpb24gY291bnQgc3VtbWFyeSBjb25zaXN0aW5nIG9mIGEgdGFibGUKLQkJCW9mIGxpbmVzIHdpdGggdGhlIHRvcCBleGVjdXRpb24gY291bnRzLiAgQnkKLQkJCWRlZmF1bHQsIHRoaXMgdGFibGUgaXMgdGVuIGVudHJpZXMgbG9uZy4KLQkJCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdGFibGUgbGVuZ3RoCi0JCQlvciwgYnkgc3BlY2lmeWluZyBhbiBhcmd1bWVudCB2YWx1ZSBvZiAwLCBpdCBjYW4gYmUKLQkJCXN1cHByZXNzZWQgY29tcGxldGVseS4KLQotLW4gc3ltc3BlYwktLXRpbWU9c3ltc3BlYwotCQkJT25seSBzeW1ib2xzIHNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBhcmUgY29uc2lkZXJlZAotCQkJaW4gdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0JCQlIb3dldmVyLCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgcGVyY2VudGFnZSB0aW1lCi0JCQljb21wdXRhdGlvbiBmb3IgdGhlIGZsYXQgcHJvZmlsZS4KLQkJCUlmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24KLQkJCW9mIGFsbCBzZWxlY3RlZCBzeW1ib2xzIGlzIHVzZWQgaW4gdGltZSBjb21wdXRhdGlvbnMuCi0KLS1OCQktLW5vLXRpbWU9c3ltc3BlYwotCQkJRXhjbHVkZSB0aGUgc3ltYm9scyBzZWxlY3RlZCBieSAic3ltc3BlYyIgZnJvbQotCQkJdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0JCQlIb3dldmVyLCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgcGVyY2VudGFnZSB0aW1lCi0JCQljb21wdXRhdGlvbiBmb3IgdGhlIGZsYXQgcHJvZmlsZS4KLQkJCVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgYW55IC0tdGltZSBvcHRpb25zIGFyZQotCQkJc3BlY2lmaWVkLgotCi0tdyBudW0JCS0td2lkdGg9bnVtCi0JCQlTZXRzIHRoZSBvdXRwdXQgbGluZSB3aWR0aC4gIEN1cnJlbnRseSwgdGhpcyBvcHRpb24KLQkJCWFmZmVjdHMgdGhlIHByaW50aW5nIG9mIHRoZSBjYWxsLWdyYXBoIGZ1bmN0aW9uIGluZGV4Ci0JCQlvbmx5LgotCi0tZQkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLUUJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1mCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tRgkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLWsJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1iCQktLWJyaWVmCi0tZG51bQkJLS1kZWJ1Z1s9bnVtXQotCi0taAkJLS1oZWxwCi0JCQlQcmludHMgYSB1c2FnZSBtZXNzYWdlLgotCi0tTyBuYW1lCQktLWZpbGUtZm9ybWF0PW5hbWUKLQkJCVNlbGVjdHMgdGhlIGZvcm1hdCBvZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGVzLgotCQkJUmVjb2duaXplZCBmb3JtYXRzIGFyZSAiYXV0byIsICJic2QiLCAibWFnaWMiLAotCQkJYW5kICJwcm9mIi4gIFRoZSBsYXN0IG9uZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4KLQkJCUZvcm1hdCAiYXV0byIgYXR0ZW1wdHMgdG8gZGV0ZWN0IHRoZSBmaWxlIGZvcm1hdAotCQkJYXV0b21hdGljYWxseSAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuCi0JCQlJdCBhdHRlbXB0cyB0byByZWFkIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMgYXMKLQkJCSJtYWdpYyIgZmlsZXMgYW5kIGlmIHRoaXMgZmFpbHMsIGZhbGxzIGJhY2sgdG8KLQkJCXRoZSAiYnNkIiBmb3JtYXQuICAiYnNkIiBmb3JjZXMgZ3Byb2YgdG8gcmVhZAotCQkJdGhlIGRhdGEgZmlsZXMgaW4gdGhlIEJTRCBmb3JtYXQuICAibWFnaWMiIGZvcmNlcwotCQkJZ3Byb2YgdG8gcmVhZCB0aGUgZGF0YSBmaWxlcyBpbiB0aGUgIm1hZ2ljIiBmb3JtYXQuCi0KLS1UCQktLXRyYWRpdGlvbmFsCi0tdgkJLS12ZXJzaW9uCi0KLSoqIEZpbGUgRm9ybWF0IENoYW5nZXMKLQotVGhlIG9sZCBCU0QtZGVyaXZlZCBmb3JtYXQgdXNlZCBmb3IgcHJvZmlsZSBkYXRhIGRvZXMgbm90IGNvbnRhaW4gYQotbWFnaWMgY29va2llIHRoYXQgYWxsb3dzIHRvIGNoZWNrIHdoZXRoZXIgYSBkYXRhIGZpbGUgcmVhbGx5IGlzIGEKLWdwcm9mIGZpbGUuICBGdXJ0aGVybW9yZSwgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHZlcnNpb24gbnVtYmVyLCB0aHVzCi1yZW5kZXJpbmcgY2hhbmdlcyB0byB0aGUgZmlsZSBmb3JtYXQgYWxtb3N0IGltcG9zc2libGUuICBHTlUgZ3Byb2YKLXVzZXMgYSBuZXcgZmlsZSBmb3JtYXQgdGhhdCBwcm92aWRlcyB0aGVzZSBmZWF0dXJlcy4gIEZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSwgR05VIGdwcm9mIGNvbnRpbnVlcyB0byBzdXBwb3J0IHRoZSBvbGQgQlNELWRlcml2ZWQKLWZvcm1hdCwgYnV0IG5vdCBhbGwgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCB3aXRoIGl0LiAgRm9yIGV4YW1wbGUsCi1iYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGNhbm5vdCBiZSBhY2NvbW1vZGF0ZWQgYnkgdGhlIG9sZCBmaWxlCi1mb3JtYXQuCi0KLVRoZSBuZXcgZmlsZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZSBcZmlsZXtnbW9uX291dC5ofS4gIEl0Ci1jb25zaXN0cyBvZiBhIGhlYWRlciBjb250YWluaW5nIHRoZSBtYWdpYyBjb29raWUgYW5kIGEgdmVyc2lvbiBudW1iZXIsCi1hcyB3ZWxsIGFzIHNvbWUgc3BhcmUgYnl0ZXMgYXZhaWxhYmxlIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4gIEFsbCBkYXRhCi1pbiBhIHByb2ZpbGUgZGF0YSBmaWxlIGlzIGluIHRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZSBob3N0IG9uIHdoaWNoCi10aGUgcHJvZmlsZSB3YXMgY29sbGVjdGVkLiAgR05VIGdwcm9mIGFkYXB0cyBhdXRvbWF0aWNhbGx5IHRvIHRoZQotYnl0ZS1vcmRlciBpbiB1c2UuCi0KLUluIHRoZSBuZXcgZmlsZSBmb3JtYXQsIHRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZgotcmVjb3Jkcy4gIEN1cnJlbnRseSwgdGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCByZWNvcmQgdHlwZXM6IGhpc3RvZ3JhbQotcmVjb3JkcywgY2FsbC1ncmFwaCBhcmMgcmVjb3JkcywgYW5kIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudAotcmVjb3Jkcy4gIEVhY2ggZmlsZSBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIGVhY2ggcmVjb3JkIHR5cGUuICBXaGVuCi1yZWFkaW5nIGEgZmlsZSwgR05VIGdwcm9mIHdpbGwgZW5zdXJlIHJlY29yZHMgb2YgdGhlIHNhbWUgdHlwZSBhcmUKLWNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGFuZCBjb21wdXRlIHRoZSB1bmlvbiBvZiBhbGwgcmVjb3Jkcy4gIEZvcgotZXhhbXBsZSwgZm9yIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMsIHRoZSB1bmlvbiBpcyBzaW1wbHkgdGhlIHN1bQotb2YgYWxsIGV4ZWN1dGlvbiBjb3VudHMgZm9yIGVhY2ggYmFzaWMtYmxvY2suCi0KLSoqKiBIaXN0b2dyYW0gUmVjb3JkcwotCi1IaXN0b2dyYW0gcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIHRoYXQgaXMgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YKLWJpbnMuICBUaGUgaGVhZGVyIGNvbnRhaW5zIHRoZSB0ZXh0LXNlZ21lbnQgcmFuZ2UgdGhhdCB0aGUgaGlzdG9ncmFtCi1zcGFucywgdGhlIHNpemUgb2YgdGhlIGhpc3RvZ3JhbSBpbiBieXRlcyAodW5saWtlIGluIHRoZSBvbGQgQlNECi1mb3JtYXQsIHRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyKSwgdGhlIHJhdGUgb2YgdGhlCi1wcm9maWxpbmcgY2xvY2ssIGFuZCB0aGUgcGh5c2ljYWwgZGltZW5zaW9uIHRoYXQgdGhlIGJpbiBjb3VudHMKLXJlcHJlc2VudCBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlIHByb2ZpbGluZyBjbG9jayByYXRlLiAgVGhlCi1waHlzaWNhbCBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHR3byBwYXJ0czogYSBsb25nIG5hbWUgb2YgdXAgdG8gMTUKLWNoYXJhY3RlcnMgYW5kIGEgc2luZ2xlIGNoYXJhY3RlciBhYmJyZXZpYXRpb24uICBGb3IgZXhhbXBsZSwgYQotaGlzdG9ncmFtIHJlcHJlc2VudGluZyByZWFsLXRpbWUgd291bGQgc3BlY2lmeSB0aGUgbG9uZyBuYW1lIGFzCi0ic2Vjb25kcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24gYXMgInMiLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IKLWFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IHBlcmZvcm1hbmNlIG1vbml0b3IgaGFyZHdhcmUgKHdoaWNoLAotZm9ydHVuYXRlbHksIGlzIGJlY29taW5nIGluY3JlYXNpbmdseSBjb21tb24pLiAgRm9yIGV4YW1wbGUsIHVuZGVyIERFQwotT1NGLzEsIHRoZSAidXByb2ZpbGUiIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZSBhIGhpc3RvZ3JhbSBvZiwKLXNheSwgaW5zdHJ1Y3Rpb24gY2FjaGUgbWlzc2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGltZW5zaW9uIGluIHRoZQotaGlzdG9ncmFtIGhlYWRlciBjb3VsZCBiZSBzZXQgdG8gImktY2FjaGUgbWlzc2VzIiBhbmQgdGhlIGFiYnJldmlhdGlvbgotY291bGQgYmUgc2V0IHRvICIxIiAoYmVjYXVzZSBpdCBpcyBzaW1wbHkgYSBjb3VudCwgbm90IGEgcGh5c2ljYWwKLWRpbWVuc2lvbikuICBBbHNvLCB0aGUgcHJvZmlsaW5nIHJhdGUgd291bGQgaGF2ZSB0byBiZSBzZXQgdG8gMSBpbgotdGhpcyBjYXNlLgotCi1IaXN0b2dyYW0gYmlucyBhcmUgMTYtYml0IG51bWJlcnMgYW5kIGVhY2ggYmluIHJlcHJlc2VudCBhbiBlcXVhbAotYW1vdW50IG9mIHRleHQtc3BhY2UuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRleHQtc2VnbWVudCBpcyBvbmUKLXRob3VzYW5kIGJ5dGVzIGxvbmcgYW5kIGlmIHRoZXJlIGFyZSB0ZW4gYmlucyBpbiB0aGUgaGlzdG9ncmFtLCBlYWNoCi1iaW4gcmVwcmVzZW50cyBvbmUgaHVuZHJlZCBieXRlcy4KLQotCi0qKiogQ2FsbC1HcmFwaCBSZWNvcmRzCi0KLUNhbGwtZ3JhcGggcmVjb3JkcyBoYXZlIGEgZm9ybWF0IHRoYXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdXNlZCBpbgotdGhlIEJTRC1kZXJpdmVkIGZpbGUgZm9ybWF0LiAgSXQgY29uc2lzdHMgb2YgYW4gYXJjIGluIHRoZSBjYWxsIGdyYXBoCi1hbmQgYSBjb3VudCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFyYyB3YXMgdHJhdmVyc2VkCi1kdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24uICBBcmNzIGFyZSBzcGVjaWZpZWQgYnkgYSBwYWlyIG9mIGFkZHJlc3NlczoKLXRoZSBmaXJzdCBtdXN0IGJlIHdpdGhpbiBjYWxsZXIncyBmdW5jdGlvbiBhbmQgdGhlIHNlY29uZCBtdXN0IGJlCi13aXRoaW4gdGhlIGNhbGxlZSdzIGZ1bmN0aW9uLiAgV2hlbiBwZXJmb3JtaW5nIHByb2ZpbGluZyBhdCB0aGUKLWZ1bmN0aW9uIGxldmVsLCB0aGVzZSBhZGRyZXNzZXMgY2FuIHBvaW50IGFueXdoZXJlIHdpdGhpbiB0aGUKLXJlc3BlY3RpdmUgZnVuY3Rpb24uICBIb3dldmVyLCB3aGVuIHByb2ZpbGluZyBhdCB0aGUgbGluZS1sZXZlbCwgaXQgaXMKLWJldHRlciBpZiB0aGUgYWRkcmVzc2VzIGFyZSBhcyBjbG9zZSB0byB0aGUgY2FsbC1zaXRlL2VudHJ5LXBvaW50IGFzCi1wb3NzaWJsZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbGluZS1sZXZlbCBjYWxsLWdyYXBoIGlzIGFibGUgdG8KLWlkZW50aWZ5IGV4YWN0bHkgd2hpY2ggbGluZSBvZiBzb3VyY2UgY29kZSBwZXJmb3JtZWQgY2FsbHMgdG8gYQotZnVuY3Rpb24uCi0KLSoqKiBCYXNpYy1CbG9jayBFeGVjdXRpb24gQ291bnQgUmVjb3JkcwotCi1CYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQgcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIGZvbGxvd2VkIGJ5IGEKLXNlcXVlbmNlIG9mIGFkZHJlc3MvY291bnQgcGFpcnMuICBUaGUgaGVhZGVyIHNpbXBseSBzcGVjaWZpZXMgdGhlCi1sZW5ndGggb2YgdGhlIHNlcXVlbmNlLiAgSW4gYW4gYWRkcmVzcy9jb3VudCBwYWlyLCB0aGUgYWRkcmVzcwotaWRlbnRpZmllcyBhIGJhc2ljLWJsb2NrIGFuZCB0aGUgY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMKLXRoYXQgYmFzaWMtYmxvY2sgd2FzIGV4ZWN1dGVkLiAgQW55IGFkZHJlc3Mgd2l0aGluIHRoZSBiYXNpYy1hZGRyZXNzIGNhbgotYmUgdXNlZC4KLQotSU1QTEVNRU5UQVRJT04gTk9URTogZ2NjIC1hIGNhbiBiZSB1c2VkIHRvIGluc3RydW1lbnQgYSBwcm9ncmFtIHRvCi1yZWNvcmQgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cy4gIEhvd2V2ZXIsIHRoZSBfX2JiX2V4aXRfZnVuYygpCi10aGF0IGlzIGN1cnJlbnRseSBwcmVzZW50IGluIGxpYmdjYzIuYyBkb2VzIG5vdCBnZW5lcmF0ZSBhIGdtb24ub3V0Ci1maWxlIGluIGEgc3VpdGVhYmxlIGZvcm1hdC4gIFRoaXMgc2hvdWxkIGJlIGZpeGVkIGZvciBmdXR1cmUgcmVsZWFzZXMKLW9mIGdjYy4gIEluIHRoZSBtZWFudGltZSwgY29udGFjdCBkYXZpZG1AY3MuYXJpem9uYS5lZHUgZm9yIGEgdmVyc2lvbgotb2YgX19iYl9leGl0X2Z1bmMoKSB0byBpcyBhcHByb3ByaWF0ZS4KZGlmZiAtLWdpdCBhL2dwcm9mL1RFU1QgYi9ncHJvZi9URVNUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE5MDMwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL1RFU1QKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS0gY2hlY2sgd2hldGhlciBvbGQgZmlsZSBmb3JtYXQgaXMgcHJvcGVybHkgcmVhZCB3aGVuIGlucHV0IGNvbWVzIGZyb20KLSAgc3RkaW4KLQotLSBjaGVjayB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSBwcm9wZXJseSBkZWFsdCB3aXRoIChib3RoLCBvbiBzeXN0ZW1zCi0gIHRoYXQgcHJlcGVuZCB0aGVtIHRvIGVhY2ggQyBuYW1lIGFuZCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QpCi0KLS0gZW5zdXJlIGdwcm9mIGZhaWxzIGdyYWNlZnVsbHkgd2hlbiBubyBkZWJ1Z2dpbmcgaW5mbyBhdmFpbGFibGUKZGlmZiAtLWdpdCBhL2dwcm9mL1RPRE8gYi9ncHJvZi9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDExMWM2Li4wMDAwMDAwCi0tLSBhL2dwcm9mL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0KLS0gZ21vbl9pby5jIGNhbm5vdCBkZWFsIHdpdGggdGFyZ2V0IGFyY2hpdGVjdHVyZSB0aGF0IGhhdmUgYSBwb2ludGVyIHNpemUKLSAgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgaG9zdCBhcmNoaXRlY3R1cmVzIHBvaW50ZXIgc2l6ZS0tLWZpeCB0aGlzCi0gIChnbW9uX291dC5oLCBhbmQgZ21vbl9pby5jKQotLSBhZGQgc3VwcG9ydCBmb3IgcHJvZiBmaWxlIGZvcm1hdCBzbyB0aGF0IHByb2YgZmlsZXMgY2FuIGJlIGRpc3BsYXllZAotICBhdCB0aGUgbGluZS1sZXZlbCAodGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB1cHJvZmlsZSB0b29sIHVuZGVyIERFQydzCi0gIE9TRi8xKQotLSB0YWtlIGEgaGFyZCBsb29rIGF0IC0tZmlsZS1vcmRlcmluZyAoYnJva2VuKSBhbmQgLS1mdW5jdGlvbi1vcmRlcmluZwotCi0rIGRvY3VtZW50YXRpb24KLSsgb3B0aW1pemUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lX251bSgpIChvciByZXBsYWNlIGJ5IGRpZmZlcmVudCBpbnRlcmZhY2UpCi0rIGNsZWFudXAgX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZV9udW0oKSBmaXhlcyAmIGRlc2NyaXB0aW9uCi0rIGVuc3VyZSAiY2MgLXBnIiBwcm9kdWNlcyBnb29kIGZpbGVzIHVuZGVyIE9TRi8xIHYzLjAKLSsgbWFrZSBzdXJlIGdwcm9mIHdvcmtzIHRvZ2V0aGVyIHdpdGggT1NGLzEgdjMuMCdzIHByb2ZpbGluZyBsaWJyYXJpZXMKLSsgaW1wbGVtZW50IHN5bXRhYl9wYXJzZSgpOyBtb2RpZnkgc3ltX2xvb2t1cCgpIHRvIGNvbnNpZGVyIGFkZHJfaGlnaAotKyBjaGFuZ2UgZ3Byb2YuYyB0byBjb2xsZWN0IGxpc3RzLCB0aGVuIGludm9rZSBzeW10YWJfcGFyc2UoKSBmb3IKLSAgZWFjaCBsaXN0Ci0rIFF1ZXN0aW9uczoKLQlvIGlzIC1jICgtLXN0YXRpYy1jYWxsLWdyYXBoKSB1c2VmdWwgYXQgYWxsPyAgaSBjYW4ndCBzZWUKLQkgIGhvdzsgaWYgaXQgd2VyZSBkZWxldGVkLCBncHJvZiB3b3VsZCBiZSBjb21wbGV0ZWx5IG1hY2hpbmUKLQkgIGluZGVwZW5kZW50ID0+IHl1cCwgaXQgaXMKLQlvIGFyZSAobG9uZykgb3B0aW9uIG5hbWVzIGFwcHJvcHJpYXRlPwotCW8gLWsgKC0tZXhjbHVkZS1hcmMpIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCB3aXRoIGdldG9wdCgpOwotCSAgaXMgbmV3IHN5bnRheCAoLWsgZnJvbS90bykgYWNjZXB0YWJsZT8gIElmIG5vdCwgaG93IHRvCi0JICBmaXggaXQ/Ci0JbyBpbiB0aGUgRlNGIG91dHB1dCwgdGhlIGNhbGwtZ3JhcGggaW5kZXggbm93IHByaW50cwotCSAgdGhlIGZpbGVuYW1lIG9mIHN0YXRpYyBmdW5jdGlvbnMgaW4gcGFyZW50aGVzZXM7IGUuZy4sCi0JICBzdGF0aWMgZnVuY3Rpb24gZm9vKCkgdGhhdCBpcyBkZWZpbmVkIGluIGZpbGUgYmFyLmMKLQkgIHdvdWxkIGJlIHByaW50ZWQgYXM6Ci0KLQkJCVs0XSBmb28gKGJhci5jKQotCi0JICBpcyB0aGlzIGFjY2VwdGFibGU/ICBzaG91bGQgaXQgYmUgZG9uZSBvbmx5IG9wdGlvbmFsbHk/Ci0JbyBzeW1ib2xzIHdpdGggYWRkcmVzc2VzIHRoYXQgbWFwIGJhY2sgdG8gYSBkaWZmZXJlbnQKLQkgIG5hbWUgYXJlIHN1cHByZXNzZWQgKGhhcHBlbnMgd2l0aCBsYWJlbHMsIGZvciBleGFtcGxlKTsKLQkgIGlzIHRoaXMgYWNjZXB0YWJsZT8gIHNob3VsZCBpdCBiZSBkb25lIG9ubHkgb3B0aW9uYWxseT8KLSsgZ2VuZXJhbGl6ZSB0byBhbGxvdyBhcmJpdHJhcnkgaGlzdG9ncmFtcyAobm90IGp1c3QgdGltZSBoaXN0b2dyYW1zKQotKyBiYXNpYy1ibG9jayBpbmZvcm1hdGlvbiBjdXJyZW50bHkgcmVwbGFjZXMgYWxsIHN5bWJvbHMgY3JlYXRlZCBmcm9tCi0gIHRoZSBjb3JlIGJlY2F1c2Ugb2YgYW4gdWdseSBvcmRlcmluZyBjb25mbGljdC0tLWZvciBub3csIHRoZSBjdXJyZW50Ci0gIHNvbHV0aW9uIHdvcmtzLCBidXQgc29tZXRoaW5nIGNsZWFuZXIgaXMgZGVzaXJhYmxlID09PiBjbGVhbmVkIHVwLAotICBidXQgaXQncyBzbG93ZXIgbm93Ci0rIGNvbnZlcnQgdG8gdmVyeSBuZXcgZmlsZSBmb3JtYXQgKGJhY2sgdG8gdHJpdmlhbCBmb3JtYXQsIHRoYXQgaXMgOikKLSsgcmVwbGFjZSAiZHVtbXkuaCIgZm9yIEFscGhhIChpZiB0aGVyZSBpcyBhbnkgdXNlIHRvIGl0KQotKyBhZGQgc3VwcG9ydCBmb3IgZXhlY3V0aW9uIHRpbWUgcHJvZmlsaW5nIGF0IGEgYmFzaWMtYmxvY2sgbGV2ZWwKLSsgZml4IGZpbGVuYW1lLW9mZi1ieS1vbmUgYnVnIGZvciBBbHBoYSAoc2VlIH4vdG1wL2QuW2NoXSktLS1ubyBsb25nZXIKLSAgcmVsZXZhbnQKLSsgIi1wZyAtYSIgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkIGJlY2F1c2UgbWNsZWFudXAoKSB3aWxsIG92ZXJ3cml0ZQotICB0aGUgZmlsZSBnZW5lcmF0ZWQgYnkgX19iYl9leGl0X2Z1bmMoKSAob3IgdmljZSB2ZXJzYSkKLSsgZmlyc3QgYmFzaWMtYmxvY2sgb2YgZmFjKCkgc2VlbXMgdG8gZ2V0IGNyZWRpdGVkIHRvIGxhc3QgYmFzaWMtYmxvY2sKLSAgb2YgcHJldmlvdXMgZnVuY3Rpb24gPT4gYnVnIGluIGJhc2ljX2Jsb2Nrcy5jCi0rIGZsYXQgcHJvZmlsZSBzaG91bGQgcHJvdmlkZSBhdXRvbWF0aWMgc2NhbGluZyBmb3IgcGVyLWNhbGwgdGltZXMgYmVjYXVzZQotICBvdGhlcndpc2UgdGhleSdsbCBhbHdheXMgYmUgemVybyBvbiBhIGZhc3QgbWFjaGluZSB3aXRoIHRvbnMgb2Ygc21hbGwKLSAgZnVuY3Rpb25zCi0rIG1ha2UgIi1hIiBpbXBseSB0byByZXRhaW4gbGluZSBudW1iZXIgaW5mbyAod2l0aG91dCBhY3R1YWxseSBnZW5lcmF0aW5nCi0gIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKHVubGVzcyAtZyBpcyBzcGVjaWZpZWQpLS0tbm8sIHRoaXMgaXMgYQotICBiYWQgaWRlYSwgYmVjYXVzZSBpdCBpcyBub3QgY2xlYXIgd2hhdCBsZXZlbCBvZiBkZWJ1Z2dpbmcgaW5mbyBzaG91bGQKLSAgYmUgcmVxdWVzdGVkIChlLmcuLCAtZyB2cy4gLWczKTsgbGVhdmluZyBpdCB1cCB0byB0aGUgdXNlciBzZWVtcyBiZXN0Ci0rIGFkZCBsb25nIG9wdGlvbnMgc3VwcG9ydCAob3IgYXQgbGVhc3QgdXNlIGdldG9wdCBpbnN0ZWFkIG9mIGFkLWhvYwotICBpbXBsZW1lbnRhdGlvbikKLSsgc3BsaXQgaW50byBmaWxlcyBhY2NvcmRpbmcgdG8gYWJzdHJhY3Qgb2JqZWN0cyB0aGF0IGFyZSBtYW5pcHVsYXRlZAotKyByZXBsYWNlIHNjY3NpZCBieSByY3NpZCAmIGFkZCAiZW5kIG9mIC4uLiIgdG8gZXZlcnkgLmMgZmlsZQotKyB1c2UgREJHKCkgZXZlcnl3aGVyZQotKyBmaXggc3BhY2luZyAoIiAsIiAtPiAiLCIgZXRjLikKLSsgdXNlIERFRlVOcyBldmVyeXdoZXJlCi0rIG1ha2UgY29tcGlsZSBjbGVhbmx5IHdpdGggLVdhbGwKLSsgImdjYyAtcGcgLU8yIiBkb2Vzbid0IHdvcmsgb24gdGVjYy5jIHVubGVzcyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciBpcwotICBzcGVjaWZpZWQ7IGZpbmQgb3V0IHdoeQotKyBtYWtlIHRoaW5ncyBwb3J0YWJsZSAocHJvdG90eXBlcywgY29uc3QsIGV0Yy4pCi0rIGlmIE5FV19HTU9OX09VVCBpcyBub3QgZGVmaW5lZCwgaGF2ZSBhIGZsYWcgdGhhdCB3aWxsIGFsbG93IHRvCi0gIHJlYWQgbmV3IGdtb24ub3V0IHN0eWxlIGZpbGVzLiAgVGhlIGlkZWEgYmVpbmcgdGhhdCBldmVyeW9uZQotICB3aWxsIHVzZSB0aGUgbmV3IGZvcm1hdCBmb3IgYmFzaWMtYmxvY2sgc3R5bGUgcHJvZmlsaW5nIGJ1dAotICB0aGUgb2xkIGZvcm1hdCBmb3IgcmVndWxhciBncHByb2ZpbGluZwpkaWZmIC0tZ2l0IGEvZ3Byb2YvYWNsb2NhbC5tNCBiL2dwcm9mL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjAxMjIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMDkgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+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+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYWxwaGEuYyBiL2dwcm9mL2FscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWQ3NGQuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk4IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0vKgotICogT3Bjb2RlcyBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbnM6Ci0gKi8KLSNkZWZpbmUgT1BfSnh4CTB4MWEKLSNkZWZpbmUJT1BfQlNSCTB4MzQKLQotI2RlZmluZSBKeHhfRlVOQ19KTVAJCTAKLSNkZWZpbmUgSnh4X0ZVTkNfSlNSCQkxCi0jZGVmaW5lIEp4eF9GVU5DX1JFVAkJMgotI2RlZmluZSBKeHhfRlVOQ19KU1JfQ09ST1VUSU5FCTMKLQotdHlwZWRlZiB1bmlvbgotICB7Ci0gICAgc3RydWN0Ci0gICAgICB7Ci0JdW5zaWduZWQgb3RoZXI6MjY7Ci0JdW5zaWduZWQgb3BfY29kZTo2OwotICAgICAgfQotICAgIGE7CQkJCS8qIGFueSBmb3JtYXQgKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlpbnQgZGlzcDoyMTsKLQl1bnNpZ25lZCByYTo1OwotCXVuc2lnbmVkIG9wX2NvZGU6NjsKLSAgICAgIH0KLSAgICBiOwkJCQkvKiBicmFuY2ggZm9ybWF0ICovCi0gICAgc3RydWN0Ci0gICAgICB7Ci0JaW50IGhpbnQ6MTQ7Ci0JdW5zaWduZWQgZnVuYzoyOwotCXVuc2lnbmVkIHJiOjU7Ci0JdW5zaWduZWQgcmE6NTsKLQl1bnNpZ25lZCBvcF9jb2RlOjY7Ci0gICAgICB9Ci0gICAgajsJCQkJLyoganVtcCBmb3JtYXQgKi8KLSAgfQotYWxwaGFfSW5zdHJ1Y3Rpb247Ci0KLXN0YXRpYyBTeW0gaW5kaXJlY3RfY2hpbGQ7Ci0KLQotLyoKLSAqIE9uIHRoZSBBbHBoYSB3ZSBjYW4gb25seSBkZXRlY3QgUEMgcmVsYXRpdmUgY2FsbHMsIHdoaWNoIGFyZQotICogdXN1YWxseSBnZW5lcmF0ZWQgZm9yIGNhbGxzIHRvIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIHNhbWUKLSAqIG9iamVjdCBmaWxlIG9ubHkuICBUaGlzIGlzIHN0aWxsIGJldHRlciB0aGFuIG5vdGhpbmcsIGhvd2V2ZXIuCi0gKiAoSW4gcGFydGljdWxhciBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZmluZCBmdW5jdGlvbnMgdGhhdAotICogIHBvdGVudGlhbGx5IGNhbGwgaW50ZWdlciBkaXZpc2lvbiByb3V0aW5lcywgZm9yIGV4YW1wbGUuKQotICovCi12b2lkCi1hbHBoYV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHN0YXRpYyBiZmRfdm1hIGRlbHRhID0gMDsKLSAgYmZkX3ZtYSBkZXN0X3BjOwotICBhbHBoYV9JbnN0cnVjdGlvbiAqcGM7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgaWYgKCFkZWx0YSkKLSAgICB7Ci0gICAgICBkZWx0YSA9IChiZmRfdm1hKSBjb3JlX3RleHRfc3BhY2UgLSBjb3JlX3RleHRfc2VjdC0+dm1hOwotCi0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0X2NoaWxkKTsKLSAgICAgIGluZGlyZWN0X2NoaWxkLm5hbWUgPSBfKCI8aW5kaXJlY3QgY2hpbGQ+Iik7Ci0gICAgICBpbmRpcmVjdF9jaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RfY2hpbGQuY2cuY3ljLmhlYWQgPSAmaW5kaXJlY3RfY2hpbGQ7Ci0gICAgfQotCi0gIGlmICghY29yZV90ZXh0X3NwYWNlKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmIChfKCJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIpLAotCQkJICBwYXJlbnQtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwX2xvd3BjLAotCQkJICAodW5zaWduZWQgbG9uZykgcF9oaWdocGMpKTsKLSAgZm9yIChwYyA9IChhbHBoYV9JbnN0cnVjdGlvbiAqKSAocF9sb3dwYyArIGRlbHRhKTsKLSAgICAgICBwYyA8IChhbHBoYV9JbnN0cnVjdGlvbiAqKSAocF9oaWdocGMgKyBkZWx0YSk7Ci0gICAgICAgKytwYykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHBjLT5hLm9wX2NvZGUpCi0JewotCWNhc2UgT1BfSnh4OgotCSAgLyoKLQkgICAqIFRoZXJlIGlzIG5vIHNpbXBsZSBhbmQgcmVsaWFibGUgd2F5IHRvIGRldGVybWluZSB0aGUKLQkgICAqIHRhcmdldCBvZiBhIGpzciAodGhlIGhpbnQgYml0cyBoZWxwLCBidXQgdGhlcmUgYXJlbid0Ci0JICAgKiBlbm91Z2ggYml0cyB0byBnZXQgYSBzYXRpc2ZhY3RvcnkgaGl0IHJhdGUpLiAgSW5zdGVhZCwKLQkgICAqIGZvciBhbnkgaW5kaXJlY3QganVtcCB3ZSBzaW1wbHkgYWRkIGFuIGFyYyBmcm9tIFBBUkVOVAotCSAgICogdG8gSU5ESVJFQ1RfQ0hJTEQtLS10aGF0IHdheSB0aGUgdXNlciBpdCBhdCBsZWFzdCBhYmxlCi0JICAgKiB0byBzZWUgdGhhdCB0aGVyZSBhcmUgb3RoZXIgY2FsbHMgYXMgd2VsbC4KLQkgICAqLwotCSAgaWYgKHBjLT5qLmZ1bmMgPT0gSnh4X0ZVTkNfSlNSCi0JICAgICAgfHwgcGMtPmouZnVuYyA9PSBKeHhfRlVOQ19KU1JfQ09ST1VUSU5FKQotCSAgICB7Ci0JICAgICAgREJHIChDQUxMREVCVUcsCi0JCSAgIHByaW50ZiAoXygiW2ZpbmRfY2FsbF0gMHglbHg6IGpzciVzIDxpbmRpcmVjdF9jaGlsZD5cbiIpLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIHBjIC0gZGVsdGEsCi0JCQkgICBwYy0+ai5mdW5jID09IEp4eF9GVU5DX0pTUiA/ICIiIDogIl9jb3JvdXRpbmUiKSk7Ci0JICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RfY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIE9QX0JTUjoKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKF8oIltmaW5kX2NhbGxdIDB4JWx4OiBic3IiKSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBwYyAtIGRlbHRhKSk7Ci0JICAvKgotCSAgICogUmVndWxhciBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nLiAgQ2hlY2sgdGhhdCB0aGlzIGlzIHRoZQotCSAgICogYWRkcmVzcyBvZiBhIGZ1bmN0aW9uLiAgVGhlIGxpbmtlciBzb21ldGltZXMgcmVkaXJlY3RzCi0JICAgKiB0aGUgZW50cnkgcG9pbnQgYnkgOCBieXRlcyB0byBza2lwIGxvYWRpbmcgdGhlIGdsb2JhbAotCSAgICogcG9pbnRlciwgc28gd2UgYWxsIGZvciBlaXRoZXIgYWRkcmVzczoKLQkgICAqLwotCSAgZGVzdF9wYyA9ICgoYmZkX3ZtYSkgKHBjICsgMSArIHBjLT5iLmRpc3ApKSAtIGRlbHRhOwotCSAgaWYgKGRlc3RfcGMgPj0gc19sb3dwYyAmJiBkZXN0X3BjIDw9IHNfaGlnaHBjKQotCSAgICB7Ci0JICAgICAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0X3BjKTsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmICgiIDB4JWx4XHQ7IG5hbWU9JXMsIGFkZHI9MHglbHgiLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGRlc3RfcGMsIGNoaWxkLT5uYW1lLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT5hZGRyKSk7Ci0JICAgICAgaWYgKGNoaWxkLT5hZGRyID09IGRlc3RfcGMgfHwgY2hpbGQtPmFkZHIgPT0gZGVzdF9wYyAtIDgpCi0JCXsKLQkJICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXG4iKSk7Ci0JCSAgLyogYSBoaXQ6ICAqLwotCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICAvKgotCSAgICogU29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmMgYi9ncHJvZi9iYXNpY19ibG9ja3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkZDc2MmIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotLyoKLSAqIEJhc2ljLWJsb2NrIGxldmVsIHJlbGF0ZWQgY29kZTogcmVhZGluZy93cml0aW5nIG9mIGJhc2ljLWJsb2NrIGluZm8KLSAqIHRvL2Zyb20gZ21vbi5vdXQ7IGNvbXB1dGluZyBhbmQgZm9ybWF0dGluZyBvZiBiYXNpYy1ibG9jayByZWxhdGVkCi0gKiBzdGF0aXN0aWNzLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJiYXNpY19ibG9ja3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic291cmNlLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotCi0KLS8qCi0gKiBEZWZhdWx0IG9wdGlvbiB2YWx1ZXM6Ci0gKi8KLWJvb2wgYmJfYW5ub3RhdGVfYWxsX2xpbmVzID0gRkFMU0U7Ci11bnNpZ25lZCBsb25nIGJiX21pbl9jYWxscyA9IDE7Ci1pbnQgYmJfdGFibGVfbGVuZ3RoID0gMTA7Ci0KLS8qCi0gKiBWYXJpYWJsZXMgdXNlZCB0byBjb21wdXRlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZyBzdGF0czoKLSAqLwotc3RhdGljIGxvbmcgbnVtX2V4ZWN1dGFibGVfbGluZXM7Ci1zdGF0aWMgbG9uZyBudW1fbGluZXNfZXhlY3V0ZWQ7Ci0KLQotLyoKLSAqIEhlbHBlciBmb3Igc29ydGluZy4gIENvbXBhcmVzIHR3byBzeW1ib2xzIGFuZCByZXR1cm5zIHJlc3VsdAotICogc3VjaCB0aGF0IHNvcnRpbmcgd2lsbCBiZSBpbmNyZWFzaW5nIGFjY29yZGluZyB0byBmaWxlbmFtZSwgbGluZQotICogbnVtYmVyLCBhbmQgYWRkcmVzcyAoaW4gdGhhdCBvcmRlcikuCi0gKi8KLQotc3RhdGljIGludAotREVGVU4gKGNtcF9iYiwgKGxwLCBycCksIGNvbnN0IHZvaWQgKmxwIEFORCBjb25zdCB2b2lkICpycCkKLXsKLSAgaW50IHI7Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLQotICBpZiAobGVmdC0+ZmlsZSAmJiByaWdodC0+ZmlsZSkKLSAgICB7Ci0gICAgICByID0gc3RyY21wIChsZWZ0LT5maWxlLT5uYW1lLCByaWdodC0+ZmlsZS0+bmFtZSk7Ci0gICAgICBpZiAocikKLQl7Ci0JICByZXR1cm4gcjsKLQl9Ci0KLSAgICAgIGlmIChsZWZ0LT5saW5lX251bSAhPSByaWdodC0+bGluZV9udW0pCi0JewotCSAgcmV0dXJuIGxlZnQtPmxpbmVfbnVtIC0gcmlnaHQtPmxpbmVfbnVtOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxlZnQtPmFkZHIgPCByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlIGlmIChsZWZ0LT5hZGRyID4gcmlnaHQtPmFkZHIpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBIZWxwZXIgZm9yIHNvcnRpbmcuICBPcmRlciBiYXNpYyBibG9ja3MgaW4gZGVjcmVhc2luZyBudW1iZXIgb2YKLSAqIGNhbGxzLCB0aWVzIGFyZSBicm9rZW4gaW4gaW5jcmVhc2luZyBvcmRlciBvZiBsaW5lIG51bWJlcnMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfbmNhbGxzLCAobHAsIHJwKSwgY29uc3Qgdm9pZCAqbHAgQU5EIGNvbnN0IHZvaWQgKnJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0KLSAgaWYgKCFsZWZ0KQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAoIXJpZ2h0KQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGxlZnQtPm5jYWxscyA8IHJpZ2h0LT5uY2FsbHMpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGxlZnQtPm5jYWxscyA+IHJpZ2h0LT5uY2FsbHMpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBsZWZ0LT5saW5lX251bSAtIHJpZ2h0LT5saW5lX251bTsKLX0KLQotCi0vKgotICogU2tpcCBvdmVyIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZnNraXBfc3RyaW5nLCAoZnApLCBGSUxFICogZnApCi17Ci0gIGludCBjaDsKLQotICB3aGlsZSAoKGNoID0gZmdldGMgKGZwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGlmIChjaCA9PSAnXDAnKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIFJlYWQgYSBiYXNpYy1ibG9jayByZWNvcmQgZnJvbSBmaWxlIElGUC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lCi0gKiBvZiBmaWxlIElGUCBhbmQgaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGJiX3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBpbnQgbmJsb2NrcywgYjsKLSAgYmZkX3ZtYSBhZGRyOwotICB1bnNpZ25lZCBsb25nIG5jYWxsczsKLSAgU3ltICpzeW07Ci0KLSAgaWYgKGZyZWFkICgmbmJsb2Nrcywgc2l6ZW9mIChuYmxvY2tzKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iKSwgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgbmJsb2NrcyA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJiBuYmxvY2tzKTsKLSAgaWYgKGdtb25fZmlsZV92ZXJzaW9uID09IDApCi0gICAgewotICAgICAgZnNraXBfc3RyaW5nIChpZnApOwotICAgIH0KLQotICBmb3IgKGIgPSAwOyBiIDwgbmJsb2NrczsgKytiKQotICAgIHsKLSAgICAgIGlmIChnbW9uX2ZpbGVfdmVyc2lvbiA9PSAwKQotCXsKLQkgIGludCBsaW5lX251bTsKLQkgIC8qCi0JICAgKiBWZXJzaW9uIDAgaGFkIGxvdHMgb2YgZXh0cmEgc3R1ZmYgdGhhdCB3ZSBkb24ndAotCSAgICogY2FyZSBhYm91dCBhbnltb3JlLgotCSAgICovCi0JICBpZiAoKGZyZWFkICgmbmNhbGxzLCBzaXplb2YgKG5jYWxscyksIDEsIGlmcCkgIT0gMSkKLQkgICAgICB8fCAoZnJlYWQgKCZhZGRyLCBzaXplb2YgKGFkZHIpLCAxLCBpZnApICE9IDEpCi0JICAgICAgfHwgKGZza2lwX3N0cmluZyAoaWZwKSwgRkFMU0UpCi0JICAgICAgfHwgKGZza2lwX3N0cmluZyAoaWZwKSwgRkFMU0UpCi0JICAgICAgfHwgKGZyZWFkICgmbGluZV9udW0sIHNpemVvZiAobGluZV9udW0pLCAxLCBpZnApICE9IDEpKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZyZWFkICgmYWRkciwgc2l6ZW9mIChhZGRyKSwgMSwgaWZwKSAhPSAxCi0JICAgICAgfHwgZnJlYWQgKCZuY2FsbHMsIHNpemVvZiAobmNhbGxzKSwgMSwgaWZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBCYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGFyZSBtZWFuaW5nZnVsIG9ubHkgaWYgd2UncmUKLSAgICAgICAqIHByb2ZpbGluZyBhdCB0aGUgbGluZS1ieS1saW5lIGxldmVsOgotICAgICAgICovCi0gICAgICBpZiAobGluZV9ncmFudWxhcml0eSkKLQl7Ci0KLQkgIC8qIGNvbnZlcnQgZnJvbSB0YXJnZXQgdG8gaG9zdCBlbmRpYW5uZXNzOiAqLwotCi0JICBhZGRyID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIGFkZHIpOwotCSAgbmNhbGxzID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmbmNhbGxzKTsKLQotCSAgc3ltID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgYWRkcik7Ci0KLQkgIGlmIChzeW0pCi0JICAgIHsKLQkgICAgICBpbnQgaTsKLQotCSAgICAgIERCRyAoQkJERUJVRywKLQkJICAgcHJpbnRmICgiW2JiX3JlYWRfcmVjXSAweCVseC0+MHglbHggKCVzOiVkKSBjbnQ9JWx1XG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsICh1bnNpZ25lZCBsb25nKSBzeW0tPmFkZHIsCi0JCQkgICBzeW0tPm5hbWUsIHN5bS0+bGluZV9udW0sIG5jYWxscykpOwotCi0JICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlM7IGkrKykKLQkJewotCQkgIGlmICghIHN5bS0+YmJfYWRkcltpXSB8fCBzeW0tPmJiX2FkZHJbaV0gPT0gYWRkcikKLQkJICAgIHsKLQkJICAgICAgc3ltLT5iYl9hZGRyW2ldID0gYWRkcjsKLQkJICAgICAgc3ltLT5iYl9jYWxsc1tpXSArPSBuY2FsbHM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RhdGljIGJvb2wgdXNlcl93YXJuZWQgPSBGQUxTRTsKLQotCSAgaWYgKCF1c2VyX3dhcm5lZCkKLQkgICAgewotCSAgICAgIHVzZXJfd2FybmVkID0gVFJVRTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogd2FybmluZzogaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlYyBjb3VudHMgKHVzZSAtbCBvciAtLWxpbmUpXG4iKSwKLQkJICAgICAgIHdob2FtaSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGFsbCBiYXNpYy1ibG9ja3Mgd2l0aCBub24temVybyBjb3VudHMgdG8gZmlsZSBPRlAuICBGSUxFTkFNRQotICogaXMgdGhlIG5hbWUgb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgcHJvZHVjaW5nIGVycm9yLW1lc3NhZ2VzCi0gKiBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoYmJfd3JpdGVfYmxvY2tzLCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyIHRhZyA9IEdNT05fVEFHX0JCX0NPVU5UOwotICBpbnQgbmJsb2NrcyA9IDA7Ci0gIGJmZF92bWEgYWRkcjsKLSAgdW5zaWduZWQgbG9uZyBuY2FsbHM7Ci0gIFN5bSAqc3ltOwotICBpbnQgaTsKLQotICAvKiBjb3VudCBob3cgbWFueSBub24temVybyBibG9ja3Mgd2l0aCBoYXZlOiAqLwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgc3ltLT5iYl9hZGRyW2ldOyBpKyspCi0JOwotICAgICAgbmJsb2NrcyArPSBpOwotICAgIH0KLQotICAvKiB3cml0ZSBoZWFkZXI6ICovCi0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBuYmxvY2tzLCAoYmZkX2J5dGUgKikgJiBuYmxvY2tzKTsKLSAgaWYgKGZ3cml0ZSAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBvZnApICE9IDEKLSAgICAgIHx8IGZ3cml0ZSAoJm5ibG9ja3MsIHNpemVvZiAobmJsb2NrcyksIDEsIG9mcCkgIT0gMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiB3cml0ZSBjb3VudHM6ICovCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgc3ltLT5iYl9hZGRyW2ldOyBpKyspCi0JewotCSAgcHV0X3ZtYSAoY29yZV9iZmQsIHN5bS0+YmJfYWRkcltpXSwgKGJmZF9ieXRlICopICYgYWRkcik7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgc3ltLT5iYl9jYWxsc1tpXSwgKGJmZF9ieXRlICopICYgbmNhbGxzKTsKLQotCSAgaWYgKGZ3cml0ZSAoJmFkZHIsIHNpemVvZiAoYWRkciksIDEsIG9mcCkgIT0gMQotCSAgICAgIHx8IGZ3cml0ZSAoJm5jYWxscywgc2l6ZW9mIChuY2FsbHMpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIE91dHB1dCBiYXNpYy1ibG9jayBzdGF0aXN0aWNzIGluIGEgZm9ybWF0IHRoYXQgaXMgZWFzaWx5IHBhcnNlYWJsZS4KLSAqIEN1cnJlbnQgdGhlIGZvcm1hdCBpczoKLSAqCi0gKiAgICAgIDxmaWxlbmFtZT46PGxpbmUtbnVtYmVyPjogKDxmdW5jdGlvbi1uYW1lPjo8YmItYWRkcik6IDxuY2FsbHM+Ci0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKHByaW50X2V4ZWNfY291bnRzKQotewotICBTeW0gKipzb3J0ZWRfYmJzLCAqc3ltOwotICBpbnQgaSwgaiwgbGVuOwotCi0gIGlmIChmaXJzdF9vdXRwdXQpCi0gICAgewotICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiXGZcbiIpOwotICAgIH0KLQotICAvKiBzb3J0IGJhc2ljLWJsb2NrcyBhY2NvcmRpbmcgdG8gZnVuY3Rpb24gbmFtZSBhbmQgbGluZSBudW1iZXI6ICovCi0KLSAgc29ydGVkX2JicyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKHNvcnRlZF9iYnNbMF0pKTsKLSAgbGVuID0gMDsKLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQWNjZXB0IHN5bWJvbCBpZiBpdCdzIGluIHRoZSBJTkNMX0VYRUMgdGFibGUKLSAgICAgICAqIG9yIHRoZXJlIGlzIG5vIElOQ0xfRVhFQyB0YWJsZQotICAgICAgICogICAgYW5kIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgRVhDTF9FWEVDIHRhYmxlLgotICAgICAgICovCi0gICAgICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9FWEVDXSwgc3ltLT5hZGRyKQotCSAgfHwgKHN5bXNbSU5DTF9FWEVDXS5sZW4gPT0gMAotCSAgICAgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0VYRUNdLCBzeW0tPmFkZHIpKSkKLQl7Ci0JICBzb3J0ZWRfYmJzW2xlbisrXSA9IHN5bTsKLQl9Ci0gICAgfQotICBxc29ydCAoc29ydGVkX2JicywgbGVuLCBzaXplb2YgKHNvcnRlZF9iYnNbMF0pLCBjbXBfYmIpOwotCi0gIC8qIG91dHB1dCBiYXNpYy1ibG9ja3M6ICovCi0KLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQotICAgIHsKLSAgICAgIGlmIChzeW0tPm5jYWxscyA+IDAgfHwgISBpZ25vcmVfemVyb3MpCi0JewotCSAgLyogRklYTUU6IFRoaXMgb25seSB3b3JrcyBpZiBiZmRfdm1hIGlzIHVuc2lnbmVkIGxvbmcuICAqLwotCSAgcHJpbnRmIChfKCIlczolZDogKCVzOjB4JWx4KSAlbHUgZXhlY3V0aW9uc1xuIiksCi0JCSAgc3ltLT5maWxlID8gc3ltLT5maWxlLT5uYW1lIDogXygiPHVua25vd24+IiksIHN5bS0+bGluZV9udW0sCi0JCSAgc3ltLT5uYW1lLCAodW5zaWduZWQgbG9uZykgc3ltLT5hZGRyLCBzeW0tPm5jYWxscyk7Ci0JfQotICAgICAgZm9yIChqID0gMDsgaiA8IE5CQlMgJiYgc3ltLT5iYl9hZGRyW2pdOyBqICsrKQotCXsKLQkgIGlmIChzeW0tPmJiX2NhbGxzW2pdID4gMCB8fCAhIGlnbm9yZV96ZXJvcykKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBUaGlzIG9ubHkgd29ya3MgaWYgYmZkX3ZtYSBpcyB1bnNpZ25lZCBsb25nLiAgKi8KLQkgICAgICBwcmludGYgKF8oIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iKSwKLQkJICAgICAgc3ltLT5maWxlID8gc3ltLT5maWxlLT5uYW1lIDogXygiPHVua25vd24+IiksIHN5bS0+bGluZV9udW0sCi0JCSAgICAgIHN5bS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHN5bS0+YmJfYWRkcltqXSwKLQkJICAgICAgc3ltLT5iYl9jYWxsc1tqXSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBmcmVlIChzb3J0ZWRfYmJzKTsKLX0KLQotLyoKLSAqIEhlbHBlciBmb3IgYmJfYW5ub3RhdGVkX3NvdXJjZTogZm9ybWF0IGFubm90YXRpb24gY29udGFpbmluZwotICogbnVtYmVyIG9mIGxpbmUgZXhlY3V0aW9ucy4gIERlcGVuZHMgb24gYmVpbmcgY2FsbGVkIG9uIGVhY2gKLSAqIGxpbmUgb2YgYSBmaWxlIGluIHNlcXVlbnRpYWwgb3JkZXIuCi0gKgotICogR2xvYmFsIHZhcmlhYmxlIGJiX2Fubm90YXRlX2FsbF9saW5lcyBlbmFibGVzIGV4ZWN1dGlvbiBjb3VudAotICogY29tcHJlc3Npb24gKGNvdW50cyBhcmUgc3VwcmVzc2VkIGlmIGlkZW50aWNhbCB0byB0aGUgbGFzdCBvbmUpCi0gKiBhbmQgcHJpbnRzIGNvdW50cyBvbiBhbGwgZXhlY3V0ZWQgbGluZXMuICBPdGhlcndpc2UsIHByaW50Ci0gKiBhbGwgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBleGFjdGx5IG9uY2Ugb24gdGhlIGxpbmUKLSAqIHRoYXQgc3RhcnRzIHRoZSBiYXNpYy1ibG9jay4KLSAqLwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGFubm90YXRlX3dpdGhfY291bnQsIChidWYsIHdpZHRoLCBsaW5lX251bSwgYXJnKSwKLSAgICAgICBjaGFyICpidWYgQU5EIGludCB3aWR0aCBBTkQgaW50IGxpbmVfbnVtIEFORCB2b2lkICphcmcpCi17Ci0gIFNvdXJjZV9GaWxlICpzZiA9IGFyZzsKLSAgU3ltICpiOwotICBpbnQgaTsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9jb3VudDsKLSAgdW5zaWduZWQgbG9uZyBsYXN0X3ByaW50ID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCi0gIGIgPSBOVUxMOwotICBpZiAobGluZV9udW0gPD0gc2YtPm51bV9saW5lcykKLSAgICB7Ci0gICAgICBiID0gc2YtPmxpbmVbbGluZV9udW0gLSAxXTsKLSAgICB9Ci0gIGlmICghYikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKLQlidWZbaV0gPSAnICc7Ci0gICAgICBidWZbd2lkdGhdID0gJ1wwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIHRtcGJ1ZltOQkJTICogMzBdOwotICAgICAgY2hhciAqcDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwotICAgICAgaW50IG5jYWxsc19zZXQ7Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICArK251bV9leGVjdXRhYmxlX2xpbmVzOwotCi0gICAgICBwID0gdG1wYnVmOwotICAgICAgKnAgPSAnXDAnOwotCi0gICAgICBuY2FsbHMgPSAwOwotICAgICAgbmNhbGxzX3NldCA9IDA7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCwgbGFiZWwgdGhlIGxpbmUgbm8gbWF0dGVyIHdoYXQuCi0gICAgICAgKiBPdGhlcndpc2UsIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBmdW5jdGlvbiwgc28gY2hlY2sgdG8gc2VlCi0gICAgICAgKiBpZiB0aGUgZmlyc3QgYmFzaWMtYmxvY2sgYWRkcmVzcyBpcyBsYXJnZXIgdGhhbiB0aGUgc3RhcnRpbmcKLSAgICAgICAqIGFkZHJlc3Mgb2YgdGhlIGxpbmUuICBJZiBzbywgdGhlbiB0aGlzIGxpbmUgYmVnaW5zIHdpdGggYQotICAgICAgICogYSBwb3J0aW9uIG9mIHRoZSBwcmV2aW91cyBiYXNpYy1ibG9jaywgc28gcHJpbnQgdGhhdCBwcmlvcgotICAgICAgICogZXhlY3V0aW9uIGNvdW50IChpZiBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgaXMgc2V0KS4KLSAgICAgICAqLwotCi0gICAgICBpZiAoYi0+aXNfZnVuYykKLQl7Ci0JICBzcHJpbnRmIChwLCAiJWx1IiwgYi0+bmNhbGxzKTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGxhc3RfY291bnQgPSBiLT5uY2FsbHM7Ci0JICBsYXN0X3ByaW50ID0gbGFzdF9jb3VudDsKLQkgIG5jYWxscyA9IGItPm5jYWxsczsKLQkgIG5jYWxsc19zZXQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGJiX2Fubm90YXRlX2FsbF9saW5lcwotCSAgICAgICAmJiBiLT5iYl9hZGRyWzBdICYmIGItPmJiX2FkZHJbMF0gPiBiLT5hZGRyKQotCXsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OwotCSAgbmNhbGxzID0gbGFzdF9jb3VudDsKLQkgIG5jYWxsc19zZXQgPSAxOwotCX0KLQotICAgICAgLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGlzIGxpbmUncyBiYXNpYy1ibG9ja3MuICBGb3IgZWFjaCBvbmUsCi0gICAgICAgKiB1cGRhdGUgbGFzdF9jb3VudCwgdGhlbiBjb21wcmVzcyBzZXF1ZW50aWFsIGlkZW50aWNhbCBjb3VudHMKLSAgICAgICAqIChpZiBiYl9hbm5vdGF0ZV9hbGxfbGluZXMpIGFuZCBwcmludCB0aGUgZXhlY3V0aW9uIGNvdW50LgotICAgICAgICovCi0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOQkJTICYmIGItPmJiX2FkZHJbaV07IGkrKykKLQl7Ci0JICBsYXN0X2NvdW50ID0gYi0+YmJfY2FsbHNbaV07Ci0JICBpZiAoISBuY2FsbHNfc2V0KQotCSAgICB7Ci0JICAgICAgbmNhbGxzID0gMDsKLQkgICAgICBuY2FsbHNfc2V0ID0gMTsKLQkgICAgfQotCSAgbmNhbGxzICs9IGxhc3RfY291bnQ7Ci0KLQkgIGlmIChiYl9hbm5vdGF0ZV9hbGxfbGluZXMgJiYgbGFzdF9jb3VudCA9PSBsYXN0X3ByaW50KQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaWYgKHAgPiB0bXBidWYpCi0JICAgICpwKysgPSAnLCc7Ci0JICBzcHJpbnRmIChwLCAiJWx1IiwgbGFzdF9jb3VudCk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0KLQkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OwotCX0KLQotICAgICAgLyogV2UncmUgZG9uZS4gIElmIG5vdGhpbmcgaGFzIGJlZW4gcHJpbnRlZCBvbiB0aGlzIGxpbmUsCi0gICAgICAgKiBwcmludCB0aGUgbGFzdCBleGVjdXRpb24gY291bnQgKGJiX2Fubm90YXRlX2FsbF9saW5lcyksCi0gICAgICAgKiB3aGljaCBjb3VsZCBiZSBmcm9tIGVpdGhlciBhIHByZXZpb3VzIGxpbmUgKGlmIHRoZXJlIHdlcmUKLSAgICAgICAqIG5vIEJCcyBvbiB0aGlzIGxpbmUpLCBvciBmcm9tIHRoaXMgbGluZSAoaWYgYWxsIG91ciBCQgotICAgICAgICogY291bnRzIHdlcmUgY29tcHJlc3NlZCBvdXQgYmVjYXVzZSB0aGV5IHdlcmUgaWRlbnRpY2FsKS4KLSAgICAgICAqLwotCi0gICAgICBpZiAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzICYmIHAgPT0gdG1wYnVmKQotCXsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIG5jYWxscyA9IGxhc3RfY291bnQ7Ci0JICBuY2FsbHNfc2V0ID0gMTsKLQl9Ci0KLSAgICAgIGlmICghIG5jYWxsc19zZXQpCi0JewotCSAgaW50IGM7Ci0KLQkgIGZvciAoYyA9IDA7IGMgPCB3aWR0aDsgYysrKQotCSAgICBidWZbY10gPSAnICc7Ci0JICBidWZbd2lkdGhdID0gJ1wwJzsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgICsrbnVtX2xpbmVzX2V4ZWN1dGVkOwotCi0gICAgICBpZiAobmNhbGxzIDwgYmJfbWluX2NhbGxzKQotCXsKLQkgIHN0cmNweSAodG1wYnVmLCAiIyMjIyMiKTsKLQkgIHAgPSB0bXBidWYgKyA1OwotCX0KLQotICAgICAgc3RyY3B5IChwLCAiIC0+ICIpOwotICAgICAgcCArPSA0OwotCi0gICAgICBsZW4gPSBwIC0gdG1wYnVmOwotICAgICAgaWYgKGxlbiA+PSB3aWR0aCkKLQl7Ci0JICBzdHJuY3B5IChidWYsIHRtcGJ1Ziwgd2lkdGgpOwotCSAgYnVmW3dpZHRoXSA9ICdcMCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBjOwotCi0JICBzdHJjcHkgKGJ1ZiArIHdpZHRoIC0gbGVuLCB0bXBidWYpOwotCSAgZm9yIChjID0gMDsgYyA8IHdpZHRoIC0gbGVuOyArK2MpCi0JICAgIGJ1ZltjXSA9ICcgJzsKLQl9Ci0gICAgfQotfQotCi0vKgotICogQW5ub3RhdGUgdGhlIGZpbGVzIG5hbWVkIGluIFNPVVJDRV9GSUxFUyB3aXRoIGJhc2ljLWJsb2NrIHN0YXRpc3RpY3MKLSAqIChleGVjdXRpb24gY291bnRzKS4gIEFmdGVyIGVhY2ggc291cmNlIGZpbGVzLCBhIGZldyBzdGF0aXN0aWNzCi0gKiByZWdhcmRpbmcgdGhhdCBzb3VyY2UgZmlsZSBhcmUgcHJpbnRlZC4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAocHJpbnRfYW5ub3RhdGVkX3NvdXJjZSkKLXsKLSAgU3ltICpzeW0sICpsaW5lX3N0YXRzLCAqbmV3X2xpbmU7Ci0gIFNvdXJjZV9GaWxlICpzZjsKLSAgaW50IGksIHRhYmxlX2xlbjsKLSAgRklMRSAqb2ZwOwotCi0gIC8qCi0gICAqIEZpbmQgbWF4aW11bSBsaW5lIG51bWJlciBmb3IgZWFjaCBzb3VyY2UgZmlsZSB0aGF0IHVzZXIgaXMKLSAgICogaW50ZXJlc3RlZCBpbjoKLSAgICovCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEFjY2VwdCBzeW1ib2wgaWYgaXQncyBmaWxlIGlzIGtub3duLCBpdHMgbGluZSBudW1iZXIgaXMKLSAgICAgICAqIGJpZ2dlciB0aGFuIGFueXRoaW5nIHdlIGhhdmUgc2VlbiBmb3IgdGhhdCBmaWxlIHNvIGZhciBhbmQKLSAgICAgICAqIGlmIGl0J3MgaW4gdGhlIElOQ0xfQU5OTyB0YWJsZSBvciB0aGVyZSBpcyBubyBJTkNMX0FOTk8KLSAgICAgICAqIHRhYmxlIGFuZCBpdCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIEVYQ0xfQU5OTyB0YWJsZS4KLSAgICAgICAqLwotICAgICAgaWYgKHN5bS0+ZmlsZSAmJiBzeW0tPmxpbmVfbnVtID4gc3ltLT5maWxlLT5udW1fbGluZXMKLQkgICYmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0FOTk9dLCBzeW0tPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9BTk5PXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0FOTk9dLCBzeW0tPmFkZHIpKSkpCi0JewotCSAgc3ltLT5maWxlLT5udW1fbGluZXMgPSBzeW0tPmxpbmVfbnVtOwotCX0KLSAgICB9Ci0KLSAgLyogYWxsb2NhdGUgbGluZSBkZXNjcmlwdG9yczogKi8KLQotICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZi0+bnVtX2xpbmVzID4gMCkKLQl7Ci0JICBzZi0+bGluZSA9ICh2b2lkICopIHhtYWxsb2MgKHNmLT5udW1fbGluZXMgKiBzaXplb2YgKHNmLT5saW5lWzBdKSk7Ci0JICBtZW1zZXQgKHNmLT5saW5lLCAwLCBzZi0+bnVtX2xpbmVzICogc2l6ZW9mIChzZi0+bGluZVswXSkpOwotCX0KLSAgICB9Ci0KLSAgLyogY291bnQgZXhlY3V0aW9ucyBwZXIgbGluZTogKi8KLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGlmIChzeW0tPmZpbGUgJiYgc3ltLT5maWxlLT5udW1fbGluZXMKLQkgICYmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0FOTk9dLCBzeW0tPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9BTk5PXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0FOTk9dLCBzeW0tPmFkZHIpKSkpCi0JewotCSAgc3ltLT5maWxlLT5uY2FsbHMgKz0gc3ltLT5uY2FsbHM7Ci0JICBsaW5lX3N0YXRzID0gc3ltLT5maWxlLT5saW5lW3N5bS0+bGluZV9udW0gLSAxXTsKLQkgIGlmICghbGluZV9zdGF0cykKLQkgICAgewotCSAgICAgIC8qIGNvbW1vbiBjYXNlIGhhcyBhdCBtb3N0IG9uZSBiYXNpYy1ibG9jayBwZXIgc291cmNlIGxpbmU6ICovCi0JICAgICAgc3ltLT5maWxlLT5saW5lW3N5bS0+bGluZV9udW0gLSAxXSA9IHN5bTsKLQkgICAgfQotCSAgZWxzZSBpZiAoIWxpbmVfc3RhdHMtPmFkZHIpCi0JICAgIHsKLQkgICAgICAvKiBzeW0gaXMgdGhlIDNyZCAuLiBudGggYmFzaWMgYmxvY2sgZm9yIHRoaXMgbGluZTogKi8KLQkgICAgICBsaW5lX3N0YXRzLT5uY2FsbHMgKz0gc3ltLT5uY2FsbHM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHN5bSBpcyB0aGUgc2Vjb25kIGJhc2ljIGJsb2NrIGZvciB0aGlzIGxpbmUgKi8KLQkgICAgICBuZXdfbGluZSA9IChTeW0gKikgeG1hbGxvYyAoc2l6ZW9mICgqbmV3X2xpbmUpKTsKLQkgICAgICAqbmV3X2xpbmUgPSAqbGluZV9zdGF0czsKLQkgICAgICBuZXdfbGluZS0+YWRkciA9IDA7Ci0JICAgICAgbmV3X2xpbmUtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKLQkgICAgICBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdID0gbmV3X2xpbmU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIHBsb2Qgb3ZlciBzb3VyY2UgZmlsZXMsIGFubm90YXRpbmcgdGhlbTogKi8KLQotICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghc2YtPm51bV9saW5lcyB8fCAoaWdub3JlX3plcm9zICYmIHNmLT5uY2FsbHMgPT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBudW1fZXhlY3V0YWJsZV9saW5lcyA9IG51bV9saW5lc19leGVjdXRlZCA9IDA7Ci0gICAgICBvZnAgPSBhbm5vdGF0ZV9zb3VyY2UgKHNmLCAxNiwgYW5ub3RhdGVfd2l0aF9jb3VudCwgc2YpOwotICAgICAgaWYgKCFvZnApCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoYmJfdGFibGVfbGVuZ3RoID4gMCkKLQl7Ci0JICBmcHJpbnRmIChvZnAsIF8oIlxuXG5Ub3AgJWQgTGluZXM6XG5cbiAgICAgTGluZSAgICAgIENvdW50XG5cbiIpLAotCQkgICBiYl90YWJsZV9sZW5ndGgpOwotCi0JICAvKiBhYnVzZSBsaW5lIGFycmF5cy0tLWl0J3Mgbm90IG5lZWRlZCBhbnltb3JlOiAqLwotCSAgcXNvcnQgKHNmLT5saW5lLCBzZi0+bnVtX2xpbmVzLCBzaXplb2YgKHNmLT5saW5lWzBdKSwgY21wX25jYWxscyk7Ci0JICB0YWJsZV9sZW4gPSBiYl90YWJsZV9sZW5ndGg7Ci0JICBpZiAodGFibGVfbGVuID4gc2YtPm51bV9saW5lcykKLQkgICAgewotCSAgICAgIHRhYmxlX2xlbiA9IHNmLT5udW1fbGluZXM7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCB0YWJsZV9sZW47ICsraSkKLQkgICAgewotCSAgICAgIHN5bSA9IHNmLT5saW5lW2ldOwotCSAgICAgIGlmICghc3ltIHx8IHN5bS0+bmNhbGxzID09IDApCi0JCXsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGZwcmludGYgKG9mcCwgIiU5ZCAlMTBsdVxuIiwgc3ltLT5saW5lX251bSwgc3ltLT5uY2FsbHMpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcmVlIChzZi0+bGluZSk7Ci0gICAgICBzZi0+bGluZSA9IDA7Ci0KLSAgICAgIGZwcmludGYgKG9mcCwgXygiXG5FeGVjdXRpb24gU3VtbWFyeTpcblxuIikpOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCIlOWxkICAgRXhlY3V0YWJsZSBsaW5lcyBpbiB0aGlzIGZpbGVcbiIpLAotCSAgICAgICBudW1fZXhlY3V0YWJsZV9saW5lcyk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5bGQgICBMaW5lcyBleGVjdXRlZFxuIiksIG51bV9saW5lc19leGVjdXRlZCk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5LjJmICAgUGVyY2VudCBvZiB0aGUgZmlsZSBleGVjdXRlZFxuIiksCi0JICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgID8gMTAwLjAgKiBudW1fbGluZXNfZXhlY3V0ZWQgLyAoZG91YmxlKSBudW1fZXhlY3V0YWJsZV9saW5lcwotCSAgICAgICA6IDEwMC4wKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiXG4lOWx1ICAgVG90YWwgbnVtYmVyIG9mIGxpbmUgZXhlY3V0aW9uc1xuIiksCi0JICAgICAgIHNmLT5uY2FsbHMpOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCIlOS4yZiAgIEF2ZXJhZ2UgZXhlY3V0aW9ucyBwZXIgbGluZVxuIiksCi0JICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgID8gKGRvdWJsZSkgc2YtPm5jYWxscyAvIChkb3VibGUpIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgIDogMC4wKTsKLSAgICAgIGlmIChvZnAgIT0gc3Rkb3V0KQotCXsKLQkgIGZjbG9zZSAob2ZwKTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmggYi9ncHJvZi9iYXNpY19ibG9ja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZWNhMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9iYXNpY19ibG9ja3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpZm5kZWYgYmFzaWNfYmxvY2tzX2gKLSNkZWZpbmUgYmFzaWNfYmxvY2tzX2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotLyoKLSAqIE9wdGlvbnM6Ci0gKi8KLWV4dGVybiBib29sIGJiX2Fubm90YXRlX2FsbF9saW5lczsJLyogZm9yY2UgYW5ub3RhdGlvbiBvZiBhbGwgbGluZXM/ICovCi1leHRlcm4gaW50IGJiX3RhYmxlX2xlbmd0aDsJCS8qIGxlbmd0aCBvZiBtb3N0LXVzZWQgYmIgdGFibGUgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJiX21pbl9jYWxsczsJLyogbWluaW11bSBleGVjdXRpb24gY291bnQgKi8KLQotZXh0ZXJuIHZvaWQgYmJfcmVhZF9yZWMgUEFSQU1TICgoRklMRSAqIGlmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGJiX3dyaXRlX2Jsb2NrcyBQQVJBTVMgKChGSUxFICogb2ZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgYmJfY3JlYXRlX3N5bXMgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBwcmludF9hbm5vdGF0ZWRfc291cmNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHByaW50X2V4ZWNfY291bnRzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIGJhc2ljX2Jsb2Nrc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9iYl9leGl0X2Z1bmMuYyBiL2dwcm9mL2JiX2V4aXRfZnVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMzMjE1Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2JiX2V4aXRfZnVuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NCBEYXZpZCBNb3NiZXJnZXItVGFuZy4KLSAqCi0gKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIF9fYmJfZXhpdF9mdW5jKCkgZHVtcHMgYWxsIHRoZSBiYXNpYy1ibG9jayBzdGF0aXN0aWNzIGxpbmtlZCBpbnRvCi0gKiB0aGUgYmJfaGVhZCBjaGFpbiB0byAuZCBmaWxlcy4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0KLS8qIHN0cnVjdHVyZSBlbWl0dGVkIGJ5IC1hICovCi1zdHJ1Y3QgYmIgewotICAgIGxvbmcJCXplcm9fd29yZDsKLSAgICBjb25zdCBjaGFyCQkqZmlsZW5hbWU7Ci0gICAgbG9uZwkJKmNvdW50czsKLSAgICBsb25nCQluY291bnRzOwotICAgIHN0cnVjdCBiYgkJKm5leHQ7Ci0gICAgY29uc3QgdW5zaWduZWQgbG9uZwkqYWRkcmVzc2VzOwotfTsKLQotc3RydWN0IGJiICpfX2JiX2hlYWQgPSAoc3RydWN0IGJiICopMDsKLQotCi12b2lkCi1fX2JiX2V4aXRfZnVuYyAodm9pZCkKLXsKLSAgICBjb25zdCBpbnQgdmVyc2lvbiA9IEdNT05fVkVSU0lPTjsKLSAgICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLSAgICBzdHJ1Y3QgYmIgKnB0cjsKLSAgICBGSUxFICpmcDsKLSAgICAvKgotICAgICAqIEdFTl9HTU9OX0NOVF9GSUxFIHNob3VsZCBiZSBkZWZpbmVkIG9uIHN5c3RlbXMgd2l0aCBtY2xlYW51cCgpCi0gICAgICogZnVuY3Rpb25zIHRoYXQgZG8gbm90IHdyaXRlIGJhc2ljLWJsb2NrIHRvIGdtb24ub3V0LiAgSW4gc3VjaAotICAgICAqIGNhc2VzIHByb2ZpbGluZyB3aXRoICItcGcgLWEiIHdvdWxkIHJlc3VsdCBpbiBhIGdtb24ub3V0IGZpbGUKLSAgICAgKiB3aXRob3V0IGJhc2ljLWJsb2NrIGluZm8gKGJlY2F1c2UgdGhlIGZpbGUgd3JpdHRlbiBoZXJlIHdvdWxkCi0gICAgICogYmUgb3ZlcndyaXR0ZW4uICBUaHVzLCBhIHNlcGFyYXRlIGZpbGUgaXMgZ2VuZXJhdGVkIGluc3RlYWQuCi0gICAgICogVGhlIHR3byBmaWxlcyBjYW4gZWFzaWx5IGJlIGNvbWJpbmVkIGJ5IHNwZWNpZnlpbmcgdGhlbQotICAgICAqIG9uIGdwcm9mJ3MgY29tbWFuZCBsaW5lIChhbmQgcG9zc2libHkgZ2VuZXJhdGluZyBhIGdtb24uc3VtCi0gICAgICogZmlsZSB3aXRoICJncHJvZiAtcyIpLgotICAgICAqLwotI2lmbmRlZiBHRU5fR01PTl9DTlRfRklMRQotIyAgIGRlZmluZSBPVVRfTkFNRQkiZ21vbi5vdXQiCi0jZWxzZQotIyAgIGRlZmluZSBPVVRfTkFNRQkiZ21vbi5jbnQiCi0jZW5kaWYKLSAgICBmcCA9IGZvcGVuKE9VVF9OQU1FLCAid2IiKTsKLSAgICBpZiAoIWZwKSB7Ci0JcGVycm9yKE9VVF9OQU1FKTsKLQlyZXR1cm47Ci0gICAgfSAvKiBpZiAqLwotICAgIG1lbWNweSgmZ2hkci5jb29raWVbMF0sIEdNT05fTUFHSUMsIDQpOwotICAgIG1lbWNweSgmZ2hkci52ZXJzaW9uLCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKTsKLSAgICBmd3JpdGUoJmdoZHIsIHNpemVvZihnaGRyKSwgMSwgZnApOwotCi0gICAgZm9yIChwdHIgPSBfX2JiX2hlYWQ7IHB0ciAhPSAwOyBwdHIgPSBwdHItPm5leHQpIHsKLQl1X2ludCBuY291bnRzID0gcHRyLT5uY291bnRzOwotCXVfY2hhciB0YWc7Ci0JdV9pbnQgaTsKLQotCXRhZyA9IEdNT05fVEFHX0JCX0NPVU5UOwotCWZ3cml0ZSgmdGFnLCBzaXplb2YodGFnKSwgMSwgZnApOwotCWZ3cml0ZSgmbmNvdW50cywgc2l6ZW9mKG5jb3VudHMpLCAxLCBmcCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmNvdW50czsgKytpKSB7Ci0JICAgIGZ3cml0ZSgmcHRyLT5hZGRyZXNzZXNbaV0sIHNpemVvZihwdHItPmFkZHJlc3Nlc1swXSksIDEsIGZwKTsKLQkgICAgZndyaXRlKCZwdHItPmNvdW50c1tpXSwgc2l6ZW9mKHB0ci0+Y291bnRzWzBdKSwgMSwgZnApOwotCX0gLyogZm9yICovCi0gICAgfSAvKiBmb3IgKi8KLSAgICBmY2xvc2UgKGZwKTsKLX0gLyogX19iYl9leGl0X2Z1bmMgKi8KLQotCQkJLyoqKiBlbmQgb2YgX19iYl9leGl0X2Z1bmMuYyAqKiovCmRpZmYgLS1naXQgYS9ncHJvZi9iYmNvbnYucGwgYi9ncHJvZi9iYmNvbnYucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczMTJmNTEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmJjb252LnBsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyEgL3Vzci9iaW4vcGVybAotCi0jIFRoaXMgc2NyaXB0IGNvbnZlcnRzIGEgImJiLm91dCIgZmlsZSBpbnRvIGEgZm9ybWF0Ci0jIHN1aXRhYmxlIGZvciBwcm9jZXNzaW5nIGJ5IGdwcm9mCi0KLSMgV3JpdGUgYSBuZXctc3R5bGUgZ21vbiBoZWFkZXIKLQotcHJpbnQgcGFjaygiQTRJeDEyIiwgImdtb24iLCAxKTsKLQotCi0jIFRoZSBpbnB1dCBmaWxlIGZvcm1hdCBjb250YWlucyBoZWFkZXIgbGluZXMgYW5kIGRhdGEgbGluZXMuCi0jIEhlYWRlciBsaW5lcyBjb250YWluIGEgY291bnQgb2YgaG93IG1hbnkgZGF0YSBsaW5lcyBmb2xsb3cgYmVmb3JlCi0jIHRoZSBuZXh0IGhlYWRlciBsaW5lLiAgJGJsb2NrY291bnQgaXMgc2V0IHRvIHRoZSBjb3VudCB0aGF0Ci0jIGFwcGVhcnMgaW4gZWFjaCBoZWFkZXIgbGluZSwgdGhlbiBkZWNyZW1lbnRlZCBhdCBlYWNoIGRhdGEgbGluZS4KLSMgJGJsb2NrY291bnQgc2hvdWxkIGFsd2F5cyBiZSB6ZXJvIGF0IHRoZSBzdGFydCBvZiBhIGhlYWRlciBsaW5lLAotIyBhbmQgc2hvdWxkIG5ldmVyIGJlIHplcm8gYXQgdGhlIHN0YXJ0IG9mIGEgZGF0YSBsaW5lLgotCi0kYmxvY2tjb3VudD0wOwotCi13aGlsZSAoPD4pIHsKLSAgICBpZiAoL15GaWxlIC4qLCAoWzAtOV0rKSBiYXNpYyBibG9ja3MvKSB7Ci0JcHJpbnQgU1RERVJSICJNaXNjb3VudDogbGluZSAkLlxuIiBpZiAoJGJsb2NrY291bnQgIT0gMCk7Ci0JJGJsb2NrY291bnQgPSAkMTsKLQotCXByaW50IHBhY2soImNJIiwgMiwgJGJsb2NrY291bnQpOwotICAgIH0KLSAgICBpZiAoL0Jsb2NrLipleGVjdXRlZChbIDAtOV0rKSB0aW1lLiogYWRkcmVzcz0gMHgoWzAtOWEtZkEtRl0qKS8pIHsKLQlwcmludCBTVERFUlIgIk1pc2NvdW50OiBsaW5lICQuXG4iIGlmICgkYmxvY2tjb3VudCA9PSAwKTsKLQkkYmxvY2tjb3VudC0tIGlmICgkYmxvY2tjb3VudCA+IDApOwotCi0JJGNvdW50ID0gJDE7Ci0JJGFkZHIgPSBoZXggJDI7Ci0KLQlwcmludCBwYWNrKCJJSSIsJGFkZHIsJGNvdW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9ic2RfY2FsbGdfYmwubSBiL2dwcm9mL2JzZF9jYWxsZ19ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNjOTZjLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2JzZF9jYWxsZ19ibC5tCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLQotCi0KLWNhbGwgZ3JhcGggcHJvZmlsZToKLSAgICAgICAgICBUaGUgc3VtIG9mIHNlbGYgYW5kIGRlc2NlbmRlbnRzIGlzIHRoZSBtYWpvciBzb3J0Ci0gICAgICAgICAgZm9yIHRoaXMgbGlzdGluZy4KLQotICAgICAgICAgIGZ1bmN0aW9uIGVudHJpZXM6Ci0KLWluZGV4ICAgICB0aGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBjYWxsIGdyYXBoCi0gICAgICAgICAgbGlzdGluZywgYXMgYW4gYWlkIHRvIGxvY2F0aW5nIGl0IChzZWUgYmVsb3cpLgotCi0ldGltZSAgICAgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHRpbWUgb2YgdGhlIHByb2dyYW0KLSAgICAgICAgICBhY2NvdW50ZWQgZm9yIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIGl0cwotICAgICAgICAgIGRlc2NlbmRlbnRzLgotCi1zZWxmICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNwZW50IGluIHRoaXMgZnVuY3Rpb24KLSAgICAgICAgICBpdHNlbGYuCi0KLWRlc2NlbmRlbnRzCi0gICAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNwZW50IGluIHRoZSBkZXNjZW5kZW50cyBvZgotICAgICAgICAgIHRoaXMgZnVuY3Rpb24gb24gYmVoYWxmIG9mIHRoaXMgZnVuY3Rpb24uCi0KLWNhbGxlZCAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIChvdGhlcgotICAgICAgICAgIHRoYW4gcmVjdXJzaXZlIGNhbGxzKS4KLQotc2VsZiAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBjYWxscyBpdHNlbGYKLSAgICAgICAgICByZWN1cnNpdmVseS4KLQotbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgd2l0aCBhbiBpbmRpY2F0aW9uIG9mCi0gICAgICAgICAgaXRzIG1lbWJlcnNoaXAgaW4gYSBjeWNsZSwgaWYgYW55LgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FsbCBncmFwaAotICAgICAgICAgIGxpc3RpbmcsIGFzIGFuIGFpZCB0byBsb2NhdGluZyBpdC4KLQotCi0KLSAgICAgICAgICBwYXJlbnQgbGlzdGluZ3M6Ci0KLXNlbGYqICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBmdW5jdGlvbidzIHNlbGYgdGltZQotICAgICAgICAgIHdoaWNoIGlzIGR1ZSB0byBjYWxscyBmcm9tIHRoaXMgcGFyZW50LgotCi1kZXNjZW5kZW50cyoKLSAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBmdW5jdGlvbidzCi0gICAgICAgICAgZGVzY2VuZGVudCB0aW1lIHdoaWNoIGlzIGR1ZSB0byBjYWxscyBmcm9tIHRoaXMKLSAgICAgICAgICBwYXJlbnQuCi0KLWNhbGxlZCoqICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5Ci0gICAgICAgICAgdGhpcyBwYXJlbnQuICBUaGlzIGlzIHRoZSBudW1lcmF0b3Igb2YgdGhlCi0gICAgICAgICAgZnJhY3Rpb24gd2hpY2ggZGl2aWRlcyB1cCB0aGUgZnVuY3Rpb24ncyB0aW1lIHRvCi0gICAgICAgICAgaXRzIHBhcmVudHMuCi0KLXRvdGFsKiAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCBieQotICAgICAgICAgIGFsbCBvZiBpdHMgcGFyZW50cy4gIFRoaXMgaXMgdGhlIGRlbm9taW5hdG9yIG9mCi0gICAgICAgICAgdGhlIHByb3BhZ2F0aW9uIGZyYWN0aW9uLgotCi1wYXJlbnRzICAgdGhlIG5hbWUgb2YgdGhpcyBwYXJlbnQsIHdpdGggYW4gaW5kaWNhdGlvbiBvZiB0aGUKLSAgICAgICAgICBwYXJlbnQncyBtZW1iZXJzaGlwIGluIGEgY3ljbGUsIGlmIGFueS4KLQotaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGlzIHBhcmVudCBpbiB0aGUgY2FsbCBncmFwaAotICAgICAgICAgIGxpc3RpbmcsIGFzIGFuIGFpZCBpbiBsb2NhdGluZyBpdC4KLQotCi0KLSAgICAgICAgICBjaGlsZHJlbiBsaXN0aW5nczoKLQotc2VsZiogICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGNoaWxkJ3Mgc2VsZiB0aW1lCi0gICAgICAgICAgd2hpY2ggaXMgZHVlIHRvIGJlaW5nIGNhbGxlZCBieSB0aGlzIGZ1bmN0aW9uLgotCi1kZXNjZW5kZW50KgotICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGNoaWxkJ3MgZGVzY2VuZGVudCdzCi0gICAgICAgICAgdGltZSB3aGljaCBpcyBkdWUgdG8gYmVpbmcgY2FsbGVkIGJ5IHRoaXMKLSAgICAgICAgICBmdW5jdGlvbi4KLQotY2FsbGVkKiogIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBjaGlsZCBpcyBjYWxsZWQgYnkgdGhpcwotICAgICAgICAgIGZ1bmN0aW9uLiAgVGhpcyBpcyB0aGUgbnVtZXJhdG9yIG9mIHRoZQotICAgICAgICAgIHByb3BhZ2F0aW9uIGZyYWN0aW9uIGZvciB0aGlzIGNoaWxkLgotCi10b3RhbCogICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGNoaWxkIGlzIGNhbGxlZCBieSBhbGwKLSAgICAgICAgICBmdW5jdGlvbnMuICBUaGlzIGlzIHRoZSBkZW5vbWluYXRvciBvZiB0aGUKLSAgICAgICAgICBwcm9wYWdhdGlvbiBmcmFjdGlvbi4KLQotY2hpbGRyZW4gIHRoZSBuYW1lIG9mIHRoaXMgY2hpbGQsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIGl0cwotICAgICAgICAgIG1lbWJlcnNoaXAgaW4gYSBjeWNsZSwgaWYgYW55LgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoaXMgY2hpbGQgaW4gdGhlIGNhbGwgZ3JhcGggbGlzdGluZywKLSAgICAgICAgICBhcyBhbiBhaWQgdG8gbG9jYXRpbmcgaXQuCi0KLQotCi0gICAgICAgICAgKiB0aGVzZSBmaWVsZHMgYXJlIG9taXR0ZWQgZm9yIHBhcmVudHMgKG9yCi0gICAgICAgICAgY2hpbGRyZW4pIGluIHRoZSBzYW1lIGN5Y2xlIGFzIHRoZSBmdW5jdGlvbi4gIElmCi0gICAgICAgICAgdGhlIGZ1bmN0aW9uIChvciBjaGlsZCkgaXMgYSBtZW1iZXIgb2YgYSBjeWNsZSwKLSAgICAgICAgICB0aGUgcHJvcGFnYXRlZCB0aW1lcyBhbmQgcHJvcGFnYXRpb24gZGVub21pbmF0b3IKLSAgICAgICAgICByZXByZXNlbnQgdGhlIHNlbGYgdGltZSBhbmQgZGVzY2VuZGVudCB0aW1lIG9mIHRoZQotICAgICAgICAgIGN5Y2xlIGFzIGEgd2hvbGUuCi0KLSAgICAgICAgICAqKiBzdGF0aWMtb25seSBwYXJlbnRzIGFuZCBjaGlsZHJlbiBhcmUgaW5kaWNhdGVkCi0gICAgICAgICAgYnkgYSBjYWxsIGNvdW50IG9mIDAuCi0KLQotCi0gICAgICAgICAgY3ljbGUgbGlzdGluZ3M6Ci0gICAgICAgICAgdGhlIGN5Y2xlIGFzIGEgd2hvbGUgaXMgbGlzdGVkIHdpdGggdGhlIHNhbWUKLSAgICAgICAgICBmaWVsZHMgYXMgYSBmdW5jdGlvbiBlbnRyeS4gIEJlbG93IGl0IGFyZSBsaXN0ZWQKLSAgICAgICAgICB0aGUgbWVtYmVycyBvZiB0aGUgY3ljbGUsIGFuZCB0aGVpciBjb250cmlidXRpb25zCi0gICAgICAgICAgdG8gdGhlIHRpbWUgYW5kIGNhbGwgY291bnRzIG9mIHRoZSBjeWNsZS4KLQwKZGlmZiAtLWdpdCBhL2dwcm9mL2NhbGxfZ3JhcGguYyBiL2dwcm9mL2NhbGxfZ3JhcGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlZTI1MS4uMDAwMDAwMAotLS0gYS9ncHJvZi9jYWxsX2dyYXBoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLWV4dGVybiB2b2lkCi1ERUZVTiAoY2dfdGFsbHksIChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCksCi0gICAgICAgYmZkX3ZtYSBmcm9tX3BjIEFORCBiZmRfdm1hIHNlbGZfcGMgQU5EIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0gIFN5bSAqcGFyZW50OwotICBTeW0gKmNoaWxkOwotCi0gIHBhcmVudCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGZyb21fcGMpOwotICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIHNlbGZfcGMpOwotCi0gIGlmIChjaGlsZCA9PSBOVUxMIHx8IHBhcmVudCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBJZiB3ZSdyZSBkb2luZyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZQotICAgICBjaGlsZCB3aWxsIHByb2JhYmx5IHBvaW50IHRvIGxpbmUgc3ltYm9scyBpbnN0ZWFkIG9mIGZ1bmN0aW9uCi0gICAgIHN5bWJvbHMuICBGb3IgdGhlIHBhcmVudCB0aGlzIGlzIGZpbmUsIHNpbmNlIHRoaXMgaWRlbnRpZmllcyB0aGUKLSAgICAgbGluZSBudW1iZXIgaW4gdGhlIGNhbGxpbmcgcm91dGluZywgYnV0IHRoZSBjaGlsZCBzaG91bGQgYWx3YXlzCi0gICAgIHBvaW50IHRvIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQsIHNvIHdlIGJhY2sgdXAgaW4gdGhlIHN5bWJvbAotICAgICB0YWJsZSB1bnRpbCB3ZSBmaW5kIGl0LgotICAgCi0gICAgIEZvciBub3JtYWwgcHJvZmlsaW5nLCBpc19mdW5jIHdpbGwgYmUgc2V0IG9uIGFsbCBzeW1ib2xzLCBzbyB0aGlzCi0gICAgIGNvZGUgd2lsbCBkbyBub3RoaW5nLiAgKi8KLQotICB3aGlsZSAoY2hpbGQgPj0gc3ltdGFiLmJhc2UgJiYgISBjaGlsZC0+aXNfZnVuYykKLSAgICAtLWNoaWxkOwotCi0gIGlmIChjaGlsZCA8IHN5bXRhYi5iYXNlKQotICAgIHJldHVybjsKLQotICAvKgotICAgKiBLZWVwIGFyYyBpZiBpdCBpcyBvbiBJTkNMX0FSQ1MgdGFibGUgb3IgaWYgdGhlIElOQ0xfQVJDUyB0YWJsZQotICAgKiBpcyBlbXB0eSBhbmQgaXQgaXMgbm90IGluIHRoZSBFWENMX0FSQ1MgdGFibGUuCi0gICAqLwotICBpZiAoc3ltX2lkX2FyY19pc19wcmVzZW50ICgmc3ltc1tJTkNMX0FSQ1NdLCBwYXJlbnQsIGNoaWxkKQotICAgICAgfHwgKHN5bXNbSU5DTF9BUkNTXS5sZW4gPT0gMAotCSAgJiYgIXN5bV9pZF9hcmNfaXNfcHJlc2VudCAoJnN5bXNbRVhDTF9BUkNTXSwgcGFyZW50LCBjaGlsZCkpKQotICAgIHsKLSAgICAgIGNoaWxkLT5uY2FsbHMgKz0gY291bnQ7Ci0gICAgICBEQkcgKFRBTExZREVCVUcsCi0JICAgcHJpbnRmIChfKCJbY2dfdGFsbHldIGFyYyBmcm9tICVzIHRvICVzIHRyYXZlcnNlZCAlbHUgdGltZXNcbiIpLAotCQkgICBwYXJlbnQtPm5hbWUsIGNoaWxkLT5uYW1lLCBjb3VudCkpOwotICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgY291bnQpOwotICAgIH0KLX0KLQotCi0vKgotICogUmVhZCBhIHJlY29yZCBmcm9tIGZpbGUgSUZQIGRlc2NyaWJpbmcgYW4gYXJjIGluIHRoZSBmdW5jdGlvbgotICogY2FsbC1ncmFwaCBhbmQgdGhlIGNvdW50IG9mIGhvdyBtYW55IHRpbWVzIHRoZSBhcmMgaGFzIGJlZW4KLSAqIHRyYXZlcnNlZC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lIG9mIGZpbGUgSUZQIGFuZCBpcyBwcm92aWRlZAotICogZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGNnX3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIENPTlNUIGNoYXIgKmZpbGVuYW1lKQotewotICBiZmRfdm1hIGZyb21fcGMsIHNlbGZfcGM7Ci0gIHN0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQgYXJjOwotICB1bnNpZ25lZCBsb25nIGNvdW50OwotCi0gIGlmIChmcmVhZCAoJmFyYywgc2l6ZW9mIChhcmMpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLSAgZnJvbV9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgYXJjLmZyb21fcGMpOwotICBzZWxmX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuc2VsZl9wYyk7Ci0gIGNvdW50ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuY291bnQpOwotICBEQkcgKFNBTVBMRURFQlVHLAotICAgICAgIHByaW50ZiAoIltjZ19yZWFkX3JlY10gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBmcm9tX3BjLCAodW5zaWduZWQgbG9uZykgc2VsZl9wYywgY291bnQpKTsKLSAgLyogYWRkIHRoaXMgYXJjOiAqLwotICBjZ190YWxseSAoZnJvbV9wYywgc2VsZl9wYywgY291bnQpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBhbGwgdGhlIGFyY3MgaW4gdGhlIGNhbGwtZ3JhcGggdG8gZmlsZSBPRlAuICBGSUxFTkFNRSBpcwotICogdGhlIG5hbWUgb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcwotICogb25seS4KLSAqLwotdm9pZAotREVGVU4gKGNnX3dyaXRlX2FyY3MsIChvZnAsIGZpbGVuYW1lKSwgRklMRSAqIG9mcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFnID0gR01PTl9UQUdfQ0dfQVJDOwotICBzdHJ1Y3QgZ21vbl9jZ19hcmNfcmVjb3JkIHJhd19hcmM7Ci0gIEFyYyAqYXJjOwotICBTeW0gKnN5bTsKLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7IHN5bSsrKQotICAgIHsKLSAgICAgIGZvciAoYXJjID0gc3ltLT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0JewotCSAgcHV0X3ZtYSAoY29yZV9iZmQsIGFyYy0+cGFyZW50LT5hZGRyLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5mcm9tX3BjKTsKLQkgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPmNoaWxkLT5hZGRyLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5zZWxmX3BjKTsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBhcmMtPmNvdW50LCAoYmZkX2J5dGUgKikgcmF3X2FyYy5jb3VudCk7Ci0JICBpZiAoZndyaXRlICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIG9mcCkgIT0gMQotCSAgICAgIHx8IGZ3cml0ZSAoJnJhd19hcmMsIHNpemVvZiAocmF3X2FyYyksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBEQkcgKFNBTVBMRURFQlVHLAotCSAgICAgcHJpbnRmICgiW2NnX3dyaXRlX2FyY3NdIGZyb21wYyAweCVseCBzZWxmcGMgMHglbHggY291bnQgJWx1XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSBhcmMtPnBhcmVudC0+YWRkciwKLQkJICAgICAodW5zaWduZWQgbG9uZykgYXJjLT5jaGlsZC0+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/ICovCi0gIH0KLUFyYzsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fY3ljbGVzOwkvKiBudW1iZXIgb2YgY3ljbGVzIGRpc2NvdmVyZWQgKi8KLWV4dGVybiBTeW0gKmN5Y2xlX2hlYWRlcjsJLyogY3ljbGUgaGVhZGVycyAqLwotCi1leHRlcm4gdm9pZCBhcmNfYWRkIFBBUkFNUyAoKFN5bSAqIHBhcmVudCwgU3ltICogY2hpbGQsIHVuc2lnbmVkIGxvbmcgY291bnQpKTsKLWV4dGVybiBBcmMgKmFyY19sb29rdXAgUEFSQU1TICgoU3ltICogcGFyZW50LCBTeW0gKiBjaGlsZCkpOwotZXh0ZXJuIFN5bSAqKmNnX2Fzc2VtYmxlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBBcmMgKiphcmNzOwotZXh0ZXJuIHVuc2lnbmVkIGludCBudW1hcmNzOwotCi0jZW5kaWYgLyogY2dfYXJjc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19kZm4uYyBiL2dwcm9mL2NnX2Rmbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQ2NGU3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX2Rmbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19kZm4uaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi0jZGVmaW5lCURGTl9JTkNSX0RFUFRIICgxMjgpCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBTeW0gKnN5bTsKLSAgICBpbnQgY3ljbGVfdG9wOwotICB9Ci1ERk5fU3RhY2s7Ci0KLURGTl9TdGFjayAqZGZuX3N0YWNrID0gTlVMTDsKLWludCBkZm5fbWF4ZGVwdGggPSAwOwotaW50IGRmbl9kZXB0aCA9IDA7Ci1pbnQgZGZuX2NvdW50ZXIgPSBERk5fTkFOOwotCi0KLS8qCi0gKiBJcyBDSElMRCBhbHJlYWR5IG51bWJlcmVkPwotICovCi1zdGF0aWMgYm9vbAotREVGVU4gKGlzX251bWJlcmVkLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgcmV0dXJuIGNoaWxkLT5jZy50b3Bfb3JkZXIgIT0gREZOX05BTiAmJiBjaGlsZC0+Y2cudG9wX29yZGVyICE9IERGTl9CVVNZOwotfQotCi0KLS8qCi0gKiBJcyBDSElMRCBhbHJlYWR5IGJ1c3k/Ci0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAoaXNfYnVzeSwgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIGlmIChjaGlsZC0+Y2cudG9wX29yZGVyID09IERGTl9OQU4pCi0gICAgewotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIENISUxEIGlzIHBhcnQgb2YgYSBjeWNsZS4gIEZpbmQgdGhlIHRvcCBjYWxsZXIgaW50byB0aGlzIGN5Y2xlCi0gKiB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSBjeWNsZSBhbmQgbWFrZSBhbGwgZnVuY3Rpb25zIGluIGN5Y2xlCi0gKiBtZW1iZXJzIG9mIHRoYXQgY3ljbGUgKHRvcCBjYWxsZXIgPT0gY2FsbGVyIHdpdGggc21hbGxlc3QKLSAqIGRlcHRoLWZpcnN0IG51bWJlcikuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZmluZF9jeWNsZSwgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIFN5bSAqaGVhZCA9IDA7Ci0gIFN5bSAqdGFpbDsKLSAgaW50IGN5Y2xlX3RvcDsKLSAgaW50IGluZGV4OwotCi0gIGZvciAoY3ljbGVfdG9wID0gZGZuX2RlcHRoOyBjeWNsZV90b3AgPiAwOyAtLWN5Y2xlX3RvcCkKLSAgICB7Ci0gICAgICBoZWFkID0gZGZuX3N0YWNrW2N5Y2xlX3RvcF0uc3ltOwotICAgICAgaWYgKGNoaWxkID09IGhlYWQpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSBjaGlsZCAmJiBjaGlsZC0+Y2cuY3ljLmhlYWQgPT0gaGVhZCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBpZiAoY3ljbGVfdG9wIDw9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2ZpbmRfY3ljbGVdIGNvdWxkbid0IGZpbmQgaGVhZCBvZiBjeWNsZVxuIik7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0jaWZkZWYgREVCVUcKLSAgaWYgKGRlYnVnX2xldmVsICYgREZOREVCVUcpCi0gICAgewotICAgICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGRmbl9kZXB0aCAlZCBjeWNsZV90b3AgJWQgIiwKLQkgICAgICBkZm5fZGVwdGgsIGN5Y2xlX3RvcCk7Ci0gICAgICBpZiAoaGVhZCkKLQl7Ci0JICBwcmludF9uYW1lIChoZWFkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiPHVua25vd24+Iik7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGN5Y2xlX3RvcCA9PSBkZm5fZGVwdGgpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFRoaXMgaXMgcHJldmlvdXMgZnVuY3Rpb24sIGUuZy4gdGhpcyBjYWxscyBpdHNlbGYuICBTb3J0IG9mCi0gICAgICAgKiBib3JpbmcuCi0gICAgICAgKgotICAgICAgICogU2luY2Ugd2UgYXJlIHRha2luZyBvdXQgc2VsZi1jeWNsZXMgZWxzZXdoZXJlIG5vIG5lZWQgZm9yCi0gICAgICAgKiB0aGUgc3BlY2lhbCBjYXNlLCBoZXJlLgotICAgICAgICovCi0gICAgICBEQkcgKERGTkRFQlVHLAotCSAgIHByaW50ZiAoIltmaW5kX2N5Y2xlXSAiKTsKLQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICAgcHJpbnRmICgiXG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEdsb20gaW50ZXJ2ZW5pbmcgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGFscmVhZHkgZ2xvbW1lZCBpbnRvCi0gICAgICAgKiB0aGlzIGN5Y2xlLiAgVGhpbmdzIGhhdmUgYmVlbiBnbG9tbWVkIHdoZW4gdGhlaXIgY3ljbGVoZWFkCi0gICAgICAgKiBmaWVsZCBwb2ludHMgdG8gdGhlIGhlYWQgb2YgdGhlIGN5Y2xlIHRoZXkgYXJlIGdsb21tZWQKLSAgICAgICAqIGludG8uCi0gICAgICAgKi8KLSAgICAgIGZvciAodGFpbCA9IGhlYWQ7IHRhaWwtPmNnLmN5Yy5uZXh0OyB0YWlsID0gdGFpbC0+Y2cuY3ljLm5leHQpCi0JewotCSAgLyogdm9pZDogY2hhc2UgZG93biB0byB0YWlsIG9mIHRoaW5ncyBhbHJlYWR5IGdsb21tZWQgKi8KLQkgIERCRyAoREZOREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kX2N5Y2xlXSB0YWlsICIpOwotCSAgICAgICBwcmludF9uYW1lICh0YWlsKTsKLQkgICAgICAgcHJpbnRmICgiXG4iKSk7Ci0JfQotICAgICAgLyoKLSAgICAgICAqIElmIHdoYXQgd2UgdGhpbmsgaXMgdGhlIHRvcCBvZiB0aGUgY3ljbGUgaGFzIGEgY3ljbGVoZWFkCi0gICAgICAgKiBmaWVsZCwgdGhlbiBpdCdzIG5vdCByZWFsbHkgdGhlIGhlYWQgb2YgdGhlIGN5Y2xlLCB3aGljaCBpcwotICAgICAgICogcmVhbGx5IHdoYXQgd2Ugd2FudC4KLSAgICAgICAqLwotICAgICAgaWYgKGhlYWQtPmNnLmN5Yy5oZWFkICE9IGhlYWQpCi0JewotCSAgaGVhZCA9IGhlYWQtPmNnLmN5Yy5oZWFkOwotCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIG5ldyBjeWNsZWhlYWQgIik7Ci0JICAgICAgIHByaW50X25hbWUgKGhlYWQpOwotCSAgICAgICBwcmludGYgKCJcbiIpKTsKLQl9Ci0gICAgICBmb3IgKGluZGV4ID0gY3ljbGVfdG9wICsgMTsgaW5kZXggPD0gZGZuX2RlcHRoOyArK2luZGV4KQotCXsKLQkgIGNoaWxkID0gZGZuX3N0YWNrW2luZGV4XS5zeW07Ci0JICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkID09IGNoaWxkKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBOb3QgeWV0IGdsb21tZWQgYW55d2hlcmUsIGdsb20gaXQgYW5kIGZpeCBhbnkKLQkgICAgICAgKiBjaGlsZHJlbiBpdCBoYXMgZ2xvbW1lZC4KLQkgICAgICAgKi8KLQkgICAgICB0YWlsLT5jZy5jeWMubmV4dCA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5jZy5jeWMuaGVhZCA9IGhlYWQ7Ci0JICAgICAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGdsb21taW5nICIpOwotCQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JCSAgIHByaW50ZiAoIiBvbnRvICIpOwotCQkgICBwcmludF9uYW1lIChoZWFkKTsKLQkJICAgcHJpbnRmICgiXG4iKSk7Ci0JICAgICAgZm9yICh0YWlsID0gY2hpbGQ7IHRhaWwtPmNnLmN5Yy5uZXh0OyB0YWlsID0gdGFpbC0+Y2cuY3ljLm5leHQpCi0JCXsKLQkJICB0YWlsLT5jZy5jeWMubmV4dC0+Y2cuY3ljLmhlYWQgPSBoZWFkOwotCQkgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltmaW5kX2N5Y2xlXSBhbmQgaXRzIHRhaWwgIik7Ci0JCSAgICAgICBwcmludF9uYW1lICh0YWlsLT5jZy5jeWMubmV4dCk7Ci0JCSAgICAgICBwcmludGYgKCIgb250byAiKTsKLQkJICAgICAgIHByaW50X25hbWUgKGhlYWQpOwotCQkgICAgICAgcHJpbnRmICgiXG4iKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IGhlYWQgLyogZmlyZXdhbGwgKi8gKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2ZpbmRfY3ljbGVdIGdsb21tZWQsIGJ1dCBub3QgdG8gaGVhZFxuIik7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBQcmVwYXJlIGZvciB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgUEFSRU5ULiAgUHVzaCBhIHBhcmVudCBvbnRvCi0gKiB0aGUgc3RhY2sgYW5kIG1hcmsgaXQgYnVzeS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcmVfdmlzaXQsIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gICsrZGZuX2RlcHRoOwotCi0gIGlmIChkZm5fZGVwdGggPj0gZGZuX21heGRlcHRoKQotICAgIHsKLSAgICAgIGRmbl9tYXhkZXB0aCArPSBERk5fSU5DUl9ERVBUSDsKLSAgICAgIGRmbl9zdGFjayA9IHhyZWFsbG9jIChkZm5fc3RhY2ssIGRmbl9tYXhkZXB0aCAqIHNpemVvZiAqZGZuX3N0YWNrKTsKLSAgICB9Ci0KLSAgZGZuX3N0YWNrW2Rmbl9kZXB0aF0uc3ltID0gcGFyZW50OwotICBkZm5fc3RhY2tbZGZuX2RlcHRoXS5jeWNsZV90b3AgPSBkZm5fZGVwdGg7Ci0gIHBhcmVudC0+Y2cudG9wX29yZGVyID0gREZOX0JVU1k7Ci0gIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwcmVfdmlzaXRdXHRcdCVkOiIsIGRmbl9kZXB0aCk7Ci0gICAgICAgcHJpbnRfbmFtZSAocGFyZW50KTsKLSAgICAgICBwcmludGYgKCJcbiIpKTsKLX0KLQotCi0vKgotICogRG9uZSB3aXRoIHZpc2l0aW5nIG5vZGUgUEFSRU5ULiAgUG9wIFBBUkVOVCBvZmYgZGZuX3N0YWNrCi0gKiBhbmQgbnVtYmVyIGZ1bmN0aW9ucyBpZiBQQVJFTlQgaXMgaGVhZCBvZiBhIGN5Y2xlLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHBvc3RfdmlzaXQsIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIFN5bSAqbWVtYmVyOwotCi0gIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwb3N0X3Zpc2l0XVx0JWQ6ICIsIGRmbl9kZXB0aCk7Ci0gICAgICAgcHJpbnRfbmFtZSAocGFyZW50KTsKLSAgICAgICBwcmludGYgKCJcbiIpKTsKLSAgLyoKLSAgICogTnVtYmVyIGZ1bmN0aW9ucyBhbmQgdGhpbmdzIGluIHRoZWlyIGN5Y2xlcyB1bmxlc3MgdGhlIGZ1bmN0aW9uCi0gICAqIGlzIGl0c2VsZiBwYXJ0IG9mIGEgY3ljbGU6Ci0gICAqLwotICBpZiAocGFyZW50LT5jZy5jeWMuaGVhZCA9PSBwYXJlbnQpCi0gICAgewotICAgICAgKytkZm5fY291bnRlcjsKLSAgICAgIGZvciAobWVtYmVyID0gcGFyZW50OyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgbWVtYmVyLT5jZy50b3Bfb3JkZXIgPSBkZm5fY291bnRlcjsKLQkgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwb3N0X3Zpc2l0XVx0XHRtZW1iZXIgIik7Ci0JICAgICAgIHByaW50X25hbWUgKG1lbWJlcik7Ci0JICAgICAgIHByaW50ZiAoIi0+IGNnLnRvcF9vcmRlciA9ICVkXG4iLCBkZm5fY291bnRlcikpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbcG9zdF92aXNpdF1cdFx0aXMgcGFydCBvZiBhIGN5Y2xlXG4iKSk7Ci0gICAgfQotICAtLWRmbl9kZXB0aDsKLX0KLQotCi0vKgotICogR2l2ZW4gdGhpcyBQQVJFTlQsIGRlcHRoIGZpcnN0IG51bWJlciBpdHMgY2hpbGRyZW4uCi0gKi8KLXZvaWQKLURFRlVOIChjZ19kZm4sIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIEFyYyAqYXJjOwotCi0gIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltkZm5dIGRmbiggIik7Ci0gICAgICAgcHJpbnRfbmFtZSAocGFyZW50KTsKLSAgICAgICBwcmludGYgKCIpXG4iKSk7Ci0gIC8qCi0gICAqIElmIHdlJ3JlIGFscmVhZHkgbnVtYmVyZWQsIG5vIG5lZWQgdG8gbG9vayBhbnkgZnVydGhlcjoKLSAgICovCi0gIGlmIChpc19udW1iZXJlZCAocGFyZW50KSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKgotICAgKiBJZiB3ZSdyZSBhbHJlYWR5IGJ1c3ksIG11c3QgYmUgYSBjeWNsZToKLSAgICovCi0gIGlmIChpc19idXN5IChwYXJlbnQpKQotICAgIHsKLSAgICAgIGZpbmRfY3ljbGUgKHBhcmVudCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBwcmVfdmlzaXQgKHBhcmVudCk7Ci0gIC8qCi0gICAqIFJlY3Vyc2l2ZWx5IHZpc2l0IGNoaWxkcmVuOgotICAgKi8KLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLSAgICB7Ci0gICAgICBjZ19kZm4gKGFyYy0+Y2hpbGQpOwotICAgIH0KLSAgcG9zdF92aXNpdCAocGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX2Rmbi5oIGIvZ3Byb2YvY2dfZGZuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDMwMzAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfZGZuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaWZuZGVmIGNnX2Rmbl9oCi0jZGVmaW5lIGNnX2Rmbl9oCi0KLS8qCi0gKiBGbGFncyB3aGljaCBtYXJrIGEgc3ltYm9sIGFzIHRvcG9sb2dpY2FsbHkgYGBidXN5Jycgb3IgYXMKLSAqIHRvcG9sb2dpY2FsbHkgYGBub3RfbnVtYmVyZWQnJzoKLSAqLwotI2RlZmluZQlERk5fQlVTWQktMQotI2RlZmluZQlERk5fTkFOCQkwCi0KLS8qCi0gKiBEZXB0aC1maXJzdCBudW1iZXJpbmcgb2YgYSBjYWxsLWdyYXBoLgotICovCi0KLWV4dGVybiB2b2lkIGNnX2RmbiBQQVJBTVMgKChTeW0gKiByb290KSk7Ci0KLSNlbmRpZiAvKiBjZ19kZm5faCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfcHJpbnQuYyBiL2dwcm9mL2NnX3ByaW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDViYzcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfcHJpbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNzYgKzAsMCBAQAotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19wcmludC5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi0vKgotICogUmV0dXJuIHZhbHVlIG9mIGNvbXBhcmlzb24gZnVuY3Rpb25zIHVzZWQgdG8gc29ydCB0YWJsZXM6Ci0gKi8KLSNkZWZpbmUJTEVTU1RIQU4JLTEKLSNkZWZpbmUJRVFVQUxUTwkJMAotI2RlZmluZQlHUkVBVEVSVEhBTgkxCi0KLXN0YXRpYyB2b2lkIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIFBBUkFNUyAoKEFyYyAqKiwgdW5zaWduZWQgbG9uZywKLQkJCQkJCSAgICAgIGludCwgQXJjICoqLAotCQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKSk7Ci0vKiBkZWNsYXJhdGlvbnMgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIHRvIG91dHB1dCBibHVyYnM6ICovCi1leHRlcm4gdm9pZCBic2RfY2FsbGdfYmx1cmIgUEFSQU1TICgoRklMRSAqIGZwKSk7Ci1leHRlcm4gdm9pZCBmc2ZfY2FsbGdfYmx1cmIgUEFSQU1TICgoRklMRSAqIGZwKSk7Ci0KLWRvdWJsZSBwcmludF90aW1lID0gMC4wOwotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTl9WT0lEIChwcmludF9oZWFkZXIpCi17Ci0gIGlmIChmaXJzdF9vdXRwdXQpCi0gICAgewotICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiXGZcbiIpOwotICAgIH0KLSAgaWYgKCFic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGlmIChwcmludF9kZXNjcmlwdGlvbnMpCi0JewotCSAgcHJpbnRmIChfKCJcdFx0ICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKVxuXG4iKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXHRcdFx0Q2FsbCBncmFwaFxuXG4iKSk7Ci0JfQotICAgIH0KLSAgcHJpbnRmIChfKCJcbmdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzICVsZCBieXRlKHMpIiksCi0JICAobG9uZykgaGlzdF9zY2FsZSAqIHNpemVvZiAoVU5JVCkpOwotICBpZiAocHJpbnRfdGltZSA+IDAuMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiBmb3IgJS4yZiUlIG9mICUuMmYgc2Vjb25kc1xuXG4iKSwKLQkgICAgICAxMDAuMCAvIHByaW50X3RpbWUsIHByaW50X3RpbWUgLyBoeik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgbm8gdGltZSBwcm9wYWdhdGVkXG5cbiIpKTsKLSAgICAgIC8qCi0gICAgICAgKiBUaGlzIGRvZXNuJ3QgaHVydCwgc2luY2UgYWxsIHRoZSBudW1lcmF0b3JzIHdpbGwgYmUgMC4wOgotICAgICAgICovCi0gICAgICBwcmludF90aW1lID0gMS4wOwotICAgIH0KLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgcHJpbnRmICgiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cy8lLTcuN3MgICAgICUtOC44c1xuIiwKLQkgICAgICAiIiwgIiIsICIiLCAiIiwgXygiY2FsbGVkIiksIF8oInRvdGFsIiksIF8oInBhcmVudHMiKSk7Ci0gICAgICBwcmludGYgKCIlLTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cyslLTcuN3MgJS04LjhzXHQlNS41c1xuIiwKLQkgICAgICBfKCJpbmRleCIpLCBfKCIldGltZSIpLCBfKCJzZWxmIiksIF8oImRlc2NlbmRlbnRzIiksCi0JICAgICAgXygiY2FsbGVkIiksIF8oInNlbGYiKSwgXygibmFtZSIpLCBfKCJpbmRleCIpKTsKLSAgICAgIHByaW50ZiAoIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MvJS03LjdzICAgICAlLTguOHNcbiIsCi0JICAgICAgIiIsICIiLCAiIiwgIiIsIF8oImNhbGxlZCIpLCBfKCJ0b3RhbCIpLCBfKCJjaGlsZHJlbiIpKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmIChfKCJpbmRleCAlJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZVxuIikpOwotICAgIH0KLX0KLQotCi0vKgotICogUHJpbnQgYSBjeWNsZSBoZWFkZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfY3ljbGUsIChjeWMpLCBTeW0gKiBjeWMpCi17Ci0gIGNoYXIgYnVmW0JVRlNJWl07Ci0KLSAgc3ByaW50ZiAoYnVmLCAiWyVkXSIsIGN5Yy0+Y2cuaW5kZXgpOwotICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkgID8gIiUtNi42cyAlNS4xZiAlNy4yZiAlMTEuMmYgJTdsdSIKLQkgIDogIiUtNi42cyAlNS4xZiAlNy4yZiAlNy4yZiAlN2x1IiwgYnVmLAotCSAgMTAwICogKGN5Yy0+Y2cucHJvcC5zZWxmICsgY3ljLT5jZy5wcm9wLmNoaWxkKSAvIHByaW50X3RpbWUsCi0JICBjeWMtPmNnLnByb3Auc2VsZiAvIGh6LCBjeWMtPmNnLnByb3AuY2hpbGQgLyBoeiwgY3ljLT5uY2FsbHMpOwotICBpZiAoY3ljLT5jZy5zZWxmX2NhbGxzICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiKyUtN2x1IiwgY3ljLT5jZy5zZWxmX2NhbGxzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJTcuN3MiLCAiIik7Ci0gICAgfQotICBwcmludGYgKF8oIiA8Y3ljbGUgJWQgYXMgYSB3aG9sZT4gWyVkXVxuIiksIGN5Yy0+Y2cuY3ljLm51bSwgY3ljLT5jZy5pbmRleCk7Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgTEVGVCBhbmQgUklHSFQgbWVtYm1lci4gIE1ham9yIGNvbXBhcmlzb24ga2V5IGlzCi0gKiBDRy5QUk9QLlNFTEYrQ0cuUFJPUC5DSElMRCwgc2Vjb25kYXJ5IGtleSBpcyBOQ0FMTFMrQ0cuU0VMRl9DQUxMUy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9tZW1iZXIsIChsZWZ0LCByaWdodCksIFN5bSAqIGxlZnQgQU5EIFN5bSAqIHJpZ2h0KQotewotICBkb3VibGUgbGVmdF90aW1lID0gbGVmdC0+Y2cucHJvcC5zZWxmICsgbGVmdC0+Y2cucHJvcC5jaGlsZDsKLSAgZG91YmxlIHJpZ2h0X3RpbWUgPSByaWdodC0+Y2cucHJvcC5zZWxmICsgcmlnaHQtPmNnLnByb3AuY2hpbGQ7Ci0gIHVuc2lnbmVkIGxvbmcgbGVmdF9jYWxscyA9IGxlZnQtPm5jYWxscyArIGxlZnQtPmNnLnNlbGZfY2FsbHM7Ci0gIHVuc2lnbmVkIGxvbmcgcmlnaHRfY2FsbHMgPSByaWdodC0+bmNhbGxzICsgcmlnaHQtPmNnLnNlbGZfY2FsbHM7Ci0KLSAgaWYgKGxlZnRfdGltZSA+IHJpZ2h0X3RpbWUpCi0gICAgewotICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwotICAgIH0KLSAgaWYgKGxlZnRfdGltZSA8IHJpZ2h0X3RpbWUpCi0gICAgewotICAgICAgcmV0dXJuIExFU1NUSEFOOwotICAgIH0KLQotICBpZiAobGVmdF9jYWxscyA+IHJpZ2h0X2NhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKLSAgICB9Ci0gIGlmIChsZWZ0X2NhbGxzIDwgcmlnaHRfY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIExFU1NUSEFOOwotICAgIH0KLSAgcmV0dXJuIEVRVUFMVE87Ci19Ci0KLQotLyoKLSAqIFNvcnQgbWVtYmVycyBvZiBhIGN5Y2xlLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHNvcnRfbWVtYmVycywgKGN5YyksIFN5bSAqIGN5YykKLXsKLSAgU3ltICp0b2RvLCAqZG9pbmcsICpwcmV2OwotICAvKgotICAgKiBEZXRhY2ggY3ljbGUgbWVtYmVycyBmcm9tIGN5Y2xlaGVhZCwgYW5kIGluc2VydGlvbiBzb3J0IHRoZW0KLSAgICogYmFjayBvbi4KLSAgICovCi0gIHRvZG8gPSBjeWMtPmNnLmN5Yy5uZXh0OwotICBjeWMtPmNnLmN5Yy5uZXh0ID0gMDsKLSAgZm9yIChkb2luZyA9IHRvZG87IGRvaW5nICYmIGRvaW5nLT5jZy5jeWMubmV4dDsgZG9pbmcgPSB0b2RvKQotICAgIHsKLSAgICAgIHRvZG8gPSBkb2luZy0+Y2cuY3ljLm5leHQ7Ci0gICAgICBmb3IgKHByZXYgPSBjeWM7IHByZXYtPmNnLmN5Yy5uZXh0OyBwcmV2ID0gcHJldi0+Y2cuY3ljLm5leHQpCi0JewotCSAgaWYgKGNtcF9tZW1iZXIgKGRvaW5nLCBwcmV2LT5jZy5jeWMubmV4dCkgPT0gR1JFQVRFUlRIQU4pCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGRvaW5nLT5jZy5jeWMubmV4dCA9IHByZXYtPmNnLmN5Yy5uZXh0OwotICAgICAgcHJldi0+Y2cuY3ljLm5leHQgPSBkb2luZzsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFByaW50IHRoZSBtZW1iZXJzIG9mIGEgY3ljbGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfbWVtYmVycywgKGN5YyksIFN5bSAqIGN5YykKLXsKLSAgU3ltICptZW1iZXI7Ci0KLSAgc29ydF9tZW1iZXJzIChjeWMpOwotICBmb3IgKG1lbWJlciA9IGN5Yy0+Y2cuY3ljLm5leHQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLSAgICB7Ci0gICAgICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkgICAgICA/ICIlNi42cyAlNS41cyAlNy4yZiAlMTEuMmYgJTdsdSIKLQkgICAgICA6ICIlNi42cyAlNS41cyAlNy4yZiAlNy4yZiAlN2x1IiwKLQkgICAgICAiIiwgIiIsIG1lbWJlci0+Y2cucHJvcC5zZWxmIC8gaHosIG1lbWJlci0+Y2cucHJvcC5jaGlsZCAvIGh6LAotCSAgICAgIG1lbWJlci0+bmNhbGxzKTsKLSAgICAgIGlmIChtZW1iZXItPmNnLnNlbGZfY2FsbHMgIT0gMCkKLQl7Ci0JICBwcmludGYgKCIrJS03bHUiLCBtZW1iZXItPmNnLnNlbGZfY2FsbHMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIgJTcuN3MiLCAiIik7Ci0JfQotICAgICAgcHJpbnRmICgiICAgICAiKTsKLSAgICAgIHByaW50X25hbWUgKG1lbWJlcik7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotCi0vKgotICogQ29tcGFyZSB0d28gYXJjcyB0by9mcm9tIHRoZSBzYW1lIGNoaWxkL3BhcmVudC4KLSAqICAgICAgLSBpZiBvbmUgYXJjIGlzIGEgc2VsZiBhcmMsIGl0J3MgbGVhc3QuCi0gKiAgICAgIC0gaWYgb25lIGFyYyBpcyB3aXRoaW4gYSBjeWNsZSwgaXQncyBsZXNzIHRoYW4uCi0gKiAgICAgIC0gaWYgYm90aCBhcmNzIGFyZSB3aXRoaW4gYSBjeWNsZSwgY29tcGFyZSBhcmMgY291bnRzLgotICogICAgICAtIGlmIG5laXRoZXIgYXJjIGlzIHdpdGhpbiBhIGN5Y2xlLCBjb21wYXJlIHdpdGgKLSAqICAgICAgICAgICAgICB0aW1lICsgY2hpbGRfdGltZSBhcyBtYWpvciBrZXkKLSAqICAgICAgICAgICAgICBhcmMgY291bnQgYXMgbWlub3Iga2V5Ci0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfYXJjLCAobGVmdCwgcmlnaHQpLCBBcmMgKiBsZWZ0IEFORCBBcmMgKiByaWdodCkKLXsKLSAgU3ltICpsZWZ0X3BhcmVudCA9IGxlZnQtPnBhcmVudDsKLSAgU3ltICpsZWZ0X2NoaWxkID0gbGVmdC0+Y2hpbGQ7Ci0gIFN5bSAqcmlnaHRfcGFyZW50ID0gcmlnaHQtPnBhcmVudDsKLSAgU3ltICpyaWdodF9jaGlsZCA9IHJpZ2h0LT5jaGlsZDsKLSAgZG91YmxlIGxlZnRfdGltZSwgcmlnaHRfdGltZTsKLQotICBEQkcgKFRJTUVERUJVRywKLSAgICAgICBwcmludGYgKCJbY21wX2FyY10gIik7Ci0gICAgICAgcHJpbnRfbmFtZSAobGVmdF9wYXJlbnQpOwotICAgICAgIHByaW50ZiAoIiBjYWxscyAiKTsKLSAgICAgICBwcmludF9uYW1lIChsZWZ0X2NoaWxkKTsKLSAgICAgICBwcmludGYgKCIgJWYgKyAlZiAlbHUvJWx1XG4iLCBsZWZ0LT50aW1lLCBsZWZ0LT5jaGlsZF90aW1lLAotCSAgICAgICBsZWZ0LT5jb3VudCwgbGVmdF9jaGlsZC0+bmNhbGxzKTsKLSAgICAgICBwcmludGYgKCJbY21wX2FyY10gIik7Ci0gICAgICAgcHJpbnRfbmFtZSAocmlnaHRfcGFyZW50KTsKLSAgICAgICBwcmludGYgKCIgY2FsbHMgIik7Ci0gICAgICAgcHJpbnRfbmFtZSAocmlnaHRfY2hpbGQpOwotICAgICAgIHByaW50ZiAoIiAlZiArICVmICVsdS8lbHVcbiIsIHJpZ2h0LT50aW1lLCByaWdodC0+Y2hpbGRfdGltZSwKLQkgICAgICAgcmlnaHQtPmNvdW50LCByaWdodF9jaGlsZC0+bmNhbGxzKTsKLSAgICAgICBwcmludGYgKCJcbiIpOwotICAgICk7Ci0gIGlmIChsZWZ0X3BhcmVudCA9PSBsZWZ0X2NoaWxkKQotICAgIHsKLSAgICAgIHJldHVybiBMRVNTVEhBTjsJCS8qIGxlZnQgaXMgYSBzZWxmIGNhbGwgKi8KLSAgICB9Ci0gIGlmIChyaWdodF9wYXJlbnQgPT0gcmlnaHRfY2hpbGQpCi0gICAgewotICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwkvKiByaWdodCBpcyBhIHNlbGYgY2FsbCAqLwotICAgIH0KLQotICBpZiAobGVmdF9wYXJlbnQtPmNnLmN5Yy5udW0gIT0gMCAmJiBsZWZ0X2NoaWxkLT5jZy5jeWMubnVtICE9IDAKLSAgICAgICYmIGxlZnRfcGFyZW50LT5jZy5jeWMubnVtID09IGxlZnRfY2hpbGQtPmNnLmN5Yy5udW0pCi0gICAgewotICAgICAgLyogbGVmdCBpcyBhIGNhbGwgd2l0aGluIGEgY3ljbGUgKi8KLSAgICAgIGlmIChyaWdodF9wYXJlbnQtPmNnLmN5Yy5udW0gIT0gMCAmJiByaWdodF9jaGlsZC0+Y2cuY3ljLm51bSAhPSAwCi0JICAmJiByaWdodF9wYXJlbnQtPmNnLmN5Yy5udW0gPT0gcmlnaHRfY2hpbGQtPmNnLmN5Yy5udW0pCi0JewotCSAgLyogcmlnaHQgaXMgYSBjYWxsIHdpdGhpbiB0aGUgY3ljbGUsIHRvbyAqLwotCSAgaWYgKGxlZnQtPmNvdW50IDwgcmlnaHQtPmNvdW50KQotCSAgICB7Ci0JICAgICAgcmV0dXJuIExFU1NUSEFOOwotCSAgICB9Ci0JICBpZiAobGVmdC0+Y291bnQgPiByaWdodC0+Y291bnQpCi0JICAgIHsKLQkgICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0JICAgIH0KLQkgIHJldHVybiBFUVVBTFRPOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiByaWdodCBpc24ndCBhIGNhbGwgd2l0aGluIHRoZSBjeWNsZSAqLwotCSAgcmV0dXJuIExFU1NUSEFOOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBsZWZ0IGlzbid0IGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLwotICAgICAgaWYgKHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSAhPSAwICYmIHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtICE9IDAKLQkgICYmIHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSA9PSByaWdodF9jaGlsZC0+Y2cuY3ljLm51bSkKLQl7Ci0JICAvKiByaWdodCBpcyBhIGNhbGwgd2l0aGluIGEgY3ljbGUgKi8KLQkgIHJldHVybiBHUkVBVEVSVEhBTjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbmVpdGhlciBpcyBhIGNhbGwgd2l0aGluIGEgY3ljbGUgKi8KLQkgIGxlZnRfdGltZSA9IGxlZnQtPnRpbWUgKyBsZWZ0LT5jaGlsZF90aW1lOwotCSAgcmlnaHRfdGltZSA9IHJpZ2h0LT50aW1lICsgcmlnaHQtPmNoaWxkX3RpbWU7Ci0JICBpZiAobGVmdF90aW1lIDwgcmlnaHRfdGltZSkKLQkgICAgewotCSAgICAgIHJldHVybiBMRVNTVEhBTjsKLQkgICAgfQotCSAgaWYgKGxlZnRfdGltZSA+IHJpZ2h0X3RpbWUpCi0JICAgIHsKLQkgICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0JICAgIH0KLQkgIGlmIChsZWZ0LT5jb3VudCA8IHJpZ2h0LT5jb3VudCkKLQkgICAgewotCSAgICAgIHJldHVybiBMRVNTVEhBTjsKLQkgICAgfQotCSAgaWYgKGxlZnQtPmNvdW50ID4gcmlnaHQtPmNvdW50KQotCSAgICB7Ci0JICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwotCSAgICB9Ci0JICByZXR1cm4gRVFVQUxUTzsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoc29ydF9wYXJlbnRzLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgQXJjICphcmMsICpkZXRhY2hlZCwgc29ydGVkLCAqcHJldjsKLQotICAvKgotICAgKiBVbmxpbmsgcGFyZW50cyBmcm9tIGNoaWxkLCB0aGVuIGluc2VydGlvbiBzb3J0IGJhY2sgb24gdG8KLSAgICogc29ydGVkJ3MgcGFyZW50cy4KLSAgICogICAgICAqYXJjICAgICAgICB0aGUgYXJjIHlvdSBoYXZlIGRldGFjaGVkIGFuZCBhcmUgaW5zZXJ0aW5nLgotICAgKiAgICAgICpkZXRhY2hlZCAgIHRoZSByZXN0IG9mIHRoZSBhcmNzIHRvIGJlIHNvcnRlZC4KLSAgICogICAgICBzb3J0ZWQgICAgICBhcmMgbGlzdCBvbnRvIHdoaWNoIHlvdSBpbnNlcnRpb24gc29ydC4KLSAgICogICAgICAqcHJldiAgICAgICBhcmMgYmVmb3JlIHRoZSBhcmMgeW91IGFyZSBjb21wYXJpbmcuCi0gICAqLwotICBzb3J0ZWQubmV4dF9wYXJlbnQgPSAwOwotICBmb3IgKGFyYyA9IGNoaWxkLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGRldGFjaGVkKQotICAgIHsKLSAgICAgIGRldGFjaGVkID0gYXJjLT5uZXh0X3BhcmVudDsKLQotICAgICAgLyogY29uc2lkZXIgKmFyYyBhcyBkaXNjb25uZWN0ZWQ7IGluc2VydCBpdCBpbnRvIHNvcnRlZDogKi8KLSAgICAgIGZvciAocHJldiA9ICZzb3J0ZWQ7IHByZXYtPm5leHRfcGFyZW50OyBwcmV2ID0gcHJldi0+bmV4dF9wYXJlbnQpCi0JewotCSAgaWYgKGNtcF9hcmMgKGFyYywgcHJldi0+bmV4dF9wYXJlbnQpICE9IEdSRUFURVJUSEFOKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBhcmMtPm5leHRfcGFyZW50ID0gcHJldi0+bmV4dF9wYXJlbnQ7Ci0gICAgICBwcmV2LT5uZXh0X3BhcmVudCA9IGFyYzsKLSAgICB9Ci0KLSAgLyogcmVhdHRhY2ggc29ydGVkIGFyY3MgdG8gY2hpbGQ6ICovCi0gIGNoaWxkLT5jZy5wYXJlbnRzID0gc29ydGVkLm5leHRfcGFyZW50OwotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfcGFyZW50cywgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIFN5bSAqcGFyZW50OwotICBBcmMgKmFyYzsKLSAgU3ltICpjeWNsZV9oZWFkOwotCi0gIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gMCkKLSAgICB7Ci0gICAgICBjeWNsZV9oZWFkID0gY2hpbGQtPmNnLmN5Yy5oZWFkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGN5Y2xlX2hlYWQgPSBjaGlsZDsKLSAgICB9Ci0gIGlmICghY2hpbGQtPmNnLnBhcmVudHMpCi0gICAgewotICAgICAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JICAgICAgPyBfKCIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzICU3LjdzICAgICA8c3BvbnRhbmVvdXM+XG4iKQotCSAgICAgIDogXygiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIpLAotCSAgICAgICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc29ydF9wYXJlbnRzIChjaGlsZCk7Ci0gIGZvciAoYXJjID0gY2hpbGQtPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gYXJjLT5uZXh0X3BhcmVudCkKLSAgICB7Ci0gICAgICBwYXJlbnQgPSBhcmMtPnBhcmVudDsKLSAgICAgIGlmIChjaGlsZCA9PSBwYXJlbnQgfHwgKGNoaWxkLT5jZy5jeWMubnVtICE9IDAKLQkJCSAgICAgICYmIHBhcmVudC0+Y2cuY3ljLm51bSA9PSBjaGlsZC0+Y2cuY3ljLm51bSkpCi0JewotCSAgLyogc2VsZmNhbGwgb3IgY2FsbCBhbW9uZyBzaWJsaW5nczogKi8KLQkgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCQkgID8gIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTdsdSAlNy43cyAgICAgIgotCQkgIDogIiU2LjZzICU1LjVzICU3LjdzICU3LjdzICU3bHUgJTcuN3MgICAgICIsCi0JCSAgIiIsICIiLCAiIiwgIiIsCi0JCSAgYXJjLT5jb3VudCwgIiIpOwotCSAgcHJpbnRfbmFtZSAocGFyZW50KTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHJlZ3VsYXIgcGFyZW50IG9mIGNoaWxkOiAqLwotCSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JCSAgPyAiJTYuNnMgJTUuNXMgJTcuMmYgJTExLjJmICU3bHUvJS03bHUgICAgICIKLQkJICA6ICIlNi42cyAlNS41cyAlNy4yZiAlNy4yZiAlN2x1LyUtN2x1ICAgICAiLAotCQkgICIiLCAiIiwKLQkJICBhcmMtPnRpbWUgLyBoeiwgYXJjLT5jaGlsZF90aW1lIC8gaHosCi0JCSAgYXJjLT5jb3VudCwgY3ljbGVfaGVhZC0+bmNhbGxzKTsKLQkgIHByaW50X25hbWUgKHBhcmVudCk7Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChzb3J0X2NoaWxkcmVuLCAocGFyZW50KSwgU3ltICogcGFyZW50KQotewotICBBcmMgKmFyYywgKmRldGFjaGVkLCBzb3J0ZWQsICpwcmV2OwotICAvKgotICAgKiBVbmxpbmsgY2hpbGRyZW4gZnJvbSBwYXJlbnQsIHRoZW4gaW5zZXJ0aW9uIHNvcnQgYmFjayBvbiB0bwotICAgKiBzb3J0ZWQncyBjaGlsZHJlbi4KLSAgICogICAgICAqYXJjICAgICAgICB0aGUgYXJjIHlvdSBoYXZlIGRldGFjaGVkIGFuZCBhcmUgaW5zZXJ0aW5nLgotICAgKiAgICAgICpkZXRhY2hlZCAgIHRoZSByZXN0IG9mIHRoZSBhcmNzIHRvIGJlIHNvcnRlZC4KLSAgICogICAgICBzb3J0ZWQgICAgICBhcmMgbGlzdCBvbnRvIHdoaWNoIHlvdSBpbnNlcnRpb24gc29ydC4KLSAgICogICAgICAqcHJldiAgICAgICBhcmMgYmVmb3JlIHRoZSBhcmMgeW91IGFyZSBjb21wYXJpbmcuCi0gICAqLwotICBzb3J0ZWQubmV4dF9jaGlsZCA9IDA7Ci0gIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBkZXRhY2hlZCkKLSAgICB7Ci0gICAgICBkZXRhY2hlZCA9IGFyYy0+bmV4dF9jaGlsZDsKLQotICAgICAgLyogY29uc2lkZXIgKmFyYyBhcyBkaXNjb25uZWN0ZWQ7IGluc2VydCBpdCBpbnRvIHNvcnRlZDogKi8KLSAgICAgIGZvciAocHJldiA9ICZzb3J0ZWQ7IHByZXYtPm5leHRfY2hpbGQ7IHByZXYgPSBwcmV2LT5uZXh0X2NoaWxkKQotCXsKLQkgIGlmIChjbXBfYXJjIChhcmMsIHByZXYtPm5leHRfY2hpbGQpICE9IExFU1NUSEFOKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBhcmMtPm5leHRfY2hpbGQgPSBwcmV2LT5uZXh0X2NoaWxkOwotICAgICAgcHJldi0+bmV4dF9jaGlsZCA9IGFyYzsKLSAgICB9Ci0KLSAgLyogcmVhdHRhY2ggc29ydGVkIGNoaWxkcmVuIHRvIHBhcmVudDogKi8KLSAgcGFyZW50LT5jZy5jaGlsZHJlbiA9IHNvcnRlZC5uZXh0X2NoaWxkOwotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfY2hpbGRyZW4sIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIFN5bSAqY2hpbGQ7Ci0gIEFyYyAqYXJjOwotCi0gIHNvcnRfY2hpbGRyZW4gKHBhcmVudCk7Ci0gIGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47Ci0gIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0gICAgewotICAgICAgY2hpbGQgPSBhcmMtPmNoaWxkOwotICAgICAgaWYgKGNoaWxkID09IHBhcmVudCB8fCAoY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotCQkJICAgICAgJiYgY2hpbGQtPmNnLmN5Yy5udW0gPT0gcGFyZW50LT5jZy5jeWMubnVtKSkKLQl7Ci0JICAvKiBzZWxmIGNhbGwgb3IgY2FsbCB0byBzaWJsaW5nOiAqLwotCSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JCSAgPyAiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlN2x1ICU3LjdzICAgICAiCi0JCSAgOiAiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTdsdSAlNy43cyAgICAgIiwKLQkJICAiIiwgIiIsICIiLCAiIiwgYXJjLT5jb3VudCwgIiIpOwotCSAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogcmVndWxhciBjaGlsZCBvZiBwYXJlbnQ6ICovCi0JICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkJICA/ICIlNi42cyAlNS41cyAlNy4yZiAlMTEuMmYgJTdsdS8lLTdsdSAgICAgIgotCQkgIDogIiU2LjZzICU1LjVzICU3LjJmICU3LjJmICU3bHUvJS03bHUgICAgICIsCi0JCSAgIiIsICIiLAotCQkgIGFyYy0+dGltZSAvIGh6LCBhcmMtPmNoaWxkX3RpbWUgLyBoeiwKLQkJICBhcmMtPmNvdW50LCBjaGlsZC0+Y2cuY3ljLmhlYWQtPm5jYWxscyk7Ci0JICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9saW5lLCAobnApLCBTeW0gKiBucCkKLXsKLSAgY2hhciBidWZbQlVGU0laXTsKLQotICBzcHJpbnRmIChidWYsICJbJWRdIiwgbnAtPmNnLmluZGV4KTsKLSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JICA/ICIlLTYuNnMgJTUuMWYgJTcuMmYgJTExLjJmIgotCSAgOiAiJS02LjZzICU1LjFmICU3LjJmICU3LjJmIiwgYnVmLAotCSAgMTAwICogKG5wLT5jZy5wcm9wLnNlbGYgKyBucC0+Y2cucHJvcC5jaGlsZCkgLyBwcmludF90aW1lLAotCSAgbnAtPmNnLnByb3Auc2VsZiAvIGh6LCBucC0+Y2cucHJvcC5jaGlsZCAvIGh6KTsKLSAgaWYgKChucC0+bmNhbGxzICsgbnAtPmNnLnNlbGZfY2FsbHMpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiICU3bHUiLCBucC0+bmNhbGxzKTsKLSAgICAgIGlmIChucC0+Y2cuc2VsZl9jYWxscyAhPSAwKQotCXsKLQkgIHByaW50ZiAoIislLTdsdSAiLCBucC0+Y2cuc2VsZl9jYWxscyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIiAlNy43cyAiLCAiIik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlNy43cyAlNy43cyAiLCAiIiwgIiIpOwotICAgIH0KLSAgcHJpbnRfbmFtZSAobnApOwotICBwcmludGYgKCJcbiIpOwotfQotCi0KLS8qCi0gKiBQcmludCBkeW5hbWljIGNhbGwgZ3JhcGguCi0gKi8KLXZvaWQKLURFRlVOIChjZ19wcmludCwgKHRpbWVzb3J0c3ltKSwgU3ltICoqIHRpbWVzb3J0c3ltKQotewotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIFN5bSAqcGFyZW50OwotCi0gIGlmIChwcmludF9kZXNjcmlwdGlvbnMgJiYgYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBic2RfY2FsbGdfYmx1cmIgKHN0ZG91dCk7Ci0gICAgfQotCi0gIHByaW50X2hlYWRlciAoKTsKLQotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuICsgbnVtX2N5Y2xlczsgKytpbmRleCkKLSAgICB7Ci0gICAgICBwYXJlbnQgPSB0aW1lc29ydHN5bVtpbmRleF07Ci0gICAgICBpZiAoKGlnbm9yZV96ZXJvcyAmJiBwYXJlbnQtPm5jYWxscyA9PSAwCi0JICAgJiYgcGFyZW50LT5jZy5zZWxmX2NhbGxzID09IDAgJiYgcGFyZW50LT5jZy5wcm9wLnNlbGYgPT0gMAotCSAgICYmIHBhcmVudC0+Y2cucHJvcC5jaGlsZCA9PSAwKQotCSAgfHwgIXBhcmVudC0+Y2cucHJpbnRfZmxhZwotCSAgfHwgKGxpbmVfZ3JhbnVsYXJpdHkgJiYgISBwYXJlbnQtPmlzX2Z1bmMpKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmICghcGFyZW50LT5uYW1lICYmIHBhcmVudC0+Y2cuY3ljLm51bSAhPSAwKQotCXsKLQkgIC8qIGN5Y2xlIGhlYWRlcjogKi8KLQkgIHByaW50X2N5Y2xlIChwYXJlbnQpOwotCSAgcHJpbnRfbWVtYmVycyAocGFyZW50KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRfcGFyZW50cyAocGFyZW50KTsKLQkgIHByaW50X2xpbmUgKHBhcmVudCk7Ci0JICBwcmludF9jaGlsZHJlbiAocGFyZW50KTsKLQl9Ci0gICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLQlwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgICAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0JcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0gIGZyZWUgKHRpbWVzb3J0c3ltKTsKLSAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucyAmJiAhYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBmc2ZfY2FsbGdfYmx1cmIgKHN0ZG91dCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfbmFtZSwgKGxlZnQsIHJpZ2h0KSwgY29uc3QgUFRSIGxlZnQgQU5EIGNvbnN0IFBUUiByaWdodCkKLXsKLSAgY29uc3QgU3ltICoqbnBwMSA9IChjb25zdCBTeW0gKiopIGxlZnQ7Ci0gIGNvbnN0IFN5bSAqKm5wcDIgPSAoY29uc3QgU3ltICoqKSByaWdodDsKLQotICByZXR1cm4gc3RyY21wICgoKm5wcDEpLT5uYW1lLCAoKm5wcDIpLT5uYW1lKTsKLX0KLQotCi12b2lkCi1ERUZVTl9WT0lEIChjZ19wcmludF9pbmRleCkKLXsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICB1bnNpZ25lZCBpbnQgbm5hbWVzLCB0b2RvLCBpLCBqOwotICBpbnQgY29sLCBzdGFydGluZ19jb2w7Ci0gIFN5bSAqKm5hbWVfc29ydGVkX3N5bXMsICpzeW07Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyIGJ1ZlsyMF07Ci0gIGludCBjb2x1bW5fd2lkdGggPSAob3V0cHV0X3dpZHRoIC0gMSkgLyAzOwkvKiBkb24ndCB3cml0ZSBpbiBsYXN0IGNvbCEgKi8KLSAgLyoKLSAgICogTm93LCBzb3J0IHJlZ3VsYXIgZnVuY3Rpb24gbmFtZSBhbHBoYWJldGljYWxseSB0byBjcmVhdGUgYW4KLSAgICogaW5kZXg6Ci0gICAqLwotICBuYW1lX3NvcnRlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoKHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzKSAqIHNpemVvZiAoU3ltICopKTsKLSAgZm9yIChpbmRleCA9IDAsIG5uYW1lcyA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoaWdub3JlX3plcm9zICYmIHN5bXRhYi5iYXNlW2luZGV4XS5uY2FsbHMgPT0gMAotCSAgJiYgc3ltdGFiLmJhc2VbaW5kZXhdLmhpc3QudGltZSA9PSAwKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIG5hbWVfc29ydGVkX3N5bXNbbm5hbWVzKytdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0IChuYW1lX3NvcnRlZF9zeW1zLCBubmFtZXMsIHNpemVvZiAoU3ltICopLCBjbXBfbmFtZSk7Ci0gIGZvciAoaW5kZXggPSAxLCB0b2RvID0gbm5hbWVzOyBpbmRleCA8PSBudW1fY3ljbGVzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIG5hbWVfc29ydGVkX3N5bXNbdG9kbysrXSA9ICZjeWNsZV9oZWFkZXJbaW5kZXhdOwotICAgIH0KLSAgcHJpbnRmICgiXGZcbiIpOwotICBwcmludGYgKF8oIkluZGV4IGJ5IGZ1bmN0aW9uIG5hbWVcblxuIikpOwotICBpbmRleCA9ICh0b2RvICsgMikgLyAzOwotICBmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKLSAgICB7Ci0gICAgICBjb2wgPSAwOwotICAgICAgc3RhcnRpbmdfY29sID0gMDsKLSAgICAgIGZvciAoaiA9IGk7IGogPCB0b2RvOyBqICs9IGluZGV4KQotCXsKLQkgIHN5bSA9IG5hbWVfc29ydGVkX3N5bXNbal07Ci0JICBpZiAoc3ltLT5jZy5wcmludF9mbGFnKQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAiWyVkXSIsIHN5bS0+Y2cuaW5kZXgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcHJpbnRmIChidWYsICIoJWQpIiwgc3ltLT5jZy5pbmRleCk7Ci0JICAgIH0KLQkgIGlmIChqIDwgbm5hbWVzKQotCSAgICB7Ci0JICAgICAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0JCXsKLQkJICBwcmludGYgKCIlNi42cyAlLTE5LjE5cyIsIGJ1Ziwgc3ltLT5uYW1lKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbCArPSBzdHJsZW4gKGJ1Zik7Ci0JCSAgZm9yICg7IGNvbCA8IHN0YXJ0aW5nX2NvbCArIDU7ICsrY29sKQotCQkgICAgewotCQkgICAgICBwdXRjaGFyICgnICcpOwotCQkgICAgfQotCQkgIHByaW50ZiAoIiAlcyAiLCBidWYpOwotCQkgIGNvbCArPSBwcmludF9uYW1lX29ubHkgKHN5bSk7Ci0JCSAgaWYgKCFsaW5lX2dyYW51bGFyaXR5ICYmIHN5bS0+aXNfc3RhdGljICYmIHN5bS0+ZmlsZSkKLQkJICAgIHsKLQkJICAgICAgZmlsZW5hbWUgPSBzeW0tPmZpbGUtPm5hbWU7Ci0JCSAgICAgIGlmICghcHJpbnRfcGF0aCkKLQkJCXsKLQkJCSAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkJCSAgaWYgKGZpbGVuYW1lKQotCQkJICAgIHsKLQkJCSAgICAgICsrZmlsZW5hbWU7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgZmlsZW5hbWUgPSBzeW0tPmZpbGUtPm5hbWU7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBwcmludGYgKCIgKCVzKSIsIGZpbGVuYW1lKTsKLQkJICAgICAgY29sICs9IHN0cmxlbiAoZmlsZW5hbWUpICsgMzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLQkJewotCQkgIHByaW50ZiAoIiU2LjZzICIsIGJ1Zik7Ci0JCSAgc3ByaW50ZiAoYnVmLCBfKCI8Y3ljbGUgJWQ+IiksIHN5bS0+Y2cuY3ljLm51bSk7Ci0JCSAgcHJpbnRmICgiJS0xOS4xOXMiLCBidWYpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY29sICs9IHN0cmxlbiAoYnVmKTsKLQkJICBmb3IgKDsgY29sIDwgc3RhcnRpbmdfY29sICsgNTsgKytjb2wpCi0JCSAgICBwdXRjaGFyICgnICcpOwotCQkgIHByaW50ZiAoIiAlcyAiLCBidWYpOwotCQkgIHNwcmludGYgKGJ1ZiwgXygiPGN5Y2xlICVkPiIpLCBzeW0tPmNnLmN5Yy5udW0pOwotCQkgIHByaW50ZiAoIiVzIiwgYnVmKTsKLQkJICBjb2wgKz0gc3RybGVuIChidWYpOwotCQl9Ci0JICAgIH0KLQkgIHN0YXJ0aW5nX2NvbCArPSBjb2x1bW5fd2lkdGg7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0gIGZyZWUgKG5hbWVfc29ydGVkX3N5bXMpOwotfQotCi0vKiBDb21wYXJlIHR3byBhcmNzIGJhc2VkIG9uIHRoZWlyIHVzYWdlIGNvdW50cy4gIFdlIHdhbnQgdG8gc29ydAotICAgaW4gZGVzY2VuZGluZyBvcmRlci4gICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2FyY19jb3VudCwgKGxlZnQsIHJpZ2h0KSwgY29uc3QgUFRSIGxlZnQgQU5EIGNvbnN0IFBUUiByaWdodCkKLXsKLSAgY29uc3QgQXJjICoqbnBwMSA9IChjb25zdCBBcmMgKiopIGxlZnQ7Ci0gIGNvbnN0IEFyYyAqKm5wcDIgPSAoY29uc3QgQXJjICoqKSByaWdodDsKLQotICBpZiAoKCpucHAxKS0+Y291bnQgPiAoKm5wcDIpLT5jb3VudCkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKCgqbnBwMSktPmNvdW50IDwgKCpucHAyKS0+Y291bnQpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ29tcGFyZSB0d28gZnVudGlvbnMgYmFzZWQgb24gdGhlaXIgdXNhZ2UgY291bnRzLiAgV2Ugd2FudCB0byBzb3J0Ci0gICBpbiBkZXNjZW5kaW5nIG9yZGVyLiAgKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfZnVuX251c2VzLCAobGVmdCwgcmlnaHQpLCBjb25zdCBQVFIgbGVmdCBBTkQgY29uc3QgUFRSIHJpZ2h0KQotewotICBjb25zdCBTeW0gKipucHAxID0gKGNvbnN0IFN5bSAqKikgbGVmdDsKLSAgY29uc3QgU3ltICoqbnBwMiA9IChjb25zdCBTeW0gKiopIHJpZ2h0OwotCi0gIGlmICgoKm5wcDEpLT5udXNlcyA+ICgqbnBwMiktPm51c2VzKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpucHAxKS0+bnVzZXMgPCAoKm5wcDIpLT5udXNlcykKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQcmludCBhIHN1Z2dlc3RlZCBmdW5jdGlvbiBvcmRlcmluZyBiYXNlZCBvbiB0aGUgcHJvZmlsaW5nIGRhdGEuCi0KLSAgIFdlIHBlcmZvcm0gNCBtYWpvciBzdGVwcyB3aGVuIG9yZGVyaW5nIGZ1bmN0aW9uczoKLQotCSogR3JvdXAgdW51c2VkIGZ1bmN0aW9ucyB0b2dldGhlciBhbmQgcGxhY2UgdGhlbSBhdCB0aGUKLQllbmQgb2YgdGhlIGZ1bmN0aW9uIG9yZGVyLgotCi0JKiBTZWFyY2ggdGhlIGhpZ2hlc3QgdXNlIGFyY3MgKHRob3NlIHdoaWNoIGFjY291bnQgZm9yIDkwJSBvZgotCXRoZSB0b3RhbCBhcmMgY291bnQpIGZvciBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBzZXZlcmFsIHBhcmVudHMuCi0KLQlHcm91cCB0aG9zZSB3aXRoIHRoZSBtb3N0IGNhbGwgc2l0ZXMgdG9nZXRoZXIgKGN1cnJlbnRseSB0aGUKLQl0b3AgMS4yNSUgd2hpY2ggaGF2ZSBhdCBsZWFzdCBmaXZlIGRpZmZlcmVudCBjYWxsIHNpdGVzKS4KLQotCVRoZXNlIGFyZSBlbWl0dGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gb3JkZXIuCi0KLQkqIFVzZSBhIGdyZWVkeSBwbGFjZW1lbnQgYWxnb3JpdGhtIHRvIHBsYWNlIGZ1bmN0aW9ucyB3aGljaAotCW9jY3VyIGluIHRoZSB0b3AgOTklIG9mIHRoZSBhcmNzIGluIHRoZSBwcm9maWxlLiAgU29tZSBwcm92aXNpb25zCi0JYXJlIG1hZGUgdG8gaGFuZGxlIGhpZ2ggdXNhZ2UgYXJjcyB3aGVyZSB0aGUgcGFyZW50IGFuZC9vcgotCWNoaWxkIGhhcyBhbHJlYWR5IGJlZW4gcGxhY2VkLgotCi0JKiBSdW4gdGhlIHNhbWUgZ3JlZWR5IHBsYWNlbWVudCBhbGdvcml0aG0gb24gdGhlIHJlbWFpbmluZwotCWFyY3MgdG8gcGxhY2UgdGhlIGxlZnRvdmVyIGZ1bmN0aW9ucy4KLQotCi0gICBUaGUgdmFyaW91cyAibWFnaWMgbnVtYmVycyIgc2hvdWxkIChvbmUgZGF5KSBiZSB0dW5lYWJsZSBieSBjb21tYW5kCi0gICBsaW5lIG9wdGlvbnMuICBUaGV5IHdlcmUgYXJyaXZlZCBhdCBieSBiZW5jaG1hcmtpbmcgYSBmZXcgYXBwbGljYXRpb25zCi0gICB3aXRoIHZhcmlvdXMgdmFsdWVzIHRvIHNlZSB3aGljaCB2YWx1ZXMgcHJvZHVjZWQgYmV0dGVyIG92ZXJhbGwgZnVuY3Rpb24KLSAgIG9yZGVyaW5ncy4KLQotICAgT2YgY291cnNlLCBwcm9maWxpbmcgZXJyb3JzLCBtYWNoaW5lIGxpbWl0YXRpb25zIChQQSBsb25nIGNhbGxzKSwgYW5kCi0gICBwb29yIGN1dG9mZiB2YWx1ZXMgZm9yIHRoZSBwbGFjZW1lbnQgYWxnb3JpdGhtIG1heSBsaW1pdCB0aGUgdXNlZnVsbG5lc3MKLSAgIG9mIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gb3JkZXIuICBJbXByb3ZlbWVudHMgd291bGQgYmUgZ3JlYXRseSBhcHByZWNpYXRlZC4KLSAgIAotICAgU3VnZ2VzdGlvbnM6Ci0KLQkqIFBsYWNlIHRoZSBmdW5jdGlvbnMgd2l0aCBtYW55IGNhbGxlcnMgbmVhciB0aGUgbWlkZGxlIG9mIHRoZQotCWxpc3QgdG8gcmVkdWNlIGxvbmcgY2FsbHMuCi0KLQkqIFByb3BhZ2F0ZSBhcmMgdXNhZ2UgY2hhbmdlcyBhcyBmdW5jdGlvbnMgYXJlIHBsYWNlZC4gIEllIGlmCi0JZnVuYzEgYW5kIGZ1bmMyIGFyZSBwbGFjZWQgdG9nZXRoZXIsIGFyY3MgdG8vZnJvbSB0aG9zZSBhcmNzCi0JdG8gdGhlIHNhbWUgcGFyZW50L2NoaWxkIHNob3VsZCBiZSBjb21iaW5lZCwgdGhlbiByZXNvcnQgdGhlCi0JYXJjcyB0byBjaG9vc2UgdGhlIG5leHQgb25lLgotCi0JKiBJbXBsZW1lbnQgc29tZSBnbG9iYWwgcG9zaXRpb25pbmcgYWxnb3JpdGhtIHRvIHBsYWNlIHRoZQotCWNoYWlucyBtYWRlIGJ5IHRoZSBncmVlZHkgbG9jYWwgcG9zaXRpb25pbmcgYWxnb3JpdGhtLiAgUHJvYmFibHkKLQlieSBleGFtaW5pbmcgYXJjcyB3aGljaCBoYXZlbid0IGJlZW4gcGxhY2VkIHlldCB0byB0aWUgdHdvCi0JY2hhaW5zIHRvZ2V0aGVyLgotCi0JKiBUYWtlIGEgZnVuY3Rpb24ncyBzaXplIGFuZCB0aW1lIGludG8gYWNjb3VudCBpbiB0aGUgYWxnb3JpdGhtOwotCXNpemUgaW4gcGFydGljdWxhciBpcyBpbXBvcnRhbnQgb24gdGhlIFBBIChsb25nIGNhbGxzKS4gIFBsYWNpbmcKLQltYW55IHNtYWxsIGZ1bmN0aW9ucyBvbnRvIHRoZWlyIG93biBwYWdlIG1heSBiZSB3aXNlLgotCi0JKiBVc2UgYmV0dGVyIHByb2ZpbGluZyBpbmZvcm1hdGlvbjsgbWFueSBwdWJsaXNoZWQgYWxnb3JpdGhtcwotCWFyZSBiYXNlZCBvbiBjYWxsIHNlcXVlbmNlcyB0aHJvdWdoIHRpbWUsIHJhdGhlciB0aGFuIGp1c3QKLQlhcmMgY291bnRzLgotCi0JKiBQcm9kZWN1cmUgY2xvbmluZyBjb3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlIHdoZW4gYSBzbWFsbCBudW1iZXIKLQlvZiBhcmNzIGFjY291bnQgZm9yIG1vc3Qgb2YgdGhlIGNhbGxzIHRvIGEgcGFydGljdWxhciBmdW5jdGlvbi4KLQotCSogVXNlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYXZvaWQgbW92aW5nIHVudXNlZCBmdW5jdGlvbnMKLQljb21wbGV0ZWx5IG91dCBvZiB0aGUgY29kZSBzdHJlYW07IHRoaXMgd291bGQgYXZvaWQgc2V2ZXJlIGxvc3NhZ2UKLQl3aGVuIHRoZSBwcm9maWxlIGRhdGEgYmVhcnMgbGl0dGxlIHJlc2VtYmxhbmNlIHRvIGFjdHVhbCBydW5zLgotCi0JKiBQcm9wYWdhdGlvbiBvZiBhcmMgdXNhZ2VzIHNob3VsZCBhbHNvIGltcHJvdmUgLm8gbGluayBsaW5lCi0Jb3JkZXJpbmcgd2hpY2ggc2hhcmVzIHRoZSBzYW1lIGFyYyBwbGFjZW1lbnQgYWxnb3JpdGhtIHdpdGgKLQl0aGUgZnVuY3Rpb24gb3JkZXJpbmcgY29kZSAoaW4gZmFjdCBpdCBpcyBhIGRlZ2VuZXJhdGUgY2FzZQotCW9mIGZ1bmN0aW9uIG9yZGVyaW5nKS4gICovCi0JCi12b2lkCi1ERUZVTl9WT0lEIChjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZykKLXsKLSAgdW5zaWduZWQgbG9uZyBpbmRleCwgdXNlZCwgdW51c2VkLCBzY3JhdGNoX2luZGV4OwotICB1bnNpZ25lZCBsb25nICB1bnBsYWNlZF9hcmNfY291bnQsIGhpZ2hfYXJjX2NvdW50LCBzY3JhdGNoX2FyY19jb3VudDsKLSNpZmRlZiBfX0dOVUNfXwotICB1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfYXJjcywgdG1wX2FyY3NfY291bnQ7Ci0jZWxzZQotICB1bnNpZ25lZCBsb25nIHRvdGFsX2FyY3MsIHRtcF9hcmNzX2NvdW50OwotI2VuZGlmCi0gIFN5bSAqKnVudXNlZF9zeW1zLCAqKnVzZWRfc3ltcywgKipzY3JhdGNoX3N5bXM7Ci0gIEFyYyAqKnVucGxhY2VkX2FyY3MsICoqaGlnaF9hcmNzLCAqKnNjcmF0Y2hfYXJjczsKLQotICBpbmRleCA9IDA7Ci0gIHVzZWQgPSAwOwotICB1bnVzZWQgPSAwOwotICBzY3JhdGNoX2luZGV4ID0gMDsKLSAgdW5wbGFjZWRfYXJjX2NvdW50ID0gMDsKLSAgaGlnaF9hcmNfY291bnQgPSAwOwotICBzY3JhdGNoX2FyY19jb3VudCA9IDA7Ci0KLSAgLyogRmlyc3QgZ3JvdXAgYWxsIHRoZSB1bnVzZWQgZnVuY3Rpb25zIHRvZ2V0aGVyLiAgKi8KLSAgdW51c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICB1c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBzY3JhdGNoX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBoaWdoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICBzY3JhdGNoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICB1bnBsYWNlZF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLQotICAvKiBXYWxrIHRocm91Z2ggYWxsIHRoZSBmdW5jdGlvbnM7IG1hcmsgdGhvc2Ugd2hpY2ggYXJlIG5ldmVyCi0gICAgIGNhbGxlZCBhcyBwbGFjZWQgKHdlJ2xsIGVtaXQgdGhlbSBhcyBhIGdyb3VwIGxhdGVyKS4gICovCi0gIGZvciAoaW5kZXggPSAwLCB1c2VkID0gMCwgdW51c2VkID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChzeW10YWIuYmFzZVtpbmRleF0ubmNhbGxzID09IDApCi0JewotCSAgLyogRmlsdGVyIG91dCBncHJvZiBnZW5lcmF0ZWQgbmFtZXMuICAqLwotCSAgaWYgKHN0cmNtcCAoc3ltdGFiLmJhc2VbaW5kZXhdLm5hbWUsICI8bG9jb3JlPiIpCi0JICAgICAgJiYgc3RyY21wIChzeW10YWIuYmFzZVtpbmRleF0ubmFtZSwgIjxoaWNvcmU+IikpCi0JICAgIHsKLQkgICAgICB1bnVzZWRfc3ltc1t1bnVzZWQrK10gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotCSAgICAgIHN5bXRhYi5iYXNlW2luZGV4XS5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVzZWRfc3ltc1t1c2VkKytdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLQkgIHN5bXRhYi5iYXNlW2luZGV4XS5oYXNfYmVlbl9wbGFjZWQgPSAwOwotCSAgc3ltdGFiLmJhc2VbaW5kZXhdLm5leHQgPSAwOwotCSAgc3ltdGFiLmJhc2VbaW5kZXhdLnByZXYgPSAwOwotCSAgc3ltdGFiLmJhc2VbaW5kZXhdLm51c2VzID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFNvcnQgdGhlIGFyY3MgZnJvbSBtb3N0IHVzZWQgdG8gbGVhc3QgdXNlZC4gICovCi0gIHFzb3J0IChhcmNzLCBudW1hcmNzLCBzaXplb2YgKEFyYyAqKSwgY21wX2FyY19jb3VudCk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgdG90YWwgYXJjIGNvdW50LiAgQWxzbyBtYXJrIGFyY3MgYXMgdW5wbGFjZWQuCi0KLSAgICAgTm90ZSB3ZSBkb24ndCBjb21wZW5zYXRlIGZvciBvdmVyZmxvdyBpZiB0aGF0IGhhcHBlbnMhCi0gICAgIE92ZXJmbG93IGlzIG11Y2ggbGVzcyBsaWtlbHkgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQKLSAgICAgd2l0aCBHQ0MgYXMgaXQgY2FuIGRvdWJsZS13aWRlIGludGVnZXJzIHZpYSBsb25nIGxvbmcuICAqLwotICB0b3RhbF9hcmNzID0gMDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICB0b3RhbF9hcmNzICs9IGFyY3NbaW5kZXhdLT5jb3VudDsKLSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAwOwotICAgIH0KLQotICAvKiBXZSB3YW50IHRvIHB1bGwgb3V0IHRob3NlIGZ1bmN0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlZAotICAgICBieSBtYW55IGhpZ2hseSB1c2VkIGFyY3MgYW5kIGVtaXQgdGhlbSBhcyBhIGdyb3VwLiAgVGhpcwotICAgICBjb3VsZCBwcm9iYWJseSB1c2Ugc29tZSB0dW5pbmcuICAqLwotICB0bXBfYXJjc19jb3VudCA9IDA7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgewotICAgICAgdG1wX2FyY3NfY291bnQgKz0gYXJjc1tpbmRleF0tPmNvdW50OwotCi0gICAgICAvKiBDb3VudCBob3cgbWFueSB0aW1lcyBlYWNoIHBhcmVudCBhbmQgY2hpbGQgYXJlIHVzZWQgdXAKLQkgdG8gb3VyIHRocmVzaGhvbGQgb2YgYXJjcyAoOTAlKS4gICovCi0gICAgICBpZiAoKGRvdWJsZSl0bXBfYXJjc19jb3VudCAvIChkb3VibGUpdG90YWxfYXJjcyA+IDAuOTApCi0JYnJlYWs7Ci0KLSAgICAgIGFyY3NbaW5kZXhdLT5jaGlsZC0+bnVzZXMrKzsKLSAgICB9Ci0KLSAgLyogTm93IHNvcnQgYSB0ZW1wb3Jhcnkgc3ltYm9sIHRhYmxlIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YKLSAgICAgdGltZXMgZWFjaCBmdW5jdGlvbiB3YXMgdXNlZCBpbiB0aGUgaGlnaGVzdCB1c2VkIGFyY3MuICAqLwotICBtZW1jcHkgKHNjcmF0Y2hfc3ltcywgdXNlZF9zeW1zLCB1c2VkICogc2l6ZW9mIChTeW0gKikpOwotICBxc29ydCAoc2NyYXRjaF9zeW1zLCB1c2VkLCBzaXplb2YgKFN5bSAqKSwgY21wX2Z1bl9udXNlcyk7Ci0KLSAgLyogTm93IHBpY2sgb3V0IHRob3NlIHN5bWJvbHMgd2UncmUgZ29pbmcgdG8gZW1pdCBhcwotICAgICBhIGdyb3VwLiAgV2UgdGFrZSB1cCB0byAxLjI1JSBvZiB0aGUgdXNlZCBzeW1ib2xzLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdXNlZCAvIDgwOyBpbmRleCsrKQotICAgIHsKLSAgICAgIFN5bSAqc3ltID0gc2NyYXRjaF9zeW1zW2luZGV4XTsKLSAgICAgIEFyYyAqYXJjOwotCi0gICAgICAvKiBJZiB3ZSBoaXQgc3ltYm9scyB0aGF0IGFyZW4ndCB1c2VkIGZyb20gbWFueSBjYWxsIHNpdGVzLAotCSB0aGVuIHdlIGNhbiBxdWl0LiAgV2UgY2hvb3NlIGZpdmUgYXMgdGhlIGxvdyBsaW1pdCBmb3IKLQkgbm8gcGFydGljdWxhciByZWFzb24uICAqLwotICAgICAgaWYgKHN5bS0+bnVzZXMgPT0gNSkKLQlicmVhazsKLQotICAgICAgLyogV2UncmUgZ29pbmcgdG8gbmVlZCB0aGUgYXJjcyBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucy4KLQkgVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3Qga25vdyBhbGwgdGhlc2UgZnVuY3Rpb25zCi0JIHVudGlsIHdlJ3JlIGRvbmUuICBTbyB3ZSBrZWVwIHRyYWNrIG9mIGFsbCB0aGUgYXJjcwotCSB0byB0aGUgZnVuY3Rpb25zIHdlIGNhcmUgYWJvdXQsIHRoZW4gcHJ1bmUgb3V0IHRob3NlCi0JIHdoaWNoIGFyZSB1bmludGVyZXN0aW5nLiAKLQotCSBBbiBpbnRlcmVzdGluZyB2YXJpYXRpb24gd291bGQgYmUgdG8gcXVpdCB3aGVuIHdlIGZvdW5kCi0JIG11bHRpLWNhbGwgc2l0ZSBmdW5jdGlvbnMgd2hpY2ggYWNjb3VudCBmb3Igc29tZSBwZXJjZW50YWdlCi0JIG9mIHRoZSBhcmNzLiAgKi8KLQotICAgICAgYXJjID0gc3ltLT5jZy5jaGlsZHJlbjsKLSAgICAgIHdoaWxlIChhcmMpCi0JewotCSAgaWYgKGFyYy0+cGFyZW50ICE9IGFyYy0+Y2hpbGQpCi0JICAgIHNjcmF0Y2hfYXJjc1tzY3JhdGNoX2FyY19jb3VudCsrXSA9IGFyYzsKLQkgIGFyYy0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgIGFyYyA9IGFyYy0+bmV4dF9jaGlsZDsKLQl9Ci0KLSAgICAgIGFyYyA9IHN5bS0+Y2cucGFyZW50czsKLSAgICAgIHdoaWxlIChhcmMpCi0JewotCSAgaWYgKGFyYy0+cGFyZW50ICE9IGFyYy0+Y2hpbGQpCi0JICAgIHNjcmF0Y2hfYXJjc1tzY3JhdGNoX2FyY19jb3VudCsrXSA9IGFyYzsKLQkgIGFyYy0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgIGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQ7Ci0JfQotCi0gICAgICAvKiBLZWVwIHRyYWNrIG9mIGhvdyBtYW55IHN5bWJvbHMgd2UncmUgZ29pbmcgdG8gcGxhY2UuICAqLwotICAgICAgc2NyYXRjaF9pbmRleCA9IGluZGV4OwotCi0gICAgICAvKiBBIGxpZSwgYnV0IGl0IG1ha2VzIGlkZW50aWZ5aW5nIHRoZXNlIGZ1bmN0aW9ucyBlYXNpZXIKLQkgbGF0ZXIuICAqLwotICAgICAgc3ltLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotICAgIH0KLQotICAvKiBOb3cgd2FsayB0aHJvdWdoIHRoZSB0ZW1wb3JhcnkgYXJjcyBhbmQgY29weSB0aG9zZSB3ZSBjYXJlIGFib3V0Ci0gICAgIGludG8gdGhlIGhpZ2ggYXJjcyBhcnJheS4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNjcmF0Y2hfYXJjX2NvdW50OyBpbmRleCsrKQotICAgIHsKLSAgICAgIEFyYyAqYXJjID0gc2NyYXRjaF9hcmNzW2luZGV4XTsKLQotICAgICAgLyogSWYgdGhpcyBhcmMgcmVmZXJzIHRvIGhpZ2hseSB1c2VkIGZ1bmN0aW9ucywgdGhlbgotCSB0aGVuIHdlIHdhbnQgdG8ga2VlcCBpdC4gICovCi0gICAgICBpZiAoYXJjLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkCi0JICAmJiBhcmMtPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkKQotCXsKLQkgIGhpZ2hfYXJjc1toaWdoX2FyY19jb3VudCsrXSA9IHNjcmF0Y2hfYXJjc1tpbmRleF07Ci0KLQkgIC8qIFdlIG5lZWQgdG8gdHVybiBvZiBoYXNfYmVlbl9wbGFjZWQgc2luY2Ugd2UncmUgZ29pbmcgdG8KLQkgICAgIHVzZSB0aGUgbWFpbiBhcmMgcGxhY2VtZW50IGFsZ29yaXRobSBvbiB0aGVzZSBhcmNzLiAgKi8KLQkgIGFyYy0+Y2hpbGQtPmhhc19iZWVuX3BsYWNlZCA9IDA7Ci0JICBhcmMtPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIER1bXAgdGhlIG11bHRpLXNpdGUgaGlnaCB1c2FnZSBmdW5jdGlvbnMgd2hpY2ggYXJlIG5vdCBnb2luZwotICAgICB0byBiZSBvcmRlcmVkIGJ5IHRoZSBtYWluIG9yZGVyaW5nIGFsZ29yaXRobS4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNjcmF0Y2hfaW5kZXg7IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKHNjcmF0Y2hfc3ltc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCkKLQlwcmludGYgKCIlc1xuIiwgc2NyYXRjaF9zeW1zW2luZGV4XS0+bmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBjYW4gb3JkZXIgdGhlIG11bHRpLXNpdGUgaGlnaCB1c2UgZnVuY3Rpb25zIGJhc2VkIG9uIHRoZQotICAgICBhcmNzIGJldHdlZW4gdGhlbS4gICovCi0gIHFzb3J0IChoaWdoX2FyY3MsIGhpZ2hfYXJjX2NvdW50LCBzaXplb2YgKEFyYyAqKSwgY21wX2FyY19jb3VudCk7Ci0gIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIChoaWdoX2FyY3MsIGhpZ2hfYXJjX2NvdW50LCAxLAotCQkJCSAgICB1bnBsYWNlZF9hcmNzLCAmdW5wbGFjZWRfYXJjX2NvdW50KTsKLQotICAvKiBPcmRlciBhbmQgZHVtcCB0aGUgaGlnaCB1c2UgZnVuY3Rpb25zIGxlZnQsIHRoZXNlIHR5cGljYWxseQotICAgICBoYXZlIG9ubHkgYSBmZXcgY2FsbCBzaXRlcy4gICovCi0gIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIChhcmNzLCBudW1hcmNzLCAwLAotCQkJCSAgICB1bnBsYWNlZF9hcmNzLCAmdW5wbGFjZWRfYXJjX2NvdW50KTsKLQotICAvKiBOb3cgcGxhY2UgdGhlIHJhcmVseSB1c2VkIGZ1bmN0aW9ucy4gICovCi0gIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzICh1bnBsYWNlZF9hcmNzLCB1bnBsYWNlZF9hcmNfY291bnQsIDEsCi0JCQkJICAgIHNjcmF0Y2hfYXJjcywgJnNjcmF0Y2hfYXJjX2NvdW50KTsKLQotICAvKiBPdXRwdXQgYW55IGZ1bmN0aW9ucyBub3QgZW1pdHRlZCBieSB0aGUgb3JkZXJfYW5kX2R1bXAgY2FsbHMuICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1c2VkOyBpbmRleCsrKQotICAgIGlmICh1c2VkX3N5bXNbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPT0gMCkKLSAgICAgIHByaW50ZigiJXNcbiIsIHVzZWRfc3ltc1tpbmRleF0tPm5hbWUpOwotCi0gIC8qIE91dHB1dCB0aGUgdW51c2VkIGZ1bmN0aW9ucy4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHVudXNlZDsgaW5kZXgrKykKLSAgICBwcmludGYoIiVzXG4iLCB1bnVzZWRfc3ltc1tpbmRleF0tPm5hbWUpOwotCi0gIHVudXNlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgdXNlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgc2NyYXRjaF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgaGlnaF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLSAgc2NyYXRjaF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLSAgdW5wbGFjZWRfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0KLSAgZnJlZSAodW51c2VkX3N5bXMpOwotICBmcmVlICh1c2VkX3N5bXMpOwotICBmcmVlIChzY3JhdGNoX3N5bXMpOwotICBmcmVlIChoaWdoX2FyY3MpOwotICBmcmVlIChzY3JhdGNoX2FyY3MpOwotICBmcmVlICh1bnBsYWNlZF9hcmNzKTsKLX0KLQotLyogUGxhY2UgZnVuY3Rpb25zIGJhc2VkIG9uIHRoZSBhcmNzIGluIEFSQ1Mgd2l0aCBOVU1BUkNTIGVudHJpZXM7Ci0gICBwbGFjZSB1bnVzZWQgYXJjcyBpbnRvIFVOUExBQ0VEX0FSQ1MvVU5QTEFDRURfQVJDX0NPVU5ULgotCi0gICBJZiBBTEwgaXMgbm9uemVybywgdGhlbiBwbGFjZSBhbGwgZnVuY3Rpb25zIHJlZmVyZW5jZWQgYnkgQVJDUywKLSAgIGVsc2Ugb25seSBwbGFjZSB0aG9zZSByZWZlcmVuY2VkIGluIHRoZSB0b3AgOTklIG9mIHRoZSBhcmNzIGluIEFSQ1MuICAqLwotCi0jZGVmaW5lIE1PU1QgMC45OQotc3RhdGljIHZvaWQKLW9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIChhcmNzLCBudW1hcmNzLCBhbGwsCi0JCQkJICB1bnBsYWNlZF9hcmNzLCB1bnBsYWNlZF9hcmNfY291bnQpCi0gICAgIEFyYyAqKmFyY3M7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbnVtYXJjczsKLSAgICAgaW50IGFsbDsKLSAgICAgQXJjICoqdW5wbGFjZWRfYXJjczsKLSAgICAgdW5zaWduZWQgbG9uZyAqdW5wbGFjZWRfYXJjX2NvdW50OwotewotI2lmZGVmIF9fR05VQ19fCi0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0bXBfYXJjcywgdG90YWxfYXJjczsKLSNlbHNlCi0gIHVuc2lnbmVkIGxvbmcgdG1wX2FyY3MsIHRvdGFsX2FyY3M7Ci0jZW5kaWYKLSAgdW5zaWduZWQgaW50IGluZGV4OwotCi0gIC8qIElmIG5lZWRlZCwgY29tcHV0ZSB0aGUgdG90YWwgYXJjIGNvdW50LgotCi0gICAgIE5vdGUgd2UgZG9uJ3QgY29tcGVuc2F0ZSBmb3Igb3ZlcmZsb3cgaWYgdGhhdCBoYXBwZW5zISAgKi8KLSAgaWYgKCEgYWxsKQotICAgIHsKLSAgICAgIHRvdGFsX2FyY3MgPSAwOwotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLQl0b3RhbF9hcmNzICs9IGFyY3NbaW5kZXhdLT5jb3VudDsKLSAgICB9Ci0gIGVsc2UKLSAgICB0b3RhbF9hcmNzID0gMDsKLQotICB0bXBfYXJjcyA9IDA7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgewotICAgICAgU3ltICpzeW0xLCAqc3ltMjsKLSAgICAgIFN5bSAqY2hpbGQsICpwYXJlbnQ7Ci0KLSAgICAgIHRtcF9hcmNzICs9IGFyY3NbaW5kZXhdLT5jb3VudDsKLQotICAgICAgLyogSWdub3JlIHRoaXMgYXJjIGlmIGl0J3MgYWxyZWFkeSBiZWVuIHBsYWNlZC4gICovCi0gICAgICBpZiAoYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCkKLQljb250aW51ZTsKLQotICAgICAgY2hpbGQgPSBhcmNzW2luZGV4XS0+Y2hpbGQ7Ci0gICAgICBwYXJlbnQgPSBhcmNzW2luZGV4XS0+cGFyZW50OwotCi0gICAgICAvKiBJZiB3ZSdyZSBub3QgdXNpbmcgYWxsIGFyY3MsIGFuZCB0aGlzIGlzIGEgcmFyZWx5IHVzZWQKLQkgYXJjLCB0aGVuIHB1dCBpdCBvbiB0aGUgdW5wbGFjZWRfYXJjIGxpc3QuICBTaW1pbGFybHkKLQkgaWYgYm90aCB0aGUgcGFyZW50IGFuZCBjaGlsZCBvZiB0aGlzIGFyYyBoYXZlIGJlZW4gcGxhY2VkLiAgKi8KLSAgICAgIGlmICgoISBhbGwgJiYgKGRvdWJsZSl0bXBfYXJjcyAvIChkb3VibGUpdG90YWxfYXJjcyA+IE1PU1QpCi0JICB8fCBjaGlsZC0+aGFzX2JlZW5fcGxhY2VkIHx8IHBhcmVudC0+aGFzX2JlZW5fcGxhY2VkKQotCXsKLQkgIHVucGxhY2VkX2FyY3NbKCp1bnBsYWNlZF9hcmNfY291bnQpKytdID0gYXJjc1tpbmRleF07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIGFsbCBzbG90cyBpbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBhcmUgZnVsbCwgdGhlbiB0aGVyZSBpc24ndAotCSBhbnl0aGluZyB3ZSBjYW4gZG8gcmlnaHQgbm93LiAgV2UnbGwgcGxhY2UgdGhpcyBhcmMgb24gdGhlCi0JIHVucGxhY2VkIGFyYyBsaXN0IGluIHRoZSBob3BlIHRoYXQgYSBnbG9iYWwgcG9zaXRpb25pbmcKLQkgYWxnb3JpdGhtIGNhbiB1c2UgaXQgdG8gcGxhY2UgZnVuY3Rpb24gY2hhaW5zLiAgKi8KLSAgICAgIGlmIChwYXJlbnQtPm5leHQgJiYgcGFyZW50LT5wcmV2ICYmIGNoaWxkLT5uZXh0ICYmIGNoaWxkLT5wcmV2KQotCXsKLQkgIHVucGxhY2VkX2FyY3NbKCp1bnBsYWNlZF9hcmNfY291bnQpKytdID0gYXJjc1tpbmRleF07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBwYXJlbnQgaXMgdW5hdHRhY2hlZCwgdGhlbiBmaW5kIHRoZSBjbG9zZXN0Ci0JIHBsYWNlIHRvIGF0dGFjaCBpdCBvbnRvIGNoaWxkJ3MgY2hhaW4uICAgU2ltaWxhcmx5Ci0JIGZvciB0aGUgb3Bwb3NpdGUgY2FzZS4gICovCi0gICAgICBpZiAoIXBhcmVudC0+bmV4dCAmJiAhcGFyZW50LT5wcmV2KQotCXsKLQkgIGludCBuZXh0X2NvdW50ID0gMDsKLQkgIGludCBwcmV2X2NvdW50ID0gMDsKLQkgIFN5bSAqcHJldiA9IGNoaWxkOwotCSAgU3ltICpuZXh0ID0gY2hpbGQ7Ci0KLQkgIC8qIFdhbGsgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBjaGlsZCdzIGNoYWluLiAgKi8KLQkgIHdoaWxlIChuZXh0LT5uZXh0KQotCSAgICB7Ci0JICAgICAgbmV4dCA9IG5leHQtPm5leHQ7Ci0JICAgICAgbmV4dF9jb3VudCsrOwotCSAgICB9Ci0KLQkgIHdoaWxlIChwcmV2LT5wcmV2KQotCSAgICB7Ci0JICAgICAgcHJldiA9IHByZXYtPnByZXY7Ci0JICAgICAgcHJldl9jb3VudCsrOwotCSAgICB9Ci0JICAKLQkgIC8qIENob29zZSB0aGUgY2xvc2VzdC4gICovCi0JICBjaGlsZCA9IG5leHRfY291bnQgPCBwcmV2X2NvdW50ID8gbmV4dCA6IHByZXY7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghIGNoaWxkLT5uZXh0ICYmICFjaGlsZC0+cHJldikKLQl7Ci0JICBpbnQgbmV4dF9jb3VudCA9IDA7Ci0JICBpbnQgcHJldl9jb3VudCA9IDA7Ci0JICBTeW0gKnByZXYgPSBwYXJlbnQ7Ci0JICBTeW0gKm5leHQgPSBwYXJlbnQ7Ci0KLQkgIHdoaWxlIChuZXh0LT5uZXh0KQotCSAgICB7Ci0JICAgICAgbmV4dCA9IG5leHQtPm5leHQ7Ci0JICAgICAgbmV4dF9jb3VudCsrOwotCSAgICB9Ci0KLQkgIHdoaWxlIChwcmV2LT5wcmV2KQotCSAgICB7Ci0JICAgICAgcHJldiA9IHByZXYtPnByZXY7Ci0JICAgICAgcHJldl9jb3VudCsrOwotCSAgICB9Ci0KLQkgIHBhcmVudCA9IHByZXZfY291bnQgPCBuZXh0X2NvdW50ID8gcHJldiA6IG5leHQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENvdWxkbid0IGZpbmQgYW55d2hlcmUgdG8gYXR0YWNoIHRoZSBmdW5jdGlvbnMsCi0JICAgICBwdXQgdGhlIGFyYyBvbiB0aGUgdW5wbGFjZWQgYXJjIGxpc3QuICAqLwotCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHRpZSB0d28gZW5kcyB0b2dldGhlci4gICovCi0gICAgICBzeW0xID0gcGFyZW50OwotICAgICAgaWYgKHN5bTEtPm5leHQpCi0Jd2hpbGUgKHN5bTEtPm5leHQpCi0JICBzeW0xID0gc3ltMS0+bmV4dDsKLSAgICAgIGVsc2UKLQl3aGlsZSAoc3ltMS0+cHJldikKLQkgIHN5bTEgPSBzeW0xLT5wcmV2OwotCi0gICAgICBzeW0yID0gY2hpbGQ7Ci0gICAgICBpZiAoc3ltMi0+bmV4dCkKLQl3aGlsZSAoc3ltMi0+bmV4dCkKLQkgIHN5bTIgPSBzeW0yLT5uZXh0OwotICAgICAgZWxzZQotCXdoaWxlIChzeW0yLT5wcmV2KQotCSAgc3ltMiA9IHN5bTItPnByZXY7Ci0KLSAgICAgIGlmIChzeW0xID09IGNoaWxkCi0JICAmJiBzeW0yID09IHBhcmVudCkKLQl7Ci0JICAvKiBUaGlzIHdvdWxkIHRpZSB0d28gZW5kcyB0b2dldGhlci4gICovCi0JICB1bnBsYWNlZF9hcmNzWygqdW5wbGFjZWRfYXJjX2NvdW50KSsrXSA9IGFyY3NbaW5kZXhdOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocGFyZW50LT5uZXh0KQotCXsKLQkgIC8qIE11c3QgYXR0YWNoIHRvIHRoZSBwYXJlbnQncyBwcmV2IGZpZWxkLiAgKi8KLQkgIGlmICghIGNoaWxkLT5uZXh0KQotCSAgICB7Ci0JICAgICAgLyogcGFyZW50LXByZXYgYW5kIGNoaWxkLW5leHQgKi8KLQkgICAgICBwYXJlbnQtPnByZXYgPSBjaGlsZDsKLQkgICAgICBjaGlsZC0+bmV4dCA9IHBhcmVudDsKLQkgICAgICBhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHBhcmVudC0+cHJldikKLQl7Ci0JICAvKiBNdXN0IGF0dGFjaCB0byB0aGUgcGFyZW50J3MgbmV4dCBmaWVsZC4gICovCi0JICBpZiAoISBjaGlsZC0+cHJldikKLQkgICAgewotCSAgICAgIC8qIHBhcmVudC1uZXh0IGFuZCBjaGlsZC1wcmV2ICovCi0JICAgICAgcGFyZW50LT5uZXh0ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPnByZXYgPSBwYXJlbnQ7Ci0JICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FuIGF0dGFjaCB0byBlaXRoZXIgZmllbGQgaW4gdGhlIHBhcmVudCwgZGVwZW5kcwotCSAgICAgb24gd2hlcmUgd2UndmUgZ290IHNwYWNlIGluIHRoZSBjaGlsZC4gICovCi0JICBpZiAoY2hpbGQtPnByZXYpCi0JICAgIHsKLQkgICAgICAvKiBwYXJlbnQtcHJldiBhbmQgY2hpbGQtbmV4dCAqLwotCSAgICAgIHBhcmVudC0+cHJldiA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5uZXh0ID0gcGFyZW50OwotCSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBwYXJlbnQtbmV4dCBhbmQgY2hpbGQtcHJldiAqLwotCSAgICAgIHBhcmVudC0+bmV4dCA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5wcmV2ID0gcGFyZW50OwotCSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBEdW1wIHRoZSBjaGFpbnMgb2YgZnVuY3Rpb25zIHdlJ3ZlIG1hZGUuICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIFN5bSAqc3ltOwotICAgICAgaWYgKGFyY3NbaW5kZXhdLT5wYXJlbnQtPmhhc19iZWVuX3BsYWNlZAotCSAgfHwgYXJjc1tpbmRleF0tPmNoaWxkLT5oYXNfYmVlbl9wbGFjZWQpCi0JY29udGludWU7Ci0KLSAgICAgIHN5bSA9IGFyY3NbaW5kZXhdLT5wYXJlbnQ7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzbid0IGF0dGFjaGVkIHRvIGFueSBvdGhlcgotCSBzeW1ib2xzLCB0aGVuIHdlJ3ZlIGdvdCBhIHJhcmVseSB1c2VkIGFyYy4KLQotCSBTa2lwIGl0IGZvciBub3csIHdlJ2xsIGRlYWwgd2l0aCB0aGVtIGxhdGVyLiAgKi8KLSAgICAgIGlmIChzeW0tPm5leHQgPT0gTlVMTAotCSAgJiYgc3ltLT5wcmV2ID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0byB0aGUgc3RhcnQgb2YgdGhpcyBjaGFpbi4gICovCi0gICAgICB3aGlsZSAoc3ltLT5wcmV2KQotCXN5bSA9IHN5bS0+cHJldjsKLQotICAgICAgd2hpbGUgKHN5bSkKLQl7Ci0JICAvKiBNYXJrIGl0IGFzIHBsYWNlZC4gICovCi0JICBzeW0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICBwcmludGYgKCIlc1xuIiwgc3ltLT5uYW1lKTsKLQkgIHN5bSA9IHN5bS0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIHdhbnQgdG8gcGxhY2UgYWxsIHRoZSBhcmNzLCB0aGVuIG91dHB1dCB0aG9zZSB3aGljaCB3ZXJlbid0Ci0gICAgIHBsYWNlZCBieSB0aGUgbWFpbiBhbGdvcml0aG0uICAqLwotICBpZiAoYWxsKQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgICB7Ci0JU3ltICpzeW07Ci0JaWYgKGFyY3NbaW5kZXhdLT5wYXJlbnQtPmhhc19iZWVuX3BsYWNlZAotCSAgICB8fCBhcmNzW2luZGV4XS0+Y2hpbGQtPmhhc19iZWVuX3BsYWNlZCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ltID0gYXJjc1tpbmRleF0tPnBhcmVudDsKLQotCXN5bS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQlwcmludGYgKCIlc1xuIiwgc3ltLT5uYW1lKTsKLSAgICAgIH0KLX0KLQotLyogUHJpbnQgYSBzdWdnZXN0ZWQgLm8gb3JkZXJpbmcgZm9yIGZpbGVzIG9uIGEgbGluayBsaW5lIGJhc2VkCi0gICBvbiBwcm9maWxpbmcgaW5mb3JtYXRpb24uICBUaGlzIHVzZXMgdGhlIGZ1bmN0aW9uIHBsYWNlbWVudAotICAgY29kZSBmb3IgdGhlIGJ1bGsgb2YgaXRzIHdvcmsuICAqLwotCi1zdHJ1Y3QgZnVuY3Rpb25fbWFwIHsKLSAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLSAgY2hhciAqZmlsZV9uYW1lOwotfTsKLQotdm9pZAotREVGVU5fVk9JRCAoY2dfcHJpbnRfZmlsZV9vcmRlcmluZykKLXsKLSAgdW5zaWduZWQgbG9uZyBzY3JhdGNoX2FyY19jb3VudCwgaW5kZXg7Ci0gIEFyYyAqKnNjcmF0Y2hfYXJjczsKLSAgZXh0ZXJuIHN0cnVjdCBmdW5jdGlvbl9tYXAgKnN5bWJvbF9tYXA7Ci0gIGV4dGVybiB1bnNpZ25lZCBpbnQgc3ltYm9sX21hcF9jb3VudDsKLSAgY2hhciAqbGFzdDsKLQotICBzY3JhdGNoX2FyY19jb3VudCA9IDA7Ci0KLSAgc2NyYXRjaF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoISBhcmNzW2luZGV4XS0+cGFyZW50LT5tYXBwZWQKLQkgIHx8ICEgYXJjc1tpbmRleF0tPmNoaWxkLT5tYXBwZWQpCi0JYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0gICAgfQotCi0gIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIChhcmNzLCBudW1hcmNzLCAwLAotCQkJCSAgICBzY3JhdGNoX2FyY3MsICZzY3JhdGNoX2FyY19jb3VudCk7Ci0KLSAgLyogT3V0cHV0IC5vJ3Mgbm90IGhhbmRsZWQgYnkgdGhlIG1haW4gcGxhY2VtZW50IGFsZ29yaXRobS4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKHN5bXRhYi5iYXNlW2luZGV4XS5tYXBwZWQKLQkgICYmICEgc3ltdGFiLmJhc2VbaW5kZXhdLmhhc19iZWVuX3BsYWNlZCkKLQlwcmludGYgKCIlc1xuIiwgc3ltdGFiLmJhc2VbaW5kZXhdLm5hbWUpOwotICAgIH0KLQotICAvKiBOb3cgb3V0cHV0IGFueSAubydzIHRoYXQgZGlkbid0IGhhdmUgYW55IHRleHQgc3ltYm9scy4gICovCi0gIGxhc3QgPSBOVUxMOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW1ib2xfbWFwX2NvdW50OyBpbmRleCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbmRleDI7Ci0KLSAgICAgIC8qIERvbid0IGJvdGhlciBzZWFyY2hpbmcgaWYgdGhpcyBzeW1ib2wgaXMgdGhlCi0JIHNhbWUgYXMgdGhlIHByZXZpb3VzIG9uZS4gICovCi0gICAgICBpZiAobGFzdCAmJiAhc3RyY21wIChsYXN0LCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKGluZGV4MiA9IDA7IGluZGV4MiA8IHN5bXRhYi5sZW47IGluZGV4MisrKQotCXsKLQkgIGlmICghIHN5bXRhYi5iYXNlW2luZGV4Ml0ubWFwcGVkKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKCFzdHJjbXAgKHN5bXRhYi5iYXNlW2luZGV4Ml0ubmFtZSwgc3ltYm9sX21hcFtpbmRleF0uZmlsZV9uYW1lKSkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBpdCBpbiB0aGUgc3ltYm9sIHRhYmxlLCB0aGVuIGl0IG11c3QgYmUgYSAubwotCSB3aXRoIG5vIHRleHQgc3ltYm9scy4gIE91dHB1dCBpdCBsYXN0LiAgKi8KLSAgICAgIGlmIChpbmRleDIgPT0gc3ltdGFiLmxlbikKLQlwcmludGYgKCIlc1xuIiwgc3ltYm9sX21hcFtpbmRleF0uZmlsZV9uYW1lKTsKLSAgICAgIGxhc3QgPSBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWU7Ci0gICAgfSAKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX3ByaW50LmggYi9ncHJvZi9jZ19wcmludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODJjNGFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX3ByaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jaWZuZGVmIGNnX3ByaW50X2gKLSNkZWZpbmUgY2dfcHJpbnRfaAotCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotZXh0ZXJuIGRvdWJsZSBwcmludF90aW1lOwkvKiB0b3RhbCBvZiB0aW1lIGJlaW5nIHByaW50ZWQgKi8KLQotZXh0ZXJuIHZvaWQgY2dfcHJpbnQgUEFSQU1TICgoU3ltICoqIGNnKSk7Ci1leHRlcm4gdm9pZCBjZ19wcmludF9pbmRleCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBjZ19wcmludF9maWxlX29yZGVyaW5nIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIGNnX3ByaW50X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2NvbmZpZ3VyZSBiL2dwcm9mL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ3ZDcxYS4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NDE0ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWdwcm9mLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjAxOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyMjogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQwOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3NTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3Mjg6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzg1OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1ncHJvZgotCi1WRVJTSU9OPTIuOS41Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODMxOiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NTc6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzA6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODgzOiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTY5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5OTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTEyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxMTIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTU0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1OTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTg3OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIzMDogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjU0OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNTc6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjkzOiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzA5OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM0NzogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogCVwoJGFjX3N5bWNvZGVcKSAJIAkqXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxNDogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDY2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLQotZmkKLQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLWVjaG8gIiRhY190IiIkYWNfcmVzdWx0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTEyOiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTIxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MjQ6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5jID4mNQotZmkKLXJtIC1yZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiIDE+JjYKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU1MDogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTU5MiAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU5MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjE0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYxOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjgxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4ODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTk5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMDEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDQxOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA0NjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDc0OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMTc6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNzE6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTk0OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyNDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNzQ6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyODc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzc4OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDUzOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ5MzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTI2OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NjE6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTk0OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1OTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NTk6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY4OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NDQ6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzUyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3NzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc5NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4MDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4MDY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgzNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODYzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODg4OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDM2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA2NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNjE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjIzOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyMjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI1NjogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjc2OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyOTU6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMwNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMjI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzUwOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzODU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzOTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDI1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDU5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0ODc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTUwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1ODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1OTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjIyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY1NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3ODI6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MTA6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgyMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODgzOiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkwNjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzkxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkyMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkzOTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk1MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTcwOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBnY29uZmlnLmg6Z2NvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJnY29uZmlnLmg6Z2NvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlLmluIGIvZ3Byb2YvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWIyODlmLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfUFJFUkVRKDIuMTMpCi1BQ19JTklUKGdwcm9mLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLQotQU1fSU5JVF9BVVRPTUFLRShncHJvZiwgMi45LjUpCi0KLUFNX1BST0dfTElCVE9PTAotCi1kbmwgRm9yIHNpbXBsaWNpdHksIHdlIHVzZSB0aGUgQkZEIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgbW9zdAotZG5sIHRoaW5ncy4gIEhvd2V2ZXIsIHdlIGFsc28gbmVlZCBvdXIgb3duIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IKLWRubCB0aGUgYXV0b21ha2UgUEFDS0FHRSBhbmQgVkVSU0lPTiBtYWNyb3MuICBXZSBkb24ndCBuYW1lIGl0Ci1kbmwgY29uZmlnLmgsIHRvIGF2b2lkIGFueSBwb3NzaWJsZSBjb25mdXNpb24gd2l0aCB0aGUgYmZkIGNvbmZpZy5oLgotQU1fQ09ORklHX0hFQURFUihnY29uZmlnLmg6Z2NvbmZpZy5pbikKLQotQUNfUFJPR19DQwotQUNfUFJPR19JTlNUQUxMCi0KLUFDX0lTQ19QT1NJWAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLUFDX09VVFBVVChNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9ncHJvZi9jb3JlZmlsZS5jIGIvZ3Byb2YvY29yZWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwZmMyOC4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb3JlZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLWJmZCAqY29yZV9iZmQ7Ci1pbnQgY29yZV9udW1fc3ltczsKLWFzeW1ib2wgKipjb3JlX3N5bXM7Ci1hc2VjdGlvbiAqY29yZV90ZXh0X3NlY3Q7Ci1QVFIgY29yZV90ZXh0X3NwYWNlOwotCi1pbnQgbWluX2luc25fc2l6ZTsKLWludCBvZmZzZXRfdG9fY29kZTsKLQotLyogRm9yIG1hcHBpbmcgc3ltYm9scyB0byBzcGVjaWZpYyAubyBmaWxlcyBkdXJpbmcgZmlsZSBvcmRlcmluZy4gICovCi1zdHJ1Y3QgZnVuY3Rpb25fbWFwIHsKLSAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLSAgY2hhciAqZmlsZV9uYW1lOwotfTsKLQotc3RydWN0IGZ1bmN0aW9uX21hcCAqc3ltYm9sX21hcDsKLXVuc2lnbmVkIGludCBzeW1ib2xfbWFwX2NvdW50OwotCi1leHRlcm4gdm9pZCBpMzg2X2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgYWxwaGFfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCB2YXhfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCB0YWhvZV9maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIHNwYXJjX2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgdm9pZAotREVGVU4gKHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MsIChmaWxlbmFtZSksIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBGSUxFICpmaWxlID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotICBjaGFyIGR1bW15WzEwMjRdOwotICBpbnQgY291bnQgPSAwOwotCi0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjb3VsZCBub3Qgb3BlbiAlcy5cbiIpLCB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBGaXJzdCBwYXJzZSB0aGUgbWFwcGluZyBmaWxlIHNvIHdlIGtub3cgaG93IGJpZyB3ZSBuZWVkIHRvCi0gICAgIG1ha2Ugb3VyIHRhYmxlcy4gIFdlIGFsc28gZG8gc29tZSBzYW5pdHkgY2hlY2tzIGF0IHRoaXMKLSAgICAgdGltZS4gICovCi0gIHdoaWxlICghZmVvZiAoZmlsZSkpCi0gICAgewotICAgICAgaW50IG1hdGNoZXM7Ci0KLSAgICAgIG1hdGNoZXMgPSBmc2NhbmYgKGZpbGUsICIlW15cbjpdIiwgZHVtbXkpOwotICAgICAgaWYgKCFtYXRjaGVzKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVuYWJsZSB0byBwYXJzZSBtYXBwaW5nIGZpbGUgJXMuXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIEp1c3Qgc2tpcCBtZXNzYWdlcyBhYm91dCBmaWxlcyB3aXRoIG5vIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCFzdHJuY21wIChkdW1teSwgIk5vIHN5bWJvbHMgaW4gIiwgMTQpKQotCXsKLQkgIGZzY2FuZiAoZmlsZSwgIlxuIik7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIERvbid0IGNhcmUgd2hhdCBlbHNlIGlzIG9uIHRoaXMgbGluZSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgICAgIGZzY2FuZiAoZmlsZSwgIiVbXlxuXVxuIiwgZHVtbXkpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGtub3cgaG93IGJpZyB3ZSBuZWVkIHRvIG1ha2Ugb3VyIHRhYmxlLiAgKi8KLSAgc3ltYm9sX21hcCA9ICgoc3RydWN0IGZ1bmN0aW9uX21hcCAqKQotCQl4bWFsbG9jIChjb3VudCAqIHNpemVvZiAoc3RydWN0IGZ1bmN0aW9uX21hcCkpKTsKLQotICAvKiBSZXdpbmQgdGhlIGlucHV0IGZpbGUgc28gd2UgY2FuIHJlYWQgaXQgYWdhaW4uICAqLwotICByZXdpbmQgKGZpbGUpOwotCi0gIC8qIFJlYWQgZWFjaCBlbnRyeSBhbmQgcHV0IGl0IGludG8gdGhlIHRhYmxlLiAgKi8KLSAgY291bnQgPSAwOwotICB3aGlsZSAoIWZlb2YgKGZpbGUpKQotICAgIHsKLSAgICAgIGludCBtYXRjaGVzOwotICAgICAgY2hhciAqdG1wOwotCi0gICAgICBtYXRjaGVzID0gZnNjYW5mIChmaWxlLCAiJVteXG46XSIsIGR1bW15KTsKLSAgICAgIGlmICghbWF0Y2hlcykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gcGFyc2UgbWFwcGluZyBmaWxlICVzLlxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiBKdXN0IHNraXAgbWVzc2FnZXMgYWJvdXQgZmlsZXMgd2l0aCBubyBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghc3RybmNtcCAoZHVtbXksICJObyBzeW1ib2xzIGluICIsIDE0KSkKLQl7Ci0JICBmc2NhbmYgKGZpbGUsICJcbiIpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBkdW1teSBoYXMgdGhlIGZpbGVuYW1lLCBnbyBhaGVhZCBhbmQgY29weSBpdC4gICovCi0gICAgICBzeW1ib2xfbWFwW2NvdW50XS5maWxlX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGR1bW15KSArIDEpOwotICAgICAgc3RyY3B5IChzeW1ib2xfbWFwW2NvdW50XS5maWxlX25hbWUsIGR1bW15KTsKLQotICAgICAgLyogTm93IHdlIG5lZWQgdGhlIGZ1bmN0aW9uIG5hbWUuICAqLwotICAgICAgZnNjYW5mIChmaWxlLCAiJVteXG5dXG4iLCBkdW1teSk7Ci0gICAgICB0bXAgPSBzdHJyY2hyIChkdW1teSwgJyAnKSArIDE7Ci0gICAgICBzeW1ib2xfbWFwW2NvdW50XS5mdW5jdGlvbl9uYW1lID0geG1hbGxvYyAoc3RybGVuICh0bXApICsgMSk7Ci0gICAgICBzdHJjcHkgKHN5bWJvbF9tYXBbY291bnRdLmZ1bmN0aW9uX25hbWUsIHRtcCk7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLQotICAvKiBSZWNvcmQgdGhlIHNpemUgb2YgdGhlIG1hcCB0YWJsZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gICovCi0gIHN5bWJvbF9tYXBfY291bnQgPSBjb3VudDsKLX0KLQotdm9pZAotREVGVU4gKGNvcmVfaW5pdCwgKGFfb3V0X25hbWUpLCBjb25zdCBjaGFyICphX291dF9uYW1lKQotewotICBjb3JlX2JmZCA9IGJmZF9vcGVuciAoYV9vdXRfbmFtZSwgMCk7Ci0KLSAgaWYgKCFjb3JlX2JmZCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGFfb3V0X25hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoY29yZV9iZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBub3QgaW4gYS5vdXQgZm9ybWF0XG4iKSwgd2hvYW1pLCBhX291dF9uYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBnZXQgY29yZSdzIHRleHQgc2VjdGlvbjogKi8KLSAgY29yZV90ZXh0X3NlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoY29yZV9iZmQsICIudGV4dCIpOwotICBpZiAoIWNvcmVfdGV4dF9zZWN0KQotICAgIHsKLSAgICAgIGNvcmVfdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGNvcmVfYmZkLCAiJENPREUkIik7Ci0gICAgICBpZiAoIWNvcmVfdGV4dF9zZWN0KQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNhbid0IGZpbmQgLnRleHQgc2VjdGlvbiBpbiAlc1xuIiksCi0JCSAgIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgfQotCi0gIC8qIHJlYWQgY29yZSdzIHN5bWJvbCB0YWJsZTogKi8KLQotICAvKiB0aGlzIHdpbGwgcHJvYmFibHkgZ2l2ZSB1cyBtb3JlIHRoYW4gd2UgbmVlZCwgYnV0IHRoYXQncyBvazogICovCi0gIGNvcmVfbnVtX3N5bXMgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoY29yZV9iZmQpOwotICBpZiAoY29yZV9udW1fc3ltcyA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgd2hvYW1pLCBhX291dF9uYW1lLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgY29yZV9zeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKGNvcmVfbnVtX3N5bXMpOwotICBjb3JlX251bV9zeW1zID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGNvcmVfYmZkLCBjb3JlX3N5bXMpOwotICBpZiAoY29yZV9udW1fc3ltcyA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgd2hvYW1pLCBhX291dF9uYW1lLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgbWluX2luc25fc2l6ZSA9IDE7Ci0gIG9mZnNldF90b19jb2RlID0gMDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoY29yZV9iZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3ZheDoKLSAgICBjYXNlIGJmZF9hcmNoX3RhaG9lOgotICAgICAgb2Zmc2V0X3RvX2NvZGUgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgbWluX2luc25fc2l6ZSA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGZ1bmN0aW9uX21hcHBpbmdfZmlsZSkKLSAgICByZWFkX2Z1bmN0aW9uX21hcHBpbmdzIChmdW5jdGlvbl9tYXBwaW5nX2ZpbGUpOwotfQotCi0KLS8qCi0gKiBSZWFkIGluIHRoZSB0ZXh0IHNwYWNlIG9mIGFuIGEub3V0IGZpbGUKLSAqLwotdm9pZAotREVGVU4gKGNvcmVfZ2V0X3RleHRfc3BhY2UsIChjb3JlX2JmZCksIGJmZCAqIGNvcmVfYmZkKQotewotICBjb3JlX3RleHRfc3BhY2UgPSAoUFRSKSBtYWxsb2MgKGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpOwotCi0gIGlmICghY29yZV90ZXh0X3NwYWNlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHJhbiBvdXQgcm9vbSBmb3IgJWx1IGJ5dGVzIG9mIHRleHQgc3BhY2VcbiIpLAotCSAgICAgICB3aG9hbWksICh1bnNpZ25lZCBsb25nKSBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGNvcmVfYmZkLCBjb3JlX3RleHRfc2VjdCwgY29yZV90ZXh0X3NwYWNlLAotCQkJCSAwLCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplKSkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yICgiYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIik7Ci0gICAgICBmcmVlIChjb3JlX3RleHRfc3BhY2UpOwotICAgICAgY29yZV90ZXh0X3NwYWNlID0gMDsKLSAgICB9Ci0gIGlmICghY29yZV90ZXh0X3NwYWNlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNhbid0IGRvIC1jXG4iKSwgd2hvYW1pKTsKLSAgICB9Ci19Ci0KLQotdm9pZAotREVGVU4gKGZpbmRfY2FsbCwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpLAotICAgICAgIFN5bSAqIHBhcmVudCBBTkQgYmZkX3ZtYSBwX2xvd3BjIEFORCBiZmRfdm1hIHBfaGlnaHBjKQotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoY29yZV9iZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICBpMzg2X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBhbHBoYV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX3ZheDoKLSAgICAgIHZheF9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgc3BhcmNfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF90YWhvZToKLSAgICAgIHRhaG9lX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAtYyBub3Qgc3VwcG9ydGVkIG9uIGFyY2hpdGVjdHVyZSAlc1xuIiksCi0JICAgICAgIHdob2FtaSwgYmZkX3ByaW50YWJsZV9uYW1lKGNvcmVfYmZkKSk7Ci0KLSAgICAgIC8qIERvbid0IGdpdmUgdGhlIGVycm9yIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgICAgIGlnbm9yZV9kaXJlY3RfY2FsbHMgPSBGQUxTRTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBSZXR1cm4gY2xhc3Mgb2Ygc3ltYm9sIFNZTS4gIFRoZSByZXR1cm5lZCBjbGFzcyBjYW4gYmUgYW55IG9mOgotICogICAgICAwICAgLT4gc3ltYm9sIGlzIG5vdCBpbnRlcmVzdGluZyB0byB1cwotICogICAgICAnVCcgLT4gc3ltYm9sIGlzIGEgZ2xvYmFsIG5hbWUKLSAqICAgICAgJ3QnIC0+IHN5bWJvbCBpcyBhIGxvY2FsIChzdGF0aWMpIG5hbWUKLSAqLwotc3RhdGljIGludAotREVGVU4gKGNvcmVfc3ltX2NsYXNzLCAoc3ltKSwgYXN5bWJvbCAqIHN5bSkKLXsKLSAgc3ltYm9sX2luZm8gc3ltaW5mbzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciBzeW1fcHJlZml4OwotICBpbnQgaTsKLQotICBpZiAoc3ltLT5zZWN0aW9uID09IE5VTEwgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKgotICAgKiBNdXN0IGJlIGEgdGV4dCBzeW1ib2wsIGFuZCBzdGF0aWMgdGV4dCBzeW1ib2xzIGRvbid0IHF1YWxpZnkgaWYKLSAgICogaWdub3JlX3N0YXRpY19mdW5jcyBzZXQuCi0gICAqLwotICBpZiAoaWdub3JlX3N0YXRpY19mdW5jcyAmJiAoc3ltLT5mbGFncyAmIEJTRl9MT0NBTCkpCi0gICAgewotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX3N5bV9jbGFzc10gJXM6IG5vdCBhIGZ1bmN0aW9uXG4iLAotCQkJICAgICAgc3ltLT5uYW1lKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYmZkX2dldF9zeW1ib2xfaW5mbyAoY29yZV9iZmQsIHN5bSwgJnN5bWluZm8pOwotICBpID0gc3ltaW5mby50eXBlOwotCi0gIGlmIChpID09ICdUJykKLSAgICB7Ci0gICAgICByZXR1cm4gaTsJCQkvKiBpdCdzIGEgZ2xvYmFsIHN5bWJvbCAqLwotICAgIH0KLQotICBpZiAoaSA9PSAnVycpCi0gICAgewotICAgICAgLyogVHJlYXQgd2VhayBzeW1ib2xzIGFzIHRleHQgc3ltYm9scy4gIEZJWE1FOiBhIHdlYWsgc3ltYm9sIG1heQotICAgICAgICAgYWxzbyBiZSBhIGRhdGEgc3ltYm9sLiAgKi8KLSAgICAgIHJldHVybiAnVCc7Ci0gICAgfQotCi0gIGlmIChpICE9ICd0JykKLSAgICB7Ci0gICAgICAvKiBub3QgYSBzdGF0aWMgdGV4dCBzeW1ib2wgKi8KLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9zeW1fY2xhc3NdICVzIGlzIG9mIGNsYXNzICVjXG4iLAotCQkJICAgICAgc3ltLT5uYW1lLCBpKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogZG8gc29tZSBtb3JlIGZpbHRlcmluZyBvbiBzdGF0aWMgZnVuY3Rpb24tbmFtZXM6ICovCi0KLSAgaWYgKGlnbm9yZV9zdGF0aWNfZnVuY3MpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAvKgotICAgKiBDYW4ndCB6ZXJvLWxlbmd0aCBuYW1lIG9yIGZ1bm55IGNoYXJhY3RlcnMgaW4gbmFtZSwgd2hlcmUKLSAgICogYGZ1bm55JyBpbmNsdWRlczogYC4nICgubyBmaWxlIG5hbWVzKSBhbmQgYCQnIChQYXNjYWwgbGFiZWxzKS4KLSAgICovCi0gIGlmICghc3ltLT5uYW1lIHx8IHN5bS0+bmFtZVswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKG5hbWUgPSBzeW0tPm5hbWU7ICpuYW1lOyArK25hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lID09ICcuJyB8fCAqbmFtZSA9PSAnJCcpCi0JewotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogT24gc3lzdGVtcyB3aGVyZSB0aGUgQyBjb21waWxlciBhZGRzIGFuIHVuZGVyc2NvcmUgdG8gYWxsCi0gICAqIG5hbWVzLCBzdGF0aWMgbmFtZXMgd2l0aG91dCB1bmRlcnNjb3JlcyBzZWVtIHVzdWFsbHkgdG8gYmUKLSAgICogbGFiZWxzIGluIGhhbmQgd3JpdHRlbiBhc3NlbWJsZXIgaW4gdGhlIGxpYnJhcnkuICBXZSBkb24ndCB3YW50Ci0gICAqIHRoZXNlIG5hbWVzLiAgVGhpcyBpcyBjZXJ0YWlubHkgbmVjZXNzYXJ5IG9uIGEgU3BhcmMgcnVubmluZwotICAgKiBTdW5PUyA0LjEgKHRyeSBwcm9maWxpbmcgYSBwcm9ncmFtIHRoYXQgZG9lcyBhIGxvdCBvZgotICAgKiBkaXZpc2lvbikuIEkgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGhhcyBoYXJtZnVsIHNpZGUgZWZmZWN0cyBvbgotICAgKiBvdGhlciBzeXN0ZW1zLiAgUGVyaGFwcyBpdCBzaG91bGQgYmUgbWFkZSBjb25maWd1cmFibGUuCi0gICAqLwotICBzeW1fcHJlZml4ID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChjb3JlX2JmZCk7Ci0gIGlmICgoc3ltX3ByZWZpeCAmJiBzeW1fcHJlZml4ICE9IHN5bS0+bmFtZVswXSkKLSAgLyoKLSAgICogR0NDIG1heSBhZGQgc3BlY2lhbCBzeW1ib2xzIHRvIGhlbHAgZ2RiIGZpZ3VyZSBvdXQgdGhlIGZpbGUKLSAgICogbGFuZ3VhZ2UuICBXZSB3YW50IHRvIGlnbm9yZSB0aGVzZSwgc2luY2Ugc29tZXRpbWVzIHRoZXkgbWFzawotICAgKiB0aGUgcmVhbCBmdW5jdGlvbi4gIChkakBjdHJvbikKLSAgICovCi0gICAgICB8fCAhc3RybmNtcCAoc3ltLT5uYW1lLCAiX19nbnVfY29tcGlsZWQiLCAxNCkKLSAgICAgIHx8ICFzdHJuY21wIChzeW0tPm5hbWUsICJfX19nbnVfY29tcGlsZWQiLCAxNSkpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvYmplY3QgZmlsZSBzdXBwb3J0cyBtYXJraW5nIG9mIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZW4gd2UgY2FuCi0gICAgIHphcCBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgaGF2ZSBCU0ZfRlVOQ1RJT04gc2V0LiAgKi8KLSAgaWYgKGlnbm9yZV9ub25fZnVuY3Rpb25zICYmIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAndCc7CQkJLyogaXQncyBhIHN0YXRpYyB0ZXh0IHN5bWJvbCAqLwotfQotCi0KLS8qCi0gKiBHZXQgd2hhdGV2ZXIgc291cmNlIGluZm8gd2UgY2FuIGdldCByZWdhcmRpbmcgYWRkcmVzcyBBRERSOgotICovCi1zdGF0aWMgYm9vbAotREVGVU4gKGdldF9zcmNfaW5mbywgKGFkZHIsIGZpbGVuYW1lLCBuYW1lLCBsaW5lX251bSksCi0gICAgICAgYmZkX3ZtYSBhZGRyIEFORCBjb25zdCBjaGFyICoqZmlsZW5hbWUgQU5EIGNvbnN0IGNoYXIgKipuYW1lCi0gICAgICAgQU5EIGludCAqbGluZV9udW0pCi17Ci0gIGNvbnN0IGNoYXIgKmZuYW1lID0gMCwgKmZ1bmNfbmFtZSA9IDA7Ci0gIGludCBsID0gMDsKLQotICBpZiAoYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChjb3JlX2JmZCwgY29yZV90ZXh0X3NlY3QsIGNvcmVfc3ltcywKLQkJCSAgICAgYWRkciAtIGNvcmVfdGV4dF9zZWN0LT52bWEsCi0JCQkgICAgICZmbmFtZSwgJmZ1bmNfbmFtZSwgKHVuc2lnbmVkIGludCAqKSAmbCkKLSAgICAgICYmIGZuYW1lICYmIGZ1bmNfbmFtZSAmJiBsKQotICAgIHsKLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbZ2V0X3NyY19pbmZvXSAweCVseCAtPiAlczolZCAoJXMpXG4iLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsIGZuYW1lLCBsLCBmdW5jX25hbWUpKTsKLSAgICAgICpmaWxlbmFtZSA9IGZuYW1lOwotICAgICAgKm5hbWUgPSBmdW5jX25hbWU7Ci0gICAgICAqbGluZV9udW0gPSBsOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltnZXRfc3JjX2luZm9dIG5vIGluZm8gZm9yIDB4JWx4ICglczolZCwlcylcbiIsCi0JCQkgICAgICAobG9uZykgYWRkciwgZm5hbWUgPyBmbmFtZSA6ICI8dW5rbm93bj4iLCBsLAotCQkJICAgICAgZnVuY19uYW1lID8gZnVuY19uYW1lIDogIjx1bmtub3duPiIpKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFJlYWQgaW4gc3ltYm9sIHRhYmxlIGZyb20gY29yZS4gIE9uZSBzeW1ib2wgcGVyIGZ1bmN0aW9uIGlzCi0gKiBlbnRlcmVkLgotICovCi12b2lkCi1jb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zIChjb3JlX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIG1pbl92bWEgPSB+MCwgbWF4X3ZtYSA9IDA7Ci0gIGludCBjbGFzczsKLSAgbG9uZyBpLCBmb3VuZCwgc2tpcDsKLSAgdW5zaWduZWQgaW50IGo7Ci0KLSAgLyogcGFzcyAxIC0gZGV0ZXJtaW5lIHVwcGVyIGJvdW5kIG9uIG51bWJlciBvZiBmdW5jdGlvbiBuYW1lczogKi8KLSAgc3ltdGFiLmxlbiA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9zeW1zOyArK2kpCi0gICAgewotICAgICAgaWYgKCFjb3JlX3N5bV9jbGFzcyAoY29yZV9zeW1zW2ldKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBiaW5hcnkgc2VhcmNoIG9yIGhhc2hlZAotCSBzZWFyY2guICBHcm9zcy4gCi0KLQkgRG9uJ3QgY3JlYXRlIGEgc3ltdGFiIGVudHJ5IGZvciBhIGZ1bmN0aW9uIHRoYXQgaGFzCi0JIGEgbWFwcGluZyB0byBhIGZpbGUsIHVubGVzcyBpdCdzIHRoZSBmaXJzdCBmdW5jdGlvbgotCSBpbiB0aGUgZmlsZS4gICovCi0gICAgICBza2lwID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzeW1ib2xfbWFwX2NvdW50OyBqKyspCi0JaWYgKCFzdHJjbXAgKGNvcmVfc3ltc1tpXS0+bmFtZSwgc3ltYm9sX21hcFtqXS5mdW5jdGlvbl9uYW1lKSkKLQkgIHsKLQkgICAgaWYgKGogPiAwICYmICEgc3RyY21wIChzeW1ib2xfbWFwIFtqXS5maWxlX25hbWUsCi0JCQkgCSAgIHN5bWJvbF9tYXAgW2ogLSAxXS5maWxlX25hbWUpKQotCSAgICAgIHNraXAgPSAxOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIGlmICghc2tpcCkKLSAgICAgICAgKytzeW10YWIubGVuOwotICAgIH0KLQotICBpZiAoc3ltdGFiLmxlbiA9PSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgYCVzJyBoYXMgbm8gc3ltYm9sc1xuIiksIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogdGhlICIrIDIiIGlzIGZvciB0aGUgc2VudGluZWxzOiAqLwotICBzeW10YWIuYmFzZSA9IChTeW0gKikgeG1hbGxvYyAoKHN5bXRhYi5sZW4gKyAyKSAqIHNpemVvZiAoU3ltKSk7Ci0KLSAgLyogcGFzcyAyIC0gY3JlYXRlIHN5bWJvbHM6ICovCi0KLSAgc3ltdGFiLmxpbWl0ID0gc3ltdGFiLmJhc2U7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9zeW1zOyArK2kpCi0gICAgewotICAgICAgY2xhc3MgPSBjb3JlX3N5bV9jbGFzcyAoY29yZV9zeW1zW2ldKTsKLSAgICAgIGlmICghY2xhc3MpCi0JewotCSAgREJHIChBT1VUREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zXSByZWplY3Rpbmc6IDB4JWx4ICVzXG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNvcmVfc3ltc1tpXS0+dmFsdWUsCi0JCSAgICAgICBjb3JlX3N5bXNbaV0tPm5hbWUpKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBiaW5hcnkgc2VhcmNoIG9yIGhhc2hlZAotCSBzZWFyY2guICBHcm9zcy4gICAqLwotCi0gICAgICBza2lwID0gMDsKLSAgICAgIGZvdW5kID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzeW1ib2xfbWFwX2NvdW50OyBqKyspCi0JaWYgKCFzdHJjbXAgKGNvcmVfc3ltc1tpXS0+bmFtZSwgc3ltYm9sX21hcFtqXS5mdW5jdGlvbl9uYW1lKSkKLQkgIHsKLQkgICAgaWYgKGogPiAwICYmICEgc3RyY21wIChzeW1ib2xfbWFwIFtqXS5maWxlX25hbWUsCi0JCQkgCSAgIHN5bWJvbF9tYXAgW2ogLSAxXS5maWxlX25hbWUpKQotCSAgICAgIHNraXAgPSAxOwotCSAgICBlbHNlCi0JICAgICAgZm91bmQgPSBqOwotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgaWYgKHNraXApCi0JY29udGludWU7Ci0KLSAgICAgIHN5bV9pbml0IChzeW10YWIubGltaXQpOwotCi0gICAgICAvKiBzeW1ib2wgb2Zmc2V0cyBhcmUgYWx3YXlzIHNlY3Rpb24tcmVsYXRpdmU6ICovCi0KLSAgICAgIHN5bXRhYi5saW1pdC0+YWRkciA9IGNvcmVfc3ltc1tpXS0+dmFsdWUgKyBjb3JlX3N5bXNbaV0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGlmIChzeW1ib2xfbWFwX2NvdW50Ci0JICAmJiAhc3RyY21wIChjb3JlX3N5bXNbaV0tPm5hbWUsIHN5bWJvbF9tYXBbZm91bmRdLmZ1bmN0aW9uX25hbWUpKQotCXsKLQkgIHN5bXRhYi5saW1pdC0+bmFtZSA9IHN5bWJvbF9tYXBbZm91bmRdLmZpbGVfbmFtZTsKLQkgIHN5bXRhYi5saW1pdC0+bWFwcGVkID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gY29yZV9zeW1zW2ldLT5uYW1lOwotCSAgc3ltdGFiLmxpbWl0LT5tYXBwZWQgPSAwOwotCX0KLQotICAgICAgLyogTG9va3VwIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciwgaWYgd2UgY2FuICovCi0KLSAgICAgIHsKLQljb25zdCBjaGFyICpmaWxlbmFtZSwgKmZ1bmNfbmFtZTsKLQkKLQlpZiAoZ2V0X3NyY19pbmZvIChzeW10YWIubGltaXQtPmFkZHIsICZmaWxlbmFtZSwgJmZ1bmNfbmFtZSwKLQkJCSAgJnN5bXRhYi5saW1pdC0+bGluZV9udW0pKQotCSAgewotCSAgICBzeW10YWIubGltaXQtPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCAoZmlsZW5hbWUpOwotCi0JICAgIC8qIEZJWE1FOiBDaGVja2luZyBfX29zZl9fIGhlcmUgZG9lcyBub3Qgd29yayB3aXRoIGEgY3Jvc3MKLSAgICAgICAgICAgICAgIGdwcm9mLiAgKi8KLSNpZmRlZiBfX29zZl9fCi0JICAgIC8qCi0JICAgICAqIFN1cHByZXNzIHN5bWJvbHMgdGhhdCBhcmUgbm90IGZ1bmN0aW9uIG5hbWVzLiAgVGhpcyBpcwotCSAgICAgKiB1c2VmdWwgdG8gc3VwcHJlc3MgY29kZS1sYWJlbHMgYW5kIGFsaWFzZXMuCi0JICAgICAqCi0JICAgICAqIFRoaXMgaXMga25vd24gdG8gYmUgdXNlZnVsIHVuZGVyIERFQydzIE9TRi8xLiAgVW5kZXIgU3VuT1MgNC54LAotCSAgICAgKiBsYWJlbHMgZG8gbm90IGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlIGluZm8sIHNvIHRoaXMgaXNuJ3QKLQkgICAgICogbmVjZXNzYXJ5LgotCSAgICAgKi8KLQotCSAgICBpZiAoc3RyY21wIChzeW10YWIubGltaXQtPm5hbWUsIGZ1bmNfbmFtZSkgIT0gMCkKLQkgICAgICB7Ci0JCS8qCi0JCSAqIFRoZSBzeW1ib2wncyBhZGRyZXNzIG1hcHMgdG8gYSBkaWZmZXJlbnQgbmFtZSwgc28KLQkJICogaXQgY2FuJ3QgYmUgYSBmdW5jdGlvbi1lbnRyeSBwb2ludC4gIFRoaXMgaGFwcGVucwotCQkgKiBmb3IgbGFiZWxzLCBmb3IgZXhhbXBsZS4KLQkJICovCi0JCURCRyAoQU9VVERFQlVHLAotCQkgICAgIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zOiByZWogJXMgKG1hcHMgdG8gJXMpXG4iLAotCQkJICAgICBzeW10YWIubGltaXQtPm5hbWUsIGZ1bmNfbmFtZSkpOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0jZW5kaWYKLQkgIH0KLSAgICAgIH0KLQotICAgICAgc3ltdGFiLmxpbWl0LT5pc19mdW5jID0gVFJVRTsKLSAgICAgIHN5bXRhYi5saW1pdC0+aXNfYmJfaGVhZCA9IFRSVUU7Ci0gICAgICBpZiAoY2xhc3MgPT0gJ3QnKQotCXsKLQkgIHN5bXRhYi5saW1pdC0+aXNfc3RhdGljID0gVFJVRTsKLQl9Ci0KLSAgICAgIG1pbl92bWEgPSBNSU4gKHN5bXRhYi5saW1pdC0+YWRkciwgbWluX3ZtYSk7Ci0gICAgICBtYXhfdm1hID0gTUFYIChzeW10YWIubGltaXQtPmFkZHIsIG1heF92bWEpOwotCi0gICAgICAvKgotICAgICAgICogSWYgd2Ugc2VlICJtYWluIiB3aXRob3V0IGFuIGluaXRpYWwgJ18nLCB3ZSBhc3N1bWUgbmFtZXMKLSAgICAgICAqIGFyZSAqbm90KiBwcmVmaXhlZCBieSAnXycuCi0gICAgICAgKi8KLSAgICAgIGlmIChzeW10YWIubGltaXQtPm5hbWVbMF0gPT0gJ20nICYmIGRpc2NhcmRfdW5kZXJzY29yZXMKLQkgICYmIHN0cmNtcCAoc3ltdGFiLmxpbWl0LT5uYW1lLCAibWFpbiIpID09IDApCi0JewotCSAgZGlzY2FyZF91bmRlcnNjb3JlcyA9IDA7Ci0JfQotCi0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2NvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXNdICVsZCAlcyAweCVseFxuIiwKLQkJCSAgICAgIChsb25nKSAoc3ltdGFiLmxpbWl0IC0gc3ltdGFiLmJhc2UpLAotCQkJICAgICAgc3ltdGFiLmxpbWl0LT5uYW1lLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHN5bXRhYi5saW1pdC0+YWRkcikpOwotICAgICAgKytzeW10YWIubGltaXQ7Ci0gICAgfQotCi0gIC8qIGNyZWF0ZSBzZW50aW5lbHM6ICovCi0KLSAgc3ltX2luaXQgKHN5bXRhYi5saW1pdCk7Ci0gIHN5bXRhYi5saW1pdC0+bmFtZSA9ICI8bG9jb3JlPiI7Ci0gIHN5bXRhYi5saW1pdC0+YWRkciA9IDA7Ci0gIHN5bXRhYi5saW1pdC0+ZW5kX2FkZHIgPSBtaW5fdm1hIC0gMTsKLSAgKytzeW10YWIubGltaXQ7Ci0KLSAgc3ltX2luaXQgKHN5bXRhYi5saW1pdCk7Ci0gIHN5bXRhYi5saW1pdC0+bmFtZSA9ICI8aGljb3JlPiI7Ci0gIHN5bXRhYi5saW1pdC0+YWRkciA9IG1heF92bWEgKyAxOwotICBzeW10YWIubGltaXQtPmVuZF9hZGRyID0gfjA7Ci0gICsrc3ltdGFiLmxpbWl0OwotCi0gIHN5bXRhYi5sZW4gPSBzeW10YWIubGltaXQgLSBzeW10YWIuYmFzZTsKLSAgc3ltdGFiX2ZpbmFsaXplICgmc3ltdGFiKTsKLX0KLQotCi0vKgotICogUmVhZCBpbiBzeW1ib2wgdGFibGUgZnJvbSBjb3JlLiAgT25lIHN5bWJvbCBwZXIgbGluZSBvZiBzb3VyY2UgY29kZQotICogaXMgZW50ZXJlZC4KLSAqLwotdm9pZAotREVGVU4gKGNvcmVfY3JlYXRlX2xpbmVfc3ltcywgKGNvcmVfYmZkKSwgYmZkICogY29yZV9iZmQpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSwgKnByZXZfZmlsZW5hbWU7Ci0gIGludCBwcmV2X25hbWVfbGVuLCBwcmV2X2ZpbGVuYW1lX2xlbjsKLSAgYmZkX3ZtYSB2bWEsIG1pbl92bWEgPSB+MCwgbWF4X3ZtYSA9IDA7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBTeW0gKnByZXYsIGR1bW15LCAqc2VudGluZWwsICpzeW07Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBpbnQgcHJldl9saW5lX251bTsKLSAgU3ltX1RhYmxlIGx0YWI7Ci0gIC8qCi0gICAqIENyZWF0ZSBzeW1ib2xzIGZvciBmdW5jdGlvbnMgYXMgdXN1YWwuICBUaGlzIGlzIG5lY2Vzc2FyeSBpbgotICAgKiBjYXNlcyB3aGVyZSBwYXJ0cyBvZiBhIHByb2dyYW0gd2VyZSBub3QgY29tcGlsZWQgd2l0aCAtZy4gIEZvcgotICAgKiB0aG9zZSBwYXJ0cyB3ZSBzdGlsbCB3YW50IHRvIGdldCBpbmZvIGF0IHRoZSBmdW5jdGlvbiBsZXZlbDoKLSAgICovCi0gIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgKGNvcmVfYmZkKTsKLQotICAvKiBwYXNzIDEgLSBjb3VudGVyIG51bWJlciBvZiBzeW1ib2xzOiAqLwotCi0gIC8qCi0gICAqIFRvIGZpbmQgYWxsIGxpbmUgaW5mb3JtYXRpb24sIHdhbGsgdGhyb3VnaCBhbGwgcG9zc2libGUKLSAgICogdGV4dC1zcGFjZSBhZGRyZXNzZXMgKG9uZSBieSBvbmUhKSBhbmQgZ2V0IHRoZSBkZWJ1Z2dpbmcKLSAgICogaW5mbyBmb3IgZWFjaCBhZGRyZXNzLiAgV2hlbiB0aGUgZGVidWdnaW5nIGluZm8gY2hhbmdlcywKLSAgICogaXQgaXMgdGltZSB0byBjcmVhdGUgYSBuZXcgc3ltYm9sLgotICAgKgotICAgKiBPZiBjb3Vyc2UsIHRoaXMgaXMgcmF0aGVyIHNsb3cgYW5kIGl0IHdvdWxkIGJlIGJldHRlciBpZgotICAgKiBiZmQgd291bGQgcHJvdmlkZSBhbiBpdGVyYXRvciBmb3IgZW51bWVyYXRpbmcgYWxsIGxpbmUgaW5mb3MKLSAgICovCi0gIHByZXZfbmFtZV9sZW4gPSBQQVRIX01BWDsKLSAgcHJldl9maWxlbmFtZV9sZW4gPSBQQVRIX01BWDsKLSAgcHJldl9uYW1lID0geG1hbGxvYyAocHJldl9uYW1lX2xlbik7Ci0gIHByZXZfZmlsZW5hbWUgPSB4bWFsbG9jIChwcmV2X2ZpbGVuYW1lX2xlbik7Ci0gIGx0YWIubGVuID0gMDsKLSAgcHJldl9saW5lX251bSA9IDA7Ci0gIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZTsgb2Zmc2V0ICs9IG1pbl9pbnNuX3NpemUpCi0gICAgewotICAgICAgaW50IGxlbjsKLQotICAgICAgdm1hID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldDsKLSAgICAgIGlmICghZ2V0X3NyY19pbmZvICh2bWEsICZmaWxlbmFtZSwgJmR1bW15Lm5hbWUsICZkdW1teS5saW5lX251bSkKLQkgIHx8IChwcmV2X2xpbmVfbnVtID09IGR1bW15LmxpbmVfbnVtCi0JICAgICAgJiYgcHJldl9uYW1lICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKHByZXZfbmFtZSwgZHVtbXkubmFtZSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAocHJldl9maWxlbmFtZSwgZmlsZW5hbWUpID09IDApKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgKytsdGFiLmxlbjsKLSAgICAgIHByZXZfbGluZV9udW0gPSBkdW1teS5saW5lX251bTsKLQotICAgICAgbGVuID0gc3RybGVuIChkdW1teS5uYW1lKTsKLSAgICAgIGlmIChsZW4gPj0gcHJldl9uYW1lX2xlbikKLQl7Ci0JICBwcmV2X25hbWVfbGVuID0gbGVuICsgMTAyNDsKLQkgIGZyZWUgKHByZXZfbmFtZSk7Ci0JICBwcmV2X25hbWUgPSB4bWFsbG9jIChwcmV2X25hbWVfbGVuKTsKLQl9Ci0gICAgICBzdHJjcHkgKHByZXZfbmFtZSwgZHVtbXkubmFtZSk7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoZmlsZW5hbWUpOwotICAgICAgaWYgKGxlbiA+PSBwcmV2X2ZpbGVuYW1lX2xlbikKLQl7Ci0JICBwcmV2X2ZpbGVuYW1lX2xlbiA9IGxlbiArIDEwMjQ7Ci0JICBmcmVlIChwcmV2X2ZpbGVuYW1lKTsKLQkgIHByZXZfZmlsZW5hbWUgPSB4bWFsbG9jIChwcmV2X2ZpbGVuYW1lX2xlbik7Ci0JfQotICAgICAgc3RyY3B5IChwcmV2X2ZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0KLSAgICAgIG1pbl92bWEgPSBNSU4gKHZtYSwgbWluX3ZtYSk7Ci0gICAgICBtYXhfdm1hID0gTUFYICh2bWEsIG1heF92bWEpOwotICAgIH0KLQotICBmcmVlIChwcmV2X25hbWUpOwotICBmcmVlIChwcmV2X2ZpbGVuYW1lKTsKLQotICAvKiBtYWtlIHJvb20gZm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRvbzogKi8KLSAgbHRhYi5sZW4gKz0gc3ltdGFiLmxlbjsKLSAgbHRhYi5iYXNlID0gKFN5bSAqKSB4bWFsbG9jIChsdGFiLmxlbiAqIHNpemVvZiAoU3ltKSk7Ci0gIGx0YWIubGltaXQgPSBsdGFiLmJhc2U7Ci0KLSAgLyogcGFzcyAyIC0gY3JlYXRlIHN5bWJvbHM6ICovCi0KLSAgLyogV2Ugbm93IHNldCBpc19zdGF0aWMgYXMgd2UgZ28gYWxvbmcsIHJhdGhlciB0aGFuIGJ5IHJ1bm5pbmcKLSAgICAgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoZSBlbmQuCi0KLSAgICAgVGhlIG9sZCB3YXkgY2FsbGVkIHN5bXRhYl9maW5hbGl6ZSBiZWZvcmUgdGhlIGlzX3N0YXRpYyBwYXNzLAotICAgICBjYXVzaW5nIGEgcHJvYmxlbSBzaW5jZSBzeW10YWJfZmluYWxpemUgdXNlcyBpc19zdGF0aWMgYXMgcGFydCBvZgotICAgICBpdHMgYWRkcmVzcyBjb25mbGljdCByZXNvbHV0aW9uIGFsZ29yaXRobS4gIFNpbmNlIGdsb2JhbCBzeW1ib2xzCi0gICAgIHdlcmUgcHJlZmVyZWQgb3ZlciBzdGF0aWMgc3ltYm9scywgYW5kIGFsbCBsaW5lIHN5bWJvbHMgd2VyZQotICAgICBnbG9iYWwgYXQgdGhhdCBwb2ludCwgc3RhdGljIGZ1bmN0aW9uIG5hbWVzIHRoYXQgY29uZmxpY3RlZCB3aXRoCi0gICAgIHRoZWlyIG93biBsaW5lIG51bWJlcnMgKHN0YXRpYywgYnV0IGxhYmVsZWQgYXMgZ2xvYmFsKSB3ZXJlCi0gICAgIHJlamVjdGVkIGluIGZhdm9yIG9mIHRoZSBsaW5lIG51bS4KLQotICAgICBUaGlzIHdhcyBub3QgdGhlIGRlc2lyZWQgZnVuY3Rpb25hbGl0eS4gIFdlIGFsd2F5cyB3YW50IHRvIGtlZXAKLSAgICAgb3VyIGZ1bmN0aW9uIHN5bWJvbHMgYW5kIGRpc2NhcmQgYW55IGNvbmZsaWN0aW5nIGxpbmUgc3ltYm9scy4KLSAgICAgUGVyaGFwcyBzeW10YWJfZmluYWxpemUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIG1ha2UgdGhpcwotICAgICBkaXN0aW5jdGlvbiBhcyB3ZWxsLCBidXQgdGhlIGN1cnJlbnQgZml4IHdvcmtzIGFuZCB0aGUgY29kZSBpcyBhCi0gICAgIGxvdCBjbGVhbmVyIG5vdy4gICovCi0KLSAgcHJldiA9IDA7Ci0gIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZTsgb2Zmc2V0ICs9IG1pbl9pbnNuX3NpemUpCi0gICAgewotICAgICAgc3ltX2luaXQgKGx0YWIubGltaXQpOwotICAgICAgaWYgKCFnZXRfc3JjX2luZm8gKGNvcmVfdGV4dF9zZWN0LT52bWEgKyBvZmZzZXQsICZmaWxlbmFtZSwKLQkJCSAmbHRhYi5saW1pdC0+bmFtZSwgJmx0YWIubGltaXQtPmxpbmVfbnVtKQotCSAgfHwgKHByZXYgJiYgcHJldi0+bGluZV9udW0gPT0gbHRhYi5saW1pdC0+bGluZV9udW0KLQkgICAgICAmJiBzdHJjbXAgKHByZXYtPm5hbWUsIGx0YWIubGltaXQtPm5hbWUpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKHByZXYtPmZpbGUtPm5hbWUsIGZpbGVuYW1lKSA9PSAwKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIG1ha2UgbmFtZSBwb2ludGVyIGEgbWFsbG9jJ2VkIHN0cmluZzogKi8KLSAgICAgIGx0YWIubGltaXQtPm5hbWUgPSB4c3RyZHVwIChsdGFiLmxpbWl0LT5uYW1lKTsKLSAgICAgIGx0YWIubGltaXQtPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCAoZmlsZW5hbWUpOwotCi0gICAgICBsdGFiLmxpbWl0LT5hZGRyID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldDsKLQotICAgICAgLyogU2V0IGlzX3N0YXRpYyBiYXNlZCBvbiB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uLCB1c2luZyBlaXRoZXI6Ci0gICAgICAgKiAxKSB0aGUgcHJldmlvdXMgc3ltYm9sLCBpZiBpdCdzIGZyb20gdGhlIHNhbWUgZnVuY3Rpb24sIG9yCi0gICAgICAgKiAyKSBhIHN5bXRhYiBsb29rdXAKLSAgICAgICAqLwotCi0gICAgICBpZiAocHJldiAmJiBsdGFiLmxpbWl0LT5maWxlID09IHByZXYtPmZpbGUgJiYKLQkgIHN0cmNtcCAobHRhYi5saW1pdC0+bmFtZSwgcHJldi0+bmFtZSkgPT0gMCkKLQl7Ci0JICBsdGFiLmxpbWl0LT5pc19zdGF0aWMgPSBwcmV2LT5pc19zdGF0aWM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bSA9IHN5bV9sb29rdXAoJnN5bXRhYiwgbHRhYi5saW1pdC0+YWRkcik7Ci0JICBsdGFiLmxpbWl0LT5pc19zdGF0aWMgPSBzeW0tPmlzX3N0YXRpYzsKLQl9Ci0KLSAgICAgIHByZXYgPSBsdGFiLmxpbWl0OwotCi0gICAgICAvKgotICAgICAgICogSWYgd2Ugc2VlICJtYWluIiB3aXRob3V0IGFuIGluaXRpYWwgJ18nLCB3ZSBhc3N1bWUgbmFtZXMKLSAgICAgICAqIGFyZSAqbm90KiBwcmVmaXhlZCBieSAnXycuCi0gICAgICAgKi8KLSAgICAgIGlmIChsdGFiLmxpbWl0LT5uYW1lWzBdID09ICdtJyAmJiBkaXNjYXJkX3VuZGVyc2NvcmVzCi0JICAmJiBzdHJjbXAgKGx0YWIubGltaXQtPm5hbWUsICJtYWluIikgPT0gMCkKLQl7Ci0JICBkaXNjYXJkX3VuZGVyc2NvcmVzID0gMDsKLQl9Ci0KLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9jcmVhdGVfbGluZV9zeW1zXSAlbHUgJXMgMHglbHhcbiIsCi0JCQkgICAgICAodW5zaWduZWQgbG9uZykgKGx0YWIubGltaXQgLSBsdGFiLmJhc2UpLAotCQkJICAgICAgbHRhYi5saW1pdC0+bmFtZSwKLQkJCSAgICAgICh1bnNpZ25lZCBsb25nKSBsdGFiLmxpbWl0LT5hZGRyKSk7Ci0gICAgICArK2x0YWIubGltaXQ7Ci0gICAgfQotCi0gIC8qIHVwZGF0ZSBzZW50aW5lbHM6ICovCi0KLSAgc2VudGluZWwgPSBzeW1fbG9va3VwICgmc3ltdGFiLCAwKTsKLSAgaWYgKHN0cmNtcCAoc2VudGluZWwtPm5hbWUsICI8bG9jb3JlPiIpID09IDAKLSAgICAgICYmIG1pbl92bWEgPD0gc2VudGluZWwtPmVuZF9hZGRyKQotICAgIHsKLSAgICAgIHNlbnRpbmVsLT5lbmRfYWRkciA9IG1pbl92bWEgLSAxOwotICAgIH0KLQotICBzZW50aW5lbCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIH4wKTsKLSAgaWYgKHN0cmNtcCAoc2VudGluZWwtPm5hbWUsICI8aGljb3JlPiIpID09IDAgJiYgbWF4X3ZtYSA+PSBzZW50aW5lbC0+YWRkcikKLSAgICB7Ci0gICAgICBzZW50aW5lbC0+YWRkciA9IG1heF92bWEgKyAxOwotICAgIH0KLQotICAvKiBjb3B5IGluIGZ1bmN0aW9uIHN5bWJvbHM6ICovCi0gIG1lbWNweSAobHRhYi5saW1pdCwgc3ltdGFiLmJhc2UsIHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSkpOwotICBsdGFiLmxpbWl0ICs9IHN5bXRhYi5sZW47Ci0KLSAgaWYgKCh1bnNpZ25lZCBpbnQpIChsdGFiLmxpbWl0IC0gbHRhYi5iYXNlKSAhPSBsdGFiLmxlbikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgIF8oIiVzOiBzb21lYm9keSBtaXNjb3VudGVkOiBsdGFiLmxlbj0lZCBpbnN0ZWFkIG9mICVsZFxuIiksCi0JICAgICAgIHdob2FtaSwgbHRhYi5sZW4sIChsb25nKSAobHRhYi5saW1pdCAtIGx0YWIuYmFzZSkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIGZpbmFsaXplIGx0YWIgYW5kIG1ha2UgaXQgc3ltYm9sIHRhYmxlOiAqLwotCi0gIHN5bXRhYl9maW5hbGl6ZSAoJmx0YWIpOwotICBmcmVlIChzeW10YWIuYmFzZSk7Ci0gIHN5bXRhYiA9IGx0YWI7Ci0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2NvcmVmaWxlLmggYi9ncHJvZi9jb3JlZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzk2Zjg1Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NvcmVmaWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jaWZuZGVmIGNvcmVmaWxlX2gKLSNkZWZpbmUgY29yZWZpbGVfaAotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLWV4dGVybiBiZmQgKmNvcmVfYmZkOwkJLyogYmZkIGZvciBjb3JlLWZpbGUgKi8KLWV4dGVybiBpbnQgY29yZV9udW1fc3ltczsJLyogIyBvZiBlbnRyaWVzIGluIHN5bWJvbC10YWJsZSAqLwotZXh0ZXJuIGFzeW1ib2wgKipjb3JlX3N5bXM7CS8qIHN5bWJvbCB0YWJsZSBpbiBhLm91dCAqLwotZXh0ZXJuIGFzZWN0aW9uICpjb3JlX3RleHRfc2VjdDsJLyogY29yZSB0ZXh0IHNlY3Rpb24gKi8KLWV4dGVybiBQVFIgY29yZV90ZXh0X3NwYWNlOwkvKiB0ZXh0IHNwYWNlIG9mIGEub3V0IGluIGNvcmUgKi8KLQotZXh0ZXJuIGludCBtaW5faW5zbl9zaXplOwkvKiBzaXplIG9mIHNtYWxsZXN0IGluc3RydWN0aW9uLCBpbiBieXRlcyAqLwotZXh0ZXJuIGludCBvZmZzZXRfdG9fY29kZTsJLyogb2Zmc2V0IChpbiBieXRlcykgb2YgY29kZSBmcm9tIGVudHJ5Ci0JCQkJICAgYWRkcmVzcyBvZiByb3V0aW5lICovCi0KLWV4dGVybiB2b2lkIGNvcmVfaW5pdCBQQVJBTVMgKChjb25zdCBjaGFyICphX291dF9uYW1lKSk7Ci1leHRlcm4gdm9pZCBjb3JlX2dldF90ZXh0X3NwYWNlIFBBUkFNUyAoKGJmZCAqIGNvcmVfYmZkKSk7Ci1leHRlcm4gdm9pZCBjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zIFBBUkFNUyAoKGJmZCAqIGNvcmVfYmZkKSk7Ci1leHRlcm4gdm9pZCBjb3JlX2NyZWF0ZV9saW5lX3N5bXMgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKLQotI2VuZGlmIC8qIGNvcmVmaWxlX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2ZsYXRfYmwubSBiL2dwcm9mL2ZsYXRfYmwubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyODcxYS4uMDAwMDAwMAotLS0gYS9ncHJvZi9mbGF0X2JsLm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0KLSAlICAgICAgICAgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHJ1bm5pbmcgdGltZSBvZiB0aGUKLXRpbWUgICAgICAgcHJvZ3JhbSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24uCi0KLWN1bXVsYXRpdmUgYSBydW5uaW5nIHN1bSBvZiB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWNjb3VudGVkCi0gc2Vjb25kcyAgIGZvciBieSB0aGlzIGZ1bmN0aW9uIGFuZCB0aG9zZSBsaXN0ZWQgYWJvdmUgaXQuCi0KLSBzZWxmICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIGFjY291bnRlZCBmb3IgYnkgdGhpcwotc2Vjb25kcyAgICBmdW5jdGlvbiBhbG9uZS4gIFRoaXMgaXMgdGhlIG1ham9yIHNvcnQgZm9yIHRoaXMKLSAgICAgICAgICAgbGlzdGluZy4KLQotY2FsbHMgICAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2FzIGludm9rZWQsIGlmCi0gICAgICAgICAgIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQsIGVsc2UgYmxhbmsuCi0gCi0gc2VsZiAgICAgIHRoZSBhdmVyYWdlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgaW4gdGhpcwotbXMvY2FsbCAgICBmdW5jdGlvbiBwZXIgY2FsbCwgaWYgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZCwKLQkgICBlbHNlIGJsYW5rLgotCi0gdG90YWwgICAgIHRoZSBhdmVyYWdlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgaW4gdGhpcwotbXMvY2FsbCAgICBmdW5jdGlvbiBhbmQgaXRzIGRlc2NlbmRlbnRzIHBlciBjYWxsLCBpZiB0aGlzIAotCSAgIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLCBlbHNlIGJsYW5rLgotCi1uYW1lICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gIFRoaXMgaXMgdGhlIG1pbm9yIHNvcnQKLSAgICAgICAgICAgZm9yIHRoaXMgbGlzdGluZy4gVGhlIGluZGV4IHNob3dzIHRoZSBsb2NhdGlvbiBvZgotCSAgIHRoZSBmdW5jdGlvbiBpbiB0aGUgZ3Byb2YgbGlzdGluZy4gSWYgdGhlIGluZGV4IGlzCi0JICAgaW4gcGFyZW50aGVzaXMgaXQgc2hvd3Mgd2hlcmUgaXQgd291bGQgYXBwZWFyIGluCi0JICAgdGhlIGdwcm9mIGxpc3RpbmcgaWYgaXQgd2VyZSB0byBiZSBwcmludGVkLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvZnNmX2NhbGxnX2JsLm0gYi9ncHJvZi9mc2ZfY2FsbGdfYmwubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxNjgyMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9mc2ZfY2FsbGdfYmwubQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLQotIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBjYWxsIHRyZWUgb2YgdGhlIHByb2dyYW0sIGFuZCB3YXMgc29ydGVkIGJ5Ci0gdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGVhY2ggZnVuY3Rpb24gYW5kIGl0cyBjaGlsZHJlbi4KLQotIEVhY2ggZW50cnkgaW4gdGhpcyB0YWJsZSBjb25zaXN0cyBvZiBzZXZlcmFsIGxpbmVzLiAgVGhlIGxpbmUgd2l0aCB0aGUKLSBpbmRleCBudW1iZXIgYXQgdGhlIGxlZnQgaGFuZCBtYXJnaW4gbGlzdHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCi0gVGhlIGxpbmVzIGFib3ZlIGl0IGxpc3QgdGhlIGZ1bmN0aW9ucyB0aGF0IGNhbGxlZCB0aGlzIGZ1bmN0aW9uLAotIGFuZCB0aGUgbGluZXMgYmVsb3cgaXQgbGlzdCB0aGUgZnVuY3Rpb25zIHRoaXMgb25lIGNhbGxlZC4KLSBUaGlzIGxpbmUgbGlzdHM6Ci0gICAgIGluZGV4CUEgdW5pcXVlIG51bWJlciBnaXZlbiB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIHRhYmxlLgotCQlJbmRleCBudW1iZXJzIGFyZSBzb3J0ZWQgbnVtZXJpY2FsbHkuCi0JCVRoZSBpbmRleCBudW1iZXIgaXMgcHJpbnRlZCBuZXh0IHRvIGV2ZXJ5IGZ1bmN0aW9uIG5hbWUgc28KLQkJaXQgaXMgZWFzaWVyIHRvIGxvb2sgdXAgd2hlcmUgdGhlIGZ1bmN0aW9uIGluIHRoZSB0YWJsZS4KLQotICAgICAlIHRpbWUJVGhpcyBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgYHRvdGFsJyB0aW1lIHRoYXQgd2FzIHNwZW50Ci0JCWluIHRoaXMgZnVuY3Rpb24gYW5kIGl0cyBjaGlsZHJlbi4gIE5vdGUgdGhhdCBkdWUgdG8KLQkJZGlmZmVyZW50IHZpZXdwb2ludHMsIGZ1bmN0aW9ucyBleGNsdWRlZCBieSBvcHRpb25zLCBldGMsCi0JCXRoZXNlIG51bWJlcnMgd2lsbCBOT1QgYWRkIHVwIHRvIDEwMCUuCi0KLSAgICAgc2VsZglUaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uLgotCi0gICAgIGNoaWxkcmVuCVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHByb3BhZ2F0ZWQgaW50byB0aGlzCi0JCWZ1bmN0aW9uIGJ5IGl0cyBjaGlsZHJlbi4KLQotICAgICBjYWxsZWQJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLgotCQlJZiB0aGUgZnVuY3Rpb24gY2FsbGVkIGl0c2VsZiByZWN1cnNpdmVseSwgdGhlIG51bWJlcgotCQlvbmx5IGluY2x1ZGVzIG5vbi1yZWN1cnNpdmUgY2FsbHMsIGFuZCBpcyBmb2xsb3dlZCBieQotCQlhIGArJyBhbmQgdGhlIG51bWJlciBvZiByZWN1cnNpdmUgY2FsbHMuCi0KLSAgICAgbmFtZQlUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gIFRoZSBpbmRleCBudW1iZXIgaXMKLQkJcHJpbnRlZCBhZnRlciBpdC4gIElmIHRoZSBmdW5jdGlvbiBpcyBhIG1lbWJlciBvZiBhCi0JCWN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzIHByaW50ZWQgYmV0d2VlbiB0aGUKLQkJZnVuY3Rpb24ncyBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotCi0KLSBGb3IgdGhlIGZ1bmN0aW9uJ3MgcGFyZW50cywgdGhlIGZpZWxkcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6Ci0KLSAgICAgc2VsZglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGRpcmVjdGx5Ci0JCWZyb20gdGhlIGZ1bmN0aW9uIGludG8gdGhpcyBwYXJlbnQuCi0KLSAgICAgY2hpbGRyZW4JVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBmcm9tCi0JCXRoZSBmdW5jdGlvbidzIGNoaWxkcmVuIGludG8gdGhpcyBwYXJlbnQuCi0KLSAgICAgY2FsbGVkCVRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIHBhcmVudCBjYWxsZWQgdGhlCi0JCWZ1bmN0aW9uIGAvJyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbgotCQl3YXMgY2FsbGVkLiAgUmVjdXJzaXZlIGNhbGxzIHRvIHRoZSBmdW5jdGlvbiBhcmUgbm90Ci0JCWluY2x1ZGVkIGluIHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGAvJy4KLQotICAgICBuYW1lCVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcmVudC4gIFRoZSBwYXJlbnQncyBpbmRleAotCQludW1iZXIgaXMgcHJpbnRlZCBhZnRlciBpdC4gIElmIHRoZSBwYXJlbnQgaXMgYQotCQltZW1iZXIgb2YgYSBjeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcyBwcmludGVkIGJldHdlZW4KLQkJdGhlIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi0KLSBJZiB0aGUgcGFyZW50cyBvZiB0aGUgZnVuY3Rpb24gY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSB3b3JkCi0gYDxzcG9udGFuZW91cz4nIGlzIHByaW50ZWQgaW4gdGhlIGBuYW1lJyBmaWVsZCwgYW5kIGFsbCB0aGUgb3RoZXIKLSBmaWVsZHMgYXJlIGJsYW5rLgotCi0gRm9yIHRoZSBmdW5jdGlvbidzIGNoaWxkcmVuLCB0aGUgZmllbGRzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotICAgICBzZWxmCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZGlyZWN0bHkKLQkJZnJvbSB0aGUgY2hpbGQgaW50byB0aGUgZnVuY3Rpb24uCi0KLSAgICAgY2hpbGRyZW4JVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBmcm9tIHRoZQotCQljaGlsZCdzIGNoaWxkcmVuIHRvIHRoZSBmdW5jdGlvbi4KLQotICAgICBjYWxsZWQJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiBjYWxsZWQKLQkJdGhpcyBjaGlsZCBgLycgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgY2hpbGQKLQkJd2FzIGNhbGxlZC4gIFJlY3Vyc2l2ZSBjYWxscyBieSB0aGUgY2hpbGQgYXJlIG5vdAotCQlsaXN0ZWQgaW4gdGhlIG51bWJlciBhZnRlciB0aGUgYC8nLgotCi0gICAgIG5hbWUJVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2hpbGQuICBUaGUgY2hpbGQncyBpbmRleAotCQludW1iZXIgaXMgcHJpbnRlZCBhZnRlciBpdC4gIElmIHRoZSBjaGlsZCBpcyBhCi0JCW1lbWJlciBvZiBhIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzIHByaW50ZWQKLQkJYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLQotIElmIHRoZXJlIGFyZSBhbnkgY3ljbGVzIChjaXJjbGVzKSBpbiB0aGUgY2FsbCBncmFwaCwgdGhlcmUgaXMgYW4KLSBlbnRyeSBmb3IgdGhlIGN5Y2xlLWFzLWEtd2hvbGUuICBUaGlzIGVudHJ5IHNob3dzIHdobyBjYWxsZWQgdGhlCi0gY3ljbGUgKGFzIHBhcmVudHMpIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgY3ljbGUgKGFzIGNoaWxkcmVuLikKLSBUaGUgYCsnIHJlY3Vyc2l2ZSBjYWxscyBlbnRyeSBzaG93cyB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9uIGNhbGxzIHRoYXQKLSB3ZXJlIGludGVybmFsIHRvIHRoZSBjeWNsZSwgYW5kIHRoZSBjYWxscyBlbnRyeSBmb3IgZWFjaCBtZW1iZXIgc2hvd3MsCi0gZm9yIHRoYXQgbWVtYmVyLCBob3cgbWFueSB0aW1lcyBpdCB3YXMgY2FsbGVkIGZyb20gb3RoZXIgbWVtYmVycyBvZgotIHRoZSBjeWNsZS4KLQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ2NvbmZpZy5pbiBiL2dwcm9mL2djb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0N2U4ZTAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKiBnY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ2VuLWMtcHJvZy5hd2sgYi9ncHJvZi9nZW4tYy1wcm9nLmF3awpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5YzFmOC4uMDAwMDAwMAotLS0gYS9ncHJvZi9nZW4tYy1wcm9nLmF3aworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU5SID09IDEJewotICAgIEZTPSJcIiI7Ci0gICAgcHJpbnQgIi8qID09PiBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSEhICBJdCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkiCi0gICAgcHJpbnRmICIgICBmcm9tICVzIHVzaW5nIHRoZSBnZW4tYy1wcm9nLmF3ayBzY3JpcHQuICA8PT0gKi9cblxuIiwgRklMRQotICAgIHByaW50ICIjaW5jbHVkZSA8c3RkaW8uaD4iCi19Ci0KLQl7Ci0JICBpZiAoY3VyZnVuICE9IEZVTkNUSU9OKQotCSAgICB7Ci0JICAgICAgaWYgKGN1cmZ1bikKLQkJcHJpbnQgIn0iCi0JICAgICAgY3VyZnVuID0gRlVOQ1RJT04KLQkgICAgICBwcmludCAiIgotCSAgICAgIHByaW50ICJ2b2lkIjsKLQkgICAgICBwcmludGYgIiVzIChmaWxlKVxuIiwgRlVOQ1RJT04KLQkgICAgICBwcmludCAiICAgICBGSUxFICpmaWxlOyI7Ci0JICAgICAgcHJpbnQgInsiOwotCSAgICB9Ci0JICBwcmludGYgIiAgZnB1dHMgKFwiIjsKLQkgIGZvciAoaSA9IDE7IGkgPCBORjsgaSsrKQotCSAgICBwcmludGYgIiVzXFxcIiIsICRpOwotCSAgcHJpbnRmICIlc1xcblwiLCBmaWxlKTtcbiIsICRORjsKLX0KLQotRU5ECXsgcHJpbnQgIn0iIH0KZGlmZiAtLWdpdCBhL2dwcm9mL2dtb24uaCBiL2dwcm9mL2dtb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxZmE0ZC4uMDAwMDAwMAotLS0gYS9ncHJvZi9nbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKglAKCMpZ21vbi5oCTUuMiAoQmVya2VsZXkpIDUvNi85MQotICovCi0jaWZuZGVmIGdtb25faAotI2RlZmluZSBnbW9uX2gKLQotc3RydWN0IHJhd19waGRyCi0gIHsKLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgYSBob3N0IGNvbXBpbGVyIGRlZmluZSBtZWFucyB0aGF0IHdlIGNhbid0IHVzZQotICAgICAgIGEgY3Jvc3MgZ3Byb2YgdG8gdGhlIGFscGhhLiAgKi8KLSNpZmRlZiBfX2FscGhhX18KLSAgICBjaGFyIGxvd19wY1s4XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzhdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbHNlCi0gICAgY2hhciBsb3dfcGNbNF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1s0XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0jZW5kaWYKLSAgICBjaGFyIG5jbnRbNF07CQkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKHBsdXMgdGhpcyBoZWFkZXIpICovCi0KLSAgICBjaGFyIHZlcnNpb25bNF07CQkvKiB2ZXJzaW9uIG51bWJlciAqLwotICAgIGNoYXIgcHJvZnJhdGVbNF07CQkvKiBwcm9maWxpbmcgY2xvY2sgcmF0ZSAqLwotICAgIGNoYXIgc3BhcmVbMyo0XTsJCS8qIHJlc2VydmVkICovCi0gIH07Ci0KLSNkZWZpbmUgR01PTlZFUlNJT04gICAgIDB4MDAwNTE4NzkKLQotc3RydWN0IG9sZF9yYXdfcGhkcgotICB7Ci0gICAgLyogRklYTUU6IENoZWNraW5nIGEgaG9zdCBjb21waWxlciBkZWZpbmUgbWVhbnMgdGhhdCB3ZSBjYW4ndCB1c2UKLSAgICAgICBhIGNyb3NzIGdwcm9mIHRvIHRoZSBhbHBoYS4gICovCi0jaWZkZWYgX19hbHBoYV9fCi0gICAgY2hhciBsb3dfcGNbOF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1s4XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0jZWxzZQotICAgIGNoYXIgbG93X3BjWzRdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbNF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotI2VuZGlmCi0gICAgY2hhciBuY250WzRdOwkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyIChwbHVzIHRoaXMgaGVhZGVyKSAqLwotCi0gICAgLyogRklYTUU6IENoZWNraW5nIGhvc3QgY29tcGlsZXIgZGVmaW5lcyBoZXJlIG1lYW5zIHRoYXQgd2UgY2FuJ3QKLSAgICAgICB1c2UgYSBjcm9zcyBncHJvZiBhbHBoYSBPU0YuICAqLwotI2lmIGRlZmluZWQgKF9fYWxwaGFfXykgJiYgZGVmaW5lZCAoX19vc2ZfXykKLSAgICAvKgotICAgICAqIERFQydzIE9TRiB2My4wIHVzZXMgNCBieXRlcyBvZiBwYWRkaW5nIHRvIGJyaW5nIHRoZSBoZWFkZXIgdG8KLSAgICAgKiBhIHNpemUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIDguCi0gICAgICovCi0gICAgY2hhciBwYWRbNF07Ci0jZW5kaWYKLSAgfTsKLQotLyoKLSAqIEhpc3RvZ3JhbSBjb3VudGVycyBhcmUgdW5zaWduZWQgc2hvcnRzOgotICovCi0jZGVmaW5lCUhJU1RDT1VOVEVSIHVuc2lnbmVkIHNob3J0Ci0KLS8qCi0gKiBGcmFjdGlvbiBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciBoaXN0b2dyYW0gY291bnRlcnMgaGVyZSwgMS8yOgotICovCi0jZGVmaW5lCUhJU1RGUkFDVElPTgkyCi0KLS8qCi0gKiBGcmFjdGlvbiBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciBmcm9tIGhhc2ggYnVja2V0cy4gIFRoZQotICogdmFsdWUgb2YgSEFTSEZSQUNUSU9OIGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyBvZgotICogc2VwYXJhdGlvbiBiZXR3ZWVuIHR3byBzdWJyb3V0aW5lIGNhbGwgcG9pbnRzIGluIHRoZSBvYmplY3QgY29kZS4KLSAqIEdpdmVuIE1JTl9TVUJSX1NFUEFSQVRJT04gYnl0ZXMgb2Ygc2VwYXJhdGlvbiB0aGUgdmFsdWUgb2YKLSAqIEhBU0hGUkFDVElPTiBpcyBjYWxjdWxhdGVkIGFzOgotICoKLSAqICAgICAgSEFTSEZSQUNUSU9OID0gTUlOX1NVQlJfU0VQQVJBVElPTiAvICgyICogc2l6ZW9mKHNob3J0KSAtIDEpOwotICoKLSAqIEZvciB0aGUgVkFYLCB0aGUgc2hvcnRlc3QgdHdvIGNhbGwgc2VxdWVuY2UgaXM6Ci0gKgotICogICAgICBjYWxscyAgICQwLChyMCkKLSAqICAgICAgY2FsbHMgICAkMCwocjApCi0gKgotICogd2hpY2ggaXMgc2VwYXJhdGVkIGJ5IG9ubHkgdGhyZWUgYnl0ZXMsIHRodXMgSEFTSEZSQUNUSU9OIGlzIAotICogY2FsY3VsYXRlZCBhczoKLSAqCi0gKiAgICAgIEhBU0hGUkFDVElPTiA9IDMgLyAoMiAqIDIgLSAxKSA9IDEKLSAqCi0gKiBOb3RlIHRoYXQgdGhlIGRpdmlzaW9uIGFib3ZlIHJvdW5kcyBkb3duLCB0aHVzIGlmIE1JTl9TVUJSX0ZSQUNUSU9OCi0gKiBpcyBsZXNzIHRoYW4gdGhyZWUsIHRoaXMgYWxnb3JpdGhtIHdpbGwgbm90IHdvcmshCi0gKi8KLSNkZWZpbmUJSEFTSEZSQUNUSU9OIDEKLQotLyoKLSAqIFBlcmNlbnQgb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgdG9zdHJ1Y3RzIHdpdGggYSBtaW5pbXVtOgotICovCi0jZGVmaW5lIEFSQ0RFTlNJVFkJMgotI2RlZmluZSBNSU5BUkNTCQk1MAotCi1zdHJ1Y3QgdG9zdHJ1Y3QKLSAgewotICAgIGNoYXIgKnNlbGZwYzsKLSAgICBpbnQgY291bnQ7Ci0gICAgdW5zaWduZWQgc2hvcnQgbGluazsKLSAgfTsKLQotLyoKLSAqIEEgcmF3IGFyYywgd2l0aCBwb2ludGVycyB0byB0aGUgY2FsbGluZyBzaXRlIGFuZCB0aGUgY2FsbGVkIHNpdGUKLSAqIGFuZCBhIGNvdW50LiAgRXZlcnl0aGluZyBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIGNoYXJhY3RlcnMgc28KLSAqIGFzIHRvIGdldCBhIHBhY2tlZCByZXByZXNlbnRhdGlvbiAob3RoZXJ3aXNlLCBkaWZmZXJlbnQgY29tcGlsZXJzCi0gKiBtaWdodCBpbnRyb2R1Y2UgZGlmZmVyZW50IHBhZGRpbmcpOgotICovCi1zdHJ1Y3QgcmF3X2FyYwotICB7Ci0gICAgLyogRklYTUU6IENoZWNraW5nIGEgaG9zdCBjb21waWxlciBkZWZpbmUgbWVhbnMgdGhhdCB3ZSBjYW4ndCB1c2UKLSAgICAgICBhIGNyb3NzIGdwcm9mIHRvIHRoZSBhbHBoYS4gICovCi0jaWZkZWYgX19hbHBoYV9fCi0gICAgY2hhciBmcm9tX3BjWzhdOwotICAgIGNoYXIgc2VsZl9wY1s4XTsKLSAgICBjaGFyIGNvdW50WzhdOwotI2Vsc2UKLSAgICBjaGFyIGZyb21fcGNbNF07Ci0gICAgY2hhciBzZWxmX3BjWzRdOwotICAgIGNoYXIgY291bnRbNF07Ci0jZW5kaWYKLSAgfTsKLQotLyoKLSAqIEdlbmVyYWwgcm91bmRpbmcgZnVuY3Rpb25zOgotICovCi0jZGVmaW5lIFJPVU5ERE9XTih4LHkpCSgoKHgpLyh5KSkqKHkpKQotI2RlZmluZSBST1VORFVQKHgseSkJKCgoKHgpKyh5KS0xKS8oeSkpKih5KSkKLQotI2VuZGlmIC8qIGdtb25faCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9pby5jIGIvZ3Byb2YvZ21vbl9pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTBhMWEwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb25faW8uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKgotICogSW5wdXQgYW5kIG91dHB1dCBmcm9tL3RvIGdtb24ub3V0IGZpbGVzLgotICovCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImJhc2ljX2Jsb2Nrcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiY2FsbF9ncmFwaC5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgImdtb24uaCIJCS8qIGZldGNoIGhlYWRlciBmb3Igb2xkIGZvcm1hdCAqLwotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiaGVydHouaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLWludCBnbW9uX2lucHV0ID0gMDsKLWludCBnbW9uX2ZpbGVfdmVyc2lvbiA9IDA7CS8qIDAgPT0gb2xkIChub24tdmVyc2lvbmVkKSBmaWxlIGZvcm1hdCAqLwotCi0vKgotICogVGhpcyBwcm9iYWJseSBvdWdodCB0byBiZSBpbiBsaWJiZmQuCi0gKi8KLWJmZF92bWEKLURFRlVOIChnZXRfdm1hLCAoYWJmZCwgYWRkciksIGJmZCAqIGFiZmQgQU5EIGJmZF9ieXRlICogYWRkcikKLXsKLSAgc3dpdGNoIChzaXplb2YgKGNoYXIqKSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiBiZmRfZ2V0XzY0IChhYmZkLCBhZGRyKTsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX3ZtYSBoYXMgdW5leHBlY3RlZCBzaXplIG9mICVsZCBieXRlc1xuIiksCi0JICAgICAgIHdob2FtaSwgKGxvbmcpIHNpemVvZiAoY2hhciopKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLX0KLQotCi0vKgotICogVGhpcyBwcm9iYWJseSBvdWdodCB0byBiZSBpbiBsaWJiZmQuCi0gKi8KLXZvaWQKLURFRlVOIChwdXRfdm1hLCAoYWJmZCwgdmFsLCBhZGRyKSwgYmZkICogYWJmZCBBTkQgYmZkX3ZtYSB2YWwgQU5EIGJmZF9ieXRlICogYWRkcikKLXsKLSAgc3dpdGNoIChzaXplb2YgKGNoYXIqKSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBhZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgYWRkcik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX3ZtYSBoYXMgdW5leHBlY3RlZCBzaXplIG9mICVsZCBieXRlc1xuIiksCi0JICAgICAgIHdob2FtaSwgKGxvbmcpIHNpemVvZiAoY2hhciopKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLX0KLQotCi12b2lkCi1ERUZVTiAoZ21vbl9vdXRfcmVhZCwgKGZpbGVuYW1lKSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIEZJTEUgKmlmcDsKLSAgc3RydWN0IGdtb25faGRyIGdoZHI7Ci0gIHVuc2lnbmVkIGNoYXIgdGFnOwotICBpbnQgbmhpc3QgPSAwLCBuYXJjcyA9IDAsIG5iYnMgPSAwOwotCi0gIC8qIG9wZW4gZ21vbi5vdXQgZmlsZTogKi8KLQotICBpZiAoc3RyY21wIChmaWxlbmFtZSwgIi0iKSA9PSAwKQotICAgIHsKLSAgICAgIGlmcCA9IHN0ZGluOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmcCA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUkIpOwotICAgICAgaWYgKCFpZnApCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgfQotICBpZiAoZnJlYWQgKCZnaGRyLCBzaXplb2YgKHN0cnVjdCBnbW9uX2hkciksIDEsIGlmcCkgIT0gMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIHRvbyBzaG9ydCB0byBiZSBhIGdtb24gZmlsZVxuIiksCi0JICAgICAgIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBpZiAoKGZpbGVfZm9ybWF0ID09IEZGX01BR0lDKSB8fAotICAgICAgKGZpbGVfZm9ybWF0ID09IEZGX0FVVE8gJiYgIXN0cm5jbXAgKCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCkpKQotICAgIHsKLSAgICAgIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9NQUdJQyAmJiBzdHJuY21wICgmZ2hkci5jb29raWVbMF0sIEdNT05fTUFHSUMsIDQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgYCVzJyBoYXMgYmFkIG1hZ2ljIGNvb2tpZVxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiByaWdodCBtYWdpYywgc28gaXQncyBwcm9iYWJseSByZWFsbHkgYSBuZXcgZ21vbi5vdXQgZmlsZSAqLwotCi0gICAgICBnbW9uX2ZpbGVfdmVyc2lvbiA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgZ2hkci52ZXJzaW9uKTsKLSAgICAgIGlmIChnbW9uX2ZpbGVfdmVyc2lvbiAhPSBHTU9OX1ZFUlNJT04gJiYgZ21vbl9maWxlX3ZlcnNpb24gIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgIF8oIiVzOiBmaWxlIGAlcycgaGFzIHVuc3VwcG9ydGVkIHZlcnNpb24gJWRcbiIpLAotCQkgICB3aG9hbWksIGZpbGVuYW1lLCBnbW9uX2ZpbGVfdmVyc2lvbik7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIHJlYWQgaW4gYWxsIHRoZSByZWNvcmRzOiAqLwotICAgICAgd2hpbGUgKGZyZWFkICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIGlmcCkgPT0gMSkKLQl7Ci0JICBzd2l0Y2ggKHRhZykKLQkgICAgewotCSAgICBjYXNlIEdNT05fVEFHX1RJTUVfSElTVDoKLQkgICAgICArK25oaXN0OwotCSAgICAgIGdtb25faW5wdXQgfD0gSU5QVVRfSElTVE9HUkFNOwotCSAgICAgIGhpc3RfcmVhZF9yZWMgKGlmcCwgZmlsZW5hbWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgR01PTl9UQUdfQ0dfQVJDOgotCSAgICAgICsrbmFyY3M7Ci0JICAgICAgZ21vbl9pbnB1dCB8PSBJTlBVVF9DQUxMX0dSQVBIOwotCSAgICAgIGNnX3JlYWRfcmVjIChpZnAsIGZpbGVuYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEdNT05fVEFHX0JCX0NPVU5UOgotCSAgICAgICsrbmJiczsKLQkgICAgICBnbW9uX2lucHV0IHw9IElOUFVUX0JCX0NPVU5UUzsKLQkgICAgICBiYl9yZWFkX3JlYyAoaWZwLCBmaWxlbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogJXM6IGZvdW5kIGJhZCB0YWcgJWQgKGZpbGUgY29ycnVwdGVkPylcbiIpLAotCQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSwgdGFnKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0FVVE8KLQkgICB8fCBmaWxlX2Zvcm1hdCA9PSBGRl9CU0QKLQkgICB8fCBmaWxlX2Zvcm1hdCA9PSBGRl9CU0Q0NCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaGRyCi0gICAgICB7Ci0JYmZkX3ZtYSBsb3dfcGM7Ci0JYmZkX3ZtYSBoaWdoX3BjOwotCWludCBuY250OwotICAgICAgfTsKLSAgICAgIGludCBpLCBzYW1wX2J5dGVzLCBoZWFkZXJfc2l6ZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci0gICAgICBiZmRfdm1hIGZyb21fcGMsIHNlbGZfcGM7Ci0gICAgICBzdHJ1Y3QgcmF3X2FyYyByYXdfYXJjOwotICAgICAgc3RydWN0IHJhd19waGRyIHJhdzsKLSAgICAgIHN0YXRpYyBzdHJ1Y3QgaGRyIGg7Ci0gICAgICBVTklUIHJhd19iaW5fY291bnQ7Ci0gICAgICBzdHJ1Y3QgaGRyIHRtcDsKLQotICAgICAgLyoKLSAgICAgICAqIEluZm9ybWF0aW9uIGZyb20gYSBnbW9uLm91dCBmaWxlIGlzIGluIHR3byBwYXJ0czogYW4gYXJyYXkgb2YKLSAgICAgICAqIHNhbXBsaW5nIGhpdHMgd2l0aGluIHBjIHJhbmdlcywgYW5kIHRoZSBhcmNzLgotICAgICAgICovCi0gICAgICBnbW9uX2lucHV0ID0gSU5QVVRfSElTVE9HUkFNIHwgSU5QVVRfQ0FMTF9HUkFQSDsKLQotICAgICAgLyoKLSAgICAgICAqIFRoaXMgZnNlZWsoKSBvdWdodCB0byB3b3JrIGV2ZW4gb24gc3RkaW4gYXMgbG9uZyBhcyBpdCdzCi0gICAgICAgKiBub3QgYW4gaW50ZXJhY3RpdmUgZGV2aWNlIChoZWNrLCBpcyB0aGVyZSBhbnlib2R5IHdobyB3b3VsZAotICAgICAgICogd2FudCB0byB0eXBlIGluIGEgZ21vbi5vdXQgYXQgdGhlIHRlcm1pbmFsPykuCi0gICAgICAgKi8KLSAgICAgIGlmIChmc2VlayAoaWZwLCAwLCBTRUVLX1NFVCkgPCAwKQotCXsKLQkgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgaWYgKGZyZWFkICgmcmF3LCAxLCBzaXplb2YgKHN0cnVjdCByYXdfcGhkciksIGlmcCkKLQkgICE9IHNpemVvZiAoc3RydWN0IHJhd19waGRyKSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIHRvbyBzaG9ydCB0byBiZSBhIGdtb24gZmlsZVxuIiksCi0JCSAgIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICAgIHRtcC5sb3dfcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcubG93X3BjWzBdKTsKLSAgICAgIHRtcC5oaWdoX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3LmhpZ2hfcGNbMF0pOwotICAgICAgdG1wLm5jbnQgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcubmNudFswXSk7Ci0KLSAgICAgIGlmIChiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcudmVyc2lvblswXSkKLQkgID09IEdNT05WRVJTSU9OKQotCXsKLQkgIGludCBwcm9mcmF0ZTsKLQotCSAgLyogNC40QlNEIGZvcm1hdCBoZWFkZXIuICAqLwotCi0JICBwcm9mcmF0ZSA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5wcm9mcmF0ZVswXSk7Ci0JICBpZiAoIXNfaGlnaHBjKQotCSAgICBoeiA9IHByb2ZyYXRlOwotCSAgZWxzZSBpZiAoaHogIT0gcHJvZnJhdGUpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogcHJvZmlsaW5nIHJhdGUgaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iKSwKLQkJICAgICAgIGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCi0JICBoZWFkZXJfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJhd19waGRyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogb2xkIHN0eWxlIEJTRCBmb3JtYXQuICAqLwotCSAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSBgJXMnIGhhcyBiYWQgbWFnaWMgY29va2llXG4iKSwKLQkJICAgICAgIHdob2FtaSwgZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0KLQkgIGlmIChmc2VlayAoaWZwLCBzaXplb2YgKHN0cnVjdCBvbGRfcmF3X3BoZHIpLCBTRUVLX1NFVCkgPCAwKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQotCSAgaGVhZGVyX3NpemUgPSBzaXplb2YgKHN0cnVjdCBvbGRfcmF3X3BoZHIpOwotCX0KLQotICAgICAgaWYgKHNfaGlnaHBjICYmICh0bXAubG93X3BjICE9IGgubG93X3BjIHx8Ci0JCSAgICAgICB0bXAuaGlnaF9wYyAhPSBoLmhpZ2hfcGMgfHwgdG1wLm5jbnQgIT0gaC5uY250KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIpLAotCQkgICBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgICBoID0gdG1wOwotICAgICAgc19sb3dwYyA9IChiZmRfdm1hKSBoLmxvd19wYzsKLSAgICAgIHNfaGlnaHBjID0gKGJmZF92bWEpIGguaGlnaF9wYzsKLSAgICAgIGxvd3BjID0gKGJmZF92bWEpIGgubG93X3BjIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIGhpZ2hwYyA9IChiZmRfdm1hKSBoLmhpZ2hfcGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgc2FtcF9ieXRlcyA9IGgubmNudCAtIGhlYWRlcl9zaXplOwotICAgICAgaGlzdF9udW1fYmlucyA9IHNhbXBfYnl0ZXMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgREJHIChTQU1QTEVERUJVRywKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gbG93cGMgMHglbHggaGlnaHBjIDB4JWx4IG5jbnQgJWRcbiIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSBoLmxvd19wYywgKHVuc2lnbmVkIGxvbmcpIGguaGlnaF9wYywKLQkJICAgaC5uY250KTsKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICBzX2xvd3BjIDB4JWx4ICAgc19oaWdocGMgMHglbHhcbiIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSBzX2xvd3BjLCAodW5zaWduZWQgbG9uZykgc19oaWdocGMpOwotCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSAgICAgbG93cGMgMHglbHggICAgIGhpZ2hwYyAweCVseFxuIiwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIGxvd3BjLCAodW5zaWduZWQgbG9uZykgaGlnaHBjKTsKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gc2FtcF9ieXRlcyAlZCBoaXN0X251bV9iaW5zICVkXG4iLAotCQkgICBzYW1wX2J5dGVzLCBoaXN0X251bV9iaW5zKSk7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgc2Vuc2libGUgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChzYW1wX2J5dGVzIDwgMCB8fCBsb3dwYyA+IGhpZ2hwYykKLSAgICAgICAgewotICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgCi0JICAgIF8oIiVzOiBmaWxlICclcycgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGluIGdtb24ub3V0IGZvcm1hdFxuIiksCi0JICAgIHdob2FtaSwgZmlsZW5hbWUpOwotICAgICAgICAgIGRvbmUgKDEpOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChoaXN0X251bV9iaW5zKQotCXsKLQkgICsrbmhpc3Q7Ci0JfQotCi0gICAgICBpZiAoIWhpc3Rfc2FtcGxlKQotCXsKLQkgIGhpc3Rfc2FtcGxlID0KLQkgICAgKGludCAqKSB4bWFsbG9jIChoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOwotCSAgbWVtc2V0IChoaXN0X3NhbXBsZSwgMCwgaGlzdF9udW1fYmlucyAqIHNpemVvZiAoaGlzdF9zYW1wbGVbMF0pKTsKLQl9Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0JewotCSAgaWYgKGZyZWFkIChyYXdfYmluX2NvdW50LCBzaXplb2YgKHJhd19iaW5fY291bnQpLCAxLCBpZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZC8lZCBiaW5zXG4iKSwKLQkJICAgICAgIHdob2FtaSwgLS1pLCBoaXN0X251bV9iaW5zKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCSAgaGlzdF9zYW1wbGVbaV0gKz0gYmZkX2dldF8xNiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYmluX2NvdW50KTsKLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBUaGUgcmVzdCBvZiB0aGUgZmlsZSBjb25zaXN0cyBvZiBhIGJ1bmNoIG9mIDxmcm9tLHNlbGYsY291bnQ+Ci0gICAgICAgKiB0dXBsZXM6Ci0gICAgICAgKi8KLSAgICAgIHdoaWxlIChmcmVhZCAoJnJhd19hcmMsIHNpemVvZiAocmF3X2FyYyksIDEsIGlmcCkgPT0gMSkKLQl7Ci0JICArK25hcmNzOwotCSAgZnJvbV9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5mcm9tX3BjKTsKLQkgIHNlbGZfcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19hcmMuc2VsZl9wYyk7Ci0JICBjb3VudCA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5jb3VudCk7Ci0JICBEQkcgKFNBTVBMRURFQlVHLAotCSAgICAgcHJpbnRmICgiW2dtb25fb3V0X3JlYWRdIGZyb21wYyAweCVseCBzZWxmcGMgMHglbHggY291bnQgJWx1XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSBmcm9tX3BjLCAodW5zaWduZWQgbG9uZykgc2VsZl9wYywgY291bnQpKTsKLQkgIC8qIGFkZCB0aGlzIGFyYzogKi8KLQkgIGNnX3RhbGx5IChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCk7Ci0JfQotICAgICAgZmNsb3NlIChpZnApOwotCi0gICAgICBpZiAoaHogPT0gSFpfV1JPTkcpCi0JewotCSAgLyoKLQkgICAqIEhvdyBtYW55IHRpY2tzIHBlciBzZWNvbmQ/ICBJZiB3ZSBjYW4ndCB0ZWxsLCByZXBvcnQKLQkgICAqIHRpbWUgaW4gdGlja3MuCi0JICAgKi8KLQkgIGh6ID0gaGVydHogKCk7Ci0JICBpZiAoaHogPT0gSFpfV1JPTkcpCi0JICAgIHsKLQkgICAgICBoeiA9IDE7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ0aW1lIGlzIGluIHRpY2tzLCBub3Qgc2Vjb25kc1xuIikpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBmaWxlIGZvcm1hdCAlZFxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZV9mb3JtYXQpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9HTU9OX0lORk8pCi0gICAgewotICAgICAgcHJpbnRmIChfKCJGaWxlIGAlcycgKHZlcnNpb24gJWQpIGNvbnRhaW5zOlxuIiksCi0JICAgICAgZmlsZW5hbWUsIGdtb25fZmlsZV92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiXHQlZCBoaXN0b2dyYW0gcmVjb3JkJXNcbiIpLAotCSAgICAgIG5oaXN0LCBuaGlzdCA9PSAxID8gIiIgOiAicyIpOwotICAgICAgcHJpbnRmIChfKCJcdCVkIGNhbGwtZ3JhcGggcmVjb3JkJXNcbiIpLAotCSAgICAgIG5hcmNzLCBuYXJjcyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgcHJpbnRmIChfKCJcdCVkIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZCVzXG4iKSwKLQkgICAgICBuYmJzLCBuYmJzID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci19Ci0KLQotdm9pZAotREVGVU4gKGdtb25fb3V0X3dyaXRlLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgRklMRSAqb2ZwOwotICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLQotICBvZnAgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dCKTsKLSAgaWYgKCFvZnApCi0gICAgewotICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0FVVE8gfHwgZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMpCi0gICAgewotICAgICAgLyogd3JpdGUgZ21vbiBoZWFkZXI6ICovCi0KLSAgICAgIG1lbWNweSAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBHTU9OX1ZFUlNJT04sIChiZmRfYnl0ZSAqKSBnaGRyLnZlcnNpb24pOwotICAgICAgaWYgKGZ3cml0ZSAoJmdoZHIsIHNpemVvZiAoZ2hkciksIDEsIG9mcCkgIT0gMSkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogd3JpdGUgZXhlY3V0aW9uIHRpbWUgaGlzdG9ncmFtIGlmIHdlIGhhdmUgb25lOiAqLwotICAgICAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9ISVNUT0dSQU0pCi0JewotCSAgaGlzdF93cml0ZV9oaXN0IChvZnAsIGZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIGNhbGwgZ3JhcGggYXJjcyBpZiB3ZSBoYXZlIGFueTogKi8KLSAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQ0FMTF9HUkFQSCkKLQl7Ci0JICBjZ193cml0ZV9hcmNzIChvZnAsIGZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIGJhc2ljLWJsb2NrIGluZm8gaWYgd2UgaGF2ZSBpdDogKi8KLSAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQkJfQ09VTlRTKQotCXsKLQkgIGJiX3dyaXRlX2Jsb2NrcyAob2ZwLCBmaWxlbmFtZSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNEIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQotICAgIHsKLSAgICAgIHN0cnVjdCByYXdfYXJjIHJhd19hcmM7Ci0gICAgICBVTklUIHJhd19iaW5fY291bnQ7Ci0gICAgICBzdHJ1Y3QgcmF3X3BoZHIgaDsKLSAgICAgIGludCBpOwotICAgICAgQXJjICphcmM7Ci0gICAgICBTeW0gKnN5bTsKLQotICAgICAgbWVtc2V0ICgmaCwgMCwgc2l6ZW9mIGgpOwotICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfbG93cGMsIChiZmRfYnl0ZSAqKSAmaC5sb3dfcGMpOwotICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfaGlnaHBjLCAoYmZkX2J5dGUgKikgJmguaGlnaF9wYyk7Ci0gICAgICBiZmRfcHV0XzMyIChjb3JlX2JmZCwKLQkJICBoaXN0X251bV9iaW5zICogc2l6ZW9mIChVTklUKSArIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwKLQkJICAoYmZkX2J5dGUgKikgJmgubmNudCk7Ci0KLSAgICAgIC8qIFdyaXRlIGhlYWRlci4gIFVzZSBuZXcgc3R5bGUgQlNEIGZvcm1hdCBpcyBleHBsaWNpdGx5Ci0gICAgICAgICBzcGVjaWZpZWQsIG9yIGlmIHRoZSBwcm9maWxpbmcgcmF0ZSBpcyBub24tc3RhbmRhcmQ7Ci0gICAgICAgICBvdGhlcndpc2UsIHVzZSB0aGUgb2xkIEJTRCBmb3JtYXQuICAqLwotICAgICAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0Ci0JICB8fCBoeiAhPSBoZXJ0eiAoKSkKLQl7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgR01PTlZFUlNJT04sIChiZmRfYnl0ZSAqKSAmaC52ZXJzaW9uKTsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoeiwgKGJmZF9ieXRlICopICZoLnByb2ZyYXRlKTsKLQkgIGlmIChmd3JpdGUgKCZoLCBzaXplb2YgKHN0cnVjdCByYXdfcGhkciksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmd3JpdGUgKCZoLCBzaXplb2YgKHN0cnVjdCBvbGRfcmF3X3BoZHIpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogZHVtcCB0aGUgc2FtcGxlczogKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLQl7Ci0JICBiZmRfcHV0XzE2IChjb3JlX2JmZCwgaGlzdF9zYW1wbGVbaV0sIChiZmRfYnl0ZSAqKSAmIHJhd19iaW5fY291bnRbMF0pOwotCSAgaWYgKGZ3cml0ZSAoJnJhd19iaW5fY291bnRbMF0sIHNpemVvZiAocmF3X2Jpbl9jb3VudCksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBkdW1wIHRoZSBub3JtYWxpemVkIHJhdyBhcmMgaW5mb3JtYXRpb246ICovCi0KLSAgICAgIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0JewotCSAgZm9yIChhcmMgPSBzeW0tPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLQkgICAgewotCSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPnBhcmVudC0+YWRkciwKLQkJICAgICAgIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOwotCSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPmNoaWxkLT5hZGRyLAotCQkgICAgICAgKGJmZF9ieXRlICopIHJhd19hcmMuc2VsZl9wYyk7Ci0JICAgICAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGFyYy0+Y291bnQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKLQkgICAgICBpZiAoZndyaXRlICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgb2ZwKSAhPSAxKQotCQl7Ci0JCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JCSAgZG9uZSAoMSk7Ci0JCX0KLQkgICAgICBEQkcgKFNBTVBMRURFQlVHLAotCQkgICBwcmludGYgKCJbZHVtcHN1bV0gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JCQkgICAodW5zaWduZWQgbG9uZykgYXJjLT5wYXJlbnQtPmFkZHIsCi0JCQkgICAodW5zaWduZWQgbG9uZykgYXJjLT5jaGlsZC0+YWRkciwgYXJjLT5jb3VudCkpOwotCSAgICB9Ci0JfQotICAgICAgZmNsb3NlIChvZnApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBmaWxlIGZvcm1hdCAlZFxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZV9mb3JtYXQpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9pby5oIGIvZ3Byb2YvZ21vbl9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjI1N2E0Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb25faW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgZ21vbl9pb19oCi0jZGVmaW5lIGdtb25faW9faAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ21vbi5oIgotCi0jZGVmaW5lIElOUFVUX0hJU1RPR1JBTQkJKDE8PDApCi0jZGVmaW5lIElOUFVUX0NBTExfR1JBUEgJKDE8PDEpCi0jZGVmaW5lIElOUFVUX0JCX0NPVU5UUwkJKDE8PDIpCi0KLWV4dGVybiBpbnQgZ21vbl9pbnB1dDsJCS8qIHdoYXQgaW5wdXQgZGlkIHdlIHNlZT8gKi8KLWV4dGVybiBpbnQgZ21vbl9maWxlX3ZlcnNpb247CS8qIGZpbGUgdmVyc2lvbiBhcmUgd2UgZGVhbGluZyB3aXRoICovCi0KLWV4dGVybiBiZmRfdm1hIGdldF92bWEgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX2J5dGUgKiBhZGRyKSk7Ci1leHRlcm4gdm9pZCBwdXRfdm1hIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGJmZF92bWEgdmFsLCBiZmRfYnl0ZSAqIGFkZHIpKTsKLQotZXh0ZXJuIHZvaWQgZ21vbl9vdXRfcmVhZCBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgZ21vbl9vdXRfd3JpdGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotI2VuZGlmIC8qIGdtb25faW9faCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9vdXQuaCBiL2dwcm9mL2dtb25fb3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDRmYjUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbl9vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgZ21vbi5vdXQgZmlsZXMuICBJdCBzaG91bGQgaGF2ZQotICogYXMgZmV3IGV4dGVybmFsIGRlcGVuZGVuY2llcyBhcyBwb3NzaWJsZSBhcyBpdCBpcyBnb2luZyB0byBiZQotICogaW5jbHVkZWQgaW4gbWFueSBkaWZmZXJlbnQgcHJvZ3JhbXMuICBUaGF0IGlzLCBtaW5pbWl6ZSB0aGUKLSAqIG51bWJlciBvZiAjaW5jbHVkZSdzLgotICoKLSAqIEEgZ21vbi5vdXQgZmlsZSBjb25zaXN0cyBvZiBhIGhlYWRlciAoZGVmaW5lZCBieSBnbW9uX2hkcikgZm9sbG93ZWQKLSAqIGJ5IGEgc2VxdWVuY2Ugb2YgcmVjb3Jkcy4gIEVhY2ggcmVjb3JkIHN0YXJ0cyB3aXRoIGEgb25lLWJ5dGUgdGFnCi0gKiBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiByZWNvcmRzLCBmb2xsb3dlZCBieSByZWNvcmRzIHNwZWNpZmljIGRhdGEuCi0gKi8KLSNpZm5kZWYgZ21vbl9vdXRfaAotI2RlZmluZSBnbW9uX291dF9oCi0KLSNkZWZpbmUJR01PTl9NQUdJQwkiZ21vbiIJLyogbWFnaWMgY29va2llICovCi0jZGVmaW5lIEdNT05fVkVSU0lPTgkxCS8qIHZlcnNpb24gbnVtYmVyICovCi0KLS8qCi0gKiBSYXcgaGVhZGVyIGFzIGl0IGFwcGVhcnMgb24gZmlsZSAod2l0aG91dCBwYWRkaW5nKToKLSAqLwotc3RydWN0IGdtb25faGRyCi0gIHsKLSAgICBjaGFyIGNvb2tpZVs0XTsKLSAgICBjaGFyIHZlcnNpb25bNF07Ci0gICAgY2hhciBzcGFyZVszICogNF07Ci0gIH07Ci0KLS8qIHR5cGVzIG9mIHJlY29yZHMgaW4gdGhpcyBmaWxlOiAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBHTU9OX1RBR19USU1FX0hJU1QgPSAwLCBHTU9OX1RBR19DR19BUkMgPSAxLCBHTU9OX1RBR19CQl9DT1VOVCA9IDIKLSAgfQotR01PTl9SZWNvcmRfVGFnOwotCi1zdHJ1Y3QgZ21vbl9oaXN0X2hkcgotICB7Ci0gICAgY2hhciBsb3dfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1tzaXplb2YgKGNoYXIqKV07CS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0gICAgY2hhciBoaXN0X3NpemVbNF07CQkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBwcm9mX3JhdGVbNF07CQkJLyogcHJvZmlsaW5nIGNsb2NrIHJhdGUgKi8KLSAgICBjaGFyIGRpbWVuWzE1XTsJCQkvKiBwaHlzLiBkaW0uLCB1c3VhbGx5ICJzZWNvbmRzIiAqLwotICAgIGNoYXIgZGltZW5fYWJicmV2OwkJCS8qIHVzdWFsbHkgJ3MnIGZvciAic2Vjb25kcyIgKi8KLSAgfTsKLQotc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZAotICB7Ci0gICAgY2hhciBmcm9tX3BjW3NpemVvZiAoY2hhciopXTsJLyogYWRkcmVzcyB3aXRoaW4gY2FsbGVyJ3MgYm9keSAqLwotICAgIGNoYXIgc2VsZl9wY1tzaXplb2YgKGNoYXIqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlZSdzIGJvZHkgKi8KLSAgICBjaGFyIGNvdW50WzRdOwkJCS8qIG51bWJlciBvZiBhcmMgdHJhdmVyc2FscyAqLwotICB9OwotCi0jZW5kaWYgLyogZ21vbl9vdXRfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuMSBiL2dwcm9mL2dwcm9mLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzM0ZGEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuMQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0uXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotLlwiIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLS5cIiBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkgdGhlIGZvbGxvd2luZwotLlwiIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLS5cIiBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycgaW4gdGhlCi0uXCIgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFuZCBpbgotLlwiIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLS5cIiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKLS5cIiBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLS5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0uXCIKLS5cIiAgICAgQCgjKWdwcm9mLjEJNi42IChCZXJrZWxleSkgNy8yNC85MAotLlwiCi0uVEggR1BST0YgMSAiSmFudWFyeSAyOSwgMTk5MyIKLS5TSCBOQU1FCi1ncHJvZiBcLSBkaXNwbGF5IGNhbGwgZ3JhcGggcHJvZmlsZSBkYXRhCi0uU0ggU1lOT1BTSVMKLS5CIGdwcm9mIFsgXC1hYmNzeiBdIFsgXC1lfFwtRQotLkkgbmFtZQotLkIgXSBbIFwtZnxcLUYgCi0uSSBuYW1lCi0uQiBdIAotLkIgWyBcLWsKLS5JIGZyb21uYW1lIHRvbmFtZQotLkIgXSBbIAotLkkgb2JqZmlsZQotLkIgWyAKLS5JIGdtb24ub3V0Ci0uQiBdIAotLkIgXSAKLS5TSCBERVNDUklQVElPTgotLkIgZ3Byb2YKLXByb2R1Y2VzIGFuIGV4ZWN1dGlvbiBwcm9maWxlIG9mIEMsIFBhc2NhbCwgb3IgRm9ydHJhbjc3IHByb2dyYW1zLgotVGhlIGVmZmVjdCBvZiBjYWxsZWQgcm91dGluZXMgaXMgaW5jb3Jwb3JhdGVkIGluIHRoZSBwcm9maWxlIG9mIGVhY2ggY2FsbGVyLgotVGhlIHByb2ZpbGUgZGF0YSBpcyB0YWtlbiBmcm9tIHRoZSBjYWxsIGdyYXBoIHByb2ZpbGUgZmlsZQotXCYoYGdtb24ub3V0JyBkZWZhdWx0KSB3aGljaCBpcyBjcmVhdGVkIGJ5IHByb2dyYW1zCi10aGF0IGFyZSBjb21waWxlZCB3aXRoIHRoZQotLkIgXC1wZwotb3B0aW9uIG9mCi0uQlIgY2MgKCAxICkgLAotLkJSIHBjICggMSApICwKLWFuZAotLkJSIGY3NyAoIDEgKSAuCi1UaGUKLS5CIFwtcGcKLW9wdGlvbiBhbHNvIGxpbmtzIGluIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IHJvdXRpbmVzCi10aGF0IGFyZSBjb21waWxlZCBmb3IgcHJvZmlsaW5nLgotLkIgR3Byb2YKLXJlYWRzIHRoZSBnaXZlbiBvYmplY3QgZmlsZSAodGhlIGRlZmF1bHQgaXMgYGEub3V0JykKLWFuZCBlc3RhYmxpc2hlcyB0aGUgcmVsYXRpb24gYmV0d2VlbiBpdHMgc3ltYm9sIHRhYmxlCi1hbmQgdGhlIGNhbGwgZ3JhcGggcHJvZmlsZSBmcm9tIGBnbW9uLm91dCcuCi1JZiBtb3JlIHRoYW4gb25lIHByb2ZpbGUgZmlsZSBpcyBzcGVjaWZpZWQsCi10aGUKLS5CIGdwcm9mCi1vdXRwdXQgc2hvd3MgdGhlIHN1bSBvZiB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gcHJvZmlsZSBmaWxlcy4KLS5QUAotLkIgR3Byb2YKLWNhbGN1bGF0ZXMgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGVhY2ggcm91dGluZS4KLU5leHQsIHRoZXNlIHRpbWVzIGFyZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBlZGdlcyBvZiB0aGUgY2FsbCBncmFwaC4KLUN5Y2xlcyBhcmUgZGlzY292ZXJlZCwgYW5kIGNhbGxzIGludG8gYSBjeWNsZSBhcmUgbWFkZSB0byBzaGFyZSB0aGUgdGltZQotb2YgdGhlIGN5Y2xlLgotVGhlIGZpcnN0IGxpc3Rpbmcgc2hvd3MgdGhlIGZ1bmN0aW9ucwotc29ydGVkIGFjY29yZGluZyB0byB0aGUgdGltZSB0aGV5IHJlcHJlc2VudAotaW5jbHVkaW5nIHRoZSB0aW1lIG9mIHRoZWlyIGNhbGwgZ3JhcGggZGVzY2VuZGFudHMuCi1CZWxvdyBlYWNoIGZ1bmN0aW9uIGVudHJ5IGlzIHNob3duIGl0cyAoZGlyZWN0KSBjYWxsIGdyYXBoIGNoaWxkcmVuLAotYW5kIGhvdyB0aGVpciB0aW1lcyBhcmUgcHJvcGFnYXRlZCB0byB0aGlzIGZ1bmN0aW9uLgotQSBzaW1pbGFyIGRpc3BsYXkgYWJvdmUgdGhlIGZ1bmN0aW9uIHNob3dzIGhvdyB0aGlzIGZ1bmN0aW9uJ3MgdGltZSBhbmQgdGhlCi10aW1lIG9mIGl0cyBkZXNjZW5kYW50cyBpcyBwcm9wYWdhdGVkIHRvIGl0cyAoZGlyZWN0KSBjYWxsIGdyYXBoIHBhcmVudHMuCi0uUFAKLUN5Y2xlcyBhcmUgYWxzbyBzaG93biwgd2l0aCBhbiBlbnRyeSBmb3IgdGhlIGN5Y2xlIGFzIGEgd2hvbGUgYW5kCi1hIGxpc3Rpbmcgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIGN5Y2xlIGFuZCB0aGVpciBjb250cmlidXRpb25zIHRvIHRoZQotdGltZSBhbmQgY2FsbCBjb3VudHMgb2YgdGhlIGN5Y2xlLgotLlBQCi1TZWNvbmQsIGEgZmxhdCBwcm9maWxlIGlzIGdpdmVuLAotc2ltaWxhciB0byB0aGF0IHByb3ZpZGVkIGJ5Ci0uQlIgcHJvZiAoIDEgKSAgLgotVGhpcyBsaXN0aW5nIGdpdmVzIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZXMsIHRoZSBjYWxsIGNvdW50cywKLXRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGUgY2FsbCBzcGVudCBpbiB0aGUgcm91dGluZSBpdHNlbGYsIGFuZAotdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoZSBjYWxsIHNwZW50IGluIHRoZSByb3V0aW5lIGl0c2VsZiBpbmNsdWRpbmcKLWl0cyBkZXNjZW5kYW50cy4KLS5QUAotRmluYWxseSwgYW4gaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGlzIHByb3ZpZGVkLgotLlNIIE9QVElPTlMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgotLlRQCi0uQiBcLWEKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHN0YXRpY2FsbHkgZGVjbGFyZWQgZnVuY3Rpb25zLgotSWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4sIGFsbCByZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGljIGZ1bmN0aW9uCi0oZS5nLiwgdGltZSBzYW1wbGVzLCBjYWxscyB0byBvdGhlciBmdW5jdGlvbnMsIGNhbGxzIGZyb20gb3RoZXIgZnVuY3Rpb25zKQotYmVsb25ncyB0byB0aGUgZnVuY3Rpb24gbG9hZGVkIGp1c3QgYmVmb3JlIHRoZSBzdGF0aWMgZnVuY3Rpb24gaW4gdGhlCi1cJmBvYmpmaWxlJyBmaWxlLgotLlRQCi0uQiBcLWIKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIGEgZGVzY3JpcHRpb24gb2YgZWFjaCBmaWVsZCBpbiB0aGUgcHJvZmlsZS4KLS5UUAotLkIgXC1jCi10aGUgc3RhdGljIGNhbGwgZ3JhcGggb2YgdGhlIHByb2dyYW0gaXMgZGlzY292ZXJlZCBieSBhIGhldXJpc3RpYwotdGhhdCBleGFtaW5lcyB0aGUgdGV4dCBzcGFjZSBvZiB0aGUgb2JqZWN0IGZpbGUuCi1TdGF0aWMtb25seSBwYXJlbnRzIG9yIGNoaWxkcmVuIGFyZSBzaG93bgotd2l0aCBjYWxsIGNvdW50cyBvZiAwLgotLlRQCi0uQkkgIlwtZSAiIG5hbWUKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IGZvciByb3V0aW5lCi0uSSBuYW1lCi1hbmQgYWxsIGl0cyBkZXNjZW5kYW50cwotKHVubGVzcyB0aGV5IGhhdmUgb3RoZXIgYW5jZXN0b3JzIHRoYXQgYXJlbid0IHN1cHByZXNzZWQpLgotTW9yZSB0aGFuIG9uZQotLkIgXC1lCi1vcHRpb24gbWF5IGJlIGdpdmVuLgotT25seSBvbmUKLS5JIG5hbWUKLW1heSBiZSBnaXZlbiB3aXRoIGVhY2gKLS5CIFwtZQotb3B0aW9uLgotLlRQCi0uQkkgIlwtRSAiIG5hbWUKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IGZvciByb3V0aW5lCi0uSSBuYW1lCi0oYW5kIGl0cyBkZXNjZW5kYW50cykgYXMKLS5CIFwtZSAgLAotYWJvdmUsIGFuZCBhbHNvIGV4Y2x1ZGVzIHRoZSB0aW1lIHNwZW50IGluCi0uSSBuYW1lCi0oYW5kIGl0cyBkZXNjZW5kYW50cykgZnJvbSB0aGUgdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0oRm9yIGV4YW1wbGUsCi0uQkkgIlwtRSAiIG1jb3VudAotLkJJICJcLUUgIiBtY2xlYW51cAotaXMgdGhlIGRlZmF1bHQuKQotLlRQCi0uQkkgIlwtZiAiIG5hbWUKLXByaW50cyB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBvZiBvbmx5IHRoZSBzcGVjaWZpZWQgcm91dGluZQotLkkgbmFtZQotYW5kIGl0cyBkZXNjZW5kYW50cy4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtZgotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lCi0uSSBuYW1lCi1tYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLWYKLW9wdGlvbi4KLS5UUAotLkJJICJcLUYgIiBuYW1lCi1wcmludHMgdGhlIGdyYXBoIHByb2ZpbGUgZW50cnkgb2Ygb25seSB0aGUgcm91dGluZQotLkkgbmFtZQotYW5kIGl0cyBkZXNjZW5kYW50cyAoYXMKLS5CIFwtZiAsCi1hYm92ZSkgYW5kIGFsc28gdXNlcyBvbmx5IHRoZSB0aW1lcyBvZiB0aGUgcHJpbnRlZCByb3V0aW5lcwotaW4gdG90YWwgdGltZSBhbmQgcGVyY2VudGFnZSBjb21wdXRhdGlvbnMuCi1Nb3JlIHRoYW4gb25lCi0uQiBcLUYKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4uCi1Pbmx5IG9uZQotLkkgbmFtZQotbWF5IGJlIGdpdmVuIHdpdGggZWFjaAotLkIgXC1GCi1vcHRpb24uCi1UaGUKLS5CIFwtRgotb3B0aW9uCi1vdmVycmlkZXMKLXRoZQotLkIgXC1FCi1vcHRpb24uCi0uVFAKLS5CSSAiXC1rICIgImZyb21uYW1lIHRvbmFtZSIKLXdpbGwgZGVsZXRlIGFueSBhcmNzIGZyb20gcm91dGluZQotLkkgZnJvbW5hbWUKLXRvIHJvdXRpbmUKLS5JUiB0b25hbWUgIC4KLVRoaXMgY2FuIGJlIHVzZWQgdG8gYnJlYWsgdW5kZXNpcmVkIGN5Y2xlcy4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtawotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lIHBhaXIgb2Ygcm91dGluZSBuYW1lcyBtYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLWsKLW9wdGlvbi4KLS5UUAotLkIgXC1zCi1hIHByb2ZpbGUgZmlsZSBgZ21vbi5zdW0nIGlzIHByb2R1Y2VkIHRoYXQgcmVwcmVzZW50cwotdGhlIHN1bSBvZiB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBpbiBhbGwgdGhlIHNwZWNpZmllZCBwcm9maWxlIGZpbGVzLgotVGhpcyBzdW1tYXJ5IHByb2ZpbGUgZmlsZSBtYXkgYmUgZ2l2ZW4gdG8gbGF0ZXIKLWV4ZWN1dGlvbnMgb2YgZ3Byb2YgKHByb2JhYmx5IGFsc28gd2l0aCBhCi0uQlIgXC1zICApCi10byBhY2N1bXVsYXRlIHByb2ZpbGUgZGF0YSBhY3Jvc3Mgc2V2ZXJhbCBydW5zIG9mIGFuIGBvYmpmaWxlJyBmaWxlLgotLlRQCi0uQiAtdgotcHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgZ3Byb2YsIGFuZCB0aGVuIGV4aXRzLgotLlRQCi0uQiAtegotZGlzcGxheXMgcm91dGluZXMgdGhhdCBoYXZlIHplcm8gdXNhZ2UgKGFzIHNob3duIGJ5IGNhbGwgY291bnRzCi1hbmQgYWNjdW11bGF0ZWQgdGltZSkuCi1UaGlzIGlzIHVzZWZ1bCB3aXRoIHRoZQotLkIgXC1jCi1vcHRpb24gZm9yIGRpc2NvdmVyaW5nIHdoaWNoIHJvdXRpbmVzIHdlcmUgbmV2ZXIgY2FsbGVkLgotLlBQCi0uU0ggRklMRVMKLS50YSBcdydnbW9uLnN1bSAndQotYS5vdXQJdGhlIG5hbWVsaXN0IGFuZCB0ZXh0IHNwYWNlLgotLmJyCi1nbW9uLm91dAlkeW5hbWljIGNhbGwgZ3JhcGggYW5kIHByb2ZpbGUuCi0uYnIKLWdtb24uc3VtIHN1bW1hcml6ZWQgZHluYW1pYyBjYWxsIGdyYXBoIGFuZCBwcm9maWxlLgotLlNIIFNFRSBBTFNPCi0uQlIgbW9uaXRvciAoIDMgKSAsCi0uQlIgcHJvZmlsICggMiApICwKLS5CUiBjYyAoIDEgKSAsCi0uQlIgcHJvZiAoIDEgKQotLnNwCi1gYEFuIEV4ZWN1dGlvbiBQcm9maWxlciBmb3IgTW9kdWxhciBQcm9ncmFtcycnLAotYnkgUy4gR3JhaGFtLCBQLiBLZXNzbGVyLCBNLiBNY0t1c2ljazsKLS5JCi1Tb2Z0d2FyZSBcLSBQcmFjdGljZSBhbmQgRXhwZXJpZW5jZSwKLVZvbC4gMTMsIHBwLiA2NzEtNjg1LCAxOTgzLgotLnNwCi1gYGdwcm9mOiBBIENhbGwgR3JhcGggRXhlY3V0aW9uIFByb2ZpbGVyJycsCi1ieSBTLiBHcmFoYW0sIFAuIEtlc3NsZXIsIE0uIE1jS3VzaWNrOwotLkkKLVByb2NlZWRpbmdzIG9mIHRoZSBTSUdQTEFOICc4MiBTeW1wb3NpdW0gb24gQ29tcGlsZXIgQ29uc3RydWN0aW9uLAotU0lHUExBTiBOb3RpY2VzLCBWb2wuIDE3LCBObyAgNiwgcHAuIDEyMC0xMjYsIEp1bmUgMTk4Mi4KLS5TSCBISVNUT1JZCi0uQiBHcHJvZgotYXBwZWFyZWQgaW4gNC4yIEJTRC4KLS5TSCBCVUdTCi1UaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHNhbXBsaW5nIGlzIHNob3duLCBidXQgcmVtYWlucwotc3RhdGlzdGljYWwgYXQgYmVzdC4KLVdlIGFzc3VtZSB0aGF0IHRoZSB0aW1lIGZvciBlYWNoIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uCi1jYW4gYmUgZXhwcmVzc2VkIGJ5IHRoZSB0b3RhbCB0aW1lIGZvciB0aGUgZnVuY3Rpb24gZGl2aWRlZAotYnkgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgotVGh1cyB0aGUgdGltZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBjYWxsIGdyYXBoIGFyY3MgdG8gdGhlIGZ1bmN0aW9uJ3MKLXBhcmVudHMgaXMgZGlyZWN0bHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdAotYXJjIGlzIHRyYXZlcnNlZC4KLS5QUAotUGFyZW50cyB0aGF0IGFyZSBub3QgdGhlbXNlbHZlcyBwcm9maWxlZCB3aWxsIGhhdmUgdGhlIHRpbWUgb2YKLXRoZWlyIHByb2ZpbGVkIGNoaWxkcmVuIHByb3BhZ2F0ZWQgdG8gdGhlbSwgYnV0IHRoZXkgd2lsbCBhcHBlYXIKLXRvIGJlIHNwb250YW5lb3VzbHkgaW52b2tlZCBpbiB0aGUgY2FsbCBncmFwaCBsaXN0aW5nLCBhbmQgd2lsbAotbm90IGhhdmUgdGhlaXIgdGltZSBwcm9wYWdhdGVkIGZ1cnRoZXIuCi1TaW1pbGFybHksIHNpZ25hbCBjYXRjaGVycywgZXZlbiB0aG91Z2ggcHJvZmlsZWQsIHdpbGwgYXBwZWFyCi10byBiZSBzcG9udGFuZW91cyAoYWx0aG91Z2ggZm9yIG1vcmUgb2JzY3VyZSByZWFzb25zKS4KLUFueSBwcm9maWxlZCBjaGlsZHJlbiBvZiBzaWduYWwgY2F0Y2hlcnMgc2hvdWxkIGhhdmUgdGhlaXIgdGltZXMKLXByb3BhZ2F0ZWQgcHJvcGVybHksIHVubGVzcyB0aGUgc2lnbmFsIGNhdGNoZXIgd2FzIGludm9rZWQgZHVyaW5nCi10aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9maWxpbmcgcm91dGluZSwgaW4gd2hpY2ggY2FzZSBhbGwgaXMgbG9zdC4KLS5QUAotVGhlIHByb2ZpbGVkIHByb2dyYW0gbXVzdCBjYWxsCi0uQlIgZXhpdCAoIDIgKQotb3IgcmV0dXJuIG5vcm1hbGx5IGZvciB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIGJlIHNhdmVkCi1pbiB0aGUgYGdtb24ub3V0JyBmaWxlLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuYyBiL2dwcm9mL2dwcm9mLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTA0ODcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk4IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiYmFzaWNfYmxvY2tzLmgiCi0jaW5jbHVkZSAiY2FsbF9ncmFwaC5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19wcmludC5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImhlcnR6LmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotY29uc3QgY2hhciAqd2hvYW1pOwotY29uc3QgY2hhciAqZnVuY3Rpb25fbWFwcGluZ19maWxlOwotY29uc3QgY2hhciAqYV9vdXRfbmFtZSA9IEFfT1VUTkFNRTsKLWxvbmcgaHogPSBIWl9XUk9ORzsKLQotLyoKLSAqIERlZmF1bHQgb3B0aW9ucyB2YWx1ZXM6Ci0gKi8KLWludCBkZWJ1Z19sZXZlbCA9IDA7Ci1pbnQgb3V0cHV0X3N0eWxlID0gMDsKLWludCBvdXRwdXRfd2lkdGggPSA4MDsKLWJvb2wgYnNkX3N0eWxlX291dHB1dCA9IEZBTFNFOwotYm9vbCBkZW1hbmdsZSA9IFRSVUU7Ci1ib29sIGRpc2NhcmRfdW5kZXJzY29yZXMgPSBUUlVFOwotYm9vbCBpZ25vcmVfZGlyZWN0X2NhbGxzID0gRkFMU0U7Ci1ib29sIGlnbm9yZV9zdGF0aWNfZnVuY3MgPSBGQUxTRTsKLWJvb2wgaWdub3JlX3plcm9zID0gVFJVRTsKLWJvb2wgbGluZV9ncmFudWxhcml0eSA9IEZBTFNFOwotYm9vbCBwcmludF9kZXNjcmlwdGlvbnMgPSBUUlVFOwotYm9vbCBwcmludF9wYXRoID0gRkFMU0U7Ci1ib29sIGlnbm9yZV9ub25fZnVuY3Rpb25zID0gRkFMU0U7Ci1GaWxlX0Zvcm1hdCBmaWxlX2Zvcm1hdCA9IEZGX0FVVE87Ci0KLWJvb2wgZmlyc3Rfb3V0cHV0ID0gVFJVRTsKLQotY2hhciBjb3B5cmlnaHRbXSA9Ci0gTl8oIkAoIykgQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIik7Ci0KLXN0YXRpYyBjaGFyICpnbW9uX25hbWUgPSBHTU9OTkFNRTsJLyogcHJvZmlsZSBmaWxlbmFtZSAqLwotCi1iZmQgKmFiZmQ7Ci0KLS8qCi0gKiBGdW5jdGlvbnMgdGhhdCBnZXQgZXhjbHVkZWQgYnkgZGVmYXVsdDoKLSAqLwotc3RhdGljIGNoYXIgKmRlZmF1bHRfZXhjbHVkZWRfbGlzdFtdID0KLXsKLSAgIl9ncHJvZl9tY291bnQiLCAibWNvdW50IiwgIl9tY291bnQiLCAiX19tY291bnQiLCAiX19tY291bnRfaW50ZXJuYWwiLAotICAiX19tY2xlYW51cCIsCi0gICI8bG9jb3JlPiIsICI8aGljb3JlPiIsCi0gIDAKLX07Ci0KLS8qIENvZGVzIHVzZWQgZm9yIHRoZSBsb25nIG9wdGlvbnMgd2l0aCBubyBzaG9ydCBzeW5vbnltcy4gIDE1MCBpc24ndAotICAgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0RFTUFOR0xFCQkoMTUwKQotI2RlZmluZSBPUFRJT05fTk9fREVNQU5HTEUJKE9QVElPTl9ERU1BTkdMRSArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJsaW5lIiwgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsibm8tc3RhdGljIiwgbm9fYXJndW1lbnQsIDAsICdhJ30sCi0gIHsiaWdub3JlLW5vbi1mdW5jdGlvbnMiLCBub19hcmd1bWVudCwgMCwgJ0QnfSwKLQotICAgIC8qIG91dHB1dCBzdHlsZXM6ICovCi0KLSAgeyJhbm5vdGF0ZWQtc291cmNlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdBJ30sCi0gIHsibm8tYW5ub3RhdGVkLXNvdXJjZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnSid9LAotICB7ImZsYXQtcHJvZmlsZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAncCd9LAotICB7Im5vLWZsYXQtcHJvZmlsZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnUCd9LAotICB7ImdyYXBoIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdxJ30sCi0gIHsibm8tZ3JhcGgiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ1EnfSwKLSAgeyJleGVjLWNvdW50cyIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnQyd9LAotICB7Im5vLWV4ZWMtY291bnRzIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdaJ30sCi0gIHsiZnVuY3Rpb24tb3JkZXJpbmciLCBub19hcmd1bWVudCwgMCwgJ3InfSwKLSAgeyJmaWxlLW9yZGVyaW5nIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdSJ30sCi0gIHsiZmlsZS1pbmZvIiwgbm9fYXJndW1lbnQsIDAsICdpJ30sCi0gIHsic3VtIiwgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0KLSAgICAvKiB2YXJpb3VzIG9wdGlvbnMgdG8gYWZmZWN0IG91dHB1dDogKi8KLQotICB7ImFsbC1saW5lcyIsIG5vX2FyZ3VtZW50LCAwLCAneCd9LAotICB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ERU1BTkdMRX0sCi0gIHsibm8tZGVtYW5nbGUiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX05PX0RFTUFOR0xFfSwKLSAgeyJkaXJlY3RvcnktcGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7ImRpc3BsYXktdW51c2VkLWZ1bmN0aW9ucyIsIG5vX2FyZ3VtZW50LCAwLCAneid9LAotICB7Im1pbi1jb3VudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbSd9LAotICB7InByaW50LXBhdGgiLCBub19hcmd1bWVudCwgMCwgJ0wnfSwKLSAgeyJzZXBhcmF0ZS1maWxlcyIsIG5vX2FyZ3VtZW50LCAwLCAneSd9LAotICB7InN0YXRpYy1jYWxsLWdyYXBoIiwgbm9fYXJndW1lbnQsIDAsICdjJ30sCi0gIHsidGFibGUtbGVuZ3RoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCi0gIHsidGltZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbid9LAotICB7Im5vLXRpbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ04nfSwKLSAgeyJ3aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndyd9LAotICAgIC8qCi0gICAgICogVGhlc2UgYXJlIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBvbmx5LiAgVGhlaXIgZnVuY3Rpb25hbGl0eQotICAgICAqIGlzIHByb3ZpZGVkIGJ5IHRoZSBvdXRwdXQgc3R5bGUgb3B0aW9ucyBhbHJlYWR5OgotICAgICAqLwotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZSd9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRSd9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZid9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnayd9LAotCi0gICAgLyogbWlzY2VsbGFuZW91czogKi8KLQotICB7ImJyaWVmIiwgbm9fYXJndW1lbnQsIDAsICdiJ30sCi0gIHsiZGVidWciLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ2QnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsiZmlsZS1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJ0cmFkaXRpb25hbCIsIG5vX2FyZ3VtZW50LCAwLCAnVCd9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHVzYWdlLCAoc3RyZWFtLCBzdGF0dXMpLCBGSUxFICogc3RyZWFtIEFORCBpbnQgc3RhdHVzKQotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLVthYmNEaGlsTHNUdnd4eXpdXSBbLVtBQ2VFZkZKbk5PcFBxUVpdW25hbWVdXSBbLUkgZGlyc11cblwKLQlbLWRbbnVtXV0gWy1rIGZyb20vdG9dIFstbSBtaW4tY291bnRdIFstdCB0YWJsZS1sZW5ndGhdXG5cCi0JWy0tW25vLV1hbm5vdGF0ZWQtc291cmNlWz1uYW1lXV0gWy0tW25vLV1leGVjLWNvdW50c1s9bmFtZV1dXG5cCi0JWy0tW25vLV1mbGF0LXByb2ZpbGVbPW5hbWVdXSBbLS1bbm8tXWdyYXBoWz1uYW1lXV1cblwKLQlbLS1bbm8tXXRpbWU9bmFtZV0gWy0tYWxsLWxpbmVzXSBbLS1icmllZl0gWy0tZGVidWdbPWxldmVsXV1cblwKLQlbLS1mdW5jdGlvbi1vcmRlcmluZ10gWy0tZmlsZS1vcmRlcmluZ11cblwKLQlbLS1kaXJlY3RvcnktcGF0aD1kaXJzXSBbLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnNdXG5cCi0JWy0tZmlsZS1mb3JtYXQ9bmFtZV0gWy0tZmlsZS1pbmZvXSBbLS1oZWxwXSBbLS1saW5lXSBbLS1taW4tY291bnQ9bl1cblwKLQlbLS1uby1zdGF0aWNdIFstLXByaW50LXBhdGhdIFstLXNlcGFyYXRlLWZpbGVzXVxuXAotCVstLXN0YXRpYy1jYWxsLWdyYXBoXSBbLS1zdW1dIFstLXRhYmxlLWxlbmd0aD1sZW5dIFstLXRyYWRpdGlvbmFsXVxuXAotCVstLXZlcnNpb25dIFstLXdpZHRoPW5dIFstLWlnbm9yZS1ub24tZnVuY3Rpb25zXVxuXAotCVstLWRlbWFuZ2xlXSBbLS1uby1kZW1hbmdsZV1cblwKLQlbaW1hZ2UtZmlsZV0gW3Byb2ZpbGUtZmlsZS4uLl1cbiIpLAotCSAgIHdob2FtaSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBkb25lIChzdGF0dXMpOwotfQotCi0KLWludAotREVGVU4gKG1haW4sIChhcmdjLCBhcmd2KSwgaW50IGFyZ2MgQU5EIGNoYXIgKiphcmd2KQotewotICBjaGFyICoqc3AsICpzdHI7Ci0gIFN5bSAqKmNnID0gMDsKLSAgaW50IGNoLCB1c2VyX3NwZWNpZmllZCA9IDA7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICB3aG9hbWkgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHdob2FtaSk7Ci0KLSAgd2hpbGUgKChjaCA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LAotCSJhQTo6YkJjQ2REOjplOkU6ZjpGOmhpSTpKOjprOmxMbTpuOjpOOjpPOnA6OlA6OnE6OlE6OnN0OlR2dzp4eXpaOjoiLAotCQkJICAgIGxvbmdfb3B0aW9ucywgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlICdhJzoKLQkgIGlnbm9yZV9zdGF0aWNfZnVuY3MgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0FOTk8pOwotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIHByaW50X2Rlc2NyaXB0aW9ucyA9IEZBTFNFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQic6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIGlnbm9yZV9kaXJlY3RfY2FsbHMgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0VYRUMpOwotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9FWEVDX0NPVU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIGRlYnVnX2xldmVsIHw9IGF0b2kgKG9wdGFyZyk7Ci0JICAgICAgZGVidWdfbGV2ZWwgfD0gQU5ZREVCVUc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRlYnVnX2xldmVsID0gfjA7Ci0JICAgIH0KLQkgIERCRyAoQU5ZREVCVUcsIHByaW50ZiAoIlttYWluXSBkZWJ1Zy1sZXZlbD0weCV4XG4iLCBkZWJ1Z19sZXZlbCkpOwotI2lmbmRlZiBERUJVRwotCSAgcHJpbnRmIChfKCIlczogZGVidWdnaW5nIG5vdCBzdXBwb3J0ZWQ7IC1kIGlnbm9yZWRcbiIpLCB3aG9hbWkpOwotI2VuZGlmCS8qIERFQlVHICovCi0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGlnbm9yZV9ub25fZnVuY3Rpb25zID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0UnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX1RJTUUpOwotCWNhc2UgJ2UnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0dSQVBIKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX1RJTUUpOwotCWNhc2UgJ2YnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0dSQVBIKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0ZMQVQpOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfRkxBVCk7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCWNhc2UgJ2knOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0dNT05fSU5GTzsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0dNT05fSU5GTzsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCSAgc2VhcmNoX2xpc3RfYXBwZW5kICgmc3JjX3NlYXJjaF9saXN0LCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnSic6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0FOTk8pOwotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlICdrJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9BUkNTKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbGluZV9ncmFudWxhcml0eSA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLQkgIHByaW50X3BhdGggPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICBiYl9taW5fY2FsbHMgPSAodW5zaWduZWQgbG9uZykgc3RydG91bCAob3B0YXJnLCAoY2hhciAqKikgTlVMTCwgMTApOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfVElNRSk7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9USU1FKTsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCSAgc3dpdGNoIChvcHRhcmdbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9BVVRPOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdtJzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX01BR0lDOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdiJzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX0JTRDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnNCc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9CU0Q0NDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncCc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9QUk9GOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVua25vd24gZmlsZSBmb3JtYXQgJXNcbiIpLAotCQkgICAgICAgb3B0YXJnLCB3aG9hbWkpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfRkxBVCk7Ci0JICAgIH0KLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfRkxBVCk7Ci0JICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIGlmIChzdHJjaHIgKG9wdGFyZywgJy8nKSkKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9BUkNTKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9HUkFQSCk7Ci0JCX0KLQkgICAgfQotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRlVOQ1RJT05fT1JERVI7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GVU5DVElPTl9PUkRFUjsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZJTEVfT1JERVI7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GSUxFX09SREVSOwotCSAgZnVuY3Rpb25fbWFwcGluZ19maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnUSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNociAob3B0YXJnLCAnLycpKQotCQl7Ci0JCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0FSQ1MpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0dSQVBIKTsKLQkJfQotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0NBTExfR1JBUEg7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9TVU1NQVJZX0ZJTEU7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9TVU1NQVJZX0ZJTEU7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIGJiX3RhYmxlX2xlbmd0aCA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAoYmJfdGFibGVfbGVuZ3RoIDwgMCkKLQkgICAgewotCSAgICAgIGJiX3RhYmxlX2xlbmd0aCA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ1QnOgotCSAgYnNkX3N0eWxlX291dHB1dCA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBncHJvZiAlc1xuIiksIFZFUlNJT04pOwotCSAgcHJpbnRmIChfKCJCYXNlZCBvbiBCU0QgZ3Byb2YsIGNvcHlyaWdodCAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cbiIpKTsKLQkgIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICBkb25lICgwKTsKLQljYXNlICd3JzoKLQkgIG91dHB1dF93aWR0aCA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAob3V0cHV0X3dpZHRoIDwgMSkKLQkgICAgewotCSAgICAgIG91dHB1dF93aWR0aCA9IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgYmJfYW5ub3RhdGVfYWxsX2xpbmVzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3knOgotCSAgY3JlYXRlX2Fubm90YXRpb25fZmlsZXMgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAneic6Ci0JICBpZ25vcmVfemVyb3MgPSBGQUxTRTsKLQkgIGJyZWFrOwotCWNhc2UgJ1onOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9FWEVDKTsKLQkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfRVhFQ19DT1VOVFM7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERU1BTkdMRToKLQkgIGRlbWFuZ2xlID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFTUFOR0xFOgotCSAgZGVtYW5nbGUgPSBGQUxTRTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIC8qIERvbid0IGFsbG93IGJvdGggb3JkZXJpbmcgb3B0aW9ucywgdGhleSBtb2RpZnkgdGhlIGFyYyBkYXRhIGluLXBsYWNlLiAgKi8KLSAgaWYgKCh1c2VyX3NwZWNpZmllZCAmIFNUWUxFX0ZVTkNUSU9OX09SREVSKQotICAgICAgJiYgKHVzZXJfc3BlY2lmaWVkICYgU1RZTEVfRklMRV9PUkRFUikpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLF8oIlwKLSVzOiBPbmx5IG9uZSBvZiAtLWZ1bmN0aW9uLW9yZGVyaW5nIGFuZCAtLWZpbGUtb3JkZXJpbmcgbWF5IGJlIHNwZWNpZmllZC5cbiIpLAotCSAgICAgICB3aG9hbWkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIC0tc3VtIGltcGxpZXMgLS1saW5lLCBvdGhlcndpc2Ugd2UnZCBsb3NlIGItYiBjb3VudHMgaW4gZ21vbi5zdW0gKi8KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX1NVTU1BUllfRklMRSkKLSAgICB7Ci0gICAgICBsaW5lX2dyYW51bGFyaXR5ID0gMTsKLSAgICB9Ci0KLSAgLyogYXBwZW5kIHZhbHVlIG9mIEdQUk9GX1BBVEggdG8gc291cmNlIHNlYXJjaCBsaXN0IGlmIHNldDogKi8KLSAgc3RyID0gKGNoYXIgKikgZ2V0ZW52ICgiR1BST0ZfUEFUSCIpOwotICBpZiAoc3RyKQotICAgIHsKLSAgICAgIHNlYXJjaF9saXN0X2FwcGVuZCAoJnNyY19zZWFyY2hfbGlzdCwgc3RyKTsKLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgYV9vdXRfbmFtZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIH0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgZ21vbl9uYW1lID0gYXJndltvcHRpbmQrK107Ci0gICAgfQotCi0gIC8qCi0gICAqIFR1cm4gb2ZmIGRlZmF1bHQgZnVuY3Rpb25zOgotICAgKi8KLSAgZm9yIChzcCA9ICZkZWZhdWx0X2V4Y2x1ZGVkX2xpc3RbMF07ICpzcDsgc3ArKykKLSAgICB7Ci0gICAgICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfVElNRSk7Ci0gICAgICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfR1JBUEgpOwotI2lmZGVmIF9fYWxwaGFfXwotICAgICAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX0ZMQVQpOwotI2VuZGlmCi0gICAgfQotCi0gIC8qCi0gICAqIEZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBhbHNvIHdhbnQgdG8ga2VlcCB0aG9zZQotICAgKiBmdW5jdGlvbnMgb2ZmIHRoZSBmbGF0IHByb2ZpbGU6Ci0gICAqLwotICBpZiAobGluZV9ncmFudWxhcml0eSkKLSAgICB7Ci0gICAgICBmb3IgKHNwID0gJmRlZmF1bHRfZXhjbHVkZWRfbGlzdFswXTsgKnNwOyBzcCsrKQotCXsKLQkgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9GTEFUKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIFJlYWQgc3ltYm9sIHRhYmxlIGZyb20gY29yZSBmaWxlOgotICAgKi8KLSAgY29yZV9pbml0IChhX291dF9uYW1lKTsKLQotICAvKgotICAgKiBJZiB3ZSBzaG91bGQgaWdub3JlIGRpcmVjdCBmdW5jdGlvbiBjYWxscywgd2UgbmVlZCB0byBsb2FkCi0gICAqIHRvIGNvcmUncyB0ZXh0LXNwYWNlOgotICAgKi8KLSAgaWYgKGlnbm9yZV9kaXJlY3RfY2FsbHMpCi0gICAgewotICAgICAgY29yZV9nZXRfdGV4dF9zcGFjZSAoY29yZV9iZmQpOwotICAgIH0KLQotICAvKgotICAgKiBDcmVhdGUgc3ltYm9scyBmcm9tIGNvcmUgaW1hZ2U6Ci0gICAqLwotICBpZiAobGluZV9ncmFudWxhcml0eSkKLSAgICB7Ci0gICAgICBjb3JlX2NyZWF0ZV9saW5lX3N5bXMgKGNvcmVfYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zIChjb3JlX2JmZCk7Ci0gICAgfQotCi0gIC8qCi0gICAqIFRyYW5zbGF0ZSBzeW0gc3BlY3MgaW50byBzeW1zOgotICAgKi8KLSAgc3ltX2lkX3BhcnNlICgpOwotCi0gIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9QUk9GKQotICAgIHsKLSNpZmRlZiBQUk9GX1NVUFBPUlRfSU1QTEVNRU5URUQKLSAgICAgIC8qCi0gICAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgbW9uLm91dCBmaWxlKHMpOgotICAgICAgICovCi0gICAgICBkbwotCXsKLQkgIG1vbl9vdXRfcmVhZCAoZ21vbl9uYW1lKTsKLQkgIGlmIChvcHRpbmQgPCBhcmdjKQotCSAgICB7Ci0JICAgICAgZ21vbl9uYW1lID0gYXJndltvcHRpbmRdOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKG9wdGluZCsrIDwgYXJnYyk7Ci0jZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICBfKCIlczogc29ycnksIGZpbGUgZm9ybWF0IGBwcm9mJyBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIiksCi0JICAgICAgIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgZ21vbi5vdXQgZmlsZShzKToKLSAgICAgICAqLwotICAgICAgZG8KLQl7Ci0JICBnbW9uX291dF9yZWFkIChnbW9uX25hbWUpOwotCSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JICAgIHsKLQkgICAgICBnbW9uX25hbWUgPSBhcmd2W29wdGluZF07Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAob3B0aW5kKysgPCBhcmdjKTsKLSAgICB9Ci0KLSAgLyoKLSAgICogSWYgdXNlciBkaWQgbm90IHNwZWNpZnkgb3V0cHV0IHN0eWxlLCB0cnkgdG8gZ3Vlc3Mgc29tZXRoaW5nCi0gICAqIHJlYXNvbmFibGU6Ci0gICAqLwotICBpZiAob3V0cHV0X3N0eWxlID09IDApCi0gICAgewotICAgICAgaWYgKGdtb25faW5wdXQgJiAoSU5QVVRfSElTVE9HUkFNIHwgSU5QVVRfQ0FMTF9HUkFQSCkpCi0JewotCSAgb3V0cHV0X3N0eWxlID0gU1RZTEVfRkxBVF9QUk9GSUxFIHwgU1RZTEVfQ0FMTF9HUkFQSDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3V0cHV0X3N0eWxlID0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JfQotICAgICAgb3V0cHV0X3N0eWxlICY9IH51c2VyX3NwZWNpZmllZDsKLSAgICB9Ci0KLSAgLyoKLSAgICogRHVtcCBhIGdtb24uc3VtIGZpbGUgaWYgcmVxdWVzdGVkIChiZWZvcmUgYW55IG90aGVyIHByb2Nlc3NpbmchKToKLSAgICovCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9TVU1NQVJZX0ZJTEUpCi0gICAgewotICAgICAgZ21vbl9vdXRfd3JpdGUgKEdNT05TVU0pOwotICAgIH0KLQotICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0hJU1RPR1JBTSkKLSAgICB7Ci0gICAgICBoaXN0X2Fzc2lnbl9zYW1wbGVzICgpOwotICAgIH0KLQotICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0NBTExfR1JBUEgpCi0gICAgewotICAgICAgY2cgPSBjZ19hc3NlbWJsZSAoKTsKLSAgICB9Ci0KLSAgLyogZG8gc29tZSBzaW1wbGUgc2FuaXR5IGNoZWNrczogKi8KLQotICBpZiAoKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZMQVRfUFJPRklMRSkKLSAgICAgICYmICEoZ21vbl9pbnB1dCAmIElOUFVUX0hJU1RPR1JBTSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZ21vbi5vdXQgZmlsZSBpcyBtaXNzaW5nIGhpc3RvZ3JhbVxuIiksIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKChvdXRwdXRfc3R5bGUgJiBTVFlMRV9DQUxMX0dSQVBIKSAmJiAhKGdtb25faW5wdXQgJiBJTlBVVF9DQUxMX0dSQVBIKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgIF8oIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgY2FsbC1ncmFwaCBkYXRhXG4iKSwgd2hvYW1pKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBvdXRwdXQgd2hhdGV2ZXIgdXNlciB3aGlzaGVzIHRvIHNlZTogKi8KLQotICBpZiAoY2cgJiYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0NBTExfR1JBUEgpICYmIGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgY2dfcHJpbnQgKGNnKTsJCS8qIHByaW50IHRoZSBkeW5hbWljIHByb2ZpbGUgKi8KLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZMQVRfUFJPRklMRSkKLSAgICB7Ci0gICAgICBoaXN0X3ByaW50ICgpOwkJLyogcHJpbnQgdGhlIGZsYXQgcHJvZmlsZSAqLwotICAgIH0KLQotICBpZiAoY2cgJiYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0NBTExfR1JBUEgpKQotICAgIHsKLSAgICAgIGlmICghYnNkX3N0eWxlX291dHB1dCkKLQl7Ci0JICBjZ19wcmludCAoY2cpOwkvKiBwcmludCB0aGUgZHluYW1pYyBwcm9maWxlICovCi0JfQotICAgICAgY2dfcHJpbnRfaW5kZXggKCk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9FWEVDX0NPVU5UUykKLSAgICB7Ci0gICAgICBwcmludF9leGVjX2NvdW50cyAoKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0UpCi0gICAgewotICAgICAgcHJpbnRfYW5ub3RhdGVkX3NvdXJjZSAoKTsKLSAgICB9Ci0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GVU5DVElPTl9PUkRFUikKLSAgICB7Ci0gICAgICBjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyAoKTsKLSAgICB9Ci0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GSUxFX09SREVSKQotICAgIHsKLSAgICAgIGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcgKCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotZG9uZSAoc3RhdHVzKQotICAgICBpbnQgc3RhdHVzOwotewotICBleGl0IChzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuaCBiL2dwcm9mL2dwcm9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjJhZWUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiAgICAgIEAoIylncHJvZi5oICAgICA1LjkgKEJlcmtlbGV5KSA2LzEvOTAKLSAqLwotI2lmbmRlZiBncHJvZl9oCi0jZGVmaW5lIGdwcm9mX2gKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIEluY2x1ZGUgdGhlIEJGRCBzeXNkZXAuaCBmaWxlLiAgKi8KLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotLyogVW5kZWZpbmUgdGhlIEJGRCBQQUNLQUdFIGFuZCBWRVJTSU9OIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nIHRoZQotICAgZ3Byb2YgY29uZmlnLmggZmlsZS4gICovCi0jdW5kZWYgUEFDS0FHRQotI3VuZGVmIFZFUlNJT04KLS8qIEFsc28gdW5kZWZpbmUgQkZEJ3MgYF8nIG1hY3JvOyB3ZSBoYXZlIG91ciBvd24gZGVmaW5pdGlvbi4gICovCi0jdW5kZWYgXwotCi0jaW5jbHVkZSAiZ2NvbmZpZy5oIgotCi0jaWZuZGVmIE1JTgotI2RlZmluZSBNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLS8qIEFJWCBkZWZpbmVzIGh6IGFzIGEgbWFjcm8uICAqLwotI3VuZGVmIGh6Ci0KLSNpZm5kZWYgUEFUSF9NQVgKLSNkZWZpbmUgUEFUSF9NQVgJMTAyNAotI2VuZGlmCi0KLSNkZWZpbmUJQV9PVVROQU1FCSJhLm91dCIJLyogZGVmYXVsdCBjb3JlIGZpbGVuYW1lICovCi0jZGVmaW5lCUdNT05OQU1FCSJnbW9uLm91dCIJLyogZGVmYXVsdCBwcm9maWxlIGZpbGVuYW1lICovCi0jZGVmaW5lCUdNT05TVU0JCSJnbW9uLnN1bSIJLyogcHJvZmlsZSBzdW1tYXJ5IGZpbGVuYW1lICovCi0KLSNpZmRlZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLQotCi0vKgotICogVGhlc2UgbWF5IGFscmVhZHkgYmUgZGVmaW5lZCBvbiBzb21lIHN5c3RlbXMuICBXZSBjb3VsZCBwcm9iYWJseQotICoganVzdCB1c2UgdGhlIEJGRCB2ZXJzaW9ucyBvZiB0aGVzZSwgc2luY2UgQkZEIGhhcyBhbHJlYWR5IGRlYWx0Ci0gKiB3aXRoIHRoaXMgcHJvYmxlbS4KLSAqLwotI3VuZGVmIEZBTFNFCi0jZGVmaW5lCUZBTFNFCTAKLSN1bmRlZiBUUlVFCi0jZGVmaW5lCVRSVUUJMQotCi0jZGVmaW5lIFNUWUxFX0ZMQVRfUFJPRklMRQkoMTw8MCkKLSNkZWZpbmUgU1RZTEVfQ0FMTF9HUkFQSAkoMTw8MSkKLSNkZWZpbmUgU1RZTEVfU1VNTUFSWV9GSUxFCSgxPDwyKQotI2RlZmluZSBTVFlMRV9FWEVDX0NPVU5UUwkoMTw8MykKLSNkZWZpbmUgU1RZTEVfQU5OT1RBVEVEX1NPVVJDRQkoMTw8NCkKLSNkZWZpbmUgU1RZTEVfR01PTl9JTkZPCQkoMTw8NSkKLSNkZWZpbmUgU1RZTEVfRlVOQ1RJT05fT1JERVIJKDE8PDYpCi0jZGVmaW5lIFNUWUxFX0ZJTEVfT1JERVIJKDE8PDcpCi0KLSNkZWZpbmUJQU5ZREVCVUcJKDE8PDApCS8qICAgIDEgKi8KLSNkZWZpbmUJREZOREVCVUcJKDE8PDEpCS8qICAgIDIgKi8KLSNkZWZpbmUJQ1lDTEVERUJVRwkoMTw8MikJLyogICAgNCAqLwotI2RlZmluZQlBUkNERUJVRwkoMTw8MykJLyogICAgOCAqLwotI2RlZmluZQlUQUxMWURFQlVHCSgxPDw0KQkvKiAgIDE2ICovCi0jZGVmaW5lCVRJTUVERUJVRwkoMTw8NSkJLyogICAzMiAqLwotI2RlZmluZQlTQU1QTEVERUJVRwkoMTw8NikJLyogICA2NCAqLwotI2RlZmluZQlBT1VUREVCVUcJKDE8PDcpCS8qICAxMjggKi8KLSNkZWZpbmUJQ0FMTERFQlVHCSgxPDw4KQkvKiAgMjU2ICovCi0jZGVmaW5lCUxPT0tVUERFQlVHCSgxPDw5KQkvKiAgNTEyICovCi0jZGVmaW5lCVBST1BERUJVRwkoMTw8MTApCS8qIDEwMjQgKi8KLSNkZWZpbmUgQkJERUJVRwkJKDE8PDExKQkvKiAyMDQ4ICovCi0jZGVmaW5lIElEREVCVUcJCSgxPDwxMikJLyogNDA5NiAqLwotI2RlZmluZSBTUkNERUJVRwkoMTw8MTMpCS8qIDgxOTIgKi8KLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyhsLHMpCWlmIChkZWJ1Z19sZXZlbCAmIChsKSkge3M7fQotI2Vsc2UKLSNkZWZpbmUgREJHKGwscykKLSNlbmRpZgotCi10eXBlZGVmIGVudW0KLSAgewotICAgIEZGX0FVVE8gPSAwLCBGRl9NQUdJQywgRkZfQlNELCBGRl9CU0Q0NCwgRkZfUFJPRgotICB9Ci1GaWxlX0Zvcm1hdDsKLQotdHlwZWRlZiBpbnQgYm9vbDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVTklUWzJdOwkvKiB1bml0IG9mIHByb2ZpbGluZyAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqd2hvYW1pOwkvKiBjb21tYW5kLW5hbWUsIGZvciBlcnJvciBtZXNzYWdlcyAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX21hcHBpbmdfZmlsZTsgLyogZmlsZSBtYXBwaW5nIGZ1bmN0aW9ucyB0byBmaWxlcyAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFfb3V0X25hbWU7CS8qIGNvcmUgZmlsZW5hbWUgKi8KLWV4dGVybiBsb25nIGh6OwkJCS8qIHRpY2tzIHBlciBzZWNvbmQgKi8KLQotLyoKLSAqIENvbW1hbmQtbGluZSBvcHRpb25zOgotICovCi1leHRlcm4gaW50IGRlYnVnX2xldmVsOwkJLyogZGVidWcgbGV2ZWwgKi8KLWV4dGVybiBpbnQgb3V0cHV0X3N0eWxlOwotZXh0ZXJuIGludCBvdXRwdXRfd2lkdGg7CS8qIGNvbnRyb2xzIGNvbHVtbiB3aWR0aCBpbiBpbmRleCAqLwotZXh0ZXJuIGJvb2wgYnNkX3N0eWxlX291dHB1dDsJLyogYXMgb3Bwb3NlZCB0byBGU0Ygc3R5bGUgb3V0cHV0ICovCi1leHRlcm4gYm9vbCBkZW1hbmdsZTsJCS8qIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcz8gKi8KLWV4dGVybiBib29sIGRpc2NhcmRfdW5kZXJzY29yZXM7CS8qIGRpc2NhcmQgbGVhZGluZyB1bmRlcnNjb3Jlcz8gKi8KLWV4dGVybiBib29sIGlnbm9yZV9kaXJlY3RfY2FsbHM7CS8qIGRvbid0IGNvdW50IGRpcmVjdCBjYWxscyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX3N0YXRpY19mdW5jczsJLyogc3VwcHJlc3Mgc3RhdGljIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX3plcm9zOwkvKiBpZ25vcmUgdW51c2VkIHN5bWJvbHMvZmlsZXMgKi8KLWV4dGVybiBib29sIGxpbmVfZ3JhbnVsYXJpdHk7CS8qIGZ1bmN0aW9uIG9yIGxpbmUgZ3JhbnVsYXJpdHk/ICovCi1leHRlcm4gYm9vbCBwcmludF9kZXNjcmlwdGlvbnM7CS8qIG91dHB1dCBwcm9maWxlIGRlc2NyaXB0aW9uICovCi1leHRlcm4gYm9vbCBwcmludF9wYXRoOwkJLyogcHJpbnQgcGF0aCBvciBqdXN0IGZpbGVuYW1lPyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX25vbl9mdW5jdGlvbnM7LyogSWdub3JlIG5vbi1mdW5jdGlvbiBzeW1ib2xzLiAgKi8KLQotZXh0ZXJuIEZpbGVfRm9ybWF0IGZpbGVfZm9ybWF0OwkvKiByZXF1ZXN0ZWQgZmlsZSBmb3JtYXQgKi8KLQotZXh0ZXJuIGJvb2wgZmlyc3Rfb3V0cHV0OwkvKiBubyBvdXRwdXQgc28gZmFyPyAqLwotCi1leHRlcm4gdm9pZCBkb25lIFBBUkFNUyAoKGludCBzdGF0dXMpKTsKLQotI2VuZGlmIC8qIGdwcm9mX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLnRleGkgYi9ncHJvZi9ncHJvZi50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDYwNmI0Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDI4ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvIEBjIC0qLXRleGluZm8tKi0KLUBzZXRmaWxlbmFtZSBncHJvZi5pbmZvCi1Ac2V0dGl0bGUgR05VIGdwcm9mCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi0KLUBpZmluZm8KLUBjIFRoaXMgaXMgYSBkaXIuaW5mbyBmcmFnbWVudCB0byBzdXBwb3J0IHNlbWktYXV0b21hdGVkIGFkZGl0aW9uIG9mCi1AYyBtYW51YWxzIHRvIGFuIGluZm8gdHJlZS4gIHpvb0BjeWdudXMuY29tIGlzIGRldmVsb3BpbmcgdGhpcyBmYWNpbGl0eS4KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIGdwcm9mOiAoZ3Byb2YpLiAgICAgICAgICAgICAgICBQcm9maWxpbmcgeW91ciBwcm9ncmFtJ3MgZXhlY3V0aW9uCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBncHJvZiBwcm9maWxlciBvZiB0aGUgR05VIHN5c3RlbS4KLQotQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkyLCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCBpZmluZm8KLQotQGZpbmFsb3V0Ci1Ac21hbGxib29rCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBHTlUgZ3Byb2YKLUBzdWJ0aXRsZSBUaGUgQHNje2dudX0gUHJvZmlsZXIgCi1AYXV0aG9yIEpheSBGZW5sYXNvbiBhbmQgUmljaGFyZCBTdGFsbG1hbgotCi1AcGFnZQotCi1UaGlzIG1hbnVhbCBkZXNjcmliZXMgdGhlIEBzY3tnbnV9IHByb2ZpbGVyLCBAY29kZXtncHJvZn0sIGFuZCBob3cgeW91Ci1jYW4gdXNlIGl0IHRvIGRldGVybWluZSB3aGljaCBwYXJ0cyBvZiBhIHByb2dyYW0gYXJlIHRha2luZyBtb3N0IG9mIHRoZQotZXhlY3V0aW9uIHRpbWUuICBXZSBhc3N1bWUgdGhhdCB5b3Uga25vdyBob3cgdG8gd3JpdGUsIGNvbXBpbGUsIGFuZAotZXhlY3V0ZSBwcm9ncmFtcy4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSB3YXMgd3JpdHRlbiBieSBKYXkgRmVubGFzb24uCi0KLVRoaXMgbWFudWFsIHdhcyBlZGl0ZWQgSmFudWFyeSAxOTkzIGJ5IEplZmZyZXkgT3NpZXIKLWFuZCB1cGRhdGVkIFNlcHRlbWJlciAxOTk3IGJ5IEJyZW50IEJhY2NhbGEuCi0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk4OCwgMTk5MiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgYXMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AKLUB0b3AgUHJvZmlsaW5nIGEgUHJvZ3JhbTogV2hlcmUgRG9lcyBJdCBTcGVuZCBJdHMgVGltZT8KLQotVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSBAc2N7Z251fSBwcm9maWxlciwgQGNvZGV7Z3Byb2Z9LCBhbmQgaG93IHlvdQotY2FuIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hpY2ggcGFydHMgb2YgYSBwcm9ncmFtIGFyZSB0YWtpbmcgbW9zdCBvZiB0aGUKLWV4ZWN1dGlvbiB0aW1lLiAgV2UgYXNzdW1lIHRoYXQgeW91IGtub3cgaG93IHRvIHdyaXRlLCBjb21waWxlLCBhbmQKLWV4ZWN1dGUgcHJvZ3JhbXMuICBAc2N7Z251fSBAY29kZXtncHJvZn0gd2FzIHdyaXR0ZW4gYnkgSmF5IEZlbmxhc29uLgotCi1UaGlzIG1hbnVhbCB3YXMgdXBkYXRlZCBBdWd1c3QgMTk5NyBieSBCcmVudCBCYWNjYWxhLgotCi1AbWVudQotKiBJbnRyb2R1Y3Rpb246OiAgICAgICAgV2hhdCBwcm9maWxpbmcgbWVhbnMsIGFuZCB3aHkgaXQgaXMgdXNlZnVsLgotCi0qIENvbXBpbGluZzo6ICAgICAgICAgICBIb3cgdG8gY29tcGlsZSB5b3VyIHByb2dyYW0gZm9yIHByb2ZpbGluZy4KLSogRXhlY3V0aW5nOjogICAgICAgICAgIEV4ZWN1dGluZyB5b3VyIHByb2dyYW0gdG8gZ2VuZXJhdGUgcHJvZmlsZSBkYXRhCi0qIEludm9raW5nOjogICAgICAgICAgICBIb3cgdG8gcnVuIEBjb2Rle2dwcm9mfSwgYW5kIGl0cyBvcHRpb25zCi0KLSogT3V0cHV0OjoJCUludGVycHJldGluZyBAY29kZXtncHJvZn0ncyBvdXRwdXQKLQotKiBJbmFjY3VyYWN5OjogICAgICAgICAgUG90ZW50aWFsIHByb2JsZW1zIHlvdSBzaG91bGQgYmUgYXdhcmUgb2YKLSogSG93IGRvIEk/OjogICAgICAgICAgIEFuc3dlcnMgdG8gY29tbW9uIHF1ZXN0aW9ucwotKiBJbmNvbXBhdGliaWxpdGllczo6ICAgKGJldHdlZW4gQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFuZCBVbml4IEBjb2Rle2dwcm9mfS4pCi0qIERldGFpbHM6OiAgICAgICAgICAgICBEZXRhaWxzIG9mIGhvdyBwcm9maWxpbmcgaXMgZG9uZQotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1Abm9kZSBJbnRyb2R1Y3Rpb24KLUBjaGFwdGVyIEludHJvZHVjdGlvbiB0byBQcm9maWxpbmcKLQotUHJvZmlsaW5nIGFsbG93cyB5b3UgdG8gbGVhcm4gd2hlcmUgeW91ciBwcm9ncmFtIHNwZW50IGl0cyB0aW1lIGFuZCB3aGljaAotZnVuY3Rpb25zIGNhbGxlZCB3aGljaCBvdGhlciBmdW5jdGlvbnMgd2hpbGUgaXQgd2FzIGV4ZWN1dGluZy4gIFRoaXMKLWluZm9ybWF0aW9uIGNhbiBzaG93IHlvdSB3aGljaCBwaWVjZXMgb2YgeW91ciBwcm9ncmFtIGFyZSBzbG93ZXIgdGhhbiB5b3UKLWV4cGVjdGVkLCBhbmQgbWlnaHQgYmUgY2FuZGlkYXRlcyBmb3IgcmV3cml0aW5nIHRvIG1ha2UgeW91ciBwcm9ncmFtCi1leGVjdXRlIGZhc3Rlci4gIEl0IGNhbiBhbHNvIHRlbGwgeW91IHdoaWNoIGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkIG1vcmUKLW9yIGxlc3Mgb2Z0ZW4gdGhhbiB5b3UgZXhwZWN0ZWQuICBUaGlzIG1heSBoZWxwIHlvdSBzcG90IGJ1Z3MgdGhhdCBoYWQKLW90aGVyd2lzZSBiZWVuIHVubm90aWNlZC4KLQotU2luY2UgdGhlIHByb2ZpbGVyIHVzZXMgaW5mb3JtYXRpb24gY29sbGVjdGVkIGR1cmluZyB0aGUgYWN0dWFsIGV4ZWN1dGlvbgotb2YgeW91ciBwcm9ncmFtLCBpdCBjYW4gYmUgdXNlZCBvbiBwcm9ncmFtcyB0aGF0IGFyZSB0b28gbGFyZ2Ugb3IgdG9vCi1jb21wbGV4IHRvIGFuYWx5emUgYnkgcmVhZGluZyB0aGUgc291cmNlLiAgSG93ZXZlciwgaG93IHlvdXIgcHJvZ3JhbSBpcyBydW4KLXdpbGwgYWZmZWN0IHRoZSBpbmZvcm1hdGlvbiB0aGF0IHNob3dzIHVwIGluIHRoZSBwcm9maWxlIGRhdGEuICBJZiB5b3UKLWRvbid0IHVzZSBzb21lIGZlYXR1cmUgb2YgeW91ciBwcm9ncmFtIHdoaWxlIGl0IGlzIGJlaW5nIHByb2ZpbGVkLCBubwotcHJvZmlsZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhhdCBmZWF0dXJlLgotCi1Qcm9maWxpbmcgaGFzIHNldmVyYWwgc3RlcHM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Zb3UgbXVzdCBjb21waWxlIGFuZCBsaW5rIHlvdXIgcHJvZ3JhbSB3aXRoIHByb2ZpbGluZyBlbmFibGVkLgotQHhyZWZ7Q29tcGlsaW5nfS4KLQotQGl0ZW0KLVlvdSBtdXN0IGV4ZWN1dGUgeW91ciBwcm9ncmFtIHRvIGdlbmVyYXRlIGEgcHJvZmlsZSBkYXRhIGZpbGUuCi1AeHJlZntFeGVjdXRpbmd9LgotCi1AaXRlbQotWW91IG11c3QgcnVuIEBjb2Rle2dwcm9mfSB0byBhbmFseXplIHRoZSBwcm9maWxlIGRhdGEuCi1AeHJlZntJbnZva2luZ30uCi1AZW5kIGl0ZW1pemUKLQotVGhlIG5leHQgdGhyZWUgY2hhcHRlcnMgZXhwbGFpbiB0aGVzZSBzdGVwcyBpbiBncmVhdGVyIGRldGFpbC4KLQotU2V2ZXJhbCBmb3JtcyBvZiBvdXRwdXQgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBhbmFseXNpcy4KLQotVGhlIEBkZm57ZmxhdCBwcm9maWxlfSBzaG93cyBob3cgbXVjaCB0aW1lIHlvdXIgcHJvZ3JhbSBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uLAotYW5kIGhvdyBtYW55IHRpbWVzIHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZC4gIElmIHlvdSBzaW1wbHkgd2FudCB0byBrbm93Ci13aGljaCBmdW5jdGlvbnMgYnVybiBtb3N0IG9mIHRoZSBjeWNsZXMsIGl0IGlzIHN0YXRlZCBjb25jaXNlbHkgaGVyZS4KLUB4cmVme0ZsYXQgUHJvZmlsZX0uCi0KLVRoZSBAZGZue2NhbGwgZ3JhcGh9IHNob3dzLCBmb3IgZWFjaCBmdW5jdGlvbiwgd2hpY2ggZnVuY3Rpb25zIGNhbGxlZCBpdCwgd2hpY2gKLW90aGVyIGZ1bmN0aW9ucyBpdCBjYWxsZWQsIGFuZCBob3cgbWFueSB0aW1lcy4gIFRoZXJlIGlzIGFsc28gYW4gZXN0aW1hdGUKLW9mIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50IGluIHRoZSBzdWJyb3V0aW5lcyBvZiBlYWNoIGZ1bmN0aW9uLiAgVGhpcyBjYW4KLXN1Z2dlc3QgcGxhY2VzIHdoZXJlIHlvdSBtaWdodCB0cnkgdG8gZWxpbWluYXRlIGZ1bmN0aW9uIGNhbGxzIHRoYXQgdXNlIGEKLWxvdCBvZiB0aW1lLiAgQHhyZWZ7Q2FsbCBHcmFwaH0uCi0KLVRoZSBAZGZue2Fubm90YXRlZCBzb3VyY2V9IGxpc3RpbmcgaXMgYSBjb3B5IG9mIHRoZSBwcm9ncmFtJ3MKLXNvdXJjZSBjb2RlLCBsYWJlbGVkIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgb2YgdGhlCi1wcm9ncmFtIHdhcyBleGVjdXRlZC4gIEB4cmVme0Fubm90YXRlZCBTb3VyY2V9LgotCi1UbyBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgcHJvZmlsaW5nIHdvcmtzLCB5b3UgbWF5IHdpc2ggdG8gcmVhZAotYSBkZXNjcmlwdGlvbiBvZiBpdHMgaW1wbGVtZW50YXRpb24uCi1AeHJlZntJbXBsZW1lbnRhdGlvbn0uCi0KLUBub2RlIENvbXBpbGluZwotQGNoYXB0ZXIgQ29tcGlsaW5nIGEgUHJvZ3JhbSBmb3IgUHJvZmlsaW5nCi0KLVRoZSBmaXJzdCBzdGVwIGluIGdlbmVyYXRpbmcgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgeW91ciBwcm9ncmFtIGlzCi10byBjb21waWxlIGFuZCBsaW5rIGl0IHdpdGggcHJvZmlsaW5nIGVuYWJsZWQuCi0KLVRvIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBmb3IgcHJvZmlsaW5nLCBzcGVjaWZ5IHRoZSBAc2FtcHstcGd9IG9wdGlvbiB3aGVuCi15b3UgcnVuIHRoZSBjb21waWxlci4gIChUaGlzIGlzIGluIGFkZGl0aW9uIHRvIHRoZSBvcHRpb25zIHlvdSBub3JtYWxseQotdXNlLikKLQotVG8gbGluayB0aGUgcHJvZ3JhbSBmb3IgcHJvZmlsaW5nLCBpZiB5b3UgdXNlIGEgY29tcGlsZXIgc3VjaCBhcyBAY29kZXtjY30KLXRvIGRvIHRoZSBsaW5raW5nLCBzaW1wbHkgc3BlY2lmeSBAc2FtcHstcGd9IGluIGFkZGl0aW9uIHRvIHlvdXIgdXN1YWwKLW9wdGlvbnMuICBUaGUgc2FtZSBvcHRpb24sIEBzYW1wey1wZ30sIGFsdGVycyBlaXRoZXIgY29tcGlsYXRpb24gb3IgbGlua2luZwotdG8gZG8gd2hhdCBpcyBuZWNlc3NhcnkgZm9yIHByb2ZpbGluZy4gIEhlcmUgYXJlIGV4YW1wbGVzOgotCi1AZXhhbXBsZQotY2MgLWcgLWMgbXlwcm9nLmMgdXRpbHMuYyAtcGcKLWNjIC1vIG15cHJvZyBteXByb2cubyB1dGlscy5vIC1wZwotQGVuZCBleGFtcGxlCi0KLVRoZSBAc2FtcHstcGd9IG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggYSBjb21tYW5kIHRoYXQgYm90aCBjb21waWxlcyBhbmQgbGlua3M6Ci0KLUBleGFtcGxlCi1jYyAtbyBteXByb2cgbXlwcm9nLmMgdXRpbHMuYyAtZyAtcGcKLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgcnVuIHRoZSBsaW5rZXIgQGNvZGV7bGR9IGRpcmVjdGx5IGluc3RlYWQgb2YgdGhyb3VnaCBhIGNvbXBpbGVyCi1zdWNoIGFzIEBjb2Rle2NjfSwgeW91IG1heSBoYXZlIHRvIHNwZWNpZnkgYSBwcm9maWxpbmcgc3RhcnR1cCBmaWxlCi1AZmlsZXtnY3J0MC5vfSBhcyB0aGUgZmlyc3QgaW5wdXQgZmlsZSBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBzdGFydHVwCi1maWxlIEBmaWxle2NydDAub30uICBJbiBhZGRpdGlvbiwgeW91IHdvdWxkIHByb2JhYmx5IHdhbnQgdG8KLXNwZWNpZnkgdGhlIHByb2ZpbGluZyBDIGxpYnJhcnksIEBmaWxle2xpYmNfcC5hfSwgYnkgd3JpdGluZwotQHNhbXB7LWxjX3B9IGluc3RlYWQgb2YgdGhlIHVzdWFsIEBzYW1wey1sY30uICBUaGlzIGlzIG5vdCBhYnNvbHV0ZWx5Ci1uZWNlc3NhcnksIGJ1dCBkb2luZyB0aGlzIGdpdmVzIHlvdSBudW1iZXItb2YtY2FsbHMgaW5mb3JtYXRpb24gZm9yCi1zdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyBzdWNoIGFzIEBjb2Rle3JlYWR9IGFuZCBAY29kZXtvcGVufS4gIEZvcgotZXhhbXBsZToKLQotQGV4YW1wbGUKLWxkIC1vIG15cHJvZyAvbGliL2djcnQwLm8gbXlwcm9nLm8gdXRpbHMubyAtbGNfcAotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSBjb21waWxlIG9ubHkgc29tZSBvZiB0aGUgbW9kdWxlcyBvZiB0aGUgcHJvZ3JhbSB3aXRoIEBzYW1wey1wZ30sIHlvdQotY2FuIHN0aWxsIHByb2ZpbGUgdGhlIHByb2dyYW0sIGJ1dCB5b3Ugd29uJ3QgZ2V0IGNvbXBsZXRlIGluZm9ybWF0aW9uIGFib3V0Ci10aGUgbW9kdWxlcyB0aGF0IHdlcmUgY29tcGlsZWQgd2l0aG91dCBAc2FtcHstcGd9LiAgVGhlIG9ubHkgaW5mb3JtYXRpb24KLXlvdSBnZXQgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhvc2UgbW9kdWxlcyBpcyB0aGUgdG90YWwgdGltZSBzcGVudCBpbiB0aGVtOwotdGhlcmUgaXMgbm8gcmVjb3JkIG9mIGhvdyBtYW55IHRpbWVzIHRoZXkgd2VyZSBjYWxsZWQsIG9yIGZyb20gd2hlcmUuICBUaGlzCi13aWxsIG5vdCBhZmZlY3QgdGhlIGZsYXQgcHJvZmlsZSAoZXhjZXB0IHRoYXQgdGhlIEBjb2Rle2NhbGxzfSBmaWVsZCBmb3IKLXRoZSBmdW5jdGlvbnMgd2lsbCBiZSBibGFuayksIGJ1dCB3aWxsIGdyZWF0bHkgcmVkdWNlIHRoZSB1c2VmdWxuZXNzIG9mIHRoZQotY2FsbCBncmFwaC4KLQotSWYgeW91IHdpc2ggdG8gcGVyZm9ybSBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLAoteW91IHdpbGwgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIEBzYW1wey1nfSBvcHRpb24sCi1pbnN0cnVjdGluZyB0aGUgY29tcGlsZXIgdG8gaW5zZXJ0IGRlYnVnZ2luZyBzeW1ib2xzIGludG8gdGhlIHByb2dyYW0KLXRoYXQgbWF0Y2ggcHJvZ3JhbSBhZGRyZXNzZXMgdG8gc291cmNlIGNvZGUgbGluZXMuCi1AeHJlZntMaW5lLWJ5LWxpbmV9LgotCi1JbiBhZGRpdGlvbiB0byB0aGUgQHNhbXB7LXBnfSBhbmQgQHNhbXB7LWd9IG9wdGlvbnMsCi15b3UgbWF5IGFsc28gd2lzaCB0byBzcGVjaWZ5IHRoZSBAc2FtcHstYX0gb3B0aW9uIHdoZW4gY29tcGlsaW5nLgotVGhpcyB3aWxsIGluc3RydW1lbnQKLXRoZSBwcm9ncmFtIHRvIHBlcmZvcm0gYmFzaWMtYmxvY2sgY291bnRpbmcuICBBcyB0aGUgcHJvZ3JhbSBydW5zLAotaXQgd2lsbCBjb3VudCBob3cgbWFueSB0aW1lcyBpdCBleGVjdXRlZCBlYWNoIGJyYW5jaCBvZiBlYWNoIEBzYW1we2lmfQotc3RhdGVtZW50LCBlYWNoIGl0ZXJhdGlvbiBvZiBlYWNoIEBzYW1we2RvfSBsb29wLCBldGMuICBUaGlzIHdpbGwKLWVuYWJsZSBAY29kZXtncHJvZn0gdG8gY29uc3RydWN0IGFuIGFubm90YXRlZCBzb3VyY2UgY29kZQotbGlzdGluZyBzaG93aW5nIGhvdyBtYW55IHRpbWVzIGVhY2ggbGluZSBvZiBjb2RlIHdhcyBleGVjdXRlZC4KLQotQG5vZGUgRXhlY3V0aW5nCi1AY2hhcHRlciBFeGVjdXRpbmcgdGhlIFByb2dyYW0KLQotT25jZSB0aGUgcHJvZ3JhbSBpcyBjb21waWxlZCBmb3IgcHJvZmlsaW5nLCB5b3UgbXVzdCBydW4gaXQgaW4gb3JkZXIgdG8KLWdlbmVyYXRlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IEBjb2Rle2dwcm9mfSBuZWVkcy4gIFNpbXBseSBydW4gdGhlIHByb2dyYW0KLWFzIHVzdWFsLCB1c2luZyB0aGUgbm9ybWFsIGFyZ3VtZW50cywgZmlsZSBuYW1lcywgZXRjLiAgVGhlIHByb2dyYW0gc2hvdWxkCi1ydW4gbm9ybWFsbHksIHByb2R1Y2luZyB0aGUgc2FtZSBvdXRwdXQgYXMgdXN1YWwuICBJdCB3aWxsLCBob3dldmVyLCBydW4KLXNvbWV3aGF0IHNsb3dlciB0aGFuIG5vcm1hbCBiZWNhdXNlIG9mIHRoZSB0aW1lIHNwZW50IGNvbGxlY3RpbmcgYW5kIHRoZQotd3JpdGluZyB0aGUgcHJvZmlsZSBkYXRhLgotCi1UaGUgd2F5IHlvdSBydW4gdGhlIHByb2dyYW0tLS10aGUgYXJndW1lbnRzIGFuZCBpbnB1dCB0aGF0IHlvdSBnaXZlCi1pdC0tLW1heSBoYXZlIGEgZHJhbWF0aWMgZWZmZWN0IG9uIHdoYXQgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gc2hvd3MuICBUaGUKLXByb2ZpbGUgZGF0YSB3aWxsIGRlc2NyaWJlIHRoZSBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSB0aGF0IHdlcmUgYWN0aXZhdGVkIGZvcgotdGhlIHBhcnRpY3VsYXIgaW5wdXQgeW91IHVzZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgZmlyc3QgY29tbWFuZCB5b3UgZ2l2ZQotdG8geW91ciBwcm9ncmFtIGlzIHRvIHF1aXQsIHRoZSBwcm9maWxlIGRhdGEgd2lsbCBzaG93IHRoZSB0aW1lIHVzZWQgaW4KLWluaXRpYWxpemF0aW9uIGFuZCBpbiBjbGVhbnVwLCBidXQgbm90IG11Y2ggZWxzZS4KLQotWW91ciBwcm9ncmFtIHdpbGwgd3JpdGUgdGhlIHByb2ZpbGUgZGF0YSBpbnRvIGEgZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5vdXR9Ci1qdXN0IGJlZm9yZSBleGl0aW5nLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGZpbGUgY2FsbGVkIEBmaWxle2dtb24ub3V0fSwKLWl0cyBjb250ZW50cyBhcmUgb3ZlcndyaXR0ZW4uICBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIHRlbGwgdGhlCi1wcm9ncmFtIHRvIHdyaXRlIHRoZSBwcm9maWxlIGRhdGEgdW5kZXIgYSBkaWZmZXJlbnQgbmFtZSwgYnV0IHlvdSBjYW4gcmVuYW1lCi10aGUgZmlsZSBhZnRlcndhcmQgaWYgeW91IGFyZSBjb25jZXJuZWQgdGhhdCBpdCBtYXkgYmUgb3ZlcndyaXR0ZW4uCi0KLUluIG9yZGVyIHRvIHdyaXRlIHRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSBwcm9wZXJseSwgeW91ciBwcm9ncmFtIG11c3QgZXhpdAotbm9ybWFsbHk6IGJ5IHJldHVybmluZyBmcm9tIEBjb2Rle21haW59IG9yIGJ5IGNhbGxpbmcgQGNvZGV7ZXhpdH0uICBDYWxsaW5nCi10aGUgbG93LWxldmVsIGZ1bmN0aW9uIEBjb2Rle19leGl0fSBkb2VzIG5vdCB3cml0ZSB0aGUgcHJvZmlsZSBkYXRhLCBhbmQKLW5laXRoZXIgZG9lcyBhYm5vcm1hbCB0ZXJtaW5hdGlvbiBkdWUgdG8gYW4gdW5oYW5kbGVkIHNpZ25hbC4KLQotVGhlIEBmaWxle2dtb24ub3V0fSBmaWxlIGlzIHdyaXR0ZW4gaW4gdGhlIHByb2dyYW0ncyBAZW1waHtjdXJyZW50IHdvcmtpbmcKLWRpcmVjdG9yeX0gYXQgdGhlIHRpbWUgaXQgZXhpdHMuICBUaGlzIG1lYW5zIHRoYXQgaWYgeW91ciBwcm9ncmFtIGNhbGxzCi1AY29kZXtjaGRpcn0sIHRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSB3aWxsIGJlIGxlZnQgaW4gdGhlIGxhc3QgZGlyZWN0b3J5Ci15b3VyIHByb2dyYW0gQGNvZGV7Y2hkaXJ9J2QgdG8uICBJZiB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHdyaXRlIGluCi10aGlzIGRpcmVjdG9yeSwgdGhlIGZpbGUgaXMgbm90IHdyaXR0ZW4sIGFuZCB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IgbWVzc2FnZS4KLQotT2xkZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IHByb2ZpbGluZyBsaWJyYXJ5IG1heSBhbHNvIHdyaXRlIGEgZmlsZQotY2FsbGVkIEBmaWxle2JiLm91dH0uICBUaGlzIGZpbGUsIGlmIHByZXNlbnQsIGNvbnRhaW5zIGFuIGh1bWFuLXJlYWRhYmxlCi1saXN0aW5nIG9mIHRoZSBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLiAgVW5mb3J0dW5hdGVseSwgdGhlCi1hcHBlYXJhbmNlIG9mIGEgaHVtYW4tcmVhZGFibGUgQGZpbGV7YmIub3V0fSBtZWFucyB0aGUgYmFzaWMtYmxvY2sKLWNvdW50cyBkaWRuJ3QgZ2V0IHdyaXR0ZW4gaW50byBAZmlsZXtnbW9uLm91dH0uCi1UaGUgUGVybCBzY3JpcHQgQGNvZGV7YmJjb252LnBsfSwgaW5jbHVkZWQgd2l0aCB0aGUgQGNvZGV7Z3Byb2Z9Ci1zb3VyY2UgZGlzdHJpYnV0aW9uLCB3aWxsIGNvbnZlcnQgYSBAZmlsZXtiYi5vdXR9IGZpbGUgaW50bwotYSBmb3JtYXQgcmVhZGFibGUgYnkgQGNvZGV7Z3Byb2Z9LgotCi1Abm9kZSBJbnZva2luZwotQGNoYXB0ZXIgQGNvZGV7Z3Byb2Z9IENvbW1hbmQgU3VtbWFyeQotCi1BZnRlciB5b3UgaGF2ZSBhIHByb2ZpbGUgZGF0YSBmaWxlIEBmaWxle2dtb24ub3V0fSwgeW91IGNhbiBydW4gQGNvZGV7Z3Byb2Z9Ci10byBpbnRlcnByZXQgdGhlIGluZm9ybWF0aW9uIGluIGl0LiAgVGhlIEBjb2Rle2dwcm9mfSBwcm9ncmFtIHByaW50cyBhCi1mbGF0IHByb2ZpbGUgYW5kIGEgY2FsbCBncmFwaCBvbiBzdGFuZGFyZCBvdXRwdXQuICBUeXBpY2FsbHkgeW91IHdvdWxkCi1yZWRpcmVjdCB0aGUgb3V0cHV0IG9mIEBjb2Rle2dwcm9mfSBpbnRvIGEgZmlsZSB3aXRoIEBzYW1wez59LgotCi1Zb3UgcnVuIEBjb2Rle2dwcm9mfSBsaWtlIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLWdwcm9mIEB2YXJ7b3B0aW9uc30gW0B2YXJ7ZXhlY3V0YWJsZS1maWxlfSBbQHZhcntwcm9maWxlLWRhdGEtZmlsZXN9QGRvdHN7fV1dIFs+IEB2YXJ7b3V0ZmlsZX1dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLUhlcmUgc3F1YXJlLWJyYWNrZXRzIGluZGljYXRlIG9wdGlvbmFsIGFyZ3VtZW50cy4KLQotSWYgeW91IG9taXQgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lLCB0aGUgZmlsZSBAZmlsZXthLm91dH0gaXMgdXNlZC4gIElmCi15b3UgZ2l2ZSBubyBwcm9maWxlIGRhdGEgZmlsZSBuYW1lLCB0aGUgZmlsZSBAZmlsZXtnbW9uLm91dH0gaXMgdXNlZC4gIElmCi1hbnkgZmlsZSBpcyBub3QgaW4gdGhlIHByb3BlciBmb3JtYXQsIG9yIGlmIHRoZSBwcm9maWxlIGRhdGEgZmlsZSBkb2VzIG5vdAotYXBwZWFyIHRvIGJlbG9uZyB0byB0aGUgZXhlY3V0YWJsZSBmaWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQuCi0KLVlvdSBjYW4gZ2l2ZSBtb3JlIHRoYW4gb25lIHByb2ZpbGUgZGF0YSBmaWxlIGJ5IGVudGVyaW5nIGFsbCB0aGVpciBuYW1lcwotYWZ0ZXIgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lOyB0aGVuIHRoZSBzdGF0aXN0aWNzIGluIGFsbCB0aGUgZGF0YSBmaWxlcwotYXJlIHN1bW1lZCB0b2dldGhlci4KLQotVGhlIG9yZGVyIG9mIHRoZXNlIG9wdGlvbnMgZG9lcyBub3QgbWF0dGVyLgotCi1AbWVudQotKiBPdXRwdXQgT3B0aW9uczo6ICAgICAgQ29udHJvbGxpbmcgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0IHN0eWxlCi0qIEFuYWx5c2lzIE9wdGlvbnM6OiAgICBDb250cm9sbGluZyBob3cgQGNvZGV7Z3Byb2Z9IGFuYWx5c2VzIGl0cyBkYXRhCi0qIE1pc2NlbGxhbmVvdXMgT3B0aW9uczo6Ci0qIERlcHJpY2F0ZWQgT3B0aW9uczo6ICBPcHRpb25zIHlvdSBubyBsb25nZXIgbmVlZCB0byB1c2UsIGJ1dCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYmVlbiByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eQotKiBTeW1zcGVjczo6ICAgICAgICAgICAgU3BlY2lmeWluZyBmdW5jdGlvbnMgdG8gaW5jbHVkZSBvciBleGNsdWRlCi1AZW5kIG1lbnUKLQotQG5vZGUgT3V0cHV0IE9wdGlvbnMsQW5hbHlzaXMgT3B0aW9ucywsSW52b2tpbmcKLUBzZWN0aW9uIE91dHB1dCBPcHRpb25zCi0KLVRoZXNlIG9wdGlvbnMgc3BlY2lmeSB3aGljaCBvZiBzZXZlcmFsIG91dHB1dCBmb3JtYXRzCi1AY29kZXtncHJvZn0gc2hvdWxkIHByb2R1Y2UuCi0KLU1hbnkgb2YgdGhlc2Ugb3B0aW9ucyB0YWtlIGFuIG9wdGlvbmFsIEBkZm57c3ltc3BlY30gdG8gc3BlY2lmeQotZnVuY3Rpb25zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLiAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUKLXNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgd2l0aCBkaWZmZXJlbnQgc3ltc3BlY3MsIHRvIGluY2x1ZGUKLW9yIGV4Y2x1ZGUgc2V0cyBvZiBzeW1ib2xzLiAgQHhyZWZ7U3ltc3BlY3N9LgotCi1TcGVjaWZ5aW5nIGFueSBvZiB0aGVzZSBvcHRpb25zIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCAoQHNhbXB7LXAgLXF9KSwKLXdoaWNoIHByaW50cyBhIGZsYXQgcHJvZmlsZSBhbmQgY2FsbCBncmFwaCBhbmFseXNpcwotZm9yIGFsbCBmdW5jdGlvbnMuCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtQVtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tYW5ub3RhdGVkLXNvdXJjZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstQX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYW5ub3RhdGVkIHNvdXJjZSBjb2RlLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIHByaW50IG91dHB1dCBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgotQHhyZWZ7QW5ub3RhdGVkIFNvdXJjZX0uCi0KLUBpdGVtIC1iCi1AaXRlbXggLS1icmllZgotSWYgdGhlIEBzYW1wey1ifSBvcHRpb24gaXMgZ2l2ZW4sIEBjb2Rle2dwcm9mfSBkb2Vzbid0IHByaW50IHRoZQotdmVyYm9zZSBibHVyYnMgdGhhdCB0cnkgdG8gZXhwbGFpbiB0aGUgbWVhbmluZyBvZiBhbGwgb2YgdGhlIGZpZWxkcyBpbgotdGhlIHRhYmxlcy4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBpbnRlbmQgdG8gcHJpbnQgb3V0IHRoZSBvdXRwdXQsIG9yCi1hcmUgdGlyZWQgb2Ygc2VlaW5nIHRoZSBibHVyYnMuCi0KLUBpdGVtIC1DW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1leGVjLWNvdW50c1s9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstQ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8KLXByaW50IGEgdGFsbHkgb2YgZnVuY3Rpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggd2FzIGNhbGxlZC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCB0YWxseSBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgotCi1JZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGUgY29udGFpbnMgYmFzaWMtYmxvY2sgY291bnQgcmVjb3Jkcywgc3BlY2lmaW5nCi10aGUgQHNhbXB7LWx9IG9wdGlvbiwgYWxvbmcgd2l0aCBAc2FtcHstQ30sIHdpbGwgY2F1c2UgYmFzaWMtYmxvY2sKLWV4ZWN1dGlvbiBjb3VudHMgdG8gYmUgdGFsbGllZCBhbmQgZGlzcGxheWVkLgotCi1AaXRlbSAtaQotQGl0ZW14IC0tZmlsZS1pbmZvCi1UaGUgQHNhbXB7LWl9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGRpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIHByb2ZpbGUgZGF0YSBmaWxlKHMpIGFuZCB0aGVuIGV4aXQuICBUaGUgbnVtYmVyIG9mIGhpc3RvZ3JhbSwKLWNhbGwgZ3JhcGgsIGFuZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmRzIGlzIGRpc3BsYXllZC4KLQotQGl0ZW0gLUkgQHZhcntkaXJzfQotQGl0ZW14IC0tZGlyZWN0b3J5LXBhdGg9QHZhcntkaXJzfQotVGhlIEBzYW1wey1JfSBvcHRpb24gc3BlY2lmaWVzIGEgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMgaW4KLXdoaWNoIHRvIGZpbmQgc291cmNlIGZpbGVzLiAgRW52aXJvbm1lbnQgdmFyaWFibGUgQHZhcntHUFJPRl9QQVRIfQotY2FuIGFsc28gYmUgdXNlZCB0byBjb252ZXJ5IHRoaXMgaW5mb3JtYXRpb24uCi1Vc2VkIG1vc3RseSBmb3IgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQuCi0KLUBpdGVtIC1KW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1hbm5vdGF0ZWQtc291cmNlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1KfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSBub3QgdG8KLXByaW50IGFubm90YXRlZCBzb3VyY2UgY29kZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGFubm90YXRlZCBzb3VyY2UsCi1idXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLUwKLUBpdGVteCAtLXByaW50LXBhdGgKLU5vcm1hbGx5LCBzb3VyY2UgZmlsZW5hbWVzIGFyZSBwcmludGVkIHdpdGggdGhlIHBhdGgKLWNvbXBvbmVudCBzdXBwcmVzc2VkLiAgVGhlIEBzYW1wey1MfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfQotdG8gcHJpbnQgdGhlIGZ1bGwgcGF0aG5hbWUgb2YKLXNvdXJjZSBmaWxlbmFtZXMsIHdoaWNoIGlzIGRldGVybWluZWQKLWZyb20gc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBpbWFnZSBmaWxlCi1hbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIKLXdhcyBpbnZva2VkLgotCi1AaXRlbSAtcFtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tZmxhdC1wcm9maWxlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1wfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBhIGZsYXQgcHJvZmlsZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBmbGF0IHByb2ZpbGUgb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scy4KLUB4cmVme0ZsYXQgUHJvZmlsZX0uCi0KLUBpdGVtIC1QW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1mbGF0LXByb2ZpbGVbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LVB9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHByaW50aW5nIGEgZmxhdCBwcm9maWxlLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIEBjb2Rle2dwcm9mfSBwcmludHMgYSBmbGF0IHByb2ZpbGUsCi1idXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLXFbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLWdyYXBoWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1xfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCB0aGUgY2FsbCBncmFwaCBhbmFseXNpcy4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBjYWxsIGdyYXBoIG9ubHkgZm9yIG1hdGNoaW5nIHN5bWJvbHMKLWFuZCB0aGVpciBjaGlsZHJlbi4KLUB4cmVme0NhbGwgR3JhcGh9LgotCi1AaXRlbSAtUVtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tZ3JhcGhbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LVF9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHByaW50aW5nIHRoZQotY2FsbCBncmFwaC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGEgY2FsbCBncmFwaCwKLWJ1dCBleGNsdWRlcyBtYXRjaGluZyBzeW1ib2xzLgotCi1AaXRlbSAteQotQGl0ZW14IC0tc2VwYXJhdGUtZmlsZXMKLVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLU5vcm1hbGx5LCBncHJvZiBwcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmaWxlcwotdG8gc3RhbmRhcmQtb3V0cHV0LiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLAotYW5ub3RhdGVkIHNvdXJjZSBmb3IgYSBmaWxlIG5hbWVkIEBmaWxle3BhdGgvZmlsZW5hbWV9Ci1pcyBnZW5lcmF0ZWQgaW4gdGhlIGZpbGUgQGZpbGV7ZmlsZW5hbWUtYW5ufS4KLQotQGl0ZW0gLVpbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLW5vLWV4ZWMtY291bnRzWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1afSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSBub3QgdG8KLXByaW50IGEgdGFsbHkgb2YgZnVuY3Rpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggd2FzIGNhbGxlZC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCB0YWxseSwgYnV0IGV4Y2x1ZGUgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLS1mdW5jdGlvbi1vcmRlcmluZwotVGhlIEBzYW1wey0tZnVuY3Rpb24tb3JkZXJpbmd9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGEKLXN1Z2dlc3RlZCBmdW5jdGlvbiBvcmRlcmluZyBmb3IgdGhlIHByb2dyYW0gYmFzZWQgb24gcHJvZmlsaW5nIGRhdGEuCi1UaGlzIG9wdGlvbiBzdWdnZXN0cyBhbiBvcmRlcmluZyB3aGljaCBtYXkgaW1wcm92ZSBwYWdpbmcsIHRsYiBhbmQKLWNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJvZ3JhbSBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgYXJiaXRyYXJ5Ci1vcmRlcmluZyBvZiBmdW5jdGlvbnMgaW4gYW4gZXhlY3V0YWJsZS4KLQotVGhlIGV4YWN0IGRldGFpbHMgb2YgaG93IHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gcGxhY2UgZnVuY3Rpb25zCi1pbiBhIHBhcnRpY3VsYXIgb3JkZXIgaXMgc3lzdGVtIGRlcGVuZGVudCBhbmQgb3V0IG9mIHRoZSBzY29wZSBvZiB0aGlzCi1tYW51YWwuCi0KLUBpdGVtIC0tZmlsZS1vcmRlcmluZyBAdmFye21hcF9maWxlfQotVGhlIEBzYW1wey0tZmlsZS1vcmRlcmluZ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYQotc3VnZ2VzdGVkIC5vIGxpbmsgbGluZSBvcmRlcmluZyBmb3IgdGhlIHByb2dyYW0gYmFzZWQgb24gcHJvZmlsaW5nIGRhdGEuCi1UaGlzIG9wdGlvbiBzdWdnZXN0cyBhbiBvcmRlcmluZyB3aGljaCBtYXkgaW1wcm92ZSBwYWdpbmcsIHRsYiBhbmQKLWNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJvZ3JhbSBvbiBzeXN0ZW1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IGFyYml0cmFyeQotb3JkZXJpbmcgb2YgZnVuY3Rpb25zIGluIGFuIGV4ZWN1dGFibGUuCi0KLVVzZSBvZiB0aGUgQHNhbXB7LWF9IGFyZ3VtZW50IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRoIHRoaXMgb3B0aW9uLgotCi1UaGUgQHZhcnttYXBfZmlsZX0gYXJndW1lbnQgaXMgYSBwYXRobmFtZSB0byBhIGZpbGUgd2hpY2ggcHJvdmlkZXMKLWZ1bmN0aW9uIG5hbWUgdG8gb2JqZWN0IGZpbGUgbWFwcGluZ3MuICBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzIHNpbWlsYXIgdG8KLXRoZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gQGNvZGV7bm19LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWMtcGFyc2UubzowMDAwMDAwMCBUIHl5cGFyc2UKLWMtcGFyc2UubzowMDAwMDAwNCBDIHl5ZXJyZmxhZwotYy1sYW5nLm86MDAwMDAwMDAgVCBtYXliZV9vYmpjX21ldGhvZF9uYW1lCi1jLWxhbmcubzowMDAwMDAwMCBUIHByaW50X2xhbmdfc3RhdGlzdGljcwotYy1sYW5nLm86MDAwMDAwMDAgVCByZWNvZ25pemVfb2JqY19rZXl3b3JkCi1jLWRlY2wubzowMDAwMDAwMCBUIHByaW50X2xhbmdfaWRlbnRpZmllcgotYy1kZWNsLm86MDAwMDAwMDAgVCBwcmludF9sYW5nX3R5cGUKLUBkb3Rze30KLQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotR05VIEBjb2Rle25tfSBAc2FtcHstLWV4dGVybi1vbmx5fSBAc2FtcHstLWRlZmluZWQtb25seX0gQHNhbXB7LXZ9IEBzYW1wey0tcHJpbnQtZmlsZS1uYW1lfSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgQHZhcnttYXBfZmlsZX0uCi0KLUBpdGVtIC1UCi1AaXRlbXggLS10cmFkaXRpb25hbAotVGhlIEBzYW1wey1UfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBpdHMgb3V0cHV0IGluCi1gYHRyYWRpdGlvbmFsJycgQlNEIHN0eWxlLgotCi1AaXRlbSAtdyBAdmFye3dpZHRofQotQGl0ZW14IC0td2lkdGg9QHZhcnt3aWR0aH0KLVNldHMgd2lkdGggb2Ygb3V0cHV0IGxpbmVzIHRvIEB2YXJ7d2lkdGh9LgotQ3VycmVudGx5IG9ubHkgdXNlZCB3aGVuIHByaW50aW5nIHRoZSBmdW5jdGlvbiBpbmRleCBhdCB0aGUgYm90dG9tCi1vZiB0aGUgY2FsbCBncmFwaC4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWFsbC1saW5lcwotVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotQnkgZGVmYXVsdCwgb25seSB0aGUgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJhc2ljLWJsb2NrCi1hcmUgYW5ub3RhdGVkLiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCBldmVyeSBsaW5lIGluCi1hIGJhc2ljLWJsb2NrIGlzIGFubm90YXRlZCBieSByZXBlYXRpbmcgdGhlIGFubm90YXRpb24gZm9yIHRoZQotZmlyc3QgbGluZS4gIFRoaXMgYmVoYXZpb3IgaXMgc2ltaWxhciB0byBAY29kZXt0Y292fSdzIEBzYW1wey1hfS4KLQotQGl0ZW0gLS1kZW1hbmdsZQotQGl0ZW14IC0tbm8tZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIEMrKyBzeW1ib2wgbmFtZXMgc2hvdWxkIGJlIGRlbWFuZ2xlZCB3aGVuCi1wcmludGluZyBvdXRwdXQuICBUaGUgZGVmYXVsdCBpcyB0byBkZW1hbmdsZSBzeW1ib2xzLiAgVGhlCi1AY29kZXstLW5vLWRlbWFuZ2xlfSBvcHRpb24gbWF5IGJlIHVzZWQgdG8gdHVybiBvZmYgZGVtYW5nbGluZy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBBbmFseXNpcyBPcHRpb25zLE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxPdXRwdXQgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gQW5hbHlzaXMgT3B0aW9ucwotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLWEKLUBpdGVteCAtLW5vLXN0YXRpYwotVGhlIEBzYW1wey1hfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdXBwcmVzcyB0aGUgcHJpbnRpbmcgb2YKLXN0YXRpY2FsbHkgZGVjbGFyZWQgKHByaXZhdGUpIGZ1bmN0aW9ucy4gIChUaGVzZSBhcmUgZnVuY3Rpb25zIHdob3NlCi1uYW1lcyBhcmUgbm90IGxpc3RlZCBhcyBnbG9iYWwsIGFuZCB3aGljaCBhcmUgbm90IHZpc2libGUgb3V0c2lkZSB0aGUKLWZpbGUvZnVuY3Rpb24vYmxvY2sgd2hlcmUgdGhleSB3ZXJlIGRlZmluZWQuKSAgVGltZSBzcGVudCBpbiB0aGVzZQotZnVuY3Rpb25zLCBjYWxscyB0by9mcm9tIHRoZW0sIGV0Yywgd2lsbCBhbGwgYmUgYXR0cmlidXRlZCB0byB0aGUKLWZ1bmN0aW9uIHRoYXQgd2FzIGxvYWRlZCBkaXJlY3RseSBiZWZvcmUgaXQgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZS4KLUBjIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFVuaXggQGNvZGV7Z3Byb2Z9LCBidXQgYSBiYWQgaWRlYS4gIAotVGhpcyBvcHRpb24gYWZmZWN0cyBib3RoIHRoZSBmbGF0IHByb2ZpbGUgYW5kIHRoZSBjYWxsIGdyYXBoLgotCi1AaXRlbSAtYwotQGl0ZW14IC0tc3RhdGljLWNhbGwtZ3JhcGgKLVRoZSBAc2FtcHstY30gb3B0aW9uIGNhdXNlcyB0aGUgY2FsbCBncmFwaCBvZiB0aGUgcHJvZ3JhbSB0byBiZQotYXVnbWVudGVkIGJ5IGEgaGV1cmlzdGljIHdoaWNoIGV4YW1pbmVzIHRoZSB0ZXh0IHNwYWNlIG9mIHRoZSBvYmplY3QKLWZpbGUgYW5kIGlkZW50aWZpZXMgZnVuY3Rpb24gY2FsbHMgaW4gdGhlIGJpbmFyeSBtYWNoaW5lIGNvZGUuCi1TaW5jZSBub3JtYWwgY2FsbCBncmFwaCByZWNvcmRzIGFyZSBvbmx5IGdlbmVyYXRlZCB3aGVuIGZ1bmN0aW9ucyBhcmUKLWVudGVyZWQsIHRoaXMgb3B0aW9uIGlkZW50aWZpZXMgY2hpbGRyZW4gdGhhdCBjb3VsZCBoYXZlIGJlZW4gY2FsbGVkLAotYnV0IG5ldmVyIHdlcmUuICBDYWxscyB0byBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5vdCBjb21waWxlZCB3aXRoCi1wcm9maWxpbmcgZW5hYmxlZCBhcmUgYWxzbyBpZGVudGlmaWVkLCBidXQgb25seSBpZiBzeW1ib2wgdGFibGUKLWVudHJpZXMgYXJlIHByZXNlbnQgZm9yIHRoZW0uCi1DYWxscyB0byBkeW5hbWljIGxpYnJhcnkgcm91dGluZXMgYXJlIHR5cGljYWxseSBAZW1waHtub3R9IGZvdW5kCi1ieSB0aGlzIG9wdGlvbi4KLVBhcmVudHMgb3IgY2hpbGRyZW4gaWRlbnRpZmllZCB2aWEgdGhpcyBoZXVyaXN0aWMKLWFyZSBpbmRpY2F0ZWQgaW4gdGhlIGNhbGwgZ3JhcGggd2l0aCBjYWxsIGNvdW50cyBvZiBAc2FtcHswfS4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLWlnbm9yZS1ub24tZnVuY3Rpb25zCi1UaGUgQHNhbXB7LUR9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGlnbm9yZSBzeW1ib2xzIHdoaWNoCi1hcmUgbm90IGtub3duIHRvIGJlIGZ1bmN0aW9ucy4gIFRoaXMgb3B0aW9uIHdpbGwgZ2l2ZSBtb3JlIGFjY3VyYXRlCi1wcm9maWxlIGRhdGEgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBzdXBwb3J0ZWQgKFNvbGFyaXMgYW5kIEhQVVggZm9yCi1leGFtcGxlKS4KLQotQGl0ZW0gLWsgQHZhcntmcm9tfS9AdmFye3RvfQotVGhlIEBzYW1wey1rfSBvcHRpb24gYWxsb3dzIHlvdSB0byBkZWxldGUgZnJvbSB0aGUgY2FsbCBncmFwaCBhbnkgYXJjcyBmcm9tCi1zeW1ib2xzIG1hdGNoaW5nIHN5bXNwZWMgQHZhcntmcm9tfSB0byB0aG9zZSBtYXRjaGluZyBzeW1zcGVjIEB2YXJ7dG99LgotCi1AaXRlbSAtbAotQGl0ZW14IC0tbGluZQotVGhlIEBzYW1wey1sfSBvcHRpb24gZW5hYmxlcyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCB3aGljaCBjYXVzZXMKLWhpc3RvZ3JhbSBoaXRzIHRvIGJlIGNoYXJnZWQgdG8gaW5kaXZpZHVhbCBzb3VyY2UgY29kZSBsaW5lcywKLWluc3RlYWQgb2YgZnVuY3Rpb25zLgotSWYgdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkIHdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgZW5hYmxlZCwKLXRoaXMgb3B0aW9uIHdpbGwgYWxzbyBpZGVudGlmeSBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUgb2YKLWNvZGUgd2FzIGV4ZWN1dGVkLgotV2hpbGUgbGluZS1ieS1saW5lIHByb2ZpbGluZyBjYW4gaGVscCBpc29sYXRlIHdoZXJlIGluIGEgbGFyZ2UgZnVuY3Rpb24KLWEgcHJvZ3JhbSBpcyBzcGVuZGluZyBpdHMgdGltZSwgaXQgYWxzbyBzaWduaWZpY2FudGx5IGluY3JlYXNlcwotdGhlIHJ1bm5pbmcgdGltZSBvZiBAY29kZXtncHJvZn0sIGFuZCBtYWduaWZpZXMgc3RhdGlzdGljYWwKLWluYWNjdXJhY2llcy4KLUB4cmVme1NhbXBsaW5nIEVycm9yfS4KLQotQGl0ZW0gLW0gQHZhcntudW19Ci1AaXRlbXggLS1taW4tY291bnQ9QHZhcntudW19Ci1UaGlzIG9wdGlvbiBhZmZlY3RzIGV4ZWN1dGlvbiBjb3VudCBvdXRwdXQgb25seS4KLVN5bWJvbHMgdGhhdCBhcmUgZXhlY3V0ZWQgbGVzcyB0aGFuIEB2YXJ7bnVtfSB0aW1lcyBhcmUgc3VwcHJlc3NlZC4KLQotQGl0ZW0gLW5bQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLXRpbWVbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LW59IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9LCBpbiBpdHMgY2FsbCBncmFwaCBhbmFseXNpcywKLXRvIG9ubHkgcHJvcGFnYXRlIHRpbWVzIGZvciBzeW1ib2xzIG1hdGNoaW5nIEB2YXJ7c3ltc3BlY30uCi0KLUBpdGVtIC1OW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby10aW1lWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1ufSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSwgaW4gaXRzIGNhbGwgZ3JhcGggYW5hbHlzaXMsCi1ub3QgdG8gcHJvcGFnYXRlIHRpbWVzIGZvciBzeW1ib2xzIG1hdGNoaW5nIEB2YXJ7c3ltc3BlY30uCi0KLUBpdGVtIC16Ci1AaXRlbXggLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnMKLUlmIHlvdSBnaXZlIHRoZSBAc2FtcHsten0gb3B0aW9uLCBAY29kZXtncHJvZn0gd2lsbCBtZW50aW9uIGFsbAotZnVuY3Rpb25zIGluIHRoZSBmbGF0IHByb2ZpbGUsIGV2ZW4gdGhvc2UgdGhhdCB3ZXJlIG5ldmVyIGNhbGxlZCwgYW5kCi10aGF0IGhhZCBubyB0aW1lIHNwZW50IGluIHRoZW0uICBUaGlzIGlzIHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotQHNhbXB7LWN9IG9wdGlvbiBmb3IgZGlzY292ZXJpbmcgd2hpY2ggcm91dGluZXMgd2VyZSBuZXZlciBjYWxsZWQuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgTWlzY2VsbGFuZW91cyBPcHRpb25zLERlcHJpY2F0ZWQgT3B0aW9ucyxBbmFseXNpcyBPcHRpb25zLEludm9raW5nCi1Ac2VjdGlvbiBNaXNjZWxsYW5lb3VzIE9wdGlvbnMKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1kW0B2YXJ7bnVtfV0KLUBpdGVteCAtLWRlYnVnWz1AdmFye251bX1dCi1UaGUgQHNhbXB7LWQgQHZhcntudW19fSBvcHRpb24gc3BlY2lmaWVzIGRlYnVnZ2luZyBvcHRpb25zLgotSWYgQHZhcntudW19IGlzIG5vdCBzcGVjaWZpZWQsIGVuYWJsZSBhbGwgZGVidWdnaW5nLgotQHhyZWZ7RGVidWdnaW5nfS4KLQotQGl0ZW0gLU9AdmFye25hbWV9Ci1AaXRlbXggLS1maWxlLWZvcm1hdD1AdmFye25hbWV9Ci1TZWxlY3RzIHRoZSBmb3JtYXQgb2YgdGhlIHByb2ZpbGUgZGF0YSBmaWxlcy4gIFJlY29nbml6ZWQgZm9ybWF0cyBhcmUKLUBzYW1we2F1dG99ICh0aGUgZGVmYXVsdCksIEBzYW1we2JzZH0sIEBzYW1wezQuNGJzZH0sIEBzYW1we21hZ2ljfSwgYW5kCi1Ac2FtcHtwcm9mfSAobm90IHlldCBzdXBwb3J0ZWQpLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tc3VtCi1UaGUgQHNhbXB7LXN9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1bW1hcml6ZSB0aGUgaW5mb3JtYXRpb24KLWluIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMgaXQgcmVhZCBpbiwgYW5kIHdyaXRlIG91dCBhIHByb2ZpbGUgZGF0YQotZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5zdW19LCB3aGljaCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGZyb20KLXRoZSBwcm9maWxlIGRhdGEgZmlsZXMgdGhhdCBAY29kZXtncHJvZn0gcmVhZCBpbi4gIFRoZSBmaWxlIEBmaWxle2dtb24uc3VtfQotbWF5IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IGZpbGVzOyB0aGUgZWZmZWN0IG9mIHRoaXMgaXMgdG8KLW1lcmdlIHRoZSBkYXRhIGluIHRoZSBvdGhlciBpbnB1dCBmaWxlcyBpbnRvIEBmaWxle2dtb24uc3VtfS4KLQotRXZlbnR1YWxseSB5b3UgY2FuIHJ1biBAY29kZXtncHJvZn0gYWdhaW4gd2l0aG91dCBAc2FtcHstc30gdG8gYW5hbHl6ZSB0aGUKLWN1bXVsYXRpdmUgZGF0YSBpbiB0aGUgZmlsZSBAZmlsZXtnbW9uLnN1bX0uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1UaGUgQHNhbXB7LXZ9IGZsYWcgY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCB0aGUgY3VycmVudCB2ZXJzaW9uCi1udW1iZXIsIGFuZCB0aGVuIGV4aXQuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgRGVwcmljYXRlZCBPcHRpb25zLFN5bXNwZWNzLE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gRGVwcmljYXRlZCBPcHRpb25zCi0KLUB0YWJsZSBAY29kZQotCi1UaGVzZSBvcHRpb25zIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIG5ld2VyIHZlcnNpb25zIHRoYXQgdXNlIHN5bXNwZWNzLgotCi1AaXRlbSAtZSBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQHNhbXB7LWUgQHZhcntmdW5jdGlvbn19IG9wdGlvbiB0ZWxscyBAY29kZXtncHJvZn0gdG8gbm90IHByaW50Ci1pbmZvcm1hdGlvbiBhYm91dCB0aGUgZnVuY3Rpb24gQHZhcntmdW5jdGlvbl9uYW1lfSAoYW5kIGl0cwotY2hpbGRyZW5AZG90c3t9KSBpbiB0aGUgY2FsbCBncmFwaC4gIFRoZSBmdW5jdGlvbiB3aWxsIHN0aWxsIGJlIGxpc3RlZAotYXMgYSBjaGlsZCBvZiBhbnkgZnVuY3Rpb25zIHRoYXQgY2FsbCBpdCwgYnV0IGl0cyBpbmRleCBudW1iZXIgd2lsbCBiZQotc2hvd24gYXMgQHNhbXB7W25vdCBwcmludGVkXX0uICBNb3JlIHRoYW4gb25lIEBzYW1wey1lfSBvcHRpb24gbWF5IGJlCi1naXZlbjsgb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaCBAc2FtcHstZX0KLW9wdGlvbi4gCi0KLUBpdGVtIC1FIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAY29kZXstRSBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHdvcmtzIGxpa2UgdGhlIEBjb2Rley1lfSBvcHRpb24sIGJ1dAotdGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24gKGFuZCBjaGlsZHJlbiB3aG8gd2VyZSBub3QgY2FsbGVkIGZyb20KLWFueXdoZXJlIGVsc2UpLCB3aWxsIG5vdCBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHBlcmNlbnRhZ2VzLW9mLXRpbWUgZm9yCi10aGUgY2FsbCBncmFwaC4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LUV9IG9wdGlvbiBtYXkgYmUgZ2l2ZW47IG9ubHkgb25lCi1AdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1FfSBvcHRpb24uCi0KLUBpdGVtIC1mIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAc2FtcHstZiBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gbGltaXQgdGhlCi1jYWxsIGdyYXBoIHRvIHRoZSBmdW5jdGlvbiBAdmFye2Z1bmN0aW9uX25hbWV9IGFuZCBpdHMgY2hpbGRyZW4gKGFuZAotdGhlaXIgY2hpbGRyZW5AZG90c3t9KS4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LWZ9IG9wdGlvbiBtYXkgYmUgZ2l2ZW47Ci1vbmx5IG9uZSBAdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1mfQotb3B0aW9uLiAgCi0KLUBpdGVtIC1GIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAc2FtcHstRiBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHdvcmtzIGxpa2UgdGhlIEBjb2Rley1mfSBvcHRpb24sIGJ1dAotb25seSB0aW1lIHNwZW50IGluIHRoZSBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuIChhbmQgdGhlaXIKLWNoaWxkcmVuQGRvdHN7fSkgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0b3RhbC10aW1lIGFuZAotcGVyY2VudGFnZXMtb2YtdGltZSBmb3IgdGhlIGNhbGwgZ3JhcGguICBNb3JlIHRoYW4gb25lIEBzYW1wey1GfSBvcHRpb24KLW1heSBiZSBnaXZlbjsgb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaAotQHNhbXB7LUZ9IG9wdGlvbi4gIFRoZSBAc2FtcHstRn0gb3B0aW9uIG92ZXJyaWRlcyB0aGUgQHNhbXB7LUV9IG9wdGlvbi4KLQotQGVuZCB0YWJsZQotCi1Ob3RlIHRoYXQgb25seSBvbmUgZnVuY3Rpb24gY2FuIGJlIHNwZWNpZmllZCB3aXRoIGVhY2ggQGNvZGV7LWV9LAotQGNvZGV7LUV9LCBAY29kZXstZn0gb3IgQGNvZGV7LUZ9IG9wdGlvbi4gIFRvIHNwZWNpZnkgbW9yZSB0aGFuIG9uZQotZnVuY3Rpb24sIHVzZSBtdWx0aXBsZSBvcHRpb25zLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29tbWFuZDoKLQotQGV4YW1wbGUKLWdwcm9mIC1lIGJvcmluZyAtZiBmb28gLWYgYmFyIG15cHJvZ3JhbSA+IGdwcm9mLm91dHB1dAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotbGlzdHMgaW4gdGhlIGNhbGwgZ3JhcGggYWxsIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcmVhY2hlZCBmcm9tIGVpdGhlcgotQGNvZGV7Zm9vfSBvciBAY29kZXtiYXJ9IGFuZCB3ZXJlIG5vdCByZWFjaGFibGUgZnJvbSBAY29kZXtib3Jpbmd9LgotCi1Abm9kZSBTeW1zcGVjcywsRGVwcmljYXRlZCBPcHRpb25zLEludm9raW5nCi1Ac2VjdGlvbiBTeW1zcGVjcwotCi1NYW55IG9mIHRoZSBvdXRwdXQgb3B0aW9ucyBhbGxvdyBmdW5jdGlvbnMgdG8gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKLXVzaW5nIEBkZm57c3ltc3BlY3N9IChzeW1ib2wgc3BlY2lmaWNhdGlvbnMpLCB3aGljaCBvYnNlcnZlIHRoZQotZm9sbG93aW5nIHN5bnRheDoKLQotQGV4YW1wbGUKLSAgZmlsZW5hbWVfY29udGFpbmluZ19hX2RvdAotfCBmdW5jbmFtZV9ub3RfY29udGFpbmluZ19hX2RvdAotfCBsaW5lbnVtYmVyCi18ICggWyBhbnlfZmlsZW5hbWUgXSBgOicgKCBhbnlfZnVuY25hbWUgfCBsaW5lbnVtYmVyICkgKQotQGVuZCBleGFtcGxlCi0KLUhlcmUgYXJlIHNvbWUgc2FtcGxlIHN5bXNwZWNzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIG1haW4uYwotU2VsZWN0cyBldmVyeXRoaW5nIGluIGZpbGUgQGZpbGV7bWFpbi5jfS0tLXRoZQotZG90IGluIHRoZSBzdHJpbmcgdGVsbHMgZ3Byb2YgdG8gaW50ZXJwcmV0Ci10aGUgc3RyaW5nIGFzIGEgZmlsZW5hbWUsIHJhdGhlciB0aGFuIGFzCi1hIGZ1bmN0aW9uIG5hbWUuICBUbyBzZWxlY3QgYSBmaWxlIHdob3NlCi1uYW1lIGRvZXMgbm90IGNvbnRhaW4gYSBkb3QsIGEgdHJhaWxpbmcgY29sb24KLXNob3VsZCBiZSBzcGVjaWZpZWQuICBGb3IgZXhhbXBsZSwgQHNhbXB7b2RkOn0gaXMKLWludGVycHJldGVkIGFzIHRoZSBmaWxlIG5hbWVkIEBmaWxle29kZH0uCi0KLUBpdGVtIG1haW4KLVNlbGVjdHMgYWxsIGZ1bmN0aW9ucyBuYW1lZCBAc2FtcHttYWlufS4KLQotTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZnVuY3Rpb24gbmFtZQotYmVjYXVzZSBzb21lIG9mIHRoZSBkZWZpbml0aW9ucyBtYXkgYmUgbG9jYWwgKGkuZS4sIHN0YXRpYykuICBVbmxlc3MgYQotZnVuY3Rpb24gbmFtZSBpcyB1bmlxdWUgaW4gYSBwcm9ncmFtLCB5b3UgbXVzdCB1c2UgdGhlIGNvbG9uIG5vdGF0aW9uCi1leHBsYWluZWQgYmVsb3cgdG8gc3BlY2lmeSBhIGZ1bmN0aW9uIGZyb20gYSBzcGVjaWZpYyBzb3VyY2UgZmlsZS4KLQotU29tZXRpbWVzLCBmdW5jdGlvbiBuYW1lcyBjb250YWluIGRvdHMuICBJbiBzdWNoIGNhc2VzLCBpdCBpcyBuZWNlc3NhcnkKLXRvIGFkZCBhIGxlYWRpbmcgY29sb24gdG8gdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgQHNhbXB7Oi5tdWx9IHNlbGVjdHMKLWZ1bmN0aW9uIEBzYW1wey5tdWx9LgotCi1JbiBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMsIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4gIGdwcm9mCi13aWxsIG5vcm1hbGx5IG5vdCBwcmludCB0aGVzZSB1bmRlcnNjb3Jlcy4gIEhvd2V2ZXIsIHlvdSBtdXN0IHVzZSB0aGUKLXVuZGVyc2NvcmUgd2hlbiB5b3UgbmFtZSBhIHN5bWJvbCBpbiBhIHN5bXNwZWMuICBZb3UgY2FuIHVzZSB0aGUKLUBjb2Rle25tfSBwcm9ncmFtIHRvIHNlZSB3aGV0aGVyIHN5bWJvbHMgaGF2ZSB1bmRlcnNjb3JlcyBmb3IgdGhlIG9iamVjdAotZmlsZSBmb3JtYXQgeW91IGFyZSB1c2luZy4KLQotQGl0ZW0gbWFpbi5jOm1haW4KLVNlbGVjdHMgZnVuY3Rpb24gQHNhbXB7bWFpbn0gaW4gZmlsZSBAZmlsZXttYWluLmN9LgotCi1AaXRlbSBtYWluLmM6MTM0Ci1TZWxlY3RzIGxpbmUgMTM0IGluIGZpbGUgQGZpbGV7bWFpbi5jfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgT3V0cHV0Ci1AY2hhcHRlciBJbnRlcnByZXRpbmcgQGNvZGV7Z3Byb2Z9J3MgT3V0cHV0Ci0KLUBjb2Rle2dwcm9mfSBjYW4gcHJvZHVjZSBzZXZlcmFsIGRpZmZlcmVudCBvdXRwdXQgc3R5bGVzLCB0aGUKLW1vc3QgaW1wb3J0YW50IG9mIHdoaWNoIGFyZSBkZXNjcmliZWQgYmVsb3cuICBUaGUgc2ltcGxlc3Qgb3V0cHV0Ci1zdHlsZXMgKGZpbGUgaW5mb3JtYXRpb24sIGV4ZWN1dGlvbiBjb3VudCwgYW5kIGZ1bmN0aW9uIGFuZCBmaWxlIG9yZGVyaW5nKQotYXJlIG5vdCBkZXNjcmliZWQgaGVyZSwgYnV0IGFyZSBkb2N1bWVudGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgb3B0aW9ucwotdGhhdCB0cmlnZ2VyIHRoZW0uCi1AeHJlZntPdXRwdXQgT3B0aW9uc30uCi0KLUBtZW51Ci0qIEZsYXQgUHJvZmlsZTo6ICAgICAgICBUaGUgZmxhdCBwcm9maWxlIHNob3dzIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nIGRpcmVjdGx5IGluIGVhY2ggZnVuY3Rpb24uCi0qIENhbGwgR3JhcGg6OiAgICAgICAgICBUaGUgY2FsbCBncmFwaCBzaG93cyB3aGljaCBmdW5jdGlvbnMgY2FsbGVkIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJzLCBhbmQgaG93IG11Y2ggdGltZSBlYWNoIGZ1bmN0aW9uIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGl0cyBzdWJyb3V0aW5lIGNhbGxzIGFyZSBpbmNsdWRlZC4KLSogTGluZS1ieS1saW5lOjogICAgICAgIEBjb2Rle2dwcm9mfSBjYW4gYW5hbHl6ZSBpbmRpdmlkdWFsIHNvdXJjZSBjb2RlIGxpbmVzCi0qIEFubm90YXRlZCBTb3VyY2U6OiAgICBUaGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIGRpc3BsYXlzIHNvdXJjZSBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxlZCB3aXRoIGV4ZWN1dGlvbiBjb3VudHMKLUBlbmQgbWVudQotCi0KLUBub2RlIEZsYXQgUHJvZmlsZSxDYWxsIEdyYXBoLCxPdXRwdXQKLUBzZWN0aW9uIFRoZSBGbGF0IFByb2ZpbGUKLUBjaW5kZXggZmxhdCBwcm9maWxlCi0KLVRoZSBAZGZue2ZsYXQgcHJvZmlsZX0gc2hvd3MgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHlvdXIgcHJvZ3JhbQotc3BlbnQgZXhlY3V0aW5nIGVhY2ggZnVuY3Rpb24uICBVbmxlc3MgdGhlIEBzYW1wey16fSBvcHRpb24gaXMgZ2l2ZW4sCi1mdW5jdGlvbnMgd2l0aCBubyBhcHBhcmVudCB0aW1lIHNwZW50IGluIHRoZW0sIGFuZCBubyBhcHBhcmVudCBjYWxscwotdG8gdGhlbSwgYXJlIG5vdCBtZW50aW9uZWQuICBOb3RlIHRoYXQgaWYgYSBmdW5jdGlvbiB3YXMgbm90IGNvbXBpbGVkCi1mb3IgcHJvZmlsaW5nLCBhbmQgZGlkbid0IHJ1biBsb25nIGVub3VnaCB0byBzaG93IHVwIG9uIHRoZSBwcm9ncmFtCi1jb3VudGVyIGhpc3RvZ3JhbSwgaXQgd2lsbCBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgZnVuY3Rpb24gdGhhdAotd2FzIG5ldmVyIGNhbGxlZC4KLQotVGhpcyBpcyBwYXJ0IG9mIGEgZmxhdCBwcm9maWxlIGZvciBhIHNtYWxsIHByb2dyYW06Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotRmxhdCBwcm9maWxlOgotCi1FYWNoIHNhbXBsZSBjb3VudHMgYXMgMC4wMSBzZWNvbmRzLgotICAlICAgY3VtdWxhdGl2ZSAgIHNlbGYgICAgICAgICAgICAgIHNlbGYgICAgIHRvdGFsICAgICAgICAgICAKLSB0aW1lICAgc2Vjb25kcyAgIHNlY29uZHMgICAgY2FsbHMgIG1zL2NhbGwgIG1zL2NhbGwgIG5hbWUgICAgCi0gMzMuMzQgICAgICAwLjAyICAgICAwLjAyICAgICA3MjA4ICAgICAwLjAwICAgICAwLjAwICBvcGVuCi0gMTYuNjcgICAgICAwLjAzICAgICAwLjAxICAgICAgMjQ0ICAgICAwLjA0ICAgICAwLjEyICBvZmZ0aW1lCi0gMTYuNjcgICAgICAwLjA0ICAgICAwLjAxICAgICAgICA4ICAgICAxLjI1ICAgICAxLjI1ICBtZW1jY3B5Ci0gMTYuNjcgICAgICAwLjA1ICAgICAwLjAxICAgICAgICA3ICAgICAxLjQzICAgICAxLjQzICB3cml0ZQotIDE2LjY3ICAgICAgMC4wNiAgICAgMC4wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNvdW50Ci0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgMjM2ICAgICAwLjAwICAgICAwLjAwICB0enNldAotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgIDE5MiAgICAgMC4wMCAgICAgMC4wMCAgdG9sb3dlcgotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICA0NyAgICAgMC4wMCAgICAgMC4wMCAgc3RybGVuCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgIDQ1ICAgICAwLjAwICAgICAwLjAwICBzdHJjaHIKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgNTAuMDAgIG1haW4KLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgIDAuMDAgIG1lbWNweQotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICAxMC4xMSAgcHJpbnQKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgIDAuMDAgIHByb2ZpbAotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICA1MC4wMCAgcmVwb3J0Ci1AZG90c3t9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBmdW5jdGlvbnMgYXJlIHNvcnRlZCBieSBmaXJzdCBieSBkZWNyZWFzaW5nIHJ1bi10aW1lIHNwZW50IGluIHRoZW0sCi10aGVuIGJ5IGRlY3JlYXNpbmcgbnVtYmVyIG9mIGNhbGxzLCB0aGVuIGFscGhhYmV0aWNhbGx5IGJ5IG5hbWUuICBUaGUKLWZ1bmN0aW9ucyBAc2FtcHttY291bnR9IGFuZCBAc2FtcHtwcm9maWx9IGFyZSBwYXJ0IG9mIHRoZSBwcm9maWxpbmcKLWFwYXJhdHVzIGFuZCBhcHBlYXIgaW4gZXZlcnkgZmxhdCBwcm9maWxlOyB0aGVpciB0aW1lIGdpdmVzIGEgbWVhc3VyZSBvZgotdGhlIGFtb3VudCBvZiBvdmVyaGVhZCBkdWUgdG8gcHJvZmlsaW5nLgotCi1KdXN0IGJlZm9yZSB0aGUgY29sdW1uIGhlYWRlcnMsIGEgc3RhdGVtZW50IGFwcGVhcnMgaW5kaWNhdGluZwotaG93IG11Y2ggdGltZSBlYWNoIHNhbXBsZSBjb3VudGVkIGFzLgotVGhpcyBAZGZue3NhbXBsaW5nIHBlcmlvZH0gZXN0aW1hdGVzIHRoZSBtYXJnaW4gb2YgZXJyb3IgaW4gZWFjaCBvZiB0aGUgdGltZQotZmlndXJlcy4gIEEgdGltZSBmaWd1cmUgdGhhdCBpcyBub3QgbXVjaCBsYXJnZXIgdGhhbiB0aGlzIGlzIG5vdAotcmVsaWFibGUuICBJbiB0aGlzIGV4YW1wbGUsIGVhY2ggc2FtcGxlIGNvdW50ZWQgYXMgMC4wMSBzZWNvbmRzLAotc3VnZ2VzdGluZyBhIDEwMCBIeiBzYW1wbGluZyByYXRlLgotVGhlIHByb2dyYW0ncyB0b3RhbCBleGVjdXRpb24gdGltZSB3YXMgMC4wNgotc2Vjb25kcywgYXMgaW5kaWNhdGVkIGJ5IHRoZSBAc2FtcHtjdW11bGF0aXZlIHNlY29uZHN9IGZpZWxkLiAgU2luY2UKLWVhY2ggc2FtcGxlIGNvdW50ZWQgZm9yIDAuMDEgc2Vjb25kcywgdGhpcyBtZWFucyBvbmx5IHNpeCBzYW1wbGVzCi13ZXJlIHRha2VuIGR1cmluZyB0aGUgcnVuLiAgVHdvIG9mIHRoZSBzYW1wbGVzIG9jY3VyZWQgd2hpbGUgdGhlCi1wcm9ncmFtIHdhcyBpbiB0aGUgQHNhbXB7b3Blbn0gZnVuY3Rpb24sIGFzIGluZGljYXRlZCBieSB0aGUKLUBzYW1we3NlbGYgc2Vjb25kc30gZmllbGQuICBFYWNoIG9mIHRoZSBvdGhlciBmb3VyIHNhbXBsZXMKLW9jY3VyZWQgb25lIGVhY2ggaW4gQHNhbXB7b2ZmdGltZX0sIEBzYW1we21lbWNjcHl9LCBAc2FtcHt3cml0ZX0sCi1hbmQgQHNhbXB7bWNvdW50fS4KLVNpbmNlIG9ubHkgc2l4IHNhbXBsZXMgd2VyZSB0YWtlbiwgbm9uZSBvZiB0aGVzZSB2YWx1ZXMgY2FuCi1iZSByZWdhcmRlZCBhcyBwYXJ0aWN1bGFybHkgcmVsaWFibGUuCi1JbiBhbm90aGVyIHJ1biwKLXRoZSBAc2FtcHtzZWxmIHNlY29uZHN9IGZpZWxkIGZvcgotQHNhbXB7bWNvdW50fSBtaWdodCB3ZWxsIGJlIEBzYW1wezAuMDB9IG9yIEBzYW1wezAuMDJ9LgotQHhyZWZ7U2FtcGxpbmcgRXJyb3J9LCBmb3IgYSBjb21wbGV0ZSBkaXNjdXNzaW9uLgotCi1UaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBpbiB0aGUgbGlzdGluZyAodGhvc2Ugd2hvc2UKLUBzYW1we3NlbGYgc2Vjb25kc30gZmllbGQgaXMgQHNhbXB7MC4wMH0pIGRpZG4ndCBhcHBlYXIKLWluIHRoZSBoaXN0b2dyYW0gc2FtcGxlcyBhdCBhbGwuICBIb3dldmVyLCB0aGUgY2FsbCBncmFwaAotaW5kaWNhdGVkIHRoYXQgdGhleSB3ZXJlIGNhbGxlZCwgc28gdGhlcmVmb3JlIHRoZXkgYXJlIGxpc3RlZCwKLXNvcnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyIGJ5IHRoZSBAc2FtcHtjYWxsc30gZmllbGQuCi1DbGVhcmx5IHNvbWUgdGltZSB3YXMgc3BlbnQgZXhlY3V0aW5nIHRoZXNlIGZ1bmN0aW9ucywKLWJ1dCB0aGUgcGF1Y2l0eSBvZiBoaXN0b2dyYW0gc2FtcGxlcyBwcmV2ZW50cyBhbnkKLWRldGVybWluYXRpb24gb2YgaG93IG11Y2ggdGltZSBlYWNoIHRvb2suCi0KLUhlcmUgaXMgd2hhdCB0aGUgZmllbGRzIGluIGVhY2ggbGluZSBtZWFuOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtICUgdGltZQotVGhpcyBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgeW91ciBwcm9ncmFtIHNwZW50Ci1pbiB0aGlzIGZ1bmN0aW9uLiAgVGhlc2Ugc2hvdWxkIGFsbCBhZGQgdXAgdG8gMTAwJS4KLQotQGl0ZW0gY3VtdWxhdGl2ZSBzZWNvbmRzCi1UaGlzIGlzIHRoZSBjdW11bGF0aXZlIHRvdGFsIG51bWJlciBvZiBzZWNvbmRzIHRoZSBjb21wdXRlciBzcGVudAotZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb25zLCBwbHVzIHRoZSB0aW1lIHNwZW50IGluIGFsbCB0aGUgZnVuY3Rpb25zCi1hYm92ZSB0aGlzIG9uZSBpbiB0aGlzIHRhYmxlLgotCi1AaXRlbSBzZWxmIHNlY29uZHMKLVRoaXMgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIGFjY291bnRlZCBmb3IgYnkgdGhpcyBmdW5jdGlvbiBhbG9uZS4KLVRoZSBmbGF0IHByb2ZpbGUgbGlzdGluZyBpcyBzb3J0ZWQgZmlyc3QgYnkgdGhpcyBudW1iZXIuCi0KLUBpdGVtIGNhbGxzCi1UaGlzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuICBJZiB0aGUKLWZ1bmN0aW9uIHdhcyBuZXZlciBjYWxsZWQsIG9yIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGNhbGxlZCBjYW5ub3QKLWJlIGRldGVybWluZWQgKHByb2JhYmx5IGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdhcyBub3QgY29tcGlsZWQgd2l0aAotcHJvZmlsaW5nIGVuYWJsZWQpLCB0aGUgQGRmbntjYWxsc30gZmllbGQgaXMgYmxhbmsuCi0KLUBpdGVtIHNlbGYgbXMvY2FsbAotVGhpcyByZXByZXNlbnRzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgaW4gdGhpcwotZnVuY3Rpb24gcGVyIGNhbGwsIGlmIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQuICBPdGhlcndpc2UsIHRoaXMgZmllbGQKLWlzIGJsYW5rIGZvciB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSB0b3RhbCBtcy9jYWxsCi1UaGlzIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1mdW5jdGlvbiBhbmQgaXRzIGRlc2NlbmRhbnRzIHBlciBjYWxsLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLgotT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIGlzIGJsYW5rIGZvciB0aGlzIGZ1bmN0aW9uLgotVGhpcyBpcyB0aGUgb25seSBmaWVsZCBpbiB0aGUgZmxhdCBwcm9maWxlIHRoYXQgdXNlcyBjYWxsIGdyYXBoIGFuYWx5c2lzLgotCi1AaXRlbSBuYW1lCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gICBUaGUgZmxhdCBwcm9maWxlIGlzIHNvcnRlZCBieSB0aGlzCi1maWVsZCBhbHBoYWJldGljYWxseSBhZnRlciB0aGUgQGRmbntzZWxmIHNlY29uZHN9IGFuZCBAZGZue2NhbGxzfQotZmllbGRzIGFyZSBzb3J0ZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIENhbGwgR3JhcGgsTGluZS1ieS1saW5lLEZsYXQgUHJvZmlsZSxPdXRwdXQKLUBzZWN0aW9uIFRoZSBDYWxsIEdyYXBoCi1AY2luZGV4IGNhbGwgZ3JhcGgKLQotVGhlIEBkZm57Y2FsbCBncmFwaH0gc2hvd3MgaG93IG11Y2ggdGltZSB3YXMgc3BlbnQgaW4gZWFjaCBmdW5jdGlvbgotYW5kIGl0cyBjaGlsZHJlbi4gIEZyb20gdGhpcyBpbmZvcm1hdGlvbiwgeW91IGNhbiBmaW5kIGZ1bmN0aW9ucyB0aGF0LAotd2hpbGUgdGhleSB0aGVtc2VsdmVzIG1heSBub3QgaGF2ZSB1c2VkIG11Y2ggdGltZSwgY2FsbGVkIG90aGVyCi1mdW5jdGlvbnMgdGhhdCBkaWQgdXNlIHVudXN1YWwgYW1vdW50cyBvZiB0aW1lLgotCi1IZXJlIGlzIGEgc2FtcGxlIGNhbGwgZnJvbSBhIHNtYWxsIHByb2dyYW0uICBUaGlzIGNhbGwgY2FtZSBmcm9tIHRoZQotc2FtZSBAY29kZXtncHJvZn0gcnVuIGFzIHRoZSBmbGF0IHByb2ZpbGUgZXhhbXBsZSBpbiB0aGUgcHJldmlvdXMKLWNoYXB0ZXIuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgMiBieXRlKHMpIGZvciAyMC4wMCUgb2YgMC4wNSBzZWNvbmRzCi0KLWluZGV4ICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BvbnRhbmVvdXM+Ci1bMV0gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgICAgICAgICAgICBzdGFydCBbMV0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzIgICAgICAgICAgIG9uX2V4aXQgWzI4XQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEgICAgICAgICAgIGV4aXQgWzU5XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBzdGFydCBbMV0KLVsyXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgcmVwb3J0IFszXQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBtYWluIFsyXQotWzNdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgcmVwb3J0IFszXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMyAgICAgICA4LzggICAgICAgICAgIHRpbWVsb2NhbCBbNl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDEgICAgICAgMS8xICAgICAgICAgICBwcmludCBbOV0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDEgICAgICAgOS85ICAgICAgICAgICBmZ2V0cyBbMTJdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgMTIvMzQgICAgICAgICAgc3RybmNtcCA8Y3ljbGUgMT4gWzQwXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA4LzggICAgICAgICAgIGxvb2t1cCBbMjBdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMSAgICAgICAgICAgZm9wZW4gWzIxXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA4LzggICAgICAgICAgIGNoZXd0aW1lIFsyNF0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgOC8xNiAgICAgICAgICBza2lwc3BhY2UgWzQ0XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVs0XSAgICAgNTkuOCAgICAwLjAxICAgICAgICAwLjAyICAgICAgIDgrNDcyICAgICA8Y3ljbGUgMiBhcyBhIHdob2xlPglbNF0KLSAgICAgICAgICAgICAgICAwLjAxICAgICAgICAwLjAyICAgICAyNDQrMjYwICAgICAgICAgb2ZmdGltZSA8Y3ljbGUgMj4gWzddCi0gICAgICAgICAgICAgICAgMC4wMCAgICAgICAgMC4wMCAgICAgMjM2KzEgICAgICAgICAgIHR6c2V0IDxjeWNsZSAyPiBbMjZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGxpbmVzIGZ1bGwgb2YgZGFzaGVzIGRpdmlkZSB0aGlzIHRhYmxlIGludG8gQGRmbntlbnRyaWVzfSwgb25lIGZvciBlYWNoCi1mdW5jdGlvbi4gIEVhY2ggZW50cnkgaGFzIG9uZSBvciBtb3JlIGxpbmVzLgotCi1JbiBlYWNoIGVudHJ5LCB0aGUgcHJpbWFyeSBsaW5lIGlzIHRoZSBvbmUgdGhhdCBzdGFydHMgd2l0aCBhbiBpbmRleCBudW1iZXIKLWluIHNxdWFyZSBicmFja2V0cy4gIFRoZSBlbmQgb2YgdGhpcyBsaW5lIHNheXMgd2hpY2ggZnVuY3Rpb24gdGhlIGVudHJ5IGlzCi1mb3IuICBUaGUgcHJlY2VkaW5nIGxpbmVzIGluIHRoZSBlbnRyeSBkZXNjcmliZSB0aGUgY2FsbGVycyBvZiB0aGlzCi1mdW5jdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBsaW5lcyBkZXNjcmliZSBpdHMgc3Vicm91dGluZXMgKGFsc28gY2FsbGVkCi1AZGZue2NoaWxkcmVufSB3aGVuIHdlIHNwZWFrIG9mIHRoZSBjYWxsIGdyYXBoKS4KLQotVGhlIGVudHJpZXMgYXJlIHNvcnRlZCBieSB0aW1lIHNwZW50IGluIHRoZSBmdW5jdGlvbiBhbmQgaXRzIHN1YnJvdXRpbmVzLgotCi1UaGUgaW50ZXJuYWwgcHJvZmlsaW5nIGZ1bmN0aW9uIEBjb2Rle21jb3VudH0gKEBweHJlZntGbGF0IFByb2ZpbGV9KQotaXMgbmV2ZXIgbWVudGlvbmVkIGluIHRoZSBjYWxsIGdyYXBoLgotCi1AbWVudQotKiBQcmltYXJ5OjogICAgICAgRGV0YWlscyBvZiB0aGUgcHJpbWFyeSBsaW5lJ3MgY29udGVudHMuCi0qIENhbGxlcnM6OiAgICAgICBEZXRhaWxzIG9mIGNhbGxlci1saW5lcycgY29udGVudHMuCi0qIFN1YnJvdXRpbmVzOjogICBEZXRhaWxzIG9mIHN1YnJvdXRpbmUtbGluZXMnIGNvbnRlbnRzLgotKiBDeWNsZXM6OiAgICAgICAgV2hlbiB0aGVyZSBhcmUgY3ljbGVzIG9mIHJlY3Vyc2lvbiwKLSAgICAgICAgICAgICAgICAgICBzdWNoIGFzIEBjb2Rle2F9IGNhbGxzIEBjb2Rle2J9IGNhbGxzIEBjb2Rle2F9QGRvdHN7fQotQGVuZCBtZW51Ci0KLUBub2RlIFByaW1hcnkKLUBzdWJzZWN0aW9uIFRoZSBQcmltYXJ5IExpbmUKLQotVGhlIEBkZm57cHJpbWFyeSBsaW5lfSBpbiBhIGNhbGwgZ3JhcGggZW50cnkgaXMgdGhlIGxpbmUgdGhhdAotZGVzY3JpYmVzIHRoZSBmdW5jdGlvbiB3aGljaCB0aGUgZW50cnkgaXMgYWJvdXQgYW5kIGdpdmVzIHRoZSBvdmVyYWxsCi1zdGF0aXN0aWNzIGZvciB0aGlzIGZ1bmN0aW9uLgotCi1Gb3IgcmVmZXJlbmNlLCB3ZSByZXBlYXQgdGhlIHByaW1hcnkgbGluZSBmcm9tIHRoZSBlbnRyeSBmb3IgZnVuY3Rpb24KLUBjb2Rle3JlcG9ydH0gaW4gb3VyIG1haW4gZXhhbXBsZSwgdG9nZXRoZXIgd2l0aCB0aGUgaGVhZGluZyBsaW5lIHRoYXQKLXNob3dzIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzOgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi1AZG90c3t9Ci1bM10gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICByZXBvcnQgWzNdCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1IZXJlIGlzIHdoYXQgdGhlIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBsaW5lIG1lYW46Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gaW5kZXgKLUVudHJpZXMgYXJlIG51bWJlcmVkIHdpdGggY29uc2VjdXRpdmUgaW50ZWdlcnMuICBFYWNoIGZ1bmN0aW9uCi10aGVyZWZvcmUgaGFzIGFuIGluZGV4IG51bWJlciwgd2hpY2ggYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cwotcHJpbWFyeSBsaW5lLgotCi1FYWNoIGNyb3NzLXJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLCBhcyBhIGNhbGxlciBvciBzdWJyb3V0aW5lIG9mCi1hbm90aGVyLCBnaXZlcyBpdHMgaW5kZXggbnVtYmVyIGFzIHdlbGwgYXMgaXRzIG5hbWUuICBUaGUgaW5kZXggbnVtYmVyCi1ndWlkZXMgeW91IGlmIHlvdSB3aXNoIHRvIGxvb2sgZm9yIHRoZSBlbnRyeSBmb3IgdGhhdCBmdW5jdGlvbi4KLQotQGl0ZW0gJSB0aW1lCi1UaGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCB0aW1lIHRoYXQgd2FzIHNwZW50IGluIHRoaXMKLWZ1bmN0aW9uLCBpbmNsdWRpbmcgdGltZSBzcGVudCBpbiBzdWJyb3V0aW5lcyBjYWxsZWQgZnJvbSB0aGlzCi1mdW5jdGlvbi4KLQotVGhlIHRpbWUgc3BlbnQgaW4gdGhpcyBmdW5jdGlvbiBpcyBjb3VudGVkIGFnYWluIGZvciB0aGUgY2FsbGVycyBvZgotdGhpcyBmdW5jdGlvbi4gIFRoZXJlZm9yZSwgYWRkaW5nIHVwIHRoZXNlIHBlcmNlbnRhZ2VzIGlzIG1lYW5pbmdsZXNzLgotCi1AaXRlbSBzZWxmCi1UaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uLiAgVGhpcwotc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGUgbnVtYmVyIHByaW50ZWQgaW4gdGhlIEBjb2Rle3NlY29uZHN9IGZpZWxkCi1mb3IgdGhpcyBmdW5jdGlvbiBpbiB0aGUgZmxhdCBwcm9maWxlLgotCi1AaXRlbSBjaGlsZHJlbgotVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gdGhlIHN1YnJvdXRpbmUgY2FsbHMgbWFkZSBieQotdGhpcyBmdW5jdGlvbi4gIFRoaXMgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBzdW0gb2YgYWxsIHRoZSBAY29kZXtzZWxmfQotYW5kIEBjb2Rle2NoaWxkcmVufSBlbnRyaWVzIG9mIHRoZSBjaGlsZHJlbiBsaXN0ZWQgZGlyZWN0bHkgYmVsb3cgdGhpcwotZnVuY3Rpb24uCi0KLUBpdGVtIGNhbGxlZAotVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLgotCi1JZiB0aGUgZnVuY3Rpb24gY2FsbGVkIGl0c2VsZiByZWN1cnNpdmVseSwgdGhlcmUgYXJlIHR3byBudW1iZXJzLAotc2VwYXJhdGVkIGJ5IGEgQHNhbXB7K30uICBUaGUgZmlyc3QgbnVtYmVyIGNvdW50cyBub24tcmVjdXJzaXZlIGNhbGxzLAotYW5kIHRoZSBzZWNvbmQgY291bnRzIHJlY3Vyc2l2ZSBjYWxscy4KLQotSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBmdW5jdGlvbiBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgb25jZSBmcm9tCi1AY29kZXttYWlufS4KLQotQGl0ZW0gbmFtZQotVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gIFRoZSBpbmRleCBudW1iZXIgaXMKLXJlcGVhdGVkIGFmdGVyIGl0LgotCi1JZiB0aGUgZnVuY3Rpb24gaXMgcGFydCBvZiBhIGN5Y2xlIG9mIHJlY3Vyc2lvbiwgdGhlIGN5Y2xlIG51bWJlciBpcwotcHJpbnRlZCBiZXR3ZWVuIHRoZSBmdW5jdGlvbidzIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIKLShAcHhyZWZ7Q3ljbGVzfSkuICBGb3IgZXhhbXBsZSwgaWYgZnVuY3Rpb24gQGNvZGV7Z251cnJ9IGlzIHBhcnQgb2YKLWN5Y2xlIG51bWJlciBvbmUsIGFuZCBoYXMgaW5kZXggbnVtYmVyIHR3ZWx2ZSwgaXRzIHByaW1hcnkgbGluZSB3b3VsZAotYmUgZW5kIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWdudXJyIDxjeWNsZSAxPiBbMTJdCi1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLQotQG5vZGUgQ2FsbGVycywgU3Vicm91dGluZXMsIFByaW1hcnksIENhbGwgR3JhcGgKLUBzdWJzZWN0aW9uIExpbmVzIGZvciBhIEZ1bmN0aW9uJ3MgQ2FsbGVycwotCi1BIGZ1bmN0aW9uJ3MgZW50cnkgaGFzIGEgbGluZSBmb3IgZWFjaCBmdW5jdGlvbiBpdCB3YXMgY2FsbGVkIGJ5LgotVGhlc2UgbGluZXMnIGZpZWxkcyBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnkgbGluZSwgYnV0Ci10aGVpciBtZWFuaW5ncyBhcmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVuY2UgaW4gY29udGV4dC4KLQotRm9yIHJlZmVyZW5jZSwgd2UgcmVwZWF0IHR3byBsaW5lcyBmcm9tIHRoZSBlbnRyeSBmb3IgdGhlIGZ1bmN0aW9uCi1AY29kZXtyZXBvcnR9LCB0aGUgcHJpbWFyeSBsaW5lIGFuZCBvbmUgY2FsbGVyLWxpbmUgcHJlY2VkaW5nIGl0LCB0b2dldGhlcgotd2l0aCB0aGUgaGVhZGluZyBsaW5lIHRoYXQgc2hvd3MgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi1AZG90c3t9Ci0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgbWFpbiBbMl0KLVszXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIHJlcG9ydCBbM10KLUBlbmQgc21hbGxleGFtcGxlCi0KLUhlcmUgYXJlIHRoZSBtZWFuaW5ncyBvZiB0aGUgZmllbGRzIGluIHRoZSBjYWxsZXItbGluZSBmb3IgQGNvZGV7cmVwb3J0fQotY2FsbGVkIGZyb20gQGNvZGV7bWFpbn06Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gc2VsZgotQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIEBjb2Rle3JlcG9ydH0gaXRzZWxmIHdoZW4gaXQgd2FzCi1jYWxsZWQgZnJvbSBAY29kZXttYWlufS4KLQotQGl0ZW0gY2hpbGRyZW4KLUFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBzdWJyb3V0aW5lcyBvZiBAY29kZXtyZXBvcnR9Ci13aGVuIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LgotCi1UaGUgc3VtIG9mIHRoZSBAY29kZXtzZWxmfSBhbmQgQGNvZGV7Y2hpbGRyZW59IGZpZWxkcyBpcyBhbiBlc3RpbWF0ZQotb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdpdGhpbiBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20gQGNvZGV7bWFpbn0uCi0KLUBpdGVtIGNhbGxlZAotVHdvIG51bWJlcnM6IHRoZSBudW1iZXIgb2YgdGltZXMgQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0sCi1mb2xsb3dlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIG5vbnJlY3Vyc2l2ZSBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20KLWFsbCBpdHMgY2FsbGVycy4KLQotQGl0ZW0gbmFtZSBhbmQgaW5kZXggbnVtYmVyCi1UaGUgbmFtZSBvZiB0aGUgY2FsbGVyIG9mIEBjb2Rle3JlcG9ydH0gdG8gd2hpY2ggdGhpcyBsaW5lIGFwcGxpZXMsCi1mb2xsb3dlZCBieSB0aGUgY2FsbGVyJ3MgaW5kZXggbnVtYmVyLgotCi1Ob3QgYWxsIGZ1bmN0aW9ucyBoYXZlIGVudHJpZXMgaW4gdGhlIGNhbGwgZ3JhcGg7IHNvbWUKLW9wdGlvbnMgdG8gQGNvZGV7Z3Byb2Z9IHJlcXVlc3QgdGhlIG9taXNzaW9uIG9mIGNlcnRhaW4gZnVuY3Rpb25zLgotV2hlbiBhIGNhbGxlciBoYXMgbm8gZW50cnkgb2YgaXRzIG93biwgaXQgc3RpbGwgaGFzIGNhbGxlci1saW5lcwotaW4gdGhlIGVudHJpZXMgb2YgdGhlIGZ1bmN0aW9ucyBpdCBjYWxscy4KLQotSWYgdGhlIGNhbGxlciBpcyBwYXJ0IG9mIGEgcmVjdXJzaW9uIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzCi1wcmludGVkIGJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi1AZW5kIHRhYmxlCi0KLUlmIHRoZSBpZGVudGl0eSBvZiB0aGUgY2FsbGVycyBvZiBhIGZ1bmN0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCBhCi1kdW1teSBjYWxsZXItbGluZSBpcyBwcmludGVkIHdoaWNoIGhhcyBAc2FtcHs8c3BvbnRhbmVvdXM+fSBhcyB0aGUKLWBgY2FsbGVyJ3MgbmFtZScnIGFuZCBhbGwgb3RoZXIgZmllbGRzIGJsYW5rLiAgVGhpcyBjYW4gaGFwcGVuIGZvcgotc2lnbmFsIGhhbmRsZXJzLgotQGMgV2hhdCBpZiBzb21lIGNhbGxzIGhhdmUgZGV0ZXJtaW5hYmxlIGNhbGxlcnMnIG5hbWVzIGJ1dCBub3QgYWxsPwotQGMgRklYTUUgLSBzdGlsbCByZWxldmFudD8KLQotQG5vZGUgU3Vicm91dGluZXMsIEN5Y2xlcywgQ2FsbGVycywgQ2FsbCBHcmFwaAotQHN1YnNlY3Rpb24gTGluZXMgZm9yIGEgRnVuY3Rpb24ncyBTdWJyb3V0aW5lcwotCi1BIGZ1bmN0aW9uJ3MgZW50cnkgaGFzIGEgbGluZSBmb3IgZWFjaCBvZiBpdHMgc3Vicm91dGluZXMtLS1pbiBvdGhlcgotd29yZHMsIGEgbGluZSBmb3IgZWFjaCBvdGhlciBmdW5jdGlvbiB0aGF0IGl0IGNhbGxlZC4gIFRoZXNlIGxpbmVzJwotZmllbGRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBsaW5lLCBidXQgdGhlaXIgbWVhbmluZ3MKLWFyZSBkaWZmZXJlbnQgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW5jZSBpbiBjb250ZXh0LgotCi1Gb3IgcmVmZXJlbmNlLCB3ZSByZXBlYXQgdHdvIGxpbmVzIGZyb20gdGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24KLUBjb2Rle21haW59LCB0aGUgcHJpbWFyeSBsaW5lIGFuZCBhIGxpbmUgZm9yIGEgc3Vicm91dGluZSwgdG9nZXRoZXIKLXdpdGggdGhlIGhlYWRpbmcgbGluZSB0aGF0IHNob3dzIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzOgotCi1Ac21hbGxleGFtcGxlCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotQGRvdHN7fQotWzJdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICByZXBvcnQgWzNdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1IZXJlIGFyZSB0aGUgbWVhbmluZ3Mgb2YgdGhlIGZpZWxkcyBpbiB0aGUgc3Vicm91dGluZS1saW5lIGZvciBAY29kZXttYWlufQotY2FsbGluZyBAY29kZXtyZXBvcnR9OgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHNlbGYKLUFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBkaXJlY3RseSB3aXRoaW4gQGNvZGV7cmVwb3J0fQotd2hlbiBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufS4KLQotQGl0ZW0gY2hpbGRyZW4KLUFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBzdWJyb3V0aW5lcyBvZiBAY29kZXtyZXBvcnR9Ci13aGVuIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LgotCi1UaGUgc3VtIG9mIHRoZSBAY29kZXtzZWxmfSBhbmQgQGNvZGV7Y2hpbGRyZW59IGZpZWxkcyBpcyBhbiBlc3RpbWF0ZQotb2YgdGhlIHRvdGFsIHRpbWUgc3BlbnQgaW4gY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tIEBjb2Rle21haW59LgotCi1AaXRlbSBjYWxsZWQKLVR3byBudW1iZXJzLCB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbSBAY29kZXttYWlufQotZm9sbG93ZWQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBub25yZWN1cnNpdmUgY2FsbHMgdG8gQGNvZGV7cmVwb3J0fS4KLVRoaXMgcmF0aW8gaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IG11Y2ggb2YgQGNvZGV7cmVwb3J0fSdzIEBjb2Rle3NlbGZ9Ci1hbmQgQGNvZGV7Y2hpbGRyZW59IHRpbWUgZ2V0cyBjcmVkaXRlZCB0byBAY29kZXttYWlufS4KLUB4cmVme0Fzc3VtcHRpb25zfS4KLQotQGl0ZW0gbmFtZQotVGhlIG5hbWUgb2YgdGhlIHN1YnJvdXRpbmUgb2YgQGNvZGV7bWFpbn0gdG8gd2hpY2ggdGhpcyBsaW5lIGFwcGxpZXMsCi1mb2xsb3dlZCBieSB0aGUgc3Vicm91dGluZSdzIGluZGV4IG51bWJlci4KLQotSWYgdGhlIGNhbGxlciBpcyBwYXJ0IG9mIGEgcmVjdXJzaW9uIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzCi1wcmludGVkIGJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEN5Y2xlcywsIFN1YnJvdXRpbmVzLCBDYWxsIEdyYXBoCi1Ac3Vic2VjdGlvbiBIb3cgTXV0dWFsbHkgUmVjdXJzaXZlIEZ1bmN0aW9ucyBBcmUgRGVzY3JpYmVkCi1AY2luZGV4IGN5Y2xlCi1AY2luZGV4IHJlY3Vyc2lvbiBjeWNsZQotCi1UaGUgZ3JhcGggbWF5IGJlIGNvbXBsaWNhdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBAZGZue2N5Y2xlcyBvZgotcmVjdXJzaW9ufSBpbiB0aGUgY2FsbCBncmFwaC4gIEEgY3ljbGUgZXhpc3RzIGlmIGEgZnVuY3Rpb24gY2FsbHMKLWFub3RoZXIgZnVuY3Rpb24gdGhhdCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgY2FsbHMgKG9yIGFwcGVhcnMgdG8KLWNhbGwpIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4gIEZvciBleGFtcGxlOiBpZiBAY29kZXthfSBjYWxscyBAY29kZXtifSwKLWFuZCBAY29kZXtifSBjYWxscyBAY29kZXthfSwgdGhlbiBAY29kZXthfSBhbmQgQGNvZGV7Yn0gZm9ybSBhIGN5Y2xlLgotCi1XaGVuZXZlciB0aGVyZSBhcmUgY2FsbCBwYXRocyBib3RoIHdheXMgYmV0d2VlbiBhIHBhaXIgb2YgZnVuY3Rpb25zLCB0aGV5Ci1iZWxvbmcgdG8gdGhlIHNhbWUgY3ljbGUuICBJZiBAY29kZXthfSBhbmQgQGNvZGV7Yn0gY2FsbCBlYWNoIG90aGVyIGFuZAotQGNvZGV7Yn0gYW5kIEBjb2Rle2N9IGNhbGwgZWFjaCBvdGhlciwgYWxsIHRocmVlIG1ha2Ugb25lIGN5Y2xlLiAgTm90ZSB0aGF0Ci1ldmVuIGlmIEBjb2Rle2J9IG9ubHkgY2FsbHMgQGNvZGV7YX0gaWYgaXQgd2FzIG5vdCBjYWxsZWQgZnJvbSBAY29kZXthfSwKLUBjb2Rle2dwcm9mfSBjYW5ub3QgZGV0ZXJtaW5lIHRoaXMsIHNvIEBjb2Rle2F9IGFuZCBAY29kZXtifSBhcmUgc3RpbGwKLWNvbnNpZGVyZWQgYSBjeWNsZS4KLQotVGhlIGN5Y2xlcyBhcmUgbnVtYmVyZWQgd2l0aCBjb25zZWN1dGl2ZSBpbnRlZ2Vycy4gIFdoZW4gYSBmdW5jdGlvbgotYmVsb25ncyB0byBhIGN5Y2xlLCBlYWNoIHRpbWUgdGhlIGZ1bmN0aW9uIG5hbWUgYXBwZWFycyBpbiB0aGUgY2FsbCBncmFwaAotaXQgaXMgZm9sbG93ZWQgYnkgQHNhbXB7PGN5Y2xlIEB2YXJ7bnVtYmVyfT59LgotCi1UaGUgcmVhc29uIGN5Y2xlcyBtYXR0ZXIgaXMgdGhhdCB0aGV5IG1ha2UgdGhlIHRpbWUgdmFsdWVzIGluIHRoZSBjYWxsCi1ncmFwaCBwYXJhZG94aWNhbC4gIFRoZSBgYHRpbWUgc3BlbnQgaW4gY2hpbGRyZW4nJyBvZiBAY29kZXthfSBzaG91bGQKLWluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgaW4gaXRzIHN1YnJvdXRpbmUgQGNvZGV7Yn0gYW5kIGluIEBjb2Rle2J9J3MKLXN1YnJvdXRpbmVzLS0tYnV0IG9uZSBvZiBAY29kZXtifSdzIHN1YnJvdXRpbmVzIGlzIEBjb2Rle2F9ISAgSG93IG11Y2ggb2YKLUBjb2Rle2F9J3MgdGltZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNoaWxkcmVuIG9mIEBjb2Rle2F9LCB3aGVuCi1AY29kZXthfSBpcyBpbmRpcmVjdGx5IHJlY3Vyc2l2ZT8KLQotVGhlIHdheSBAY29kZXtncHJvZn0gcmVzb2x2ZXMgdGhpcyBwYXJhZG94IGlzIGJ5IGNyZWF0aW5nIGEgc2luZ2xlIGVudHJ5Ci1mb3IgdGhlIGN5Y2xlIGFzIGEgd2hvbGUuICBUaGUgcHJpbWFyeSBsaW5lIG9mIHRoaXMgZW50cnkgZGVzY3JpYmVzIHRoZQotdG90YWwgdGltZSBzcGVudCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb25zIG9mIHRoZSBjeWNsZS4gIFRoZQotYGBzdWJyb3V0aW5lcycnIG9mIHRoZSBjeWNsZSBhcmUgdGhlIGluZGl2aWR1YWwgZnVuY3Rpb25zIG9mIHRoZSBjeWNsZSwgYW5kCi1hbGwgb3RoZXIgZnVuY3Rpb25zIHRoYXQgd2VyZSBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlbS4gIFRoZSBgYGNhbGxlcnMnJyBvZgotdGhlIGN5Y2xlIGFyZSB0aGUgZnVuY3Rpb25zLCBvdXRzaWRlIHRoZSBjeWNsZSwgdGhhdCBjYWxsZWQgZnVuY3Rpb25zIGluCi10aGUgY3ljbGUuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBwb3J0aW9uIG9mIGEgY2FsbCBncmFwaCB3aGljaCBzaG93cyBhIGN5Y2xlIGNvbnRhaW5pbmcKLWZ1bmN0aW9ucyBAY29kZXthfSBhbmQgQGNvZGV7Yn0uICBUaGUgY3ljbGUgd2FzIGVudGVyZWQgYnkgYSBjYWxsIHRvCi1AY29kZXthfSBmcm9tIEBjb2Rle21haW59OyBib3RoIEBjb2Rle2F9IGFuZCBAY29kZXtifSBjYWxsZWQgQGNvZGV7Y30uCi0KLUBzbWFsbGV4YW1wbGUKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBtYWluIFsyXQotWzNdICAgICA5MS43MSAgICAxLjc3ICAgICAgICAwICAgIDErNSAgICA8Y3ljbGUgMSBhcyBhIHdob2xlPiBbM10KLSAgICAgICAgICAgICAgICAgMS4wMiAgICAgICAgMCAgICAzICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAwLjc1ICAgICAgICAwICAgIDIgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLVs0XSAgICAgNTIuODUgICAgMS4wMiAgICAgICAgMCAgICAwICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi1bNV0gICAgIDM4Ljg2ICAgIDAuNzUgICAgICAgIDAgICAgMSAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci0oVGhlIGVudGlyZSBjYWxsIGdyYXBoIGZvciB0aGlzIHByb2dyYW0gY29udGFpbnMgaW4gYWRkaXRpb24gYW4gZW50cnkgZm9yCi1AY29kZXttYWlufSwgd2hpY2ggY2FsbHMgQGNvZGV7YX0sIGFuZCBhbiBlbnRyeSBmb3IgQGNvZGV7Y30sIHdpdGggY2FsbGVycwotQGNvZGV7YX0gYW5kIEBjb2Rle2J9LikKLQotQHNtYWxsZXhhbXBsZQotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcG9udGFuZW91cz4KLVsxXSAgICAxMDAuMDAgICAgICAgMCAgICAgMS45MyAgICAwICAgICAgc3RhcnQgWzFdCi0gICAgICAgICAgICAgICAgIDAuMTYgICAgIDEuNzcgICAgMS8xICAgICAgICBtYWluIFsyXQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAwLjE2ICAgICAxLjc3ICAgIDEvMSAgICAgICAgc3RhcnQgWzFdCi1bMl0gICAgMTAwLjAwICAgIDAuMTYgICAgIDEuNzcgICAgMSAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCi1bM10gICAgIDkxLjcxICAgIDEuNzcgICAgICAgIDAgICAgMSs1ICAgIDxjeWNsZSAxIGFzIGEgd2hvbGU+IFszXQotICAgICAgICAgICAgICAgICAxLjAyICAgICAgICAwICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgIDAuNzUgICAgICAgIDAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICA2LzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLVs0XSAgICAgNTIuODUgICAgMS4wMiAgICAgICAgMCAgICAwICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi1bNV0gICAgIDM4Ljg2ICAgIDAuNzUgICAgICAgIDAgICAgMSAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLVs2XSAgICAgIDAuMDAgICAgICAgMCAgICAgICAgMCAgICA2ICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAY29kZXtzZWxmfSBmaWVsZCBvZiB0aGUgY3ljbGUncyBwcmltYXJ5IGxpbmUgaXMgdGhlIHRvdGFsIHRpbWUKLXNwZW50IGluIGFsbCB0aGUgZnVuY3Rpb25zIG9mIHRoZSBjeWNsZS4gIEl0IGVxdWFscyB0aGUgc3VtIG9mIHRoZQotQGNvZGV7c2VsZn0gZmllbGRzIGZvciB0aGUgaW5kaXZpZHVhbCBmdW5jdGlvbnMgaW4gdGhlIGN5Y2xlLCBmb3VuZAotaW4gdGhlIGVudHJ5IGluIHRoZSBzdWJyb3V0aW5lIGxpbmVzIGZvciB0aGVzZSBmdW5jdGlvbnMuCi0KLVRoZSBAY29kZXtjaGlsZHJlbn0gZmllbGRzIG9mIHRoZSBjeWNsZSdzIHByaW1hcnkgbGluZSBhbmQgc3Vicm91dGluZSBsaW5lcwotY291bnQgb25seSBzdWJyb3V0aW5lcyBvdXRzaWRlIHRoZSBjeWNsZS4gIEV2ZW4gdGhvdWdoIEBjb2Rle2F9IGNhbGxzCi1AY29kZXtifSwgdGhlIHRpbWUgc3BlbnQgaW4gdGhvc2UgY2FsbHMgdG8gQGNvZGV7Yn0gaXMgbm90IGNvdW50ZWQgaW4KLUBjb2Rle2F9J3MgQGNvZGV7Y2hpbGRyZW59IHRpbWUuICBUaHVzLCB3ZSBkbyBub3QgZW5jb3VudGVyIHRoZSBwcm9ibGVtIG9mCi13aGF0IHRvIGRvIHdoZW4gdGhlIHRpbWUgaW4gdGhvc2UgY2FsbHMgdG8gQGNvZGV7Yn0gaW5jbHVkZXMgaW5kaXJlY3QKLXJlY3Vyc2l2ZSBjYWxscyBiYWNrIHRvIEBjb2Rle2F9LgotCi1UaGUgQGNvZGV7Y2hpbGRyZW59IGZpZWxkIG9mIGEgY2FsbGVyLWxpbmUgaW4gdGhlIGN5Y2xlJ3MgZW50cnkgZXN0aW1hdGVzCi10aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgQGVtcGh7aW4gdGhlIHdob2xlIGN5Y2xlfSwgYW5kIGl0cyBvdGhlcgotc3Vicm91dGluZXMsIG9uIHRoZSB0aW1lcyB3aGVuIHRoYXQgY2FsbGVyIGNhbGxlZCBhIGZ1bmN0aW9uIGluIHRoZSBjeWNsZS4KLQotVGhlIEBjb2Rle2NhbGxzfSBmaWVsZCBpbiB0aGUgcHJpbWFyeSBsaW5lIGZvciB0aGUgY3ljbGUgaGFzIHR3byBudW1iZXJzOgotZmlyc3QsIHRoZSBudW1iZXIgb2YgdGltZXMgZnVuY3Rpb25zIGluIHRoZSBjeWNsZSB3ZXJlIGNhbGxlZCBieSBmdW5jdGlvbnMKLW91dHNpZGUgdGhlIGN5Y2xlOyBzZWNvbmQsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhleSB3ZXJlIGNhbGxlZCBieQotZnVuY3Rpb25zIGluIHRoZSBjeWNsZSAoaW5jbHVkaW5nIHRpbWVzIHdoZW4gYSBmdW5jdGlvbiBpbiB0aGUgY3ljbGUgY2FsbHMKLWl0c2VsZikuICBUaGlzIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlIHVzdWFsIHNwbGl0IGludG8gbm9ucmVjdXJzaXZlIGFuZAotcmVjdXJzaXZlIGNhbGxzLgotCi1UaGUgQGNvZGV7Y2FsbHN9IGZpZWxkIG9mIGEgc3Vicm91dGluZS1saW5lIGZvciBhIGN5Y2xlIG1lbWJlciBpbiB0aGUKLWN5Y2xlJ3MgZW50cnkgc2F5cyBob3cgbWFueSB0aW1lIHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZCBmcm9tIGZ1bmN0aW9ucyBpbgotdGhlIGN5Y2xlLiAgVGhlIHRvdGFsIG9mIGFsbCB0aGVzZSBpcyB0aGUgc2Vjb25kIG51bWJlciBpbiB0aGUgcHJpbWFyeSBsaW5lJ3MKLUBjb2Rle2NhbGxzfSBmaWVsZC4KLQotSW4gdGhlIGluZGl2aWR1YWwgZW50cnkgZm9yIGEgZnVuY3Rpb24gaW4gYSBjeWNsZSwgdGhlIG90aGVyIGZ1bmN0aW9ucyBpbgotdGhlIHNhbWUgY3ljbGUgY2FuIGFwcGVhciBhcyBzdWJyb3V0aW5lcyBhbmQgYXMgY2FsbGVycy4gIFRoZXNlIGxpbmVzIHNob3cKLWhvdyBtYW55IHRpbWVzIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGN5Y2xlIGNhbGxlZCBvciB3YXMgY2FsbGVkIGZyb20gZWFjaCBvdGhlcgotZnVuY3Rpb24gaW4gdGhlIGN5Y2xlLiAgVGhlIEBjb2Rle3NlbGZ9IGFuZCBAY29kZXtjaGlsZHJlbn0gZmllbGRzIGluIHRoZXNlCi1saW5lcyBhcmUgYmxhbmsgYmVjYXVzZSBvZiB0aGUgZGlmZmljdWx0eSBvZiBkZWZpbmluZyBtZWFuaW5ncyBmb3IgdGhlbQotd2hlbiByZWN1cnNpb24gaXMgZ29pbmcgb24uCi0KLUBub2RlIExpbmUtYnktbGluZSxBbm5vdGF0ZWQgU291cmNlLENhbGwgR3JhcGgsT3V0cHV0Ci1Ac2VjdGlvbiBMaW5lLWJ5LWxpbmUgUHJvZmlsaW5nCi0KLUBjb2Rle2dwcm9mfSdzIEBzYW1wey1sfSBvcHRpb24gY2F1c2VzIHRoZSBwcm9ncmFtIHRvIHBlcmZvcm0KLUBkZm57bGluZS1ieS1saW5lfSBwcm9maWxpbmcuICBJbiB0aGlzIG1vZGUsIGhpc3RvZ3JhbQotc2FtcGxlcyBhcmUgYXNzaWduZWQgbm90IHRvIGZ1bmN0aW9ucywgYnV0IHRvIGluZGl2aWR1YWwKLWxpbmVzIG9mIHNvdXJjZSBjb2RlLiAgVGhlIHByb2dyYW0gdXN1YWxseSBtdXN0IGJlIGNvbXBpbGVkCi13aXRoIGEgQHNhbXB7LWd9IG9wdGlvbiwgaW4gYWRkaXRpb24gdG8gQHNhbXB7LXBnfSwgaW4gb3JkZXIKLXRvIGdlbmVyYXRlIGRlYnVnZ2luZyBzeW1ib2xzIGZvciB0cmFja2luZyBzb3VyY2UgY29kZSBsaW5lcy4KLQotVGhlIGZsYXQgcHJvZmlsZSBpcyB0aGUgbW9zdCB1c2VmdWwgb3V0cHV0IHRhYmxlCi1pbiBsaW5lLWJ5LWxpbmUgbW9kZS4KLVRoZSBjYWxsIGdyYXBoIGlzbid0IGFzIHVzZWZ1bCBhcyBub3JtYWwsIHNpbmNlCi10aGUgY3VycmVudCB2ZXJzaW9uIG9mIEBjb2Rle2dwcm9mfSBkb2VzIG5vdCBwcm9wYWdhdGUKLWNhbGwgZ3JhcGggYXJjcyBmcm9tIHNvdXJjZSBjb2RlIGxpbmVzIHRvIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24uCi1UaGUgY2FsbCBncmFwaCBkb2VzLCBob3dldmVyLCBzaG93IGVhY2ggbGluZSBvZiBjb2RlCi10aGF0IGNhbGxlZCBlYWNoIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIGEgY291bnQuCi0KLUhlcmUgaXMgYSBzZWN0aW9uIG9mIEBjb2Rle2dwcm9mfSdzIG91dHB1dCwgd2l0aG91dCBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLgotTm90ZSB0aGF0IEBjb2Rle2N0X2luaXR9IGFjY291bnRlZCBmb3IgZm91ciBoaXN0b2dyYW0gaGl0cywgYW5kCi0xMzMyNyBjYWxscyB0byBAY29kZXtpbml0X2Jsb2NrfS4KLQotQHNtYWxsZXhhbXBsZQotRmxhdCBwcm9maWxlOgotCi1FYWNoIHNhbXBsZSBjb3VudHMgYXMgMC4wMSBzZWNvbmRzLgotICAlICAgY3VtdWxhdGl2ZSAgIHNlbGYgICAgICAgICAgICAgIHNlbGYgICAgIHRvdGFsICAgICAgICAgICAKLSB0aW1lICAgc2Vjb25kcyAgIHNlY29uZHMgICAgY2FsbHMgIHVzL2NhbGwgIHVzL2NhbGwgIG5hbWUgICAgCi0gMzAuNzcgICAgICAwLjEzICAgICAwLjA0ICAgICA2MzM1ICAgICA2LjMxICAgICA2LjMxICBjdF9pbml0Ci0KLQotCQkgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpCi0KLQotZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgNCBieXRlKHMpIGZvciA3LjY5JSBvZiAwLjEzIHNlY29uZHMKLQotaW5kZXggJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZQotCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMTM0OTYgICAgICAgbmFtZV90b29fbG9uZwotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDQwLzEzNDk2ICAgICAgIGRlZmxhdGUKLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgIDEyOC8xMzQ5NiAgICAgICBkZWZsYXRlX2Zhc3QKLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAxMzMyNy8xMzQ5NiAgICAgICBjdF9pbml0Ci1bN10gICAgICAwLjAgICAgMC4wMCAgICAwLjAwICAgMTM0OTYgICAgICAgICBpbml0X2Jsb2NrCi0KLUBlbmQgc21hbGxleGFtcGxlCi0KLU5vdyBsZXQncyBsb29rIGF0IHNvbWUgb2YgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0IGZyb20gdGhlIHNhbWUgcHJvZ3JhbSBydW4sCi10aGlzIHRpbWUgd2l0aCBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIGVuYWJsZWQuICBOb3RlIHRoYXQgQGNvZGV7Y3RfaW5pdH0ncwotZm91ciBoaXN0b2dyYW0gaGl0cyBhcmUgYnJva2VuIGRvd24gaW50byBmb3VyIGxpbmVzIG9mIHNvdXJjZSBjb2RlIC0gb25lIGhpdAotb2NjdXJlZCBvbiBlYWNoIG9mIGxpbmVzIDM0OSwgMzUxLCAzODIgYW5kIDM4NS4gIEluIHRoZSBjYWxsIGdyYXBoLAotbm90ZSBob3cKLUBjb2Rle2N0X2luaXR9J3MgMTMzMjcgY2FsbHMgdG8gQGNvZGV7aW5pdF9ibG9ja30gYXJlIGJyb2tlbiBkb3duCi1pbnRvIG9uZSBjYWxsIGZyb20gbGluZSAzOTYsIDMwNzEgY2FsbHMgZnJvbSBsaW5lIDM4NCwgMzczMCBjYWxscwotZnJvbSBsaW5lIDM4NSwgYW5kIDY1MjUgY2FsbHMgZnJvbSAzODcuCi0KLUBzbWFsbGV4YW1wbGUKLUZsYXQgcHJvZmlsZToKLQotRWFjaCBzYW1wbGUgY291bnRzIGFzIDAuMDEgc2Vjb25kcy4KLSAgJSAgIGN1bXVsYXRpdmUgICBzZWxmICAgICAgICAgICAgICAgICAgICAKLSB0aW1lICAgc2Vjb25kcyAgIHNlY29uZHMgICAgY2FsbHMgIG5hbWUgICAgCi0gIDcuNjkgICAgICAwLjEwICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM0OSkKLSAgNy42OSAgICAgIDAuMTEgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6MzUxKQotICA3LjY5ICAgICAgMC4xMiAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODIpCi0gIDcuNjkgICAgICAwLjEzICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NSkKLQotCi0JCSAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cykKLQotCi1ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyA0IGJ5dGUocykgZm9yIDcuNjklIG9mIDAuMTMgc2Vjb25kcwotCi0gICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWUKLQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMTM0OTYgICAgICAgbmFtZV90b29fbG9uZyAoZ3ppcC5jOjE0NDApCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6NzYzKQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozOTYpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMi8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6NzI3KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDQvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjY4NikKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA1LzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo2NzUpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAxMi8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6Njc5KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgMTYvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjczMCkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgMTI4LzEzNDk2ICAgICAgIGRlZmxhdGVfZmFzdCAoZGVmbGF0ZS5jOjY1NCkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAzMDcxLzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg0KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgIDM3MzAvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODUpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgNjUyNS8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NykKLVs2XSAgMC4wICAgIDAuMDAgICAgMC4wMCAgIDEzNDk2ICAgICAgICAgaW5pdF9ibG9jayAodHJlZXMuYzo0MDgpCi0KLUBlbmQgc21hbGxleGFtcGxlCi0KLQotQG5vZGUgQW5ub3RhdGVkIFNvdXJjZSwsTGluZS1ieS1saW5lLE91dHB1dAotQHNlY3Rpb24gVGhlIEFubm90YXRlZCBTb3VyY2UgTGlzdGluZwotCi1AY29kZXtncHJvZn0ncyBAc2FtcHstQX0gb3B0aW9uIHRyaWdnZXJzIGFuIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZywKLXdoaWNoIGxpc3RzIHRoZSBwcm9ncmFtJ3Mgc291cmNlIGNvZGUsIGVhY2ggZnVuY3Rpb24gbGFiZWxlZCB3aXRoIHRoZQotbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyBjYWxsZWQuICBZb3UgbWF5IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZQotQHNhbXB7LUl9IG9wdGlvbiwgaWYgQGNvZGV7Z3Byb2Z9IGNhbid0IGZpbmQgdGhlIHNvdXJjZSBjb2RlIGZpbGVzLgotCi1Db21waWxpbmcgd2l0aCBAc2FtcHtnY2MgQGRvdHN7fSAtZyAtcGcgLWF9IGF1Z21lbnRzIHlvdXIgcHJvZ3JhbQotd2l0aCBiYXNpYy1ibG9jayBjb3VudGluZyBjb2RlLCBpbiBhZGRpdGlvbiB0byBmdW5jdGlvbiBjb3VudGluZyBjb2RlLgotVGhpcyBlbmFibGVzIEBjb2Rle2dwcm9mfSB0byBkZXRlcm1pbmUgaG93IG1hbnkgdGltZXMgZWFjaCBsaW5lCi1vZiBjb2RlIHdhcyBleGV1Y3RlZC4KLUZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uLCB0YWtlbiBmcm9tIGd6aXAsCi13aXRoIGxpbmUgbnVtYmVycyBhZGRlZDoKLQotQHNtYWxsZXhhbXBsZQotIDEgdWxnIHVwZGNyYyhzLCBuKQotIDIgICAgIHVjaCAqczsKLSAzICAgICB1bnNpZ25lZCBuOwotIDQgQHsKLSA1ICAgICByZWdpc3RlciB1bGcgYzsKLSA2Ci0gNyAgICAgc3RhdGljIHVsZyBjcmMgPSAodWxnKTB4ZmZmZmZmZmZMOwotIDgKLSA5ICAgICBpZiAocyA9PSBOVUxMKSBAewotMTAgICAgICAgICBjID0gMHhmZmZmZmZmZkw7Ci0xMSAgICAgQH0gZWxzZSBAewotMTIgICAgICAgICBjID0gY3JjOwotMTMgICAgICAgICBpZiAobikgZG8gQHsKLTE0ICAgICAgICAgICAgIGMgPSBjcmNfMzJfdGFiWy4uLl07Ci0xNSAgICAgICAgIEB9IHdoaWxlICgtLW4pOwotMTYgICAgIEB9Ci0xNyAgICAgY3JjID0gYzsKLTE4ICAgICByZXR1cm4gYyBeIDB4ZmZmZmZmZmZMOwotMTkgQH0KLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7dXBkY3JjfSBoYXMgYXQgbGVhc3QgZml2ZSBiYXNpYy1ibG9ja3MuCi1PbmUgaXMgdGhlIGZ1bmN0aW9uIGl0c2VsZi4gIFRoZQotQGNvZGV7aWZ9IHN0YXRlbWVudCBvbiBsaW5lIDkgZ2VuZXJhdGVzIHR3byBtb3JlIGJhc2ljLWJsb2Nrcywgb25lCi1mb3IgZWFjaCBicmFuY2ggb2YgdGhlIEBjb2Rle2lmfS4gIEEgZm91cnRoIGJhc2ljLWJsb2NrIHJlc3VsdHMgZnJvbQotdGhlIEBjb2Rle2lmfSBvbiBsaW5lIDEzLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBAY29kZXtkb30gbG9vcCBmb3JtCi10aGUgZmlmdGggYmFzaWMtYmxvY2suICBUaGUgY29tcGlsZXIgbWF5IGFsc28gZ2VuZXJhdGUgYWRkaXRpb25hbAotYmFzaWMtYmxvY2tzIHRvIGhhbmRsZSB2YXJpb3VzIHNwZWNpYWwgY2FzZXMuCi0KLUEgcHJvZ3JhbSBhdWdtZW50ZWQgZm9yIGJhc2ljLWJsb2NrIGNvdW50aW5nIGNhbiBiZSBhbmFseXplZCB3aXRoCi1AY29kZXtncHJvZiAtbCAtQX0uICBJIGFsc28gc3VnZ2VzdCB1c2Ugb2YgdGhlIEBzYW1wey14fSBvcHRpb24sCi13aGljaCBlbnN1cmVzIHRoYXQgZWFjaCBsaW5lIG9mIGNvZGUgaXMgbGFiZWxlZCBhdCBsZWFzdCBvbmNlLgotSGVyZSBpcyBAY29kZXt1cGRjcmN9J3MKLWFubm90YXRlZCBzb3VyY2UgbGlzdGluZyBmb3IgYSBzYW1wbGUgQGNvZGV7Z3ppcH0gcnVuOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgICAgICAgdWxnIHVwZGNyYyhzLCBuKQotICAgICAgICAgICAgICAgICAgICB1Y2ggKnM7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG47Ci0gICAgICAgICAgICAyIC0+QHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdWxnIGM7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpYyB1bGcgY3JjID0gKHVsZykweGZmZmZmZmZmTDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDIgLT4gICAgaWYgKHMgPT0gTlVMTCkgQHsKLSAgICAgICAgICAgIDEgLT4JYyA9IDB4ZmZmZmZmZmZMOwotICAgICAgICAgICAgMSAtPiAgICBAfSBlbHNlIEB7Ci0gICAgICAgICAgICAxIC0+CWMgPSBjcmM7Ci0gICAgICAgICAgICAxIC0+ICAgICAgICBpZiAobikgZG8gQHsKLSAgICAgICAgMjYzMTIgLT4gICAgICAgICAgICBjID0gY3JjXzMyX3RhYlsuLi5dOwotMjYzMTIsMSwyNjMxMSAtPiAgICAgICAgQH0gd2hpbGUgKC0tbik7Ci0gICAgICAgICAgICAgICAgICAgIEB9Ci0gICAgICAgICAgICAyIC0+ICAgIGNyYyA9IGM7Ci0gICAgICAgICAgICAyIC0+ICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7Ci0gICAgICAgICAgICAyIC0+QH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQgdHdpY2UsIHBhc3Npbmcgb25jZSB0aHJvdWdoCi1lYWNoIGJyYW5jaCBvZiB0aGUgQGNvZGV7aWZ9IHN0YXRlbWVudC4gIFRoZSBib2R5IG9mIHRoZSBAY29kZXtkb30KLWxvb3Agd2FzIGV4ZWN1dGVkIGEgdG90YWwgb2YgMjYzMTIgdGltZXMuICBOb3RlIGhvdyB0aGUgQGNvZGV7d2hpbGV9Ci1zdGF0ZW1lbnQgaXMgYW5ub3RhdGVkLiAgSXQgYmVnYW4gZXhlY3V0aW9uIDI2MzEyIHRpbWVzLCBvbmNlIGZvcgotZWFjaCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgbG9vcC4gIE9uZSBvZiB0aG9zZSB0aW1lcyAodGhlIGxhc3QgdGltZSkKLWl0IGV4aXRlZCwgd2hpbGUgaXQgYnJhbmNoZWQgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb29wIDI2MzExIHRpbWVzLgotCi1Abm9kZSBJbmFjY3VyYWN5Ci1AY2hhcHRlciBJbmFjY3VyYWN5IG9mIEBjb2Rle2dwcm9mfSBPdXRwdXQKLQotQG1lbnUKLSogU2FtcGxpbmcgRXJyb3I6OiAgICAgIFN0YXRpc3RpY2FsIG1hcmdpbnMgb2YgZXJyb3IKLSogQXNzdW1wdGlvbnM6OiAgICAgICAgIEVzdGltYXRpbmcgY2hpbGRyZW4gdGltZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTYW1wbGluZyBFcnJvcixBc3N1bXB0aW9ucywsSW5hY2N1cmFjeQotQHNlY3Rpb24gU3RhdGlzdGljYWwgU2FtcGxpbmcgRXJyb3IKLQotVGhlIHJ1bi10aW1lIGZpZ3VyZXMgdGhhdCBAY29kZXtncHJvZn0gZ2l2ZXMgeW91IGFyZSBiYXNlZCBvbiBhIHNhbXBsaW5nCi1wcm9jZXNzLCBzbyB0aGV5IGFyZSBzdWJqZWN0IHRvIHN0YXRpc3RpY2FsIGluYWNjdXJhY3kuICBJZiBhIGZ1bmN0aW9uIHJ1bnMKLW9ubHkgYSBzbWFsbCBhbW91bnQgb2YgdGltZSwgc28gdGhhdCBvbiB0aGUgYXZlcmFnZSB0aGUgc2FtcGxpbmcgcHJvY2Vzcwotb3VnaHQgdG8gY2F0Y2ggdGhhdCBmdW5jdGlvbiBpbiB0aGUgYWN0IG9ubHkgb25jZSwgdGhlcmUgaXMgYSBwcmV0dHkgZ29vZAotY2hhbmNlIGl0IHdpbGwgYWN0dWFsbHkgZmluZCB0aGF0IGZ1bmN0aW9uIHplcm8gdGltZXMsIG9yIHR3aWNlLgotCi1CeSBjb250cmFzdCwgdGhlIG51bWJlci1vZi1jYWxscyBhbmQgYmFzaWMtYmxvY2sgZmlndXJlcwotYXJlIGRlcml2ZWQgYnkgY291bnRpbmcsIG5vdAotc2FtcGxpbmcuICBUaGV5IGFyZSBjb21wbGV0ZWx5IGFjY3VyYXRlIGFuZCB3aWxsIG5vdCB2YXJ5IGZyb20gcnVuIHRvIHJ1bgotaWYgeW91ciBwcm9ncmFtIGlzIGRldGVybWluaXN0aWMuCi0KLVRoZSBAZGZue3NhbXBsaW5nIHBlcmlvZH0gdGhhdCBpcyBwcmludGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZsYXQKLXByb2ZpbGUgc2F5cyBob3cgb2Z0ZW4gc2FtcGxlcyBhcmUgdGFrZW4uICBUaGUgcnVsZSBvZiB0aHVtYiBpcyB0aGF0IGEKLXJ1bi10aW1lIGZpZ3VyZSBpcyBhY2N1cmF0ZSBpZiBpdCBpcyBjb25zaWRlcmFibHkgYmlnZ2VyIHRoYW4gdGhlIHNhbXBsaW5nCi1wZXJpb2QuCi0KLVRoZSBhY3R1YWwgYW1vdW50IG9mIGVycm9yIGNhbiBiZSBwcmVkaWN0ZWQuCi1Gb3IgQHZhcntufSBzYW1wbGVzLCB0aGUgQGVtcGh7ZXhwZWN0ZWR9IGVycm9yCi1pcyB0aGUgc3F1YXJlLXJvb3Qgb2YgQHZhcntufS4gIEZvciBleGFtcGxlLAotaWYgdGhlIHNhbXBsaW5nIHBlcmlvZCBpcyAwLjAxIHNlY29uZHMgYW5kIEBjb2Rle2Zvb30ncyBydW4tdGltZSBpcyAxIHNlY29uZCwKLUB2YXJ7bn0gaXMgMTAwIHNhbXBsZXMgKDEgc2Vjb25kLzAuMDEgc2Vjb25kcyksIHNxcnQoQHZhcntufSkgaXMgMTAgc2FtcGxlcywgc28KLXRoZSBleHBlY3RlZCBlcnJvciBpbiBAY29kZXtmb299J3MgcnVuLXRpbWUgaXMgMC4xIHNlY29uZHMgKDEwKjAuMDEgc2Vjb25kcyksCi1vciB0ZW4gcGVyY2VudCBvZiB0aGUgb2JzZXJ2ZWQgdmFsdWUuCi1BZ2FpbiwgaWYgdGhlIHNhbXBsaW5nIHBlcmlvZCBpcyAwLjAxIHNlY29uZHMgYW5kIEBjb2Rle2Jhcn0ncyBydW4tdGltZSBpcwotMTAwIHNlY29uZHMsIEB2YXJ7bn0gaXMgMTAwMDAgc2FtcGxlcywgc3FydChAdmFye259KSBpcyAxMDAgc2FtcGxlcywgc28KLXRoZSBleHBlY3RlZCBlcnJvciBpbiBAY29kZXtiYXJ9J3MgcnVuLXRpbWUgaXMgMSBzZWNvbmQsCi1vciBvbmUgcGVyY2VudCBvZiB0aGUgb2JzZXJ2ZWQgdmFsdWUuCi1JdCBpcyBsaWtlbHkgdG8KLXZhcnkgdGhpcyBtdWNoIEBlbXBoe29uIHRoZSBhdmVyYWdlfSBmcm9tIG9uZSBwcm9maWxpbmcgcnVuIHRvIHRoZSBuZXh0LgotKEBlbXBoe1NvbWV0aW1lc30gaXQgd2lsbCB2YXJ5IG1vcmUuKQotCi1UaGlzIGRvZXMgbm90IG1lYW4gdGhhdCBhIHNtYWxsIHJ1bi10aW1lIGZpZ3VyZSBpcyBkZXZvaWQgb2YgaW5mb3JtYXRpb24uCi1JZiB0aGUgcHJvZ3JhbSdzIEBlbXBoe3RvdGFsfSBydW4tdGltZSBpcyBsYXJnZSwgYSBzbWFsbCBydW4tdGltZSBmb3Igb25lCi1mdW5jdGlvbiBkb2VzIHRlbGwgeW91IHRoYXQgdGhhdCBmdW5jdGlvbiB1c2VkIGFuIGluc2lnbmlmaWNhbnQgZnJhY3Rpb24gb2YKLXRoZSB3aG9sZSBwcm9ncmFtJ3MgdGltZS4gIFVzdWFsbHkgdGhpcyBtZWFucyBpdCBpcyBub3Qgd29ydGggb3B0aW1pemluZy4KLQotT25lIHdheSB0byBnZXQgbW9yZSBhY2N1cmFjeSBpcyB0byBnaXZlIHlvdXIgcHJvZ3JhbSBtb3JlIChidXQgc2ltaWxhcikKLWlucHV0IGRhdGEgc28gaXQgd2lsbCB0YWtlIGxvbmdlci4gIEFub3RoZXIgd2F5IGlzIHRvIGNvbWJpbmUgdGhlIGRhdGEgZnJvbQotc2V2ZXJhbCBydW5zLCB1c2luZyB0aGUgQHNhbXB7LXN9IG9wdGlvbiBvZiBAY29kZXtncHJvZn0uICBIZXJlIGlzIGhvdzoKLQotQGVudW1lcmF0ZQotQGl0ZW0KLVJ1biB5b3VyIHByb2dyYW0gb25jZS4KLQotQGl0ZW0KLUlzc3VlIHRoZSBjb21tYW5kIEBzYW1we212IGdtb24ub3V0IGdtb24uc3VtfS4KLQotQGl0ZW0KLVJ1biB5b3VyIHByb2dyYW0gYWdhaW4sIHRoZSBzYW1lIGFzIGJlZm9yZS4KLQotQGl0ZW0KLU1lcmdlIHRoZSBuZXcgZGF0YSBpbiBAZmlsZXtnbW9uLm91dH0gaW50byBAZmlsZXtnbW9uLnN1bX0gd2l0aCB0aGlzIGNvbW1hbmQ6Ci0KLUBleGFtcGxlCi1ncHJvZiAtcyBAdmFye2V4ZWN1dGFibGUtZmlsZX0gZ21vbi5vdXQgZ21vbi5zdW0KLUBlbmQgZXhhbXBsZQotCi1AaXRlbQotUmVwZWF0IHRoZSBsYXN0IHR3byBzdGVwcyBhcyBvZnRlbiBhcyB5b3Ugd2lzaC4KLQotQGl0ZW0KLUFuYWx5emUgdGhlIGN1bXVsYXRpdmUgZGF0YSB1c2luZyB0aGlzIGNvbW1hbmQ6Ci0KLUBleGFtcGxlCi1ncHJvZiBAdmFye2V4ZWN1dGFibGUtZmlsZX0gZ21vbi5zdW0gPiBAdmFye291dHB1dC1maWxlfQotQGVuZCBleGFtcGxlCi1AZW5kIGVudW1lcmF0ZQotCi1Abm9kZSBBc3N1bXB0aW9ucywsU2FtcGxpbmcgRXJyb3IsSW5hY2N1cmFjeQotQHNlY3Rpb24gRXN0aW1hdGluZyBAY29kZXtjaGlsZHJlbn0gVGltZXMKLQotU29tZSBvZiB0aGUgZmlndXJlcyBpbiB0aGUgY2FsbCBncmFwaCBhcmUgZXN0aW1hdGVzLS0tZm9yIGV4YW1wbGUsIHRoZQotQGNvZGV7Y2hpbGRyZW59IHRpbWUgdmFsdWVzIGFuZCBhbGwgdGhlIHRoZSB0aW1lIGZpZ3VyZXMgaW4gY2FsbGVyIGFuZAotc3Vicm91dGluZSBsaW5lcy4KLQotVGhlcmUgaXMgbm8gZGlyZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIG1lYXN1cmVtZW50cyBpbiB0aGUgcHJvZmlsZQotZGF0YSBpdHNlbGYuICBJbnN0ZWFkLCBAY29kZXtncHJvZn0gZXN0aW1hdGVzIHRoZW0gYnkgbWFraW5nIGFuIGFzc3VtcHRpb24KLWFib3V0IHlvdXIgcHJvZ3JhbSB0aGF0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSB0cnVlLgotCi1UaGUgYXNzdW1wdGlvbiBtYWRlIGlzIHRoYXQgdGhlIGF2ZXJhZ2UgdGltZSBzcGVudCBpbiBlYWNoIGNhbGwgdG8gYW55Ci1mdW5jdGlvbiBAY29kZXtmb299IGlzIG5vdCBjb3JyZWxhdGVkIHdpdGggd2hvIGNhbGxlZCBAY29kZXtmb299LiAgSWYKLUBjb2Rle2Zvb30gdXNlZCA1IHNlY29uZHMgaW4gYWxsLCBhbmQgMi81IG9mIHRoZSBjYWxscyB0byBAY29kZXtmb299IGNhbWUKLWZyb20gQGNvZGV7YX0sIHRoZW4gQGNvZGV7Zm9vfSBjb250cmlidXRlcyAyIHNlY29uZHMgdG8gQGNvZGV7YX0ncwotQGNvZGV7Y2hpbGRyZW59IHRpbWUsIGJ5IGFzc3VtcHRpb24uCi0KLVRoaXMgYXNzdW1wdGlvbiBpcyB1c3VhbGx5IHRydWUgZW5vdWdoLCBidXQgZm9yIHNvbWUgcHJvZ3JhbXMgaXQgaXMgZmFyCi1mcm9tIHRydWUuICBTdXBwb3NlIHRoYXQgQGNvZGV7Zm9vfSByZXR1cm5zIHZlcnkgcXVpY2tseSB3aGVuIGl0cyBhcmd1bWVudAotaXMgemVybzsgc3VwcG9zZSB0aGF0IEBjb2Rle2F9IGFsd2F5cyBwYXNzZXMgemVybyBhcyBhbiBhcmd1bWVudCwgd2hpbGUKLW90aGVyIGNhbGxlcnMgb2YgQGNvZGV7Zm9vfSBwYXNzIG90aGVyIGFyZ3VtZW50cy4gIEluIHRoaXMgcHJvZ3JhbSwgYWxsIHRoZQotdGltZSBzcGVudCBpbiBAY29kZXtmb299IGlzIGluIHRoZSBjYWxscyBmcm9tIGNhbGxlcnMgb3RoZXIgdGhhbiBAY29kZXthfS4KLUJ1dCBAY29kZXtncHJvZn0gaGFzIG5vIHdheSBvZiBrbm93aW5nIHRoaXM7IGl0IHdpbGwgYmxpbmRseSBhbmQKLWluY29ycmVjdGx5IGNoYXJnZSAyIHNlY29uZHMgb2YgdGltZSBpbiBAY29kZXtmb299IHRvIHRoZSBjaGlsZHJlbiBvZgotQGNvZGV7YX0uCi0KLUBjIEZJWE1FIC0gaGFzIHRoaXMgYmVlbiBmaXhlZD8KLVdlIGhvcGUgc29tZSBkYXkgdG8gcHV0IG1vcmUgY29tcGxldGUgZGF0YSBpbnRvIEBmaWxle2dtb24ub3V0fSwgc28gdGhhdAotdGhpcyBhc3N1bXB0aW9uIGlzIG5vIGxvbmdlciBuZWVkZWQsIGlmIHdlIGNhbiBmaWd1cmUgb3V0IGhvdy4gIEZvciB0aGUKLW5vbmNlLCB0aGUgZXN0aW1hdGVkIGZpZ3VyZXMgYXJlIHVzdWFsbHkgbW9yZSB1c2VmdWwgdGhhbiBtaXNsZWFkaW5nLgotCi1Abm9kZSBIb3cgZG8gST8KLUBjaGFwdGVyIEFuc3dlcnMgdG8gQ29tbW9uIFF1ZXN0aW9ucwotCi1AdGFibGUgQGFzaXMKLUBpdGVtIEhvdyBkbyBJIGZpbmQgd2hpY2ggbGluZXMgaW4gbXkgcHJvZ3JhbSB3ZXJlIGV4ZWN1dGVkIHRoZSBtb3N0IHRpbWVzPwotCi1Db21waWxlIHlvdXIgcHJvZ3JhbSB3aXRoIGJhc2ljLWJsb2NrIGNvdW50aW5nIGVuYWJsZWQsIHJ1biBpdCwgdGhlbgotdXNlIHRoZSBmb2xsb3dpbmcgcGlwZWxpbmU6Ci0KLUBleGFtcGxlCi1ncHJvZiAtbCAtQyBAdmFye29iamZpbGV9IHwgc29ydCAtayAzIC1uIC1yCi1AZW5kIGV4YW1wbGUKLQotVGhpcyBsaXN0aW5nIHdpbGwgc2hvdyB5b3UgdGhlIGxpbmVzIGluIHlvdXIgY29kZSBleGVjdXRlZCBtb3N0IG9mdGVuLAotYnV0IG5vdCBuZWNlc3NhcmlseSB0aG9zZSB0aGF0IGNvbnN1bWVkIHRoZSBtb3N0IHRpbWUuCi0KLUBpdGVtIEhvdyBkbyBJIGZpbmQgd2hpY2ggbGluZXMgaW4gbXkgcHJvZ3JhbSBjYWxsZWQgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uPwotCi1Vc2UgQGNvZGV7Z3Byb2YgLWx9IGFuZCBsb29rdXAgdGhlIGZ1bmN0aW9uIGluIHRoZSBjYWxsIGdyYXBoLgotVGhlIGNhbGxlcnMgd2lsbCBiZSBicm9rZW4gZG93biBieSBmdW5jdGlvbiBhbmQgbGluZSBudW1iZXIuCi0KLUBpdGVtIEhvdyBkbyBJIGFuYWx5emUgYSBwcm9ncmFtIHRoYXQgcnVucyBmb3IgbGVzcyB0aGFuIGEgc2Vjb25kPwotCi1UcnkgdXNpbmcgYSBzaGVsbCBzY3JpcHQgbGlrZSB0aGlzIG9uZToKLQotQGV4YW1wbGUKLWZvciBpIGluIGBzZXEgMSAxMDBgOyBkbwotICBmYXN0cHJvZwotICBtdiBnbW9uLm91dCBnbW9uLm91dC4kaQotZG9uZQotCi1ncHJvZiAtcyBmYXN0cHJvZyBnbW9uLm91dC4qCi0KLWdwcm9mIGZhc3Rwcm9nIGdtb24uc3VtCi1AZW5kIGV4YW1wbGUKLQotSWYgeW91ciBwcm9ncmFtIGlzIGNvbXBsZXRlbHkgZGV0ZXJtaW5pc3RpYywgYWxsIHRoZSBjYWxsIGNvdW50cwotd2lsbCBiZSBzaW1wbGUgbXVsdGlwbGVzIG9mIDEwMCAoaS5lLiBhIGZ1bmN0aW9uIGNhbGxlZCBvbmNlIGluCi1lYWNoIHJ1biB3aWxsIGFwcGVhciB3aXRoIGEgY2FsbCBjb3VudCBvZiAxMDApLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluY29tcGF0aWJpbGl0aWVzCi1AY2hhcHRlciBJbmNvbXBhdGliaWxpdGllcyB3aXRoIFVuaXggQGNvZGV7Z3Byb2Z9Ci0KLUBzY3tnbnV9IEBjb2Rle2dwcm9mfSBhbmQgQmVya2VsZXkgVW5peCBAY29kZXtncHJvZn0gdXNlIHRoZSBzYW1lIGRhdGEKLWZpbGUgQGZpbGV7Z21vbi5vdXR9LCBhbmQgcHJvdmlkZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBpbmZvcm1hdGlvbi4gIEJ1dAotdGhlcmUgYXJlIGEgZmV3IGRpZmZlcmVuY2VzLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHVzZXMgYSBuZXcsIGdlbmVyYWxpemVkIGZpbGUgZm9ybWF0IHdpdGggc3VwcG9ydAotZm9yIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgYW5kIG5vbi1yZWFsdGltZSBoaXN0b2dyYW1zLiAgQSBtYWdpYwotY29va2llIGFuZCB2ZXJzaW9uIG51bWJlciBhbGxvd3MgQGNvZGV7Z3Byb2Z9IHRvIGVhc2lseSBpZGVudGlmeQotbmV3IHN0eWxlIGZpbGVzLiAgT2xkIEJTRC1zdHlsZSBmaWxlcyBjYW4gc3RpbGwgYmUgcmVhZC4KLUB4cmVme0ZpbGUgRm9ybWF0fS4KLQotQGl0ZW0KLUZvciBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiwgVW5peCBAY29kZXtncHJvZn0gbGlzdHMgdGhlIGZ1bmN0aW9uIGFzIGEKLXBhcmVudCBhbmQgYXMgYSBjaGlsZCwgd2l0aCBhIEBjb2Rle2NhbGxzfSBmaWVsZCB0aGF0IGxpc3RzIHRoZSBudW1iZXIKLW9mIHJlY3Vyc2l2ZSBjYWxscy4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBvbWl0cyB0aGVzZSBsaW5lcyBhbmQgcHV0cwotdGhlIG51bWJlciBvZiByZWN1cnNpdmUgY2FsbHMgaW4gdGhlIHByaW1hcnkgbGluZS4KLQotQGl0ZW0KLVdoZW4gYSBmdW5jdGlvbiBpcyBzdXBwcmVzc2VkIGZyb20gdGhlIGNhbGwgZ3JhcGggd2l0aCBAc2FtcHstZX0sIEBzY3tnbnV9Ci1AY29kZXtncHJvZn0gc3RpbGwgbGlzdHMgaXQgYXMgYSBzdWJyb3V0aW5lIG9mIGZ1bmN0aW9ucyB0aGF0IGNhbGwgaXQuCi0KLUBpdGVtCi1Ac2N7Z251fSBAY29kZXtncHJvZn0gYWNjZXB0cyB0aGUgQHNhbXB7LWt9IHdpdGggaXRzIGFyZ3VtZW50Ci1pbiB0aGUgZm9ybSBAc2FtcHtmcm9tL3RvfSwgaW5zdGVhZCBvZiBAc2FtcHtmcm9tIHRvfS4KLQotQGl0ZW0KLUluIHRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcsCi1pZiB0aGVyZSBhcmUgbXVsdGlwbGUgYmFzaWMgYmxvY2tzIG9uIHRoZSBzYW1lIGxpbmUsCi1Ac2N7Z251fSBAY29kZXtncHJvZn0gcHJpbnRzIGFsbCBvZiB0aGVpciBjb3VudHMsIHNlcGVyYXRlZCBieSBjb21tYXMuCi0KLUBpZ25vcmUgLSBpdCBkb2VzIHRoaXMgbm93Ci1AaXRlbQotVGhlIGZ1bmN0aW9uIG5hbWVzIHByaW50ZWQgaW4gQHNje2dudX0gQGNvZGV7Z3Byb2Z9IG91dHB1dCBkbyBub3QgaW5jbHVkZQotdGhlIGxlYWRpbmcgdW5kZXJzY29yZXMgdGhhdCBhcmUgYWRkZWQgaW50ZXJuYWxseSB0byB0aGUgZnJvbnQgb2YgYWxsCi1DIGlkZW50aWZpZXJzIG9uIG1hbnkgb3BlcmF0aW5nIHN5c3RlbXMuCi1AZW5kIGlnbm9yZQotCi1AaXRlbQotVGhlIGJsdXJicywgZmllbGQgd2lkdGhzLCBhbmQgb3V0cHV0IGZvcm1hdHMgYXJlIGRpZmZlcmVudC4gIEBzY3tnbnV9Ci1AY29kZXtncHJvZn0gcHJpbnRzIGJsdXJicyBhZnRlciB0aGUgdGFibGVzLCBzbyB0aGF0IHlvdSBjYW4gc2VlIHRoZQotdGFibGVzIHdpdGhvdXQgc2tpcHBpbmcgdGhlIGJsdXJicy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBEZXRhaWxzCi1AY2hhcHRlciBEZXRhaWxzIG9mIFByb2ZpbGluZwotCi1AbWVudQotKiBJbXBsZW1lbnRhdGlvbjo6ICAgICAgSG93IGEgcHJvZ3JhbSBjb2xsZXRzIHByb2ZpbGluZyBpbmZvcm1hdGlvbgotKiBGaWxlIEZvcm1hdDo6ICAgICAgICAgRm9ybWF0IG9mIEBzYW1we2dtb24ub3V0fSBmaWxlcwotKiBJbnRlcm5hbHM6OiAgICAgICAgICAgQGNvZGV7Z3Byb2Z9J3MgaW50ZXJuYWwgb3BlcmF0aW9uCi0qIERlYnVnZ2luZzo6ICAgICAgICAgICBVc2luZyBAY29kZXtncHJvZn0ncyBAc2FtcHstZH0gb3B0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgSW1wbGVtZW50YXRpb24sRmlsZSBGb3JtYXQsLERldGFpbHMKLUBzZWN0aW9uIEltcGxlbWVudGF0aW9uIG9mIFByb2ZpbGluZwotCi1Qcm9maWxpbmcgd29ya3MgYnkgY2hhbmdpbmcgaG93IGV2ZXJ5IGZ1bmN0aW9uIGluIHlvdXIgcHJvZ3JhbSBpcyBjb21waWxlZAotc28gdGhhdCB3aGVuIGl0IGlzIGNhbGxlZCwgaXQgd2lsbCBzdGFzaCBhd2F5IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUKLWl0IHdhcyBjYWxsZWQgZnJvbS4gIEZyb20gdGhpcywgdGhlIHByb2ZpbGVyIGNhbiBmaWd1cmUgb3V0IHdoYXQgZnVuY3Rpb24KLWNhbGxlZCBpdCwgYW5kIGNhbiBjb3VudCBob3cgbWFueSB0aW1lcyBpdCB3YXMgY2FsbGVkLiAgVGhpcyBjaGFuZ2UgaXMgbWFkZQotYnkgdGhlIGNvbXBpbGVyIHdoZW4geW91ciBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggdGhlIEBzYW1wey1wZ30gb3B0aW9uLAotd2hpY2ggY2F1c2VzIGV2ZXJ5IGZ1bmN0aW9uIHRvIGNhbGwgQGNvZGV7bWNvdW50fQotKG9yIEBjb2Rle19tY291bnR9LCBvciBAY29kZXtfX21jb3VudH0sIGRlcGVuZGluZyBvbiB0aGUgT1MgYW5kIGNvbXBpbGVyKQotYXMgb25lIG9mIGl0cyBmaXJzdCBvcGVyYXRpb25zLgotCi1UaGUgQGNvZGV7bWNvdW50fSByb3V0aW5lLCBpbmNsdWRlZCBpbiB0aGUgcHJvZmlsaW5nIGxpYnJhcnksCi1pcyByZXNwb25zaWJsZSBmb3IgcmVjb3JkaW5nIGluIGFuIGluLW1lbW9yeSBjYWxsIGdyYXBoIHRhYmxlCi1ib3RoIGl0cyBwYXJlbnQgcm91dGluZSAodGhlIGNoaWxkKSBhbmQgaXRzIHBhcmVudCdzIHBhcmVudC4gIFRoaXMgaXMKLXR5cGljYWxseSBkb25lIGJ5IGV4YW1pbmluZyB0aGUgc3RhY2sgZnJhbWUgdG8gZmluZCBib3RoCi10aGUgYWRkcmVzcyBvZiB0aGUgY2hpbGQsIGFuZCB0aGUgcmV0dXJuIGFkZHJlc3MgaW4gdGhlIG9yaWdpbmFsIHBhcmVudC4KLVNpbmNlIHRoaXMgaXMgYSB2ZXJ5IG1hY2hpbmUtZGVwZW5kYW50IG9wZXJhdGlvbiwgQGNvZGV7bWNvdW50fQotaXRzZWxmIGlzIHR5cGljYWxseSBhIHNob3J0IGFzc2VtYmx5LWxhbmd1YWdlIHN0dWIgcm91dGluZQotdGhhdCBleHRyYWN0cyB0aGUgcmVxdWlyZWQKLWluZm9ybWF0aW9uLCBhbmQgdGhlbiBjYWxscyBAY29kZXtfX21jb3VudF9pbnRlcm5hbH0KLShhIG5vcm1hbCBDIGZ1bmN0aW9uKSB3aXRoIHR3byBhcmd1bWVudHMgLSBAY29kZXtmcm9tcGN9IGFuZCBAY29kZXtzZWxmcGN9LgotQGNvZGV7X19tY291bnRfaW50ZXJuYWx9IGlzIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZwotdGhlIGluLW1lbW9yeSBjYWxsIGdyYXBoLCB3aGljaCByZWNvcmRzIEBjb2Rle2Zyb21wY30sIEBjb2Rle3NlbGZwY30sCi1hbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIG9mIHRoZXNlIGNhbGwgYXJjcyB3YXMgdHJhbnN2ZXJzZWQuCi0KLUdDQyBWZXJzaW9uIDIgcHJvdmlkZXMgYSBtYWdpY2FsIGZ1bmN0aW9uIChAY29kZXtfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3N9KSwKLXdoaWNoIGFsbG93cyBhIGdlbmVyaWMgQGNvZGV7bWNvdW50fSBmdW5jdGlvbiB0byBleHRyYWN0IHRoZQotcmVxdWlyZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhY2sgZnJhbWUuICBIb3dldmVyLCBvbiBzb21lCi1hcmNoaXRlY3R1cmVzLCBtb3N0IG5vdGFibHkgdGhlIFNQQVJDLCB1c2luZyB0aGlzIGJ1aWx0aW4gY2FuIGJlCi12ZXJ5IGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUsIGFuZCBhbiBhc3NlbWJseSBsYW5ndWFnZSB2ZXJzaW9uCi1vZiBAY29kZXttY291bnR9IGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0KLU51bWJlci1vZi1jYWxscyBpbmZvcm1hdGlvbiBmb3IgbGlicmFyeSByb3V0aW5lcyBpcyBjb2xsZWN0ZWQgYnkgdXNpbmcgYQotc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBDIGxpYnJhcnkuICBUaGUgcHJvZ3JhbXMgaW4gaXQgYXJlIHRoZSBzYW1lIGFzIGluCi10aGUgdXN1YWwgQyBsaWJyYXJ5LCBidXQgdGhleSB3ZXJlIGNvbXBpbGVkIHdpdGggQHNhbXB7LXBnfS4gIElmIHlvdQotbGluayB5b3VyIHByb2dyYW0gd2l0aCBAc2FtcHtnY2MgQGRvdHN7fSAtcGd9LCBpdCBhdXRvbWF0aWNhbGx5IHVzZXMgdGhlCi1wcm9maWxpbmcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KLQotUHJvZmlsaW5nIGFsc28gaW52b2x2ZXMgd2F0Y2hpbmcgeW91ciBwcm9ncmFtIGFzIGl0IHJ1bnMsIGFuZCBrZWVwaW5nIGEKLWhpc3RvZ3JhbSBvZiB3aGVyZSB0aGUgcHJvZ3JhbSBjb3VudGVyIGhhcHBlbnMgdG8gYmUgZXZlcnkgbm93IGFuZCB0aGVuLgotVHlwaWNhbGx5IHRoZSBwcm9ncmFtIGNvdW50ZXIgaXMgbG9va2VkIGF0IGFyb3VuZCAxMDAgdGltZXMgcGVyIHNlY29uZCBvZgotcnVuIHRpbWUsIGJ1dCB0aGUgZXhhY3QgZnJlcXVlbmN5IG1heSB2YXJ5IGZyb20gc3lzdGVtIHRvIHN5c3RlbS4KLQotVGhpcyBpcyBkb25lIGlzIG9uZSBvZiB0d28gd2F5cy4gIE1vc3QgVU5JWC1saWtlIG9wZXJhdGluZyBzeXN0ZW1zCi1wcm92aWRlIGEgQGNvZGV7cHJvZmlsKCl9IHN5c3RlbSBjYWxsLCB3aGljaCByZWdpc3RlcnMgYSBtZW1vcnkKLWFycmF5IHdpdGggdGhlIGtlcm5lbCwgYWxvbmcgd2l0aCBhIHNjYWxlCi1mYWN0b3IgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgcHJvZ3JhbSdzIGFkZHJlc3Mgc3BhY2UgbWFwcwotaW50byB0aGUgYXJyYXkuCi1UeXBpY2FsIHNjYWxpbmcgdmFsdWVzIGNhdXNlIGV2ZXJ5IDIgdG8gOCBieXRlcyBvZiBhZGRyZXNzIHNwYWNlCi10byBtYXAgaW50byBhIHNpbmdsZSBhcnJheSBzbG90LgotT24gZXZlcnkgdGljayBvZiB0aGUgc3lzdGVtIGNsb2NrCi0oYXNzdW1pbmcgdGhlIHByb2ZpbGVkIHByb2dyYW0gaXMgcnVubmluZyksIHRoZSB2YWx1ZSBvZiB0aGUKLXByb2dyYW0gY291bnRlciBpcyBleGFtaW5lZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2xvdCBpbgotdGhlIG1lbW9yeSBhcnJheSBpcyBpbmNyZW1lbnRlZC4gIFNpbmNlIHRoaXMgaXMgZG9uZSBpbiB0aGUga2VybmVsLAotd2hpY2ggaGFkIHRvIGludGVycnVwdCB0aGUgcHJvY2VzcyBhbnl3YXkgdG8gaGFuZGxlIHRoZSBjbG9jawotaW50ZXJydXB0LCB2ZXJ5IGxpdHRsZSBhZGRpdGlvbmFsIHN5c3RlbSBvdmVyaGVhZCBpcyByZXF1aXJlZC4KLQotSG93ZXZlciwgc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgbW9zdCBub3RhYmx5IExpbnV4IDIuMCAoYW5kIGVhcmxpZXIpLAotZG8gbm90IHByb3ZpZGUgYSBAY29kZXtwcm9maWwoKX0gc3lzdGVtIGNhbGwuICBPbiBzdWNoIGEgc3lzdGVtLAotYXJyYW5nZW1lbnRzIGFyZSBtYWRlIGZvciB0aGUga2VybmVsIHRvIHBlcmlvZGljYWxseSBkZWxpdmVyCi1hIHNpZ25hbCB0byB0aGUgcHJvY2VzcyAodHlwaWNhbGx5IHZpYSBAY29kZXtzZXRpdGltZXIoKX0pLAotd2hpY2ggdGhlbiBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gb2YgZXhhbWluaW5nIHRoZQotcHJvZ3JhbSBjb3VudGVyIGFuZCBpbmNyZW1lbnRpbmcgYSBzbG90IGluIHRoZSBtZW1vcnkgYXJyYXkuCi1TaW5jZSB0aGlzIG1ldGhvZCByZXF1aXJlcyBhIHNpZ25hbCB0byBiZSBkZWxpdmVyZWQgdG8KLXVzZXIgc3BhY2UgZXZlcnkgdGltZSBhIHNhbXBsZSBpcyB0YWtlbiwgaXQgdXNlcyBjb25zaWRlcmFibHkKLW1vcmUgb3ZlcmhlYWQgdGhhbiBrZXJuZWwtYmFzZWQgcHJvZmlsaW5nLiAgQWxzbywgZHVlIHRvIHRoZQotYWRkZWQgZGVsYXkgcmVxdWlyZWQgdG8gZGVsaXZlciB0aGUgc2lnbmFsLCB0aGlzIG1ldGhvZCBpcwotbGVzcyBhY2N1cmF0ZSBhcyB3ZWxsLgotCi1BIHNwZWNpYWwgc3RhcnR1cCByb3V0aW5lIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBoaXN0b2dyYW0gYW5kIAotZWl0aGVyIGNhbGxzIEBjb2Rle3Byb2ZpbCgpfSBvciBzZXRzIHVwCi1hIGNsb2NrIHNpZ25hbCBoYW5kbGVyLgotVGhpcyByb3V0aW5lIChAY29kZXttb25zdGFydHVwfSkgY2FuIGJlIGludm9rZWQgaW4gc2V2ZXJhbCB3YXlzLgotT24gTGludXggc3lzdGVtcywgYSBzcGVjaWFsIHByb2ZpbGluZyBzdGFydHVwIGZpbGUgQGNvZGV7Z2NydDAub30sCi13aGljaCBpbnZva2VzIEBjb2Rle21vbnN0YXJ0dXB9IGJlZm9yZSBAY29kZXttYWlufSwKLWlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBAY29kZXtjcnQwLm99LgotVXNlIG9mIHRoaXMgc3BlY2lhbCBzdGFydHVwIGZpbGUgaXMgb25lIG9mIHRoZSBlZmZlY3RzCi1vZiB1c2luZyBAc2FtcHtnY2MgQGRvdHN7fSAtcGd9IHRvIGxpbmsuCi1PbiBTUEFSQyBzeXN0ZW1zLCBubyBzcGVjaWFsIHN0YXJ0dXAgZmlsZXMgYXJlIHVzZWQuCi1SYXRoZXIsIHRoZSBAY29kZXttY291bnR9IHJvdXRpbmUsIHdoZW4gaXQgaXMgaW52b2tlZCBmb3IKLXRoZSBmaXJzdCB0aW1lICh0eXBpY2FsbHkgd2hlbiBAY29kZXttYWlufSBpcyBjYWxsZWQpLAotY2FsbHMgQGNvZGV7bW9uc3RhcnR1cH0uCi0KLUlmIHRoZSBjb21waWxlcidzIEBzYW1wey1hfSBvcHRpb24gd2FzIHVzZWQsIGJhc2ljLWJsb2NrIGNvdW50aW5nCi1pcyBhbHNvIGVuYWJsZWQuICBFYWNoIG9iamVjdCBmaWxlIGlzIHRoZW4gY29tcGlsZWQgd2l0aCBhIHN0YXRpYyBhcnJheQotb2YgY291bnRzLCBpbml0aWFsbHkgemVyby4KLUluIHRoZSBleGVjdXRhYmxlIGNvZGUsIGV2ZXJ5IHRpbWUgYSBuZXcgYmFzaWMtYmxvY2sgYmVnaW5zCi0oaS5lLiB3aGVuIGFuIEBjb2Rle2lmfSBzdGF0ZW1lbnQgYXBwZWFycyksIGFuIGV4dHJhIGluc3RydWN0aW9uCi1pcyBpbnNlcnRlZCB0byBpbmNyZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcgY291bnQgaW4gdGhlIGFycmF5LgotQXQgY29tcGlsZSB0aW1lLCBhIHBhaXJlZCBhcnJheSB3YXMgY29uc3RydWN0ZWQgdGhhdCByZWNvcmRlZAotdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgZWFjaCBiYXNpYy1ibG9jay4gIFRha2VuIHRvZ2V0aGVyLAotdGhlIHR3byBhcnJheXMgcmVjb3JkIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGV2ZXJ5IGJhc2ljLWJsb2NrLAotYWxvbmcgd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyBleGVjdXRlZC4KLQotVGhlIHByb2ZpbGluZyBsaWJyYXJ5IGFsc28gaW5jbHVkZXMgYSBmdW5jdGlvbiAoQGNvZGV7bWNsZWFudXB9KSB3aGljaCBpcwotdHlwaWNhbGx5IHJlZ2lzdGVyZWQgdXNpbmcgQGNvZGV7YXRleGl0KCl9IHRvIGJlIGNhbGxlZCBhcyB0aGUKLXByb2dyYW0gZXhpdHMsIGFuZCBpcyByZXNwb25zaWJsZSBmb3Igd3JpdGluZyB0aGUgZmlsZSBAZmlsZXtnbW9uLm91dH0uCi1Qcm9maWxpbmcgaXMgdHVybmVkIG9mZiwgdmFyaW91cyBoZWFkZXJzIGFyZSBvdXRwdXQsIGFuZCB0aGUgaGlzdG9ncmFtCi1pcyB3cml0dGVuLCBmb2xsb3dlZCBieSB0aGUgY2FsbC1ncmFwaCBhcmNzIGFuZCB0aGUgYmFzaWMtYmxvY2sgY291bnRzLgotCi1UaGUgb3V0cHV0IGZyb20gQGNvZGV7Z3Byb2Z9IGdpdmVzIG5vIGluZGljYXRpb24gb2YgcGFydHMgb2YgeW91ciBwcm9ncmFtIHRoYXQKLWFyZSBsaW1pdGVkIGJ5IEkvTyBvciBzd2FwcGluZyBiYW5kd2lkdGguICBUaGlzIGlzIGJlY2F1c2Ugc2FtcGxlcyBvZiB0aGUKLXByb2dyYW0gY291bnRlciBhcmUgdGFrZW4gYXQgZml4ZWQgaW50ZXJ2YWxzIG9mIHRoZSBwcm9ncmFtJ3MgcnVuIHRpbWUuCi1UaGVyZWZvcmUsIHRoZQotdGltZSBtZWFzdXJlbWVudHMgaW4gQGNvZGV7Z3Byb2Z9IG91dHB1dCBzYXkgbm90aGluZyBhYm91dCB0aW1lIHRoYXQgeW91cgotcHJvZ3JhbSB3YXMgbm90IHJ1bm5pbmcuICBGb3IgZXhhbXBsZSwgYSBwYXJ0IG9mIHRoZSBwcm9ncmFtIHRoYXQgY3JlYXRlcwotc28gbXVjaCBkYXRhIHRoYXQgaXQgY2Fubm90IGFsbCBmaXQgaW4gcGh5c2ljYWwgbWVtb3J5IGF0IG9uY2UgbWF5IHJ1biB2ZXJ5Ci1zbG93bHkgZHVlIHRvIHRocmFzaGluZywgYnV0IEBjb2Rle2dwcm9mfSB3aWxsIHNheSBpdCB1c2VzIGxpdHRsZSB0aW1lLiAgT24KLXRoZSBvdGhlciBoYW5kLCBzYW1wbGluZyBieSBydW4gdGltZSBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHRoZSBhbW91bnQgb2YKLWxvYWQgZHVlIHRvIG90aGVyIHVzZXJzIHdvbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUgb3V0cHV0IHlvdSBnZXQuCi0KLUBub2RlIEZpbGUgRm9ybWF0LEludGVybmFscyxJbXBsZW1lbnRhdGlvbixEZXRhaWxzCi1Ac2VjdGlvbiBQcm9maWxpbmcgRGF0YSBGaWxlIEZvcm1hdAotCi1UaGUgb2xkIEJTRC1kZXJpdmVkIGZpbGUgZm9ybWF0IHVzZWQgZm9yIHByb2ZpbGUgZGF0YSBkb2VzIG5vdCBjb250YWluIGEKLW1hZ2ljIGNvb2tpZSB0aGF0IGFsbG93cyB0byBjaGVjayB3aGV0aGVyIGEgZGF0YSBmaWxlIHJlYWxseSBpcyBhCi1ncHJvZiBmaWxlLiAgRnVydGhlcm1vcmUsIGl0IGRvZXMgbm90IHByb3ZpZGUgYSB2ZXJzaW9uIG51bWJlciwgdGh1cwotcmVuZGVyaW5nIGNoYW5nZXMgdG8gdGhlIGZpbGUgZm9ybWF0IGFsbW9zdCBpbXBvc3NpYmxlLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9Ci11c2VzIGEgbmV3IGZpbGUgZm9ybWF0IHRoYXQgcHJvdmlkZXMgdGhlc2UgZmVhdHVyZXMuICBGb3IgYmFja3dhcmQKLWNvbXBhdGliaWxpdHksIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBjb250aW51ZXMgdG8gc3VwcG9ydCB0aGUgb2xkIEJTRC1kZXJpdmVkCi1mb3JtYXQsIGJ1dCBub3QgYWxsIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgd2l0aCBpdC4gIEZvciBleGFtcGxlLAotYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBjYW5ub3QgYmUgYWNjb21tb2RhdGVkIGJ5IHRoZSBvbGQgZmlsZQotZm9ybWF0LgotCi1UaGUgbmV3IGZpbGUgZm9ybWF0IGlzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGUgQGZpbGV7Z21vbl9vdXQuaH0uICBJdAotY29uc2lzdHMgb2YgYSBoZWFkZXIgY29udGFpbmluZyB0aGUgbWFnaWMgY29va2llIGFuZCBhIHZlcnNpb24gbnVtYmVyLAotYXMgd2VsbCBhcyBzb21lIHNwYXJlIGJ5dGVzIGF2YWlsYWJsZSBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuICBBbGwgZGF0YQotaW4gYSBwcm9maWxlIGRhdGEgZmlsZSBpcyBpbiB0aGUgbmF0aXZlIGZvcm1hdCBvZiB0aGUgaG9zdCBvbiB3aGljaAotdGhlIHByb2ZpbGUgd2FzIGNvbGxlY3RlZC4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBhZGFwdHMgYXV0b21hdGljYWxseSB0byB0aGUKLWJ5dGUtb3JkZXIgaW4gdXNlLgotCi1JbiB0aGUgbmV3IGZpbGUgZm9ybWF0LCB0aGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YKLXJlY29yZHMuICBDdXJyZW50bHksIHRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgcmVjb3JkIHR5cGVzOiBoaXN0b2dyYW0KLXJlY29yZHMsIGNhbGwtZ3JhcGggYXJjIHJlY29yZHMsIGFuZCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQKLXJlY29yZHMuICBFYWNoIGZpbGUgY2FuIGNvbnRhaW4gYW55IG51bWJlciBvZiBlYWNoIHJlY29yZCB0eXBlLiAgV2hlbgotcmVhZGluZyBhIGZpbGUsIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSB3aWxsIGVuc3VyZSByZWNvcmRzIG9mIHRoZSBzYW1lIHR5cGUgYXJlCi1jb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlciBhbmQgY29tcHV0ZSB0aGUgdW5pb24gb2YgYWxsIHJlY29yZHMuICBGb3IKLWV4YW1wbGUsIGZvciBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLCB0aGUgdW5pb24gaXMgc2ltcGx5IHRoZSBzdW0KLW9mIGFsbCBleGVjdXRpb24gY291bnRzIGZvciBlYWNoIGJhc2ljLWJsb2NrLgotCi1Ac3Vic2VjdGlvbiBIaXN0b2dyYW0gUmVjb3JkcwotCi1IaXN0b2dyYW0gcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIHRoYXQgaXMgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YKLWJpbnMuICBUaGUgaGVhZGVyIGNvbnRhaW5zIHRoZSB0ZXh0LXNlZ21lbnQgcmFuZ2UgdGhhdCB0aGUgaGlzdG9ncmFtCi1zcGFucywgdGhlIHNpemUgb2YgdGhlIGhpc3RvZ3JhbSBpbiBieXRlcyAodW5saWtlIGluIHRoZSBvbGQgQlNECi1mb3JtYXQsIHRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyKSwgdGhlIHJhdGUgb2YgdGhlCi1wcm9maWxpbmcgY2xvY2ssIGFuZCB0aGUgcGh5c2ljYWwgZGltZW5zaW9uIHRoYXQgdGhlIGJpbiBjb3VudHMKLXJlcHJlc2VudCBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlIHByb2ZpbGluZyBjbG9jayByYXRlLiAgVGhlCi1waHlzaWNhbCBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHR3byBwYXJ0czogYSBsb25nIG5hbWUgb2YgdXAgdG8gMTUKLWNoYXJhY3RlcnMgYW5kIGEgc2luZ2xlIGNoYXJhY3RlciBhYmJyZXZpYXRpb24uICBGb3IgZXhhbXBsZSwgYQotaGlzdG9ncmFtIHJlcHJlc2VudGluZyByZWFsLXRpbWUgd291bGQgc3BlY2lmeSB0aGUgbG9uZyBuYW1lIGFzCi0ic2Vjb25kcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24gYXMgInMiLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IKLWFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IHBlcmZvcm1hbmNlIG1vbml0b3IgaGFyZHdhcmUgKHdoaWNoLAotZm9ydHVuYXRlbHksIGlzIGJlY29taW5nIGluY3JlYXNpbmdseSBjb21tb24pLiAgRm9yIGV4YW1wbGUsIHVuZGVyIERFQwotT1NGLzEsIHRoZSAidXByb2ZpbGUiIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZSBhIGhpc3RvZ3JhbSBvZiwKLXNheSwgaW5zdHJ1Y3Rpb24gY2FjaGUgbWlzc2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGltZW5zaW9uIGluIHRoZQotaGlzdG9ncmFtIGhlYWRlciBjb3VsZCBiZSBzZXQgdG8gImktY2FjaGUgbWlzc2VzIiBhbmQgdGhlIGFiYnJldmlhdGlvbgotY291bGQgYmUgc2V0IHRvICIxIiAoYmVjYXVzZSBpdCBpcyBzaW1wbHkgYSBjb3VudCwgbm90IGEgcGh5c2ljYWwKLWRpbWVuc2lvbikuICBBbHNvLCB0aGUgcHJvZmlsaW5nIHJhdGUgd291bGQgaGF2ZSB0byBiZSBzZXQgdG8gMSBpbgotdGhpcyBjYXNlLgotCi1IaXN0b2dyYW0gYmlucyBhcmUgMTYtYml0IG51bWJlcnMgYW5kIGVhY2ggYmluIHJlcHJlc2VudCBhbiBlcXVhbAotYW1vdW50IG9mIHRleHQtc3BhY2UuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRleHQtc2VnbWVudCBpcyBvbmUKLXRob3VzYW5kIGJ5dGVzIGxvbmcgYW5kIGlmIHRoZXJlIGFyZSB0ZW4gYmlucyBpbiB0aGUgaGlzdG9ncmFtLCBlYWNoCi1iaW4gcmVwcmVzZW50cyBvbmUgaHVuZHJlZCBieXRlcy4KLQotCi1Ac3Vic2VjdGlvbiBDYWxsLUdyYXBoIFJlY29yZHMKLQotQ2FsbC1ncmFwaCByZWNvcmRzIGhhdmUgYSBmb3JtYXQgdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB1c2VkIGluCi10aGUgQlNELWRlcml2ZWQgZmlsZSBmb3JtYXQuICBJdCBjb25zaXN0cyBvZiBhbiBhcmMgaW4gdGhlIGNhbGwgZ3JhcGgKLWFuZCBhIGNvdW50IGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYXJjIHdhcyB0cmF2ZXJzZWQKLWR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbi4gIEFyY3MgYXJlIHNwZWNpZmllZCBieSBhIHBhaXIgb2YgYWRkcmVzc2VzOgotdGhlIGZpcnN0IG11c3QgYmUgd2l0aGluIGNhbGxlcidzIGZ1bmN0aW9uIGFuZCB0aGUgc2Vjb25kIG11c3QgYmUKLXdpdGhpbiB0aGUgY2FsbGVlJ3MgZnVuY3Rpb24uICBXaGVuIHBlcmZvcm1pbmcgcHJvZmlsaW5nIGF0IHRoZQotZnVuY3Rpb24gbGV2ZWwsIHRoZXNlIGFkZHJlc3NlcyBjYW4gcG9pbnQgYW55d2hlcmUgd2l0aGluIHRoZQotcmVzcGVjdGl2ZSBmdW5jdGlvbi4gIEhvd2V2ZXIsIHdoZW4gcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWxldmVsLCBpdCBpcwotYmV0dGVyIGlmIHRoZSBhZGRyZXNzZXMgYXJlIGFzIGNsb3NlIHRvIHRoZSBjYWxsLXNpdGUvZW50cnktcG9pbnQgYXMKLXBvc3NpYmxlLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBsaW5lLWxldmVsIGNhbGwtZ3JhcGggaXMgYWJsZSB0bwotaWRlbnRpZnkgZXhhY3RseSB3aGljaCBsaW5lIG9mIHNvdXJjZSBjb2RlIHBlcmZvcm1lZCBjYWxscyB0byBhCi1mdW5jdGlvbi4KLQotQHN1YnNlY3Rpb24gQmFzaWMtQmxvY2sgRXhlY3V0aW9uIENvdW50IFJlY29yZHMKLQotQmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50IHJlY29yZHMgY29uc2lzdCBvZiBhIGhlYWRlciBmb2xsb3dlZCBieSBhCi1zZXF1ZW5jZSBvZiBhZGRyZXNzL2NvdW50IHBhaXJzLiAgVGhlIGhlYWRlciBzaW1wbHkgc3BlY2lmaWVzIHRoZQotbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4gIEluIGFuIGFkZHJlc3MvY291bnQgcGFpciwgdGhlIGFkZHJlc3MKLWlkZW50aWZpZXMgYSBiYXNpYy1ibG9jayBhbmQgdGhlIGNvdW50IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWVzCi10aGF0IGJhc2ljLWJsb2NrIHdhcyBleGVjdXRlZC4gIEFueSBhZGRyZXNzIHdpdGhpbiB0aGUgYmFzaWMtYWRkcmVzcyBjYW4KLWJlIHVzZWQuCi0KLUBub2RlIEludGVybmFscyxEZWJ1Z2dpbmcsRmlsZSBGb3JtYXQsRGV0YWlscwotQHNlY3Rpb24gQGNvZGV7Z3Byb2Z9J3MgSW50ZXJuYWwgT3BlcmF0aW9uCi0KLUxpa2UgbW9zdCBwcm9ncmFtcywgQGNvZGV7Z3Byb2Z9IGJlZ2lucyBieSBwcm9jZXNzaW5nIGl0cyBvcHRpb25zLgotRHVyaW5nIHRoaXMgc3RhZ2UsIGl0IG1heSBidWlsZGluZyBpdHMgc3ltc3BlYyBsaXN0Ci0oQGNvZGV7c3ltX2lkcy5jOnN5bV9pZF9hZGR9KSwgaWYKLW9wdGlvbnMgYXJlIHNwZWNpZmllZCB3aGljaCB1c2Ugc3ltc3BlY3MuCi1AY29kZXtncHJvZn0gbWFpbnRhaW5zIGEgc2luZ2xlIGxpbmtlZCBsaXN0IG9mIHN5bXNwZWNzLAotd2hpY2ggd2lsbCBldmVudHVhbGx5IGdldCB0dXJuZWQgaW50byAxMiBzeW1ib2wgdGFibGVzLAotb3JnYW5pemVkIGludG8gc2l4IGluY2x1ZGUvZXhjbHVkZSBwYWlycyAtIG9uZQotcGFpciBlYWNoIGZvciB0aGUgZmxhdCBwcm9maWxlIChJTkNMX0ZMQVQvRVhDTF9GTEFUKSwKLXRoZSBjYWxsIGdyYXBoIGFyY3MgKElOQ0xfQVJDUy9FWENMX0FSQ1MpLAotcHJpbnRpbmcgaW4gdGhlIGNhbGwgZ3JhcGggKElOQ0xfR1JBUEgvRVhDTF9HUkFQSCksCi10aW1pbmcgcHJvcGFnYXRpb24gaW4gdGhlIGNhbGwgZ3JhcGggKElOQ0xfVElNRS9FWENMX1RJTUUpLAotdGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZyAoSU5DTF9BTk5PL0VYQ0xfQU5OTyksCi1hbmQgdGhlIGV4ZWN1dGlvbiBjb3VudCBsaXN0aW5nIChJTkNMX0VYRUMvRVhDTF9FWEVDKS4KLQotQWZ0ZXIgb3B0aW9uIHByb2Nlc3NpbmcsIEBjb2Rle2dwcm9mfSBmaW5pc2hlcwotYnVpbGRpbmcgdGhlIHN5bXNwZWMgbGlzdCBieSBhZGRpbmcgYWxsIHRoZSBzeW1zcGVjcyBpbgotQGNvZGV7ZGVmYXVsdF9leGNsdWRlZF9saXN0fSB0byB0aGUgZXhjbHVkZSBsaXN0cwotRVhDTF9USU1FIGFuZCBFWENMX0dSQVBILCBhbmQgaWYgbGluZS1ieS1saW5lIHByb2ZpbGluZyBpcyBzcGVjaWZpZWQsCi1FWENMX0ZMQVQgYXMgd2VsbC4KLVRoZXNlIGRlZmF1bHQgZXhjbHVkZXMgYXJlIG5vdCBhZGRlZCB0byBFWENMX0FOTk8sIEVYQ0xfQVJDUywgYW5kIEVYQ0xfRVhFQy4KLQotTmV4dCwgdGhlIEJGRCBsaWJyYXJ5IGlzIGNhbGxlZCB0byBvcGVuIHRoZSBvYmplY3QgZmlsZSwKLXZlcmlmeSB0aGF0IGl0IGlzIGFuIG9iamVjdCBmaWxlLAotYW5kIHJlYWQgaXRzIHN5bWJvbCB0YWJsZSAoQGNvZGV7Y29yZS5jOmNvcmVfaW5pdH0pLAotdXNpbmcgQGNvZGV7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9IGFmdGVyIG1hbGxvY2luZwotYW4gYXBwcm9waWF0ZSBzaXplZCBhcnJheSBvZiBhc3ltYm9scy4gIEF0IHRoaXMgcG9pbnQsCi1mdW5jdGlvbiBtYXBwaW5ncyBhcmUgcmVhZCAoaWYgdGhlIEBzYW1wey0tZmlsZS1vcmRlcmluZ30gb3B0aW9uCi1oYXMgYmVlbiBzcGVjaWZpZWQpLCBhbmQgdGhlIGNvcmUgdGV4dCBzcGFjZSBpcyByZWFkIGludG8KLW1lbW9yeSAoaWYgdGhlIEBzYW1wey1jfSBvcHRpb24gd2FzIGdpdmVuKS4KLQotQGNvZGV7Z3Byb2Z9J3Mgb3duIHN5bWJvbCB0YWJsZSwgYW4gYXJyYXkgb2YgU3ltIHN0cnVjdHVyZXMsCi1pcyBub3cgYnVpbHQuCi1UaGlzIGlzIGRvbmUgaW4gb25lIG9mIHR3byB3YXlzLCBieSBvbmUgb2YgdHdvIHJvdXRpbmVzLCBkZXBlbmRpbmcKLW9uIHdoZXRoZXIgbGluZS1ieS1saW5lIHByb2ZpbGluZyAoQHNhbXB7LWx9IG9wdGlvbikgaGFzIGJlZW4KLWVuYWJsZWQuCi1Gb3Igbm9ybWFsIHByb2ZpbGluZywgdGhlIEJGRCBjYW5vbmljYWwgc3ltYm9sIHRhYmxlIGlzIHNjYW5uZWQuCi1Gb3IgbGluZS1ieS1saW5lIHByb2ZpbGluZywgZXZlcnkKLXRleHQgc3BhY2UgYWRkcmVzcyBpcyBleGFtaW5lZCwgYW5kIGEgbmV3IHN5bWJvbCB0YWJsZSBlbnRyeQotZ2V0cyBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhlIGxpbmUgbnVtYmVyIGNoYW5nZXMuCi1JbiBlaXRoZXIgY2FzZSwgdHdvIHBhc3NlcyBhcmUgbWFkZSB0aHJvdWdoIHRoZSBzeW1ib2wKLXRhYmxlIC0gb25lIHRvIGNvdW50IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUgcmVxdWlyZWQsCi1hbmQgdGhlIG90aGVyIHRvIGFjdHVhbGx5IHJlYWQgdGhlIHN5bWJvbHMuICBJbiBiZXR3ZWVuIHRoZQotdHdvIHBhc3NlcywgYSBzaW5nbGUgYXJyYXkgb2YgdHlwZSBAY29kZXtTeW19IGlzIGNyZWF0ZWQgb2YKLXRoZSBhcHByb3BpYXRlIGxlbmd0aC4KLUZpbmFsbHksIEBjb2Rle3N5bXRhYi5jOnN5bXRhYl9maW5hbGl6ZX0KLWlzIGNhbGxlZCB0byBzb3J0IHRoZSBzeW1ib2wgdGFibGUgYW5kIHJlbW92ZSBkdXBsaWNhdGUgZW50cmllcwotKGVudHJpZXMgd2l0aCB0aGUgc2FtZSBtZW1vcnkgYWRkcmVzcykuCi0KLVRoZSBzeW1ib2wgdGFibGUgbXVzdCBiZSBhIGNvbnRpZ3VvdXMgYXJyYXkgZm9yIHR3byByZWFzb25zLgotRmlyc3QsIHRoZSBAY29kZXtxc29ydH0gbGlicmFyeSBmdW5jdGlvbiAod2hpY2ggc29ydHMgYW4gYXJyYXkpCi13aWxsIGJlIHVzZWQgdG8gc29ydCB0aGUgc3ltYm9sIHRhYmxlLgotQWxzbywgdGhlIHN5bWJvbCBsb29rdXAgcm91dGluZSAoQGNvZGV7c3ltdGFiLmM6c3ltX2xvb2t1cH0pLAotd2hpY2ggZmluZHMgc3ltYm9scwotYmFzZWQgb24gbWVtb3J5IGFkZHJlc3MsIHVzZXMgYSBiaW5hcnkgc2VhcmNoIGFsZ29yaXRobQotd2hpY2ggcmVxdWlyZXMgdGhlIHN5bWJvbCB0YWJsZSB0byBiZSBhIHNvcnRlZCBhcnJheS4KLUZ1bmN0aW9uIHN5bWJvbHMgYXJlIGluZGljYXRlZCB3aXRoIGFuIEBjb2Rle2lzX2Z1bmN9IGZsYWcuCi1MaW5lIG51bWJlciBzeW1ib2xzIGhhdmUgbm8gc3BlY2lhbCBmbGFncyBzZXQuCi1BZGRpdGlvbmFsbHksIGEgc3ltYm9sIGNhbiBoYXZlIGFuIEBjb2Rle2lzX3N0YXRpY30gZmxhZwotdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBhIGxvY2FsIHN5bWJvbC4KLQotV2l0aCB0aGUgc3ltYm9sIHRhYmxlIHJlYWQsIHRoZSBzeW1zcGVjcyBjYW4gbm93IGJlIHRyYW5zbGF0ZWQKLWludG8gU3ltcyAoQGNvZGV7c3ltX2lkcy5jOnN5bV9pZF9wYXJzZX0pLiAgUmVtZW1iZXIgdGhhdCBhIHNpbmdsZQotc3ltc3BlYyBjYW4gbWF0Y2ggbXVsdGlwbGUgc3ltYm9scy4KLUFuIGFycmF5IG9mIHN5bWJvbCB0YWJsZXMKLShAY29kZXtzeW1zfSkgaXMgY3JlYXRlZCwgZWFjaCBlbnRyeSBvZiB3aGljaCBpcyBhIHN5bWJvbCB0YWJsZQotb2YgU3ltcyB0byBiZSBpbmNsdWRlZCBvciBleGNsdWRlZCBmcm9tIGEgcGFydGljdWxhciBsaXN0aW5nLgotVGhlIG1hc3RlciBzeW1ib2wgdGFibGUgYW5kIHRoZSBzeW1zcGVjcyBhcmUgZXhhbWluZWQgYnkgbmVzdGVkCi1sb29wcywgYW5kIGV2ZXJ5IHN5bWJvbCB0aGF0IG1hdGNoZXMgYSBzeW1zcGVjIGlzIGluc2VydGVkCi1pbnRvIHRoZSBhcHByb3ByaWF0ZSBzeW1zIHRhYmxlLiAgVGhpcyBpcyBkb25lIHR3aWNlLCBvbmNlIHRvCi1jb3VudCB0aGUgc2l6ZSBvZiBlYWNoIHJlcXVpcmVkIHN5bWJvbCB0YWJsZSwgYW5kIGFnYWluIHRvIGJ1aWxkCi10aGUgdGFibGVzLCB3aGljaCBoYXZlIGJlZW4gbWFsbG9jZWQgYmV0d2VlbiBwYXNzZXMuCi1Gcm9tIG5vdyBvbiwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgb24gYW4gaW5jbHVkZQotb3IgZXhjbHVkZSBzeW1zcGVjIGxpc3QsIEBjb2Rle2dwcm9mfSBzaW1wbHkgdXNlcyBpdHMKLXN0YW5kYXJkIHN5bWJvbCBsb29rdXAgcm91dGluZSBvbiB0aGUgYXBwcm9wcmlhdGUgdGFibGUKLWluIHRoZSBAY29kZXtzeW1zfSBhcnJheS4KLQotTm93IHRoZSBwcm9maWxlIGRhdGEgZmlsZShzKSB0aGVtc2VsdmVzIGFyZSByZWFkCi0oQGNvZGV7Z21vbl9pby5jOmdtb25fb3V0X3JlYWR9KSwKLWZpcnN0IGJ5IGNoZWNraW5nIGZvciBhIG5ldy1zdHlsZSBAc2FtcHtnbW9uLm91dH0gaGVhZGVyLAotdGhlbiBhc3N1bWluZyB0aGlzIGlzIGFuIG9sZC1zdHlsZSBCU0QgQHNhbXB7Z21vbi5vdXR9Ci1pZiB0aGUgbWFnaWMgbnVtYmVyIHRlc3QgZmFpbGVkLgotCi1OZXctc3R5bGUgaGlzdG9ncmFtIHJlY29yZHMgYXJlIHJlYWQgYnkgQGNvZGV7aGlzdC5jOmhpc3RfcmVhZF9yZWN9LgotRm9yIHRoZSBmaXJzdCBoaXN0b2dyYW0gcmVjb3JkLCBhbGxvY2F0ZSBhIG1lbW9yeSBhcnJheSB0byBob2xkCi1hbGwgdGhlIGJpbnMsIGFuZCByZWFkIHRoZW0gaW4uCi1XaGVuIG11bHRpcGxlIHByb2ZpbGUgZGF0YSBmaWxlcyAob3IgZmlsZXMgd2l0aCBtdWx0aXBsZSBoaXN0b2dyYW0KLXJlY29yZHMpIGFyZSByZWFkLCB0aGUgc3RhcnRpbmcgYWRkcmVzcywgZW5kaW5nIGFkZHJlc3MsIG51bWJlcgotb2YgYmlucyBhbmQgc2FtcGxpbmcgcmF0ZSBtdXN0IG1hdGNoIGJldHdlZW4gdGhlIHZhcmlvdXMgaGlzdG9ncmFtcywKLW9yIGEgZmF0YWwgZXJyb3Igd2lsbCByZXN1bHQuCi1JZiBldmVyeXRoaW5nIG1hdGNoZXMsIGp1c3Qgc3VtIHRoZSBhZGRpdGlvbmFsIGhpc3RvZ3JhbXMgaW50bwotdGhlIGV4aXN0aW5nIGluLW1lbW9yeSBhcnJheS4KLQotQXMgZWFjaCBjYWxsIGdyYXBoIHJlY29yZCBpcyByZWFkIChAY29kZXtjYWxsX2dyYXBoLmM6Y2dfcmVhZF9yZWN9KSwKLXRoZSBwYXJlbnQgYW5kIGNoaWxkIGFkZHJlc3NlcwotYXJlIG1hdGNoZWQgdG8gc3ltYm9sIHRhYmxlIGVudHJpZXMsIGFuZCBhIGNhbGwgZ3JhcGggYXJjIGlzCi1jcmVhdGVkIGJ5IEBjb2Rle2NnX2FyY3MuYzphcmNfYWRkfSwgdW5sZXNzIHRoZSBhcmMgZmFpbHMgYSBzeW1zcGVjCi1jaGVjayBhZ2FpbnN0IElOQ0xfQVJDUy9FWENMX0FSQ1MuICBBcyBlYWNoIGFyYyBpcyBhZGRlZCwKLWEgbGlua2VkIGxpc3QgaXMgbWFpbnRhaW5lZCBvZiB0aGUgcGFyZW50J3MgY2hpbGQgYXJjcywgYW5kIG9mIHRoZSBjaGlsZCdzCi1wYXJlbnQgYXJjcy4KLUJvdGggdGhlIGNoaWxkJ3MgY2FsbCBjb3VudCBhbmQgdGhlIGFyYydzIGNhbGwgY291bnQgYXJlCi1pbmNyZW1lbnRlZCBieSB0aGUgcmVjb3JkJ3MgY2FsbCBjb3VudC4KLQotQmFzaWMtYmxvY2sgcmVjb3JkcyBhcmUgcmVhZCAoQGNvZGV7YmFzaWNfYmxvY2tzLmM6YmJfcmVhZF9yZWN9KSwKLWJ1dCBvbmx5IGlmIGxpbmUtYnktbGluZSBwcm9maWxpbmcgaGFzIGJlZW4gc2VsZWN0ZWQuCi1FYWNoIGJhc2ljLWJsb2NrIGFkZHJlc3MgaXMgbWF0Y2hlZCB0byBhIGNvcnJlc3BvbmRpbmcgbGluZQotc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUsIGFuZCBhbiBlbnRyeSBtYWRlIGluIHRoZSBzeW1ib2wncwotYmJfYWRkciBhbmQgYmJfY2FsbHMgYXJyYXlzLiAgQWdhaW4sIGlmIG11bHRpcGxlIGJhc2ljLWJsb2NrCi1yZWNvcmRzIGFyZSBwcmVzZW50IGZvciB0aGUgc2FtZSBhZGRyZXNzLCB0aGUgY2FsbCBjb3VudHMKLWFyZSBjdW11bGF0aXZlLgotCi1BIGdtb24uc3VtIGZpbGUgaXMgZHVtcGVkLCBpZiByZXF1ZXN0ZWQgKEBjb2Rle2dtb25faW8uYzpnbW9uX291dF93cml0ZX0pLgotCi1JZiBoaXN0b2dyYW1zIHdlcmUgcHJlc2VudCBpbiB0aGUgZGF0YSBmaWxlcywgYXNzaWduIHRoZW0gdG8gc3ltYm9scwotKEBjb2Rle2hpc3QuYzpoaXN0X2Fzc2lnbl9zYW1wbGVzfSkgYnkgaXRlcmF0aW5nIG92ZXIgYWxsIHRoZSBzYW1wbGUKLWJpbnMgYW5kIGFzc2lnbmluZyB0aGVtIHRvIHN5bWJvbHMuICBTaW5jZSB0aGUgc3ltYm9sIHRhYmxlCi1pcyBzb3J0ZWQgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIG1lbW9yeSBhZGRyZXNzZXMsIHdlIGNhbgotc2ltcGxlIGZvbGxvdyBhbG9uZyBpbiB0aGUgc3ltYm9sIHRhYmxlIGFzIHdlIG1ha2Ugb3VyIHBhc3MKLW92ZXIgdGhlIHNhbXBsZSBiaW5zLgotVGhpcyBzdGVwIGluY2x1ZGVzIGEgc3ltc3BlYyBjaGVjayBhZ2FpbnN0IElOQ0xfRkxBVC9FWENMX0ZMQVQuCi1EZXBlbmRpbmcgb24gdGhlIGhpc3RvZ3JhbQotc2NhbGUgZmFjdG9yLCBhIHNhbXBsZSBiaW4gbWF5IHNwYW4gbXVsdGlwbGUgc3ltYm9scywKLWluIHdoaWNoIGNhc2UgYSBmcmFjdGlvbiBvZiB0aGUgc2FtcGxlIGNvdW50IGlzIGFsbG9jYXRlZAotdG8gZWFjaCBzeW1ib2wsIHByb3BvcnRpb25hbCB0byB0aGUgZGVncmVlIG9mIG92ZXJsYXAuCi1UaGlzIGVmZmVjdCBpcyByYXJlIGZvciBub3JtYWwgcHJvZmlsaW5nLCBidXQgb3ZlcmxhcHMKLWFyZSBtb3JlIGNvbW1vbiBkdXJpbmcgbGluZS1ieS1saW5lIHByb2ZpbGluZywgYW5kIGNhbgotY2F1c2UgZWFjaCBvZiB0d28gYWRqYWNlbnQgbGluZXMgdG8gYmUgY3JlZGl0ZWQgd2l0aCBoYWxmCi1hIGhpdCwgZm9yIGV4YW1wbGUuCi0KLUlmIGNhbGwgZ3JhcGggZGF0YSBpcyBwcmVzZW50LCBAY29kZXtjZ19hcmNzLmM6Y2dfYXNzZW1ibGV9IGlzIGNhbGxlZC4KLUZpcnN0LCBpZiBAc2FtcHstY30gd2FzIHNwZWNpZmllZCwgYSBtYWNoaW5lLWRlcGVuZGFudAotcm91dGluZSAoQGNvZGV7ZmluZF9jYWxsfSkgc2NhbnMgdGhyb3VnaCBlYWNoIHN5bWJvbCdzIG1hY2hpbmUgY29kZSwKLWxvb2tpbmcgZm9yIHN1YnJvdXRpbmUgY2FsbCBpbnN0cnVjdGlvbnMsIGFuZCBhZGRpbmcgdGhlbQotdG8gdGhlIGNhbGwgZ3JhcGggd2l0aCBhIHplcm8gY2FsbCBjb3VudC4KLUEgdG9wb2xvZ2ljYWwgc29ydCBpcyBwZXJmb3JtZWQgYnkgZGVwdGgtZmlyc3QgbnVtYmVyaW5nCi1hbGwgdGhlIHN5bWJvbHMgKEBjb2Rle2NnX2Rmbi5jOmNnX2Rmbn0pLCBzbyB0aGF0Ci1jaGlsZHJlbiBhcmUgYWx3YXlzIG51bWJlcmVkIGxlc3MgdGhhbiB0aGVpciBwYXJlbnRzLAotdGhlbiBtYWtpbmcgYSBhcnJheSBvZiBwb2ludGVycyBpbnRvIHRoZSBzeW1ib2wgdGFibGUgYW5kIHNvcnRpbmcgaXQgaW50bwotbnVtZXJpY2FsIG9yZGVyLCB3aGljaCBpcyByZXZlcnNlIHRvcG9sb2dpY2FsCi1vcmRlciAoY2hpbGRyZW4gYXBwZWFyIGJlZm9yZSBwYXJlbnRzKS4KLUN5Y2xlcyBhcmUgYWxzbyBkZXRlY3RlZCBhdCB0aGlzIHBvaW50LCBhbGwgbWVtYmVycwotb2Ygd2hpY2ggYXJlIGFzc2lnbmVkIHRoZSBzYW1lIHRvcG9sb2dpY2FsIG51bWJlci4KLVR3byBwYXNzZXMgYXJlIG5vdyBtYWRlIHRocm91Z2ggdGhpcyBzb3J0ZWQgYXJyYXkgb2Ygc3ltYm9sIHBvaW50ZXJzLgotVGhlIGZpcnN0IHBhc3MsIGZyb20gZW5kIHRvIGJlZ2lubmluZyAocGFyZW50cyB0byBjaGlsZHJlbiksCi1jb21wdXRlcyB0aGUgZnJhY3Rpb24gb2YgY2hpbGQgdGltZSB0byBwcm9wb2dhdGUgdG8gZWFjaCBwYXJlbnQKLWFuZCBhIHByaW50IGZsYWcuCi1UaGUgcHJpbnQgZmxhZyByZWZsZWN0cyBzeW1zcGVjIGhhbmRsaW5nIG9mIElOQ0xfR1JBUEgvRVhDTF9HUkFQSCwKLXdpdGggYSBwYXJlbnQncyBpbmNsdWRlIG9yIGV4Y2x1ZGUgKHByaW50IG9yIG5vIHByaW50KSBwcm9wZXJ0eQotYmVpbmcgcHJvcGFnYXRlZCB0byBpdHMgY2hpbGRyZW4sIHVubGVzcyB0aGV5IHRoZW1zZWx2ZXMgZXhwbGljaXRseSBhcHBlYXIKLWluIElOQ0xfR1JBUEggb3IgRVhDTF9HUkFQSC4KLUEgc2Vjb25kIHBhc3MsIGZyb20gYmVnaW5uaW5nIHRvIGVuZCAoY2hpbGRyZW4gdG8gcGFyZW50cykgYWN0dWFsbHkKLXByb3BvZ2F0ZXMgdGhlIHRpbWluZ3MgYWxvbmcgdGhlIGNhbGwgZ3JhcGgsIHN1YmplY3QKLXRvIGEgY2hlY2sgYWdhaW5zdCBJTkNMX1RJTUUvRVhDTF9USU1FLgotV2l0aCB0aGUgcHJpbnQgZmxhZywgZnJhY3Rpb25zLCBhbmQgdGltaW5ncyBub3cgc3RvcmVkIGluIHRoZSBzeW1ib2wKLXN0cnVjdHVyZXMsIHRoZSB0b3BvbG9naWNhbCBzb3J0IGFycmF5IGlzIG5vdyBkaXNjYXJkZWQsIGFuZCBhCi1uZXcgYXJyYXkgb2YgcG9pbnRlcnMgaXMgYXNzZW1ibGVkLCB0aGlzIHRpbWUgc29ydGVkIGJ5IHByb3BhZ2F0ZWQgdGltZS4KLQotRmluYWxseSwgcHJpbnQgdGhlIHZhcmlvdXMgb3V0cHV0cyB0aGUgdXNlciByZXF1ZXN0ZWQsIHdoaWNoIGlzIG5vdyBmYWlybHkKLXN0cmFpZ2h0Zm9yd2FyZC4gIFRoZSBjYWxsIGdyYXBoIChAY29kZXtjZ19wcmludC5jOmNnX3ByaW50fSkgYW5kCi1mbGF0IHByb2ZpbGUgKEBjb2Rle2hpc3QuYzpoaXN0X3ByaW50fSkgYXJlIHJlZ3VyZ2l0YXRpb25zIG9mIHZhbHVlcwotYWxyZWFkeSBjb21wdXRlZC4gIFRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcKLShAY29kZXtiYXNpY19ibG9ja3MuYzpwcmludF9hbm5vdGF0ZWRfc291cmNlfSkgdXNlcyBiYXNpYy1ibG9jawotaW5mb3JtYXRpb24sIGlmIHByZXNlbnQsIHRvIGxhYmVsIGVhY2ggbGluZSBvZiBjb2RlIHdpdGggY2FsbCBjb3VudHMsCi1vdGhlcndpc2Ugb25seSB0aGUgZnVuY3Rpb24gY2FsbCBjb3VudHMgYXJlIHByZXNlbnRlZC4KLQotVGhlIGZ1bmN0aW9uIG9yZGVyaW5nIGNvZGUgaXMgbWFyZ2luYWxseSB3ZWxsIGRvY3VtZW50ZWQKLWluIHRoZSBzb3VyY2UgY29kZSBpdHNlbGYgKEBjb2Rle2NnX3ByaW50LmN9KS4gIEJhc2ljYWxseSwKLXRoZSBmdW5jdGlvbnMgd2l0aCB0aGUgbW9zdCB1c2UgYW5kIHRoZSBtb3N0IHBhcmVudHMgYXJlCi1wbGFjZWQgZmlyc3QsIGZvbGxvd2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyB3aXRoIHRoZSBtb3N0IHVzZSwKLWZvbGxvd2VkIGJ5IGxvd2VyIHVzZSBmdW5jdGlvbnMsIGZvbGxvd2VkIGJ5IHVudXNlZCBmdW5jdGlvbnMKLWF0IHRoZSBlbmQuCi0KLUBub2RlIERlYnVnZ2luZywsSW50ZXJuYWxzLERldGFpbHMKLUBzdWJzZWN0aW9uIERlYnVnZ2luZyBAY29kZXtncHJvZn0KLQotSWYgQGNvZGV7Z3Byb2Z9IHdhcyBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLAotdGhlIEBzYW1wey1kfSBvcHRpb24gdHJpZ2dlcnMgZGVidWdnaW5nIG91dHB1dAotKHRvIHN0ZG91dCkgd2hpY2ggY2FuIGJlIGhlbHBmdWwgaW4gdW5kZXJzdGFuZGluZyBpdHMgb3BlcmF0aW9uLgotVGhlIGRlYnVnZ2luZyBudW1iZXIgc3BlY2lmaWVkIGlzIGludGVycHJldGVkIGFzIGEgc3VtIG9mIHRoZSBmb2xsb3dpbmcKLW9wdGlvbnM6Ci0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gMiAtIFRvcG9sb2dpY2FsIHNvcnQKLU1vbml0b3IgZGVwdGgtZmlyc3QgbnVtYmVyaW5nIG9mIHN5bWJvbHMgZHVyaW5nIGNhbGwgZ3JhcGggYW5hbHlzaXMKLUBpdGVtIDQgLSBDeWNsZXMKLVNob3dzIHN5bWJvbHMgYXMgdGhleSBhcmUgaWRlbnRpZmllZCBhcyBjeWNsZSBoZWFkcwotQGl0ZW0gMTYgLSBUYWxseWluZwotQXMgdGhlIGNhbGwgZ3JhcGggYXJjcyBhcmUgcmVhZCwgc2hvdyBlYWNoIGFyYyBhbmQgaG93Ci10aGUgdG90YWwgY2FsbHMgdG8gZWFjaCBmdW5jdGlvbiBhcmUgdGFsbGllZAotQGl0ZW0gMzIgLSBDYWxsIGdyYXBoIGFyYyBzb3J0aW5nCi1EZXRhaWxzIHNvcnRpbmcgaW5kaXZpZHVhbCBwYXJlbnRzL2NoaWxkcmVuIHdpdGhpbiBlYWNoIGNhbGwgZ3JhcGggZW50cnkKLUBpdGVtIDY0IC0gUmVhZGluZyBoaXN0b2dyYW0gYW5kIGNhbGwgZ3JhcGggcmVjb3JkcwotU2hvd3MgYWRkcmVzcyByYW5nZXMgb2YgaGlzdG9ncmFtcyBhcyB0aGV5IGFyZSByZWFkLCBhbmQgZWFjaAotY2FsbCBncmFwaCBhcmMKLUBpdGVtIDEyOCAtIFN5bWJvbCB0YWJsZQotUmVhZGluZywgY2xhc3NpZnlpbmcsIGFuZCBzb3J0aW5nIHRoZSBzeW1ib2wgdGFibGUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuCi1Gb3IgbGluZS1ieS1saW5lIHByb2ZpbGluZyAoQHNhbXB7LWx9IG9wdGlvbiksIGFsc28gc2hvd3MgbGluZSBudW1iZXJzCi1iZWluZyBhc3NpZ25lZCB0byBtZW1vcnkgYWRkcmVzc2VzLgotQGl0ZW0gMjU2IC0gU3RhdGljIGNhbGwgZ3JhcGgKLVRyYWNlIG9wZXJhdGlvbiBvZiBAc2FtcHstY30gb3B0aW9uCi1AaXRlbSA1MTIgLSBTeW1ib2wgdGFibGUgYW5kIGFyYyB0YWJsZSBsb29rdXBzCi1EZXRhaWwgb3BlcmF0aW9uIG9mIGxvb2t1cCByb3V0aW5lcwotQGl0ZW0gMTAyNCAtIENhbGwgZ3JhcGggcHJvcGFnYXRpb24KLVNob3dzIGhvdyBmdW5jdGlvbiB0aW1lcyBhcmUgcHJvcGFnYXRlZCBhbG9uZyB0aGUgY2FsbCBncmFwaAotQGl0ZW0gMjA0OCAtIEJhc2ljLWJsb2NrcwotU2hvd3MgYmFzaWMtYmxvY2sgcmVjb3JkcyBhcyB0aGV5IGFyZSByZWFkIGZyb20gcHJvZmlsZSBkYXRhCi0ob25seSBtZWFuaW5nZnVsIHdpdGggQHNhbXB7LWx9IG9wdGlvbikKLUBpdGVtIDQwOTYgLSBTeW1zcGVjcwotU2hvd3Mgc3ltc3BlYy10by1zeW1ib2wgcGF0dGVybiBtYXRjaGluZyBvcGVyYXRpb24KLUBpdGVtIDgxOTIgLSBBbm5vdGF0ZSBzb3VyY2UKLVRyYWNrcyBvcGVyYXRpb24gb2YgQHNhbXB7LUF9IG9wdGlvbgotQGVuZCB0YWJsZQotCi1AY29udGVudHMKLUBieWUKLQotTkVFRFMgQU4gSU5ERVgKLQotLVQgLSAidHJhZGl0aW9uYWwgQlNEIHN0eWxlIjogSG93IGlzIGl0IGRpZmZlcmVudD8gIFNob3VsZCB0aGUKLWRpZmZlcmVuY2VzIGJlIGRvY3VtZW50ZWQ/Ci0KLWV4YW1wbGUgZmxhdCBmaWxlIGFkZHMgdXAgdG8gMTAwLjAxJS4uLgotCi1ub3RlOiB0aW1lIGVzdGltYXRlcyBub3cgb25seSBnbyBvdXQgdG8gb25lIGRlY2ltYWwgcGxhY2UgKDAuMCksIHdoZXJlCi10aGV5IHVzZWQgdG8gZXh0ZW5kIHR3byAoNzguNjcpLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGVydHouYyBiL2dwcm9mL2hlcnR6LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MzE0YWMuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaGVydHouYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiaGVydHouaCIKLQotCi0jaWZkZWYgX19NU0RPU19fCi0jZGVmaW5lIEhFUlRaIDE4Ci0jZW5kaWYKLQotaW50Ci1oZXJ0eiAoKQotewotI2lmZGVmIEhFUlRaCi0gIHJldHVybiBIRVJUWjsKLSNlbHNlIC8qICEgZGVmaW5lZCAoSEVSVFopICovCi0jaWZkZWYgSEFWRV9TRVRJVElNRVIKLSAgc3RydWN0IGl0aW1lcnZhbCB0aW07Ci0KLSAgdGltLml0X2ludGVydmFsLnR2X3NlYyA9IDA7Ci0gIHRpbS5pdF9pbnRlcnZhbC50dl91c2VjID0gMTsKLSAgdGltLml0X3ZhbHVlLnR2X3NlYyA9IDA7Ci0gIHRpbS5pdF92YWx1ZS50dl91c2VjID0gMDsKLSAgc2V0aXRpbWVyIChJVElNRVJfUkVBTCwgJnRpbSwgMCk7Ci0gIHNldGl0aW1lciAoSVRJTUVSX1JFQUwsIDAsICZ0aW0pOwotICBpZiAodGltLml0X2ludGVydmFsLnR2X3VzZWMgPCAyKQotICAgIHsKLSAgICAgIHJldHVybiBIWl9XUk9ORzsKLSAgICB9Ci0gIHJldHVybiAxMDAwMDAwIC8gdGltLml0X2ludGVydmFsLnR2X3VzZWM7Ci0jZWxzZSAvKiAhIGRlZmluZWQgKEhBVkVfU0VUSVRJTUVSKSAqLwotI2lmIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgJiYgZGVmaW5lZCAoX1NDX0NMS19UQ0spCi0gIHJldHVybiBzeXNjb25mIChfU0NfQ0xLX1RDSyk7Ci0jZWxzZSAvKiAhIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgfHwgISBkZWZpbmVkIChfU0NfQ0xLX1RDSykgKi8KLSAgcmV0dXJuIEhaX1dST05HOwotI2VuZGlmIC8qICEgZGVmaW5lZCAoSEFWRV9TWVNDT05GKSB8fCAhIGRlZmluZWQgKF9TQ19DTEtfVENLKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoSEFWRV9TRVRJVElNRVIpICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChIRVJUWikgKi8KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2hlcnR6LmggYi9ncHJvZi9oZXJ0ei5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWEwMWJhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2hlcnR6LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jaWZuZGVmIGhlcnR6X2gKLSNkZWZpbmUgaGVydHpfaAotCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLQotI2RlZmluZQlIWl9XUk9ORyAwCQkvKiBpbXBvc3NpYmxlIGNsb2NrIGZyZXF1ZW5jeSAqLwotCi0vKgotICogRGlzY292ZXIgdGhlIHRpY2sgZnJlcXVlbmN5IG9mIHRoZSBtYWNoaW5lIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLAotICogd2UgcmV0dXJuIEhaX1dST05HLCBhbiBpbXBvc3NpYmxlIHNhbXBsaW5nIGZyZXF1ZW5jeS4KLSAqLwotCi0vKiBGSVhNRTogQ2hlY2tpbmcgZm9yIE1BQ0ggaGVyZSBtYWtlcyBubyBzZW5zZSB3aGVuIGZvciBhIGNyb3NzCi0gICBncHJvZi4gICovCi0jaWZkZWYgTUFDSAotI2luY2x1ZGUgPG1hY2hpbmUvbWFjaF9wYXJhbS5oPgotI2RlZmluZSBoZXJ0eigpIChIWikKLSNlbHNlCi1leHRlcm4gaW50IGhlcnR6IFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogaGVydHpfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGlzdC5jIGIvZ3Byb2YvaGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmVmMjVhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2hpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKgotICogSGlzdG9ncmFtIHJlbGF0ZWQgb3BlcmF0aW9ucy4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotI2RlZmluZSBVTklUU19UT19DT0RFIChvZmZzZXRfdG9fY29kZSAvIHNpemVvZihVTklUKSkKLQotc3RhdGljIHZvaWQgc2NhbGVfYW5kX2FsaWduX2VudHJpZXMgUEFSQU1TICgodm9pZCkpOwotCi0vKiBkZWNsYXJhdGlvbnMgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIHRvIG91dHB1dCBibHVyYnM6ICovCi1leHRlcm4gdm9pZCBmbGF0X2JsdXJiIFBBUkFNUyAoKEZJTEUgKiBmcCkpOwotCi1iZmRfdm1hIHNfbG93cGM7CQkvKiBsb3dlc3QgYWRkcmVzcyBpbiAudGV4dCAqLwotYmZkX3ZtYSBzX2hpZ2hwYyA9IDA7CQkvKiBoaWdoZXN0IGFkZHJlc3MgaW4gLnRleHQgKi8KLWJmZF92bWEgbG93cGMsIGhpZ2hwYzsJCS8qIHNhbWUsIGJ1dCBleHByZXNzZWQgaW4gVU5JVHMgKi8KLWludCBoaXN0X251bV9iaW5zID0gMDsJCS8qIG51bWJlciBvZiBoaXN0b2dyYW0gc2FtcGxlcyAqLwotaW50ICpoaXN0X3NhbXBsZSA9IDA7CQkvKiBoaXN0b2dyYW0gc2FtcGxlcyAoc2hvcnRzIGluIHRoZSBmaWxlISkgKi8KLWRvdWJsZSBoaXN0X3NjYWxlOwotY2hhciBoaXN0X2RpbWVuc2lvbltzaXplb2YgKCgoc3RydWN0IGdtb25faGlzdF9oZHIgKikgMCktPmRpbWVuKSArIDFdID0KLSAgInNlY29uZHMiOwotY2hhciBoaXN0X2RpbWVuc2lvbl9hYmJyZXYgPSAncyc7Ci0KLXN0YXRpYyBkb3VibGUgYWNjdW1fdGltZTsJLyogYWNjdW11bGF0ZWQgdGltZSBzbyBmYXIgZm9yIHByaW50X2xpbmUoKSAqLwotc3RhdGljIGRvdWJsZSB0b3RhbF90aW1lOwkvKiB0b3RhbCB0aW1lIGZvciBhbGwgcm91dGluZXMgKi8KLS8qCi0gKiBUYWJsZSBvZiBTSSBwcmVmaXhlcyBmb3IgcG93ZXJzIG9mIDEwICh1c2VkIHRvIGF1dG9tYXRpY2FsbHkKLSAqIHNjYWxlIHNvbWUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZmxhdCBwcm9maWxlKS4KLSAqLwotY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHByZWZpeDsKLSAgICBkb3VibGUgc2NhbGU7Ci0gIH0KLVNJdGFiW10gPQotewotICB7Ci0gICAgJ1QnLCAxZS0xMgotICB9Ci0gICwJCQkJLyogdGVyYSAqLwotICB7Ci0gICAgJ0cnLCAxZS0wOQotICB9Ci0gICwJCQkJLyogZ2lnYSAqLwotICB7Ci0gICAgJ00nLCAxZS0wNgotICB9Ci0gICwJCQkJLyogbWVnYSAqLwotICB7Ci0gICAgJ0snLCAxZS0wMwotICB9Ci0gICwJCQkJLyoga2lsbyAqLwotICB7Ci0gICAgJyAnLCAxZS0wMAotICB9Ci0gICwKLSAgewotICAgICdtJywgMWUrMDMKLSAgfQotICAsCQkJCS8qIG1pbGxpICovCi0gIHsKLSAgICAndScsIDFlKzA2Ci0gIH0KLSAgLAkJCQkvKiBtaWNybyAqLwotICB7Ci0gICAgJ24nLCAxZSswOQotICB9Ci0gICwJCQkJLyogbmFubyAqLwotICB7Ci0gICAgJ3AnLCAxZSsxMgotICB9Ci0gICwJCQkJLyogcGljbyAqLwotICB7Ci0gICAgJ2YnLCAxZSsxNQotICB9Ci0gICwJCQkJLyogZmVtdG8gKi8KLSAgewotICAgICdhJywgMWUrMTgKLSAgfQotICAsCQkJCS8qIGF0byAqLwotfTsKLQotLyoKLSAqIFJlYWQgdGhlIGhpc3RvZ3JhbSBmcm9tIGZpbGUgSUZQLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUgb2YgSUZQIGFuZAotICogaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGhpc3RfcmVhZF9yZWMsIChpZnAsIGZpbGVuYW1lKSwgRklMRSAqIGlmcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIHN0cnVjdCBnbW9uX2hpc3RfaGRyIGhkcjsKLSAgYmZkX3ZtYSBuX2xvd3BjLCBuX2hpZ2hwYzsKLSAgaW50IGksIG5jbnQsIHByb2ZyYXRlOwotICBVTklUIGNvdW50OwotCi0gIGlmIChmcmVhZCAoJmhkciwgc2l6ZW9mIChoZHIpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBuX2xvd3BjID0gKGJmZF92bWEpIGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLmxvd19wYyk7Ci0gIG5faGlnaHBjID0gKGJmZF92bWEpIGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLmhpZ2hfcGMpOwotICBuY250ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIuaGlzdF9zaXplKTsKLSAgcHJvZnJhdGUgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5wcm9mX3JhdGUpOwotICBzdHJuY3B5IChoaXN0X2RpbWVuc2lvbiwgaGRyLmRpbWVuLCBzaXplb2YgKGhkci5kaW1lbikpOwotICBoaXN0X2RpbWVuc2lvbltzaXplb2YgKGhkci5kaW1lbildID0gJ1wwJzsKLSAgaGlzdF9kaW1lbnNpb25fYWJicmV2ID0gaGRyLmRpbWVuX2FiYnJldjsKLQotICBpZiAoIXNfaGlnaHBjKQotICAgIHsKLQotICAgICAgLyogdGhpcyBpcyB0aGUgZmlyc3QgaGlzdG9ncmFtIHJlY29yZDogKi8KLQotICAgICAgc19sb3dwYyA9IG5fbG93cGM7Ci0gICAgICBzX2hpZ2hwYyA9IG5faGlnaHBjOwotICAgICAgbG93cGMgPSAoYmZkX3ZtYSkgbl9sb3dwYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBoaWdocGMgPSAoYmZkX3ZtYSkgbl9oaWdocGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgaGlzdF9udW1fYmlucyA9IG5jbnQ7Ci0gICAgICBoeiA9IHByb2ZyYXRlOwotICAgIH0KLQotICBEQkcgKFNBTVBMRURFQlVHLAotICAgICAgIHByaW50ZiAoIltoaXN0X3JlYWRfcmVjXSBuX2xvd3BjIDB4JWx4IG5faGlnaHBjIDB4JWx4IG5jbnQgJWRcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBuX2xvd3BjLCAodW5zaWduZWQgbG9uZykgbl9oaWdocGMsIG5jbnQpOwotICAgICAgIHByaW50ZiAoIltoaXN0X3JlYWRfcmVjXSBzX2xvd3BjIDB4JWx4IHNfaGlnaHBjIDB4JWx4IG5zYW1wbGVzICVkXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc19sb3dwYywgKHVuc2lnbmVkIGxvbmcpIHNfaGlnaHBjLAotCSAgICAgICBoaXN0X251bV9iaW5zKTsKLSAgICAgICBwcmludGYgKCJbaGlzdF9yZWFkX3JlY10gICBsb3dwYyAweCVseCAgIGhpZ2hwYyAweCVseFxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxvd3BjLCAodW5zaWduZWQgbG9uZykgaGlnaHBjKSk7Ci0KLSAgaWYgKG5fbG93cGMgIT0gc19sb3dwYyB8fCBuX2hpZ2hwYyAhPSBzX2hpZ2hwYwotICAgICAgfHwgbmNudCAhPSBoaXN0X251bV9iaW5zIHx8IGh6ICE9IHByb2ZyYXRlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGAlcycgaXMgaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iKSwKLQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKCFoaXN0X3NhbXBsZSkKLSAgICB7Ci0gICAgICBoaXN0X3NhbXBsZSA9IChpbnQgKikgeG1hbGxvYyAoaGlzdF9udW1fYmlucyAqIHNpemVvZiAoaGlzdF9zYW1wbGVbMF0pKTsKLSAgICAgIG1lbXNldCAoaGlzdF9zYW1wbGUsIDAsIGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgaWYgKGZyZWFkICgmY291bnRbMF0sIHNpemVvZiAoY291bnQpLCAxLCBpZnApICE9IDEpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCIlczogJXM6IHVuZXhwZWN0ZWQgRU9GIGFmdGVyIHJlYWRpbmcgJWQgb2YgJWQgc2FtcGxlc1xuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUsIGksIGhpc3RfbnVtX2JpbnMpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgaGlzdF9zYW1wbGVbaV0gKz0gYmZkX2dldF8xNiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIGNvdW50WzBdKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGV4ZWN1dGlvbiBoaXN0b2dyYW0gdG8gZmlsZSBPRlAuICBGSUxFTkFNRSBpcyB0aGUgbmFtZQotICogb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcyBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoaGlzdF93cml0ZV9oaXN0LCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBzdHJ1Y3QgZ21vbl9oaXN0X2hkciBoZHI7Ci0gIHVuc2lnbmVkIGNoYXIgdGFnOwotICBVTklUIGNvdW50OwotICBpbnQgaTsKLQotICAvKiB3cml0ZSBoZWFkZXI6ICovCi0KLSAgdGFnID0gR01PTl9UQUdfVElNRV9ISVNUOwotICBwdXRfdm1hIChjb3JlX2JmZCwgc19sb3dwYywgKGJmZF9ieXRlICopIGhkci5sb3dfcGMpOwotICBwdXRfdm1hIChjb3JlX2JmZCwgc19oaWdocGMsIChiZmRfYnl0ZSAqKSBoZHIuaGlnaF9wYyk7Ci0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoaXN0X251bV9iaW5zLCAoYmZkX2J5dGUgKikgaGRyLmhpc3Rfc2l6ZSk7Ci0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoeiwgKGJmZF9ieXRlICopIGhkci5wcm9mX3JhdGUpOwotICBzdHJuY3B5IChoZHIuZGltZW4sIGhpc3RfZGltZW5zaW9uLCBzaXplb2YgKGhkci5kaW1lbikpOwotICBoZHIuZGltZW5fYWJicmV2ID0gaGlzdF9kaW1lbnNpb25fYWJicmV2OwotCi0gIGlmIChmd3JpdGUgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgb2ZwKSAhPSAxCi0gICAgICB8fCBmd3JpdGUgKCZoZHIsIHNpemVvZiAoaGRyKSwgMSwgb2ZwKSAhPSAxKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgYmZkX3B1dF8xNiAoY29yZV9iZmQsIGhpc3Rfc2FtcGxlW2ldLCAoYmZkX2J5dGUgKikgJiBjb3VudFswXSk7Ci0gICAgICBpZiAoZndyaXRlICgmY291bnRbMF0sIHNpemVvZiAoY291bnQpLCAxLCBvZnApICE9IDEpCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDYWxjdWxhdGUgc2NhbGVkIGVudHJ5IHBvaW50IGFkZHJlc3NlcyAodG8gc2F2ZSB0aW1lIGluCi0gKiBoaXN0X2Fzc2lnbl9zYW1wbGVzKSwgYW5kLCBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgaGF2ZSBwcm9jZWR1cmUKLSAqIGVudHJ5IG1hc2tzIGF0IHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLCBwb3NzaWJseSBwdXNoIHRoZSBzY2FsZWQKLSAqIGVudHJ5IHBvaW50cyBvdmVyIHRoZSBwcm9jZWR1cmUgZW50cnkgbWFzaywgaWYgaXQgdHVybnMgb3V0IHRoYXQKLSAqIHRoZSBlbnRyeSBwb2ludCBpcyBpbiBvbmUgYmluIGFuZCB0aGUgY29kZSBmb3IgYSByb3V0aW5lIGlzIGluIHRoZQotICogbmV4dCBiaW4uCi0gKi8KLXN0YXRpYyB2b2lkCi1zY2FsZV9hbmRfYWxpZ25fZW50cmllcyAoKQotewotICBTeW0gKnN5bTsKLSAgYmZkX3ZtYSBiaW5fb2ZfZW50cnk7Ci0gIGJmZF92bWEgYmluX29mX2NvZGU7Ci0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyBzeW0rKykKLSAgICB7Ci0gICAgICBzeW0tPmhpc3Quc2NhbGVkX2FkZHIgPSBzeW0tPmFkZHIgLyBzaXplb2YgKFVOSVQpOwotICAgICAgYmluX29mX2VudHJ5ID0gKHN5bS0+aGlzdC5zY2FsZWRfYWRkciAtIGxvd3BjKSAvIGhpc3Rfc2NhbGU7Ci0gICAgICBiaW5fb2ZfY29kZSA9IChzeW0tPmhpc3Quc2NhbGVkX2FkZHIgKyBVTklUU19UT19DT0RFIC0gbG93cGMpIC8gaGlzdF9zY2FsZTsKLSAgICAgIGlmIChiaW5fb2ZfZW50cnkgPCBiaW5fb2ZfY29kZSkKLQl7Ci0JICBEQkcgKFNBTVBMRURFQlVHLAotCSAgICAgICBwcmludGYgKCJbc2NhbGVfYW5kX2FsaWduX2VudHJpZXNdIHB1c2hpbmcgMHglbHggdG8gMHglbHhcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgc3ltLT5oaXN0LnNjYWxlZF9hZGRyLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChzeW0tPmhpc3Quc2NhbGVkX2FkZHIKLQkJCQkJKyBVTklUU19UT19DT0RFKSkpOwotCSAgc3ltLT5oaXN0LnNjYWxlZF9hZGRyICs9IFVOSVRTX1RPX0NPREU7Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogQXNzaWduIHNhbXBsZXMgdG8gdGhlIHN5bWJvbCB0byB3aGljaCB0aGV5IGJlbG9uZy4KLSAqCi0gKiBIaXN0b2dyYW0gYmluIEkgY292ZXJzIHNvbWUgYWRkcmVzcyByYW5nZSBbQklOX0xPV1BDLEJJTl9ISUdIX1BDKQotICogd2hpY2ggbWF5IG92ZXJsYXAgb25lIG1vcmUgc3ltYm9sIGFkZHJlc3MgcmFuZ2VzLiAgSWYgYSBzeW1ib2wKLSAqIG92ZXJsYXBzIHdpdGggdGhlIGJpbidzIGFkZHJlc3MgcmFuZ2UgYnkgTyBwZXJjZW50LCB0aGVuIE8gcGVyY2VudAotICogb2YgdGhlIGJpbidzIGNvdW50IGlzIGNyZWRpdGVkIHRvIHRoYXQgc3ltYm9sLgotICoKLSAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyBhcyB0byB3aGVyZSBCSU5fTE9XX1BDIGFuZCBCSU5fSElHSF9QQyBjYW4gYmUKLSAqIHdpdGggcmVzcGVjdCB0byB0aGUgc3ltYm9sJ3MgYWRkcmVzcyByYW5nZSBbU1lNX0xPV19QQywKLSAqIFNZTV9ISUdIX1BDKSBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGRpYWdyYW0uICBPVkVSTEFQIGNvbXB1dGVzCi0gKiB0aGUgZGlzdGFuY2UgKGluIFVOSVRzKSBiZXR3ZWVuIHRoZSBhcnJvd3MsIHRoZSBmcmFjdGlvbiBvZiB0aGUKLSAqIHNhbXBsZSB0aGF0IGlzIHRvIGJlIGNyZWRpdGVkIHRvIHRoZSBzeW1ib2wgd2hpY2ggc3RhcnRzIGF0Ci0gKiBTWU1fTE9XX1BDLgotICoKLSAqICAgICAgICBzeW1fbG93X3BjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1faGlnaF9wYwotICogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgotICoKLSAqICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICB8ICAtPnwgICAgfDwtICAgICAgICAgLT58ICAgICAgICAgfDwtICAgICAgICAgLT58ICAgIHw8LSAgfAotICogICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICB8Ci0gKiAgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgKy0tLS0tLS0tLSsKLSAqCi0gKiAgICAgICAgXiAgICAgICAgIF4gICAgICAgICAgICAgXiAgICAgICAgIF4gICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfAotICogICBiaW5fbG93X3BjIGJpbl9oaWdoX3BjICBiaW5fbG93X3BjIGJpbl9oaWdoX3BjICBiaW5fbG93X3BjIGJpbl9oaWdoX3BjCi0gKgotICogRm9yIHRoZSBWQVggd2UgYXNzZXJ0IHRoYXQgc2FtcGxlcyB3aWxsIG5ldmVyIGZhbGwgaW4gdGhlIGZpcnN0IHR3bwotICogYnl0ZXMgb2YgYW55IHJvdXRpbmUsIHNpbmNlIHRoYXQgaXMgdGhlIGVudHJ5IG1hc2ssIHRodXMgd2UgY2FsbAotICogc2NhbGVfYW5kX2FsaWduX2VudHJpZXMoKSB0byBhZGp1c3QgdGhlIGVudHJ5IHBvaW50cyBpZiB0aGUgZW50cnkKLSAqIG1hc2sgZmFsbHMgaW4gb25lIGJpbiBidXQgdGhlIGNvZGUgZm9yIHRoZSByb3V0aW5lIGRvZXNuJ3Qgc3RhcnQKLSAqIHVudGlsIHRoZSBuZXh0IGJpbi4gIEluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFsaWdubWVudCBvZiByb3V0aW5lCi0gKiBhZGRyZXNzZXMsIHRoaXMgc2hvdWxkIGFsbG93IHVzIHRvIGhhdmUgb25seSBvbmUgc2FtcGxlIGZvciBldmVyeQotICogZm91ciBieXRlcyBvZiB0ZXh0IHNwYWNlIGFuZCBuZXZlciBoYXZlIGFueSBvdmVybGFwICh0aGUgdHdvIGVuZAotICogY2FzZXMsIGFib3ZlKS4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAoaGlzdF9hc3NpZ25fc2FtcGxlcykKLXsKLSAgYmZkX3ZtYSBiaW5fbG93X3BjLCBiaW5faGlnaF9wYzsKLSAgYmZkX3ZtYSBzeW1fbG93X3BjLCBzeW1faGlnaF9wYzsKLSAgYmZkX3ZtYSBvdmVybGFwLCBhZGRyOwotICBpbnQgYmluX2NvdW50LCBpOwotICB1bnNpZ25lZCBpbnQgajsKLSAgZG91YmxlIHRpbWUsIGNyZWRpdDsKLQotICAvKiByZWFkIHNhbXBsZXMgYW5kIGFzc2lnbiB0byBzeW1ib2xzOiAqLwotICBoaXN0X3NjYWxlID0gaGlnaHBjIC0gbG93cGM7Ci0gIGhpc3Rfc2NhbGUgLz0gaGlzdF9udW1fYmluczsKLSAgc2NhbGVfYW5kX2FsaWduX2VudHJpZXMgKCk7Ci0KLSAgLyogaXRlcmF0ZSBvdmVyIGFsbCBzYW1wbGUgYmluczogKi8KLQotICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLSAgICB7Ci0gICAgICBiaW5fY291bnQgPSBoaXN0X3NhbXBsZVtpXTsKLSAgICAgIGlmICghYmluX2NvdW50KQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGJpbl9sb3dfcGMgPSBsb3dwYyArIChiZmRfdm1hKSAoaGlzdF9zY2FsZSAqIGkpOwotICAgICAgYmluX2hpZ2hfcGMgPSBsb3dwYyArIChiZmRfdm1hKSAoaGlzdF9zY2FsZSAqIChpICsgMSkpOwotICAgICAgdGltZSA9IGJpbl9jb3VudDsKLSAgICAgIERCRyAoU0FNUExFREVCVUcsCi0JICAgcHJpbnRmICgKLSAgICAgICJbYXNzaWduX3NhbXBsZXNdIGJpbl9sb3dfcGM9MHglbHgsIGJpbl9oaWdoX3BjPTB4JWx4LCBiaW5fY291bnQ9JWRcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZykgKHNpemVvZiAoVU5JVCkgKiBiaW5fbG93X3BjKSwKLQkJICAgICh1bnNpZ25lZCBsb25nKSAoc2l6ZW9mIChVTklUKSAqIGJpbl9oaWdoX3BjKSwKLQkJICAgIGJpbl9jb3VudCkpOwotICAgICAgdG90YWxfdGltZSArPSB0aW1lOwotCi0gICAgICAvKiBjcmVkaXQgYWxsIHN5bWJvbHMgdGhhdCBhcmUgY292ZXJlZCBieSBiaW4gSTogKi8KLQotICAgICAgZm9yIChqID0gaiAtIDE7IGogPCBzeW10YWIubGVuOyArK2opCi0JewotCSAgc3ltX2xvd19wYyA9IHN5bXRhYi5iYXNlW2pdLmhpc3Quc2NhbGVkX2FkZHI7Ci0JICBzeW1faGlnaF9wYyA9IHN5bXRhYi5iYXNlW2ogKyAxXS5oaXN0LnNjYWxlZF9hZGRyOwotCSAgLyoKLQkgICAqIElmIGhpZ2ggZW5kIG9mIGJpbiBpcyBiZWxvdyBlbnRyeSBhZGRyZXNzLCBnbyBmb3IgbmV4dAotCSAgICogYmluOgotCSAgICovCi0JICBpZiAoYmluX2hpZ2hfcGMgPCBzeW1fbG93X3BjKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBJZiBsb3cgZW5kIG9mIGJpbiBpcyBhYm92ZSBoaWdoIGVuZCBvZiBzeW1ib2wsIGdvIGZvcgotCSAgICogbmV4dCBzeW1ib2wuCi0JICAgKi8KLQkgIGlmIChiaW5fbG93X3BjID49IHN5bV9oaWdoX3BjKQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIG92ZXJsYXAgPQotCSAgICBNSU4gKGJpbl9oaWdoX3BjLCBzeW1faGlnaF9wYykgLSBNQVggKGJpbl9sb3dfcGMsIHN5bV9sb3dfcGMpOwotCSAgaWYgKG92ZXJsYXAgPiAwKQotCSAgICB7Ci0JICAgICAgREJHIChTQU1QTEVERUJVRywKLQkJICAgcHJpbnRmICgKLQkJCSAgICAiW2Fzc2lnbl9zYW1wbGVzXSBbMHglbHgsMHglbHgpICVzIGdldHMgJWYgdGlja3MgJWxkIG92ZXJsYXBcbiIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIHN5bXRhYi5iYXNlW2pdLmFkZHIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIChzaXplb2YgKFVOSVQpICogc3ltX2hpZ2hfcGMpLAotCQkJICAgIHN5bXRhYi5iYXNlW2pdLm5hbWUsIG92ZXJsYXAgKiB0aW1lIC8gaGlzdF9zY2FsZSwKLQkJCSAgICAobG9uZykgb3ZlcmxhcCkpOwotCSAgICAgIGFkZHIgPSBzeW10YWIuYmFzZVtqXS5hZGRyOwotCSAgICAgIGNyZWRpdCA9IG92ZXJsYXAgKiB0aW1lIC8gaGlzdF9zY2FsZTsKLQkgICAgICAvKgotCSAgICAgICAqIENyZWRpdCBzeW1ib2wgaWYgaXQgYXBwZWFycyBpbiBJTkNMX0ZMQVQgb3IgdGhhdAotCSAgICAgICAqIHRhYmxlIGlzIGVtcHR5IGFuZCBpdCBkb2VzIG5vdCBhcHBlYXIgaXQgaW4KLQkgICAgICAgKiBFWENMX0ZMQVQuCi0JICAgICAgICovCi0JICAgICAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfRkxBVF0sIGFkZHIpCi0JCSAgfHwgKHN5bXNbSU5DTF9GTEFUXS5sZW4gPT0gMAotCQkgICAgICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9GTEFUXSwgYWRkcikpKQotCQl7Ci0JCSAgc3ltdGFiLmJhc2Vbal0uaGlzdC50aW1lICs9IGNyZWRpdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHRvdGFsX3RpbWUgLT0gY3JlZGl0OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBEQkcgKFNBTVBMRURFQlVHLCBwcmludGYgKCJbYXNzaWduX3NhbXBsZXNdIHRvdGFsX3RpbWUgJWZcbiIsCi0JCQkgICAgdG90YWxfdGltZSkpOwotfQotCi0KLS8qCi0gKiBQcmludCBoZWFkZXIgZm9yIGZsYWcgaGlzdG9ncmFtIHByb2ZpbGU6Ci0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfaGVhZGVyLCAocHJlZml4KSwgY29uc3QgY2hhciBwcmVmaXgpCi17Ci0gIGNoYXIgdW5pdFs2NF07Ci0KLSAgc3ByaW50ZiAodW5pdCwgXygiJWMlYy9jYWxsIiksIHByZWZpeCwgaGlzdF9kaW1lbnNpb25fYWJicmV2KTsKLQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgJWxkIGJ5dGUocykiKSwKLQkgICAgICAobG9uZykgaGlzdF9zY2FsZSAqIHNpemVvZiAoVU5JVCkpOwotICAgICAgaWYgKHRvdGFsX3RpbWUgPiAwLjApCi0JewotCSAgcHJpbnRmIChfKCIgZm9yICUuMmYlJSBvZiAlLjJmICVzXG5cbiIpLAotCQkgIDEwMC4wIC8gdG90YWxfdGltZSwgdG90YWxfdGltZSAvIGh6LCBoaXN0X2RpbWVuc2lvbik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5FYWNoIHNhbXBsZSBjb3VudHMgYXMgJWcgJXMuXG4iKSwgMS4wIC8gaHosIGhpc3RfZGltZW5zaW9uKTsKLSAgICB9Ci0KLSAgaWYgKHRvdGFsX3RpbWUgPD0gMC4wKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiIG5vIHRpbWUgYWNjdW11bGF0ZWRcblxuIikpOwotICAgICAgLyogdGhpcyBkb2Vzbid0IGh1cnQgc2luY2UgYWxsIHRoZSBudW1lcmF0b3JzIHdpbGwgYmUgemVybzogKi8KLSAgICAgIHRvdGFsX3RpbWUgPSAxLjA7Ci0gICAgfQotCi0gIHByaW50ZiAoIiU1LjVzICUxMC4xMHMgJTguOHMgJTguOHMgJTguOHMgJTguOHMgICUtOC44c1xuIiwKLQkgICIlICAiLCBfKCJjdW11bGF0aXZlIiksIF8oInNlbGYgICIpLCAiIiwgXygic2VsZiAgIiksIF8oInRvdGFsICIpLCAiIik7Ci0gIHByaW50ZiAoIiU1LjVzICU5LjlzICAlOC44cyAlOC44cyAlOC44cyAlOC44cyAgJS04LjhzXG4iLAotCSAgXygidGltZSIpLCBoaXN0X2RpbWVuc2lvbiwgaGlzdF9kaW1lbnNpb24sIF8oImNhbGxzIiksIHVuaXQsIHVuaXQsCi0JICBfKCJuYW1lIikpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfbGluZSwgKHN5bSwgc2NhbGUpLCBTeW0gKiBzeW0gQU5EIGRvdWJsZSBzY2FsZSkKLXsKLSAgaWYgKGlnbm9yZV96ZXJvcyAmJiBzeW0tPm5jYWxscyA9PSAwICYmIHN5bS0+aGlzdC50aW1lID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhY2N1bV90aW1lICs9IHN5bS0+aGlzdC50aW1lOwotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlNS4xZiAlMTAuMmYgJTguMmYiLAotCSAgICAgIHRvdGFsX3RpbWUgPiAwLjAgPyAxMDAgKiBzeW0tPmhpc3QudGltZSAvIHRvdGFsX3RpbWUgOiAwLjAsCi0JICAgICAgYWNjdW1fdGltZSAvIGh6LCBzeW0tPmhpc3QudGltZSAvIGh6KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIlNi4yZiAlOS4yZiAlOC4yZiIsCi0JICAgICAgdG90YWxfdGltZSA+IDAuMCA/IDEwMCAqIHN5bS0+aGlzdC50aW1lIC8gdG90YWxfdGltZSA6IDAuMCwKLQkgICAgICBhY2N1bV90aW1lIC8gaHosIHN5bS0+aGlzdC50aW1lIC8gaHopOwotICAgIH0KLSAgaWYgKHN5bS0+bmNhbGxzICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiICU4bHUgJTguMmYgJTguMmYgICIsCi0JICAgICAgc3ltLT5uY2FsbHMsIHNjYWxlICogc3ltLT5oaXN0LnRpbWUgLyBoeiAvIHN5bS0+bmNhbGxzLAotCSAgc2NhbGUgKiAoc3ltLT5oaXN0LnRpbWUgKyBzeW0tPmNnLmNoaWxkX3RpbWUpIC8gaHogLyBzeW0tPm5jYWxscyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiICU4LjhzICU4LjhzICU4LjhzICAiLCAiIiwgIiIsICIiKTsKLSAgICB9Ci0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIHByaW50X25hbWUgKHN5bSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfbmFtZV9vbmx5IChzeW0pOwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLX0KLQotCi0vKgotICogQ29tcGFyZSBMUCBhbmQgUlAuICBUaGUgcHJpbWFyeSBjb21wYXJpc29uIGtleSBpcyBleGVjdXRpb24gdGltZSwKLSAqIHRoZSBzZWNvbmRhcnkgaXMgbnVtYmVyIG9mIGludm9jYXRpb24sIGFuZCB0aGUgdGVydGlhcnkgaXMgdGhlCi0gKiBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZSBmdW5jdGlvbiBuYW1lcy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF90aW1lLCAobHAsIHJwKSwgY29uc3QgUFRSIGxwIEFORCBjb25zdCBQVFIgcnApCi17Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLSAgZG91YmxlIHRpbWVfZGlmZjsKLQotICB0aW1lX2RpZmYgPSByaWdodC0+aGlzdC50aW1lIC0gbGVmdC0+aGlzdC50aW1lOwotICBpZiAodGltZV9kaWZmID4gMC4wKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKHRpbWVfZGlmZiA8IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChyaWdodC0+bmNhbGxzID4gbGVmdC0+bmNhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKHJpZ2h0LT5uY2FsbHMgPCBsZWZ0LT5uY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gc3RyY21wIChsZWZ0LT5uYW1lLCByaWdodC0+bmFtZSk7Ci19Ci0KLQotLyoKLSAqIFByaW50IHRoZSBmbGF0IGhpc3RvZ3JhbSBwcm9maWxlLgotICovCi12b2lkCi1ERUZVTl9WT0lEIChoaXN0X3ByaW50KQotewotICBTeW0gKip0aW1lX3NvcnRlZF9zeW1zLCAqdG9wX2RvZywgKnN5bTsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBpbnQgbG9nX3NjYWxlOwotICBkb3VibGUgdG9wX3RpbWUsIHRpbWU7Ci0gIGJmZF92bWEgYWRkcjsKLQotICBpZiAoZmlyc3Rfb3V0cHV0KQotICAgIHsKLSAgICAgIGZpcnN0X291dHB1dCA9IEZBTFNFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlxmXG4iKTsKLSAgICB9Ci0KLSAgYWNjdW1fdGltZSA9IDAuMDsKLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucykKLQl7Ci0JICBwcmludGYgKF8oIlxuXG5cbmZsYXQgcHJvZmlsZTpcbiIpKTsKLQkgIGZsYXRfYmx1cmIgKHN0ZG91dCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiRmxhdCBwcm9maWxlOlxuIikpOwotICAgIH0KLSAgLyoKLSAgICogU29ydCB0aGUgc3ltYm9sIHRhYmxlIGJ5IHRpbWUgKGNhbGwtY291bnQgYW5kIG5hbWUgYXMgc2Vjb25kYXJ5Ci0gICAqIGFuZCB0ZXJ0aWFyeSBrZXlzKToKLSAgICovCi0gIHRpbWVfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0ICh0aW1lX3NvcnRlZF9zeW1zLCBzeW10YWIubGVuLCBzaXplb2YgKFN5bSAqKSwgY21wX3RpbWUpOwotCi0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGxvZ19zY2FsZSA9IDU7CQkvKiBtaWxsaS1zZWNvbmRzIGlzIEJTRC1kZWZhdWx0ICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNlYXJjaCBmb3Igc3ltYm9sIHdpdGggaGlnaGVzdCBwZXItY2FsbCBleGVjdXRpb24gdGltZSBhbmQKLSAgICAgICAqIHNjYWxlIGFjY29yZGluZ2x5OgotICAgICAgICovCi0gICAgICBsb2dfc2NhbGUgPSAwOwotICAgICAgdG9wX2RvZyA9IDA7Ci0gICAgICB0b3BfdGltZSA9IDAuMDsKLSAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0JewotCSAgc3ltID0gdGltZV9zb3J0ZWRfc3ltc1tpbmRleF07Ci0JICBpZiAoc3ltLT5uY2FsbHMgIT0gMCkKLQkgICAgewotCSAgICAgIHRpbWUgPSAoc3ltLT5oaXN0LnRpbWUgKyBzeW0tPmNnLmNoaWxkX3RpbWUpIC8gc3ltLT5uY2FsbHM7Ci0JICAgICAgaWYgKHRpbWUgPiB0b3BfdGltZSkKLQkJewotCQkgIHRvcF9kb2cgPSBzeW07Ci0JCSAgdG9wX3RpbWUgPSB0aW1lOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAodG9wX2RvZyAmJiB0b3BfZG9nLT5uY2FsbHMgIT0gMCAmJiB0b3BfdGltZSA+IDAuMCkKLQl7Ci0JICB0b3BfdGltZSAvPSBoejsKLQkgIHdoaWxlIChTSXRhYltsb2dfc2NhbGVdLnNjYWxlICogdG9wX3RpbWUgPCAxMDAwLjAKLQkJICYmICgoc2l6ZV90KSBsb2dfc2NhbGUKLQkJICAgICA8IHNpemVvZiAoU0l0YWIpIC8gc2l6ZW9mIChTSXRhYlswXSkgLSAxKSkKLQkgICAgewotCSAgICAgICsrbG9nX3NjYWxlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBGb3Igbm93LCB0aGUgZGltZW5zaW9uIGlzIGFsd2F5cyBzZWNvbmRzLiAgSW4gdGhlIGZ1dHVyZSwgd2UKLSAgICogbWF5IGFsc28gd2FudCB0byBzdXBwb3J0IG90aGVyIChwc2V1ZG8tKWRpbWVuc2lvbnMgKHN1Y2ggYXMKLSAgICogSS1jYWNoZSBtaXNzZXMgZXRjLikuCi0gICAqLwotICBwcmludF9oZWFkZXIgKFNJdGFiW2xvZ19zY2FsZV0ucHJlZml4KTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICB7Ci0gICAgICBhZGRyID0gdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0tPmFkZHI7Ci0gICAgICAvKgotICAgICAgICogUHJpbnQgc3ltYm9sIGlmIGl0cyBpbiBJTkNMX0ZMQVQgdGFibGUgb3IgdGhhdCB0YWJsZQotICAgICAgICogaXMgZW1wdHkgYW5kIHRoZSBzeW1ib2wgaXMgbm90IGluIEVYQ0xfRkxBVC4KLSAgICAgICAqLwotICAgICAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfRkxBVF0sIGFkZHIpCi0JICB8fCAoc3ltc1tJTkNMX0ZMQVRdLmxlbiA9PSAwCi0JICAgICAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfRkxBVF0sIGFkZHIpKSkKLQl7Ci0JICBwcmludF9saW5lICh0aW1lX3NvcnRlZF9zeW1zW2luZGV4XSwgU0l0YWJbbG9nX3NjYWxlXS5zY2FsZSk7Ci0JfQotICAgIH0KLSAgZnJlZSAodGltZV9zb3J0ZWRfc3ltcyk7Ci0KLSAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucyAmJiAhYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBmbGF0X2JsdXJiIChzdGRvdXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2hpc3QuaCBiL2dwcm9mL2hpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2MmVmNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9oaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jaWZuZGVmIGhpc3RfaAotI2RlZmluZSBoaXN0X2gKLQotI2luY2x1ZGUgImJmZC5oIgotCi1leHRlcm4gYmZkX3ZtYSBzX2xvd3BjOwkJLyogbG93cGMgZnJvbSB0aGUgcHJvZmlsZSBmaWxlICovCi1leHRlcm4gYmZkX3ZtYSBzX2hpZ2hwYzsJLyogaGlnaHBjIGZyb20gdGhlIHByb2ZpbGUgZmlsZSAqLwotZXh0ZXJuIGJmZF92bWEgbG93cGMsIGhpZ2hwYzsJLyogcmFuZ2UgcHJvZmlsZWQsIGluIFVOSVQncyAqLwotZXh0ZXJuIGludCBoaXN0X251bV9iaW5zOwkvKiBudW1iZXIgb2YgaGlzdG9ncmFtIGJpbnMgKi8KLWV4dGVybiBpbnQgKmhpc3Rfc2FtcGxlOwkvKiBjb2RlIGhpc3RvZ3JhbSAqLwotLyoKLSAqIFNjYWxlIGZhY3RvciBjb252ZXJ0aW5nIHNhbXBsZXMgdG8gcGMgdmFsdWVzOiBlYWNoIHNhbXBsZSBjb3ZlcnMKLSAqIEhJU1RfU0NBTEUgYnl0ZXM6Ci0gKi8KLWV4dGVybiBkb3VibGUgaGlzdF9zY2FsZTsKLQotCi1leHRlcm4gdm9pZCBoaXN0X3JlYWRfcmVjIFBBUkFNUyAoKEZJTEUgKiBpZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBoaXN0X3dyaXRlX2hpc3QgUEFSQU1TICgoRklMRSAqIG9mcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGhpc3RfYXNzaWduX3NhbXBsZXMgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgaGlzdF9wcmludCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBoaXN0X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2kzODYuYyBiL2dwcm9mL2kzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiZjJkYy4uMDAwMDAwMAotLS0gYS9ncHJvZi9pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotCi1pbnQKLURFRlVOIChpMzg2X2lzY2FsbCwgKGlwKSwgdW5zaWduZWQgY2hhciAqaXApCi17Ci0gIGlmICgqaXAgPT0gMHhlOCkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZAotaTM4Nl9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgU3ltICpjaGlsZDsKLSAgYmZkX3ZtYSBkZXN0cGMsIGRlbHRhOwotCi0gIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCi0gICAgewotICAgICAgcF9sb3dwYyA9IHNfbG93cGM7Ci0gICAgfQotICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKLSAgICB7Ci0gICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOwotICAgIH0KLSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAotCQkJICBwYXJlbnQtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwX2xvd3BjLAotCQkJICAodW5zaWduZWQgbG9uZykgcF9oaWdocGMpKTsKLQotICBkZWx0YSA9IChiZmRfdm1hKSBjb3JlX3RleHRfc3BhY2UgLSBjb3JlX3RleHRfc2VjdC0+dm1hOwotCi0gIGZvciAoaW5zdHJ1Y3RwID0gKHVuc2lnbmVkIGNoYXIgKikgKHBfbG93cGMgKyBkZWx0YSk7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgKHBfaGlnaHBjICsgZGVsdGEpOwotICAgICAgIGluc3RydWN0cCArKykKLSAgICB7Ci0gICAgICBpZiAoaTM4Nl9pc2NhbGwgKGluc3RydWN0cCkpCi0JewotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kY2FsbF1cdDB4JXg6Y2FsbCIsCi0JCSAgICAgICBpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBkZWx0YSkpOwotCSAgLyoKLQkgICAqICByZWd1bGFyIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLQkgICAqICAgIGNoZWNrIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiAKLQkgICAqICAgIGEgZnVuY3Rpb24uCi0JICAgKi8KLQotCSAgZGVzdHBjID0gKChiZmRfdm1hKSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgaW5zdHJ1Y3RwICsgMSkKLQkJICAgICsgKGJmZF92bWEpIGluc3RydWN0cCAtIChiZmRfdm1hKSBkZWx0YSArIDUpOwotCSAgaWYgKGRlc3RwYyA+PSBzX2xvd3BjICYmIGRlc3RwYyA8PSBzX2hpZ2hwYykKLQkgICAgewotCSAgICAgIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZGVzdHBjKTsKLQkgICAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmFkZHIgPT0gZGVzdHBjKQotCQl7Ci0JCSAgLyoKLQkJICAgKiAgICAgIGEgaGl0Ci0JCSAgICovCi0JCSAgREJHIChDQUxMREVCVUcsCi0JCSAgICAgICBwcmludGYgKCJcdGRlc3RwYyAweCVseCAoJXMpXG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkZXN0cGMsIGNoaWxkLT5uYW1lKSk7Ci0JCSAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgIGluc3RydWN0cCArPSA0OwkvKiBjYWxsIGlzIGEgNSBieXRlIGluc3RydWN0aW9uICovCi0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqICBlbHNlOgotCSAgICogICAgaXQgbG9va2VkIGxpa2UgYSBjYWxsZiwgYnV0IGl0OgotCSAgICogICAgICBhKSB3YXNuJ3QgYWN0dWFsbHkgYSBjYWxsZiwgb3IKLQkgICAqICAgICAgYikgZGlkbid0IHBvaW50IHRvIGEga25vd24gZnVuY3Rpb24gaW4gdGhlIHN5bXRhYiwgb3IKLQkgICAqICAgICAgYykgc29tZXRoaW5nIGZ1bm55IGlzIGdvaW5nIG9uLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3BvL01ha2UtaW4gYi9ncHJvZi9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyZGIxLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ3Byb2YvcG8vUE9URklMRVMuaW4gYi9ncHJvZi9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlODExNi4uMDAwMDAwMAotLS0gYS9ncHJvZi9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLWFscGhhLmMKLWJhc2ljX2Jsb2Nrcy5jCi1iYXNpY19ibG9ja3MuaAotY2FsbF9ncmFwaC5jCi1jYWxsX2dyYXBoLmgKLWNnX2FyY3MuYwotY2dfYXJjcy5oCi1jZ19kZm4uYwotY2dfZGZuLmgKLWNnX3ByaW50LmMKLWNnX3ByaW50LmgKLWNvcmVmaWxlLmMKLWNvcmVmaWxlLmgKLWdtb24uaAotZ21vbl9pby5jCi1nbW9uX2lvLmgKLWdtb25fb3V0LmgKLWdwcm9mLmMKLWdwcm9mLmgKLWhlcnR6LmMKLWhlcnR6LmgKLWhpc3QuYwotaGlzdC5oCi1pMzg2LmMKLXNlYXJjaF9saXN0LmMKLXNlYXJjaF9saXN0LmgKLXNvdXJjZS5jCi1zb3VyY2UuaAotc3BhcmMuYwotc3ltX2lkcy5jCi1zeW1faWRzLmgKLXN5bXRhYi5jCi1zeW10YWIuaAotdGFob2UuYwotdXRpbHMuYwotdXRpbHMuaAotdmF4LmMKZGlmZiAtLWdpdCBhL2dwcm9mL3BvL2dwcm9mLnBvdCBiL2dwcm9mL3BvL2dwcm9mLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjZjBlZS4uMDAwMDAwMAotLS0gYS9ncHJvZi9wby9ncHJvZi5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDctMDEgMDE6MzYtMDQwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFscGhhLmM6ODkKLW1zZ2lkICI8aW5kaXJlY3QgY2hpbGQ+IgotbXNnc3RyICIiCi0KLSM6IGFscGhhLmM6MTA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltmaW5kX2NhbGxdICVzOiAweCVseCB0byAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IGFscGhhLmM6MTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltmaW5kX2NhbGxdIDB4JWx4OiBqc3IlcyA8aW5kaXJlY3RfY2hpbGQ+XG4iCi1tc2dzdHIgIiIKLQotIzogYWxwaGEuYzoxMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiW2ZpbmRfY2FsbF0gMHglbHg6IGJzciIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzoxMzQgY2FsbF9ncmFwaC5jOjcwIGhpc3QuYzoxMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBpZ25vcmluZyBiYXNpYy1ibG9jayBleGVjIGNvdW50cyAodXNlIC1sIG9yIC0tbGluZSlcbiIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogVGhpcyBvbmx5IHdvcmtzIGlmIGJmZF92bWEgaXMgdW5zaWduZWQgbG9uZy4KLSM6IGJhc2ljX2Jsb2Nrcy5jOjMyNCBiYXNpY19ibG9ja3MuYzozMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6ICglczoweCVseCkgJWx1IGV4ZWN1dGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzozMjUgYmFzaWNfYmxvY2tzLmM6MzM0Ci1tc2dpZCAiPHVua25vd24+IgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iVG9wICVkIExpbmVzOlxuIgotIlxuIgotIiAgICAgTGluZSAgICAgIENvdW50XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjIwCi1tc2dpZCAiIgotIlxuIgotIkV4ZWN1dGlvbiBTdW1tYXJ5OlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlOWxkICAgRXhlY3V0YWJsZSBsaW5lcyBpbiB0aGlzIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTlsZCAgIExpbmVzIGV4ZWN1dGVkXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiU5LjJmICAgUGVyY2VudCBvZiB0aGUgZmlsZSBleGVjdXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iJTlsdSAgIFRvdGFsIG51bWJlciBvZiBsaW5lIGV4ZWN1dGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTkuMmYgICBBdmVyYWdlIGV4ZWN1dGlvbnMgcGVyIGxpbmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjYWxsX2dyYXBoLmM6NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiW2NnX3RhbGx5XSBhcmMgZnJvbSAlcyB0byAlcyB0cmF2ZXJzZWQgJWx1IHRpbWVzXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzozOQotbXNnaWQgIiIKLSJcdFx0ICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKVxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NDMKLW1zZ2lkICIiCi0iXHRcdFx0Q2FsbCBncmFwaFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NDYgaGlzdC5jOjM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgJWxkIGJ5dGUocykiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo1MAotbXNnaWQgIiIKLSIgZm9yICUuMmYlJSBvZiAlLjJmIHNlY29uZHNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjU1Ci1tc2dpZCAiIgotIiBubyB0aW1lIHByb3BhZ2F0ZWRcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY0IGNnX3ByaW50LmM6NjcgY2dfcHJpbnQuYzo2OQotbXNnaWQgImNhbGxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY0IGNnX3ByaW50LmM6NjkKLW1zZ2lkICJ0b3RhbCIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY0Ci1tc2dpZCAicGFyZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY2IGNnX3ByaW50LmM6NjcKLW1zZ2lkICJpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY2Ci1tc2dpZCAiJXRpbWUiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NiBjZ19wcmludC5jOjY3Ci1tc2dpZCAic2VsZiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY2Ci1tc2dpZCAiZGVzY2VuZGVudHMiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NyBoaXN0LmM6NDA5Ci1tc2dpZCAibmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY5Ci1tc2dpZCAiY2hpbGRyZW4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo3NAotbXNnaWQgImluZGV4ICUlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzoxMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIDxjeWNsZSAlZCBhcyBhIHdob2xlPiBbJWRdXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzozNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MzU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiU2LjZzICU1LjVzICU3LjdzICU3LjdzICU3LjdzICU3LjdzICAgICA8c3BvbnRhbmVvdXM+XG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo1ODcKLW1zZ2lkICIiCi0iSW5kZXggYnkgZnVuY3Rpb24gbmFtZVxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjQ0IGNnX3ByaW50LmM6NjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIjxjeWNsZSAlZD4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzozOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY291bGQgbm90IG9wZW4gJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzo1MyBjb3JlZmlsZS5jOjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmFibGUgdG8gcGFyc2UgbWFwcGluZyBmaWxlICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogbm90IGluIGEub3V0IGZvcm1hdFxuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4ndCBmaW5kIC50ZXh0IHNlY3Rpb24gaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjE5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmFuIG91dCByb29tIGZvciAlbHUgYnl0ZXMgb2YgdGV4dCBzcGFjZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4ndCBkbyAtY1xuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MjQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAtYyBub3Qgc3VwcG9ydGVkIG9uIGFyY2hpdGVjdHVyZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6NDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIG5vIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjc1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc29tZWJvZHkgbWlzY291bnRlZDogbHRhYi5sZW49JWQgaW5zdGVhZCBvZiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MzMgZ21vbl9pby5jOjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjg3IGdtb25faW8uYzoxODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjk3IGdtb25faW8uYzoyMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgYCVzJyBoYXMgYmFkIG1hZ2ljIGNvb2tpZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoxMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgYCVzJyBoYXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoxMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBmb3VuZCBiYWQgdGFnICVkIChmaWxlIGNvcnJ1cHRlZD8pXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjIwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcHJvZmlsaW5nIHJhdGUgaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZC8lZCBiaW5zXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMwNgotbXNnaWQgInRpbWUgaXMgaW4gdGlja3MsIG5vdCBzZWNvbmRzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMxMiBnbW9uX2lvLmM6NDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggZmlsZSBmb3JtYXQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZpbGUgYCVzJyAodmVyc2lvbiAlZCkgY29udGFpbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdCVkIGhpc3RvZ3JhbSByZWNvcmQlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHQlZCBjYWxsLWdyYXBoIHJlY29yZCVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdCVkIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZCVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo1OQotbXNnaWQgIiIKLSJAKCMpIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iCi0iIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzoxNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLVthYmNEaGlsTHNUdnd4eXpdXSBbLVtBQ2VFZkZKbk5PcFBxUVpdW25hbWVdXSBbLUkgZGlyc11cbiIKLSJcdFstZFtudW1dXSBbLWsgZnJvbS90b10gWy1tIG1pbi1jb3VudF0gWy10IHRhYmxlLWxlbmd0aF1cbiIKLSJcdFstLVtuby1dYW5ub3RhdGVkLXNvdXJjZVs9bmFtZV1dIFstLVtuby1dZXhlYy1jb3VudHNbPW5hbWVdXVxuIgotIlx0Wy0tW25vLV1mbGF0LXByb2ZpbGVbPW5hbWVdXSBbLS1bbm8tXWdyYXBoWz1uYW1lXV1cbiIKLSJcdFstLVtuby1ddGltZT1uYW1lXSBbLS1hbGwtbGluZXNdIFstLWJyaWVmXSBbLS1kZWJ1Z1s9bGV2ZWxdXVxuIgotIlx0Wy0tZnVuY3Rpb24tb3JkZXJpbmddIFstLWZpbGUtb3JkZXJpbmddXG4iCi0iXHRbLS1kaXJlY3RvcnktcGF0aD1kaXJzXSBbLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnNdXG4iCi0iXHRbLS1maWxlLWZvcm1hdD1uYW1lXSBbLS1maWxlLWluZm9dIFstLWhlbHBdIFstLWxpbmVdIFstLW1pbi1jb3VudD1uXVxuIgotIlx0Wy0tbm8tc3RhdGljXSBbLS1wcmludC1wYXRoXSBbLS1zZXBhcmF0ZS1maWxlc11cbiIKLSJcdFstLXN0YXRpYy1jYWxsLWdyYXBoXSBbLS1zdW1dIFstLXRhYmxlLWxlbmd0aD1sZW5dIFstLXRyYWRpdGlvbmFsXVxuIgotIlx0Wy0tdmVyc2lvbl0gWy0td2lkdGg9bl0gWy0taWdub3JlLW5vbi1mdW5jdGlvbnNdXG4iCi0iXHRbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdXG4iCi0iXHRbaW1hZ2UtZmlsZV0gW3Byb2ZpbGUtZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjE2MAotbXNnaWQgIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkZWJ1Z2dpbmcgbm90IHN1cHBvcnRlZDsgLWQgaWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmtub3duIGZpbGUgZm9ybWF0ICVzXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LgotIzogZ3Byb2YuYzozOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGdwcm9mICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzozOTQKLW1zZ2lkICIiCi0iQmFzZWQgb24gQlNEIGdwcm9mLCBjb3B5cmlnaHQgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzozOTUKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo0NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBPbmx5IG9uZSBvZiAtLWZ1bmN0aW9uLW9yZGVyaW5nIGFuZCAtLWZpbGUtb3JkZXJpbmcgbWF5IGJlIHNwZWNpZmllZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjU0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc29ycnksIGZpbGUgZm9ybWF0IGBwcm9mJyBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgaGlzdG9ncmFtXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGdtb24ub3V0IGZpbGUgaXMgbWlzc2luZyBjYWxsLWdyYXBoIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBgJXMnIGlzIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzoxNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkIG9mICVkIHNhbXBsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVjJWMvY2FsbCIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6Mzg5Ci1tc2dpZCAiIgotIiBmb3IgJS4yZiUlIG9mICUuMmYgJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6Mzk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFYWNoIHNhbXBsZSBjb3VudHMgYXMgJWcgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwMAotbXNnaWQgIiIKLSIgbm8gdGltZSBhY2N1bXVsYXRlZFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDYKLW1zZ2lkICJjdW11bGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDYKLW1zZ2lkICJzZWxmICAiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwNgotbXNnaWQgInRvdGFsICIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA4Ci1tc2dpZCAidGltZSIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA4Ci1tc2dpZCAiY2FsbHMiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjUxNwotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJcbiIKLSJmbGF0IHByb2ZpbGU6XG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjUyMwotbXNnaWQgIkZsYXQgcHJvZmlsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb3VyY2UuYzoxNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvdWxkIG5vdCBsb2NhdGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNvdXJjZS5jOjIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIqKiogRmlsZSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiB1dGlscy5jOjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiA8Y3ljbGUgJWQ+IgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5jIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NWRiZi4uMDAwMDAwMAotLS0gYS9ncHJvZi9zZWFyY2hfbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLQotCi12b2lkCi1ERUZVTiAoc2VhcmNoX2xpc3RfYXBwZW5kLCAobGlzdCwgcGF0aHMpLAotICAgICAgIFNlYXJjaF9MaXN0ICogbGlzdCBBTkQgY29uc3QgY2hhciAqcGF0aHMpCi17Ci0gIFNlYXJjaF9MaXN0X0VsZW0gKm5ld19lbDsKLSAgY29uc3QgY2hhciAqYmVnLCAqY29sb247Ci0gIGludCBsZW47Ci0KLSAgY29sb24gPSBwYXRocyAtIDE7Ci0gIGRvCi0gICAgewotICAgICAgYmVnID0gY29sb24gKyAxOwotICAgICAgY29sb24gPSBzdHJjaHIgKGJlZywgJzonKTsKLSAgICAgIGlmIChjb2xvbikKLQl7Ci0JICBsZW4gPSBjb2xvbiAtIGJlZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbGVuID0gc3RybGVuIChiZWcpOwotCX0KLSAgICAgIG5ld19lbCA9IChTZWFyY2hfTGlzdF9FbGVtICopIHhtYWxsb2MgKHNpemVvZiAoKm5ld19lbCkgKyBsZW4pOwotICAgICAgbWVtY3B5IChuZXdfZWwtPnBhdGgsIGJlZywgbGVuKTsKLSAgICAgIG5ld19lbC0+cGF0aFtsZW5dID0gJ1wwJzsKLQotICAgICAgLyogYXBwZW5kIG5ldyBwYXRoIGF0IGVuZCBvZiBsaXN0OiAqLwotICAgICAgbmV3X2VsLT5uZXh0ID0gMDsKLSAgICAgIGlmIChsaXN0LT50YWlsKQotCXsKLQkgIGxpc3QtPnRhaWwtPm5leHQgPSBuZXdfZWw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxpc3QtPmhlYWQgPSBuZXdfZWw7Ci0JfQotICAgICAgbGlzdC0+dGFpbCA9IG5ld19lbDsKLSAgICB9Ci0gIHdoaWxlIChjb2xvbik7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5oIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZmUzNS4uMDAwMDAwMAotLS0gYS9ncHJvZi9zZWFyY2hfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2lmbmRlZiBzZWFyY2hfbGlzdF9oCi0jZGVmaW5lIHNlYXJjaF9saXN0X2gKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2xpc3RfZWxlbQotICB7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKm5leHQ7Ci0gICAgY2hhciBwYXRoWzFdOwotICB9Ci1TZWFyY2hfTGlzdF9FbGVtOwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKmhlYWQ7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKnRhaWw7Ci0gIH0KLVNlYXJjaF9MaXN0OwotCi1leHRlcm4gdm9pZCBzZWFyY2hfbGlzdF9hcHBlbmQgUEFSQU1TICgoU2VhcmNoX0xpc3QgKiBsaXN0LCBjb25zdCBjaGFyICpwYXRocykpOwotCi0jZW5kaWYgLyogc2VhcmNoX2xpc3RfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc291cmNlLmMgYi9ncHJvZi9zb3VyY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMWEwNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zb3VyY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogS2VlcHMgdHJhY2sgb2Ygc291cmNlIGZpbGVzLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzZWFyY2hfbGlzdC5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotCi0jZGVmaW5lIEVYVF9BTk5PICItYW5uIgkJLyogcG9zdGZpeCBvZiBhbm5vdGF0ZWQgZmlsZXMgKi8KLQotLyoKLSAqIERlZmF1bHQgb3B0aW9uIHZhbHVlczoKLSAqLwotYm9vbCBjcmVhdGVfYW5ub3RhdGlvbl9maWxlcyA9IEZBTFNFOwotCi1TZWFyY2hfTGlzdCBzcmNfc2VhcmNoX2xpc3QgPQotezAsIDB9OwotU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlID0gMDsKLQotCi1Tb3VyY2VfRmlsZSAqCi1ERUZVTiAoc291cmNlX2ZpbGVfbG9va3VwX3BhdGgsIChwYXRoKSwgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgU291cmNlX0ZpbGUgKnNmOwotCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocGF0aCwgc2YtPm5hbWUpID09IDApCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKCFzZikKLSAgICB7Ci0gICAgICAvKiBjcmVhdGUgYSBuZXcgc291cmNlIGZpbGUgZGVzY3JpcHRvcjogKi8KLQotICAgICAgc2YgPSAoU291cmNlX0ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2YpKTsKLSAgICAgIG1lbXNldCAoc2YsIDAsIHNpemVvZiAoKnNmKSk7Ci0gICAgICBzZi0+bmFtZSA9IHhzdHJkdXAgKHBhdGgpOwotICAgICAgc2YtPm5leHQgPSBmaXJzdF9zcmNfZmlsZTsKLSAgICAgIGZpcnN0X3NyY19maWxlID0gc2Y7Ci0gICAgfQotICByZXR1cm4gc2Y7Ci19Ci0KLQotU291cmNlX0ZpbGUgKgotREVGVU4gKHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqZm5hbWU7Ci0gIFNvdXJjZV9GaWxlICpzZjsKLSAgLyoKLSAgICogVGhlIHVzZXIgY2Fubm90IGtub3cgZXhhY3RseSBob3cgYSBmaWxlbmFtZSB3aWxsIGJlIHN0b3JlZCBpbgotICAgKiB0aGUgZGVidWdnaW5nIGluZm8gKGUuZy4sIC4uL2luY2x1ZGUvZm9vLmgKLSAgICogdnMuIC91c3IvaW5jbHVkZS9mb28uaCkuICBTbyB3ZSBzaW1wbHkgY29tcGFyZSB0aGUgZmlsZW5hbWUKLSAgICogY29tcG9uZW50IG9mIGEgcGF0aCBvbmx5OgotICAgKi8KLSAgZm9yIChzZiA9IGZpcnN0X3NyY19maWxlOyBzZjsgc2YgPSBzZi0+bmV4dCkKLSAgICB7Ci0gICAgICBmbmFtZSA9IHN0cnJjaHIgKHNmLT5uYW1lLCAnLycpOwotICAgICAgaWYgKGZuYW1lKQotCXsKLQkgICsrZm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZuYW1lID0gc2YtPm5hbWU7Ci0JfQotICAgICAgaWYgKHN0cmNtcCAoZmlsZW5hbWUsIGZuYW1lKSA9PSAwKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzZjsKLX0KLQotCi1GSUxFICoKLURFRlVOIChhbm5vdGF0ZV9zb3VyY2UsIChzZiwgbWF4X3dpZHRoLCBhbm5vdGUsIGFyZyksCi0gICAgICAgU291cmNlX0ZpbGUgKiBzZiBBTkQgaW50IG1heF93aWR0aAotICAgICAgIEFORCB2b2lkICgqYW5ub3RlKSBQQVJBTVMgKChjaGFyICpidWYsIGludCB3LCBpbnQgbCwgdm9pZCAqYXJnKSkKLSAgICAgICBBTkQgdm9pZCAqYXJnKQotewotICBzdGF0aWMgYm9vbCBmaXJzdF9maWxlID0gVFJVRTsKLSAgaW50IGksIGxpbmVfbnVtLCBucmVhZDsKLSAgYm9vbCBuZXdfbGluZTsKLSAgY2hhciBidWZbODE5Ml07Ci0gIGNoYXIgZm5hbWVbUEFUSF9NQVhdOwotICBjaGFyICphbm5vdGF0aW9uLCAqbmFtZV9vbmx5OwotICBGSUxFICppZnAsICpvZnA7Ci0gIFNlYXJjaF9MaXN0X0VsZW0gKnNsZSA9IHNyY19zZWFyY2hfbGlzdC5oZWFkOwotCi0gIC8qCi0gICAqIE9wZW4gaW5wdXQgZmlsZS4gIElmIG9wZW4gZmFpbHMsIHdhbGsgYWxvbmcgc2VhcmNoLWxpc3QgdW50aWwKLSAgICogb3BlbiBzdWNjZWVkcyBvciByZWFjaGluZyBlbmQgb2YgbGlzdDoKLSAgICovCi0gIHN0cmNweSAoZm5hbWUsIHNmLT5uYW1lKTsKLSAgaWYgKHNmLT5uYW1lWzBdID09ICcvJykKLSAgICB7Ci0gICAgICBzbGUgPSAwOwkJCS8qIGRvbid0IHVzZSBzZWFyY2ggbGlzdCBmb3IgYWJzb2x1dGUgcGF0aHMgKi8KLSAgICB9Ci0gIG5hbWVfb25seSA9IDA7Ci0gIHdoaWxlIChUUlVFKQotICAgIHsKLSAgICAgIERCRyAoU1JDREVCVUcsIHByaW50ZiAoIlthbm5vdGF0ZV9zb3VyY2VdOiBsb29raW5nIGZvciAlcywgdHJ5aW5nICVzXG4iLAotCQkJICAgICBzZi0+bmFtZSwgZm5hbWUpKTsKLSAgICAgIGlmcCA9IGZvcGVuIChmbmFtZSwgRk9QRU5fUkIpOwotICAgICAgaWYgKGlmcCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoIXNsZSAmJiAhbmFtZV9vbmx5KQotCXsKLQkgIG5hbWVfb25seSA9IHN0cnJjaHIgKHNmLT5uYW1lLCAnLycpOwotCSAgaWYgKG5hbWVfb25seSkKLQkgICAgewotCSAgICAgIC8qIHRyeSBzZWFyY2gtbGlzdCBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIG5hbWUgb25seTogKi8KLQkgICAgICArK25hbWVfb25seTsKLQkgICAgICBzbGUgPSBzcmNfc2VhcmNoX2xpc3QuaGVhZDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzbGUpCi0JewotCSAgc3RyY3B5IChmbmFtZSwgc2xlLT5wYXRoKTsKLQkgIHN0cmNhdCAoZm5hbWUsICIvIik7Ci0JICBpZiAobmFtZV9vbmx5KQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChmbmFtZSwgbmFtZV9vbmx5KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChmbmFtZSwgc2YtPm5hbWUpOwotCSAgICB9Ci0JICBzbGUgPSBzbGUtPm5leHQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlcnJubyA9PSBFTk9FTlQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjb3VsZCBub3QgbG9jYXRlIGAlcydcbiIpLAotCQkgICAgICAgd2hvYW1pLCBzZi0+bmFtZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBlcnJvciAoc2YtPm5hbWUpOwotCSAgICB9Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIG9mcCA9IHN0ZG91dDsKLSAgaWYgKGNyZWF0ZV9hbm5vdGF0aW9uX2ZpbGVzKQotICAgIHsKLSAgICAgIC8qIHRyeSB0byBjcmVhdGUgYW5ub3RhdGVkIHNvdXJjZSBmaWxlOiAqLwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgICAgIC8qIGNyZWF0ZSBhbm5vdGF0aW9uIGZpbGVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAqLwotICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKLSAgICAgIGlmIChmaWxlbmFtZSkKLQl7Ci0JICArK2ZpbGVuYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxlbmFtZSA9IHNmLT5uYW1lOwotCX0KLQotICAgICAgc3RyY3B5IChmbmFtZSwgZmlsZW5hbWUpOwotICAgICAgc3RyY2F0IChmbmFtZSwgRVhUX0FOTk8pOwotICAgICAgb2ZwID0gZm9wZW4gKGZuYW1lLCAidyIpOwotICAgICAgaWYgKCFvZnApCi0JewotCSAgcGVycm9yIChmbmFtZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIFByaW50IGZpbGUgbmFtZXMgaWYgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCB0aGVyZSBhcmUKLSAgICogbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZToKLSAgICovCi0gIGlmIChvZnAgPT0gc3Rkb3V0KQotICAgIHsKLSAgICAgIGlmIChmaXJzdF9maWxlKQotCXsKLQkgIGZpcnN0X2ZpbGUgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnB1dGMgKCdcbicsIG9mcCk7Ci0JfQotICAgICAgaWYgKGZpcnN0X291dHB1dCkKLQl7Ci0JICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAob2ZwLCAiXGZcbiIpOwotCX0KLSAgICAgIGZwcmludGYgKG9mcCwgXygiKioqIEZpbGUgJXM6XG4iKSwgc2YtPm5hbWUpOwotICAgIH0KLQotICBhbm5vdGF0aW9uID0geG1hbGxvYyAobWF4X3dpZHRoICsgMSk7Ci0gIGxpbmVfbnVtID0gMTsKLSAgbmV3X2xpbmUgPSBUUlVFOwotICB3aGlsZSAoKG5yZWFkID0gZnJlYWQgKGJ1ZiwgMSwgc2l6ZW9mIChidWYpLCBpZnApKSA+IDApCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG5yZWFkOyArK2kpCi0JewotCSAgaWYgKG5ld19saW5lKQotCSAgICB7Ci0JICAgICAgKCphbm5vdGUpIChhbm5vdGF0aW9uLCBtYXhfd2lkdGgsIGxpbmVfbnVtLCBhcmcpOwotCSAgICAgIGZwdXRzIChhbm5vdGF0aW9uLCBvZnApOwotCSAgICAgICsrbGluZV9udW07Ci0JICAgICAgbmV3X2xpbmUgPSBGQUxTRTsKLQkgICAgfQotCSAgbmV3X2xpbmUgPSAoYnVmW2ldID09ICdcbicpOwotCSAgZnB1dGMgKGJ1ZltpXSwgb2ZwKTsKLQl9Ci0gICAgfQotICBmcmVlIChhbm5vdGF0aW9uKTsKLSAgcmV0dXJuIG9mcDsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3NvdXJjZS5oIGIvZ3Byb2Yvc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2JhZDMuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jaWZuZGVmIHNvdXJjZV9oCi0jZGVmaW5lIHNvdXJjZV9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLQotdHlwZWRlZiBzdHJ1Y3Qgc291cmNlX2ZpbGUKLSAgewotICAgIHN0cnVjdCBzb3VyY2VfZmlsZSAqbmV4dDsKLSAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogbmFtZSBvZiBzb3VyY2UgZmlsZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwkvKiAjIG9mICJjYWxscyIgdG8gdGhpcyBmaWxlICovCi0gICAgaW50IG51bV9saW5lczsJCS8qICMgb2YgbGluZXMgaW4gZmlsZSAqLwotICAgIGludCBuYWxsb2NlZDsJCS8qIG51bWJlciBvZiBsaW5lcyBhbGxvY2F0ZWQgKi8KLSAgICB2b2lkICoqbGluZTsJCS8qIHVzYWdlLWRlcGVuZGVudCBwZXItbGluZSBkYXRhICovCi0gIH0KLVNvdXJjZV9GaWxlOwotCi0vKgotICogT3B0aW9uczoKLSAqLwotZXh0ZXJuIGJvb2wgY3JlYXRlX2Fubm90YXRpb25fZmlsZXM7CS8qIGNyZWF0ZSBhbm5vdGF0ZWQgb3V0cHV0IGZpbGVzPyAqLwotCi0vKgotICogTGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHNvdXJjZSBmaWxlczoKLSAqLwotZXh0ZXJuIFNlYXJjaF9MaXN0IHNyY19zZWFyY2hfbGlzdDsKLQotLyoKLSAqIENoYWluIG9mIHNvdXJjZS1maWxlIGRlc2NyaXB0b3JzOgotICovCi1leHRlcm4gU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlOwotCi0vKgotICogUmV0dXJucyBwb2ludGVyIHRvIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgZm9yIFBBVEgvRklMRU5BTUUuCi0gKi8KLWV4dGVybiBTb3VyY2VfRmlsZSAqc291cmNlX2ZpbGVfbG9va3VwX3BhdGggUEFSQU1TICgoY29uc3QgY2hhciAqcGF0aCkpOwotZXh0ZXJuIFNvdXJjZV9GaWxlICpzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0vKgotICogUmVhZCBzb3VyY2UgZmlsZSBTRiBvdXRwdXQgYW5ub3RhdGVkIHNvdXJjZS4gIFRoZSBhbm5vdGF0aW9uIGlzIGF0Ci0gKiBNQVhfV0lEVEggY2hhcmFjdGVycyB3aWRlIGFuZCBmb3IgZWFjaCBzb3VyY2UtbGluZSBhbiBhbm5vdGF0aW9uIGlzCi0gKiBvYnRhaW5lZCBieSBpbnZva2luZyBmdW5jdGlvbiBBTk5PVEUuICBBUkcgaXMgYW4gYXJndW1lbnQgcGFzc2VkIHRvCi0gKiBBTk5PVEUgdGhhdCBpcyBsZWZ0IHVuaW50ZXJwcmV0ZWQgYnkgYW5ub3RhdGVfc291cmNlKCkuCi0gKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBmaWxlICh3aGljaCBtYXliZSBzdGRvdXQpIHN1Y2gKLSAqIHRoYXQgc3VtbWFyeSBzdGF0aXN0aWNzIGNhbiBiZSBwcmludGVkLiAgSWYgdGhlIHJldHVybmVkIGZpbGUKLSAqIGlzIG5vdCBzdGRvdXQsIGl0IHNob3VsZCBiZSBjbG9zZWQgd2hlbiBkb25lIHdpdGggaXQuCi0gKi8KLWV4dGVybiBGSUxFICphbm5vdGF0ZV9zb3VyY2UgUEFSQU1TICgoU291cmNlX0ZpbGUgKiBzZiwgaW50IG1heF93aWR0aCwKLQkJCQkgICAgICB2b2lkICgqYW5ub3RlKSAoY2hhciAqYiwgaW50IHcsIGludCBsLAotCQkJCQkJICAgICAgdm9pZCAqYXJnKSwKLQkJCQkgICAgICB2b2lkICphcmcpKTsKLQotI2VuZGlmIC8qIHNvdXJjZV9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zcGFyYy5jIGIvZ3Byb2Yvc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2NTgyNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxmJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMCSgweGMwMDAwMDAwKQotCi12b2lkCi1zcGFyY19maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIGJmZF92bWEgZGVzdF9wYywgZGVsdGE7Ci0gIHVuc2lnbmVkIGludCAqaW5zdHI7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIsCi0JCQkgIHBhcmVudC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHBfbG93cGMsCi0JCQkgICh1bnNpZ25lZCBsb25nKSBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RyID0gKHVuc2lnbmVkIGludCAqKSAoKChwX2xvd3BjICsgZGVsdGEpICsgMykgJn4gMyk7Ci0gICAgICAgaW5zdHIgPCAodW5zaWduZWQgaW50ICopIChwX2hpZ2hwYyArIGRlbHRhKTsKLSAgICAgICArK2luc3RyKQotICAgIHsKLSAgICAgIGlmICgoKmluc3RyICYgQ0FMTCkpCi0JewotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kX2NhbGxdIDB4JWx4OiBjYWxsZiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgaW5zdHIgLSBkZWx0YSkpOwotCSAgLyoKLQkgICAqIFJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZyBjaGVjayB0aGF0IHRoaXMgaXMgdGhlCi0JICAgKiBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uCi0JICAgKi8KLQkgIGRlc3RfcGMgPSAoKGJmZF92bWEpIChpbnN0ciArICgqaW5zdHIgJiB+Q0FMTCkpKSAtIGRlbHRhOwotCSAgaWYgKGRlc3RfcGMgPj0gc19sb3dwYyAmJiBkZXN0X3BjIDw9IHNfaGlnaHBjKQotCSAgICB7Ci0JICAgICAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0X3BjKTsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmICgiXHRkZXN0X3BjPTB4JWx4LCAobmFtZT0lcywgYWRkcj0weCVseClcbiIsCi0JCQkgICAodW5zaWduZWQgbG9uZykgZGVzdF9wYywgY2hpbGQtPm5hbWUsCi0JCQkgICAodW5zaWduZWQgbG9uZykgY2hpbGQtPmFkZHIpKTsKLQkgICAgICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdF9wYykKLQkJewotCQkgIC8qIGEgaGl0OiAgKi8KLQkJICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqIFNvbWV0aGluZyBmdW5ueSBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zdGFtcC1oLmluIGIvZ3Byb2Yvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmMgYi9ncHJvZi9zeW1faWRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMmM4ZDQuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltX2lkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotc3RydWN0IHN5bV9pZAotICB7Ci0gICAgc3RydWN0IHN5bV9pZCAqbmV4dDsKLSAgICBjaGFyICpzcGVjOwkJCS8qIHBhcnNpbmcgbW9kaWZpZXMgdGhpcyAqLwotICAgIFRhYmxlX0lkIHdoaWNoX3RhYmxlOwotICAgIGJvb2wgaGFzX3JpZ2h0OwotICAgIHN0cnVjdCBtYXRjaAotICAgICAgewotCWludCBwcmV2X2luZGV4OwkJLyogaW5kZXggb2YgcHJldiBtYXRjaCAqLwotCVN5bSAqcHJldl9tYXRjaDsJLyogcHJldmlvdXMgbWF0Y2ggKi8KLQlTeW0gKmZpcnN0X21hdGNoOwkvKiBjaGFpbiBvZiBhbGwgbWF0Y2hlcyAqLwotCVN5bSBzeW07Ci0gICAgICB9Ci0gICAgbGVmdCwgcmlnaHQ7Ci0gIH0KLSAqaWRfbGlzdDsKLQotU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107Ci0KLSNpZmRlZiBERUJVRwotY29uc3QgY2hhciAqdGFibGVfbmFtZVtdID0KLXsKLSAgIklOQ0xfR1JBUEgiLCAiRVhDTF9HUkFQSCIsCi0gICJJTkNMX0FSQ1MiLCAiRVhDTF9BUkNTIiwKLSAgIklOQ0xfRkxBVCIsICJFWENMX0ZMQVQiLAotICAiSU5DTF9USU1FIiwgIkVYQ0xfVElNRSIsCi0gICJJTkNMX0FOTk8iLCAiRVhDTF9BTk5PIiwKLSAgIklOQ0xfRVhFQyIsICJFWENMX0VYRUMiCi19OwotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSB0YWJsZSBpbiB3aGljaCB3ZSBrZWVwIGFsbCB0aGUgc3ltcyB0aGF0IG1hdGNoCi0gKiB0aGUgcmlnaHQgaGFsZiBvZiBhbiBhcmMgaWQuICBJdCBpcyBOT1Qgc29ydGVkIGFjY29yZGluZwotICogdG8gdGhlIGFkZHJlc3NlcywgYmVjYXVzZSBpdCBpcyBhY2Nlc3NlZCBvbmx5IHRocm91Z2gKLSAqIHRoZSBsZWZ0IGhhbGYncyBDSElMRFJFTiBwb2ludGVycyAoc28gaXQncyBjcnVjaWFsIG5vdAotICogdG8gcmVvcmRlciB0aGlzIHRhYmxlIG9uY2UgcG9pbnRlcnMgaW50byBpdCBleGlzdCkuCi0gKi8KLXN0YXRpYyBTeW1fVGFibGUgcmlnaHRfaWRzOwotCi1zdGF0aWMgU291cmNlX0ZpbGUgbm9uX2V4aXN0ZW50X2ZpbGUgPQotewotICAwLCAiPG5vbi1leGlzdGVudC1maWxlPiIsIDAsIDAsIDAsIE5VTEwKLX07Ci0KLQotdm9pZAotREVGVU4gKHN5bV9pZF9hZGQsIChzcGVjLCB3aGljaF90YWJsZSksCi0gICAgICAgY29uc3QgY2hhciAqc3BlYyBBTkQgVGFibGVfSWQgd2hpY2hfdGFibGUpCi17Ci0gIHN0cnVjdCBzeW1faWQgKmlkOwotICBpbnQgbGVuID0gc3RybGVuIChzcGVjKTsKLQotICBpZCA9IChzdHJ1Y3Qgc3ltX2lkICopIHhtYWxsb2MgKHNpemVvZiAoKmlkKSArIGxlbiArIDEpOwotICBtZW1zZXQgKGlkLCAwLCBzaXplb2YgKCppZCkpOwotCi0gIGlkLT5zcGVjID0gKGNoYXIgKikgaWQgKyBzaXplb2YgKCppZCk7Ci0gIHN0cmNweSAoaWQtPnNwZWMsIHNwZWMpOwotICBpZC0+d2hpY2hfdGFibGUgPSB3aGljaF90YWJsZTsKLQotICBpZC0+bmV4dCA9IGlkX2xpc3Q7Ci0gIGlkX2xpc3QgPSBpZDsKLX0KLQotCi0vKgotICogQSBzcGVjIGhhcyB0aGUgc3ludGF4IEZJTEVOQU1FOihGVU5DTkFNRXxMSU5FTlVNKS4gIEFzIGEgY29udmVuaWVuY2UKLSAqIHRvIHRoZSB1c2VyLCBhIHNwZWMgd2l0aG91dCBhIGNvbG9uIGlzIGludGVycHJldGVkIGFzOgotICoKLSAqICAgICAgKGkpICAgYSBGSUxFTkFNRSBpZiBpdCBjb250YWlucyBhIGRvdAotICogICAgICAoaWkpICBhIEZVTkNOQU1FIGlmIGl0IHN0YXJ0cyB3aXRoIGEgbm9uLWRpZ2l0IGNoYXJhY3RlcgotICogICAgICAoaWlpKSBhIExJTkVOVU0gaWYgaXQgc3RhcnRzIHdpdGggYSBkaWdpdAotICoKLSAqIEEgRlVOQ05BTUUgY29udGFpbmluZyBhIGRvdCBjYW4gYmUgc3BlY2lmaWVkIGJ5IDpGVU5DTkFNRSwgYQotICogRklMRU5BTUUgbm90IGNvbnRhaW5pbmcgYSBkb3QgY2FuIGJlIHNwZWNpZmllZCBieSBGSUxFTkFNRTouCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocGFyc2Vfc3BlYywgKHNwZWMsIHN5bSksIGNoYXIgKnNwZWMgQU5EIFN5bSAqIHN5bSkKLXsKLSAgY2hhciAqY29sb247Ci0KLSAgc3ltX2luaXQgKHN5bSk7Ci0gIGNvbG9uID0gc3RycmNociAoc3BlYywgJzonKTsKLSAgaWYgKGNvbG9uKQotICAgIHsKLSAgICAgICpjb2xvbiA9ICdcMCc7Ci0gICAgICBpZiAoY29sb24gPiBzcGVjKQotCXsKLQkgIHN5bS0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lIChzcGVjKTsKLQkgIGlmICghc3ltLT5maWxlKQotCSAgICB7Ci0JICAgICAgc3ltLT5maWxlID0gJm5vbl9leGlzdGVudF9maWxlOwotCSAgICB9Ci0JfQotICAgICAgc3BlYyA9IGNvbG9uICsgMTsKLSAgICAgIGlmIChzdHJsZW4gKHNwZWMpKQotCXsKLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc3BlY1swXSkpCi0JICAgIHsKLQkgICAgICBzeW0tPmxpbmVfbnVtID0gYXRvaSAoc3BlYyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bS0+bmFtZSA9IHNwZWM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJsZW4gKHNwZWMpKQotICAgIHsKLSAgICAgIC8qIG5vIGNvbG9uOiBzcGVjIGlzIGEgZmlsZW5hbWUgaWYgaXQgY29udGFpbnMgYSBkb3Q6ICovCi0gICAgICBpZiAoc3RyY2hyIChzcGVjLCAnLicpKQotCXsKLQkgIHN5bS0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lIChzcGVjKTsKLQkgIGlmICghc3ltLT5maWxlKQotCSAgICB7Ci0JICAgICAgc3ltLT5maWxlID0gJm5vbl9leGlzdGVudF9maWxlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzcGVjKSkKLQl7Ci0JICBzeW0tPmxpbmVfbnVtID0gYXRvaSAoc3BlYyk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybGVuIChzcGVjKSkKLQl7Ci0JICBzeW0tPm5hbWUgPSBzcGVjOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIEEgc3ltYm9sIGlkIGhhcyB0aGUgc3ludGF4IFNQRUNbL1NQRUNdLCB3aGVyZSBTUEVDIGlzIGlzIGRlZmluZWQKLSAqIGJ5IHBhcnNlX3NwZWMoKS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwYXJzZV9pZCwgKGlkKSwgc3RydWN0IHN5bV9pZCAqaWQpCi17Ci0gIGNoYXIgKnNsYXNoOwotCi0gIERCRyAoSURERUJVRywgcHJpbnRmICgiW3BhcnNlX2lkXSAlcyAtPiAiLCBpZC0+c3BlYykpOwotCi0gIHNsYXNoID0gc3RyY2hyIChpZC0+c3BlYywgJy8nKTsKLSAgaWYgKHNsYXNoKQotICAgIHsKLSAgICAgIHBhcnNlX3NwZWMgKHNsYXNoICsgMSwgJmlkLT5yaWdodC5zeW0pOwotICAgICAgKnNsYXNoID0gJ1wwJzsKLSAgICAgIGlkLT5oYXNfcmlnaHQgPSBUUlVFOwotICAgIH0KLSAgcGFyc2Vfc3BlYyAoaWQtPnNwZWMsICZpZC0+bGVmdC5zeW0pOwotCi0jaWZkZWYgREVCVUcKLSAgaWYgKGRlYnVnX2xldmVsICYgSURERUJVRykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlczoiLCBpZC0+bGVmdC5zeW0uZmlsZSA/IGlkLT5sZWZ0LnN5bS5maWxlLT5uYW1lIDogIioiKTsKLSAgICAgIGlmIChpZC0+bGVmdC5zeW0ubmFtZSkKLQl7Ci0JICBwcmludGYgKCIlcyIsIGlkLT5sZWZ0LnN5bS5uYW1lKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpZC0+bGVmdC5zeW0ubGluZV9udW0pCi0JewotCSAgcHJpbnRmICgiJWQiLCBpZC0+bGVmdC5zeW0ubGluZV9udW0pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIqIik7Ci0JfQotICAgICAgaWYgKGlkLT5oYXNfcmlnaHQpCi0JewotCSAgcHJpbnRmICgiLyVzOiIsCi0JCSAgaWQtPnJpZ2h0LnN5bS5maWxlID8gaWQtPnJpZ2h0LnN5bS5maWxlLT5uYW1lIDogIioiKTsKLQkgIGlmIChpZC0+cmlnaHQuc3ltLm5hbWUpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlcyIsIGlkLT5yaWdodC5zeW0ubmFtZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlkLT5yaWdodC5zeW0ubGluZV9udW0pCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlZCIsIGlkLT5yaWdodC5zeW0ubGluZV9udW0pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIqIik7Ci0JICAgIH0KLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLSNlbmRpZgotfQotCi0KLS8qCi0gKiBSZXR1cm4gVFJVRSBpZmYgUEFUVEVSTiBtYXRjaGVzIFNZTS4KLSAqLwotc3RhdGljIGJvb2wKLURFRlVOIChtYXRjaCwgKHBhdHRlcm4sIHN5bSksIFN5bSAqIHBhdHRlcm4gQU5EIFN5bSAqIHN5bSkKLXsKLSAgcmV0dXJuIChwYXR0ZXJuLT5maWxlID8gcGF0dGVybi0+ZmlsZSA9PSBzeW0tPmZpbGUgOiBUUlVFKQotICAgICYmIChwYXR0ZXJuLT5saW5lX251bSA/IHBhdHRlcm4tPmxpbmVfbnVtID09IHN5bS0+bGluZV9udW0gOiBUUlVFKQotICAgICYmIChwYXR0ZXJuLT5uYW1lID8gc3RyY21wIChwYXR0ZXJuLT5uYW1lLCBzeW0tPm5hbWUpID09IDAgOiBUUlVFKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKGV4dGVuZF9tYXRjaCwgKG0sIHN5bSwgdGFiLCBzZWNvbmRfcGFzcyksCi0gICAgIHN0cnVjdCBtYXRjaCAqbSBBTkQgU3ltICogc3ltIEFORCBTeW1fVGFibGUgKiB0YWIgQU5EIGJvb2wgc2Vjb25kX3Bhc3MpCi17Ci0gIGlmIChtLT5wcmV2X21hdGNoICE9IHN5bSAtIDEpCi0gICAgewotICAgICAgLyogZGlzY29udGludWl0eTogYWRkIG5ldyBtYXRjaCB0byB0YWJsZTogKi8KLSAgICAgIGlmIChzZWNvbmRfcGFzcykKLQl7Ci0JICB0YWItPmJhc2VbdGFiLT5sZW5dID0gKnN5bTsKLQkgIG0tPnByZXZfaW5kZXggPSB0YWItPmxlbjsKLQotCSAgLyogbGluayBtYXRjaCBpbnRvIG1hdGNoJ3MgY2hhaW46ICovCi0JICB0YWItPmJhc2VbdGFiLT5sZW5dLm5leHQgPSBtLT5maXJzdF9tYXRjaDsKLQkgIG0tPmZpcnN0X21hdGNoID0gJnRhYi0+YmFzZVt0YWItPmxlbl07Ci0JfQotICAgICAgKyt0YWItPmxlbjsKLSAgICB9Ci0KLSAgLyogZXh0ZW5kIG1hdGNoIHRvIGluY2x1ZGUgdGhpcyBzeW1ib2w6ICovCi0gIGlmIChzZWNvbmRfcGFzcykKLSAgICB7Ci0gICAgICB0YWItPmJhc2VbbS0+cHJldl9pbmRleF0uZW5kX2FkZHIgPSBzeW0tPmVuZF9hZGRyOwotICAgIH0KLSAgbS0+cHJldl9tYXRjaCA9IHN5bTsKLX0KLQotCi0vKgotICogR28gdGhyb3VnaCBzeW1faWQgbGlzdCBwcm9kdWNlZCBieSBvcHRpb24gcHJvY2Vzc2luZyBhbmQgZmlsbAotICogaW4gdGhlIHZhcmlvdXMgc3ltYm9sIHRhYmxlcyBpbmRpY2F0aW5nIHdoYXQgc3ltYm9scyBzaG91bGQKLSAqIGJlIGRpc3BsYXllZCBvciBzdXBwcmVzc2VkIGZvciB0aGUgdmFyaW91cyBraW5kcyBvZiBvdXRwdXRzLgotICoKLSAqIFRoaXMgY2FuIHBvdGVudGlhbGx5IHByb2R1Y2UgaHVnZSB0YWJsZXMgYW5kIGluIHBhcnRpY3VsYXJzCi0gKiB0b25zIG9mIGFyY3MsIGJ1dCB0aGlzIGhhcHBlbnMgb25seSBpZiB0aGUgdXNlciBtYWtlcyBzaWxseQotICogcmVxdWVzdHMtLS15b3UgZ2V0IHdoYXQgeW91IGFzayBmb3IhCi0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKHN5bV9pZF9wYXJzZSkKLXsKLSAgU3ltICpzeW0sICpsZWZ0LCAqcmlnaHQ7Ci0gIHN0cnVjdCBzeW1faWQgKmlkOwotICBTeW1fVGFibGUgKnRhYjsKLQotICAvKgotICAgKiBDb252ZXJ0IHN5bWJvbCBpZHMgaW50byBTeW1zLCBzbyB3ZSBjYW4gZGVhbCB3aXRoIHRoZW0gbW9yZSBlYXNpbHk6Ci0gICAqLwotICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCi0gICAgewotICAgICAgcGFyc2VfaWQgKGlkKTsKLSAgICB9Ci0KLSAgLyogZmlyc3QgZGV0ZXJtaW5lIHNpemUgb2YgZWFjaCB0YWJsZTogKi8KLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGZvciAoaWQgPSBpZF9saXN0OyBpZDsgaWQgPSBpZC0+bmV4dCkKLQl7Ci0JICBpZiAobWF0Y2ggKCZpZC0+bGVmdC5zeW0sIHN5bSkpCi0JICAgIHsKLQkgICAgICBleHRlbmRfbWF0Y2ggKCZpZC0+bGVmdCwgc3ltLCAmc3ltc1tpZC0+d2hpY2hfdGFibGVdLCBGQUxTRSk7Ci0JICAgIH0KLQkgIGlmIChpZC0+aGFzX3JpZ2h0ICYmIG1hdGNoICgmaWQtPnJpZ2h0LnN5bSwgc3ltKSkKLQkgICAgewotCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5yaWdodCwgc3ltLCAmcmlnaHRfaWRzLCBGQUxTRSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGNyZWF0ZSB0YWJsZXMgb2YgYXBwcm9wcmlhdGUgc2l6ZSBhbmQgcmVzZXQgbGVuZ3RoczogKi8KLQotICBmb3IgKHRhYiA9IHN5bXM7IHRhYiA8ICZzeW1zW05VTV9UQUJMRVNdOyArK3RhYikKLSAgICB7Ci0gICAgICBpZiAodGFiLT5sZW4pCi0JewotCSAgdGFiLT5iYXNlID0gKFN5bSAqKSB4bWFsbG9jICh0YWItPmxlbiAqIHNpemVvZiAoU3ltKSk7Ci0JICB0YWItPmxpbWl0ID0gdGFiLT5iYXNlICsgdGFiLT5sZW47Ci0JICB0YWItPmxlbiA9IDA7Ci0JfQotICAgIH0KLSAgaWYgKHJpZ2h0X2lkcy5sZW4pCi0gICAgewotICAgICAgcmlnaHRfaWRzLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKHJpZ2h0X2lkcy5sZW4gKiBzaXplb2YgKFN5bSkpOwotICAgICAgcmlnaHRfaWRzLmxpbWl0ID0gcmlnaHRfaWRzLmJhc2UgKyByaWdodF9pZHMubGVuOwotICAgICAgcmlnaHRfaWRzLmxlbiA9IDA7Ci0gICAgfQotCi0gIC8qIG1ha2UgYSBzZWNvbmQgcGFzcyB0aHJvdWdoIHN5bXRhYiwgY3JlYXRpbmcgc3ltcyBhcyBuZWNlc3Nhcnk6ICovCi0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCi0JewotCSAgaWYgKG1hdGNoICgmaWQtPmxlZnQuc3ltLCBzeW0pKQotCSAgICB7Ci0JICAgICAgZXh0ZW5kX21hdGNoICgmaWQtPmxlZnQsIHN5bSwgJnN5bXNbaWQtPndoaWNoX3RhYmxlXSwgVFJVRSk7Ci0JICAgIH0KLQkgIGlmIChpZC0+aGFzX3JpZ2h0ICYmIG1hdGNoICgmaWQtPnJpZ2h0LnN5bSwgc3ltKSkKLQkgICAgewotCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5yaWdodCwgc3ltLCAmcmlnaHRfaWRzLCBUUlVFKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogZ28gdGhyb3VnaCBpZHMgY3JlYXRpbmcgYXJjcyBhcyBuZWVkZWQ6ICovCi0KLSAgZm9yIChpZCA9IGlkX2xpc3Q7IGlkOyBpZCA9IGlkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChpZC0+aGFzX3JpZ2h0KQotCXsKLQkgIGZvciAobGVmdCA9IGlkLT5sZWZ0LmZpcnN0X21hdGNoOyBsZWZ0OyBsZWZ0ID0gbGVmdC0+bmV4dCkKLQkgICAgewotCSAgICAgIGZvciAocmlnaHQgPSBpZC0+cmlnaHQuZmlyc3RfbWF0Y2g7IHJpZ2h0OyByaWdodCA9IHJpZ2h0LT5uZXh0KQotCQl7Ci0JCSAgREJHIChJRERFQlVHLAotCQkgICAgICAgcHJpbnRmICgKLQkJCQkiW3N5bV9pZF9wYXJzZV06IGFyYyAlczolcyglbHgtJWx4KSAtPiAlczolcyglbHgtJWx4KSB0byAlc1xuIiwKLQkJCQlsZWZ0LT5maWxlID8gbGVmdC0+ZmlsZS0+bmFtZSA6ICIqIiwKLQkJCQlsZWZ0LT5uYW1lID8gbGVmdC0+bmFtZSA6ICIqIiwKLQkJCQkodW5zaWduZWQgbG9uZykgbGVmdC0+YWRkciwKLQkJCQkodW5zaWduZWQgbG9uZykgbGVmdC0+ZW5kX2FkZHIsCi0JCQkJcmlnaHQtPmZpbGUgPyByaWdodC0+ZmlsZS0+bmFtZSA6ICIqIiwKLQkJCQlyaWdodC0+bmFtZSA/IHJpZ2h0LT5uYW1lIDogIioiLAotCQkJCSh1bnNpZ25lZCBsb25nKSByaWdodC0+YWRkciwKLQkJCQkodW5zaWduZWQgbG9uZykgcmlnaHQtPmVuZF9hZGRyLAotCQkJCXRhYmxlX25hbWVbaWQtPndoaWNoX3RhYmxlXSkpOwotCQkgIGFyY19hZGQgKGxlZnQsIHJpZ2h0LCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogZmluYWxseSwgd2UgY2FuIHNvcnQgdGhlIHRhYmxlcyBhbmQgd2UncmUgZG9uZTogKi8KLQotICBmb3IgKHRhYiA9ICZzeW1zWzBdOyB0YWIgPCAmc3ltc1tOVU1fVEFCTEVTXTsgKyt0YWIpCi0gICAgewotICAgICAgREJHIChJRERFQlVHLCBwcmludGYgKCJbc3ltX2lkX3BhcnNlXSBzeW1zWyVzXTpcbiIsCi0JCQkgICAgdGFibGVfbmFtZVt0YWIgLSAmc3ltc1swXV0pKTsKLSAgICAgIHN5bXRhYl9maW5hbGl6ZSAodGFiKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFN5bWJvbCB0YWJsZXMgc3RvcmluZyB0aGUgRlJPTSBzeW1ib2xzIG9mIGFyY3MgZG8gbm90IG5lY2Vzc2FyaWx5Ci0gKiBoYXZlIGRpc3RpbmN0IGFkZHJlc3MgcmFuZ2VzLiAgRm9yIGV4YW1wbGUsIHNvbWVib2R5IG1pZ2h0IHJlcXVlc3QKLSAqIC1rIC9fbWNvdW50IHRvIHN1cHByZXNzIGFueSBhcmNzIGludG8gX21jb3VudCwgd2hpbGUgYXQgdGhlIHNhbWUKLSAqIHRpbWUgcmVxdWVzdGluZyAtayBhL2IuICBGb3J0dW5hdGVseSwgdGhvc2Ugc3ltYm9sIHRhYmxlcyBkb24ndCBnZXQKLSAqIHZlcnkgYmlnICh0aGUgdXNlciBoYXMgdG8gdHlwZSB0aGVtISksIHNvIGEgbGluZWFyIHNlYXJjaCBpcyBwcm9iYWJseQotICogdG9sZXJhYmxlLgotICovCi1ib29sCi1ERUZVTiAoc3ltX2lkX2FyY19pc19wcmVzZW50LCAoc3ltdGFiLCBmcm9tLCB0byksCi0gICAgICAgU3ltX1RhYmxlICogc3ltdGFiIEFORCBTeW0gKiBmcm9tIEFORCBTeW0gKiB0bykKLXsKLSAgU3ltICpzeW07Ci0KLSAgZm9yIChzeW0gPSBzeW10YWItPmJhc2U7IHN5bSA8IHN5bXRhYi0+bGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGlmIChmcm9tLT5hZGRyID49IHN5bS0+YWRkciAmJiBmcm9tLT5hZGRyIDw9IHN5bS0+ZW5kX2FkZHIKLQkgICYmIGFyY19sb29rdXAgKHN5bSwgdG8pKQotCXsKLQkgIHJldHVybiBUUlVFOwotCX0KLSAgICB9Ci0gIHJldHVybiBGQUxTRTsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3N5bV9pZHMuaCBiL2dwcm9mL3N5bV9pZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5NjMzOC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zeW1faWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jaWZuZGVmIHN5bV9pZHNfaAotI2RlZmluZSBzeW1faWRzX2gKLQotI2luY2x1ZGUgInN5bXRhYi5oIgotCi10eXBlZGVmIGVudW0KLSAgewotICAgIElOQ0xfR1JBUEggPSAwLCBFWENMX0dSQVBILAotICAgIElOQ0xfQVJDUywgRVhDTF9BUkNTLAotICAgIElOQ0xfRkxBVCwgRVhDTF9GTEFULAotICAgIElOQ0xfVElNRSwgRVhDTF9USU1FLAotICAgIElOQ0xfQU5OTywgRVhDTF9BTk5PLAotICAgIElOQ0xfRVhFQywgRVhDTF9FWEVDLAotICAgIE5VTV9UQUJMRVMKLSAgfQotVGFibGVfSWQ7Ci0KLWV4dGVybiBTeW1fVGFibGUgc3ltc1tOVU1fVEFCTEVTXTsKLQotZXh0ZXJuIHZvaWQgc3ltX2lkX2FkZCBQQVJBTVMgKChjb25zdCBjaGFyICpzcGVjLCBUYWJsZV9JZCB3aGljaF90YWJsZSkpOwotZXh0ZXJuIHZvaWQgc3ltX2lkX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBib29sIHN5bV9pZF9hcmNfaXNfcHJlc2VudCBQQVJBTVMgKChTeW1fVGFibGUgKiBzeW10YWIsCi0JCQkJCSAgIFN5bSAqIGZyb20sIFN5bSAqIHRvKSk7Ci0KLSNlbmRpZiAvKiBzeW1faWRzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3N5bXRhYi5jIGIvZ3Byb2Yvc3ltdGFiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYjI2MWEuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltdGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLVN5bV9UYWJsZSBzeW10YWI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgYSBzeW1ib2wgKHNvIGl0J3MgZW1wdHkpLgotICovCi12b2lkCi1ERUZVTiAoc3ltX2luaXQsIChzeW0pLCBTeW0gKiBzeW0pCi17Ci0gIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKCpzeW0pKTsKLSAgLyoKLSAgICogSXQgaXMgbm90IHNhZmUgdG8gYXNzdW1lIHRoYXQgYSBiaW5hcnkgemVybyBjb3JyZXNwb25kcyB0bwotICAgKiBhIGZsb2F0aW5nLXBvaW50IDAuMCwgc28gaW5pdGlhbGl6ZSBmbG9hdHMgZXhwbGljaXRseToKLSAgICovCi0gIHN5bS0+aGlzdC50aW1lID0gMC4wOwotICBzeW0tPmNnLmNoaWxkX3RpbWUgPSAwLjA7Ci0gIHN5bS0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLSAgc3ltLT5jZy5wcm9wLnNlbGYgPSAwLjA7Ci0gIHN5bS0+Y2cucHJvcC5jaGlsZCA9IDAuMDsKLX0KLQotCi0vKgotICogQ29tcGFyZSB0aGUgZnVuY3Rpb24gZW50cnktcG9pbnQgb2YgdHdvIHN5bWJvbHMgYW5kIHJldHVybiA8MCwgPTAsCi0gKiBvciA+MCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbGVmdCB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4sIGVxdWFsCi0gKiB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSByaWdodCB2YWx1ZS4gIElmIHR3byBzeW1ib2xzIGFyZSBlcXVhbAotICogYnV0IG9uZSBoYXMgaXNfZnVuYyBzZXQgYW5kIHRoZSBvdGhlciBkb2Vzbid0LCB3ZSBtYWtlIHRoZQotICogbm9uLWZ1bmN0aW9uIHN5bWJvbCBvbmUgImJpZ2dlciIgc28gdGhhdCB0aGUgZnVuY3Rpb24gc3ltYm9sIHdpbGwKLSAqIHN1cnZpdmUgZHVwbGljYXRlIHJlbW92YWwuICBGaW5hbGx5LCBpZiBib3RoIHN5bWJvbHMgaGF2ZSB0aGUKLSAqIHNhbWUgaXNfZnVuYyB2YWx1ZSwgd2UgZGlzY3JpbWluYXRlIGFnYWluc3QgaXNfc3RhdGljIHN1Y2ggdGhhdAotICogdGhlIGdsb2JhbCBzeW1ib2wgc3Vydml2ZXMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfYWRkciwgKGxwLCBycCksIGNvbnN0IFBUUiBscCBBTkQgY29uc3QgUFRSIHJwKQotewotICBTeW0gKmxlZnQgPSAoU3ltICopIGxwOwotICBTeW0gKnJpZ2h0ID0gKFN5bSAqKSBycDsKLQotICBpZiAobGVmdC0+YWRkciA+IHJpZ2h0LT5hZGRyKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAobGVmdC0+YWRkciA8IHJpZ2h0LT5hZGRyKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGxlZnQtPmlzX2Z1bmMgIT0gcmlnaHQtPmlzX2Z1bmMpCi0gICAgewotICAgICAgcmV0dXJuIHJpZ2h0LT5pc19mdW5jIC0gbGVmdC0+aXNfZnVuYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlZnQtPmlzX3N0YXRpYyAtIHJpZ2h0LT5pc19zdGF0aWM7Ci19Ci0KLQotdm9pZAotREVGVU4gKHN5bXRhYl9maW5hbGl6ZSwgKHRhYiksIFN5bV9UYWJsZSAqIHRhYikKLXsKLSAgU3ltICpzcmMsICpkc3Q7Ci0gIGJmZF92bWEgcHJldl9hZGRyOwotCi0gIGlmICghdGFiLT5sZW4pCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKgotICAgKiBTb3J0IHN5bWJvbCB0YWJsZSBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIGZ1bmN0aW9uIGFkZHJlc3NlczoKLSAgICovCi0gIHFzb3J0ICh0YWItPmJhc2UsIHRhYi0+bGVuLCBzaXplb2YgKFN5bSksIGNtcF9hZGRyKTsKLQotICAvKgotICAgKiBSZW1vdmUgZHVwbGljYXRlIGVudHJpZXMgdG8gc3BlZWQtdXAgbGF0ZXIgcHJvY2Vzc2luZyBhbmQKLSAgICogc2V0IGVuZF9hZGRyIGlmIGl0cyBub3Qgc2V0IHlldDoKLSAgICovCi0gIHByZXZfYWRkciA9IHRhYi0+YmFzZVswXS5hZGRyICsgMTsKLSAgZm9yIChzcmMgPSBkc3QgPSB0YWItPmJhc2U7IHNyYyA8IHRhYi0+bGltaXQ7ICsrc3JjKQotICAgIHsKLSAgICAgIGlmIChzcmMtPmFkZHIgPT0gcHJldl9hZGRyKQotCXsKLQkgIC8qCi0JICAgKiBJZiBzYW1lIGFkZHJlc3MsIGZhdm9yIGdsb2JhbCBzeW1ib2wgb3ZlciBzdGF0aWMgb25lLAotCSAgICogdGhlbiBmdW5jdGlvbiBvdmVyIGxpbmUgbnVtYmVyLiAgSWYgYm90aCBzeW1ib2xzIGFyZQotCSAgICogZWl0aGVyIHN0YXRpYyBvciBnbG9iYWwgYW5kIGVpdGhlciBmdW5jdGlvbiBvciBsaW5lLCBjaGVjawotCSAgICogd2hldGhlciBvbmUgaGFzIG5hbWUgYmVnaW5uaW5nIHdpdGggdW5kZXJzY29yZSB3aGlsZQotCSAgICogdGhlIG90aGVyIGRvZXNuJ3QuICBJbiBzdWNoIGNhc2VzLCBrZWVwIHN5bSB3aXRob3V0Ci0JICAgKiB1bmRlcnNjb3JlLiAgVGhpcyB0YWtlcyBjYXJlcyBvZiBjb21waWxlciBnZW5lcmF0ZWQKLQkgICAqIHN5bWJvbHMgKHN1Y2ggYXMgX19nbnVfY29tcGlsZWQsIF9fYzg5X3VzZWQsIGV0Yy4pLgotCSAgICovCi0JICBpZiAoKCFzcmMtPmlzX3N0YXRpYyAmJiBkc3RbLTFdLmlzX3N0YXRpYykKLQkgICAgICB8fCAoKHNyYy0+aXNfc3RhdGljID09IGRzdFstMV0uaXNfc3RhdGljKQotCQkgICYmICgoc3JjLT5pc19mdW5jICYmICFkc3RbLTFdLmlzX2Z1bmMpCi0JCSAgICAgIHx8ICgoc3JjLT5pc19mdW5jID09IGRzdFstMV0uaXNfZnVuYykKLQkJCSAgJiYgKChzcmMtPm5hbWVbMF0gIT0gJ18nICYmIGRzdFstMV0ubmFtZVswXSA9PSAnXycpCi0JCQkgICAgICB8fCAoc3JjLT5uYW1lWzBdCi0JCQkJICAmJiBzcmMtPm5hbWVbMV0gIT0gJ18nCi0JCQkJICAmJiBkc3RbLTFdLm5hbWVbMV0gPT0gJ18nKSkpKSkpCi0JICAgIHsKLQkgICAgICBEQkcgKEFPVVRERUJVRyB8IElEREVCVUcsCi0JCSAgIHByaW50ZiAoIltzeW10YWJfZmluYWxpemVdIGZhdm9yICVzQCVjJWMgb3ZlciAlc0AlYyVjIiwKLQkJCSAgIHNyYy0+bmFtZSwgc3JjLT5pc19zdGF0aWMgPyAndCcgOiAnVCcsCi0JCQkgICBzcmMtPmlzX2Z1bmMgPyAnRicgOiAnZicsCi0JCQkgICBkc3RbLTFdLm5hbWUsIGRzdFstMV0uaXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgZHN0Wy0xXS5pc19mdW5jID8gJ0YnIDogJ2YnKTsKLQkJICAgcHJpbnRmICgiIChhZGRyPSVseClcbiIsICh1bnNpZ25lZCBsb25nKSBzcmMtPmFkZHIpKTsKLQkgICAgICBkc3RbLTFdID0gKnNyYzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSBmYXZvciAlc0AlYyVjIG92ZXIgJXNAJWMlYyIsCi0JCQkgICBkc3RbLTFdLm5hbWUsIGRzdFstMV0uaXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgZHN0Wy0xXS5pc19mdW5jID8gJ0YnIDogJ2YnLAotCQkJICAgc3JjLT5uYW1lLCBzcmMtPmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIHNyYy0+aXNfZnVuYyA/ICdGJyA6ICdmJyk7Ci0JCSAgIHByaW50ZiAoIiAoYWRkcj0lbHgpXG4iLCAodW5zaWduZWQgbG9uZykgc3JjLT5hZGRyKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGRzdCA+IHRhYi0+YmFzZSAmJiBkc3RbLTFdLmVuZF9hZGRyID09IDApCi0JICAgIHsKLQkgICAgICBkc3RbLTFdLmVuZF9hZGRyID0gc3JjLT5hZGRyIC0gMTsKLQkgICAgfQotCi0JICAvKiByZXRhaW4gc3ltIG9ubHkgaWYgaXQgaGFzIGEgbm9uLWVtcHR5IGFkZHJlc3MgcmFuZ2U6ICovCi0JICBpZiAoIXNyYy0+ZW5kX2FkZHIgfHwgc3JjLT5hZGRyIDw9IHNyYy0+ZW5kX2FkZHIpCi0JICAgIHsKLQkgICAgICAqZHN0KysgPSAqc3JjOwotCSAgICAgIHByZXZfYWRkciA9IHNyYy0+YWRkcjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmICh0YWItPmxlbiA+IDAgJiYgZHN0Wy0xXS5lbmRfYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGRzdFstMV0uZW5kX2FkZHIgPSBjb3JlX3RleHRfc2VjdC0+dm1hICsgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZSAtIDE7Ci0gICAgfQotCi0gIERCRyAoQU9VVERFQlVHIHwgSURERUJVRywKLSAgICAgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXTogcmVtb3ZlZCAlZCBkdXBsaWNhdGUgZW50cmllc1xuIiwKLQkgICAgICAgdGFiLT5sZW4gLSAoaW50KSAoZHN0IC0gdGFiLT5iYXNlKSkpOwotCi0gIHRhYi0+bGltaXQgPSBkc3Q7Ci0gIHRhYi0+bGVuID0gdGFiLT5saW1pdCAtIHRhYi0+YmFzZTsKLQotICBEQkcgKEFPVVRERUJVRyB8IElEREVCVUcsCi0gICAgICAgdW5zaWduZWQgaW50IGo7Ci0KLSAgICAgICBmb3IgKGogPSAwOyBqIDwgdGFiLT5sZW47ICsraikKLSAgICAgICB7Ci0gICAgICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV0gMHglbHgtMHglbHhcdCVzXG4iLAotCSAgICAgICAobG9uZykgdGFiLT5iYXNlW2pdLmFkZHIsIChsb25nKSB0YWItPmJhc2Vbal0uZW5kX2FkZHIsCi0JICAgICAgIHRhYi0+YmFzZVtqXS5uYW1lKTsKLSAgICAgICB9Ci0gICk7Ci19Ci0KLQotI2lmZGVmIERFQlVHCi0KLVN5bSAqCi1ERUZVTiAoZGJnX3N5bV9sb29rdXAsIChzeW10YWIsIGFkZHJlc3MpLCBTeW1fVGFibGUgKiBzeW10YWIgQU5EIGJmZF92bWEgYWRkcmVzcykKLXsKLSAgbG9uZyBsb3csIG1pZCwgaGlnaDsKLSAgU3ltICpzeW07Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiW2RiZ19zeW1fbG9va3VwXSBhZGRyZXNzIDB4JWx4XG4iLAotCSAgICh1bnNpZ25lZCBsb25nKSBhZGRyZXNzKTsKLQotICBzeW0gPSBzeW10YWItPmJhc2U7Ci0gIGZvciAobG93ID0gMCwgaGlnaCA9IHN5bXRhYi0+bGVuIC0gMTsgbG93ICE9IGhpZ2g7KQotICAgIHsKLSAgICAgIG1pZCA9IChoaWdoICsgbG93KSA+PiAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2RiZ19zeW1fbG9va3VwXSBsb3c9MHglbHgsIG1pZD0weCVseCwgaGlnaD0weCVseFxuIiwKLQkgICAgICAgbG93LCBtaWQsIGhpZ2gpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2RiZ19zeW1fbG9va3VwXSBzeW1bbV09MHglbHggc3ltW20gKyAxXT0weCVseFxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN5bVttaWRdLmFkZHIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzeW1bbWlkICsgMV0uYWRkcik7Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA8PSBhZGRyZXNzICYmIHN5bVttaWQgKyAxXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICByZXR1cm4gJnN5bVttaWRdOwotCX0KLSAgICAgIGlmIChzeW1bbWlkXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICBoaWdoID0gbWlkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb3cgPSBtaWQgKyAxOwotCX0KLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gYmluYXJ5IHNlYXJjaCBmYWlscz8/P1xuIik7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYJLyogREVCVUcgKi8KLQotCi0vKgotICogTG9vayB1cCBhbiBhZGRyZXNzIGluIHRoZSBzeW1ib2wtdGFibGUgdGhhdCBpcyBzb3J0ZWQgYnkgYWRkcmVzcy4KLSAqIElmIGFkZHJlc3MgZG9lcyBub3QgaGl0IGFueSBzeW1ib2wsIDAgaXMgcmV0dXJuZWQuCi0gKi8KLVN5bSAqCi1ERUZVTiAoc3ltX2xvb2t1cCwgKHN5bXRhYiwgYWRkcmVzcyksIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgYmZkX3ZtYSBhZGRyZXNzKQotewotICBsb25nIGxvdywgaGlnaDsKLSAgbG9uZyBtaWQgPSAtMTsKLSAgU3ltICpzeW07Ci0jaWZkZWYgREVCVUcKLSAgaW50IHByb2JlcyA9IDA7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICBpZiAoIXN5bXRhYi0+bGVuKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzeW0gPSBzeW10YWItPmJhc2U7Ci0gIGZvciAobG93ID0gMCwgaGlnaCA9IHN5bXRhYi0+bGVuIC0gMTsgbG93ICE9IGhpZ2g7KQotICAgIHsKLSAgICAgIERCRyAoTE9PS1VQREVCVUcsICsrcHJvYmVzKTsKLSAgICAgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA8PSBhZGRyZXNzICYmIHN5bVttaWQgKyAxXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICBpZiAoYWRkcmVzcyA+IHN5bVttaWRdLmVuZF9hZGRyKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBBZGRyZXNzIGZhbGxzIGludG8gZ2FwIGJldHdlZW4gc3ltW21pZF0gYW5kCi0JICAgICAgICogc3ltW21pZCArIDFdOgotCSAgICAgICAqLwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBEQkcgKExPT0tVUERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltX2xvb2t1cF0gJWQgcHJvYmVzIChzeW10YWItPmxlbj0ldSlcbiIsCi0JCQkgICBwcm9iZXMsIHN5bXRhYi0+bGVuIC0gMSkpOwotCSAgICAgIHJldHVybiAmc3ltW21pZF07Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaGlnaCA9IG1pZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG93ID0gbWlkICsgMTsKLQl9Ci0gICAgfQotICBpZiAoc3ltW21pZCArIDFdLmFkZHIgPD0gYWRkcmVzcykKLSAgICB7Ci0gICAgICBpZiAoYWRkcmVzcyA+IHN5bVttaWQgKyAxXS5lbmRfYWRkcikKLQl7Ci0JICAvKiBhZGRyZXNzIGlzIGJleW9uZCBlbmQgb2Ygc3ltW21pZCArIDFdOiAqLwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIERCRyAoTE9PS1VQREVCVUcsIHByaW50ZiAoIltzeW1fbG9va3VwXSAlZCAoJXUpIHByb2JlcywgZmFsbCBvZmZcbiIsCi0JCQkJICAgIHByb2Jlcywgc3ltdGFiLT5sZW4gLSAxKSk7Ci0JICByZXR1cm4gJnN5bVttaWQgKyAxXTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3N5bXRhYi5oIGIvZ3Byb2Yvc3ltdGFiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTQ1MGUuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltdGFiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotI2lmbmRlZiBzeW10YWJfaAotI2RlZmluZSBzeW10YWJfaAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLQotLyoKLSAqIEZvciBhIHByb2ZpbGUgdG8gYmUgaW50ZWxsaWdpYmxlIHRvIGEgaHVtYW4gdXNlciwgaXQgaXMgbmVjZXNzYXJ5Ci0gKiB0byBtYXAgY29kZS1hZGRyZXNzZXMgaW50byBzb3VyY2UtY29kZSBpbmZvcm1hdGlvbi4gIFNvdXJjZS1jb2RlCi0gKiBpbmZvcm1hdGlvbiBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mOiAoaSkgZnVuY3Rpb24tbmFtZSwgKGlpKQotICogc291cmNlIGZpbGUtbmFtZSwgYW5kIChpaWkpIHNvdXJjZSBsaW5lIG51bWJlci4KLSAqCi0gKiBUaGUgc3ltYm9sIHRhYmxlIGlzIHVzZWQgdG8gbWFwIGFkZHJlc3NlcyBpbnRvIHNvdXJjZS1jb2RlCi0gKiBpbmZvcm1hdGlvbi4KLSAqLwotCi0jaW5jbHVkZSAic291cmNlLmgiCi0KLSNkZWZpbmUgTkJCUyAxMAotCi0vKgotICogU3ltYm9sLWVudHJ5LiAgRm9yIGVhY2ggZXh0ZXJuYWwgaW4gdGhlIHNwZWNpZmllZCBmaWxlIHdlIGdhdGhlcgotICogaXRzIGFkZHJlc3MsIHRoZSBudW1iZXIgb2YgY2FsbHMgYW5kIGNvbXB1dGUgaXRzIHNoYXJlIG9mIGNwdSB0aW1lLgotICovCi10eXBlZGVmIHN0cnVjdCBzeW0KLSAgewotICAgIC8qCi0gICAgICogQ29tbW9uIGluZm9ybWF0aW9uOgotICAgICAqCi0gICAgICogSW4gdGhlIHN5bWJvbC10YWJsZSwgZmllbGRzIEFERFIgYW5kIEZVTkNfTkFNRSBhcmUgZ3VhcmFudGVlZAotICAgICAqIHRvIGNvbnRhaW4gdmFsaWQgaW5mb3JtYXRpb24uICBGSUxFIG1heSBiZSAwLCBpZiB1bmtub3duIGFuZAotICAgICAqIExJTkVfTlVNIG1heWJlIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBiZmRfdm1hIGFkZHI7CQkvKiBhZGRyZXNzIG9mIGVudHJ5IHBvaW50ICovCi0gICAgYmZkX3ZtYSBlbmRfYWRkcjsJCS8qIGVuZC1hZGRyZXNzICovCi0gICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIG5hbWUgb2YgZnVuY3Rpb24gdGhpcyBzeW0gaXMgZnJvbSAqLwotICAgIFNvdXJjZV9GaWxlICpmaWxlOwkJLyogc291cmNlIGZpbGUgc3ltYm9sIGNvbWVzIGZyb20gKi8KLSAgICBpbnQgbGluZV9udW07CQkvKiBzb3VyY2UgbGluZSBudW1iZXIgKi8KLSAgICB1bnNpZ25lZCBpbnQgaXNfZnVuYzoxLAkvKiBpcyB0aGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQ/ICovCi0gICAgICBpc19zdGF0aWM6MSwJCS8qIGlzIHRoaXMgYSBsb2NhbCAoc3RhdGljKSBzeW1ib2w/ICovCi0gICAgICBpc19iYl9oZWFkOjEsCQkvKiBpcyB0aGlzIHRoZSBoZWFkIG9mIGEgYmFzaWMtYmxrPyAqLwotICAgICAgbWFwcGVkOjEsCQkJLyogdGhpcyBzeW1ib2wgd2FzIG1hcHBlZCB0byBhbm90aGVyIG5hbWUgKi8KLSAgICAgIGhhc19iZWVuX3BsYWNlZDoxOwkvKiBoYXZlIHdlIHBsYWNlZCB0aGlzIHN5bWJvbD8gICovCi0gICAgdW5zaWduZWQgbG9uZyBuY2FsbHM7CS8qIGhvdyBtYW55IHRpbWVzIGV4ZWN1dGVkICovCi0gICAgaW50IG51c2VzOwkJCS8qIGhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGFwcGVhcnMgaW4KLQkJCQkgICBhIHBhcnRpY3VsYXIgY29udGV4dCAqLwotICAgIGJmZF92bWEgYmJfYWRkcltOQkJTXTsJLyogYWRkcmVzcyBvZiBiYXNpYy1ibG9jayBzdGFydCAqLwotICAgIHVuc2lnbmVkIGxvbmcgYmJfY2FsbHNbTkJCU107IC8qIGhvdyBtYW55IHRpbWVzIGJhc2ljLWJsb2NrIHdhcyBjYWxsZWQgKi8KLSAgICBzdHJ1Y3Qgc3ltICpuZXh0OwkJLyogZm9yIGJ1aWxkaW5nIGNoYWlucyBvZiBzeW1zICovCi0gICAgc3RydWN0IHN5bSAqcHJldjsJCS8qIGZvciBidWlsZGluZyBjaGFpbnMgb2Ygc3ltcyAqLwotCi0gICAgLyogcHJvZmlsZS1zcGVjaWZpYyBpbmZvcm1hdGlvbjogKi8KLQotICAgIC8qIGhpc3RvZ3JhbSBzcGVjaWZpYyBpbmZvOiAqLwotICAgIHN0cnVjdAotICAgICAgewotCWRvdWJsZSB0aW1lOwkJLyogKHdlaWdodGVkKSB0aWNrcyBpbiB0aGlzIHJvdXRpbmUgKi8KLQliZmRfdm1hIHNjYWxlZF9hZGRyOwkvKiBzY2FsZWQgZW50cnkgcG9pbnQgKi8KLSAgICAgIH0KLSAgICBoaXN0OwotCi0gICAgLyogY2FsbC1ncmFwaCBzcGVjaWZpYyBpbmZvOiAqLwotICAgIHN0cnVjdAotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc2VsZl9jYWxsczsgLyogaG93IG1hbnkgY2FsbHMgdG8gc2VsZiAqLwotCWRvdWJsZSBjaGlsZF90aW1lOwkvKiBjdW11bGF0aXZlIHRpY2tzIGluIGNoaWxkcmVuICovCi0JaW50IGluZGV4OwkJLyogaW5kZXggaW4gdGhlIGdyYXBoIGxpc3QgKi8KLQlpbnQgdG9wX29yZGVyOwkJLyogZ3JhcGggY2FsbCBjaGFpbiB0b3Atc29ydCBvcmRlciAqLwotCWJvb2wgcHJpbnRfZmxhZzsJLyogc2hvdWxkIHRoaXMgYmUgcHJpbnRlZD8gKi8KLQlzdHJ1Y3QKLQkgIHsKLQkgICAgZG91YmxlIGZyYWN0OwkvKiB3aGF0ICUgb2YgdGltZSBwcm9wYWdhdGVzICovCi0JICAgIGRvdWJsZSBzZWxmOwkvKiBob3cgbXVjaCBzZWxmIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgICBkb3VibGUgY2hpbGQ7CS8qIGhvdyBtdWNoIGNoaWxkIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgfQotCXByb3A7Ci0Jc3RydWN0Ci0JICB7Ci0JICAgIGludCBudW07CQkvKiBpbnRlcm5hbCBudW1iZXIgb2YgY3ljbGUgb24gKi8KLQkgICAgc3RydWN0IHN5bSAqaGVhZDsJLyogaGVhZCBvZiBjeWNsZSAqLwotCSAgICBzdHJ1Y3Qgc3ltICpuZXh0OwkvKiBuZXh0IG1lbWJlciBvZiBjeWNsZSAqLwotCSAgfQotCWN5YzsKLQlzdHJ1Y3QgYXJjICpwYXJlbnRzOwkvKiBsaXN0IG9mIGNhbGxlciBhcmNzICovCi0Jc3RydWN0IGFyYyAqY2hpbGRyZW47CS8qIGxpc3Qgb2YgY2FsbGVlIGFyY3MgKi8KLSAgICAgIH0KLSAgICBjZzsKLSAgfQotU3ltOwotCi0vKgotICogU3ltYm9sLXRhYmxlcyBhcmUgYWx3YXlzIGFzc3VtZWQgdG8gYmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIKLSAqIG9mIGFkZHJlc3NlczoKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGludCBsZW47CQkvKiAjIG9mIHN5bWJvbHMgaW4gdGhpcyB0YWJsZSAqLwotICAgIFN5bSAqYmFzZTsJCQkvKiBmaXJzdCBlbGVtZW50IGluIHN5bWJvbCB0YWJsZSAqLwotICAgIFN5bSAqbGltaXQ7CQkJLyogbGltaXQgPSBiYXNlICsgbGVuICovCi0gIH0KLVN5bV9UYWJsZTsKLQotZXh0ZXJuIFN5bV9UYWJsZSBzeW10YWI7CS8qIHRoZSBzeW1ib2wgdGFibGUgKi8KLQotZXh0ZXJuIHZvaWQgc3ltX2luaXQgUEFSQU1TICgoU3ltICogc3ltKSk7Ci1leHRlcm4gdm9pZCBzeW10YWJfZmluYWxpemUgUEFSQU1TICgoU3ltX1RhYmxlICogc3ltdGFiKSk7Ci1leHRlcm4gU3ltICpzeW1fbG9va3VwIFBBUkFNUyAoKFN5bV9UYWJsZSAqIHN5bXRhYiwgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0KLWV4dGVybiB2b2lkIGZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi0jZW5kaWYgLyogc3ltdGFiX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3RhaG9lLmMgYi9ncHJvZi90YWhvZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTRiMzU4Li4wMDAwMDAwCi0tLSBhL2dwcm9mL3RhaG9lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxmJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMRgkweGZlCi0KLSAgICAvKgotICAgICAqICAgICAgICByZWdpc3RlciBmb3IgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotICAgICAqLwotI2RlZmluZQlQQwkweGYKLQotZW51bSB0YWhvZV9vcGVybW9kZXMKLSAgewotICAgIGxpdGVyYWwsIGluZGV4ZWQsIHJlZywgcmVnZGVmLCBhdXRvZGVjLCBhdXRvaW5jLCBhdXRvaW5jZGVmLAotICAgIGJ5dGVkaXNwLCBieXRlZGlzcGRlZiwgd29yZGRpc3AsIHdvcmRkaXNwZGVmLCBsb25nZGlzcCwgbG9uZ2Rpc3BkZWYsCi0gICAgaW1tZWRpYXRlLCBhYnNvbHV0ZSwgYnl0ZXJlbCwgYnl0ZXJlbGRlZiwgd29yZHJlbCwgd29yZHJlbGRlZiwKLSAgICBsb25ncmVsLCBsb25ncmVsZGVmCi0gIH07Ci10eXBlZGVmIGVudW0gdGFob2Vfb3Blcm1vZGVzIHRhaG9lX29wZXJhbmRlbnVtOwotCi0vKgotICogQSBzeW1ib2wgdG8gYmUgdGhlIGNoaWxkIG9mIGluZGlyZWN0IGNhbGxmOgotICovCi1TeW0gaW5kaXJlY3RjaGlsZDsKLQotCi10YWhvZV9vcGVyYW5kZW51bQotdGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKQotICAgICB1bnNpZ25lZCBjaGFyICptb2RlcDsKLXsKLSAgbG9uZyB1c2VzcmVnID0gKChsb25nKSAqbW9kZXApICYgMHhmOwotCi0gIHN3aXRjaCAoKChsb25nKSAqbW9kZXApID4+IDQpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBpbmRleGVkOwotICAgIGNhc2UgNToKLSAgICAgIHJldHVybiByZWc7Ci0gICAgY2FzZSA2OgotICAgICAgcmV0dXJuIHJlZ2RlZjsKLSAgICBjYXNlIDc6Ci0gICAgICByZXR1cm4gYXV0b2RlYzsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSAweGUgPyBhdXRvaW5jIDogaW1tZWRpYXRlOwotICAgIGNhc2UgOToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luY2RlZiA6IGFic29sdXRlOwotICAgIGNhc2UgMTA6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGJ5dGVkaXNwIDogYnl0ZXJlbDsKLSAgICBjYXNlIDExOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcGRlZiA6IGJ5dGVyZWxkZWY7Ci0gICAgY2FzZSAxMjoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gd29yZGRpc3AgOiB3b3JkcmVsOwotICAgIGNhc2UgMTM6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwZGVmIDogd29yZHJlbGRlZjsKLSAgICBjYXNlIDE0OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBsb25nZGlzcCA6IGxvbmdyZWw7Ci0gICAgY2FzZSAxNToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3BkZWYgOiBsb25ncmVsZGVmOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotY2hhciAqCi10YWhvZV9vcGVyYW5kbmFtZSAobW9kZSkKLSAgICAgdGFob2Vfb3BlcmFuZGVudW0gbW9kZTsKLXsKLQotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICAgIHJldHVybiAibGl0ZXJhbCI7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuICJpbmRleGVkIjsKLSAgICBjYXNlIHJlZzoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIiOwotICAgIGNhc2UgcmVnZGVmOgotICAgICAgcmV0dXJuICJyZWdpc3RlciBkZWZlcnJlZCI7Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgICAgcmV0dXJuICJhdXRvZGVjcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUiOwotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUiOwotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgICByZXR1cm4gImltbWVkaWF0ZSI7Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICAgIHJldHVybiAiYWJzb2x1dGUiOwotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIjsKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotbG9uZwotdGFob2Vfb3BlcmFuZGxlbmd0aCAobW9kZXApCi0gICAgIHVuc2lnbmVkIGNoYXIgKm1vZGVwOwotewotCi0gIHN3aXRjaCAodGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKSkKLSAgICB7Ci0gICAgY2FzZSBsaXRlcmFsOgotICAgIGNhc2UgcmVnOgotICAgIGNhc2UgcmVnZGVmOgotICAgIGNhc2UgYXV0b2RlYzoKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgY2FzZSBhdXRvaW5jZGVmOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotICAgIGNhc2UgYnl0ZXJlbDoKLSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIHdvcmRkaXNwOgotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgY2FzZSB3b3JkcmVsOgotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAzOwotICAgIGNhc2UgaW1tZWRpYXRlOgotICAgIGNhc2UgYWJzb2x1dGU6Ci0gICAgY2FzZSBsb25nZGlzcDoKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgIGNhc2UgbG9uZ3JlbDoKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gNTsKLSAgICBjYXNlIGluZGV4ZWQ6Ci0gICAgICByZXR1cm4gMSArIHRhaG9lX29wZXJhbmRsZW5ndGggKG1vZGVwICsgMSk7Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi0gIGFib3J0ICgpOwotfQotCi1iZmRfdm1hCi10YWhvZV9yZWxhZGRyIChtb2RlcCkKLSAgICAgY2hhciAqbW9kZXA7Ci17Ci0gIHRhaG9lX29wZXJhbmRlbnVtIG1vZGUgPSB0YWhvZV9vcGVyYW5kbW9kZSAobW9kZXApOwotICBjaGFyICpjcDsKLSAgc2hvcnQgKnNwOwotICBsb25nICpscDsKLSAgaW50IGk7Ci0gIGxvbmcgdmFsdWUgPSAwOwotCi0gIGNwID0gbW9kZXA7Ci0gICsrY3A7CQkJCS8qIHNraXAgb3ZlciB0aGUgbW9kZSAqLwotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbcmVsYWRkcl0gbm90IHJlbGF0aXZlIGFkZHJlc3NcbiIpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSBtb2RlcDsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqY3AgKyAqY3ApOwotICAgIGNhc2Ugd29yZHJlbDoKLSAgICAgIGZvciAoaSA9IDA7IChzaXplX3QpIGkgPCBzaXplb2YgKnNwOyBpKyspCi0JdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoY3BbaV0gJiAweGZmKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpzcCArIHZhbHVlKTsKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgICBmb3IgKGkgPSAwOyAoc2l6ZV90KSBpIDwgc2l6ZW9mICpscDsgaSsrKQotCXZhbHVlID0gKHZhbHVlIDw8IDgpICsgKGNwW2ldICYgMHhmZik7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqbHAgKyB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkCi10YWhvZV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgbG9uZyBsZW5ndGg7Ci0gIFN5bSAqY2hpbGQ7Ci0gIHRhaG9lX29wZXJhbmRlbnVtIG1vZGU7Ci0gIHRhaG9lX29wZXJhbmRlbnVtIGZpcnN0bW9kZTsKLSAgYmZkX3ZtYSBkZXN0cGM7Ci0gIHN0YXRpYyBib29sIGluaXRlZCA9IEZBTFNFOwotCi0gIGlmICghaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IFRSVUU7Ci0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0Y2hpbGQpOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5jeWMuaGVhZCA9ICZpbmRpcmVjdGNoaWxkOwotICAgIH0KLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCAodW5zaWduZWQgbG9uZykgcF9sb3dwYywKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBfaGlnaHBjKSk7Ci0gIGZvciAoaW5zdHJ1Y3RwID0gKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9sb3dwYzsKLSAgICAgICBpbnN0cnVjdHAgPCAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UgKyBwX2hpZ2hwYzsKLSAgICAgICBpbnN0cnVjdHAgKz0gbGVuZ3RoKQotICAgIHsKLSAgICAgIGxlbmd0aCA9IDE7Ci0gICAgICBpZiAoKmluc3RydWN0cCA9PSBDQUxMRikKLQl7Ci0JICAvKgotCSAgICogICAgbWF5YmUgYSBjYWxsZiwgYmV0dGVyIGNoZWNrIGl0IG91dC4KLQkgICAqICAgICAgc2tpcCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCi0JICAgKi8KLQkgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGxmIiwKLQkJCQkgIGluc3RydWN0cCAtICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSkpOwotCSAgZmlyc3Rtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKGluc3RydWN0cCArIGxlbmd0aCk7Ci0JICBzd2l0Y2ggKGZpcnN0bW9kZSkKLQkgICAgewotCSAgICBjYXNlIGxpdGVyYWw6Ci0JICAgIGNhc2UgaW1tZWRpYXRlOgotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGdvdG8gYm90Y2hlZDsKLQkgICAgfQotCSAgbGVuZ3RoICs9IHRhaG9lX29wZXJhbmRsZW5ndGggKGluc3RydWN0cCArIGxlbmd0aCk7Ci0JICBtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKGluc3RydWN0cCArIGxlbmd0aCk7Ci0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmICgiXHRmaXJzdCBvcGVyYW5kIGlzICVzIiwgdGFob2Vfb3BlcmFuZG5hbWUgKGZpcnN0bW9kZSkpOwotCSAgICAgICBwcmludGYgKCJcdHNlY29uZCBvcGVyYW5kIGlzICVzXG4iLCB0YWhvZV9vcGVyYW5kbmFtZSAobW9kZSkpOwotCSAgICApOwotCSAgc3dpdGNoIChtb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgcmVnZGVmOgotCSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotCSAgICBjYXNlIHdvcmRkaXNwZGVmOgotCSAgICBjYXNlIGxvbmdkaXNwZGVmOgotCSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0JICAgIGNhc2Ugd29yZHJlbGRlZjoKLQkgICAgY2FzZSBsb25ncmVsZGVmOgotCSAgICAgIC8qCi0JICAgICAgICogICAgaW5kaXJlY3QgY2FsbDogY2FsbCB0aHJvdWdoIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIGVpdGhlciAgKmQocikgICBhcyBhIHBhcmFtZXRlciBvciBsb2NhbAotCSAgICAgICAqICAgICAgICAgICAgICAocikgICAgIGFzIGEgcmV0dXJuIHZhbHVlCi0JICAgICAgICogICAgICAgICAgICAgICpmICAgICAgYXMgYSBnbG9iYWwgcG9pbnRlcgotCSAgICAgICAqICAgICAgW2FyZSB0aGVyZSBvdGhlcnMgdGhhdCB3ZSBtaXNzPywKLQkgICAgICAgKiAgICAgICBlLmcuIGFycmF5cyBvZiBwb2ludGVycyB0byBmdW5jdGlvbnM/Pz9dCi0JICAgICAgICovCi0JICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCSAgICAgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICBjYXNlIGJ5dGVyZWw6Ci0JICAgIGNhc2Ugd29yZHJlbDoKLQkgICAgY2FzZSBsb25ncmVsOgotCSAgICAgIC8qCi0JICAgICAgICogICAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCi0JICAgICAgICogICAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCi0JICAgICAgICogICAgICBhIGZ1bmN0aW9uLgotCSAgICAgICAqLwotCSAgICAgIGRlc3RwYyA9IHRhaG9lX3JlbGFkZHIgKGluc3RydWN0cCArIGxlbmd0aCkKLQkJLSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlOwotCSAgICAgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JCXsKLQkJICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JCSAgREJHIChDQUxMREVCVUcsCi0JCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHRkZXN0cGMgMHglbHgiLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkZXN0cGMpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5uYW1lICVzIiwgY2hpbGQtPm5hbWUpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5hZGRyIDB4JWx4XG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGlsZC0+YWRkcik7Ci0JCSAgICApOwotCQkgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0cGMpCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqICAgIGEgaGl0Ci0JCSAgICAgICAqLwotCQkgICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgICAgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICBnb3RvIGJvdGNoZWQ7Ci0JCX0KLQkgICAgICAvKgotCSAgICAgICAqICAgIGVsc2U6Ci0JICAgICAgICogICAgICBpdCBsb29rZWQgbGlrZSBhIGNhbGxmLAotCSAgICAgICAqICAgICAgYnV0IGl0IHdhc24ndCB0byBhbnl3aGVyZS4KLQkgICAgICAgKi8KLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGJvdGNoZWQ6Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBzb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCi0JICAgICAgICovCi0JICAgICAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF1cdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKLQkgICAgICBsZW5ndGggPSAxOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3V0aWxzLmMgYi9ncHJvZi91dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWYwMzFkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlIDxkZW1hbmdsZS5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0KLS8qCi0gKiBQcmludCBuYW1lIG9mIHN5bWJvbC4gIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgotICovCi1pbnQKLURFRlVOIChwcmludF9uYW1lX29ubHksIChzZWxmKSwgU3ltICogc2VsZikKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IHNlbGYtPm5hbWU7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpkZW1hbmdsZWQgPSAwOwotICBjaGFyIGJ1ZltQQVRIX01BWF07Ci0gIGludCBzaXplID0gMDsKLQotICBpZiAobmFtZSkKLSAgICB7Ci0gICAgICBpZiAoIWJzZF9zdHlsZV9vdXRwdXQpCi0JewotCSAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gJiYgZGlzY2FyZF91bmRlcnNjb3JlcykKLQkgICAgewotCSAgICAgIG5hbWUrKzsKLQkgICAgfQotCSAgaWYgKGRlbWFuZ2xlKQotCSAgICB7Ci0JICAgICAgZGVtYW5nbGVkID0gY3BsdXNfZGVtYW5nbGUgKG5hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLQkgICAgICBpZiAoZGVtYW5nbGVkKQotCQl7Ci0JCSAgbmFtZSA9IGRlbWFuZ2xlZDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgcHJpbnRmICgiJXMiLCBuYW1lKTsKLSAgICAgIHNpemUgPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKGxpbmVfZ3JhbnVsYXJpdHkgJiYgc2VsZi0+ZmlsZSkKLQl7Ci0JICBmaWxlbmFtZSA9IHNlbGYtPmZpbGUtPm5hbWU7Ci0JICBpZiAoIXByaW50X3BhdGgpCi0JICAgIHsKLQkgICAgICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOwotCSAgICAgIGlmIChmaWxlbmFtZSkKLQkJewotCQkgICsrZmlsZW5hbWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaWxlbmFtZSA9IHNlbGYtPmZpbGUtPm5hbWU7Ci0JCX0KLQkgICAgfQotCSAgc3ByaW50ZiAoYnVmLCAiICglczolZCkiLCBmaWxlbmFtZSwgc2VsZi0+bGluZV9udW0pOwotCSAgcHJpbnRmIChidWYpOwotCSAgc2l6ZSArPSBzdHJsZW4gKGJ1Zik7Ci0JfQotICAgICAgaWYgKGRlbWFuZ2xlZCkKLQl7Ci0JICBmcmVlIChkZW1hbmdsZWQpOwotCX0KLSAgICAgIERCRyAoREZOREVCVUcsIHByaW50ZiAoInslZH0gIiwgc2VsZi0+Y2cudG9wX29yZGVyKSk7Ci0gICAgICBEQkcgKFBST1BERUJVRywgcHJpbnRmICgiJTQuMGYlJSAiLCAxMDAuMCAqIHNlbGYtPmNnLnByb3AuZnJhY3QpKTsKLSAgICB9Ci0gIHJldHVybiBzaXplOwotfQotCi0KLXZvaWQKLURFRlVOIChwcmludF9uYW1lLCAoc2VsZiksIFN5bSAqIHNlbGYpCi17Ci0gIHByaW50X25hbWVfb25seSAoc2VsZik7Ci0KLSAgaWYgKHNlbGYtPmNnLmN5Yy5udW0gIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiA8Y3ljbGUgJWQ+IiksIHNlbGYtPmNnLmN5Yy5udW0pOwotICAgIH0KLSAgaWYgKHNlbGYtPmNnLmluZGV4ICE9IDApCi0gICAgewotICAgICAgaWYgKHNlbGYtPmNnLnByaW50X2ZsYWcpCi0JewotCSAgcHJpbnRmICgiIFslZF0iLCBzZWxmLT5jZy5pbmRleCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIiAoJWQpIiwgc2VsZi0+Y2cuaW5kZXgpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi91dGlscy5oIGIvZ3Byb2YvdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmYjljNi4uMDAwMDAwMAotLS0gYS9ncHJvZi91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIHV0aWxzX2gKLSNkZWZpbmUgdXRpbHNfaAotCi1leHRlcm4gaW50IHByaW50X25hbWVfb25seSBQQVJBTVMgKChTeW0gKiBzZWxmKSk7Ci1leHRlcm4gdm9pZCBwcmludF9uYW1lIFBBUkFNUyAoKFN5bSAqIHNlbGYpKTsKLQotI2VuZGlmIC8qIHV0aWxzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3ZheC5jIGIvZ3Byb2YvdmF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZmRmNDMuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvdmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxzJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMUwkweGZiCi0KLSAgICAvKgotICAgICAqICAgICAgICByZWdpc3RlciBmb3IgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotICAgICAqLwotI2RlZmluZQlQQwkweGYKLQotZW51bSBvcGVybW9kZXMKLSAgewotICAgIGxpdGVyYWwsIGluZGV4ZWQsIHJlZywgcmVnZGVmLCBhdXRvZGVjLCBhdXRvaW5jLCBhdXRvaW5jZGVmLAotICAgIGJ5dGVkaXNwLCBieXRlZGlzcGRlZiwgd29yZGRpc3AsIHdvcmRkaXNwZGVmLCBsb25nZGlzcCwgbG9uZ2Rpc3BkZWYsCi0gICAgaW1tZWRpYXRlLCBhYnNvbHV0ZSwgYnl0ZXJlbCwgYnl0ZXJlbGRlZiwgd29yZHJlbCwgd29yZHJlbGRlZiwKLSAgICBsb25ncmVsLCBsb25ncmVsZGVmCi0gIH07Ci10eXBlZGVmIGVudW0gb3Blcm1vZGVzIG9wZXJhbmRlbnVtOwotCi1zdHJ1Y3QgbW9kZWJ5dGUKLSAgewotICAgIHVuc2lnbmVkIGludCByZWdmaWVsZDo0OwotICAgIHVuc2lnbmVkIGludCBtb2RlZmllbGQ6NDsKLSAgfTsKLQotLyoKLSAqIEEgc3ltYm9sIHRvIGJlIHRoZSBjaGlsZCBvZiBpbmRpcmVjdCBjYWxsczoKLSAqLwotU3ltIGluZGlyZWN0Y2hpbGQ7Ci0KLQotc3RhdGljIG9wZXJhbmRlbnVtCi12YXhfb3BlcmFuZG1vZGUgKG1vZGVwKQotICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOwotewotICBsb25nIHVzZXNyZWcgPSBtb2RlcC0+cmVnZmllbGQ7Ci0KLSAgc3dpdGNoIChtb2RlcC0+bW9kZWZpZWxkKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gaW5kZXhlZDsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gcmVnOwotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiByZWdkZWY7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIGF1dG9kZWM7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBhdXRvaW5jIDogaW1tZWRpYXRlOwotICAgIGNhc2UgOToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luY2RlZiA6IGFic29sdXRlOwotICAgIGNhc2UgMTA6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGJ5dGVkaXNwIDogYnl0ZXJlbDsKLSAgICBjYXNlIDExOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcGRlZiA6IGJ5dGVyZWxkZWY7Ci0gICAgY2FzZSAxMjoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gd29yZGRpc3AgOiB3b3JkcmVsOwotICAgIGNhc2UgMTM6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwZGVmIDogd29yZHJlbGRlZjsKLSAgICBjYXNlIDE0OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBsb25nZGlzcCA6IGxvbmdyZWw7Ci0gICAgY2FzZSAxNToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3BkZWYgOiBsb25ncmVsZGVmOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGNoYXIgKgotdmF4X29wZXJhbmRuYW1lIChtb2RlKQotICAgICBvcGVyYW5kZW51bSBtb2RlOwotewotCi0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSBsaXRlcmFsOgotICAgICAgcmV0dXJuICJsaXRlcmFsIjsKLSAgICBjYXNlIGluZGV4ZWQ6Ci0gICAgICByZXR1cm4gImluZGV4ZWQiOwotICAgIGNhc2UgcmVnOgotICAgICAgcmV0dXJuICJyZWdpc3RlciI7Ci0gICAgY2FzZSByZWdkZWY6Ci0gICAgICByZXR1cm4gInJlZ2lzdGVyIGRlZmVycmVkIjsKLSAgICBjYXNlIGF1dG9kZWM6Ci0gICAgICByZXR1cm4gImF1dG9kZWNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luYzoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCI7Ci0gICAgY2FzZSBhdXRvaW5jZGVmOgotICAgICAgcmV0dXJuICJhdXRvaW5jcmVtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVkaXNwOgotICAgICAgcmV0dXJuICJieXRlIGRpc3BsYWNlbWVudCI7Ci0gICAgY2FzZSBieXRlZGlzcGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2UgYnl0ZXJlbDoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSI7Ci0gICAgY2FzZSBieXRlcmVsZGVmOgotICAgICAgcmV0dXJuICJieXRlIHJlbGF0aXZlIGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRkaXNwOgotICAgICAgcmV0dXJuICJ3b3JkIGRpc3BsYWNlbWVudCI7Ci0gICAgY2FzZSB3b3JkZGlzcGRlZjoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2Ugd29yZHJlbDoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSI7Ci0gICAgY2FzZSB3b3JkcmVsZGVmOgotICAgICAgcmV0dXJuICJ3b3JkIHJlbGF0aXZlIGRlZmVycmVkIjsKLSAgICBjYXNlIGltbWVkaWF0ZToKLSAgICAgIHJldHVybiAiaW1tZWRpYXRlIjsKLSAgICBjYXNlIGFic29sdXRlOgotICAgICAgcmV0dXJuICJhYnNvbHV0ZSI7Ci0gICAgY2FzZSBsb25nZGlzcDoKLSAgICAgIHJldHVybiAibG9uZyBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgbG9uZ2Rpc3BkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUiOwotICAgIGNhc2UgbG9uZ3JlbGRlZjoKLSAgICAgIHJldHVybiAibG9uZyByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi0gIGFib3J0ICgpOwotfQotCi1zdGF0aWMgbG9uZwotdmF4X29wZXJhbmRsZW5ndGggKG1vZGVwKQotICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOwotewotCi0gIHN3aXRjaCAodmF4X29wZXJhbmRtb2RlIChtb2RlcCkpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICBjYXNlIHJlZzoKLSAgICBjYXNlIHJlZ2RlZjoKLSAgICBjYXNlIGF1dG9kZWM6Ci0gICAgY2FzZSBhdXRvaW5jOgotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgYnl0ZWRpc3A6Ci0gICAgY2FzZSBieXRlZGlzcGRlZjoKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgY2FzZSBieXRlcmVsZGVmOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICBjYXNlIHdvcmRkaXNwZGVmOgotICAgIGNhc2Ugd29yZHJlbDoKLSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIGltbWVkaWF0ZToKLSAgICBjYXNlIGFic29sdXRlOgotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgY2FzZSBsb25nZGlzcGRlZjoKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgY2FzZSBsb25ncmVsZGVmOgotICAgICAgcmV0dXJuIDU7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuIDEgKyB2YXhfb3BlcmFuZGxlbmd0aCAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoKGNoYXIgKikgbW9kZXApICsgMSk7Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi0gIGFib3J0ICgpOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotdmF4X3JlbGFkZHIgKG1vZGVwKQotICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOwotewotICBvcGVyYW5kZW51bSBtb2RlID0gdmF4X29wZXJhbmRtb2RlIChtb2RlcCk7Ci0gIGNoYXIgKmNwOwotICBzaG9ydCAqc3A7Ci0gIGxvbmcgKmxwOwotCi0gIGNwID0gKGNoYXIgKikgbW9kZXA7Ci0gICsrY3A7CQkJCS8qIHNraXAgb3ZlciB0aGUgbW9kZSAqLwotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbcmVsYWRkcl0gbm90IHJlbGF0aXZlIGFkZHJlc3NcbiIpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSBtb2RlcDsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqY3AgKyAqY3ApOwotICAgIGNhc2Ugd29yZHJlbDoKLSAgICAgIHNwID0gKHNob3J0ICopIGNwOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKnNwICsgKnNwKTsKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgICBscCA9IChsb25nICopIGNwOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmxwICsgKmxwKTsKLSAgICB9Ci19Ci0KLQotdm9pZAotdmF4X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYykKLSAgICAgU3ltICpwYXJlbnQ7Ci0gICAgIGJmZF92bWEgcF9sb3dwYzsKLSAgICAgYmZkX3ZtYSBwX2hpZ2hwYzsKLXsKLSAgdW5zaWduZWQgY2hhciAqaW5zdHJ1Y3RwOwotICBsb25nIGxlbmd0aDsKLSAgU3ltICpjaGlsZDsKLSAgb3BlcmFuZGVudW0gbW9kZTsKLSAgb3BlcmFuZGVudW0gZmlyc3Rtb2RlOwotICBiZmRfdm1hIGRlc3RwYzsKLSAgc3RhdGljIGJvb2wgaW5pdGVkID0gRkFMU0U7Ci0KLSAgaWYgKCFpbml0ZWQpCi0gICAgewotICAgICAgaW5pdGVkID0gVFJVRTsKLSAgICAgIHN5bV9pbml0ICgmaW5kaXJlY3RjaGlsZCk7Ci0gICAgICBpbmRpcmVjdGNoaWxkLmNnLnByb3AuZnJhY3QgPSAxLjA7Ci0gICAgICBpbmRpcmVjdGNoaWxkLmNnLmN5Yy5oZWFkID0gJmluZGlyZWN0Y2hpbGQ7Ci0gICAgfQotCi0gIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCi0gICAgewotICAgICAgcF9sb3dwYyA9IHNfbG93cGM7Ci0gICAgfQotICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKLSAgICB7Ci0gICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOwotICAgIH0KLSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAotCQkJICBwYXJlbnQtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwX2xvd3BjLAotCQkJICAodW5zaWduZWQgbG9uZykgcF9oaWdocGMpKTsKLSAgZm9yIChpbnN0cnVjdHAgPSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UgKyBwX2xvd3BjOwotICAgICAgIGluc3RydWN0cCA8ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfaGlnaHBjOwotICAgICAgIGluc3RydWN0cCArPSBsZW5ndGgpCi0gICAgewotICAgICAgbGVuZ3RoID0gMTsKLSAgICAgIGlmICgqaW5zdHJ1Y3RwID09IENBTExTKQotCXsKLQkgIC8qCi0JICAgKiAgICBtYXliZSBhIGNhbGxzLCBiZXR0ZXIgY2hlY2sgaXQgb3V0LgotCSAgICogICAgICBza2lwIHRoZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kY2FsbF1cdDB4JXg6Y2FsbHMiLAotCQkgICAgICAgaW5zdHJ1Y3RwIC0gKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlKSk7Ci0JICBmaXJzdG1vZGUgPSB2YXhfb3BlcmFuZG1vZGUgKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCSAgc3dpdGNoIChmaXJzdG1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBsaXRlcmFsOgotCSAgICBjYXNlIGltbWVkaWF0ZToKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIH0KLQkgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JICBtb2RlID0gdmF4X29wZXJhbmRtb2RlICgoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJcdGZpcnN0IG9wZXJhbmQgaXMgJXMiLCB2YXhfb3BlcmFuZG5hbWUgKGZpcnN0bW9kZSkpOwotCSAgICAgICBwcmludGYgKCJcdHNlY29uZCBvcGVyYW5kIGlzICVzXG4iLCB2YXhfb3BlcmFuZG5hbWUgKG1vZGUpKSk7Ci0JICBzd2l0Y2ggKG1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSByZWdkZWY6Ci0JICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0JICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0JICAgIGNhc2UgbG9uZ2Rpc3BkZWY6Ci0JICAgIGNhc2UgYnl0ZXJlbGRlZjoKLQkgICAgY2FzZSB3b3JkcmVsZGVmOgotCSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBpbmRpcmVjdCBjYWxsOiBjYWxsIHRocm91Z2ggcG9pbnRlcgotCSAgICAgICAqICAgICAgZWl0aGVyICAqZChyKSAgIGFzIGEgcGFyYW1ldGVyIG9yIGxvY2FsCi0JICAgICAgICogICAgICAgICAgICAgIChyKSAgICAgYXMgYSByZXR1cm4gdmFsdWUKLQkgICAgICAgKiAgICAgICAgICAgICAgKmYgICAgICBhcyBhIGdsb2JhbCBwb2ludGVyCi0JICAgICAgICogICAgICBbYXJlIHRoZXJlIG90aGVycyB0aGF0IHdlIG1pc3M/LAotCSAgICAgICAqICAgICAgIGUuZy4gYXJyYXlzIG9mIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucz8/P10KLQkgICAgICAgKi8KLQkgICAgICBhcmNfYWRkIChwYXJlbnQsICZpbmRpcmVjdGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JICAgICAgbGVuZ3RoICs9IHZheF9vcGVyYW5kbGVuZ3RoICgKLQkJCQkgIChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICBjYXNlIGJ5dGVyZWw6Ci0JICAgIGNhc2Ugd29yZHJlbDoKLQkgICAgY2FzZSBsb25ncmVsOgotCSAgICAgIC8qCi0JICAgICAgICogICAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCi0JICAgICAgICogICAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCi0JICAgICAgICogICAgICBhIGZ1bmN0aW9uLgotCSAgICAgICAqLwotCSAgICAgIGRlc3RwYyA9IHZheF9yZWxhZGRyICgoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKQotCQktIChiZmRfdm1hKSBjb3JlX3RleHRfc3BhY2U7Ci0JICAgICAgaWYgKGRlc3RwYyA+PSBzX2xvd3BjICYmIGRlc3RwYyA8PSBzX2hpZ2hwYykKLQkJewotCQkgIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZGVzdHBjKTsKLQkJICBEQkcgKENBTExERUJVRywKLQkJICAgICAgIHByaW50ZiAoIltmaW5kY2FsbF1cdGRlc3RwYyAweCVseCIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGRlc3RwYyk7Ci0JCSAgICAgICBwcmludGYgKCIgY2hpbGQtPm5hbWUgJXMiLCBjaGlsZC0+bmFtZSk7Ci0JCSAgICAgICBwcmludGYgKCIgY2hpbGQtPmFkZHIgMHglbHhcbiIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT5hZGRyKTsKLQkJICAgICk7Ci0JCSAgaWYgKGNoaWxkLT5hZGRyID09IGRlc3RwYykKLQkJICAgIHsKLQkJICAgICAgLyoKLQkJICAgICAgICogICAgYSBoaXQKLQkJICAgICAgICovCi0JCSAgICAgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkJICAgICAgbGVuZ3RoICs9IHZheF9vcGVyYW5kbGVuZ3RoICgoc3RydWN0IG1vZGVieXRlICopCi0JCQkJCQkgICAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgIGdvdG8gYm90Y2hlZDsKLQkJfQotCSAgICAgIC8qCi0JICAgICAgICogICAgZWxzZToKLQkgICAgICAgKiAgICAgIGl0IGxvb2tlZCBsaWtlIGEgY2FsbHMsCi0JICAgICAgICogICAgICBidXQgaXQgd2Fzbid0IHRvIGFueXdoZXJlLgotCSAgICAgICAqLwotCSAgICAgIGdvdG8gYm90Y2hlZDsKLQkgICAgZGVmYXVsdDoKLQkgICAgYm90Y2hlZDoKLQkgICAgICAvKgotCSAgICAgICAqICAgIHNvbWV0aGluZyBmdW5ueSBnb2luZyBvbi4KLQkgICAgICAgKi8KLQkgICAgICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXVx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCSAgICAgIGxlbmd0aCA9IDE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9DT1BZSU5HIGIvaW5jbHVkZS9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU0OWJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvQ2hhbmdlTG9nIGIvaW5jbHVkZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDZhYmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYxICswLDAgQEAKLVN1biBPY3QgMjQgMTk6MTE6MzIgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tZDEwdi5oIChTSU1fRDEwVl9UUzJfRE1BUF9SRUdOVU0pOiBEZWZpbmUuCi0KLVNhdCBPY3QgMjMgMTk6MDA6MTMgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tZDEwdi5oOiBOZXcgZmlsZS4KLQotMTk5OS0wOS0wNCAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcG9ib3guY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fcGopOiBEZWNsYXJlLgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYW5zaWRlY2wuaDogQ29weSBhdHRyaWJ1dGUgc3VwcG9ydCBtYWNyb3MgZnJvbSBlZ2NzLgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQWRkIGluaXRfZnVuY3Rpb24gYW5kCi0JZmluaV9mdW5jdGlvbi4KLQotMTk5OS0wNi0yMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogbWlwcy5oIChFbGYzMl9JbnRlcm5hbF9Nc3ltKTogTmV3IHN0cnVjdHVyZS4KLQkoRWxmMzJfRXh0ZXJuYWxfTXN5bSk6IExpa2V3aXNlLgotCShFTEYzMl9NU19SRUxfSU5ERVgpOiBOZXcgbWFjcm8uCi0JKEVMRjMyX01TX0ZMQUdTKTogTGlrZXdpc2UuCi0JKEVMRjMyX01TX0lORk8pOiBMaWtld2lzZS4KLQkKLTE5OTktMDYtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoYXJtX3RvZ2dsZV9yZWduYW1lcyk6IE5ldyBwcm90b3R5cGUuCi0JKHN0cnVjdCBkaWFzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQ6IGRpc2Fzc2VtYmxlcl9vcHRpb25zLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9lbGZfdmVyc2lvbl9leHByKTogUmVuYW1lIGBtYXRjaCcgdG8gYHBhdHRlcm4nLgotCUFkZCBgbWF0Y2gnIGNhbGxiYWNrIGZ1bmN0aW9uLgotCi0xOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2luZm8pOiBBZGQgbm9fdW5kZWZpbmVkLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcm90b3R5cGUgZm9yIHByaW50X2luc25fbWNvcmUuCi0KLTE5OTktMDQtMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzKTogRGVjbGFyZS4KLQotMTk5OS0wMy0zMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogc3BsYXktdHJlZS5oIChzcGxheV90cmVlX2NvbXBhcmVfaW50cyk6IERlY2xhcmUuCi0KLVdlZCBNYXIgMjQgMTI6NDY6MjkgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBhbXkuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQ3lnd2lueywzMn0gc2hvdWxkIGhhdmUgdGhlIHByb3RvdHlwZS4KLQotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoYmZkX2xpbmtfaW5mbyk6IGFkZCBmaWVsZCAibXBjODYwYzAiLgotCi1Nb24gRmViICAxIDIxOjA1OjQ2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBkaXMtYXNtLmggKHByaW50X2luc25faTM4Nl9hdHQpOiAgRGVjbGFyZS4KLSAgICAgICAocHJpbnRfaW5zbl9pMzg2X2ludGVsKTogIERlY2xhcmUuCi0KLTk5OC0xMi0zMCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBDYXN0IFNUUkVBTSBhbmQKLQlGUFJJTlRGX0ZVTkMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLVdlZCBEZWMgMzAgMTY6MDc6MTQgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogY2hhbmdlIHZvaWQgKiB0byBQVFIgKHR3byBwbGFjZXMpLgotCi1Nb24gRGVjIDE0IDA5OjUzOjMxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogZGVtYW5nbGUuaDogRG9uJ3QgY2hlY2sgSU5fR0NDIGFueW1vcmUuCi0JKiBzcGxheS10cmVlLmg6IExpa2V3aXNlLgotCi1UdWUgRGVjICA4IDAwOjMwOjMxIDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gCi0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IEVsZW5hIFphbm5vbmkKLSAJPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiBhbmQgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluCi0gCWNoYW5nZXMgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBjaGFuZ2UgdGhlIHR5cGUgb2Ygc3RyZWFtCi0JZnJvbSBGSUxFKiB0byB2b2lkKiwgZm9yIHVzZSB3aXRoIGdkYidzIG5ldyB0eXBlIEdEQl9GSUxFLgotCShmcHJpbnRmX2Z0eXBlKTogY2hhbmdlIEZJTEUqIHBhcmFtZXRlciB0eXBlIHRvIHZvaWQqLgotCi0gICAgICAgICogZGVtYW5nbGUuaDogKERNR0xfRURHKTogbmV3IG1hY3JvIGZvciBLdWNrIGFuZCBBc3NvY2lhdGVzCi0gICAgICAgIChETUdMX1NUWUxFX01BU0spOiBtb2RpZnkgdG8gaW5jbHVkZSBLdWNrIGFuZCBBc3NvYyBzdHlsZQotICAgICAgICAoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGVkZ19kZW1hbmdsaW5nIHN0eWxlCi0gICAgICAgIChFREdfREVNQU5HTElOR19TVFlMRV9TVFJJTkcpOiBuZXcgbWFjcm8KLSAgICAgICAgKEVER19ERU1BTkdMSU5HKTogbmV3IG1hY3JvCi0KLSAgICAgICAgKiBkZW1hbmdsZS5oIChETUdMX0hQKTogbmV3IG1hY3JvLCBmb3IgSFAvYUNDIGNvbXBpbGVyLgotICAgICAgICAoRE1HTF9TVFlMRV9NQVNLKTogbW9kaWZ5IHRvIGluY2x1ZGUgbmV3IEhQJ3Mgc3R5bGUuCi0gICAgICAgIChkZW1hbmdsaW5nX3N0eWxlcyk6IGFkZCBuZXcgaHBfZGVtYW5nbGluZyB2YWx1ZS4KLSAgICAgICAgKEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTogbmV3IG1hY3JvLgotICAgICAgICAoQVJNX0RFTUFOR0xJTkcpOiBjb2VyY2UgdG8gaW50LgotICAgICAgICAoSFBfREVNQU5HTElORyk6IG5ldyBtYWNyby4KLQotCSogaHAtc3ltdGFiLmg6IHJld3JpdHRlbiwgZnJvbSBIUC4KLQkocXVpY2tfcHJvY2VkdXJlKTogY2hhbmdlIHR5cGUgb2YgbGFuZ3VhZ2UgZmllbGQgdG8gdW5zaWduZWQgaW50Ci0JKHF1aWNrX21vZHVsZSk6IGNoYW5nZSB0eXBlIG9mIGxhbmd1YWdlIGZpZWxkIHRvIHVuc2lnbmVkIGludAotCShzdHJ1Y3QgZG50dF90eXBlX3N2YXIpOiBhZGQgZmllbGQgdGhyZWFkX3NwZWNpZmljLgotCShocF9sYW5ndWFnZSk6IGFkZCBsYW5ndWFnZXMgbW9kY2FsIGFuZCBkbXBhc2NhbC4KLQotTW9uIE5vdiAzMCAxNToyNTo1OCAxOTk4ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZi9zaC5oIChlbGZfc2hfcmVsb2NfdHlwZSk6IEFkZCBSX1NIX0ZJUlNUX0lOVkFMSURfUkVMT0MsCi0JUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MsIFJfU0hfU1dJVENIOCBhbmQgUl9TSF9tYXguCi0KLUZyaSBOb3YgMjAgMTM6MTQ6MDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoYmFzZW5hbWUpOiBBZGQgcHJvdG90eXBlIGZvciBGcmVlQlNELgotCi1GcmkgTm92IDEzIDE5OjE5OjExIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogbGliaWJlcnR5Lmg6IFByb3RvdHlwZSB4Y2FsbG9jLgotCi1TdW4gTm92ICA4IDE3OjQyOjI1IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogYW5zaWRlY2wuaDogV3JhcCBwcm9ibGVtYXRpYyBtYWNyb3Mgd2l0aCAhSU5fR0NDLgotCi0JKiBkZW1hbmdsZS5oOiBOZXZlciBkZWZpbmUgUEFSQU1TKCkuCi0JKiBzcGxheS10cmVlLmg6IExpa2V3aXNlLgotCi1TYXQgTm92ICA3IDE4OjMwOjIwIDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXRlci5zY2hhdWVyQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl92YXgpOiBEZWNsYXJlLgotCi1TYXQgTm92ICA3IDE2OjA0OjAzIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogZGVtYW5nbGUuaDogRG9uJ3QgaW5jbHVkZSBnYW5zaWRlY2wuaC4KLQkqIHNwbGF5LXRyZWUuaDogTGlrZXdpc2UuCi0KLTE5OTgtMTAtMjYgMTY6MDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIG5ldyBmaWVsZCBvcHRpbWl6ZS4KLQotVGh1IE9jdCAyMiAxOTo1ODowMCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHNwbGF5LXRyZWUuaDogV3JhcCBmdW5jdGlvbiBwb2ludGVyIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMgaW4KLQlQQVJBTVMoKSBtYWNyby4KLQotMTk5OC0xMC0yMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogc3BsYXktdHJlZS5oOiBOZXcgZmlsZS4KLQotRnJpIE9jdCAgOSAwMDowMjowMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1lcmdlIGRldm8gYW5kIGVnY3MgaW5jbHVkZSBkaXJlY3Rvcmllcy4KLQotU2F0IFNlcCAgNSAxMjoxNjozMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oLCBvYnN0YWNrLmg6IFVwZGF0ZWQgZnJvbSBnY2MuCi0KLTE5OTgtMDgtMDMgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogbGliaWJlcnR5LmggKHhleGl0KTogQ2hhbmdlIGRlY2wgdG8gdXNlIG1vZGVybiBHQ0MgYXR0cmlidXRlCi0JdG8gaW5kaWNhdGUgZXhpdCBkb2VzIG5vdCByZXR1cm4uCi0KLU1vbiBKdW4gIDEgMTM6NDg6MzIgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotVHVlIE1heSAyNiAyMDo1Nzo0MyAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBlbGYvc3BhcmMuaCAoRUZfU1BBUkNfTEVEQVRBLCBSX1NQQVJDXzMyTEUpOiBBZGRlZC4KLQotVHVlIEZlYiAyNCAxMzowNTowMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGRpc2Fzc2VtYmxlX2luZm8pOiBNZW1iZXIgYHN5bWJvbCcgcmVuYW1lZCB0byBgc3ltYm9scycKLQlhbmQgbWFkZSBhbiAiYXN5bWJvbCAqKiIuICBOZXcgbWVtYmVyIG51bV9zeW1ib2xzLgotCShJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSCk6IFVwZGF0ZS4KLQotVHVlIEZlYiAxNyAxMjozMjoxOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOiBBZGQKLSAJcmVnaXN0ZXIgbGVuZ3RoIHBhcmFtZXRlci4gIEZ1bmN0aW9ucyByZXR1cm4gYWN0dWFsIGxlbmd0aCBvZgotIAlyZWdpc3Rlci4KLQotVGh1IEZlYiAxMiAxNjoyOTowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdldG9wdC5oOiBVcGRhdGUgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi1XZWQgRmViIDExIDE2OjU2OjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHN5bWNhdC5oOiBOZXcgZmlsZS4KLQotTW9uIEZlYiAgMiAxNzoxMzozMSAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdGljMzApOiBEZWNsYXJlLgotCi1UaHUgSmFuIDIyIDE2OjIzOjU5IDE5OTggIEZyZWQgRmlzaCA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogQWRkIGZsYWcgSU5TTl9IQVNfUkVMT0MgdG8gdGVsbCBkaXNhc3NlbWJseQotCWZ1bmN0aW9uIHRoZXJlIGlzIGEgcmVsb2Mgb24gdGhpcyBsaW5lLgotCi1Nb24gRGVjICA4IDExOjIyOjIzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogUmVtb3ZlIHByb3RvdHlwZSBvZiBkaXNhc21fc3ltYWRkcigpIGFzIHRoaXMgZnVuY3Rpb24KLQlubyBsb25nZXIgZXhpc3RzLgotCi1UdWUgRGVjICAyIDEwOjIwOjUzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoZGlzYXNtX3N5bWFkZHIpOiBOZXcgcHJvdG90eXBlLgotCi1Nb24gRGVjICAxIDIwOjI0OjE4IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi9zaC5oIChSX1NIX1NXSVRDSDgpOiBOZXcuCi0KLU1vbiBEZWMgIDEgMTE6Mjk6MzUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suaCAoQ0JfU1lTQ0FMTCk6IENvbW1lbnQgb3V0IGFyZyBuYW1lcyBpbiBwcm90b3R5cGVzLgotCi1XZWQgTm92IDI2IDE2OjQ3OjU4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChDQl9TWVNDQUxMKTogQ29uc2lzdGFudGx5IHVzZSBuYW1lcyBmb3IgcHJvdG90eXBlCi0JYXJndW1lbnRzLgotCi1XZWQgTm92IDI2IDExOjM5OjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKENCX1NZU0NBTEwpOiBDaGFuZ2UgYnl0ZSBjb3VudCBhcmd1bWVudHMgdG8KLQl7cmVhZCx3cml0ZX1fbWVtIHRvIGBpbnQnLiAgTmV3IG1lbWJlciBgbWFnaWMnLgotCShDQl9TWVNDQUxMX01BR0lDLENCX1NZU0NBTExfSU5JVCk6IE5ldyBtYWNyb3MuCi0KLVR1ZSBOb3YgMjUgMDE6MzU6NTIgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKHN0cnVjdCBzdGF0KTogTW92ZSBmb3J3YXJkIGRlY2wgdXAuCi0JKGhvc3RfY2FsbGJhY2spOiBQYXNzIHN0YXQgc3RydWN0IHBvaW50ZXIgdG8gc3RhdCxmc3RhdC4KLQkoQ0JfU1lTX25ubik6IFJlb3JnYW5pemUuCi0JKENCX1NZU0NBTEwpOiBOZXcgbWVtYmVycyBwMSxwMi4KLQkoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IERlbGV0ZSBmb3VydGggYXJnLgotCi1TYXQgTm92IDIyIDIzOjM0OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fc3RvcF9yZWFzb24pOiBDbGFyaWZ5IHNpbV9zaWduYWxsZWQgU0lHUkMKLSAJYXJndW1lbnQuCi0KLU1vbiBOb3YgMTcgMTQ6MDA6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKENCX1RBUkdFVF9ERUZTX01BUCk6IFJlbmFtZWQgZnJvbSB0YXJnZXRfZGVmc19tYXAuCi0JKGhvc3RfY2FsbGJhY2spOiBBZGQgc3RhdCwgZnN0YXQsIHN5c2NhbGxfbWFwLCBlcnJub19tYXAsIG9wZW5fbWFwLAotCXNpZ25hbF9tYXAsIHN0YXRfbWFwLgotCShlcnJuX21hcCxvcGVuX21hcCk6IFJlbmFtZWQgdG8gY2JfaW5pdF9mb29fbWFwLgotCShjYl9ob3N0X3RvX3RhcmdldF9lcnJubyxjYl90YXJnZXRfdG9faG9zdF9vcGVuKTogUmVuYW1lZCBmcm9tCi0JaG9zdF90b190YXJnZXRfZXJybm8sdGFyZ2V0X3RvX2hvc3Rfb3Blbi4KLQkoY2JfcmVhZF90YXJnZXRfc3lzY2FsbF9tYXBzKTogQWRkIHByb3RvdHlwZS4KLQkoY2JfdGFyZ2V0X3RvX2hvc3Rfc3lzY2FsbCk6IExpa2V3aXNlLgotCShjYl9ob3N0X3RvX3RhcmdldF9zdGF0KTogTGlrZXdpc2UuCi0JKGNiX3N5c2NhbGwpOiBMaWtld2lzZS4KLQkoQ0JfU1lTX3tleGl0LG9wZW4sY2xvc2UscmVhZCx3cml0ZSxsc2Vlayx1bmxpbmssZ2V0cGlkLGtpbGwsZnN0YXQsCi0JYXJndmxlbixhcmd2LGNoZGlyLHN0YXQsY2htb2QsdXRpbWUsdGltZX0pOiBEZWZpbmUuCi0JKENCX1NZU0NBTEwpOiBOZXcgdHlwZS4KLQkoQ0JfUkMpOiBOZXcgZW51bS4KLQotRnJpIE5vdiAgNyAxMDozNDowOSAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBBZGQgZXh0ZXJuICJDIiB7IHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggQysrCi0JcHJvZ3JhbXMuCi0JKiByZW1vdGUtc2ltLmg6ICBBZGQgZXh0ZXJuICJDIiB7IHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggQysrCi0JcHJvZ3JhbXMuCi0KLVR1ZSBPY3QgMTQgMTY6MDc6NTEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyk6IE5ldyBmaWVsZAotCSdzeW1ib2xfYXRfYWRkcmVzc19mdW5jJy4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXNlIG5ldyBmaWVsZCB3aXRoCi0JZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcy4KLQotTW9uIE9jdCAxMyAxMDoxNzoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaDogQ2xhcmlmeSBzaW1fcmVhZCwgc2ltX3dyaXRlIE1FTSBhcmd1bWVudC4KLQotV2VkIFNlcCAyNCAxODowMzoxMCAxOTk3ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiYWJ5bG9uLTUuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChTSU1fUkMpOiAgQWRkIGEgYnVuY2ggb2YgbmV3IHJldHVybiBjb2RlcyBmb3IKLQlicmVha3BvaW50IHN0dWZmLgotCSogQWRkIGZ1bmN0aW9ucyB0byB0ZWxsIHRoZSBzaW11bGF0b3IgdG8gc2V0L2NsZWFyL2VuYWJsZS9kaXNhYmxlCi0JaW50cmluc2ljIGJyZWFrcG9pbnRzLgotCi1UaHUgQXVnIDI4IDE5OjQxOjQyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGR1cGFyZ3YpOiBBZGQgcHJvdG90eXBlLgotCi1UdWUgQXVnIDI2IDEyOjI1OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fY3JlYXRlX2luZmVyaW9yKTogQWRkIEFCRkQgYXJnLiBEb2N1bWVudC4KLQotTW9uIEF1ZyAyNSAxMDo1MDo1MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmcuIERvY3VtZW50LgotCi1GcmkgQXVnICA4IDE2OjQzOjU2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoYXJjX2dldF9kaXNhc3NlbWJsZXIpOiBEZWNsYXJlLgotCi1XZWQgSnVsIDMwIDExOjM5OjUwIDE5OTcgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBkZW1hbmdsZS5oIChETUdMX0pBVkEpOiAgTmV3IG9wdGlvbiB0byByZXF1ZXN0IEphdmEgZGVtYW5nbGluZy4KLQotVHVlIEp1bCAyMiAxNzo1OTo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChQRVhFQ1VURV8qKTogRGVmaW5lLgotCShwZXhlY3V0ZSwgcHdhaXQpOiBEZWNsYXJlLgotCi1GcmkgSnVuICA2IDEzOjAyOjMzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fa2lsbCk6IE1hcmsgYXMgZGVwcmVjaWF0ZWQuCi0KLUZyaSBNYXkgMjMgMTM6NDM6NDEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgdGFza19saW5rIG1lbWJlci4KLQotVGh1IE1heSAyMiAxMTozMjo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaDogUmV2aWV3IGRvY3VtZW50YXRpb24uICBDbGFyaWZ5IHJlc3RyaWN0aW9ucyBvbgotIAl3aGVuIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLgotCi1XZWQgTWF5IDIxIDE2OjQ3OjUzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fc2V0X3Byb2ZpbGVfc2l6ZSk6IEFkZCBwcm90b3R5cGUsIGRvY3VtZW50IGFzCi0gCWRlcHJlY2lhdGVkLgotCi1UdWUgTWF5IDIwIDA5OjMyOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBzdHJ1Y3QuCi0JKHNpbV9zZXRfY2FsbGJhY2tzKTogRHJvcCBTSU1fREVTQyBhcmd1bWVudC4gRG9jdW1lbnQuCi0JKHNpbV9zaXplKTogUmVtb3ZlIHJlY2VudGx5IGFkZGVkIFNJTV9ERVNDIGFyZ3VtZW50LiBEb2N1bWVudC4KLQotTW9uIE1heSAxOSAxOToxNDo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaDogUGFzcyBTRCBpbnRvIHNpbV9zaXplLgotCi1UaHUgTWF5IDE1IDAxOjI0OjE2IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5oIChvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbl93aXRoX2FyZywgb2JzdGFja19jaHVua2Z1biwKLQlvYnN0YWNrX2ZyZWVmdW4pOiBFbGltaW5hdGUgY29tcGlsZSB3YXJuaW5ncyBpbiBnZGIuCi0KLVR1ZSBNYXkgMTMgMTA6MjE6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi9hcm0uaCAoY29uc3RhbnRzKTogICBBZGRlZCBuZXcgZmxhZyBiaXRzIEZfQVBDU18yNiBhbmQKLQlGX0FQQ1NfU0VUIGZvciB0aGUgZl9mbGFncyBmaWVsZCBvZiB0aGUgZmlsZWhkciBzdHJ1Y3R1cmUuICBBZGRlZCBuZXcKLQlmbGFnczogRl9BUENTMjYsIEZfQVJNXzIsIEZfQVJNXzMsIEZfQVJNXzcsIEZfQVJNXzdUIHRvIHN0b3JlCi0JaW5mb3JtYXRpb24gaW4gdGhlIGZsYWdzIGZpZWxkIG9mIHRoZSBpbnRlcm5hbF9mIHN0cnVjdHVyZSB1c2VkIGJ5IEJGRAotCXJvdXRpbmVzLgotCi1UdWUgQXByIDIyIDEwOjI0OjM0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBmbG9hdGZvcm1hdC5oIChmbG9hdGZvcm1hdF9ieXRlb3JkZXJzKTogQWRkIGNvbW1lbnRzIGZvciBwcmV2aW91cwotCWZvcm1hdHMgYW5kIGFkZCBmbG9hdGZvcm1hdF9saXR0bGVieXRlX2JpZ3dvcmQsIHByaW1hcmlseSBmb3IgQVJNLgotCUFkZCBkZWNsYXJhdGlvbiBmb3IgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkLgotCi1GcmkgQXByIDE4IDEzOjA0OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fc3RvcCk6IE5ldyBpbnRlcmZhY2UgLSBhc3luY2hyb25vdXMKLSAJbm90aWZpY2F0aW9uIG9mIGEgcmVxdWVzdCB0byBzdG9wIC8gc3VzcGVuZCB0aGUgcnVubmluZwotIAlzaW11bGF0aW9uLgotCi0JKiByZW1vdGUtc2ltLmggKGVudW0gc2ltX3N0b3ApOiBBZGQgc2ltX3J1bm5pbmcgYW5kIHNpbV9wb2xsaW5nIGFzCi0gCXN0YXRlcyBmb3IgdXNlIGludGVybmFsIHRvIHNpbXVsYXRvcnMuCi0KLQkqIGNhbGxiYWNrLmggKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnV0KTogUHV0IGEgbWFnaWMgbnVtYmVyIGF0Ci0gCXRoZSBlbmQgb2YgdGhlIHN0cnVjdCB0byBhbGxvdyBiYXNpYyBjaGVja2luZy4KLQkoc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICk6IEFkZCBwb2xsX3F1aXQgLSBzbwotIAl0aGF0IHRoZSBjb25zb2xlIGV0YyBjYW4gYmUgcG9sbGVkIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzLgotCi1UaHUgQXByIDE3IDAyOjE3OjEyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc3RydWN0IF9iZmQpOiBEZWNsYXJlLgotCShzaW1fbG9hZCk6IFJldHVybiBTSU1fUkMuICBOZXcgYXJnIGBhYmZkJy4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgYXJnIGBzdGFydF9hZGRyZXNzJy4KLQotV2VkIEFwciAgMiAxNzowOToxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fdHJhY2UsIHNpbV9zaXplKTogTWFrZSB0aGVzZSBnbG9iYWwuICBUaGV5Ci0gCXdpbGwgZ28gYXdheSBzaG9ydGx5LgotCi1XZWQgQXByICAyIDE1OjIzOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoU0lNX09QRU5fS0lORCwgU0lNX1JDKTogTmV3IGVudW1zLgotCShzaW1fb3Blbik6IE5ldyBhcmd1bWVudCBga2luZCcuCi0KLVdlZCBBcHIgIDIgMTQ6NDU6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLUZyaSBNYXIgMjggMTU6Mjk6NTQgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKHRvcCBsZXZlbCk6IEluY2x1ZGUgc3RkYXJnLmggb3IgdmFyYXJncy5oIGlmCi0JdmFfc3RhcnQgaXMgbm90IGRlZmluZWQuCi0JKGhvc3RfY2FsbGJhY2tfc3RydWN0KTogTWFrZSB7LGV9dnByaW50Zl9maWx0ZXJlZCB0YWtlIGEgdmFfbGlzdAotCWluc3RlYWQgb2Ygdm9pZCAqLCBzaW5jZSB2YV9saXN0IG1pZ2h0IGJlIGFuIGFycmF5IG9yIHN0cnVjdHVyZQotCXR5cGUuCi0KLUZyaSBNYXIgMjggMTU6NDQ6NDEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQWRkIHByb3RvdHlwZSBmb3IgZ2xpYmMgYW5kIGxpbnV4LgotCi1Nb24gTWFyIDE3IDE5OjIyOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqYWxsb2MuaDogTmV3IGZpbGUuCi0KLU1vbiBNYXIgMTcgMTQ6NTc6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaDogTmV3IGZpbGUsIGNvcGllZCBpbiBmcm9tIGdkYi9yZW1vdGUtc2ltLmguICBPbmUKLSAJZGF5IHRoaXMgd2lsbCBiZSBwbGFjZWQgaW4gYSBkaXJlY3Rvcnkgb2YgaXRzIG93bi4KLQotU2F0IE1hciAxNSAxOTowMDoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suaDogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb24uCi0KLVRodSBNYXIgIDYgMTU6NDY6NTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCk6IEFkZCBjYWxsYmFja3MgLQotIAlmbHVzaF9zdGRvdXQsIHdyaXRlX3N0ZGVyciwgZmx1c2hfc3RkZXJyLCB2cHJpbnRmX2ZpbHRlcmVkLAotIAlldnByaW50Zl9maWx0ZXJlZC4gIERlbGV0ZSByZWR1bmRhbnQgY2FsbGJhY2tzIC0gcHJpbnRmX2ZpbHRlcmVkLgotCi1UaHUgRmViIDI3IDIzOjE4OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IFJlbW92ZSBscHJlZml4IGFuZCBscHJlZml4X2xlbgotCWZpZWxkcy4KLQotVHVlIEZlYiAyNSAwMDoxMDo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplCi0JYnl0ZXNfcGVyX2NodW5rIGFuZCBkaXNwbGF5X2VuZGlhbi4KLQotTW9uIEZlYiAyNCAxNzo0NzowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwcik6IERlZmluZS4KLQkoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzKTogRGVmaW5lLgotCShzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUpOiBEZWZpbmUuCi0KLVRodSBGZWIgIDYgMTQ6MjA6MDEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogKGRpc2Fzc2VtYmxlX2luZm8pOiAgQWRkIG5ldyBmaWVsZHMKLQlieXRlc19wZXJfY2h1bmsgYW5kIGRpc3BsYXlfZW5kaWFuIHRvIGNvbnRyb2wgdGhlCi0JZGlzcGxheSBvZiByYXcgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgRGVjIDI3IDIyOjE3OjM3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdGljODApOiBEZWNsYXJlLgotCi1TdW4gRGVjICA4IDE3OjExOjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKGhvc3RfY2FsbGJhY2spOiBOZXcgbWVtYmVyIGBlcnJvcicuCi0KLVdlZCBOb3YgMjAgMDA6NDA6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suaDogTmV3IGZpbGUsIG1vdmVkIGhlcmUgZnJvbSBnZGIuCi0KLU1vbiBOb3YgMTggMTY6MzQ6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogQ2hlY2tpbiBhZ2FpbjsgbGFzdCBjaGVja2luIGZhaWxlZCBkdWUgdG8gc3RpY2t5IHRhZy4KLQotV2VkIE5vdiAxMyAwODoyMjowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBSZXZlcnQgbGFzdCBjb21taXQgZHVlIHRvIGNvbmZsaWN0cyB3aXRoIGhwdXgKLQlzeXN0ZW0gaGVhZGVycy4KLQotVHVlIE5vdiAxMiAxNjozMTowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBNb3ZlIHByb3RvdHlwZXMgZnJvbSBhcmd2LmMgaGVyZS4KLQotVGh1IE9jdCAzMSAxNDo1NjoxOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhbnNpZGVjbC5oIChWUEFSQU1TLFZBX1NUQVJUKTogRGVmaW5lLgotCi1GcmkgT2N0IDI1IDEyOjA4OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogQWRkIGJ5dGVzX3Blcl9saW5lIGZpZWxkLgotCShJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSCk6IEluaXRpYWxpemUgYnl0ZXNfcGVyX2xpbmUgZmllbGQuCi0KLVRodSBPY3QgMjQgMTc6MTA6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGRpc2Fzc2VtYmxlX2luZm8pOiBBZGQgc3ltYm9sIGZpZWxkLgotCShJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSCk6IEluaXRpYWxpemUgc3ltYm9sIGZpZWxkLgotCi1UaHUgT2N0IDE3IDExOjE3OjQwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9tMzJyKTogRGVjbGFyZS4KLQotTW9uIE9jdCAxNCAyMzo1Njo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBEZWNsYXJlIHBhcmFtZXRlciB0eXBlcyBmb3IgeG1hbGxvYyBhbmQgeHJlYWxsb2MuCi0KLVRodSBPY3QgIDMgMTM6NDU6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmg6IE5ldyBmaWxlLgotCi1UaHUgT2N0ICAzIDEwOjMzOjE0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX21uMTB4MDApOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKHByaW50X2luc25fbW4xMDIwMCwgcHJpbnRfaW5zbl9tbjEwMzAwKTogRGVjbGFyZS4KLQotV2VkIE9jdCAgMiAyMToyNDo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9tbjEweDAwKTogRGVjbGFyZS4KLQotTW9uIFNlcCAzMCAxMzo1NjoxMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5Lmg6IFJlbW92ZSAjaWZuZGVmIFBSSVZBVEVfWE1BTExPQy4KLQotU2F0IEF1ZyAzMSAxMzoyNzowNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl92ODUwKTogRGVjbGFyZS4KLQotVHVlIEF1ZyAxMyAxNjoxMDozMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6ICBDaGFuZ2UgYmNvcHkgdG8gbWVtY3B5LiAgV29ya3MgYmV0dGVyIG9uIFBvc2l4Ci0Jc3lzdGVtcywgd2hpY2ggZ2VuZXJhbGx5IGxhY2sgYmNvcHkuCi0KLU1vbiBBdWcgMTIgMTc6MDM6MTggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogIENoYW5nZSBXSU4zMiB0byBfV0lOMzIuCi0KLUZyaSBKdWwgMjYgMTM6NTg6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBmbGF2b3VyIGZpZWxkLgotCShwcmludF9pbnNuX2FscGhhKTogRGVjbGFyZS4KLQkocHJpbnRfaW5zbl9hbHBoYV9vc2YsIHByaW50X2luc25fYWxwaGFfdm1zKTogRG9uJ3QgZGVjbGFyZS4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogSW5pdGlhbGl6ZSBmbGF2b3VyIGZpZWxkLgotCi1UdWUgSnVsIDIzIDE3OjM3OjU4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoUFJJVkFURV9YTUFMTE9DKTogRW5jbG9zZSB4bWFsbG9jL3hyZWFsbG9jCi0JZGVmaW5pdGlvbnMgaW5zaWRlICNpZm5kZWYgc28gdGhhdCBwcm9ncmFtcyB0aGF0IHdhbnQgdG8KLQljYW4gZGVmaW5lIFBSSVZBVEVfWE1BTExPQyBhbmQgdGhlbiBkZWZpbmUgeG1hbGxvYyBhbmQKLQl4cmVhbGxvYyBhbnl3YXkgdGhleSB3YW50LgotCShiYXNlbmFtZSk6IERvY3VtZW50IGluIHNvdXJjZSB0aGF0IHdlIGNhbid0IGRlY2xhcmUgdGhlCi0gCXBhcmFtZXRlciB0eXBlIGJlY2F1c2UgaXQgaXMgZGVjbGFyZWQgaW5jb25zaXN0ZW50bHkgYWNyb3NzCi0JZGlmZmVyZW50IHN5c3RlbXMuCi0KLU1vbiBKdWwgMjIgMTM6MTY6MTMgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9hbHBoYSk6IERvbid0IGRlY2xhcmUuCi0JKHByaW50X2luc25fYWxwaGFfb3NmLCBwcmludF9pbnNuX2FscGhhX3Ztcyk6IERlY2xhcmUuCi0KLVdlZCBKdWwgMTcgMTQ6NDU6MTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogKHByaW50X2luc25fZDEwdik6IERlY2xhcmUuCi0KLU1vbiBKdWwgMTUgMTY6NTU6MzggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiAgR2V0IHJpZCBvZiBkZWNscyBmb3IgcHJpbnRfaW5zbl9pODA4NiwKLQlwcmludF9pbnNuX3NwYXJjNjQgYW5kIHByaW50X2luc25fc3BhcmNsaXRlLgotCSogKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6ICBTcGxpdCBpbnRvIHR3byBwaWVjZXMuICBPbmUsCi0JSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0ggaW5pdHMgZXZlcnl0aGluZyBleGNlcHQgZm9yIGVuZGlhbiwKLQltYWNoLCBhbmQgYXJjaC4KLQotRnJpIEp1bCAxMiAxMDoxOToyNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faTgwODYpOiAgRGVjbGFyZS4KLQotV2VkIEp1bCAgMyAxNjowMjozOSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fc3BhcmNsaXRlKTogIERlY2xhcmUuCi0KLVR1ZSBKdW4gMTggMTY6MDI6NDYgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9oODMwMHMpOiBEZWNsYXJlLgotCi1UdWUgSnVuIDE4IDE1OjExOjMzIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBmb3Blbi12bXMuaDogTmV3IGZpbGUuCi0KLVR1ZSBKdW4gIDQgMTg6NTg6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIG5vdGljZV9hbGwgZmllbGQuCi0KLUZyaSBBcHIgMjYgMTA6MzM6MTIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaCAoI2lmZGVmIElOX0dDQyk6ICNpbmNsdWRlICJnYW5zaWRlY2wuaCIuCi0JKFBST1RPLFBUUixjb25zdCk6IERlbGV0ZS4KLQotTW9uIEFwciAyMiAxNzoyNzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgdHJhZGl0aW9uYWxfZm9ybWF0IGZpZWxkLgotCi1Nb24gQXByIDE1IDE1OjE2OjU2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChjaG9vc2VfdGVtcF9iYXNlKTogQWRkIHByb3RvdHlwZS4KLQotVHVlIE1hciAxMiAxNzoyOTo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCk6IERlY2xhcmUuCi0JKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHdyYXBfaGFzaCBmaWVsZC4KLQotV2VkIEZlYiAxNCAxNjo0OToxNyAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBpZWVlLmggKGllZWVfcmVjb3JkX2VudW1fdHlwZSk6IERlZmluZQotCWllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2luZm9fZW51bS4KLQotRnJpIEZlYiAgMiAxNzowOToyNSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChESVNBU01fUkFXX0lOU04pOiBEZWxldGUuCi0KLVR1ZSBKYW4gMjMgMDk6MjE6NDcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoSU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogU2V0IGVuZGlhbiB0byBCRkRfRU5ESUFOX1VOS05PV04uCi0JTmV3IGFyZ3VtZW50IEZQUklOVEZfRlVOQy4KLQotTW9uIEphbiAyMiAxNjozNzo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogTmV3IG1lbWJlcnMgYXJjaCwgbWFjaCwgZW5kaWFuLgotCShJTklUX0RJU0FTU0VNQkxFX0lORk8pOiBJbml0aWFsaXplIHRoZW0uCi0JKERJU0FTTV9SQVdfSU5TTnssRkxBR30pOiBEZWZpbmUuCi0KLVRodSBKYW4gMTggMTE6MzI6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkZW1hbmdsZS5oIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBDaGFuZ2Ugb3BuYW1lIHBhcmFtZXRlciB0bwotCWNvbnN0IGNoYXIgKi4KLQkoY3BsdXNfbWFuZ2xlX29wbmFtZSk6IENoYW5nZSByZXR1cm4gdHlwZSBhbmQgb3BuYW1lIHBhcmFtZXRlciB0bwotCWNvbnN0IGNoYXIgKi4KLQotRnJpIEphbiAgNSAwMDowMToyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuaCAoZW51bSBpZWVlX3JlY29yZCk6IEFkZCBpZWVlX2Fzbl9yZWNvcmRfZW51bSwKLQlpZWVlX2F0X3JlY29yZF9lbnVtLCBpZWVlX3R5X3JlY29yZF9lbnVtLCBpZWVlX2F0bl9yZWNvcmRfZW51bSwKLQlpZWVlX2JiX3JlY29yZF9lbnVtLCBhbmQgaWVlZV9iZV9yZWNvcmRfZW51bS4KLQotV2VkIEphbiAgMyAxMzoxMjowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5oOiBVcGRhdGUgY29weXJpZ2h0IHRvIDE5OTYuCi0JKF9vYnN0YWNrX21lbW9yeV91c2VkKTogRGVjbGFyZS4KLQkob2JzdGFja19tZW1vcnlfdXNlZCk6IERlZmluZSBtYWNyby4KLQotVGh1IERlYyAyOCAxMTo0MjoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oICh4c3RyZHVwKTogRGVjbGFyZS4KLQotVGh1IERlYyAyMSAxNDo0NzoxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHdhaXQuaDogUHJvdGVjdCBhbGwgbWFjcm9zIHdpdGggI2lmbmRlZi4KLQotVHVlIE9jdCAyNCAyMTo0NTo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgc3RhdGljX2xpbmsgZmllbGQuCi0KLVR1ZSBTZXAgMTIgMTY6Mjg6MDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBBZGQgc3ltYm9sIHBhcmFtZXRlciB0bwotCXdhcm5pbmcgY2FsbGJhY2suCi0KLUZyaSBTZXAgIDEgMTM6MTE6NTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBDaGFuZ2Ugd2FybmluZyBjYWxsYmFjawotCXRvIHRha2UgQkZELCBzZWN0aW9uLCBhbmQgYWRkcmVzcyBhcmd1bWVudHMuCi0KLVRodSBBdWcgMzEgMTY6NDU6MTIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IFJlbW92ZSBQRSBzdHVmZi4KLQotVHVlIEF1ZyAyMiAwMzoxODoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBEZWNsYXJlIHhzdHJlcnJvci4gIEZyb20gUGF0IFJhbmtpbi4KLQotTW9uIEF1ZyAyMSAxODoxMTozNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogUmVtb3ZlIFBFIHN0dWZmLgotCi1XZWQgQXVnICAyIDA4OjE0OjEyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9zcGFyYzY0KTogRGVjbGFyZS4KLQotTW9uIEp1bCAxMCAxMzoyNjo0OSAxOTk1ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYWliLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBuZXcgZmllbGQgc3ltYm9saWMuCi0KLVN1biBKdWwgIDIgMTc6NDg6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQ2hhbmdlIHR5cGUgb2YgYmFzZV9maWxlIHRvCi0JUFRSLgotCi1UaHUgSnVuIDI5IDAwOjAyOjQ1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGRlZCBiYXNlX2ZpbGUgbWVtYmVyLgotCi1UdWUgSnVuIDIwIDE2OjQwOjA0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGFuc2lkZWNsLmg6IHdpbjMycyBpcyBBTlNJIGVub3VnaC4KLQotVGh1IE1heSAxOCAwNDoyNTo1MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fYXJtKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShwcmludF9pbnNuX3tsaXR0bGUsYmlnfV9hcm0pOiBOZXcgZGVjbGFyYXRpb25zLgotCi0JKiBmbG9hdGZvcm1hdC5oIChmbG9hdGZvcm1hdF9hcm1fZXh0KTogRGVjbGFyZS4KLQotU2F0IE1heSAxMyAxMDoxNDowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmL3BlLmg6IE5ldyBmaWxlLgotCSogYmZkbGluay5oIChzdWJzeXRlbSwgc3RhY2tfaGVhcF9wYXJhbWV0ZXJzKTogTmV3LgotCSogY29mZi9pMzg2LmggKE5UX1NFQ1RJT05fQUxJR05NRU5ULCBOVF9GSUxFX0FMSUdOTUVOVCwKLQlOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IE5ldy4KLQkqIGNvZmYvaW50ZXJuYWwuaCAoaW50ZXJuYWxfZmlsZWhkcik6ICBOZXcgZmllbGRzIGZvciBQRS4KLQkoSU1BR0VfREFUQV9ESVJFQ1RPUlkpOiBOZXcuCi0JKGludGVybmFsX2FvdXRoZHIpOiBOZXcgZmllbGRzIGZvciBQRS4KLQotVGh1IE1heSAgNCAxNDozNjo0MiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaDogRG9uJ3QgaW5jbHVkZSBhbnNpZGVjbC5oIGlmIElOX0dDQy4KLQotVHVlIEZlYiAyMSAwMDozNzoyOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHAtc3ltdGFiLmg6IERvbid0IHVzZSBiaXRmaWVsZCBlbnVtZXJhdGlvbnMsIHRoZSBIUCBDIGNvbXBpbGVyCi0JZG9lcyBub3QgaGFuZGxlIHRoZW0gY29ycmVjdGx5LgotCi1UaHUgRmViICA5IDE0OjIwOjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXIgdHlwZTsgc29tZQotCXN5c3RlbXMgaGF2ZSB0aGlzIGluIHRoZWlyIGhlYWRlciBmaWxlcy4KLQotV2VkIEZlYiAgOCAxNzozNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgZm9ybWF0IG9mIGNvbW1vbgotCXN5bWJvbCBpbmZvcm1hdGlvbiwgdG8gcmVtb3ZlIHJlc3RyaWN0aW9ucyBvbiBtYXhpbXVtIHNpemUgYW5kCi0JYWxpZ25tZW50IHBvd2VyLCBieSB1c2luZyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgaW5zdGVhZC4KLQotTW9uIEZlYiAgNiAxNDo1NTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoZW51bSBiZmRfbGlua19oYXNoX3R5cGUpOiBSZW5hbWUgYmZkX2xpbmtfaGFzaF93ZWFrCi0JdG8gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsuICBBZGQgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLgotCi1Nb24gSmFuIDE2IDIxOjAwOjIzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChHREJfSU5JVF9ESVNBU1NFTUJMRV9JTkZPLCBldGMpOiBSZW1vdmUgYWxsCi0JR0RCLXNwZWNpZmljIGRlZmluaXRpb25zLgotCi1TdW4gSmFuIDE1IDE4OjM5OjM1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdzY1KTogRGVjbGFyZS4KLQotVGh1IEphbiAxMiAxNzo1MToxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoaGV4X3ApOiBGaXggc2Vuc2Ugb2YgdGVzdC4KLQotV2VkIEphbiAxMSAyMjozNjo0MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoX2hleF9hcnJheV9zaXplLCBfaGV4X2JhZCwgX2hleF92YWx1ZSwgaGV4X2luaXQsCi0JaGV4X3AsIGhleF92YWx1ZSk6IE5ldyBtYWNyb3MgYW5kIGRlY2xhcmF0aW9ucywgZm9yIGhleC5jLgotCi1GcmkgSmFuICA2IDE3OjQ0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oOiBNYWtlIGlkZW1wb3RlbnQuCi0KLVdlZCBEZWMgMTQgMTM6MDg6NDMgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBwcm9ncmVzcy5oOiBOZXcgZmlsZSwgZW1wdHkgZGVmaW5pdGlvbnMgZm9yIHByb2dyZXNzIG1hY3Jvcy4KLQotRnJpIE5vdiAyNSAwMDoxNDowNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHAtc3ltdGFiLmg6IE5ldyBmaWxlIGRlc2NyaWJpbmcgdGhlIGRlYnVnIHN5bWJvbHMgZW1pdHRlZAotCWJ5IHRoZSBIUCBDIGNvbXBpbGVycy4KLQotRnJpIE5vdiAxMSAxNTo0ODozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgdS5jLnNpemUgZnJvbSAyNAotCXRvIDI2IGJpdHMsIGFuZCBjaGFuZ2UgdS5jLmFsaWdubWVudF9wb3dlciBmcm9tIDggdG8gNiBiaXRzLiAgNgotCWJpdCBpbiB0aGUgYWxpZ25tZW50IHBvd2VyIGlzIGVub3VnaCBmb3IgYSA2NCBiaXQgYWRkcmVzcyBzcGFjZS4KLQotTW9uIE9jdCAzMSAxMzowMjo1MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmggKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBEZWNsYXJlLgotCi1UdWUgT2N0IDI1IDExOjM4OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogRml4IGNvbW1lbnRzIGZvcgotCW11bHRpcGxlX2NvbW1vbiBmaWVsZC4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBhb3V0L2FvdXQ2NC5oOiBPbmx5IGRlZmluZSBRTUFHSUMgaWYgaXQgaXNuJ3QgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBkaXMtYXNtLmg6IEFkZCBzdXBwb3J0IGZvciB0aGUgQVJNLgotCi1XZWQgQXVnIDEwIDEyOjUxOjQxIDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oIChzdHJzaWduYWwpOiBEb2N1bWVudCBpdHMgZXhpc3RlbmNlIGV2ZW4gaWYgd2UKLQljYW4ndCBkZWNsYXJlIGl0LgotCi1UdWUgQXVnICAyIDE0OjQwOjAzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBvczlrLmg6IFJlbW92ZSB1X2ludDE2LCB1X2ludDMyLCBhbmQgb3duZXJfaWQgdHlwZWRlZnMgYW5kCi0JZXhwYW5kIHRoZWlyIHVzZXMuICBUaG9zZSBuYW1lcyBjb25mbGljdCB3aXRoIE1hY2ggaGVhZGVycy4KLQotRnJpIEp1bCAyMiAxNDoxNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgdS5jLnNpemUgaW50byBhCi0JYml0ZmllbGQuICBBZGQgZmllbGQgdS5jLmFsaWdubWVudF9wb3dlci4KLQotU3VuIEp1bCAxMCAwMDoyNjozOSAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogZGlzLWFzbS5oOiBBZGQgcHJpbnRfaW5zbl9uczMyayBkZWNsYXJhdGlvbi4KLQotTW9uIEp1biAyMCAxNzoxMzoyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoYmZkX2xpbmtfaGFzaF90YWJsZSk6IE1ha2UgY3JlYXRvciBhIGNvbnN0IHBvaW50ZXIuCi0KLVNhdCBKdW4gMTggMTY6MDk6MzIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBEZWNsYXJlLgotCi1UaHUgSnVuIDE2IDE1OjE5OjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBuZXcgZmllbGQgc2hhcmVkLgotCi1Nb24gSnVuICA2IDE0OjM5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSk6IFJlbW92ZSB3cml0dGVuIGZpZWxkOgotCW5vdCBuZWVkZWQgZm9yIGFsbCBiYWNrZW5kcy4KLQotVGh1IEFwciAyOCAxOTowNjo1MCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKGRpc2Fzc2VtYmxlcik6IERlY2xhcmUuCi0KLUZyaSBBcHIgIDEgMDA6Mzg6MTcgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBtb2xlLmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogb2JzdGFjay5oOiBEZWxldGUgdXNlIG9mIElOX0dDQyB0byBjb250cm9sIHdoZXRoZXIKLSAgICAgICAgc3RkZGVmLmggb3IgZ3N0ZGRlZi5oIGlzIGluY2x1ZGVkLgotCi1UdWUgTWFyIDIyIDEzOjA2OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUpOiBBZGQgYmZkX2RhdGFfbGlua19vcmRlci4KLQkoc3RydWN0IGJmZF9saW5rX29yZGVyKTogQWRkIGRhdGEgZmllbGQgdG8gdW5pb24uCi0KLU1vbiBNYXIgMjEgMTg6NDU6MjYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBDaGFuZ2UgYml0c2l6ZSBhcmd1bWVudAotCXRvIGFkZF90b19zZXQgdG8gcmVsb2MuICBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudCBmcm9tIGNvbnN0cnVjdG9yLgotCUNvbW1lbnQgdGhhdCByZWxvY19vdmVyZmxvdywgcmVsb2NfZGFuZ2Vyb3VzIGFuZCB1bmF0dGFjaGVkX3JlbG9jCi0JbXVzdCBoYW5kbGUgTlVMTCBwb2ludGVycyBmb3IgcmVsb2MgbG9jYXRpb24uCi0JKGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSk6IEFkZCBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIGFuZAotCWJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlci4KLQkoc3RydWN0IGJmZF9saW5rX29yZGVyKTogQWRkIHJlbG9jIGZpZWxkIHRvIHVuaW9uLgotCShzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MpOiBEZWZpbmUuCi0KLU1vbiBNYXIgMTQgMTI6Mjc6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0Lmg6IFJlbW92ZWQ7IG5vIGxvbmdlciB1c2VkLgotCi1UdWUgTWFyICAxIDE4OjEwOjQ5IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIG9zOWsuaDogb3M5MDAwIHRhcmdldCBzcGVjaWZpYyBoZWFkZXIgZmlsZSwgdGhlIGhlYWRlciBvZiB0aGUKLQlvYmplY3QgZmlsZSBpcyB1c2VkIG5vdy4KLQotU3VuIEZlYiAyNyAyMTo1MjoyNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuaDogTmV3IGZpbGUsIGludGVuZGVkIHRvIHJlcGxhY2UgaWVlZS1mbG9hdC5oLgotCi1TdW4gRmViIDIwIDE3OjE1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oIChBTlNJX1BST1RPVFlQRVMpOiBEZWZpbmUgaWYgdXNpbmcgQU5TSSBwcm90b3R5cGVzLgotCi1XZWQgRmViIDE2IDAxOjA3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliaWJlcnR5Lmg6IERvbid0IGRlY2xhcmUgc3Ryc2lnbmFsLCB0byBhdm9pZCBjb25mbGljdHMgd2l0aAotCVNvbGFyaXMgc3lzdGVtIGhlYWRlciBmaWxlcy4KLQotU2F0IEZlYiAxMiAyMjoxMTozMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliaWJlcnR5LmggKHhleGl0KTogVXNlIF9fdm9sYXRpbGVfXyB0byBhdm9pZCBsb3NpbmcgaWYKLQljb21waWxpbmcgd2l0aCBnY2MgLXRyYWRpdGlvbmFsLgotCi1UaHUgRmViIDEwIDE0OjA1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGliaWJlcnR5Lmg6IE5ldyBmaWxlLiAgRGVjbGFyZXMgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5Ci0JbGliaWJlcnR5LgotCi1UdWUgRmViICA4IDA1OjE5OjUyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUhhbmRsZSBvYnN0YWNrX2NodW5rX2FsbG9jIHJldHVybmluZyBOVUxMLiAgVGhpcyBhbGxvd3MKLQlvYnN0YWNrcyB0byBiZSB1c2VkIGJ5IGxpYnJhcmllcywgd2l0aG91dCBmb3JjaW5nIHRoZW0KLQl0byBjYWxsIGV4aXQgb3IgbG9uZ2ptcC4KLQkqIG9ic3RhY2suaCAoc3RydWN0IG9ic3RhY2spOiBBZGQgYWxsb2NfZmFpbGVkIGZsYWcuCi0JX29ic3RhY2tfYmVnaW4sIF9vYnN0YWNrX2JlZ2luXzEpOiBEZWNsYXJlIHRvIHJldHVybiBpbnQsIG5vdCB2b2lkLgotCShvYnN0YWNrX2ZpbmlzaCk6IElmIGFsbG9jX2ZhaWxlZCwgcmV0dXJuIE5VTEwuCi0JKG9ic3RhY2tfYmFzZSwgb2JzdGFja19uZXh0X2ZyZWUsIG9ianN0YWNrX29iamVjdF9zaXplKToKLQlJZiBhbGxvY19mYWlsZWQsIHJldHVybiAwLgotCShvYnN0YWNrX2dyb3csIG9ic3RhY2tfZ3JvdzAsIG9ic3RhY2tfMWdyb3csIG9ic3RhY2tfcHRyX2dyb3csCi0Jb2JzdGFja19pbnRfZ3Jvdywgb2JzdGFja19ibGFuayk6IElmIGFsbG9jX2ZhaWxlZCwgZG8gbm90aGluZyB0aGF0Ci0JY291bGQgY29ycnVwdCB0aGUgb2JzdGFjay4KLQotTW9uIEphbiAyNCAxNTowNjowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEFkZCBuYW1lLCByZWxvY19uYW1lIGFuZAotCWFkZGVuZCBhcmdtZW50cyB0byByZWxvY19vdmVyZmxvdyBjYWxsYmFjay4KLQotRnJpIEphbiAyMSAxOToxMzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9iaWdfcG93ZXJwYywgcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYywKLQlwcmludF9pbnNuX3JzNjAwMCk6IERlY2xhcmUuCi0KLVRodSBKYW4gIDYgMTQ6MTU6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBBZGQgYml0c2l6ZSBhcmd1bWVudCB0bwotCWFkZF90b19zZXQgZmllbGQuICBBZGQgbmV3IGNhbGxiYWNrIG5hbWVkIGNvbnN0cnVjdG9yLgotCi1UaHUgRGVjIDMwIDEwOjQ0OjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaDogTmV3IGZpbGUgZm9yIG5ldyBCRkQgbGlua2VyIGJhY2tlbmQgcm91dGluZXMuCi0KLU1vbiBOb3YgMjkgMTA6NDM6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKGVudW0gZGlzX2luc25fdHl1cGUpOiBSZW1vdmUgbm9uLUFOU0kgdHJhaWxpbmcgY29tbWEuCi0KLVNhdCBPY3QgIDIgMjA6NDI6MjYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogTW92ZSBjb21tZW50IHRvIHJpZ2h0IHBsYWNlLgotCi1Nb24gQXVnICA5IDE5OjAzOjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oIChvYnN0YWNrX2NodW5rZnVuLCBvYnN0YWNrX2ZyZWVmdW4pOiBBZGQgZGVmbnMgZnJvbQotCXByZXZpb3VzIHZlcnNpb24uICBBcmUgdGhlc2UgQ3lnbnVzIGxvY2FsIGNoYW5nZXM/Ci0KLUZyaSBBdWcgIDYgMTc6MDU6NDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaCwgb2JzdGFjay5oOiBVcGRhdGUgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi1Nb24gQXVnICAyIDE2OjM3OjE0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYvaTM4Ni5oOiAgQWRkIEx5bnggbWFnaWMgbnVtYmVyLgotCi1Nb24gQXVnICAyIDE0OjQ1OjI5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6ICBNb3ZlIGVudW0gb3V0c2lkZSBvZiBzdHJ1Y3QgZGVmbiB0byBhdm9pZCB3YXJuaW5ncy4KLQotTW9uIEF1ZyAgMiAwODo0OTozMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiB3YWl0LmggKFdFWElUU1RBVFVTLCBXU1RPUFNJRyk6IE1hc2sgZG93biB0byA4IGJpdHMuICBUaGlzIGlzCi0JZm9yIHN5c3RlbXMgdGhhdCBzdG9yZSBzdHVmZiBpbnRvIHRoZSBoaWdoIDE2IGJpdHMgb2YgYSB3YWl0Ci0Jc3RhdHVzLgotCi1GcmkgSnVsIDMwIDE4OjM4OjAyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6ICBBZGQgbmV3IGZpZWxkcyBpbnNuX2luZm9fdmFsaWQsIGJyYW5jaF9kZWxheV9pbnNucywKLQlkYXRhX3NpemUsIGluc25fdHlwZSwgdGFyZ2V0LCB0YXJnZXQyLiAgVGhlc2UgYXJlIHVzZWQgdG8gcmV0dXJuCi0JaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgYmFjayB0byB0aGUgY2FsbGluZwotCXByb2dyYW0uICBBZGQgY29tbWVudHMsIG1ha2UgbW9yZSByZWFkYWJsZS4KLQotTW9uIEp1bCAxOSAyMjoxNDoxNCAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtOiAgTmV3IGRpcmVjdG9yeSBjb250YWluaW5nIE5MTS9OZXRXYXJlIGluY2x1ZGVzLgotCi1UaHUgSnVsIDE1IDEyOjEwOjA0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyk6IE5ldyBmaWVsZCBhcHBsaWNhdGlvbl9kYXRhLgotCi1UaHUgSnVsIDE1IDEyOjQxOjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBBZGRlZCBkZWNsYXJhdGlvbiBvZiBwcmludF9pbnNuX204OGsuCi0KLVRodSBKdWwgIDggMDk6MDU6MjYgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogb3Bjb2RlL2g4MzAwLmg6IExvdHMgb2YgbGl0dGxlIGZpeGVzIGZvciB0aGUgaDgvMzAwaC4KLQotRnJpIEp1bCAgMiAxMDozMTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6IFVzZSBBTlNJIG1hY3JvcyBpZiBfX21pcHMgYW5kIF9TWVNUWVBFX1NWUjQgYXJlCi0JZGVmaW5lZCwgc2luY2UgUklTQy9PUyBjYyBoYW5kbGVzIEFOU0kgZGVjbGFyYXRpb25zIGluIFNWUjQgbW9kZQotCWJ1dCBkb2VzIG5vdCBkZWZpbmUgX19TVERDX18uCi0KLVN1biBKdW4gMjAgMTg6Mjc6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogRG9uJ3QgbmVlZCB0byBpbmNsdWRlIGFuc2lkZWNsLmggYW55IG1vcmUuCi0KLUZyaSBKdW4gMTggMDM6MjI6MTAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9hc3lzLmg6ICBFbGltaW5hdGUgImludDhfdHlwZSIsICJpbnQxNl90eXBlIiwgImludDMyX3R5cGUiLCBhbmQKLQl0aGVpciB2YXJpYW50cy4gIFRoZXNlIGNoYW5nZXMgYXJlIGNvb3JkaW5hdGVkIHdpdGggY29ycmVzcG9uZGluZwotCWNoYW5nZXMgaW4gLi4vYmZkL29hc3lzLmMuCi0KLVdlZCBKdW4gMTYgMTA6NDM6MDggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgTm90ZSB0aGF0IGl0IGhhcyBiZWVuIHJlbW92ZWQuCi0KLVR1ZSBKdW4gIDggMTI6MTY6MDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSBTdXBwb3J0IGZvciBIOC8zMDAtSAotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2g4MzAwLCBwcmludF9pbnNuX2g4MzAwaCk6IERlY2xhcmUgaXQuCi0JKiBjb2ZmL2g4MzAwLmg6IE5ldyBtYWdpYyBudW1iZXIuCi0JKiBjb2ZmL2ludGVybmFsLmg6IE5ldyByZWxvY2F0aW9ucy4KLQkqIG9wY29kZS9oODMwMC5oOiBMb3RzIG9mIG5ldyBvcGNvZGVzLgotCi1UdWUgSnVuICAxIDA3OjM1OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oIChjb25zdCk6IERvbid0IGRlZmluZSBpdCBpZiBpdCdzIGFscmVhZHkgZGVmaW5lZC4KLQotVGh1IE1heSAyNyAxODoxOTo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9ocHBhKTogRGVjbGFyZSBpdC4KLQotCSogYmZkLmg6IE1vdmVkIHRvIGJmZCBkaXJlY3RvcnkuICBTbWFsbCBzdHViIGhlcmUgaW5jbHVkZXMgaXQKLQl3aXRob3V0IHJlcXVpcmluZyAiLUkuLi9iZmQiLgotCi1UaHUgQXByIDI5IDEyOjA2OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCB3aXRoIEJTRl9GVU5DVElPTi4KLQotTW9uIEFwciAyNiAxODoxNTo1MCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmgsIGRpcy1hc20uaDogVXBkYXRlZCB3aXRoIEhpdGFjaGkgU0guCi0KLUZyaSBBcHIgMjMgMTg6NDE6MzggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIHdpdGggYWxwaGEgY2hhbmdlcy4KLQkqIGRpcy1hc20uaDogQWRkZWQgYWxwaGEuCi0KLUZyaSBBcHIgMTYgMTc6MzU6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIHNpZ25lZCBiZmRfKmdldF8qLgotCi1UaHUgQXByIDE1IDA5OjI0OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCBmb3IgZmlsZV90cnVuY2F0ZWQgZXJyb3IuCi0KLVRodSBBcHIgIDggMTA6NTM6NDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oOiBJZiBubyBBTlNJLCBkZWZpbmUgY29uc3QgdG8gYmUgZW1wdHkuCi0KLVRodSBBcHIgIDEgMDk6MDA6MTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogRGVjbGFyZSBhMjlrIGFuZCBpOTYwIHByaW50X2luc25fKi4KLQotCSogZGlzLWFzbS5oOiBBZGQgcHJpbnRfYWRkcmVzc19mdW5jIGFuZCByZWxhdGVkIHN0dWZmLgotCi0JKiBkaXMtYXNtLmggKGRpc19hc21fcmVhZF9tZW1vcnkpOiBGaXggcHJvdG90eXBlLgotCi1XZWQgTWFyIDMxIDE3OjQwOjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcmludF9pbnNuX3NwYXJjLgotCi1XZWQgTWFyIDMxIDE3OjUxOjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgZm9yIEJGRF9SRUxPQ19NSVBTX0dQUkVMIGFuZCBiZmRfW2dzXWV0X2dwX3NpemUKLQlwcm90b3R5cGVzLgotCi1XZWQgTWFyIDMxIDE2OjM1OjEyIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogKGRpc2Fzc2VtYmxlX2luZm8pOiAgRml4IHR5cG8gaW4gcHJvdG90eXBlIG9mCi0JZGlzX2FzbV9tZW1vcnlfZXJyb3IoKS4KLQotVHVlIE1hciAzMCAxOTowOToyMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZXJfaW5mbyk6IEFkZCByZWFkX21lbW9yeV9mdW5jLAotCW1lbW9yeV9lcnJvcl9mdW5jLCBidWZmZXIsIGFuZCBsZW5ndGguCi0JKHtHREJfLH1JTklUX0RJU0FTU0VNQkxFX0lORk8pOiBTZXQgdGhlbS4KLQlwcmludF9pbnNuXyo6IFJlbW92ZSBzZWNvbmQgYXJndW1lbnQuCi0KLVR1ZSBNYXIgMzAgMTQ6NDg6NTUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIGxtYSBmaWVsZCBvZiBzZWN0aW9uLgotCi1UdWUgTWFyIDMwIDEyOjIyOjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oOiBVc2UgQU5TSSB2ZXJzaW9ucyBvbiBBSVggcmVnYXJkbGVzcyBvZiBfX1NURENfXy4KLQotRnJpIE1hciAxOSAxNDo0OTo0OSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBBZGQgaDg1MDAuCi0KLVRodSBNYXIgMTggMTM6NDk6MDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0Lmg6ICBNb3ZlZCBmcm9tIC4uL2dkYi4KLQkqIGRpcy1hc20uaDogIE5ldyBmaWxlLiAgSW50ZXJmYWNlIHRvIGRpcy1hc3NlbWJsZXIuCi0KLVRodSBNYXIgMTEgMTA6NTI6NTcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmggKERNR0xfTk9fT1BUUyk6ICBBZGQgZGVmaW5lIChzZXQgdG8gMCkgdG8gdXNlCi0JaW4gcGxhY2Ugb2YgYmFyZSAwLCBmb3IgcmVhZGFiaWxpdHkgcmVhc29ucy4KLQotVHVlIE1hciAgMiAxNzo1MDoxMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaDogIFJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gY2Zyb250IHdpdGggQVJNLgotCi1UdWUgRmViIDIzIDEyOjIxOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3IgbmV3IGVsZW1lbnRzIGluIEpVTVBfVEFCTEUuCi0KLVR1ZSBGZWIgMTYgMDA6NTE6MzAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIGZvciBCRkRfVkVSU0lPTiAyLjEuCi0KLVR1ZSBKYW4gMjYgMTE6NDk6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBTRUNfSVNfQ09NTU9OIGZsYWcuCi0KLVR1ZSBKYW4gMTkgMTI6MjU6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBiZmRfYXN5bWJvbF92YWx1ZSBidWcgZml4LgotCi1GcmkgSmFuICA4IDE2OjM3OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSB0byBpbmNsdWRlIEVDT0ZGIHRkYXRhIGFuZCB0YXJnZXRfZmxhdm91ci4KLQotU3VuIERlYyAyNyAxNzo1MjozMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBBZGQgZGVjbGFyYXRpb24gZm9yIGJmZF9nZXRfc2l6ZSgpLgotCi1UdWUgRGVjIDIyIDIyOjQyOjQ2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oOiAgUHJvdGVjdCBmaWxlIGZyb20gbXVsdGlwbGUgaW5jbHVzaW9ucyB3aXRoCi0JI2lmICFkZWZpbmVkKERFTUFOR0xFX0gpLi4uI2RlZmluZSBERU1BTkdMRV9ILi4uI2VuZGlmLgotCi1Nb24gRGVjIDIxIDIxOjI1OjUwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIHRvIGdldCBocHBhX2NvcmVfc3RydWN0IGZyb20gYmZkLmMuCi0KLVRodSBEZWMgMTcgMDA6NDI6MzUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIHRvIGdldCB0ZWtoZXggdGRhdGEgbmFtZSBjaGFuZ2UgZnJvbSBiZmQuCi0KLU1vbiBOb3YgIDkgMjM6NTU6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6ICBVcGRhdGUgY29tbWVudHMgdG8gZGlzY291cmFnZSB1c2Ugb2YgRVhGVU4uCi0KLVRodSBOb3YgIDUgMTY6MzU6NDQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIHRvIGJyaW5nIGluIFNFQ19TSEFSRURfTElCUkFSWS4KLQotVGh1IE5vdiAgNSAwMzoyMTozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgdG8gbWF0Y2ggRVhGVU4sIGJmZF9zZWNsZXRfc3RydWN0LCBhbmQgU0RFRgotCWNsZWFudXBzIGluIGJmZC4KLQotV2VkIE5vdiAgNCAwNzoyODowNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYm91dC5oIChOX0NBTExOQU1FLCBOX0JBTE5BTUUpOiBEZWZpbmUgYXMgY2hhci10eXBlIHZhbHVlcywgc28KLQl3aWRlbmluZyB3b3JrcyBjb25zaXN0ZW50bHkuCi0KLUZyaSBPY3QgMTYgMDM6MTc6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oOiAgVXBkYXRlIHRvIFJldmlzZWQgU3RhbmRhcmQgRlNGIFZlcnNpb24uCi0KLVRodSBPY3QgMTUgMjE6NDM6MjIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaCAoc3RydWN0IG9wdGlvbik6IHVzZSB0aGUgcHJvdmlkZWQgZW51bSBmb3IgaGFzX2FyZy4KLQotCSogZGVtYW5nbGUuaCAoQVVUT19ERU1BTkdMSU5HLCBHTlVfREVNQU5HTElORywKLQkgIExVQ0lEX0RFTUFOR0xJTkcpOiB1bHRyaXggY29tcGlsZXJzIHJlcXVpcmUgZW51bXMgdG8gYmUKLQkgIGVudW1zIGFuZCBpbnRzIHRvIGJlIGludHMgYW5kIGNhc3RzIHdoZXJlIHRoZXkgbWVldC4gIGNhc3Qgc29tZQotCSAgZW51bXMgaW50byBpbnRzLgotCi1UaHUgT2N0IDE1IDA0OjM1OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSBhZnRlciBjb21tZW50IGNoYW5nZXMuCi0KLVRodSBPY3QgIDggMDk6MDM6MDIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBuZXcgbWFjcm8gZm9yIGdldHRpbmcgaW4geHZlYwotCi1UaHUgU2VwICAzIDA5OjEwOjUwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogIHNpemUgbmVlZHMgdG8gYmUgc2lnbmVkIGlmCi0JaXQncyBnb2luZyB0byBob2xkIG5lZ2F0aXZlIHZhbHVlcy4KLQotU3VuIEF1ZyAzMCAxNzo1MDoyNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmg6ICBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9nZGIuICBNYWRlIGluZGVwZW5kZW50Ci0Jb2YgZ2RiLiAgQWxsb3cgZGVtYW5nbGluZyBzdHlsZSBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEKLQlwYXJhbWV0ZXIgdG8gY3BsdXNfZGVtYW5nbGUoKSwgYnV0IHVzaW5nIHRoZQotCWN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSBnbG9iYWwgYXMgdGhlIGRlZmF1bHQuCi0KLVNhdCBBdWcgMjkgMTA6MDc6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogIE1lcmdlIGNvbW1lbnQgY2hhbmdlIGZyb20gY3VycmVudCBGU0YgdmVyc2lvbi4KLQotVGh1IEF1ZyAyNyAxMjo1OToyOSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogYWRkIHdlMzJrCi0KLVR1ZSBBdWcgMjUgMTU6MDc6NDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBuZXcgYWZ0ZXIgWjgwMDAgc3R1ZmYKLQotTW9uIEF1ZyAxNyAwOTowMToyMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFJlZ2VuZXJhdGVkIGFmdGVyIHBhZ2Uvc2VnbWVudCBzaXplIGNoYW5nZXMuCi0KLVNhdCBBdWcgIDEgMTM6NDY6MzEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogTWVyZ2UgY2hhbmdlcyBmcm9tIGN1cnJlbnQgRlNGIHZlcnNpb24uCi0KLU1vbiBKdWwgMjAgMjE6MDY6MjMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaCAoYXJlYV9pZCwgZmxhZ3MpOiAgUmVtb3ZlLCByZXBsYWNlIHdpdGggZXh0cmFfYXJnLAotCXVzZV9leHRyYV9hcmcsIGFuZCBtYXliZV9lbXB0eV9vYmplY3QuCi0JKiBvYnN0YWNrLmggKE9CU1RBQ0tfTUFZQkVfRU1QVFlfT0JKRUNULCBPQlNUQUNLX01NQUxMT0NfTElLRSk6Ci0JUmVtb3ZlLCByZXBsYWNlZCBieSBtYXliZV9lbXB0eV9vYmplY3QgYW5kIHVzZV9leHRyYV9hcmcgYml0ZmllbGRzLgotCSogb2JzdGFjay5oIChvYnN0YWNrX2Z1bGxfYmVnaW4sIF9vYnN0YWNrX2JlZ2luKTogIFJlbW92ZSBhcmVhX2lkCi0JYW5kIGZsYWdzIGFyZ3VtZW50cy4KLQkqIG9ic3RhY2suaCAob2JzdGFja19hbGxvY19hcmcpOiAgTmV3IG1hY3JvIHRvIHNldCBleHRyYV9hcmcuCi0KLVRodSBKdWwgMTYgMDg6MTI6NDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBuZXcgYWZ0ZXIgYWRkaW5nIEJGRF9JU19SRUxBWEFCTEUKLQotU2F0IEp1bCAgNCAwMzoyMjoyMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBSZWdlbiBhZnRlciBhZGRpbmcgQlNGX0ZJTEUuCi0KLU1vbiBKdW4gMjkgMTQ6MTg6MzYgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IHN1bmZpc2gpCi0KLQkqIG9ic3RhY2suaDogIENvbnZlcnQgYmNvcHkoKSB1c2UgdG8gbWVtY3B5KCksIHdoaWNoIGlzIG1vcmUKLQlwb3J0YWJsZSwgbW9yZSBzdGFuZGFyZCwgYW5kIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBnY2MncyBidWlsdGluCi0JZnVuY3Rpb25zIGZvciBpbmNyZWFzZWQgcGVyZm9ybWFuY2UuCi0KLVRodSBKdW4gMjUgMDQ6NDY6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmggKFBBUkFNUyk6ICBJbmNvcnBvcmF0ZSB0aGlzIG1hY3JvIGZyb20gZ2RiJ3MgZGVmcy5oLgotCUl0J3MgYSBjbGVhbmVyIHdheSB0byBmb3J3YXJkLWRlY2xhcmUgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQotRnJpIEp1biAxOSAxNTo0NjozMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIEhQUEEgbWVyZ2UuCi0KLVR1ZSBKdW4gMTYgMjE6MzA6NTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oOiBncmF0dWl0b3VzIHdoaXRlIHNwYWNlIGNoYW5nZXMgbWVyZ2VkIGZyb20gb3RoZXIgcHJlcAotCSAgcmVsZWFzZXMuCi0KLVRodSBKdW4gMTEgMDE6MTA6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgUmVnZW4nZCBmcm9tIGJmZC5jIGFmdGVyIHJlbW92aW5nIGVsZl9jb3JlX3RkYXRhX3N0cnVjdC4KLQotTW9uIE1heSAxOCAxNzoyOTowMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0Lmg6IG1lcmdlZCBjaGFuZ2VzIGZyb20gbWFrZS0zLjYyLjExLgotCi0JKiBnZXRvcHQuaDogbWVyZ2VkIGNoYW5nZXMgZnJvbSBncmVwLTEuNiAoYWxwaGEpLgotCi1GcmkgTWF5ICA4IDE0OjUzOjMyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaDogbWVyZ2VkIGNoYW5nZXMgZnJvbSBiaXNvbi0xLjE4LgotCi1TYXQgTWFyIDE0IDE3OjI1OjIwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6ICBBZGQgImFyZWFfaWQiIGFuZCAiZmxhZ3MiIG1lbWJlcnMgdG8gb2JzdGFjawotCXN0cnVjdHVyZS4gIEFkZCBvYnN0YWNrX2NodW5rZnVuKCkgYW5kIG9ic3RhY2tfZnJlZWZ1bigpIHRvCi0Jc2V0IGZ1bmN0aW9ucyBleHBsaWNpdGx5LiAgQ29udmVydCBtYXliZV9lbXB0eV9vYmplY3QgdG8KLQlhIGJpdCBpbiAiZmxhZ3MiLgotCi1UaHUgRmViIDI3IDIyOjAxOjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiB3YWl0LmggKFdJRlNUT1BQRUQpOiAgQWRkIElCTSByczYwMDAtc3BlY2lmaWMgdmVyc2lvbi4KLQotRnJpIEZlYiAyMSAyMDo0OToyMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgQWRkIG9ic3RhY2tfZnVsbF9iZWdpbi4KLQkqIGJmZC5oLCBvYnN0YWNrLmg6ICBQcm90b2xpbnQuCi0KLVRodSBKYW4gMzAgMDE6MTg6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgUmVtb3ZlIGNvbW1hIGZyb20gZW51bSBkZWNsYXJhdGlvbi4KLQotTW9uIEphbiAyNyAyMjowMToxMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaCA6IG5ldyB0YXJnZXQgZW50ciwgYmZkX3JlbGF4X3NlY3Rpb24KLQotV2VkIERlYyAxOCAxNzoxOTo0NCAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaCwgaWVlZS5oLCBvcGNvZGUvbTY4ay5oLCBvcGNvZGUvc3BhcmMuaDogIEFOU0lmeSBlbnVtcy4KLQotVGh1IERlYyAxMiAyMDo1OTo1NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZm9wZW4tc2FtZS5oLCBmb3Blbi1iaW4uaDogIE5ldyBmaWxlcyBmb3IgY29uZmlndXJpbmcKLQl3aGV0aGVyIGZvcGVuIGRpc3Rpbmd1aXNoZXMgYmluYXJ5IGZpbGVzIG9yIG5vdC4gIEZvciB1c2UKLQlieSBob3N0LWRlcGVuZGVudCBjb25maWcgZmlsZXMuCi0KLVNhdCBOb3YgMzAgMjA6NDY6NDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBjaGFuZ2UgdGhlIGRvY3VtZW50YXRpb24gZm9ybWF0LgotCi0JKiBjcmVhdGVkIGNvZmYsIGVsZiBhbmQgb3Bjb2RlIGFuZCBhb3V0IGRpcmVjdG9yaWVzLiBNb3ZlZDoKLQotCWFvdXQ2NC5oCT09PiBhb3V0L2FvdXQ2NC5oCi0JYXIuaAkJPT0+IGFvdXQvYXIuaAotCWEub3V0LmVuY2FwLmgJPT0+IGFvdXQvZW5jYXAuaAotCWEub3V0Lmhvc3QuaAk9PT4gYW91dC9ob3N0LmgKLQlhLm91dC5ocC5oCT09PiBhb3V0L2hwLmgKLQlhLm91dC5zdW40LmgJPT0+IGFvdXQvc3VuNC5oCi0JcmFubGliLmgJPT0+IGFvdXQvcmFubGliLmgKLQlyZWxvYy5oCQk9PT4gYW91dC9yZWxvYy5oCi0Jc3RhYi5kZWYJPT0+IGFvdXQvc3RhYi5kZWYKLQlzdGFiLmdudS5oCT09PiBhb3V0L3N0YWJfZ251LmgKLQotCWNvZmYtYTI5ay5oCT09PiBjb2ZmL2EyOWsuaAotCWNvZmYtaDgzMDAuaAk9PT4gY29mZi9oODMwMC5oCi0JY29mZi1pMzg2LmgJPT0+IGNvZmYvaTM4Ni5oCi0JY29mZi1pOTYwLmgJPT0+IGNvZmYvaTk2MC5oCi0JaW50ZXJuYWxjb2ZmLmgJPT0+IGNvZmYvaW50ZXJuYWwuaAotCWNvZmYtbTY4ay5oCT09PiBjb2ZmL202OGsuaAotCWNvZmYtbTg4ay5oCT09PiBjb2ZmL204OGsuaAotCWNvZmYtbWlwcy5oCT09PiBjb2ZmL21pcHMuaAotCWNvZmYtcnM2MDAwLmgJPT0+IGNvZmYvcnM2MDAwLmgKLQotCWVsZi1jb21tb24uaAk9PT4gZWxmL2NvbW1vbi5oCi0JZHdhcmYuaAkJPT0+IGVsZi9kd2FyZi5oCi0JZWxmLWV4dGVybmFsLmgJPT0+IGVsZi9leHRlcm5hbC5oCi0JZWxmLWludGVybmFsLmggID09PiBlbGYvaW50ZXJuYWwuaAotCi0JYTI5ay1vcGNvZGUuaAk9PT4gb3Bjb2RlL2EyOWsuaAotCWFybS1vcGNvZGUuaAk9PT4gb3Bjb2RlL2FybS5oCi0JaDgzMDAtb3Bjb2RlLmgJPT0+IG9wY29kZS9oODMwMC5oCi0JaTM4Ni1vcGNvZGUuaAk9PT4gb3Bjb2RlL2kzODYuaAotCWk4NjAtb3Bjb2RlLmgJPT0+IG9wY29kZS9pODYwLmgKLQlpOTYwLW9wY29kZS5oCT09PiBvcGNvZGUvaTk2MC5oCi0JbTY4ay1vcGNvZGUuaAk9PT4gb3Bjb2RlL202OGsuaAotCW04OGstb3Bjb2RlLmgJPT0+IG9wY29kZS9tODhrLmgKLQltaXBzLW9wY29kZS5oCT09PiBvcGNvZGUvbWlwcy5oCi0JbnAxLW9wY29kZS5oCT09PiBvcGNvZGUvbnAxLmgKLQluczMyay1vcGNvZGUuaAk9PT4gb3Bjb2RlL25zMzJrLmgKLQlwbi1vcGNvZGUuaAk9PT4gb3Bjb2RlL3BuLmgKLQlweXItb3Bjb2RlLmgJPT0+IG9wY29kZS9weXIuaAotCXNwYXJjLW9wY29kZS5oCT09PiBvcGNvZGUvc3BhcmMuaAotCXRhaG9lLW9wY29kZS5oCT09PiBvcGNvZGUvdGFob2UuaAotCXZheC1vcGNvZGUuaAk9PT4gb3Bjb2RlL3ZheC5oCi0KLQotCi1XZWQgTm92IDI3IDEwOjM4OjMxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbGNvZmYuaDogKGludGVybmFsX3NjbmhkcikgdG9vayBvdXQgI2RlZiBkZXBlbmRlbmN5LCBub3cKLQlzX25yZWxvYyBhbmQgc19ubG5ubyBhcmUgYWx3YXlzIGxvbmcuIAkoaW50ZXJuYWxfcmVsb2MpOiBhbGx3YXlzCi0JaGFzIGFuIG9mZnNldCBmaWVsZCBub3cuCi0KLUZyaSBOb3YgMjIgMDg6MTI6NTggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmg6ICBMaW50OyB1c2UgdW5zaWduZWQgY2hhcnMgZm9yIGV4dGVybmFsIGZpZWxkcy4KLQkqIGludGVybmFsY29mZi5oOiAgTGludDsgY2FzdCBzdG9yYWdlIGNsYXNzZXMgdG8gc2lnbmVkIGNoYXIuCi0KLVRodSBOb3YgMjEgMjE6MDE6MDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiBSZW1vdmUgdGhlIEdOVSBleHRlbmRlZCB0eXBlIGNvZGVzIChlLmcuIE5fU0VUVCkuCi0JKiBhb3V0NjQuaDogIFRoZSBoZXVyaXN0aWMgZm9yIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4KLQlzdW5vcy1zdHlsZSBhbmQgYnNkLXN0eWxlIFpNQUdJQyBmaWxlcyAod3J0LiB3aGVyZSB0aGUKLQl0ZXh0IHNlZ21lbnQgc3RhcnRzKSBpcyBtb3ZlZCBpbnRvICh0aGUgZGVmYXVsdCBkZWZpbml0aW9uIG9mKQotCXRoZSBtYWNybyBOX0hFQURFUl9JTl9URVhULiAgVGhpcyBkZWZpbml0aW9uIGlzIG9ubHkgdXNlZAotCWlmIG5vIG90aGVyIGRlZmluaXRpb24gaXMgdXNlZCAtIGUuZy4gYmZkL25ld3NvczMuYyBkZWZpbmVzCi0JTl9IRUFERVJfSU5fVEVYVCh4KSB0byBiZSBhbHdheXMgMCAoYXMgYmVmb3JlKS4KLQotVGh1IE5vdiAyMSAxMTo1MzowMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fVFhUQUREUiwgTl9UWFRPRkYsIE5fVFhUU0laRSk6ICBOZXcgZGVmaW5pdGlvbnMKLQl0aGF0IHNob3VsZCBoYW5kbGUgYWxsIHVzZXMuICBMT0dJQ0FMXyB2ZXJzaW9ucyBkZWxldGVkLgotCUVsaW1pbmF0ZSBOX0hFQURFUl9JTl9URVhULCB1c2luZyBhX2VudHJ5IHRvIGRldGVybWluZSB3aGljaAotCWtpbmQgb2Ygem1hZ2ljIGEub3V0IGZpbGUgd2UgYXJlIGxvb2tpbmcgYXQuCi0JKiBjb2ZmLXJzNjAwMC5oOiAgVHlwby4KLQotVHVlIE5vdiAxOSAxODo0MzozNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCShOb3RlOiAgVGhpcyBpcyBhIHJldmlzZWQgZW50cnksIGFzIHdhcyBhb3V0NjQuaC4pCi0JKiBhb3V0NjQuaDogIFNvbWUgY2xlYW51cHMgb2YgTl9UWFRBRERSIGFuZCBOX1RYVE9GRjoKLQlXaWxsIG5vdyB3b3JrIGZvciBib3RoIG9sZC0gYW5kIG5ldy1zdHlsZSBaTUFHSUMgZmlsZXMsCi0JZGVwZW5kaW5nIG9uIE5fSEVBREVSX0lOX1RFWFQgbWFjcm8uCi0JQWRkIExPR0lDQUxfVFhUQUREUiwgTE9JQ0FMX1RYVE9GRiBhbmQgTE9HSUNBTF9UWFRTSVpFCi0JdGhhdCBkb24ndCBjb3VudCB0aGUgZXhlYyBoZWFkZXIgYXMgcGFydAotCW9mIHRoZSB0ZXh0IHNlZ21lbnQsIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBiZmQuCi0JKiBhLm91dC5zdW40Lmg6ICBTaW1wbGlmaWVkL2ZpeGVkIGZvciBwcmV2aW91cyBjaGFuZ2UuCi0KLU1vbiBOb3YgMTggMDA6MDI6MDYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmg6ICBVcGRhdGUgdG8gRFdBUkYgZHJhZnQgNSB2ZXJzaW9uIGZyb20gZ2NjMi4KLQotVGh1IE5vdiAxNCAxOTo0NDo1OSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBBZGRlZCBkZWZzIGZvciBleHRlbmRlZCBHTlUgc3ltYm9sIHR5cGVzLAotCXN1Y2ggYXMgTl9TRVRULiAgVGhlc2UgYXJlIG5vcm1hbGx5IGlmZGVmJ2Qgb3V0IChiZWNhdXNlCi0Jb2YgY29uZmxpY3RzIHdpdGggYS5vdXQuZ251LmgpLCBidXQgYXJlIHVzZWQgYnkgYmZiX3N0YWJfbmFtZSgpLgotCi1UaHUgTm92IDE0IDE5OjE3OjAzIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYtY29tbW9uLmg6ICBBZGQgZGVmaW5lcyB0byBzdXBwb3J0IEVMRiBzeW1ib2wgdGFibGUgY29kZS4KLQotTW9uIE5vdiAxMSAxOTowMTowNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLWludGVybmFsLmgsIGVsZi1leHRlcm5hbC5oLCBlbGYtY29tbW9uLmg6ICBBZGQgc3VwcG9ydCBmb3IKLQlub3RlIHNlY3Rpb25zLCB3aGljaCBhcmUgdXNlZCBpbiBFTEYgY29yZSBmaWxlcyB0byBob2xkIGNvcGllcwotCW9mIHZhcmlvdXMgL3Byb2Mgc3RydWN0dXJlcy4KLQotVGh1IE5vdiAgNyAwODo1ODoyNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbGNvZmYuaDogdG9vayBvdXQgdGhlIE04OCBkZXBlbmRlbmN5IGluIHRoZSBsaW5lbm8KLQlzdHJ1Y3QuCi0JKiBjb2ZmLW04OGsuaDogZGVmaW5lcyBHRVRfTElORU5PX0xOTk8gYW5kIFBVVF9MSU5FTk9fTE5OTyB0byB1c2UKLQkzMmJpdCBsaW5ubyBlbnRyaWVzLgotCSogYTI5ay1vcGNvZGUuaDogZml4ZWQgZW5jb2Rpbmcgb2YgbXRhY2MKLQotU3VuIE5vdiAgMyAxMTo1NDoyMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgZnJvbSAuLi9iZmQvYmZkLWluLmggKHEudikuCi0KLUZyaSBOb3YgIDEgMTE6MTM6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oOiAgQWRkIHhfY3NlY3QgZGVmaW5lcy4KLQotRnJpIE9jdCAyNSAwMzoxODoyMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIENPRkYtcmVsYXRlZCBmaWxlcyBpbiBgY29mZi1BUkNILmgnIGZvcm0uCi0JY29mZi1hMjlrLmgsIGNvZmYtaTM4Ni5oLCBjb2ZmLWk5NjAuaCwgY29mZi1tNjhrLmgsIGNvZmYtbTg4ay5oLAotCWNvZmYtbWlwcy5oLCBjb2ZmLXJzNjAwMC5oIHRvIGJlIGV4YWN0LgotCi1UaHUgT2N0IDI0IDIyOjExOjExIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUlMvNjAwMCBzdXBwb3J0LCBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGj79G5nLVRo5W8gVvUsIGFuZAotCUpvaG4gR2lsbW9yZS4KLQotCSogYS5vdXQuZ251Lmg6ICBVcGRhdGUgc2xpZ2h0bHkuCi0JKiBiZmQuaDogIEFkZCBuZXcgZXJyb3IgY29kZSwgZml4IGRvYywgYWRkIGJmZF9hcmNoX3JzNjAwMC4KLQkqIGludGVybmFsY29mZi5oOiAgQWRkIG1vcmUgRl8gY29kZXMgZm9yIGZpbGVoZHIuICBBZGQKLQlycy82MDAwLWRlcGVuZGVudCBmaWVsZHMgdG8gYW91dGhkci4gIEFkZCBzdG9yYWdlIGNsYXNzZXMKLQl0byBzeW1lbnRzLiAgQWRkIDYwMDAtc3BlY2lmaWMgYXV4ZW50LiAgQWRkIHJfc2l6ZSBpbiByZWxvYy4KLQkqIHJzNjAwMGNvZmYuYzogIE5ldyBmaWxlLgotCi1UaHUgT2N0IDI0IDA0OjEzOjIwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBkd2FyZi5oOiBOZXcgZmlsZSBmb3IgZHdhcmYgc3VwcG9ydC4gIENvcGllZCBmcm9tIGdjYzIKLQlkaXN0cmlidXRpb24uCi0KLVdlZCBPY3QgMTYgMTM6MzE6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiAgUmVtb3ZlIFBBR0VfU0laRSBkZWZpbmVzOyB0aGV5IGFyZSB0YXJnZXQtZGVwZW5kZW50LgotCUFkZCBOX0ZOX1NFUSBmb3IgTl9GTiBzeW1ib2wgdHlwZSB1c2VkIG9uIFNlcXVlbnQgbWFjaGluZXMuCi0JKiBzdGFiLmRlZjogIEluY2x1ZGUgTl9GTl9TRVEgaW4gdGFibGUuCi0JKiBib3V0Lmg6ICBFeHRlcm5hbCBmb3JtYXRzIG9mIHN0cnVjdHVyZXMgdXNlIHVuc2lnbmVkIGNoYXJzLgotCi1GcmkgT2N0IDExIDEyOjQwOjQzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6dXBncmFkZSBmcm9tIGJmZC5jCi0JKiBpbnRlcm5hbGNvZmYuaDogYWRkIG5fbmFtZSwgbl96ZXJvZXMgYW5kIG5fb2Zmc2V0IG1hY3JvcwotCSogYW1kY29mZi5oOiBEZWZpbmUgT01BR0lDIGFuZCBBT1VUSERSU1ouCi0KLUZyaSBPY3QgMTEgMTA6NTg6MDYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGEub3V0Lmhvc3QuaDogQ2hhbmdlIFNFR01FTlRfU0laRSB0byAweDEwMDAgZm9yIFNvbnkuCi0JKiBiZmQuaCAoYWxpZ25fcG93ZXIpOiBBZGQgKGFjdHVhbGx5IG1vdmUpIGNvbW1lbnQuCi0KLVR1ZSBPY3QgIDggMTU6Mjk6MzIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5cy9oLXJ0YnNkLmg6IERlZmluZSBNSVNTSU5HX1ZGUFJJTlQgKGZvciBiaW51dGlscy9idWNvbW0uYykuCi0KLVN1biBPY3QgIDYgMTk6MjQ6MzkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiAgTW92ZSBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyB0byAuLi9iZmQvbGliYW91dC5oIHNvCi0JaXQgY2FuIGJlIHNoYXJlZCBieSBhbGwgYGEub3V0LWZhbWlseScgY29kZS4gIFJlbmFtZQotCUVYVEVSTkFMX0xJU1RfU0laRSB0byBFWFRFUk5BTF9OTElTVF9TSVpFLiAgVXNlIGJhc2ljIHR5cGVzCi0JZm9yIG5saXN0IG1lbWJlcnMsIGFuZCBtYWtlIHN0cnggaW50ZWdyYWwgcmF0aGVyIHRoYW4gcG9pbnRlci4KLQlNb3JlIGNvbW1lbnRhcnkgb24gbl90eXBlIHZhbHVlcy4KLQkqIGJvdXQuaDogIFByb3ZpZGUgYSBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyByYXRoZXIgdGhhbiBhbgotCWludGVybmFsX2V4ZWMuCi0JKiBtNjhrY29mZi5oOiAgUmVtb3ZlIGB0YWdlbnRyaWVzJyB3aGljaCBzbnVjayBpbiBmcm9tIHRoZSBpOTYwCi0JQ09GRiBwb3J0LgotCi1GcmkgT2N0ICA0IDAxOjI1OjU5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBoODMwMC1vcGNvZGUuaDogIFJlbW92ZSBgX2VudW0nIGZyb20gdGhlIHR5cGVkZWYgZm9yIGFuIGVudW0uCi0JKiBiZmQuaDogIFVwZGF0ZSB0byBtYXRjaCBiZmQgY2hhbmdlcy4KLQotCSogc3lzL2gtaTM4Nm1hY2guaCwgc3lzZGVwLmg6ICBBZGQgMzg2IE1hY2ggaG9zdCBzdXBwb3J0LgotCi1UdWUgT2N0ICAxIDA0OjU4OjQyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaCwgZWxmLWNvbW1vbi5oLCBlbGYtZXh0ZXJuYWwuaCwgZWxmLWludGVybmFsLmg6Ci0JQWRkIHByZWxpbWluYXJ5IEVMRiBzdXBwb3J0LCBzdWZmaWNpZW50IGZvciBHREIsIGZyb20gRnJlZCBGaXNoLgotCSogc3lzZGVwLmgsIHN5cy9oLWFtaXguaDogIFN1cHBvcnQgQW1pZ2EgU1ZSNC4KLQotCSogc3lzL2gtdmF4dWx0Lmg6ICBNYWtlIGl0IHdvcmsuICAoRGF2aWQgVGF5bG9yIDx0YXlsb3JAdGhpbmsuY29tPikKLQkqIGEub3V0LnZheC5oOiAgUmVtb3ZlIHVudXNlZCBhbmQgY29uZnVzaW5nIGZpbGUuCi0KLU1vbiBTZXAgMzAgMTI6NTI6MzUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC5oOiBEZWZpbmUgTkVXU09TM19TWVMsIGFuZCB1c2UgaXQuCi0KLUZyaSBTZXAgMjAgMTM6Mzg6MjEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGEub3V0LmdudS5oIChOX0ZOKTogIEl0cyB2YWx1ZSAqcmVhbGx5IGlzKiAweDFGLgotCUZpeCBpdCwgYW5kIGFkZCBjb21tZW50cyB3YXJuaW5nIGFib3V0IG9yLWluZyBOX0VYVCB3aXRoIGl0Ci0JYW5kL29yIE5fV0FSTklORy4KLQkqIGFvdXQ2NC5oIChOX0ZOKTogIEZpeCB2YWx1ZSwgYWRkIGNvbW1lbnRzIGFib3V0IE5fRVhULgotCSogc3RhYi5kZWYgKHRhYmxlIGF0IGVuZCk6ICBVcGRhdGUgdG8gc2hvdyBhbGwgdGhlIHR5cGUKLQl2YWx1ZXMgPDB4MjAsIGluY2x1ZGluZyBsb3cgb3JkZXIgYml0cy4gIE1vdmUgTl9GTiB0bwotCWl0cyByaWdodGZ1bCBwbGFjZS4KLQotVHVlIFNlcCAxNyAxNzo0MTozNyAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzeXMvaC1pcml4My5oOiAgc2dpL2lyaXggc3VwcG9ydC4KLQotVHVlIFNlcCAxNyAwNzo1Mjo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmIChOX0RFRkQpOiAgQWRkIEdOVSBNb2R1bGEtMiBkZWJ1ZyBzdGFiLCBmcm9tIEFuZHJldwotCUJlZXJzLgotCi1UaHUgU2VwIDEyIDE0OjEyOjU5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWxjb2ZmLmggKFNZTU5NTEVOLCBGSUxOTUxFTiwgRElNTlVNKTogIERlZmluZSB0aGVzZQotCWZvciBpbnRlcm5hbGNvZmYsIHNlcGFyYXRlbHkgZnJvbSB0aGUgdmFyaW91cyBleHRlcm5hbCBjb2ZmJ3MuCi0JKiBhbWRjb2ZmLmgsIGJjczg4a2NvZmYuaCwgaTM4NmNvZmYuaCwgaW50ZWwtY29mZi5oLCBtNjhrY29mZi5oLAotCW04OGstYmNzLmg6IFByZWZpeCBTWU1OTUxFTiwgRklMTk1MRU4sIGFuZCBESU1OVU0gd2l0aCBFXydzIGZvcgotCXRoZSBleHRlcm5hbCBzdHJ1Y3QgZGVmaW5pdGlvbnMuCi0JKiBlY29mZi5oOiBSZW1vdmUgdGhlc2UgI2RlZmluZSdzLCBrbHVkZ2Ugbm8gbG9uZ2VyIG5lZWRlZC4KLQotCSogc3lzL2gtdWx0cmEzLmg6ICBBZGQgbmV3IFVsdHJhY29tcHV0ZXIgaG9zdC4KLQkqIHN5c2RlcC5oOiAgQWRkIFVMVFJBM19TWU0xX1NZUyBhbmQgdXNlIGl0LgotCi1UdWUgU2VwIDEwIDEwOjExOjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaTM4NmNvZmYuaCAoTElORVNaKTogIEFsd2F5cyA2LCBub3QgYmFzZWQgb24gc2l6ZW9mKCkuCi0JKEZpeCBmcm9tIFBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4pCi0KLVdlZCBTZXAgIDQgMDg6NTg6MzcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhLm91dC5nbnUuaCwgYW91dDY0Lmg6ICBBZGQgTl9XQVJOSU5HLiAgQ2hhbmdlIE5fRk4gdG8gMHgwRSwKLQl0byBtYXRjaCBTdW5PUyBhbmQgQlNELiAgQWRkIE5fQ09NTSBhcyAweDEyIGZvciBTdW5PUyBzaGFyZWQgbGliCi0Jc3VwcG9ydC4KLQkqIHN0YWIuZGVmOiAgQWRkIE5fQ09NTSB0byB0YWJsZSwgZml4IG92ZXJsYXAgY29tbWVudC4KLQotVHVlIFNlcCAgMyAwNjoyOToyMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlNZXJnZSB3aXRoIGxhdGVzdCBGU0YgdmVyc2lvbnMgb2YgdGhlc2UgZmlsZXMuCi0KLQkqIHN0YWIuZ251Lmg6ICBBZGQgTEFTVF9VTlVTRURfU1RBQl9DT0RFLgotCSogc3RhYi5kZWY6ICBVcGRhdGUgdG8gR1BMMi4gIE1vdmUgTl9XQVJOSU5HIG91dCwgc2luY2Ugbm90IGEKLQlkZWJ1ZyBzeW1ib2wuICBDaGFuZ2UgY29tbWVudHMsIGFuZCByZW9yZGVyIHRhYmxlIHRvIG51bWVyaWMKLQlvcmRlci4gIFVwZGF0ZSBmaW5hbCB0YWJsZSBjb21tZW50LgotCShOX0RTTElORSwgTl9CU0xJTkUpOiAgUmVudW1iZXIgZnJvbSAweDY2IGFuZCAweDY4LCB0byAweDQ2IGFuZCAweDQ4LgotCi0JKiBvYnN0YWNrLmg6ICBHUEwyLiAgTWVyZ2UuCi0KLUZyaSBBdWcgMjMgMDE6NTQ6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhLm91dC5nbnUuaCwgYS5vdXQuc3VuNC5oOiAgTWFrZSBTRUdNRU5UX1NJWkUgYWJsZSB0byBkZXBlbmQKLQlvbiB0aGUgcGFydGljdWxhciBhLm91dCBiZWluZyBleGFtaW5lZC4KLQkqIGEub3V0LnN1bjQuaDogIERlZmluZSBzZWdtZW50IHNpemVzIGZvciBTdW4tMydzIGFuZCBTdW4tNCdzLgotCSogRklYTUU6ICBhLm91dC5nbnUuaCBpcyBhbG1vc3Qgb2Jzb2xldGUuCi0JKiBGSVhNRTogIGEub3V0LnN1bjQuaCBzaG91bGQgYmUgcmVuYW1lZCBhLm91dC5zdW4uaCBub3cuCi0KLVdlZCBBdWcgMjEgMjA6MzI6MTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBTdGFydCBhIENoYW5nZUxvZyBmb3IgdGhlIGluY2x1ZGVzIGRpcmVjdG9yeS4KLQotCSogYS5vdXQuZ251LmggKE5fRk4pOiAgRml4IHZhbHVlIC0tIHdhcyAxNSwgc2hvdWxkIGJlIDB4MUUuCi0JKiBzdGFiLmRlZjogIFVwZGF0ZSBhbGxvY2F0aW9uIHRhYmxlIGluIGNvbW1lbnRzIGF0IGVuZCwKLQl0byByZWZsZWN0IHJlYWxpdHkgYXMgSSBrbm93IGl0LgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2Fuc2lkZWNsLmggYi9pbmNsdWRlL2Fuc2lkZWNsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OWRkNjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hbnNpZGVjbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qIEFOU0kgYW5kIHRyYWRpdGlvbmFsIEMgY29tcGF0YWJpbGl0eSBtYWNyb3MKLSAgIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFOU0kgYW5kIHRyYWRpdGlvbmFsIEMgY29tcGF0aWJpbGl0eSBtYWNyb3MKLQotICAgQU5TSSBDIGlzIGFzc3VtZWQgaWYgX19TVERDX18gaXMgI2RlZmluZWQuCi0KLSAgIE1hY3JvCUFOU0kgQyBkZWZpbml0aW9uCVRyYWRpdGlvbmFsIEMgZGVmaW5pdGlvbgotICAgLS0tLS0JLS0tLSAtIC0tLS0tLS0tLS0JLS0tLS0tLS0tLS0gLSAtLS0tLS0tLS0tCi0gICBQVFIJCWB2b2lkIConCQlgY2hhciAqJwotICAgTE9OR19ET1VCTEUJYGxvbmcgZG91YmxlJwkJYGRvdWJsZScKLSAgIFZPTEFUSUxFCWB2b2xhdGlsZScJCWAnCi0gICBTSUdORUQJYHNpZ25lZCcJCWAnCi0gICBQVFJDT05TVAlgdm9pZCAqY29uc3QnCQlgY2hhciAqJwotICAgQU5TSV9QUk9UT1RZUEVTICAxCQkJbm90IGRlZmluZWQKLQotICAgQ09OU1QgaXMgYWxzbyBkZWZpbmVkLCBidXQgaXMgb2Jzb2xldGUuICBKdXN0IHVzZSBjb25zdC4KLQotICAgb2Jzb2xldGUgLS0gICAgIERFRlVOIChuYW1lLCBhcmdsaXN0LCBhcmdzKQotCi0JRGVmaW5lcyBmdW5jdGlvbiBOQU1FLgotCi0JQVJHTElTVCBsaXN0cyB0aGUgYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBlbmNsb3NlZCBpbgotCXBhcmVudGhlc2VzLiAgQVJHTElTVCBiZWNvbWVzIHRoZSBhcmd1bWVudCBsaXN0IGluIHRyYWRpdGlvbmFsIEMuCi0KLQlBUkdTIGxpc3QgdGhlIGFyZ3VtZW50cyB3aXRoIHRoZWlyIHR5cGVzLiAgSXQgYmVjb21lcyBhIHByb3RvdHlwZSBpbgotCUFOU0kgQywgYW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9ucyBpbiB0cmFkaXRpb25hbCBDLiAgQXJndW1lbnRzIHNob3VsZAotCWJlIHNlcGFyYXRlZCB3aXRoIGBBTkQnLiAgRm9yIGZ1bmN0aW9ucyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0JYXJndW1lbnRzLCB0aGUgbGFzdCB0aGluZyBsaXN0ZWQgc2hvdWxkIGJlIGBET1RTJy4KLQotICAgb2Jzb2xldGUgLS0gICAgIERFRlVOX1ZPSUQgKG5hbWUpCi0KLQlEZWZpbmVzIGEgZnVuY3Rpb24gTkFNRSwgd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzLgotCi0gICBvYnNvbGV0ZSAtLSAgICAgRVhGVU4gKG5hbWUsIChwcm90b3R5cGUpKQktLSBvYnNvbGV0ZS4KLQotCVJlcGxhY2VkIGJ5IFBBUkFNUy4gIERvIG5vdCB1c2U7IHdpbGwgZGlzYXBwZWFyIHNvbWVkYXkgc29vbi4KLQlXYXMgdXNlZCBpbiBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JSW4gQU5TSSBDIGl0IGlzIGBOQU1FIFBST1RPVFlQRScgKHNvIFBST1RPVFlQRSBzaG91bGQgYmUgZW5jbG9zZWQgaW4KLQlwYXJlbnRoZXNlcykuICBJbiB0cmFkaXRpb25hbCBDIGl0IGlzIGBOQU1FKCknLgotCUZvciBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLCBQUk9UT1RZUEUgc2hvdWxkIGJlIGAodm9pZCknLgotCi0gICBvYnNvbGV0ZSAtLSAgICAgUFJPVE8gKHR5cGUsIG5hbWUsIChwcm90b3R5cGUpICAgIC0tIG9ic29sZXRlLgotCi0JVGhpcyBvbmUgaGFzIGFsc28gYmVlbiByZXBsYWNlZCBieSBQQVJBTVMuICBEbyBub3QgdXNlLgotCi0gICBQQVJBTVMgKChhcmdzKSkKLQotCVdlIGNvdWxkIHVzZSB0aGUgRVhGVU4gbWFjcm8gdG8gaGFuZGxlIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMsIGJ1dAotCXRoZSBuYW1lIGlzIG1pc2xlYWRpbmcgYW5kIHRoZSByZXN1bHQgaXMgdWdseS4gIFNvIHdlIGp1c3QgZGVmaW5lIGEKLQlzaW1wbGUgbWFjcm8gdG8gaGFuZGxlIHRoZSBwYXJhbWV0ZXIgbGlzdHMsIGFzIGluOgotCi0JICAgICAgc3RhdGljIGludCBmb28gUEFSQU1TICgoaW50LCBjaGFyKSk7Ci0KLQlUaGlzIHByb2R1Y2VzOiAgYHN0YXRpYyBpbnQgZm9vKCk7JyBvciBgc3RhdGljIGludCBmb28gKGludCwgY2hhcik7JwotCi0JRVhGVU4gd291bGQgaGF2ZSBkb25lIGl0IGxpa2UgdGhpczoKLQotCSAgICAgIHN0YXRpYyBpbnQgRVhGVU4gKGZvbywgKGludCwgY2hhcikpOwotCi0JYnV0IHRoZSBmdW5jdGlvbiBpcyBub3QgZXh0ZXJuYWwuLi5hbmQgaXQncyBoYXJkIHRvIHZpc3VhbGx5IHBhcnNlCi0JdGhlIGZ1bmN0aW9uIG5hbWUgb3V0IG9mIHRoZSBtZXNzLiAgIEVYRlVOIHNob3VsZCBiZSBjb25zaWRlcmVkCi0Jb2Jzb2xldGU7IG5ldyBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvIHVzZSBQQVJBTVMuCi0KLSAgIERPVFMgaXMgYWxzbyBvYnNvbGV0ZS4KLQotICAgRXhhbXBsZXM6Ci0KLQlleHRlcm4gaW50IHByaW50ZiBQQVJBTVMgKChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOwotKi8KLQotI2lmbmRlZglfQU5TSURFQ0xfSAotCi0jZGVmaW5lCV9BTlNJREVDTF9ICTEKLQotCi0vKiBFdmVyeSBzb3VyY2UgZmlsZSBpbmNsdWRlcyB0aGlzIGZpbGUsCi0gICBzbyB0aGV5IHdpbGwgYWxsIGdldCB0aGUgc3dpdGNoIGZvciBsaW50LiAgKi8KLS8qIExJTlRMSUJSQVJZICovCi0KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfQUlYKSB8fCAoZGVmaW5lZCAoX19taXBzKSAmJiBkZWZpbmVkIChfU1lTVFlQRV9TVlI0KSkgfHwgZGVmaW5lZChfV0lOMzIpCi0vKiBBbGwga25vd24gQUlYIGNvbXBpbGVycyBpbXBsZW1lbnQgdGhlc2UgdGhpbmdzIChidXQgZG9uJ3QgYWx3YXlzCi0gICBkZWZpbmUgX19TVERDX18pLiAgVGhlIFJJU0MvT1MgTUlQUyBjb21waWxlciBkZWZpbmVzIHRoZXNlIHRoaW5ncwotICAgaW4gU1ZSNCBtb2RlLCBidXQgZG9lcyBub3QgZGVmaW5lIF9fU1REQ19fLiAgKi8KLQotI2RlZmluZQlQVFIJCXZvaWQgKgotI2RlZmluZQlQVFJDT05TVAl2b2lkICpDT05TVAotI2RlZmluZQlMT05HX0RPVUJMRQlsb25nIGRvdWJsZQotCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZQlBTkQJCSwKLSNkZWZpbmUJTk9BUkdTCQl2b2lkCi0jZGVmaW5lCVZPTEFUSUxFCXZvbGF0aWxlCi0jZGVmaW5lCVNJR05FRAkJc2lnbmVkCi0jZW5kaWYgLyogISBJTl9HQ0MgKi8KLQotI2RlZmluZSBQQVJBTVMocGFyYW1saXN0KQkJcGFyYW1saXN0Ci0jZGVmaW5lIEFOU0lfUFJPVE9UWVBFUwkJCTEKLQotI2RlZmluZSBWUEFSQU1TKEFSR1MpCQkJQVJHUwotI2RlZmluZSBWQV9TVEFSVCh2YV9saXN0LHZhcikJCXZhX3N0YXJ0KHZhX2xpc3QsdmFyKQotCi0vKiBUaGVzZSBhcmUgb2Jzb2xldGUuICBEbyBub3QgdXNlLiAgKi8KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lIENPTlNUCQkJCWNvbnN0Ci0jZGVmaW5lIERPVFMJCQkJLCAuLi4KLSNkZWZpbmUgUFJPVE8odHlwZSwgbmFtZSwgYXJnbGlzdCkJdHlwZSBuYW1lIGFyZ2xpc3QKLSNkZWZpbmUgRVhGVU4obmFtZSwgcHJvdG8pCQluYW1lIHByb3RvCi0jZGVmaW5lIERFRlVOKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCW5hbWUoYXJncykKLSNkZWZpbmUgREVGVU5fVk9JRChuYW1lKQkJbmFtZSh2b2lkKQotI2VuZGlmIC8qICEgSU5fR0NDICovCi0KLSNlbHNlCS8qIE5vdCBBTlNJIEMuICAqLwotCi0jZGVmaW5lCVBUUgkJY2hhciAqCi0jZGVmaW5lCVBUUkNPTlNUCVBUUgotI2RlZmluZQlMT05HX0RPVUJMRQlkb3VibGUKLQotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUJQU5ECQk7Ci0jZGVmaW5lCU5PQVJHUwotI2RlZmluZQlWT0xBVElMRQotI2RlZmluZQlTSUdORUQKLSNlbmRpZiAvKiAhSU5fR0NDICovCi0KLSNpZm5kZWYgY29uc3QgLyogc29tZSBzeXN0ZW1zIGRlZmluZSBpdCBpbiBoZWFkZXIgZmlsZXMgZm9yIG5vbi1hbnNpIG1vZGUgKi8KLSNkZWZpbmUJY29uc3QKLSNlbmRpZgotCi0jZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpCQkoKQotCi0jZGVmaW5lIFZQQVJBTVMoQVJHUykJCQkodmFfYWxpc3QpIHZhX2RjbAotI2RlZmluZSBWQV9TVEFSVCh2YV9saXN0LHZhcikJCXZhX3N0YXJ0KHZhX2xpc3QpCi0KLS8qIFRoZXNlIGFyZSBvYnNvbGV0ZS4gIERvIG5vdCB1c2UuICAqLwotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUgQ09OU1QKLSNkZWZpbmUgRE9UUwotI2RlZmluZSBQUk9UTyh0eXBlLCBuYW1lLCBhcmdsaXN0KQl0eXBlIG5hbWUgKCkKLSNkZWZpbmUgRVhGVU4obmFtZSwgcHJvdG8pCQluYW1lKCkKLSNkZWZpbmUgREVGVU4obmFtZSwgYXJnbGlzdCwgYXJncykJbmFtZSBhcmdsaXN0IGFyZ3M7Ci0jZGVmaW5lIERFRlVOX1ZPSUQobmFtZSkJCW5hbWUoKQotI2VuZGlmIC8qICEgSU5fR0NDICovCi0KLSNlbmRpZgkvKiBBTlNJIEMuICAqLwotCi0vKiBEZWZpbmUgbWFjcm9zIGZvciBzb21lIGdjYyBhdHRyaWJ1dGVzLiAgVGhpcyBwZXJtaXRzIHVzIHRvIHVzZSB0aGUKLSAgIG1hY3JvcyBmcmVlbHksIGFuZCBrbm93IHRoYXQgdGhleSB3aWxsIGNvbWUgaW50byBwbGF5IGZvciB0aGUKLSAgIHZlcnNpb24gb2YgZ2NjIGluIHdoaWNoIHRoZXkgYXJlIHN1cHBvcnRlZC4gICovCi0KLSNpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KQotIyBkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQotI2VuZGlmCi0KLSNpZm5kZWYgQVRUUklCVVRFX1VOVVNFRF9MQUJFTAotIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA5MykKLSMgIGRlZmluZSBBVFRSSUJVVEVfVU5VU0VEX0xBQkVMCi0jIGVsc2UKLSMgIGRlZmluZSBBVFRSSUJVVEVfVU5VU0VEX0xBQkVMIEFUVFJJQlVURV9VTlVTRUQKLSMgZW5kaWYgLyogR05VQyA8IDIuOTMgKi8KLSNlbmRpZiAvKiBBVFRSSUJVVEVfVU5VU0VEX0xBQkVMICovCi0KLSNpZm5kZWYgQVRUUklCVVRFX1VOVVNFRAotI2RlZmluZSBBVFRSSUJVVEVfVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKLSNlbmRpZiAvKiBBVFRSSUJVVEVfVU5VU0VEICovCi0KLSNpZm5kZWYgQVRUUklCVVRFX05PUkVUVVJOCi0jZGVmaW5lIEFUVFJJQlVURV9OT1JFVFVSTiBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSkKLSNlbmRpZiAvKiBBVFRSSUJVVEVfTk9SRVRVUk4gKi8KLQotI2lmbmRlZiBBVFRSSUJVVEVfUFJJTlRGCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEYobSwgbikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAoX19wcmludGZfXywgbSwgbikpKQotI2RlZmluZSBBVFRSSUJVVEVfUFJJTlRGXzEgQVRUUklCVVRFX1BSSU5URigxLCAyKQotI2RlZmluZSBBVFRSSUJVVEVfUFJJTlRGXzIgQVRUUklCVVRFX1BSSU5URigyLCAzKQotI2RlZmluZSBBVFRSSUJVVEVfUFJJTlRGXzMgQVRUUklCVVRFX1BSSU5URigzLCA0KQotI2RlZmluZSBBVFRSSUJVVEVfUFJJTlRGXzQgQVRUUklCVVRFX1BSSU5URig0LCA1KQotI2RlZmluZSBBVFRSSUJVVEVfUFJJTlRGXzUgQVRUUklCVVRFX1BSSU5URig1LCA2KQotI2VuZGlmIC8qIEFUVFJJQlVURV9QUklOVEYgKi8KLQotI2VuZGlmCS8qIGFuc2lkZWNsLmgJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cgYi9pbmNsdWRlL2FvdXQvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2YxN2VjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotMTk5OS0wNy0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFvdXQ2NC5oIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUgYXMgMCBpZiBURVhUX1NUQVJUX0FERFIgaXMKLQlkZWZpbmVkIGFzIDAuCi0KLVN1biBKdW4gMjggMTE6MzM6NDggMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiBzdGFiLmRlZjogIEFkZCBOX0FMSUFTIGZyb20gU3VuUHJvIEY3Ny4KLQotTW9uIE1hciAxMSAxMjoxNTo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWIuZGVmOiBVc2UgX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUgcmF0aGVyIHRoYW4gX19kZWZpbmVfc3RhYgotCWZvciBkdXBsaWNhdGUgZW50cmllcyBOX0JST1dTIGFuZCBOX01PRDIuCi0JKiBzdGFiX2dudS5oIChfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSk6IERlZmluZSBiZWZvcmUgaW5jbHVkaW5nCi0Jc3RhYi5kZWYuCi0KLUZyaSBPY3QgMjcgMTc6NDc6MTYgMTk5NSAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogYW91dDY0LmgsIGhvc3QuaCwgaHAzMDBocHV4LmgsIHN1bjQuaDogQ2hhbmdlZCBQQUdFX1NJWkUgdG8KLQlUQVJHRVRfUEFHRV9TSVpFLgotCi1UdWUgU2VwIDEyIDEyOjA3OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3VuNC5oIChzdHJ1Y3QgaW50ZXJuYWxfc3VuNF9keW5hbWljX2xpbmspOiBDaGFuZ2UgYWxsIGZpZWxkcwotCWZyb20gbG9uZyB0byB1bnNpZ25lZCBsb25nLgotCi1XZWQgSnVsIDEyIDAwOjE1OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiBzdW40LmggKFBBR0VfU0laRSk6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbmluZy4KLQotVGh1IEp1biAxNiAxNDoyMjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChCTUFHSUMpOiBEZWZpbmUuCi0KLVNhdCBKdW4gMTEgMTY6MTY6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIHdlYWsgc3ltYm9scyBhcyBhbiBleHRlbnNpb24gdG8gYS5vdXQuCi0JKiBhb3V0NjQuaCAoTl9XRUFLVSwgTl9XRUFLQSwgTl9XRUFLVCwgTl9XRUFLRCwgTl9XRUFLQik6IERlZmluZS4KLQkqIHN0YWIuZGVmOiBVcGRhdGUgc3ltYm9sIHZhbHVlIHRhYmxlLgotCi1UaHUgSnVuICAyIDE3OjEzOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3VuNC5oIChFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSk6IENvcnJlY3QgZnJvbSAyOCB0bwotCTI0LiAgRml4IHVwIGxkX2dvdCBjb21tZW50LgotCi1XZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZHluaXgzLmg6ICBDbGVhbnVwLCBhZGFwdCB0byBjdXJyZW50IGJmZCB2ZXJzaW9uLgotCi1TYXQgRmViIDI2IDEwOjI1OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW91dDY0Lmg6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuCi0KLUZyaSBGZWIgMTEgMTI6NTY6MDQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhci5oIChBUk1BRywgQVJNQUdCLCBBUkZNQUcpOiBDaGFuZ2UgJ1xuJyB0byAnXDAxMicsIGZvciBncmVhdGVyCi0JcG9ydGFiaWxpdHkuCi0KLUZyaSBKYW4gMjEgMDA6NTk6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdW40Lmg6IEFkZGVkIGluZm9ybWF0aW9uIGFib3V0IFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuCi0KLUZyaSBKYW4gIDcgMDg6MjA6MTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChOX1RYVEFERFIpOiBBZGQgY29tbWVudCByZWdhcmRpbmcgT01BR0lDIGFuZCBOTUFHSUMuCi0KLVNhdCBEZWMgMjUgMTQ6NTU6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChOX0RBVE9GRik6IERvbid0IHBhZCAocmV2ZXJ0IGNoYW5nZSBvZiA4IEp1bCAxOTkzKS4KLQotVHVlIE5vdiAxNiAxNTo0Mzo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dDY0Lmg6IE5ldyBtYWNyb3MgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSBhbmQgTl9ESVNLX0JMT0NLX1NJWkUKLQlmb3IgTGludXggWk1BR0lDLgotCShOX1RYVE9GRiwgTl9EQVRPRkYpOiBVc2UgdGhlbS4KLQotVGh1IE5vdiAgNCAwMDozMzo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSk6IEZpeGVkIHZhbHVlIHRvIG1hdGNoCi0Jc3VuMyBzeXN0ZW07IHVzZWQgdG8gb3ZlcmxhcCBvdGhlciBmaWVsZHMuCi0JKFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSk6IExpa2V3aXNlLgotCi1XZWQgTm92ICAzIDEzOjQ4OjI3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKTogTWFrZSBpdCAweDEwIChLZW4ncwotCXN1Z2dlc3Rpb24pIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRS4KLQotRnJpIE9jdCAyOSAxNTowOTo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGhwMzAwaHB1eC5oIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUgdG8gYmUgMC4KLQotTW9uIFNlcCAxMyAyMTowMDo1NiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYXIuaCAoQVJNQVBfVElNRV9PRkZTRVQpOiAgQWRkIGFuZCBkZXNjcmliZS4KLQotTW9uIEF1ZyAyMyAgU2VhbiBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCBbQVJDSF9TSVpFICE9IDY0XTogQWxsb3cgTl9CQURNQUcgdG8gYmUgb3ZlcnJpZGRlbi4KLQotTW9uIEF1ZyAxNiAxNDozMDoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3RhYl9nbnUuaDogSW5jbHVkZSBhb3V0L3N0YWIuZGVmIG5vdCBqdXN0IHN0YWIuZGVmLgotCi1TdW4gSnVsIDE4IDIxOjQxOjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogZHluaXgzLmg6IE5ldywgZm9yIHN5bW1ldHJ5IHJ1bm5pbmcgZHluaXguCi0KLVRodSBKdWwgIDggMTI6NTI6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChOX0JBRE1BRyk6IFJlY29nbml6ZSBRTUFHSUMuCi0JTl9UWFRPRkYsIE5fVFhUQUREUiwgTl9UWFRTSVpFOiBTcGVjaWFsIGNvZGUgZm9yIFFNQUdJQy4KLQlOX0RBVE9GRjogUGFkIHRleHQgc2l6ZSBpZiB3ZSBuZWVkIHRvLgotCi1GcmkgSnVuIDE4IDE5OjE5OjM4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZiAoTl9FQ09NTCk6IEZpeCBjb21tZW50LgotCi1Nb24gTWF5IDMxIDA5OjIxOjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZjogUmVtb3ZlIFNvbGFyaXMgaW5mb3JtYXRpb24gb24gTl9GVU4gc3RhYnN0cmluZyBncmFtbWFyOwotCUkndmUgdHJhbnNmZXJyZWQgaXQgdG8gZ2RiL2RvYy9zdGFicy50ZXhpbmZvLCB3aGVyZSBpdCBiZWxvbmdzLgotCi1Nb24gTWF5IDEwIDA1OjQ4OjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguaDogUGF0Y2ggZnJvbSBHbGVubiBFbmdlbCBmb3IgbGlua2VyIHByb2JsZW0gYW5kCi0JY29tcGF0aWJpbGl0eSBmaXg6Ci0JKE9NQUdJQywgTk1BR0lDKTogTmV3IGRlZmluaXRpb25zLgotCShTSEFSRU1BR0lDKTogRGVsZXRlZC4KLQkoSFBVWF9ET1RfT19NQUdJQyk6IE5ldyBtYWNyby4KLQkoX05fQkFETUFHKTogQWRqdXN0ZWQuCi0JKE5fSEVBREVSX0lOX1RFWFQsIE5fREFUQUREUik6IE5ldyBtYWNyb3MuCi0KLVRodSBBcHIgMjkgMTI6MDc6MzcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwMzAwaHB1eC5oOiBOZXcgZmlsZSBmcm9tIEdsZW5uIEVuZ2VsLCBnbGVubmVAbHNpZC5ocC5jb20uCi0KLVR1ZSBBcHIgMjcgMDU6NTE6MDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYywgKk1BR0lDLCBOX0JBRE1BRyk6IERvbid0IGRlZmluZQotCWlmIGBleHRlcm5hbF9leGVjJyBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBtYWNyby4KLQkoTl9EQVRPRkYsIE5fVFJFTE9GRiwgTl9EUkVMT0ZGLCBOX1NZTU9GRiwgTl9TVFJPRkYpOiBEb24ndCBkZWZpbmUKLQlpZiBhbHJlYWR5IGRlZmluZWQuCi0JKHN0cnVjdCBleHRlcm5hbF9ubGlzdCwgRVhURVJOQUxfTkxJU1RfU0laRSk6IERvbid0IGRlZmluZSBpZgotCWBleHRlcm5hbF9ubGlzdCcgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgbWFjcm8uCi0KLVNhdCBBdWcgMTUgMDQ6MjM6MDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFkb2JlLmg6ICBBZGQgZGVzY3JpcHRpb24gb2YgYS5vdXQuYWRvYmUgZm9ybWF0LgotCi1GcmkgSnVsICAzIDAwOjM2OjUyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZjogIFVwZGF0ZSBtb3JlIFNvbGFyaXMgZGVmaW5pdGlvbnMuCi0JKiBzdGFiX2dudS5oOiAgQWRkIE5fU08gbGFuZ3VhZ2UgdHlwZXMsIGFuZCBTb2xhcmlzIGJhc2ljIGZsb2F0IHR5cGVzLgotCi1TdW4gSnVuIDE0IDEwOjUzOjUzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZjogIFVwZGF0ZSBkZXNjcmlwdGlvbnMgb2YgU29sYXJpcy0yIHN0YWJzOyBhZGQgTl9VTkRGLgotCi1UaHUgSnVuIDExIDAxOjEyOjA3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZjogIEFkZCBOX09CSiBhbmQgTl9PUFQgZnJvbSBTb2xhcmlzLTIuCi0KLVRodSBKYW4gMzAgMTg6MTI6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQvYW91dDY0Lmg6IE5fVFhUU0laRSBuZWVkcyBzb21lIG1vcmUgcGFyZW50aGVzZXMuCi0JSSBkb24ndCB0cnVzdCBDIHByZWNlZGVuY2UuCi0KLVdlZCBEZWMgMTggMTQ6MzI6MDEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQvYW91dDY0Lmg6ICBNb3ZlIGNvbW1vbiBzdW5vcy1zcGVjaWZpYyB0ZXN0Ci0JdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMgaW50byBuZXcgbWFjcm8gTl9TSEFSRURfTElCLgotCVVzZSBpdCB0byBzaW1wbGlmeSZyZWZvcm1hdCBOX1RYVEFERFIsIE5fVFhUT0ZGLCBOX1RYVFNJWkUuCi0KLVNhdCBOb3YgMzAgMjA6MzQ6NTIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIENoYW5nZUxvZywgYW91dDY0LmgsIGFyLmgsIGVuY2FwLmgsIGhvc3QuaCwgaHAuaCwgcmFubGliLmgsCi0JcmVsb2MuaCwgc3RhYi5kZWYsIHN0YWJfZ251LmgsIHN1bjQuaDogQWxsIG1vdmVkIGZyb20gdGhlCi0JZGV2by9pbmNsdWRlIGRpcmVjdG9yeQotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvYWRvYmUuaCBiL2luY2x1ZGUvYW91dC9hZG9iZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJmMTVjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9hZG9iZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qIGBhLm91dC5hZG9iZScgZGlmZmVyZW5jZXMgZnJvbSBzdGFuZGFyZCBhLm91dCBmaWxlcyAqLwotCi0jaWZuZGVmIF9fQV9PVVRfQURPQkVfSF9fCi0jZGVmaW5lIF9fQV9PVVRfQURPQkVfSF9fCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0KLS8qIFN0cnVjdCBleHRlcm5hbF9leGVjIGlzIHRoZSBzYW1lLiAgKi8KLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IG9uIGRpc2sgb2YgdGhlIDMyLWJpdCBvciA2NC1iaXQgZXhlYyBoZWFkZXIuICovCi0KLXN0cnVjdCBleHRlcm5hbF9leGVjIAotewotICBiZmRfYnl0ZSBlX2luZm9bNF07CQkvKiBtYWdpYyBudW1iZXIgYW5kIHN0dWZmCQkqLwotICBiZmRfYnl0ZSBlX3RleHRbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiB0ZXh0IHNlY3Rpb24gaW4gYnl0ZXMJKi8KLSAgYmZkX2J5dGUgZV9kYXRhW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSBzZWN0aW9uIGluIGJ5dGVzCSovCi0gIGJmZF9ieXRlIGVfYnNzW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgYnNzIGFyZWEgaW4gYnl0ZXMgCQkqLwotICBiZmRfYnl0ZSBlX3N5bXNbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgaW4gYnl0ZXMgCSovCi0gIGJmZF9ieXRlIGVfZW50cnlbQllURVNfSU5fV09SRF07IC8qIHN0YXJ0IGFkZHJlc3MgCQkJKi8KLSAgYmZkX2J5dGUgZV90cnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiB0ZXh0IHJlbG9jYXRpb24gaW5mbwkqLwotICBiZmRfYnl0ZSBlX2Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvIAkqLwotfTsKLQotI2RlZmluZQlFWEVDX0JZVEVTX1NJWkUJKDQgKyBCWVRFU19JTl9XT1JEICogNykKLQotLyogTWFnaWMgbnVtYmVycyBmb3IgYS5vdXQgZmlsZXMgKi8KLQotI3VuZGVmCVpNQUdJQwotI2RlZmluZQlaTUFHSUMJMHhBRDBCRQkJLyogQ3V0ZSwgZWg/ICAqLwotI3VuZGVmCU9NQUdJQwotI3VuZGVmCU5NQUdJQwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSAgKCh4KS5hX2luZm8gIT0gWk1BR0lDKQotCi0vKiBCeSBkZWZhdWx0LCBzZWdtZW50IHNpemUgaXMgY29uc3RhbnQuICBCdXQgc29tZSBtYWNoaW5lcyBvdmVycmlkZSB0aGlzCi0gICB0byBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBhLm91dCBoZWFkZXIgKGUuZy4gbWFjaGluZSB0eXBlKS4gICovCi0jaWZuZGVmCU5fU0VHU0laRQotI2RlZmluZQlOX1NFR1NJWkUoeCkJU0VHTUVOVF9TSVpFCi0jZW5kaWYKLSN1bmRlZiBOX1NFR1NJWkUgICAvKiBGSVhNRVhYWFggKi8KLQotLyogU2VnbWVudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGEub3V0LkFkb2JlIGZvcm1hdCBpcyBzcGVjaWZpZWQgYWZ0ZXIgdGhlCi0gICBmaWxlIGhlYWRlci4gIEl0IGNvbnRhaW5zIE4gc2VnbWVudCBkZXNjcmlwdG9ycywgZm9sbG93ZWQgYnkgb25lIHdpdGgKLSAgIGEgdHlwZSBvZiB6ZXJvLiAgCi0KLSAgIFRoZSBhY3R1YWwgdGV4dCBvZiB0aGUgc2VnbWVudHMgc3RhcnRzIGF0IE5fVFhUT0ZGIGluIHRoZSBmaWxlLAotICAgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBvciBob3cgZmV3IHNlZ21lbnQgaGVhZGVycyB0aGVyZSBhcmUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2VnZGVzYyB7Ci0JdW5zaWduZWQgY2hhciBlX3R5cGVbMV07Ci0JdW5zaWduZWQgY2hhciBlX3NpemVbM107Ci0JdW5zaWduZWQgY2hhciBlX3ZpcnRiYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9maWxlYmFzZVs0XTsKLX07Ci0KLXN0cnVjdCBpbnRlcm5hbF9zZWdkZXNjIHsKLQl1bnNpZ25lZCBpbnQJYV90eXBlOjg7CS8qIFNlZ21lbnQgdHlwZSBOX1RFWFQsIE5fREFUQSwgMCAqLwotCXVuc2lnbmVkIGludCAJYV9zaXplOjI0OwkvKiBTZWdtZW50IHNpemUgKi8KLQliZmRfdm1hCQlhX3ZpcnRiYXNlOwkvKiBWaXJ0dWFsIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBpbnQJYV9maWxlYmFzZTsJLyogQmFzZSBhZGRyZXNzIGluIG9iamVjdCBmaWxlICovCi19OwotCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0KLS8qIFRoaXMgaXMgZG9jdW1lbnRlZCB0byBiZSBhdCAxMDI0LCBidXQgYXBwZWFycyB0byByZWFsbHkgYmUgYXQgMjA0OC4KLSAgIEZJWE1FPyEgICovCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCTIwNDgKLQotI2RlZmluZQlOX1RYVFNJWkUoeCkgKCh4KS5hX3RleHQpCi0KLSNkZWZpbmUgTl9EQVRBRERSKHgpCi0KLSNkZWZpbmUgTl9CU1NBRERSKHgpCi0KLS8qIE9mZnNldHMgb2YgdGhlIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIGZpbGUgYWZ0ZXIgdGhlIHRleHQgc2VnbWVudC4gICovCi0KLSNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArIE5fVFhUU0laRSh4KSApCi0jZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplICkKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotDAotLyogU3ltYm9scyAqLwotc3RydWN0IGV4dGVybmFsX25saXN0IHsKLSAgYmZkX2J5dGUgZV9zdHJ4W0JZVEVTX0lOX1dPUkRdOwkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIGJmZF9ieXRlIGVfdHlwZVsxXTsJCQkvKiB0eXBlIG9mIHN5bWJvbCAqLwotICBiZmRfYnl0ZSBlX290aGVyWzFdOwkJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgYmZkX2J5dGUgZV9kZXNjWzJdOwkJCS8qIGRlc2NyaXB0aW9uIGZpZWxkICovCi0gIGJmZF9ieXRlIGVfdmFsdWVbQllURVNfSU5fV09SRF07CS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLQotI2RlZmluZSBFWFRFUk5BTF9OTElTVF9TSVpFIChCWVRFU19JTl9XT1JEKzQrQllURVNfSU5fV09SRCkKLQotc3RydWN0IGludGVybmFsX25saXN0IHsKLSAgdW5zaWduZWQgbG9uZyBuX3N0cng7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgb2YgbmFtZSAqLwotICB1bnNpZ25lZCBjaGFyIG5fdHlwZTsJCQkvKiB0eXBlIG9mIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyIG5fb3RoZXI7CQkvKiBtaXNjIGluZm8gKHVzdWFsbHkgZW1wdHkpICovCi0gIHVuc2lnbmVkIHNob3J0IG5fZGVzYzsJCS8qIGRlc2NyaXB0aW9uIGZpZWxkICovCi0gIGJmZF92bWEgbl92YWx1ZTsJCQkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLX07Ci0KLS8qIFRoZSBuX3R5cGUgZmllbGQgaXMgdGhlIHN5bWJvbCB0eXBlLCBjb250YWluaW5nOiAgKi8KLQotI2RlZmluZSBOX1VOREYJMAkvKiBVbmRlZmluZWQgc3ltYm9sICovCi0jZGVmaW5lIE5fQUJTIAkyCS8qIEFic29sdXRlIHN5bWJvbCAtLSBkZWZpbmVkIGF0IHBhcnRpY3VsYXIgYWRkciAqLwotI2RlZmluZSBOX1RFWFQgCTQJLyogVGV4dCBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gdGV4dCBzZWcgKi8KLSNkZWZpbmUgTl9EQVRBIAk2CS8qIERhdGEgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIGRhdGEgc2VnICovCi0jZGVmaW5lIE5fQlNTIAk4CS8qIEJTUyAgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHplcm8nZCBzZWcgKi8KLSNkZWZpbmUJTl9DT01NCTB4MTIJLyogQ29tbW9uIHN5bWJvbCAodmlzaWJsZSBhZnRlciBzaGFyZWQgbGliIGR5bmxpbmspICovCi0jZGVmaW5lIE5fRk4JMHgxZgkvKiBGaWxlIG5hbWUgb2YgLm8gZmlsZSAqLwotI2RlZmluZQlOX0ZOX1NFUSAweDBDCS8qIE5fRk4gZnJvbSBTZXF1ZW50IGNvbXBpbGVycyAoc2lnaCkgKi8KLS8qIE5vdGU6IE5fRVhUIGNhbiBvbmx5IGJlIHVzZWZ1bGx5IE9SLWVkIHdpdGggTl9VTkRGLCBOX0FCUywgTl9URVhULAotICAgTl9EQVRBLCBvciBOX0JTUy4gIFdoZW4gdGhlIGxvdy1vcmRlciBiaXQgb2Ygb3RoZXIgdHlwZXMgaXMgc2V0LAotICAgKGUuZy4gTl9XQVJOSU5HIHZlcnN1cyBOX0ZOKSwgdGhleSBhcmUgdHdvIGRpZmZlcmVudCB0eXBlcy4gICovCi0jZGVmaW5lIE5fRVhUIAkxCS8qIEV4dGVybmFsIHN5bWJvbCAoYXMgb3Bwb3NlZCB0byBsb2NhbC10by10aGlzLWZpbGUpICovCi0jZGVmaW5lIE5fVFlQRSAgMHgxZQotI2RlZmluZSBOX1NUQUIgCTB4ZTAJLyogSWYgYW55IG9mIHRoZXNlIGJpdHMgYXJlIG9uLCBpdCdzIGEgZGVidWcgc3ltYm9sICovCi0KLSNkZWZpbmUgTl9JTkRSIDB4MGEKLQotLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KLSAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgotICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAotICAgZWxlbWVudHMgdmFsdWUgaXMgc3RvcmVkIGludG8gb25lIHdvcmQgb2YgdGhlIHNwYWNlLgotICAgVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNwYWNlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNldCAobnVtYmVyIG9mIGVsZW1lbnRzKS4KLQotICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHNldCBpcyBtYWRlIGludG8gYW4gTl9TRVRWIHN5bWJvbAotICAgd2hvc2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgc2V0LgotICAgVGhpcyBzeW1ib2wgYWN0cyBsaWtlIGEgTl9EQVRBIGdsb2JhbCBzeW1ib2wKLSAgIGluIHRoYXQgaXQgY2FuIHNhdGlzZnkgdW5kZWZpbmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotCi0vKiBUaGVzZSBhcHBlYXIgYXMgaW5wdXQgdG8gTEQsIGluIGEgLm8gZmlsZS4gICovCi0jZGVmaW5lCU5fU0VUQQkweDE0CQkvKiBBYnNvbHV0ZSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRUCTB4MTYJCS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VURAkweDE4CQkvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEIJMHgxQQkJLyogQnNzIHNldCBlbGVtZW50IHN5bWJvbCAqLwotCi0vKiBUaGlzIGlzIG91dHB1dCBmcm9tIExELiAgKi8KLSNkZWZpbmUgTl9TRVRWCTB4MUMJCS8qIFBvaW50ZXIgdG8gc2V0IHZlY3RvciBpbiBkYXRhIGFyZWEuICAqLwotCi0vKiBXYXJuaW5nIHN5bWJvbC4gVGhlIHRleHQgZ2l2ZXMgYSB3YXJuaW5nIG1lc3NhZ2UsIHRoZSBuZXh0IHN5bWJvbAotICAgaW4gdGhlIHRhYmxlIHdpbGwgYmUgdW5kZWZpbmVkLiBXaGVuIHRoZSBzeW1ib2wgaXMgcmVmZXJlbmNlZCwgdGhlCi0gICBtZXNzYWdlIGlzIHByaW50ZWQuICAqLwotCi0jZGVmaW5lCU5fV0FSTklORyAweDFlCi0KLS8qIFJlbG9jYXRpb25zIAotCi0gIFRoZXJlCWFyZSB0d28gdHlwZXMgb2YgcmVsb2NhdGlvbiBmbGF2b3VycyBmb3IgYS5vdXQgc3lzdGVtcywKLSAgc3RhbmRhcmQgYW5kIGV4dGVuZGVkLiBUaGUgc3RhbmRhcmQgZm9ybSBpcyB1c2VkIG9uIHN5c3RlbXMgd2hlcmUgdGhlCi0gIGluc3RydWN0aW9uIGhhcyByb29tIGZvciBhbGwgdGhlIGJpdHMgb2YgYW4gb2Zmc2V0IHRvIHRoZSBvcGVyYW5kLCB3aGlsc3QKLSAgdGhlIGV4dGVuZGVkIGZvcm0gaXMgdXNlZCB3aGVuIGFuIGFkZHJlc3Mgb3BlcmFuZCBoYXMgdG8gYmUgc3BsaXQgb3ZlciBuCi0gIGluc3RydWN0aW9ucy4gRWcsIG9uIHRoZSA2OGssIGVhY2ggbW92ZSBpbnN0cnVjdGlvbiBjYW4gcmVmZXJlbmNlCi0gIHRoZSB0YXJnZXQgd2l0aCBhIGRpc3BsYWNlbWVudCBvZiAxNiBvciAzMiBiaXRzLiBPbiB0aGUgc3BhcmMsIG1vdmUKLSAgaW5zdHJ1Y3Rpb25zIHVzZSBhbiBvZmZzZXQgb2YgMTQgYml0cywgc28gdGhlIG9mZnNldCBpcyBzdG9yZWQgaW4KLSAgdGhlIHJlbG9jIGZpZWxkLCBhbmQgdGhlIGRhdGEgaW4gdGhlIHNlY3Rpb24gaXMgaWdub3JlZC4KLSovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHNpbmdsZSByZWxvY2F0aW9uIHRvIGJlIHBlcmZvcm1lZC4KLSAgIFRoZSB0ZXh0LXJlbG9jYXRpb24gc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBhIHZlY3RvciBvZiB0aGVzZSBzdHJ1Y3R1cmVzLAotICAgYWxsIG9mIHdoaWNoIGFwcGx5IHRvIHRoZSB0ZXh0IHNlY3Rpb24uCi0gICBMaWtld2lzZSwgdGhlIGRhdGEtcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gdGhlIGRhdGEgc2VjdGlvbi4gICovCi0KLXN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgewotICBiZmRfYnl0ZSByX2FkZHJlc3NbQllURVNfSU5fV09SRF07CS8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlICovCi0gIGJmZF9ieXRlIHJfaW5kZXhbM107CS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGJmZF9ieXRlIHJfdHlwZVsxXTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUENSRUxfQklHCTB4ODAKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFCTB4MDEKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfQklHCTB4NjAKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRwk1CS8qIFRvIHNoaWZ0IHRvIHVuaXRzIHBsYWNlICovCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUJMHgwNgotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFCTEKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCTB4MTAKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQkweDA4Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcJMHgwOAotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRQkweDA4Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHCTB4MDQKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFCTB4MDQKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcJMHgwMgotI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUJMHgwMgotCi0jZGVmaW5lCVJFTE9DX1NURF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEpCQkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2ludGVybmFsCi17Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogQWRkcmVzcyAod2l0aGluIHNlZ21lbnQpIHRvIGJlIHJlbG9jYXRlZC4gICovCi0gIC8qIFRoZSBtZWFuaW5nIG9mIHJfc3ltYm9sbnVtIGRlcGVuZHMgb24gcl9leHRlcm4uICAqLwotICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7Ci0gIC8qIE5vbnplcm8gbWVhbnMgdmFsdWUgaXMgYSBwYy1yZWxhdGl2ZSBvZmZzZXQKLSAgICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCi0gICAgIGFzIHdlbGwgYXMgZm9yIGNoYW5nZXMgaW4gdGhlIHN5bWJvbCBvciBzZWN0aW9uIHNwZWNpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCByX3BjcmVsOjE7Ci0gIC8qIExlbmd0aCAoYXMgZXhwb25lbnQgb2YgMikgb2YgdGhlIGZpZWxkIHRvIGJlIHJlbG9jYXRlZC4KLSAgICAgVGh1cywgYSB2YWx1ZSBvZiAyIGluZGljYXRlcyAxPDwyIGJ5dGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7Ci0gIC8qIDEgPT4gcmVsb2NhdGUgd2l0aCB2YWx1ZSBvZiBzeW1ib2wuCi0gICAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCi0gICAgIGluIGZpbGVzIHRoZSBzeW1ib2wgdGFibGUuCi0gICAgIDAgPT4gcmVsb2NhdGUgd2l0aCB0aGUgYWRkcmVzcyBvZiBhIHNlZ21lbnQuCi0gICAgIHJfc3ltYm9sbnVtIGlzIE5fVEVYVCwgTl9EQVRBLCBOX0JTUyBvciBOX0FCUwotICAgICAodGhlIE5fRVhUIGJpdCBtYXkgYmUgc2V0IGFsc28sIGJ1dCBzaWduaWZpZXMgbm90aGluZykuICAqLwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogVGhlIG5leHQgdGhyZWUgYml0cyBhcmUgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBzZWVtIHRvCi0gICAgIGJlIHVuZG9jdW1lbnRlZC4gICovCi0gIHVuc2lnbmVkIGludCByX2Jhc2VyZWw6MTsJLyogTGlua2FnZSB0YWJsZSByZWxhdGl2ZSAqLwotICB1bnNpZ25lZCBpbnQgcl9qbXB0YWJsZToxOwkvKiBwYy1yZWxhdGl2ZSB0byBqdW1wIHRhYmxlICovCi0gIHVuc2lnbmVkIGludCByX3JlbGF0aXZlOjE7CS8qICJyZWxhdGl2ZSByZWxvY2F0aW9uIiAqLwotICAvKiB1bnVzZWQgKi8KLSAgdW5zaWduZWQgaW50IHJfcGFkOjE7CQkvKiBQYWRkaW5nIC0tIHNldCB0byB6ZXJvICovCi19OwotCi0KLS8qIEVYVEVOREVEIFJFTE9DUyAgKi8KLQotc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlIHJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGJmZF9ieXRlIHJfaW5kZXhbM107CS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGJmZF9ieXRlIHJfdHlwZVsxXTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX2J5dGUgcl9hZGRlbmRbQllURVNfSU5fV09SRF07CS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCTB4ODAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcJCTB4MUYKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcJMAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRQkweEY4Ci0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFCTMKLQotLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KLSNkZWZpbmUJUkVMT0NfRVhUX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSArIEJZVEVTX0lOX1dPUkQpCi0KLWVudW0gcmVsb2NfdHlwZQotewotICAvKiBzaW1wbGUgcmVsb2NhdGlvbnMgKi8KLSAgUkVMT0NfOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgKyBzdiAJCSovCi0gIFJFTE9DXzE2LAkJCS8qIGRhdGFbMDoxNV0gPSBhZGRlbmQgKyBzdiAJCSovCi0gIFJFTE9DXzMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgKyBzdiAJCSovCi0gIC8qIHBjLXJlbCBkaXNwbGFjZW1lbnQgKi8KLSAgUkVMT0NfRElTUDgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfRElTUDE2LAkJCS8qIGRhdGFbMDoxNV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19ESVNQMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIC8qIFNwZWNpYWwgKi8KLSAgUkVMT0NfV0RJU1AzMCwJCS8qIGRhdGFbMDoyOV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX1dESVNQMjIsCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19ISTIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpPj4xMCAJKi8KLSAgUkVMT0NfMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgCQkqLwotICBSRUxPQ18xMywJCQkvKiBkYXRhWzA6MTJdID0gKGFkZGVuZCArIHN2KQkJKi8KLSAgUkVMT0NfTE8xMCwJCQkvKiBkYXRhWzA6OV0gPSAoYWRkZW5kICsgc3YpCQkqLwotICBSRUxPQ19TRkFfQkFTRSwJCQotICBSRUxPQ19TRkFfT0ZGMTMsCi0gIC8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgUkVMT0NfQkFTRTEwLCAgCQkvKiBOb3Qgc3VyZSAtIG1heWJlIHdlIGNhbiBkbyB0aGlzIHRoZSAqLwotICBSRUxPQ19CQVNFMTMsCQkJLyogcmlnaHQgd2F5IG5vdyAqLwotICBSRUxPQ19CQVNFMjIsCi0gIC8qIGZvciBzb21lIHNvcnQgb2YgcGMtcmVsIFAuSS5DLiAoPykgKi8KLSAgUkVMT0NfUEMxMCwKLSAgUkVMT0NfUEMyMiwKLSAgLyogUC5JLkMuIGp1bXAgdGFibGUgKi8KLSAgUkVMT0NfSk1QX1RCTCwKLSAgLyogcmVwdXRlZGx5IGZvciBzaGFyZWQgbGlicmFyaWVzIHNvbWVob3cgKi8KLSAgUkVMT0NfU0VHT0ZGMTYsCi0gIFJFTE9DX0dMT0JfREFULAotICBSRUxPQ19KTVBfU0xPVCwKLSAgUkVMT0NfUkVMQVRJVkUsCi0KLSAgUkVMT0NfMTEsCQotICBSRUxPQ19XRElTUDJfMTQsCi0gIFJFTE9DX1dESVNQMTksCi0gIFJFTE9DX0hISTIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpID4+IDQyICAgICAqLwotICBSRUxPQ19ITE8xMCwJCQkvKiBkYXRhWzA6OV0gPSAoYWRkZW5kICsgc3YpID4+IDMyICAgICAgKi8KLSAgCi0gIC8qIDI5SyByZWxvY2F0aW9uIHR5cGVzICovCi0gIFJFTE9DX0pVTVBUQVJHLAotICBSRUxPQ19DT05TVCwKLSAgUkVMT0NfQ09OU1RILAotICAKLSAgTk9fUkVMT0MKLSAgfTsKLQotCi1zdHJ1Y3QgcmVsb2NfaW50ZXJuYWwgewotICBiZmRfdm1hIHJfYWRkcmVzczsJCS8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlIAkqLwotICBsb25nCXJfaW5kZXg7CQkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotICBiZmRfdm1hIHJfYWRkZW5kOwkJLyogZGF0dW0gYWRkZW5kCQkJCSovCi19OwotCi0jZW5kaWYJCQkJLyogX19BX09VVF9BRE9CRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9hb3V0NjQuaCBiL2luY2x1ZGUvYW91dC9hb3V0NjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NDNjNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvYW91dDY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyogYGEub3V0JyBvYmplY3QtZmlsZSBkZWZpbml0aW9ucywgaW5jbHVkaW5nIGV4dGVuc2lvbnMgdG8gNjQtYml0IGZpZWxkcyAqLwotCi0jaWZuZGVmIF9fQV9PVVRfNjRfSF9fCi0jZGVmaW5lIF9fQV9PVVRfNjRfSF9fCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBvbiBkaXNrIG9mIHRoZSAzMi1iaXQgb3IgNjQtYml0IGV4ZWMgaGVhZGVyLiAqLwotCi0jaWZuZGVmIGV4dGVybmFsX2V4ZWMKLXN0cnVjdCBleHRlcm5hbF9leGVjIAotewotICBiZmRfYnl0ZSBlX2luZm9bNF07CQkvKiBtYWdpYyBudW1iZXIgYW5kIHN0dWZmCQkqLwotICBiZmRfYnl0ZSBlX3RleHRbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiB0ZXh0IHNlY3Rpb24gaW4gYnl0ZXMJKi8KLSAgYmZkX2J5dGUgZV9kYXRhW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSBzZWN0aW9uIGluIGJ5dGVzCSovCi0gIGJmZF9ieXRlIGVfYnNzW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgYnNzIGFyZWEgaW4gYnl0ZXMgCQkqLwotICBiZmRfYnl0ZSBlX3N5bXNbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgaW4gYnl0ZXMgCSovCi0gIGJmZF9ieXRlIGVfZW50cnlbQllURVNfSU5fV09SRF07IC8qIHN0YXJ0IGFkZHJlc3MgCQkJKi8KLSAgYmZkX2J5dGUgZV90cnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiB0ZXh0IHJlbG9jYXRpb24gaW5mbwkqLwotICBiZmRfYnl0ZSBlX2Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvIAkqLwotfTsKLQotI2RlZmluZQlFWEVDX0JZVEVTX1NJWkUJKDQgKyBCWVRFU19JTl9XT1JEICogNykKLQotLyogTWFnaWMgbnVtYmVycyBmb3IgYS5vdXQgZmlsZXMgKi8KLQotI2lmIEFSQ0hfU0laRT09NjQKLSNkZWZpbmUgT01BR0lDIDB4MTAwMQkJLyogQ29kZSBpbmRpY2F0aW5nIG9iamVjdCBmaWxlICAqLwotI2RlZmluZSBaTUFHSUMgMHgxMDAyCQkvKiBDb2RlIGluZGljYXRpbmcgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBOTUFHSUMgMHgxMDAzCQkvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KLQotLyogVGhlcmUgaXMgbm8gNjQtYml0IFFNQUdJQyBhcyBmYXIgYXMgSSBrbm93LiAgKi8KLQotI2RlZmluZSBOX0JBRE1BRyh4KQkgIChOX01BR0lDKHgpICE9IE9NQUdJQwkJXAotCQkJJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLSAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMpCi0jZWxzZQotI2RlZmluZSBPTUFHSUMgMDQwNwkJLyogLi4ub2JqZWN0IGZpbGUgb3IgaW1wdXJlIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBOTUFHSUMgMDQxMAkJLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIFpNQUdJQyAwNDEzCQkvKiBDb2RlIGluZGljYXRpbmcgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBCTUFHSUMgMDQxNQkJLyogVXNlZCBieSBhIGIub3V0IG9iamVjdC4gICovCi0KLS8qIFRoaXMgaW5kaWNhdGVzIGEgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUgd2l0aCB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LgotICAgSXQgaXMgdXNlZCBieSAzODZCU0QgKGFuZCB2YXJpYW50cykgYW5kIExpbnV4LCBhdCBsZWFzdC4gICovCi0jaWZuZGVmIFFNQUdJQwotI2RlZmluZSBRTUFHSUMgMDMxNAotI2VuZGlmCi0jIGlmbmRlZiBOX0JBRE1BRwotIyAgZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCi0JCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQyBcCi0JCSAgICAgICAgJiYgTl9NQUdJQyh4KSAhPSBRTUFHSUMpCi0jIGVuZGlmIC8qIE5fQkFETUFHICovCi0jZW5kaWYKLQotI2VuZGlmCi0KLSNpZmRlZiBRTUFHSUMKLSNkZWZpbmUgTl9JU19RTUFHSUMoeCkgKE5fTUFHSUMgKHgpID09IFFNQUdJQykKLSNlbHNlCi0jZGVmaW5lIE5fSVNfUU1BR0lDKHgpICgwKQotI2VuZGlmCi0KLS8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gVEFSR0VUX1BBR0VfU0laRSBhbmQgTl9TRUdTSVpFIGlzIHRoYXQgVEFSR0VUX1BBR0VfU0laRSBpcwotICAgdGhlIGZpbmVzdCBncmFudWxhcml0eSBhdCB3aGljaCB5b3UgY2FuIHBhZ2Ugc29tZXRoaW5nLCB0aHVzIGl0Ci0gICBjb250cm9scyB0aGUgcGFkZGluZyAoaWYgYW55KSBiZWZvcmUgdGhlIHRleHQgc2VnbWVudCBvZiBhIFpNQUdJQwotICAgZmlsZS4gIE5fU0VHU0laRSBpcyB0aGUgcmVzb2x1dGlvbiBhdCB3aGljaCB0aGluZ3MgY2FuIGJlIG1hcmtlZCBhcwotICAgcmVhZC1vbmx5IHZlcnN1cyByZWFkL3dyaXRlLCBzbyBpdCBjb250cm9scyB0aGUgcGFkZGluZyBiZXR3ZWVuIHRoZQotICAgdGV4dCBzZWdtZW50IGFuZCB0aGUgZGF0YSBzZWdtZW50IChpbiBtZW1vcnk7IG9uIGRpc2sgdGhlIHBhZGRpbmcKLSAgIGJldHdlZW4gdGhlbSBpcyBUQVJHRVRfUEFHRV9TSVpFKS4gIFRBUkdFVF9QQUdFX1NJWkUgYW5kIE5fU0VHU0laRSBhcmUgdGhlIHNhbWUKLSAgIGZvciBtb3N0IG1hY2hpbmVzLCBidXQgZGlmZmVyZW50IGZvciBzdW4zLiAgKi8KLQotLyogQnkgZGVmYXVsdCwgc2VnbWVudCBzaXplIGlzIGNvbnN0YW50LiAgQnV0IHNvbWUgbWFjaGluZXMgb3ZlcnJpZGUgdGhpcwotICAgdG8gYmUgYSBmdW5jdGlvbiBvZiB0aGUgYS5vdXQgaGVhZGVyIChlLmcuIG1hY2hpbmUgdHlwZSkuICAqLwotCi0jaWZuZGVmCU5fU0VHU0laRQotI2RlZmluZQlOX1NFR1NJWkUoeCkJU0VHTUVOVF9TSVpFCi0jZW5kaWYKLQwKLS8qIFZpcnR1YWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIHRleHQgc2VjdGlvbi4KLSAgIFRoaXMgaXMgZ2V0dGluZyB2ZXJ5IGNvbXBsaWNhdGVkLiAgQSBnb29kIHJlYXNvbiB0byBkaXNjYXJkIGEub3V0IGZvcm1hdAotICAgZm9yIHNvbWV0aGluZyB0aGF0IHNwZWNpZmllcyB0aGVzZSBmaWVsZHMgZXhwbGljaXRseS4gIEJ1dCB0aWwgdGhlbi4uLgotCi0gICAqIE9NQUdJQyBhbmQgTk1BR0lDIGZpbGVzOgotICAgICAgIChvYmplY3QgZmlsZXM6IHRleHQgZm9yICJyZWxvY2F0YWJsZSBhZGRyIDAiIHJpZ2h0IGFmdGVyIHRoZSBoZWFkZXIpCi0gICAgICAgc3RhcnQgYXQgMCwgb2Zmc2V0IGlzIEVYRUNfQllURVNfU0laRSwgc2l6ZSBhcyBzdGF0ZWQuCi0gICAqIFRoZSB0ZXh0IGFkZHJlc3MsIG9mZnNldCwgYW5kIHNpemUgb2YgWk1BR0lDIGZpbGVzIGRlcGVuZAotICAgICBvbiB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGZpbGU6Ci0gICAgICogZW50cnkgcG9pbnQgYmVsb3cgVEVYVF9TVEFSVF9BRERSOgotICAgICAgIChoYWNrIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzKQotICAgICAgIHN0YXJ0IGF0IDAsIG9mZnNldCBpcyAwLCBzaXplIGFzIHN0YXRlZC4KLSAgICAgKiBJZiBOX0hFQURFUl9JTl9URVhUKHgpIGlzIHRydWUgKHdoaWNoIGRlZmF1bHRzIHRvIGJlaW5nIHRoZQotICAgICAgIGNhc2Ugd2hlbiB0aGUgZW50cnkgcG9pbnQgaXMgRVhFQ19CWVRFU19TSVpFIG9yIGZ1cnRoZXIgaW50byBhIHBhZ2UpOgotICAgICAgIG5vIHBhZGRpbmcgaXMgbmVlZGVkOyB0ZXh0IGNhbiBzdGFydCBhZnRlciBleGVjIGhlYWRlci4gIFN1bgotICAgICAgIGNvbnNpZGVycyB0aGUgdGV4dCBzZWdtZW50IG9mIHN1Y2ggZmlsZXMgdG8gaW5jbHVkZSB0aGUgZXhlYyBoZWFkZXI7Ci0gICAgICAgZm9yIEJGRCdzIHB1cnBvc2VzLCB3ZSBkb24ndCwgd2hpY2ggbWFrZXMgbW9yZSB3b3JrIGZvciB1cy4KLSAgICAgICBzdGFydCBhdCBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUsIG9mZnNldCBpcyBFWEVDX0JZVEVTX1NJWkUsCi0gICAgICAgc2l6ZSBhcyBzdGF0ZWQgbWludXMgRVhFQ19CWVRFU19TSVpFLgotICAgICAqIElmIE5fSEVBREVSX0lOX1RFWFQoeCkgaXMgZmFsc2UgKHdoaWNoIGRlZmF1bHRzIHRvIGJlaW5nIHRoZSBjYXNlIHdoZW4KLSAgICAgICB0aGUgZW50cnkgcG9pbnQgaXMgbGVzcyB0aGFuIEVYRUNfQllURVNfU0laRSBpbnRvIGEgcGFnZSAoZS5nLiBwYWdlCi0gICAgICAgYWxpZ25lZCkpOiAocGFkZGluZyBpcyBuZWVkZWQgc28gdGhhdCB0ZXh0IGNhbiBzdGFydCBhdCBhIHBhZ2UgYm91bmRhcnkpCi0gICAgICAgc3RhcnQgYXQgVEVYVF9TVEFSVF9BRERSLCBvZmZzZXQgVEFSR0VUX1BBR0VfU0laRSwgc2l6ZSBhcyBzdGF0ZWQuCi0KLSAgICBTcGVjaWZpYyBjb25maWd1cmF0aW9ucyBtYXkgd2FudCB0byBoYXJkd2lyZSBOX0hFQURFUl9JTl9URVhULAotICAgIGZvciBlZmZpY2llbmN5IG9yIHRvIGFsbG93IHBlb3BsZSB0byBwbGF5IGdhbWVzIHdpdGggdGhlIGVudHJ5IHBvaW50LgotICAgIEluIHRoYXQgY2FzZSwgeW91IHdvdWxkICNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSBhcyAxIGZvciBzdW5vcywKLSAgICBhbmQgYXMgMCBmb3IgbW9zdCBvdGhlciBob3N0cyAoU29ueSBOZXdzLCBWYXggVWx0cml4LCBldGMpLgotICAgIChEbyB0aGlzIGluIHRoZSBhcHByb3ByaWF0ZSBiZmQgdGFyZ2V0IGZpbGUuKQotICAgIChUaGUgZGVmYXVsdCBpcyBhIGhldXJpc3RpYyB0aGF0IHdpbGwgYnJlYWsgaWYgcGVvcGxlIHRyeSBjaGFuZ2luZwotICAgIHRoZSBlbnRyeSBwb2ludCwgcGVyaGFwcyB3aXRoIHRoZSBsZCAtZSBmbGFnLikKLQotICAgICogUU1BR0lDIGlzIGFsd2F5cyBsaWtlIGEgWk1BR0lDIGZvciB3aGljaCBOX0hFQURFUl9JTl9URVhUIGlzIHRydWUsCi0gICAgYW5kIGZvciB3aGljaCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBpcyBUQVJHRVRfUEFHRV9TSVpFIChvciBzaG91bGQgdGhpcyBiZQotICAgIFNFR01FTlRfU0laRT8pIChURVhUX1NUQVJUX0FERFIgb25seSBhcHBsaWVzIHRvIFpNQUdJQywgbm90IHRvIFFNQUdJQykuCi0gICAgKi8KLQotLyogVGhpcyBtYWNybyBpcyBvbmx5IHJlbGV2YW50IGZvciBaTUFHSUMgZmlsZXM7IFFNQUdJQyBhbHdheXMgaGFzIHRoZSBoZWFkZXIKLSAgIGluIHRoZSB0ZXh0LiAgKi8KLSNpZm5kZWYgTl9IRUFERVJfSU5fVEVYVAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpICgoKHgpLmFfZW50cnkgJiAoVEFSR0VUX1BBR0VfU0laRS0xKSkgPj0gRVhFQ19CWVRFU19TSVpFKQotI2VuZGlmCi0KLS8qIFN1biBzaGFyZWQgbGlicmFyaWVzLCBub3QgbGludXguICBUaGlzIG1hY3JvIGlzIG9ubHkgcmVsZXZhbnQgZm9yIFpNQUdJQwotICAgZmlsZXMuICAqLwotI2lmbmRlZiBOX1NIQVJFRF9MSUIKLSNpZiBkZWZpbmVkIChURVhUX1NUQVJUX0FERFIpICYmIFRFWFRfU1RBUlRfQUREUiA9PSAwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAoMCkKLSNlbHNlCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAoKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFIpCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBSZXR1cm5pbmcgMCBub3QgVEVYVF9TVEFSVF9BRERSIGZvciBPTUFHSUMgYW5kIE5NQUdJQyBpcyBiYXNlZCBvbgotICAgdGhlIGFzc3VtcHRpb24gdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgLm8gZmlsZSwgbm90IGFuCi0gICBleGVjdXRhYmxlLiAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIE9NQUdJQyAoYnV0IG1lYW5zIHdlIGRvbid0IHdvcmsKLSAgIHJpZ2h0IG9uIHRoZSBvdXRwdXQgZnJvbSBsZCAtTik7IG1vcmUgcXVlc3Rpb25hYmxlIGZvciBOTUFHSUMuICAqLwotCi0jaWZuZGVmIE5fVFhUQUREUgotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAgICgvKiBUaGUgYWRkcmVzcyBvZiBhIFFNQUdJQyBmaWxlIGlzIGFsd2F5cyBvbmUgcGFnZSBpbiwgKi8gXAotICAgICAvKiB3aXRoIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuICAqLyBcCi0gICAgIE5fSVNfUU1BR0lDICh4KSA/IFRBUkdFVF9QQUdFX1NJWkUgKyBFWEVDX0JZVEVTX1NJWkUgOiBcCi0gICAgIE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gMCA6CS8qIG9iamVjdCBmaWxlIG9yIE5NQUdJQyAqL1wKLSAgICAgTl9TSEFSRURfTElCKHgpID8gMCA6CVwKLSAgICAgTl9IRUFERVJfSU5fVEVYVCh4KSAgPwlcCi0JICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSA6CS8qIG5vIHBhZGRpbmcgKi9cCi0JICAgIFRFWFRfU1RBUlRfQUREUgkJCS8qIGEgcGFnZSBvZiBwYWRkaW5nICovXAotICAgICkKLSNlbmRpZgotCi0vKiBJZiBOX0hFQURFUl9JTl9URVhUIGlzIG5vdCB0cnVlIGZvciBaTUFHSUMsIHRoZXJlIGlzIHNvbWUgcGFkZGluZwotICAgdG8gbWFrZSB0aGUgdGV4dCBzZWdtZW50IHN0YXJ0IGF0IGEgY2VydGFpbiBib3VuZGFyeS4gIEZvciBtb3N0Ci0gICBzeXN0ZW1zLCB0aGlzIGJvdW5kYXJ5IGlzIFRBUkdFVF9QQUdFX1NJWkUuICBCdXQgZm9yIExpbnV4LCBpbiB0aGUKLSAgIHRpbWUtaG9ub3JlZCB0cmFkaXRpb24gb2YgY3JhenkgWk1BR0lDIGhhY2tzLCBpdCBpcyAxMDI0IHdoaWNoIGlzCi0gICBub3Qgd2hhdCBUQVJHRVRfUEFHRV9TSVpFIG5lZWRzIHRvIGJlIGZvciBRTUFHSUMuICAqLwotCi0jaWZuZGVmIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUKLSNkZWZpbmUgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLQotI2RlZmluZSBOX0RJU0tfQkxPQ0tfU0laRSh4KSBcCi0gIChOX01BR0lDKHgpID09IFpNQUdJQyA/IFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgOiBUQVJHRVRfUEFHRV9TSVpFKQotCi0vKiBPZmZzZXQgaW4gYW4gYS5vdXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHNlY3Rpb24uICovCi0jaWZuZGVmIE5fVFhUT0ZGCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCVwKLSAgICAoLyogRm9yIHtPLE4sUX1NQUdJQywgbm8gcGFkZGluZy4gICovIFwKLSAgICAgTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyBFWEVDX0JZVEVTX1NJWkUgOiBcCi0gICAgIE5fU0hBUkVEX0xJQih4KSA/IDAgOiBcCi0gICAgIE5fSEVBREVSX0lOX1RFWFQoeCkgPwlcCi0JICAgIEVYRUNfQllURVNfU0laRSA6CQkJLyogbm8gcGFkZGluZyAqL1wKLQkgICAgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRQkJLyogYSBwYWdlIG9mIHBhZGRpbmcgKi9cCi0gICAgKQotI2VuZGlmCi0vKiBTaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24uICBJdCdzIGFsd2F5cyBhcyBzdGF0ZWQsIGV4Y2VwdCB0aGF0IHdlCi0gICBvZmZzZXQgaXQgdG8gYHVuZG8nIHRoZSBhZGp1c3RtZW50IHRvIE5fVFhUQUREUiBhbmQgTl9UWFRPRkYKLSAgIGZvciBaTUFHSUMgZmlsZXMgdGhhdCBub21pbmFsbHkgaW5jbHVkZSB0aGUgZXhlYyBoZWFkZXIKLSAgIGFzIHBhcnQgb2YgdGhlIGZpcnN0IHBhZ2Ugb2YgdGV4dC4gIChCRkQgZG9lc24ndCBjb25zaWRlciB0aGUKLSAgIGV4ZWMgaGVhZGVyIHRvIGJlIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudC4pICAqLwotI2lmbmRlZiBOX1RYVFNJWkUKLSNkZWZpbmUJTl9UWFRTSVpFKHgpIFwKLSAgICAoLyogRm9yIFFNQUdJQywgd2UgZG9uJ3QgY29uc2lkZXIgdGhlIGhlYWRlciBwYXJ0IG9mIHRoZSB0ZXh0IHNlY3Rpb24uICAqL1wKLSAgICAgTl9JU19RTUFHSUMgKHgpID8gKHgpLmFfdGV4dCAtIEVYRUNfQllURVNfU0laRSA6IFwKLSAgICAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDIHx8IE5fU0hBUkVEX0xJQih4KSkgPyAoeCkuYV90ZXh0IDogXAotICAgICBOX0hFQURFUl9JTl9URVhUKHgpICA/CVwKLQkgICAgKHgpLmFfdGV4dCAtIEVYRUNfQllURVNfU0laRToJLyogbm8gcGFkZGluZyAqL1wKLQkgICAgKHgpLmFfdGV4dAkJCQkvKiBhIHBhZ2Ugb2YgcGFkZGluZyAqL1wKLSAgICApCi0jZW5kaWYKLS8qIFRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQgaW4gdmlydHVhbCBtZW1vcnkuCi0gICBJdCBpcyB0aGUgdGV4dCBzZWdtZW50IGFkZHJlc3MsIHBsdXMgdGV4dCBzZWdtZW50IHNpemUsIHJvdW5kZWQKLSAgIHVwIHRvIGEgTl9TRUdTSVpFIGJvdW5kYXJ5IGZvciBwdXJlIG9yIHBhZ2VhYmxlIGZpbGVzLiAqLwotI2lmbmRlZiBOX0RBVEFERFIKLSNkZWZpbmUgTl9EQVRBRERSKHgpIFwKLSAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KSkgXAotICAgICA6ICAoTl9TRUdTSVpFKHgpICsgKChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpLTEpICYgfihOX1NFR1NJWkUoeCktMSkpKSkKLSNlbmRpZgotLyogVGhlIGFkZHJlc3Mgb2YgdGhlIEJTUyBzZWdtZW50IC0tIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotCi0jZGVmaW5lIE5fQlNTQUREUih4KQkoTl9EQVRBRERSKHgpICsgKHgpLmFfZGF0YSkKLQotLyogT2Zmc2V0cyBvZiB0aGUgdmFyaW91cyBwb3J0aW9ucyBvZiB0aGUgZmlsZSBhZnRlciB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLQotLyogRm9yIHtRLFp9TUFHSUMsIHRoZXJlIGlzIHBhZGRpbmcgdG8gbWFrZSB0aGUgZGF0YSBzZWdtZW50IHN0YXJ0IG9uCi0gICBhIHBhZ2UgYm91bmRhcnkuICBNb3N0IG9mIHRoZSB0aW1lIHRoZSBhX3RleHQgZmllbGQgKGFuZCB0aHVzCi0gICBOX1RYVFNJWkUpIGFscmVhZHkgY29udGFpbnMgdGhpcyBwYWRkaW5nLiAgSXQgaXMgcG9zc2libGUgdGhhdCBmb3IKLSAgIEJTREkgYW5kL29yIDM4NkJTRCBpdCBzb21ldGltZXMgZG9lc24ndCBjb250YWluIHRoZSBwYWRkaW5nLCBhbmQKLSAgIHBlcmhhcHMgd2Ugc2hvdWxkIGJlIGFkZGluZyBpdCBoZXJlLiAgQnV0IHRoaXMgc2VlbXMga2luZCBvZgotICAgcXVlc3Rpb25hYmxlIGFuZCBwcm9iYWJseSBzaG91bGQgYmUgQlNESS8zODZCU0Qtc3BlY2lmaWMgaWYgd2UgZG8KLSAgIGRvIGl0LgotCi0gICBGb3IgTk1BR0lDIChhdCBsZWFzdCBmb3IgaHAzMDAgQlNELCBwcm9iYWJseSBvdGhlcnMpLCB0aGVyZSBpcwotICAgcGFkZGluZyBpbiBtZW1vcnkgb25seSwgbm90IG9uIGRpc2ssIHNvIHdlIG11c3QgKm5vdCogZXZlciBwYWQgaGVyZQotICAgZm9yIE5NQUdJQy4gICovCi0KLSNpZm5kZWYgTl9EQVRPRkYKLSNkZWZpbmUgTl9EQVRPRkYoeCkgXAotIChOX1RYVE9GRih4KSArIE5fVFhUU0laRSh4KSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fVFJFTE9GRgotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2VuZGlmCi0jaWZuZGVmIE5fRFJFTE9GRgotI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2VuZGlmCi0jaWZuZGVmIE5fU1lNT0ZGCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplICkKLSNlbmRpZgotI2lmbmRlZiBOX1NUUk9GRgotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZW5kaWYKLQwKLS8qIFN5bWJvbHMgKi8KLSNpZm5kZWYgZXh0ZXJuYWxfbmxpc3QKLXN0cnVjdCBleHRlcm5hbF9ubGlzdCB7Ci0gIGJmZF9ieXRlIGVfc3RyeFtCWVRFU19JTl9XT1JEXTsJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgb2YgbmFtZSAqLwotICBiZmRfYnl0ZSBlX3R5cGVbMV07CQkJLyogdHlwZSBvZiBzeW1ib2wgKi8KLSAgYmZkX2J5dGUgZV9vdGhlclsxXTsJCQkvKiBtaXNjIGluZm8gKHVzdWFsbHkgZW1wdHkpICovCi0gIGJmZF9ieXRlIGVfZGVzY1syXTsJCQkvKiBkZXNjcmlwdGlvbiBmaWVsZCAqLwotICBiZmRfYnl0ZSBlX3ZhbHVlW0JZVEVTX0lOX1dPUkRdOwkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLX07Ci0jZGVmaW5lIEVYVEVSTkFMX05MSVNUX1NJWkUgKEJZVEVTX0lOX1dPUkQrNCtCWVRFU19JTl9XT1JEKQotI2VuZGlmCi0KLXN0cnVjdCBpbnRlcm5hbF9ubGlzdCB7Ci0gIHVuc2lnbmVkIGxvbmcgbl9zdHJ4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgdW5zaWduZWQgY2hhciBuX3R5cGU7CQkJLyogdHlwZSBvZiBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhciBuX290aGVyOwkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICB1bnNpZ25lZCBzaG9ydCBuX2Rlc2M7CQkvKiBkZXNjcmlwdGlvbiBmaWVsZCAqLwotICBiZmRfdm1hIG5fdmFsdWU7CQkJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotCi0vKiBUaGUgbl90eXBlIGZpZWxkIGlzIHRoZSBzeW1ib2wgdHlwZSwgY29udGFpbmluZzogICovCi0KLSNkZWZpbmUgTl9VTkRGCTAJLyogVW5kZWZpbmVkIHN5bWJvbCAqLwotI2RlZmluZSBOX0FCUyAJMgkvKiBBYnNvbHV0ZSBzeW1ib2wgLS0gZGVmaW5lZCBhdCBwYXJ0aWN1bGFyIGFkZHIgKi8KLSNkZWZpbmUgTl9URVhUIAk0CS8qIFRleHQgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHRleHQgc2VnICovCi0jZGVmaW5lIE5fREFUQSAJNgkvKiBEYXRhIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiBkYXRhIHNlZyAqLwotI2RlZmluZSBOX0JTUyAJOAkvKiBCU1MgIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB6ZXJvJ2Qgc2VnICovCi0jZGVmaW5lCU5fQ09NTQkweDEyCS8qIENvbW1vbiBzeW1ib2wgKHZpc2libGUgYWZ0ZXIgc2hhcmVkIGxpYiBkeW5saW5rKSAqLwotI2RlZmluZSBOX0ZOCTB4MWYJLyogRmlsZSBuYW1lIG9mIC5vIGZpbGUgKi8KLSNkZWZpbmUJTl9GTl9TRVEgMHgwQwkvKiBOX0ZOIGZyb20gU2VxdWVudCBjb21waWxlcnMgKHNpZ2gpICovCi0vKiBOb3RlOiBOX0VYVCBjYW4gb25seSBiZSB1c2VmdWxseSBPUi1lZCB3aXRoIE5fVU5ERiwgTl9BQlMsIE5fVEVYVCwKLSAgIE5fREFUQSwgb3IgTl9CU1MuICBXaGVuIHRoZSBsb3ctb3JkZXIgYml0IG9mIG90aGVyIHR5cGVzIGlzIHNldCwKLSAgIChlLmcuIE5fV0FSTklORyB2ZXJzdXMgTl9GTiksIHRoZXkgYXJlIHR3byBkaWZmZXJlbnQgdHlwZXMuICAqLwotI2RlZmluZSBOX0VYVCAJMQkvKiBFeHRlcm5hbCBzeW1ib2wgKGFzIG9wcG9zZWQgdG8gbG9jYWwtdG8tdGhpcy1maWxlKSAqLwotI2RlZmluZSBOX1RZUEUgIDB4MWUKLSNkZWZpbmUgTl9TVEFCIAkweGUwCS8qIElmIGFueSBvZiB0aGVzZSBiaXRzIGFyZSBvbiwgaXQncyBhIGRlYnVnIHN5bWJvbCAqLwotCi0jZGVmaW5lIE5fSU5EUiAweDBhCi0KLS8qIFRoZSBmb2xsb3dpbmcgc3ltYm9scyByZWZlciB0byBzZXQgZWxlbWVudHMuCi0gICBBbGwgdGhlIE5fU0VUW0FUREJdIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lIGZvcm0gb25lIHNldC4KLSAgIFNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNldCBpbiB0aGUgdGV4dCBzZWN0aW9uLCBhbmQgZWFjaCBzZXQKLSAgIGVsZW1lbnRzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KLSAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCi0KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKLSAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KLSAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCi0gICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLQotLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLwotI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLQotLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCi0jZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KLQotLyogV2FybmluZyBzeW1ib2wuIFRoZSB0ZXh0IGdpdmVzIGEgd2FybmluZyBtZXNzYWdlLCB0aGUgbmV4dCBzeW1ib2wKLSAgIGluIHRoZSB0YWJsZSB3aWxsIGJlIHVuZGVmaW5lZC4gV2hlbiB0aGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQsIHRoZQotICAgbWVzc2FnZSBpcyBwcmludGVkLiAgKi8KLQotI2RlZmluZQlOX1dBUk5JTkcgMHgxZQotCi0vKiBXZWFrIHN5bWJvbHMuICBUaGVzZSBhcmUgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBhLm91dCBmb3JtYXQuICBUaGUKLSAgIHNlbWFudGljcyBhcmUgdGhvc2Ugb2YgRUxGIHdlYWsgc3ltYm9scy4gIFdlYWsgc3ltYm9scyBhcmUgYWx3YXlzCi0gICBleHRlcm5hbGx5IHZpc2libGUuICBUaGUgTl9XRUFLPyB2YWx1ZXMgYXJlIHNxdWVlemVkIGludG8gdGhlCi0gICBhdmFpbGFibGUgc2xvdHMuICBUaGUgdmFsdWUgb2YgYSBOX1dFQUtVIHN5bWJvbCBpcyAwLiAgVGhlIHZhbHVlcwotICAgb2YgdGhlIG90aGVyIHR5cGVzIGFyZSB0aGUgZGVmaW5pdGlvbnMuICAqLwotI2RlZmluZSBOX1dFQUtVCTB4MGQJCS8qIFdlYWsgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0EgMHgwZQkJLyogV2VhayBhYnNvbHV0ZSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtUIDB4MGYJCS8qIFdlYWsgdGV4dCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtEIDB4MTAJCS8qIFdlYWsgZGF0YSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtCIDB4MTEJCS8qIFdlYWsgYnNzIHN5bWJvbC4gICovCi0KLS8qIFJlbG9jYXRpb25zIAotCi0gIFRoZXJlCWFyZSB0d28gdHlwZXMgb2YgcmVsb2NhdGlvbiBmbGF2b3VycyBmb3IgYS5vdXQgc3lzdGVtcywKLSAgc3RhbmRhcmQgYW5kIGV4dGVuZGVkLiBUaGUgc3RhbmRhcmQgZm9ybSBpcyB1c2VkIG9uIHN5c3RlbXMgd2hlcmUgdGhlCi0gIGluc3RydWN0aW9uIGhhcyByb29tIGZvciBhbGwgdGhlIGJpdHMgb2YgYW4gb2Zmc2V0IHRvIHRoZSBvcGVyYW5kLCB3aGlsc3QKLSAgdGhlIGV4dGVuZGVkIGZvcm0gaXMgdXNlZCB3aGVuIGFuIGFkZHJlc3Mgb3BlcmFuZCBoYXMgdG8gYmUgc3BsaXQgb3ZlciBuCi0gIGluc3RydWN0aW9ucy4gRWcsIG9uIHRoZSA2OGssIGVhY2ggbW92ZSBpbnN0cnVjdGlvbiBjYW4gcmVmZXJlbmNlCi0gIHRoZSB0YXJnZXQgd2l0aCBhIGRpc3BsYWNlbWVudCBvZiAxNiBvciAzMiBiaXRzLiBPbiB0aGUgc3BhcmMsIG1vdmUKLSAgaW5zdHJ1Y3Rpb25zIHVzZSBhbiBvZmZzZXQgb2YgMTQgYml0cywgc28gdGhlIG9mZnNldCBpcyBzdG9yZWQgaW4KLSAgdGhlIHJlbG9jIGZpZWxkLCBhbmQgdGhlIGRhdGEgaW4gdGhlIHNlY3Rpb24gaXMgaWdub3JlZC4KLSovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHNpbmdsZSByZWxvY2F0aW9uIHRvIGJlIHBlcmZvcm1lZC4KLSAgIFRoZSB0ZXh0LXJlbG9jYXRpb24gc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBhIHZlY3RvciBvZiB0aGVzZSBzdHJ1Y3R1cmVzLAotICAgYWxsIG9mIHdoaWNoIGFwcGx5IHRvIHRoZSB0ZXh0IHNlY3Rpb24uCi0gICBMaWtld2lzZSwgdGhlIGRhdGEtcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gdGhlIGRhdGEgc2VjdGlvbi4gICovCi0KLXN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgewotICBiZmRfYnl0ZQlyX2FkZHJlc3NbQllURVNfSU5fV09SRF07CS8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlIAkqLwotICBiZmRfYnl0ZSByX2luZGV4WzNdOwkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBiZmRfYnl0ZSByX3R5cGVbMV07CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRwkoKHVuc2lnbmVkIGludCkgMHg4MCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFCSgodW5zaWduZWQgaW50KSAweDAxKQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4NjApCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcJNQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFCSgodW5zaWduZWQgaW50KSAweDA2KQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFCTEKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCSgodW5zaWduZWQgaW50KSAweDEwKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCSgodW5zaWduZWQgaW50KSAweDA4KQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCSgodW5zaWduZWQgaW50KSAweDA4KQotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgxMCkKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4MDQpCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgyMCkKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4MDIpCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHg0MCkKLQotI2RlZmluZQlSRUxPQ19TVERfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxKQkJLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9pbnRlcm5hbAotewotICBiZmRfdm1hIHJfYWRkcmVzczsJCS8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLwotICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0Ci0gICAgIGFuZCBpdCBzaG91bGQgYmUgcmVsb2NhdGVkIGZvciBjaGFuZ2VzIGluIGl0cyBvd24gYWRkcmVzcwotICAgICBhcyB3ZWxsIGFzIGZvciBjaGFuZ2VzIGluIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiBzcGVjaWZpZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICAvKiBMZW5ndGggKGFzIGV4cG9uZW50IG9mIDIpIG9mIHRoZSBmaWVsZCB0byBiZSByZWxvY2F0ZWQuCi0gICAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCi0gIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOwotICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgotICAgICByX3N5bWJvbG51bSBpcyB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbAotICAgICBpbiBmaWxlcyB0aGUgc3ltYm9sIHRhYmxlLgotICAgICAwID0+IHJlbG9jYXRlIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBzZWdtZW50LgotICAgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKLSAgICAgKHRoZSBOX0VYVCBiaXQgbWF5IGJlIHNldCBhbHNvLCBidXQgc2lnbmlmaWVzIG5vdGhpbmcpLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7Ci0gIC8qIFRoZSBuZXh0IHRocmVlIGJpdHMgYXJlIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgc2VlbSB0bwotICAgICBiZSB1bmRvY3VtZW50ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9iYXNlcmVsOjE7CS8qIExpbmthZ2UgdGFibGUgcmVsYXRpdmUgKi8KLSAgdW5zaWduZWQgaW50IHJfam1wdGFibGU6MTsJLyogcGMtcmVsYXRpdmUgdG8ganVtcCB0YWJsZSAqLwotICB1bnNpZ25lZCBpbnQgcl9yZWxhdGl2ZToxOwkvKiAicmVsYXRpdmUgcmVsb2NhdGlvbiIgKi8KLSAgLyogdW51c2VkICovCi0gIHVuc2lnbmVkIGludCByX3BhZDoxOwkJLyogUGFkZGluZyAtLSBzZXQgdG8gemVybyAqLwotfTsKLQotCi0vKiBFWFRFTkRFRCBSRUxPQ1MgICovCi0KLXN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgewotICBiZmRfYnl0ZSByX2FkZHJlc3NbQllURVNfSU5fV09SRF07CS8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlIAkqLwotICBiZmRfYnl0ZSByX2luZGV4WzNdOwkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBiZmRfYnl0ZSByX3R5cGVbMV07CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF9ieXRlIHJfYWRkZW5kW0JZVEVTX0lOX1dPUkRdOwkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwkoKHVuc2lnbmVkIGludCkgMHg4MCkKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMSkKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MUYpCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHCTAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4RjgpCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFCTMKLQotLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KLSNkZWZpbmUJUkVMT0NfRVhUX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSArIEJZVEVTX0lOX1dPUkQpCi0KLWVudW0gcmVsb2NfdHlwZQotewotICAvKiBzaW1wbGUgcmVsb2NhdGlvbnMgKi8KLSAgUkVMT0NfOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgKyBzdiAJCSovCi0gIFJFTE9DXzE2LAkJCS8qIGRhdGFbMDoxNV0gPSBhZGRlbmQgKyBzdiAJCSovCi0gIFJFTE9DXzMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgKyBzdiAJCSovCi0gIC8qIHBjLXJlbCBkaXNwbGFjZW1lbnQgKi8KLSAgUkVMT0NfRElTUDgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfRElTUDE2LAkJCS8qIGRhdGFbMDoxNV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19ESVNQMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIC8qIFNwZWNpYWwgKi8KLSAgUkVMT0NfV0RJU1AzMCwJCS8qIGRhdGFbMDoyOV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX1dESVNQMjIsCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19ISTIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpPj4xMCAJKi8KLSAgUkVMT0NfMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgCQkqLwotICBSRUxPQ18xMywJCQkvKiBkYXRhWzA6MTJdID0gKGFkZGVuZCArIHN2KQkJKi8KLSAgUkVMT0NfTE8xMCwJCQkvKiBkYXRhWzA6OV0gPSAoYWRkZW5kICsgc3YpCQkqLwotICBSRUxPQ19TRkFfQkFTRSwJCQotICBSRUxPQ19TRkFfT0ZGMTMsCi0gIC8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgUkVMT0NfQkFTRTEwLCAgCQkvKiBOb3Qgc3VyZSAtIG1heWJlIHdlIGNhbiBkbyB0aGlzIHRoZSAqLwotICBSRUxPQ19CQVNFMTMsCQkJLyogcmlnaHQgd2F5IG5vdyAqLwotICBSRUxPQ19CQVNFMjIsCi0gIC8qIGZvciBzb21lIHNvcnQgb2YgcGMtcmVsIFAuSS5DLiAoPykgKi8KLSAgUkVMT0NfUEMxMCwKLSAgUkVMT0NfUEMyMiwKLSAgLyogUC5JLkMuIGp1bXAgdGFibGUgKi8KLSAgUkVMT0NfSk1QX1RCTCwKLSAgLyogcmVwdXRlZGx5IGZvciBzaGFyZWQgbGlicmFyaWVzIHNvbWVob3cgKi8KLSAgUkVMT0NfU0VHT0ZGMTYsCi0gIFJFTE9DX0dMT0JfREFULAotICBSRUxPQ19KTVBfU0xPVCwKLSAgUkVMT0NfUkVMQVRJVkUsCi0KLSAgUkVMT0NfMTEsCQotICBSRUxPQ19XRElTUDJfMTQsCi0gIFJFTE9DX1dESVNQMTksCi0gIFJFTE9DX0hISTIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpID4+IDQyICAgICAqLwotICBSRUxPQ19ITE8xMCwJCQkvKiBkYXRhWzA6OV0gPSAoYWRkZW5kICsgc3YpID4+IDMyICAgICAgKi8KLSAgCi0gIC8qIDI5SyByZWxvY2F0aW9uIHR5cGVzICovCi0gIFJFTE9DX0pVTVBUQVJHLAotICBSRUxPQ19DT05TVCwKLSAgUkVMT0NfQ09OU1RILAotICAKLSAgLyogQWxsIHRoZSBuZXcgb25lcyBJIGNhbiB0aGluayBvZiwgZm9yIHNwYXJjIHY5ICovCi0KLSAgUkVMT0NfNjQsCQkJLyogZGF0YVswOjYzXSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfRElTUDY0LAkJCS8qIGRhdGFbMDo2M10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19XRElTUDIxLAkJLyogZGF0YVswOjIwXSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfRElTUDIxLAkJCS8qIGRhdGFbMDoyMF0gPSBhZGRlbmQgLSBwYyArIHN2ICAgICAgICAqLwotICBSRUxPQ19ESVNQMTQsCQkJLyogZGF0YVswOjEzXSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIC8qIFEgLgotICAgICBXaGF0IGFyZSB0aGUgb3RoZXIgb25lcywKLSAgICAgU2luY2UgdGhpcyBpcyBhIGNsZWFuIHNsYXRlLCBjYW4gd2UgdGhyb3cgYXdheSB0aGUgb25lcyB3ZSBkb250Ci0gICAgIHVuZGVyc3RhbmQgPyBTaG91bGQgd2Ugc29ydCB0aGUgdmFsdWVzID8gV2hhdCBhYm91dCB1c2luZyBhCi0gICAgIG1pY3JvY29kZSBmb3JtYXQgbGlrZSB0aGUgNjhrID8KLSAgICAgKi8KLSAgTk9fUkVMT0MKLSAgfTsKLQotCi1zdHJ1Y3QgcmVsb2NfaW50ZXJuYWwgewotICBiZmRfdm1hIHJfYWRkcmVzczsJCS8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlIAkqLwotICBsb25nCXJfaW5kZXg7CQkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotICBiZmRfdm1hIHJfYWRkZW5kOwkJLyogZGF0dW0gYWRkZW5kCQkJCSovCi19OwotCi0vKiBRLgotICAgU2hvdWxkIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZSBiZSA0IGJ5dGVzIG9yIDggYnl0ZXMgPwotCi0gICBRLgotICAgV2hhdCBhYm91dCBhcmNoaXZlIGluZGV4ZXMgPwotCi0gKi8KLQotI2VuZGlmCQkJCS8qIF9fQV9PVVRfNjRfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvYXIuaCBiL2luY2x1ZGUvYW91dC9hci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjVkY2RhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9hci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogYXJjaGl2ZSBmaWxlIGRlZmluaXRpb24gZm9yIEdOVSBzb2Z0d2FyZSAqLwotCi0vKiBTbyBmYXIgdGhpcyBpcyBjb3JyZWN0IGZvciBCU0Rpc2ggYXJjaGl2ZXMuICBEb24ndCBmb3JnZXQgdGhhdAotICAgZmlsZXMgbXVzdCBiZWdpbiBvbiBhbiBldmVuIGJ5dGUgYm91bmRhcnkuICovCi0KLSNpZm5kZWYgX19HTlVfQVJfSF9fCi0jZGVmaW5lIF9fR05VX0FSX0hfXwotCi0vKiBOb3RlIHRoYXQgdGhlIHVzdWFsICdcbicgaW4gbWFnaWMgc3RyaW5ncyBtYXkgdHJhbnNsYXRlIHRvIGRpZmZlcmVudAotICAgY2hhcmFjdGVycywgYXMgYWxsb3dlZCBieSBBTlNJLiAgJ1wwMTInIGhhcyBhIGZpeGVkIHZhbHVlLCBhbmQgcmVtYWlucwotICAgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIEJTRGlzaCBhcmNoaXZlcy4gKi8KLQotI2RlZmluZSBBUk1BRyAgIiE8YXJjaD5cMDEyIgkvKiBGb3IgQ09GRiBhbmQgYS5vdXQgYXJjaGl2ZXMgKi8KLSNkZWZpbmUgQVJNQUdCICIhPGJvdXQ+XDAxMiIJLyogRm9yIGIub3V0IGFyY2hpdmVzICovCi0jZGVmaW5lIFNBUk1BRyA4Ci0jZGVmaW5lIEFSRk1BRyAiYFwwMTIiCi0KLS8qIFRoZSBhcl9kYXRlIGZpZWxkIG9mIHRoZSBhcm1hcCAoX18uU1lNREVGKSBtZW1iZXIgb2YgYW4gYXJjaGl2ZQotICAgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1vZGlmaWVkIGRhdGUgb2YgdGhlIGVudGlyZSBmaWxlLCBvciAKLSAgIEJTRC1kZXJpdmVkIGxpbmtlcnMgY29tcGxhaW4uICBXZSBvcmlnaW5hbGx5IHdyaXRlIHRoZSBhcl9kYXRlIHdpdGgKLSAgIHRoaXMgb2Zmc2V0IGZyb20gdGhlIHJlYWwgZmlsZSdzIG1vZC10aW1lLiAgQWZ0ZXIgZmluaXNoaW5nIHRoZQotICAgZmlsZSwgd2UgcmV3cml0ZSBhcl9kYXRlIGlmIGl0J3Mgbm90IHN0aWxsIGdyZWF0ZXIgdGhhbiB0aGUgbW9kIGRhdGUuICAqLwotCi0jZGVmaW5lIEFSTUFQX1RJTUVfT0ZGU0VUICAgICAgIDYwCi0KLXN0cnVjdCBhcl9oZHIgewotICBjaGFyIGFyX25hbWVbMTZdOwkJLyogbmFtZSBvZiB0aGlzIG1lbWJlciAqLwotICBjaGFyIGFyX2RhdGVbMTJdOwkJLyogZmlsZSBtdGltZSAqLwotICBjaGFyIGFyX3VpZFs2XTsJCS8qIG93bmVyIHVpZDsgcHJpbnRlZCBhcyBkZWNpbWFsICovCi0gIGNoYXIgYXJfZ2lkWzZdOwkJLyogb3duZXIgZ2lkOyBwcmludGVkIGFzIGRlY2ltYWwgKi8KLSAgY2hhciBhcl9tb2RlWzhdOwkJLyogZmlsZSBtb2RlLCBwcmludGVkIGFzIG9jdGFsICAgKi8KLSAgY2hhciBhcl9zaXplWzEwXTsJCS8qIGZpbGUgc2l6ZSwgcHJpbnRlZCBhcyBkZWNpbWFsICovCi0gIGNoYXIgYXJfZm1hZ1syXTsJCS8qIHNob3VsZCBjb250YWluIEFSRk1BRyAqLwotfTsKLQotI2VuZGlmIC8qIF9fR05VX0FSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2R5bml4My5oIGIvaW5jbHVkZS9hb3V0L2R5bml4My5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmVlZWJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9keW5peDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBhLm91dCBzcGVjaWZpY3MgZm9yIFNlcXVlbnQgU3ltbWV0cnkgcnVubmluZyBEeW5peCAzLngKLSAqLwotI2lmbmRlZiBBX09VVF9EWU5JWDNfSAotI2RlZmluZSBBX09VVF9EWU5JWDNfSAotCi0jZGVmaW5lIGV4dGVybmFsX2V4ZWMgZHluaXhfZXh0ZXJuYWxfZXhlYwotCi0vKiBzdHJ1Y3QgZXhlYyBmb3IgRHluaXggMwotICoKLSAqIGFfZ2R0YmwgYW5kIGFfYm9vdHN0cmFwIGFyZSBvbmx5IGZvciBzdGFuZGFsb25lIGJpbmFyaWVzLgotICogU2hhcmVkIGRhdGEgZmllbGRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwgYXMgb2YgRHluaXggMy4xLAotICogYnV0IGFyZSBzdXBwb3J0ZWQgYnkgRHluaXggY29tcGlsZXIgcHJvZ3JhbXMuCi0gKi8KLXN0cnVjdCBkeW5peF9leHRlcm5hbF9leGVjIHsKLQl1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfdGV4dFs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZGF0YVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfYnNzWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9zeW1zWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9lbnRyeVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfdHJzaXplWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9kcnNpemVbNF07Ci0JdW5zaWduZWQgY2hhciBlX2dfY29kZVs4XSwgZV9nX2RhdGFbOF0sIGVfZ19kZXNjWzhdOwotCXVuc2lnbmVkIGNoYXIgZV9zaGRhdGFbNF07Ci0JdW5zaWduZWQgY2hhciBlX3NoYnNzWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9zaGRyc2l6ZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfYm9vdHN0cmFwWzQ0XTsKLQl1bnNpZ25lZCBjaGFyIGVfcmVzZXJ2ZWRbMTJdOwotCXVuc2lnbmVkIGNoYXIgZV92ZXJzaW9uWzRdOwotfTsKLQotI2RlZmluZQlFWEVDX0JZVEVTX1NJWkUJKDEyOCkKLQotLyoKLSAqIEFsbCBleGVjdXRhYmxlcyB1bmRlciBEeW5peCBhcmUgZGVtYW5kIHBhZ2VkIHdpdGggcmVhZC1vbmx5IHRleHQsCi0gKiBUaHVzIG5vIE5NQUdJQy4KLSAqCi0gKiBaTUFHSUMgaGFzIGEgcGFnZSBvZiAwcyBhdCB2aXJ0dWFsIDAsCi0gKiBYTUFHSUMgaGFzIGFuIGludmFsaWQgcGFnZSBhdCB2aXJ0dWFsIDAKLSAqLwotI2RlZmluZSBPTUFHSUMJMHgxMmViCQkvKiAubyAqLwotI2RlZmluZSBaTUFHSUMJMHgyMmViCQkvKiB6ZXJvIEAgMCwgZGVtYW5kIGxvYWQgKi8KLSNkZWZpbmUgWE1BR0lDCTB4MzJlYgkJLyogaW52YWxpZCBAIDAsIGRlbWFuZCBsb2FkICovCi0jZGVmaW5lIFNNQUdJQwkweDQyZWIJCS8qIHN0YW5kYWxvbmUsIG5vdCBzdXBwb3J0ZWQgaGVyZSAqLwotCi0jZGVmaW5lIE5fQkFETUFHKHgpICgoT01BR0lDICE9IE5fTUFHSUMoeCkpICYmIFwKLQkJICAgICAoWk1BR0lDICE9IE5fTUFHSUMoeCkpICYmIFwKLQkJICAgICAoWE1BR0lDICE9IE5fTUFHSUMoeCkpICYmIFwKLQkJICAgICAoU01BR0lDICE9IE5fTUFHSUMoeCkpKQotCi0jZGVmaW5lIE5fQUREUkFESih4KSAoKFpNQUdJQyA9PSBOX01BR0lDKHgpIHx8IFhNQUdJQyA9PSBOX01BR0lDKHgpKSA/IDB4MTAwMCA6IDApCi0KLSNkZWZpbmUgTl9UWFRPRkYoeCkgKEVYRUNfQllURVNfU0laRSkKLSNkZWZpbmUgTl9EQVRPRkYoeCkgKE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpKQotI2RlZmluZSBOX1NIREFUT0ZGKHgpIChOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCi0jZGVmaW5lIE5fVFJFTE9GRih4KSAoTl9TSERBVE9GRih4KSArICh4KS5hX3NoZGF0YSkKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpIChOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUpCi0jZGVmaW5lIE5fU0hEUkVMT0ZGKHgpIChOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUpCi0jZGVmaW5lIE5fU1lNT0ZGKHgpIChOX1NIRFJFTE9GRih4KSArICh4KS5hX3NoZHJzaXplKQotI2RlZmluZSBOX1NUUk9GRih4KSAoTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zKQotCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0JKCgoT01BR0lDID09IE5fTUFHSUMoeCkpIHx8IChTTUFHSUMgPT0gTl9NQUdJQyh4KSkpID8gMCBcCi0JIDogVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFKQotCi0jZGVmaW5lIE5fVFhUU0laRSh4KSBcCi0JKCgoT01BR0lDID09IE5fTUFHSUMoeCkpIHx8IChTTUFHSUMgPT0gTl9NQUdJQyh4KSkpID8gKCh4KS5hX3RleHQpIFwKLQkgOiAoKHgpLmFfdGV4dCAtIE5fQUREUkFESih4KSAtIEVYRUNfQllURVNfU0laRSkpCi0KLSNlbmRpZiAvKiBBX09VVF9EWU5JWDNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2VuY2FwLmggYi9pbmNsdWRlL2FvdXQvZW5jYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxNWQ0OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvZW5jYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBZZXQgQW5vdGhlciBUcnkgYXQgZW5jYXBzdWxhdGluZyBic2Qgb2JqZWN0IGZpbGVzIGluIGNvZmYuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBhY2UgV2lsbGlzc29uIDEyLzkvODgKLQotICAgVGhpcyBmaWxlIGlzIG9ic29sZXRlLiAgSXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGp1c3QgZGVmaW5lIGEgYnVuY2gKLSAgIG9mIHN0dWZmIHRoYXQgQkZEIGNhbiB1c2UgdG8gZG8gY29mZi1lbmNhcHN1bGF0ZWQgZmlsZXMuICAtLWdudUBjeWdudXMuY29tCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBXZSBvbmx5IHVzZSB0aGUgY29mZiBoZWFkZXJzIHRvIHRlbGwgdGhlIGtlcm5lbAotICogaG93IHRvIGV4ZWMgdGhlIGZpbGUuICBUaGVyZWZvcmUsIHRoZSBvbmx5IGZpZWxkcyB0aGF0IG5lZWQgdG8gCi0gKiBiZSBmaWxsZWQgaW4gYXJlIHRoZSBzY25wdHIgYW5kIHZhZGRyIGZvciB0aGUgdGV4dCBhbmQgZGF0YQotICogc2VjdGlvbnMsIGFuZCB0aGUgdmFkZHIgZm9yIHRoZSBic3MuICBBcyBmYXIgYXMgY29mZiBpcyBjb25jZXJuZWQsCi0gKiB0aGVyZSBpcyBubyBzeW1ib2wgdGFibGUsIHJlbG9jYXRpb24sIG9yIGxpbmUgbnVtYmVycy4KLSAqCi0gKiBBIG5vcm1hbCBic2QgaGVhZGVyIChzdHJ1Y3QgZXhlYykgaXMgcGxhY2VkIGFmdGVyIHRoZSBjb2ZmIGhlYWRlcnMsCi0gKiBhbmQgYmVmb3JlIHRoZSByZWFsIHRleHQuICBJIGRlZmluZWQgYSB0aGUgbmV3IGZpZWxkcyAnYV9tYWNodHlwZScKLSAqIGFuZCBhX2ZsYWdzLiAgSWYgYV9tYWNodHlwZSBpcyBNXzM4NiwgYW5kIGFfZmxhZ3MgJiBBX0VOQ0FQIGlzCi0gKiB0cnVlLCB0aGVuIHRoZSBic2QgaGVhZGVyIGlzIHByZWNlZWRlZCBieSBhIGNvZmYgaGVhZGVyLiAgTWFjcm9zCi0gKiBsaWtlIE5fVFhUT0ZGIGFuZCBOX1RYVEFERFIgdXNlIHRoaXMgZmllbGQgdG8gZmluZCB0aGUgYnNkIGhlYWRlci4KLSAqIAotICogVGhlIG9ubHkgcHJvYmxlbSBpcyB0byB0cmFjayBkb3duIHRoZSBic2QgZXhlYyBoZWFkZXIuICBUaGUKLSAqIG1hY3JvcyBIRUFERVJfT0ZGU0VULCBldGMgZG8gdGhpcy4KLSAqLwotCi0jZGVmaW5lIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSAweDIwIC8qIGNvZmYgaGVhZGVyIHByZWNlZGVzIGJzZCBoZWFkZXIgKi8KLQotLyogRGVzY3JpYmUgdGhlIENPRkYgaGVhZGVyIHVzZWQgZm9yIGVuY2Fwc3VsYXRpb24uICAqLwotCi1zdHJ1Y3QgY29mZmhlYWRlcgotewotICAvKiBmaWxlaGRyICovCi0gIHVuc2lnbmVkIHNob3J0IGZfbWFnaWM7Ci0gIHVuc2lnbmVkIHNob3J0IGZfbnNjbnM7Ci0gIGxvbmcgZl90aW1kYXQ7Ci0gIGxvbmcgZl9zeW1wdHI7Ci0gIGxvbmcgZl9uc3ltczsKLSAgdW5zaWduZWQgc2hvcnQgZl9vcHRoZHI7Ci0gIHVuc2lnbmVkIHNob3J0IGZfZmxhZ3M7Ci0gIC8qIGFvdXRoZHIgKi8KLSAgc2hvcnQgbWFnaWM7Ci0gIHNob3J0IHZzdGFtcDsKLSAgbG9uZyB0c2l6ZTsKLSAgbG9uZyBkc2l6ZTsKLSAgbG9uZyBic2l6ZTsKLSAgbG9uZyBlbnRyeTsKLSAgbG9uZyB0ZXh0X3N0YXJ0OwotICBsb25nIGRhdGFfc3RhcnQ7Ci0gIHN0cnVjdCBjb2Zmc2NuCi0gICAgewotICAgICAgY2hhciBzX25hbWVbOF07Ci0gICAgICBsb25nIHNfcGFkZHI7Ci0gICAgICBsb25nIHNfdmFkZHI7Ci0gICAgICBsb25nIHNfc2l6ZTsKLSAgICAgIGxvbmcgc19zY25wdHI7Ci0gICAgICBsb25nIHNfcmVscHRyOwotICAgICAgbG9uZyBzX2xubm9wdHI7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBzX25yZWxvYzsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHNfbmxubm87Ci0gICAgICBsb25nIHNfZmxhZ3M7Ci0gICAgfSBzY25zWzNdOwotfTsKLQwKLS8qIERlc2NyaWJlIHNvbWUgb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGVuY2Fwc3VsYXRpb24sCi0gICBpbmNsdWRpbmcgaG93IHRvIGZpbmQgdGhlIGVuY2Fwc3VsYXRlZCBCU0QgaGVhZGVyLiAgKi8KLQotLyogRklYTUUsIHRoaXMgaXMgZHVtYi4gIFRoZSBzYW1lIHRvb2xzIGNhbid0IGhhbmRsZSBhLm91dHMgZm9yIGRpZmZlcmVudAotICAgYXJjaGl0ZWN0dXJlcywganVzdCBiZWNhdXNlIENPRkZfTUFHSUMgaXMgZGlmZmVyZW50OyBzbyB5b3UgbmVlZCBhCi0gICBzZXBhcmF0ZSBHTlUgbm0gZm9yIGV2ZXJ5IGFyY2hpdGVjdHVyZSEhPyAgVW5mb3J0dW5hdGVseSwgaXQgbmVlZHMgdG8KLSAgIGJlIHRoaXMgd2F5LCBzaW5jZSB0aGUgQ09GRl9NQUdJQyB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBrZXJuZWwKLSAgIHdlJ3JlIHRyeWluZyB0byBmb29sIGhlcmUuICAqLwotICAgCi0jZGVmaW5lIENPRkZfTUFHSUNfSTM4NiAwNTE0IC8qIEkzODZNQUdJQyAqLwotI2RlZmluZSBDT0ZGX01BR0lDX002OEsgMDUyMCAvKiBNQzY4TUFHSUMgKi8KLSNkZWZpbmUJQ09GRl9NQUdJQ19BMjlLIDB4MTdBCS8qIFVzZWQgYnkgYXNtMjlrIGNyb3NzLXRvb2xzICovCi0KLSNpZmRlZiBDT0ZGX01BR0lDCi1zaG9ydCBfX2hlYWRlcl9vZmZzZXRfdGVtcDsKLSNkZWZpbmUgSEVBREVSX09GRlNFVChmKSBcCi0JKF9faGVhZGVyX29mZnNldF90ZW1wID0gMCwgXAotCSBmcmVhZCAoKGNoYXIgKikmX19oZWFkZXJfb2Zmc2V0X3RlbXAsIHNpemVvZiAoc2hvcnQpLCAxLCAoZikpLCBcCi0JIGZzZWVrICgoZiksIC1zaXplb2YgKHNob3J0KSwgMSksIFwKLQkgX19oZWFkZXJfb2Zmc2V0X3RlbXA9PUNPRkZfTUFHSUMgPyBzaXplb2Yoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKLSNlbHNlCi0jZGVmaW5lIEhFQURFUl9PRkZTRVQoZikgMAotI2VuZGlmCi0KLSNkZWZpbmUgSEVBREVSX1NFRUsoZikgKGZzZWVrICgoZiksIEhFQURFUl9PRkZTRVQoKGYpKSwgMSkpCi0MCi0vKiBEZXNjcmliZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBCU0QgaGVhZGVyCi0gICB0aGF0IGFwcGVhcnMgaW5zaWRlIHRoZSBlbmNhcHN1bGF0aW9uLiAgKi8KLQotLyogRW5jYXBzdWxhdGVkIGNvZmYgZmlsZXMgdGhhdCBhcmUgbGlua2VkIFpNQUdJQyBoYXZlIGEgdGV4dCBzZWdtZW50Ci0gICBvZmZzZXQganVzdCBwYXN0IHRoZSBoZWFkZXIgKGFuZCBhIG1hdGNoaW5nIFRYVEFERFIpLCBleGNsdWRpbmcKLSAgIHRoZSBoZWFkZXJzIGZyb20gdGhlIHRleHQgc2VnbWVudCBwcm9wZXIgYnV0IGtlZXBpbmcgdGhlIHBoeXNpY2FsCi0gICBsYXlvdXQgYW5kIHRoZSB2aXJ0dWFsIG1lbW9yeSBsYXlvdXQgcGFnZS1hbGlnbmVkLgotCi0gICBOb24tZW5jYXBzdWxhdGVkIGEub3V0IGZpbGVzIHRoYXQgYXJlIGxpbmtlZCBaTUFHSUMgaGF2ZSBhIHRleHQKLSAgIHNlZ21lbnQgdGhhdCBzdGFydHMgYXQgMCBhbmQgYW4gTl9UWFRBRFIgc2ltaWxhcmx5IG9mZnNldCB0byAwLgotICAgVGhleSB0b28gYXJlIHBhZ2UtYWxpZ25lZCB3aXRoIGVhY2ggb3RoZXIsIGJ1dCB0aGV5IGluY2x1ZGUgdGhlCi0gICBhLm91dCBoZWFkZXIgYXMgcGFydCBvZiB0aGUgdGV4dC4gCi0KLSAgIFRoZSBfTl9IRFJPRkYgZ2V0cyBzaXplb2Ygc3RydWN0IGV4ZWMgYWRkZWQgdG8gaXQsIHNvIHdlIGhhdmUKLSAgIHRvIGNvbXBlbnNhdGUgaGVyZS4gIFNlZSA8YS5vdXQuZ251Lmg+LiAgKi8KLQotI3VuZGVmIF9OX0hEUk9GRgotI3VuZGVmIE5fVFhUQUREUgotI3VuZGVmIE5fREFUQUREUgotCi0jZGVmaW5lIF9OX0hEUk9GRih4KSAoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAotCQkgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKSA6IDApCi0KLS8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotCSgoTl9GTEFHUyh4KSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkgPyBcCi0JIHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOiAwKQotI2RlZmluZSBTRUdNRU5UX1NJWkUgMHg0MDAwMDAKLQotI2RlZmluZSBOX0RBVEFERFIoeCkgXAotCSgoTl9GTEFHUyh4KSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkgPyBcCi0JIChTRUdNRU5UX1NJWkUgKyAoKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0LTEpICYgfihTRUdNRU5UX1NJWkUtMSkpKSA6IFwKLQkgKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ob3N0LmggYi9pbmNsdWRlL2FvdXQvaG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM2MjEyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9ob3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBQYXJhbWV0ZXJzIGFib3V0IHRoZSBhLm91dCBmb3JtYXQsIGJhc2VkIG9uIHRoZSBob3N0IHN5c3RlbSBvbiB3aGljaAotICAgdGhlIHByb2dyYW0gaXMgY29tcGlsZWQuICAqLwotCi0vKiBBZGRyZXNzIG9mIGRhdGEgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLgotICAgSXQgaXMgdXAgdG8geW91IHRvIGRlZmluZSBTRUdNRU5UX1NJWkUKLSAgIG9uIG1hY2hpbmVzIG5vdCBsaXN0ZWQgaGVyZS4gICovCi0jaWZuZGVmIFNFR01FTlRfU0laRQotI2lmIGRlZmluZWQoaHAzMDApIHx8IGRlZmluZWQocHlyKQotI2RlZmluZSBTRUdNRU5UX1NJWkUgcGFnZV9zaXplCi0jZW5kaWYKLSNpZmRlZglzb255Ci0jZGVmaW5lCVNFR01FTlRfU0laRQkweDEwMDAKLSNlbmRpZgkvKiBTb255LiAgKi8KLSNpZmRlZiBpczY4awotI2RlZmluZSBTRUdNRU5UX1NJWkUgMHgyMDAwMAotI2VuZGlmCi0jaWYgZGVmaW5lZChtNjhrKSAmJiBkZWZpbmVkKFBPUlRBUikKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDQwMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2VuZGlmCi0jZW5kaWYgLyohZGVmaW5lZChTRUdNRU5UX1NJWkUpKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hwLmggYi9pbmNsdWRlL2FvdXQvaHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyZjQ5Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvaHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIFNwZWNpYWwgdmVyc2lvbiBvZiA8YS5vdXQuaD4gZm9yIHVzZSB1bmRlciBocC11eC4KLSAgIENvcHlyaWdodCAxOTg4LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUSElTIEZJTEUgSVMgT0JTT0xFVEUuICBJdCBuZWVkcyB0byBiZSByZXZpc2VkIGFzIGEgdmFyaWFudCAiZXh0ZXJuYWwiCi0gICBhLm91dCBmb3JtYXQgZm9yIHVzZSB3aXRoIEJGRC4gICovCi0KLS8qIFRoZSBgZXhlYycgc3RydWN0dXJlIGFuZCBvdmVyYWxsIGxheW91dCBtdXN0IGJlIGNsb3NlIHRvIEhQJ3Mgd2hlbgotICAgd2UgYXJlIHJ1bm5pbmcgb24gYW4gSFAgc3lzdGVtLCBvdGhlcndpc2Ugd2Ugd2lsbCBub3QgYmUgYWJsZSB0bwotICAgZXhlY3V0ZSB0aGUgcmVzdWx0aW5nIGZpbGUuICovCi0KLS8qIEFsbG93IHRoaXMgZmlsZSB0byBiZSBpbmNsdWRlZCB0d2ljZS4gKi8KLSNpZm5kZWYgX19HTlVfRVhFQ19NQUNST1NfXwotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBzaG9ydCBhX21hY2h0eXBlOwkvKiBtYWNoaW5lIHR5cGUgKi8KLSAgdW5zaWduZWQgc2hvcnQgYV9tYWdpYzsJLyogbWFnaWMgbnVtYmVyICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTE7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTI7Ci0gIHVuc2lnbmVkIGxvbmcgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV90cnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9kcnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTM7CS8qIEhQID0gcGFzY2FsIGludGVyZmFjZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTQ7CS8qIEhQID0gc3ltYm9sIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNTsJLyogSFAgPSBkZWJ1ZyBuYW1lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OwkvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTY7CS8qIEhQID0gc291cmNlIGxpbmUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU3OwkvKiBIUCA9IHZhbHVlIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlODsKLX07Ci0KLS8qIFRlbGwgYS5vdXQuZ251Lmggbm90IHRvIGRlZmluZSBgc3RydWN0IGV4ZWMnLiAgKi8KLSNkZWZpbmUgX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fCi0KLSNpbmNsdWRlICIuLi9hLm91dC5nbnUuaCIKLQotI3VuZGVmIE5fTUFHSUMKLSN1bmRlZiBOX01BQ0hUWVBFCi0jdW5kZWYgTl9GTEFHUwotI3VuZGVmIE5fU0VUX0lORk8KLSN1bmRlZiBOX1NFVF9NQUdJQwotI3VuZGVmIE5fU0VUX01BQ0hUWVBFCi0jdW5kZWYgTl9TRVRfRkxBR1MKLQotI2RlZmluZSBOX01BR0lDKGV4ZWMpICgoZXhlYykgLiBhX21hZ2ljKQotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZXhlYykgLiBhX21hY2h0eXBlKQotI2RlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgKCgoZXhlYykgLiBhX21hZ2ljKSA9IChtYWdpYykpCi0jZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSAoKChleGVjKSAuIGFfbWFjaHR5cGUpID0gKG1hY2h0eXBlKSkKLQotI3VuZGVmIE5fQkFETUFHCi0jZGVmaW5lIE5fQkFETUFHKHgpICgoX05fQkFETUFHICh4KSkgfHwgKF9OX0JBRE1BQ0ggKHgpKSkKLQotI2RlZmluZSBfTl9CQURNQUNIKHgpCQkJCQkJCVwKLSgoKE5fTUFDSFRZUEUgKHgpKSAhPSBIUDkwMDBTMjAwX0lEKSAmJgkJCQkJXAotICgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTh4Nl9JRCkpCi0KLSNkZWZpbmUgSFA5OHg2X0lEIDB4MjBBCi0jZGVmaW5lIEhQOTAwMFMyMDBfSUQgMHgyMEMKLQotI3VuZGVmIF9OX0hEUk9GRgotI2RlZmluZSBfTl9IRFJPRkYoeCkgKFNFR01FTlRfU0laRSAtIChzaXplb2YgKHN0cnVjdCBleGVjKSkpCi0KLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MTAwMAotCi0jZW5kaWYgLyogX19HTlVfRVhFQ19NQUNST1NfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hwMzAwaHB1eC5oIGIvaW5jbHVkZS9hb3V0L2hwMzAwaHB1eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQ1MTk2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9ocDMwMGhwdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKiBTcGVjaWFsIHZlcnNpb24gb2YgPGEub3V0Lmg+IGZvciB1c2UgdW5kZXIgaHAtdXguCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gKi8KLQotc3RydWN0IGhwMzAwaHB1eF9leGVjX2J5dGVzCi17Ci0gIHVuc2lnbmVkIGNoYXIgZV9pbmZvWzRdOyAgIC8qIGFfbWFjaHR5cGUvYV9tYWdpYyAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3BhcmUxWzRdOwotICB1bnNpZ25lZCBjaGFyIGVfc3BhcmUyWzRdOwotICB1bnNpZ25lZCBjaGFyIGVfdGV4dFs0XTsgICAvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBlX2RhdGFbNF07ICAgLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgZV9ic3NbNF07ICAgIC8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSAsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgZV90cnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzKi8KLSAgdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsgLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMqLwotICB1bnNpZ25lZCBjaGFyIGVfcGFzc2l6ZVs0XTsvKiBIUCA9IHBhc2NhbCBpbnRlcmZhY2Ugc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsgICAvKiBIUCA9IHN5bWJvbCB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTVbNF07IC8qIEhQID0gZGVidWcgbmFtZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9lbnRyeVs0XTsgIC8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlNls0XTsgLyogSFAgPSBzb3VyY2UgbGluZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zdXBzaXplWzRdOy8qIEhQID0gdmFsdWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfZHJlbG9jc1s0XTsKLSAgdW5zaWduZWQgY2hhciBlX2V4dGVuc2lvbls0XTsgLyogZmlsZSBvZmZzZXQgb2YgZXh0ZW5zaW9uICovCi19OwotI2RlZmluZQlFWEVDX0JZVEVTX1NJWkUJNjQKLQotc3RydWN0IGhwMzAwaHB1eF9ubGlzdF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciBlX3ZhbHVlWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgZV90eXBlWzFdOwotICAgIHVuc2lnbmVkIGNoYXIgZV9sZW5ndGhbMV07CS8qIGxlbmd0aCBvZiBhc2NpaSBzeW1ib2wgbmFtZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgZV9hbG1vZFsyXTsJLyogYWxpZ25tZW50IG1vZCAqLwotICAgIHVuc2lnbmVkIGNoYXIgZV9zaGxpYlsyXTsgICAvKiBpbmZvIGFib3V0IGR5bmFtaWMgbGlua2luZyAqLwotICB9OwotI2RlZmluZSBFWFRFUk5BTF9OTElTVF9TSVpFIDEwCi0KLXN0cnVjdCBocDMwMGhwdXhfcmVsb2MKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRyZXNzWzRdOy8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlICovCi0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzJdOyAgLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAgICAgICAgICovCi0gICAgdW5zaWduZWQgY2hhciByX3R5cGVbMV07ICAgLyogcmVsb2NhdGlvbiB0eXBlICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdW5zaWduZWQgY2hhciByX2xlbmd0aFsxXTsgLyogbGVuZ3RoIG9mIGl0ZW0gdG8gcmVsb2MgICAgICAgICAgICAgICovCi0gIH07Ci0KLXN0cnVjdCBocDMwMGhwdXhfaGVhZGVyX2V4dGVuc2lvbgotewotICAgIHVuc2lnbmVkIGNoYXIgZV9zeW1zWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgdW5pcXVlX2hlYWRlcnNbMTIqNF07Ci0gICAgdW5zaWduZWQgY2hhciBlX2hlYWRlclsyXTsgICAvKiB0eXBlIG9mIGhlYWRlciAqLwotICAgIHVuc2lnbmVkIGNoYXIgZV92ZXJzaW9uWzJdOyAgLyogdmVyc2lvbiAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfc2l6ZVs0XTsgICAgIC8qIGJ5dGVzIGZvbGxvd2luZyovCi0gICAgdW5zaWduZWQgY2hhciBlX2V4dGVuc2lvbls0XTsvKiBmaWxlIG9mZnNldCBvZiBuZXh0IGV4dGVuc2lvbiAqLwotfTsKLSNkZWZpbmUgRVhURVJOQUxfRVhURU5TSU9OX0hFQURFUl9TSVpFICgxNio0KQotCi0vKiBocHV4IHNlcGFyYXRlcyBvYmplY3QgZmlsZXMgKDB4MTA2KSBhbmQgaW1wdXJlIGV4ZWN1dGFibGVzICgweDEwNykgICovCi0vKiBidXQgdGhlIGJmZCBjb2RlIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlbS4gU2luY2Ugd2Ugd2FudCB0byovCi0vKiByZWFkIGhwdXggLm8gZmlsZXMsIHdlIGFkZCBhbiBzcGVjaWFsIGRlZmluZSBhbmQgdXNlIGl0IGJlbG93IGluICAgICovCi0vKiBvZmZzZXQgYW5kIGFkZHJlc3MgY2FsY3VsYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgSFBVWF9ET1RfT19NQUdJQyAweDEwNgotI2RlZmluZSBPTUFHSUMgMHgxMDcgICAgICAgLyogb2JqZWN0IGZpbGUgb3IgaW1wdXJlIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBOTUFHSUMgMHgxMDggICAgICAgLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICAqLwotI2RlZmluZSBaTUFHSUMgMHgxMEIgICAgICAgLyogZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUuICAgICAgICAgICAqLwotCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAotCi0jaWYgMCAvKiBsaWJhb3V0Lmggb25seSB1c2VzIHRoZSBsb3dlciA4IGJpdHMgKi8KLSNkZWZpbmUgSFA5OHg2X0lEIDB4MjBBCi0jZGVmaW5lIEhQOTAwMFMyMDBfSUQgMHgyMEMKLSNlbmRpZgotI2RlZmluZSBIUDk4eDZfSUQgMHgwQQotI2RlZmluZSBIUDkwMDBTMjAwX0lEIDB4MEMKLQotI2RlZmluZSBOX0JBRE1BRyh4KSAoKF9OX0JBRE1BRyAoeCkpIHx8IChfTl9CQURNQUNIICh4KSkpCi0KLSNkZWZpbmUgTl9EQVRBRERSKHgpIFwKLSAgICAoKE5fTUFHSUMoeCk9PU9NQUdJQyB8fCBOX01BR0lDKHgpPT1IUFVYX0RPVF9PX01BR0lDKSA/IFwKLSAgICAgICAgKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCkpIFwKLSAgICAgOiAgKE5fU0VHU0laRSh4KSArICgoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KS0xKSAmIH4oTl9TRUdTSVpFKHgpLTEpKSkpCi0KLSNkZWZpbmUgX05fQkFETUFDSCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSgoKE5fTUFDSFRZUEUgKHgpKSAhPSBIUDkwMDBTMjAwX0lEKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAoKE5fTUFDSFRZUEUgKHgpKSAhPSBIUDk4eDZfSUQpKQotCi0jZGVmaW5lIF9OX0JBRE1BRyh4KQkgIChOX01BR0lDKHgpICE9IEhQVVhfRE9UX09fTUFHSUMgXAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0gIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDICkKLQotI3VuZGVmIF9OX0hEUk9GRgotI2RlZmluZSBfTl9IRFJPRkYoeCkgKFNFR01FTlRfU0laRSAtIChzaXplb2YgKHN0cnVjdCBleGVjKSkpCi0KLSN1bmRlZiBOX0RBVE9GRgotI3VuZGVmIE5fUEFTT0ZGCi0jdW5kZWYgTl9TWU1PRkYKLSN1bmRlZiBOX1NVUE9GRgotI3VuZGVmIE5fVFJFTE9GRgotI3VuZGVmIE5fRFJFTE9GRgotI3VuZGVmIE5fU1RST0ZGCi0KLSNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArIE5fVFhUU0laRSh4KSApCi0jZGVmaW5lIE5fUEFTT0ZGKHgpICAgICAoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSkKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX1BBU09GRih4KSAgIC8qICsgKHgpLmFfcGFzc2l6ZSovICkKLSNkZWZpbmUgTl9TVVBPRkYoeCkgICAgICggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9TVVBPRkYoeCkgICAgLyogKyAwICh4KS5hX3N1cHNpemUqLyApCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fRVhUSE9GRih4KSAgICAoIE5fRFJFTE9GRih4KSAgIC8qICArIDAgKHgpLmFfZHJzaXplICovKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIDAgLyogbm8gc3RyaW5nIHRhYmxlICovICkKLQotLyogdXNlIHRoZXNlIHdoZW4gdGhlIGZpbGUgaGFzIGdudSBzeW1ib2wgdGFibGVzICovCi0jZGVmaW5lIE5fR05VX1RSRUxPRkYoeCkgKE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSkKLSNkZWZpbmUgTl9HTlVfRFJFTE9GRih4KSAoTl9HTlVfVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9HTlVfU1lNT0ZGKHgpICAoTl9HTlVfRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSkKLQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4MTAwMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgMHgxMDAwCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0KLSN1bmRlZiBOX1NIQVJFRF9MSUIKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpICAoIDAgLyogbm8gc2hhcmVkIGxpYnJhcmllcyAqLyApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaHBwYS5oIGIvaW5jbHVkZS9hb3V0L2hwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxODVkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaW5jbHVkZSAiZmlsZWhkci5oIgotI2luY2x1ZGUgImFvdXRoZHIuaCIKLSNpbmNsdWRlICJzY25oZHIuaCIKLSNpbmNsdWRlICJzcGFjZWhkci5oIgotI2luY2x1ZGUgInN5bXMuaCIKLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvcmFubGliLmggYi9pbmNsdWRlL2FvdXQvcmFubGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MjYwMDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3JhbmxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogcmFubGliLmggLS0gYXJjaGl2ZSBsaWJyYXJ5IGluZGV4IG1lbWJlciBkZWZpbml0aW9uIGZvciBHTlUuCi0gICBDb3B5cmlnaHQgMTk5MC0xOTkxICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIFN5bWRlZiBtZW1iZXIgb2YgYW4gYXJjaGl2ZSBjb250YWlucyB0d28gdGhpbmdzOgotICAgYSB0YWJsZSB0aGF0IG1hcHMgc3ltYm9sLXN0cmluZyBvZmZzZXRzIHRvIGZpbGUgb2Zmc2V0cywKLSAgIGFuZCBhIHN5bWJvbC1zdHJpbmcgdGFibGUuICBBbGwgdGhlIHN5bWJvbCBuYW1lcyBhcmUKLSAgIHJ1biB0b2dldGhlciAoZWFjaCB3aXRoIHRyYWlsaW5nIG51bGwpIGluIHRoZSBzeW1ib2wtc3RyaW5nCi0gICB0YWJsZS4gIFRoZXJlIGlzIGEgc2luZ2xlIGxvbmd3b3JkIGJ5dGVjb3VudCBvbiB0aGUgZnJvbnQKLSAgIG9mIGVhY2ggb2YgdGhlc2UgdGFibGVzLiAgVGh1cyBpZiB3ZSBoYXZlIHR3byBzeW1ib2xzLAotICAgImZvbyIgYW5kICJfYmFyIiwgdGhhdCBhcmUgaW4gYXJjaGl2ZSBtZW1iZXJzIGF0IG9mZnNldHMKLSAgIDIwMCBhbmQgOTAwLCBpdCB3b3VsZCBsb29rIGxpa2UgdGhpczoKLSAgICAgICAgMTYJCTsgYnl0ZSBjb3VudCBvZiBpbmRleCB0YWJsZQotICAJMAkJOyBvZmZzZXQgb2YgImZvbyIgaW4gc3RyaW5nIHRhYmxlCi0gIAkyMDAJCTsgb2Zmc2V0IG9mIGZvby1tb2R1bGUgaW4gZmlsZQotICAJNAkJOyBvZmZzZXQgb2YgImJhciIgaW4gc3RyaW5nIHRhYmxlCi0gIAk5MDAJCTsgb2Zmc2V0IG9mIGJhci1tb2R1bGUgaW4gZmlsZQotICAJOQkJOyBieXRlIGNvdW50IG9mIHN0cmluZyB0YWJsZQotICAJImZvb1wwX2JhclwwIgk7IHN0cmluZyB0YWJsZSAgKi8KLQotI2RlZmluZQlSQU5MSUJNQUcJIl9fLlNZTURFRiIJLyogQXJjaGl2ZSBmaWxlIG5hbWUgY29udGFpbmluZyBpbmRleCAqLwotI2RlZmluZQlSQU5MSUJTS0VXCTMJCS8qIENyZWF0aW9uIHRpbWUgb2Zmc2V0ICovCi0KLS8qIEZvcm1hdCBvZiBfXy5TWU1ERUY6Ci0gICBGaXJzdCwgYSBsb25nd29yZCBjb250YWluaW5nIHRoZSBzaXplIG9mIHRoZSAnc3ltZGVmJyBkYXRhIHRoYXQgZm9sbG93cy4KLSAgIFNlY29uZCwgemVybyBvciBtb3JlICdzeW1kZWYnIHN0cnVjdHVyZXMuCi0gICBUaGlyZCwgYSBsb25nd29yZCBjb250YWluaW5nIHRoZSBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgc3RyaW5ncy4KLSAgIEZvdXJ0aCwgemVybyBvciBtb3JlIHN5bWJvbCBuYW1lIHN0cmluZ3MgKGVhY2ggZm9sbG93ZWQgYnkgYSBudWxsKS4gICovCi0KLXN0cnVjdCBzeW1kZWYKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBzdHJpbmdfb2Zmc2V0OwkvKiBJbiB0aGUgZmlsZSAqLwotCWNoYXIgKm5hbWU7CQkJLyogSW4gbWVtb3J5LCBzb21ldGltZXMgKi8KLSAgICAgIH0gczsKLSAgICAvKiB0aGlzIHBvaW50cyB0byB0aGUgZnJvbnQgb2YgdGhlIGZpbGUgaGVhZGVyIChBS0EgbWVtYmVyIGhlYWRlciAtLQotICAgICAgIGEgc3RydWN0IGFyX2hkciksIG5vdCB0byB0aGUgZnJvbnQgb2YgdGhlIGZpbGUgb3IgaW50byB0aGUgZmlsZSkuCi0gICAgICAgaW4gb3RoZXIgd29yZHMgaXQgb25seSB0ZWxscyB5b3Ugd2hpY2ggZmlsZSB0byByZWFkICovICAgICAgIAotICAgIHVuc2lnbmVkIGxvbmcgZmlsZV9vZmZzZXQ7Ci0gIH07Ci0KLS8qIENvbXBhdGFiaWxpdHkgd2l0aCBCU0QgY29kZSAqLwotCi0jZGVmaW5lCXJhbmxpYglzeW1kZWYKLSNkZWZpbmUJcmFuX3VuCXMKLSNkZWZpbmUJcmFuX3N0cnggc3RyaW5nX29mZnNldAotI2RlZmluZQlyYW5fbmFtZSBuYW1lCi0jZGVmaW5lCXJhbl9vZmYJZmlsZV9vZmZzZXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9yZWxvYy5oIGIvaW5jbHVkZS9hb3V0L3JlbG9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2M1NTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3JlbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiByZWxvYy5oIC0tIEhlYWRlciBmaWxlIGZvciByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IDE5ODktMTk5MSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMgZm9yIGEub3V0IGZpbGVzIHVzaW5nIHJlbG9jX2luZm9fZXh0ZW5kZWQKLSAgIChTUEFSQyBhbmQgQU1EIDI5MDAwKS4gKi8KLQotI2lmbmRlZiBfUkVMT0NfSF9SRUFEXwotI2RlZmluZSBfUkVMT0NfSF9SRUFEXyAxCi0KLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgUkVMT0NfOCwgICAgICAgIFJFTE9DXzE2LCAgICAgICAgUkVMT0NfMzIsIC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLwotICAgIFJFTE9DX0RJU1A4LCAgICBSRUxPQ19ESVNQMTYsICAgIFJFTE9DX0RJU1AzMiwgLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLwotICAgIFJFTE9DX1dESVNQMzAsICBSRUxPQ19XRElTUDIyLAotICAgIFJFTE9DX0hJMjIsICAgICBSRUxPQ18yMiwKLSAgICBSRUxPQ18xMywgICAgICAgUkVMT0NfTE8xMCwKLSAgICBSRUxPQ19TRkFfQkFTRSwgUkVMT0NfU0ZBX09GRjEzLAotICAgIFJFTE9DX0JBU0UxMCwgICBSRUxPQ19CQVNFMTMsICAgIFJFTE9DX0JBU0UyMiwgLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLwotICAgIFJFTE9DX1BDMTAsICAgICBSRUxPQ19QQzIyLAkvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gICAgUkVMT0NfSk1QX1RCTCwJCS8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gICAgUkVMT0NfU0VHT0ZGMTYsCQkvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICAgIFJFTE9DX0dMT0JfREFULCAgUkVMT0NfSk1QX1NMT1QsIFJFTE9DX1JFTEFUSVZFLAotICAgIFJFTE9DXzExLAotICAgIFJFTE9DX1dESVNQMl8xNCwKLSAgICBSRUxPQ19XRElTUDE5LAotICAgIFJFTE9DX0hISTIyLAotICAgIFJFTE9DX0hMTzEwLAotICAgIAotICAgIC8qIDI5SyByZWxvY2F0aW9uIHR5cGVzICovCi0gICAgUkVMT0NfSlVNUFRBUkcsIFJFTE9DX0NPTlNULCAgICAgUkVMT0NfQ09OU1RILAotICAgIAotICAgIFJFTE9DX1dESVNQMTQsIFJFTE9DX1dESVNQMjEsCi0gICAgCi0gICAgTk9fUkVMT0MKLSAgICB9OwotCi0jZGVmaW5lCVJFTE9DX1RZUEVfTkFNRVMgXAotIjgiLAkJIjE2IiwJCSIzMiIsCQkiRElTUDgiLAlcCi0iRElTUDE2IiwJIkRJU1AzMiIsCSJXRElTUDMwIiwJIldESVNQMjIiLAlcCi0iSEkyMiIsCQkiMjIiLAkJIjEzIiwJCSJMTzEwIiwJCVwKLSJTRkFfQkFTRSIsCSJTRkFPRkYxMyIsCSJCQVNFMTAiLAkiQkFTRTEzIiwJXAotIkJBU0UyMiIsCSJQQzEwIiwJCSJQQzIyIiwJCSJKTVBfVEJMIiwJXAotIlNFR09GRjE2IiwJIkdMT0JfREFUIiwJIkpNUF9TTE9UIiwJIlJFTEFUSVZFIiwJXAotIjExIiwJCSJXRElTUDJfMTQiLAkiV0RJU1AxOSIsIAkiSEhJMjIiLAlcCi0iSExPMTAiLAkJCQkJCQlcCi0iSlVNUFRBUkciLAkiQ09OU1QiLAkiQ09OU1RIIiwJIldESVNQMTQiLAlcCi0iV0RJU1AyMSIsCVwKLSJOT19SRUxPQyIKLQotI2VuZGlmIC8qIF9SRUxPQ19IX1JFQURfICovCi0KLS8qIGVuZCBvZiByZWxvYy5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvc3RhYi5kZWYgYi9pbmNsdWRlL2FvdXQvc3RhYi5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmQyZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3N0YWIuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qIFRhYmxlIG9mIERCWCBzeW1ib2wgY29kZXMgZm9yIHRoZSBHTlUgc3lzdGVtLgotICAgQ29weXJpZ2h0IChDKSAxOTg4LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIE5ldyBzdGFiIGZyb20gU29sYXJpcyAyLiAgVGhpcyB1c2VzIGFuIG5fdHlwZSBvZiAwLCB3aGljaCBpbiBhLm91dCBmaWxlcwotICAgb3ZlcmxhcHMgdGhlIE5fVU5ERiB1c2VkIGZvciBvcmRpbmFyeSBzeW1ib2xzLiAgSW4gRUxGIGZpbGVzLCB0aGUKLSAgIGRlYnVnIGluZm9ybWF0aW9uIGlzIGluIGEgZGlmZmVyZW50IGZpbGUgc2VjdGlvbiwgc28gdGhlcmUgaXMgbm8gY29uZmxpY3QuCi0gICBUaGlzIHN5bWJvbCdzIG5fdmFsdWUgZ2l2ZXMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBzZWN0aW9uIGFzc29jaWF0ZWQKLSAgIHdpdGggdGhpcyBmaWxlLiAgVGhlIHN5bWJvbCdzIG5fc3RyeCAocmVsYXRpdmUgdG8gdGhlIGp1c3QtdXBkYXRlZAotICAgc3RyaW5nIHNlY3Rpb24gc3RhcnQgYWRkcmVzcykgZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLAotICAgZS5nLiAiZm9vLmMiLCB3aXRob3V0IGFueSBwYXRoIGluZm9ybWF0aW9uLiAgVGhlIHN5bWJvbCdzIG5fZGVzYyBnaXZlcwotICAgdGhlIGNvdW50IG9mIHVwY29taW5nIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZSAobm90IGluY2x1ZGluZwotICAgdGhpcyBvbmUpLiAgKi8KLS8qIF9fZGVmaW5lX3N0YWIgKE5fVU5ERiwgMHgwMCwgIlVOREYiKSAgKi8KLQotLyogR2xvYmFsIHZhcmlhYmxlLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KLSAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fR1NZTSwgMHgyMCwgIkdTWU0iKQotCi0vKiBGdW5jdGlvbiBuYW1lIGZvciBCU0QgRm9ydHJhbi4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCi0gICBUbyBmaW5kIHRoZSBhZGRyZXNzLCBsb29rIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIHN5bWJvbC4gICovCi1fX2RlZmluZV9zdGFiIChOX0ZOQU1FLCAweDIyLCAiRk5BTUUiKQotCi0vKiBGdW5jdGlvbiBuYW1lIG9yIHRleHQtc2VnbWVudCB2YXJpYWJsZSBmb3IgQy4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLgotICAgRGVzYyBpcyBzdXBwb3NlZGx5IHN0YXJ0aW5nIGxpbmUgbnVtYmVyLCBidXQgR0NDIGRvZXNuJ3Qgc2V0IGl0Ci0gICBhbmQgREJYIHNlZW1zIG5vdCB0byBtaXNzIGl0LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRlVOLCAweDI0LCAiRlVOIikKLQotLyogRGF0YS1zZWdtZW50IHZhcmlhYmxlIHdpdGggaW50ZXJuYWwgbGlua2FnZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLgotICAgIlN0YXRpYyBTeW0iLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU1RTWU0sIDB4MjYsICJTVFNZTSIpCi0KLS8qIEJTUy1zZWdtZW50IHZhcmlhYmxlIHdpdGggaW50ZXJuYWwgbGlua2FnZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTENTWU0sIDB4MjgsICJMQ1NZTSIpCi0KLS8qIE5hbWUgb2YgbWFpbiByb3V0aW5lLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4gICovCi1fX2RlZmluZV9zdGFiIChOX01BSU4sIDB4MmEsICJNQUlOIikKLQotLyogU29sYXJpczI6ICBSZWFkLW9ubHkgZGF0YSBzeW1ib2xzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUk9TWU0sIDB4MmMsICJST1NZTSIpCi0KLS8qIEdsb2JhbCBzeW1ib2wgaW4gUGFzY2FsLgotICAgU3VwcG9zZWRseSB0aGUgdmFsdWUgaXMgaXRzIGxpbmUgbnVtYmVyOyBJJ20gc2tlcHRpY2FsLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUEMsIDB4MzAsICJQQyIpCi0KLS8qIE51bWJlciBvZiBzeW1ib2xzOiAgMCwgZmlsZXMsLGZ1bmNzLGxpbmVzIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gKi8KLV9fZGVmaW5lX3N0YWIgKE5fTlNZTVMsIDB4MzIsICJOU1lNUyIpCi0KLS8qICJObyBEU1QgbWFwIGZvciBzeW06IG5hbWUsICwwLHR5cGUsaWdub3JlZCIgIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gKi8KLV9fZGVmaW5lX3N0YWIgKE5fTk9NQVAsIDB4MzQsICJOT01BUCIpCi0KLS8qIE5ldyBzdGFiIGZyb20gU29sYXJpcyAyLiAgTGlrZSBOX1NPLCBidXQgZm9yIHRoZSBvYmplY3QgZmlsZS4gIFR3byBpbgotICAgYSByb3cgcHJvdmlkZSB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgLm8gZnJvbSBpdC4KLSAgIFNvbGFyaXMyIHVzZXMgdGhpcyB0byBhdm9pZCBwdXR0aW5nIHRoZSBzdGFicyBpbmZvIGludG8gdGhlIGxpbmtlZAotICAgZXhlY3V0YWJsZTsgdGhpcyBzdGFiIGdvZXMgaW50byB0aGUgIi5zdGFiLmluZGV4IiBzZWN0aW9uLCBhbmQgdGhlIGRlYnVnZ2VyCi0gICByZWFkcyB0aGUgcmVhbCBzdGFicyBkaXJlY3RseSBmcm9tIHRoZSAubyBmaWxlcyBpbnN0ZWFkLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fT0JKLCAweDM4LCAiT0JKIikKLQotLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzIDIuICBPcHRpb25zIGZvciB0aGUgZGVidWdnZXIsIHJlbGF0ZWQgdG8gdGhlCi0gICBzb3VyY2UgbGFuZ3VhZ2UgZm9yIHRoaXMgbW9kdWxlLiAgRS5nLiB3aGV0aGVyIHRvIHVzZSBBTlNJCi0gICBpbnRlZ3JhbCBwcm9tb3Rpb25zIG9yIHRyYWRpdGlvbmFsIGludGVncmFsIHByb21vdGlvbnMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9PUFQsIDB4M2MsICJPUFQiKQotCi0vKiBSZWdpc3RlciB2YXJpYWJsZS4gIFZhbHVlIGlzIG51bWJlciBvZiByZWdpc3Rlci4gICovCi1fX2RlZmluZV9zdGFiIChOX1JTWU0sIDB4NDAsICJSU1lNIikKLQotLyogTW9kdWxhLTIgY29tcGlsYXRpb24gdW5pdC4gIENhbiBzb21lb25lIHNheSB3aGF0IGluZm8gaXQgY29udGFpbnM/ICAqLwotX19kZWZpbmVfc3RhYiAoTl9NMkMsIDB4NDIsICJNMkMiKQotCi0vKiBMaW5lIG51bWJlciBpbiB0ZXh0IHNlZ21lbnQuICBEZXNjIGlzIHRoZSBsaW5lIG51bWJlcjsKLSAgIHZhbHVlIGlzIGNvcnJlc3BvbmRpbmcgYWRkcmVzcy4gIE9uIFNvbGFyaXMyLCB0aGUgbGluZSBudW1iZXIgaXMKLSAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi1fX2RlZmluZV9zdGFiIChOX1NMSU5FLCAweDQ0LCAiU0xJTkUiKQotCi0vKiBTaW1pbGFyLCBmb3IgZGF0YSBzZWdtZW50LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRFNMSU5FLCAweDQ2LCAiRFNMSU5FIikKLQotLyogU2ltaWxhciwgZm9yIGJzcyBzZWdtZW50LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQlNMSU5FLCAweDQ4LCAiQlNMSU5FIikKLQotLyogU3VuJ3Mgc291cmNlLWNvZGUgYnJvd3NlciBzdGFicy4gID8/IERvbid0IGtub3cgd2hhdCB0aGUgZmllbGRzIGFyZS4KLSAgIFN1cHBvc2VkbHkgdGhlIGZpZWxkIGlzICJwYXRoIHRvIGFzc29jaWF0ZWQgLmNiIGZpbGUiLiAgVEhJUyBWQUxVRQotICAgT1ZFUkxBUFMgV0lUSCBOX0JTTElORSEgICovCi1fX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSAoTl9CUk9XUywgMHg0OCwgIkJST1dTIikKLQotLyogR05VIE1vZHVsYS0yIGRlZmluaXRpb24gbW9kdWxlIGRlcGVuZGVuY3kuICBWYWx1ZSBpcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUKLSAgIG9mIHRoZSBkZWZpbml0aW9uIGZpbGUuICBPdGhlciBpcyBub24temVybyBpZiBpdCBpcyBpbXBvcnRlZCB3aXRoIHRoZQotICAgR05VIE0yIGtleXdvcmQgJUlOSVRJQUxJWkUuICBQZXJoYXBzIE5fTTJDIGNhbiBiZSB1c2VkIGlmIHRoZXJlCi0gICBhcmUgZW5vdWdoIGVtcHR5IGZpZWxkcz8gKi8KLV9fZGVmaW5lX3N0YWIoTl9ERUZELCAweDRhLCAiREVGRCIpCi0KLS8qIE5ldyBpbiBTb2xhcmlzMi4gIEZ1bmN0aW9uIHN0YXJ0L2JvZHkvZW5kIGxpbmUgbnVtYmVycy4gICovCi1fX2RlZmluZV9zdGFiKE5fRkxJTkUsIDB4NEMsICJGTElORSIpCi0KLS8qIFRIRSBGT0xMT1dJTkcgVFdPIFNUQUIgVkFMVUVTIENPTkZMSUNULiAgSGFwcGlseSwgb25lIGlzIGZvciBNb2R1bGEtMgotICAgYW5kIG9uZSBpcyBmb3IgQysrLiAgIFN0aWxsLC4uLiAqLwotLyogR05VIEMrKyBleGNlcHRpb24gdmFyaWFibGUuICBOYW1lIGlzIHZhcmlhYmxlIG5hbWUuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FSERFQ0wsIDB4NTAsICJFSERFQ0wiKQotLyogTW9kdWxhMiBpbmZvICJmb3IgaW1jIjogIG5hbWUsLDAsMCwwICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICAqLwotX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUgKE5fTU9EMiwgMHg1MCwgIk1PRDIiKQotCi0vKiBHTlUgQysrIGBjYXRjaCcgY2xhdXNlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICBEZXNjIGlzIG5vbnplcm8gaWYKLSAgIHRoaXMgZW50cnkgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBDQVVHSFQgc3RhYiBzYXlpbmcgd2hhdCBleGNlcHRpb24KLSAgIHdhcyBjYXVnaHQuICBNdWx0aXBsZSBDQVVHSFQgc3RhYnMgbWVhbnMgdGhhdCBtdWx0aXBsZSBleGNlcHRpb25zCi0gICBjYW4gYmUgY2F1Z2h0IGhlcmUuICBJZiBEZXNjIGlzIDAsIGl0IG1lYW5zIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQKLSAgIGhlcmUuICAqLwotX19kZWZpbmVfc3RhYiAoTl9DQVRDSCwgMHg1NCwgIkNBVENIIikKLQotLyogU3RydWN0dXJlIG9yIHVuaW9uIGVsZW1lbnQuICBWYWx1ZSBpcyBvZmZzZXQgaW4gdGhlIHN0cnVjdHVyZS4gICovCi1fX2RlZmluZV9zdGFiIChOX1NTWU0sIDB4NjAsICJTU1lNIikKLQotLyogU29sYXJpczI6ICBMYXN0IHN0YWIgZW1pdHRlZCBmb3IgbW9kdWxlLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRU5ETSwgMHg2MiwgIkVORE0iKQotCi0vKiBOYW1lIG9mIG1haW4gc291cmNlIGZpbGUuCi0gICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLgotICAgSWYgbXVsdGlwbGUgTl9TTydzIGFwcGVhciwgdGhlIGZpcnN0IHRvIGNvbnRhaW4gYSB0cmFpbGluZyAvIGlzIHRoZQotICAgY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgVGhlIGZpcnN0IHRvIG5vdCBjb250YWluIGEgdHJhaWxpbmcgLyBpcyB0aGUKLSAgIHNvdXJjZSBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBjb21waWxhdGlvbiBkaXJlY3RvcnkuICBPdGhlcnMgKHBlcmhhcHMKLSAgIHJlc3VsdGluZyBmcm9tIGNmcm9udCkgYXJlIGlnbm9yZWQuCi0gICBPbiBTb2xhcmlzMiwgdmFsdWUgaXMgdW5kZWZpbmVkLCBidXQgZGVzYyBpcyBhIHNvdXJjZS1sYW5ndWFnZSBjb2RlLiAgKi8KLQotX19kZWZpbmVfc3RhYiAoTl9TTywgMHg2NCwgIlNPIikKLQotLyogU3VuUHJvIEY3NzogIE5hbWUgb2YgYWxpYXMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9BTElBUywgMHg2YywgIkFMSUFTIikKLQotLyogQXV0b21hdGljIHZhcmlhYmxlIGluIHRoZSBzdGFjay4gIFZhbHVlIGlzIG9mZnNldCBmcm9tIGZyYW1lIHBvaW50ZXIuCi0gICBBbHNvIHVzZWQgZm9yIHR5cGUgZGVzY3JpcHRpb25zLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTFNZTSwgMHg4MCwgIkxTWU0iKQotCi0vKiBCZWdpbm5pbmcgb2YgYW4gaW5jbHVkZSBmaWxlLiAgT25seSBTdW4gdXNlcyB0aGlzLgotICAgSW4gYW4gb2JqZWN0IGZpbGUsIG9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCi0gICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBvdGhlciBmaWVsZHMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9CSU5DTCwgMHg4MiwgIkJJTkNMIikKLQotLyogTmFtZSBvZiBzdWItc291cmNlIGZpbGUgKCNpbmNsdWRlIGZpbGUpLgotICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4gICovCi1fX2RlZmluZV9zdGFiIChOX1NPTCwgMHg4NCwgIlNPTCIpCi0KLS8qIFBhcmFtZXRlciB2YXJpYWJsZS4gIFZhbHVlIGlzIG9mZnNldCBmcm9tIGFyZ3VtZW50IHBvaW50ZXIuCi0gICAoT24gbW9zdCBtYWNoaW5lcyB0aGUgYXJndW1lbnQgcG9pbnRlciBpcyB0aGUgc2FtZSBhcyB0aGUgZnJhbWUgcG9pbnRlci4gICovCi1fX2RlZmluZV9zdGFiIChOX1BTWU0sIDB4YTAsICJQU1lNIikKLQotLyogRW5kIG9mIGFuIGluY2x1ZGUgZmlsZS4gIE5vIG5hbWUuCi0gICBUaGlzIGFuZCBOX0JJTkNMIGFjdCBhcyBicmFja2V0cyBhcm91bmQgdGhlIGZpbGUncyBvdXRwdXQuCi0gICBJbiBhbiBvYmplY3QgZmlsZSwgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGF0YSBpbiB0aGlzIGVudHJ5LgotICAgVGhlIFN1biBsaW5rZXIgcHV0cyBkYXRhIGludG8gc29tZSBvZiB0aGUgZmllbGRzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRUlOQ0wsIDB4YTIsICJFSU5DTCIpCi0KLS8qIEFsdGVybmF0ZSBlbnRyeSBwb2ludC4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRU5UUlksIDB4YTQsICJFTlRSWSIpCi0KLS8qIEJlZ2lubmluZyBvZiBsZXhpY2FsIGJsb2NrLgotICAgVGhlIGRlc2MgaXMgdGhlIG5lc3RpbmcgbGV2ZWwgaW4gbGV4aWNhbCBibG9ja3MuCi0gICBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGZvciB0aGUgYmxvY2suCi0gICBUaGUgdmFyaWFibGVzIGRlY2xhcmVkIGluc2lkZSB0aGUgYmxvY2sgKnByZWNlZGUqIHRoZSBOX0xCUkFDIHN5bWJvbC4KLSAgIE9uIFNvbGFyaXMyLCB0aGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTEJSQUMsIDB4YzAsICJMQlJBQyIpCi0KLS8qIFBsYWNlIGhvbGRlciBmb3IgZGVsZXRlZCBpbmNsdWRlIGZpbGUuICBSZXBsYWNlcyBhIE5fQklOQ0wgYW5kIGV2ZXJ5dGhpbmcKLSAgIHVwIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5fRUlOQ0wuICBUaGUgU3VuIGxpbmtlciBnZW5lcmF0ZXMgdGhlc2Ugd2hlbgotICAgaXQgZmluZHMgbXVsdGlwbGUgaWRlbnRpY2FsIGNvcGllcyBvZiB0aGUgc3ltYm9scyBmcm9tIGFuIGluY2x1ZGUgZmlsZS4KLSAgIFRoaXMgYXBwZWFycyBvbmx5IGluIG91dHB1dCBmcm9tIHRoZSBTdW4gbGlua2VyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRVhDTCwgMHhjMiwgIkVYQ0wiKQotCi0vKiBNb2R1bGEtMiBzY29wZSBpbmZvcm1hdGlvbi4gIENhbiBzb21lb25lIHNheSB3aGF0IGluZm8gaXQgY29udGFpbnM/ICAqLwotX19kZWZpbmVfc3RhYiAoTl9TQ09QRSwgMHhjNCwgIlNDT1BFIikKLQotLyogRW5kIG9mIGEgbGV4aWNhbCBibG9jay4gIERlc2MgbWF0Y2hlcyB0aGUgTl9MQlJBQydzIGRlc2MuCi0gICBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLgotICAgT24gU29sYXJpczIsIHRoZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9SQlJBQywgMHhlMCwgIlJCUkFDIikKLQotLyogQmVnaW4gbmFtZWQgY29tbW9uIGJsb2NrLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4gICovCi1fX2RlZmluZV9zdGFiIChOX0JDT01NLCAweGUyLCAiQkNPTU0iKQotCi0vKiBFbmQgbmFtZWQgY29tbW9uIGJsb2NrLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudAotICAgKGFuZCBpdCBzaG91bGQgbWF0Y2ggdGhlIE5fQkNPTU0pLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRUNPTU0sIDB4ZTQsICJFQ09NTSIpCi0KLS8qIE1lbWJlciBvZiBhIGNvbW1vbiBibG9jazsgdmFsdWUgaXMgb2Zmc2V0IHdpdGhpbiB0aGUgY29tbW9uIGJsb2NrLgotICAgVGhpcyBzaG91bGQgb2NjdXIgd2l0aGluIGEgQkNPTU0vRUNPTU0gcGFpci4gICovCi1fX2RlZmluZV9zdGFiIChOX0VDT01MLCAweGU4LCAiRUNPTUwiKQotCi0vKiBTb2xhcmlzMjogUGFzY2FsICJ3aXRoIiBzdGF0ZW1lbnQ6IHR5cGUsLDAsMCxvZmZzZXQgKi8KLV9fZGVmaW5lX3N0YWIgKE5fV0lUSCwgMHhlYSwgIldJVEgiKQotCi0vKiBUaGVzZSBTVEFCJ3MgYXJlIHVzZWQgb24gR291bGQgc3lzdGVtcyBmb3IgTm9uLUJhc2UgcmVnaXN0ZXIgc3ltYm9scwotICAgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gIEZJWE1FLiAgSSBoYXZlIGFzc2lnbmVkIHRoZSB2YWx1ZXMgYXQgcmFuZG9tCi0gICBzaW5jZSBJIGRvbid0IGhhdmUgYSBHb3VsZCBoZXJlLiAgRml4dXBzIGZyb20gR291bGQgZm9sayB3ZWxjb21lLi4uICovCi1fX2RlZmluZV9zdGFiIChOX05CVEVYVCwgMHhGMCwgIk5CVEVYVCIpCi1fX2RlZmluZV9zdGFiIChOX05CREFUQSwgMHhGMiwgIk5CREFUQSIpCi1fX2RlZmluZV9zdGFiIChOX05CQlNTLCAgMHhGNCwgIk5CQlNTIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJTVFMsICAweEY2LCAiTkJTVFMiKQotX19kZWZpbmVfc3RhYiAoTl9OQkxDUywgIDB4RjgsICJOQkxDUyIpCi0KLS8qIFNlY29uZCBzeW1ib2wgZW50cnkgY29udGFpbmluZyBhIGxlbmd0aC12YWx1ZSBmb3IgdGhlIHByZWNlZGluZyBlbnRyeS4KLSAgIFRoZSB2YWx1ZSBpcyB0aGUgbGVuZ3RoLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTEVORywgMHhmZSwgIkxFTkciKQotDAotLyogVGhlIGFib3ZlIGluZm9ybWF0aW9uLCBpbiBtYXRyaXggZm9ybWF0LgotCi0JCQlTVEFCIE1BVFJJWAotCV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQl8IDAwIC0gMUYgYXJlIG5vdCBkYnggc3RhYiBzeW1ib2xzCQl8Ci0JfCBJbiBtb3N0IGNhc2VzLCB0aGUgbG93IGJpdCBpcyB0aGUgRVhUZXJuYWwgYml0fAotCi0JfCAwMCBVTkRFRiAgfCAwMiBBQlMJfCAwNCBURVhUICAgfCAwNiBEQVRBCXwKLQl8IDAxICB8RVhUICB8IDAzICB8RVhUCXwgMDUgIHxFWFQgIHwgMDcgIHxFWFQJfAotCi0JfCAwOCBCU1MgICAgfCAwQSBJTkRSCXwgMEMgRk5fU0VRIHwgMEUgV0VBS0EJfAotCXwgMDkgIHxFWFQgIHwgMEIgCXwgMEQgV0VBS1UgIHwgMEYgV0VBS1QJfAotCi0JfCAxMCBXRUFLRCAgfCAxMiBDT01NCXwgMTQgU0VUQSAgIHwgMTYgU0VUVAl8Ci0JfCAxMSBXRUFLQiAgfCAxMwl8IDE1IAkgICAgfCAxNwl8Ci0KLQl8IDE4IFNFVEQgICB8IDFBIFNFVEIJfCAxQyBTRVRWICAgfCAxRSBXQVJOSU5HfAotCXwgMTkJICAgIHwgMUIJfCAxRCAJICAgIHwgMUYgRk4JfAotCi0JfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotCXwgRGVidWcgZW50cmllcyB3aXRoIGJpdCAwMSBzZXQgYXJlIHVudXNlZC4JfAotCXwgMjAgR1NZTSAgIHwgMjIgRk5BTUUJfCAyNCBGVU4gICAgfCAyNiBTVFNZTQl8Ci0JfCAyOCBMQ1NZTSAgfCAyQSBNQUlOCXwgMkMgUk9TWU0gIHwgMkUJfAotCXwgMzAgUEMJICAgIHwgMzIgTlNZTVMJfCAzNCBOT01BUCAgfCAzNgl8Ci0JfCAzOCBPQkogICAgfCAzQQl8IDNDIE9QVCAgICB8IDNFCXwKLQl8IDQwIFJTWU0gICB8IDQyIE0yQwl8IDQ0IFNMSU5FICB8IDQ2IERTTElORSB8Ci0JfCA0OCBCU0xJTkUqfCA0QSBERUZECXwgNEMgRkxJTkUgIHwgNEUJfAotCXwgNTAgRUhERUNMKnwgNTIJfCA1NCBDQVRDSCAgfCA1NiAgICAgICAgfAotCXwgNTggICAgICAgIHwgNUEgICAgICAgIHwgNUMgICAgICAgIHwgNUUJfAotCXwgNjAgU1NZTSAgIHwgNjIgRU5ETQl8IDY0IFNPCSAgICB8IDY2IAl8Ci0JfCA2OCAJICAgIHwgNkEJfCA2QyBBTElBUyAgfCA2RQl8Ci0JfCA3MAkgICAgfCA3Mgl8IDc0CSAgICB8IDc2CXwKLQl8IDc4CSAgICB8IDdBCXwgN0MJICAgIHwgN0UJfAotCXwgODAgTFNZTSAgIHwgODIgQklOQ0wJfCA4NCBTT0wgICAgfCA4Ngl8Ci0JfCA4OAkgICAgfCA4QQl8IDhDCSAgICB8IDhFCXwKLQl8IDkwCSAgICB8IDkyCXwgOTQJICAgIHwgOTYJfAotCXwgOTgJICAgIHwgOUEJfCA5QwkgICAgfCA5RQl8Ci0JfCBBMCBQU1lNICAgfCBBMiBFSU5DTAl8IEE0IEVOVFJZICB8IEE2CXwKLQl8IEE4CSAgICB8IEFBCXwgQUMJICAgIHwgQUUJfAotCXwgQjAJICAgIHwgQjIJfCBCNAkgICAgfCBCNgl8Ci0JfCBCOAkgICAgfCBCQQl8IEJDCSAgICB8IEJFCXwKLQl8IEMwIExCUkFDICB8IEMyIEVYQ0wJfCBDNCBTQ09QRSAgfCBDNgl8Ci0JfCBDOAkgICAgfCBDQQl8IENDCSAgICB8IENFCXwKLQl8IEQwCSAgICB8IEQyCXwgRDQJICAgIHwgRDYJfAotCXwgRDgJICAgIHwgREEJfCBEQwkgICAgfCBERQl8Ci0JfCBFMCBSQlJBQyAgfCBFMiBCQ09NTQl8IEU0IEVDT01NICB8IEU2CXwKLQl8IEU4IEVDT01MICB8IEVBIFdJVEgJfCBFQwkgICAgfCBFRQl8Ci0JfCBGMAkgICAgfCBGMgl8IEY0CSAgICB8IEY2CXwKLQl8IEY4CSAgICB8IEZBCXwgRkMJICAgIHwgRkUgTEVORwl8Ci0JKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogNTAgRUhERUNMIGlzIGFsc28gTU9EMi4KLSAqIDQ4IEJTTElORSBpcyBhbHNvIEJST1dTLgotICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaCBiL2luY2x1ZGUvYW91dC9zdGFiX2dudS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDE4ZTE0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9zdGFiX2dudS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI2lmbmRlZiBfX0dOVV9TVEFCX18KLQotLyogSW5kaWNhdGUgdGhlIEdOVSBzdGFiLmggaXMgaW4gdXNlLiAgKi8KLQotI2RlZmluZSBfX0dOVV9TVEFCX18KLQotI2RlZmluZSBfX2RlZmluZV9zdGFiKE5BTUUsIENPREUsIFNUUklORykgTkFNRT1DT0RFLAotI2RlZmluZSBfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZShOQU1FLCBDT0RFLCBTVFJJTkcpIE5BTUU9Q09ERSwKLQotZW51bSBfX3N0YWJfZGVidWdfY29kZQotewotI2luY2x1ZGUgImFvdXQvc3RhYi5kZWYiCi1MQVNUX1VOVVNFRF9TVEFCX0NPREUKLX07Ci0KLSN1bmRlZiBfX2RlZmluZV9zdGFiCi0KLS8qIERlZmluaXRpb25zIG9mICJkZXNjIiBmaWVsZCBmb3IgTl9TTyBzdGFicyBpbiBTb2xhcmlzMi4gICovCi0KLSNkZWZpbmUJTl9TT19BUwkJMQotI2RlZmluZQlOX1NPX0MJCTIKLSNkZWZpbmUJTl9TT19BTlNJX0MJMwotI2RlZmluZQlOX1NPX0NDCQk0CS8qIEMrKyAqLwotI2RlZmluZQlOX1NPX0ZPUlRSQU4JNQotI2RlZmluZQlOX1NPX1BBU0NBTAk2Ci0KLS8qIFNvbGFyaXMyOiBGbG9hdGluZyBwb2ludCB0eXBlIHZhbHVlcyBpbiBiYXNpYyB0eXBlcy4gICovCi0KLSNkZWZpbmUJTkZfTk9ORQkJMAotI2RlZmluZQlORl9TSU5HTEUJMQkvKiBJRUVFIDMyLWJpdCAqLwotI2RlZmluZQlORl9ET1VCTEUJMgkvKiBJRUVFIDY0LWJpdCAqLwotI2RlZmluZQlORl9DT01QTEVYCTMJLyogRm9ydHJhbiBjb21wbGV4ICovCi0jZGVmaW5lCU5GX0NPTVBMRVgxNgk0CS8qIEZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSNkZWZpbmUJTkZfQ09NUExFWDMyCTUJLyogRm9ydHJhbiBjb21wbGV4KjE2ICovCi0jZGVmaW5lCU5GX0xET1VCTEUJNgkvKiBMb25nIGRvdWJsZSAod2hhdGV2ZXIgdGhhdCBpcykgKi8KLQotI2VuZGlmIC8qIF9fR05VX1NUQUJfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvc3VuNC5oIGIvaW5jbHVkZS9hb3V0L3N1bjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyYTBkZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvc3VuNC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qIFNQQVJDLXNwZWNpZmljIHZhbHVlcyBmb3IgYS5vdXQgZmlsZXMgKi8KLQotLyogU29tZSBzeXN0ZW1zLCBlLmcuLCBBSVgsIG1heSBoYXZlIGRlZmluZWQgdGhpcyBpbiBoZWFkZXIgZmlsZXMgYWxyZWFkeQotICAgaW5jbHVkZWQuICAqLwotI3VuZGVmIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRQkweDIwMDAJCS8qIDhLLiAgYWthIE5CUEcgaW4gPHN5cy9wYXJhbS5oPiAqLwotLyogTm90ZSB0aGF0IHNvbWUgU1BBUkNzIGhhdmUgNEsgcGFnZXMsIHNvbWUgOEssIHNvbWUgb3RoZXJzLiAgKi8KLQotI2RlZmluZSBTRUdfU0laRV9TUEFSQwlUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lCVNFR19TSVpFX1NVTjMJMHgyMDAwMAkJLyogUmVzb2x1dGlvbiBvZiByL3cgcHJvdGVjdGlvbiBodyAqLwotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUglUQVJHRVRfUEFHRV9TSVpFCS8qIExvY2F0aW9uIDAgaXMgbm90IGFjY2Vzc2libGUgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxCi0KLS8qIE5vbi1kZWZhdWx0IGRlZmluaXRpb25zIG9mIHRoZSBhY2Nlc3NvciBtYWNyb3MuLi4gKi8KLQotLyogU2VnbWVudCBzaXplIHZhcmllcyBvbiBTdW4tMyB2ZXJzdXMgU3VuLTQuICAqLwotCi0jZGVmaW5lIE5fU0VHU0laRSh4KQkoTl9NQUNIVFlQRSh4KSA9PSBNX1NQQVJDPwlTRUdfU0laRV9TUEFSQzoJXAotCQkJIE5fTUFDSFRZUEUoeCkgPT0gTV82ODAyMD8JU0VHX1NJWkVfU1VOMzoJXAotCQkJLyogR3Vlc3M/ICovCQkJVEFSR0VUX1BBR0VfU0laRSkKLQotLyogVmlydHVhbCBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBmcm9tIHRoZSBhLm91dCBmaWxlLiAgRm9yIE9NQUdJQywKLSAgIChhbG1vc3QgYWx3YXlzICJ1bmxpbmtlZCAubydzIiB0aGVzZSBkYXlzKSwgc2hvdWxkIGJlIHplcm8uCi0gICBTdW4gYWRkZWQgYSBrbHVkZ2Ugc28gdGhhdCBzaGFyZWQgbGlicmFyaWVzIGxpbmtlZCBaTUFHSUMgZ2V0Ci0gICBhbiBhZGRyZXNzIG9mIHplcm8gaWYgYV9lbnRyeSAoISEhKSBpcyBsb3dlciB0aGFuIHRoZSBvdGhlcndpc2UKLSAgIGV4cGVjdGVkIHRleHQgYWRkcmVzcy4gIFRoZXNlIGtsdWRnZXMgaGF2ZSBnb3R0YSBnbyEKLSAgIEZvciBsaW5rZWQgZmlsZXMsIHNob3VsZCByZWZsZWN0IHJlYWxpdHkgaWYgd2Uga25vdyBpdC4gICovCi0KLS8qIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB2ZXJzaW9uIGluIGFvdXQ2NC5oICh3aGljaCB3ZSBvdmVycmlkZSBieSBkZWZpbmluZwotICAgaXQgaGVyZSkgb25seSBmb3IgTk1BR0lDICh3ZSByZXR1cm4gVEVYVF9TVEFSVF9BRERSK0VYRUNfQllURVNfU0laRTsKLSAgIHRoZXkgcmV0dXJuIDApLiAgKi8KLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAgIChOX01BR0lDKHgpPT1PTUFHSUM/IDAgXAotICAgICA6IChOX01BR0lDKHgpID09IFpNQUdJQyAmJiAoeCkuYV9lbnRyeSA8IFRFWFRfU1RBUlRfQUREUik/IDAgXAotICAgICA6IFRFWFRfU1RBUlRfQUREUitFWEVDX0JZVEVTX1NJWkUpCi0KLS8qIFdoZW4gYSBmaWxlIGlzIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgb24gU3VuT1MgNCwgdGhlCi0gICBkeW5hbWljIGJpdCBpbiB0aGUgZXhlYyBoZWFkZXIgaXMgc2V0LCBhbmQgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUKLSAgIHN5bWJvbCB0YWJsZSBpcyBfX0RZTkFNSUMuICBJdHMgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICBmb2xsb3dpbmcgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pYwotewotICAvKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHN0cnVjdHVyZS4gIFN1bk9TIDQuMS54IGNyZWF0ZXMgZmlsZXMKLSAgICAgd2l0aCB2ZXJzaW9uIG51bWJlciAzLCB3aGljaCBpcyB3aGF0IHRoaXMgc3RydWN0dXJlIGlzIGJhc2VkIG9uLgotICAgICBBY2NvcmRpbmcgdG8gZ2RiLCB2ZXJzaW9uIDIgaXMgc2ltaWxhci4gIEkgYmVsaWV2ZSB0aGF0IHZlcnNpb24gMgotICAgICB1c2VkIGEgZGlmZmVyZW50IHR5cGUgb2YgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB0aGVyZSBtYXkKLSAgICAgaGF2ZSBiZWVuIG90aGVyIGRpZmZlcmVuY2VzLiAgKi8KLSAgYmZkX2J5dGUgbGRfdmVyc2lvbls0XTsKLSAgLyogVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBhIDI4IGJ5dGUgc3RydWN0dXJlIHVzZWQgaW4gZGVidWdnaW5nLgotICAgICBUaGUgY29udGVudHMgYXJlIGZpbGxlZCBpbiBhdCBydW4gdGltZSBieSBsZC5zby4gICovCi0gIGJmZF9ieXRlIGxkZFs0XTsKLSAgLyogVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBhbm90aGVyIHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgIGhvdyB0byByZWxvY2F0ZSB0aGUgZXhlY3V0YWJsZSBhdCBydW4gdGltZS4gICovCi0gIGJmZF9ieXRlIGxkWzRdOwotfTsKLQotLyogVGhlIHNpemUgb2YgdGhlIGRlYnVnZ2luZyBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgZGVidWdnZXIKLSAgIGZpZWxkIG9mIF9fRFlOQU1JQy4gICovCi0jZGVmaW5lIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFICgyNCkKLQotLyogVGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBsaW5rZXIgZmllbGQgb2YgX19EWU5BTUlDLiAgQXMgZmFyCi0gICBhcyBJIGNhbiB0ZWxsLCBtb3N0IG9mIHRoZSBhZGRyZXNzZXMgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIG9mZnNldHMKLSAgIHdpdGhpbiB0aGUgZmlsZSwgYnV0IHNvbWUgYXJlIGFjdHVhbGx5IHZpcnR1YWwgYWRkcmVzc2VzLiAgKi8KLQotc3RydWN0IGludGVybmFsX3N1bjRfZHluYW1pY19saW5rCi17Ci0gIC8qIExpbmtlZCBsaXN0IG9mIGxvYWRlZCBvYmplY3RzLiAgVGhpcyBpcyBmaWxsZWQgaW4gYXQgcnVudGltZSBieQotICAgICBsZC5zbyBhbmQgcHJvYmFibHkgYnkgZGxvcGVuLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9sb2FkZWQ7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGxpc3Qgb2YgbmFtZXMgb2Ygc2hhcmVkIG9iamVjdHMgd2hpY2ggbXVzdCBiZQotICAgICBpbmNsdWRlZCBhdCBydW50aW1lLiAgRWFjaCBlbnRyeSBpbiB0aGUgbGlzdCBpcyAxNiBieXRlczogdGhlIDQKLSAgICAgYnl0ZSBhZGRyZXNzIG9mIHRoZSBzdHJpbmcgbmFtaW5nIHRoZSBvYmplY3QgKGUuZy4sIGZvciAtbGMgdGhpcwotICAgICBpcyAiYyIpOyA0IGJ5dGVzIG9mIGZsYWdzLS10aGUgaGlnaCBiaXQgaXMgd2hldGhlciB0byBzZWFyY2ggZm9yCi0gICAgIHRoZSBvYmplY3QgdXNpbmcgdGhlIGxpYnJhcnkgcGF0aDsgdGhlIDIgYnl0ZSBtYWpvciB2ZXJzaW9uCi0gICAgIG51bWJlcjsgdGhlIDIgYnl0ZSBtaW5vciB2ZXJzaW9uIG51bWJlcjsgdGhlIDQgYnl0ZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBsaXN0ICh6ZXJvIGlmIHRoaXMgaXMgdGhlIGxhc3QgZW50cnkpLiAgVGhlCi0gICAgIHZlcnNpb24gbnVtYmVycyBzZWVtIHRvIG9ubHkgYmUgbm9uLXplcm8gd2hlbiBkb2luZyBsaWJyYXJ5Ci0gICAgIHNlYXJjaGluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfbmVlZDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgcGF0aCB0byBzZWFyY2ggZm9yIHRoZSBzaGFyZWQgb2JqZWN0cyB3aGljaAotICAgICBtdXN0IGJlIGluY2x1ZGVkLiAgVGhpcyBwb2ludHMgdG8gYSBzdHJpbmcgaW4gUEFUSCBmb3JtYXQgd2hpY2gKLSAgICAgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIC1MIGFyZ3VtZW50cyB0byB0aGUgbGlua2VyLiAgQWNjb3JkaW5nIHRvCi0gICAgIHRoZSBtYW4gcGFnZSwgbGQuc28gaW1wbGljaXRseSBhZGRzICR7TERfTElCUkFSWV9QQVRIfSB0byB0aGUKLSAgICAgYmVnaW5uaW5nIG9mIHRoaXMgc3RyaW5nIGFuZCAvbGliOi91c3IvbGliOi91c3IvbG9jYWwvbGliIHRvIHRoZQotICAgICBlbmQuICBUaGUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgYnkgYSBudWxsIGJ5dGUuICBUaGlzIGZpZWxkIGlzCi0gICAgIHplcm8gaWYgdGhlcmUgaXMgbm8gYWRkaXRpb25hbCBwYXRoLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9ydWxlczsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFRoaXMgYXBwZWFycyB0byBiZSBhCi0gICAgIHZpcnR1YWwgYWRkcmVzcywgbm90IGEgZmlsZSBvZmZzZXQuICBUaGUgZmlyc3QgZW50cnkgaW4gdGhlCi0gICAgIGdsb2JhbCBvZmZzZXQgdGFibGUgc2VlbXMgdG8gYmUgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3VuNF9keW5hbWljIHN0cnVjdHVyZSAodGhlIHNhbWUgdmFsdWUgYXMgdGhlIF9fRFlOQU1JQyBzeW1ib2wpLgotICAgICBUaGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBpcyB1c2VkIGZvciBQSUMgY29kZSB0byBob2xkIHRoZQotICAgICBhZGRyZXNzZXMgb2YgdmFyaWFibGVzLiAgQSBkeW5hbWljYWxseSBsaW5rZWQgZmlsZSB3aGljaCBkb2VzIG5vdAotICAgICBpdHNlbGYgY29udGFpbiBQSUMgY29kZSBoYXMgYSBmb3VyIGJ5dGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfZ290OwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFRoaXMgYXBwZWFycyB0byBiZSBhCi0gICAgIHZpcnR1YWwgYWRkcmVzcywgbm90IGEgZmlsZSBvZmZzZXQuCi0KLSAgICAgT24gYSBTUEFSQywgdGhlIHRhYmxlIGlzIGNvbXBvc2VkIG9mIDEyIGJ5dGUgZW50cmllcywgZWFjaCBvZgotICAgICB3aGljaCBjb25zaXN0cyBvZiB0aHJlZSBpbnN0cnVjdGlvbnMuICBUaGUgZmlyc3QgZW50cnkgaXMKLSAgICAgICAgIHNldGhpICVoaSgwKSwlZzEKLQkgam1wICVnMQotCSBub3AKLSAgICAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBjaGFuZ2VkIGJ5IGxkLnNvIGludG8gYSBqdW1wIGRpcmVjdGx5IGludG8KLSAgICAgbGQuc28gaXRzZWxmLiAgRWFjaCBzdWJzZXF1ZW50IGVudHJ5IGlzCi0gICAgICAgICBzYXZlICVzcCwgLTk2LCAlc3AKLQkgY2FsbCA8YWRkcmVzcyBvZiBmaXJzdCBlbnRyeSBpbiBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZT4KLQkgPHJlbG9jX251bWJlciB8IDB4MDEwMDAwMDA+Ci0gICAgIFRoZSByZWxvY19udW1iZXIgaXMgdGhlIG51bWJlciBvZiB0aGUgcmVsb2MgdG8gdXNlIHRvIHJlc29sdmUKLSAgICAgdGhpcyBlbnRyeS4gIFRoZSByZWxvYyB3aWxsIGJlIGEgSk1QX1NMT1QgcmVsb2MgYWdhaW5zdCBzb21lCi0gICAgIHN5bWJvbCB0aGF0IGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgb2JqZWN0IGZpbGUgYnV0IHNob3VsZCBiZQotICAgICBkZWZpbmVkIGluIGEgc2hhcmVkIG9iamVjdCAoaWYgaXQgaXMgbm90LCBsZC5zbyB3aWxsIHJlcG9ydCBhCi0gICAgIHJ1bnRpbWUgZXJyb3IgYW5kIGV4aXQpLiAgVGhlIGNvbnN0YW50IDB4MDEwMDAwMDAwIHR1cm5zIHRoZQotICAgICByZWxvYyBudW1iZXIgaW50byBhIHNldGhpIG9mICVnMCwgd2hpY2ggZG9lcyBub3RoaW5nIHNpbmNlICVnMCBpcwotICAgICBoYXJkd2lyZWQgdG8gemVyby4KLQotICAgICBXaGVuIG9uZSBvZiB0aGVzZSBlbnRyaWVzIGlzIGV4ZWN1dGVkLCBpdCB3aW5kcyB1cCBjYWxsaW5nIGludG8KLSAgICAgbGQuc28uICBsZC5zbyBsb29rcyBhdCB0aGUgcmVsb2MgbnVtYmVyLCBhdmFpbGFibGUgdmlhIHRoZSByZXR1cm4KLSAgICAgYWRkcmVzcywgdG8gZGV0ZXJtaW5lIHdoaWNoIGVudHJ5IHRoaXMgaXMuICBJdCB0aGVuIGxvb2tzIGF0IHRoZQotICAgICByZWxvYyBhbmQgcGF0Y2hlcyB1cCB0aGUgZW50cnkgaW4gdGhlIHRhYmxlIGludG8gYSBzZXRoaSBhbmQgam1wCi0gICAgIHRvIHRoZSByZWFsIGFkZHJlc3MgZm9sbG93ZWQgYnkgYSBub3AuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJlbG9jCi0gICAgIGxvb2t1cCBvbmx5IGhhcyB0byBoYXBwZW4gb25jZSwgYW5kIGl0IGFsc28gbWVhbnMgdGhhdCB0aGUKLSAgICAgcmVsb2NhdGlvbiBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgaWYgdGhlIGZ1bmN0aW9uIGlzIGFjdHVhbGx5Ci0gICAgIGNhbGxlZC4gIFRoZSByZWxvY2F0aW9uIGlzIGV4cGVuc2l2ZSBiZWNhdXNlIGxkLnNvIG11c3QgbG9vayB1cAotICAgICB0aGUgc3ltYm9sIGJ5IG5hbWUuCi0KLSAgICAgVGhlIHNpemUgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGlzIGdpdmVuIGJ5IHRoZSBsZF9wbHRfc3oKLSAgICAgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3BsdDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NzLiAgVGhlc2UgYXJlIGluIHRoZSBzYW1lIGZvcm1hdCBhcwotICAgICBvcmRpbmFyeSByZWxvY3MuICBTeW1ib2wgaW5kZXggbnVtYmVycyByZWZlciB0byB0aGUgc3ltYm9scwotICAgICBwb2ludGVkIHRvIGJ5IGxkX3N0YWIuICBJIHRoaW5rIHRoZSBvbmx5IHdheSB0byBkZXRlcm1pbmUgdGhlCi0gICAgIG51bWJlciBvZiByZWxvY3MgaXMgdG8gYXNzdW1lIHRoYXQgYWxsIHRoZSBieXRlcyBmcm9tIGxkX3JlbCB0bwotICAgICBsZF9oYXNoIGNvbnRhaW4gcmVsb2MgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfcmVsOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIGEgaGFzaCB0YWJsZSBvZiBzeW1ib2xzLiAgVGhlIGhhc2ggdGFibGUgaGFzCi0gICAgIHJvdWdobHkgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMgYXMgdGhlcmUgYXJlIGR5bmFtaWMgc3ltYm9sczsKLSAgICAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZ2V0IHRoZSBleGFjdCBzaXplIGlzIHRvIGFzc3VtZSB0aGF0Ci0gICAgIGV2ZXJ5IGJ5dGUgZnJvbSBsZF9oYXNoIHRvIGxkX3N0YWIgaXMgZGV2b3RlZCB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgICBFYWNoIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGlzIGVpZ2h0IGJ5dGVzLiAgVGhlIGZpcnN0IGZvdXIKLSAgICAgYnl0ZXMgYXJlIGEgc3ltYm9sIGluZGV4IGludG8gdGhlIGR5bmFtaWMgc3ltYm9scy4gIFRoZSBzZWNvbmQKLSAgICAgZm91ciBieXRlcyBhcmUgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGhhc2ggdGFibGUgZW50cnkgaW4gdGhlCi0gICAgIGJ1Y2tldC4gIFRoZSBsZF9idWNrZXRzIGZpZWxkIGdpdmVzIHRoZSBudW1iZXIgb2YgYnVja2V0cywgc2F5IEIuCi0gICAgIFRoZSBmaXJzdCBCIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUgZWFjaCBzdGFydCBhIGJ1Y2tldCB3aGljaAotICAgICBpcyBjaGFpbmVkIHRocm91Z2ggdGhlIHNlY29uZCBmb3VyIGJ5dGVzIG9mIGVhY2ggZW50cnkuICBBIHZhbHVlCi0gICAgIG9mIHplcm8gZW5kcyB0aGUgY2hhaW4uCi0KLSAgICAgVGhlIGhhc2ggZnVuY3Rpb24gaXMgc2ltcGx5Ci0gICAgICAgICBoID0gMDsKLSAgICAgICAgIHdoaWxlICgqc3RyaW5nICE9ICdcMCcpCi0JICAgaCA9IChoIDw8IDEpICsgKnN0cmluZysrOwotCSBoICY9IDB4N2ZmZmZmZmY7Ci0KLSAgICAgVG8gbG9vayB1cCBhIHN5bWJvbCwgY29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgbmFtZS4gIFRha2UKLSAgICAgdGhlIG1vZHVsb3Mgb2YgaGFzaCB2YWx1ZSBhbmQgdGhlIG51bWJlciBvZiBidWNrZXRzLiAgU3RhcnQgYXQKLSAgICAgdGhhdCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gIFNlZSBpZiB0aGUgc3ltYm9sIChmcm9tIHRoZSBmaXJzdAotICAgICBmb3VyIGJ5dGVzIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5KSBoYXMgdGhlIG5hbWUgeW91IGFyZSBsb29raW5nCi0gICAgIGZvci4gIElmIG5vdCwgdXNlIHRoZSBjaGFpbiBmaWVsZCAodGhlIHNlY29uZCBmb3VyIGJ5dGVzIG9mIHRoZQotICAgICBoYXNoIHRhYmxlIGVudHJ5KSB0byBtb3ZlIG9uIHRvIHRoZSBuZXh0IGVudHJ5IGluIHRoaXMgYnVja2V0LgotICAgICBJZiB0aGUgY2hhaW4gZmllbGQgaXMgemVybyB5b3UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlCi0gICAgIGJ1Y2tldCwgYW5kIHRoZSBzeW1ib2wgaXMgbm90IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8gCi0gIHVuc2lnbmVkIGxvbmcgbGRfaGFzaDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBhIGxpc3Qgb2YKLSAgICAgZXh0ZXJuYWxfbmxpc3Qgc3RydWN0dXJlcy4gIFRoZSBzdHJpbmcgaW5kaWNlcyBhcmUgcmVsYXRpdmUgdG8KLSAgICAgdGhlIGxkX3N5bWJvbHMgZmllbGQuICBJIHRoaW5rIHRoZSBvbmx5IHdheSB0byBkZXRlcm1pbmUgdGhlCi0gICAgIG51bWJlciBvZiBzeW1ib2xzIGlzIHRvIGFzc3VtZSB0aGF0IGFsbCB0aGUgYnl0ZXMgYmV0d2VlbiBsZF9zdGFiCi0gICAgIGFuZCBsZF9zeW1ib2xzIGFyZSBleHRlcm5hbF9ubGlzdCBzdHJ1Y3R1cmVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zdGFiOwotCi0gIC8qIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgZm9yLiAgSXQgc2VlbXMgdG8gYWx3YXlzIGJlIHplcm8uICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3N0YWJfaGFzaDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX2J1Y2tldHM7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICBUaGUgZmlyc3Qgc3RyaW5nIGluIHRoaXMKLSAgICAgc3RyaW5nIHRhYmxlIG5lZWQgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmcuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3N5bWJvbHM7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3N5bWJfc2l6ZTsKLQotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF90ZXh0OwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfcGx0X3N6OwotfTsKLQotLyogVGhlIGV4dGVybmFsIGZvcm0gb2YgdGhlIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWNfbGluawotewotICBiZmRfYnl0ZSBsZF9sb2FkZWRbNF07Ci0gIGJmZF9ieXRlIGxkX25lZWRbNF07Ci0gIGJmZF9ieXRlIGxkX3J1bGVzWzRdOwotICBiZmRfYnl0ZSBsZF9nb3RbNF07Ci0gIGJmZF9ieXRlIGxkX3BsdFs0XTsKLSAgYmZkX2J5dGUgbGRfcmVsWzRdOwotICBiZmRfYnl0ZSBsZF9oYXNoWzRdOwotICBiZmRfYnl0ZSBsZF9zdGFiWzRdOwotICBiZmRfYnl0ZSBsZF9zdGFiX2hhc2hbNF07Ci0gIGJmZF9ieXRlIGxkX2J1Y2tldHNbNF07Ci0gIGJmZF9ieXRlIGxkX3N5bWJvbHNbNF07Ci0gIGJmZF9ieXRlIGxkX3N5bWJfc2l6ZVs0XTsKLSAgYmZkX2J5dGUgbGRfdGV4dFs0XTsKLSAgYmZkX2J5dGUgbGRfcGx0X3N6WzRdOwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmZkbGluay5oIGIvaW5jbHVkZS9iZmRsaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjExM2MuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iZmRsaW5rLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyogYmZkbGluay5oIC0tIGhlYWRlciBmaWxlIGZvciBCRkQgbGluayByb3V0aW5lcwotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBhbmQgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBCRkRMSU5LX0gKLSNkZWZpbmUgQkZETElOS19ICi0KLS8qIFdoaWNoIHN5bWJvbHMgdG8gc3RyaXAgZHVyaW5nIGEgbGluay4gICovCi1lbnVtIGJmZF9saW5rX3N0cmlwCi17Ci0gIHN0cmlwX25vbmUsCQkvKiBEb24ndCBzdHJpcCBhbnkgc3ltYm9scy4gICovCi0gIHN0cmlwX2RlYnVnZ2VyLAkvKiBTdHJpcCBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0gIHN0cmlwX3NvbWUsCQkvKiBrZWVwX2hhc2ggaXMgdGhlIGxpc3Qgb2Ygc3ltYm9scyB0byBrZWVwLiAgKi8KLSAgc3RyaXBfYWxsCQkvKiBTdHJpcCBhbGwgc3ltYm9scy4gICovCi19OwotCi0vKiBXaGljaCBsb2NhbCBzeW1ib2xzIHRvIGRpc2NhcmQgZHVyaW5nIGEgbGluay4gIFRoaXMgaXMgaXJyZWxldmFudAotICAgaWYgc3RyaXBfYWxsIGlzIHVzZWQuICAqLwotZW51bSBiZmRfbGlua19kaXNjYXJkCi17Ci0gIGRpc2NhcmRfbm9uZSwJCS8qIERvbid0IGRpc2NhcmQgYW55IGxvY2Fscy4gICovCi0gIGRpc2NhcmRfbCwJCS8qIERpc2NhcmQgbG9jYWwgdGVtcG9yYXJ5IHN5bWJvbHMuICAqLwotICBkaXNjYXJkX2FsbAkJLyogRGlzY2FyZCBhbGwgbG9jYWxzLiAgKi8KLX07Ci0MCi0vKiBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIGFuIGVudHJ5IGluIHRoZSBCRkQgbGluayBoYXNoCi0gICB0YWJsZS4gICovCi0KLWVudW0gYmZkX2xpbmtfaGFzaF90eXBlCi17Ci0gIGJmZF9saW5rX2hhc2hfbmV3LAkJLyogU3ltYm9sIGlzIG5ldy4gICovCi0gIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkLAkvKiBTeW1ib2wgc2VlbiBiZWZvcmUsIGJ1dCB1bmRlZmluZWQuICAqLwotICBiZmRfbGlua19oYXNoX3VuZGVmd2VhaywJLyogU3ltYm9sIGlzIHdlYWsgYW5kIHVuZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwJLyogU3ltYm9sIGlzIGRlZmluZWQuICAqLwotICBiZmRfbGlua19oYXNoX2RlZndlYWssCS8qIFN5bWJvbCBpcyB3ZWFrIGFuZCBkZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF9jb21tb24sCQkvKiBTeW1ib2wgaXMgY29tbW9uLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCwJLyogU3ltYm9sIGlzIGFuIGluZGlyZWN0IGxpbmsuICAqLwotICBiZmRfbGlua19oYXNoX3dhcm5pbmcJCS8qIExpa2UgaW5kaXJlY3QsIGJ1dCB3YXJuIGlmIHJlZmVyZW5jZWQuICAqLwotfTsKLQotLyogVGhlIGxpbmtpbmcgcm91dGluZXMgdXNlIGEgaGFzaCB0YWJsZSB3aGljaCB1c2VzIHRoaXMgc3RydWN0dXJlIGZvcgotICAgaXRzIGVsZW1lbnRzLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkKLXsKLSAgLyogQmFzZSBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBUeXBlIG9mIHRoaXMgZW50cnkuICAqLwotICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSB0eXBlOwotCi0gIC8qIFVuZGVmaW5lZCBhbmQgY29tbW9uIHN5bWJvbHMgYXJlIGtlcHQgaW4gYSBsaW5rZWQgbGlzdCB0aHJvdWdoCi0gICAgIHRoaXMgZmllbGQuICBUaGlzIGZpZWxkIGlzIG5vdCBpbiB0aGUgdW5pb24gYmVjYXVzZSB0aGF0IHdvdWxkCi0gICAgIGZvcmNlIHVzIHRvIHJlbW92ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3Qgd2hlbiB3ZSBjaGFuZ2VkIHRoZWlyCi0gICAgIHR5cGUsIHdoaWNoIHdvdWxkIGZvcmNlIHRoZSBsaXN0IHRvIGJlIGRvdWJseSBsaW5rZWQsIHdoaWNoIHdvdWxkCi0gICAgIHdhc3RlIG1vcmUgbWVtb3J5LiAgV2hlbiBhbiB1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbCBpcwotICAgICBjcmVhdGVkLCBpdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhpcyBsaXN0LCB0aGUgaGVhZCBvZiB3aGljaCBpcyBpbgotICAgICB0aGUgbGluayBoYXNoIHRhYmxlIGl0c2VsZi4gIEFzIHN5bWJvbHMgYXJlIGRlZmluZWQsIHRoZXkgbmVlZAotICAgICBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0OyBhbnl0aGluZyB3aGljaCByZWFkcyB0aGUgbGlzdCBtdXN0Ci0gICAgIGRvdWJsZWNoZWNrIHRoZSBzeW1ib2wgdHlwZS4KLQotICAgICBXZWFrIHN5bWJvbHMgYXJlIG5vdCBrZXB0IG9uIHRoaXMgbGlzdC4KLQotICAgICBEZWZpbmVkIGFuZCBkZWZ3ZWFrIHN5bWJvbHMgdXNlIHRoaXMgZmllbGQgYXMgYSByZWZlcmVuY2UgbWFya2VyLgotICAgICBJZiB0aGUgZmllbGQgaXMgbm90IE5VTEwsIG9yIHRoaXMgc3RydWN0dXJlIGlzIHRoZSB0YWlsIG9mIHRoZQotICAgICB1bmRlZmluZWQgc3ltYm9sIGxpc3QsIHRoZSBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZC4gIElmIHRoZQotICAgICBzeW1ib2wgaXMgdW5kZWZpbmVkIGFuZCBiZWNvbWVzIGRlZmluZWQsIHRoaXMgZmllbGQgd2lsbAotICAgICBhdXRvbWF0aWNhbGx5IGJlIG5vbi1OVUxMIHNpbmNlIHRoZSBzeW1ib2wgd2lsbCBoYXZlIGJlZW4gb24gdGhlCi0gICAgIHVuZGVmaW5lZCBzeW1ib2wgbGlzdC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpuZXh0OwotICAvKiBBIHVuaW9uIG9mIGluZm9ybWF0aW9uIGRlcGVuZGluZyB1cG9uIHRoZSB0eXBlLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBOb3RoaW5nIGlzIGtlcHQgZm9yIGJmZF9oYXNoX25ldy4gICovCi0gICAgICAvKiBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF91bmRlZndlYWsuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgYmZkICphYmZkOwkJLyogQkZEIHN5bWJvbCB3YXMgZm91bmQgaW4uICAqLwotCX0gdW5kZWY7Ci0gICAgICAvKiBiZmRfbGlua19oYXNoX2RlZmluZWQsIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBiZmRfdm1hIHZhbHVlOwkvKiBTeW1ib2wgdmFsdWUuICAqLwotCSAgYXNlY3Rpb24gKnNlY3Rpb247CS8qIFN5bWJvbCBzZWN0aW9uLiAgKi8KLQl9IGRlZjsKLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QsIGJmZF9saW5rX2hhc2hfd2FybmluZy4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbGluazsJLyogUmVhbCBzeW1ib2wuICAqLwotCSAgY29uc3QgY2hhciAqd2FybmluZzsJLyogV2FybmluZyAoYmZkX2xpbmtfaGFzaF93YXJuaW5nIG9ubHkpLiAgKi8KLQl9IGk7Ci0gICAgICAvKiBiZmRfbGlua19oYXNoX2NvbW1vbi4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBUaGUgbGlua2VyIG5lZWRzIHRvIGtub3cgdGhyZWUgdGhpbmdzIGFib3V0IGNvbW1vbgotICAgICAgICAgICAgIHN5bWJvbHM6IHRoZSBzaXplLCB0aGUgYWxpZ25tZW50LCBhbmQgdGhlIHNlY3Rpb24gaW4KLSAgICAgICAgICAgICB3aGljaCB0aGUgc3ltYm9sIHNob3VsZCBiZSBwbGFjZWQuICBXZSBzdG9yZSB0aGUgc2l6ZQotICAgICAgICAgICAgIGhlcmUsIGFuZCB3ZSBhbGxvY2F0ZSBhIHNtYWxsIHN0cnVjdHVyZSB0byBob2xkIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gYW5kIHRoZSBhbGlnbm1lbnQuICBUaGUgYWxpZ25tZW50IGlzIHN0b3JlZCBhcyBhCi0gICAgICAgICAgICAgcG93ZXIgb2YgdHdvLiAgV2UgZG9uJ3Qgc3RvcmUgYWxsIHRoZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZgotICAgICAgICAgICAgIHRoZSB1bmlvbjsgdGhpcyBzdHJ1Y3R1cmUgaXMgYSBtYWpvciBzcGFjZSB1c2VyIGluIHRoZQotICAgICAgICAgICAgIGxpbmtlci4gICovCi0JICBiZmRfc2l6ZV90eXBlIHNpemU7CS8qIENvbW1vbiBzeW1ib2wgc2l6ZS4gICovCi0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7CS8qIEFsaWdubWVudC4gICovCi0JICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CQkvKiBTeW1ib2wgc2VjdGlvbi4gICovCi0JICAgIH0gKnA7Ci0JfSBjOwotICAgIH0gdTsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGxpbmsgaGFzaCB0YWJsZS4gIEl0IGlzIGEgZGVyaXZlZCBjbGFzcyBvZgotICAgYmZkX2hhc2hfdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgaGFzaCB0YWJsZSBpdHNlbGYuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci0gIC8qIFRoZSBiYWNrIGVuZCB3aGljaCBjcmVhdGVkIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaW5kaWNhdGVzIHRoZQotICAgICB0eXBlIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLCB3aGljaCBpcyBzb21ldGltZXMKLSAgICAgaW1wb3J0YW50IGluZm9ybWF0aW9uIHdoZW4gbGlua2luZyBvYmplY3QgZmlsZXMgb2YgZGlmZmVyZW50Ci0gICAgIHR5cGVzIHRvZ2V0aGVyLiAgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqY3JlYXRvcjsKLSAgLyogQSBsaW5rZWQgbGlzdCBvZiB1bmRlZmluZWQgYW5kIGNvbW1vbiBzeW1ib2xzLCBsaW5rZWQgdGhyb3VnaCB0aGUKLSAgICAgbmV4dCBmaWVsZCBpbiB0aGUgYmZkX2xpbmtfaGFzaF9lbnRyeSBzdHJ1Y3R1cmUuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzOwotICAvKiBFbnRyaWVzIGFyZSBhZGRlZCB0byB0aGUgdGFpbCBvZiB0aGUgdW5kZWZzIGxpc3QuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzX3RhaWw7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgbGluayBoYXNoIHRhYmxlLiAgSWYgRk9MTE9XIGlzIHRydWUsIHRoaXMKLSAgIGZvbGxvd3MgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCBhbmQgYmZkX2xpbmtfaGFzaF93YXJuaW5nIGxpbmtzIHRvCi0gICB0aGUgcmVhbCBzeW1ib2wuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpiZmRfbGlua19oYXNoX2xvb2t1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY3JlYXRlLAotCSAgIGJvb2xlYW4gY29weSwgYm9vbGVhbiBmb2xsb3cpKTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiB0aGUgbWFpbiBsaW5rZXIgaGFzaCB0YWJsZSBpZiB0aGUgc3ltYm9sIG1pZ2h0Ci0gICBiZSB3cmFwcGVkLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciByZWZlcmVuY2VzIHRvIGFuCi0gICB1bmRlZmluZWQgc3ltYm9sLCBub3QgZm9yIGRlZmluaXRpb25zIG9mIGEgc3ltYm9sLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotCi0vKiBUcmF2ZXJzZSBhIGxpbmsgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBiZmRfbGlua19oYXNoX3RyYXZlcnNlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosCi0JICAgYm9vbGVhbiAoKikgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUiksCi0JICAgUFRSKSk7Ci0KLS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgdW5kZWZzIGxpc3QuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2xpbmtfYWRkX3VuZGVmCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKTsKLQwKLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNvbW11bmljYXRlCi0gICBiZXR3ZWVuIEJGRCBhbmQgdGhlIGxpbmtlciB3aGVuIGRvaW5nIGEgbGluay4gICovCi0KLXN0cnVjdCBiZmRfbGlua19pbmZvCi17Ci0gIC8qIEZ1bmN0aW9uIGNhbGxiYWNrcy4gICovCi0gIGNvbnN0IHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MgKmNhbGxiYWNrczsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLiAgKi8KLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBhICJ0YXNrIGxpbmtlZCIgb2JqZWN0IGZpbGUsCi0gICAgIHNpbWlsYXIgdG8gcmVsb2NhdGFibGUgYnV0IGFsc28gd2l0aCBnbG9iYWxzIGNvbnZlcnRlZCB0byBzdGF0aWNzLiAqLwotICBib29sZWFuIHRhc2tfbGluazsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gc2hhcmVkOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgcHJlLWJpbmQgc3ltYm9scyBpbiBhIHNoYXJlZCBvYmplY3QuICAqLwotICBib29sZWFuIHN5bWJvbGljOwotICAvKiB0cnVlIGlmIHNoYXJlZCBvYmplY3RzIHNob3VsZCBiZSBsaW5rZWQgZGlyZWN0bHksIG5vdCBzaGFyZWQuICAqLwotICBib29sZWFuIHN0YXRpY19saW5rOwotICAvKiB0cnVlIGlmIHRoZSBvdXRwdXQgZmlsZSBzaG91bGQgYmUgaW4gYSB0cmFkaXRpb25hbCBmb3JtYXQuICBUaGlzCi0gICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHNldHRpbmcgb2YgdGhlIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgZmxhZwotICAgICBvbiB0aGUgb3V0cHV0IGZpbGUsIGJ1dCBtYXkgYmUgY2hlY2tlZCB3aGVuIHJlYWRpbmcgdGhlIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgYm9vbGVhbiB0cmFkaXRpb25hbF9mb3JtYXQ7Ci0gIC8qIHRydWUgaWYgd2Ugd2FudCB0byBwcm9kdWNlZCBvcHRpbWl6ZWQgb3V0cHV0IGZpbGVzLiAgVGhpcyBtaWdodAotICAgICBuZWVkIG11Y2ggbW9yZSB0aW1lIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBleHBsaWNpdGx5IHNlbGVjdGVkLiAgKi8KLSAgYm9vbGVhbiBvcHRpbWl6ZTsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGVycm9ycyBmb3IgdW5kZWZpbmVkIHN5bWJvbHMKLSAgICAgZXZlbiBpZiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gbm9fdW5kZWZpbmVkOwotICAvKiBXaGljaCBzeW1ib2xzIHRvIHN0cmlwLiAgKi8KLSAgZW51bSBiZmRfbGlua19zdHJpcCBzdHJpcDsKLSAgLyogV2hpY2ggbG9jYWwgc3ltYm9scyB0byBkaXNjYXJkLiAgKi8KLSAgZW51bSBiZmRfbGlua19kaXNjYXJkIGRpc2NhcmQ7Ci0gIC8qIHRydWUgaWYgc3ltYm9scyBzaG91bGQgYmUgcmV0YWluZWQgaW4gbWVtb3J5LCBmYWxzZSBpZiB0aGV5Ci0gICAgIHNob3VsZCBiZSBmcmVlZCBhbmQgcmVyZWFkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX21lbW9yeTsKLSAgLyogVGhlIGxpc3Qgb2YgaW5wdXQgQkZEJ3MgaW52b2x2ZWQgaW4gdGhlIGxpbmsuICBUaGVzZSBhcmUgY2hhaW5lZAotICAgICB0b2dldGhlciB2aWEgdGhlIGxpbmtfbmV4dCBmaWVsZC4gICovCi0gIGJmZCAqaW5wdXRfYmZkczsKLSAgLyogSWYgYSBzeW1ib2wgc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIGVhY2ggaW5wdXQgQkZELCB0aGlzIGlzIHNlY3Rpb24KLSAgICAgd2hlcmUgdGhvc2Ugc3ltYm9scyBzaG91bGQgYmUgcGxhY2VkLiAgSXQgbXVzdCBiZSBhIHNlY3Rpb24gaW4KLSAgICAgdGhlIG91dHB1dCBCRkQuICBJdCBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBubyBzdWNoIHN5bWJvbHMKLSAgICAgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBpcyB0byBzdXBwb3J0IENSRUFURV9PQkpFQ1RfU1lNQk9MUyBpbiB0aGUKLSAgICAgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UuICAqLwotICBhc2VjdGlvbiAqY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb247Ci0gIC8qIEhhc2ggdGFibGUgaGFuZGxlZCBieSBCRkQuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqaGFzaDsKLSAgLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzIHRvIGtlZXAuICBUaGlzIGlzIE5VTEwgdW5sZXNzIHN0cmlwIGlzCi0gICAgIHN0cmlwX3NvbWUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmtlZXBfaGFzaDsKLSAgLyogdHJ1ZSBpZiBldmVyeSBzeW1ib2wgc2hvdWxkIGJlIHJlcG9ydGVkIGJhY2sgdmlhIHRoZSBub3RpY2UKLSAgICAgY2FsbGJhY2suICAqLwotICBib29sZWFuIG5vdGljZV9hbGw7Ci0gIC8qIEhhc2ggdGFibGUgb2Ygc3ltYm9scyB0byByZXBvcnQgYmFjayB2aWEgdGhlIG5vdGljZSBjYWxsYmFjay4gIElmCi0gICAgIHRoaXMgaXMgTlVMTCwgYW5kIG5vdGljZV9hbGwgaXMgZmFsc2UsIHRoZW4gbm8gc3ltYm9scyBhcmUKLSAgICAgcmVwb3J0ZWQgYmFjay4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqbm90aWNlX2hhc2g7Ci0gIC8qIEhhc2ggdGFibGUgb2Ygc3ltYm9scyB3aGljaCBhcmUgYmVpbmcgd3JhcHBlZCAodGhlIC0td3JhcCBsaW5rZXIKLSAgICAgb3B0aW9uKS4gIElmIHRoaXMgaXMgTlVMTCwgbm8gc3ltYm9scyBhcmUgYmVpbmcgd3JhcHBlZC4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqd3JhcF9oYXNoOwotICAvKiBJZiBhIGJhc2Ugb3V0cHV0IGZpbGUgaXMgd2FudGVkLCB0aGVuIHRoaXMgcG9pbnRzIHRvIGl0ICovCi0gIFBUUiBiYXNlX2ZpbGU7Ci0KLSAgLyogSWYgbm9uLXplcm8sIHNwZWNpZmllcyB0aGF0IGJyYW5jaGVzIHdoaWNoIGFyZSBwcm9ibGVtYXRpYyBmb3IgdGhlCi0gIE1QQzg2MCBDMCAob3IgZWFybGllcikgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGFuZCBtb2RpZmllZC4gIEl0IGdpdmVzIHRoZQotICBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdGV4dCBwYWdlLiAqLwotICBpbnQgbXBjODYwYzA7Ci0KLSAgLyogVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzCi0gICAgIGxvYWRlZC4gICovCi0gIGNvbnN0IGNoYXIgKmluaXRfZnVuY3Rpb247Ci0gIC8qIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcwotICAgICB1bmxvYWRlZC4gICovCi0gIGNvbnN0IGNoYXIgKmZpbmlfZnVuY3Rpb247Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZXMgaG9sZHMgYSBzZXQgb2YgY2FsbGJhY2sgZnVuY3Rpb25zLiAgVGhlc2UgYXJlCi0gICBjYWxsZWQgYnkgdGhlIEJGRCBsaW5rZXIgcm91dGluZXMuICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gZWFjaAotICAgY2FsbGJhY2sgZnVuY3Rpb24gaXMgdGhlIGJmZF9saW5rX2luZm8gc3RydWN0dXJlIGJlaW5nIHVzZWQuICBFYWNoCi0gICBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLAotICAgdGhlbiB0aGUgQkZEIGZ1bmN0aW9uIHdoaWNoIGNhbGxlZCBpdCB3aWxsIHJldHVybiB3aXRoIGEgZmFpbHVyZQotICAgaW5kaWNhdGlvbi4gICovCi0KLXN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MKLXsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbiBvYmplY3QgaXMgYWRkZWQgZnJvbSBhbgotICAgICBhcmNoaXZlLiAgQUJGRCBpcyB0aGUgYXJjaGl2ZSBlbGVtZW50IGJlaW5nIGFkZGVkLiAgTkFNRSBpcyB0aGUKLSAgICAgbmFtZSBvZiB0aGUgc3ltYm9sIHdoaWNoIGNhdXNlZCB0aGUgYXJjaGl2ZSBlbGVtZW50IHRvIGJlIHB1bGxlZAotICAgICBpbi4gICovCi0gIGJvb2xlYW4gKCphZGRfYXJjaGl2ZV9lbGVtZW50KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGJmZCAqYWJmZCwKLQkJCQkJICBjb25zdCBjaGFyICpuYW1lKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBzeW1ib2wgaXMgZm91bmQgd2l0aCBtdWx0aXBsZQotICAgICBkZWZpbml0aW9ucy4gIE5BTUUgaXMgdGhlIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzLgotICAgICBPQkZEIGlzIHRoZSBvbGQgQkZELCBPU0VDIGlzIHRoZSBvbGQgc2VjdGlvbiwgT1ZBTCBpcyB0aGUgb2xkCi0gICAgIHZhbHVlLCBOQkZEIGlzIHRoZSBuZXcgQkZELCBOU0VDIGlzIHRoZSBuZXcgc2VjdGlvbiwgYW5kIE5WQUwgaXMKLSAgICAgdGhlIG5ldyB2YWx1ZS4gIE9CRkQgbWF5IGJlIE5VTEwuICBPU0VDIGFuZCBOU0VDIG1heSBiZQotICAgICBiZmRfY29tX3NlY3Rpb24gb3IgYmZkX2luZF9zZWN0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKm11bHRpcGxlX2RlZmluaXRpb24pIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICBiZmQgKm9iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKm9zZWMsCi0JCQkJCSAgYmZkX3ZtYSBvdmFsLAotCQkJCQkgIGJmZCAqbmJmZCwKLQkJCQkJICBhc2VjdGlvbiAqbnNlYywKLQkJCQkJICBiZmRfdm1hIG52YWwpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIGNvbW1vbiBzeW1ib2wgaXMgZGVmaW5lZAotICAgICBtdWx0aXBsZSB0aW1lcy4gIE5BTUUgaXMgdGhlIHN5bWJvbCBhcHBlYXJpbmcgbXVsdGlwbGUgdGltZXMuCi0gICAgIE9CRkQgaXMgdGhlIEJGRCBvZiB0aGUgZXhpc3Rpbmcgc3ltYm9sOyBpdCBtYXkgYmUgTlVMTCBpZiB0aGlzIGlzCi0gICAgIG5vdCBrbm93bi4gIE9UWVBFIGlzIHRoZSB0eXBlIG9mIHRoZSBleGlzdGluZyBzeW1ib2wsIHdoaWNoIG1heQotICAgICBiZSBiZmRfbGlua19oYXNoX2RlZmluZWQsIGJmZF9saW5rX2hhc2hfZGVmd2VhaywKLSAgICAgYmZkX2xpbmtfaGFzaF9jb21tb24sIG9yIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QuICBJZiBPVFlQRSBpcwotICAgICBiZmRfbGlua19oYXNoX2NvbW1vbiwgT1NJWkUgaXMgdGhlIHNpemUgb2YgdGhlIGV4aXN0aW5nIHN5bWJvbC4KLSAgICAgTkJGRCBpcyB0aGUgQkZEIG9mIHRoZSBuZXcgc3ltYm9sLiAgTlRZUEUgaXMgdGhlIHR5cGUgb2YgdGhlIG5ldwotICAgICBzeW1ib2wsIG9uZSBvZiBiZmRfbGlua19oYXNoX2RlZmluZWQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBvcgotICAgICBiZmRfbGlua19oYXNoX2luZGlyZWN0LiAgSWYgTlRZUEUgaXMgYmZkX2xpbmtfaGFzaF9jb21tb24sIE5TSVpFCi0gICAgIGlzIHRoZSBzaXplIG9mIHRoZSBuZXcgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiAoKm11bHRpcGxlX2NvbW1vbikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICAgIGJmZCAqb2JmZCwKLQkJCQkgICAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBvdHlwZSwKLQkJCQkgICAgICBiZmRfdm1hIG9zaXplLAotCQkJCSAgICAgIGJmZCAqbmJmZCwKLQkJCQkgICAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBudHlwZSwKLQkJCQkgICAgICBiZmRfdm1hIG5zaXplKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHRvIGFkZCBhIHN5bWJvbCB0byBhIHNldC4gIEVOVFJZIGlzCi0gICAgIHRoZSBsaW5rIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBzZXQgaXRzZWxmIChlLmcuLAotICAgICBfX0NUT1JfTElTVF9fKS4gIFJFTE9DIGlzIHRoZSByZWxvY2F0aW9uIHRvIHVzZSBmb3IgYW4gZW50cnkgaW4KLSAgICAgdGhlIHNldCB3aGVuIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgZmlsZSwgYW5kIGlzIGFsc28gdXNlZCB0bwotICAgICBnZXQgdGhlIHNpemUgb2YgdGhlIGVudHJ5IHdoZW4gZ2VuZXJhdGluZyBhbiBleGVjdXRhYmxlIGZpbGUuCi0gICAgIEFCRkQsIFNFQyBhbmQgVkFMVUUgaWRlbnRpZnkgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgc2V0LiAgKi8KLSAgYm9vbGVhbiAoKmFkZF90b19zZXQpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICplbnRyeSwKLQkJCQkgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jLAotCQkJCSBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGJmZF92bWEgdmFsdWUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgbmFtZSBvZiBhIGcrKyBjb25zdHJ1Y3RvciBvcgotICAgICBkZXN0cnVjdG9yIGlzIGZvdW5kLiAgVGhpcyBpcyBvbmx5IGNhbGxlZCBieSBzb21lIG9iamVjdCBmaWxlCi0gICAgIGZvcm1hdHMuICBDT05TVFJVQ1RPUiBpcyB0cnVlIGZvciBhIGNvbnN0cnVjdG9yLCBmYWxzZSBmb3IgYQotICAgICBkZXN0cnVjdG9yLiAgVGhpcyB3aWxsIHVzZSBCRkRfUkVMT0NfQ1RPUiB3aGVuIGdlbmVyYXRpbmcgYQotICAgICByZWxvY2F0ZWFibGUgZmlsZS4gIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBmb3VuZC4gIEFCRkQsCi0gICAgIFNFQ1RJT04gYW5kIFZBTFVFIGFyZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gIGJvb2xlYW4gKCpjb25zdHJ1Y3RvcikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgIGJvb2xlYW4gY29uc3RydWN0b3IsCi0JCQkJICBjb25zdCBjaGFyICpuYW1lLCBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsCi0JCQkJICBiZmRfdm1hIHZhbHVlKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHRvIGlzc3VlIGEgbGlua2VyIHdhcm5pbmcuICBGb3IKLSAgICAgZXhhbXBsZSwgdGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcKLSAgICAgc3ltYm9sLiAgV0FSTklORyBpcyB0aGUgd2FybmluZyB0byBiZSBpc3N1ZWQuICBTWU1CT0wgaXMgdGhlIG5hbWUKLSAgICAgb2YgdGhlIHN5bWJvbCB3aGljaCB0cmlnZ2VyZWQgdGhlIHdhcm5pbmc7IGl0IG1heSBiZSBOVUxMIGlmCi0gICAgIHRoZXJlIGlzIG5vbmUuICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbgotICAgICB3aGljaCB0cmlnZXJyZWQgdGhlIHdhcm5pbmc7IGVpdGhlciBBQkZEIG9yIFNFQ1RJT04gb3IgYm90aCBtYXkKLSAgICAgYmUgTlVMTCBpZiB0aGUgbG9jYXRpb24gaXMgbm90IGtub3duLiAgKi8KLSAgYm9vbGVhbiAoKndhcm5pbmcpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkgICAgICBjb25zdCBjaGFyICp3YXJuaW5nLCBjb25zdCBjaGFyICpzeW1ib2wsCi0JCQkgICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJICAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSByZWxvY2F0aW9uIGlzIGF0dGVtcHRlZCBhZ2FpbnN0Ci0gICAgIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBOQU1FIGlzIHRoZSBzeW1ib2wgd2hpY2ggaXMgdW5kZWZpbmVkLgotICAgICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZQotICAgICByZWZlcmVuY2UgaXMgbWFkZS4gIEluIHNvbWUgY2FzZXMgU0VDVElPTiBtYXkgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCp1bmRlZmluZWRfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBiZmQgKmFiZmQsCi0JCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLCBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIG92ZXJmbG93IG9jY3Vycy4gIE5BTUUgaXMKLSAgICAgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBvciBzZWN0aW9uIHRoZSByZWxvYyBpcyBhZ2FpbnN0LAotICAgICBSRUxPQ19OQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSByZWxvY2F0aW9uLCBhbmQgQURERU5EIGlzIGFueQotICAgICBhZGRlbmQgdGhhdCBpcyB1c2VkLiAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUKLSAgICAgbG9jYXRpb24gYXQgd2hpY2ggdGhlIG92ZXJmbG93IG9jY3VyczsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKLSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KLSAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLwotICBib29sZWFuICgqcmVsb2Nfb3ZlcmZsb3cpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICAgY29uc3QgY2hhciAqcmVsb2NfbmFtZSwgYmZkX3ZtYSBhZGRlbmQsCi0JCQkJICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCSAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBkYW5nZXJvdXMgcmVsb2MgaXMgcGVyZm9ybWVkLgotICAgICBUaGUgY2Fub25pY2FsIGV4YW1wbGUgaXMgYW4gYTI5ayBJSENPTlNUIHJlbG9jIHdoaWNoIGRvZXMgbm90Ci0gICAgIGZvbGxvdyBhbiBJSElIQUxGIHJlbG9jLiAgTUVTU0FHRSBpcyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlLgotICAgICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGUKLSAgICAgcHJvYmxlbSBvY2N1cnJlZDsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKLSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KLSAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLwotICBib29sZWFuICgqcmVsb2NfZGFuZ2Vyb3VzKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCi0JCQkJICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIGlzIGZvdW5kIHRvIGJlIGF0dGFjaGVkCi0gICAgIHRvIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gIE5BTUUgaXMgdGhlIG5hbWUgb2YKLSAgICAgdGhlIHN5bWJvbC4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIG9mCi0gICAgIHRoZSByZWxvYzsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKLSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KLSAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLwotICBib29sZWFuICgqdW5hdHRhY2hlZF9yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgICAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBzeW1ib2wgaW4gbm90aWNlX2hhc2ggaXMKLSAgICAgZGVmaW5lZCBvciByZWZlcmVuY2VkLiAgTkFNRSBpcyB0aGUgc3ltYm9sLiAgQUJGRCwgU0VDVElPTiBhbmQKLSAgICAgQUREUkVTUyBhcmUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJZiBTRUNUSU9OIGlzCi0gICAgIGJmZF91bmRfc2VjdGlvbiwgdGhpcyBpcyBhIHJlZmVyZW5jZS4gICovCi0gIGJvb2xlYW4gKCpub3RpY2UpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF92bWEgYWRkcmVzcykpOwotfTsKLQwKLS8qIFRoZSBsaW5rZXIgYnVpbGRzIGxpbmtfb3JkZXIgc3RydWN0dXJlcyB3aGljaCB0ZWxsIHRoZSBjb2RlIGhvdyB0bwotICAgaW5jbHVkZSBpbnB1dCBkYXRhIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLS8qIFRoZXNlIGFyZSB0aGUgdHlwZXMgb2YgbGlua19vcmRlciBzdHJ1Y3R1cmVzLiAgKi8KLQotZW51bSBiZmRfbGlua19vcmRlcl90eXBlCi17Ci0gIGJmZF91bmRlZmluZWRfbGlua19vcmRlciwJLyogVW5kZWZpbmVkLiAgKi8KLSAgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIsCS8qIEJ1aWx0IGZyb20gYSBzZWN0aW9uLiAgKi8KLSAgYmZkX2ZpbGxfbGlua19vcmRlciwJCS8qIEZpbGwgd2l0aCBhIDE2IGJpdCBjb25zdGFudC4gICovCi0gIGJmZF9kYXRhX2xpbmtfb3JkZXIsCQkvKiBTZXQgdG8gZXhwbGljaXQgZGF0YS4gICovCi0gIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIsCS8qIFJlbG9jYXRlIGFnYWluc3QgYSBzZWN0aW9uLiAgKi8KLSAgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyCS8qIFJlbG9jYXRlIGFnYWluc3QgYSBzeW1ib2wuICAqLwotfTsKLQotLyogVGhpcyBpcyB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmUgaXRzZWxmLiAgVGhlc2UgZm9ybSBhIGNoYWluCi0gICBhdHRhY2hlZCB0byB0aGUgc2VjdGlvbiB3aG9zZSBjb250ZW50cyB0aGV5IGFyZSBkZXNjcmliaW5nLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX29yZGVyIAotewotICAvKiBOZXh0IGxpbmtfb3JkZXIgaW4gY2hhaW4uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKm5leHQ7Ci0gIC8qIFR5cGUgb2YgbGlua19vcmRlci4gICovCi0gIGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSB0eXBlOwotICAvKiBPZmZzZXQgd2l0aGluIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7ICAKLSAgLyogU2l6ZSB3aXRoaW4gb3V0cHV0IHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIFR5cGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotICB1bmlvbiAKLSAgICB7Ci0gICAgICBzdHJ1Y3QgCi0JewotCSAgLyogU2VjdGlvbiB0byBpbmNsdWRlLiAgSWYgdGhpcyBpcyB1c2VkLCB0aGVuCi0JICAgICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiBtdXN0IGJlIHRoZSBzZWN0aW9uIHRoZQotCSAgICAgbGlua19vcmRlciBpcyBhdHRhY2hlZCB0bywgc2VjdGlvbi0+b3V0cHV0X29mZnNldCBtdXN0Ci0JICAgICBlcXVhbCB0aGUgbGlua19vcmRlciBvZmZzZXQgZmllbGQsIGFuZCBzZWN0aW9uLT5fcmF3X3NpemUKLQkgICAgIG11c3QgZXF1YWwgdGhlIGxpbmtfb3JkZXIgc2l6ZSBmaWVsZC4gIE1heWJlIHRoZXNlCi0JICAgICByZXN0cmljdGlvbnMgc2hvdWxkIGJlIHJlbGF4ZWQgc29tZWRheS4gICovCi0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQl9IGluZGlyZWN0OwotICAgICAgc3RydWN0Ci0JewotCSAgLyogVmFsdWUgdG8gZmlsbCB3aXRoLiAgKi8KLQkgIHVuc2lnbmVkIGludCB2YWx1ZTsKLQl9IGZpbGw7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBEYXRhIHRvIHB1dCBpbnRvIGZpbGUuICBUaGUgc2l6ZSBmaWVsZCBnaXZlcyB0aGUgbnVtYmVyCi0JICAgICBvZiBieXRlcyB3aGljaCB0aGlzIGZpZWxkIHBvaW50cyB0by4gICovCi0JICBiZmRfYnl0ZSAqY29udGVudHM7Ci0JfSBkYXRhOwotICAgICAgc3RydWN0Ci0JewotCSAgLyogRGVzY3JpcHRpb24gb2YgcmVsb2MgdG8gZ2VuZXJhdGUuICBVc2VkIGZvcgotCSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBhbmQKLQkgICAgIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlci4gICovCi0JICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKnA7Ci0JfSByZWxvYzsKLSAgICB9IHU7Ci19OwotCi0vKiBBIGxpbmtlciBvcmRlciBvZiB0eXBlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IKLSAgIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciBtZWFucyB0byBjcmVhdGUgYSByZWxvYyBhZ2FpbnN0IGEKLSAgIHNlY3Rpb24gb3Igc3ltYm9sLCByZXNwZWN0aXZlbHkuICBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IC1VciB0bwotICAgZ2VuZXJhdGUgcmVsb2NzIGZvciB0aGUgY29uc3RydWN0b3IgdGFibGVzLiAgVGhlCi0gICBiZmRfbGlua19vcmRlcl9yZWxvYyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSByZWxvYyB0aGF0IEJGRCBzaG91bGQKLSAgIGNyZWF0ZS4gIEl0IGlzIHNpbWlsYXIgdG8gYSBhcmVsZW50LCBidXQgSSBkaWRuJ3QgdXNlIGFyZWxlbnQKLSAgIGJlY2F1c2UgdGhlIGxpbmtlciBkb2VzIG5vdCBrbm93IGFueXRoaW5nIGFib3V0IG1vc3Qgc3ltYm9scywgYW5kCi0gICBhbnkgYXN5bWJvbCBzdHJ1Y3R1cmUgaXQgY3JlYXRlcyB3aWxsIGJlIHBhcnRpYWxseSBtZWFuaW5nbGVzcy4KLSAgIFRoaXMgaW5mb3JtYXRpb24gY291bGQgbG9naWNhbGx5IGJlIGluIHRoZSBiZmRfbGlua19vcmRlciBzdHJ1Y3QsCi0gICBidXQgSSBkaWRuJ3Qgd2FudCB0byB3YXN0ZSB0aGUgc3BhY2Ugc2luY2UgdGhlc2UgdHlwZXMgb2YgcmVsb2NzCi0gICBhcmUgcmVsYXRpdmVseSByYXJlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jCi17Ci0gIC8qIFJlbG9jIHR5cGUuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0KLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBGb3IgdHlwZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyLCB0aGlzIGlzIHRoZSBzZWN0aW9uCi0JIHRoZSByZWxvYyBzaG91bGQgYmUgYWdhaW5zdC4gIFRoaXMgbXVzdCBiZSBhIHNlY3Rpb24gaW4gdGhlCi0JIG91dHB1dCBCRkQsIG5vdCBhbnkgb2YgdGhlIGlucHV0IEJGRHMuICAqLwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAvKiBGb3IgdHlwZSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlCi0JIHN5bWJvbCB0aGUgcmVsb2Mgc2hvdWxkIGJlIGFnYWluc3QuICAqLwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB9IHU7Ci0KLSAgLyogQWRkZW5kIHRvIHVzZS4gIFRoZSBvYmplY3QgZmlsZSBzaG91bGQgY29udGFpbiB6ZXJvLiAgVGhlIEJGRAotICAgICBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0Ci0gICAgIGZpbGUgY29ycmVjdGx5LiAgRm9yIHNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyAoZS5nLiwgQ09GRikgdGhlCi0gICAgIGFkZGVuZCBtdXN0IGJlIHN0b3JlZCBpbnRvIGluIHRoZSBvYmplY3QgZmlsZSwgYW5kIGZvciBzb21lCi0gICAgIChlLmcuLCBTUEFSQyBhLm91dCkgaXQgaXMga2VwdCBpbiB0aGUgcmVsb2MuICAqLwotICBiZmRfdm1hIGFkZGVuZDsKLX07Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IGxpbmtfb3JkZXIgZm9yIGEgc2VjdGlvbi4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX29yZGVyICpiZmRfbmV3X2xpbmtfb3JkZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLQotLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCB0byBkZXNjcmliZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUKLSAgIEVMRiBsaW5rZXIuICBUaGVzZSBzdHJ1Y3R1cmVzIGNvdWxkIGJlIG1hbmlwdWxhdGVkIGVudGlyZWx5IGluc2lkZQotICAgQkZELCBidXQgaXQgd291bGQgYmUgYSBwYWluLiAgSW5zdGVhZCwgdGhlIHJlZ3VsYXIgbGlua2VyIHNldHMgdXAKLSAgIHRoZXNlIHN0cnVjdHVyZXMsIGFuZCB0aGVuIHBhc3NlcyB0aGVtIGludG8gQkZELiAgKi8KLQotLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgYSB2ZXJzaW9uLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByCi17Ci0gIC8qIE5leHQgcmVndWxhciBleHByZXNzaW9uIGZvciB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKm5leHQ7Ci0gIC8qIFJlZ3VsYXIgZXhwcmVzc2lvbi4gICovCi0gIGNvbnN0IGNoYXIgKnBhdHRlcm47Ci0gIC8qIE1hdGNoaW5nIGZ1bmN0aW9uLiAgKi8KLSAgaW50ICgqbWF0Y2gpIFBBUkFNUygoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICosIGNvbnN0IGNoYXIgKikpOwotfTsKLQotLyogVmVyc2lvbiBkZXBlbmRlbmNpZXMuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMKLXsKLSAgLyogTmV4dCBkZXBlbmRlbmN5IGZvciB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm5leHQ7Ci0gIC8qIFRoZSB2ZXJzaW9uIHdoaWNoIHRoaXMgdmVyc2lvbiBkZXBlbmRzIHVwb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnNpb25fbmVlZGVkOwotfTsKLQotLyogQSBub2RlIGluIHRoZSB2ZXJzaW9uIHRyZWUuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUKLXsKLSAgLyogTmV4dCB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpuZXh0OwotICAvKiBOYW1lIG9mIHRoaXMgdmVyc2lvbi4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFZlcnNpb24gbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgaW50IHZlcm51bTsKLSAgLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgZ2xvYmFsIHN5bWJvbHMgaW4gdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpnbG9iYWxzOwotICAvKiBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBsb2NhbCBzeW1ib2xzIGluIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbG9jYWxzOwotICAvKiBMaXN0IG9mIHZlcnNpb25zIHdoaWNoIHRoaXMgdmVyc2lvbiBkZXBlbmRzIHVwb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmRlcHM7Ci0gIC8qIEluZGV4IG9mIHRoZSB2ZXJzaW9uIG5hbWUuICBUaGlzIGlzIHVzZWQgd2l0aGluIEJGRC4gICovCi0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIC8qIFdoZXRoZXIgdGhpcyB2ZXJzaW9uIHRyZWUgd2FzIHVzZWQuICBUaGlzIGlzIHVzZWQgd2l0aGluIEJGRC4gICovCi0gIGludCB1c2VkOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JvdXQuaCBiL2luY2x1ZGUvYm91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmMyOGNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYm91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mICdhLm91dC5oJy4gIEl0IGlzIHRvIGJlIHVzZWQgaW4gYWxsCi0gKiBHTlUgdG9vbHMgbW9kaWZpZWQgdG8gc3VwcG9ydCB0aGUgaTgwOTYwIChvciB0b29scyB0aGF0IG9wZXJhdGUgb24KLSAqIG9iamVjdCBmaWxlcyBjcmVhdGVkIGJ5IHN1Y2ggdG9vbHMpLgotICoKLSAqIEFsbCBpODA5NjAgZGV2ZWxvcG1lbnQgaXMgZG9uZSBpbiBhIENST1NTLURFVkVMT1BNRU5UIGVudmlyb25tZW50LiAgSS5lLiwKLSAqIG9iamVjdCBjb2RlIGlzIGdlbmVyYXRlZCBvbiwgYW5kIGV4ZWN1dGVkIHVuZGVyIHRoZSBkaXJlY3Rpb24gb2YgYSBzeW1ib2xpYwotICogZGVidWdnZXIgcnVubmluZyBvbiwgYSBob3N0IHN5c3RlbS4gIFdlIGRvIG5vdCB3YW50IHRvIGJlIHN1YmplY3QgdG8gdGhlCi0gKiB2YWdhcmllcyBvZiB3aGljaCBob3N0IGl0IGlzIG9yIHdoZXRoZXIgaXQgc3VwcG9ydHMgQ09GRiBvciBhLm91dCBmb3JtYXQsCi0gKiBvciBhbnl0aGluZyBlbHNlLiAgV2UgRE8gd2FudCB0bzoKLSAqCi0gKglvIGFsd2F5cyBnZW5lcmF0ZSB0aGUgc2FtZSBmb3JtYXQgb2JqZWN0IGZpbGVzLCByZWdhcmRsZXNzIG9mIGhvc3QuCi0gKgotICoJbyBoYXZlIGFuICdhLm91dCcgaGVhZGVyIHRoYXQgd2UgY2FuIG1vZGlmeSBmb3Igb3VyIG93biBwdXJwb3NlcwotICoJICAodGhlIDgwOTYwIGlzIHR5cGljYWxseSBhbiBlbWJlZGRlZCBwcm9jZXNzb3IgYW5kIG1heSByZXF1aXJlCi0gKgkgIGVuaGFuY2VkIGxpbmtlciBzdXBwb3J0IHRoYXQgdGhlIG5vcm1hbCBhLm91dC5oIGhlYWRlciBjYW4ndAotICoJICBhY2NvbW1vZGF0ZSkuCi0gKgotICogQXMgZm9yIGJ5dGUtb3JkZXJpbmcsIHRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHk6Ci0gKgotICoJbyBUZXh0IGFuZCBkYXRhIHRoYXQgaXMgYWN0dWFsbHkgZG93bmxvYWRlZCB0byB0aGUgdGFyZ2V0IGlzIGFsd2F5cwotICoJICBpbiBpODA5NjAgKGxpdHRsZS1lbmRpYW4pIG9yZGVyLgotICoKLSAqCW8gQWxsIG90aGVyIG51bWJlcnMgKGluIHRoZSBoZWFkZXIsIHN5bWJvbHMsIHJlbG9jYXRpb24gZGlyZWN0aXZlcykKLSAqCSAgYXJlIGluIGhvc3QgYnl0ZS1vcmRlcjogIG9iamVjdCBmaWxlcyBDQU5OT1QgYmUgbGlmdGVkIGZyb20gYQotICoJICBsaXR0bGUtZW5kIGhvc3QgYW5kIHVzZWQgb24gYSBiaWctZW5kaWFuIChvciB2aWNlIHZlcnNhKSB3aXRob3V0Ci0gKgkgIG1vZGlmaWNhdGlvbi4KLSAqID09PiBUSElTIElTIE5PIExPTkdFUiBUUlVFIFVTSU5HIEJGRC4gIFdFIENBTiBHRU5FUkFURSBBTlkgQllURSBPUkRFUgotICogICAgIEZPUiBUSEUgSEVBREVSLCBBTkQgUkVBRCBBTlkgQllURSBPUkRFUi4gIFBSRUZFUkVOQ0UgV09VTEQgQkUgVE8KLSAqICAgICBVU0UgTElUVExFLUVORElBTiBCWVRFIE9SREVSIFRIUk9VR0hPVVQsIFJFR0FSRExFU1MgT0YgSE9TVC4gIDw9PQotICoKLSAqCW8gVGhlIGRvd25sb2FkZXIgKCdjb21tOTYwJykgdGFrZXMgY2FyZSB0byBnZW5lcmF0ZSBhIHBzZXVkby1oZWFkZXIKLSAqCSAgd2l0aCBjb3JyZWN0IChpODA5NjApIGJ5dGUtb3JkZXJpbmcgYmVmb3JlIHNoaXBwaW5nIHRleHQgYW5kIGRhdGEKLSAqCSAgb2ZmIHRvIHRoZSBOSU5EWSBtb25pdG9yIGluIHRoZSB0YXJnZXQgc3lzdGVtcy4gIFN5bWJvbHMgYW5kCi0gKgkgIHJlbG9jYXRpb24gaW5mbyBhcmUgbmV2ZXIgc2VudCB0byB0aGUgdGFyZ2V0LgotICovCi0KLQotI2RlZmluZSBCTUFHSUMJMDQxNQotLyogV2UgZG9uJ3QgYWNjZXB0IHRoZSBmb2xsb3dpbmcgKHNlZSBOX0JBRE1BRyBtYWNybykuCi0gKiBUaGV5J3JlIGp1c3QgaGVyZSBzbyBHTlUgY29kZSB3aWxsIGNvbXBpbGUuCi0gKi8KLSNkZWZpbmUJT01BR0lDCTA0MDcJCS8qIG9sZCBpbXB1cmUgZm9ybWF0ICovCi0jZGVmaW5lCU5NQUdJQwkwNDEwCQkvKiByZWFkLW9ubHkgdGV4dCAqLwotI2RlZmluZQlaTUFHSUMJMDQxMwkJLyogZGVtYW5kIGxvYWQgZm9ybWF0ICovCi0KLS8qIEZJTEUgSEVBREVSCi0gKglBbGwgJ2xlbmd0aHMnIGFyZSBnaXZlbiBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAqCUFsbCAnYWxpZ25tZW50cycgYXJlIGZvciByZWxpbmthYmxlIGZpbGVzIG9ubHk7ICBhbiBhbGlnbm1lbnQgb2YKLSAqCQknbicgaW5kaWNhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgbXVzdCBiZWdpbiBhdCBhbgotICoJCWFkZHJlc3MgdGhhdCBpcyBhIG11bHRpcGxlIG9mICgyKipuKS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2V4ZWMgewotCS8qIFN0YW5kYXJkIHN0dWZmICovCi0JdW5zaWduZWQgY2hhciBlX2luZm9bNF07CS8qIElkZW50aWZpZXMgdGhpcyBhcyBhIGIub3V0IGZpbGUgKi8KLQl1bnNpZ25lZCBjaGFyIGVfdGV4dFs0XTsJLyogTGVuZ3RoIG9mIHRleHQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfZGF0YVs0XTsJLyogTGVuZ3RoIG9mIGRhdGEgKi8KLQl1bnNpZ25lZCBjaGFyIGVfYnNzWzRdOwkJLyogTGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhICovCi0JdW5zaWduZWQgY2hhciBlX3N5bXNbNF07CS8qIExlbmd0aCBvZiBzeW1ib2wgdGFibGUgKi8KLQl1bnNpZ25lZCBjaGFyIGVfZW50cnlbNF07CS8qIFJ1bnRpbWUgc3RhcnQgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIgZV90cnNpemVbNF07CS8qIExlbmd0aCBvZiB0ZXh0IHJlbG9jYXRpb24gaW5mbyAqLwotCXVuc2lnbmVkIGNoYXIgZV9kcnNpemVbNF07CS8qIExlbmd0aCBvZiBkYXRhIHJlbG9jYXRpb24gaW5mbyAqLwotCi0JLyogQWRkZWQgZm9yIGk5NjAgKi8KLQl1bnNpZ25lZCBjaGFyIGVfdGxvYWRbNF07CS8qIFRleHQgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBjaGFyIGVfZGxvYWRbNF07CS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBjaGFyIGVfdGFsaWduWzFdOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50ICovCi0JdW5zaWduZWQgY2hhciBlX2RhbGlnblsxXTsJLyogQWxpZ25tZW50IG9mIGRhdGEgc2VnbWVudCAqLwotCXVuc2lnbmVkIGNoYXIgZV9iYWxpZ25bMV07CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudCAqLwotCXVuc2lnbmVkIGNoYXIgZV9yZWxheGFibGVbMV07CS8qIEFzc2VtYmxlZCB3aXRoIGVub3VnaCBpbmZvIHRvIGFsbG93IGxpbmtlciB0byByZWxheCAqLwotfTsKLQotI2RlZmluZQlFWEVDX0JZVEVTX1NJWkUJKHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2V4ZWMpKQotCi0vKiBUaGVzZSBtYWNyb3MgdXNlIHRoZSBhX3h4eCBmaWVsZCBuYW1lcywgc2luY2UgdGhleSBvcGVyYXRlIG9uIHRoZSBleGVjCi0gICBzdHJ1Y3R1cmUgYWZ0ZXIgaXQncyBiZWVuIGJ5dGUtc3dhcHBlZCBhbmQgcmVhbGlnbmVkIG9uIHRoZSBob3N0IG1hY2hpbmUuICovCi0jZGVmaW5lIE5fQkFETUFHKHgpCSgoKHgpLmFfaW5mbykhPUJNQUdJQykKLSNkZWZpbmUgTl9UWFRPRkYoeCkJRVhFQ19CWVRFU19TSVpFCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKLSNkZWZpbmUgTl9UUk9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZGVmaW5lIE5fVFJFTE9GRglOX1RST0ZGCi0jZGVmaW5lIE5fRFJPRkYoeCkJKCBOX1RST0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9EUkVMT0ZGCU5fRFJPRkYKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RST0ZGKHgpICsgKHgpLmFfZHJzaXplICkKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotI2RlZmluZSBOX0RBVEFERFIoeCkJKCAoeCkuYV9kbG9hZCApICAgIAotCi0vKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KLSNpZiAhZGVmaW5lZCAoTl9UWFRBRERSKQotI2RlZmluZSBOX1RYVEFERFIoeCkgMAotI2VuZGlmCi0KLS8qIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBzeW1ib2wgdGFibGUKLSAqLwotc3RydWN0IG5saXN0IHsKLQl1bmlvbiB7Ci0JCWNoYXIJKm5fbmFtZTsKLQkJc3RydWN0IG5saXN0ICpuX25leHQ7Ci0JCWxvbmcJbl9zdHJ4OwkJLyogSW5kZXggaW50byBzdHJpbmcgdGFibGUJKi8KLQl9IG5fdW47Ci0JdW5zaWduZWQgY2hhciBuX3R5cGU7CS8qIFNlZSBiZWxvdwkJCQkqLwotCWNoYXIJbl9vdGhlcjsJLyogVXNlZCBpbiBpODA5NjAgc3VwcG9ydCAtLSBzZWUgYmVsb3cJKi8KLQlzaG9ydAluX2Rlc2M7Ci0JdW5zaWduZWQgbG9uZyBuX3ZhbHVlOwotfTsKLQotCi0vKiBMZWdhbCB2YWx1ZXMgb2Ygbl90eXBlCi0gKi8KLSNkZWZpbmUgTl9VTkRGCTAJLyogVW5kZWZpbmVkIHN5bWJvbAkqLwotI2RlZmluZSBOX0FCUwkyCS8qIEFic29sdXRlIHN5bWJvbAkqLwotI2RlZmluZSBOX1RFWFQJNAkvKiBUZXh0IHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9EQVRBCTYJLyogRGF0YSBzeW1ib2wJCSovCi0jZGVmaW5lIE5fQlNTCTgJLyogQlNTIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9GTgkzMQkvKiBGaWxlbmFtZSBzeW1ib2wJKi8KLQotI2RlZmluZSBOX0VYVAkxCS8qIEV4dGVybmFsIHN5bWJvbCAoT1InZCBpbiB3aXRoIG9uZSBvZiBhYm92ZSkJKi8KLSNkZWZpbmUgTl9UWVBFCTAzNgkvKiBNYXNrIGZvciBhbGwgdGhlIHR5cGUgYml0cwkJCSovCi0jZGVmaW5lIE5fU1RBQgkwMzQwCS8qIE1hc2sgZm9yIGFsbCBiaXRzIHVzZWQgZm9yIFNEQiBlbnRyaWVzIAkqLwotCi0vKiBNRUFOSU5HIE9GICduX290aGVyJwotICoKLSAqIElmIG5vbi16ZXJvLCB0aGUgJ25fb3RoZXInIGZpZWxkcyBpbmRpY2F0ZXMgZWl0aGVyIGEgbGVhZiBwcm9jZWR1cmUgb3IKLSAqIGEgc3lzdGVtIHByb2NlZHVyZSwgYXMgZm9sbG93czoKLSAqCi0gKgkxIDw9IG5fb3RoZXIgPD0gMzIgOgotICoJCVRoZSBzeW1ib2wgaXMgdGhlIGVudHJ5IHBvaW50IHRvIGEgc3lzdGVtIHByb2NlZHVyZS4KLSAqCQknbl92YWx1ZScgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5LCBhcyBmb3IgYW55IG90aGVyCi0gKgkJcHJvY2VkdXJlLiAgVGhlIHN5c3RlbSBwcm9jZWR1cmUgbnVtYmVyICh3aGljaCBjYW4gYmUgdXNlZCBpbgotICoJCWEgJ2NhbGxzJyBpbnN0cnVjdGlvbikgaXMgKG5fb3RoZXItMSkuICBUaGVzZSBlbnRyaWVzIGNvbWUgZnJvbQotICoJCScuc3lzcHJvYycgZGlyZWN0aXZlcy4KLSAqCi0gKgluX290aGVyID09IE5fQ0FMTE5BTUUKLSAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KLSAqCQlUaGUgKm5leHQqIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlIG11c3QgYmUgdGhlIGNvcnJlc3BvbmRpbmcKLSAqCQknYmFsJyBlbnRyeSBwb2ludCB0byB0aGUgcHJvY2VkdXJlIChzZWUgZm9sbG93aW5nKS4gIFRoZXNlCi0gKgkJZW50cmllcyBjb21lIGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCB0d28gZGlmZmVyZW50Ci0gKgkJc3ltYm9scyBhcmUgc3BlY2lmaWVkICh0aGUgZmlyc3Qgb25lIGlzIHJlcHJlc2VudGVkIGhlcmUpLgotICoJCi0gKgotICoJbl9vdGhlciA9PSBOX0JBTE5BTUUKLSAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnYmFsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgotICoJCVRoZXNlIGVudHJpZXMgcmVzdWx0IGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCBvbmx5Ci0gKgkJb25lIHN5bWJvbCBpcyBzcGVjaWZpZWQsIG9yIGluIHdoaWNoIHRoZSBzYW1lIHN5bWJvbCBpcwotICoJCXNwZWNpZmllZCB0d2ljZS4KLSAqCi0gKiBOb3RlIHRoYXQgYW4gTl9DQUxMTkFNRSBlbnRyeSAqbXVzdCogaGF2ZSBhIGNvcnJlc3BvbmRpbmcgTl9CQUxOQU1FIGVudHJ5LAotICogYnV0IG5vdCBldmVyeSBOX0JBTE5BTUUgZW50cnkgbXVzdCBoYXZlIGFuIE5fQ0FMTE5BTUUgZW50cnkuCi0gKi8KLSNkZWZpbmUgTl9DQUxMTkFNRQkoKGNoYXIpLTEpCi0jZGVmaW5lIE5fQkFMTkFNRQkoKGNoYXIpLTIpCi0jZGVmaW5lIElTX0NBTExOQU1FKHgpCShOX0NBTExOQU1FID09ICh4KSkKLSNkZWZpbmUgSVNfQkFMTkFNRSh4KQkoTl9CQUxOQU1FID09ICh4KSkKLSNkZWZpbmUgSVNfT1RIRVIoeCkJKCh4KT4wICYmICh4KSA8PTMyKQotCi0jZGVmaW5lIGJfb3V0X3JlbG9jYXRpb25faW5mbyByZWxvY2F0aW9uX2luZm8KLXN0cnVjdCByZWxvY2F0aW9uX2luZm8gewotCWludAkgcl9hZGRyZXNzOwkvKiBGaWxlIGFkZHJlc3Mgb2YgaXRlbSB0byBiZSByZWxvY2F0ZWQJKi8KLQl1bnNpZ25lZAotI2RlZmluZSByX2luZGV4IHJfc3ltYm9sbnVtCi0JCXJfc3ltYm9sbnVtOjI0LC8qIEluZGV4IG9mIHN5bWJvbCBvbiB3aGljaCByZWxvY2F0aW9uIGlzIGJhc2VkLAotCQkJCSoJaWYgcl9leHRlcm4gaXMgc2V0LiAgT3RoZXJ3aXNlIHNldCB0bwotCQkJCSoJZWl0aGVyIE5fVEVYVCwgTl9EQVRBLCBvciBOX0JTUyB0bwotCQkJCSoJaW5kaWNhdGUgc2VjdGlvbiBvbiB3aGljaCByZWxvY2F0aW9uIGlzCi0JCQkJKgliYXNlZC4KLQkJCQkqLwotCQlyX3BjcmVsOjEsCS8qIDEgPT4gcmVsb2NhdGUgUEMtcmVsYXRpdmU7IGVsc2UgYWJzb2x1dGUKLQkJCQkgKglPbiBpOTYwLCBwYy1yZWxhdGl2ZSBpbXBsaWVzIDI0LWJpdAotCQkJCSAqCWFkZHJlc3MsIGFic29sdXRlIGltcGxpZXMgMzItYml0LgotCQkJCSAqLwotCQlyX2xlbmd0aDoyLAkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6Ci0JCQkJICoJMCA9PiAxIGJ5dGUKLQkJCQkgKgkxID0+IDIgYnl0ZXMgLS0gdXNlZCBmb3IgMTMgYml0IHBjcmVsCi0JCQkJICoJMiA9PiA0IGJ5dGVzIAotCQkJCSAqLwotCQlyX2V4dGVybjoxLAotCQlyX2JzcjoxLAkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0JCXJfZGlzcDoxLAkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0JCXJfY2FsbGo6MSwJLyogMSBpZiByZWxvY2F0aW9uIHRhcmdldCBpcyBhbiBpOTYwICdjYWxsaicgKi8KLQkJcl9yZWxheGFibGU6MTsJLyogMSBpZiBlbm91Z2ggaW5mbyBpcyBsZWZ0IHRvIHJlbGF4Ci0JCQkJICAgdGhlIGRhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbGxiYWNrLmggYi9pbmNsdWRlL2NhbGxiYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNzUyODQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jYWxsYmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIFJlbW90ZSB0YXJnZXQgc3lzdGVtIGNhbGwgY2FsbGJhY2sgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGludGVyZmFjZSBpc24ndCBpbnRlbmRlZCB0byBiZSBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBraW5kCi0gICBvZiByZW1vdGUgKGhhcmR3YXJlLCBzaW11bGF0b3IsIHdoYXRldmVyKS4gIEFzIHN1Y2gsIHN1cHBvcnQgZm9yIGl0Ci0gICAoZS5nLiBzaW0vY29tbW9uL2NhbGxiYWNrLmMpIHNob3VsZCAqbm90KiBsaXZlIGluIHRoZSBzaW11bGF0b3Igc291cmNlCi0gICB0cmVlLCBub3Igc2hvdWxkIGl0IGxpdmUgaW4gdGhlIGdkYiBzb3VyY2UgdHJlZS4gICovCi0KLS8qIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gaGFuZGxlIHN5c3RlbSBjYWxsczoKLQotICAgMSkgSGF2ZSBhIHNpbXVsYXRvciBpbnRlcmNlcHQgdGhlIGFwcHJvcHJpYXRlIHRyYXAgaW5zdHJ1Y3Rpb24gYW5kCi0gICBkaXJlY3RseSBwZXJmb3JtIHRoZSBzeXN0ZW0gY2FsbCBvbiBiZWhhbGYgb2YgdGhlIHRhcmdldCBwcm9ncmFtLgotICAgVGhpcyBpcyB0aGUgdHlwaWNhbCB3YXkgb2YgaGFuZGxpbmcgc3lzdGVtIGNhbGxzIGZvciBlbWJlZGRlZCB0YXJnZXRzLgotICAgW0hhbmRsaW5nIHN5c3RlbSBjYWxscyBmb3IgZW1iZWRkZWQgdGFyZ2V0cyBpc24ndCB0aGF0IG11Y2ggb2YgYW4KLSAgIG94eW1vcm9uIGFzIHJ1bm5pbmcgY29tcGlsZXIgdGVzdHN1aXRlcyBtYWtlIHVzZSBvZiB0aGUgY2FwYWJpbGl0eS5dCi0KLSAgIFRoaXMgbWV0aG9kIG9mIHN5c3RlbSBjYWxsIGhhbmRsaW5nIGlzIGRvbmUgd2hlbiBTVEFURV9FTlZJUk9OTUVOVAotICAgaXMgRU5WSVJPTk1FTlRfVVNFUi4KLQotICAgMikgSGF2ZSBhIHNpbXVsYXRvciBlbXVsYXRlIHRoZSBoYXJkd2FyZSBhcyBtdWNoIGFzIHBvc3NpYmxlLgotICAgSWYgdGhlIHByb2dyYW0gcnVubmluZyBvbiB0aGUgcmVhbCBoYXJkd2FyZSBjb21tdW5pY2F0ZXMgd2l0aCBzb21lIHNvcnQKLSAgIG9mIHRhcmdldCBtYW5hZ2VyLCBvbmUgd291bGQgd2FudCB0byBiZSBhYmxlIHRvIHJ1biB0aGlzIHByb2dyYW0gb24gdGhlCi0gICBzaW11bGF0b3IgYXMgd2VsbC4KLQotICAgVGhpcyBtZXRob2Qgb2Ygc3lzdGVtIGNhbGwgaGFuZGxpbmcgaXMgZG9uZSB3aGVuIFNUQVRFX0VOVklST05NRU5UCi0gICBpcyBFTlZJUk9OTUVOVF9PUEVSQVRJTkcuCi0qLwotCi0jaWZuZGVmIENBTExCQUNLX0gKLSNkZWZpbmUgQ0FMTEJBQ0tfSAotCi0vKiA/Pz8gVGhlIHJlYXNvbiB3aHkgd2UgY2hlY2sgZm9yIHZhX3N0YXJ0IGhlcmUgc2hvdWxkIGJlIGRvY3VtZW50ZWQuICAqLwotCi0jaWZuZGVmIHZhX3N0YXJ0Ci0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jZW5kaWYKLQwKLS8qIE1hcHBpbmcgb2YgaG9zdC90YXJnZXQgdmFsdWVzLiAgKi8KLS8qID8/PyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBvbmUgbWlnaHQgd2FudCB0byBhZGQgYSBzdHJpbmcgb2YgdGhlCi0gICBuYW1lIG9mIHRoZSBzeW1ib2wuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBob3N0X3ZhbDsKLSAgaW50IHRhcmdldF92YWw7Ci19IENCX1RBUkdFVF9ERUZTX01BUDsKLQotI2RlZmluZSBNQVhfQ0FMTEJBQ0tfRkRTIDEwCi0KLS8qIEZvcndhcmQgZGVjbCBmb3Igc3RhdC9mc3RhdC4gICovCi1zdHJ1Y3Qgc3RhdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgaG9zdF9jYWxsYmFjazsKLQotc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0IAotewotICBpbnQgKCpjbG9zZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLGludCkpOwotICBpbnQgKCpnZXRfZXJybm8pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotICBpbnQgKCppc2F0dHkpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0gIGludCAoKmxzZWVrKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCwgbG9uZyAsIGludCkpOwotICBpbnQgKCpvcGVuKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIqLCBpbnQgbW9kZSkpOwotICBpbnQgKCpyZWFkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosaW50LCAgY2hhciAqLCBpbnQpKTsKLSAgaW50ICgqcmVhZF9zdGRpbikgUEFSQU1TICgoIGhvc3RfY2FsbGJhY2sgKiwgY2hhciAqLCBpbnQpKTsKLSAgaW50ICgqcmVuYW1lKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0gIGludCAoKnN5c3RlbSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICopKTsKLSAgbG9uZyAoKnRpbWUpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgbG9uZyAqKSk7Ci0gIGludCAoKnVubGluaykgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICopKTsKLSAgaW50ICgqd3JpdGUpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKixpbnQsIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0gIGludCAoKndyaXRlX3N0ZG91dCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGludCkpOwotICB2b2lkICgqZmx1c2hfc3Rkb3V0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLSAgaW50ICgqd3JpdGVfc3RkZXJyKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0gIHZvaWQgKCpmbHVzaF9zdGRlcnIpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotICBpbnQgKCpzdGF0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKikpOwotICBpbnQgKCpmc3RhdCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIHN0cnVjdCBzdGF0ICopKTsKLQotICAvKiBXaGVuIHByZXNlbnQsIGNhbGwgdG8gdGhlIGNsaWVudCB0byBnaXZlIGl0IHRoZSBvcG9ydHVuaXR5IHRvCi0gICAgIHBvbGwgYW55IGlvIGRldmljZXMgZm9yIGEgcmVxdWVzdCB0byBxdWl0IChpbmRpY2F0ZWQgYnkgYSBub256ZXJvCi0gICAgIHJldHVybiB2YWx1ZSkuICovCi0gIGludCAoKnBvbGxfcXVpdCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0KLSAgLyogVXNlZCB3aGVuIHRoZSB0YXJnZXQgaGFzIGdvbmUgYXdheSwgc28gd2UgY2FuIGNsb3NlIG9wZW4KLSAgICAgaGFuZGxlcyBhbmQgZnJlZSBtZW1vcnkgZXRjIGV0Yy4gICovCi0gIGludCAoKnNodXRkb3duKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLSAgaW50ICgqaW5pdCkgICAgIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotCi0gIC8qIGRlcHJlY2lhdGVkLCB1c2UgdnByaW50Zl9maWx0ZXJlZCAtIFRhbGsgdG8gdGhlIHVzZXIgb24gYSBjb25zb2xlLiAgKi8KLSAgdm9pZCAoKnByaW50Zl9maWx0ZXJlZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIC4uLikpOwotCi0gIC8qIFRhbGsgdG8gdGhlIHVzZXIgb24gYSBjb25zb2xlLiAgKi8KLSAgdm9pZCAoKnZwcmludGZfZmlsdGVyZWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSk7Ci0KLSAgLyogU2FtZSBhcyB2cHJpbnRmX2ZpbHRlcmVkIGJ1dCB0byBzdGRlcnIuICAqLwotICB2b2lkICgqZXZwcmludGZfZmlsdGVyZWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSk7Ci0KLSAgLyogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgImV4aXQiLgotICAgICBJbiB0aGUgY2FzZSBvZiBnZGIgImV4aXRpbmciIG1lYW5zIGRvaW5nIGEgbG9uZ2ptcCBiYWNrIHRvIHRoZSBtYWluCi0gICAgIGNvbW1hbmQgbG9vcC4gICovCi0gIHZvaWQgKCplcnJvcikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIC4uLikpOwotCi0gIGludCBsYXN0X2Vycm5vOwkJLyogaG9zdCBmb3JtYXQgKi8KLQotICBpbnQgZmRtYXBbTUFYX0NBTExCQUNLX0ZEU107Ci0gIGNoYXIgZmRvcGVuW01BWF9DQUxMQkFDS19GRFNdOwotICBjaGFyIGFsd2F5c29wZW5bTUFYX0NBTExCQUNLX0ZEU107Ci0KLSAgLyogU3lzdGVtIGNhbGwgbnVtYmVycy4gICovCi0gIENCX1RBUkdFVF9ERUZTX01BUCAqc3lzY2FsbF9tYXA7Ci0gIC8qIEVycm5vIHZhbHVlcy4gICovCi0gIENCX1RBUkdFVF9ERUZTX01BUCAqZXJybm9fbWFwOwotICAvKiBGbGFncyB0byB0aGUgb3BlbiBzeXN0ZW0gY2FsbC4gICovCi0gIENCX1RBUkdFVF9ERUZTX01BUCAqb3Blbl9tYXA7Ci0gIC8qIFNpZ25hbCBudW1iZXJzLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICpzaWduYWxfbWFwOwotICAvKiBMYXlvdXQgb2YgYHN0YXQnIHN0cnVjdC4KLSAgICAgVGhlIGZvcm1hdCBpcyBhIHNlcmllcyBvZiAibmFtZSxsZW5ndGgiIHBhaXJzIHNlcGFyYXRlZCBieSBjb2xvbnMuCi0gICAgIEVtcHR5IHNwYWNlIGlzIGluZGljYXRlZCB3aXRoIGEgYG5hbWUnIG9mICJzcGFjZSIuCi0gICAgIEFsbCBwYWRkaW5nIG11c3QgYmUgZXhwbGljaXRseSBtZW50aW9uZWQuCi0gICAgIExlbmd0aHMgYXJlIGluIGJ5dGVzLiAgSWYgdGhpcyBuZWVkcyB0byBiZSBleHRlbmRlZCB0byBiaXRzLAotICAgICB1c2UgIm5hbWUuYml0cyIuCi0gICAgIEV4YW1wbGU6ICJzdF9kZXYsNDpzdF9pbm8sNDpzdF9tb2RlLDQ6Li4uIiAgKi8KLSAgY29uc3QgY2hhciAqc3RhdF9tYXA7Ci0KLSAgLyogTWFya2VyIGZvciB0aG9zZSB3YW50aW5nIHRvIGRvIHNhbml0eSBjaGVja3MuCi0gICAgIFRoaXMgc2hvdWxkIHJlbWFpbiB0aGUgbGFzdCBtZW1iZXIgb2YgdGhpcyBzdHJ1Y3QgdG8gaGVscCBjYXRjaAotICAgICBtaXNjb21waWxhdGlvbiBlcnJvcnMuICovCi0jZGVmaW5lIEhPU1RfQ0FMTEJBQ0tfTUFHSUMgNDcwNSAvKiB0ZWRzIGNvbnN0YW50ICovCi0gIGludCBtYWdpYzsKLX07Ci0KLWV4dGVybiBob3N0X2NhbGxiYWNrIGRlZmF1bHRfY2FsbGJhY2s7Ci0MCi0vKiBDYW5vbmljYWwgdmVyc2lvbnMgb2Ygc3lzdGVtIGNhbGwgbnVtYmVycy4KLSAgIEl0J3Mgbm90IGludGVuZGVkIHRvIHdpbGx5LW5pbGx5IHRocm93IGV2ZXJ5IHN5c3RlbSBjYWxsIGV2ZXIgaGVhcmQKLSAgIG9mIGluIGhlcmUuICBPbmx5IGluY2x1ZGUgdGhvc2UgdGhhdCBoYXZlIGFuIGltcG9ydGFudCB1c2UuCi0gICA/Pz8gT25lIGNhbiBjZXJ0YWlubHkgc3RhcnQgYSBkaXNjdXNzaW9uIG92ZXIgdGhlIG9uZXMgdGhhdCBhcmUgY3VycmVudGx5Ci0gICBoZXJlLCBidXQgdGhhdCB3aWxsIGFsd2F5cyBiZSB0cnVlLiAgKi8KLQotLyogVGhlc2UgYXJlIHVzZWQgYnkgdGhlIEFOU0kgQyBzdXBwb3J0IG9mIGxpYmMuICAqLwotI2RlZmluZQlDQl9TWVNfZXhpdAkxCi0jZGVmaW5lCUNCX1NZU19vcGVuCTIKLSNkZWZpbmUJQ0JfU1lTX2Nsb3NlCTMKLSNkZWZpbmUJQ0JfU1lTX3JlYWQJNAotI2RlZmluZQlDQl9TWVNfd3JpdGUJNQotI2RlZmluZQlDQl9TWVNfbHNlZWsJNgotI2RlZmluZQlDQl9TWVNfdW5saW5rCTcKLSNkZWZpbmUJQ0JfU1lTX2dldHBpZAk4Ci0jZGVmaW5lCUNCX1NZU19raWxsCTkKLSNkZWZpbmUgQ0JfU1lTX2ZzdGF0ICAgIDEwCi0vKiNkZWZpbmUgQ0JfU1lTX3NicmsJMTEgLSBub3QgY3VycmVudGx5IGEgc3lzdGVtIGNhbGwsIGJ1dCByZXNlcnZlZC4gICovCi0KLS8qIEFSR1Ygc3VwcG9ydC4gICovCi0jZGVmaW5lIENCX1NZU19hcmd2bGVuCTEyCi0jZGVmaW5lIENCX1NZU19hcmd2CTEzCi0KLS8qIFRoZXNlIGFyZSBleHRyYXMgYWRkZWQgZm9yIG9uZSByZWFzb24gb3IgYW5vdGhlci4gICovCi0jZGVmaW5lIENCX1NZU19jaGRpcgkxNAotI2RlZmluZSBDQl9TWVNfc3RhdAkxNQotI2RlZmluZSBDQl9TWVNfY2htb2QgCTE2Ci0jZGVmaW5lIENCX1NZU191dGltZSAJMTcKLSNkZWZpbmUgQ0JfU1lTX3RpbWUgCTE4Ci0MCi0vKiBTdHJ1Y3QgdXNlIHRvIHBhc3MgYW5kIHJldHVybiBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcGVyZm9ybSBhCi0gICBzeXN0ZW0gY2FsbC4gICovCi0vKiBGSVhNRTogTmVlZCB0byBjb25zaWRlciB0YXJnZXQgd29yZCBzaXplLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2Jfc3lzY2FsbCB7Ci0gIC8qIFRoZSB0YXJnZXQncyB2YWx1ZSBvZiB3aGF0IHN5c3RlbSBjYWxsIHRvIHBlcmZvcm0uICAqLwotICBpbnQgZnVuYzsKLSAgLyogVGhlIGFyZ3VtZW50cyB0byB0aGUgc3lzY2FsbC4gICovCi0gIGxvbmcgYXJnMSwgYXJnMiwgYXJnMywgYXJnNDsKLQotICAvKiBUaGUgcmVzdWx0LiAgKi8KLSAgbG9uZyByZXN1bHQ7Ci0gIC8qIFNvbWUgc3lzdGVtIGNhbGxzIGhhdmUgdHdvIHJlc3VsdHMuICAqLwotICBsb25nIHJlc3VsdDI7Ci0gIC8qIFRoZSB0YXJnZXQncyBlcnJubyB2YWx1ZSwgb3IgMCBpZiBzdWNjZXNzLgotICAgICBUaGlzIGlzIGNvbnZlcnRlZCB0byB0aGUgdGFyZ2V0J3MgdmFsdWUgd2l0aCBob3N0X3RvX3RhcmdldF9lcnJuby4gICovCi0gIGludCBlcnJjb2RlOwotCi0gIC8qIFdvcmtpbmcgc3BhY2UgdG8gYmUgdXNlZCBieSBtZW1vcnkgcmVhZC93cml0ZSBjYWxsYmFja3MuICAqLwotICBQVFIgcDE7Ci0gIFBUUiBwMjsKLSAgbG9uZyB4MSx4MjsKLQotICAvKiBDYWxsYmFja3MgZm9yIHJlYWRpbmcvd3JpdGluZyBtZW1vcnkgKGUuZy4gZm9yIHJlYWQvd3JpdGUgc3lzY2FsbHMpLgotICAgICA/Pz8gbG9uZyBvciB1bnNpZ25lZCBsb25nIG1pZ2h0IGJlIGJldHRlciB0byB1c2UgZm9yIHRoZSBgY291bnQnCi0gICAgIGFyZ3VtZW50IGhlcmUuICBXZSBtaW1pYyBzaW1fe3JlYWQsd3JpdGV9IGZvciBub3cuICBCZSBjYXJlZnVsIHRvCi0gICAgIHRlc3QgYW55IGNoYW5nZXMgd2l0aCAtV2FsbCAtV2Vycm9yLCBtaXhlZCBzaWduZWQgY29tcGFyaXNvbnMKLSAgICAgd2lsbCBnZXQgeW91LiAgKi8KLSAgaW50ICgqcmVhZF9tZW0pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiAvKmNiKi8sIHN0cnVjdCBjYl9zeXNjYWxsICogLypzYyovLAotCQkJICAgdW5zaWduZWQgbG9uZyAvKnRhZGRyKi8sIGNoYXIgKiAvKmJ1ZiovLAotCQkJICAgaW50IC8qYnl0ZXMqLykpOwotICBpbnQgKCp3cml0ZV9tZW0pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiAvKmNiKi8sIHN0cnVjdCBjYl9zeXNjYWxsICogLypzYyovLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgLyp0YWRkciovLCBjb25zdCBjaGFyICogLypidWYqLywKLQkJCSAgICBpbnQgLypieXRlcyovKSk7Ci0KLSAgLyogRm9yIHNhbml0eSBjaGVja2luZywgc2hvdWxkIGJlIGxhc3QgZW50cnkuICAqLwotICBpbnQgbWFnaWM7Ci19IENCX1NZU0NBTEw7Ci0KLS8qIE1hZ2ljIG51bWJlciBzYW5pdHkgY2hlY2tlci4gICovCi0jZGVmaW5lIENCX1NZU0NBTExfTUFHSUMgMHgxMjM0NDMyMQotCi0vKiBNYWNybyB0byBpbml0aWFsaXplIENCX1NZU0NBTEwuICBDYWxsZWQgZmlyc3QsIGJlZm9yZSBmaWxsaW5nIGluCi0gICBhbnkgZmllbGRzLiAgKi8KLSNkZWZpbmUgQ0JfU1lTQ0FMTF9JTklUKHNjKSBcCi1kbyB7IFwKLSAgbWVtc2V0ICgoc2MpLCAwLCBzaXplb2YgKCooc2MpKSk7IFwKLSAgKHNjKS0+bWFnaWMgPSBDQl9TWVNDQUxMX01BR0lDOyBcCi19IHdoaWxlICgwKQotDAotLyogUmV0dXJuIGNvZGVzIGZvciB2YXJpb3VzIGludGVyZmFjZSByb3V0aW5lcy4gICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIENCX1JDX09LID0gMCwKLSAgLyogZ2VuZXJpYyBlcnJvciAqLwotICBDQl9SQ19FUlIsCi0gIC8qIGVpdGhlciBmaWxlIG5vdCBmb3VuZCBvciBubyByZWFkIGFjY2VzcyAqLwotICBDQl9SQ19BQ0NFU1MsCi0gIENCX1JDX05PX01FTQotfSBDQl9SQzsKLQotLyogUmVhZCBpbiB0YXJnZXQgdmFsdWVzIGZvciBzeXN0ZW0gY2FsbCBudW1iZXJzLCBlcnJubyB2YWx1ZXMsIHNpZ25hbHMuICAqLwotQ0JfUkMgY2JfcmVhZF90YXJnZXRfc3lzY2FsbF9tYXBzIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRyYW5zbGF0ZSB0YXJnZXQgdG8gaG9zdCBzeXNjYWxsIGZ1bmN0aW9uIG51bWJlcnMuICAqLwotaW50IGNiX3RhcmdldF90b19ob3N0X3N5c2NhbGwgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIGhvc3QgdG8gdGFyZ2V0IGVycm5vIHZhbHVlLiAgKi8KLWludCBjYl9ob3N0X3RvX3RhcmdldF9lcnJubyBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgdGFyZ2V0IHRvIGhvc3Qgb3BlbiBmbGFncy4gICovCi1pbnQgY2JfdGFyZ2V0X3RvX2hvc3Rfb3BlbiBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgdGFyZ2V0IHNpZ25hbCBudW1iZXIgdG8gaG9zdC4gICovCi1pbnQgY2JfdGFyZ2V0X3RvX2hvc3Rfc2lnbmFsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBob3N0IHNpZ25hbCBudW1iZXIgdG8gdGFyZ2V0LiAgKi8KLWludCBjYl9ob3N0X3RvX3RhcmdldF9zaWduYWwgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIGhvc3Qgc3RhdCBzdHJ1Y3QgdG8gdGFyZ2V0LgotICAgSWYgc3RhdCBzdHJ1Y3QgcHRyIGlzIE5VTEwsIGp1c3QgY29tcHV0ZSB0YXJnZXQgc3RhdCBzdHJ1Y3Qgc2l6ZS4KLSAgIFJlc3VsdCBpcyBzaXplIG9mIHRhcmdldCBzdGF0IHN0cnVjdCBvciAwIGlmIGVycm9yLiAgKi8KLWludCBjYl9ob3N0X3RvX3RhcmdldF9zdGF0IFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3Qgc3RydWN0IHN0YXQgKiwgUFRSKSk7Ci0KLS8qIFBlcmZvcm0gYSBzeXN0ZW0gY2FsbC4gICovCi1DQl9SQyBjYl9zeXNjYWxsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgQ0JfU1lTQ0FMTCAqKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL0NoYW5nZUxvZyBiL2luY2x1ZGUvY29mZi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODA5M2MuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDgzMSArMCwwIEBACi0xOTk5LTA5LTIwICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGludGVybmFsLmg6IERlbGV0ZSBib2d1cyBSX1BDTE9ORywgZHVwbGljYXRlIFJfUkVMQllURSBhbmQKLQlSX1JFTFdPUkQsIGFuZCByZXdyaXRlIHNvbWUgUl8qIGFzIGRlY2ltYWwuCi0KLTE5OTktMDktMDYgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBpbnRlcm5hbC5oIChEVFlQRSk6IERlZmluZS4KLQkqIHBlLmggKHN0cnVjdCBleHRlcm5hbF9QRUlfZmlsZWhkcik6IFJlbmFtZSBmcm9tCi0JZXh0ZXJuYWxfUEVfZmlsZWhkci4gIERlZmluZSBldmVuIGlmIENPRkZfSU1BR0VfV0lUSF9QRSBpcyBub3QKLQlkZWZpbmVkLgotCi0xOTk5LTA3LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoRl9TT0ZUX0ZMT0FUKTogUmVuYW1lIGZyb20gRl9TT0ZURkxPQVQuCi0KLTE5OTktMDYtMjEgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBhcm0uaCAoRl9TT0ZURkxPQVQpOiBEZWZpbmUuCi0KLTE5OTktMDctMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oIChGX0FSTV81KTogRGVmaW5lLgotCi1XZWQgSnVuICAyIDE4OjA4OjE4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKEJFT1NfRVhFX0lNQUdFX0JBU0UsIEJFT1NfRExMX0lNQUdFX0JBU0UpOiBOZXcuCi0KLU1vbiBNYXkgMTcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKEZfUElDLCBGX0FSTV8yLCBGX0FSTV8yYSwgRl9BUk1fMywgRl9BUk1fM00sCi0JRl9BUk1fNCwgRl9BUk1fNFQsIEZfQVBDUzI2KTogQ2hhbmdlZCB2YWx1ZXMgdG8gZGlzdGluZ3Vpc2gKLQlGX0FSTV8yYSwgRl9BUk1fM00sIEZfQVJNXzRULgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oIChJTUFHRV9SRUxfTUNPUkVfUlZBKTogRGVmaW5lLgotCi0xOTk5LTA0LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oIChHRVRfTElORU5PX0xOTk8pOiBOZXcgbWFjcm8uCi0JKFBVVF9MSU5FTk9fTE5OTyk6IE5ldyBtYWNyby4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUKLQlwcm9jZXNzb3IuIAotCi1TdW4gRGVjICA2IDIxOjM2OjM3IDE5OTggIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAdXNhLm5ldD4KLQotCSogaW50ZXJuYWwuaCAoQ19XRUFLRVhUKTogRGVmaW5lLgotCi1XZWQgSmFuIDI3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmL2FybS5oIChGX1BJQ19JTlQsIEZfQVJNXzIsIEZfQVJNXzMsIEZfQVJNXzQsIEZfQVBDUzI2KToKLQlDaGFuZ2VkIHZhbHVlcyB0byBhdm9pZCBjbGFzaGluZyB3aXRoIElNQUdFX0ZJTEVfKiBjb2ZmIGhlYWRlcgotCWZsYWcgdmFsdWVzLgotCQotV2VkIEFwciAgMSAxNjowNjoxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBEb2N1bWVudCBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCBUaHVtYiBzeW1ib2wKLQl0eXBlcy4gCi0KLUZyaSBNYXIgMjcgMTc6MTY6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChJU1BUUiwgSVNGQ04sIElTQVJZKTogQWRkIGNhc3RzIHRvIHVuc2lnbmVkIGxvbmcuCi0KLU1vbiBGZWIgIDIgMTc6MTA6MzggMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogdGljMzAuaDogTmV3IGZpbGUuCi0KLUZyaSBEZWMgMTIgMTE6NDk6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFJfTVBQQ1IxNVcpOiBOZXcgcmVsb2NhdGlvbiB0eXBlLCBmb3IgMTUgYml0IFBDIHJlbGF0aXZlCi0Jb2Zmc2V0cy4KLQotVHVlIERlYyAgMiAxMDoyMTo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoQ09GRkFSTSk6IE5ldyBkZWZpbmUuCi0KLVNhdCBOb3YgMjIgMTU6MTA6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoQ19USFVNQkVYVEZVTkMsIENfVEhVTUJTVEFURlVOQyk6IENvbnN0YW50cyB0bwotCWRlZmluZSBzdGF0aWMgYW5kIGV4dGVybmFsIGZ1bmN0aW9ucy4KLQotCSogYXJtLmg6IEFkZCBiaXRzIHRvIHN1cHBvcnQgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMsCi0Jd2hlbiBpbXBsZW1lbnRlZC4KLQotRnJpIE9jdCAgMyAxNDoyNToxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9QUEwxNkIpOiBNYWtlIGNvbnN0YW50IHVwcGVyY2FzZSBmb3IgY29uc2lzdGVuY3kuCi0KLVR1ZSBKdWwgMjIgMTg6MTg6NTggMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBnbzMyZXhlLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVsICA4IDEyOjIzOjU1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9UQVJHRVRfSUQpOiBBZGQgZGVmaW5lLgotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIpOiBBZGQgZl90YXJnZXRfaWQgZmllbGQuCi0KLVR1ZSBKdW4gIDMgMTY6NDQ6MTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaDogQWRkIHN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scwotCi1Nb24gTWF5IDI2IDE0OjA3OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9QUEwxNkIpOiBDb3JyZWN0IHZhbHVlLgotCi1TYXQgTWF5ICAzIDA4OjI0OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX1VFWFQsIENfU1RBVExBQiwgQ19FWFRMQUIsIENfU1lTVEVNKToKLQlOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MC4KLQotRnJpIEFwciAxOCAxMTo1Mjo1NSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBhbHBoYS5oIChBTFBIQV9FQ09GRl9CQURNQUcpOiBSZWNvZ25pemUgKkJTRC9hbHBoYSBtYWdpYyB0b28uCi0JKEFMUEhBX1JfTElURVJBTFNMRUFaWSk6IERlZmluZS4KLQkqIGVjb2ZmLmggKEFMUEhBX01BR0lDX0JTRCk6IERlZmluZS4KLQotV2VkIEphbiAyOSAxMTozMTo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoUl9JUFIxMywgUl9BTElHTik6IERlZmluZS4KLQotTW9uIEphbiAyNyAxMzozNDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKFJfSVBSTUVELCBSX09QVENBTEwsIFJfT1BUQ0FMTFgpOiBNb3ZlIGRlZmluaXRpb25zCi0JZnJvbSBoZXJlLi4uCi0JKiBpOTYwLmggKFJfSVBSTUVELCBSX09QVENBTEwsIFJfT1BUQ0FMTFgpOiAuLi50byBoZXJlLgotCi1XZWQgSmFuIDIyIDIwOjEwOjQ3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4ME1BR0lDKTogUmVuYW1lZCB0byBUSUM4MF9BT1VUSERSX01BR0lDLgotCi1GcmkgRGVjIDI3IDIyOjA1OjQ1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oOiBOZXcgZmlsZSBmb3IgVEljODAgc3VwcG9ydC4KLQotVGh1IERlYyAxOSAxNjoxODoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oIChfTElUKTogRGVmaW5lLgotCi1GcmkgSnVuIDI4IDEyOjU0OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGUuaCAoRklMSFNaKTogRGVmaW5lLgotCi1XZWQgSnVuIDI2IDE2OjI0OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQWxsIGZpbGVzOiBEZWZpbmUgRklMSFNaLCBBT1VUU1osIEFPVVRIRFJTWiwgU0NOSFNaLCBTWU1FU1osCi0JQVVYRVNaLCBMSU5FU1osIFJFTFNaIGFzIG51bWVyaWMgY29uc3RhbnRzIHJhdGhlciB0aGFuIHVzZXMgb2YKLQlzaXplb2YuICBEZWZpbmUgQU9VVEhEUlNaIGluIGFsbCBmaWxlcy4KLQkqIHBlLmggKEFPVVRTWik6IERlZmluZSBieSBhZGRpbmcgdG8gQU9VVEhEUlNaLgotCi1GcmkgSnVuIDIxIDExOjE3OjQ2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS5oOiBBZGQgZGVjbGFyYXRpb25zIGZvciByZWxvY2F0aW9uIHR5cGVzIGFkZGVkIGZvciBBbHBoYQotIAlPU0YvMSAzLjAuCi0KLVR1ZSBKdW4gMTggMTY6MDQ6MjkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLmggKEg4MzAwU01BR0lDKTogRGVmaW5lLgotCShIODMwMFNCQURNQUcpOiBEZWZpbmUuCi0KLU1vbiBKdW4gMTAgMTE6NTM6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0JDQ19JTlYsIFJfSk1QX0RFTCk6IE5ldyByZWxvY2F0aW9ucyBmb3IKLQlyZWxheGluZyBpbiB0aGUgSDgvMzAwIHNlcmllcy4KLQotVGh1IE1heSAxNiAxNTo0OToyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLmggKFJfU0hfQ09ERSwgUl9TSF9EQVRBLCBSX1NIX0xBQkVMKTogRGVmaW5lLgotCi1UdWUgTWF5ICA3IDAwOjM2OjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9KTVBMMik6IFJlbmFtZWQgZnJvbSBSX0pNUExfQjggdG8gYmUKLQljb25zaXN0ZW50IHdpdGggb3RoZXIgc2ltaWxhciByZWxvY3MuCi0KLQkqIGludGVybmFsLmggKEg4LzMwMCBzcGVjaWZpYyByZWxvY3MpOiBBZGQgY29tbWVudHMgYmV0dGVyCi0JZXhwbGFpbmluZyB3aGF0IGVhY2ggcmVsb2MgaXMgdXNlZCBmb3IuCi0JKFJfTU9WMTZCMSwgUl9NT1YxNkIyKTogUmVuYW1lZCBmcm9tIFJfTU9WQjEgYW5kIFJfTU9WQjIuCi0JKFJfTU9WMjRCMSwgUl9NT1YyNEIyKTogUmVuYW1lZCBmcm9tIFJfTU9WTEIxIGFuZCBSX01PVkxCMi4KLQkoUl9NT1ZMMSwgUl9NT1ZMMik6IE5ldyByZWxvY3MuCi0JCi1GcmkgTWF5ICAzIDEzOjAxOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9QQ1JXT1JEX0IpOiBEZWZpbmUgZm9yIHRoZSBoODMwMCByZWxheGluZwotCWxpbmtlci4KLQotV2VkIE1heSAgMSAxOToyMTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKFNDTk5NTEVOKTogRGVmaW5lLgotCShzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyKTogVXNlIFNDTk5NTEVOIGZvciBzX25hbWUgZmllbGQuCi0KLUZyaSBNYXIgMjkgMTM6NDE6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZS5oOiBEZWZpbmUgSU1BR0VfQ09NREFUIGNvZGVzLgotCi1XZWQgTWFyIDI3IDE3OjI5OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IEFkZCB4X2NoZWNrc3VtLCB4X2Fzc29jaWF0ZWQsIGFuZAotCXhfY29tZGF0IGZpZWxkcyB0byB4X3NjbiBzdHJ1Y3QuCi0JKiBpMzg2LmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCSogcG93ZXJwYy5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBMaWtld2lzZS4KLQkqIGludGVybmFsLmggKHVuaW9uIGludGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDIxIDE2OjI1OjU3IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9maW5kX2xpbmUpOiBBZGQgY2FjaGluZyBmaWVsZHMuCi0KLVRodSBNYXIgMTQgMTU6MjI6NDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX01FTV9JTkRJUkVDVCk6IE5ldyByZWxvYyBmb3IgdGhlIGg4MzAwLgotIAotRnJpIEZlYiAgOSAxMDo0NDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGF1eC1jb2ZmLmg6IFJlbmFtZSBmcm9tIGF1eC5oLCB0byBhdm9pZCBwcm9ibGVtcyBvbiBoYXBsZXNzIERPUwotCXN5c3RlbXMgd2hpY2ggdGhpbmsgdGhhdCBhdXggaXMgYSBjb20gcG9ydC4KLQotTW9uIEZlYiAgNSAxODozNTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoRl9JOTYwSFgpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMzEgMTM6MTE6NTQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGF1eC5oOiBOZXcgZmlsZS4KLQkqIGludGVybmFsLmgsIG02OGsuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4KLQotV2VkIE5vdiAyMiAxMzo0ODozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmggKF9SQ09OU1QsIFNUWVBfUkNPTlNULCBSRUxPQ19TRUNUSU9OX1JDT05TVCk6IERlZmluZS4KLQkoTlVNX1JFTE9DX1NFQ1RJT05TKTogVXBkYXRlLgotCSogc3ltY29uc3QuaCAoc2NSQ29uc3QpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTQgMTg6NTQ6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX05UX1dFQUspOiBEZWZpbmUuCi0KLVRodSBOb3YgIDkgMTQ6MDg6MzAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAuaCAoU1RZUF9PVlJGTE8pOiBEZWZpbmUuCi0KLVR1ZSBOb3YgIDcgMTQ6Mzg6NDUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvcG93ZXJwYy5oIChJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMpOiBBZGRlZCBkZWZpbmUuCi0JKiBjb2ZmL3BlLmg6IEFkZGVkIGRlZmluZXMgZm9yIGZpbGUgbGV2ZWwgZmxhZ3MKLQotTW9uIE5vdiAgNiAxNzoyODowMSAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+Ci0KLQkqIGk4NjAuaDogTmV3IGZpbGUsIGJhc2VkIG9uIGkzODYuaC4KLQotV2VkIE5vdiAgMSAxNToyNToxOCAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogbTY4ay5oIChQQUdFTUFHSUNFWEVDU1dBUFBFRCk6IERlZmluZS4KLQkoUEFHRU1BR0lDUEVYRUNTV0FQUEVEKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1RTSExJQik6IERlZmluZS4KLQkoUEFHRU1BR0lDUEVYRUNQQUdFRCk6IERlZmluZS4KLQkoX0NPTU1FTlQpOiBERUZJTkUuCi0JKiBtODhrLmggKF9DT01NRU5UKTogRGVmaW5lLgotCi1XZWQgT2N0IDE4IDE4OjM2OjE5IDE5OTUgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHN5bS5oOiAjaWYgMCdkIG91dCBydW50aW1lX3BkciBzdHJ1Y3QgYmVjYXVzZSBpdCBjaG9rZXMgCi0JVmlzdWFsIEMrKyBhbmQgdGhlcmUgYXJlbid0IGFueSByZWZlcmVuY2VzIHRvIGl0IGVsc2V3aGVyZSBpbiBnZGIuCi0KLU1vbiBPY3QgMTYgMTE6MTI6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAuaCAoU01BTExfQU9VVFNaKTogRGVmaW5lLgotCi0JKiBpbnRlcm5hbC5oIChYTUNfVEQpOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMTAgMTg6NDE6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcik6IEFkZCBvX2NwdXR5cGUgZmllbGQuCi0JKiByczYwMDAuaCAoQU9VVEhEUik6IFJlbmFtZSBvX3Jlc3YxIHRvIG9fY3B1dHlwZS4KLQotTW9uIE9jdCAgOSAxNDo0NTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChBT1VUSERSKTogQWRkIG9fbWF4ZGF0YSBmaWVsZC4gIEFkZCBjb21tZW50cy4KLQkoX1BBRCwgX0xPQURFUik6IERlZmluZS4KLQkoU1RZUF9MT0FERVIpOiBEZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcik6IEFkZCBvX21heGRhdGEgZmllbGQuCi0KLVRodSBPY3QgIDUgMTA6MDI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oOiBEZWZpbmUgc2VjdGlvbiBuYW1lIG1hY3JvcyBhbmQgU1RZUCBtYWNyb3MgZm9yIHZhcmlvdXMKLQlBbHBoYSBzZWN0aW9uczogLmdvdCwgLmhhc2gsIC5keW5zeW0sIC5keW5zdHIsIC5yZWwuZHluLCAuY29uZmxpYywKLQkuY29tbWVudCwgLmxpYmxpc3QsIC5keW5hbWljLgotCi1XZWQgT2N0ICA0IDEwOjU2OjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZS5oOiBNb3ZlZCBET1NNQUdJQyBhbmQgTlRfU0lHTkFUVVJFIGRlZmluZXMgaGVyZQotCSogcG93ZXJwYy5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcwotCUFsc28gcmVtb3ZlZCBvdGhlciB1bnVzZWQgZGVmaW5lcyAodmFyaW91cyBNQUdJQyBvbmVzKQotCSogaTM4Ni5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcwotCSogYXJtLmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBhcG9sbG8uaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGFscGhhLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBoODUwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogaDgzMDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGk5NjAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG04OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHdlMzJrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiByczYwMDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG1pcHMuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG02OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHo4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogdzY1Lmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBzcGFyYy5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogc2guaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQotRnJpIFNlcCAyOSAwODo0MDowOCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcG93ZXJwYy5oOiBSZWZvcm1hdHRlZCB0byBHTlUgY29kaW5nIGNvbnZlbnRpb25zLgotCi1XZWQgU2VwIDI3IDA2OjUwOjUwIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIHBlLmg6IGFkZGVkIGRlZmluZXMgZm9yIG1vcmUgc2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MKLQkqIHBvd2VycGMuaCAobmV3IGZpbGUpOiBiYXNlIGNvZmYgZGVmaW5pdGlvbnMgZm9yIHBwYyBQRQotCi1UdWUgU2VwIDEyIDEyOjA4OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX3N5bWVudCk6IENoYW5nZSBuX251bWF1eCBmaWVsZCBmcm9tCi0JY2hhciB0byB1bnNpZ25lZCBjaGFyLgotCi1GcmkgU2VwICAxIDE1OjM5OjM2IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBtaXBzLmggKHN0cnVjdCBycGRyX2V4dCk6IERlZmluZS4KLQotVGh1IEF1ZyAzMSAxNjo1MTo1MCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyLCBpbnRlcm5hbF9maWxlaGRyKToKLQlkb24ndCBpbmRpcmVjdCB0aGUgcGUgc3R1ZmYuCi0KLVR1ZSBBdWcgMjkgMTQ6MTY6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IE1ha2UgdGhlIHNhbWUKLQlhcyAndGhlIG90aGVyJyBjb21waWxlci4KLQkqIGludGVybmFsLmggKE5UX0lNQUdFX0JBU0UpOiBEZWxldGVkLgotCShOVF9FWEVfSU1BR0VfQkFTRSwgTlRfRExMX0lNQUdFX0JBU0UpOiBOZXcuCi0JKFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKTogTmV3LgotCShSX0lNQUdFQkFTRSk6IE5ldy4KLQotTW9uIEF1ZyAyMSAxODoxMjoxOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiAoaW50ZXJuYWxfZmlsZWhkcik6IE1vdmVkIFBFIHN0dWZmIGludG8KLQlpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyLgotCShpbnRlcm5hbF9hb3V0aGRyKTogTW92ZWQgUEUgc3R1ZmYgaW50bwotCWludGVyYW5sX2V4dHJhX3BlX2FvdXRoZHIuCi0KLU1vbiBKdWwgMjQgMTQ6MDU6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBNb3ZlIFJfU0hfKiByZWxvY3MgZnJvbSBoZXJlLi4uCi0JKiBzaC5oOiAuLi50byBoZXJlLgotCShSX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDMyKTogRGVmaW5lLgotCShSX1NIX1VTRVMsIFJfU0hfQ09VTlQsIFJfU0hfQUxJR04pOiBEZWZpbmUuCi0KLVRodSBKdW4gMjkgMDA6MDQ6MjUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBJbmNyZWFzZSBhIGxvdC4KLQotVHVlIE1heSAxNiAxNTowODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWxldGUKLQotVHVlIE1heSAxNiAxNTowODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBOb3cgZXh0ZXJuLgotCi1UdWUgRmViIDE0IDE3OjU5OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSk6IERlZmluZS4KLQotU2F0IEZlYiAgNCAxNDozODowMyAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIHN5bS5oIChzdHJ1Y3QgcGRyKTogZmllbGQgInByb2YiIGFkZGVkLgotCi0JKiBhbHBoYS5oIChQRFJfQklUUzFfUFJPRl8qKTogYWRkZWQsIG1hY3JvcyBmb3IgUERSX0JJVFMqX1JFU0VSVkVEXyoKLQl1cGRhdGVkIGFjY29yZGluZ2x5LgotCi1TdW4gSmFuIDE1IDE4OjM4OjMzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiB3NjUuaDogTmV3IGZpbGUuCi0KLVdlZCBOb3YgMjMgMjI6NDM6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc2guaCAoU0hfQVJDSF9NQUdJQ19CSUcsIFNIX0FSQ0hfTUFHSUNfTElUVExFKTogTmV3LgotCShTSEJBRE1BRyk6IENoYW5nZWQgdG8gc3VpdC4KLQotVHVlIEp1bCAyNiAxNzo0NjowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpOTYwLmggKEZfSTk2MEpYKTogTmV3IG1hY3JvLgotCi1XZWQgSnVsICA2IDAwOjQ4OjU3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEuaDogIEFkZCBkZWZpbml0aW9ucyBmb3IgYWxwaGEgZmlsZSBoZWFkZXIgZmxhZ3MsIGVuY29kaW5nCi0JdGhlIG9iamVjdCB0eXBlIG9mIHRoZSBmaWxlLgotCi1Nb24gSnVuIDIwIDEzOjQ3OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoZWNvZmZfc3dhcF90aXJfaW4pOiBSZW1vdmUgZGVjbGFyYXRpb24uCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBBZGQgbmV3IGZpZWxkczogc3dhcF90aXJfaW4sCi0Jc3dhcF9ybmR4X2luLCBzd2FwX3Rpcl9vdXQsIHN3YXBfcm5keF9vdXQsIHJlYWRfZGVidWdfaW5mby4KLQotU3VuIEp1biAxMiAwMzo1MTo1MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHN5bWNvbnN0Lmg6ICBQaWNrIHVwIFNHSSBkZWZpbmUgZm9yIHN0SW5kaXJlY3QuCi0KLUZyaSBBcHIgMjIgMTM6MDU6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChSRUdJTkZPKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfcmVnaW5mbyk6IERvbid0IGRlZmluZS4KLQotCSogc2guaCAoU0hfQVJDSF9NQUdJQyk6IFJlbmFtZSBmcm9tIFNITUFHSUMuICBTSE1BR0lDIGlzIHVzZWQgYnkKLQlzZXZlcmFsIHRhcmdldHMgdG8gbWVhbiBhIHNoYXJlZCBsaWJyYXJ5LgotCShTSEJBRE1BRyk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1UaHUgQXByIDE0IDEzOjAwOjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChSRUxPQ19CSVRTM19UWVBFX0JJRyk6IENoYW5nZWQgZnJvbSAweDFlIHRvIDB4M2UuCi0JKFJFTE9DX0JJVFMzX1RZUEVISV9MSVRUTEUpOiBEZWZpbmUuCi0JKFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUpOiBEZWZpbmUuCi0JKE1JUFNfUl9QQ1JFTDE2KTogQ2hhbmdlIHZhbHVlIGZyb20gOCB0byAxMiB0byBtYXRjaCBJcml4IDQuCi0JKE1JUFNfUl9SRUxISSk6IERlZmluZS4KLQkoTUlQU19SX1JFTExPKTogRGVmaW5lLgotCShNSVBTX1JfU1dJVENIKTogQ2hhbmdlIHZhbHVlIGZyb20gOSB0byAyMi4KLQotVGh1IEFwciAgNyAxNDoxOTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19SX1NXSVRDSCk6IERlZmluZS4KLQotVGh1IE1hciAzMSAxOToyODozMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyKTogQWRkZWQgY29tbWVudHMgZm9yIEFwb2xsbyBmaWVsZHMuCi0KLVRodSBNYXIgMzEgMTY6Mjg6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChTVFlQX0VDT0ZGX0xJQik6IERlZmluZSBhcyB1c2VkIG9uIElyaXggNC4KLQotRnJpIE1hciAyNSAxNzoxNjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvKTogQWRkIGFkanVzdCBmaWVsZC4KLQkoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCk6IERlZmluZS4KLQotVHVlIE1hciAyMiAxMzoyMjo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19SX1BDUkVMMTYpOiBEZWZpbmUuCi0KLVNhdCBGZWIgMjYgMTA6MjY6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5oOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgotCi1Nb24gRmViIDIxIDA5OjQ4OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBzeW0uaCAoc3RydWN0IHJ1bnRpbWVfcGRyKTogTWFrZSBmaWVsZCBhZHIgYmZkX3ZtYSwgbm90IHVuc2lnbmVkCi0JbG9uZy4KLQkoU1lNUik6IE1ha2UgZmllbGQgdmFsdWUgYmZkX3ZtYSwgbm90IGxvbmcuCi0KLUZyaSBGZWIgIDQgMjM6MzU6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByczYwMDAuaCAoU1RZUF9ERUJVRyk6IERlZmluZS4KLQotV2VkIEZlYiAgMiAxNDozMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKHVuaW9uIGludGVybmFsX2F1eGVudCk6IENoYW5nZSB4X2NzZWN0Lnhfc2NubGVuIGludG8KLQlhIHVuaW9uIG9mIGEgbG9uZyBhbmQgYSBwb2ludGVyIHRvIGEgc3ltYm9sLiAgWENPRkYgc29tZXRpbWVzIHVzZXMKLQl0aGlzIGZpZWxkIGFzIGEgc3ltYm9sIGluZGV4LgotCi1Nb24gSmFuIDEwIDIzOjU0OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoZWNvZmZfZGVidWdfaW5mbyk6IFJlbW92ZSBmaWVsZHMgbGluZV9lbmQsCi0JZXh0ZXJuYWxfZG5yX2VuZCwgZXh0ZXJuYWxfcGRyX2VuZCwgZXh0ZXJuYWxfc3ltX2VuZCwKLQlleHRlcm5hbF9vcHRfZW5kLCBleHRlcm5hbF9hdXhfZW5kLCBzc19lbmQsIGV4dGVybmFsX2Zkcl9lbmQuCi0JUmVwbGFjZSBpZmRiYXNlIHdpdGggaWZkbWFwLgotCi1XZWQgSmFuICA1IDE3OjA1OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChTVFlQX0VYVEVOREVTQywgU1RZUF9DT01NRU5ULCBTVFlQX1hEQVRBLCBTVFlQX1BEQVRBKToKLQlEZWZpbmUuCi0KLVdlZCBKYW4gIDUgMTY6NTg6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChOVU1fUkVMT0NfU0VDVElPTlMpOiBEZWZpbmUuCi0KLVR1ZSBEZWMgMjEgMDk6MjQ6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MpOiBSZW5hbWUgZmllbGQgcl9hZGRlbmQgdG8KLQlyX29mZnNldC4KLQotU2F0IERlYyAxMSAxNjoxMjozMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9ESVNQNywgUl9TSF9JTU0xNik6IE5ldyByZWxvYyB0eXBlcy4KLQotVHVlIE5vdiAyMyAxNDoyMzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogQWRkZWQgKl9lbmQgZmllbGRzIGZvciBhbGwKLQl0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gcG9pbnRlcnMuCi0KLQkqIHN5bS5oOiBOYW1lZCB0aGUgRVhUUiBzdHJ1Y3R1cmUgZWNvZmZfZXh0ci4KLQotRnJpIE5vdiAxOSAwODoyMToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoUkVMU1opOiBVc2UgY29ycmVjdCBzaXplLgotCi1XZWQgTm92IDE3IDE3OjE4OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyk6IERlZmluZS4KLQotVHVlIE5vdiAgMiAxNzo1Njo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogRGVmaW5lLgotCi1UaHUgT2N0IDI4IDE3OjA3OjUwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChJMzg2TFlOWE1BR0lDKTogUmVuYW1lIHRvIExZTlhDT0ZGTUFHSUMuCi0JKiBtNjhrLmggKExZTlhDT0ZGTUFHSUMpOiBEZWZpbmUuCi0JKiBzcGFyYy5oOiBOZXcgZmlsZS4KLQotVHVlIE9jdCAxOSAxNTozNDo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFscGhhLmggKGV4dGVybmFsX2FvdXRoZHIpOiBTcGxpdCBmb3VyIGJ5dGUgcGFkZGluZyBmaWVsZCBpbnRvCi0JdHdvIGJ5dGUgYmxkcmV2IGZpZWxkIGFuZCB0d28gYnl0ZSBwYWRkaW5nIGZpZWxkLgotCi0JKiBlY29mZi5oIChfTElUQSwgX1BEQVRBLCBfWERBVEEsIFNUWVBfTElUQSk6IERlZmluZWQuCi0KLVdlZCBPY3QgMTMgMTU6NTI6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlTdW4gT2N0IDEwIDE3OjI3OjEwIDE5OTMgIFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LmVkdS5hdSkKLQotCSogY29mZi9pbnRlcm5hbC5oOiBBZGRlZCBvX3NyaSwgb19pbmxpYiBhbmQgb192aWQgZm9yIEFwb2xsb3MKLQkJCWFzIHdlbGwgYXMgUl9ESVIxNi4KLQotCSogY29mZi9hcG9sbG8uaDogTmV3IGZpbGUKLQotTW9uIE9jdCAxMSAxNzoxNjo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFR0lORk8sIHN0cnVjdCBlY29mZl9yZWdpbmZvKTogRGVmaW5lLgotCi1UdWUgT2N0ICA1IDEwOjUyOjUzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiByczYwMDAuaDogQ2hhbmdlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGNvbW1lbnQgdG8gb2N0YWwKLQllc2NhcGVzLgotCi1UdWUgU2VwIDI4IDAzOjI3OjA0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWNvZmYuaCAoX0ZJTkksIFNUWVBfRUNPRkZfRklOSSk6ICBBZGQgdG8gc3VwcG9ydCAuZmluaSBzZWN0aW9uLgotCi1GcmkgU2VwIDI0IDExOjUzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChCQURNQUcpOiBSZWNvZ25pemUgTUlQU19NQUdJQ19MSVRUTEUzIGFuZCBNSVBTX01BR0lDX0JJRzMuCi0JKiBlY29mZi5oOiBEZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUzIGFuZCBNSVBTX01BR0lDX0JJRzMuCi0KLVRodSBTZXAgMjMgMjE6MDc6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoQkFETUFHKTogUmVjb2duaXplIE1JUFNfTUFHSUNfTElUVExFMiBhbmQgTUlQU19NQUdJQ19CSUcyLgotCSogZWNvZmYuaDogRGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMiBhbmQgTUlQU19NQUdJQ19CSUcyLgotCi1UaHUgU2VwIDE2IDIwOjI3OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3ltLmgsIHN5bWNvbnN0Lmg6IEFkZCBjb21tZW50IHN0YXRpbmcgdGhlc2UgZmlsZXMgYXJlIG5vdCBwYXJ0Ci0Jb2YgR0RCLCBHQVMsIGV0Yy4gIEluIDE5OTEsIHdoZW4gd2UgYXNrZWQgcm1zIHdoZXRoZXIgd2UgY291bGQKLQlpbmNsdWRlIHRoZXNlIGZpbGVzIGluIEdEQiAoYWx0aG91Z2ggdGhleSBhcmUgY29weXJpZ2h0ZWQgYnkKLQlzb21lb25lIGJlc2lkZXMgdGhlIEZTRiksIGhlIHNhaWQgaXQgd2FzIE9LIGlmIHRoZXkgd2VyZSBub3QKLQljb25zaWRlcmVkIHBhcnQgb2YgR0RCLgotCi1GcmkgU2VwIDEwIDE3OjQwOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoQVVYX1BVVF9BTlkpOiBDYXN0IHZhbCBhcmd1bWVudCB0byBiZmRfdm1hLgotCi0JKiBhbHBoYS5jIChleHRlcm5hbF9hb3V0aGRyKTogTmVlZCBmb3VyIGJ5dGVzIG9mIHBhZGRpbmcgYmV0d2VlbgotCXZzdGFtcCBhbmQgdHNpemUuCi0KLVR1ZSBTZXAgIDcgMTQ6MjA6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfR0VUX0FOWSwgQVVYX1BVVF9BTlkpOiBDaGFuZ2VkIHRvIHJlZmxlY3QgZnVydGhlcgotCWNoYW5nZSBpbiBiZmQgc3dhcHBpbmcgcm91dGluZSBuYW1lcy4KLQotVHVlIFNlcCAgNyAxMDoxNToxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoQVVYX0dFVF9BTlkpOiBDaGFuZ2UgbmFtZSBvZiBfZG9fZ2V0YjMyIHRvIHJlZmxlY3QgYmZkCi0JY2hhbmdlcy4KLQotRnJpIEF1ZyAxMyAxNDozMDozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFTE9DX1NFQ1RJT05fTk9ORSk6IERlZmluZS4KLQotVGh1IEF1ZyAxMiAxMToyNDo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFscGhhLmggKHN0cnVjdCBleHRlcm5hbF9yZWxvYyk6IEFkZCByX3N5bW5keCBmaWVsZC4KLQkoUkVMU1opOiBDb3JyZWN0LgotCShSRUxPQ19CSVRTKik6IENvcnJlY3QuCi0JKEFMUEhBX1JfKik6IERlZmluZS4KLQkqIGVjb2ZmLmggKFJFTE9DX1NFQ1RJT05fe1hEQVRBLFBEQVRBLEZJTkksTElUQSxBQlN9KTogRGVmaW5lLgotCShyX2V4dGVybik6IFVuZGVmaW5lLgotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX3JlbG9jKTogTWFrZSByX3ZhZGRyIGJmZF92bWEgcmF0aGVyCi0JdGhhbiBsb25nLiAgQWRkIHJfZXh0ZXJuIGZpZWxkLgotCi0JKiBhbHBoYS5oIChQRFJfQklUUyopOiBEZWZpbmUuCi0JKiBzeW0uaCAoUERSKTogR2l2ZSBjb3JyZWN0IG5hbWVzIHRvIG5ldyBmaWVsZHMuCi0KLQkqIGVjb2ZmLmg6IE1vdmVkIE1JUFMgcmVsb2MgZGVmaW5pdGlvbnMgZnJvbSBoZXJlLi4uCi0JKiBtaXBzLmg6IHRvIGhlcmUuCi0KLVR1ZSBBdWcgIDMgMTE6MTc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbHBoYS5oOiBDb3JyZWN0ZWQgZXh0ZXJuYWwgc3ltYm9saWMgZGVidWdnaW5nIHN0cnVjdHVyZXMgdG8KLQltYXRjaCBhY3R1YWwgdXNhZ2UuCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9maWxlaGRyLCBpbnRlcm5hbF9hb3V0aGRyLAotCWludGVybmFsX3Njbmhkcik6IENoYW5nZWQgdHlwZSBvZiBzb21lIGZpZWxkcyB0byBiZmRfdm1hIHNvIHRoZXkKLQljYW4gaG9sZCA2NCBiaXRzLgotCSogc3ltLmggKEhEUlIsIEZEUiwgUERSLCBFWFRSKTogTGlrZXdpc2UuCi0JKFBEUik6IEFkZGVkIG5ldyBmaWVsZHMgZm91bmQgb24gQWxwaGEuCi0JKiBzeW1jb25zdC5oIChtYWdpY1N5bTIpOiBEZWZpbmU7IG5ldyB2YWx1ZSBmb3VuZCBvbiBBbHBoYS4KLQotCSogZWNvZmYuaDogTmV3IGZpbGUuCi0JKiBhbHBoYS5oLCBtaXBzLmg6IE1vdmVkIGNvbW1vbiBpbmZvcm1hdGlvbiBpbnRvIGVjb2ZmLmguICBNb3ZlZAotCWV4dGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbiBmcm9tIGVjb2ZmLWV4dC5oLgotCSogZWNvZmYtZXh0Lmg6IFJlbW92ZWQ7IGluZm9ybWF0aW9uIG5vdyBpbiBhbHBoYS5oIGFuZCBtaXBzLmguCi0KLVN1biBKdWwgMTggMjE6NDM6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IFJlY29nbml6ZSBJMzg2UFRYTUFHSUMuCi0KLUZyaSBKdWwgMTYgMDk6NTQ6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1JUFNfQU9VVF97T1p9TUFHSUMpOiBSZW5hbWVkIGZyb20ge09afU1BR0lDLgotCi1UaHUgSnVsIDE1IDEyOjIzOjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBNb3ZlIHhfZmNuIGJhY2sgaW5zaWRlIHhfZmNuYXJ5LgotCSh7R0VULFBVVH1fRkNOX3tMTk5PUFRSLEVORE5EWH0pOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVN1biBKdWwgMTEgMTg6MDA6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogRGVmaW5lIE1DNjhLQkNTTUFHSUMuCi0KLVRodSBKdW4gMTAgMTE6NDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKF9JTklULCBTVFlQX01JUFNfSU5JVCk6IERlZmluZSAodXNlZCBvbiBJcml4NCkuCi0JKFNUWVBfT1RIRVJfTE9BRCk6IERlZmluZSBhcyBTVFlQX01JUFNfSU5JVC4KLQotV2VkIEp1biAgOSAxNTowOTowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoT01BR0lDKTogRGVmaW5lLgotCi1Nb24gQXByIDI2IDE4OjA0OjQ3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oLCBzaC5oOiBTdXBwb3J0IGZvciBTSC4KLQotU2F0IEFwciAyNCAyMTozNDo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYTI5ay5oOiBEZWZpbmUgX0xJVC4KLQotRnJpIEFwciAyMyAxODo0MToyMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0KLVRodSBBcHIgIDggMTI6MzY6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChDX1NIQURPVywgQ19WRVJTSU9OKTogQ29waWVkIGluIGZyb20gbTg4ay5oLgotCSogbTg4ay5oLCBpMzg2LmgsIHdlMzJrLmg6IERvbid0IGRlZmluZSBhbGwgdGhlIHN0b3JhZ2UgY2xhc3NlczsKLQl0aGV5J3JlIGFscmVhZHkgaW4gaW50ZXJuYWwuaC4KLQotV2VkIEFwciAgNyAxMTo1MToyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIG5fc2NsYXNzIHRvIHVuc2lnbmVkIGNoYXIuCi0JQ2hhbmdlIENfRUZDTiB0byAweGZmLCBjaGFuZ2UgUlMvNjAwMCBkYnggc3ltYm9scwotCXRvIG5vIGxvbmdlciBiZSBzaWduZWQuCi0KLUZyaSBNYXIgMTkgMTQ6NTI6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IEFkZCBIOC81MDAgcmVsb2MgdHlwZXMuCi0KLVdlZCBNYXIgMTcgMDk6NDY6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaCAoQVVYX1BVVF9BTlkpOiBEb24ndCB1c2Ugdm9pZCB2YWx1ZXMgaW4gYnJhbmNoZXMgb2YKLQljb25kaXRpb25hbCBleHByZXNzaW9uLgotCi1UaHUgTWFyICA0IDE0OjEyOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0LmggKEFVWF9HRVRfKik6IFJld3JvdGUgdG8gdXNlIG5ldyBtYWNybyBBVVhfR0VUX0FOWS4KLQkoQVVYX1BVVF8qKTogTmV3IG1hY3JvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBVVhfR0VUIG1hY3Jvcy4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogQWRkZWQgcHJvdG90eXBlLgotCi0JKiBtaXBzLmggKE5fQlRNQVNLLCBOX1RNQVNLLCBOX0JUU0hGVCwgTl9UU0hJRlQpOiBEZWZpbmU7IHRoZXNlCi0JYXJlIG5lZWRlZCB0byBpbnRlcnByZXQgZ2NjIGRlYnVnZ2luZyBvdXRwdXQuCi0KLVR1ZSBGZWIgIDkgMDc6NDM6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3ZTMyay5oIChCVFlQRSwgSVNQVFIsIElTRkNOLCBJU0FSWSwgREVDUkVGKTogUmVtb3ZlZAotCW1vcmUgZGVmaW5pdGlvbnMgZHVwbGljYXRlZCBpbiBpbnRlcm5hbC5oLgotCi1XZWQgRmViICAzIDA5OjE4OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChSRUxPQ19CSVRTM19UWVBFXyopOiBDb3JyZWN0IGZvciBiaWcgZW5kaWFuIG1hY2hpbmVzLgotCi1Nb24gSmFuIDI1IDExOjM1OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfYW91dGhkcik6IEFkZGVkIGFkZGl0aW9uYWwgZmllbGRzIHVzZWQgb25seQotCWJ5IE1JUFMgRUNPRkYuCi0KLVRodSBKYW4gMjEgMTA6Mjg6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEFPVVRIRFIpOiBBZGRlZCBhZGRpdGlvbmFsIGZpZWxkcyB1c2VkIGJ5IEVDT0ZGLgotCi1UdWUgSmFuIDE5IDEyOjIxOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oLCB3ZTMyay5oIChOXyosIFRfKiwgRFRfKik6IFJlbW92ZWQgc3RpbGwgbW9yZSBkZWZpbml0aW9ucwotCWR1cGxpY2F0ZWQgaW4gaW50ZXJuYWwuaC4KLQotCSogbWlwcy5oIChSRUxPQ19TRUNUSU9OXyosIEVDT0ZGX1JfKik6IERlZmluZWQgY29uc3RhbnRzIGZvciBFQ09GRgotCXJlbG9jcy4KLQotRnJpIEphbiAxNSAxODoxNzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciBuZXcgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zLgotCShvcHRfZXh0KTogTmV3IHN0cnVjdHVyZS4KLQkqIG1pcHMuaCAoWk1BR0lDKTogRGVmaW5lZCB0byBiZSAwNDEzLgotCShfTElCKTogRGVmaW5lZCB0byBiZSAiLmxpYiIKLQkoZXh0ZXJuYWxfcmVsb2MpOiBNSVBTIEVDT0ZGIHJlbG9jcyBhcmUgb25seSA4IGJ5dGVzLiAgQWRkZWQKLQltYWNyb3MgdG8gYWlkIGluIHN3YXBwaW5nLgotCi1GcmkgSmFuICA4IDE2OjE5OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIEVDT0ZGIHN3YXBwaW5nIGZ1bmN0aW9ucy4KLQkqIGludGVybmFsLmggKGludGVybmFsX3Njbmhkcik6IEFsd2F5cyBwcm92aWRlIHNfYWxpZ24gZmllbGQsIG5vdAotCWp1c3Qgb24gaTk2MC4KLQkoaW50ZXJuYWxfcmVsb2MpOiBBbHdheXMgcHJvdmlkZSByX3NpemUgZmllbGQsIG5vdCBqdXN0IG9uCi0JUlMvNjAwMC4KLQkqIG1pcHMuaCAoX1JEQVRBLCBfU0RBVEEsIF9TQlNTLCBfTElUNCwgX0xJVDgsIFNUWVBfUkRBVEEsCi0JU1RZUF9TREFUQSwgU1RZUF9TQlNTLCBTVFlQX0xJVDQsIFNUWVBfTElUOCk6IERlZmluZWQuCi0JKENPREVfTUFTSywgTUlQU19JU19TVEFCLCBNSVBTX01BUktfU1RBQiwgTUlQU19VTk1BUktfU1RBQiwKLQlTVEFCU19TWU1CT0wpOiBNb3ZlZCBpbiBmcm9tIGdkYi9taXBzcmVhZC5jLgotCi1XZWQgSmFuICA2IDE0OjAxOjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oLCB3ZTMyay5oOiByZW1vdmVkIFNUWVBfKiBkZWZpbmVzLCBzaW5jZSB0aGV5IGR1cGxpY2F0ZWQKLQl0aG9zZSBpbiBpbnRlcm5hbC5oLgotCi1UdWUgRGVjIDI5IDE1OjQwOjA3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBkZWZpbmUgSTM4NkFJWE1BR0lDIGZvciBEYW5idXJ5IEFJWCBQUy8yIGNvbXBpbGVyLgotCi1TYXQgRGVjIDEyIDE2OjA3OjU3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBkb24ndCBkZWZpbmUgQlRZUEUsIElTUFRSLCBJU0ZDTiwgSVNBUlksIERFQ1JFRjogdGhleQotCWFyZSBkZWZpbmVkIGluIGludGVybmFsLmguCi0KLVRodSBOb3YgMTIgMDk6NTI6MDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IChpbnRlcm5hbF9yZWxvYyk6IHJfb2Zmc2V0IGlzIG5vdyBhIGxvbmcuCi0JKiB6OGsuaDogc2xpZ2h0IGNvbW1lbnQgZW5oYW5jZW1lbnQKLQotV2VkIFNlcCAzMCAwNzo0NjowOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogY2hhbmdlZCB6OGsgcmVsb2MgdHlwZXMKLQotRnJpIEF1ZyAyOCAxMDoxNjozMSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiB3ZTMyay5oOiBuZXcgZmlsZQotCi1UaHUgQXVnIDI3IDEzOjAwOjAxIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6IGNvbW1lbnQgb3V0IGNydWZ0IGF0IHRoZSBlbmQgb2YgI2VuZGlmCi0KLVR1ZSBBdWcgMjUgMTU6MDY6NDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IGFkZGVkICNkZWZpbmUgZm9yIFNUWVBfTElULCByZW1vdmVkIGZyb20gYTI5ayBhbmQKLQloODMwMC4KLQotCSogejhrLmg6IGFkZGVkIHo4MDAwIHN1cHBvcnQKLQotVGh1IEp1bCAxNiAxNjozMjowMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogYWRkZWQgUl9SRUxMT05HX05FRyByZWxvYyB0eXBlCi0KLUZyaSBKdW4gMTIgMjA6MTE6MDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6ICBGaXggdW50ZXJtaW5hdGVkIGNvbW1lbnQuCi0KLVdlZCBKdW4gMTAgMDc6NTc6NDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogYS5vdXQgbWFnaWMgbnVtYmVycyBmcm9tCi0JbW9ocmluZ0BpbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlCi0KLU1vbiBKdW4gIDggMjA6MTM6MzMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oLCBtaXBzLmg6ICBVc2UgdW5zaWduZWQgY2hhcnMgZXZlcnl3aGVyZS4KLQkoU3VnZ2VzdGVkIGJ5IEFudHRpIE1pZXR0aW5lbi4pCi0KLVR1ZSBBcHIgMTQgMTU6MTg6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bS5oOiAgQWRkIGNvbW1lbnRzLgotCSogc3ltY29uc3QuaDogIE1lcmdlIHdpdGggRnJlZCdzIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMTQgMTQ6MzA6MDUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6ICBQaWNrIHVwIFNHSSBkZWZpbmVzIGZvciBzdFN0cnVjdCwgc3RVbmlvbiwgc3RFbnVtLAotCWxhbmdDcGx1c3BsdXMsIGFuZCBsYW5nQ3BsdXNwbHVzVjIuCi0KLVRodSBBcHIgIDIgMTk6NDc6NDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bS5oLCBzeW1jb25zdC5oOiAgTUlQUyBoYXMgcHJvdmlkZWQgcmVkaXN0cmlidXRhYmxlIHZlcnNpb25zCi0Jb2YgdGhlc2UgZmlsZXMuICBUaGFua3MhCi0JKiBlY29mZi1leHQuaDogIEFkZCB3ZWFrZXh0IGJpdCB0byBtYXRjaCBuZXcgc3ltLmguCi0KLUZyaSBNYXIgIDYgMDA6MTA6NDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiAgQWRkIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMuCi0KLVRodSBGZWIgMjcgMTE6NTM6MDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiAgTmV3IGZpbGUgZm9yIGV4dGVybmFsIChpbi1maWxlKSBmb3JtIG9mIGVjb2ZmCi0Jc3ltYm9sIHN0cnVjdHVyZXMuCi0KLVRodSBGZWIgIDYgMTE6MzM6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IG1hZGUgdGhlIGV4dGVybmFsX2xpbmVubyBsX2xubm8gZmllbGQgNCBieXRlcyB3aWRlLgotCWFuZGRlZCBHRVQvUFVUX0xJTkVOT19MTk5PIG1hY3JvcwotCi1TYXQgTm92IDMwIDIwOjM4OjM1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBDaGFuZ2VMb2csIGEyOWsuaCwgaDgzMDAuaCwgaTM4Ni5oLCBpOTYwLmgsIGludGVybmFsLmgsIG02OGsuaCwKLQltODhrLmgsIG1pcHMuaCwgcnM2MDAwLmg6IG1vdmUgZnJvbSBhYm92ZSBjb2ZmLTxmb28+LmgKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2EyOWsuaCBiL2luY2x1ZGUvY29mZi9hMjlrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjM2E2NDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2EyOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKiBDT0ZGIHNwZWMgZm9yIEFNRCAyOTAqMCAKLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgQCBOZXcgWW9yayBVbml2ZXJzaXR5LgotICovCi0gCi0jaWZuZGVmIEFNRAotIyBkZWZpbmUgQU1ECi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0qKiBGaWxlIEhlYWRlciBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJICovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJICAgKi8KLQljaGFyIGZfdGltZGF0WzRdOyAgICAgICAvKiB0aW1lICYgZGF0ZSBzdGFtcAkgICAgKi8KLQljaGFyIGZfc3ltcHRyWzRdOyAgICAgICAvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiICAgICAgICovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMgICAgICovCi0JY2hhciBmX29wdGhkclsyXTsgICAgICAgLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJICovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIEZJTEhEUiAgc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUgRklMSFNaCTIwCi0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogTWFnaWMgbnVtYmVycyBmb3IgQW0yOTAwMCAKLSoqCShBVCZUIHdpbGwgYXNzaWduIHRoZSAicmVhbCIgbWFnaWMgbnVtYmVyKSAgCi0qLwotCi0jZGVmaW5lIFNJUEZCT01BR0lDICAgICAwNTcyICAgIC8qIEFtMjkwMDAgKEJ5dGUgMCBpcyBNU0IpICovCi0jZGVmaW5lIFNJUFJCT01BR0lDICAgICAwNTczICAgIC8qIEFtMjkwMDAgKEJ5dGUgMCBpcyBMU0IpICovCi0KLQotI2RlZmluZSBBMjlLX01BR0lDX0JJRyAJCVNJUEZCT01BR0lDCQotI2RlZmluZSBBMjlLX01BR0lDX0xJVFRMRQlTSVBSQk9NQUdJQwkKLSNkZWZpbmUgQTI5S0JBRE1BRyh4KSAJKCgoeCkuZl9tYWdpYyE9QTI5S19NQUdJQ19CSUcpICYmIFwKLQkJCSAgKCh4KS5mX21hZ2ljIT1BMjlLX01BR0lDX0xJVFRMRSkpCi0KLSNkZWZpbmUgT01BR0lDIEEyOUtfTUFHSUNfQklHCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIEZpbGUgaGVhZGVyIGZsYWdzIGN1cnJlbnRseSBrbm93biB0byB1cy4KLSoqCi0qKiBBbTI5MDAwIHdpbGwgdXNlIHRoZSBGX0FSMzJXUiBhbmQgRl9BUjMyVyBmbGFncyB0byBpbmRpY2F0ZQotKiogdGhlIGJ5dGUgb3JkZXJpbmcgaW4gdGhlIGZpbGUuCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIE9wdGlvbmFsIChhLm91dCkgaGVhZGVyIAotKi8KLQotdHlwZWRlZglzdHJ1Y3QgZXh0ZXJuYWxfYW91dGhkciAKLXsKLSAgY2hhciAgbWFnaWNbMl07CSAgICAgICAvKiB0eXBlIG9mIGZpbGUJCQkgKi8KLSAgY2hhciAgdnN0YW1wWzJdOwkgICAgICAvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhciAgdHNpemVbNF07CSAgICAgICAvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhciAgZHNpemVbNF07CSAgICAgICAvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIgIGJzaXplWzRdOwkgICAgICAgLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCSAgICAgKi8KLSAgY2hhciAgZW50cnlbNF07CSAgICAgICAvKiBlbnRyeSBwdC4JCQkgICAgKi8KLSAgY2hhciAgdGV4dF9zdGFydFs0XTsJICAvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgIGRhdGFfc3RhcnRbNF07CSAgLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfSBBT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyogYW91dGhkciBtYWdpYyBudW1iZXJzICovCi0jZGVmaW5lIE5NQUdJQwkJMDQxMAkvKiBzZXBhcmF0ZSBpL2QgZXhlY3V0YWJsZSAqLwotI2RlZmluZSBTSE1BR0lDCTA0MDYJCS8qIE5ZVS9VbHRyYTMgc2hhcmVkIGRhdGEgZXhlY3V0YWJsZSAKLQkJCQkgICAod3JpdGFibGUgdGV4dCkgKi8KLQotI2RlZmluZSBfRVRFWFQgICAJIl9ldGV4dCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBTZWN0aW9uIGhlYWRlciBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciAKLXsKLQljaGFyCSAgICBzX25hbWVbOF07ICAgICAgLyogc2VjdGlvbiBuYW1lCQkgKi8KLQljaGFyCSAgICBzX3BhZGRyWzRdOyAgICAgLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCSAgICBzX3ZhZGRyWzRdOyAgICAgLyogdmlydHVhbCBhZGRyZXNzCSAgICAgICovCi0JY2hhcgkgICAgc19zaXplWzRdOyAgICAgIC8qIHNlY3Rpb24gc2l6ZQkJICovCi0JY2hhcgkgICAgc19zY25wdHJbNF07ICAgIC8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkgICAgc19yZWxwdHJbNF07ICAgIC8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24gICAgICAgKi8KLQljaGFyCSAgICBzX2xubm9wdHJbNF07ICAgLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzICAgICAqLwotCWNoYXIJICAgIHNfbnJlbG9jWzJdOyAgICAvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JY2hhcgkgICAgc19ubG5ub1syXTsgICAgIC8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCSAgICBzX2ZsYWdzWzRdOyAgICAgLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0CWV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLSNkZWZpbmUgX0xJVAkiLmxpdCIKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBTZWN0aW9uIHR5cGVzIC0gd2l0aCBhZGRpdGlvbmFsIHNlY3Rpb24gdHlwZSBmb3IgZ2xvYmFsIAotKiogcmVnaXN0ZXJzIHdoaWNoIHdpbGwgYmUgcmVsb2NhdGFibGUgZm9yIHRoZSBBbTI5MDAwLgotKioKLSoqIEluIGluc3RhbmNlcyB3aGVyZSBpdCBpcyBuZWNlc3NhcnkgZm9yIGEgbGlua2VyIHRvIHByb2R1Y2UgYW4KLSoqIG91dHB1dCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRleHQgb3IgZGF0YSBub3QgYmFzZWQgYXQgdmlydHVhbAotKiogYWRkcmVzcyAwLCBlLmcuIGZvciBhIFJPTSwgdGhlbiB0aGUgbGlua2VyIHNob3VsZCBhY2NlcHQKLSoqIGFkZHJlc3MgYmFzZSBpbmZvcm1hdGlvbiBhcyBjb21tYW5kIGlucHV0IGFuZCB1c2UgUEFEIHNlY3Rpb25zCi0qKiB0byBza2lwIG92ZXIgdW51c2VkIGFkZHJlc3Nlcy4KLSovCi0KLSNkZWZpbmUJU1RZUF9CU1NSRUcJMHgxMjAwCS8qIEdsb2JhbCByZWdpc3RlciBhcmVhIChsaWtlIFNUWVBfSU5GTykgKi8KLSNkZWZpbmUgU1RZUF9FTlZJUgkweDIyMDAJLyogRW52aXJvbm1lbnQgKGxpa2UgU1RZUF9JTkZPKSAqLwotI2RlZmluZSBTVFlQX0FCUwkweDQwMDAJLyogQWJzb2x1dGUgKGFsbG9jYXRlZCwgbm90IHJlbG9jLCBsb2FkZWQpICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogUmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBkZWNsYXJhdGlvbiBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwkvKiAodmlydHVhbCkgYWRkcmVzcyBvZiByZWZlcmVuY2UgKi8KLSAgY2hhciByX3N5bW5keFs0XTsJLyogaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KLSAgY2hhciByX3R5cGVbMl07CS8qIHJlbG9jYXRpb24gdHlwZSAqLwotfTsKLQotI2RlZmluZQlSRUxPQwkJc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lCVJFTFNaCQkxMAkJLyogc2l6ZW9mIChSRUxPQykgKi8gCi0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogUmVsb2NhdGlvbiB0eXBlcyBmb3IgdGhlIEFtMjkwMDAgCi0qLwotCi0jZGVmaW5lCVJfQUJTCQkwCS8qIHJlZmVyZW5jZSBpcyBhYnNvbHV0ZSAqLwotIAotI2RlZmluZQlSX0lSRUwJCTAzMAkvKiBpbnN0cnVjdGlvbiByZWxhdGl2ZSAoam1wL2NhbGwpICovCi0jZGVmaW5lCVJfSUFCUwkJMDMxCS8qIGluc3RydWN0aW9uIGFic29sdXRlIChqbXAvY2FsbCkgKi8KLSNkZWZpbmUJUl9JTE9IQUxGCTAzMgkvKiBpbnN0cnVjdGlvbiBsb3cgaGFsZiAgKGNvbnN0KSAgKi8KLSNkZWZpbmUJUl9JSElIQUxGCTAzMwkvKiBpbnN0cnVjdGlvbiBoaWdoIGhhbGYgKGNvbnN0aCkgcGFydCAxICovCi0jZGVmaW5lCVJfSUhDT05TVAkwMzQJLyogaW5zdHJ1Y3Rpb24gaGlnaCBoYWxmIChjb25zdGgpIHBhcnQgMiAqLwotCQkJCS8qIGNvbnN0YW50IG9mZnNldCBvZiBSX0lISUhBTEYgcmVsb2NhdGlvbiAqLwotI2RlZmluZQlSX0JZVEUJCTAzNQkvKiByZWxvY2F0YWJsZSBieXRlIHZhbHVlICovCi0jZGVmaW5lIFJfSFdPUkQJCTAzNgkvKiByZWxvY2F0YWJsZSBoYWxmd29yZCB2YWx1ZSAqLwotI2RlZmluZSBSX1dPUkQJCTAzNwkvKiByZWxvY2F0YWJsZSB3b3JkIHZhbHVlICovCi0KLSNkZWZpbmUJUl9JR0xCTFJDCTA0MAkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkMgKi8KLSNkZWZpbmUJUl9JR0xCTFJBCTA0MQkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkEgKi8KLSNkZWZpbmUJUl9JR0xCTFJCCTA0MgkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkIgKi8KLSAKLS8qCi1OT1RFOgotQWxsIHRoZSAiSSIgZm9ybXMgcmVmZXIgdG8gMjkwMDAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIFRoZSBsaW5rZXIgaXMgCi1leHBlY3RlZCB0byBrbm93IGhvdyB0aGUgbnVtZXJpYyBpbmZvcm1hdGlvbiBpcyBzcGxpdCBhbmQvb3IgYWxpZ25lZAotd2l0aGluIHRoZSBpbnN0cnVjdGlvbiB3b3JkKHMpLiAgUl9CWVRFIHdvcmtzIGZvciBpbnN0cnVjdGlvbnMsIHRvby4KLQotSWYgdGhlIHBhcmFtZXRlciB0byBhIENPTlNUSCBpbnN0cnVjdGlvbiBpcyBhIHJlbG9jYXRhYmxlIHR5cGUsIHR3byAKLXJlbG9jYXRpb24gcmVjb3JkcyBhcmUgd3JpdHRlbi4gIFRoZSBmaXJzdCBoYXMgYW4gcl90eXBlIG9mIFJfSUhJSEFMRiAKLSgzMyBvY3RhbCkgYW5kIGEgbm9ybWFsIHJfdmFkZHIgYW5kIHJfc3ltbmR4LiAgVGhlIHNlY29uZCByZWxvY2F0aW9uIAotcmVjb3JkIGhhcyBhbiByX3R5cGUgb2YgUl9JSENPTlNUICgzNCBvY3RhbCksIGEgbm9ybWFsIHJfdmFkZHIgKHdoaWNoIAotaXMgcmVkdW5kYW50KSwgYW5kIGFuIHJfc3ltbmR4IGNvbnRhaW5pbmcgdGhlIDMyLWJpdCBjb25zdGFudCBvZmZzZXQgCi10byB0aGUgcmVsb2NhdGlvbiBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgc3ltYm9sIHRhYmxlIGluZGV4LiAgVGhpcyAKLXNlY29uZCByZWNvcmQgaXMgYWx3YXlzIHdyaXR0ZW4sIGV2ZW4gaWYgdGhlIGNvbnN0YW50IG9mZnNldCBpcyB6ZXJvLgotVGhlIGNvbnN0YW50IGZpZWxkcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHNldCB0byB6ZXJvLgotKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBMaW5lIG51bWJlciBlbnRyeSBkZWNsYXJhdGlvbiBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX2xpbmVubyAKLXsKLSAgIHVuaW9uIHsKLQkgY2hhciBsX3N5bW5keFs0XTsgLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JIGNoYXIgbF9wYWRkcls0XTsgIC8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlciAgICAqLwotICAgfSBsX2FkZHI7Ci0gICBjaGFyIGxfbG5ub1syXTsgCS8qIGxpbmUgbnVtYmVyCSAgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCQlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgkJNgkJLyogc2l6ZW9mIChMSU5FTk8pICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogU3ltYm9sIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi0jZGVmaW5lCUVfU1lNTk1MRU4JOAkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1ogCTE4Ci0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogU3RvcmFnZSBjbGFzcyBkZWZpbml0aW9ucyAtIG5ldyBjbGFzc2VzIGZvciBnbG9iYWwgcmVnaXN0ZXJzLgotKi8KLQotI2RlZmluZSBDX0dMQkxSRUcJMTkJCS8qIGdsb2JhbCByZWdpc3RlciAqLwotI2RlZmluZSBDX0VYVFJFRwkyMAkJLyogZXh0ZXJuYWwgZ2xvYmFsIHJlZ2lzdGVyICovCi0jZGVmaW5lCUNfREVGUkVHCTIxCQkvKiBleHQuIGRlZi4gb2YgZ2xvYmFsIHJlZ2lzdGVyICovCi0KLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBEZXJpdmVkIHN5bWJvbCBtYXNrL3NoaWZ0cy4KLSovCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX1RTSElGVAkoMikKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBBdXhpbGlhcnkgc3ltYm9sIHRhYmxlIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIAotKiogZGVmaW5pdGlvbnMuCi0qLwotCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQgICAgICAvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJICAqLwotI2RlZmluZSBFX0RJTU5VTSAgCTQgICAgICAgLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07ICAgICAgIC8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsgIC8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsgICAvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCSAgICAgICAvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOyAgICAgICAvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOyAgICAgICAvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOyAgICAgICAvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07ICAgICAvKiB0diByYW5nZSAqLwotCX0geF90djsJIC8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLX07Ci0KLSNkZWZpbmUJQVVYRU5UCQl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCQkxOAkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hbHBoYS5oIGIvaW5jbHVkZS9jb2ZmL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NmNiY2IuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyogRUNPRkYgc3VwcG9ydCBvbiBBbHBoYSBtYWNoaW5lcy4KLSAgIGNvZmYvZWNvZmYuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzIGZpbGUuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0gIHVuc2lnbmVkIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfc3ltcHRyWzhdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIE1hZ2ljIG51bWJlcnMgYXJlIGRlZmluZWQgaW4gY29mZi9lY29mZi5oLiAgKi8KLSNkZWZpbmUgQUxQSEFfRUNPRkZfQkFETUFHKHgpIFwKLSAgKCh4KS5mX21hZ2ljICE9IEFMUEhBX01BR0lDICYmICh4KS5mX21hZ2ljICE9IEFMUEhBX01BR0lDX0JTRCkKLQotLyogVGhlIG9iamVjdCB0eXBlIGlzIGVuY29kZWQgaW4gdGhlIGZfZmxhZ3MuICAqLwotI2RlZmluZSBGX0FMUEhBX09CSkVDVF9UWVBFX01BU0sJMHgzMDAwCi0jZGVmaW5lIEZfQUxQSEFfTk9fU0hBUkVECQkweDEwMDAKLSNkZWZpbmUgRl9BTFBIQV9TSEFSQUJMRQkJMHgyMDAwCi0jZGVmaW5lIEZfQUxQSEFfQ0FMTF9TSEFSRUQJCTB4MzAwMAotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjQKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IGV4dGVybmFsX2FvdXRoZHIKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgdW5zaWduZWQgY2hhciBibGRyZXZbMl07CS8qID8/ICovCi0gIHVuc2lnbmVkIGNoYXIgcGFkZGluZ1syXTsJLyogcGFkIHRvIHF1YWR3b3JkIGJvdW5kYXJ5CQkqLwotICB1bnNpZ25lZCBjaGFyCXRzaXplWzhdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMJCQkqLwotICB1bnNpZ25lZCBjaGFyCWRzaXplWzhdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIHVuc2lnbmVkIGNoYXIJYnNpemVbOF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcgllbnRyeVs4XTsJLyogZW50cnkgcHQuCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIgdGV4dF9zdGFydFs4XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFfc3RhcnRbOF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBic3Nfc3RhcnRbOF07CS8qIGJhc2Ugb2YgYnNzIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGdwcm1hc2tbNF07CS8qIGJpdG1hc2sgb2YgZ2VuZXJhbCByZWdpc3RlcnMgdXNlZCAqLwotICB1bnNpZ25lZCBjaGFyIGZwcm1hc2tbNF07CS8qIGJpdG1hc2sgb2YgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgKi8KLSAgdW5zaWduZWQgY2hhciBncF92YWx1ZVs4XTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCi19IEFPVVRIRFI7Ci0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0jZGVmaW5lIEFPVVRTWiA4MAotI2RlZmluZSBBT1VUSERSU1ogODAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0gIHVuc2lnbmVkIGNoYXIJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfcGFkZHJbOF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIHVuc2lnbmVkIGNoYXIJc192YWRkcls4XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2l6ZVs4XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3NjbnB0cls4XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzX3JlbHB0cls4XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICB1bnNpZ25lZCBjaGFyCXNfbG5ub3B0cls4XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGNoYXIJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIHVuc2lnbmVkIGNoYXIJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNjQKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIHVuc2lnbmVkIGNoYXIgcl92YWRkcls4XTsKLSAgdW5zaWduZWQgY2hhciByX3N5bW5keFs0XTsKLSAgdW5zaWduZWQgY2hhciByX2JpdHNbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0vKiBDb25zdGFudHMgdG8gdW5wYWNrIHRoZSByX2JpdHMgZmllbGQuICBUaGUgQWxwaGEgc2VlbXMgdG8gYWx3YXlzIGJlCi0gICBsaXR0bGUgZW5kaWFuLCBzbyBJIGhhdmVuJ3QgYm90aGVyZWQgdG8gZGVmaW5lIGJpZyBlbmRpYW4gdmFyaWFudHMKLSAgIG9mIHRoZXNlLiAgKi8KLQotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRQkJCTB4ZmYKLSNkZWZpbmUgUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUJCTAKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFCQkweDAxCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRQkJMHg3ZQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFCQkxCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfTElUVExFCQkweDgwCi0jZGVmaW5lIFJFTE9DX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRQkJNwotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9MSVRUTEUJCTB4ZmYKLSNkZWZpbmUgUkVMT0NfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUJMQotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9MSVRUTEUJCTB4MDMKLSNkZWZpbmUgUkVMT0NfQklUUzNfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUJOQotCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFCQkJMHhmYwotI2RlZmluZSBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRQkJMgotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZMT05HCQkxCi0jZGVmaW5lIEFMUEhBX1JfUkVGUVVBRAkJMgotI2RlZmluZSBBTFBIQV9SX0dQUkVMMzIJCTMKLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMCQk0Ci0jZGVmaW5lIEFMUEhBX1JfTElUVVNFCQk1Ci0jZGVmaW5lIEFMUEhBX1JfR1BESVNQCQk2Ci0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQk3Ci0jZGVmaW5lIEFMUEhBX1JfSElOVAkJOAotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJOQotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkgICAgICAgMTAKLSNkZWZpbmUgQUxQSEFfUl9TUkVMNjQJICAgICAgIDExCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFVTSAkgICAgICAgMTIKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRSAgICAgICAxMwotI2RlZmluZSBBTFBIQV9SX09QX1BTVUIJICAgICAgIDE0Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFJTSElGVCAgICAgMTUKLSNkZWZpbmUgQUxQSEFfUl9HUFZBTFVFCSAgICAgICAxNgotI2RlZmluZSBBTFBIQV9SX0dQUkVMSElHSCAgICAgIDE3Ci0jZGVmaW5lIEFMUEhBX1JfR1BSRUxMT1cgICAgICAgMTgKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRCAgICAgICAgICAxOQotCi0vKiBPdmVybG9hZGVkIHJlbG9jIHZhbHVlIHVzZWQgYnkgTmV0LSBhbmQgT3BlbkJTRC4gICovCi0jZGVmaW5lIEFMUEhBX1JfTElURVJBTFNMRUFaWSAgMTcKLQotLyogV2l0aCBBTFBIQV9SX0xJVFVTRSwgdGhlIHJfc2l6ZSBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0xVX0JBU0UgICAgICAgICAxCi0jZGVmaW5lIEFMUEhBX1JfTFVfQllUT0ZGICAgICAgIDIKLSNkZWZpbmUgQUxQSEFfUl9MVV9KU1IgICAgICAgICAgMwotCi0vKiBXaXRoIEFMUEhBX1JfSU1NRUQsIHRoZSByX3NpemUgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9HUF8xNiAgICAgMQotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0dQX0hJMzIgICAyCi0jZGVmaW5lIEFMUEhBX1JfSU1NRURfU0NOX0hJMzIgIDMKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9CUl9ISTMyICAgNAotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0xPMzIgICAgICA1Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTElDIElORk9STUFUSU9OICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlLiAgKi8KLQotLyogRUNPRkYgdXNlcyBDT0ZGLWxpa2Ugc2VjdGlvbiBzdHJ1Y3R1cmVzLCBidXQgaXRzIG93biBzeW1ib2wgZm9ybWF0LgotICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN5bWJvbCBmb3JtYXQgaW4gZmllbGRzIHdob3NlIHNpemUgYW5kIGFsaWdubWVudAotICAgd2lsbCBub3QgdmFyeSBvbiBkaWZmZXJlbnQgaG9zdCBzeXN0ZW1zLiAgKi8KLQotLyogRmlsZSBoZWFkZXIgYXMgYSBzZXQgb2YgYnl0ZXMgKi8KLQotc3RydWN0IGhkcl9leHQgewotCXVuc2lnbmVkIGNoYXIgCWhfbWFnaWNbMl07Ci0JdW5zaWduZWQgY2hhcgloX3ZzdGFtcFsyXTsKLQl1bnNpZ25lZCBjaGFyCWhfaWxpbmVNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lkbk1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXBkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3ltTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pb3B0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pYXV4TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc0V4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWZkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JEbk9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JQZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTeW1PZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiT3B0T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkF1eE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc09mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc0V4dE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JGZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JSZmRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRXh0T2Zmc2V0WzhdOwotfTsKLQotLyogRmlsZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZmRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglmX2Fkcls4XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVbOF07Ci0JdW5zaWduZWQgY2hhcglmX2NiU3NbOF07Ci0JdW5zaWduZWQgY2hhcglmX3Jzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXNzQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXN5bUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglmX2lsaW5lQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2xpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lvcHRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jb3B0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pcGRGaXJzdFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3BkWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pYXV4QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2F1eFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfcmZkQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMyWzNdOwotCXVuc2lnbmVkIGNoYXIJZl9wYWRkaW5nWzRdOwotfTsKLQotI2RlZmluZQlGRFJfQklUUzFfTEFOR19CSUcJCTB4RjgKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfQklHCQkzCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0xJVFRMRQkJMHgxRgotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUJMAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfQklHCQkweDA0Ci0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfTElUVExFCQkweDIwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fQklHCQkweDAyCi0jZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRQkweDQwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHCTB4MDEKLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFCTB4ODAKLQotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0JJRwkJMHhDMAotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0JJRwkJNgotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0xJVFRMRQkJMHgwMwotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRQkwCi0KLS8qIFdlIGlnbm9yZSB0aGUgYHJlc2VydmVkJyBmaWVsZCBpbiBiaXRzMi4gKi8KLQotLyogUHJvY2VkdXJlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBwZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXBfYWRyWzhdOwotCXVuc2lnbmVkIGNoYXIJcF9jYkxpbmVPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcglwX2lzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglwX2lsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5Mb3dbNF07Ci0JdW5zaWduZWQgY2hhcglwX2xuSGlnaFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZ3BfcHJvbG9ndWVbMV07Ci0JdW5zaWduZWQgY2hhcglwX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJcF9iaXRzMlsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfbG9jYWxvZmZbMV07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9wY3JlZ1syXTsKLX07Ci0KLSNkZWZpbmUgUERSX0JJVFMxX0dQX1VTRURfQklHCQkweDgwCi0jZGVmaW5lIFBEUl9CSVRTMV9SRUdfRlJBTUVfQklHCQkweDQwCi0jZGVmaW5lIFBEUl9CSVRTMV9QUk9GX0JJRwkJMHgyMAotI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfQklHCQkweDFmCi0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcJCTB4ZmYKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRwkwCi0KLSNkZWZpbmUgUERSX0JJVFMxX0dQX1VTRURfTElUVExFCTB4MDEKLSNkZWZpbmUgUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUJMHgwMgotI2RlZmluZSBQRFJfQklUUzFfUFJPRl9MSVRUTEUJCTB4MDQKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX0xJVFRMRQkweGY4Ci0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUJMwotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfTElUVExFCTB4ZmYKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFIDUKLQotLyogTGluZSBudW1iZXJzICovCi0KLXN0cnVjdCBsaW5lX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglsX2xpbmVbNF07Ci19OwotCi0vKiBTeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBzeW1fZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXNfdmFsdWVbOF07Ci0JdW5zaWduZWQgY2hhcglzX2lzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzM1sxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czRbMV07Ci19OwotCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9CSUcJCTB4RkMKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0JJRwkJMgotI2RlZmluZQlTWU1fQklUUzFfU1RfTElUVExFCQkweDNGCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9MSVRUTEUJCTAKLQotI2RlZmluZQlTWU1fQklUUzFfU0NfQklHCQkweDAzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRwkzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19MSVRUTEUJCTB4QzAKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xJVFRMRQkJNgotCi0jZGVmaW5lCVNZTV9CSVRTMl9TQ19CSUcJCTB4RTAKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0JJRwkJNQotI2RlZmluZQlTWU1fQklUUzJfU0NfTElUVExFCQkweDA3Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRQkyCi0KLSNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHgxMAotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfTElUVExFCTB4MDgKLQotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfQklHCQkweDBGCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRwkxNgotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfTElUVExFCQkweEYwCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUJNAotCi0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFCTEyCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGV4dF9leHQgewotCXN0cnVjdAlzeW1fZXh0IGVzX2FzeW07Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMyWzNdOwotCXVuc2lnbmVkIGNoYXIJZXNfaWZkWzRdOwotfTsKLQotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0JJRwkJMHg4MAotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0xJVFRMRQkJMHgwMQotCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRwkweDQwCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfQklHCQkweDIwCi0jZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRQkweDA0Ci0KLS8qIERlbnNlIG51bWJlcnMgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBkbnJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWRfcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZF9pbmRleFs0XTsKLX07Ci0KLS8qIFJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciAqLwotCi1zdHJ1Y3QgcmZkX2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIJcmZkWzRdOwotfTsKLQotLyogT3B0aW1pemVyIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IG9wdF9leHQgewotICB1bnNpZ25lZCBjaGFyIG9fYml0czFbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMlsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMzWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czRbMV07Ci0gIHN0cnVjdCBybmR4X2V4dCBvX3JuZHg7Ci0gIHVuc2lnbmVkIGNoYXIgb19vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRwkxNgotI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMAotCi0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFCTE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXBvbGxvLmggYi9pbmNsdWRlL2NvZmYvYXBvbGxvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMzQ3ZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2Fwb2xsby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgQXBvbGxvIE02OEsgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogTW90b3JvbGEgNjgwMDAvNjgwMDgvNjgwMTAvNjgwMjAgKi8KLSNkZWZpbmUJTUM2OE1BR0lDCTA1MjAKLSNkZWZpbmUgTUM2OEtXUk1BR0lDCTA1MjAJLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUJTUM2OFRWTUFHSUMJMDUyMQotI2RlZmluZSBNQzY4S1JPTUFHSUMJMDUyMQkvKiByZWFkb25seSBzaGFyZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZSBNQzY4S1BHTUFHSUMJMDUyMgkvKiBkZW1hbmQgcGFnZWQgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNNjhNQUdJQwkwMjEwCi0jZGVmaW5lCU02OFRWTUFHSUMJMDIxMQotCi0vKiBBcG9sbG8gNjgwMDAtYmFzZWQgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCBtYWdpYyBudW1iZXIuIFRoaXMgY29tZXMKLSAqIGZyb20gL3Vzci9pbmNsdWRlL2Fwb2xsby9maWxlaGRyLmgKLSAqLwotI2RlZmluZSBBUE9MTE9NNjhLTUFHSUMgMDYyNwotCi0jZGVmaW5lIE9NQUdJQyBNNjhNQUdJQwotI2RlZmluZSBNNjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1dSTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OFRWTUFHSUMpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1NQzY4S1JPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtQR01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OFRWTUFHSUMpICAmJiBcCi0gICgoeCkuZl9tYWdpYyE9QVBPTExPTTY4S01BR0lDKSApCi0KLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIJb19zcmlbNF07CQkvKiBBcG9sbG8gc3BlY2lmaWMgLSAuc3JpIGRhdGEgcG9pbnRlciAqLwotICBjaGFyICBvX2lubGliWzRdOwkJLyogQXBvbGxvIHNwZWNpZmljIC0gLmlubGliIGRhdGEgcG9pbnRlciAqLwotICBjaGFyCXZpZFs4XTsJCQkvKiBBcG9sbG8gc3BlY2lmaWMgLSA2NCBiaXQgdmVyc2lvbiBJRCAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZQlBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUiAxIC8qIHRoZSB2YWx1ZSBvZiB0aGUgYW91dGhkciBtYWdpYyAqLwotI2RlZmluZQlBT1VUSERSU1ogNDQKLSNkZWZpbmUgQU9VVFNaIDQ0Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQkvKiBBcG9sbG8gYWxsb3cgZm9yIGxhcmdlciBzZWN0aW9uIG5hbWVzIGJ5ICBhbGxvd2luZyBpdCB0byBiZSBpbgotCSAqIHRoZSBzdHJpbmcgdGFibGUuCi0JICovCi0JY2hhcgkJc19uYW1lWzhdOwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogSWYgc196ZW9yZXMgaXMgYWxsIHplcm9lcywgc19vZmZzZXQgZ2l2ZXMgdGhlIHJlYWwgbG9jYXRpb24gb2YgdGhlIG5hbWUKLSAqIGluIHRoZSBzdHJpbmcgdGFibGUuCi0gKi8KLQotI2RlZmluZQlzX3plcm9lcyBzZWN0aW9uX25hbWUuc19uYW1lCi0jZGVmaW5lCXNfb2Zmc2V0IChzZWN0aW9uX25hbWUuc19uYW1lKzQpCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1RWCSIudHYiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotI2RlZmluZQlfTElORVMJIi5saW5lcyIKLSNkZWZpbmUJX0JMT0NLUwkiLmJsb2NrcyIKLSNkZWZpbmUgX1NSSSAgICAiLnNyaSIgICAgICAgICAgICAgICAgICAvKiBTdGF0aWMgUmVzb3VyY2UgSW5mb3JtYXRpb24gKHN5c3R5cGUsCi0gZXQgYWwuKSAqLwotI2RlZmluZSBfTUlSICAgICIubWlyIiAgICAgICAgICAgICAgICAgIC8qIE1vZHVsZSBJbmZvcm1hdGlvbiBSZWNvcmRzICAqLwotI2RlZmluZSBfQVBUViAgICIuYXB0diIgICAgICAgICAgICAgICAgIC8qIEFwb2xsby1zdHlsZSB0cmFuc2ZlciB2ZWN0b3JzLiAqLwotI2RlZmluZSBfSU5MSUIgICIuaW5saWIiICAgICAgICAgICAgICAgIC8qIFNoYXJlZCBMaWJyYXJ5IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIF9SV0RJICAgIi5yd2RpIiAgICAgICAgIC8qIFJlYWQvd3JpdGUgZGF0YSBpbml0aWFsaXphdGlvbiBkaXJlY3RpdmVzIGZvcgotIGNvbXByZXNzZWQgc2VjdGlvbnMgKi8KLSNkZWZpbmUgX1VOV0lORCAiLnVud2luZCIgICAgICAgICAgICAgICAvKiBTdGFjayB1bndpbmQgaW5mb3JtYXRpb24gKi8KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0gIGNoYXIgcl9vZmZzZXRbNF07Ci0jZW5kaWYKLQotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotCi0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotI2RlZmluZSBSRUxTWiAxNAotI2Vsc2UKLSNkZWZpbmUgUkVMU1ogMTAKLSNlbmRpZgotCi0vKiBBcG9sbG8gc3BlY2lmaWMgU1RZUCBmbGFncyAqLwotCi0jZGVmaW5lIFNUWVBfUkVMT0NBVEVEX05PVF9MT0FERUQgMHgwMDAxMDAwMAkvKiBTZWN0aW9uIGlzIHJlbG9jYXRlZCBub3JtYWxseSBkdXJpbmcgbGlua2luZywgYnV0IG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIG5vdCBiZSBsb2FkZWQgZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uICovCi0jZGVmaW5lIFNUWVBfREVCVUcgICAgICAgICAgICAgIDB4MDAwMjAwMDAJLyogZGVidWcgc2VjdGlvbiAqLwotI2RlZmluZSBTVFlQX09WRVJMQVkJCTB4MDAwNDAwMDAJLyogU2VjdGlvbiBpcyBvdmVybGF5ZWQgKi8KLSNkZWZpbmUgU1RZUF9JTlNUUlVDVElPTiAgICAJMHgwMDIwMDAwMAkvKiBTZWN0aW9uIGNvbnRhaW5zIGV4ZWN1dGFibGUgY29kZSAqLwotCi0jZGVmaW5lIFNUWVBfWkVSTwkJMHgwMDgwMDAwMAkvKiBTZWN0aW9uIGlzIGluaXRpYWxpemVkIHRvIHplcm8gKi8KLSNkZWZpbmUgU1RZUF9JTlNUQUxMRUQJCTB4MDIwMDAwMDAJLyogU2VjdGlvbiBzaG91bGQgYmUgaW5zdGFsbGFibGUgaW4gS0dUICovCi0jZGVmaW5lIFNUWVBfTE9PS19JTlNUQUxMRUQJMHgwNDAwMDAwMAkvKiBMb29rIGZvciBzZWN0aW9uIGluIEtHVCAqLwotI2RlZmluZSBTVFlQX1NFQ0FMSUdOMQkJMHgwODAwMDAwMAkvKiBTcGVjaWFsbHkgYWxpZ25lZCBzZWN0aW9uICovCi0jZGVmaW5lIFNUWVBfU0VDQUxJR04yCQkweDEwMDAwMDAwCS8qICAgICAgIiAgICAgICAiICAgICAgICIgICAgKi8KLSNkZWZpbmUgU1RZUF9DT01QUkVTU0VECQkweDIwMDAwMDAwCS8qIE5vIHNlY3Rpb24gZGF0YSBwZXIgc2UgKHNfc2NucHRyID0gMCksIGJ1dCB0aGVyZSBhcmUKLQkJCQkJCSAgIGluaXRpYWxpemF0aW9uIGRpcmVjdGl2ZXMgZm9yIGl0IGluIC5yd2RpIHNlY3Rpb24KLQkJCQkJCSAgICh1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU1RZUF9CU1MpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXJtLmggYi9pbmNsdWRlL2NvZmYvYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTYzZjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2FybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qIEFSTSBDT0ZGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIENPRkZBUk0gMQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICogICAgICBGX0lOVEVSV09SSyAgICAgZmlsZSBzdXBwb3J0cyBzd2l0Y2hpbmcgYmV0d2VlbiBBUk0gYW5kIFRodW1iIGluc3RydWN0aW9uIHNldHMKLSAqICAgICAgRl9JTlRFUldPUktfU0VUIHRoZSBGX0lOVEVSV09SSyBiaXQgaXMgdmFsaWQKLSAqCUZfQVBDU19GTE9BVAljb2RlIHBhc3NlcyBmbG9hdCBhcmd1bWVudHMgaW4gZmxvYXQgcmVnaXN0ZXJzCi0gKglGX1BJQwkJY29kZSBpcyByZWVudHJhbnQvcG9zaXRpb24taW5kZXBlbmRlbnQKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICoJRl9BUENTXzI2CWZpbGUgdXNlcyAyNiBiaXQgQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkCi0gKglGX0FQQ1NfU0VUCXRoZSBGX0FQQ1NfMjYsIEZfQVBDU19GTE9BVCBhbmQgRl9QSUMgYml0cyBoYXZlIGJlZW4gaW5pdGlhbGlzZWQKLSAqCUZfU09GVF9GTE9BVAljb2RlIGRvZXMgbm90IHVzZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotI2RlZmluZSBGX0lOVEVSV09SSwkoMHgwMDEwKQotI2RlZmluZSBGX0lOVEVSV09SS19TRVQJKDB4MDAyMCkKLSNkZWZpbmUgRl9BUENTX0ZMT0FUCSgweDAwNDApCi0jdW5kZWYgIEZfQVIxNldSCi0jZGVmaW5lIEZfUElDCQkoMHgwMDgwKQotI2RlZmluZQlGX0FSMzJXUgkoMHgwMTAwKQotI2RlZmluZSBGX0FQQ1NfMjYJKDB4MDQwMCkKLSNkZWZpbmUgRl9BUENTX1NFVAkoMHgwODAwKQotI2RlZmluZSBGX1NPRlRfRkxPQVQJKDB4MjAwMCkKLQotLyogQml0cyBzdG9yZWQgaW4gZmxhZ3MgZmllbGQgb2YgdGhlIGludGVybmFsX2Ygc3RydWN0dXJlICovCi0KLSNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKLSNkZWZpbmUgRl9BUENTX0ZMT0FUCSgweDAwNDApCi0jZGVmaW5lIEZfUElDCQkoMHgwMDgwKQotI2RlZmluZSBGX0FQQ1MyNgkoMHgxMDAwKQotI2RlZmluZSBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSyAoMHg0MDAwKzB4MDgwMCsweDA0MDApCi0jZGVmaW5lIEZfQVJNXzIJCSgweDA0MDApCi0jZGVmaW5lIEZfQVJNXzJhCSgweDA4MDApCi0jZGVmaW5lIEZfQVJNXzMJCSgweDBjMDApCi0jZGVmaW5lIEZfQVJNXzNNCSgweDQwMDApCi0jZGVmaW5lIEZfQVJNXzQJCSgweDQ0MDApCi0jZGVmaW5lIEZfQVJNXzRUCSgweDQ4MDApCi0jZGVmaW5lIEZfQVJNXzUJCSgweDRjMDApCi0KLS8qCi0gKiBBUk1NQUdJQyBvdWdodCB0byBlbmNvZGVkIHRoZSBwcm9jZXNvciB0eXBlLAotICogYnV0IGl0IGlzIHRvbyBsYXRlIHRvIGNoYW5nZSBpdCBub3csIGluc3RlYWQKLSAqIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUKLSAqIGlzIHVzZWQgYXMgc2hvd24gYWJvdmUuCi0gKgotICogWFhYIC0gTkMgNS82Lzk3Ci0gKi8KLQotI2RlZmluZQlBUk1NQUdJQwkweGEwMCAgLyogSSBqdXN0IG1hZGUgdGhpcyB1cCAqLyAKLQotI2RlZmluZSBBUk1CQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBBUk1NQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0KLS8qIGRlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzICovCi0vKiAgI2RlZmluZSBOVF9JTUFHRV9CQVNFICAgICAgICAweDQwMDAwMCBtb3ZlZCB0byBpbnRlcm5hbC5oICovCi0jZGVmaW5lIE5UX1NFQ1RJT05fQUxJR05NRU5UIDB4MTAwMAotI2RlZmluZSBOVF9GSUxFX0FMSUdOTUVOVCAgICAweDIwMCAgCi0jZGVmaW5lIE5UX0RFRl9SRVNFUlZFICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE5UX0RFRl9DT01NSVQgICAgICAgIDB4MTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGV4dGVybmFsX3NjbmhkcgotewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKiBXZSB1c2UgdGhlIC5yZGF0YSBzZWN0aW9uIHRvIGhvbGQgcmVhZCBvbmx5IGRhdGEuICAqLwotI2RlZmluZSBfTElUCSIucmRhdGEiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubwotewotCXVuaW9uCi0JewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudAotewotCXN0cnVjdAotCXsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbgotCQl7Ci0JCQlzdHJ1Y3QKLQkJCXsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uCi0JCXsKLQkJCXN0cnVjdCAJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCXsKLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgCQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQl7Ci0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uCi0JewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdAotCQl7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QKLQl7Ci0JCWNoYXIgeF9zY25sZW5bNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JCWNoYXIgeF9jaGVja3N1bVs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLQkJY2hhciB4X2Fzc29jaWF0ZWRbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLQkJY2hhciB4X2NvbWRhdFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdAotCXsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0jZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGV4dGVybmFsX3JlbG9jCi17Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2F1eC1jb2ZmLmggYi9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5YzEyNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIE1vZGlmaWNhdGlvbnMgb2YgaW50ZXJuYWwuaCBhbmQgbTY4ay5oIG5lZWRlZCBieSBBL1VYCi0gICBTdWdnZXN0ZWQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+ICovCi0KLSNpZm5kZWYgR05VX0NPRkZfQVVYX0gKLSNkZWZpbmUgR05VX0NPRkZfQVVYX0ggMQotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIDY0LWJ5dGUgcGFkZGVkIHBhdGhuYW1lcyBvZiBzaGFyZWQgbGlicmFyaWVzICovCi0jdW5kZWYgU1RZUF9MSUIKLSNkZWZpbmUgU1RZUF9MSUIgMHgyMDAKLQotLyogU2VjdGlvbiBjb250YWlucyBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbiBjb2RlICovCi0jdW5kZWYgU1RZUF9JTklUCi0jZGVmaW5lIFNUWVBfSU5JVCAweDQwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIC5pZGVudCBpbmZvcm1hdGlvbiAqLwotI3VuZGVmIFNUWVBfSURFTlQKLSNkZWZpbmUgU1RZUF9JREVOVCAweDgwMAotCi0vKiBTZWN0aW9uIHR5cGVzIHVzZWQgYnkgYmZkIGFuZCBnYXMgbm90IGRlZmluZWQgKGRpcmVjdGx5KSBieSBBL1VYICovCi0jdW5kZWYgU1RZUF9PVkVSCi0jZGVmaW5lIFNUWVBfT1ZFUiAwCi0jdW5kZWYgU1RZUF9JTkZPCi0jZGVmaW5lIFNUWVBfSU5GTyBTVFlQX0lERU5UCi0KLS8qIFRyYWRpdGlvbmFsIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGFnZ2VkIHdpdGggU1RZUF9MSUIgKi8KLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotI2VuZGlmIC8qIEdOVV9DT0ZGX0FVWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvZWNvZmYuaCBiL2luY2x1ZGUvY29mZi9lY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQyMDJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9lY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLSNpZm5kZWYgRUNPRkZfSAotI2RlZmluZSBFQ09GRl9ICi0KLS8qIEdlbmVyaWMgRUNPRkYgc3VwcG9ydC4KLSAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzeW1ib2wgaW5mb3JtYXRpb24sIGZvdW5kIGluIHN5bS5oIGFuZAotICAgc3ltY29uc3QuaC4gICovCi0KLS8qIE1pcHMgbWFnaWMgbnVtYmVycyB1c2VkIGluIGZpbGVoZHIuICBNSVBTX01BR0lDX0xJVFRMRSBpcyB1c2VkIG9uCi0gICBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLiAgTUlQU19NQUdJQ19CSUcgaXMgdXNlZCBvbiBiaWcgZW5kaWFuCi0gICBtYWNoaW5lcy4gIFdoZXJlIGlzIE1JUFNfTUFHSUNfMSBmcm9tPyAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ18xIDB4MDE4MAotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRSAweDAxNjIKLSNkZWZpbmUgTUlQU19NQUdJQ19CSUcgMHgwMTYwCi0KLS8qIFRoZXNlIGFyZSB0aGUgbWFnaWMgbnVtYmVycyB1c2VkIGZvciBNSVBTIGNvZGUgY29tcGlsZWQgYXQgSVNBCi0gICBsZXZlbCAyLiAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUyIDB4MDE2NgotI2RlZmluZSBNSVBTX01BR0lDX0JJRzIgMHgwMTYzCi0KLS8qIFRoZXNlIGFyZSB0aGUgbWFnaWMgbnVtYmVycyB1c2VkIGZvciBNSVBTIGNvZGUgY29tcGlsZWQgYXQgSVNBCi0gICBsZXZlbCAzLiAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUzIDB4MTQyCi0jZGVmaW5lIE1JUFNfTUFHSUNfQklHMyAweDE0MAotCi0vKiBBbHBoYSBtYWdpYyBudW1iZXJzIHVzZWQgaW4gZmlsZWhkci4gICovCi0jZGVmaW5lIEFMUEhBX01BR0lDIDB4MTgzCi0jZGVmaW5lIEFMUEhBX01BR0lDX0JTRCAweDE4NQotCi0vKiBNYWdpYyBudW1iZXJzIHVzZWQgaW4gYS5vdXQgaGVhZGVyLiAgKi8KLSNkZWZpbmUgRUNPRkZfQU9VVF9PTUFHSUMgMDQwNwkvKiBub3QgZGVtYW5kIHBhZ2VkIChsZCAtTikuICAqLwotI2RlZmluZSBFQ09GRl9BT1VUX1pNQUdJQyAwNDEzCS8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotCi0vKiBOYW1lcyBvZiBzcGVjaWFsIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgX1RFWFQgICAiLnRleHQiCi0jZGVmaW5lIF9EQVRBICAgIi5kYXRhIgotI2RlZmluZSBfQlNTICAgICIuYnNzIgotI2RlZmluZSBfUkRBVEEJIi5yZGF0YSIKLSNkZWZpbmUgX1NEQVRBCSIuc2RhdGEiCi0jZGVmaW5lIF9TQlNTCSIuc2JzcyIKLSNkZWZpbmUgX0xJVEEJIi5saXRhIgotI2RlZmluZSBfTElUNAkiLmxpdDQiCi0jZGVmaW5lIF9MSVQ4CSIubGl0OCIKLSNkZWZpbmUgX0xJQgkiLmxpYiIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0jZGVmaW5lIF9QREFUQQkiLnBkYXRhIgotI2RlZmluZSBfWERBVEEJIi54ZGF0YSIKLSNkZWZpbmUgX0dPVAkiLmdvdCIKLSNkZWZpbmUgX0hBU0gJIi5oYXNoIgotI2RlZmluZSBfRFlOU1lNCSIuZHluc3ltIgotI2RlZmluZSBfRFlOU1RSCSIuZHluc3RyIgotI2RlZmluZSBfUkVMRFlOCSIucmVsLmR5biIKLSNkZWZpbmUgX0NPTkZMSUMgIi5jb25mbGljIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUJMSVNUICIubGlibGlzdCIKLSNkZWZpbmUgX0RZTkFNSUMgIi5keW5hbWljIgotI2RlZmluZSBfUkNPTlNUCSIucmNvbnN0IgotCi0vKiBFQ09GRiB1c2VzIHNvbWUgYWRkaXRpb25hbCBzZWN0aW9uIGZsYWdzLiAgKi8KLSNkZWZpbmUgU1RZUF9SREFUQQkgICAgIDB4MTAwCi0jZGVmaW5lIFNUWVBfU0RBVEEJICAgICAweDIwMAotI2RlZmluZSBTVFlQX1NCU1MJICAgICAweDQwMAotI2RlZmluZSBTVFlQX0dPVAkgICAgMHgxMDAwCi0jZGVmaW5lIFNUWVBfRFlOQU1JQwkgICAgMHgyMDAwCi0jZGVmaW5lIFNUWVBfRFlOU1lNCSAgICAweDQwMDAKLSNkZWZpbmUgU1RZUF9SRUxEWU4JICAgIDB4ODAwMAotI2RlZmluZSBTVFlQX0RZTlNUUgkgICAweDEwMDAwCi0jZGVmaW5lIFNUWVBfSEFTSAkgICAweDIwMDAwCi0jZGVmaW5lIFNUWVBfTElCTElTVAkgICAweDQwMDAwCi0jZGVmaW5lIFNUWVBfQ09ORkxJQwkgIDB4MTAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfRklOSQkgMHgxMDAwMDAwCi0jZGVmaW5lIFNUWVBfRVhURU5ERVNDCSAweDIwMDAwMDAgLyogMHgwMkZGRjAwMCBiaXRzID0+IHNjbiB0eXBlLCByZXN0IGNsciAqLwotI2RlZmluZSBTVFlQX0xJVEEJIDB4NDAwMDAwMAotI2RlZmluZSBTVFlQX0xJVDgJIDB4ODAwMDAwMAotI2RlZmluZSBTVFlQX0xJVDQJMHgxMDAwMDAwMAotI2RlZmluZSBTVFlQX0VDT0ZGX0xJQgkweDQwMDAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfSU5JVCAweDgwMDAwMDAwCi0jZGVmaW5lIFNUWVBfT1RIRVJfTE9BRCAoU1RZUF9FQ09GRl9JTklUIHwgU1RZUF9FQ09GRl9GSU5JKQotCi0vKiBleHRlbmRlZCBzZWN0aW9uIHR5cGVzICovCi0jZGVmaW5lIFNUWVBfQ09NTUVOVAkgMHgyMTAwMDAwCi0jZGVmaW5lIFNUWVBfUkNPTlNUCSAweDIyMDAwMDAKLSNkZWZpbmUgU1RZUF9YREFUQQkgMHgyNDAwMDAwCi0jZGVmaW5lIFNUWVBfUERBVEEJIDB4MjgwMDAwMAotCi0vKiBUaGUgbGlua2VyIG5lZWRzIGEgc2VjdGlvbiB0byBob2xkIHNtYWxsIGNvbW1vbiB2YXJpYWJsZXMgd2hpbGUKLSAgIGxpbmtpbmcuICBUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBjcmVhdGUgaXQgd2hlbiB0aGUgbGlua2VyCi0gICBuZWVkcyBpdCwgc28gd2UgYWx3YXlzIGNyZWF0ZSBvbmUgZm9yIGVhY2ggQkZELiAgV2UgdGhlbiBhdm9pZAotICAgd3JpdGluZyBpdCBvdXQuICAqLwotI2RlZmluZSBTQ09NTU9OICIuc2NvbW1vbiIKLQotLyogSWYgdGhlIGV4dGVybiBiaXQgaW4gYSByZWxvYyBpcyAxLCB0aGVuIHJfc3ltbmR4IGlzIGFuIGluZGV4IGludG8KLSAgIHRoZSBleHRlcm5hbCBzeW1ib2wgdGFibGUuICBJZiB0aGUgZXh0ZXJuIGJpdCBpcyAwLCB0aGVuIHJfc3ltbmR4Ci0gICBpbmRpY2F0ZXMgYSBzZWN0aW9uLCBhbmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9OT05FCTAKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9URVhUCTEKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9SREFUQQkyCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fREFUQQkzCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fU0RBVEEJNAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1NCU1MJNQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0JTUwk2Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fSU5JVAk3Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUOAk4Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUNAk5Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fWERBVEEgICAgMTAKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9QREFUQSAgICAxMQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0ZJTkkgICAgIDEyCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUQSAgICAgMTMKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9BQlMgICAgICAxNAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1JDT05TVCAgIDE1Ci0KLSNkZWZpbmUgTlVNX1JFTE9DX1NFQ1RJT05TICAgICAxNgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTVEFCUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBnY2MgdXNlcyBtaXBzLXRmaWxlIHRvIG91dHB1dCB0eXBlIGluZm9ybWF0aW9uIGluIHNwZWNpYWwgc3RhYnMKLSAgIGVudHJpZXMuICBUaGVzZSBtdXN0IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluaXRpb24gaW4KLSAgIGdjYy9jb25maWcvbWlwcy5oLiAgQXQgc29tZSBwb2ludCwgdGhlc2Ugc2hvdWxkIHByb2JhYmx5IGdvIGludG8gYQotICAgc2hhcmVkIGluY2x1ZGUgZmlsZSwgYnV0IGN1cnJlbnRseSBnY2MgYW5kIGdkYiBkbyBub3Qgc2hhcmUgYW55Ci0gICBkaXJlY3Rvcmllcy4gKi8KLSNkZWZpbmUgQ09ERV9NQVNLIDB4OEYzMDAKLSNkZWZpbmUgRUNPRkZfSVNfU1RBQihzeW0pICgoKHN5bSktPmluZGV4ICYgMHhGRkYwMCkgPT0gQ09ERV9NQVNLKQotI2RlZmluZSBFQ09GRl9NQVJLX1NUQUIoY29kZSkgKChjb2RlKStDT0RFX01BU0spCi0jZGVmaW5lIEVDT0ZGX1VOTUFSS19TVEFCKGNvZGUpICgoY29kZSktQ09ERV9NQVNLKQotI2RlZmluZSBTVEFCU19TWU1CT0wgIkBzdGFicyIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQ09GRiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBnY2MgYWxzbyB1c2VzIG1pcHMtdGZpbGUgdG8gb3V0cHV0IENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgaXQgdXNlcyB3aGVuIG91dHB1dHRpbmcgdGhlIC50eXBlIGRpcmVjdGl2ZS4KLSAgIFRoZXNlIHNob3VsZCBhbHNvIGJlIGluIGEgc2hhcmVkIGluY2x1ZGUgZmlsZS4gICovCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQVVYICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBhdXhpbGlhcnkgdHlwZSBpbmZvcm1hdGlvbiBpcyB0aGUgc2FtZSBvbiBhbGwga25vd24gRUNPRkYKLSAgIHRhcmdldHMuICBJIGNhbid0IHNlZSBhbnkgcmVhc29uIHRoYXQgaXQgd291bGQgZXZlciBjaGFuZ2UsIHNvIEkgYW0KLSAgIGdvaW5nIHRvIGdhbWJsZSBhbmQgZGVmaW5lIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmVzIGhlcmUsIGluIHRoZQotICAgdGFyZ2V0IGluZGVwZW5kZW50IEVDT0ZGIGhlYWRlciBmaWxlLiAgVGhlIGludGVybmFsIGZvcm1zIGFyZQotICAgZGVmaW5lZCBpbiBjb2ZmL3N5bS5oLCB3aGljaCB3YXMgb3JpZ2luYWxseSBkb25hdGVkIGJ5IE1JUFMKLSAgIENvbXB1dGVyIFN5c3RlbXMuICAqLwotCi0vKiBUeXBlIGluZm9ybWF0aW9uIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgdGlyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcgl0X2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTQ1WzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTAxWzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTIzWzFdOwotfTsKLQotI2RlZmluZQlUSVJfQklUUzFfRkJJVEZJRUxEX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4ODApCi0jZGVmaW5lCVRJUl9CSVRTMV9GQklURklFTERfTElUVExFCSgodW5zaWduZWQgaW50KSAweDAxKQotCi0jZGVmaW5lCVRJUl9CSVRTMV9DT05USU5VRURfQklHCQkoKHVuc2lnbmVkIGludCkgMHg0MCkKLSNkZWZpbmUJVElSX0JJVFMxX0NPTlRJTlVFRF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDIpCi0KLSNkZWZpbmUJVElSX0JJVFMxX0JUX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4M0YpCi0jZGVmaW5lCVRJUl9CSVRTMV9CVF9TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFMxX0JUX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RkMpCi0jZGVmaW5lCVRJUl9CSVRTMV9CVF9TSF9MSVRUTEUJCTIKLQotI2RlZmluZQlUSVJfQklUU19UUTRfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFE0X1NIX0JJRwkJNAotI2RlZmluZQlUSVJfQklUU19UUTVfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFE1X1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUU19UUTRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFE0X1NIX0xJVFRMRQkJMAotI2RlZmluZQlUSVJfQklUU19UUTVfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFE1X1NIX0xJVFRMRQkJNAotCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTBfU0hfQklHCQk0Ci0jZGVmaW5lCVRJUl9CSVRTX1RRMV9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTFfU0hfQklHCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTBfU0hfTElUVExFCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTFfU0hfTElUVExFCQk0Ci0KLSNkZWZpbmUJVElSX0JJVFNfVFEyX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMl9TSF9CSUcJCTQKLSNkZWZpbmUJVElSX0JJVFNfVFEzX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRM19TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEyX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMl9TSF9MSVRUTEUJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEzX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRM19TSF9MSVRUTEUJCTQKLQotLyogUmVsYXRpdmUgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgcm5keF9leHQgewotCXVuc2lnbmVkIGNoYXIJcl9iaXRzWzRdOwotfTsKLQotI2RlZmluZQlSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0JJRwk0Ci0jZGVmaW5lCVJORFhfQklUUzFfUkZEX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVJORFhfQklUUzFfUkZEX1NIX0JJRwkJNAotCi0jZGVmaW5lCVJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFCTAKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUJOAotCi0jZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRwkxNgotI2RlZmluZQlSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwkwCi0KLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX1NIX0xJVFRMRQk0Ci0jZGVmaW5lCVJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9MSVRUTEUJNAotI2RlZmluZQlSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTEyCi0KLS8qIEF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24gZXh0ZXJuYWwgcmVjb3JkICovCi0KLXVuaW9uIGF1eF9leHQgewotCXN0cnVjdCB0aXJfZXh0CWFfdGk7Ci0Jc3RydWN0IHJuZHhfZXh0CWFfcm5keDsKLQl1bnNpZ25lZCBjaGFyCWFfZG5Mb3dbNF07Ci0JdW5zaWduZWQgY2hhcglhX2RuSGlnaFs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfaXN5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfaXNzWzRdOwotCXVuc2lnbmVkIGNoYXIJYV93aWR0aFs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfY291bnRbNF07Ci19OwotCi0jZGVmaW5lIEFVWF9HRVRfQU5ZKGJpZ2VuZCwgYXgsIGZpZWxkKSBcCi0gICgoYmlnZW5kKSA/IGJmZF9nZXRiMzIgKChheCktPmZpZWxkKSA6IGJmZF9nZXRsMzIgKChheCktPmZpZWxkKSkKLQotI2RlZmluZQlBVVhfR0VUX0ROTE9XKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9kbkxvdykKLSNkZWZpbmUJQVVYX0dFVF9ETkhJR0goYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2RuSGlnaCkKLSNkZWZpbmUJQVVYX0dFVF9JU1lNKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9pc3ltKQotI2RlZmluZSBBVVhfR0VUX0lTUyhiaWdlbmQsIGF4KQkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2lzcykKLSNkZWZpbmUgQVVYX0dFVF9XSURUSChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfd2lkdGgpCi0jZGVmaW5lIEFVWF9HRVRfQ09VTlQoYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2NvdW50KQotCi0jZGVmaW5lIEFVWF9QVVRfQU5ZKGJpZ2VuZCwgdmFsLCBheCwgZmllbGQpIFwKLSAgKChiaWdlbmQpIFwKLSAgID8gKGJmZF9wdXRiMzIgKChiZmRfdm1hKSAodmFsKSwgKGF4KS0+ZmllbGQpLCAwKSBcCi0gICA6IChiZmRfcHV0bDMyICgoYmZkX3ZtYSkgKHZhbCksIChheCktPmZpZWxkKSwgMCkpCi0KLSNkZWZpbmUgQVVYX1BVVF9ETkxPVyhiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9kbkxvdykKLSNkZWZpbmUgQVVYX1BVVF9ETkhJR0goYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfZG5IaWdoKQotI2RlZmluZSBBVVhfUFVUX0lTWU0oYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfaXN5bSkKLSNkZWZpbmUgQVVYX1BVVF9JU1MoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfaXNzKQotI2RlZmluZSBBVVhfUFVUX1dJRFRIKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX3dpZHRoKQotI2RlZmluZSBBVVhfUFVUX0NPVU5UKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2NvdW50KQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEZvciBlZmZpY2llbmN5LCBnZGIgZGVhbHMgZGlyZWN0bHkgd2l0aCB0aGUgdW5zd2FwcGVkIHN5bWJvbGljCi0gICBpbmZvcm1hdGlvbiAodGhhdCB3YXkgaXQgb25seSB0YWtlcyB0aGUgdGltZSB0byBzd2FwIGluZm9ybWF0aW9uCi0gICB0aGF0IGl0IHJlYWxseSBuZWVkcyB0byByZWFkKS4gIGdkYiBvcmlnaW5hbGx5IHJldHJpZXZlZCB0aGUKLSAgIGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gdGhlIEJGRCBiYWNrZW5kIGluZm9ybWF0aW9uLCBidXQgdGhhdAotICAgc3RyYXRlZ3ksIGJlc2lkZXMgYmVpbmcgc29ydCBvZiB1Z2x5LCBkb2VzIG5vdCB3b3JrIGZvciBNSVBTIEVMRiwKLSAgIHdoaWNoIGFsc28gdXNlcyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHN0cnVjdHVyZSBob2xkcwotICAgcG9pbnRlcnMgdG8gdGhlIChtb3N0bHkpIHVuc3dhcHBlZCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvCi17Ci0gIC8qIFRoZSBzd2FwcGVkIEVDT0ZGIHN5bWJvbGljIGhlYWRlci4gICovCi0gIEhEUlIgc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFBvaW50ZXJzIHRvIHRoZSB1bnN3YXBwZWQgc3ltYm9saWMgaW5mb3JtYXRpb24uICBOb3RlIHRoYXQgdGhlCi0gICAgIHBvaW50ZXJzIHRvIGV4dGVybmFsIHN0cnVjdHVyZXMgcG9pbnQgdG8gZGlmZmVyZW50IHNvcnRzIG9mCi0gICAgIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBFQ09GRiB0YXJnZXRzLiAgVGhlIGVjb2ZmX2RlYnVnX3N3YXAKLSAgICAgc3RydWN0dXJlIHByb3ZpZGVzIHRoZSBzaXplcyBvZiB0aGUgc3RydWN0dXJlcyBhbmQgdGhlIGZ1bmN0aW9ucwotICAgICBuZWVkZWQgdG8gc3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW5kIG91dC4gIFRoZXNlIHBvaW50ZXJzIGFyZQotICAgICBhbGwgcG9pbnRlcnMgdG8gYXJyYXlzLCBub3Qgc2luZ2xlIHN0cnVjdHVyZXMuICBUaGV5IHdpbGwgYmUgTlVMTAotICAgICBpZiB0aGVyZSBhcmUgbm8gaW5zdGFuY2VzIG9mIHRoZSByZWxldmFudCBzdHJ1Y3R1cmUuICBUaGVzZQotICAgICBmaWVsZHMgYXJlIGFsc28gdXNlZCBieSB0aGUgYXNzZW1ibGVyIHRvIG91dHB1dCBFQ09GRiBkZWJ1Z2dpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyICpsaW5lOwotICBQVFIgZXh0ZXJuYWxfZG5yOwkvKiBzdHJ1Y3QgZG5yX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfcGRyOwkvKiBzdHJ1Y3QgcGRyX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfc3ltOwkvKiBzdHJ1Y3Qgc3ltX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfb3B0OwkvKiBzdHJ1Y3Qgb3B0X2V4dCAqLwotICB1bmlvbiBhdXhfZXh0ICpleHRlcm5hbF9hdXg7Ci0gIGNoYXIgKnNzOwotICBjaGFyICpzc2V4dDsKLSAgUFRSIGV4dGVybmFsX2ZkcjsJLyogc3RydWN0IGZkcl9leHQgKi8KLSAgUFRSIGV4dGVybmFsX3JmZDsJLyogc3RydWN0IHJmZF9leHQgKi8KLSAgUFRSIGV4dGVybmFsX2V4dDsJLyogc3RydWN0IGV4dF9leHQgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhleSBtYXkgZGlzYXBwZWFyIGF0IHNvbWUKLSAgICAgcG9pbnQuICAqLwotICBjaGFyICpzc2V4dF9lbmQ7Ci0gIFBUUiBleHRlcm5hbF9leHRfZW5kOwotCi0gIC8qIFdoZW4gbGlua2luZywgdGhpcyBmaWVsZCBob2xkcyBhIG1hcHBpbmcgZnJvbSB0aGUgaW5wdXQgRkRSCi0gICAgIG51bWJlcnMgdG8gdGhlIG91dHB1dCBudW1iZXJzLCBhbmQgaXMgdXNlZCB3aGVuIHdyaXRpbmcgb3V0IHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzLiAgSXQgaXMgTlVMTCBpZiBubyBtYXBwaW5nIGlzIHJlcXVpcmVkLiAgKi8KLSAgUkZEVCAqaWZkbWFwOwotCi0gIC8qIFRoZSBzd2FwcGVkIEZEUiBpbmZvcm1hdGlvbi4gIEN1cnJlbnRseSB0aGlzIGlzIG5ldmVyIE5VTEwsIGJ1dAotICAgICBjb2RlIHVzaW5nIHRoaXMgc3RydWN0dXJlIHNob3VsZCBwcm9iYWJseSBkb3VibGUtY2hlY2sgaW4gY2FzZQotICAgICB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZS4gIFRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5LCBub3QgYQotICAgICBzaW5nbGUgc3RydWN0dXJlLiAgKi8KLSAgRkRSICpmZHI7Ci0KLSAgLyogV2hlbiByZWxheGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QKLSAgICAgc3ltYm9sIHZhbHVlcyB3aGVuIHRoZXkgYXJlIG91dHB1dC4gIFRoaXMgaXMgYSBsaW5rZWQgbGlzdCBvZgotICAgICBzdHJ1Y3R1cmVzIGluZGljYXRpbmcgaG93IHZhbHVlcyBzaG91bGQgYmUgYWRqdXN0ZWQuICBUaGVyZSBpcyBubwotICAgICByZXF1aXJlbWVudCB0aGF0IHRoZSBlbnRyaWVzIGJlIGluIGFueSBvcmRlciwgb3IgdGhhdCB0aGV5IG5vdAotICAgICBvdmVybGFwLiAgVGhpcyBmaWVsZCBpcyBub3JtYWxseSBOVUxMLCBpbiB3aGljaCBjYXNlIG5vCi0gICAgIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgbWFkZS4gICovCi0gIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBob3cgdG8gYWRqdXN0IHN5bWJvbCB2YWx1ZXMgd2hlbgotICAgb3V0cHV0dGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLiAgVGhlc2UgYWRqdXN0bWVudHMgb25seSBhcHBseSB0bwotICAgdGhlIGludGVybmFsIHN5bWJvbHMsIGFzIHRoZSBleHRlcm5hbCBzeW1ib2wgdmFsdWVzIHdpbGwgY29tZSBmcm9tCi0gICB0aGUgaGFzaCB0YWJsZSBhbmQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRqdXN0ZWQuICAqLwotCi1zdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0Ci17Ci0gIC8qIE5leHQgZW50cnkgb24gYWRqdXN0bWVudCBsaXN0LiAgKi8KLSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqbmV4dDsKLSAgLyogU3RhcnRpbmcgVk1BIG9mIGFkanVzdG1lbnQuICBUaGlzIGlzIHRoZSBWTUEgaW4gdGhlIEVDT0ZGIGZpbGUsCi0gICAgIG5vdCB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgVGh1cyBpdCBzaG91bGQKLSAgICAgaW5kaWNhdGUgYSBwYXJ0aWN1bGFyIHNlY3Rpb24uICAqLwotICBiZmRfdm1hIHN0YXJ0OwotICAvKiBFbmRpbmcgVk1BIG9mIGFkanVzdG1lbnQuICAqLwotICBiZmRfdm1hIGVuZDsKLSAgLyogQWRqdXN0bWVudC4gIFRoaXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCBvcgotICAgICBGRFIuICBUaGlzIGlzIHplcm8gZm9yIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheS4gICovCi0gIGxvbmcgYWRqdXN0OwotfTsKLQotLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCBieSB0aGUgRUNPRkYgZmluZF9uZWFyZXN0X2xpbmUgZnVuY3Rpb24uICAqLwotCi1zdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5Ci17Ci0gIC8qIEJhc2UgYWRkcmVzcyBpbiAudGV4dCBvZiB0aGlzIEZEUi4gICovCi0gIGJmZF92bWEgYmFzZV9hZGRyOwotICBGRFIgKmZkcjsKLX07Ci0KLXN0cnVjdCBlY29mZl9maW5kX2xpbmUKLXsKLSAgLyogQWxsb2NhdGVkIG1lbW9yeSB0byBob2xkIGZ1bmN0aW9uIGFuZCBmaWxlIG5hbWVzLiAgKi8KLSAgY2hhciAqZmluZF9idWZmZXI7Ci0KLSAgLyogRkRSIHRhYmxlLCBzb3J0ZWQgYnkgYWRkcmVzczogKi8KLSAgbG9uZyBmZHJ0YWJfbGVuOwotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpmZHJ0YWI7Ci0KLSAgLyogQ2FjaGUgZW50cnkgZm9yIG1vc3QgcmVjZW50bHkgZm91bmQgbGluZSBpbmZvcm1hdGlvbi4gIFRoZSBzZWN0Ci0gICAgIGZpZWxkIGlzIE5VTEwgaWYgdGhpcyBjYWNoZSBkb2VzIG5vdCBjb250YWluIHZhbGlkIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0Ci0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Q7Ci0gICAgICBiZmRfdm1hIHN0YXJ0OwotICAgICAgYmZkX3ZtYSBzdG9wOwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZV9udW07Ci0gICAgfSBjYWNoZTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNXQVBQSU5HICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBnZW5lcmljIEVDT0ZGIGNvZGUgbmVlZHMgdG8gYmUgYWJsZSB0byBzd2FwIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gaW4gYW5kIG91dCBpbiB0aGUgc3BlY2lmaWMgZm9ybWF0IHVzZWQgYnkgYSBwYXJ0aWN1bGFyCi0gICBFQ09GRiBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbgotICAgbmVlZGVkIHRvIGRvIHRoaXMuICAqLwotCi1zdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcAotewotICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgaW50IHN5bV9tYWdpYzsKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICBiZmRfc2l6ZV90eXBlIGRlYnVnX2FsaWduOwotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfaGRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZG5yX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfb3B0X3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmZkX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICB2b2lkICgqc3dhcF9oZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEhEUlIgKikpOwotICB2b2lkICgqc3dhcF9kbnJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEROUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3Bkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUERSICopKTsKLSAgdm9pZCAoKnN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKTsKLSAgdm9pZCAoKnN3YXBfb3B0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBPUFRSICopKTsKLSAgdm9pZCAoKnN3YXBfZmRyX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBGRFIgKikpOwotICB2b2lkICgqc3dhcF9yZmRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpOwotICB2b2lkICgqc3dhcF9leHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpOwotICB2b2lkICgqc3dhcF90aXJfaW4pIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLSAgdm9pZCAoKnN3YXBfcm5keF9pbikgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKiwgUk5EWFIgKikpOwotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIHZvaWQgKCpzd2FwX2hkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBIRFJSICosIFBUUikpOwotICB2b2lkICgqc3dhcF9kbnJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRE5SICosIFBUUikpOwotICB2b2lkICgqc3dhcF9wZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUERSICosIFBUUikpOwotICB2b2lkICgqc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfb3B0X291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IE9QVFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2Zkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3JmZF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpOwotICB2b2lkICgqc3dhcF9leHRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRVhUUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfdGlyX291dCkgUEFSQU1TICgoaW50LCBjb25zdCBUSVIgKiwgc3RydWN0IHRpcl9leHQgKikpOwotICB2b2lkICgqc3dhcF9ybmR4X291dCkgUEFSQU1TICgoaW50LCBjb25zdCBSTkRYUiAqLCBzdHJ1Y3Qgcm5keF9leHQgKikpOwotICAvKiBGdW5jdGlvbiB0byByZWFkIHN5bWJvbCBkYXRhIGFuZCBzZXQgdXAgcG9pbnRlcnMgaW4KLSAgICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICBUaGUgc2VjdGlvbiBhcmd1bWVudCBpcyB1c2VkIGZvcgotICAgICBFTEYsIG5vdCBzdHJhaWdodCBFQ09GRi4gICovCi0gIGJvb2xlYW4gKCpyZWFkX2RlYnVnX2luZm8pIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLX07Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEVDT0ZGX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oIGIvaW5jbHVkZS9jb2ZmL2dvMzJleGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMjZjMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogQ09GRiBpbmZvcm1hdGlvbiBmb3IgUEMgcnVubmluZyBnbzMyLiAgKi8KLQotI2RlZmluZSBTVFVCU0laRSAyMDQ4Ci0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyX2dvMzJfZXhlIHsKLQljaGFyIHN0dWJbU1RVQlNJWkVdOwkvKiB0aGUgc3R1YiB0byBsb2FkIHRoZSBpbWFnZQkqLwotCS8qIHRoZSBzdGFuZGFyZCBDT0ZGIGhlYWRlciAqLwotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSN1bmRlZiBGSUxIRFIKLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyX2dvMzJfZXhlCi0jdW5kZWYgRklMSFNaCi0jZGVmaW5lCUZJTEhTWglTVFVCU0laRSsyMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2g4MzAwLmggYi9pbmNsdWRlL2NvZmYvaDgzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2MjM5NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaDgzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgSDgvMzAwIGFuZCBIOC8zMDAtSCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJSDgzMDBNQUdJQwkweDgzMDAKLSNkZWZpbmUJSDgzMDBITUFHSUMJMHg4MzAxCi0jZGVmaW5lCUg4MzAwU01BR0lDCTB4ODMwMgotCi0jZGVmaW5lIEg4MzAwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPUg4MzAwTUFHSUMpKQotI2RlZmluZSBIODMwMEhCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBITUFHSUMpKQotI2RlZmluZSBIODMwMFNCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBTTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaDg1MDAuaCBiL2luY2x1ZGUvY29mZi9oODUwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzA1YmYyYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaDg1MDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgSDgvNTAwICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlIODUwME1BR0lDCTB4ODUwMAotCi0KLSNkZWZpbmUgSDg1MDBCQURNQUcoeCkgKCgweGZmZmYgJiYgKCh4KS5mX21hZ2ljKSE9SDg1MDBNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pMzg2LmggYi9pbmNsdWRlL2NvZmYvaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWJmNGEyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCAzODYvNDg2LiAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotCi0KLQotI2RlZmluZQlJMzg2TUFHSUMJMHgxNGMKLSNkZWZpbmUgSTM4NlBUWE1BR0lDCTB4MTU0Ci0jZGVmaW5lIEkzODZBSVhNQUdJQwkweDE3NQotCi0vKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KLQotI2RlZmluZSBMWU5YQ09GRk1BR0lDCTA0MTUKLQotI2RlZmluZSBJMzg2QkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gSTM4Nk1BR0lDKSBcCi0JCSAgICAgICAmJiAoeCkuZl9tYWdpYyAhPSBJMzg2QUlYTUFHSUMgXAotCQkgICAgICAgJiYgKHgpLmZfbWFnaWMgIT0gSTM4NlBUWE1BR0lDIFwKLQkJICAgICAgICYmICh4KS5mX21hZ2ljICE9IExZTlhDT0ZGTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0KLQotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotCi0vKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0JCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0JCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLSMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTg2MC5oIGIvaW5jbHVkZS9jb2ZmL2k4NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2ODZlOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaTg2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSB3YXMgaGFja2VkIGZyb20gaTM4Ni5oICAgW2RvbGFuQHNzZC5pbnRlbC5jb21dICovCi0KLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSW50ZWwgODYwLiAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLQotCi0jZGVmaW5lCUk4NjBNQUdJQwkweDE0ZAotCi0jZGVmaW5lIEk4NjBCQURNQUcoeCkgICAoKHgpLmZfbWFnaWMgIT0gSTg2ME1BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyogRklYTUU6IFdoYXQgYXJlIHRoZSBhLm91dCBtYWdpYyBudW1iZXJzPyAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTk2MC5oIGIvaW5jbHVkZS9jb2ZmL2k5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzNTgzNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaTk2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgODA5NjAuICBPcmlnaW5zOiBJbnRlbCBjb3JwLCBuYXRjaC4gKi8KLQotLyogTk9URTogVGFnZW50cmllcyAoY2YgVEFHQklUUykgYXJlIG5vIGxvbmdlciB1c2VkIGJ5IHRoZSA5NjAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgKDA0MDcpCS8qIG9sZCBpbXB1cmUgZm9ybWF0LiBkYXRhIGltbWVkaWF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd3MgdGV4dC4gYm90aCBzZWN0aW9ucyBhcmUgcncuICovCi0jZGVmaW5lIE5NQUdJQyAgICAgICgwNDEwKQkvKiBzcGxpdCBpJmQsIHJlYWQtb25seSB0ZXh0ICovCi0KLS8qCi0qCUludGVsIDgwOTYwIChJOTYwKSBwcm9jZXNzb3IgZmxhZ3MuCi0qCUZfSTk2MFRZUEUgPT0gbWFzayBmb3IgcHJvY2Vzc29yIHR5cGUgZmllbGQuIAotKi8KLQotI2RlZmluZQlGX0k5NjBUWVBFCSgweGYwMDApCi0jZGVmaW5lCUZfSTk2MENPUkUJKDB4MTAwMCkKLSNkZWZpbmUJRl9JOTYwS0IJKDB4MjAwMCkKLSNkZWZpbmUJRl9JOTYwU0IJKDB4MjAwMCkKLSNkZWZpbmUJRl9JOTYwTUMJKDB4MzAwMCkKLSNkZWZpbmUJRl9JOTYwWEEJKDB4NDAwMCkKLSNkZWZpbmUJRl9JOTYwQ0EJKDB4NTAwMCkKLSNkZWZpbmUJRl9JOTYwS0EJKDB4NjAwMCkKLSNkZWZpbmUJRl9JOTYwU0EJKDB4NjAwMCkKLSNkZWZpbmUgRl9JOTYwSlgJKDB4NzAwMCkKLSNkZWZpbmUgRl9JOTYwSFgJKDB4ODAwMCkKLQotCi0vKiogaTgwOTYwIE1hZ2ljIE51bWJlcnMKLSovCi0KLSNkZWZpbmUgSTk2MFJPTUFHSUMJKDB4MTYwKQkvKiByZWFkLW9ubHkgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZSBJOTYwUldNQUdJQwkoMHgxNjEpCS8qIHJlYWQtd3JpdGUgdGV4dCBzZWdtZW50cyAqLwotCi0jZGVmaW5lIEk5NjBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9STk2MFJPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9STk2MFJXTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZwlwaHlzX2FkZHI7Ci0JdW5zaWduZWQgbG9uZwliaXRhcnJheTsKLX0gVEFHQklUUzsKLQotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhcgl0YWdlbnRyaWVzWzRdOwkJLyogbnVtYmVyIG9mIHRhZyBlbnRyaWVzIHRvIGZvbGxvdyAqLwotfQotQU9VVEhEUjsKLQotLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdGFnIGJpdHMgYXJyYXkgKi8KLQotI2RlZmluZSBUQUdQVFIoYW91dCkgKChUQUdCSVRTICopICgmKGFvdXQudGFnZW50cmllcykrMSkpCi0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0vKiNkZWZpbmUgQU9VVFNaKGFvdXQpIChzaXplb2YoQU9VVEhEUikrKGFvdXQudGFnZW50cmllcypzaXplb2YoVEFHQklUUykpKSovCi0jZGVmaW5lIEFPVVRTWiAzMgotI2RlZmluZSBBT1VUSERSU1ogMzIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLQljaGFyIAkJc19hbGlnbls0XTsJLyogc2VjdGlvbiBhbGlnbm1lbnQJCSovCi19OwotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQ0Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJCS8qIGxpbmUgbnVtYmVyCQkqLwotCWNoYXIgcGFkZGluZ1syXTsJLyogZm9yY2UgYWxpZ25tZW50CSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV9mbGFnc1syXTsKLSAgY2hhciBlX3R5cGVbNF07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci0gIGNoYXIgcGFkMlsyXTsKLX07Ci0KLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4MWYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNSkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogIEk5NjAtc3BlY2lmaWMgKjJuZCogYXV4LiBlbnRyeSBmb3JtYXRzCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlzdHJ1Y3QgewotCSAgLyogVGhpcyBpcyBhIHZlcnkgb2xkIHR5cG8gdGhhdCBrZWVwcyBnZXR0aW5nIHByb3BhZ2F0ZWQuICovCi0jZGVmaW5lIHhfc3RkaW5keCB4X3N0aW5keAotCQljaGFyIHhfc3RpbmR4WzRdOwkvKiBzeXMuIHRhYmxlIGVudHJ5ICovCi0JfSB4X3NjOwkvKiBzeXN0ZW0gY2FsbCBlbnRyeSAqLwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X2JhbG50cnlbNF07IC8qIEJBTCBlbnRyeSBwb2ludCAqLwotCX0geF9iYWw7IC8qIEJBTC1jYWxsYWJsZSBmdW5jdGlvbiAqLwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90aW1lc3RhbXBbNF07CSAgICAgICAgLyogdGltZSBzdGFtcCAqLwotCQljaGFyIAl4X2lkc3RyaW5nWzIwXTsJICAgICAgICAvKiBwcm9kdWNlciBpZGVudGl0eSBzdHJpbmcgKi8KLQl9IHhfaWRlbnQ7CSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2R1Y2VyIGlkZW50IGluZm8gKi8KLQotfTsKLQotCi0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTI0Ci0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTI0Ci0KLSMJZGVmaW5lIF9FVEVYVAkiX2V0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciBwYWRbMl07Ci19OwotCi0vKiByX3R5cGUgdmFsdWVzIGZvciB0aGUgaTk2MC4gICovCi0KLS8qIFRoZSBpOTYwIHVzZXMgUl9SRUxMT05HLCB3aGljaCBpcyBkZWZpbmVkIGluIGludGVybmFsLmggYXMgMHgxMS4KLSAgIEl0IGlzIGFuIGFic29sdXRlIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLQotI2RlZmluZSBSX0lQUk1FRCAJKDB4MTkpCS8qIDI0LWJpdCBpcC1yZWxhdGl2ZSByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfT1BUQ0FMTAkoMHgxYikJLyogMzItYml0IG9wdGltaXphYmxlIGNhbGwgKGxlYWZwcm9jL3N5c3Byb2MpICovCi0jZGVmaW5lIFJfT1BUQ0FMTFgJKDB4MWMpCS8qIDY0LWJpdCBvcHRpbWl6YWJsZSBjYWxsIChsZWFmcHJvYy9zeXNwcm9jKSAqLwotCi0vKiBUaGUgZm9sbG93aW5nIHJlbG9jYXRpb24gdHlwZXMgYXJlIGRlZmluZWQgdXNlIGJ5IHJlbGF4aW5nIGxpbmtlcnMsCi0gICB3aGljaCBjb252ZXJ0IDMyIGJpdCBjYWxscyAod2hpY2ggcmVxdWlyZSBhIDY0IGJpdCBpbnN0cnVjdGlvbikKLSAgIGludG8gMjQgYml0IGNhbGxzICh3aGljaCByZXF1aXJlIGEgMzIgYml0IGluc3RydWN0aW9uKSB3aGVuCi0gICBwb3NzaWJsZS4gIEl0IHdpbGwgYmUgcG9zc2libGUgd2hlbmV2ZXIgdGhlIHRhcmdldCBvZiB0aGUgY2FsbCBpcwotICAgd2l0aGluIGEgMjQgYml0IHJhbmdlIG9mIHRoZSBjYWxsIGluc3RydWN0aW9uLgotCi0gICBJdCBpcyBhbHdheXMgc2FmZSB0byBpZ25vcmUgdGhlc2UgcmVsb2NhdGlvbnMuICBUaGV5IG9ubHkgc2VydmUgdG8KLSAgIG1hcmsgcG9pbnRzIHdoaWNoIHRoZSByZWxheGluZyBsaW5rZXIgd2lsbCBoYXZlIHRvIGNvbnNpZGVyLiAgVGhlCi0gICBhc3NlbWJsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBldmVuIGlmCi0gICB0aGUgcmVsb2NhdGlvbnMgYXJlIGlnbm9yZWQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIG1lYW5zIHRoYXQgdGhlCi0gICBSX0lQUjEzIHJlbG9jYXRpb24gbWF5IG5vdCBhcHBlYXIgd2l0aCBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCi0jZGVmaW5lIFJfSVBSMTMJCSgweDFkKQkvKiAxMyBiaXQgaXAtcmVsYXRpdmUgYnJhbmNoICovCi0jZGVmaW5lIFJfQUxJR04JCSgweDFlKSAgLyogYWxpZ25tZW50IG1hcmtlci4gIFRoaXMgaGFzIG5vCi0JCQkJICAgYXNzb2NpYXRlZCBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKLQkJCQkgICByX3N5bW5keCBmaWVsZCBpbmRpY2F0ZXMgdGhlCi0JCQkJICAgcmVxdWlyZSBhbGlnbm1lbnQgYXQgdGhpcyBwb2ludCBpbgotCQkJCSAgIHRoZSBmaWxlLiAgSXQgbXVzdCBiZSBhIHBvd2VyIG9mIDIuICAqLwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCBiL2luY2x1ZGUvY29mZi9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmMyNGJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzI4ICswLDAgQEAKLS8qIEludGVybmFsIGZvcm1hdCBvZiBDT0ZGIG9iamVjdCBmaWxlIGRhdGEgc3RydWN0dXJlcywgZm9yIEdOVSBCRkQuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuICAqLwotCi0jaWZuZGVmIEdOVV9DT0ZGX0lOVEVSTkFMX0gKLSNkZWZpbmUgR05VX0NPRkZfSU5URVJOQUxfSCAxCi0KLS8qIEZpcnN0LCBtYWtlICJzaWduZWQgY2hhciIgd29yaywgZXZlbiBvbiBvbGQgY29tcGlsZXJzLiAqLwotI2lmbmRlZiBzaWduZWQKLSNpZm5kZWYgX19TVERDX18KLSNkZWZpbmUJc2lnbmVkCQkJLyoqLwotI2VuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZXh0cmEgc3R1ZmYgaW4gYSBQRSBoZWFkZXIuICovCi0KLXN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyCi17Ci0gIC8qIERPUyBoZWFkZXIgZGF0YSBmb2xsb3dzIGZvciBQRSBzdHVmZiAqLwotICB1bnNpZ25lZCBzaG9ydCBlX21hZ2ljOwkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NibHA7CS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3A7CQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jcmxjOwkvKiBSZWxvY2F0aW9ucywgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3BhcmhkcjsJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbWluYWxsb2M7CS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX21heGFsbG9jOwkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9zczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfc3A7CQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3N1bTsJLyogQ2hlY2tzdW0sIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2lwOwkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3M7CQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2xmYXJsYzsJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9vdm5vOwkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfcmVzWzRdOwkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX29lbWlkOwkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX29lbWluZm87CS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfcmVzMlsxMF07CS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIGJmZF92bWEgIGVfbGZhbmV3OwkJLyogRmlsZSBhZGRyZXNzIG9mIG5ldyBleGUgaGVhZGVyLCAweDgwICovCi0gIHVuc2lnbmVkIGxvbmcgZG9zX21lc3NhZ2VbMTZdOyAvKiB0ZXh0IHdoaWNoIGFsd2F5cyBmb2xsb3dzIGRvcyBoZWFkZXIgKi8KLSAgYmZkX3ZtYSAgbnRfc2lnbmF0dXJlOyAgIAkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKLX07Ci0KLXN0cnVjdCBpbnRlcm5hbF9maWxlaGRyCi17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyIHBlOwotCi0gIC8qIHN0YW5kYXJkIGNvZmYgIGludGVybmFsIGluZm8gKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBsb25nIGZfdGltZGF0OwkJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGJmZF92bWEgZl9zeW1wdHI7CQkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGxvbmcgZl9uc3ltczsJCQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwkvKiBmbGFncwkJCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfdGFyZ2V0X2lkOwkvKiAoVEljODAgc3BlY2lmaWMpCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIxNldSCWZpbGUgaXMgMTYtYml0IGxpdHRsZS1lbmRpYW4KLSAqCUZfQVIzMldSCWZpbGUgaXMgMzItYml0IGxpdHRsZS1lbmRpYW4KLSAqCUZfQVIzMlcJCWZpbGUgaXMgMzItYml0IGJpZy1lbmRpYW4KLSAqCUZfRFlOTE9BRAlycy82MDAwIGFpeDogZHluYW1pY2FsbHkgbG9hZGFibGUgdy9pbXBvcnRzICYgZXhwb3J0cwotICoJRl9TSFJPQkoJcnMvNjAwMCBhaXg6IGZpbGUgaXMgYSBzaGFyZWQgb2JqZWN0Ci0gKiAgICAgIEZfRExMICAgICAgICAgICBQRSBmb3JtYXQgRExMCi0gKi8KLQotI2RlZmluZQlGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZQlGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lCUZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUJRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUJRl9BUjE2V1IJKDB4MDA4MCkKLSNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKLSNkZWZpbmUJRl9BUjMyVyAgICAgCSgweDAyMDApCi0jZGVmaW5lCUZfRFlOTE9BRAkoMHgxMDAwKQotI2RlZmluZQlGX1NIUk9CSgkoMHgyMDAwKQotI2RlZmluZSBGX0RMTCAgICAgICAgICAgKDB4MjAwMCkKLQotLyogZXh0cmEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIG9wdGlvbmFsIGhlYWRlciAqLwotdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RBVEFfRElSRUNUT1JZIAotewotICBiZmRfdm1hIFZpcnR1YWxBZGRyZXNzOwotICBsb25nICAgIFNpemU7Ci19ICBJTUFHRV9EQVRBX0RJUkVDVE9SWTsKLSNkZWZpbmUgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVMgIDE2Ci0KLS8qIERlZmF1bHQgaW1hZ2UgYmFzZSBmb3IgTlQuICAqLwotI2RlZmluZSBOVF9FWEVfSU1BR0VfQkFTRSAweDQwMDAwMAotI2RlZmluZSBOVF9ETExfSU1BR0VfQkFTRSAweDEwMDAwMDAwCi0KLS8qIERlZmF1bHQgaW1hZ2UgYmFzZSBmb3IgQmVPUy4gKi8KLSNkZWZpbmUgQkVPU19FWEVfSU1BR0VfQkFTRSAweDgwMDAwMDAwCi0jZGVmaW5lIEJFT1NfRExMX0lNQUdFX0JBU0UgMHgxMDAwMDAwMAotCi0vKiBFeHRyYSBzdHVmZiBpbiBhIFBFIGFvdXRoZHIgKi8KLQotI2RlZmluZSBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCAweDIwMAotCi1zdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAKLXsKLSAgLyogUEUgc3R1ZmYgICovCi0gIGJmZF92bWEgSW1hZ2VCYXNlOwkJLyogYWRkcmVzcyBvZiBzcGVjaWZpYyBsb2NhdGlvbiBpbiBtZW1vcnkgdGhhdAotCQkJCSAgIGZpbGUgaXMgbG9jYXRlZCwgTlQgZGVmYXVsdCAweDEwMDAwICovCi0KLSAgYmZkX3ZtYSBTZWN0aW9uQWxpZ25tZW50OwkvKiBzZWN0aW9uIGFsaWdubWVudCBkZWZhdWx0IDB4MTAwMCAqLwotICBiZmRfdm1hIEZpbGVBbGlnbm1lbnQ7CS8qIGZpbGUgYWxpZ25tZW50IGRlZmF1bHQgMHgyMDAgKi8KLSAgc2hvcnQgICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8qIG1pbmltdW0gdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nICovCi0gIHNob3J0ICAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvKiBzeXN0ZW0gcmVxJ2QgZm9yIGV4ZSwgZGVmYXVsdCB0byAxKi8KLSAgc2hvcnQgICBNYWpvckltYWdlVmVyc2lvbjsJLyogdXNlciBkZWZpbmVhYmxlIGZpZWxkIHRvIHN0b3JlIHZlcnNpb24gb2YgKi8KLSAgc2hvcnQgICBNaW5vckltYWdlVmVyc2lvbjsJLyogZXhlIG9yIGRsbCBiZWluZyBjcmVhdGVkLCBkZWZhdWx0IHRvIDAgKi8gCi0gIHNob3J0ICAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOyAvKiBtaW5pbXVtIHN1YnN5c3RlbSB2ZXJzaW9uIHJlcXVpcmVkIHRvICovCi0gIHNob3J0ICAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOyAvKiBydW4gZXhlOyBkZWZhdWx0IHRvIDMuMSAqLwotICBsb25nICAgIFJlc2VydmVkMTsJCS8qIHNlZW1zIHRvIGJlIDAgKi8KLSAgbG9uZyAgICBTaXplT2ZJbWFnZTsJCS8qIHNpemUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIGZvciBwcm9nICovCi0gIGxvbmcgICAgU2l6ZU9mSGVhZGVyczsJLyogc2l6ZSBvZiBQRSBoZWFkZXIgYW5kIHNlY3Rpb24gdGFibGUgKi8KLSAgbG9uZyAgICBDaGVja1N1bTsJCS8qIHNldCB0byAwICovCi0gIHNob3J0ICAgU3Vic3lzdGVtOwkKLQotICAvKiB0eXBlIG9mIHN1YnN5c3RlbSBleGUgdXNlcyBmb3IgdXNlciBpbnRlcmZhY2UsCi0gICAgIHBvc3NpYmxlIHZhbHVlczoKLSAgICAgMSAtIE5BVElWRSAgIERvZXNuJ3QgcmVxdWlyZSBhIHN1YnN5c3RlbQotICAgICAyIC0gV0lORE9XU19HVUkgcnVucyBpbiBXaW5kb3dzIEdVSSBzdWJzeXN0ZW0KLSAgICAgMyAtIFdJTkRPV1NfQ1VJIHJ1bnMgaW4gV2luZG93cyBjaGFyIHN1Yi4gKGNvbnNvbGUgYXBwKQotICAgICA1IC0gT1MyX0NVSSBydW5zIGluIE9TLzIgY2hhcmFjdGVyIHN1YnN5c3RlbQotICAgICA3IC0gUE9TSVhfQ1VJIHJ1bnMgaW4gUG9zaXggY2hhcmFjdGVyIHN1YnN5c3RlbSAqLwotICBzaG9ydCAgIERsbENoYXJhY3RlcmlzdGljczsJLyogZmxhZ3MgZm9yIERMTCBpbml0LCB1c2UgMCAqLwotICBiZmRfdm1hIFNpemVPZlN0YWNrUmVzZXJ2ZTsJLyogYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlICAqLwotICBiZmRfdm1hIFNpemVPZlN0YWNrQ29tbWl0OwkvKiBhbW91bnQgb2YgbWVtb3J5IGluaXRpYWxseSBjb21taXR0ZWQgZm9yIAotCQkJCSAgIGluaXRpYWwgdGhyZWFkJ3Mgc3RhY2ssIGRlZmF1bHQgaXMgMHgxMDAwICovCi0gIGJmZF92bWEgU2l6ZU9mSGVhcFJlc2VydmU7CS8qIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSB0byByZXNlcnZlIGFuZCAqLwotICBiZmRfdm1hIFNpemVPZkhlYXBDb21taXQ7CS8qIGNvbW1pdCwgZG9uJ3Qga25vdyB3aGF0IHRvIGRlZmF1dCBpdCB0byAqLwotICBsb25nICAgIExvYWRlckZsYWdzOwkJLyogY2FuIHByb2JhYmx5IHNldCB0byAwICovCi0gIGxvbmcgICAgTnVtYmVyT2ZSdmFBbmRTaXplczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gbmV4dCBlbnRyeSwgMTYgKi8KLSAgSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcgotewotICBzaG9ydCBtYWdpYzsJCQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgc2hvcnQgdnN0YW1wOwkJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBiZmRfdm1hIHRzaXplOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGJmZF92bWEgZHNpemU7CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGJmZF92bWEgYnNpemU7CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGJmZF92bWEgZW50cnk7CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgYmZkX3ZtYSB0ZXh0X3N0YXJ0OwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBiZmRfdm1hIGRhdGFfc3RhcnQ7CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0KLSAgLyogaTk2MCBzdHVmZiAqLwotICB1bnNpZ25lZCBsb25nIHRhZ2VudHJpZXM7CS8qIG51bWJlciBvZiB0YWcgZW50cmllcyB0byBmb2xsb3cgKi8KLQotICAvKiBSUy82MDAwIHN0dWZmICovCi0gIHVuc2lnbmVkIGxvbmcgb190b2M7CQkvKiBhZGRyZXNzIG9mIFRPQwkJCSovCi0gIHNob3J0IG9fc25lbnRyeTsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBlbnRyeSBwb2ludCAqLwotICBzaG9ydCBvX3NudGV4dDsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciB0ZXh0CSovCi0gIHNob3J0IG9fc25kYXRhOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGRhdGEJKi8KLSAgc2hvcnQgb19zbnRvYzsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciB0b2MJKi8KLSAgc2hvcnQgb19zbmxvYWRlcjsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBsb2FkZXIgc2VjdGlvbiAqLwotICBzaG9ydCBvX3NuYnNzOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGJzcwkqLwotICBzaG9ydCBvX2FsZ250ZXh0OwkJLyogbWF4IGFsaWdubWVudCBmb3IgdGV4dAkqLwotICBzaG9ydCBvX2FsZ25kYXRhOwkJLyogbWF4IGFsaWdubWVudCBmb3IgZGF0YQkqLwotICBzaG9ydCBvX21vZHR5cGU7CQkvKiBNb2R1bGUgdHlwZSBmaWVsZCwgMVIsUkUsUk8JKi8KLSAgc2hvcnQgb19jcHV0eXBlOwkJLyogRW5jb2RlZCBDUFUgdHlwZQkJKi8KLSAgdW5zaWduZWQgbG9uZyBvX21heHN0YWNrOwkvKiBtYXggc3RhY2sgc2l6ZSBhbGxvd2VkLgkqLwotICB1bnNpZ25lZCBsb25nIG9fbWF4ZGF0YTsJLyogbWF4IGRhdGEgc2l6ZSBhbGxvd2VkLgkqLwotCi0gIC8qIEVDT0ZGIHN0dWZmICovCi0gIGJmZF92bWEgYnNzX3N0YXJ0OwkJLyogQmFzZSBvZiBic3Mgc2VjdGlvbi4JCSovCi0gIGJmZF92bWEgZ3BfdmFsdWU7CQkvKiBHUCByZWdpc3RlciB2YWx1ZS4JCSovCi0gIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsJLyogR2VuZXJhbCByZWdpc3RlcnMgdXNlZC4JKi8KLSAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOwkvKiBDb3Byb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4JKi8KLSAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwkvKiBGbG9hdGluZyBwb2ludGVyIHJlZ2lzdGVycyB1c2VkLiAgKi8KLQotICAvKiBBcG9sbG8gc3R1ZmYgKi8KLSAgbG9uZyBvX2lubGliOwkJCS8qIGlubGliIGRhdGEgKi8KLSAgbG9uZyBvX3NyaTsJCQkvKiBTdGF0aWMgUmVzb3VyY2UgSW5mb3JtYXRpb24gKi8KLSAgbG9uZyB2aWRbMl07CQkJLyogVmVyc2lvbiBpZCAqLwotCi0KLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGU7Ci0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUT1JBR0UgQ0xBU1NFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIHVzZWQgdG8gYmUgZGVmaW5lZCBhcyAtMSwgYnV0IG5vdyBuX3NjbGFzcyBpcyB1bnNpZ25lZC4gICovCi0jZGVmaW5lIENfRUZDTgkJMHhmZgkvKiBwaHlzaWNhbCBlbmQgb2YgZnVuY3Rpb24JKi8KLSNkZWZpbmUgQ19OVUxMCQkwCi0jZGVmaW5lIENfQVVUTwkJMQkvKiBhdXRvbWF0aWMgdmFyaWFibGUJCSovCi0jZGVmaW5lIENfRVhUCQkyCS8qIGV4dGVybmFsIHN5bWJvbAkJKi8KLSNkZWZpbmUgQ19TVEFUCQkzCS8qIHN0YXRpYwkJCSovCi0jZGVmaW5lIENfUkVHCQk0CS8qIHJlZ2lzdGVyIHZhcmlhYmxlCQkqLwotI2RlZmluZSBDX0VYVERFRgk1CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSovCi0jZGVmaW5lIENfTEFCRUwJCTYJLyogbGFiZWwJCQkqLwotI2RlZmluZSBDX1VMQUJFTAk3CS8qIHVuZGVmaW5lZCBsYWJlbAkJKi8KLSNkZWZpbmUgQ19NT1MJCTgJLyogbWVtYmVyIG9mIHN0cnVjdHVyZQkJKi8KLSNkZWZpbmUgQ19BUkcJCTkJLyogZnVuY3Rpb24gYXJndW1lbnQJCSovCi0jZGVmaW5lIENfU1RSVEFHCTEwCS8qIHN0cnVjdHVyZSB0YWcJCSovCi0jZGVmaW5lIENfTU9VCQkxMQkvKiBtZW1iZXIgb2YgdW5pb24JCSovCi0jZGVmaW5lIENfVU5UQUcJCTEyCS8qIHVuaW9uIHRhZwkJCSovCi0jZGVmaW5lIENfVFBERUYJCTEzCS8qIHR5cGUgZGVmaW5pdGlvbgkJKi8KLSNkZWZpbmUgQ19VU1RBVElDCTE0CS8qIHVuZGVmaW5lZCBzdGF0aWMJCSovCi0jZGVmaW5lIENfRU5UQUcJCTE1CS8qIGVudW1lcmF0aW9uIHRhZwkJKi8KLSNkZWZpbmUgQ19NT0UJCTE2CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkqLwotI2RlZmluZSBDX1JFR1BBUk0JMTcJLyogcmVnaXN0ZXIgcGFyYW1ldGVyCQkqLwotI2RlZmluZSBDX0ZJRUxECQkxOAkvKiBiaXQgZmllbGQJCQkqLwotI2RlZmluZSBDX0FVVE9BUkcJMTkJLyogYXV0byBhcmd1bWVudAkJKi8KLSNkZWZpbmUgQ19MQVNURU5UCTIwCS8qIGR1bW15IGVudHJ5IChlbmQgb2YgYmxvY2spCSovCi0jZGVmaW5lIENfQkxPQ0sJCTEwMAkvKiAiLmJiIiBvciAiLmViIgkJKi8KLSNkZWZpbmUgQ19GQ04JCTEwMQkvKiAiLmJmIiBvciAiLmVmIgkJKi8KLSNkZWZpbmUgQ19FT1MJCTEwMgkvKiBlbmQgb2Ygc3RydWN0dXJlCQkqLwotI2RlZmluZSBDX0ZJTEUJCTEwMwkvKiBmaWxlIG5hbWUJCQkqLwotI2RlZmluZSBDX0xJTkUJCTEwNAkvKiBsaW5lICMgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIENfQUxJQVMJIAkxMDUJLyogZHVwbGljYXRlIHRhZwkJKi8KLSNkZWZpbmUgQ19ISURERU4JMTA2CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLwotCi0jZGVmaW5lIENfV0VBS0VYVAkxMjcJLyogd2VhayBzeW1ib2wgLS0gR05VIGV4dGVuc2lvbiAqLwotCi0vKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MCAqLwotI2RlZmluZSBDX1VFWFQJCTE5CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZGVmaW5lIENfU1RBVExBQgkyMAkvKiBTdGF0aWMgbG9hZCB0aW1lIGxhYmVsICovCi0jZGVmaW5lIENfRVhUTEFCCTIxCS8qIEV4dGVybmFsIGxvYWQgdGltZSBsYWJlbCAqLwotI2RlZmluZSBDX1NZU1RFTQkyMwkvKiBTeXN0ZW0gV2lkZSB2YXJpYWJsZSAqLwotCi0vKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBXSU5ET1dTX05UICAgKi8KLSNkZWZpbmUgQ19TRUNUSU9OICAgICAgIDEwNCAgICAgLyogc2VjdGlvbiBuYW1lICovCi0jZGVmaW5lIENfTlRfV0VBSwkxMDUJLyogd2VhayBleHRlcm5hbCAqLwotCi0gLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgODA5NjAgKi8KLQotLyogQ19MRUFGUFJPQyBpcyBvYnNvbGV0ZS4gIFVzZSBDX0xFQUZFWFQgb3IgQ19MRUFGU1RBVCAqLwotI2RlZmluZSBDX0xFQUZQUk9DCTEwOAkvKiBMZWFmIHByb2NlZHVyZSwgImNhbGwiIHZpYSBCQUwgKi8KLQotI2RlZmluZSBDX1NDQUxMCQkxMDcJLyogUHJvY2VkdXJlIHJlYWNoYWJsZSB2aWEgc3lzdGVtIGNhbGwgKi8KLSNkZWZpbmUgQ19MRUFGRVhUICAgICAgIDEwOAkvKiBFeHRlcm5hbCBsZWFmICovCi0jZGVmaW5lIENfTEVBRlNUQVQgICAgICAxMTMJLyogU3RhdGljIGxlYWYgKi8KLSNkZWZpbmUgQ19PUFRWQVIJMTA5CS8qIE9wdGltaXplZCB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ19ERUZJTkUJMTEwCS8qIFByZXByb2Nlc3NvciAjZGVmaW5lCQkqLwotI2RlZmluZSBDX1BSQUdNQQkxMTEJLyogQWR2aWNlIHRvIGNvbXBpbGVyIG9yIGxpbmtlcgkqLwotI2RlZmluZSBDX1NFR01FTlQJMTEyCS8qIDgwOTYwIHNlZ21lbnQgbmFtZQkJKi8KLQotICAvKiBTdG9yYWdlIGNsYXNzZXMgZm9yIG04OGsgKi8KLSNkZWZpbmUgQ19TSEFET1cgICAgICAgIDEwNyAgICAgLyogc2hhZG93IHN5bWJvbCAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDX1ZFUlNJT04gICAgICAgMTA4ICAgICAvKiBjb2ZmIHZlcnNpb24gc3ltYm9sICAgICAgICAgICovCi0KLSAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBSUy82MDAwICovCi0jZGVmaW5lIENfSElERVhUICAgICAgICAxMDcJLyogVW4tbmFtZWQgZXh0ZXJuYWwgc3ltYm9sICovCi0jZGVmaW5lIENfQklOQ0wgICAgICAgICAxMDgJLyogTWFya3MgYmVnaW5uaW5nIG9mIGluY2x1ZGUgZmlsZSAqLwotI2RlZmluZSBDX0VJTkNMICAgICAgICAgMTA5CS8qIE1hcmtzIGVuZGluZyBvZiBpbmNsdWRlIGZpbGUgKi8KLQotIC8qIHN0b3JhZ2UgY2xhc3NlcyBmb3Igc3RhYiBzeW1ib2xzIGZvciBSUy82MDAwICovCi0jZGVmaW5lIENfR1NZTSAgICAgICAgICAoMHg4MCkKLSNkZWZpbmUgQ19MU1lNICAgICAgICAgICgweDgxKQotI2RlZmluZSBDX1BTWU0gICAgICAgICAgKDB4ODIpCi0jZGVmaW5lIENfUlNZTSAgICAgICAgICAoMHg4MykKLSNkZWZpbmUgQ19SUFNZTSAgICAgICAgICgweDg0KQotI2RlZmluZSBDX1NUU1lNICAgICAgICAgKDB4ODUpCi0jZGVmaW5lIENfVENTWU0gICAgICAgICAoMHg4NikKLSNkZWZpbmUgQ19CQ09NTSAgICAgICAgICgweDg3KQotI2RlZmluZSBDX0VDT01MICAgICAgICAgKDB4ODgpCi0jZGVmaW5lIENfRUNPTU0gICAgICAgICAoMHg4OSkKLSNkZWZpbmUgQ19ERUNMICAgICAgICAgICgweDhjKQotI2RlZmluZSBDX0VOVFJZICAgICAgICAgKDB4OGQpCi0jZGVmaW5lIENfRlVOICAgICAgICAgICAoMHg4ZSkKLSNkZWZpbmUgQ19CU1RBVCAgICAgICAgICgweDhmKQotI2RlZmluZSBDX0VTVEFUICAgICAgICAgKDB4OTApCi0KLS8qIFN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scyAqLwotI2RlZmluZSBDX1RIVU1CRVhUICAgICAgKDEyOCArIENfRVhUKQkJLyogMTMwICovCi0jZGVmaW5lIENfVEhVTUJTVEFUICAgICAoMTI4ICsgQ19TVEFUKQkJLyogMTMxICovCi0jZGVmaW5lIENfVEhVTUJMQUJFTCAgICAoMTI4ICsgQ19MQUJFTCkJCS8qIDEzNCAqLwotI2RlZmluZSBDX1RIVU1CRVhURlVOQyAgKENfVEhVTUJFWFQgICsgMjApCS8qIDE1MCAqLwotI2RlZmluZSBDX1RIVU1CU1RBVEZVTkMgKENfVEhVTUJTVEFUICsgMjApCS8qIDE1MSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNDTk5NTEVOICg4KQotCi1zdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIgc19uYW1lW1NDTk5NTEVOXTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQotICAvKiBQaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYi4KLSAgICAgSW4gdGhlIHBlaSBmb3JtYXQsIHRoaXMgZmllbGQgaXMgdGhlIHZpcnR1YWwgc2VjdGlvbiBzaXplCi0gICAgICh0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBhZnRlciBiZWluZyBsb2FkZWQgaW50IG1lbW9yeSksCi0gICAgIE5PVCB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgc19wYWRkcjsKLQotICBiZmRfdm1hIHNfdmFkZHI7CQkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGJmZF92bWEgc19zaXplOwkJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgYmZkX3ZtYSBzX3NjbnB0cjsJCS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGJmZF92bWEgc19yZWxwdHI7CQkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGJmZF92bWEgc19sbm5vcHRyOwkJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGxvbmcgc19ucmVsb2M7CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgbG9uZyBzX25sbm5vOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGxvbmcgc19mbGFnczsJCQkvKiBmbGFncwkJCSovCi0gIGxvbmcgc19hbGlnbjsJCQkvKiB1c2VkIG9uIEk5NjAJCQkqLwotfTsKLQotLyoKLSAqIHNfZmxhZ3MgInR5cGUiCi0gKi8KLSNkZWZpbmUgU1RZUF9SRUcJICgweDAwMDApCS8qICJyZWd1bGFyIjogYWxsb2NhdGVkLCByZWxvY2F0ZWQsIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0RTRUNUCSAoMHgwMDAxKQkvKiAiZHVtbXkiOiAgcmVsb2NhdGVkIG9ubHkqLwotI2RlZmluZSBTVFlQX05PTE9BRAkgKDB4MDAwMikJLyogIm5vbG9hZCI6IGFsbG9jYXRlZCwgcmVsb2NhdGVkLCBub3QgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfR1JPVVAJICgweDAwMDQpCS8qICJncm91cGVkIjogZm9ybWVkIG9mIGlucHV0IHNlY3Rpb25zICovCi0jZGVmaW5lIFNUWVBfUEFECSAoMHgwMDA4KQkvKiAicGFkZGluZyI6IG5vdCBhbGxvY2F0ZWQsIG5vdCByZWxvY2F0ZWQsIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0NPUFkJICgweDAwMTApCS8qICJjb3B5IjogZm9yIGRlY2lzaW9uIGZ1bmN0aW9uIHVzZWQgYnkgZmllbGQgdXBkYXRlOyAgbm90IGFsbG9jYXRlZCwgbm90IHJlbG9jYXRlZCwKLQkJCQkJCQkJCSAgICAgbG9hZGVkOyByZWxvYyAmIGxpbmVubyBlbnRyaWVzIHByb2Nlc3NlZCBub3JtYWxseSAqLwotI2RlZmluZSBTVFlQX1RFWFQJICgweDAwMjApCS8qIHNlY3Rpb24gY29udGFpbnMgdGV4dCBvbmx5ICovCi0jZGVmaW5lIFNfU0hSU0VHCSAoMHgwMDIwKQkvKiBJbiAzYiBVcGRhdGUgZmlsZXMgKG91dHB1dCBvZiBvZ2VuKSwgc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIFNIQVJFRCBzZWdtZW50cyBvZiB0aGUgUGZpbGUKLQkJCQkJCQkJCSAgICAgd2lsbCBoYXZlIHRoZSBTX1NIUlNFRyBmbGFnIHNldCBieSBvZ2VuLCB0byBpbmZvcm0gZHVmciB0aGF0IHVwZGF0aW5nIDEgY29weSBvZiB0aGUgcHJvYy4gd2lsbAotCQkJCQkJCQkJICAgICB1cGRhdGUgYWxsIHByb2Nlc3MgaW52b2NhdGlvbnMuICovCi0jZGVmaW5lIFNUWVBfREFUQQkgKDB4MDA0MCkJLyogc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkgKi8KLSNkZWZpbmUgU1RZUF9CU1MJICgweDAwODApCS8qIHNlY3Rpb24gY29udGFpbnMgYnNzIG9ubHkgKi8KLSNkZWZpbmUgU19ORVdGQ04JICgweDAxMDApCS8qIEluIGEgbWluaW1hbCBmaWxlIG9yIGFuIHVwZGF0ZSBmaWxlLCBhIG5ldyBmdW5jdGlvbiAoYXMgY29tcGFyZWQgd2l0aCBhIHJlcGxhY2VkIGZ1bmN0aW9uKSAqLwotI2RlZmluZSBTVFlQX0lORk8JICgweDAyMDApCS8qIGNvbW1lbnQ6IG5vdCBhbGxvY2F0ZWQgbm90IHJlbG9jYXRlZCwgbm90IGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX09WRVIJICgweDA0MDApCS8qIG92ZXJsYXk6IHJlbG9jYXRlZCBub3QgYWxsb2NhdGVkIG9yIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0xJQgkgKDB4MDgwMCkJLyogZm9yIC5saWI6IHNhbWUgYXMgSU5GTyAqLwotI2RlZmluZSBTVFlQX01FUkdFCSAoMHgyMDAwKQkvKiBtZXJnZSBzZWN0aW9uIC0tIGNvbWJpbmVzIHdpdGggdGV4dCwgZGF0YSBvciBic3Mgc2VjdGlvbnMgb25seSAqLwotI2RlZmluZSBTVFlQX1JFVkVSU0VfUEFEICgweDQwMDApCS8qIHNlY3Rpb24gd2lsbCBiZSBwYWRkZWQgd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlcmV2ZXIgcGFkZGluZyBpcyBuZWNlc3NhcnkgYW5kIHRoZXJlIGlzIGEKLQkJCQkJCi0JCQkJCQkJCQkgICAgIHdvcmQgb2YgY29udGlndW91cyBieXRlcwotCQkJCQkJCQkJICAgICBiZWdpbm5pbmcgb24gYSB3b3JkIGJvdW5kYXJ5LiAqLwotCi0jZGVmaW5lIFNUWVBfTElUCTB4ODAyMAkvKiBMaXRlcmFsIGRhdGEgKGxpa2UgU1RZUF9URVhUKSAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi0KLXN0cnVjdCBpbnRlcm5hbF9saW5lbm8KLXsKLSAgdW5pb24KLSAgewotICAgIGxvbmcgbF9zeW1uZHg7CQkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLSAgICBsb25nIGxfcGFkZHI7CQkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLSAgfSAgICAgbF9hZGRyOwotICB1bnNpZ25lZCBsb25nIGxfbG5ubzsJCS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBESU1OVU0JCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50Ci17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIF9uX25hbWVbU1lNTk1MRU5dOwkvKiBvbGQgQ09GRiB2ZXJzaW9uCSovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgbG9uZyBfbl96ZXJvZXM7CQkvKiBuZXcgPT0gMAkJKi8KLSAgICAgIGxvbmcgX25fb2Zmc2V0OwkJLyogb2Zmc2V0IGludG8gc3RyaW5nIHRhYmxlICovCi0gICAgfSAgICAgIF9uX247Ci0gICAgY2hhciAqX25fbnB0clsyXTsJCS8qIGFsbG93cyBmb3Igb3ZlcmxheWluZwkqLwotICB9ICAgICBfbjsKLSAgbG9uZyBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbAkJKi8KLSAgc2hvcnQgbl9zY251bTsJCS8qIHNlY3Rpb24gbnVtYmVyCQkqLwotICB1bnNpZ25lZCBzaG9ydCBuX2ZsYWdzOwkvKiBjb3B5IG9mIGZsYWdzIGZyb20gZmlsaGRyCSovCi0gIHVuc2lnbmVkIHNob3J0IG5fdHlwZTsJLyogdHlwZSBhbmQgZGVyaXZlZCB0eXBlCSovCi0gIHVuc2lnbmVkIGNoYXIgbl9zY2xhc3M7CS8qIHN0b3JhZ2UgY2xhc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIgbl9udW1hdXg7CS8qIG51bWJlciBvZiBhdXguIGVudHJpZXMJKi8KLX07Ci0KLSNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCi0jZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCi0jZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0Ci0KLQotLyogUmVsb2NhdGFibGUgc3ltYm9scyBoYXZlIG51bWJlciBvZiB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkLAotICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmc6ICovCi0KLSNkZWZpbmUgTl9VTkRFRgkoKHNob3J0KTApCS8qIHVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMJKChzaG9ydCktMSkJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCi0jZGVmaW5lIE5fREVCVUcJKChzaG9ydCktMikJLyogZGVidWdnaW5nIHN5bWJvbCAtLSB2YWx1ZSBpcyBtZWFuaW5nbGVzcyAqLwotI2RlZmluZSBOX1RWCSgoc2hvcnQpLTMpCS8qIGluZGljYXRlcyBzeW1ib2wgbmVlZHMgcHJlbG9hZCB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgUF9UVgkoKHNob3J0KS00KQkvKiBpbmRpY2F0ZXMgc3ltYm9sIG5lZWRzIHBvc3Rsb2FkIHRyYW5zZmVyIHZlY3RvciovCi0KLS8qCi0gKiBUeXBlIG9mIGEgc3ltYm9sLCBpbiBsb3cgTiBiaXRzIG9mIHRoZSB3b3JkCi0gKi8KLSNkZWZpbmUgVF9OVUxMCQkwCi0jZGVmaW5lIFRfVk9JRAkJMQkvKiBmdW5jdGlvbiBhcmd1bWVudCAob25seSB1c2VkIGJ5IGNvbXBpbGVyKSAqLwotI2RlZmluZSBUX0NIQVIJCTIJLyogY2hhcmFjdGVyCQkqLwotI2RlZmluZSBUX1NIT1JUCQkzCS8qIHNob3J0IGludGVnZXIJKi8KLSNkZWZpbmUgVF9JTlQJCTQJLyogaW50ZWdlcgkJKi8KLSNkZWZpbmUgVF9MT05HCQk1CS8qIGxvbmcgaW50ZWdlcgkJKi8KLSNkZWZpbmUgVF9GTE9BVAkJNgkvKiBmbG9hdGluZyBwb2ludAkqLwotI2RlZmluZSBUX0RPVUJMRQk3CS8qIGRvdWJsZSB3b3JkCQkqLwotI2RlZmluZSBUX1NUUlVDVAk4CS8qIHN0cnVjdHVyZSAJCSovCi0jZGVmaW5lIFRfVU5JT04JCTkJLyogdW5pb24gCQkqLwotI2RlZmluZSBUX0VOVU0JCTEwCS8qIGVudW1lcmF0aW9uIAkJKi8KLSNkZWZpbmUgVF9NT0UJCTExCS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbiovCi0jZGVmaW5lIFRfVUNIQVIJCTEyCS8qIHVuc2lnbmVkIGNoYXJhY3RlcgkqLwotI2RlZmluZSBUX1VTSE9SVAkxMwkvKiB1bnNpZ25lZCBzaG9ydAkqLwotI2RlZmluZSBUX1VJTlQJCTE0CS8qIHVuc2lnbmVkIGludGVnZXIJKi8KLSNkZWZpbmUgVF9VTE9ORwkJMTUJLyogdW5zaWduZWQgbG9uZwkqLwotI2RlZmluZSBUX0xOR0RCTAkxNgkvKiBsb25nIGRvdWJsZQkJKi8KLQotLyoKLSAqIGRlcml2ZWQgdHlwZXMsIGluIG5fdHlwZQotKi8KLSNkZWZpbmUgRFRfTk9OCQkoMCkJLyogbm8gZGVyaXZlZCB0eXBlICovCi0jZGVmaW5lIERUX1BUUgkJKDEpCS8qIHBvaW50ZXIgKi8KLSNkZWZpbmUgRFRfRkNOCQkoMikJLyogZnVuY3Rpb24gKi8KLSNkZWZpbmUgRFRfQVJZCQkoMykJLyogYXJyYXkgKi8KLQotI2RlZmluZSBCVFlQRSh4KQkoKHgpICYgTl9CVE1BU0spCi0jZGVmaW5lIERUWVBFKHgpCSgoKHgpICYgTl9UTUFTSykgPj4gTl9CVFNIRlQpCi0KLSNkZWZpbmUgSVNQVFIoeCkgXAotICAoKCh1bnNpZ25lZCBsb25nKSAoeCkgJiBOX1RNQVNLKSA9PSAoKHVuc2lnbmVkIGxvbmcpIERUX1BUUiA8PCBOX0JUU0hGVCkpCi0jZGVmaW5lIElTRkNOKHgpIFwKLSAgKCgodW5zaWduZWQgbG9uZykgKHgpICYgTl9UTUFTSykgPT0gKCh1bnNpZ25lZCBsb25nKSBEVF9GQ04gPDwgTl9CVFNIRlQpKQotI2RlZmluZSBJU0FSWSh4KSBcCi0gICgoKHVuc2lnbmVkIGxvbmcpICh4KSAmIE5fVE1BU0spID09ICgodW5zaWduZWQgbG9uZykgRFRfQVJZIDw8IE5fQlRTSEZUKSkKLSNkZWZpbmUgSVNUQUcoeCkgXAotICAoKHgpID09IENfU1RSVEFHIHx8ICh4KSA9PSBDX1VOVEFHIHx8ICh4KSA9PSBDX0VOVEFHKQotI2RlZmluZSBERUNSRUYoeCkgXAotICAoKCgoeCkgPj4gTl9UU0hJRlQpICYgfiBOX0JUTUFTSykgfCAoKHgpICYgTl9CVE1BU0spKQotCi11bmlvbiBpbnRlcm5hbF9hdXhlbnQKLXsKLSAgc3RydWN0Ci0gIHsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgbG9uZyBsOwkJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLSAgICAgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7Ci0gICAgfSAgICAgeF90YWduZHg7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHhfbG5ubzsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCB4X3NpemU7CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9ICAgICAgeF9sbnN6OwotICAgICAgbG9uZyB4X2ZzaXplOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotICAgIH0gICAgIHhfbWlzYzsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7CQkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCWxvbmcgeF9sbm5vcHRyOwkJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQl1bmlvbgotCXsJCQkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkgIGxvbmcgbDsKLQkgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7Ci0JfSAgICAgeF9lbmRuZHg7Ci0gICAgICB9ICAgICAgeF9mY247Ci0KLSAgICAgIHN0cnVjdAotICAgICAgewkJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQl1bnNpZ25lZCBzaG9ydCB4X2RpbWVuW0RJTU5VTV07Ci0gICAgICB9ICAgICAgeF9hcnk7Ci0gICAgfSAgICAgeF9mY25hcnk7Ci0KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3R2bmR4OwkvKiB0diBpbmRleCAqLwotICB9ICAgICAgeF9zeW07Ci0KLSAgdW5pb24KLSAgewotICAgIGNoYXIgeF9mbmFtZVtGSUxOTUxFTl07Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgbG9uZyB4X3plcm9lczsKLSAgICAgIGxvbmcgeF9vZmZzZXQ7Ci0gICAgfSAgICAgIHhfbjsKLSAgfSAgICAgeF9maWxlOwotCi0gIHN0cnVjdAotICB7Ci0gICAgbG9uZyB4X3NjbmxlbjsJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9ucmVsb2M7CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9ubGlubm87CS8qICMgbGluZSBudW1iZXJzICovCi0gICAgdW5zaWduZWQgbG9uZyB4X2NoZWNrc3VtOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSBmb3IgUEUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X2Fzc29jaWF0ZWQ7IC8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggZm9yIFBFICovCi0gICAgdW5zaWduZWQgY2hhciB4X2NvbWRhdDsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgZm9yIFBFICovCi0gIH0gICAgICB4X3NjbjsKLQotICBzdHJ1Y3QKLSAgewotICAgIGxvbmcgeF90dmZpbGw7CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF90dmxlbjsJLyogbGVuZ3RoIG9mIC50diAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfdHZyYW5bMl07CS8qIHR2IHJhbmdlICovCi0gIH0gICAgICB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIFJTLzYwMDAtc3BlY2lmaWMgYXV4ZW50IC0gbGFzdCBhdXhlbnQgZm9yIGV2ZXJ5IGV4dGVybmFsIHN5bWJvbAotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBzdHJ1Y3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7CQkJCS8qIGNzZWN0IGxlbmd0aCBvciBlbmNsb3NpbmcgY3NlY3QgKi8KLQlsb25nIGw7Ci0Jc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLSAgICAgIH0geF9zY25sZW47Ci0gICAgbG9uZyB4X3Bhcm1oYXNoOwkJLyogcGFybSB0eXBlIGhhc2ggaW5kZXggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3NuaGFzaDsJLyogc2VjdCBudW0gd2l0aCBwYXJtIGhhc2ggKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfc210eXA7CS8qIHN5bWJvbCBhbGlnbiBhbmQgdHlwZSAqLwotICAgIC8qIDAtNCAtIExvZyAyIG9mIGFsaWdubWVudCAqLwotICAgIC8qIDUtNyAtIHN5bWJvbCB0eXBlICovCi0gICAgdW5zaWduZWQgY2hhciB4X3NtY2xhczsJLyogc3RvcmFnZSBtYXBwaW5nIGNsYXNzICovCi0gICAgbG9uZyB4X3N0YWI7CQkvKiBkYnggc3RhYiBpbmZvIGluZGV4ICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9zbnN0YWI7CS8qIHNlY3QgbnVtIHdpdGggZGJ4IHN0YWIgKi8KLSAgfSAgICAgIHhfY3NlY3Q7CQkvKiBjc2VjdCBkZWZpbml0aW9uIGluZm9ybWF0aW9uICovCi0KLS8qIHhfc210eXAgdmFsdWVzOiAgKi8KLQotI2RlZmluZQlTTVRZUF9BTElHTih4KQkoKHgpID4+IDMpCS8qIGxvZzIgb2YgYWxpZ25tZW50ICovCi0jZGVmaW5lCVNNVFlQX1NNVFlQKHgpCSgoeCkgJiAweDcpCS8qIHN5bWJvbCB0eXBlICovCi0vKiBTeW1ib2wgdHlwZSB2YWx1ZXM6ICAqLwotI2RlZmluZQlYVFlfRVIJMAkJLyogRXh0ZXJuYWwgcmVmZXJlbmNlICovCi0jZGVmaW5lCVhUWV9TRAkxCQkvKiBDc2VjdCBkZWZpbml0aW9uICovCi0jZGVmaW5lCVhUWV9MRAkyCQkvKiBMYWJlbCBkZWZpbml0aW9uICovCi0jZGVmaW5lIFhUWV9DTQkzCQkvKiAuQlNTICovCi0jZGVmaW5lCVhUWV9FTQk0CQkvKiBFcnJvciBtZXNzYWdlICovCi0jZGVmaW5lCVhUWV9VUwk1CQkvKiAiUmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSIgKi8KLQotLyogeF9zbWNsYXMgdmFsdWVzOiAgKi8KLQotI2RlZmluZQlYTUNfUFIJMAkJLyogUmVhZC1vbmx5IHByb2dyYW0gY29kZSAqLwotI2RlZmluZQlYTUNfUk8JMQkJLyogUmVhZC1vbmx5IGNvbnN0YW50ICovCi0jZGVmaW5lCVhNQ19EQgkyCQkvKiBSZWFkLW9ubHkgZGVidWcgZGljdGlvbmFyeSB0YWJsZSAqLwotI2RlZmluZQlYTUNfVEMJMwkJLyogUmVhZC13cml0ZSBnZW5lcmFsIFRPQyBlbnRyeSAqLwotI2RlZmluZQlYTUNfVUEJNAkJLyogUmVhZC13cml0ZSB1bmNsYXNzaWZpZWQgKi8KLSNkZWZpbmUJWE1DX1JXCTUJCS8qIFJlYWQtd3JpdGUgZGF0YSAqLwotI2RlZmluZQlYTUNfR0wJNgkJLyogUmVhZC1vbmx5IGdsb2JhbCBsaW5rYWdlICovCi0jZGVmaW5lCVhNQ19YTwk3CQkvKiBSZWFkLW9ubHkgZXh0ZW5kZWQgb3BlcmF0aW9uICovCi0jZGVmaW5lCVhNQ19TVgk4CQkvKiBSZWFkLW9ubHkgc3VwZXJ2aXNvciBjYWxsICovCi0jZGVmaW5lCVhNQ19CUwk5CQkvKiBSZWFkLXdyaXRlIEJTUyAqLwotI2RlZmluZQlYTUNfRFMJMTAJCS8qIFJlYWQtd3JpdGUgZGVzY3JpcHRvciBjc2VjdCAqLwotI2RlZmluZQlYTUNfVUMJMTEJCS8qIFJlYWQtd3JpdGUgdW5uYW1lZCBGb3J0cmFuIGNvbW1vbiAqLwotI2RlZmluZQlYTUNfVEkJMTIJCS8qIFJlYWQtb25seSB0cmFjZWJhY2sgaW5kZXggY3NlY3QgKi8KLSNkZWZpbmUJWE1DX1RCCTEzCQkvKiBSZWFkLW9ubHkgdHJhY2ViYWNrIHRhYmxlIGNzZWN0ICovCi0vKiAJCTE0CT8/PyAqLwotI2RlZmluZQlYTUNfVEMwCTE1CQkvKiBSZWFkLXdyaXRlIFRPQyBhbmNob3IgKi8KLSNkZWZpbmUgWE1DX1RECTE2CQkvKiBSZWFkLXdyaXRlIGRhdGEgaW4gVE9DICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiAgSTk2MC1zcGVjaWZpYyAqMm5kKiBhdXguIGVudHJ5IGZvcm1hdHMKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgc3RydWN0Ci0gIHsKLSAgICAvKiBUaGlzIGlzIGEgdmVyeSBvbGQgdHlwbyB0aGF0IGtlZXBzIGdldHRpbmcgcHJvcGFnYXRlZC4gKi8KLSNkZWZpbmUgeF9zdGRpbmR4IHhfc3RpbmR4Ci0gICAgbG9uZyB4X3N0aW5keDsJCS8qIHN5cy4gdGFibGUgZW50cnkgKi8KLSAgfSAgICAgIHhfc2M7CQkJLyogc3lzdGVtIGNhbGwgZW50cnkgKi8KLQotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgeF9iYWxudHJ5OwkvKiBCQUwgZW50cnkgcG9pbnQgKi8KLSAgfSAgICAgIHhfYmFsOwkJCS8qIEJBTC1jYWxsYWJsZSBmdW5jdGlvbiAqLwotCi0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyB4X3RpbWVzdGFtcDsJLyogdGltZSBzdGFtcCAqLwotICAgIGNoYXIgeF9pZHN0cmluZ1syMF07CS8qIHByb2R1Y2VyIGlkZW50aXR5IHN0cmluZyAqLwotICB9ICAgICAgeF9pZGVudDsJCS8qIFByb2R1Y2VyIGlkZW50IGluZm8gKi8KLQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBpbnRlcm5hbF9yZWxvYwotewotICBiZmRfdm1hIHJfdmFkZHI7CQkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgcmVmZXJlbmNlICovCi0gIGxvbmcgcl9zeW1uZHg7CQkvKiBJbmRleCBpbnRvIHN5bWJvbCB0YWJsZQkqLwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7CS8qIFJlbG9jYXRpb24gdHlwZQkJKi8KLSAgdW5zaWduZWQgY2hhciByX3NpemU7CQkvKiBVc2VkIGJ5IFJTLzYwMDAgYW5kIEVDT0ZGCSovCi0gIHVuc2lnbmVkIGNoYXIgcl9leHRlcm47CS8qIFVzZWQgYnkgRUNPRkYJCSovCi0gIHVuc2lnbmVkIGxvbmcgcl9vZmZzZXQ7CS8qIFVzZWQgYnkgQWxwaGEgRUNPRkYsIFNQQVJDLCBvdGhlcnMgKi8KLX07Ci0KLSNkZWZpbmUgUl9ESVIxNiAJIDEKLSNkZWZpbmUgUl9ESVIzMiAJIDYKLSNkZWZpbmUgUl9JTUFHRUJBU0UJIDcKLSNkZWZpbmUgUl9SRUxCWVRFCTE1Ci0jZGVmaW5lIFJfUkVMV09SRAkxNgotI2RlZmluZSBSX1JFTExPTkcJMTcKLSNkZWZpbmUgUl9QQ1JCWVRFCTE4Ci0jZGVmaW5lIFJfUENSV09SRAkxOQotI2RlZmluZSBSX1BDUkxPTkcJMjAKLSNkZWZpbmUgUl9JUFJTSE9SVAkyNAotI2RlZmluZSBSX0lQUkxPTkcJMjYKLSNkZWZpbmUgUl9HRVRTRUcJMjkKLSNkZWZpbmUgUl9HRVRQQSAJMzAKLSNkZWZpbmUgUl9UQUdXT1JECTMxCi0jZGVmaW5lIFJfSlVNUFRBUkcJMzIJLyogc3RyYW5nZSAyOWsgMDB4eDAweHggcmVsb2MgKi8KLQotI2RlZmluZSBSX1BDUjE2TCAgICAgICAxMjgKLSNkZWZpbmUgUl9QQ1IyNkwgICAgICAgMTI5Ci0jZGVmaW5lIFJfVlJUMTYgICAgICAgIDEzMAotI2RlZmluZSBSX0hWUlQxNiAgICAgICAxMzEKLSNkZWZpbmUgUl9MVlJUMTYgICAgICAgMTMyCi0jZGVmaW5lIFJfVlJUMzIgICAgICAgIDEzMwotCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2l0aCBhIDE2Yml0IGFic29sdXRlCi0gICBhZGRyZXNzLiAgVGhlIGxpbmtlciB0cmllcyB0byB0dXJuIGluc25zIHdpdGggdGhpcyByZWxvYyBpbnRvCi0gICBhbiBhYnNvbHV0ZSA4LWJpdCBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1YxNkIxICAgIAkweDQxCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2hpY2ggaGFkIGEgMTZiaXQKLSAgIGFic29sdXRlIGFkZHJlc3Mgd2hpY2ggaGF2ZSBiZWVuIHNob3J0ZW5lZCBpbnRvIGEgOC1iaXQKLSAgIGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjE2QjIgCTB4NDIKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGptcCBpbnNucyB3aXRoIGEgMTZiaXQgdGFyZ2V0IGFkZHJlc3M7Ci0gICB0aGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gdGhlc2UgaW5zbnMgaW50byBicmEgaW5zbnMgd2l0aAotICAgYW4gOGJpdCBwYy1yZWxhdGl2ZSB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUDEgICAgIAkweDQzCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGJyYSB3aXRoIGFuIDgtYml0IHBjLXJlbGF0aXZlCi0gICB0YXJnZXQgdGhhdCB3YXMgZm9ybWVybGx5IGEgam1wIGluc24gd2l0aCBhIDE2Yml0IHRhcmdldC4gICovCi0jZGVmaW5lIFJfSk1QMiAJCTB4NDQKLQotLyogPz8/ICovCi0jZGVmaW5lIFJfUkVMTE9OR19ORUcgIAkweDQ1Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBqbXAgaW5zbnMgd2l0aCBhIDI0Yml0IHRhcmdldCBhZGRyZXNzOwotICAgdGhlIGxpbmtlciB0cmllcyB0byB0dXJuIHRoZXNlIGluc25zIGludG8gYnJhIGluc25zIHdpdGgKLSAgIGFuIDhiaXQgcGMtcmVsYXRpdmUgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVBMMSAgICAgCTB4NDYKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgYnJhIHdpdGggYW4gOC1iaXQgcGMtcmVsYXRpdmUKLSAgIHRhcmdldCB0aGF0IHdhcyBmb3JtZXJsbHkgYSBqbXAgaW5zbiB3aXRoIGEgMjRiaXQgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVBMMgkJMHg0NwotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92LmIgaW5zdHJ1Y3Rpb25zIHdpdGggYSAyNGJpdCBhYnNvbHV0ZQotICAgYWRkcmVzcy4gIFRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiBpbnNucyB3aXRoIHRoaXMgcmVsb2MgaW50bwotICAgYW4gYWJzb2x1dGUgOC1iaXQgYWRkcmVzcy4gICovCi0KLSNkZWZpbmUgUl9NT1YyNEIxICAgIAkweDQ4Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2hpY2ggaGFkIGEgMjRiaXQKLSAgIGFic29sdXRlIGFkZHJlc3Mgd2hpY2ggaGF2ZSBiZWVuIHNob3J0ZW5lZCBpbnRvIGEgOC1iaXQKLSAgIGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjI0QjIgCTB4NDkKLQotLyogQW4gaDgzMDAgbWVtb3J5IGluZGlyZWN0IGp1bXAvY2FsbC4gIEZvcmNlcyB0aGUgYWRkcmVzcyBvZiB0aGUganVtcC9jYWxsCi0gICB0YXJnZXQgaW50byB0aGUgZnVuY3Rpb24gdmVjdG9yIChpbiBwYWdlIHplcm8pLCBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICB2ZWN0b3IgZW50cnkgdG8gYmUgcGxhY2VkIGluIHRoZSBqdW1wL2NhbGwgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSX01FTV9JTkRJUkVDVAkweDRhCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0YXJnZXQgd2hpY2ggd2FzCi0gICBzaG9ydGVuZWQgaW50byBhbiA4Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0YXJnZXQuICAqLwotI2RlZmluZSBSX1BDUldPUkRfQgkweDRiCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuW3dsXSBpbnN0cnVjdGlvbnMgd2l0aCBhIDMyLzI0IGJpdAotICAgYWJzb2x1dGUgYWRkcmVzczsgdGhlIGxpbmtlciBtYXkgdHVybiB0aGlzIGludG8gYSBtb3YuW3dsXQotICAgaW5zbiB3aXRoIGEgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WTDEgICAgCTB4NGMKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5bd2xdIGluc25zIHdoaWNoIGZvcm1lcmxseSBoYWQKLSAgIGEgMzIvMjRiaXQgYWJzb2x1dGUgYWRkcmVzcyBhbmQgaG93IGhhdmUgYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1ZMMiAJMHg0ZAotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBiQ0M6OCB3aGljaCB3aWxsIGhhdmUgaXQncyBjb25kaXRpb24KLSAgIGludmVydGVkIGFuZCBpdHMgdGFyZ2V0IHJlZGlyZWN0ZWQgdG8gdGhlIHRhcmdldCBvZiB0aGUgYnJhbmNoCi0gICBpbiB0aGUgZm9sbG93aW5nIGluc24uICAqLwotI2RlZmluZSBSX0JDQ19JTlYJMHg0ZQotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBqbXAgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYmVlbiBkZWxldGVkLiAgKi8KLSNkZWZpbmUgUl9KTVBfREVMCTB4NGYKLQotLyogWjhrIG1vZGVzICovCi0jZGVmaW5lIFJfSU1NMTYgICAweDAxCQkvKiAxNiBiaXQgYWJzICovCi0jZGVmaW5lIFJfSlIJICAweDAyCQkvKiBqciAgOCBiaXQgZGlzcCAqLwotI2RlZmluZSBSX0lNTTRMICAgMHgyMwkJLyogbG93IG5pYmJsZSAqLwotI2RlZmluZSBSX0lNTTggICAgMHgyMgkJLyogOCBiaXQgYWJzICovCi0jZGVmaW5lIFJfSU1NMzIgICBSX1JFTExPTkcJLyogMzIgYml0IGFicyAqLwotI2RlZmluZSBSX0NBTEwgICAgUl9EQQkJLyogQWJzb2x1dGUgYWRkcmVzcyB3aGljaCBjb3VsZCBiZSBhIGNhbGxyICovCi0jZGVmaW5lIFJfSlAJICBSX0RBCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGNvdWxkIGJlIGEganAgKi8KLSNkZWZpbmUgUl9SRUwxNiAgIDB4MDQJCS8qIDE2IGJpdCBQQyByZWwgKi8KLSNkZWZpbmUgUl9DQUxMUgkgIDB4MDUJCS8qIGNhbGxyIDEyIGJpdCBkaXNwICovCi0jZGVmaW5lIFJfU0VHICAgICAweDEwCQkvKiBzZXQgaWYgaW4gc2VnbWVudGVkIG1vZGUgKi8KLSNkZWZpbmUgUl9JTU00SCAgIDB4MjQJCS8qIGhpZ2ggbmliYmxlICovCi0jZGVmaW5lIFJfRElTUDcgICAweDI1ICAgICAgICAgIC8qIGRqbnogZGlzcGxhY2VtZW50ICovCi0KLS8qIEg4NTAwIG1vZGVzICovCi0KLSNkZWZpbmUgUl9IODUwMF9JTU04ICAJMQkJLyogIDggYml0IGltbWVkaWF0ZSAJKi8KLSNkZWZpbmUgUl9IODUwMF9JTU0xNiAJMgkJLyogMTYgYml0IGltbWVkaWF0ZQkqLwotI2RlZmluZSBSX0g4NTAwX1BDUkVMOCAJMwkJLyogIDggYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX0g4NTAwX1BDUkVMMTYgNAkJLyogMTYgYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX0g4NTAwX0hJR0g4ICAJNQkJLyogaGlnaCA4IGJpdHMgb2YgMjQgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9IODUwMF9MT1cxNiAJNwkJLyogbG93IDE2IGJpdHMgb2YgMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX0g4NTAwX0lNTTI0CTYJCS8qIDI0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9IODUwMF9JTU0zMiAgIDggICAgICAgICAgICAgICAvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfSDg1MDBfSElHSDE2ICA5CQkvKiBoaWdoIDE2IGJpdHMgb2YgMzIgYml0IGltbWVkaWF0ZSAqLwotCi0vKiBXNjUgbW9kZXMgKi8KLQotI2RlZmluZSBSX1c2NV9BQlM4CTEgIC8qIGFkZHIgJiAweGZmIAkJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMTYJMiAgLyogYWRkciAmIDB4ZmZmZiAJCSovCi0jZGVmaW5lIFJfVzY1X0FCUzI0CTMgIC8qIGFkZHIgJiAweGZmZmZmZiAJCSovCi0KLSNkZWZpbmUgUl9XNjVfQUJTOFM4ICAgIDQgIC8qIChhZGRyID4+IDgpICYgMHhmZiAJKi8KLSNkZWZpbmUgUl9XNjVfQUJTOFMxNiAgIDUgIC8qIChhZGRyID4+IDE2KSAmIDB4ZmYgCSovCi0KLSNkZWZpbmUgUl9XNjVfQUJTMTZTOCAgIDYgIC8qIChhZGRyID4+IDgpICYgMGZmZmYgCSovCi0jZGVmaW5lIFJfVzY1X0FCUzE2UzE2ICA3ICAvKiAoYWRkciA+PiAxNikgJiAwZmZmZiAJKi8KLQotI2RlZmluZSBSX1c2NV9QQ1I4CTgKLSNkZWZpbmUgUl9XNjVfUENSMTYJOQotCi0jZGVmaW5lIFJfVzY1X0RQICAgICAgIDEwICAvKiBkaXJlY3QgcGFnZSA4IGJpdHMgb25seSAgICovCi0KLSNlbmRpZiAvKiBHTlVfQ09GRl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbTY4ay5oIGIvaW5jbHVkZS9jb2ZmL202OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxNDdlZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgTTY4SyAqLwotCi0jaWZuZGVmIEdOVV9DT0ZGX002OEtfSAotI2RlZmluZSBHTlVfQ09GRl9NNjhLX0ggMQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBNb3Rvcm9sYSA2ODAwMC82ODAwOC82ODAxMC82ODAyMCAqLwotI2RlZmluZQlNQzY4TUFHSUMJMDUyMAotI2RlZmluZSBNQzY4S1dSTUFHSUMJMDUyMAkvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNQzY4VFZNQUdJQwkwNTIxCi0jZGVmaW5lIE1DNjhLUk9NQUdJQwkwNTIxCS8qIHJlYWRvbmx5IHNoYXJlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIE1DNjhLUEdNQUdJQwkwNTIyCS8qIGRlbWFuZCBwYWdlZCB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU02OE1BR0lDCTAyMTAKLSNkZWZpbmUJTTY4VFZNQUdJQwkwMjExCi0KLS8qIHRoaXMgaXMgdGhlIG1hZ2ljIG9mIHRoZSBCdWxsIGRweC8yICovCi0jZGVmaW5lIE1DNjhLQkNTTUFHSUMJMDUyNgotCi0vKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KLQotI2RlZmluZSBMWU5YQ09GRk1BR0lDCTA0MTUKLQotI2RlZmluZSBPTUFHSUMgTTY4TUFHSUMKLQotLyogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGluY2x1ZGUgTUM2OEtCQ1NNQUdJQzsgaXQgb25seSBpbmNsdWRlcwotICAgbWFnaWMgbnVtYmVycyB3aGljaCBpbXBseSB0aGF0IG5hbWVzIGRvIG5vdCBoYXZlIHVuZGVyc2NvcmVzLiAgKi8KLSNkZWZpbmUgTTY4S0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NQzY4TUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtXUk1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhUVk1BR0lDKSAmJiBcCi0gICgoeCkuZl9tYWdpYyE9TUM2OEtST01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhLUEdNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NNjhUVk1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPUxZTlhDT0ZGTUFHSUMpICkKLQotLyogTWFnaWMgbnVtYmVycyBmb3IgdGhlIGEub3V0IGhlYWRlci4gICovCi0KLSNkZWZpbmUgUEFHRU1BR0lDRVhFQ1NXQVBQRUQgIDA0MDcgLyogZXhlY3V0YWJsZSAoc3dhcHBlZCkgKi8KLSNkZWZpbmUgUEFHRU1BR0lDUEVYRUNTV0FQUEVEIDA0MTAgLyogcHVyZSBleGVjdXRhYmxlIChzd2FwcGVkKSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1RTSExJQiAgMDQ0MyAvKiBwdXJlIGV4ZWN1dGFibGUgKHRhcmdldCBzaGFyZWQgbGlicmFyeSkgKi8KLSNkZWZpbmUgUEFHRU1BR0lDUEVYRUNQQUdFRCAgIDA0MTMgLyogcHVyZSBleGVjdXRhYmxlIChwYWdlZCkgKi8KLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotICBjaGFyIHJfb2Zmc2V0WzRdOwotI2VuZGlmCi0KLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLQotI2lmZGVmIE02OEtfQ09GRl9PRkZTRVQKLSNkZWZpbmUgUkVMU1ogMTQKLSNlbHNlCi0jZGVmaW5lIFJFTFNaIDEwCi0jZW5kaWYKLQotI2VuZGlmIC8qIEdOVV9DT0ZGX002OEtfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL204OGsuaCBiL2luY2x1ZGUvY29mZi9tODhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNmViNDEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL204OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIDg4ayBiY3MgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIE1DODhNQUdJQyAgMDU0MCAgICAgICAgICAgLyogODhrIEJDUyBleGVjdXRhYmxlICovCi0jZGVmaW5lIE1DODhETUFHSUMgMDU0MSAgICAgICAgICAgLyogREcvVVggZXhlY3V0YWJsZSAgICovCi0jZGVmaW5lIE1DODhPTUFHSUMgMDU1NQkgICAgICAgICAgLyogT2JqZWN0IGZpbGUgICAgICAgICovCi0KLSNkZWZpbmUgTUM4OEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NQzg4TUFHSUMpICYmKCh4KS5mX21hZ2ljIT1NQzg4RE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMgIT0gTUM4OE9NQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIFBBR0VNQUdJQzMgMDQxNCAvKiBTcGxpdCBpJmQsIHplcm8gbWFwcGVkICovCi0jZGVmaW5lIFBBR0VNQUdJQ0JDUyAwNDEzCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0vKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIAotewotICBjaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIGNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBjaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgY2hhcgkJc19ucmVsb2NbNF07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgY2hhcgkJc19ubG5ub1s0XTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICBjaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQ0Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0KLQljaGFyIGxfbG5ub1s0XTsKLQotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci0gIGNoYXIgcGFkMlsyXTsKLX07Ci0KLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJMDE3Ci0jZGVmaW5lIE5fVE1BU0sJCTA2MAotI2RlZmluZSBOX0JUU0hGVAk0Ci0jZGVmaW5lIE5fVFNISUZUCTIKLQotCi0vKiBOb3RlIHRoYXQgdGhpcyBpc24ndCB0aGUgc2FtZSBzaGFwZSBhcyBvdGhlciBjb2ZmcyAqLwotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdGFnbmR4WzRdOwkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgIC8qIDQgKi8KLSAgICB1bmlvbiB7Ci0gICAgICBjaGFyIHhfZnNpemVbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgICBzdHJ1Y3QgewotCWNoYXIgIHhfbG5ub1s0XTsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQljaGFyICB4X3NpemVbNF07CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9IHhfbG5zejsKLSAgICB9IHhfbWlzYzsKLSAgICAKLSAgICAvKiAxMiAqLwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7CQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JY2hhciB4X2VuZG5keFs0XTsJCS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotICAgICAgfSB4X2ZjbjsKLSAgICAgIHN0cnVjdCB7CQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICAvKiAyMCAqLwotICAgIAotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciB4X3plcm9lc1s0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0gICAgfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfc2NubGVuWzRdOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICBjaGFyIHhfbnJlbG9jWzRdOwkJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICBjaGFyIHhfbmxpbm5vWzRdOwkJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3R2ZmlsbFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICBjaGFyIHhfdHZsZW5bMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuWzJdWzJdOwkJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotfTsKLQotI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2RlZmluZSBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgaW4sIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgICBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2RlZmluZSBQVVRfTE5TWl9MTk5PKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFBVVF9MTlNaX1NJWkUoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZGVmaW5lIEdFVF9TQ05fTlJFTE9DKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbnJlbG9jKQotI2RlZmluZSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZGVmaW5lIFBVVF9TQ05fU0NOTEVOKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgUFVUX1NDTl9OUkVMT0MoYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSkKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLQotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkyMAotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzJdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogIDEyCi0KLSNkZWZpbmUgTk9fVFZORFgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9tY29yZS5oIGIvaW5jbHVkZS9jb2ZmL21jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTg5NDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL21jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyogTW90b3JvbGxhIE1Db3JlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1Db3JlIENPRkYvUEUgQUJJLiAqLwotCi0jaWZuZGVmIF9DT0ZGX01PUkVfSAotI2RlZmluZSBfQ09GRl9NT1JFX0gKLQotCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURSAgICAgICAgICAJMHgwMDAwCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9BRERSMzIgICAgICAgICAgICAJMHgwMDAxCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU04Qlk0CQkweDAwMDIKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTExQlkyCQkweDAwMDMKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTRCWTIJCTB4MDAwNAotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIJCTB4MDAwNQotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyCTB4MDAwNgotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUlZBCQkJMHgwMDA3Ci0KLSNkZWZpbmUgUEVNQ09SRQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWMgICAgICBbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXAgICAgIFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplICAgICAgWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemUgICAgICBbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemUgICAgICBbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnkgICAgICBbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydCBbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnQgWzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgICAgIDA0MDQgICAgLyogb2JqZWN0IGZpbGVzLCBlZyBhcyBvdXRwdXQgKi8KLSNkZWZpbmUgWk1BR0lDICAgICAgICAgIDA0MTMgICAgLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0jZGVmaW5lIFNUTUFHSUMJCTA0MDEJLyogdGFyZ2V0IHNobGliICovCi0jZGVmaW5lIFNITUFHSUMJCTA0NDMJLyogaG9zdCAgIHNobGliICovCi0KLS8qIEZyb20gd2lubnQuaCAqLwotI2RlZmluZSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMgICAgICAgIDB4MTBiCi0KLQotLyogRGVmaW5lIHNvbWUgTlQgZGVmYXVsdCB2YWx1ZXMuICovCi0jZGVmaW5lIE5UX1NFQ1RJT05fQUxJR05NRU5UIDB4MTAwMAotI2RlZmluZSBOVF9GSUxFX0FMSUdOTUVOVCAgICAweDIwMCAgCi0jZGVmaW5lIE5UX0RFRl9SRVNFUlZFICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE5UX0RFRl9DT01NSVQgICAgICAgIDB4MTAwMAotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYwotewotICBjaGFyIHJfdmFkZHIgIFs0XTsKLSAgY2hhciByX3N5bW5keCBbNF07Ci0gIGNoYXIgcl90eXBlICAgWzJdOwotICBjaGFyIHJfb2Zmc2V0IFs0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE0Ci0KLSNkZWZpbmUJTUNPUkVNQUdJQwkweGIwMCAgLyogSSBqdXN0IG1hZGUgdGhpcyB1cCAqLyAKLQotI2RlZmluZSBNQ09SRUJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT0gTUNPUkVNQUdJQykpCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi17Ci0gIGNoYXIgZl9tYWdpYyAgWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnMgIFsyXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBjaGFyIGZfdGltZGF0IFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGNoYXIgZl9zeW1wdHIgWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltcyAgWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgY2hhciBmX29wdGhkciBbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3MgIFsyXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbgotICB7Ci0gICAgY2hhciBlX25hbWUgW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIGNoYXIgZV96ZXJvZXMgWzRdOwotICAgICAgY2hhciBlX29mZnNldCBbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIAotICBjaGFyIGVfdmFsdWUgIFs0XTsKLSAgY2hhciBlX3NjbnVtICBbMl07Ci0gIGNoYXIgZV90eXBlICAgWzJdOwotICBjaGFyIGVfc2NsYXNzIFsxXTsKLSAgY2hhciBlX251bWF1eCBbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCTB4ZgotI2RlZmluZSBOX1RNQVNLCQkweDMwCi0jZGVmaW5lIE5fQlRTSEZUCTQKLSNkZWZpbmUgTl9UU0hJRlQJMgotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQKLXsKLSAgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHhfdGFnbmR4IFs0XTsJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLSAgICAKLSAgICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAotICAgICAgewotCWNoYXIgIHhfbG5ubyBbMl07IAkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCWNoYXIgIHhfc2l6ZSBbMl07IAkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotICAgICAgfSB4X2xuc3o7Ci0KLSAgICAgIGNoYXIgeF9mc2l6ZSBbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0KLSAgICB9IHhfbWlzYzsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0IAkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotICAgICAgewotCWNoYXIgeF9sbm5vcHRyIFs0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQljaGFyIHhfZW5kbmR4ICBbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotICAgICAgfSB4X2ZjbjsKLQotICAgICAgc3RydWN0IAkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotICAgICAgewotCWNoYXIgeF9kaW1lbiBbRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICAgIAotICAgIH0geF9mY25hcnk7Ci0KLSAgICBjaGFyIHhfdHZuZHggWzJdOwkJLyogdHYgaW5kZXggKi8KLQotICB9IHhfc3ltOwotCi0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIHhfZm5hbWUgW0VfRklMTk1MRU5dOwotICAgIAotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIGNoYXIgeF96ZXJvZXMgWzRdOwotICAgICAgY2hhciB4X29mZnNldCBbNF07Ci0gICAgfSB4X247Ci0gICAgCi0gIH0geF9maWxlOwotCi0gIHN0cnVjdAotICB7Ci0gICAgY2hhciB4X3NjbmxlbiAgICAgWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLwotICAgIGNoYXIgeF9ucmVsb2MgICAgIFsyXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICBjaGFyIHhfbmxpbm5vICAgICBbMl07CS8qICMgbGluZSBudW1iZXJzICovCi0gICAgY2hhciB4X2NoZWNrc3VtICAgWzRdOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSAqLwotICAgIGNoYXIgeF9hc3NvY2lhdGVkIFsyXTsJLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotICAgIGNoYXIgeF9jb21kYXQgICAgIFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLSAgfSB4X3NjbjsKLQotICBzdHJ1Y3QKLSAgewotICAgIGNoYXIgeF90dmZpbGwgWzRdOwkJLyogdHYgZmlsbCB2YWx1ZSAqLwotICAgIGNoYXIgeF90dmxlbiAgWzJdOwkJLyogbGVuZ3RoIG9mIC50diAqLwotICAgIGNoYXIgeF90dnJhbiAgWzJdWzJdOwkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICAgTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gICBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICAgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLiAgKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgbF9zeW1uZHggWzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLSAgICBjaGFyIGxfcGFkZHIgIFs0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0gIH0gbF9hZGRyOwotCi0gIGNoYXIgbF9sbm5vIFsyXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotc3RydWN0IGV4dGVybmFsX3NjbmhkcgotewotICBjaGFyCXNfbmFtZSAgICBbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIGNoYXIJc19wYWRkciAgIFs0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhcglzX3ZhZGRyICAgWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGNoYXIJc19zaXplICAgIFs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgY2hhcglzX3NjbnB0ciAgWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyCXNfcmVscHRyICBbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgY2hhcglzX2xubm9wdHIgWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgY2hhcglzX25yZWxvYyAgWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIGNoYXIJc19ubG5ubyAgIFsyXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICBjaGFyCXNfZmxhZ3MgICBbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qIE5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucy4gICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLQotI2VuZGlmIC8qIF9fQ09GRl9NQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbWlwcy5oIGIvaW5jbHVkZS9jb2ZmL21pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2NjViMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qIEVDT0ZGIHN1cHBvcnQgb24gTUlQUyBtYWNoaW5lcy4KLSAgIGNvZmYvZWNvZmYuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzIGZpbGUuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0gIHVuc2lnbmVkIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIE1hZ2ljIG51bWJlcnMgYXJlIGRlZmluZWQgaW4gY29mZi9lY29mZi5oLiAgKi8KLSNkZWZpbmUgTUlQU19FQ09GRl9CQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ18xKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfTElUVExFKSAmJlwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUcpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19MSVRUTEUyKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfQklHMikgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0xJVFRMRTMpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUczKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCBleHRlcm5hbF9hb3V0aGRyCi17Ci0gIHVuc2lnbmVkIGNoYXIgbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdHNpemVbNF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICB1bnNpZ25lZCBjaGFyCWRzaXplWzRdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIHVuc2lnbmVkIGNoYXIJYnNpemVbNF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcgllbnRyeVs0XTsJLyogZW50cnkgcHQuCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIgdGV4dF9zdGFydFs0XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFfc3RhcnRbNF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBic3Nfc3RhcnRbNF07CS8qIGJhc2Ugb2YgYnNzIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGdwcm1hc2tbNF07CS8qID8/ICovCi0gIHVuc2lnbmVkIGNoYXIgY3BybWFza1s0XVs0XTsJLyogPz8gKi8KLSAgdW5zaWduZWQgY2hhciBncF92YWx1ZVs0XTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCi19IEFPVVRIRFI7Ci0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0jZGVmaW5lIEFPVVRTWiA1NgotI2RlZmluZSBBT1VUSERSU1ogNTYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0gIHVuc2lnbmVkIGNoYXIJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIHVuc2lnbmVkIGNoYXIJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICB1bnNpZ25lZCBjaGFyCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGNoYXIJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIHVuc2lnbmVkIGNoYXIJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIHVuc2lnbmVkIGNoYXIgcl92YWRkcls0XTsKLSAgdW5zaWduZWQgY2hhciByX2JpdHNbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiA4Ci0KLS8qIE1JUFMgRUNPRkYgdXNlcyBhIHBhY2tlZCA4IGJ5dGUgZm9ybWF0IGZvciByZWxvY3MuICBUaGVzZSBjb25zdGFudHMKLSAgIGFyZSB1c2VkIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkLiAgKi8KLQotI2RlZmluZSBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9CSUcJCTE2Ci0jZGVmaW5lIFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQkwCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfQklHCQk4Ci0jZGVmaW5lIFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUgUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfQklHCQkwCi0jZGVmaW5lIFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQkxNgotCi0vKiBPcmlnaW5hbGx5LCBFQ09GRiB1c2VkIGZvdXIgYml0cyBmb3IgdGhlIHJlbG9jIHR5cGUgYW5kIGhhZCB0aHJlZQotICAgcmVzZXJ2ZWQgYml0cy4gIElyaXggNCBhZGRlZCBhbm90aGVyIGJpdCBmb3IgdGhlIHJlbG9jIHR5cGUsIHdoaWNoCi0gICB3YXMgZWFzeSBiZWNhdXNlIGl0IHdhcyBiaWcgZW5kaWFuIGFuZCBvbmUgb2YgdGhlIHNwYXJlIGJpdHMgYmVjYW1lCi0gICB0aGUgbmV3IG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgVG8gbWFrZSB0aGlzIGFsc28gd29yayBmb3IgbGl0dGxlCi0gICBlbmRpYW4gRUNPRkYsIHdlIG5lZWQgdG8gd3JhcCBvbmUgb2YgdGhlIHJlc2VydmVkIGJpdHMgYXJvdW5kIHRvCi0gICBiZWNvbWUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSByZWxvYyB0eXBlLiAgKi8KLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9CSUcJCQkweDNFCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHCQkJMQotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRQkJCTB4NzgKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUJCTMKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRQkJMHgwNAotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFCQkyCi0KLSNkZWZpbmUgUkVMT0NfQklUUzNfRVhURVJOX0JJRwkJCTB4MDEKLSNkZWZpbmUgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRQkJMHg4MAotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgSQotICAgZG9uJ3Qga25vdyBpZiBhbnkgb3RoZXIgdmFsdWVzIGNhbiBhcHBlYXIuICBUaGVzZSBzZWVtIHRvIGJlIGFsbAotICAgdGhhdCBvY2N1ciBpbiB0aGUgVWx0cml4IDQuMiBsaWJyYXJpZXMuICAqLwotI2RlZmluZSBNSVBTX1JfSUdOT1JFCTAKLSNkZWZpbmUgTUlQU19SX1JFRkhBTEYJMQotI2RlZmluZSBNSVBTX1JfUkVGV09SRAkyCi0jZGVmaW5lIE1JUFNfUl9KTVBBRERSCTMKLSNkZWZpbmUgTUlQU19SX1JFRkhJCTQKLSNkZWZpbmUgTUlQU19SX1JFRkxPCTUKLSNkZWZpbmUgTUlQU19SX0dQUkVMCTYKLSNkZWZpbmUgTUlQU19SX0xJVEVSQUwJNwotCi0vKiBUaGVzZSByZWxvYyB0eXBlcyBhcmUgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nCi0gICBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgVGhlIG51bWJlcnMgYXJlCi0gICB0YWtlbiBmcm9tIElyaXggNCwgYnV0IGF0IGxlYXN0IGZvciBpbnRlcm5hbCByZWxvY3MgSXJpeCA1IGRvZXMgbm90Ci0gICBnaXZlIHRoZW0gdGhlIHNhbWUgbWVhbmluZy4gIEZvciBhbiBpbnRlcm5hbCByZWxvYyB0aGUgc3ltYm9sIGluZGV4Ci0gICBvZiBSRUxISSBhbmQgUkVMTE8gaXMgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGJlbG93IGZvcgotICAgTUlQU19SX1NXSVRDSC4gICovCi0jZGVmaW5lIE1JUFNfUl9QQ1JFTDE2CTEyCi0jZGVmaW5lIE1JUFNfUl9SRUxISQkxMwotI2RlZmluZSBNSVBTX1JfUkVMTE8JMTQKLQotLyogVGhpcyByZWxvYyB0eXBlIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IGlzIHVzZWQgZm9yIGFuIGVudHJ5IGluCi0gICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgotICAgICAud29yZCAkTDMtJExTMTIKLSAgIFRoZSBvYmplY3QgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIGNvcnJlY3QgZGlmZmVyZW5jZSwgYW5kIGRvZXMgbm90Ci0gICByZXF1aXJlIGFkanVzdG1lbnQuICBIb3dldmVyLCB3aGVuIHRoZSBsaW5rZXIgaXMgcmVsYXhpbmcgUEMKLSAgIHJlbGF0aXZlIGNhbGxzLCBpdCBpcyBwb3NzaWJsZSBmb3IgJEwzIHRvIG1vdmUgZmFydGhlciBhd2F5LiAgVGhpcwotICAgcmVsb2MgYWx3YXlzIGFwcGVhcnMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGFuZCBpcyBhbHdheXMgYWdhaW5zdAotICAgdGhlIC50ZXh0IHNlY3Rpb24uICBIb3dldmVyLCB0aGUgc3ltYm9sIGluZGV4IGlzIG5vdAotICAgUkVMT0NfU0VDVElPTl9URVhULiAgSXQgaXMsIGluc3RlYWQsIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMKLSAgIHN3aXRjaCB0YWJsZSBlbnRyeSBhbmQgJExTMTIuICBUaHVzLCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgJEwxMiBpcwotICAgICB2YWRkciAtIHN5bW5keAotICAgYW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMgaXMKLSAgICAgdmFkZHIgLSBzeW1uZHggKyBhZGRlbmQKLSAgIHdoZXJlIGFkZGVuZCBpcyB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBmaWxlLiAgS25vd2luZyB0aGlzLCB0aGUKLSAgIGxpbmtlciBjYW4ga25vdyB3aGV0aGVyIHRoZSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlIG11c3QgYmUKLSAgIGFkanVzdGVkLiAgKi8KLSNkZWZpbmUgTUlQU19SX1NXSVRDSAkyMgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTVEFCUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE1JUFNfSVNfU1RBQiBFQ09GRl9JU19TVEFCCi0jZGVmaW5lIE1JUFNfTUFSS19TVEFCIEVDT0ZGX01BUktfU1RBQgotI2RlZmluZSBNSVBTX1VOTUFSS19TVEFCIEVDT0ZGX1VOTUFSS19TVEFCCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTElDIElORk9STUFUSU9OICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlLiAgKi8KLQotLyogRUNPRkYgdXNlcyBDT0ZGLWxpa2Ugc2VjdGlvbiBzdHJ1Y3R1cmVzLCBidXQgaXRzIG93biBzeW1ib2wgZm9ybWF0LgotICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN5bWJvbCBmb3JtYXQgaW4gZmllbGRzIHdob3NlIHNpemUgYW5kIGFsaWdubWVudAotICAgd2lsbCBub3QgdmFyeSBvbiBkaWZmZXJlbnQgaG9zdCBzeXN0ZW1zLiAgKi8KLQotLyogRmlsZSBoZWFkZXIgYXMgYSBzZXQgb2YgYnl0ZXMgKi8KLQotc3RydWN0IGhkcl9leHQgewotCXVuc2lnbmVkIGNoYXIgCWhfbWFnaWNbMl07Ci0JdW5zaWduZWQgY2hhcgloX3ZzdGFtcFsyXTsKLQl1bnNpZ25lZCBjaGFyCWhfaWxpbmVNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZG5NYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRG5PZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lwZE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JQZE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXN5bU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTeW1PZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lvcHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiT3B0T2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pYXV4TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkF1eE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXNzTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NFeHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3NFeHRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lmZE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JGZE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JSZmRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lleHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRXh0T2Zmc2V0WzRdOwotfTsKLQotLyogRmlsZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZmRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglmX2Fkcls0XTsKLQl1bnNpZ25lZCBjaGFyCWZfcnNzWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3NCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYlNzWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3ltQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3N5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaWxpbmVCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jbGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaW9wdEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lwZEZpcnN0WzJdOwotCXVuc2lnbmVkIGNoYXIJZl9jcGRbMl07Ci0JdW5zaWduZWQgY2hhcglmX2lhdXhCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYXV4WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9yZmRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czJbM107Ci0JdW5zaWduZWQgY2hhcglmX2NiTGluZU9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lWzRdOwotfTsKLQotI2RlZmluZQlGRFJfQklUUzFfTEFOR19CSUcJCTB4RjgKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfQklHCQkzCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0xJVFRMRQkJMHgxRgotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUJMAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfQklHCQkweDA0Ci0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfTElUVExFCQkweDIwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fQklHCQkweDAyCi0jZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRQkweDQwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHCTB4MDEKLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFCTB4ODAKLQotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0JJRwkJMHhDMAotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0JJRwkJNgotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0xJVFRMRQkJMHgwMwotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRQkwCi0KLS8qIFdlIGlnbm9yZSB0aGUgYHJlc2VydmVkJyBmaWVsZCBpbiBiaXRzMi4gKi8KLQotLyogUHJvY2VkdXJlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBwZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXBfYWRyWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9pc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9pbGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9pb3B0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9wY3JlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5Mb3dbNF07Ci0JdW5zaWduZWQgY2hhcglwX2xuSGlnaFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfY2JMaW5lT2Zmc2V0WzRdOwotfTsKLQotLyogUnVudGltZSBwcm9jZWR1cmUgdGFibGUgKi8KLQotc3RydWN0IHJwZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXBfYWRyWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9pcnBzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVzZXJ2ZWRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2V4Y2VwdGlvbl9pbmZvWzRdOwotfTsKLQotLyogTGluZSBudW1iZXJzICovCi0KLXN0cnVjdCBsaW5lX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglsX2xpbmVbNF07Ci19OwotCi0vKiBTeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBzeW1fZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXNfaXNzWzRdOwotCXVuc2lnbmVkIGNoYXIJc192YWx1ZVs0XTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzM1sxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czRbMV07Ci19OwotCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9CSUcJCTB4RkMKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0JJRwkJMgotI2RlZmluZQlTWU1fQklUUzFfU1RfTElUVExFCQkweDNGCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9MSVRUTEUJCTAKLQotI2RlZmluZQlTWU1fQklUUzFfU0NfQklHCQkweDAzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRwkzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19MSVRUTEUJCTB4QzAKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xJVFRMRQkJNgotCi0jZGVmaW5lCVNZTV9CSVRTMl9TQ19CSUcJCTB4RTAKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0JJRwkJNQotI2RlZmluZQlTWU1fQklUUzJfU0NfTElUVExFCQkweDA3Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRQkyCi0KLSNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHgxMAotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfTElUVExFCTB4MDgKLQotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfQklHCQkweDBGCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRwkxNgotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfTElUVExFCQkweEYwCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUJNAotCi0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFCTEyCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGV4dF9leHQgewotCXVuc2lnbmVkIGNoYXIJZXNfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMlsxXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2lmZFsyXTsKLQlzdHJ1Y3QJc3ltX2V4dCBlc19hc3ltOwotfTsKLQotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0JJRwkJMHg4MAotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0xJVFRMRQkJMHgwMQotCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRwkweDQwCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfQklHCQkweDIwCi0jZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRQkweDA0Ci0KLS8qIERlbnNlIG51bWJlcnMgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBkbnJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWRfcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZF9pbmRleFs0XTsKLX07Ci0KLS8qIFJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciAqLwotCi1zdHJ1Y3QgcmZkX2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIJcmZkWzRdOwotfTsKLQotLyogT3B0aW1pemVyIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IG9wdF9leHQgewotICB1bnNpZ25lZCBjaGFyIG9fYml0czFbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMlsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMzWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czRbMV07Ci0gIHN0cnVjdCBybmR4X2V4dCBvX3JuZHg7Ci0gIHVuc2lnbmVkIGNoYXIgb19vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRwkxNgotI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMAotCi0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFCTE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcGUuaCBiL2luY2x1ZGUvY29mZi9wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWExZjZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qIFBFIENPRkYgaGVhZGVyIGluZm9ybWF0aW9uICovCi0KLSNpZm5kZWYgX1BFX0gKLSNkZWZpbmUgX1BFX0gKLQotLyogTlQgc3BlY2lmaWMgZmlsZSBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIElNQUdFX0ZJTEVfUkVMT0NTX1NUUklQUEVEICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgSU1BR0VfRklMRV9FWEVDVVRBQkxFX0lNQUdFICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBJTUFHRV9GSUxFX0xJTkVfTlVNU19TVFJJUFBFRCAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTE9DQUxfU1lNU19TVFJJUFBFRCAgICAgICAweDAwMDgKLSNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9MTyAgICAgICAgIDB4MDA4MAotI2RlZmluZSBJTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9TWVNURU0gICAgICAgICAgICAgICAgICAgIDB4MTAwMAotI2RlZmluZSBJTUFHRV9GSUxFX0RMTCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfQllURVNfUkVWRVJTRURfSEkgICAgICAgICAweDgwMDAKLQotLyogYWRkaXRpb25hbCBmbGFncyB0byBiZSBzZXQgZm9yIHNlY3Rpb24gaGVhZGVycyB0byBhbGxvdyB0aGUgTlQgbG9hZGVyIHRvCi0gICByZWFkIGFuZCB3cml0ZSB0byB0aGUgc2VjdGlvbiBkYXRhICh0byByZXBsYWNlIHRoZSBhZGRyZXNzZXMgb2YgZGF0YSBpbgotICAgZGxscyBmb3Igb25lIHRoaW5nKTsgYWxzbyB0byBleGVjdXRlIHRoZSBzZWN0aW9uIGluIC50ZXh0J3MgY2FzZSAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFIDB4MDIwMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9FWEVDVVRFICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUkVBRCAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1dSSVRFICAgICAgIDB4ODAwMDAwMDAKLQotLyoKLSAqIFNlY3Rpb24gY2hhcmFjdGVyaXN0aWNzIGFkZGVkIGZvciBwcGMtbnQKLSAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9UWVBFX05PX1BBRCAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvKiBSZXNlcnZlZC4gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fQ05UX0NPREUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgLyogU2VjdGlvbiBjb250YWlucyBjb2RlLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgICAgICAgMHgwMDAwMDA0MCAgLyogU2VjdGlvbiBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSAgICAgMHgwMDAwMDA4MCAgLyogU2VjdGlvbiBjb250YWlucyB1bmluaXRpYWxpemVkIGRhdGEuICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19PVEhFUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8qIFJlc2VydmVkLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTE5LX0lORk8gICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgLyogU2VjdGlvbiBjb250YWlucyBjb21tZW50cyBvciBzb21lIG90aGVyIHR5cGUgb2YgaW5mb3JtYXRpb24uICovCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfUkVNT1ZFICAgICAgICAgICAgICAgICAweDAwMDAwODAwICAvKiBTZWN0aW9uIGNvbnRlbnRzIHdpbGwgbm90IGJlY29tZSBwYXJ0IG9mIGltYWdlLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTE5LX0NPTURBVCAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgLyogU2VjdGlvbiBjb250ZW50cyBjb21kYXQuICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9GQVJEQVRBICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLQotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1BVUkdFQUJMRSAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNXzE2QklUICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0xPQ0tFRCAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1BSRUxPQUQgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAotCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl8xQllURVMgICAgICAgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl8yQllURVMgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl80QllURVMgICAgICAgICAgICAgICAweDAwMzAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl84QllURVMgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTICAgICAgICAgICAgICAweDAwNTAwMDAwICAvKiBEZWZhdWx0IGFsaWdubWVudCBpZiBubyBvdGhlcnMgYXJlIHNwZWNpZmllZC4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMgICAgICAgICAgICAgIDB4MDA2MDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMgICAgICAgICAgICAgIDB4MDA3MDAwMDAKLQotCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfTlJFTE9DX09WRkwgICAgICAgICAgICAweDAxMDAwMDAwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGV4dGVuZGVkIHJlbG9jYXRpb25zLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9DQUNIRUQgICAgICAgICAgICAgMHgwNDAwMDAwMCAgLyogU2VjdGlvbiBpcyBub3QgY2FjaGFibGUuICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgICAgICAgICAgICAgIDB4MDgwMDAwMDAgIC8qIFNlY3Rpb24gaXMgbm90IHBhZ2VhYmxlLiAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fU0hBUkVEICAgICAgICAgICAgICAgICAweDEwMDAwMDAwICAvKiBTZWN0aW9uIGlzIHNoYXJlYWJsZS4gICAgICAgICAgICAgICAgICAqLwotCi0vKiBDT01EQVQgc2VsZWN0aW9uIGNvZGVzLiAgKi8KLQotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUyAgICAgKDEpIC8qIFdhcm4gaWYgZHVwbGljYXRlcy4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZCQkgICAgICgyKSAvKiBObyB3YXJuaW5nLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkUJICAgICAoMykgLyogV2FybiBpZiBkaWZmZXJlbnQgc2l6ZS4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0gJICAgICAoNCkgLyogV2FybiBpZiBkaWZmZXJlbnQuICAqLwotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFCSAgICAgKDUpIC8qIEJhc2Ugb24gb3RoZXIgc2VjdGlvbi4gICovCi0KLS8qIE1hZ2ljIHZhbHVlcyB0aGF0IGFyZSB0cnVlIGZvciBhbGwgZG9zL250IGltcGxlbWVudGF0aW9ucyAqLwotI2RlZmluZSBET1NNQUdJQyAgICAgICAweDVhNGQgIAotI2RlZmluZSBOVF9TSUdOQVRVUkUgICAweDAwMDA0NTUwCi0KLSAgLyogTlQgYWxsb3dzIGxvbmcgZmlsZW5hbWVzLCB3ZSB3YW50IHRvIGFjY29tbW9kYXRlIHRoaXMuICBUaGlzIG1heSBicmVhawotICAgICBzb21lIG9mIHRoZSBiZmQgZnVuY3Rpb25zICovCi0jdW5kZWYgIEZJTE5NTEVOCi0jZGVmaW5lIEZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLQotc3RydWN0IGV4dGVybmFsX1BFSV9maWxlaGRyCi17Ci0gIC8qIERPUyBoZWFkZXIgZmllbGRzICovCi0gIGNoYXIgZV9tYWdpY1syXTsJCS8qIE1hZ2ljIG51bWJlciwgMHg1YTRkICovCi0gIGNoYXIgZV9jYmxwWzJdOwkJLyogQnl0ZXMgb24gbGFzdCBwYWdlIG9mIGZpbGUsIDB4OTAgKi8KLSAgY2hhciBlX2NwWzJdOwkJCS8qIFBhZ2VzIGluIGZpbGUsIDB4MyAqLwotICBjaGFyIGVfY3JsY1syXTsJCS8qIFJlbG9jYXRpb25zLCAweDAgKi8KLSAgY2hhciBlX2NwYXJoZHJbMl07CQkvKiBTaXplIG9mIGhlYWRlciBpbiBwYXJhZ3JhcGhzLCAweDQgKi8KLSAgY2hhciBlX21pbmFsbG9jWzJdOwkJLyogTWluaW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCwgMHgwICovCi0gIGNoYXIgZV9tYXhhbGxvY1syXTsJCS8qIE1heGltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4RkZGRiAqLwotICBjaGFyIGVfc3NbMl07CQkJLyogSW5pdGlhbCAocmVsYXRpdmUpIFNTIHZhbHVlLCAweDAgKi8KLSAgY2hhciBlX3NwWzJdOwkJCS8qIEluaXRpYWwgU1AgdmFsdWUsIDB4YjggKi8KLSAgY2hhciBlX2NzdW1bMl07CQkvKiBDaGVja3N1bSwgMHgwICovCi0gIGNoYXIgZV9pcFsyXTsJCQkvKiBJbml0aWFsIElQIHZhbHVlLCAweDAgKi8KLSAgY2hhciBlX2NzWzJdOwkJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBDUyB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9sZmFybGNbMl07CQkvKiBGaWxlIGFkZHJlc3Mgb2YgcmVsb2NhdGlvbiB0YWJsZSwgMHg0MCAqLwotICBjaGFyIGVfb3Zub1syXTsJCS8qIE92ZXJsYXkgbnVtYmVyLCAweDAgKi8KLSAgY2hhciBlX3Jlc1s0XVsyXTsJCS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIGNoYXIgZV9vZW1pZFsyXTsJCS8qIE9FTSBpZGVudGlmaWVyIChmb3IgZV9vZW1pbmZvKSwgMHgwICovCi0gIGNoYXIgZV9vZW1pbmZvWzJdOwkJLyogT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljLCAweDAgKi8KLSAgY2hhciBlX3JlczJbMTBdWzJdOwkJLyogUmVzZXJ2ZWQgd29yZHMsIGFsbCAweDAgKi8KLSAgY2hhciBlX2xmYW5ld1s0XTsJCS8qIEZpbGUgYWRkcmVzcyBvZiBuZXcgZXhlIGhlYWRlciwgMHg4MCAqLwotICBjaGFyIGRvc19tZXNzYWdlWzE2XVs0XTsJLyogb3RoZXIgc3R1ZmYsIGFsd2F5cyBmb2xsb3cgRE9TIGhlYWRlciAqLwotICBjaGFyIG50X3NpZ25hdHVyZVs0XTsJCS8qIHJlcXVpcmVkIE5UIHNpZ25hdHVyZSwgMHg0NTUwICovIAotCi0gIC8qIEZyb20gc3RhbmRhcmQgaGVhZGVyICovICAKLQotCi0gIGNoYXIgZl9tYWdpY1syXTsJCS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2Nuc1syXTsJCS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgY2hhciBmX3RpbWRhdFs0XTsJCS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyWzRdOwkJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBjaGFyIGZfbnN5bXNbNF07CQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgY2hhciBmX29wdGhkclsyXTsJCS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3NbMl07CQkvKiBmbGFncwkJCSovCi0KLX07Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogVGhlIGZpbGVoZHIgaXMgb25seSB3ZWlyZCBpbiBpbWFnZXMgKi8KLQotI3VuZGVmIEZJTEhEUgotI2RlZmluZSBGSUxIRFIgc3RydWN0IGV4dGVybmFsX1BFSV9maWxlaGRyCi0jdW5kZWYgRklMSFNaCi0jZGVmaW5lIEZJTEhTWiAxNTIKLQotI2VuZGlmIC8qIENPRkZfSU1BR0VfV0lUSF9QRSAqLwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgQU9VVEhEUiBzdGFuZGFyZDsKLQotICAvKiBOVCBleHRyYSBmaWVsZHM7IHNlZSBpbnRlcm5hbC5oIGZvciBkZXNjcmlwdGlvbnMgKi8KLSAgY2hhciAgSW1hZ2VCYXNlWzRdOwotICBjaGFyICBTZWN0aW9uQWxpZ25tZW50WzRdOwotICBjaGFyICBGaWxlQWxpZ25tZW50WzRdOwotICBjaGFyICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgTWFqb3JJbWFnZVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9ySW1hZ2VWZXJzaW9uWzJdOwotICBjaGFyICBNYWpvclN1YnN5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9yU3Vic3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgUmVzZXJ2ZWQxWzRdOwotICBjaGFyICBTaXplT2ZJbWFnZVs0XTsKLSAgY2hhciAgU2l6ZU9mSGVhZGVyc1s0XTsKLSAgY2hhciAgQ2hlY2tTdW1bNF07Ci0gIGNoYXIgIFN1YnN5c3RlbVsyXTsKLSAgY2hhciAgRGxsQ2hhcmFjdGVyaXN0aWNzWzJdOwotICBjaGFyICBTaXplT2ZTdGFja1Jlc2VydmVbNF07Ci0gIGNoYXIgIFNpemVPZlN0YWNrQ29tbWl0WzRdOwotICBjaGFyICBTaXplT2ZIZWFwUmVzZXJ2ZVs0XTsKLSAgY2hhciAgU2l6ZU9mSGVhcENvbW1pdFs0XTsKLSAgY2hhciAgTG9hZGVyRmxhZ3NbNF07Ci0gIGNoYXIgIE51bWJlck9mUnZhQW5kU2l6ZXNbNF07Ci0gIC8qIElNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOyAqLwotICBjaGFyICBEYXRhRGlyZWN0b3J5WzE2XVsyXVs0XTsgLyogMTYgZW50cmllcywgMiBlbGVtZW50cy9lbnRyeSwgNCBjaGFycyAqLwotCi19IFBFQU9VVEhEUjsKLQotCi0jdW5kZWYgQU9VVFNaCi0jZGVmaW5lIEFPVVRTWiAoQU9VVEhEUlNaICsgMTk2KQotCi0jdW5kZWYgIEVfRklMTk1MRU4KLSNkZWZpbmUgRV9GSUxOTUxFTgkxOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9wb3dlcnBjLmggYi9pbmNsdWRlL2NvZmYvcG93ZXJwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUyY2Y5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9wb3dlcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogQmFzaWMgY29mZiBpbmZvcm1hdGlvbiBmb3IgdGhlIFBvd2VyUEMKLSAqCi0gKiBCYXNlZCBvbiBjb2ZmL3JzNjAwMC5oLCBjb2ZmL2kzODYuaCBhbmQgb3RoZXJzLgotICoKLSAqIEluaXRpYWwgcmVsZWFzZTogS2ltIEtudXR0aWxhIChrcmtAY3lnbnVzLmNvbSkKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0gIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLS8qIGV4dHJhIE5UIGRlZmluZXMgKi8KLSNkZWZpbmUgUFBDTUFHSUMgICAgICAgMDc2MCAgICAgICAgIC8qIHBlZWtlZCBvbiBhYSBQb3dlclBDIFdpbmRvd3MgTlQgYm94ICovCi0jZGVmaW5lIERPU01BR0lDICAgICAgIDB4NWE0ZCAgICAgICAvKiBmcm9tIGFybS5oLCBpMzg2LmggKi8KLSNkZWZpbmUgTlRfU0lHTkFUVVJFICAgMHgwMDAwNDU1MCAgIC8qIGZyb20gYXJtLmgsIGkzODYuaCAqLwotCi0vKiBmcm9tIHdpbm50LmggKi8KLSNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDICAgICAgICAweDEwYgotCi0jZGVmaW5lIFBQQ0JBRE1BRyh4KSAoKHgpLmZfbWFnaWMgIT0gUFBDTUFHSUMpIAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkgICAgKi8KLSAgY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCSAgICAgICAgICAgICovCi0gIGNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJICAgICovCi0gIGNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkgICAgKi8KLSAgY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJICAgICovCi0gIGNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSAgICAqLwotICBjaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyAgICAqLwotICBjaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSAgICAqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwICovCi0gICAgY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJICAgICAgICovCi0gIH0gbF9hZGRyOwotICBjaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOCAgICAgLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUgICAgICAgKi8KLQotLyogQWxsb3cgdGhlIGZpbGUgbmFtZSBsZW5ndGggdG8gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgaW5jbHVkaW5nIGZpbGUgICAqLwotI2lmbmRlZiBFX0ZJTE5NTEVOCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQKLSNlbmRpZgotCi0jZGVmaW5lIEVfRElNTlVNCTQgICAgIC8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CSAgICAgICAgICAgLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAgICAgICAqLwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7Ci0JY2hhciAgeF9sbm5vWzJdOyAgICAgICAgICAgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgICAgICAgICAqLwotCWNoYXIgIHhfc2l6ZVsyXTsgICAgICAgICAgIC8qIHN0ci91bmlvbi9hcnJheSBzaXplICAgICAgICAgICAgKi8KLSAgICAgIH0geF9sbnN6OwotICAgICAgY2hhciB4X2ZzaXplWzRdOwkgICAgICAgICAgIC8qIHNpemUgb2YgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KLSAgICB9IHhfbWlzYzsKLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewkJICAgICAgICAgICAvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgICAgICAgICAgICovCi0JY2hhciB4X2xubm9wdHJbNF07ICAgICAgICAgLyogcHRyIHRvIGZjbiBsaW5lICMgICAgICAgICAgICAgICAqLwotCWNoYXIgeF9lbmRuZHhbNF07CSAgIC8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAgICAgICAgKi8KLSAgICAgIH0geF9mY247Ci0gICAgICBzdHJ1Y3QgewkJICAgICAgICAgICAvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gICAgICAgICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICBjaGFyIHhfdHZuZHhbMl07CQkgICAvKiB0diBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0gICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIHhfemVyb2VzWzRdOwotICAgICAgY2hhciB4X29mZnNldFs0XTsKLSAgICB9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF9zY25sZW5bNF07CSAgICAgICAgICAgLyogc2VjdGlvbiBsZW5ndGggICAgICAgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9ucmVsb2NbMl07CSAgICAgICAgICAgLyogIyByZWxvY2F0aW9uIGVudHJpZXMgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9ubGlubm9bMl07CSAgICAgICAgICAgLyogIyBsaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9jaGVja3N1bVs0XTsJCSAgIC8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtCSAgICAgICovCi0gICAgY2hhciB4X2Fzc29jaWF0ZWRbMl07CSAgIC8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgICBjaGFyIHhfY29tZGF0WzFdOwkJICAgLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIJICAgICAgKi8KLSAgfSB4X3NjbjsKLX07Ci0KLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotI2RlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9yczYwMDAuaCBiL2luY2x1ZGUvY29mZi9yczYwMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlZjFkOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvcnM2MDAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyogSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlIGRlZmluaXRpb25zIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUgb2YgSUJNCi0gICBhbmQgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSAgICAgICAgLyogSUJNIFJTLzYwMDAgKi8KLSNkZWZpbmUgVTgwMldSTUFHSUMgICAgIDA3MzAgICAgLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKipjaGgqKiAgICAgICovCi0jZGVmaW5lIFU4MDJST01BR0lDICAgICAwNzM1ICAgIC8qIHJlYWRvbmx5IHNoYXJhYmxlIHRleHQgc2VnbWVudHMgICAgICAqLwotI2RlZmluZSBVODAyVE9DTUFHSUMgICAgMDczNyAgICAvKiByZWFkb25seSB0ZXh0IHNlZ21lbnRzIGFuZCBUT0MgICAgICAgKi8KLQotI2RlZmluZSBCQURNQUcoeCkJXAotCSgoeCkuZl9tYWdpYyAhPSBVODAyUk9NQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBVODAyV1JNQUdJQyAmJiBcCi0JICh4KS5mX21hZ2ljICE9IFU4MDJUT0NNQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICB1bnNpZ25lZCBjaGFyCW1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJKi8KLSAgdW5zaWduZWQgY2hhcgl0c2l6ZVs0XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSAqLwotICB1bnNpZ25lZCBjaGFyCWRzaXplWzRdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs0XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCSovCi0gIHVuc2lnbmVkIGNoYXIJZW50cnlbNF07CS8qIGVudHJ5IHB0LgkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdGV4dF9zdGFydFs0XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCWRhdGFfc3RhcnRbNF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglvX3RvY1s0XTsJLyogYWRkcmVzcyBvZiBUT0MgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuZW50cnlbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIGVudHJ5IHBvaW50ICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbnRleHRbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC50ZXh0IHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuZGF0YVsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmRhdGEgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc250b2NbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIFRPQyAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25sb2FkZXJbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5sb2FkZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25ic3NbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5ic3Mgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fYWxnbnRleHRbMl07CS8qIC50ZXh0IGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCW9fYWxnbmRhdGFbMl07CS8qIC5kYXRhIGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCW9fbW9kdHlwZVsyXTsJLyogbW9kdWxlIHR5cGUgKD8/KSAqLwotICB1bnNpZ25lZCBjaGFyIG9fY3B1dHlwZVsyXTsJLyogY3B1IHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcglvX21heHN0YWNrWzRdOwkvKiBtYXggc3RhY2sgc2l6ZSAoPz8pICovCi0gIHVuc2lnbmVkIGNoYXIgb19tYXhkYXRhWzRdOwkvKiBtYXggZGF0YSBzaXplICg/PykgKi8KLSAgdW5zaWduZWQgY2hhcglvX3Jlc3YyWzEyXTsJLyogcmVzZXJ2ZWQgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDcyCi0jZGVmaW5lIFNNQUxMX0FPVVRTWiAoMjgpCi0jZGVmaW5lIEFPVVRIRFJTWiA3MgotCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9PTUFHSUMJMHgwMTA3CS8qIG9sZDogdGV4dCAmIGRhdGEgd3JpdGVhYmxlICovCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9OTUFHSUMJMHgwMTA4CS8qIG5ldzogdGV4dCByL28sIGRhdGEgci93ICovCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9aTUFHSUMJMHgwMTBCCS8qIHBhZ2VkOiB0ZXh0IHIvbywgYm90aCBwYWdlLWFsaWduZWQgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1BBRAkiLnBhZCIKLSNkZWZpbmUgX0xPQURFUgkiLmxvYWRlciIKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyogWENPRkYgdXNlcyBhIHNwZWNpYWwgLmxvYWRlciBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0xPQURFUi4gICovCi0jZGVmaW5lIFNUWVBfTE9BREVSIDB4MTAwMAotCi0vKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAuZGVidWcgc2VjdGlvbiB3aXRoIHR5cGUgU1RZUF9ERUJVRy4gICovCi0jZGVmaW5lIFNUWVBfREVCVUcgMHgyMDAwCi0KLS8qIFhDT0ZGIGhhbmRsZXMgbGluZSBudW1iZXIgb3IgcmVsb2NhdGlvbiBvdmVyZmxvdyBieSBjcmVhdGluZwotICAgYW5vdGhlciBzZWN0aW9uIGhlYWRlciB3aXRoIFNUWVBfT1ZSRkxPIHNldC4gICovCi0jZGVmaW5lIFNUWVBfT1ZSRkxPIDB4ODAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0Jc3RydWN0IHsKLQkJdW5zaWduZWQgY2hhciB4X3Njbmxlbls0XTsKLQkJdW5zaWduZWQgY2hhciB4X3Bhcm1oYXNoWzRdOwotCQl1bnNpZ25lZCBjaGFyIHhfc25oYXNoWzJdOwotCQl1bnNpZ25lZCBjaGFyIHhfc210eXBbMV07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbWNsYXNbMV07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zdGFiWzRdOwotCQl1bnNpZ25lZCBjaGFyIHhfc25zdGFiWzJdOwotCX0geF9jc2VjdDsKLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0jZGVmaW5lIERCWE1BU0sgMHg4MAkJLyogZm9yIGRieCBzdG9yYWdlIG1hc2sgKi8KLSNkZWZpbmUgU1lNTkFNRV9JTl9ERUJVRyhzeW1wdHIpICgoc3ltcHRyKS0+bl9zY2xhc3MgJiBEQlhNQVNLKQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfc2l6ZVsxXTsKLSAgY2hhciByX3R5cGVbMV07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KLSNkZWZpbmUgREVGQVVMVF9EQVRBX1NFQ1RJT05fQUxJR05NRU5UIDQKLSNkZWZpbmUgREVGQVVMVF9CU1NfU0VDVElPTl9BTElHTk1FTlQgNAotI2RlZmluZSBERUZBVUxUX1RFWFRfU0VDVElPTl9BTElHTk1FTlQgNAotLyogRm9yIG5ldyBzZWN0aW9ucyB3ZSBoYXZuJ3QgaGVhcmQgb2YgYmVmb3JlICovCi0jZGVmaW5lIERFRkFVTFRfU0VDVElPTl9BTElHTk1FTlQgNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3NoLmggYi9pbmNsdWRlL2NvZmYvc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NTdkZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgU0ggKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCVNIX0FSQ0hfTUFHSUNfQklHCTB4MDUwMAotI2RlZmluZQlTSF9BUkNIX01BR0lDX0xJVFRMRQkweDA1NTAgIC8qIExpdHRsZSBlbmRpYW4gU0ggKi8KLQotCi0jZGVmaW5lIFNIQkFETUFHKHgpIFwKLSAoKCh4KS5mX21hZ2ljIT1TSF9BUkNIX01BR0lDX0JJRykgJiYgXAotICAoKHgpLmZfbWFnaWMhPVNIX0FSQ0hfTUFHSUNfTElUVExFKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotLyogU0ggcmVsb2NhdGlvbiB0eXBlcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXJlIGFjdHVhbGx5IHVzZWQuICAqLwotCi0jZGVmaW5lIFJfU0hfVU5VU0VECTAJCS8qIG9ubHkgdXNlZCBpbnRlcm5hbGx5ICovCi0jZGVmaW5lIFJfU0hfUENSRUw4IAkzCQkvKiAgOCBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfU0hfUENSRUwxNiAJNAkJLyogMTYgYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX1NIX0hJR0g4ICAJNQkJLyogaGlnaCA4IGJpdHMgb2YgMjQgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9TSF9MT1cxNiAJNwkJLyogbG93IDE2IGJpdHMgb2YgMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX0lNTTI0CTYJCS8qIDI0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1A4Qlk0CTkgIAkJLyogUEMgcmVsIDggYml0cyAqNCArdmUgKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1A4QlkyCTEwICAJCS8qIFBDIHJlbCA4IGJpdHMgKjIgK3ZlICovCi0jZGVmaW5lIFJfU0hfUENESVNQOCAgICAxMSAgCQkvKiA4IGJpdCBicmFuY2ggKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1AgICAgIDEyICAJCS8qIDEyIGJpdCBicmFuY2ggKi8KLSNkZWZpbmUgUl9TSF9JTU0zMiAgICAgIDE0ICAgIAkJLyogMzIgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX0lNTTggICAJMTYJCS8qIDggYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX0lNTThCWTIgICAgMTcJCS8qIDggYml0IGltbWVkaWF0ZSAqMiAqLwotI2RlZmluZSBSX1NIX0lNTThCWTQgICAgMTgJCS8qIDggYml0IGltbWVkaWF0ZSAqNCAqLwotI2RlZmluZSBSX1NIX0lNTTQgICAJMTkJCS8qIDQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX0lNTTRCWTIgICAgMjAJCS8qIDQgYml0IGltbWVkaWF0ZSAqMiAqLwotI2RlZmluZSBSX1NIX0lNTTRCWTQgICAgMjEJCS8qIDQgYml0IGltbWVkaWF0ZSAqNCAqLwotI2RlZmluZSBSX1NIX1BDUkVMSU1NOEJZMiAgIDIyCQkvKiBQQyByZWwgOCBiaXRzICoyIHVuc2lnbmVkICovCi0jZGVmaW5lIFJfU0hfUENSRUxJTU04Qlk0ICAgMjMJCS8qIFBDIHJlbCA4IGJpdHMgKjQgdW5zaWduZWQgKi8KLSNkZWZpbmUgUl9TSF9JTU0xNiAgICAgIDI0ICAgIAkJLyogMTYgYml0IGltbWVkaWF0ZSAqLwotCi0vKiBUaGUgc3dpdGNoIHRhYmxlIHJlbG9jIHR5cGVzIGFyZSB1c2VkIGZvciByZWxheGluZy4gIFRoZXkgYXJlCi0gICBnZW5lcmF0ZWQgZm9yIGV4cHJlc3Npb25zIHN1Y2ggYXMKLSAgICAgLndvcmQgTDEgLSBMMgotICAgVGhlIHJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MKLSAgIGFuZCBMMi4gICovCi0jZGVmaW5lIFJfU0hfU1dJVENIOAkzMwkJLyogOCBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIFJfU0hfU1dJVENIMTYJMjUJCS8qIDE2IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgUl9TSF9TV0lUQ0gzMgkyNgkJLyogMzIgYml0IHN3aXRjaCB0YWJsZSBlbnRyeSAqLwotCi0vKiBUaGUgVVNFUyByZWxvYyB0eXBlIGlzIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhlIGNvbXBpbGVyIHdpbGwKLSAgIGdlbmVyYXRlIC51c2VzIHBzZXVkby1vcHMgd2hlbiBpdCBmaW5kcyBhIGZ1bmN0aW9uIGNhbGwgd2hpY2ggaXQKLSAgIGNhbiByZWxheC4gIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUgVVNFUyByZWxvYyBob2xkcyB0aGUgUEMKLSAgIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggbG9hZHMgdGhlIHJlZ2lzdGVyIHVzZWQgaW4KLSAgIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLSNkZWZpbmUgUl9TSF9VU0VTCTI3CQkvKiAudXNlcyBwc2V1ZG8tb3AgKi8KLQotLyogVGhlIENPVU5UIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUgYXNzZW1ibGVyIHdpbGwKLSAgIGdlbmVyYXRlIENPVU5UIHJlbG9jcyBmb3IgYWRkcmVzc2VzIHJlZmVycmVkIHRvIGJ5IHRoZSByZWdpc3RlcgotICAgbG9hZHMgYXNzb2NpYXRlZCB3aXRoIFVTRVMgcmVsb2NzLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBDT1VOVAotICAgcmVsb2MgaG9sZHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWRkcmVzcyBpcyByZWZlcmVuY2VkIGluIHRoZQotICAgb2JqZWN0IGZpbGUuICAqLwotI2RlZmluZSBSX1NIX0NPVU5UCTI4CQkvKiBDb3VudCBvZiBjb25zdGFudCBwb29sIHVzZXMgKi8KLQotLyogVGhlIEFMSUdOIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUgcl9vZmZzZXQgZmllbGQgaXMKLSAgIHRoZSBwb3dlciBvZiB0d28gdG8gd2hpY2ggc3Vic2VxdWVudCBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUKLSAgIG11c3QgYmUgYWxpZ25lZC4gICovCi0jZGVmaW5lIFJfU0hfQUxJR04JMjkJCS8qIC5hbGlnbiBwc2V1ZG8tb3AgKi8KLQotLyogVGhlIENPREUgYW5kIERBVEEgcmVsb2MgdHlwZXMgYXJlIHVzZWQgZm9yIGFsaWduaW5nIGxvYWQgYW5kIHN0b3JlCi0gICBpbnN0cnVjdGlvbnMuICBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgYSBDT0RFIHJlbG9jIGJlZm9yZSBhCi0gICBibG9jayBvZiBpbnN0cnVjdGlvbnMuICBJdCB3aWxsIGdlbmVyYXRlIGEgREFUQSByZWxvYyBiZWZvcmUgZGF0YS4KLSAgIEEgc2VjdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkIGFzc3VtaW5nIGl0IGNvbnRhaW5zIGRhdGEsIHVubGVzcyBhCi0gICBDT0RFIHJlbG9jIGlzIHNlZW4uICBUaGUgb25seSByZWxldmFudCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gaW4gdGhlCi0gICBDT0RFIGFuZCBEQVRBIHJlbG9jcyBhcmUgdGhlIHNlY3Rpb24gYW5kIHRoZSBhZGRyZXNzLiAgVGhlIHN5bWJvbAotICAgYW5kIG9mZnNldCBhcmUgbWVhbmluZ2xlc3MuICAqLwotI2RlZmluZSBSX1NIX0NPREUJMzAJCS8qIHN0YXJ0IG9mIGNvZGUgKi8KLSNkZWZpbmUgUl9TSF9EQVRBCTMxCQkvKiBzdGFydCBvZiBkYXRhICovCi0KLS8qIFRoZSBMQUJFTCByZWxvYyB0eXBlIGlzIHVzZWQgZm9yIGFsaWduaW5nIGxvYWQgYW5kIHN0b3JlCi0gICBpbnN0cnVjdGlvbnMuICBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgYSBMQUJFTCByZWxvYyBmb3IgZWFjaAotICAgbGFiZWwgd2l0aGluIGEgYmxvY2sgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8KLSAgIGF2b2lkIHN3YXBwaW5nIGluc3RydWN0aW9ucyB3aGljaCBhcmUgdGhlIHRhcmdldHMgb2YgYnJhbmNoZXMuICAqLwotI2RlZmluZSBSX1NIX0xBQkVMCTMyCQkvKiBsYWJlbCAqLwotCi0vKiBOQjogUl9TSF9TV0lUQ0g4IGlzIDMzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvc3BhcmMuaCBiL2luY2x1ZGUvY29mZi9zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEyNGYwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zcGFyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgU3BhcmMuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgYW4gYW1hbGdhbWF0aW9uIG9mIHNldmVyYWwgc3RhbmRhcmQgaW5jbHVkZSBmaWxlcyB0aGF0Ci0gICBkZWZpbmUgY29mZiBmb3JtYXQsIHN1Y2ggYXMgZmlsZWhkci5oLCBhb3V0aGRyLmgsIGFuZCBzbyBmb3J0aC4gIEluCi0gICBhZGRpdGlvbiwgYWxsIGRhdGF0eXBlcyBoYXZlIGJlZW4gdHJhbnNsYXRlZCBpbnRvIGNoYXJhY3RlciBhcnJheXMgb2YKLSAgIChwcmVzdW1lZCkgZXF1aXZhbGVudCBzaXplLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB0aGlzIGZpbGUgY2FuCi0gICBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHN5c3RlbXMgd2hpbGUgc3RpbGwgeWllbGRpbmcgdGhlIHNhbWUgcmVzdWx0cy4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi17Ci0gIGNoYXIgZl9tYWdpY1syXTsJCS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2Nuc1syXTsJCS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgY2hhciBmX3RpbWRhdFs0XTsJCS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyWzRdOwkJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBjaGFyIGZfbnN5bXNbNF07CQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgY2hhciBmX29wdGhkclsyXTsJCS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3NbMl07CQkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCS8qIHJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCAqLwotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCS8qIGZpbGUgaXMgZXhlY3V0YWJsZSAqLwotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCS8qIGxpbmUgbnVtYmVycyBzdHJpcHBlZCAqLwotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQkvKiBsb2NhbCBzeW1ib2xzIHN0cmlwcGVkICovCi0KLSNkZWZpbmUgU1BBUkNNQUdJQwkoMDU0MCkKLQotLyogVGhpcyBpcyBMeW54J3MgYWxsLXBsYXRmb3JtIG1hZ2ljIG51bWJlciBmb3IgZXhlY3V0YWJsZXMuICovCi0KLSNkZWZpbmUgTFlOWENPRkZNQUdJQwkoMDQxNSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhciB2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhciB0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyIGRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyIGJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyIGVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciBkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgICAgIDA0MDQgICAgLyogb2JqZWN0IGZpbGVzLCBlZyBhcyBvdXRwdXQgKi8KLSNkZWZpbmUgWk1BR0lDICAgICAgICAgIDA0MTMgICAgLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0jZGVmaW5lIFNUTUFHSUMJCTA0MDEJLyogdGFyZ2V0IHNobGliICovCi0jZGVmaW5lIFNITUFHSUMJCTA0NDMJLyogaG9zdCAgIHNobGliICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLXsKLSAgY2hhciBzX25hbWVbOF07CQkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICBjaGFyIHNfcGFkZHJbNF07CQkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICBjaGFyIHNfdmFkZHJbNF07CQkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGNoYXIgc19zaXplWzRdOwkJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgY2hhciBzX3NjbnB0cls0XTsJCS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGNoYXIgc19yZWxwdHJbNF07CQkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGNoYXIgc19sbm5vcHRyWzRdOwkJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIGNoYXIgc19ucmVsb2NbMl07CQkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIGNoYXIgc19ubG5ub1syXTsJCS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgY2hhciBzX2ZsYWdzWzRdOwkJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyogTmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zLiAqLwotCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfVFYJIi50diIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICAgTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gICBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICAgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLiAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGxfc3ltbmR4WzRdOwkJLyogZm4gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCAqLwotICAgIGNoYXIgbF9wYWRkcls0XTsJCS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlciAqLwotICB9IGxfYWRkcjsKLSAgY2hhciBsX2xubm9bMl07CQkvKiBsaW5lIG51bWJlciAqLwotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJKDYpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCSg4KQkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCSgxNCkJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQkoNCkJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSNpZiAwIC8qIG9mIGRvdWJ0ZnVsIHZhbHVlICovCi0gICAgY2hhciBlX25wdHJbMl1bNF07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV9sZWFkaW5nX3plcm9bMV07Ci0gICAgICBjaGFyIGVfZGJ4X3R5cGVbMV07Ci0gICAgICBjaGFyIGVfZGJ4X2Rlc2NbMl07Ci0gICAgfSBlX2RieDsKLSNlbmRpZgotICB9IGU7Ci0KLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotICBjaGFyIHBhZGRpbmdbMl07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci17Ci0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3RhZ25keFs0XTsJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewotCWNoYXIgIHhfbG5ub1syXTsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQljaGFyICB4X3NpemVbMl07CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9IHhfbG5zejsKLSAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLSAgICB9IHhfbWlzYzsKLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCWNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotICAgICAgfSB4X2ZjbjsKLSAgICAgIHN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICB9IHhfZmNuYXJ5OwotICAgIGNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0gICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIHhfemVyb2VzWzRdOwotICAgICAgY2hhciB4X29mZnNldFs0XTsKLSAgICB9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF9zY25sZW5bNF07CQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotICAgIGNoYXIgeF9ucmVsb2NbMl07CQkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIGNoYXIgeF9ubGlubm9bMl07CQkvKiAjIGxpbmUgbnVtYmVycyAqLwotICB9IHhfc2NuOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdHZmaWxsWzRdOwkJLyogdHYgZmlsbCB2YWx1ZSAqLwotICAgIGNoYXIgeF90dmxlblsyXTsJCS8qIGxlbmd0aCBvZiAudHYgKi8KLSAgICBjaGFyIHhfdHZyYW5bMl1bMl07CQkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkJLyogLnR2IHNlY3Rpb24gaW5mbyAoaW4gYXV4ZW50IG9mIHN5bSAudHYpKSAqLwotCi0gIGNoYXIgeF9maWxsWzIwXTsJCS8qIGZvcmNlcyB0byAyMC1ieXRlIHNpemUgKi8KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTIwCQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkyMAotCi0jZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3BhcmVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvc3ltLmggYi9pbmNsdWRlL2NvZmYvc3ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjA0YWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3N5bS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBvZiBpbnRlcm5hbCBmb3JtYXQgb2YgTUlQUyBFQ09GRiBzeW1ib2xzLgotICAgT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBNSVBTIENvbXB1dGVyIFN5c3RlbXMgYW5kIFRoaXJkIEV5ZSBTb2Z0d2FyZS4KLSAgIENoYW5nZXMgY29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgCi0KLSAgIFRoaXMgZmlsZSBpcyBqdXN0IGFnZ3JlZ2F0ZWQgd2l0aCB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBHTlUKLSAgIHJlbGVhc2U7IGl0IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgR0FTLCBHREIsIG9yIG90aGVyIEdOVQotICAgcHJvZ3JhbXMuICAqLwotCi0vKgotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICogfCBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTEsIDE5OTAgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMufAotICogfCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlICAgfAotICogfCByaWdodHMgdG8gYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzICAgICAgfAotICogfCBtYWludGFpbmVkIGluIHRoZSBjb3B5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICovCi0jaWZuZGVmIF9TWU1fSAotI2RlZmluZSBfU1lNX0gKLQotLyogKEMpIENvcHlyaWdodCAxOTg0IGJ5IFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgcmlnaHRzIHRvCi0gKiBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4KLSAqCi0gKiBUaGlyZCBFeWUgbWFrZXMgbm8gY2xhaW1zIGFib3V0IHRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoaXMKLSAqIHN5bWJvbCB0YWJsZSB0byBhIHBhcnRpY3VsYXIgdXNlLgotICovCi0KLS8qIAotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBUaGlyZCBFeWUgU3ltYm9sIFRhYmxlLgotICoKLSAqIFN5bWJvbHMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gJ2VuY291bnRlciBvcmRlcicgLSBpLmUuIHRoZSBvcmRlciB0aGF0Ci0gKiB0aGUgdGhpbmdzIHRoZXkgcmVwcmVzZW50IHdlcmUgZW5jb3VudGVyZWQgYnkgdGhlIGNvbXBpbGVyL2Fzc2VtYmxlci9sb2FkZXIuCi0gKiBFWENFUFQgZm9yIGdsb2JhbHMhCVRoZXNlIGFyZSBhc3N1bWVkIHRvIGJlIGJ1bmNoZWQgdG9nZXRoZXIsCi0gKiBwcm9iYWJseSByaWdodCBhZnRlciB0aGUgbGFzdCAnbm9ybWFsJyBzeW1ib2wuICBHbG9iYWxzIEFSRSBzb3J0ZWQKLSAqIGluIGFzY2VuZGluZyBvcmRlci4KLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQSBicmllZiB3b3JkIGFib3V0IFRoaXJkIEV5ZSBuYW1pbmcvdXNlIGNvbnZlbnRpb25zOgotICoKLSAqIEFsbCBhcnJheXMgYW5kIGluZGV4J3MgYXJlIDAgYmFzZWQuCi0gKiBBbGwgImlmb29NYXgiIHZhbHVlcyBhcmUgdGhlIGhpZ2hlc3QgbGVnYWwgdmFsdWUgUExVUyBPTkUuIFRoaXMgbWFrZXMKLSAqIHRoZW0gZ29vZCBmb3IgYWxsb2NhdGluZyBhcnJheXMsIGV0Yy4gQWxsIGNoZWNrcyBhcmUgImlmb28gPCBpZm9vTWF4Ii4KLSAqCi0gKiAiaXN5bSIJSW5kZXggaW50byB0aGUgU1lNYm9sIHRhYmxlLgotICogImlwZCIJSW5kZXggaW50byB0aGUgUHJvY2VkdXJlIERlc2NyaXB0b3IgYXJyYXkuCi0gKiAiaWZkIglJbmRleCBpbnRvIHRoZSBGaWxlIERlc2NyaXB0b3IgYXJyYXkuCi0gKiAiaXNzIglJbmRleCBpbnRvIFN0cmluZyBTcGFjZS4KLSAqICJjYiIJCUNvdW50IG9mIEJ5dGVzLgotICogInJnUGQiCWFycmF5IHdob3NlIGRvbWFpbiBpcyAiMC4uaXBkTWF4LTEiIGFuZCBSYW5HZSBpcyBQRFIuCi0gKiAicmdGZCIJYXJyYXkgd2hvc2UgZG9tYWluIGlzICIwLi5pZmRNYXgtMSIgYW5kIFJhbkdlIGlzIEZEUi4KLSAqLwotCi0KLS8qIAotICogU3ltYm9saWMgSGVhZGVyIChIRFIpIHN0cnVjdHVyZS4KLSAqIEFzIGxvbmcgYXMgYWxsIHRoZSBwb2ludGVycyBhcmUgc2V0IGNvcnJlY3RseSwKLSAqIHdlIGRvbid0IGNhcmUgV0hBVCBvcmRlciB0aGUgdmFyaW91cyBzZWN0aW9ucyBjb21lIG91dCBpbiEKLSAqCi0gKiBBIGZpbGUgcHJvZHVjZWQgc29sZWx5IGZvciB0aGUgdXNlIG9mIENEQiB3aWxsIHByb2JhYmx5IE5PVCBoYXZlCi0gKiBhbnkgaW5zdHJ1Y3Rpb25zIG9yIGRhdGEgYXJlYXMgaW4gaXQsIGFzIHRoZXNlIGFyZSBhdmFpbGFibGUKLSAqIGluIHRoZSBvcmlnaW5hbC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc2hvcnQJbWFnaWM7CQkvKiB0byB2ZXJpZnkgdmFsaWRpdHkgb2YgdGhlIHRhYmxlICovCi0Jc2hvcnQJdnN0YW1wOwkJLyogdmVyc2lvbiBzdGFtcCAqLwotCWxvbmcJaWxpbmVNYXg7CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkxpbmU7CQkvKiBudW1iZXIgb2YgYnl0ZXMgZm9yIGxpbmUgbnVtYmVyIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWxvbmcJaWRuTWF4OwkJLyogbWF4IGluZGV4IGludG8gZGVuc2UgbnVtYmVyIHRhYmxlICovCi0JYmZkX3ZtYQljYkRuT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgZGVuc2UgbnVtYmVyIHRhYmxlICovCi0JbG9uZwlpcGRNYXg7CQkvKiBudW1iZXIgb2YgcHJvY2VkdXJlcyAqLwotCWJmZF92bWEJY2JQZE9mZnNldDsJLyogb2Zmc2V0IHRvIHByb2NlZHVyZSBkZXNjcmlwdG9yIHRhYmxlICovCi0JbG9uZwlpc3ltTWF4OwkvKiBudW1iZXIgb2YgbG9jYWwgc3ltYm9scyAqLwotCWJmZF92bWEJY2JTeW1PZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsb2NhbCBzeW1ib2xzKi8KLQlsb25nCWlvcHRNYXg7CS8qIG1heCBpbmRleCBpbnRvIG9wdGltaXphdGlvbiBzeW1ib2wgZW50cmllcyAqLwotCWJmZF92bWEJY2JPcHRPZmZzZXQ7CS8qIG9mZnNldCB0byBvcHRpbWl6YXRpb24gc3ltYm9sIGVudHJpZXMgKi8KLQlsb25nCWlhdXhNYXg7CS8qIG51bWJlciBvZiBhdXhpbGxhcnkgc3ltYm9sIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiQXV4T2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgYXV4aWxsYXJ5IHN5bWJvbCBlbnRyaWVzKi8KLQlsb25nCWlzc01heDsJCS8qIG1heCBpbmRleCBpbnRvIGxvY2FsIHN0cmluZ3MgKi8KLQliZmRfdm1hCWNiU3NPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsb2NhbCBzdHJpbmdzICovCi0JbG9uZwlpc3NFeHRNYXg7CS8qIG1heCBpbmRleCBpbnRvIGV4dGVybmFsIHN0cmluZ3MgKi8KLQliZmRfdm1hCWNiU3NFeHRPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBleHRlcm5hbCBzdHJpbmdzICovCi0JbG9uZwlpZmRNYXg7CQkvKiBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiRmRPZmZzZXQ7CS8qIG9mZnNldCB0byBmaWxlIGRlc2NyaXB0b3IgdGFibGUgKi8KLQlsb25nCWNyZmQ7CQkvKiBudW1iZXIgb2YgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiUmZkT2Zmc2V0OwkvKiBvZmZzZXQgdG8gcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlICovCi0JbG9uZwlpZXh0TWF4OwkvKiBtYXggaW5kZXggaW50byBleHRlcm5hbCBzeW1ib2xzICovCi0JYmZkX3ZtYQljYkV4dE9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGV4dGVybmFsIHN5bWJvbCBlbnRyaWVzKi8KLQkvKiBJZiB5b3UgYWRkIG1hY2hpbmUgZGVwZW5kZW50IGZpZWxkcywgYWRkIHRoZW0gaGVyZSAqLwotCX0gSERSUiwgKnBIRFJSOyAKLSNkZWZpbmUgY2JIRFJSIHNpemVvZihIRFJSKQotI2RlZmluZSBoZHJOaWwgKChwSERSUikwKQotCi0vKgotICogVGhlIEZEUiBhbmQgUERSIHN0cnVjdHVyZXMgc3BlZWQgbWFwcGluZyBvZiBhZGRyZXNzIDwtPiBuYW1lLgotICogVGhleSBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBtZW1vcnkgb3JkZXIgYW5kIGFyZSBrZXB0IGluCi0gKiBtZW1vcnkgYnkgQ0RCIGF0IHJ1bnRpbWUuCi0gKi8KLQotLyogCi0gKiBGaWxlIERlc2NyaXB0b3IKLSAqCi0gKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIEVWRVJZIEZJTEUsIHdoZXRoZXIgY29tcGlsZWQgd2l0aAotICogZnVsbCBkZWJ1Z2dpbmcgc3ltYm9scyBvciBub3QuICBUaGUgbmFtZSBvZiBhIGZpbGUgc2hvdWxkIGJlCi0gKiB0aGUgcGF0aCBuYW1lIGdpdmVuIHRvIHRoZSBjb21waWxlci4JIFRoaXMgYWxsb3dzIHRoZSB1c2VyCi0gKiB0byBzaW1wbHkgc3BlY2lmeSB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHRoZSBDT01QSUxFUwotICogd2VyZSBkb25lLCBhbmQgd2Ugd2lsbCBiZSBhYmxlIHRvIGZpbmQgdGhlaXIgZmlsZXMuCi0gKiBBIGZpZWxkIHdob3NlIGNvbW1lbnQgc3RhcnRzIHdpdGggIlIgLSAiIGluZGljYXRlcyB0aGF0IGl0IHdpbGwgYmUKLSAqIHNldHVwIGF0IHJ1bnRpbWUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGZkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgZmlsZSAqLwotCWxvbmcJcnNzOwkJLyogZmlsZSBuYW1lIChvZiBzb3VyY2UsIGlmIGtub3duKSAqLwotCWxvbmcJaXNzQmFzZTsJLyogZmlsZSdzIHN0cmluZyBzcGFjZSAqLwotCWJmZF92bWEJY2JTczsJCS8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3MgKi8KLQlsb25nCWlzeW1CYXNlOwkvKiBiZWdpbm5pbmcgb2Ygc3ltYm9scyAqLwotCWxvbmcJY3N5bTsJCS8qIGNvdW50IGZpbGUncyBvZiBzeW1ib2xzICovCi0JbG9uZwlpbGluZUJhc2U7CS8qIGZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLQlsb25nCWNsaW5lOwkJLyogY291bnQgb2YgZmlsZSdzIGxpbmUgc3ltYm9scyAqLwotCWxvbmcJaW9wdEJhc2U7CS8qIGZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLwotCWxvbmcJY29wdDsJCS8qIGNvdW50IG9mIGZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLwotCXVuc2lnbmVkIHNob3J0IGlwZEZpcnN0Oy8qIHN0YXJ0IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotCXNob3J0CWNwZDsJCS8qIGNvdW50IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotCWxvbmcJaWF1eEJhc2U7CS8qIGZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLwotCWxvbmcJY2F1eDsJCS8qIGNvdW50IG9mIGZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLwotCWxvbmcJcmZkQmFzZTsJLyogaW5kZXggaW50byB0aGUgZmlsZSBpbmRpcmVjdCB0YWJsZSAqLwotCWxvbmcJY3JmZDsJCS8qIGNvdW50IGZpbGUgaW5kaXJlY3QgZW50cmllcyAqLwotCXVuc2lnbmVkIGxhbmc6IDU7CS8qIGxhbmd1YWdlIGZvciB0aGlzIGZpbGUgKi8KLQl1bnNpZ25lZCBmTWVyZ2UgOiAxOwkvKiB3aGV0aGVyIHRoaXMgZmlsZSBjYW4gYmUgbWVyZ2VkICovCi0JdW5zaWduZWQgZlJlYWRpbiA6IDE7CS8qIHRydWUgaWYgaXQgd2FzIHJlYWQgaW4gKG5vdCBqdXN0IGNyZWF0ZWQpICovCi0JdW5zaWduZWQgZkJpZ2VuZGlhbiA6IDE7LyogaWYgc2V0LCB3YXMgY29tcGlsZWQgb24gYmlnIGVuZGlhbiBtYWNoaW5lICovCi0JCQkJLyoJYXV4J3Mgd2lsbCBiZSBpbiBjb21waWxlIGhvc3QncyBzZXggKi8KLQl1bnNpZ25lZCBnbGV2ZWwgOiAyOwkvKiBsZXZlbCB0aGlzIGZpbGUgd2FzIGNvbXBpbGVkIHdpdGggKi8KLQl1bnNpZ25lZCByZXNlcnZlZCA6IDIyOyAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZnJvbSBoZWFkZXIgZm9yIHRoaXMgZmlsZSBsbidzICovCi0JYmZkX3ZtYQljYkxpbmU7CQkvKiBzaXplIG9mIGxpbmVzIGZvciB0aGlzIGZpbGUgKi8KLQl9IEZEUiwgKnBGRFI7Ci0jZGVmaW5lIGNiRkRSIHNpemVvZihGRFIpCi0jZGVmaW5lIGZkTmlsICgocEZEUikwKQotI2RlZmluZSBpZmROaWwgLTEKLSNkZWZpbmUgaWZkVGVtcCAwCi0jZGVmaW5lIGlsbk5pbCAtMQotCi0KLS8qIAotICogUHJvY2VkdXJlIERlc2NyaXB0b3IKLSAqCi0gKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIEVWRVJZIFRFWFQgTEFCRUwuCi0gKiBJZiBhIHByb2NlZHVyZSBpcyBpbiBhIGZpbGUgd2l0aCBmdWxsIHN5bWJvbHMsIHRoZW4gaXN5bQotICogd2lsbCBwb2ludCB0byB0aGUgUFJPQyBzeW1ib2xzLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlCi0gKiBnbG9iYWwgc3ltYm9sIGZvciB0aGUgbGFiZWwuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcGRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLwotCWxvbmcJaXN5bTsJCS8qIHN0YXJ0IG9mIGxvY2FsIHN5bWJvbCBlbnRyaWVzICovCi0JbG9uZwlpbGluZTsJCS8qIHN0YXJ0IG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCi0JbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlpb3B0OwkJLyogc3RhcnQgb2Ygb3B0aW1pemF0aW9uIHN5bWJvbCBlbnRyaWVzKi8KLQlsb25nCWZyZWdtYXNrOwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCWZyZWdvZmZzZXQ7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmFtZW9mZnNldDsJLyogZnJhbWUgc2l6ZSAqLwotCXNob3J0CWZyYW1lcmVnOwkvKiBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyICovCi0Jc2hvcnQJcGNyZWc7CQkvKiBvZmZzZXQgb3IgcmVnIG9mIHJldHVybiBwYyAqLwotCWxvbmcJbG5Mb3c7CQkvKiBsb3dlc3QgbGluZSBpbiB0aGUgcHJvY2VkdXJlICovCi0JbG9uZwlsbkhpZ2g7CQkvKiBoaWdoZXN0IGxpbmUgaW4gdGhlIHByb2NlZHVyZSAqLwotCWJmZF92bWEJY2JMaW5lT2Zmc2V0OwkvKiBieXRlIG9mZnNldCBmb3IgdGhpcyBwcm9jZWR1cmUgZnJvbSB0aGUgZmQgYmFzZSAqLwotCS8qIFRoZXNlIGZpZWxkcyBhcmUgbmV3IGZvciA2NCBiaXQgRUNPRkYuICAqLwotCXVuc2lnbmVkIGdwX3Byb2xvZ3VlIDogODsgLyogYnl0ZSBzaXplIG9mIEdQIHByb2xvZ3VlICovCi0JdW5zaWduZWQgZ3BfdXNlZCA6IDE7CS8qIHRydWUgaWYgdGhlIHByb2NlZHVyZSB1c2VzIEdQICovCi0JdW5zaWduZWQgcmVnX2ZyYW1lIDogMTsJLyogdHJ1ZSBpZiByZWdpc3RlciBmcmFtZSBwcm9jZWR1cmUgKi8KLQl1bnNpZ25lZCBwcm9mIDogMTsJLyogdHJ1ZSBpZiBjb21waWxlZCB3aXRoIC1wZyAqLwotCXVuc2lnbmVkIHJlc2VydmVkIDogMTM7CS8qIHJlc2VydmVkOiBtdXN0IGJlIHplcm8gKi8KLQl1bnNpZ25lZCBsb2NhbG9mZiA6IDg7CS8qIG9mZnNldCBvZiBsb2NhbCB2YXJpYWJsZXMgZnJvbSB2ZnAgKi8KLQl9IFBEUiwgKnBQRFI7Ci0jZGVmaW5lIGNiUERSIHNpemVvZihQRFIpCi0jZGVmaW5lIHBkTmlsICgocFBEUikgMCkKLSNkZWZpbmUgaXBkTmlsCS0xCi0KLS8qCi0gKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBydW50aW1lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgdGhlIGxvYWRlcgotICogZm9yIHVzZSBieSB0aGUgc3RhdGljIGV4Y2VwdGlvbiBzeXN0ZW0uCi0gKi8KLS8qCi0gKiBJZiAwJ2Qgb3V0IGJlY2F1c2UgZXhjZXB0aW9uX2luZm8gY2hva2VzIFZpc3VhbCBDKysgYW5kIGJlY2F1c2UgdGhlcmUKLSAqIGRvbid0IHNlZW0gdG8gYmUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBzdHJ1Y3R1cmUgZWxzZXdoZXJlIGluIGdkYi4KLSAqLwotI2lmIDAKLXR5cGVkZWYgc3RydWN0IHJ1bnRpbWVfcGRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLwotCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCi0JbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCi0JbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KLQlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLwotCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KLQlsb25nCWlycHNzOwkJLyogaW5kZXggaW50byB0aGUgcnVudGltZSBzdHJpbmcgdGFibGUgKi8KLQlsb25nCXJlc2VydmVkOwotCXN0cnVjdCBleGNlcHRpb25faW5mbyAqZXhjZXB0aW9uX2luZm87LyogcG9pbnRlciB0byBleGNlcHRpb24gYXJyYXkgKi8KLX0gUlBEUiwgKnBSUERSOwotI2RlZmluZSBjYlJQRFIgc2l6ZW9mKFJQRFIpCi0jZGVmaW5lIHJwZE5pbCAoKHBSUERSKSAwKQotI2VuZGlmCi0KLS8qCi0gKiBMaW5lIE51bWJlcnMKLSAqCi0gKiBMaW5lIE51bWJlcnMgYXJlIHNlZ3JlZ2F0ZWQgZnJvbSB0aGUgbm9ybWFsIHN5bWJvbHMgYmVjYXVzZSB0aGV5Ci0gKiBhcmUgWzFdIHNtYWxsZXIgLCBbMl0gYXJlIG9mIG5vIGludGVyZXN0IHRvIHlvdXIKLSAqIGF2ZXJhZ2UgbG9hZGVyLCBhbmQgWzNdIGFyZSBuZXZlciBuZWVkZWQgaW4gdGhlIG1pZGRsZSBvZiBub3JtYWwKLSAqIHNjYW5uaW5nIGFuZCB0aGVyZWZvcmUgc2xvdyB0aGluZ3MgZG93bi4KLSAqCi0gKiBCeSBkZWZpbml0aW9uLCB0aGUgZmlyc3QgTElORVIgZm9yIGFueSBnaXZlbiBwcm9jZWR1cmUgd2lsbCBoYXZlCi0gKiB0aGUgZmlyc3QgbGluZSBvZiBhIHByb2NlZHVyZSBhbmQgcmVwcmVzZW50IHRoZSBmaXJzdCBhZGRyZXNzLgotICovCi0KLXR5cGVkZWYJbG9uZyBMSU5FUiwgKnBMSU5FUjsKLSNkZWZpbmUgbGluZU5pbCAoKHBMSU5FUikwKQotI2RlZmluZSBjYkxJTkVSIHNpemVvZihMSU5FUikKLSNkZWZpbmUgaWxpbmVOaWwJLTEKLQotCi0KLS8qCi0gKiBUaGUgU3ltYm9sIFN0cnVjdHVyZQkJKEdGVywgdG8gdGhvc2Ugd2hvIEtub3chKQotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlsb25nCWlzczsJCS8qIGluZGV4IGludG8gU3RyaW5nIFNwYWNlIG9mIG5hbWUgKi8KLQliZmRfdm1hCXZhbHVlOwkJLyogdmFsdWUgb2Ygc3ltYm9sICovCi0JdW5zaWduZWQgc3QgOiA2OwkvKiBzeW1ib2wgdHlwZSAqLwotCXVuc2lnbmVkIHNjICA6IDU7CS8qIHN0b3JhZ2UgY2xhc3MgLSB0ZXh0LCBkYXRhLCBldGMgKi8KLQl1bnNpZ25lZCByZXNlcnZlZCA6IDE7CS8qIHJlc2VydmVkICovCi0JdW5zaWduZWQgaW5kZXggOiAyMDsJLyogaW5kZXggaW50byBzeW0vYXV4IHRhYmxlICovCi0JfSBTWU1SLCAqcFNZTVI7Ci0jZGVmaW5lIHN5bU5pbCAoKHBTWU1SKTApCi0jZGVmaW5lIGNiU1lNUiBzaXplb2YoU1lNUikKLSNkZWZpbmUgaXN5bU5pbCAtMQotI2RlZmluZSBpbmRleE5pbCAweGZmZmZmCi0jZGVmaW5lIGlzc05pbCAtMQotI2RlZmluZSBpc3NOdWxsIDAKLQotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnZlcnRzIGEgbWVtb3J5IHJlc2lkZW50IHN0cmluZyB0byBhbiBpc3MuCi0gKiBUaGlzIGhhY2sgaXMgcmVjb2duaXplZCBpbiBTYkZJc3MsIGluIHN5bS5jIG9mIHRoZSBkZWJ1Z2dlci4KLSAqLwotI2RlZmluZSBJc3NGU2Ioc2IpICgweDgwMDAwMDAwIHwgKCh1bnNpZ25lZCBsb25nKShzYikpKQotCi0vKiBFIFggVCBFIFIgTiBBIEwgICBTIFkgTSBCIE8gTCAgUiBFIEMgTyBSIEQKLSAqCi0gKglTYW1lIGFzIHRoZSBTWU1SIGV4Y2VwdCBpdCBjb250YWlucyBmaWxlIGNvbnRleHQgdG8gZGV0ZXJtaW5lIHdoZXJlCi0gKgl0aGUgaW5kZXggaXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGVjb2ZmX2V4dHIgewotCXVuc2lnbmVkIGptcHRibDoxOwkvKiBzeW1ib2wgaXMgYSBqdW1wIHRhYmxlIGVudHJ5IGZvciBzaGxpYnMgKi8KLQl1bnNpZ25lZCBjb2JvbF9tYWluOjE7CS8qIHN5bWJvbCBpcyBhIGNvYm9sIG1haW4gcHJvY2VkdXJlICovCi0JdW5zaWduZWQgd2Vha2V4dDoxOwkvKiBzeW1ib2wgaXMgd2VhayBleHRlcm5hbCAqLwotCXVuc2lnbmVkIHJlc2VydmVkOjEzOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCWludAlpZmQ7CQkvKiB3aGVyZSB0aGUgaXNzIGFuZCBpbmRleCBmaWVsZHMgcG9pbnQgaW50byAqLwotCVNZTVIJYXN5bTsJCS8qIHN5bWJvbCBmb3IgdGhlIGV4dGVybmFsICovCi0JfSBFWFRSLCAqcEVYVFI7Ci0jZGVmaW5lIGV4dE5pbCAoKHBFWFRSKTApCi0jZGVmaW5lIGNiRVhUUiBzaXplb2YoRVhUUikKLQotCi0vKiBBIFUgWCBJIEwgTCBBIFIgWSAgIFQgWSBQIEUJIEkgTiBGIE8gUiBNIEEgVCBJIE8gTiAqLwotCi0vKgotICogVHlwZSBJbmZvcm1hdGlvbiBSZWNvcmQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGZCaXRmaWVsZCA6IDE7IC8qIHNldCBpZiBiaXQgd2lkdGggaXMgc3BlY2lmaWVkICovCi0JdW5zaWduZWQgY29udGludWVkIDogMTsgLyogaW5kaWNhdGVzIGFkZGl0aW9uYWwgVFEgaW5mbyBpbiBuZXh0IEFVWCAqLwotCXVuc2lnbmVkIGJ0ICA6IDY7CS8qIGJhc2ljIHR5cGUgKi8KLQl1bnNpZ25lZCB0cTQgOiA0OwotCXVuc2lnbmVkIHRxNSA6IDQ7Ci0JLyogLS0tLSAxNiBiaXQgYm91bmRhcnkgLS0tLSAqLwotCXVuc2lnbmVkIHRxMCA6IDQ7Ci0JdW5zaWduZWQgdHExIDogNDsJLyogNiB0eXBlIHF1YWxpZmllcnMgLSB0cVB0ciwgZXRjLiAqLwotCXVuc2lnbmVkIHRxMiA6IDQ7Ci0JdW5zaWduZWQgdHEzIDogNDsKLQl9IFRJUiwgKnBUSVI7Ci0jZGVmaW5lIGNiVElSIHNpemVvZihUSVIpCi0jZGVmaW5lIHRpTmlsICgocFRJUikwKQotI2RlZmluZSBpdHFNYXggNgotCi0vKgotICogUmVsYXRpdmUgc3ltYm9sIHJlY29yZAotICoKLSAqIElmIHRoZSByZmQgZmllbGQgaXMgNDA5NSwgdGhlIGluZGV4IGZpZWxkIGluZGV4ZXMgaW50byB0aGUgZ2xvYmFsIHN5bWJvbAotICoJdGFibGUuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkCXJmZCA6IDEyOyAgICAvKiBpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCi0JdW5zaWduZWQJaW5kZXggOiAyMDsgLyogaW5kZXggaW50IHN5bS9hdXgvaXNzIHRhYmxlcyAqLwotCX0gUk5EWFIsICpwUk5EWFI7Ci0jZGVmaW5lIGNiUk5EWFIgc2l6ZW9mKFJORFhSKQotI2RlZmluZSBybmR4TmlsICgocFJORFhSKTApCi0KLS8qIGRlbnNlIG51bWJlcnMgb3Igc29tZXRpbWVzIGNhbGxlZCBibG9jayBudW1iZXJzIGFyZSBzdG9yZWQgaW4gdGhpcyB0eXBlLAotICoJYSByZmQgb2YgMHhmZmZmZmZmZiBpcyBhbiBpbmRleCBpbnRvIHRoZSBnbG9iYWwgdGFibGUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nCXJmZDsgICAgLyogaW5kZXggaW50byB0aGUgZmlsZSB0YWJsZSAqLwotCXVuc2lnbmVkIGxvbmcJaW5kZXg7IAkvKiBpbmRleCBpbnQgc3ltL2F1eC9pc3MgdGFibGVzICovCi0JfSBETlIsICpwRE5SOwotI2RlZmluZSBjYkROUiBzaXplb2YoRE5SKQotI2RlZmluZSBkbk5pbCAoKHBETlIpMCkKLQotCi0KLS8qCi0gKiBBdXhpbGxhcnkgaW5mb3JtYXRpb24gb2NjdXJzIG9ubHkgaWYgbmVlZGVkLgotICogSXQgQUxXQVlTIG9jY3VycyBpbiB0aGlzIG9yZGVyIHdoZW4gcHJlc2VudC4KLQotCSAgICBpc3ltTWFjCQl1c2VkIGJ5IHN0UHJvYyBvbmx5Ci0JICAgIFRJUgkJCXR5cGUgaW5mbwotCSAgICBUSVIJCQlhZGRpdGlvbmFsIFRRIGluZm8gKGlmIGZpcnN0IFRJUiB3YXMgbm90IGVub3VnaCkKLQkgICAgcm5keAkJaWYgKGJ0ID09IGJ0U3RydWN0LGJ0VW5pb24sYnRFbnVtLGJ0U2V0LGJ0UmFuZ2UsCi0JCQkJICAgIGJ0VHlwZWRlZik6Ci0JCQkJICAgIHJzeW0uaW5kZXggPT0gaWF1eCBmb3IgYnRTZXQgb3IgYnRSYW5nZQotCQkJCSAgICBlbHNlIHJzeW0uaW5kZXggPT0gaXN5bQotCSAgICBkaW1Mb3cJCWJ0UmFuZ2UsIGJ0U2V0Ci0JICAgIGRpbU1hYwkJYnRSYW5nZSwgYnRTZXQKLQkgICAgcm5keDAJCUFzIG1hbnkgYXMgdGhlcmUgYXJlIHRxIGFycmF5cwotCSAgICBkaW1Mb3cwCi0JICAgIGRpbUhpZ2gwCi0JICAgIC4uLgotCSAgICBybmR4TWF4LTEKLQkgICAgZGltTG93TWF4LTEKLQkgICAgZGltSGlnaE1heC0xCi0JICAgIHdpZHRoIGluIGJpdHMJaWYgKGJpdCBmaWVsZCksIHdpZHRoIGluIGJpdHMuCi0gKi8KLSNkZWZpbmUgY0F1eE1heCAoNiArIChpZGltTWF4KjMpKQotCi0vKiBhIHVuaW9uIG9mIGFsbCBwb3NzaWJsZSBpbmZvIGluIHRoZSBBVVggdW5pdmVyc2UgKi8KLXR5cGVkZWYgdW5pb24gewotCVRJUgl0aTsJCS8qIHR5cGUgaW5mb3JtYXRpb24gcmVjb3JkICovCi0JUk5EWFIJcm5keDsJCS8qIHJlbGF0aXZlIGluZGV4IGludG8gc3ltYm9sIHRhYmxlICovCi0JbG9uZwlkbkxvdzsJCS8qIGxvdyBkaW1lbnNpb24gKi8KLQlsb25nCWRuSGlnaDsJCS8qIGhpZ2ggZGltZW5zaW9uICovCi0JbG9uZwlpc3ltOwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IChlbmQgb2YgcHJvYykgKi8KLQlsb25nCWlzczsJCS8qIGluZGV4IGludG8gc3RyaW5nIHNwYWNlIChub3QgdXNlZCkgKi8KLQlsb25nCXdpZHRoOwkJLyogd2lkdGggZm9yIG5vbi1kZWZhdWx0IHNpemVkIHN0cnVjIGZpZWxkcyAqLwotCWxvbmcJY291bnQ7CQkvKiBjb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgYXJtICovCi0JfSBBVVhVLCAqcEFVWFU7Ci0jZGVmaW5lIGNiQVVYVSBzaXplb2YoQVVYVSkKLSNkZWZpbmUgYXV4TmlsICgocEFVWFUpMCkKLSNkZWZpbmUgaWF1eE5pbCAtMQotCi0KLS8qCi0gKiBPcHRpbWl6YXRpb24gc3ltYm9scwotICoKLSAqIE9wdGltaXphdGlvbiBzeW1ib2xzIGNvbnRhaW4gc29tZSBvdmVybGFwIGluZm9ybWF0aW9uIHdpdGggdGhlIG5vcm1hbAotICogc3ltYm9sIHRhYmxlLiBJbiBwYXJ0aWN1bGFyLCB0aGUgcHJvYyBpbmZvcm1hdGlvbgotICogaXMgc29tZXdoYXQgcmVkdW5kYW50IGJ1dCBuZWNlc3NhcnkgdG8gZWFzaWx5IGZpbmQgdGhlIG90aGVyIGluZm9ybWF0aW9uCi0gKiBwcmVzZW50LiAKLSAqCi0gKiBBbGwgb2YgdGhlIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhc3Qgb3RQcm9jCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIG90OiA4OwkJLyogb3B0aW1pemF0aW9uIHR5cGUgKi8KLQl1bnNpZ25lZCB2YWx1ZTogMjQ7CS8qIGFkZHJlc3Mgd2hlcmUgd2UgYXJlIG1vdmluZyBpdCB0byAqLwotCVJORFhSCXJuZHg7CQkvKiBwb2ludHMgdG8gYSBzeW1ib2wgb3Igb3B0IGVudHJ5ICovCi0JdW5zaWduZWQgbG9uZwlvZmZzZXQ7CS8qIHJlbGF0aXZlIG9mZnNldCB0aGlzIG9jY3VyZWQgKi8KLQl9IE9QVFIsICpwT1BUUjsKLSNkZWZpbmUgb3B0TmlsCSgocE9QVFIpIDApCi0jZGVmaW5lIGNiT1BUUiBzaXplb2YoT1BUUikKLSNkZWZpbmUgaW9wdE5pbCAtMQotCi0vKgotICogRmlsZSBJbmRpcmVjdAotICoKLSAqIFdoZW4gYSBzeW1ib2wgaXMgcmVmZXJlbmNlZCBhY3Jvc3MgZmlsZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgaXMgdXNlZDoKLSAqCTEpIHVzZSB0aGUgZmlsZSBpbmRleCB0byBnZXQgdGhlIEZpbGUgaW5kaXJlY3QgZW50cnkuCi0gKgkyKSB1c2UgdGhlIGZpbGUgaW5kaXJlY3QgZW50cnkgdG8gZ2V0IHRoZSBGaWxlIGRlc2NyaXB0b3IuCi0gKgkzKSBhZGQgdGhlIHN5bSBpbmRleCB0byB0aGUgYmFzZSBvZiB0aGF0IGZpbGUncyBzeW0gdGFibGUKLSAqCi0gKi8KLQotdHlwZWRlZiBsb25nIFJGRFQsICpwUkZEVDsKLSNkZWZpbmUgY2JSRkRUIHNpemVvZihSRkRUKQotI2RlZmluZSByZmROaWwJLTEKLQotLyoKLSAqIFRoZSBmaWxlIGluZGlyZWN0IHRhYmxlIGluIHRoZSBtaXBzIGxvYWRlciBpcyBrbm93biBhcyBhbiBhcnJheSBvZiBGSVRzLgotICogVGhpcyBpcyBkb25lIHRvIGtlZXAgdGhlIGNvZGUgaW4gdGhlIGxvYWRlciByZWFkYWJsZSBpbiB0aGUgYXJlYSB3aGVyZQotICogdGhlc2UgdGFibGVzIGFyZSBtZXJnZWQuICBOb3RlIHRoaXMgaXMgb25seSBhIG5hbWUgY2hhbmdlLgotICovCi10eXBlZGVmIGxvbmcgRklULCAqcEZJVDsKLSNkZWZpbmUgY2JGSVQJc2l6ZW9mKEZJVCkKLSNkZWZpbmUgaWZpTmlsCS0xCi0jZGVmaW5lIGZpTmlsCSgocEZJVCkgMCkKLQotI2lmZGVmIF9MQU5HVUFHRV9QQVNDQUwKLSNkZWZpbmUgaWZkTmlsIC0xCi0jZGVmaW5lIGlsbk5pbCAtMQotI2RlZmluZSBpcGROaWwgLTEKLSNkZWZpbmUgaWxpbmVOaWwgLTEKLSNkZWZpbmUgaXN5bU5pbCAtMQotI2RlZmluZSBpbmRleE5pbCAxNiNmZmZmZgotI2RlZmluZSBpc3NOaWwgLTEKLSNkZWZpbmUgaXNzTnVsbCAwCi0jZGVmaW5lIGl0cU1heCA2Ci0jZGVmaW5lIGlhdXhOaWwgLTEKLSNkZWZpbmUgaW9wdE5pbCAtMQotI2RlZmluZSByZmROaWwgLTEKLSNkZWZpbmUgaWZpTmlsIC0xCi0jZW5kaWYJLyogX0xBTkdVQUdFX1BBU0NBTCAqLwotCi0KLS8qIERlbnNlIG51bWJlcnMKLSAqCi0gKiBSYXRoZXIgdGhhbiB1c2UgZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4IHBhaXJzIHRvIHJlcHJlc2VudCBzeW1ib2xzCi0gKglhbmQgZ2xvYmFscywgd2UgdXNlIGRlbnNlIG51bWJlciBzbyB0aGF0IHRoZXkgY2FuIGJlIGVhc2lseSBlbWJlZGVkCi0gKglpbiBpbnRlcm1lZGlhdGUgY29kZSBhbmQgdGhlIHByb2dyYW1zIHRoYXQgcHJvY2VzcyB0aGVtIGNhbgotICoJdXNlIGRpcmVjdCBhY2Nlc3MgdGFibHMgaW5zdGVhZCBvZiBoYXNoIHRhYmxlICh3aGljaCB3b3VsZCBiZQotICoJbmVjZXNhcnkgb3RoZXJ3aXNlIGJlY2F1c2Ugb2YgdGhlIHNwYXJzZSBuYW1lIHNwYWNlIGNhdXNlZCBieQotICoJZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4IHBhaXJzLiBEZW5zZSBudW1iZXIgYXJlIHJlcHJlc2VudGVkCi0gKglieSBSTkRYUnMuCi0gKi8KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVmaW5lcyB0aGUgbWVhbmluZyBvZiBlYWNoIFNZTSBmaWVsZCBhcwotICogYSBmdW5jdGlvbiBvZiB0aGUgInN0Ii4gKHNjRC9CID09IHNjRGF0YSBPUiBzY0JzcykKLSAqCi0gKiBOb3RlOiB0aGUgdmFsdWUgImlzeW1NYWMiIGlzIHVzZWQgYnkgc3ltYm9scyB0aGF0IGhhdmUgdGhlIGNvbmNlcHQKLSAqIG9mIGVuY2xvc2luZyBhIGJsb2NrIG9mIHJlbGF0ZWQgaW5mb3JtYXRpb24uCSBUaGlzIHZhbHVlIGlzIHRoZQotICogaXN5bSBvZiB0aGUgZmlyc3Qgc3ltYm9sIEFGVEVSIHRoZSBlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5Ci0gKiBzeW1ib2wuIEZvciBleGFtcGxlIGlmIGEgcHJvY2VkdXJlIHdhcyBhdCBpc3ltPT05MCBhbmQgaGFkIGFuCi0gKiBpc3ltTWFjPT0xNTUsIHRoZSBhc3NvY2lhdGVkIGVuZCB3b3VsZCBiZSBhdCBpc3ltPT0xNTQsIGFuZCB0aGUKLSAqIHN5bWJvbCBhdCAxNTUgd291bGQgcHJvYmFibHkgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSkgYmUgdGhlCi0gKiBzeW1ib2wgZm9yIHRoZSBuZXh0IHByb2NlZHVyZS4gIFRoaXMgYWxsb3dzIHJhcGlkIHNraXBwaW5nIG92ZXIKLSAqIGludGVybmFsIGluZm9ybWF0aW9uIG9mIHZhcmlvdXMgc29ydHMuICJzdEVuZCJzIEFMV0FZUyBoYXZlIHRoZQotICogaXN5bSBvZiB0aGUgcHJpbWFyeSBzeW1ib2wgdGhhdCBzdGFydGVkIHRoZSBibG9jay4KLSAqIAotCi1TVAkJU0MJVkFMVUUJCUlOREVYCi0tLS0tLS0tLQktLS0tLS0JLS0tLS0tLS0JLS0tLS0tCi1zdEZpbGUJCXNjVGV4dAlhZGRyZXNzCQlpc3ltTWFjCi1zdExhYmVsCQlzY1RleHQJYWRkcmVzcwkJLS0tCi1zdEdsb2JhbAlzY0QvQglhZGRyZXNzCQlpYXV4Ci1zdFN0YXRpYwlzY0QvQglhZGRyZXNzCQlpYXV4Ci1zdFBhcmFtCQlzY0FicwlvZmZzZXQJCWlhdXgKLXN0TG9jYWwJCXNjQWJzCW9mZnNldAkJaWF1eAotc3RQcm9jCQlzY1RleHQJYWRkcmVzcwkJaWF1eAkoaXN5bU1hYyBpcyBmaXJzdCBBVVgpCi1zdFN0YXRpY1Byb2MJc2NUZXh0CWFkZHJlc3MJCWlhdXgJKGlzeW1NYWMgaXMgZmlyc3QgQVVYKQotCi1zdE1lbWJlcglzY05pbAlvcmRpbmFsCQktLS0JKGlmIG1lbWJlciBvZiBlbnVtKQotCShtaXBzcmVhZCB0aGlua3MgdGhlIGNhc2UgYmVsb3cgaGFzIGEgYml0LCBub3QgYnl0ZSwgb2Zmc2V0LikKLXN0TWVtYmVyCXNjTmlsCWJ5dGUgb2Zmc2V0CWlhdXgJKGlmIG1lbWJlciBvZiBzdHJ1Y3QvdW5pb24pCi1zdE1lbWJlcglzY0JpdHMJYml0IG9mZnNldAlpYXV4CShiaXQgZmllbGQgc3BlYykKLQotc3RCbG9jawkJc2NUZXh0CWFkZHJlc3MJCWlzeW1NYWMgKHRleHQgYmxvY2spCi0JKHRoZSBjb2RlIHNlZW1zIHRvIHRoaW5rIHRoYXQgcmF0aGVyIHRoYW4gc2NOaWwsIHdlIHNlZSBzY0luZm8gZm9yCi0JIHRoZSB0d28gY2FzZXMgYmVsb3cuKQotc3RCbG9jawkJc2NOaWwJY2IJCWlzeW1NYWMgKHN0cnVjdC91bmlvbiBtZW1iZXIgZGVmaW5lKQotc3RCbG9jawkJc2NOaWwJY01lbWJlcnMJaXN5bU1hYyAoZW51bSBtZW1iZXIgZGVmaW5lKQotCi0JKE5ldyB0eXBlcyBhZGRlZCBieSBTR0kgdG8gc2ltcGxpZnkgdGhpbmdzOikKLXN0U3RydWN0CXNjSW5mbwljYgkJaXN5bU1hYyAoc3RydWN0IHR5cGUgZGVmaW5lKQotc3RVbmlvbgkJc2NJbmZvCWNiCQlpc3ltTWFjICh1bmlvbiAgdHlwZSBkZWZpbmUpCi1zdEVudW0JCXNjSW5mbwljTWVtYmVycwlpc3ltTWFjIChlbnVtICAgdHlwZSBkZWZpbmUpCi0KLXN0RW5kCQlzY1RleHQJYWRkcmVzcwkJaXN5bVN0YXJ0Ci1zdEVuZAkJc2NOaWwJLS0tLS0tLQkJaXN5bVN0YXJ0IChzdHJ1Y3QvdW5pb24vZW51bSkKLQotc3RUeXBlZGVmCXNjTmlsCS0tLS0tLS0JCWlhdXgKLXN0UmVnUmVsb2MJc2M/Pz8JdmFsdWUJCW9sZCByZWdpc3RlciBudW1iZXIKLXN0Rm9yd2FyZAlzYz8/PwluZXcgYWRkcmVzcwlpc3ltIHRvIG9yaWdpbmFsIHN5bWJvbAotCi1zdENvbnN0YW50CXNjSW5mbwl2YWx1ZQkJLS0tIChzY2FsYXIpCi1zdENvbnN0YW50CXNjSW5mbwlpc3MJCS0tLSAoY29tcGxleCwgZS5nLiBzdHJpbmcpCi0KLSAqCi0gKi8KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmggYi9pbmNsdWRlL2NvZmYvc3ltY29uc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZWVmMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc3ltY29uc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgb2YgY29uc3RhbnRzIGZvciBpbnRlcm5hbCBmb3JtYXQgb2YgTUlQUyBFQ09GRiBzeW1ib2xzLgotICAgT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBNSVBTIENvbXB1dGVyIFN5c3RlbXMgYW5kIFRoaXJkIEV5ZSBTb2Z0d2FyZS4KLSAgIENoYW5nZXMgY29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgotCi0gICBUaGlzIGZpbGUgaXMganVzdCBhZ2dyZWdhdGVkIHdpdGggdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgR05VCi0gICByZWxlYXNlOyBpdCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIEdBUywgR0RCLCBvciBvdGhlciBHTlUKLSAgIHByb2dyYW1zLiAgKi8KLQotLyoKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqIHwgQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkxLCAxOTkwIE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLnwKLSAqIHwgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSAgIHwKLSAqIHwgcmlnaHRzIHRvIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyAgICAgIHwKLSAqIHwgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqLwotCi0vKiAoQykgQ29weXJpZ2h0IDE5ODQgYnkgVGhpcmQgRXllIFNvZnR3YXJlLCBJbmMuCi0gKgotICogVGhpcmQgRXllIFNvZnR3YXJlLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSByaWdodHMgdG8KLSAqIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyBtYWludGFpbmVkIGluIHRoZSBjb3B5LgotICoKLSAqIFRoaXJkIEV5ZSBtYWtlcyBubyBjbGFpbXMgYWJvdXQgdGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhpcwotICogc3ltYm9sIHRhYmxlIHRvIGEgcGFydGljdWxhciB1c2UuCi0gKi8KLQotLyogZ2xldmVscyBmb3IgZmllbGQgaW4gRkRSICovCi0jZGVmaW5lIEdMRVZFTF8wCTIKLSNkZWZpbmUgR0xFVkVMXzEJMQotI2RlZmluZSBHTEVWRUxfMgkwCS8qIGZvciB1cHdhcmQgY29tcGF0IHJlYXNvbnMuICovCi0jZGVmaW5lIEdMRVZFTF8zCTMKLQotLyogbWFnaWMgbnVtYmVyIGZvIHN5bWhlYWRlciAqLwotI2RlZmluZSBtYWdpY1N5bQkweDcwMDkKLS8qIFRoZSBBbHBoYSB1c2VzIHRoaXMgdmFsdWUgaW5zdGVhZCwgZm9yIHNvbWUgcmVhc29uLiAgKi8KLSNkZWZpbmUgbWFnaWNTeW0yCTB4MTk5MgotCi0vKiBMYW5ndWFnZSBjb2RlcyAqLwotI2RlZmluZSBsYW5nQwkJMAkKLSNkZWZpbmUgbGFuZ1Bhc2NhbAkxCi0jZGVmaW5lIGxhbmdGb3J0cmFuCTIKLSNkZWZpbmUJbGFuZ0Fzc2VtYmxlcgkzCS8qIG9uZSBBc3NlbWJsZXkgaW5zdCBtaWdodCBtYXAgdG8gbWFueSBtYWNoICovCi0jZGVmaW5lIGxhbmdNYWNoaW5lCTQKLSNkZWZpbmUgbGFuZ05pbAkJNQotI2RlZmluZSBsYW5nQWRhCQk2Ci0jZGVmaW5lIGxhbmdQbDEJCTcKLSNkZWZpbmUgbGFuZ0NvYm9sCTgKLSNkZWZpbmUgbGFuZ1N0ZGMJOQkvKiBGSVhNRTogQ29sbGlkZXMgd2l0aCBTR0kgbGFuZ0NwbHVzcGx1cyAqLwotI2RlZmluZSBsYW5nQ3BsdXNwbHVzCTkJLyogRklYTUU6IENvbGxpZGVzIHdpdGggbGFuZ1N0ZGMgKi8KLSNkZWZpbmUgbGFuZ0NwbHVzcGx1c1YyCTEwCS8qIFNHSSBhZGRpdGlvbiAqLwotI2RlZmluZSBsYW5nTWF4CQkxMQkvKiBtYXhpbXVuIGFsbG93ZWQgMzIgLS0gNSBiaXRzICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHZhbHVlIGRlZmluaXRpb25zIGZvciB0aGUgZmllbGRzIGluIHRoZSBTWU1SICovCi0KLS8qCi0gKiBTdG9yYWdlIENsYXNzZXMKLSAqLwotCi0jZGVmaW5lIHNjTmlsCQkwCi0jZGVmaW5lIHNjVGV4dAkJMQkvKiB0ZXh0IHN5bWJvbCAqLwotI2RlZmluZSBzY0RhdGEJCTIJLyogaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSNkZWZpbmUgc2NCc3MJCTMJLyogdW4taW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSNkZWZpbmUgc2NSZWdpc3Rlcgk0CS8qIHZhbHVlIG9mIHN5bWJvbCBpcyByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgc2NBYnMJCTUJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCi0jZGVmaW5lIHNjVW5kZWZpbmVkCTYJLyogd2hvIGtub3dzPyAqLwotI2RlZmluZSBzY0NkYkxvY2FsCTcJLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBzZS0+dmEuPz8gKi8KLSNkZWZpbmUgc2NCaXRzCQk4CS8qIHRoaXMgaXMgYSBiaXQgZmllbGQgKi8KLSNkZWZpbmUgc2NDZGJTeXN0ZW0JOQkvKiB2YXJpYWJsZSdzIHZhbHVlIGlzIElOIENEQidzIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUgc2NEYngJCTkJLyogb3ZlcmxhcCBkYnggaW50ZXJuYWwgdXNlICovCi0jZGVmaW5lIHNjUmVnSW1hZ2UJMTAJLyogcmVnaXN0ZXIgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKi8KLSNkZWZpbmUgc2NJbmZvCQkxMQkvKiBzeW1ib2wgY29udGFpbnMgZGVidWdnZXIgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgc2NVc2VyU3RydWN0CTEyCS8qIGFkZHJlc3MgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcyAqLwotI2RlZmluZSBzY1NEYXRhCQkxMwkvKiBsb2FkIHRpbWUgb25seSBzbWFsbCBkYXRhICovCi0jZGVmaW5lIHNjU0JzcwkJMTQJLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgY29tbW9uICovCi0jZGVmaW5lIHNjUkRhdGEJCTE1CS8qIGxvYWQgdGltZSBvbmx5IHJlYWQgb25seSBkYXRhICovCi0jZGVmaW5lIHNjVmFyCQkxNgkvKiBWYXIgcGFyYW1ldGVyIChmb3J0cmFuLHBhc2NhbCkgKi8KLSNkZWZpbmUgc2NDb21tb24JMTcJLyogY29tbW9uIHZhcmlhYmxlICovCi0jZGVmaW5lIHNjU0NvbW1vbgkxOAkvKiBzbWFsbCBjb21tb24gKi8KLSNkZWZpbmUgc2NWYXJSZWdpc3RlcgkxOQkvKiBWYXIgcGFyYW1ldGVyIGluIGEgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgc2NWYXJpYW50CTIwCS8qIFZhcmlhbnQgcmVjb3JkICovCi0jZGVmaW5lIHNjU1VuZGVmaW5lZAkyMQkvKiBzbWFsbCB1bmRlZmluZWQoZXh0ZXJuYWwpIGRhdGEgKi8KLSNkZWZpbmUgc2NJbml0CQkyMgkvKiAuaW5pdCBzZWN0aW9uIHN5bWJvbCAqLwotI2RlZmluZSBzY0Jhc2VkVmFyCTIzCS8qIEZvcnRyYW4gb3IgUEwvMSBwdHIgYmFzZWQgdmFyICovIAotI2RlZmluZSBzY1hEYXRhICAgICAgICAgMjQgICAgICAvKiBleGNlcHRpb24gaGFuZGxpbmcgZGF0YSAqLwotI2RlZmluZSBzY1BEYXRhICAgICAgICAgMjUgICAgICAvKiBQcm9jZWR1cmUgc2VjdGlvbiAqLwotI2RlZmluZSBzY0ZpbmkgICAgICAgICAgMjYgICAgICAvKiAuZmluaSBzZWN0aW9uICovCi0jZGVmaW5lIHNjUkNvbnN0CTI3CS8qIC5yY29uc3Qgc2VjdGlvbiAqLwotI2RlZmluZSBzY01heAkJMzIKLQotCi0vKgotICogICBTeW1ib2wgVHlwZXMKLSAqLwotCi0jZGVmaW5lIHN0TmlsCQkwCS8qIE51dGhpbicgc3BlY2lhbCAqLwotI2RlZmluZSBzdEdsb2JhbAkxCS8qIGV4dGVybmFsIHN5bWJvbCAqLwotI2RlZmluZSBzdFN0YXRpYwkyCS8qIHN0YXRpYyAqLwotI2RlZmluZSBzdFBhcmFtCQkzCS8qIHByb2NlZHVyZSBhcmd1bWVudCAqLwotI2RlZmluZSBzdExvY2FsCQk0CS8qIGxvY2FsIHZhcmlhYmxlICovCi0jZGVmaW5lIHN0TGFiZWwJCTUJLyogbGFiZWwgKi8KLSNkZWZpbmUgc3RQcm9jCQk2CS8qICAgICAiICAgICAgIgkgUHJvY2VkdXJlICovCi0jZGVmaW5lIHN0QmxvY2sJCTcJLyogYmVnaW5ubmluZyBvZiBibG9jayAqLwotI2RlZmluZSBzdEVuZAkJOAkvKiBlbmQgKG9mIGFueXRoaW5nKSAqLwotI2RlZmluZSBzdE1lbWJlcgk5CS8qIG1lbWJlciAob2YgYW55dGhpbmcJLSBzdHJ1Y3QvdW5pb24vZW51bSAqLwotI2RlZmluZSBzdFR5cGVkZWYJMTAJLyogdHlwZSBkZWZpbml0aW9uICovCi0jZGVmaW5lIHN0RmlsZQkJMTEJLyogZmlsZSBuYW1lICovCi0jZGVmaW5lIHN0UmVnUmVsb2MJMTIJLyogcmVnaXN0ZXIgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBzdEZvcndhcmQJMTMJLyogZm9yd2FyZGluZyBhZGRyZXNzICovCi0jZGVmaW5lIHN0U3RhdGljUHJvYwkxNAkvKiBsb2FkIHRpbWUgb25seSBzdGF0aWMgcHJvY3MgKi8KLSNkZWZpbmUgc3RDb25zdGFudAkxNQkvKiBjb25zdCAqLwotI2RlZmluZSBzdFN0YVBhcmFtCTE2CS8qIEZvcnRyYW4gc3RhdGljIHBhcmFtZXRlcnMgKi8KLSAgICAvKiBUaGVzZSBuZXcgc3ltYm9sIHR5cGVzIGhhdmUgYmVlbiByZWNlbnRseSBhZGRlZCB0byBTR0kgbWFjaGluZXMuICovCi0jZGVmaW5lIHN0U3RydWN0CTI2CS8qIEJlZ2lubmluZyBvZiBibG9jayBkZWZpbmluZyBhIHN0cnVjdCB0eXBlICovCi0jZGVmaW5lIHN0VW5pb24JCTI3CS8qIEJlZ2lubmluZyBvZiBibG9jayBkZWZpbmluZyBhIHVuaW9uIHR5cGUgKi8KLSNkZWZpbmUgc3RFbnVtCQkyOAkvKiBCZWdpbm5pbmcgb2YgYmxvY2sgZGVmaW5pbmcgYW4gZW51bSB0eXBlICovCi0jZGVmaW5lIHN0SW5kaXJlY3QJMzQJLyogSW5kaXJlY3QgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0gICAgLyogUHNldWRvLXN5bWJvbHMgLSBpbnRlcm5hbCB0byBkZWJ1Z2dlciAqLwotI2RlZmluZSBzdFN0cgkJNjAJLyogc3RyaW5nICovCi0jZGVmaW5lIHN0TnVtYmVyCTYxCS8qIHB1cmUgbnVtYmVyIChpZS4gNCBOT1IgMisyKSAqLwotI2RlZmluZSBzdEV4cHIJCTYyCS8qIDIrMiB2cy4gNCAqLwotI2RlZmluZSBzdFR5cGUJCTYzCS8qIHBvc3QtY29lcnNpb24gU0VSICovCi0jZGVmaW5lIHN0TWF4CQk2NAotCi0vKiBkZWZpbml0aW9ucyBmb3IgZmllbGRzIGluIFRJUiAqLwotCi0vKiB0eXBlIHF1YWxpZmllcnMgZm9yIHRpLnRxMCAtPiB0aS4oaXRxTWF4LTEpICovCi0jZGVmaW5lIHRxTmlsCTAJLyogYnQgaXMgd2hhdCB5b3Ugc2VlICovCi0jZGVmaW5lIHRxUHRyCTEJLyogcG9pbnRlciAqLwotI2RlZmluZSB0cVByb2MJMgkvKiBwcm9jZWR1cmUgKi8KLSNkZWZpbmUgdHFBcnJheSAzCS8qIGR1aCAqLwotI2RlZmluZSB0cUZhcgk0CS8qIGxvbmdlciBhZGRyZXNzaW5nIC0gODA4Ni84IGxhbmQgKi8KLSNkZWZpbmUgdHFWb2wJNQkvKiB2b2xhdGlsZSAqLwotI2RlZmluZSB0cUNvbnN0IDYJLyogY29uc3QgKi8KLSNkZWZpbmUgdHFNYXgJOAotCi0vKiBiYXNpYyB0eXBlcyBhcyBzZWVuIGluIHRpLmJ0ICovCi0jZGVmaW5lIGJ0TmlsCQkwCS8qIHVuZGVmaW5lZCAoYWxzbywgZW51bSBtZW1iZXJzKSAqLwotI2RlZmluZSBidEFkcgkJMQkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLwotI2RlZmluZSBidENoYXIJCTIJLyogY2hhcmFjdGVyICovCi0jZGVmaW5lIGJ0VUNoYXIJCTMJLyogdW5zaWduZWQgY2hhcmFjdGVyICovCi0jZGVmaW5lIGJ0U2hvcnQJCTQJLyogc2hvcnQgKi8KLSNkZWZpbmUgYnRVU2hvcnQJNQkvKiB1bnNpZ25lZCBzaG9ydCAqLwotI2RlZmluZSBidEludAkJNgkvKiBpbnQgKi8KLSNkZWZpbmUgYnRVSW50CQk3CS8qIHVuc2lnbmVkIGludCAqLwotI2RlZmluZSBidExvbmcJCTgJLyogbG9uZyAqLwotI2RlZmluZSBidFVMb25nCQk5CS8qIHVuc2lnbmVkIGxvbmcgKi8KLSNkZWZpbmUgYnRGbG9hdAkJMTAJLyogZmxvYXQgKHJlYWwpICovCi0jZGVmaW5lIGJ0RG91YmxlCTExCS8qIERvdWJsZSAocmVhbCkgKi8KLSNkZWZpbmUgYnRTdHJ1Y3QJMTIJLyogU3RydWN0dXJlIChSZWNvcmQpICovCi0jZGVmaW5lIGJ0VW5pb24JCTEzCS8qIFVuaW9uICh2YXJpYW50KSAqLwotI2RlZmluZSBidEVudW0JCTE0CS8qIEVudW1lcmF0ZWQgKi8KLSNkZWZpbmUgYnRUeXBlZGVmCTE1CS8qIGRlZmluZWQgdmlhIGEgdHlwZWRlZiwgaXN5bVJlZiBwb2ludHMgKi8KLSNkZWZpbmUgYnRSYW5nZQkJMTYJLyogc3VicmFuZ2Ugb2YgaW50ICovCi0jZGVmaW5lIGJ0U2V0CQkxNwkvKiBwYXNjYWwgc2V0cyAqLwotI2RlZmluZSBidENvbXBsZXgJMTgJLyogZm9ydHJhbiBjb21wbGV4ICovCi0jZGVmaW5lIGJ0RENvbXBsZXgJMTkJLyogZm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotI2RlZmluZSBidEluZGlyZWN0CTIwCS8qIGZvcndhcmQgb3IgdW5uYW1lZCB0eXBlZGVmICovCi0jZGVmaW5lIGJ0Rml4ZWREZWMJMjEJLyogRml4ZWQgRGVjaW1hbCAqLwotI2RlZmluZSBidEZsb2F0RGVjCTIyCS8qIEZsb2F0IERlY2ltYWwgKi8KLSNkZWZpbmUgYnRTdHJpbmcJMjMJLyogVmFyeWluZyBMZW5ndGggQ2hhcmFjdGVyIFN0cmluZyAqLwotI2RlZmluZSBidEJpdAkJMjQJLyogQWxpZ25lZCBCaXQgU3RyaW5nICovCi0jZGVmaW5lIGJ0UGljdHVyZQkyNQkvKiBQaWN0dXJlICovCi0jZGVmaW5lIGJ0Vm9pZAkJMjYJLyogdm9pZCAqLwotI2RlZmluZSBidExvbmdMb25nCTI3CS8qIGxvbmcgbG9uZyAqLwotI2RlZmluZSBidFVMb25nTG9uZwkyOAkvKiB1bnNpZ25lZCBsb25nIGxvbmcgKi8KLSNkZWZpbmUgYnRNYXgJCTY0Ci0KLSNpZiAoX01GRyA9PSBfTUlQUykKLS8qIG9wdGltaXphdGlvbiB0eXBlIGNvZGVzICovCi0jZGVmaW5lIG90TmlsCQkwCi0jZGVmaW5lIG90UmVnCQkxCS8qIG1vdmUgdmFyIHRvIHJlZyAqLwotI2RlZmluZSBvdEJsb2NrCQkyCS8qIGJlZ2luIGJhc2ljIGJsb2NrICovCi0jZGVmaW5lCW90UHJvYwkJMwkvKiBwcm9jZWR1cmUgKi8KLSNkZWZpbmUgb3RJbmxpbmUJNAkvKiBpbmxpbmUgcHJvY2VkdXJlICovCi0jZGVmaW5lIG90RW5kCQk1CS8qIHdoYXRldmVyIHlvdSBzdGFydGVkICovCi0jZGVmaW5lIG90TWF4CQk2CS8qIEtFRVAgVVAgVE8gREFURSAqLwotI2VuZGlmIC8qIChfTUZHID09IF9NSVBTKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3RpYzMwLmggYi9pbmNsdWRlL2NvZmYvdGljMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiMDI2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvdGljMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzWCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0jZGVmaW5lCVRJQzMwTUFHSUMJMHhDMDAwCi0KLSNkZWZpbmUgVElDMzBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9VElDMzBNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLSAgc3RydWN0IHsKLQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JdW5pb24gewotCSAgc3RydWN0IHsKLQkJY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQljaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JICB9IHhfbG5zejsKLQkgIGNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCX0geF9taXNjOwotCXVuaW9uIHsKLQkgIHN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCWNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCSAgfSB4X2ZjbjsKLQkgIHN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkgIH0geF9hcnk7Ci0JfSB4X2ZjbmFyeTsKLQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQlzdHJ1Y3QgewotCSAgY2hhciB4X3plcm9lc1s0XTsKLQkgIGNoYXIgeF9vZmZzZXRbNF07Ci0JfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotICB9IHhfc2NuOwotICAKLSAgc3RydWN0IHsKLQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0gIAotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIHo4ayBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB3aXRoIHNlZ21lbnRzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotLyogVE1TMzIwQzMwIHJlbG9jYXRpb24gdHlwZXMuICAqLwotCi0jZGVmaW5lIFJfVElDMzBfQUJTMTYgMHgxMDAgIC8qIDE2IGJpdCBhYnNvbHV0ZS4gKi8KLSNkZWZpbmUgUl9USUMzMF9BQlMyNCAweDEwMSAgLyogMjQgYml0IGFic29sdXRlLiAqLwotI2RlZmluZSBSX1RJQzMwX0FCUzMyIDB4MTAyICAvKiAzMiBiaXQgYWJzb2x1dGUuICovCi0jZGVmaW5lIFJfVElDMzBfTERQICAgMHgxMDMgIC8qIExEUCBiaXRzIDIzLTE2IHRvIDctMC4gKi8KLSNkZWZpbmUgUl9USUMzMF9QQzE2ICAweDEwNCAgLyogMTYgYml0IHBjIHJlbGF0aXZlLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3RpYzgwLmggYi9pbmNsdWRlL2NvZmYvdGljODAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MzhmNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvdGljODAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFRJIFRNUzMyMEM4MCAoTVZQKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotCWNoYXIgZl90YXJnZXRfaWRbMl07CS8qIHRhcmdldCBpZCAoVEljODAgc3BlY2lmaWMpCSovCi19OwotCi0jZGVmaW5lCVRJQzgwX0FSQ0hfTUFHSUMJMHgwQzEJLyogR29lcyBpbiB0aGUgZmlsZSBoZWFkZXIgbWFnaWMgbnVtYmVyIGZpZWxkICovCi0jZGVmaW5lIFRJQzgwX1RBUkdFVF9JRAkJMHg5NQkvKiBHb2VzIGluIHRoZSB0YXJnZXQgaWQgZmllbGQgKi8KLQotI2RlZmluZSBUSUM4MEJBRE1BRyh4KSAoKHgpLmZfbWFnaWMgIT0gVElDODBfQVJDSF9NQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIyCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgVElDODBfQU9VVEhEUl9NQUdJQwkweDEwOAkvKiBHb2VzIGluIHRoZSBvcHRpb25hbCBmaWxlIGhlYWRlciBtYWdpYyBudW1iZXIgZmllbGQgKi8KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotCWNoYXIJCXNfcmVzZXJ2ZWRbMV07CS8qIHJlc2VydmVkIChUSWM4MCBzcGVjaWZpYykJKi8KLQljaGFyCQlzX21lbXBhZ2VbMV07CS8qIG1lbW9yeSBwYWdlIG51bWJlciAoVEljODApCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DSU5JVAkiLmNpbml0IgotI2RlZmluZSBfQ09OU1QJIi5jb25zdCIKLSNkZWZpbmUgX1NXSVRDSAkiLnN3aXRjaCIKLSNkZWZpbmUgX1NUQUNLCSIuc3RhY2siCi0jZGVmaW5lIF9TWVNNRU0JIi5zeXNtZW0iCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CQkJLyogbGluZSBudW1iZXIJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotLyogRklYTUUgLSBuZWVkIHRvIGNvcnJlbGF0ZSB3aXRoIFRJYzgwIENvZGUgR2VuZXJhdGlvbiBUb29scyBVc2VyJ3MgR3VpZGUsIENHOkEtMjUgKi8KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfcmVzZXJ2ZWRbMl07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMgotCi0vKiBUSWM4MCByZWxvY2F0aW9uIHR5cGVzLiAqLwotCi0jZGVmaW5lIFJfQUJTCQkweDAwCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIC0gbm8gcmVsb2NhdGlvbiAqLwotI2RlZmluZSBSX1JFTExPTkdYCTB4MTEJCS8qIFBQOiAzMiBiaXRzLCBkaXJlY3QgKi8KLSNkZWZpbmUgUl9QUEJBU0UJMHgzNAkJLyogUFA6IEdsb2JhbCBiYXNlIGFkZHJlc3MgdHlwZSAqLwotI2RlZmluZSBSX1BQTEJBU0UJMHgzNQkJLyogUFA6IExvY2FsIGJhc2UgYWRkcmVzcyB0eXBlICovCi0jZGVmaW5lIFJfUFAxNQkJMHgzOAkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFAxNVcJCTB4MzkJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUDE1SAkJMHgzQQkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQMTZCCQkweDNCCQkvKiBQUDogR2xvYmFsIDE2IGJpdCBvZmZzZXQgZm9yIGJ5dGVzICovCi0jZGVmaW5lIFJfUFBMMTUJCTB4M0MJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBMMTVXCTB4M0QJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQTDE1SAkweDNFCQkvKiBQUDogTG9jYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUEwxNkIJMHgzRgkJLyogUFA6IExvY2FsIDE2IGJpdCBvZmZzZXQgZm9yIGJ5dGVzICovCi0jZGVmaW5lIFJfUFBOMTUJCTB4NDAJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCAqLwotI2RlZmluZSBSX1BQTjE1VwkweDQxCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFBOMTVICTB4NDIJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUE4xNkIJMHg0MwkJLyogUFA6IEdsb2JhbCAxNiBiaXQgbmVnYXRpdmUgYnl0ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUExOMTUJMHg0NAkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUExOMTVXCTB4NDUJCS8qIFBQOiBMb2NhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQTE4xNUgJMHg0NgkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFBMTjE2QgkweDQ3CQkvKiBQUDogTG9jYWwgMTYgYml0IG5lZ2F0aXZlIGJ5dGUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfTVBQQ1IxNVcJMHg0RQkJLyogTVA6IDE1IGJpdCBQQy1yZWxhdGl2ZSBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9NUFBDUgkJMHg0RgkJLyogTVA6IDMyIGJpdCBQQy1yZWxhdGl2ZSBkaXZpZGVkIGJ5IDQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi93NjUuaCBiL2luY2x1ZGUvY29mZi93NjUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3OGMyMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvdzY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBXREMgNjU4MTYgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCVc2NU1BR0lDCTB4NjUwMAotCi0KLSNkZWZpbmUgVzY1QkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVc2NU1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIHc2NSBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi93ZTMyay5oIGIvaW5jbHVkZS9jb2ZmL3dlMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1M2ZhMzUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3dlMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciB3ZTMyayAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0jZGVmaW5lCUZfQk0zMkIJCSgwMDIwMDAwKQotI2RlZmluZQlGX0JNMzJNQVUJKDAwNDAwMDApCi0KLSNkZWZpbmUJV0UzMktNQUdJQwkweDE3MAkvKiB3ZTMyayBzYW5zIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBGQk9NQUdJQwkweDE3MAkvKiB3ZTMyayBzYW5zIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBNVFZNQUdJQwkweDE3MQkvKiB3ZTMyayB3aXRoIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBSQk9NQUdJQwkweDE3MgkvKiByZXNlcnZlZCAqLwotI2RlZmluZSBXRTMyS0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljICE9IFdFMzJLTUFHSUMpIFwKLQkJCSYmICgoeCkuZl9tYWdpYyAhPSBGQk9NQUdJQykgXAotCQkJJiYgKCh4KS5mX21hZ2ljICE9IFJCT01BR0lDKSBcCi0JCQkmJiAoKHgpLmZfbWFnaWMgIT0gTVRWTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfVFYJIi50diIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLSMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvejhrLmggYi9pbmNsdWRlL2NvZmYvejhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Yjg0NmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3o4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgWmlsb2cgWjgwME4gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogVHlwZSBvZiBjcHUgaXMgc3RvcmVkIGluIGZsYWdzICovCi0jZGVmaW5lIEZfWjgwMDEgICAgMHgxMDAwCi0jZGVmaW5lIEZfWjgwMDIgICAgMHgyMDAwCi0jZGVmaW5lIEZfTUFDSE1BU0sgMHhmMDAwCi0KLSNkZWZpbmUJWjhLTUFHSUMJMHg4MDAwCi0KLSNkZWZpbmUgWjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVo4S01BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIHo4ayBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB3aXRoIHNlZ21lbnRzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZW1hbmdsZS5oIGIvaW5jbHVkZS9kZW1hbmdsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZlNWUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZGVtYW5nbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIERlZnMgZm9yIGludGVyZmFjZSB0byBkZW1hbmdsZXJzLgotICAgQ29weXJpZ2h0IDE5OTIsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZiAhZGVmaW5lZCAoREVNQU5HTEVfSCkKLSNkZWZpbmUgREVNQU5HTEVfSAotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogT3B0aW9ucyBwYXNzZWQgdG8gY3BsdXNfZGVtYW5nbGUgKGluIDJuZCBwYXJhbWV0ZXIpLiAqLwotCi0jZGVmaW5lIERNR0xfTk9fT1BUUwkwCQkvKiBGb3IgcmVhZGFiaWxpdHkuLi4gKi8KLSNkZWZpbmUgRE1HTF9QQVJBTVMJKDEgPDwgMCkJLyogSW5jbHVkZSBmdW5jdGlvbiBhcmdzICovCi0jZGVmaW5lIERNR0xfQU5TSQkoMSA8PCAxKQkvKiBJbmNsdWRlIGNvbnN0LCB2b2xhdGlsZSwgZXRjICovCi0jZGVmaW5lIERNR0xfSkFWQQkoMSA8PCAyKQkvKiBEZW1hbmdsZSBhcyBKYXZhIHJhdGhlciB0aGFuIEMrKy4gKi8KLQotI2RlZmluZSBETUdMX0FVVE8JKDEgPDwgOCkKLSNkZWZpbmUgRE1HTF9HTlUJKDEgPDwgOSkKLSNkZWZpbmUgRE1HTF9MVUNJRAkoMSA8PCAxMCkKLSNkZWZpbmUgRE1HTF9BUk0JKDEgPDwgMTEpCi0jZGVmaW5lIERNR0xfSFAgCSgxIDw8IDEyKSAgICAgICAvKiBGb3IgdGhlIEhQIGFDQyBjb21waWxlcjsgc2FtZSBhcyBBUk0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yIHRlbXBsYXRlIGFyZ3VtZW50cywgZXRjLiAqLwotI2RlZmluZSBETUdMX0VERwkoMSA8PCAxMykKLQotLyogSWYgbm9uZSBvZiB0aGVzZSBhcmUgc2V0LCB1c2UgJ2N1cnJlbnRfZGVtYW5nbGluZ19zdHlsZScgYXMgdGhlIGRlZmF1bHQuICovCi0jZGVmaW5lIERNR0xfU1RZTEVfTUFTSyAoRE1HTF9BVVRPfERNR0xfR05VfERNR0xfTFVDSUR8RE1HTF9BUk18RE1HTF9IUHxETUdMX0VERykKLQotLyogRW51bWVyYXRpb24gb2YgcG9zc2libGUgZGVtYW5nbGluZyBzdHlsZXMuCi0KLSAgIEx1Y2lkIGFuZCBBUk0gc3R5bGVzIGFyZSBzdGlsbCBrZXB0IGxvZ2ljYWxseSBkaXN0aW5jdCwgZXZlbiB0aG91Z2gKLSAgIHRoZXkgbm93IGJvdGggYmVoYXZlIGlkZW50aWNhbGx5LiAgVGhlIHJlc3VsdGluZyBzdHlsZSBpcyBhY3R1YWwgdGhlCi0gICB1bmlvbiBvZiBib3RoLiAgSS5FLiBlaXRoZXIgc3R5bGUgcmVjb2duaXplcyBib3RoICJfX3B0X18iIGFuZCAiX19yZl9fIgotICAgZm9yIG9wZXJhdG9yICItPiIsIGV2ZW4gdGhvdWdoIHRoZSBmaXJzdCBpcyBsdWNpZCBzdHlsZSBhbmQgdGhlIHNlY29uZAotICAgaXMgQVJNIHN0eWxlLiAoRklYTUU/KSAqLwotCi1leHRlcm4gZW51bSBkZW1hbmdsaW5nX3N0eWxlcwotewotICB1bmtub3duX2RlbWFuZ2xpbmcgPSAwLAotICBhdXRvX2RlbWFuZ2xpbmcgPSBETUdMX0FVVE8sCi0gIGdudV9kZW1hbmdsaW5nID0gRE1HTF9HTlUsCi0gIGx1Y2lkX2RlbWFuZ2xpbmcgPSBETUdMX0xVQ0lELAotICBhcm1fZGVtYW5nbGluZyA9IERNR0xfQVJNLAotICBocF9kZW1hbmdsaW5nID0gRE1HTF9IUCwKLSAgZWRnX2RlbWFuZ2xpbmcgPSBETUdMX0VERwotfSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGU7Ci0KLS8qIERlZmluZSBzdHJpbmcgbmFtZXMgZm9yIHRoZSB2YXJpb3VzIGRlbWFuZ2xpbmcgc3R5bGVzLiAqLwotCi0jZGVmaW5lIEFVVE9fREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImF1dG8iCi0jZGVmaW5lIEdOVV9ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiZ251IgotI2RlZmluZSBMVUNJRF9ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkibHVjaWQiCi0jZGVmaW5lIEFSTV9ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiYXJtIgotI2RlZmluZSBIUF9ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiaHAiCi0jZGVmaW5lIEVER19ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiZWRnIgotCi0vKiBTb21lIG1hY3JvcyB0byB0ZXN0IHdoYXQgZGVtYW5nbGluZyBzdHlsZSBpcyBhY3RpdmUuICovCi0KLSNkZWZpbmUgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZQotI2RlZmluZSBBVVRPX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9BVVRPKQotI2RlZmluZSBHTlVfREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0dOVSkKLSNkZWZpbmUgTFVDSURfREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0xVQ0lEKQotI2RlZmluZSBBUk1fREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0FSTSkKLSNkZWZpbmUgSFBfREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0hQKQotI2RlZmluZSBFREdfREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0VERykKLQotZXh0ZXJuIGNoYXIgKgotY3BsdXNfZGVtYW5nbGUgUEFSQU1TICgoY29uc3QgY2hhciAqbWFuZ2xlZCwgaW50IG9wdGlvbnMpKTsKLQotZXh0ZXJuIGludAotY3BsdXNfZGVtYW5nbGVfb3BuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm9wbmFtZSwgY2hhciAqcmVzdWx0LCBpbnQgb3B0aW9ucykpOwotCi1leHRlcm4gY29uc3QgY2hhciAqCi1jcGx1c19tYW5nbGVfb3BuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm9wbmFtZSwgaW50IG9wdGlvbnMpKTsKLQotLyogTm90ZTogVGhpcyBzZXRzIGdsb2JhbCBzdGF0ZS4gIEZJWE1FIGlmIHlvdSBjYXJlIGFib3V0IG11bHRpLXRocmVhZGluZy4gKi8KLQotZXh0ZXJuIHZvaWQKLXNldF9jcGx1c19tYXJrZXJfZm9yX2RlbWFuZ2xpbmcgUEFSQU1TICgoaW50IGNoKSk7Ci0KLSNlbmRpZgkvKiBERU1BTkdMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Rpcy1hc20uaCBiL2luY2x1ZGUvZGlzLWFzbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQwMDc5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZGlzLWFzbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBvcGNvZGUgbGlicmFyeSBhbmQgaXRzIGNhbGxlcnMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LCAxOTkzLgotCi0gICBUaGUgb3Bjb2RlIGxpYnJhcnkgKGxpYm9wY29kZXMuYSkgcHJvdmlkZXMgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgZm9yCi0gICBhIGxhcmdlIHZhcmlldHkgb2YgaW5zdHJ1Y3Rpb24gc2V0cywgY2FsbGFibGUgd2l0aCBhbiBpZGVudGljYWwKLSAgIGludGVyZmFjZSwgZm9yIG1ha2luZyBpbnN0cnVjdGlvbi1wcm9jZXNzaW5nIHByb2dyYW1zIG1vcmUgaW5kZXBlbmRlbnQKLSAgIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQgYmVpbmcgcHJvY2Vzc2VkLiAgKi8KLQotI2lmbmRlZiBESVNfQVNNX0gKLSNkZWZpbmUgRElTX0FTTV9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImJmZC5oIgotCi10eXBlZGVmIGludCAoKmZwcmludGZfZnR5cGUpIFBBUkFNUygoUFRSLCBjb25zdCBjaGFyKiwgLi4uKSk7Ci0KLWVudW0gZGlzX2luc25fdHlwZSB7Ci0gIGRpc19ub25pbnNuLAkJCS8qIE5vdCBhIHZhbGlkIGluc3RydWN0aW9uICovCi0gIGRpc19ub25icmFuY2gsCQkvKiBOb3QgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gKi8KLSAgZGlzX2JyYW5jaCwJCQkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBkaXNfY29uZGJyYW5jaCwJCS8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBkaXNfanNyLAkJCS8qIEp1bXAgdG8gc3Vicm91dGluZSAqLwotICBkaXNfY29uZGpzciwJCQkvKiBDb25kaXRpb25hbCBqdW1wIHRvIHN1YnJvdXRpbmUgKi8KLSAgZGlzX2RyZWYsCQkJLyogRGF0YSByZWZlcmVuY2UgaW5zdHJ1Y3Rpb24gKi8KLSAgZGlzX2RyZWYyCQkJLyogVHdvIGRhdGEgcmVmZXJlbmNlcyBpbiBpbnN0cnVjdGlvbiAqLwotfTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIGludG8gdGhlIGluc3RydWN0aW9uIGRlY29kaW5nIHJvdXRpbmUsIAotICAgYW5kIGlzIHBhc3NlZCBiYWNrIG91dCBpbnRvIGVhY2ggY2FsbGJhY2suICBUaGUgdmFyaW91cyBmaWVsZHMgYXJlIHVzZWQKLSAgIGZvciBjb252ZXlpbmcgaW5mb3JtYXRpb24gZnJvbSB5b3VyIG1haW4gcm91dGluZSBpbnRvIHlvdXIgY2FsbGJhY2tzLAotICAgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24gaW50byB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgKHN1Y2ggYXMgdGhlCi0gICBhZGRyZXNzZXMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyksIG9yIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uCi0gICBiYWNrIGZyb20gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIHRvIHRoZWlyIGNhbGxlcnMuCi0KLSAgIEl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IGlzIGZpcnN0IHBhc3NlZDsgdGhpcyBjYW4gYmUgZG9uZQotICAgYnkgaGFuZCwgb3IgdXNpbmcgb25lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBtYWNyb3MgYmVsb3cuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvIHsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2Z1bmM7Ci0gIFBUUiBzdHJlYW07Ci0gIFBUUiBhcHBsaWNhdGlvbl9kYXRhOwotCi0gIC8qIFRhcmdldCBkZXNjcmlwdGlvbi4gIFdlIGNvdWxkIHJlcGxhY2UgdGhpcyB3aXRoIGEgcG9pbnRlciB0byB0aGUgYmZkLAotICAgICBidXQgdGhhdCB3b3VsZCByZXF1aXJlIG9uZS4gIFRoZXJlIGN1cnJlbnRseSBpc24ndCBhbnkgc3VjaCByZXF1aXJlbWVudAotICAgICBzbyB0byBhdm9pZCBpbnRyb2R1Y2luZyBvbmUgd2UgcmVjb3JkIHRoZXNlIGV4cGxpY2l0bHkuICAqLwotICAvKiBUaGUgYmZkX2ZsYXZvdXIuICBUaGlzIGNhbiBiZSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ci4gICovCi0gIGVudW0gYmZkX2ZsYXZvdXIgZmxhdm91cjsKLSAgLyogVGhlIGJmZF9hcmNoIHZhbHVlLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIC8qIFRoZSBiZmRfbWFjaCB2YWx1ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgLyogRW5kaWFubmVzcyAoZm9yIGJpLWVuZGlhbiBjcHVzKS4gIE1vbm8tZW5kaWFuIGNwdXMgY2FuIGlnbm9yZSB0aGlzLiAgKi8KLSAgZW51bSBiZmRfZW5kaWFuIGVuZGlhbjsKLQotICAvKiBBbiBhcnJheSBvZiBwb2ludGVycyB0byBzeW1ib2xzIGVpdGhlciBhdCB0aGUgbG9jYXRpb24gYmVpbmcgZGlzYXNzZW1ibGVkCi0gICAgIG9yIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgZGlzYXNzZW1ibGVkLiAgVGhlIGFycmF5IGlzIHNvcnRlZAotICAgICBzbyB0aGF0IHRoZSBmaXJzdCBzeW1ib2wgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIG9uZSB1c2VkLiAgVGhlIG90aGVycyBhcmUKLSAgICAgcHJlc2VudCBmb3IgYW55IG1pc2MuIHB1cnBvc2VzLiAgVGhpcyBpcyBub3Qgc2V0IHJlbGlhYmx5LCBidXQgaWYgaXQgaXMKLSAgICAgbm90IE5VTEwsIGl0IGlzIGNvcnJlY3QuICAqLwotICBhc3ltYm9sICoqc3ltYm9sczsKLSAgLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYXJyYXkuICAqLwotICBpbnQgbnVtX3N5bWJvbHM7Ci0KLSAgLyogRm9yIHVzZSBieSB0aGUgZGlzYXNzZW1ibGVyLgotICAgICBUaGUgdG9wIDE2IGJpdHMgYXJlIHJlc2VydmVkIGZvciBwdWJsaWMgdXNlIChhbmQgYXJlIGRvY3VtZW50ZWQgaGVyZSkuCi0gICAgIFRoZSBib3R0b20gMTYgYml0cyBhcmUgZm9yIHRoZSBpbnRlcm5hbCB1c2Ugb2YgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZGVmaW5lIElOU05fSEFTX1JFTE9DCTB4ODAwMDAwMDAKLSAgUFRSIHByaXZhdGVfZGF0YTsKLQotICAvKiBGdW5jdGlvbiB1c2VkIHRvIGdldCBieXRlcyB0byBkaXNhc3NlbWJsZS4gIE1FTUFERFIgaXMgdGhlCi0gICAgIGFkZHJlc3Mgb2YgdGhlIHN0dWZmIHRvIGJlIGRpc2Fzc2VtYmxlZCwgTVlBRERSIGlzIHRoZSBhZGRyZXNzIHRvCi0gICAgIHB1dCB0aGUgYnl0ZXMgaW4sIGFuZCBMRU5HVEggaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgotICAgICBJTkZPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdC4KLSAgICAgUmV0dXJucyBhbiBlcnJubyB2YWx1ZSBvciAwIGZvciBzdWNjZXNzLiAgKi8KLSAgaW50ICgqcmVhZF9tZW1vcnlfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIG1lbWFkZHIsIGJmZF9ieXRlICpteWFkZHIsIGludCBsZW5ndGgsCi0JICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi0gIC8qIEZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSBjYWxsZWQgaWYgd2UgZ2V0IGFuIGVycm9yIHRoYXQgd2UgY2FuJ3QKLSAgICAgcmVjb3ZlciBmcm9tLiAgU1RBVFVTIGlzIHRoZSBlcnJubyB2YWx1ZSBmcm9tIHJlYWRfbWVtb3J5X2Z1bmMgYW5kCi0gICAgIE1FTUFERFIgaXMgdGhlIGFkZHJlc3MgdGhhdCB3ZSB3ZXJlIHRyeWluZyB0byByZWFkLiAgSU5GTyBpcyBhCi0gICAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QuICAqLwotICB2b2lkICgqbWVtb3J5X2Vycm9yX2Z1bmMpCi0gICAgUEFSQU1TICgoaW50IHN0YXR1cywgYmZkX3ZtYSBtZW1hZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi0gIC8qIEZ1bmN0aW9uIGNhbGxlZCB0byBwcmludCBBRERSLiAgKi8KLSAgdm9pZCAoKnByaW50X2FkZHJlc3NfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIGFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLSAgLyogRnVuY3Rpb24gY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHN5bWJvbCBhdCB0aGUgZ2l2ZW4gQUREUi4KLSAgICAgSWYgdGhlcmUgaXMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEsIG90aGVyd2lzZSBpdCByZXR1cm5zIDAuCi0gICAgIFRoaXMgaXMgdXNlZCBieSBwb3J0cyB3aGljaCBzdXBwb3J0IGFuIG92ZXJsYXkgbWFuYWdlciB3aGVyZQotICAgICB0aGUgb3ZlcmxheSBudW1iZXIgaXMgaGVsZCBpbiB0aGUgdG9wIHBhcnQgb2YgYW4gYWRkcmVzcy4gIEluCi0gICAgIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIG92ZXJsYXkgbnVtYmVyIGluIHRoZQotICAgICBhZGRyZXNzLCAobm9ybWFsbHkgYmVjYXVzZSB0aGVyZSBpcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGgKLSAgICAgdGhhdCBhZGRyZXNzKSwgYnV0IHNvbWV0aW1lcyB3ZSB3YW50IHRvIG1hc2sgb3V0IHRoZSBvdmVybGF5IGJpdHMuICAqLwotICBpbnQgKCogc3ltYm9sX2F0X2FkZHJlc3NfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIGFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbykpOwotCi0gIC8qIFRoZXNlIGFyZSBmb3IgYnVmZmVyX3JlYWRfbWVtb3J5LiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgYmZkX3ZtYSBidWZmZXJfdm1hOwotICBpbnQgYnVmZmVyX2xlbmd0aDsKLQotICAvKiBUaGlzIHZhcmlhYmxlIG1heSBiZSBzZXQgYnkgdGhlIGluc3RydWN0aW9uIGRlY29kZXIuICBJdCBzdWdnZXN0cwotICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBvYmpkdW1wIHNob3VsZCBkaXNwbGF5IG9uIGEgc2luZ2xlIGxpbmUuICBJZgotICAgICAgdGhlIGluc3RydWN0aW9uIGRlY29kZXIgc2V0cyB0aGlzLCBpdCBzaG91bGQgYWx3YXlzIHNldCBpdCB0bwotICAgICAgdGhlIHNhbWUgdmFsdWUgaW4gb3JkZXIgdG8gZ2V0IHJlYXNvbmFibGUgbG9va2luZyBvdXRwdXQuICAqLwotICBpbnQgYnl0ZXNfcGVyX2xpbmU7Ci0KLSAgLyogdGhlIG5leHQgdHdvIHZhcmlhYmxlcyBjb250cm9sIHRoZSB3YXkgb2JqZHVtcCBkaXNwbGF5cyB0aGUgcmF3IGRhdGEgKi8KLSAgLyogRm9yIGV4YW1wbGUsIGlmIGJ5dGVzX3Blcl9saW5lIGlzIDggYW5kIGJ5dGVzX3Blcl9jaHVuayBpcyA0LCB0aGUgKi8KLSAgLyogb3V0cHV0IHdpbGwgbG9vayBsaWtlIHRoaXM6Ci0gICAgIDAwOiAgIDAwMDAwMDAwIDAwMDAwMDAwCi0gICAgIHdpdGggdGhlIGNodW5rcyBkaXNwbGF5ZWQgYWNjb3JkaW5nIHRvICJkaXNwbGF5X2VuZGlhbiIuICovCi0gIGludCBieXRlc19wZXJfY2h1bms7Ci0gIGVudW0gYmZkX2VuZGlhbiBkaXNwbGF5X2VuZGlhbjsKLQotICAvKiBSZXN1bHRzIGZyb20gaW5zdHJ1Y3Rpb24gZGVjb2RlcnMuICBOb3QgYWxsIGRlY29kZXJzIHlldCBzdXBwb3J0Ci0gICAgIHRoaXMgaW5mb3JtYXRpb24uICBUaGlzIGluZm8gaXMgc2V0IGVhY2ggdGltZSBhbiBpbnN0cnVjdGlvbiBpcwotICAgICBkZWNvZGVkLCBhbmQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGxhc3Qgc3VjaCBpbnN0cnVjdGlvbi4KLQotICAgICBUbyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlY29kZXIgc3VwcG9ydHMgdGhpcyBpbmZvcm1hdGlvbiwgc2V0Ci0gICAgIGluc25faW5mb192YWxpZCB0byAwLCBkZWNvZGUgYW4gaW5zdHJ1Y3Rpb24sIHRoZW4gY2hlY2sgaXQuICAqLwotCi0gIGNoYXIgaW5zbl9pbmZvX3ZhbGlkOwkJLyogQnJhbmNoIGluZm8gaGFzIGJlZW4gc2V0LiAqLwotICBjaGFyIGJyYW5jaF9kZWxheV9pbnNuczsJLyogSG93IG1hbnkgc2VxdWVudGlhbCBpbnNuJ3Mgd2lsbCBydW4gYmVmb3JlCi0JCQkJICAgYSBicmFuY2ggdGFrZXMgZWZmZWN0LiAgKDAgPSBub3JtYWwpICovCi0gIGNoYXIgZGF0YV9zaXplOwkJLyogU2l6ZSBvZiBkYXRhIHJlZmVyZW5jZSBpbiBpbnNuLCBpbiBieXRlcyAqLwotICBlbnVtIGRpc19pbnNuX3R5cGUgaW5zbl90eXBlOwkvKiBUeXBlIG9mIGluc3RydWN0aW9uICovCi0gIGJmZF92bWEgdGFyZ2V0OwkJLyogVGFyZ2V0IGFkZHJlc3Mgb2YgYnJhbmNoIG9yIGRyZWYsIGlmIGtub3duOwotCQkJCSAgIHplcm8gaWYgdW5rbm93bi4gICovCi0gIGJmZF92bWEgdGFyZ2V0MjsJCS8qIFNlY29uZCB0YXJnZXQgYWRkcmVzcyBmb3IgZHJlZjIgKi8KLQotICAvKiBDb21tYW5kIGxpbmUgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgdGFyZ2V0IGRpc2Fzc2VtYmxlci4gICovCi0gIGNoYXIgKiBkaXNhc3NlbWJsZXJfb3B0aW9uczsKLQotfSBkaXNhc3NlbWJsZV9pbmZvOwotCi0MCi0vKiBTdGFuZGFyZCBkaXNhc3NlbWJsZXJzLiAgRGlzYXNzZW1ibGUgb25lIGluc3RydWN0aW9uIGF0IHRoZSBnaXZlbgotICAgdGFyZ2V0IGFkZHJlc3MuICBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZC4gICovCi10eXBlZGVmIGludCAoKmRpc2Fzc2VtYmxlcl9mdHlwZSkKLSAgICAgUEFSQU1TKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19taXBzCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9taXBzCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTM4Nl9hdHQJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTM4Nl9pbnRlbAlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX202OGsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fejgwMDEJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fejgwMDIJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDgzMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDgzMDBoCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwcwkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODUwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9hbHBoYQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBkaXNhc3NlbWJsZXJfZnR5cGUgYXJjX2dldF9kaXNhc3NlbWJsZXIgUEFSQU1TICgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfYXJtCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9hcm0JUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9zcGFyYwkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfYTI5awkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfYTI5awlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2k5NjAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fc2gJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fc2hsCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2hwcGEJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fZnIzMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tMzJyCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX204OGsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbWNvcmUJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbW4xMDIwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tbjEwMzAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX25zMzJrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19wb3dlcnBjCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9yczYwMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdzY1CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2QxMHYJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fZDMwdgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl92ODUwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3RpYzMwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3ZheAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl90aWM4MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9wagkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLQotZXh0ZXJuIGludCBhcm1fdG9nZ2xlX3JlZ25hbWVzICAgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRmV0Y2ggdGhlIGRpc2Fzc2VtYmxlciBmb3IgYSBnaXZlbiBCRkQsIGlmIHRoYXQgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLwotZXh0ZXJuIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZXIJUEFSQU1TICgoYmZkICopKTsKLQotDAotLyogVGhpcyBibG9jayBvZiBkZWZpbml0aW9ucyBpcyBmb3IgcGFydGljdWxhciBjYWxsZXJzIHdobyByZWFkIGluc3RydWN0aW9ucwotICAgaW50byBhIGJ1ZmZlciBiZWZvcmUgY2FsbGluZyB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2Rlci4gICovCi0KLS8qIEhlcmUgaXMgYSBmdW5jdGlvbiB3aGljaCBjYWxsZXJzIG1heSB3aXNoIHRvIHVzZSBmb3IgcmVhZF9tZW1vcnlfZnVuYy4KLSAgIEl0IGdldHMgYnl0ZXMgZnJvbSBhIGJ1ZmZlci4gICovCi1leHRlcm4gaW50IGJ1ZmZlcl9yZWFkX21lbW9yeQotICBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqLCBpbnQsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogVGhpcyBmdW5jdGlvbiBnb2VzIHdpdGggYnVmZmVyX3JlYWRfbWVtb3J5LgotICAgSXQgcHJpbnRzIGEgbWVzc2FnZSB1c2luZyBpbmZvLT5mcHJpbnRmX2Z1bmMgYW5kIGluZm8tPnN0cmVhbS4gICovCi1leHRlcm4gdm9pZCBwZXJyb3JfbWVtb3J5IFBBUkFNUyAoKGludCwgYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0KLS8qIEp1c3QgcHJpbnQgdGhlIGFkZHJlc3MgaW4gaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGV2ZW4KLSAgIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8gcHJpbnQgc3ltYm9saWMKLSAgIGFkZHJlc3NlcykuICAqLwotZXh0ZXJuIHZvaWQgZ2VuZXJpY19wcmludF9hZGRyZXNzCi0gIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogQWx3YXlzIHRydWUuICAqLwotZXh0ZXJuIGludCBnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzCi0gIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBhIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0LiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkCi0gICBieSBhbGwgYXBwbGljYXRpb25zIGNyZWF0aW5nIHN1Y2ggYSBzdHJ1Y3QuICAqLwotI2RlZmluZSBJTklUX0RJU0FTU0VNQkxFX0lORk8oSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpIFwKLSAgKElORk8pLmZsYXZvdXIgPSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwgXAotICAoSU5GTykuYXJjaCA9IGJmZF9hcmNoX3Vua25vd24sIFwKLSAgKElORk8pLm1hY2ggPSAwLCBcCi0gIChJTkZPKS5lbmRpYW4gPSBCRkRfRU5ESUFOX1VOS05PV04sIFwKLSAgSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0goSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpCi0KLS8qIENhbGwgdGhpcyBtYWNybyB0byBpbml0aWFsaXplIG9ubHkgdGhlIGludGVybmFsIHZhcmlhYmxlcyBmb3IgdGhlCi0gICBkaXNhc3NlbWJsZXIuICBBcmNoaXRlY3R1cmUgZGVwZW5kZW50IHRoaW5ncyBzdWNoIGFzIGJ5dGUgb3JkZXIsIG9yIG1hY2hpbmUKLSAgIHZhcmlhbnQgYXJlIG5vdCB0b3VjaGVkIGJ5IHRoaXMgbWFjcm8uICBUaGlzIG1ha2VzIHRoaW5ncyBtdWNoIGVhc2llciBmb3IKLSAgIEdEQiB3aGljaCBtdXN0IGluaXRpYWxpemUgdGhlc2UgdGhpbmdzIHNlcGVyYXRseS4gICovCi0KLSNkZWZpbmUgSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0goSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpIFwKLSAgKElORk8pLmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKShGUFJJTlRGX0ZVTkMpLCBcCi0gIChJTkZPKS5zdHJlYW0gPSAoUFRSKShTVFJFQU0pLCBcCi0gIChJTkZPKS5zeW1ib2xzID0gTlVMTCwgXAotICAoSU5GTykubnVtX3N5bWJvbHMgPSAwLCBcCi0gIChJTkZPKS5idWZmZXIgPSBOVUxMLCBcCi0gIChJTkZPKS5idWZmZXJfdm1hID0gMCwgXAotICAoSU5GTykuYnVmZmVyX2xlbmd0aCA9IDAsIFwKLSAgKElORk8pLnJlYWRfbWVtb3J5X2Z1bmMgPSBidWZmZXJfcmVhZF9tZW1vcnksIFwKLSAgKElORk8pLm1lbW9yeV9lcnJvcl9mdW5jID0gcGVycm9yX21lbW9yeSwgXAotICAoSU5GTykucHJpbnRfYWRkcmVzc19mdW5jID0gZ2VuZXJpY19wcmludF9hZGRyZXNzLCBcCi0gIChJTkZPKS5zeW1ib2xfYXRfYWRkcmVzc19mdW5jID0gZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcywgXAotICAoSU5GTykuZmxhZ3MgPSAwLCBcCi0gIChJTkZPKS5ieXRlc19wZXJfbGluZSA9IDAsIFwKLSAgKElORk8pLmJ5dGVzX3Blcl9jaHVuayA9IDAsIFwKLSAgKElORk8pLmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOLCBcCi0gIChJTkZPKS5pbnNuX2luZm9fdmFsaWQgPSAwCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKERJU19BU01fSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL0NoYW5nZUxvZyBiL2luY2x1ZGUvZWxmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4YjJmNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4MjcgKzAsMCBAQAotV2VkIERlYyAgMSAwMzowMjoxNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoRV9NTjEwMzAwX01BQ0hfQU0zMyk6IERlZmluZS4KLQotTW9uIE9jdCAxMSAyMjo0MjozNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoUEZfSFBfUEFHRV9TSVpFKTogRGVmaW5lLgotCShQRl9IUF9GQVJfU0hBUkVELCBQRl9IUF9ORUFSX1NIQVJFRCwgUEZfSFBfQ09ERSk6IExpa2V3aXNlLgotCShQRl9IUF9NT0RJRlksIFBGX0hQX0xBWllTV0FQLCBQRl9IUF9TQlApOiBMaWtld2lzZS4KLQotTW9uIE9jdCAgNCAxNzo0MjozOCAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKEVfTTMyUlhfQVJDSCk6IERlZmluZS4KLQotMTk5OS0wOS0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGhwcGEuaDogQWRkIERUX0hQX0dTVF9TSVpFLCBEVF9IUF9HU1RfVkVSU0lPTiwgYW5kIERUX0hQX0dTVF9IQVNIVkFMLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIHBqLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX1BKKTogRGVmaW5lLgotCi0xOTk5LTA5LTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaHBwYS5oOiBBZGQgSFBVWCBzcGVjaWZpYyBzeW1ib2wgdHlwZSBkZWZpbml0aW9ucy4KLQotCSogaHBwYS5oOiBBZGQgSFBVWCBzcGVjaWZpYyBkeW5hbWljIGFuZCBwcm9ncmFtIGhlYWRlciB0YWJsZQotCXNwZWNpZmljIGRlZmluaXRpb25zLgotCi0xOTk5LTA4LTMxICBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBuZXR3aW5kZXIub3JnPgotCi0JKiBjb21tb24uaCAoTlRfVEFTS1NUUlVDVCk6IERlZmluZS4KLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy5oIChFRl9TUEFSQ19TVU5fVVMzKTogRGVmaW5lIGluIENoZWV0YWggZXh0ZW5zaW9ucwotCWZsYWcgKGFzIHBlciBTQ0QyLjQuMSkuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMuaCAoRUxGNjRfUl9UWVBFX0RBVEEpOiBPbmx5IHVzZSBFTEY2NF9SX1RZUEUgYml0cywgbm90Ci0JRUxGNjRfUl9TWU0gYml0cy4KLQotMTk5OS0wNi0yMSAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGFybS5oIChFRl9TT0ZUX0ZMT0FULCBGX1NPRlRfRkxPQVQpOiBEZWZpbmUuCi0KLTE5OTktMDctMTMgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIG02OGsuaCAoRUZfQ1BVMzIpOiBNb3ZlIGRlZmluaXRpb24gaW5zaWRlIG11bHRpcGxlIGluY2x1c2lvbgotCWd1YXJkLgotCi0xOTk5LTA3LTA4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChFTEY2NF9SX1RZUEVfREFUQSk6IFNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4KLQkoRUxGNjRfUl9UWVBFX0lORk8pOiBNYXNrIG91dCBhbGwgYnV0IGxvdyAyNCBiaXRzIG9mIGRhdGEuCi0JKERUX1NQQVJDX1BMVEZNVCk6IERlbGV0ZS4KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSmFrdWIgSmVsaW5lay4KLQotTW9uIEp1biAyMSAxNjozNjowMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoZWxmX2hwcGFfcmVsb2NfdHlwZSk6IFJlbmFtZWQgZnJvbSBlbGYzMl9ocHBhX3JlbG9jX3R5cGUuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ19tYXhfc3RkKTogRGVmaW5lLgotCi1XZWQgSnVuICA5IDE1OjE2OjM0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBVcGRhdGUgd2l0aCB2YXJpb3VzIGNoYW5nZXMgZnJvbSBuZXdlc3QgUEEgRUxGCi0Jc3BlY2lmaWNhdGlvbnMuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDNjQpOiBEZWZpbmUuCi0KLTE5OTktMDYtMDIgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgTEFOR19KQVZBLgotCSogZHdhcmYyLmg6IEFkZCBEV19MQU5HX0phdmEuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTEZPU0FCSV9BUk0pOiBEZWZpbmUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLW1hY3Jvcy5oOiBVcGRhdGUgY29tbWVudC4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGk5NjAuaDogTmV3IGZpbGUuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKFJfTUNPUkVfQ09QWSk6IERlZmluZS4KLQkoUl9NQ09SRV9HTE9CX0RBVCk6IERlZmluZS4KLQkoUl9NQ09SRV9KVU1QX1NMT1QpOiBEZWZpbmUuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKFJfTUNPUkVfUkVMQVRJVkUpOiBEZWZpbmUuCi0KLTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtNjhrLmggKEVGX0NQVTMyKTogRGVmaW5lLgotCi0xOTk5LTA0LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaCAoU1RBUlRfUkVMT0NfTlVNQkVSUyk6IFByZXBlbmQgYW4gdW5kZXJzY29yZSB0bwotCWZha2UgcmVsb2MgZW50cnkgbmFtZSAoaWYgcG9zc2libGUpLCBpbiBvcmRlciB0byBhdm9pZCBjb25mbGljdHMKLQl3aXRoIHR5cGVkZWZzIG9mIHRoZSBzYW1lIG5hbWUuCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfMzJCSVRNT0RFKTogTmV3LgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oOiBOZXcgaGVhZGVyIGZpbGUuICBEZWZpbmVzIGZvciBNb3Rvcm9sbGEncyBNQ29yZQotCXByb2Nlc3Nvci4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBuZXcgY29uc3RhbnRzIGRlZmluZWQgaW46ICJTeXN0ZW0gViBBcHBsaWNhdGlvbgotCUJpbmFyeSBJbnRlcmZhY2UgLSBEUkFGVCAtIEFwcmlsIDI5LCAxOTk4IiBmb3VuZCBhdCB0aGUgd2ViIHNpdGU6Ci0JaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3Blci9nYWJpL2NvbnRlbnRzLmh0bWwKLQotCShFTV9NTUEpOiBSZW1vdmVkLiAgUmVwbGFjZWQgd2l0aCBFTV9NQ09SRSBhcyBNb3Rvcm9sbGEgb3duIHRoaXMKLQl2YWx1ZS4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmg6IEZpeGVkIHRvIG5vdCBnZW5lcmF0ZSBhbiBlbnVtIHdpdGggYSB0cmFpbGluZwotCWNvbW1hLgotCi0xOTk5LTAzLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfTUFDSF81MDAwKTogTmV3LgotCi0xOTk5LTAzLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBkZWZpbml0aW9ucyBmb3IgYSBmZXcgbW9yZSBTb2xhcmlzIEVMRiBleHRlbnNpb25zLgotCi1UaHUgRmViIDE4IDE4OjU4OjI2IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXh0ZXJuYWwuaDogT25seSB1c2UgYXR0cmlidXRlIGlmIF9fR05VQ19fIGlzIGRlZmluZWQuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBzdWJtaXR0ZWQgYnk6IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCi0JKiBlbGYvZXh0ZXJuYWwuaDogc3RydWN0IEVsZl9FeHRlcm5hbF9WZXJzeW0gbXVzdCBiZSBwYWNrZWQgb24KLQlBUk0uICBDb2RlIHVzZXMgc2l6ZW9mKEVsZl9FeHRlcm5hbF9WZXJzeW0pIGFuZCBhc3N1bWVzIGl0IGlzCi0JZXF1YWwgdG8gc2l6ZW9mKGNoYXJbMl0pLiAgUmVwb3J0ZWQgYnkgSmltIFBpY2sgPGppbUBqaW1waWNrLmNvbT4KLQotMTk5OS0wMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmggKERXQVJGMl9FeHRlcm5hbF9BUmFuZ2UpOiBOZXcgc3RydWN0dXJlLgotCShEV0FSRjJfSW50ZXJuYWxfQVJhbmdlKTogTmV3IHN0cnVjdHVyZS4KLQotTW9uIEZlYiAgMSAxMTozMzo1NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS5oOiAgUmVudW1iZXIgcmVsb2NzIHRvIGNvbmZvcm0gdG8gc3RhbmRhcmQuCi0gICAgICAgIChFRl9ORVdfQUJJKTogIERlZmluZS4KLSAgICAgICAgKEVGX09MRF9BQkkpOiAgRGVmaW5lLgotICAgICAgICAqIGFybS1vYWJpLmg6ICBOZXcgZmlsZS4KLQotMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZnIzMC5oOiBBZGQgUl9GUjMwX0dOVV9WVHtJTkhFUklULEVOVFJZfSByZWxvY3MuCi0KLTE5OTktMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5oOiBBZGQgdHlwZWRlZnMgZm9yIHN0cnVjdHVyZXMgZm91bmQgaW4gZHdhcmYyIHNlY3Rpb25zLgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfTUFDSF80MTExKTogTmV3LgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX0FCSSxFX01JUFNfQUJJX08zMixFX01JUFNfQUJJX082NCwKLQlFX01JUFNfQUJJX0VBQkkzMixFX01JUFNfQUJJX0VBQkk2NCk6Ci0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGZyMzAuaDogQWRkIFJfRlIzMF80OCByZWxvYy4KLQotMTk5OC0xMi0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIGV4dGVybmFsIGRhdGEgdHlwZSBmb3IgY29uZmxpY3Qgc2VjdGlvbi4KLQotCSogbWlwcy5oOiBBZGQgbW9yZSBMTF8qIG9wdGlvbnMgZnJvbSBJcml4IDYuNS4KLQotCSogbWlwcy5oOiBBZGQgUl9NSVBTX0pBTFIgYW5kIGFkanVzdCBSX01JUFNfbWF4IGFwcHJvcHJpYXRlbHkuCi0KLVR1ZSBOb3YgMTAgMTU6MTI6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19GUjMwKTogUmVkdWNlIHRvIGEgMTYgYml0IHZhbHVlLgotCi1UdWUgTm92IDEwIDE1OjE3OjI4IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZDEwdi5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLVdlZCBOb3YgIDQgMTU6NTY6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19GUjMwKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCi0JKiBmcjMwLmg6IE5ldyBmaWxlOiBEZWZpbml0aW9ucyBmb3IgdGhlIEZSMzAuCi0KLUZyaSBPY3QgMzAgMTE6NTQ6MTUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgRnJvbSBQaGlsaXAgQmx1bmRlbGwgPHBiQG5leHVzLmNvLnVrPjoKLSAgICAgICAgKiBhcm0uaCAoUl9BUk1fQ09QWSwgZXQgYWwuKTogTmV3IHJlbG9jcywgdXNlZCBieSBMaW51eCBmb3IgUElDLgotICAgICAgICAoRUZfQUxJR044KTogTmV3IGZsYWcuCi0KLVR1ZSBPY3QgMjAgMTE6MTk6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfTFdQU1RBVFVTKTogQ2xvc2UgY29tbWVudCBhY2NpZGVudGFsbHkgbGVmdCBvcGVuLgotCi1Nb24gT2N0IDE5IDIwOjI0OjExIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2guaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1Nb24gT2N0IDE5IDAxOjQ0OjQyIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKE5UX1BTVEFUVVMsIE5UX0ZQUkVHUywgTlRfUFNJTkZPLAotIAlOVF9MV1BTVEFUVVMsTlRfTFdQU0lORk8pOiBhZGRlZC4KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9Ob3RlKTogbmV3IHN0cnVjdHVyZSBtZW1iZXJzLgotCi1GcmkgT2N0IDE2IDE0OjExOjI1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbTMyci5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLVR1ZSBPY3QgIDYgMDk6MjI6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzcGFyYy5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBPY3QgIDUgMDk6Mzk6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiB2ODUwLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotU3VuIE9jdCAgNCAyMToxNzo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoUl8zODZfbWF4KTogQ2hhbmdlIGZyb20gMjUyIHRvIDI0LgotCi1Nb24gU2VwIDIxIDEyOjI0OjQ0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogaTM4Ni5oOiAgQ2hhbmdlIHZ0YWJsZSByZWxvYyBudW1iZXJzLgotCi1TdW4gU2VwIDIwIDAwOjU0OjIyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLmg6IEFkZCB2dGFibGUgcmVsb2NzIGFuZCBSXzY4S19tYXguCi0KLVR1ZSBTZXAgMTUgMDk6NTY6NDkgQ0RUIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBhcm0uaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1Nb24gQXVnIDMxIDExOjI1OjI3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6ICBEZWZpbmUgU1RUX0FSTV9URlVOQy4gIFJlbW92ZSBTVF9USFVNQl94eHh4Ci0gICAgICAgIGRlZmluaXRpb25zLgotCi1TYXQgQXVnIDI5IDIyOjI1OjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIHZ0YWJsZSByZWxvY3MuCi0KLTE5OTgtMDgtMjUgMTY6NDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIFNZTUlORk9fKiBtYWNyb3MgdG8gYWNjZXNzIEVsZipfU3ltaW5mbyBpbmZvcm1hdGlvbi4KLQotCSogZXh0ZXJuYWwuaDogQWRkIEVsZl9FeHRlcm5hbF9TeW1pbmZvIGRlZmluaXRpb24uCi0KLQkqIGludGVybmFsLmg6IEFkZCBFbGZfSW50ZXJuYWxfU3ltaW5mbywgRWxmMzJfSW50ZXJuYWxfU3ltaW5mbywKLQlhbmQgRWxmNjRfU3ltaW5mbyBkZWZpbml0aW9ucy4KLQotU3VuIEF1ZyAgOSAyMDoyNjo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGFybS5oOiAgQWRkIFNUX1RIVU1CIGRlZmluaXRpb25zLgotCi1XZWQgQXVnICA1IDE1OjUyOjM1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oOiBBZGQgRUxGIGhlYWRlciBmbGFncyB0byBzcGVjaWZ5IGNvbXBpbGUgdGltZSBvcHRpbnM6Ci0JRUZfSU5URVJXT1JLOiBOZXcgZmxhZy4KLQlFRl9BUENTXzI2OiBOZXcgZmxhZy4KLQlFRl9BUENTX0ZMT0FUOiBOZXcgZmxhZy4KLQlFRl9QSUM6IE5ldyBmbGFnLgotCi0xOTk4LTA3LTMxIDIxOjI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgbWlzc2luZyBSSEZfKiBjb25zdGFudHMuCi0KLUZyaSBKdWwgMzEgMTA6MDE6NDAgMTk5OCBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS5oOiBBZGQgUl9BUk1fVEhNX1BDOSByZWxvY2F0aW9uLgotCi0xOTk4LTA3LTMwIDE2OjI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBuZXcgRFRfKiBlbnRyaWVzIGFuZCB0aGVyZSBmbGFnIG1hY3JvcyBmcm9tIFNvbGFyaXMuCi0KLVR1ZSBKdWwgMjggMTg6MTQ6MDcgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaDogKFJfU1BBUkNfUkVWMzIpOiBBZGRlZCBmb3IgbGl0dGxlIGVuZGlhbiBkYXRhIGUuZy4gc3BhcmMgODZ4LgotCi1GcmkgSnVsIDI0IDExOjIyOjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgUl9NTjEwMzAwXzI0IHJlbG9jYXRpb24uCi0KLTE5OTgtMDctMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBNSVBTNjQgcmVsb2NhdGlvbiBuYW1lcyBhbmQgdmFsdWVzLgotCi1XZWQgSnVsIDIyIDE5OjI5OjAwIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6IFJlbmFtZSByZWxvY2F0aW9ucy4KLQotMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHBwYy5oOiBEZWZpbmUgZW51bSBhcyBlbGZfcHBjX3JlbG9jX3R5cGUuCi0KLVdlZCBKdWwgMjIgMTY6MjI6MTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmg6IE5ldyBmaWxlLiAgUHJvdmlkZXMgcmVsb2NhdGlvbiBtYWNyb3M6Ci0JU1RBUlRfUkVMT0NfTlVNQkVSUywgUkVMT0NfTlVNQkVSLCBGQUtFX1JFTE9DLCBFTVBUWV9SRUxPQyBhbmQKLQlFTkRfUkVMT0NfTlVNQkVSUyB1c2VkIGJ5IG90aGVyIGVsZiBoZWFkZXIgZmlsZXMuCi0KLQkqIGFscGhhLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGFyYy5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBhcm0uaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogZDEwdi5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBkMzB2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGhwcGEuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogaTM4Ni5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtMzJyLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG02OGsuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbWlwcy5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtbjEwMjAwLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG1uMTAzMDAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogcHBjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHNoLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHNwYXJjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHY4NTAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCi0xOTk4LTA3LTIyIDEzOjA3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbW4xMDMwMC5oOiBSZXdyaXRlIHJlbG9jYXRpb24gZGVmaW5pdGlvbiB1c2luZyBtYWNyb3MuCi0JKiBtaXBzLmg6IExpa2V3aXNlLgotCSogcHBjLmg6IExpa2V3aXNlLgotCSogYWxwaGEuaDogTGlrZXdpc2UuCi0JKiBhcm0uaDogTGlrZXdpc2UuCi0JKiBkMTB2Lmg6IExpa2V3aXNlLgotCSogZDMwdi5oOiBMaWtld2lzZS4KLQkqIG0zMnIuaDogTGlrZXdpc2UuCi0JKiBtNjhrLmg6IExpa2V3aXNlLgotCSogbW4xMDIwMC5oOiBMaWtld2lzZS4KLQkqIHNoLmg6IExpa2V3aXNlLgotCSogc3BhcmMuaDogTGlrZXdpc2UuCi0KLTE5OTgtMDctMjEgMTM6MDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBhcm0uaDogTmV3IGZpbGUuCi0JKiBkMTB2Lmg6IE5ldyBmaWxlLgotCSogZDMwdi5oOiBOZXcgZmlsZS4KLQkqIGkzODYuaDogTmV3IGZpbGUuCi0JKiBtNjhrLmg6IE5ldyBmaWxlLgotCSogbW4xMDIwMC5oOiBOZXcgZmlsZS4KLQkqIHNoLmg6IE5ldyBmaWxlLgotCi0JKiBtaXBzLmg6IEFkZCBSX01JUFNfKiBhbmQgU0hUX01JUFNfKiBlbnRyaWVzLgotCi0JKiBtbjEwMzAwLmg6IEFkZCBSX01OMTAzMDBfKiBlbnRyaWVzLgotCi0JKiBwcGMuaDogQWRkIFJfUFBDXyogZW50cmllcy4KLQotMTk5OC0wNy0yMCAwNzoxMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIE9ES18qLCBPRVhfKiwgT1BBRF8qLCBPSFdfKiwgYW5kIE9HUF8qIGNvbnN0YW50cy4KLQlEZWZpbmUgRWxmMzJfRXh0ZXJuYWxfTGliLgotCi0xOTk4LTA3LTE5IDE1OjI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChQVF9NSVBTX09QVElPTlMpOiBOZXcgc3ltYm9sLgotCUFkZCBsb3RzIG9mIERUX01JUFNfKiBzeW1ib2xzLgotCi1GcmkgSnVuIDI2IDEwOjQ2OjM1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBOZXcgZmlsZS4KLQotVGh1IEp1biAxOCAxOToyNzo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fOTYwLCBFTV9WODAwLCBFTV9GUjIwLCBFTV9SSDMyLCBFTV9NTUEsCi0JRU1fT0xEX0FMUEhBKTogQWRkIHRoZXNlIGNvbnN0YW50cy4KLQotVGh1IEp1biAxMSAxNzo1OTowMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fNDg2LCBFTV9TMzcwKTogQWRkIHRoZXNlIGNvbnN0YW50cy4KLQotVHVlIEp1biAgOSAwOTozNToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQVJNKTogQWRkIHRoaXMgY29uc3RhbnQuCi0KLVdlZCBNYXkgIDYgMDk6NDU6MzAgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRUZfTUlQU19NQUNILEVfTUlQU19NQUNIXyopOiBBZGRlZC4KLQotU2F0IEFwciAyNSAxODozNTowNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5oIChTVE9fQUxQSEFfTk9QViwgU1RPX0FMUEhBX1NURF9HUExPQUQpOiBOZXcuCi0KLVdlZCBBcHIgMTUgMTU6NDI6NDUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1NQQVJDNjQpOiBNb3ZlIGFuZCByZW5hbWUgdG8gRU1fT0xEX1NQQVJDVjkuCi0JKEVNX1NQQVJDVjkpOiBOZXcuICBUaGlzIGlzIHRoZSBvZmZpY2lhbCBBQkkgbmFtZSBhbmQgbnVtYmVyLgotCi1TYXQgRmViIDI4IDE3OjA0OjQxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKEVGX0FMUEhBXzMyQklULCBFRl9BTFBIQV9DQU5SRUxBWCk6IE5ldy4KLQotTW9uIERlYyAxNSAxNTowNzo0OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtMzJyLmggKEVGX00zMlJfQVJDSCwgRV9NMzJSX0FSQ0gpOiBOZXcgZmxhZ3MgdG8KLQlzcGVjaWZ5IG1hY2hpbmUgYXJjaGl0ZWN0dXJlLgotCi1GcmkgRGVjICA1IDExOjIwOjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGNvbnN0YW50czogU0hOX1Y4NTBfU0NPTU1PTiwgU0hOX1Y4NTBfVENPTU1PTiwKLQlTSE5fVjg1MF9aQ09NTU9OLCBTSFRfVjg1MF9TQ09NTU9OLCBTSFRfVjg1MF9UQ09NTU9OLAotCVNIVF9WODUwX1pDT01NT04gdG8gaGFuZGxlIHY4NTAgY29tbW9uIHNlY3Rpb25zLgotCWVudW0gcmVsb2NfdHlwZSByZW5hbWVkIHRvIHY4NTBfcmVsb2NfdHlwZSB0byBhdm9pZCBuYW1lCi0JY29uZmxpY3QuCi0KLVRodSBPY3QgMjMgMTM6NTU6MjQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoZW51bSBlbGZfc3BhcmNfcmVsb2NfdHlwZSk6IEFkZCBVQTY0ICYgVUExNi4KLQotVGh1IE9jdCAyMyAwMDo0MjowNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRFRfU1BBUkNfUkVHSVNURVIpOiBOZXcgbWFjcm8uCi0JKERUX1NQQVJDX1BMVEZNVCk6IEluIHN1cHBvcnQgb2Ygb2xkIHNwYXJjNjQtbGludXggLnBsdHM7IHdpbGwKLQlnbyBhd2F5IHNvb24uCi0KLVR1ZSBTZXAgMzAgMTM6MjY6NTggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRUZfU1BBUkNfSEFMX1IxLCBFRl9TUEFSQ19FWFRfTUFTSyk6IE5ldyBtYWNyb3MuCi0JKEVGX1NQQVJDVjlfe01NLFRTTyxQU08sUk1PfSk6IE5ldyBtYWNyb3MuCi0JKFNITl9CRUZPUkUsU0hOX0FGVEVSKTogTmV3IG1hY3Jvcy4KLQkoU0hGX0VYQ0xVREUsU0hGX09SREVSRUQpOiBOZXcgbWFjcm9zLgotCShTVFRfUkVHSVNURVIpOiBOZXcgbWFjcm8uCi0JKFJfU1BBUkNfR0xPQl9KTVApOiBEZWxldGVkLCBidXQgc2xvdCByZXNlcnZlZC4KLQkoUl9TUEFSQ197RElTUDY0LFBMVDY0LEhJWDIyLExPWDEwfSk6IE5ldyByZWxvY2F0aW9ucy4KLQkoUl9TUEFSQ197SDQ0LE00NCxMNDQsUkVHSVNURVJ9KTogTmV3IHJlbG9jYXRpb25zLgotCShFTEY2NF9SX1RZUEVfe0RBVEEsSUQsSU5GT30pOiBOZXcgbWFjcm9zLgotCi1XZWQgU2VwIDE3IDE2OjQxOjQyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogQWRkIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIGFuZCBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULgotCi1UdWUgU2VwIDE2IDE0OjE2OjE3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAocmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVC4KLQotV2VkIFNlcCAgMyAxNToxMToxNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IENvcnJlY3QgdHlwbyBpbiBjb21tZW50LgotCi1XZWQgU2VwICAzIDExOjI1OjU3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAocmVsb2NfdHlwZSk6IFJlbW92ZSBSX1Y4NTBfMTZfUENSRUwuCi0KLVR1ZSBTZXAgIDIgMTc6NDE6MDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IFJlbW92ZSBtYWdpYyBudW1iZXIgZm9yIFY4NTBFLgotCSogY29tbW9uLmg6IFJlbW92ZSBtYWdpYyBudW1iZXIgZm9yIFY4NTBFQS4KLQkqIHY4NTAuaDogQWRkIG5ldyBmbGFncyBmb3IgZV9mbGFncyBmaWVsZCBpbiBlbGYgaGVhZGVyLgotCi1Nb24gQXVnIDI1IDE2OjA2OjQ3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfVjg1MEUpOiBiYWNrZW5kIG1hZ2ljIG51bWJlciBmb3Igdjg1MGUuCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1Y4NTBFQSk6IGJhY2tlbmQgbWFnaWMgbnVtYmVyIGZvciB2ODUwZWEuCi0KLU1vbiBBdWcgMTggMTE6MDU6MjMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogQWRkIDE2IGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLgotCi1GcmkgQXVnIDE1IDA1OjEwOjA5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFyYy5oIChlbnVtIHJlbG9jKTogTW92ZSBoZXJlIGZyb20gZWxmMzItYXJjLmMuCi0KLUZyaSBBdWcgIDggMTc6MDU6MjkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX0NZR05VU19BUkMpOiBEZWZpbmUuCi0KLU1vbiBKdW4gMTYgMTQ6NDY6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfRWhkcik6IENoYW5nZSBlX3Bob2ZmIGFuZCBlX3Nob2ZmIGZyb20KLQliZmRfc2lnbmVkX3ZtYSB0byBiZmRfc2l6ZV90eXBlLCBhcyB0aGV5IGFyZSBub3Qgc2lnbmVkLgotCi1XZWQgTWFyICA1IDE1OjM1OjI2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKFNIRl9NMzJSX0NBTl9SRUxBWCk6IERlZmluZS4KLQotTW9uIEZlYiAyNCAxNzo0OTowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4dGVybmFsLmg6IER1bXAgdGhlIDMyLzY0IGJpdCBzcGVjaWZpYyBmb3JtcyBvZiB0aGUgdmVyc2lvbgotCXN0cnVjdHVyZXMsIGFuZCBqdXN0IGRlZmluZSB0aGVtIGFzIHNpemUgaW5kZXBlbmRlbnQuCi0KLQkqIGNvbW1vbi5oIChWRVJTWU1fSElEREVOLCBWRVJTWU1fVkVSU0lPTik6IERlZmluZS4KLQotRnJpIEZlYiAyMSAxMzowMDozNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX00zMlJfU0RBMTYuCi0JKFNITl9NMzJSX1NDT01NT04pOiBEZWZpbmUuCi0KLVdlZCBGZWIgMTkgMTU6MzU6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZXh0ZXJuYWwuaCwgaW50ZXJuYWwuaCwgY29tbW9uLmg6IEFkZGVkIG5ldyBzdHJ1Y3R1cmVzIGFuZAotCWRlZmluaXRpb25zIGZvciBFTEYgdmVyc2lvbnMuCi0KLVR1ZSBGZWIgMTggMTc6NDA6MzYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfRDMwVik6IERlZmluZS4KLQotTW9uIEphbiAyNyAxMTo1NDo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci5oIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9NMzJSX0hJMTZfW1NVXUxPLFJfTTMyUl9MTzE2LgotCi1GcmkgSmFuICAzIDExOjMyOjUxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX09USEVSX3tUREFfQllURSxFUlJPUn0pOiBOZXcgYml0cyBmb3IgdGhlIHN0X290aGVyCi0JZmllbGQuCi0JKFNITl9WODUwXyopOiBSZW1vdmUgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGluZGV4ZXMsIHdoaWNoIGFyZSBub3QKLQluZWVkZWQuCi0JKGVudW0gcmVsb2NfdHlwZSk6IE1vdmUgdGhlIHY4NTAgcmVsb2NhdGlvbnMgaGVyZSBmcm9tCi0JZWxmMzItdjg1MC5jCi0KLVRodSBKYW4gIDIgMTk6MzA6MjMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmg6IE5ldyBmaWxlLCBwcm92aWRlIFY4NTAgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCi0KLVR1ZSBEZWMgMzEgMTQ6NDQ6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRFRfQVVYSUxJQVJZKTogRGVmaW5lLgotCShEVF9GSUxURVIpOiBEZWZpbmUuCi0KLVdlZCBEZWMgIDQgMDU6MDM6MzcgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaDogVXBkYXRlLgotCi1UdWUgTm92IDI2IDEwOjQ0OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTVE9fTUlQUzE2KTogRGVmaW5lLgotCi1UdWUgTm92IDEyIDE1OjQ1OjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IFJlbW92ZSBlbXB0eSBmaWxlLgotCi1UdWUgT2N0ICA4IDExOjMxOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX0FCSTIpOiBEZWZpbmUuCi0KLVRodSBPY3QgIDMgMTA6MDE6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb21tb24uaDogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gbW4xMDIwMCBhbmQgbW4xMDMwMC4KLQotV2VkIE9jdCAgMiAyMToyNjo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfTU4xMHgwMCk6IERlZmluZS4KLQotTW9uIFNlcCAyMyAwOToxODowNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci5oOiBOZXcgZmlsZS4KLQotRnJpIEF1ZyAzMCAxNzowNjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9TSCk6IERlZmluZS4KLQotVHVlIEF1ZyAyMCAxNDo0Nzo1NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19WODUwKTogRGVmaW5lLgotCi1Nb24gQXVnIDE5IDEwOjU5OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfTTMyUik6IERlZmluZS4KLQotTW9uIEp1bCAyMiAxODo1OTo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoU0hUX01JUFNfSUZBQ0UsIFNIVF9NSVBTX0NPTlRFTlQpOiBEZWZpbmUuCi0JKFNIVF9NSVBTX1NZTUJPTF9MSUIpOiBEZWZpbmUuCi0JKFNIRl9NSVBTX01FUkdFLCBTSEZfTUlQU19BRERSMzIsIFNIRl9NSVBTX0FERFI2NCk6IERlZmluZS4KLQkoU0hGX01JUFNfTk9TVFJJUCwgU0hGX01JUFNfTE9DQUwsIFNIRl9NSVBTX05BTUVTKTogRGVmaW5lLgotCi1UaHUgSnVsIDE4IDE5OjEyOjE1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmg6IE5ldyBmaWxlLgotCi1KdWwgMTggMTM6MjA6MzkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfRDEwVik6IERlZmluZS4KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0KLUZyaSBKdW4gMjEgMTI6MzM6MjQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX0FMUEhBKTogRGVmaW5lLgotCi1GcmkgTWF5IDMxIDE3OjI4OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFbGZfRXh0ZXJuYWxfT3B0aW9ucywgRWxmX0ludGVybmFsX09wdGlvbnMpOiBEZWZpbmUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4pOiBEZWNsYXJlLgotCShiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCk6IERlY2xhcmUuCi0JKE9ES18qKTogRGVmaW5lLgotCShFbGY2NF9FeHRlcm5hbF9SZWdJbmZvLCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvKTogRGVmaW5lLgotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4pOiBEZWNsYXJlLgotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogRGVjbGFyZS4KLQotVGh1IE1heSAzMCAxMjozNTo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRV9NSVBTX0FSQ0hfNCk6IERlZmluZS4KLQotV2VkIE1heSAyOSAxNTozNTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpOiBEZWZpbmUuCi0JKEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsKTogRGVmaW5lLgotCShFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEsIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSk6IERlZmluZS4KLQkoUlNTXyopOiBEZWZpbmUuCi0KLU1vbiBBcHIgMjIgMTg6MjY6MzAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ19bNTZdKTogQWx3YXlzIGRlZmluZS4KLQotTW9uIEZlYiAxOSAwMTo1NTo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ197UExUMzIsSElQTFQyMixMT1BMVDEwLFBDUExUMzIsUENQTFQyMiwKLQlQQ1BMVDEwLDUsNn0pOiBEb24ndCBkZWZpbmUgaWZkZWYgU1BBUkM2NF9PTERfUkVMT0NTLgotCi1UdWUgRmViICA2IDExOjMzOjU4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIHNwYXJjX2VsZl9yZWxvY190eXBlKTogRGVmaW5lLgotCi1XZWQgSmFuIDE3IDA5OjA5OjE2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oOiBEZWZpbmUgRU1fU1BBUkMzMlBMVVMuCi0JKiBzcGFyYy5oOiBOZXcgZmlsZS4KLQotVGh1IEphbiAxMSAxNjoyNzozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChTSEZfRVhDTFVERSwgU0hUX09SREVSRUQpOiBOZXcgZmllbGRzIGZyb20gdGhlIGFiaS4KLQotVGh1IE5vdiAzMCAxNjo0NzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApOiBBZGQgaW5jbHVkZXNfZmlsZWhkciBhbmQKLQlpbmNsdWRlc19waGRycyBmaWVsZHMuCi0KLVR1ZSBOb3YgMjggMTY6NTg6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKTogRGVmaW5lLgotCi1UdWUgT2N0IDMxIDE1OjE5OjM2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCwgZHdhcmYuaCwgZXh0ZXJuYWwuaCwgaHBwYS5oLCBpbnRlcm5hbC5oLAotCW1pcHMuaCwgcHBjLmg6ICBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQotVGh1IFNlcCAyMSAxMzo1MTo1OCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChFRl9QUENfUkVMT0NBVEFCTEVfTElCKTogQWRkIG5ldyBmbGFnIGJpdC4KLQotRnJpIFNlcCAgMSAxNTozMjoxNyAxOTk1ICBLYXp1bW90byBLb2ppbWEgIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4KLQotCSogbWlwcy5oOiBBZGQgc29tZSBkZWZpbml0aW9ucyB1c2VkIG9uIElyaXggNS4KLQotVHVlIEp1biAyMCAxMDoxODoyOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChDUFVfUEFfUklTQzFfMCk6IFByb3RlY3QgZnJvbSByZWRlZmluaXRpb25zLgotCShDUFVfUEFfUklTQzFfMSk6IExpa2V3aXNlLgotCi1XZWQgTWFyICA4IDE4OjE0OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmg6IE5ldyBmaWxlIGZvciBQb3dlclBDIHN1cHBvcnQuCi0KLVR1ZSBGZWIgMTQgMTM6NTk6MTMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDKTogVXNlIG9mZmljYWwgdmFsdWUgb2YgMjAsIG5vdCAxNy4KLQkoRU1fUFBDX09MRCk6IERlZmluZSB0aGlzIHRvIGJlIHRoZSBvbGQgdmFsdWUgb2YgRU1fUFBDLgotCi1UdWUgSmFuIDI0IDA5OjQwOjU5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1BQQyk6IE5ldyBtYWNybywgUG93ZXJQQyBtYWNoaW5lIGlkLgotCi1UdWUgSmFuIDE3IDEwOjUxOjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTSFRfTUlQU19NU1lNLCBTSFRfTUlQU19EV0FSRiwgU0hUX01JUFNfRVZFTlRTKTogRGVmaW5lLgotCi1Nb24gT2N0IDE3IDEzOjQzOjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVybmFsX1NoZHIpOiBSZW1vdmUgcmF3ZGF0YSBhbmQgc2l6ZSBmaWVsZHMuCi0JQWRkIGJmZF9zZWN0aW9uIGZpZWxkLgotCi1UdWUgTWF5IDI0IDE2OjExOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChFbGYzMl9FeHRlcm5hbF9ncHRhYik6IERlZmluZS4KLQotTW9uIE1heSAxNiAxMzoyMjowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29tbW9uLmggKEVNX0hQUEEpOiBEZWxldGUuCi0JKEVNX1BBUklTQyk6IEFkZC4KLQkqIGhwcGEuaDogTmV3IGZpbGUuCi0KLU1vbiBNYXkgIDkgMTM6Mjc6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoU0hOX0xPUkVTRVJWRSk6IFJlbmFtZSBmcm9tIFNITl9MT1JFU0VSVi4KLQkoRUxGMzJfUl9UWVBFLCBFTEYzMl9SX0lORk8pOiBEb24ndCByZWx5IG9uIHNpemUgb2YgdW5zaWduZWQgY2hhci4KLQkoRUxGNjRfUl9UWVBFKTogRG9uJ3QgcmVseSBvbiBzaXplIG9mIHVuc2lnbmVkIGxvbmcuCi0KLU1vbiBBcHIgMjUgMTU6NTM6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfU2hkcik6IFVzZSBQVFIsIG5vdCB2b2lkICouCi0KLUZyaSBNYXIgMTEgMDA6MzQ6NTkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtaXBzLmggKFNITl9NSVBTX1RFWFQsIFNITl9NSVBTX0RBVEEpOiAgRGVmaW5lLgotCi1TYXQgTWFyICA1IDE0OjA4OjU0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaW50ZXJuYWwuaDogIFJlbW92ZSBFbGYzMl8qLCBFbGY2NF8qIHR5cGVkZWZzLiAgVGhlc2UgbmFtZXMKLQljYXVzZSBjb25mbGljdHMgd2l0aCBzeXN0ZW0gaGVhZGVycywgZS5nLiBsaW5rLmggaW4gZ2RiL3NvbGliLmMuCi0JQ29tYmluZSAzMi0gYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiAqX0ludGVybmFsX0R5bi4KLQkqIGNvbW1vbi5oOiAgUmVwbGFjZSB1c2VzIG9mIEVsZjY0X1dvcmQsIEVsZjY0X1h3b3JkIHR5cGVkZWZzCi0JYnkgdGhlaXIgZXhwYW5zaW9uLgotCSogbWlwcy5oOiAgUmVwbGFjZSB1c2VzIG9mIEVsZjMyX1dvcmQsIEVsZjMyX1N3b3JkLCBFbGYzMl9BZGRyCi0JdHlwZWRlZnMgYnkgdGhlaXIgZXhwYW5zaW9uLiBBZGQgRFRfTUlQU19STERfTUFQIGRlZmluaXRpb24uCi0KLUZyaSBGZWIgMTggMTA6Mzk6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1BPV0VSUEMpOiBEZWZpbmUuICBUaGlzIG1heSBiZSB0ZW1wb3JhcnksCi0JZGVwZW5kaW5nIHVwb24gaG93IHF1aWNrbHkgSSBjYW4gZmluZCBhIHJlYWwgUG93ZXJQQyBBQkkuCi0KLU1vbiBGZWIgIDcgMDg6Mjc6MTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBIT1NUXzY0X0JJVCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLVdlZCBGZWIgIDIgMTQ6MTI6MTggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oOiBBZGQgY29tbWVudHMgcmVnYXJkaW5nIHZhbHVlIG9mIEVNX0hQUEEgYW5kIGhvdyB0bwotCXBpY2sgYW4gdW5vZmZpY2lhbCB2YWx1ZS4KLQotV2VkIE5vdiAxNyAxNzoxNDoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoU0hUX01JUFNfT1BUSU9OUyk6IERlZmluZS4KLQotTW9uIE5vdiAgOCAxNzo1NzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogQWRkZWQgc29tZSBtb3JlIE1JUFMgQUJJIG1hY3JvIGRlZmluaXRpb25zLgotCi1XZWQgTm92ICAzIDIyOjA3OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKEVNX01JUFNfUlM0X0JFKTogTmV3IG1hY3JvLgotCi1UdWUgT2N0IDEyIDA3OjI4OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBOZXcgZmlsZS4gIE1JUFMgQUJJIHNwZWNpZmljIGluZm9ybWF0aW9uLgotCi1Nb24gSnVuIDIxIDEzOjEzOjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBDb21iaW5lZCAzMi0gYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiBhbGwgc3RydWN0dXJlcwotCWV4Y2VwdCAqX0ludGVybmFsX0R5bi4gIFRoaXMgd2lsbCBzaW1wbHkgdGhlIGFzc2VtYmxlciBpbnRlcmZhY2UsCi0JYW5kIHNvbWUgYmZkIGNvZGUuCi0KLVR1ZSBNYXkgMjUgMDI6MDA6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBjb21tb24uaDogQWRkZWQgNjQtYml0IHZlcnNpb25zIG9mIHNvbWUKLQlzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MuICBSZW5hbWVkIG9sZCB2ZXJzaW9ucyB0byBwdXQgIjMyIiBpbiB0aGUKLQluYW1lLiAgU29tZSBhcmUgdW5jaGFuZ2VkLgotCi1UaHUgQXByIDI5IDEyOjEyOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fSFBQQSwgTlRfVkVSU0lPTiwgU1ROX1VOREVGLCBEVF8qKTogTmV3IG1hY3Jvcy4KLQkqIGV4dGVybmFsLmggKEVsZl9FeHRlcm5hbF9EeW4pOiBOZXcgdHlwZS4KLQotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVucmFsX1NoZHIpOiBOZXcgZmllbGQgYHNpemUnLgotCShFbGZfSW50ZXJuYWxfRHluKTogTmV3IHR5cGUuCi0KLVR1ZSBBcHIgMjAgMTY6MDM6NDUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmggKExBTkdfQ0hJTEwpOiAgQ2hhbmdlIHZhbHVlIHRvIG9uZSByYW5kb21seSBwaWNrZWQgaW4KLQl0aGUgdXNlciBkZWZpbmVkIHJhbmdlLCB0byByZWR1Y2UgcHJvYmFiaWxpdHkgb2YgY29sbGlzaW9ucy4KLQotU3VuIE5vdiAxNSAwOTozNDowMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaCAoQVRfc3JjX2Nvb3Jkcyk6ICBXaGl0ZXNwYWNlIGNoYW5nZSBvbmx5LgotCSogZHdhcmYuaCAoQVRfYm9keV9iZWdpbiwgQVRfYm9keV9lbmQsIExBTkdfTU9EVUxBMik6Ci0JQWRkIGZyb20gbGF0ZXN0IGdjYy4KLQkqIGR3YXJmLmggKExBTkdfQ0hJTEwpOiAgQWRkIGFzIEdOVSBleHRlbnNpb24uCi0KLVNhdCBBdWcgIDEgMTM6NDY6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmg6ICBSZXBsYWNlIHdpdGggY3VycmVudCB2ZXJzaW9uIGZyb20gZ2NjIGRpc3RyaWJ1dGlvbi4KLQotRnJpIEp1biAxOSAxOTowNTowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogIEFkZCByZWFsIHN0cnVjdCB0YWdzIHRvIGFsbCB0aGUgVHlwZV9EZWZzLCBzbyB0aGV5Ci0JY2FuIGJlIHVzZWQgaW4gcHJvdG90eXBlcyB3aGVyZSB0aGUgVHlwZV9EZWZzIGFyZSBub3Qga25vd24uCi0KLUZyaSBBcHIgIDMgMjA6NTg6NTggMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmg6IGFkZGVkIEVMRl9SX3tTWU0sVFlQRSxJTkZPfSBmb3IgaGFuZGxpbmcgcmVsb2NhdGlvbgotCWluZm8KLQlhZGRlZCBFTV9NSVBTLCBhbmQgY29ycmVjdGVkIHZhbHVlIG9mIEVNXzg2MCBiYXNlZCBvbiBTeXN0ZW0gViBBQkkKLQltYW51YWwuCi0KLQkqIGV4dGVybmFsLmg6IGFkZGVkIEVsZl9FeHRlcm5hbF97UmVsLFJlbGF9LgotCi0JKiBpbnRlcm5hbC5oOiBhZGRlZCBFbGZfSW50ZXJuYWxfe1JlbCxSZWxhfS4KLQlhZGRlZCByYXdkYXRhIHRvIEVsZl9JbnRlcm5hbF9TaGRyLgotCi1TYXQgTm92IDMwIDIwOjQzOjU5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCwgZHdhcmYuaCwgZXh0ZXJuYWwuaCwgaW50ZXJuYWwuaCwgQ2hhbmdlTG9nOyBtb3ZlZCBmcm9tCi0JLi4vZWxmLTxmb28+Ci0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FscGhhLmggYi9pbmNsdWRlL2VsZi9hbHBoYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWU5ZDVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogQUxQSEEgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQnkgRXJpYyBZb3VuZ2RhbGUsIDxlcmljQGFpYi5jb20+LiAgTm8gcHJvY2Vzc29yIHN1cHBsZW1lbnQgYXZhaWxhYmxlCi0gICBmb3IgdGhpcyBwbGF0Zm9ybS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEFMUEhBIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX0FMUEhBX0gKLSNkZWZpbmUgX0VMRl9BTFBIQV9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEFsbCBhZGRyZXNzZXMgbXVzdCBiZSBiZWxvdyAyR0IuICAqLwotI2RlZmluZSBFRl9BTFBIQV8zMkJJVAkJMHgwMDAwMDAwMQotCi0vKiBBbGwgcmVsb2NhdGlvbnMgbmVlZGVkIGZvciByZWxheGF0aW9uIHdpdGggY29kZSBtb3ZlbWVudCBhcmUgcHJlc2VudC4gICovCi0jZGVmaW5lIEVGX0FMUEhBX0NBTlJFTEFYCTB4MDAwMDAwMDIKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLwotCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgZ2xvYmFsIGRhdGEgYXJlYS4gICovCi0jZGVmaW5lIFNIRl9BTFBIQV9HUFJFTAkJMHgxMDAwMDAwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZXhhY3QKLSAgIGZvcm1hdCBpcyB1bnNwZWNpZmllZC4gIEl0J3MgcHJvYmFibHkgRUNPRkYgc3ltYm9scy4gICovCi0jZGVmaW5lIFNIVF9BTFBIQV9ERUJVRwkJMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX0FMUEhBX1JFR0lORk8JMHg3MDAwMDAwMgotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19SRUdJTkZPIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLSAgIHN0cnVjdHVyZS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfZ3BybWFzazsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2Nwcm1hc2tbNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgbG9uZyByaV9ncF92YWx1ZTsKLX0gRWxmNjRfUmVnSW5mbzsKLQotLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotI2RlZmluZSBTVE9fQUxQSEFfTk9QVgkJMHg4MAotI2RlZmluZSBTVE9fQUxQSEFfU1REX0dQTE9BRAkweDg4Ci0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIEFscGhhIHJlbG9jcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfYWxwaGFfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX05PTkUsIDApCS8qIE5vIHJlbG9jICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9SRUZMT05HLCAxKQkvKiBEaXJlY3QgMzIgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9SRUZRVUFELCAyKQkvKiBEaXJlY3QgNjQgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTDMyLCAzKQkvKiBHUCByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0xJVEVSQUwsIDQpCS8qIEdQIHJlbGF0aXZlIDE2IGJpdCB3L29wdGltaXphdGlvbiAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTElUVVNFLCA1KQkvKiBPcHRpbWl6YXRpb24gaGludCBmb3IgTElURVJBTCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BESVNQLCA2KQkvKiBBZGQgZGlzcGxhY2VtZW50IHRvIEdQICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9CUkFERFIsIDcpCS8qIFBDKzQgcmVsYXRpdmUgMjMgYml0IHNoaWZ0ZWQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0hJTlQsIDgpCS8qIFBDKzQgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUwxNiwgOSkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9TUkVMMzIsIDEwKQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUw2NCwgMTEpCS8qIFBDIHJlbGF0aXZlIDY0IGJpdCAqLwotCi0vKiBJbmhlcml0ZWQgdGhlc2UgZnJvbSBFQ09GRiwgYnV0IHRoZXkgYXJlIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsCi0gICBhbmQgYXJlIGRlcHJlY2lhdGVkLiAgQW5kIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgQkZELCBidHcuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfUFVTSCwgMTIpCS8qIE9QIHN0YWNrIHB1c2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1NUT1JFLCAxMykJLyogT1Agc3RhY2sgcG9wIGFuZCBzdG9yZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfUFNVQiwgMTQpCS8qIE9QIHN0YWNrIHN1YnRyYWN0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QUlNISUZULCAxNSkJLyogT1Agc3RhY2sgcmlnaHQgc2hpZnQgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BWQUxVRSwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTEhJR0gsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BSRUxMT1csIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfR1BfMTYsIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfR1BfSEkzMiwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9TQ05fSEkzMiwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9CUl9ISTMyLCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0xPMzIsIDIzKQotCi0vKiBUaGVzZSByZWxvY2F0aW9ucyBhcmUgc3BlY2lmaWMgdG8gc2hhcmVkIGxpYnJhcmllcy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9DT1BZLCAyNCkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR0xPQl9EQVQsIDI1KQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9KTVBfU0xPVCwgMjYpCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFTEFUSVZFLCAyNykJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotCi0gIEVNUFRZX1JFTE9DICAoUl9BTFBIQV9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9BTFBIQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9hcmMuaCBiL2luY2x1ZGUvZWxmL2FyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzRiNTVmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQVJDIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zLCAoZGplQGN5Z251cy5jb20pCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBBUkMgRUxGIEFCSS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUkNfSAotI2RlZmluZSBfRUxGX0FSQ19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hcmNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSQ19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDXzMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX0IyNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSQ19CMjJfUENSRUwsIDMpCi0gIEVNUFRZX1JFTE9DICAoUl9BUkNfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogRm91ciBiaXQgQVJDIG1hY2hpbmUgdHlwZSBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSQ19NQUNICQkweDAwMDAwMDBmCi0KLS8qIFZhcmlvdXMgQ1BVIHR5cGVzLiAgKi8KLSNkZWZpbmUgRV9BUkNfTUFDSF9CQVNFCQkweDAwMDAwMDAwCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VEMQkweDAwMDAwMDAxCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VEMgkweDAwMDAwMDAyCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VENAkweDAwMDAwMDAzCi0KLS8qIExlYXZlIGJpdHMgMHhmMCBhbG9uZSBpbiBjYXNlIHdlIGV2ZXIgaGF2ZSBtb3JlIHRoYW4gMTYgY3B1IHR5cGVzLgotICAgSGlnaGx5IHVubGlrZWx5LCBidXQgd2hhdCB0aGUgaGVjay4gICovCi0KLS8qIEZpbGUgY29udGFpbnMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCi0jZGVmaW5lIEVGX0FSQ19QSUMJCTB4MDAwMDAxMDAKLQotI2VuZGlmIC8qIF9FTEZfQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FybS1vYWJpLmggYi9pbmNsdWRlL2VsZi9hcm0tb2FiaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTA5ODQyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FybS1vYWJpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiBBUk0gRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfQVJNX0gKLSNkZWZpbmUgX0VMRl9BUk1fSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQotI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAgMHgwMgotI2RlZmluZSBFRl9JTlRFUldPUksgICAgICAgMHgwNAotI2RlZmluZSBFRl9BUENTXzI2ICAgICAgICAgMHgwOAotI2RlZmluZSBFRl9BUENTX0ZMT0FUICAgICAgMHgxMAotI2RlZmluZSBFRl9QSUMgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBFRl9BTElHTjgJICAgMHg0MAkJLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UgKi8KLSNkZWZpbmUgRUZfTkVXX0FCSSAgICAgICAgIDB4ODAKLSNkZWZpbmUgRUZfT0xEX0FCSSAgICAgICAgIDB4MTAwCi0KLS8qIExvY2FsIGFsaWFzZXMgZm9yIHNvbWUgZmxhZ3MgdG8gbWF0Y2ggbmFtZXMgdXNlZCBieSBDT0ZGIHBvcnQuICAqLwotI2RlZmluZSBGX0lOVEVSV09SSwkgICBFRl9JTlRFUldPUksKLSNkZWZpbmUgRl9BUENTMjYJICAgRUZfQVBDU18yNgotI2RlZmluZSBGX0FQQ1NfRkxPQVQJICAgRUZfQVBDU19GTE9BVAotI2RlZmluZSBGX1BJQyAgICAgICAgICAgICAgRUZfUElDCi0KLS8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzIGZvciBUaHVtYiAqLwotI2RlZmluZSBTVFRfQVJNX1RGVU5DICAgICAweGQKLQotLyogQVJNLXNwZWNpZmljIHZhbHVlcyBmb3Igc2hfZmxhZ3MgKi8KLSNkZWZpbmUgU0hGX0VOVFJZU0VDVCAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWN0aW9uIGNvbnRhaW5zIGFuIGVudHJ5IHBvaW50ICovCi0jZGVmaW5lIFNIRl9DT01ERUYgICAgICAgICAweDgwMDAwMDAwICAgLyogU2VjdGlvbiBtYXkgYmUgbXVsdGlwbHkgZGVmaW5lZCBpbiB0aGUgaW5wdXQgdG8gYSBsaW5rIHN0ZXAgKi8KLQotLyogQVJNLXNwZWNpZmljIHByb2dyYW0gaGVhZGVyIGZsYWdzICovCi0jZGVmaW5lIFBGX0FSTV9TQiAgICAgICAgICAweDEwMDAwMDAwICAgLyogU2VnbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gYWRkcmVzc2VkIGJ5IHRoZSBzdGF0aWMgYmFzZSAqLwotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hcm1fcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9OT05FLCAgICAgICAgIDApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUEMyNCwgICAgICAgICAxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzMyLCAgICAgICAgMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SRUwzMiwgICAgICAgIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTOCwgICAgICAgICA0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzE2LCAgICAgICAgNSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMxMiwgICAgICAgIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX0FCUzUsICAgICA3KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9QQzIyLCAgICAgOCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9TQlJFTDMyLCAgICAgIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQU1QX1ZDQUxMOSwgIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9QQzExLCAgICAxMSkgICAgICAgLyogY3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IHRodW1iIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgIDEyKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZURU5UUlksIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0NPUFksICAgICAgICAyMCkgICAgICAgLyogY29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dMT0JfREFULCAgICAyMSkgICAgICAgLyogY3JlYXRlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0pVTVBfU0xPVCwgICAyMikgICAgICAgLyogY3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTEFUSVZFLCAgICAyMykgICAgICAgLyogYWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVE9GRiwgICAgICAyNCkgICAgICAgLyogMzIgYml0IG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1RQQywgICAgICAgMjUpICAgICAgIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09UICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UMzIsICAgICAgIDI2KSAgICAgICAvKiAzMiBiaXQgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUExUMzIsICAgICAgIDI3KSAgICAgICAvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KLSAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DLCAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAyNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlNCUkVMMzIsICAgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9SUEMyMiwgIDI1MSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SUkVMMzIsICAgICAyNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkFCUzMyLCAgICAgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JQQzI0LCAgICAgIDI1NCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQkFTRSwgICAgICAyNTUpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FybS5oIGIvaW5jbHVkZS9lbGYvYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzE2OTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiBBUk0gRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfQVJNX0gKLSNkZWZpbmUgX0VMRl9BUk1fSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQotI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAgMHgwMgotI2RlZmluZSBFRl9JTlRFUldPUksgICAgICAgMHgwNAotI2RlZmluZSBFRl9BUENTXzI2ICAgICAgICAgMHgwOAotI2RlZmluZSBFRl9BUENTX0ZMT0FUICAgICAgMHgxMAotI2RlZmluZSBFRl9QSUMgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBFRl9BTElHTjgJICAgMHg0MAkJLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UgKi8KLSNkZWZpbmUgRUZfTkVXX0FCSSAgICAgICAgIDB4ODAKLSNkZWZpbmUgRUZfT0xEX0FCSSAgICAgICAgIDB4MTAwCi0jZGVmaW5lIEVGX1NPRlRfRkxPQVQgICAgICAweDIwMAotCi0vKiBMb2NhbCBhbGlhc2VzIGZvciBzb21lIGZsYWdzIHRvIG1hdGNoIG5hbWVzIHVzZWQgYnkgQ09GRiBwb3J0LiAgKi8KLSNkZWZpbmUgRl9JTlRFUldPUksJICAgRUZfSU5URVJXT1JLCi0jZGVmaW5lIEZfQVBDUzI2CSAgIEVGX0FQQ1NfMjYKLSNkZWZpbmUgRl9BUENTX0ZMT0FUCSAgIEVGX0FQQ1NfRkxPQVQKLSNkZWZpbmUgRl9QSUMgICAgICAgICAgICAgIEVGX1BJQwotI2RlZmluZSBGX1NPRlRfRkxPQVQJICAgRUZfU09GVF9GTE9BVAotCi0vKiBBZGRpdGlvbmFsIHN5bWJvbCB0eXBlcyBmb3IgVGh1bWIgKi8KLSNkZWZpbmUgU1RUX0FSTV9URlVOQyAgICAgMHhkCi0KLS8qIEFSTS1zcGVjaWZpYyB2YWx1ZXMgZm9yIHNoX2ZsYWdzICovCi0jZGVmaW5lIFNIRl9FTlRSWVNFQ1QgICAgICAweDEwMDAwMDAwICAgLyogU2VjdGlvbiBjb250YWlucyBhbiBlbnRyeSBwb2ludCAqLwotI2RlZmluZSBTSEZfQ09NREVGICAgICAgICAgMHg4MDAwMDAwMCAgIC8qIFNlY3Rpb24gbWF5IGJlIG11bHRpcGx5IGRlZmluZWQgaW4gdGhlIGlucHV0IHRvIGEgbGluayBzdGVwICovCi0KLS8qIEFSTS1zcGVjaWZpYyBwcm9ncmFtIGhlYWRlciBmbGFncyAqLwotI2RlZmluZSBQRl9BUk1fU0IgICAgICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlZ21lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIGFkZHJlc3NlZCBieSB0aGUgc3RhdGljIGJhc2UgKi8KLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfYXJtX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fTk9ORSwgICAgICAgICAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BDMjQsICAgICAgICAgMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMzMiwgICAgICAgIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMMzIsICAgICAgICAzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BDMTMsICAgICAgICAgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMxNiwgICAgICAgIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTIsICAgICAgICA2KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9BQlM1LCAgICAgNykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlM4LCAgICAgICAgIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fU0JSRUwzMiwgICAgICA5KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9QQzIyLCAgICAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM4LCAgICAgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQU1QX1ZDQUxMOSwgIDEyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NXSTI0LCAgICAgICAxMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fU1dJOCwgICAgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fWFBDMjUsICAgICAgIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9YUEMyMiwgICAxNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9DT1BZLCAgICAgICAgMjApICAgICAgIC8qIGNvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTE9CX0RBVCwgICAgMjEpICAgICAgIC8qIGNyZWF0ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9KVU1QX1NMT1QsICAgMjIpICAgICAgIC8qIGNyZWF0ZSBQTFQgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SRUxBVElWRSwgICAgMjMpICAgICAgIC8qIGFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1RPRkYsICAgICAgMjQpICAgICAgIC8qIDMyIGJpdCBvZmZzZXQgdG8gR09UICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UUEMsICAgICAgIDI1KSAgICAgICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVDMyLCAgICAgICAyNikgICAgICAgLyogMzIgYml0IEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BMVDMyLCAgICAgICAyNykgICAgICAgLyogMzIgYml0IFBMVCBhZGRyZXNzICovCi0gIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQzEsIDI4KQotICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQzEsICA5OSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRFTlRSWSwgMTAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dOVV9WVElOSEVSSVQsIDEwMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMxMSwgICAgMTAyKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM5LCAgICAgMTAzKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQzIsIDEwNCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MyLCAgMjQ4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JYUEMyNSwgICAgIDI0OSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SU0JSRUwzMiwgICAyNTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1JQQzIyLCAgMjUxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JSRUwzMiwgICAgIDI1MikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQUJTMzIsICAgICAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlBDMjQsICAgICAgMjU0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JCQVNFLCAgICAgIDI1NSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvY29tbW9uLmggYi9pbmNsdWRlL2VsZi9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllYTU3Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLgotICAgRm9yIGV4YW1wbGUsIEVMRk1BRzAgaXMgdGhlIGJ5dGUgMHg3RiBpbiBib3RoIHRoZSBpbnRlcm5hbCAoaW4tbWVtb3J5KQotICAgYW5kIGV4dGVybmFsIChpbi1maWxlKSByZXByZXNlbnRhdGlvbnMuICovCi0KLSNpZm5kZWYgX0VMRl9DT01NT05fSAotI2RlZmluZSBfRUxGX0NPTU1PTl9ICi0KLS8qIEZpZWxkcyBpbiBlX2lkZW50W10gKi8KLQotI2RlZmluZSBFSV9NQUcwCQkwCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAwIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzAJCTB4N0YJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMCAqLwotCi0jZGVmaW5lIEVJX01BRzEJCTEJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDEgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMQkJJ0UnCS8qIE1hZ2ljIG51bWJlciBieXRlIDEgKi8KLQotI2RlZmluZSBFSV9NQUcyCQkyCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAyIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzIJCSdMJwkvKiBNYWdpYyBudW1iZXIgYnl0ZSAyICovCi0KLSNkZWZpbmUgRUlfTUFHMwkJMwkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMyBpbmRleCAqLwotI2RlZmluZSBFTEZNQUczCQknRicJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMyAqLwotCi0jZGVmaW5lIEVJX0NMQVNTCTQJLyogRmlsZSBjbGFzcyAqLwotI2RlZmluZSBFTEZDTEFTU05PTkUJMAkvKiBJbnZhbGlkIGNsYXNzICovCi0jZGVmaW5lIEVMRkNMQVNTMzIJMQkvKiAzMi1iaXQgb2JqZWN0cyAqLwotI2RlZmluZSBFTEZDTEFTUzY0CTIJLyogNjQtYml0IG9iamVjdHMgKi8KLQotI2RlZmluZSBFSV9EQVRBCQk1CS8qIERhdGEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRUxGREFUQU5PTkUJMAkvKiBJbnZhbGlkIGRhdGEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRUxGREFUQTJMU0IJMQkvKiAyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiAqLwotI2RlZmluZSBFTEZEQVRBMk1TQgkyCS8qIDIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuICovCi0KLSNkZWZpbmUgRUlfVkVSU0lPTgk2CS8qIEZpbGUgdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVJX09TQUJJICAgICAgICA3ICAgICAgIC8qIE9wZXJhdGluZyBTeXN0ZW0vQUJJIGluZGljYXRpb24gKi8KLSNkZWZpbmUgRUxGT1NBQklfU1lTViAgIDAgICAgICAgLyogVU5JWCBTeXN0ZW0gViBBQkkgKi8KLSNkZWZpbmUgRUxGT1NBQklfSFBVWCAgIDEgICAgICAgLyogSFAtVVggb3BlcmF0aW5nIHN5c3RlbSAqLwotI2RlZmluZSBFTEZPU0FCSV9TVEFOREFMT05FIDI1NSAvKiBTdGFuZGFsb25lIChlbWJlZGRlZCkgYXBwbGljYXRpb24gKi8KLSNkZWZpbmUgRUxGT1NBQklfQVJNICAgOTcJCS8qIEFSTSAqLwotCi0jZGVmaW5lIEVJX0FCSVZFUlNJT04gICA4ICAgICAgIC8qIEFCSSB2ZXJzaW9uICovCi0KLSNkZWZpbmUgRUlfUEFECQk5CS8qIFN0YXJ0IG9mIHBhZGRpbmcgYnl0ZXMgKi8KLQotCi0vKiBWYWx1ZXMgZm9yIGVfdHlwZSwgd2hpY2ggaWRlbnRpZmllcyB0aGUgb2JqZWN0IGZpbGUgdHlwZSAqLwotCi0jZGVmaW5lIEVUX05PTkUJCTAJLyogTm8gZmlsZSB0eXBlICovCi0jZGVmaW5lIEVUX1JFTAkJMQkvKiBSZWxvY2F0YWJsZSBmaWxlICovCi0jZGVmaW5lIEVUX0VYRUMJCTIJLyogRXhlY3V0YWJsZSBmaWxlICovCi0jZGVmaW5lIEVUX0RZTgkJMwkvKiBTaGFyZWQgb2JqZWN0IGZpbGUgKi8KLSNkZWZpbmUgRVRfQ09SRQkJNAkvKiBDb3JlIGZpbGUgKi8KLSNkZWZpbmUgRVRfTE9PUyAgICAgICAgIDB4RkUwMAkvKiBPcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0hJT1MgICAgICAgICAweEZFRkYgIC8qIE9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgKi8KLSNkZWZpbmUgRVRfTE9QUk9DCTB4RkYwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLSNkZWZpbmUgRVRfSElQUk9DCTB4RkZGRgkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLQotLyogVmFsdWVzIGZvciBlX21hY2hpbmUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGFyY2hpdGVjdHVyZSAqLwotCi0jZGVmaW5lIEVNX05PTkUJCTAJLyogTm8gbWFjaGluZSAqLwotI2RlZmluZSBFTV9NMzIJCTEJLyogQVQmVCBXRSAzMjEwMCAqLwotI2RlZmluZSBFTV9TUEFSQwkyCS8qIFNVTiBTUEFSQyAqLwotI2RlZmluZSBFTV8zODYJCTMJLyogSW50ZWwgODAzODYgKi8KLSNkZWZpbmUgRU1fNjhLCQk0CS8qIE1vdG9yb2xhIG02OGsgZmFtaWx5ICovCi0jZGVmaW5lIEVNXzg4SwkJNQkvKiBNb3Rvcm9sYSBtODhrIGZhbWlseSAqLwotI2RlZmluZSBFTV80ODYJCTYJLyogSW50ZWwgODA0ODYgKi8KLSNkZWZpbmUgRU1fODYwCQk3CS8qIEludGVsIDgwODYwICovCi0jZGVmaW5lIEVNX01JUFMJCTgJLyogTUlQUyBSMzAwMCAob2ZmaWNpYWxseSwgYmlnLWVuZGlhbiBvbmx5KSAqLwotI2RlZmluZSBFTV9TMzcwCQk5CS8qIEFtZGFobCAqLwotI2RlZmluZSBFTV9NSVBTX1JTNF9CRSAxMAkvKiBNSVBTIFI0MDAwIGJpZy1lbmRpYW4gKi8KLQotI2RlZmluZSBFTV9QQVJJU0MgICAgICAxNQkvKiBIUFBBICovCi0jZGVmaW5lIEVNX1ZQUDU1MCAgICAgIDE3ICAgICAgIC8qIEZ1aml0c3UgVlBQNTAwICovCi0jZGVmaW5lIEVNX1NQQVJDMzJQTFVTIDE4CS8qIFN1bidzICJ2OHBsdXMiICovCi0jZGVmaW5lIEVNXzk2MCAgICAgICAgIDE5ICAgICAgIC8qIEludGVsIDgwOTYwICovCi0jZGVmaW5lIEVNX1BQQwkgICAgICAgMjAJLyogUG93ZXJQQyAqLwotI2RlZmluZSBFTV9QUEM2NCAgICAgICAyMQkvKiA2NC1iaXQgUG93ZXJQQyAqLwotCi0jZGVmaW5lIEVNX1Y4MDAgICAgICAgIDM2CS8qIE5FQyBWODAwIHNlcmllcyAqLwotI2RlZmluZSBFTV9GUjIwCSAgICAgICAzNwkvKiBGdWppdHN1IEZSMjAgKi8KLSNkZWZpbmUgRU1fUkgzMgkgICAgICAgMzggICAgICAgLyogVFJXIFJIMzIgKi8KLSNkZWZpbmUgRU1fTUNPUkUgICAgICAgMzkgICAgICAgLyogTW90b3JvbGxhIE1Db3JlICovIC8qIE1heSBhbHNvIGJlIHRha2VuIGJ5IEZ1aml0c3UgTU1BICovCi0jZGVmaW5lIEVNX0FSTQkgICAgICAgNDAJLyogQVJNICovCi0jZGVmaW5lIEVNX09MRF9BTFBIQSAgIDQxCS8qIERpZ2l0YWwgQWxwaGEgKi8KLSNkZWZpbmUgRU1fU0gJICAgICAgIDQyCS8qIEhpdGFjaGkgU0ggKi8KLSNkZWZpbmUgRU1fU1BBUkNWOSAgICAgNDMJLyogU1BBUkMgdjkgNjQtYml0ICovCi0jZGVmaW5lIEVNX1RSSUNPUkUgICAgIDQ0ICAgICAgIC8qIFNpZW1lbnMgVHJpY29yZSBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fQVJDICAgICAgICAgNDUgICAgICAgLyogQXJnb25hdXQgUklTQyBDb3JlLCBBcmdvbmF1dCBUZWNobm9sb2dpZXMgSW5jLiAqLwotI2RlZmluZSBFTV9IOF8zMDAgICAgICA0NiAgICAgICAvKiBIaXRhY2hpIEg4LzMwMCAqLwotI2RlZmluZSBFTV9IOF8zMDBIICAgICA0NyAgICAgICAvKiBIaXRhY2hpIEg4LzMwMEggKi8KLSNkZWZpbmUgRU1fSDhTICAgICAgICAgNDggICAgICAgLyogSGl0YWNoaSBIOFMgKi8KLSNkZWZpbmUgRU1fSDhfNTAwICAgICAgNDkgICAgICAgLyogSGl0YWNoaSBIOC81MDAgKi8KLSNkZWZpbmUgRU1fSUFfNjQgICAgICAgNTAgICAgICAgLyogSW50ZWwgTWVyY2VkVE0gUHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX01JUFNfWCAgICAgIDUxICAgICAgIC8qIFN0YW5mb3JkIE1JUFMtWCAqLwotI2RlZmluZSBFTV9DT0xERklSRSAgICA1MiAgICAgICAvKiBNb3Rvcm9sYSBDb2xkZmlyZSAqLwotI2RlZmluZSBFTV82OEhDMTIgICAgICA1MyAgICAgICAvKiBNb3Rvcm9sYSBNNjhIQzEyICovCi0KLSNkZWZpbmUgRU1fUEogICAgICAgICAgOTkgICAgICAgLyogcGljb0phdmEgKi8KLQotLyogSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFzc2lnbiBuZXcgdW5vZmZpY2lhbCBFTV8qIHZhbHVlcywgcGxlYXNlIHBpY2sgbGFyZ2UKLSAgIHJhbmRvbSBudW1iZXJzICgweDg1MjMsIDB4YTdmMiwgZXRjLikgdG8gbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgY29sbGlzaW9uCi0gICB3aXRoIG9mZmljaWFsIG9yIG5vbi1HTlUgdW5vZmZpY2lhbCB2YWx1ZXMuCi0KLSAgIE5PVEU6IERvIG5vdCBqdXN0IGluY3JlbWVudCB0aGUgbW9zdCByZWNlbnQgbnVtYmVyIGJ5IG9uZS4KLSAgIFNvbWVib2R5IGVsc2Ugc29tZXdoZXJlIHdpbGwgZG8gZXhhY3RseSB0aGUgc2FtZSB0aGluZywgYW5kIHlvdQotICAgd2lsbCBoYXZlIGEgY29sbGlzaW9uLiAgSW5zdGVhZCwgcGljayBhIHJhbmRvbSBudW1iZXIuICAqLwotCi0vKiBDeWdudXMgUG93ZXJQQyBFTEYgYmFja2VuZC4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX1BPV0VSUEMgMHg5MDI1Ci0KLS8qIE9sZCB2ZXJzaW9uIG9mIFNwYXJjIHY5LCBmcm9tIGJlZm9yZSB0aGUgQUJJOyB0aGlzIHNob3VsZCBiZQotICAgcmVtb3ZlZCBzaG9ydGx5LiAgKi8KLSNkZWZpbmUgRU1fT0xEX1NQQVJDVjkJMTEKLQotLyogT2xkIHZlcnNpb24gb2YgUG93ZXJQQywgdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBzaG9ydGx5LiAqLwotI2RlZmluZSBFTV9QUENfT0xECTE3Ci0KLS8qIEN5Z251cyBBUkMgRUxGIGJhY2tlbmQuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19BUkMgMHg5MDQwCi0KLS8qIEN5Z251cyBNMzJSIEVMRiBiYWNrZW5kLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfTTMyUiAweDkwNDEKLQotLyogQWxwaGEgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0FMUEhBCTB4OTAyNgotCi0vKiBEMTBWIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfRDEwVgkweDc2NTAKLQotLyogRDMwViBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0QzMFYJMHg3Njc2Ci0KLS8qIFY4NTAgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbnNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19WODUwCTB4OTA4MAotCi0vKiBtbjEwMjAwIGFuZCBtbjEwMzAwIGJhY2tlbmQgbWFnaWMgbnVtYmVycy4KLSAgIFdyaXR0ZW4gaW4gdGhlIGFic2Vuc2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX01OMTAyMDAJMHhkZWFkCi0jZGVmaW5lIEVNX0NZR05VU19NTjEwMzAwCTB4YmVlZgotCi0vKiBGUjMwIG1hZ2ljIG51bWJlciAtIG5vIEVBQkkgYXZhaWxhYmxlLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0ZSMzAJCTB4MzMzMAotCi0vKiBTZWUgdGhlIGFib3ZlIGNvbW1lbnQgYmVmb3JlIHlvdSBhZGQgYSBuZXcgRU1fKiB2YWx1ZSBoZXJlLiAgKi8KLQotLyogVmFsdWVzIGZvciBlX3ZlcnNpb24gKi8KLQotI2RlZmluZSBFVl9OT05FCQkwCQkvKiBJbnZhbGlkIEVMRiB2ZXJzaW9uICovCi0jZGVmaW5lIEVWX0NVUlJFTlQJMQkJLyogQ3VycmVudCB2ZXJzaW9uICovCi0KLS8qIFZhbHVlcyBmb3IgcHJvZ3JhbSBoZWFkZXIsIHBfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lCVBUX05VTEwJCTAJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLwotI2RlZmluZSBQVF9MT0FECQkxCQkvKiBMb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgKi8KLSNkZWZpbmUgUFRfRFlOQU1JQwkyCQkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgUFRfSU5URVJQCTMJCS8qIFByb2dyYW0gaW50ZXJwcmV0ZXIgKi8KLSNkZWZpbmUgUFRfTk9URQkJNAkJLyogQXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFBUX1NITElCCTUJCS8qIFJlc2VydmVkLCB1bnNwZWNpZmllZCBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgUFRfUEhEUgkJNgkJLyogRW50cnkgZm9yIGhlYWRlciB0YWJsZSBpdHNlbGYgKi8KLSNkZWZpbmUgUFRfTE9PUyAgICAgICAgIDB4NjAwMDAwMDAJLyogT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfSElPUyAgICAgICAgIDB4NmZmZmZmZmYJLyogT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIFBUX0hJUFJPQwkweDdGRkZGRkZGCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyAqLwotCi0vKiBQcm9ncmFtIHNlZ21lbnQgcGVybWlzc2lvbnMsIGluIHByb2dyYW0gaGVhZGVyIHBfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBQRl9YCQkoMSA8PCAwKQkvKiBTZWdtZW50IGlzIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgUEZfVwkJKDEgPDwgMSkJLyogU2VnbWVudCBpcyB3cml0YWJsZSAqLwotI2RlZmluZSBQRl9SCQkoMSA8PCAyKQkvKiBTZWdtZW50IGlzIHJlYWRhYmxlICovCi0jZGVmaW5lIFBGX01BU0tPUwkweDBGMDAwMDAwCS8qIE9TLXNwZWNpZmljIHJlc2VydmVkIGJpdHMgKi8KLSNkZWZpbmUgUEZfTUFTS1BST0MJMHhGMDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgcmVzZXJ2ZWQgYml0cyAqLwotCi0vKiBWYWx1ZXMgZm9yIHNlY3Rpb24gaGVhZGVyLCBzaF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUgU0hUX05VTEwJMAkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgdW51c2VkICovCi0jZGVmaW5lIFNIVF9QUk9HQklUUwkxCQkvKiBQcm9ncmFtIHNwZWNpZmljIChwcml2YXRlKSBkYXRhICovCi0jZGVmaW5lIFNIVF9TWU1UQUIJMgkJLyogTGluayBlZGl0aW5nIHN5bWJvbCB0YWJsZSAqLwotI2RlZmluZSBTSFRfU1RSVEFCCTMJCS8qIEEgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNIVF9SRUxBCTQJCS8qIFJlbG9jYXRpb24gZW50cmllcyB3aXRoIGFkZGVuZHMgKi8KLSNkZWZpbmUgU0hUX0hBU0gJNQkJLyogQSBzeW1ib2wgaGFzaCB0YWJsZSAqLwotI2RlZmluZSBTSFRfRFlOQU1JQwk2CQkvKiBJbmZvcm1hdGlvbiBmb3IgZHluYW1pYyBsaW5raW5nICovCi0jZGVmaW5lIFNIVF9OT1RFCTcJCS8qIEluZm9ybWF0aW9uIHRoYXQgbWFya3MgZmlsZSAqLwotI2RlZmluZSBTSFRfTk9CSVRTCTgJCS8qIFNlY3Rpb24gb2NjdXBpZXMgbm8gc3BhY2UgaW4gZmlsZSAqLwotI2RlZmluZSBTSFRfUkVMCQk5CQkvKiBSZWxvY2F0aW9uIGVudHJpZXMsIG5vIGFkZGVuZHMgKi8KLSNkZWZpbmUgU0hUX1NITElCCTEwCQkvKiBSZXNlcnZlZCwgdW5zcGVjaWZpZWQgc2VtYW50aWNzICovCi0jZGVmaW5lIFNIVF9EWU5TWU0JMTEJCS8qIER5bmFtaWMgbGlua2luZyBzeW1ib2wgdGFibGUgKi8KLQotI2RlZmluZSBTSFRfTE9PUyAgICAgICAgMHg2MDAwMDAwMCAgICAgIC8qIE9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWMgc2VtYW50aWNzLCBsbyAqLwotI2RlZmluZSBTSFRfSElPUyAgICAgICAgMHg2ZmZmZmZmZiAgICAgIC8qIE9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWMgc2VtYW50aWNzLCBoaSAqLwotCi0vKiBUaGUgbmV4dCB0aHJlZSBzZWN0aW9uIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IFNvbGFyaXMsIGFuZCBhcmUgbmFtZWQKLSAgIFNIVF9TVU5XKi4gIFdlIHVzZSB0aGVtIGluIEdOVSBjb2RlLCBzbyB3ZSBhbHNvIGRlZmluZSBTSFRfR05VKgotICAgdmVyc2lvbnMuICAqLwotI2RlZmluZSBTSFRfU1VOV192ZXJkZWYJMHg2ZmZmZmZmZAkvKiBWZXJzaW9ucyBkZWZpbmVkIGJ5IGZpbGUgKi8KLSNkZWZpbmUgU0hUX1NVTldfdmVybmVlZCAweDZmZmZmZmZlCS8qIFZlcnNpb25zIG5lZWRlZCBieSBmaWxlICovCi0jZGVmaW5lIFNIVF9TVU5XX3ZlcnN5bQkweDZmZmZmZmZmCS8qIFN5bWJvbCB2ZXJzaW9ucyAqLwotCi0jZGVmaW5lIFNIVF9HTlVfdmVyZGVmCVNIVF9TVU5XX3ZlcmRlZgotI2RlZmluZSBTSFRfR05VX3Zlcm5lZWQJU0hUX1NVTldfdmVybmVlZAotI2RlZmluZSBTSFRfR05VX3ZlcnN5bQlTSFRfU1VOV192ZXJzeW0KLQotI2RlZmluZSBTSFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcywgbG8gKi8KLSNkZWZpbmUgU0hUX0hJUFJPQwkweDdGRkZGRkZGCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBzZW1hbnRpY3MsIGhpICovCi0jZGVmaW5lIFNIVF9MT1VTRVIJMHg4MDAwMDAwMAkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU0hUX0hJVVNFUgkweDhGRkZGRkZGCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0vKiBWYWx1ZXMgZm9yIHNlY3Rpb24gaGVhZGVyLCBzaF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFNIRl9XUklURQkoMSA8PCAwKQkvKiBXcml0YWJsZSBkYXRhIGR1cmluZyBleGVjdXRpb24gKi8KLSNkZWZpbmUgU0hGX0FMTE9DCSgxIDw8IDEpCS8qIE9jY3VwaWVzIG1lbW9yeSBkdXJpbmcgZXhlY3V0aW9uICovCi0jZGVmaW5lIFNIRl9FWEVDSU5TVFIJKDEgPDwgMikJLyogRXhlY3V0YWJsZSBtYWNoaW5lIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTSEZfTUFTS09TCTB4MEYwMDAwMDAJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNIRl9NQVNLUFJPQwkweEYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogVmFsdWVzIG9mIG5vdGUgc2VnbWVudCBkZXNjcmlwdG9yIHR5cGVzIGZvciBjb3JlIGZpbGVzLiAqLwotCi0jZGVmaW5lIE5UX1BSU1RBVFVTCTEJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJzdGF0dXMgc3RydWN0ICovCi0jZGVmaW5lIE5UX0ZQUkVHU0VUCTIJCS8qIENvbnRhaW5zIGNvcHkgb2YgZnByZWdzZXQgc3RydWN0ICovCi0jZGVmaW5lIE5UX1BSUFNJTkZPCTMJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJwc2luZm8gc3RydWN0ICovCi0jZGVmaW5lIE5UX1RBU0tTVFJVQ1QJNAkJLyogQ29udGFpbnMgY29weSBvZiB0YXNrIHN0cnVjdCAqLwotCi0vKiBOb3RlIHNlZ21lbnRzIGZvciBjb3JlIGZpbGVzIG9uIGRpci1zdHlsZSBwcm9jZnMgc3lzdGVtcy4gKi8KLQotI2RlZmluZSBOVF9QU1RBVFVTCTEwCQkvKiBIYXMgYSBzdHJ1Y3QgcHN0YXR1cyAqLwotI2RlZmluZSBOVF9GUFJFR1MJMTIJCS8qIEhhcyBhIHN0cnVjdCBmcHJlZ3NldCAqLwotI2RlZmluZSBOVF9QU0lORk8JMTMJCS8qIEhhcyBhIHN0cnVjdCBwc2luZm8gKi8KLSNkZWZpbmUgTlRfTFdQU1RBVFVTCTE2CQkvKiBIYXMgYSBzdHJ1Y3QgbHdwc3RhdHVzX3QgKi8KLSNkZWZpbmUgTlRfTFdQU0lORk8JMTcJCS8qIEhhcyBhIHN0cnVjdCBsd3BzaW5mb190ICovCi0KLS8qIFZhbHVlcyBvZiBub3RlIHNlZ21lbnQgZGVzY3JpcHRvciB0eXBlcyBmb3Igb2JqZWN0IGZpbGVzLiAgKi8KLS8qIChPbmx5IGZvciBocHBhIHJpZ2h0IG5vdy4gIFNob3VsZCB0aGlzIGJlIG1vdmVkIGVsc2V3aGVyZT8pICAqLwotCi0jZGVmaW5lIE5UX1ZFUlNJT04JMQkJLyogQ29udGFpbnMgYSB2ZXJzaW9uIHN0cmluZy4gICovCi0KLS8qIFRoZXNlIHRocmVlIG1hY3JvcyBkaXNhc3NlbWJsZSBhbmQgYXNzZW1ibGUgYSBzeW1ib2wgdGFibGUgc3RfaW5mbyBmaWVsZCwKLSAgIHdoaWNoIGNvbnRhaW5zIHRoZSBzeW1ib2wgYmluZGluZyBhbmQgc3ltYm9sIHR5cGUuICBUaGUgU1RCXyBhbmQgU1RUXwotICAgZGVmaW5lcyBpZGVudGlmeSB0aGUgYmluZGluZyBhbmQgdHlwZS4gKi8KLQotI2RlZmluZSBFTEZfU1RfQklORCh2YWwpCQkoKCh1bnNpZ25lZCBpbnQpKHZhbCkpID4+IDQpCi0jZGVmaW5lIEVMRl9TVF9UWVBFKHZhbCkJCSgodmFsKSAmIDB4RikKLSNkZWZpbmUgRUxGX1NUX0lORk8oYmluZCx0eXBlKQkJKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhGKSkKLQotI2RlZmluZSBTVE5fVU5ERUYJMAkJLyogdW5kZWZpbmVkIHN5bWJvbCBpbmRleCAqLwotCi0jZGVmaW5lIFNUQl9MT0NBTAkwCQkvKiBTeW1ib2wgbm90IHZpc2libGUgb3V0c2lkZSBvYmogKi8KLSNkZWZpbmUgU1RCX0dMT0JBTAkxCQkvKiBTeW1ib2wgdmlzaWJsZSBvdXRzaWRlIG9iaiAqLwotI2RlZmluZSBTVEJfV0VBSwkyCQkvKiBMaWtlIGdsb2JhbHMsIGxvd2VyIHByZWNlZGVuY2UgKi8KLSNkZWZpbmUgU1RCX0xPT1MgICAgICAgIDEwCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RCX0hJT1MgICAgICAgIDEyCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RCX0xPUFJPQwkxMwkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUQl9ISVBST0MJMTUJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0jZGVmaW5lIFNUVF9OT1RZUEUJMAkJLyogU3ltYm9sIHR5cGUgaXMgdW5zcGVjaWZpZWQgKi8KLSNkZWZpbmUgU1RUX09CSkVDVAkxCQkvKiBTeW1ib2wgaXMgYSBkYXRhIG9iamVjdCAqLwotI2RlZmluZSBTVFRfRlVOQwkyCQkvKiBTeW1ib2wgaXMgYSBjb2RlIG9iamVjdCAqLwotI2RlZmluZSBTVFRfU0VDVElPTgkzCQkvKiBTeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbiAqLwotI2RlZmluZSBTVFRfRklMRQk0CQkvKiBTeW1ib2wgZ2l2ZXMgYSBmaWxlIG5hbWUgKi8KLSNkZWZpbmUgU1RUX0xPT1MgICAgICAgIDEwCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RUX0hJT1MgICAgICAgIDEyCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RUX0xPUFJPQwkxMwkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9ISVBST0MJMTUJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0vKiBTcGVjaWFsIHNlY3Rpb24gaW5kaWNlcywgd2hpY2ggbWF5IHNob3cgdXAgaW4gc3Rfc2huZHggZmllbGRzLCBhbW9uZwotICAgb3RoZXIgcGxhY2VzLiAqLwotCi0jZGVmaW5lIFNITl9VTkRFRgkwCQkvKiBVbmRlZmluZWQgc2VjdGlvbiByZWZlcmVuY2UgKi8KLSNkZWZpbmUgU0hOX0xPUkVTRVJWRQkweEZGMDAJCS8qIEJlZ2luIHJhbmdlIG9mIHJlc2VydmVkIGluZGljZXMgKi8KLSNkZWZpbmUgU0hOX0xPUFJPQwkweEZGMDAJCS8qIEJlZ2luIHJhbmdlIG9mIGFwcGwtc3BlY2lmaWMgKi8KLSNkZWZpbmUgU0hOX0hJUFJPQwkweEZGMUYJCS8qIEVuZCByYW5nZSBvZiBhcHBsLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9MT09TICAgICAgICAweEZGMjAJCS8qIE9TIHNwZWNpZmljIHNlbWFudGljcywgbG8gKi8KLSNkZWZpbmUgU0hOX0hJT1MgICAgICAgIDB4RkYzRgkJLyogT1Mgc3BlY2lmaWMgc2VtYW50aWNzLCBoaSAqLwotI2RlZmluZSBTSE5fQUJTCQkweEZGRjEJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIGlzIGFic29sdXRlICovCi0jZGVmaW5lIFNITl9DT01NT04JMHhGRkYyCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBpbiBjb21tb24gKi8KLSNkZWZpbmUgU0hOX0hJUkVTRVJWRQkweEZGRkYJCS8qIEVuZCByYW5nZSBvZiByZXNlcnZlZCBpbmRpY2VzICovCi0KLS8qIHJlbG9jYXRpb24gaW5mbyBoYW5kbGluZyBtYWNyb3MgKi8KLQotI2RlZmluZSBFTEYzMl9SX1NZTShpKQkJKChpKSA+PiA4KQotI2RlZmluZSBFTEYzMl9SX1RZUEUoaSkJCSgoaSkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9SX0lORk8ocyx0KQkoKChzKSA8PCA4KSArICgodCkgJiAweGZmKSkKLQotI2RlZmluZSBFTEY2NF9SX1NZTShpKQkJKChpKSA+PiAzMikKLSNkZWZpbmUgRUxGNjRfUl9UWVBFKGkpCQkoKGkpICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgRUxGNjRfUl9JTkZPKHMsdCkJKCgoYmZkX3ZtYSkgKHMpIDw8IDMyKSArIChiZmRfdm1hKSAodCkpCi0KLS8qIER5bmFtaWMgc2VjdGlvbiB0YWdzICovCi0KLSNkZWZpbmUgRFRfTlVMTAkJMAotI2RlZmluZSBEVF9ORUVERUQJMQotI2RlZmluZSBEVF9QTFRSRUxTWgkyCi0jZGVmaW5lIERUX1BMVEdPVAkzCi0jZGVmaW5lIERUX0hBU0gJCTQKLSNkZWZpbmUgRFRfU1RSVEFCCTUKLSNkZWZpbmUgRFRfU1lNVEFCCTYKLSNkZWZpbmUgRFRfUkVMQQkJNwotI2RlZmluZSBEVF9SRUxBU1oJOAotI2RlZmluZSBEVF9SRUxBRU5UCTkKLSNkZWZpbmUgRFRfU1RSU1oJMTAKLSNkZWZpbmUgRFRfU1lNRU5UCTExCi0jZGVmaW5lIERUX0lOSVQJCTEyCi0jZGVmaW5lIERUX0ZJTkkJCTEzCi0jZGVmaW5lIERUX1NPTkFNRQkxNAotI2RlZmluZSBEVF9SUEFUSAkxNQotI2RlZmluZSBEVF9TWU1CT0xJQwkxNgotI2RlZmluZSBEVF9SRUwJCTE3Ci0jZGVmaW5lIERUX1JFTFNaCTE4Ci0jZGVmaW5lIERUX1JFTEVOVAkxOQotI2RlZmluZSBEVF9QTFRSRUwJMjAKLSNkZWZpbmUgRFRfREVCVUcJMjEKLSNkZWZpbmUgRFRfVEVYVFJFTAkyMgotI2RlZmluZSBEVF9KTVBSRUwJMjMKLSNkZWZpbmUgRFRfQklORF9OT1cgICAgIDI0Ci0jZGVmaW5lIERUX0lOSVRfQVJSQVkgICAyNQotI2RlZmluZSBEVF9GSU5JX0FSUkFZICAgMjYKLSNkZWZpbmUgRFRfSU5JVF9BUlJBWVNaIDI3Ci0jZGVmaW5lIERUX0ZJTklfQVJSQVlTWiAyOAotCi0jZGVmaW5lIERUX0xPT1MgICAgICAgICAweDYwMDAwMDAwCi0jZGVmaW5lIERUX0hJT1MgICAgICAgICAweDZmZmZmZmZmCi0KLS8qIFRoZSBuZXh0IGZvdXIgZHluYW1pYyB0YWdzIGFyZSB1c2VkIG9uIFNvbGFyaXMuICBXZSBzdXBwb3J0IHRoZW0KLSAgIGV2ZXJ5d2hlcmUuICAqLwotI2RlZmluZSBEVF9WQUxSTkdMTwkweDZmZmZmZDAwCi0jZGVmaW5lIERUX1BMVFBBRFNaCTB4NmZmZmZkZjkKLSNkZWZpbmUgRFRfTU9WRUVOVAkweDZmZmZmZGZhCi0jZGVmaW5lIERUX01PVkVTWgkweDZmZmZmZGZiCi0jZGVmaW5lIERUX0ZFQVRVUkVfMQkweDZmZmZmZGZjCi0jZGVmaW5lIERUX1BPU0ZMQUdfMQkweDZmZmZmZGZkCi0jZGVmaW5lIERUX1NZTUlOU1oJMHg2ZmZmZmRmZQotI2RlZmluZSBEVF9TWU1JTkVOVAkweDZmZmZmZGZmCi0jZGVmaW5lIERUX1ZBTFJOR0hJCTB4NmZmZmZkZmYKLQotI2RlZmluZSBEVF9BRERSUk5HTE8JMHg2ZmZmZmUwMAotI2RlZmluZSBEVF9TWU1JTkZPCTB4NmZmZmZlZmYKLSNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKLQotI2RlZmluZSBEVF9SRUxBQ09VTlQJMHg2ZmZmZmZmOQotI2RlZmluZSBEVF9SRUxDT1VOVAkweDZmZmZmZmZhCi0jZGVmaW5lIERUX0ZMQUdTXzEJMHg2ZmZmZmZmYgotI2RlZmluZSBEVF9WRVJERUYJMHg2ZmZmZmZmYwotI2RlZmluZSBEVF9WRVJERUZOVU0JMHg2ZmZmZmZmZAotI2RlZmluZSBEVF9WRVJORUVECTB4NmZmZmZmZmUKLSNkZWZpbmUgRFRfVkVSTkVFRE5VTQkweDZmZmZmZmZmCi0KLS8qIFRoaXMgdGFnIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU29sYXJpcyB2ZXJzaW9uIHNjaGVtZS4gICovCi0jZGVmaW5lIERUX1ZFUlNZTQkweDZmZmZmZmYwCi0KLSNkZWZpbmUgRFRfTE9QUk9DCTB4NzAwMDAwMDAKLSNkZWZpbmUgRFRfSElQUk9DCTB4N2ZmZmZmZmYKLQotLyogVGhlc2Ugc2VjdGlvbiB0YWdzIGFyZSB1c2VkIG9uIFNvbGFyaXMuICBXZSBzdXBwb3J0IHRoZW0KLSAgIGV2ZXJ5d2hlcmUsIGFuZCBob3BlIHRoZXkgZG8gbm90IGNvbmZsaWN0LiAgKi8KLQotI2RlZmluZSBEVF9BVVhJTElBUlkJMHg3ZmZmZmZmZAotI2RlZmluZSBEVF9VU0VECQkweDdmZmZmZmZlCi0jZGVmaW5lIERUX0ZJTFRFUgkweDdmZmZmZmZmCi0KLS8qIFZhbHVlcyB1c2VkIGluIERUX0ZFQVRVUkVfMSAuZHluYW1pYyBlbnRyeS4gICovCi0jZGVmaW5lIERURl8xX1BBUklOSVQJMHgwMDAwMDAwMQotCi0vKiBGbGFnIHZhbHVlcyB1c2VkIGluIHRoZSBEVF9QT1NGTEFHXzEgLmR5bmFtaWMgZW50cnkuICAqLwotI2RlZmluZSBERl9QMV9MQVpZTE9BRAkweDAwMDAwMDAxCi0jZGVmaW5lIERGX1AxX0dST1VQUEVSTQkweDAwMDAwMDAyCi0KLS8qIEZsYWcgdmFsdWUgaW4gaW4gdGhlIERUXzFfRkxBR1MgLmR5bmFtaWMgZW50cnkuICAqLwotI2RlZmluZSBERl8xX05PVwkweDAwMDAwMDAxCi0jZGVmaW5lIERGXzFfR0xPQkFMCTB4MDAwMDAwMDIKLSNkZWZpbmUgREZfMV9HUk9VUAkweDAwMDAwMDA0Ci0jZGVmaW5lIERGXzFfTk9ERUxFVEUJMHgwMDAwMDAwOAotI2RlZmluZSBERl8xX0xPQURGTFRSCTB4MDAwMDAwMTAKLSNkZWZpbmUgREZfMV9JTklURklSU1QJMHgwMDAwMDAyMAotI2RlZmluZSBERl8xX05PT1BFTgkweDAwMDAwMDQwCi0jZGVmaW5lIERGXzFfT1JJR0lOCTB4MDAwMDAwODAKLSNkZWZpbmUgREZfMV9ESVJFQ1QJMHgwMDAwMDEwMAotI2RlZmluZSBERl8xX1RSQU5TCTB4MDAwMDAyMDAKLSNkZWZpbmUgREZfMV9JTlRFUlBPU0UJMHgwMDAwMDQwMAotCi0vKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhIEVsZjMyX1ZlcmRlZgotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfREVGX05PTkUJCTAKLSNkZWZpbmUgVkVSX0RFRl9DVVJSRU5UCQkxCi0KLS8qIFRoZXNlIGNvbnN0YW50cyBhcHBlYXIgaW4gdGhlIHZkX2ZsYWdzIGZpZWxkIG9mIGEgRWxmMzJfVmVyZGVmCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9GTEdfQkFTRQkJMHgxCi0jZGVmaW5lIFZFUl9GTEdfV0VBSwkJMHgyCi0KLS8qIFRoZXNlIHNwZWNpYWwgY29uc3RhbnRzIGNhbiBiZSBmb3VuZCBpbiBhbiBFbGYzMl9WZXJzeW0gZmllbGQuICAqLwotCi0jZGVmaW5lIFZFUl9ORFhfTE9DQUwJCTAKLSNkZWZpbmUgVkVSX05EWF9HTE9CQUwJCTEKLQotLyogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBFbGYzMl9WZXJuZWVkCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9ORUVEX05PTkUJCTAKLSNkZWZpbmUgVkVSX05FRURfQ1VSUkVOVAkxCi0KLS8qIFRoaXMgZmxhZyBhcHBlYXJzIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gIEl0IG1lYW5zIHRoYXQgdGhlIHN5bWJvbAotICAgaXMgaGlkZGVuLCBhbmQgaXMgb25seSB2aXNpYmxlIHdpdGggYW4gZXhwbGljaXQgdmVyc2lvbiBudW1iZXIuCi0gICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0KLSNkZWZpbmUgVkVSU1lNX0hJRERFTgkJMHg4MDAwCi0KLS8qIFRoaXMgaXMgdGhlIG1hc2sgZm9yIHRoZSByZXN0IG9mIHRoZSBWZXJzeW0gaW5mb3JtYXRpb24uICAqLwotCi0jZGVmaW5lIFZFUlNZTV9WRVJTSU9OCQkweDdmZmYKLQotLyogVGhpcyBpcyBhIHNwZWNpYWwgdG9rZW4gd2hpY2ggYXBwZWFycyBhcyBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuICBJdAotICAgaW5kaWN0ZXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBhY3R1YWxseSB0aGUgbmFtZSBvZiBhCi0gICB2ZXJzaW9uIG5vZGUsIGFuZCBpcyBub3QgcGFydCBvZiB0aGUgYWN0dWFsIG5hbWUuICBUaGlzIGlzIGEgR05VCi0gICBleHRlbnNpb24uICBGb3IgZXhhbXBsZSwgdGhlIHN5bWJvbCBuYW1lIGBzdGF0QHZlcjInIGlzIHRha2VuIHRvCi0gICBtZWFuIHRoZSBzeW1ib2wgYHN0YXQnIGluIHZlcnNpb24gYHZlcjInLiAgKi8KLQotI2RlZmluZSBFTEZfVkVSX0NIUgknQCcKLQotLyogUG9zc2libGUgdmFsdWVzIGZvciBzaV9ib3VuZHRvLiAgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9TRUxGCQkweGZmZmYJLyogU3ltYm9sIGJvdW5kIHRvIHNlbGYgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9QQVJFTlQJMHhmZmZlCS8qIFN5bWJvbCBib3VuZCB0byBwYXJlbnQgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9MT1dSRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcyAqLwotCi0vKiBQb3NzaWJsZSBiaXRtYXNrcyBmb3Igc2lfZmxhZ3MuICAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19ESVJFQ1QJMHgwMDAxCS8qIERpcmVjdCBib3VuZCBzeW1ib2wgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfUEFTU1RIUlUJMHgwMDAyCS8qIFBhc3MtdGhydSBzeW1ib2wgZm9yIHRyYW5zbGF0b3IgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfQ09QWQkweDAwMDQJLyogU3ltYm9sIGlzIGEgY29weS1yZWxvYyAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19MQVpZTE9BRAkweDAwMDgJLyogU3ltYm9sIGJvdW5kIHRvIG9iamVjdCB0byBiZSBsYXp5Ci0JCQkJCSAgIGxvYWRlZCAqLwotLyogU3ltaW5mbyB2ZXJzaW9uIHZhbHVlcy4gICovCi0jZGVmaW5lIFNZTUlORk9fTk9ORQkJMAotI2RlZmluZSBTWU1JTkZPX0NVUlJFTlQJCTEKLSNkZWZpbmUgU1lNSU5GT19OVU0JCTIKLQotI2VuZGlmIC8qIF9FTEZfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2QxMHYuaCBiL2luY2x1ZGUvZWxmL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiNzljOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBkMTB2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0QxMFZfSAotI2RlZmluZSBfRUxGX0QxMFZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMTB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX1IsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX0wsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzE2LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xOCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfMThfUENSRUwsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRFTlRSWSwgOCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZDMwdi5oIGIvaW5jbHVkZS9lbGYvZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGJhZDE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2QzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGQzMHYgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRDMwVl9ICi0jZGVmaW5lIF9FTEZfRDMwVl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMzB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUwsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUxfUiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMTUsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzE1X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8xNV9QQ1JFTF9SLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8yMSwgNykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMjFfUENSRUwsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzIxX1BDUkVMX1IsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzMyLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMzJfUENSRUwsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8zMl9OT1JNQUwsIDEyKQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kd2FyZi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3MmNkNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kd2FyZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2YgY29kZXMgcmVsYXRpbmcgdG8gdGhlIERXQVJGIHN5bWJvbGljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotCi0gICBXcml0dGVuIGJ5IFJvbiBHdWlsbWV0dGUgKHJmZ0BuY2QuY29tKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uIChhIHB1YmxpYyBkb2N1bWVudCkKLSAgIFJldmlzaW9uIDEuMC4xIChBcHJpbCA4LCAxOTkyKSBkZXZlbG9wZWQgYnkgdGhlIFVOSVggSW50ZXJuYXRpb25hbAotICAgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIFNwZWNpYWwgSW50ZXJlc3QgR3JvdXAgKFVJL1BMU0lHKSBhbmQgZGlzdHJpYnV0ZWQKLSAgIGJ5IFVOSVggSW50ZXJuYXRpb25hbC4gIENvcGllcyBvZiB0aGlzIHNwZWNpZmljYXRpb24gYXJlIGF2YWlsYWJsZSBmcm9tCi0gICBVTklYIEludGVybmF0aW9uYWwsIDIwIFdhdGVydmlldyBCb3VsZXZhcmQsIFBhcnNpcHBhbnksIE5KLCAwNzA1NC4KLSovCi0KLSNpZm5kZWYgX0VMRl9EV0FSRl9ICi0jZGVmaW5lIF9FTEZfRFdBUkZfSAotCi0vKiBUYWcgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90YWcgewotICAgIFRBR19wYWRkaW5nCQkJPSAweDAwMDAsCi0gICAgVEFHX2FycmF5X3R5cGUJCT0gMHgwMDAxLAotICAgIFRBR19jbGFzc190eXBlCQk9IDB4MDAwMiwKLSAgICBUQUdfZW50cnlfcG9pbnQJCT0gMHgwMDAzLAotICAgIFRBR19lbnVtZXJhdGlvbl90eXBlCT0gMHgwMDA0LAotICAgIFRBR19mb3JtYWxfcGFyYW1ldGVyCT0gMHgwMDA1LAotICAgIFRBR19nbG9iYWxfc3Vicm91dGluZQk9IDB4MDAwNiwKLSAgICBUQUdfZ2xvYmFsX3ZhcmlhYmxlCQk9IDB4MDAwNywKLSAgICAJCQkJLyogMHgwMDA4IC0tIHJlc2VydmVkICovCi0JCQkJLyogMHgwMDA5IC0tIHJlc2VydmVkICovCi0gICAgVEFHX2xhYmVsCQkJPSAweDAwMGEsCi0gICAgVEFHX2xleGljYWxfYmxvY2sJCT0gMHgwMDBiLAotICAgIFRBR19sb2NhbF92YXJpYWJsZQkJPSAweDAwMGMsCi0gICAgVEFHX21lbWJlcgkJCT0gMHgwMDBkLAotCQkJCS8qIDB4MDAwZSAtLSByZXNlcnZlZCAqLwotICAgIFRBR19wb2ludGVyX3R5cGUJCT0gMHgwMDBmLAotICAgIFRBR19yZWZlcmVuY2VfdHlwZQkJPSAweDAwMTAsCi0gICAgVEFHX2NvbXBpbGVfdW5pdAkJPSAweDAwMTEsCi0gICAgVEFHX3N0cmluZ190eXBlCQk9IDB4MDAxMiwKLSAgICBUQUdfc3RydWN0dXJlX3R5cGUJCT0gMHgwMDEzLAotICAgIFRBR19zdWJyb3V0aW5lCQk9IDB4MDAxNCwKLSAgICBUQUdfc3Vicm91dGluZV90eXBlCQk9IDB4MDAxNSwKLSAgICBUQUdfdHlwZWRlZgkJCT0gMHgwMDE2LAotICAgIFRBR191bmlvbl90eXBlCQk9IDB4MDAxNywKLSAgICBUQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycwk9IDB4MDAxOCwKLSAgICBUQUdfdmFyaWFudAkJCT0gMHgwMDE5LAotICAgIFRBR19jb21tb25fYmxvY2sJCT0gMHgwMDFhLAotICAgIFRBR19jb21tb25faW5jbHVzaW9uCT0gMHgwMDFiLAotICAgIFRBR19pbmhlcml0YW5jZQkJPSAweDAwMWMsCi0gICAgVEFHX2lubGluZWRfc3Vicm91dGluZQk9IDB4MDAxZCwKLSAgICBUQUdfbW9kdWxlCQkJPSAweDAwMWUsCi0gICAgVEFHX3B0cl90b19tZW1iZXJfdHlwZQk9IDB4MDAxZiwKLSAgICBUQUdfc2V0X3R5cGUJCT0gMHgwMDIwLAotICAgIFRBR19zdWJyYW5nZV90eXBlCQk9IDB4MDAyMSwKLSAgICBUQUdfd2l0aF9zdG10CQk9IDB4MDAyMiwKLQotICAgIC8qIEdOVSBleHRlbnNpb25zICovCi0KLSAgICBUQUdfZm9ybWF0X2xhYmVsCQk9IDB4ODAwMCwgIC8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgVEFHX25hbWVsaXN0CQk9IDB4ODAwMSwgIC8qIEZvciBGb3J0cmFuIDkwICovCi0gICAgVEFHX2Z1bmN0aW9uX3RlbXBsYXRlCT0gMHg4MDAyLCAgLyogZm9yIEMrKyAqLwotICAgIFRBR19jbGFzc190ZW1wbGF0ZQkJPSAweDgwMDMgICAvKiBmb3IgQysrICovCi19OwotCi0jZGVmaW5lIFRBR19sb191c2VyCTB4ODAwMCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBUQUdfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0jZGVmaW5lIFRBR19zb3VyY2VfZmlsZSBUQUdfY29tcGlsZV91bml0ICAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCi0vKiBGb3JtIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZm9ybSB7Ci0gICAgRk9STV9BRERSCT0gMHgxLAotICAgIEZPUk1fUkVGCT0gMHgyLAotICAgIEZPUk1fQkxPQ0syCT0gMHgzLAotICAgIEZPUk1fQkxPQ0s0CT0gMHg0LAotICAgIEZPUk1fREFUQTIJPSAweDUsCi0gICAgRk9STV9EQVRBNAk9IDB4NiwKLSAgICBGT1JNX0RBVEE4CT0gMHg3LAotICAgIEZPUk1fU1RSSU5HCT0gMHg4Ci19OwotCi0vKiBBdHRyaWJ1dGUgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9hdHRyaWJ1dGUgewotICAgIEFUX3NpYmxpbmcJCQk9ICgweDAwMTB8Rk9STV9SRUYpLAotICAgIEFUX2xvY2F0aW9uCQkJPSAoMHgwMDIwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9uYW1lCQkJPSAoMHgwMDMwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9mdW5kX3R5cGUJCT0gKDB4MDA1MHxGT1JNX0RBVEEyKSwKLSAgICBBVF9tb2RfZnVuZF90eXBlCQk9ICgweDAwNjB8Rk9STV9CTE9DSzIpLAotICAgIEFUX3VzZXJfZGVmX3R5cGUJCT0gKDB4MDA3MHxGT1JNX1JFRiksCi0gICAgQVRfbW9kX3VfZF90eXBlCQk9ICgweDAwODB8Rk9STV9CTE9DSzIpLAotICAgIEFUX29yZGVyaW5nCQkJPSAoMHgwMDkwfEZPUk1fREFUQTIpLAotICAgIEFUX3N1YnNjcl9kYXRhCQk9ICgweDAwYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2J5dGVfc2l6ZQkJPSAoMHgwMGIwfEZPUk1fREFUQTQpLAotICAgIEFUX2JpdF9vZmZzZXQJCT0gKDB4MDBjMHxGT1JNX0RBVEEyKSwKLSAgICBBVF9iaXRfc2l6ZQkJCT0gKDB4MDBkMHxGT1JNX0RBVEE0KSwKLQkJCQkvKiAoMHgwMGUwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLSAgICBBVF9lbGVtZW50X2xpc3QJCT0gKDB4MDBmMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfc3RtdF9saXN0CQk9ICgweDAxMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfbG93X3BjCQkJPSAoMHgwMTEwfEZPUk1fQUREUiksCi0gICAgQVRfaGlnaF9wYwkJCT0gKDB4MDEyMHxGT1JNX0FERFIpLAotICAgIEFUX2xhbmd1YWdlCQkJPSAoMHgwMTMwfEZPUk1fREFUQTQpLAotICAgIEFUX21lbWJlcgkJCT0gKDB4MDE0MHxGT1JNX1JFRiksCi0gICAgQVRfZGlzY3IJCQk9ICgweDAxNTB8Rk9STV9SRUYpLAotICAgIEFUX2Rpc2NyX3ZhbHVlCQk9ICgweDAxNjB8Rk9STV9CTE9DSzIpLAotCQkJCS8qICgweDAxNzB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotCQkJCS8qICgweDAxODB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotICAgIEFUX3N0cmluZ19sZW5ndGgJCT0gKDB4MDE5MHxGT1JNX0JMT0NLMiksCi0gICAgQVRfY29tbW9uX3JlZmVyZW5jZQkJPSAoMHgwMWEwfEZPUk1fUkVGKSwKLSAgICBBVF9jb21wX2RpcgkJCT0gKDB4MDFiMHxGT1JNX1NUUklORyksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX3N0cmluZwk9ICgweDAxYzB8Rk9STV9TVFJJTkcpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9kYXRhMgk9ICgweDAxYzB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2RhdGE0CT0gKDB4MDFjMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfZGF0YTgJPSAoMHgwMWMwfEZPUk1fREFUQTgpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9ibG9jazIJPSAoMHgwMWMwfEZPUk1fQkxPQ0syKSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfYmxvY2s0CT0gKDB4MDFjMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfY29udGFpbmluZ190eXBlCQk9ICgweDAxZDB8Rk9STV9SRUYpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2FkZHIJPSAoMHgwMWUwfEZPUk1fQUREUiksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfZGF0YTIJPSAoMHgwMWUwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2RhdGE0CT0gKDB4MDFlMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9kYXRhOAk9ICgweDAxZTB8Rk9STV9EQVRBOCksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfc3RyaW5nCT0gKDB4MDFlMHxGT1JNX1NUUklORyksCi0gICAgQVRfZnJpZW5kcwkJCT0gKDB4MDFmMHxGT1JNX0JMT0NLMiksCi0gICAgQVRfaW5saW5lCQkJPSAoMHgwMjAwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9pc19vcHRpb25hbAkJPSAoMHgwMjEwfEZPUk1fU1RSSU5HKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfcmVmCT0gKDB4MDIyMHxGT1JNX1JFRiksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX2RhdGEyCT0gKDB4MDIyMHxGT1JNX0RBVEEyKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfZGF0YTQJPSAoMHgwMjIwfEZPUk1fREFUQTQpLAotICAgICAgICBBVF9sb3dlcl9ib3VuZF9kYXRhOAk9ICgweDAyMjB8Rk9STV9EQVRBOCksCi0gICAgQVRfcHJpdmF0ZQkJCT0gKDB4MDI0MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHJvZHVjZXIJCQk9ICgweDAyNTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb2dyYW0JCQk9ICgweDAyMzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb3RlY3RlZAkJPSAoMHgwMjYwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm90b3R5cGVkCQk9ICgweDAyNzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3B1YmxpYwkJCT0gKDB4MDI4MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHVyZV92aXJ0dWFsCQk9ICgweDAyOTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3JldHVybl9hZGRyCQk9ICgweDAyYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2Fic3RyYWN0X29yaWdpbgkJPSAoMHgwMmIwfEZPUk1fUkVGKSwKLSAgICBBVF9zdGFydF9zY29wZQkJPSAoMHgwMmMwfEZPUk1fREFUQTQpLAotICAgIEFUX3N0cmlkZV9zaXplCQk9ICgweDAyZTB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX3JlZgk9ICgweDAyZjB8Rk9STV9SRUYpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9kYXRhMgk9ICgweDAyZjB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX2RhdGE0CT0gKDB4MDJmMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfdXBwZXJfYm91bmRfZGF0YTgJPSAoMHgwMmYwfEZPUk1fREFUQTgpLAotICAgIEFUX3ZpcnR1YWwJCQk9ICgweDAzMDB8Rk9STV9TVFJJTkcpLAotCi0gICAgLyogR05VIGV4dGVuc2lvbnMuICAqLwotCi0gICAgQVRfc2ZfbmFtZXMJCQk9ICgweDgwMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2luZm8JCQk9ICgweDgwMTB8Rk9STV9EQVRBNCksCi0gICAgQVRfbWFjX2luZm8JCQk9ICgweDgwMjB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2Nvb3JkcwkJPSAoMHg4MDMwfEZPUk1fREFUQTQpLAotICAgIEFUX2JvZHlfYmVnaW4JCT0gKDB4ODA0MHxGT1JNX0FERFIpLAotICAgIEFUX2JvZHlfZW5kCQkJPSAoMHg4MDUwfEZPUk1fQUREUikKLX07Ci0KLSNkZWZpbmUgQVRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgQVRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIExvY2F0aW9uIGF0b20gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9sb2NhdGlvbl9hdG9tIHsKLSAgICBPUF9SRUcJPSAweDAxLAotICAgIE9QX0JBU0VSRUcJPSAweDAyLAotICAgIE9QX0FERFIJPSAweDAzLAotICAgIE9QX0NPTlNUCT0gMHgwNCwKLSAgICBPUF9ERVJFRjIJPSAweDA1LAotICAgIE9QX0RFUkVGNAk9IDB4MDYsCi0gICAgT1BfQURECT0gMHgwNwotfTsKLQotI2RlZmluZSBPUF9MT19VU0VSCTB4ODAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgT1BfSElfVVNFUgkweGZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBGdW5kYW1lbnRhbCB0eXBlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSB7Ci0gICAgRlRfY2hhcgkJPSAweDAwMDEsCi0gICAgRlRfc2lnbmVkX2NoYXIJPSAweDAwMDIsCi0gICAgRlRfdW5zaWduZWRfY2hhcgk9IDB4MDAwMywKLSAgICBGVF9zaG9ydAkJPSAweDAwMDQsCi0gICAgRlRfc2lnbmVkX3Nob3J0CT0gMHgwMDA1LAotICAgIEZUX3Vuc2lnbmVkX3Nob3J0CT0gMHgwMDA2LAotICAgIEZUX2ludGVnZXIJCT0gMHgwMDA3LAotICAgIEZUX3NpZ25lZF9pbnRlZ2VyCT0gMHgwMDA4LAotICAgIEZUX3Vuc2lnbmVkX2ludGVnZXIJPSAweDAwMDksCi0gICAgRlRfbG9uZwkJPSAweDAwMGEsCi0gICAgRlRfc2lnbmVkX2xvbmcJPSAweDAwMGIsCi0gICAgRlRfdW5zaWduZWRfbG9uZwk9IDB4MDAwYywKLSAgICBGVF9wb2ludGVyCQk9IDB4MDAwZCwgIC8qIGFuIGFsaWFzIGZvciAodm9pZCAqKSAqLwotICAgIEZUX2Zsb2F0CQk9IDB4MDAwZSwKLSAgICBGVF9kYmxfcHJlY19mbG9hdAk9IDB4MDAwZiwKLSAgICBGVF9leHRfcHJlY19mbG9hdAk9IDB4MDAxMCwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9jb21wbGV4CQk9IDB4MDAxMSwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9kYmxfcHJlY19jb21wbGV4CT0gMHgwMDEyLCAgLyogYnJlYWtzICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotCQkJLyogMHgwMDEzIC0tIHJlc2VydmVkICovCi0gICAgRlRfdm9pZAkJPSAweDAwMTQsCi0gICAgRlRfYm9vbGVhbgkJPSAweDAwMTUsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfZXh0X3ByZWNfY29tcGxleAk9IDB4MDAxNiwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9sYWJlbAkJPSAweDAwMTcsCi0gIAotICAgIC8qIEdOVSBleHRlbnNpb25zCi0gICAgICAgVGhlIGxvdyBvcmRlciBieXRlIG11c3QgaW5kaWNhdGUgdGhlIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHR5cGUuCi0gICAgICAgQWxsIG9mIHRoZXNlIHR5cGVzIHdpbGwgcHJvYmFibHkgYnJlYWsgImNsYXNzaWMiIHN2cjQgU0RCICovCi0KLSAgICBGVF9sb25nX2xvbmcJPSAweDgwMDgsCi0gICAgRlRfc2lnbmVkX2xvbmdfbG9uZwk9IDB4ODEwOCwKLSAgICBGVF91bnNpZ25lZF9sb25nX2xvbmcgPSAweDgyMDgsCi0KLSAgICBGVF9pbnQ4CQk9IDB4OTAwMSwKLSAgICBGVF9zaWduZWRfaW50OAk9IDB4OTEwMSwKLSAgICBGVF91bnNpZ25lZF9pbnQ4CT0gMHg5MjAxLAotICAgIEZUX2ludDE2CQk9IDB4OTMwMiwKLSAgICBGVF9zaWduZWRfaW50MTYJPSAweDk0MDIsCi0gICAgRlRfdW5zaWduZWRfaW50MTYJPSAweDk1MDIsCi0gICAgRlRfaW50MzIJCT0gMHg5NjA0LAotICAgIEZUX3NpZ25lZF9pbnQzMgk9IDB4OTcwNCwKLSAgICBGVF91bnNpZ25lZF9pbnQzMgk9IDB4OTgwNCwKLSAgICBGVF9pbnQ2NAkJPSAweDk5MDgsCi0gICAgRlRfc2lnbmVkX2ludDY0CT0gMHg5YTA4LAotICAgIEZUX3Vuc2lnbmVkX2ludDY0CT0gMHg5YjA4LAotCi0gICAgRlRfcmVhbDMyCQk9IDB4YTAwNCwKLSAgICBGVF9yZWFsNjQJCT0gMHhhMTA4LAotICAgIEZUX3JlYWw5NgkJPSAweGEyMGMsCi0gICAgRlRfcmVhbDEyOAkJPSAweGEzMTAKLX07Ci0KLSNkZWZpbmUgRlRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRlRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uIGRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIFR5cGUgbW9kaWZpZXIgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90eXBlX21vZGlmaWVyIHsKLSAgICBNT0RfcG9pbnRlcl90bwk9IDB4MDEsCi0gICAgTU9EX3JlZmVyZW5jZV90bwk9IDB4MDIsCi0gICAgTU9EX2NvbnN0CQk9IDB4MDMsCi0gICAgTU9EX3ZvbGF0aWxlCT0gMHgwNAotfTsKLQotI2RlZmluZSBNT0RfbG9fdXNlcgkweDgwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIE1PRF9oaV91c2VyCTB4ZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIEFycmF5IG9yZGVyaW5nIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfYXJyYXlfZGltX29yZGVyaW5nIHsKLSAgICBPUkRfcm93X21ham9yCT0gMCwKLSAgICBPUkRfY29sX21ham9yCT0gMQotfTsKLQotLyogQXJyYXkgc3Vic2NyaXB0IGZvcm1hdCBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3N1YnNjcl9kYXRhX2Zvcm1hdHMgewotICAgIEZNVF9GVF9DX0MJPSAweDAsCi0gICAgRk1UX0ZUX0NfWAk9IDB4MSwKLSAgICBGTVRfRlRfWF9DCT0gMHgyLAotICAgIEZNVF9GVF9YX1gJPSAweDMsCi0gICAgRk1UX1VUX0NfQwk9IDB4NCwKLSAgICBGTVRfVVRfQ19YCT0gMHg1LAotICAgIEZNVF9VVF9YX0MJPSAweDYsCi0gICAgRk1UX1VUX1hfWAk9IDB4NywKLSAgICBGTVRfRVQJPSAweDgKLX07Ci0KLS8qIERlcml2ZWQgZnJvbSBhYm92ZSBmb3IgZWFzZSBvZiB1c2UuICAqLwotCi0jZGVmaW5lIEZNVF9DT0RFKF9GVU5EQU1FTlRBTF9UWVBFX1AsIF9VQl9DT05TVF9QLCBfTEJfQ09OU1RfUCkgXAotICgoKF9GVU5EQU1FTlRBTF9UWVBFX1ApID8gMCA6IDQpCVwKLSAgfCAoKF9VQl9DT05TVF9QKSA/IDAgOiAyKQkJXAotICB8ICgoX0xCX0NPTlNUX1ApID8gMCA6IDEpKQotCi0vKiBTb3VyY2UgbGFuZ3VhZ2UgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9zb3VyY2VfbGFuZ3VhZ2UgewotICAgIExBTkdfQzg5CQk9IDB4MDAwMDAwMDEsCi0gICAgTEFOR19DCQk9IDB4MDAwMDAwMDIsCi0gICAgTEFOR19BREE4MwkJPSAweDAwMDAwMDAzLAotICAgIExBTkdfQ19QTFVTX1BMVVMJPSAweDAwMDAwMDA0LAotICAgIExBTkdfQ09CT0w3NAk9IDB4MDAwMDAwMDUsCi0gICAgTEFOR19DT0JPTDg1CT0gMHgwMDAwMDAwNiwKLSAgICBMQU5HX0ZPUlRSQU43Nwk9IDB4MDAwMDAwMDcsCi0gICAgTEFOR19GT1JUUkFOOTAJPSAweDAwMDAwMDA4LAotICAgIExBTkdfUEFTQ0FMODMJPSAweDAwMDAwMDA5LAotICAgIExBTkdfTU9EVUxBMgk9IDB4MDAwMDAwMGEsCi0KLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotCi0gICAgTEFOR19DSElMTAkJPSAweDAwMDA5YWYzLAkvKiByYW5kb20gdmFsdWUgZm9yIEdOVSBDaGlsbCAqLwotICAgIExBTkdfSkFWQQkJPSAweDAwMDA5YWY0ICAgIC8qIHJhbmRvbSB2YWx1ZSArIDEgZm9yIEdOVSBKYXZhICovCi19OwotCi0jZGVmaW5lIExBTkdfbG9fdXNlcgkweDAwMDA4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIExBTkdfaGlfdXNlcgkweDAwMDBmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBOYW1lcyBhbmQgY29kZXMgZm9yIEdOVSAibWFjaW5mbyIgZXh0ZW5zaW9uLiAgKi8KLQotZW51bSBkd2FyZl9tYWNpbmZvX3JlY29yZF90eXBlIHsKLSAgICBNQUNJTkZPX3N0YXJ0CT0gJ3MnLAotICAgIE1BQ0lORk9fcmVzdW1lCT0gJ3InLAotICAgIE1BQ0lORk9fZGVmaW5lCT0gJ2QnLAotICAgIE1BQ0lORk9fdW5kZWYJPSAndScKLX07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2R3YXJmMi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDRmYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZHdhcmYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzggKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBjb2RlcyByZWxhdGluZyB0byB0aGUgRFdBUkYgc3ltYm9saWMKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pIFRoZSBBZGEgSm9pbnQgUHJvZ3JhbQotICAgT2ZmaWNlIChBSlBPKSwgRmxvcmlkYSBTdGF0ZSBVbnZpdmVyc2l0eSBhbmQgU2lsaWNvbiBHcmFwaGljcyBJbmMuCi0gICBwcm92aWRlZCBzdXBwb3J0IGZvciB0aGlzIGVmZm9ydCAtLSBKdW5lIDIxLCAxOTk1LgotCi0gICBEZXJpdmVkIGZyb20gdGhlIERXQVJGIDEgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBSb24gR3VpbG1ldHRlCi0gICAocmZnQG5ldGNvbS5jb20pLCBOb3ZlbWJlciAxOTkwLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCi0gICBSZXZpc2lvbiAyLjAuMCAoSnVseSAyNywgMTk5MykgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKLSAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCi0gICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQotICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuICAqLwotCi0jaWZuZGVmIF9FTEZfRFdBUkYyX0gKLSNkZWZpbmUgX0VMRl9EV0FSRjJfSAotCi0vKiBTdHJ1Y3R1cmUgZm91bmQgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciBsaV9sZW5ndGggICAgICAgICAgWzRdOwotICB1bnNpZ25lZCBjaGFyIGxpX3ZlcnNpb24gICAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfcHJvbG9ndWVfbGVuZ3RoIFs0XTsKLSAgdW5zaWduZWQgY2hhciBsaV9taW5faW5zbl9sZW5ndGggWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX2RlZmF1bHRfaXNfc3RtdCBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGluZV9iYXNlICAgICAgIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9saW5lX3JhbmdlICAgICAgWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX29wY29kZV9iYXNlICAgICBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfTGluZUluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIGxpX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgbGlfdmVyc2lvbjsKLSAgdW5zaWduZWQgaW50ICAgbGlfcHJvbG9ndWVfbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICBsaV9taW5faW5zbl9sZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgIGxpX2RlZmF1bHRfaXNfc3RtdDsKLSAgaW50ICAgICAgICAgICAgbGlfbGluZV9iYXNlOwotICB1bnNpZ25lZCBjaGFyICBsaV9saW5lX3JhbmdlOwotICB1bnNpZ25lZCBjaGFyICBsaV9vcGNvZGVfYmFzZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9MaW5lSW5mbzsKLQotLyogU3RydWN0dXJlIGZvdW5kIGluIC5kZWJ1Z19wdWJuYW1lcyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgcG5fbGVuZ3RoICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fdmVyc2lvbiBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fc2l6ZSAgICBbNF07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIHBuX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgcG5fdmVyc2lvbjsKLSAgdW5zaWduZWQgbG9uZyAgcG5fb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nICBwbl9zaXplOwotfQotRFdBUkYyX0ludGVybmFsX1B1Yk5hbWVzOwotCi0vKiBTdHJjdXR1cmUgZm91bmQgaW4gLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICBjdV9sZW5ndGggICAgICAgIFs0XTsKLSAgdW5zaWduZWQgY2hhciAgY3VfdmVyc2lvbiAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGN1X2FiYnJldl9vZmZzZXQgWzRdOwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemUgIFsxXTsKLX0KLURXQVJGMl9FeHRlcm5hbF9Db21wVW5pdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZyAgY3VfbGVuZ3RoOwotICB1bnNpZ25lZCBzaG9ydCBjdV92ZXJzaW9uOwotICB1bnNpZ25lZCBsb25nICBjdV9hYmJyZXZfb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemU7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfQ29tcFVuaXQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2xlbmd0aCAgICAgICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3ZlcnNpb24gICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2luZm9fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3BvaW50ZXJfc2l6ZSBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZSBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfQVJhbmdlOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBhcl9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IGFyX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGxvbmcgIGFyX2luZm9fb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBhcl9wb2ludGVyX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9BUmFuZ2U7Ci0KLQotLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdGFnCi0gIHsKLSAgICBEV19UQUdfcGFkZGluZyA9IDB4MDAsCi0gICAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAotICAgIERXX1RBR19jbGFzc190eXBlID0gMHgwMiwKLSAgICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAotICAgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKLSAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciA9IDB4MDUsCi0gICAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKLSAgICBEV19UQUdfbGFiZWwgPSAweDBhLAotICAgIERXX1RBR19sZXhpY2FsX2Jsb2NrID0gMHgwYiwKLSAgICBEV19UQUdfbWVtYmVyID0gMHgwZCwKLSAgICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKLSAgICBEV19UQUdfcmVmZXJlbmNlX3R5cGUgPSAweDEwLAotICAgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAotICAgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCi0gICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlID0gMHgxMywKLSAgICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKLSAgICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCi0gICAgRFdfVEFHX3VuaW9uX3R5cGUgPSAweDE3LAotICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKLSAgICBEV19UQUdfdmFyaWFudCA9IDB4MTksCi0gICAgRFdfVEFHX2NvbW1vbl9ibG9jayA9IDB4MWEsCi0gICAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAotICAgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCi0gICAgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSA9IDB4MWQsCi0gICAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCi0gICAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCi0gICAgRFdfVEFHX3NldF90eXBlID0gMHgyMCwKLSAgICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCi0gICAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCi0gICAgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiA9IDB4MjMsCi0gICAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCi0gICAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKLSAgICBEV19UQUdfY29uc3RfdHlwZSA9IDB4MjYsCi0gICAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKLSAgICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCi0gICAgRFdfVEFHX2ZpbGVfdHlwZSA9IDB4MjksCi0gICAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCi0gICAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKLSAgICBEV19UQUdfbmFtZWxpc3RfaXRlbSA9IDB4MmMsCi0gICAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKLSAgICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCi0gICAgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0gPSAweDJmLAotICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCi0gICAgRFdfVEFHX3Rocm93bl90eXBlID0gMHgzMSwKLSAgICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKLSAgICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKLSAgICBEV19UQUdfdmFyaWFibGUgPSAweDM0LAotICAgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKLSAgICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCi0gICAgRFdfVEFHX01JUFNfbG9vcCA9IDB4NDA4MSwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotICAgIERXX1RBR19mb3JtYXRfbGFiZWwgPSAweDQxMDEsCS8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlID0gMHg0MTAyLAkvKiBmb3IgQysrICovCi0gICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzCS8qIGZvciBDKysgKi8KLSAgfTsKLQotI2RlZmluZSBEV19UQUdfbG9fdXNlcgkweDQwODAKLSNkZWZpbmUgRFdfVEFHX2hpX3VzZXIJMHhmZmZmCi0KLS8qIGZsYWcgdGhhdCB0ZWxscyB3aGV0aGVyIGVudHJ5IGhhcyBhIGNoaWxkIG9yIG5vdCAqLwotI2RlZmluZSBEV19jaGlsZHJlbl9ubyAgIDAKLSNkZWZpbmUJRFdfY2hpbGRyZW5feWVzICAxCi0KLS8qIEZvcm0gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLWVudW0gZHdhcmZfZm9ybQotICB7Ci0gICAgRFdfRk9STV9hZGRyID0gMHgwMSwKLSAgICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCi0gICAgRFdfRk9STV9ibG9jazQgPSAweDA0LAotICAgIERXX0ZPUk1fZGF0YTIgPSAweDA1LAotICAgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAotICAgIERXX0ZPUk1fZGF0YTggPSAweDA3LAotICAgIERXX0ZPUk1fc3RyaW5nID0gMHgwOCwKLSAgICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKLSAgICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCi0gICAgRFdfRk9STV9kYXRhMSA9IDB4MGIsCi0gICAgRFdfRk9STV9mbGFnID0gMHgwYywKLSAgICBEV19GT1JNX3NkYXRhID0gMHgwZCwKLSAgICBEV19GT1JNX3N0cnAgPSAweDBlLAotICAgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAotICAgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAotICAgIERXX0ZPUk1fcmVmMSA9IDB4MTEsCi0gICAgRFdfRk9STV9yZWYyID0gMHgxMiwKLSAgICBEV19GT1JNX3JlZjQgPSAweDEzLAotICAgIERXX0ZPUk1fcmVmOCA9IDB4MTQsCi0gICAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAotICAgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2Ci0gIH07Ci0KLS8qIEF0dHJpYnV0ZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQVRfc2libGluZyA9IDB4MDEsCi0gICAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAotICAgIERXX0FUX25hbWUgPSAweDAzLAotICAgIERXX0FUX29yZGVyaW5nID0gMHgwOSwKLSAgICBEV19BVF9zdWJzY3JfZGF0YSA9IDB4MGEsCi0gICAgRFdfQVRfYnl0ZV9zaXplID0gMHgwYiwKLSAgICBEV19BVF9iaXRfb2Zmc2V0ID0gMHgwYywKLSAgICBEV19BVF9iaXRfc2l6ZSA9IDB4MGQsCi0gICAgRFdfQVRfZWxlbWVudF9saXN0ID0gMHgwZiwKLSAgICBEV19BVF9zdG10X2xpc3QgPSAweDEwLAotICAgIERXX0FUX2xvd19wYyA9IDB4MTEsCi0gICAgRFdfQVRfaGlnaF9wYyA9IDB4MTIsCi0gICAgRFdfQVRfbGFuZ3VhZ2UgPSAweDEzLAotICAgIERXX0FUX21lbWJlciA9IDB4MTQsCi0gICAgRFdfQVRfZGlzY3IgPSAweDE1LAotICAgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKLSAgICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKLSAgICBEV19BVF9pbXBvcnQgPSAweDE4LAotICAgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAotICAgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAotICAgIERXX0FUX2NvbXBfZGlyID0gMHgxYiwKLSAgICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCi0gICAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKLSAgICBEV19BVF9kZWZhdWx0X3ZhbHVlID0gMHgxZSwKLSAgICBEV19BVF9pbmxpbmUgPSAweDIwLAotICAgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKLSAgICBEV19BVF9sb3dlcl9ib3VuZCA9IDB4MjIsCi0gICAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAotICAgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAotICAgIERXX0FUX3JldHVybl9hZGRyID0gMHgyYSwKLSAgICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCi0gICAgRFdfQVRfc3RyaWRlX3NpemUgPSAweDJlLAotICAgIERXX0FUX3VwcGVyX2JvdW5kID0gMHgyZiwKLSAgICBEV19BVF9hYnN0cmFjdF9vcmlnaW4gPSAweDMxLAotICAgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAotICAgIERXX0FUX2FkZHJlc3NfY2xhc3MgPSAweDMzLAotICAgIERXX0FUX2FydGlmaWNpYWwgPSAweDM0LAotICAgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAotICAgIERXX0FUX2NhbGxpbmdfY29udmVudGlvbiA9IDB4MzYsCi0gICAgRFdfQVRfY291bnQgPSAweDM3LAotICAgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKLSAgICBEV19BVF9kZWNsX2NvbHVtbiA9IDB4MzksCi0gICAgRFdfQVRfZGVjbF9maWxlID0gMHgzYSwKLSAgICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAotICAgIERXX0FUX2RlY2xhcmF0aW9uID0gMHgzYywKLSAgICBEV19BVF9kaXNjcl9saXN0ID0gMHgzZCwKLSAgICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCi0gICAgRFdfQVRfZXh0ZXJuYWwgPSAweDNmLAotICAgIERXX0FUX2ZyYW1lX2Jhc2UgPSAweDQwLAotICAgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCi0gICAgRFdfQVRfaWRlbnRpZmllcl9jYXNlID0gMHg0MiwKLSAgICBEV19BVF9tYWNyb19pbmZvID0gMHg0MywKLSAgICBEV19BVF9uYW1lbGlzdF9pdGVtcyA9IDB4NDQsCi0gICAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAotICAgIERXX0FUX3NlZ21lbnQgPSAweDQ2LAotICAgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAotICAgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKLSAgICBEV19BVF90eXBlID0gMHg0OSwKLSAgICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAotICAgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCi0gICAgRFdfQVRfdmlydHVhbGl0eSA9IDB4NGMsCi0gICAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAotICAgIC8qIFNHSS9NSVBTIEV4dGVuc2lvbnMgKi8KLSAgICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKLSAgICBEV19BVF9NSVBTX2xvb3BfYmVnaW4gPSAweDIwMDIsCi0gICAgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4gPSAweDIwMDMsCi0gICAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCi0gICAgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IgPSAweDIwMDUsCi0gICAgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCA9IDB4MjAwNiwKLSAgICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKLSAgICBEV19BVF9NSVBTX3N0cmlkZSA9IDB4MjAwOCwKLSAgICBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUgPSAweDIwMDksCi0gICAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCi0gICAgRFdfQVRfTUlQU19oYXNfaW5saW5lcyA9IDB4MjAwYiwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucy4gICovCi0gICAgRFdfQVRfc2ZfbmFtZXMgPSAweDIxMDEsCi0gICAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCi0gICAgRFdfQVRfbWFjX2luZm8gPSAweDIxMDMsCi0gICAgRFdfQVRfc3JjX2Nvb3JkcyA9IDB4MjEwNCwKLSAgICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAotICAgIERXX0FUX2JvZHlfZW5kID0gMHgyMTA2Ci0gIH07Ci0KLSNkZWZpbmUgRFdfQVRfbG9fdXNlcgkweDIwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19BVF9oaV91c2VyCTB4M2ZmMAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfbG9jYXRpb25fYXRvbQotICB7Ci0gICAgRFdfT1BfYWRkciA9IDB4MDMsCi0gICAgRFdfT1BfZGVyZWYgPSAweDA2LAotICAgIERXX09QX2NvbnN0MXUgPSAweDA4LAotICAgIERXX09QX2NvbnN0MXMgPSAweDA5LAotICAgIERXX09QX2NvbnN0MnUgPSAweDBhLAotICAgIERXX09QX2NvbnN0MnMgPSAweDBiLAotICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAotICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAotICAgIERXX09QX2NvbnN0OHUgPSAweDBlLAotICAgIERXX09QX2NvbnN0OHMgPSAweDBmLAotICAgIERXX09QX2NvbnN0dSA9IDB4MTAsCi0gICAgRFdfT1BfY29uc3RzID0gMHgxMSwKLSAgICBEV19PUF9kdXAgPSAweDEyLAotICAgIERXX09QX2Ryb3AgPSAweDEzLAotICAgIERXX09QX292ZXIgPSAweDE0LAotICAgIERXX09QX3BpY2sgPSAweDE1LAotICAgIERXX09QX3N3YXAgPSAweDE2LAotICAgIERXX09QX3JvdCA9IDB4MTcsCi0gICAgRFdfT1BfeGRlcmVmID0gMHgxOCwKLSAgICBEV19PUF9hYnMgPSAweDE5LAotICAgIERXX09QX2FuZCA9IDB4MWEsCi0gICAgRFdfT1BfZGl2ID0gMHgxYiwKLSAgICBEV19PUF9taW51cyA9IDB4MWMsCi0gICAgRFdfT1BfbW9kID0gMHgxZCwKLSAgICBEV19PUF9tdWwgPSAweDFlLAotICAgIERXX09QX25lZyA9IDB4MWYsCi0gICAgRFdfT1Bfbm90ID0gMHgyMCwKLSAgICBEV19PUF9vciA9IDB4MjEsCi0gICAgRFdfT1BfcGx1cyA9IDB4MjIsCi0gICAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAotICAgIERXX09QX3NobCA9IDB4MjQsCi0gICAgRFdfT1Bfc2hyID0gMHgyNSwKLSAgICBEV19PUF9zaHJhID0gMHgyNiwKLSAgICBEV19PUF94b3IgPSAweDI3LAotICAgIERXX09QX2JyYSA9IDB4MjgsCi0gICAgRFdfT1BfZXEgPSAweDI5LAotICAgIERXX09QX2dlID0gMHgyYSwKLSAgICBEV19PUF9ndCA9IDB4MmIsCi0gICAgRFdfT1BfbGUgPSAweDJjLAotICAgIERXX09QX2x0ID0gMHgyZCwKLSAgICBEV19PUF9uZSA9IDB4MmUsCi0gICAgRFdfT1Bfc2tpcCA9IDB4MmYsCi0gICAgRFdfT1BfbGl0MCA9IDB4MzAsCi0gICAgRFdfT1BfbGl0MSA9IDB4MzEsCi0gICAgRFdfT1BfbGl0MiA9IDB4MzIsCi0gICAgRFdfT1BfbGl0MyA9IDB4MzMsCi0gICAgRFdfT1BfbGl0NCA9IDB4MzQsCi0gICAgRFdfT1BfbGl0NSA9IDB4MzUsCi0gICAgRFdfT1BfbGl0NiA9IDB4MzYsCi0gICAgRFdfT1BfbGl0NyA9IDB4MzcsCi0gICAgRFdfT1BfbGl0OCA9IDB4MzgsCi0gICAgRFdfT1BfbGl0OSA9IDB4MzksCi0gICAgRFdfT1BfbGl0MTAgPSAweDNhLAotICAgIERXX09QX2xpdDExID0gMHgzYiwKLSAgICBEV19PUF9saXQxMiA9IDB4M2MsCi0gICAgRFdfT1BfbGl0MTMgPSAweDNkLAotICAgIERXX09QX2xpdDE0ID0gMHgzZSwKLSAgICBEV19PUF9saXQxNSA9IDB4M2YsCi0gICAgRFdfT1BfbGl0MTYgPSAweDQwLAotICAgIERXX09QX2xpdDE3ID0gMHg0MSwKLSAgICBEV19PUF9saXQxOCA9IDB4NDIsCi0gICAgRFdfT1BfbGl0MTkgPSAweDQzLAotICAgIERXX09QX2xpdDIwID0gMHg0NCwKLSAgICBEV19PUF9saXQyMSA9IDB4NDUsCi0gICAgRFdfT1BfbGl0MjIgPSAweDQ2LAotICAgIERXX09QX2xpdDIzID0gMHg0NywKLSAgICBEV19PUF9saXQyNCA9IDB4NDgsCi0gICAgRFdfT1BfbGl0MjUgPSAweDQ5LAotICAgIERXX09QX2xpdDI2ID0gMHg0YSwKLSAgICBEV19PUF9saXQyNyA9IDB4NGIsCi0gICAgRFdfT1BfbGl0MjggPSAweDRjLAotICAgIERXX09QX2xpdDI5ID0gMHg0ZCwKLSAgICBEV19PUF9saXQzMCA9IDB4NGUsCi0gICAgRFdfT1BfbGl0MzEgPSAweDRmLAotICAgIERXX09QX3JlZzAgPSAweDUwLAotICAgIERXX09QX3JlZzEgPSAweDUxLAotICAgIERXX09QX3JlZzIgPSAweDUyLAotICAgIERXX09QX3JlZzMgPSAweDUzLAotICAgIERXX09QX3JlZzQgPSAweDU0LAotICAgIERXX09QX3JlZzUgPSAweDU1LAotICAgIERXX09QX3JlZzYgPSAweDU2LAotICAgIERXX09QX3JlZzcgPSAweDU3LAotICAgIERXX09QX3JlZzggPSAweDU4LAotICAgIERXX09QX3JlZzkgPSAweDU5LAotICAgIERXX09QX3JlZzEwID0gMHg1YSwKLSAgICBEV19PUF9yZWcxMSA9IDB4NWIsCi0gICAgRFdfT1BfcmVnMTIgPSAweDVjLAotICAgIERXX09QX3JlZzEzID0gMHg1ZCwKLSAgICBEV19PUF9yZWcxNCA9IDB4NWUsCi0gICAgRFdfT1BfcmVnMTUgPSAweDVmLAotICAgIERXX09QX3JlZzE2ID0gMHg2MCwKLSAgICBEV19PUF9yZWcxNyA9IDB4NjEsCi0gICAgRFdfT1BfcmVnMTggPSAweDYyLAotICAgIERXX09QX3JlZzE5ID0gMHg2MywKLSAgICBEV19PUF9yZWcyMCA9IDB4NjQsCi0gICAgRFdfT1BfcmVnMjEgPSAweDY1LAotICAgIERXX09QX3JlZzIyID0gMHg2NiwKLSAgICBEV19PUF9yZWcyMyA9IDB4NjcsCi0gICAgRFdfT1BfcmVnMjQgPSAweDY4LAotICAgIERXX09QX3JlZzI1ID0gMHg2OSwKLSAgICBEV19PUF9yZWcyNiA9IDB4NmEsCi0gICAgRFdfT1BfcmVnMjcgPSAweDZiLAotICAgIERXX09QX3JlZzI4ID0gMHg2YywKLSAgICBEV19PUF9yZWcyOSA9IDB4NmQsCi0gICAgRFdfT1BfcmVnMzAgPSAweDZlLAotICAgIERXX09QX3JlZzMxID0gMHg2ZiwKLSAgICBEV19PUF9icmVnMCA9IDB4NzAsCi0gICAgRFdfT1BfYnJlZzEgPSAweDcxLAotICAgIERXX09QX2JyZWcyID0gMHg3MiwKLSAgICBEV19PUF9icmVnMyA9IDB4NzMsCi0gICAgRFdfT1BfYnJlZzQgPSAweDc0LAotICAgIERXX09QX2JyZWc1ID0gMHg3NSwKLSAgICBEV19PUF9icmVnNiA9IDB4NzYsCi0gICAgRFdfT1BfYnJlZzcgPSAweDc3LAotICAgIERXX09QX2JyZWc4ID0gMHg3OCwKLSAgICBEV19PUF9icmVnOSA9IDB4NzksCi0gICAgRFdfT1BfYnJlZzEwID0gMHg3YSwKLSAgICBEV19PUF9icmVnMTEgPSAweDdiLAotICAgIERXX09QX2JyZWcxMiA9IDB4N2MsCi0gICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwKLSAgICBEV19PUF9icmVnMTQgPSAweDdlLAotICAgIERXX09QX2JyZWcxNSA9IDB4N2YsCi0gICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwKLSAgICBEV19PUF9icmVnMTcgPSAweDgxLAotICAgIERXX09QX2JyZWcxOCA9IDB4ODIsCi0gICAgRFdfT1BfYnJlZzE5ID0gMHg4MywKLSAgICBEV19PUF9icmVnMjAgPSAweDg0LAotICAgIERXX09QX2JyZWcyMSA9IDB4ODUsCi0gICAgRFdfT1BfYnJlZzIyID0gMHg4NiwKLSAgICBEV19PUF9icmVnMjMgPSAweDg3LAotICAgIERXX09QX2JyZWcyNCA9IDB4ODgsCi0gICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwKLSAgICBEV19PUF9icmVnMjYgPSAweDhhLAotICAgIERXX09QX2JyZWcyNyA9IDB4OGIsCi0gICAgRFdfT1BfYnJlZzI4ID0gMHg4YywKLSAgICBEV19PUF9icmVnMjkgPSAweDhkLAotICAgIERXX09QX2JyZWczMCA9IDB4OGUsCi0gICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwKLSAgICBEV19PUF9yZWd4ID0gMHg5MCwKLSAgICBEV19PUF9mYnJlZyA9IDB4OTEsCi0gICAgRFdfT1BfYnJlZ3ggPSAweDkyLAotICAgIERXX09QX3BpZWNlID0gMHg5MywKLSAgICBEV19PUF9kZXJlZl9zaXplID0gMHg5NCwKLSAgICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCi0gICAgRFdfT1Bfbm9wID0gMHg5NgotICB9OwotCi0jZGVmaW5lIERXX09QX2xvX3VzZXIJMHg4MAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIERXX09QX2hpX3VzZXIJMHhmZgkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBUeXBlIGVuY29kaW5ncy4gICovCi0KLWVudW0gZHdhcmZfdHlwZQotICB7Ci0gICAgRFdfQVRFX3ZvaWQgPSAweDAsCi0gICAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCi0gICAgRFdfQVRFX2Jvb2xlYW4gPSAweDIsCi0gICAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDMsCi0gICAgRFdfQVRFX2Zsb2F0ID0gMHg0LAotICAgIERXX0FURV9zaWduZWQgPSAweDUsCi0gICAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHg2LAotICAgIERXX0FURV91bnNpZ25lZCA9IDB4NywKLSAgICBEV19BVEVfdW5zaWduZWRfY2hhciA9IDB4OAotICB9OwotCi0jZGVmaW5lCURXX0FURV9sb191c2VyIDB4ODAKLSNkZWZpbmUJRFdfQVRFX2hpX3VzZXIgMHhmZgotCi0vKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLwotZW51bSBkd2FyZl9hcnJheV9kaW1fb3JkZXJpbmcKLSAgewotICAgIERXX09SRF9yb3dfbWFqb3IgPSAwLAotICAgIERXX09SRF9jb2xfbWFqb3IgPSAxCi0gIH07Ci0KLS8qIGFjY2VzcyBhdHRyaWJ1dGUgKi8KLWVudW0gZHdhcmZfYWNjZXNzX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQUNDRVNTX3B1YmxpYyA9IDEsCi0gICAgRFdfQUNDRVNTX3Byb3RlY3RlZCA9IDIsCi0gICAgRFdfQUNDRVNTX3ByaXZhdGUgPSAzCi0gIH07Ci0KLS8qIHZpc2liaWxpdHkgKi8KLWVudW0gZHdhcmZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUKLSAgewotICAgIERXX1ZJU19sb2NhbCA9IDEsCi0gICAgRFdfVklTX2V4cG9ydGVkID0gMiwKLSAgICBEV19WSVNfcXVhbGlmaWVkID0gMwotICB9OwotCi0vKiB2aXJ0dWFsaXR5ICovCi1lbnVtIGR3YXJmX3ZpcnR1YWxpdHlfYXR0cmlidXRlCi0gIHsKLSAgICBEV19WSVJUVUFMSVRZX25vbmUgPSAwLAotICAgIERXX1ZJUlRVQUxJVFlfdmlydHVhbCA9IDEsCi0gICAgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWwgPSAyCi0gIH07Ci0KLS8qIGNhc2Ugc2Vuc2l0aXZpdHkgKi8KLWVudW0gZHdhcmZfaWRfY2FzZQotICB7Ci0gICAgRFdfSURfY2FzZV9zZW5zaXRpdmUgPSAwLAotICAgIERXX0lEX3VwX2Nhc2UgPSAxLAotICAgIERXX0lEX2Rvd25fY2FzZSA9IDIsCi0gICAgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSA9IDMKLSAgfTsKLQotLyogY2FsbGluZyBjb252ZW50aW9uICovCi1lbnVtIGR3YXJmX2NhbGxpbmdfY29udmVudGlvbgotICB7Ci0gICAgRFdfQ0Nfbm9ybWFsID0gMHgxLAotICAgIERXX0NDX3Byb2dyYW0gPSAweDIsCi0gICAgRFdfQ0Nfbm9jYWxsID0gMHgzCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0NfbG9fdXNlciAweDQwCi0jZGVmaW5lIERXX0NDX2hpX3VzZXIgMHhmZgotCi0vKiBpbmxpbmUgYXR0cmlidXRlICovCi1lbnVtIGR3YXJmX2lubGluZV9hdHRyaWJ1dGUKLSAgewotICAgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCi0gICAgRFdfSU5MX2lubGluZWQgPSAxLAotICAgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDIsCi0gICAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCi0gIH07Ci0KLS8qIGRlc2NyaW1pbmFudCBsaXN0cyAqLwotZW51bSBkd2FyZl9kZXNjcmltX2xpc3QKLSAgewotICAgIERXX0RTQ19sYWJlbCA9IDAsCi0gICAgRFdfRFNDX3JhbmdlID0gMQotICB9OwotCi0vKiBsaW5lIG51bWJlciBvcGNvZGVzICovCi1lbnVtIGR3YXJmX2xpbmVfbnVtYmVyX29wcwotICB7Ci0gICAgRFdfTE5TX2V4dGVuZGVkX29wID0gMCwKLSAgICBEV19MTlNfY29weSA9IDEsCi0gICAgRFdfTE5TX2FkdmFuY2VfcGMgPSAyLAotICAgIERXX0xOU19hZHZhbmNlX2xpbmUgPSAzLAotICAgIERXX0xOU19zZXRfZmlsZSA9IDQsCi0gICAgRFdfTE5TX3NldF9jb2x1bW4gPSA1LAotICAgIERXX0xOU19uZWdhdGVfc3RtdCA9IDYsCi0gICAgRFdfTE5TX3NldF9iYXNpY19ibG9jayA9IDcsCi0gICAgRFdfTE5TX2NvbnN0X2FkZF9wYyA9IDgsCi0gICAgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMgPSA5Ci0gIH07Ci0KLS8qIGxpbmUgbnVtYmVyIGV4dGVuZGVkIG9wY29kZXMgKi8KLWVudW0gZHdhcmZfbGluZV9udW1iZXJfeF9vcHMKLSAgewotICAgIERXX0xORV9lbmRfc2VxdWVuY2UgPSAxLAotICAgIERXX0xORV9zZXRfYWRkcmVzcyA9IDIsCi0gICAgRFdfTE5FX2RlZmluZV9maWxlID0gMwotICB9OwotCi0vKiBjYWxsIGZyYW1lIGluZm9ybWF0aW9uICovCi1lbnVtIGR3YXJmX2NhbGxfZnJhbWVfaW5mbwotICB7Ci0gICAgRFdfQ0ZBX2FkdmFuY2VfbG9jID0gMHg0MCwKLSAgICBEV19DRkFfb2Zmc2V0ID0gMHg4MCwKLSAgICBEV19DRkFfcmVzdG9yZSA9IDB4YzAsCi0gICAgRFdfQ0ZBX25vcCA9IDB4MDAsCi0gICAgRFdfQ0ZBX3NldF9sb2MgPSAweDAxLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzIgPSAweDAzLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzQgPSAweDA0LAotICAgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAotICAgIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkID0gMHgwNiwKLSAgICBEV19DRkFfdW5kZWZpbmVkID0gMHgwNywKLSAgICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCi0gICAgRFdfQ0ZBX3JlZ2lzdGVyID0gMHgwOSwKLSAgICBEV19DRkFfcmVtZW1iZXJfc3RhdGUgPSAweDBhLAotICAgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKLSAgICBEV19DRkFfZGVmX2NmYSA9IDB4MGMsCi0gICAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgPSAweDBkLAotICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCi0gICAgLyogU0dJL01JUFMgc3BlY2lmaWMgKi8KLSAgICBEV19DRkFfTUlQU19hZHZhbmNlX2xvYzggPSAweDFkCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0lFX0lECSAgMHhmZmZmZmZmZgotI2RlZmluZSBEV19DSUVfVkVSU0lPTgkgIDEKLQotI2RlZmluZSBEV19DRkFfZXh0ZW5kZWQgICAwCi0jZGVmaW5lIERXX0NGQV9sb3dfdXNlciAgIDB4MWMKLSNkZWZpbmUgRFdfQ0ZBX2hpZ2hfdXNlciAgMHgzZgotCi0jZGVmaW5lIERXX0NISUxEUkVOX25vCQkgICAgIDB4MDAKLSNkZWZpbmUgRFdfQ0hJTERSRU5feWVzCQkgICAgIDB4MDEKLQotI2RlZmluZSBEV19BRERSX25vbmUJCTAKLQotLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlCi0gIHsKLSAgICBEV19MQU5HX0M4OSA9IDB4MDAwMSwKLSAgICBEV19MQU5HX0MgPSAweDAwMDIsCi0gICAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywKLSAgICBEV19MQU5HX0NfcGx1c19wbHVzID0gMHgwMDA0LAotICAgIERXX0xBTkdfQ29ib2w3NCA9IDB4MDAwNSwKLSAgICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCi0gICAgRFdfTEFOR19Gb3J0cmFuNzcgPSAweDAwMDcsCi0gICAgRFdfTEFOR19Gb3J0cmFuOTAgPSAweDAwMDgsCi0gICAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwKLSAgICBEV19MQU5HX01vZHVsYTIgPSAweDAwMGEsCi0gICAgRFdfTEFOR19KYXZhID0gMHg5YWY0LAotICAgIERXX0xBTkdfTWlwc19Bc3NlbWJsZXIgPSAweDgwMDEKLSAgfTsKLQotCi0jZGVmaW5lIERXX0xBTkdfbG9fdXNlciAweDgwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19MQU5HX2hpX3VzZXIgMHhmZmZmCS8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLQotLyogTmFtZXMgYW5kIGNvZGVzIGZvciBtYWNybyBpbmZvcm1hdGlvbi4gICovCi0KLWVudW0gZHdhcmZfbWFjaW5mb19yZWNvcmRfdHlwZQotICB7Ci0gICAgRFdfTUFDSU5GT19kZWZpbmUgPSAxLAotICAgIERXX01BQ0lORk9fdW5kZWYgPSAyLAotICAgIERXX01BQ0lORk9fc3RhcnRfZmlsZSA9IDMsCi0gICAgRFdfTUFDSU5GT19lbmRfZmlsZSA9IDQsCi0gICAgRFdfTUFDSU5GT192ZW5kb3JfZXh0ID0gMjU1Ci0gIH07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9leHRlcm5hbC5oIGIvaW5jbHVkZS9lbGYvZXh0ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhYjc3ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9leHRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKLSAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKLSAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRUxGIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBkZXNjcmliZSBob3cgRUxGIGlzIHJlcHJlc2VudGVkIGV4dGVybmFsbHkgYnkgdGhlIEJGRCBsaWJyYXJ5LgotICAgSS5FLiBpdCBkZXNjcmliZXMgdGhlIGluLWZpbGUgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0vKiBUaGUgNjQtYml0IHN0dWZmIGlzIGtpbmQgb2YgcmFuZG9tLiAgUGVyaGFwcyBzb21lb25lIHdpbGwgcHVibGlzaCBhCi0gICBzcGVjIHNvbWVkYXkuICAqLwotCi0jaWZuZGVmIF9FTEZfRVhURVJOQUxfSAotI2RlZmluZSBfRUxGX0VYVEVSTkFMX0gKLQotLyogRUxGIEhlYWRlciAoMzItYml0IGltcGxlbWVudGF0aW9ucykgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbMTZdOwkJLyogRUxGICJtYWdpYyBudW1iZXIiICovCi0gIHVuc2lnbmVkIGNoYXIJZV90eXBlWzJdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJZV9tYWNoaW5lWzJdOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfdmVyc2lvbls0XTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBjaGFyCWVfZW50cnlbNF07CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Bob2ZmWzRdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Nob2ZmWzRdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX2ZsYWdzWzRdOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9laHNpemVbMl07CQkvKiBFTEYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BoZW50c2l6ZVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BobnVtWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NoZW50c2l6ZVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NobnVtWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Noc3RybmR4WzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCi19IEVsZjMyX0V4dGVybmFsX0VoZHI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgllX2lkZW50WzE2XTsJCS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLwotICB1bnNpZ25lZCBjaGFyCWVfdHlwZVsyXTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfbWFjaGluZVsyXTsJCS8qIFNwZWNpZmllcyByZXF1aXJlZCBhcmNoaXRlY3R1cmUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3ZlcnNpb25bNF07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHZlcnNpb24gKi8KLSAgdW5zaWduZWQgY2hhcgllX2VudHJ5WzhdOwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG9mZls4XTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG9mZls4XTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9mbGFnc1s0XTsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCWVfZWhzaXplWzJdOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waGVudHNpemVbMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG51bVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaGVudHNpemVbMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG51bVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaHN0cm5keFsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGY2NF9FeHRlcm5hbF9FaGRyOwotCi0vKiBQcm9ncmFtIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJcF90eXBlWzRdOwkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfb2Zmc2V0WzRdOwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCXBfdmFkZHJbNF07CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfcGFkZHJbNF07CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZpbGVzels0XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJcF9tZW1zels0XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZsYWdzWzRdOwkJLyogU2VnbWVudCBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCXBfYWxpZ25bNF07CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfSBFbGYzMl9FeHRlcm5hbF9QaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJcF90eXBlWzRdOwkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmxhZ3NbNF07CQkvKiBTZWdtZW50IGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9vZmZzZXRbOF07CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJcF92YWRkcls4XTsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9wYWRkcls4XTsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmlsZXN6WzhdOwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX21lbXN6WzhdOwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLwotICB1bnNpZ25lZCBjaGFyCXBfYWxpZ25bOF07CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfSBFbGY2NF9FeHRlcm5hbF9QaGRyOwotCi0vKiBTZWN0aW9uIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc2hfbmFtZVs0XTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3R5cGVbNF07CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9mbGFnc1s0XTsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcls0XTsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX29mZnNldFs0XTsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9zaXplWzRdOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfbGlua1s0XTsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2luZm9bNF07CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyYWxpZ25bNF07CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZW50c2l6ZVs0XTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGYzMl9FeHRlcm5hbF9TaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc2hfbmFtZVs0XTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3R5cGVbNF07CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9mbGFnc1s4XTsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcls4XTsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX29mZnNldFs4XTsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9zaXplWzhdOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfbGlua1s0XTsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2luZm9bNF07CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyYWxpZ25bOF07CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZW50c2l6ZVs4XTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9TaGRyOwotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXN0X25hbWVbNF07CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3ZhbHVlWzRdOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NpemVbNF07CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mb1sxXTsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyWzFdOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2huZHhbMl07CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLX0gRWxmMzJfRXh0ZXJuYWxfU3ltOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc3RfbmFtZVs0XTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mb1sxXTsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyWzFdOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2huZHhbMl07CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgdW5zaWduZWQgY2hhcglzdF92YWx1ZVs4XTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9zaXplWzhdOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9TeW07Ci0KLS8qIE5vdGUgc2VnbWVudHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCW5hbWVzels0XTsJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KLSAgdW5zaWduZWQgY2hhcglkZXNjc3pbNF07CQkvKiBTaXplIG9mIHRoZSBub3RlIGRlc2NyaXB0b3IgKi8KLSAgdW5zaWduZWQgY2hhcgl0eXBlWzRdOwkJLyogSW50ZXJwcmV0YXRpb24gb2YgdGhlIGRlc2NyaXB0b3IgKi8KLSAgY2hhcgkJbmFtZVsxXTsJCS8qIFN0YXJ0IG9mIHRoZSBuYW1lK2Rlc2MgZGF0YSAqLwotfSBFbGZfRXh0ZXJuYWxfTm90ZTsKLQotLyogUmVsb2NhdGlvbiBFbnRyaWVzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbNF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bNF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmMzJfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbNF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bNF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2FkZGVuZFs0XTsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGYzMl9FeHRlcm5hbF9SZWxhOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bOF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmNjRfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bOF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2FkZGVuZFs4XTsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9SZWxhOwotCi0vKiBkeW5hbWljIHNlY3Rpb24gc3RydWN0dXJlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglkX3RhZ1s0XTsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLwotICB1bmlvbiB7Ci0gICAgdW5zaWduZWQgY2hhcglkX3ZhbFs0XTsKLSAgICB1bnNpZ25lZCBjaGFyCWRfcHRyWzRdOwotICB9IGRfdW47Ci19IEVsZjMyX0V4dGVybmFsX0R5bjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWRfdGFnWzhdOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICB1bnNpZ25lZCBjaGFyCWRfdmFsWzhdOwotICAgIHVuc2lnbmVkIGNoYXIJZF9wdHJbOF07Ci0gIH0gZF91bjsKLX0gRWxmNjRfRXh0ZXJuYWxfRHluOwotCi0vKiBUaGUgdmVyc2lvbiBzdHJ1Y3R1cmVzIGFyZSBjdXJyZW50bHkgc2l6ZSBpbmRlcGVuZGVudC4gIFRoZXkgYXJlCi0gICBuYW1lZCB3aXRob3V0IGEgMzIgb3IgNjQuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhlc2Ugc3RydWN0dXJlcwotICAgd2lsbCBuZWVkIHRvIGJlIHJlbmFtZWQuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdmRfdmVyc2lvblsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfZmxhZ3NbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX25keFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfY250WzJdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9oYXNoWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9hdXhbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJkZWY7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2ZGFfbmFtZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdmRhX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJkYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJuZWVkIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX3ZlcnNpb25bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX2NudFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fZmlsZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fYXV4WzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bl9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVybmVlZDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2bmFfaGFzaFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX2ZsYWdzWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfb3RoZXJbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9uYW1lWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfbmV4dFs0XTsKLX0gRWxmX0V4dGVybmFsX1Zlcm5hdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgVGhpcyBpcyBub3QgYQotICAgc3RhbmRhcmQgRUxGIHN0cnVjdHVyZTsgRUxGIGp1c3QgdXNlcyBFbGYzMl9IYWxmLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2c192ZXJzWzJdOwotfQotI2lmZGVmIF9fR05VQ19fCi0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQotI2VuZGlmCi0gIEVsZl9FeHRlcm5hbF9WZXJzeW07Ci0KLS8qIFN0cnVjdHVyZSBmb3Igc3ltaW5mbyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIJCXNpX2JvdW5kdG9bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXNpX2ZsYWdzWzJdOwotfSBFbGZfRXh0ZXJuYWxfU3ltaW5mbzsKLQotI2VuZGlmIC8qIF9FTEZfRVhURVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZnIzMC5oIGIvaW5jbHVkZS9lbGYvZnIzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNiMDUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2ZyMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIEZSMzAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRlIzMF9ICi0jZGVmaW5lIF9FTEZfRlIzMF9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9mcjMwX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzgsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzIwLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8zMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfNDgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzZfSU5fNCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOF9JTl84LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF85X0lOXzgsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEwX0lOXzgsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzlfUENSRUwsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEyX1BDUkVMLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX0dOVV9WVEVOVFJZLCAxMikKLSAgRU1QVFlfUkVMT0MgIChSX0ZSMzBfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmIC8qIF9FTEZfRlIzMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9ocHBhLmggYi9pbmNsdWRlL2VsZi9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjQ0NDQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qIEhQUEEgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEhQUEEgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfSFBQQV9ICi0jZGVmaW5lIF9FTEZfSFBQQV9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFRyYXAgbnVsbCBhZGRyZXNzIGRlcmVmZXJlbmNlcy4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19UUkFQTklMCTB4MDAwMTAwMDAKLQotLyogLlBBUklTQy5hcmNoZXh0IHNlY3Rpb24gaXMgcHJlc2VudC4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19FWFQJCTB4MDAwMjAwMDAKLQotLyogUHJvZ3JhbSBleHBlY3RzIGxpdHRsZS1lbmRpYW4gbW9kZS4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19MU0IJCTB4MDAwNDAwMDAKLQotLyogUHJvZ3JhbSBleHBlY3RzIHdpZGUgbW9kZS4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19XSURFCQkweDAwMDgwMDAwCi0KLS8qIERvIG5vdCBhbGxvdyBrZXJuZWwtYXNzaXN0ZWQgYnJhbmNoIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTk9fS0FCUAkweDAwMTAwMDAwCi0KLS8qIEFsbG93IGxhenkgc3dhcCBmb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHByb2dyYW0gc2VnbWVudHMuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTEFaWVNXQVAJMHgwMDQwMDAwMAotCi0vKiBBcmNoaXRlY3R1cmUgdmVyc2lvbiAqLwotI2RlZmluZSBFRl9QQVJJU0NfQVJDSAkJMHgwMDAwZmZmZgotCi0jZGVmaW5lIEVGQV9QQVJJU0NfMV8wCQkJMHgwMjBiCi0jZGVmaW5lIEVGQV9QQVJJU0NfMV8xCQkJMHgwMjEwCi0jZGVmaW5lIEVGQV9QQVJJU0NfMl8wCQkJMHgwMjE0Ci0KLS8qIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLiAgKi8KLS8qIEEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSB0ZW50YXRpdmUgZGVmaW5pdGlvbiBpbiBhbiBBTlNJIEMKLSAgIGNvbXBpbGF0aW9uLiAgKi8KLSNkZWZpbmUgU0hOX1BBUklTQ19BTlNJX0NPTU1PTiAJMHhmZjAwCi0KLS8qIEEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSBjb21tb24gYmxvY2sgdXNpbmcgdGhlCi0gICBodWdlIG1lbW9yeSBtb2RlbC4gICovCi0jZGVmaW5lIFNITl9QQVJJU0NfSFVHRV9DT01NT04JMHhmZjAxCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyBwcm9kdWN0IHNwZWNpZmljIGV4dGVuc2lvbiBiaXRzLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19FWFQJCTB4NzAwMDAwMDAKLQotLyogU2VjdGlvbiBjb250YWlucyB1bndpbmQgdGFibGUgZW50cmllcy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKLQotLyogU2VjdGlvbiBjb250YWlucyBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemVkIGNvZGUuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0RPQwkJMHg3MDAwMDAwMgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUgYW5ub3RhdGlvbnMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0FOTk9UCTB4NzAwMDAwMDMKLQotLyogVGhlc2UgYXJlIHN0cmljdGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZGVyIGVsZjMyLWhwcGEKLSAgIGltcGxlbWVudGF0aW9uLiAgSG9wZWZ1bGx5IHdlIGNhbiBlbGltaW5hdGUgdGhlbSBpbiB0aGUgZnV0dXJlLiAgKi8KLS8qIE9wdGlvbmFsIHNlY3Rpb24gaG9sZGluZyBhcmd1bWVudCBsb2NhdGlvbi9yZWxvY2F0aW9uIGluZm8uICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX1NZTUVYVE4gICAgU0hUX0xPUFJPQys4Ci0KLS8qIE9wdGlvbiBzZWN0aW9uIGZvciBsaW5rZXIgc3R1YnMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX1NUVUJTICAgICAgU0hUX0xPUFJPQys5Ci0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyBjb2RlIGNvbXBpbGVkIGZvciBzdGF0aWMgYnJhbmNoIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NCUAkJMHg4MDAwMDAwMAotCi0vKiBTZWN0aW9uIHNob3VsZCBiZSBhbGxvY2F0ZWQgZnJvbSBmcm9tIEdQLiAgKi8KLSNkZWZpbmUgU0hGX1BBUklTQ19IVUdFCQkweDQwMDAwMDAwCi0KLS8qIFNlY3Rpb24gc2hvdWxkIGdvIG5lYXIgR1AuICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NIT1JUCTB4MjAwMDAwMDAKLQotCi0vKiBJZGVudGlmaWVzIHRoZSBlbnRyeSBwb2ludCBvZiBhIG1pbGxpY29kZSByb3V0aW5lLiAgKi8KLSNkZWZpbmUgU1RUX1BBUklTQ19NSUxMSQkxMwotCi0vKiBFTEYvSFBQQSByZWxvY2F0aW9uIHR5cGVzICovCi0KLS8qIE5vdGU6IFBBLUVMRiBpcyBkZWZpbmVkIHRvIHVzZSBvbmx5IFJFTEEgcmVsb2NhdGlvbnMuICAqLwotI2luY2x1ZGUgInJlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaHBwYV9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX05PTkUsICAgICAgMCkJLyogTm8gcmVsb2MgKi8KLQotICAgICAvKiBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGRvIHNpbXBsZSBiYXNlICsgb2Zmc2V0IHJlbG9jYXRpb25zLiAgKi8KLQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjMyLCAgMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIyMUwsIDIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTdSLCAzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE3RiwgNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNFIsIDYpCi0KLSAgICAvKiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzCi0gICAgICAgVHlwaWNhbGx5IHVzZWQgZm9yIGNhbGxzLgotICAgICAgIE5vdGUgUENSRUwxN0MgYW5kIFBDUkVMMTdGIGRpZmZlciBvbmx5IGluIG92ZXJmbG93IGhhbmRsaW5nLgotICAgICAgIFBDUkVMMTdDIG5ldmVyIHJlcG9ydHMgYSByZWxvY2F0aW9uIGVycm9yLgotCi0gICAgICAgV2hlbiBzdXBwb3J0aW5nIGFyZ3VtZW50IHJlbG9jYXRpb25zLCBmdW5jdGlvbiBjYWxscyBtdXN0IGJlCi0gICAgICAgYWNjb21wYW5pZWQgYnkgcGFyYW1ldGVyIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzCi0gICAgICAgY2FycmllZCBpbiB0aGUgdGVuIGhpZ2gtb3JkZXIgYml0cyBvZiB0aGUgYWRkZW5kIGZpZWxkLiAgVGhlIHJlbWFpbmluZwotICAgICAgIDIyIGJpdHMgb2Ygb2YgdGhlIGFkZGVuZCBmaWVsZCBhcmUgc2lnbi1leHRlbmRlZCB0byBmb3JtIHRoZSBBZGRlbmQuCi0KLSAgICAgICBOb3RlIHRoZSBjb2RlIHRvIGJ1aWxkIGFyZ3VtZW50IHJlbG9jYXRpb25zIGRlcGVuZHMgb24gdGhlCi0gICAgICAgYWRkZW5kIGJlaW5nIHplcm8uICBBIGNvbnNlcXVlbmNlIG9mIHRoaXMgbGltaXRhdGlvbiBpcyBHQVMKLSAgICAgICBjYW4gbm90IHBlcmZvcm0gcmVsb2NhdGlvbiByZWR1Y3Rpb25zIGZvciBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwzMiwgOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjFMLCAxMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdSLCAxMSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdGLCAxMikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdDLCAxMykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRSLCAxNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRGLCAxNSkKLQotICAgIC8qIERQLXJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwyMUwsIDE4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNFdSLCAxOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMTREUiwgMjApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDE0UiwgMjIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDE0RiwgMjMpCi0KLSAgICAvKiBEYXRhIGxpbmthZ2UgdGFibGUgKERMVCkgcmVsb2NhdGlvbiB0eXBlcwotCi0gICAgICAgU09NIERMVF9SRUwgZml4dXAgcmVxdWVzdHMgYXJlIHVzZWQgdG8gZm9yIHN0YXRpYyBkYXRhIHJlZmVyZW5jZXMKLSAgICAgICBmcm9tIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUgd2l0aGluIHNoYXJlZCBsaWJyYXJpZXMuICBUaGV5IGFyZQotICAgICAgIHNpbWlsYXIgdG8gdGhlIEdPVCByZWxvY2F0aW9uIHR5cGVzIGluIHNvbWUgU1ZSNCBpbXBsZW1lbnRhdGlvbnMuICAqLwotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwyMUwsIDI2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMTRSLCAzMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0RiwgMzEpCi0KLSAgICAvKiBETFQgaW5kaXJlY3QgcmVsb2NhdGlvbiB0eXBlcyAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDIxTCwgMzQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQxNFIsIDM4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTRGLCAzOSkKLQotICAgIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcy4gIFVnaC4gIFRoZXNlIGltcGx5IGxvdHMgb2Ygc3RhdGUgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFVEJBU0UsIDQwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VDUkVMMzIsIDQxKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDIxTCwgNDIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTdSLCA0MykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxN0YsIDQ0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0UiwgNDYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTRGLCA0NykKLQotICAgIC8qIFNlZ21lbnQgcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUdCQVNFLCA0OCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFR1JFTDMyLCA0OSkKLQotICAgIC8qIE9mZnNldHMgZnJvbSB0aGUgUExULiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjIxTCwgNTApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNFIsIDU0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTRGLCA1NSkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjMyLCA1NykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUwsIDU4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE0UiwgNjIpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0ZQVFI2NCwgNjQpCi0KLSAgICAvKiBQbGFiZWwgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTEFCRUwzMiwgNjUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTEFCRUwyMUwsIDY2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMTRSLCA3MCkKLQotICAgIC8qIFBDUkVMIHJlbG9jYXRpb25zLiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMNjQsIDcyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwyMkMsIDczKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwyMkYsIDc0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNFdSLCA3NSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTREUiwgNzYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE2RiwgNzcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE2V0YsIDc4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNkRGLCA3OSkKLQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVI2NCwgODApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVI2NFdSLCA4MSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjY0RFIsIDgyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTRXUiwgODMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNERSLCA4NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE2RiwgODUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNldGLCA4NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE2REYsIDg3KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19HUFJFTDY0LCA4OCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMTRXUiwgOTEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNERSLCA5MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0dQUkVMMTZGLCA5MykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0dQUkVMMTZXRiwgOTQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19HUFJFTDE2REYsIDk1KQotCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGNjQsIDk2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTRXUiwgOTkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQxNERSLCAxMDApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRjE2RiwgMTAxKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkYxNldGLCAxMDIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRjE2REYsIDEwMykKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VDUkVMNjQsIDEwNCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0V1IsIDEwNykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNERSLCAxMDgpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFR1JFTDY0LCAxMTIpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE0V1IsIDExNSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE0RFIsIDExNikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE2RiwgMTE3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTZXRiwgMTE4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTZERiwgMTE5KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSNjQsIDEyMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFdSLCAxMjMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTREUiwgMTI0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE2RiwgMTI1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YsIDEyNikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkRGLCAxMjcpCi0KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQ09QWSwgMTI4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfSVBMVCwgMTI5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRVBMVCwgMTMwKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDMyLCAxNTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDIxTCwgMTU0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNFIsIDE1OCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAyMUwsIDE2MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTRSLCAxNjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0RiwgMTY3KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDY0LCAyMTYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE0V1IsIDIxOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTREUiwgMjIwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNkYsIDIyMSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZXRiwgMjIyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNkRGLCAyMjMpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQNjQsIDIyNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTRXUiwgMjI3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNERSLCAyMjgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE2RiwgMjI5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNldGLCAyMzApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE2REYsIDIzMSkKLSAgICBFTVBUWV9SRUxPQyAoUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNpZm5kZWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi10eXBlZGVmIGVudW0gZWxmX2hwcGFfcmVsb2NfdHlwZSBlbGZfaHBwYV9yZWxvY190eXBlOwotI2VuZGlmCi0KLSNkZWZpbmUgUFRfUEFSSVNDX0FSQ0hFWFQJMHg3MDAwMDAwMAotI2RlZmluZSBQVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKLSNkZWZpbmUgUEZfUEFSSVNDX1NCUAkJMHgwODAwMDAwMAotI2RlZmluZSBQRl9IUF9QQUdFX1NJWkUJCTB4MDAxMDAwMDAKLSNkZWZpbmUgUEZfSFBfRkFSX1NIQVJFRAkweDAwMjAwMDAwCi0jZGVmaW5lIFBGX0hQX05FQVJfU0hBUkVECTB4MDA0MDAwMDAKLSNkZWZpbmUgUEZfSFBfQ09ERQkJMHgwMTAwMDAwMAotI2RlZmluZSBQRl9IUF9NT0RJRlkJCTB4MDIwMDAwMDAKLSNkZWZpbmUgUEZfSFBfTEFaWVNXQVAJCTB4MDQwMDAwMDAKLSNkZWZpbmUgUEZfSFBfU0JQCQkweDA4MDAwMDAwCi0KLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBkeW5hbWljIGFycmF5IHRhZ3MuICAqLwotCi0jZGVmaW5lIERUX0hQX0xPQURfTUFQCQkoRFRfTE9PUyArIDB4MCkKLSNkZWZpbmUgRFRfSFBfRExEX0ZMQUdTCQkoRFRfTE9PUyArIDB4MSkKLSNkZWZpbmUgRFRfSFBfRExEX0hPT0sJCShEVF9MT09TICsgMHgyKQotI2RlZmluZSBEVF9IUF9VWDEwX0lOSVQJCShEVF9MT09TICsgMHgzKQotI2RlZmluZSBEVF9IUF9VWDEwX0lOSVRTWgkoRFRfTE9PUyArIDB4NCkKLSNkZWZpbmUgRFRfSFBfUFJFSU5JVAkJKERUX0xPT1MgKyAweDUpCi0jZGVmaW5lIERUX0hQX1BSRUlOSVRTWgkJKERUX0xPT1MgKyAweDYpCi0jZGVmaW5lIERUX0hQX05FRURFRAkJKERUX0xPT1MgKyAweDcpCi0jZGVmaW5lIERUX0hQX1RJTUVfU1RBTVAJKERUX0xPT1MgKyAweDgpCi0jZGVmaW5lIERUX0hQX0NIRUNLU1VNCQkoRFRfTE9PUyArIDB4OSkKLSNkZWZpbmUgRFRfSFBfR1NUX1NJWkUJCShEVF9MT09TICsgMHhhKQotI2RlZmluZSBEVF9IUF9HU1RfVkVSU0lPTgkoRFRfTE9PUyArIDB4YikKLSNkZWZpbmUgRFRfSFBfR1NUX0hBU0hWQUwJKERUX0xPT1MgKyAweGMpCi0KLS8qIFZhbHVlcyBmb3IgRFRfSFBfRExEX0ZMQUdTLiAgKi8KLSNkZWZpbmUgRFRfSFBfREVCVUdfUFJJVkFURQkJMHgwMDAxIC8qIE1hcCB0ZXh0IHByaXZhdGUgKi8KLSNkZWZpbmUgRFRfSFBfREVCVUdfQ0FMTEJBQ0sJCTB4MDAwMiAvKiBDYWxsYmFjayAqLwotI2RlZmluZSBEVF9IUF9ERUJVR19DQUxMQkFDS19CT1IJMHgwMDA0IC8qIEJPUiBjYWxsYmFjayAqLwotI2RlZmluZSBEVF9IUF9OT19FTlZWQVIJCQkweDAwMDggLyogTm8gZW52IHZhciAqLwotI2RlZmluZSBEVF9IUF9CSU5EX05PVwkJCTB4MDAxMCAvKiBCaW5kIG5vdyAqLwotI2RlZmluZSBEVF9IUF9CSU5EX05PTkZBVEFMCQkweDAwMjAgLyogQmluZCBub24tZmF0YWwgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9WRVJCT1NFCQkweDAwNDAgLyogQmluZCB2ZXJib3NlICovCi0jZGVmaW5lIERUX0hQX0JJTkRfUkVTVFJJQ1RFRAkJMHgwMDgwIC8qIEJpbmQgcmVzdHJpY3RlZCAqLwotI2RlZmluZSBEVF9IUF9CSU5EX1NZTUJPTElDCQkweDAxMDAgLyogQmluZCBzeW1ib2xpYyAqLwotI2RlZmluZSBEVF9IUF9SUEFUSF9GSVJTVAkJMHgwMjAwIC8qIFJQQVRIIGZpcnN0ICovCi0jZGVmaW5lIERUX0hQX0JJTkRfREVQVEhfRklSU1QJCTB4MDQwMCAvKiBCaW5kIGRlcHRoLWZpcnN0ICovCi0KLS8qIFByb2dyYW0gaGVhZGVyIGV4dGVuc2lvbnMuICAqLwotI2RlZmluZSBQVF9IUF9UTFMJCShQVF9MT09TICsgMHgwKQotI2RlZmluZSBQVF9IUF9DT1JFX05PTkUJCShQVF9MT09TICsgMHgxKQotI2RlZmluZSBQVF9IUF9DT1JFX1ZFUlNJT04JKFBUX0xPT1MgKyAweDIpCi0jZGVmaW5lIFBUX0hQX0NPUkVfS0VSTkVMCShQVF9MT09TICsgMHgzKQotI2RlZmluZSBQVF9IUF9DT1JFX0NPTU0JCShQVF9MT09TICsgMHg0KQotI2RlZmluZSBQVF9IUF9DT1JFX1BST0MJCShQVF9MT09TICsgMHg1KQotI2RlZmluZSBQVF9IUF9DT1JFX0xPQURBQkxFCShQVF9MT09TICsgMHg2KQotI2RlZmluZSBQVF9IUF9DT1JFX1NUQUNLCShQVF9MT09TICsgMHg3KQotI2RlZmluZSBQVF9IUF9DT1JFX1NITQkJKFBUX0xPT1MgKyAweDgpCi0jZGVmaW5lIFBUX0hQX0NPUkVfTU1GCQkoUFRfTE9PUyArIDB4OSkKLSNkZWZpbmUgUFRfSFBfUEFSQUxMRUwJCShQVF9MT09TICsgMHgxMCkKLSNkZWZpbmUgUFRfSFBfRkFTVEJJTkQJCShQVF9MT09TICsgMHgxMSkKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMuICAqLwotI2RlZmluZSBTVFRfSFBfT1BBUVVFCQkoU1RUX0xPT1MgKyAweDEpCi0jZGVmaW5lIFNUVF9IUF9TVFVCCQkoU1RUX0xPT1MgKyAweDIpCi0KLSNlbmRpZiAvKiBfRUxGX0hQUEFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaTM4Ni5oIGIvaW5jbHVkZS9lbGYvaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTlmMTA1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2kzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIGl4ODYgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfSTM4Nl9ICi0jZGVmaW5lIF9FTEZfSTM4Nl9ICi0KLSNpbmNsdWRlICJyZWxvYy1tYWNyb3MuaCIKLQotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2kzODZfcmVsb2NfdHlwZSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9OT05FLCAgICAgIDApCS8qIE5vIHJlbG9jICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfMzIsICAgICAgICAxKQkvKiBEaXJlY3QgMzIgYml0ICAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDMzIsICAgICAgMikJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR09UMzIsICAgICAzKQkvKiAzMiBiaXQgR09UIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUExUMzIsCSAgICA0KQkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9DT1BZLAkgICAgNSkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dMT0JfREFULCAgNikJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0pVTVBfU0xPVCwgNykJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1JFTEFUSVZFLCAgOCkJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dPVE9GRiwgICAgOSkJLyogMzIgYml0IG9mZnNldCB0byBHT1QgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HT1RQQywgICAgMTApCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09UICovCi0gICAgIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQywgMTEpCi0gICAgIEZBS0VfUkVMT0MgICAoTEFTVF9JTlZBTElEX1JFTE9DLCAgMTkpCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfMTYsICAgICAgIDIwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDMTYsICAgICAyMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl84LAkgICAyMikKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QQzgsICAgICAgMjMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfbWF4LAkgICAyNCkKLSAgICAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR05VX1ZUSU5IRVJJVCwgMjUwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dOVV9WVEVOVFJZLCAyNTEpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2k5NjAuaCBiL2luY2x1ZGUvZWxmL2k5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzOWQyOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBJbnRlbCA5NjAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfSTk2MF9ICi0jZGVmaW5lIF9FTEZfSTk2MF9ICi0KLSNpbmNsdWRlICJyZWxvYy1tYWNyb3MuaCIKLQotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2k5NjBfcmVsb2NfdHlwZSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF9OT05FLAkgICAgMCkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF8xMiwJICAgIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfMzIsCSAgICAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX0lQMjQsCSAgICAzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX1NVQiwJICAgIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfT1BUQ0FMTCwgICA1KQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX09QVENBTExYLCAgNikKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF9PUFRDQUxMWEEsIDcpCi0gICAgIEVNUFRZX1JFTE9DIChSXzk2MF9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9JOTYwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2ludGVybmFsLmggYi9pbmNsdWRlL2VsZi9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI4MWEwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyogRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBFTEYgc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGRlc2NyaWJlIGhvdyBFTEYgaXMgcmVwcmVzZW50ZWQgaW50ZXJuYWxseSBpbiB0aGUgQkZEIGxpYnJhcnkuCi0gICBJLkUuIGl0IGRlc2NyaWJlcyB0aGUgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIEVMRi4gIEl0IHJlcXVpcmVzCi0gICB0aGUgZWxmLWNvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLQotCi0vKiBOT1RFIHRoYXQgdGhlc2Ugc3RydWN0dXJlcyBhcmUgbm90IGtlcHQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcHBlYXIKLSAgIGluIHRoZSBvYmplY3QgZmlsZS4gIEluIHNvbWUgY2FzZXMgdGhleSd2ZSBiZWVuIHJlb3JkZXJlZCBmb3IgbW9yZSBvcHRpbWFsCi0gICBwYWNraW5nIHVuZGVyIHZhcmlvdXMgY2lyY3Vtc3RhbmNlcy4gICovCi0KLSNpZm5kZWYgX0VMRl9JTlRFUk5BTF9ICi0jZGVmaW5lIF9FTEZfSU5URVJOQUxfSAotCi0vKiBFTEYgSGVhZGVyICovCi0KLSNkZWZpbmUgRUlfTklERU5UCTE2CQkvKiBTaXplIG9mIGVfaWRlbnRbXSAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfZWhkciB7Ci0gIHVuc2lnbmVkIGNoYXIJCWVfaWRlbnRbRUlfTklERU5UXTsJLyogRUxGICJtYWdpYyBudW1iZXIiICovCi0gIGJmZF92bWEJCWVfZW50cnk7CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgYmZkX3NpemVfdHlwZQkJZV9waG9mZjsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIGJmZF9zaXplX3R5cGUJCWVfc2hvZmY7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBsb25nCQllX3ZlcnNpb247CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHZlcnNpb24gKi8KLSAgdW5zaWduZWQgbG9uZwkJZV9mbGFnczsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLwotICB1bnNpZ25lZCBzaG9ydAllX3R5cGU7CQkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB0eXBlICovCi0gIHVuc2lnbmVkIHNob3J0CWVfbWFjaGluZTsJCS8qIFNwZWNpZmllcyByZXF1aXJlZCBhcmNoaXRlY3R1cmUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9laHNpemU7CQkvKiBFTEYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9waGVudHNpemU7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIHNob3J0CWVfcGhudW07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBzaG9ydAllX3NoZW50c2l6ZTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9zaG51bTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIHNob3J0CWVfc2hzdHJuZHg7CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KLX0gRWxmX0ludGVybmFsX0VoZHI7Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfZWhkciBlbGZfaW50ZXJuYWxfZWhkcgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9FaGRyIEVsZl9JbnRlcm5hbF9FaGRyCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX2VoZHIgZWxmX2ludGVybmFsX2VoZHIKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfRWhkciBFbGZfSW50ZXJuYWxfRWhkcgotCi0vKiBQcm9ncmFtIGhlYWRlciAqLwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3BoZHIgewotICB1bnNpZ25lZCBsb25nCXBfdHlwZTsJCQkvKiBJZGVudGlmaWVzIHByb2dyYW0gc2VnbWVudCB0eXBlICovCi0gIHVuc2lnbmVkIGxvbmcJcF9mbGFnczsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KLSAgYmZkX3ZtYQlwX29mZnNldDsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KLSAgYmZkX3ZtYQlwX3ZhZGRyOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgYmZkX3ZtYQlwX3BhZGRyOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCi0gIGJmZF92bWEJcF9maWxlc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLwotICBiZmRfdm1hCXBfbWVtc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCi0gIGJmZF92bWEJcF9hbGlnbjsJCS8qIFNlZ21lbnQgYWxpZ25tZW50LCBmaWxlICYgbWVtb3J5ICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfcGhkciBFbGZfSW50ZXJuYWxfUGhkcjsKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfcGhkciBlbGZfaW50ZXJuYWxfcGhkcgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9QaGRyIEVsZl9JbnRlcm5hbF9QaGRyCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3BoZHIgZWxmX2ludGVybmFsX3BoZHIKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfUGhkciBFbGZfSW50ZXJuYWxfUGhkcgotCi0vKiBTZWN0aW9uIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfc2hkciB7Ci0gIHVuc2lnbmVkIGludAlzaF9uYW1lOwkJLyogU2VjdGlvbiBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGludAlzaF90eXBlOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCi0gIGJmZF92bWEJc2hfZmxhZ3M7CQkvKiBNaXNjZWxsYW5lb3VzIHNlY3Rpb24gYXR0cmlidXRlcyAqLwotICBiZmRfdm1hCXNoX2FkZHI7CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KLSAgYmZkX3NpemVfdHlwZQlzaF9zaXplOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIGJmZF9zaXplX3R5cGUJc2hfZW50c2l6ZTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotICB1bnNpZ25lZCBsb25nCXNoX2xpbms7CQkvKiBJbmRleCBvZiBhbm90aGVyIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgbG9uZwlzaF9pbmZvOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCi0gIGZpbGVfcHRyCXNoX29mZnNldDsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgaW50CXNoX2FkZHJhbGlnbjsJCS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0KLSAgLyogVGhlIGludGVybmFsIHJlcCBhbHNvIGhhcyBzb21lIGNhY2hlZCBpbmZvIGFzc29jaWF0ZWQgd2l0aCBpdC4gKi8KLSAgYXNlY3Rpb24gKgliZmRfc2VjdGlvbjsJCS8qIEFzc29jaWF0ZWQgQkZEIHNlY3Rpb24uICAqLwotICBQVFIJCWNvbnRlbnRzOwkJLyogU2VjdGlvbiBjb250ZW50cy4gICovCi19IEVsZl9JbnRlcm5hbF9TaGRyOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3NoZHIgZWxmX2ludGVybmFsX3NoZHIKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfU2hkciBFbGZfSW50ZXJuYWxfU2hkcgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9zaGRyIGVsZl9pbnRlcm5hbF9zaGRyCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1NoZHIgRWxmX0ludGVybmFsX1NoZHIKLQotLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLXN0cnVjdCBlbGZfaW50ZXJuYWxfc3ltIHsKLSAgYmZkX3ZtYQlzdF92YWx1ZTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KLSAgYmZkX3ZtYQlzdF9zaXplOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nCXN0X25hbWU7CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X2luZm87CQkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9vdGhlcjsJCS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLwotICB1bnNpZ25lZCBzaG9ydCBzdF9zaG5keDsJCS8qIEFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3N5bSBFbGZfSW50ZXJuYWxfU3ltOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3N5bSBlbGZfaW50ZXJuYWxfc3ltCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3N5bSBlbGZfaW50ZXJuYWxfc3ltCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1N5bSBFbGZfSW50ZXJuYWxfU3ltCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1N5bSBFbGZfSW50ZXJuYWxfU3ltCi0KLS8qIE5vdGUgc2VnbWVudHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX25vdGUgewotICB1bnNpZ25lZCBsb25nCW5hbWVzejsJCQkvKiBTaXplIG9mIGVudHJ5J3Mgb3duZXIgc3RyaW5nICovCi0gIHVuc2lnbmVkIGxvbmcJZGVzY3N6OwkJCS8qIFNpemUgb2YgdGhlIG5vdGUgZGVzY3JpcHRvciAqLwotICB1bnNpZ25lZCBsb25nCXR5cGU7CQkJLyogSW50ZXJwcmV0YXRpb24gb2YgdGhlIGRlc2NyaXB0b3IgKi8KLSAgY2hhciAqCW5hbWVkYXRhOwkJLyogU3RhcnQgb2YgdGhlIG5hbWUrZGVzYyBkYXRhICovCi0gIGNoYXIgKglkZXNjZGF0YTsJCS8qIFN0YXJ0IG9mIHRoZSBkZXNjIGRhdGEgKi8KLSAgYmZkX3ZtYQlkZXNjcG9zOwkJLyogRmlsZSBvZmZzZXQgb2YgdGhlIGRlc2NkYXRhICovCi19IEVsZl9JbnRlcm5hbF9Ob3RlOwotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9Ob3RlCUVsZl9JbnRlcm5hbF9Ob3RlCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX25vdGUJZWxmX2ludGVybmFsX25vdGUKLQotLyogUmVsb2NhdGlvbiBFbnRyaWVzICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9yZWwgewotICBiZmRfdm1hCXJfb2Zmc2V0OwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIC8qIFRoaXMgbmVlZHMgdG8gc3VwcG9ydCA2NC1iaXQgdmFsdWVzIGluIGVsZjY0LiAgKi8KLSAgYmZkX3ZtYQlyX2luZm87CQkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi19IEVsZl9JbnRlcm5hbF9SZWw7Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfcmVsIGVsZl9pbnRlcm5hbF9yZWwKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfUmVsIEVsZl9JbnRlcm5hbF9SZWwKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcmVsIGVsZl9pbnRlcm5hbF9yZWwKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfUmVsIEVsZl9JbnRlcm5hbF9SZWwKLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3JlbGEgewotICBiZmRfdm1hCXJfb2Zmc2V0OwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIGJmZF92bWEJcl9pbmZvOwkJLyogSW5kZXggYW5kIFR5cGUgb2YgcmVsb2NhdGlvbiAqLwotICBiZmRfc2lnbmVkX3ZtYSByX2FkZGVuZDsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGZfSW50ZXJuYWxfUmVsYTsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9yZWxhIGVsZl9pbnRlcm5hbF9yZWxhCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3JlbGEgZWxmX2ludGVybmFsX3JlbGEKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfUmVsYSBFbGZfSW50ZXJuYWxfUmVsYQotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9SZWxhIEVsZl9JbnRlcm5hbF9SZWxhCi0KLS8qIGR5bmFtaWMgc2VjdGlvbiBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX2R5biB7Ci0gIC8qIFRoaXMgbmVlZHMgdG8gc3VwcG9ydCA2NC1iaXQgdmFsdWVzIGluIGVsZjY0LiAgKi8KLSAgYmZkX3ZtYSBkX3RhZzsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLwotICB1bmlvbiB7Ci0gICAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICAgIGJmZF92bWEJZF92YWw7Ci0gICAgYmZkX3ZtYQlkX3B0cjsKLSAgfSBkX3VuOwotfSBFbGZfSW50ZXJuYWxfRHluOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX2R5biBlbGZfaW50ZXJuYWxfZHluCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX2R5biBlbGZfaW50ZXJuYWxfZHluCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX0R5biBFbGZfSW50ZXJuYWxfRHluCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX0R5biBFbGZfSW50ZXJuYWxfRHluCi0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRlZiB7Ci0gIHVuc2lnbmVkIHNob3J0IHZkX3ZlcnNpb247CS8qIFZlcnNpb24gbnVtYmVyIG9mIHN0cnVjdHVyZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZkX2ZsYWdzOwkvKiBGbGFncyAoVkVSX0ZMR18qKS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZkX25keDsJLyogVmVyc2lvbiBpbmRleC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZkX2NudDsJLyogTnVtYmVyIG9mIHZlcmRhdXggZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZkX2hhc2g7CS8qIEhhc2ggb2YgbmFtZS4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZkX2F1eDsJLyogT2Zmc2V0IHRvIHZlcmRhdXggZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZkX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcmRlZi4gICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBzZXQgdXAgd2hlbiBCRkQgcmVhZHMgaW4gdGhlIHN0cnVjdHVyZS4gIEZJWE1FOgotICAgICBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIHN0b3JlIHRoZXNlIGluIGEgZGlmZmVyZW50IHN0cnVjdHVyZS4gICovCi0gIGJmZAkJCSAgICAgICp2ZF9iZmQ7CQkvKiBCRkQuICAqLwotICBjb25zdCBjaGFyCQkgICAgICAqdmRfbm9kZW5hbWU7CS8qIFZlcnNpb24gbmFtZS4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGVmICAqdmRfbmV4dGRlZjsJLyogdmRfbmV4dCBhcyBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkYXV4ICp2ZF9hdXhwdHI7CS8qIHZkX2F1eCBhcyBwb2ludGVyLiAgKi8KLSAgdW5zaWduZWQgaW50CQkgICAgICAgdmRfZXhwX3JlZm5vOwkvKiBVc2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVyZGVmOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkYXV4IHsKLSAgdW5zaWduZWQgbG9uZyB2ZGFfbmFtZTsJLyogU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB2ZGFfbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVyZGF1eC4gICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBzZXQgdXAgd2hlbiBCRkQgcmVhZHMgaW4gdGhlIHN0cnVjdHVyZS4gIEZJWE1FOgotICAgICBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIHN0b3JlIHRoZXNlIGluIGEgZGlmZmVyZW50IHN0cnVjdHVyZS4gICovCi0gIGNvbnN0IGNoYXIgKnZkYV9ub2RlbmFtZTsJCQkvKiB2ZGFfbmFtZSBhcyBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkYXV4ICp2ZGFfbmV4dHB0cjsJLyogdmRhX25leHQgYXMgcG9pbnRlci4gICovCi19IEVsZl9JbnRlcm5hbF9WZXJkYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJuZWVkIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmVlZCB7Ci0gIHVuc2lnbmVkIHNob3J0IHZuX3ZlcnNpb247CS8qIFZlcnNpb24gbnVtYmVyIG9mIHN0cnVjdHVyZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZuX2NudDsJLyogTnVtYmVyIG9mIHZlcm5hdXggZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZuX2ZpbGU7CS8qIFN0cmluZyB0YWJsZSBvZmZzZXQgb2YgbGlicmFyeSBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5fYXV4OwkvKiBPZmZzZXQgdG8gdmVybmF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5fbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVybmVlZC4gICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBzZXQgdXAgd2hlbiBCRkQgcmVhZHMgaW4gdGhlIHN0cnVjdHVyZS4gIEZJWE1FOgotICAgICBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIHN0b3JlIHRoZXNlIGluIGEgZGlmZmVyZW50IHN0cnVjdHVyZS4gICovCi0gIGJmZAkJCSAgICAgICp2bl9iZmQ7CQkvKiBCRkQuICAqLwotICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnZuX2ZpbGVuYW1lOwkvKiB2bl9maWxlIGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3Zlcm5hdXggKnZuX2F1eHB0cjsJLyogdm5fYXV4IGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3Zlcm5lZWQgKnZuX25leHRyZWY7CS8qIHZuX25leHRyZWYgYXMgcG9pbnRlci4gICovCi19IEVsZl9JbnRlcm5hbF9WZXJuZWVkOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJuZWVkIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCB7Ci0gIHVuc2lnbmVkIGxvbmcJIHZuYV9oYXNoOwkvKiBIYXNoIG9mIGRlcGVuZGVuY3kgbmFtZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZuYV9mbGFnczsJLyogRmxhZ3MgKFZFUl9GTEdfKikuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2bmFfb3RoZXI7CS8qIFVudXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZuYV9uYW1lOwkvKiBTdHJpbmcgdGFibGUgb2Zmc2V0IHRvIHZlcnNpb24gbmFtZS4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZuYV9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJuYXV4LiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICp2bmFfbm9kZW5hbWU7CS8qIHZuYV9uYW1lIGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3Zlcm5hdXggKnZuYV9uZXh0cHRyOwkvKiB2bmFfbmV4dCBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1Zlcm5hdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgVGhpcyBpcyBub3QgYQotICAgc3RhbmRhcmQgRUxGIHN0cnVjdHVyZTsgRUxGIGp1c3QgdXNlcyBFbGYzMl9IYWxmLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcnN5bSB7Ci0gIHVuc2lnbmVkIHNob3J0IHZzX3ZlcnM7Ci19IEVsZl9JbnRlcm5hbF9WZXJzeW07Ci0KLS8qIFN0cnVjdHVyZSBmb3Igc3ltaW5mbyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIHNob3J0IGludCAJc2lfYm91bmR0bzsKLSAgdW5zaWduZWQgc2hvcnQgaW50CXNpX2ZsYWdzOwotfSBFbGZfSW50ZXJuYWxfU3ltaW5mbzsKLQotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3ZlcmRlZiBlbGZfaW50ZXJuYWxfdmVyZGVmCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3ZlcmRlZiBlbGZfaW50ZXJuYWxfdmVyZGVmCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3ZlcmRhdXggZWxmX2ludGVybmFsX3ZlcmRhdXgKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyZGF1eCBlbGZfaW50ZXJuYWxfdmVyZGF1eAotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJuZWVkIGVsZl9pbnRlcm5hbF92ZXJuZWVkCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3Zlcm5lZWQgZWxmX2ludGVybmFsX3Zlcm5lZWQKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVybmF1eCBlbGZfaW50ZXJuYWxfdmVybmF1eAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJuYXV4IGVsZl9pbnRlcm5hbF92ZXJuYXV4Ci0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3ZlcnN5bSBlbGZfaW50ZXJuYWxfdmVyc3ltCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3ZlcnN5bSBlbGZfaW50ZXJuYWxfdmVyc3ltCi0KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVyZGVmIEVsZl9JbnRlcm5hbF9WZXJkZWYKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVyZGVmIEVsZl9JbnRlcm5hbF9WZXJkZWYKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVyZGF1eCBFbGZfSW50ZXJuYWxfVmVyZGF1eAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJkYXV4IEVsZl9JbnRlcm5hbF9WZXJkYXV4Ci0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1Zlcm5lZWQgRWxmX0ludGVybmFsX1Zlcm5lZWQKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVybmVlZCBFbGZfSW50ZXJuYWxfVmVybmVlZAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJuYXV4IEVsZl9JbnRlcm5hbF9WZXJuYXV4Ci0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1Zlcm5hdXggRWxmX0ludGVybmFsX1Zlcm5hdXgKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVyc3ltIEVsZl9JbnRlcm5hbF9WZXJzeW0KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVyc3ltIEVsZl9JbnRlcm5hbF9WZXJzeW0KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfU3ltaW5mbyBFbGZfSW50ZXJuYWxfU3ltaW5mbwotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9TeW1pbmZvIEVsZl9JbnRlcm5hbF9TeW1pbmZvCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgaG93IHNlY3Rpb25zIHNob3VsZCBiZSBhc3NpZ25lZAotICAgdG8gcHJvZ3JhbSBzZWdtZW50cy4gICovCi0KLXN0cnVjdCBlbGZfc2VnbWVudF9tYXAKLXsKLSAgLyogTmV4dCBwcm9ncmFtIHNlZ21lbnQuICAqLwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICpuZXh0OwotICAvKiBQcm9ncmFtIHNlZ21lbnQgdHlwZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgcF90eXBlOwotICAvKiBQcm9ncmFtIHNlZ21lbnQgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBsb25nIHBfZmxhZ3M7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBwX3BhZGRyOwotICAvKiBXaGV0aGVyIHRoZSBwX2ZsYWdzIGZpZWxkIGlzIHZhbGlkOyBpZiBub3QsIHRoZSBmbGFncyBhcmUgYmFzZWQKLSAgICAgb24gdGhlIHNlY3Rpb24gZmxhZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgcF9mbGFnc192YWxpZCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhlIHBfcGFkZHIgZmllbGQgaXMgdmFsaWQ7IGlmIG5vdCwgdGhlIHBoeXNpY2FsIGFkZHJlc3MKLSAgICAgaXMgYmFzZWQgb24gdGhlIHNlY3Rpb24gbG1hIHZhbHVlcy4gICovCi0gIHVuc2lnbmVkIGludCBwX3BhZGRyX3ZhbGlkIDogMTsKLSAgLyogV2hldGhlciB0aGlzIHNlZ21lbnQgaW5jbHVkZXMgdGhlIGZpbGUgaGVhZGVyLiAgKi8KLSAgdW5zaWduZWQgaW50IGluY2x1ZGVzX2ZpbGVoZHIgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgc2VnbWVudCBpbmNsdWRlcyB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLSAgdW5zaWduZWQgaW50IGluY2x1ZGVzX3BoZHJzIDogMTsKLSAgLyogTnVtYmVyIG9mIHNlY3Rpb25zIChtYXkgYmUgMCkuICAqLwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIC8qIFNlY3Rpb25zLiAgQWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBpcyBpbiBjb3VudCBmaWVsZC4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uc1sxXTsKLX07Ci0KLSNlbmRpZiAvKiBfRUxGX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL20zMnIuaCBiL2luY2x1ZGUvZWxmL20zMnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyYWUxNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tMzJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiBNMzJSIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX00zMlJfSAotI2RlZmluZSBfRUxGX00zMlJfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbTMycl9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8xNiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMzIsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzI0LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8xMF9QQ1JFTCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMThfUENSRUwsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzI2X1BDUkVMLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9ISTE2X1VMTywgNykKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfSEkxNl9TTE8sIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0xPMTYsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX1NEQTE2LCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfR05VX1ZUSU5IRVJJVCwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0dOVV9WVEVOVFJZLCAxMikKLSAgRU1QVFlfUkVMT0MgIChSX00zMlJfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gaW5kaWNlcy4gIFRoZXNlIHNlY3Rpb25zIGRvIG5vdCBhY3R1YWxseQotICAgZXhpc3QuICBTeW1ib2xzIHdpdGggYSBzdF9zaG5keCBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGVzZQotICAgdmFsdWVzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuICAqLwotCi0vKiBTbWFsbCBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX00zMlJfU0NPTU1PTgkweGZmMDAKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLwotCi0vKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgc3VmZmljaWVudCByZWxvY3MgdG8gYmUgcmVsYXhlZC4KLSAgIFdoZW4gcmVsYXhpbmcsIGV2ZW4gcmVsb2NzIG9mIGJyYW5jaCBpbnN0cnVjdGlvbnMgdGhlIGFzc2VtYmxlciBjb3VsZAotICAgY29tcGxldGUgbXVzdCBiZSBwcmVzZW50IGJlY2F1c2UgcmVsYXhpbmcgbWF5IGNhdXNlIHRoZSBicmFuY2ggdGFyZ2V0IHRvCi0gICBtb3ZlLiAgKi8KLSNkZWZpbmUgU0hGX00zMlJfQ0FOX1JFTEFYCTB4MTAwMDAwMDAKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogVHdvIGJpdCBtMzJyIGFyY2hpdGVjdHVyZSBmaWVsZC4gICovCi0jZGVmaW5lIEVGX00zMlJfQVJDSAkJMHgzMDAwMDAwMAotCi0vKiBtMzJyIGNvZGUuICAqLwotI2RlZmluZSBFX00zMlJfQVJDSAkJMHgwMDAwMDAwMAotLyogbTMycnggY29kZS4gICovCi0jZGVmaW5lIEVfTTMyUlhfQVJDSAkJMHgxMDAwMDAwMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL202OGsuaCBiL2luY2x1ZGUvZWxmL202OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkNTFlZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tNjhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiBNQzY4ayBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9NNjhLX0gKLSNkZWZpbmUgX0VMRl9NNjhLX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbTY4a19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfNjhLX05PTkUsIDApCQkvKiBObyByZWxvYyAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLXzMyLCAxKQkJLyogRGlyZWN0IDMyIGJpdCAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S18xNiwgMikJCS8qIERpcmVjdCAxNiBiaXQgICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfOCwgMykJCS8qIERpcmVjdCA4IGJpdCAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QQzMyLCA0KQkJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUEMxNiwgNSkJCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BDOCwgNikJCS8qIFBDIHJlbGF0aXZlIDggYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UMzIsIDcpCQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UMTYsIDgpCQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UOCwgOSkJCS8qIDggYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDMyTywgMTApCS8qIDMyIGJpdCBHT1Qgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UMTZPLCAxMSkJLyogMTYgYml0IEdPVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1Q4TywgMTIpCS8qIDggYml0IEdPVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQzMiwgMTMpCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDE2LCAxNCkJLyogMTYgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUOCwgMTUpCQkvKiA4IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDMyTywgMTYpCS8qIDMyIGJpdCBQTFQgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMTZPLCAxNykJLyogMTYgYml0IFBMVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQ4TywgMTgpCS8qIDggYml0IFBMVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19DT1BZLCAxOSkJCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTE9CX0RBVCwgMjApCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19KTVBfU0xPVCwgMjEpCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19SRUxBVElWRSwgMjIpCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KLSAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR05VX1ZUSU5IRVJJVCwgMjMpCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR05VX1ZURU5UUlksIDI0KQotICBFTVBUWV9SRUxPQyAgKFJfNjhLX21heCkgICAKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNkZWZpbmUgRUZfQ1BVMzIgICAgMHgwMDgxMDAwMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21jb3JlLmggYi9pbmNsdWRlL2VsZi9tY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjhhOTNhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL21jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBNb3Rvcm9sbGEgTUNvcmUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTUNvcmUgRUxGIEFCSS4gKi8KLSNpZm5kZWYgX0VMRl9NT1JFX0gKLSNkZWZpbmUgX0VMRl9NT1JFX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21jb3JlX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfQUREUjMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxJTU04Qlk0LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxJTU0xMUJZMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSU1NNEJZMiwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMMzIsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dOVV9WVElOSEVSSVQsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9HTlVfVlRFTlRSWSwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1JFTEFUSVZFLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfQ09QWSwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9HTE9CX0RBVCwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9KVU1QX1NMT1QsIDEyKQotICBFTVBUWV9SRUxPQyAgKFJfTUNPUkVfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogU2VjdGlvbiBBdHRyaWJ1dGVzLiAgKi8KLSNkZWZpbmUgU0hGX01DT1JFX05PUkVBRAkweDgwMDAwMDAwCi0KLSNlbmRpZiAvKiBfRUxGX01DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21pcHMuaCBiL2luY2x1ZGUvZWxmL21pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzYWNiZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OTQgKzAsMCBAQAotLyogTUlQUyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgPGlhbkBjeWdudXMuY29tPiwgZnJvbQotICAgaW5mb3JtYXRpb24gaW4gdGhlIFN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UsIE1JUFMKLSAgIFByb2Nlc3NvciBTdXBwbGVtZW50LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTUlQUyBFTEYgQUJJLiAgTm90ZQotICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCi0KLSNpZm5kZWYgX0VMRl9NSVBTX0gKLSNkZWZpbmUgX0VMRl9NSVBTX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbWlwc19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU18xNiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfMzIsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1JFTDMyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU18yNiwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSEkxNiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfTE8xNiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR1BSRUwxNiwgNykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfTElURVJBTCwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UMTYsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1BDMTYsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19DQUxMMTYsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HUFJFTDMyLCAxMikKLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGRlZmluZWQgb24gSXJpeCwgYWx0aG91Z2ggdGhleSBhcmUgbm90Ci0gICAgIGluIHRoZSBNSVBTIEVMRiBBQkkuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19VTlVTRUQxLCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfVU5VU0VEMiwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1VOVVNFRDMsIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19TSElGVDUsIDE2KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19TSElGVDYsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU182NCwgMTgpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9ESVNQLCAxOSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX1BBR0UsIDIwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfT0ZTVCwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9ISTE2LCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX0xPMTYsIDIzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19TVUIsIDI0KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19JTlNFUlRfQSwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0lOU0VSVF9CLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfREVMRVRFLCAyNykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSElHSEVSLCAyOCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSElHSEVTVCwgMjkpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0NBTExfSEkxNiwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0NBTExfTE8xNiwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NDTl9ESVNQLCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUkVMMTYsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19BRERfSU1NRURJQVRFLCAzNCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUEpVTVAsIDM1KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19SRUxHT1QsIDM2KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19KQUxSLCAzNykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfbWF4LCAzOCkKLSAgLyogVGhlc2UgcmVsb2NzIGFyZSB1c2VkIGZvciB0aGUgbWlwczE2LiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX01JUFMxNl8yNiwgMTAwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQUzE2X0dQUkVMLCAxMDEpCi0gIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBlbmFibGUgQysrIHZ0YWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HTlVfVlRJTkhFUklULCAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dOVV9WVEVOVFJZLCAyNTQpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBBdCBsZWFzdCBvbmUgLm5vcmVvcmRlciBkaXJlY3RpdmUgYXBwZWFycyBpbiB0aGUgc291cmNlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19OT1JFT1JERVIJMHgwMDAwMDAwMQotCi0vKiBGaWxlIGNvbnRhaW5zIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUuICAqLwotI2RlZmluZSBFRl9NSVBTX1BJQwkJMHgwMDAwMDAwMgotCi0vKiBDb2RlIGluIGZpbGUgdXNlcyB0aGUgc3RhbmRhcmQgY2FsbGluZyBzZXF1ZW5jZSBmb3IgY2FsbGluZwotICAgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfQ1BJQwkJMHgwMDAwMDAwNAotCi0vKiBDb2RlIGluIGZpbGUgdXNlcyBuZXcgQUJJICgtbjMyIG9uIElyaXggNikuICAqLwotI2RlZmluZSBFRl9NSVBTX0FCSTIJCTB4MDAwMDAwMjAKLQotLyogSW5kaWNhdGVzIGNvZGUgY29tcGlsZWQgZm9yIGEgNjQtYml0IG1hY2hpbmUgaW4gMzItYml0IG1vZGUuIAotICAgKHJlZ3MgYXJlIDMyLWJpdHMgd2lkZS4pICovCi0jZGVmaW5lIEVGX01JUFNfMzJCSVRNT0RFICAgICAgIDB4MDAwMDAxMDAKLQotLyogRm91ciBiaXQgTUlQUyBhcmNoaXRlY3R1cmUgZmllbGQuICAqLwotI2RlZmluZSBFRl9NSVBTX0FSQ0gJCTB4ZjAwMDAwMDAKLQotLyogLW1pcHMxIGNvZGUuICAqLwotI2RlZmluZSBFX01JUFNfQVJDSF8xCQkweDAwMDAwMDAwCi0KLS8qIC1taXBzMiBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NSVBTX0FSQ0hfMgkJMHgxMDAwMDAwMAotCi0vKiAtbWlwczMgY29kZS4gICovCi0jZGVmaW5lIEVfTUlQU19BUkNIXzMJCTB4MjAwMDAwMDAKLQotLyogLW1pcHM0IGNvZGUuICAqLwotI2RlZmluZSBFX01JUFNfQVJDSF80CQkweDMwMDAwMDAwCi0KLS8qIFRoZSBBQkkgb2YgdGhlIGZpbGUuICBBbHNvIHNlZSBFRl9NSVBTX0FCSTIgYWJvdmUuICovCi0jZGVmaW5lIEVGX01JUFNfQUJJCQkweDAwMDBGMDAwCi0KLS8qIFRoZSBvcmlnaW5hbCBvMzIgYWJpLiAqLwotI2RlZmluZSBFX01JUFNfQUJJX08zMiAgICAgICAgICAweDAwMDAxMDAwCi0KLS8qIE8zMiBleHRlbmRlZCB0byB3b3JrIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzICovCi0jZGVmaW5lIEVfTUlQU19BQklfTzY0ICAgICAgICAgIDB4MDAwMDIwMDAKLQotLyogRUFCSSBpbiAzMiBiaXQgbW9kZSAqLwotI2RlZmluZSBFX01JUFNfQUJJX0VBQkkzMiAgICAgICAweDAwMDAzMDAwCi0KLS8qIEVBQkkgaW4gNjQgYml0IG1vZGUgKi8KLSNkZWZpbmUgRV9NSVBTX0FCSV9FQUJJNjQgICAgICAgMHgwMDAwNDAwMAotCi0KLS8qIE1hY2hpbmUgdmFyaWFudCBpZiB3ZSBrbm93IGl0LiAgVGhpcyBmaWVsZCB3YXMgaW52ZW50ZWQgYXQgQ3lnbnVzLAotICAgYnV0IGl0IGlzIGhvcGVkIHRoYXQgb3RoZXIgdmVuZG9ycyB3aWxsIGFkb3B0IGl0LiAgSWYgc29tZSBzdGFuZGFyZAotICAgaXMgZGV2ZWxvcGVkLCB0aGlzIGNvZGUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZm9sbG93IGl0LiAqLwotCi0jZGVmaW5lIEVGX01JUFNfTUFDSAkJMHgwMEZGMDAwMAotCi0vKiBDeWdudXMgaXMgY2hvb3NpbmcgdmFsdWVzIGJldHdlZW4gODAgYW5kIDlGOwotICAgMDAgLSA3RiBzaG91bGQgYmUgbGVmdCBmb3IgYSBmdXR1cmUgc3RhbmRhcmQ7Ci0gICB0aGUgcmVzdCBhcmUgb3Blbi4gKi8KLQotI2RlZmluZSBFX01JUFNfTUFDSF8zOTAwCTB4MDA4MTAwMDAKLQotI2RlZmluZSBFX01JUFNfTUFDSF80MDEwCTB4MDA4MjAwMDAKLSNkZWZpbmUgRV9NSVBTX01BQ0hfNDEwMAkweDAwODMwMDAwCi0jZGVmaW5lIEVfTUlQU19NQUNIXzQ2NTAJMHgwMDg1MDAwMAotI2RlZmluZSBFX01JUFNfTUFDSF80MTExCTB4MDA4ODAwMDAKLQotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gaW5kaWNlcy4gIFRoZXNlIHNlY3Rpb25zIGRvIG5vdCBhY3R1YWxseQotICAgZXhpc3QuICBTeW1ib2xzIHdpdGggYSBzdF9zaG5keCBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGVzZQotICAgdmFsdWVzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuICAqLwotCi0vKiBEZWZpbmVkIGFuZCBhbGxvY2F0ZWQgY29tbW9uIHN5bWJvbC4gIFZhbHVlIGlzIHZpcnR1YWwgYWRkcmVzcy4gIElmCi0gICByZWxvY2F0ZWQsIGFsaWdubWVudCBtdXN0IGJlIHByZXNlcnZlZC4gICovCi0jZGVmaW5lIFNITl9NSVBTX0FDT01NT04JMHhmZjAwCi0KLS8qIERlZmluZWQgYW5kIGFsbG9jYXRlZCB0ZXh0IHN5bWJvbC4gIFZhbHVlIGlzIHZpcnR1YWwgYWRkcmVzcy4KLSAgIE9jY3VyIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiBBbHBoYSBPU0YvMSBhbmQgSXJpeCA1IGV4ZWN1dGFibGVzLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfVEVYVAkJMHhmZjAxCi0KLS8qIERlZmluZWQgYW5kIGFsbG9jYXRlZCBkYXRhIHN5bWJvbC4gIFZhbHVlIGlzIHZpcnR1YWwgYWRkcmVzcy4KLSAgIE9jY3VyIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiBBbHBoYSBPU0YvMSBhbmQgSXJpeCA1IGV4ZWN1dGFibGVzLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfREFUQQkJMHhmZjAyCi0KLS8qIFNtYWxsIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fTUlQU19TQ09NTU9OCTB4ZmYwMwotCi0vKiBTbWFsbCB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfU1VOREVGSU5FRAkweGZmMDQKLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgc2V0IG9mIGR5bmFtaWMgc2hhcmVkIG9iamVjdHMgdXNlZCB3aGVuCi0gICBzdGF0aWNhbGx5IGxpbmtpbmcuICAqLwotI2RlZmluZSBTSFRfTUlQU19MSUJMSVNUCTB4NzAwMDAwMDAKLQotLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhpcyBpcywgYnV0IGl0J3MgdXNlZCBvbiBJcml4IDUuICAqLwotI2RlZmluZSBTSFRfTUlQU19NU1lNCQkweDcwMDAwMDAxCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgbGlzdCBvZiBzeW1ib2xzIHdob3NlIGRlZmluaXRpb25zIGNvbmZsaWN0IHdpdGgKLSAgIHN5bWJvbHMgZGVmaW5lZCBpbiBzaGFyZWQgb2JqZWN0cy4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0NPTkZMSUNUCTB4NzAwMDAwMDIKLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgZ2xvYmFsIHBvaW50ZXIgdGFibGUuICAqLwotI2RlZmluZSBTSFRfTUlQU19HUFRBQgkJMHg3MDAwMDAwMwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIG1pY3JvY29kZSBpbmZvcm1hdGlvbi4gIFRoZSBleGFjdCBmb3JtYXQgaXMKLSAgIHVuc3BlY2lmaWVkLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfVUNPREUJCTB4NzAwMDAwMDQKLQotLyogU2VjdGlvbiBjb250YWlucyBzb21lIHNvcnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhlIGV4YWN0Ci0gICBmb3JtYXQgaXMgdW5zcGVjaWZpZWQuICBJdCdzIHByb2JhYmx5IEVDT0ZGIHN5bWJvbHMuICAqLwotI2RlZmluZSBTSFRfTUlQU19ERUJVRwkJMHg3MDAwMDAwNQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfUkVHSU5GTwkweDcwMDAwMDA2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QQUNLQUdFCTB4NzAwMDAwMDcKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1BBQ0tTWU0JMHg3MDAwMDAwOAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUkVMRAkJMHg3MDAwMDAwOQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGludGVyZmFjZSBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0lGQUNFCQkweDcwMDAwMDBiCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgZGVzY3JpcHRpb24gb2YgY29udGVudHMgb2YgYW5vdGhlciBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfQ09OVEVOVAkweDcwMDAwMDBjCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgbWlzY2VsbGFuZW91cyBvcHRpb25zLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfT1BUSU9OUwkweDcwMDAwMDBkCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19TSERSCQkweDcwMDAwMDEwCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19GREVTQwkJMHg3MDAwMDAxMQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfRVhUU1lNCQkweDcwMDAwMDEyCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERU5TRQkJMHg3MDAwMDAxMwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUERFU0MJCTB4NzAwMDAwMTQKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0xPQ1NZTQkJMHg3MDAwMDAxNQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfQVVYU1lNCQkweDcwMDAwMDE2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19PUFRTWU0JCTB4NzAwMDAwMTcKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0xPQ1NUUgkJMHg3MDAwMDAxOAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfTElORQkJMHg3MDAwMDAxOQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUkZERVNDCQkweDcwMDAwMDFhCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERUxUQVNZTQkweDcwMDAwMDFiCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERUxUQUlOU1QJMHg3MDAwMDAxYwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfREVMVEFDTEFTUwkweDcwMDAwMDFkCi0KLS8qIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfRFdBUkYJCTB4NzAwMDAwMWUKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBREVDTAkweDcwMDAwMDFmCi0KLS8qIExpc3Qgb2YgbGlicmFyaWVzIHRoZSBiaW5hcnkgZGVwZW5kcyBvbi4gIEluY2x1ZGVzIGEgdGltZSBzdGFtcCwgdmVyc2lvbgotICAgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfU1lNQk9MX0xJQgkweDcwMDAwMDIwCi0KLS8qIEV2ZW50cyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfRVZFTlRTCQkweDcwMDAwMDIxCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19UUkFOU0xBVEUJMHg3MDAwMDAyMgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUElYSUUJCTB4NzAwMDAwMjMKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1hMQVRFCQkweDcwMDAwMDI0Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19YTEFURV9ERUJVRwkweDcwMDAwMDI1Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19XSElSTAkJMHg3MDAwMDAyNgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfRUhfUkVHSU9OCTB4NzAwMDAwMjcKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1hMQVRFX09MRAkweDcwMDAwMDI4Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OCTB4NzAwMDAwMjkKLQotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19MSUJMSVNUIGNvbnRhaW5zIGFuIGFycmF5IG9mIHRoZQotICAgZm9sbG93aW5nIHN0cnVjdHVyZS4gIFRoZSBzaF9saW5rIGZpZWxkIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZQotICAgc3RyaW5nIHRhYmxlLiAgVGhlIHNoX2luZm8gZmllbGQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZQotICAgc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBTdHJpbmcgdGFibGUgaW5kZXggZm9yIG5hbWUgb2Ygc2hhcmVkIG9iamVjdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF9uYW1lOwotICAvKiBUaW1lIHN0YW1wLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX3RpbWVfc3RhbXA7Ci0gIC8qIENoZWNrc3VtIG9mIHN5bWJvbCBuYW1lcyBhbmQgY29tbW9uIHNpemVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX2NoZWNrc3VtOwotICAvKiBTdHJpbmcgdGFibGUgaW5kZXggZm9yIHZlcnNpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGxfdmVyc2lvbjsKLSAgLyogRmxhZ3MuICAqLwotICB1bnNpZ25lZCBsb25nIGxfZmxhZ3M7Ci19IEVsZjMyX0xpYjsKLQotLyogVGhlIGV4dGVybmFsIHZlcnNpb24gb2YgRWxmMzJfTGliLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbF9uYW1lWzRdOwotICB1bnNpZ25lZCBjaGFyIGxfdGltZV9zdGFtcFs0XTsKLSAgdW5zaWduZWQgY2hhciBsX2NoZWNrc3VtWzRdOwotICB1bnNpZ25lZCBjaGFyIGxfdmVyc2lvbls0XTsKLSAgdW5zaWduZWQgY2hhciBsX2ZsYWdzWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9MaWI7Ci0KLS8qIFRoZSBsX2ZsYWdzIGZpZWxkIG9mIGFuIEVsZjMyX0xpYiBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gdGhlCi0gICBmb2xsb3dpbmcgZmxhZ3MuICAqLwotCi0vKiBSZXF1aXJlIGFuIGV4YWN0IG1hdGNoIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBMTF9FWEFDVF9NQVRDSAkJMHgwMDAwMDAwMQotCi0vKiBJZ25vcmUgdmVyc2lvbiBpbmNvbXBhdGliaWxpdGllcyBhdCBydW50aW1lLiAgKi8KLSNkZWZpbmUgTExfSUdOT1JFX0lOVF9WRVIJMHgwMDAwMDAwMgotCi0vKiBSZXF1aXJlIG1hdGNoaW5nIG1pbm9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSNkZWZpbmUgTExfUkVRVUlSRV9NSU5PUgkweDAwMDAwMDA0Ci0KLS8qID8/PyAqLwotI2RlZmluZSBMTF9FWFBPUlRTCQkweDAwMDAwMDA4Ci0KLS8qIERlbGF5IGxvYWRpbmcgb2YgdGhpcyBsaWJyYXJ5IHVudGlsIHJlYWxseSBuZWVkZWQuICAqLwotI2RlZmluZSBMTF9ERUxBWV9MT0FECQkweDAwMDAwMDEwCi0KLS8qID8/PyBEZWx0YSBDKysgc3R1ZmYgPz8/ICovCi0jZGVmaW5lIExMX0RFTFRBCQkweDAwMDAwMDIwCi0KLQotLyogQSBzZWN0aW9uIG9mIHR5cGUgU0hUX01JUFNfQ09ORkxJQ1QgaXMgYW4gYXJyYXkgb2YgaW5kaWNlcyBpbnRvIHRoZQotICAgLmR5bnN5bSBzZWN0aW9uLiAgRWFjaCBlbGVtZW50IGhhcyB0aGUgZm9sbG93aW5nIHR5cGUuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIEVsZjMyX0NvbmZsaWN0OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEVsZjMyX0V4dGVybmFsX0NvbmZsaWN0WzRdOwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgRWxmNjRfQ29uZmxpY3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgRWxmNjRfRXh0ZXJuYWxfQ29uZmxpY3RbOF07Ci0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX0dQVEFCIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGhvdwotICAgbXVjaCBHUCBzcGFjZSB3b3VsZCBiZSByZXF1aXJlZCBmb3IgZGlmZmVyZW50IC1HIGFyZ3VtZW50cy4gIFRoaXMKLSAgIGluZm9ybWF0aW9uIGlzIG9ubHkgdXNlZCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIHByb3ZpZGUgaW5mb3JtYXRpdmUKLSAgIHN1Z2dlc3Rpb25zIGFzIHRvIHRoZSBiZXN0IC1HIHZhbHVlIHRvIHVzZS4gIFRoZSBzaF9pbmZvIGZpZWxkIGlzCi0gICB0aGUgaW5kZXggb2YgdGhlIHNlY3Rpb24gZm9yIHdoaWNoIHRoaXMgaW5mb3JtYXRpb24gYXBwbGllcy4gIFRoZQotICAgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXJlIGFuIGFycmF5IG9mIHRoZSBmb2xsb3dpbmcgdW5pb24uICBUaGUKLSAgIGZpcnN0IGVsZW1lbnQgdXNlcyB0aGUgZ3RfaGVhZGVyIGZpZWxkLiAgVGhlIHJlbWFpbmluZyBlbGVtZW50cyB1c2UKLSAgIHRoZSBndF9lbnRyeSBmaWVsZC4gICovCi10eXBlZGVmIHVuaW9uCi17Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIC1HIHZhbHVlIGFjdHVhbGx5IHVzZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBndF9jdXJyZW50X2dfdmFsdWU7Ci0gICAgICAvKiBVbnVzZWQuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBndF91bnVzZWQ7Ci0gICAgfSBndF9oZWFkZXI7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgLUcgYXJndW1lbnQgaGFzIGJlZW4gdXNlZC4uLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgZ3RfZ192YWx1ZTsKLSAgICAgIC8qIC4uLnRoaXMgbWFueSBHUCBzZWN0aW9uIGJ5dGVzIHdvdWxkIGJlIHJlcXVpcmVkLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgZ3RfYnl0ZXM7Ci0gICAgfSBndF9lbnRyeTsKLX0gRWxmMzJfZ3B0YWI7Ci0KLS8qIFRoZSBleHRlcm5hbCB2ZXJzaW9uIG9mIEVsZjMyX2dwdGFiLiAgKi8KLQotdHlwZWRlZiB1bmlvbgotewotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGd0X2N1cnJlbnRfZ192YWx1ZVs0XTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfdW51c2VkWzRdOwotICAgIH0gZ3RfaGVhZGVyOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGd0X2dfdmFsdWVbNF07Ci0gICAgICB1bnNpZ25lZCBjaGFyIGd0X2J5dGVzWzRdOwotICAgIH0gZ3RfZW50cnk7Ci19IEVsZjMyX0V4dGVybmFsX2dwdGFiOwotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19SRUdJTkZPIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLSAgIHN0cnVjdHVyZS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfZ3BybWFzazsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2Nwcm1hc2tbNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgbG9uZyByaV9ncF92YWx1ZTsKLX0gRWxmMzJfUmVnSW5mbzsKLQotLyogVGhlIGV4dGVybmFsIHZlcnNpb24gb2YgdGhlIEVsZl9SZWdJbmZvIHN0cnVjdHVyZS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIHJpX2dwcm1hc2tbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcmlfY3BybWFza1s0XVs0XTsKLSAgdW5zaWduZWQgY2hhciByaV9ncF92YWx1ZVs0XTsKLX0gRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbzsKLQotLyogTUlQUyBFTEYgLnJlZ2luZm8gc3dhcHBpbmcgcm91dGluZXMuICAqLwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICosIEVsZjMyX1JlZ0luZm8gKikpOwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfUmVnSW5mbyAqLCBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopKTsKLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogVGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gdGhlIGdsb2JhbCBkYXRhIGFyZWEuICAqLwotI2RlZmluZSBTSEZfTUlQU19HUFJFTAkJMHgxMDAwMDAwMAotCi0vKiBUaGlzIHNlY3Rpb24gc2hvdWxkIGJlIG1lcmdlZC4gICovCi0jZGVmaW5lIFNIRl9NSVBTX01FUkdFCQkweDIwMDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBjb250YWlucyAzMiBiaXQgYWRkcmVzc2VzLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfQUREUjMyCQkweDQwMDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBjb250YWlucyA2NCBiaXQgYWRkcmVzc2VzLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfQUREUjY0CQkweDgwMDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBtYXkgbm90IGJlIHN0cmlwcGVkLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfTk9TVFJJUAkweDA4MDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBpcyBsb2NhbCB0byB0aHJlYWRzLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfTE9DQUwJCTB4MDQwMDAwMDAKLQotLyogTGlua2VyIHNob3VsZCBnZW5lcmF0ZSBpbXBsaWNpdCB3ZWFrIG5hbWVzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotI2RlZmluZSBTSEZfTUlQU19OQU1FUwkJMHgwMjAwMDAwMAotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHByb2dyYW0gaGVhZGVyIHR5cGVzLiAgKi8KLQotLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICBJZGVudGlmaWVzIG9uZSAucmVnaW5mbyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgUFRfTUlQU19SRUdJTkZPCQkweDcwMDAwMDAwCi0KLS8qIFJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlLiAgKi8KLSNkZWZpbmUgUFRfTUlQU19SVFBST0MJCTB4NzAwMDAwMDEKLQotLyogT3B0aW9ucyAoZm9yIHdoYXQgPz8/KS4gICovCi0jZGVmaW5lIFBUX01JUFNfT1BUSU9OUwkJMHg3MDAwMDAwMgotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIGR5bmFtaWMgYXJyYXkgdGFncy4gICovCi0KLS8qIDMyIGJpdCB2ZXJzaW9uIG51bWJlciBmb3IgcnVudGltZSBsaW5rZXIgaW50ZXJmYWNlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19STERfVkVSU0lPTgkweDcwMDAwMDAxCi0KLS8qIFRpbWUgc3RhbXAuICAqLwotI2RlZmluZSBEVF9NSVBTX1RJTUVfU1RBTVAJMHg3MDAwMDAwMgotCi0vKiBDaGVja3N1bSBvZiBleHRlcm5hbCBzdHJpbmdzIGFuZCBjb21tb24gc2l6ZXMuICAqLwotI2RlZmluZSBEVF9NSVBTX0lDSEVDS1NVTQkweDcwMDAwMDAzCi0KLS8qIEluZGV4IG9mIHZlcnNpb24gc3RyaW5nIGluIHN0cmluZyB0YWJsZS4gICovCi0jZGVmaW5lIERUX01JUFNfSVZFUlNJT04JMHg3MDAwMDAwNAotCi0vKiAzMiBiaXRzIG9mIGZsYWdzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19GTEFHUwkJMHg3MDAwMDAwNQotCi0vKiBCYXNlIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQuICAqLwotI2RlZmluZSBEVF9NSVBTX0JBU0VfQUREUkVTUwkweDcwMDAwMDA2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX01TWU0JCTB4NzAwMDAwMDcKLQotLyogQWRkcmVzcyBvZiAuY29uZmxpY3Qgc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwOAotCi0vKiBBZGRyZXNzIG9mIC5saWJsaXN0IHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0xJQkxJU1QJCTB4NzAwMDAwMDkKLQotLyogTnVtYmVyIG9mIGxvY2FsIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcy4gICovCi0jZGVmaW5lIERUX01JUFNfTE9DQUxfR09UTk8JMHg3MDAwMDAwYQotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgLmNvbmZsaWN0IHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0NPTkZMSUNUTk8JMHg3MDAwMDAwYgotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgLmxpYmxpc3Qgc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfTElCTElTVE5PCTB4NzAwMDAwMTAKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfU1lNVEFCTk8JMHg3MDAwMDAxMQotCi0vKiBJbmRleCBvZiBmaXJzdCBleHRlcm5hbCBkeW5hbWljIHN5bWJvbCBub3QgcmVmZXJlbmNlZCBsb2NhbGx5LiAgKi8KLSNkZWZpbmUgRFRfTUlQU19VTlJFRkVYVE5PCTB4NzAwMDAwMTIKLQotLyogSW5kZXggb2YgZmlyc3QgZHluYW1pYyBzeW1ib2wgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0jZGVmaW5lIERUX01JUFNfR09UU1lNCQkweDcwMDAwMDEzCi0KLS8qIE51bWJlciBvZiBwYWdlIHRhYmxlIGVudHJpZXMgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0jZGVmaW5lIERUX01JUFNfSElQQUdFTk8JMHg3MDAwMDAxNAotCi0vKiBBZGRyZXNzIG9mIHJ1biB0aW1lIGxvYWRlciBtYXAsIHVzZWQgZm9yIGRlYnVnZ2luZy4gICovCi0jZGVmaW5lIERUX01JUFNfUkxEX01BUAkJMHg3MDAwMDAxNgotCi0vKiBEZWx0YSBDKysgY2xhc3MgZGVmaW5pdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1MJMHg3MDAwMDAxNwotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX0NMQVNTLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU19OTwkweDcwMDAwMDE4Ci0KLS8qIERlbHRhIEMrKyBjbGFzcyBpbnN0YW5jZXMuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFCTB4NzAwMDAwMTkKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gRFRfTUlQU19ERUxUQV9JTlNUQU5DRS4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfSU5TVEFOQ0VfTk8JMHg3MDAwMDAxYQotCi0vKiBEZWx0YSByZWxvY2F0aW9ucy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfUkVMT0MJMHg3MDAwMDAxYgotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX1JFTE9DLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQ19OTwkweDcwMDAwMDFjCi0KLS8qIERlbHRhIHN5bWJvbHMgdGhhdCBEZWx0YSByZWxvY2F0aW9ucyByZWZlciB0by4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfU1lNCTB4NzAwMDAwMWQKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gRFRfTUlQU19ERUxUQV9TWU0uICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX1NZTV9OTwkweDcwMDAwMDFlCi0KLS8qIERlbHRhIHN5bWJvbHMgdGhhdCBob2xkIGNsYXNzIGRlY2xhcmF0aW9ucy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NTWU0JMHg3MDAwMDAyMAotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU1NZTV9OTwkweDcwMDAwMDIxCi0KLS8qIEZsYWdzIGluZGljYXRpbmcgaW5mb3JtYXRpb24gYWJvdXQgQysrIGZsYXZvci4gICovCi0jZGVmaW5lIERUX01JUFNfQ1hYX0ZMQUdTCTB4NzAwMDAwMjIKLQotLyogUGl4aWUgaW5mb3JtYXRpb24gKD8/PykuICAqLwotI2RlZmluZSBEVF9NSVBTX1BJWElFX0lOSVQJMHg3MDAwMDAyMwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19TWU1CT0xfTElCCTB4NzAwMDAwMjQKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfTE9DQUxQQUdFX0dPVElEWAkweDcwMDAwMDI1Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX0xPQ0FMX0dPVElEWAkweDcwMDAwMDI2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX0hJRERFTl9HT1RJRFgJMHg3MDAwMDAyNwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19QUk9URUNURURfR09USURYCTB4NzAwMDAwMjgKLQotLyogQWRkcmVzcyBvZiBgLk1JUFMub3B0aW9ucycuICAqLwotI2RlZmluZSBEVF9NSVBTX09QVElPTlMJCTB4NzAwMDAwMjkKLQotLyogQWRkcmVzcyBvZiBgLmludGVyZmFjZScuICAqLwotI2RlZmluZSBEVF9NSVBTX0lOVEVSRkFDRQkweDcwMDAwMDJhCi0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX0RZTlNUUl9BTElHTgkweDcwMDAwMDJiCi0KLS8qIFNpemUgb2YgdGhlIC5pbnRlcmZhY2Ugc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfSU5URVJGQUNFX1NJWkUJMHg3MDAwMDAyYwotCi0vKiBTaXplIG9mIHJsZF90ZXh0X3Jlc29sdmUgZnVuY3Rpb24gc3RvcmVkIGluIHRoZSBHT1QuICAqLwotI2RlZmluZSBEVF9NSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUgkweDcwMDAwMDJkCi0KLS8qIERlZmF1bHQgc3VmZml4IG9mIERTTyB0byBiZSBhZGRlZCBieSBybGQgb24gZGxvcGVuKCkgY2FsbHMuICAqLwotI2RlZmluZSBEVF9NSVBTX1BFUkZfU1VGRklYCTB4NzAwMDAwMmUKLQotLyogU2l6ZSBvZiBjb21wYWN0IHJlbG9jYXRpb24gc2VjdGlvbiAoTzMyKS4gICovCi0jZGVmaW5lIERUX01JUFNfQ09NUEFDVF9TSVpFCTB4NzAwMDAwMmYKLQotLyogR1AgdmFsdWUgZm9yIGF1eGlsaWFyeSBHT1RzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19HUF9WQUxVRQkweDcwMDAwMDMwCi0KLS8qIEFkZHJlc3Mgb2YgYXV4aWxpYXJ5IC5keW5hbWljLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19BVVhfRFlOQU1JQwkweDcwMDAwMDMxCi0MCi0vKiBGbGFncyB3aGljaCBtYXkgYXBwZWFyIGluIGEgRFRfTUlQU19GTEFHUyBlbnRyeS4gICovCi0KLS8qIE5vIGZsYWdzLiAgKi8KLSNkZWZpbmUgUkhGX05PTkUJCTB4MDAwMDAwMDAKLQotLyogVXNlcyBzaG9ydGN1dCBwb2ludGVycy4gICovCi0jZGVmaW5lIFJIRl9RVUlDS1NUQVJUCQkweDAwMDAwMDAxCi0KLS8qIEhhc2ggc2l6ZSBpcyBub3QgYSBwb3dlciBvZiB0d28uICAqLwotI2RlZmluZSBSSEZfTk9UUE9UCQkweDAwMDAwMDAyCi0KLS8qIElnbm9yZSBMRF9MSUJSQVJZX1BBVEguICAqLwotI2RlZmluZSBSSFNfTk9fTElCUkFSWV9SRVBMQUNFTUVOVCBcCi0JCQkJMHgwMDAwMDAwNAotCi0jZGVmaW5lIFJIRl9OT19NT1ZFCQkgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFJIRl9TR0lfT05MWQkJICAgMHgwMDAwMDAxMAotI2RlZmluZSBSSEZfR1VBUkFOVEVFX0lOSVQJICAgMHgwMDAwMDAyMAotI2RlZmluZSBSSEZfREVMVEFfQ19QTFVTX1BMVVMJICAgMHgwMDAwMDA0MAotI2RlZmluZSBSSEZfR1VBUkFOVEVFX1NUQVJUX0lOSVQgICAweDAwMDAwMDgwCi0jZGVmaW5lIFJIRl9QSVhJRQkJICAgMHgwMDAwMDEwMAotI2RlZmluZSBSSEZfREVGQVVMVF9ERUxBWV9MT0FECSAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVAkgICAweDAwMDAwNDAwCi0jZGVmaW5lIFJIRl9SRVFVSUNLU1RBUlRFRAkgICAweDAwMDAwODAwCi0jZGVmaW5lIFJIRl9DT1JECQkgICAweDAwMDAxMDAwCi0jZGVmaW5lIFJIRl9OT19VTlJFU19VTkRFRgkgICAweDAwMDAyMDAwCi0jZGVmaW5lIFJIRl9STERfT1JERVJfU0FGRQkgICAweDAwMDA0MDAwCi0MCi0vKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHN0X290aGVyIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUuICBUaGVzZQotICAgYXJlIHVzZWQgaW4gYW4gSXJpeCA1IGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLQotI2RlZmluZSBTVE9fREVGQVVMVAkJMHgwMAotI2RlZmluZSBTVE9fSU5URVJOQUwJCTB4MDEKLSNkZWZpbmUgU1RPX0hJRERFTgkJMHgwMgotI2RlZmluZSBTVE9fUFJPVEVDVEVECQkweDAzCi0KLS8qIFRoaXMgdmFsdWUgaXMgdXNlZCBmb3IgYSBtaXBzMTYgLnRleHQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgU1RPX01JUFMxNgkJMHhmMAotDAotLyogVGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkgdXNlcyBhbiB1bnVzdWFsIHJlbG9jIGZvcm1hdC4gIEVhY2gKLSAgIHJlbG9jYXRpb24gZW50cnkgc3BlY2lmaWVzIHVwIHRvIHRocmVlIGFjdHVhbCByZWxvY2F0aW9ucywgYWxsIGF0Ci0gICB0aGUgc2FtZSBhZGRyZXNzLiAgVGhlIGZpcnN0IHJlbG9jYXRpb24gd2hpY2ggcmVxdWlyZWQgYSBzeW1ib2wKLSAgIHVzZXMgdGhlIHN5bWJvbCBpbiB0aGUgcl9zeW0gZmllbGQuICBUaGUgc2Vjb25kIHJlbG9jYXRpb24gd2hpY2gKLSAgIHJlcXVpcmVzIGEgc3ltYm9sIHVzZXMgdGhlIHN5bWJvbCBpbiB0aGUgcl9zc3ltIGZpZWxkLiAgSWYgYWxsCi0gICB0aHJlZSByZWxvY2F0aW9ucyByZXF1aXJlIGEgc3ltYm9sLCB0aGUgdGhpcmQgb25lIHVzZXMgYSB6ZXJvCi0gICB2YWx1ZS4gICovCi0KLS8qIEFuIGVudHJ5IGluIGEgNjQgYml0IFNIVF9SRUwgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07Ci0gIC8qIFN5bWJvbCBpbmRleC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zeW1bNF07Ci0gIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3NzeW1bMV07Ci0gIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTNbMV07Ci0gIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUyWzFdOwotICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGVbMV07Ci19IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLwotICBiZmRfdm1hIHJfb2Zmc2V0OwotICAvKiBTeW1ib2wgaW5kZXguICAqLwotICB1bnNpZ25lZCBsb25nIHJfc3ltOwotICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zc3ltOwotICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUzOwotICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMjsKLSAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlOwotfSBFbGY2NF9NaXBzX0ludGVybmFsX1JlbDsKLQotLyogQW4gZW50cnkgaW4gYSA2NCBiaXQgU0hUX1JFTEEgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07Ci0gIC8qIFN5bWJvbCBpbmRleC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zeW1bNF07Ci0gIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3NzeW1bMV07Ci0gIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTNbMV07Ci0gIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUyWzFdOwotICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGVbMV07Ci0gIC8qIEFkZGVuZC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9hZGRlbmRbOF07Ci19IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KLSAgYmZkX3ZtYSByX29mZnNldDsKLSAgLyogU3ltYm9sIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgbG9uZyByX3N5bTsKLSAgLyogU3BlY2lhbCBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3N5bTsKLSAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMzsKLSAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTI7Ci0gIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTsKLSAgLyogQWRkZW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgcl9hZGRlbmQ7Ci19IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYTsKLQotLyogVmFsdWVzIGZvdW5kIGluIHRoZSByX3NzeW0gZmllbGQgb2YgYSByZWxvY2F0aW9uIGVudHJ5LiAgKi8KLQotLyogTm8gcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIFJTU19VTkRFRgkwCi0KLS8qIFZhbHVlIG9mIEdQLiAgKi8KLSNkZWZpbmUgUlNTX0dQCQkxCi0KLS8qIFZhbHVlIG9mIEdQIGluIG9iamVjdCBiZWluZyByZWxvY2F0ZWQuICAqLwotI2RlZmluZSBSU1NfR1AwCQkyCi0KLS8qIEFkZHJlc3Mgb2YgbG9jYXRpb24gYmVpbmcgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgUlNTX0xPQwkJMwotDAotLyogQSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24gY29udGFpbnMgYSBzZXJpZXMgb2Ygb3B0aW9ucywgZWFjaCBvZgotICAgd2hpY2ggc3RhcnRzIHdpdGggdGhpcyBoZWFkZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUeXBlIG9mIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIga2luZFsxXTsKLSAgLyogU2l6ZSBvZiBvcHRpb24gZGVzY3JpcHRvciwgaW5jbHVkaW5nIGhlYWRlci4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2l6ZVsxXTsKLSAgLyogU2VjdGlvbiBpbmRleCBvZiBhZmZlY3RlZCBzZWN0aW9uLCBvciAwIGZvciBnbG9iYWwgb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzZWN0aW9uWzJdOwotICAvKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGlzIGtpbmQgb2Ygb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBpbmZvWzRdOwotfSBFbGZfRXh0ZXJuYWxfT3B0aW9uczsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVHlwZSBvZiBvcHRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIGtpbmQ7Ci0gIC8qIFNpemUgb2Ygb3B0aW9uIGRlc2NyaXB0b3IsIGluY2x1ZGluZyBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gIC8qIFNlY3Rpb24gaW5kZXggb2YgYWZmZWN0ZWQgc2VjdGlvbiwgb3IgMCBmb3IgZ2xvYmFsIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIHNob3J0IHNlY3Rpb247Ci0gIC8qIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMga2luZCBvZiBvcHRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGluZm87Ci19IEVsZl9JbnRlcm5hbF9PcHRpb25zOwotCi0vKiBNSVBTIEVMRiBvcHRpb24gaGVhZGVyIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9PcHRpb25zICosIEVsZl9JbnRlcm5hbF9PcHRpb25zICopKTsKLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqLCBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSk7Ci0KLS8qIFZhbHVlcyB3aGljaCBtYXkgYXBwZWFyIGluIHRoZSBraW5kIGZpZWxkIG9mIGFuIEVsZl9PcHRpb25zCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0vKiBVbmRlZmluZWQuICAqLwotI2RlZmluZSBPREtfTlVMTAkwCi0KLS8qIFJlZ2lzdGVyIHVzYWdlIGFuZCBHUCB2YWx1ZS4gICovCi0jZGVmaW5lIE9ES19SRUdJTkZPCTEKLQotLyogRXhjZXB0aW9uIHByb2Nlc3NpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBPREtfRVhDRVBUSU9OUwkyCi0KLS8qIFNlY3Rpb24gcGFkZGluZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIE9ES19QQUQJCTMKLQotLyogSGFyZHdhcmUgd29ya2Fyb3VuZHMgcGVyZm9ybWVkLiAgKi8KLSNkZWZpbmUgT0RLX0hXUEFUQ0gJNAotCi0vKiBGaWxsIHZhbHVlIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0jZGVmaW5lIE9ES19GSUxMCTUKLQotLyogUmVzZXJ2ZWQgc3BhY2UgZm9yIGRlc2t0b3AgdG9vbHMuICAqLwotI2RlZmluZSBPREtfVEFHUwk2Ci0KLS8qIEhhcmR3YXJlIHdvcmthcm91bmRzLCBBTkQgYml0cyB3aGVuIG1lcmdpbmcuICAqLwotI2RlZmluZSBPREtfSFdBTkQJNwotCi0vKiBIYXJkd2FyZSB3b3JrYXJvdW5kcywgT1IgYml0cyB3aGVuIG1lcmdpbmcuICAqLwotI2RlZmluZSBPREtfSFdPUgk4Ci0KLS8qIEdQIGdyb3VwIHRvIHVzZSBmb3IgdGV4dC9kYXRhIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgT0RLX0dQX0dST1VQCTkKLQotLyogSUQgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBPREtfSURFTlQJMTAKLQotLyogSW4gdGhlIDMyIGJpdCBBQkksIGFuIE9ES19SRUdJTkZPIG9wdGlvbiBpcyBqdXN0IGEgRWxmMzJfUmVnSW5mbwotICAgc3RydWN0dXJlLiAgSW4gdGhlIDY0IGJpdCBBQkksIGl0IGlzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLiAgVGhlCi0gICBpbmZvIGZpZWxkIG9mIHRoZSBvcHRpb25zIGhlYWRlciBpcyBub3QgdXNlZC4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgY2hhciByaV9ncHJtYXNrWzRdOwotICAvKiBQYWRkaW5nLiAgKi8KLSAgdW5zaWduZWQgY2hhciByaV9wYWRbNF07Ci0gIC8qIE1hc2sgb2YgY28tcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgY2hhciByaV9jcHJtYXNrWzRdWzRdOwotICAvKiBHUCByZWdpc3RlciB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgcmlfZ3BfdmFsdWVbOF07Ci19IEVsZjY0X0V4dGVybmFsX1JlZ0luZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOwotICAvKiBQYWRkaW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9wYWQ7Ci0gIC8qIE1hc2sgb2YgY28tcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9jcHJtYXNrWzRdOwotICAvKiBHUCByZWdpc3RlciB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIGJmZF92bWEgcmlfZ3BfdmFsdWU7Ci19IEVsZjY0X0ludGVybmFsX1JlZ0luZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRoZSBoYXNoIHZhbHVlIGNvbXB1dGVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgZHluYW1pYyBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIG1zX2hhc2hfdmFsdWVbNF07Ci0gIC8qIENvbnRhaW5zIGJvdGggdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmRleCBhbmQgdGhlIHN5bWJvbCBmbGFncwotICAgICBmaWVsZC4gIFRoZSBtYWNyb3MgRUxGMzJfTVNfUkVMX0lOREVYIGFuZCBFTEYzMl9NU19GTEFHUyBhcmUgdXNlZAotICAgICB0byBhY2Nlc3MgdGhlIGluZGl2aWR1YWwgdmFsdWVzLiAgVGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmRleAotICAgICBpZGVudGlmaWVzIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgLnJlbC5keW4gc2VjdGlvbiB0aGF0Ci0gICAgIHJlZmVyZW5jZXMgdGhlIGR5bmFtaWMgc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtc3ltIGVudHJ5LgotICAgICBJZiB0aGUgaW5kZXggaXMgMCwgbm8gZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICBzeW1ib2wuICBUaGUgc3ltYm9sIGZsYWdzIGZpZWxkIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtc19pbmZvWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9Nc3ltOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgaGFzaCB2YWx1ZSBjb21wdXRlZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtc19oYXNoX3ZhbHVlOwotICAvKiBDb250YWlucyBib3RoIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gaW5kZXggYW5kIHRoZSBzeW1ib2wgZmxhZ3MKLSAgICAgZmllbGQuICBUaGUgbWFjcm9zIEVMRjMyX01TX1JFTF9JTkRFWCBhbmQgRUxGMzJfTVNfRkxBR1MgYXJlIHVzZWQKLSAgICAgdG8gYWNjZXNzIHRoZSBpbmRpdmlkdWFsIHZhbHVlcy4gIFRoZSBkeW5hbWljIHJlbG9jYXRpb24gaW5kZXgKLSAgICAgaWRlbnRpZmllcyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIC5yZWwuZHluIHNlY3Rpb24gdGhhdAotICAgICByZWZlcmVuY2VzIHRoZSBkeW5hbWljIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbXN5bSBlbnRyeS4KLSAgICAgSWYgdGhlIGluZGV4IGlzIDAsIG5vIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgc3ltYm9sLiAgVGhlIHN5bWJvbCBmbGFncyBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbXNfaW5mbzsKLX0gRWxmMzJfSW50ZXJuYWxfTXN5bTsKLQotI2RlZmluZSBFTEYzMl9NU19SRUxfSU5ERVgoaSkgKChpKSA+PiA4KQotI2RlZmluZSBFTEYzMl9NU19GTEFHUyhpKSAgICAgKGkpICYgMHhmZikKLSNkZWZpbmUgRUxGMzJfTVNfSU5GTyhyLCBmKSAgICgoKHIpIDw8IDgpICsgKChmKSAmIDB4ZmYpKQotCi0vKiBNSVBTIEVMRiByZWdpbmZvIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqLCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKiwgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKSk7Ci0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JrIG9mIGFuIE9ES19FWENFUFRJT05TIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPRVhfRlBVX01JTgkweDFmCS8qIEZQRXMgd2hpY2ggbXVzdCBiZSBlbmFibGVkLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9NQVgJMHgxZjAwCS8qIEZQRXMgd2hpY2ggbWF5IGJlIGVuYWJsZWQuICAqLwotI2RlZmluZSBPRVhfUEFHRTAJMHgxMDAwMAkvKiBQYWdlIHplcm8gbXVzdCBiZSBtYXBwZWQuICAqLwotI2RlZmluZSBPRVhfU01NCQkweDIwMDAwCS8qIEZvcmNlIHNlcXVlbnRpYWwgbWVtb3J5IG1vZGUuICAqLwotI2RlZmluZSBPRVhfRlBEQlVHCTB4NDAwMDAJLyogRm9yY2UgZmxvYXRpbmctcG9pbnQgZGVidWcgbW9kZS4gICovCi0jZGVmaW5lIE9FWF9ESVNNSVNTCTB4ODAwMDAJLyogRGlzbWlzcyBpbnZhbGlkIGFkZHJlc3MgZmF1bHRzLiAgKi8KLQotLyogTWFza3Mgb2YgdGhlIEZQIGV4Y2VwdGlvbnMgZm9yIE9FWF9GUFVfTUlOIGFuZCBPRVhfRlBVX01BWC4gICovCi0jZGVmaW5lIE9FWF9GUFVfSU5WQUwJMHgxMAkvKiBJbnZhbGlkIG9wZXJhdGlvbiBleGNlcHRpb24uICAqLwotI2RlZmluZSBPRVhfRlBVX0RJVjAJMHgwOAkvKiBEaXZpc2lvbiBieSB6ZXJvIGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfT0ZMTwkweDA0CS8qIE92ZXJmbG93IGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfVUZMTwkweDAyCS8qIFVuZGVyZmxvdyBleGNlcHRpb24uICAqLwotI2RlZmluZSBPRVhfRlBVX0lORVgJMHgwMQkvKiBJbmV4YWN0IGV4Y2VwdGlvbi4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19QQUQgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9QQURfUFJFRklYCTB4MDEKLSNkZWZpbmUgT1BBRF9QT1NURklYCTB4MDIKLSNkZWZpbmUgT1BBRF9TWU1CT0wJMHgwNAotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfSFdQQVRDSCBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT0hXX1I0S0VPUAkweDAxCS8qIFI0MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I4S1BGRVRDSAkweDAyCS8qIE1heSBuZWVkIFI4MDAwIHByZWZldGNoIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I1S0VPUAkweDA0CS8qIFI1MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I1S0NWVEwJMHgwOAkvKiBSNTAwMCBjdnQuW2RzXS5sIGJ1ZyAoY2xlYW4gPT0gMSkuICAqLwotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfSURFTlQvT0RLX0dQX0dST1VQIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPR1BfR1JPVVAJMHgwMDAwZmZmZgkvKiBHUCBncm91cCBudW1iZXIuICAqLwotI2RlZmluZSBPR1BfU0VMRgkweGZmZmYwMDAwCS8qIFNlbGYtY29udGFpbmVkIEdQIGdyb3Vwcy4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19IV0FORC9PREtfSFdPUiBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT0hXQTBfUjRLRU9QX0NIRUNLRUQJMHgwMDAwMDAwMQotI2RlZmluZSBPSFdBMF9SNEtFT1BfQ0xFQU4JMHgwMDAwMDAwMgotDAotCi0jZW5kaWYgLyogX0VMRl9NSVBTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21uMTAyMDAuaCBiL2luY2x1ZGUvZWxmL21uMTAyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyOWUwYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tbjEwMjAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBNTjEwMjAwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNTjEwMjAwIEVMRiBBQkkuICovCi0KLSNpZm5kZWYgX0VMRl9NTjEwMjAwX0gKLSNkZWZpbmUgX0VMRl9NTjEwMjAwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21uMTAyMDBfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzE2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF84LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF8yNCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfUENSRUw4LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDE2LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDI0LCA3KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmIC8qIF9FTEZfTU4xMDIwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tbjEwMzAwLmggYi9pbmNsdWRlL2VsZi9tbjEwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTBhMTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogTU4xMDMwMCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTU4xMDMwMCBFTEYgQUJJLiAqLwotCi0jaWZuZGVmIF9FTEZfTU4xMDMwMF9ICi0jZGVmaW5lIF9FTEZfTU4xMDMwMF9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tbjEwMzAwX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF8xNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfOCwgMykKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUwzMiwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUwxNiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUw4LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9HTlVfVlRFTlRSWSwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfMjQsIDkpCi0gIEVNUFRZX1JFTE9DICAoUl9NTjEwMzAwX01BWCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIE1hY2hpbmUgdmFyaWFudCBpZiB3ZSBrbm93IGl0LiAgVGhpcyBmaWVsZCB3YXMgaW52ZW50ZWQgYXQgQ3lnbnVzLAotICAgYnV0IGl0IGlzIGhvcGVkIHRoYXQgb3RoZXIgdmVuZG9ycyB3aWxsIGFkb3B0IGl0LiAgSWYgc29tZSBzdGFuZGFyZAotICAgaXMgZGV2ZWxvcGVkLCB0aGlzIGNvZGUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZm9sbG93IGl0LiAqLwotCi0jZGVmaW5lIEVGX01OMTAzMDBfTUFDSAkJMHgwMEZGMDAwMAotCi0vKiBDeWdudXMgaXMgY2hvb3NpbmcgdmFsdWVzIGJldHdlZW4gODAgYW5kIDlGOwotICAgMDAgLSA3RiBzaG91bGQgYmUgbGVmdCBmb3IgYSBmdXR1cmUgc3RhbmRhcmQ7Ci0gICB0aGUgcmVzdCBhcmUgb3Blbi4gKi8KLQotI2RlZmluZSBFX01OMTAzMDBfTUFDSF9NTjEwMzAwCTB4MDA4MTAwMDAKLSNkZWZpbmUgRV9NTjEwMzAwX01BQ0hfQU0zMwkweDAwODIwMDAwCi0jZW5kaWYgLyogX0VMRl9NTjEwMzAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3BqLmggYi9pbmNsdWRlL2VsZi9wai5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmI4MzA2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3BqLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBwaWNvSmF2YSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9QSl9ICi0jZGVmaW5lIF9FTEZfUEpfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi0KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9wal9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfUEpfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0RBVEFfRElSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9DT0RFX1JFTDMyLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9SRUwxNiwgMykgCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9DT0RFX0RJUjMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9ESVIxNiwgNykgIAotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9MTzE2LCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0NPREVfSEkxNiwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9HTlVfVlRJTkhFUklULCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0dOVV9WVEVOVFJZLCAxNikKLSAgRU1QVFlfUkVMT0MgKFJfUEpfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2RlZmluZSBFRl9QSUNPSkFWQV9BUkNIICAgICAweDAwMDAwMDBmCi0jZGVmaW5lIEVGX1BJQ09KQVZBX05FV0NBTExTIDB4MDAwMDAwMTAKLSNkZWZpbmUgRUZfUElDT0pBVkFfR05VQ0FMTFMgMHgwMDAwMDAyMCAgLyogVGhlIChjdXJyZW50bHkpIG5vbiBzdGFuZGFyZCBHTlUgY2FsbGluZyBjb252ZW50aW9uICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvcHBjLmggYi9pbmNsdWRlL2VsZi9wcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxMTZkOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9wcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiBQUEMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQsIDxtZWlzc25lckBjeWdudXMuY29tPiwgZnJvbSBpbmZvcm1hdGlvbgotICAgaW4gdGhlIFN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UsIFBvd2VyUEMgUHJvY2Vzc29yIFN1cHBsZW1lbnQKLSAgIGFuZCB0aGUgUG93ZXJQQyBFbWJlZGRlZCBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlIChlYWJpKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIFBQQyBFTEYgQUJJLiAgTm90ZQotICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCi0KLSNpZm5kZWYgX0VMRl9QUENfSAotI2RlZmluZSBfRUxGX1BQQ19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9wcGNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIzMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMjQsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNl9MTywgNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTZfSEksIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2X0hBLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTRfQlJUQUtFTiwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTRfQlJOVEFLRU4sIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMjQsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0LCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwxNF9CUlRBS0VOLCAxMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwxNF9CUk5UQUtFTiwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTYsIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2X0xPLCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNl9ISSwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTZfSEEsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVFJFTDI0LCAxOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19DT1BZLCAxOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HTE9CX0RBVCwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfSk1QX1NMT1QsIDIxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTEFUSVZFLCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19MT0NBTDI0UEMsIDIzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1VBRERSMzIsIDI0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1VBRERSMTYsIDI1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDMyLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQzMiwgMjcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUUkVMMzIsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDE2X0xPLCAyOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQxNl9ISSwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMTZfSEEsIDMxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NEQVJFTDE2LCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGLCAzMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0xPLCAzNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0hJLCAzNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0hBLCAzNikKLQotLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGZyb20gdGhlIEVtYmVkZGVkIEVMRiBBQkksIGFuZCBhcmUgbm90Ci0gICBpbiB0aGUgU1ZSNCBFTEYgQUJJLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIzMiwgMTAxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2LCAxMDIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTZfTE8sIDEwMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNl9ISSwgMTA0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2X0hBLCAxMDUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQUkxNiwgMTA2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREEySTE2LCAxMDcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQTJSRUwsIDEwOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBMjEsIDEwOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTVJLUkVGLCAxMTApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNFQzE2LCAxMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0xPLCAxMTIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0hJLCAxMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0hBLCAxMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX0JJVF9GTEQsIDExNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU0RBLCAxMTYpCi0KLSAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR05VX1ZUSU5IRVJJVCwgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dOVV9WVEVOVFJZLCAyNTQpCi0KLS8qIFRoaXMgaXMgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgYW55IG9sZCBmYXNoaW9uZWQgVE9DMTYgcmVmZXJlbmNlcwotICAgdGhhdCBtYXkgc3RpbGwgYmUgaW4gb2JqZWN0IGZpbGVzLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19UT0MxNiwgMjU1KQotCi0gIEVNUFRZX1JFTE9DIChSX1BQQ19tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLSNkZWZpbmUJRUZfUFBDX0VNQgkJMHg4MDAwMDAwMAkvKiBQb3dlclBDIGVtYmVkZGVkIGZsYWcgICovCi0KLQkJCQkJCS8qIENZR05VUyBsb2NhbCBiaXRzIGJlbG93ICovCi0jZGVmaW5lCUVGX1BQQ19SRUxPQ0FUQUJMRQkweDAwMDEwMDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZSBmbGFnICovCi0jZGVmaW5lCUVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIJMHgwMDAwODAwMAkvKiBQb3dlclBDIC1tcmVsb2NhdGFibGUtbGliIGZsYWcgKi8KLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gaGVhZGVycywgc2hfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lIFNIVF9PUkRFUkVECQlTSFRfSElQUk9DCS8qIExpbmsgZWRpdG9yIGlzIHRvIHNvcnQgdGhlIFwKLQkJCQkJCSAgIGVudHJpZXMgaW4gdGhpcyBzZWN0aW9uIFwKLQkJCQkJCSAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIFwKLQkJCQkJCSAgIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBcCi0JCQkJCQkgICBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncywgc2hfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBTSEZfRVhDTFVERQkJMHg4MDAwMDAwMAkvKiBMaW5rIGVkaXRvciBpcyB0byBleGNsdWRlIFwKLQkJCQkJCSAgIHRoaXMgc2VjdGlvbiBmcm9tIGV4ZWN1dGFibGUgXAotCQkJCQkJICAgYW5kIHNoYXJlZCBvYmplY3RzIHRoYXQgaXQgXAotCQkJCQkJICAgYnVpbGRzIHdoZW4gdGhvc2Ugb2JqZWN0cyBcCi0JCQkJCQkgICBhcmUgbm90IHRvIGJlIGZ1cmh0ZXIgXAotCQkJCQkJICAgcmVsb2NhdGVkLiAgKi8KLSNlbmRpZiAvKiBfRUxGX1BQQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9yZWxvYy1tYWNyb3MuaCBiL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE3NGNhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIEdlbmVyaWMgcmVsb2NhdGlvbiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSB2YXJpb3VzICouaCB0YXJnZXQgc3BlY2lmaWMgaGVhZGVyCi0gICBmaWxlcyB0byBlaXRoZXIgZ2VuZXJhdGUgYW4gZW51bSBjb250YWluaW5nIGFsbCB0aGUga25vd24gcmVsb2NhdGlvbnMKLSAgIGZvciB0aGF0IHRhcmdldCwgb3IgaWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DIGlzIGRlZmluZWQsIGEgcmVjb2duaXRpb24KLSAgIGZ1bmN0aW9uIGlzIGdlbmVyYXRlZCBpbnN0ZWFkLiAgKFRoaXMgaXMgdXNlZCBieSBiaW51dGlscy9yZWFkZWxmLmMpCi0KLSAgIEdpdmVuIGEgaGVhZGVyIGZpbGUgbGlrZSB0aGlzOgotCi0gICAJU1RBUlRfUkVMT0NfTlVNQkVSUyAoZm9vKQotICAgCSAgICBSRUxPQ19OVU1CRVIgKFJfZm9vX05PTkUsICAgIDApCi0gICAJICAgIFJFTE9DX05VTUJFUiAoUl9mb29fMzIsICAgICAgMSkKLSAgIAkgICAgRkFLRV9SRUxPQyAgIChSX2Zvb19pbGxlZ2FsLCAyKQotICAgCSAgICBFTVBUWV9SRUxPQyAgKFJfZm9vX21heCkKLSAgIAlFTkRfUkVMT0NfTlVNQkVSUwotCi0gICBUaGVuIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBwcm9kdWNlZCBieSBkZWZhdWx0IChpZSBpZgotICAgUkVMT0NfTUFDUk9TX0dFTl9GVU5DIGlzICpub3QqIGRlZmluZWQpLgotCi0gICAJZW51bSBmb28KLQl7Ci0JICBmb28gPSAtMSwKLSAgIAkgIFJfZm9vX05PTkUgPSAwLAotICAgCSAgUl9mb29fMzIgPSAxLAotICAgCSAgUl9mb29faWxsZWdhbCA9IDIsCi0gICAJICBSX2Zvb19tYXgKLSAgIAl9OwotCi0gICBJZiBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgKmlzKiBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhlCi0gICBmb2xsb3dpbmcgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQ6Ci0KLSAgIAlzdGF0aWMgY29uc3QgY2hhciAqIGZvbyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHJ0eXBlKSk7Ci0gICAJc3RhdGljIGNvbnN0IGNoYXIgKgotICAgCWZvbyAocnR5cGUpCi0gICAJICAgIHVuc2lnbmVkIGxvbmcgcnR5cGU7Ci0gICAJewotICAgCSAgIHN3aXRjaCAocnR5cGUpCi0gICAJICAgewotICAgCSAgIGNhc2UgMDogcmV0dXJuICJSX2Zvb19OT05FIjsKLSAgIAkgICBjYXNlIDE6IHJldHVybiAiUl9mb29fMzIiOwotICAgCSAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOwotICAgCSAgIH0KLSAgIAl9Ci0gICAqLwotICAgCi0jaWZuZGVmIF9SRUxPQ19NQUNST1NfSAotI2RlZmluZSBfUkVMT0NfTUFDUk9TX0gKLQotI2lmZGVmIFJFTE9DX01BQ1JPU19HRU5fRlVOQwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSByZWxvY2F0aW9uIG51bWJlciBhbmQgcmV0dXJucyB0aGUKLSAgIHN0cmluZyB2ZXJzaW9uIG5hbWUgb2YgdGhlIG5hbWUgb2YgdGhhdCByZWxvY2F0aW9uLiAgSWYKLSAgIHRoZSByZWxvY2F0aW9uIGlzIG5vdCByZWNvZ25pc2VkLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgCQkJCVwKLXN0YXRpYyBjb25zdCBjaGFyICogbmFtZSAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHJ0eXBlKSk7IAlcCi1zdGF0aWMgY29uc3QgY2hhciAqCQkJCQkJXAotbmFtZSAocnR5cGUpCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIHJ0eXBlOwkJCQkJXAotewkJCQkJCQkJXAotICBzd2l0Y2ggKHJ0eXBlKQkJCQkJCVwKLSAgewotCi0jaWZkZWYgX19TVERDX18JCQkJCSAgCi0jZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICBjYXNlIG51bWJlciA6IHJldHVybiAjbmFtZSA7Ci0jZWxzZQotI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgY2FzZSBudW1iZXIgOiByZXR1cm4gIm5hbWUiIDsKLSNlbmRpZgotCi0jZGVmaW5lIEZBS0VfUkVMT0MobmFtZSwgbnVtYmVyKSAgICAKLSNkZWZpbmUgRU1QVFlfUkVMT0MobmFtZSkKLQkJCQkJICAKLSNkZWZpbmUgRU5EX1JFTE9DX05VTUJFUlMJXAotICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOwlcCi0gIH0JCQkJXAotfQotCi0KLSNlbHNlIC8qIERlZmF1bHQgdG8gZ2VuZXJhdGluZyBlbnVtLiAgKi8KLQotLyogU29tZSBjb21waWxlcnMgY2Fubm90IGNvcGUgd2l0aCBhbiBlbnVtIHRoYXQgZW5kcyB3aXRoIGEgdHJhaWxpbmcKLSAgIGNvbW1hLCBzbyBTVEFSVF9SRUxPQ19OVU1CRVJTIGNyZWF0ZXMgYSBmYWtlIHJlbG9jIGVudHJ5LCAoaW5pdGlhbGlzZWQKLSAgIHRvIC0xIHNvIHRoYXQgdGhlIGZpcnN0IHJlYWwgZW50cnkgd2lsbCBzdGlsbCBkZWZhdWx0IHRvIDApLiAgRnVydGhlcgotICAgZW50cmllcyB0aGVuIHByZXBlbmQgYSBjb21tYSB0byB0aGVpciBkZWZpbml0aW9ucywgY3JlYXRpbmcgYSBsaXN0Ci0gICBvZiBlbnVtZXJhdG9yIGVudHJpZXMgdGhhdCB3aWxsIHNhdGlzZnkgdGhlc2UgY29tcGlsZXJzLiAgKi8KLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgZW51bSBuYW1lIHsgXyMjbmFtZSA9IC0xCi0jZWxzZQotI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgZW51bSBuYW1lIHsgbmFtZSA9IC0xCi0jZW5kaWYKLQkJCQkJCQotI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgLCBuYW1lID0gbnVtYmVyCi0jZGVmaW5lIEZBS0VfUkVMT0MobmFtZSwgbnVtYmVyKSAgICAsIG5hbWUgPSBudW1iZXIgCi0jZGVmaW5lIEVNUFRZX1JFTE9DKG5hbWUpICAgICAgICAgICAsIG5hbWUgCi0jZGVmaW5lIEVORF9SRUxPQ19OVU1CRVJTICAgICAgICAgICB9OwotCi0jZW5kaWYKLQotI2VuZGlmIC8qIFJFTE9DX01BQ1JPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9zaC5oIGIvaW5jbHVkZS9lbGYvc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0NzY2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9zaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogU0ggRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfU0hfSAotI2RlZmluZSBfRUxGX1NIX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotLyogUmVsb2NhdGlvbnMgMjVmZiBhcmUgR05VIGV4dGVuc2lvbnMuCi0gICAyNS4uMzMgYXJlIHVzZWQgZm9yIHJlbGF4YXRpb24gYW5kIHVzZSB0aGUgc2FtZSBjb25zdGFudHMgYXMgQ09GRiB1c2VzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9zaF9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfUkVMMzIsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4V1BOLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfSU5EMTJXLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOFdQTCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXUFosIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4QlAsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4VywgOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhMLCA5KQotICBGQUtFX1JFTE9DIChSX1NIX0ZJUlNUX0lOVkFMSURfUkVMT0MsIDEwKQotICBGQUtFX1JFTE9DIChSX1NIX0xBU1RfSU5WQUxJRF9SRUxPQywgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9TV0lUQ0gxNiwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9TV0lUQ0gzMiwgMjYpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9VU0VTLCAyNykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0NPVU5ULCAyOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0FMSUdOLCAyOSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0NPREUsIDMwKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfREFUQSwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9MQUJFTCwgMzIpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9TV0lUQ0g4LCAzMykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0dOVV9WVElOSEVSSVQsIDM0KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfR05VX1ZURU5UUlksIDM1KQotICBFTVBUWV9SRUxPQyAoUl9TSF9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3NwYXJjLmggYi9pbmNsdWRlL2VsZi9zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTBlNGE4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3NwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyogU1BBUkMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEJ5IERvdWcgRXZhbnMsIEN5Z251cyBTdXBwb3J0LCA8ZGplQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9TUEFSQ19ICi0jZGVmaW5lIF9FTEZfU1BBUkNfSAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBUaGVzZSBhcmUgZGVmaW5lZCBieSBTdW4uICAqLwotCi0jZGVmaW5lIEVGX1NQQVJDXzMyUExVU19NQVNLCTB4ZmZmZjAwCS8qIGJpdHMgaW5kaWNhdGluZyBWOCsgdHlwZSAqLwotI2RlZmluZSBFRl9TUEFSQ18zMlBMVVMJCTB4MDAwMTAwCS8qIGdlbmVyaWMgVjgrIGZlYXR1cmVzICovCi0jZGVmaW5lIEVGX1NQQVJDX1NVTl9VUzEJMHgwMDAyMDAJLyogU3VuIFVsdHJhU1BBUkMxIGV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgRUZfU1BBUkNfSEFMX1IxCQkweDAwMDQwMAkvKiBIQUwgUjEgZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBFRl9TUEFSQ19TVU5fVVMzCTB4MDAwODAwCS8qIFN1biBVbHRyYVNQQVJDSUlJIGV4dGVuc2lvbnMgKi8KLQotI2RlZmluZSBFRl9TUEFSQ19MRURBVEEgICAgICAgICAweDgwMDAwMAkvKiBsaXR0bGUgZW5kaWFuIGRhdGEgKi8KLQotLyogVGhpcyBuYW1lIGlzIHVzZWQgaW4gdGhlIFY5IEFCSS4gICovCi0jZGVmaW5lIEVGX1NQQVJDX0VYVF9NQVNLCTB4ZmZmZjAwCS8qIHJlc2VydmVkIGZvciB2ZW5kb3IgZXh0ZW5zaW9ucyAqLwotCi0vKiBWOSBtZW1vcnkgbW9kZWxzICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfTU0JCTB4MwkJLyogbWVtb3J5IG1vZGVsIG1hc2sgKi8KLSNkZWZpbmUgRUZfU1BBUkNWOV9UU08JCTB4MAkJLyogdG90YWwgc3RvcmUgb3JkZXJpbmcgKi8KLSNkZWZpbmUgRUZfU1BBUkNWOV9QU08JCTB4MQkJLyogcGFydGlhbCBzdG9yZSBvcmRlcmluZyAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X1JNTwkJMHgyCQkvKiByZWxheGVkIHN0b3JlIG9yZGVyaW5nICovCi0KLS8qIFNlY3Rpb24gaW5kaWNlcy4gICovCi0KLSNkZWZpbmUgU0hOX0JFRk9SRQkJMHhmZjAwCQkvKiB1c2VkIHdpdGggU0hGX09SREVSRUQgKi8KLSNkZWZpbmUgU0hOX0FGVEVSCQkweGZmMDEJCS8qIHVzZWQgd2l0aCBTSEZfT1JERVJFRCAqLwotCi0vKiBTZWN0aW9uIGZsYWdzLiAgKi8KLQotI2RlZmluZSBTSEZfRVhDTFVERQkJMHg4MDAwMDAwMAkvKiBleGNsdWRlIGZyb20gbGlua2luZyAqLwotI2RlZmluZSBTSEZfT1JERVJFRAkJMHg0MDAwMDAwMAkvKiB0cmVhdCBzaF9saW5rLHNoX2luZm8gc3BlY2lhbGx5ICovCi0KLS8qIFN5bWJvbCB0eXBlcy4gICovCi0KLSNkZWZpbmUgU1RUX1JFR0lTVEVSCQkxMwkJLyogZ2xvYmFsIHJlZyByZXNlcnZlZCB0byBhcHAuICovCi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3NwYXJjX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfOCwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzE2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMzIsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQOCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1AxNiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1AzMiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMzAsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDIyLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSEkyMiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzIyLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzEzLCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xPMTAsIDEyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR09UMTAsIDEzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR09UMTMsIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR09UMjIsIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUEMxMCwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQzIyLCAxNykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dQTFQzMCwgMTgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19DT1BZLCAxOSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dMT0JfREFULCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0pNUF9TTE9ULCAyMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1JFTEFUSVZFLCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VBMzIsIDIzKQotCi0gIC8qID8/PyBUaGVzZSA2IHJlbG9jcyBhcmUgbmV3IGJ1dCBub3QgY3VycmVudGx5IHVzZWQuICBGb3IgYmluYXJ5Ci0gICAgIGNvbXBhdGlsaXR5IGluIHRoZSBzcGFyYzY0LWVsZiB0b29sY2hhaW4sIHdlIGxlYXZlIHRoZW0gb3V0LgotICAgICBBIG5vbi1iaW5hcnkgdXB3YXJkIGNvbXBhdGlibGUgY2hhbmdlIGlzIGV4cGVjdGVkIGZvciBzcGFyYzY0LWVsZi4gICovCi0jaWZuZGVmIFNQQVJDNjRfT0xEX1JFTE9DUwotICAvKiA/Pz8gTmV3IHJlbG9jcyBvbiB0aGUgVWx0cmFTUEFSQy4gIE5vdCBzdXJlIHdoYXQgdGhleSdyZSBmb3IgeWV0LiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BMVDMyLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hJUExUMjIsIDI1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE9QTFQxMCwgMjYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ1BMVDMyLCAyNykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDUExUMjIsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENQTFQxMCwgMjkpCi0jZW5kaWYKLQotICAvKiB2OSByZWxvY3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzEwLCAzMCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzExLCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzY0LCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX09MTzEwLCAzMykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hIMjIsIDM0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSE0xMCwgMzUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MTTIyLCAzNikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDX0hIMjIsIDM3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENfSE0xMCwgMzgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ19MTTIyLCAzOSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMTYsIDQwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AxOSwgNDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VTlVTRURfNDIsIDQyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNywgNDMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ181LCA0NCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzYsIDQ1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDY0LCA0NikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BMVDY0LCA0NykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hJWDIyLCA0OCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xPWDEwLCA0OSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0g0NCwgNTApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19NNDQsIDUxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTDQ0LCA1MikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1JFR0lTVEVSLCA1MykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VBNjQsIDU0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVUExNiwgNTUpCi0KLSAgLyogbGl0dGxlIGVuZGlhbiBkYXRhIHJlbG9jcyAqLwotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUkVWMzIsIDU2KQotCi0gIEVNUFRZX1JFTE9DICAoUl9TUEFSQ19tYXhfc3RkKQotCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HTlVfVlRJTkhFUklULCAyNTApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HTlVfVlRFTlRSWSwgMjUxKQotCi0gIEVNUFRZX1JFTE9DICAoUl9TUEFSQ19tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBSZWxvY2F0aW9uIG1hY3Jvcy4gICovCi0KLSNkZWZpbmUgRUxGNjRfUl9UWVBFX0RBVEEoaW5mbykgXAotICAoKChiZmRfc2lnbmVkX3ZtYSkoRUxGNjRfUl9UWVBFKGluZm8pID4+IDgpIF4gMHg4MDAwMDApIC0gMHg4MDAwMDApCi0jZGVmaW5lIEVMRjY0X1JfVFlQRV9JRChpbmZvKSBcCi0gICgoaW5mbykgJiAweGZmKQotI2RlZmluZSBFTEY2NF9SX1RZUEVfSU5GTyhkYXRhLCB0eXBlKSBcCi0gICgoKGJmZF92bWEpICgoZGF0YSkgJiAweGZmZmZmZikgPDwgOCkgfCAoYmZkX3ZtYSkgKHR5cGUpKQotCi0vKiBWYWx1ZXMgZm9yIEVsZjY0X0R5bi5kX3RhZy4gICovCi0KLSNkZWZpbmUgRFRfU1BBUkNfUkVHSVNURVIJMHg3MDAwMDAwMQotCi0jZW5kaWYgLyogX0VMRl9TUEFSQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi92ODUwLmggYi9pbmNsdWRlL2VsZi92ODUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDNiN2YuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvdjg1MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIFY4NTAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENyZWF0ZWQgYnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQgPG1laXNzbmVyQGN5Z251cy5jb20+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+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCi0JICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAotICAgOiAoX29ic3RhY2tfZnJlZSAoKGgpLCAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKSwgMCkpKQotIyBlbmRpZgotCi0jZW5kaWYgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0JLyogQysrICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIG9ic3RhY2suaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nIGIvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAzOGRjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDIxMDcgKzAsMCBAQAotV2VkIERlYyAgMSAwMzowNToyNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaDogQWRkIG5ldyBvcGVyYW5kIHR5cGVzLiAgQWRkIG5ldyBpbnN0cnVjdGlvbiBmb3JtYXRzLgotCi1XZWQgTm92IDI0IDIwOjI4OjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQ29ycmVjdGx5IGhhbmRsZSBpbW1lZGlhdGUgZm9yIFBBMi4wICJiYiIKLQlpbnN0cnVjdGlvbi4KLQotMTk5OS0xMS0xOCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl9JU0E1KTogTmV3LgotCi0xOTk5LTExLTAxICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChPUENPREVfSVNfTUVNQkVSKTogTmV3LgotCi0xOTk5LTEwLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKFNIT1JUX0FSKTogRGVmaW5lLgotCi0xOTk5LTEwLTE4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuaCAoYWxwaGFfbnVtX29wY29kZXMpOiBDb252ZXJ0IHRvIHVuc2lnbmVkLgotCShhbHBoYV9udW1fb3BlcmFuZHMpOiBEaXR0by4KLQotU3VuIE9jdCAxMCAwMTo0Njo1NiAxOTk5ICBKZXJyeSBRdWlubiA8amVycnkucXVpbm4uYWR2OTFAYWx1bS5kYXJ0bW91dGgub3JnPgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiAgQWRkIGxvYWQgYW5kIHN0b3JlIGNhY2hlIGNvbnRyb2wgdG8KLQlpbnN0cnVjdGlvbnMuICBBZGQgb3JkZXJlZCBhY2Nlc3MgbG9hZCBhbmQgc3RvcmUuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2RlKTogQWRkIG5ldyBlbnRyaWVzIGZvciBhZGRiIGFuZCBhZGRpYi4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogRml4IGNtcGIgYW5kIGNtcGliIGVudHJpZXMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBBZGQgZW50cmllcyBmb3IgY21wYiBhbmQgY21waWIuCi0KLVRodSBPY3QgIDcgMDA6MTI6MjUgTURUIDE5OTkJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBBZGQgZmxhZyBSRVNUUklDVEVEX05VTTMgZm9yIGltbTMgb3BlcmFuZHMuCi0KLVRodSBTZXAgMjMgMDc6MDg6MzggMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCAiY2FsbCIgYW5kICJyZXQiLiAgQ2xlYW4gdXAgImIiLCAiYnZlIgotCWFuZCAiYmUiIHVzaW5nIGNvbXBsZXRlciBwcmVmaXhlcy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIGluaXRpYWxpemVycyB0byBzaWxlbmNlIGNvbXBpbGVyLgotCi0JKiBocHBhLmg6IFVwZGF0ZSBjb21tZW50cyBhYm91dCBjaGFyYWN0ZXIgdXNhZ2UuCi0KLU1vbiBTZXAgMjAgMDM6NTU6MzEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBGaXggbWlub3IgdGhpbmtvcyBpbnRyb2R1Y2VkIHdoaWxlIGNsZWFuaW5nCi0JdXAgdGhlIG5ldyBmc3R3ICYgYnZlIGluc3RydWN0aW9ucy4KLQotU3VuIFNlcCAxOSAxMDo0MDo1OSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCByZW1haW5pbmcgUEEyLjAgaW50ZWdlciBsb2FkL3N0b3JlCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgcmVtYWluaW5nIFBBMi4wIEZQIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgbG9uZyBvZmZzZXQgZG91YmxlIHdvcmQgbG9hZC9zdG9yZQotCWluc3RydWN0aW9ucy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIEZMQUdfU1RSSUNUIHZhcmlhbnRzIG9mIEZQIGxvYWRzIGFuZAotCXN0b3Jlcy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogSGFuZGxlIFBBMi4wIGZjbnYsIGZjbXAgYW5kIGZ0ZXN0IGluc25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBGaW5pc2ggc3VwcG9ydCBmb3IgUEEyLjAgImIiIGluc3RydWN0aW9ucy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogSGFuZGxlIFBBMi4wICJidmUiIGluc3RydWN0aW9ucy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIG5ldyBzeW50YXggImJlIiBpbnN0cnVjdGlvbnMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IE5vdGUgdXNlIG9mICdNJyBhbmQgJ0wnLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgc3VwcG9ydCBmb3IgImIsbCIuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBzdXBwb3J0IGZvciAiYixnYXRlIi4KLQotU2F0IFNlcCAxOCAxMTo0MToxNiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IFVzZSAnZlgnIGZvciBmaXJzdCByZWdpc3RlciBvcGVyYW5kCi0JaW4geG1weXUuICAKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogRml4IG1hc2sgZm9yIHByb2JlIGFuZCBwcm9iZWkuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZvciBkZXB3aS4KLQotVHVlIFNlcCAgNyAxMzo0NDoyNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCAiYWRkaWwiIHZhcmlhbnQgd2hpY2ggaGFzIHRoZSAlcjEgYXMKLQlhbiBleHBsaWNpdCBvdXRwdXQgYXJndW1lbnQuCi0KLU1vbiBTZXAgIDYgMDQ6NDE6NDIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IEFkZCBzdHJpY3QgdmFyaWFudHMgb2YgUEExLjAvUEExLjEgbG9hZHMgYW5kIHN0b3Jlcy4KLQlBZGQgYSBmZXcgUEEyLjAgbG9hZHMgYW5kIHN0b3JlIHZhcmlhbnRzLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIHBqLmg6IE5ldyBmaWxlLgotCi0xOTk5LTA4LTI5ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9yZWd0YWIpOiBNb3ZlICVzdCB0byB0b3Agb2YgdGFibGUsIGFuZCBzcGxpdCBvZmYKLQlvdGhlciBmcCByZWcgZW50cmllcy4KLQkoaTM4Nl9mbG9hdF9yZWd0YWIpOiBUbyBoZXJlLgotCi1TYXQgQXVnIDI4IDAwOjI1OjI1IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBSZXBsYWNlICdmJyBieSAndicuICBQcmVmaXggZmxvYXQgcmVnaXN0ZXIgYXJncwotCWJ5ICdmJy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIGV4dHJkLCBleHRydywgZGVwZCwgZGVwZGksIGRlcHcsIGRlcHdpLgotCUFkZCBzdXBwb3J0aW5nIGFyZ3MuCi0KLQkqIGhwcGEuaDogIERvY3VtZW50IG5ldyBjb21wbGV0ZXJzIGFuZCBhcmdzLgotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIEFkZCA2NCBiaXQgcGF0dGVybnMgYW5kIHBhMi4wIHN5bnRheCBmb3IgdXhvciwKLQl1YWRkY20sIGRjb3IsIGFkZGksIGFkZCwgc3ViLCBzdWJpLCBzaGxhZGQsIHJmaSwgYW5kIHByb2JlLiAgQWRkIHBhMi4wCi0JZXh0ZW5zaW9ucyBmb3Igc3NtLCByc20sIHBkdGxiLCBwaXRsYi4gIEFkZCBwZXJmb3JtYW5jZSBpbnN0cnVjdGlvbnMKLQlwbWVuYiBhbmQgcG1kaXMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBBZGQgcGEyLjAgaW5zdHJ1Y3Rpb25zIGhhZGQsIGhzaGwsCi0JaHNociwgaHN1YiwgbWl4aCwgbWl4dywgcGVybWguCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IENoYW5nZSBjb21wbGV0ZXJzIGluIGluc3RydWN0aW9ucyB0bwotCXVzZSAnYycgcHJlZml4LgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiAgQWRkIHBvcGJ0cywgbmV3IGZvcm1zIG9mIGJiLCBoYXZnLAotCWhzaGxhZGQsIGhzaHJhZGQsIHNocnBkLCBhbmQgc2hycHcgaW5zdHJ1Y3Rpb25zLiAgVXBkYXRlIGFyZyBjb21tZW50cy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIENoYW5nZSBmbXB5ZmFkZCwgZm1weW5mYWRkLCBmbmVnLAotCWZuZWdhYnMgdG8gdXNlICdJJyBpbnN0ZWFkIG9mICdGJy4KLQotMTk5OS0wOC0yMSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IEFkZCBBTUQgYXRobG9uIGluc3RydWN0aW9ucywgcGZuYWNjLCBwZnBuYWNjLCBwc3dhcGQuCi0JRG9jdW1lbnQgcGYyaXcgYW5kIHBpMmZ3IGFzIGF0aGxvbiBpbnNucy4gIFJlbW92ZSBwc3dhcHcuCi0JQWxwaGFiZXRpY2FsbHkgc29ydCBQSUlJIGluc25zLgotCi1XZWQgQXVnIDE4IDE4OjE0OjQwIDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JTlNOX01BQ0hfSEFTX1ApOiBOZXcgbWFjcm8uCi0KLUZyaSBBdWcgIDYgMDk6NDY6MzUgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCA2NCBiaXQgdmVyc2lvbnMgb2Ygb3IsIHhvciwgYW5kLAotCWFuZCBhbmRjbS4gIEFkZCAzMiBhbmQgNjQgYml0IHZlcnNpb24gb2YgY21wY2xyLCBjbXBpY2xyLgotCi0JKiBocHBhLmg6ICBEb2N1bWVudCA2NCBiaXQgY29uZGl0aW9uIGNvbXBsZXRlcnMuCi0KLVRodSBBdWcgIDUgMTY6NTY6MDcgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IENoYW5nZSBjb25kaXRpb24gYXJncyB0byB1c2UgJz8nIHByZWZpeC4KLQotMTk5OS0wOC0wNCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgRGVmYXVsdFNpemUgbW9kaWZpZXIgdG8gYWxsIGluc25zCi0JdGhhdCBpbXBsaWNpdGx5IG1vZGlmeSAlZXNwLiAgI3VuZGVmIGRfU3VmLCB4X3N1Ziwgc2xkX3N1ZiwKLQlzbGR4X3N1ZiwgYndsZF9TdWYsIGRfRlAsIHhfRlAsIHNsZF9GUCwgc2xkeF9GUCBhdCBlbmQgb2YgdGFibGUuCi0KLVdlZCBKdWwgMjggMDI6MDQ6MjQgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0JCQkgIEplZmYgTGF3IDxsYXdAY3lnbnVzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkICJwdXNobm9tIiBhbmQgInB1c2hidHMiLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBNYXJrIGFsbCBQQTIuMCBvcGNvZGVzIHdpdGggRkxBR19TVFJJQ1QuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBDaGFuZ2UgeG1weXUsIGZtcHlmYWRkLCAKLQlhbmQgZm1weW5mYWRkIHRvIHVzZSAnSicgYW5kICdLJyBpbnN0ZWFkIG9mICdFJyBhbmQgJ1gnLgotCi0xOTk5LTA3LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogQWRkICJ1bmRvY3VtZW50ZWQiIEFNRCAzRE5vdyEgcGYyaXcsIHBpMmZ3LCBwc3dhcHcgaW5zbnMuCi0KLVRodSBKdWwgIDEgMDA6MTc6MjQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHN0cnVjdCBwYV9vcGNvZGUpOiBBZGQgbmV3IGZpZWxkICJmbGFncyIuCi0JKEZMQUdTX1NUUklDVCk6IERlZmluZS4KLQotRnJpIEp1biAyNSAwNDoyMjowNCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQkJCSAgSmVmZiBMYXcgPGxhd0BjeWdudXMuY29tPgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgcGEyLjAgY2xyYnRzIGluc3RydWN0aW9uLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgZW50cmllcyBmb3IgbWZpYSBhbmQgbXRzYXJjbSBpbnN0cnVjdGlvbnMuCi0KLTE5OTktMDYtMjMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBBbGxvdyBgbCcgc3VmZml4IG9uIGJzd2FwLiAgQWxsb3cgYHcnIHN1ZmZpeCBvbiBhcnBsLAotCWxsZHQsIGxtc3csIGx0ciwgc3RyLCB2ZXJyLCB2ZXJ3LiAgQWRkIEZQIGZsYWcgdG8gZmNtb3YqLiAgQWRkIEZQCi0JZmxhZyB0byBmY29taSBhbmQgZnJpZW5kcy4KLQotRnJpIE1heSAyOCAxNToyNjoxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IE1vdmUgaW50ZWdlciBhcml0aG1ldGljIGluc3RydWN0aW9ucyBhZnRlcgotCWludGVnZXIgbG9naWNhbCBpbnN0cnVjdGlvbnMuICAKLQotMTk5OS0wNS0yOCAgTGludXMgTm9yZGJlcmcgIDxsaW51cy5ub3JkYmVyZ0BjYW5pdC5zZT4KLQotCSogbTY4ay5oOiBEb2N1bWVudCBuZXcgZm9ybWF0cyBgRScsIGBHJywgYEgnIGFuZCBuZXcgcGxhY2VzIGBOJywKLQlgbicsIGBvJy4KLQotCSogbTY4ay5oOiBEZWZpbmUgbWNmNTIwNmUsIG1jZjUzMDcsIG1jZi4gIERvY3VtZW50IG5ldyBmb3JtYXQgYHUnCi0JYW5kIG5ldyBwbGFjZXMgYG0nLCBgTScsIGBoJy4KLQotVGh1IE1heSAyNyAwNDoxMzo1NCAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBzZXZlcmFsIHByb2Nlc3NvciBzcGVjaWZpYyBzeXN0ZW0KLQlpbnN0cnVjdGlvbnMuCi0KLVdlZCBNYXkgMjYgMTY6NTc6NDQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgc2Vjb25kIGVudHJ5IGZvciAiY29tYiIsICJjb21pYiIsIAotCSJhZGRiIiwgYW5kICJhZGRpYiIgdG8gYmUgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLgotCi0xOTk5LTA1LTEyICBBbGFuIE1vZHJhICA8YWxhbkBhcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoUmV2ZXJzZU1vZHJtKTogUmVtb3ZlIGFsbCBvY2N1cmVuY2VzLgotCShJbnZNZW0pOiBBZGQgdG8gY29udHJvbC9kZWJ1Zy90ZXN0IG1vdiBpbnNucywgbW92aGxwcywgbW92bGhwcywKLQltb3Ztc2twcywgcGV4dHJ3LCBwbW92bXNrYiwgbWFza21vdnEuCi0JQ2hhbmdlIE5vU3VmIHRvIEZQIG9uIGFsbCBNTVgsIFhNTSBhbmQgQU1EIGluc25zIGFzIHRoZXNlIGFsbAotCWlnbm9yZSB0aGUgZGF0YSBzaXplIHByZWZpeC4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiLCBpMzg2X3JlZ3RhYik6IEFkZCBzdXBwb3J0IGZvciBQSUlJIFNJTUQuCi0JTW9zdGx5IHN0b2xlbiBmcm9tIERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KLQotU2F0IE1heSAgOCAyMzoyNzozNSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBwcGMuaCAoUFBDX09QQ09ERV82NF9CUklER0UpOiBOZXcuCi0KLTE5OTktMDQtMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0FUVFIpOiBEZWxldGUgbWVtYmVyIG51bV9ub25ib29scy4KLQkoQ0dFTl9BVFRSX1RZUEUpOiBVcGRhdGUuCi0JKENHRU5fQVRUUl9NQVNLKTogTnVtYmVyIGJvb2xlYW5zIHN0YXJ0aW5nIGF0IDAuCi0JKENHRU5fQVRUUl9WQUxVRSk6IFVwZGF0ZS4KLQkoQ0dFTl9JTlNOX0FUVFIpOiBVcGRhdGUuCi0KLU1vbiBBcHIgMTIgMjM6NDM6MjcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKGZtcHlmYWRkLCBmbXB5bmZhZGQsIGZuZWcsIGZuZWdhYnMpOiBOZXcgUEEyLjAKLQlpbnN0cnVjdGlvbnMuCi0KLVR1ZSBNYXIgMjMgMTE6MjQ6MzggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKGJiLCBidmIpOiBUd2VhayBvcGNvZGUvbWFzay4KLQotCi0xOTk5LTAzLTIyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JU0EsQ0dFTl9NQUNIKTogTmV3IHR5cGVkZWZzLgotCShzdHJ1Y3QgY2dlbl9jcHVfZGVzYyk6IFJlbmFtZSBtZW1iZXIgbWFjaCB0byBtYWNocy4gIE5ldyBtZW1iZXIgaXNhcy4KLQlOZXcgbWVtYmVycyB3b3JkX2JpdHNpemUsZGVmYXVsdF9pbnNuX2JpdHNpemUsYmFzZV9pbnNuLWJpdHNpemUsCi0JbWluX2luc25fYml0c2l6ZSxtYXhfaW5zbl9iaXRzaXplLGlzYV90YWJsZSxtYWNoX3RhYmxlLHJlYnVpbGRfdGFibGVzLgotCURlbGV0ZSBtZW1iZXIgbWF4X2luc25fc2l6ZS4KLQkoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyk6IE5ldyBlbnVtLgotCShjcHVfb3Blbik6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGNwdV9vcGVuXzEpOiBEZWNsYXJlLgotCShjZ2VuX3NldF9jcHUpOiBEZWxldGUuCi0KLTE5OTktMDMtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0hXX1RBQkxFKTogRGVsZXRlIGBudW1faW5pdF9lbnRyaWVzJyBtZW1iZXIuCi0JKENHRU5fT1BFUkFORF9OSUwpOiBOZXcgbWFjcm8uCi0JKENHRU5fT1BFUkFORCk6IE5ldyBtZW1iZXIgYHR5cGUnLgotCShAYXJjaEBfY2dlbl9vcGVyYW5kX3RhYmxlKTogRGVsZXRlIGRlY2wuCi0JKENHRU5fT1BFUkFORF9JTkRFWCxDR0VOX09QRVJBTkRfVFlQRSxDR0VOX09QRVJBTkRfRU5UUlkpOiBEZWxldGUuCi0JKENHRU5fT1BFUkFORF9UQUJMRSk6IE5ldyBzdHJ1Y3QuCi0JKGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZSxjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSk6IERlY2xhcmUuCi0JKENHRU5fT1BJTlNUKTogUG9pbnRlciB0byBvcGVyYW5kIHRhYmxlIGVudHJ5IHJlcGxhY2VkIHdpdGggZW51bS4KLQkoQ0dFTl9DUFVfVEFCTEUpOiBOZXcgbWVtYmVyIGBpc2EnLiAgQ2hhbmdlIG1lbWJlciBgb3BlcmFuZF90YWJsZScsCi0Jbm93IGEgQ0dFTl9PUEVSQU5EX1RBQkxFLiAgQWRkIENHRU5fQ1BVX0RFU0MgYXJnIHRvCi0Je2dldCxzZXR9X3tpbnQsdm1hfV9vcGVyYW5kLgotCShAYXJjaEBfY2dlbl9jcHVfb3Blbik6IE5ldyBhcmcgYGlzYScuCi0JKGNnZW5fc2V0X2NwdSk6IERpdHRvLgotCi1GcmkgRmViIDI2IDAyOjM2OjQ1IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogRmlsbCBpbiBjbW92IGFuZCBmY21vdiBhbHRlcm5hdGVzLiAgQWRkIGZjb21pIHNob3J0IGZvcm1zLgotCi0xOTk5LTAyLTI1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoZW51bSBjZ2VuX2FzbV90eXBlKTogQWRkIENHRU5fQVNNX05PTkUuCi0JKENHRU5fSFdfRU5UUlkpOiBEZWxldGUgbWVtYmVyIGBuZXh0Jy4gIENoYW5nZSB0eXBlIG9mIGB0eXBlJyB0bwotCWVudW0gY2dlbl9od190eXBlLgotCShDR0VOX0hXX1RBQkxFKTogTmV3IHN0cnVjdC4KLQkoaHdfdGFibGUpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKENHRU5fT1BFUkFORCk6IENoYW5nZSBtZW1iZXIgaHcgdG8gaHdfdHlwZSwgY2hhbmdlIHR5cGUgZnJvbSBwb2ludGVyCi0JdG8gdGFibGUgZW50cnkgdG8gZW51bS4KLQkoQ0dFTl9PUElOU1QpOiBEaXR0by4KLQkoQ0dFTl9DUFVfVEFCTEUpOiBDaGFuZ2UgbWVtYmVyIGh3X2xpc3QgdG8gaHdfdGFibGUuCi0KLVNhdCBGZWIgMTMgMTQ6MTM6NDQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuaCAoQVhQX09QQ09ERV9FVjYpOiBOZXcuCi0JKEFYUF9PUENPREVfTk9QQUwpOiBJbmNsdWRlIGl0LgotCi0xOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9DUFVfREVTQyk6IFJlbmFtZWQgZnJvbSBDR0VOX09QQ09ERV9ERVNDLgotCUFsbCB1c2VzIHVwZGF0ZWQuICBOZXcgbWVtYmVycyBpbnRfaW5zbl9wLCBtYXhfaW5zbl9zaXplLAotCXBhcnNlX29wZXJhbmQsaW5zZXJ0X29wZXJhbmQsZXh0cmFjdF9vcGVyYW5kLHByaW50X29wZXJhbmQsCi0Jc2l6ZW9mX2ZpZWxkcyxzZXRfZmllbGRzX2JpdHNpemUsZ2V0X2ludF9vcGVyYW5kLHNldF9pbnRfb3BlcmFuZCwKLQlnZXRfdm1hX29wZXJhbmQsc2V0X3ZtYV9vcGVyYW5kLHBhcnNlX2hhbmRsZXJzLGluc2VydF9oYW5kbGVycywKLQlleHRyYWN0X2hhbmRsZXJzLHByaW50X2hhbmRsZXJzLgotCShDR0VOX0FUVFIpOiBDaGFuZ2UgdHlwZSBvZiBudW1fbm9uYm9vbHMgdG8gdW5zaWduZWQgaW50LgotCShDR0VOX0FUVFJfQk9PTF9PRkZTRVQpOiBOZXcgbWFjcm8uCi0JKENHRU5fQVRUUl9NQVNLKTogU3VidHJhY3QgaXQgdG8gY29tcHV0ZSBiaXQgbnVtYmVyLgotCShDR0VOX0FUVFJfVkFMVUUpOiBSZWRvIGJvb2wvbm9uYm9vbCBhdHRyIGNhbGN1bGF0aW9uLgotCShjZ2VuX29wY29kZV9oYW5kbGVyKTogUmVuYW1lZCBmcm9tIGNnZW5fYmFzZS4KLQkoQ0dFTl9IV19BVFRSX1ZBTFVFKTogUmVuYW1lZCBmcm9tIENHRU5fSFdfQVRUUiwgYWxsIHVzZXMgdXBkYXRlZC4KLQkoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUpOiBSZW5hbWVkIGZyb20gQ0dFTl9PUEVSQU5EX0FUVFIsCi0JYWxsIHVzZXMgdXBkYXRlZC4KLQkoQ0dFTl9PUEVSQU5EX0lOREVYKTogUmV3cml0ZSB0byB1c2UgdGFibGUgZW50cnksIG5vdCBnbG9iYWwuCi0JKGVudW0gY2dlbl9vcGluc3RfdHlwZSk6IFJlbmFtZWQgZnJvbSBjZ2VuX29wZXJhbmRfaW5zdGFuY2VfdHlwZS4KLQkoQ0dFTl9JRkxEX0FUVFJfVkFMVUUpOiBSZW5hbWVkIGZyb20gQ0dFTl9JRkxEX0FUVFIsIGFsbCB1c2VzIHVwZGF0ZWQuCi0JKENHRU5fT1BDT0RFLENHRU5fSUJBU0UpOiBOZXcgdHlwZXMuCi0JKENHRU5fSU5TTik6IFJld3JpdGUuCi0JKENHRU5fe0FTTSxESVN9X0hBU0gqKTogRGVsZXRlLgotCShpbml0X29wY29kZV90YWJsZSxpbml0X2libGRfdGFibGUpOiBEZWNsYXJlLgotCShDR0VOX0lOU05fQVRUUik6IE5ldyB0eXBlLgotCi1Nb24gRmViICAxIDIxOjA5OjE0IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGkzODYuaCAoZF9TdWYsIHhfU3VmLCBzbGRfU3VmLCBzbGR4X1N1ZiwgYndsZF9TdWYpOiAgRGVmaW5lLgotICAgICAgICAoeF9GUCwgZF9GUCwgZGxzX0ZQLCBzbGR4X0ZQKTogIERlZmluZS4KLSAgICAgICAgQ2hhbmdlICpTdWYgZGVmaW5pdGlvbnMgdG8gaW5jbHVkZSB4IGFuZCBkIHN1ZmZpeGVzLgotICAgICAgICAobW92c3gpOiAgVXNlIHdfU3VmIGFuZCBiX1N1Zi4KLSAgICAgICAgKG1vdnp4KTogIExpa2V3aXNlLgotICAgICAgICAobW92cyk6ICBVc2UgYndsZF9TdWYuCi0gICAgICAgIChmbGQpOiAgQ2hhbmdlIG9yZGVyaW5nLiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZpbGQpOiAgQWRkIEludGVsIFN5bnRheCBlcXVpdmFsZW50IG9mIGZpbGRxLgotICAgICAgICAoZnN0KTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmaXN0KTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmc3RwKTogIFVzZSBzbGRfRlAuICBBZGQgeF9GUCB2ZXJzaW9uLgotICAgICAgICAoZmlzdHApOiAgTExvbmdNZW0gdmVyc2lvbiBmb3IgSW50ZWwgU3ludGF4LgotICAgICAgICAoZmNvbSwgZmNvbXApOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZhZGQsIGZpYWRkLCBmc3ViKTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmc3Vicik6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZm11bCwgZmltdWwsIGZkdmksIGZpZGl2LCBmZGl2cik6ICBVc2Ugc2xkX0ZQLgotCi0xOTk5LTAxLTI3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoZW51bSBjZ2VuX21vZGUpOiBBZGQgQ0dFTl9NT0RFX1RBUkdFVF9NQVgsIENHRU5fTU9ERV9JTlQsCi0JQ0dFTl9NT0RFX1VJTlQuCi0KLVNhdCBKYW4gMTYgMDE6Mjk6MjUgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKGJ2KTogRml4IG1hc2suCi0KLTE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0FUVFJfVkFMVUVfVFlQRSk6IE5ldyB0eXBlZGVmLgotCShDR0VOX0FUVFIpOiBVc2UgaXQuCi0JKENHRU5fQVRUUl9UWVBFLENHRU5fQVRUUl9FTlRSWSk6IERpdHRvLgotCShDR0VOX0FUVFJfVEFCTEUpOiBOZXcgbWVtYmVyIGRmYXVsdC4KLQotMTk5OC0xMi0zMCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoTUlQUzE2X0lOU05fQlJBTkNIKTogTmV3LgotCi1XZWQgRGVjICA5IDEwOjM4OjQ4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBpcyBwYXJ0IG9mIGEgY2hhbmdlIG1hZGUgYnkgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluCi0gCWNoYW5nZXMgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgotCi0JKiBocHBhLmggKGNvbXBsZXRlcl9jaGFycyk6IGxpc3Qgb2YgY2hhcnMgdG8gbm90IHB1dCBhIHNwYWNlCi0gCWFmdGVyLgotCi1TdW4gRGVjICA2IDEzOjIxOjM0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUGVybWl0IHcgc3VmZml4IG9uIHByb2Nlc3NvciBjb250cm9sIGFuZAotIAlzdGF0dXMgd29yZCBpbnN0cnVjdGlvbnMuCi0KLTE5OTgtMTEtMzAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChzdHJ1Y3QgY2dlbl9od19lbnRyeSk6IERlbGV0ZSBjb25zdCBvbiBhdHRycyBtZW1iZXIuCi0JKHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkpOiBEaXR0by4KLQkoc3RydWN0IGNnZW5fb3BlcmFuZCk6IERpdHRvLgotCShDR0VOX0lGTEQpOiBOZXcgdHlwZWRlZiwgd2l0aCBhc3NvY2lhdGVkIGFjY2VzcyBtYWNyb3MuCi0JKENHRU5fSUZNVCk6IE5ldyB0eXBlZGVmLCB3aXRoIGFzc29jaWF0ZWQgYWNjZXNzIG1hY3Jvcy4KLQkoQ0dFTl9JRk1UKTogUmVuYW1lZCBmcm9tIENHRU5fRk9STUFULiAgTmV3IG1lbWJlciBgaWZsZHMnLgotCShDR0VOX0lWQUxVRSk6IE5ldyB0eXBlZGVmLgotCShzdHJ1Y3QgY2dlbl9pbnNuKTogRGVsZXRlIGNvbnN0IG9uIHN5bnRheCxhdHRycyBtZW1iZXJzLgotCWBmb3JtYXQnIG5vdyBwb2ludHMgdG8gZm9ybWF0IGRhdGEuICBUeXBlIG9mIGB2YWx1ZScgaXMgbm93Ci0JQ0dFTl9JVkFMVUUuCi0JKHN0cnVjdCBjZ2VuX29wY29kZV90YWJsZSk6IE5ldyBtZW1iZXIgaWZsZF90YWJsZS4KLQotMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5fZXh0cmFjdF9mbik6IFVwZGF0ZSB0eXBlIG9mIGBiYXNlX2luc24nIGFyZy4KLQkoQ0dFTl9PUEVSQU5EX0lOU1RBTkNFKTogTmV3IG1lbWJlciBgYXR0cnMnLgotCShDR0VOX09QRVJBTkRfSU5TVEFOQ0Vfe0FUVFJTLEFUVFJ9KTogTmV3IG1hY3Jvcy4KLQkoY2dlbl9kaXNfbG9va3VwX2luc24pOiBVcGRhdGUgdHlwZSBvZiBgYmFzZV9pbnNuJyBhcmcuCi0JKGNnZW5fb3Bjb2RlX3RhYmxlKTogVXBkYXRlIHR5cGUgb2YgZGlzX2hhc2ggZm4uCi0JKGV4dHJhY3Rfb3BlcmFuZCk6IFVwZGF0ZSB0eXBlIG9mIGBpbnNuX3ZhbHVlJyBhcmcuCi0KLVRodSBPY3QgMjkgMTE6Mzg6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX1ZFUlNJT05fe01BSk9SLE1JTk9SLEZJWExFVkVMfSk6IERlbGV0ZS4KLQotVHVlIE9jdCAyNyAwODo1Nzo1OSAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChJTlNOX01VTFQpOiBBZGRlZC4KLQotVHVlIE9jdCAyMCAxMTozMTozNCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoTUFYX01ORU1fU0laRSk6IFJlbmFtZSBmcm9tIE1BWF9PUENPREVfU0laRS4KLQotTW9uIE9jdCAxOSAxMjo1MDowMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lOU05fSU5UKTogTmV3IHR5cGVkZWYuCi0JKENHRU5fSU5UX0lOU05fUCk6IFJlbmFtZWQgZnJvbSBDR0VOX0lOVF9JTlNOLgotCShDR0VOX0lOU05fQllURVMpOiBSZW5hbWVkIGZyb20gY2dlbl9pbnNuX3QuCi0JKENHRU5fSU5TTl9CWVRFU19QVFIpOiBOZXcgdHlwZWRlZi4KLQkoQ0dFTl9FWFRSQUNUX0lORk8pOiBOZXcgdHlwZWRlZi4KLQkoY2dlbl9pbnNlcnRfZm4sY2dlbl9leHRyYWN0X2ZuKTogVXBkYXRlLgotCShjZ2VuX29wY29kZV90YWJsZSk6IE5ldyBtZW1iZXIgYGluc25fZW5kaWFuJy4KLQkoYXNzZW1ibGVfaW5zbixsb29rdXBfaW5zbixsb29rdXBfZ2V0X2luc25fb3BlcmFuZHMpOiBVcGRhdGUuCi0JKGluc2VydF9vcGVyYW5kLGV4dHJhY3Rfb3BlcmFuZCk6IFVwZGF0ZS4KLQkoY2dlbl9nZXRfaW5zbl92YWx1ZSxjZ2VuX3B1dF9pbnNuX3ZhbHVlKTogQWRkIHByb3RvdHlwZXMuCi0KLUZyaSBPY3QgIDkgMTM6Mzg6MTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9BVFRSX0JPT0xTKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QgQ0dFTl9IV19FTlRSWSk6IE5ldyBtZW1iZXIgYGF0dHJzJy4KLQkoQ0dFTl9IV19BVFRSKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QgQ0dFTl9PUEVSQU5EX0lOU1RBTkNFKTogTmV3IG1lbWJlciBgbmFtZScuCi0JKENHRU5fSU5TTl9JTlZBTElEX1ApOiBOZXcgbWFjcm8uCi0KLU1vbiBPY3QgIDUgMDA6MjE6MDcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IEFkZCAiZmlkIi4KLQkKLVN1biBPY3QgIDQgMjE6MDA6MDAgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JRnJvbSBSb2JlcnQgQW5kcmV3IERhbGUgPHJvYkBuYi5uZXQ+Ci0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgQU1EIDNETm93ISBpbnN0cnVjdGlvbnMuCi0JKEFNRF8zRE5PV19PUENPREUpOiBEZWZpbmUuCi0KLVR1ZSBTZXAgMjIgMTc6NTM6NDcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChFSVRIRVJfQlVUX1BSRUZFUl9NVSk6IERlZmluZS4KLQotTW9uIEF1ZyAxMCAxNDowOTozOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5faW5zbik6ICNpZiAwIG91dCBlbGVtZW50IGBjZHgnLgotCi1Nb24gQXVnICAzIDEyOjIxOjU3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JTW92ZSBhbGwgZ2xvYmFsIHN0YXRlIGRhdGEgaW50byBvcGNvZGUgdGFibGUgc3RydWN0LCBhbmQgdHJlYXQKLQlvcGNvZGUgdGFibGUgYXMgc29tZXRoaW5nIHRoYXQgaXMgIm9wZW5lZC9jbG9zZWQiLgotCSogY2dlbi5oIChDR0VOX09QQ09ERV9ERVNDKTogTmV3IHR5cGUuCi0JKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgotCShjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuKTogQWRkIHByb3RvdHlwZS4KLQkoY2dlbl9jdXJyZW50X21hY2hpbmUsY2dlbl9jdXJyZW50X2VuZGlhbik6IERlbGV0ZS4KLQkoQ0dFTl9PUENPREVfVEFCTEUpOiBOZXcgbWVtYmVycyBtYWNoLGVuZGlhbixvcGVyYW5kX3RhYmxlLAotCXBhcnNlX29wZXJhbmRfZm4sYXNtX2hhc2hfdGFibGUsYXNtX2hhc2hfdGFibGVfZW50cmllcywKLQlkaXNfaGFzaF90YWJsZSxkaXNfaGFzaF90YWJsZV9lbnRyaWVzLgotCShvcGNvZGVfb3BlbixvcGNvZGVfY2xvc2UpOiBBZGQgcHJvdG90eXBlcy4KLQotCSogY2dlbi5oIChjZ2VuX2luc24pOiBOZXcgZWxlbWVudCBgY2R4Jy4KLQotVGh1IEp1bCAzMCAyMTo0NDoyNSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKEZMQUdfTEtSKTogTmV3IGZsYWcgZm9yICJsZWZ0LWtpbGxzLXJpZ2h0IiBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBKdWwgMjggMTA6NTk6MDcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IEFkZCAibm9fbWF0Y2hfb3BlcmFuZHMiIGZpZWxkIGZvciBpbnN0cnVjdGlvbnMuCi0JKE1OMTAzMDBfTUFYX09QRVJBTkRTKTogRGVmaW5lLgotCi1GcmkgSnVsIDI0IDExOjQ0OjI0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9tYWNyb19pbnNuX2NvdW50KTogRGVjbGFyZS4KLQotVHVlIEp1bCAyMSAxMzoxMjoxMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX1ZFUlNJT05fe01BSk9SLE1JTk9SLEZJWExFVkVMfSk6IERlZmluZS4KLQkoY2dlbl9pbnNlcnRfZm4sY2dlbl9leHRyYWN0X2ZuKTogTmV3IGFyZyBgcGMnLgotCShnZXRfb3BlcmFuZCxwdXRfb3BlcmFuZCk6IFJlcGxhY2VkIHdpdGggZ2V0X3tpbnQsdm1hfV9vcGVyYW5kLAotCXNldF97aW50LHZtYX1fb3BlcmFuZC4KLQotRnJpIEp1biAyNiAxMTowOTowNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaDogQWRkICJtYWNoaW5lIiBmaWVsZCBmb3IgaW5zdHJ1Y3Rpb25zLgotCShNTjEwMywgQU0zMCk6IERlZmluZSBtYWNoaW5lIHR5cGVzLgotCQotRnJpIEp1biAxOSAxNjowOTowOSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogVXNlIEZQLCBub3Qgc2xfU3VmLCBmb3IgZnhzYXZlIGFuZCBmeHJzdG9yLgotCi0xOTk4LTA2LTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgc3VwcG9ydCBmb3IgZnhzYXZlLCBmeHJzdG9yLCBzeXNlbnRlciBhbmQgc3lzZXhpdC4KLQotU2F0IEp1biAxMyAxMTozMTozNSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZCBnZW5lcmFsIGZvcm0gb2YgYWFkIGFuZCBhYW0uICBBZGQgdWQyYQotCWFuZCB1ZDJiLgotCShpMzg2X3JlZ3RhYik6IEFsbG93IGNyMC4uNywgZGIwLi43LCBkcjAuLjcsIHRyMC4uNywgbm90IGp1c3QKLQl0aG9zZSB0aGF0IGhhcHBlbiB0byBiZSBpbXBsZW1lbnRlZCBvbiBwZW50aXVtcy4KLQotVHVlIEp1biAgOSAxMjoxNjowMSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogQ2hhbmdlIG9jY3VyZW5jZXMgb2YgRGF0YTE2IHRvIFNpemUxNiwgRGF0YTMyIHRvIFNpemUzMiwKLQlJZ25vcmVEYXRhU2l6ZSB0byBJZ25vcmVTaXplLiAgRmxhZyBhZGRyZXNzIGFuZCBkYXRhIHNpemUgcHJlZml4ZXMKLQl3aXRoIFNpemUxNnxJZ25vcmVTaXplIG9yIFNpemUzMnxJZ25vcmVTaXplLgotCi1Nb24gSnVuICA4IDEyOjE1OjUyIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChSRVBORSk6IFJlbmFtZSB0byBSRVBORV9QUkVGSVhfT1BDT0RFLgotCShSRVBFKTogUmVuYW1lIHRvIFJFUEVfUFJFRklYX09QQ09ERS4KLQkoaTM4Nl9yZWd0YWJfZW5kKTogUmVtb3ZlLgotCShpMzg2X3ByZWZpeHRhYiwgaTM4Nl9wcmVmaXh0YWJfZW5kKTogUmVtb3ZlLgotCShpMzg2X29wdGFiKTogVXNlIE5VTEwgYXMgc2VudGluZWwgcmF0aGVyIHRoYW4gIiIgdG8gc3VpdCByZXdyaXRlCi0Jb2YgbWRfYmVnaW4uCi0JKE1BWF9PUENPREVfU0laRSk6IERlZmluZS4KLQkoaTM4Nl9vcHRhYl9lbmQpOiBSZW1vdmUuCi0JKHNsX1N1Zik6IERlZmluZS4KLQkoc2xfRlApOiBVc2Ugc2xfU3VmLgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBbGxvdyAxNiBiaXQgZGlzcGxhY2VtZW50IGZvciBgbW92Ci0JbWVtLGFjYycuICBDb21iaW5lIDE2IGFuZCAzMiBiaXQgZm9ybXMgb2YgdmFyaW91cyBpbnNucy4gIEFsbG93IDE2Ci0JYml0IGZvcm0gb2YgbGptcC4gIEFkZCBJc1ByZWZpeCBtb2RpZmllciB0byBwcmVmaXhlcy4gIEFkZCBhZGRyMzIsCi0JZGF0YTMyLCBkd29yZCwgYW5kIGFkd29yZCBwcmVmaXhlcy4KLQkoaTM4Nl9yZWd0YWIpOiBBZGQgQmFzZUluZGV4IG1vZGlmaWVyIHRvIHZhbGlkIDE2IGJpdCBiYXNlL2luZGV4Ci0JcmVncy4KLQotRnJpIEp1biAgNSAyMzo0Mjo0MyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9yZWd0YWIpOiBSZW1vdmUgQmFzZUluZGV4IG1vZGlmaWVyIGZyb20gZXNwLgotCi0JKiBpMzg2Lmg6IEFsbG93IGBsJyBzdWZmaXggb24gZmxkLCBmc3QsIGZzdHAsIGZjb20sIGZjb21wIHdpdGgKLQlyZWdpc3RlciBvcGVyYW5kcywgYmVjYXVzZSB0aGlzIGlzIGEgY29tbW9uIGlkaW9tLiAgRmxhZyB0aGVtIHdpdGgKLQlhIHdhcm5pbmcuICBBbGxvdyBpbGxlZ2FsIGZhZGRwLCBmc3VicCwgZnN1YnJwLCBmbXVscCwgZmRpdnAsCi0JZmRpdnJwIGJlY2F1c2UgZ2NjIGVycm9uZW91c2x5IGdlbmVyYXRlcyB0aGVtLiAgQWxzbyBmbGFnIHdpdGggYQotCXdhcm5pbmcuCi0KLQkqIGkzODYuaDogQWRkIHN1ZmZpeCBtb2RpZmllcnMgdG8gbW9zdCBpbnNucywgYW5kIHRpZ2h0ZXIgb3BlcmFuZAotCWNoZWNrcyBpbiBzb21lIGNhc2VzLiAgRml4IGEgbnVtYmVyIG9mIFVuaXhXYXJlIGNvbXBhdGliaWxpdHkKLQlpc3N1ZXMgd2l0aCBmbG9hdCBpbnNucy4gIE1lcmdlIHNvbWUgZmxvYXRpbmcgcG9pbnQgb3Bjb2RlcywgdXNpbmcKLQluZXcgRmxvYXRNRiBtb2RpZmllci4KLQkoV09SRF9QUkVGSVhfT1BDT0RFKTogUmVuYW1lIHRvIERBVEFfUFJFRklYX09QQ09ERSBmb3IKLQljb25zaXN0ZW5jeS4KLQotCSogaTM4Ni5oOiBDaGFuZ2Ugb2NjdXJlbmNlIG9mIFNob3J0Zm9ybVcgdG8gV3xTaG9ydEZvcm0uICBBZGQKLQlJZ25vcmVEYXRhU2l6ZSB3aGVyZSBhcHByb3ByaWF0ZS4KLQotV2VkIEp1biAgMyAxODoyODo0NSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogKG9uZV9ieXRlX3NlZ21lbnRfZGVmYXVsdHMpOiBSZW1vdmUuCi0JKHR3b19ieXRlX3NlZ21lbnRfZGVmYXVsdHMpOiBSZW1vdmUuCi0JKGkzODZfcmVndGFiKTogQWRkIEJhc2VJbmRleCB0byAzMiBiaXQgcmVncyByZWdfdHlwZS4KLQotRnJpIE1heSAxNSAxNTo1OTowNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lKTogUmVuYW1lZCBmcm9tIGNnZW5faHdfbG9va3VwLgotCShjZ2VuX2h3X2xvb2t1cF9ieV9udW0pOiBEZWNsYXJlLgotCi1UaHUgTWF5ICA3IDA5OjI3OjU4IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoT1Bfe1NILE1BU0t9X0NPREUyKTogQWRkZWQgInEiIG9wZXJhbmQgZm9ybWF0IGZvciBsb3dlcgotCXRlbiBiaXRzIG9mIE1JUFMgSVNBMSAiYnJlYWsiIGluc3RydWN0aW9uLCBhbmQgZm9yICJzZGJicCIKLQotVGh1IE1heSAgNyAwMjoxNDowOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2FzbV9pbml0X3BhcnNlKTogRGVsZXRlLgotCShjZ2VuX3NhdmVfZml4dXBzLGNnZW5fcmVzdG9yZV9maXh1cHMsY2dlbl9zd2FwX2ZpeHVwcyk6IERlbGV0ZS4KLQkoY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyLGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogRGVsZXRlLgotCi1Nb24gQXByIDI3IDEwOjEzOjExIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQVRUUl9UWVBFKTogRGVsZXRlIGBjb25zdCcsIG1vdmVkIHRvIHVzZXMuCi0JKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoY2dlbl9pbnNuKTogTmV3IG1lbWJlcnMgbnVtLCBkYXRhLgotCShDR0VOX0lOU05fVEFCTEUpOiBNZW1iZXJzIGFzbV9oYXNoLCBhc21faGFzaF90YWJsZV9zaXplLAotCWRpc19oYXNoLCBkaXNfaGFzaF90YWJsZV9zaXplIG1vdmVkIHRvIC4uLgotCShDR0VOX09QQ09ERV9UQUJMRSkuICBIZXJlLiAgUmVuYW1lZCBmcm9tIENHRU5fT1BDT0RFX0RBVEEuCi0JQWxsIHVzZXMgdXBkYXRlZC4gIE5ldyBtZW1iZXJzIGFzbV9oYXNoX3AsIGRpc19oYXNoX3AuCi0JKENHRU5fTUlOU05fRVhQQU5TSU9OKTogTmV3IHN0cnVjdC4KLQkoY2dlbl9leHBhbmRfbWFjcm9faW5zbik6IERlY2xhcmUuCi0JKGNnZW5fbWFjcm9faW5zbl9jb3VudCk6IERlY2xhcmUuCi0JKGdldF9pbnNuX29wZXJhbmRzKTogVXBkYXRlIHByb3RvdHlwZS4KLQkobG9va3VwX2dldF9pbnNuX29wZXJhbmRzKTogRGVjbGFyZS4KLQotVHVlIEFwciAyMSAxNzoxMTozMiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IENoYW5nZSBpY2xyS2x1ZGdlIGFuZCBpbXVsS2x1ZGdlIHRvCi0JcmVnS2x1ZGdlLiAgQWRkIG9wZXJhbmRzIHR5cGVzIGZvciBzdHJpbmcgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gQXByIDIwIDE0OjQwOjI5IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChYKTogUmVuYW1lZCBmcm9tIGBaXycgdG8gcHJlc2VydmUgZm9ybWF0dGluZyBvZiBvcGNvZGUKLQl0YWJsZS4KLQotU3VuIEFwciAxOSAxMzo1NDowNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoWl8pOiBSZW5hbWVkIGZyb20gYF8nIHRvIGF2b2lkIGNsYXNoIHdpdGggY29tbW9uIGFsaWFzCi0JZm9yIGBnZXR0ZXh0Jy4KLQotRnJpIEFwciAgMyAxMjowNDo0OCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogUmVtb3ZlIE5vTW9kcm0gZmxhZyBmcm9tIGFsbCBpbnNuczogaXQncyBuZXZlciBjaGVja2VkLgotCUFkZCBJc1N0cmluZyBmbGFnIHRvIHN0cmluZyBpbnN0cnVjdGlvbnMuCi0JKElTX1NUUklORyk6IERvbid0IGRlZmluZS4KLQkoTE9DS19QUkVGSVhfT1BDT0RFLCBDU19QUkVGSVhfT1BDT0RFLCBEU19QUkVGSVhfT1BDT0RFKTogRGVmaW5lLgotCShFU19QUkVGSVhfT1BDT0RFLCBGU19QUkVGSVhfT1BDT0RFLCBHU19QUkVGSVhfT1BDT0RFKTogRGVmaW5lLgotCShTU19QUkVGSVhfT1BDT0RFKTogRGVmaW5lLgotCi1Nb24gTWFyIDMwIDIxOjMxOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBSZXZlcnQgTWFyY2ggMjQgcGF0Y2g7IG5vIG1vcmUgTGluZWFyQWRkcmVzcy4KLQotTW9uIE1hciAzMCAxMDoyNTo1NCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFJlbW92ZSBmd2FpdCAoOWIpIGZyb20gYWxsIGZsb2F0aW5nIHBvaW50Ci0JaW5zdHJ1Y3Rpb25zLCBhbmQgaW5zdGVhZCBhZGQgRldhaXQgb3Bjb2RlIG1vZGlmaWVyLiAgQWRkIHNob3J0Ci0JZm9ybSBvZiBmbGRlbnYgYW5kIGZzdGVudi4KLQkoRldBSVRfT1BDT0RFKTogRGVmaW5lLgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBDaGFuZ2Ugc2Vjb25kIG9wZXJhbmQgY29uc3RyYWludCBvZiBgbW92Ci0Jc3JlZyxyZWd8bWVtJyBpbnN0cnVjdGlvbiBmcm9tIFJlZzE2fE1lbSB0byBXb3JkUmVnfFdvcmRNZW0gdG8KLQlhbGxvdyBsZWdhbCBpbnN0cnVjdGlvbnMgc3VjaCBhcyBgbW92bCAlZ3MsJWVzaScKLQotRnJpIE1hciAyNyAxODozMDo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLmg6IFZhcmlvdXMgY2hhbmdlcyB0byBmdWxseSBicmFja2V0IGluaXRpYWxpemVycy4KLQotVHVlIE1hciAyNCAxODozMjo0NyAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGkzODYuaDogU2V0IExpbmVhckFkZHJlc3MgZm9yIGxpZHQgYW5kIGxnZHQuCi0KLU1vbiBNYXIgIDIgMTA6NDQ6MDcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9CT09MX0FUVFIpOiBOZXcgbWFjcm8uCi0KLVRodSBGZWIgMjYgMTU6NTQ6MzEgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoRkxBR19ERUxBWSk6IE5ldyBmbGFnIGZvciBkZWxheWVkIGJyYW5jaGVzL2p1bXBzLgotCi1Nb24gRmViIDIzIDEwOjM4OjIxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQ0FUMyk6IERlbGV0ZS4gIFVzZSBDT05DQVQzIG5vdy4KLQkoY2dlbl9pbnNuKTogUmVjb3JkIHN5bnRheCBhbmQgZm9ybWF0IGVudHJpZXMgaGVyZSwgcmF0aGVyIHRoYW4KLQlzZXBhcmF0ZWx5LgotCi1UdWUgRmViIDE3IDIxOjQyOjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCk6IE5ldyBtYWNyby4KLQotVHVlIEZlYiAxNyAxNjowMDo1NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2luc2VydF9mbik6IENoYW5nZSB0eXBlIG9mIHJlc3VsdCB0byBjb25zdCBjaGFyICouCi0JKGNnZW5fcGFyc2Vfe3NpZ25lZCx1bnNpZ25lZH1faW50ZWdlcik6IERlbGV0ZSBtaW4sbWF4IGFyZ3VtZW50cy4KLQkoQ0dFTl97SU5TTixLRVlXT1JELE9QRVJBTkR9X05CT09MX0FUVFJTKTogUmVuYW1lZCBmcm9tIC4uLl9NQVhfQVRUUlMuCi0KLVRodSBGZWIgMTIgMTg6MzA6NDEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChsb29rdXBfaW5zbik6IE5ldyBhcmd1bWVudCBhbGlhc19wLgotCi1UaHUgRmViIDEyIDAzOjQxOjAwIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLUZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6Ci0JKiBkMTB2LmggKE9QRVJBTkRfQUNDKTogU3BsaXQgaW50bzoKLQkoT1BFUkFORF9BQ0MwLCBPUEVSQU5EX0FDQzEpIC4KLQkoT1BFUkFORF9HUFIpOiBEZWZpbmUuCi0KLVdlZCBGZWIgMTEgMTc6MzE6NTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9GSUVMRFMpOiBEZWZpbmUgaGVyZS4KLQkoQ0dFTl9IV19FTlRSWSk6IE5ldyBtZW1iZXIgYHR5cGUnLgotCShod19saXN0KTogRGVsZXRlIGRlY2wuCi0JKGVudW0gY2dlbl9tb2RlKTogRGVjbGFyZS4KLQkoQ0dFTl9PUEVSQU5EKTogTmV3IG1lbWJlciBgaHcnLgotCShlbnVtIGNnZW5fb3BlcmFuZF9pbnN0YW5jZV90eXBlKTogRGVjbGFyZS4KLQkoQ0dFTl9PUEVSQU5EX0lOU1RBTkNFKTogTmV3IHR5cGUuCi0JKENHRU5fSU5TTik6IE5ldyBtZW1iZXIgYG9wZXJhbmRzJy4KLQkoQ0dFTl9PUENPREVfREFUQSk6IE1ha2UgaHdfbGlzdCBjb25zdC4KLQkoZ2V0X2luc25fb3BlcmFuZHMsbG9va3VwX2luc24pOiBBZGQgcHJvdG90eXBlcyBmb3IuCi0KLVR1ZSBGZWIgIDMgMTc6MTE6MjMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JTlNOX01BWF9BVFRSUyk6IFJlbmFtZWQgZnJvbSBDR0VOX01BWF9JTlNOX0FUVFJTLgotCShDR0VOX0hXX0VOVFJZKTogTW92ZSBgbmV4dCcgZW50cnkgdG8gZW5kIG9mIHN0cnVjdC4KLQkoQ0dFTl9LRVlXT1JEX01BWF9BVFRSUyk6IFJlbmFtZWQgZnJvbSBDR0VOX01BWF9LRVlXT1JEX0FUVFJTLgotCShDR0VOX09QRVJBTkRfTUFYX0FUVFJTKTogUmVuYW1lZCBmcm9tIENHRU5fTUFYX09QRVJBTkRfQVRUUlMuCi0KLU1vbiBGZWIgIDIgMTk6MTk6MTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IENvcnJlY3QgdHlwbyBpbiBjb21tZW50IGVuZCBtYXJrZXIuCi0KLU1vbiBGZWIgIDIgMTc6MTA6MzggMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogdGljMzAuaDogTmV3IGZpbGUuCi0KLVRodSBKYW4gMjIgMTc6NTQ6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBBZGQgcHJvdG90eXBlcyBmb3IgY2dlbl9zYXZlX2ZpeHVwcygpLAotCWNnZW5fcmVzdG9yZV9maXh1cHMoKSwgYW5kIGNnZW5fc3dhcF9maXh1cHMoKS4gIENoYW5nZSBwcm90b3R5cGUKLQlvZiBjZ2VuX2FzbV9maW5pc2hfaW5zbigpIHRvIHJldHVybiBhIGNoYXIgKi4KLQotV2VkIEphbiAxNCAxNzoyMTo0MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IEZvcm1hdHRpbmcgY2hhbmdlcyB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgotCi1Nb24gSmFuIDEyIDExOjM3OjM2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKCopOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgotCShDR0VOX0FUVFIpOiBNYWtlIHVuc2lnbmVkIGNoYXIuCi0JKENHRU5fQVRUUl9UWVBFKTogVXBkYXRlLgotCShDR0VOX0FUVFJfe0VOVFJZLFRBQkxFfSk6IE5ldyB0eXBlcy4KLQkoY2dlbl9iYXNlKTogTW92ZSBtZW1iZXIgYGF0dHJzJyB0byBjZ2VuX2luc24uCi0JKENHRU5fS0VZV09SRCk6IE5ldyBtZW1iZXIgYG51bGxfZW50cnknLgotCShDR0VOX3tTWU5UQVgsRk9STUFUfSk6IE5ldyB0eXBlcy4KLQkoY2dlbl9pbnNuKTogRm9ybWF0IGFuZCBzeW50YXggc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlci4KLQotVHVlIERlYyAxNiAxNToxNTo1MiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChkMzB2X29wY29kZSk6IFJlb3JkZXIgZmxhZ3Mgc29tZXdoYXQsIGFkZCBuZXcgZmxhZ3MgZm9yCi0JMiB3b3JkIGxvYWQvc3RvcmUsIEFERHBwcC9TVUJwcHAsIDE2LzMyIGJpdCBtdWx0aXBseS4gIE1ha2UKLQlmbGFnc197dXNlZCxzZXR9IGxvbmcuCi0JKGQzMHZfb3BlcmFuZCk6IE1ha2UgZmxhZ3MgZmllbGQgbG9uZy4KLQotTW9uIERlYyAgMSAxMjoyNDo0NCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay5oOiBGaXggY29tbWVudCBkZXNjcmliaW5nIG9wZXJhbmQgdHlwZXMuCi0KLVN1biBOb3YgMjMgMjI6MzE6MjcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoU0hPUlRfQ01QVSk6IEFkZCBjYXNlIGZvciBjbXB1IGluc3RydWN0aW9uLCBhbmQgbW92ZQotCWV2ZXJ5dGhpbmcgZWxzZSBhZnRlciBkb3duLgotCi1UdWUgTm92IDE4IDE4OjQ1OjE0IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGQxMHYuaCAoT1BFUkFORF9GTEFHKTogU3BsaXQgaW50bzoKLQkoT1BFUkFORF9GRkxBRywgT1BFUkFORF9DRkxBRykgLgotCi1UaHUgTm92IDEzIDExOjA0OjI0IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKHN0cnVjdCBtaXBzX29wY29kZSk6IENoYW5nZWQgY29tbWVudHMgdG8gcmVmbGVjdCBuZXcKLQlmaWVsZCB1c2FnZS4KLQotRnJpIE9jdCAyNCAyMjozNjoyMCAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGRlZCB0byBjb21tZW50cyBhIHF1aWNrLXJlZiBsaXN0IG9mIGFsbCBhc3NpZ25lZAotCW9wZXJhbmQgdHlwZSBjaGFyYWN0ZXJzLgotCShPUF97TUFTSyxTSH1fUEVSRlJFRyk6IE5ldyBtYWNyb3MuCi0KLVdlZCBPY3QgMjIgMTc6Mjg6MzMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaDogQWRkICdfJyBhbmQgJy8nIGZvciB2OWEgYXNyJ3MuCi0JUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+Ci0KLVR1ZSBPY3QgMTQgMTM6MjI6MjkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBCaXQgb3BzIHdpdGggYWJzb2x1dGUgYWRkcmVzc2VzIG5vdCBpbiB0aGUgOCBiaXQKLQlhcmVhIGFyZSBub3QgYXZhaWxhYmxlIGluIHRoZSBiYXNlIG1vZGVsIChIOC8zMDApLgotCi1UaHUgU2VwIDI1IDEzOjAzOjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBSZW1vdmUgZG9jdW1lbnRhdGlvbiBvZiBgIG9wZXJhbmQgc3BlY2lmaWVyLgotCi1XZWQgU2VwIDI0IDE5OjAwOjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBEb2N1bWVudCBxIGFuZCB2IG9wZXJhbmQgc3BlY2lmaWVycy4KLQotTW9uIFNlcCAxNSAxODoyODozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHN0cnVjdCB2ODUwX29wY29kZSk6IEFkZCBwcm9jZXNzb3JzIGZpZWxkLgotCShQUk9DRVNTT1JfVjg1MCwgUFJPQ0VTU09SX0FMTCk6IE5ldyBiaXQgY29uc3RhbnRzLgotCShQUk9DRVNTT1JfVjg1MEUsIFBST0NFU1NPUl9OT1RfVjg1MCk6IE5ldyBiaXQgY29uc3RhbnRzLgotCShQUk9DRVNTT1JfVjg1MEVBKTogTmV3IGJpdCBjb25zdGFudHMuCi0KLU1vbiBTZXAgMTUgMTE6Mjk6NDMgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGQzMHYuaDogQWxsb3cgdXAgdG8gNjQgY29udHJvbCByZWdpc3RlcnMuIEFkZAotCVNIT1JUX0E1UyBmb3JtYXQuCi0KLQkqIGQzMHYuaCAoTE9OR19EYik6IE5ldyBmb3JtIGZvciBkZWxheWVkIGJyYW5jaGVzLgotCi0JKiBkMzB2Lmg6IChMT05HX0RiKTogTmV3IGZvcm0gZm9yIHJlcGVhdGkuCi0KLQkqIGQzMHYuaCAoU0hPUlRfRDJCKTogTmV3IGZvcm0uCi0KLQkqIGQzMHYuaCAoU0hPUlRfQTIpOiBOZXcgZm9ybS4KLQotCSogZDMwdi5oIChPUEVSQU5EXzJSRUcpOiBBZGQgbmV3IG9wZXJhbmQgdG8gaW5kaWNhdGUgMgotCXJlZ2lzdGVycyBhcmUgdXNlZC4gIE5lZWRlZCBmb3IgVkxJVyBvcHRpbWl6YXRpb24uCi0KLU1vbiBTZXAgIDggMTQ6MDU6NDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBNb3ZlIGFzc2VtYmxlciBpbnRlcmZhY2Ugc2VjdGlvbgotCXVwIHNvIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgaXMgZGVmaW5lZCBmb3IgY2dlbl9wYXJzZV9hZGRyZXNzLgotCShjZ2VuX3BhcnNlX2FkZHJlc3MpOiBVcGRhdGUgcHJvdG90eXBlLgotCi1UdWUgU2VwICAyIDE1OjMyOjMyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoVjg1MF9PUFJFQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkpOiBSZW1vdmVkLgotCi1UdWUgQXVnIDI2IDEyOjIxOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oICh0d29fYnl0ZV9zZWdtZW50X2RlZmF1bHRzKTogQ29ycmVjdCBiYXNlIHJlZ2lzdGVyIDUgaW4KLQltb2RlcyAxIGFuZCAyIHRvIGJlIHNzIHJhdGhlciB0aGFuIGRzLiAgRnJvbSBHYWJyaWVsIFBhdWJlcnQKLQk8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogaTM4Ni5oOiBTZXQgdWQyIHRvIDB4MGYwYi4gIEZyb20gR2FicmllbCBQYXViZXJ0Ci0JPHBhdWJlcnRAaXJhbS5lcz4uCi0KLQkqIGkzODYuaDogQ29tbWVudCBmaXhlcyBmb3IgZmljb21bcF0/e3MsbH0gZnJvbSBHYWJyaWVsIFBhdWJlcnQKLQk8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogaTM4Ni5oIChKVU1QX09OX0NYX1pFUk8pOiBVbmNvbW1lbnQgKGRlZmluZSBhZ2FpbikuCi0JKEpVTVBfT05fRUNYX1pFUk8pOiBSZW1vdmUgY29tbWVudGVkIG91dCBtYWNyby4KLQotRnJpIEF1ZyAyMiAxMDozODoyOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfTk9UX1IwKTogTmV3IGZsYWcuCi0KLU1vbiBBdWcgMTggMTE6MDU6NTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChzdHJ1Y3Qgdjg1MF9vcGNvZGUpOiBSZW1vdmUgZmxhZ3MgZmllbGQuCi0KLVdlZCBBdWcgMTMgMTg6NDU6NDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChzdHJ1Y3Qgdjg1MF9vcGNvZGUpOiBBZGQgZmxhZ3MgZmllbGQuCi0JKHN0cnVjdCB2ODUwX29wZXJhbmQpOiBFeHRlbmQgbWVhbmluZyBvZiAnYml0cycgYW5kICdzaGlmdCcKLQlmaWVsZHMuCi0JKFY4NTBFX0lOU1RSVUNUSU9OLCBWODUwRUFfSU5TVFJVQ1RJT04pOiBOZXcgZmxhZ3MuCi0JKFY4NTBFX1BVU0hfUE9QLCBWODUwRV9JTU1FRElBVEUxNiwgVjg1MEVfSU1NRURJQVRFMzIpOiBOZXcgZmxhZ3MuCi0KLUZyaSBBdWcgIDggMTY6NTg6NDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmg6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDI0IDIxOjE2OjU4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX29wY29kZXMpOiBEZWNsYXJlIGFzIGNvbnN0LgotCi1UaHUgSnVsIDEwIDEyOjUzOjI1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChGUF9TLCBGUF9EKTogRGVmaW5lLiAgQml0bWFza3MgaW5kaWNhdGluZyBpZiBhbiBpbnNuCi0JdXNlcyBzaW5nbGUgb3IgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCByZXNvdXJjZXMuCi0JKElOU05fTk9fSVNBLCBJTlNOX0lTQTEpOiBEZWZpbmUuCi0JKGNwdSBzcGVjaWZpYyBJTlNOIG1hY3Jvcyk6IFR3ZWFrIGludG8gYml0bWFza3Mgb3V0c2lkZSB0aGUgcmFuZ2UKLQlvZiBJTlNOX0lTQSBmaWVsZC4KLQotTW9uIEp1biAxNiAxNDoxMDowMCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBpMzg2Lmg6IEZpeCBwYW5kIG9wY29kZS4KLQotTW9uIEp1biAgMiAxMTozNTowOSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBXaWRlbiBJTlNOX0lTQSBhbmQgbW92ZSBpdCB0byBhIG1vcmUgY29udmVuaWVudAotCWJpdCBwb3NpdGlvbi4gIEFkZCBJTlNOXzM5MDAuCi0KLVR1ZSBNYXkgMjAgMTE6MjU6MjkgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoc3RydWN0IG1pcHNfb3Bjb2RlKTogYWRkZWQgbmV3IGZpZWxkIG1lbWJlcnNoaXAuCi0KLU1vbiBNYXkgMTIgMTY6MjY6NTAgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogaTM4Ni5oIChtb3ZkKTogb25seSBSZWczMiBpcyBhbGxvd2VkLgotCi0JKiBpMzg2Lmg6IGFkZCBmY29tcCBhbmQgdWQyLiAgRnJvbSBXYXluZSBTY290dAotCTx3c2NvdHRAaWNoaXBzLmludGVsLmNvbT4uCi0KLU1vbiBNYXkgIDUgMTc6MTY6MjEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEFkZCBNTVggaW5zdHJ1Y3Rpb25zLgotCi1Nb24gTWF5ICA1IDEyOjQ1OjE5IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGkzODYuaDogUmVtb3ZlIFcgbW9kaWZpZXIgZnJvbSBjb25kaXRpb25hbCBtb3ZlIGluc3RydWN0aW9ucy4KLQotTW9uIEFwciAxNCAxNDo1Njo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQ2hhbmdlIHRoZSBvcGNvZGVzIGZvciBmc3VicCwgZnN1YnJwLCBmZGl2cCwgYW5kIGZkaXZycAotCXdpdGggbm8gYXJndW1lbnRzIHRvIG1hdGNoIHRoYXQgZ2VuZXJhdGVkIGJ5IHRoZSBVbml4V2FyZQotCWFzc2VtYmxlci4KLQotVGh1IEFwciAxMCAxNDozNTowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKDxjcHU+X2NnZW5fYXNzZW1ibGVfaW5zbik6IE5ldyBhcmcgZm9yIGVycm1zZy4KLQkoY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKTogRGVjbGFyZS4KLQkoY2dlbl9pbml0X3BhcnNlX29wZXJhbmQpOiBEZWNsYXJlLgotCShjZ2VuX3BhcnNlX29wZXJhbmQpOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fcGFyc2Vfb3BlcmFuZCwKLQluZXcgYXJndW1lbnQgYHdhbnQnLgotCShlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQpOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fcmVzdWx0LgotCShlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlKTogTmV3IGVudW0uCi0KLVNhdCBBcHIgIDUgMTM6MTQ6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IFJldmVydCBsYXN0IHBhdGNoIGZvciB0aGUgTk9OX0JST0tFTl9PUENPREVTIGNhc2VzLgotCi1GcmkgQXByICA0IDExOjQ2OjExIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogTmV3IGZpbGUuCi0KLUZyaSBBcHIgIDQgMTQ6MDI6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IENvcnJlY3Qgb3Bjb2RlIHZhbHVlcyBmb3IgZnN1YnAsIGZzdWJycCwgZmRpdnAsIGFuZAotCWZkaXZycC4KLQotVHVlIE1hciAyNSAyMjo1NzoyNiAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB2ODUwLmggKGV4dHJhY3QpOiAgTWFrZSB1bnNpZ25lZC4KLQotTW9uIE1hciAyNCAxNDozODoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIGljbHIuCi0KLVRodSBNYXIgMjAgMTk6NDk6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IENoYW5nZSBEVyB0byBXIGZvciBjbXB4Y2hnIGFuZCB4YWRkLCBzaW5jZSB0aGV5IGRvbid0Ci0JdGFrZSBhIGRpcmVjdGlvbiBiaXQuCi0KLVNhdCBNYXIgMTUgMTk6MDM6MjkgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCk6IFVzZSBmdWxsIHByb3RvdHlwZS4KLQotRnJpIE1hciAxNCAxNToyMjowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmg6IEluY2x1ZGUgPGFuc2lkZWNsLmg+LiAgVXBkYXRlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB0bwotCXVzZSBwcm90b3R5cGVzLCBhbmQgdG8gdXNlIGNvbnN0IHdoZW4gYXBwcm9wcmlhdGUuCi0KLVRodSBNYXIgIDYgMTQ6MTg6MzAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9SRUxBWCk6IERlZmluZS4KLQotTW9uIEZlYiAyNCAxNToxNTo1NiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBDaGFuZ2UgcHJlX2RlZmluZWRfcmVnaXN0ZXJzIHRvCi0JZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycyBhbmQgcmVnX25hbWVfY250IHRvIGQxMHZfcmVnX25hbWVfY250LgotCi1TYXQgRmViIDIyIDIxOjI1OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgbWFjcm9zIGZvciBjb3AwLCBjb3AxIGNvcDIgYW5kIGNvcDMuCi0JQ2hhbmdlIG1pcHNfb3Bjb2RlcyBmcm9tIGNvbnN0IGFycmF5IHRvIGEgcG9pbnRlciwKLQlhbmQgY2hhbmdlIGJmZF9taXBzX251bV9vcGNvZGVzIGZyb20gY29uc3QgaW50IHRvIGludCwKLQlzbyB0aGF0IHdlIGNhbiBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbWlwcyBvcGNvZGVzIHRhYmxlCi0JZHluYW1pY2FsbHkuCi0KLUZyaSBGZWIgMjEgMTY6MzQ6MTggMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoRkxBR19YKTogUmVtb3ZlIHVudXNlZCBmbGFnLgotCi1UdWUgRmViIDE4IDE3OjM3OjIwIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMzB2Lmg6IE5ldyBmaWxlLgotCi1GcmkgRmViIDE0IDEzOjE2OjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChQRFNfTkFNRSk6IE1hY3JvIHRvIGFjY2VzcyBuYW1lIGZpZWxkIG9mIHByZWRlZmluZWQgc3ltYm9scy4KLQkoUERTX1ZBTFVFKTogTWFjcm8gdG8gYWNjZXNzIHZhbHVlIGZpZWxkIG9mIHByZWRlZmluZWQgc3ltYm9scy4KLQkodGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCk6IEFkZCBwcm90b3R5cGUuCi0KLU1vbiBGZWIgMTAgMTA6MzI6MTcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IENoYW5nZSBwcm90b3R5cGUgdG8gbWF0Y2gKLQljaGFuZ2UgaW4gZnVuY3Rpb24sIGFkZGVkIGNsYXNzIHBhcmFtZXRlci4KLQotVGh1IEZlYiAgNiAxNzozMDoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9FTkRNQVNLKTogQWRkIGZvciBmbGFnZ2luZyBUSWM4MAotCWVuZG1hc2sgZmllbGRzLCB3aGljaCBhcmUgc29tZXdoYXQgd2VpcmQgaW4gdGhhdCAwIGFuZCAzMiBhcmUKLQl0cmVhdGVkIGV4YWN0bHkgdGhlIHNhbWUuCi0KLVRodSBKYW4gMzAgMTM6NDY6MTggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmg6IENoYW5nZSBhbGwgdGhlIE9QRVJBTkQgZGVmaW5lcyB0byB1c2UgdGhlIGZvcm0gKDEgPDwgWCkKLQlyYXRoZXIgdGhhbiBhIGNvbnN0YW50IHRoYXQgaXMgMioqWC4gIFJlb3JkZXIgdGhlbSB0byBwdXQgYml0cyBmb3IKLQlvcGVyYW5kcyB0aGF0IGhhdmUgc3ltYm9saWMgbmFtZXMgaW4gdGhlIHVwcGVyIGJpdHMsIHNvIHRoZXkgY2FuCi0JYmUgcGFja2VkIGludG8gYW4gaW50IHdoZXJlIHRoZSBsb3dlciBiaXRzIGNvbnRhaW4gdGhlIHZhbHVlIHRoYXQKLQljb3JyZXNwb25kcyB0byB0aGF0IHN5bWJvbGljIG5hbWUuCi0JKHByZWRlZmluZWRfc3ltYm8pOiBBZGQgc3RydWN0LgotCSh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBEZWNsYXJlIGFycmF5IG9mIHRyYW5zbGF0aW9ucy4KLQkodGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyk6IERlY2xhcmUgc2l6ZSBvZiB0aGF0IGFycmF5LgotCSh0aWM4MF92YWx1ZV90b19zeW1ib2wpOiBEZWNsYXJlIGZ1bmN0aW9uLgotCSh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBEZWNsYXJlIGZ1bmN0aW9uLgotCi1XZWQgSmFuIDI5IDA5OjM3OjI1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC5oIChNTjEwMjAwX09QRVJBTkRfUkVMQVgpOiBEZWZpbmUuCi0KLVNhdCBKYW4gMTggMTU6MTg6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX05PX1IwX0RFU1QpOiBBZGQgZm9yIG9wY29kZXMgd2hlcmUgcjAgY2Fubm90Ci0JYmUgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgotCi1UaHUgSmFuIDE2IDIwOjQ4OjU1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChzdHJ1Y3QgdGljODBfb3Bjb2RlKTogQ2hhbmdlICJmb3JtYXQiIGZpZWxkIHRvICJmbGFncyIuCi0JKEZNVF9VTlVTRUQsIEZNVF9TSSwgRk1UX0xJLCBGTVRfUkVHKTogRGVsZXRlLgotCShUSUM4MF9WRUNUT1IpOiBEZWZpbmUgYSBmbGFnIGJpdCBmb3IgdGhlIGZsYWdzLiAgVGhpcyBvbmUgbWVhbnMKLQl0aGF0IHRoZSBvcGNvZGUgY2FuIGhhdmUgdHdvIHZlY3RvciBpbnN0cnVjdGlvbnMgaW4gYSBzaW5nbGUKLQkzMiBiaXQgd29yZCBhbmQgd2UgaGF2ZSB0byBlbmNvZGUvZGVjb2RlIGJvdGguCi0KLVR1ZSBKYW4gMTQgMTk6Mzc6MDkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfUENSRUwpOiBSZW5hbWVkIGZyb20KLQlUSUM4MF9PUEVSQU5EX1JFTEFUSVZFIGZvciBQQyByZWxhdGl2ZS4KLQkoVElDODBfT1BFUkFORF9CQVNFUkVMKTogTmV3IGZsYWcgYml0IGZvciByZWdpc3RlcgotCWJhc2UgcmVsYXRpdmUuCi0KLU1vbiBKYW4gMTMgMTU6NTY6MzggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfRkxPQVQpOiBBZGQgZm9yIGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzLgotCi1Nb24gSmFuICA2IDEwOjUxOjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX1NDQUxFRCk6IE9wZXJhbmQgbWF5IGhhdmUgb3B0aW9uYWwKLQkiOnMiIG1vZGlmaWVyIGZvciBzY2FsaW5nLgotCi1TdW4gSmFuICA1IDEyOjEyOjE5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX01fU0kpOiBBZGQgb3BlcmFuZCBtb2RpZmllciBmb3IgIjptIi4KLQkoVElDODBfT1BFUkFORF9NX0xJKTogRGl0dG8KLQotU2F0IEphbiAgNCAxOTowMjo0NCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9CSVROVU0pOiBSZW5hbWVkIGZyb20gVElDODBfT1BFUkFORF9DQ19TWi4KLQkoVElDODBfT1BFUkFORF9DQyk6IE5ldyBkZWZpbmUgZm9yIGNvbmRpdGlvbiBjb2RlIG9wZXJhbmQuCi0JKFRJQzgwX09QRVJBTkRfQ1IpOiBOZXcgZGVmaW5lIGZvciBjb250cm9sIHJlZ2lzdGVyIG9wZXJhbmQuCi0KLUZyaSBKYW4gIDMgMTY6MjI6MjMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKHN0cnVjdCB0aWM4MF9vcGNvZGUpOiBOYW1lIGNoYW5nZWQuCi0JKHN0cnVjdCB0aWM4MF9vcGNvZGUpOiBSZW1vdmUgZm9ybWF0IGZpZWxkLgotCShzdHJ1Y3QgdGljODBfb3BlcmFuZCk6IEFkZCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zLgotCShUSUM4MF9PUEVSQU5EXyopOiBSZW1vdmUgb2xkIGJvZ3VzIHZhbHVlcywgc3RhcnQgYWRkaW5nIG5ldwotCWNvcnJlY3Qgb25lcy4KLQkoRk1UXyopOiBEaXR0by4KLQotVHVlIERlYyAzMSAxNTowNTo0MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkpOiBOZXcgZmxhZyB0byBhZGp1c3QKLQl0eXBlIElWIGluc3RydWN0aW9uIG9mZnNldHMuCi0KLUZyaSBEZWMgMjcgMjI6MjM6MTAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmg6IE5ldyBmaWxlLgotCi1XZWQgRGVjIDE4IDEwOjA2OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC5oIChNTjEwMjAwX09QRVJBTkRfTk9DSEVDSyk6IERlZmluZS4KLQotU2F0IERlYyAxNCAxMDo0ODozMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogbW4xMDIwMC5oOiBGaXggY29tbWVudCwgbW4xMDIwMF9vcGVyYW5kIG5vdCBwb3dlcnBjX29wZXJhbmQuCi0JKiBtbjEwMzAwLmg6IEZpeCBjb21tZW50LCBtbjEwMzAwX29wZXJhbmQgbm90IHBvd2VycGNfb3BlcmFuZC4KLQkqIHY4NTAuaDogRml4IGNvbW1lbnQsIHY4NTBfb3BlcmFuZCBub3QgcG93ZXJwY19vcGVyYW5kLgotCi1Nb24gRGVjICA5IDE2OjQ1OjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC5oOiBGbGVzaCBvdXQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIGJ5Ci0JdGhlIG1uMTAyMDAgYXNzZW1ibGVyICYgZGlzYXNzZW1ibGVyLgotCi1UdWUgTm92IDI2IDEwOjQ2OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgbWlwczE2IGRlZmluaXRpb25zLgotCi1Nb24gTm92IDI1IDE3OjU2OjU0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IERvY3VtZW50IG5ldyA8LCA+LCBtLCBuLCBvIGFuZCBwIG9wZXJhbmQgc3BlY2lmaWVycy4KLQotV2VkIE5vdiAyMCAxMDo1OTo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1BDUkVMKTogRGVmaW5lLgotCShNTjEwMzAwX09QRVJBTkRfTUVNQUREUik6IERlZmluZS4KLQotVHVlIE5vdiAxOSAxMzozMDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUKTogRGVmaW5lLgotCi1XZWQgTm92ICA2IDEzOjQxOjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfU1BMSVQpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgIDUgMTM6MjY6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCk6IERlZmluZS4KLQotTW9uIE5vdiAgNCAxMjo1Mjo0OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEKTogRGVmaW5lLgotCi1GcmkgTm92ICAxIDEwOjMxOjAyIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS5oOiBEb24ndCBpbmNsdWRlICJiZmQuaCI7IHByaXZhdGUgcmVsb2NhdGlvbiB0eXBlcyBhcmUgbm93Ci0gCW5lZ2F0aXZlIHRvIG1pbmltaXplIHByb2JsZW1zIHdpdGggc2hhcmVkIGxpYnJhcmllcy4gIE9yZ2FuaXplCi0gCWluc3RydWN0aW9uIHN1YnNldHMgYnkgQU1BU0sgZXh0ZW5zaW9ucyBhbmQgUEFMY29kZQotIAlpbXBsZW1lbnRhdGlvbi4KLQkoc3RydWN0IGFscGhhX29wZXJhbmQpOiBNb3ZlIGZsYWdzIHNsb3QgZm9yIGJldHRlciBwYWNraW5nLgotCi1UdWUgT2N0IDI5IDEyOjE5OjEwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oIChWODUwX09QRVJBTkRfUkVMQVgpOiBOZXcgb3BlcmFuZCBmbGFnLgotCi1UaHUgT2N0IDEwIDE0OjI5OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChGTVRfKik6IE1vdmUgb3BlcmFuZCBmb3JtYXQgZGVmaW5pdGlvbnMKLQloZXJlLgotCi1UdWUgT2N0ICA4IDE0OjQ4OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUEFSRU4pOiBEZWZpbmUuCi0KLU1vbiBPY3QgIDcgMTY6NTI6MTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKG1uMTAzMDBfb3Bjb2RlKTogQWRkICJmb3JtYXQiIGZpZWxkLgotCShNTjEwMzAwX09QRVJBTkRfKik6IERlZmluZS4KLQotVGh1IE9jdCAgMyAxMDozMzo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTB4MDAuaDogRGVsZXRlLgotCSogbW4xMDIwMC5oLCBtbjEwMzAwLmg6IE5ldyBmaWxlcy4KLQotV2VkIE9jdCAgMiAyMTozMToyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTB4MDAuaDogTmV3IGZpbGUuCi0KLUZyaSBTZXAgMjcgMTg6MjY6NDYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oOiAgQWRkIG5ldyBmbGFnIHRvIGluZGljYXRlIHRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyBhIFBDCi0JZGlzcGxhY2VtZW50LgotCi1GcmkgU2VwIDEzIDE0OjU4OjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoc3RtYWMpOiBBZGQgbWlzc2luZyBpbnN0cnVjdGlvbi4KLQotU2F0IEF1ZyAzMSAxNjowMjowMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAuaCAodjg1MF9vcGNvZGUpOiBSZW1vdmUgInNpemUiIGZpZWxkLiAgQWRkICJtZW1vcCIKLQlmaWVsZC4KLQotRnJpIEF1ZyAyMyAxMDozOTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAuaCAoVjg1MF9PUEVSQU5EX0VQKTogRGVmaW5lLgotCi0JKiB2ODUwLmggKHY4NTBfb3Bjb2RlKTogQWRkIHNpemUgZmllbGQuCi0KLVRodSBBdWcgMjIgMTY6NTE6MjUgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHY4NTBfb3BlcmFuZHMpOiBBZGQgaW5zZXJ0IGFuZCBleHRyYWN0IGZpZWxkcywgcG9pbnRlcnMKLSAJdG8gZnVuY3Rpb25zIHVzZWQgdG8gaGFuZGxlIHVudXN1YWwgb3BlcmFuZCBlbmNvZGluZy4KLQkoVjg1MF9PUEVSQU5EX1JFRywgVjg1MF9PUEVSQU5EX1NSRywgVjg1MF9PUEVSQU5EX0NDLAotIAlWODUwX09QRVJBTkRfU0lHTkVEKTogRGVmaW5lZC4KLQotV2VkIEF1ZyAyMSAxNzo0NToxMCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAodjg1MF9vcGVyYW5kcyk6IEFkZCBmbGFncyBmaWVsZC4KLQkoT1BFUkFORF9SRUcsIE9QRVJBTkRfTlVNKTogRGVmaW5lZC4KLQotVHVlIEF1ZyAyMCAxNDo1MjowMiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGZpbGUuCi0KLUZyaSBBdWcgMTYgMTQ6NDQ6MTUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBtaXBzLmggKE9QX1NIX0xPQ0MsIE9QX1NIX0hJQ0MsIE9QX01BU0tfQ0MsIE9QX1NIX0NPUDFOT1JNLAotIAlPUF9NQVNLX0NPUDFOT1JNLCBPUF9TSF9DT1AxU1BFQywgT1BfTUFTS19DT1AxU1BFQywKLSAJT1BfTUFTS19DT1AxU0NMUiwgT1BfTUFTS19DT1AxQ01QLCBPUF9TSF9DT1AxQ01QLCBPUF9TSF9GT1JNQVQsCi0gCU9QX01BU0tfRk9STUFULCBPUF9TSF9UUlVFLCBPUF9NQVNLX1RSVUUsIE9QX1NIX0dFLCBPUF9NQVNLX0dFLAotIAlPUF9TSF9VTlNJR05FRCwgT1BfTUFTS19VTlNJR05FRCwgT1BfU0hfSElOVCwgT1BfTUFTS19ISU5UKToKLSAJRGVmaW5lZC4KLQotRnJpIEF1ZyAxNiAwMDoxNToxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGl0bGIsIHBpdGxiZSwgaWl0bGJhLCBpaXRsYnAsIGZpYywgZmljZSk6IEFjY2VwdAotCWEgMyBiaXQgc3BhY2UgaWQgaW5zdGVhZCBvZiBhIDIgYml0IHNwYWNlIGlkLgotCi1UaHUgQXVnIDE1IDEzOjExOjQ2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IEFkZCBzb21lIGFkZGl0aW9uYWwgZGVmaW5lcyB0byBzdXBwb3J0IHRoZQotIAlhc3NlbWJsZXIgaW4gZGV0ZXJtaW5pbmcgd2hpY2ggb3BlcmF0aW9ucyBjYW4gYmUgZG9uZSBpbiBwYXJhbGxlbC4KLQotVHVlIEF1ZyAgNiAxMToxMzoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKFNOKTogRGVmaW5lLgotCShlZXBtb3YuYik6IFJlbmFtZWQgZnJvbSAiZWVwbW92IgotCShub3AsIGJwdCwgcnRlLCBydHMsIHNsZWVwLCBjbHJtYWMpOiBUaGVzZSBoYXZlIG5vIHNpemUgYXNzb2NpYXRlZAotCXdpdGggdGhlbS4KLQotRnJpIEp1bCAyNiAxMTo0NzoxMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oIChPUEVSQU5EX1NISUZUKTogTmV3IG9wZXJhbmQgZmxhZy4KLQotVGh1IEp1bCAyNSAxMjowNjoyMiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBDaGFuZ2VzIGZvciBkaXZzLCBwYXJhbGxlbC1vbmx5IGluc3RydWN0aW9ucywgYW5kCi0gCXNpZ25lZCBudW1iZXJzLgotCi1Nb24gSnVsIDIyIDExOjIxOjE1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LmggKHBkX3JlZyk6IERlZmluZS4gUHV0dGluZyB0aGUgZGVmaW5pdGlvbiBoZXJlIGFsbG93cwotCXRoZSBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciB0byBzaGFyZSB0aGUgc2FtZSBzdHJ1Y3QuCi0KLU1vbiBKdWwgMjIgMTI6MTU6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLmggKGk5NjBfb3Bjb2Rlcyk6ICJoYWx0IiB0YWtlcyBhbiBhcmd1bWVudC4gIEZyb20gU3RlcGhlbgotCVdpbGxpYW1zIDxzdGV2ZUBpY2FydXMuY29tPi4KLQotV2VkIEp1bCAxNyAxNDo0NjozOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBOZXcgZmlsZS4KLQotVGh1IEp1bCAxMSAxMjowOToxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKGJhbmQsIGJjbHIpOiBGb3JjZSBoaWdoIGJpdCBvZiBpbW1lZGlhdGUgbmliYmxlIHRvIHplcm8uCi0KLVdlZCBKdWwgIDMgMTQ6MzA6MTIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0gCSogbTY4ay5oIChtY2Y1MjAwKTogTmV3IG1hY3JvLgotCURvY3VtZW50IG5hbWVzIG9mIGNvbGRmaXJlIGNvbnRyb2wgcmVnaXN0ZXJzLgotCi1UdWUgSnVsICAyIDIzOjA1OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoU1JDX0lOX0RTVCk6IERlZmluZS4KLQotCSogaDgzMDAuaCAoVU5PUDMpOiBNYXJrIHRoZSByZWdpc3RlciBvcGVyYW5kIGluIHRoaXMgaW5zbgotCWFzIGEgc291cmNlIG9wZXJhbmQsIG5vdCBhIGRlc3RpbmF0aW9uIG9wZXJhbmQuCi0JKFNISUZUXzIsIFNISUZUX0lNTSk6IFJlbW92ZS4gIEVsaW1pbmF0ZSBhbGwgcmVmZXJlbmNlcy4KLQkoVU5PUDMpOiBDaGFuZ2UgU0hJRlRfSU1NIHRvIElNTSBmb3IgSDgvUyBiaXRvcHMuICBNYXJrCi0JcmVnaXN0ZXIgb3BlcmFuZCB3aXRoIFNSQ19JTl9EU1QuCi0KLUZyaSBKdW4gMjEgMTM6NTI6MTcgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IE5ldyBmaWxlLgotCi1UaHUgSnVuIDIwIDE1OjAyOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2ay5oOiBSZW1vdmUgb2Jzb2xldGUgZmlsZS4KLQotV2VkIEp1biAxOSAxNToyOTozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQ29ycmVjdCBvcGNvZGUgdmFsdWVzIGZvciBmYWRkcCwgZnN1YnAsIGZzdWJycCwgZm11bHAsCi0JZmRpdnAsIGFuZCBmZGl2cnAuICBBZGQgZmZyZWVwLgotCi1UdWUgSnVuIDE4IDE2OjA2OjAwIDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBoODMwMC5oOiBSZW9yZGVyIHZhcmlvdXMgI2RlZmluZXMgZm9yIHJlYWRhYmlsaXR5LgotCShBQlMzMlNSQywgQUJTMzJEU1QsIERTUDMyTElTVCwgQUJTMzJMSVNULCBBMzJMSVNUKTogRGVmaW5lLgotCShCSVRPUCk6IEFjY2VwdCBhZGRpdGlvbmFsICh1bnVzZWQpIGFyZ3VtZW50LiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoRUJJVE9QKTogTGlrZXdpc2UuCi0JKE9fTEFTVCk6IEJ1bXAuCi0JKGxkYywgc3RjLCBtb3ZiLCBtb3Z3LCBtb3ZsKTogVXNlIDMyYml0IG9mZnNldHMgYW5kIGFic29sdXRlcy4KLQotCSogaDgzMDAuaCAoRVhSLCBTSElGVF8yLCBNQUNSRUcsIFNISUZUX0lNTSwgUkRJTkMpOiBEZWZpbmUuCi0JKE9fVEFTLCBPX0NMUk1BQywgT19MRE1BQywgT19NQUMsIE9fTERNLCBPX1NUTSk6IERlZmluZS4KLQkoQklUT1AsIEVCSVRPUCk6IEhhbmRsZSBuZXcgSDgvUyBhZGRyZXNzaW5nIG1vZGVzIGZvcgotCWJpdCBpbnNucy4KLQkoVU5PUDMpOiBIYW5kbGUgbmV3IHNoaWZ0L3JvdGF0ZSBpbnNucyBvbiB0aGUgSDgvUy4KLQkoaW5zbnMgdXNpbmcgZXhyKTogTmV3IGluc3RydWN0aW9ucy4KLQkodGFzLCBtYWMsIGxkbWFjLCBjbHJtYWMsIGxkbSwgc3RtKTogTmV3IGluc3RydWN0aW9ucy4KLQotVGh1IE1heSAyMyAxNjo1Njo0OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKGFkZC5sKTogVW5kbyBBcHIgNXRoIGNoYW5nZS4gIFRoZSBtYW51YWwgSSBoYWQKLQl3YXMgaW5jb3JyZWN0LgotCi1Nb24gTWF5ICA2IDIzOjM4OjIyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoU1RBUlQpOiBSZW1vdmUuCi0JKE1FTVJFTEFYKTogRGVmaW5lLiAgTWFyayBhYnNvbHV0ZSBtZW1vcnkgb3BlcmFuZHMgaW4gbW92LmIsIG1vdi53Ci0JYW5kIG1vdi5sIGluc25zIHRoYXQgY2FuIGJlIHJlbGF4ZWQuCi0KLVR1ZSBBcHIgMzAgMTg6MzA6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IFJlbW92ZSBBYnMzMiBmcm9tIGxjYWxsLgotCi1Nb24gQXByIDIyIDE3OjA5OjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAYmx1ZXMuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCk6IE5ldyBtYWNyby4KLQkoU0xDUE9QKTogTmV3IG1hY3JvLgotCU1hcmsgWCxZIG9wY29kZSBsZXR0ZXJzIGFzIGluIHVzZS4KLQotVGh1IEFwciAxMSAxNzoyODoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKEZfRkxPQVQsIEZfRkJSKTogRGVmaW5lLgotCi1GcmkgQXByICA1IDE2OjU1OjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoQUJTOE1FTSk6IFJlbmFtZWQgZnJvbSBBQlNNT1YuICBSZW1vdmUgQUJTTU9WCi0JZnJvbSBhbGwgaW5zbnMuCi0JKEFCUzhTUkMsQUJTOERTVCk6IEFkZCBBQlM4TUVNLgotCShhZGQubCk6IEZpeCByZWcrcmVnIHZhcmlhbnQuCi0JKGVlcG1vdi53KTogUmVuYW1lZCBmcm9tIGVlcG1vdncuCi0JKGxkYyxzdGMpOiBGaXggbWFueSBjYXNlcy4KLQotU3VuIE1hciAzMSAxMzozMDowMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChTUEFSQ19PUENPREVfQVJDSF9NQVNLKTogTmV3IG1hY3JvLgotCi1UaHUgTWFyICA3IDE1OjA4OjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChPKTogTWFyayBvcGVyYW5kIGxldHRlciBhcyBpbiB1c2UuCi0KLVR1ZSBGZWIgMjAgMjA6NDY6MjEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9zcGFyY2xldF9jcHJlZyk6IERlY2xhcmUuCi0JTWFyayBvcGVyYW5kIGxldHRlcnMgdVUgYXMgaW4gdXNlLgotCi1Nb24gRmViIDE5IDAxOjU5OjA4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY19vcGNvZGVfYXJjaF92YWwpOiBBZGQgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQuCi0JKHNwYXJjX29wY29kZV9hcmNoKTogRGVsZXRlIG1lbWJlciBgY29uZmxpY3RzJy4gIEFkZCBgc3VwcG9ydGVkJy4KLQkoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCk6IE5ldyBtYWNyby4KLQkoU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1ApOiBSZXdyaXRlLgotCShGX05PVFY5KTogRGVsZXRlLgotCi1GcmkgRmViIDE2IDEyOjIzOjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKSBNYWtlIHJldHVybiB0eXBlIGluCi0JZGVjbGFyYXRpb24gY29uc2lzdGVudCB3aXRoIHJldHVybiB0eXBlIGluIGRlZmluaXRpb24uCi0KLVdlZCBGZWIgMTQgMTg6MTQ6MTEgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBSZW1vdmUgRGF0YTMyIGZyb20gcHVzaGYgYW5kIHBvcGYuCi0KLVRodSBGZWIgIDggMTQ6Mjc6MjEgMTk5NiAgSmFtZXMgQ2FybHNvbiA8Y2FybHNvbkB4eWxvZ2ljcy5jb20+Ci0KLQkqIGkzODYuaCAoaTM4Nl9yZWd0YWIpOiBBZGQgODA0ODYgdGVzdCByZWdpc3RlcnMuCi0KLU1vbiBGZWIgIDUgMTg6MzU6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLmggKElfSFgpOiBEZWZpbmUuCi0JKGk5NjBfb3Bjb2Rlcyk6IEFkZCBIWCBpbnN0cnVjdGlvbi4KLQotTW9uIEphbiAyOSAxMjo0MzozOSAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBGaXggd2FpdGluZyBmb3JtcyBvZiBmaW5pdCwgZnN0ZW52LCBmc2F2ZSwgZnN0c3csIGZzdGN3LAotCWFuZCBmY2xleC4KLQotV2VkIEphbiAyNCAyMjozNjo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwpOiBSZXBsYWNlcyBzcGFyY19hcmNoaXRlY3R1cmUuCi0JKFNQQVJDX09QQ09ERV9DT05GTElDVF9QKTogUmVuYW1lZCBmcm9tIEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUC4KLQkoYmZkXyogZGVmaW5lcyk6IERlbGV0ZS4KLQkoc3BhcmNfb3Bjb2RlX2FyY2hzKTogUmVwbGFjZXMgYXJjaGl0ZWN0dXJlX3BuYW1lLgotCShzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpOiBEZWNsYXJlLgotCShOVU1PUENPREVTKTogRGVsZXRlLgotCi1Nb24gSmFuIDIyIDA4OjI0OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIHNwYXJjX2FyY2hpdGVjdHVyZSk6IEFkZCB2OWEuCi0JKEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUCk6IFVwZGF0ZS4KLQotVGh1IERlYyAyOCAxMzoyNzo1MyAxOTk1ICBKb2huIEhhc3NleSAgPGhhc3NleUBydHAuZGcuY29tPgotCi0JKiBpMzg2Lmg6IEFkZGVkIFBlbnRpdW0gUHJvIGluc3RydWN0aW9ucy4KLQotVGh1IE5vdiAgMiAyMjo1OToyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogRG9jdW1lbnQgbmV3ICdXJyBvcGVyYW5kIHBsYWNlLgotCi1UdWUgT2N0IDI0IDEwOjQ5OjEwIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBBZGQgbGNpIGFuZCBzeW5jZG1hIGluc3RydWN0aW9ucy4KLQotTW9uIE9jdCAyMyAxMTowOToxNiAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogbWlwcy5oOiBBZGRlZCBJTlNOXzQxMDAgZmxhZyB0byBtYXJrIE5FQyBWUjQxMDAgc3BlY2lmaWMKLSAJaW5zdHJ1Y3Rpb25zLgotCi1Nb24gT2N0IDE2IDEwOjI4OjE1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKFBQQ19PUENPREVfe0NPTU1PTixBTll9KTogTmV3IG9wY29kZSBmbGFncyBmb3IKLQlhc3NlbWJsZXIncyAtbWNvbSBhbmQgLW1hbnkgc3dpdGNoZXMuCi0KLVdlZCBPY3QgMTEgMTY6NTY6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogRml4IGNtcHhjaGc4YiBleHRlbnNpb24gb3Bjb2RlIGRlc2NyaXB0aW9uLgotCi1UaHUgT2N0ICA1IDE4OjAzOjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEFkZCBQZW50aXVtIGluc3RydWN0aW9ucyB3cm1zciwgcmR0c2MsIHJkbXNyLCBjbXB4Y2hnOGIsCi0JYW5kIHJlZ2lzdGVyIGNyNC4KLQotVHVlIFNlcCAxOSAxNToyNjo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogQ2hhbmdlIGNvbW1lbnQ6IHNwbGl0IHR5cGUgUCBpbnRvIHR5cGVzIDAsIDEgYW5kIDIuCi0KLVdlZCBBdWcgMzAgMTM6NTA6NTUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3ByZWZldGNoKTogRGVjbGFyZS4KLQotVHVlIEF1ZyAyOSAxNTozNDo1OCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY197ZW5jb2RlLGRlY29kZX1fe2FzaSxtZW1iYXJ9KTogRGVjbGFyZS4KLQotV2VkIEF1ZyAgMiAxODozMjoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGttcmkuaDogUmVtb3ZlLgotCi0JKiBtNjhrLmg6IE1vdmUgdGFibGVzIGludG8gb3Bjb2Rlcy9tNjhrLW9wYy5jLCBsZWF2aW5nIGp1c3QgdGhlCi0JZGVjbGFyYXRpb25zLiAgUmVtb3ZlIEZfQUxJQVMgYW5kIGZsYWcgZmllbGQgb2Ygc3RydWN0Ci0JbTY4a19vcGNvZGUuICBDaGFuZ2UgYXJjaCBmaWVsZCBvZiBzdHJ1Y3QgbTY4a19vcGNvZGUgdG8gdW5zaWduZWQKLQlpbnQuICBNYWtlIG5hbWUgYW5kIGFyZ3MgZmllbGRzIG9mIHN0cnVjdCBtNjhrX29wY29kZSBjb25zdC4KLQotV2VkIEF1ZyAgMiAwODoxNjo0NiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChGX05PVFY5KTogRGVmaW5lLgotCi1UdWUgSnVsIDExIDE0OjIwOjQyIDE5OTUgIEplZmYgU3BpZWdlbCAgPGplZmZzQGxzaWwuY29tPgotCi0JKiBtaXBzLmggKElOU05fNDAxMCk6IERlZmluZS4KLQotV2VkIEp1biAyMSAxODo0OTo1MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLmggKFRCTDEpOiBSZXZlcnNlIHNlbnNlIG9mICJyb3VuZCIgYXJndW1lbnQgaW4gcmVzdWx0LgotCi0JQ2hhbmdlcyBmcm9tIEFuZHJlYXMgU2Nod2FiIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgotCSogbTY4ay5oOiBGaXggYXJndW1lbnQgZGVzY3JpcHRpb25zIG9mIGNvcHJvY2Vzc29yCi0JaW5zdHJ1Y3Rpb25zIHRvIGFsbG93IG9ubHkgYWx0ZXJhYmxlIG9wZXJhbmRzIHdoZXJlIGFwcHJvcHJpYXRlLgotCVshTk9fREVGQVVMVF9TSVpFU106IEFuIG9taXR0ZWQgc2l6ZSBkZWZhdWx0cyB0byBgdycuCi0JKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgbW9yZSBhbGlhc2VzLgotCi1GcmkgQXByIDE0IDIyOjE1OjM0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogQWRkZWQgZXhwbGNpdGx5IHNob3J0LXNpemVkIGNvbmRpdGlvbmFsIGJyYW5jaGVzLCBhbmQgYQotCWJ1bmNoIG9mIGFsaWFzZXMgKGZtb3YqLCBmdGVzdCosIHRkaXZ1bCkgdG8gc3VwcG9ydCBnY2MncwotCXN2cjQtYmFzZWQgY29uZmlndXJhdGlvbnMuCi0KLU1vbiBNYXIgMTMgMjE6MzA6MDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCU1vbiBGZWIgMjcgMDg6MzY6MzkgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQkqIGkzODYuaDogYWRkZWQgbWlzc2luZyBEYXRhMTYvRGF0YTMyIGZsYWdzIHRvIGEgZmV3IGluc3RydWN0aW9ucy4KLQotV2VkIE1hciAgOCAxNToxOTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoT1BfTUFTS19GUiwgT1BfU0hfRlIpOiBEZWZpbmUuCi0JKE9QX01BU0tfQkNDLCBPUF9TSF9CQ0MpOiBEZWZpbmUuCi0JKE9QX01BU0tfUFJFRlgsIE9QX1NIX1BSRUZYKTogRGVmaW5lLgotCShPUF9NQVNLX0NDQywgT1BfU0hfQ0NDKTogRGVmaW5lLgotCShJTlNOX1JFQURfRlBSX1IpOiBEZWZpbmUuCi0JKElOU05fUkZFKTogRGVsZXRlLgotCi1XZWQgTWFyICA4IDAzOjEzOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGsuaCAoZW51bSBtNjhrX2FyY2hpdGVjdHVyZSk6IERlbGV0ZWQuCi0JKHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyk6IE5ldyB0eXBlLgotCShtNjhrX29wY29kZXMpOiBOb3cgY29uc3QuICBEZWxldGVkIG9wY29kZSBhbGlhc2VzIHdpdGggZXhhY3RseQotCW1hdGNoaW5nIGNvbnN0cmFpbnRzLCB2YWx1ZXMgYW5kIGZsYWdzLiAgQXMgYSBzaWRlIGVmZmVjdCBvZiB0aGlzLAotCXRoZSBNT1RPUk9MQV9TWU5UQVhfT05MWSBhbmQgTUlUX1NZTlRBWF9PTkxZIG1hY3Jvcywgd2hpY2ggc28gZmFyCi0JYXMgSSBrbm93IHdlcmUgbmV2ZXIgdXNlZCwgbm93IG1heSBuZWVkIHJlLWV4YW1pbmluZy4KLQkobnVtb3Bjb2Rlcyk6IE5vdyBjb25zdC4KLQkobTY4a19vcGNvZGVfYWxpYXNlcywgbnVtYWxpYXNlcyk6IE5ldyB2YXJpYWJsZXMuCi0JKGVuZG9wKTogRGVsZXRlZC4KLQlbRE9OVF9ERUZJTkVfVEFCTEVdOiBEZWNsYXJlIG51bW9wY29kZXMsIG51bWFsaWFzZXMsIGFuZAotCW02OGtfb3Bjb2RlX2FsaWFzZXM7IHVwZGF0ZSBkZWNsYXJhdGlvbiBvZiBtNjhrX29wY29kZXMuCi0KLU1vbiBNYXIgIDYgMTA6MDI6MDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaCAoZGVsYXlfdHlwZSk6IERlbGV0ZSB1bnVzZWQgZW51bWVyYXRpb24uCi0JKHBhX29wY29kZSk6IFJlcGxhY2UgdW51c2VkIGRlbGF5ZWQgZmllbGQgd2l0aCBhbiBhcmNoaXRlY3R1cmUKLQlmaWVsZC4KLQkocGFfb3Bjb2Rlcyk6IE1hcmsgZWFjaCBpbnN0cnVjdGlvbiBhcyBlaXRoZXIgUEExLjAgb3IgUEExLjEuCi0KLUZyaSBNYXIgIDMgMTY6MTA6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKElOU05fSVNBNCk6IERlZmluZS4KLQotRnJpIEZlYiAyNCAxOToxMzozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoTV9ETEFfQUIsIE1fRExJKTogRGVmaW5lLgotCi1UaHUgRmViIDIzIDE3OjMzOjA5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKGZzdHd4KTogRml4IHNpbmdsZS1iaXQgZXJyb3IuCi0KLVdlZCBGZWIgMTUgMTI6MTk6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE1fVUxELCBNX1VMRF9BLCBNX1VTRCwgTV9VU0RfQSk6IERlZmluZS4KLQotTW9uIEZlYiAgNiAxMDozNToyMyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogYWRkZWQgY3B1aWQgaW5zdHJ1Y3Rpb24gLCBhbmQgZHJbMC03XSBhbGlhc2VzIGZvciB0aGUKLQkgIGRlYnVnIHJlZ2lzdGVycy4gIEZyb20gQ2hhcmxlcyBIYW5udW0gKG15Y3JvZnRAbmV0YnNkLm9yZykuCi0KLU1vbiBGZWIgIDYgMDM6MzE6NTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBCcnlhbiBGb3JkIDxiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1PiBmb3IgMTYtYml0Ci0JaTM4NiBzdXBwb3J0OgotCSogaTM4Ni5oIChNT1ZfQVhfRElTUDMyKTogTmV3IG1hY3JvLgotCShpMzg2X29wdGFiKTogQWRkZWQgRGF0YTE2IGFuZCBEYXRhMzIgYXMgbmVlZGVkLiAgQWRkZWQgInciIGZvcm1zCi0Jb2Ygc2V2ZXJhbCBjYWxsL3JldHVybiBpbnN0cnVjdGlvbnMuCi0JKEFERFJfUFJFRklYX09QQ09ERSk6IE5ldyBtYWNyby4KLQotTW9uIEphbiAyMyAxNjo0NTo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU2F0IEphbiAyMSAxNzo1MDozOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogLi4vaW5jbHVkZS9vcGNvZGUvdmF4LmggKHN0cnVjdCB2b3Rfd290LCBmaWVsZCBgYXJncycpOiAgbWFrZQotCWl0IHBvaW50ZXIgdG8gY29uc3QgY2hhcjsKLQkoc3RydWN0IHZvdCwgZmllbGQgYG5hbWUnKTogIGRpdHRvLgotCi1UaHUgSmFuIDE5IDE0OjQ3OjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHZheC5oOiBTdXBwbHkgYW5kIHByb3Blcmx5IGdyb3VwIGFsbCB2YWx1ZXMgaW4gZW5kIHNlbnRpbmVsLgotCi1UdWUgSmFuIDE3IDEwOjU1OjMwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChJTlNOX0lTQSwgSU5TTl80NjUwKTogRGVmaW5lLgotCi1XZWQgT2N0IDE5IDEzOjM0OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYTI5ay5oOiBBZGQgb3BlcmFuZCB0eXBlICdJJyBmb3IgYGludicgYW5kIGBpcmV0aW52Jy4gIE9uCi0Jc3lzdGVtcyB3aXRoIGEgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgY2FjaGUsIHN1Y2ggYXMgdGhlCi0JMjkwNDAsIHRoZXNlIGluc3RydWN0aW9ucyB0YWtlIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgotCi1XZWQgU2VwIDE0IDE3OjQ0OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChJTlNOX1NUT1JFX01FTU9SWSk6IENvcnJlY3QgdmFsdWUgdG8gbm90IGNvbmZsaWN0IHdpdGgKLQlJTlNOX1RSQVAuCi0KLVR1ZSBTZXAgIDYgMTE6Mzk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKElOU05fU1RPUkVfTUVNT1JZKTogRGVmaW5lLgotCi1UaHUgSnVsIDI4IDE5OjI4OjA3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IERvY3VtZW50IG5ldyBvcGVyYW5kIHR5cGUgJ3gnLgotCi1UdWUgSnVsIDI2IDE3OjQ4OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGk5NjAuaCAoSV9DWDIpOiBOZXcgaW5zdHJ1Y3Rpb24gY2F0ZWdvcnkuICBJdCBpbmNsdWRlcwotCWluc3RydWN0aW9ucyBhdmFpbGFibGUgb24gQ3ggYW5kIEp4IHByb2Nlc3NvcnMuCi0JKElfSlgpOiBOZXcgaW5zdHJ1Y3Rpb24gY2F0ZWdvcnksIGZvciBKWC1vbmx5IGluc3RydWN0aW9ucy4KLQkoaTk2MF9vcGNvZGVzKTogUHV0IGVzaHJvIGFuZCBzeXNjdGwgaW4gSV9DWDIgY2F0ZWdvcnkuICBBZGRlZAotCUp4LW9ubHkgaW5zdHJ1Y3Rpb25zLCBpbiBJX0pYIGNhdGVnb3J5LgotCi1XZWQgSnVsIDEzIDE4OjQzOjQ3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5zMzJrLmggKGVuZG9wKTogTWFkZSBwb2ludGVyIGNvbnN0IHRvby4KLQotU3VuIEp1bCAxMCAxMTowMTowOSAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogbnMzMmsuaDogRHJvcCBRIG9wZXJhbmQgdHlwZSBhcyB0aGVyZSBpcyBubyBjb3JyZWN0IHVzZQotCWZvciBpdC4gQWRkIEkgYW5kIFogb3BlcmFuZCB0eXBlcyB3aGljaCBhbGxvdyBiZXR0ZXIgY2hlY2tpbmcuCi0KLVRodSBKdWwgIDcgMTI6MzQ6NDggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoeG9yLmwpIDpmaXggYml0IHBhdHRlcm4uCi0JKExfMik6IE5ldyBzaXplIG9mIG9wZXJhbmQuCi0JKHRyYXBhKTogVXNlIGl0LgotCi1GcmkgSnVuIDEwIDE2OjM4OjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBNb3ZlICJ0cmFwIiBiZWZvcmUgInRwY2MiIHRvIGNoYW5nZSBkaXNhc3NlbWJseS4KLQotRnJpIEp1biAgMyAxNTo1NzozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBJbmNsdWRlIHY5IGRlZmluaXRpb25zLgotCi1UaHUgSnVuICAyIDEyOjIzOjE3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAobTY4MDYwKTogRGVmaW5lZC4KLQkobTY4MDQwdXAsIG1mbG9hdCwgbW1tdSk6IEluY2x1ZGUgaXQuCi0JKHN0cnVjdCBtNjhrX29wY29kZSk6IFdpZGVuIGBhcmNoJyBmaWVsZC4KLQkobTY4a19vcGNvZGVzKTogVXBkYXRlZCBmb3IgTTY4MDYwLiAgUmVtb3ZlZCBjb21tZW50cyB0aGF0IHdlcmUKLQlpbnN0cnVjdGlvbnMgY29tbWVudGVkIG91dCBieSAiSkYiIHllYXJzIGFnby4KLQotVGh1IEFwciAyOCAxODozMToxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKHN0cnVjdCBtNjhrX29wY29kZSk6IFNob3J0ZW4gYGFyY2gnIGZpZWxkIHRvIDggYml0cywgYW5kCi0JYWRkIGEgb25lLWJpdCBgZmxhZ3MnIGZpZWxkLgotCShGX0FMSUFTKTogTmV3IG1hY3JvLgotCi1XZWQgQXByIDI3IDExOjI5OjUyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKGRlYywgaW5jKTogR2V0IGVuY29kaW5nIHJpZ2h0LgotCi1Nb24gQXByICA0IDEzOjEyOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmggKHN0cnVjdCBwb3dlcnBjX29wZXJhbmQpOiBSZW1vdmVkIHNpZ25lZHAgZmllbGQ7IGp1c3QgdXNlCi0JYSBmbGFnIGluc3RlYWQuCi0JKFBQQ19PUEVSQU5EX1NJR05FRCk6IERlZmluZS4KLQkoUFBDX09QRVJBTkRfU0lHTk9QVCk6IERlZmluZS4KLQotVGh1IE1hciAzMSAxOTozNDowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKElTX0pVTVBfT05fRUNYX1pFUk8sICJqY3h6IiBwYXR0ZXJuKTogT3BlcmFuZCBzaXplCi0JcHJlZml4IGlzIDB4NjYsIG5vdCAweDY3LiAgUGF0Y2ggZnJvbSBILkouIEx1IChobHVAbnluZXhzdC5jb20pLgotCi1UaHUgTWFyICAzIDE1OjUxOjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogUmV2ZXJzZSBsYXN0IGNoYW5nZS4gIEl0J2xsIGJlIGhhbmRsZWQgaW4gZ2FzIGluc3RlYWQuCi0KLVRodSBGZWIgMjQgMTU6Mjk6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChzYXIpOiBEaXNhYmxlZCB0aGUgdHdvLW9wZXJhbmQgSW1tMSBmb3JtLCBzaW5jZSBpdCB3YXMKLQlzbG93ZXIgb24gdGhlIDQ4NiBhbmQgdXNlZCB0aGUgaW1wbGljaXQgc2hpZnQgY291bnQgZGVzcGl0ZSB0aGUKLQlleHBsaWNpdCBvcGVyYW5kLiAgVGhlIG9uZS1vcGVyYW5kIGZvcm0gaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGdldAotCXRoZSBzaG9ydGVyIGZvcm0gd2l0aCB0aGUgaW1wbGljaXQgc2hpZnQgY291bnQuCi0KLVRodSBGZWIgMTcgMTI6Mjc6NTIgMTk5NCAgVG9yYmpvcm4gR3Jhbmx1bmQgICh0ZWdlQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBGaXggdHlwbyBpbiBmc3R3cyBhcmcgc3RyaW5nLgotCi1XZWQgRmViICA5IDIxOjIzOjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmggKHN0cnVjdCBwb3dlcnBjX29wY29kZSk6IE1ha2Ugb3BlcmFuZHMgZmllbGQgdW5zaWduZWQuCi0KLU1vbiBGZWIgIDcgMTk6MTQ6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaCAoUFBDX09QQ09ERV82MDEpOiBEZWZpbmUuCi0KLUZyaSBGZWIgIDQgMjM6NDM6NTAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaCAoYWRkYik6IFVzZSAnQCcgZm9yIGFkZGIgYW5kIGFkZGliIHBzZXVkbyBvcHMuCi0JKHNvIHdlIGNhbiBkZXRlcm1pbmUgdmFsaWQgY29tcGxldGVycyBmb3IgYm90aCBhZGRiIGFuZCBhZGRiW3RmXS4pCi0KLQkqIGhwcGEuaCAoeG1weXUpOiBObyBmbG9hdGluZyBwb2ludCBmb3JtYXQgc3BlY2lmaWVyIGZvciB0aGUKLQl4bXB5dSBpbnN0cnVjdGlvbi4KLQotRnJpIEZlYiAgNCAyMzozNjo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oIChQUENfT1BFUkFORF9ORVhUKTogRGVmaW5lLgotCShQUENfT1BFUkFORF9ORUdBVElWRSk6IENoYW5nZSB2YWx1ZSB0byBtYWtlIHJvb20gZm9yIGFib3ZlLgotCShzdHJ1Y3QgcG93ZXJwY19tYWNybyk6IERlZmluZS4KLQkocG93ZXJwY19tYWNyb3MsIHBvd2VycGNfbnVtX21hY3Jvcyk6IERlY2xhcmUuCi0KLUZyaSBKYW4gMjEgMTk6MTM6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaDogTmV3IGZpbGUuICBIZWFkZXIgZmlsZSBmb3IgUG93ZXJQQyBvcGNvZGUgdGFibGUuCi0KLU1vbiBKYW4gMTcgMDA6MTQ6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaDogTW9yZSBtaW5vciB0ZW1wbGF0ZSBmaXhlcyBmb3Igc2Z1IGFuZCBjb3ByICh0byBhbGxvdwotCWZvciBlYXNpZXIgZGlzYXNzZW1ibHkpLgotCi0JKiBocHBhLmg6IEZpeCB0ZW1wbGF0ZXMgZm9yIGFsbCB0aGUgc2Z1IGFuZCBjb3ByIGluc3RydWN0aW9ucy4KLQotV2VkIERlYyAxNSAxNToxMjo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKHB1c2gpOiBQZXJtaXQgSW1tMTYgb3BlcmFuZCB0b28uCi0KLVNhdCBEZWMgMTEgMTY6MTQ6MDYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqICBoODMwMC5oIChhbmRjKTogRXhpc3RzIGluIGJhc2UgYXJjaC4KLQotV2VkIERlYyAgMSAxMjoxNTozMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogRnJvbSBIaXNhc2hpIE1JTkFNSU5PIDxtaW5hbWlub0BzcmFtaGMuc3JhLmNvLmpwPgotCSogaHBwYS5oOiAjdW5kZWYgTk9ORSB0byBhdm9pZCBjb25mbGljdCB3aXRoIGhpdXggaW5jbHVkZSBmaWxlcy4KLQotU3VuIE5vdiAyMSAyMjowNjo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oOiBBZGQgRlAgcXVhZHdvcmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgTm92IDE3IDE3OjEzOjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiAoTV9KX0EpOiBBZGRlZC4KLQkoTV9MQSk6IFJlbW92ZWQuCi0KLU1vbiBOb3YgIDggMTI6MTI6NDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE9QX01BU0tfQ0FDSEUsIE9QX1NIX0NBQ0hFKTogRGVmaW5lLiAgRnJvbSBUZWQgTGVtb24KLQk8bWVsbG9uQHBlcHBlci5uY2QuY29tPi4KLQotU3VuIE5vdiAgNyAwMDozMDoxMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oOiBJbW1lZGlhdGUgZmllbGQgaW4gcHJvYmVpIGluc3RydWN0aW9ucyBpcyB1bnNpZ25lZCwKLQlub3QgbG93LXNpZ24gZXh0ZW5kZWQuCi0KLVdlZCBOb3YgIDMgMTA6MzA6MDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaCAoUlJJMTBNQVNLKTogQ2hhbmdlIGZyb20gMHhmYzAwZmZlMCB0byAweGZjMDBmYzAwLgotCi1UdWUgTm92ICAyIDEyOjQxOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IEFkZCAiZnhjaCIgd2l0aG91dCBvcGVyYW5kLgotCi1Nb24gTm92ICAxIDE4OjEzOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNX0pBTF8xLCBNX0pBTF8yLCBNX0pBTF9BKTogQWRkZWQuCi0KLVNhdCBPY3QgIDIgMjI6MjY6MTEgMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oOiBBZGQgZ2Z3IGFuZCBnZnIgdG8gdGhlIG9wY29kZSB0YWJsZS4KLQotV2VkIFNlcCAyOSAxNjoyMzowMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaDogZXh0ZW5kZWQgdG8gaGFuZGxlIG04ODExMC4KLQotVHVlIFNlcCAyOCAxOToxOTowOCAxOTkzICBKZWZmcmV5IEEgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKGJlLCBibGUpOiBVc2Ugb3BlcmFuZCB0eXBlICd6JyB0byBkZW5vdGUgYWJzb2x1dGUgYnJhbmNoCi0JYWRkcmVzc2VzLgotCi1UdWUgU2VwIDE0IDE0OjA0OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTk2MC5oIChpOTYwX29wY29kZXMpOiBQcm9wZXJseSBicmFja2V0IGluaXRpYWxpemVycy4KLQotTW9uIFNlcCAxMyAxMjo1MDo1MiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaCAoQk9GTEFHKTogcmV3cml0ZSB0byBhdm9pZCBuZXN0ZWQgY29tbWVudC4KLQotTW9uIFNlcCAxMyAxNTo0NjowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAodHdvKTogUHJvdGVjdCBzZWNvbmQgYXJndW1lbnQgd2l0aCBwYXJlbnRoZXNlcy4KLQotRnJpIFNlcCAxMCAxNjoyOTo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZGVkIG5ldyBpbnN0cnVjdGlvbiAicnNtIiAoZm9yIGkzODZzbCkuCi0JRGVsZXRlZCBvbGQgaW4vb3V0IGluc3RydWN0aW9ucyBpbiAiI2lmIDAiIHNlY3Rpb24uCi0KLVRodSBTZXAgIDkgMTc6NDI6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBQcm9wZXJseSBicmFja2V0IGluaXRpYWxpemVycy4KLQotV2VkIEF1ZyAyNSAxMzo1MDo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2RlKTogVXNlICd8JyBmb3IgbW92YiBhbmQgbW92aWIgaW5zbnMuICAoRnJvbQotCUplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHUpLgotCi1Nb24gQXVnIDIzIDE2OjU1OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChsY2FsbCk6IEFjY2VwdCBJbW0zMiBvcGVyYW5kIGFsc28uCi0KLU1vbiBBdWcgMjMgMTI6NDM6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1fQUJTVSk6IFJlbW92ZWQgKGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIG51bWJlcj8/KS4KLQkoTV9EQUJTKTogQWRkZWQuCi0KLVRodSBBdWcgMTkgMTU6MDg6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKElOU05fKik6IENoYW5nZWQgdmFsdWVzLiAgUmVtb3ZlZCB1bnVzZWQgZGVmaW5pdGlvbnMuCi0JQWRkZWQgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFksIElOU05fSVNBMiBhbmQgSU5TTl9JU0EzLiAgU3BsaXQKLQlJTlNOX0xPQURfREVMQVkgaW50byBJTlNOX0xPQURfTUVNT1JZX0RFTEFZIGFuZAotCUlOU05fTE9BRF9DT1BST0NfREVMQVkuICBTcGxpdCBJTlNOX0NPUFJPQ19ERUxBWSBpbnRvCi0JSU5TTl9DT1BST0NfTU9WRV9ERUxBWSBhbmQgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZLgotCShNXyopOiBBZGRlZCBuZXcgdmFsdWVzIGZvciByNjAwMCBhbmQgcjQwMDAgbWFjcm9zLgotCShBTllfREVMQVkpOiBSZW1vdmVkLgotCi1XZWQgQXVnIDE4IDE1OjM3OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBBZGRlZCBNX0xJX1MgYW5kIE1fTElfU1MuCi0KLVR1ZSBBdWcgMTcgMDc6MDg6MDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogR2V0IHNvbWUgcmFyZSBtb3YuYnMgY29ycmVjdC4KLQotVGh1IEF1ZyAgNSAwOToxNToxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogRG9uJ3QgZGVmaW5lIGNvbnN0IG91cnNlbGY7IHJlbHkgb24gYW5zaWRlY2wuaCBoYXZpbmcKLQliZWVuIGluY2x1ZGVkLgotCi1GcmkgSnVsIDMwIDE4OjQxOjExIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChGX0pTUiwgRl9VTkJSLCBGX0NPTkRCUik6ICBBZGQgbmV3IGZsYWdzIHRvIG1hcmsKLQlqdW1wIGluc3RydWN0aW9ucywgZm9yIHVzZSBpbiBkaXNhc3NlbWJsZXJzLgotCi1UaHUgSnVsIDIyIDA3OjI1OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oOiBNYWtlIGJpdGZpZWxkcyBqdXN0IHVuc2lnbmVkLCBub3QgdW5zaWduZWQgbG9uZyBvcgotCXVuc2lnbmVkIHNob3J0LgotCi1XZWQgSnVsIDIxIDExOjU1OjMxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocHBhLmg6IE5ldyBhcmd1bWVudCB0eXBlICd5Jy4gIFVzZSBpbiB2YXJpb3VzIGZsb2F0IGluc3RydWN0aW9ucy4KLQotTW9uIEp1bCAxOSAxNzoxNzowMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChicmVhayk6IEZpcnN0IGltbWVkaWF0ZSBmaWVsZCBpcyB1bnNpZ25lZC4KLQotCSogaHBwYS5oOiBBZGQgcmZpciBpbnN0cnVjdGlvbi4KLQotU3VuIEp1bCAxOCAxNjoyODowOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogU3BsaXQgdGhlIGFjdHVhbCB0YWJsZSBvdXQgaW50byAuLi8uLi9vcGNvZGVzL21pcHMtb3BjLmMuCi0KLUZyaSBKdWwgMTYgMDk6NTk6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IFJld29ya2VkIHRoZSBoYXphcmQgaW5mb3JtYXRpb24gc29tZXdoYXQsIGFuZCBmaXhlZCBzb21lCi0JYnVncyBpbiB0aGUgaW5zdHJ1Y3Rpb24gaGF6YXJkIGRlc2NyaXB0aW9ucy4KLQotVGh1IEp1bCAxNSAxMjo0MjowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaDogQ29ycmVjdGVkIGEgY291cGxlIG9mIG9wY29kZXMuCi0KLVR1ZSBKdWwgIDYgMTU6MTc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IFJlcGxhY2VkIHdpdGggdmVyc2lvbiBmcm9tIFJhbHBoIENhbXBiZWxsIGFuZCBPU0YuICBUaGUKLQluZXcgdmVyc2lvbiBpbmNsdWRlcyBpbnN0cnVjdGlvbiBoYXphcmQgaW5mb3JtYXRpb24sIGJ1dCBpcwotCW90aGVyd2lzZSByZWFzb25hYmx5IHNpbWlsYXIuCi0KLVRodSBKdWwgIDEgMjA6MzY6MTcgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogRml4IHR5cG8gaW4gVU5PUDMgKGFmZmVjdGVkIHNoW2FsXVtscl0ubCkuCi0KLUZyaSBKdW4gMTEgMTg6Mzg6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlQYXRjaGVzIGZyb20gSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdToKLQkqIGhwcGEuaDogQ2xlYW4gdXAgc29tZSBvZiB0aGUgT0xEX1RBQkxFLCBub24tT0xEX1RBQkxFIGJyYWluZGFtYWdlLgotCU1ha2UgdGhlIHRhYmxlcyBiZSB0aGUgc2FtZSBmb3IgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6Ci0JImJiIiwgImFkZGJbdGZdIiwgImFkZGliW3RmXSIsICJhZGQiLCAiYWRkW2xvY10iLCAiYWRkY28iLAotCSJzaFsxMjNdYWRkIiwgInNoWzEyM11hZGRbbG9dIiwgInN1YiIsICJzdWJbb2J0XSIsICJzdWJbYnRdbyIsCi0JImRzIiwgImNvbWNsciIsICJhZGRpIiwgImFkZGlbb3RdIiwgImFkZGl0byIsICJzdWJpIiwgInN1YmlvIiwKLQkiY29taWNsciIsICJmYWRkIiwgImZzdWIiLCAiZm1weSIsICJmZGl2IiwgImZzcXJ0IiwgImZhYnMiLAotCSJmcm5kIiwgImZjcHkiLCAiZmNudmZmIiwgImZjbnZ4ZiIsICJmY252ZngiLCAiZmNudmZ4dCIsCi0JImZjbXAiLCBhbmQgImZ0ZXN0Ii4KLQotCSogaHBwYS5oOiBNYWtlIG5ldyBhbmQgb2xkIHRhYmxlcyB0aGUgc2FtZSBmb3IgImJyZWFrIiwgIm10Y3RsIiwKLQkibWZjdGwiLCAiYmIiLCAic3NtIiwgInJzbSIsICJ4bXB5dSIsICJmbXB5YWRkIiwgImZtcHlzdWIiLgotCUZpeCB0eXBvIGluIGxhc3QgcGF0Y2guICBDb2xsYXBzZSBzZXZlcmFsICNpZmRlZnMgaW50byBhCi0Jc2luZ2xlICNpZmRlZi4KLQotCSogaHBwYS5oOiBEZWxldGUgcmVtYWluaW5nIE9MRF9UQUJMRSBjb2RlLiAgQnJpbmcgc29tZQotCW9mIHRoZSBjb21tZW50cyB1cC10by1kYXRlLgotCi0JKiBocHBhLmg6IFVwZGF0ZSAiZnJlZSBsaXN0IiBvZiBsZXR0ZXJzIGFuZCB1cGRhdGUKLQljb21tZW50cyBkZXNjcmliaW5nIGVhY2ggbGV0dGVyJ3MgZnVuY3Rpb24uCi0KLUZyaSBKdW4gIDQgMTU6NDE6MzcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogY2hlY2twb2ludCwgaW5jbHVkZXMgSDgvMzAwLUggb3Bjb2Rlcy4KLQotVGh1IEp1biAgMyAxNTo0Mjo1OSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBQYXRjaGVzIGZyb20gSmVmZnJleSBMYXcgPGxhd0Bjcy51dGFoLmVkdT4uCi0JKiBocHBhLmg6IFJld29yayBzaW5nbGUgcHJlY2lzaW9uIEZQCi0JaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhleSBjb3JyZWN0bHkgZGlzYXNzZW1ibGUgY29kZQotCVBBMS4xIGNvZGUuCi0KLVRodSBNYXkgMjcgMTk6MjE6MjIgMTk5MyAgQnJ1Y2UgQmF1bWFuICAoYm9vdEBvc2Yub3JnKQotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIsIG1vdiBwYXR0ZXJuKTogUmVtb3ZlIE1lbTE2IHJlc3RyaWN0aW9uIGZyb20KLQltb3YgdG8gYWxsb3cgaW5zdHJ1Y3Rpb25zIGxpa2UgbW92IHNzLHh5eihlY3gpIHRvIGFzc2VtYmxlLgotCi1UdWUgTWF5IDI1IDAwOjM5OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IFVzZSBuZXcgdmVyc2lvbiBmcm9tIFV0YWggaWYgT0xEX1RBQkxFIGlzbid0IGRlZmluZWQ7Ci0JZ2RiIHdpbGwgZGVmaW5lIGl0IGZvciBub3cuCi0KLU1vbiBNYXkgMjQgMTU6MjA6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBEb24ndCBlbmQgZW51bWVyYXRvciBsaXN0IHdpdGggY29tbWEuCi0KLUZyaSBNYXkgMTQgMTU6MTU6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBCYXNlZCBvbiBwYXRjaGVzIGZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKToKLQkqIG1pcHMuaCAoT1BfTUFTS19DT1BaLCBPUF9TSF9DT1BaKTogRGVmaW5lLgotCSgiYmMydCIpOiBDb3JyZWN0IHR5cG8uCi0JKCJbbHNdd2NbMDIzXSIpOiBVc2UgVCByYXRoZXIgdGhhbiB0LgotCSgiY1swMTIzXSIpOiBEZWZpbmUgZ2VuZXJhbCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuCi0KLU1vbiBNYXkgMTAgMDY6MDI6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogTW92ZSBzcGxpdCBwb2ludCBmb3IgZ2NjIGNvbXBpbGF0aW9uIG1vcmUgdG93YXJkcwotCW1pZGRsZS4KLQotRnJpIEFwciAgOSAxMzoyNjoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogcnM2ay5oOiBDbGVhbiB1cCBpbnN0cnVjdGlvbnMgZm9yIHByaW1hcnkgb3Bjb2RlIDE5IChtYW55IHdlcmUKLQlzaW1wbHkgd3JvbmcsIGljcywgcmZpLCAmIHJmc3ZjIHdlcmUgbWlzc2luZykuCi0JQWRkICJhIiB0byBvcHJfZXh0IGZvciAiYmIiLiAgRG9jIGZpeC4KLQotVGh1IE1hciAxOCAxMzo0NTozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogIDQ4NiBleHRlbnNpb25zIGZyb20gSm9obiBIYXNzZXkgKGhhc3NleUBkZy1ydHAuZGcuY29tKS4KLQkqIG1pcHMuaDogIEFkZCBjYXN0cywgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgc2hpZnRpbmcgdG9vIG11Y2guCi0JKiBtNjhrLmg6ICBEb2N1bWVudCB0aGUgcGxhY2VtZW50IGNvZGUgJzknLgotCi1UaHUgRmViIDE4IDAyOjAzOjE0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBtNjhrLmggKEJSRUFLX1VQX0JJR19ERUNMLCBBTkRfT1RIRVJfUEFSVCk6ICBBZGQga2x1ZGdlIHdoaWNoCi0JYWxsb3dzIGNhbGxlcnMgdG8gYnJlYWsgdXAgdGhlIGxhcmdlIGluaXRpYWxpemVkIHN0cnVjdCBmdWxsIG9mCi0Jb3Bjb2RlcyBpbnRvIHR3byBoYWxmLXNpemVkIG9uZXMuICBUaGlzIHBlcm1pdHMgR0NDIHRvIGNvbXBpbGUKLQl0aGlzIG1vZHVsZSwgc2luY2UgaXQgdGFrZXMgZXhwb25lbnRpYWwgc3BhY2UgZm9yIGluaXRpYWxpemVycy4KLQkobnVtb3Bjb2RlcywgZW5kb3ApOiAgUmV2aXNlIHRvIHVzZSBBTkRfT1RIRVJfUEFSVCBpbiBzaXplIGNhbGNzLgotCi1UaHUgRmViICA0IDAyOjA2OjU2IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhMjlrLmg6ICBSZW1vdmUgUkNTIGNydWQsIHVwZGF0ZSBHUEwgdG8gdjIsIHVwZGF0ZSBjb3B5cmlnaHRzLgotCSogY29udmV4Lmg6ICBBZGRlZCwgZnJvbSBHREIncyBjb252eC1vcGNvZGUuaC4gIEFkZGVkIENPTlNUIHRvIGFsbAotCWluaXRpYWxpemVkIHN0cnVjdHMgaW4gaXQuCi0KLVRodSBKYW4gMjggMjE6MzI6MjIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlEZWx0YSA4OCBjaGFuZ2VzIGluc3BpcmVkIGJ5IENhcmwgR3JlY28sIDxjZ3JlY29AQ3JlaWdodG9uLkVkdT46Ci0JKiBtODhrLmggKFBNRU0pOiAgQXZvaWQgcHJldmlvdXMgZGVmaW5pdGlvbiBmcm9tIDxzeXMvcGFyYW0uaD4uCi0JKEFORCk6ICBDaGFuZ2UgdG8gQU5EXyB0byBhdm9pZCBhbnNpZGVjbC5oIGBBTkQnIGNvbmZsaWN0LgotCi1TYXQgSmFuIDIzIDE4OjEwOjQ5IFBTVCAxOTkzICBSYWxwaCBDYW1wYmVsbCAgKHJhbHBoY0BweXJhbWlkLmNvbSkKLQotCSogbWlwcy5oOiBkb2N1bWVudCAiaSIgYW5kICJqIiBvcGVyYW5kcyBjb3JyZWN0bHkuCi0KLVRodSBKYW4gIDcgMTU6NTg6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IFJlbW92ZWQgZW5kaWFubmVzcyBkZXBlbmRlbmN5LgotCi1TdW4gSmFuICAzIDE0OjEzOjM1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBpbmNsdWRlIGluZm8gb24gbnVtYmVyIG9mIGN5Y2xlcyBwZXIgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBEZWMgMjEgMjE6Mjk6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiAgTW92ZSBoYW5keSBhbGlhc2VzIHRvIHRoZSBmcm9udC4gIEZpeCBtYXNrcyBmb3IgZXh0cmFjdAotCWFuZCBkZXBvc2l0IGluc3RydWN0aW9ucy4KLQotU2F0IERlYyAxMiAxNjowOTo0OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogYWNjZXB0IHNobGQgYW5kIHNocmQgYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZSBzaGlmdAotCWNvdW50IGFyZ3VtZW50LCB3aGljaCBpcyBhbHdheXMgJWNsLgotCi1GcmkgTm92IDI3IDE3OjEzOjE4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybiBhdCBjeWdudXMuY29tKQotCi0JKiBpMzg2LmggKGkzODZfb3B0YWJfZW5kLCBpMzg2X3JlZ3RhYl9lbmQpOiBOb3cgY29uc3QuCi0JKG9uZV9ieXRlX3NlZ21lbnRfZGVmYXVsdHMsIHR3b19ieXRlX3NlZ21lbnRfZGVmYXVsdHMsCi0JaTM4Nl9wcmVmaXh0YWJfZW5kKTogRGl0dG8uCi0KLU1vbiBOb3YgMjMgMTA6NDc6MjUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHZheC5oIChiYiopOiBVc2UgInYiIChiaXRmaWVsZCB0eXBlKSwgbm90ICJhIiAoYWRkcmVzcyBvcGVyYW5kKQotCWZvciBvcGVyYW5kIDI7IGZyb20gSm9obiBDYXJyLCBqZmNAZHNnLmRlYy5jb20uCi0KLVdlZCBOb3YgIDQgMDc6MzY6NDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogRGVmaW5lIEZJWEVEX1NJWkVfQlJBTkNILCBzbyBic3IgYW5kIGJyYSBpbnN0cnVjdGlvbnMKLQlhbHdheXMgdXNlIDE2LWJpdCBvZmZzZXRzLiAgTWFrZXMgY2FsY3VsYXRlZC1zaXplIGp1bXAgdGFibGVzCi0JZmVhc2libGUuCi0KLUZyaSBPY3QgMTYgMjI6NTI6NDMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogRml4IG9uZS1vcGVyYW5kIGZvcm1zIG9mIGluKiBhbmQgb3V0KiBwYXR0ZXJucy4KLQotVHVlIFNlcCAyMiAxNDowODoxNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogQWRkZWQgQ1BVMzIgc3VwcG9ydC4KLQotVHVlIFNlcCAyMiAwMDozODo0MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChicmVhayk6ICBEaXNhc3NlbWJsZSB0aGUgYXJndW1lbnQuICBQYXRjaCBmcm9tCi0Jam9uYXRoYW5AY3Muc3RhbmZvcmQuZWR1IChKb25hdGhhbiBTdG9uZSkuCi0KLVdlZCBTZXAgIDkgMTE6MjU6MjggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IG1lcmdlZCBNb3Rvcm9sYSBhbmQgTUlUIHN5bnRheC4KLQotVGh1IFNlcCAgMyAwOTozMzoyMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChwbW92ZSk6IG1ha2UgdGhlIHRlc3RzIGxlc3Mgc3RyaWN0LCB0aGUgNjhrIGJvb2sgaXMKLQl3cm9uZy4KLQotVHVlIEF1ZyAyNSAyMzoyNToxOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAobTY4ZWMwMzApOiBEZWZpbmVkIGFzIGFsaWFzIGZvciA2ODAzMC4KLQkobTY4a19vcGNvZGVzKTogTmV3IHR5cGUgY2hhcmFjdGVycyAiMyIgZm9yIDY4MDMwIE1NVSByZWdzIGFuZCAidCIKLQlmb3IgaW1tZWRpYXRlIDAtNyBhZGRlZC4gIFNldCB1cCBzb21lIG9wY29kZXMgKHB0ZXN0LCBia3B0KSB0byB1c2UKLQl0aGVtLiAgVGlnaHRlbmVkIGRlc2NyaXB0aW9uIG9mICJmbW92ZXgiIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20KLQlzb21lICJwbW92ZSIgZW5jb2RpbmdzLiAgQWRkZWQgInBtb3ZlIiBmb3IgNjgwMzAgTU1VIHJlZ3MsIGNsZWFuZWQKLQl1cCBkZXNjcmlwdGlvbnMgdGhhdCBjbGFpbWVkIHZlcnNpb25zIHdlcmUgYXZhaWxhYmxlIGZvciBjaGlwcyBub3QKLQlzdXBwb3J0aW5nIHRoZW0uICBBZGRlZCAicG1vdmVmZCIuCi0KLU1vbiBBdWcgMjQgMTI6MDQ6NTEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogZml4IHdoZXJlIHRoZSAuIGdvZXMgaW4gZGl2dWxsCi0KLVdlZCBBdWcgMTkgMTE6MjI6MjQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IHRoZSBjYXMyIGluc3RydWN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIHdyaXR0ZW4gd2l0aAotCWluZGlyZWN0aW9uIG9uIHRoZSBsYXN0IHR3byBvcGVyYW5kcywgd2hpY2ggY2FuIGJlIGVpdGhlciBkYXRhIG9yCi0JYWRkcmVzcyByZWdpc3RlcnMuICBBZGRlZCBhIG5ldyBvcGVyYW5kIHR5cGUgJ3InIHdoaWNoIGFjY2VwdHMKLQllaXRoZXIgcmVnaXN0ZXIgdHlwZS4gIEFkZGVkIG5ldyBjYXNlcyBmb3IgY2FzMmwgYW5kIGNhczJ3IHdoaWNoCi0JdXNlIHRoZW0uICBDb3JyZWN0ZWQgbWFza3MgZm9yIGNhczIgd2hpY2ggZmFpbGVkIHRvIHJlY29nbml6ZSB1c2UKLQlvZiBhZGRyZXNzIHJlZ2lzdGVyLgotCi1GcmkgQXVnIDE0IDE0OjIwOjM4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBtNjhrLmg6ICBNZXJnZWQgaW4gcGF0Y2hlcyAobW9zdGx5IG02ODA0MC1zcGVjaWZpYykgZnJvbQotCUNvbGluIFNtaXRoIDxjb2xpbkB3cnMuY29tPi4KLQotCSogbTY4ay5oOiAgTWVyZ2VkIG02OGttcmkuaCBhbmQgbTY4ay5oICh1c2luZyB0aGUgZm9ybWVyIGFzIGEKLQliYXNlKS4gIEFsc28gY2xlYW5lZCB1cCBkdXBsaWNhdGVzLCByZS1vcmRlcmVkIGluc3RydWN0aW9ucyBmb3IKLQl0aGUgc2FrZSBvZiBkaXMtYXNzZW1ibGluZyAoc28gYWxpYXNlcyBjb21lIGFmdGVyIHN0YW5kYXJkIG5hbWVzKS4KLQkqIG02OGttcmkuaDogTm93IGp1c3QgZGVmaW5lcyBzb21lIG1hY3JvcywgYW5kICNpbmNsdWRlcyBtNjhrLmguCi0KLVdlZCBBdWcgMTIgMTY6Mzg6MTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG02OGttcmkuaDogYWRkZWQgdmFyaW91cyBvcGNvZGVzLiBNb3ZlZCBqYnh4IHRvIGJ4eGVzLiBGaWxsZWQgaW4KLQlhbGwgbWlzc2luZyAucwotCi1Nb24gQXVnIDEwIDIzOjIyOjMzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBNb3ZlZCB0YWJsZXMgdG8gQkZEIGxpYnJhcnkuCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZCBmaWxkcSwgZmlzdHBxIGFsaWFzZXMgdXNlZCBieSBnY2MuCi0KLVN1biBKdW4gMjggMTM6Mjk6MDMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6ICBGaW5pc2ggZmlsbGluZyBpbiBhbGwgdGhlIGhvbGVzIGluIHRoZSBvcGNvZGUgdGFibGUsCi0Jc28gdGhhdCB0aGUgTHVjaWQgQyBjb21waWxlciBjYW4gZGlnZXN0IHRoaXMgYXMgd2VsbC4uLgotCi1GcmkgSnVuIDI2IDIxOjI3OjE3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6ICBBZGQgc2V0Yywgc2V0bmMsIGFkZHIxNiwgZGF0YTE2LCByZXB6LCByZXBueiBhbGlhc2VzLgotCUZpeCBvcGNvZGVzIG9uIHZhcmlvdXMgc2l6ZXMgb2YgZmlsZC9maXN0IGluc3RydWN0aW9ucwotCSgxNmJpdD1ubyBzdWZmaXgsIDMyYml0PSJsIiBzdWZmaXgsIDY0Yml0PSJsbCIgc3VmZml4KS4KLQlVc2UgdGFicyB0byBpbmRlbnQgZm9yIGNvbW1lbnRzLiAgRml4ZXMgc3VnZ2VzdGVkIGJ5IE1pbmggVHJhbi1MZS4KLQotVGh1IEp1biAyNSAxNjoxMzoyNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiAgRmlsbCBpbiBhbGwgdGhlIGhvbGVzIGluIHRoZSBvcGNvZGUgdGFibGUgc28gdGhhdCB0aGUKLQlsb3NpbmcgSFBVWCBDIGNvbXBpbGVyIGNhbiBkaWdlc3QgdGhpcy4uLgotCi1UaHUgSnVuIDExIDEyOjE1OjI1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6ICBGaXggZGVjb2Rpbmcgb2YgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLCBzb21ld2hhdC4KLQkoRml4IGJ5IEVyaWMgQW5kZXJzb24sIDNqZWFuQG1hYXMtbmVvdGVrLmFyYy5uYXNhLmdvdi4pCi0KLVRodSBNYXkgMjggMTE6MTc6NDQgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBBZGQgbmV3IGFyY2hpdGVjdHVyZSB2YXJpYW50IHNwYXJjbGl0ZTsgYWRkIGl0cyBzY2FuCi0JYW5kIGRpdnNjYyBvcGNvZGVzLiAgRGVmaW5lIEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUCBtYWNyby4KLQotVHVlIE1heSAgNSAxNDoyMzoyNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogIEFkZCBzb21lIG1vcmUgb3Bjb2RlIHN5bm9ueW1zIChmcm9tIEZyYW5rIFllbGxpbiwKLQlmeUBsdWNpZC5jb20pLgotCi1UaHUgQXByIDE2IDE4OjI1OjI2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiByczZrLmg6ICBOZXcgdmVyc2lvbiBmcm9tIElCTSAoTWV0aW4pLgotCi1UaHUgQXByICA5IDAwOjMxOjE5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogcnM2ay5oOiBGaXggaW5jb3JyZWN0IGV4dGVuZGVkIG9wY29kZSBmb3IgaW5zdHJ1Y3Rpb25zIGBmbScKLSAgICAgICAgYW5kIGBmZCcuICAoRnJvbSBtZXRpbkBpYm1wYS5hd2RwYS5pYm0uY29tIChNZXRpbiBHLiBPemlzaWspLikKLQotVHVlIEFwciAgNyAxMzozODo0NyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByczZrLmg6ICBNb3ZlIGZyb20gLi4vLi4vZ2RiL3JzNmstb3Bjb2RlLmguCi0KLUZyaSBBcHIgIDMgMTE6MzA6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAob25lLCB0d28pOiAgQ2FzdCBtYWNybyBhcmdzIHRvIHVuc2lnbmVkIHRvIHN1cHByZXNzCi0JY29tcGxhaW50cyBmcm9tIGNvbXBpbGVyIGFuZCBsaW50IGFib3V0IGludGVnZXIgb3ZlcmZsb3cgZHVyaW5nCi0Jc2hpZnQuCi0KLVN1biBNYXIgMjkgMTI6MjI6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKE9QKTogIEF2b2lkIHNpZ25lZCBvdmVyZmxvdyB3aGVuIHNoaWZ0aW5nIHRvIGhpZ2ggb3JkZXIgYml0LgotCi1GcmkgTWFyICA2IDAwOjIyOjM4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6ICBNYWtlIGJpdGZpZWxkIGxheW91dCBkZXBlbmQgb24gdGhlIEhPU1QgY29tcGlsZXIsCi0Jbm90IG9uIHRoZSBUQVJHRVQgc3lzdGVtLgotCi1GcmkgRmViIDIxIDAxOjI5OjUxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGFkZGVkIGluYiwgaW53LCBvdXRiLCBvdXR3IG9wY29kZXMsIGFkZGVkIGF0dCBzeW50YXggZm9yCi0JICBzY21wLCBzbG9kLCBzbW92LCBzc2NhLCBzc3RvLiAgQ3VydGVzeSBNaW5oIFRyYW4tTGUKLQkgIDxUUkFOTEVASU5URUxMSUNPUlAuQ09NPi4KLQotVGh1IEphbiAzMCAwNzozMTo0NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogdHVybmVkIG9wX3R5cGUgZW51bSBpbnRvICNkZWZpbmUgbGlzdAotCi1UaHUgSmFuIDMwIDAxOjA3OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiAgUmVtb3ZlICJjeXByZXNzIiBhcmNoaXRlY3R1cmUuICBSZW1vdmUgImZpdG94IiBhbmQKLQlzaW1pbGFyIGluc3RydWN0aW9ucyAtLSB0aGV5J3ZlIGJlZW4gcmVuYW1lZCB0byAiZml0b3EiLCBldGMuCi0JUkVBTExZIGZpeCB0c3ViY2N0di4gIEZpeCAiZmNtcGVxIiBhbmQgImZjbXBxIiB3aGljaCBoYWQgd3JvbmcKLQludW1iZXIgb2YgYXJndW1lbnRzLgotCSogaDgzMDAuaDogIFJlbW92ZSBleHRyYSA7IHdoaWNoIHByb2R1Y2VzIGNvbXBpbGVyIHdhcm5pbmcuCi0KLVR1ZSBKYW4gMjggMjI6NTk6MjIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogIGZpeCBvcGNvZGUgZm9yIHRzdWJjY3R2LgotCi1UdWUgSmFuICA3IDE3OjE5OjM5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBmYmEgYW5kIGNiYSBhcmUgbm93IGFsaWFzZXMgZm9yIGZiIGFuZCBjYiByZXNwZWN0aXZlbHkuCi0KLUZyaSBEZWMgMjcgMTA6NTU6NTAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKG5vcCk6ICBNYWRlIHRoZSAnbG9zZScgZmllbGQgYmUgZXZlbiB0aWdodGVyLAotCXNvIG9ubHkgYSBzdGFuZGFyZCAnbm9wJyBpcyBkaXNhc3NlbWJsZWQgYXMgYSBub3AuCi0KLVN1biBEZWMgMjIgMTI6MTg6MTggMTk5MSAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChub3ApOiBBZGQgUkRfR08gdG8gYGxvc2UnIHNvIHRoYXQgb25seSAlZzAgaW4gZGVzdCBpcwotCWRpc2Fzc2VtYmxlZCBhcyBhIG5vcC4KLQotVHVlIERlYyAxMCAwMDoyMjoyMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IGZpeCBhIHR5cG8uCi0KLVNhdCBOb3YgMzAgMjA6NDA6NTEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGEyOWsuaCwgYXJtLmgsIGg4MzAwLmgsICBpMzg2LmgsICBpODYwLmgsIGk5NjAuaCAsIG02OGsuaCwKLQltODhrLmgsIG1pcHMuaCAsIG5wMS5oLCBuczMyay5oLCBwbi5oLCBweXIuaCwgc3BhcmMuaCwgdGFob2UuaCwKLQl2YXguaCwgQ2hhbmdlTG9nOiByZW5hbWVkIGZyb20gLi4vPGZvbz4tb3Bjb2RlLmgKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYTI5ay5oIGIvaW5jbHVkZS9vcGNvZGUvYTI5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDJlMTI3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2EyOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgQU1EIDI5MDAwIGZhbWlseS4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGEyOWtfb3Bjb2RlIHsKLSAgLyogTmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBjaGFyICpuYW1lOwotCi0gIC8qIE9wY29kZSB3b3JkICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIEEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggZGVzY3JpYmUgdGhlIG9wZXJhbmRzLgotICAgICBWYWxpZCBjaGFyYWN0ZXJzIGFyZToKLSAgICAgLCAgICAgICAgSXRzZWxmLiAgVGhlIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBhc3NlbWJseSBjb2RlLgotICAgICBhICAgICAgICBSQS4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyA4LTE1IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgYiAgICAgICAgUkIuICBUaGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGluIGJpdHMgMC03IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgYyAgICAgICAgUkMuICBUaGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGluIGJpdHMgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBpICAgICAgICBBbiBpbW1lZGlhdGUgb3BlcmFuZCBpcyBpbiBiaXRzIDAtNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIHggICAgICAgIEJpdHMgMC03IGFuZCAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIGJpdHMgMC03IGFuZCA4LTE1Ci0gICAgICAgICAgICAgIChyZXNwZWN0aXZlbHkpIG9mIHRoZSBpbW1lZGlhdGUgb3BlcmFuZC4KLSAgICAgaCAgICAgICAgU2FtZSBhcyB4IGJ1dCB0aGUgaW5zdHJ1Y3Rpb24gY29udGFpbnMgYml0cyAxNi0zMSBvZiB0aGUKLSAgICAgICAgICAgICAgaW1tZWRpYXRlIG9wZXJhbmQuCi0gICAgIFggICAgICAgIFNhbWUgYXMgeCBidXQgYml0cyAxNi0zMSBvZiB0aGUgc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kCi0gICAgICAgICAgICAgIGFyZSBzZXQgdG8gMSAodGh1cyB0aGUgb3BlcmFuZCBpcyBhbHdheXMgbmVnYXRpdmUpLgotICAgICBQLEEgICAgICBCaXRzIDAtNyBhbmQgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSBiaXRzIDItOSBhbmQgMTAtMTcKLSAgICAgICAgICAgICAgKHJlc3BlY3RpdmVseSkgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgotCSAgICAgIFA9UEMtcmVsYXRpdmUsIHNpZ24tZXh0ZW5kZWQgdG8gMzIgYml0cy4KLQkgICAgICBBPUFic29sdXRlLCB6ZXJvLWV4dGVuZGVkIHRvIDMyIGJpdHMuCi0gICAgIGUgICAgICAgIENFIGJpdCAoYml0IDIzKSBmb3IgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLgotICAgICBuICAgICAgICBDb250cm9sIGZpZWxkIChiaXRzIDE2LTIyKSBmb3IgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLgotICAgICB2ICAgICAgICBJbW1lZGlhdGUgb3BlcmFuZCBpbiBiaXRzIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgICAgICAgICAgKHVzZWQgZm9yIHRyYXAgbnVtYmVycykuCi0gICAgIHMgICAgICAgIFNBLiAgU3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG51bWJlciBpbiBiaXRzIDgtMTUKLSAgICAgICAgICAgICAgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICB1ICAgICAgICBVSS0tYml0IDcgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICByICAgICAgICBSTkQtLWJpdHMgNC02IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgZCAgICAgICAgRkQtLWJpdHMgMi0zIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgZiAgICAgICAgRlMtLWJpdHMgMC0xIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgSQkgICAgICBJRC0tYml0cyAxNi0xNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgICAgRXh0ZW5zaW9ucyBmb3IgMjkwNTA6Ci0KLSAgICAgZAkgICAgICBGTVQtLWJpdHMgMi0zIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHJlYWxseSBuZXcpLgotICAgICBmCSAgICAgIEFDTi0tYml0cyAwLTEgb2YgdGhlIGluc3RydWN0aW9uIChub3QgcmVhbGx5IG5ldykuCi0gICAgIEYJICAgICAgRlVOQy0tU3BlY2lhbCBmdW5jdGlvbiBpbiBiaXRzIDE4LTIxIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgQwkgICAgICBBQ04tLWJpdHMgMTYtMTcgc3BlY2lmeWluZyB0aGUgYWNjdW1sYXRvciByZWdpc3Rlci4gICovCi0gIGNoYXIgKmFyZ3M7Ci19OwotCi0jaWZuZGVmIENPTlNUCi0jZGVmaW5lIENPTlNUCi0jZW5kaWYgLyogQ09OU1QgKi8KLQotc3RhdGljIENPTlNUIHN0cnVjdCBhMjlrX29wY29kZSBhMjlrX29wY29kZXNbXSA9Ci17Ci0KLXsgImFkZCIsIDB4MTQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZCIsIDB4MTUwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZGMiLCAweDFjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRjIiwgMHgxZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkY3MiLCAweDE4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRjcyIsIDB4MTkwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZGN1IiwgMHgxYTAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkY3UiLCAweDFiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRzIiwgMHgxMDAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkcyIsIDB4MTEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZHUiLCAweDEyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGR1IiwgMHgxMzAwMDAwMCwgImMsYSxpIiB9LAoteyAiYW5kIiwgMHg5MDAwMDAwMCwgImMsYSxiIiB9LAoteyAiYW5kIiwgMHg5MTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYW5kbiIsIDB4OWMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFuZG4iLCAweDlkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhc2VxIiwgMHg3MDAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNlcSIsIDB4NzEwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzZ2UiLCAweDVjMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2dlIiwgMHg1ZDAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNnZXUiLCAweDVlMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2dldSIsIDB4NWYwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzZ3QiLCAweDU4MDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2d0IiwgMHg1OTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNndHUiLCAweDVhMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2d0dSIsIDB4NWIwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbGUiLCAweDU0MDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2xlIiwgMHg1NTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsZXUiLCAweDU2MDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2xldSIsIDB4NTcwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbHQiLCAweDUwMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2x0IiwgMHg1MTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsdHUiLCAweDUyMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2x0dSIsIDB4NTMwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbmVxIiwgMHg3MjAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNuZXEiLCAweDczMDAwMDAwLCAidixhLGkiIH0sCi17ICJjYWxsIiwgMHhhODAwMDAwMCwgImEsUCIgfSwKLXsgImNhbGwiLCAweGE5MDAwMDAwLCAiYSxBIiB9LAoteyAiY2FsbGkiLCAweGM4MDAwMDAwLCAiYSxiIiB9LAoteyAiY2xhc3MiLCAweGU2MDAwMDAwLCAiYyxhLGYiIH0sCi17ICJjbHoiLCAweDA4MDAwMDAwLCAiYyxiIiB9LAoteyAiY2x6IiwgMHgwOTAwMDAwMCwgImMsaSIgfSwKLXsgImNvbnN0IiwgMHgwMzAwMDAwMCwgImEseCIgfSwKLXsgImNvbnN0aCIsIDB4MDIwMDAwMDAsICJhLGgiIH0sCi17ICJjb25zdGh6IiwgMHgwNTAwMDAwMCwgImEsaCIgfSwKLXsgImNvbnN0biIsIDB4MDEwMDAwMDAsICJhLFgiIH0sCi17ICJjb252ZXJ0IiwgMHhlNDAwMDAwMCwgImMsYSx1LHIsZCxmIiB9LAoteyAiY3BieXRlIiwgMHgyZTAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BieXRlIiwgMHgyZjAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BlcSIsIDB4NjAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZXEiLCAweDYxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGdlIiwgMHg0YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BnZSIsIDB4NGQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ2V1IiwgMHg0ZTAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BnZXUiLCAweDRmMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGd0IiwgMHg0ODAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BndCIsIDB4NDkwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ3R1IiwgMHg0YTAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BndHUiLCAweDRiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGxlIiwgMHg0NDAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BsZSIsIDB4NDUwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbGV1IiwgMHg0NjAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BsZXUiLCAweDQ3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGx0IiwgMHg0MDAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BsdCIsIDB4NDEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbHR1IiwgMHg0MjAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BsdHUiLCAweDQzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcG5lcSIsIDB4NjIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbmVxIiwgMHg2MzAwMDAwMCwgImMsYSxpIiB9LAoteyAiZGFkZCIsIDB4ZjEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRkaXYiLCAweGY3MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkZXEiLCAweGViMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkZ2UiLCAweGVmMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkZ3QiLCAweGVkMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXYiLCAweDZhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXYiLCAweDZiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkaXYwIiwgMHg2ODAwMDAwMCwgImMsYiIgfSwKLXsgImRpdjAiLCAweDY5MDAwMDAwLCAiYyxpIiB9LAoteyAiZGl2aWRlIiwgMHhlMTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2aWR1IiwgMHhlMzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2bCIsIDB4NmMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdmwiLCAweDZkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkaXZyZW0iLCAweDZlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZyZW0iLCAweDZmMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkbWFjIiwgMHhkOTAwMDAwMCwgIkYsQyxhLGIiIH0sCi17ICJkbXNtIiwgMHhkYjAwMDAwMCwgImMsYSxiIiB9LAoteyAiZG11bCIsIDB4ZjUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRzdWIiLCAweGYzMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJlbXVsYXRlIiwgMHhkNzAwMDAwMCwgInYsYSxiIiB9LAoteyAiZXhieXRlIiwgMHgwYTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZXhieXRlIiwgMHgwYjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZXhodyIsIDB4N2MwMDAwMDAsICJjLGEsYiIgfSwKLXsgImV4aHciLCAweDdkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJleGh3cyIsIDB4N2UwMDAwMDAsICJjLGEiIH0sCi17ICJleHRyYWN0IiwgMHg3YTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZXh0cmFjdCIsIDB4N2IwMDAwMDAsICJjLGEsaSIgfSwKLXsgImZhZGQiLCAweGYwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZGl2IiwgMHhmNjAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmRtdWwiLCAweGY5MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZXEiLCAweGVhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZ2UiLCAweGVlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZ3QiLCAweGVjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmbWFjIiwgMHhkODAwMDAwMCwgIkYsQyxhLGIiIH0sCi17ICJmbXNtIiwgMHhkYTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZm11bCIsIDB4ZjQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZzdWIiLCAweGYyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJoYWx0IiwgMHg4OTAwMDAwMCwgIiIgfSwKLXsgImluYnl0ZSIsIDB4MGMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImluYnl0ZSIsIDB4MGQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImluaHciLCAweDc4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJpbmh3IiwgMHg3OTAwMDAwMCwgImMsYSxpIiB9LAoteyAiaW52IiwgMHg5ZjAwMDAwMCwgIkkiIH0sCi17ICJpcmV0IiwgMHg4ODAwMDAwMCwgIiIgfSwKLXsgImlyZXRpbnYiLCAweDhjMDAwMDAwLCAiSSIgfSwKLXsgImptcCIsIDB4YTAwMDAwMDAsICJQIiB9LAoteyAiam1wIiwgMHhhMTAwMDAwMCwgIkEiIH0sCi17ICJqbXBmIiwgMHhhNDAwMDAwMCwgImEsUCIgfSwKLXsgImptcGYiLCAweGE1MDAwMDAwLCAiYSxBIiB9LAoteyAiam1wZmRlYyIsIDB4YjQwMDAwMDAsICJhLFAiIH0sCi17ICJqbXBmZGVjIiwgMHhiNTAwMDAwMCwgImEsQSIgfSwKLXsgImptcGZpIiwgMHhjNDAwMDAwMCwgImEsYiIgfSwKLXsgImptcGkiLCAweGMwMDAwMDAwLCAiYiIgfSwKLXsgImptcHQiLCAweGFjMDAwMDAwLCAiYSxQIiB9LAoteyAiam1wdCIsIDB4YWQwMDAwMDAsICJhLEEiIH0sCi17ICJqbXB0aSIsIDB4Y2MwMDAwMDAsICJhLGIiIH0sCi17ICJsb2FkIiwgMHgxNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2FkIiwgMHgxNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJsb2FkbCIsIDB4MDYwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAibG9hZGwiLCAweDA3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgImxvYWRtIiwgMHgzNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2FkbSIsIDB4MzcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibG9hZHNldCIsIDB4MjYwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAibG9hZHNldCIsIDB4MjcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibWZhY2MiLCAweGU5MDAwMTAwLCAiYyxkLGYiIH0sCi17ICJtZnNyIiwgMHhjNjAwMDAwMCwgImMscyIgfSwKLXsgIm1mdGxiIiwgMHhiNjAwMDAwMCwgImMsYSIgfSwKLXsgIm10YWNjIiwgMHhlODAxMDAwMCwgImEsZCxmIiB9LAoteyAibXRzciIsIDB4Y2UwMDAwMDAsICJzLGIiIH0sCi17ICJtdHNyaW0iLCAweDA0MDAwMDAwLCAicyx4IiB9LAoteyAibXR0bGIiLCAweGJlMDAwMDAwLCAiYSxiIiB9LAoteyAibXVsIiwgMHg2NDAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsIiwgMHg2NTAwMDAwMCwgImMsYSxpIiB9LAoteyAibXVsbCIsIDB4NjYwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bGwiLCAweDY3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJtdWx0aXBsdSIsIDB4ZTIwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHRpcGx5IiwgMHhlMDAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdG0iLCAweGRlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx0bXUiLCAweGRmMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx1IiwgMHg3NDAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdSIsIDB4NzUwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm5hbmQiLCAweDlhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJuYW5kIiwgMHg5YjAwMDAwMCwgImMsYSxpIiB9LAoteyAibm9wIiwgMHg3MDQwMDEwMSwgIiIgfSwKLXsgIm5vciIsIDB4OTgwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm5vciIsIDB4OTkwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm9yIiwgMHg5MjAwMDAwMCwgImMsYSxiIiB9LAoteyAib3IiLCAweDkzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJvcm4iLCAweGFhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJvcm4iLCAweGFiMDAwMDAwLCAiYyxhLGkiIH0sCi0KLS8qIFRoZSBkZXNjcmlwdGlvbiBvZiAic2V0aXAiIGluIENoYXB0ZXIgOCAoImluc3RydWN0aW9uIHNldCIpIG9mIHRoZSB1c2VyJ3MKLSAgIG1hbnVhbCBjbGFpbXMgdGhhdCB0aGVzZSBhcmUgYWJzb2x1dGUgcmVnaXN0ZXIgbnVtYmVycy4gIEJ1dCBzZWN0aW9uCi0gICA3LjIuMSBleHBsYWlucyB0aGF0IHRoZXkgYXJlIG5vdC4gIFRoZSBsYXR0ZXIgaXMgY29ycmVjdCwgc28gcHJpbnQKLSAgIHRoZXNlIG5vcm1hbGx5ICgibHIwIiwgImxyNSIsIGV0Yy4pLiAgKi8KLXsgInNldGlwIiwgMHg5ZTAwMDAwMCwgImMsYSxiIiB9LAotCi17ICJzbGwiLCAweDgwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzbGwiLCAweDgxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzcXJ0IiwgMHhlNTAwMDAwMCwgImMsYSxmIiB9LAoteyAic3JhIiwgMHg4NjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3JhIiwgMHg4NzAwMDAwMCwgImMsYSxpIiB9LAoteyAic3JsIiwgMHg4MjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3JsIiwgMHg4MzAwMDAwMCwgImMsYSxpIiB9LAoteyAic3RvcmUiLCAweDFlMDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgInN0b3JlIiwgMHgxZjAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJzdG9yZWwiLCAweDBlMDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgInN0b3JlbCIsIDB4MGYwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAic3RvcmVtIiwgMHgzZTAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJzdG9yZW0iLCAweDNmMDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgInN1YiIsIDB4MjQwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YiIsIDB4MjUwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YmMiLCAweDJjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJjIiwgMHgyZDAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViY3MiLCAweDI4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJjcyIsIDB4MjkwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YmN1IiwgMHgyYTAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViY3UiLCAweDJiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJyIiwgMHgzNDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViciIsIDB4MzUwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJjIiwgMHgzYzAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicmMiLCAweDNkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJyY3MiLCAweDM4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyY3MiLCAweDM5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJyY3UiLCAweDNhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyY3UiLCAweDNiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJycyIsIDB4MzAwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJzIiwgMHgzMTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicnUiLCAweDMyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJydSIsIDB4MzMwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnMiLCAweDIwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJzIiwgMHgyMTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VidSIsIDB4MjIwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnUiLCAweDIzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJ4bm9yIiwgMHg5NjAwMDAwMCwgImMsYSxiIiB9LAoteyAieG5vciIsIDB4OTcwMDAwMDAsICJjLGEsaSIgfSwKLXsgInhvciIsIDB4OTQwMDAwMDAsICJjLGEsYiIgfSwKLXsgInhvciIsIDB4OTUwMDAwMDAsICJjLGEsaSIgfSwKLQoteyAiIiwgMHgwLCAiIiB9CQkvKiBEdW1teSBlbnRyeSwgbm90IGluY2x1ZGVkIGluIE5VTV9PUENPREVTLiAgVGhpcwotCQkJICAgbGV0cyBjb2RlIGV4YW1pbmUgZW50cnkgaSsxIHdpdGhvdXQgY2hlY2tpbmcKLQkJCSAgIGlmIHdlJ3ZlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLwotfTsKLQotQ09OU1QgdW5zaWduZWQgaW50IG51bV9vcGNvZGVzID0gKCgoc2l6ZW9mIGEyOWtfb3Bjb2RlcykgLyAoc2l6ZW9mIGEyOWtfb3Bjb2Rlc1swXSkpIC0gMSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hbHBoYS5oIGIvaW5jbHVkZS9vcGNvZGUvYWxwaGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzMWU5YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hbHBoYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qIGFscGhhLmggLS0gSGVhZGVyIGZpbGUgZm9yIEFscGhhIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PiwKLSAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSB0YWJsZSB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgT1BDT0RFX0FMUEhBX0gKLSNkZWZpbmUgT1BDT0RFX0FMUEhBX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgYWxwaGFfb3Bjb2RlLiAgKi8KLQotc3RydWN0IGFscGhhX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbWFzazsKLQotICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHByaW1hcmlseSB1c2VkIHRvCi0gICAgIGluZGljYXRlIHNwZWNpZmljIHByb2Nlc3NvcnMgYW5kIGVudmlyb25tZW50cyBzdXBwb3J0IHRoZQotICAgICBpbnN0cnVjdGlvbnMuICBUaGUgZGVmaW5lZCB2YWx1ZXMgYXJlIGxpc3RlZCBiZWxvdy4gKi8KLSAgdW5zaWduZWQgZmxhZ3M7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s0XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlIGFscGhhX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBhbHBoYV9udW1fb3Bjb2RlczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhbHBoYV9vcGNvZGUuICAqLwotCi0vKiBDUFUgQXZhaWxhYmlsaXR5ICovCi0jZGVmaW5lIEFYUF9PUENPREVfQkFTRSAgMHgwMDAxICAvKiBCYXNlIGFyY2hpdGVjdHVyZSAtLSBhbGwgY3B1cy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY0ICAgMHgwMDAyICAvKiBFVjQgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY1ICAgMHgwMDA0ICAvKiBFVjUgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY2ICAgMHgwMDA4ICAvKiBFVjYgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfQldYICAgMHgwMTAwICAvKiBCeXRlL3dvcmQgZXh0ZW5zaW9uIChhbWFzayBiaXQgMCkuICAqLwotI2RlZmluZSBBWFBfT1BDT0RFX0NJWCAgIDB4MDIwMCAgLyogIkNvdW50IiBleHRlbnNpb24gKGFtYXNrIGJpdCAxKS4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfTUFYICAgMHgwNDAwICAvKiBNdWx0aW1lZGlhIGV4dGVuc2lvbiAoYW1hc2sgYml0IDgpLiAgKi8KLQotI2RlZmluZSBBWFBfT1BDT0RFX05PUEFMICh+KEFYUF9PUENPREVfRVY0fEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfRVY2KSkKLQotLyogQSBtYWNybyB0byBleHRyYWN0IHRoZSBtYWpvciBvcGNvZGUgZnJvbSBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEFYUF9PUChpKQkoKChpKSA+PiAyNikgJiAweDNGKQotCi0vKiBUaGUgdG90YWwgbnVtYmVyIG9mIG1ham9yIG9wY29kZXMuICovCi0jZGVmaW5lIEFYUF9OT1BTCTB4NDAKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBhbHBoYV9vcGVyYW5kLiAgKi8KLQotc3RydWN0IGFscGhhX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBmb3IgdGhpcyBvcGVyYW5kLiAgKi8KLSAgaW50IGRlZmF1bHRfcmVsb2M7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICB1bnNpZ25lZCBmbGFnczsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotICB1bnNpZ25lZCAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgaW5zdHJ1Y3Rpb24sIGludCBvcCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoKG8tPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIGludCAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgYWxwaGFfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCBhbHBoYV9vcGVyYW5kc1tdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGFscGhhX251bV9vcGVyYW5kczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhbHBoYV9vcGVyYW5kLiAgKi8KLQotLyogTWFzayBmb3Igc2VsZWN0aW5nIHRoZSB0eXBlIGZvciB0eXBlY2hlY2sgcHVycG9zZXMgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfVFlQRUNIRUNLX01BU0sJCQkJCVwKLSAgKEFYUF9PUEVSQU5EX1BBUkVOUyB8IEFYUF9PUEVSQU5EX0NPTU1BIHwgQVhQX09QRVJBTkRfSVIgfAkJXAotICAgQVhQX09QRVJBTkRfRlBSIHwgQVhQX09QRVJBTkRfUkVMQVRJVkUgfCBBWFBfT1BFUkFORF9TSUdORUQgfCAJXAotICAgQVhQX09QRVJBTkRfVU5TSUdORUQpCi0KLS8qIFRoaXMgb3BlcmFuZCBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBpbiB0aGUgYXNzZW1ibGVyIGlucHV0LiAgVGhpcwotICAgaXMgdXNlZCB0byBzdXBwb3J0IGV4dGVuZGVkIG1uZW1vbmljcywgZm9yIHdoaWNoIHR3byBvcGVyYW5kcyBmaWVsZHMKLSAgIGFyZSBpZGVudGljYWwuICBUaGUgYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZSBpbnNlcnQgZnVuY3Rpb24gd2l0aAotICAgYW55IG9wIHZhbHVlLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUgZXh0cmFjdCBmdW5jdGlvbiwKLSAgIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLCBhbmQgY2hlY2sgdGhlIHZhbHVlIHBsYWNlZCBpbiB0aGUgaW52YWxpZAotICAgYXJndW1lbnQuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9GQUtFCTAxCi0KLS8qIFRoZSBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgcHJldmlvdXMgYnkgYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGxvYWQgYW5kIHN0b3JlCi0gICBpbnN0cnVjdGlvbnMgd2hpY2ggd2FudCB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UgIlJhLGRpc3AoUmIpIi4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1BBUkVOUwkwMgotCi0vKiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggUEFSRU5TLCB0aGlzIHN1cHJlc3NlcyB0aGUgc3VwcmVzc2lvbiBvZgotICAgdGhlIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciAiam1wIFJhLChSYiksaGludCIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9DT01NQQkwNAotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYW4gaW50ZWdlciByZWdpc3Rlci4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0lSCQkwMTAKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9GUFIJCTAyMAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1JFTEFUSVZFCTA0MAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1NJR05FRAkwMTAwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyB1bnNpZ25lZCB2YWx1ZXMuICBUaGlzIGV4aXN0cyBwcmltYXJpbHkgc28gdGhhdAotICAgYSBmbGFncyB2YWx1ZSBvZiAwIGNhbiBiZSB0cmVhdGVkIGFzIGVuZC1vZi1hcmd1bWVudHMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9VTlNJR05FRAkwMjAwCi0KLS8qIFN1cHJlc3Mgb3ZlcmZsb3cgZGV0ZWN0aW9uIG9uIHRoaXMgZmllbGQuICBUaGlzIGlzIHVzZWQgZm9yIGhpbnRzLiAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9OT09WRVJGTE9XCTA0MDAKLQotLyogTWFzayBmb3Igb3B0aW9uYWwgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZS4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX09QVElPTkFMX01BU0sgMDcwMDAKLQotLyogVGhpcyBvcGVyYW5kIGRlZmF1bHRzIHRvIHplcm8uICBUaGlzIGlzIHVzZWQgZm9yIGp1bXAgaGludHMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk8gMDEwMDAKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBkZWZhdWx0IHRvIHRoZSBmaXJzdCAocmVhbCkgb3BlcmFuZCBhbmQgaXMgdXNlZAotICAgaW4gY29uanVuY3Rpb24gd2l0aCBBWFBfT1BFUkFORF9PUFRJT05BTC4gIFRoaXMgYWxsb3dzCi0gICAiYW5kICQwLDMsJDAiIHRvIGJlIHdyaXR0ZW4gYXMgImFuZCAkMCwzIiwgZXRjLiAgSSBkb24ndCBsaWtlCi0gICBpdCwgYnV0IGl0J3Mgd2hhdCBERUMgZG9lcy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QgMDIwMDAKLQotLyogU2ltaWxhcmx5LCB0aGlzIG9wZXJhbmQgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIHNlY29uZCAocmVhbCkgb3BlcmFuZC4KLSAgIFRoaXMgYWxsb3dzICJuZWdsICQwIiBpbnN0ZWFkIG9mICJuZWdsICQwLCQwIi4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfU0VDT05EIDA0MDAwCi0KLQwKLS8qIFJlZ2lzdGVyIGNvbW1vbiBuYW1lcyAqLwotCi0jZGVmaW5lIEFYUF9SRUdfVjAJMAotI2RlZmluZSBBWFBfUkVHX1QwCTEKLSNkZWZpbmUgQVhQX1JFR19UMQkyCi0jZGVmaW5lIEFYUF9SRUdfVDIJMwotI2RlZmluZSBBWFBfUkVHX1QzCTQKLSNkZWZpbmUgQVhQX1JFR19UNAk1Ci0jZGVmaW5lIEFYUF9SRUdfVDUJNgotI2RlZmluZSBBWFBfUkVHX1Q2CTcKLSNkZWZpbmUgQVhQX1JFR19UNwk4Ci0jZGVmaW5lIEFYUF9SRUdfUzAJOQotI2RlZmluZSBBWFBfUkVHX1MxCTEwCi0jZGVmaW5lIEFYUF9SRUdfUzIJMTEKLSNkZWZpbmUgQVhQX1JFR19TMwkxMgotI2RlZmluZSBBWFBfUkVHX1M0CTEzCi0jZGVmaW5lIEFYUF9SRUdfUzUJMTQKLSNkZWZpbmUgQVhQX1JFR19GUAkxNQotI2RlZmluZSBBWFBfUkVHX0EwCTE2Ci0jZGVmaW5lIEFYUF9SRUdfQTEJMTcKLSNkZWZpbmUgQVhQX1JFR19BMgkxOAotI2RlZmluZSBBWFBfUkVHX0EzCTE5Ci0jZGVmaW5lIEFYUF9SRUdfQTQJMjAKLSNkZWZpbmUgQVhQX1JFR19BNQkyMQotI2RlZmluZSBBWFBfUkVHX1Q4CTIyCi0jZGVmaW5lIEFYUF9SRUdfVDkJMjMKLSNkZWZpbmUgQVhQX1JFR19UMTAJMjQKLSNkZWZpbmUgQVhQX1JFR19UMTEJMjUKLSNkZWZpbmUgQVhQX1JFR19SQQkyNgotI2RlZmluZSBBWFBfUkVHX1BWCTI3Ci0jZGVmaW5lIEFYUF9SRUdfVDEyCTI3Ci0jZGVmaW5lIEFYUF9SRUdfQVQJMjgKLSNkZWZpbmUgQVhQX1JFR19HUAkyOQotI2RlZmluZSBBWFBfUkVHX1NQCTMwCi0jZGVmaW5lIEFYUF9SRUdfWkVSTwkzMQotCi0jZW5kaWYgLyogT1BDT0RFX0FMUEhBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2FyYy5oIGIvaW5jbHVkZS9vcGNvZGUvYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTBjYTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgYW5kCi10aGUgR05VIEJpbnV0aWxzLgotCi1HQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCUlmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTGlzdCBvZiB0aGUgdmFyaW91cyBjcHUgdHlwZXMuCi0gICBUaGUgdGFibGVzIGN1cnJlbnRseSB1c2UgYml0IG1hc2tzIHRvIHNheSB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBvcgotICAgd2hhdGV2ZXIgaXMgc3VwcG9ydGVkIGJ5IGEgcGFydGljdWxhciBjcHUuICBUaGlzIGxldHMgdXMgaGF2ZSBvbmUgZW50cnkKLSAgIGFwcGx5IHRvIHNldmVyYWwgY3B1cy4KLQotICAgVGhpcyBkdXBsaWNhdGVzIGJmZF9tYWNoX2FyY194eHguICBGb3Igbm93IEkgd2lzaCB0byBpc29sYXRlIHRoaXMgZnJvbSBiZmQKLSAgIGFuZCBiZmQgZnJvbSB0aGlzLiAgQWxzbyBub3RlIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgYml0IHZhbHVlcyBhcyB3ZSB3YW50Ci0gICB0byBhbGxvdyBmb3IgdGhpbmdzIGF2YWlsYWJsZSBvbiBtb3JlIHRoYW4gb25lIEFSQyAoYnV0IG5vdCBuZWNlc3NhcmlseSBhbGwKLSAgIEFSQ3MpLiAgKi8KLQotLyogVGhlIGBiYXNlJyBjcHUgbXVzdCBiZSAwICh0YWJsZSBlbnRyaWVzIGFyZSBvbWl0dGVkIGZvciB0aGUgYmFzZSBjcHUpLgotICAgVGhlIGNwdSB0eXBlIGlzIHRyZWF0ZWQgaW5kZXBlbmRlbnRseSBvZiBlbmRpYW5uZXNzLgotICAgVGhlIGNvbXBsZXRlIGBtYWNoJyBudW1iZXIgaW5jbHVkZXMgZW5kaWFubmVzcy4KLSAgIFRoZXNlIHZhbHVlcyBhcmUgaW50ZXJuYWwgdG8gb3Bjb2Rlcy9iZmQvYmludXRpbHMvZ2FzLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQkFTRSAwCi0jZGVmaW5lIEFSQ19NQUNIX1VOVVNFRDEgMQotI2RlZmluZSBBUkNfTUFDSF9VTlVTRUQyIDIKLSNkZWZpbmUgQVJDX01BQ0hfVU5VU0VENCA0Ci0vKiBBZGRpdGlvbmFsIGNwdSB2YWx1ZXMgY2FuIGJlIGluc2VydGVkIGhlcmUgYW5kIEFSQ19NQUNIX0JJRyBtb3ZlZCBkb3duLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQklHIDgKLQotLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQ1BVX01BU0sgNwotLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlICsgZW5kaWFubmVzcy4gICovCi0jZGVmaW5lIEFSQ19NQUNIX01BU0sgMTUKLQotLyogVHlwZSB0byBkZW5vdGUgYW4gQVJDIGluc3RydWN0aW9uIChhdCBsZWFzdCBhIDMyIGJpdCB1bnNpZ25lZCBpbnQpLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IGFyY19pbnNuOwotCi1zdHJ1Y3QgYXJjX29wY29kZSB7Ci0gIGNoYXIgKnN5bnRheDsJCQkvKiBzeW50YXggb2YgaW5zbiAqLwotICB1bnNpZ25lZCBsb25nIG1hc2ssIHZhbHVlOwkvKiByZWNvZ25pemUgaW5zbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gIGludCBmbGFnczsJCQkvKiB2YXJpb3VzIGZsYWcgYml0cyAqLwotCi0vKiBWYWx1ZXMgZm9yIGBmbGFncycuICAqLwotCi0vKiBSZXR1cm4gQ1BVIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogUmV0dXJuIE1BQ0ggbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi0vKiBGaXJzdCBvcGNvZGUgZmxhZyBiaXQgYXZhaWxhYmxlIGFmdGVyIG1hY2hpbmUgbWFzay4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfRkxBR19TVEFSVCAoKEFSQ19NQUNIX01BU0sgKyAxKSA8PCAwKQotLyogVGhpcyBpbnNuIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9DT05EX0JSQU5DSCAoQVJDX09QQ09ERV9GTEFHX1NUQVJUKQotCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBhc3NlbWJseSBhbmQgZGlzYXNzZW1ibHkuICBFYWNoIGluc24gaXMKLSAgICAgb24gYSBsaXN0IG9mIHJlbGF0ZWQgaW5zbnMgKHNhbWUgZmlyc3QgbGV0dGVyIGZvciBhc3NlbWJseSwgc2FtZSBpbnNuIGNvZGUKLSAgICAgZm9yIGRpc2Fzc2VtYmx5KS4gICovCi0gIHN0cnVjdCBhcmNfb3Bjb2RlICpuZXh0X2FzbTsJLyogTmV4dCBpbnN0cnVjdGlvbiB0byB0cnkgZHVyaW5nIGFzc2VtYmx5LiAgKi8KLSAgc3RydWN0IGFyY19vcGNvZGUgKm5leHRfZGlzOwkvKiBOZXh0IGluc3RydWN0aW9uIHRvIHRyeSBkdXJpbmcgZGlzYXNzZW1ibHkuICAqLwotCi0gIC8qIE1hY3JvcyB0byBjcmVhdGUgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgbGlzdHMuICAqLwotI2RlZmluZSBBUkNfSEFTSF9PUENPREUoc3RyaW5nKSBcCi0gICgoc3RyaW5nKVswXSA+PSAnYScgJiYgKHN0cmluZylbMF0gPD0gJ3onID8gKHN0cmluZylbMF0gLSAnYScgOiAyNikKLSNkZWZpbmUgQVJDX0hBU0hfSUNPREUoaW5zbikgXAotICAoKHVuc2lnbmVkIGludCkgKGluc24pID4+IDI3KQotCi0gIC8qIE1hY3JvcyB0byBhY2Nlc3MgYG5leHRfYXNtJywgYG5leHRfZGlzJyBzbyB1c2VycyBuZWVkbid0IGNhcmUgYWJvdXQgdGhlCi0gICAgIHVuZGVybHlpbmcgbWVjaGFuaXNtLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9ORVhUX0FTTShvcCkgKChvcCktPm5leHRfYXNtKQotI2RlZmluZSBBUkNfT1BDT0RFX05FWFRfRElTKG9wKSAoKG9wKS0+bmV4dF9kaXMpCi19OwotCi1zdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgewotICBjaGFyICpuYW1lOwkJCS8qIGVnOiAiZXEiICovCi0gIHNob3J0IHZhbHVlOwkJCS8qIGVnOiAxICovCi0gIHVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycgKi8KLSAgdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIHZhcmlvdXMgZmxhZyBiaXRzICovCi0KLS8qIFZhbHVlcyBmb3IgYGZsYWdzJy4gICovCi0KLS8qIFJldHVybiBDUFUgbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BWQUxfQ1BVKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9DUFVfTUFTSykKLS8qIFJldHVybiBNQUNIIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QVkFMX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi19OwotCi1zdHJ1Y3QgYXJjX29wZXJhbmQgewotICAvKiBPbmUgb2YgdGhlIGluc24gZm9ybWF0IGNoYXJzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmbXQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kIChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG9yCi0gICAgIHRoZSBtb2RpZmllcidzIGZsYWcgYml0IChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaGlmdDsKLQotICAvKiBWYXJpb3VzIGZsYWcgYml0cy4gICovCi0gIGludCBmbGFnczsKLQotLyogVmFsdWVzIGZvciBgZmxhZ3MnLiAgKi8KLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgc3VmZml4IHRvIHRoZSBvcGNvZGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TVUZGSVggMQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCAyCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9BQlNPTFVURV9CUkFOQ0ggNAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9BRERSRVNTIDgKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgbG9uZyBpbW1lZGlhdGUgdmFsdWUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9MSU1NIDB4MTAKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TSUdORUQgMHgyMAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcywgYnV0IGFsc28gYWNjZXB0cyBhIGZ1bGwgcG9zaXRpdmUKLSAgIHJhbmdlIG9mIHZhbHVlcy4gIFRoYXQgaXMsIGlmIGJpdHMgaXMgMTYsIGl0IHRha2VzIGFueSB2YWx1ZSBmcm9tCi0gICAtMHg4MDAwIHRvIDB4ZmZmZi4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1NJR05PUFQgMHg0MAotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUKLSAgIHB1cnBvc2VzIG9mIG92ZXJmbG93IGNoZWNraW5nIChpLmUuLCB0aGUgbm9ybWFsIG1vc3QgbmVnYXRpdmUKLSAgIG51bWJlciBpcyBkaXNhbGxvd2VkIGFuZCBvbmUgbW9yZSB0aGFuIHRoZSBub3JtYWwgbW9zdCBwb3NpdGl2ZQotICAgbnVtYmVyIGlzIGFsbG93ZWQpLiAgVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgZm9yIGEgc2lnbmVkCi0gICBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfTkVHQVRJVkUgMHg4MAotCi0vKiBUaGlzIG9wZXJhbmQgZG9lc24ndCByZWFsbHkgZXhpc3QuICBUaGUgcHJvZ3JhbSB1c2VzIHRoZXNlIG9wZXJhbmRzCi0gICBpbiBzcGVjaWFsIHdheXMuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9GQUtFIDB4MTAwCi0KLS8qIE1vZGlmaWVyIHZhbHVlcy4gICovCi0vKiBBIGRvdCBpcyByZXF1aXJlZCBiZWZvcmUgYSBzdWZmaXguICBFZzogLmxlICAqLwotI2RlZmluZSBBUkNfTU9EX0RPVCAweDEwMDAKLQotLyogQSBub3JtYWwgcmVnaXN0ZXIgaXMgYWxsb3dlZCAobm90IHVzZWQsIGJ1dCBoZXJlIGZvciBjb21wbGV0ZW5lc3MpLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9SRUcgMHgyMDAwCi0KLS8qIEFuIGF1eGlsaWFyeSByZWdpc3RlciBuYW1lIGlzIGV4cGVjdGVkLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9BVVhSRUcgMHg0MDAwCi0KLS8qIFN1bSBvZiBhbGwgQVJDX01PRF9YWFggYml0cy4gICovCi0jZGVmaW5lIEFSQ19NT0RfQklUUyAweDcwMDAKLQotLyogTm9uLXplcm8gaWYgdGhlIG9wZXJhbmQgdHlwZSBpcyByZWFsbHkgYSBtb2RpZmllci4gICovCi0jZGVmaW5lIEFSQ19NT0RfUChYKSAoKFgpICYgQVJDX01PRF9CSVRTKQotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChwICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OwotICAgICAoSSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIE8gaXMgYSBwb2ludGVyIHRvCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgT1AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKLSAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgotICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZwotICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQuCi0KLSAgICAgUkVHIGlzIG5vbi1OVUxMIHdoZW4gaW5zZXJ0aW5nIGEgcmVnaXN0ZXIgdmFsdWUuICAqLwotCi0gIGFyY19pbnNuICgqaW5zZXJ0KSBQQVJBTVMgKChhcmNfaW5zbiBpbnNuLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kLCBpbnQgbW9kcywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnLCBsb25nIHZhbHVlLAotCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKEkgaXMgdGhlIGluc3RydWN0aW9uLCBPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIE9QCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgotCi0gICAgIElOU04gaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHR3byBgYXJjX2luc24ncy4gIFRoZSBmaXJzdCBlbGVtZW50IGlzCi0gICAgIHRoZSBpbnNuLCB0aGUgc2Vjb25kIGlzIHRoZSBsaW1tIGlmIHByZXNlbnQuCi0KLSAgICAgT3BlcmFuZHMgdGhhdCBoYXZlIGEgcHJpbnRhYmxlIGZvcm0gbGlrZSByZWdpc3RlcnMgYW5kIHN1ZmZpeGVzIGhhdmUKLSAgICAgdGhlaXIgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIHBvaW50ZXIgc3RvcmVkIGluIE9QVkFMLiAgKi8KLQotICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgoYXJjX2luc24gKmluc24sCi0JCQkgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQsCi0JCQkgICBpbnQgbW9kcywgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWwsCi0JCQkgICBpbnQgKmludmFsaWQpKTsKLX07Ci0KLS8qIEJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIGNwdSB3ZSBoYXZlLgotICAgVGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCB0byBhcmNfaW5pdF9vcGNvZGVfdGFibGVzLgotICAgQXQgcHJlc2VudCwgYWxsIHRoZXJlIGlzIGlzIHRoZSBjcHUgdHlwZS4gICovCi0KLS8qIENQVSBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLwotI2RlZmluZSBBUkNfSEFWRV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogTUFDSCBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLwotI2RlZmluZSBBUkNfSEFWRV9NQUNIKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9NQVNLKQotCi0vKiBTcGVjaWFsIHJlZ2lzdGVyIHZhbHVlczogICovCi0jZGVmaW5lIEFSQ19SRUdfU0hJTU1fVVBEQVRFIDYxCi0jZGVmaW5lIEFSQ19SRUdfU0hJTU0gNjMKLSNkZWZpbmUgQVJDX1JFR19MSU1NIDYyCi0KLS8qIE5vbi16ZXJvIGlmIFJFRyBpcyBhIGNvbnN0YW50IG1hcmtlci4gICovCi0jZGVmaW5lIEFSQ19SRUdfQ09OU1RBTlRfUChSRUcpICgoUkVHKSA+PSA2MSkKLQotLyogUG9zaXRpb25zIGFuZCBtYXNrcyBvZiB2YXJpb3VzIGZpZWxkczogICovCi0jZGVmaW5lIEFSQ19TSElGVF9SRUdBIDIxCi0jZGVmaW5lIEFSQ19TSElGVF9SRUdCIDE1Ci0jZGVmaW5lIEFSQ19TSElGVF9SRUdDIDkKLSNkZWZpbmUgQVJDX01BU0tfUkVHIDYzCi0KLS8qIERlbGF5IHNsb3QgdHlwZXMuICAqLwotI2RlZmluZSBBUkNfREVMQVlfTk9ORSAwCS8qIG5vIGRlbGF5IHNsb3QgKi8KLSNkZWZpbmUgQVJDX0RFTEFZX05PUk1BTCAxCS8qIGRlbGF5IHNsb3QgaW4gYm90aCBjYXNlcyAqLwotI2RlZmluZSBBUkNfREVMQVlfSlVNUCAyCS8qIGRlbGF5IHNsb3Qgb25seSBpZiBicmFuY2ggdGFrZW4gKi8KLQotLyogTm9uLXplcm8gaWYgWCB3aWxsIGZpdCBpbiBhIHNpZ25lZCA5IGJpdCBmaWVsZC4gICovCi0jZGVmaW5lIEFSQ19TSElNTV9DT05TVF9QKHgpICgobG9uZykgKHgpID49IC0yNTYgJiYgKGxvbmcpICh4KSA8PSAyNTUpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgYXJjX29wZXJhbmRzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19vcGVyYW5kX2NvdW50OwotZXh0ZXJuIC8qY29uc3QqLyBzdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfb3Bjb2Rlc19jb3VudDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19zdWZmaXhlc19jb3VudDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3JlZ19uYW1lc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50OwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYXJjX29wZXJhbmRfbWFwW107Ci0KLS8qIFV0aWxpdHkgZm5zIGluIGFyYy1vcGMuYy4gICovCi1pbnQgYXJjX2dldF9vcGNvZGVfbWFjaCBQQVJBTVMgKChpbnQsIGludCkpOwotLyogYGFyY19vcGNvZGVfaW5pdF90YWJsZXMnIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBgYXJjX3h4eF9zdXBwb3J0ZWQnLiAgKi8KLXZvaWQgYXJjX29wY29kZV9pbml0X3RhYmxlcyBQQVJBTVMgKChpbnQpKTsKLXZvaWQgYXJjX29wY29kZV9pbml0X2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGFyY19vcGNvZGVfaW5pdF9leHRyYWN0IFBBUkFNUyAoKHZvaWQpKTsKLWNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICphcmNfb3Bjb2RlX2xvb2t1cF9hc20gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqYXJjX29wY29kZV9sb29rdXBfZGlzIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotaW50IGFyY19vcGNvZGVfbGltbV9wIFBBUkFNUyAoKGxvbmcgKikpOwotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICphcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggUEFSQU1TICgoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICp0eXBlLCBpbnQgdmFsdWUpKTsKLWludCBhcmNfb3Bjb2RlX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqKSk7Ci1pbnQgYXJjX29wdmFsX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKikpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYXJtLmggYi9pbmNsdWRlL29wY29kZS9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwODdlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKiBBUk0gb3Bjb2RlIGxpc3QuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotR0RCIGFuZCBHQVMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGFuZCBHQVMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCIG9yIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogdHlwZXMgb2YgaW5zdHJ1Y3Rpb24gKGVuY29kZWQgaW4gYml0cyAyNiBhbmQgMjcgb2YgdGhlIGluc3RydWN0aW9uKSAqLwotCi0jZGVmaW5lIFRZUEVfQVJJVEhNRVRJQwkJMAotI2RlZmluZSBUWVBFX0xEUl9TVFIJCTEKLSNkZWZpbmUgVFlQRV9CTE9DS19CUkFOQ0gJMgotI2RlZmluZSBUWVBFX1NXSQkJMwotCi0vKiBiaXQgMjUgZGVjaWRlcyB3aGV0aGVyIGFuIGluc3RydWN0aW9uIGlzIGEgYmxvY2sgbW92ZSBvciBhIGJyYW5jaCAqLwotI2RlZmluZSBTVUJUWVBFX0JMT0NLCQkwCi0jZGVmaW5lIFNVQlRZUEVfQlJBTkNICQkxCi0KLS8qIGNvZGVzIHRvIGRpc3Rpbmd1aXNoIHRoZSBhcml0aG1ldGljIGluc3RydWN0aW9ucyAqLwotCi0jZGVmaW5lIE9QQ09ERV9BTkQJMAotI2RlZmluZSBPUENPREVfRU9SCTEKLSNkZWZpbmUgT1BDT0RFX1NVQgkyCi0jZGVmaW5lIE9QQ09ERV9SU0IJMwotI2RlZmluZSBPUENPREVfQURECTQKLSNkZWZpbmUgT1BDT0RFX0FEQwk1Ci0jZGVmaW5lIE9QQ09ERV9TQkMJNgotI2RlZmluZSBPUENPREVfUlNDCTcKLSNkZWZpbmUgT1BDT0RFX1RTVAk4Ci0jZGVmaW5lIE9QQ09ERV9URVEJOQotI2RlZmluZSBPUENPREVfQ01QCTEwCi0jZGVmaW5lIE9QQ09ERV9DTU4JMTEKLSNkZWZpbmUgT1BDT0RFX09SUgkxMgotI2RlZmluZSBPUENPREVfTU9WCTEzCi0jZGVmaW5lIE9QQ09ERV9CSUMJMTQKLSNkZWZpbmUgT1BDT0RFX01WTgkxNQotCi0vKiBjb25kaXRpb24gY29kZXMgKi8KLQotI2RlZmluZSBDT05EX0VRCQkwCi0jZGVmaW5lIENPTkRfTkUJCTEKLSNkZWZpbmUgQ09ORF9DUwkJMgotI2RlZmluZSBDT05EX0NDCQkzCi0jZGVmaW5lIENPTkRfTUkJCTQKLSNkZWZpbmUgQ09ORF9QTAkJNQotI2RlZmluZSBDT05EX1ZTCQk2Ci0jZGVmaW5lIENPTkRfVkMJCTcKLSNkZWZpbmUgQ09ORF9ISQkJOAotI2RlZmluZSBDT05EX0xTCQk5Ci0jZGVmaW5lIENPTkRfR0UJCTEwCi0jZGVmaW5lIENPTkRfTFQJCTExCi0jZGVmaW5lIENPTkRfR1QJCTEyCi0jZGVmaW5lIENPTkRfTEUJCTEzCi0jZGVmaW5lIENPTkRfQUwJCTE0Ci0jZGVmaW5lIENPTkRfTlYJCTE1Ci0KLS8qIERlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIGFuIEFSTSBtYWNoaW5lIGluc3RydWN0aW9uICovCi0KLXN0cnVjdCBnZW5lcmljX2ZtdCB7Ci0gICAgdW5zaWduZWQgcmVzdAk6MjU7CS8qIHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIHN1YnR5cGUJOjE7CS8qIHVzZWQgdG8gZGVjaWRlIGJldHdlZW4gYmxvY2sgYW5kIGJyYW5jaCAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qIG9uZSBvZiBUWVBFXyogKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBhcml0aF9mbXQgewotICAgIHVuc2lnbmVkIG9wZXJhbmQyCToxMjsJLyogI25uIG9yIHJuIG9yIHJuIHNoaWZ0ICNtIG9yIHJuIHNoaWZ0IHJtICovCi0gICAgdW5zaWduZWQgZGVzdAk6NDsJLyogcGxhY2Ugd2hlcmUgdGhlIGFuc3dlciBnb2VzICovCi0gICAgdW5zaWduZWQgb3BlcmFuZDEJOjQ7CS8qIGZpcnN0IG9wZXJhbmQgdG8gaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBzZXQJOjE7CS8qID09IDEgbWVhbnMgc2V0IHByb2Nlc3NvciBmbGFncyAqLwotICAgIHVuc2lnbmVkIG9wY29kZQk6NDsJLyogb25lIG9mIE9QQ09ERV8qIGRlZmluZWQgYWJvdmUgKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogb3BlcmFuZDIgaXMgYW4gaW1tZWRpYXRlIHZhbHVlICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9BUklUSE1FVElDICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgbGRyX3N0cl9mbXQgewotICAgIHVuc2lnbmVkIG9mZnNldAk6MTI7CS8qICNubiBvciBybiBvciBybiBzaGlmdCAjbSAqLwotICAgIHVuc2lnbmVkIHJlZwk6NDsJLyogZGVzdGluYXRpb24gZm9yIExEUiwgc291cmNlIGZvciBTVFIgKi8KLSAgICB1bnNpZ25lZCBiYXNlCTo0OwkvKiBiYXNlIHJlZ2lzdGVyICovCi0gICAgdW5zaWduZWQgaXNfbG9hZAk6MTsJLyogPT0gMSBmb3IgTERSICovCi0gICAgdW5zaWduZWQgd3JpdGViYWNrCToxOwkvKiA9PSAxIG1lYW5zIHdyaXRlIGJhY2sgKGJhc2Urb2Zmc2V0KSBpbnRvIGJhc2UgKi8KLSAgICB1bnNpZ25lZCBieXRlCToxOwkvKiA9PSAxIG1lYW5zIGJ5dGUgYWNjZXNzIGVsc2Ugd29yZCAqLwotICAgIHVuc2lnbmVkIHVwCQk6MTsJLyogPT0gMSBtZWFucyBhZGQgb2Zmc2V0IGVsc2Ugc3VidHJhY3QgaXQgKi8KLSAgICB1bnNpZ25lZCBwcmVfaW5kZXgJOjE7CS8qID09IDEgbWVhbnMgW2EsYl0gZm9ybSBlbHNlIFthXSxiIGZvcm0gKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogPT0gMCBtZWFucyBpbW1lZGlhdGUgb2Zmc2V0ICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9MRFJfU1RSICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYmxvY2tfZm10IHsKLSAgICB1bnNpZ25lZCBtYXNrCToxNjsJLyogcmVnaXN0ZXIgbWFzayAqLwotICAgIHVuc2lnbmVkIGJhc2UJOjQ7CS8qIHJlZ2lzdGVyIHVzZWQgYXMgYmFzZSBvZiBtb3ZlICovCi0gICAgdW5zaWduZWQgaXNfbG9hZAk6MTsJLyogPT0gMSBmb3IgTERNICovCi0gICAgdW5zaWduZWQgd3JpdGViYWNrCToxOwkvKiA9PSAxIG1lYW5zIHVwZGF0ZSBiYXNlIGFmdGVyIG1vdmUgKi8KLSAgICB1bnNpZ25lZCBzZXQJOjE7CS8qID09IDEgbWVhbnMgc2V0IGZsYWdzIGluIHBjIGlmIGluY2x1ZGVkIGluIG1hc2sgKi8KLSAgICB1bnNpZ25lZCBpbmNyZW1lbnQJOjE7CS8qID09IDEgbWVhbnMgaW5jcmVtZW50IGJhc2UgcmVnaXN0ZXIgKi8KLSAgICB1bnNpZ25lZCBiZWZvcmUJOjE7CS8qID09IDEgbWVhbnMgaW5jL2RlYyBiZWZvcmUgZWFjaCBtb3ZlICovCi0gICAgdW5zaWduZWQgaXNfYmxvY2sJOjE7CS8qID09IFNVQlRZUEVfQkxPQ0sgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0JMT0NLX0JSQU5DSCAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotc3RydWN0IGJyYW5jaF9mbXQgewotICAgIHVuc2lnbmVkIGRlc3QJOjI0OwkvKiBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoICovCi0gICAgdW5zaWduZWQgbGluawk6MTsJLyogYnJhbmNoIHdpdGggbGluayAoZnVuY3Rpb24gY2FsbCkgKi8KLSAgICB1bnNpZ25lZCBpc19icmFuY2gJOjE7CS8qID09IFNVQlRZUEVfQlJBTkNIICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9CTE9DS19CUkFOQ0ggKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLSNkZWZpbmUgUk9VTkRfTgkJMAotI2RlZmluZSBST1VORF9QCQkxCi0jZGVmaW5lIFJPVU5EX00JCTIKLSNkZWZpbmUgUk9VTkRfWgkJMwotCi0jZGVmaW5lIEZMT0FUMl9NVkYJMAotI2RlZmluZSBGTE9BVDJfTU5GCTEKLSNkZWZpbmUgRkxPQVQyX0FCUwkyCi0jZGVmaW5lIEZMT0FUMl9STkQJMwotI2RlZmluZSBGTE9BVDJfU1FUCTQKLSNkZWZpbmUgRkxPQVQyX0xPRwk1Ci0jZGVmaW5lIEZMT0FUMl9MR04JNgotI2RlZmluZSBGTE9BVDJfRVhQCTcKLSNkZWZpbmUgRkxPQVQyX1NJTgk4Ci0jZGVmaW5lIEZMT0FUMl9DT1MJOQotI2RlZmluZSBGTE9BVDJfVEFOCTEwCi0jZGVmaW5lIEZMT0FUMl9BU04JMTEKLSNkZWZpbmUgRkxPQVQyX0FDUwkxMgotI2RlZmluZSBGTE9BVDJfQVROCTEzCi0KLSNkZWZpbmUgRkxPQVQzX0FERgkwCi0jZGVmaW5lIEZMT0FUM19NVUYJMQotI2RlZmluZSBGTE9BVDNfU1VGCTIKLSNkZWZpbmUgRkxPQVQzX1JTRgkzCi0jZGVmaW5lIEZMT0FUM19EVkYJNAotI2RlZmluZSBGTE9BVDNfUkRGCTUKLSNkZWZpbmUgRkxPQVQzX1BPVwk2Ci0jZGVmaW5lIEZMT0FUM19SUFcJNwotI2RlZmluZSBGTE9BVDNfUk1GCTgKLSNkZWZpbmUgRkxPQVQzX0ZNTAk5Ci0jZGVmaW5lIEZMT0FUM19GRFYJMTAKLSNkZWZpbmUgRkxPQVQzX0ZSRAkxMQotI2RlZmluZSBGTE9BVDNfUE9MCTEyCi0KLXN0cnVjdCBmbG9hdDJfZm10IHsKLSAgICB1bnNpZ25lZCBvcGVyYW5kMgk6MzsJLyogc2Vjb25kIG9wZXJhbmQgKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogPT0gMSBpZiBzZWNvbmQgb3BlcmFuZCBpcyBhIGNvbnN0YW50ICovCi0gICAgdW5zaWduZWQgcGFkMQk6MTsJLyogPT0gMCAqLwotICAgIHVuc2lnbmVkIHJvdW5kaW5nCToyOwkvKiBST1VORF8qICovCi0gICAgdW5zaWduZWQgaXNfZG91YmxlCToxOwkvKiA9PSAxIGlmIHByZWNpc2lvbiBpcyBkb3VibGUgKG9ubHkgaWYgbm90IGV4dGVuZGVkKSAqLwotICAgIHVuc2lnbmVkIHBhZDIJOjQ7CS8qID09IDEgKi8KLSAgICB1bnNpZ25lZCBkZXN0CTozOwkvKiBkZXN0aW5hdGlvbiAqLwotICAgIHVuc2lnbmVkIGlzXzJfb3AJOjE7CS8qID09IDEgaWYgMiBvcGVyYW5kIGlucyAqLwotICAgIHVuc2lnbmVkIG9wZXJhbmQxCTozOwkvKiBmaXJzdCBvcGVyYW5kIChvbmx5IG9mIGlzXzJfb3AgPT0gMCkgKi8KLSAgICB1bnNpZ25lZCBpc19leHRlbmRlZCA6MTsJLyogPT0gMSBpZiBwcmVjaXNpb24gaXMgZXh0ZW5kZWQgKi8KLSAgICB1bnNpZ25lZCBvcGNvZGUJOjQ7CS8qIEZMT0FUMl8qIG9yIEZMT0FUM18qIGRlcGVuZGluZyBvbiBpc18yX29wICovCi0gICAgdW5zaWduZWQgbXVzdF9iZV8yCToyOwkvKiA9PSAyICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9TV0kgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBDT05EXyogKi8KLX07Ci0KLXN0cnVjdCBzd2lfZm10IHsKLSAgICB1bnNpZ25lZCBhcmd1bWVudAk6MjQ7CS8qIGFyZ3VtZW50IHRvIFNXSSAoc3lzY2FsbCBudW1iZXIpICovCi0gICAgdW5zaWduZWQgbXVzdF9iZV8zCToyOwkvKiA9PSAzICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9TV0kgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXVuaW9uIGluc25fZm10IHsKLSAgICBzdHJ1Y3QgZ2VuZXJpY19mbXQJZ2VuZXJpYzsKLSAgICBzdHJ1Y3QgYXJpdGhfZm10CWFyaXRoOwotICAgIHN0cnVjdCBsZHJfc3RyX2ZtdAlsZHJfc3RyOwotICAgIHN0cnVjdCBibG9ja19mbXQJYmxvY2s7Ci0gICAgc3RydWN0IGJyYW5jaF9mbXQJYnJhbmNoOwotICAgIHN0cnVjdCBzd2lfZm10CXN3aTsKLSAgICB1bnNpZ25lZCBsb25nCWluczsKLX07Ci0KLXN0cnVjdCBvcGNvZGUgewotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqYXNzZW1ibGVyOwkJLyogaG93IHRvIGRpc2Fzc2VtYmxlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLS8qIGZvcm1hdCBvZiB0aGUgYXNzZW1ibGVyIHN0cmluZyA6Ci0gICAKLSAgICUlCQkJJQotICAgJTxiaXRmaWVsZD5kCQlwcmludCB0aGUgYml0ZmllbGQgaW4gZGVjaW1hbAotICAgJTxiaXRmaWVsZD54CQlwcmludCB0aGUgYml0ZmllbGQgaW4gaGV4Ci0gICAlPGJpdGZpZWxkPnIJCXByaW50IGFzIGFuIEFSTSByZWdpc3RlcgotICAgJTxiaXRmaWVsZD5mCQlwcmludCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGlmID43IGVsc2UgYW4gZnAgcmVnaXN0ZXIKLSAgICVjCQkJcHJpbnQgY29uZGl0aW9uIGNvZGUgKGFsd2F5cyBiaXRzIDI4LTMxKQotICAgJVAJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gYXJpdGhtZXRpYyBpbnNuCi0gICAlUQkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBsZGYvc3RmIGluc24KLSAgICVSCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgbW9kZQotICAgJTxiaXRudW0+J2MJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgb25lCi0gICAlPGJpdG51bT5gYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyB6ZXJvCi0gICAlPGJpdG51bT4/YWIJCXByaW50IGEgaWYgYml0IGlzIG9uZSBlbHNlIHByaW50IGIKLSAgICVwCQkJcHJpbnQgJ3AnIGlmZiBiaXRzIDEyLTE1IGFyZSAxNQotICAgJW8JCQlwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCi0gICAlYQkJCXByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaW5zdHJ1Y3Rpb24KLSAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCi0gICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgotICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0qLwotCi1zdGF0aWMgc3RydWN0IG9wY29kZSBvcGNvZGVzW10gPSB7Ci0gICAgLyogQVJNIGluc3RydWN0aW9ucyAqLwotICAgIDB4MDAwMDAwOTAsIDB4MGZlMDAwZjAsICJtdWwlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlMC0zciIsCi0gICAgMHgwMDIwMDA5MCwgMHgwZmUwMDBmMCwgIm1sYSUyMCdzICUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIiLAotICAgIDB4MDAwMDAwMDAsIDB4MGRlMDAwMDAsICJhbmQlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwMjAwMDAwLCAweDBkZTAwMDAwLCAiZW9yJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMDQwMDAwMCwgMHgwZGUwMDAwMCwgInN1YiVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDA2MDAwMDAsIDB4MGRlMDAwMDAsICJyc2IlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwODAwMDAwLCAweDBkZTAwMDAwLCAiYWRkJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMGEwMDAwMCwgMHgwZGUwMDAwMCwgImFkYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDBjMDAwMDAsIDB4MGRlMDAwMDAsICJzYmMlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwZTAwMDAwLCAweDBkZTAwMDAwLCAicnNjJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTAwMDAwMCwgMHgwZGUwMDAwMCwgInRzdCVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDEyMDAwMDAsIDB4MGRlMDAwMDAsICJ0ZXElYyVwICUxNi0xOXIsICVvIiwKLSAgICAweDAxNDAwMDAwLCAweDBkZTAwMDAwLCAiY21wJWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTYwMDAwMCwgMHgwZGUwMDAwMCwgImNtbiVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDE4MDAwMDAsIDB4MGRlMDAwMDAsICJvcnIlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAxYTAwMDAwLCAweDBkZTAwMDAwLCAibW92JWMlMjAncyAlMTItMTVyLCAlbyIsCi0gICAgMHgwMWMwMDAwMCwgMHgwZGUwMDAwMCwgImJpYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDFlMDAwMDAsIDB4MGRlMDAwMDAsICJtdm4lYyUyMCdzICUxMi0xNXIsICVvIiwKLSAgICAweDA0MDAwMDAwLCAweDBjMTAwMDAwLCAic3RyJWMlMjInYiAlMTItMTVyLCAlYSIsCi0gICAgMHgwNDEwMDAwMCwgMHgwYzEwMDAwMCwgImxkciVjJTIyJ2IgJTEyLTE1ciwgJWEiLAotICAgIDB4MDgwMDAwMDAsIDB4MGUxMDAwMDAsICJzdG0lYyUyMz9pZCUyND9iYSAlMTYtMTlyJTIyYCEsICVtIiwKLSAgICAweDA4MTAwMDAwLCAweDBlMTAwMDAwLCAibGRtJWMlMjM/aWQlMjQ/YmEgJTE2LTE5ciUyMmAhLCAlbSUyMideIiwKLSAgICAweDBhMDAwMDAwLCAweDBlMDAwMDAwLCAiYiVjJTI0J2wgJWIiLAotICAgIDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsICJzd2klYyAlMC0yM3giLAotICAgIC8qIEZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIDB4MGUwMDAxMDAsIDB4MGZmMDhmMTAsICJhZGYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUxMDAxMDAsIDB4MGZmMDhmMTAsICJtdWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUyMDAxMDAsIDB4MGZmMDhmMTAsICJzdWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUzMDAxMDAsIDB4MGZmMDhmMTAsICJyc2YlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU0MDAxMDAsIDB4MGZmMDhmMTAsICJkdmYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU1MDAxMDAsIDB4MGZmMDhmMTAsICJyZGYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU2MDAxMDAsIDB4MGZmMDhmMTAsICJwb3clYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU3MDAxMDAsIDB4MGZmMDhmMTAsICJycHclYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU4MDAxMDAsIDB4MGZmMDhmMTAsICJybWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU5MDAxMDAsIDB4MGZmMDhmMTAsICJmbWwlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVhMDAxMDAsIDB4MGZmMDhmMTAsICJmZHYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGViMDAxMDAsIDB4MGZmMDhmMTAsICJmcmQlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVjMDAxMDAsIDB4MGZmMDhmMTAsICJwb2wlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUwMDgxMDAsIDB4MGZmMDhmMTAsICJtdmYlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUxMDgxMDAsIDB4MGZmMDhmMTAsICJtbmYlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUyMDgxMDAsIDB4MGZmMDhmMTAsICJhYnMlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUzMDgxMDAsIDB4MGZmMDhmMTAsICJybmQlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU0MDgxMDAsIDB4MGZmMDhmMTAsICJzcXQlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU1MDgxMDAsIDB4MGZmMDhmMTAsICJsb2clYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU2MDgxMDAsIDB4MGZmMDhmMTAsICJsZ24lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU3MDgxMDAsIDB4MGZmMDhmMTAsICJleHAlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU4MDgxMDAsIDB4MGZmMDhmMTAsICJzaW4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU5MDgxMDAsIDB4MGZmMDhmMTAsICJjb3MlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVhMDgxMDAsIDB4MGZmMDhmMTAsICJ0YW4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGViMDgxMDAsIDB4MGZmMDhmMTAsICJhc24lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVjMDgxMDAsIDB4MGZmMDhmMTAsICJhY3MlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVkMDgxMDAsIDB4MGZmMDhmMTAsICJhdG4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUwMDAxMTAsIDB4MGZmMDBmMWYsICJmbHQlYyVQJVIgJTE2LTE4ZiwgJTEyLTE1ciIsCi0gICAgMHgwZTEwMDExMCwgMHgwZmZmMGY5OCwgImZpeCVjJVIgJTEyLTE1ciwgJTAtMmYiLAotICAgIDB4MGUyMDAxMTAsIDB4MGZmZjBmZmYsICJ3ZnMlYyAlMTItMTVyIiwKLSAgICAweDBlMzAwMTEwLCAweDBmZmYwZmZmLCAicmZzJWMgJTEyLTE1ciIsCi0gICAgMHgwZTQwMDExMCwgMHgwZmZmMGZmZiwgIndmYyVjICUxMi0xNXIiLAotICAgIDB4MGU1MDAxMTAsIDB4MGZmZjBmZmYsICJyZmMlYyAlMTItMTVyIiwKLSAgICAweDBlOTBmMTEwLCAweDBmZjhmZmYwLCAiY21mJWMgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGViMGYxMTAsIDB4MGZmOGZmZjAsICJjbmYlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWQwZjExMCwgMHgwZmY4ZmZmMCwgImNtZmUlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWYwZjExMCwgMHgwZmY4ZmZmMCwgImNuZmUlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwYzAwMDEwMCwgMHgwZTEwMGYwMCwgInN0ZiVjJVEgJTEyLTE0ZiwgJUEiLAotICAgIDB4MGMxMDAxMDAsIDB4MGUxMDBmMDAsICJsZGYlYyVRICUxMi0xNGYsICVBIiwKLSAgICAvKiBHZW5lcmljIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIDB4MGUwMDAwMDAsIDB4MGYwMDAwMTAsICJjZHAlYyAlOC0xMWQsICUyMC0yM2QsIGNyJTEyLTE1ZCwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9IiwKLSAgICAweDBlMDAwMDEwLCAweDBmMTAwMDEwLCAibXJjJWMgJTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0iLAotICAgIDB4MGUxMDAwMTAsIDB4MGYxMDAwMTAsICJtY3IlYyAlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSIsCi0gICAgMHgwYzAwMDAwMCwgMHgwZTEwMDAwMCwgInN0YyVjJTIyYGwgJTgtMTFkLCBjciUxMi0xNWQsICVBIiwKLSAgICAweDBjMTAwMDAwLCAweDBlMTAwMDAwLCAibGRjJWMlMjJgbCAlOC0xMWQsIGNyJTEyLTE1ZCwgJUEiLAotICAgIC8qIHRoZSByZXN0ICovCi0gICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgiLAotfTsKLSNkZWZpbmUgTl9PUENPREVTCShzaXplb2Ygb3Bjb2RlcyAvIHNpemVvZiBvcGNvZGVzWzBdKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvY2dlbi5oIGIvaW5jbHVkZS9vcGNvZGUvY2dlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVmZDBkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2NnZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzODYgKzAsMCBAQAotLyogSGVhZGVyIGZpbGUgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIsIGFuZCB0aGUgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIENHRU5fSAotI2RlZmluZSBDR0VOX0gKLQotLyogPz8/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/PyBEb2Vzbid0IGhhbmRsZSBpbnNucyBhZGRlZCBhdCBydW50aW1lLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX09QRVJBTkRTKGluc24pICgoaW5zbiktPm9waW5zdCkKLQotLyogUmV0dXJuIElOU04ncyBvcGNvZGUgdGFibGUgZW50cnkuICAqLwotI2RlZmluZSBDR0VOX0lOU05fT1BDT0RFKGluc24pICgoaW5zbiktPm9wY29kZSkKLQotLyogUmV0dXJuIElOU04ncyBoYW5kbGVyIGRhdGEuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSEFORExFUlMoaW5zbikgQ0dFTl9PUENPREVfSEFORExFUlMgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gSU5TTidzIHN5bnRheC4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9TWU5UQVgoaW5zbikgQ0dFTl9PUENPREVfU1lOVEFYIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIHNpemUgb2YgYmFzZSBtYXNrIGluIGJpdHMuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTUFTS19CSVRTSVpFKGluc24pIFwKLSAgQ0dFTl9PUENPREVfTUFTS19CSVRTSVpFIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIG1hc2sgb2YgYmFzZSBwYXJ0IG9mIElOU04uICAqLwotI2RlZmluZSBDR0VOX0lOU05fQkFTRV9NQVNLKGluc24pIFwKLSAgQ0dFTl9PUENPREVfQkFTRV9NQVNLIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIHZhbHVlIG9mIGJhc2UgcGFydCBvZiBJTlNOLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0JBU0VfVkFMVUUoaW5zbikgXAotICBDR0VOX09QQ09ERV9CQVNFX1ZBTFVFIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogU3RhbmRhcmQgd2F5IHRvIHRlc3Qgd2hldGhlciBJTlNOIGlzIHN1cHBvcnRlZCBieSBNQUNILgotICAgTUFDSCBpcyBvbmUgb2YgZW51bSBtYWNoX2F0dHIuCi0gICBUaGUgInwxIiBpcyBiZWNhdXNlIHRoZSBiYXNlIG1hY2ggaXMgYWx3YXlzIHNlbGVjdGVkLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX01BQ0hfSEFTX1AoaW5zbiwgbWFjaCkgXAotKChDR0VOX0lOU05fQVRUUl9WQUxVRSAoKGluc24pLCBDR0VOX0lOU05fTUFDSCkgJiAoKDEgPDwgKG1hY2gpKSB8IDEpKSAhPSAwKQotDAotLyogTWFjcm8gaW5zdHJ1Y3Rpb25zLgotICAgTWFjcm8gaW5zbnMgYXJlbid0IHJlYWwgaW5zbnMsIHRoZXkgbWFwIHRvIG9uZSBvciBtb3JlIHJlYWwgaW5zbnMuCi0gICBFLmcuIEFuIGFyY2hpdGVjdHVyZSdzICJub3AiIGluc24gbWF5IGFjdHVhbGx5IGJlIGFuICJtdiByMCxyMCIgb3IKLSAgIHNvbWUgc3VjaC4KLQotICAgTWFjcm8gaW5zbnMgY2FuIGV4cGFuZCB0byBub3RoaW5nIChlLmcuIGEgbm9wIHRoYXQgaXMgb3B0aW1pemVkIGF3YXkpLgotICAgVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktaW5zbiBtYWNyb3MgdGhhdCBidWlsZCBhIGNvbnN0YW50IGluIGEgcmVnaXN0ZXIuCi0gICBPZiBjb3Vyc2UgdGhpcyBpc24ndCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgYW5kIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkLgotCi0gICBBc3NlbWJseSBvZiBtYWNyby1pbnNucyBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZC4gIERpc2Fzc2VtYmx5IGlzbid0LgotICAgSG93ZXZlciwgZGlzYXNzZW1ibHkgb2YgYXQgbGVhc3Qgc29tZSBraW5kcyBvZiBtYWNybyBpbnNucyBpcyBpbXBvcnRhbnQKLSAgIGluIG9yZGVyIHRoYXQgdGhlIGRpc2Fzc2VtYmxlZCBjb2RlIHByZXNlcnZlIHRoZSByZWFkYWJpbGl0eSBvZiB0aGUgb3JpZ2luYWwKLSAgIGluc24uICBXaGF0IGlzIGF0dGVtcHRlZCBoZXJlIGlzIHRvIGRpc2Fzc2VtYmxlIGFsbCAic2ltcGxlIiBtYWNyby1pbnNucywKLSAgIHdoZXJlICJzaW1wbGUiIGlzIGN1cnJlbnRseSBkZWZpbmVkIHRvIG1lYW4gImV4cGFuZHMgdG8gb25lIHJlYWwgaW5zbiIuCi0KLSAgIFNpbXBsZSBtYWNyby1pbnNucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkuICBUaGV5IGFyZSBlbWl0dGVkIGFzIEFMSUFTJ3MKLSAgIG9mIHJlYWwgaW5zbnMuICBUaGlzIHNpbXBsaWZpZXMgdGhlaXIgaGFuZGxpbmcgc2luY2UgdGhlcmUncyB1c3VhbGx5IG1vcmUKLSAgIG9mIHRoZW0gdGhhbiBhbnkgb3RoZXIga2luZCBvZiBtYWNyby1pbnNuLCBhbmQgcHJvcGVyIGRpc2Fzc2VtYmx5IG9mIHRoZW0KLSAgIGZhbGxzIG91dCBmb3IgZnJlZS4gICovCi0KLS8qIEZvciBlYWNoIG1hY3JvLWluc24gdGhlcmUgbWF5IGJlIG11bHRpcGxlIGV4cGFuc2lvbiBwb3NzaWJpbGl0aWVzLAotICAgZGVwZW5kaW5nIG9uIHRoZSBhcmd1bWVudHMuICBUaGlzIHN0cnVjdHVyZSBpcyBhY2Nlc3NlZCB2aWEgdGhlIGBkYXRhJwotICAgbWVtYmVyIG9mIENHRU5fSU5TTi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fbWluc25fZXhwYW5zaW9uIHsKLSAgLyogRnVuY3Rpb24gdG8gZG8gdGhlIGV4cGFuc2lvbi4KLSAgICAgSWYgdGhlIGV4cGFuc2lvbiBmYWlscyAoZS5nLiAibm8gbWF0Y2giKSBOVUxMIGlzIHJldHVybmVkLgotICAgICBTcGFjZSBmb3IgdGhlIGV4cGFuc2lvbiBpcyBvYnRhaW5lZCB3aXRoIG1hbGxvYy4KLSAgICAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmcmVlIGl0LiAgKi8KLSAgY29uc3QgY2hhciAqICgqIGZuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgY2dlbl9taW5zbl9leHBhbnNpb24gKiwKLQkJCSAgICAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGludCAqLAotCQkJICAgICAgIENHRU5fT1BFUkFORCAqKikpOwotI2RlZmluZSBDR0VOX01JRVhQTl9GTihleCkgKChleCktPmZuKQotCi0gIC8qIEluc3RydWN0aW9uKHMpIHRoZSBtYWNybyBleHBhbmRzIHRvLgotICAgICBUaGUgZm9ybWF0IG9mIFNUUiBpcyBkZWZpbmVkIGJ5IEZOLgotICAgICBJdCBpcyB0eXBpY2FsbHkgdGhlIGFzc2VtYmx5IGNvZGUgb2YgdGhlIHJlYWwgaW5zbiwgYnV0IGl0IGNvdWxkIGFsc28gYmUKLSAgICAgdGhlIG9yaWdpbmFsIFNjaGVtZSBleHByZXNzaW9uIG9yIGEgdG9rZW5pemVkIGZvcm0gb2YgaXQgKHdpdGggRk4gYmVpbmcKLSAgICAgYW4gYXBwcm9wcmlhdGUgaW50ZXJwcmV0ZXIpLiAgKi8KLSAgY29uc3QgY2hhciAqIHN0cjsKLSNkZWZpbmUgQ0dFTl9NSUVYUE5fU1RSKGV4KSAoKGV4KS0+c3RyKQotfSBDR0VOX01JTlNOX0VYUEFOU0lPTjsKLQotLyogTm9ybWFsIGV4cGFuZGVyLgotICAgV2hlbiBzdXBwb3J0ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IHRoZSBpbnB1dCBzdHJpbmcgdG8gYW5vdGhlcgotICAgc3RyaW5nIGFuZCB0aGUgcGFyc2VyIHdpbGwgYmUgaW52b2tlZCByZWN1cnNpdmVseS4gIFRoZSBvdXRwdXQgc3RyaW5nCi0gICBtYXkgY29udGFpbiBmdXJ0aGVyIG1hY3JvIGludm9jYXRpb25zLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjZ2VuX2V4cGFuZF9tYWNyb19pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IHN0cnVjdCBjZ2VuX21pbnNuX2V4cGFuc2lvbiAqLAotCSAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgaW50ICosIENHRU5fT1BFUkFORCAqKikpOwotDAotLyogVGhlIGFzc2VtYmxlciBpbnNuIHRhYmxlIGlzIGhhc2hlZCBiYXNlZCBvbiBzb21lIGZ1bmN0aW9uIG9mIHRoZSBtbmVtb25pYwotICAgKHRoZSBhY3R1YWxseSBoYXNoaW5nIGRvbmUgaXMgdXAgdG8gdGhlIHRhcmdldCwgYnV0IHdlIHByb3ZpZGUgYSBmZXcKLSAgIGV4YW1wbGVzIGxpa2UgdGhlIGZpcnN0IGxldHRlciBvciBhIGZ1bmN0aW9uIG9mIHRoZSBlbnRpcmUgbW5lbW9uaWMpLiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9MSVNUICogY2dlbl9hc21fbG9va3VwX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKSk7Ci0jZGVmaW5lIENHRU5fQVNNX0xPT0tVUF9JTlNOKGNkLCBzdHJpbmcpIGNnZW5fYXNtX2xvb2t1cF9pbnNuICgoY2QpLCAoc3RyaW5nKSkKLSNkZWZpbmUgQ0dFTl9BU01fTkVYVF9JTlNOKGluc24pICgoaW5zbiktPm5leHQpCi0KLS8qIFRoZSBkaXNhc3NlbWJsZXIgaW5zbiB0YWJsZSBpcyBoYXNoZWQgYmFzZWQgb24gc29tZSBmdW5jdGlvbiBvZiBtYWNoaW5lCi0gICBpbnN0cnVjdGlvbiAodGhlIGFjdHVhbGx5IGhhc2hpbmcgZG9uZSBpcyB1cCB0byB0aGUgdGFyZ2V0KS4gICovCi0KLWV4dGVybiBDR0VOX0lOU05fTElTVCAqIGNnZW5fZGlzX2xvb2t1cF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOwotLyogRklYTUU6IGRlbGV0ZSB0aGVzZSB0d28gKi8KLSNkZWZpbmUgQ0dFTl9ESVNfTE9PS1VQX0lOU04oY2QsIGJ1ZiwgdmFsdWUpIGNnZW5fZGlzX2xvb2t1cF9pbnNuICgoY2QpLCAoYnVmKSwgKHZhbHVlKSkKLSNkZWZpbmUgQ0dFTl9ESVNfTkVYVF9JTlNOKGluc24pICgoaW5zbiktPm5leHQpCi0MCi0vKiBUaGUgQ1BVIGRlc2NyaXB0aW9uLgotICAgQSBjb3B5IG9mIHRoaXMgaXMgY3JlYXRlZCB3aGVuIHRoZSBjcHUgdGFibGUgaXMgIm9wZW5lZCIuCi0gICBBbGwgZ2xvYmFsIHN0YXRlIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGhlcmUuCi0gICBBY2Nlc3MgbWFjcm9zIGFyZSBwcm92aWRlZCBmb3IgInB1YmxpYyIgbWVtYmVycy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fY3B1X2Rlc2MKLXsKLSAgLyogQml0bWFwIG9mIHNlbGVjdGVkIG1hY2hpbmUocykgKGEgbGEgQkZEIG1hY2hpbmUgbnVtYmVyKS4gICovCi0gIGludCBtYWNoczsKLQotICAvKiBCaXRtYXAgb2Ygc2VsZWN0ZWQgaXNhKHMpLgotICAgICA/Pz8gU2ltdWx0YW5lb3VzIG11bHRpcGxlIGlzYXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UsIGJ1dCBpdCdzIG5vdCAoeWV0KQotICAgICBwcmVjbHVkZWQuICAqLwotICBpbnQgaXNhczsKLQotICAvKiBDdXJyZW50IGVuZGlhbi4gICovCi0gIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuOwotI2RlZmluZSBDR0VOX0NQVV9FTkRJQU4oY2QpICgoY2QpLT5lbmRpYW4pCi0KLSAgLyogQ3VycmVudCBpbnNuIGVuZGlhbi4gICovCi0gIGVudW0gY2dlbl9lbmRpYW4gaW5zbl9lbmRpYW47Ci0jZGVmaW5lIENHRU5fQ1BVX0lOU05fRU5ESUFOKGNkKSAoKGNkKS0+aW5zbl9lbmRpYW4pCi0KLSAgLyogV29yZCBzaXplIChpbiBiaXRzKS4gICovCi0gIC8qID8/PyBPciBtYXliZSBtYXhpbXVtIHdvcmQgc2l6ZSAtIG1pZ2h0IHdlIGV2ZXIgbmVlZCB0byBhbGxvdyBhIGNwdSB0YWJsZQotICAgICB0byBiZSBvcGVuZWQgZm9yIGJvdGggc3BhcmMzMi9zcGFyYzY0PwotICAgICA/Pz8gQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyB0byBjcmVhdGUgYSB0YWJsZSBvZiBzZWxlY3RlZCBtYWNocyBhbmQKLSAgICAgbGF6aWx5IGZldGNoIHRoZSBkYXRhIGZyb20gdGhlcmUuICAqLwotICB1bnNpZ25lZCBpbnQgd29yZF9iaXRzaXplOwotCi0gIC8qIEluZGljYXRvciBpZiBzaXplcyBhcmUgdW5rbm93bi4KLSAgICAgVGhpcyBpcyB1c2VkIGJ5IGRlZmF1bHRfaW5zbl9iaXRzaXplLGJhc2VfaW5zbl9iaXRzaXplIGlmIHRoZXJlIGlzIGEKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzZWxlY3RlZCBpc2Ency4gICovCi0jZGVmaW5lIENHRU5fU0laRV9VTktOT1dOIDY1NTM1Ci0KLSAgLyogRGVmYXVsdCBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4KLSAgICAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgd2hlbiBpdCBlbmNvdW50ZXJzIGFuIHVua25vd24gaW5zbi4gICovCi0gIHVuc2lnbmVkIGludCBkZWZhdWx0X2luc25fYml0c2l6ZTsKLQotICAvKiBCYXNlIGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgotICAgICBGb3Igbm9uLUxJVyBjcHVzIHRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBsZW5ndGggb2YgdGhlIHNtYWxsZXN0IGluc24uCi0gICAgIEZvciBMSVcgY3B1cyBpdHMgd2lwICh3b3JrLWluLXByb2dyZXNzKS4gIEZvciB0aGUgbTMyciBpdHMgMzIuICAqLwotICB1bnNpZ25lZCBpbnQgYmFzZV9pbnNuX2JpdHNpemU7Ci0KLSAgLyogTWluaW11bS9tYXhpbXVtIGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLiAgKi8KLSAgdW5zaWduZWQgaW50IG1pbl9pbnNuX2JpdHNpemU7Ci0gIHVuc2lnbmVkIGludCBtYXhfaW5zbl9iaXRzaXplOwotCi0gIC8qIEluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi0gIGNvbnN0IENHRU5fSVNBICppc2FfdGFibGU7Ci0KLSAgLyogTWFjaGluZSB2YXJpYW50cy4gICovCi0gIGNvbnN0IENHRU5fTUFDSCAqbWFjaF90YWJsZTsKLQotICAvKiBIYXJkd2FyZSBlbGVtZW50cy4gICovCi0gIENHRU5fSFdfVEFCTEUgaHdfdGFibGU7Ci0KLSAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8KLSAgY29uc3QgQ0dFTl9JRkxEICppZmxkX3RhYmxlOwotCi0gIC8qIE9wZXJhbmRzLiAgKi8KLSAgQ0dFTl9PUEVSQU5EX1RBQkxFIG9wZXJhbmRfdGFibGU7Ci0KLSAgLyogTWFpbiBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0gIENHRU5fSU5TTl9UQUJMRSBpbnNuX3RhYmxlOwotI2RlZmluZSBDR0VOX0NQVV9JTlNOX1RBQkxFKGNkKSAoJiAoY2QpLT5pbnNuX3RhYmxlKQotCi0gIC8qIE1hY3JvIGluc3RydWN0aW9ucyBhcmUgZGVmaW5lZCBzZXBhcmF0ZWx5IGFuZCBhcmUgY29tYmluZWQgd2l0aCByZWFsCi0gICAgIGluc25zIGR1cmluZyBoYXNoIHRhYmxlIGNvbXB1dGF0aW9uLiAgKi8KLSAgQ0dFTl9JTlNOX1RBQkxFIG1hY3JvX2luc25fdGFibGU7Ci0KLSAgLyogQ29weSBvZiBDR0VOX0lOVF9JTlNOX1AuICAqLwotICBpbnQgaW50X2luc25fcDsKLQotICAvKiBDYWxsZWQgdG8gcmVidWlsZCB0aGUgdGFibGVzIGFmdGVyIHNvbWV0aGluZyBoYXMgY2hhbmdlZC4gICovCi0gIHZvaWQgKCpyZWJ1aWxkX3RhYmxlcykgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0gIC8qIE9wZXJhbmQgcGFyc2VyIGNhbGxiYWNrLiAgKi8KLSAgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuICogcGFyc2Vfb3BlcmFuZF9mbjsKLQotICAvKiBQYXJzZS9pbnNlcnQvZXh0cmFjdC9wcmludCBjb3ZlciBmbnMgZm9yIG9wZXJhbmRzLiAgKi8KLSAgY29uc3QgY2hhciAqICgqcGFyc2Vfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBjb25zdCBjaGFyICoqLAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0jaWZkZWYgQkZEX1ZFUlNJT04KLSAgY29uc3QgY2hhciAqICgqaW5zZXJ0X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sCi0JICAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgYmZkX3ZtYSBwY18pKTsKLSAgaW50ICgqZXh0cmFjdF9vcGVyYW5kKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIENHRU5fRVhUUkFDVF9JTkZPICosIENHRU5fSU5TTl9JTlQsCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgcGNfKSk7Ci0gIHZvaWQgKCpwcmludF9vcGVyYW5kKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIFBUUiBpbmZvXywgQ0dFTl9GSUVMRFMgKiBmaWVsZHNfLAotCSAgICAgIHZvaWQgY29uc3QgKmF0dHJzXywgYmZkX3ZtYSBwY18sIGludCBsZW5ndGhfKSk7Ci0jZWxzZQotICBjb25zdCBjaGFyICogKCppbnNlcnRfb3BlcmFuZCkgKCk7Ci0gIGludCAoKmV4dHJhY3Rfb3BlcmFuZCkgKCk7Ci0gIHZvaWQgKCpwcmludF9vcGVyYW5kKSAoKTsKLSNlbmRpZgotI2RlZmluZSBDR0VOX0NQVV9QQVJTRV9PUEVSQU5EKGNkKSAoKGNkKS0+cGFyc2Vfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfSU5TRVJUX09QRVJBTkQoY2QpICgoY2QpLT5pbnNlcnRfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfRVhUUkFDVF9PUEVSQU5EKGNkKSAoKGNkKS0+ZXh0cmFjdF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9QUklOVF9PUEVSQU5EKGNkKSAoKGNkKS0+cHJpbnRfb3BlcmFuZCkKLQotICAvKiBTaXplIG9mIENHRU5fRklFTERTIHN0cnVjdC4gICovCi0gIHVuc2lnbmVkIGludCBzaXplb2ZfZmllbGRzOwotI2RlZmluZSBDR0VOX0NQVV9TSVpFT0ZfRklFTERTKGNkKSAoKGNkKS0+c2l6ZW9mX2ZpZWxkcykKLQotICAvKiBTZXQgdGhlIGJpdHNpemUgZmllbGQuICAqLwotICB2b2lkICgqc2V0X2ZpZWxkc19iaXRzaXplKSBQQVJBTVMgKChDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IHNpemVfKSk7Ci0jZGVmaW5lIENHRU5fQ1BVX1NFVF9GSUVMRFNfQklUU0laRShjZCkgKChjZCktPnNldF9maWVsZHNfYml0c2l6ZSkKLQotICAvKiBDR0VOX0ZJRUxEUyBhY2Nlc3NvcnMuICAqLwotICBpbnQgKCpnZXRfaW50X29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotICB2b2lkICgqc2V0X2ludF9vcGVyYW5kKQotICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGludCB2YWx1ZV8pKTsKLSNpZmRlZiBCRkRfVkVSU0lPTgotICBiZmRfdm1hICgqZ2V0X3ZtYV9vcGVyYW5kKQotICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgY29uc3QgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLSAgdm9pZCAoKnNldF92bWFfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIENHRU5fRklFTERTICpmaWVsZHNfLCBiZmRfdm1hIHZhbHVlXykpOwotI2Vsc2UKLSAgbG9uZyAoKmdldF92bWFfb3BlcmFuZCkgKCk7Ci0gIHZvaWQgKCpzZXRfdm1hX29wZXJhbmQpICgpOwotI2VuZGlmCi0jZGVmaW5lIENHRU5fQ1BVX0dFVF9JTlRfT1BFUkFORChjZCkgKChjZCktPmdldF9pbnRfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX0lOVF9PUEVSQU5EKGNkKSAoKGNkKS0+c2V0X2ludF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9HRVRfVk1BX09QRVJBTkQoY2QpICgoY2QpLT5nZXRfdm1hX29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX1NFVF9WTUFfT1BFUkFORChjZCkgKChjZCktPnNldF92bWFfb3BlcmFuZCkKLQotICAvKiBJbnN0cnVjdGlvbiBwYXJzZS9pbnNlcnQvZXh0cmFjdC9wcmludCBoYW5kbGVycy4gICovCi0gIC8qIEZJWE1FOiBtYWtlIHRoZXNlIHR5cGVzIHVwcGVyY2FzZS4gICovCi0gIGNnZW5fcGFyc2VfZm4gKiBjb25zdCAqcGFyc2VfaGFuZGxlcnM7Ci0gIGNnZW5faW5zZXJ0X2ZuICogY29uc3QgKmluc2VydF9oYW5kbGVyczsKLSAgY2dlbl9leHRyYWN0X2ZuICogY29uc3QgKmV4dHJhY3RfaGFuZGxlcnM7Ci0gIGNnZW5fcHJpbnRfZm4gKiBjb25zdCAqcHJpbnRfaGFuZGxlcnM7Ci0jZGVmaW5lIENHRU5fUEFSU0VfRk4oY2QsIGluc24pICAgKGNkLT5wYXJzZV9oYW5kbGVyc1soaW5zbiktPm9wY29kZS0+aGFuZGxlcnMucGFyc2VdKQotI2RlZmluZSBDR0VOX0lOU0VSVF9GTihjZCwgaW5zbikgIChjZC0+aW5zZXJ0X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5pbnNlcnRdKQotI2RlZmluZSBDR0VOX0VYVFJBQ1RfRk4oY2QsIGluc24pIChjZC0+ZXh0cmFjdF9oYW5kbGVyc1soaW5zbiktPm9wY29kZS0+aGFuZGxlcnMuZXh0cmFjdF0pCi0jZGVmaW5lIENHRU5fUFJJTlRfRk4oY2QsIGluc24pICAgKGNkLT5wcmludF9oYW5kbGVyc1soaW5zbiktPm9wY29kZS0+aGFuZGxlcnMucHJpbnRdKQotCi0gIC8qIFJldHVybiBub24temVybyBpZiBpbnNuIHNob3VsZCBiZSBhZGRlZCB0byBoYXNoIHRhYmxlLiAgKi8KLSAgaW50ICgqIGFzbV9oYXNoX3ApIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci0KLSAgLyogQXNzZW1ibGVyIGhhc2ggZnVuY3Rpb24uICAqLwotICB1bnNpZ25lZCBpbnQgKCogYXNtX2hhc2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGFzc2VtYmxlciBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IGFzbV9oYXNoX3NpemU7Ci0KLSAgLyogUmV0dXJuIG5vbi16ZXJvIGlmIGluc24gc2hvdWxkIGJlIGFkZGVkIHRvIGhhc2ggdGFibGUuICAqLwotICBpbnQgKCogZGlzX2hhc2hfcCkgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLQotICAvKiBEaXNhc3NlbWJsZXIgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCAoKiBkaXNfaGFzaCkgUEFSQU1TICgoY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0KLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gZGlzYXNzZW1ibGVyIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgZGlzX2hhc2hfc2l6ZTsKLQotICAvKiBBc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0gIENHRU5fSU5TTl9MSVNUICoqYXNtX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICphc21faGFzaF90YWJsZV9lbnRyaWVzOwotCi0gIC8qIERpc2Fzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX0xJU1QgKipkaXNfaGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmRpc19oYXNoX3RhYmxlX2VudHJpZXM7Ci19IENHRU5fQ1BVX1RBQkxFOwotCi0vKiB3aXAgKi8KLSNpZm5kZWYgQ0dFTl9XT1JEX0VORElBTgotI2RlZmluZSBDR0VOX1dPUkRfRU5ESUFOKGNkKSBDR0VOX0NQVV9FTkRJQU4gKGNkKQotI2VuZGlmCi0jaWZuZGVmIENHRU5fSU5TTl9XT1JEX0VORElBTgotI2RlZmluZSBDR0VOX0lOU05fV09SRF9FTkRJQU4oY2QpIENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkKLSNlbmRpZgotDAotLyogUHJvdG90eXBlcyBvZiBtYWpvciBmdW5jdGlvbnMuICAqLwotLyogRklYTUU6IE1vdmUgbW9yZSBDR0VOX1NZTS1kZWZpbmVkIGZ1bmN0aW9ucyBpbnRvIENHRU5fQ1BVX0RFU0MuCi0gICBOb3QgdGhlIGluaXQgZm5zIHRob3VnaCwgYXMgdGhhdCB3b3VsZCBkcmFnIGluIHRoaW5ncyB0aGF0IG1pZ2h0bid0IGJlCi0gICB1c2VkIGFuZCBtaWdodCBub3QgZXZlbiBleGlzdC4gICovCi0KLS8qIEFyZ3VtZW50IHR5cGVzIHRvIGNwdV9vcGVuLiAgKi8KLQotZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyB7Ci0gIENHRU5fQ1BVX09QRU5fRU5ELAotICAvKiBTZWxlY3QgaW5zdHJ1Y3Rpb24gc2V0KHMpLCBhcmcgaXMgYml0bWFwIG9yIDAgbWVhbmluZyAidW5zcGVjaWZpZWQiLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9JU0FTLAotICAvKiBTZWxlY3QgbWFjaGluZShzKSwgYXJnIGlzIGJpdG1hcCBvciAwIG1lYW5pbmcgInVuc3BlY2lmaWVkIi4gICovCi0gIENHRU5fQ1BVX09QRU5fTUFDSFMsCi0gIC8qIFNlbGVjdCBtYWNoaW5lLCBhcmcgaXMgbWFjaCdzIGJmZCBuYW1lLgotICAgICBNdWx0aXBsZSBtYWNoaW5lcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHJlcGVhdGVkIHVzZS4gICovCi0gIENHRU5fQ1BVX09QRU5fQkZETUFDSCwKLSAgLyogU2VsZWN0IGVuZGlhbiwgYXJnIGlzIENHRU5fRU5ESUFOXyouICAqLwotICBDR0VOX0NQVV9PUEVOX0VORElBTgotfTsKLQotLyogT3BlbiBhIGNwdSBkZXNjcmlwdG9yIHRhYmxlIGZvciB1c2UuCi0gICA/Pz8gV2Ugb25seSBzdXBwb3J0IElTTyBDIHN0ZGFyZ3MgaGVyZSwgbm90IEsmUi4KLSAgIExhemluZXNzLCBwbHVzIGV4cGVyaW1lbnQgdG8gc2VlIGlmIGFueXRoaW5nIHJlcXVpcmVzIEsmUiAtIGV2ZW50dWFsbHkKLSAgIEsmUiB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgLSBlLmcuIEdEQiBpcyBjdXJyZW50bHkgdHJ5aW5nIHRoaXMuICAqLwotCi1leHRlcm4gQ0dFTl9DUFVfREVTQyBDR0VOX1NZTSAoY3B1X29wZW4pIChlbnVtIGNnZW5fY3B1X29wZW5fYXJnLCAuLi4pOwotCi0vKiBDb3ZlciBmbiB0byBoYW5kbGUgc2ltcGxlIGNhc2UuICAqLwotCi1leHRlcm4gQ0dFTl9DUFVfREVTQyBDR0VOX1NZTSAoY3B1X29wZW5fMSkgUEFSQU1TICgoY29uc3QgY2hhciAqbWFjaF9uYW1lXywKLQkJCQkJCSAgICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbl8pKTsKLQotLyogQ2xvc2UgaXQuICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoY3B1X2Nsb3NlKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLS8qIEluaXRpYWxpemUgdGhlIG9wY29kZSB0YWJsZSBmb3IgdXNlLgotICAgQ2FsbGVkIGJ5IGluaXRfYXNtL2luaXRfZGlzLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfb3Bjb2RlX3RhYmxlKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDIGNkXykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBpYmxkIHRhYmxlIGZvciB1c2UuCi0gICBDYWxsZWQgYnkgaW5pdF9hc20vaW5pdF9kaXMuICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9pYmxkX3RhYmxlKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDIGNkXykpOwotCi0vKiBJbml0aWFsaXplIGFuIGNwdSB0YWJsZSBmb3IgYXNzZW1ibGVyIG9yIGRpc2Fzc2VtYmxlciB1c2UuCi0gICBUaGVzZSBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBjcHVfb3Blbi4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X2FzbSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfZGlzKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLS8qIEluaXRpYWxpemUgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgZm9yIHVzZS4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X29waW5zdF90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogQXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1leHRlcm4gY29uc3QgQ0dFTl9JTlNOICogQ0dFTl9TWU0gKGFzc2VtYmxlX2luc24pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiwgQ0dFTl9GSUVMRFMgKiwKLQkgICAgICBDR0VOX0lOU05fQllURVNfUFRSLCBjaGFyICoqKSk7Ci0KLWV4dGVybiBjb25zdCBDR0VOX0tFWVdPUkQgQ0dFTl9TWU0gKG9wZXJhbmRfbWFjaCk7Ci1leHRlcm4gaW50IENHRU5fU1lNIChnZXRfbWFjaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIE9wZXJhbmQgaW5kZXggY29tcHV0YXRpb24uICAqLwotZXh0ZXJuIGNvbnN0IENHRU5fSU5TTiAqIGNnZW5fbG9va3VwX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICogaW5zbl8sCi0JICAgICAgQ0dFTl9JTlNOX0lOVCBpbnRfdmFsdWVfLCB1bnNpZ25lZCBjaGFyICpieXRlc192YWx1ZV8sCi0JICAgICAgaW50IGxlbmd0aF8sIENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgYWxpYXNfcF8pKTsKLWV4dGVybiB2b2lkIGNnZW5fZ2V0X2luc25fb3BlcmFuZHMKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICogaW5zbl8sCi0JICAgICAgY29uc3QgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGludCAqaW5kaWNlc18pKTsKLWV4dGVybiBjb25zdCBDR0VOX0lOU04gKiBjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIENHRU5fSU5TTl9JTlQgaW50X3ZhbHVlXywgdW5zaWduZWQgY2hhciAqYnl0ZXNfdmFsdWVfLAotCSAgICAgIGludCBsZW5ndGhfLCBpbnQgKmluZGljZXNfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotCi0vKiBDb3ZlciBmbnMgdG8gYmZkX2dldC9zZXQuICAqLwotCi1leHRlcm4gQ0dFTl9JTlNOX0lOVCBjZ2VuX2dldF9pbnNuX3ZhbHVlCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBjZ2VuX3B1dF9pbnNuX3ZhbHVlCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIHVuc2lnbmVkIGNoYXIgKiwgaW50LCBDR0VOX0lOU05fSU5UKSk7Ci0KLS8qIFJlYWQgaW4gYSBjcHUgZGVzY3JpcHRpb24gZmlsZS4KLSAgID8/PyBGb3IgZnV0dXJlIGNvbmNlcm5zLCBpbmNsdWRpbmcgYWRkaW5nIGluc3RydWN0aW9ucyB0byB0aGUgYXNzZW1ibGVyLwotICAgZGlzYXNzZW1ibGVyIGF0IHJ1bi10aW1lLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjZ2VuX3JlYWRfY3B1X2ZpbGUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqIGZpbGVuYW1lXykpOwotCi0jZW5kaWYgLyogQ0dFTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9jb252ZXguaCBiL2luY2x1ZGUvb3Bjb2RlL2NvbnZleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFlZWJiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2NvbnZleC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcxMSArMCwwIEBACi0vKiBJbmZvcm1hdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gZGlzYXNzZW1ibHkgb24gdGhlIENvbnZleC4KLSAgIENvcHlyaWdodCAxOTg5LCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYJQ09OU1QKLSNkZWZpbmUJQ09OU1QKLSNlbmRpZgkvKiBDT05TVCAqLwotCi0jZGVmaW5lIHh4eCAwCi0jZGVmaW5lIHJyciAxCi0jZGVmaW5lIHJyIDIKLSNkZWZpbmUgcnhyIDMKLSNkZWZpbmUgciA0Ci0jZGVmaW5lIG5vcHMgNQotI2RlZmluZSBuciA2Ci0jZGVmaW5lIHBjcmVsIDcKLSNkZWZpbmUgbHIgOAotI2RlZmluZSByeGwgOQotI2RlZmluZSBybHIgMTAKLSNkZWZpbmUgcnJsIDExCi0jZGVmaW5lIGltbCAxMgotI2RlZmluZSBpbXIgMTMKLSNkZWZpbmUgYTFyIDE0Ci0jZGVmaW5lIGExbCAxNQotI2RlZmluZSBhMnIgMTYKLSNkZWZpbmUgYTJsIDE3Ci0jZGVmaW5lIGEzIDE4Ci0jZGVmaW5lIGE0IDE5Ci0jZGVmaW5lIGE1IDIwCi0jZGVmaW5lIFYgMQotI2RlZmluZSBTIDIKLSNkZWZpbmUgVk0gMwotI2RlZmluZSBBIDQKLSNkZWZpbmUgVkwgNQotI2RlZmluZSBWUyA2Ci0jZGVmaW5lIFZMUyA3Ci0jZGVmaW5lIFBTVyA4Ci0vKiBQcmV2ZW50IGFuIGVycm9yIGR1cmluZyAibWFrZSBkZXBlbmQiLiAgKi8KLSNpZiAhZGVmaW5lZCAoUEMpCi0jZGVmaW5lIFBDIDkKLSNlbmRpZgotI2RlZmluZSBJVFIgMTAKLSNkZWZpbmUgVlYgMTEKLSNkZWZpbmUgSVRTUiAxMgotI2RlZmluZSBUT0MgMTMKLSNkZWZpbmUgQ0lSIDE0Ci0jZGVmaW5lIFRUUiAxNQotI2RlZmluZSBWTVUgMTYKLSNkZWZpbmUgVk1MIDE3Ci0jZGVmaW5lIElDUiAxOAotI2RlZmluZSBUQ1BVIDE5Ci0jZGVmaW5lIENQVUlEIDIwCi0jZGVmaW5lIFRJRCAyMQotCi1DT05TVCBjaGFyICpvcFtdID0gewotICAiIiwKLSAgInYwXDB2MVwwdjJcMHYzXDB2NFwwdjVcMHY2XDB2NyIsCi0gICJzMFwwczFcMHMyXDBzM1wwczRcMHM1XDBzNlwwczciLAotICAidm0iLAotICAic3BcMGExXDBhMlwwYTNcMGE0XDBhNVwwYXBcMGZwIiwKLSAgInZsIiwKLSAgInZzIiwKLSAgInZscyIsCi0gICJwc3ciLAotICAicGMiLAotICAiaXRyIiwKLSAgInZ2IiwKLSAgIml0c3IiLAotICAidG9jIiwKLSAgImNpciIsCi0gICJ0dHIiLAotICAidm11IiwKLSAgInZtbCIsCi0gICJpY3IiLAotICAidGNwdSIsCi0gICJjcHVpZCIsCi0gICJ0aWQiLAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MFtdID0gewotICB7MCwwLHJycixWLFMsU30sCS8qIG1vdiAqLwotICB7MCwwLHJycixTLFMsVn0sCS8qIG1vdiAqLwotICB7MSwxLHJycixWLFYsVn0sCS8qIG1lcmcudCAqLwotICB7MiwxLHJycixWLFYsVn0sCS8qIG1hc2sudCAqLwotICB7MSwyLHJycixWLFMsVn0sCS8qIG1lcmcuZiAqLwotICB7MiwyLHJycixWLFMsVn0sCS8qIG1hc2suZiAqLwotICB7MSwxLHJycixWLFMsVn0sCS8qIG1lcmcudCAqLwotICB7MiwxLHJycixWLFMsVn0sCS8qIG1hc2sudCAqLwotICB7MywzLHJycixWLFYsVn0sCS8qIG11bC5zICovCi0gIHszLDQscnJyLFYsVixWfSwJLyogbXVsLmQgKi8KLSAgezQsMyxycnIsVixWLFZ9LAkvKiBkaXYucyAqLwotICB7NCw0LHJycixWLFYsVn0sCS8qIGRpdi5kICovCi0gIHszLDMscnJyLFYsUyxWfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycnIsVixTLFZ9LAkvKiBtdWwuZCAqLwotICB7NCwzLHJycixWLFMsVn0sCS8qIGRpdi5zICovCi0gIHs0LDQscnJyLFYsUyxWfSwJLyogZGl2LmQgKi8KLSAgezUsMCxycnIsVixWLFZ9LAkvKiBhbmQgKi8KLSAgezYsMCxycnIsVixWLFZ9LAkvKiBvciAqLwotICB7NywwLHJycixWLFYsVn0sCS8qIHhvciAqLwotICB7OCwwLHJycixWLFYsVn0sCS8qIHNoZiAqLwotICB7NSwwLHJycixWLFMsVn0sCS8qIGFuZCAqLwotICB7NiwwLHJycixWLFMsVn0sCS8qIG9yICovCi0gIHs3LDAscnJyLFYsUyxWfSwJLyogeG9yICovCi0gIHs4LDAscnJyLFYsUyxWfSwJLyogc2hmICovCi0gIHs5LDMscnJyLFYsVixWfSwJLyogYWRkLnMgKi8KLSAgezksNCxycnIsVixWLFZ9LAkvKiBhZGQuZCAqLwotICB7MTAsMyxycnIsVixWLFZ9LAkvKiBzdWIucyAqLwotICB7MTAsNCxycnIsVixWLFZ9LAkvKiBzdWIuZCAqLwotICB7OSwzLHJycixWLFMsVn0sCS8qIGFkZC5zICovCi0gIHs5LDQscnJyLFYsUyxWfSwJLyogYWRkLmQgKi8KLSAgezEwLDMscnJyLFYsUyxWfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnJyLFYsUyxWfSwJLyogc3ViLmQgKi8KLSAgezksNSxycnIsVixWLFZ9LAkvKiBhZGQuYiAqLwotICB7OSw2LHJycixWLFYsVn0sCS8qIGFkZC5oICovCi0gIHs5LDcscnJyLFYsVixWfSwJLyogYWRkLncgKi8KLSAgezksOCxycnIsVixWLFZ9LAkvKiBhZGQubCAqLwotICB7OSw1LHJycixWLFMsVn0sCS8qIGFkZC5iICovCi0gIHs5LDYscnJyLFYsUyxWfSwJLyogYWRkLmggKi8KLSAgezksNyxycnIsVixTLFZ9LAkvKiBhZGQudyAqLwotICB7OSw4LHJycixWLFMsVn0sCS8qIGFkZC5sICovCi0gIHsxMCw1LHJycixWLFYsVn0sCS8qIHN1Yi5iICovCi0gIHsxMCw2LHJycixWLFYsVn0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LHJycixWLFYsVn0sCS8qIHN1Yi53ICovCi0gIHsxMCw4LHJycixWLFYsVn0sCS8qIHN1Yi5sICovCi0gIHsxMCw1LHJycixWLFMsVn0sCS8qIHN1Yi5iICovCi0gIHsxMCw2LHJycixWLFMsVn0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LHJycixWLFMsVn0sCS8qIHN1Yi53ICovCi0gIHsxMCw4LHJycixWLFMsVn0sCS8qIHN1Yi5sICovCi0gIHszLDUscnJyLFYsVixWfSwJLyogbXVsLmIgKi8KLSAgezMsNixycnIsVixWLFZ9LAkvKiBtdWwuaCAqLwotICB7Myw3LHJycixWLFYsVn0sCS8qIG11bC53ICovCi0gIHszLDgscnJyLFYsVixWfSwJLyogbXVsLmwgKi8KLSAgezMsNSxycnIsVixTLFZ9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJycixWLFMsVn0sCS8qIG11bC5oICovCi0gIHszLDcscnJyLFYsUyxWfSwJLyogbXVsLncgKi8KLSAgezMsOCxycnIsVixTLFZ9LAkvKiBtdWwubCAqLwotICB7NCw1LHJycixWLFYsVn0sCS8qIGRpdi5iICovCi0gIHs0LDYscnJyLFYsVixWfSwJLyogZGl2LmggKi8KLSAgezQsNyxycnIsVixWLFZ9LAkvKiBkaXYudyAqLwotICB7NCw4LHJycixWLFYsVn0sCS8qIGRpdi5sICovCi0gIHs0LDUscnJyLFYsUyxWfSwJLyogZGl2LmIgKi8KLSAgezQsNixycnIsVixTLFZ9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJycixWLFMsVn0sCS8qIGRpdi53ICovCi0gIHs0LDgscnJyLFYsUyxWfSwJLyogZGl2LmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDFbXSA9IHsKLSAgezExLDAseHh4LDAsMCwwfSwJLyogZXhpdCAqLwotICB7MTIsMCxhMywwLDAsMH0sCS8qIGptcCAqLwotICB7MTMsMixhMywwLDAsMH0sCS8qIGptcGkuZiAqLwotICB7MTMsMSxhMywwLDAsMH0sCS8qIGptcGkudCAqLwotICB7MTQsMixhMywwLDAsMH0sCS8qIGptcGEuZiAqLwotICB7MTQsMSxhMywwLDAsMH0sCS8qIGptcGEudCAqLwotICB7MTUsMixhMywwLDAsMH0sCS8qIGptcHMuZiAqLwotICB7MTUsMSxhMywwLDAsMH0sCS8qIGptcHMudCAqLwotICB7MTYsMCxhMywwLDAsMH0sCS8qIHRhYyAqLwotICB7MTcsMCxhMXIsQSwwLDB9LAkvKiBsZGVhICovCi0gIHsxOCw4LGExbCxWTFMsMCwwfSwJLyogbGQubCAqLwotICB7MTgsOSxhMWwsVk0sMCwwfSwJLyogbGQueCAqLwotICB7MTksMCxhMywwLDAsMH0sCS8qIHRhcyAqLwotICB7MjAsMCxhMywwLDAsMH0sCS8qIHBzaGVhICovCi0gIHsyMSw4LGEybCxWTFMsMCwwfSwJLyogc3QubCAqLwotICB7MjEsOSxhMmwsVk0sMCwwfSwJLyogc3QueCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MjIsMCxhMywwLDAsMH0sCS8qIGNhbGwgKi8KLSAgezIzLDAsYTMsMCwwLDB9LAkvKiBjYWxscyAqLwotICB7MjQsMCxhMywwLDAsMH0sCS8qIGNhbGxxICovCi0gIHsyNSwwLGExcixBLDAsMH0sCS8qIHBmb3JrICovCi0gIHsyNiw1LGEycixTLDAsMH0sCS8qIHN0ZS5iICovCi0gIHsyNiw2LGEycixTLDAsMH0sCS8qIHN0ZS5oICovCi0gIHsyNiw3LGEycixTLDAsMH0sCS8qIHN0ZS53ICovCi0gIHsyNiw4LGEycixTLDAsMH0sCS8qIHN0ZS5sICovCi0gIHsxOCw1LGExcixBLDAsMH0sCS8qIGxkLmIgKi8KLSAgezE4LDYsYTFyLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxhMXIsQSwwLDB9LAkvKiBsZC53ICovCi0gIHsyNyw3LGExcixBLDAsMH0sCS8qIGluY3IudyAqLwotICB7MjEsNSxhMnIsQSwwLDB9LAkvKiBzdC5iICovCi0gIHsyMSw2LGEycixBLDAsMH0sCS8qIHN0LmggKi8KLSAgezIxLDcsYTJyLEEsMCwwfSwJLyogc3QudyAqLwotICB7MjcsOCxhMXIsUywwLDB9LAkvKiBpbmNyLmwgKi8KLSAgezE4LDUsYTFyLFMsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsUywwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixTLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDgsYTFyLFMsMCwwfSwJLyogbGQubCAqLwotICB7MjEsNSxhMnIsUywwLDB9LAkvKiBzdC5iICovCi0gIHsyMSw2LGEycixTLDAsMH0sCS8qIHN0LmggKi8KLSAgezIxLDcsYTJyLFMsMCwwfSwJLyogc3QudyAqLwotICB7MjEsOCxhMnIsUywwLDB9LAkvKiBzdC5sICovCi0gIHsxOCw1LGExcixWLDAsMH0sCS8qIGxkLmIgKi8KLSAgezE4LDYsYTFyLFYsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxhMXIsViwwLDB9LAkvKiBsZC53ICovCi0gIHsxOCw4LGExcixWLDAsMH0sCS8qIGxkLmwgKi8KLSAgezIxLDUsYTJyLFYsMCwwfSwJLyogc3QuYiAqLwotICB7MjEsNixhMnIsViwwLDB9LAkvKiBzdC5oICovCi0gIHsyMSw3LGEycixWLDAsMH0sCS8qIHN0LncgKi8KLSAgezIxLDgsYTJyLFYsMCwwfSwJLyogc3QubCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MltdID0gewotICB7MjgsNSxycixBLEEsMH0sCS8qIGN2dHcuYiAqLwotICB7MjgsNixycixBLEEsMH0sCS8qIGN2dHcuaCAqLwotICB7MjksNyxycixBLEEsMH0sCS8qIGN2dGIudyAqLwotICB7MzAsNyxycixBLEEsMH0sCS8qIGN2dGgudyAqLwotICB7MjgsNSxycixTLFMsMH0sCS8qIGN2dHcuYiAqLwotICB7MjgsNixycixTLFMsMH0sCS8qIGN2dHcuaCAqLwotICB7MjksNyxycixTLFMsMH0sCS8qIGN2dGIudyAqLwotICB7MzAsNyxycixTLFMsMH0sCS8qIGN2dGgudyAqLwotICB7MjgsMyxycixTLFMsMH0sCS8qIGN2dHcucyAqLwotICB7MzEsNyxycixTLFMsMH0sCS8qIGN2dHMudyAqLwotICB7MzIsMyxycixTLFMsMH0sCS8qIGN2dGQucyAqLwotICB7MzEsNCxycixTLFMsMH0sCS8qIGN2dHMuZCAqLwotICB7MzEsOCxycixTLFMsMH0sCS8qIGN2dHMubCAqLwotICB7MzIsOCxycixTLFMsMH0sCS8qIGN2dGQubCAqLwotICB7MzMsMyxycixTLFMsMH0sCS8qIGN2dGwucyAqLwotICB7MzMsNCxycixTLFMsMH0sCS8qIGN2dGwuZCAqLwotICB7MzQsMCxycixBLEEsMH0sCS8qIGxkcGEgKi8KLSAgezgsMCxucixBLDAsMH0sCS8qIHNoZiAqLwotICB7MTgsNixucixBLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsbnIsQSwwLDB9LAkvKiBsZC53ICovCi0gIHszMyw3LHJyLFMsUywwfSwJLyogY3Z0bC53ICovCi0gIHsyOCw4LHJyLFMsUywwfSwJLyogY3Z0dy5sICovCi0gIHszNSwxLHJyLFMsUywwfSwJLyogcGxjLnQgKi8KLSAgezM2LDAscnIsUyxTLDB9LAkvKiB0emMgKi8KLSAgezM3LDYscnIsQSxBLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LHJyLEEsQSwwfSwJLyogZXEudyAqLwotICB7MzcsNixucixBLDAsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcsbnIsQSwwLDB9LAkvKiBlcS53ICovCi0gIHszNyw1LHJyLFMsUywwfSwJLyogZXEuYiAqLwotICB7MzcsNixycixTLFMsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsUyxTLDB9LAkvKiBlcS53ICovCi0gIHszNyw4LHJyLFMsUywwfSwJLyogZXEubCAqLwotICB7MzgsNixycixBLEEsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LHJyLEEsQSwwfSwJLyogbGV1LncgKi8KLSAgezM4LDYsbnIsQSwwLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxucixBLDAsMH0sCS8qIGxldS53ICovCi0gIHszOCw1LHJyLFMsUywwfSwJLyogbGV1LmIgKi8KLSAgezM4LDYscnIsUyxTLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxycixTLFMsMH0sCS8qIGxldS53ICovCi0gIHszOCw4LHJyLFMsUywwfSwJLyogbGV1LmwgKi8KLSAgezM5LDYscnIsQSxBLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxycixBLEEsMH0sCS8qIGx0dS53ICovCi0gIHszOSw2LG5yLEEsMCwwfSwJLyogbHR1LmggKi8KLSAgezM5LDcsbnIsQSwwLDB9LAkvKiBsdHUudyAqLwotICB7MzksNSxycixTLFMsMH0sCS8qIGx0dS5iICovCi0gIHszOSw2LHJyLFMsUywwfSwJLyogbHR1LmggKi8KLSAgezM5LDcscnIsUyxTLDB9LAkvKiBsdHUudyAqLwotICB7MzksOCxycixTLFMsMH0sCS8qIGx0dS5sICovCi0gIHs0MCw2LHJyLEEsQSwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxycixBLEEsMH0sCS8qIGxlLncgKi8KLSAgezQwLDYsbnIsQSwwLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LG5yLEEsMCwwfSwJLyogbGUudyAqLwotICB7NDAsNSxycixTLFMsMH0sCS8qIGxlLmIgKi8KLSAgezQwLDYscnIsUyxTLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLFMsUywwfSwJLyogbGUudyAqLwotICB7NDAsOCxycixTLFMsMH0sCS8qIGxlLmwgKi8KLSAgezQxLDYscnIsQSxBLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LHJyLEEsQSwwfSwJLyogbHQudyAqLwotICB7NDEsNixucixBLDAsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcsbnIsQSwwLDB9LAkvKiBsdC53ICovCi0gIHs0MSw1LHJyLFMsUywwfSwJLyogbHQuYiAqLwotICB7NDEsNixycixTLFMsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsUyxTLDB9LAkvKiBsdC53ICovCi0gIHs0MSw4LHJyLFMsUywwfSwJLyogbHQubCAqLwotICB7OSw3LHJyLFMsQSwwfSwJLyogYWRkLncgKi8KLSAgezgsMCxycixBLEEsMH0sCS8qIHNoZiAqLwotICB7MCwwLHJyLEEsQSwwfSwJLyogbW92ICovCi0gIHswLDAscnIsUyxBLDB9LAkvKiBtb3YgKi8KLSAgezAsNyxycixTLFMsMH0sCS8qIG1vdi53ICovCi0gIHs4LDAscnIsUyxTLDB9LAkvKiBzaGYgKi8KLSAgezAsMCxycixTLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJyLEEsUywwfSwJLyogbW92ICovCi0gIHs1LDAscnIsQSxBLDB9LAkvKiBhbmQgKi8KLSAgezYsMCxycixBLEEsMH0sCS8qIG9yICovCi0gIHs3LDAscnIsQSxBLDB9LAkvKiB4b3IgKi8KLSAgezQyLDAscnIsQSxBLDB9LAkvKiBub3QgKi8KLSAgezUsMCxycixTLFMsMH0sCS8qIGFuZCAqLwotICB7NiwwLHJyLFMsUywwfSwJLyogb3IgKi8KLSAgezcsMCxycixTLFMsMH0sCS8qIHhvciAqLwotICB7NDIsMCxycixTLFMsMH0sCS8qIG5vdCAqLwotICB7NDAsMyxycixTLFMsMH0sCS8qIGxlLnMgKi8KLSAgezQwLDQscnIsUyxTLDB9LAkvKiBsZS5kICovCi0gIHs0MSwzLHJyLFMsUywwfSwJLyogbHQucyAqLwotICB7NDEsNCxycixTLFMsMH0sCS8qIGx0LmQgKi8KLSAgezksMyxycixTLFMsMH0sCS8qIGFkZC5zICovCi0gIHs5LDQscnIsUyxTLDB9LAkvKiBhZGQuZCAqLwotICB7MTAsMyxycixTLFMsMH0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJyLFMsUywwfSwJLyogc3ViLmQgKi8KLSAgezM3LDMscnIsUyxTLDB9LAkvKiBlcS5zICovCi0gIHszNyw0LHJyLFMsUywwfSwJLyogZXEuZCAqLwotICB7NDMsNixycixBLEEsMH0sCS8qIG5lZy5oICovCi0gIHs0Myw3LHJyLEEsQSwwfSwJLyogbmVnLncgKi8KLSAgezMsMyxycixTLFMsMH0sCS8qIG11bC5zICovCi0gIHszLDQscnIsUyxTLDB9LAkvKiBtdWwuZCAqLwotICB7NCwzLHJyLFMsUywwfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycixTLFMsMH0sCS8qIGRpdi5kICovCi0gIHs5LDYscnIsQSxBLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJyLEEsQSwwfSwJLyogYWRkLncgKi8KLSAgezksNixucixBLDAsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcsbnIsQSwwLDB9LAkvKiBhZGQudyAqLwotICB7OSw1LHJyLFMsUywwfSwJLyogYWRkLmIgKi8KLSAgezksNixycixTLFMsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcscnIsUyxTLDB9LAkvKiBhZGQudyAqLwotICB7OSw4LHJyLFMsUywwfSwJLyogYWRkLmwgKi8KLSAgezEwLDYscnIsQSxBLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycixBLEEsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw2LG5yLEEsMCwwfSwJLyogc3ViLmggKi8KLSAgezEwLDcsbnIsQSwwLDB9LAkvKiBzdWIudyAqLwotICB7MTAsNSxycixTLFMsMH0sCS8qIHN1Yi5iICovCi0gIHsxMCw2LHJyLFMsUywwfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnIsUyxTLDB9LAkvKiBzdWIudyAqLwotICB7MTAsOCxycixTLFMsMH0sCS8qIHN1Yi5sICovCi0gIHszLDYscnIsQSxBLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LHJyLEEsQSwwfSwJLyogbXVsLncgKi8KLSAgezMsNixucixBLDAsMH0sCS8qIG11bC5oICovCi0gIHszLDcsbnIsQSwwLDB9LAkvKiBtdWwudyAqLwotICB7Myw1LHJyLFMsUywwfSwJLyogbXVsLmIgKi8KLSAgezMsNixycixTLFMsMH0sCS8qIG11bC5oICovCi0gIHszLDcscnIsUyxTLDB9LAkvKiBtdWwudyAqLwotICB7Myw4LHJyLFMsUywwfSwJLyogbXVsLmwgKi8KLSAgezQsNixycixBLEEsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcscnIsQSxBLDB9LAkvKiBkaXYudyAqLwotICB7NCw2LG5yLEEsMCwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxucixBLDAsMH0sCS8qIGRpdi53ICovCi0gIHs0LDUscnIsUyxTLDB9LAkvKiBkaXYuYiAqLwotICB7NCw2LHJyLFMsUywwfSwJLyogZGl2LmggKi8KLSAgezQsNyxycixTLFMsMH0sCS8qIGRpdi53ICovCi0gIHs0LDgscnIsUyxTLDB9LAkvKiBkaXYubCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0M1tdID0gewotICB7MzIsMyxycixWLFYsMH0sCS8qIGN2dGQucyAqLwotICB7MzEsNCxycixWLFYsMH0sCS8qIGN2dHMuZCAqLwotICB7MzMsNCxycixWLFYsMH0sCS8qIGN2dGwuZCAqLwotICB7MzIsOCxycixWLFYsMH0sCS8qIGN2dGQubCAqLwotICB7MCwwLHJybCxTLFMsVk19LAkvKiBtb3YgKi8KLSAgezAsMCxybHIsUyxWTSxTfSwJLyogbW92ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs0NCwwLHJyLFMsUywwfSwJLyogbG9wICovCi0gIHszNiwwLHJyLFYsViwwfSwJLyogdHpjICovCi0gIHs0NCwwLHJyLFYsViwwfSwJLyogbG9wICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs0MiwwLHJyLFYsViwwfSwJLyogbm90ICovCi0gIHs4LDAscnIsUyxWLDB9LAkvKiBzaGYgKi8KLSAgezM1LDEscnIsVixWLDB9LAkvKiBwbGMudCAqLwotICB7NDUsMixycixWLFYsMH0sCS8qIGNwcnMuZiAqLwotICB7NDUsMSxycixWLFYsMH0sCS8qIGNwcnMudCAqLwotICB7MzcsMyxycixWLFYsMH0sCS8qIGVxLnMgKi8KLSAgezM3LDQscnIsVixWLDB9LAkvKiBlcS5kICovCi0gIHs0MywzLHJyLFYsViwwfSwJLyogbmVnLnMgKi8KLSAgezQzLDQscnIsVixWLDB9LAkvKiBuZWcuZCAqLwotICB7MzcsMyxycixTLFYsMH0sCS8qIGVxLnMgKi8KLSAgezM3LDQscnIsUyxWLDB9LAkvKiBlcS5kICovCi0gIHs0MywzLHJyLFMsUywwfSwJLyogbmVnLnMgKi8KLSAgezQzLDQscnIsUyxTLDB9LAkvKiBuZWcuZCAqLwotICB7NDAsMyxycixWLFYsMH0sCS8qIGxlLnMgKi8KLSAgezQwLDQscnIsVixWLDB9LAkvKiBsZS5kICovCi0gIHs0MSwzLHJyLFYsViwwfSwJLyogbHQucyAqLwotICB7NDEsNCxycixWLFYsMH0sCS8qIGx0LmQgKi8KLSAgezQwLDMscnIsUyxWLDB9LAkvKiBsZS5zICovCi0gIHs0MCw0LHJyLFMsViwwfSwJLyogbGUuZCAqLwotICB7NDEsMyxycixTLFYsMH0sCS8qIGx0LnMgKi8KLSAgezQxLDQscnIsUyxWLDB9LAkvKiBsdC5kICovCi0gIHszNyw1LHJyLFYsViwwfSwJLyogZXEuYiAqLwotICB7MzcsNixycixWLFYsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsVixWLDB9LAkvKiBlcS53ICovCi0gIHszNyw4LHJyLFYsViwwfSwJLyogZXEubCAqLwotICB7MzcsNSxycixTLFYsMH0sCS8qIGVxLmIgKi8KLSAgezM3LDYscnIsUyxWLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LHJyLFMsViwwfSwJLyogZXEudyAqLwotICB7MzcsOCxycixTLFYsMH0sCS8qIGVxLmwgKi8KLSAgezQwLDUscnIsVixWLDB9LAkvKiBsZS5iICovCi0gIHs0MCw2LHJyLFYsViwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxycixWLFYsMH0sCS8qIGxlLncgKi8KLSAgezQwLDgscnIsVixWLDB9LAkvKiBsZS5sICovCi0gIHs0MCw1LHJyLFMsViwwfSwJLyogbGUuYiAqLwotICB7NDAsNixycixTLFYsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsUyxWLDB9LAkvKiBsZS53ICovCi0gIHs0MCw4LHJyLFMsViwwfSwJLyogbGUubCAqLwotICB7NDEsNSxycixWLFYsMH0sCS8qIGx0LmIgKi8KLSAgezQxLDYscnIsVixWLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LHJyLFYsViwwfSwJLyogbHQudyAqLwotICB7NDEsOCxycixWLFYsMH0sCS8qIGx0LmwgKi8KLSAgezQxLDUscnIsUyxWLDB9LAkvKiBsdC5iICovCi0gIHs0MSw2LHJyLFMsViwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixTLFYsMH0sCS8qIGx0LncgKi8KLSAgezQxLDgscnIsUyxWLDB9LAkvKiBsdC5sICovCi0gIHs0Myw1LHJyLFYsViwwfSwJLyogbmVnLmIgKi8KLSAgezQzLDYscnIsVixWLDB9LAkvKiBuZWcuaCAqLwotICB7NDMsNyxycixWLFYsMH0sCS8qIG5lZy53ICovCi0gIHs0Myw4LHJyLFYsViwwfSwJLyogbmVnLmwgKi8KLSAgezQzLDUscnIsUyxTLDB9LAkvKiBuZWcuYiAqLwotICB7NDMsNixycixTLFMsMH0sCS8qIG5lZy5oICovCi0gIHs0Myw3LHJyLFMsUywwfSwJLyogbmVnLncgKi8KLSAgezQzLDgscnIsUyxTLDB9LAkvKiBuZWcubCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0NFtdID0gewotICB7NDYsMCxub3BzLDAsMCwwfSwJLyogbm9wICovCi0gIHs0NywwLHBjcmVsLDAsMCwwfSwJLyogYnIgKi8KLSAgezQ4LDIscGNyZWwsMCwwLDB9LAkvKiBicmkuZiAqLwotICB7NDgsMSxwY3JlbCwwLDAsMH0sCS8qIGJyaS50ICovCi0gIHs0OSwyLHBjcmVsLDAsMCwwfSwJLyogYnJhLmYgKi8KLSAgezQ5LDEscGNyZWwsMCwwLDB9LAkvKiBicmEudCAqLwotICB7NTAsMixwY3JlbCwwLDAsMH0sCS8qIGJycy5mICovCi0gIHs1MCwxLHBjcmVsLDAsMCwwfSwJLyogYnJzLnQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDVbXSA9IHsKLSAgezUxLDUscnIsVixWLDB9LAkvKiBsZHZpLmIgKi8KLSAgezUxLDYscnIsVixWLDB9LAkvKiBsZHZpLmggKi8KLSAgezUxLDcscnIsVixWLDB9LAkvKiBsZHZpLncgKi8KLSAgezUxLDgscnIsVixWLDB9LAkvKiBsZHZpLmwgKi8KLSAgezI4LDMscnIsVixWLDB9LAkvKiBjdnR3LnMgKi8KLSAgezMxLDcscnIsVixWLDB9LAkvKiBjdnRzLncgKi8KLSAgezI4LDgscnIsVixWLDB9LAkvKiBjdnR3LmwgKi8KLSAgezMzLDcscnIsVixWLDB9LAkvKiBjdnRsLncgKi8KLSAgezUyLDUscnhyLFYsViwwfSwJLyogc3R2aS5iICovCi0gIHs1Miw2LHJ4cixWLFYsMH0sCS8qIHN0dmkuaCAqLwotICB7NTIsNyxyeHIsVixWLDB9LAkvKiBzdHZpLncgKi8KLSAgezUyLDgscnhyLFYsViwwfSwJLyogc3R2aS5sICovCi0gIHs1Miw1LHJ4cixTLFYsMH0sCS8qIHN0dmkuYiAqLwotICB7NTIsNixyeHIsUyxWLDB9LAkvKiBzdHZpLmggKi8KLSAgezUyLDcscnhyLFMsViwwfSwJLyogc3R2aS53ICovCi0gIHs1Miw4LHJ4cixTLFYsMH0sCS8qIHN0dmkubCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0NltdID0gewotICB7NTMsMCxyLEEsMCwwfSwJLyogbGRzZHIgKi8KLSAgezU0LDAscixBLDAsMH0sCS8qIGxka2RyICovCi0gIHs1NSwzLHIsUywwLDB9LAkvKiBsbi5zICovCi0gIHs1NSw0LHIsUywwLDB9LAkvKiBsbi5kICovCi0gIHs1NiwwLG5vcHMsMCwwLDB9LAkvKiBwYXR1ICovCi0gIHs1NywwLHIsQSwwLDB9LAkvKiBwYXRlICovCi0gIHs1OCwwLG5vcHMsMCwwLDB9LAkvKiBwaWNoICovCi0gIHs1OSwwLG5vcHMsMCwwLDB9LAkvKiBwbGNoICovCi0gIHswLDAsbHIsUFNXLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxBLFBTVywwfSwJLyogbW92ICovCi0gIHswLDAsbHIsUEMsQSwwfSwJLyogbW92ICovCi0gIHs2MCwwLHIsUywwLDB9LAkvKiBpZGxlICovCi0gIHswLDAsbHIsSVRSLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLElUUiwwfSwJLyogbW92ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAscnhsLFMsSVRTUiwwfSwJLyogbW92ICovCi0gIHs2MSwwLG5vcHMsMCwwLDB9LAkvKiBydG5xICovCi0gIHs2MiwwLG5vcHMsMCwwLDB9LAkvKiBjZm9yayAqLwotICB7NjMsMCxub3BzLDAsMCwwfSwJLyogcnRuICovCi0gIHs2NCwwLG5vcHMsMCwwLDB9LAkvKiB3Zm9yayAqLwotICB7NjUsMCxub3BzLDAsMCwwfSwJLyogam9pbiAqLwotICB7NjYsMCxub3BzLDAsMCwwfSwJLyogcnRuYyAqLwotICB7NjcsMyxyLFMsMCwwfSwJLyogZXhwLnMgKi8KLSAgezY3LDQscixTLDAsMH0sCS8qIGV4cC5kICovCi0gIHs2OCwzLHIsUywwLDB9LAkvKiBzaW4ucyAqLwotICB7NjgsNCxyLFMsMCwwfSwJLyogc2luLmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezY5LDMscixTLDAsMH0sCS8qIGNvcy5zICovCi0gIHs2OSw0LHIsUywwLDB9LAkvKiBjb3MuZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NzAsNyxyLEEsMCwwfSwJLyogcHNoLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezcxLDcscixBLDAsMH0sCS8qIHBvcC53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs3MCw3LHIsUywwLDB9LAkvKiBwc2gudyAqLwotICB7NzAsOCxyLFMsMCwwfSwJLyogcHNoLmwgKi8KLSAgezcxLDcscixTLDAsMH0sCS8qIHBvcC53ICovCi0gIHs3MSw4LHIsUywwLDB9LAkvKiBwb3AubCAqLwotICB7NzIsMCxub3BzLDAsMCwwfSwJLyogZW5pICovCi0gIHs3MywwLG5vcHMsMCwwLDB9LAkvKiBkc2kgKi8KLSAgezc0LDAsbm9wcywwLDAsMH0sCS8qIGJrcHQgKi8KLSAgezc1LDAsbm9wcywwLDAsMH0sCS8qIG1zeW5jICovCi0gIHs3NiwwLHIsUywwLDB9LAkvKiBtc2tpICovCi0gIHs3NywwLHIsUywwLDB9LAkvKiB4bXRpICovCi0gIHswLDAscnhsLFMsVlYsMH0sCS8qIG1vdiAqLwotICB7NzgsMCxub3BzLDAsMCwwfSwJLyogdHN0dnYgKi8KLSAgezAsMCxscixWUyxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsQSxWUywwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVkwsQSwwfSwJLyogbW92ICovCi0gIHswLDAscnhsLEEsVkwsMH0sCS8qIG1vdiAqLwotICB7MCw3LGxyLFZTLFMsMH0sCS8qIG1vdi53ICovCi0gIHswLDcscnhsLFMsVlMsMH0sCS8qIG1vdi53ICovCi0gIHswLDcsbHIsVkwsUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxyeGwsUyxWTCwwfSwJLyogbW92LncgKi8KLSAgezc5LDAscixBLDAsMH0sCS8qIGRpYWcgKi8KLSAgezgwLDAsbm9wcywwLDAsMH0sCS8qIHBia3B0ICovCi0gIHs4MSwzLHIsUywwLDB9LAkvKiBzcXJ0LnMgKi8KLSAgezgxLDQscixTLDAsMH0sCS8qIHNxcnQuZCAqLwotICB7ODIsMCxub3BzLDAsMCwwfSwJLyogY2FzciAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7ODMsMyxyLFMsMCwwfSwJLyogYXRhbi5zICovCi0gIHs4Myw0LHIsUywwLDB9LAkvKiBhdGFuLmQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDdbXSA9IHsKLSAgezg0LDUscixWLDAsMH0sCS8qIHN1bS5iICovCi0gIHs4NCw2LHIsViwwLDB9LAkvKiBzdW0uaCAqLwotICB7ODQsNyxyLFYsMCwwfSwJLyogc3VtLncgKi8KLSAgezg0LDgscixWLDAsMH0sCS8qIHN1bS5sICovCi0gIHs4NSwwLHIsViwwLDB9LAkvKiBhbGwgKi8KLSAgezg2LDAscixWLDAsMH0sCS8qIGFueSAqLwotICB7ODcsMCxyLFYsMCwwfSwJLyogcGFyaXR5ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4OCw1LHIsViwwLDB9LAkvKiBtYXguYiAqLwotICB7ODgsNixyLFYsMCwwfSwJLyogbWF4LmggKi8KLSAgezg4LDcscixWLDAsMH0sCS8qIG1heC53ICovCi0gIHs4OCw4LHIsViwwLDB9LAkvKiBtYXgubCAqLwotICB7ODksNSxyLFYsMCwwfSwJLyogbWluLmIgKi8KLSAgezg5LDYscixWLDAsMH0sCS8qIG1pbi5oICovCi0gIHs4OSw3LHIsViwwLDB9LAkvKiBtaW4udyAqLwotICB7ODksOCxyLFYsMCwwfSwJLyogbWluLmwgKi8KLSAgezg0LDMscixWLDAsMH0sCS8qIHN1bS5zICovCi0gIHs4NCw0LHIsViwwLDB9LAkvKiBzdW0uZCAqLwotICB7OTAsMyxyLFYsMCwwfSwJLyogcHJvZC5zICovCi0gIHs5MCw0LHIsViwwLDB9LAkvKiBwcm9kLmQgKi8KLSAgezg4LDMscixWLDAsMH0sCS8qIG1heC5zICovCi0gIHs4OCw0LHIsViwwLDB9LAkvKiBtYXguZCAqLwotICB7ODksMyxyLFYsMCwwfSwJLyogbWluLnMgKi8KLSAgezg5LDQscixWLDAsMH0sCS8qIG1pbi5kICovCi0gIHs5MCw1LHIsViwwLDB9LAkvKiBwcm9kLmIgKi8KLSAgezkwLDYscixWLDAsMH0sCS8qIHByb2QuaCAqLwotICB7OTAsNyxyLFYsMCwwfSwJLyogcHJvZC53ICovCi0gIHs5MCw4LHIsViwwLDB9LAkvKiBwcm9kLmwgKi8KLSAgezM1LDIsbHIsVk0sUywwfSwJLyogcGxjLmYgKi8KLSAgezM1LDEsbHIsVk0sUywwfSwJLyogcGxjLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdHhbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDFhW10gPSB7Ci0gIHs5MSwwLGltcixBLDAsMH0sCS8qIGhhbHQgKi8KLSAgezkyLDAsYTQsMCwwLDB9LAkvKiBzeXNjICovCi0gIHsxOCw2LGltcixBLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsaW1yLEEsMCwwfSwJLyogbGQudyAqLwotICB7NSwwLGltcixBLDAsMH0sCS8qIGFuZCAqLwotICB7NiwwLGltcixBLDAsMH0sCS8qIG9yICovCi0gIHs3LDAsaW1yLEEsMCwwfSwJLyogeG9yICovCi0gIHs4LDAsaW1yLEEsMCwwfSwJLyogc2hmICovCi0gIHs5LDYsaW1yLEEsMCwwfSwJLyogYWRkLmggKi8KLSAgezksNyxpbXIsQSwwLDB9LAkvKiBhZGQudyAqLwotICB7MTAsNixpbXIsQSwwLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxpbXIsQSwwLDB9LAkvKiBzdWIudyAqLwotICB7Myw2LGltcixBLDAsMH0sCS8qIG11bC5oICovCi0gIHszLDcsaW1yLEEsMCwwfSwJLyogbXVsLncgKi8KLSAgezQsNixpbXIsQSwwLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LGltcixBLDAsMH0sCS8qIGRpdi53ICovCi0gIHsxOCw3LGltbCxWTCwwLDB9LAkvKiBsZC53ICovCi0gIHsxOCw3LGltbCxWUywwLDB9LAkvKiBsZC53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4LDcsaW1yLFMsMCwwfSwJLyogc2hmLncgKi8KLSAgezkzLDAsYTUsMCwwLDB9LAkvKiB0cmFwICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNyw2LGltcixBLDAsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcsaW1yLEEsMCwwfSwJLyogZXEudyAqLwotICB7MzgsNixpbXIsQSwwLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxpbXIsQSwwLDB9LAkvKiBsZXUudyAqLwotICB7MzksNixpbXIsQSwwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxpbXIsQSwwLDB9LAkvKiBsdHUudyAqLwotICB7NDAsNixpbXIsQSwwLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LGltcixBLDAsMH0sCS8qIGxlLncgKi8KLSAgezQxLDYsaW1yLEEsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxpbXIsQSwwLDB9LAkvKiBsdC53ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQxYltdID0gewotICB7MTgsNCxpbXIsUywwLDB9LAkvKiBsZC5kICovCi0gIHsxOCwxMCxpbXIsUywwLDB9LAkvKiBsZC51ICovCi0gIHsxOCw4LGltcixTLDAsMH0sCS8qIGxkLmwgKi8KLSAgezE4LDcsaW1yLFMsMCwwfSwJLyogbGQudyAqLwotICB7NSwwLGltcixTLDAsMH0sCS8qIGFuZCAqLwotICB7NiwwLGltcixTLDAsMH0sCS8qIG9yICovCi0gIHs3LDAsaW1yLFMsMCwwfSwJLyogeG9yICovCi0gIHs4LDAsaW1yLFMsMCwwfSwJLyogc2hmICovCi0gIHs5LDYsaW1yLFMsMCwwfSwJLyogYWRkLmggKi8KLSAgezksNyxpbXIsUywwLDB9LAkvKiBhZGQudyAqLwotICB7MTAsNixpbXIsUywwLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxpbXIsUywwLDB9LAkvKiBzdWIudyAqLwotICB7Myw2LGltcixTLDAsMH0sCS8qIG11bC5oICovCi0gIHszLDcsaW1yLFMsMCwwfSwJLyogbXVsLncgKi8KLSAgezQsNixpbXIsUywwLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LGltcixTLDAsMH0sCS8qIGRpdi53ICovCi0gIHs5LDMsaW1yLFMsMCwwfSwJLyogYWRkLnMgKi8KLSAgezEwLDMsaW1yLFMsMCwwfSwJLyogc3ViLnMgKi8KLSAgezMsMyxpbXIsUywwLDB9LAkvKiBtdWwucyAqLwotICB7NCwzLGltcixTLDAsMH0sCS8qIGRpdi5zICovCi0gIHs0MCwzLGltcixTLDAsMH0sCS8qIGxlLnMgKi8KLSAgezQxLDMsaW1yLFMsMCwwfSwJLyogbHQucyAqLwotICB7MzcsNixpbXIsUywwLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LGltcixTLDAsMH0sCS8qIGVxLncgKi8KLSAgezM4LDYsaW1yLFMsMCwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcsaW1yLFMsMCwwfSwJLyogbGV1LncgKi8KLSAgezM5LDYsaW1yLFMsMCwwfSwJLyogbHR1LmggKi8KLSAgezM5LDcsaW1yLFMsMCwwfSwJLyogbHR1LncgKi8KLSAgezQwLDYsaW1yLFMsMCwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxpbXIsUywwLDB9LAkvKiBsZS53ICovCi0gIHs0MSw2LGltcixTLDAsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcsaW1yLFMsMCwwfSwJLyogbHQudyAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MFtdID0gewotICB7MTAsMyxycnIsUyxWLFZ9LAkvKiBzdWIucyAqLwotICB7MTAsNCxycnIsUyxWLFZ9LAkvKiBzdWIuZCAqLwotICB7NCwzLHJycixTLFYsVn0sCS8qIGRpdi5zICovCi0gIHs0LDQscnJyLFMsVixWfSwJLyogZGl2LmQgKi8KLSAgezEwLDExLHJycixTLFYsVn0sCS8qIHN1Yi5zLmYgKi8KLSAgezEwLDEyLHJycixTLFYsVn0sCS8qIHN1Yi5kLmYgKi8KLSAgezQsMTEscnJyLFMsVixWfSwJLyogZGl2LnMuZiAqLwotICB7NCwxMixycnIsUyxWLFZ9LAkvKiBkaXYuZC5mICovCi0gIHszLDExLHJycixWLFYsVn0sCS8qIG11bC5zLmYgKi8KLSAgezMsMTIscnJyLFYsVixWfSwJLyogbXVsLmQuZiAqLwotICB7NCwxMSxycnIsVixWLFZ9LAkvKiBkaXYucy5mICovCi0gIHs0LDEyLHJycixWLFYsVn0sCS8qIGRpdi5kLmYgKi8KLSAgezMsMTEscnJyLFYsUyxWfSwJLyogbXVsLnMuZiAqLwotICB7MywxMixycnIsVixTLFZ9LAkvKiBtdWwuZC5mICovCi0gIHs0LDExLHJycixWLFMsVn0sCS8qIGRpdi5zLmYgKi8KLSAgezQsMTIscnJyLFYsUyxWfSwJLyogZGl2LmQuZiAqLwotICB7NSwyLHJycixWLFYsVn0sCS8qIGFuZC5mICovCi0gIHs2LDIscnJyLFYsVixWfSwJLyogb3IuZiAqLwotICB7NywyLHJycixWLFYsVn0sCS8qIHhvci5mICovCi0gIHs4LDIscnJyLFYsVixWfSwJLyogc2hmLmYgKi8KLSAgezUsMixycnIsVixTLFZ9LAkvKiBhbmQuZiAqLwotICB7NiwyLHJycixWLFMsVn0sCS8qIG9yLmYgKi8KLSAgezcsMixycnIsVixTLFZ9LAkvKiB4b3IuZiAqLwotICB7OCwyLHJycixWLFMsVn0sCS8qIHNoZi5mICovCi0gIHs5LDExLHJycixWLFYsVn0sCS8qIGFkZC5zLmYgKi8KLSAgezksMTIscnJyLFYsVixWfSwJLyogYWRkLmQuZiAqLwotICB7MTAsMTEscnJyLFYsVixWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFYsVixWfSwJLyogc3ViLmQuZiAqLwotICB7OSwxMSxycnIsVixTLFZ9LAkvKiBhZGQucy5mICovCi0gIHs5LDEyLHJycixWLFMsVn0sCS8qIGFkZC5kLmYgKi8KLSAgezEwLDExLHJycixWLFMsVn0sCS8qIHN1Yi5zLmYgKi8KLSAgezEwLDEyLHJycixWLFMsVn0sCS8qIHN1Yi5kLmYgKi8KLSAgezksMTMscnJyLFYsVixWfSwJLyogYWRkLmIuZiAqLwotICB7OSwxNCxycnIsVixWLFZ9LAkvKiBhZGQuaC5mICovCi0gIHs5LDE1LHJycixWLFYsVn0sCS8qIGFkZC53LmYgKi8KLSAgezksMTYscnJyLFYsVixWfSwJLyogYWRkLmwuZiAqLwotICB7OSwxMyxycnIsVixTLFZ9LAkvKiBhZGQuYi5mICovCi0gIHs5LDE0LHJycixWLFMsVn0sCS8qIGFkZC5oLmYgKi8KLSAgezksMTUscnJyLFYsUyxWfSwJLyogYWRkLncuZiAqLwotICB7OSwxNixycnIsVixTLFZ9LAkvKiBhZGQubC5mICovCi0gIHsxMCwxMyxycnIsVixWLFZ9LAkvKiBzdWIuYi5mICovCi0gIHsxMCwxNCxycnIsVixWLFZ9LAkvKiBzdWIuaC5mICovCi0gIHsxMCwxNSxycnIsVixWLFZ9LAkvKiBzdWIudy5mICovCi0gIHsxMCwxNixycnIsVixWLFZ9LAkvKiBzdWIubC5mICovCi0gIHsxMCwxMyxycnIsVixTLFZ9LAkvKiBzdWIuYi5mICovCi0gIHsxMCwxNCxycnIsVixTLFZ9LAkvKiBzdWIuaC5mICovCi0gIHsxMCwxNSxycnIsVixTLFZ9LAkvKiBzdWIudy5mICovCi0gIHsxMCwxNixycnIsVixTLFZ9LAkvKiBzdWIubC5mICovCi0gIHszLDEzLHJycixWLFYsVn0sCS8qIG11bC5iLmYgKi8KLSAgezMsMTQscnJyLFYsVixWfSwJLyogbXVsLmguZiAqLwotICB7MywxNSxycnIsVixWLFZ9LAkvKiBtdWwudy5mICovCi0gIHszLDE2LHJycixWLFYsVn0sCS8qIG11bC5sLmYgKi8KLSAgezMsMTMscnJyLFYsUyxWfSwJLyogbXVsLmIuZiAqLwotICB7MywxNCxycnIsVixTLFZ9LAkvKiBtdWwuaC5mICovCi0gIHszLDE1LHJycixWLFMsVn0sCS8qIG11bC53LmYgKi8KLSAgezMsMTYscnJyLFYsUyxWfSwJLyogbXVsLmwuZiAqLwotICB7NCwxMyxycnIsVixWLFZ9LAkvKiBkaXYuYi5mICovCi0gIHs0LDE0LHJycixWLFYsVn0sCS8qIGRpdi5oLmYgKi8KLSAgezQsMTUscnJyLFYsVixWfSwJLyogZGl2LncuZiAqLwotICB7NCwxNixycnIsVixWLFZ9LAkvKiBkaXYubC5mICovCi0gIHs0LDEzLHJycixWLFMsVn0sCS8qIGRpdi5iLmYgKi8KLSAgezQsMTQscnJyLFYsUyxWfSwJLyogZGl2LmguZiAqLwotICB7NCwxNSxycnIsVixTLFZ9LAkvKiBkaXYudy5mICovCi0gIHs0LDE2LHJycixWLFMsVn0sCS8qIGRpdi5sLmYgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDFbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezk0LDAsYTMsMCwwLDB9LAkvKiB0c3QgKi8KLSAgezk1LDAsYTMsMCwwLDB9LAkvKiBsY2sgKi8KLSAgezk2LDAsYTMsMCwwLDB9LAkvKiB1bGsgKi8KLSAgezE3LDAsYTFyLFMsMCwwfSwJLyogbGRlYSAqLwotICB7OTcsMCxhMXIsQSwwLDB9LAkvKiBzcGF3biAqLwotICB7OTgsMCxhMXIsQSwwLDB9LAkvKiBsZGNtciAqLwotICB7OTksMCxhMnIsQSwwLDB9LAkvKiBzdGNtciAqLwotICB7MTAwLDAsYTFyLEEsMCwwfSwJLyogcG9wciAqLwotICB7MTAxLDAsYTJyLEEsMCwwfSwJLyogcHNociAqLwotICB7MTAyLDcsYTFyLEEsMCwwfSwJLyogcmN2ci53ICovCi0gIHsxMDMsNyxhMnIsQSwwLDB9LAkvKiBtYXRtLncgKi8KLSAgezEwNCw3LGEycixBLDAsMH0sCS8qIHNuZHIudyAqLwotICB7MTA0LDgsYTJyLFMsMCwwfSwJLyogc25kci5sICovCi0gIHsxMDIsOCxhMXIsUywwLDB9LAkvKiByY3ZyLmwgKi8KLSAgezEwMyw4LGEycixTLDAsMH0sCS8qIG1hdG0ubCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTA1LDcsYTJyLEEsMCwwfSwJLyogcHV0ci53ICovCi0gIHsxMDUsOCxhMnIsUywwLDB9LAkvKiBwdXRyLmwgKi8KLSAgezEwNiw3LGExcixBLDAsMH0sCS8qIGdldHIudyAqLwotICB7MTA2LDgsYTFyLFMsMCwwfSwJLyogZ2V0ci5sICovCi0gIHsyNiwxMyxhMnIsUywwLDB9LAkvKiBzdGUuYi5mICovCi0gIHsyNiwxNCxhMnIsUywwLDB9LAkvKiBzdGUuaC5mICovCi0gIHsyNiwxNSxhMnIsUywwLDB9LAkvKiBzdGUudy5mICovCi0gIHsyNiwxNixhMnIsUywwLDB9LAkvKiBzdGUubC5mICovCi0gIHsxMDcsNyxhMnIsQSwwLDB9LAkvKiBtYXRyLncgKi8KLSAgezEwOCw3LGEycixBLDAsMH0sCS8qIG1hdC53ICovCi0gIHsxMDksNyxhMXIsQSwwLDB9LAkvKiBnZXQudyAqLwotICB7MTEwLDcsYTFyLEEsMCwwfSwJLyogcmN2LncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezExMSw3LGExcixBLDAsMH0sCS8qIGluYy53ICovCi0gIHsxMTIsNyxhMnIsQSwwLDB9LAkvKiBwdXQudyAqLwotICB7MTEzLDcsYTJyLEEsMCwwfSwJLyogc25kLncgKi8KLSAgezEwNyw4LGEycixTLDAsMH0sCS8qIG1hdHIubCAqLwotICB7MTA4LDgsYTJyLFMsMCwwfSwJLyogbWF0LmwgKi8KLSAgezEwOSw4LGExcixTLDAsMH0sCS8qIGdldC5sICovCi0gIHsxMTAsOCxhMXIsUywwLDB9LAkvKiByY3YubCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MTExLDgsYTFyLFMsMCwwfSwJLyogaW5jLmwgKi8KLSAgezExMiw4LGEycixTLDAsMH0sCS8qIHB1dC5sICovCi0gIHsxMTMsOCxhMnIsUywwLDB9LAkvKiBzbmQubCAqLwotICB7MTgsMTMsYTFyLFYsMCwwfSwJLyogbGQuYi5mICovCi0gIHsxOCwxNCxhMXIsViwwLDB9LAkvKiBsZC5oLmYgKi8KLSAgezE4LDE1LGExcixWLDAsMH0sCS8qIGxkLncuZiAqLwotICB7MTgsMTYsYTFyLFYsMCwwfSwJLyogbGQubC5mICovCi0gIHsyMSwxMyxhMnIsViwwLDB9LAkvKiBzdC5iLmYgKi8KLSAgezIxLDE0LGEycixWLDAsMH0sCS8qIHN0LmguZiAqLwotICB7MjEsMTUsYTJyLFYsMCwwfSwJLyogc3Qudy5mICovCi0gIHsyMSwxNixhMnIsViwwLDB9LAkvKiBzdC5sLmYgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDJbXSA9IHsKLSAgezI4LDUscnIsVixWLDB9LAkvKiBjdnR3LmIgKi8KLSAgezI4LDYscnIsVixWLDB9LAkvKiBjdnR3LmggKi8KLSAgezI5LDcscnIsVixWLDB9LAkvKiBjdnRiLncgKi8KLSAgezMwLDcscnIsVixWLDB9LAkvKiBjdnRoLncgKi8KLSAgezI4LDEzLHJyLFYsViwwfSwJLyogY3Z0dy5iLmYgKi8KLSAgezI4LDE0LHJyLFYsViwwfSwJLyogY3Z0dy5oLmYgKi8KLSAgezI5LDE1LHJyLFYsViwwfSwJLyogY3Z0Yi53LmYgKi8KLSAgezMwLDE1LHJyLFYsViwwfSwJLyogY3Z0aC53LmYgKi8KLSAgezMxLDgscnIsVixWLDB9LAkvKiBjdnRzLmwgKi8KLSAgezMyLDcscnIsVixWLDB9LAkvKiBjdnRkLncgKi8KLSAgezMzLDMscnIsVixWLDB9LAkvKiBjdnRsLnMgKi8KLSAgezI4LDQscnIsVixWLDB9LAkvKiBjdnR3LmQgKi8KLSAgezMxLDE2LHJyLFYsViwwfSwJLyogY3Z0cy5sLmYgKi8KLSAgezMyLDE1LHJyLFYsViwwfSwJLyogY3Z0ZC53LmYgKi8KLSAgezMzLDExLHJyLFYsViwwfSwJLyogY3Z0bC5zLmYgKi8KLSAgezI4LDEyLHJyLFYsViwwfSwJLyogY3Z0dy5kLmYgKi8KLSAgezExNCwwLHJyLFMsUywwfSwJLyogZW5hbCAqLwotICB7OCw3LHJyLFMsUywwfSwJLyogc2hmLncgKi8KLSAgezExNSwwLHJyLFMsUywwfSwJLyogZW5hZyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MjgsNCxycixTLFMsMH0sCS8qIGN2dHcuZCAqLwotICB7MzIsNyxycixTLFMsMH0sCS8qIGN2dGQudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTE2LDMscnIsUyxTLDB9LAkvKiBmcmludC5zICovCi0gIHsxMTYsNCxycixTLFMsMH0sCS8qIGZyaW50LmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwzLHJyLFYsViwwfSwJLyogZnJpbnQucyAqLwotICB7MTE2LDQscnIsVixWLDB9LAkvKiBmcmludC5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMTEscnIsVixWLDB9LAkvKiBmcmludC5zLmYgKi8KLSAgezExNiwxMixycixWLFYsMH0sCS8qIGZyaW50LmQuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7ODEsMyxycixWLFYsMH0sCS8qIHNxcnQucyAqLwotICB7ODEsNCxycixWLFYsMH0sCS8qIHNxcnQuZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7ODEsMTEscnIsVixWLDB9LAkvKiBzcXJ0LnMuZiAqLwotICB7ODEsMTIscnIsVixWLDB9LAkvKiBzcXJ0LmQuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0M1tdID0gewotICB7MzIsMTEscnIsVixWLDB9LAkvKiBjdnRkLnMuZiAqLwotICB7MzEsMTIscnIsVixWLDB9LAkvKiBjdnRzLmQuZiAqLwotICB7MzMsMTIscnIsVixWLDB9LAkvKiBjdnRsLmQuZiAqLwotICB7MzIsMTYscnIsVixWLDB9LAkvKiBjdnRkLmwuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzYsMixycixWLFYsMH0sCS8qIHR6Yy5mICovCi0gIHs0NCwyLHJyLFYsViwwfSwJLyogbG9wLmYgKi8KLSAgezExNywyLHJyLFYsViwwfSwJLyogeHBuZC5mICovCi0gIHs0MiwyLHJyLFYsViwwfSwJLyogbm90LmYgKi8KLSAgezgsMixycixTLFYsMH0sCS8qIHNoZi5mICovCi0gIHszNSwxNyxycixWLFYsMH0sCS8qIHBsYy50LmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDExLHJyLFYsViwwfSwJLyogZXEucy5mICovCi0gIHszNywxMixycixWLFYsMH0sCS8qIGVxLmQuZiAqLwotICB7NDMsMTEscnIsVixWLDB9LAkvKiBuZWcucy5mICovCi0gIHs0MywxMixycixWLFYsMH0sCS8qIG5lZy5kLmYgKi8KLSAgezM3LDExLHJyLFMsViwwfSwJLyogZXEucy5mICovCi0gIHszNywxMixycixTLFYsMH0sCS8qIGVxLmQuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NDAsMTEscnIsVixWLDB9LAkvKiBsZS5zLmYgKi8KLSAgezQwLDEyLHJyLFYsViwwfSwJLyogbGUuZC5mICovCi0gIHs0MSwxMSxycixWLFYsMH0sCS8qIGx0LnMuZiAqLwotICB7NDEsMTIscnIsVixWLDB9LAkvKiBsdC5kLmYgKi8KLSAgezQwLDExLHJyLFMsViwwfSwJLyogbGUucy5mICovCi0gIHs0MCwxMixycixTLFYsMH0sCS8qIGxlLmQuZiAqLwotICB7NDEsMTEscnIsUyxWLDB9LAkvKiBsdC5zLmYgKi8KLSAgezQxLDEyLHJyLFMsViwwfSwJLyogbHQuZC5mICovCi0gIHszNywxMyxycixWLFYsMH0sCS8qIGVxLmIuZiAqLwotICB7MzcsMTQscnIsVixWLDB9LAkvKiBlcS5oLmYgKi8KLSAgezM3LDE1LHJyLFYsViwwfSwJLyogZXEudy5mICovCi0gIHszNywxNixycixWLFYsMH0sCS8qIGVxLmwuZiAqLwotICB7MzcsMTMscnIsUyxWLDB9LAkvKiBlcS5iLmYgKi8KLSAgezM3LDE0LHJyLFMsViwwfSwJLyogZXEuaC5mICovCi0gIHszNywxNSxycixTLFYsMH0sCS8qIGVxLncuZiAqLwotICB7MzcsMTYscnIsUyxWLDB9LAkvKiBlcS5sLmYgKi8KLSAgezQwLDEzLHJyLFYsViwwfSwJLyogbGUuYi5mICovCi0gIHs0MCwxNCxycixWLFYsMH0sCS8qIGxlLmguZiAqLwotICB7NDAsMTUscnIsVixWLDB9LAkvKiBsZS53LmYgKi8KLSAgezQwLDE2LHJyLFYsViwwfSwJLyogbGUubC5mICovCi0gIHs0MCwxMyxycixTLFYsMH0sCS8qIGxlLmIuZiAqLwotICB7NDAsMTQscnIsUyxWLDB9LAkvKiBsZS5oLmYgKi8KLSAgezQwLDE1LHJyLFMsViwwfSwJLyogbGUudy5mICovCi0gIHs0MCwxNixycixTLFYsMH0sCS8qIGxlLmwuZiAqLwotICB7NDEsMTMscnIsVixWLDB9LAkvKiBsdC5iLmYgKi8KLSAgezQxLDE0LHJyLFYsViwwfSwJLyogbHQuaC5mICovCi0gIHs0MSwxNSxycixWLFYsMH0sCS8qIGx0LncuZiAqLwotICB7NDEsMTYscnIsVixWLDB9LAkvKiBsdC5sLmYgKi8KLSAgezQxLDEzLHJyLFMsViwwfSwJLyogbHQuYi5mICovCi0gIHs0MSwxNCxycixTLFYsMH0sCS8qIGx0LmguZiAqLwotICB7NDEsMTUscnIsUyxWLDB9LAkvKiBsdC53LmYgKi8KLSAgezQxLDE2LHJyLFMsViwwfSwJLyogbHQubC5mICovCi0gIHs0MywxMyxycixWLFYsMH0sCS8qIG5lZy5iLmYgKi8KLSAgezQzLDE0LHJyLFYsViwwfSwJLyogbmVnLmguZiAqLwotICB7NDMsMTUscnIsVixWLDB9LAkvKiBuZWcudy5mICovCi0gIHs0MywxNixycixWLFYsMH0sCS8qIG5lZy5sLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDRbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDVbXSA9IHsKLSAgezUxLDEzLHJyLFYsViwwfSwJLyogbGR2aS5iLmYgKi8KLSAgezUxLDE0LHJyLFYsViwwfSwJLyogbGR2aS5oLmYgKi8KLSAgezUxLDE1LHJyLFYsViwwfSwJLyogbGR2aS53LmYgKi8KLSAgezUxLDE2LHJyLFYsViwwfSwJLyogbGR2aS5sLmYgKi8KLSAgezI4LDExLHJyLFYsViwwfSwJLyogY3Z0dy5zLmYgKi8KLSAgezMxLDE1LHJyLFYsViwwfSwJLyogY3Z0cy53LmYgKi8KLSAgezI4LDE2LHJyLFYsViwwfSwJLyogY3Z0dy5sLmYgKi8KLSAgezMzLDE1LHJyLFYsViwwfSwJLyogY3Z0bC53LmYgKi8KLSAgezUyLDEzLHJ4cixWLFYsMH0sCS8qIHN0dmkuYi5mICovCi0gIHs1MiwxNCxyeHIsVixWLDB9LAkvKiBzdHZpLmguZiAqLwotICB7NTIsMTUscnhyLFYsViwwfSwJLyogc3R2aS53LmYgKi8KLSAgezUyLDE2LHJ4cixWLFYsMH0sCS8qIHN0dmkubC5mICovCi0gIHs1MiwxMyxyeHIsUyxWLDB9LAkvKiBzdHZpLmIuZiAqLwotICB7NTIsMTQscnhyLFMsViwwfSwJLyogc3R2aS5oLmYgKi8KLSAgezUyLDE1LHJ4cixTLFYsMH0sCS8qIHN0dmkudy5mICovCi0gIHs1MiwxNixyeHIsUyxWLDB9LAkvKiBzdHZpLmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NltdID0gewotICB7MCwwLHJ4bCxTLENJUiwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsQ0lSLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFRPQyxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixDUFVJRCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxUVFIsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFRUUixTLDB9LAkvKiBtb3YgKi8KLSAgezExOCwwLG5vcHMsMCwwLDB9LAkvKiBjdHJzbCAqLwotICB7MTE5LDAsbm9wcywwLDAsMH0sCS8qIGN0cnNnICovCi0gIHswLDAscnhsLFMsVk1VLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixWTVUsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsVk1MLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixWTUwsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsSUNSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixJQ1IsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsVENQVSwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVENQVSxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezEyMCwwLG5vcHMsMCwwLDB9LAkvKiBzdG9wICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAscnhsLFMsVElELDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUSUQsUywwfSwJLyogbW92ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ3W10gPSB7Ci0gIHs4NCwxMyxyLFYsMCwwfSwJLyogc3VtLmIuZiAqLwotICB7ODQsMTQscixWLDAsMH0sCS8qIHN1bS5oLmYgKi8KLSAgezg0LDE1LHIsViwwLDB9LAkvKiBzdW0udy5mICovCi0gIHs4NCwxNixyLFYsMCwwfSwJLyogc3VtLmwuZiAqLwotICB7ODUsMixyLFYsMCwwfSwJLyogYWxsLmYgKi8KLSAgezg2LDIscixWLDAsMH0sCS8qIGFueS5mICovCi0gIHs4NywyLHIsViwwLDB9LAkvKiBwYXJpdHkuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7ODgsMTMscixWLDAsMH0sCS8qIG1heC5iLmYgKi8KLSAgezg4LDE0LHIsViwwLDB9LAkvKiBtYXguaC5mICovCi0gIHs4OCwxNSxyLFYsMCwwfSwJLyogbWF4LncuZiAqLwotICB7ODgsMTYscixWLDAsMH0sCS8qIG1heC5sLmYgKi8KLSAgezg5LDEzLHIsViwwLDB9LAkvKiBtaW4uYi5mICovCi0gIHs4OSwxNCxyLFYsMCwwfSwJLyogbWluLmguZiAqLwotICB7ODksMTUscixWLDAsMH0sCS8qIG1pbi53LmYgKi8KLSAgezg5LDE2LHIsViwwLDB9LAkvKiBtaW4ubC5mICovCi0gIHs4NCwxMSxyLFYsMCwwfSwJLyogc3VtLnMuZiAqLwotICB7ODQsMTIscixWLDAsMH0sCS8qIHN1bS5kLmYgKi8KLSAgezkwLDExLHIsViwwLDB9LAkvKiBwcm9kLnMuZiAqLwotICB7OTAsMTIscixWLDAsMH0sCS8qIHByb2QuZC5mICovCi0gIHs4OCwxMSxyLFYsMCwwfSwJLyogbWF4LnMuZiAqLwotICB7ODgsMTIscixWLDAsMH0sCS8qIG1heC5kLmYgKi8KLSAgezg5LDExLHIsViwwLDB9LAkvKiBtaW4ucy5mICovCi0gIHs4OSwxMixyLFYsMCwwfSwJLyogbWluLmQuZiAqLwotICB7OTAsMTMscixWLDAsMH0sCS8qIHByb2QuYi5mICovCi0gIHs5MCwxNCxyLFYsMCwwfSwJLyogcHJvZC5oLmYgKi8KLSAgezkwLDE1LHIsViwwLDB9LAkvKiBwcm9kLncuZiAqLwotICB7OTAsMTYscixWLDAsMH0sCS8qIHByb2QubC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQwW10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMCwxOCxycnIsUyxWLFZ9LAkvKiBzdWIucy50ICovCi0gIHsxMCwxOSxycnIsUyxWLFZ9LAkvKiBzdWIuZC50ICovCi0gIHs0LDE4LHJycixTLFYsVn0sCS8qIGRpdi5zLnQgKi8KLSAgezQsMTkscnJyLFMsVixWfSwJLyogZGl2LmQudCAqLwotICB7MywxOCxycnIsVixWLFZ9LAkvKiBtdWwucy50ICovCi0gIHszLDE5LHJycixWLFYsVn0sCS8qIG11bC5kLnQgKi8KLSAgezQsMTgscnJyLFYsVixWfSwJLyogZGl2LnMudCAqLwotICB7NCwxOSxycnIsVixWLFZ9LAkvKiBkaXYuZC50ICovCi0gIHszLDE4LHJycixWLFMsVn0sCS8qIG11bC5zLnQgKi8KLSAgezMsMTkscnJyLFYsUyxWfSwJLyogbXVsLmQudCAqLwotICB7NCwxOCxycnIsVixTLFZ9LAkvKiBkaXYucy50ICovCi0gIHs0LDE5LHJycixWLFMsVn0sCS8qIGRpdi5kLnQgKi8KLSAgezUsMSxycnIsVixWLFZ9LAkvKiBhbmQudCAqLwotICB7NiwxLHJycixWLFYsVn0sCS8qIG9yLnQgKi8KLSAgezcsMSxycnIsVixWLFZ9LAkvKiB4b3IudCAqLwotICB7OCwxLHJycixWLFYsVn0sCS8qIHNoZi50ICovCi0gIHs1LDEscnJyLFYsUyxWfSwJLyogYW5kLnQgKi8KLSAgezYsMSxycnIsVixTLFZ9LAkvKiBvci50ICovCi0gIHs3LDEscnJyLFYsUyxWfSwJLyogeG9yLnQgKi8KLSAgezgsMSxycnIsVixTLFZ9LAkvKiBzaGYudCAqLwotICB7OSwxOCxycnIsVixWLFZ9LAkvKiBhZGQucy50ICovCi0gIHs5LDE5LHJycixWLFYsVn0sCS8qIGFkZC5kLnQgKi8KLSAgezEwLDE4LHJycixWLFYsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixWLFYsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezksMTgscnJyLFYsUyxWfSwJLyogYWRkLnMudCAqLwotICB7OSwxOSxycnIsVixTLFZ9LAkvKiBhZGQuZC50ICovCi0gIHsxMCwxOCxycnIsVixTLFZ9LAkvKiBzdWIucy50ICovCi0gIHsxMCwxOSxycnIsVixTLFZ9LAkvKiBzdWIuZC50ICovCi0gIHs5LDIwLHJycixWLFYsVn0sCS8qIGFkZC5iLnQgKi8KLSAgezksMjEscnJyLFYsVixWfSwJLyogYWRkLmgudCAqLwotICB7OSwyMixycnIsVixWLFZ9LAkvKiBhZGQudy50ICovCi0gIHs5LDIzLHJycixWLFYsVn0sCS8qIGFkZC5sLnQgKi8KLSAgezksMjAscnJyLFYsUyxWfSwJLyogYWRkLmIudCAqLwotICB7OSwyMSxycnIsVixTLFZ9LAkvKiBhZGQuaC50ICovCi0gIHs5LDIyLHJycixWLFMsVn0sCS8qIGFkZC53LnQgKi8KLSAgezksMjMscnJyLFYsUyxWfSwJLyogYWRkLmwudCAqLwotICB7MTAsMjAscnJyLFYsVixWfSwJLyogc3ViLmIudCAqLwotICB7MTAsMjEscnJyLFYsVixWfSwJLyogc3ViLmgudCAqLwotICB7MTAsMjIscnJyLFYsVixWfSwJLyogc3ViLncudCAqLwotICB7MTAsMjMscnJyLFYsVixWfSwJLyogc3ViLmwudCAqLwotICB7MTAsMjAscnJyLFYsUyxWfSwJLyogc3ViLmIudCAqLwotICB7MTAsMjEscnJyLFYsUyxWfSwJLyogc3ViLmgudCAqLwotICB7MTAsMjIscnJyLFYsUyxWfSwJLyogc3ViLncudCAqLwotICB7MTAsMjMscnJyLFYsUyxWfSwJLyogc3ViLmwudCAqLwotICB7MywyMCxycnIsVixWLFZ9LAkvKiBtdWwuYi50ICovCi0gIHszLDIxLHJycixWLFYsVn0sCS8qIG11bC5oLnQgKi8KLSAgezMsMjIscnJyLFYsVixWfSwJLyogbXVsLncudCAqLwotICB7MywyMyxycnIsVixWLFZ9LAkvKiBtdWwubC50ICovCi0gIHszLDIwLHJycixWLFMsVn0sCS8qIG11bC5iLnQgKi8KLSAgezMsMjEscnJyLFYsUyxWfSwJLyogbXVsLmgudCAqLwotICB7MywyMixycnIsVixTLFZ9LAkvKiBtdWwudy50ICovCi0gIHszLDIzLHJycixWLFMsVn0sCS8qIG11bC5sLnQgKi8KLSAgezQsMjAscnJyLFYsVixWfSwJLyogZGl2LmIudCAqLwotICB7NCwyMSxycnIsVixWLFZ9LAkvKiBkaXYuaC50ICovCi0gIHs0LDIyLHJycixWLFYsVn0sCS8qIGRpdi53LnQgKi8KLSAgezQsMjMscnJyLFYsVixWfSwJLyogZGl2LmwudCAqLwotICB7NCwyMCxycnIsVixTLFZ9LAkvKiBkaXYuYi50ICovCi0gIHs0LDIxLHJycixWLFMsVn0sCS8qIGRpdi5oLnQgKi8KLSAgezQsMjIscnJyLFYsUyxWfSwJLyogZGl2LncudCAqLwotICB7NCwyMyxycnIsVixTLFZ9LAkvKiBkaXYubC50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQxW10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyNiwyMCxhMnIsUywwLDB9LAkvKiBzdGUuYi50ICovCi0gIHsyNiwyMSxhMnIsUywwLDB9LAkvKiBzdGUuaC50ICovCi0gIHsyNiwyMixhMnIsUywwLDB9LAkvKiBzdGUudy50ICovCi0gIHsyNiwyMyxhMnIsUywwLDB9LAkvKiBzdGUubC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxOCwyMCxhMXIsViwwLDB9LAkvKiBsZC5iLnQgKi8KLSAgezE4LDIxLGExcixWLDAsMH0sCS8qIGxkLmgudCAqLwotICB7MTgsMjIsYTFyLFYsMCwwfSwJLyogbGQudy50ICovCi0gIHsxOCwyMyxhMXIsViwwLDB9LAkvKiBsZC5sLnQgKi8KLSAgezIxLDIwLGEycixWLDAsMH0sCS8qIHN0LmIudCAqLwotICB7MjEsMjEsYTJyLFYsMCwwfSwJLyogc3QuaC50ICovCi0gIHsyMSwyMixhMnIsViwwLDB9LAkvKiBzdC53LnQgKi8KLSAgezIxLDIzLGEycixWLDAsMH0sCS8qIHN0LmwudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0MltdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MjgsMjAscnIsVixWLDB9LAkvKiBjdnR3LmIudCAqLwotICB7MjgsMjEscnIsVixWLDB9LAkvKiBjdnR3LmgudCAqLwotICB7MjksMjIscnIsVixWLDB9LAkvKiBjdnRiLncudCAqLwotICB7MzAsMjIscnIsVixWLDB9LAkvKiBjdnRoLncudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzEsMjMscnIsVixWLDB9LAkvKiBjdnRzLmwudCAqLwotICB7MzIsMjIscnIsVixWLDB9LAkvKiBjdnRkLncudCAqLwotICB7MzMsMTgscnIsVixWLDB9LAkvKiBjdnRsLnMudCAqLwotICB7MjgsMTkscnIsVixWLDB9LAkvKiBjdnR3LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTE2LDE4LHJyLFYsViwwfSwJLyogZnJpbnQucy50ICovCi0gIHsxMTYsMTkscnIsVixWLDB9LAkvKiBmcmludC5kLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezgxLDE4LHJyLFYsViwwfSwJLyogc3FydC5zLnQgKi8KLSAgezgxLDE5LHJyLFYsViwwfSwJLyogc3FydC5kLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDNbXSA9IHsKLSAgezMyLDE4LHJyLFYsViwwfSwJLyogY3Z0ZC5zLnQgKi8KLSAgezMxLDE5LHJyLFYsViwwfSwJLyogY3Z0cy5kLnQgKi8KLSAgezMzLDE5LHJyLFYsViwwfSwJLyogY3Z0bC5kLnQgKi8KLSAgezMyLDIzLHJyLFYsViwwfSwJLyogY3Z0ZC5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezM2LDEscnIsVixWLDB9LAkvKiB0emMudCAqLwotICB7NDQsMSxycixWLFYsMH0sCS8qIGxvcC50ICovCi0gIHsxMTcsMSxycixWLFYsMH0sCS8qIHhwbmQudCAqLwotICB7NDIsMSxycixWLFYsMH0sCS8qIG5vdC50ICovCi0gIHs4LDEscnIsUyxWLDB9LAkvKiBzaGYudCAqLwotICB7MzUsMjQscnIsVixWLDB9LAkvKiBwbGMudC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNywxOCxycixWLFYsMH0sCS8qIGVxLnMudCAqLwotICB7MzcsMTkscnIsVixWLDB9LAkvKiBlcS5kLnQgKi8KLSAgezQzLDE4LHJyLFYsViwwfSwJLyogbmVnLnMudCAqLwotICB7NDMsMTkscnIsVixWLDB9LAkvKiBuZWcuZC50ICovCi0gIHszNywxOCxycixTLFYsMH0sCS8qIGVxLnMudCAqLwotICB7MzcsMTkscnIsUyxWLDB9LAkvKiBlcS5kLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezQwLDE4LHJyLFYsViwwfSwJLyogbGUucy50ICovCi0gIHs0MCwxOSxycixWLFYsMH0sCS8qIGxlLmQudCAqLwotICB7NDEsMTgscnIsVixWLDB9LAkvKiBsdC5zLnQgKi8KLSAgezQxLDE5LHJyLFYsViwwfSwJLyogbHQuZC50ICovCi0gIHs0MCwxOCxycixTLFYsMH0sCS8qIGxlLnMudCAqLwotICB7NDAsMTkscnIsUyxWLDB9LAkvKiBsZS5kLnQgKi8KLSAgezQxLDE4LHJyLFMsViwwfSwJLyogbHQucy50ICovCi0gIHs0MSwxOSxycixTLFYsMH0sCS8qIGx0LmQudCAqLwotICB7MzcsMjAscnIsVixWLDB9LAkvKiBlcS5iLnQgKi8KLSAgezM3LDIxLHJyLFYsViwwfSwJLyogZXEuaC50ICovCi0gIHszNywyMixycixWLFYsMH0sCS8qIGVxLncudCAqLwotICB7MzcsMjMscnIsVixWLDB9LAkvKiBlcS5sLnQgKi8KLSAgezM3LDIwLHJyLFMsViwwfSwJLyogZXEuYi50ICovCi0gIHszNywyMSxycixTLFYsMH0sCS8qIGVxLmgudCAqLwotICB7MzcsMjIscnIsUyxWLDB9LAkvKiBlcS53LnQgKi8KLSAgezM3LDIzLHJyLFMsViwwfSwJLyogZXEubC50ICovCi0gIHs0MCwyMCxycixWLFYsMH0sCS8qIGxlLmIudCAqLwotICB7NDAsMjEscnIsVixWLDB9LAkvKiBsZS5oLnQgKi8KLSAgezQwLDIyLHJyLFYsViwwfSwJLyogbGUudy50ICovCi0gIHs0MCwyMyxycixWLFYsMH0sCS8qIGxlLmwudCAqLwotICB7NDAsMjAscnIsUyxWLDB9LAkvKiBsZS5iLnQgKi8KLSAgezQwLDIxLHJyLFMsViwwfSwJLyogbGUuaC50ICovCi0gIHs0MCwyMixycixTLFYsMH0sCS8qIGxlLncudCAqLwotICB7NDAsMjMscnIsUyxWLDB9LAkvKiBsZS5sLnQgKi8KLSAgezQxLDIwLHJyLFYsViwwfSwJLyogbHQuYi50ICovCi0gIHs0MSwyMSxycixWLFYsMH0sCS8qIGx0LmgudCAqLwotICB7NDEsMjIscnIsVixWLDB9LAkvKiBsdC53LnQgKi8KLSAgezQxLDIzLHJyLFYsViwwfSwJLyogbHQubC50ICovCi0gIHs0MSwyMCxycixTLFYsMH0sCS8qIGx0LmIudCAqLwotICB7NDEsMjEscnIsUyxWLDB9LAkvKiBsdC5oLnQgKi8KLSAgezQxLDIyLHJyLFMsViwwfSwJLyogbHQudy50ICovCi0gIHs0MSwyMyxycixTLFYsMH0sCS8qIGx0LmwudCAqLwotICB7NDMsMjAscnIsVixWLDB9LAkvKiBuZWcuYi50ICovCi0gIHs0MywyMSxycixWLFYsMH0sCS8qIG5lZy5oLnQgKi8KLSAgezQzLDIyLHJyLFYsViwwfSwJLyogbmVnLncudCAqLwotICB7NDMsMjMscnIsVixWLDB9LAkvKiBuZWcubC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQ0W10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQ1W10gPSB7Ci0gIHs1MSwyMCxycixWLFYsMH0sCS8qIGxkdmkuYi50ICovCi0gIHs1MSwyMSxycixWLFYsMH0sCS8qIGxkdmkuaC50ICovCi0gIHs1MSwyMixycixWLFYsMH0sCS8qIGxkdmkudy50ICovCi0gIHs1MSwyMyxycixWLFYsMH0sCS8qIGxkdmkubC50ICovCi0gIHsyOCwxOCxycixWLFYsMH0sCS8qIGN2dHcucy50ICovCi0gIHszMSwyMixycixWLFYsMH0sCS8qIGN2dHMudy50ICovCi0gIHsyOCwyMyxycixWLFYsMH0sCS8qIGN2dHcubC50ICovCi0gIHszMywyMixycixWLFYsMH0sCS8qIGN2dGwudy50ICovCi0gIHs1MiwyMCxyeHIsVixWLDB9LAkvKiBzdHZpLmIudCAqLwotICB7NTIsMjEscnhyLFYsViwwfSwJLyogc3R2aS5oLnQgKi8KLSAgezUyLDIyLHJ4cixWLFYsMH0sCS8qIHN0dmkudy50ICovCi0gIHs1MiwyMyxyeHIsVixWLDB9LAkvKiBzdHZpLmwudCAqLwotICB7NTIsMjAscnhyLFMsViwwfSwJLyogc3R2aS5iLnQgKi8KLSAgezUyLDIxLHJ4cixTLFYsMH0sCS8qIHN0dmkuaC50ICovCi0gIHs1MiwyMixyeHIsUyxWLDB9LAkvKiBzdHZpLncudCAqLwotICB7NTIsMjMscnhyLFMsViwwfSwJLyogc3R2aS5sLnQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDZbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDdbXSA9IHsKLSAgezg0LDIwLHIsViwwLDB9LAkvKiBzdW0uYi50ICovCi0gIHs4NCwyMSxyLFYsMCwwfSwJLyogc3VtLmgudCAqLwotICB7ODQsMjIscixWLDAsMH0sCS8qIHN1bS53LnQgKi8KLSAgezg0LDIzLHIsViwwLDB9LAkvKiBzdW0ubC50ICovCi0gIHs4NSwxLHIsViwwLDB9LAkvKiBhbGwudCAqLwotICB7ODYsMSxyLFYsMCwwfSwJLyogYW55LnQgKi8KLSAgezg3LDEscixWLDAsMH0sCS8qIHBhcml0eS50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4OCwyMCxyLFYsMCwwfSwJLyogbWF4LmIudCAqLwotICB7ODgsMjEscixWLDAsMH0sCS8qIG1heC5oLnQgKi8KLSAgezg4LDIyLHIsViwwLDB9LAkvKiBtYXgudy50ICovCi0gIHs4OCwyMyxyLFYsMCwwfSwJLyogbWF4LmwudCAqLwotICB7ODksMjAscixWLDAsMH0sCS8qIG1pbi5iLnQgKi8KLSAgezg5LDIxLHIsViwwLDB9LAkvKiBtaW4uaC50ICovCi0gIHs4OSwyMixyLFYsMCwwfSwJLyogbWluLncudCAqLwotICB7ODksMjMscixWLDAsMH0sCS8qIG1pbi5sLnQgKi8KLSAgezg0LDE4LHIsViwwLDB9LAkvKiBzdW0ucy50ICovCi0gIHs4NCwxOSxyLFYsMCwwfSwJLyogc3VtLmQudCAqLwotICB7OTAsMTgscixWLDAsMH0sCS8qIHByb2Qucy50ICovCi0gIHs5MCwxOSxyLFYsMCwwfSwJLyogcHJvZC5kLnQgKi8KLSAgezg4LDE4LHIsViwwLDB9LAkvKiBtYXgucy50ICovCi0gIHs4OCwxOSxyLFYsMCwwfSwJLyogbWF4LmQudCAqLwotICB7ODksMTgscixWLDAsMH0sCS8qIG1pbi5zLnQgKi8KLSAgezg5LDE5LHIsViwwLDB9LAkvKiBtaW4uZC50ICovCi0gIHs5MCwyMCxyLFYsMCwwfSwJLyogcHJvZC5iLnQgKi8KLSAgezkwLDIxLHIsViwwLDB9LAkvKiBwcm9kLmgudCAqLwotICB7OTAsMjIscixWLDAsMH0sCS8qIHByb2Qudy50ICovCi0gIHs5MCwyMyxyLFYsMCwwfSwJLyogcHJvZC5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLWNoYXIgKmxvcFtdID0gewotICAibW92IiwJLyogMCAqLwotICAibWVyZyIsCS8qIDEgKi8KLSAgIm1hc2siLAkvKiAyICovCi0gICJtdWwiLAkvKiAzICovCi0gICJkaXYiLAkvKiA0ICovCi0gICJhbmQiLAkvKiA1ICovCi0gICJvciIsCS8qIDYgKi8KLSAgInhvciIsCS8qIDcgKi8KLSAgInNoZiIsCS8qIDggKi8KLSAgImFkZCIsCS8qIDkgKi8KLSAgInN1YiIsCS8qIDEwICovCi0gICJleGl0IiwJLyogMTEgKi8KLSAgImptcCIsCS8qIDEyICovCi0gICJqbXBpIiwJLyogMTMgKi8KLSAgImptcGEiLAkvKiAxNCAqLwotICAiam1wcyIsCS8qIDE1ICovCi0gICJ0YWMiLAkvKiAxNiAqLwotICAibGRlYSIsCS8qIDE3ICovCi0gICJsZCIsCS8qIDE4ICovCi0gICJ0YXMiLAkvKiAxOSAqLwotICAicHNoZWEiLAkvKiAyMCAqLwotICAic3QiLAkvKiAyMSAqLwotICAiY2FsbCIsCS8qIDIyICovCi0gICJjYWxscyIsCS8qIDIzICovCi0gICJjYWxscSIsCS8qIDI0ICovCi0gICJwZm9yayIsCS8qIDI1ICovCi0gICJzdGUiLAkvKiAyNiAqLwotICAiaW5jciIsCS8qIDI3ICovCi0gICJjdnR3IiwJLyogMjggKi8KLSAgImN2dGIiLAkvKiAyOSAqLwotICAiY3Z0aCIsCS8qIDMwICovCi0gICJjdnRzIiwJLyogMzEgKi8KLSAgImN2dGQiLAkvKiAzMiAqLwotICAiY3Z0bCIsCS8qIDMzICovCi0gICJsZHBhIiwJLyogMzQgKi8KLSAgInBsYyIsCS8qIDM1ICovCi0gICJ0emMiLAkvKiAzNiAqLwotICAiZXEiLAkvKiAzNyAqLwotICAibGV1IiwJLyogMzggKi8KLSAgImx0dSIsCS8qIDM5ICovCi0gICJsZSIsCS8qIDQwICovCi0gICJsdCIsCS8qIDQxICovCi0gICJub3QiLAkvKiA0MiAqLwotICAibmVnIiwJLyogNDMgKi8KLSAgImxvcCIsCS8qIDQ0ICovCi0gICJjcHJzIiwJLyogNDUgKi8KLSAgIm5vcCIsCS8qIDQ2ICovCi0gICJiciIsCS8qIDQ3ICovCi0gICJicmkiLAkvKiA0OCAqLwotICAiYnJhIiwJLyogNDkgKi8KLSAgImJycyIsCS8qIDUwICovCi0gICJsZHZpIiwJLyogNTEgKi8KLSAgInN0dmkiLAkvKiA1MiAqLwotICAibGRzZHIiLAkvKiA1MyAqLwotICAibGRrZHIiLAkvKiA1NCAqLwotICAibG4iLAkvKiA1NSAqLwotICAicGF0dSIsCS8qIDU2ICovCi0gICJwYXRlIiwJLyogNTcgKi8KLSAgInBpY2giLAkvKiA1OCAqLwotICAicGxjaCIsCS8qIDU5ICovCi0gICJpZGxlIiwJLyogNjAgKi8KLSAgInJ0bnEiLAkvKiA2MSAqLwotICAiY2ZvcmsiLAkvKiA2MiAqLwotICAicnRuIiwJLyogNjMgKi8KLSAgIndmb3JrIiwJLyogNjQgKi8KLSAgImpvaW4iLAkvKiA2NSAqLwotICAicnRuYyIsCS8qIDY2ICovCi0gICJleHAiLAkvKiA2NyAqLwotICAic2luIiwJLyogNjggKi8KLSAgImNvcyIsCS8qIDY5ICovCi0gICJwc2giLAkvKiA3MCAqLwotICAicG9wIiwJLyogNzEgKi8KLSAgImVuaSIsCS8qIDcyICovCi0gICJkc2kiLAkvKiA3MyAqLwotICAiYmtwdCIsCS8qIDc0ICovCi0gICJtc3luYyIsCS8qIDc1ICovCi0gICJtc2tpIiwJLyogNzYgKi8KLSAgInhtdGkiLAkvKiA3NyAqLwotICAidHN0dnYiLAkvKiA3OCAqLwotICAiZGlhZyIsCS8qIDc5ICovCi0gICJwYmtwdCIsCS8qIDgwICovCi0gICJzcXJ0IiwJLyogODEgKi8KLSAgImNhc3IiLAkvKiA4MiAqLwotICAiYXRhbiIsCS8qIDgzICovCi0gICJzdW0iLAkvKiA4NCAqLwotICAiYWxsIiwJLyogODUgKi8KLSAgImFueSIsCS8qIDg2ICovCi0gICJwYXJpdHkiLAkvKiA4NyAqLwotICAibWF4IiwJLyogODggKi8KLSAgIm1pbiIsCS8qIDg5ICovCi0gICJwcm9kIiwJLyogOTAgKi8KLSAgImhhbHQiLAkvKiA5MSAqLwotICAic3lzYyIsCS8qIDkyICovCi0gICJ0cmFwIiwJLyogOTMgKi8KLSAgInRzdCIsCS8qIDk0ICovCi0gICJsY2siLAkvKiA5NSAqLwotICAidWxrIiwJLyogOTYgKi8KLSAgInNwYXduIiwJLyogOTcgKi8KLSAgImxkY21yIiwJLyogOTggKi8KLSAgInN0Y21yIiwJLyogOTkgKi8KLSAgInBvcHIiLAkvKiAxMDAgKi8KLSAgInBzaHIiLAkvKiAxMDEgKi8KLSAgInJjdnIiLAkvKiAxMDIgKi8KLSAgIm1hdG0iLAkvKiAxMDMgKi8KLSAgInNuZHIiLAkvKiAxMDQgKi8KLSAgInB1dHIiLAkvKiAxMDUgKi8KLSAgImdldHIiLAkvKiAxMDYgKi8KLSAgIm1hdHIiLAkvKiAxMDcgKi8KLSAgIm1hdCIsCS8qIDEwOCAqLwotICAiZ2V0IiwJLyogMTA5ICovCi0gICJyY3YiLAkvKiAxMTAgKi8KLSAgImluYyIsCS8qIDExMSAqLwotICAicHV0IiwJLyogMTEyICovCi0gICJzbmQiLAkvKiAxMTMgKi8KLSAgImVuYWwiLAkvKiAxMTQgKi8KLSAgImVuYWciLAkvKiAxMTUgKi8KLSAgImZyaW50IiwJLyogMTE2ICovCi0gICJ4cG5kIiwJLyogMTE3ICovCi0gICJjdHJzbCIsCS8qIDExOCAqLwotICAiY3Ryc2ciLAkvKiAxMTkgKi8KLSAgInN0b3AiLAkvKiAxMjAgKi8KLX07Ci0KLWNoYXIgKnJvcFtdID0gewotICAiIiwJLyogMCAqLwotICAiLnQiLAkvKiAxICovCi0gICIuZiIsCS8qIDIgKi8KLSAgIi5zIiwJLyogMyAqLwotICAiLmQiLAkvKiA0ICovCi0gICIuYiIsCS8qIDUgKi8KLSAgIi5oIiwJLyogNiAqLwotICAiLnciLAkvKiA3ICovCi0gICIubCIsCS8qIDggKi8KLSAgIi54IiwJLyogOSAqLwotICAiLnUiLAkvKiAxMCAqLwotICAiLnMuZiIsCS8qIDExICovCi0gICIuZC5mIiwJLyogMTIgKi8KLSAgIi5iLmYiLAkvKiAxMyAqLwotICAiLmguZiIsCS8qIDE0ICovCi0gICIudy5mIiwJLyogMTUgKi8KLSAgIi5sLmYiLAkvKiAxNiAqLwotICAiLnQuZiIsCS8qIDE3ICovCi0gICIucy50IiwJLyogMTggKi8KLSAgIi5kLnQiLAkvKiAxOSAqLwotICAiLmIudCIsCS8qIDIwICovCi0gICIuaC50IiwJLyogMjEgKi8KLSAgIi53LnQiLAkvKiAyMiAqLwotICAiLmwudCIsCS8qIDIzICovCi0gICIudC50IiwJLyogMjQgKi8KLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9kMTB2LmggYi9pbmNsdWRlL29wY29kZS9kMTB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNmQzMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvZDEwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qIGQxMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgRDEwViBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKSwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBEMTBWX0gKLSNkZWZpbmUgRDEwVl9ICi0KLS8qIEZvcm1hdCBTcGVjaWZpZXIgKi8KLSNkZWZpbmUgRk0wMAkwCi0jZGVmaW5lIEZNMDEJMHg0MDAwMDAwMAotI2RlZmluZSBGTTEwCTB4ODAwMDAwMDAKLSNkZWZpbmUgRk0xMQkweEMwMDAwMDAwCi0KLSNkZWZpbmUgTk9QIDB4NWUwMAotI2RlZmluZSBPUENPREVfRElWUwkweDE0MDAyODAwCi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQxMHZfb3Bjb2RlLiAgKi8KLQotc3RydWN0IGQxMHZfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogdGhlIG9wY29kZSBmb3JtYXQgKi8KLSAgaW50IGZvcm1hdDsKLQotICAvKiBUaGVzZSBudW1iZXJzIHdlcmUgcGlja2VkIHNvIHdlIGNhbiBkbyBpZiggaSAmIFNIT1JUX09QQ09ERSkgKi8KLSNkZWZpbmUgU0hPUlRfT1BDT0RFIDEKLSNkZWZpbmUgTE9OR19PUENPREUgIDgKLSNkZWZpbmUgU0hPUlRfMgkgICAgIDEJCS8qIHNob3J0IHdpdGggMiBvcGVyYW5kcyAqLwotI2RlZmluZSBTSE9SVF9CCSAgICAgMwkJLyogc2hvcnQgd2l0aCA4LWJpdCBicmFuY2ggKi8KLSNkZWZpbmUgTE9OR19CCSAgICAgOAkJLyogbG9uZyB3aXRoIDE2LWJpdCBicmFuY2ggKi8KLSNkZWZpbmUgTE9OR19MICAgICAgIDEwCQkvKiBsb25nIHdpdGggMyBvcGVyYW5kcyAqLwotI2RlZmluZSBMT05HX1IgICAgICAgMTIJCS8qIHJlc2VydmVkICovCi0KLSAgLyoganVzdCBhIHBsYWNlaG9sZGVyIGZvciB2YXJpYWJsZS1sZW5ndGggaW5zdHJ1Y3Rpb25zICovCi0gIC8qIGZvciBleGFtcGxlLCAiYnJhIiB3aWxsIGJlIGEgZmFrZSBmb3IgImJyYS5zIiBhbmQgYnJhLmwiICovCi0gIC8qIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgZm9sbG93IGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotI2RlZmluZSBPUENPREVfRkFLRSAgMzIKLQotICAvKiB0aGUgbnVtYmVyIG9mIGN5Y2xlcyAqLwotICBpbnQgY3ljbGVzOwotCi0gIC8qIHRoZSBleGVjdXRpb24gdW5pdChzKSB1c2VkICovCi0gIGludCB1bml0OwotI2RlZmluZSBFSVRIRVIJMAotI2RlZmluZSBJVQkxCi0jZGVmaW5lIE1VCTIKLSNkZWZpbmUgQk9USAkzCi0KLSAgLyogZXhlY3V0aW9uIHR5cGU7IHBhcmFsbGVsIG9yIHNlcXVlbnRpYWwgKi8KLSAgLyogdGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlY2lkZSBpZiB0d28gaW5zdHJ1Y3Rpb25zICovCi0gIC8qIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCAqLwotICBpbnQgZXhlY190eXBlOwotI2RlZmluZSBQQVJPTkxZIDEJLyogcGFyYWxsZWwgb25seSAqLwotI2RlZmluZSBTRVEJMgkvKiBtdXN0IGJlIHNlcXVlbnRpYWwgKi8KLSNkZWZpbmUgUEFSCTQJLyogbWF5IGJlIHBhcmFsbGVsICovCi0jZGVmaW5lIEJSQU5DSF9MSU5LIDgJLyogc3Vicm91dGluZSBjYWxsLiAgbXVzdCBiZSBhbGlnbmVkICovCi0jZGVmaW5lIFJNRU0gICAgIDE2CS8qIHJlYWRzIG1lbW9yeSAqLwotI2RlZmluZSBXTUVNICAgICAzMgkvKiB3cml0ZXMgbWVtb3J5ICovCi0jZGVmaW5lIFJGMCAgICAgIDY0CS8qIHJlYWRzIGYwICovCi0jZGVmaW5lIFdGMCAgICAgMTI4CS8qIG1vZGlmaWVzIGYwICovCi0jZGVmaW5lIFdDQVIgICAgMjU2CS8qIHdyaXRlIENhcnJ5ICovCi0jZGVmaW5lIEJSQU5DSCAgNTEyCS8qIGJyYW5jaCwgbm8gbGluayAqLwotCi0gIC8qIHRoZSBvcGNvZGUgKi8KLSAgbG9uZyBvcGNvZGU7Ci0KLSAgLyogbWFzay4gIGlmKCAoaSAmIG1hc2spID09IG9wY29kZSApIHRoZW4gbWF0Y2ggKi8KLSAgbG9uZyBtYXNrOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbNl07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IGQxMHZfb3Bjb2RlIGQxMHZfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBkMTB2X251bV9vcGNvZGVzOwotCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQxMHZfb3BlcmFuZC4gICovCi1zdHJ1Y3QgZDEwdl9vcGVyYW5kCi17Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGludCBzaGlmdDsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIGludCBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgZDEwdl9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMTB2X29wZXJhbmQgZDEwdl9vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGQxMHZfb3BlcmFuZC4gICovCi0KLS8qIHRoZSBvcGVyYW5kIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9FVkVOCSgxKQotCi0vKiB0aGUgb3BlcmFuZCBtdXN0IGJlIGFuIG9kZCBudW1iZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9PREQJKDIpCQotCi0vKiB0aGlzIGlzIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlcjsgaXQgd2lsbCBiZSBtb2RpZmllZCAqLwotLyogdGhpcyBpcyB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9ERVNUCSg0KQotCi0vKiBudW1iZXIgb3Igc3ltYm9sICovCi0jZGVmaW5lIE9QRVJBTkRfTlVNCSg4KQotCi0vKiBhZGRyZXNzIG9yIGxhYmVsICovCi0jZGVmaW5lIE9QRVJBTkRfQUREUgkoMHgxMCkKLQotLyogcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9SRUcJKDB4MjApCi0KLS8qIHBvc3RpbmNyZW1lbnQgKyAgKi8KLSNkZWZpbmUgT1BFUkFORF9QTFVTCSgweDQwKQotCi0vKiBwb3N0ZGVjcmVtZW50IC0gICovCi0jZGVmaW5lIE9QRVJBTkRfTUlOVVMJKDB4ODApCi0KLS8qIEAgICovCi0jZGVmaW5lIE9QRVJBTkRfQVRTSUdOCSgweDEwMCkKLQotLyogQCggICovCi0jZGVmaW5lIE9QRVJBTkRfQVRQQVIJKDB4MjAwKQotCi0vKiBhY2N1bXVsYXRvciAwICovCi0jZGVmaW5lIE9QRVJBTkRfQUNDMAkoMHg0MDApCi0KLS8qIGFjY3VtdWxhdG9yIDEgKi8KLSNkZWZpbmUgT1BFUkFORF9BQ0MxCSgweDgwMCkKLQotLyogZjAgLyBmMSBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfRkZMQUcJKDB4MTAwMCkKLQotLyogYyBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfQ0ZMQUcJKDB4MjAwMCkKLQotLyogY29udHJvbCByZWdpc3RlciAgKi8KLSNkZWZpbmUgT1BFUkFORF9DT05UUk9MCSgweDQwMDApCi0KLS8qIHByZWRlY3JlbWVudCBtb2RlICdALXNwJyAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVE1JTlVTCSgweDgwMDApCi0KLS8qIHNpZ25lZCBudW1iZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9TSUdORUQJKDB4MTAwMDApCi0KLS8qIHNwZWNpYWwgYWNjdW11bGF0b3Igc2hpZnRzIG5lZWQgYSA0LWJpdCBudW1iZXIgKi8KLS8qIDEgPD0geCA8PSAxNiAqLwotI2RlZmluZSBPUEVSQU5EX1NISUZUCSgweDIwMDAwKQotCi0vKiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9HUFIJKDB4NDAwMDApCi0KLS8qIHNwZWNpYWwgaW1tMyB2YWx1ZXMgd2l0aCByYW5nZSByZXN0cmljdGVkIHRvIC0yIDw9IGltbTMgPD0gMyAqLwotLyogbmVlZGVkIGZvciByYWMvcmFjaGkgKi8KLSNkZWZpbmUgUkVTVFJJQ1RFRF9OVU0zCSgweDgwMDAwKQotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi17Ci0gIGNoYXIgKm5hbWU7CQkvKiBuYW1lIHRvIHJlY29nbml6ZSAqLwotICBjaGFyICpwbmFtZTsJCS8qIG5hbWUgdG8gcHJpbnQgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwZF9yZWcgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tdOwotaW50IGQxMHZfcmVnX25hbWVfY250KCk7Ci0KLS8qIGFuIGV4cHJlc3Npb25TIG9ubHkgaGFzIG9uZSByZWdpc3RlciB0eXBlLCBzbyB3ZSBmYWtlIGl0ICovCi0vKiBieSBzZXR0aW5nIGhpZ2ggYml0cyB0byBpbmRpY2F0ZSB0eXBlICovCi0jZGVmaW5lIFJFR0lTVEVSX01BU0sJMHhGRgotCi0jZW5kaWYgLyogRDEwVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9kMzB2LmggYi9pbmNsdWRlL29wY29kZS9kMzB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzdjMzYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvZDMwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qIGQzMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgRDMwViBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKSwgQ3lnbnVzIFNvbHV0aW9ucwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEQzMFZfSAotI2RlZmluZSBEMzBWX0gKLQotI2RlZmluZSBOT1AgMHgwMEYwMDAwMAotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi17Ci0gIGNoYXIgKm5hbWU7CQkvKiBuYW1lIHRvIHJlY29nbml6ZSAqLwotICBjaGFyICpwbmFtZTsJCS8qIG5hbWUgdG8gcHJpbnQgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW107Ci1pbnQgcmVnX25hbWVfY250KCk7Ci0KLS8qIHRoZSBudW1iZXIgb2YgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTUFYX0NPTlRST0xfUkVHCTY0Ci0KLS8qIGRlZmluZSB0aGUgZm9ybWF0IHNwZWNpZmllcnMgKi8KLSNkZWZpbmUgRk0wMAkwCi0jZGVmaW5lIEZNMDEJMHg4MDAwMDAwMAotI2RlZmluZSBGTTEwCTB4ODAwMDAwMDAwMDAwMDAwMExMCi0jZGVmaW5lIEZNMTEJMHg4MDAwMDAwMDgwMDAwMDAwTEwKLQotLyogZGVmaW5lIHRoZSBvcGNvZGUgY2xhc3NlcyAqLwotI2RlZmluZSBCUkEJMAotI2RlZmluZSBMT0dJQwkxCi0jZGVmaW5lIElNRU0JMgotI2RlZmluZSBJQUxVMQk0Ci0jZGVmaW5lIElBTFUyCTUKLQotLyogZGVmaW5lIHRoZSBleGVjdXRpb24gY29uZGl0aW9uIGNvZGVzICovCi0jZGVmaW5lIEVDQ19BTAkwCS8qIEFMd2F5cyAoZGVmYXVsdCkgKi8KLSNkZWZpbmUgRUNDX1RYCTEJLyogRjA9VHJ1ZSwgRjE9RG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFQ0NfRlgJMgkvKiBGMD1GYWxzZSwgRjE9RG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFQ0NfWFQJMwkvKiBGMD1Eb24ndCBjYXJlLCBGMT1UcnVlICovCi0jZGVmaW5lIEVDQ19YRgk0CS8qIEYwPURvbid0IGNhcmUsIEYxPUZhbHNlICovCi0jZGVmaW5lIEVDQ19UVAk1CS8qIEYwPVRydWUsIEYxPVRydWUgKi8KLSNkZWZpbmUgRUNDX1RGCTYJLyogRjA9VHJ1ZSwgRjE9RmFsc2UgKi8KLSNkZWZpbmUgRUNDX1JFU0VSVkVECTcJLyogcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgRUNDX01BWAlFQ0NfUkVTRVJWRUQKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmQzMHZfZWNjX25hbWVzW107Ci0KLS8qIGNvbmRpdGlvbiBjb2RlIHRhYmxlIGZvciBDTVAgYW5kIENNUFUgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkMzB2X2NjX25hbWVzW107Ci0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfb3Bjb2RlLiAgKi8KLXN0cnVjdCBkMzB2X29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIHRoZSBvcGNvZGUgKi8KLSAgaW50IG9wMTsJLyogZmlyc3QgcGFydCwgIklBTFUxIiBmb3IgZXhhbXBsZSAqLwotICBpbnQgb3AyOwkvKiB0aGUgcmVzdCBvZiB0aGUgb3Bjb2RlICovCi0KLSAgLyogb3Bjb2RlIGZvcm1hdChzKS4gIFRoZXNlIG51bWJlcnMgY29ycmVzcG9uZCB0byBlbnRyaWVzICovCi0gIC8qIGluIHRoZSBkMzB2X2Zvcm1hdF90YWJsZSAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdFs0XTsKLQotI2RlZmluZSBTSE9SVF9NCQkxCi0jZGVmaW5lIFNIT1JUX00yCTUJLyogZm9yIGxkMncgYW5kIHN0MncgKi8KLSNkZWZpbmUgU0hPUlRfQQkJOQotI2RlZmluZSBTSE9SVF9CMQkxMQotI2RlZmluZSBTSE9SVF9CMgkxMgotI2RlZmluZSBTSE9SVF9CMwkxMwotI2RlZmluZSBTSE9SVF9CM2IJMTUKLSNkZWZpbmUgU0hPUlRfRDEJMTcKLSNkZWZpbmUgU0hPUlRfRDIJMTkKLSNkZWZpbmUgU0hPUlRfRDJCCTIxCi0jZGVmaW5lIFNIT1JUX1UJCTIzCS8qIHVuYXJ5IFNIT1JUX0EuICBBQlMgZm9yIGV4YW1wbGUgKi8KLSNkZWZpbmUgU0hPUlRfRgkJMjUJLyogU0hPUlRfQSB3aXRoIGZsYWcgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNIT1JUX0FGCTI3CS8qIFNIT1JUX0Egd2l0aCBvbmx5IHRoZSBmaXJzdCByZWdpc3RlciBhIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0hPUlRfVAkJMjkJLyogZm9yIHRyYXAgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgU0hPUlRfQTUJMzAJLyogU0hPUlRfQSB3aXRoIGEgNS1iaXQgaW1tZWRpYXRlIGluc3RlYWQgb2YgNiAqLwotI2RlZmluZSBTSE9SVF9DTVAJMzIJLyogc3BlY2lhbCBmb3JtIGZvciBDTVBjYyAqLwotI2RlZmluZSBTSE9SVF9DTVBVCTM0CS8qIHNwZWNpYWwgZm9ybSBmb3IgQ01QVWNjICovCi0jZGVmaW5lIFNIT1JUX0ExCTM2CS8qIHNwZWNpYWwgZm9ybSBvZiBTSE9SVF9BIGZvciBNQUNhIG9wY29kZXMgd2hlcmUgYT0xICovCi0jZGVmaW5lIFNIT1JUX0FBCTM4CS8qIFNIT1JUX0Egd2l0aCB0aGUgZmlyc3QgcmVnaXN0ZXIgYW4gYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgU0hPUlRfUkEJNDAJLyogU0hPUlRfQSB3aXRoIHRoZSBzZWNvbmQgcmVnaXN0ZXIgYW4gYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgU0hPUlRfTU9ESU5DCTQyCQotI2RlZmluZSBTSE9SVF9NT0RERUMJNDMKLSNkZWZpbmUgU0hPUlRfQzEJNDQKLSNkZWZpbmUgU0hPUlRfQzIJNDUKLSNkZWZpbmUgU0hPUlRfVUYJNDYKLSNkZWZpbmUgU0hPUlRfQTIJNDcKLSNkZWZpbmUgU0hPUlRfQTVTCTQ5Ci0jZGVmaW5lIFNIT1JUX05PTkUJNTEJLyogbm8gb3BlcmFuZHMgKi8KLSNkZWZpbmUgTE9ORwkJNTIKLSNkZWZpbmUgTE9OR19VCQk1MwkvKiB1bmFyeSBMT05HICovCi0jZGVmaW5lIExPTkdfQUYJCTU0CS8qIExPTkcgd2l0aCB0aGUgZmlyc3QgcmVnaXN0ZXIgYSBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIExPTkdfQ01QCTU1CS8qIHNwZWNpYWwgZm9ybSBmb3IgQ01QY2MgYW5kIENNUFVjYyAqLwotI2RlZmluZSBMT05HX00JCTU2CS8qIE1lbW9yeSBsb25nIGZvciBsZGIsIHN0YiAqLwotI2RlZmluZSBMT05HX00yCQk1NwkvKiBNZW1vcnkgbG9uZyBmb3IgbGQydywgc3QydyAqLwotI2RlZmluZSBMT05HXzIJCTU4CS8qIExPTkcgd2l0aCAyIG9wZXJhbmRzOyBicmF0bnogKi8KLSNkZWZpbmUgTE9OR18yYgkJNTkJLyogTE9OR18yIHdpdGggbW9kaWZpZXIgb2YgMyAqLwotI2RlZmluZSBMT05HX0QJCTYwCS8qIGZvciBEQlJBSSovCi0jZGVmaW5lIExPTkdfRGIJCTYxCS8qIGZvciByZXBlYXRpKi8KLSNkZWZpbmUgU0hPUlRfQVIJNjIJLyogbGlrZSBTSE9SVF9BQSBidXQgb25seSBhY2NlcHQgcmVnaXN0ZXIgYXMgdGhpcmQgcGFyYW1ldGVyICAqLwotCi0gIC8qIHRoZSBleGVjdXRpb24gdW5pdChzKSB1c2VkICovCi0gIGludCB1bml0OwotI2RlZmluZSBFSVRIRVIJMAotI2RlZmluZSBJVQkxCi0jZGVmaW5lIE1VCTIKLSNkZWZpbmUgRUlUSEVSX0JVVF9QUkVGRVJfTVUgMwotCi0gIC8qIHRoaXMgZmllbGQgaXMgdXNlZCB0byBkZWNpZGUgaWYgdHdvIGluc3RydWN0aW9ucyAqLwotICAvKiBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwgKi8KLSAgbG9uZyBmbGFnc191c2VkOwotICBsb25nIGZsYWdzX3NldDsKLSNkZWZpbmUgRkxBR18wCQkoMUw8PDApCi0jZGVmaW5lIEZMQUdfMQkJKDFMPDwxKQotI2RlZmluZSBGTEFHXzIJCSgxTDw8MikKLSNkZWZpbmUgRkxBR18zCQkoMUw8PDMpCi0jZGVmaW5lIEZMQUdfNAkJKDFMPDw0KQkJLyogUyAoc2F0dXJhdGlvbikgKi8KLSNkZWZpbmUgRkxBR181CQkoMUw8PDUpCQkvKiBWIChvdmVyZmxvdykgKi8KLSNkZWZpbmUgRkxBR182CQkoMUw8PDYpCQkvKiBWQSAoYWNjdW11bGF0ZWQgb3ZlcmZsb3cpICovCi0jZGVmaW5lIEZMQUdfNwkJKDFMPDw3KQkJLyogQyAoY2FycnkvYm9ycm93KSAqLwotI2RlZmluZSBGTEFHX1NNCQkoMUw8PDgpCQkvKiBTTSAoc3RhY2sgbW9kZSkgKi8KLSNkZWZpbmUgRkxBR19SUAkJKDFMPDw5KQkJLyogUlAgKHJlcGVhdCBlbmFibGUpICovCi0jZGVmaW5lIEZMQUdfQ09OVFJPTAkoMUw8PDEwKQkvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotI2RlZmluZSBGTEFHX0EwCQkoMUw8PDExKQkvKiBBMCAqLwotI2RlZmluZSBGTEFHX0ExCQkoMUw8PDEyKQkvKiBBMSAqLwotI2RlZmluZSBGTEFHX0pNUAkoMUw8PDEzKQkvKiBpbnN0cnVjdGlvbiBpcyBhIGJyYW5jaCAqLwotI2RlZmluZSBGTEFHX0pTUgkoMUw8PDE0KQkvKiBzdWJyb3V0aW5lIGNhbGwuICBtdXN0IGJlIGFsaWduZWQgKi8KLSNkZWZpbmUgRkxBR19NRU0JKDFMPDwxNSkJLyogcmVhZHMvd3JpdGVzIG1lbW9yeSAqLwotI2RlZmluZSBGTEFHXzJXT1JECSgxTDw8MTYpCS8qIDIgd29yZC80IGJ5dGUgb3BlcmF0aW9uICovCi0jZGVmaW5lIEZMQUdfTVVMMTYJKDFMPDwxNykJLyogMTYgYml0IG11bHRpcGx5ICovCi0jZGVmaW5lIEZMQUdfTVVMMzIJKDFMPDwxOCkJLyogMzIgYml0IG11bHRpcGx5ICovCi0jZGVmaW5lIEZMQUdfQUREU1VCcHBwCSgxTDw8MTkpCS8qIEFERHBwcCBvciBTVUJwcHAgKi8KLSNkZWZpbmUgRkxBR19ERUxBWQkoMUw8PDIwKQkvKiBUaGlzIGlzIGEgZGVsYXllZCBicmFuY2ggb3IganVtcCAqLwotI2RlZmluZSBGTEFHX0xLUgkoMUw8PDIxKQkvKiBpbnNuIGluIGxlZnQgc2xvdCBraWxscyByaWdodCBzbG90ICovCi0jZGVmaW5lIEZMQUdfQ1ZWQQkoRkxBR181fEZMQUdfNnxGTEFHXzcpCi0jZGVmaW5lIEZMQUdfQwkJRkxBR183Ci0jZGVmaW5lIEZMQUdfQUxMCShGTEFHXzAgfCBcCi0JCQkgRkxBR18xIHwgXAotCQkJIEZMQUdfMiB8IFwKLQkJCSBGTEFHXzMgfCBcCi0JCQkgRkxBR180IHwgXAotCQkJIEZMQUdfNSB8IFwKLQkJCSBGTEFHXzYgfCBcCi0JCQkgRkxBR183IHwgXAotCQkJIEZMQUdfU00gfCBcCi0JCQkgRkxBR19SUCB8IFwKLQkJCSBGTEFHX0NPTlRST0wpCi0KLSAgaW50IHJlbG9jX2ZsYWc7Ci0jZGVmaW5lIFJFTE9DX1BDUkVMCTEKLSNkZWZpbmUgUkVMT0NfQUJTCTIKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDMwdl9vcGNvZGUgZDMwdl9vcGNvZGVfdGFibGVbXTsKLWV4dGVybiBjb25zdCBpbnQgZDMwdl9udW1fb3Bjb2RlczsKLQotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMzB2X29wZXJhbmQuICAqLwotc3RydWN0IGQzMHZfb3BlcmFuZAotewotICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCAqLwotICBpbnQgbGVuZ3RoOwotCi0gIC8qIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIHBvc2l0aW9uIHJlbGF0aXZlIHRvIFJhICovCi0gIGludCBwb3NpdGlvbjsKLQotICAvKiBzeW50YXggZmxhZ3MuICAqLwotICBsb25nIGZsYWdzOwotfTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDMwdl9vcGVyYW5kIGQzMHZfb3BlcmFuZF90YWJsZVtdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGQzMHZfb3BlcmFuZC4gICovCi0KLS8qIHRoaXMgaXMgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyOyBpdCB3aWxsIGJlIG1vZGlmaWVkICovCi0vKiB0aGlzIGlzIHVzZWQgYnkgdGhlIG9wdGltaXplciAqLwotI2RlZmluZSBPUEVSQU5EX0RFU1QJKDEpCi0KLS8qIG51bWJlciBvciBzeW1ib2wgKi8KLSNkZWZpbmUgT1BFUkFORF9OVU0JKDIpCi0KLS8qIGFkZHJlc3Mgb3IgbGFiZWwgKi8KLSNkZWZpbmUgT1BFUkFORF9BRERSCSg0KQotCi0vKiByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX1JFRwkoOCkKLQotLyogcG9zdGluY3JlbWVudCArICAqLwotI2RlZmluZSBPUEVSQU5EX1BMVVMJKDB4MTApCi0KLS8qIHBvc3RkZWNyZW1lbnQgLSAgKi8KLSNkZWZpbmUgT1BFUkFORF9NSU5VUwkoMHgyMCkKLQotLyogc2lnbmVkIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX1NJR05FRAkoMHg0MCkKLQotLyogdGhpcyBvcGVyYW5kIG11c3QgYmUgc2hpZnRlZCBsZWZ0IGJ5IDMgKi8KLSNkZWZpbmUgT1BFUkFORF9TSElGVAkoMHg4MCkKLQotLyogZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0ZMQUcJKDB4MTAwKQotCi0vKiBjb250cm9sIHJlZ2lzdGVyICAqLwotI2RlZmluZSBPUEVSQU5EX0NPTlRST0wJKDB4MjAwKQotCi0vKiBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBPUEVSQU5EX0FDQwkoMHg0MDApCi0KLS8qIEAgICovCi0jZGVmaW5lIE9QRVJBTkRfQVRTSUdOCSgweDgwMCkKLQotLyogQCggICovCi0jZGVmaW5lIE9QRVJBTkRfQVRQQVIJKDB4MTAwMCkKLQotLyogcHJlZGVjcmVtZW50IG1vZGUgJ0Atc3AnICAqLwotI2RlZmluZSBPUEVSQU5EX0FUTUlOVVMJKDB4MjAwMCkKLQotLyogdGhpcyBvcGVyYW5kIGNoYW5nZXMgdGhlIGluc3RydWN0aW9uIG5hbWUgKi8KLS8qIGZvciBleGFtcGxlLCBDUE1jYywgQ01QVWNjICovCi0jZGVmaW5lIE9QRVJBTkRfTkFNRQkoMHg0MDAwKQotCi0vKiBmYWtlIG9wZXJhbmQgZm9yIG12dHN5cyBhbmQgbXZmc3lzICovCi0jZGVmaW5lIE9QRVJBTkRfU1BFQ0lBTAkoMHg4MDAwKQotCi0vKiBsZXQgdGhlIG9wdGltaXplciBrbm93IHRoYXQgdHdvIHJlZ2lzdGVycyBhcmUgYWZmZWN0ZWQgKi8KLSNkZWZpbmUgT1BFUkFORF8yUkVHCSgweDEwMDAwKQotCi0vKiBUaGUgZm9ybWF0IHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMzB2X2Zvcm1hdC4gICovCi1zdHJ1Y3QgZDMwdl9mb3JtYXQKLXsKLSAgaW50CWZvcm07CQkvKiBTSE9SVF9BLCBMT05HLCBldGMgKi8KLSAgaW50CW1vZGlmaWVyOwkvKiB0d28gYml0IG1vZGlmaWVyIGZvbGxvd2luZyBvcGNvZGUgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s1XTsKLX07Ci1leHRlcm4gY29uc3Qgc3RydWN0IGQzMHZfZm9ybWF0IGQzMHZfZm9ybWF0X3RhYmxlW107Ci0KLQotLyogYW4gaW5zdHJ1Y3Rpb24gaXMgZGVmaW5lZCBieSBhbiBvcGNvZGUgYW5kIGEgZm9ybWF0ICovCi0vKiBmb3IgZXhhbXBsZSwgImFkZCIgaGFzIG9uZSBvcGNvZGUsIGJ1dCB0aHJlZSBkaWZmZXJlbnQgKi8KLS8qIGZvcm1hdHMsIDIgU0hPUlRfQSBmb3JtcyBhbmQgYSBMT05HIGZvcm0uICovCi1zdHJ1Y3QgZDMwdl9pbnNuCi17Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqb3A7CS8qIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSAqLwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZvcm07CS8qIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZvcm1hdCB0YWJsZSAqLwotICBpbnQgZWNjOwkJCS8qIGV4ZWN1dGlvbiBjb25kaXRpb24gY29kZSAqLwotfTsKLQotLyogYW4gZXhwcmVzc2lvblMgb25seSBoYXMgb25lIHJlZ2lzdGVyIHR5cGUsIHNvIHdlIGZha2UgaXQgKi8KLS8qIGJ5IHNldHRpbmcgaGlnaCBiaXRzIHRvIGluZGljYXRlIHR5cGUgKi8KLSNkZWZpbmUgUkVHSVNURVJfTUFTSwkweEZGCi0KLSNlbmRpZiAvKiBEMzBWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2g4MzAwLmggYi9pbmNsdWRlL29wY29kZS9oODMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTA1ZTRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2g4MzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDQgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgSDgtMzAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBzYWNAY3lnbnVzLmNvbS4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIERlYnVnZ2VyIGFuZCBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgYXMgYSBzZXF1ZW5jZSBvZiBuaWJibGVzLgotICAgSWYgdGhlIG5pYmJsZSBoYXMgdmFsdWUgMTUgb3IgbGVzcyB0aGVuIHRoZSByZXByZXNlbnRhdGlvbiBpcyBjb21wbGV0ZS4KLSAgIE90aGVyd2lzZSwgd2UgcmVjb3JkIHdoYXQgaXQgY29udGFpbnMgd2l0aCBzZXZlcmFsIGZsYWdzLiAgKi8KLQotdHlwZWRlZiBpbnQgb3BfdHlwZTsKLQotI2RlZmluZSBIZXgwCTAKLSNkZWZpbmUgSGV4MSAJMQotI2RlZmluZSBIZXgyIAkyCi0jZGVmaW5lIEhleDMgCTMKLSNkZWZpbmUgSGV4NCAJNAotI2RlZmluZSBIZXg1IAk1Ci0jZGVmaW5lIEhleDYgCTYKLSNkZWZpbmUgSGV4NyAJNwotI2RlZmluZSBIZXg4IAk4Ci0jZGVmaW5lIEhleDkgCTkKLSNkZWZpbmUgSGV4QSAJMTAKLSNkZWZpbmUgSGV4QiAJMTEKLSNkZWZpbmUgSGV4QyAJMTIKLSNkZWZpbmUgSGV4RCAJMTMKLSNkZWZpbmUgSGV4RSAJMTQKLSNkZWZpbmUgSGV4RiAJMTUKLQotI2RlZmluZSBMXzgJCTB4MDEKLSNkZWZpbmUgTF8xNgkJMHgwMgotI2RlZmluZSBMXzMyCQkweDA0Ci0jZGVmaW5lIExfUCAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIExfMjQJCTB4MTAKLSNkZWZpbmUgTUVNUkVMQVggCTB4MjAJCQkvKiBtb3ZlIGluc24gd2hpY2ggbWF5IHJlbGF4ICovIAotI2RlZmluZSBTUkMgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBEU1QgICAgICAgICAgICAgMHg4MAotCi0jZGVmaW5lIFJFRwkJMHgxMDAKLSNkZWZpbmUgRVhSCQkweDIwMAotI2RlZmluZSBNQUNSRUcJCTB4ODAwCi0jZGVmaW5lIFNSQ19JTl9EU1QJMHg0MDAKLSNkZWZpbmUgSU1NCQkweDEwMDAKLSNkZWZpbmUgRElTUAkJMHgyMDAwCi0jZGVmaW5lIElORAkJMHg0MDAwCi0jZGVmaW5lIElOQwkJMHg4MDAwCi0jZGVmaW5lIERFQwkJMHgxMDAwMAotI2RlZmluZSBMXzMJCTB4MjAwMDAKLSNkZWZpbmUgS0JJVCAJCTB4NDAwMDAKLSNkZWZpbmUgREJJVCAgICAgICAgICAgIDB4ODAwMDAKLSNkZWZpbmUgRElTUFJFRyAgICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIElHTk9SRSAJCTB4MjAwMDAwCi0jZGVmaW5lIEUgICAgICAJCTB4NDAwMDAwCQkvKiBGSVhNRTogZW5kIG9mIG5pYmJsZSBzZXF1ZW5jZT8gKi8KLSNkZWZpbmUgTF8yCQkweDgwMDAwMAotI2RlZmluZSBCMzAgIAkJMHgxMDAwMDAwIAkJLyogYml0IDMgbXVzdCBiZSBsb3cgKi8KLSNkZWZpbmUgQjMxICAJCTB4MjAwMDAwMAkJLyogYml0IDMgbXVzdCBiZSBoaWdoICovCi0jZGVmaW5lIENDUgkJMHg0MDAwMDAwCi0jZGVmaW5lIEFCUyAgICAgICAgICAgICAweDgwMDAwMDAKLSNkZWZpbmUgQUJTSk1QCQkweDEwMDAwMDAwICAKLSNkZWZpbmUgQUJTOE1FTSAgICAgICAgIDB4MjAwMDAwMDAJCi0jZGVmaW5lIFBDUkVMICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIE1FTUlORCAgICAgICAgICAweDgwMDAwMDAwCi0KLSNkZWZpbmUgSU1NMyAJCUlNTXxMXzMKLSNkZWZpbmUgSU1NMiAJCUlNTXxMXzIKLQotI2RlZmluZSBTSVpFCQkoTF8yfExfM3xMXzh8TF8xNnxMXzMyfExfUHxMXzI0KQotI2RlZmluZSBNT0RFCQkoUkVHfElNTXxESVNQfElORHxJTkN8REVDfENDUnxBQlN8TUVNSU5EfEVYUikKLQotI2RlZmluZSBSRDggCQkoRFNUfExfOHxSRUcpCi0jZGVmaW5lIFJEMTYgCQkoRFNUfExfMTZ8UkVHKQotI2RlZmluZSBSRDMyIAkJKERTVHxMXzMyfFJFRykKLSNkZWZpbmUgUlM4IAkJKFNSQ3xMXzh8UkVHKQotI2RlZmluZSBSUzE2IAkJKFNSQ3xMXzE2fFJFRykKLSNkZWZpbmUgUlMzMgkJKFNSQ3xMXzMyfFJFRykKLQotI2RlZmluZSBSU1AgCQkoU1JDfExfUHxSRUcpCi0jZGVmaW5lIFJEUCAJCShEU1R8TF9QfFJFRykKLQotI2RlZmluZSBJTU04IAkJKElNTXxTUkN8TF84KQotI2RlZmluZSBJTU0xNiAJCShJTU18U1JDfExfMTYpCi0jZGVmaW5lIElNTTMyIAkJKElNTXxTUkN8TF8zMikKLQotI2RlZmluZSBBQlM4U1JDIAkoU1JDfEFCU3xMXzh8QUJTOE1FTSkKLSNkZWZpbmUgQUJTOERTVAkJKERTVHxBQlN8TF84fEFCUzhNRU0pCi0KLSNkZWZpbmUgRElTUDggCQkoUENSRUx8TF84KQotI2RlZmluZSBESVNQMTYgCQkoUENSRUx8TF8xNikKLQotI2RlZmluZSBESVNQOFNSQwkoRElTUHxMXzh8U1JDKQotI2RlZmluZSBESVNQMTZTUkMJKERJU1B8TF8xNnxTUkMpCi0KLSNkZWZpbmUgRElTUDhEU1QJKERJU1B8TF84fERTVCkKLSNkZWZpbmUgRElTUDE2RFNUCShESVNQfExfMTZ8RFNUKQotCi0jZGVmaW5lIEFCUzE2U1JDIAkoU1JDfEFCU3xMXzE2KQotI2RlZmluZSBBQlMxNkRTVCAJKERTVHxBQlN8TF8xNikKLSNkZWZpbmUgQUJTMjRTUkMgCShTUkN8QUJTfExfMjQpCi0jZGVmaW5lIEFCUzI0RFNUIAkoRFNUfEFCU3xMXzI0KQotI2RlZmluZSBBQlMzMlNSQyAJKFNSQ3xBQlN8TF8zMikKLSNkZWZpbmUgQUJTMzJEU1QgCShEU1R8QUJTfExfMzIpCi0KLSNkZWZpbmUgUkRERUMgCQkoRFNUfERFQykKLSNkZWZpbmUgUlNJTkMgCQkoU1JDfElOQykKLSNkZWZpbmUgUkRJTkMJCShEU1R8SU5DKQotCi0jZGVmaW5lIFJESU5EIAkJKERTVHxJTkQpCi0jZGVmaW5lIFJTSU5EIAkJKFNSQ3xJTkQpCi0KLSNpZiAxCi0jZGVmaW5lIE9SOCBSUzgJCS8qID8/PyBPUiBhcyBpbiBPbmUgUmVnaXN0ZXI/ICovCi0jZGVmaW5lIE9SMTYgUlMxNgotI2RlZmluZSBPUjMyIFJTMzIKLSNlbHNlCi0jZGVmaW5lIE9SOCBSRDgKLSNkZWZpbmUgT1IxNiBSRDE2Ci0jZGVmaW5lIE9SMzIgUkQzMgotI2VuZGlmCi0KLXN0cnVjdCBjb2RlIAotewotICBvcF90eXBlIG5pYlszMF07Ci19OwotCi1zdHJ1Y3QgYXJnIAotewotICBvcF90eXBlIG5pYlszXTsKLX07Ci0KLXN0cnVjdCBoOF9vcGNvZGUgCi17Ci0gIGludCBob3c7Ci0gIGludCBpbmJhc2U7Ci0gIGludCB0aW1lOwotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgYXJnIGFyZ3M7Ci0gIHN0cnVjdCBjb2RlIGRhdGE7Ci0gIGludCBsZW5ndGg7Ci0gIGludCBub3BlcmFuZHM7Ci0gIGludCBpZHg7Ci0gIGludCBzaXplOwotfTsKLQotI2lmZGVmIERFRklORV9UQUJMRQotCi0jZGVmaW5lIEJJVE9QKGNvZGUsIGltbSwgbmFtZSwgb3AwMCwgb3AwMSxvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKVwKLXsgY29kZSwgMSwgMiwgbmFtZSwJe3tpbW0sUkQ4LEV9fSwJe3tvcDAwLCBvcDAxLCBpbW0sIFJEOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDEsIDYsIG5hbWUsCXt7aW1tLFJESU5ELEV9fSx7e29wMTAsIG9wMTEsIEIzMHxSRElORCwgMCwgb3AwMCxvcDAxLCBpbW0sIDAsIEV9fSwgMCwgMCwgMCwgMH0sXAoteyBjb2RlLCAxLCA2LCBuYW1lLAl7e2ltbSxBQlM4RFNULEV9fSx7e29wMjAsIG9wMjEsIEFCUzhEU1QsIElHTk9SRSwgb3AwMCxvcDAxLCBpbW0sIDAsRX19LCAwLCAwLCAwLCAwfVwKLSx7IGNvZGUsIDAsIDYsIG5hbWUsCXt7aW1tLEFCUzE2RFNULEV9fSx7ezB4NiwweGEsMHgxLG9wMzAsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH0sXAoteyBjb2RlLCAwLCA2LCBuYW1lLAl7e2ltbSxBQlMzMkRTVCxFfX0se3sweDYsMHhhLDB4MyxvcDMwLEFCUzMyRFNULElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSwgb3AwMCxvcDAxLCBpbW0sIDAsRX19LCAwLCAwLCAwLCAwfQotCi0KLSNkZWZpbmUgRUJJVE9QKGNvZGUsIGltbSwgbmFtZSwgb3AwMCwgb3AwMSxvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKVwKLSAgIEJJVE9QKGNvZGUsaW1tLCBuYW1lLCBvcDAwKzEsIG9wMDEsIG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApLFwKLSAgIEJJVE9QKGNvZGUsUlM4LCAgbmFtZSwgb3AwMCwgb3AwMSwgb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMCkKLQotI2RlZmluZSBXVFdPUChjb2RlLG5hbWUsIG9wMSwgb3AyKSBcCi17IGNvZGUsIDEsIDIsIG5hbWUsIHt7UlMxNiwgUkQxNiwgRX19LCB7eyBvcDEsIG9wMiwgUlMxNiwgUkQxNiwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfQotCi0jZGVmaW5lIEJSQU5DSChjb2RlLCBuYW1lLCBvcCkgXAoteyBjb2RlLCAxLCA0LG5hbWUse3tESVNQOCxFLDB9fSwge3sgMHg0LCBvcCwgRElTUDgsIElHTk9SRSwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBjb2RlLCAwLCA2LG5hbWUse3tESVNQMTYsRSwwfX0sIHt7IDB4NSwgMHg4LCBvcCwgMHgwLCBESVNQMTYsIElHTk9SRSwgSUdOT1JFLCBJR05PUkUsIEUsMH19LCAwLCAwLCAwLCAwfSAKLQotI2RlZmluZSBTT1AoY29kZSwgeCxuYW1lKSBcCi17Y29kZSwgMSwgeCwgIG5hbWUgCi0KLSNkZWZpbmUgTkVXX1NPUChjb2RlLCBpbix4LG5hbWUpIFwKLXtjb2RlLCBpbiwgeCwgIG5hbWUgCi0jZGVmaW5lIEVPUCAgLDAsMCwwIH0KLQotI2RlZmluZSBUV09PUChjb2RlLCBuYW1lLCBvcDEsIG9wMixvcDMpIFwKLXsgY29kZSwxLCAyLG5hbWUsIHt7SU1NOCwgUkQ4LCBFfX0sCXt7IG9wMSwgUkQ4LCBJTU04LCBJR05PUkUsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sXAoteyBjb2RlLCAxLCAyLG5hbWUsIHt7UlM4LCBSRDgsIEV9fSwJe3sgb3AyLCBvcDMsIFJTOCwgUkQ4LCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9IAotCi0jZGVmaW5lIFVOT1AoY29kZSxuYW1lLCBvcDEsIG9wMikgXAoteyBjb2RlLCAxLCAyLCBuYW1lLCB7e09SOCwgRSwgMH19LCB7eyBvcDEsIG9wMiwgMCwgT1I4LCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9Ci0KLSNkZWZpbmUgVU5PUDMoY29kZSwgbmFtZSwgb3AxLCBvcDIsIG9wMykgXAoteyBPKGNvZGUsU0IpLCAxLCAyLCBuYW1lLCB7e09SOCwgIEUsIDB9fSwge3tvcDEsIG9wMiwgb3AzKzAsIE9SOCwgIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNXKSwgMCwgMiwgbmFtZSwge3tPUjE2LCBFLCAwfX0sIHt7b3AxLCBvcDIsIG9wMysxLCBPUjE2LCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IE8oY29kZSxTTCksIDAsIDIsIG5hbWUsIHt7T1IzMiwgRSwgMH19LCB7e29wMSwgb3AyLCBvcDMrMywgT1IzMnxCMzAsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0gXAotLHsgTyhjb2RlLFNCKSwgMSwgMiwgbmFtZSwge3tJTU0sIE9SOCB8IFNSQ19JTl9EU1QsICBFfX0sIHt7b3AxLCBvcDIsIG9wMys0LCBPUjggfCBTUkNfSU5fRFNULCAgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU1cpLCAwLCAyLCBuYW1lLCB7e0lNTSwgT1IxNiB8IFNSQ19JTl9EU1QsIEV9fSwge3tvcDEsIG9wMiwgb3AzKzUsIE9SMTYgfCBTUkNfSU5fRFNULCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IE8oY29kZSxTTCksIDAsIDIsIG5hbWUsIHt7SU1NLCBPUjMyIHwgU1JDX0lOX0RTVCwgRX19LCB7e29wMSwgb3AyLCBvcDMrNywgT1IzMiB8IFNSQ19JTl9EU1R8QjMwICwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfQotCi0KLSNkZWZpbmUgSU1NMzJMSVNUIElNTTMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBJTU0yNExJU1QgSU1NMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBJTU0xNkxJU1QgSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQTE2TElTVCBMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIERJU1AyNExJU1QgRElTUHxMXzI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgRElTUDMyTElTVCBESVNQfExfMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEFCUzI0TElTVCBBQlN8TF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEFCUzMyTElTVCBBQlN8TF8zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQTI0TElTVCBMXzI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQTMyTElTVCBMXzMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBQUkVGSVgzMiAweDAsMHgxLDB4MCwweDAKLSNkZWZpbmUgUFJFRklYTERDIDB4MCwweDEsMHg0LDB4MAotCi0KLSNkZWZpbmUgTyhvcCwgc2l6ZSkgKG9wKjQrc2l6ZSkKLQotI2RlZmluZSBPX1JFQ09NUElMRSAwCi0jZGVmaW5lIE9fQUREICAxCi0jZGVmaW5lIE9fQUREWCAyCi0jZGVmaW5lIE9fQU5EICAzCi0jZGVmaW5lIE9fQkFORCA0Ci0jZGVmaW5lIE9fQlJBICA1Ci0jZGVmaW5lIE9fQlJOICA2Ci0jZGVmaW5lIE9fQkhJICA3Ci0jZGVmaW5lIE9fQkxTICA4Ci0jZGVmaW5lIE9fQkNDICA5Ci0jZGVmaW5lIE9fQkNTICAxMAotI2RlZmluZSBPX0JORSAgMTEgIAotI2RlZmluZSBPX0JWQyAgMTIKLSNkZWZpbmUgT19CVlMgIDEzCi0jZGVmaW5lIE9fQlBMICAxNAotI2RlZmluZSBPX0JNSSAgMTUKLSNkZWZpbmUgT19CR0UgIDE2Ci0jZGVmaW5lIE9fQkxUICAxNwotI2RlZmluZSBPX0JHVCAgMTgKLSNkZWZpbmUgT19CTEUgIDE5Ci0jZGVmaW5lIE9fQU5EQyAyMAotI2RlZmluZSBPX0JFUSAyMQotI2RlZmluZSBPX0JDTFIgMjIKLSNkZWZpbmUgT19CSUFORCAyMwotI2RlZmluZSBPX0JJTEQgMjQKLSNkZWZpbmUgT19CSU9SIDI1Ci0jZGVmaW5lIE9fQklYT1IgMjYKLSNkZWZpbmUgT19CSVNUIDI3Ci0jZGVmaW5lIE9fQkxEIDI4Ci0jZGVmaW5lIE9fQk5PVCAyOQotI2RlZmluZSBPX0JTRVQgMzAKLSNkZWZpbmUgT19CU1IgMzEKLSNkZWZpbmUgT19CWE9SIDMyCi0jZGVmaW5lIE9fQ01QIDMzCi0jZGVmaW5lIE9fREFBIDM0Ci0jZGVmaW5lIE9fREFTIDM1Ci0jZGVmaW5lIE9fREVDIDM2Ci0jZGVmaW5lIE9fRElWVSAzNwotI2RlZmluZSBPX0RJVlMgMzgKLSNkZWZpbmUgT19JTkMgMzkKLSNkZWZpbmUgT19MREMgNDAKLSNkZWZpbmUgT19NT1ZfVE9fTUVNIDQxCi0jZGVmaW5lIE9fT1IgNDIKLSNkZWZpbmUgT19ST1RMIDQzCi0jZGVmaW5lIE9fUk9UUiA0NAotI2RlZmluZSBPX1JPVFhMIDQ1Ci0jZGVmaW5lIE9fUk9UWFIgNDYKLSNkZWZpbmUgT19CUFQgNDcKLSNkZWZpbmUgT19TSEFMIDQ4Ci0jZGVmaW5lIE9fU0hBUiA0OQotI2RlZmluZSBPX1NITEwgNTAKLSNkZWZpbmUgT19TSExSIDUxCi0jZGVmaW5lIE9fU1VCICA1MgotI2RlZmluZSBPX1NVQlMgNTMKLSNkZWZpbmUgT19UUkFQQSA1NAotI2RlZmluZSBPX1hPUiA1NQotI2RlZmluZSBPX1hPUkMgNTYKLSNkZWZpbmUgT19CT1IgNTcKLSNkZWZpbmUgT19CU1QgNTgKLSNkZWZpbmUgT19CVFNUIDU5Ci0jZGVmaW5lIE9fRUVQTU9WIDYwCi0jZGVmaW5lIE9fRVhUUyA2MQotI2RlZmluZSBPX0VYVFUgNjIKLSNkZWZpbmUgT19KTVAgNjMKLSNkZWZpbmUgT19KU1IgNjQKLSNkZWZpbmUgT19NVUxVIDY1Ci0jZGVmaW5lIE9fTVVMUyA2NgotI2RlZmluZSBPX05PUCA2NwotI2RlZmluZSBPX05PVCA2OAotI2RlZmluZSBPX09SQyA2OQotI2RlZmluZSBPX1JURSA3MAotI2RlZmluZSBPX1NUQyA3MQotI2RlZmluZSBPX1NVQlggNzIKLSNkZWZpbmUgT19ORUcgNzMKLSNkZWZpbmUgT19SVFMgNzQKLSNkZWZpbmUgT19TTEVFUCA3NQotI2RlZmluZSBPX0lMTCA3NgotI2RlZmluZSBPX0FERFMgNzcKLSNkZWZpbmUgT19TWVNDQUxMIDc4Ci0jZGVmaW5lIE9fTU9WX1RPX1JFRyA3OQotI2RlZmluZSBPX1RBUyA4MAotI2RlZmluZSBPX0NMUk1BQyA4MgotI2RlZmluZSBPX0xETUFDIDgzCi0jZGVmaW5lIE9fTUFDIDg0Ci0jZGVmaW5lIE9fTERNIDg1Ci0jZGVmaW5lIE9fU1RNIDg2Ci0jZGVmaW5lIE9fU1RNQUMgODcKLSNkZWZpbmUgT19MQVNUIDg4Ci0jZGVmaW5lIFNCIDAKLSNkZWZpbmUgU1cgMQotI2RlZmluZSBTTCAyCi0jZGVmaW5lIFNOIDMKLQotCi0vKiBGSVhNRTogTG90cyBvZiBpbnNucyBoYXZlICJFLCAwLCAwLCAwLCAwIiBpbiB0aGUgbmliYmxlIGNvZGUgc2VxdWVuY2VzLgotICAgTWV0aGlua3MgdGhlIHplcm9lcyBhcmVuJ3QgbmVjZXNzYXJ5LiAgT25jZSBjb25maXJtZWQsIG51a2UgJ2VtLiAgKi8KLQotc3RydWN0IGg4X29wY29kZSBoOF9vcGNvZGVzW10gPSAKLXsKLSAgVFdPT1AoTyhPX0FERCxTQiksImFkZC5iIiwgMHg4LCAweDAsMHg4KSwKLSAgCi0gIE5FV19TT1AoTyhPX0FERCxTVyksMSwyLCJhZGQudyIpLHt7UlMxNixSRDE2LEV9fSx7ezB4MCwweDksUlMxNixSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FERCxTVyksMCw0LCJhZGQudyIpLHt7SU1NMTYsUkQxNixFfX0se3sweDcsMHg5LDB4MSxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FERCxTTCksMCwyLCJhZGQubCIpLHt7UlMzMixSRDMyLEUgfX0sIHt7MHgwLDB4QSxCMzF8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotICBORVdfU09QKE8oT19BREQsU0wpLDAsNiwiYWRkLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgxLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19BRERTLFNMKSwxLDIsImFkZHMiKSwge3tLQklULFJEUCxFfX0sICAge3sweDAsMHhCLEtCSVQsUkRQLEUsMCwwLDAsMH19IEVPUCwKLQotICBUV09PUChPKE9fQUREWCxTQiksImFkZHgiLDB4OSwweDAsMHhFKSwKLSAgVFdPT1AoTyhPX0FORCxTQiksICJhbmQuYiIsMHhFLDB4MSwweDYpLAotCi0gIE5FV19TT1AoTyhPX0FORCxTVyksMCwyLCJhbmQudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDYsMHg2LFJTMTYsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19BTkQsU1cpLDAsNCwiYW5kLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHg2LFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgCi0gIE5FV19TT1AoTyhPX0FORCxTTCksMCw2LCJhbmQubCIpLHt7SU1NMzIsUkQzMixFIH19LHt7MHg3LDB4QSwweDYsQjMwfFJEMzIsSU1NMzJMSVNULEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FORCxTTCksMCwyLCJhbmQubCIpICx7e1JTMzIsUkQzMixFIH19LHt7MHgwLDB4MSwweEYsMHgwLDB4NiwweDYsQjMwfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19BTkRDLFNCKSwxLDIsImFuZGMiKSwge3tJTU04LENDUixFfX0se3sgMHgwLDB4NixJTU04LElHTk9SRSxFLDAsMCwwLDB9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FOREMsU0IpLDEsMiwiYW5kYyIpLCB7e0lNTTgsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NixJTU04LElHTk9SRSxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgQklUT1AoTyhPX0JBTkQsU0IpLCBJTU0zfEIzMCwiYmFuZCIsMHg3LDB4NiwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQlJBTkNIKE8oT19CUkEsU0IpLCJicmEiLDB4MCksCi0gIEJSQU5DSChPKE9fQlJBLFNCKSwiYnQiLDB4MCksCi0gIEJSQU5DSChPKE9fQlJOLFNCKSwiYnJuIiwweDEpLAotICBCUkFOQ0goTyhPX0JSTixTQiksImJmIiwweDEpLAotICBCUkFOQ0goTyhPX0JISSxTQiksImJoaSIsMHgyKSwKLSAgQlJBTkNIKE8oT19CTFMsU0IpLCJibHMiLDB4MyksCi0gIEJSQU5DSChPKE9fQkNDLFNCKSwiYmNjIiwweDQpLAotICBCUkFOQ0goTyhPX0JDQyxTQiksImJocyIsMHg0KSwKLSAgQlJBTkNIKE8oT19CQ1MsU0IpLCJiY3MiLDB4NSksCi0gIEJSQU5DSChPKE9fQkNTLFNCKSwiYmxvIiwweDUpLAotICBCUkFOQ0goTyhPX0JORSxTQiksImJuZSIsMHg2KSwKLSAgQlJBTkNIKE8oT19CRVEsU0IpLCJiZXEiLDB4NyksCi0gIEJSQU5DSChPKE9fQlZDLFNCKSwiYnZjIiwweDgpLAotICBCUkFOQ0goTyhPX0JWUyxTQiksImJ2cyIsMHg5KSwKLSAgQlJBTkNIKE8oT19CUEwsU0IpLCJicGwiLDB4QSksCi0gIEJSQU5DSChPKE9fQk1JLFNCKSwiYm1pIiwweEIpLAotICBCUkFOQ0goTyhPX0JHRSxTQiksImJnZSIsMHhDKSwKLSAgQlJBTkNIKE8oT19CTFQsU0IpLCJibHQiLDB4RCksCi0gIEJSQU5DSChPKE9fQkdULFNCKSwiYmd0IiwweEUpLAotICBCUkFOQ0goTyhPX0JMRSxTQiksImJsZSIsMHhGKSwKLQotICBFQklUT1AoTyhPX0JDTFIsU0IpLElNTTN8QjMwLCJiY2xyIiwgMHg2LDB4MiwweDcsMHhELDB4NywweEYsMHg4KSwKLSAgQklUT1AoTyhPX0JJQU5ELFNCKSxJTU0zfEIzMSwiYmlhbmQiLDB4NywweDYsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CSUxELFNCKSwgSU1NM3xCMzEsImJpbGQiLCAweDcsMHg3LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQklPUixTQiksIElNTTN8QjMxLCJiaW9yIiwgMHg3LDB4NCwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JJU1QsU0IpLCBJTU0zfEIzMSwiYmlzdCIsIDB4NiwweDcsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0gIEJJVE9QKE8oT19CSVhPUixTQiksSU1NM3xCMzEsImJpeG9yIiwweDcsMHg1LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQkxELFNCKSwgIElNTTN8QjMwLCJibGQiLCAgMHg3LDB4NywweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgRUJJVE9QKE8oT19CTk9ULFNCKSxJTU0zfEIzMCwiYm5vdCIsIDB4NiwweDEsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0gIEJJVE9QKE8oT19CT1IsU0IpLCAgSU1NM3xCMzAsImJvciIsICAweDcsMHg0LDB4NywweEMsMHg3LDB4RSwweDApLAotICBFQklUT1AoTyhPX0JTRVQsU0IpLElNTTN8QjMwLCJic2V0IiwgMHg2LDB4MCwweDcsMHhELDB4NywweEYsMHg4KSwKLQotICBTT1AoTyhPX0JTUixTQiksNiwiYnNyIikse3tESVNQOCxFLDB9fSx7eyAweDUsMHg1LERJU1A4LElHTk9SRSxFLDAsMCwwLDB9fSBFT1AsCi0gIFNPUChPKE9fQlNSLFNCKSw2LCJic3IiKSx7e0RJU1AxNixFLDB9fSx7eyAweDUsMHhDLDB4MCwweDAsRElTUDE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLSAgQklUT1AoTyhPX0JTVCxTQiksIElNTTN8QjMwLCJic3QiLDB4NiwweDcsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0gIEVCSVRPUChPKE9fQlRTVCxTQiksIElNTTN8QjMwLCJidHN0IiwweDYsMHgzLDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQlhPUixTQiksIElNTTN8QjMwLCJieG9yIiwweDcsMHg1LDB4NywweEMsMHg3LDB4RSwweDApLAotCi0gIFRXT09QKE8oT19DTVAsU0IpLCAiY21wLmIiLDB4QSwweDEsMHhDKSwKLSAgV1RXT1AoTyhPX0NNUCxTVyksICJjbXAudyIsMHgxLDB4RCksCi0KLSAgTkVXX1NPUChPKE9fQ01QLFNXKSwxLDIsImNtcC53Iikse3tSUzE2LFJEMTYsRSB9fSx7ezB4MSwweEQsUlMxNixSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0NNUCxTVyksMCw0LCJjbXAudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDIsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0NNUCxTTCksMCw2LCJjbXAubCIpLHt7SU1NMzIsUkQzMixFIH19LHt7MHg3LDB4QSwweDIsQjMwfFJEMzIsSU1NMzJMSVNULEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0NNUCxTTCksMCwyLCJjbXAubCIpICx7e1JTMzIsUkQzMixFIH19LHt7MHgxLDB4RixCMzF8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIFVOT1AoTyhPX0RBQSxTQiksICJkYWEiLDB4MCwweEYpLAotICBVTk9QKE8oT19EQVMsU0IpLCAiZGFzIiwweDEsMHhGKSwKLSAgVU5PUChPKE9fREVDLFNCKSwgImRlYy5iIiwweDEsMHhBKSwKLQotICBORVdfU09QKE8oT19ERUMsIFNXKSwwLDIsImRlYy53IikgLHt7REJJVCxSRDE2LEUgfX0se3sweDEsMHhCLDB4NXxEQklULFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fREVDLCBTTCksMCwyLCJkZWMubCIpICx7e0RCSVQsUkQzMixFIH19LHt7MHgxLDB4QiwweDd8REJJVCxSRDMyfEIzMCxFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0RJVlUsU0IpLDEsNiwiZGl2eHUuYiIpLCB7e1JTOCxSRDE2LEV9fSwge3sweDUsMHgxLFJTOCxSRDE2LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19ESVZVLFNXKSwwLDIwLCJkaXZ4dS53Iikse3tSUzE2LFJEMzIsRX19LHt7MHg1LDB4MyxSUzE2LEIzMHxSRDMyLEV9fUVPUCwKLSAgICAKLSAgTkVXX1NPUChPKE9fRElWUyxTQiksMCwyMCwiZGl2eHMuYiIpICx7e1JTOCxSRDE2LEUgfX0se3sweDAsMHgxLDB4RCwweDAsMHg1LDB4MSxSUzgsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19ESVZTLFNXKSwwLDAyLCJkaXZ4cy53IikgLHt7UlMxNixSRDMyLEUgfX0se3sweDAsMHgxLDB4RCwweDAsMHg1LDB4MyxSUzE2LEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fRUVQTU9WLFNCKSwxLDUwLCJlZXBtb3YuYiIpLHt7RSwwLDB9fSx7ezB4NywweEIsMHg1LDB4QywweDUsMHg5LDB4OCwweEYsRX19RU9QLAotICBORVdfU09QKE8oT19FRVBNT1YsU1cpLDAsNTAsImVlcG1vdi53Iikse3tFLDAsMH19LHt7MHg3LDB4QiwweEQsMHg0LDB4NSwweDksMHg4LDB4RixFfX0gRU9QLAotICAgIAotICBORVdfU09QKE8oT19FWFRTLFNXKSwwLDIsImV4dHMudyIpLHt7T1IxNixFLDB9fSx7ezB4MSwweDcsMHhELE9SMTYsRSAgIH19RU9QLAotICBORVdfU09QKE8oT19FWFRTLFNMKSwwLDIsImV4dHMubCIpLHt7T1IzMixFLDB9fSx7ezB4MSwweDcsMHhGLE9SMzJ8QjMwLEUgICB9fUVPUCwKLQotICBORVdfU09QKE8oT19FWFRVLFNXKSwwLDIsImV4dHUudyIpLHt7T1IxNixFLDB9fSx7ezB4MSwweDcsMHg1LE9SMTYsRSAgIH19RU9QLAotICBORVdfU09QKE8oT19FWFRVLFNMKSwwLDIsImV4dHUubCIpLHt7T1IzMixFLDB9fSx7ezB4MSwweDcsMHg3LE9SMzJ8QjMwLEUgICB9fUVPUCwKLSAgICAKLSAgVU5PUChPKE9fSU5DLFNCKSwgImluYyIsMHgwLDB4QSksCi0KLSAgTkVXX1NPUChPKE9fSU5DLFNXKSwwLDIsImluYy53IikgLHt7REJJVCxSRDE2LEUgfX0se3sweDAsMHhCLDB4NXxEQklULFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fSU5DLFNMKSwwLDIsImluYy5sIikgLHt7REJJVCxSRDMyLEUgfX0se3sweDAsMHhCLDB4N3xEQklULFJEMzJ8QjMwLEV9fSBFT1AsCi0KLSAgU09QKE8oT19KTVAsU0IpLDQsImptcCIpLHt7UlNJTkQsRSwwfX0se3sweDUsMHg5LEIzMHxSU0lORCwweDAsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fSk1QLFNCKSw2LCJqbXAiKSx7e1NSQ3xBQlNKTVAsRSwwfX0se3sweDUsMHhBLFNSQ3xBQlNKTVAsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fSk1QLFNCKSw4LCJqbXAiKSx7e1NSQ3xNRU1JTkQsRSwwfX0se3sweDUsMHhCLFNSQ3xNRU1JTkQsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fSlNSLFNCKSw2LCJqc3IiKSx7e1NSQ3xSU0lORCxFLDB9fSwge3sweDUsMHhELEIzMHxSU0lORCwweDAsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fSlNSLFNCKSw4LCJqc3IiKSx7e1NSQ3xBQlNKTVAsRSwwfX0se3sweDUsMHhFLFNSQ3xBQlNKTVAsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fSlNSLFNCKSw4LCJqc3IiKSx7e1NSQ3xNRU1JTkQsRSwwfX0se3sweDUsMHhGLFNSQ3xNRU1JTkQsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e0lNTTgsQ0NSLEV9fSwgICAgICAgICB7eyAweDAsMHg3LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tPUjgsQ0NSLEV9fSwgICAgICAgICAge3sgMHgwLDB4MywweDAsT1I4LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMxNlNSQyxDQ1IsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweDAsMHgwLEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMzJTUkMsQ0NSLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHgyLDB4MCxTUkN8QUJTMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8xNixDQ1IsRX19LHt7UFJFRklYTERDLDB4NiwweEYsQjMwfERJU1BSRUcsMCxESVNQfExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tESVNQfFNSQ3xMXzMyLENDUixFfX0se3tQUkVGSVhMREMsMHg3LDB4OCxCMzB8RElTUFJFRywwLDB4NiwweEIsMHgyLDB4MCxTUkN8RElTUDMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e1JTSU5DLENDUixFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHhELEIzMHxSU0lOQywweDAsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lORCxDQ1IsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4OSxCMzB8UkRJTkQsMHgwLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7SU1NOCxFWFIsRX19LCAgICAgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDAsMHg3LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tPUjgsRVhSLEV9fSwgICAgICAgICAge3sgMHgwLDB4MywweDEsT1I4LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMxNlNSQyxFWFIsRX19LCAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweGIsMHgwLDB4MCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzMyU1JDLEVYUixFfX0sICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4YiwweDIsMHgwLFNSQ3xBQlMzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tESVNQfFNSQ3xMXzE2LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweGYsQjMwfERJU1BSRUcsMCxESVNQfExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tESVNQfFNSQ3xMXzMyLEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4MiwweDAsU1JDfERJU1AzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lOQyxFWFIsRX19LCAgICAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweGQsQjMwfFJTSU5DLDB4MCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e1JTSU5ELEVYUixFfX0sICAgICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4OSxCMzB8UkRJTkQsMHgwLEV9fSBFT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw0LCJtb3YuYiIpLHt7QUJTfFNSQ3xMXzE2fE1FTVJFTEFYLFJEOCxFfX0sICB7eyAweDYsMHhBLDB4MCxSRDgsU1JDfEFCU3xNRU1SRUxBWHxBMTZMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7QUJTfFNSQ3xMXzMyfE1FTVJFTEFYLFJEOCxFIH19LCB7eyAweDYsMHhBLDB4MixSRDgsU1JDfEFCU3xNRU1SRUxBWHxBMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxBQlN8TF8xNnxNRU1SRUxBWHxEU1QsRX19LCAgICAge3sgMHg2LDB4QSwweDgsUlM4LERTVHxBQlN8TUVNUkVMQVh8QTE2TElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxBQlN8RFNUfExfMzJ8TUVNUkVMQVgsRSB9fSwgICAge3sgMHg2LDB4QSwweEEsUlM4LERTVHxBQlN8TUVNUkVMQVh8QTMyTElTVCxFIH19RU9QLAotICAgIAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDYsIm1vdi5iIikse3tESVNQfExfMzJ8U1JDLFJEOCxFfX0sICB7eyAweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhBLDB4MixSRDgsU1JDfERJU1AzMkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDYsIm1vdi5iIikse3tSUzgsRElTUHxMXzMyfERTVCxFfX0sICB7eyAweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhBLDB4QSxSUzgsRFNUfERJU1AzMkxJU1QsRX19RU9QLAotCi0KLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDIsIm1vdi5iIikse3tSUzgsUkQ4LEV9fSwJICAgIHt7IDB4MCwweEMsUlM4LFJEOCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwyLCJtb3YuYiIpLHt7SU1NOCxSRDgsRX19LCAgICAgICAgICAge3sgMHhGLFJEOCxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw0LCJtb3YuYiIpLHt7UlNJTkQsUkQ4LEV9fSwgICAgICAgICAge3sgMHg2LDB4OCxCMzB8UlNJTkQsUkQ4LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDYsIm1vdi5iIikse3tESVNQMTZTUkMsUkQ4LEV9fSwgICAgICB7eyAweDYsMHhFLEIzMHxESVNQUkVHLFJEOCxESVNQMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDYsIm1vdi5iIikse3tSU0lOQyxSRDgsRX19LCAgICAgICAgICB7eyAweDYsMHhDLEIzMHxSU0lOQyxSRDgsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw0LCJtb3YuYiIpLHt7QUJTOFNSQyxSRDgsRX19LCAgICAgICAge3sgMHgyLFJEOCxBQlM4U1JDLElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw0LCJtb3YuYiIpLHt7UlM4LFJESU5ELEV9fSwgICAgICAgICAge3sgMHg2LDB4OCxSRElORHxCMzEsUlM4LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDYsIm1vdi5iIikse3tSUzgsRElTUDE2RFNULEV9fSwgICAgICB7eyAweDYsMHhFLERJU1BSRUd8QjMxLFJTOCxESVNQMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDYsIm1vdi5iIikse3tSUzgsUkRERUN8QjMxLEV9fSwgICAgICB7eyAweDYsMHhDLFJEREVDfEIzMSxSUzgsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw0LCJtb3YuYiIpLHt7UlM4LEFCUzhEU1QsRX19LCAgICAgICAge3sgMHgzLFJTOCxBQlM4RFNULElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LFJESU5ELEV9fSwgICAgICAgIHt7IDB4NiwweDksUkRJTkR8QjMxLFJTMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNiwibW92LnciKSx7e0RJU1B8TF8zMnxTUkMsUkQxNixFfX0se3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QiwweDIsUkQxNixTUkN8RElTUDMyTElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsRElTUHxMXzMyfERTVCxFfX0se3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QiwweEEsUlMxNixEU1R8RElTUDMyTElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNiwibW92LnciKSx7e0FCU3xMXzMyfE1FTVJFTEFYfFNSQyxSRDE2LEUgfX0se3sgMHg2LDB4QiwweDIsUkQxNixTUkN8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsQUJTfExfMzJ8TUVNUkVMQVh8RFNULEUgfX0se3sgMHg2LDB4QiwweEEsUlMxNixEU1R8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksMiwibW92LnciKSx7e1JTMTYsUkQxNixFfX0sICAgICAgICAge3sgMHgwLDB4RCxSUzE2LCBSRDE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDQsIm1vdi53Iikse3tJTU0xNixSRDE2LEV9fSwgICAgICAgIHt7IDB4NywweDksMHgwLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDQsIm1vdi53Iikse3tSU0lORCxSRDE2LEV9fSwgICAgICAgIHt7IDB4NiwweDksQjMwfFJTSU5ELFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNiwibW92LnciKSx7e0RJU1AxNlNSQyxSRDE2LEV9fSwgICAge3sgMHg2LDB4RixCMzB8RElTUFJFRyxSRDE2LERJU1AxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNiwibW92LnciKSx7e1JTSU5DLFJEMTYsRX19LCAgICAgICAge3sgMHg2LDB4RCxCMzB8UlNJTkMsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7QUJTMTZTUkMsUkQxNixFfX0sICAgICB7eyAweDYsMHhCLDB4MCxSRDE2LEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LERJU1AxNkRTVCxFfX0sICAgIHt7IDB4NiwweEYsRElTUFJFR3xCMzEsUlMxNixESVNQMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LFJEREVDLEV9fSwgICAgICAgIHt7IDB4NiwweEQsUkRERUN8QjMxLFJTMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsQUJTMTZEU1QsRX19LCAgICAge3sgMHg2LDB4QiwweDgsUlMxNixBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw0LCJtb3YubCIpLHt7SU1NMzIsUkQzMixFfX0sICAgICAgICB7eyAweDcsMHhBLDB4MCxCMzB8UkQzMixJTU0zMkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDIsIm1vdi5sIikse3tSUzMyLFJEMzIsRX19LCAgICAgICAgIHt7IDB4MCwweEYsQjMxfFJTMzIsQjMwfFJEMzIsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw0LCJtb3YubCIpLHt7UlNJTkQsUkQzMixFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHg5LFJTSU5EfEIzMCxCMzB8UkQzMixFLDAsMCwwLDAgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0RJU1AxNlNSQyxSRDMyLEV9fSwgICAge3sgUFJFRklYMzIsMHg2LDB4RixESVNQUkVHfEIzMCxCMzB8UkQzMixESVNQMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7RElTUHxMXzMyfFNSQyxSRDMyLEV9fSx7eyBQUkVGSVgzMiwweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhCLDB4MixCMzB8UkQzMixTUkN8RElTUDMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tSU0lOQyxSRDMyLEV9fSwgICAgICAgIHt7IFBSRUZJWDMyLDB4NiwweEQsQjMwfFJTSU5DLEIzMHxSRDMyLEUsMCwwLDAsMCB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7QUJTMTZTUkMsUkQzMixFfX0sICAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4MCxCMzB8UkQzMixBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tBQlMzMlNSQ3xNRU1SRUxBWCxSRDMyLEUgfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEIsMHgyLEIzMHxSRDMyLFNSQ3xNRU1SRUxBWHxBQlMzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixSRElORCxFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHg5LFJESU5EfEIzMSxCMzB8UlMzMixFLDAsMCwwLDAgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsRElTUDE2RFNULEV9fSwgICAge3sgUFJFRklYMzIsMHg2LDB4RixESVNQUkVHfEIzMSxCMzB8UlMzMixESVNQMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixESVNQfExfMzJ8RFNULEV9fSx7eyBQUkVGSVgzMiwweDcsMHg4LEIzMXxESVNQUkVHLDB4MCwweDYsMHhCLDB4QSxCMzB8UlMzMixEU1R8RElTUDMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLFJEREVDLEV9fSwgICAgICAgIHt7IFBSRUZJWDMyLDB4NiwweEQsUkRERUN8QjMxLEIzMHxSUzMyLEUsMCwwLDAsMCB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixBQlMxNkRTVCxFfX0sICAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4OCxCMzB8UlMzMixBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLEFCUzMyRFNUfE1FTVJFTEFYLEUgfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEIsMHhBLEIzMHxSUzMyLERTVHxNRU1SRUxBWHxBQlMzMkxJU1QsRSB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDEwLCJtb3ZmcGUiKSx7e0FCUzE2U1JDLFJEOCxFfX0se3sgMHg2LDB4QSwweDQsUkQ4LEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSwxMCwibW92dHBlIikse3tSUzgsQUJTMTZEU1QsRX19LHt7IDB4NiwweEEsMHhDLFJTOCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTVVMVSxTQiksMSwxNCwibXVseHUuYiIpLHt7UlM4LFJEMTYsRX19LCB7eyAweDUsMHgwLFJTOCxSRDE2LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NVUxVLFNXKSwwLDE0LCJtdWx4dS53Iikse3tSUzE2LFJEMzIsRX19LHt7IDB4NSwweDIsUlMxNixCMzB8UkQzMixFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19NVUxTLFNCKSwwLDIwLCJtdWx4cy5iIikse3tSUzgsUkQxNixFfX0sIHt7IDB4MCwweDEsMHhjLDB4MCwweDUsMHgwLFJTOCxSRDE2LEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTVVMUyxTVyksMCwyMCwibXVseHMudyIpLHt7UlMxNixSRDMyLEV9fSx7eyAweDAsMHgxLDB4YywweDAsMHg1LDB4MixSUzE2LEIzMHxSRDMyLEV9fUVPUCwKLSAgCi0gIC8qID8/PyBUaGlzIGNhbiB1c2UgVU5PUDMuICAqLwotICBORVdfU09QKE8oT19ORUcsU0IpLDEsMiwibmVnLmIiKSx7eyBPUjgsRSwgMH19LHt7IDB4MSwweDcsMHg4LE9SOCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTkVHLFNXKSwwLDIsIm5lZy53Iikse3sgT1IxNixFLDB9fSx7eyAweDEsMHg3LDB4OSxPUjE2LEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTkVHLFNMKSwwLDIsIm5lZy5sIikse3sgT1IzMixFLDB9fSx7eyAweDEsMHg3LDB4QixCMzB8T1IzMixFfX1FT1AsCi0gICAgCi0gIE5FV19TT1AoTyhPX05PUCxTTiksMSwyLCJub3AiKSx7e0UsMCwwfX0se3sgMHgwLDB4MCwweDAsMHgwLEUsMCwwLDAsMH19RU9QLAotCi0gIC8qID8/PyBUaGlzIGNhbiB1c2UgVU5PUDMuICAqLwotICBORVdfU09QKE8oT19OT1QsU0IpLDEsMiwibm90LmIiKSx7eyBPUjgsRSwgMH19LHt7IDB4MSwweDcsMHgwLE9SOCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTk9ULFNXKSwwLDIsIm5vdC53Iikse3sgT1IxNixFLDB9fSx7eyAweDEsMHg3LDB4MSxPUjE2LEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTk9ULFNMKSwwLDIsIm5vdC5sIikse3sgT1IzMixFLDB9fSx7eyAweDEsMHg3LDB4MyxCMzB8T1IzMixFfX1FT1AsCi0KLSAgVFdPT1AoTyhPX09SLCBTQiksIm9yLmIiLDB4QywweDEsMHg0KSwKLSAgTkVXX1NPUChPKE9fT1IsU1cpLDAsNCwib3IudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDQsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19PUixTVyksMCwyLCJvci53Iikse3tSUzE2LFJEMTYsRSB9fSx7ezB4NiwweDQsUlMxNixSRDE2LEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fT1IsU0wpLDAsNiwib3IubCIpLHt7SU1NMzIsUkQzMixFIH19LHt7MHg3LDB4QSwweDQsQjMwfFJEMzIsSU1NMzJMSVNULEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX09SLFNMKSwwLDIsIm9yLmwiKSx7e1JTMzIsUkQzMixFIH19LHt7MHgwLDB4MSwweEYsMHgwLDB4NiwweDQsQjMwfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19PUkMsU0IpLDEsMiwib3JjIikse3tJTU04LENDUixFfX0se3sgMHgwLDB4NCxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fT1JDLFNCKSwxLDIsIm9yYyIpLHt7SU1NOCxFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDAsMHg0LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX01PVl9UT19SRUcsU1cpLDEsNiwicG9wLnciKSx7e09SMTYsRSwwfX0se3sgMHg2LDB4RCwweDcsT1IxNixFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTU9WX1RPX1JFRyxTTCksMCw2LCJwb3AubCIpLHt7T1IzMixFLDB9fSx7eyBQUkVGSVgzMiwweDYsMHhELDB4NyxPUjMyfEIzMCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTU9WX1RPX01FTSxTVyksMSw2LCJwdXNoLnciKSx7e09SMTYsRSwwfX0se3sgMHg2LDB4RCwweEYsT1IxNixFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTU9WX1RPX01FTSxTTCksMCw2LCJwdXNoLmwiKSx7e09SMzIsRSwwfX0se3sgUFJFRklYMzIsMHg2LDB4RCwweEYsT1IzMnxCMzAsRSwwLDAsMCwwfX1FT1AsCi0KLSAgVU5PUDMoT19ST1RMLCAgInJvdGwiLCAweDEsMHgyLDB4OCksCi0gIFVOT1AzKE9fUk9UUiwgICJyb3RyIiwgMHgxLDB4MywweDgpLAotICBVTk9QMyhPX1JPVFhMLCAicm90eGwiLDB4MSwweDIsMHgwKSwKLSAgVU5PUDMoT19ST1RYUiwgInJvdHhyIiwweDEsMHgzLDB4MCksCi0KLSAgU09QKE8oT19CUFQsU04pLCAgMTAsImJwdCIpLHt7RSwwLDB9fSx7eyAweDcsMHhBLDB4RiwweEYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fUlRFLFNOKSwgIDEwLCJydGUiKSx7e0UsMCwwfX0se3sgMHg1LDB4NiwweDcsMHgwLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX1JUUyxTTiksICAgOCwicnRzIikse3tFLDAsMH19LHt7IDB4NSwweDQsMHg3LDB4MCxFLDAsMCwwLDB9fUVPUCwKLQotICBVTk9QMyhPX1NIQUwsICAic2hhbCIsMHgxLDB4MCwweDgpLAotICBVTk9QMyhPX1NIQVIsICAic2hhciIsMHgxLDB4MSwweDgpLAotICBVTk9QMyhPX1NITEwsICAic2hsbCIsMHgxLDB4MCwweDApLAotICBVTk9QMyhPX1NITFIsICAic2hsciIsMHgxLDB4MSwweDApLAotCi0gIFNPUChPKE9fU0xFRVAsU04pLDIsInNsZWVwIikse3tFLDAsMH19LHt7IDB4MCwweDEsMHg4LDB4MCxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwgMSwyLCJzdGMiKSx7e0NDUixSRDgsRX19LHt7IDB4MCwweDIsMHgwLFJEOCxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLFJTSU5ELEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweDksQjMxfFJESU5ELDB4MCxFfX0gRU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsRElTUHxEU1R8TF8xNixFfX0se3tQUkVGSVhMREMsMHg2LDB4RixCMzF8RElTUFJFRywwLERTVHxESVNQfExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsRElTUHxEU1R8TF8zMixFfX0se3tQUkVGSVhMREMsMHg3LDB4OCxCMzB8RElTUFJFRywwLDB4NiwweEIsMHhBLDB4MCxEU1R8RElTUDMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixSRERFQyxFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHhELEIzMXxSRERFQywweDAsRX19RU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixBQlMxNlNSQyxFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4OCwweDAsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsQUJTMzJTUkMsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweEEsMHgwLERTVHxBQlMzMkxJU1QsRX19RU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksIDEsMiwic3RjIikse3tFWFIsUkQ4LEV9fSx7eyAweDAsMHgyLDB4MSxSRDgsRSwwLDAsMCwwfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixSU0lORCxFfX0sICAgICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHg5LEIzMXxSRElORCwweDAsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLERJU1B8RFNUfExfMTYsRX19LHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEYsQjMxfERJU1BSRUcsMCxEU1R8RElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLERJU1B8RFNUfExfMzIsRX19LHt7MHgwLDB4MSwweDQsMHgxLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4QSwweDAsRFNUfERJU1AzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsUkRERUMsRX19LCAgICAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4RCxCMzF8UkRERUMsMHgwLEV9fUVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsQUJTMTZTUkMsRX19LCAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4QiwweDgsMHgwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLEFCUzMyU1JDLEV9fSwgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEIsMHhBLDB4MCxEU1R8QUJTMzJMSVNULEV9fUVPUCwKLQotICBTT1AoTyhPX1NVQixTQiksMiwic3ViLmIiKSx7e1JTOCxSRDgsRX19LHt7IDB4MSwweDgsUlM4LFJEOCxFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19TVUIsU1cpLDEsMiwic3ViLnciKSx7e1JTMTYsUkQxNixFIH19LCAge3sweDEsMHg5LFJTMTYsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19TVUIsU1cpLDAsNCwic3ViLnciKSx7e0lNTTE2LFJEMTYsRSB9fSwge3sweDcsMHg5LDB4MyxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NVQixTTCksMCwyLCJzdWIubCIpICx7e1JTMzIsUkQzMixFIH19LCB7ezB4MSwweEEsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1VCLFNMKSwwLDYsInN1Yi5sIiksIHt7SU1NMzIsUkQzMixFIH19LHt7MHg3LDB4QSwweDMsQjMwfFJEMzIsSU1NMzJMSVNULEV9fSBFT1AsCi0KLSAgU09QKE8oT19TVUJTLFNMKSwyLCJzdWJzIikse3tLQklULFJEUCxFfX0se3sgMHgxLDB4QixLQklULFJEUCxFLDAsMCwwLDB9fUVPUCwKLSAgVFdPT1AoTyhPX1NVQlgsU0IpLCJzdWJ4IiwweEIsMHgxLDB4RSksCi0KLSAgTkVXX1NPUChPKE9fVFJBUEEsU0IpLDAsMiwidHJhcGEiKSx7eyBJTU0yLEV9fSwgIHt7MHg1LDB4NyxJTU0yLElHTk9SRSxFICB9fUVPUCwKLSAgTkVXX1NPUChPKE9fVEFTLFNCKSwwLDIsInRhcyIpLHt7UlNJTkQsRX19LCAge3sweDAsMHgxLDB4ZSwweDAsMHg3LDB4YixCMzB8UlNJTkQsMHhjLEUgIH19RU9QLAotCi0gIFRXT09QKE8oT19YT1IsIFNCKSwieG9yIiwweEQsMHgxLDB4NSksCi0KLSAgTkVXX1NPUChPKE9fWE9SLFNXKSwwLDQsInhvci53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4NSxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1hPUixTVyksMCwyLCJ4b3IudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDYsMHg1LFJTMTYsUkQxNixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX1hPUixTTCksMCw2LCJ4b3IubCIpLHt7SU1NMzIsUkQzMixFIH19LHt7MHg3LDB4QSwweDUsQjMwfFJEMzIsSU1NMzJMSVNULEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1hPUixTTCksMCwyLCJ4b3IubCIpICx7e1JTMzIsUkQzMixFIH19LHt7MHgwLDB4MSwweEYsMHgwLDB4NiwweDUsQjMwfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLQotICBTT1AoTyhPX1hPUkMsU0IpLDIsInhvcmMiKSx7e0lNTTgsQ0NSLEV9fSx7eyAweDAsMHg1LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX1hPUkMsU0IpLDIsInhvcmMiKSx7e0lNTTgsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NSxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19DTFJNQUMsU04pLDEsMiwiY2xybWFjIikse3tFLCAwLCAwfX0se3sweDAsMHgxLDB4YSwweDAsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fTUFDLFNMKSwxLDIsIm1hYyIpLHt7UlNJTkMsUkRJTkMsRX19LHt7MHgwLDB4MSwweDYsMHgwLDB4NiwweGQsQjMwfFJTSU5DLEIzMHxSRElOQyxFfX0gRU9QLAotICBORVdfU09QKE8oT19MRE1BQyxTTCksMSwyLCJsZG1hYyIpLHt7UlMzMixNQUNSRUcsRX19LHt7MHgwLDB4MyxNQUNSRUcsUlMzMixFfX0gRU9QLAotICBORVdfU09QKE8oT19TVE1BQyxTTCksMSwyLCJzdG1hYyIpLHt7TUFDUkVHLFJEMzIsRX19LHt7MHgwLDB4MixNQUNSRUcsUkQzMixFfX0gRU9QLAotICBORVdfU09QKE8oT19MRE0sU0wpLDAsNiwibGRtLmwiKSx7e1JTSU5DLCBSUzMyLCBFfX0se3sgMHgwLDB4MSxJR05PUkUsMHgwLDB4NiwweEQsMHg3LElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUTSxTTCksMCw2LCJzdG0ubCIpLHt7UlMzMiwgUkRERUMsIEV9fSx7ezB4MCwweDEsSUdOT1JFLDB4MCwweDYsMHhELDB4RixJR05PUkUsRX19RU9QLAotICB7IDAgfQotfTsKLSNlbHNlCi1leHRlcm4gc3RydWN0IGg4X29wY29kZSBoOF9vcGNvZGVzW10gOwotI2VuZGlmCi0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2hwcGEuaCBiL2luY2x1ZGUvb3Bjb2RlL2hwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0MWZmMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NDEgKzAsMCBAQAotLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIFBBLVJJU0MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgYW5kIEdEQiwgdGhlIEdOVSBkaXNhc3NlbWJsZXIuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKgotICogU3RydWN0dXJlIG9mIGFuIG9wY29kZSB0YWJsZSBlbnRyeS4KLSAqLwotCi0vKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGRlbGF5IHNsb3QgbnVsbGlmaWNhdGlvbjogbm9ybWFsIHdoaWNoIGlzCi0gKiBjb250cm9sZWQgYnkgdGhlIG51bGxpZmljYXRpb24gYml0LCBhbmQgY29uZGl0aW9uYWwsIHdoaWNoIGRlcGVuZHMKLSAqIG9uIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJyYW5jaCBhbmQgaXRzIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KLSAqCi0gKiBOT05FIGlzIHVuZm9ydHVuYXRlbHkgI2RlZmluZWQgaW4gdGhlIGhpdXggc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAKLSAqICN1bmRlZiBpdCBhd2F5LgotICovCi0jdW5kZWYgTk9ORQotc3RydWN0IHBhX29wY29kZQotewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgdW5zaWduZWQgbG9uZyBpbnQgbWF0Y2g7CS8qIEJpdHMgdGhhdCBtdXN0IGJlIHNldC4uLiAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGludCBtYXNrOwkvKiAuLi4gaW4gdGhlc2UgYml0cy4gKi8KLSAgICBjaGFyICphcmdzOwotICAgIGVudW0gcGFfYXJjaCBhcmNoOwotICAgIGNoYXIgZmxhZ3M7Ci19OwotCi0vKiBFbmFibGUvZGlzYWJsZSBzdHJpY3Qgc3ludGF4IGNoZWNraW5nLiAgTm90IGN1cnJlbnRseSB1c2VkLCBidXQgd2lsbAotICAgYmUgbmVjZXNzYXJ5IGZvciBQQTIuMCBzdXBwb3J0IGluIHRoZSBmdXR1cmUuICAqLwotI2RlZmluZSBGTEFHX1NUUklDVCAweDEKLQotLyoKLSAgIEFsbCBocHBhIG9wY29kZXMgYXJlIDMyIGJpdHMuCi0KLSAgIFRoZSBtYXRjaCBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggYQotICAgcGFydGljdWxhciBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlCi0gICBvZiB0aGF0IG9wY29kZS4KLQotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGNoYXJhY3RlciBmb3IgZWFjaCBvcGVyYW5kIG9mCi0gICB0aGUgaW5zdHJ1Y3Rpb24uICBDaGFyYWN0ZXJzIHVzZWQgYXMgYSBwcmVmaXggYWxsb3cgYW55IHNlY29uZCBjaGFyYWN0ZXIgdG8KLSAgIGJlIHVzZWQgd2l0aG91dCBjb25mbGljdGluZyB3aXRoIHRoZSBtYWluIG9wZXJhbmQgY2hhcmFjdGVycy4KLQotICAgQml0IHBvc2l0aW9ucyBpbiB0aGlzIGRlc2NyaXB0aW9uIGZvbGxvdyBIUCB1c2FnZSBvZiBsc2IgPSAzMSwKLSAgICJhdCIgaXMgbHNiIG9mIGZpZWxkLgotCi0gICBJbiB0aGUgYXJncyBmaWVsZCwgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIG11c3QgbWF0Y2ggZXhhY3RseToKLQotCScrLCgpICcKLQotICAgSW4gdGhlIGFyZ3MgZmllbGQsIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgdW51c2VkOgotCi0JJyAgIiAgICYgICAgIC0gIC8gICAzNCA2Nzg5Ojs8ID4gQCcKLQknICBDICAgICAgICAgTSAgICAgICAgICAgICBbXF0gICcKLQknICAgIGUgZyAgICBsICAgICAgICAgICAgeSAgIH0gJwotCi0gICBIZXJlIGFyZSBhbGwgdGhlIGNoYXJhY3RlcnM6Ci0KLQknICEiIyQlJicoKSorLSwuLzAxMjM0NTY3ODk6Ozw9Pj9AJwotCSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fJwotCSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4nCi0KLUtpbmRzIG9mIG9wZXJhbmRzOgotICAgeCAgICBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkIGF0IDE1LgotICAgYiAgICBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkIGF0IDEwLgotICAgdCAgICBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkIGF0IDMxLgotICAgYQlpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkIGF0IDEwIGFuZCAxNSAoZm9yIFBFUk1IKQotICAgNSAgICA1IGJpdCBpbW1lZGlhdGUgYXQgMTUuCi0gICBzICAgIDIgYml0IHNwYWNlIHNwZWNpZmllciBhdCAxNy4KLSAgIFMgICAgMyBiaXQgc3BhY2Ugc3BlY2lmaWVyIGF0IDE4LgotICAgViAgICA1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIGkgICAgMTEgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgaiAgICAxNCBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBrICAgIDIxIGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIG4JbnVsbGlmaWNhdGlvbiBmb3IgYnJhbmNoIGluc3RydWN0aW9ucwotICAgTgludWxsaWZpY2F0aW9uIGZvciBzcG9wIGFuZCBjb3ByIGluc3RydWN0aW9ucwotICAgdyAgICAxMiBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudAotICAgVyAgICAxNyBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudCAoUEMgcmVsYXRpdmUpCi0gICBYICAgIDIyIGJpdCBicmFuY2ggZGlzcGxhY2VtZW50IChQQyByZWxhdGl2ZSkKLSAgIHogICAgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKGp1c3QgYSBudW1iZXIsIG5vdCBhbiBhZGRyZXNzKQotCi1BbHNvIHRoZXNlOgotCi0gICAuICAgIDIgYml0IHNoaWZ0IGFtb3VudCBhdCAyNQotICAgKiAgICA0IGJpdCBzaGlmdCBhbW91bnQgYXQgMjUKLSAgIHAgICAgNSBiaXQgc2hpZnQgY291bnQgYXQgMjYgKHRvIHN1cHBvcnQgdGhlIFNIRCBpbnN0cnVjdGlvbikgZW5jb2RlZCBhcwotICAgICAgICAzMS1wCi0gICB+ICAgIDYgYml0IHNoaWZ0IGNvdW50IGF0IDIwLDIyOjI2IGVuY29kZWQgYXMgNjMtfi4KLSAgIFAgICAgNSBiaXQgYml0IHBvc2l0aW9uIGF0IDI2Ci0gICBxICAgIDYgYml0IGJpdCBwb3NpdGlvbiBhdCAyMCwyMjoyNgotICAgVCAgICA1IGJpdCBmaWVsZCBsZW5ndGggYXQgMzEgKGVuY29kZWQgYXMgMzItVCkKLSAgICUJNiBiaXQgZmllbGQgbGVuZ3RoIGF0IDIzLDI3OjMxICh2YXJpYWJsZSBleHRyYWN0L2RlcG9zaXQpCi0gICB8CTYgYml0IGZpZWxkIGxlbmd0aCBhdCAxOSwyNzozMSAoZml4ZWQgZXh0cmFjdC9kZXBvc2l0KQotICAgQSAgICAxMyBiaXQgaW1tZWRpYXRlIGF0IDE4ICh0byBzdXBwb3J0IHRoZSBCUkVBSyBpbnN0cnVjdGlvbikKLSAgIF4JbGlrZSBiLCBidXQgZGVzY3JpYmVzIGEgY29udHJvbCByZWdpc3RlcgotICAgISAgICBzYXIgKGNyMTEpIHJlZ2lzdGVyCi0gICBEICAgIDI2IGJpdCBpbW1lZGlhdGUgYXQgMzEgKHRvIHN1cHBvcnQgdGhlIERJQUcgaW5zdHJ1Y3Rpb24pCi0gICAkICAgIDkgYml0IGltbWVkaWF0ZSBhdCAyOCAodG8gc3VwcG9ydCBQT1BCVFMpCi0KLSAgIHYgICAgMyBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IGlkZW50aWZpZXIgYXQgMjUKLSAgIE8gICAgMjAgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gc3BsaXQgYmV0d2VlbiAxNSBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIG8gICAgMTUgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gYXQgMjAKLSAgIDIgICAgMjIgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gc3BsaXQgYmV0d2VlbiAxNyBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIDEgICAgMTUgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gc3BsaXQgYmV0d2VlbiAxMCBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIDAgICAgMTAgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gc3BsaXQgYmV0d2VlbiA1IGJpdHMgYXQgMjAKLSAgICAgICAgYW5kIDUgYml0cyBhdCAzMQotICAgdSAgICAzIGJpdCBjb3Byb2Nlc3NvciB1bml0IGlkZW50aWZpZXIgYXQgMjUKLSAgIEYgICAgU291cmNlIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDIgYml0cyBhdCAyMAotICAgSSAgICBTb3VyY2UgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQgQ29tcGxldGVyIGVuY29kZWQgMSBiaXRzIGF0IDIwCi0JKGZvciAweGUgZm9ybWF0IEZQIGluc3RydWN0aW9ucykKLSAgIEcgICAgRGVzdGluYXRpb24gRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQgQ29tcGxldGVyIGVuY29kZWQgMiBiaXRzIGF0IDE4Ci0gICBIICAgIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IGF0IDI2IGZvciAnZm1weWFkZCcgYW5kICdmbXB5c3ViJwotICAgICAgICAodmVyeSBzaW1pbGFyIHRvICdGJykKLQotICAgcgk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEgKGZvciB0aGUgYnJlYWsgaW5zdHJ1Y3Rpb24pCi0JKHZlcnkgc2ltaWxhciB0byBWIGFib3ZlLCBleGNlcHQgdGhlIHZhbHVlIGlzIHVuc2lnbmVkIGluc3RlYWQgb2YKLQlsb3dfc2lnbl9leHQpCi0gICBSCTUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAxNSAoZm9yIHRoZSBzc20sIHJzbSwgcHJvYmVpIGluc3RydWN0aW9ucykKLQkoc2FtZSBhcyByIGFib3ZlLCBleGNlcHQgdGhlIHZhbHVlIGlzIGluIGEgZGlmZmVyZW50IGxvY2F0aW9uKQotICAgVQkxMCBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDE1IChmb3IgU1NNLCBSU00gb24gcGEyLjApCi0gICBRCTUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAxMCAoYSBiaXQgcG9zaXRpb24gc3BlY2lmaWVkIGluCi0JdGhlIGJiIGluc3RydWN0aW9uLiBJdCdzIHRoZSBzYW1lIGFzIHIgYWJvdmUsIGV4Y2VwdCB0aGUKLSAgICAgICAgdmFsdWUgaXMgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24pCi0gICBCCTUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAxMCAoYSBiaXQgcG9zaXRpb24gc3BlY2lmaWVkIGluCi0JdGhlIGJiIGluc3RydWN0aW9uLiBTaW1pbGFyIHRvIFEsIGJ1dCA2NGJpdCBoYW5kbGluZyBpcwotCWRpZmZlcmVudC4KLSAgIFogICAgJXIxIC0tIGltcGxpY2l0IHRhcmdldCBvZiBhZGRpbCBpbnN0cnVjdGlvbi4KLSAgIEwgICAgLCVyMiBjb21wbGV0ZXIgZm9yIG5ldyBzeW50YXggYnJhbmNoCi0gICB7ICAgIFNvdXJjZSBmb3JtYXQgY29tcGxldGVyIGZvciBmY252Ci0gICBfICAgIERlc3RpbmF0aW9uIGZvcm1hdCBjb21wbGV0ZXIgZm9yIGZjbnYKLSAgIGggICAgY2JpdCBmb3IgZmNtcAotICAgPSAgICBnZnggdGVzdHMgZm9yIGZ0ZXN0Ci0gICBkICAgIDE0Yml0IG9mZnNldCBmb3Igc2luZ2xlIHByZWNpc2lvbiBGUCBsb25nIGxvYWQvc3RvcmUuCi0gICAjICAgIDE0Yml0IG9mZnNldCBmb3IgZG91YmxlIHByZWNpc2lvbiBGUCBsb2FkIGxvbmcvc3RvcmUuCi0gICBKICAgIFlldCBhbm90aGVyIDE0Yml0IG9mZnNldCB3aXRoIGFuIHVudXN1YWwgZW5jb2RpbmcuCi0gICBLICAgIFlldCBhbm90aGVyIDE0Yml0IG9mZnNldCB3aXRoIGFuIHVudXN1YWwgZW5jb2RpbmcuCi0gICBZICAgICVzcjAsJXIzMSAtLSBpbXBsaWNpdCB0YXJnZXQgb2YgYmUsbCBpbnN0cnVjdGlvbi4KLSAgIEAJaW1wbGljaXQgaW1tZWRpYXRlIHZhbHVlIG9mIDAKLQotQ29tcGxldGVyIG9wZXJhbmRzIGFsbCBoYXZlICdjJyBhcyB0aGUgcHJlZml4OgotCi0gICBjeCAgIGluZGV4ZWQgbG9hZCBjb21wbGV0ZXIuCi0gICBjbSAgIHNob3J0IGxvYWQgYW5kIHN0b3JlIGNvbXBsZXRlci4KLSAgIGNxICAgbG9uZyBsb2FkIGFuZCBzdG9yZSBjb21wbGV0ZXIgKGxpa2UgY20sIGJ1dCBpbnNlcnRlZCBpbnRvIGEKLQlkaWZmZXJlbnQgbG9jYXRpb24gaW4gdGhlIHRhcmdldCBpbnN0cnVjdGlvbikuCi0gICBjcyAgIHN0b3JlIGJ5dGVzIHNob3J0IGNvbXBsZXRlci4KLSAgIGNlICAgbG9uZyBsb2FkL3N0b3JlIGNvbXBsZXRlciBmb3IgTERXL1NUVyB3aXRoIGEgZGlmZmVyZW50IGVuY29kaW5nIHRoYW4gdGhlCi0Jb3RoZXJzCi0gICBjYyAgIGxvYWQgY2FjaGUgY29udHJvbCBoaW50Ci0gICBjZCAgIGxvYWQgYW5kIGNsZWFyIGNhY2hlIGNvbnRyb2wgaGludAotICAgY0MgICBzdG9yZSBjYWNoZSBjb250cm9sIGhpbnQKLSAgIGNvCW9yZGVyZWQgYWNjZXNzCi0KLSAgIGNwCWJyYW5jaCBsaW5rIGFuZCBwdXNoIGNvbXBsZXRlcgotICAgY1AJYnJhbmNoIHBvcCBjb21wbGV0ZXIKLSAgIGNsCWJyYW5jaCBsaW5rIGNvbXBsZXRlcgotICAgY2cJYnJhbmNoIGdhdGUgY29tcGxldGVyCi0KLSAgIGN3CXJlYWQvd3JpdGUgY29tcGxldGVyIGZvciBQUk9CRQotICAgY1cJd2lkZSBjb21wbGV0ZXIgZm9yIE1GQ1RMCi0gICBjTAlsb2NhbCBwcm9jZXNzb3IgY29tcGxldGVyIGZvciBjYWNoZSBjb250cm9sCi0gICBjWiAgIFN5c3RlbSBDb250cm9sIENvbXBsZXRlciAodG8gc3VwcG9ydCBMUEEsIExIQSwgZXRjLikKLQotICAgY2kJY29ycmVjdGlvbiBjb21wbGV0ZXIgZm9yIERDT1IKLSAgIGNhCWFkZCBjb21wbGV0ZXIKLSAgIGN5CTMyIGJpdCBhZGQgY2FycnkgY29tcGxldGVyCi0gICBjWQk2NCBiaXQgYWRkIGNhcnJ5IGNvbXBsZXRlcgotICAgY3YJc2lnbmVkIG92ZXJmbG93IHRyYXAgY29tcGxldGVyCi0gICBjdAl0cmFwIG9uIGNvbmRpdGlvbiBjb21wbGV0ZXIgZm9yIEFEREksIFNVQgotICAgY1QJdHJhcCBvbiBjb25kaXRpb24gY29tcGxldGVyIGZvciBVQUREQ00KLSAgIGNiCTMyIGJpdCBib3Jyb3cgY29tcGxldGVyIGZvciBTVUIKLSAgIGNCCTY0IGJpdCBib3Jyb3cgY29tcGxldGVyIGZvciBTVUIKLQotICAgY2gJbGVmdC9yaWdodCBoYWxmIGNvbXBsZXRlcgotICAgY0gJc2lnbmVkL3Vuc2lnbmVkIHNhdHVyYXRpb24gY29tcGxldGVyCi0gICBjUwlzaWduZWQvdW5zaWduZWQgY29tcGxldGVyIGF0IDIxCi0gICBjKglwZXJtdXRhdGlvbiBjb21wbGV0ZXIKLQotQ29uZGl0aW9uIG9wZXJhbmRzIGFsbCBoYXZlICc/JyBhcyB0aGUgcHJlZml4OgotCi0gICA/ZiAgIEZsb2F0aW5nIHBvaW50IGNvbXBhcmUgY29uZGl0aW9ucyAoZW5jb2RlZCBhcyA1IGJpdHMgYXQgMzEpCi0KLSAgID9hCWFkZCBjb25kaXRpb25zCi0gICA/QQk2NCBiaXQgYWRkIGNvbmRpdGlvbnMKLSAgID9AICAgYWRkIGJyYW5jaCBjb25kaXRpb25zIGZvbGxvd2VkIGJ5IG51bGxpZnkKLSAgID9kCW5vbi1uZWdhdGVkIGFkZCBicmFuY2ggY29uZGl0aW9ucwotICAgP0QJbmVnYXRlZCBhZGQgYnJhbmNoIGNvbmRpdGlvbnMKLSAgID93CXdpZGUgbW9kZSBub24tbmVnYXRlZCBhZGQgYnJhbmNoIGNvbmRpdGlvbnMKLSAgID9XCXdpZGUgbW9kZSBuZWdhdGVkIGFkZCBicmFuY2ggY29uZGl0aW9ucwotCi0gICA/cyAgIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9ucwotICAgP1MJNjQgYml0IGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9ucwotICAgP3QgICBub24tbmVnYXRlZCBjb21wYXJlIGFuZCBicmFuY2ggY29uZGl0aW9ucwotICAgP24gICAzMiBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbmRpdGlvbnMgZm9sbG93ZWQgYnkgbnVsbGlmeQotICAgP04gICA2NCBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbmRpdGlvbnMgZm9sbG93ZWQgYnkgbnVsbGlmeQotICAgP1EJNjQgYml0IGNvbXBhcmUgYW5kIGJyYW5jaCBjb25kaXRpb25zIGZvciBDTVBJQiBpbnN0cnVjdGlvbgotCi0gICA/bCAgIGxvZ2ljYWwgY29uZGl0aW9ucwotICAgP0wJNjQgYml0IGxvZ2ljYWwgY29uZGl0aW9ucwotCi0gICA/YiAgIGJyYW5jaCBvbiBiaXQgY29uZGl0aW9ucwotICAgP0IJNjQgYml0IGJyYW5jaCBvbiBiaXQgY29uZGl0aW9ucwotCi0gICA/eCAgIHNoaWZ0L2V4dHJhY3QvZGVwb3NpdCBjb25kaXRpb25zCi0gICA/WAk2NCBiaXQgc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbnMKLSAgID95ICAgc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbnMgZm9sbG93ZWQgYnkgbnVsbGlmeSBmb3IgY29uZGl0aW9uYWwKLSAgICAgICAgYnJhbmNoZXMKLQotICAgP3UgICB1bml0IGNvbmRpdGlvbnMKLSAgID9VICAgNjQgYml0IHVuaXQgY29uZGl0aW9ucwotCi1GbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYWxsIGhhdmUgJ2YnIGFzIGEgcHJlZml4OgotCi0gICBmdAl0YXJnZXQgcmVnaXN0ZXIgYXQgMzEKLSAgIGZUCXRhcmdldCByZWdpc3RlciB3aXRoIEwvUiBoYWx2ZXMgYXQgMzEKLSAgIGZhCW9wZXJhbmQgMSByZWdpc3RlciBhdCAxMAotICAgZkEgICBvcGVyYW5kIDEgcmVnaXN0ZXIgd2l0aCBML1IgaGFsdmVzIGF0IDEwCi0gICBmWCAgIFNhbWUgYXMgZkEsIGV4Y2VwdCBwcmludHMgYSBzcGFjZSBiZWZvcmUgcmVnaXN0ZXIgZHVyaW5nIGRpc2FzbQotICAgZmIJb3BlcmFuZCAyIHJlZ2lzdGVyIGF0IDE1Ci0gICBmQiAgIG9wZXJhbmQgMiByZWdpc3RlciB3aXRoIEwvUiBoYWx2ZXMgYXQgMTUKLSAgIGZDICAgb3BlcmFuZCAzIHJlZ2lzdGVyIHdpdGggTC9SIGhhbHZlcyBhdCAxNjoxOCwyMToyMwotICAgZmUgICBMaWtlIGZULCBidXQgZW5jb2RpbmcgaXMgZGlmZmVyZW50LgotCi1GbG9hdCByZWdpc3RlcnMgZm9yIGZtcHlhZGQgYW5kIGZtcHlzdWI6Ci0KLSAgIGZpCW11bHQgb3BlcmFuZCAxIHJlZ2lzdGVyIGF0IDEwCi0gICBmagltdWx0IG9wZXJhbmQgMiByZWdpc3RlciBhdCAxNQotICAgZmsJbXVsdCB0YXJnZXQgcmVnaXN0ZXIgYXQgMjAKLSAgIGZsCWFkZC9zdWIgb3BlcmFuZCByZWdpc3RlciBhdCAyNQotICAgZm0JYWRkL3N1YiB0YXJnZXQgcmVnaXN0ZXIgYXQgMzEKLQotKi8KLQotCi0vKiBMaXN0IG9mIGNoYXJhY3RlcnMgbm90IHRvIHB1dCBhIHNwYWNlIGFmdGVyLiAgTm90ZSB0aGF0Ci0gICAiLCIgaXMgaW5jbHVkZWQsIGFzIHRoZSAic3BvcE4iIG9wZXJhdGlvbnMgdXNlIGxpdGVyYWwKLSAgIGNvbW1hcyBpbiB0aGVpciBjb21wbGV0ZXIgc2VjdGlvbnMuICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29tcGxldGVyX2NoYXJzID0gIixDY1k8Pj8hQCsmVX5GZkdISU5uT29aTWFkdXwvPTAxMjMlZSRtfSI7Ci0KLS8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGlzIHRhYmxlIGlzIHNpZ25pZmljYW50OgotCi0gICAqIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUKLSAgIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0IHJ1bnRpbWUuCi0KLSAgICogVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgbm90IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwYV9vcGNvZGUgcGFfb3Bjb2Rlc1tdID0KLXsKLQotLyogcHNldWRvLWluc3RydWN0aW9ucyAqLwotCi17ICJsZGkiLAkweDM0MDAwMDAwLCAweGZmZTBjMDAwLCAiaix4IiwgcGExMCwgMH0sLyogbGRvIHZhbChyMCksciAqLwotCi17ICJjYWxsIiwJMHhlODAwZjAwMCwgMHhmYzFmZmZmZCwgIm4oYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJjYWxsIiwJMHhlODAwYTAwMCwgMHhmZmUwZTAwMCwgIm5XIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAicmV0IiwJMHhlODQwZDAwMCwgMHhmZmZmZmZmZCwgIm4iLCBwYTIwLCBGTEFHX1NUUklDVH0sCi0KLXsgImNtcGliIiwgCTB4ZWMwMDAwMDAsIDB4ZmMwMDAwMDAsICI/UW41LGIsdyIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImNtcGliIiwgCTB4ODQwMDAwMDAsIDB4ZjQwMDAwMDAsICI/bm41LGIsdyIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNvbWliIiwgCTB4ODQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bm41LGIsdyIsIHBhMTAsIDB9LCAvKiBjb21pYnt0Zn0qLwotLyogVGhpcyBlbnRyeSBpcyBmb3IgdGhlIGRpc2Fzc2VtYmxlciBvbmx5LiAgSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5Ci0gICBhc3NlbWJsZXIuICAqLwoteyAiY29taWIiLCAJMHg4YzAwMDAwMCwgMHhmYzAwMDAwMCwgIj9ubjUsYix3IiwgcGExMCwgMH0sIC8qIGNvbWlie3RmfSovCi17ICJjbXBiIiwJMHg5YzAwMDAwMCwgMHhkYzAwMDAwMCwgIj9ObngsYix3IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY21wYiIsCTB4ODAwMDAwMDAsIDB4ZjQwMDAwMDAsICI/bm54LGIsdyIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNvbWIiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLCAiP25ueCxiLHciLCBwYTEwLCAwfSwgLyogY29tYnt0Zn0gKi8KLS8qIFRoaXMgZW50cnkgaXMgZm9yIHRoZSBkaXNhc3NlbWJsZXIgb25seS4gIEl0IHdpbGwgbmV2ZXIgYmUgdXNlZCBieQotICAgYXNzZW1ibGVyLiAgKi8KLXsgImNvbWIiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLCAiP25ueCxiLHciLCBwYTEwLCAwfSwgLyogY29tYnt0Zn0gKi8KLXsgImFkZGIiLAkweGEwMDAwMDAwLCAweGY0MDAwMDAwLCAiP1dueCxiLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhZGRiIiwJMHhhMDAwMDAwMCwgMHhmYzAwMDAwMCwgIj9AbngsYix3IiwgcGExMCwgMH0sIC8qIGFkZGJ7dGZ9ICovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJhZGRiIiwJMHhhODAwMDAwMCwgMHhmYzAwMDAwMCwgIj9AbngsYix3IiwgcGExMCwgMH0sCi17ICJhZGRpYiIsCTB4YTQwMDAwMDAsIDB4ZjQwMDAwMDAsICI/V241LGIsdyIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZGliIiwJMHhhNDAwMDAwMCwgMHhmYzAwMDAwMCwgIj9AbjUsYix3IiwgcGExMCwgMH0sIC8qIGFkZGlie3RmfSovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJhZGRpYiIsCTB4YWMwMDAwMDAsIDB4ZmMwMDAwMDAsICI/QG41LGIsdyIsIHBhMTAsIDB9LCAvKiBhZGRpYnt0Zn0qLwoteyAibm9wIiwgICAgICAgIDB4MDgwMDAyNDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwgICAgICAvKiBvciAwLDAsMCAqLwoteyAiY29weSIsICAgICAgIDB4MDgwMDAyNDAsIDB4ZmZlMGZmZTAsICJ4LHQiLCBwYTEwLCAwfSwgICAvKiBvciByLDAsdCAqLwoteyAibXRzYXIiLCAgICAgIDB4MDE2MDE4NDAsIDB4ZmZlMGZmZmYsICJ4IiwgcGExMCwgMH0sIC8qIG10Y3RsIHIsY3IxMSAqLwotCi0vKiBMb2FkcyBhbmQgU3RvcmVzIGZvciBpbnRlZ2VyIHJlZ2lzdGVycy4gICovCi0KLXsgImxkZCIsCTB4MGMwMDEwZTAsIDB4ZmMxZjMzZTAsICJjb2NjQChzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLAkweDBjMDAxMGUwLCAweGZjMWYzM2UwLCAiY29jY0AoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsICAgICAgICAweDBjMDAwMGMwLCAweGZjMDAxM2MwLCAiY3hjY3gocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwgICAgICAgIDB4MGMwMDAwYzAsIDB4ZmMwMDEzYzAsICJjeGNjeChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwJMHgwYzAwMTBjMCwgMHhmYzAwMTNjMCwgImNtY2M1KHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsCTB4MGMwMDEwYzAsIDB4ZmMwMDEzYzAsICJjbWNjNShiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwgICAgICAgIDB4NTAwMDAwMDAsIDB4ZmMwMDAwMDIsICJjcSMocyxiKSx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwgICAgICAgIDB4NTAwMDAwMDAsIDB4ZmMwMDAwMDIsICJjcSMoYikseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxM2MwLCAiY3hjY3gocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDEzYzAsICJjeGNjeChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwJMHgwYzAwMTBhMCwgMHhmYzFmMzNlMCwgImNvY2NAKHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsCTB4MGMwMDEwYTAsIDB4ZmMxZjMzZTAsICJjb2NjQChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwJMHgwYzAwMTA4MCwgMHhmYzAwMTNjMCwgImNtY2M1KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsCTB4MGMwMDEwODAsIDB4ZmMwMDEzYzAsICJjbWNjNShiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4NGMwMDAwMDAsIDB4ZmMwMDAwMDAsICJjZUoocyxiKSx4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4NGMwMDAwMDAsIDB4ZmMwMDAwMDAsICJjZUooYikseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDVjMDAwMDA0LCAweGZjMDAwMDA2LCAiY2VLKHMsYikseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDVjMDAwMDA0LCAweGZjMDAwMDA2LCAiY2VLKGIpLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLCAgICAgICAgMHg0ODAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZHciLCAgICAgICAgMHg0ODAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZHciLCAgICAgICAgMHg0ODAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAibGRoIiwgICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDEzYzAsICJjeGNjeChzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLCAgICAgICAgMHgwYzAwMDA0MCwgMHhmYzAwMTNjMCwgImN4Y2N4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLAkweDBjMDAxMDYwLCAweGZjMWYzM2UwLCAiY29jY0AocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwJMHgwYzAwMTA2MCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLAkweDBjMDAxMDQwLCAweGZjMDAxM2MwLCAiY21jYzUocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwJMHgwYzAwMTA0MCwgMHhmYzAwMTNjMCwgImNtY2M1KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAibGRiIiwgICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDEzYzAsICJjeGNjeChzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLCAgICAgICAgMHgwYzAwMDAwMCwgMHhmYzAwMTNjMCwgImN4Y2N4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLAkweDBjMDAxMDIwLCAweGZjMWYzM2UwLCAiY29jY0AocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwJMHgwYzAwMTAyMCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLAkweDBjMDAxMDAwLCAweGZjMDAxM2MwLCAiY21jYzUocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwJMHgwYzAwMTAwMCwgMHhmYzAwMTNjMCwgImNtY2M1KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLCAgICAgICAgMHg0MDAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZGIiLCAgICAgICAgMHg0MDAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAic3RkIiwJMHgwYzAwMTJlMCwgMHhmYzAwMzNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZCIsCTB4MGMwMDEyZTAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkIiwJMHgwYzAwMTJjMCwgMHhmYzAwMTNjMCwgImNtY0N4LFYocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZCIsCTB4MGMwMDEyYzAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkIiwgICAgICAgIDB4NzAwMDAwMDAsIDB4ZmMwMDAwMDIsICJjcXgsIyhzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkIiwgICAgICAgIDB4NzAwMDAwMDAsIDB4ZmMwMDAwMDIsICJjcXgsIyhiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsCTB4MGMwMDEyYTAsIDB4ZmMwMDEzZmYsICJjb2NDeCxAKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLAkweDBjMDAxMmEwLCAweGZjMDAxM2ZmLCAiY29jQ3gsQChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsCTB4MGMwMDEyODAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLAkweDBjMDAxMjgwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsICAgICAgICAweDZjMDAwMDAwLCAweGZjMDAwMDAwLCAiY2V4LEoocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsICAgICAgICAweDZjMDAwMDAwLCAweGZjMDAwMDAwLCAiY2V4LEooYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLCAgICAgICAgMHg3YzAwMDAwNCwgMHhmYzAwMDAwNiwgImNleCxLKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLCAgICAgICAgMHg3YzAwMDAwNCwgMHhmYzAwMDAwNiwgImNleCxLKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwgICAgICAgIDB4NjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTAsIDB9LAoteyAic3R3IiwgICAgICAgIDB4NjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwLCAwfSwKLXsgInN0aCIsCTB4MGMwMDEyNjAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGgiLAkweDBjMDAxMjYwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0aCIsCTB4MGMwMDEyNDAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdGgiLAkweDBjMDAxMjQwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0aCIsICAgICAgICAweDY0MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0aCIsICAgICAgICAweDY0MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMCwgMH0sCi17ICJzdGIiLAkweDBjMDAxMjIwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RiIiwJMHgwYzAwMTIyMCwgMHhmYzAwMzNmZiwgImNvY0N4LEAoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGIiLAkweDBjMDAxMjAwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3RiIiwJMHgwYzAwMTIwMCwgMHhmYzAwMTNjMCwgImNtY0N4LFYoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdGIiLCAgICAgICAgMHg2MDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMCwgMH0sCi17ICJzdGIiLCAgICAgICAgMHg2MDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTAsIDB9LAoteyAibGR3bSIsICAgICAgIDB4NGMwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTAsIDB9LAoteyAibGR3bSIsICAgICAgIDB4NGMwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwLCAwfSwKLXsgInN0d20iLCAgICAgICAweDZjMDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0d20iLCAgICAgICAweDZjMDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMCwgMH0sCi17ICJsZHd4IiwgICAgICAgMHgwYzAwMDA4MCwgMHhmYzAwMWZjMCwgImN4eChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkd3giLCAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxZmMwLCAiY3h4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkaHgiLCAgICAgICAweDBjMDAwMDQwLCAweGZjMDAxZmMwLCAiY3h4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRoeCIsICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDFmYzAsICJjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAibGRieCIsICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGJ4IiwgICAgICAgMHgwYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJsZHdhIiwgICAgICAgMHgwYzAwMDE4MCwgMHhmYzAwZDNjMCwgImN4Y2N4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZHdhIiwJMHgwYzAwMTE4MCwgMHhmYzAwZDNjMCwgImNtY2M1KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGN3IiwgICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMTNjMCwgImN4Y2R4KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY3ciLCAgICAgICAweDBjMDAwMWMwLCAweGZjMDAxM2MwLCAiY3hjZHgoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY3ciLAkweDBjMDAxMWMwLCAweGZjMDAxM2MwLCAiY21jZDUocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjdyIsCTB4MGMwMDExYzAsIDB4ZmMwMDEzYzAsICJjbWNkNShiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3YSIsCTB4MGMwMDEzYTAsIDB4ZmMwMGQzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3YSIsCTB4MGMwMDEzODAsIDB4ZmMwMGQzYzAsICJjbWNDeCxWKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3RieSIsCTB4MGMwMDEzMDAsIDB4ZmMwMDEzYzAsICJjc2NDeCxWKHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdGJ5IiwJMHgwYzAwMTMwMCwgMHhmYzAwMTNjMCwgImNzY0N4LFYoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGRhIiwgICAgICAgMHgwYzAwMDEwMCwgMHhmYzAwZDNjMCwgImN4Y2N4KGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGRhIiwJMHgwYzAwMTEwMCwgMHhmYzAwZDNjMCwgImNtY2M1KGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGNkIiwgICAgICAgMHgwYzAwMDE0MCwgMHhmYzAwMTNjMCwgImN4Y2R4KHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY2QiLCAgICAgICAweDBjMDAwMTQwLCAweGZjMDAxM2MwLCAiY3hjZHgoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY2QiLAkweDBjMDAxMTQwLCAweGZjMDAxM2MwLCAiY21jZDUocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjZCIsCTB4MGMwMDExNDAsIDB4ZmMwMDEzYzAsICJjbWNkNShiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkYSIsCTB4MGMwMDEzZTAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGRhIiwJMHgwYzAwMTNlMCwgMHhmYzAwMzNmZiwgImNvY0N4LEAoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGRhIiwJMHgwYzAwMTNjMCwgMHhmYzAwMTNjMCwgImNtY0N4LFYocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZGEiLAkweDBjMDAxM2MwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkd2F4IiwgICAgICAweDBjMDAwMTgwLCAweGZjMDBkZmMwLCAiY3h4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkY3d4IiwgICAgICAweDBjMDAwMWMwLCAweGZjMDAxZmMwLCAiY3h4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRjd3giLCAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDFmYzAsICJjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAibGR3cyIsCTB4MGMwMDEwODAsIDB4ZmMwMDFmYzAsICJjbTUocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZHdzIiwJMHgwYzAwMTA4MCwgMHhmYzAwMWZjMCwgImNtNShiKSx0IiwgcGExMCwgMH0sCi17ICJsZGhzIiwJMHgwYzAwMTA0MCwgMHhmYzAwMWZjMCwgImNtNShzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkaHMiLAkweDBjMDAxMDQwLCAweGZjMDAxZmMwLCAiY201KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkYnMiLAkweDBjMDAxMDAwLCAweGZjMDAxZmMwLCAiY201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRicyIsCTB4MGMwMDEwMDAsIDB4ZmMwMDFmYzAsICJjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAibGR3YXMiLAkweDBjMDAxMTgwLCAweGZjMDBkZmMwLCAiY201KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkY3dzIiwJMHgwYzAwMTFjMCwgMHhmYzAwMWZjMCwgImNtNShzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkY3dzIiwJMHgwYzAwMTFjMCwgMHhmYzAwMWZjMCwgImNtNShiKSx0IiwgcGExMCwgMH0sCi17ICJzdHdzIiwJMHgwYzAwMTI4MCwgMHhmYzAwMWZjMCwgImNteCxWKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0d3MiLAkweDBjMDAxMjgwLCAweGZjMDAxZmMwLCAiY214LFYoYikiLCBwYTEwLCAwfSwKLXsgInN0aHMiLAkweDBjMDAxMjQwLCAweGZjMDAxZmMwLCAiY214LFYocyxiKSIsIHBhMTAsIDB9LAoteyAic3RocyIsCTB4MGMwMDEyNDAsIDB4ZmMwMDFmYzAsICJjbXgsVihiKSIsIHBhMTAsIDB9LAoteyAic3RicyIsCTB4MGMwMDEyMDAsIDB4ZmMwMDFmYzAsICJjbXgsVihzLGIpIiwgcGExMCwgMH0sCi17ICJzdGJzIiwJMHgwYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNteCxWKGIpIiwgcGExMCwgMH0sCi17ICJzdHdhcyIsCTB4MGMwMDEzODAsIDB4ZmMwMGRmYzAsICJjbXgsVihiKSIsIHBhMTAsIDB9LAoteyAic3RkYnkiLAkweDBjMDAxMzQwLCAweGZjMDAxM2MwLCAiY3NjQ3gsVihzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkYnkiLAkweDBjMDAxMzQwLCAweGZjMDAxM2MwLCAiY3NjQ3gsVihiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YnlzIiwJMHgwYzAwMTMwMCwgMHhmYzAwMWZjMCwgImNzeCxWKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0YnlzIiwJMHgwYzAwMTMwMCwgMHhmYzAwMWZjMCwgImNzeCxWKGIpIiwgcGExMCwgMH0sCi0KLS8qIEltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuICAqLwoteyAibGRvIiwJMHgzNDAwMDAwMCwgMHhmYzAwYzAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAibGRpbCIsCTB4MjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJrLGIiLCBwYTEwLCAwfSwKLXsgImFkZGlsIiwJMHgyODAwMDAwMCwgMHhmYzAwMDAwMCwgImssYixaIiwgcGExMCwgMH0sCi17ICJhZGRpbCIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJrLGIiLCBwYTEwLCAwfSwKLQotLyogQnJhbmNoaW5nIGluc3RydWN0aW9ucy4gKi8KLXsgImIiLAkJMHhlODAwODAwMCwgMHhmYzAwZTAwMCwgImNwblhMIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYiIsCQkweGU4MDBhMDAwLCAweGZjMDBlMDAwLCAiY2xuWEwiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJiIiwJCTB4ZTgwMDAwMDAsIDB4ZmMwMGUwMDAsICJjbG5XLGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJiIiwJCTB4ZTgwMDIwMDAsIDB4ZmMwMGUwMDAsICJjZ25XLGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJiIiwJCTB4ZTgwMDAwMDAsIDB4ZmZlMGUwMDAsICJuVyIsIHBhMTAsIDB9LCAgLyogYixsIGZvbyxyMCAqLwoteyAiYmwiLAkJMHhlODAwMDAwMCwgMHhmYzAwZTAwMCwgIm5XLGIiLCBwYTEwLCAwfSwKLXsgImdhdGUiLAkweGU4MDAyMDAwLCAweGZjMDBlMDAwLCAiblcsYiIsIHBhMTAsIDB9LAoteyAiYmxyIiwJMHhlODAwNDAwMCwgMHhmYzAwZTAwMSwgIm54LGIiLCBwYTEwLCAwfSwKLXsgImJ2IiwJCTB4ZTgwMGMwMDAsIDB4ZmMwMGZmZmQsICJueChiKSIsIHBhMTAsIDB9LAoteyAiYnYiLAkJMHhlODAwYzAwMCwgMHhmYzAwZmZmZCwgIm4oYikiLCBwYTEwLCAwfSwKLXsgImJ2ZSIsCTB4ZTgwMGYwMDEsIDB4ZmMxZmZmZmQsICJjcG4oYilMIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYnZlIiwJMHhlODAwZjAwMCwgMHhmYzFmZmZmZCwgImNsbihiKUwiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJidmUiLAkweGU4MDBkMDAxLCAweGZjMWZmZmZkLCAiY1BuKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYnZlIiwJMHhlODAwZDAwMCwgMHhmYzFmZmZmZCwgIm4oYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJiZSIsCQkweGU0MDAwMDAwLCAweGZjMDAwMDAwLCAiY2xueihTLGIpLFkiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJiZSIsCQkweGU0MDAwMDAwLCAweGZjMDAwMDAwLCAiY2xueihiKSxZIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYmUiLAkJMHhlMDAwMDAwMCwgMHhmYzAwMDAwMCwgIm56KFMsYikiLCBwYTEwLCAwfSwKLXsgImJlIiwJCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsICJueihiKSIsIHBhMTAsIDB9LAoteyAiYmxlIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwgIm56KFMsYikiLCBwYTEwLCAwfSwKLXsgIm1vdmIiLAkweGM4MDAwMDAwLCAweGZjMDAwMDAwLCAiP3lueCxiLHciLCBwYTEwLCAwfSwKLXsgIm1vdmliIiwJMHhjYzAwMDAwMCwgMHhmYzAwMDAwMCwgIj95bjUsYix3IiwgcGExMCwgMH0sCi17ICJjb21idCIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/dG54LGIsdyIsIHBhMTAsIDB9LAoteyAiY29tYmYiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLCAiP3RueCxiLHciLCBwYTEwLCAwfSwKLXsgImNvbWlidCIsCTB4ODQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/dG41LGIsdyIsIHBhMTAsIDB9LAoteyAiY29taWJmIiwJMHg4YzAwMDAwMCwgMHhmYzAwMDAwMCwgIj90bjUsYix3IiwgcGExMCwgMH0sCi17ICJhZGRidCIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/ZG54LGIsdyIsIHBhMTAsIDB9LAoteyAiYWRkYmYiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLCAiP2RueCxiLHciLCBwYTEwLCAwfSwKLXsgImFkZGlidCIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/ZG41LGIsdyIsIHBhMTAsIDB9LAoteyAiYWRkaWJmIiwJMHhhYzAwMDAwMCwgMHhmYzAwMDAwMCwgIj9kbjUsYix3IiwgcGExMCwgMH0sCi17ICJiYiIsCQkweGMwMDA2MDAwLCAweGZmZTA2MDAwLCAiP0JueCwhLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sIAoteyAiYmIiLAkJMHhjNDAwNDAwMCwgMHhmYzAwNDAwMCwgIj9CbngsQix3IiwgcGEyMCwgRkxBR19TVFJJQ1R9LCAKLXsgImJiIiwJCTB4YzAwMDQwMDAsIDB4ZmZlMDYwMDAsICI/Ym54LCEsdyIsIHBhMTAsIEZMQUdfU1RSSUNUfSwgCi17ICJiYiIsCQkweGM0MDA0MDAwLCAweGZjMDA0MDAwLCAiP2JueCxRLHciLCBwYTEwLCAwfSwgCi17ICJidmIiLAkweGMwMDA0MDAwLCAweGZmZTA0MDAwLCAiP2JueCx3IiwgcGExMCwgMH0sCi17ICJjbHJidHMiLAkweGU4MDA0MDA1LCAweGZmZmZmZmZmLCAiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicG9wYnRzIiwJMHhlODAwNDAwNSwgMHhmZmZmZjAwNywgIiQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwdXNobm9tIiwJMHhlODAwNDAwMSwgMHhmZmZmZmZmZiwgIiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInB1c2hidHMiLAkweGU4MDA0MDAxLCAweGZmZTBmZmZmLCAieCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLQotLyogQ29tcHV0YXRpb24gSW5zdHJ1Y3Rpb25zICovCi0KLXsgImNtcGNsciIsICAgICAweDA4MDAwOGEwLCAweGZjMDAwZmUwLCAiP1N4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImNtcGNsciIsICAgICAweDA4MDAwODgwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNvbWNsciIsICAgICAweDA4MDAwODgwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAib3IiLCAgICAgICAgIDB4MDgwMDAyNjAsIDB4ZmMwMDBmZTAsICI/THgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAib3IiLCAgICAgICAgIDB4MDgwMDAyNDAsIDB4ZmMwMDBmZTAsICI/bHgsYix0IiwgcGExMCwgMH0sCi17ICJ4b3IiLCAgICAgICAgMHgwODAwMDJhMCwgMHhmYzAwMGZlMCwgIj9MeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJ4b3IiLCAgICAgICAgMHgwODAwMDI4MCwgMHhmYzAwMGZlMCwgIj9seCxiLHQiLCBwYTEwLCAwfSwKLXsgImFuZCIsICAgICAgICAweDA4MDAwMjIwLCAweGZjMDAwZmUwLCAiP0x4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImFuZCIsICAgICAgICAweDA4MDAwMjAwLCAweGZjMDAwZmUwLCAiP2x4LGIsdCIsIHBhMTAsIDB9LAoteyAiYW5kY20iLCAgICAgIDB4MDgwMDAwMjAsIDB4ZmMwMDBmZTAsICI/THgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYW5kY20iLCAgICAgIDB4MDgwMDAwMDAsIDB4ZmMwMDBmZTAsICI/bHgsYix0IiwgcGExMCwgMH0sCi17ICJ1eG9yIiwgICAgICAgMHgwODAwMDNhMCwgMHhmYzAwMGZlMCwgIj9VeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJ1eG9yIiwgICAgICAgMHgwODAwMDM4MCwgMHhmYzAwMGZlMCwgIj91eCxiLHQiLCBwYTEwLCAwfSwKLXsgInVhZGRjbSIsICAgICAweDA4MDAwOWEwLCAweGZjMDAwZmEwLCAiY1Q/VXgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAidWFkZGNtIiwgICAgIDB4MDgwMDA5ODAsIDB4ZmMwMDBmYTAsICJjVD91eCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJ1YWRkY20iLCAgICAgMHgwODAwMDk4MCwgMHhmYzAwMGZlMCwgIj91eCxiLHQiLCBwYTEwLCAwfSwKLXsgInVhZGRjbXQiLCAgICAweDA4MDAwOWMwLCAweGZjMDAwZmUwLCAiP3V4LGIsdCIsIHBhMTAsIDB9LAoteyAiZGNvciIsICAgICAgIDB4MDgwMDBiYTAsIDB4ZmMxZjBmYTAsICJjaT9VYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZGNvciIsICAgICAgIDB4MDgwMDBiODAsIDB4ZmMxZjBmYTAsICJjaT91Yix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZGNvciIsICAgICAgIDB4MDgwMDBiODAsIDB4ZmMxZjBmZTAsICI/dWIsdCIsICAgcGExMCwgMH0sCi17ICJpZGNvciIsICAgICAgMHgwODAwMGJjMCwgMHhmYzFmMGZlMCwgIj91Yix0IiwgICBwYTEwLCAwfSwKLXsgImFkZGkiLCAgICAgICAweGIwMDAwMDAwLCAweGZjMDAwMDAwLCAiY3Q/YWksYix4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkaSIsICAgICAgIDB4YjQwMDAwMDAsIDB4ZmMwMDAwMDAsICJjdj9haSxiLHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJhZGRpIiwgICAgICAgMHhiNDAwMDAwMCwgMHhmYzAwMDgwMCwgIj9haSxiLHgiLCBwYTEwLCAwfSwKLXsgImFkZGlvIiwgICAgICAweGI0MDAwODAwLCAweGZjMDAwODAwLCAiP2FpLGIseCIsIHBhMTAsIDB9LAoteyAiYWRkaXQiLCAgICAgIDB4YjAwMDAwMDAsIDB4ZmMwMDA4MDAsICI/YWksYix4IiwgcGExMCwgMH0sCi17ICJhZGRpdG8iLCAgICAgMHhiMDAwMDgwMCwgMHhmYzAwMDgwMCwgIj9haSxiLHgiLCBwYTEwLCAwfSwKLXsgImFkZCIsICAgICAgICAweDA4MDAwNzIwLCAweGZjMDAwN2UwLCAiY1k/QXgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkIiwgICAgICAgIDB4MDgwMDA3MDAsIDB4ZmMwMDA3ZTAsICJjeT9heCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJhZGQiLCAgICAgICAgMHgwODAwMDIyMCwgMHhmYzAwMDNlMCwgImNhP0F4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZCIsICAgICAgICAweDA4MDAwMjAwLCAweGZjMDAwM2UwLCAiY2E/YXgsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkIiwgICAgICAgIDB4MDgwMDA2MDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJhZGRsIiwgICAgICAgMHgwODAwMGEwMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgImFkZG8iLCAgICAgICAweDA4MDAwZTAwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAiYWRkYyIsICAgICAgIDB4MDgwMDA3MDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJhZGRjbyIsICAgICAgMHgwODAwMGYwMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNGUwLCAweGZjMDAwN2UwLCAiY3Q/U3gsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0YzAsIDB4ZmMwMDA3ZTAsICJjdD9zeCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDUyMCwgMHhmYzAwMDdlMCwgImNCP1N4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNTAwLCAweGZjMDAwN2UwLCAiY2I/c3gsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0MjAsIDB4ZmMwMDA3ZTAsICJjdj9TeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDQwMCwgMHhmYzAwMDdlMCwgImN2P3N4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNDAwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAic3VibyIsICAgICAgIDB4MDgwMDBjMDAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJiIiwgICAgICAgMHgwODAwMDUwMCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1YmJvIiwgICAgICAweDA4MDAwZDAwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAic3VidCIsICAgICAgIDB4MDgwMDA0YzAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJ0byIsICAgICAgMHgwODAwMGNjMCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgImRzIiwgICAgICAgICAweDA4MDAwNDQwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAic3ViaSIsICAgICAgIDB4OTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJjdj9zaSxiLHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdWJpIiwgICAgICAgMHg5NDAwMDAwMCwgMHhmYzAwMDgwMCwgIj9zaSxiLHgiLCBwYTEwLCAwfSwKLXsgInN1YmlvIiwgICAgICAweDk0MDAwODAwLCAweGZjMDAwODAwLCAiP3NpLGIseCIsIHBhMTAsIDB9LAoteyAiY21waWNsciIsICAgIDB4OTAwMDA4MDAsIDB4ZmMwMDA4MDAsICI/U2ksYix4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY21waWNsciIsICAgIDB4OTAwMDAwMDAsIDB4ZmMwMDA4MDAsICI/c2ksYix4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY29taWNsciIsICAgIDB4OTAwMDAwMDAsIDB4ZmMwMDA4MDAsICI/c2ksYix4IiwgcGExMCwgMH0sCi17ICJzaGxhZGQiLCAgICAgMHgwODAwMDIyMCwgMHhmYzAwMDMyMCwgImNhP0F4LC4sYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic2hsYWRkIiwgICAgIDB4MDgwMDAyMDAsIDB4ZmMwMDAzMjAsICJjYT9heCwuLGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInNoMWFkZCIsICAgICAweDA4MDAwNjQwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gxYWRkbCIsICAgIDB4MDgwMDBhNDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDFhZGRvIiwgICAgMHgwODAwMGU0MCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoMmFkZCIsICAgICAweDA4MDAwNjgwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gyYWRkbCIsICAgIDB4MDgwMDBhODAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDJhZGRvIiwgICAgMHgwODAwMGU4MCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoM2FkZCIsICAgICAweDA4MDAwNmMwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gzYWRkbCIsICAgIDB4MDgwMDBhYzAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDNhZGRvIiwgICAgMHgwODAwMGVjMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLQotLyogU3Vid29yZCBPcGVyYXRpb24gSW5zdHJ1Y3Rpb25zICovCi0KLXsgImhhZGQiLCAgICAgICAweDA4MDAwMzAwLCAweGZjMDBmZjIwLCAiY0h4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhhdmciLCAgICAgICAweDA4MDAwMmMwLCAweGZjMDBmZmUwLCAieCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJoc2hsIiwgICAgICAgMHhmODAwODgwMCwgMHhmZmUwZmMyMCwgIngsKix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiaHNobGFkZCIsICAgIDB4MDgwMDA3MDAsIDB4ZmMwMGZmMjAsICJ4LC4sYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiaHNociIsICAgICAgIDB4ZjgwMGM4MDAsIDB4ZmMxZmY4MjAsICJjU2IsKix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiaHNocmFkZCIsICAgIDB4MDgwMDA1MDAsIDB4ZmMwMGZmMjAsICJ4LC4sYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiaHN1YiIsICAgICAgIDB4MDgwMDAxMDAsIDB4ZmMwMGZmMjAsICJjSHgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibWl4aCIsICAgICAgIDB4ZjgwMDg0MDAsIDB4ZmMwMDlmZTAsICJjaHgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibWl4dyIsICAgICAgIDB4ZjgwMDgwMDAsIDB4ZmMwMDlmZTAsICJjaHgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicGVybWgiLCAgICAgIDB4ZjgwMDAwMDAsIDB4ZmMwMDkwMjAsICJjKmEsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLQotCi0vKiBFeHRyYWN0IGFuZCBEZXBvc2l0IEluc3RydWN0aW9ucyAqLwotCi17ICJzaHJwZCIsICAgICAgMHhkMDAwMDIwMCwgMHhmYzAwMWZlMCwgIj9YeCxiLCEsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInNocnBkIiwgICAgICAweGQwMDAwNDAwLCAweGZjMDAxNDAwLCAiP1h4LGIsfix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic2hycHciLCAgICAgIDB4ZDAwMDAwMDAsIDB4ZmMwMDFmZTAsICI/eHgsYiwhLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzaHJwdyIsICAgICAgMHhkMDAwMDgwMCwgMHhmYzAwMWMwMCwgIj94eCxiLHAsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInZzaGQiLCAgICAgICAweGQwMDAwMDAwLCAweGZjMDAxZmUwLCAiP3h4LGIsdCIsIHBhMTAsIDB9LAoteyAic2hkIiwgICAgICAgIDB4ZDAwMDA4MDAsIDB4ZmMwMDFjMDAsICI/eHgsYixwLHQiLCBwYTEwLCAwfSwKLXsgImV4dHJkIiwgICAgICAweGQwMDAxMjAwLCAweGZjMDAxYWUwLCAiY1M/WGIsISwlLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJleHRyZCIsICAgICAgMHhkODAwMDAwMCwgMHhmYzAwMDAwMCwgImNTP1hiLHEsfCx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZXh0cnciLCAgICAgIDB4ZDAwMDEwMDAsIDB4ZmMwMDFiZTAsICJjUz94YiwhLFQseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImV4dHJ3IiwgICAgICAweGQwMDAxODAwLCAweGZjMDAxODAwLCAiY1M/eGIsUCxULHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJ2ZXh0cnUiLCAgICAgMHhkMDAwMTAwMCwgMHhmYzAwMWZlMCwgIj94YixULHgiLCBwYTEwLCAwfSwKLXsgInZleHRycyIsICAgICAweGQwMDAxNDAwLCAweGZjMDAxZmUwLCAiP3hiLFQseCIsIHBhMTAsIDB9LAoteyAiZXh0cnUiLCAgICAgIDB4ZDAwMDE4MDAsIDB4ZmMwMDFjMDAsICI/eGIsUCxULHgiLCBwYTEwLCAwfSwKLXsgImV4dHJzIiwgICAgICAweGQwMDAxYzAwLCAweGZjMDAxYzAwLCAiP3hiLFAsVCx4IiwgcGExMCwgMH0sCi17ICJkZXBkIiwgICAgICAgMHhkNDAwMDIwMCwgMHhmYzAwMWFlMCwgImN6P1h4LCEsJSxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwZCIsICAgICAgIDB4ZjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJjej9YeCx+LHwsYiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcGRpIiwgICAgICAweGQ0MDAxMjAwLCAweGZjMDAxYWUwLCAiY3o/WDUsISwlLGIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJkZXBkaSIsICAgICAgMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgImN6P1g1LH4sfCxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwdyIsICAgICAgIDB4ZDQwMDAwMDAsIDB4ZmMwMDFiZTAsICJjej94eCwhLFQsYiIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcHciLCAgICAgICAweGQ0MDAwODAwLCAweGZjMDAxODAwLCAiY3o/eHgscCxULGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJkZXB3aSIsICAgICAgMHhkNDAwMTAwMCwgMHhmYzAwMWJlMCwgImN6P3g1LCEsVCxiIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwd2kiLCAgICAgIDB4ZDQwMDE4MDAsIDB4ZmMwMDE4MDAsICJjej94NSxwLFQsYiIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInp2ZGVwIiwgICAgICAweGQ0MDAwMDAwLCAweGZjMDAxZmUwLCAiP3h4LFQsYiIsIHBhMTAsIDB9LAoteyAidmRlcCIsICAgICAgIDB4ZDQwMDA0MDAsIDB4ZmMwMDFmZTAsICI/eHgsVCxiIiwgcGExMCwgMH0sCi17ICJ6ZGVwIiwgICAgICAgMHhkNDAwMDgwMCwgMHhmYzAwMWMwMCwgIj94eCxwLFQsYiIsIHBhMTAsIDB9LAoteyAiZGVwIiwgICAgICAgIDB4ZDQwMDBjMDAsIDB4ZmMwMDFjMDAsICI/eHgscCxULGIiLCBwYTEwLCAwfSwKLXsgInp2ZGVwaSIsICAgICAweGQ0MDAxMDAwLCAweGZjMDAxZmUwLCAiP3g1LFQsYiIsIHBhMTAsIDB9LAoteyAidmRlcGkiLCAgICAgIDB4ZDQwMDE0MDAsIDB4ZmMwMDFmZTAsICI/eDUsVCxiIiwgcGExMCwgMH0sCi17ICJ6ZGVwaSIsICAgICAgMHhkNDAwMTgwMCwgMHhmYzAwMWMwMCwgIj94NSxwLFQsYiIsIHBhMTAsIDB9LAoteyAiZGVwaSIsICAgICAgIDB4ZDQwMDFjMDAsIDB4ZmMwMDFjMDAsICI/eDUscCxULGIiLCBwYTEwLCAwfSwKLQotLyogU3lzdGVtIENvbnRyb2wgSW5zdHJ1Y3Rpb25zICovCi0KLXsgImJyZWFrIiwgICAgICAweDAwMDAwMDAwLCAweGZjMDAxZmUwLCAicixBIiwgcGExMCwgMH0sCi17ICJyZmkiLCAgICAgICAgMHgwMDAwMGMwMCwgMHhmZmZmZmYxZiwgImNyIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAicmZpIiwgICAgICAgIDB4MDAwMDBjMDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgInJmaXIiLCAgICAgICAweDAwMDAwY2EwLCAweGZmZmZmZmZmLCAiIiwgcGExMSwgMH0sCi17ICJzc20iLCAgICAgICAgMHgwMDAwMGQ2MCwgMHhmYzAwZmZlMCwgIlUsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInNzbSIsICAgICAgICAweDAwMDAwZDYwLCAweGZmZTBmZmUwLCAiUix0IiwgcGExMCwgMH0sCi17ICJyc20iLCAgICAgICAgMHgwMDAwMGU2MCwgMHhmYzAwZmZlMCwgIlUsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInJzbSIsICAgICAgICAweDAwMDAwZTYwLCAweGZmZTBmZmUwLCAiUix0IiwgcGExMCwgMH0sCi17ICJtdHNtIiwgICAgICAgMHgwMDAwMTg2MCwgMHhmZmUwZmZmZiwgIngiLCBwYTEwLCAwfSwKLXsgImxkc2lkIiwgICAgICAweDAwMDAxMGEwLCAweGZjMWYzZmUwLCAiKHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRzaWQiLCAgICAgIDB4MDAwMDEwYTAsIDB4ZmMxZjNmZTAsICIoYiksdCIsIHBhMTAsIDB9LAoteyAibXRzcCIsICAgICAgIDB4MDAwMDE4MjAsIDB4ZmZlMDFmZmYsICJ4LFMiLCBwYTEwLCAwfSwKLXsgIm10Y3RsIiwgICAgICAweDAwMDAxODQwLCAweGZjMDBmZmZmLCAieCxeIiwgcGExMCwgMH0sCi17ICJtdHNhcmNtIiwgICAgMHgwMTYwMThDMCwgMHhmZmUwZmZmZiwgIngiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJtZmlhIiwgICAgICAgMHgwMDAwMTRBMCwgMHhmZmZmZmZlMCwgInQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJtZnNwIiwgICAgICAgMHgwMDAwMDRhMCwgMHhmZmZmMWZlMCwgIlMsdCIsIHBhMTAsIDB9LAoteyAibWZjdGwiLCAgICAgIDB4MDE2MDQ4YTAsIDB4ZmZmZmZmZTAsICJjVyEsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1mY3RsIiwgICAgICAweDAwMDAwOGEwLCAweGZjMWZmZmUwLCAiXix0IiwgcGExMCwgMH0sCi17ICJzeW5jIiwgICAgICAgMHgwMDAwMDQwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAic3luY2RtYSIsICAgIDB4MDAxMDA0MDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgInByb2JlIiwgICAgICAweDA0MDAxMTgwLCAweGZjMDAzZmEwLCAiY3cocyxiKSx4LHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJwcm9iZSIsICAgICAgMHgwNDAwMTE4MCwgMHhmYzAwM2ZhMCwgImN3KGIpLHgsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInByb2JlaSIsICAgICAweDA0MDAzMTgwLCAweGZjMDAzZmEwLCAiY3cocyxiKSxSLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJwcm9iZWkiLCAgICAgMHgwNDAwMzE4MCwgMHhmYzAwM2ZhMCwgImN3KGIpLFIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInByb2JlciIsICAgICAweDA0MDAxMTgwLCAweGZjMDAzZmUwLCAiKHMsYikseCx0IiwgcGExMCwgMH0sCi17ICJwcm9iZXIiLCAgICAgMHgwNDAwMTE4MCwgMHhmYzAwM2ZlMCwgIihiKSx4LHQiLCBwYTEwLCAwfSwKLXsgInByb2JlcmkiLCAgICAweDA0MDAzMTgwLCAweGZjMDAzZmUwLCAiKHMsYiksUix0IiwgcGExMCwgMH0sCi17ICJwcm9iZXJpIiwgICAgMHgwNDAwMzE4MCwgMHhmYzAwM2ZlMCwgIihiKSxSLHQiLCBwYTEwLCAwfSwKLXsgInByb2JldyIsICAgICAweDA0MDAxMWMwLCAweGZjMDAzZmUwLCAiKHMsYikseCx0IiwgcGExMCwgMH0sCi17ICJwcm9iZXciLCAgICAgMHgwNDAwMTFjMCwgMHhmYzAwM2ZlMCwgIihiKSx4LHQiLCBwYTEwLCAwfSwKLXsgInByb2Jld2kiLCAgICAweDA0MDAzMWMwLCAweGZjMDAzZmUwLCAiKHMsYiksUix0IiwgcGExMCwgMH0sCi17ICJwcm9iZXdpIiwgICAgMHgwNDAwMzFjMCwgMHhmYzAwM2ZlMCwgIihiKSxSLHQiLCBwYTEwLCAwfSwKLXsgImxwYSIsICAgICAgICAweDA0MDAxMzQwLCAweGZjMDAzZmMwLCAiY1p4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibHBhIiwgICAgICAgIDB4MDQwMDEzNDAsIDB4ZmMwMDNmYzAsICJjWngoYiksdCIsIHBhMTAsIDB9LAoteyAibGhhIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmYzAsICJjWngocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsaGEiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZjMCwgImNaeChiKSx0IiwgcGExMCwgMH0sCi17ICJsY2kiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZlMCwgIngocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsY2kiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZlMCwgIngoYiksdCIsIHBhMTAsIDB9LAoteyAicGR0bGIiLCAgICAgIDB4MDQwMDE2MDAsIDB4ZmMwMDNmZGYsICJjTGNaeChzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicGR0bGIiLCAgICAgIDB4MDQwMDE2MDAsIDB4ZmMwMDNmZGYsICJjTGNaeChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBkdGxiIiwgICAgICAweDA0MDAxMjAwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTEwLCAwfSwKLXsgInBkdGxiIiwgICAgICAweDA0MDAxMjAwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJwaXRsYiIsICAgICAgMHgwNDAwMDYwMCwgMHhmYzAwMWZkZiwgImNMY1p4KFMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwaXRsYiIsICAgICAgMHgwNDAwMDYwMCwgMHhmYzAwMWZkZiwgImNMY1p4KGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicGl0bGIiLCAgICAgIDB4MDQwMDAyMDAsIDB4ZmMwMDFmZGYsICJjWngoUyxiKSIsIHBhMTAsIDB9LAoteyAicGl0bGIiLCAgICAgIDB4MDQwMDAyMDAsIDB4ZmMwMDFmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgInBkdGxiZSIsICAgICAweDA0MDAxMjQwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTEwLCAwfSwKLXsgInBkdGxiZSIsICAgICAweDA0MDAxMjQwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJwaXRsYmUiLCAgICAgMHgwNDAwMDI0MCwgMHhmYzAwMWZkZiwgImNaeChTLGIpIiwgcGExMCwgMH0sCi17ICJwaXRsYmUiLCAgICAgMHgwNDAwMDI0MCwgMHhmYzAwMWZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAiaWR0bGJhIiwgICAgIDB4MDQwMDEwNDAsIDB4ZmMwMDNmZmYsICJ4LChzLGIpIiwgcGExMCwgMH0sCi17ICJpZHRsYmEiLCAgICAgMHgwNDAwMTA0MCwgMHhmYzAwM2ZmZiwgIngsKGIpIiwgcGExMCwgMH0sCi17ICJpaXRsYmEiLCAgICAgMHgwNDAwMDA0MCwgMHhmYzAwMWZmZiwgIngsKFMsYikiLCBwYTEwLCAwfSwKLXsgImlpdGxiYSIsICAgICAweDA0MDAwMDQwLCAweGZjMDAxZmZmLCAieCwoYikiLCBwYTEwLCAwfSwKLXsgImlkdGxicCIsICAgICAweDA0MDAxMDAwLCAweGZjMDAzZmZmLCAieCwocyxiKSIsIHBhMTAsIDB9LAoteyAiaWR0bGJwIiwgICAgIDB4MDQwMDEwMDAsIDB4ZmMwMDNmZmYsICJ4LChiKSIsIHBhMTAsIDB9LAoteyAiaWl0bGJwIiwgICAgIDB4MDQwMDAwMDAsIDB4ZmMwMDFmZmYsICJ4LChTLGIpIiwgcGExMCwgMH0sCi17ICJpaXRsYnAiLCAgICAgMHgwNDAwMDAwMCwgMHhmYzAwMWZmZiwgIngsKGIpIiwgcGExMCwgMH0sCi17ICJwZGMiLCAgICAgICAgMHgwNDAwMTM4MCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMCwgMH0sCi17ICJwZGMiLCAgICAgICAgMHgwNDAwMTM4MCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAiZmRjIiwgICAgICAgIDB4MDQwMDEyODAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTAsIDB9LAoteyAiZmRjIiwgICAgICAgIDB4MDQwMDEyODAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgImZpYyIsICAgICAgICAweDA0MDAwMjgwLCAweGZjMDAxZmRmLCAiY1p4KFMsYikiLCBwYTEwLCAwfSwKLXsgImZpYyIsICAgICAgICAweDA0MDAwMjgwLCAweGZjMDAxZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJmZGNlIiwgICAgICAgMHgwNDAwMTJjMCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMCwgMH0sCi17ICJmZGNlIiwgICAgICAgMHgwNDAwMTJjMCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAiZmljZSIsICAgICAgIDB4MDQwMDAyYzAsIDB4ZmMwMDFmZGYsICJjWngoUyxiKSIsIHBhMTAsIDB9LAoteyAiZmljZSIsICAgICAgIDB4MDQwMDAyYzAsIDB4ZmMwMDFmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgImRpYWciLCAgICAgICAweDE0MDAwMDAwLCAweGZjMDAwMDAwLCAiRCIsIHBhMTAsIDB9LAoteyAiaWR0bGJ0IiwgICAgIDB4MDQwMDE4MDAsIDB4ZmMwMGZmZmYsICJ4LGIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJpaXRsYnQiLCAgICAgMHgwNDAwMDgwMCwgMHhmYzAwZmZmZiwgIngsYiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLQotLyogVGhlc2UgbWF5IGJlIHNwZWNpZmljIHRvIGNlcnRhaW4gdmVyc2lvbnMgb2YgdGhlIFBBLiAgSm9lbCBjbGFpbWVkCi0gICB0aGV5IHdlcmUgNzIwMDAgKDcyMDA/KSBzcGVjaWZpYy4gIEhvd2V2ZXIsIEknbSBhbG1vc3QgY2VydGFpbiB0aGUKLSAgIG10Y3B1L21mY3B1IHdlcmUgdW5kb2N1bWVudGVkLCBidXQgYXZhaWxhYmxlIGluIHRoZSBvbGRlciA3MDAgbWFjaGluZXMuICAqLwoteyAibXRjcHUiLCAgICAgIDB4MTQwMDE2MDAsIDB4ZmMwMGZmZmYsICJ4LF4iLCBwYTEwLCAwfSwKLXsgIm1mY3B1IiwgICAgICAweDE0MDAxQTAwLCAweGZjMDBmZmZmLCAiXix4IiwgcGExMCwgMH0sCi17ICJ0b2NlbiIsICAgICAgMHgxNDQwMzYwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAidG9jZGlzIiwgICAgIDB4MTQ0MDE2MjAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgInNoZHdnciIsICAgICAweDE0NDAyNjAwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJncnNoZHciLCAgICAgMHgxNDQwMDYyMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAotCi0vKiBnZncgYW5kIGdmciBhcmUgbm90IGluIHRoZSBIUCBQQSAxLjEgbWFudWFsLCBidXQgdGhleSBhcmUgaW4gZWl0aGVyCi0gICB0aGUgVGltZXggRlBVIG9yIHRoZSBNdXN0YW5nIEVSUyAobm90IHN1cmUgd2hpY2gpIG1hbnVhbC4gICovCi17ICJnZnciLAkweDA0MDAxNjgwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTExLCAwfSwKLXsgImdmdyIsCTB4MDQwMDE2ODAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTExLCAwfSwKLXsgImdmciIsCTB4MDQwMDFhODAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTEsIDB9LAoteyAiZ2ZyIiwJMHgwNDAwMWE4MCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTEsIDB9LAotCi0vKiBGbG9hdGluZyBQb2ludCBDb3Byb2Nlc3NvciBJbnN0cnVjdGlvbnMgKi8KLSAKLXsgImZsZHciLCAgICAgICAweDI0MDAxMDIwLCAweGZjMWYzM2EwLCAiY29jY0AocyxiKSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDI0MDAxMDIwLCAweGZjMWYzM2EwLCAiY29jY0AoYiksZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMTM4MCwgImN4Y2N4KHMsYiksZlQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMTM4MCwgImN4Y2N4KGIpLGZUIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDEzODAsICJjbWNjNShzLGIpLGZUIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDEzODAsICJjbWNjNShiKSxmVCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDVjMDAwMDAwLCAweGZjMDAwMDA0LCAiZChzLGIpLGZlIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4NWMwMDAwMDAsIDB4ZmMwMDAwMDQsICJkKGIpLGZlIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4NTgwMDAwMDAsIDB4ZmMwMDAwMDQsICJjSmQocyxiKSxmZSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDU4MDAwMDAwLCAweGZjMDAwMDA0LCAiY0pkKGIpLGZlIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4MmMwMDEwMjAsIDB4ZmMxZjMzZTAsICJjb2NjQChzLGIpLGZ0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4MmMwMDEwMjAsIDB4ZmMxZjMzZTAsICJjb2NjQChiKSxmdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDJjMDAwMDAwLCAweGZjMDAxM2MwLCAiY3hjY3gocyxiKSxmdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDJjMDAwMDAwLCAweGZjMDAxM2MwLCAiY3hjY3goYiksZnQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMTNjMCwgImNtY2M1KHMsYiksZnQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMTNjMCwgImNtY2M1KGIpLGZ0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4NTAwMDAwMDIsIDB4ZmMwMDAwMDIsICJjcSMocyxiKSx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4NTAwMDAwMDIsIDB4ZmMwMDAwMDIsICJjcSMoYikseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDI0MDAxMjIwLCAweGZjMWYzM2EwLCAiY29jQ2ZULEAocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDI0MDAxMjIwLCAweGZjMWYzM2EwLCAiY29jQ2ZULEAoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMTM4MCwgImN4Y0NmVCx4KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMTM4MCwgImN4Y0NmVCx4KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDEzODAsICJjbWNDZlQsNShzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDEzODAsICJjbWNDZlQsNShiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDdjMDAwMDAwLCAweGZjMDAwMDA0LCAiZmUsZChzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4N2MwMDAwMDAsIDB4ZmMwMDAwMDQsICJmZSxkKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4NzgwMDAwMDAsIDB4ZmMwMDAwMDQsICJjSmZlLGQocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDc4MDAwMDAwLCAweGZjMDAwMDA0LCAiY0pmZSxkKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4MmMwMDEyMjAsIDB4ZmMxZjMzZTAsICJjb2NDZnQsQChzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4MmMwMDEyMjAsIDB4ZmMxZjMzZTAsICJjb2NDZnQsQChiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDJjMDAwMjAwLCAweGZjMDAxM2MwLCAiY3hjQ2Z0LHgocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDJjMDAwMjAwLCAweGZjMDAxM2MwLCAiY3hjQ2Z0LHgoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMTNjMCwgImNtY0NmdCw1KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMTNjMCwgImNtY0NmdCw1KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4NzAwMDAwMDIsIDB4ZmMwMDAwMDIsICJjcXgsIyhzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4NzAwMDAwMDIsIDB4ZmMwMDAwMDIsICJjcXgsIyhiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZjgwLCAiY3h4KHMsYiksZlQiLCBwYTEwLCAwfSwKLXsgImZsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZjgwLCAiY3h4KGIpLGZUIiwgcGExMCwgMH0sCi17ICJmbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4eChzLGIpLGZ0IiwgcGExMCwgMH0sCi17ICJmbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4eChiKSxmdCIsIHBhMTAsIDB9LAoteyAiZnN0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFmODAsICJjeGZULHgocyxiKSIsIHBhMTAsIDB9LAoteyAiZnN0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFmODAsICJjeGZULHgoYikiLCBwYTEwLCAwfSwKLXsgImZzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3hmdCx4KHMsYikiLCBwYTEwLCAwfSwKLXsgImZzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3hmdCx4KGIpIiwgcGExMCwgMH0sCi17ICJmc3RxeCIsICAgICAgMHgzYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN4ZnQseChzLGIpIiwgcGExMCwgMH0sCi17ICJmc3RxeCIsICAgICAgMHgzYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN4ZnQseChiKSIsIHBhMTAsIDB9LAoteyAiZmxkd3MiLCAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFmODAsICJjbTUocyxiKSxmVCIsIHBhMTAsIDB9LAoteyAiZmxkd3MiLCAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFmODAsICJjbTUoYiksZlQiLCBwYTEwLCAwfSwKLXsgImZsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZmMwLCAiY201KHMsYiksZnQiLCBwYTEwLCAwfSwKLXsgImZsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZmMwLCAiY201KGIpLGZ0IiwgcGExMCwgMH0sCi17ICJmc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWY4MCwgImNtZlQsNShzLGIpIiwgcGExMCwgMH0sCi17ICJmc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWY4MCwgImNtZlQsNShiKSIsIHBhMTAsIDB9LAoteyAiZnN0ZHMiLCAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFmYzAsICJjbWZ0LDUocyxiKSIsIHBhMTAsIDB9LAoteyAiZnN0ZHMiLCAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFmYzAsICJjbWZ0LDUoYikiLCBwYTEwLCAwfSwKLXsgImZzdHFzIiwgICAgICAweDNjMDAxMjAwLCAweGZjMDAxZmMwLCAiY21mdCw1KHMsYikiLCBwYTEwLCAwfSwKLXsgImZzdHFzIiwgICAgICAweDNjMDAxMjAwLCAweGZjMDAxZmMwLCAiY21mdCw1KGIpIiwgcGExMCwgMH0sCi17ICJmYWRkIiwgICAgICAgMHgzMDAwMDYwMCwgMHhmYzAwZTdlMCwgIkZmYSxmYixmVCIsIHBhMTAsIDB9LAoteyAiZmFkZCIsICAgICAgIDB4MzgwMDA2MDAsIDB4ZmMwMGU3MjAsICJJZkEsZkIsZlQiLCBwYTEwLCAwfSwKLXsgImZzdWIiLCAgICAgICAweDMwMDAyNjAwLCAweGZjMDBlN2UwLCAiRmZhLGZiLGZUIiwgcGExMCwgMH0sCi17ICJmc3ViIiwgICAgICAgMHgzODAwMjYwMCwgMHhmYzAwZTcyMCwgIklmQSxmQixmVCIsIHBhMTAsIDB9LAoteyAiZm1weSIsICAgICAgIDB4MzAwMDQ2MDAsIDB4ZmMwMGU3ZTAsICJGZmEsZmIsZlQiLCBwYTEwLCAwfSwKLXsgImZtcHkiLCAgICAgICAweDM4MDA0NjAwLCAweGZjMDBlNzIwLCAiSWZBLGZCLGZUIiwgcGExMCwgMH0sCi17ICJmZGl2IiwgICAgICAgMHgzMDAwNjYwMCwgMHhmYzAwZTdlMCwgIkZmYSxmYixmVCIsIHBhMTAsIDB9LAoteyAiZmRpdiIsICAgICAgIDB4MzgwMDY2MDAsIDB4ZmMwMGU3MjAsICJJZkEsZkIsZlQiLCBwYTEwLCAwfSwKLXsgImZzcXJ0IiwgICAgICAweDMwMDA4MDAwLCAweGZjMWZlN2UwLCAiRmZhLGZUIiwgcGExMCwgMH0sCi17ICJmc3FydCIsICAgICAgMHgzODAwODAwMCwgMHhmYzFmZTcyMCwgIkZmQSxmVCIsIHBhMTAsIDB9LAoteyAiZmFicyIsICAgICAgIDB4MzAwMDYwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZhYnMiLCAgICAgICAweDM4MDA2MDAwLCAweGZjMWZlNzIwLCAiRmZBLGZUIiwgcGExMCwgMH0sCi17ICJmcmVtIiwgICAgICAgMHgzMDAwODYwMCwgMHhmYzAwZTdlMCwgIkZmYSxmYixmVCIsIHBhMTAsIDB9LAoteyAiZnJlbSIsICAgICAgIDB4MzgwMDg2MDAsIDB4ZmMwMGU3MjAsICJGZkEsZkIsZlQiLCBwYTEwLCAwfSwKLXsgImZybmQiLCAgICAgICAweDMwMDBhMDAwLCAweGZjMWZlN2UwLCAiRmZhLGZUIiwgcGExMCwgMH0sCi17ICJmcm5kIiwgICAgICAgMHgzODAwYTAwMCwgMHhmYzFmZTcyMCwgIkZmQSxmVCIsIHBhMTAsIDB9LAoteyAiZmNweSIsICAgICAgIDB4MzAwMDQwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZjcHkiLCAgICAgICAweDM4MDA0MDAwLCAweGZjMWZlNzIwLCAiRmZBLGZUIiwgcGExMCwgMH0sCi17ICJmY252ZmYiLCAgICAgMHgzMDAwMDIwMCwgMHhmYzFmODdlMCwgIkZHZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZmZiIsICAgICAweDM4MDAwMjAwLCAweGZjMWY4NzIwLCAiRkdmQSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudnhmIiwgICAgIDB4MzAwMDgyMDAsIDB4ZmMxZjg3ZTAsICJGR2ZhLGZUIiwgcGExMCwgMH0sCi17ICJmY252eGYiLCAgICAgMHgzODAwODIwMCwgMHhmYzFmODcyMCwgIkZHZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZmeCIsICAgICAweDMwMDEwMjAwLCAweGZjMWY4N2UwLCAiRkdmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzgwMTAyMDAsIDB4ZmMxZjg3MjAsICJGR2ZBLGZUIiwgcGExMCwgMH0sCi17ICJmY252Znh0IiwgICAgMHgzMDAxODIwMCwgMHhmYzFmODdlMCwgIkZHZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZmeHQiLCAgICAweDM4MDE4MjAwLCAweGZjMWY4NzIwLCAiRkdmQSxmVCIsIHBhMTAsIDB9LAoteyAiZm1weWZhZGQiLCAgIDB4YjgwMDAwMDAsIDB4ZmMwMDAwMjAsICJJZkEsZkIsZkMsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbXB5bmZhZGQiLCAgMHhiODAwMDAyMCwgMHhmYzAwMDAyMCwgIklmQSxmQixmQyxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZuZWciLCAgICAgICAweDMwMDBjMDAwLCAweGZjMWZlN2UwLCAiRmZhLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZm5lZyIsICAgICAgIDB4MzgwMGMwMDAsIDB4ZmMxZmU3MjAsICJJZkEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbmVnYWJzIiwgICAgMHgzMDAwZTAwMCwgMHhmYzFmZTdlMCwgIkZmYSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZuZWdhYnMiLCAgICAweDM4MDBlMDAwLCAweGZjMWZlNzIwLCAiSWZBLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmNudiIsICAgICAgIDB4MzAwMDAyMDAsIDB4ZmMxYzA3MjAsICJ7X2ZhLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmNudiIsICAgICAgIDB4MzgwMDAyMDAsIDB4ZmMxYzA3MjAsICJGR2ZBLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmNtcCIsICAgICAgIDB4MzAwMDA0MDAsIDB4ZmMwMDA3ZTAsICJGP2ZmYSxmYixoIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmNtcCIsICAgICAgIDB4MzgwMDA0MDAsIDB4ZmMwMDA3MjAsICJJP2ZmQSxmQixoIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmNtcCIsICAgICAgIDB4MzAwMDA0MDAsIDB4ZmMwMGU3ZTAsICJGP2ZmYSxmYiIsIHBhMTAsIDB9LAoteyAiZmNtcCIsICAgICAgIDB4MzgwMDA0MDAsIDB4ZmMwMGU3MjAsICJJP2ZmQSxmQiIsIHBhMTAsIDB9LAoteyAieG1weXUiLAkweDM4MDA0NzAwLCAweGZjMDBlNzIwLCAiZlgsZkIsZlQiLCBwYTExLCAwfSwKLXsgImZtcHlhZGQiLAkweDE4MDAwMDAwLCAweGZjMDAwMDAwLCAiSGZpLGZqLGZrLGZsLGZtIiwgcGExMSwgMH0sCi17ICJmbXB5c3ViIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwgIkhmaSxmaixmayxmbCxmbSIsIHBhMTEsIDB9LAoteyAiZnRlc3QiLCAgICAgIDB4MzAwMDI0MjAsIDB4ZmZmZmZmZTAsICIsPSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZ0ZXN0IiwgICAgICAweDMwMDAwNDIwLCAweGZmZmYxZmZmLCAibSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZ0ZXN0IiwgICAgICAweDMwMDAyNDIwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJmaWQiLCAgICAgICAgMHgzMDAwMDAwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTEsIDB9LAotCi0vKiBQZXJmb3JtYW5jZSBNb25pdG9yIEluc3RydWN0aW9ucyAqLwotCi17ICJwbWRpcyIsCTB4MzAwMDAyODAsIDB4ZmZmZmZmZGYsICJOIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicG1lbmIiLAkweDMwMDAwNjgwLCAweGZmZmZmZmZmLCAiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAotCi0vKiBBc3Npc3QgSW5zdHJ1Y3Rpb25zICovCi0KLXsgInNwb3AwIiwgICAgICAweDEwMDAwMDAwLCAweGZjMDAwNjAwLCAidixPTiIsIHBhMTAsIDB9LAoteyAic3BvcDEiLCAgICAgIDB4MTAwMDAyMDAsIDB4ZmMwMDA2MDAsICJ2LG9OdCIsIHBhMTAsIDB9LAoteyAic3BvcDIiLCAgICAgIDB4MTAwMDA0MDAsIDB4ZmMwMDA2MDAsICJ2LDFOYiIsIHBhMTAsIDB9LAoteyAic3BvcDMiLCAgICAgIDB4MTAwMDA2MDAsIDB4ZmMwMDA2MDAsICJ2LDBOeCxiIiwgcGExMCwgMH0sCi17ICJjb3ByIiwgICAgICAgMHgzMDAwMDAwMCwgMHhmYzAwMDAwMCwgInUsMk4iLCBwYTEwLCAwfSwKLXsgImNsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImNsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJjbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJjbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAiY3N0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgocyxiKSIsIHBhMTAsIDB9LAoteyAiY3N0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgoYikiLCBwYTEwLCAwfSwKLXsgImNzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KHMsYikiLCBwYTEwLCAwfSwKLXsgImNzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KGIpIiwgcGExMCwgMH0sCi17ICJjbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUocyxiKSx0IiwgcGExMCwgMH0sCi17ICJjbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAiY2xkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAiY2xkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KGIpLHQiLCBwYTEwLCAwfSwKLXsgImNzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KHMsYikiLCBwYTEwLCAwfSwKLXsgImNzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KGIpIiwgcGExMCwgMH0sCi17ICJjc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShzLGIpIiwgcGExMCwgMH0sCi17ICJjc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShiKSIsIHBhMTAsIDB9LAoteyAiY2xkdyIsICAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZHciLCAgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkdyIsICAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZHciLCAgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkZCIsICAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZGQiLCAgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkZCIsICAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZGQiLCAgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0dyIsICAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdHciLCAgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0dyIsICAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdHciLCAgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0ZCIsICAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdGQiLCAgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0ZCIsICAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdGQiLCAgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAotfTsKLQotI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIHBhX29wY29kZXMpLyhzaXplb2YgcGFfb3Bjb2Rlc1swXSkpCi0KLS8qIFNLViAxMi8xOC85Mi4gQWRkZWQgc29tZSBkZW5vdGF0aW9ucyBmb3IgdmFyaW91cyBvcGVyYW5kcy4gKi8KLQotI2RlZmluZSBQQV9JTU0xMV9BVF8zMSAnaScKLSNkZWZpbmUgUEFfSU1NMTRfQVRfMzEgJ2onCi0jZGVmaW5lIFBBX0lNTTIxX0FUXzMxICdrJwotI2RlZmluZSBQQV9ESVNQMTIgJ3cnCi0jZGVmaW5lIFBBX0RJU1AxNyAnVycKLQotI2RlZmluZSBOX0hQUEFfT1BFUkFORF9GT1JNQVRTIDUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2kzODYuaCBiL2luY2x1ZGUvb3Bjb2RlL2kzODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzYTU2NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc1ICswLDAgQEAKLS8qIG9wY29kZS9pMzg2LmggLS0gSW50ZWwgODAzODYgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgYW5kIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIFVuaXhXYXJlIGFzc2VtYmxlciwgYW5kIHByb2JhYmx5IG90aGVyIEFUJlQgZGVyaXZlZCBpeDg2IFVuaXgKLSAgIGFzc2VtYmxlcnMsIGdlbmVyYXRlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyB3aXRoIHJldmVyc2VkCi0gICBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVycyBpbiBjZXJ0YWluIGNhc2VzLiAgVW5mb3J0dW5hdGVseSwKLSAgIGdjYyBhbmQgcG9zc2libHkgbWFueSBvdGhlciBwcm9ncmFtcyB1c2UgdGhpcyByZXZlcnNlZCBzeW50YXgsIHNvCi0gICB3ZSdyZSBzdHVjayB3aXRoIGl0LgotCi0gICBlZy4gYGZzdWIgJXN0KDMpLCVzdCcgcmVzdWx0cyBpbiBzdCA8LSBzdCAtIHN0KDMpIGFzIGV4cGVjdGVkLCBidXQKLSAgIGBmc3ViICVzdCwlc3QoMyknIHJlc3VsdHMgaW4gc3QoMykgPC0gc3QgLSBzdCgzKSwgcmF0aGVyIHRoYW4KLSAgIHRoZSBleHBlY3RlZCBzdCgzKSA8LSBzdCgzKSAtIHN0ICEKLQotICAgVGhpcyBoYXBwZW5zIHdpdGggYWxsIHRoZSBub24tY29tbXV0YXRpdmUgYXJpdGhtZXRpYyBmbG9hdGluZyBwb2ludAotICAgb3BlcmF0aW9ucyB3aXRoIHR3byByZWdpc3RlciBvcGVyYW5kcywgd2hlcmUgdGhlIHNvdXJjZSByZWdpc3RlciBpcwotICAgJXN0LCBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgJXN0KGkpLiAgTG9vayBmb3IgRmxvYXREUiBiZWxvdy4gICovCi0KLSNpZm5kZWYgVU5JWFdBUkVfQ09NUEFUCi0vKiBTZXQgbm9uLXplcm8gZm9yIGJyb2tlbiwgY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMuICBTZXQgdG8gemVybyBmb3IKLSAgIG5vbi1icm9rZW4gb3Bjb2RlcyBhdCB5b3VyIHBlcmlsLiAgZ2NjIGdlbmVyYXRlcyBVbml4V2FyZQotICAgY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBVTklYV0FSRV9DT01QQVQgMQotI2VuZGlmCi0KLQotc3RhdGljIGNvbnN0IHRlbXBsYXRlIGkzODZfb3B0YWJbXSA9IHsKLQotI2RlZmluZSBYIE5vbmUKLSNkZWZpbmUgTm9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBiX1N1ZiAoTm9fd1N1ZnxOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSB3X1N1ZiAoTm9fYlN1ZnxOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBsX1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBkX1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX3NTdWZ8Tm9fbFN1ZnxOb194U3VmKQotI2RlZmluZSB4X1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX3NTdWZ8Tm9fbFN1ZnxOb19kU3VmKQotI2RlZmluZSBid19TdWYgKE5vX2xTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGJsX1N1ZiAoTm9fd1N1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgd2xfU3VmIChOb19iU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBzbF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHNsZF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb194U3VmKQotI2RlZmluZSBzbGR4X1N1ZiAoTm9fYlN1ZnxOb193U3VmKQotI2RlZmluZSBid2xfU3VmIChOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgYndsZF9TdWYgKE5vX3NTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgRlAgKE5vU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIGxfRlAgKGxfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIGRfRlAgKGRfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHhfRlAgKHhfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsX0ZQIChzbF9TdWZ8SWdub3JlU2l6ZSkKLSNkZWZpbmUgc2xkX0ZQIChzbGRfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsZHhfRlAgKHNsZHhfU3VmfElnbm9yZVNpemUpCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi0jZGVmaW5lIEZsb2F0RFIgRmxvYXRECi0jZWxzZQotI2RlZmluZSBGbG9hdERSIChGbG9hdER8RmxvYXRSKQotI2VuZGlmCi0KLS8qIG1vdmUgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIE1PVl9BWF9ESVNQMzIgMHhhMAoteyAibW92IiwgICAyLAkweGEwLCBYLCBid2xfU3VmfER8VywJCQl7IERpc3AxNnxEaXNwMzIsIEFjYywgMCB9IH0sCi17ICJtb3YiLCAgIDIsCTB4ODgsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAkJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyAibW92IiwgICAyLAkweGIwLCBYLCBid2xfU3VmfFd8U2hvcnRGb3JtLAkJeyBJbW0sIFJlZywgMCB9IH0sCi17ICJtb3YiLCAgIDIsCTB4YzYsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJCXsgSW1tLCBSZWd8QW55TWVtLCAwIH0gfSwKLS8qIFRoZSBuZXh0IHR3byBpbnN0cnVjdGlvbnMgYWNjZXB0IFdvcmRSZWcgc28gdGhhdCBhIHNlZ21lbnQgcmVnaXN0ZXIKLSAgIGNhbiBiZSBjb3BpZWQgdG8gYSAzMiBiaXQgcmVnaXN0ZXIsIGFuZCB2aWNlIHZlcnNhLCB3aXRob3V0IHVzaW5nIGEKLSAgIHNpemUgcHJlZml4LiAgV2hlbiBtb3ZpbmcgdG8gYSAzMiBiaXQgcmVnaXN0ZXIsIHRoZSB1cHBlciAxNiBiaXRzCi0gICBhcmUgc2V0IHRvIGFuIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdmFsdWUgKG9uIHRoZSBQZW50aXVtIFBybywKLSAgIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHplcm8pLiAgKi8KLXsgIm1vdiIsICAgMiwJMHg4YywgWCwgd2xfU3VmfE1vZHJtLAkJCXsgU1JlZzN8U1JlZzIsIFdvcmRSZWd8V29yZE1lbSwgMCB9IH0sCi17ICJtb3YiLCAgIDIsCTB4OGUsIFgsIHdsX1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFdvcmRSZWd8V29yZE1lbSwgU1JlZzN8U1JlZzIsIDAgfSB9LAotLyogbW92ZSB0by9mcm9tIGNvbnRyb2wgZGVidWcgcmVnaXN0ZXJzICovCi17ICJtb3YiLCAgIDIsIDB4MGYyMCwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IENvbnRyb2wsIFJlZzMyfEludk1lbSwgMH0gfSwKLXsgIm1vdiIsICAgMiwgMHgwZjIxLCBYLCBsX1N1ZnxEfE1vZHJtfElnbm9yZVNpemUsCXsgRGVidWcsIFJlZzMyfEludk1lbSwgMH0gfSwKLXsgIm1vdiIsICAgMiwgMHgwZjI0LCBYLCBsX1N1ZnxEfE1vZHJtfElnbm9yZVNpemUsCXsgVGVzdCwgUmVnMzJ8SW52TWVtLCAwfSB9LAotCi0vKiBtb3ZlIHdpdGggc2lnbiBleHRlbmQgKi8KLS8qICJtb3ZzYmwiICYgIm1vdnNidyIgbXVzdCBub3QgYmUgdW5pZmllZCBpbnRvICJtb3ZzYiIgdG8gYXZvaWQKLSAgIGNvbmZsaWN0IHdpdGggdGhlICJtb3ZzIiBzdHJpbmcgbW92ZSBpbnN0cnVjdGlvbi4gICovCi17Im1vdnNibCIsIDIsIDB4MGZiZSwgWCwgTm9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFJlZzMyLCAwfSB9LAoteyJtb3ZzYnciLCAyLCAweDBmYmUsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBSZWcxNiwgMH0gfSwKLXsibW92c3dsIiwgMiwgMHgwZmJmLCBYLCBOb1N1ZnxNb2RybSwJCQl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJtb3ZzeCIsICAyLCAweDBmYmYsIFgsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUsCXsgUmVnMTZ8U2hvcnRNZW0sIFJlZzMyLCAwfSB9LAoteyJtb3ZzeCIsICAyLCAweDBmYmUsIFgsIGJfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBtb3ZlIHdpdGggemVybyBleHRlbmQgKi8KLXsibW92emIiLCAgMiwgMHgwZmI2LCBYLCB3bF9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFdvcmRSZWcsIDB9IH0sCi17Im1vdnp3bCIsIDIsIDB4MGZiNywgWCwgTm9TdWZ8TW9kcm0sCQkJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsibW92engiLCAgMiwgMHgwZmI3LCBYLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLXsibW92engiLCAgMiwgMHgwZmI2LCBYLCBiX1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgV29yZFJlZywgMH0gfSwKLQotLyogcHVzaCBpbnN0cnVjdGlvbnMgKi8KLXsicHVzaCIsICAgMSwJMHg1MCwgWCwgd2xfU3VmfFNob3J0Rm9ybXxEZWZhdWx0U2l6ZSwJeyBXb3JkUmVnLCAwLCAwIH0gfSwKLXsicHVzaCIsICAgMSwJMHhmZiwgNiwgd2xfU3VmfE1vZHJtfERlZmF1bHRTaXplLAl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMCB9IH0sCi17InB1c2giLCAgIDEsCTB4NmEsIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJCXsgSW1tOFMsIDAsIDB9IH0sCi17InB1c2giLCAgIDEsCTB4NjgsIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJCXsgSW1tMTZ8SW1tMzIsIDAsIDB9IH0sCi17InB1c2giLCAgIDEsCTB4MDYsIFgsIHdsX1N1ZnxTZWcyU2hvcnRGb3JtfERlZmF1bHRTaXplLCB7IFNSZWcyLCAwLCAwIH0gfSwKLXsicHVzaCIsICAgMSwgMHgwZmEwLCBYLCB3bF9TdWZ8U2VnM1Nob3J0Rm9ybXxEZWZhdWx0U2l6ZSwgeyBTUmVnMywgMCwgMCB9IH0sCi0vKiBwdXNoIGFsbCAqLwoteyJwdXNoYSIsICAwLAkweDYwLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCQl7IDAsIDAsIDAgfSB9LAotCi0vKiBwb3AgaW5zdHJ1Y3Rpb25zICovCi17InBvcCIsCSAgIDEsCTB4NTgsIFgsIHdsX1N1ZnxTaG9ydEZvcm18RGVmYXVsdFNpemUsCXsgV29yZFJlZywgMCwgMCB9IH0sCi17InBvcCIsCSAgIDEsCTB4OGYsIDAsIHdsX1N1ZnxNb2RybXxEZWZhdWx0U2l6ZSwJeyBXb3JkUmVnfFdvcmRNZW0sIDAsIDAgfSB9LAotI2RlZmluZSBQT1BfU0VHX1NIT1JUIDB4MDcKLXsicG9wIiwJICAgMSwJMHgwNywgWCwgd2xfU3VmfFNlZzJTaG9ydEZvcm18RGVmYXVsdFNpemUsIHsgU1JlZzIsIDAsIDAgfSB9LAoteyJwb3AiLAkgICAxLCAweDBmYTEsIFgsIHdsX1N1ZnxTZWczU2hvcnRGb3JtfERlZmF1bHRTaXplLCB7IFNSZWczLCAwLCAwIH0gfSwKLS8qIHBvcCBhbGwgKi8KLXsicG9wYSIsICAgMCwJMHg2MSwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAkJeyAwLCAwLCAwIH0gfSwKLQotLyogeGNoZyBleGNoYW5nZSBpbnN0cnVjdGlvbnMKLSAgIHhjaGcgY29tbXV0ZXM6ICB3ZSBhbGxvdyBib3RoIG9wZXJhbmQgb3JkZXJzICovCi17InhjaGciLCAgIDIsCTB4OTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgQWNjLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg5MCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBBY2MsIFdvcmRSZWcsIDAgfSB9LAoteyJ4Y2hnIiwgICAyLAkweDg2LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg4NiwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMCB9IH0sCi0KLS8qIGluL291dCBmcm9tIHBvcnRzICovCi17ImluIiwJICAgMiwJMHhlNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW04LCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDIsCTB4ZWMsIFgsIGJ3bF9TdWZ8VywJCXsgSW5PdXRQb3J0UmVnLCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDEsCTB4ZTQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tOCwgMCwgMCB9IH0sCi17ImluIiwJICAgMSwJMHhlYywgWCwgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAyLAkweGU2LCBYLCBid2xfU3VmfFcsCQl7IEFjYywgSW1tOCwgMCB9IH0sCi17Im91dCIsCSAgIDIsCTB4ZWUsIFgsIGJ3bF9TdWZ8VywJCXsgQWNjLCBJbk91dFBvcnRSZWcsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGU2LCBYLCBid2xfU3VmfFcsCQl7IEltbTgsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGVlLCBYLCBid2xfU3VmfFcsCQl7IEluT3V0UG9ydFJlZywgMCwgMCB9IH0sCi0KLS8qIGxvYWQgZWZmZWN0aXZlIGFkZHJlc3MgKi8KLXsibGVhIiwJICAgMiwgMHg4ZCwgICBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDAgfSB9LAotCi0vKiBsb2FkIHNlZ21lbnQgcmVnaXN0ZXJzIGZyb20gbWVtb3J5ICovCi17ImxkcyIsCSAgIDIsCTB4YzUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGVzIiwJICAgMiwJMHhjNCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZnMiLAkgICAyLCAweDBmYjQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGdzIiwJICAgMiwgMHgwZmI1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxzcyIsCSAgIDIsIDB4MGZiMiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBmbGFncyByZWdpc3RlciBpbnN0cnVjdGlvbnMgKi8KLXsiY2xjIiwJICAgMCwJMHhmOCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJjbGQiLAkgICAwLAkweGZjLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsaSIsCSAgIDAsCTB4ZmEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiY2x0cyIsICAgMCwgMHgwZjA2LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNtYyIsCSAgIDAsCTB4ZjUsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsibGFoZiIsICAgMCwJMHg5ZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJzYWhmIiwgICAwLAkweDllLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InB1c2hmIiwgIDAsCTB4OWMsIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJwb3BmIiwgICAwLAkweDlkLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgMCwgMCwgMH0gfSwKLXsic3RjIiwJICAgMCwJMHhmOSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJzdGQiLAkgICAwLAkweGZkLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InN0aSIsCSAgIDAsCTB4ZmIsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLQotLyogYXJpdGhtZXRpYyAqLwoteyJhZGQiLAkgICAyLAkweDAwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImFkZCIsCSAgIDIsCTB4ODMsIDAsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYWRkIiwJICAgMiwJMHgwNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYWRkIiwJICAgMiwJMHg4MCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJpbmMiLAkgICAxLAkweDQwLCBYLCB3bF9TdWZ8U2hvcnRGb3JtLAl7IFdvcmRSZWcsIDAsIDB9IH0sCi17ImluYyIsCSAgIDEsCTB4ZmUsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InN1YiIsCSAgIDIsCTB4MjgsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsic3ViIiwJICAgMiwJMHg4MywgNSwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJzdWIiLAkgICAyLAkweDJjLCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJzdWIiLAkgICAyLAkweDgwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImRlYyIsCSAgIDEsCTB4NDgsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgMCwgMH0gfSwKLXsiZGVjIiwJICAgMSwJMHhmZSwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2JiIiwJICAgMiwJMHgxOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYmIiLAkgICAyLAkweDgzLCAzLCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InNiYiIsCSAgIDIsCTB4MWMsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InNiYiIsCSAgIDIsCTB4ODAsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsiY21wIiwJICAgMiwJMHgzOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJjbXAiLAkgICAyLAkweDgzLCA3LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImNtcCIsCSAgIDIsCTB4M2MsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17ImNtcCIsCSAgIDIsCTB4ODAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsidGVzdCIsICAgMiwJMHg4NCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMH0gfSwKLXsidGVzdCIsICAgMiwJMHg4NCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsidGVzdCIsICAgMiwJMHhhOCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsidGVzdCIsICAgMiwJMHhmNiwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJhbmQiLAkgICAyLAkweDIwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImFuZCIsCSAgIDIsCTB4ODMsIDQsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYW5kIiwJICAgMiwJMHgyNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYW5kIiwJICAgMiwJMHg4MCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJvciIsCSAgIDIsCTB4MDgsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsib3IiLAkgICAyLAkweDgzLCAxLCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17Im9yIiwJICAgMiwJMHgwYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsib3IiLAkgICAyLAkweDgwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17InhvciIsCSAgIDIsCTB4MzAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsieG9yIiwJICAgMiwJMHg4MywgNiwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJ4b3IiLAkgICAyLAkweDM0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJ4b3IiLAkgICAyLAkweDgwLCA2LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi0vKiBpY2xyIHdpdGggMSBvcGVyYW5kIGlzIHJlYWxseSB4b3Igd2l0aCAyIG9wZXJhbmRzLiAqLwoteyJjbHIiLAkgICAxLAkweDMwLCBYLCBid2xfU3VmfFd8TW9kcm18cmVnS2x1ZGdlLAl7IFJlZywgMCwgMCB9IH0sCi0KLXsiYWRjIiwJICAgMiwJMHgxMCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJhZGMiLAkgICAyLAkweDgzLCAyLCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4MTQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4ODAsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsibmVnIiwJICAgMSwJMHhmNiwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi17Im5vdCIsCSAgIDEsCTB4ZjYsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17ImFhYSIsCSAgIDAsCTB4MzcsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFzIiwJICAgMCwJMHgzZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJkYWEiLAkgICAwLAkweDI3LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImRhcyIsCSAgIDAsCTB4MmYsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFkIiwJICAgMCwgMHhkNTBhLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImFhZCIsCSAgIDEsICAgMHhkNSwgWCwgTm9TdWYsCQkJeyBJbW04UywgMCwgMH0gfSwKLXsiYWFtIiwJICAgMCwgMHhkNDBhLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImFhbSIsCSAgIDEsICAgMHhkNCwgWCwgTm9TdWYsCQkJeyBJbW04UywgMCwgMH0gfSwKLQotLyogY29udmVyc2lvbiBpbnNucyAqLwotLyogY29udmVyc2lvbjoJaW50ZWwgbmFtaW5nICovCi17ImNidyIsCSAgIDAsCTB4OTgsIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY3dkZSIsICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAoteyJjd2QiLAkgICAwLAkweDk5LCBYLCBOb1N1ZnxTaXplMTYsCQl7IDAsIDAsIDB9IH0sCi17ImNkcSIsCSAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUzMiwJCXsgMCwgMCwgMH0gfSwKLS8qICBhdHQgbmFtaW5nICovCi17ImNidHciLCAgIDAsCTB4OTgsIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY3d0bCIsICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAoteyJjd3RkIiwgICAwLAkweDk5LCBYLCBOb1N1ZnxTaXplMTYsCQl7IDAsIDAsIDB9IH0sCi17ImNsdGQiLCAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUzMiwJCXsgMCwgMCwgMH0gfSwKLQotLyogV2FybmluZyEgdGhlIG11bC9pbXVsIChvcGNvZGUgMHhmNikgbXVzdCBvbmx5IGhhdmUgMSBvcGVyYW5kISAgVGhleSBhcmUKLSAgIGV4cGFuZGluZyA2NC1iaXQgbXVsdGlwbGllcywgYW5kICpjYW5ub3QqIGJlIHNlbGVjdGVkIHRvIGFjY29tcGxpc2gKLSAgICdpbXVsICVlYngsICVlYXgnIChvcGNvZGUgMHgwZmFmIG11c3QgYmUgdXNlZCBpbiB0aGlzIGNhc2UpCi0gICBUaGVzZSBtdWx0aXBsaWVzIGNhbiBvbmx5IGJlIHNlbGVjdGVkIHdpdGggc2luZ2xlIG9wZXJhbmQgZm9ybXMuICAqLwoteyJtdWwiLAkgICAxLAkweGY2LCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaW11bCIsICAgMSwJMHhmNiwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi17ImltdWwiLCAgIDIsIDB4MGZhZiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImltdWwiLCAgIDMsCTB4NmIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZ30gfSwKLXsiaW11bCIsICAgMywJMHg2OSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBJbW0xNnxJbW0zMiwgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnfSB9LAotLyogaW11bCB3aXRoIDIgb3BlcmFuZHMgbWltaWNzIGltdWwgd2l0aCAzIGJ5IHB1dHRpbmcgdGhlIHJlZ2lzdGVyIGluCi0gICBib3RoIGkucm0ucmVnICYgaS5ybS5yZWdtZW0gZmllbGRzLiAgcmVnS2x1ZGdlIGVuYWJsZXMgdGhpcwotICAgdHJhbnNmb3JtYXRpb24uICAqLwoteyJpbXVsIiwgICAyLAkweDZiLCBYLCB3bF9TdWZ8TW9kcm18cmVnS2x1ZGdlLHsgSW1tOFMsIFdvcmRSZWcsIDB9IH0sCi17ImltdWwiLCAgIDIsCTB4NjksIFgsIHdsX1N1ZnxNb2RybXxyZWdLbHVkZ2UseyBJbW0xNnxJbW0zMiwgV29yZFJlZywgMH0gfSwKLQoteyJkaXYiLAkgICAxLAkweGY2LCA2LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiZGl2IiwJICAgMiwJMHhmNiwgNiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIEFjYywgMH0gfSwKLXsiaWRpdiIsICAgMSwJMHhmNiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi17ImlkaXYiLCAgIDIsCTB4ZjYsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCBBY2MsIDB9IH0sCi0KLXsicm9sIiwJICAgMiwJMHhkMCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvbCIsCSAgIDIsCTB4YzAsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb2wiLAkgICAyLAkweGQyLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9sIiwJICAgMSwJMHhkMCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsicm9yIiwJICAgMiwJMHhkMCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvciIsCSAgIDIsCTB4YzAsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb3IiLAkgICAyLAkweGQyLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9yIiwJICAgMSwJMHhkMCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsicmNsIiwJICAgMiwJMHhkMCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjbCIsCSAgIDIsCTB4YzAsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY2wiLAkgICAyLAkweGQyLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNsIiwJICAgMSwJMHhkMCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsicmNyIiwJICAgMiwJMHhkMCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjciIsCSAgIDIsCTB4YzAsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY3IiLAkgICAyLAkweGQyLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNyIiwJICAgMSwJMHhkMCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2FsIiwJICAgMiwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhbCIsCSAgIDIsCTB4YzAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYWwiLAkgICAyLAkweGQyLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FsIiwJICAgMSwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi17InNobCIsCSAgIDIsCTB4ZDAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaGwiLAkgICAyLAkweGMwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hsIiwJICAgMiwJMHhkMiwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNobCIsCSAgIDEsCTB4ZDAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InNobGQiLCAgIDMsIDB4MGZhNCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW19IH0sCi17InNobGQiLCAgIDMsIDB4MGZhNSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBTaGlmdENvdW50LCBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW19IH0sCi17InNobGQiLCAgIDIsIDB4MGZhNSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi0KLXsic2hyIiwJICAgMiwJMHhkMCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNociIsCSAgIDIsCTB4YzAsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaHIiLAkgICAyLAkweGQyLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hyIiwJICAgMSwJMHhkMCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2hyZCIsICAgMywgMHgwZmFjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hyZCIsICAgMywgMHgwZmFkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFNoaWZ0Q291bnQsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hyZCIsICAgMiwgMHgwZmFkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLQoteyJzYXIiLAkgICAyLAkweGQwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FyIiwJICAgMiwJMHhjMCwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhciIsCSAgIDIsCTB4ZDIsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYXIiLAkgICAxLAkweGQwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQotLyogY29udHJvbCB0cmFuc2ZlciBpbnN0cnVjdGlvbnMgKi8KLXsiY2FsbCIsICAgMSwJMHhlOCwgWCwgd2xfU3VmfEp1bXBEd29yZHxEZWZhdWx0U2l6ZSwJeyBEaXNwMTZ8RGlzcDMyLCAwLCAwfSB9LAoteyJjYWxsIiwgICAxLAkweGZmLCAyLCB3bF9TdWZ8TW9kcm18RGVmYXVsdFNpemUsCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJjYWxsIiwgICAyLAkweDlhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudHxEZWZhdWx0U2l6ZSwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi17ImxjYWxsIiwgIDIsCTB4OWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50fERlZmF1bHRTaXplLCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGNhbGwiLCAgMSwJMHhmZiwgMywgd2xfU3VmfE1vZHJtfERlZmF1bHRTaXplLAl7IFdvcmRNZW0sIDAsIDB9IH0sCi0KLSNkZWZpbmUgSlVNUF9QQ19SRUxBVElWRSAweGViCi17ImptcCIsCSAgIDEsCTB4ZWIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImptcCIsCSAgIDEsCTB4ZmYsIDQsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJqbXAiLCAgICAyLAkweGVhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi17ImptcCIsICAgIDEsCTB4ZmYsIDUsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsibGptcCIsICAgMiwJMHhlYSwgWCwgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnQsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoteyJsam1wIiwgICAxLAkweGZmLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi0KLXsicmV0IiwJICAgMCwJMHhjMywgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IDAsIDAsIDB9IH0sCi17InJldCIsCSAgIDEsCTB4YzIsIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyBJbW0xNiwgMCwgMH0gfSwKLXsibHJldCIsICAgMCwJMHhjYiwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IDAsIDAsIDB9IH0sCi17ImxyZXQiLCAgIDEsCTB4Y2EsIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyBJbW0xNiwgMCwgMH0gfSwKLXsiZW50ZXIiLCAgMiwJMHhjOCwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IEltbTE2LCBJbW04LCAwfSB9LAoteyJsZWF2ZSIsICAwLAkweGM5LCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgMCwgMCwgMH0gfSwKLQotLyogY29uZGl0aW9uYWwganVtcHMgKi8KLXsiam8iLAkgICAxLAkweDcwLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbm8iLAkgICAxLAkweDcxLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYiIsCSAgIDEsCTB4NzIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpjIiwJICAgMSwJMHg3MiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5hZSIsICAgMSwJMHg3MiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5iIiwJICAgMSwJMHg3MywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5jIiwJICAgMSwJMHg3MywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamFlIiwJICAgMSwJMHg3MywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamUiLAkgICAxLAkweDc0LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqeiIsCSAgIDEsCTB4NzQsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuZSIsCSAgIDEsCTB4NzUsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpueiIsCSAgIDEsCTB4NzUsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpiZSIsCSAgIDEsCTB4NzYsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYSIsCSAgIDEsCTB4NzYsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYmUiLCAgIDEsCTB4NzcsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImphIiwJICAgMSwJMHg3NywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianMiLAkgICAxLAkweDc4LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbnMiLAkgICAxLAkweDc5LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcCIsCSAgIDEsCTB4N2EsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpwZSIsCSAgIDEsCTB4N2EsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpucCIsCSAgIDEsCTB4N2IsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpwbyIsCSAgIDEsCTB4N2IsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpsIiwJICAgMSwJMHg3YywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5nZSIsICAgMSwJMHg3YywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5sIiwJICAgMSwJMHg3ZCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamdlIiwJICAgMSwJMHg3ZCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamxlIiwJICAgMSwJMHg3ZSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5nIiwJICAgMSwJMHg3ZSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5sZSIsICAgMSwJMHg3ZiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamciLAkgICAxLAkweDdmLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAotCi0vKiBqY3h6IHZzLiBqZWN4eiBpcyBjaG9zZW4gb24gdGhlIGJhc2lzIG9mIHRoZSBhZGRyZXNzIHNpemUgcHJlZml4LiAgKi8KLXsiamN4eiIsICAgMSwJMHhlMywgWCwgTm9TdWZ8SnVtcEJ5dGV8U2l6ZTE2LCB7IERpc3AsIDAsIDB9IH0sCi17ImplY3h6IiwgIDEsCTB4ZTMsIFgsIE5vU3VmfEp1bXBCeXRlfFNpemUzMiwgeyBEaXNwLCAwLCAwfSB9LAotCi0vKiBUaGUgbG9vcCBpbnN0cnVjdGlvbnMgYWxzbyB1c2UgdGhlIGFkZHJlc3Mgc2l6ZSBwcmVmaXggdG8gc2VsZWN0Ci0gICAlY3ggcmF0aGVyIHRoYW4gJWVjeCBmb3IgdGhlIGxvb3AgY291bnQsIHNvIHRoZSBgdycgZm9ybSBvZiB0aGVzZQotICAgaW5zdHJ1Y3Rpb25zIGVtaXQgYW4gYWRkcmVzcyBzaXplIHByZWZpeCByYXRoZXIgdGhhbiBhIGRhdGEgc2l6ZQotICAgcHJlZml4LiAgKi8KLXsibG9vcCIsICAgMSwJMHhlMiwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi17Imxvb3B6IiwgIDEsCTB4ZTEsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29wZSIsICAxLAkweGUxLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcG56IiwgMSwJMHhlMCwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi17Imxvb3BuZSIsIDEsCTB4ZTAsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAotCi0vKiBzZXQgYnl0ZSBvbiBmbGFnIGluc3RydWN0aW9ucyAqLwoteyJzZXRvIiwgICAxLCAweDBmOTAsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5vIiwgIDEsIDB4MGY5MSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YiIsICAgMSwgMHgwZjkyLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRjIiwgICAxLCAweDBmOTIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5hZSIsIDEsIDB4MGY5MiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmIiLCAgMSwgMHgwZjkzLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYyIsICAxLCAweDBmOTMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGFlIiwgIDEsIDB4MGY5MywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0ZSIsICAgMSwgMHgwZjk0LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXR6IiwgICAxLCAweDBmOTQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5lIiwgIDEsIDB4MGY5NSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bnoiLCAgMSwgMHgwZjk1LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRiZSIsICAxLCAweDBmOTYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5hIiwgIDEsIDB4MGY5NiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmJlIiwgMSwgMHgwZjk3LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRhIiwgICAxLCAweDBmOTcsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHMiLCAgIDEsIDB4MGY5OCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bnMiLCAgMSwgMHgwZjk5LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRwIiwgICAxLCAweDBmOWEsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHBlIiwgIDEsIDB4MGY5YSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bnAiLCAgMSwgMHgwZjliLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRwbyIsICAxLCAweDBmOWIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGwiLCAgIDEsIDB4MGY5YywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmdlIiwgMSwgMHgwZjljLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRubCIsICAxLCAweDBmOWQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGdlIiwgIDEsIDB4MGY5ZCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bGUiLCAgMSwgMHgwZjllLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuZyIsICAxLCAweDBmOWUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5sZSIsIDEsIDB4MGY5ZiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0ZyIsICAgMSwgMHgwZjlmLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAotCi0vKiBzdHJpbmcgbWFuaXB1bGF0aW9uICovCi17ImNtcHMiLCAgIDAsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsiY21wcyIsICAgMiwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFueU1lbSwgMH0gfSwKLXsic2NtcCIsICAgMCwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzY21wIiwgICAyLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQW55TWVtLCAwfSB9LAoteyJpbnMiLAkgICAwLAkweDZjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17ImlucyIsCSAgIDIsCTB4NmMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgSW5PdXRQb3J0UmVnLCBBbnlNZW18RXNTZWcsIDB9IH0sCi17Im91dHMiLCAgIDAsCTB4NmUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsib3V0cyIsICAgMiwJMHg2ZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEluT3V0UG9ydFJlZywgMH0gfSwKLXsibG9kcyIsICAgMCwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJsb2RzIiwgICAxLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgMCwgMH0gfSwKLXsibG9kcyIsICAgMiwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFjYywgMH0gfSwKLXsic2xvZCIsICAgMCwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzbG9kIiwgICAxLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgMCwgMH0gfSwKLXsic2xvZCIsICAgMiwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFjYywgMH0gfSwKLXsibW92cyIsICAgMCwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJtb3ZzIiwgICAyLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJzbW92IiwgICAwLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNtb3YiLCAgIDIsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBbnlNZW18RXNTZWcsIDB9IH0sCi17InNjYXMiLCAgIDAsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic2NhcyIsICAgMSwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCi17InNjYXMiLCAgIDIsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBY2MsIDB9IH0sCi17InNzY2EiLCAgIDAsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic3NjYSIsICAgMSwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCi17InNzY2EiLCAgIDIsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBY2MsIDB9IH0sCi17InN0b3MiLCAgIDAsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic3RvcyIsICAgMSwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCi17InN0b3MiLCAgIDIsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQWNjLCBBbnlNZW18RXNTZWcsIDB9IH0sCi17InNzdG8iLCAgIDAsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic3N0byIsICAgMSwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCi17InNzdG8iLCAgIDIsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQWNjLCBBbnlNZW18RXNTZWcsIDB9IH0sCi17InhsYXQiLCAgIDAsCTB4ZDcsIFgsIGJfU3VmfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InhsYXQiLCAgIDEsCTB4ZDcsIFgsIGJfU3VmfElzU3RyaW5nLAl7IEFueU1lbSwgMCwgMH0gfSwKLQotLyogYml0IG1hbmlwdWxhdGlvbiAqLwoteyJic2YiLAkgICAyLCAweDBmYmMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJic3IiLAkgICAyLCAweDBmYmQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJidCIsCSAgIDIsIDB4MGZhMywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0IiwJICAgMiwgMHgwZmJhLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnRjIiwJICAgMiwgMHgwZmJiLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnRjIiwJICAgMiwgMHgwZmJhLCA3LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnRyIiwJICAgMiwgMHgwZmIzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnRyIiwJICAgMiwgMHgwZmJhLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnRzIiwJICAgMiwgMHgwZmFiLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnRzIiwJICAgMiwgMHgwZmJhLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLQotLyogaW50ZXJydXB0cyAmIG9wLiBzeXMgaW5zbnMgKi8KLS8qIFNlZSBnYXMvY29uZmlnL3RjLWkzODYuYyBmb3IgY29udmVyc2lvbiBvZiAnaW50ICQzJyBpbnRvIHRoZSBzcGVjaWFsCi0gICBpbnQgMyBpbnNuLiAqLwotI2RlZmluZSBJTlRfT1BDT0RFIDB4Y2QKLSNkZWZpbmUgSU5UM19PUENPREUgMHhjYwoteyJpbnQiLAkgICAxLAkweGNkLCBYLCBOb1N1ZiwJCQl7IEltbTgsIDAsIDB9IH0sCi17ImludDMiLCAgIDAsCTB4Y2MsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiaW50byIsICAgMCwJMHhjZSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJpcmV0IiwgICAwLAkweGNmLCBYLCB3bF9TdWYsCQl7IDAsIDAsIDB9IH0sCi0vKiBpMzg2c2wsIGk0ODZzbCwgbGF0ZXIgNDg2LCBhbmQgUGVudGl1bSAqLwoteyJyc20iLAkgICAwLCAweDBmYWEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLQoteyJib3VuZCIsICAyLAkweDYyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRNZW0sIDB9IH0sCi0KLXsiaGx0IiwJICAgMCwJMHhmNCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotLyogbm9wIGlzIGFjdHVhbGx5ICd4Y2hnbCAlZWF4LCAlZWF4JyAqLwoteyJub3AiLAkgICAwLAkweDkwLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi0KLS8qIHByb3RlY3Rpb24gY29udHJvbCAqLwoteyJhcnBsIiwgICAyLAkweDYzLCBYLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTYsIFJlZzE2fFNob3J0TWVtLCAwfSB9LAoteyJsYXIiLAkgICAyLCAweDBmMDIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZ2R0IiwgICAxLCAweDBmMDEsIDIsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsibGlkdCIsICAgMSwgMHgwZjAxLCAzLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17ImxsZHQiLCAgIDEsIDB4MGYwMCwgMiwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAoteyJsbXN3IiwgICAxLCAweDBmMDEsIDYsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLXsibHNsIiwJICAgMiwgMHgwZjAzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibHRyIiwJICAgMSwgMHgwZjAwLCAzLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi0KLXsic2dkdCIsICAgMSwgMHgwZjAxLCAwLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17InNpZHQiLCAgIDEsIDB4MGYwMSwgMSwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJzbGR0IiwgICAxLCAweDBmMDAsIDAsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwfSB9LAoteyJzbXN3IiwgICAxLCAweDBmMDEsIDQsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwfSB9LAoteyJzdHIiLAkgICAxLCAweDBmMDAsIDEsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLQoteyJ2ZXJyIiwgICAxLCAweDBmMDAsIDQsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLXsidmVydyIsICAgMSwgMHgwZjAwLCA1LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi0KLS8qIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotCi0vKiBsb2FkICovCi17ImZsZCIsCSAgIDEsIDB4ZDljMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogcmVnaXN0ZXIgKi8KLXsiZmxkIiwJICAgMSwJMHhkOSwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGZsb2F0L2RvdWJsZSAqLwoteyJmbGQiLAkgICAxLCAweGQ5YzAsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJmbGQiLCAgICAxLAkweGRiLCA1LCB4X0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGVmbG9hdCAqLwoteyJmaWxkIiwgICAxLAkweGRmLCAwLCBzbF9TdWZ8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gd29yZCgxNikvZHdvcmQoMzIpICovCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZmlsZCIsICAxLAkweGRmLCA1LCBkX1N1ZnxJZ25vcmVTaXplfE1vZHJtLHsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBxd29yZCAoNjQpICovCi17ImZpbGRxIiwgIDEsCTB4ZGYsIDUsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmlsZGxsIiwgMSwJMHhkZiwgNSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gcXdvcmQgKDY0KSAqLwoteyJmbGR0IiwgICAxLAkweGRiLCA1LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBlZmxvYXQgKi8KLXsiZmJsZCIsICAgMSwJMHhkZiwgNCwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gYmNkICovCi0KLS8qIHN0b3JlIChubyBwb3ApICovCi17ImZzdCIsCSAgIDEsIDB4ZGRkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogcmVnaXN0ZXIgKi8KLXsiZnN0IiwJICAgMSwJMHhkOSwgMiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGZsb2F0L2RvdWJsZSAqLwoteyJmc3QiLAkgICAxLCAweGRkZDAsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmlzdCIsICAgMSwJMHhkZiwgMiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHdvcmQoMTYpL2R3b3JkKDMyKSAqLwotCi0vKiBzdG9yZSAod2l0aCBwb3ApICovCi17ImZzdHAiLCAgIDEsIDB4ZGRkOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogcmVnaXN0ZXIgKi8KLXsiZnN0cCIsICAgMSwJMHhkOSwgMywgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGZsb2F0L2RvdWJsZSAqLwoteyJmc3RwIiwgICAxLCAweGRkZDgsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJmc3RwIiwgICAxLAkweGRiLCA3LCB4X0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGVmbG9hdCAqLwoteyJmaXN0cCIsICAxLAkweGRmLCAzLCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSB3b3JkKDE2KS9kd29yZCgzMikgKi8KLS8qIEludGVsIFN5bnRheCAqLwoteyJmaXN0cCIsIDEsCTB4ZGYsIDcsIGRfRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaXN0cHEiLCAxLAkweGRmLCA3LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBxd29yZCAoNjQpICovCi17ImZpc3RwbGwiLDEsCTB4ZGYsIDcsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHF3b3JkICg2NCkgKi8KLXsiZnN0cHQiLCAgMSwJMHhkYiwgNywgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZWZsb2F0ICovCi17ImZic3RwIiwgIDEsCTB4ZGYsIDYsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGJjZCAqLwotCi0vKiBleGNoYW5nZSAlc3Q8bj4gd2l0aCAlc3QwICovCi17ImZ4Y2giLCAgIDEsIDB4ZDljOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnhjaCIsICAgMCwgMHhkOWM5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZ4Y2ggJXN0KDEpICovCi0KLS8qIGNvbXBhcmlzb24gKHdpdGhvdXQgcG9wKSAqLwoteyJmY29tIiwgICAxLCAweGQ4ZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZjb20iLCAgIDAsIDB4ZDhkMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmY29tICVzdCgxKSAqLwoteyJmY29tIiwgICAxLAkweGQ4LCAyLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZmNvbSIsICAgMSwgMHhkOGQwLCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpY29tIiwgIDEsCTB4ZGUsIDIsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gd29yZC9kd29yZCAqLwotCi0vKiBjb21wYXJpc29uICh3aXRoIHBvcCkgKi8KLXsiZmNvbXAiLCAgMSwgMHhkOGQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29tcCIsICAwLCAweGQ4ZDksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmNvbXAgJXN0KDEpICovCi17ImZjb21wIiwgIDEsCTB4ZDgsIDMsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIGZsb2F0L2RvdWJsZSAqLwoteyJmY29tcCIsICAxLCAweGQ4ZDgsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmljb21wIiwgMSwJMHhkZSwgMywgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSB3b3JkL2R3b3JkICovCi17ImZjb21wcCIsIDAsIDB4ZGVkOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGNvbXBhcmUgJXN0MCwgJXN0MSAmIHBvcCAyICovCi0KLS8qIHVub3JkZXJlZCBjb21wYXJpc29uICh3aXRoIHBvcCkgKi8KLXsiZnVjb20iLCAgMSwgMHhkZGUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbSIsICAwLCAweGRkZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnVjb20gJXN0KDEpICovCi17ImZ1Y29tcCIsIDEsIDB4ZGRlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb21wIiwgMCwgMHhkZGU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZ1Y29tcCAlc3QoMSkgKi8KLXsiZnVjb21wcCIsMCwgMHhkYWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogdWNvbXBhcmUgJXN0MCwgJXN0MSAmIHBvcCB0d2ljZSAqLwotCi17ImZ0c3QiLCAgIDAsIDB4ZDllNCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIHRlc3QgJXN0MCAqLwoteyJmeGFtIiwgICAwLCAweGQ5ZTUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBleGFtaW5lICVzdDAgKi8KLQotLyogbG9hZCBjb25zdGFudHMgaW50byAlc3QwICovCi17ImZsZDEiLCAgIDAsIDB4ZDllOCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIDEuMCAqLwoteyJmbGRsMnQiLCAwLCAweGQ5ZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsb2cyKDEwKSAqLwoteyJmbGRsMmUiLCAwLCAweGQ5ZWEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsb2cyKGUpICovCi17ImZsZHBpIiwgIDAsIDB4ZDllYiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIHBpICovCi17ImZsZGxnMiIsIDAsIDB4ZDllYywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxvZzEwKDIpICovCi17ImZsZGxuMiIsIDAsIDB4ZDllZCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxuKDIpICovCi17ImZsZHoiLCAgIDAsIDB4ZDllZSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIDAuMCAqLwotCi0vKiBhcml0aG1ldGljICovCi0KLS8qIGFkZCAqLwoteyJmYWRkIiwgICAyLCAweGQ4YzAsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdEQsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmYWRkIiwgICAxLCAweGQ4YzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIGFsaWFzIGZvciBmYWRkICVzdChpKSwgJXN0ICovCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZhZGQiLCAgIDAsIDB4ZGVjMSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmYWRkcCAqLwotI2VuZGlmCi17ImZhZGQiLCAgIDEsCTB4ZDgsIDAsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpYWRkIiwgIDEsCTB4ZGUsIDAsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLXsiZmFkZHAiLCAgMiwgMHhkZWMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZmFkZHAiLCAgMSwgMHhkZWMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmYWRkcCIsICAwLCAweGRlYzEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmFkZHAgJXN0LCAlc3QoMSkgKi8KLXsiZmFkZHAiLCAgMiwgMHhkZWMwLCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLQotLyogc3VidHJhY3QgKi8KLXsiZnN1YiIsICAgMiwgMHhkOGUwLCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZzdWIiLCAgIDEsIDB4ZDhlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZnN1YiIsICAgMCwgMHhkZWUxLCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZzdWJwICovCi0jZW5kaWYKLXsiZnN1YiIsICAgMSwJMHhkOCwgNCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlzdWIiLCAgMSwJMHhkZSwgNCwgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZzdWJwIiwgIDIsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJwIiwgIDEsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnAiLCAgMCwgMHhkZWUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzdWJwIiwgIDIsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZWxzZQoteyJmc3VicCIsICAyLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicCIsICAxLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZzdWJwIiwgIDAsIDB4ZGVlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLS8qIHN1YnRyYWN0IHJldmVyc2UgKi8KLXsiZnN1YnIiLCAgMiwgMHhkOGU4LCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZzdWJyIiwgIDEsIDB4ZDhlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZnN1YnIiLCAgMCwgMHhkZWU5LCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZzdWJycCAqLwotI2VuZGlmCi17ImZzdWJyIiwgIDEsCTB4ZDgsIDUsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpc3ViciIsIDEsCTB4ZGUsIDUsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmc3VicnAiLCAyLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicnAiLCAxLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZzdWJycCIsIDAsIDB4ZGVlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc3VicnAiLCAyLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2Vsc2UKLXsiZnN1YnJwIiwgMiwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnJwIiwgMSwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicnAiLCAwLCAweGRlZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgotCi0vKiBtdWx0aXBseSAqLwoteyJmbXVsIiwgICAyLCAweGQ4YzgsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdEQsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmbXVsIiwgICAxLCAweGQ4YzgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZtdWwiLCAgIDAsIDB4ZGVjOSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmbXVscCAqLwotI2VuZGlmCi17ImZtdWwiLCAgIDEsCTB4ZDgsIDEsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpbXVsIiwgIDEsCTB4ZGUsIDEsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLXsiZm11bHAiLCAgMiwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZm11bHAiLCAgMSwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmbXVscCIsICAwLCAweGRlYzksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZm11bHAiLCAgMiwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLQotLyogZGl2aWRlICovCi17ImZkaXYiLCAgIDIsIDB4ZDhmMCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmZGl2IiwgICAxLCAweGQ4ZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZkaXYiLCAgIDAsIDB4ZGVmMSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmZGl2cCAqLwotI2VuZGlmCi17ImZkaXYiLCAgIDEsCTB4ZDgsIDYsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpZGl2IiwgIDEsCTB4ZGUsIDYsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZmRpdnAiLCAgMiwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZmRpdnAiLCAgMSwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmZGl2cCIsICAwLCAweGRlZjEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmRpdnAiLCAgMiwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbHNlCi17ImZkaXZwIiwgIDIsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZwIiwgIDEsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnAiLCAgMCwgMHhkZWY5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQotLyogZGl2aWRlIHJldmVyc2UgKi8KLXsiZmRpdnIiLCAgMiwgMHhkOGY4LCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZkaXZyIiwgIDEsIDB4ZDhmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZmRpdnIiLCAgMCwgMHhkZWY5LCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZkaXZycCAqLwotI2VuZGlmCi17ImZkaXZyIiwgIDEsCTB4ZDgsIDcsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpZGl2ciIsIDEsCTB4ZGUsIDcsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmZGl2cnAiLCAyLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cnAiLCAxLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZycCIsIDAsIDB4ZGVmOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmZGl2cnAiLCAyLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2Vsc2UKLXsiZmRpdnJwIiwgMiwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZmRpdnJwIiwgMSwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmZGl2cnAiLCAwLCAweGRlZjEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgotCi17ImYyeG0xIiwgIDAsIDB4ZDlmMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmeWwyeCIsICAwLCAweGQ5ZjEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnB0YW4iLCAgMCwgMHhkOWYyLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwYXRhbiIsIDAsIDB4ZDlmMywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmeHRyYWN0IiwwLCAweGQ5ZjQsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnByZW0xIiwgMCwgMHhkOWY1LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZkZWNzdHAiLDAsIDB4ZDlmNiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmaW5jc3RwIiwwLCAweGQ5ZjcsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnByZW0iLCAgMCwgMHhkOWY4LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZ5bDJ4cDEiLDAsIDB4ZDlmOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc3FydCIsICAwLCAweGQ5ZmEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnNpbmNvcyIsMCwgMHhkOWZiLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZybmRpbnQiLDAsIDB4ZDlmYywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc2NhbGUiLCAwLCAweGQ5ZmQsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnNpbiIsICAgMCwgMHhkOWZlLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjb3MiLCAgIDAsIDB4ZDlmZiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmY2hzIiwgICAwLCAweGQ5ZTAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmFicyIsICAgMCwgMHhkOWUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0KLS8qIHByb2Nlc3NvciBjb250cm9sICovCi17ImZuaW5pdCIsIDAsIDB4ZGJlMywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmaW5pdCIsICAwLCAweGRiZTMsIFgsIEZQfEZXYWl0LAkJeyAwLCAwLCAwfSB9LAoteyJmbGRjdyIsICAxLAkweGQ5LCA1LCBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZuc3RjdyIsIDEsCTB4ZDksIDcsIEZQfE1vZHJtLAkJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZnN0Y3ciLCAgMSwJMHhkOSwgNywgRlB8RldhaXR8TW9kcm0sCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZuc3RzdyIsIDEsIDB4ZGZlMCwgWCwgRlAsCQkJeyBBY2MsIDAsIDB9IH0sCi17ImZuc3RzdyIsIDEsCTB4ZGQsIDcsIEZQfE1vZHJtLAkJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZm5zdHN3IiwgMCwgMHhkZmUwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzdHN3IiwgIDEsIDB4ZGZlMCwgWCwgRlB8RldhaXQsCQl7IEFjYywgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMSwJMHhkZCwgNywgRlB8RldhaXR8TW9kcm0sCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZzdHN3IiwgIDAsIDB4ZGZlMCwgWCwgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCi17ImZuY2xleCIsIDAsIDB4ZGJlMiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmY2xleCIsICAwLCAweGRiZTIsIFgsIEZQfEZXYWl0LAkJeyAwLCAwLCAwfSB9LAotLyogU2hvcnQgZm9ybXMgb2YgZmxkZW52LCBmc3RlbnYgdXNlIGRhdGEgc2l6ZSBwcmVmaXguCi0gICBGSVhNRTogQXJlIHRoZXNlIHRoZSByaWdodCBzdWZmaXhlcz8gICovCi17ImZuc3RlbnYiLDEsCTB4ZDksIDYsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZzdGVudiIsIDEsCTB4ZDksIDYsIHNsX1N1ZnxGV2FpdHxNb2RybSwJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmxkZW52IiwgMSwJMHhkOSwgNCwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZm5zYXZlIiwgMSwJMHhkZCwgNiwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnNhdmUiLCAgMSwJMHhkZCwgNiwgc2xfU3VmfEZXYWl0fE1vZHJtLAl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmcnN0b3IiLCAxLAkweGRkLCA0LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAotCi17ImZmcmVlIiwgIDEsIDB4ZGRjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLS8qIFA2OmZyZWUgc3QoaSksIHBvcCBzdCAqLwoteyJmZnJlZXAiLCAxLCAweGRmYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZub3AiLCAgIDAsIDB4ZDlkMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBGV0FJVF9PUENPREUgMHg5YgoteyJmd2FpdCIsICAwLAkweDliLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0KLS8qCi0gIG9wY29kZSBwcmVmaXhlczsgd2UgYWxsb3cgdGhlbSBhcyBzZXBlcmF0ZSBpbnNucyB0b28KLSovCi0jZGVmaW5lIEFERFJfUFJFRklYX09QQ09ERSAweDY3Ci17ImFkZHIxNiIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImFkZHIzMiIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImF3b3JkIiwgIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImFkd29yZCIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIERBVEFfUFJFRklYX09QQ09ERSAweDY2Ci17ImRhdGExNiIsIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImRhdGEzMiIsIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17IndvcmQiLCAgIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImR3b3JkIiwgIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIExPQ0tfUFJFRklYX09QQ09ERSAweGYwCi17ImxvY2siLCAgIDAsCTB4ZjAsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17IndhaXQiLCAgIDAsICAgMHg5YiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgQ1NfUFJFRklYX09QQ09ERSAweDJlCi17ImNzIiwJICAgMCwJMHgyZSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRFNfUFJFRklYX09QQ09ERSAweDNlCi17ImRzIiwJICAgMCwJMHgzZSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRVNfUFJFRklYX09QQ09ERSAweDI2Ci17ImVzIiwJICAgMCwJMHgyNiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRlNfUFJFRklYX09QQ09ERSAweDY0Ci17ImZzIiwJICAgMCwJMHg2NCwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgR1NfUFJFRklYX09QQ09ERSAweDY1Ci17ImdzIiwJICAgMCwJMHg2NSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgU1NfUFJFRklYX09QQ09ERSAweDM2Ci17InNzIiwJICAgMCwJMHgzNiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgUkVQTkVfUFJFRklYX09QQ09ERSAweGYyCi0jZGVmaW5lIFJFUEVfUFJFRklYX09QQ09ERSAgMHhmMwoteyJyZXAiLAkgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXBlIiwgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXB6IiwgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXBuZSIsICAwLAkweGYyLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXBueiIsICAwLAkweGYyLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotCi0vKiA0ODYgZXh0ZW5zaW9ucyAqLwotCi17ImJzd2FwIiwgICAxLCAweDBmYzgsIFgsIGxfU3VmfFNob3J0Rm9ybSwJeyBSZWczMiwgMCwgMCB9IH0sCi17InhhZGQiLCAgICAyLCAweDBmYzAsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyJjbXB4Y2hnIiwgMiwgMHgwZmIwLCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsiaW52ZCIsICAgIDAsIDB4MGYwOCwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17IndiaW52ZCIsICAwLCAweDBmMDksIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJpbnZscGciLCAgMSwgMHgwZjAxLCA3LCBOb1N1ZnxNb2RybSwJCXsgQW55TWVtLCAwLCAwfSB9LAotCi0vKiA1ODYgYW5kIGxhdGUgNDg2IGV4dGVuc2lvbnMgKi8KLXsiY3B1aWQiLCAgIDAsIDB4MGZhMiwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi0KLS8qIFBlbnRpdW0gZXh0ZW5zaW9ucyAqLwoteyJ3cm1zciIsICAgMCwgMHgwZjMwLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmR0c2MiLCAgIDAsIDB4MGYzMSwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17InJkbXNyIiwgICAwLCAweDBmMzIsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJjbXB4Y2hnOGIiLDEsMHgwZmM3LCAxLCBOb1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17InN5c2VudGVyIiwwLCAweDBmMzQsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJzeXNleGl0IiwgMCwgMHgwZjM1LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsiZnhzYXZlIiwgIDEsIDB4MGZhZSwgMCwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmeHJzdG9yIiwgMSwgMHgwZmFlLCAxLCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi0KLS8qIFBlbnRpdW0gUHJvIGV4dGVuc2lvbnMgKi8KLXsicmRwbWMiLCAgIDAsIDB4MGYzMywgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi0KLXsidWQyIiwJICAgIDAsIDB4MGYwYiwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sIC8qIG9mZmljaWFsIHVuZGVmaW5lZCBpbnN0ci4gKi8KLXsidWQyYSIsICAgIDAsIDB4MGYwYiwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sIC8qIGFsaWFzIGZvciB1ZDIgKi8KLXsidWQyYiIsICAgIDAsIDB4MGZiOSwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sIC8qIDJuZC4gb2ZmaWNpYWwgdW5kZWZpbmVkIGluc3RyLiAqLwotCi17ImNtb3ZvIiwgICAyLCAweDBmNDAsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bm8iLCAgMiwgMHgwZjQxLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmIiLCAgIDIsIDB4MGY0MiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZjIiwgICAyLCAweDBmNDIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmFlIiwgMiwgMHgwZjQyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmFlIiwgIDIsIDB4MGY0MywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYyIsICAyLCAweDBmNDMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmIiLCAgMiwgMHgwZjQzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmUiLCAgIDIsIDB4MGY0NCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3Z6IiwgICAyLCAweDBmNDQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmUiLCAgMiwgMHgwZjQ1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm56IiwgIDIsIDB4MGY0NSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZiZSIsICAyLCAweDBmNDYsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmEiLCAgMiwgMHgwZjQ2LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmEiLCAgIDIsIDB4MGY0NywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYmUiLCAyLCAweDBmNDcsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92cyIsICAgMiwgMHgwZjQ4LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5zIiwgIDIsIDB4MGY0OSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZwIiwgICAyLCAweDBmNGEsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnAiLCAgMiwgMHgwZjRiLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmwiLCAgIDIsIDB4MGY0YywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZ2UiLCAyLCAweDBmNGMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92Z2UiLCAgMiwgMHgwZjRkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5sIiwgIDIsIDB4MGY0ZCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZsZSIsICAyLCAweDBmNGUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmciLCAgMiwgMHgwZjRlLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmciLCAgIDIsIDB4MGY0ZiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubGUiLCAyLCAweDBmNGYsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAotCi17ImZjbW92YiIsICAyLCAweGRhYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5hZSIsMiwgMHhkYWMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZlIiwgIDIsIDB4ZGFjOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92YmUiLCAyLCAweGRhZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5hIiwgMiwgMHhkYWQwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3Z1IiwgIDIsIDB4ZGFkOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92YWUiLCAyLCAweGRiYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5iIiwgMiwgMHhkYmMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZuZSIsIDIsIDB4ZGJjOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92YSIsICAyLCAweGRiZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5iZSIsMiwgMHhkYmQwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZudSIsIDIsIDB4ZGJkOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0KLXsiZmNvbWkiLCAgIDIsIDB4ZGJmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21pIiwgICAwLCAweGRiZjEsIFgsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZmNvbWkiLCAgIDEsIDB4ZGJmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb21pIiwgIDIsIDB4ZGJlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZ1Y29taSIsICAwLCAweGRiZTksIFgsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZnVjb21pIiwgIDEsIDB4ZGJlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmNvbWlwIiwgIDIsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21waSIsICAyLCAweGRmZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY29tcGkiLCAgMCwgMHhkZmYxLCBYLCBGUHxTaG9ydEZvcm0sCQl7IDAsIDAsIDB9IH0sCi17ImZjb21waSIsICAxLCAweGRmZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ1Y29taXAiLCAyLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmdWNvbXBpIiwgMiwgMHhkZmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnVjb21waSIsIDAsIDB4ZGZlOSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmdWNvbXBpIiwgMSwgMHhkZmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotCi0vKiBNTVggaW5zdHJ1Y3Rpb25zLiAgKi8KLQoteyJlbW1zIiwgICAgIDAsIDB4MGY3NywgWCwgRlAsCQkJeyAwLCAwLCAwIH0gfSwKLXsibW92ZCIsICAgICAyLCAweDBmNmUsIFgsIEZQfE1vZHJtLAkJeyBSZWczMnxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJtb3ZkIiwgICAgIDIsIDB4MGY3ZSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWCwgUmVnMzJ8TG9uZ01lbSwgMCB9IH0sCi17Im1vdnEiLCAgICAgMiwgMHgwZjZmLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17Im1vdnEiLCAgICAgMiwgMHgwZjdmLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YLCBSZWdNTVh8TG9uZ01lbSwgMCB9IH0sCi17InBhY2tzc2R3IiwgMiwgMHgwZjZiLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhY2tzc3diIiwgMiwgMHgwZjYzLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhY2t1c3diIiwgMiwgMHgwZjY3LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGRiIiwgICAgMiwgMHgwZmZjLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGR3IiwgICAgMiwgMHgwZmZkLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGRkIiwgICAgMiwgMHgwZmZlLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGRzYiIsICAgMiwgMHgwZmVjLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGRzdyIsICAgMiwgMHgwZmVkLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGR1c2IiLCAgMiwgMHgwZmRjLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGR1c3ciLCAgMiwgMHgwZmRkLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhbmQiLCAgICAgMiwgMHgwZmRiLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhbmRuIiwgICAgMiwgMHgwZmRmLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBjbXBlcWIiLCAgMiwgMHgwZjc0LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBjbXBlcXciLCAgMiwgMHgwZjc1LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBjbXBlcWQiLCAgMiwgMHgwZjc2LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBjbXBndGIiLCAgMiwgMHgwZjY0LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBjbXBndHciLCAgMiwgMHgwZjY1LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBjbXBndGQiLCAgMiwgMHgwZjY2LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtYWRkd2QiLCAgMiwgMHgwZmY1LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtdWxodyIsICAgMiwgMHgwZmU1LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtdWxsdyIsICAgMiwgMHgwZmQ1LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBvciIsCSAgICAgMiwgMHgwZmViLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzbGx3IiwgICAgMiwgMHgwZmYxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzbGx3IiwgICAgMiwgMHgwZjcxLCA2LCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbGQiLCAgICAyLCAweDBmZjIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbGQiLCAgICAyLCAweDBmNzIsIDYsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc2xscSIsICAgIDIsIDB4MGZmMywgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2xscSIsICAgIDIsIDB4MGY3MywgNiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmF3IiwgICAgMiwgMHgwZmUxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzcmF3IiwgICAgMiwgMHgwZjcxLCA0LCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYWQiLCAgICAyLCAweDBmZTIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYWQiLCAgICAyLCAweDBmNzIsIDQsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JsdyIsICAgIDIsIDB4MGZkMSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JsdyIsICAgIDIsIDB4MGY3MSwgMiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmxkIiwgICAgMiwgMHgwZmQyLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzcmxkIiwgICAgMiwgMHgwZjcyLCAyLCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNybHEiLCAgICAyLCAweDBmZDMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybHEiLCAgICAyLCAweDBmNzMsIDIsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3ViYiIsICAgIDIsIDB4MGZmOCwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3VidyIsICAgIDIsIDB4MGZmOSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3ViZCIsICAgIDIsIDB4MGZmYSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3Vic2IiLCAgIDIsIDB4MGZlOCwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3Vic3ciLCAgIDIsIDB4MGZlOSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3VidXNiIiwgIDIsIDB4MGZkOCwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3VidXN3IiwgIDIsIDB4MGZkOSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwdW5wY2toYnciLDIsIDB4MGY2OCwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwdW5wY2tod2QiLDIsIDB4MGY2OSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwdW5wY2toZHEiLDIsIDB4MGY2YSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwdW5wY2tsYnciLDIsIDB4MGY2MCwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwdW5wY2tsd2QiLDIsIDB4MGY2MSwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwdW5wY2tsZHEiLDIsIDB4MGY2MiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJweG9yIiwgICAgIDIsIDB4MGZlZiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAotCi0KLS8qIFBJSUkgS2F0bWFpIE5ldyBJbnN0cnVjdGlvbnMgLyBTSU1EIGluc3RydWN0aW9ucyAqLwotCi17ImFkZHBzIiwgICAgIDIsIDB4MGY1OCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJhZGRzcyIsICAgICAyLCAweGYzMGY1OCwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJhbmRucHMiLCAgICAyLCAweDBmNTUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiYW5kcHMiLCAgICAgMiwgMHgwZjU0LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wZXFwcyIsICAgMiwgMHgwZmMyLCAgICAwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBlcXNzIiwgICAyLCAweGYzMGZjMiwgIDAsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbGVwcyIsICAgMiwgMHgwZmMyLCAgICAyLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsZXNzIiwgICAyLCAweGYzMGZjMiwgIDIsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbHRwcyIsICAgMiwgMHgwZmMyLCAgICAxLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsdHNzIiwgICAyLCAweGYzMGZjMiwgIDEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmVxcHMiLCAgMiwgMHgwZmMyLCAgICA0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBuZXFzcyIsICAyLCAweGYzMGZjMiwgIDQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmxlcHMiLCAgMiwgMHgwZmMyLCAgICA2LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubGVzcyIsICAyLCAweGYzMGZjMiwgIDYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmx0cHMiLCAgMiwgMHgwZmMyLCAgICA1LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubHRzcyIsICAyLCAweGYzMGZjMiwgIDUsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wb3JkcHMiLCAgMiwgMHgwZmMyLCAgICA3LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBvcmRzcyIsICAyLCAweGYzMGZjMiwgIDcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wdW5vcmRwcyIsMiwgMHgwZmMyLCAgICAzLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXB1bm9yZHNzIiwyLCAweGYzMGZjMiwgIDMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wcHMiLCAgICAgMywgMHgwZmMyLCAgICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSB9IH0sCi17ImNtcHNzIiwgICAgIDMsIDB4ZjMwZmMyLCAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSB9IH0sCi17ImNvbWlzcyIsICAgIDIsIDB4MGYyZiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImN2dHBpMnBzIiwgIDIsIDB4MGYyYSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjdnRwczJwaSIsICAyLCAweDBmMmQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsiY3Z0c2kyc3MiLCAgMiwgMHhmMzBmMmEsICBYLCBGUHxNb2RybSwJeyBSZWczMnxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjdnRzczJzaSIsICAyLCAweGYzMGYyZCwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWczMiwgMCB9IH0sCi17ImN2dHRwczJwaSIsIDIsIDB4MGYyYywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJjdnR0c3Myc2kiLCAyLCAweGYzMGYyYywgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWczMiwgMCB9IH0sCi17ImRpdnBzIiwgICAgIDIsIDB4MGY1ZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJkaXZzcyIsICAgICAyLCAweGYzMGY1ZSwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJsZG14Y3NyIiwgICAxLCAweDBmYWUsICAgIDIsIEZQfE1vZHJtLCAJeyBXb3JkTWVtLCAwLCAwIH0gfSwKLXsibWFza21vdnEiLCAgMiwgMHgwZmY3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8SW52TWVtLCBSZWdNTVgsIDAgfSB9LAoteyJtYXhwcyIsICAgICAyLCAweDBmNWYsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibWF4c3MiLCAgICAgMiwgMHhmMzBmNWYsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibWlucHMiLCAgICAgMiwgMHgwZjVkLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1pbnNzIiwgICAgIDIsIDB4ZjMwZjVkLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmFwcyIsICAgIDIsIDB4MGYyOCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZhcHMiLCAgICAyLCAweDBmMjksICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTSwgUmVnWE1NfExMb25nTWVtLCAwIH0gfSwKLXsibW92aGxwcyIsICAgMiwgMHgwZjEyLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18SW52TWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZocHMiLCAgICAyLCAweDBmMTYsICAgIFgsIEZQfE1vZHJtLAl7IExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZocHMiLCAgICAyLCAweDBmMTcsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTSwgTExvbmdNZW0sIDAgfSB9LAoteyJtb3ZsaHBzIiwgICAyLCAweDBmMTYsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxJbnZNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmxwcyIsICAgIDIsIDB4MGYxMiwgICAgWCwgRlB8TW9kcm0sCXsgTExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmxwcyIsICAgIDIsIDB4MGYxMywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBMTG9uZ01lbSwgMCB9IH0sCi17Im1vdm1za3BzIiwgIDIsIDB4MGY1MCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfEludk1lbSwgUmVnMzIsIDAgfSB9LAoteyJtb3ZudHBzIiwgICAyLCAweDBmMmIsICAgIFgsIEZQfE1vZHJtLCAJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bnRxIiwgICAgMiwgMHgwZmU3LCAgICBYLCBGUHxNb2RybSwgCXsgUmVnTU1YLCBMTG9uZ01lbSwgMCB9IH0sCi17Im1vdnNzIiwgICAgIDIsIDB4ZjMwZjEwLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdnNzIiwgICAgIDIsIDB4ZjMwZjExLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBSZWdYTU18V29yZE1lbSwgMCB9IH0sCi17Im1vdnVwcyIsICAgIDIsIDB4MGYxMCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3Z1cHMiLCAgICAyLCAweDBmMTEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTSwgUmVnWE1NfExMb25nTWVtLCAwIH0gfSwKLXsibXVscHMiLCAgICAgMiwgMHgwZjU5LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im11bHNzIiwgICAgIDIsIDB4ZjMwZjU5LCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im9ycHMiLCAgICAgIDIsIDB4MGY1NiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJwYXZnYiIsICAgICAyLCAweDBmZTAsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGF2Z3ciLCAgICAgMiwgMHgwZmUzLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBleHRydyIsICAgIDMsIDB4MGZjNSwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnTU1YLCBSZWczMnxJbnZNZW0gfSB9LAoteyJwaW5zcnciLCAgICAzLCAweDBmYzQsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZzMyfFNob3J0TWVtLCBSZWdNTVggfSB9LAoteyJwbWF4c3ciLCAgICAyLCAweDBmZWUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1heHViIiwgICAgMiwgMHgwZmRlLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtaW5zdyIsICAgIDIsIDB4MGZlYSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWludWIiLCAgICAyLCAweDBmZGEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1vdm1za2IiLCAgMiwgMHgwZmQ3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVgsIFJlZzMyfEludk1lbSwgMCB9IH0sCi17InBtdWxodXciLCAgIDIsIDB4MGZlNCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwcmVmZXRjaG50YSIsIDEsIDB4MGYxOCwgIDAsIEZQfE1vZHJtLCAJeyBMTG9uZ01lbSwgMCwgMCB9IH0sCi17InByZWZldGNodDAiLCAgMSwgMHgwZjE4LCAgMSwgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h0MSIsICAxLCAweDBmMTgsICAyLCBGUHxNb2RybSwgCXsgTExvbmdNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHQyIiwgIDEsIDB4MGYxOCwgIDMsIEZQfE1vZHJtLCAJeyBMTG9uZ01lbSwgMCwgMCB9IH0sCi17InBzYWRidyIsICAgIDIsIDB4MGZmNiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2h1ZnciLCAgICAzLCAweDBmNzAsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YIH0gfSwKLXsicmNwcHMiLCAgICAgMiwgMHgwZjUzLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InJjcHNzIiwgICAgIDIsIDB4ZjMwZjUzLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InJzcXJ0cHMiLCAgIDIsIDB4MGY1MiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJyc3FydHNzIiwgICAyLCAweGYzMGY1MiwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJzZmVuY2UiLCAgICAwLCAweDBmYWVmOCwgIFgsIEZQLAkJeyAwLCAwLCAwIH0gfSwKLXsic2h1ZnBzIiwgICAgMywgMHgwZmM2LCAgICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSB9IH0sCi17InNxcnRwcyIsICAgIDIsIDB4MGY1MSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJzcXJ0c3MiLCAgICAyLCAweGYzMGY1MSwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJzdG14Y3NyIiwgICAxLCAweDBmYWUsICAgIDMsIEZQfE1vZHJtLCAJeyBXb3JkTWVtLCAwLCAwIH0gfSwKLXsic3VicHMiLCAgICAgMiwgMHgwZjVjLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InN1YnNzIiwgICAgIDIsIDB4ZjMwZjVjLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVjb21pc3MiLCAgIDIsIDB4MGYyZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVucGNraHBzIiwgIDIsIDB4MGYxNSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJ1bnBja2xwcyIsICAyLCAweDBmMTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsieG9ycHMiLCAgICAgMiwgMHgwZjU3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi0KLS8qIEFNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zICovCi0KLXsicHJlZmV0Y2giLCAxLCAweDBmMGQsCSAgIDAsIEZQfE1vZHJtLAkJeyBCeXRlTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h3IiwxLCAweDBmMGQsCSAgIDEsIEZQfE1vZHJtLAkJeyBCeXRlTWVtLCAwLCAwIH0gfSwKLXsiZmVtbXMiLCAgICAwLCAweDBmMGUsCSAgIFgsIEZQLAkJeyAwLCAwLCAwIH0gfSwKLXsicGF2Z3VzYiIsICAyLCAweDBmMGYsIDB4YmYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGYyaWQiLCAgICAyLCAweDBmMGYsIDB4MWQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGYyaXciLCAgICAyLCAweDBmMGYsIDB4MWMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwgLyogQXRobG9uICovCi17InBmYWNjIiwgICAgMiwgMHgwZjBmLCAweGFlLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmYWRkIiwgICAgMiwgMHgwZjBmLCAweDllLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmY21wZXEiLCAgMiwgMHgwZjBmLCAweGIwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmY21wZ2UiLCAgMiwgMHgwZjBmLCAweDkwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmY21wZ3QiLCAgMiwgMHgwZjBmLCAweGEwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbWF4IiwgICAgMiwgMHgwZjBmLCAweGE0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbWluIiwgICAgMiwgMHgwZjBmLCAweDk0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbXVsIiwgICAgMiwgMHgwZjBmLCAweGI0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbmFjYyIsICAgMiwgMHgwZjBmLCAweDhhLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sIC8qIEF0aGxvbiAqLwoteyJwZnBuYWNjIiwgIDIsIDB4MGYwZiwgMHg4ZSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LCAvKiBBdGhsb24gKi8KLXsicGZyY3AiLCAgICAyLCAweDBmMGYsIDB4OTYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyY3BpdDEiLCAyLCAweDBmMGYsIDB4YTYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyY3BpdDIiLCAyLCAweDBmMGYsIDB4YjYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyc3FpdDEiLCAyLCAweDBmMGYsIDB4YTcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyc3FydCIsICAyLCAweDBmMGYsIDB4OTcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZzdWIiLCAgICAyLCAweDBmMGYsIDB4OWEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZzdWJyIiwgICAyLCAweDBmMGYsIDB4YWEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGkyZmQiLCAgICAyLCAweDBmMGYsIDB4MGQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGkyZnciLCAgICAyLCAweDBmMGYsIDB4MGMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwgLyogQXRobG9uICovCi17InBtdWxocnciLCAgMiwgMHgwZjBmLCAweGI3LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzd2FwZCIsICAgMiwgMHgwZjBmLCAweGJiLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sIC8qIEF0aGxvbiAqLwotCi17TlVMTCwgMCwgMCwgMCwgMCwgeyAwLCAwLCAwfSB9CS8qIHNlbnRpbmVsICovCi19OwotI3VuZGVmIFgKLSN1bmRlZiBOb1N1ZgotI3VuZGVmIGJfU3VmCi0jdW5kZWYgd19TdWYKLSN1bmRlZiBsX1N1ZgotI3VuZGVmIGRfU3VmCi0jdW5kZWYgeF9TdWYKLSN1bmRlZiBid19TdWYKLSN1bmRlZiBibF9TdWYKLSN1bmRlZiB3bF9TdWYKLSN1bmRlZiBzbF9TdWYKLSN1bmRlZiBzbGRfU3VmCi0jdW5kZWYgc2xkeF9TdWYKLSN1bmRlZiBid2xfU3VmCi0jdW5kZWYgYndsZF9TdWYKLSN1bmRlZiBGUAotI3VuZGVmIGxfRlAKLSN1bmRlZiBkX0ZQCi0jdW5kZWYgeF9GUAotI3VuZGVmIHNsX0ZQCi0jdW5kZWYgc2xkX0ZQCi0jdW5kZWYgc2xkeF9GUAotCi0jZGVmaW5lIE1BWF9NTkVNX1NJWkUgMTYJLyogZm9yIHBhcnNpbmcgaW5zbiBtbmVtb25pY3MgZnJvbSBpbnB1dCAqLwotCi0KLS8qIDM4NiByZWdpc3RlciB0YWJsZSAqLwotCi1zdGF0aWMgY29uc3QgcmVnX2VudHJ5IGkzODZfcmVndGFiW10gPSB7Ci0gIC8qIG1ha2UgJXN0IGZpcnN0IGFzIHdlIHRlc3QgZm9yIGl0ICovCi0gIHsic3QiLCBGbG9hdFJlZ3xGbG9hdEFjYywgMH0sCi0gIC8qIDggYml0IHJlZ3MgKi8KLSAgeyJhbCIsIFJlZzh8QWNjLCAwfSwKLSAgeyJjbCIsIFJlZzh8U2hpZnRDb3VudCwgMX0sCi0gIHsiZGwiLCBSZWc4LCAyfSwKLSAgeyJibCIsIFJlZzgsIDN9LAotICB7ImFoIiwgUmVnOCwgNH0sCi0gIHsiY2giLCBSZWc4LCA1fSwKLSAgeyJkaCIsIFJlZzgsIDZ9LAotICB7ImJoIiwgUmVnOCwgN30sCi0gIC8qIDE2IGJpdCByZWdzICovCi0gIHsiYXgiLCBSZWcxNnxBY2MsIDB9LAotICB7ImN4IiwgUmVnMTYsIDF9LAotICB7ImR4IiwgUmVnMTZ8SW5PdXRQb3J0UmVnLCAyfSwKLSAgeyJieCIsIFJlZzE2fEJhc2VJbmRleCwgM30sCi0gIHsic3AiLCBSZWcxNiwgNH0sCi0gIHsiYnAiLCBSZWcxNnxCYXNlSW5kZXgsIDV9LAotICB7InNpIiwgUmVnMTZ8QmFzZUluZGV4LCA2fSwKLSAgeyJkaSIsIFJlZzE2fEJhc2VJbmRleCwgN30sCi0gIC8qIDMyIGJpdCByZWdzICovCi0gIHsiZWF4IiwgUmVnMzJ8QmFzZUluZGV4fEFjYywgMH0sCi0gIHsiZWN4IiwgUmVnMzJ8QmFzZUluZGV4LCAxfSwKLSAgeyJlZHgiLCBSZWczMnxCYXNlSW5kZXgsIDJ9LAotICB7ImVieCIsIFJlZzMyfEJhc2VJbmRleCwgM30sCi0gIHsiZXNwIiwgUmVnMzIsIDR9LAotICB7ImVicCIsIFJlZzMyfEJhc2VJbmRleCwgNX0sCi0gIHsiZXNpIiwgUmVnMzJ8QmFzZUluZGV4LCA2fSwKLSAgeyJlZGkiLCBSZWczMnxCYXNlSW5kZXgsIDd9LAotICAvKiBzZWdtZW50IHJlZ2lzdGVycyAqLwotICB7ImVzIiwgU1JlZzIsIDB9LAotICB7ImNzIiwgU1JlZzIsIDF9LAotICB7InNzIiwgU1JlZzIsIDJ9LAotICB7ImRzIiwgU1JlZzIsIDN9LAotICB7ImZzIiwgU1JlZzMsIDR9LAotICB7ImdzIiwgU1JlZzMsIDV9LAotICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICB7ImNyMCIsIENvbnRyb2wsIDB9LAotICB7ImNyMSIsIENvbnRyb2wsIDF9LAotICB7ImNyMiIsIENvbnRyb2wsIDJ9LAotICB7ImNyMyIsIENvbnRyb2wsIDN9LAotICB7ImNyNCIsIENvbnRyb2wsIDR9LAotICB7ImNyNSIsIENvbnRyb2wsIDV9LAotICB7ImNyNiIsIENvbnRyb2wsIDZ9LAotICB7ImNyNyIsIENvbnRyb2wsIDd9LAotICAvKiBkZWJ1ZyByZWdpc3RlcnMgKi8KLSAgeyJkYjAiLCBEZWJ1ZywgMH0sCi0gIHsiZGIxIiwgRGVidWcsIDF9LAotICB7ImRiMiIsIERlYnVnLCAyfSwKLSAgeyJkYjMiLCBEZWJ1ZywgM30sCi0gIHsiZGI0IiwgRGVidWcsIDR9LAotICB7ImRiNSIsIERlYnVnLCA1fSwKLSAgeyJkYjYiLCBEZWJ1ZywgNn0sCi0gIHsiZGI3IiwgRGVidWcsIDd9LAotICB7ImRyMCIsIERlYnVnLCAwfSwKLSAgeyJkcjEiLCBEZWJ1ZywgMX0sCi0gIHsiZHIyIiwgRGVidWcsIDJ9LAotICB7ImRyMyIsIERlYnVnLCAzfSwKLSAgeyJkcjQiLCBEZWJ1ZywgNH0sCi0gIHsiZHI1IiwgRGVidWcsIDV9LAotICB7ImRyNiIsIERlYnVnLCA2fSwKLSAgeyJkcjciLCBEZWJ1ZywgN30sCi0gIC8qIHRlc3QgcmVnaXN0ZXJzICovCi0gIHsidHIwIiwgVGVzdCwgMH0sCi0gIHsidHIxIiwgVGVzdCwgMX0sCi0gIHsidHIyIiwgVGVzdCwgMn0sCi0gIHsidHIzIiwgVGVzdCwgM30sCi0gIHsidHI0IiwgVGVzdCwgNH0sCi0gIHsidHI1IiwgVGVzdCwgNX0sCi0gIHsidHI2IiwgVGVzdCwgNn0sCi0gIHsidHI3IiwgVGVzdCwgN30sCi0gIC8qIG1teCBhbmQgc2ltZCByZWdpc3RlcnMgKi8KLSAgeyJtbTAiLCBSZWdNTVgsIDB9LAotICB7Im1tMSIsIFJlZ01NWCwgMX0sCi0gIHsibW0yIiwgUmVnTU1YLCAyfSwKLSAgeyJtbTMiLCBSZWdNTVgsIDN9LAotICB7Im1tNCIsIFJlZ01NWCwgNH0sCi0gIHsibW01IiwgUmVnTU1YLCA1fSwKLSAgeyJtbTYiLCBSZWdNTVgsIDZ9LAotICB7Im1tNyIsIFJlZ01NWCwgN30sCi0gIHsieG1tMCIsIFJlZ1hNTSwgMH0sCi0gIHsieG1tMSIsIFJlZ1hNTSwgMX0sCi0gIHsieG1tMiIsIFJlZ1hNTSwgMn0sCi0gIHsieG1tMyIsIFJlZ1hNTSwgM30sCi0gIHsieG1tNCIsIFJlZ1hNTSwgNH0sCi0gIHsieG1tNSIsIFJlZ1hNTSwgNX0sCi0gIHsieG1tNiIsIFJlZ1hNTSwgNn0sCi0gIHsieG1tNyIsIFJlZ1hNTSwgN30KLX07Ci0KLXN0YXRpYyBjb25zdCByZWdfZW50cnkgaTM4Nl9mbG9hdF9yZWd0YWJbXSA9IHsKLSAgeyJzdCgwKSIsIEZsb2F0UmVnfEZsb2F0QWNjLCAwfSwKLSAgeyJzdCgxKSIsIEZsb2F0UmVnLCAxfSwKLSAgeyJzdCgyKSIsIEZsb2F0UmVnLCAyfSwKLSAgeyJzdCgzKSIsIEZsb2F0UmVnLCAzfSwKLSAgeyJzdCg0KSIsIEZsb2F0UmVnLCA0fSwKLSAgeyJzdCg1KSIsIEZsb2F0UmVnLCA1fSwKLSAgeyJzdCg2KSIsIEZsb2F0UmVnLCA2fSwKLSAgeyJzdCg3KSIsIEZsb2F0UmVnLCA3fQotfTsKLQotI2RlZmluZSBNQVhfUkVHX05BTUVfU0laRSA4CS8qIGZvciBwYXJzaW5nIHJlZ2lzdGVyIG5hbWVzIGZyb20gaW5wdXQgKi8KLQotLyogc2VnbWVudCBzdHVmZiAqLwotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBjcyA9IHsgImNzIiwgMHgyZSB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBkcyA9IHsgImRzIiwgMHgzZSB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBzcyA9IHsgInNzIiwgMHgzNiB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBlcyA9IHsgImVzIiwgMHgyNiB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBmcyA9IHsgImZzIiwgMHg2NCB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBncyA9IHsgImdzIiwgMHg2NSB9OwotCi0vKiBlbmQgb2Ygb3Bjb2RlL2kzODYuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTg2MC5oIGIvaW5jbHVkZS9vcGNvZGUvaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmViZDI1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2k4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgaTg2MC4KLSAgIENvcHlyaWdodCAoQykgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgYW5kIEdEQiwgdGhlIEdOVSBkaXNhc3NlbWJsZXIuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKgotICogU3RydWN0dXJlIG9mIGFuIG9wY29kZSB0YWJsZSBlbnRyeS4KLSAqLwotc3RydWN0IGk4NjBfb3Bjb2RlCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB1bnNpZ25lZCBsb25nIG1hdGNoOwkvKiBCaXRzIHRoYXQgbXVzdCBiZSBzZXQuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgbG9zZTsJLyogQml0cyB0aGF0IG11c3Qgbm90IGJlIHNldC4gICovCi0gICAgY29uc3QgY2hhciAqYXJnczsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBwb3NzaWJsZSBleHBhbmQtaW5zdHJ1Y3Rpb24uICAqLwotICAgIGNoYXIgZXhwYW5kOwotfTsKLQotZW51bSBleHBhbmRfdHlwZQotewotICAgIEVfTU9WID0gMSwgRV9BRERSLCBFX1UzMiwgRV9BTkQsIEVfUzMyLCBFX0RFTEFZCi19OwotCi0vKgotICAgQWxsIGk4NjAgb3Bjb2RlcyBhcmUgMzIgYml0cywgZXhjZXB0IGZvciB0aGUgcHNldWRvaW5zdHJ1Y3Rpb25zCi0gICBhbmQgdGhlIG9wZXJhdGlvbnMgdXRpbGl6aW5nIGEgMzItYml0IGFkZHJlc3MgZXhwcmVzc2lvbiwgYW4KLSAgIHVuc2lnbmVkIDMyLWJpdCBjb25zdGFudCwgb3IgYSBzaWduZWQgMzItYml0IGNvbnN0YW50LgotICAgVGhlc2Ugb3Bjb2RlcyBhcmUgZXhwYW5kZWQgaW50byBhIHR3by1pbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IKLSAgIGFueSBzaXR1YXRpb24gd2hlcmUgdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGRvZXMgbm90IGZpdCBpbiAzMiBiaXRzLgotICAgSW4gdGhlIGNhc2Ugb2YgdGhlIGFkZCBhbmQgc3VidHJhY3Qgb3BlcmF0aW9ucyB0aGUgZXhwYW5zaW9uIGlzCi0gICB0byBhIHRocmVlLWluc3RydWN0aW9uIHNlcXVlbmNlIChleDogb3JoLCBvciwgYWRkcykuICBJbiBjYXNlcwotICAgd2hlcmUgdGhlIGFkZHJlc3MgaXMgdG8gYmUgcmVsb2NhdGVkLCB0aGUgaW5zdHJ1Y3Rpb24gaXMKLSAgIGV4cGFuZGVkIHRvIGhhbmRsZSB0aGUgd29yc2UgY2FzZSwgdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYXQKLSAgIHRoZSBmaW5hbCBsaW5rIGlmIHRoZSBhY3R1YWwgYWRkcmVzcyB3ZXJlIGtub3duLgotCi0gICBUaGUgcHNldWRvaW5zdHJ1Y3Rpb25zIGFyZTogIG1vdiwgZm1vdiwgcG1vdiwgbm9wLCBhbmQgZm5vcC4KLSAgIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgYSBvbmUgb3IgdHdvIGluc3RydWN0aW9uCi0gICBzZXF1ZW5jZSBvZiBvdGhlciBvcGVyYXRpb25zLgotCi0gICBUaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIG9uZSBjaGFyYWN0ZXIKLSAgIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLgotCi1LaW5kcyBvZiBvcGVyYW5kczoKLSAgICMgICAgTnVtYmVyIHVzZWQgYnkgb3B0aW1pemVyLiAgSXQgaXMgaWdub3JlZC4KLSAgIDEgICAgc3JjMSBpbnRlZ2VyIHJlZ2lzdGVyLgotICAgMiAgICBzcmMyIGludGVnZXIgcmVnaXN0ZXIuCi0gICBkICAgIGRlc3QgcmVnaXN0ZXIuCi0gICBjCWN0cmxyZWcgY29udHJvbCByZWdpc3Rlci4KLSAgIGkgICAgMTYgYml0IGltbWVkaWF0ZS4KLSAgIEkgICAgMTYgYml0IGltbWVkaWF0ZSwgYWxpZ25lZC4KLSAgIDUgICAgNSBiaXQgaW1tZWRpYXRlLgotICAgbCAgICBsYnJvZmYgMjYgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KLSAgIHIgICAgc2Jyb2ZmIDE2IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0gICBzCXNwbGl0IDE2IGJpdCBpbW1lZGlhdGUuCi0gICBTCXNwbGl0IDE2IGJpdCBpbW1lZGlhdGUsIGFsaWduZWQuCi0gICBlICAgIHNyYzEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0gICBmICAgIHNyYzIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0gICBnICAgIGRlc3QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0KLSovCi0KLS8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGlzIHRhYmxlIGlzIHNpZ25pZmljYW50OgotICAgCi0gICAqIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUKLSAgIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0IHJ1bnRpbWUuCi0KLSAgICogVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgbm90IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpODYwX29wY29kZSBpODYwX29wY29kZXNbXSA9Ci17Ci0KLS8qIFJFRy1Gb3JtYXQgSW5zdHJ1Y3Rpb25zICovCi17ICJsZC5jIiwJMHgzMDAwMDAwMCwgMHhjYzAwMDAwMCwgImMsZCIsIDAgfSwJLyogbGQuYyBjc3JjMixpZGVzdCAqLwoteyAibGQuYiIsCTB4MDAwMDAwMDAsIDB4ZmMwMDAwMDAsICIxKDIpLGQiLCAwIH0sCS8qIGxkLmIgaXNyYzEoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5iIiwJMHgwNDAwMDAwMCwgMHhmODAwMDAwMCwgIkkoMiksZCIsIEVfQUREUiB9LAkvKiBsZC5iICNjb25zdChpc3JjMiksaWRlc3QgKi8KLXsgImxkLnMiLAkweDEwMDAwMDAwLCAweGVjMDAwMDAxLCAiMSgyKSxkIiwgMCB9LAkvKiBsZC5zIGlzcmMxKGlzcmMyKSxpZGVzdCAqLwoteyAibGQucyIsCTB4MTQwMDAwMDEsIDB4ZTgwMDAwMDAsICJJKDIpLGQiLCBFX0FERFIgfSwJLyogbGQucyAjY29uc3QoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5sIiwJMHgxMDAwMDAwMSwgMHhlYzAwMDAwMCwgIjEoMiksZCIsIDAgfSwJLyogbGQubCBpc3JjMShpc3JjMiksaWRlc3QgKi8KLXsgImxkLmwiLAkweDE0MDAwMDAxLCAweGU4MDAwMDAwLCAiSSgyKSxkIiwgRV9BRERSIH0sCS8qIGxkLmwgI2NvbnN0KGlzcmMyKSxpZGVzdCAqLwotCi17ICJzdC5jIiwJMHgzODAwMDAwMCwgMHhjNDAwMDAwMCwgIjEsYyIsIDAgfSwJLyogc3QuYyBpc3JjMW5pLGNzcmMyICovCi17ICJzdC5iIiwJMHgwYzAwMDAwMCwgMHhmMDAwMDAwMCwgIjEsUygyKSIsIEVfQUREUiB9LAkvKiBzdC5iIGlzcmMxbmksI2NvbnN0KGlzcmMyKSAqLwoteyAic3QucyIsCTB4MWMwMDAwMDAsIDB4ZTAwMDAwMDAsICIxLFMoMikiLCBFX0FERFIgfSwJLyogc3QucyBpc3JjMW5pLCNjb25zdChpc3JjMikgKi8KLXsgInN0LmwiLAkweDFjMDAwMDAxLCAweGUwMDAwMDAwLCAiMSxTKDIpIiwgRV9BRERSIH0sCS8qIHN0LmwgaXNyYzFuaSwjY29uc3QoaXNyYzIpICovCi0KLXsgIml4ZnIiLAkweDA4MDAwMDAwLCAweGY0MDAwMDAwLCAiMSxnIiwgMCB9LAkvKiBpeGZyIGlzcmMxbmksZmRlc3QgKi8KLQoteyAiZmxkLmwiLAkweDIwMDAwMDAyLCAweGRjMDAwMDAxLCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQubCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyNDAwMDAwMiwgMHhkODAwMDAwMSwgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQubCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQubCIsCTB4MjAwMDAwMDMsIDB4ZGMwMDAwMDAsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLmwgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyNDAwMDAwMywgMHhkODAwMDAwMCwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5sICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDIwMDAwMDAwLCAweGRjMDAwMDA3LCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQuZCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyNDAwMDAwMCwgMHhkODAwMDAwNywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQuZCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQuZCIsCTB4MjAwMDAwMDEsIDB4ZGMwMDAwMDYsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLmQgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyNDAwMDAwMSwgMHhkODAwMDAwNiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5kICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDIwMDAwMDA0LCAweGRjMDAwMDAzLCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQucSBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyNDAwMDAwNCwgMHhkODAwMDAwMywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQucSAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQucSIsCTB4MjAwMDAwMDUsIDB4ZGMwMDAwMDIsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLnEgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyNDAwMDAwNSwgMHhkODAwMDAwMiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5xICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwotCi17ICJwZmxkLmwiLAkweDYwMDAwMDAwLCAweDljMDAwMDAzLCAiMSgyKSxnIiwgMCB9LAkvKiBwZmxkLmwgaXNyYzEoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDY0MDAwMDAwLCAweDk4MDAwMDAzLCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIHBmbGQubCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDYwMDAwMDAxLCAweDljMDAwMDAyLCAiMSgyKSsrLGciLCAwIH0sCS8qIHBmbGQubCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAicGZsZC5sIiwJMHg2NDAwMDAwMSwgMHg5ODAwMDAwMiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIHBmbGQubCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjAwMDAwMDAsIDB4OWMwMDAwMDcsICIxKDIpLGciLCAwIH0sCS8qIHBmbGQuZCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjQwMDAwMDAsIDB4OTgwMDAwMDcsICJpKDIpLGciLCBFX0FERFIgfSwJLyogcGZsZC5kICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjAwMDAwMDEsIDB4OWMwMDAwMDYsICIxKDIpKyssZyIsIDAgfSwJLyogcGZsZC5kIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJwZmxkLmQiLAkweDY0MDAwMDAxLCAweDk4MDAwMDA2LCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogcGZsZC5kICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwotCi17ICJmc3QubCIsCTB4MjgwMDAwMDIsIDB4ZDQwMDAwMDEsICJnLDEoMikiLCAwIH0sCS8qIGZzdC5sIGZkZXN0LGlzcmMxKGlzcmMyKSAqLwoteyAiZnN0LmwiLAkweDJjMDAwMDAyLCAweGQwMDAwMDAxLCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIGZzdC5sIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgImZzdC5sIiwJMHgyODAwMDAwMywgMHhkNDAwMDAwMCwgImcsMSgyKSsrIiwgMCB9LAkvKiBmc3QubCBmZGVzdCxpc3JjMShpc3JjMikrKyAqLwoteyAiZnN0LmwiLAkweDJjMDAwMDAzLCAweGQwMDAwMDAwLCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogZnN0LmwgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi17ICJmc3QuZCIsCTB4MjgwMDAwMDAsIDB4ZDQwMDAwMDcsICJnLDEoMikiLCAwIH0sCS8qIGZzdC5kIGZkZXN0LGlzcmMxKGlzcmMyKSAqLwoteyAiZnN0LmQiLAkweDJjMDAwMDAwLCAweGQwMDAwMDA3LCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIGZzdC5kIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgImZzdC5kIiwJMHgyODAwMDAwMSwgMHhkNDAwMDAwNiwgImcsMSgyKSsrIiwgMCB9LAkvKiBmc3QuZCBmZGVzdCxpc3JjMShpc3JjMikrKyAqLwoteyAiZnN0LmQiLAkweDJjMDAwMDAxLCAweGQwMDAwMDA2LCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogZnN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi0KLXsgInBzdC5kIiwJMHgzYzAwMDAwMCwgMHhjMDAwMDAwNywgImcsaSgyKSIsIEVfQUREUiB9LAkvKiBwc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpICovCi17ICJwc3QuZCIsCTB4M2MwMDAwMDEsIDB4YzAwMDAwMDYsICJnLGkoMikrKyIsIEVfQUREUiB9LAkvKiBwc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpKysgKi8KLQoteyAiYWRkdSIsCTB4ODAwMDAwMDAsIDB4N2MwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYWRkdSBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYWRkdSIsCTB4ODQwMDAwMDAsIDB4NzgwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIGFkZHUgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhZGRzIiwJMHg5MDAwMDAwMCwgMHg2YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhZGRzIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhZGRzIiwJMHg5NDAwMDAwMCwgMHg2ODAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogYWRkcyAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnUiLAkweDg4MDAwMDAwLCAweDc0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHN1YnUgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnUiLAkweDhjMDAwMDAwLCAweDcwMDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBzdWJ1ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic3VicyIsCTB4OTgwMDAwMDAsIDB4NjQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc3VicyBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic3VicyIsCTB4OWMwMDAwMDAsIDB4NjAwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIHN1YnMgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgInNobCIsCTB4YTAwMDAwMDAsIDB4NWMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hsIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaGwiLAkweGE0MDAwMDAwLCAweDU4MDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNobCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInNociIsCTB4YTgwMDAwMDAsIDB4NTQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hyIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaHIiLAkweGFjMDAwMDAwLCAweDUwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNociAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInNocmQiLAkweGIwMDAwMDAwLCAweDRjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNocmQgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNocmEiLAkweGI4MDAwMDAwLCAweDQ0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNocmEgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNocmEiLAkweGJjMDAwMDAwLCAweDQwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNocmEgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgIm1vdiIsCTB4YTAwMDAwMDAsIDB4NWMwMGY4MDAsICIyLGQiLCAwIH0sCS8qIHNobCByMCxpc3JjMixpZGVzdCAqLwoteyAibW92IiwJMHg5NDAwMDAwMCwgMHg2OWUwMDAwMCwgImksZCIsIEVfTU9WIH0sCS8qIGFkZHMgI2NvbnN0LHIwLGlkZXN0ICovCi17ICJub3AiLAkweGEwMDAwMDAwLCAweDVmZmZmODAwLCAiIiwgMCB9LAkvKiBzaGwgcjAscjAscjAgKi8KLXsgImZub3AiLAkweGIwMDAwMDAwLCAweDRmZmZmODAwLCAiIiwgMCB9LAkvKiBzaHJkIHIwLHIwLHIwICovCi0KLXsgInRyYXAiLAkweDQ0MDAwMDAwLCAweGI4MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHRyYXAgaXNyYzFuaSxpc3JjMixpZGVzdCAqLwotCi17ICJmbHVzaCIsCTB4MzQwMDAwMDAsIDB4YzgxZjAwMDEsICJpKDIpIiwgRV9BRERSIH0sCS8qIGZsdXNoICNjb25zdChpc3JjMikgKi8KLXsgImZsdXNoIiwJMHgzNDAwMDAwMSwgMHhjODFmMDAwMCwgImkoMikrKyIsIEVfQUREUiB9LAkvKiBmbHVzaCAjY29uc3QoaXNyYzIpKysgKi8KLQoteyAiYW5kIiwJMHhjMDAwMDAwMCwgMHgzYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmQgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZCIsCTB4YzQwMDAwMDAsIDB4MzgwMDAwMDAsICJpLDIsZCIsIEVfQU5EIH0sCS8qIGFuZCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFuZGgiLAkweGM4MDAwMDAwLCAweDM0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZGggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZGgiLAkweGNjMDAwMDAwLCAweDMwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIGFuZGggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3QiLAkweGQwMDAwMDAwLCAweDJjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZG5vdCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90IiwJMHhkNDAwMDAwMCwgMHgyODAwMDAwMCwgImksMixkIiwgRV9VMzIgfSwJLyogYW5kbm90ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90aCIsCTB4ZDgwMDAwMDAsIDB4MjQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kbm90aCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90aCIsCTB4ZGMwMDAwMDAsIDB4MjAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogYW5kbm90aCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgIm9yIiwJCTB4ZTAwMDAwMDAsIDB4MWMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogb3IgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgIm9yIiwJCTB4ZTQwMDAwMDAsIDB4MTgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIG9yICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAib3JoIiwJMHhlODAwMDAwMCwgMHgxNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBvcmggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgIm9yaCIsCTB4ZWMwMDAwMDAsIDB4MTAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogb3JoICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAieG9yIiwJMHhmMDAwMDAwMCwgMHgwYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiB4b3IgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInhvciIsCTB4ZjQwMDAwMDAsIDB4MDgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIHhvciAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInhvcmgiLAkweGY4MDAwMDAwLCAweDA0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHhvcmggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInhvcmgiLAkweGZjMDAwMDAwLCAweDAwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHhvcmggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgImJ0ZSIsCTB4NTgwMDAwMDAsIDB4YTQwMDAwMDAsICIxLDIscyIsIDAgfSwJLyogYnRlIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJ0ZSIsCTB4NWMwMDAwMDAsIDB4YTAwMDAwMDAsICI1LDIscyIsIDAgfSwJLyogYnRlICNjb25zdDUsaXNyYzIsc2Jyb2ZmICovCi17ICJidG5lIiwJMHg1MDAwMDAwMCwgMHhhYzAwMDAwMCwgIjEsMixzIiwgMCB9LAkvKiBidG5lIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJ0bmUiLAkweDU0MDAwMDAwLCAweGE4MDAwMDAwLCAiNSwyLHMiLCAwIH0sCS8qIGJ0bmUgI2NvbnN0NSxpc3JjMixzYnJvZmYgKi8KLXsgImJsYSIsCTB4YjQwMDAwMDAsIDB4NDgwMDAwMDAsICIxLDIscyIsIEVfREVMQVkgfSwJLyogYmxhIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJyaSIsCTB4NDAwMDAwMDAsIDB4YmMwMDAwMDAsICIxIiwgRV9ERUxBWSB9LAkvKiBicmkgaXNyYzFuaSAqLwotCi0vKiBDb3JlIEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgKi8KLXsgImxvY2siLAkweDRjMDAwMDAxLCAweGIwMDAwMDFlLCAiIiwgMCB9LAkvKiBsb2NrIHNldCBCTCBpbiBkaXJiYXNlICovCi17ICJjYWxsaSIsCTB4NGMwMDAwMDIsIDB4YjAwMDAwMWQsICIxIiwgRV9ERUxBWSB9LAkvKiBjYWxsaSBpc3JjMW5pICovCi17ICJpbnRvdnIiLAkweDRjMDAwMDA0LCAweGIwMDAwMDFiLCAiIiwgMCB9LAkvKiBpbnRvdnIgdHJhcCBvbiBpbnRlZ2VyIG92ZXJmbG93ICovCi17ICJ1bmxvY2siLAkweDRjMDAwMDA3LCAweGIwMDAwMDE4LCAiIiwgMCB9LAkvKiB1bmxvY2sgY2xlYXIgQkwgaW4gZGlyYmFzZSAqLwotCi0vKiBDVFJMLUZvcm1hdCBJbnN0cnVjdGlvbnMgKi8KLXsgImJyIiwJCTB4NjgwMDAwMDAsIDB4OTQwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBiciBsYnJvZmYgKi8KLXsgImNhbGwiLAkweDZjMDAwMDAwLCAweDkwMDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogY2FsbCBsYnJvZmYgKi8KLXsgImJjIiwJCTB4NzAwMDAwMDAsIDB4OGMwMDAwMDAsICJsIiwgMCB9LAkvKiBiYyBsYnJvZmYgKi8KLXsgImJjLnQiLAkweDc0MDAwMDAwLCAweDg4MDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogYmMudCBsYnJvZmYgKi8KLXsgImJuYyIsCTB4NzgwMDAwMDAsIDB4ODQwMDAwMDAsICJsIiwgMCB9LAkvKiBibmMgbGJyb2ZmICovCi17ICJibmMudCIsCTB4N2MwMDAwMDAsIDB4ODAwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBibmMudCBsYnJvZmYgKi8KLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmYW0ucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicjJwMS5zcyIsCTB4NDgwMDA0MDAsIDB4YjQwMDAzZmYsICJlLGYsZyIsIDAgfSwKLXsgInIycDEuc2QiLAkweDQ4MDAwNDgwLCAweGI0MDAwMzdmLCAiZSxmLGciLCAwIH0sCi17ICJyMnAxLmRkIiwJMHg0ODAwMDU4MCwgMHhiNDAwMDI3ZiwgImUsZixnIiwgMCB9LAoteyAicjJwdC5zcyIsCTB4NDgwMDA0MDEsIDB4YjQwMDAzZmUsICJlLGYsZyIsIDAgfSwKLXsgInIycHQuc2QiLAkweDQ4MDAwNDgxLCAweGI0MDAwMzdlLCAiZSxmLGciLCAwIH0sCi17ICJyMnB0LmRkIiwJMHg0ODAwMDU4MSwgMHhiNDAwMDI3ZSwgImUsZixnIiwgMCB9LAoteyAicjJhcDEuc3MiLAkweDQ4MDAwNDAyLCAweGI0MDAwM2ZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwMS5zZCIsCTB4NDgwMDA0ODIsIDB4YjQwMDAzN2QsICJlLGYsZyIsIDAgfSwKLXsgInIyYXAxLmRkIiwJMHg0ODAwMDU4MiwgMHhiNDAwMDI3ZCwgImUsZixnIiwgMCB9LAoteyAicjJhcHQuc3MiLAkweDQ4MDAwNDAzLCAweGI0MDAwM2ZjLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwdC5zZCIsCTB4NDgwMDA0ODMsIDB4YjQwMDAzN2MsICJlLGYsZyIsIDAgfSwKLXsgInIyYXB0LmRkIiwJMHg0ODAwMDU4MywgMHhiNDAwMDI3YywgImUsZixnIiwgMCB9LAoteyAiaTJwMS5zcyIsCTB4NDgwMDA0MDQsIDB4YjQwMDAzZmIsICJlLGYsZyIsIDAgfSwKLXsgImkycDEuc2QiLAkweDQ4MDAwNDg0LCAweGI0MDAwMzdiLCAiZSxmLGciLCAwIH0sCi17ICJpMnAxLmRkIiwJMHg0ODAwMDU4NCwgMHhiNDAwMDI3YiwgImUsZixnIiwgMCB9LAoteyAiaTJwdC5zcyIsCTB4NDgwMDA0MDUsIDB4YjQwMDAzZmEsICJlLGYsZyIsIDAgfSwKLXsgImkycHQuc2QiLAkweDQ4MDAwNDg1LCAweGI0MDAwMzdhLCAiZSxmLGciLCAwIH0sCi17ICJpMnB0LmRkIiwJMHg0ODAwMDU4NSwgMHhiNDAwMDI3YSwgImUsZixnIiwgMCB9LAoteyAiaTJhcDEuc3MiLAkweDQ4MDAwNDA2LCAweGI0MDAwM2Y5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwMS5zZCIsCTB4NDgwMDA0ODYsIDB4YjQwMDAzNzksICJlLGYsZyIsIDAgfSwKLXsgImkyYXAxLmRkIiwJMHg0ODAwMDU4NiwgMHhiNDAwMDI3OSwgImUsZixnIiwgMCB9LAoteyAiaTJhcHQuc3MiLAkweDQ4MDAwNDA3LCAweGI0MDAwM2Y4LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwdC5zZCIsCTB4NDgwMDA0ODcsIDB4YjQwMDAzNzgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXB0LmRkIiwJMHg0ODAwMDU4NywgMHhiNDAwMDI3OCwgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLnNzIiwJMHg0ODAwMDQwOCwgMHhiNDAwMDNmNywgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLnNkIiwJMHg0ODAwMDQ4OCwgMHhiNDAwMDM3NywgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLmRkIiwJMHg0ODAwMDU4OCwgMHhiNDAwMDI3NywgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLnNzIiwJMHg0ODAwMDQwOSwgMHhiNDAwMDNmNiwgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLnNkIiwJMHg0ODAwMDQ4OSwgMHhiNDAwMDM3NiwgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLmRkIiwJMHg0ODAwMDU4OSwgMHhiNDAwMDI3NiwgImUsZixnIiwgMCB9LAoteyAicmExcDIuc3MiLAkweDQ4MDAwNDBhLCAweGI0MDAwM2Y1LCAiZSxmLGciLCAwIH0sCi17ICJyYTFwMi5zZCIsCTB4NDgwMDA0OGEsIDB4YjQwMDAzNzUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXAyLmRkIiwJMHg0ODAwMDU4YSwgMHhiNDAwMDI3NSwgImUsZixnIiwgMCB9LAoteyAibTEydHRwYS5zcyIsCTB4NDgwMDA0MGIsIDB4YjQwMDAzZjQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0cGEuc2QiLAkweDQ4MDAwNDhiLCAweGI0MDAwMzc0LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHBhLmRkIiwJMHg0ODAwMDU4YiwgMHhiNDAwMDI3NCwgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLnNzIiwJMHg0ODAwMDQwYywgMHhiNDAwMDNmMywgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLnNkIiwJMHg0ODAwMDQ4YywgMHhiNDAwMDM3MywgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLmRkIiwJMHg0ODAwMDU4YywgMHhiNDAwMDI3MywgImUsZixnIiwgMCB9LAoteyAibTEydHBtLnNzIiwJMHg0ODAwMDQwZCwgMHhiNDAwMDNmMiwgImUsZixnIiwgMCB9LAoteyAibTEydHBtLnNkIiwJMHg0ODAwMDQ4ZCwgMHhiNDAwMDM3MiwgImUsZixnIiwgMCB9LAoteyAibTEydHBtLmRkIiwJMHg0ODAwMDU4ZCwgMHhiNDAwMDI3MiwgImUsZixnIiwgMCB9LAoteyAiaWExcDIuc3MiLAkweDQ4MDAwNDBlLCAweGI0MDAwM2YxLCAiZSxmLGciLCAwIH0sCi17ICJpYTFwMi5zZCIsCTB4NDgwMDA0OGUsIDB4YjQwMDAzNzEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXAyLmRkIiwJMHg0ODAwMDU4ZSwgMHhiNDAwMDI3MSwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLnNzIiwJMHg0ODAwMDQwZiwgMHhiNDAwMDNmMCwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLnNkIiwJMHg0ODAwMDQ4ZiwgMHhiNDAwMDM3MCwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLmRkIiwJMHg0ODAwMDU4ZiwgMHhiNDAwMDI3MCwgImUsZixnIiwgMCB9LAotCi0vKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZzbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJyMnMxLnNzIiwJMHg0ODAwMDQxMCwgMHhiNDAwMDNlZiwgImUsZixnIiwgMCB9LAoteyAicjJzMS5zZCIsCTB4NDgwMDA0OTAsIDB4YjQwMDAzNmYsICJlLGYsZyIsIDAgfSwKLXsgInIyczEuZGQiLAkweDQ4MDAwNTkwLCAweGI0MDAwMjZmLCAiZSxmLGciLCAwIH0sCi17ICJyMnN0LnNzIiwJMHg0ODAwMDQxMSwgMHhiNDAwMDNlZSwgImUsZixnIiwgMCB9LAoteyAicjJzdC5zZCIsCTB4NDgwMDA0OTEsIDB4YjQwMDAzNmUsICJlLGYsZyIsIDAgfSwKLXsgInIyc3QuZGQiLAkweDQ4MDAwNTkxLCAweGI0MDAwMjZlLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzMS5zcyIsCTB4NDgwMDA0MTIsIDB4YjQwMDAzZWQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXMxLnNkIiwJMHg0ODAwMDQ5MiwgMHhiNDAwMDM2ZCwgImUsZixnIiwgMCB9LAoteyAicjJhczEuZGQiLAkweDQ4MDAwNTkyLCAweGI0MDAwMjZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzdC5zcyIsCTB4NDgwMDA0MTMsIDB4YjQwMDAzZWMsICJlLGYsZyIsIDAgfSwKLXsgInIyYXN0LnNkIiwJMHg0ODAwMDQ5MywgMHhiNDAwMDM2YywgImUsZixnIiwgMCB9LAoteyAicjJhc3QuZGQiLAkweDQ4MDAwNTkzLCAweGI0MDAwMjZjLCAiZSxmLGciLCAwIH0sCi17ICJpMnMxLnNzIiwJMHg0ODAwMDQxNCwgMHhiNDAwMDNlYiwgImUsZixnIiwgMCB9LAoteyAiaTJzMS5zZCIsCTB4NDgwMDA0OTQsIDB4YjQwMDAzNmIsICJlLGYsZyIsIDAgfSwKLXsgImkyczEuZGQiLAkweDQ4MDAwNTk0LCAweGI0MDAwMjZiLCAiZSxmLGciLCAwIH0sCi17ICJpMnN0LnNzIiwJMHg0ODAwMDQxNSwgMHhiNDAwMDNlYSwgImUsZixnIiwgMCB9LAoteyAiaTJzdC5zZCIsCTB4NDgwMDA0OTUsIDB4YjQwMDAzNmEsICJlLGYsZyIsIDAgfSwKLXsgImkyc3QuZGQiLAkweDQ4MDAwNTk1LCAweGI0MDAwMjZhLCAiZSxmLGciLCAwIH0sCi17ICJpMmFzMS5zcyIsCTB4NDgwMDA0MTYsIDB4YjQwMDAzZTksICJlLGYsZyIsIDAgfSwKLXsgImkyYXMxLnNkIiwJMHg0ODAwMDQ5NiwgMHhiNDAwMDM2OSwgImUsZixnIiwgMCB9LAoteyAiaTJhczEuZGQiLAkweDQ4MDAwNTk2LCAweGI0MDAwMjY5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzdC5zcyIsCTB4NDgwMDA0MTcsIDB4YjQwMDAzZTgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXN0LnNkIiwJMHg0ODAwMDQ5NywgMHhiNDAwMDM2OCwgImUsZixnIiwgMCB9LAoteyAiaTJhc3QuZGQiLAkweDQ4MDAwNTk3LCAweGI0MDAwMjY4LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuc3MiLAkweDQ4MDAwNDE4LCAweGI0MDAwM2U3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuc2QiLAkweDQ4MDAwNDk4LCAweGI0MDAwMzY3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuZGQiLAkweDQ4MDAwNTk4LCAweGI0MDAwMjY3LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uc3MiLAkweDQ4MDAwNDE5LCAweGI0MDAwM2U2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uc2QiLAkweDQ4MDAwNDk5LCAweGI0MDAwMzY2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uZGQiLAkweDQ4MDAwNTk5LCAweGI0MDAwMjY2LCAiZSxmLGciLCAwIH0sCi17ICJyYTFzMi5zcyIsCTB4NDgwMDA0MWEsIDB4YjQwMDAzZTUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXMyLnNkIiwJMHg0ODAwMDQ5YSwgMHhiNDAwMDM2NSwgImUsZixnIiwgMCB9LAoteyAicmExczIuZGQiLAkweDQ4MDAwNTlhLCAweGI0MDAwMjY1LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHNhLnNzIiwJMHg0ODAwMDQxYiwgMHhiNDAwMDNlNCwgImUsZixnIiwgMCB9LAoteyAibTEydHRzYS5zZCIsCTB4NDgwMDA0OWIsIDB4YjQwMDAzNjQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0c2EuZGQiLAkweDQ4MDAwNTliLCAweGI0MDAwMjY0LCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuc3MiLAkweDQ4MDAwNDFjLCAweGI0MDAwM2UzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuc2QiLAkweDQ4MDAwNDljLCAweGI0MDAwMzYzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuZGQiLAkweDQ4MDAwNTljLCAweGI0MDAwMjYzLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uc3MiLAkweDQ4MDAwNDFkLCAweGI0MDAwM2UyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uc2QiLAkweDQ4MDAwNDlkLCAweGI0MDAwMzYyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uZGQiLAkweDQ4MDAwNTlkLCAweGI0MDAwMjYyLCAiZSxmLGciLCAwIH0sCi17ICJpYTFzMi5zcyIsCTB4NDgwMDA0MWUsIDB4YjQwMDAzZTEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXMyLnNkIiwJMHg0ODAwMDQ5ZSwgMHhiNDAwMDM2MSwgImUsZixnIiwgMCB9LAoteyAiaWExczIuZGQiLAkweDQ4MDAwNTllLCAweGI0MDAwMjYxLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2Euc3MiLAkweDQ4MDAwNDFmLCAweGI0MDAwM2UwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2Euc2QiLAkweDQ4MDAwNDlmLCAweGI0MDAwMzYwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2EuZGQiLAkweDQ4MDAwNTlmLCAweGI0MDAwMjYwLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZm1hbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJtcjJwMS5zcyIsCTB4NDgwMDAwMDAsIDB4YjQwMDA3ZmYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnAxLnNkIiwJMHg0ODAwMDA4MCwgMHhiNDAwMDc3ZiwgImUsZixnIiwgMCB9LAoteyAibXIycDEuZGQiLAkweDQ4MDAwMTgwLCAweGI0MDAwNjdmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwdC5zcyIsCTB4NDgwMDAwMDEsIDB4YjQwMDA3ZmUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnB0LnNkIiwJMHg0ODAwMDA4MSwgMHhiNDAwMDc3ZSwgImUsZixnIiwgMCB9LAoteyAibXIycHQuZGQiLAkweDQ4MDAwMTgxLCAweGI0MDAwNjdlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuc3MiLAkweDQ4MDAwMDAyLCAweGI0MDAwN2ZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuc2QiLAkweDQ4MDAwMDgyLCAweGI0MDAwNzdkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuZGQiLAkweDQ4MDAwMTgyLCAweGI0MDAwNjdkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuc3MiLAkweDQ4MDAwMDAzLCAweGI0MDAwN2ZjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuc2QiLAkweDQ4MDAwMDgzLCAweGI0MDAwNzdjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuZGQiLAkweDQ4MDAwMTgzLCAweGI0MDAwNjdjLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwMS5zcyIsCTB4NDgwMDAwMDQsIDB4YjQwMDA3ZmIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnAxLnNkIiwJMHg0ODAwMDA4NCwgMHhiNDAwMDc3YiwgImUsZixnIiwgMCB9LAoteyAibWkycDEuZGQiLAkweDQ4MDAwMTg0LCAweGI0MDAwNjdiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwdC5zcyIsCTB4NDgwMDAwMDUsIDB4YjQwMDA3ZmEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnB0LnNkIiwJMHg0ODAwMDA4NSwgMHhiNDAwMDc3YSwgImUsZixnIiwgMCB9LAoteyAibWkycHQuZGQiLAkweDQ4MDAwMTg1LCAweGI0MDAwNjdhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuc3MiLAkweDQ4MDAwMDA2LCAweGI0MDAwN2Y5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuc2QiLAkweDQ4MDAwMDg2LCAweGI0MDAwNzc5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuZGQiLAkweDQ4MDAwMTg2LCAweGI0MDAwNjc5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuc3MiLAkweDQ4MDAwMDA3LCAweGI0MDAwN2Y4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuc2QiLAkweDQ4MDAwMDg3LCAweGI0MDAwNzc4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuZGQiLAkweDQ4MDAwMTg3LCAweGI0MDAwNjc4LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXAyLnNzIiwJMHg0ODAwMDAwOCwgMHhiNDAwMDdmNywgImUsZixnIiwgMCB9LAoteyAibXJtdDFwMi5zZCIsCTB4NDgwMDAwODgsIDB4YjQwMDA3NzcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxcDIuZGQiLAkweDQ4MDAwMTg4LCAweGI0MDAwNjc3LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXBtLnNzIiwJMHg0ODAwMDAwOSwgMHhiNDAwMDdmNiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1wbS5zZCIsCTB4NDgwMDAwODksIDB4YjQwMDA3NzYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtcG0uZGQiLAkweDQ4MDAwMTg5LCAweGI0MDAwNjc2LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuc3MiLAkweDQ4MDAwMDBhLCAweGI0MDAwN2Y1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuc2QiLAkweDQ4MDAwMDhhLCAweGI0MDAwNzc1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuZGQiLAkweDQ4MDAwMThhLCAweGI0MDAwNjc1LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRwbS5zcyIsMHg0ODAwMDAwYiwgMHhiNDAwMDdmNCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0cG0uc2QiLDB4NDgwMDAwOGIsIDB4YjQwMDA3NzQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHBtLmRkIiwweDQ4MDAwMThiLCAweGI0MDAwNjc0LCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXAyLnNzIiwJMHg0ODAwMDAwYywgMHhiNDAwMDdmMywgImUsZixnIiwgMCB9LAoteyAibWltdDFwMi5zZCIsCTB4NDgwMDAwOGMsIDB4YjQwMDA3NzMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxcDIuZGQiLAkweDQ4MDAwMThjLCAweGI0MDAwNjczLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHBtLnNzIiwJMHg0ODAwMDAwZCwgMHhiNDAwMDdmMiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRwbS5zZCIsCTB4NDgwMDAwOGQsIDB4YjQwMDA3NzIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0cG0uZGQiLAkweDQ4MDAwMThkLCAweGI0MDAwNjcyLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuc3MiLAkweDQ4MDAwMDBlLCAweGI0MDAwN2YxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuc2QiLAkweDQ4MDAwMDhlLCAweGI0MDAwNzcxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuZGQiLAkweDQ4MDAwMThlLCAweGI0MDAwNjcxLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZm1zbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJtcjJzMS5zcyIsCTB4NDgwMDAwMTAsIDB4YjQwMDA3ZWYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnMxLnNkIiwJMHg0ODAwMDA5MCwgMHhiNDAwMDc2ZiwgImUsZixnIiwgMCB9LAoteyAibXIyczEuZGQiLAkweDQ4MDAwMTkwLCAweGI0MDAwNjZmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzdC5zcyIsCTB4NDgwMDAwMTEsIDB4YjQwMDA3ZWUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnN0LnNkIiwJMHg0ODAwMDA5MSwgMHhiNDAwMDc2ZSwgImUsZixnIiwgMCB9LAoteyAibXIyc3QuZGQiLAkweDQ4MDAwMTkxLCAweGI0MDAwNjZlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuc3MiLAkweDQ4MDAwMDEyLCAweGI0MDAwN2VkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuc2QiLAkweDQ4MDAwMDkyLCAweGI0MDAwNzZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuZGQiLAkweDQ4MDAwMTkyLCAweGI0MDAwNjZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3Quc3MiLAkweDQ4MDAwMDEzLCAweGI0MDAwN2VjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3Quc2QiLAkweDQ4MDAwMDkzLCAweGI0MDAwNzZjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3QuZGQiLAkweDQ4MDAwMTkzLCAweGI0MDAwNjZjLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzMS5zcyIsCTB4NDgwMDAwMTQsIDB4YjQwMDA3ZWIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnMxLnNkIiwJMHg0ODAwMDA5NCwgMHhiNDAwMDc2YiwgImUsZixnIiwgMCB9LAoteyAibWkyczEuZGQiLAkweDQ4MDAwMTk0LCAweGI0MDAwNjZiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzdC5zcyIsCTB4NDgwMDAwMTUsIDB4YjQwMDA3ZWEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnN0LnNkIiwJMHg0ODAwMDA5NSwgMHhiNDAwMDc2YSwgImUsZixnIiwgMCB9LAoteyAibWkyc3QuZGQiLAkweDQ4MDAwMTk1LCAweGI0MDAwNjZhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuc3MiLAkweDQ4MDAwMDE2LCAweGI0MDAwN2U5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuc2QiLAkweDQ4MDAwMDk2LCAweGI0MDAwNzY5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuZGQiLAkweDQ4MDAwMTk2LCAweGI0MDAwNjY5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3Quc3MiLAkweDQ4MDAwMDE3LCAweGI0MDAwN2U4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3Quc2QiLAkweDQ4MDAwMDk3LCAweGI0MDAwNzY4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3QuZGQiLAkweDQ4MDAwMTk3LCAweGI0MDAwNjY4LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXMyLnNzIiwJMHg0ODAwMDAxOCwgMHhiNDAwMDdlNywgImUsZixnIiwgMCB9LAoteyAibXJtdDFzMi5zZCIsCTB4NDgwMDAwOTgsIDB4YjQwMDA3NjcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxczIuZGQiLAkweDQ4MDAwMTk4LCAweGI0MDAwNjY3LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXNtLnNzIiwJMHg0ODAwMDAxOSwgMHhiNDAwMDdlNiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1zbS5zZCIsCTB4NDgwMDAwOTksIDB4YjQwMDA3NjYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtc20uZGQiLAkweDQ4MDAwMTk5LCAweGI0MDAwNjY2LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuc3MiLAkweDQ4MDAwMDFhLCAweGI0MDAwN2U1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuc2QiLAkweDQ4MDAwMDlhLCAweGI0MDAwNzY1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuZGQiLAkweDQ4MDAwMTlhLCAweGI0MDAwNjY1LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRzbS5zcyIsMHg0ODAwMDAxYiwgMHhiNDAwMDdlNCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0c20uc2QiLDB4NDgwMDAwOWIsIDB4YjQwMDA3NjQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHNtLmRkIiwweDQ4MDAwMTliLCAweGI0MDAwNjY0LCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXMyLnNzIiwJMHg0ODAwMDAxYywgMHhiNDAwMDdlMywgImUsZixnIiwgMCB9LAoteyAibWltdDFzMi5zZCIsCTB4NDgwMDAwOWMsIDB4YjQwMDA3NjMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxczIuZGQiLAkweDQ4MDAwMTljLCAweGI0MDAwNjYzLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHNtLnNzIiwJMHg0ODAwMDAxZCwgMHhiNDAwMDdlMiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRzbS5zZCIsCTB4NDgwMDAwOWQsIDB4YjQwMDA3NjIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0c20uZGQiLAkweDQ4MDAwMTlkLCAweGI0MDAwNjYyLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuc3MiLAkweDQ4MDAwMDFlLCAweGI0MDAwN2UxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuc2QiLAkweDQ4MDAwMDllLCAweGI0MDAwNzYxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuZGQiLAkweDQ4MDAwMTllLCAweGI0MDAwNjYxLCAiZSxmLGciLCAwIH0sCi0KLQoteyAiZm11bC5zcyIsCTB4NDgwMDAwMjAsIDB4YjQwMDA3ZGYsICJlLGYsZyIsIDAgfSwJLyogZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmbXVsLnNkIiwJMHg0ODAwMDBhMCwgMHhiNDAwMDc1ZiwgImUsZixnIiwgMCB9LAkvKiBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZtdWwuZGQiLAkweDQ4MDAwMWEwLCAweGI0MDAwNjVmLCAiZSxmLGciLCAwIH0sCS8qIGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwuc3MiLAkweDQ4MDAwNDIwLCAweGI0MDAwM2RmLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbXVsLnNkIiwJMHg0ODAwMDRhMCwgMHhiNDAwMDM1ZiwgImUsZixnIiwgMCB9LAkvKiBwZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bC5kZCIsCTB4NDgwMDA1YTAsIDB4YjQwMDAyNWYsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwzLmRkIiwJMHg0ODAwMDVhNCwgMHhiNDAwMDI1YiwgImUsZixnIiwgMCB9LAkvKiBwZm11bDMucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm1sb3cuZGQiLAkweDQ4MDAwMWExLCAweGI0MDAwNjVlLCAiZSxmLGciLCAwIH0sCS8qIGZtbG93LmRkIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLnNzIiwJMHg0ODAwMDAyMiwgMHhiNDAwMDdkZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLnNkIiwJMHg0ODAwMDBhMiwgMHhiNDAwMDc1ZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLmRkIiwJMHg0ODAwMDFhMiwgMHhiNDAwMDY1ZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcnNxci5zcyIsCTB4NDgwMDAwMjMsIDB4YjQwMDA3ZGMsICJmLGciLCAwIH0sCS8qIGZyc3FyLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyc3FyLnNkIiwJMHg0ODAwMDBhMywgMHhiNDAwMDc1YywgImYsZyIsIDAgfSwJLyogZnJzcXIucCBmc3JjMixmZGVzdCAqLwoteyAiZnJzcXIuZGQiLAkweDQ4MDAwMWEzLCAweGI0MDAwNjVjLCAiZixnIiwgMCB9LAkvKiBmcnNxci5wIGZzcmMyLGZkZXN0ICovCi17ICJmYWRkLnNzIiwJMHg0ODAwMDAzMCwgMHhiNDAwMDdjZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGQuc2QiLAkweDQ4MDAwMGIwLCAweGI0MDAwNzRmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZC5kZCIsCTB4NDgwMDAxYjAsIDB4YjQwMDA2NGYsICJlLGYsZyIsIDAgfSwJLyogZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZC5zcyIsCTB4NDgwMDA0MzAsIDB4YjQwMDAzY2YsICJlLGYsZyIsIDAgfSwJLyogcGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGQuc2QiLAkweDQ4MDAwNGIwLCAweGI0MDAwMzRmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkLmRkIiwJMHg0ODAwMDViMCwgMHhiNDAwMDI0ZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmc3ViLnNzIiwJMHg0ODAwMDAzMSwgMHhiNDAwMDdjZSwgImUsZixnIiwgMCB9LAkvKiBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZzdWIuc2QiLAkweDQ4MDAwMGIxLCAweGI0MDAwNzRlLCAiZSxmLGciLCAwIH0sCS8qIGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnN1Yi5kZCIsCTB4NDgwMDAxYjEsIDB4YjQwMDA2NGUsICJlLGYsZyIsIDAgfSwJLyogZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnN1Yi5zcyIsCTB4NDgwMDA0MzEsIDB4YjQwMDAzY2UsICJlLGYsZyIsIDAgfSwJLyogcGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZzdWIuc2QiLAkweDQ4MDAwNGIxLCAweGI0MDAwMzRlLCAiZSxmLGciLCAwIH0sCS8qIHBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmc3ViLmRkIiwJMHg0ODAwMDViMSwgMHhiNDAwMDI0ZSwgImUsZixnIiwgMCB9LAkvKiBwZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaXguc3MiLAkweDQ4MDAwMDMyLCAweGI0MDAwN2NkLCAiZSxnIiwgMCB9LAkvKiBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAiZml4LnNkIiwJMHg0ODAwMDBiMiwgMHhiNDAwMDc0ZCwgImUsZyIsIDAgfSwJLyogZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZpeC5kZCIsCTB4NDgwMDAxYjIsIDB4YjQwMDA2NGQsICJlLGciLCAwIH0sCS8qIGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LnNzIiwJMHg0ODAwMDQzMiwgMHhiNDAwMDNjZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LnNkIiwJMHg0ODAwMDRiMiwgMHhiNDAwMDM0ZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LmRkIiwJMHg0ODAwMDViMiwgMHhiNDAwMDI0ZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5zcyIsCTB4NDgwMDAwMzMsIDB4YjQwMDA3Y2MsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LmRzIiwJMHg0ODAwMDEzMywgMHhiNDAwMDZjYywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAiZmFtb3Yuc2QiLAkweDQ4MDAwMGIzLCAweGI0MDAwNzRjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5kZCIsCTB4NDgwMDAxYjMsIDB4YjQwMDA2NGMsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5zcyIsCTB4NDgwMDA0MzMsIDB4YjQwMDAzY2MsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJwZmFtb3YuZHMiLAkweDQ4MDAwNTMzLCAweGI0MDAwMmNjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LnNkIiwJMHg0ODAwMDRiMywgMHhiNDAwMDM0YywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5kZCIsCTB4NDgwMDA1YjMsIDB4YjQwMDAyNGMsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi0vKiBwZmd0IGhhcyBSIGJpdCBjbGVhcmVkOyBwZmxlIGhhcyBSIGJpdCBzZXQgKi8KLXsgInBmZ3Quc3MiLAkweDQ4MDAwNDM0LCAweGI0MDAwM2NiLCAiZSxmLGciLCAwIH0sCS8qIHBmZ3QucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZndC5zZCIsCTB4NDgwMDA0MzQsIDB4YjQwMDAzY2IsICJlLGYsZyIsIDAgfSwJLyogcGZndC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmd0LmRkIiwJMHg0ODAwMDUzNCwgMHhiNDAwMDJjYiwgImUsZixnIiwgMCB9LAkvKiBwZmd0LnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLS8qIHBmZ3QgaGFzIFIgYml0IGNsZWFyZWQ7IHBmbGUgaGFzIFIgYml0IHNldCAqLwoteyAicGZsZS5zcyIsCTB4NDgwMDA0YjQsIDB4YjQwMDAzNGIsICJlLGYsZyIsIDAgfSwJLyogcGZsZS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmxlLnNkIiwJMHg0ODAwMDRiNCwgMHhiNDAwMDM0YiwgImUsZixnIiwgMCB9LAkvKiBwZmxlLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbGUuZGQiLAkweDQ4MDAwNWI0LCAweGI0MDAwMjRiLCAiZSxmLGciLCAwIH0sCS8qIHBmbGUucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnRydW5jLnNzIiwJMHg0ODAwMDAzYSwgMHhiNDAwMDdjNSwgImUsZyIsIDAgfSwJLyogZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgImZ0cnVuYy5zZCIsCTB4NDgwMDAwYmEsIDB4YjQwMDA3NDUsICJlLGciLCAwIH0sCS8qIGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJmdHJ1bmMuZGQiLAkweDQ4MDAwMWJhLCAweGI0MDAwNjQ1LCAiZSxnIiwgMCB9LAkvKiBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5zcyIsCTB4NDgwMDA0M2EsIDB4YjQwMDAzYzUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5zZCIsCTB4NDgwMDA0YmEsIDB4YjQwMDAzNDUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5kZCIsCTB4NDgwMDA1YmEsIDB4YjQwMDAyNDUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAiZnhmciIsCTB4NDgwMDAwNDAsIDB4YjQwMDA3YmYsICJlLGQiLCAwIH0sCS8qIGZ4ZnIgZnNyYzEsaWRlc3QgKi8KLXsgImZpYWRkLnNzIiwJMHg0ODAwMDA0OSwgMHhiNDAwMDdiNiwgImUsZixnIiwgMCB9LAkvKiBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaWFkZC5kZCIsCTB4NDgwMDAxYzksIDB4YjQwMDA2MzYsICJlLGYsZyIsIDAgfSwJLyogZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpYWRkLnNzIiwJMHg0ODAwMDQ0OSwgMHhiNDAwMDNiNiwgImUsZixnIiwgMCB9LAkvKiBwZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpYWRkLmRkIiwJMHg0ODAwMDVjOSwgMHhiNDAwMDIzNiwgImUsZixnIiwgMCB9LAkvKiBwZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmlzdWIuc3MiLAkweDQ4MDAwMDRkLCAweGI0MDAwN2IyLCAiZSxmLGciLCAwIH0sCS8qIGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpc3ViLmRkIiwJMHg0ODAwMDFjZCwgMHhiNDAwMDYzMiwgImUsZixnIiwgMCB9LAkvKiBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlzdWIuc3MiLAkweDQ4MDAwNDRkLCAweGI0MDAwM2IyLCAiZSxmLGciLCAwIH0sCS8qIHBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlzdWIuZGQiLAkweDQ4MDAwNWNkLCAweGI0MDAwMjMyLCAiZSxmLGciLCAwIH0sCS8qIHBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmemNoa2wiLAkweDQ4MDAwMDU3LCAweGI0MDAwN2E4LCAiZSxmLGciLCAwIH0sCS8qIGZ6Y2hrbCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZ6Y2hrbCIsCTB4NDgwMDA0NTcsIDB4YjQwMDAzYTgsICJlLGYsZyIsIDAgfSwJLyogcGZ6Y2hrbCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnpjaGtzIiwJMHg0ODAwMDA1ZiwgMHhiNDAwMDdhMCwgImUsZixnIiwgMCB9LAkvKiBmemNoa3MgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmemNoa3MiLAkweDQ4MDAwNDVmLCAweGI0MDAwM2EwLCAiZSxmLGciLCAwIH0sCS8qIHBmemNoa3MgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGRwIiwJMHg0ODAwMDA1MCwgMHhiNDAwMDdhZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkcCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGRwIiwJMHg0ODAwMDQ1MCwgMHhiNDAwMDNhZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZHAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGR6IiwJMHg0ODAwMDA1MSwgMHhiNDAwMDdhZSwgImUsZixnIiwgMCB9LAkvKiBmYWRkeiBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGR6IiwJMHg0ODAwMDQ1MSwgMHhiNDAwMDNhZSwgImUsZixnIiwgMCB9LAkvKiBwZmFkZHogZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZvcm0iLAkweDQ4MDAwMDVhLCAweGI0MDAwN2E1LCAiZSxnIiwgMCB9LAkvKiBmb3JtIGZzcmMxLGZkZXN0ICovCi17ICJwZm9ybSIsCTB4NDgwMDA0NWEsIDB4YjQwMDAzYTUsICJlLGciLCAwIH0sCS8qIHBmb3JtIGZzcmMxLGZkZXN0ICovCi0KLS8qIEZsb2F0aW5nIHBvaW50IHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLXsgImZtb3Yuc3MiLAkweDQ4MDAwMDQ5LCAweGI3ZTAwN2I2LCAiZSxnIiwgMCB9LAkvKiBmaWFkZC5zcyBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5kZCIsCTB4NDgwMDAxYzksIDB4YjdlMDA2MzYsICJlLGciLCAwIH0sCS8qIGZpYWRkLmRkIGZzcmMxLGYwLGZkZXN0ICovCi17ICJmbW92LnNkIiwJMHg0ODAwMDBiMCwgMHhiN2UwMDc0ZiwgImUsZyIsIDAgfSwJLyogZmFkZC5zZCBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5kcyIsCTB4NDgwMDAxMzAsIDB4YjdlMDA2Y2YsICJlLGciLCAwIH0sCS8qIGZhZGQuZHMgZnNyYzEsZjAsZmRlc3QgKi8KLXsgInBmbW92LmRzIiwJMHg0ODAwMDUzMCwgMHhiNzMwMDJjZiwgImUsZyIsIDAgfSwJLyogcGZhZGQuZHMgZnNyYzEsZjAsZmRlc3QgKi8KLXsgInBmbW92LmRkIiwJMHg0ODAwMDVjOSwgMHhiN2UwMDIzNiwgImUsZyIsIDAgfSwJLyogcGZpYWRkLmRkIGZzcmMxLGYwLGZkZXN0ICovCi0KLQotfTsKLQotI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIGk4NjBfb3Bjb2RlcykvKHNpemVvZiBpODYwX29wY29kZXNbMF0pKQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaCBiL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyZmMzMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyogQmFzaWMgODA5NjAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLSAqCi0gKiBUaGUgJ0NPSicgaW5zdHJ1Y3Rpb25zIGFyZSBhY3R1YWxseSBDT0JSIGluc3RydWN0aW9ucyB3aXRoIHRoZSAnYicgaW4KLSAqIHRoZSBtbmVtb25pYyByZXBsYWNlZCBieSBhICdqJzsgIHRoZXkgYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpZiBuZWNlc3Nhcnk6Ci0gKiBpZiB0aGUgZGlzcGxhY2VtZW50IHdpbGwgbm90IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgcmVwbGFjZSB0aGVtCi0gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0gKgotICogQWxsIG9mIHRoZSAnTUVNbicgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgc2FtZSBmb3JtYXQ7IHRoZSAnbicgaW4gdGhlIG5hbWUKLSAqIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbmRleCBzY2FsZSBmYWN0b3IgKHRoZSBzaXplIG9mIHRoZSBkYXR1bSBvcGVyYXRlZCBvbikuCi0gKgotICogVGhlIEZCUkEgZm9ybWF0cyBhcmUgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIFRoZXkgYXJlIHRoZQotICogImNvbnZlbmllbmNlIGRpcmVjdGl2ZXMiIGZvciBicmFuY2hpbmcgb24gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMsCi0gKiBlYWNoIG9mIHdoaWNoIGdlbmVyYXRlcyAyIGluc3RydWN0aW9ucyAoYSAnYm5vJyBhbmQgb25lIG90aGVyIGJyYW5jaCkuCi0gKgotICogVGhlIENBTExKIGZvcm1hdCBpcyBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgSXQgaW5kaWNhdGVzIHRoYXQKLSAqIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgKGEgQ1RSTC1mb3JtYXQgJ2NhbGwnKSBzaG91bGQgaGF2ZSBpdHMgcmVsb2NhdGlvbgotICogc3BlY2lhbGx5IGZsYWdnZWQgZm9yIGxpbmstdGltZSByZXBsYWNlbWVudCB3aXRoIGEgJ2JhbCcgb3IgJ2NhbGxzJyBpZgotICogYXBwcm9wcmlhdGUuCi0gKi8gCi0KLSNkZWZpbmUgQ1RSTAkwCi0jZGVmaW5lIENPQlIJMQotI2RlZmluZSBDT0oJMgotI2RlZmluZSBSRUcJMwotI2RlZmluZSBNRU0xCTQKLSNkZWZpbmUgTUVNMgk1Ci0jZGVmaW5lIE1FTTQJNgotI2RlZmluZSBNRU04CTcKLSNkZWZpbmUgTUVNMTIJOAotI2RlZmluZSBNRU0xNgk5Ci0jZGVmaW5lIEZCUkEJMTAKLSNkZWZpbmUgQ0FMTEoJMTEKLQotLyogTWFza3MgZm9yIHRoZSBtb2RlIGJpdHMgaW4gUkVHIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTTEJCTB4MDgwMAotI2RlZmluZSBNMgkJMHgxMDAwCi0jZGVmaW5lIE0zCQkweDIwMDAKLQotLyogR2VuZXJhdGUgdGhlIDEyLWJpdCBvcGNvZGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbiBieSBwbGFjaW5nIHRoZSAKLSAqIGhpZ2ggOCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMgMjQtMzEsIHRoZSBsb3cgNCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMKLSAqIDctMTAuCi0gKi8KLQotI2RlZmluZSBSRUdfT1BDKG9wYykJKChvcGMgJiAweGZmMCkgPDwgMjApIHwgKChvcGMgJiAweGYpIDw8IDcpCi0KLS8qIEdlbmVyYXRlIGEgdGVtcGxhdGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbjogIHBsYWNlIHRoZSBvcGNvZGUgYml0cwotICogaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBhbmQgT1IgaW4gbW9kZSBiaXRzIGZvciB0aGUgb3BlcmFuZHMgdGhhdCB3aWxsIG5vdAotICogYmUgdXNlZC4gIEkuZS4sCi0gKgkJc2V0IG0xPTEsIGlmIHNyYzEgd2lsbCBub3QgYmUgdXNlZAotICoJCXNldCBtMj0xLCBpZiBzcmMyIHdpbGwgbm90IGJlIHVzZWQKLSAqCQlzZXQgbTM9MSwgaWYgZHN0ICB3aWxsIG5vdCBiZSB1c2VkCi0gKgotICogU2V0dGluZyB0aGUgInVudXNlZCIgbW9kZSBiaXRzIHRvIDEgc3BlZWRzIHVwIGluc3RydWN0aW9uIGV4ZWN1dGlvbighKS4KLSAqIFRoZSBpbmZvcm1hdGlvbiBpcyBhbHNvIHVzZWZ1bCB0byB1cyBiZWNhdXNlIHNvbWUgMS1vcGVyYW5kIFJFRyBpbnN0cnVjdGlvbnMKLSAqIHVzZSB0aGUgc3JjMSBmaWVsZCwgb3RoZXJzIHRoZSBkc3QgZmllbGQ7IGFuZCBzb21lIDItb3BlcmFuZCBSRUcgaW5zdHJ1Y3Rpb25zCi0gKiB1c2Ugc3JjMS9zcmMyLCBvdGhlcnMgc3JjMS9kc3QuICBUaGUgc2V0IG1vZGUgYml0cyBlbmFibGUgdXMgdG8gZGlzdGluZ3Vpc2guCi0gKi8KLSNkZWZpbmUgUl8wKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMSB8IE0yIHwgTTMgKQkvKiBObyBvcGVyYW5kcyAgICAgICovCi0jZGVmaW5lIFJfMShvcGMpCSggUkVHX09QQyhvcGMpIHwgTTIgfCBNMyApCS8qIDEgb3BlcmFuZDogc3JjMSAgKi8KLSNkZWZpbmUgUl8xRChvcGMpCSggUkVHX09QQyhvcGMpIHwgTTEgfCBNMiApCS8qIDEgb3BlcmFuZDogZHN0ICAgKi8KLSNkZWZpbmUgUl8yKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMyApCQkvKiAyIG9wczogc3JjMS9zcmMyICovCi0jZGVmaW5lIFJfMkQob3BjKQkoIFJFR19PUEMob3BjKSB8IE0yICkJCS8qIDIgb3BzOiBzcmMxL2RzdCAgKi8KLSNkZWZpbmUgUl8zKG9wYykJKCBSRUdfT1BDKG9wYykgKQkJLyogMyBvcGVyYW5kcyAgICAgICAqLwotCi0vKiBERVNDUklQVE9SIEJZVEVTIEZPUiBSRUdJU1RFUiBPUEVSQU5EUwotICoKLSAqIEludGVycHJldCBuYW1lcyBhcyBmb2xsb3dzOgotICoJUjogICBnbG9iYWwgb3IgbG9jYWwgcmVnaXN0ZXIgb25seQotICoJUlM6ICBnbG9iYWwsIGxvY2FsLCBvciAoaWYgdGFyZ2V0IGFsbG93cykgc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlciBvbmx5Ci0gKglSTDogIGdsb2JhbCBvciBsb2NhbCByZWdpc3Rlciwgb3IgaW50ZWdlciBsaXRlcmFsCi0gKglSU0w6IGdsb2JhbCwgbG9jYWwsIG9yIChpZiB0YXJnZXQgYWxsb3dzKSBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyOwotICoJCW9yIGludGVnZXIgbGl0ZXJhbAotICoJRjogICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3RlcgotICoJRkw6ICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3Rlcjsgb3IgbGl0ZXJhbCAoaW5jbHVkaW5nCi0gKgkJZmxvYXRpbmcgcG9pbnQpCi0gKgotICogQSBudW1iZXIgYXBwZW5kZWQgdG8gYSBuYW1lIGluZGljYXRlcyB0aGF0IHJlZ2lzdGVycyBtdXN0IGJlIGFsaWduZWQsCi0gKiBhcyBmb2xsb3dzOgotICoJMjogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgMgotICoJNDogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgNAotICovCi0KLSNkZWZpbmUgU0ZSCTB4MTAJCS8qIE1hc2sgZm9yIHRoZSAic2ZyLU9LIiBiaXQgKi8KLSNkZWZpbmUgTElUCTB4MDgJCS8qIE1hc2sgZm9yIHRoZSAibGl0ZXJhbC1PSyIgYml0ICovCi0jZGVmaW5lIEZQCTB4MDQJCS8qIE1hc2sgZm9yICJmbG9hdGluZy1wb2ludC1PSyIgYml0ICovCi0KLS8qIFRoaXMgbWFjcm8gb3JzIHRoZSBiaXRzIHRvZ2V0aGVyLiAgTm90ZSB0aGF0ICdhbGlnbicgaXMgYSBtYXNrCi0gKiBmb3IgdGhlIGxvdyAwLCAxLCBvciAyIGJpdHMgb2YgdGhlIHJlZ2lzdGVyIG51bWJlciwgYXMgYXBwcm9wcmlhdGUuCi0gKi8KLSNkZWZpbmUgT1AoYWxpZ24sbGl0LGZwLHNmcikJKCBhbGlnbiB8IGxpdCB8IGZwIHwgc2ZyICkKLQotI2RlZmluZSBSCU9QKCAwLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSUwlPUCggMCwgMCwgICAwLCAgU0ZSICkKLSNkZWZpbmUgUkwJT1AoIDAsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIFJTTAlPUCggMCwgTElULCAwLCAgU0ZSICkKLSNkZWZpbmUgRglPUCggMCwgMCwgICBGUCwgMCAgICkKLSNkZWZpbmUgRkwJT1AoIDAsIExJVCwgRlAsIDAgICApCi0jZGVmaW5lIFIyCU9QKCAxLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSTDIJT1AoIDEsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIEYyCU9QKCAxLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTDIJT1AoIDEsIExJVCwgRlAsIDAgICApCi0jZGVmaW5lIFI0CU9QKCAzLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSTDQJT1AoIDMsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIEY0CU9QKCAzLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTDQJT1AoIDMsIExJVCwgRlAsIDAgICApCi0KLSNkZWZpbmUgTQkweDdmCS8qIE1lbW9yeSBvcGVyYW5kIChNRU1BICYgTUVNQiBmb3JtYXQgaW5zdHJ1Y3Rpb25zKSAqLwotCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvIGZyb20gdGhlIHJlZ2lzdGVyIG9wZXJhbmQgZGVzY3JpcHRvciBieXRlICdvZCcuCi0gKi8KLSNkZWZpbmUgU0ZSX09LKG9kKQkob2QgJiBTRlIpCS8qIFRSVUUgaWYgc2ZyIG9wZXJhbmQgYWxsb3dlZCAqLwotI2RlZmluZSBMSVRfT0sob2QpCShvZCAmIExJVCkJLyogVFJVRSBpZiBsaXRlcmFsIG9wZXJhbmQgYWxsb3dlZCAqLwotI2RlZmluZSBGUF9PSyhvZCkJKG9kICYgRlApCS8qIFRSVUUgaWYgZmxvYXRpbmctcG9pbnQgb3AgYWxsb3dlZCAqLwotI2RlZmluZSBSRUdfQUxJR04ob2QsbikJKChvZCAmIDB4MyAmIG4pID09IDApCi0JCQkJCS8qIFRSVUUgaWYgcmVnICNuIGlzIHByb3Blcmx5IGFsaWduZWQgKi8KLSNkZWZpbmUgTUVNT1Aob2QpCShvZCA9PSBNKQkvKiBUUlVFIGlmIG9wZXJhbmQgaXMgYSBtZW1vcnkgb3BlcmFuZCovCi0KLS8qIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGk4MDk2MCBpbnN0cnVjdGlvbiAqLwotc3RydWN0IGk5NjBfb3Bjb2RlIHsKLQlsb25nIG9wY29kZTsJLyogMzIgYml0cywgY29uc3RhbnQgZmllbGRzIGZpbGxlZCBpbiwgcmVzdCB6ZXJvZWQgKi8KLQljaGFyICpuYW1lOwkvKiBBc3NlbWJsZXIgbW5lbW9uaWMJCQkJICAgKi8KLQlzaG9ydCBpY2xhc3M7CS8qIENsYXNzOiBzZWUgI2RlZmluZXMgYmVsb3cJCQkgICAqLwotCWNoYXIgZm9ybWF0OwkvKiBSRUcsIENPQlIsIENUUkwsIE1FTW4sIENPSiwgRkJSQSwgb3IgQ0FMTEoJICAgKi8KLQljaGFyIG51bV9vcHM7CS8qIE51bWJlciBvZiBvcGVyYW5kcwkJCQkgICAqLwotCWNoYXIgb3BlcmFuZFszXTsvKiBPcGVyYW5kIGRlc2NyaXB0b3JzOyBzYW1lIG9yZGVyIGFzIGFzc2VtYmxlciBpbnN0ciAqLwotfTsKLQotLyogQ2xhc3NlcyBvZiA5NjAgaW50cnVjdGlvbnM6Ci0gKgktIGVhY2ggaW5zdHJ1Y3Rpb24gZmFsbHMgaW50byBvbmUgY2xhc3MuCi0gKgktIGVhY2ggdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBvbmUgb3IgbW9yZSBjbGFzc2VzLgotICoKLSAqIEVBQ0ggQ09OU1RBTlQgTVVTVCBDT05UQUlOIDEgQU5EIE9OTFkgMSBTRVQgQklUITogIHNlZSB0YXJnX2hhc19pY2xhc3MoKS4KLSAqLwotI2RlZmluZSBJX0JBU0UJMHgwMQkvKiA4MDk2MCBiYXNlIGluc3RydWN0aW9uIHNldAkqLwotI2RlZmluZSBJX0NYCTB4MDIJLyogODA5NjBDeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9ERUMJMHgwNAkvKiBEZWNpbWFsIGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0ZQCTB4MDgJLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgSV9LWAkweDEwCS8qIDgwOTYwS3ggaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfTUlMCTB4MjAJLyogTWlsaXRhcnkgaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfQ0FTSU0JMHg0MAkvKiBDQSBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgSV9DWDIJMHg4MAkvKiBDeC9KeC9IeCBpbnN0cnVjdGlvbnMJKi8KLSNkZWZpbmUgSV9KWAkweDEwMAkvKiBKeC9IeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9IWAkweDIwMAkvKiBIeCBpbnN0cnVjdGlvbnMJCSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgkJVEFCTEUgT0YgaTk2MCBJTlNUUlVDVElPTiBERVNDUklQVElPTlMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBzdHJ1Y3QgaTk2MF9vcGNvZGUgaTk2MF9vcGNvZGVzW10gPSB7Ci0KLQkvKiBpZiBhIENUUkwgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wZXJhbmQsIGl0J3MgYWx3YXlzIGEgZGlzcGxhY2VtZW50ICovCi0KLQkvKiBjYWxsaiBkZWZhdWx0PT0nY2FsbCcgKi8KLQl7IDB4MDkwMDAwMDAsCSJjYWxsaiIsCUlfQkFTRSwJQ0FMTEosIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgwODAwMDAwMCwJImIiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MDkwMDAwMDAsCSJjYWxsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDBhMDAwMDAwLAkicmV0IiwJCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDBiMDAwMDAwLAkiYmFsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEwMDAwMDAwLAkiYm5vIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYmYgc2FtZSBhcyBibm8gKi8KLQl7IDB4MTAwMDAwMDAsCSJiZiIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJydSBzYW1lIGFzIGJubyAqLwotCXsgMHgxMDAwMDAwMCwJImJydSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxMTAwMDAwMCwJImJnIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJnIHNhbWUgYXMgYmcgKi8KLQl7IDB4MTEwMDAwMDAsCSJicmciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTIwMDAwMDAsCSJiZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJyZSBzYW1lIGFzIGJlICovCi0JeyAweDEyMDAwMDAwLAkiYnJlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEzMDAwMDAwLAkiYmdlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJnZSBzYW1lIGFzIGJnZSAqLwotCXsgMHgxMzAwMDAwMCwJImJyZ2UiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTQwMDAwMDAsCSJibCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJybCBzYW1lIGFzIGJsICovCi0JeyAweDE0MDAwMDAwLAkiYnJsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE1MDAwMDAwLAkiYm5lIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJsZyBzYW1lIGFzIGJuZSAqLwotCXsgMHgxNTAwMDAwMCwJImJybGciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTYwMDAwMDAsCSJibGUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmxlIHNhbWUgYXMgYmxlICovCi0JeyAweDE2MDAwMDAwLAkiYnJsZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNzAwMDAwMCwJImJvIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnQgc2FtZSBhcyBibyAqLwotCXsgMHgxNzAwMDAwMCwJImJ0IiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJvIHNhbWUgYXMgYm8gKi8KLQl7IDB4MTcwMDAwMDAsCSJicm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTgwMDAwMDAsCSJmYXVsdG5vIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQkvKiBmYXVsdGYgc2FtZSBhcyBmYXVsdG5vICovCi0JeyAweDE4MDAwMDAwLAkiZmF1bHRmIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTkwMDAwMDAsCSJmYXVsdGciLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxYTAwMDAwMCwJImZhdWx0ZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFiMDAwMDAwLAkiZmF1bHRnZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFjMDAwMDAwLAkiZmF1bHRsIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWQwMDAwMDAsCSJmYXVsdG5lIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWUwMDAwMDAsCSJmYXVsdGxlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWYwMDAwMDAsCSJmYXVsdG8iLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCS8qIGZhdWx0dCBzeW4gZm9yIGZhdWx0byAqLwotCXsgMHgxZjAwMDAwMCwJImZhdWx0dCIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0KLQl7IDB4MDEwMDAwMDAsCSJzeXNjYWxsIiwJSV9DQVNJTSxDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQotCS8qIElmIGEgQ09CUiAob3IgQ09KKSBoYXMgMyBvcGVyYW5kcywgdGhlIGxhc3Qgb25lIGlzIGFsd2F5cyBhCi0JICogZGlzcGxhY2VtZW50IGFuZCBkb2VzIG5vdCBhcHBlYXIgZXhwbGljaXRseSBpbiB0aGUgdGFibGUuCi0JICovCi0KLQl7IDB4MjAwMDAwMDAsCSJ0ZXN0bm8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIxMDAwMDAwLAkidGVzdGciLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIyMDAwMDAwLAkidGVzdGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIzMDAwMDAwLAkidGVzdGdlIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNDAwMDAwMCwJInRlc3RsIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNTAwMDAwMCwJInRlc3RuZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjYwMDAwMDAsCSJ0ZXN0bGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI3MDAwMDAwLAkidGVzdG8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDMwMDAwMDAwLAkiYmJjIiwJCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMTAwMDAwMCwJImNtcG9iZyIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMjAwMDAwMCwJImNtcG9iZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMzAwMDAwMCwJImNtcG9iZ2UiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzQwMDAwMDAsCSJjbXBvYmwiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzUwMDAwMDAsCSJjbXBvYm5lIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM2MDAwMDAwLAkiY21wb2JsZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNzAwMDAwMCwJImJicyIsCQlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzgwMDAwMDAsCSJjbXBpYm5vIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM5MDAwMDAwLAkiY21waWJnIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNhMDAwMDAwLAkiY21waWJlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNiMDAwMDAwLAkiY21waWJnZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYzAwMDAwMCwJImNtcGlibCIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZDAwMDAwMCwJImNtcGlibmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2UwMDAwMDAsCSJjbXBpYmxlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNmMDAwMDAwLAkiY21waWJvIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMxMDAwMDAwLAkiY21wb2pnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzIwMDAwMDAsCSJjbXBvamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMzAwMDAwMCwJImNtcG9qZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNDAwMDAwMCwJImNtcG9qbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM1MDAwMDAwLAkiY21wb2puZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM2MDAwMDAwLAkiY21wb2psZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM4MDAwMDAwLAkiY21waWpubyIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM5MDAwMDAwLAkiY21waWpnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2EwMDAwMDAsCSJjbXBpamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYjAwMDAwMCwJImNtcGlqZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYzAwMDAwMCwJImNtcGlqbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNkMDAwMDAwLAkiY21waWpuZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNlMDAwMDAwLAkiY21waWpsZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNmMDAwMDAwLAkiY21waWpvIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQotCXsgMHg4MDAwMDAwMCwJImxkb2IiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDgyMDAwMDAwLAkic3RvYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4ODQwMDAwMDAsCSJieCIsCQlJX0JBU0UsCU1FTTEsCTEsIHsgTSwgIDAsICAwIH0gfSwKLQl7IDB4ODUwMDAwMDAsCSJiYWx4IiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg4NjAwMDAwMCwJImNhbGx4IiwJSV9CQVNFLAlNRU0xLAkxLCB7IE0sICAwLCAgMCB9IH0sCi0JeyAweDg4MDAwMDAwLAkibGRvcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OGEwMDAwMDAsCSJzdG9zIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHg4YzAwMDAwMCwJImxkYSIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OTAwMDAwMDAsCSJsZCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OTIwMDAwMDAsCSJzdCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4OTgwMDAwMDAsCSJsZGwiLAkJSV9CQVNFLAlNRU04LAkyLCB7IE0sICBSMiwgMCB9IH0sCi0JeyAweDlhMDAwMDAwLAkic3RsIiwJCUlfQkFTRSwJTUVNOCwJMiwgeyBSMiwgTSwgIDAgfSB9LAotCXsgMHhhMDAwMDAwMCwJImxkdCIsCQlJX0JBU0UsCU1FTTEyLAkyLCB7IE0sICBSNCwgMCB9IH0sCi0JeyAweGEyMDAwMDAwLAkic3R0IiwJCUlfQkFTRSwJTUVNMTIsCTIsIHsgUjQsIE0sICAwIH0gfSwKLQl7IDB4YjAwMDAwMDAsCSJsZHEiLAkJSV9CQVNFLAlNRU0xNiwJMiwgeyBNLCAgUjQsIDAgfSB9LAotCXsgMHhiMjAwMDAwMCwJInN0cSIsCQlJX0JBU0UsCU1FTTE2LAkyLCB7IFI0LCBNLCAgMCB9IH0sCi0JeyAweGMwMDAwMDAwLAkibGRpYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4YzIwMDAwMDAsCSJzdGliIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHhjODAwMDAwMCwJImxkaXMiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweGNhMDAwMDAwLAkic3RpcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQotCXsgUl8zKDB4NTgwKSwJIm5vdGJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTgxKSwJImFuZCIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MiksCSJhbmRub3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MyksCSJzZXRiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NCksCSJub3RhbmQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NiksCSJ4b3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODcpLAkib3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODgpLAkibm9yIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg5KSwJInhub3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NThhKSwJIm5vdCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8zKDB4NThiKSwJIm9ybm90IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGMpLAkiY2xyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGQpLAkibm90b3IiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4ZSksCSJuYW5kIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NThmKSwJImFsdGVyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTApLAkiYWRkbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MSksCSJhZGRpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTkyKSwJInN1Ym8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTMpLAkic3ViaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5OCksCSJzaHJvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTlhKSwJInNocmRpIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWIpLAkic2hyaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5YyksCSJzaGxvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTlkKSwJInJvdGF0ZSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTllKSwJInNobGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzIoMHg1YTApLAkiY21wbyIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMSksCSJjbXBpIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWEyKSwJImNvbmNtcG8iLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMyksCSJjb25jbXBpIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzMoMHg1YTQpLAkiY21waW5jbyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWE1KSwJImNtcGluY2kiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDVhNiksCSJjbXBkZWNvIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1YTcpLAkiY21wZGVjaSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yKDB4NWFjKSwJInNjYW5ieXRlIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1YWUpLAkiY2hrYml0IiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzMoMHg1YjApLAkiYWRkYyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDViMiksCSJzdWJjIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yRCgweDVjYyksCSJtb3YiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQl7IFJfMkQoMHg1ZGMpLAkibW92bCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSTDIsUjIsIDAgfSB9LAotCXsgUl8yRCgweDVlYyksCSJtb3Z0IiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJMNCxSNCwgMCB9IH0sCi0JeyBSXzJEKDB4NWZjKSwJIm1vdnEiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUkw0LFI0LCAwIH0gfSwKLQl7IFJfMygweDYxMCksCSJhdG1vZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTLCBSU0wsUiB9IH0sCi0JeyBSXzMoMHg2MTIpLAkiYXRhZGQiLAlJX0JBU0UsCVJFRywJMywgeyBSUywgUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NDApLAkic3BhbmJpdCIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzJEKDB4NjQxKSwJInNjYW5iaXQiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8zKDB4NjQ1KSwJIm1vZGFjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2NTApLAkibW9kaWZ5IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMygweDY1MSksCSJleHRyYWN0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMygweDY1NCksCSJtb2R0YyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjU1KSwJIm1vZHBjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMSgweDY2MCksCSJjYWxscyIsCUlfQkFTRSwJUkVHLAkxLCB7IFJTTCwgMCwgMCB9IH0sCi0JeyBSXzAoMHg2NmIpLAkibWFyayIsCQlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMCgweDY2YyksCSJmbWFyayIsCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjZkKSwJImZsdXNocmVnIiwJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NmYpLAkic3luY2YiLAlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMygweDY3MCksCSJlbXVsIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUjIgfSB9LAotCXsgUl8zKDB4NjcxKSwJImVkaXYiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJMMixSUyB9IH0sCi0JeyBSXzJEKDB4NjcyKSwJImN2dGFkciIsCUlfQ0FTSU0sUkVHLCAJMiwgeyBSTCwgUjIsIDAgfSB9LAotCXsgUl8zKDB4NzAxKSwJIm11bG8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3MDgpLAkicmVtbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDcwYiksCSJkaXZvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzQxKSwJIm11bGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NDgpLAkicmVtaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc0OSksCSJtb2RpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzRiKSwJImRpdmkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQkvKiBGbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotCXsgUl8yRCgweDY3NCksCSJjdnRpciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4Njc1KSwJImN2dGlsciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCi0JeyBSXzMoMHg2NzYpLAkic2NhbGVybCIsCUlfRlAsCVJFRywJMywgeyBSTCwgRkwyLEYyIH0gfSwKLQl7IFJfMygweDY3NyksCSJzY2FsZXIiLAlJX0ZQLAlSRUcsCTMsIHsgUkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDY4MCksCSJhdGFuciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgxKSwJImxvZ2VwciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgyKSwJImxvZ3IiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODMpLAkicmVtciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMigweDY4NCksCSJjbXBvciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRkwsIDAgfSB9LAotCXsgUl8yKDB4Njg1KSwJImNtcHIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGTCwgMCB9IH0sCi0JeyBSXzJEKDB4Njg4KSwJInNxcnRyIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2ODkpLAkiZXhwciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YSksCSJsb2dibnIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YiksCSJyb3VuZHIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YyksCSJzaW5yIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhkKSwJImNvc3IiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGUpLAkidGFuciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8xKDB4NjhmKSwJImNsYXNzciIsCUlfRlAsCVJFRywJMSwgeyBGTCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2OTApLAkiYXRhbnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NjkxKSwJImxvZ2VwcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTIpLAkibG9ncmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTMpLAkicmVtcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzIoMHg2OTQpLAkiY21wb3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAotCXsgUl8yKDB4Njk1KSwJImNtcHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAotCXsgUl8yRCgweDY5OCksCSJzcXJ0cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OTkpLAkiZXhwcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWEpLAkibG9nYm5ybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5YiksCSJyb3VuZHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjljKSwJInNpbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjlkKSwJImNvc3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjllKSwJInRhbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzEoMHg2OWYpLAkiY2xhc3NybCIsCUlfRlAsCVJFRywJMSwgeyBGTDIsIDAsIDAgfSB9LAotCXsgUl8yRCgweDZjMCksCSJjdnRyaSIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NmMxKSwJImN2dHJpbCIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUjIsIDAgfSB9LAotCXsgUl8yRCgweDZjMiksCSJjdnR6cmkiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIsIDAgfSB9LAotCXsgUl8yRCgweDZjMyksCSJjdnR6cmlsIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSMiwgMCB9IH0sCi0JeyBSXzJEKDB4NmM5KSwJIm1vdnIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2ZDkpLAkibW92cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2ZTEpLAkibW92cmUiLAlJX0ZQLAlSRUcsCTIsIHsgRkw0LEY0LCAwIH0gfSwKLQl7IFJfMygweDZlMiksCSJjcHlzcmUiLAlJX0ZQLAlSRUcsCTMsIHsgRkw0LEZMNCxGNCB9IH0sCi0JeyBSXzMoMHg2ZTMpLAkiY3B5cnNyZSIsCUlfRlAsCVJFRywJMywgeyBGTDQsRkw0LEY0IH0gfSwKLQl7IFJfMygweDc4YiksCSJkaXZyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzhjKSwJIm11bHIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OGQpLAkic3ViciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDc4ZiksCSJhZGRyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzliKSwJImRpdnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzljKSwJIm11bHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzlkKSwJInN1YnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzlmKSwJImFkZHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCi0JLyogVGhlc2UgYXJlIHRoZSBmbG9hdGluZyBwb2ludCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgRWFjaCBhY3R1YWxseQotCSAqIGdlbmVyYXRlcyAyIGJyYW5jaCBpbnN0cnVjdGlvbnM6ICB0aGUgZmlyc3QgYSBDVFJMIGluc3RydWN0aW9uIHdpdGgKLQkgKiB0aGUgaW5kaWNhdGVkIG9wY29kZSwgYW5kIHRoZSBzZWNvbmQgYSAnYm5vJy4KLQkgKi8KLQotCXsgMHgxMjAwMDAwMCwJImJydWUiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDExMDAwMDAwLAkiYnJ1ZyIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTMwMDAwMDAsCSJicnVnZSIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxNDAwMDAwMCwJImJydWwiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDE2MDAwMDAwLAkiYnJ1bGUiLAlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTUwMDAwMDAsCSJicnVsZyIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCi0KLQkvKiBEZWNpbWFsIGluc3RydWN0aW9ucyAqLwotCi0JeyBSXzMoMHg2NDIpLAkiZGFkZGMiLAlJX0RFQywJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjQzKSwJImRzdWJjIiwJSV9ERUMsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NDQpLAkiZG1vdnQiLAlJX0RFQywJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0KLQotCS8qIEtYIGV4dGVuc2lvbnMgKi8KLQotCXsgUl8yKDB4NjAwKSwJInN5bm1vdiIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzIoMHg2MDEpLAkic3lubW92bCIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzIoMHg2MDIpLAkic3lubW92cSIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjE1KSwJInN5bmxkIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQotCi0JLyogTUMgZXh0ZW5zaW9ucyAqLwotCi0JeyBSXzMoMHg2MDMpLAkiY21wc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMygweDYwNCksCSJtb3Zxc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMygweDYwNSksCSJtb3ZzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAotCXsgUl8yRCgweDYxMyksCSJpbnNwYWNjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjE0KSwJImxkcGh5IiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzMoMHg2MTcpLAkiZmlsbCIsCQlJX01JTCwJUkVHLAkzLCB7IFIsICBSTCwgUkwgfSB9LAotCXsgUl8yRCgweDY0NiksCSJjb25kcmVjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjU2KSwJInJlY2VpdmUiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMygweDY2MiksCSJzZW5kIiwJCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFJMLCBSIH0gfSwKLQl7IFJfMSgweDY2MyksCSJzZW5kc2VydiIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjQpLAkicmVzdW1wcmNzIiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2NSksCSJzY2hlZHByY3MiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjY2KSwJInNhdmVwcmNzIiwJSV9NSUwsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2OCksCSJjb25kd2FpdCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjkpLAkid2FpdCIsCQlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjZhKSwJInNpZ25hbCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzFEKDB4NjczKSwJImxkdGltZSIsCUlfTUlMLAlSRUcsCTEsIHsgUjIsIDAsIDAgfQl9LAotCi0KLQkvKiBDWCBleHRlbnNpb25zICovCi0KLQl7IFJfMygweDVkOCksCSJlc2hybyIsCUlfQ1gyLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2MzApLAkic2RtYSIsCQlJX0NYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0JeyBSXzMoMHg2MzEpLAkidWRtYSIsCQlJX0NYLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2NTkpLAkic3lzY3RsIiwJSV9DWDIsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKLQotCi0JLyogSnggZXh0ZW5zaW9ucy4gICovCi0JeyBSXzMoMHg3ODApLAkiYWRkb25vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkwKSwJImFkZG9nIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EwKSwJImFkZG9lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IwKSwJImFkZG9nZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMCksCSJhZGRvbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMCksCSJhZGRvbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTApLAkiYWRkb2xlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YwKSwJImFkZG9vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzgxKSwJImFkZGlubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5MSksCSJhZGRpZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhMSksCSJhZGRpZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiMSksCSJhZGRpZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzEpLAkiYWRkaWwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDEpLAkiYWRkaW5lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2UxKSwJImFkZGlsZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmMSksCSJhZGRpbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCXsgUl8yRCgweDVhZCksCSJic3dhcCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKLQotCXsgUl8yKDB4NTk0KSwJImNtcG9iIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk1KSwJImNtcGliIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk2KSwJImNtcG9zIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk3KSwJImNtcGlzIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCi0JeyBSXzMoMHg3ODQpLAkic2Vsbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTQpLAkic2VsZyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTQpLAkic2VsZSIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjQpLAkic2VsZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzQpLAkic2VsbCIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDQpLAkic2VsbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTQpLAkic2VsbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjQpLAkic2VsbyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQl7IFJfMygweDc4MiksCSJzdWJvbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTIpLAkic3Vib2ciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTIpLAkic3Vib2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjIpLAkic3Vib2dlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MyKSwJInN1Ym9sIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QyKSwJInN1Ym9uZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMiksCSJzdWJvbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjIpLAkic3Vib28iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ODMpLAkic3ViaW5vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkzKSwJInN1YmlnIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EzKSwJInN1YmllIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IzKSwJInN1YmlnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMyksCSJzdWJpbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMyksCSJzdWJpbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTMpLAkic3ViaWxlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YzKSwJInN1YmlvIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCi0JeyBSXzMoMHg2NWMpLAkiZGNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0JeyBSXzMoMHg2NWIpLAkiaWNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NjU4KSwJImludGN0bCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKLQl7IFJfMCgweDViNCksCSJpbnRkaXMiLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCi0JeyBSXzAoMHg1YjUpLAkiaW50ZW4iLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCi0JeyBSXzAoMHg2NWQpLAkiaGFsdCIsCQlJX0pYLAlSRUcsCTEsIHsgUlNMLCAgMCwgMCB9IH0sCi0KLQkvKiBIeCBleHRlbnNpb25zLiAgKi8KLQl7IDB4YWMwMDAwMDAsCSJkY2ludmEiLAlJX0hYLAlNRU0xLAkxLCB7ICAgTSwgIDAsIDAgfSB9LAotCi0JLyogRU5EIE9GIFRBQkxFICovCi0KLQl7IDAsCQlOVUxMLAkJMCwJMCwJMCwgeyAwLCAwLCAwIH0JfQotfTsKLQotIC8qIGVuZCBvZiBpOTYwLW9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tNjhrLmggYi9pbmNsdWRlL29wY29kZS9tNjhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDhiNzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBoZWFkZXIgZm9yIG02ODBbMDEyMzRdMC9tNjg4OFsxMl0vbTY4ODUxLgotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZXNlIGFyZSB1c2VkIGFzIGJpdCBmbGFncyBmb3IgdGhlIGFyY2ggZmllbGQgaW4gdGhlIG02OGtfb3Bjb2RlCi0gICBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZQlfbTY4a191bmRlZiAgMAotI2RlZmluZQltNjgwMDAgIDB4MDAxCi0jZGVmaW5lCW02ODAwOCAgbTY4MDAwIC8qIHN5bm9ueW0gZm9yIC1tNjgwMDAuICBvdGhlcndpc2UgdW51c2VkLiAqLwotI2RlZmluZQltNjgwMTAgIDB4MDAyCi0jZGVmaW5lCW02ODAyMCAgMHgwMDQKLSNkZWZpbmUJbTY4MDMwICAweDAwOAotI2RlZmluZSBtNjhlYzAzMCBtNjgwMzAgLyogc2ltaWxhciBlbm91Z2ggdG8gLW02ODAzMCB0byBpZ25vcmUgZGlmZmVyZW5jZXM7Ci0JCQkgICBnYXMgd2lsbCBkZWFsIHdpdGggdGhlIGZldyBkaWZmZXJlbmNlcy4gICovCi0jZGVmaW5lCW02ODA0MCAgMHgwMTAKLS8qIHRoZXJlIGlzIG5vIDY4MDUwICovCi0jZGVmaW5lIG02ODA2MCAgMHgwMjAKLSNkZWZpbmUJbTY4ODgxICAweDA0MAotI2RlZmluZQltNjg4ODIgIG02ODg4MSAvKiBzeW5vbnltIGZvciAtbTY4ODgxLiAgb3RoZXJ3aXNlIHVudXNlZC4gKi8KLSNkZWZpbmUJbTY4ODUxICAweDA4MAotI2RlZmluZSBjcHUzMgkweDEwMAkvKiBlLmcuLCA2ODMzMiAqLwotI2RlZmluZSBtY2Y1MjAwIDB4MjAwCi0jZGVmaW5lIG1jZjUyMDZlIDB4NDAwCi0jZGVmaW5lIG1jZjUzMDcgMHg4MDAKLQotIC8qIGhhbmR5IGFsaWFzZXMgKi8KLSNkZWZpbmUJbTY4MDQwdXAgIChtNjgwNDAgfCBtNjgwNjApCi0jZGVmaW5lCW02ODAzMHVwICAobTY4MDMwIHwgbTY4MDQwdXApCi0jZGVmaW5lCW02ODAyMHVwICAobTY4MDIwIHwgbTY4MDMwdXApCi0jZGVmaW5lCW02ODAxMHVwICAobTY4MDEwIHwgY3B1MzIgfCBtNjgwMjB1cCkKLSNkZWZpbmUJbTY4MDAwdXAgIChtNjgwMDAgfCBtNjgwMTB1cCkKLSNkZWZpbmUgbWNmICAgICAgIChtY2Y1MjAwIHwgbWNmNTIwNmUgfCBtY2Y1MzA3KQotCi0jZGVmaW5lCW1mbG9hdCAgKG02ODg4MSB8IG02ODg4MiB8IG02ODA0MCB8IG02ODA2MCkKLSNkZWZpbmUJbW1tdSAgICAobTY4ODUxIHwgbTY4MDMwIHwgbTY4MDQwIHwgbTY4MDYwKQotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IgYW4gb3Bjb2RlLiAgKi8KLQotc3RydWN0IG02OGtfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIC8qIFRoZSBtYXNrIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7Ci0gIC8qIFRoZSBhcmd1bWVudHMuICAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGUgYXJjaGl0ZWN0dXJlcyB3aGljaCBzdXBwb3J0IHRoaXMgb3Bjb2RlLiAgKi8KLSAgdW5zaWduZWQgaW50IGFyY2g7Ci19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IgYW4gb3Bjb2RlIGFsaWFzLiAgKi8KLQotc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzCi17Ci0gIC8qIFRoZSBhbGlhcyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqYWxpYXM7Ci0gIC8qIFRoZSBpbnN0cnVjdGlvbiBmb3Igd2hpY2ggdGhpcyBpcyBhbiBhbGlhcy4gICovCi0gIGNvbnN0IGNoYXIgKnByaW1hcnk7Ci19OwotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMgYmVjYXVzZSB0aGF0IGlzIHRoZQotICAgbW9zdCBhbnkgb2YgdGhlbSBuZWVkLiAgVGhlIGFjdHVhbCBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gaXMKLSAgIGFsd2F5cyBhdCBsZWFzdCAyIGJ5dGVzLCBhbmQgaXMgYXMgbXVjaCBsb25nZXIgYXMgbmVjZXNzYXJ5IHRvIGhvbGQKLSAgIHRoZSBvcGVyYW5kcyBpdCBoYXMuCi0KLSAgIFRoZSBtYXRjaCBmaWVsZCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBwYXJ0aWN1bGFyCi0gICBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoYXQKLSAgIG9wY29kZS4KLQotICAgVGhlIGFyZ3MgZmllbGQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0d28gY2hhcmFjdGVycyBmb3IgZWFjaAotICAgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgZmlyc3Qgc3BlY2lmaWVzIHRoZSBraW5kIG9mCi0gICBvcGVyYW5kOyB0aGUgc2Vjb25kLCB0aGUgcGxhY2UgaXQgaXMgc3RvcmVkLiAgKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICBDaGFyYWN0ZXJzIHVzZWQ6IEFhQkNjRGRFRmZHSElKa0xsTW1uT29wUXFSclNzVHRVIFZ2V1hZWjAxMjN8Kn4lO0AhJiQ/Lzw+I14rLQotCi0gICBEICBkYXRhIHJlZ2lzdGVyIG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgQSAgYWRkcmVzcyByZWdpc3RlciBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIGEgIGFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICBSICBlaXRoZXIga2luZCBvZiByZWdpc3Rlci4gIFN0b3JlZCBhcyA0IGJpdHMuCi0gICByICBlaXRoZXIga2luZCBvZiByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiAgU3RvcmVkIGFzIDQgYml0cy4KLSAgICAgIEF0IHRoZSBtb21lbnQsIHVzZWQgb25seSBmb3IgY2FzMiBpbnN0cnVjdGlvbi4KLSAgIEYgIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG9ubHkuICAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIE8gIGFuIG9mZnNldCAob3Igd2lkdGgpOiBpbW1lZGlhdGUgZGF0YSAwLTMxIG9yIGRhdGEgcmVnaXN0ZXIuCi0gICAgICBTdG9yZWQgYXMgNiBiaXRzIGluIHNwZWNpYWwgZm9ybWF0IGZvciBCRi4uLiBpbnNucy4KLSAgICsgIGF1dG9pbmNyZW1lbnQgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMgKG51bWJlciBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcikuCi0gICAtICBhdXRvZGVjcmVtZW50IG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzIChudW1iZXIgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXIpLgotICAgUSAgcXVpY2sgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgICAgVGhpcyBtYXRjaGVzIGFuIGltbWVkaWF0ZSBvcGVyYW5kIG9ubHkgd2hlbiB2YWx1ZSBpcyBpbiByYW5nZSAxIC4uIDguCi0gICBNICBtb3ZlcSBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyA4IGJpdHMuCi0gICAgICBUaGlzIG1hdGNoZXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgb25seSB3aGVuIHZhbHVlIGlzIGluIHJhbmdlIC0xMjguLjEyNwotICAgVCAgdHJhcCB2ZWN0b3IgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgNCBiaXRzLgotCi0gICBrICBLLWZhY3RvciBmb3IgZm1vdmUucCBpbnN0cnVjdGlvbi4gICBTdG9yZWQgYXMgYSA3LWJpdCBjb25zdGFudCBvcgotICAgICAgYSB0aHJlZSBiaXQgcmVnaXN0ZXIgb2Zmc2V0LCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUuCi0KLSAgICMgIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGluIHNwZWNpYWwgcGxhY2VzIChiLCB3IG9yIGwpCi0gICAgICB3aGljaCBzYXkgaG93IG1hbnkgYml0cyB0byBzdG9yZS4KLSAgIF4gIGltbWVkaWF0ZSBkYXRhIGZvciBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICAgU3BlY2lhbCBwbGFjZXMKLSAgICAgIGFyZSBvZmZzZXQgYnkgMiBieXRlcyBmcm9tICcjJy4uLgotICAgQiAgcGMtcmVsYXRpdmUgYWRkcmVzcywgY29udmVydGVkIHRvIGFuIG9mZnNldAotICAgICAgdGhhdCBpcyB0cmVhdGVkIGFzIGltbWVkaWF0ZSBkYXRhLgotICAgZCAgZGlzcGxhY2VtZW50IGFuZCByZWdpc3Rlci4gIFN0b3JlcyB0aGUgcmVnaXN0ZXIgYXMgMyBiaXRzCi0gICAgICBhbmQgc3RvcmVzIHRoZSBkaXNwbGFjZW1lbnQgaW4gdGhlIGVudGlyZSBzZWNvbmQgd29yZC4KLQotICAgQyAgdGhlIENDUi4gIE5vIG5lZWQgdG8gc3RvcmUgaXQ7IHRoaXMgaXMganVzdCBmb3IgZmlsdGVyaW5nIHZhbGlkaXR5LgotICAgUyAgdGhlIFNSLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLSAgIFUgIHRoZSBVU1AuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgRSAgdGhlIEFDQy4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0gICBHICB0aGUgTUFDU1IuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgSCAgdGhlIE1BU0suICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotCi0gICBJICBDb3Byb2Nlc3NvciBJRC4gICBOb3QgcHJpbnRlZCBpZiAxLiAgIFRoZSBDb3Byb2Nlc3NvciBJRCBpcyBhbHdheXMKLSAgICAgIGV4dHJhY3RlZCBmcm9tIHRoZSAnZCcgZmllbGQgb2Ygd29yZCBvbmUsIHdoaWNoIG1lYW5zIHRoYXQgYW4gZXh0ZW5kZWQKLSAgICAgIGNvcHJvY2Vzc29yIG9wY29kZSBjYW4gYmUgc2tpcHBlZCB1c2luZyB0aGUgJ2knIHBsYWNlLCBpZiBuZWVkZWQuCi0KLSAgIHMgIFN5c3RlbSBDb250cm9sIHJlZ2lzdGVyIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IuCi0KLSAgIEogIE1pc2MgcmVnaXN0ZXIgZm9yIG1vdmVjIGluc3RydWN0aW9uLCBzdG9yZWQgaW4gJ2onIGZvcm1hdC4KLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMHgwMDAJU0ZDCVNvdXJjZSBGdW5jdGlvbiBDb2RlIHJlZwlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4MDAxCURGQwlEYXRhIEZ1bmN0aW9uIENvZGUgcmVnCQlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4MDAyCUNBQ1IJQ2FjaGUgQ29udHJvbCBSZWdpc3RlcgkJWzYwLCA0MCwgMzAsIDIwXQotCTB4MDAzCVRDCU1NVSBUcmFuc2xhdGlvbiBDb250cm9sCQlbNjAsIDQwXQotCTB4MDA0CUlUVDAJSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMAlbNjAsIDQwXQotCTB4MDA1CUlUVDEJSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMQlbNjAsIDQwXQotCTB4MDA2CURUVDAJRGF0YSBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAwCVs2MCwgNDBdCi0JMHgwMDcJRFRUMQlEYXRhIFRyYW5zcGFyZW50Ci0JCQkJVHJhbnNsYXRpb24gcmVnIDEJWzYwLCA0MF0KLQkweDAwOAlCVVNDUglCdXMgQ29udHJvbCBSZWdpc3RlcgkJWzYwXQotCTB4ODAwCVVTUAlVc2VyIFN0YWNrIFBvaW50ZXIJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHg4MDEJVkJSCVZlY3RvciBCYXNlIHJlZwkJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHg4MDIJQ0FBUglDYWNoZSBBZGRyZXNzIFJlZ2lzdGVyCQlbICAgICAgICAzMCwgMjBdCi0JMHg4MDMJTVNQCU1hc3RlciBTdGFjayBQb2ludGVyCQlbICAgIDQwLCAzMCwgMjBdCi0JMHg4MDQJSVNQCUludGVycnVwdCBTdGFjayBQb2ludGVyCQlbICAgIDQwLCAzMCwgMjBdCi0JMHg4MDUJTU1VU1IJTU1VIFN0YXR1cyByZWcJCQlbICAgIDQwXQotCTB4ODA2CVVSUAlVc2VyIFJvb3QgUG9pbnRlcgkJWzYwLCA0MF0KLQkweDgwNwlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIJCVs2MCwgNDBdCi0JMHg4MDgJUENSCVByb2Nlc3NvciBDb25maWd1cmF0aW9uIHJlZwlbNjBdCi0JMHhDMDAJUk9NQkFSCVJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIJWzUyMFhdCi0JMHhDMDQJUkFNQkFSMAlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0JMHhDMDUJUkFNQkFSMQlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0JMHhDMEYJTUJBUjAJUkFNIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwCVs1MjBYXQotCi0gICAgTCAgUmVnaXN0ZXIgbGlzdCBvZiB0aGUgdHlwZSBkMC1kNy9hMC1hNyBldGMuCi0gICAgICAgKE5ldyEgIEltcHJvdmVkISAgQ2FuIGFsc28gaG9sZCBmcDAtZnA3LCBhcyB3ZWxsISkKLSAgICAgICBUaGUgYXNzZW1ibGVyIHRyaWVzIHRvIHNlZSBpZiB0aGUgcmVnaXN0ZXJzIG1hdGNoIHRoZSBpbnNuIGJ5Ci0gICAgICAgbG9va2luZyBhdCB3aGVyZSB0aGUgaW5zbiB3YW50cyB0aGVtIHN0b3JlZC4KLQotICAgIGwgIFJlZ2lzdGVyIGxpc3QgbGlrZSBMLCBidXQgd2l0aCBhbGwgdGhlIGJpdHMgcmV2ZXJzZWQuCi0gICAgICAgVXNlZCBmb3IgZ29pbmcgdGhlIG90aGVyIHdheS4gLiAuCi0KLSAgICBjICBjYWNoZSBpZGVudGlmaWVyIHdoaWNoIG1heSBiZSAibmMiIGZvciBubyBjYWNoZSwgImljIgotICAgICAgIGZvciBpbnN0cnVjdGlvbiBjYWNoZSwgImRjIiBmb3IgZGF0YSBjYWNoZSwgb3IgImJjIgotICAgICAgIGZvciBib3RoIGNhY2hlcy4gIFVzZWQgaW4gY2ludiBhbmQgY3B1c2guICBBbHdheXMKLSAgICAgICBzdG9yZWQgaW4gcG9zaXRpb24gImQiLgotCi0gICAgdSAgQW55IHJlZ2lzdGVyLCB3aXRoIGBgdXBwZXInJyBvciBgYGxvd2VyJycgc3BlY2lmaWNhdGlvbi4gIFVzZWQKLSAgICAgICBpbiB0aGUgbWFjIGluc3RydWN0aW9ucyB3aXRoIHNpemUgd29yZC4KLQotIFRoZSByZW1haW5kZXIgYXJlIGFsbCBzdG9yZWQgYXMgNiBiaXRzIHVzaW5nIGFuIGFkZHJlc3MgbW9kZSBhbmQgYQotIHJlZ2lzdGVyIG51bWJlcjsgdGhleSBkaWZmZXIgaW4gd2hpY2ggYWRkcmVzc2luZyBtb2RlcyB0aGV5IG1hdGNoLgotCi0gICAqICBhbGwJCQkJCShtb2RlcyAwLTYsNy4wLTQpCi0gICB+ICBhbHRlcmFibGUgbWVtb3J5CQkJCShtb2RlcyAyLTYsNy4wLDcuMSkKLSAgIAkJCQkJCShub3QgMCwxLDcuMi00KQotICAgJSAgYWx0ZXJhYmxlCQkJCQkobW9kZXMgMC02LDcuMCw3LjEpCi0JCQkJCQkobm90IDcuMi00KQotICAgOyAgZGF0YQkJCQkJKG1vZGVzIDAsMi02LDcuMC00KQotCQkJCQkJKG5vdCAxKQotICAgQCAgZGF0YSwgYnV0IG5vdCBpbW1lZGlhdGUJCQkobW9kZXMgMCwyLTYsNy4wLTMpCi0JCQkJCQkobm90IDEsNy40KQotICAgISAgY29udHJvbAkJCQkJKG1vZGVzIDIsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAwLDEsMyw0LDcuNCkKLSAgICYgIGFsdGVyYWJsZSBjb250cm9sCQkJCShtb2RlcyAyLDUsNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAwLDEsNy4yLTQpCi0gICAkICBhbHRlcmFibGUgZGF0YQkJCQkobW9kZXMgMCwyLTYsNy4wLDcuMSkKLQkJCQkJCShub3QgMSw3LjItNCkKLSAgID8gIGFsdGVyYWJsZSBjb250cm9sLCBvciBkYXRhIHJlZ2lzdGVyCShtb2RlcyAwLDIsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDEsMyw0LDcuMi00KQotICAgLyAgY29udHJvbCwgb3IgZGF0YSByZWdpc3RlcgkJCShtb2RlcyAwLDIsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAxLDMsNCw3LjQpCi0gICA+ICAqc2F2ZSBvcGVyYW5kcwkJCQkobW9kZXMgMiw0LDUsNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAwLDEsMyw3LjItNCkKLSAgIDwgICpyZXN0b3JlIG9wZXJhbmRzCQkJCShtb2RlcyAyLDMsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAwLDEsNCw3LjQpCi0KLSAgIGNvbGRmaXJlIG1vdmUgb3BlcmFuZHM6Ci0gICBtICAJCQkJCQkobW9kZXMgMC00KQotICAgbgkJCQkJCShtb2RlcyA1LDcuMikKLSAgIG8JCQkJCQkobW9kZXMgNiw3LjAsNy4xLDcuMyw3LjQpCi0gICBwCQkJCQkJKG1vZGVzIDAtNSkKLQotICAgY29sZGZpcmUgYnNldC9iY2xyL2J0c3QvbXVsc2wvbXVsdWwgb3BlcmFuZHM6Ci0gICBxCQkJCQkJKG1vZGVzIDAsMi01KQotICAgdgkJCQkJCShtb2RlcyAwLDItNSw3LjAsNy4xKQotKi8KLQotLyogRm9yIHRoZSA2ODg1MTogKi8KLS8qCi0gICBJIGRpZG4ndCB1c2UgbXVjaCBpbWFnaW5hdGlvbiBpbiBjaG9vc2luZyB0aGUgCi0gICBmb2xsb3dpbmcgY29kZXMsIHNvIG1hbnkgb2YgdGhlbSBhcmVuJ3QgdmVyeQotICAgbW5lbW9uaWMuIC1yYWIKLQotICAgMCAgMzIgYml0IHBtbXUgcmVnaXN0ZXIKLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMDAwCVRDCVRyYW5zbGF0aW9uIENvbnRyb2wgUmVnaXN0ZXIgKDY4MDMwLCA2ODg1MSkKLQotICAgMSAgMTYgYml0IHBtbXUgcmVnaXN0ZXIKLQkxMTEJQUMJQWNjZXNzIENvbnRyb2wgKDY4ODUxKQotCi0gICAyICA4IGJpdCBwbW11IHJlZ2lzdGVyCi0JMTAwCUNBTAlDdXJyZW50IEFjY2VzcyBMZXZlbCAoNjg4NTEpCi0JMTAxCVZBTAlWYWxpZGF0ZSBBY2Nlc3MgTGV2ZWwgKDY4ODUxKQotCTExMAlTQ0MJU3RhY2sgQ2hhbmdlIENvbnRyb2wgKDY4ODUxKQotCi0gICAzICA2ODAzMC1vbmx5IHBtbXUgcmVnaXN0ZXJzICgzMiBiaXQpCi0JMDEwCVRUMAlUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiByZWcgMAotCQkJKGFrYSBBY2Nlc3MgQ29udHJvbCByZWcgMCAtLSBBQzAgLS0gb24gNjhlYzAzMCkKLQkwMTEJVFQxCVRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIHJlZyAxCi0JCQkoYWthIEFjY2VzcyBDb250cm9sIHJlZyAxIC0tIEFDMSAtLSBvbiA2OGVjMDMwKQotCi0gICBXICB3aWRlIHBtbXUgcmVnaXN0ZXJzCi0JUG9zc2libGUgdmFsdWVzOgotCTAwMQlEUlAJRG1hIFJvb3QgUG9pbnRlciAoNjg4NTEpCi0JMDEwCVNSUAlTdXBlcnZpc29yIFJvb3QgUG9pbnRlciAoNjgwMzAsIDY4ODUxKQotCTAxMQlDUlAJQ3B1IFJvb3QgUG9pbnRlciAoNjgwMzAsIDY4ODUxKQotCi0gICBmCWZ1bmN0aW9uIGNvZGUgcmVnaXN0ZXIgKDY4MDMwLCA2ODg1MSkKLQkwCVNGQwotCTEJREZDCi0KLSAgIFYJVkFMIHJlZ2lzdGVyIG9ubHkgKDY4ODUxKQotCi0gICBYCUJBRHgsIEJBQ3ggKDE2IGJpdCkKLQkxMDAJQkFECUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgRGF0YSAoNjg4NTEpCi0JMTAxCUJBQwlCcmVha3BvaW50IEFja25vd2xlZGdlIENvbnRyb2wgKDY4ODUxKQotCi0gICBZCVBTUiAoNjg4NTEpIChNTVVTUiBvbiA2ODAzMCkgKEFDVVNSIG9uIDY4ZWMwMzApCi0gICBaCVBDU1IgKDY4ODUxKQotCi0gICB8CW1lbW9yeSAJCShtb2RlcyAyLTYsIDcuKikKLQotICAgdCAgYWRkcmVzcyB0ZXN0IGxldmVsICg2ODAzMCBvbmx5KQotICAgICAgU3RvcmVkIGFzIDMgYml0cywgcmFuZ2UgMC03LgotICAgICAgQWxzbyB1c2VkIGZvciBicmVha3BvaW50IGluc3RydWN0aW9uIG5vdy4KLQotKi8KLQotLyogUGxhY2VzIHRvIHB1dCBhbiBvcGVyYW5kLCBmb3Igbm9uLWdlbmVyYWwgb3BlcmFuZHM6Ci0gICBDaGFyYWN0ZXJzIHVzZWQ6IEJiQ2NEZGdoaWprTGxNbU5ub3N0V3cxMjM0NTY3ODkKLQotICAgcyAgc291cmNlLCBsb3cgYml0cyBvZiBmaXJzdCB3b3JkLgotICAgZCAgZGVzdCwgc2hpZnRlZCA5IGluIGZpcnN0IHdvcmQKLSAgIDEgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDEyCi0gICAyICBzZWNvbmQgd29yZCwgc2hpZnRlZCA2Ci0gICAzICBzZWNvbmQgd29yZCwgc2hpZnRlZCAwCi0gICA0ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDEyCi0gICA1ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDYKLSAgIDYgIHRoaXJkIHdvcmQsIHNoaWZ0ZWQgMAotICAgNyAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgNwotICAgOCAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgMTAKLSAgIDkgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDUKLSAgIEQgIHN0b3JlIGluIGJvdGggcGxhY2UgMSBhbmQgcGxhY2UgMzsgZm9yIGRpdnVsIGFuZCBkaXZzbC4KLSAgIEIgIGZpcnN0IHdvcmQsIGxvdyBieXRlLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKLSAgIFcgIHNlY29uZCB3b3JkIChlbnRpcmUpLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKLSAgIEwgIHNlY29uZCBhbmQgdGhpcmQgd29yZHMgKGVudGlyZSksIGZvciBicmFuY2ggZGlzcGxhY2VtZW50cwotICAgICAgKGFsc28gb3ZlcmxvYWRlZCBmb3IgbW92ZTE2KQotICAgYiAgc2Vjb25kIHdvcmQsIGxvdyBieXRlCi0gICB3ICBzZWNvbmQgd29yZCAoZW50aXJlKSBbdmFyaWFibGUgd29yZC9sb25nIGJyYW5jaCBvZmZzZXQgZm9yIGRicmFdCi0gICBXICBzZWNvbmQgd29yZCAoZW50aXJlKSAobXVzdCBiZSBzaWduZWQgMTYgYml0IHZhbHVlKQotICAgbCAgc2Vjb25kIGFuZCB0aGlyZCB3b3JkIChlbnRpcmUpCi0gICBnICB2YXJpYWJsZSBicmFuY2ggb2Zmc2V0IGZvciBicmEgYW5kIHNpbWlsYXIgaW5zdHJ1Y3Rpb25zLgotICAgICAgVGhlIHBsYWNlIHRvIHN0b3JlIGRlcGVuZHMgb24gdGhlIG1hZ25pdHVkZSBvZiBvZmZzZXQuCi0gICB0ICBzdG9yZSBpbiBib3RoIHBsYWNlIDcgYW5kIHBsYWNlIDg7IGZvciBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zCi0gICBjICBicmFuY2ggb2Zmc2V0IGZvciBjcEJjYyBvcGVyYXRpb25zLgotICAgICAgVGhlIHBsYWNlIHRvIHN0b3JlIGlzIHdvcmQgdHdvIGlmIGJpdCBzaXggb2Ygd29yZCBvbmUgaXMgemVybywKLSAgICAgIGFuZCB3b3JkcyB0d28gYW5kIHRocmVlIGlmIGJpdCBzaXggb2Ygd29yZCBvbmUgaXMgb25lLgotICAgaSAgSW5jcmVtZW50IGJ5IHR3bywgdG8gc2tpcCBvdmVyIGNvcHJvY2Vzc29yIGV4dGVuZGVkIG9wZXJhbmRzLiAgIE9ubHkKLSAgICAgIHdvcmtzIHdpdGggdGhlICdJJyBmb3JtYXQuCi0gICBrICBEeW5hbWljIEstZmFjdG9yIGZpZWxkLiAgIEJpdHMgNi00IG9mIHdvcmQgMiwgdXNlZCBhcyBhIHJlZ2lzdGVyIG51bWJlci4KLSAgICAgIEFsc28gdXNlZCBmb3IgZHluYW1pYyBmbW92ZW0gaW5zdHJ1Y3Rpb24uCi0gICBDICBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBjb25zdGFudCAtIDcgYml0cy4gIEFsc28gdXNlZCBmb3Igc3RhdGljCi0gICAgICBLLWZhY3RvcnMuLi4KLSAgIGogIE1vdmVjIHJlZ2lzdGVyICMsIHN0b3JlZCBpbiAxMiBsb3cgYml0cyBvZiBzZWNvbmQgd29yZC4KLSAgIG0gIEZvciBNW1NdQUN4OyA0IGJpdHMgc3BsaXQgd2l0aCBNU0Igc2hpZnRlZCA2IGJpdHMgaW4gZmlyc3Qgd29yZAotICAgICAgYW5kIHJlbWFpbmluZyAzIGJpdHMgb2YgcmVnaXN0ZXIgc2hpZnRlZCA5IGJpdHMgaW4gZmlyc3Qgd29yZC4KLSAgICAgIEluZGljYXRlIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNyBiaXRzIGluIHNlY29uZCB3b3JkLgotICAgICAgVXNlIHdpdGggYFInIG9yIGB1JyBmb3JtYXQuCi0gICBuICBgbScgd2l0aG91dGggdXBwZXIvbG93ZXIgaW5kaWNhdGlvbi4gKEZvciBNW1NdQUN4OyA0IGJpdHMgc3BsaXQKLSAgICAgIHdpdGggTVNCIHNoaWZ0ZWQgNiBiaXRzIGluIGZpcnN0IHdvcmQgYW5kIHJlbWFpbmluZyAzIGJpdHMgb2YKLSAgICAgIHJlZ2lzdGVyIHNoaWZ0ZWQgOSBiaXRzIGluIGZpcnN0IHdvcmQuICBObyB1cHBlci9sb3dlcgotICAgICAgaW5kaWNhdGlvbiBpcyBkb25lLikgIFVzZSB3aXRoIGBSJyBvciBgdScgZm9ybWF0LgotICAgbyAgRm9yIE1bU11BQ3c7IDQgYml0cyBzaGlmdGVkIDEyIGluIHNlY29uZCB3b3JkIChsaWtlIGAxJykuCi0gICAgICBJbmRpY2F0ZSB1cHBlci9sb3dlciBpbiAxIGJpdCBzaGlmdGVkIDcgYml0cyBpbiBzZWNvbmQgd29yZC4KLSAgICAgIFVzZSB3aXRoIGBSJyBvciBgdScgZm9ybWF0LgotICAgTSAgRm9yIE1bU11BQ3c7IDQgYml0cyBpbiBsb3cgYml0cyBvZiBmaXJzdCB3b3JkLiAgSW5kaWNhdGUKLSAgICAgIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNiBiaXRzIGluIHNlY29uZCB3b3JkLiAgVXNlIHdpdGgKLSAgICAgIGBSJyBvciBgdScgZm9ybWF0LgotICAgTiAgRm9yIE1bU11BQ3c7IDQgYml0cyBpbiBsb3cgYml0cyBvZiBzZWNvbmQgd29yZC4gIEluZGljYXRlCi0gICAgICB1cHBlci9sb3dlciBpbiAxIGJpdCBzaGlmdGVkIDYgYml0cyBpbiBzZWNvbmQgd29yZC4gIFVzZSB3aXRoCi0gICAgICBgUicgb3IgYHUnIGZvcm1hdC4KLSAgIGggIHNoaWZ0IGluZGljYXRvciAoc2NhbGUgZmFjdG9yKSwgMSBiaXQgc2hpZnRlZCAxMCBpbiBzZWNvbmQgd29yZAotCi0gUGxhY2VzIHRvIHB1dCBvcGVyYW5kLCBmb3IgZ2VuZXJhbCBvcGVyYW5kczoKLSAgIGQgIGRlc3RpbmF0aW9uLCBzaGlmdGVkIDYgYml0cyBpbiBmaXJzdCB3b3JkCi0gICBiICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIG9uZSBieXRlCi0gICB3ICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIHR3byBieXRlcwotICAgbCAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQsIGFuZCBpbW1lZGlhdGUgdXNlcyBmb3VyIGJ5dGVzCi0gICBzICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZC4KLSAgICAgIFVzZWQgc29tZXRpbWVzIGluIGNvbnRleHRzIHdoZXJlIGltbWVkaWF0ZSBpcyBub3QgYWxsb3dlZCBhbnl3YXkuCi0gICBmICBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyA0IGJ5dGVzCi0gICBGICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyA4IGJ5dGVzCi0gICB4ICBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDEyIGJ5dGVzCi0gICBwICBwYWNrZWQgZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDEyIGJ5dGVzCi0qLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlIG02OGtfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyBtNjhrX29wY29kZV9hbGlhc2VzW107Ci0KLWV4dGVybiBjb25zdCBpbnQgbTY4a19udW1vcGNvZGVzLCBtNjhrX251bWFsaWFzZXM7Ci0KLS8qIGVuZCBvZiBtNjhrLW9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tODhrLmggYi9pbmNsdWRlL29wY29kZS9tODhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2ZhMDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbTg4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBtb3Rvcm9sYSA4OGsgZmFtaWx5LgotICAgQ29weXJpZ2h0IDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICoJCQlEaXNhc3NlbWJsZXIgSW5zdHJ1Y3Rpb24gVGFibGUKLSAqCi0gKglUaGUgZmlyc3QgZmllbGQgb2YgdGhlIHRhYmxlIGlzIHRoZSBvcGNvZGUgZmllbGQuIElmIGFuIG9wY29kZQotICoJaXMgc3BlY2lmaWVkIHdoaWNoIGhhcyBhbnkgbm9uLW9wY29kZSBiaXRzIG9uLCBhIHN5c3RlbSBlcnJvcgotICoJd2lsbCBvY2N1ciB3aGVuIHRoZSBzeXN0ZW0gYXR0ZW1wdHMgdGhlIGluc3RhbGwgaXQgaW50byB0aGUKLSAqCWluc3RydWN0aW9uIHRhYmxlLiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZQotICoJaW5zdHJ1Y3Rpb24gbW5lbW9uaWMuIEVhY2ggb3BlcmFuZCBpcyBzcGVjaWZpZWQgYnkgb2Zmc2V0LCB3aWR0aCwKLSAqCWFuZCB0eXBlLiBUaGUgb2Zmc2V0IGlzIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudAotICoJYml0IG9mIHRoZSBvcGVyYW5kIHdpdGggYml0IDAgYmVpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZgotICoJdGhlIGluc3RydWN0aW9uLiBUaGUgd2lkdGggaXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeQotICoJdGhlIG9wZXJhbmQuIFRoZSB0eXBlIHNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgotICoJdGhlIG9wZXJhbmQuIFRoZSB2YWxpZCBmb3JtYXRzIGFyZTogcmVnaXN0ZXIsIHJlZ2lzdGVyIGluZGlyZWN0LAotICoJaGV4IGNvbnN0YW50LCBhbmQgYml0IGZpZWxkIHNwZWNpZmljYXRpb24uICBUaGUgbGFzdCBmaWVsZCBpcyBhCi0gKglwb2ludGVyIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIGluIHRoZSBsaW5rZWQgbGlzdC4gIFRoZXNlIHBvaW50ZXJzCi0gKglhcmUgaW5pdGlhbGl6ZWQgYnkgaW5pdF9kaXNhc20oKS4KLSAqCi0gKgkJCQlTdHJ1Y3R1cmUgRm9ybWF0Ci0gKgotICogICAgICAgc3RydWN0IElOU1RBQiB7Ci0gKiAgICAgICAgICBVUElOVCBvcGNvZGU7Ci0gKiAgICAgICAgICBjaGFyICptbmVtb25pYzsKLSAqICAgICAgICAgIHN0cnVjdCBPUFNQRUMgb3AxLG9wMixvcDM7Ci0gKiAgICAgICAgICBzdHJ1Y3QgU0lNX0ZMQUdTIGZsZ3M7Ci0gKiAgICAgICAgICBzdHJ1Y3QgSU5TVEFCICpuZXh0OwotICogICAgICAgfQotICoKLSAqICAgICAgIHN0cnVjdCBPUFNQRUMgewotICogICAgICAgICAgVVBJTlQgb2Zmc2V0OjU7Ci0gKiAgICAgICAgICBVUElOVCB3aWR0aDo2OwotICogICAgICAgICAgVVBJTlQgdHlwZTo1OwotICogICAgICAgfQotICoKLSAqCQkJCVJldmlzaW9uIEhpc3RvcnkKLSAqCi0gKglSZXZpc2lvbiAxLjAJMTEvMDgvODUJQ3JlYXRpb24gZGF0ZQotICoJCSAxLjEJMDIvMDUvODYJVXBkYXRlZCBpbnN0cnVjdGlvbiBtbmVtb25pYyB0YWJsZSBNRAotICoJCSAxLjIJMDYvMTYvODYJVXBkYXRlZCBTSU1fRkxBR1MgZm9yIGZsb2F0aW5nIHBvaW50Ci0gKgkJIDEuMwkwOS8yMC84NglVcGRhdGVkIGZvciBuZXcgZW5jb2RpbmcKLSAqCQkgCTA1LzExLzg5CVIuIFRyYXdpY2sgYWRhcHRlZCBmcm9tIE1vdG9yb2xhIGRpc2Fzc2VtYmxlcgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBuZWVkZWQgdG8gYnVpbGQgdGhlIE04ODAwMAotICogc2ltdWxhdG9yLiAgSXQgaXMgdGhlIG1haW4gaW5jbHVkZSBmaWxlLCBjb250YWluaW5nIGFsbCB0aGUKLSAqIHN0cnVjdHVyZXMsIG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgZXhjZXB0IGZvciB0aGUgZmxvYXRpbmcgcG9pbnQKLSAqIGluc3RydWN0aW9uIHNldC4KLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBmbGFnIGluZm9ybXMgdGhlIFNpbXVsYXRvciBhcyB0byB3aGF0IHR5cGUgb2YgYnl0ZSBvcmRlcmluZwotICogd2lsbCBiZSB1c2VkLiBGb3IgaW5zdGFuY2UsIGEgQk9GTEFHID0gMSBpbmRpY2F0ZXMgYSBERUMgVkFYIGFuZCBJQk0gdHlwZQotICogb2Ygb3JkZXJpbmcgc2hhbGwgYmUgdXNlZC4KLSovCi0KLS8qICMgZGVmaW5lICAgICBCT0ZMQUcgICAxICovICAgICAgICAgICAgICAgICAgICAgICAvKiBCWVRFIE9SREVSSU5HIEZMQUcgKi8KLQotLyogZGVmaW5lIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgcHJpbWFyeSBvcGNvZGUgZmllbGQgb2YgdGhlIGluc3RydWN0aW9uLAotICogdGhlIGRlc3RpbmF0aW9uIGZpZWxkLCB0aGUgc291cmNlIDEgYW5kIHNvdXJjZSAyIGZpZWxkcy4KLSAqLwotIyBkZWZpbmUgICAgT1AgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygb3Bjb2RlIGZpZWxkICovCi0jIGRlZmluZSAgICBERVNUICAgICA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBkZXN0aW5hdGlvbiAgKi8KLSMgZGVmaW5lICAgIFNPVVJDRTEgIDYgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHNvdXJjZTEgICAgICAqLwotIyBkZWZpbmUgICAgU09VUkNFMiAgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc291cmNlMiAgICAgICovCi0KLSMgZGVmaW5lICAgIFJFR3MgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzICAqLwotCi0jIGRlZmluZSAgICBXT1JEICAgIGxvbmcKLSMgZGVmaW5lICAgIEZMQUcgICAgdW5zaWduZWQKLSMgZGVmaW5lICAgIFNUQVRFICAgc2hvcnQKLQotIyBkZWZpbmUgICAgVFJVRSAgICAgMQotIyBkZWZpbmUgICAgRkFMU0UgICAgMAotCi0jIGRlZmluZSAgICBSRUFEICAgICAwCi0jIGRlZmluZSAgICBXUklURSAgICAxCi0KLS8qIFRoZSBuZXh0IGZvdXIgZXF1YXRlcyBkZWZpbmUgdGhlIHByaW9yaXRpZXMgdGhhdCB0aGUgdmFyaW91cyBjbGFzc2VzCi0gKiBvZiBpbnN0cnVjdGlvbnMgaGF2ZSByZWdhcmRpbmcgd3JpdGluZyByZXN1bHRzIGJhY2sgaW50byByZWdpc3RlcnMgYW5kCi0gKiBzaWduYWxsaW5nIGV4Y2VwdGlvbnMuCi0gKi8KLS8qIFBNRU0gaXMgYWxzbyBkZWZpbmVkIGluIDxzeXMvcGFyYW0uaD4gb24gRGVsdGEgODgncy4gIFNpZ2ghICAqLwotI3VuZGVmIFBNRU0KLQotIyBkZWZpbmUgICAgUElOVCAgMCAgIC8qIEludGVnZXIgUHJpb3JpdHkgKi8KLSMgZGVmaW5lICAgIFBGTFQgIDEgICAvKiBGbG9hdGluZyBQb2ludCBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgUE1FTSAgMiAgIC8qIE1lbW9yeSBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgTkEgICAgMyAgIC8qIE5vdCBBcHBsaWNhYmxlLCBpbnN0cnVjdGlvbiBkb2VzbnQgd3JpdGUgdG8gcmVncyAqLwotIyBkZWZpbmUgICAgSElQUkkgMyAgIC8qIGhpZ2hlc3Qgb2YgdGhlc2UgcHJpb3JpdGllcyAqLwotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXJzIGFyZSBhbiBhcnRpZmljaWFsIG1lY2hhbmlzbSB0byBzcGVlZCB1cAotICogc2ltdWxhdG9yIGV4ZWN1dGlvbi4gIEluIHRoZSByZWFsIHByb2Nlc3NvciwgYW4gaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIKLSAqIGlzIDMyIGJpdHMgd2lkZS4gIEluIHRoZSBzaW11bGF0b3IsIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gaXMga2VwdCBpbgotICogYSBzdHJ1Y3R1cmUgZmllbGQgY2FsbGVkIHJhd29wLCBhbmQgdGhlIGluc3RydWN0aW9uIGlzIHBhcnRpYWxseSBkZWNvZGVkLAotICogYW5kIHNwbGl0IGludG8gdmFyaW91cyBmaWVsZHMgYW5kIGZsYWdzIHdoaWNoIG1ha2UgdXAgdGhlIG90aGVyIGZpZWxkcwotICogb2YgdGhlIHN0cnVjdHVyZS4KLSAqIFRoZSBwYXJ0aWFsIGRlY29kZSBpcyBkb25lIHdoZW4gdGhlIGluc3RydWN0aW9ucyBhcmUgaW5pdGlhbGx5IGxvYWRlZAotICogaW50byBzaW11bGF0b3IgbWVtb3J5LiAgVGhlIHNpbXVsYXRvciBjb2RlIG1lbW9yeSBpcyBub3QgYW4gYXJyYXkgb2YKLSAqIDMyIGJpdCB3b3JkcywgYnV0IGlzIGFuIGFycmF5IG9mIGluc3RydWN0aW9uIHJlZ2lzdGVyIHN0cnVjdHVyZXMuCi0gKiBZZXMgdGhpcyB3YXN0ZXMgbWVtb3J5LCBidXQgaXQgZXhlY3V0ZXMgbXVjaCBxdWlja2VyLgotICovCi0KLXN0cnVjdCBJUl9GSUVMRFMgewotCQkgICAgdW5zaWduZWQgICAgICAgIG9wOk9QLAotCQkJCSAgICBkZXN0OiBERVNULAotCQkJCSAgICBzcmMxOiBTT1VSQ0UxLAotCQkJCSAgICBzcmMyOiBTT1VSQ0UyOwotCQkJICAgICAgaW50ICAgbHRuY3ksCi0JCQkJICAgIGV4dGltZSwKLQkJCQkgICAgd2JfcHJpOyAgICAgLyogd3JpdGViYWNrIHByaW9yaXR5ICAgICAqLwotCQkgICAgdW5zaWduZWQgICAgICAgIGltbV9mbGFnczoyLC8qIGltbWVkaWF0ZSBzaXplICAgICAgICAgKi8KLQkJCQkgICAgcnMxX3VzZWQ6MSwgLyogcmVnaXN0ZXIgc291cmNlIDEgdXNlZCAqLwotCQkJCSAgICByczJfdXNlZDoxLCAvKiByZWdpc3RlciBzb3VyY2UgMiB1c2VkICovCi0JCQkJICAgIHJzZF91c2VkOjEsIC8qIHJlZ2lzdGVyIHNvdXJjZS9kZXN0LiB1c2VkICovCi0JCQkJICAgIGNfZmxhZzoxLCAgIC8qIGNvbXBsZW1lbnQgICAgICAqLwotCQkJCSAgICB1X2ZsYWc6MSwgICAvKiB1cHBlciBoYWxmIHdvcmQgKi8KLQkJCQkgICAgbl9mbGFnOjEsICAgLyogZXhlY3V0ZSBuZXh0ICAgICovCi0JCQkJICAgIHdiX2ZsYWc6MSwgIC8qIHVzZXMgd3JpdGViYWNrIHNsb3QgKi8KLQkJCQkgICAgZGVzdF82NDoxLCAgLyogZGVzdCBzaXplICAgICAgICovCi0JCQkJICAgIHMxXzY0OjEsICAgIC8qIHNvdXJjZSAxIHNpemUgICAqLwotCQkJCSAgICBzMl82NDoxLCAgICAvKiBzb3VyY2UgMiBzaXplICAgKi8KLQkJCQkgICAgc2NhbGVfZmxhZzoxLCAvKiBzY2FsZWQgcmVnaXN0ZXIgKi8KLQkJCQkgICAgYnJrX2ZsZzoxOwotICAgICAgICAgICAgICAgICB9OwotCi1zdHJ1Y3QJbWVtX3NlZ3MgewotCXN0cnVjdCBtZW1fd3JkICpzZWc7CQkJLyogcG9pbnRlciAocmV0dXJuZWQgYnkgY2FsbG9jKSB0byBzZWdtZW50ICovCi0JdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsJCQkvKiBiYXNlIGxvYWQgYWRkcmVzcyBmcm9tIGZpbGUgaGVhZGVycyAqLwotCXVuc2lnbmVkIGxvbmcgZW5kYWRkcjsJCQkvKiBFbmRpbmcgYWRkcmVzcyBvZiBzZWdtZW50ICovCi0JaW50CSAgICAgIGZsYWdzOwkJCS8qIHNlZ21lbnQgY29udHJvbCBmbGFncyAobm9uZSBkZWZpbmVkIDEyLzUvODYpICovCi19OwotCi0jZGVmaW5lCU1BWFNFR1MJCSgxMCkJCQkvKiBtYXggbnVtYmVyIG9mIHNlZ21lbnQgYWxsb3dlZCAqLwotI2RlZmluZQlNRU1TRUdTSVpFCShzaXplb2Yoc3RydWN0IG1lbV9zZWdzKSkvKiBzaXplIG9mIG1lbV9zZWdzIHN0cnVjdHVyZSAqLwotCi0KLSNkZWZpbmUgQlJLX1JECQkoMHgwMSkJCQkvKiBicmVhayBvbiBtZW1vcnkgcmVhZCAqLwotI2RlZmluZSBCUktfV1IJCSgweDAyKQkJCS8qIGJyZWFrIG9uIG1lbW9yeSB3cml0ZSAqLwotI2RlZmluZSBCUktfRVhFQwkoMHgwNCkJCQkvKiBicmVhayBvbiBleGVjdXRpb24gKi8KLSNkZWZpbmUJQlJLX0NOVAkJKDB4MDgpCQkJLyogYnJlYWsgb24gdGVybWluYWwgY291bnQgKi8KLQotCi1zdHJ1Y3QJbWVtX3dyZCB7Ci0Jc3RydWN0IElSX0ZJRUxEUyBvcGNvZGU7CQkvKiBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24gYnJlYWsgZG93biAqLwotCXVuaW9uIHsKLQkJdW5zaWduZWQgbG9uZyAgbDsJCS8qIG1lbW9yeSBlbGVtZW50IGJyZWFrIGRvd24gKi8KLQkJdW5zaWduZWQgc2hvcnQgc1syXTsKLQkJdW5zaWduZWQgY2hhciAgY1s0XTsKLQl9IG1lbTsKLX07Ci0KLSNkZWZpbmUJTUVNV1JEU0laRQkoc2l6ZW9mKHN0cnVjdCBtZW1fd3JkKSkJLyogc2l6ZSBvZiBlYWNoIDMyIGJpdCBtZW1vcnkgbW9kZWwgKi8KLQotLyogRXh0ZXJuYWwgZGVjbGFyYXRpb25zICovCi0KLWV4dGVybglzdHJ1Y3QgbWVtX3NlZ3MgbWVtb3J5W107Ci1leHRlcm4Jc3RydWN0IFBST0NFU1NPUiBtNzgwMDA7Ci0KLXN0cnVjdCAgUFJPQ0VTU09SICAgewotCSAgICAgdW5zaWduZWQgV09SRAotCQkJICAgIGlwLCAgICAgICAgICAvKiBleGVjdXRlIGluc3RydWN0aW9uIHBvaW50ZXIgKi8KLQkJCSAgICB2YnIsICAgICAgICAgLyogdmVjdG9yIGJhc2UgcmVnaXN0ZXIgKi8KLQkJCSAgICBwc3I7ICAgICAgICAgLyogcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciAqLwotCi0JCSAgICBXT1JEICAgIFMxYnVzLCAvKiBzb3VyY2UgMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMyYnVzLCAvKiBzb3VyY2UgMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERidXMsICAvKiBkZXN0aW5hdGlvbiAqLwotCQkJICAgIERBYnVzLCAvKiBkYXRhIGFkZHJlc3MgYnVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxVLAotCQkJICAgIFJlZ3NbUkVHc10sICAgICAgIC8qIGRhdGEgcmVnaXN0ZXJzICovCi0JCQkgICAgdGltZV9sZWZ0W1JFR3NdLCAgLyogbWF4IGNsb2NrcyBiZWZvcmUgcmVnIGlzIGF2YWlsYWJsZSAqLwotCQkJICAgIHdiX3ByaVtSRUdzXSwgICAgIC8qIHdyaXRlYmFjayBwcmlvcml0eSBvZiByZWcgKi8KLQkJCSAgICBTRlUwX3JlZ3NbUkVHc10sICAvKiBpbnRlZ2VyIHVuaXQgY29udHJvbCByZWdzICovCi0JCQkgICAgU0ZVMV9yZWdzW1JFR3NdLCAgLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdzICovCi0JCQkgICAgU2NvcmVib2FyZFtSRUdzXSwKLQkJCSAgICBWYnI7Ci0JICAgIHVuc2lnbmVkIFdPUkQgICBzY29yZWJvYXJkLAotCQkJICAgIFBzdywKLQkJCSAgICBUcHN3OwotCQkgICAgRkxBRyAgIGp1bXBfcGVuZGluZzoxOyAgIC8qIHdhaXRpbmcgZm9yIGEganVtcCBpbnN0ci4gKi8KLSAgICAgICAgICAgICAgICAgICAgfTsKLQotIyBkZWZpbmUgICAgaTI2Yml0ICAgICAgMSAgICAvKiBzaXplIG9mIGltbWVkaWF0ZSBmaWVsZCAqLwotIyBkZWZpbmUgICAgaTE2Yml0ICAgICAgMgotIyBkZWZpbmUgICAgaTEwYml0ICAgICAgMwotCi0vKiBEZWZpbml0aW9ucyBmb3IgZmllbGRzIGluIHBzciAqLwotCi0jIGRlZmluZSBtb2RlICAzMQotIyBkZWZpbmUgcmJvICAgMzAKLSMgZGVmaW5lIHNlciAgIDI5Ci0jIGRlZmluZSBjYXJyeSAyOAotIyBkZWZpbmUgc2Y3bSAgMTEKLSMgZGVmaW5lIHNmNm0gIDEwCi0jIGRlZmluZSBzZjVtICAgOQotIyBkZWZpbmUgc2Y0bSAgIDgKLSMgZGVmaW5lIHNmM20gICA3Ci0jIGRlZmluZSBzZjJtICAgNgotIyBkZWZpbmUgc2YxbSAgIDUKLSMgZGVmaW5lIG1hbSAgICA0Ci0jIGRlZmluZSBpbm0gICAgMwotIyBkZWZpbmUgZXhtICAgIDIKLSMgZGVmaW5lIHRybSAgICAxCi0jIGRlZmluZSBvdmZtICAgMAotCi0jZGVmaW5lCSAgICBNT0RFTUFTSyAgICgxPDwobW9kZS0xKSkKLSMgZGVmaW5lICAgIFNJTEVOVCAgICAgMCAgIC8qIHNpbXVsYXRlIHdpdGhvdXQgb3V0cHV0IHRvIGNydCAqLwotIyBkZWZpbmUgICAgVkVSQk9TRSAgICAxICAgLyogc2ltdWxhdGUgaW4gdmVyYm9zZSBtb2RlICovCi0jIGRlZmluZSAgICBQUl9JTlNUUiAgIDIgICAvKiBvbmx5IHByaW50IGluc3RydWN0aW9ucyAqLwotCi0jIGRlZmluZSAgICBSRVNFVCAgICAgIDE2IC8qIHJlc2V0IHBoYXNlICovCi0KLSMgZGVmaW5lICAgIFBIQVNFMSAgICAgMCAgLyogZGF0YSBwYXRoIHBoYXNlcyAqLwotIyBkZWZpbmUgICAgUEhBU0UyICAgICAxCi0KLS8qIHRoZSAxIGNsb2NrIG9wZXJhdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgQUREVSAgICAgICAgMQotIyBkZWZpbmUgICAgQUREQyAgICAgICAgMgotIyBkZWZpbmUgICAgQUREVUMgICAgICAgMwotIyBkZWZpbmUgICAgQUREICAgICAgICAgNAotCi0jIGRlZmluZSAgICBTVUJVICAgIEFERCsxCi0jIGRlZmluZSAgICBTVUJCICAgIEFERCsyCi0jIGRlZmluZSAgICBTVUJVQiAgIEFERCszCi0jIGRlZmluZSAgICBTVUIgICAgIEFERCs0Ci0KLSMgZGVmaW5lICAgIEFORF8gICAgQUREKzUKLSMgZGVmaW5lICAgIE9SICAgICAgQUREKzYKLSMgZGVmaW5lICAgIFhPUiAgICAgQUREKzcKLSMgZGVmaW5lICAgIENNUCAgICAgQUREKzgKLQotLyogdGhlIExPQURTICovCi0KLSMgZGVmaW5lICAgIExEQUIgICAgQ01QKzEKLSMgZGVmaW5lICAgIExEQUggICAgQ01QKzIKLSMgZGVmaW5lICAgIExEQSAgICAgQ01QKzMKLSMgZGVmaW5lICAgIExEQUQgICAgQ01QKzQKLQotIyBkZWZpbmUgICAgTERCICAgTERBRCsxCi0jIGRlZmluZSAgICBMREggICBMREFEKzIKLSMgZGVmaW5lICAgIExEICAgIExEQUQrMwotIyBkZWZpbmUgICAgTEREICAgTERBRCs0Ci0jIGRlZmluZSAgICBMREJVICBMREFEKzUKLSMgZGVmaW5lICAgIExESFUgIExEQUQrNgotCi0vKiB0aGUgU1RPUkVTICovCi0KLSMgZGVmaW5lICAgIFNUQiAgICBMREhVKzEKLSMgZGVmaW5lICAgIFNUSCAgICBMREhVKzIKLSMgZGVmaW5lICAgIFNUICAgICBMREhVKzMKLSMgZGVmaW5lICAgIFNURCAgICBMREhVKzQKLQotLyogdGhlIGV4Y2hhbmdlICovCi0KLSMgZGVmaW5lICAgIFhNRU1CVSBMREhVKzUKLSMgZGVmaW5lICAgIFhNRU0gICBMREhVKzYKLQotLyogdGhlIGJyYW5jaGVzICovCi0jIGRlZmluZSAgICBKU1IgICAgU1REKzEKLSMgZGVmaW5lICAgIEJTUiAgICBTVEQrMgotIyBkZWZpbmUgICAgQlIgICAgIFNURCszCi0jIGRlZmluZSAgICBKTVAgICAgU1REKzQKLSMgZGVmaW5lICAgIEJCMSAgICBTVEQrNQotIyBkZWZpbmUgICAgQkIwICAgIFNURCs2Ci0jIGRlZmluZSAgICBSVE4gICAgU1REKzcKLSMgZGVmaW5lICAgIEJDTkQgICBTVEQrOAotCi0vKiB0aGUgVFJBUFMgKi8KLSMgZGVmaW5lICAgIFRCMSAgICBCQ05EKzEKLSMgZGVmaW5lICAgIFRCMCAgICBCQ05EKzIKLSMgZGVmaW5lICAgIFRDTkQgICBCQ05EKzMKLSMgZGVmaW5lICAgIFJURSAgICBCQ05EKzQKLSMgZGVmaW5lICAgIFRCTkQgICBCQ05EKzUKLQotLyogdGhlIE1JU0MgaW5zdHJ1Y3Rpb25zICovCi0jIGRlZmluZSAgICBNVUwgICAgIFRCTkQgKyAxCi0jIGRlZmluZSAgICBESVYgICAgIE1VTCAgKzIKLSMgZGVmaW5lICAgIERJVlUgICAgTVVMICArMwotIyBkZWZpbmUgICAgTUFTSyAgICBNVUwgICs0Ci0jIGRlZmluZSAgICBGRjAgICAgIE1VTCAgKzUKLSMgZGVmaW5lICAgIEZGMSAgICAgTVVMICArNgotIyBkZWZpbmUgICAgQ0xSICAgICBNVUwgICs3Ci0jIGRlZmluZSAgICBTRVQgICAgIE1VTCAgKzgKLSMgZGVmaW5lICAgIEVYVCAgICAgTVVMICArOQotIyBkZWZpbmUgICAgRVhUVSAgICBNVUwgICsxMAotIyBkZWZpbmUgICAgTUFLICAgICBNVUwgICsxMQotIyBkZWZpbmUgICAgUk9UICAgICBNVUwgICsxMgotCi0vKiBjb250cm9sIHJlZ2lzdGVyIG1hbmlwdWxhdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgTERDUiAgICBST1QgICsxCi0jIGRlZmluZSAgICBTVENSICAgIFJPVCAgKzIKLSMgZGVmaW5lICAgIFhDUiAgICAgUk9UICArMwotCi0jIGRlZmluZSAgICBGTERDUiAgICBST1QgICs0Ci0jIGRlZmluZSAgICBGU1RDUiAgICBST1QgICs1Ci0jIGRlZmluZSAgICBGWENSICAgICBST1QgICs2Ci0KLQotIyBkZWZpbmUgICAgTk9QICAgICBYQ1IgKzEKLQotLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0KLSMgZGVmaW5lICAgIEZBREQgICAgTk9QICsxCi0jIGRlZmluZSAgICBGU1VCICAgIE5PUCArMgotIyBkZWZpbmUgICAgRk1VTCAgICBOT1AgKzMKLSMgZGVmaW5lICAgIEZESVYgICAgTk9QICs0Ci0jIGRlZmluZSAgICBGU1FSVCAgIE5PUCArNQotIyBkZWZpbmUgICAgRkNNUCAgICBOT1AgKzYKLSMgZGVmaW5lICAgIEZJUCAgICAgTk9QICs3Ci0jIGRlZmluZSAgICBGTFQgICAgIE5PUCArOAotIyBkZWZpbmUgICAgSU5UICAgICBOT1AgKzkKLSMgZGVmaW5lICAgIE5JTlQgICAgTk9QICsxMAotIyBkZWZpbmUgICAgVFJOQyAgICBOT1AgKzExCi0jIGRlZmluZSAgICBGTERDICAgTk9QICsxMgotIyBkZWZpbmUgICAgRlNUQyAgIE5PUCArMTMKLSMgZGVmaW5lICAgIEZYQyAgICBOT1AgKzE0Ci0KLSMgZGVmaW5lIFVFWFQoc3JjLG9mZix3aWQpICgoKCh1bnNpZ25lZCBpbnQpKHNyYykpPj4ob2ZmKSkgJiAoKDE8PCh3aWQpKSAtIDEpKQotIyBkZWZpbmUgU0VYVChzcmMsb2ZmLHdpZCkgKCgoKChpbnQpKHNyYykpPDwoMzItKChvZmYpKyh3aWQpKSkpID4+KDMyLSh3aWQpKSkgKQotIyBkZWZpbmUgTUFLRShzcmMsb2ZmLHdpZCkgXAotICAoKCgodW5zaWduZWQgaW50KShzcmMpKSAmICgoMTw8KHdpZCkpIC0gMSkpIDw8IChvZmYpKQotCi0jIGRlZmluZSBvcHdvcmQobikgKHVuc2lnbmVkIGxvbmcpIChtZW1hZGRyLT5tZW0ubCkKLQotLyogIENvbnN0YW50cyBhbmQgTWFza3MgKi8KLQotI2RlZmluZSBTRlUwICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgU0ZVMSAgICAgICAweDg0MDAwMDAwCi0jZGVmaW5lIFNGVTcgICAgICAgMHg5YzAwMDAwMAotI2RlZmluZSBSUkkxMCAgICAgIDB4ZjAwMDAwMDAKLSNkZWZpbmUgUlJSICAgICAgICAweGY0MDAwMDAwCi0jZGVmaW5lIFNGVU1BU0sgICAgMHhmYzAwZmZlMAotI2RlZmluZSBSUlJNQVNLICAgIDB4ZmMwMGZmZTAKLSNkZWZpbmUgUlJJMTBNQVNLICAweGZjMDBmYzAwCi0jZGVmaW5lIERFRk1BU0sgICAgMHhmYzAwMDAwMAotI2RlZmluZSBDVFJMICAgICAgIDB4MDAwMGYwMDAKLSNkZWZpbmUgQ1RSTE1BU0sgICAweGZjMDBmODAwCi0KLS8qIE9wZXJhbmRzIHR5cGVzICovCi0KLWVudW0gb3BlcmFuZF90eXBlIHsKLSAgSEVYID0gMSwKLSAgUkVHID0gMiwKLSAgQ09OVCA9IDMsCi0gIElORCA9IDMsCi0gIEJGID0gNCwKLSAgUkVHU0MgPSA1ICAgIC8qIHNjYWxlZCByZWdpc3RlciAqLywKLSAgQ1JSRUcgPSA2ICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8sCi0gIEZDUlJFRyA9IDcgICAgLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciAqLywKLSAgUENSRUwgPSA4LAotICBDT05ETUFTSyA9IDksCi0gIFhSRUcgPSAxMCwgLyogZXh0ZW5kZWQgcmVnaXN0ZXIgKi8KLSAgREVDID0gMTEsIC8qIGRlY2ltYWwgKi8KLX07Ci0KLS8qIEhhc2hpbmcgU3BlY2lmaWNhdGlvbiAqLwotCi0jZGVmaW5lIEhBU0hWQUwgICAgIDc5Ci0KLS8qIFR5cGUgZGVmaW5pdGlvbnMgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKLQotLyogU3RydWN0dXJlIHRlbXBsYXRlcyAqLwotCi0jaWYgbmV2ZXIKLXR5cGVkZWYgc3RydWN0IHsKLSAgIHVuc2lnbmVkIGludCBvZmZzZXQ6NTsKLSAgIHVuc2lnbmVkIGludCB3aWR0aDo2OwotICAgdW5zaWduZWQgaW50IHR5cGU6NTsKLX0gT1BTUEVDOwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0gICBlbnVtIG9wZXJhbmRfdHlwZSB0eXBlOwotfSBPUFNQRUM7Ci0KLQlzdHJ1Y3QgU0lNX0ZMQUdTIHsKLQkgICAgICBpbnQgIGx0bmN5LCAgIC8qIGxhdGVuY3kgKG1heCBudW1iZXIgb2YgY2xvY2tzIG5lZWRlZCB0byBleGVjdXRlKSAqLwotCQkgIGV4dGltZSwgICAvKiBleGVjdXRpb24gdGltZSAobWluIG51bWJlciBvZiBjbG9ja3MgbmVlZGVkIHRvIGV4ZWN1dGUpICovCi0JCSAgd2JfcHJpOyAgIC8qIHdyaXRlYmFjayBzbG90IHByaW9yaXR5ICovCi0gICB1bnNpZ25lZCAgICAgICAgIG9wOk9QLCAgIC8qIHNpbXVsYXRvciB2ZXJzaW9uIG9mIG9wY29kZSAqLwotCSAgICAgaW1tX2ZsYWdzOjIsICAgLyogMTAsMTYgb3IgMjYgYml0IGltbWVkaWF0ZSBmbGFncyAqLwotCSAgICAgIHJzMV91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlIDEgdXNlZCAqLwotCSAgICAgIHJzMl91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlIDIgdXNlZCAqLwotCSAgICAgIHJzZF91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlL2Rlc3QgdXNlZCAqLwotCQljX2ZsYWc6MSwgICAvKiBjb21wbGVtZW50ICovCi0JCXVfZmxhZzoxLCAgIC8qIHVwcGVyIGhhbGYgd29yZCAqLwotCQluX2ZsYWc6MSwgICAvKiBleGVjdXRlIG5leHQgKi8KLQkgICAgICAgd2JfZmxhZzoxLCAgIC8qIHVzZXMgd3JpdGViYWNrIHNsb3QgKi8KLQkgICAgICAgZGVzdF82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gZGVzdCAqLwotCQkgczFfNjQ6MSwgICAvKiBkb3VibGUgcHJlY2lzaW9uIHNvdXJjZSAxICovCi0JCSBzMl82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gc291cmNlIDIgKi8KLQkgICAgc2NhbGVfZmxhZzoxOyAgIC8qIHJlZ2lzdGVyIGlzIHNjYWxlZCAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgSU5TVFJVQ1RBQiB7Ci0gICB1bnNpZ25lZCBpbnQgIG9wY29kZTsKLSAgIGNoYXIgICAgICAgICAgKm1uZW1vbmljOwotICAgT1BTUEVDICAgICAgICBvcDEsb3AyLG9wMzsKLSAgIHN0cnVjdCBTSU1fRkxBR1MgZmxnczsKLSAgIHN0cnVjdCBJTlNUUlVDVEFCICAgICpuZXh0OwotfSBJTlNUQUI7Ci0MCi0KLSNkZWZpbmUgTk9fT1BFUkFORCB7MCwwLDB9Ci0KLS8qIE9wY29kZSAgICAgTW5lbW9uaWMgICAgICAgT3AgMSBTcGVjICAgICBPcCAyIFNwZWMgICAgT3AgMyBTcGVjICAgICAgICAgU2ltZmxhZ3MgICAgICAgICAgICAgTmV4dCAgKi8KLQotc3RhdGljIElOU1RBQiAgaW5zdHJ1Y3Rpb25zW10gPSB7Ci0gIHsweGY0MDBjODAwLCJqc3IgICAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsSlNSICwgICAgICAgICAgMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjYzAwLCJqc3IubiAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsSlNSICwgICAgICAgICAgMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjMDAwLCJqbXAgICAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsSk1QICwgICAgICAgICAgMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjNDAwLCJqbXAubiAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsSk1QICwgICAgICAgICAgMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGM4MDAwMDAwLCJic3IgICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsQlNSICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGNjMDAwMDAwLCJic3IubiAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsQlNSICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGMwMDAwMDAwLCJiciAgICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsQlIgICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGM0MDAwMDAwLCJici5uICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsQlIgICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQwMDAwMDAwLCJiYjAgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDE2LFBDUkVMfSx7MiwyLE5BLEJCMCwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQ0MDAwMDAwLCJiYjAubiAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDE2LFBDUkVMfSx7MSwxLE5BLEJCMCwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQ4MDAwMDAwLCJiYjEgICAgICAgICAiLHsyMSw1LEhFWH0sezE2LDUsUkVHfSAgICAgLHswLDE2LFBDUkVMfSx7MiwyLE5BLEJCMSwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGRjMDAwMDAwLCJiYjEubiAgICAgICAiLHsyMSw1LEhFWH0sezE2LDUsUkVHfSAgICAgLHswLDE2LFBDUkVMfSx7MSwxLE5BLEJCMSwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBkMDAwLCJ0YjAgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDEwLEhFWH0sIHsyLDIsTkEsVEIwICwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBkODAwLCJ0YjEgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDEwLEhFWH0sIHsyLDIsTkEsVEIxICwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGU4MDAwMDAwLCJiY25kICAgICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDE2LFBDUkVMfSx7MiwyLE5BLEJDTkQsICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGVjMDAwMDAwLCJiY25kLm4gICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDE2LFBDUkVMfSx7MSwxLE5BLEJDTkQsICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBlODAwLCJ0Y25kICAgICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDEwLEhFWH0sIHsyLDIsTkEsVENORCwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY4MDAwMDAwLCJ0Ym5kICAgICAgICAiLHsxNiw1LFJFR30gICx7MCwxNixIRVh9ICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsVEJORCwgICAgIGkxMGJpdCwxLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBmODAwLCJ0Ym5kICAgICAgICAiLHsxNiw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsVEJORCwgICAgICAgICAgMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBmYzAwLCJydGUgICAgICAgICAiLE5PX09QRVJBTkQgICAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsUlRFICwgICAgICAgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDFjMDAwMDAwLCJsZC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREIgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxYzAwLCJsZC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREIgICAgICwgICAgMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDBjMDAwMDAwLCJsZC5idSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREJVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwYzAwLCJsZC5idSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREJVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDE4MDAwMDAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREggICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxODAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREggICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxYTAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREggICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDA4MDAwMDAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREhVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwODAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREhVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwYTAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREhVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDE0MDAwMDAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMRCAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNDAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNjAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDEwMDAwMDAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREQgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxMDAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxMjAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweGY0MDAxNTAwLCJsZC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNzAwLCJsZC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDJjMDAwMDAwLCJzdC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1RCICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYzAwLCJzdC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1RCICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDI4MDAwMDAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1RIICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyODAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1RIICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYTAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1RIICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDI0MDAwMDAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1QgICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNDAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDI2MDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHgyMDAwMDAwMCwic3QuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLE5BLFNURCAgICAgICxpMTZiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyMDAwLCJzdC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1REICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDIyMDAsInN0LmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVEQgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMjUwMCwic3QudXNyICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyNzAwLCJzdC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLS8qICBtODgxMDAgb25seToKLSAgezB4MDAwMDAwMDAsInhtZW0uYnUgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLFhNRU1CVSAsaTE2Yml0LDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICovCi0gIHsweGY0MDAwMDAwLCJ4bWVtLmJ1ICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLS8qICBtODgxMDAgb25seToKLSAgezB4MDQwMDAwMDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLFhNRU0gICAsaTE2Yml0LDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICovCi0gIHsweGY0MDAwNDAwLCJ4bWVtICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDA2MDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMDUwMCwieG1lbS51c3IgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAwNzAwLCJ4bWVtLnVzciAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLS8qIG04ODEwMCBvbmx5OgotICB7MHhmNDAwM2UwMCwibGRhLmIgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDNlMDAsImxkYS54ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUgsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwM2EwMCwibGRhLmggICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAzNjAwLCJsZGEgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREEgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDMyMDAsImxkYS5kICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUQsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotCi0gIHsweDgwMDA0MDAwLCJsZGNyICAgICAgICAiLHsyMSw1LFJFR30gICx7NSw2LENSUkVHfSAgLE5PX09QRVJBTkQgICAgLHsxLDEsUElOVCxMRENSLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMDgwMDAsInN0Y3IgICAgICAgICIsezE2LDUsUkVHfSAgLHs1LDYsQ1JSRUd9ICAsTk9fT1BFUkFORCAgICAsezEsMSxQSU5ULFNUQ1IsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwYzAwMCwieGNyICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7NSw2LENSUkVHfSx7MSwxLFBJTlQsWENSLCAgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4ZjQwMDYwMDAsImFkZHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjIwMCwiYWRkdS5jaSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2MTAwLCJhZGR1LmNvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDYzMDAsImFkZHUuY2lvICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjQwMCwic3VidSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NjAwLCJzdWJ1LmNpICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY1MDAsInN1YnUuY28gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjcwMCwic3VidS5jaW8gICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2ODAwLCJkaXZ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszMiwzMixQSU5ULERJVlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjkwMCwiZGl2dS5kICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCx9LCBOVUxMIH0sCi0gIHsweGY0MDA2ZTAwLCJtdWxzICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLH0sIE5VTEwgfSwKLSAgezB4ZjQwMDZjMDAsIm11bHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsNCxQSU5ULE1VTCwgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzAwMCwiYWRkICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MjAwLCJhZGQuY2kgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDcxMDAsImFkZC5jbyAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzMwMCwiYWRkLmNpbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NDAwLCJzdWIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc2MDAsInN1Yi5jaSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzUwMCwic3ViLmNvICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NzAwLCJzdWIuY2lvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc4MDAsImRpdnMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMyLDMyLFBJTlQsRElWICwgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwN2MwMCwiY21wICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQ01QLCAgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4NjAwMDAwMDAsImFkZHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFERFUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg2NDAwMDAwMCwic3VidSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsU1VCVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4NjgwMDAwMDAsImRpdnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMyLDMyLFBJTlQsRElWVSwgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg2YzAwMDAwMCwibXVsdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7NCwxLFBJTlQsTVVMLCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDcwMDAwMDAwLCJhZGQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBREQsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NzQwMDAwMDAsInN1YiAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFNVQiwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg3ODAwMDAwMCwiZGl2cyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MzIsMzIsUElOVCxESVYsICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDdjMDAwMDAwLCJjbXAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxDTVAsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHhmNDAwNDAwMCwiYW5kICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQU5EXyAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA0NDAwLCJhbmQuYyAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBTkRfICAgICAgICAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDU4MDAsIm9yICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE9SICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNWMwMCwib3IuYyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsT1IgICAgICAgICAgLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA1MDAwLCJ4b3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxYT1IgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDU0MDAsInhvci5jICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFhPUiAgICAgICAgICwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg0MDAwMDAwMCwiYW5kICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQU5EXyAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQ0MDAwMDAwLCJhbmQudSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBTkRfICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTgwMDAwMDAsIm9yICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE9SICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1YzAwMDAwMCwib3IudSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsT1IgICAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDUwMDAwMDAwLCJ4b3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxYT1IgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTQwMDAwMDAsInhvci51ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFhPUiAgICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg0ODAwMDAwMCwibWFzayAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsTUFTSyAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDRjMDAwMDAwLCJtYXNrLnUgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxNQVNLICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMGVjMDAsImZmMCAgICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezEsMSxQSU5ULEZGMCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwZTgwMCwiZmYxICAgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7MSwxLFBJTlQsRkYxICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA4MDAwLCJjbHIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxDTFIgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDg4MDAsInNldCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULFNFVCAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwOTAwMCwiZXh0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsRVhUICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA5ODAwLCJleHR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxFWFRVICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMGEwMDAsIm1hayAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULE1BSyAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwYTgwMCwicm90ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsUk9UICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA4MDAwLCJjbHIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxDTFIgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDg4MDAsInNldCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNFVCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwOTAwMCwiZXh0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsRVhUICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA5ODAwLCJleHR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxFWFRVICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMGEwMDAsIm1hayAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE1BSyAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwYTgwMCwicm90ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsUk9UICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4ODQwMDI4MDAsImZhZGQuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjg4MCwiZmFkZC5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyYTAwLCJmYWRkLnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhODAsImZhZGQuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjgyMCwiZmFkZC5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyOGEwLCJmYWRkLmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhMjAsImZhZGQuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmFhMCwiZmFkZC5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMDAwLCJmc3ViLnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs1LDEsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwODAsImZzdWIuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzIwMCwiZnN1Yi5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjgwLCJmc3ViLnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwMjAsImZzdWIuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzBhMCwiZnN1Yi5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjIwLCJmc3ViLmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyYTAsImZzdWIuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDAwMCwiZm11bC5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDgwLCJmbXVsLnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAyMDAsImZtdWwuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDI4MCwiZm11bC5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDIwLCJmbXVsLmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwYTAsImZtdWwuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDIyMCwiZm11bC5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMmEwLCJmbXVsLmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcwMDAsImZkaXYuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMwLDMwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzA4MCwiZmRpdi5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MjAwLCJmZGl2LnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyODAsImZkaXYuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzAyMCwiZmRpdi5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MGEwLCJmZGl2LmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyMjAsImZkaXYuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzJhMCwiZmRpdi5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3ODAwLCJmc3FydC5zcyAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4MjAsImZzcXJ0LnNkICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzg4MCwiZnNxcnQuZHMgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3OGEwLCJmc3FydC5kZCAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDM4MDAsImZjbXAuc3MgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzg4MCwiZmNtcC5zZCAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzYTAwLCJmY21wLmRzICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDNhODAsImZjbXAuZGQgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjAwMCwiZmx0LnMgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyMDIwLCJmbHQuZCAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDQ4MDAsImludC5zICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNDg4MCwiaW50LmQgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1MDAwLCJuaW50LnMgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDUwODAsIm5pbnQuZCAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNTgwMCwidHJuYy5zICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsVFJOQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1ODgwLCJ0cm5jLmQgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxUUk5DICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg4MDAwNDgwMCwiZmxkY3IgICAgICAgIix7MjEsNSxSRUd9ICAsezUsNixGQ1JSRUd9ICxOT19PUEVSQU5EICAgLCB7MSwxLFBGTFQsRkxEQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDgwMDA4ODAwLCJmc3RjciAgICAgICAiLHsxNiw1LFJFR30gICx7NSw2LEZDUlJFR30gLE5PX09QRVJBTkQgICAsIHsxLDEsUEZMVCxGU1RDICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMGM4MDAsImZ4Y3IgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezUsNixGQ1JSRUd9ICwgezEsMSxQRkxULEZYQyAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBuZXcgZm9yIHRoZSA4ODExMC4gKi8KLQotICB7MHg4NDAwYWFhMCwiZmFkZC5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhODAsImZhZGQuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYWMwLCJmYWRkLmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWEyMCwiZmFkZC5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhMDAsImZhZGQuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYTQwLCJmYWRkLmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWIyMCwiZmFkZC5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFiMDAsImZhZGQuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYjQwLCJmYWRkLmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYThhMCwiZmFkZC5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4ODAsImZhZGQuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOGMwLCJmYWRkLnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTgyMCwiZmFkZC5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4MDAsImZhZGQuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhODQwLCJmYWRkLnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTkyMCwiZmFkZC5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE5MDAsImZhZGQuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOTQwLCJmYWRkLnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWNhMCwiZmFkZC54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjODAsImZhZGQueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhY2MwLCJmYWRkLnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWMyMCwiZmFkZC54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjMDAsImZhZGQueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYzQwLCJmYWRkLnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWQyMCwiZmFkZC54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFkMDAsImZhZGQueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhZDQwLCJmYWRkLnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBiYTgwLCJmY21wLnNkZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYTAwLCJmY21wLnNkcyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYjAwLCJmY21wLnNkeCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiODgwLCJmY21wLnNzZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiODAwLCJmY21wLnNzcyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiOTAwLCJmY21wLnNzeCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYzgwLCJmY21wLnN4ZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYzAwLCJmY21wLnN4cyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiZDAwLCJmY21wLnN4eCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGJhYTAsImZjbXB1LnNkZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJhMjAsImZjbXB1LnNkcyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJiMjAsImZjbXB1LnNkeCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4YTAsImZjbXB1LnNzZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4MjAsImZjbXB1LnNzcyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI5MjAsImZjbXB1LnNzeCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjYTAsImZjbXB1LnN4ZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjMjAsImZjbXB1LnN4cyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJkMjAsImZjbXB1LnN4eCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwMDgyMCwiZmN2dC5zZCAgICAgIix7MjEsNSxSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDA4ODAsImZjdnQuZHMgICAgICIsezIxLDUsUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDg4ODAsImZjdnQuZHMgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4YzAsImZjdnQuZHggICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4MjAsImZjdnQuc2QgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4NDAsImZjdnQuc3ggICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg5MjAsImZjdnQueGQgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg5MDAsImZjdnQueHMgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZjJhMCwiZmRpdi5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyODAsImZkaXYuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMmMwLCJmZGl2LmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjIyMCwiZmRpdi5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyMDAsImZkaXYuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMjQwLCJmZGl2LmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjMyMCwiZmRpdi5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYzMDAsImZkaXYuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMzQwLCJmZGl2LmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjBhMCwiZmRpdi5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwODAsImZkaXYuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMGMwLCJmZGl2LnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjAyMCwiZmRpdi5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwMDAsImZkaXYuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMDQwLCJmZGl2LnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjEyMCwiZmRpdi5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYxMDAsImZkaXYuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMTQwLCJmZGl2LnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjRhMCwiZmRpdi54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0ODAsImZkaXYueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNGMwLCJmZGl2LnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQyMCwiZmRpdi54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0MDAsImZkaXYueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNDQwLCJmZGl2LnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjUyMCwiZmRpdi54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY1MDAsImZkaXYueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNTQwLCJmZGl2Lnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDAyMjIwLCJmbHQuZHMgICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDIyMDAsImZsdC5zcyAgICAgICIsezIxLDUsWFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMjI0MCwiZmx0LnhzICAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDgyYTAsImZtdWwuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjgwLCJmbXVsLmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODJjMCwiZm11bC5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyMjAsImZtdWwuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjAwLCJmbXVsLmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODI0MCwiZm11bC5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgzMjAsImZtdWwuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MzAwLCJmbXVsLmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODM0MCwiZm11bC5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwYTAsImZtdWwuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDgwLCJmbXVsLnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODBjMCwiZm11bC5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwMjAsImZtdWwuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDAwLCJmbXVsLnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODA0MCwiZm11bC5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgxMjAsImZtdWwuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MTAwLCJmbXVsLnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODE0MCwiZm11bC5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0YTAsImZtdWwueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDgwLCJmbXVsLnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODRjMCwiZm11bC54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0MjAsImZtdWwueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDAwLCJmbXVsLnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODQ0MCwiZm11bC54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg1MjAsImZtdWwueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NTAwLCJmbXVsLnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODU0MCwiZm11bC54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZjhhMCwiZnNxcnQuZGQgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODgwLCJmc3FydC5kcyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4YzAsImZzcXJ0LmR4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjgyMCwiZnNxcnQuc2QgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODAwLCJmc3FydC5zcyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4NDAsImZzcXJ0LnN4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjkyMCwiZnNxcnQueGQgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmOTAwLCJmc3FydC54cyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY5NDAsImZzcXJ0Lnh4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBiMmEwLCJmc3ViLmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjI4MCwiZnN1Yi5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyYzAsImZzdWIuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjIwLCJmc3ViLmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjIwMCwiZnN1Yi5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyNDAsImZzdWIuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMzIwLCJmc3ViLmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjMwMCwiZnN1Yi5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIzNDAsImZzdWIuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMGEwLCJmc3ViLnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjA4MCwiZnN1Yi5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwYzAsImZzdWIuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDIwLCJmc3ViLnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjAwMCwiZnN1Yi5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwNDAsImZzdWIuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMTIwLCJmc3ViLnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjEwMCwiZnN1Yi5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIxNDAsImZzdWIuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNGEwLCJmc3ViLnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQ4MCwiZnN1Yi54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0YzAsImZzdWIueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDIwLCJmc3ViLnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQwMCwiZnN1Yi54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0NDAsImZzdWIueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNTIwLCJmc3ViLnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjUwMCwiZnN1Yi54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI1NDAsImZzdWIueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGZjMDAsImlsbG9wIiwgezAsMixERUN9LCBOT19PUEVSQU5ELCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYzgwMCwiaW50LnNzICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBjODgwLCJpbnQuc2QgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGM5MDAsImludC5zeCAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDA0MDAwMDAwLCJsZCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDAwMDAwMDAwLCJsZC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDNjMDAwMDAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDE0MDAsImxkICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTAwMCwibGQuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxODAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE1MDAsImxkLnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTEwMCwibGQuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxOTAwLCJsZC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMTYwMCwibGQgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDEyMDAsImxkLmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxYTAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTcwMCwibGQudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDEzMDAsImxkLmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxYjAwLCJsZC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBjMDAwLCJtb3YucyAgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGMwODAsIm1vdi5kICAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwNDIwMCwibW92LnMgICAgICAgIiwgezIxLDUsWFJFR30sIHswLDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA0MjgwLCJtb3YuZCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezAsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGMzMDAsIm1vdiAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwNmQwMCwibXVsdS5kICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZDA4MCwibmludC5zZCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkMDAwLCJuaW50LnNzICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQxMDAsIm5pbnQuc3ggICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAyMDIwLCJwYWRkLmIgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjA0MCwicGFkZC5oICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwNjAsInBhZGQgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDIxZTAsInBhZGRzLnMgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMWEwLCJwYWRkcy5zLmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjFjMCwicGFkZHMucy5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwZTAsInBhZGRzLnUgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMGEwLCJwYWRkcy51LmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjBjMCwicGFkZHMudS5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxNjAsInBhZGRzLnVzICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMTIwLCJwYWRkcy51cy5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjE0MCwicGFkZHMudXMuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMzg2MCwicGNtcCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMDAwMCwicG11bCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwNjI2MCwicHBhY2suMTYgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDYyNDAsInBwYWNrLjE2LmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2NDYwLCJwcGFjay4zMiAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjQyMCwicHBhY2suMzIuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDY0NDAsInBwYWNrLjMyLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2MTYwLCJwcGFjay44ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDA3MjAwLCJwcm90ICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7NSw2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNzgwMCwicHJvdCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMzAyMCwicHN1Yi5iICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwNDAsInBzdWIuaCAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMDYwLCJwc3ViICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzMWUwLCJwc3Vicy5zICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzFhMCwicHN1YnMucy5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxYzAsInBzdWJzLnMuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMGUwLCJwc3Vicy51ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzBhMCwicHN1YnMudS5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwYzAsInBzdWJzLnUuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMTYwLCJwc3Vicy51cyAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzEyMCwicHN1YnMudXMuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxNDAsInBzdWJzLnVzLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDY4MDAsInB1bnBrLm4gICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjgyMCwicHVucGsuYiAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4MzQwMDAwMDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MzAwMDAwMDAsInN0LmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MzgwMDAwMDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwMmM4MCwic3QuYi53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI4ODAsInN0Lmgud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNDgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjA4MCwic3QuZC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJkODAsInN0LmIudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyOTgwLCJzdC5oLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjU4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDIxODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDI0MDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjAwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMTAwLCJzdC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIxODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjA4MCwic3QuZC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNTAwLCJzdC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI1ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjQ4MCwic3Qud3QgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyODAwLCJzdC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI5MDAsInN0LngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjk4MCwic3QueC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyODgwLCJzdC54Lnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwMmY4MCwic3QuYi51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmU4MCwic3QuYi53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjM4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjI4MCwic3QuZC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmI4MCwic3QuaC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmE4MCwic3QuaC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjc4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjY4MCwic3Qud3QgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGYwMDAyNjAwLCJzdCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjIwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIzMDAsInN0LmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMzgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjI4MCwic3QuZC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI3MDAsInN0LnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNzgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjY4MCwic3Qud3QgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJhMDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyYjAwLCJzdC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmI4MCwic3QueC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJhODAsInN0Lngud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGQ4ODAsInRybmMuc2QgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZDgwMCwidHJuYy5zcyAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkOTAwLCJ0cm5jLnN4ICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotfTsKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbWlwcy5oIGIvaW5jbHVkZS9vcGNvZGUvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzkzZDFiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0MiArMCwwIEBACi0vKiBtaXBzLmguICBNaXBzIG9wY29kZSBsaXN0IGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJhbHBoIENhbXBiZWxsIGFuZCBPU0YKLSAgIENvbW1lbnRlZCBhbmQgbW9kaWZpZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTUlQU19IXwotI2RlZmluZSBfTUlQU19IXwotCi0vKiBUaGVzZSBhcmUgYml0IG1hc2tzIGFuZCBzaGlmdCBjb3VudHMgdG8gdXNlIHRvIGFjY2VzcyB0aGUgdmFyaW91cwotICAgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uLiAgVG8gcmV0cmlldmUgdGhlIFggZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLCB1c2UgdGhlIGV4cHJlc3Npb24KLQkoaSA+PiBPUF9TSF9YKSAmIE9QX01BU0tfWAotICAgVG8gc2V0IHRoZSBzYW1lIGZpZWxkICh0byBqKSwgdXNlCi0JaSA9IChpICZ+IChPUF9NQVNLX1ggPDwgT1BfU0hfWCkpIHwgKGogPDwgT1BfU0hfWCkKLQotICAgTWFrZSBzdXJlIHlvdSB1c2UgZmllbGRzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW5zdHJ1Y3Rpb24sCi0gICBvZiBjb3Vyc2UuICAKLQotICAgVGhlICdpJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBJTU1FRElBVEUuICAKLQotICAgVGhlICdqJyBmb3JtYXQgdXNlcyBPUCBhbmQgVEFSR0VULgotCi0gICBUaGUgJ3InIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQsIFJELCBTSEFNVCBhbmQgRlVOQ1QuCi0KLSAgIFRoZSAnYicgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgREVMVEEuCi0KLSAgIFRoZSBmbG9hdGluZyBwb2ludCAnaScgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgSU1NRURJQVRFLgotCi0gICBUaGUgZmxvYXRpbmcgcG9pbnQgJ3InIGZvcm1hdCB1c2VzIE9QLCBGTVQsIEZULCBGUywgRkQgYW5kIEZVTkNULgotCi0gICBBIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gdXNlcyBPUCwgQ09ERSBhbmQgU1BFQyAoMTAgYml0cyBvZiB0aGUKLSAgIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gYXJlIG5vdCBkZWZpbmVkOyBLYW5lIHNheXMgdGhlIGJyZWFrcG9pbnQKLSAgIGNvZGUgZmllbGQgaW4gQlJFQUsgaXMgMjAgYml0czsgeWV0IE1JUFMgYXNzZW1ibGVycyBhbmQgZGVidWdnZXJzCi0gICBvbmx5IHVzZSB0ZW4gYml0cykuICBBbiBvcHRpb25hbCB0d28tb3BlcmFuZCBmb3JtIG9mIGJyZWFrL3NkYmJwCi0gICBhbGxvd3MgdGhlIGxvd2VyIHRlbiBiaXRzIHRvIGJlIHNldCB0b28uCi0KLSAgIFRoZSBzeXNjYWxsIGluc3RydWN0aW9uIHVzZXMgU1lTQ0FMTC4KLQotICAgVGhlIGdlbmVyYWwgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIHVzZSBDT1BaLiAgKi8KLQotI2RlZmluZSBPUF9NQVNLX09QCQkweDNmCi0jZGVmaW5lIE9QX1NIX09QCQkyNgotI2RlZmluZSBPUF9NQVNLX1JTCQkweDFmCi0jZGVmaW5lIE9QX1NIX1JTCQkyMQotI2RlZmluZSBPUF9NQVNLX0ZSCQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZSCQkyMQotI2RlZmluZSBPUF9NQVNLX0ZNVAkJMHgxZgotI2RlZmluZSBPUF9TSF9GTVQJCTIxCi0jZGVmaW5lIE9QX01BU0tfQkNDCQkweDcKLSNkZWZpbmUgT1BfU0hfQkNDCQkxOAotI2RlZmluZSBPUF9NQVNLX0NPREUJCTB4M2ZmCi0jZGVmaW5lIE9QX1NIX0NPREUJCTE2Ci0jZGVmaW5lIE9QX01BU0tfQ09ERTIJCTB4M2ZmCi0jZGVmaW5lIE9QX1NIX0NPREUyCQk2Ci0jZGVmaW5lIE9QX01BU0tfUlQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUlQJCTE2Ci0jZGVmaW5lIE9QX01BU0tfRlQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlQJCTE2Ci0jZGVmaW5lIE9QX01BU0tfQ0FDSEUJCTB4MWYKLSNkZWZpbmUgT1BfU0hfQ0FDSEUJCTE2Ci0jZGVmaW5lIE9QX01BU0tfUkQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUkQJCTExCi0jZGVmaW5lIE9QX01BU0tfRlMJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlMJCTExCi0jZGVmaW5lIE9QX01BU0tfUFJFRlgJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUFJFRlgJCTExCi0jZGVmaW5lIE9QX01BU0tfQ0NDCQkweDcKLSNkZWZpbmUgT1BfU0hfQ0NDCQk4Ci0jZGVmaW5lIE9QX01BU0tfU1lTQ0FMTAkJMHhmZmZmZgotI2RlZmluZSBPUF9TSF9TWVNDQUxMCQk2Ci0jZGVmaW5lIE9QX01BU0tfU0hBTVQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfU0hBTVQJCTYKLSNkZWZpbmUgT1BfTUFTS19GRAkJMHgxZgotI2RlZmluZSBPUF9TSF9GRAkJNgotI2RlZmluZSBPUF9NQVNLX1RBUkdFVAkJMHgzZmZmZmZmCi0jZGVmaW5lIE9QX1NIX1RBUkdFVAkJMAotI2RlZmluZSBPUF9NQVNLX0NPUFoJCTB4MWZmZmZmZgotI2RlZmluZSBPUF9TSF9DT1BaCQkwCi0jZGVmaW5lIE9QX01BU0tfSU1NRURJQVRFCTB4ZmZmZgotI2RlZmluZSBPUF9TSF9JTU1FRElBVEUJCTAKLSNkZWZpbmUgT1BfTUFTS19ERUxUQQkJMHhmZmZmCi0jZGVmaW5lIE9QX1NIX0RFTFRBCQkwCi0jZGVmaW5lIE9QX01BU0tfRlVOQ1QJCTB4M2YKLSNkZWZpbmUgT1BfU0hfRlVOQ1QJCTAKLSNkZWZpbmUgT1BfTUFTS19TUEVDCQkweDNmCi0jZGVmaW5lIE9QX1NIX1NQRUMJCTAKLSNkZWZpbmUgT1BfU0hfTE9DQyAgICAgICAgICAgICAgOCAgICAgICAvKiBGUCBjb25kaXRpb24gY29kZSAqLwotI2RlZmluZSBPUF9TSF9ISUNDICAgICAgICAgICAgICAxOCAgICAgIC8qIEZQIGNvbmRpdGlvbiBjb2RlICovCi0jZGVmaW5lIE9QX01BU0tfQ0MgICAgICAgICAgICAgIDB4NwotI2RlZmluZSBPUF9TSF9DT1AxTk9STSAgICAgICAgICAyNSAgICAgIC8qIE5vcm1hbCBDT1AxIGVuY29kaW5nICovCi0jZGVmaW5lIE9QX01BU0tfQ09QMU5PUk0gICAgICAgIDB4MSAgICAgLyogYSBzaW5nbGUgYml0ICovCi0jZGVmaW5lIE9QX1NIX0NPUDFTUEVDICAgICAgICAgIDIxICAgICAgLyogQ09QMSBlbmNvZGluZ3MgKi8KLSNkZWZpbmUgT1BfTUFTS19DT1AxU1BFQyAgICAgICAgMHhmCi0jZGVmaW5lIE9QX01BU0tfQ09QMVNDTFIgICAgICAgIDB4NAotI2RlZmluZSBPUF9NQVNLX0NPUDFDTVAgICAgICAgICAweDMKLSNkZWZpbmUgT1BfU0hfQ09QMUNNUCAgICAgICAgICAgNAotI2RlZmluZSBPUF9TSF9GT1JNQVQgICAgICAgICAgICAyMSAgICAgIC8qIEZQIHNob3J0IGZvcm1hdCBmaWVsZCAqLwotI2RlZmluZSBPUF9NQVNLX0ZPUk1BVCAgICAgICAgICAweDcKLSNkZWZpbmUgT1BfU0hfVFJVRSAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19UUlVFICAgICAgICAgICAgMHgxCi0jZGVmaW5lIE9QX1NIX0dFICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIE9QX01BU0tfR0UgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgT1BfU0hfVU5TSUdORUQgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19VTlNJR05FRCAgICAgICAgMHgxCi0jZGVmaW5lIE9QX1NIX0hJTlQgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIE9QX01BU0tfSElOVCAgICAgICAgICAgIDB4MWYKLSNkZWZpbmUgT1BfU0hfTU1JICAgICAgICAgICAgICAgMCAgICAgICAvKiBNdWx0aW1lZGlhIChwYXJhbGxlbCkgb3AgKi8KLSNkZWZpbmUgT1BfTUFTS19NTUkgICAgICAgICAgICAgMHgzZiAKLSNkZWZpbmUgT1BfU0hfTU1JU1VCICAgICAgICAgICAgNgotI2RlZmluZSBPUF9NQVNLX01NSVNVQiAgICAgICAgICAweDFmCi0jZGVmaW5lIE9QX01BU0tfUEVSRlJFRwkJMHgxZgkvKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nICovCi0jZGVmaW5lIE9QX1NIX1BFUkZSRUcJCTEKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBpbnN0cnVjdGlvbi4gICovCi0KLXN0cnVjdCBtaXBzX29wY29kZQotewotICAvKiBUaGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSBhcmd1bWVudHMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGUgYmFzaWMgb3Bjb2RlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICBXaGVuIGFzc2VtYmxpbmcsIHRoaXMKLSAgICAgb3Bjb2RlIGlzIG1vZGlmaWVkIGJ5IHRoZSBhcmd1bWVudHMgdG8gcHJvZHVjZSB0aGUgYWN0dWFsIG9wY29kZQotICAgICB0aGF0IGlzIHVzZWQuICBJZiBwaW5mbyBpcyBJTlNOX01BQ1JPLCB0aGVuIHRoaXMgaXMgMC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7Ci0gIC8qIElmIHBpbmZvIGlzIG5vdCBJTlNOX01BQ1JPLCB0aGVuIHRoaXMgaXMgYSBiaXQgbWFzayBmb3IgdGhlCi0gICAgIHJlbGV2YW50IHBvcnRpb25zIG9mIHRoZSBvcGNvZGUgd2hlbiBkaXNhc3NlbWJsaW5nLiAgSWYgdGhlCi0gICAgIGFjdHVhbCBvcGNvZGUgYW5kZWQgd2l0aCB0aGUgbWF0Y2ggZmllbGQgZXF1YWxzIHRoZSBvcGNvZGUgZmllbGQsCi0gICAgIHRoZW4gd2UgaGF2ZSBmb3VuZCB0aGUgY29ycmVjdCBpbnN0cnVjdGlvbi4gIElmIHBpbmZvIGlzCi0gICAgIElOU05fTUFDUk8sIHRoZW4gdGhpcyBmaWVsZCBpcyB0aGUgbWFjcm8gaWRlbnRpZmllci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgLyogRm9yIGEgbWFjcm8sIHRoaXMgaXMgSU5TTl9NQUNSTy4gIE90aGVyd2lzZSwgaXQgaXMgYSBjb2xsZWN0aW9uCi0gICAgIG9mIGJpdHMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb24sIG5vdGFibHkgYW55IHJlbGV2YW50IGhhemFyZAotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgcGluZm87Ci0gIC8qIEEgY29sbGVjdGlvbiBvZiBiaXRzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9uIHNldHMgb2Ygd2hpY2ggdGhpcwotICAgICBpbnN0cnVjdGlvbiBvciBtYWNybyBpcyBhIG1lbWJlci4gKi8KLSAgdW5zaWduZWQgbG9uZyBtZW1iZXJzaGlwOwotfTsKLQotLyogVGhlc2UgYXJlIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXJzIGluIHRoZSBhcmdzIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbi4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmllbGRzIGFwcGVhcgotICAgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdXNlZC4gIENvbW1hcyBhbmQgcGFyZW50aGVzZXMgaW4gdGhlIGFyZ3MKLSAgIHN0cmluZyBhcmUgaWdub3JlZCB3aGVuIGFzc2VtYmxpbmcsIGFuZCB3cml0dGVuIGludG8gdGhlIG91dHB1dAotICAgd2hlbiBkaXNhc3NlbWJsaW5nLgotCi0gICBFYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgY29ycmVzcG9uZHMgdG8gYSBtYXNrIGZpZWxkIGRlZmluZWQgYWJvdmUuCi0KLSAgICI8IiA1IGJpdCBzaGlmdCBhbW91bnQgKE9QXypfU0hBTVQpCi0gICAiPiIgc2hpZnQgYW1vdW50IGJldHdlZW4gMzIgYW5kIDYzLCBzdG9yZWQgYWZ0ZXIgc3VidHJhY3RpbmcgMzIgKE9QXypfU0hBTVQpCi0gICAiYSIgMjYgYml0IHRhcmdldCBhZGRyZXNzIChPUF8qX1RBUkdFVCkKLSAgICJiIiA1IGJpdCBiYXNlIHJlZ2lzdGVyIChPUF8qX1JTKQotICAgImMiIDEwIGJpdCBicmVha3BvaW50IGNvZGUgKE9QXypfQ09ERSkKLSAgICJkIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciBzcGVjaWZpZXIgKE9QXypfUkQpCi0gICAiaCIgNSBiaXQgcHJlZnggaGludCAoT1BfKl9QUkVGWCkKLSAgICJpIiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIChPUF8qX0lNTUVESUFURSkKLSAgICJqIiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAoT1BfKl9ERUxUQSkKLSAgICJrIiA1IGJpdCBjYWNoZSBvcGNvZGUgaW4gdGFyZ2V0IHJlZ2lzdGVyIHBvc2l0aW9uIChPUF8qX0NBQ0hFKQotICAgIm8iIDE2IGJpdCBzaWduZWQgb2Zmc2V0IChPUF8qX0RFTFRBKQotICAgInAiIDE2IGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggdGFyZ2V0IGFkZHJlc3MgKE9QXypfREVMVEEpCi0gICAicSIgMTAgYml0IGV4dHJhIGJyZWFrcG9pbnQgY29kZSAoT1BfKl9DT0RFMikKLSAgICJyIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIHRhcmdldCAoT1BfKl9SUykKLSAgICJzIiA1IGJpdCBzb3VyY2UgcmVnaXN0ZXIgc3BlY2lmaWVyIChPUF8qX1JTKQotICAgInQiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKLSAgICJ1IiAxNiBiaXQgdXBwZXIgMTYgYml0cyBvZiBhZGRyZXNzIChPUF8qX0lNTUVESUFURSkKLSAgICJ2IiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChPUF8qX1JTKQotICAgInciIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHRhcmdldCBhbmQgZGVzdGluYXRpb24gKE9QXypfUlQpCi0gICAiQyIgMjUgYml0IGNvcHJvY2Vzc29yIGZ1bmN0aW9uIGNvZGUgKE9QXypfQ09QWikKLSAgICJCIiAyMCBiaXQgc3lzY2FsbCBmdW5jdGlvbiBjb2RlIChPUF8qX1NZU0NBTEwpCi0gICAieCIgYWNjZXB0IGFuZCBpZ25vcmUgcmVnaXN0ZXIgbmFtZQotICAgInoiIG11c3QgYmUgemVybyByZWdpc3RlcgotCi0gICBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnM6Ci0gICAiRCIgNSBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKE9QXypfRkQpCi0gICAiTSIgMyBiaXQgY29tcGFyZSBjb25kaXRpb24gY29kZSAoT1BfKl9DQ0MpIChvbmx5IHVzZWQgZm9yIG1pcHM0IGFuZCB1cCkKLSAgICJOIiAzIGJpdCBicmFuY2ggY29uZGl0aW9uIGNvZGUgKE9QXypfQkNDKSAob25seSB1c2VkIGZvciBtaXBzNCBhbmQgdXApCi0gICAiUyIgNSBiaXQgZnMgc291cmNlIDEgcmVnaXN0ZXIgKE9QXypfRlMpCi0gICAiVCIgNSBiaXQgZnQgc291cmNlIDIgcmVnaXN0ZXIgKE9QXypfRlQpCi0gICAiUiIgNSBiaXQgZnIgc291cmNlIDMgcmVnaXN0ZXIgKE9QXypfRlIpCi0gICAiViIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGZsb2F0aW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE9QXypfRlMpCi0gICAiVyIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGZsb2F0aW5nIHRhcmdldCBhbmQgZGVzdGluYXRpb24gKE9QXypfRlQpCi0KLSAgIENvcHJvY2Vzc29yIGluc3RydWN0aW9uczoKLSAgICJFIiA1IGJpdCB0YXJnZXQgcmVnaXN0ZXIgKE9QXypfUlQpCi0gICAiRyIgNSBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKE9QXypfUkQpCi0gICAiUCIgNSBiaXQgcGVyZm9ybWFuY2UtbW9uaXRvciByZWdpc3RlciAoT1BfKl9QRVJGUkVHKQotCi0gICBNYWNybyBpbnN0cnVjdGlvbnM6Ci0gICAiQSIgR2VuZXJhbCAzMiBiaXQgZXhwcmVzc2lvbgotICAgIkkiIDMyIGJpdCBpbW1lZGlhdGUKLSAgICJGIiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLnJkYXRhCi0gICAiTCIgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5saXQ4Ci0gICAiZiIgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICAibCIgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5saXQ0Ci0KLSAgIE90aGVyOgotICAgIigpIiBwYXJlbnMgc3Vycm91bmRpbmcgb3B0aW9uYWwgdmFsdWUKLSAgICIsIiAgc2VwYXJhdGVzIG9wZXJhbmRzCi0KLSAgIENoYXJhY3RlcnMgdXNlZCBzbyBmYXIsIGZvciBxdWljayByZWZlcmVuY2Ugd2hlbiBhZGRpbmcgbW9yZToKLSAgICI8PigpLCIKLSAgICJBQkNERUZHSUxNTlNUUlZXIgotICAgImFiY2RmaGlqa2xvcHFyc3R1dnd4eiIKLSovCi0KLS8qIFRoZXNlIGFyZSB0aGUgYml0cyB3aGljaCBtYXkgYmUgc2V0IGluIHRoZSBwaW5mbyBmaWVsZCBvZiBhbgotICAgaW5zdHJ1Y3Rpb25zLCBpZiBpdCBpcyBub3QgZXF1YWwgdG8gSU5TTl9NQUNSTy4gICovCi0KLS8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SRC4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfR1BSX0QgICAgICAgICAgICAweDAwMDAwMDAxCi0vKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUlQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0dQUl9UICAgICAgICAgICAgMHgwMDAwMDAwMgotLyogTW9kaWZpZXMgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIDMxLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9HUFJfMzEgICAgICAgICAgIDB4MDAwMDAwMDQKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZELiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfRCAgICAgICAgICAgIDB4MDAwMDAwMDgKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZTLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfUyAgICAgICAgICAgIDB4MDAwMDAwMTAKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZULiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfVCAgICAgICAgICAgIDB4MDAwMDAwMjAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SUy4gICovCi0jZGVmaW5lIElOU05fUkVBRF9HUFJfUyAgICAgICAgICAgICAweDAwMDAwMDQwCi0vKiBSZWFkcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUlQuICAqLwotI2RlZmluZSBJTlNOX1JFQURfR1BSX1QgICAgICAgICAgICAgMHgwMDAwMDA4MAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlMuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1MgICAgICAgICAgICAgMHgwMDAwMDEwMAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlQuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1QgICAgICAgICAgICAgMHgwMDAwMDIwMAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlIuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1IJCSAgICAweDAwMDAwNDAwCi0vKiBNb2RpZmllcyBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZS4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfQ09ORF9DT0RFICAgICAgICAweDAwMDAwODAwCi0vKiBSZWFkcyBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZS4gICovCi0jZGVmaW5lIElOU05fUkVBRF9DT05EX0NPREUgICAgICAgICAweDAwMDAxMDAwCi0vKiBUTEIgb3BlcmF0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl9UTEIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLS8qIFJlYWRzIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG90aGVyIHRoYW4gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX0NPUCAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotLyogSW5zdHJ1Y3Rpb24gbG9hZHMgdmFsdWUgZnJvbSBtZW1vcnksIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fTE9BRF9NRU1PUllfREVMQVkgICAgICAweDAwMDA4MDAwCi0vKiBJbnN0cnVjdGlvbiBsb2FkcyB2YWx1ZSBmcm9tIGNvcHJvY2Vzc29yLCByZXF1aXJpbmcgZGVsYXkuICAqLwotI2RlZmluZSBJTlNOX0xPQURfQ09QUk9DX0RFTEFZCSAgICAweDAwMDEwMDAwCi0vKiBJbnN0cnVjdGlvbiBoYXMgdW5jb25kaXRpb25hbCBicmFuY2ggZGVsYXkgc2xvdC4gICovCi0jZGVmaW5lIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSAgICAweDAwMDIwMDAwCi0vKiBJbnN0cnVjdGlvbiBoYXMgY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5IHNsb3QuICAqLwotI2RlZmluZSBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZICAgICAgMHgwMDA0MDAwMAotLyogQ29uZGl0aW9uYWwgYnJhbmNoIGxpa2VseTogaWYgYnJhbmNoIG5vdCB0YWtlbiwgaW5zbiBudWxsaWZpZWQuICAqLwotI2RlZmluZSBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWQkgICAgMHgwMDA4MDAwMAotLyogTW92ZXMgdG8gY29wcm9jZXNzb3IgcmVnaXN0ZXIsIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fQ09QUk9DX01PVkVfREVMQVkgICAgICAweDAwMTAwMDAwCi0vKiBMb2FkcyBjb3Byb2Nlc3NvciByZWdpc3RlciBmcm9tIG1lbW9yeSwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZICAgIDB4MDAyMDAwMDAKLS8qIFJlYWRzIHRoZSBISSByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fUkVBRF9ISQkJICAgIDB4MDA0MDAwMDAKLS8qIFJlYWRzIHRoZSBMTyByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fUkVBRF9MTwkJICAgIDB4MDA4MDAwMDAKLS8qIE1vZGlmaWVzIHRoZSBISSByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfSEkJCSAgICAweDAxMDAwMDAwCi0vKiBNb2RpZmllcyB0aGUgTE8gcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0xPCQkgICAgMHgwMjAwMDAwMAotLyogVGFrZXMgYSB0cmFwIChlYXNpZXIgdG8ga2VlcCBvdXQgb2YgZGVsYXkgc2xvdCkuICAqLwotI2RlZmluZSBJTlNOX1RSQVAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gc3RvcmVzIHZhbHVlIGludG8gbWVtb3J5LiAgKi8KLSNkZWZpbmUgSU5TTl9TVE9SRV9NRU1PUlkJICAgIDB4MDgwMDAwMDAKLS8qIEluc3RydWN0aW9uIHVzZXMgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludC4gICovCi0jZGVmaW5lIEZQX1MJCQkgICAgMHgxMDAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gdXNlcyBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LiAgKi8KLSNkZWZpbmUgRlBfRAkJCSAgICAweDIwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0eDM5J3MgaW50ZWdlciBtdWx0aXBseSBmYW1pbHkuICAgICovCi0jZGVmaW5lIElOU05fTVVMVCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBzeW5jaHJvbml6ZSBzaGFyZWQgbWVtb3J5LiAgKi8KLSNkZWZpbmUgSU5TTl9TWU5DCQkgICAgMHg4MDAwMDAwMAotCi0vKiBJbnN0cnVjdGlvbiBpcyBhY3R1YWxseSBhIG1hY3JvLiAgSXQgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlCi0gICBkaXNhc3NlbWJsZXIsIGFuZCByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9NQUNSTyAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKLQotCi0KLQotCi0vKiBNSVBTIElTQSBmaWVsZC0tQ1BVIGxldmVsIGF0IHdoaWNoIGluc24gaXMgc3VwcG9ydGVkLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EJCSAgICAweDAwMDAwMDBGCi0vKiBBbiBpbnN0cnVjdGlvbiB3aGljaCBpcyBub3QgcGFydCBvZiBhbnkgYmFzaWMgTUlQUyBJU0EuCi0gICAoaWUgaXQgaXMgYSBjaGlwIHNwZWNpZmljIGluc3RydWN0aW9uKSAgKi8KLSNkZWZpbmUgSU5TTl9OT19JU0EJCSAgICAweDAwMDAwMDAwCi0vKiBNSVBTIElTQSAxIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0ExCQkgICAgMHgwMDAwMDAwMQotLyogTUlQUyBJU0EgMiBpbnN0cnVjdGlvbiAoUjYwMDAgb3IgUjQwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EyCQkgICAgMHgwMDAwMDAwMgotLyogTUlQUyBJU0EgMyBpbnN0cnVjdGlvbiAoUjQwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EzCQkgICAgMHgwMDAwMDAwMwotLyogTUlQUyBJU0EgNCBpbnN0cnVjdGlvbiAoUjgwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0E0CQkgICAgMHgwMDAwMDAwNAotI2RlZmluZSBJTlNOX0lTQTUJCSAgICAweDAwMDAwMDA1Ci0KLS8qIENoaXAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgYXJlIGJpdG1hc2tzLiAgKi8KLS8qIE1JUFMgUjQ2NTAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOXzQ2NTAJCSAgICAweDAwMDAwMDEwCi0vKiBMU0kgUjQwMTAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOXzQwMTAJCSAgICAweDAwMDAwMDIwCi0vKiBORUMgVlI0MTAwIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBJTlNOXzQxMDAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotLyogVG9zaGliYSBSMzkwMCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElOU05fMzkwMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qIFRlc3QgZm9yIG1lbWJlcnNoaXAgaW4gYW4gSVNBIGluY2x1ZGluZyBjaGlwIHNwZWNpZmljIElTQXMuCi0gICBJTlNOIGlzIHBvaW50ZXIgdG8gYW4gZWxlbWVudCBvZiB0aGUgb3Bjb2RlIHRhYmxlOyBJU0EgaXMgdGhlCi0gICBzcGVjaWZpZWQgSVNBIHRvIHRlc3QgYWdhaW5zdDsgYW5kIENQVSBpcyB0aGUgQ1BVIHNwZWNpZmljIElTQQotICAgdG8gdGVzdCwgb3IgemVybyBpZiBubyBDUFUgc3BlY2lmaWMgSVNBIHRlc3QgaXMgZGVzaXJlZC4gKi8gCi0KLSNkZWZpbmUgT1BDT0RFX0lTX01FTUJFUihpbnNuLGlzYSxjcHUpIAkJCQlcCi0gICAgKCgoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpICE9IDAJCQlcCi0gICAgICAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpIDw9IGlzYSkJCVwKLSAgICAgfHwgKGNwdSA9PSA0NjUwCQkJCQkJXAotCSAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSAhPSAwKQkJXAotICAgICB8fCAoY3B1ID09IDQwMTAJCQkJCQlcCi0JICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzQwMTApICE9IDApCQlcCi0gICAgIHx8ICgoY3B1ID09IDQxMDAJCQkJCQlcCi0JICB8fCBjcHUgPT0gNDExMQkJCQkJXAotCSAgKQkJCQkJCQlcCi0JICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzQxMDApICE9IDApCQlcCi0gICAgIHx8IChjcHUgPT0gMzkwMAkJCQkJCVwKLQkgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fMzkwMCkgIT0gMCkpCi0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIG1hY3JvIGV4cGFuZGVkIGluc3RydWN0aW9ucy4KLSAqCi0gKiBfSSBhcHBlbmRlZCBtZWFucyBpbW1lZGlhdGUKLSAqIF9BIGFwcGVuZGVkIG1lYW5zIGFkZHJlc3MKLSAqIF9BQiBhcHBlbmRlZCBtZWFucyBhZGRyZXNzIHdpdGggYmFzZSByZWdpc3RlcgotICogX0QgYXBwZW5kZWQgbWVhbnMgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gKiBfUyBhcHBlbmRlZCBtZWFucyAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAqLwotZW51bSB7Ci0gICAgTV9BQlMsCi0gICAgTV9BRERfSSwKLSAgICBNX0FERFVfSSwKLSAgICBNX0FORF9JLAotICAgIE1fQkVRLAotICAgIE1fQkVRX0ksCi0gICAgTV9CRVFMX0ksCi0gICAgTV9CR0UsCi0gICAgTV9CR0VMLAotICAgIE1fQkdFX0ksCi0gICAgTV9CR0VMX0ksCi0gICAgTV9CR0VVLAotICAgIE1fQkdFVUwsCi0gICAgTV9CR0VVX0ksCi0gICAgTV9CR0VVTF9JLAotICAgIE1fQkdULAotICAgIE1fQkdUTCwKLSAgICBNX0JHVF9JLAotICAgIE1fQkdUTF9JLAotICAgIE1fQkdUVSwKLSAgICBNX0JHVFVMLAotICAgIE1fQkdUVV9JLAotICAgIE1fQkdUVUxfSSwKLSAgICBNX0JMRSwKLSAgICBNX0JMRUwsCi0gICAgTV9CTEVfSSwKLSAgICBNX0JMRUxfSSwKLSAgICBNX0JMRVUsCi0gICAgTV9CTEVVTCwKLSAgICBNX0JMRVVfSSwKLSAgICBNX0JMRVVMX0ksCi0gICAgTV9CTFQsCi0gICAgTV9CTFRMLAotICAgIE1fQkxUX0ksCi0gICAgTV9CTFRMX0ksCi0gICAgTV9CTFRVLAotICAgIE1fQkxUVUwsCi0gICAgTV9CTFRVX0ksCi0gICAgTV9CTFRVTF9JLAotICAgIE1fQk5FLAotICAgIE1fQk5FX0ksCi0gICAgTV9CTkVMX0ksCi0gICAgTV9EQUJTLAotICAgIE1fREFERF9JLAotICAgIE1fREFERFVfSSwKLSAgICBNX0RESVZfMywKLSAgICBNX0RESVZfM0ksCi0gICAgTV9ERElWVV8zLAotICAgIE1fRERJVlVfM0ksCi0gICAgTV9ESVZfMywKLSAgICBNX0RJVl8zSSwKLSAgICBNX0RJVlVfMywKLSAgICBNX0RJVlVfM0ksCi0gICAgTV9ETEFfQUIsCi0gICAgTV9ETEksCi0gICAgTV9ETVVMLAotICAgIE1fRE1VTF9JLCAKLSAgICBNX0RNVUxPLAotICAgIE1fRE1VTE9fSSwgCi0gICAgTV9ETVVMT1UsCi0gICAgTV9ETVVMT1VfSSwgCi0gICAgTV9EUkVNXzMsCi0gICAgTV9EUkVNXzNJLAotICAgIE1fRFJFTVVfMywKLSAgICBNX0RSRU1VXzNJLAotICAgIE1fRFNVQl9JLAotICAgIE1fRFNVQlVfSSwKLSAgICBNX0RTVUJVX0lfMiwKLSAgICBNX0pfQSwKLSAgICBNX0pBTF8xLAotICAgIE1fSkFMXzIsCi0gICAgTV9KQUxfQSwKLSAgICBNX0xfRE9CLAotICAgIE1fTF9EQUIsCi0gICAgTV9MQV9BQiwKLSAgICBNX0xCX0EsCi0gICAgTV9MQl9BQiwKLSAgICBNX0xCVV9BLAotICAgIE1fTEJVX0FCLAotICAgIE1fTERfQSwKLSAgICBNX0xEX09CLAotICAgIE1fTERfQUIsCi0gICAgTV9MREMxX0FCLAotICAgIE1fTERDMl9BQiwKLSAgICBNX0xEQzNfQUIsCi0gICAgTV9MRExfQUIsCi0gICAgTV9MRFJfQUIsCi0gICAgTV9MSF9BLAotICAgIE1fTEhfQUIsCi0gICAgTV9MSFVfQSwKLSAgICBNX0xIVV9BQiwKLSAgICBNX0xJLAotICAgIE1fTElfRCwKLSAgICBNX0xJX0RELAotICAgIE1fTElfUywKLSAgICBNX0xJX1NTLAotICAgIE1fTExfQUIsCi0gICAgTV9MTERfQUIsCi0gICAgTV9MU19BLAotICAgIE1fTFdfQSwKLSAgICBNX0xXX0FCLAotICAgIE1fTFdDMF9BLAotICAgIE1fTFdDMF9BQiwKLSAgICBNX0xXQzFfQSwKLSAgICBNX0xXQzFfQUIsCi0gICAgTV9MV0MyX0EsCi0gICAgTV9MV0MyX0FCLAotICAgIE1fTFdDM19BLAotICAgIE1fTFdDM19BQiwKLSAgICBNX0xXTF9BLAotICAgIE1fTFdMX0FCLAotICAgIE1fTFdSX0EsCi0gICAgTV9MV1JfQUIsCi0gICAgTV9MV1VfQUIsCi0gICAgTV9NVUwsCi0gICAgTV9NVUxfSSwgCi0gICAgTV9NVUxPLAotICAgIE1fTVVMT19JLCAKLSAgICBNX01VTE9VLAotICAgIE1fTVVMT1VfSSwgCi0gICAgTV9OT1JfSSwKLSAgICBNX09SX0ksCi0gICAgTV9SRU1fMywKLSAgICBNX1JFTV8zSSwKLSAgICBNX1JFTVVfMywKLSAgICBNX1JFTVVfM0ksCi0gICAgTV9ST0wsCi0gICAgTV9ST0xfSSwKLSAgICBNX1JPUiwKLSAgICBNX1JPUl9JLAotICAgIE1fU19EQSwKLSAgICBNX1NfRE9CLAotICAgIE1fU19EQUIsCi0gICAgTV9TX1MsCi0gICAgTV9TQ19BQiwKLSAgICBNX1NDRF9BQiwKLSAgICBNX1NEX0EsCi0gICAgTV9TRF9PQiwKLSAgICBNX1NEX0FCLAotICAgIE1fU0RDMV9BQiwKLSAgICBNX1NEQzJfQUIsCi0gICAgTV9TREMzX0FCLAotICAgIE1fU0RMX0FCLAotICAgIE1fU0RSX0FCLAotICAgIE1fU0VRLAotICAgIE1fU0VRX0ksCi0gICAgTV9TR0UsCi0gICAgTV9TR0VfSSwKLSAgICBNX1NHRVUsCi0gICAgTV9TR0VVX0ksCi0gICAgTV9TR1QsCi0gICAgTV9TR1RfSSwKLSAgICBNX1NHVFUsCi0gICAgTV9TR1RVX0ksCi0gICAgTV9TTEUsCi0gICAgTV9TTEVfSSwKLSAgICBNX1NMRVUsCi0gICAgTV9TTEVVX0ksCi0gICAgTV9TTFRfSSwKLSAgICBNX1NMVFVfSSwKLSAgICBNX1NORSwKLSAgICBNX1NORV9JLAotICAgIE1fU0JfQSwKLSAgICBNX1NCX0FCLAotICAgIE1fU0hfQSwKLSAgICBNX1NIX0FCLAotICAgIE1fU1dfQSwKLSAgICBNX1NXX0FCLAotICAgIE1fU1dDMF9BLAotICAgIE1fU1dDMF9BQiwKLSAgICBNX1NXQzFfQSwKLSAgICBNX1NXQzFfQUIsCi0gICAgTV9TV0MyX0EsCi0gICAgTV9TV0MyX0FCLAotICAgIE1fU1dDM19BLAotICAgIE1fU1dDM19BQiwKLSAgICBNX1NXTF9BLAotICAgIE1fU1dMX0FCLAotICAgIE1fU1dSX0EsCi0gICAgTV9TV1JfQUIsCi0gICAgTV9TVUJfSSwKLSAgICBNX1NVQlVfSSwKLSAgICBNX1NVQlVfSV8yLAotICAgIE1fVEVRX0ksCi0gICAgTV9UR0VfSSwKLSAgICBNX1RHRVVfSSwKLSAgICBNX1RMVF9JLAotICAgIE1fVExUVV9JLAotICAgIE1fVE5FX0ksCi0gICAgTV9UUlVOQ1dELAotICAgIE1fVFJVTkNXUywKLSAgICBNX1VMRCwKLSAgICBNX1VMRF9BLAotICAgIE1fVUxILAotICAgIE1fVUxIX0EsCi0gICAgTV9VTEhVLAotICAgIE1fVUxIVV9BLAotICAgIE1fVUxXLAotICAgIE1fVUxXX0EsCi0gICAgTV9VU0gsCi0gICAgTV9VU0hfQSwKLSAgICBNX1VTVywKLSAgICBNX1VTV19BLAotICAgIE1fVVNELAotICAgIE1fVVNEX0EsCi0gICAgTV9YT1JfSSwKLSAgICBNX0NPUDAsCi0gICAgTV9DT1AxLAotICAgIE1fQ09QMiwKLSAgICBNX0NPUDMsCi0gICAgTV9OVU1fTUFDUk9TCi19OwotCi0KLS8qIFRoZSBvcmRlciBvZiBvdmVybG9hZGVkIGluc3RydWN0aW9ucyBtYXR0ZXJzLiAgTGFiZWwgYXJndW1lbnRzIGFuZAotICAgcmVnaXN0ZXIgYXJndW1lbnRzIGxvb2sgdGhlIHNhbWUuIEluc3RydWN0aW9ucyB0aGF0IGNhbiBoYXZlIGVpdGhlcgotICAgZm9yIGFyZ3VtZW50cyBtdXN0IGFwZWFyIGluIHRoZSBjb3JyZWN0IG9yZGVyIGluIHRoaXMgdGFibGUgZm9yIHRoZQotICAgYXNzZW1ibGVyIHRvIHBpY2sgdGhlIHJpZ2h0IG9uZS4gSW4gb3RoZXIgd29yZHMsIGVudHJpZXMgd2l0aAotICAgaW1tZWRpYXRlIG9wZXJhbmRzIG11c3QgYXBlYXIgYWZ0ZXIgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gd2l0aAotICAgcmVnaXN0ZXJzLgotCi0gICBNYW55IGluc3RydWN0aW9ucyBhcmUgc2hvcnQgaGFuZCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zIChpLmUuLCBUaGUKLSAgIGphbCA8cmVnaXN0ZXI+IGluc3RydWN0aW9uIGlzIHNob3J0IGZvciBqYWxyIDxyZWdpc3Rlcj4pLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBtaXBzX2J1aWx0aW5fb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzOwotZXh0ZXJuIHN0cnVjdCBtaXBzX29wY29kZSAqbWlwc19vcGNvZGVzOwotZXh0ZXJuIGludCBiZmRfbWlwc19udW1fb3Bjb2RlczsKLSNkZWZpbmUgTlVNT1BDT0RFUyBiZmRfbWlwc19udW1fb3Bjb2RlcwotCi0MCi0vKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgYWRkcyBkZWZpbml0aW9ucyBmb3IgdGhlIG1pcHMxNiBUaW55UklTQwotICAgcHJvY2Vzc29yLiAgKi8KLQotLyogVGhlc2UgYXJlIHRoZSBiaXRtYXNrcyBhbmQgc2hpZnQgY291bnRzIHVzZWQgZm9yIHRoZSBkaWZmZXJlbnQKLSAgIGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIE90aGVyIHRoYW4gT1AsIG5vIG1hc2tzIGFyZQotICAgcHJvdmlkZWQgZm9yIHRoZSBmaXhlZCBwb3J0aW9ucyBvZiBhbiBpbnN0cnVjdGlvbiwgc2luY2UgdGhleSBhcmUKLSAgIG5vdCBuZWVkZWQuCi0KLSAgIFRoZSBJIGZvcm1hdCB1c2VzIElNTTExLgotCi0gICBUaGUgUkkgZm9ybWF0IHVzZXMgUlggYW5kIElNTTguCi0KLSAgIFRoZSBSUiBmb3JtYXQgdXNlcyBSWCwgYW5kIFJZLgotCi0gICBUaGUgUlJJIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIElNTTUuCi0KLSAgIFRoZSBSUlIgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgUlouCi0KLSAgIFRoZSBSUklfQSBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBJTU00LgotCi0gICBUaGUgU0hJRlQgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgU0hBTVQuCi0KLSAgIFRoZSBJOCBmb3JtYXQgdXNlcyBJTU04LgotCi0gICBUaGUgSThfTU9WUjMyIGZvcm1hdCB1c2VzIFJZIGFuZCBSRUdSMzIuCi0KLSAgIFRoZSBJUl9NT1YzMlIgZm9ybWF0IHVzZXMgUkVHMzJSIGFuZCBNT1YzMlouCi0KLSAgIFRoZSBJNjQgZm9ybWF0IHVzZXMgSU1NOC4KLQotICAgVGhlIFJJNjQgZm9ybWF0IHVzZXMgUlkgYW5kIElNTTUuCi0gICAqLwotCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfT1AJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9PUAkJMTEKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU0xMQkweDdmZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU0xMQkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUlgJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX1JYCQk4Ci0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NOAkweGZmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTgJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JZCTB4NwotI2RlZmluZSBNSVBTMTZPUF9TSF9SWQkJNQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTUJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU01CTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWgkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUloJCTIKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU00CTB4ZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU00CTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SRUdSMzIJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9SRUdSMzIJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JFRzMyUgkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX1JFRzMyUgkzCi0jZGVmaW5lIE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSKGkpICgoKChpKSA+PiA1KSAmIDcpIHwgKChpKSAmIDB4MTgpKQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX01PVkUzMloJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX01PVkUzMloJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTYJMHgzZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU02CTUKLQotLyogVGhlc2UgYXJlIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXJzIGluIHRoZSBhcmdzIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbi4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmllbGRzIGFwcGVhcgotICAgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdXNlZC4gIENvbW1hcyBhbmQgcGFyZW50aGVzZXMgaW4gdGhlIGFyZ3MKLSAgIHN0cmluZyBhcmUgaWdub3JlZCB3aGVuIGFzc2VtYmxpbmcsIGFuZCB3cml0dGVuIGludG8gdGhlIG91dHB1dAotICAgd2hlbiBkaXNhc3NlbWJsaW5nLgotCi0gICAieSIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlkpCi0gICAieCIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlgpCi0gICAieiIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlopCi0gICAiWiIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfTU9WRTMyWikKLSAgICJ2IiAzIGJpdCBzYW1lIHJlZ2lzdGVyIGFzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE1JUFMxNk9QXypfUlgpCi0gICAidyIgMyBiaXQgc2FtZSByZWdpc3RlciBhcyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChNSVBTMTZPUF8qX1JZKQotICAgIjAiIHplcm8gcmVnaXN0ZXIgKCQwKQotICAgIlMiIHN0YWNrIHBvaW50ZXIgKCRzcCBvciAkMjkpCi0gICAiUCIgcHJvZ3JhbSBjb3VudGVyCi0gICAiUiIgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgKCRyYSBvciAkMzEpCi0gICAiWCIgNSBiaXQgTUlQUyByZWdpc3RlciAoTUlQUzE2T1BfKl9SRUdSMzIpCi0gICAiWSIgNSBiaXQgTUlQUyByZWdpc3RlciAoTUlQUzE2T1BfKl9SRUczMlIpCi0gICAiNiIgNiBiaXQgdW5zaWduZWQgYnJlYWsgY29kZSAoTUlQUzE2T1BfKl9JTU02KQotICAgImEiIDI2IGJpdCBqdW1wIGFkZHJlc3MKLSAgICJlIiAxMSBiaXQgZXh0ZW5zaW9uIHZhbHVlCi0gICAibCIgcmVnaXN0ZXIgbGlzdCBmb3IgZW50cnkgaW5zdHJ1Y3Rpb24KLSAgICJMIiByZWdpc3RlciBsaXN0IGZvciBleGl0IGluc3RydWN0aW9uCi0KLSAgIFRoZSByZW1haW5pbmcgY29kZXMgbWF5IGJlIGV4dGVuZGVkLiAgRXhjZXB0IGFzIG90aGVyd2lzZSBub3RlZCwKLSAgIHRoZSBmdWxsIGV4dGVuZGVkIG9wZXJhbmQgaXMgYSAxNiBiaXQgc2lnbmVkIHZhbHVlLgotICAgIjwiIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWikgKGZ1bGwgNSBiaXQgdW5zaWduZWQpCi0gICAiPiIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JYKSAoZnVsbCA1IGJpdCB1bnNpZ25lZCkKLSAgICJbIiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlopIChmdWxsIDYgYml0IHVuc2lnbmVkKQotICAgIl0iIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWCkgKGZ1bGwgNiBiaXQgdW5zaWduZWQpCi0gICAiNCIgNCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNCkgKGZ1bGwgMTUgYml0IHNpZ25lZCkKLSAgICI1IiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTUpCi0gICAiSCIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogMiAoTUlQUzE2T1BfKl9JTU01KQotICAgIlciIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDQgKE1JUFMxNk9QXypfSU1NNSkKLSAgICJEIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA4IChNSVBTMTZPUF8qX0lNTTUpCi0gICAiaiIgNSBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNSkKLSAgICI4IiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpCi0gICAiViIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogNCAoTUlQUzE2T1BfKl9JTU04KQotICAgIkMiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NOCkKLSAgICJVIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpIChmdWxsIDE2IGJpdCB1bnNpZ25lZCkKLSAgICJrIiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU04KQotICAgIksiIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKiA4IChNSVBTMTZPUF8qX0lNTTgpCi0gICAicCIgOCBiaXQgY29uZGl0aW9uYWwgYnJhbmNoIGFkZHJlc3MgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJxIiAxMSBiaXQgYnJhbmNoIGFkZHJlc3MgKE1JUFMxNk9QXypfSU1NMTEpCi0gICAiQSIgOCBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDQgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJCIiA1IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogOCAoTUlQUzE2T1BfKl9JTU01KQotICAgIkUiIDUgYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA0IChNSVBTMTZPUF8qX0lNTTUpCi0gICAqLwotCi0vKiBGb3IgdGhlIG1pcHMxNiwgd2UgdXNlIHRoZSBzYW1lIG9wY29kZSB0YWJsZSBmb3JtYXQgYW5kIGEgZmV3IG9mCi0gICB0aGUgc2FtZSBmbGFncy4gIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIGZsYWdzIGFyZSBkaWZmZXJlbnQuICAqLwotCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWC4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1gJCSAgICAweDAwMDAwMDAxCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWS4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1kJCSAgICAweDAwMDAwMDAyCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1oJCSAgICAweDAwMDAwMDA0Ci0vKiBNb2RpZmllcyB0aGUgVCAoJDI0KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1QJCSAgICAweDAwMDAwMDA4Ci0vKiBNb2RpZmllcyB0aGUgU1AgKCQyOSkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9TUAkJICAgIDB4MDAwMDAwMTAKLS8qIE1vZGlmaWVzIHRoZSBSQSAoJDMxKSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFXzMxCQkgICAgMHgwMDAwMDAyMAotLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JFRzMyUi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZCQkgICAgMHgwMDAwMDA0MAotLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlguICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1gJCSAgICAweDAwMDAwMDgwCi0vKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWS4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWQkJICAgIDB4MDAwMDAxMDAKLS8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX01PVkUzMlouICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1oJCSAgICAweDAwMDAwMjAwCi0vKiBSZWFkcyB0aGUgVCAoJDI0KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfVAkJICAgIDB4MDAwMDA0MDAKLS8qIFJlYWRzIHRoZSBTUCAoJDI5KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfU1AJCSAgICAweDAwMDAwODAwCi0vKiBSZWFkcyB0aGUgUkEgKCQzMSkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEXzMxCQkgICAgMHgwMDAwMTAwMAotLyogUmVhZHMgdGhlIHByb2dyYW0gY291bnRlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfUEMJCSAgICAweDAwMDAyMDAwCi0vKiBSZWFkcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUkVHUjMyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9HUFJfWAkJICAgIDB4MDAwMDQwMDAKLS8qIElzIGEgYnJhbmNoIGluc24uICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX0JSQU5DSCAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLQotLyogVGhlIGZvbGxvd2luZyBmbGFncyBoYXZlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgbWlwczE2IG9wY29kZQotICAgdGFibGU6Ci0gICBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLSAgIElOU05fQ09ORF9CUkFOQ0hfREVMQVkKLSAgIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZIChuZXZlciB1c2VkKQotICAgSU5TTl9SRUFEX0hJCi0gICBJTlNOX1JFQURfTE8KLSAgIElOU05fV1JJVEVfSEkKLSAgIElOU05fV1JJVEVfTE8KLSAgIElOU05fVFJBUAotICAgSU5TTl9JU0EzCi0gICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHMxNl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGJmZF9taXBzMTZfbnVtX29wY29kZXM7Ci0KLSNlbmRpZiAvKiBfTUlQU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oIGIvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZhOTRiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL21uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKiBtbjEwMjAwLmggLS0gSGVhZGVyIGZpbGUgZm9yIE1hdHN1c2hpdGEgMTAyMDAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSmVmZiBMYXcsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTU4xMDIwMF9ICi0jZGVmaW5lIE1OMTAyMDBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMjAwX29wY29kZS4gICovCi0KLXN0cnVjdCBtbjEwMjAwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogVGhlIGZvcm1hdCBvZiB0aGlzIG9wY29kZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0OwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlIG1uMTAyMDBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBtbjEwMjAwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAyMDBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCBtbjEwMjAwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBtbjEwMjAwX29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCBtbjEwMjAwX29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kLiAgKi8KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0RSRUcgMHgxCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0FSRUcgMHgyCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BTVyAweDQKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTURSIDB4OAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgMHgxMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFIDB4MjAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUEFSRU4gMHg0MAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRCAweDgwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIDB4MTAwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0sgMHgyMDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUENSRUwgMHg0MDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTUVNQUREUiAweDgwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9SRUxBWCAweDEwMDAKLQotI2RlZmluZSBGTVRfMSAxCi0jZGVmaW5lIEZNVF8yIDIKLSNkZWZpbmUgRk1UXzMgMwotI2RlZmluZSBGTVRfNCA0Ci0jZGVmaW5lIEZNVF81IDUKLSNkZWZpbmUgRk1UXzYgNgotI2RlZmluZSBGTVRfNyA3Ci0jZW5kaWYgLyogTU4xMDIwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmggYi9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZjAzNjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qIG1uMTAzMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTWF0c3VzaGl0YSAxMDMwMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKZWZmIExhdywgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNTjEwMzAwX0gKLSNkZWZpbmUgTU4xMDMwMF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAzMDBfb3Bjb2RlLiAgKi8KLQotI2RlZmluZSBNTjEwMzAwX01BWF9PUEVSQU5EUyA4Ci1zdHJ1Y3QgbW4xMDMwMF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEEgYml0bWFzay4gIEZvciBlYWNoIG9wZXJhbmQsIG5vbnplcm8gaWYgaXQgbXVzdCBub3QgaGF2ZSB0aGUgc2FtZQotICAgICByZWdpc3RlciBzcGVjaWZpY2F0aW9uIGFzIGFsbCBvdGhlciBvcGVyYW5kcyB3aXRoIGEgbm9uemVybyBiaXQgaW4KLSAgICAgdGhpcyBmbGFnLiAgaWUgMHg4MSB3b3VsZCBpbmRpY2F0ZSB0aGF0IG9wZXJhbmRzIDcgYW5kIDAgbXVzdCBub3QKLSAgICAgbWF0Y2guICBOb3RlIHRoYXQgd2UgY291bnQgb3BlcmFuZHMgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFzIHRoZXkgYXBwZWFyCi0gICAgIGluIHRoZSBvcGVyYW5kcyBzcGVjaWZpY2F0aW9uIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgaW50IG5vX21hdGNoX29wZXJhbmRzOwotCi0gIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBvcGNvZGUuICAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdDsKLQotICAvKiBCaXRtYXNrIGluZGljYXRpbmcgd2hhdCBjcHUgdmFyaWFudHMgdGhpcyBvcGNvZGUgaXMgYXZhaWxhYmxlIG9uLgotICAgICBXZSBhc3N1bWUgbW4xMDMwMCBiYXNlIG9wY29kZXMgYXJlIGF2YWlsYWJsZSBldmVyeXdoZXJlLCBzbyB3ZSBvbmx5Ci0gICAgIGhhdmUgdG8gbm90ZSBvcGNvZGVzIHdoaWNoIGFyZSBhdmFpbGFibGUgb24gb3RoZXIgdmFyaWFudHMuICAqLwotICB1bnNpZ25lZCBpbnQgbWFjaGluZTsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzW01OMTAzMDBfTUFYX09QRVJBTkRTXTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgbW4xMDMwMF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IG1uMTAzMDBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IG1uMTAzMDBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIG1uMTAzMDBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kIG1uMTAzMDBfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBtbjEwMzAwX29wZXJhbmQuICAqLwotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRFJFRyAweDEKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfQVJFRyAweDIKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1AgMHg0Ci0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BTVyAweDgKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTURSIDB4MTAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIDB4MjAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSAweDQwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BBUkVOIDB4ODAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQgMHgxMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQgMHgyMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1BMSVQgMHg0MDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QgMHg4MDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUENSRUwgMHgxMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX01FTUFERFIgMHgyMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIDB4NDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9VU1AgMHg4MDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1NTUCAweDEwMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX01TUCAweDIwMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BDIDB4NDAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRVBTVyAweDgwMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1JSRUcgMHgxMDAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfWFJSRUcgMHgyMDAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUExVUyAweDQwMDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF8yNEJJVCAweDgwMDAwMAotCi0vKiBPcGNvZGUgRm9ybWF0cy4gICovCi0jZGVmaW5lIEZNVF9TMCAxCi0jZGVmaW5lIEZNVF9TMSAyCi0jZGVmaW5lIEZNVF9TMiAzCi0jZGVmaW5lIEZNVF9TNCA0Ci0jZGVmaW5lIEZNVF9TNiA1Ci0jZGVmaW5lIEZNVF9EMCA2Ci0jZGVmaW5lIEZNVF9EMSA3Ci0jZGVmaW5lIEZNVF9EMiA4Ci0jZGVmaW5lIEZNVF9ENCA5Ci0jZGVmaW5lIEZNVF9ENSAxMAotI2RlZmluZSBGTVRfRDYgMTEKLSNkZWZpbmUgRk1UX0Q3IDEyCi0jZGVmaW5lIEZNVF9EOCAxMwotI2RlZmluZSBGTVRfRDkgMTQKLSNkZWZpbmUgRk1UX0QxMCAxNQotCi0vKiBWYXJpYW50cyBvZiB0aGUgbW4xMDMwMCB3aGljaCBoYXZlIGFkZGl0aW9uYWwgb3Bjb2Rlcy4gICovCi0jZGVmaW5lIE1OMTAzIDMwMAotI2RlZmluZSBBTTMwICAzMDAKLQotI2RlZmluZSBBTTMzIDMzMAotCi0jZW5kaWYgLyogTU4xMDMwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9ucDEuaCBiL2luY2x1ZGUvb3Bjb2RlL25wMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNhZGM3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL25wMS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qIFByaW50IEdPVUxEIE5QTCBpbnN0cnVjdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXN0cnVjdCBnbGRfb3Bjb2RlCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIGNoYXIgKmFyZ3M7Ci0gIGludCBsZW5ndGg7Ci19OwotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMgYmVjYXVzZSB0aGF0Ci0gICBpcyB0aGUgbW9zdCBhbnkgb2YgdGhlbSBuZWVkLiAgVGhlIGFjdHVhbCBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgIGlzIGFsd2F5cyBhdCBsZWFzdCAyIGJ5dGVzLCBhbmQgYXQgbW9zdCBmb3VyLiAgVGhlIGxlbmd0aCBvZiB0aGUKLSAgIGluc3RydWN0aW9uIGlzIGJhc2VkIG9uIHRoZSBvcGNvZGUuCi0KLSAgIFRoZSBtYXNrIGNvbXBvbmVudCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaAotICAgcGFydGljdWxhciBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlCi0gICBvZiB0aGF0IG9wY29kZS4KLQotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycwotICAgdGhhdCBhcmUgdXNlZCB0byBmb3JtYXQgdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5zdHJ1Y3Rpb24uICovCi0KLS8qIEtpbmRzIG9mIG9wZXJhbmRzOgotICAgciAgUmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIFIgIFJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgYiAgQmFzZSByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgQiAgQmFzZSByZWdpc3RlciBpbiBzZWNvbmQgZmllbGQKLSAgIHYgIFZlY3RvciByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgViAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBBICBPcHRpb25hbCBhZGRyZXNzIHJlZ2lzdGVyIChiYXNlIHJlZ2lzdGVyKQotICAgWCAgT3B0aW9uYWwgaW5kZXggcmVnaXN0ZXIKLSAgIEkgIEltbWVkaWF0ZSBkYXRhICgxNmJpdHMgc2lnbmVkKQotICAgTyAgT2Zmc2V0IGZpZWxkICgxNmJpdHMgc2lnbmVkKQotICAgaCAgT2Zmc2V0IGZpZWxkICgxNWJpdHMgc2lnbmVkKQotICAgZCAgT2Zmc2V0IGZpZWxkICgxNGJpdHMgc2lnbmVkKQotICAgUyAgU2hpZnQgY291bnQgZmllbGQKLQotICAgYW55IG90aGVyIGNoYXJhY3RlcnMgYXJlIHByaW50ZWQgYXMgaXMuLi4KLSovCi0KLS8qIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCB0aGlzIGFycmF5IGJlIHNvcnRlZCBhcyBmb2xsb3dzOgotICAgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICAgQWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBvcGVyYW5kcwotICAgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAqLwotc3RydWN0IGdsZF9vcGNvZGUgZ2xkX29wY29kZXNbXSA9Ci17Ci17ICJsYiIsCQkweGI0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxuYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGJzIiwJMHhlYzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsaCIsCQkweGI0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImxuaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibHciLAkJMHhiNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbnciLAkweGI4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxkIiwJCTB4YjQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5kIiwJMHhiODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsaSIsCQkweGY4MDAwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImxwYSIsCTB4NTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGEiLAkJMHg1MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYWJyIiwJMHg1ODA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsYnAiLAkweDkwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxocCIsCTB4OTAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdwIiwJMHg5MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZHAiLAkweDkwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1YWJyIiwJMHg1ODAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsZiIsCQkweGJjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxmYnIiLAkweGJjMDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImx3YnIiLAkweDVjMDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN0YiIsCTB4ZDQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RoIiwJMHhkNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdHciLAkweGQ0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZCIsCTB4ZDQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmIiwJMHhkYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGZiciIsCTB4ZGMwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3R3YnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInptYiIsCTB4ZDgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1oIiwJMHhkODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJ6bXciLAkweGQ4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInptZCIsCTB4ZDgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RicCIsCTB4OTQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RocCIsCTB4OTQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3R3cCIsCTB4OTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RkcCIsCTB4OTQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibGlsIiwJMHhmODBiMDAwMCwJMHhmYzdmMDAwMCwJInIsRCIsCQk0IH0sCi17ICJsd3NsMSIsCTB4ZWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdzbDIiLAkweGZjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImx3c2wzIiwJMHhmYzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgImx2YiIsCTB4YjAwODAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAibHZoIiwJMHhiMDAwMDAwMSwJMHhmYzA4MDAwMSwJInYseE9BLFgiLAk0IH0sCi17ICJsdnciLAkweGIwMDAwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgImx2ZCIsCTB4YjAwMDAwMDIsCTB4ZmMwODAwMDIsCSJ2LHhPQSxYIiwJNCB9LAoteyAibGl2IiwJMHgzYzA0MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJsaXZmIiwJMHgzYzA4MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdHZiIiwJMHhkMDA4MDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCi17ICJzdHZoIiwJMHhkMDAwMDAwMSwJMHhmYzA4MDAwMSwJInYseE9BLFgiLAk0IH0sCi17ICJzdHZ3IiwJMHhkMDAwMDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCi17ICJzdHZkIiwJMHhkMDAwMDAwMiwJMHhmYzA4MDAwMiwJInYseE9BLFgiLAk0IH0sCi0KLXsgInRyciIsCTB4MmMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJuIiwJMHgyYzA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm5kIiwJMHgyYzBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmFicyIsCTB4MmMwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJhYnNkIiwJMHgyYzA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmMiLAkweDJjMDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInhjciIsCTB4MjgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY3hjciIsCTB4MmMwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY3hjcmQiLAkweDJjMGUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRicnIiLAkweDJjMDIwMDAwLAkweGZjMGYwMDAwLAkicixCIiwJCTIgfSwKLXsgInRyYnIiLAkweDI4MDMwMDAwLAkweGZjMGYwMDAwLAkiYixSIiwJCTIgfSwKLXsgInhjYnIiLAkweDI4MDIwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKLXsgInRicmJyIiwJMHgyODAxMDAwMCwJMHhmYzBmMDAwMCwJImIsQiIsCQkyIH0sCi0KLXsgInRydnYiLAkweDI4MDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydnZuIiwJMHgyYzA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJ0cnZ2bmQiLAkweDJjMGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydmFiIiwJMHgyYzA3MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJ0cnZhYmQiLAkweDJjMGYwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNtcHYiLAkweDE0MDYwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImV4cHYiLAkweDE0MDcwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZsdCIsCTB4MTAwMzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmxlIiwJMHgxMDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2Z3QiLAkweDE0MDMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZnZSIsCTB4MTQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmVxIiwJMHgxMDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2bmUiLAkweDEwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnJsdCIsCTB4MTAwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cmxlIiwJMHgxMDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZyZ3QiLAkweDE0MGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJnZSIsCTB4MTQwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cmVxIiwJMHgxMDBmMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZybmUiLAkweDE0MGYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInRydnIiLAkweDE0MGIwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInRycnYiLAkweDE0MGMwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAiYnUiLAkJMHg0MDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYm5zIiwJMHg3MDA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYm5jbyIsCTB4NzA4ODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJnZSIsCTB4NzEwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJuZSIsCTB4NzE4ODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJ1bmdlIiwJMHg3MjA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVubGUiLAkweDcyODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiZ3QiLAkweDczMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibmFueSIsCTB4NzM4ODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJzIgksCTB4NzAwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJjbyIsCTB4NzA4MDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJsdCIsCTB4NzEwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJlcSIsCTB4NzE4MDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJ1Z2UiLAkweDcyMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidWx0IiwJMHg3MjgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmxlIiwJMHg3MzAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmFueSIsCTB4NzM4MDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJybG5rIiwJMHg0NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaWIiLAkweDQ4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpaCIsCTB4NDgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml3IiwJMHg0YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaWQiLAkweDRjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpdmIiLAkweDYwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpdmgiLAkweDYwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpdnciLAkweDY0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpdmQiLAkweDY0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJ2c2IiLAkweDY4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJ2c2giLAkweDY4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJ2c3ciLAkweDZjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJ2c2QiLAkweDZjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAiY2FtYiIsCTB4ODAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY2FtaCIsCTB4ODAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiY2FtdyIsCTB4ODAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY2FtZCIsCTB4ODAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiY2FyIiwJMHgxMDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjYXJkIiwJMHgxNDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjaSIsCQkweGY4MDUwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImNoa2JuZCIsCTB4NWMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAotCi17ICJjYXZ2IiwJMHgxMDAxMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjYXZyIiwJMHgxMDAyMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJjYXZ2ZCIsCTB4MTAwOTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiY2F2cmQiLAkweDEwMGIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAiYW5tYiIsCTB4ODQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5taCIsCTB4ODQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5tdyIsCTB4ODQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5tZCIsCTB4ODQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5yIiwJMHgwNDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhbmkiLAkweGY4MDgwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgIm9ybWIiLAkweGI4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm9ybWgiLAkweGI4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgIm9ybXciLAkweGI4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm9ybWQiLAkweGI4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgIm9yciIsCTB4MDgwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAib2kiLAkJMHhmODA5MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJlb21iIiwJMHg4YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlb21oIiwJMHg4YzAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJlb213IiwJMHg4YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlb21kIiwJMHg4YzAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJlb3IiLAkweDBjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImVvaSIsCTB4ZjgwYTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAotCi17ICJhbnZ2IiwJMHgwNDAxMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhbnZyIiwJMHgwNDAyMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJvcnZ2IiwJMHgwODAxMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJvcnZyIiwJMHgwODAyMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJlb3Z2IiwJMHgwYzAxMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJlb3ZyIiwJMHgwYzAyMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi0KLXsgInNhY3oiLAkweDEwMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNsYSIsCTB4MWM0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsIiwJMHgxYzYwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGMiLAkweDI0NDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsYWQiLAkweDIwNDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbGQiLAkweDIwNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYSIsCTB4MWMwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsIiwJMHgxYzIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmMiLAkweDI0MDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYWQiLAkweDIwMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNybGQiLAkweDIwMjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNkYSIsCTB4M2MwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RsIiwJMHgzYzAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGMiLAkweDNjMDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNkYWQiLAkweDNjMGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNkbGQiLAkweDNjMGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLQoteyAic3ZkYSIsCTB4M2MwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3ZkbCIsCTB4M2MwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3ZkYyIsCTB4M2MwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3ZkYWQiLAkweDNjMGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN2ZGxkIiwJMHgzYzBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi0KLXsgInNibSIsCTB4YWMwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiemJtIiwJMHhhYzAwMDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ0Ym0iLAkweGE4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgImluY21iIiwJMHhhMDAwMDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiaW5jbWgiLAkweGEwMDgwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJpbmNtdyIsCTB4YTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImluY21kIiwJMHhhNDA4MDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAic2JtZCIsCTB4N2MwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiemJtZCIsCTB4N2MwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAidGJtZCIsCTB4NzgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAotCi17ICJzc20iLAkweDljMDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInpzbSIsCTB4OWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAidHNtIiwJMHg5ODA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi0KLXsgImFkbWIiLAkweGM4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkbWgiLAkweGM4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFkbXciLAkweGM4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkbWQiLAkweGM4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkciIsCTB4MzgwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYXJtYiIsCTB4ZTgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtaCIsCTB4ZTgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtdyIsCTB4ZTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtZCIsCTB4ZTgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRpIiwJMHhmODAxMDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJzdW1iIiwJMHhjYzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdW1oIiwJMHhjYzAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdW13IiwJMHhjYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdW1kIiwJMHhjYzAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdXIiLAkweDNjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1aSIsCTB4ZjgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibXBtYiIsCTB4YzAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBtaCIsCTB4YzAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBtdyIsCTB4YzAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXByIiwJMHgzODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJkIiwJMHgzYzBmMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcGkiLAkweGY4MDMwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgImR2bWIiLAkweGM0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImR2bWgiLAkweGM0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImR2bXciLAkweGM0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImR2ciIsCTB4MzgwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZHZpIiwJMHhmODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJleHMiLAkweDM4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLQoteyAiYWR2diIsCTB4MzAwMDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYWR2dmQiLAkweDMwMDgwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkcnYiLAkweDM0MDAwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImFkcnZkIiwJMHgzNDA4MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXZ2IiwJMHgzMDAxMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJzdXZ2ZCIsCTB4MzAwOTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3VydiIsCTB4MzQwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3VydmQiLAkweDM0MDkwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wdnYiLAkweDMwMDIwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1wcnYiLAkweDM0MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAiYWRmdyIsCTB4ZTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRmZCIsCTB4ZTAwODAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRyZnciLAkweDM4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFkcmZkIiwJMHgzODA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdXJmdyIsCTB4ZTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyZmQiLAkweGUwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1cmZ3IiwJMHgzODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdXJmZCIsCTB4MzgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXBmdyIsCTB4ZTQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBmZCIsCTB4ZTQwODAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibXByZnciLAkweDM4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmZkIiwJMHgzODBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJyZnciLAkweGU0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInJmZCIsCTB4ZTQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAicnJmdyIsCTB4MGMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJyZmQiLAkweDBjMGYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi0KLXsgImFkdnZmdyIsCTB4MzAwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYWR2dmZkIiwJMHgzMDBjMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHJ2ZnciLAkweDM0MDQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImFkcnZmZCIsCTB4MzQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3V2dmZ3IiwJMHgzMDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJzdXZ2ZmQiLAkweDMwMGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1cnZmdyIsCTB4MzQwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3VydmZkIiwJMHgzNDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcHZ2ZnciLAkweDMwMDYwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1wdnZmZCIsCTB4MzAwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXBydmZ3IiwJMHgzNDA2MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcHJ2ZmQiLAkweDM0MGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInJ2ZnciLAkweDMwMDcwMDAwLAkweGZjMGYwMDAwLAkidiIsCQkyIH0sCi17ICJydmZkIiwJMHgzMDBmMDAwMCwJMHhmYzBmMDAwMCwJInYiLAkJMiB9LAotCi17ICJmbHR3IiwJMHgzODA3MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmbHRkIiwJMHgzODBmMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmaXh3IiwJMHgzODA1MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmaXhkIiwJMHgzODBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjZnBkcyIsCTB4M2MwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJmbHR2dyIsCTB4MDgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZmx0dmQiLAkweDA4MGYwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImZpeHZ3IiwJMHgwODBjMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJmaXh2ZCIsCTB4MDgwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiY2ZwdmRzIiwJMHgwYzBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi0KLXsgIm9ydnJuIiwJMHgwMDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJhbmR2cm4iLAkweDAwMDgwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgImZyc3RlcSIsCTB4MDQwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWEiLAkweDBjMDgwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInNpZ21hZCIsCTB4MGMwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWYiLAkweDA4MDgwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInNpZ21mZCIsCTB4MDgwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAicHJvZGYiLAkweDA0MDgwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInByb2RmZCIsCTB4MDQwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWF4diIsCTB4MTAwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWF4dmQiLAkweDEwMGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgIm1pbnYiLAkweDE0MDgwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgIm1pbnZkIiwJMHgxNDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi0KLXsgImxwc2QiLAkweGYwMDAwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJsZGMiLAkweGYwMDgwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJzcG0iLAkweDA0MGMwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJycG0iLAkweDA0MGQwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cml0ciIsCTB4MDAwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRycml0IiwJMHgwMDA2MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnBzd3QiLAkweDA0MDgwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJleHIiLAkweGY4MDcwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTQgfSwKLXsgImhhbHQiLAkweDAwMDAwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgIndhaXQiLAkweDAwMDEwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgIm5vcCIsCTB4MDAwMjAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZWlhZSIsCTB4MDAwMzAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZWZhZSIsCTB4MDAwZDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZGlhZSIsCTB4MDAwZTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZGZhZSIsCTB4MDAwZjAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAic3B2YyIsCTB4ZjgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFQsTiIsCTQgfSwKLXsgInJkc3RzIiwJMHgwMDA5MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAic2V0Y3B1IiwJMHgwMDBjMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiY21jIiwJMHgwMDBiMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJyY3UiLAkweDAwMDQwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJhdHRuaW8iLAkweDAwMDUwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImZ1ZGl0IiwJMHgyODA4MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJicmVhayIsCTB4MjgwOTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZnJ6c3MiLAkweDI4MGEwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInJpcGkiLAkweDA0MDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInhjcCIsCTB4MDQwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImJsb2NrIiwJMHgwNDA2MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJ1bmJsb2NrIiwJMHgwNDA3MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJ0cnNjIiwJMHgwODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0c2NyIiwJMHgwODA3MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmcSIsCQkweDA0MDgwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJmbHVwdGUiLAkweDJjMDgwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJydml1IiwJMHgwNDBmMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJsZGVsIiwJMHgyODBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsZHUiLAkweDI4MGQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN0ZGVjYyIsCTB4MjgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJwYyIsCTB4MDgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRwY3IiLAkweDA4MDUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJnaGFsdCIsCTB4MGMwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImdydW4iLAkweDBjMDQwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInRtcHIiLAkweDJjMGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybXAiLAkweDJjMGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLQoteyAidHJydmUiLAkweDI4MDYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnZlciIsCTB4MjgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRydmxyIiwJMHgyODBmMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAotCi17ICJsaW5rZmwiLAkweDE4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxpbmtibCIsCTB4MTgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua2ZwIiwJMHgxODAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rYnAiLAkweDE4MDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxpbmtwbCIsCTB4MTgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmtsIiwJMHgxODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua3AiLAkweDE4MDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVsaW5rdGwiLAkweDE4MGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVsaW5rdHAiLAkweDE4MGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLX07Ci0KLWludCBudW1vcGNvZGVzID0gc2l6ZW9mKGdsZF9vcGNvZGVzKSAvIHNpemVvZihnbGRfb3Bjb2Rlc1swXSk7Ci0KLXN0cnVjdCBnbGRfb3Bjb2RlICplbmRvcCA9IGdsZF9vcGNvZGVzICsgc2l6ZW9mKGdsZF9vcGNvZGVzKSAvCi0JCSAJCXNpemVvZihnbGRfb3Bjb2Rlc1swXSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9uczMyay5oIGIvaW5jbHVkZS9vcGNvZGUvbnMzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiYjhiOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9uczMyay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qIG5zMzJrLW9wY29kZS5oIC0tIE9wY29kZSB0YWJsZSBmb3IgTmF0aW9uYWwgU2VtaSAzMmsgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2RlZmluZSBERUZfTU9ERUwgMjEKLSNlbmRpZgotCi0jaWZuZGVmIERFRl9NT0RFQwotI2RlZmluZSBERUZfTU9ERUMgMjAKLSNlbmRpZgotCi0jaWZuZGVmIERFRl9NT0RFTAotI2RlZmluZSBERUZfTU9ERUwgMjAKLSNlbmRpZgotLyoKLSAgIEFmdGVyIGRlY2lkaW5nIHRoZSBpbnN0cnVjdGlvbiBlbnRyeSAodmlhIGhhc2guYykgdGhlIGluc3RydWN0aW9uIHBhcnNlcgotICAgd2lsbCB0cnkgdG8gbWF0Y2ggdGhlIG9wZXJhbmRzIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgcmVxdWlyZWQgc2V0Ci0gICBnaXZlbiBpbiB0aGUgZW50cnkgb3BlcmFuZGZpZWxkLiBFdmVyeSBvcGVyYW5kIHdpbGwgcmVzdWx0IGluIGEgY2hhbmdlIGluCi0gICB0aGUgb3Bjb2RlIG9yIHRoZSBhZGRpdGlvbiBvZiBkYXRhIHRvIHRoZSBvcGNvZGUuCi0gICBUaGUgb3BlcmFuZHMgaW4gdGhlIHNvdXJjZSBpbnN0cnVjdGlvbiBhcmUgY2hlY2tlZCBmb3IgaW5jb25zaXN0ZW50Ci0gICBzZW1hbnRpY3MuCi0gCi0JRiA6IDMyIGJpdCBmbG9hdAlnZW5lcmFsIGZvcm0KLQlMIDogNjQgYml0IGZsb2F0CSAgICAiCi0JQiA6IGJ5dGUJCSAgICAiCi0JVyA6IHdvcmQJCSAgICAiCi0JRCA6IGRvdWJsZS13b3JkCQkgICAgIgotCUEgOiBkb3VibGUtd29yZAkJZ2VuLWFkZHJlc3MtZm9ybSBpZSBubyByZWdzLCBubyBpbW1lZGlhdGUKLQlJIDogaW50ZWdlciB3cml0ZWFibGUgICBnZW4gaW50IGV4Y2VwdCBpbW1lZGlhdGUgKEEgKyByZWcpCi0JWiA6IGZsb2F0aW5nIHdyaXRlYWJsZQlnZW4gZmxvYXQgZXhjZXB0IGltbWVkaWF0ZSAoWiArIGZyZWcpCi0JZCA6IGRpc3BsYWNlbWVudAotCWIgOiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nICBhY2IKLQlwIDogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZyAgYnIgYmNvbmQgYnNyIGN4cAotCXEgOiBxdWljawotCWkgOiBpbW1lZGlhdGUgKDggYml0cykKLQkgICAgVGhpcyBpcyBub3QgYSBzdGFuZGFyZCBuczMyayBvcGVyYW5kdHlwZSwgaXQgaXMgdXNlZCB0byBidWlsZAotCSAgICBpbnN0cnVjdGlvbnMgbGlrZSAgICBzdmMgYXJnMSxhcmcyCi0JICAgIFN2YyBpcyB0aGUgaW5zdHJ1Y3Rpb24gU3VwZXJWaXNvckNhbGwgYW5kIGlzIHNvbWV0aW1lcyB1c2VkIHRvCi0JICAgIGNhbGwgT1Mtcm91dGluZXMgZnJvbSB1c2VybW9kZS4gU29tZSBhcmdzIG1pZ2h0IGJlIGhhbmR5IQotCXIgOiByZWdpc3RlciBudW1iZXIgKDMgYml0cykKLQlPIDogc2V0Y2ZnIGluc3RydWN0aW9uIG9wdGlvbnNsaXN0Ci0JQyA6IGNpbnYgaW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QKLQlTIDogc3RyaW5naW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QKLQlVIDogcmVnaXN0ZXJsaXN0CXNhdmUsZW50ZXIKLQl1IDogcmVnaXN0ZXJsaXN0CXJlc3RvcmUsZXhpdAotCU0gOiBtbXUgcmVnaXN0ZXIKLQlQIDogY3B1IHJlZ2lzdGVyCi0JZyA6IDM6cmQgb3BlcmFuZCBvZiBpbnNzIG9yIGV4dHMgaW5zdHJ1Y3Rpb24KLQlHIDogNDp0aCBvcGVyYW5kIG9mIGluc3Mgb3IgZXh0cyBpbnN0cnVjdGlvbgotCSAgICBUaG9zZSBvcGVyYW5kcyBhcmUgZW5jb2RlZCBpbiB0aGUgc2FtZSBieXRlLgotCSAgICBUaGlzIGJ5dGUgaXMgcGxhY2VkIGxhc3QgaW4gdGhlIGluc3RydWN0aW9uLgotCWYgOiBvcGVyYW5kIG9mIHNmc3IKLQlIIDogc2VxdWVudC1oYWNrIGZvciBic3IgKFdhcm5pbmcpCi0KLWNvbHVtbgkxIAlpbnN0cnVjdGlvbnMKLQkyIAludW1iZXIgb2YgYml0cyBpbiBvcGNvZGUuCi0JMyAJbnVtYmVyIG9mIGJpdHMgaW4gb3Bjb2RlIGV4cGxpY2l0bHkKLQkJZGV0ZXJtaW5lZCBieSB0aGUgaW5zdHJ1Y3Rpb24gdHlwZS4KLQk0IAlvcGNvZGVzZWVkLCB0aGUgbnVtYmVyIHdlIGJ1aWxkIG91ciBvcGNvZGUKLQkJZnJvbS4KLQk1IAlvcGVyYW5kdHlwZXMsIHVzZWQgYnkgb3BlcmFuZHBhcnNlci4KLQk2IAlzaXplIGluIGJ5dGVzIG9mIGltbWVkaWF0ZQotKi8KLXN0cnVjdCBuczMya19vcGNvZGUgewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBjaGFyIG9wY29kZV9pZF9zaXplOyAvKiBub3QgdXNlZCBieSB0aGUgYXNzZW1ibGVyICovCi0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlX3NlZWQ7Ci0gIGNoYXIgKm9wZXJhbmRzOwotICB1bnNpZ25lZCBjaGFyIGltX3NpemU7CS8qIG5vdCB1c2VkIGJ5IGRpc3Nhc3NlbWJsZXIgKi8KLSAgY2hhciAqZGVmYXVsdF9hcmdzOwkJLyogZGVmYXVsdCB0byB0aG9zZSBhcmdzIHdoZW4gbm9uZSBnaXZlbiAqLwotICBjaGFyIGRlZmF1bHRfbW9kZWM7CQkvKiBkZWZhdWx0IHRvIHRoaXMgYWRkci1tb2RlIHdoZW4gYW1iaWdvdXMKLQkJCQkgICBpZSB3aGVuIHRoZSBhcmd1bWVudCBvZiBhIGdlbmVyYWwgYWRkci1tb2RlCi0JCQkJICAgaXMgYSBwbGFpbiBjb25zdGFudCAqLwotICBjaGFyIGRlZmF1bHRfbW9kZWw7CQkvKiBpcyBhIHBsYWluIGxhYmVsICovCi19OwotCi0jaWZkZWYgY29tbWVudAotLyogVGhpcyBzZWN0aW9uIHdhcyBmcm9tIHRoZSBnZGIgdmVyc2lvbiBvZiB0aGlzIGZpbGUuICovCi0KLSNpZm5kZWYgbnMzMmtfb3Bjb2RlVAotI2RlZmluZSBuczMya19vcGNvZGVUIGludAotI2VuZGlmIC8qIG5vIG5zMzJrX29wY29kZVQgKi8KLQotc3RydWN0IG5vdF93b3QJCQkvKiBuczMyayBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMgKi8KLQkJCQkvKiBwYXJ0aWN1bGFyIG9wY29kZSAqLwotewotICBpbnQgb2JpdHM7CQkvKiBudW1iZXIgb2Ygb3Bjb2RlIGJpdHMgKi8KLSAgaW50IGliaXRzOwkJLyogbnVtYmVyIG9mIGluc3RydWN0aW9uIGJpdHMgKi8KLSAgbnMzMmtfb3Bjb2RlVAljb2RlOwkvKiBvcC1jb2RlIChtYXkgYmUgPiA4IGJpdHMhKSAqLwotICBjaGFyICphcmdzOwkJLyogaG93IHRvIGNvbXBpbGUgc2FpZCBvcGNvZGUgKi8KLX07Ci0KLXN0cnVjdCBub3QJCQkvKiBuczMyayBvcGNvZGUgdGV4dCAqLwotewotICBjaGFyICogICAgICAgICAgICBuYW1lOwkvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCi0gIHN0cnVjdCBub3Rfd290ICAgIGRldGFpbDsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotLyogSW5zdHJ1Y3Rpb25zIGxvb2sgbGlrZSB0aGlzOgotICAgIAotICAgYmFzaWMgaW5zdHJ1Y3Rpb24tLTEsIDIsIG9yIDMgYnl0ZXMKLSAgIGluZGV4IGJ5dGUgZm9yIG9wZXJhbmQgQSwgaWYgb3BlcmFuZCBBIGlzIGluZGV4ZWQtLTEgYnl0ZQotICAgaW5kZXggYnl0ZSBmb3Igb3BlcmFuZCBCLCBpZiBvcGVyYW5kIEIgaXMgaW5kZXhlZC0tMSBieXRlCi0gICBhZGRyZXNzaW5nIGV4dGVuc2lvbiBmb3Igb3BlcmFuZCBBCi0gICBhZGRyZXNzaW5nIGV4dGVuc2lvbiBmb3Igb3BlcmFuZCBCCi0gICBpbXBsaWVkIG9wZXJhbmRzCi0KLSAgIE9wZXJhbmQgQSBpcyB0aGUgb3BlcmFuZCBsaXN0ZWQgZmlyc3QgaW4gdGhlIGZvbGxvd2luZyBvcGNvZGUgdGFibGUuCi0gICBPcGVyYW5kIEIgaXMgdGhlIG9wZXJhbmQgbGlzdGVkIHNlY29uZCBpbiB0aGUgZm9sbG93aW5nIG9wY29kZSB0YWJsZS4KLSAgIEFsbCBpbnN0cnVjdGlvbnMgaGF2ZSBhdCBtb3N0IDIgZ2VuZXJhbCBvcGVyYW5kcywgc28gdGhpcyBpcyBlbm91Z2guCi0gICBUaGUgaW1wbGllZCBvcGVyYW5kcyBhcmUgYXNzb2NpYXRlZCB3aXRoIG9wZXJhbmRzIG90aGVyIHRoYW4gQSBhbmQgQi4KLQotICAgRWFjaCBvcGVyYW5kIGhhcyBhIGRpZ2l0IGFuZCBhIGxldHRlci4KLSAgIAotICAgVGhlIGRpZ2l0IGdpdmVzIHRoZSBwb3NpdGlvbiBpbiB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2UuICBUaGUgbGV0dGVyLAotICAgb25lIG9mIHRoZSBmb2xsb3dpbmcsIHRlbGxzIHVzIHdoYXQga2luZCBvZiBvcGVyYW5kIGl0IGlzLiAgKi8KLQotLyogRiA6IDMyIGJpdCBmbG9hdAotICogTCA6IDY0IGJpdCBmbG9hdAotICogQiA6IGJ5dGUKLSAqIFcgOiB3b3JkCi0gKiBEIDogZG91YmxlLXdvcmQKLSAqIEkgOiBpbnRlZ2VyIG5vdCBpbW1lZGlhdGUKLSAqIFogOiBmbG9hdGluZyBub3QgaW1tZWRpYXRlCi0gKiBkIDogZGlzcGxhY2VtZW50Ci0gKiBxIDogcXVpY2sKLSAqIGkgOiBpbW1lZGlhdGUgKDggYml0cykKLSAqIHIgOiByZWdpc3RlciBudW1iZXIgKDMgYml0cykKLSAqIHAgOiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCi0qLwotCi0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3Bjb2RlIG5zMzJrX29wY29kZXNbXT0KLXsKLSAgeyAiYWJzZiIsCTE0LDI0LAkweDM1YmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFic2wiLAkxNCwyNCwJMHgzNGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnNiIiwJMTQsMjQsCTB4MzA0ZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzdyIsCTE0LDI0LAkweDMxNGUsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFic2QiLAkxNCwyNCwJMHgzMzRlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhY2JiIiwJIDcsMTYsCTB4NGMsCSIySTFxM3AiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhY2J3IiwJIDcsMTYsCTB4NGQsCSIySTFxM3AiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhY2JkIiwJIDcsMTYsCTB4NGYsCSIySTFxM3AiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRmIiwJMTQsMjQsCTB4MDFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkbCIsCTE0LDI0LAkweDAwYmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGIiLAkgNiwxNiwJMHgwMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkdyIsCSA2LDE2LAkweDAxLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRkIiwJIDYsMTYsCTB4MDMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGNiIiwJIDYsMTYsCTB4MTAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGN3IiwJIDYsMTYsCTB4MTEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGNkIiwJIDYsMTYsCTB4MTMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHBiIiwJMTQsMjQsCTB4M2M0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcHciLAkxNCwyNCwJMHgzZDRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRwZCIsCTE0LDI0LAkweDNmNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHFiIiwJIDcsMTYsCTB4MGMsCSIySTFxIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHF3IiwJIDcsMTYsCTB4MGQsCSIySTFxIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHFkIiwJIDcsMTYsCTB4MGYsCSIySTFxIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHIiLAkgNiwxNiwJMHgyNywJIjFBMkkiLAkJNCwJIiIsCTIxLDIxCX0sCi0gIHsgImFkanNwYiIsCTExLDE2LAkweDA1N2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGpzcHciLAkxMSwxNiwJMHgwNTdkLAkiMVciLCAJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkanNwZCIsCTExLDE2LAkweDA1N2YsCSIxRCIsIAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYW5kYiIsCSA2LDE2LAkweDI4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhbmR3IiwJIDYsMTYsCTB4MjksCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFuZGQiLAkgNiwxNiwJMHgyYiwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYXNoYiIsCTE0LDI0LAkweDA0NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFzaHciLAkxNCwyNCwJMHgwNTRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhc2hkIiwJMTQsMjQsCTB4MDc0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmVxIiwJIDgsOCwJMHgwYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibmUiLAkgOCw4LAkweDFhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJjcyIsCSA4LDgsCTB4MmEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmNjIiwJIDgsOCwJMHgzYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiaGkiLAkgOCw4LAkweDRhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJscyIsCSA4LDgsCTB4NWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmd0IiwJIDgsOCwJMHg2YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibGUiLAkgOCw4LAkweDdhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJmcyIsCSA4LDgsCTB4OGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmZjIiwJIDgsOCwJMHg5YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibG8iLAkgOCw4LAkweGFhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJocyIsCSA4LDgsCTB4YmEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmx0IiwJIDgsOCwJMHhjYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZ2UiLAkgOCw4LAkweGRhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJ1dCIsCSA4LDgsCTB4ZWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYnVmIiwJIDgsOCwJMHhmYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiaWNiIiwJIDYsMTYsCTB4MDgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY3ciLAkgNiwxNiwJMHgwOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmljZCIsCSA2LDE2LAkweDBiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNwc3JiIiwJMTEsMTYsCTB4MTdjLAkiMUIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmljcHNydyIsCTExLDE2LAkweDE3ZCwJIjFXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpc3BzcmIiLAkxMSwxNiwJMHgzN2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaXNwc3J3IiwJMTEsMTYsCTB4MzdkLAkiMVciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYnB0IiwJIDgsOCwJMHhmMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiciIsCSA4LDgsCTB4ZWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSAgeyAiYnNyIiwJIDgsOCwJMHgwMiwJIjFIIiwJCTAsCSIiLAkyMSwyMQl9LAotI2Vsc2UKLSAgeyAiYnNyIiwJIDgsOCwJMHgwMiwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotI2VuZGlmCi0gIHsgImNhc2ViIiwJMTEsMTYsCTB4NzdjLAkiMUIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2FzZXciLAkxMSwxNiwJMHg3N2QsCSIxVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYXNlZCIsCTExLDE2LAkweDc3ZiwJIjFEIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXRiIiwJMTQsMjQsCTB4MDg0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdHciLAkxNCwyNCwJMHgwOTRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0ZCIsCTE0LDI0LAkweDBiNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXRpYiIsCTE0LDI0LAkweDBjNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXRpdyIsCTE0LDI0LAkweDBkNGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXRpZCIsCTE0LDI0LAkweDBmNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNoZWNrYiIsCTExLDI0LAkweDBlZSwJIjJBM0IxciIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNoZWNrdyIsCTExLDI0LAkweDFlZSwJIjJBM1cxciIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNoZWNrZCIsCTExLDI0LAkweDNlZSwJIjJBM0QxciIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNpbnYiLAkxNCwyNCwJMHgyNzFlLAkiMkQxQyIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBmIiwJMTQsMjQsCTB4MDliZSwJIjFGMkYiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbCIsCTE0LDI0LAkweDA4YmUsCSIxTDJMIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGIiLAkgNiwxNiwJMHgwNCwJIjFCMkIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wdyIsCSA2LDE2LAkweDA1LAkiMVcyVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBkIiwJIDYsMTYsCTB4MDcsCSIxRDJEIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcG1iIiwJMTQsMjQsCTB4MDRjZSwJIjFBMkEzYiIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcG13IiwJMTQsMjQsCTB4MDVjZSwJIjFBMkEzYiIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcG1kIiwJMTQsMjQsCTB4MDdjZSwJIjFBMkEzYiIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHFiIiwJIDcsMTYsCTB4MWMsCSIyQjFxIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHF3IiwJIDcsMTYsCTB4MWQsCSIyVzFxIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHFkIiwJIDcsMTYsCTB4MWYsCSIyRDFxIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHNiIiwJMTYsMjQsCTB4MDQwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc3ciLAkxNiwyNCwJMHgwNTBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzZCIsCTE2LDI0LAkweDA3MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHN0IiwJMTYsMjQsCTB4ODQwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY29tYiIsCTE0LDI0LAkweDM0NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNvbXciLAkxNCwyNCwJMHgzNTRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjb21kIiwJMTQsMjQsCTB4Mzc0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY3Z0cCIsCTExLDI0LAkweDAzNmUsCSIyQTNEMXIiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjeHAiLAkgOCw4LAkweDIyLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImN4cGQiLAkxMSwxNiwJMHgwN2YsCSIxQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkZWliIiwJMTQsMjQsCTB4MmNjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGVpdyIsCTE0LDI0LAkweDJkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRlaWQiLAkxNCwyNCwJMHgyZmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaWEiLAkgOCw4LAkweGMyLAkiIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmYiLAkxNCwyNCwJMHgyMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZsIiwJMTQsMjQsCTB4MjBiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2YiIsCTE0LDI0LAkweDNjY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdnciLAkxNCwyNCwJMHgzZGNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZkIiwJMTQsMjQsCTB4M2ZjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZW50ZXIiLAkgOCw4LAkweDgyLAkiMVUyZCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleGl0IiwJIDgsOCwJMHg5MiwJIjF1IiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dGIiLAkxMSwyNCwJMHgwMmUsCSIySTNCMXI0ZCIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dHciLAkxMSwyNCwJMHgxMmUsCSIySTNXMXI0ZCIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dGQiLAkxMSwyNCwJMHgzMmUsCSIySTNEMXI0ZCIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dHNiIiwJMTQsMjQsCTB4MGNjZSwJIjFJMkk0RzNnIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0c3ciLAkxNCwyNCwJMHgwZGNlLAkiMUkySTRHM2ciLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRzZCIsCTE0LDI0LAkweDBmY2UsCSIxSTJJNEczZyIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZmc2IiLAkxNCwyNCwJMHgwNDZlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmZnN3IiwJMTQsMjQsCTB4MDU2ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmZzZCIsCTE0LDI0LAkweDA3NmUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsYWciLAkgOCw4LAkweGQyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29yZmIiLAkxNCwyNCwJMHgzYzNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmZ3IiwJMTQsMjQsCTB4M2QzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JmZCIsCTE0LDI0LAkweDNmM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29ybGIiLAkxNCwyNCwJMHgzODNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmx3IiwJMTQsMjQsCTB4MzkzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JsZCIsCTE0LDI0LAkweDNiM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImliaXRiIiwJMTQsMjQsCTB4Mzg0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaWJpdHciLAkxNCwyNCwJMHgzOTRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpYml0ZCIsCTE0LDI0LAkweDNiNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluZGV4YiIsCTExLDI0LAkweDQyZSwJIjJCM0IxciIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluZGV4dyIsCTExLDI0LAkweDUyZSwJIjJXM1cxciIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluZGV4ZCIsCTExLDI0LAkweDcyZSwJIjJEM0QxciIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc2IiLAkxMSwyNCwJMHgwYWUsCSIyQjNJMXI0ZCIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc3ciLAkxMSwyNCwJMHgxYWUsCSIyVzNJMXI0ZCIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc2QiLAkxMSwyNCwJMHgzYWUsCSIyRDNJMXI0ZCIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc3NiIiwJMTQsMjQsCTB4MDhjZSwJIjFCMkk0RzNnIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zc3ciLAkxNCwyNCwJMHgwOWNlLAkiMVcySTRHM2ciLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNzZCIsCTE0LDI0LAkweDBiY2UsCSIxRDJJNEczZyIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImpzciIsCTExLDE2LAkweDY3ZiwJIjFBIiwJCTQsCSIiLAkyMSwyMQl9LAotICB7ICJqdW1wIiwJMTEsMTYsCTB4MjdmLAkiMUEiLAkJNCwJIiIsCTIxLDIxCX0sCi0gIHsgImxmc3IiLAkxOSwyNCwJMHgwMGYzZSwiMUQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibG1yIiwJMTUsMjQsCTB4MGIxZSwJIjJEMU0iLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHByYiIsCSA3LDE2LAkweDZjLAkiMkIxUCIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJscHJ3IiwJIDcsMTYsCTB4NmQsCSIyVzFQIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxwcmQiLAkgNywxNiwJMHg2ZiwJIjJEMVAiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHNoYiIsCTE0LDI0LAkweDE0NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxzaHciLAkxNCwyNCwJMHgxNTRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsc2hkIiwJMTQsMjQsCTB4MTc0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibWVpYiIsCTE0LDI0LAkweDI0Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1laXciLAkxNCwyNCwJMHgyNWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtZWlkIiwJMTQsMjQsCTB4MjdjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW9kYiIsCTE0LDI0LAkweDM4Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vZHciLAkxNCwyNCwJMHgzOWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb2RkIiwJMTQsMjQsCTB4M2JjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92ZiIsCTE0LDI0LAkweDA1YmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmwiLAkxNCwyNCwJMHgwNGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZiIiwJIDYsMTYsCTB4MTQsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnciLAkgNiwxNiwJMHgxNSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92ZCIsCSA2LDE2LAkweDE3LAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZiZiIsCTE0LDI0LAkweDA0M2UsCSIxQjJaIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdndmIiwJMTQsMjQsCTB4MDUzZSwJIjFXMloiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92ZGYiLAkxNCwyNCwJMHgwNzNlLAkiMUQyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZibCIsCTE0LDI0LAkweDAwM2UsCSIxQjJaIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdndsIiwJMTQsMjQsCTB4MDEzZSwJIjFXMloiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92ZGwiLAkxNCwyNCwJMHgwMzNlLAkiMUQyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZmbCIsCTE0LDI0LAkweDFiM2UsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmxmIiwJMTQsMjQsCTB4MTYzZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bWIiLAkxNCwyNCwJMHgwMGNlLAkiMUEyQTNiIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bXciLAkxNCwyNCwJMHgwMWNlLAkiMUEyQTNiIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bWQiLAkxNCwyNCwJMHgwM2NlLAkiMUEyQTNiIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92cWIiLAkgNywxNiwJMHg1YywJIjJJMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92cXciLAkgNywxNiwJMHg1ZCwJIjJJMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92cWQiLAkgNywxNiwJMHg1ZiwJIjJJMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c2IiLAkxNiwyNCwJMHgwMDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzdyIsCTE2LDI0LAkweDAxMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnNkIiwJMTYsMjQsCTB4MDMwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3QiLAkxNiwyNCwJMHg4MDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzdWIiLAkxNCwyNCwJMHgwY2FlLAkiMUEyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzdXciLAkxNCwyNCwJMHgwZGFlLAkiMUEyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzdWQiLAkxNCwyNCwJMHgwZmFlLAkiMUEyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z1c2IiLAkxNCwyNCwJMHgxY2FlLAkiMUEyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z1c3ciLAkxNCwyNCwJMHgxZGFlLAkiMUEyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z1c2QiLAkxNCwyNCwJMHgxZmFlLAkiMUEyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z4YmQiLAkxNCwyNCwJMHgxY2NlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z4d2QiLAkxNCwyNCwJMHgxZGNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z4YnciLAkxNCwyNCwJMHgxMGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z6YmQiLAkxNCwyNCwJMHgxOGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z6d2QiLAkxNCwyNCwJMHgxOWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z6YnciLAkxNCwyNCwJMHgxNGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxmIiwJMTQsMjQsCTB4MzFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsbCIsCTE0LDI0LAkweDMwYmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGIiLAkxNCwyNCwJMHgyMGNlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWx3IiwJMTQsMjQsCTB4MjFjZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsZCIsCTE0LDI0LAkweDIzY2UsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2YiLAkxNCwyNCwJMHgxNWJlLCAiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWdsIiwJMTQsMjQsCTB4MTRiZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnYiIsCTE0LDI0LAkweDIwNGUsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ3ciLAkxNCwyNCwJMHgyMTRlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWdkIiwJMTQsMjQsCTB4MjM0ZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibm9wIiwJIDgsOCwJMHhhMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3RiIiwJMTQsMjQsCTB4MjQ0ZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibm90dyIsCTE0LDI0LAkweDI1NGUsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vdGQiLAkxNCwyNCwJMHgyNzRlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJvcmIiLAkgNiwxNiwJMHgxOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAib3J3IiwJIDYsMTYsCTB4MTksCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm9yZCIsCSA2LDE2LAkweDFiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJxdW9iIiwJMTQsMjQsCTB4MzBjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicXVvdyIsCTE0LDI0LAkweDMxY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInF1b2QiLAkxNCwyNCwJMHgzM2NlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZHZhbCIsCTE5LDI0LAkweDAwMzFlLCIxQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZW1iIiwJMTQsMjQsCTB4MzRjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVtdyIsCTE0LDI0LAkweDM1Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlbWQiLAkxNCwyNCwJMHgzN2NlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZXN0b3JlIiwJIDgsOCwJMHg3MiwJIjF1IiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldCIsCSA4LDgsCTB4MTIsCSIxZCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZXRpIiwJIDgsOCwJMHg1MiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZXR0IiwJIDgsOCwJMHg0MiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdGIiLAkxNCwyNCwJMHgwMDRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3R3IiwJMTQsMjQsCTB4MDE0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm90ZCIsCTE0LDI0LAkweDAzNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kZmIiLAkxNCwyNCwJMHgyNDNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGZ3IiwJMTQsMjQsCTB4MjUzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRmZCIsCTE0LDI0LAkweDI3M2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kbGIiLAkxNCwyNCwJMHgyMDNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGx3IiwJMTQsMjQsCTB4MjEzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRsZCIsCTE0LDI0LAkweDIzM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJ4cCIsCSA4LDgsCTB4MzIsCSIxZCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZXFiIiwJMTEsMTYsCTB4M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZXF3IiwJMTEsMTYsCTB4M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZXFkIiwJMTEsMTYsCTB4M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbmViIiwJMTEsMTYsCTB4YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbmV3IiwJMTEsMTYsCTB4YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbmVkIiwJMTEsMTYsCTB4YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY3NiIiwJMTEsMTYsCTB4MTNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NzdyIsCTExLDE2LAkweDEzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjc2QiLAkxMSwxNiwJMHgxM2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2NiIiwJMTEsMTYsCTB4MWJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NjdyIsCTExLDE2LAkweDFiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjY2QiLAkxMSwxNiwJMHgxYmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaGliIiwJMTEsMTYsCTB4MjNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hpdyIsCTExLDE2LAkweDIzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoaWQiLAkxMSwxNiwJMHgyM2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHNiIiwJMTEsMTYsCTB4MmJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xzdyIsCTExLDE2LAkweDJiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsc2QiLAkxMSwxNiwJMHgyYmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ3RiIiwJMTEsMTYsCTB4MzNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2d0dyIsCTExLDE2LAkweDMzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNndGQiLAkxMSwxNiwJMHgzM2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbGViIiwJMTEsMTYsCTB4M2JjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xldyIsCTExLDE2LAkweDNiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsZWQiLAkxMSwxNiwJMHgzYmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZnNiIiwJMTEsMTYsCTB4NDNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzdyIsCTExLDE2LAkweDQzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc2QiLAkxMSwxNiwJMHg0M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZmNiIiwJMTEsMTYsCTB4NGJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZjdyIsCTExLDE2LAkweDRiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmY2QiLAkxMSwxNiwJMHg0YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbG9iIiwJMTEsMTYsCTB4NTNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xvdyIsCTExLDE2LAkweDUzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsb2QiLAkxMSwxNiwJMHg1M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaHNiIiwJMTEsMTYsCTB4NWJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hzdyIsCTExLDE2LAkweDViZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoc2QiLAkxMSwxNiwJMHg1YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHRiIiwJMTEsMTYsCTB4NjNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2x0dyIsCTExLDE2LAkweDYzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsdGQiLAkxMSwxNiwJMHg2M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ2ViIiwJMTEsMTYsCTB4NmJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2dldyIsCTExLDE2LAkweDZiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNnZWQiLAkxMSwxNiwJMHg2YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdXRiIiwJMTEsMTYsCTB4NzNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3V0dyIsCTExLDE2LAkweDczZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1dGQiLAkxMSwxNiwJMHg3M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWZiIiwJMTEsMTYsCTB4N2JjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VmdyIsCTExLDE2LAkweDdiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1ZmQiLAkxMSwxNiwJMHg3YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYXZlIiwJIDgsOCwJMHg2MiwJIjFVIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXRiIiwgICAgMTQsMjQsCTB4MTg0ZSwJIjFCMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdHciLAkxNCwyNCwJMHgxOTRlLAkiMVcyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0ZCIsCTE0LDI0LAkweDFiNGUsCSIxRDJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXRpYiIsCTE0LDI0LAkweDFjNGUsCSIxQjJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXRpdyIsCTE0LDI0LAkweDFkNGUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXRpZCIsCTE0LDI0LAkweDFmNGUsCSIxRDJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNldGNmZyIsCTE1LDI0LAkweDBiMGUsCSIxTyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZnNyIiwJMTQsMjQsCTB4MzczZSwJIjFmIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNrcHNiIiwJMTYsMjQsCTB4MGMwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc3ciLAkxNiwyNCwJMHgwZDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzZCIsCTE2LDI0LAkweDBmMGUsICIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNrcHN0IiwJMTYsMjQsCTB4OGMwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic21yIiwJMTUsMjQsCTB4MGYxZSwJIjJJMU0iLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ByYiIsCSA3LDE2LAkweDJjLAkiMkkxUCIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzcHJ3IiwJIDcsMTYsCTB4MmQsCSIySTFQIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNwcmQiLAkgNywxNiwJMHgyZiwJIjJJMVAiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViZiIsCTE0LDI0LAkweDExYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmwiLAkxNCwyNCwJMHgxMGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJiIiwJIDYsMTYsCTB4MjAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YnciLAkgNiwxNiwJMHgyMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViZCIsCSA2LDE2LAkweDIzLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJjYiIsCSA2LDE2LAkweDMwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJjdyIsCSA2LDE2LAkweDMxLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJjZCIsCSA2LDE2LAkweDMzLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJwYiIsCTE0LDI0LAkweDJjNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YnB3IiwJMTQsMjQsCTB4MmQ0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VicGQiLAkxNCwyNCwJMHgyZjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotI2lmZGVmIE5TMzJLX1NWQ19JTU1FRF9PUEVSQU5EUwotICB7ICJzdmMiLAkgOCw4LAkweGUyLAkiMmkxaSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LCAvKiBub3QgcmVhbGx5LCBidXQgc29tZSB1bml4IHVzZXMgaXQgKi8KLSNlbHNlCi0gIHsgInN2YyIsCSA4LDgsCTB4ZTIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSNlbmRpZgotICB7ICJ0Yml0YiIsCSA2LDE2LAkweDM0LAkiMUIyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0Yml0dyIsCSA2LDE2LAkweDM1LAkiMVcyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0Yml0ZCIsCSA2LDE2LAkweDM3LAkiMUQyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2ZiIiwJMTQsMjQsCTB4MmMzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNmdyIsCTE0LDI0LAkweDJkM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jZmQiLAkxNCwyNCwJMHgyZjNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2xiIiwJMTQsMjQsCTB4MjgzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNsdyIsCTE0LDI0LAkweDI5M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jbGQiLAkxNCwyNCwJMHgyYjNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ3YWl0IiwJIDgsOCwJMHhiMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ3cnZhbCIsCTE5LDI0LAkweDAwNzFlLCIxQSIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ4b3JiIiwJIDYsMTYsCTB4MzgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInhvcnciLAkgNiwxNiwJMHgzOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAieG9yZCIsCSA2LDE2LAkweDNiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkb3RmIiwJMTQsMjQsICAweDBkZmUsICIxRjJGIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRvdGwiLAkxNCwyNCwgIDB4MGNmZSwgIjFMMkwiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibG9nYmYiLAkxNCwyNCwgIDB4MTVmZSwgIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibG9nYmwiLAkxNCwyNCwgIDB4MTRmZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicG9seWYiLAkxNCwyNCwgIDB4MDlmZSwgIjFGMkYiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicG9seWwiLAkxNCwyNCwgIDB4MDhmZSwgIjFMMkwiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NhbGJmIiwJMTQsMjQsICAweDExZmUsICIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjYWxibCIsCTE0LDI0LCAgMHgxMGZlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBudW1vcGNvZGVzPXNpemVvZihuczMya19vcGNvZGVzKS9zaXplb2YobnMzMmtfb3Bjb2Rlc1swXSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3Bjb2RlICpjb25zdCBlbmRvcCA9IG5zMzJrX29wY29kZXMrc2l6ZW9mKG5zMzJrX29wY29kZXMpL3NpemVvZihuczMya19vcGNvZGVzWzBdKTsKLQotI2RlZmluZSBNQVhfQVJHUyA0Ci0jZGVmaW5lIEFSR19MRU4gNTAKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcGouaCBiL2luY2x1ZGUvb3Bjb2RlL3BqLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NTliNjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvcGouaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIERlZmluaXRpb25zIGZvciBkZWNvZGluZyB0aGUgcGljb0phdmEgb3Bjb2RlIHRhYmxlLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgVHJhbnNtZXRhIChzYWNAcG9ib3guY29tKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBOYW1lcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSB0eXBlIG9mIGluc3RydWN0aW9uIGFyZ3VtZW50cywgdXNlZCBieQotICAgdGhlIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyLiAgQXR0cmlidXRlcyBhcmUgZW5jb2RlZCBpbiB2YXJpb3VzIGZpZWxkcy4gKi8KLQotLyogICAgICAgICAgICByZWxvYyAgc2l6ZSBwY3JlbCAgICB1bnMgKi8KLSNkZWZpbmUgT19OICAgIDAKLSNkZWZpbmUgT18xNiAgKDE8PDQgfCAyIHwgKDA8PDYpIHwgKDA8PDMpKQotI2RlZmluZSBPX1UxNiAoMTw8NCB8IDIgfCAoMDw8NikgfCAoMTw8MykpCi0jZGVmaW5lIE9fUjE2ICgyPDw0IHwgMiB8ICgxPDw2KSB8ICgwPDwzKSkKLSNkZWZpbmUgT184ICAgKDM8PDQgfCAxIHwgKDA8PDYpIHwgKDA8PDMpKQotI2RlZmluZSBPX1U4ICAoMzw8NCB8IDEgfCAoMDw8NikgfCAoMTw8MykpCi0jZGVmaW5lIE9fUjggICg0PDw0IHwgMSB8ICgwPDw2KSB8ICgwPDwzKSkKLSNkZWZpbmUgT19SMzIgKDU8PDQgfCA0IHwgKDE8PDYpIHwgKDA8PDMpKQotI2RlZmluZSBPXzMyICAoNjw8NCB8IDQgfCAoMDw8NikgfCAoMDw8MykpCi0KLSNkZWZpbmUgQVNJWkUoeCkgICgoeCkgJiAweDcpCi0jZGVmaW5lIFBDUkVMKHgpICAoISEoKHgpICYgKDE8PDYpKSkKLSNkZWZpbmUgVU5TKHgpICAgICghISgoeCkgJiAoMTw8MykpKQotCi0gICAgICAgICAgICAgICAgICAKLXR5cGVkZWYgc3RydWN0IAotewotICBzaG9ydCBvcGNvZGU7Ci0gIHNob3J0IG9wY29kZV9uZXh0OwotICBjaGFyIGxlbjsKLSAgdW5zaWduZWQgY2hhciBhcmdbMl07Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19IHBqX29wY19pbmZvX3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9wbi5oIGIvaW5jbHVkZS9vcGNvZGUvcG4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1OWEyYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9wbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qIFByaW50IEdPVUxEIFBOIChQb3dlck5vZGUpIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLUdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGdsZF9vcGNvZGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgY2hhciAqYXJnczsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQKLSAgIGlzIHRoZSBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbgotICAgaXMgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBhdCBtb3N0IGZvdXIuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgYmFzZWQgb24gdGhlIG9wY29kZS4KLQotICAgVGhlIG1hc2sgY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzCi0gICB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICByICBSZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgUiAgUmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICBiICBCYXNlIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBCICBCYXNlIHJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgdiAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBWICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEEgIE9wdGlvbmFsIGFkZHJlc3MgcmVnaXN0ZXIgKGJhc2UgcmVnaXN0ZXIpCi0gICBYICBPcHRpb25hbCBpbmRleCByZWdpc3RlcgotICAgSSAgSW1tZWRpYXRlIGRhdGEgKDE2Yml0cyBzaWduZWQpCi0gICBPICBPZmZzZXQgZmllbGQgKDE2Yml0cyBzaWduZWQpCi0gICBoICBPZmZzZXQgZmllbGQgKDE1Yml0cyBzaWduZWQpCi0gICBkICBPZmZzZXQgZmllbGQgKDE0Yml0cyBzaWduZWQpCi0gICBTICBTaGlmdCBjb3VudCBmaWVsZAotCi0gICBhbnkgb3RoZXIgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBhcyBpcy4uLgotKi8KLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi1zdHJ1Y3QgZ2xkX29wY29kZSBnbGRfb3Bjb2Rlc1tdID0KLXsKLXsgImFibSIsCTB4YTAwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiYWJyIiwJMHgxODA4MDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCi17ICJhY2kiLAkweGZjNzcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImFkZmQiLAkweGUwMDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkZnciLAkweGUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkaSIsCTB4YzgwMTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiYWRtYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtdyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRyIiwJMHgzODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJmZCIsCTB4MzgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRyZnciLAkweDM4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFkcm0iLAkweDM4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFpIiwgCTB4ZmMwMzAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImFubWIiLAkweDg0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWQiLAkweDg0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWgiLAkweDg0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFubXciLAkweDg0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFuciIsCTB4MDQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYXJtYiIsCTB4ZTgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtZCIsCTB4ZTgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtaCIsCTB4ZTgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtdyIsCTB4ZTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmNmIiwJMHhmMDAwMDAwMCwJMHhmYzA4MDAwMCwJIkkseE9BLFgiLAk0IH0sCi17ICJiY3QiLAkweGVjMDAwMDAwLAkweGZjMDgwMDAwLAkiSSx4T0EsWCIsCTQgfSwKLXsgImJlaSIsCTB4MDAwNjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiYmZ0IiwJMHhmMDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmliIiwJMHhmNDAwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmlkIiwJMHhmNDYwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmloIiwJMHhmNDIwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYml3IiwJMHhmNDQwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmwiLCAJMHhmODgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnN1YiIsCTB4NWMwODAwMDAsCTB4ZmY4ZjAwMDAsCSIiLAkJMiB9LAoteyAiYnN1Ym0iLAkweDI4MDgwMDAwLAkweGZjMDgwMDAwLAkiIiwJCTQgfSwKLXsgImJ1IiwgCTB4ZWMwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImNhbGwiLAkweDI4MDgwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImNhbGxtIiwJMHg1YzA4MDAwMCwJMHhmZjg4MDAwMCwJIiIsCQk0IH0sCi17ICJjYW1iIiwJMHg5MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1kIiwJMHg5MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1oIiwJMHg5MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJjYW13IiwJMHg5MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIueE9BLFgiLAk0IH0sCi17ICJjYXIiLAkweDEwMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNkIiwgCTB4ZmMwNjAwMDAsCTB4ZmMwNzAwMDAsCSJyLGYiLAkJNCB9LAoteyAiY2VhIiwJMHgwMDBmMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJjaSIsIAkweGM4MDUwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImNtYyIsCTB4MDQwYTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImNtbWIiLAkweDk0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbWQiLAkweDk0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbWgiLAkweDk0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbXciLAkweDk0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNtciIsCTB4MTQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZGFjaSIsCTB4ZmM3ZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiZGFlIiwJMHgwMDBlMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJkYWkiLAkweGZjMDQwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJkY2kiLAkweGZjNmYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImRpIiwgCTB4ZmMwMTAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImR2ZmQiLAkweGU0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImR2ZnciLAkweGU0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImR2aSIsCTB4YzgwNDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZHZtYiIsCTB4YzQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtaCIsCTB4YzQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtdyIsCTB4YzQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZyIiwJMHgzODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkdnJmZCIsCTB4MzgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJNCB9LAoteyAiZHZyZnciLAkweDM4MDQwMDAwLAkweGZjMGYwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVhZSIsCTB4MDAwODAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiZWNpIiwJMHhmYzY3MDAwMCwJMHhmYzdmODA4MCwJInIsSSIsCQk0IH0sCi17ICJlY3djcyIsCTB4ZmM0ZjAwMDAsCTB4ZmM3ZjgwMDAsCSIiLAkJNCB9LAoteyAiZWkiLCAJMHhmYzAwMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiZW9tYiIsCTB4OGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tZCIsCTB4OGMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9taCIsCTB4OGMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tdyIsCTB4OGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9yIiwJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJlb3JtIiwJMHgwYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJlcyIsIAkweDAwMDQwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJleG0iLAkweGE4MDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJleHIiLAkweGM4MDcwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJleHJyIiwJMHhjODA3MDAwMiwJMHhmYzdmMDAwMiwJInIiLAkJMiB9LAoteyAiZml4ZCIsCTB4MzgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZml4dyIsCTB4MzgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZmx0ZCIsCTB4MzgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZmx0dyIsCTB4MzgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZ3JpbyIsCTB4ZmMzZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiaGFsdCIsCTB4MDAwMDAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiaGlvIiwJMHhmYzM3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJqd2NzIiwJMHhmYTA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAibGEiLCAJMHg1MDAwMDAwMCwJMHhmYzAwMDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYWJyIiwJMHg1ODA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsYiIsIAkweGFjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxjcyIsIAkweDAwMDMwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJsZCIsIAkweGFjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxlYXIiLCAJMHg4MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZiIsIAkweGNjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxmYnIiLCAJMHhjYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsaCIsIAkweGFjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImxpIiwgCTB4YzgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibG1hcCIsCTB4MmMwNzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImxtYiIsCTB4YjAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG1kIiwJMHhiMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsbWgiLAkweGIwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImxtdyIsCTB4YjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5iIiwJMHhiNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbmQiLAkweGI0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxuaCIsCTB4YjQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG53IiwJMHhiNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJscHNkIiwJMHhmOTgwMDAwMCwJMHhmZjg4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJscHNkY20iLAkweGZhODAwMDAwLAkweGZmODgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImx3IiwgCTB4YWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdiciIsIAkweDVjMDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgIm1wZmQiLAkweGU0MDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wZnciLAkweGU0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1waSIsCTB4YzgwMzAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibXBtYiIsCTB4YzAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBtaCIsCTB4YzAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBtdyIsCTB4YzAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXByIiwJMHgzODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJmZCIsCTB4MzgwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZnciLAkweDM4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm5vcCIsCTB4MDAwMjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAib3JtYiIsCTB4ODgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtZCIsCTB4ODgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtaCIsCTB4ODgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtdyIsCTB4ODgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JyIiwJMHgwODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJvcnJtIiwJMHgwODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJyZHN0cyIsCTB4MDAwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJldHVybiIsCTB4MjgwZTAwMDAsCTB4ZmM3ZjAwMDAsCSIiLAkJMiB9LAoteyAicmkiLCAJMHhmYzAyMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAicm5kIiwJMHgwMDA1MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAicnBzd3QiLAkweDA0MGIwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJyc2NobmwiLAkweGZjMmYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInJzY3RsIiwJMHhmYzQ3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJyd2NzIiwJMHgwMDBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzYWN6IiwJMHgxMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzYm0iLAkweDk4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInNiciIsCTB4MTgwMDAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJNCB9LAoteyAic2VhIiwJMHgwMDBkMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJzZXRjcHUiLAkweDJjMDkwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJzaW8iLAkweGZjMTcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInNpcHUiLAkweDAwMGEwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgInNsYSIsCTB4MWM0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xhZCIsCTB4MjA0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xjIiwJMHgyNDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGwiLAkweDFjNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbGQiLAkweDIwNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNtYyIsCTB4MDQwNzAwMDAsCTB4ZmMwNzAwMDAsCSIiLAkJMiB9LAoteyAic3JhIiwJMHgxYzAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmFkIiwJMHgyMDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmMiLAkweDI0MDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNybCIsCTB4MWMyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsZCIsCTB4MjAyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3RiIiwJMHhkNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGQiLAkweGQ0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZiIsCTB4ZGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmYnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN0aCIsCTB4ZDQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtYiIsCTB4ZDgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtZCIsCTB4ZDgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtaCIsCTB4ZDgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtdyIsCTB4ZDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RwaW8iLAkweGZjMjcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInN0dyIsCTB4ZDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3R3YnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN1YWJyIiwJMHg1ODAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdWZkIiwJMHhlMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdWZ3IiwJMHhlMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdWkiLAkweGM4MDIwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgInN1bWIiLAkweGJjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWQiLAkweGJjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWgiLAkweGJjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bXciLAkweGJjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ciIsCTB4M2MwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VyZmQiLAkweDM4MGIwMDAwLAkweGZjMGYwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1cmZ3IiwJMHgzODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdXJtIiwJMHgzYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdmMiLAkweGM4MDYwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTQgfSwKLXsgInRibSIsCTB4YTQwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAidGJyIiwJMHgxODBjMDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCi17ICJ0YnJyIiwJMHgyYzAyMDAwMCwJMHhmYzBmMDAwMCwJInIsQiIsCQkyIH0sCi17ICJ0Y2NyIiwJMHgyODA0MDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJ0ZCIsIAkweGZjMDUwMDAwLAkweGZjMDcwMDAwLAkicixmIiwJCTQgfSwKLXsgInRpbyIsCTB4ZmMxZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAidG1hcHIiLAkweDJjMGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRwY2JyIiwJMHgyODBjMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAidHJiciIsCTB4MmMwMTAwMDAsCTB4ZmMwZjAwMDAsCSJiLFIiLAkJMiB9LAoteyAidHJjIiwJMHgyYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmNjIiwJMHgyODA1MDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJ0cmNtIiwJMHgyYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm4iLAkweDJjMDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybm0iLAkweDJjMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyciIsCTB4MmMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJybSIsCTB4MmMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJzYyIsCTB4MmMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJzdyIsCTB4MjgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRzY3IiLAkweDJjMGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVlaSIsCTB4MDAwNzAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAid2FpdCIsCTB4MDAwMTAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAid2N3Y3MiLAkweGZjNWYwMDAwLAkweGZjN2Y4MDAwLAkiIiwJCTQgfSwKLXsgInd3Y3MiLAkweDAwMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInhjYnIiLAkweDI4MDIwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKLXsgInhjciIsCTB4MmMwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNybSIsCTB4MmMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiemJtIiwJMHg5YzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6YnIiLAkweDE4MDQwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgInptYiIsCTB4ZjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1kIiwJMHhmODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWgiLAkweGY4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInptdyIsCTB4ZjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAienIiLCAJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAotfTsKLQotaW50IG51bW9wY29kZXMgPSBzaXplb2YoZ2xkX29wY29kZXMpIC8gc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKLQotc3RydWN0IGdsZF9vcGNvZGUgKmVuZG9wID0gZ2xkX29wY29kZXMgKyBzaXplb2YoZ2xkX29wY29kZXMpIC8KLQkJc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3BwYy5oIGIvaW5jbHVkZS9vcGNvZGUvcHBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NGYwZGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvcHBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyogcHBjLmggLS0gSGVhZGVyIGZpbGUgZm9yIFBvd2VyUEMgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBQUENfSAotI2RlZmluZSBQUENfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBwb3dlcnBjX29wY29kZS4gICovCi0KLXN0cnVjdCBwb3dlcnBjX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGRlZmluZWQgdmFsdWVzCi0gICAgIGFyZSBsaXN0ZWQgYmVsb3cuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlIHBvd2VycGNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBwb3dlcnBjX251bV9vcGNvZGVzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHBvd2VycGNfb3Bjb2RlLiAgKi8KLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfUFBDICgwMSkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQT1dFUiAoUlMvNjAwMCkgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUiAoMDIpCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgUE9XRVIyIChSaW9zIDIpIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfUE9XRVIyICgwNCkKLQotLyogT3Bjb2RlIGlzIG9ubHkgZGVmaW5lZCBvbiAzMiBiaXQgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfMzIgKDAxMCkKLQotLyogT3Bjb2RlIGlzIG9ubHkgZGVmaW5lZCBvbiA2NCBiaXQgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjQgKDAyMCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEgcHJvY2Vzc29yLiAgVGhlIDYwMQotICAgaXMgYXNzdW1lZCB0byBzdXBwb3J0IGFsbCBQb3dlclBDIChQUENfT1BDT0RFX1BQQykgaW5zdHJ1Y3Rpb25zLAotICAgYnV0IGl0IGFsc28gc3VwcG9ydHMgbWFueSBhZGRpdGlvbmFsIFBPV0VSIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjAxICgwNDApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgaW4gYm90aCB0aGUgUG93ZXIgYW5kIFBvd2VyUEMgYXJjaGl0ZWN0dXJlcwotICAgKGllLCBjb21waWxlcidzIC1tY3B1PWNvbW1vbiBvciBhc3NlbWJsZXIncyAtbWNvbSkuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX0NPTU1PTiAoMDEwMCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBmb3IgYW55IFBvd2VyIG9yIFBvd2VyUEMgcGxhdGZvcm0gKHRoaXMgaXMKLSAgIGZvciB0aGUgYXNzZW1ibGVyJ3MgLW1hbnkgb3B0aW9uLCBhbmQgaXQgZWxpbWluYXRlcyBkdXBsaWNhdGVzKS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfQU5ZICgwMjAwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGFzIHBhcnQgb2YgdGhlIDY0LWJpdCBicmlkZ2UuICAqLwotI2RlZmluZSBQUENfT1BDT0RFXzY0X0JSSURHRSAoMDQwMCkKLQotLyogQSBtYWNybyB0byBleHRyYWN0IHRoZSBtYWpvciBvcGNvZGUgZnJvbSBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFBQQ19PUChpKSAoKChpKSA+PiAyNikgJiAweDNmKQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBwb3dlcnBjX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19vcGVyYW5kCi17Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGludCBzaGlmdDsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotICB1bnNpZ25lZCBsb25nICgqaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBsb25nIG9wLAotCQkJCSAgIGNvbnN0IGNoYXIgKiplcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoKG8tPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIGxvbmcgKCpleHRyYWN0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIHBvd2VycGNfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kIHBvd2VycGNfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBwb3dlcnBjX29wZXJhbmQuICAqLwotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1NJR05FRCAoMDEpCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLCBidXQgYWxzbyBhY2NlcHRzIGEgZnVsbCBwb3NpdGl2ZQotICAgcmFuZ2Ugb2YgdmFsdWVzIHdoZW4gcnVubmluZyBpbiAzMiBiaXQgbW9kZS4gIFRoYXQgaXMsIGlmIGJpdHMgaXMKLSAgIDE2LCBpdCB0YWtlcyBhbnkgdmFsdWUgZnJvbSAtMHg4MDAwIHRvIDB4ZmZmZi4gIEluIDY0IGJpdCBtb2RlLAotICAgdGhpcyBmbGFnIGlzIGlnbm9yZWQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9TSUdOT1BUICgwMikKLQotLyogVGhpcyBvcGVyYW5kIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGluIHRoZSBhc3NlbWJsZXIgaW5wdXQuICBUaGlzCi0gICBpcyB1c2VkIHRvIHN1cHBvcnQgZXh0ZW5kZWQgbW5lbW9uaWNzIHN1Y2ggYXMgbXIsIGZvciB3aGljaCB0d28KLSAgIG9wZXJhbmRzIGZpZWxkcyBhcmUgaWRlbnRpY2FsLiAgVGhlIGFzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUKLSAgIGluc2VydCBmdW5jdGlvbiB3aXRoIGFueSBvcCB2YWx1ZS4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNhbGwKLSAgIHRoZSBleHRyYWN0IGZ1bmN0aW9uLCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSwgYW5kIGNoZWNrIHRoZSB2YWx1ZQotICAgcGxhY2VkIGluIHRoZSB2YWxpZCBhcmd1bWVudC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0ZBS0UgKDA0KQotCi0vKiBUaGUgbmV4dCBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuCi0gICBzZXBhcmF0ZWQgZnJvbSB0aGlzIG9uZSBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgbG9hZCBhbmQKLSAgIHN0b3JlIGluc3RydWN0aW9ucyB3aGljaCB3YW50IHRoZWlyIG9wZXJhbmRzIHRvIGxvb2sgbGlrZQotICAgICAgIHJlZyxkaXNwbGFjZW1lbnQocmVnKQotICAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfUEFSRU5TICgwMTApCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgdXNlIHRoZSBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIENSIGZpZWxkcywgd2hpY2gKLSAgIGFyZQotICAgICAgIGx0ICAwCWd0ICAxCWVxICAyCXNvICAzCXVuICAzCi0gICAgICAgY3IwIDAJY3IxIDEJY3IyIDIJY3IzIDMKLSAgICAgICBjcjQgNAljcjUgNQljcjYgNgljcjcgNwotICAgVGhlc2UgbWF5IGJlIGNvbWJpbmVkIGFyaXRobWV0aWNhbGx5LCBhcyBpbiBjcjIqNCtndC4gIFRoZXNlIGFyZQotICAgb25seSBzdXBwb3J0ZWQgb24gdGhlIFBvd2VyUEMsIG5vdCB0aGUgUE9XRVIuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9DUiAoMDIwKQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSByZWdpc3Rlci4gIFRoZSBkaXNhc3NlbWJsZXIgdXNlcyB0aGlzIHRvIHByaW50Ci0gICByZWdpc3RlciBuYW1lcyB3aXRoIGEgbGVhZGluZyAncicuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9HUFIgKDA0MCkKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ2YnLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfRlBSICgwMTAwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1JFTEFUSVZFICgwMjAwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIGFkZHJlc3MuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfQUJTT0xVVEUgKDA0MDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbCwgYW5kIGlzIHplcm8gaWYgb21pdHRlZC4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIHRoZSBvcHRpb25hbCBCRiBhbmQgTCBmaWVsZHMgaW4gdGhlIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLiAgVGhlCi0gICBhc3NlbWJsZXIgbXVzdCBjb3VudCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBvbiB0aGUgbGluZSwKLSAgIGFuZCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBmb3IgdGhlIG9wY29kZSwgYW5kIGRlY2lkZQotICAgd2hldGhlciB0aGlzIG9wZXJhbmQgaXMgcHJlc2VudCBvciBub3QuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZAotICAgcHJpbnQgdGhpcyBvcGVyYW5kIG91dCBvbmx5IGlmIGl0IGlzIG5vdCB6ZXJvLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfT1BUSU9OQUwgKDAxMDAwKQotCi0vKiBUaGlzIGZsYWcgaXMgb25seSB1c2VkIHdpdGggUFBDX09QRVJBTkRfT1BUSU9OQUwuICBJZiB0aGlzIG9wZXJhbmQKLSAgIGlzIG9taXR0ZWQsIHRoZW4gZm9yIHRoZSBuZXh0IG9wZXJhbmQgdXNlIHRoaXMgb3BlcmFuZCB2YWx1ZSBwbHVzCi0gICAxLCBpZ25vcmluZyB0aGUgbmV4dCBvcGVyYW5kIGZpZWxkIGZvciB0aGUgb3Bjb2RlLiAgVGhpcyB3cmV0Y2hlZAotICAgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgUG93ZXIgcm90YXRlIGluc3RydWN0aW9ucyBjYW4gdGFrZQotICAgZWl0aGVyIDQgb3IgNSBvcGVyYW5kcy4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIHByaW50IHRoaXMgb3BlcmFuZAotICAgb3V0IHJlZ2FyZGxlc3Mgb2YgdGhlIFBQQ19PUEVSQU5EX09QVElPTkFMIGZpZWxkLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfTkVYVCAoMDIwMDApCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYSBuZWdhdGl2ZSBudW1iZXIgZm9yIHRoZQotICAgcHVycG9zZXMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcgKGkuZS4sIHRoZSBub3JtYWwgbW9zdCBuZWdhdGl2ZQotICAgbnVtYmVyIGlzIGRpc2FsbG93ZWQgYW5kIG9uZSBtb3JlIHRoYW4gdGhlIG5vcm1hbCBtb3N0IHBvc2l0aXZlCi0gICBudW1iZXIgaXMgYWxsb3dlZCkuICBUaGlzIGZsYWcgd2lsbCBvbmx5IGJlIHNldCBmb3IgYSBzaWduZWQKLSAgIG9wZXJhbmQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9ORUdBVElWRSAoMDQwMDApCi0MCi0vKiBUaGUgUE9XRVIgYW5kIFBvd2VyUEMgYXNzZW1ibGVycyB1c2UgYSBmZXcgbWFjcm9zLiAgV2Uga2VlcCB0aGVtCi0gICB3aXRoIHRoZSBvcGVyYW5kcyB0YWJsZSBmb3Igc2ltcGxpY2l0eS4gIFRoZSBtYWNybyB0YWJsZSBpcyBhbgotICAgYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfbWFjcm8uICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19tYWNybwotewotICAvKiBUaGUgbWFjcm8gbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBvcGVyYW5kcyB0aGUgbWFjcm8gdGFrZXMuICAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIHZhbHVlcyBhcmUgdGhlCi0gICAgIHNhbWUgYXMgdGhvc2UgZm9yIHRoZSBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgZmxhZ3MgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEEgZm9ybWF0IHN0cmluZyB0byB0dXJuIHRoZSBtYWNybyBpbnRvIGEgbm9ybWFsIGluc3RydWN0aW9uLgotICAgICBFYWNoICVOIGluIHRoZSBzdHJpbmcgaXMgcmVwbGFjZWQgd2l0aCBvcGVyYW5kIG51bWJlciBOICh6ZXJvCi0gICAgIGJhc2VkKS4gICovCi0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyBwb3dlcnBjX21hY3Jvc1tdOwotZXh0ZXJuIGNvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3M7Ci0KLSNlbmRpZiAvKiBQUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcHlyLmggYi9pbmNsdWRlL29wY29kZS9weXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MzJiOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9weXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKiBweXJhbWlkLm9wY29kZS5oIC0tIGdkYiBpbml0aWFsIGF0dGVtcHQuICovCi0KLS8qIHB5cmFtaWQgb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzCi0gICBwYXJ0aWN1bGFyIG9wY29kZSAqLwotCi1zdHJ1Y3QgcHlyX2RhdHVtCi17Ci0gIGNoYXIgICAgICAgICAgICAgIG5hcmdzOwotICBjaGFyICogICAgICAgICAgICBhcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotICB1bnNpZ25lZCBsb25nICAgICBtYXNrOwkvKiBCaXQgdmVjdG9yOiB3aGljaCBvcGVyYW5kIG1vZGVzIGFyZSB2YWxpZAotCQkJCSAgIGZvciB0aGlzIG9wY29kZSAqLwotICB1bnNpZ25lZCBjaGFyICAgICBjb2RlOwkvKiBvcC1jb2RlIChhbHdheXMgNig/KSBiaXRzICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBweXJfaW5zbl9mb3JtYXQgewotICAgIHVuc2lnbmVkIGludCBtb2RlIDo0OwotICAgIHVuc2lnbmVkIGludCBvcGVyYXRvciA6ODsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXhfc2NhbGUgOjI7Ci0gICAgdW5zaWduZWQgaW50IGluZGV4X3JlZyA6NjsKLSAgICB1bnNpZ25lZCBpbnQgb3BlcmFuZF8xIDo2OwotICAgIHVuc2lnbmVkIGludCBvcGVyYW5kXzI6NjsKLX0gcHlyX2luc25fZm9ybWF0OwotCQotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMuCi0gICBQeXJhbWlkIGlzIHN1ZmZpY2llbnRseSBSSVNDeSB0aGF0OgotICAgICAgLSBpbnNucyBhcmUgYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiB3b3JkczsKLSAgICAgIC0gdGhlIGxlbmd0aCBvZiBhbnkgaW5zbiBjYW4gYmUgdG9sZCBmcm9tIHRoZSBmaXJzdCB3b3JkIG9mCi0gICAgICAgIHRoZSBpbnNuLiAoaWUsIGlmIHRoZXJlIGFyZSB6ZXJvLCBvbmUsIG9yIHR3byB3b3JkcyBvZgotCWltbWVkaWF0ZSBvcGVyYW5kL29mZnNldCkuCi0KLSAgIAotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGNoYXJhY3RlcnMgZm9yIGVhY2gKLSAgIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IHNwZWNpZmllcyB0aGUga2luZCBvZiBvcGVyYW5kOwotICAgdGhlIHNlY29uZCwgdGhlIHBsYWNlIGl0IGlzIHN0b3JlZC4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICBtYXNrCSBhc3NlbWJsZXIgc3ludGF4CWRlc2NyaXB0aW9uCi0gICAweDAwMDE6ICBtb3Z3IFJuLFJuCQlyZWdpc3RlciB0byByZWdpc3RlcgotICAgMHgwMDAyOiAgbW92dyBLLFJuCQlxdWljayBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKLSAgIDB4MDAwNDogIG1vdncgSSxSbgkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKLSAgIDB4MDAwODogIG1vdncgKFJuKSxSbglyZWdpc3RlciBpbmRpcmVjdCB0byByZWdpc3RlcgotICAgCSAgICBtb3Z3IChSbilbeF0sUm4JcmVnaXN0ZXIgaW5kaXJlY3QgdG8gcmVnaXN0ZXIKLSAgIDB4MDAxMDogIG1vdncgSShSbiksUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0IHRvIHJlZ2lzdGVyCi0gICAJICAgIG1vdncgSShSbilbeF0sUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0LCBpbmRleGVkLCB0byByZWdpc3RlcgotCi0gICAweDAwMjA6ICBtb3Z3IFJuLChSbikJcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgICAgICAgCi0gICAweDAwNDA6ICBtb3Z3IEssKFJuKQkJcXVpY2sgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0ICAgICAgICAgCi0gICAweDAwODA6ICBtb3Z3IEksKFJuKQkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgCi0gICAweDAxMDA6ICBtb3Z3IChSbiksKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCAgICAgICAKLSAgIDB4MDEwMDogIG1vdncgKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0ICAgICAgIAotICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAotICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAotCi0gICAweDA0MDA6ICBtb3Z3IFJuLEkoUm4pCXJlZ2lzdGVyIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgwODAwOiAgbW92dyBLLEkoUm4pCXF1aWNrIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgSSxJKFJuKQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgKFJuKSxJKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgSShSbiksSShSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0Ci0gICAJCQkJCStvZmZzZXQKLSAgIDB4MDAwMDogIChpcnJlZ3VsYXIpCQk/Pz8KLSAgIAotCi0gICBFYWNoIGluc24gaGFzIGEgZm91ci1iaXQgZmllbGQgZW5jb2RpbmcgdGhlIHR5cGUocykgb2YgaXRzIG9wZXJhbmRzLgotKi8KLQotLyogU29tZSBjb21tb24gY29tYmluYXRpb25zCi0gICAqLwotCi0vKiB0aGUgZmlyc3QgNSwoMHgxfDB4MnwweDR8MHg4fDB4MTApIGllICgxfDJ8NHw4fDE2KSwgaWUgKCAzMiAtMSkqLwotI2RlZmluZSBHRU5fVE9fUkVHICgzMSkKLQotI2RlZmluZQlVTktOT1dOICgodW5zaWduZWQgbG9uZyktMSkKLSNkZWZpbmUgQU5ZIChHRU5fVE9fUkVHIHwgKEdFTl9UT19SRUcgPDwgNSkgfCAoR0VOX1RPX1JFRyA8PCAxNSkpCi0KLSNkZWZpbmUgQ09OVkVSVCAoMXw4fDB4MTB8MHgyMHwweDIwMCkKLQotI2RlZmluZSBLX1RPX1JFRyAoMikKLSNkZWZpbmUgSV9UT19SRUcgKDQpCi0jZGVmaW5lIE5PVEtfVE9fUkVHIChHRU5fVE9fUkVHICYgfktfVE9fUkVHKQotI2RlZmluZSBOT1RJX1RPX1JFRyAoR0VOX1RPX1JFRyAmIH5JX1RPX1JFRykKLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi0KLXN0cnVjdCBweXJfb3Bjb2RlCQkvKiBweXIgb3Bjb2RlIHRleHQgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgbmFtZTsJLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLwotICBzdHJ1Y3QgcHlyX2RhdHVtICBkYXR1bTsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSBweXJfaG93IGFyZ3MKLSNkZWZpbmUgcHlyX25hcmdzIG5hcmdzCi0jZGVmaW5lIHB5cl9tYXNrIG1hc2sKLSNkZWZpbmUgcHlyX25hbWUgbmFtZQotCi1zdHJ1Y3QgcHlyX29wY29kZSBweXJfb3Bjb2Rlc1tdID0KLXsKLSAgeyJtb3ZiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MTF9LCB9LAotICB7Im1vdmgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgxMn0gfSwKLSAgeyJtb3Z3IiwJeyAyLCAiIiwgQU5ZLAkJCTB4MTB9IH0sCi0gIHsibW92bCIsCXsgMiwgIiIsIEFOWSwJCQkweDEzfSB9LAotICB7Im1uZWd3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTR9IH0sCi0gIHsibW5lZ2YiLAl7IDIsICIiLCAweDEsCQkJMHgxNX0gfSwKLSAgeyJtbmVnZCIsCXsgMiwgIiIsIDB4MSwJCQkweDE2fSB9LAotICB7Im1jb213IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTd9IH0sCi0gIHsibWFic3ciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxOH0gfSwKLSAgeyJtYWJzZiIsCXsgMiwgIiIsIDB4MSwJCQkweDE5fSB9LAotICB7Im1hYnNkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWF9IH0sCi0gIHsibXRzdHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxY30gfSwKLSAgeyJtdHN0ZiIsCXsgMiwgIiIsIDB4MSwJCQkweDFkfSB9LAotICB7Im10c3RkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWV9IH0sCi0gIHsibW92YSIsCXsgMiwgIiIsIDB4OHwweDEwLAkJMHgxZn0gfSwKLSAgeyJtb3Z6YnciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMH0gfSwKLSAgeyJtb3Z6aHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMX0gfSwKLQkJCQkvKiAyIGluc25zIG91dCBvZiBvcmRlciBoZXJlICovCi0gIHsibW92YmwiLAl7IDIsICIiLCAxLAkJCTB4NGZ9IH0sCi0gIHsiZmlsYmwiLAl7IDIsICIiLCAxLAkJCTB4NGV9IH0sCi0KLSAgeyJjdnRidyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDIyfSB9LAotICB7ImN2dGh3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjN9IH0sCi0gIHsiY3Z0d2IiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyNH0gfSwKLSAgeyJjdnR3aCIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI1fSB9LAotICB7ImN2dHdmIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjZ9IH0sCi0gIHsiY3Z0d2QiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyN30gfSwKLSAgeyJjdnRmdyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI4fSB9LAotICB7ImN2dGZkIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4Mjl9IH0sCi0gIHsiY3Z0ZHciLAl7IDIsICIiLCBDT05WRVJULAkJMHgyYX0gfSwKLSAgeyJjdnRkZiIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDJifSB9LAotCi0gIHsiYWRkdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQwfSB9LAotICB7ImFkZHdjIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDF9IH0sCi0gIHsic3VidyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQyfSB9LAotICB7InN1YndiIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDN9IH0sCi0gIHsicnN1YnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0NH0gfSwKLSAgeyJtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDV9IH0sCi0gIHsiZW11bCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ3fSB9LAotICB7InVtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDZ9IH0sCi0gIHsiZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ4fSB9LAotICB7ImVkaXYiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0YX0gfSwKLSAgeyJyZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRifSB9LAotICB7InVkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDl9IH0sCi0gIHsibW9kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRjfSB9LAotICB7InVtb2R3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGR9IH0sCi0KLQotICB7ImFkZGYiLAl7IDIsICIiLCAxLAkJCTB4NTB9IH0sCi0gIHsiYWRkZCIsCXsgMiwgIiIsIDEsCQkJMHg1MX0gfSwKLSAgeyJzdWJmIiwJeyAyLCAiIiwgMSwJCQkweDUyfSB9LAotICB7InN1YmQiLAl7IDIsICIiLCAxLAkJCTB4NTN9IH0sCi0gIHsibXVsZiIsCXsgMiwgIiIsIDEsCQkJMHg1Nn0gfSwKLSAgeyJtdWxkIiwJeyAyLCAiIiwgMSwJCQkweDU3fSB9LAotICB7ImRpdmYiLAl7IDIsICIiLCAxLAkJCTB4NTh9IH0sCi0gIHsiZGl2ZCIsCXsgMiwgIiIsIDEsCQkJMHg1OX0gfSwKLQotCi0gIHsiY21wYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDYxfSB9LAotICB7ImNtcGgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Mn0gfSwKLSAgeyJjbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjB9IH0sCi0gIHsidWNtcGIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Nn0gfSwKLSAgLyogV0hZIG5vICJ1Y21waCI/Pz8gKi8KLSAgeyJ1Y21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY1fSB9LAotICB7InhjaHciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwZn0gfSwKLQotCi0gIHsiYW5kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMwfSB9LAotICB7Im9ydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMxfSB9LAotICB7InhvcnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzMn0gfSwKLSAgeyJiaWN3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzN9IH0sCi0gIHsibHNobHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzOH0gfSwKLSAgeyJhc2hsdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNhfSB9LAotICB7ImFzaGxsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2N9IH0sCi0gIHsiYXNocnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzYn0gfSwKLSAgeyJhc2hybCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNkfSB9LAotICB7InJvdGx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2V9IH0sCi0gIHsicm90cnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzZn0gfSwKLQotICAvKiBwdXNoIGFuZCBwb3AgaW5zbnMgYXJlICJnb2luZyBhd2F5IG5leHQgcmVsZWFzZSIuICovCi0gIHsicHVzaHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgwY30gfSwKLSAgeyJwb3B3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MGR9IH0sCi0gIHsicHVzaGEiLAl7IDIsICIiLCAoMHg4fDB4MTApLAkJMHgwZX0gfSwKLQotICB7ImJpdHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MzV9IH0sCi0gIHsiYml0Y3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgzNn0gfSwKLSAgLyogc29tZSBraW5kIG9mIGlicmEvZGJyYSBpbnNucz8/Ki8KLSAgeyJpY21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY3fSB9LAotICB7ImRjbXB3IiwJeyAyLCAiIiwgKDF8NHwweDIwfDB4ODB8MHg0MDB8MHgxMDAwKSwJMHg2OX0gfSwvKkZJWE1FKi8KLSAgeyJhY21wdyIsCXsgMiwgIiIsIDEsCQkJMHg2Yn0gfSwKLQotICAvKiBDYWxsIGlzIHdyaXR0ZW4gYXMgYSAxLW9wIGluc24sIGJ1dCBpcyBhbHdheXMgKGRpcylhc3NlbWJsZWQgYXMgYSAyLW9wCi0gICAgIGluc24gd2l0aCBhIDJuZCBvcCBvZiB0cjE0LiAgIFRoZSBhc3NlbWJsZXIgd2lsbCBoYXZlIHRvIGdyb2sgdGhpcy4gICovCi0gIHsiY2FsbCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDA0fSB9LAotICB7ImNhbGwiLAl7IDEsICIiLCBHRU5fVE9fUkVHLAkJMHgwNH0gfSwKLQotICB7ImNhbGxrIiwJeyAxLCAiIiwgVU5LTk9XTiwJCTB4MDZ9IH0sLyogc3lzdGVtIGNhbGw/Ki8KLSAgLyogUmV0IGlzIHVzdWFsbHkgd3JpdHRlbiBhcyBhIDAtb3AgaW5zbiwgYnV0IGdldHMgZGlzYXNzZW1ibGVkIGFzIGEKLSAgICAgMS1vcCBpbnNuLiBUaGUgb3BlcmFuZCBpcyBhbHdheXMgdHIxNS4gKi8KLSAgeyJyZXQiLAl7IDAsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKLSAgeyJyZXQiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKLSAgeyJhZHNmIiwJeyAyLCAiIiwgKDF8Mnw0KSwJCTB4MDh9IH0sCi0gIHsicmV0ZCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDBhfSB9LAotICB7ImJ0YyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAxfSB9LAotICB7ImJmYyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAyfSB9LAotICAvKiBDYXJlZnVsOiBoYWx0IGlzIDB4MDAwMDAwMDAuIEp1bXAgbXVzdCBoYXZlIHNvbWUgb3RoZXIgKG1vZGU/KWJpdCBzZXQ/PyAqLwotICB7Imp1bXAiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJidHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHhmMDB9IH0sCi0gIC8qIHJlYWQgY29udHJvbC1zdGFjayBwb2ludGVyIGlzIGFub3RoZXIgMS1vci0yIG9wZXJhbmQgaW5zbi4gKi8KLSAgeyJyY3NwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDFmfSB9LAotICB7InJjc3AiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMWZ9IH0KLX07Ci0KLS8qIGVuZDogcHlyYW1pZC5vcGNvZGUuaCAqLwotLyogT25lIGRheSBJIHdpbGwgaGF2ZSB0byB0YWtlIHRoZSB0aW1lIHRvIGZpbmQgb3V0IHdoYXQgb3BlcmFuZHMKLSAgIGFyZSB2YWxpZCBmb3IgdGhlc2UgaW5zbnMsIGFuZCBndWVzcyBhdCB3aGF0IHRoZXkgbWVhbi4KLQotICAgSSBjYW4ndCBpbWFnaW5lIHdoYXQgdGhlICJJPz8/IiBpbnNucyAoaWdsb2IsIGV0YykgZG8uCi0KLSAgIHRoZSBhcml0aG1ldGljLXNvdW5kaW5nIGluc25zIGVuZGluZyBpbiAicCIgc291bmQgYXdmdWxseSBsaWtlIEJDRAotICAgYXJpdGhtZXRpYyBpbnNuczoKLSAgIAlkc2hscCAtPiBEZWNpbWFsIFNIaWZ0IExlZnQgUGFja2VkCi0JZHNocnAgLT4gRGVjaW1hbCBTSGlmdCBSaWdodCBQYWNrZWQKLSAgIGFuZCBjdnRscCB3b3VsZCBiZSBjb252ZXJ0IGxvbmcgdG8gcGFja2VkLgotICAgSSBoYXZlIG5vIGlkZWEgaG93IHRoZSBvcGVyYW5kcyBhcmUgaW50ZXJwcmV0ZWQ7IGJ1dCBoYXZpbmcgdGhlbSBiZQotICAgYSBsb25nIHJlZ2lzdGVyIHdpdGggKGFkZHJlc3MsIGxlbmd0aCkgb2YgYW4gaW4tbWVtb3J5IHBhY2tlZCBCQ0Qgb3BlcmFuZAotICAgd291bGQgbm90IGJlIHN1cnByaXNpbmcuCi0gICBUaGV5IGFyZSB1bmxpa2VseSB0byBiZSBhIHBhY2tlZCBiY2Qgc3RyaW5nOiA2NCBiaXRzIG9mIGxvbmcgZ2l2ZQotICAgaXMgb25seSAxNSBkaWdpdHMrc2lnbiwgd2hpY2ggaXNuJ3QgZW5vdWdoIGZvciBDT0JPTC4KLSAqLyAKLSNpZiAwCi0gIHsid2NzcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlIGNzcD8qLwotICAvKiBUaGUgT1N4IE9wZXJhdGluZyBTeXN0ZW0gUG9ydGluZyBHdWlkZSBjbGFpbXMgU1NMIGRvZXMgdGhpbmdzCi0gICAgIHdpdGggdHIxMiAoYSByZWdpc3RlciByZXNlcnZlZCB0byBpdCkgdG8gZG8gd2l0aCBzdGF0aWMgYmxvY2stc3RydWN0dXJlCi0gICAgIHJlZmVyZW5jZXMuICBTU0w9U2V0IFN0YXRpYyBMaW5rPyAgSXQncyAiR29pbmcgYXdheSBuZXh0IHJlbGVhc2UiLiAqLwotICB7InNzbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImNjbXBzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibGNkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidWVtdWwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp1bnNpZ25lZCBlbXVsKi8KLSAgeyJzcmYiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypHaWRnZXQgdGltZT8/PyovCi0gIHsibW5lZ3AiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgL21vdmUtbmVnIHBoeXM/Ki8KLSAgeyJsZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypsb2FkIHBoeXM/Ki8KLSAgeyJsZHRpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibGRiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3RwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3R0aSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN0YiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN0dSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImFkZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJzdWJwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibXVscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImRpdnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJkc2hscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAgLyogZGVjIHNobCBwYWNrZWQ/ICovCi0gIHsiZHNocnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogZGVjIHNociBwYWNrZWQ/ICovCi0gIHsibW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKm1vdmUgKHN0cmluZz8pPyovCi0gIHsiY21wcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjbXAgcGh5cz8qLwotICB7ImNtcHMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY21wIChzdHJpbmc/KT8qLwotICB7ImN2dGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGN2dCBsb25nIHRvIHA/PyovCi0gIHsiY3Z0cGwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY3Z0IHAgdG8gbD8/Ki8KLSAgeyJkaW50ciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiA/PyBpbnRyID8qLwotICB7InJwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiByZWFkIHBoeXMgd29yZD8qLwotICB7IndwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiB3cml0ZSBwaHlzIHdvcmQ/Ki8KLSAgeyJjbW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InJzdWJ3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiYmljcHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNsciBiaXQgaW4gcHN3PyAqLwotICB7ImJpc3BzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBzZXQgYml0IGluIHBzdz8gKi8KLSAgeyJlaW8iLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogPz8gP2lvID8gKi8KLSAgeyJjYWxscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjYWxsIHBoeXM/Ki8KLSAgeyJjYWxsciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImxwY3h0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qbG9hZCBwcm9jIGNvbnRleHQqLwotICB7InJlaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnJldCBmcm9tIGludHJwdCovCi0gIHsicnBvcnQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypyZWFkLXBvcnQ/Ki8KLSAgeyJydG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qcmVhZC10aW1lLW9mLWRheT8qLwotICB7InNzaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InZ0cGEiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp2aXJ0LXRvLXBoeXMtYWRkcj8qLwotICB7IndpY2wiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogd3JpdGUgaWNsID8gKi8KLSAgeyJ3cG9ydCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlLXBvcnQ/Ki8KLSAgeyJ3dG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUtdGltZS1vZi1kYXk/Ki8KLSAgeyJmbGljIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiaWdsb2IiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBnbG9iYWw/ICovCi0gIHsiaXBoeXMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBwaHlzaWNhbD8gKi8KLSAgeyJpcGlkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgcGlkPyAqLwotICB7Iml2ZWN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgdmVjdG9yPyAqLwotICB7ImxhbXN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidGlvIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmggYi9pbmNsdWRlL29wY29kZS9zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE1OWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIG9wY29kZSB0YWJsZSBmb3IgdGhlIHNwYXJjLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBhbmQKLXRoZSBHTlUgQmludXRpbHMuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4JSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVGhlIFNQQVJDIG9wY29kZSB0YWJsZSAoYW5kIG90aGVyIHJlbGF0ZWQgZGF0YSkgaXMgZGVmaW5lZCBpbgotICAgdGhlIG9wY29kZXMgbGlicmFyeSBpbiBzcGFyYy1vcGMuYy4gIElmIHlvdSBjaGFuZ2UgYW55dGhpbmcgaGVyZSwgbWFrZQotICAgc3VyZSB5b3UgZml4IHVwIHRoYXQgZmlsZSwgYW5kIHZpY2UgdmVyc2EuICAqLwotCi0gLyogRklYTUUtc29tZWRheTogcGVyaGFwcyB0aGUgLGEncyBhbmQgc3VjaCBzaG91bGQgYmUgZW1iZWRkZWQgaW4gdGhlCi0gICAgaW5zdHJ1Y3Rpb24ncyBuYW1lIHJhdGhlciB0aGFuIHRoZSBhcmdzLiAgVGhpcyB3b3VsZCBtYWtlIGdhcyBmYXN0ZXIsIHBpbnNuCi0gICAgc2xvd2VyLCBidXQgd291bGQgbWVzcyB1cCBzb21lIG1hY3JvcyBhIGJpdC4gIHhveG9yaWNoLiAqLwotCi0vKiBMaXN0IG9mIGluc3RydWN0aW9uIHNldHMgdmFyaWF0aW9ucy4KLSAgIFRoZXNlIHZhbHVlcyBhcmUgc3VjaCB0aGF0IGVhY2ggZWxlbWVudCBpcyBlaXRoZXIgYSBzdXBlcnNldCBvZiBhCi0gICBwcmVjZWRpbmcgZWFjaCBvbmUgb3IgdGhleSBjb25mbGljdCBpbiB3aGljaCBjYXNlIFNQQVJDX09QQ09ERV9DT05GTElDVF9QCi0gICByZXR1cm5zIG5vbi16ZXJvLgotICAgVGhlIHZhbHVlcyBhcmUgaW5kaWNlcyBpbnRvIGBzcGFyY19vcGNvZGVfYXJjaHMnIGRlZmluZWQgaW4gc3BhcmMtb3BjLmMuCi0gICBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IHVwZGF0aW5nIHNwYXJjLW9wYy5jLiAgKi8KLQotZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgewotICBTUEFSQ19PUENPREVfQVJDSF9WNiA9IDAsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1Y3LAotICBTUEFSQ19PUENPREVfQVJDSF9WOCwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSwKLSAgLyogdjkgdmFyaWFudHMgbXVzdCBhcHBlYXIgbGFzdCAqLwotICBTUEFSQ19PUENPREVfQVJDSF9WOSwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfVjlBLCAvKiB2OSB3aXRoIHVsdHJhc3BhcmMgYWRkaXRpb25zICovCi0gIFNQQVJDX09QQ09ERV9BUkNIX0JBRCAvKiBlcnJvciByZXR1cm4gZnJvbSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKi8KLX07Ci0KLS8qIFRoZSBoaWdoZXN0IGFyY2hpdGVjdHVyZSBpbiB0aGUgdGFibGUuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQVJDSF9NQVggKFNQQVJDX09QQ09ERV9BUkNIX0JBRCAtIDEpCi0KLS8qIEdpdmVuIGFuIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsLCByZXR1cm4gdGhlIGJpdG1hc2sgdG8gdXNlIGluCi0gICBpbnNuIGVuY29kaW5nL2RlY29kaW5nLiAgKi8KLSNkZWZpbmUgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyhhcmNoKSAoMSA8PCAoYXJjaCkpCi0KLS8qIEdpdmVuIGEgdmFsaWQgc3BhcmNfb3Bjb2RlX2FyY2hfdmFsLCByZXR1cm4gbm9uLXplcm8gaWYgaXQncyB2OS4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AoYXJjaCkgKChhcmNoKSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQotLyogVGFibGUgb2YgY3B1IHZhcmlhbnRzLiAgKi8KLQotc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTWFzayBvZiBzcGFyY19vcGNvZGVfYXJjaF92YWwncyBzdXBwb3J0ZWQuCi0gICAgIEVHOiBGb3IgdjcgdGhpcyB3b3VsZCBiZQotICAgICAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoLi4uX1Y2KSB8IFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKC4uLl9WNykpLgotICAgICBUaGVzZSBhcmUgc2hvcnQncyBiZWNhdXNlIHNwYXJjX29wY29kZS5hcmNoaXRlY3R1cmUgaXMuICAqLwotICBzaG9ydCBzdXBwb3J0ZWQ7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHNwYXJjX29wY29kZV9hcmNoc1tdOwotCi0vKiBHaXZlbiBhcmNoaXRlY3R1cmUgbmFtZSwgbG9vayB1cCBpdCdzIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB2YWx1ZS4gICovCi1leHRlcm4gZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZXR1cm4gdGhlIGJpdG1hc2sgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMgZm9yIEFSQ0guICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfU1VQUE9SVEVEKEFSQ0gpIChzcGFyY19vcGNvZGVfYXJjaHNbQVJDSF0uc3VwcG9ydGVkKQotCi0vKiBOb24temVybyBpZiBBUkNIMSBjb25mbGljdHMgd2l0aCBBUkNIMi4KLSAgIElFOiBBUkNIMSBhcyBhIHN1cHBvcnRlZCBiaXQgc2V0IHRoYXQgQVJDSDIgZG9lc24ndCwgYW5kIHZpY2UgdmVyc2EuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUChBUkNIMSwgQVJDSDIpIFwKLSgoKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkgXAotICAhPSBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChBUkNIMSkpIFwKLSAmJiAoKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkgXAotICAgICAhPSBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChBUkNIMikpKQotCi0vKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LiAgKi8KLQotc3RydWN0IHNwYXJjX29wY29kZSB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CS8qIEJpdHMgdGhhdCBtdXN0IGJlIHNldC4gKi8KLSAgdW5zaWduZWQgbG9uZyBsb3NlOwkvKiBCaXRzIHRoYXQgbXVzdCBub3QgYmUgc2V0LiAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGlzIHdhcyBjYWxsZWQgImRlbGF5ZWQiIGluIHZlcnNpb25zIGJlZm9yZSB0aGUgZmxhZ3MuICovCi0gIGNoYXIgZmxhZ3M7Ci0gIHNob3J0IGFyY2hpdGVjdHVyZTsJLyogQml0bWFzayBvZiBzcGFyY19vcGNvZGVfYXJjaF92YWwncy4gICovCi19OwotCi0jZGVmaW5lCUZfREVMQVlFRAkxCS8qIERlbGF5ZWQgYnJhbmNoICovCi0jZGVmaW5lCUZfQUxJQVMJCTIJLyogQWxpYXMgZm9yIGEgInJlYWwiIGluc3RydWN0aW9uICovCi0jZGVmaW5lCUZfVU5CUgkJNAkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCAqLwotI2RlZmluZQlGX0NPTkRCUgk4CS8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLwotI2RlZmluZQlGX0pTUgkJMTYJLyogU3Vicm91dGluZSBjYWxsICovCi0jZGVmaW5lIEZfRkxPQVQJCTMyCS8qIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIChub3QgYSBicmFuY2gpICovCi0jZGVmaW5lIEZfRkJSCQk2NAkvKiBGbG9hdGluZyBwb2ludCBicmFuY2ggKi8KLS8qIEZJWE1FOiBBZGQgRl9BTkFDSFJPTklTVElDIGZsYWcgZm9yIHY5LiAgKi8KLQotLyoKLQotQWxsIHNwYXJjIG9wY29kZXMgYXJlIDMyIGJpdHMsIGV4Y2VwdCBmb3IgdGhlIGBzZXQnIGluc3RydWN0aW9uIChyZWFsbHkgYQotbWFjcm8pLCB3aGljaCBpcyA2NCBiaXRzLiBJdCBpcyBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlLgotCi1UaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEgcGFydGljdWxhcgotb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZSBvZiB0aGF0IG9wY29kZS4KLQotVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGNoYXJhY3RlciBmb3IgZWFjaCBvcGVyYW5kIG9mIHRoZQotaW5zdHJ1Y3Rpb24uCi0KLUtpbmRzIG9mIG9wZXJhbmRzOgotCSMJTnVtYmVyIHVzZWQgYnkgb3B0aW1pemVyLglJdCBpcyBpZ25vcmVkLgotCTEJcnMxIHJlZ2lzdGVyLgotCTIJcnMyIHJlZ2lzdGVyLgotCWQJcmQgcmVnaXN0ZXIuCi0JZQlmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotCXYJZnJzMSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAoZG91YmxlL2V2ZW4pLgotCVYJZnJzMSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAocXVhZC9tdWx0aXBsZSBvZiA0KS4KLQlmCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0JQglmcnMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChkb3VibGUvZXZlbikuCi0JUglmcnMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChxdWFkL211bHRpcGxlIG9mIDQpLgotCWcJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLQlICWZyc2QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKGRvdWJsZS9ldmVuKS4KLQlKCWZyc2QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKHF1YWQvbXVsdGlwbGUgb2YgNCkuCi0JYgljcnMxIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JYwljcnMyIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JRAljcnNkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JbQlhbHRlcm5hdGUgc3BhY2UgcmVnaXN0ZXIgKGFzcikgaW4gcmQKLQlNCWFsdGVybmF0ZSBzcGFjZSByZWdpc3RlciAoYXNyKSBpbiByczEKLQloCTIyIGhpZ2ggYml0cy4KLQlYCTUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZQotCVkJNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlCi0JSwlNRU1CQVIgbWFzayAoNyBiaXRzKS4gKHY5KQotCWoJMTAgYml0IEltbWVkaWF0ZS4gKHY5KQotCUkJMTEgYml0IEltbWVkaWF0ZS4gKHY5KQotCWkJMTMgYml0IEltbWVkaWF0ZS4KLQluCTIyIGJpdCBpbW1lZGlhdGUuCi0JawkyKzE0IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuICh2OSkKLQlHCTE5IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuICh2OSkKLQlsCTIyIGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0JTAkzMCBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlLgotCWEJQW5udWwuCVRoZSBhbm51bCBiaXQgaXMgc2V0LgotCUEJQWx0ZXJuYXRlIGFkZHJlc3Mgc3BhY2UuIFN0b3JlZCBhcyA4IGJpdHMuCi0JQwlDb3Byb2Nlc3NvciBzdGF0ZSByZWdpc3Rlci4KLQlGCWZsb2F0aW5nIHBvaW50IHN0YXRlIHJlZ2lzdGVyLgotCXAJUHJvY2Vzc29yIHN0YXRlIHJlZ2lzdGVyLgotCU4JQnJhbmNoIHByZWRpY3QgY2xlYXIgIixwbiIgKHY5KQotCVQJQnJhbmNoIHByZWRpY3Qgc2V0ICIscHQiICh2OSkKLQl6CSVpY2MuICh2OSkKLQlaCSV4Y2MuICh2OSkKLQlxCUZsb2F0aW5nIHBvaW50IHF1ZXVlLgotCXIJU2luZ2xlIHJlZ2lzdGVyIHRoYXQgaXMgYm90aCByczEgYW5kIHJkLgotCU8JU2luZ2xlIHJlZ2lzdGVyIHRoYXQgaXMgYm90aCByczIgYW5kIHJkLgotCVEJQ29wcm9jZXNzb3IgcXVldWUuCi0JUwlTcGVjaWFsIGNhc2UuCi0JdAlUcmFwIGJhc2UgcmVnaXN0ZXIuCi0JdwlXaW5kb3cgaW52YWxpZCBtYXNrIHJlZ2lzdGVyLgotCXkJWSByZWdpc3Rlci4KLQl1CXNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycyBpbiByZCBwb3NpdGlvbgotCVUJc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGluIHJzMSBwb3NpdGlvbgotCUUJJWNjci4gKHY5KQotCXMJJWZwcnMuICh2OSkKLQlQCSVwYy4gICh2OSkKLQlXCSV0aWNrLgkodjkpCi0JbwklYXNpLiAodjkpCi0JNgklZmNjMC4gKHY5KQotCTcJJWZjYzEuICh2OSkKLQk4CSVmY2MyLiAodjkpCi0JOQklZmNjMy4gKHY5KQotCSEJUHJpdmlsZWdlZCBSZWdpc3RlciBpbiByZCAodjkpCi0JPwlQcml2aWxlZ2VkIFJlZ2lzdGVyIGluIHJzMSAodjkpCi0JKglQcmVmZXRjaCBmdW5jdGlvbiBjb25zdGFudC4gKHY5KQotCXgJT1BGIGZpZWxkICh2OSBpbXBkZXApLgotCTAJMzIvNjQgYml0IGltbWVkaWF0ZSBmb3Igc2V0IG9yIHNldHggKHY5KSBpbnNucwotCV8JQW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIGluIHJkICh2OWEpCi0JLwlBbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIgaW4gcnMxICh2OWEpCi0KLVRoZSBmb2xsb3dpbmcgY2hhcnMgYXJlIHVudXNlZDogKG5vdGU6ICxbXSBhcmUgdXNlZCBhcyBwdW5jdHVhdGlvbikKLVszNDVdCi0KLSovCi0KLSNkZWZpbmUgT1AyKHgpCQkoKCh4KSYweDcpIDw8IDIyKSAvKiBvcDIgZmllbGQgb2YgZm9ybWF0MiBpbnNucyAqLwotI2RlZmluZSBPUDMoeCkJCSgoKHgpJjB4M2YpIDw8IDE5KSAvKiBvcDMgZmllbGQgb2YgZm9ybWF0MyBpbnNucyAqLwotI2RlZmluZSBPUCh4KQkJKCh1bnNpZ25lZCkoKHgpJjB4MykgPDwgMzApIC8qIG9wIGZpZWxkIG9mIGFsbCBpbnNucyAqLwotI2RlZmluZSBPUEYoeCkJCSgoKHgpJjB4MWZmKSA8PCA1KSAvKiBvcGYgZmllbGQgb2YgZmxvYXQgaW5zbnMgKi8KLSNkZWZpbmUgT1BGX0xPVzUoeCkJT1BGKCh4KSYweDFmKSAvKiB2OSAqLwotI2RlZmluZSBGM0YoeCwgeSwgeikJKE9QKHgpIHwgT1AzKHkpIHwgT1BGKHopKSAvKiBmb3JtYXQzIGZsb2F0IGluc25zICovCi0jZGVmaW5lIEYzSSh4KQkJKCgoeCkmMHgxKSA8PCAxMykgLyogaW1tZWRpYXRlIGZpZWxkIG9mIGZvcm1hdCAzIGluc25zICovCi0jZGVmaW5lIEYyKHgsIHkpCShPUCh4KSB8IE9QMih5KSkgLyogZm9ybWF0IDIgaW5zbnMgKi8KLSNkZWZpbmUgRjMoeCwgeSwgeikJKE9QKHgpIHwgT1AzKHkpIHwgRjNJKHopKSAvKiBmb3JtYXQzIGluc25zICovCi0jZGVmaW5lIEYxKHgpCQkoT1AoeCkpCi0jZGVmaW5lIERJU1AzMCh4KQkoKHgpJjB4M2ZmZmZmZmYpCi0jZGVmaW5lIEFTSSh4KQkJKCgoeCkmMHhmZikgPDwgNSkgLyogYXNpIGZpZWxkIG9mIGZvcm1hdDMgaW5zbnMgKi8KLSNkZWZpbmUgUlMyKHgpCQkoKHgpJjB4MWYpIC8qIHJzMiBmaWVsZCAqLwotI2RlZmluZSBTSU1NMTMoeCkJKCh4KSYweDFmZmYpIC8qIHNpbW0xMyBmaWVsZCAqLwotI2RlZmluZSBSRCh4KQkJKCgoeCkmMHgxZikgPDwgMjUpIC8qIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZpZWxkICovCi0jZGVmaW5lIFJTMSh4KQkJKCgoeCkmMHgxZikgPDwgMTQpIC8qIHJzMSBmaWVsZCAqLwotI2RlZmluZSBBU0lfUlMyKHgpCShTSU1NMTMoeCkpCi0jZGVmaW5lIE1FTUJBUih4KQkoKHgpJjB4N2YpCi0jZGVmaW5lIFNMQ1BPUCh4KQkoKCh4KSYweDdmKSA8PCA2KSAvKiBzcGFyY2xldCBjcG9wICovCi0KLSNkZWZpbmUgQU5OVUwJKDE8PDI5KQotI2RlZmluZSBCUFJFRAkoMTw8MTkpCS8qIHY5ICovCi0jZGVmaW5lCUlNTUVECUYzSSgxKQotI2RlZmluZSBSRF9HMAlSRCh+MCkKLSNkZWZpbmUJUlMxX0cwCVJTMSh+MCkKLSNkZWZpbmUJUlMyX0cwCVJTMih+MCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgc3BhcmNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBzcGFyY19udW1fb3Bjb2RlczsKLQotZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfYXNpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9hc2kgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gaW50IHNwYXJjX2VuY29kZV9tZW1iYXIgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX21lbWJhciBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX3ByZWZldGNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9wcmVmZXRjaCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyBQQVJBTVMgKChpbnQpKTsKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHNwYXJjLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmggYi9pbmNsdWRlL29wY29kZS90YWhvZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNlZTI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIFBvcnRlZCBieSB0aGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgWW9yayBhdCBCdWZmYWxvIGJ5IHRoZSBEaXN0cmlidXRlZAotICogQ29tcHV0ZXIgU3lzdGVtcyBMYWIsIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSwgMTk5MS4KLSAqLwotCi0jaWZuZGVmIHRhaG9lX29wY29kZVQKLSNkZWZpbmUgdGFob2Vfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyB0YWhvZV9vcGNvZGVUICovCi0KLXN0cnVjdCB2b3Rfd290ICAgICAgICAgICAgICAgICAgLyogdGFob2Ugb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIGFyZ3M7ICAgICAgIC8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHRhaG9lX29wY29kZVQgICAgICAgY29kZTsgICAgIC8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi19OwotCi1zdHJ1Y3Qgdm90ICAgICAgICAgICAgICAgICAgICAgIC8qIHRhaG9lIG9wY29kZSB0ZXh0ICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIG5hbWU7ICAgICAgIC8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IHZvdF93b3QgICAgZGV0YWlsOyAgICAgLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSB2b3RfaG93IGFyZ3MKLSNkZWZpbmUgdm90X2NvZGUgY29kZQotI2RlZmluZSB2b3RfZGV0YWlsIGRldGFpbAotI2RlZmluZSB2b3RfbmFtZSBuYW1lCi0KLXN0YXRpYyBzdHJ1Y3Qgdm90Ci12b3RzdHJzW10gPQotewoteyAgICAiaGFsdCIsCXsiIiwJCQkweDAwCX0gfSwKLXsgICAgInNpbmYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDA1ICAgIH0gfSwKLXsgICAgImxkZiIsICAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDA2ICAgIH0gfSwKLXsgICAgImxkZCIsICAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDA3ICAgIH0gfSwKLXsgICAgImFkZGIyIiwJeyJyYm1iIiwJCTB4MDgJfSB9LAoteyAgICAibW92YiIsCXsicmJ3YiIsCQkweDA5CX0gfSwKLXsgICAgImFkZHcyIiwJeyJyd213IiwJCTB4MGEJfSB9LAoteyAgICAibW92dyIsCXsicnd3dyIsCQkweDBiCX0gfSwKLXsgICAgImFkZGwyIiwJeyJybG1sIiwJCTB4MGMJfSB9LAoteyAgICAibW92bCIsCXsicmx3bCIsCQkweDBkCX0gfSwKLXsgICAgImJicyIsCXsicmx2bGJ3IiwJCTB4MGUJfSB9LAoteyAgICAibm9wIiwgICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MTAgICAgfSB9LAoteyAgICAiYnJiIiwJeyJiYiIsCQkJMHgxMQl9IH0sCi17ICAgICJicnciLAl7ImJ3IiwJCQkweDEzCX0gfSwKLXsgICAgImNvc2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDE1ICAgIH0gfSwKLXsgICAgImxuZiIsICAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDE2ICAgIH0gfSwKLXsgICAgImxuZCIsICAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDE3ICAgIH0gfSwKLXsgICAgImFkZGIzIiwJeyJyYnJid2IiLAkJMHgxOAl9IH0sCi17ICAgICJjbXBiIiwJeyJyYndiIiwJCTB4MTkJfSB9LCAKLXsgICAgImFkZHczIiwJeyJyd3J3d3ciLAkJMHgxYQl9IH0sCi17ICAgICJjbXB3IiwJeyJyd3d3IiwJCTB4MWIJfSB9LAoteyAgICAiYWRkbDMiLAl7InJscmx3bCIsCQkweDFjCX0gfSwKLXsgICAgImNtcGwiLAl7InJsd2wiLAkJMHgxZAl9IH0sCi17ICAgICJiYmMiLAl7InJsdmxidyIsCQkweDFlCX0gfSwKLXsgICAgInJlaSIsCXsiIiwJCQkweDIwCX0gfSwKLXsgICAgImJuZXEiLAl7ImJiIiwJCQkweDIxCX0gfSwKLXsgICAgImJuZXF1IiwJeyJiYiIsCQkJMHgyMQl9IH0sCi17ICAgICJjdnR3bCIsCXsicnd3bCIsCQkweDIzCX0gfSwKLXsgICAgInN0ZiIsICAgICB7IndsIiwgICAgICAgICAgICAgICAgICAweDI2ICAgIH0gfSwKLXsgICAgInN0ZCIsICAgICB7IndxIiwgICAgICAgICAgICAgICAgICAweDI3ICAgIH0gfSwKLXsgICAgInN1YmIyIiwJeyJyYm1iIiwJCTB4MjgJfSB9LAoteyAgICAibWNvbWIiLAl7InJid2IiLAkJMHgyOQl9IH0sCi17ICAgICJzdWJ3MiIsCXsicndtdyIsCQkweDJhCX0gfSwKLXsgICAgIm1jb213IiwJeyJyd3d3IiwJCTB4MmIJfSB9LAoteyAgICAic3VibDIiLCAgIHsicmxtbCIsICAgICAgICAgICAgICAgIDB4MmMgICAgfSB9LAoteyAgICAibWNvbWwiLCAgIHsicmx3bCIsICAgICAgICAgICAgICAgIDB4MmQgICAgfSB9LAoteyAgICAiZW11bCIsCXsicmxybHJsd3EiLAkJMHgyZQl9IH0sCi17ICAgICJhb2Jsc3MiLAl7InJsbWxidyIsCQkweDJmCX0gfSwKLXsgICAgImJwdCIsCXsiIiwJCQkweDMwCX0gfSwKLXsgICAgImJlcWwiLAl7ImJiIiwJCQkweDMxCX0gfSwKLXsgICAgImJlcWx1IiwJeyJiYiIsCQkJMHgzMQl9IH0sCi17ICAgICJjdnR3YiIsCXsicnd3YiIsCQkweDMzCX0gfSwKLXsgICAgImxvZ2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDM1ICAgIH0gfSwKLXsgICAgImNtcGYiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDM2ICAgIH0gfSwKLXsgICAgImNtcGQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDM3ICAgIH0gfSwKLXsgICAgInN1YmIzIiwJeyJyYnJid2IiLAkJMHgzOAl9IH0sCi17ICAgICJiaXRiIiwJeyJyYnJiIiwJCTB4MzkJfSB9LAoteyAgICAic3VidzMiLAl7InJ3cnd3dyIsCQkweDNhCX0gfSwKLXsgICAgImJpdHciLAl7InJ3cnciLAkJMHgzYgl9IH0sCi17ICAgICJzdWJsMyIsCXsicmxybHdsIiwJCTB4M2MJfSB9LAoteyAgICAiYml0bCIsCXsicmxybCIsCQkweDNkCX0gfSwKLXsgICAgImVkaXYiLAl7InJscnF3bHdsIiwJCTB4M2UJfSB9LAoteyAgICAiYW9ibGVxIiwJeyJybG1sYnciLAkJMHgzZgl9IH0sCi17ICAgICJyZXQiLAl7IiIsCQkJMHg0MAl9IH0sCi17ICAgICJiZ3RyIiwJeyJiYiIsCQkJMHg0MQl9IH0sCi17ICAgICJzcXJ0ZiIsICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg0NSAgICB9IH0sCi17ICAgICJjbXBmMiIsICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg0NiAgICB9IH0sCi17ICAgICJjbXBkMiIsICAgeyJycXJxIiwgICAgICAgICAgICAgICAgMHg0NyAgICB9IH0sCi17ICAgICJzaGxsIiwgICAgeyJyYnJsd2wiLCAgICAgICAgICAgICAgMHg0OCAgICB9IH0sCi17ICAgICJjbHJiIiwJeyJ3YiIsCQkJMHg0OQl9IH0sCi17ICAgICJzaGxxIiwJeyJyYnJxd3EiLAkJMHg0YQl9IH0sCi17ICAgICJjbHJ3IiwJeyJ3dyIsCQkJMHg0Ygl9IH0sCi17ICAgICJtdWxsMiIsCXsicmxtbCIsCQkweDRjCX0gfSwKLXsgICAgImNscmwiLAl7IndsIiwJCQkweDRkCX0gfSwKLXsgICAgInNoYWwiLCAgICB7InJicmx3bCIsCQkweDRlCX0gfSwKLXsgICAgImJsZXEiLAl7ImJiIiwJCQkweDUxCX0gfSwKLXsgICAgImV4cGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU1ICAgIH0gfSwKLXsgICAgInRzdGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU2ICAgIH0gfSwKLXsgICAgInRzdGQiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU3ICAgIH0gfSwKLXsgICAgInNocmwiLCAgICB7InJicmx3bCIsCQkweDU4CX0gfSwKLXsgICAgInRzdGIiLAl7InJiIiwJCQkweDU5CX0gfSwKLXsgICAgInNocnEiLCAgICB7InJicnF3cSIsCQkweDVhCX0gfSwKLXsgICAgInRzdHciLAl7InJ3IiwJCQkweDViCX0gfSwKLXsgICAgIm11bGwzIiwJeyJybHJsd2wiLAkJMHg1Ywl9IH0sCi17ICAgICJ0c3RsIiwJeyJybCIsCQkJMHg1ZAl9IH0sCi17ICAgICJzaGFyIiwJeyJyYnJsd2wiLAkJMHg1ZQl9IH0sCi17ICAgICJiYnNzaSIsCXsicmxtbGJ3IiwJCTB4NWYJfSB9LAoteyAgICAibGRwY3R4IiwJeyIiLAkJCTB4NjAJfSB9LAoteyAgICAicHVzaGQiLCAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NjcgICAgfSB9LAoteyAgICAiaW5jYiIsCXsibWIiLAkJCTB4NjkJfSB9LAoteyAgICAiaW5jdyIsCXsibXciLAkJCTB4NmIJfSB9LAoteyAgICAiZGl2bDIiLAl7InJsbWwiLAkJMHg2Ywl9IH0sCi17ICAgICJpbmNsIiwJeyJtbCIsCQkJMHg2ZAl9IH0sCi17ICAgICJjdnRsYiIsCXsicmx3YiIsCQkweDZmCX0gfSwKLXsgICAgInN2cGN0eCIsCXsiIiwJCQkweDcwCX0gfSwKLXsgICAgImptcCIsCXsiYWIiLAkJCTB4NzEJfSB9LAoteyAgICAiY3ZsZiIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NzYgICAgfSB9LAoteyAgICAiY3ZsZCIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NzcgICAgfSB9LAoteyAgICAiZGVjYiIsCXsibWIiLAkJCTB4NzkJfSB9LAoteyAgICAiZGVjdyIsCXsibXciLAkJCTB4N2IJfSB9LAoteyAgICAiZGl2bDMiLAl7InJscmx3bCIsCQkweDdjCX0gfSwKLXsgICAgImRlY2wiLAl7Im1sIiwJCQkweDdkCX0gfSwKLXsgICAgImN2dGx3IiwJeyJybHd3IiwJCTB4N2YJfSB9LAoteyAgICAiYmdlcSIsCXsiYmIiLAkJCTB4ODEJfSB9LAoteyAgICAibW92czIiLAl7ImFiYWIiLAkJMHg4Mgl9IH0sCi17ICAgICJjdmZsIiwgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHg4NiAgICB9IH0sCi17ICAgICJjdmRsIiwgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHg4NyAgICB9IH0sCi17ICAgICJvcmIyIiwJeyJyYm1iIiwJCTB4ODgJfSB9LAoteyAgICAiY3Z0YmwiLAl7InJid2wiLAkJMHg4OQl9IH0sCi17ICAgICJvcncyIiwJeyJyd213IiwJCTB4OGEJfSB9LAoteyAgICAiYmlzcHN3IiwJeyJydyIsCQkJMHg4Ygl9IH0sCi17ICAgICJvcmwyIiwgICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHg4YyAgICB9IH0sCi17ICAgICJhZHdjIiwJeyJybG1sIiwJCTB4OGQJfSB9LAoteyAgICAiYWRkYSIsIAl7InJsbWwiLAkJMHg4ZQl9IH0sCi17ICAgICJibHNzIiwJeyJiYiIsCQkJMHg5MQl9IH0sCi17ICAgICJjbXBzMiIsICAgeyJhYmFiIiwJCTB4OTIJfSB9LAoteyAgICAibGRmZCIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4OTcgICAgfSB9LAoteyAgICAib3JiMyIsCXsicmJyYndiIiwJCTB4OTgJfSB9LAoteyAgICAiY3Z0YnciLAl7InJid3ciLAkJMHg5OQl9IH0sCi17ICAgICJvcnczIiwgICAJeyJyd3J3d3ciLAkJMHg5YQl9IH0sCi17ICAgICJiaWNwc3ciLAl7InJ3IiwJCQkweDliCX0gfSwKLXsgICAgIm9ybDMiLCAgICB7InJscmx3bCIsICAgICAgICAgICAgICAweDljICAgIH0gfSwKLXsgICAgInNid2MiLAl7InJsbWwiLAkJMHg5ZAl9IH0sCi17ICAgICJzdWJhIiwgICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHg5ZSAgICB9IH0sCi17ICAgICJiZ3RydSIsCXsiYmIiLAkJCTB4YTEJfSB9LAoteyAgICAiY3ZkZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YTYgICAgfSB9LAoteyAgICAiYW5kYjIiLCAgIHsicmJtYiIsCQkweGE4ICAgIH0gfSwKLXsgICAgIm1vdnpibCIsCXsicmJ3bCIsCQkweGE5CX0gfSwKLXsgICAgImFuZHcyIiwgICB7InJ3bXciLAkJMHhhYSAgICB9IH0sCi17ICAgICJsb2FkciIsICAgeyJyd2FsIiwJCTB4YWIJfSB9LAoteyAgICAiYW5kbDIiLCAgIHsicmxtbCIsCQkweGFjICAgIH0gfSwKLXsgICAgIm10cHIiLAl7InJscmwiLAkJMHhhZAl9IH0sCi17ICAgICJmZnMiLAl7InJsd2wiLAkJMHhhZQl9IH0sCi17ICAgICJibGVxdSIsCXsiYmIiLAkJCTB4YjEJfSB9LAoteyAgICAibmVnZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YjYgICAgfSB9LAoteyAgICAibmVnZCIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YjcgICAgfSB9LAoteyAgICAiYW5kYjMiLCAgIHsicmJyYndiIiwgICAgICAgICAgICAgIDB4YjggICAgfSB9LAoteyAgICAibW92emJ3IiwJeyJyYnd3IiwJCTB4YjkJfSB9LAoteyAgICAiYW5kdzMiLCAgIHsicndyd3d3IiwJCTB4YmEgICAgfSB9LAoteyAgICAic3RvcmVyIiwgIHsicndhbCIsICAgICAgICAgICAgICAgIDB4YmIgICAgfSB9LAoteyAgICAiYW5kbDMiLCAgIHsicmxybHdsIiwJCTB4YmMgICAgfSB9LAoteyAgICAibWZwciIsCXsicmx3bCIsCQkweGJkCX0gfSwKLXsgICAgImZmYyIsCXsicmx3bCIsCQkweGJlCX0gfSwKLXsgICAgImNhbGxzIiwJeyJyYmFiIiwJCTB4YmYJfSB9LAoteyAgICAicHJvYmVyIiwJeyJyYmFicmwiLAkJMHhjMAl9IH0sCi17ICAgICJidmMiLAl7ImJiIiwJCQkweGMxCX0gfSwKLXsgICAgIm1vdnMzIiwJeyJhYmFicnciLAkJMHhjMgl9IH0sCi17ICAgICJtb3Z6d2wiLAl7InJ3d2wiLAkJMHhjMwl9IH0sCi17ICAgICJhZGRmIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHhjNiAgICB9IH0sCi17ICAgICJhZGRkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhjNyAgICB9IH0sCi17ICAgICJ4b3JiMiIsICAgeyJyYm1iIiwgICAgICAgICAgICAgICAgMHhjOCAgICB9IH0sCi17ICAgICJtb3ZvYiIsICAgeyJyYndiIiwgICAgICAgICAgICAgICAgMHhjOSAgICB9IH0sCi17ICAgICJ4b3J3MiIsICAgeyJyd213IiwgICAgICAgICAgICAgICAgMHhjYSAgICB9IH0sCi17ICAgICJtb3ZvdyIsICAgeyJyd3d3IiwgICAgICAgICAgICAgICAgMHhjYgl9IH0sCi17ICAgICJ4b3JsMiIsCXsicmxtbCIsICAgICAgICAgICAgICAgIDB4Y2MgICAgfSB9LAoteyAgICAibW92cHNsIiwgIHsid2wiLCAgICAgICAgICAgICAgICAgIDB4Y2QgICAgfSB9LAoteyAgICAia2NhbGwiLCAgIHsicnciLAkJCTB4Y2YJfSB9LAoteyAgICAicHJvYmV3IiwgIHsicmJhYnJsIiwJCTB4ZDAJfSB9LAoteyAgICAiYnZzIiwgICAgIHsiYmIiLAkJCTB4ZDEJfSB9LAoteyAgICAiY21wczMiLCAgIHsiYWJhYnJ3IiwJCTB4ZDIJfSB9LAoteyAgICAic3ViZiIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZDYgICAgfSB9LAoteyAgICAic3ViZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZDcgICAgfSB9LAoteyAgICAieG9yYjMiLAl7InJicmJ3YiIsCQkweGQ4CX0gfSwKLXsgICAgInB1c2hiIiwgICB7InJiIiwJCQkweGQ5CX0gfSwKLXsgICAgInhvcnczIiwJeyJyd3J3d3ciLAkJMHhkYQl9IH0sCi17ICAgICJwdXNodyIsICAgeyJydyIsIAkJCTB4ZGIJfSB9LAoteyAgICAieG9ybDMiLAl7InJscmx3bCIsCQkweGRjCX0gfSwKLXsgICAgInB1c2hsIiwJeyJybCIsCQkJMHhkZAl9IH0sCi17ICAgICJpbnNxdWUiLAl7ImFiYWIiLAkJMHhlMAl9IH0sCi17ICAgICJiY3MiLAl7ImJiIiwJCQkweGUxCX0gfSwKLXsgICAgImJnZXF1IiwJeyJiYiIsCQkJMHhlMQl9IH0sCi17ICAgICJtdWxmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhlNiAgICB9IH0sCi17ICAgICJtdWxkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhlNyAgICB9IH0sCi17ICAgICJtbmVnYiIsCXsicmJ3YiIsCQkweGU4CX0gfSwKLXsgICAgIm1vdmFiIiwJeyJhYndsIiwJCTB4ZTkJfSB9LAoteyAgICAibW5lZ3ciLAl7InJ3d3ciLAkJMHhlYQl9IH0sCi17ICAgICJtb3ZhdyIsCXsiYXd3bCIsCQkweGViCX0gfSwKLXsgICAgIm1uZWdsIiwJeyJybHdsIiwJCTB4ZWMJfSB9LAoteyAgICAibW92YWwiLAl7ImFsd2wiLAkJMHhlZAl9IH0sCi17ICAgICJyZW1xdWUiLAl7ImFiIiwgIAkJMHhmMAl9IH0sCi17ICAgICJiY2MiLAl7ImJiIiwJCQkweGYxCX0gfSwKLXsgICAgImJsc3N1IiwJeyJiYiIsCQkJMHhmMQl9IH0sCi17ICAgICJkaXZmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhmNiAgICB9IH0sCi17ICAgICJkaXZkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhmNyAgICB9IH0sCi17ICAgICJtb3ZibGsiLCAgeyJhbGFscnciLCAgICAgICAgICAgICAgMHhmOAl9IH0sCi17ICAgICJwdXNoYWIiLAl7ImFiIiwJCQkweGY5CX0gfSwKLXsgICAgInB1c2hhdyIsCXsiYXciLAkJCTB4ZmIJfSB9LAoteyAgICAiY2FzZWwiLAl7InJscmxybCIsCQkweGZjCX0gfSwKLXsgICAgInB1c2hhbCIsCXsiYWwiLAkJCTB4ZmQJfSB9LAoteyAgICAiY2FsbGYiLAl7InJiYWIiLAkJMHhmZQl9IH0sCi17ICAgICAgIiIgICAgICAgLCAgICIiICAgICAgICAgIH0gLyogZW1wdHkgaXMgZW5kIHNlbnRpbmVsICovCi0KLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWMzMC5oIGIvaW5jbHVkZS9vcGNvZGUvdGljMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwMDI3NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS90aWMzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qIHRpYzMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJIFRNUzMyMEMzMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZJWE1FOiBUaGUgb3Bjb2RlIHRhYmxlIHNob3VsZCBiZSBpbiBvcGNvZGVzL3RpYzMwLW9wYy5jLCBub3QgaW4gYQotICAgaGVhZGVyIGZpbGUuICAqLwotCi0jaWZuZGVmIF9UTVMzMjBfSF8KLSNkZWZpbmUgX1RNUzMyMF9IXwotCi1zdHJ1Y3QgX3JlZ2lzdGVyCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOwotICB1bnNpZ25lZCBjaGFyIHJlZ3R5cGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfcmVnaXN0ZXIgcmVnOwotCi0jZGVmaW5lIFJFR19SbiAgICAweDAxCi0jZGVmaW5lIFJFR19BUm4gICAweDAyCi0jZGVmaW5lIFJFR19EUCAgICAweDAzCi0jZGVmaW5lIFJFR19PVEhFUiAweDA0Ci0KLXN0YXRpYyBjb25zdCByZWcgdGljMzBfcmVndGFiW10gPSB7Ci0gIHsgInIwIiwgMHgwMCwgUkVHX1JuIH0sCi0gIHsgInIxIiwgMHgwMSwgUkVHX1JuIH0sCi0gIHsgInIyIiwgMHgwMiwgUkVHX1JuIH0sCi0gIHsgInIzIiwgMHgwMywgUkVHX1JuIH0sCi0gIHsgInI0IiwgMHgwNCwgUkVHX1JuIH0sCi0gIHsgInI1IiwgMHgwNSwgUkVHX1JuIH0sCi0gIHsgInI2IiwgMHgwNiwgUkVHX1JuIH0sCi0gIHsgInI3IiwgMHgwNywgUkVHX1JuIH0sCi0gIHsgImFyMCIsMHgwOCwgUkVHX0FSbiB9LAotICB7ICJhcjEiLDB4MDksIFJFR19BUm4gfSwKLSAgeyAiYXIyIiwweDBBLCBSRUdfQVJuIH0sCi0gIHsgImFyMyIsMHgwQiwgUkVHX0FSbiB9LAotICB7ICJhcjQiLDB4MEMsIFJFR19BUm4gfSwKLSAgeyAiYXI1IiwweDBELCBSRUdfQVJuIH0sCi0gIHsgImFyNiIsMHgwRSwgUkVHX0FSbiB9LAotICB7ICJhcjciLDB4MEYsIFJFR19BUm4gfSwKLSAgeyAiZHAiLCAweDEwLCBSRUdfRFAgfSwKLSAgeyAiaXIwIiwweDExLCBSRUdfT1RIRVIgfSwKLSAgeyAiaXIxIiwweDEyLCBSRUdfT1RIRVIgfSwKLSAgeyAiYmsiLCAweDEzLCBSRUdfT1RIRVIgfSwKLSAgeyAic3AiLCAweDE0LCBSRUdfT1RIRVIgfSwKLSAgeyAic3QiLCAweDE1LCBSRUdfT1RIRVIgfSwKLSAgeyAiaWUiLCAweDE2LCBSRUdfT1RIRVIgfSwKLSAgeyAiaWYiLCAweDE3LCBSRUdfT1RIRVIgfSwKLSAgeyAiaW9mIiwweDE4LCBSRUdfT1RIRVIgfSwKLSAgeyAicnMiLCAweDE5LCBSRUdfT1RIRVIgfSwKLSAgeyAicmUiLCAweDFBLCBSRUdfT1RIRVIgfSwKLSAgeyAicmMiLCAweDFCLCBSRUdfT1RIRVIgfSwKLSAgeyAiUjAiLCAweDAwLCBSRUdfUm4gfSwKLSAgeyAiUjEiLCAweDAxLCBSRUdfUm4gfSwKLSAgeyAiUjIiLCAweDAyLCBSRUdfUm4gfSwKLSAgeyAiUjMiLCAweDAzLCBSRUdfUm4gfSwKLSAgeyAiUjQiLCAweDA0LCBSRUdfUm4gfSwKLSAgeyAiUjUiLCAweDA1LCBSRUdfUm4gfSwKLSAgeyAiUjYiLCAweDA2LCBSRUdfUm4gfSwKLSAgeyAiUjciLCAweDA3LCBSRUdfUm4gfSwKLSAgeyAiQVIwIiwweDA4LCBSRUdfQVJuIH0sCi0gIHsgIkFSMSIsMHgwOSwgUkVHX0FSbiB9LAotICB7ICJBUjIiLDB4MEEsIFJFR19BUm4gfSwKLSAgeyAiQVIzIiwweDBCLCBSRUdfQVJuIH0sCi0gIHsgIkFSNCIsMHgwQywgUkVHX0FSbiB9LAotICB7ICJBUjUiLDB4MEQsIFJFR19BUm4gfSwKLSAgeyAiQVI2IiwweDBFLCBSRUdfQVJuIH0sCi0gIHsgIkFSNyIsMHgwRiwgUkVHX0FSbiB9LAotICB7ICJEUCIsIDB4MTAsIFJFR19EUCB9LAotICB7ICJJUjAiLDB4MTEsIFJFR19PVEhFUiB9LAotICB7ICJJUjEiLDB4MTIsIFJFR19PVEhFUiB9LAotICB7ICJCSyIsIDB4MTMsIFJFR19PVEhFUiB9LAotICB7ICJTUCIsIDB4MTQsIFJFR19PVEhFUiB9LAotICB7ICJTVCIsIDB4MTUsIFJFR19PVEhFUiB9LAotICB7ICJJRSIsIDB4MTYsIFJFR19PVEhFUiB9LAotICB7ICJJRiIsIDB4MTcsIFJFR19PVEhFUiB9LAotICB7ICJJT0YiLDB4MTgsIFJFR19PVEhFUiB9LAotICB7ICJSUyIsIDB4MTksIFJFR19PVEhFUiB9LAotICB7ICJSRSIsIDB4MUEsIFJFR19PVEhFUiB9LAotICB7ICJSQyIsIDB4MUIsIFJFR19PVEhFUiB9LAotICB7ICIiLCAgIDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHJlZyAqY29uc3QgdGljMzBfcmVndGFiX2VuZAotICA9IHRpYzMwX3JlZ3RhYiArIHNpemVvZih0aWMzMF9yZWd0YWIpL3NpemVvZih0aWMzMF9yZWd0YWJbMF0pOwotCi0vKiBJbmRpcmVjdCBBZGRyZXNzaW5nIE1vZGVzIE1vZGlmaWNhdGlvbiBGaWVsZHMgKi8KLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBEaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgUHJlRGlzcF9BZGQgICAgICAgIDB4MDAKLSNkZWZpbmUgUHJlRGlzcF9TdWIgICAgICAgIDB4MDEKLSNkZWZpbmUgUHJlRGlzcF9BZGRfTW9kICAgIDB4MDIKLSNkZWZpbmUgUHJlRGlzcF9TdWJfTW9kICAgIDB4MDMKLSNkZWZpbmUgUG9zdERpc3BfQWRkX01vZCAgIDB4MDQKLSNkZWZpbmUgUG9zdERpc3BfU3ViX01vZCAgIDB4MDUKLSNkZWZpbmUgUG9zdERpc3BfQWRkX0NpcmMgIDB4MDYKLSNkZWZpbmUgUG9zdERpc3BfU3ViX0NpcmMgIDB4MDcKLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjAgKi8KLSNkZWZpbmUgUHJlSVIwX0FkZCAgICAgICAgIDB4MDgKLSNkZWZpbmUgUHJlSVIwX1N1YiAgICAgICAgIDB4MDkKLSNkZWZpbmUgUHJlSVIwX0FkZF9Nb2QgICAgIDB4MEEKLSNkZWZpbmUgUHJlSVIwX1N1Yl9Nb2QgICAgIDB4MEIKLSNkZWZpbmUgUG9zdElSMF9BZGRfTW9kICAgIDB4MEMKLSNkZWZpbmUgUG9zdElSMF9TdWJfTW9kICAgIDB4MEQKLSNkZWZpbmUgUG9zdElSMF9BZGRfQ2lyYyAgIDB4MEUKLSNkZWZpbmUgUG9zdElSMF9TdWJfQ2lyYyAgIDB4MEYKLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjEgKi8KLSNkZWZpbmUgUHJlSVIxX0FkZCAgICAgICAgIDB4MTAKLSNkZWZpbmUgUHJlSVIxX1N1YiAgICAgICAgIDB4MTEKLSNkZWZpbmUgUHJlSVIxX0FkZF9Nb2QgICAgIDB4MTIKLSNkZWZpbmUgUHJlSVIxX1N1Yl9Nb2QgICAgIDB4MTMKLSNkZWZpbmUgUG9zdElSMV9BZGRfTW9kICAgIDB4MTQKLSNkZWZpbmUgUG9zdElSMV9TdWJfTW9kICAgIDB4MTUKLSNkZWZpbmUgUG9zdElSMV9BZGRfQ2lyYyAgIDB4MTYKLSNkZWZpbmUgUG9zdElSMV9TdWJfQ2lyYyAgIDB4MTcKLS8qIEluZGlyZWN0IEFkZHJlc3NpbmcgKFNwZWNpYWwgQ2FzZXMpICovCi0jZGVmaW5lIEluZGlyZWN0T25seSAgICAgICAweDE4Ci0jZGVmaW5lIFBvc3RJUjBfQWRkX0JpdFJldiAweDE5Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqc3ludGF4OwotICB1bnNpZ25lZCBjaGFyIG1vZGZpZWxkOwotICB1bnNpZ25lZCBjaGFyIGRpc3BsYWNlbWVudDsKLX0gaW5kX2FkZHJfdHlwZTsKLQotI2RlZmluZSBJTVBMSUVEX0RJU1AgIDB4MDEKLSNkZWZpbmUgRElTUF9SRVFVSVJFRCAweDAyCi0jZGVmaW5lIE5PX0RJU1AgICAgICAgMHgwMwotCi1zdGF0aWMgY29uc3QgaW5kX2FkZHJfdHlwZSB0aWMzMF9pbmRhZGRyX3RhYltdID0gewotICB7ICIqK2FyIiwgICAgICAgUHJlRGlzcF9BZGQsICAgICAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKi1hciIsICAgICAgIFByZURpc3BfU3ViLCAgICAgICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiorK2FyIiwgICAgICBQcmVEaXNwX0FkZF9Nb2QsICAgIElNUExJRURfRElTUCB9LAotICB7ICIqLS1hciIsICAgICAgUHJlRGlzcF9TdWJfTW9kLCAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyKysiLCAgICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiphci0tIiwgICAgICBQb3N0RGlzcF9TdWJfTW9kLCAgIElNUExJRURfRElTUCB9LAotICB7ICIqYXIrKyUiLCAgICAgUG9zdERpc3BfQWRkX0NpcmMsICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyLS0lIiwgICAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiorYXIoKSIsICAgICBQcmVEaXNwX0FkZCwgICAgICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKi1hcigpIiwgICAgIFByZURpc3BfU3ViLCAgICAgICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqKythcigpIiwgICAgUHJlRGlzcF9BZGRfTW9kLCAgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiotLWFyKCkiLCAgICBQcmVEaXNwX1N1Yl9Nb2QsICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyKysoKSIsICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqYXItLSgpIiwgICAgUG9zdERpc3BfU3ViX01vZCwgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiphcisrKCklIiwgICBQb3N0RGlzcF9BZGRfQ2lyYywgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyLS0oKSUiLCAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqK2FyKGlyMCkiLCAgUHJlSVIwX0FkZCwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiotYXIoaXIwKSIsICBQcmVJUjBfU3ViLCAgICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKisrYXIoaXIwKSIsIFByZUlSMF9BZGRfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqLS1hcihpcjApIiwgUHJlSVIwX1N1Yl9Nb2QsICAgICBOT19ESVNQIH0sCi0gIHsgIiphcisrKGlyMCkiLCBQb3N0SVIwX0FkZF9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyLS0oaXIwKSIsIFBvc3RJUjBfU3ViX01vZCwgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjApJSIsUG9zdElSMF9BZGRfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMCklIixQb3N0SVIwX1N1Yl9DaXJjLCAgIE5PX0RJU1AgfSwKLSAgeyAiKithcihpcjEpIiwgIFByZUlSMV9BZGQsICAgICAgICAgTk9fRElTUCB9LAotICB7ICIqLWFyKGlyMSkiLCAgUHJlSVIxX1N1YiwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiorK2FyKGlyMSkiLCBQcmVJUjFfQWRkX01vZCwgICAgIE5PX0RJU1AgfSwKLSAgeyAiKi0tYXIoaXIxKSIsIFByZUlSMV9TdWJfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjEpIiwgUG9zdElSMV9BZGRfTW9kLCAgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMSkiLCBQb3N0SVIxX1N1Yl9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIxKSUiLFBvc3RJUjFfQWRkX0NpcmMsICAgTk9fRElTUCB9LAotICB7ICIqYXItLShpcjEpJSIsUG9zdElSMV9TdWJfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphciIsICAgICAgICBJbmRpcmVjdE9ubHksICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIwKWIiLFBvc3RJUjBfQWRkX0JpdFJldiwgTk9fRElTUCB9LAotICB7ICIiLCAgICAgICAgICAgMCwwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbmRfYWRkcl90eXBlICpjb25zdCB0aWMzMF9pbmRhZGRydGFiX2VuZAotICA9IHRpYzMwX2luZGFkZHJfdGFiICsgc2l6ZW9mKHRpYzMwX2luZGFkZHJfdGFiKS9zaXplb2YodGljMzBfaW5kYWRkcl90YWJbMF0pOwotCi0vKiBQb3NzaWJsZSBvcGVyYW5kIHR5cGVzICovCi0vKiBSZWdpc3RlciB0eXBlcyAqLwotI2RlZmluZSBSbiAgICAgICAweDAwMDEKLSNkZWZpbmUgQVJuICAgICAgMHgwMDAyCi0jZGVmaW5lIERQUmVnICAgIDB4MDAwNAotI2RlZmluZSBPdGhlclJlZyAweDAwMDgKLS8qIEFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLwotI2RlZmluZSBEaXJlY3QgICAweDAwMTAKLSNkZWZpbmUgSW5kaXJlY3QgMHgwMDIwCi0jZGVmaW5lIEltbTE2ICAgIDB4MDA0MAotI2RlZmluZSBEaXNwICAgICAweDAwODAKLSNkZWZpbmUgSW1tMjQgICAgMHgwMTAwCi0jZGVmaW5lIEFiczI0ICAgIDB4MDIwMAotLyogMyBvcGVyYW5kIGFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLwotI2RlZmluZSBvcDNUMSAgICAweDA0MDAKLSNkZWZpbmUgb3AzVDIgICAgMHgwODAwCi0vKiBJbnRlcnJ1cHQgdmVjdG9yICovCi0jZGVmaW5lIElWZWN0b3IgIDB4MTAwMAotLyogTm90IHJlcXVpcmVkICovCi0jZGVmaW5lIE5vdFJlcSAgIDB4MjAwMAotCi0jZGVmaW5lIEdBZGRyMSAgIFJuIHwgRGlyZWN0IHwgSW5kaXJlY3QgfCBJbW0xNgotI2RlZmluZSBHQWRkcjIgICBHQWRkcjEgfCBBbGxSZWcKLSNkZWZpbmUgVEFkZHIxICAgb3AzVDEgfCBSbiB8IEluZGlyZWN0Ci0jZGVmaW5lIFRBZGRyMiAgIG9wM1QyIHwgUm4gfCBJbmRpcmVjdAotI2RlZmluZSBSZWcgICAgICBSbiB8IEFSbgotI2RlZmluZSBBbGxSZWcgICBSZWcgfCBEUFJlZyB8IE90aGVyUmVnCi0KLXR5cGVkZWYgc3RydWN0IF90ZW1wbGF0ZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7IC8qIGhvdyBtYW55IG9wZXJhbmRzICovCi0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlICovCi0gIC8qIHRoZSBiaXRzIGluIG9wY29kZV9tb2RpZmllciBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgb3Bjb2RlIGZyb20KLSAgICAgdGhlIGJhc2Vfb3Bjb2RlLiAgVGhlc2UgYml0cyBhbHNvIGFyZSB1c2VkIHRvIGRldGVjdCBhbHRlcm5hdGUgZm9ybXMgb2YKLSAgICAgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKi8KLSAgdW5zaWduZWQgaW50IG9wY29kZV9tb2RpZmllcjsKLQotICAvKiBvcGNvZGVfbW9kaWZpZXIgYml0czogKi8KLSNkZWZpbmUgQWRkcmVzc01vZGUgMHgwMDYwMDAwMAotI2RlZmluZSBQQ1JlbCAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIFN0YWNrT3AgICAgIDB4MDAxRjAwMDAKLSNkZWZpbmUgUm90YXRlICAgICAgU3RhY2tPcAotICAKLSAgLyogb3BlcmFuZF90eXBlc1tpXSBkZXNjcmliZXMgdGhlIHR5cGUgb2Ygb3BlcmFuZCBpLiAgVGhpcyBpcyBtYWRlCi0gICAgIGJ5IE9SJ2luZyB0b2dldGhlciBhbGwgb2YgdGhlIHBvc3NpYmxlIHR5cGUgbWFza3MuICAoZS5nLgotICAgICAnb3BlcmFuZF90eXBlc1tpXSA9IFJlZ3xJbW0nIHNwZWNpZmllcyB0aGF0IG9wZXJhbmQgaSBjYW4gYmUKLSAgICAgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gaW1tZWRpYXRlIG9wZXJhbmQgKi8KLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbM107Ci0gIC8qIFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIHR5cGUgb2YgYW4gaW1tZWRpYXRlIGFyZ3VtZW50IHRvIGFuIGluc3RydWN0aW9uLiAqLwotICBpbnQgaW1tX2FyZ190eXBlOwotI2RlZmluZSBJbW1fTm9uZSAgMAotI2RlZmluZSBJbW1fRmxvYXQgMQotI2RlZmluZSBJbW1fU0ludCAgMgotI2RlZmluZSBJbW1fVUludCAgMwotfQotdGVtcGxhdGU7Ci0KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZSB0aWMzMF9vcHRhYltdID0gewotICB7ICJhYnNmIiAgICwyLDB4MDAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAiYWJzaSIgICAsMiwweDAwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFkZGMiICAgLDIsMHgwMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhZGRjMyIgICwzLDB4MjAwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFkZGYiICAgLDIsMHgwMTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJhZGRmMyIgICwzLDB4MjA4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCi0gIHsgImFkZGkiICAgLDIsMHgwMjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhZGRpMyIgICwzLDB4MjEwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFuZCIgICAgLDIsMHgwMjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJhbmQzIiAgICwzLDB4MjE4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFuZG4iICAgLDIsMHgwMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJhbmRuMyIgICwzLDB4MjIwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFzaCIgICAgLDIsMHgwMzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhc2gzIiAgICwzLDB4MjI4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImIiICAgICAgLDEsMHg2ODAwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidSIgICAgICwxLDB4NjgwMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxvIiAgICAsMSwweDY4MDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJscyIgICAgLDEsMHg2ODAyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiaGkiICAgICwxLDB4NjgwMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhzIiAgICAsMSwweDY4MDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJlcSIgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmUiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx0IiAgICAsMSwweDY4MDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsZSIgICAgLDEsMHg2ODA4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZ3QiICAgICwxLDB4NjgwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmdlIiAgICAsMSwweDY4MEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6IiAgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnoiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnAiICAgICAsMSwweDY4MDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuIiAgICAgLDEsMHg2ODA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibm4iICAgICwxLDB4NjgwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm52IiAgICAsMSwweDY4MEMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ2IiAgICAgLDEsMHg2ODBEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnVmIiAgICwxLDB4NjgwRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVmIiAgICAsMSwweDY4MEYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuYyIgICAgLDEsMHg2ODA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiYyIgICAgICwxLDB4NjgwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdiIgICAsMSwweDY4MTAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdiIgICAgLDEsMHg2ODExMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmx1ZiIgICwxLDB4NjgxMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx1ZiIgICAsMSwweDY4MTMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6dWYiICAgLDEsMHg2ODE0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZCIgICAgICwxLDB4NjgyMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVkIiAgICAsMSwweDY4MjAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsb2QiICAgLDEsMHg2ODIxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHNkIiAgICwxLDB4NjgyMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhpZCIgICAsMSwweDY4MjMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJoc2QiICAgLDEsMHg2ODI0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZXFkIiAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5lZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdGQiICAgLDEsMHg2ODI3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibGVkIiAgICwxLDB4NjgyODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmd0ZCIgICAsMSwweDY4MjkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJnZWQiICAgLDEsMHg2ODJBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiemQiICAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm56ZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJwZCIgICAgLDEsMHg2ODI5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmQiICAgICwxLDB4NjgyNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5uZCIgICAsMSwweDY4MkEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJudmQiICAgLDEsMHg2ODJDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidmQiICAgICwxLDB4NjgyRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm51ZmQiICAsMSwweDY4MkUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ1ZmQiICAgLDEsMHg2ODJGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmNkIiAgICwxLDB4NjgyNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmNkIiAgICAsMSwweDY4MjEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJubHZkIiAgLDEsMHg2ODMwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHZkIiAgICwxLDB4NjgzMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdWZkIiAsMSwweDY4MzIwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdWZkIiAgLDEsMHg2ODMzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJienVmZCIgICwxLDB4NjgzNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnIiICAgICAsMSwweDYwMDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImJyZCIgICAgLDEsMHg2MTAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsIiAgICwxLDB4NjIwMDAwMDAsMCwgICAgICAgICAgIHsgSW1tMjQsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbHUiICAsMSwweDcwMDAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsbyIgLDEsMHg3MDAxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbHMiICwxLDB4NzAwMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGhpIiAsMSwweDcwMDMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxocyIgLDEsMHg3MDA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsZXEiICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5lIiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdCIgLDEsMHg3MDA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbGUiICwxLDB4NzAwODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGd0IiAsMSwweDcwMDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxnZSIgLDEsMHg3MDBBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxseiIgICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG56IiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxwIiAgLDEsMHg3MDA5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbiIgICwxLDB4NzAwNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5uIiAsMSwweDcwMEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxudiIgLDEsMHg3MDBDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsdiIgICwxLDB4NzAwRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG51ZiIsMSwweDcwMEUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx1ZiIgLDEsMHg3MDBGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbmMiICwxLDB4NzAwNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGMiICAsMSwweDcwMDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxubHYiLDEsMHg3MDEwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbHYiICwxLDB4NzAxMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5sdWYiLDEsMHg3MDEyMDAwMCxQQ1JlbCwgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdWYiLDEsMHg3MDEzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsenVmIiwxLDB4NzAxNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY21wZiIgICAsMiwweDA0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImNtcGYzIiAgLDIsMHgyMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJjbXBpIiAgICwyLDB4MDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAiY21waTMiICAsMiwweDIzODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGIiICAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1IiAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsbyIgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJscyIgICAsMiwweDZDMDIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoaSIgICAsMiwweDZDMDMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJocyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJlcSIgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZSIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdCIgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsZSIgICAsMiwweDZDMDgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJndCIgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJnZSIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6IiAgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJueiIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJwIiAgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuIiAgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubiIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudiIgICAsMiwweDZDMEMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ2IiAgICAsMiwweDZDMEQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudWYiICAsMiwweDZDMEUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZiIgICAsMiwweDZDMEYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuYyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJjIiAgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHYiICAsMiwweDZDMTAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdiIgICAsMiwweDZDMTEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHVmIiAsMiwweDZDMTIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdWYiICAsMiwweDZDMTMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6dWYiICAsMiwweDZDMTQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJkIiAgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZCIgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsb2QiICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsc2QiICAsMiwweDZDMjIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoaWQiICAsMiwweDZDMjMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoc2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJlcWQiICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZWQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdGQiICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsZWQiICAsMiwweDZDMjgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJndGQiICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJnZWQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6ZCIgICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuemQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJwZCIgICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZCIgICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubmQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudmQiICAsMiwweDZDMkMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ2ZCIgICAsMiwweDZDMkQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudWZkIiAsMiwweDZDMkUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZmQiICAsMiwweDZDMkYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuY2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJjZCIgICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHZkIiAsMiwweDZDMzAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdmQiICAsMiwweDZDMzEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHVmZCIsMiwweDZDMzIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdWZkIiAsMiwweDZDMzMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6dWZkIiAsMiwweDZDMzQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZml4IiAgICAsMiwweDA1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgQWxsUmVnLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJmbG9hdCIgICwyLDB4MDU4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBSbiwgMCB9LCBJbW1fU0ludCB9LAotICB7ICJpYWNrIiAgICwxLDB4MUIwMDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImlkbGUiICAgLDAsMHgwNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImlkbGUyIiAgLDAsMHgwNjAwMDAwMSwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sIC8qIExDMzEgT25seSAqLwotICB7ICJsZGUiICAgICwyLDB4MDY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmIiAgICAsMiwweDA3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZnUiICAgLDIsMHg0MDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsbyIgICwyLDB4NDA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbHMiICAsMiwweDQxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmhpIiAgLDIsMHg0MTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZocyIgICwyLDB4NDIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmZXEiICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5lIiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdCIgICwyLDB4NDM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbGUiICAsMiwweDQ0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmd0IiAgLDIsMHg0NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZnZSIgICwyLDB4NDUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmeiIgICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm56IiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZwIiAgICwyLDB4NDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbiIgICAsMiwweDQzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5uIiAgLDIsMHg0NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZudiIgICwyLDB4NDYwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmdiIgICAsMiwweDQ2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm51ZiIgLDIsMHg0NzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ1ZiIgICwyLDB4NDc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbmMiICAsMiwweDQyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmMiICAgLDIsMHg0MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZubHYiICwyLDB4NDgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbHYiICAsMiwweDQ4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5sdWYiLDIsMHg0OTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdWYiICwyLDB4NDk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmenVmIiAsMiwweDRBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmkiICAgLDIsMHgwNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIFJuLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImxkaSIgICAgLDIsMHgwODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGl1IiAgICwyLDB4NTAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbG8iICAsMiwweDUwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWxzIiAgLDIsMHg1MTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGloaSIgICwyLDB4NTE4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpaHMiICAsMiwweDUyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWVxIiAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGluZSIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHQiICAsMiwweDUzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWxlIiAgLDIsMHg1NDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlndCIgICwyLDB4NTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpZ2UiICAsMiwweDU1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXoiICAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlueiIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpcCIgICAsMiwweDU0ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW4iICAgLDIsMHg1MzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubiIgICwyLDB4NTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbnYiICAsMiwweDU2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXYiICAgLDIsMHg1NjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGludWYiICwyLDB4NTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpdWYiICAsMiwweDU3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5jIiAgLDIsMHg1MjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGljIiAgICwyLDB4NTA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbmx2IiAsMiwweDU4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWx2IiAgLDIsMHg1ODgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubHVmIiwyLDB4NTkwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHVmIiAsMiwweDU5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXp1ZiIgLDIsMHg1QTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlpIiAgICwyLDB4MDg4MDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCBBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAibGRtIiAgICAsMiwweDA5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkcCIgICAgLDIsMHgwODcwMDAwMCwwLCAgICAgICAgICAgeyBBYnMyNHxEaXJlY3QsIERQUmVnfE5vdFJlcSwgMCB9LCBJbW1fVUludCB9LAotICB7ICJsb3Bvd2VyIiwwLDB4MTA4MDAwMDEsMCwgICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LCAvKiBMQzMxIE9ubHkgKi8KLSAgeyAibHNoIiAgICAsMiwweDA5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImxzaDMiICAgLDMsMHgyNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAibWF4c3BlZWQiLDAsMHgxMDgwMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwgLyogTEMzMSBPbmx5ICovCi0gIHsgIm1weWYiICAgLDIsMHgwQTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJtcHlmMyIgICwzLDB4MjQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCi0gIHsgIm1weWkiICAgLDIsMHgwQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJtcHlpMyIgICwzLDB4MjUwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgIm5lZ2IiICAgLDIsMHgwQjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJuZWdmIiAgICwyLDB4MEI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibmVnaSIgICAsMiwweDBDMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgIm5vcCIgICAgLDEsMHgwQzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWd8SW5kaXJlY3R8Tm90UmVxLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgIm5vcm0iICAgLDIsMHgwRDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LCAvKkNoZWNrIGFub3RoZXIgc291cmNlKi8KLSAgeyAibm90IiAgICAsMiwweDBEODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgIm9yIiAgICAgLDIsMHgxMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJvcjMiICAgICwzLDB4MjU4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgInBvcCIgICAgLDEsMHgwRTIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicG9wZiIgICAsMSwweDBFQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInB1c2giICAgLDEsMHgwRjIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicHVzaGYiICAsMSwweDBGQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGkiICAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl1IiAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsbyIgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlscyIgLDAsMHg3ODAyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGloaSIgLDAsMHg3ODAzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlocyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGllcSIgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluZSIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdCIgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsZSIgLDAsMHg3ODA4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlndCIgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlnZSIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl6IiAgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlueiIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlwIiAgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluIiAgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubiIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGludiIgLDAsMHg3ODBDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl2IiAgLDAsMHg3ODBEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGludWYiLDAsMHg3ODBFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl1ZiIgLDAsMHg3ODBGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluYyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGljIiAgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubHYiLDAsMHg3ODEwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdiIgLDAsMHg3ODExMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubHVmIiwwLDB4NzgxMjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdWYiLDAsMHg3ODEzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl6dWYiLDAsMHg3ODE0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHMiICAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN1IiAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsbyIgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNscyIgLDAsMHg3ODgyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNoaSIgLDAsMHg3ODgzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNocyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNlcSIgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuZSIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdCIgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsZSIgLDAsMHg3ODg4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNndCIgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNnZSIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN6IiAgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNueiIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNwIiAgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuIiAgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubiIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNudiIgLDAsMHg3ODhDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN2IiAgLDAsMHg3ODhEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNudWYiLDAsMHg3ODhFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN1ZiIgLDAsMHg3ODhGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuYyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNjIiAgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubHYiLDAsMHg3ODkwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdiIgLDAsMHg3ODkxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubHVmIiwwLDB4Nzg5MjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdWYiLDAsMHg3ODkzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN6dWYiLDAsMHg3ODk0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJuZCIgICAgLDIsMHgxMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJyb2wiICAgICwxLDB4MTFFMDAwMDEsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJvbGMiICAgLDEsMHgxMjYwMDAwMSxSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicm9yIiAgICAsMSwweDEyRTBGRkZGLFJvdGF0ZSwgICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJyb3JjIiAgICwxLDB4MTM2MEZGRkYsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJwdGIiICAgLDEsMHg2NDAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJycHRzIiAgICwxLDB4MTM5QjAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInNpZ2kiICAgLDAsMHgxNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInN0ZiIgICAgLDIsMHgxNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBSbiwgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdGZpIiAgICwyLDB4MTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgUm4sIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAic3RpIiAgICAsMiwweDE1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZywgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN0aWkiICAgLDIsMHgxNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWcsIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fU0ludCB9LAotICB7ICJzdWJiIiAgICwyLDB4MTY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3ViYjMiICAsMywweDI2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAotICB7ICJzdWJjIiAgICwyLDB4MTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAic3ViZiIgICAsMiwweDE3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInN1YmYzIiAgLDMsMHgyNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKLSAgeyAic3ViaSIgICAsMiwweDE4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YmkzIiAgLDMsMHgyNzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAic3VicmIiICAsMiwweDE4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YnJmIiAgLDIsMHgxOTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdWJyaSIgICwyLDB4MTk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3dpIiAgICAsMCwweDY2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcCIgICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHUiICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxvIiAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxzIiAsMSwweDc0ODIwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGhpIiAsMSwweDc0ODMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGhzIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGVxIiAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5lIiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx0IiAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxlIiAsMSwweDc0ODgwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGd0IiAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGdlIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHoiICAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG56IiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHAiICAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG4iICAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5uIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG52IiAsMSwweDc0OEMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHYiICAsMSwweDc0OEQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG51ZiIsMSwweDc0OEUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHVmIiAsMSwweDc0OEYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5jIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGMiICAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5sdiIsMSwweDc0OTAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx2IiAsMSwweDc0OTEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5sdWYiLDEsMHg3NDkyMDAyMCwwLCAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx1ZiIsMSwweDc0OTMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHp1ZiIsMSwweDc0OTQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHN0YiIgICAsMiwweDFBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInRzdGIzIiAgLDIsMHgyNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInhvciIgICAgLDIsMHgxQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJ4b3IzIiAgICwzLDB4MjgwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgIiIgICAgICAgLDAsMHgwMDAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHRlbXBsYXRlICpjb25zdCB0aWMzMF9vcHRhYl9lbmQgPQotICB0aWMzMF9vcHRhYiArIHNpemVvZih0aWMzMF9vcHRhYikvc2l6ZW9mKHRpYzMwX29wdGFiWzBdKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHNfMTsKLSAgdW5zaWduZWQgaW50IG9wZXJhbmRzXzI7Ci0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbMl1bM107Ci0gIC8qIFdoaWNoIG9wZXJhbmQgZml0cyBpbnRvIHdoaWNoIHBhcnQgb2YgdGhlIGZpbmFsIG9wY29kZSB3b3JkLiAqLwotICBpbnQgb3BvcmRlcjsKLX0gcGFydGVtcGxhdGU7Ci0KLS8qIG9wb3JkZXIgZGVmaW5lcyAtIG5vdCB2ZXJ5IGRlc2NyaXB0aXZlLiAqLwotI2RlZmluZSBPT180b3AxICAgMAotI2RlZmluZSBPT180b3AyICAgMQotI2RlZmluZSBPT180b3AzICAgMgotI2RlZmluZSBPT181b3AxICAgMwotI2RlZmluZSBPT181b3AyICAgNAotI2RlZmluZSBPT19QRmllbGQgNQotCi1zdGF0aWMgY29uc3QgcGFydGVtcGxhdGUgdGljMzBfcGFyb3B0YWJbXSA9IHsKLSAgeyAicV9hYnNmX3N0ZiIsICAgMiwyLDB4QzgwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9hYnNpX3N0aSIsICAgMiwyLDB4Q0EwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9hZGRmM19zdGYiLCAgMywyLDB4Q0MwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfYWRkaTNfc3RpIiwgIDMsMiwweENFMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX2FuZDNfc3RpIiwgICAzLDIsMHhEMDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9hc2gzX3N0aSIsICAgMywyLDB4RDIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfZml4X3N0aSIsICAgIDIsMiwweEQ0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfZmxvYXRfc3RmIiwgIDIsMiwweEQ2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbGRmX2xkZiIsICAgIDIsMiwweEM0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKLQlPT180b3AyIH0sCi0gIHsgInFfbGRmX3N0ZiIsICAgIDIsMiwweEQ4MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbGRpX2xkaSIsICAgIDIsMiwweEM2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKLQlPT180b3AyIH0sCi0gIHsgInFfbGRpX3N0aSIsICAgIDIsMiwweERBMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbHNoM19zdGkiLCAgIDMsMiwweERDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMiB9LAotICB7ICJxX21weWYzX2FkZGYzIiwzLDMsMHg4MDAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCi0gCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKLSAgeyAicV9tcHlmM19zdGYiLCAgMywyLDB4REUwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfbXB5ZjNfc3ViZjMiLDMsMywweDg0MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbXB5aTNfYWRkaTMiLDMsMywweDg4MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbXB5aTNfc3RpIiwgIDMsMiwweEUwMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX21weWkzX3N1YmkzIiwzLDMsMHg4QzAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9IH0sIE9PX1BGaWVsZCB9LAotICB7ICJxX25lZ2Zfc3RmIiwgICAyLDIsMHhFMjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX25lZ2lfc3RpIiwgICAyLDIsMHhFNDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX25vdF9zdGkiLCAgICAyLDIsMHhFNjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX29yM19zdGkiLCAgICAzLDIsMHhFODAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9zdGZfc3RmIiwgICAgMiwyLDB4QzAwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDMgfSwKLSAgeyAicV9zdGlfc3RpIiwgICAgMiwyLDB4QzIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDMgfSwKLSAgeyAicV9zdWJmM19zdGYiLCAgMywyLDB4RUEwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfc3ViaTNfc3RpIiwgIDMsMiwweEVDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMiB9LAotICB7ICJxX3hvcjNfc3RpIiwgICAzLDIsMHhFRTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAiIiwgICAgICAgICAgICAgMCwwLDB4MDAwMDAwMDAsIHsgeyAwLCAwLCAwIH0sIHsgMCwgMCwgMCB9IH0sIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHBhcnRlbXBsYXRlICpjb25zdCB0aWMzMF9wYXJvcHRhYl9lbmQgPQotICB0aWMzMF9wYXJvcHRhYiArIHNpemVvZih0aWMzMF9wYXJvcHRhYikvc2l6ZW9mKHRpYzMwX3Bhcm9wdGFiWzBdKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWM4MC5oIGIvaW5jbHVkZS9vcGNvZGUvdGljODAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5YmMzMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS90aWM4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qIHRpYzgwLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJIFRNUzMyMEM4MCAoTVYpIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCAoZm5mQGN5Z251cy5jb20pLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRJQzgwX0gKLSNkZWZpbmUgVElDODBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB0aWM4MF9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgdGljODBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBvcGVyYW5kcwotICAgICBhcmUgemVyb2VzLiAgKi8KLQotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYSBtYXNrCi0gICAgIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUgb3Bjb2RlCi0gICAgIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdCBtYXRjaCAoYW5kIGFyZQotICAgICBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBTcGVjaWFsIHB1cnBvc2UgZmxhZ3MgZm9yIHRoaXMgb3Bjb2RlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3M7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZSBvcGVyYW5kCi0gICAgIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0IGFwcGVhciBpbgotICAgICBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgRklYTUU6IEFkanVzdCBzaXplIHRvCi0gICAgIG1hdGNoIGFjdHVhbCByZXF1aXJlbWVudHMgd2hlbiBUSWM4MCBzdXBwb3J0IGlzIGNvbXBsZXRlICovCi0KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UgaW4KLSAgIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlciBpbnN0cnVjdGlvbnMuCi0gICBGSVhNRTogVGhpcyBpc24ndCBjdXJyZW50bHkgdHJ1ZS4gKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgdGljODBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCB0aWM4MF9udW1fb3Bjb2RlczsKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB0aWM4MF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IHRpYzgwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLQotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi0gIGludCBzaGlmdDsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgKCppbnNlcnQpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGxvbmcgb3AsCi0JCQkJICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NJR05FRCkgIT0gMAotCSAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCi0JICAgb3AgLT0gMSA8PCBvLT5iaXRzOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotCi0gIGxvbmcgKCpleHRyYWN0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgdGljODBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCB0aWM4MF9vcGVyYW5kc1tdOwotCi0MCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHRpYzgwX29wZXJhbmQuCi0KLSAgIE5vdGUgdGhhdCBmbGFncyBmb3IgYWxsIHByZWRlZmluZWQgc3ltYm9scywgc3VjaCBhcyB0aGUgZ2VuZXJhbCBwdXJwb3NlCi0gICByZWdpc3RlcnMgKGV4OiByMTApLCBjb250cm9sIHJlZ2lzdGVycyAoZXg6IEZQU1QpLCBjb25kaXRpb24gY29kZXMgKGV4OgotICAgZXEwLmIpLCBiaXQgbnVtYmVycyAoZXg6IGd0LmIpLCBldGMgYXJlIGxhcmdlIGVub3VnaCB0aGF0IHRoZXkgY2FuIGJlCi0gICBvcidkIGludG8gYW4gaW50IHdoZXJlIHRoZSBsb3dlciBiaXRzIGNvbnRhaW4gdGhlIGFjdHVhbCBudW1lcmljIHZhbHVlCi0gICB0aGF0IGNvcnJlcG9uZHMgdG8gdGhpcyBwcmVkZWZpbmVkIHN5bWJvbC4gIFRoaXMgd2F5IGEgc2luZ2xlIGludCBjYW4KLSAgIGNvbnRhaW4gYm90aCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgaXQncyB0eXBlLgotICovCi0KLS8qIFRoaXMgb3BlcmFuZCBtdXN0IGJlIGFuIGV2ZW4gcmVnaXN0ZXIgbnVtYmVyLiAgRmxvYXRpbmcgcG9pbnQgbnVtYmVycwotICAgZm9yIGV4YW1wbGUgYXJlIHN0b3JlZCBpbiBldmVuL29kZCByZWdpc3RlciBwYWlycy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0VWRU4JKDEgPDwgMCkKLQotLyogVGhpcyBvcGVyYW5kIG11c3QgYmUgYW4gb2RkIHJlZ2lzdGVyIG51bWJlciBhbmQgbXVzdCBiZSBvbmUgZ3JlYXRlciB0aGFuCi0gICB0aGUgcmVnaXN0ZXIgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBvcGVyYW5kLiAgSS5FLiB0aGUgc2Vjb25kIHJlZ2lzdGVyIGluCi0gICBhbiBldmVuL29kZCByZWdpc3RlciBwYWlyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfT0RECSgxIDw8IDEpCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLiAgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1NJR05FRAkoMSA8PCAyKQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGJlIGVpdGhlciBhIHByZWRlZmluZWQgY29uc3RhbnQgbmFtZSBvciBhIG51bWVyaWMgdmFsdWUuCi0gICBBbiBleGFtcGxlIHdvdWxkIGJlIGEgY29uZGl0aW9uIGNvZGUgbGlrZSAiZXEwLmIiIHdoaWNoIGhhcyB0aGUgbnVtZXJpYwotICAgdmFsdWUgMHgyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTlVNCSgxIDw8IDMpCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgYmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyByYXRoZXIgdGhhbiBzZXBhcmF0ZWQKLSAgIGZyb20gdGhlIHByZXZpb3VzIG9uZSBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB2YXJpb3VzCi0gICBpbnN0cnVjdGlvbnMsIGxpa2UgdGhlIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucywgd2hpY2ggd2FudAotICAgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlICJkaXNwbGFjZW1lbnQocmVnKSIgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1BBUkVOUwkoMSA8PCA0KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBQQyByZWxhdGl2ZSBicmFuY2ggb2Zmc2V0LiAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMKLSAgIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gIE5vdGUgdGhhdCB0aGUgb2Zmc2V0cyBhcmUgdGFrZW4gYXMgd29yZAotICAgb2Zmc2V0cy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1BDUkVMCSgxIDw8IDUpCi0KLS8qIFRoaXMgZmxhZyBpcyBhIGhpbnQgdG8gdGhlIGRpc2Fzc2VtYmxlciBmb3IgdXNpbmcgaGV4IGFzIHRoZSBwcmVmZXJlZAotICAgcHJpbnRpbmcgZm9ybWF0LCBldmVuIGZvciBzbWFsbCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbW1lZGlhdGUgdmFsdWVzLgotICAgTm9ybWFsbHkgdmFsdWVzIGluIHRoZSByYW5nZSAtOTk5IHRvIDk5OSBhcmUgcHJpbnRlZCBhcyBzaWduZWQgZGVjaW1hbAotICAgdmFsdWVzIGFuZCBvdGhlciB2YWx1ZXMgYXJlIHByaW50ZWQgaW4gaGV4LiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQklURklFTEQJKDEgPDwgNikKLQotLyogVGhpcyBvcGVyYW5kIG1heSBoYXZlIGEgIjptIiBtb2RpZmllciBzcGVjaWZpZWQgYnkgYml0IDE3IGluIGEgc2hvcnQKLSAgIGltbWVkaWF0ZSBmb3JtIGluc3RydWN0aW9uLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTV9TSQkoMSA8PCA3KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOm0iIG1vZGlmaWVyIHNwZWNpZmllZCBieSBiaXQgMTUgaW4gYSBsb25nCi0gICBpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX01fTEkJKDEgPDwgOCkKLQotLyogVGhpcyBvcGVyYW5kIG1heSBoYXZlIGEgIjpzIiBtb2RpZmllciBzcGVjaWZpZWQgaW4gYml0IDExIGluIGEgbG9uZwotICAgaW1tZWRpYXRlIG9yIHJlZ2lzdGVyIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9TQ0FMRUQJKDEgPDwgOSkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0ZMT0FUCSgxIDw8IDEwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYnl0ZSBvZmZzZXQgZnJvbSBhIGJhc2UgcmVsb2NhdGlvbi4gVGhlIGxvd2VyCi0gdHdvIGJpdHMgb2YgdGhlIGZpbmFsIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSBpZ25vcmVkIHdoZW4gdGhlIHZhbHVlIGlzCi0gd3JpdHRlbiB0byB0aGUgcHJvZ3JhbSBjb3VudGVyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQkFTRVJFTAkoMSA8PCAxMSkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGFuICJlbmRtYXNrIiBmaWVsZCBmb3IgYSBzaGlmdCBpbnN0cnVjdGlvbi4KLSAgIEl0IGlzIHRyZWF0ZWQgc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBoYXZlIHZhbHVlcyBvZiAwLTMyLAotICAgd2hlcmUgMCBhbmQgMzIgcmVzdWx0IGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhlIGFzc2VtYmxlcgotICAgbXVzdCBiZSBhYmxlIHRvIGFjY2VwdCBib3RoIGVuZG1hc2sgdmFsdWVzLiAgVGhpcyBkaXNhc3NlbWJsZXIKLSAgIGhhcyBubyB3YXkgb2Yga25vd2luZyBmcm9tIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB2YWx1ZSB3YXMgCi0gICBnaXZlbiBhdCBhc3NlbWJseSB0aW1lLCBzbyBpdCBqdXN0IHVzZXMgJzAnLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRU5ETUFTSwkoMSA8PCAxMikKLQotLyogVGhpcyBvcGVyYW5kIGlzIG9uZSBvZiB0aGUgMzIgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdyJy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0dQUgkoMSA8PCAyNykKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQgYWNjdW11bGF0b3IgcmVnaXN0ZXIuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSB3aXRoIGEgbGVhZGluZyAnYScuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9GUEEJKCAxIDw8IDI4KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBjb250cm9sIHJlZ2lzdGVyIG51bWJlciwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJFSUYiLCAiRVBDIiwgZXRjKS4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseS4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0NSCSgxIDw8IDI5KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBjb25kaXRpb24gY29kZSwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJlcTAuYiIsICJuZTAudyIsIGV0YykuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9DQwkoMSA8PCAzMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgYml0IG51bWJlciwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJlcS5iIiwgIm9yLmYiLCBldGMpLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5LgotICAgTm90ZSB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBpbnN0cnVjdGlvbiBpbiAxJ3MgY29tcGxlbWVudCByZWxhdGl2ZQotICAgdG8gdGhlIHZhbHVlcyBnaXZlbiBpbiB0aGUgbWFudWFsLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQklUTlVNCSgxIDw8IDMxKQotCi0vKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBzdHJpcCBvcGVyYW5kIGJpdHMgZnJvbSBhbiBpbnQgdGhhdCBjb250YWlucwotICAgYm90aCBvcGVyYW5kIGJpdHMgYW5kIGEgbnVtZXJpYyB2YWx1ZSBpbiB0aGUgbHNicy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX01BU0sJKFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9GUEEgfCBUSUM4MF9PUEVSQU5EX0NSIHwgVElDODBfT1BFUkFORF9DQyB8IFRJQzgwX09QRVJBTkRfQklUTlVNKQotCi0MCi0vKiBGbGFnIGJpdHMgZm9yIHRoZSBzdHJ1Y3QgdGljODBfb3Bjb2RlIGZsYWdzIGZpZWxkLiAqLwotCi0jZGVmaW5lIFRJQzgwX1ZFQ1RPUgkJMDEJLyogSXMgYSB2ZWN0b3IgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVElDODBfTk9fUjBfREVTVAkwMgkvKiBSZWdpc3RlciByMCBjYW5ub3QgYmUgYSBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCi0MCi0vKiBUaGUgb3Bjb2RlcyBsaWJyYXJ5IGNvbnRhaW5zIGEgdGFibGUgdGhhdCBhbGxvd3MgdHJhbnNsYXRpb24gZnJvbSBwcmVkZWZpbmVkCi0gICBzeW1ib2wgbmFtZXMgdG8gbnVtZXJpYyB2YWx1ZXMsIGFuZCB2aWNlIHZlcnNhLiAqLwotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHN5bWJvbHMuICAqLwotCi1zdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wKLXsKLSAgY2hhciAqbmFtZTsJCS8qIG5hbWUgdG8gcmVjb2duaXplICovCi0gIGludCB2YWx1ZTsKLX07Ci0KLSNkZWZpbmUgUERTX05BTUUocGRzcCkgKChwZHNwKSAtPiBuYW1lKQotI2RlZmluZSBQRFNfVkFMVUUocGRzcCkgKChwZHNwKSAtPiB2YWx1ZSkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbXTsJLyogVHJhbnNsYXRpb24gYXJyYXkgKi8KLWV4dGVybiBjb25zdCBpbnQgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9sczsJCQkJLyogSG93IG1hbnkgbWVtYmVycyBpbiB0aGUgYXJyYXkgKi8KLQotY29uc3QgY2hhciAqdGljODBfdmFsdWVfdG9fc3ltYm9sIFBBUkFNUyAoKGludCB2YWwsIGludCBjbGFzcykpOwkvKiBUcmFuc2xhdGUgdmFsdWUgdG8gc3ltYm9saWMgbmFtZSAqLwotaW50IHRpYzgwX3N5bWJvbF90b192YWx1ZSBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgY2xhc3MpKTsJCS8qIFRyYW5zbGF0ZSBzeW1ib2xpYyBuYW1lIHRvIHZhbHVlICovCi0KLWNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqCi10aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqKSk7Ci0KLSNlbmRpZiAvKiBUSUM4MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS92ODUwLmggYi9pbmNsdWRlL29wY29kZS92ODUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTE2ZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvdjg1MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qIHY4NTAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTkVDIFY4NTAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFY4NTBfSAotI2RlZmluZSBWODUwX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3Qgdjg1MF9vcGNvZGUuICAqLwotCi1zdHJ1Y3Qgdjg1MF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci0KLSAgLyogV2hpY2ggKGlmIGFueSkgb3BlcmFuZCBpcyBhIG1lbW9yeSBvcGVyYW5kLiAgKi8KLSAgdW5zaWduZWQgaW50IG1lbW9wOwotCi0gIC8qIFRhcmdldCBwcm9jZXNzb3IocykuICBBIGJpdCBmaWVsZCBvZiBwcm9jZXNzb3JzIHdoaWNoIHN1cHBvcnQKLSAgICAgdGhpcyBpbnN0cnVjdGlvbi4gIE5vdGUgYSBiaXQgZmllbGQgaXMgdXNlZCBhcyBzb21lIGluc3RydWN0aW9ucwotICAgICBhcmUgYXZhaWxhYmxlIG9uIG11bHRpcGxlLCBkaWZmZXJlbnQgcHJvY2Vzc29yIHR5cGVzLCB3aGVyZWFzCi0gICAgIG90aGVyIGluc3RydWN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgb24gb25lIHNwZWNpZmljIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yczsKLX07Ci0KLS8qIFZhbHVlcyBmb3IgdGhlIHByb2Nlc3NvcnMgZmllbGQgaW4gdGhlIHY4NTBfb3Bjb2RlIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9WODUwCQkoMSA8PCAwKQkJLyogSnVzdCB0aGUgVjg1MC4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9BTEwJCS0xCQkJLyogQW55IHByb2Nlc3Nvci4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9WODUwRQkJKDEgPDwgMSkJCS8qIEp1c3QgdGhlIFY4NTBFLiAqLwotI2RlZmluZSBQUk9DRVNTT1JfTk9UX1Y4NTAJKH4gUFJPQ0VTU09SX1Y4NTApCS8qIEFueSBwcm9jZXNzb3IgZXhjZXB0IHRoZSBWODUwLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTBFQQkoMSA8PCAyKQkJLyogSnVzdCB0aGUgVjg1MEVBLiAqLwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlIHY4NTBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCB2ODUwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHY4NTBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCB2ODUwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgLyogSWYgdGhpcyB2YWx1ZSBpcyAtMSB0aGVuIHRoZSBvcGVyYW5kJ3MgYml0cyBhcmUgaW4gYSBkaXNjb250aW5vdXMgZGlzdHJpYnV0aW9uIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogKGJpdHMgPj0gMCk6ICBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiAoYml0cyA9PSAtMSk6IEJpdCBtYXNrIG9mIHRoZSBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgKCogaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBsb25nIG9wLAotCQkJCSAgIGNvbnN0IGNoYXIgKiogZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gby0+Yml0cyA9PSAtMSA/ICgoaSkgJiBvLT5zaGlmdCkgOiAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoby0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCSAgICAgb3AgPSAob3AgPDwgKDMyIC0gby0+Yml0cykpID4+ICgzMiAtIG8tPmJpdHMpOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotICB1bnNpZ25lZCBsb25nICgqIGV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqIGludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIGludCBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgdjg1MF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgdjg1MF9vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHY4NTBfb3BlcmFuZC4gICovCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfUkVHCTB4MDEKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgc3lzdGVtIHJlZ2lzdGVyICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9TUkcJMHgwMgotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBjb25kaXRpb24gY29kZSB1c2VkIGluIHRoZSBzZXRmIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9DQwkJMHgwNAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcyAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfU0lHTkVECTB4MDgKLQotLyogVGhpcyBvcGVyYW5kIGlzIHRoZSBlcCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9FUAkJMHgxMAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBQQyBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0RJU1AJMHgyMAotCi0vKiBUaGlzIGlzIGEgcmVsYXhhYmxlIG9wZXJhbmQuICAgT25seSB1c2VkIGZvciBEOS0+RDIyIGJyYW5jaCByZWxheGluZwotICAgcmlnaHQgbm93LiAgV2UgbWF5IG5lZWQgb3RoZXJzIGluIHRoZSBmdXR1cmUgKG9yIG1heWJlIGhhbmRsZSB0aGVtIGxpa2UKLSAgIHByb21vdGVkIG9wZXJhbmRzIG9uIHRoZSBtbjEwMzAwPykgICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9SRUxBWAkweDQwCi0KLS8qIFRoZSByZWdpc3RlciBzcGVjaWZpZWQgbXVzdCBub3QgYmUgcjAgKi8KLSNkZWZpbmUgVjg1MF9OT1RfUjAJICAgICAgICAweDgwCi0KLS8qIENZR05VUyBMT0NBTCB2ODUwZSAqLwotLyogcHVzaC9wb3AgdHlwZSBpbnN0cnVjdGlvbiwgVjg1MEUgc3BlY2lmaWMuICAqLwotI2RlZmluZSBWODUwRV9QVVNIX1BPUAkJMHgxMDAKLQotLyogMTYgYml0IGltbWVkaWF0ZSBmb2xsb3dzIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX0lNTUVESUFURTE2CTB4MjAwCi0KLS8qIDMyIGJpdCBpbW1lZGlhdGUgZm9sbG93cyBpbnN0cnVjdGlvbiwgVjg1MEUgc3BlY2lmaWMuICAqLwotI2RlZmluZSBWODUwRV9JTU1FRElBVEUzMgkweDQwMAotCi0jZW5kaWYgLyogVjg1MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS92YXguaCBiL2luY2x1ZGUvb3Bjb2RlL3ZheC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2FmZWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3ZheC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qIFZheCBvcGNkZSBsaXN0LgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotR0RCIGFuZCBHQVMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGFuZCBHQVMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCIG9yIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiB2YXhfb3Bjb2RlVAotI2RlZmluZSB2YXhfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyB2YXhfb3Bjb2RlVCAqLwotCi1zdHJ1Y3Qgdm90X3dvdAkJCS8qIHZheCBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMgKi8KLQkJCQkvKiBwYXJ0aWN1bGFyIG9wY29kZSAqLwotewotICBjb25zdCBjaGFyICAgICAgICphcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotICB2YXhfb3Bjb2RlVCAgICAgICBjb2RlOwkvKiBvcC1jb2RlIChtYXkgYmUgPiA4IGJpdHMhKSAqLwotfTsKLQotc3RydWN0IHZvdAkJCS8qIHZheCBvcGNvZGUgdGV4dCAqLwotewotICBjb25zdCBjaGFyICAgICAgICpuYW1lOwkvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCi0gIHN0cnVjdCB2b3Rfd290ICAgIGRldGFpbDsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSB2b3RfaG93IGFyZ3MKLSNkZWZpbmUgdm90X2NvZGUgY29kZQotI2RlZmluZSB2b3RfZGV0YWlsIGRldGFpbAotI2RlZmluZSB2b3RfbmFtZSBuYW1lCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm90Ci12b3RzdHJzW10gPQotewoteyAgICAiaGFsdCIsCXsiIiwJCQkweDAwCX0gfSwKLXsgICAgIm5vcCIsCXsiIiwJCQkweDAxCX0gfSwKLXsgICAgInJlaSIsCXsiIiwJCQkweDAyCX0gfSwKLXsgICAgImJwdCIsCXsiIiwJCQkweDAzCX0gfSwKLXsgICAgInJldCIsCXsiIiwJCQkweDA0CX0gfSwKLXsgICAgInJzYiIsCXsiIiwJCQkweDA1CX0gfSwKLXsgICAgImxkcGN0eCIsCXsiIiwJCQkweDA2CX0gfSwKLXsgICAgInN2cGN0eCIsCXsiIiwJCQkweDA3CX0gfSwKLXsgICAgImN2dHBzIiwJeyJyd2FicndhYiIsCQkweDA4CX0gfSwKLXsgICAgImN2dHNwIiwJeyJyd2FicndhYiIsCQkweDA5CX0gfSwKLXsgICAgImluZGV4IiwJeyJybHJscmxybHJsd2wiLAkweDBhCX0gfSwKLXsgICAgImNyYyIsCXsiYWJybHJ3YWIiLAkJMHgwYgl9IH0sCi17ICAgICJwcm9iZXIiLAl7InJicndhYiIsCQkweDBjCX0gfSwKLXsgICAgInByb2JldyIsCXsicmJyd2FiIiwJICAgICAgICAweDBkCX0gfSwKLXsgICAgImluc3F1ZSIsCXsiYWJhYiIsCQkweDBlCX0gfSwKLXsgICAgInJlbXF1ZSIsCXsiYWJ3bCIsCQkweDBmCX0gfSwKLXsgICAgImJzYmIiLAl7ImJiIiwJCQkweDEwCX0gfSwKLXsgICAgImJyYiIsCXsiYmIiLAkJCTB4MTEJfSB9LAoteyAgICAiYm5lcSIsCXsiYmIiLAkJCTB4MTIJfSB9LAoteyAgICAiYm5lcXUiLAl7ImJiIiwJCQkweDEyCX0gfSwKLXsgICAgImJlcWwiLAl7ImJiIiwJCQkweDEzCX0gfSwKLXsgICAgImJlcWx1IiwJeyJiYiIsCQkJMHgxMwl9IH0sCi17ICAgICJiZ3RyIiwJeyJiYiIsCQkJMHgxNAl9IH0sCi17ICAgICJibGVxIiwJeyJiYiIsCQkJMHgxNQl9IH0sCi17ICAgICJqc2IiLAl7ImFiIiwJCQkweDE2CX0gfSwKLXsgICAgImptcCIsCXsiYWIiLAkJCTB4MTcJfSB9LAoteyAgICAiYmdlcSIsCXsiYmIiLAkJCTB4MTgJfSB9LAoteyAgICAiYmxzcyIsCXsiYmIiLAkJCTB4MTkJfSB9LAoteyAgICAiYmd0cnUiLAl7ImJiIiwJCQkweDFhCX0gfSwKLXsgICAgImJsZXF1IiwJeyJiYiIsCQkJMHgxYgl9IH0sCi17ICAgICJidmMiLAl7ImJiIiwJCQkweDFjCX0gfSwKLXsgICAgImJ2cyIsCXsiYmIiLAkJCTB4MWQJfSB9LAoteyAgICAiYmNjIiwJeyJiYiIsCQkJMHgxZQl9IH0sCi17ICAgICJiZ2VxdSIsCXsiYmIiLAkJCTB4MWUJfSB9LAoteyAgICAiYmxzc3UiLAl7ImJiIiwJCQkweDFmCX0gfSwKLXsgICAgImJjcyIsCXsiYmIiLAkJCTB4MWYJfSB9LAoteyAgICAiYWRkcDQiLAl7InJ3YWJyd2FiIiwJCTB4MjAJfSB9LAoteyAgICAiYWRkcDYiLAl7InJ3YWJyd2FicndhYiIsCTB4MjEJfSB9LAoteyAgICAic3VicDQiLAl7InJ3YWJyd2FiIiwJCTB4MjIJfSB9LAoteyAgICAic3VicDYiLAl7InJ3YWJyd2FicndhYiIsCTB4MjMJfSB9LAoteyAgICAiY3Z0cHQiLAl7InJ3YWJhYnJ3YWIiLAkJMHgyNAl9IH0sCi17ICAgICJtdWxwIiwJeyJyd2FicndhYnJ3YWIiLAkweDI1CX0gfSwKLXsgICAgImN2dHRwIiwJeyJyd2FiYWJyd2FiIiwJCTB4MjYJfSB9LAoteyAgICAiZGl2cCIsCXsicndhYnJ3YWJyd2FiIiwJMHgyNwl9IH0sCi17ICAgICJtb3ZjMyIsCXsicndhYmFiIiwJCTB4MjgJfSB9LAoteyAgICAiY21wYzMiLAl7InJ3YWJhYiIsCQkweDI5CX0gfSwKLXsgICAgInNjYW5jIiwJeyJyd2FiYWJyYiIsCQkweDJhCX0gfSwKLXsgICAgInNwYW5jIiwJeyJyd2FiYWJyYiIsCQkweDJiCX0gfSwKLXsgICAgIm1vdmM1IiwJeyJyd2FicmJyd2FiIiwJCTB4MmMJfSB9LAoteyAgICAiY21wYzUiLAl7InJ3YWJyYnJ3YWIiLAkJMHgyZAl9IH0sCi17ICAgICJtb3Z0YyIsCXsicndhYnJiYWJyd2FiIiwJMHgyZQl9IH0sCi17ICAgICJtb3Z0dWMiLAl7InJ3YWJyYmFicndhYiIsCTB4MmYJfSB9LAoteyAgICAiYnNidyIsCXsiYnciLAkJCTB4MzAJfSB9LAoteyAgICAiYnJ3IiwJeyJidyIsCQkJMHgzMQl9IH0sCi17ICAgICJjdnR3bCIsCXsicnd3bCIsCQkweDMyCX0gfSwKLXsgICAgImN2dHdiIiwJeyJyd3diIiwJCTB4MzMJfSB9LAoteyAgICAibW92cCIsCXsicndhYmFiIiwJCTB4MzQJfSB9LAoteyAgICAiY21wcDMiLAl7InJ3YWJhYiIsCQkweDM1CX0gfSwKLXsgICAgImN2dHBsIiwJeyJyd2Fid2wiLAkJMHgzNgl9IH0sCi17ICAgICJjbXBwNCIsCXsicndhYnJ3YWIiLAkJMHgzNwl9IH0sCi17ICAgICJlZGl0cGMiLAl7InJ3YWJhYmFiIiwJCTB4MzgJfSB9LAoteyAgICAibWF0Y2hjIiwJeyJyd2FicndhYiIsCQkweDM5CX0gfSwKLXsgICAgImxvY2MiLAl7InJicndhYiIsCQkweDNhCX0gfSwKLXsgICAgInNrcGMiLAl7InJicndhYiIsCQkweDNiCX0gfSwKLXsgICAgIm1vdnp3bCIsCXsicnd3bCIsCQkweDNjCX0gfSwKLXsgICAgImFjYnciLAl7InJ3cndtd2J3IiwJCTB4M2QJfSB9LAoteyAgICAibW92YXciLAl7ImF3d2wiLAkJMHgzZQl9IH0sCi17ICAgICJwdXNoYXciLAl7ImF3IiwJCQkweDNmCX0gfSwKLXsgICAgImFkZGYyIiwJeyJyZm1mIiwJCTB4NDAJfSB9LAoteyAgICAiYWRkZjMiLAl7InJmcmZ3ZiIsCQkweDQxCX0gfSwKLXsgICAgInN1YmYyIiwJeyJyZm1mIiwJCTB4NDIJfSB9LAoteyAgICAic3ViZjMiLAl7InJmcmZ3ZiIsCQkweDQzCX0gfSwKLXsgICAgIm11bGYyIiwJeyJyZm1mIiwJCTB4NDQJfSB9LAoteyAgICAibXVsZjMiLAl7InJmcmZ3ZiIsCQkweDQ1CX0gfSwKLXsgICAgImRpdmYyIiwJeyJyZm1mIiwJCTB4NDYJfSB9LAoteyAgICAiZGl2ZjMiLAl7InJmcmZ3ZiIsCQkweDQ3CX0gfSwKLXsgICAgImN2dGZiIiwJeyJyZndiIiwJCTB4NDgJfSB9LAoteyAgICAiY3Z0ZnciLAl7InJmd3ciLAkJMHg0OQl9IH0sCi17ICAgICJjdnRmbCIsCXsicmZ3bCIsCQkweDRhCX0gfSwKLXsgICAgImN2dHJmbCIsCXsicmZ3bCIsCQkweDRiCX0gfSwKLXsgICAgImN2dGJmIiwJeyJyYndmIiwJCTB4NGMJfSB9LAoteyAgICAiY3Z0d2YiLAl7InJ3d2YiLAkJMHg0ZAl9IH0sCi17ICAgICJjdnRsZiIsCXsicmx3ZiIsCQkweDRlCX0gfSwKLXsgICAgImFjYmYiLAl7InJmcmZtZmJ3IiwJCTB4NGYJfSB9LAoteyAgICAibW92ZiIsCXsicmZ3ZiIsCQkweDUwCX0gfSwKLXsgICAgImNtcGYiLAl7InJmcmYiLAkJMHg1MQl9IH0sCi17ICAgICJtbmVnZiIsCXsicmZ3ZiIsCQkweDUyCX0gfSwKLXsgICAgInRzdGYiLAl7InJmIiwJCQkweDUzCX0gfSwKLXsgICAgImVtb2RmIiwJeyJyZnJicmZ3bHdmIiwJCTB4NTQJfSB9LAoteyAgICAicG9seWYiLAl7InJmcndhYiIsCQkweDU1CX0gfSwKLXsgICAgImN2dGZkIiwJeyJyZndkIiwJCTB4NTYJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1NyBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLXsgICAgImFkYXdpIiwJeyJyd213IiwJCTB4NTgJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1OSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNWEgaXMgbm90IGRlZmluZWQgeWV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDViIGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiaW5zcWhpIiwJeyJhYmFxIiwJCTB4NWMJfSB9LAoteyAgICAiaW5zcXRpIiwJeyJhYmFxIiwJCTB4NWQJfSB9LAoteyAgICAicmVtcWhpIiwJeyJhcXdsIiwJCTB4NWUJfSB9LAoteyAgICAicmVtcXRpIiwJeyJhcXdsIiwJCTB4NWYJfSB9LAoteyAgICAiYWRkZDIiLAl7InJkbWQiLAkJMHg2MAl9IH0sCi17ICAgICJhZGRkMyIsCXsicmRyZHdkIiwJCTB4NjEJfSB9LAoteyAgICAic3ViZDIiLAl7InJkbWQiLAkJMHg2Mgl9IH0sCi17ICAgICJzdWJkMyIsCXsicmRyZHdkIiwJCTB4NjMJfSB9LAoteyAgICAibXVsZDIiLAl7InJkbWQiLAkJMHg2NAl9IH0sCi17ICAgICJtdWxkMyIsCXsicmRyZHdkIiwJCTB4NjUJfSB9LAoteyAgICAiZGl2ZDIiLAl7InJkbWQiLAkJMHg2Ngl9IH0sCi17ICAgICJkaXZkMyIsCXsicmRyZHdkIiwJCTB4NjcJfSB9LAoteyAgICAiY3Z0ZGIiLAl7InJkd2IiLAkJMHg2OAl9IH0sCi17ICAgICJjdnRkdyIsCXsicmR3dyIsCQkweDY5CX0gfSwKLXsgICAgImN2dGRsIiwJeyJyZHdsIiwJCTB4NmEJfSB9LAoteyAgICAiY3Z0cmRsIiwJeyJyZHdsIiwJCTB4NmIJfSB9LAoteyAgICAiY3Z0YmQiLAl7InJid2QiLAkJMHg2Ywl9IH0sCi17ICAgICJjdnR3ZCIsCXsicnd3ZCIsCQkweDZkCX0gfSwKLXsgICAgImN2dGxkIiwJeyJybHdkIiwJCTB4NmUJfSB9LAoteyAgICAiYWNiZCIsCXsicmRyZG1kYnciLAkJMHg2Zgl9IH0sCi17ICAgICJtb3ZkIiwJeyJyZHdkIiwJCTB4NzAJfSB9LAoteyAgICAiY21wZCIsCXsicmRyZCIsCQkweDcxCX0gfSwKLXsgICAgIm1uZWdkIiwJeyJyZHdkIiwJCTB4NzIJfSB9LAoteyAgICAidHN0ZCIsCXsicmQiLAkJCTB4NzMJfSB9LAoteyAgICAiZW1vZGQiLAl7InJkcmJyZHdsd2QiLAkJMHg3NAl9IH0sCi17ICAgICJwb2x5ZCIsCXsicmRyd2FiIiwJCTB4NzUJfSB9LAoteyAgICAiY3Z0ZGYiLAl7InJkd2YiLAkJMHg3Ngl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDc3IGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiYXNobCIsCXsicmJybHdsIiwJCTB4NzgJfSB9LAoteyAgICAiYXNocSIsCXsicmJycXdxIiwJCTB4NzkJfSB9LAoteyAgICAiZW11bCIsCXsicmxybHJsd3EiLAkJMHg3YQl9IH0sCi17ICAgICJlZGl2IiwJeyJybHJxd2x3bCIsCQkweDdiCX0gfSwKLXsgICAgImNscmQiLAl7IndkIiwJCQkweDdjCX0gfSwKLXsgICAgImNscmciLAl7IndnIiwJCQkweDdjCX0gfSwKLXsgICAgImNscnEiLAl7IndkIiwJCQkweDdjCX0gfSwKLXsgICAgIm1vdnEiLAl7InJxd3EiLAkJMHg3ZAl9IH0sCi17ICAgICJtb3ZhcSIsCXsiYXF3bCIsCQkweDdlCX0gfSwKLXsgICAgIm1vdmFkIiwJeyJhZHdsIiwJCTB4N2UJfSB9LAoteyAgICAicHVzaGFxIiwJeyJhcSIsCQkJMHg3Zgl9IH0sCi17ICAgICJwdXNoYWQiLAl7ImFkIiwJCQkweDdmCX0gfSwKLXsgICAgImFkZGIyIiwJeyJyYm1iIiwJCTB4ODAJfSB9LAoteyAgICAiYWRkYjMiLAl7InJicmJ3YiIsCQkweDgxCX0gfSwKLXsgICAgInN1YmIyIiwJeyJyYm1iIiwJCTB4ODIJfSB9LAoteyAgICAic3ViYjMiLAl7InJicmJ3YiIsCQkweDgzCX0gfSwKLXsgICAgIm11bGIyIiwJeyJyYm1iIiwJCTB4ODQJfSB9LAoteyAgICAibXVsYjMiLAl7InJicmJ3YiIsCQkweDg1CX0gfSwKLXsgICAgImRpdmIyIiwJeyJyYm1iIiwJCTB4ODYJfSB9LAoteyAgICAiZGl2YjMiLAl7InJicmJ3YiIsCQkweDg3CX0gfSwKLXsgICAgImJpc2IyIiwJeyJyYm1iIiwJCTB4ODgJfSB9LAoteyAgICAiYmlzYjMiLAl7InJicmJ3YiIsCQkweDg5CX0gfSwKLXsgICAgImJpY2IyIiwJeyJyYm1iIiwJCTB4OGEJfSB9LAoteyAgICAiYmljYjMiLAl7InJicmJ3YiIsCQkweDhiCX0gfSwKLXsgICAgInhvcmIyIiwJeyJyYm1iIiwJCTB4OGMJfSB9LAoteyAgICAieG9yYjMiLAl7InJicmJ3YiIsCQkweDhkCX0gfSwKLXsgICAgIm1uZWdiIiwJeyJyYndiIiwJCTB4OGUJfSB9LAoteyAgICAiY2FzZWIiLAl7InJicmJyYiIsCQkweDhmCX0gfSwKLXsgICAgIm1vdmIiLAl7InJid2IiLAkJMHg5MAl9IH0sCi17ICAgICJjbXBiIiwJeyJyYnJiIiwJCTB4OTEJfSB9LAoteyAgICAibWNvbWIiLAl7InJid2IiLAkJMHg5Mgl9IH0sCi17ICAgICJiaXRiIiwJeyJyYnJiIiwJCTB4OTMJfSB9LAoteyAgICAiY2xyYiIsCXsid2IiLAkJCTB4OTQJfSB9LAoteyAgICAidHN0YiIsCXsicmIiLAkJCTB4OTUJfSB9LAoteyAgICAiaW5jYiIsCXsibWIiLAkJCTB4OTYJfSB9LAoteyAgICAiZGVjYiIsCXsibWIiLAkJCTB4OTcJfSB9LAoteyAgICAiY3Z0YmwiLAl7InJid2wiLAkJMHg5OAl9IH0sCi17ICAgICJjdnRidyIsCXsicmJ3dyIsCQkweDk5CX0gfSwKLXsgICAgIm1vdnpibCIsCXsicmJ3bCIsCQkweDlhCX0gfSwKLXsgICAgIm1vdnpidyIsCXsicmJ3dyIsCQkweDliCX0gfSwKLXsgICAgInJvdGwiLAl7InJicmx3bCIsCQkweDljCX0gfSwKLXsgICAgImFjYmIiLAl7InJicmJtYmJ3IiwJCTB4OWQJfSB9LAoteyAgICAibW92YWIiLAl7ImFid2wiLAkJMHg5ZQl9IH0sCi17ICAgICJwdXNoYWIiLAl7ImFiIiwJCQkweDlmCX0gfSwKLXsgICAgImFkZHcyIiwJeyJyd213IiwJCTB4YTAJfSB9LAoteyAgICAiYWRkdzMiLAl7InJ3cnd3dyIsCQkweGExCX0gfSwKLXsgICAgInN1YncyIiwJeyJyd213IiwJCTB4YTIJfSB9LAoteyAgICAic3VidzMiLAl7InJ3cnd3dyIsCQkweGEzCX0gfSwKLXsgICAgIm11bHcyIiwJeyJyd213IiwJCTB4YTQJfSB9LAoteyAgICAibXVsdzMiLAl7InJ3cnd3dyIsCQkweGE1CX0gfSwKLXsgICAgImRpdncyIiwJeyJyd213IiwJCTB4YTYJfSB9LAoteyAgICAiZGl2dzMiLAl7InJ3cnd3dyIsCQkweGE3CX0gfSwKLXsgICAgImJpc3cyIiwJeyJyd213IiwJCTB4YTgJfSB9LAoteyAgICAiYmlzdzMiLAl7InJ3cnd3dyIsCQkweGE5CX0gfSwKLXsgICAgImJpY3cyIiwJeyJyd213IiwJCTB4YWEJfSB9LAoteyAgICAiYmljdzMiLAl7InJ3cnd3dyIsCQkweGFiCX0gfSwKLXsgICAgInhvcncyIiwJeyJyd213IiwJCTB4YWMJfSB9LAoteyAgICAieG9ydzMiLAl7InJ3cnd3dyIsCQkweGFkCX0gfSwKLXsgICAgIm1uZWd3IiwJeyJyd3d3IiwJCTB4YWUJfSB9LAoteyAgICAiY2FzZXciLAl7InJ3cndydyIsCQkweGFmCX0gfSwKLXsgICAgIm1vdnciLAl7InJ3d3ciLAkJMHhiMAl9IH0sCi17ICAgICJjbXB3IiwJeyJyd3J3IiwJCTB4YjEJfSB9LAoteyAgICAibWNvbXciLAl7InJ3d3ciLAkJMHhiMgl9IH0sCi17ICAgICJiaXR3IiwJeyJyd3J3IiwJCTB4YjMJfSB9LAoteyAgICAiY2xydyIsCXsid3ciLAkJCTB4YjQJfSB9LAoteyAgICAidHN0dyIsCXsicnciLAkJCTB4YjUJfSB9LAoteyAgICAiaW5jdyIsCXsibXciLAkJCTB4YjYJfSB9LAoteyAgICAiZGVjdyIsCXsibXciLAkJCTB4YjcJfSB9LAoteyAgICAiYmlzcHN3IiwJeyJydyIsCQkJMHhiOAl9IH0sCi17ICAgICJiaWNwc3ciLAl7InJ3IiwJCQkweGI5CX0gfSwKLXsgICAgInBvcHIiLAl7InJ3IiwJCQkweGJhCX0gfSwKLXsgICAgInB1c2hyIiwJeyJydyIsCQkJMHhiYgl9IH0sCi17ICAgICJjaG1rIiwJeyJydyIsCQkJMHhiYwl9IH0sCi17ICAgICJjaG1lIiwJeyJydyIsCQkJMHhiZAl9IH0sCi17ICAgICJjaG1zIiwJeyJydyIsCQkJMHhiZQl9IH0sCi17ICAgICJjaG11IiwJeyJydyIsCQkJMHhiZgl9IH0sCi17ICAgICJhZGRsMiIsCXsicmxtbCIsCQkweGMwCX0gfSwKLXsgICAgImFkZGwzIiwJeyJybHJsd2wiLAkJMHhjMQl9IH0sCi17ICAgICJzdWJsMiIsCXsicmxtbCIsCQkweGMyCX0gfSwKLXsgICAgInN1YmwzIiwJeyJybHJsd2wiLAkJMHhjMwl9IH0sCi17ICAgICJtdWxsMiIsCXsicmxtbCIsCQkweGM0CX0gfSwKLXsgICAgIm11bGwzIiwJeyJybHJsd2wiLAkJMHhjNQl9IH0sCi17ICAgICJkaXZsMiIsCXsicmxtbCIsCQkweGM2CX0gfSwKLXsgICAgImRpdmwzIiwJeyJybHJsd2wiLAkJMHhjNwl9IH0sCi17ICAgICJiaXNsMiIsCXsicmxtbCIsCQkweGM4CX0gfSwKLXsgICAgImJpc2wzIiwJeyJybHJsd2wiLAkJMHhjOQl9IH0sCi17ICAgICJiaWNsMiIsCXsicmxtbCIsCQkweGNhCX0gfSwKLXsgICAgImJpY2wzIiwJeyJybHJsd2wiLAkJMHhjYgl9IH0sCi17ICAgICJ4b3JsMiIsCXsicmxtbCIsCQkweGNjCX0gfSwKLXsgICAgInhvcmwzIiwJeyJybHJsd2wiLAkJMHhjZAl9IH0sCi17ICAgICJtbmVnbCIsCXsicmx3bCIsCQkweGNlCX0gfSwKLXsgICAgImNhc2VsIiwJeyJybHJscmwiLAkJMHhjZgl9IH0sCi17ICAgICJtb3ZsIiwJeyJybHdsIiwJCTB4ZDAJfSB9LAoteyAgICAiY21wbCIsCXsicmxybCIsCQkweGQxCX0gfSwKLXsgICAgIm1jb21sIiwJeyJybHdsIiwJCTB4ZDIJfSB9LAoteyAgICAiYml0bCIsCXsicmxybCIsCQkweGQzCX0gfSwKLXsgICAgImNscmYiLAl7IndmIiwJCQkweGQ0CX0gfSwKLXsgICAgImNscmwiLAl7IndsIiwJCQkweGQ0CX0gfSwKLXsgICAgInRzdGwiLAl7InJsIiwJCQkweGQ1CX0gfSwKLXsgICAgImluY2wiLAl7Im1sIiwJCQkweGQ2CX0gfSwKLXsgICAgImRlY2wiLAl7Im1sIiwJCQkweGQ3CX0gfSwKLXsgICAgImFkd2MiLAl7InJsbWwiLAkJMHhkOAl9IH0sCi17ICAgICJzYndjIiwJeyJybG1sIiwJCTB4ZDkJfSB9LAoteyAgICAibXRwciIsCXsicmxybCIsCQkweGRhCX0gfSwKLXsgICAgIm1mcHIiLAl7InJsd2wiLAkJMHhkYgl9IH0sCi17ICAgICJtb3Zwc2wiLAl7IndsIiwJCQkweGRjCX0gfSwKLXsgICAgInB1c2hsIiwJeyJybCIsCQkJMHhkZAl9IH0sCi17ICAgICJtb3ZhbCIsCXsiYWx3bCIsCQkweGRlCX0gfSwKLXsgICAgIm1vdmFmIiwJeyJhZndsIiwJCTB4ZGUJfSB9LAoteyAgICAicHVzaGFsIiwJeyJhbCIsCQkJMHhkZgl9IH0sCi17ICAgICJwdXNoYWYiLAl7ImFmIiwJCQkweGRmCX0gfSwKLXsgICAgImJicyIsCXsicmx2YmJiIiwJCTB4ZTAJfSB9LAoteyAgICAiYmJjIiwJeyJybHZiYmIiLAkJMHhlMQl9IH0sCi17ICAgICJiYnNzIiwJeyJybHZiYmIiLAkJMHhlMgl9IH0sCi17ICAgICJiYmNzIiwJeyJybHZiYmIiLAkJMHhlMwl9IH0sCi17ICAgICJiYnNjIiwJeyJybHZiYmIiLAkJMHhlNAl9IH0sCi17ICAgICJiYmNjIiwJeyJybHZiYmIiLAkJMHhlNQl9IH0sCi17ICAgICJiYnNzaSIsCXsicmx2YmJiIiwJCTB4ZTYJfSB9LAoteyAgICAiYmJjY2kiLAl7InJsdmJiYiIsCQkweGU3CX0gfSwKLXsgICAgImJsYnMiLAl7InJsYmIiLAkJMHhlOAl9IH0sCi17ICAgICJibGJjIiwJeyJybGJiIiwJCTB4ZTkJfSB9LAoteyAgICAiZmZzIiwJeyJybHJidmJ3bCIsCQkweGVhCX0gfSwKLXsgICAgImZmYyIsCXsicmxyYnZid2wiLAkJMHhlYgl9IH0sCi17ICAgICJjbXB2IiwJeyJybHJidmJybCIsCQkweGVjCX0gfSwKLXsgICAgImNtcHp2IiwJeyJybHJidmJybCIsCQkweGVkCX0gfSwKLXsgICAgImV4dHYiLAl7InJscmJ2YndsIiwJCTB4ZWUJfSB9LAoteyAgICAiZXh0enYiLAl7InJscmJ2YndsIiwJCTB4ZWYJfSB9LAoteyAgICAiaW5zdiIsCXsicmxybHJidmIiLAkJMHhmMAl9IH0sCi17ICAgICJhY2JsIiwJeyJybHJsbWxidyIsCQkweGYxCX0gfSwKLXsgICAgImFvYmxzcyIsCXsicmxtbGJiIiwJCTB4ZjIJfSB9LAoteyAgICAiYW9ibGVxIiwJeyJybG1sYmIiLAkJMHhmMwl9IH0sCi17ICAgICJzb2JnZXEiLAl7Im1sYmIiLAkJMHhmNAl9IH0sCi17ICAgICJzb2JndHIiLAl7Im1sYmIiLAkJMHhmNQl9IH0sCi17ICAgICJjdnRsYiIsCXsicmx3YiIsCQkweGY2CX0gfSwKLXsgICAgImN2dGx3IiwJeyJybHd3IiwJCTB4ZjcJfSB9LAoteyAgICAiYXNocCIsCXsicmJyd2FicmJyd2FiIiwJMHhmOAl9IH0sCi17ICAgICJjdnRscCIsCXsicmxyd2FiIiwJCTB4ZjkJfSB9LAoteyAgICAiY2FsbGciLAl7ImFiYWIiLAkJMHhmYQl9IH0sCi17ICAgICJjYWxscyIsCXsicmxhYiIsCQkweGZiCX0gfSwKLXsgICAgInhmYyIsCXsiIiwJCQkweGZjCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRkaCIsCXsicmR3aCIsCQkweDMyZmQJfSB9LAoteyAgICAiY3Z0Z2YiLAl7InJnd2giLAkJMHgzM2ZkCX0gfSwKLXsgICAgImFkZGcyIiwJeyJyZ21nIiwJCTB4NDBmZAl9IH0sCi17ICAgICJhZGRnMyIsCXsicmdyZ3dnIiwJCTB4NDFmZAl9IH0sCi17ICAgICJzdWJnMiIsCXsicmdtZyIsCQkweDQyZmQJfSB9LAoteyAgICAic3ViZzMiLAl7InJncmd3ZyIsCQkweDQzZmQJfSB9LAoteyAgICAibXVsZzIiLAl7InJnbWciLAkJMHg0NGZkCX0gfSwKLXsgICAgIm11bGczIiwJeyJyZ3Jnd2ciLAkJMHg0NWZkCX0gfSwKLXsgICAgImRpdmcyIiwJeyJyZ21nIiwJCTB4NDZmZAl9IH0sCi17ICAgICJkaXZnMyIsCXsicmdyZ3dnIiwJCTB4NDdmZAl9IH0sCi17ICAgICJjdnRnYiIsCXsicmd3YiIsCQkweDQ4ZmQJfSB9LAoteyAgICAiY3Z0Z3ciLAl7InJnd3ciLAkJMHg0OWZkCX0gfSwKLXsgICAgImN2dGdsIiwJeyJyZ3dsIiwJCTB4NGFmZAl9IH0sCi17ICAgICJjdnRyZ2wiLAl7InJnd2wiLAkJMHg0YmZkCX0gfSwKLXsgICAgImN2dGJnIiwJeyJyYndnIiwJCTB4NGNmZAl9IH0sCi17ICAgICJjdnR3ZyIsCXsicnd3ZyIsCQkweDRkZmQJfSB9LAoteyAgICAiY3Z0bGciLAl7InJsd2ciLAkJMHg0ZWZkCX0gfSwKLXsgICAgImFjYmciLAl7InJncmdtZ2J3IiwJCTB4NGZmZAl9IH0sCi17ICAgICJtb3ZnIiwJeyJyZ3dnIiwJCTB4NTBmZAl9IH0sCi17ICAgICJjbXBnIiwJeyJyZ3JnIiwJCTB4NTFmZAl9IH0sCi17ICAgICJtbmVnZyIsCXsicmd3ZyIsCQkweDUyZmQJfSB9LAoteyAgICAidHN0ZyIsCXsicmciLAkJCTB4NTNmZAl9IH0sCi17ICAgICJlbW9kZyIsCXsicmdyd3Jnd2x3ZyIsCQkweDU0ZmQJfSB9LAoteyAgICAicG9seWciLAl7InJncndhYiIsCQkweDU1ZmQJfSB9LAoteyAgICAiY3Z0Z2giLAl7InJnd2giLAkJMHg1NmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJhZGRoMiIsCXsicmhtaCIsCQkweDYwZmQJfSB9LAoteyAgICAiYWRkaDMiLAl7InJocmh3aCIsCQkweDYxZmQJfSB9LAoteyAgICAic3ViaDIiLAl7InJobWgiLAkJMHg2MmZkCX0gfSwKLXsgICAgInN1YmgzIiwJeyJyaHJod2giLAkJMHg2M2ZkCX0gfSwKLXsgICAgIm11bGgyIiwJeyJyaG1oIiwJCTB4NjRmZAl9IH0sCi17ICAgICJtdWxoMyIsCXsicmhyaHdoIiwJCTB4NjVmZAl9IH0sCi17ICAgICJkaXZoMiIsCXsicmhtaCIsCQkweDY2ZmQJfSB9LAoteyAgICAiZGl2aDMiLAl7InJocmh3aCIsCQkweDY3ZmQJfSB9LAoteyAgICAiY3Z0aGIiLAl7InJod2IiLAkJMHg2OGZkCX0gfSwKLXsgICAgImN2dGh3IiwJeyJyaHd3IiwJCTB4NjlmZAl9IH0sCi17ICAgICJjdnRobCIsCXsicmh3bCIsCQkweDZhZmQJfSB9LAoteyAgICAiY3Z0cmhsIiwJeyJyaHdsIiwJCTB4NmJmZAl9IH0sCi17ICAgICJjdnRiaCIsCXsicmJ3aCIsCQkweDZjZmQJfSB9LAoteyAgICAiY3Z0d2giLAl7InJ3d2giLAkJMHg2ZGZkCX0gfSwKLXsgICAgImN2dGxoIiwJeyJybHdoIiwJCTB4NmVmZAl9IH0sCi17ICAgICJhY2JoIiwJeyJyaHJobWhidyIsCQkweDZmZmQJfSB9LAoteyAgICAibW92aCIsCXsicmh3aCIsCQkweDcwZmQJfSB9LAoteyAgICAiY21waCIsCXsicmhyaCIsCQkweDcxZmQJfSB9LAoteyAgICAibW5lZ2giLAl7InJod2giLAkJMHg3MmZkCX0gfSwKLXsgICAgInRzdGgiLAl7InJoIiwJCQkweDczZmQJfSB9LAoteyAgICAiZW1vZGgiLAl7InJocndyaHdsd2giLAkJMHg3NGZkCX0gfSwKLXsgICAgInBvbHloIiwJeyJyaHJ3YWIiLAkJMHg3NWZkCX0gfSwKLXsgICAgImN2dGhnIiwJeyJyaHdnIiwJCTB4NzZmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY2xyaCIsCXsid2giLAkJCTB4N2NmZAl9IH0sCi17ICAgICJjbHJvIiwJeyJ3byIsCQkJMHg3Y2ZkCX0gfSwKLXsgICAgIm1vdm8iLAl7InJvd28iLAkJMHg3ZGZkCX0gfSwKLXsgICAgIm1vdmFoIiwJeyJhaHdsIiwJCTB4N2VmZAl9IH0sCi17ICAgICJtb3ZhbyIsCXsiYW93bCIsCQkweDdlZmQJfSB9LAoteyAgICAicHVzaGFoIiwJeyJhaCIsCQkJMHg3ZmZkCX0gfSwKLXsgICAgInB1c2hhbyIsCXsiYW8iLAkJCTB4N2ZmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY3Z0ZmgiLAl7InJmd2giLAkJMHg5OGZkCX0gfSwKLXsgICAgImN2dGZnIiwJeyJyZndnIiwJCTB4OTlmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY3Z0aGYiLAl7InJod2YiLAkJMHhmNmZkCX0gfSwKLXsgICAgImN2dGhkIiwJeyJyaHdkIiwJCTB4ZjdmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiYnVnbCIsCXsicmwiLAkJCTB4ZmRmZgl9IH0sCi17ICAgICJidWd3IiwJeyJydyIsCQkJMHhmZWZmCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi0KLXsgICAgICAiIiwJeyIiLCAwfSB9CQkvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KLQotfTsJCQkJLyogdm90c3RycyAqLwotCi0vKiBlbmQ6IHZheC5vcGNvZGUuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vczlrLmggYi9pbmNsdWRlL29zOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyZWVkMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29zOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0jaWYgIWRlZmluZWQoX01PRFVMRV9IKQotI2RlZmluZSBfTU9EVUxFX0gKLQotLyogT1MtOTAwMCBpMzg2IG1vZHVsZSBoZWFkZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgX01QRjM4NgotCi0vKiBzaXplb2YgY29tbW9uIGhlYWRlciBsZXNzIHBhcml0eSBmaWVsZCAqLwotI2RlZmluZSBOX01fUEFSSVRZICAoc2l6ZW9mKG1oX2NvbSktc2l6ZW9mKHVuaXNnbmVkIHNob3J0KSkKLSNkZWZpbmUgT0xEX01fUEFSSVRZIDQ2Ci0jZGVmaW5lIE1fUEFSSVRZIE5fTV9QQVJJVFkKLQotI2lmZGVmIF9NUEY2OEsKLSNkZWZpbmUgTU9EU1lOQyAweDRhZmQgICAgICAvKiBtb2R1bGUgaGVhZGVyIHN5bmMgY29kZSBmb3IgNjgweDAgcHJvY2Vzc29ycyAqLwotI2VuZGlmCi0KLSNpZmRlZiBfTVBGMzg2Ci0jZGVmaW5lIE1PRFNZTkMgMHg0YWZjICAgICAgLyogbW9kdWxlIGhlYWRlciBzeW5jIGNvZGUgZm9yIDgwMzg2IHByb2Nlc3NvcnMgKi8KLSNlbmRpZgotCi0jZGVmaW5lIE1PRFJFVgkxCQkJLyogbW9kdWxlIGZvcm1hdCByZXZpc2lvbiAxICovCi0jZGVmaW5lIENSQ0NPTgkweDgwMGZlMwkvKiBjcmMgcG9seW5vbWlhbCBjb25zdGFudCAqLwotCi0vKiBNb2R1bGUgYWNjZXNzIHBlcm1pc3Npb24gdmFsdWVzICovCi0jZGVmaW5lIE1QX09XTkVSX1JFQUQJMHgwMDAxCi0jZGVmaW5lIE1QX09XTkVSX1dSSVRFCTB4MDAwMgotI2RlZmluZSBNUF9PV05FUl9FWEVDCTB4MDAwNAotI2RlZmluZSBNUF9HUk9VUF9SRUFECTB4MDAxMAotI2RlZmluZSBNUF9HUk9VUF9XUklURQkweDAwMjAKLSNkZWZpbmUgTVBfR1JPVVBfRVhFQwkweDAwNDAKLSNkZWZpbmUgTVBfV09STERfUkVBRAkweDAxMDAKLSNkZWZpbmUgTVBfV09STERfV1JJVEUJMHgwMjAwCi0jZGVmaW5lIE1QX1dPUkxEX0VYRUMJMHgwNDAwCi0jZGVmaW5lIE1QX1dPUkxEX0FDQ0VTUwkweDA3NzcKLSNkZWZpbmUgTVBfT1dORVJfTUFTSwkweDAwMGYKLSNkZWZpbmUgTVBfR1JPVVBfTUFTSwkweDAwZjAKLSNkZWZpbmUgTVBfV09STERfTUFTSwkweDBmMDAKLSNkZWZpbmUgTVBfU1lTVE1fTUFTSwkweGYwMDAKLQotLyogTW9kdWxlIFR5cGUvTGFuZ3VhZ2UgdmFsdWVzICovCi0jZGVmaW5lIE1UX0FOWQkJMAotI2RlZmluZSBNVF9QUk9HUkFNCTB4MDAwMQotI2RlZmluZSBNVF9TVUJST1VUCTB4MDAwMgotI2RlZmluZSBNVF9NVUxUSQkweDAwMDMKLSNkZWZpbmUgTVRfREFUQQkJMHgwMDA0Ci0jZGVmaW5lIE1UX1RSQVBMSUIJMHgwMDBiCi0jZGVmaW5lIE1UX1NZU1RFTQkweDAwMGMKLSNkZWZpbmUgTVRfRklMRU1BTgkweDAwMGQKLSNkZWZpbmUgTVRfREVWRFJWUgkweDAwMGUgCi0jZGVmaW5lIE1UX0RFVkRFU0MJMHgwMDBmCi0jZGVmaW5lIE1UX01BU0sJCTB4ZmYwMAotCi0jZGVmaW5lIE1MX0FOWQkJMAotI2RlZmluZSBNTF9PQkpFQ1QJMQotI2RlZmluZSBNTF9JQ09ERQkyCi0jZGVmaW5lIE1MX1BDT0RFCTMKLSNkZWZpbmUgTUxfQ0NPREUJNAotI2RlZmluZSBNTF9DQkxDT0RFCTUKLSNkZWZpbmUgTUxfRlJUTkNPREUJNgotI2RlZmluZSBNTF9NQVNLCQkweDAwZmYKLQotI2RlZmluZSBta3R5cGVsYW5nKHR5cGUsbGFuZykJKCgodHlwZSk8PDgpfChsYW5nKSkKLQotLyogTW9kdWxlIEF0dHJpYnV0ZSB2YWx1ZXMgKi8KLSNkZWZpbmUgTUFfUkVFTlQJMHg4MAotI2RlZmluZSBNQV9HSE9TVAkweDQwCi0jZGVmaW5lIE1BX1NVUEVSCTB4MjAKLSNkZWZpbmUgTUFfTUFTSwkJMHhmZjAwCi0jZGVmaW5lIE1SX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIG1rYXR0cmV2cyhhdHRyLCByZXZzKQkoKChhdHRyKTw8OCl8KHJldnMpKQotCi0jZGVmaW5lIG1fdXNlciBtX293bmVyLmdycF91c3IudXNyCi0jZGVmaW5lIG1fZ3JvdXAgbV9vd25lci5ncnBfdXNyLmdycAotI2RlZmluZSBtX2dyb3VwX3VzZXIgbV9vd25lci5ncm91cF91c2VyCi0KLS8qIG1hY3JvIGRlZmluaXRpb25zIGZvciBhY2Nlc3NpbmcgbW9kdWxlIGhlYWRlciBmaWVsZHMgKi8KLSNkZWZpbmUgTU9ETkFNRShtb2QpICgodV9jaGFyKikoKHVfY2hhciopbW9kICsgKChNaF9jb20pbW9kKS0+bV9uYW1lKSkKLSNpZiAwCi0vKiBBcHBlYXJzIG5vdCB0byBiZSB1c2VkLCBhbmQgdGhlIHVfaW50MzIgdHlwZWRlZiBpcyBnb25lIChiZWNhdXNlIGl0Ci0gICBjb25mbGljdGVkIHdpdGggYSBNYWNoIGhlYWRlci4gICovCi0jZGVmaW5lIE1PRFNJWkUobW9kKSAoKHVfaW50MzIpKChNaF9jb20pbW9kKS0+bV9zaXplKQotI2VuZGlmIC8qIDAgKi8KLSNkZWZpbmUgTUhDT01fQllURVNfU0laRSA4MAotI2RlZmluZSBOX0JBRE1BRyhhKSAoKChhKS5hX2luZm8pICE9IE1PRFNZTkMpCi0KLXR5cGVkZWYgc3RydWN0IG1oX2NvbSB7Ci0gIC8qIHN5bmMgYnl0ZXMgKCQ0YWZjKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbV9zeW5jWzJdOwotICB1bnNpZ25lZCBjaGFyIG1fc3lzcmV2WzJdOwkJLyogc3lzdGVtIHJldmlzaW9uIGNoZWNrIHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX3NpemVbNF07CQkJLyogbW9kdWxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fb3duZXJbNF07CQkvKiBncm91cC91c2VyIGlkICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX25hbWVbNF07CQkJLyogb2Zmc2V0IHRvIG1vZHVsZSBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX2FjY2Vzc1syXSwJCS8qIGFjY2VzcyBwZXJtaXNzaW9ucyAqLwotICAgIG1fdHlsYW5bMl0sCQkvKiB0eXBlL2xhbmcgKi8KLSAgICBtX2F0dHJldlsyXSwJCS8qIHJldi9hdHRyICovCi0gICAgbV9lZGl0WzJdOwkJCS8qIGVkaXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fbmVlZHNbNF0sCQkvKiBtb2R1bGUgaGFyZHdhcmUgcmVxdWlyZW1lbnRzIGZsYWdzLiAocmVzZXJ2ZWQpICovCi0gICAgbV91c2FnZVs0XSwJCS8qIGNvbW1lbnQgc3RyaW5nIG9mZnNldCAqLwotICAgIG1fc3ltYm9sWzRdLAkJLyogc3ltYm9sIHRhYmxlIG9mZnNldCAqLwotICAgIG1fZXhlY1s0XSwJCQkvKiBvZmZzZXQgdG8gZXhlY3V0aW9uIGVudHJ5IHBvaW50ICovCi0gICAgbV9leGNwdFs0XSwJCS8qIG9mZnNldCB0byBleGNlcHRpb24gZW50cnkgcG9pbnQgKi8KLSAgICBtX2RhdGFbNF0sCQkJLyogZGF0YSBzdG9yYWdlIHJlcXVpcmVtZW50ICovCi0gICAgbV9zdGFja1s0XSwJCS8qIHN0YWNrIHNpemUgKi8KLSAgICBtX2lkYXRhWzRdLAkJLyogb2Zmc2V0IHRvIGluaXRpYWxpemVkIGRhdGEgKi8KLSAgICBtX2lkcmVmWzRdLAkJLyogb2Zmc2V0IHRvIGRhdGEgcmVmZXJlbmNlIGxpc3RzICovCi0gICAgbV9pbml0WzRdLAkJCS8qIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgb2Zmc2V0ICovCi0gICAgbV90ZXJtWzRdOwkJCS8qIHRlcm1pbmF0aW9uIHJvdXRpbmUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX2lkZW50WzJdOwkJLyogaWRlbnQgY29kZSBmb3IgaWRlbnQgcHJvZ3JhbSAqLwotICBjaGFyCi0gICAgbV9zcGFyZVs4XTsJLyogcmVzZXJ2ZWQgYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fcGFyaXR5WzJdOyAJCS8qIGhlYWRlciBwYXJpdHkgKi8KLX0gbWhfY29tLCpNaF9jb207Ci0KLS8qIEV4ZWN1dGFibGUgbWVtb3J5IG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2V4ZWMsbWhfZXhlYzsKLQotLyogRGF0YSBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZGF0YSxtaF9kYXRhOwotCi0vKiBGaWxlIG1hbmFnZXIgbWVtb3J5IG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2ZtYW4sbWhfZm1hbjsKLQotLyogZGV2aWNlIGRyaXZlciBtb2R1bGUgKi8KLXR5cGVkZWYgbWhfY29tICpNaF9kcnZyLG1oX2RydnI7Ci0KLS8qIHRyYXAgaGFuZGxlciBtb2R1bGUgKi8KLXR5cGVkZWYJbWhfY29tIG1oX3RyYXAsICpNaF90cmFwOwotCi0vKiBEZXZpY2UgZGVzY3JpcHRvciBtb2R1bGUgKi8KLXR5cGVkZWYJbWhfY29tICpNaF9kZXYsbWhfZGV2OwotCi0vKiBDb25maWd1cmF0aW9uIG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2NvbmZpZywgbWhfY29uZmlnOwotCi0jaWYgMCAKLQotI2lmICFkZWZpbmVkKF9NT0RESVJfSCkKLS8qIGdvIGdldCBfb3NfZm1vZCAoYW5kIG90aGVycykgKi8KLSNpbmNsdWRlIDxtb2RkaXIuaD4KLSNlbmRpZgotCi1lcnJvcl9jb2RlIF9vc19jcmModm9pZCAqLCB1X2ludDMyLCBpbnQgKik7Ci1lcnJvcl9jb2RlIF9vc19kYXRtb2QoY2hhciAqLCB1X2ludDMyLCB1X2ludDE2ICosIHVfaW50MTYgKiwgdV9pbnQzMiwgdm9pZCAqKiwgbWhfZGF0YSAqKik7Ci1lcnJvcl9jb2RlIF9vc19nZXRfbW9kZGlyKHZvaWQgKiwgdV9pbnQzMiAqKTsKLWVycm9yX2NvZGUgX29zX2luaXRkYXRhKG1oX2NvbSAqLCB2b2lkICopOwotZXJyb3JfY29kZSBfb3NfbGluayhjaGFyICoqLCBtaF9jb20gKiosIHZvaWQgKiosIHVfaW50MTYgKiwgdV9pbnQxNiAqKTsKLWVycm9yX2NvZGUgX29zX2xpbmttKG1oX2NvbSAqLCB2b2lkICoqLCB1X2ludDE2ICosIHVfaW50MTYgKik7Ci1lcnJvcl9jb2RlIF9vc19sb2FkKGNoYXIgKiwgbWhfY29tICoqLCB2b2lkICoqLCB1X2ludDMyLCB1X2ludDE2ICosIHVfaW50MTYgKiwgdV9pbnQzMik7Ci1lcnJvcl9jb2RlIF9vc19ta21vZHVsZShjaGFyICosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyLCB2b2lkICoqLCBtaF9jb20gKiosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfbW9kYWRkcih2b2lkICosIG1oX2NvbSAqKik7Ci1lcnJvcl9jb2RlIF9vc19zZXRjcmMobWhfY29tICopOwotZXJyb3JfY29kZSBfb3Nfc2xpbmsodV9pbnQzMiwgY2hhciAqLCB2b2lkICoqLCB2b2lkICoqLCBtaF9jb20gKiopOwotZXJyb3JfY29kZSBfb3Nfc2xpbmttKHVfaW50MzIsIG1oX2NvbSAqLCB2b2lkICoqLCB2b2lkICoqKTsKLWVycm9yX2NvZGUgX29zX3VubGluayhtaF9jb20gKik7Ci1lcnJvcl9jb2RlIF9vc191bmxvYWQoY2hhciAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX3RsaW5rKHVfaW50MzIsIGNoYXIgKiwgdm9pZCAqKiwgbWhfdHJhcCAqKiwgdm9pZCAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX3RsaW5rbSh1X2ludDMyLCBtaF9jb20gKiwgdm9pZCAqKiwgdm9pZCAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX2lvZGVsKG1oX2NvbSAqKTsKLWVycm9yX2NvZGUgX29zX3Ztb2R1bChtaF9jb20gKiwgbWhfY29tICosIHVfaW50MzIpOwotI2VuZGlmIC8qIDAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Byb2dyZXNzLmggYi9pbmNsdWRlL3Byb2dyZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODMxOGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcm9ncmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogRGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgcHJvZ3Jlc3MgbWFjcm9zLgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgZGVmYXVsdCBkZWZpbml0aW9ucyBiZWxvdyBhcmUgaW50ZW5kZWQgdG8gYmUgcmVwbGFjZWQgYnkgcmVhbAotICAgZGVmaW5pdGlvbnMsIGlmIGJ1aWxkaW5nIHRoZSB0b29scyBmb3IgYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbW1pbmcKLSAgIGVudmlyb25tZW50LiAgKi8KLQotI2lmbmRlZiBfUFJPR1JFU1NfSAotI2RlZmluZSBfUFJPR1JFU1NfSAotCi0jaWZuZGVmIFNUQVJUX1BST0dSRVNTCi0jZGVmaW5lIFNUQVJUX1BST0dSRVNTKFNUUixOKQotI2VuZGlmCi0KLSNpZm5kZWYgUFJPR1JFU1MKLSNkZWZpbmUgUFJPR1JFU1MoWCkKLSNlbmRpZgotCi0jaWZuZGVmIEVORF9QUk9HUkVTUwotI2RlZmluZSBFTkRfUFJPR1JFU1MoU1RSKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfUFJPR1JFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZWdzL0NoYW5nZUxvZyBiL2luY2x1ZGUvcmVncy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yZWdzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlbW90ZS1zaW0uaCBiL2luY2x1ZGUvcmVtb3RlLXNpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQ4MGI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmVtb3RlLXNpbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgc2ltdWxhdG9yIGFuZCBnZGIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChSRU1PVEVfU0lNX0gpCi0jZGVmaW5lIFJFTU9URV9TSU1fSCAxCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGlzIHVzZWQgd2hlbiBidWlsZGluZyBzdGFuZC1hbG9uZSBzaW11bGF0b3JzLCBzbyBpc29sYXRlIHRoaXMKLSAgIGZpbGUgZnJvbSBnZGIuICAqLwotCi0vKiBQaWNrIHVwIENPUkVfQUREUl9UWVBFIGlmIGRlZmluZWQgKGZyb20gZ2RiKSwgb3RoZXJ3aXNlIHVzZSBzYW1lIHZhbHVlIGFzCi0gICBnZGIgZG9lcyAodW5zaWduZWQgaW50IC0gZnJvbSBkZWZzLmgpLiAgKi8KLQotI2lmbmRlZiBDT1JFX0FERFJfVFlQRQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgU0lNX0FERFI7Ci0jZWxzZQotdHlwZWRlZiBDT1JFX0FERFJfVFlQRSBTSU1fQUREUjsKLSNlbmRpZgotCi0KLS8qIFNlbWktb3BhcXVlIHR5cGUgdXNlZCBhcyByZXN1bHQgb2Ygc2ltX29wZW4gYW5kIHBhc3NlZCBiYWNrIHRvIGFsbAotICAgb3RoZXIgcm91dGluZXMuICAiZGVzYyIgaXMgc2hvcnQgZm9yICJkZXNjcmlwdG9yIi4KLSAgIEl0IGlzIHVwIHRvIGVhY2ggc2ltdWxhdG9yIHRvIGRlZmluZSBgc2ltX3N0YXRlJy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNpbV9zdGF0ZSAqU0lNX0RFU0M7Ci0KLQotLyogVmFsdWVzIGZvciBga2luZCcgYXJnIHRvIHNpbV9vcGVuLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgU0lNX09QRU5fU1RBTkRBTE9ORSwgLyogc2ltdWxhdG9yIHVzZWQgc3RhbmRhbG9uZSAocnVuLmMpICovCi0gIFNJTV9PUEVOX0RFQlVHICAgICAgIC8qIHNpbXVsYXRvciB1c2VkIGJ5IGRlYnVnZ2VyIChnZGIpICovCi19IFNJTV9PUEVOX0tJTkQ7Ci0KLQotLyogUmV0dXJuIGNvZGVzIGZyb20gdmFyaW91cyBmdW5jdGlvbnMuICAqLwotCi10eXBlZGVmIGVudW0gewotICBTSU1fUkNfRkFJTCA9IDAsCi0gIFNJTV9SQ19PSyA9IDEsCi0gIFNJTV9SQ19VTktOT1dOX0JSRUFLUE9JTlQgPSAyLAotICBTSU1fUkNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyA9IDMsCi0gIFNJTV9SQ19EVVBMSUNBVEVfQlJFQUtQT0lOVCA9IDQKLX0gU0lNX1JDOwotCi0KLS8qIFRoZSBiZmQgc3RydWN0LCBhcyBhbiBvcGFxdWUgdHlwZS4gICovCi0KLXN0cnVjdCBfYmZkOwotCi0KLS8qIE1haW4gc2ltdWxhdG9yIGVudHJ5IHBvaW50cy4gICovCi0KLQotLyogQ3JlYXRlIGEgZnVsbHkgaW5pdGlhbGl6ZWQgc2ltdWxhdG9yIGluc3RhbmNlLgotCi0gICAoVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc2ltdWxhdG9yIGlzIHNlbGVjdGVkIGZyb20gdGhlCi0gICBnZGIgY29tbWFuZCBsaW5lLikKLQotICAgS0lORCBzcGVjaWZpZXMgaG93IHRoZSBzaW11bGF0b3Igc2hhbGwgYmUgdXNlZC4gIEN1cnJlbnRseSB0aGVyZQotICAgYXJlIG9ubHkgdHdvIGtpbmRzOiBzdGFuZC1hbG9uZSBhbmQgZGVidWcuCi0KLSAgIENBTExCQUNLIHNwZWNpZmllcyBhIHN0YW5kYXJkIGhvc3QgY2FsbGJhY2sgKGRlZmluZWQgaW4gY2FsbGJhY2suaCkuCi0KLSAgIEFCRkQsIHdoZW4gbm9uIE5VTEwsIGRlc2lnbmF0ZXMgYSB0YXJnZXQgcHJvZ3JhbS4gIFRoZSBwcm9ncmFtIGlzCi0gICBub3QgbG9hZGVkLgotCi0gICBBUkdWIGlzIGEgc3RhbmRhcmQgQVJHViBwb2ludGVyIHN1Y2ggYXMgdGhhdCBwYXNzZWQgZnJvbSB0aGUKLSAgIGNvbW1hbmQgbGluZS4gIFRoZSBzeW50YXggb2YgdGhlIGFyZ3VtZW50IGxpc3QgaXMgaXMgYXNzdW1lZCB0byBiZQotICAgYGBTSU0tUFJPRyB7IFNJTS1PUFRJT04gfSBbIFRBUkdFVC1QUk9HUkFNIHsgVEFSR0VULU9QVElPTiB9IF0nJy4KLSAgIFRoZSB0cmFpbGluZyBUQVJHRVQtUFJPR1JBTSBhbmQgYXJncyBhcmUgb25seSB2YWxpZCBmb3IgYQotICAgc3RhbmQtYWxvbmUgc2ltdWxhdG9yLgotCi0gICBPbiBzdWNjZXNzLCB0aGUgcmVzdWx0IGlzIGEgbm9uIE5VTEwgZGVzY3JpcHRvciB0aGF0IHNoYWxsIGJlCi0gICBwYXNzZWQgdG8gdGhlIG90aGVyIHNpbV9mb28gZnVuY3Rpb25zLiAgV2hpbGUgdGhlIHNpbXVsYXRvcgotICAgY29uZmlndXJhdGlvbiBjYW4gYmUgcGFyYW1ldGVyaXplZCBieSAoaW4gZGVjcmVhc2luZyBwcmVjZWRlbmNlKQotICAgQVJHVidzIFNJTS1PUFRJT04sIEFSR1YncyBUQVJHRVQtUFJPR1JBTSBhbmQgdGhlIEFCRkQgYXJndW1lbnQsIHRoZQotICAgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZiB0aGUgc2ltdWxhdG9yIHNoYWxsIG5vdCBkZXBlbmRlbnQgb24gdGhlCi0gICBwcmVzZW5jZSBvZiBhbnkgb2YgdGhlc2UgYXJndW1lbnRzL29wdGlvbnMuCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogVGhlIGNyZWF0ZWQgc2ltdWxhdG9yIHNoYWxsIGJlIHN1ZmZpY2llbnRseQotICAgaW5pdGlhbGl6ZWQgdG8gaGFuZGxlLCB3aXRoIG91dCByZXN0cmljdGlvbnMgYW55IGNsaWVudCByZXF1ZXN0cwotICAgKGluY2x1ZGluZyBtZW1vcnkgcmVhZHMvd3JpdGVzLCByZWdpc3RlciBmZXRjaC9zdG9yZXMgYW5kIGEKLSAgIHJlc3VtZSkuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiB0aGF0IHByb2Nlc3MgaXMgbm90IGNyZWF0ZWQgdW50aWwgYSBjYWxsIHRvCi0gICBzaW1fY3JlYXRlX2luZmVyaW9yLiAgRklYTUU6IFdoYXQgc2hvdWxkIHRoZSBzdGF0ZSBvZiB0aGUgc2ltdWxhdG9yCi0gICBiZT8gKi8KLQotU0lNX0RFU0Mgc2ltX29wZW4gUEFSQU1TICgoU0lNX09QRU5fS0lORCBraW5kLCBzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKmNhbGxiYWNrLCBzdHJ1Y3QgX2JmZCAqYWJmZCwgY2hhciAqKmFyZ3YpKTsKLQotCi0vKiBEZXN0b3J5IGEgc2ltdWxhdG9yIGluc3RhbmNlLgotCi0gICBRVUlUVElORyBpcyBub24temVybyBpZiB3ZSBjYW5ub3QgaGFuZyBvbiBlcnJvcnMuCi0KLSAgIFRoaXMgbWF5IGludm9sdmUgZnJlZWluZyB0YXJnZXQgbWVtb3J5IGFuZCBjbG9zaW5nIGFueSBvcGVuIGZpbGVzCi0gICBhbmQgbW1hcCdkIGFyZWFzLiAgWW91IGNhbm5vdCBhc3N1bWUgc2ltX2tpbGwgaGFzIGFscmVhZHkgYmVlbgotICAgY2FsbGVkLiAqLwotCi12b2lkIHNpbV9jbG9zZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHF1aXR0aW5nKSk7Ci0KLQotLyogTG9hZCBwcm9ncmFtIFBST0cgaW50byB0aGUgc2ltdWxhdG9ycyBtZW1vcnkuCi0KLSAgIElmIEFCRkQgaXMgbm9uLU5VTEwsIHRoZSBiZmQgZm9yIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkLgotICAgVGhlIHJlc3VsdCBpcyBhIHJldHVybiBjb2RlIGluZGljYXRpbmcgc3VjY2Vzcy4KLQotICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBOb3JtYWxseSwgZWFjaCBwcm9ncmFtIHNlY3Rpb24gaXMgd3JpdHRlbiBpbnRvCi0gICBtZW1vcnkgYWNjb3JkaW5nIHRvIHRoYXQgc2VjdGlvbnMgTE1BIHVzaW5nIHBoeXNpY2FsIChkaXJlY3QpCi0gICBhZGRyZXNzaW5nLiAgVGhlIGV4Y2VwdGlvbiBiZWluZyBzeXN0ZW1zLCBzdWNoIGFzIFBQQy9DSFJQLCB3aGljaAotICAgc3VwcG9ydCBtb3JlIGNvbXBsaWNhdGVkIHByb2dyYW0gbG9hZGVycy4gIEEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uCi0gICBzaG91bGQgbm90IGVmZmVjdCB0aGUgc3RhdGUgb2YgdGhlIHByb2Nlc3NvciByZWdpc3RlcnMuICBNdWx0aXBsZQotICAgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBhcmUgcGVybWl0dGVkIGFuZCBoYXZlIGFuIGFjY3VtdWxhdGl2ZQotICAgZWZmZWN0LgotCi0gICBQcm9jZXNzIHNpbXVsYXRvcjogQ2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBtYXkgYmUgaWdub3JlZC4KLQotICAgRklYTUU6IE1vc3QgaGFyZHdhcmUgc2ltdWxhdG9ycyBsb2FkIHRoZSBpbWFnZSBhdCB0aGUgVk1BIHVzaW5nCi0gICB2aXJ0dWFsIGFkZHJlc3NpbmcuCi0KLSAgIEZJWE1FOiBGb3Igc29tZSBoYXJkd2FyZSB0YXJnZXRzLCBiZWZvcmUgYSBsb2FkZWQgcHJvZ3JhbSBjYW4gYmUKLSAgIGV4ZWN1dGVkLCBpdCByZXF1aXJlcyB0aGUgbWFuaXB1bGF0aW9uIG9mIFZNIHJlZ2lzdGVycyBhbmQgdGFibGVzLgotICAgU3VjaCBtYW5pcHVsYXRpb24gc2hvdWxkIHByb2JhYmx5ICg/KSBvY2N1cmUgaW4KLSAgIHNpbV9jcmVhdGVfaW5mZXJpb3IuICovCi0KLVNJTV9SQyBzaW1fbG9hZCBQQVJBTVMgKChTSU1fREVTQyBzZCwgY2hhciAqcHJvZywgc3RydWN0IF9iZmQgKmFiZmQsIGludCBmcm9tX3R0eSkpOwotCi0KLS8qIFByZXBhcmUgdG8gcnVuIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4KLQotICAgQUJGRCwgaWYgbm90IE5VTEwsIHByb3ZpZGVzIGluaXRpYWwgcHJvY2Vzc29yIHN0YXRlIGluZm9ybWF0aW9uLgotICAgQVJHViBhbmQgRU5WLCBpZiBub24gTlVMTCwgYXJlIE5VTEwgdGVybWluYXRlZCBsaXN0cyBvZiBwb2ludGVycy4KLQotICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBUaGlzIGZ1bmN0aW9uIHNoYWxsIGluaXRpYWxpemUgdGhlIHByb2Nlc3NvcgotICAgcmVnaXN0ZXJzIHRvIGEga25vd24gdmFsdWUuICBUaGUgcHJvZ3JhbSBjb3VudGVyIGFuZCBwb3NzaWJseSBzdGFjawotICAgcG9pbnRlciBzaGFsbCBiZSBzZXQgdXNpbmcgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSBBQkZEIChvcgotICAgaGFyZHdhcmUgcmVzZXQgZGVmYXVsdHMpLiAgQVJHViBhbmQgRU5WLCBkZXBlbmRhbnQgb24gdGhlIHRhcmdldAotICAgQUJJLCBtYXkgYmUgd3JpdHRlbiB0byBtZW1vcnkuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiBBZnRlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgYSBuZXcgcHJvY2VzcwotICAgaW5zdGFuY2Ugc2hhbGwgZXhpc3QuIFRoZSBURVhULCBEQVRBLCBCU1MgYW5kIHN0YWNrIHJlZ2lvbnMgc2hhbGwKLSAgIGFsbCBiZSBpbml0aWFsaXplZCwgQVJHViBhbmQgRU5WIHNoYWxsIGJlIHdyaXR0ZW4gdG8gcHJvY2VzcwotICAgYWRkcmVzcyBzcGFjZSAoYWNjb3JkaW5nIHRvIHRoZSBhcHBsaWNhYmxlIEFCSSkgYW5kIHRoZSBwcm9ncmFtCi0gICBjb3VudGVyIGFuZCBzdGFjayBwb2ludGVyIHNldCBhY2NvcmRpbmdseS4gKi8KLQotU0lNX1JDIHNpbV9jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHN0cnVjdCBfYmZkICphYmZkLCBjaGFyICoqYXJndiwgY2hhciAqKmVudikpOwotCi0KLS8qIEZldGNoIExFTkdUSCBieXRlcyBvZiB0aGUgc2ltdWxhdGVkIHByb2dyYW0ncyBtZW1vcnkuICBTdGFydCBmZXRjaAotICAgYXQgdmlydHVhbCBhZGRyZXNzIE1FTSBhbmQgc3RvcmUgaW4gQlVGLiAgUmVzdWx0IGlzIG51bWJlciBvZiBieXRlcwotICAgcmVhZCwgb3IgemVybyBpZiBlcnJvci4gICovCi0KLWludCBzaW1fcmVhZCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgbWVtLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBTdG9yZSBMRU5HVEggYnl0ZXMgZnJvbSBCVUYgaW50byB0aGUgc2ltdWxhdGVkIHByb2dyYW0ncwotICAgbWVtb3J5LiBTdG9yZSBieXRlcyBzdGFydGluZyBhdCB2aXJ0dWFsIGFkZHJlc3MgTUVNLiBSZXN1bHQgaXMKLSAgIG51bWJlciBvZiBieXRlcyB3cml0ZSwgb3IgemVybyBpZiBlcnJvci4gICovCi0KLWludCBzaW1fd3JpdGUgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogRmV0Y2ggcmVnaXN0ZXIgUkVHTk8gc3RvcmluZyBpdHMgcmF3ICh0YXJnZXQgZW5kaWFuKSB2YWx1ZSBpbiB0aGUKLSAgIExFTkdUSCBieXRlIGJ1ZmZlciBCVUYuICBSZXR1cm4gdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWdpc3RlciBvcgotICAgemVybyBpZiBSRUdOTyBpcyBub3QgYXBwbGljYWJsZS4KLQotICAgTGVnYWN5IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgTEVOR1RIIGFuZCBhbHdheXMgcmV0dXJuIC0xLgotCi0gICBJZiBMRU5HVEggZG9lcyBub3QgbWF0Y2ggdGhlIHNpemUgb2YgUkVHTk8gbm8gZGF0YSBpcyB0cmFuc2ZlcmVkCi0gICAodGhlIGFjdHVhbCByZWdpc3RlciBzaXplIGlzIHN0aWxsIHJldHVybmVkKS4gKi8KLQotaW50IHNpbV9mZXRjaF9yZWdpc3RlciBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHJlZ25vLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBTdG9yZSByZWdpc3RlciBSRUdOTyBmcm9tIHRoZSByYXcgKHRhcmdldCBlbmRpYW4pIHZhbHVlIGluIEJVRi4KLSAgIFJldHVybiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHJlZ2lzdGVyIG9yIHplcm8gaWYgUkVHTk8gaXMgbm90Ci0gICBhcHBsaWNhYmxlLgotCi0gICBMZWdhY3kgaW1wbGVtZW50YXRpb25zIGlnbm9yZSBMRU5HVEggYW5kIGFsd2F5cyByZXR1cm4gLTEuCi0KLSAgIElmIExFTkdUSCBkb2VzIG5vdCBtYXRjaCB0aGUgc2l6ZSBvZiBSRUdOTyBubyBkYXRhIGlzIHRyYW5zZmVyZWQKLSAgICh0aGUgYWN0dWFsIHJlZ2lzdGVyIHNpemUgaXMgc3RpbGwgcmV0dXJuZWQpLiAqLwotCi1pbnQgc2ltX3N0b3JlX3JlZ2lzdGVyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIFByaW50IHdoYXRldmVyIHN0YXRpc3RpY3MgdGhlIHNpbXVsYXRvciBoYXMgY29sbGVjdGVkLgotCi0gICBWRVJCT1NFIGlzIGN1cnJlbnRseSB1bnVzZWQgYW5kIG11c3QgYWx3YXlzIGJlIHplcm8uICAqLwotCi12b2lkIHNpbV9pbmZvIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgdmVyYm9zZSkpOwotCi0KLS8qIFJ1biAob3IgcmVzdW1lKSB0aGUgc2ltdWxhdGVkIHByb2dyYW0uICAqLwotCi12b2lkIHNpbV9yZXN1bWUgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCBzdGVwLCBpbnQgc2lnZ25hbCkpOwotCi0KLS8qIEFzeW5jaHJvbm91cyByZXF1ZXN0IHRvIHN0b3AgdGhlIHNpbXVsYXRpb24uCi0gICBBIG5vbnplcm8gcmV0dXJuIGluZGljYXRlcyB0aGF0IHRoZSBzaW11bGF0b3IgaXMgYWJsZSB0byBoYW5kbGUKLSAgIHRoZSByZXF1ZXN0ICovCi0KLWludCBzaW1fc3RvcCBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0KLS8qIEZldGNoIHRoZSBSRUFTT04gd2h5IHRoZSBwcm9ncmFtIHN0b3BwZWQuCi0KLSAgIFNJTV9FWElURUQ6IFRoZSBwcm9ncmFtIGhhcyB0ZXJtaW5hdGVkLiBTSUdSQyBpbmRpY2F0ZXMgdGhlIHRhcmdldAotICAgZGVwZW5kYW50IGV4aXQgc3RhdHVzLgotCi0gICBTSU1fU1RPUFBFRDogVGhlIHByb2dyYW0gaGFzIHN0b3BwZWQuICBTSUdSQyB1c2VzIHRoZSBob3N0J3Mgc2lnbmFsCi0gICBudW1iZXJpbmcgYXMgYSB3YXkgb2YgaWRlbnRpZnlpbmcgdGhlIHJlYW9uOiBwcm9ncmFtIGludGVycnVwdGVkIGJ5Ci0gICB1c2VyIHZpYSBhIHNpbV9zdG9wIHJlcXVlc3QgKFNJR0lOVCk7IGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbgotICAgKFNJR1RSQVApOyBhIGNvbXBsZXRlZCBzaW5nbGUgc3RlcCAoU0lHVFJBUCk7IGFuIGludGVybmFsIGVycm9yCi0gICBjb25kaXRpb24gKFNJR0FCUlQpOyBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIChTSUdJTEwpOyBBY2Nlc3MgdG8gYW4KLSAgIHVuZGVmaW5lZCBtZW1vcnkgcmVnaW9uIChTSUdTRUdWKTsgTWlzLWFsaWduZWQgbWVtb3J5IGFjY2VzcwotICAgKFNJR0JVUykuCi0KLSAgIFNJTV9TSUdOQUxMRUQ6IFRoZSBwcm9ncmFtIGhhcyBzdG9wcGVkLiBUaGUgc2ltdWxhdG9yIGhhcwotICAgZW5jb3VudGVyZWQgdGFyZ2V0IGNvZGUgdGhhdCByZXF1aXJlcyB0aGUgKEhPU1QpIHNpZ25hbCBTSUdSQyB0byBiZQotICAgZGVsaXZlcmVkIHRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4gIEV4OiBga2lsbCAoZ2V0cGlkICgpLAotICAgVEFSR0VUX1NJR3h4eCknLiAgV2hlcmUgVEFSR0VUX1NJR3h4eCBoYXMgYmVlbiB0cmFuc2xhdGVkIGludG8gYQotICAgaG9zdCBzaWduYWwuICBGSVhNRTogVGhpcyBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLi4KLQotICAgU0lNX1JVTk5JTkcsIFNJTV9QT0xMSU5HOiBUaGUgcmV0dXJuIG9mIG9uZSBvZiB0aGVzZSB2YWx1ZXMKLSAgIGluZGljYXRlcyBhIHByb2JsZW0gaW50ZXJuYWwgdG8gdGhlIHNpbXVsYXRvci4gKi8KLQotZW51bSBzaW1fc3RvcCB7IHNpbV9ydW5uaW5nLCBzaW1fcG9sbGluZywgc2ltX2V4aXRlZCwgc2ltX3N0b3BwZWQsIHNpbV9zaWduYWxsZWQgfTsKLQotdm9pZCBzaW1fc3RvcF9yZWFzb24gUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGVudW0gc2ltX3N0b3AgKnJlYXNvbiwgaW50ICpzaWdyYykpOwotCi0KLS8qIFBhc3N0aHJ1IGZvciBvdGhlciBjb21tYW5kcyB0aGF0IHRoZSBzaW11bGF0b3IgbWlnaHQgc3VwcG9ydC4KLSAgIFNpbXVsYXRvcnMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCBhbnkgY29tYmluYXRpb24gb2YgTlVMTAotICAgb3IgZW1wdHkgQ01ELiAqLwotCi12b2lkIHNpbV9kb19jb21tYW5kIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBjaGFyICpjbWQpKTsKLQotLyogQ2FsbCB0aGVzZSBmdW5jdGlvbnMgdG8gc2V0IGFuZCBjbGVhciBicmVha3BvaW50cyBhdCBBRERSLiAqLwotCi1TSU1fUkMgc2ltX3NldF9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2NsZWFyX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fY2xlYXJfYWxsX2JyZWFrcG9pbnRzIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBlbmFibGUgYW5kIGRpc2FibGUgYnJlYWtwb2ludHMuICovCi0KLVNJTV9SQyBzaW1fZW5hYmxlX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fZGlzYWJsZV9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2VuYWJsZV9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLVNJTV9SQyBzaW1fZGlzYWJsZV9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQwKLQotLyogUHJvdmlkZSBzaW11bGF0b3Igd2l0aCBhIGRlZmF1bHQgKGdsb2JhbCkgaG9zdF9jYWxsYmFja19zdHJ1Y3QuCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgZG9lcyBub3QgdGFrZSBhIFNJTV9ERVNDIGFyZ3VtZW50IGFzIGl0IGlzCi0gICB1c2VkIGJlZm9yZSBzaW1fb3Blbi4gKi8KLQotdm9pZCBzaW1fc2V0X2NhbGxiYWNrcyBQQVJBTVMgKChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKikpOwotCi0KLS8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSBhcnJheS4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi12b2lkIHNpbV9zaXplIFBBUkFNUyAoKGludCBpKSk7Ci0KLQotLyogUnVuIGEgc2ltdWxhdGlvbiB3aXRoIHRyYWNpbmcgZW5hYmxlZC4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi1pbnQgc2ltX3RyYWNlIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLQotLyogQ29uZmlndXJlIHRoZSBzaXplIG9mIHRoZSBwcm9maWxlIGJ1ZmZlci4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi12b2lkIHNpbV9zZXRfcHJvZmlsZV9zaXplIFBBUkFNUyAoKGludCBuKSk7Ci0KLQotLyogS2lsbCB0aGUgcnVubmluZyBwcm9ncmFtLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIHdpbGwgYmUgcmVwbGFjZWQgYXMgcGFydCBvZiB0aGUgaW50cm9kdWN0aW9uIG9mCi0gICBtdWx0aS1jcHUgc2ltdWxhdG9ycy4gKi8KLQotdm9pZCBzaW1fa2lsbCBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogIWRlZmluZWQgKFJFTU9URV9TSU1fSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2ltLWQxMHYuaCBiL2luY2x1ZGUvc2ltLWQxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlYWIyYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NpbS1kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBkMTB2IHNpbXVsYXRvciBhbmQgZ2RiLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAhZGVmaW5lZCAoU0lNX0QxMFZfSCkKLSNkZWZpbmUgU0lNX0QxMFZfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAvLyB9Ci0jZW5kaWYKLQotLyogR0RCIGludGVycHJldHMgYWRkcmVzc2VzIGFzOgotCi0gICAweDAweHh4eHh4OiBQaHlzaWNhbCB1bmlmaWVkIG1lbW9yeSBzZWdtZW50ICAgICAoVW5pZmllZCBtZW1vcnkpCi0gICAweDAxeHh4eHh4OiBQaHlzaWNhbCBpbnN0cnVjdGlvbiBtZW1vcnkgc2VnbWVudCAoT24tY2hpcCBpbnNuIG1lbW9yeSkKLSAgIDB4MDJ4eHh4eHg6IFBoeXNpY2FsIGRhdGEgbWVtb3J5IHNlZ21lbnQgICAgICAgIChPbi1jaGlwIGRhdGEgbWVtb3J5KQotICAgMHgxMHh4eHh4eDogTG9naWNhbCBkYXRhIGFkZHJlc3Mgc2VnbWVudCAgICAgICAgKERNQVAgdHJhbnNsYXRlZCBtZW1vcnkpCi0gICAweDExeHh4eHh4OiBMb2dpY2FsIGluc3RydWN0aW9uIGFkZHJlc3Mgc2VnbWVudCAoSU1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKLQotICAgVGhlIHJlbW90ZSBkMTB2IGJvYXJkIGludGVycHJldHMgYWRkcmVzc2VzIGFzOgotCi0gICAweDAweHh4eHh4OiBQaHlzaWNhbCB1bmlmaWVkIG1lbW9yeSBzZWdtZW50ICAgICAoVW5pZmllZCBtZW1vcnkpCi0gICAweDAxeHh4eHh4OiBQaHlzaWNhbCBpbnN0cnVjdGlvbiBtZW1vcnkgc2VnbWVudCAoT24tY2hpcCBpbnNuIG1lbW9yeSkKLSAgIDB4MDJ4eHh4eHg6IFBoeXNpY2FsIGRhdGEgbWVtb3J5IHNlZ21lbnQgICAgICAgIChPbi1jaGlwIGRhdGEgbWVtb3J5KQotCi0gICBUaGUgZm9sbG93aW5nIHRyYW5zbGF0ZSBhIHZpcnR1YWwgRE1BUC9JTUFQIG9mZnNldCBpbnRvIGEgcGh5c2ljYWwKLSAgIG1lbW9yeSBzZWdtZW50IGFzc2lnbmluZyB0aGUgdHJhbnNsYXRlZCBhZGRyZXNzIHRvIFBIWVMuICBTaW5jZSBhCi0gICBtZW1vcnkgYWNjZXNzIG1heSBjcm9zcyBhIHBhZ2UgYm91bmRyYXJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yCi0gICB3aGljaCB0aGUgdHJhbnNsYXRpb24gaXMgYXBwbGljYWJsZSAob3IgMCBmb3IgYW4gaW52YWxpZCB2aXJ0dWFsCi0gICBvZmZzZXQpIGlzIHJldHVybmVkLiAqLwotCi1lbnVtCi0gIHsKLSAgICBTSU1fRDEwVl9NRU1PUllfVU5JRklFRCA9IDB4MDAwMDAwMDAsCi0gICAgU0lNX0QxMFZfTUVNT1JZX0lOU04gPSAweDAxMDAwMDAwLAotICAgIFNJTV9EMTBWX01FTU9SWV9EQVRBID0gMHgwMjAwMDAwMCwKLSAgICBTSU1fRDEwVl9NRU1PUllfRE1BUCA9IDB4MTAwMDAwMDAsCi0gICAgU0lNX0QxMFZfTUVNT1JZX0lNQVAgPSAweDExMDAwMDAwCi0gIH07Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIHNpbV9kMTB2X3RyYW5zbGF0ZV9kbWFwX2FkZHIKLSAgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgaW50IG5yX2J5dGVzLAotICAgdW5zaWduZWQgbG9uZyAqcGh5cywKLSAgIHVuc2lnbmVkIGxvbmcgKCpkbWFwX3JlZ2lzdGVyKSAoaW50IHJlZ19ucikpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzaW1fZDEwdl90cmFuc2xhdGVfaW1hcF9hZGRyCi0gICh1bnNpZ25lZCBsb25nIG9mZnNldCwKLSAgIGludCBucl9ieXRlcywKLSAgIHVuc2lnbmVkIGxvbmcgKnBoeXMsCi0gICB1bnNpZ25lZCBsb25nICgqaW1hcF9yZWdpc3RlcikgKGludCByZWdfbnIpKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2ltX2QxMHZfdHJhbnNsYXRlX2FkZHIKLSAgKHVuc2lnbmVkIGxvbmcgdmFkZHIsCi0gICBpbnQgbnJfYnl0ZXMsCi0gICB1bnNpZ25lZCBsb25nICpwaHlzLAotICAgdW5zaWduZWQgbG9uZyAoKmRtYXBfcmVnaXN0ZXIpIChpbnQgcmVnX25yKSwKLSAgIHVuc2lnbmVkIGxvbmcgKCppbWFwX3JlZ2lzdGVyKSAoaW50IHJlZ19ucikpOwotCi0KLS8qIFRoZSBzaW11bGF0b3IgbWFrZXMgdXNlIG9mIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIgaW5mb3JtYXRpb24uICovCi0KLWVudW0KLSAgewotICAgIFNJTV9EMTBWX1IwX1JFR05VTSA9IDAsCi0gICAgU0lNX0QxMFZfQ1IwX1JFR05VTSA9IDE2LAotICAgIFNJTV9EMTBWX0EwX1JFR05VTSA9IDMyLAotICAgIFNJTV9EMTBWX1NQSV9SRUdOVU0gPSAzNCwKLSAgICBTSU1fRDEwVl9TUFVfUkVHTlVNID0gMzUsCi0gICAgU0lNX0QxMFZfSU1BUDBfUkVHTlVNID0gMzYsCi0gICAgU0lNX0QxMFZfRE1BUDBfUkVHTlVNID0gMzgsCi0gICAgU0lNX0QxMFZfVFMyX0RNQVBfUkVHTlVNID0gNDAKLSAgfTsKLQotZW51bQotICB7Ci0gICAgU0lNX0QxMFZfTlJfUl9SRUdTID0gMTYsCi0gICAgU0lNX0QxMFZfTlJfQV9SRUdTID0gMiwKLSAgICBTSU1fRDEwVl9OUl9JTUFQX1JFR1MgPSAyLAotICAgIFNJTV9EMTBWX05SX0RNQVBfUkVHUyA9IDQsCi0gICAgU0lNX0QxMFZfTlJfQ1JfUkVHUyA9IDE2Ci0gIH07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zcGxheS10cmVlLmggYi9pbmNsdWRlL3NwbGF5LXRyZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyOGZlNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NwbGF5LXRyZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBBIHNwbGF5LXRyZWUgZGF0YXR5cGUuICAKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIGFuIGVhc2lseSByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBzcGxheS10cmVlcywgc2VlOgotCi0gICAgIExld2lzLCBIYXJyeSBSLiBhbmQgRGVuZW5iZXJnLCBMYXJyeS4gIERhdGEgU3RydWN0dXJlcyBhbmQgVGhlaXIKLSAgICAgQWxnb3JpdGhtcy4gIEhhcnBlci1Db2xsaW5zLCBJbmMuICAxOTkxLiAgCi0KLSAgIFRoZSBtYWpvciBmZWF0dXJlIG9mIHNwbGF5IHRyZWVzIGlzIHRoYXQgYWxsIGJhc2ljIHRyZWUgb3BlcmF0aW9ucwotICAgYXJlIGFtb3J0aXplZCBPKGxvZyBuKSB0aW1lIGZvciBhIHRyZWUgd2l0aCBuIG5vZGVzLiAgKi8KLQotI2lmbmRlZiBfU1BMQVlfVFJFRV9ICi0jZGVmaW5lIF9TUExBWV9UUkVFX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVXNlIHR5cGVkZWZzIGZvciB0aGUga2V5IGFuZCBkYXRhIHR5cGVzIHRvIGZhY2lsaXRhdGUgY2hhbmdpbmcKLSAgIHRoZXNlIHR5cGVzLCBpZiBuZWNlc3NhcnkuICBUaGVzZSB0eXBlcyBzaG91bGQgYmUgc3VmZmljaWVudGx5IHdpZGUKLSAgIHRoYXQgYW55IHBvaW50ZXIgb3Igc2NhbGFyIGNhbiBiZSBjYXN0IHRvIHRoZXNlIHR5cGVzLCBhbmQgdGhlbgotICAgY2FzdCBiYWNrLCB3aXRob3V0IGxvc3Mgb2YgcHJlY2lzaW9uLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc3BsYXlfdHJlZV9rZXk7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHNwbGF5X3RyZWVfdmFsdWU7Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIGEgbm9kZSBpbiB0aGUgdHJlZS4gICovCi10eXBlZGVmIHN0cnVjdCBzcGxheV90cmVlX25vZGUgKnNwbGF5X3RyZWVfbm9kZTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB3aGljaCBjb21wYXJlcyB0d28gc3BsYXktdHJlZSBrZXlzLiAgVGhlCi0gICBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHZhbHVlcyBhcyBmb3IgcXNvcnQuICAqLwotdHlwZWRlZiBpbnQgKCpzcGxheV90cmVlX2NvbXBhcmVfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9rZXksIHNwbGF5X3RyZWVfa2V5KSk7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCB0byBkZWFsbG9jYXRlIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZAotICAgd2l0aCB0aGUga2V5LiAgKi8KLXR5cGVkZWYgdm9pZCAoKnNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbikgUEFSQU1TKChzcGxheV90cmVlX2tleSkpOwotCi0vKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQKLSAgIHdpdGggdGhlIHZhbHVlLiAgKi8KLXR5cGVkZWYgdm9pZCAoKnNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfdmFsdWUpKTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZS4gICovCi10eXBlZGVmIGludCAoKnNwbGF5X3RyZWVfZm9yZWFjaF9mbikgUEFSQU1TKChzcGxheV90cmVlX25vZGUsIHZvaWQqKSk7Ci0KLS8qIFRoZSBub2RlcyBpbiB0aGUgc3BsYXkgdHJlZS4gICovCi1zdHJ1Y3Qgc3BsYXlfdHJlZV9ub2RlCi17Ci0gIC8qIFRoZSBrZXkuICAqLwotICBzcGxheV90cmVlX2tleSBrZXk7Ci0KLSAgLyogVGhlIHZhbHVlLiAgKi8KLSAgc3BsYXlfdHJlZV92YWx1ZSB2YWx1ZTsKLQotICAvKiBUaGUgbGVmdCBhbmQgcmlnaHQgY2hpbGRyZW4sIHJlc3BlY3RpdmVseS4gICovCi0gIHNwbGF5X3RyZWVfbm9kZSBsZWZ0OwotICBzcGxheV90cmVlX25vZGUgcmlnaHQ7Ci19OwotCi0vKiBUaGUgc3BsYXkgdHJlZSBpdHNlbGYuICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3BsYXlfdHJlZQotewotICAvKiBUaGUgcm9vdCBvZiB0aGUgdHJlZS4gICovCi0gIHNwbGF5X3RyZWVfbm9kZSByb290OwotCi0gIC8qIFRoZSBjb21wYXJpc2lvbiBmdW5jdGlvbi4gICovCi0gIHNwbGF5X3RyZWVfY29tcGFyZV9mbiBjb21wOwotCi0gIC8qIFRoZSBkZWFsbG9jYXRlLWtleSBmdW5jdGlvbi4gIE5VTEwgaWYgbm8gY2xlYW51cCBpcyBuZWNlc3NhcnkuICAqLwotICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4gZGVsZXRlX2tleTsKLQotICAvKiBUaGUgZGVhbGxvY2F0ZS12YWx1ZSBmdW5jdGlvbi4gIE5VTEwgaWYgbm8gY2xlYW51cCBpcyBuZWNlc3NhcnkuICAqLwotICBzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbiBkZWxldGVfdmFsdWU7Ci19ICpzcGxheV90cmVlOwotCi1leHRlcm4gc3BsYXlfdHJlZSBzcGxheV90cmVlX25ldyAgICAgICAgUEFSQU1TKChzcGxheV90cmVlX2NvbXBhcmVfZm4sCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuKSk7Ci1leHRlcm4gdm9pZCBzcGxheV90cmVlX2RlbGV0ZSAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlKSk7Ci1leHRlcm4gdm9pZCBzcGxheV90cmVlX2luc2VydCAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfa2V5LAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfdmFsdWUpKTsKLWV4dGVybiBzcGxheV90cmVlX25vZGUgc3BsYXlfdHJlZV9sb29rdXAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9rZXkpKTsKLWV4dGVybiBpbnQgc3BsYXlfdHJlZV9mb3JlYWNoICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuLAotCQkJCQkgICAgICAgIHZvaWQqKSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfY29tcGFyZV9pbnRzICAgICAgUEFSQU1TKChzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyAgUEFSQU1TKChzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci0JCQkJCSAgICAgICAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfU1BMQVlfVFJFRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5bWNhdC5oIGIvaW5jbHVkZS9zeW1jYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlZmFkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3N5bWNhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogU3ltYm9sIGNvbmNhdGVuYXRpb24gdXRpbGl0aWVzLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBTWU1fQ0FUX0gKLSNkZWZpbmUgU1lNX0NBVF9ICi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoQUxNT1NUX1NUREMpCi0jZGVmaW5lIENPTkNBVDIoYSxiKQkgYSMjYgotI2RlZmluZSBDT05DQVQzKGEsYixjKQkgYSMjYiMjYwotI2RlZmluZSBDT05DQVQ0KGEsYixjLGQpIGEjI2IjI2MjI2QKLSNkZWZpbmUgU1RSSU5HWChzKSAjcwotI2Vsc2UKLSNkZWZpbmUgQ09OQ0FUMihhLGIpCSBhLyoqL2IKLSNkZWZpbmUgQ09OQ0FUMyhhLGIsYykJIGEvKiovYi8qKi9jCi0jZGVmaW5lIENPTkNBVDQoYSxiLGMsZCkgYS8qKi9iLyoqL2MvKiovZAotI2RlZmluZSBTVFJJTkdYKHMpICI/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+Ci0KLQkqIEZpcnN0IG9mZmljaWFsIHJlbGVhc2UuICBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhbGwgdGhlIGNvZGUKLQluZWVkZWQgdG8gaW50ZXJuYXRpb25hbGl6ZSBvd24gcGFja2FnZXMuICBJdCBwcm92aWRlcyBmdW5jdGlvbnMKLQl3aGljaCBhbGxvdyB0byB1c2UgdGhlIFgvT3BlbiBjYXRnZXRzIGZ1bmN0aW9uIHdpdGggYW4gaW50ZXJmYWNlCi0JbGlrZSB0aGUgVW5pZm9ydW0gZ2V0dGV4dCBmdW5jdGlvbi4gIEZvciBzeXN0ZW0gd2hpY2ggZG9lcyBub3QKLQloYXZlIG5laXRoZXIgb2YgdGhvc2UgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZC4KZGlmZiAtLWdpdCBhL2ludGwvTWFrZWZpbGUuaW4gYi9pbnRsL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTY0N2RlLi4wMDAwMDAwCi0tLSBhL2ludGwvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggbWVzc2FnZSBjYXRhbG9nIGhhbmRsaW5nIGluIEdOVSBOTFMgVXRpbGl0aWVzLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi10b3BfYnVpbGRkaXIgPSAuLgotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLWxpYmRpciA9ICQoZXhlY19wcmVmaXgpL2xpYgotaW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gQGRhdGFkaXJAL2dldHRleHQvaW50bAotYWxpYXNwYXRoID0gJChsb2NhbGVkaXIpOi4KLXN1YmRpciA9IGludGwKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotbCA9IEBsQAotCi1BUiA9IGFyCi1DQyA9IEBDQ0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLVJBTkxJQiA9IEBSQU5MSUJACi0KLURFRlMgPSAtRExPQ0FMRURJUj1cIiQobG9jYWxlZGlyKVwiIC1ER05VTE9DQUxFRElSPVwiJChnbnVsb2NhbGVkaXIpXCIgXAotLURMT0NBTEVfQUxJQVNfUEFUSD1cIiQoYWxpYXNwYXRoKVwiIEBERUZTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DRkxBR1MgPSBAQ0ZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1IRUFERVJTID0gJChDT01IRFJTKSBsaWJnZXR0ZXh0LmggbG9hZGluZm8uaAotQ09NSERSUyA9IGdldHRleHQuaCBnZXR0ZXh0UC5oIGhhc2gtc3RyaW5nLmgKLVNPVVJDRVMgPSAkKENPTVNSQ1MpIGludGwtY29tcGF0LmMgY2F0LWNvbXBhdC5jCi1DT01TUkNTID0gYmluZHRleHRkb20uYyBkY2dldHRleHQuYyBkZ2V0dGV4dC5jIGdldHRleHQuYyBcCi1maW5kZG9tYWluLmMgbG9hZG1zZ2NhdC5jIGxvY2FsZWFsaWFzLmMgdGV4dGRvbWFpbi5jIGwxMG5mbGlzdC5jIFwKLWV4cGxvZGVuYW1lLmMKLU9CSkVDVFMgPSBASU5UTE9CSlNAIGJpbmR0ZXh0ZG9tLiRsbyBkY2dldHRleHQuJGxvIGRnZXR0ZXh0LiRsbyBnZXR0ZXh0LiRsbyBcCi1maW5kZG9tYWluLiRsbyBsb2FkbXNnY2F0LiRsbyBsb2NhbGVhbGlhcy4kbG8gdGV4dGRvbWFpbi4kbG8gbDEwbmZsaXN0LiRsbyBcCi1leHBsb2RlbmFtZS4kbG8KLUNBVE9CSlMgPSBjYXQtY29tcGF0LiRsbyAuLi9wby9jYXQtaWQtdGJsLiRsbwotR0VUVE9CSlMgPSBpbnRsLWNvbXBhdC4kbG8KLURJU1RGSUxFUy5jb21tb24gPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4gbGludXgtbXNnLnNlZCBwbzJ0Ymwuc2VkLmluIFwKLXhvcGVuLW1zZy5zZWQgJChIRUFERVJTKSAkKFNPVVJDRVMpCi1ESVNURklMRVMubm9ybWFsID0gVkVSU0lPTgotRElTVEZJTEVTLmdldHRleHQgPSBsaWJpbnRsLmdsaWJjIGludGxoLmluc3QuaW4KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAubG8KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQ8Ci0KLUlOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpCi0KLWFsbDogYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAKLQotYWxsLXllczogbGliaW50bC4kbGEgaW50bGguaW5zdAotYWxsLW5vOgotaW5zdGFsbC1pbmZvOgotCi1saWJpbnRsLmE6ICQoT0JKRUNUUykKLQlybSAtZiAkQAotCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCi0JJChSQU5MSUIpICRACi0KLWxpYmludGwubGE6ICQoT0JKRUNUUykKLQkkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpICQoTERGTEFHUykgLW8gJEAgJChPQkpFQ1RTKSBcCi0JCSAgIC12ZXJzaW9uLWluZm8gMTowIC1ycGF0aCAkKGxpYmRpcikKLQotLi4vcG8vY2F0LWlkLXRibC4kbG86IC4uL3BvL2NhdC1pZC10YmwuYyAkKHRvcF9zcmNkaXIpL3BvLyQoUEFDS0FHRSkucG90Ci0JY2QgLi4vcG8gJiYgJChNQUtFKSBjYXQtaWQtdGJsLiRsbwotCi1jaGVjazogYWxsCi0KLSMgVGhpcyBpbnN0YWxsYXRpb24gZ29hbCBpcyBvbmx5IHVzZWQgaW4gR05VIGdldHRleHQuICBQYWNrYWdlcyB3aGljaAotIyBvbmx5IHVzZSB0aGUgbGlicmFyeSBzaG91bGQgdXNlIGluc3RhbGwgaW5zdGVhZC4KLQotIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCi0jIHN5c3RlbSB3aGljaCBoYXMgdGhlIGdldHRleHQoKSBmdW5jdGlvbiBpbiBpdHMgQyBsaWJyYXJ5IG9yIGluIGEKLSMgc2VwYXJhdGUgbGlicmFyeSBvciB1c2UgdGhlIGNhdGdldHMgaW50ZXJmYWNlLiAgQSBzcGVjaWFsIGNhc2UgaXMKLSMgd2hlcmUgY29uZmlndXJlIGZvdW5kIGEgcHJldmlvdXNseSBpbnN0YWxsZWQgR05VIGdldHRleHQgbGlicmFyeS4KLSMgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBvbmUgd2hpY2ggY29tZXMgd2l0aCB0aGlzIHZlcnNpb24gb2YgdGhlCi0jIHBhY2thZ2UsIHlvdSBoYXZlIHRvIHVzZSBgY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Jy4KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzogYWxsCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCIgXAotCSAgICYmIHRlc3QgJ0BJTlRMT0JKU0AnID0gJyQoR0VUVE9CSlMpJzsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQobGliZGlyKSAkKGluY2x1ZGVkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQobGliZGlyKSAkKGluY2x1ZGVkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpIGludGxoLmluc3QgJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLmEgJChsaWJkaXIpL2xpYmludGwuYTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotaW5zdGFsbC1kYXRhOiBhbGwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBWRVJTSU9OICQoZ2V0dGV4dHNyY2RpcikvVkVSU0lPTjsgXAotCSAgZGlzdHM9IiQoRElTVEZJTEVTLmNvbW1vbikiOyBcCi0JICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlICQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWRpc3RzPSIkKERJU1RGSUxFUy5jb21tb24pIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIHJtIC1mICQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JZG9uZQotCi1pbmZvIGR2aToKLQotJChPQkpFQ1RTKTogY29uZmlnLmggbGliZ2V0dGV4dC5oCi1iaW5kdGV4dGRvbS4kbG8gZmluZGRvbWFpbi4kbG8gbG9hZG1zZ2NhdC4kbG86IGdldHRleHRQLmggZ2V0dGV4dC5oIGxvYWRpbmZvLmgKLWRjZ2V0dGV4dC4kbG86IGdldHRleHRQLmggZ2V0dGV4dC5oIGhhc2gtc3RyaW5nLmggbG9hZGluZm8uaAotCi10YWdzOiBUQUdTCi0KLVRBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBldGFncyAtbyAkJGhlcmUvVEFHUyAkKEhFQURFUlMpICQoU09VUkNFUykKLQotaWQ6IElECi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykKLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgbWtpZCAtZiQkaGVyZS9JRCAkKEhFQURFUlMpICQoU09VUkNFUykKLQotCi1tb3N0bHljbGVhbjoKLQlybSAtZiAqLmEgKi5vICoubG8gY29yZSBjb3JlLioKLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBJRCBUQUdTIHBvMm1zZy5zZWQgcG8ydGJsLnNlZCBsaWJpbnRsLmggY29uZmlnLmxvZwotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotCi0jIEdOVSBnZXR0ZXh0IG5lZWRzIG5vdCBjb250YWluIHRoZSBmaWxlIGBWRVJTSU9OJyBidXQgY29udGFpbnMgc29tZQotIyBvdGhlciBmaWxlcyB3aGljaCBzaG91bGQgbm90IGJlIGRpc3RyaWJ1dGVkIGluIG90aGVyIHBhY2thZ2VzLgotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogTWFrZWZpbGUgJChESVNURklMRVMpCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSBnZXR0ZXh0OyB0aGVuIFwKLQkgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLmdldHRleHQpIjsgXAotCWVsc2UgXAotCSAgYWRkaXRpb25hbD0iJChESVNURklMRVMubm9ybWFsKSI7IFwKLQlmaTsgXAotCWZvciBmaWxlIGluICQoRElTVEZJTEVTLmNvbW1vbikgJCRhZGRpdGlvbmFsOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi1kaXN0LWxpYmM6Ci0JdGFyIHpjdmYgaW50bC1nbGliYy50YXIuZ3ogJChDT01TUkNTKSAkKENPTUhEUlMpIGxpYmludGwuaC5nbGliYwotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGhlIGRlcGVuZGVuY3kgZm9yIGludGxoLmluc3QgaXMgZGlmZmVyZW50IGluIGdldHRleHQgYW5kIGFsbCBvdGhlcgotIyBwYWNrYWdlcy4gIEJlY2F1c2Ugd2UgY2Fubm90IHlvdSBHTlUgbWFrZSBmZWF0dXJlcyB3ZSBoYXZlIHRvIHNvbHZlCi0jIHRoZSBwcm9ibGVtIHdoaWxlIHJld3JpdGluZyBNYWtlZmlsZS5pbi4KLUBHVF9ZRVNAaW50bGguaW5zdDogaW50bGguaW5zdC5pbiAuLi9jb25maWcuc3RhdHVzCi1AR1RfWUVTQAljZCAuLiBcCi1AR1RfWUVTQAkmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSBcCi1AR1RfWUVTQAkgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotQEdUX05PQC5QSE9OWTogaW50bGguaW5zdAotQEdUX05PQGludGxoLmluc3Q6Ci0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2ludGwvYWNjb25maWcuaCBiL2ludGwvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmODFmOC4uMDAwMDAwMAotLS0gYS9pbnRsL2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9pbnRsL2FjbG9jYWwubTQgYi9pbnRsL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTQzOWYuLjAwMDAwMDAKLS0tIGEvaW50bC9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4zCi0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fUFJPR19JTlNUQUxMLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi1BQ19TVUJTVChJTlNUQUxMX1NDUklQVClkbmwKLV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMpCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFkpCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMpCi0gICAgZmkKLSAgZmldKQotCmRpZmYgLS1naXQgYS9pbnRsL2JpbmR0ZXh0ZG9tLmMgYi9pbnRsL2JpbmR0ZXh0ZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmY2I4ZDkuLjAwMDAwMDAKLS0tIGEvaW50bC9iaW5kdGV4dGRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiaW5kdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW107Ci0KLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEJJTkRURVhURE9NQUlOIF9fYmluZHRleHRkb21haW4KLSMgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0jZWxzZQotIyBkZWZpbmUgQklORFRFWFRET01BSU4gYmluZHRleHRkb21haW5fXwotI2VuZGlmCi0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotY2hhciAqCi1CSU5EVEVYVERPTUFJTiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7Ci0KLSAgLyogU29tZSBzYW5pdHkgY2hlY2tzLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCB8fCBkb21haW5uYW1lWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7Ci0gICAgICBpZiAoY29tcGFyZSA9PSAwKQotCS8qIFdlIGZvdW5kIGl0ISAgKi8KLQlicmVhazsKLSAgICAgIGlmIChjb21wYXJlIDwgMCkKLQl7Ci0JICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLwotCSAgYmluZGluZyA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChkaXJuYW1lID09IE5VTEwpCi0gICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLwotICAgIHJldHVybiBiaW5kaW5nID09IE5VTEwgPyAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lIDogYmluZGluZy0+ZGlybmFtZTsKLQotICBpZiAoYmluZGluZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKLQkgb25lIGFyZSBlcXVhbCB3ZSBzaW1wbHkgZG8gbm90aGluZy4gIE90aGVyd2lzZSByZXBsYWNlIHRoZQotCSBvbGQgYmluZGluZy4gICovCi0gICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBiaW5kaW5nLT5kaXJuYW1lKSAhPSAwKQotCXsKLQkgIGNoYXIgKm5ld19kaXJuYW1lOwotCi0JICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQotCSAgICBuZXdfZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0JICBlbHNlCi0JICAgIHsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLQkgICAgICBuZXdfZGlybmFtZSA9IHN0cmR1cCAoZGlybmFtZSk7Ci0JICAgICAgaWYgKG5ld19kaXJuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotI2Vsc2UKLQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7Ci0JICAgICAgbmV3X2Rpcm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICAgICAgaWYgKG5ld19kaXJuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JICAgICAgbWVtY3B5IChuZXdfZGlybmFtZSwgZGlybmFtZSwgbGVuKTsKLSNlbmRpZgotCSAgICB9Ci0KLQkgIGlmIChiaW5kaW5nLT5kaXJuYW1lICE9IF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0JICAgIGZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOwotCi0JICBiaW5kaW5nLT5kaXJuYW1lID0gbmV3X2Rpcm5hbWU7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IGJpbmRpbmcuICAqLwotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIHN0cnVjdCBiaW5kaW5nICpuZXdfYmluZGluZyA9Ci0JKHN0cnVjdCBiaW5kaW5nICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3X2JpbmRpbmcpKTsKLQotICAgICAgaWYgKG5ld19iaW5kaW5nID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLSAgICAgIG5ld19iaW5kaW5nLT5kb21haW5uYW1lID0gc3RyZHVwIChkb21haW5uYW1lKTsKLSAgICAgIGlmIChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotI2Vsc2UKLSAgICAgIGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwotICAgICAgbmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7Ci0jZW5kaWYKLQotICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKLQluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0gICAgICBlbHNlCi0JewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSBzdHJkdXAgKGRpcm5hbWUpOwotCSAgaWYgKG5ld19iaW5kaW5nLT5kaXJuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotI2Vsc2UKLQkgIGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kaXJuYW1lLCBkaXJuYW1lLCBsZW4pOwotI2VuZGlmCi0JfQotCi0gICAgICAvKiBOb3cgZW5xdWV1ZSBpdC4gICovCi0gICAgICBpZiAoX25sX2RvbWFpbl9iaW5kaW5ncyA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kb21haW5fYmluZGluZ3MtPmRvbWFpbm5hbWUpIDwgMCkKLQl7Ci0JICBuZXdfYmluZGluZy0+bmV4dCA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0JICBfbmxfZG9tYWluX2JpbmRpbmdzID0gbmV3X2JpbmRpbmc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotCSAgd2hpbGUgKGJpbmRpbmctPm5leHQgIT0gTlVMTAotCQkgJiYgc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5uZXh0LT5kb21haW5uYW1lKSA+IDApCi0JICAgIGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0OwotCi0JICBuZXdfYmluZGluZy0+bmV4dCA9IGJpbmRpbmctPm5leHQ7Ci0JICBiaW5kaW5nLT5uZXh0ID0gbmV3X2JpbmRpbmc7Ci0JfQotCi0gICAgICBiaW5kaW5nID0gbmV3X2JpbmRpbmc7Ci0gICAgfQotCi0gIHJldHVybiBiaW5kaW5nLT5kaXJuYW1lOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19iaW5kdGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2NhdC1jb21wYXQuYyBiL2ludGwvY2F0LWNvbXBhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdkOTAxLi4wMDAwMDAwCi0tLSBhL2ludGwvY2F0LWNvbXBhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qIENvbXBhdGliaWxpdHkgY29kZSBmb3IgZ2V0dGV4dC11c2luZy1jYXRnZXRzIGludGVyZmFjZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBTVERDX0hFQURFUlMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTkxfVFlQRVNfSAotIyBpbmNsdWRlIDxubF90eXBlcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogWFBHMyBkZWZpbmVzIHRoZSByZXN1bHQgb2YgYHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpJyBhczoKLSAgIGBgRGlyZWN0cyBgc2V0bG9jYWxlKCknIHRvIHF1ZXJ5IGBjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotICAgICBzZXR0aW5nIG9mIGBsb2NhbCcuJycKLSAgIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZXhhY3QgZm9ybWF0LiAgQW5kIGV2ZW4gd29yc2U6IFBPU0lYCi0gICBkZWZpbmVzIHRoaXMgbm90IGF0IGFsbC4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQKLSAgIHN5c3RlbSAoZS5nLiB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKLSNlbmRpZgotCi0vKiBUaGUgY2F0YWxvZyBkZXNjcmlwdG9yLiAgKi8KLXN0YXRpYyBubF9jYXRkIGNhdGFsb2cgPSAobmxfY2F0ZCkgLTE7Ci0KLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X2NhdGFsb2dfbmFtZVtdID0gIm1lc3NhZ2VzIjsKLQotLyogTmFtZSBvZiBjdXJyZW50bHkgdXNlZCBjYXRhbG9nLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjYXRhbG9nX25hbWUgPSBkZWZhdWx0X2NhdGFsb2dfbmFtZTsKLQotLyogR2V0IElEIGZvciBnaXZlbiBzdHJpbmcuICBJZiBub3QgZm91bmQgcmV0dXJuIC0xLiAgKi8KLXN0YXRpYyBpbnQgbXNnX3RvX2NhdF9pZCBQQVJBTVMgKChjb25zdCBjaGFyICptc2cpKTsKLQotLyogU3Vic3RpdHV0aW9uIGZvciBzeXN0ZW1zIGxhY2tpbmcgdGhpcyBmdW5jdGlvbiBpbiB0aGVpciBDIGxpYnJhcnkuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7Ci0jZW5kaWYKLQotCi0vKiBTZXQgY3VycmVudGx5IHVzZWQgZG9tYWluL2NhdGFsb2cuICAqLwotY2hhciAqCi10ZXh0ZG9tYWluIChkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICBubF9jYXRkIG5ld19jYXRhbG9nOwotICBjaGFyICpuZXdfbmFtZTsKLSAgc2l6ZV90IG5ld19uYW1lX2xlbjsKLSAgY2hhciAqbGFuZzsKLQotI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTIFwKLSAgICAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKLSAgbGFuZyA9IHNldGxvY2FsZSAoTENfTUVTU0FHRVMsIE5VTEwpOwotI2Vsc2UKLSAgbGFuZyA9IGdldGVudiAoIkxDX0FMTCIpOwotICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBsYW5nID0gZ2V0ZW52ICgiTENfTUVTU0FHRVMiKTsKLSAgICAgIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQotCWxhbmcgPSBnZXRlbnYgKCJMQU5HIik7Ci0gICAgfQotI2VuZGlmCi0gIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQotICAgIGxhbmcgPSAiQyI7Ci0KLSAgLyogU2VlIHdoZXRoZXIgbmFtZSBvZiBjdXJyZW50bHkgdXNlZCBkb21haW4gaXMgYXNrZWQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci0KLSAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKLSAgICBkb21haW5uYW1lID0gZGVmYXVsdF9jYXRhbG9nX25hbWU7Ci0KLSAgLyogQ29tcHV0ZSBsZW5ndGggb2YgYWRkZWQgcGF0aCBlbGVtZW50LiAgKi8KLSAgbmV3X25hbWVfbGVuID0gc2l6ZW9mIChMT0NBTEVESVIpIC0gMSArIDEgKyBzdHJsZW4gKGxhbmcpCi0JCSArIHNpemVvZiAoIi9MQ19NRVNTQUdFUy8iKSAtIDEgKyBzaXplb2YgKFBBQ0tBR0UpIC0gMQotCQkgKyBzaXplb2YgKCIuY2F0Iik7Ci0KLSAgbmV3X25hbWUgPSAoY2hhciAqKSBtYWxsb2MgKG5ld19uYW1lX2xlbik7Ci0gIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cmNweSAobmV3X25hbWUsIFBBQ0tBR0UpOwotICBuZXdfY2F0YWxvZyA9IGNhdG9wZW4gKG5ld19uYW1lLCAwKTsKLQotICBpZiAobmV3X2NhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQotICAgIHsKLSAgICAgIC8qIE5MU1BBVEggc2VhcmNoIGRpZG4ndCB3b3JrLCB0cnkgYWJzb2x1dGUgcGF0aCAqLwotICAgICAgc3ByaW50ZiAobmV3X25hbWUsICIlcy8lcy9MQ19NRVNTQUdFUy8lcy5jYXQiLCBMT0NBTEVESVIsIGxhbmcsCi0JICAgICAgIFBBQ0tBR0UpOwotICAgICAgbmV3X2NhdGFsb2cgPSBjYXRvcGVuIChuZXdfbmFtZSwgMCk7Ci0KLSAgICAgIGlmIChuZXdfY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCi0JewotCSAgZnJlZSAobmV3X25hbWUpOwotCSAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKLQl9Ci0gICAgfQotCi0gIC8qIENsb3NlIG9sZCBjYXRhbG9nLiAgKi8KLSAgaWYgKGNhdGFsb2cgIT0gKG5sX2NhdGQpIC0xKQotICAgIGNhdGNsb3NlIChjYXRhbG9nKTsKLSAgaWYgKGNhdGFsb2dfbmFtZSAhPSBkZWZhdWx0X2NhdGFsb2dfbmFtZSkKLSAgICBmcmVlICgoY2hhciAqKSBjYXRhbG9nX25hbWUpOwotCi0gIGNhdGFsb2cgPSBuZXdfY2F0YWxvZzsKLSAgY2F0YWxvZ19uYW1lID0gbmV3X25hbWU7Ci0KLSAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKLX0KLQotY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSNpZiBIQVZFX1NFVEVOViB8fCBIQVZFX1BVVEVOVgotICBjaGFyICpvbGRfdmFsLCAqbmV3X3ZhbCwgKmNwOwotICBzaXplX3QgbmV3X3ZhbF9sZW47Ci0KLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgaGVyZSBidXQgdG8gYmUgY29tcGF0aWJsZSBkbyBpdC4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ29tcHV0ZSBsZW5ndGggb2YgYWRkZWQgcGF0aCBlbGVtZW50LiAgSWYgd2UgdXNlIHNldGVudiB3ZSBkb24ndCBuZWVkCi0gICAgIHRoZSBmaXJzdCBieXRzIGZvciBOTFNQQVRIPSwgYnV0IHdoeSBjb21wbGljYXRlIHRoZSBjb2RlIGZvciB0aGlzCi0gICAgIHBlYW51dHMuICAqLwotICBuZXdfdmFsX2xlbiA9IHNpemVvZiAoIk5MU1BBVEg9IikgLSAxICsgc3RybGVuIChkaXJuYW1lKQotCQkrIHNpemVvZiAoIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLQotICBvbGRfdmFsID0gZ2V0ZW52ICgiTkxTUEFUSCIpOwotICBpZiAob2xkX3ZhbCA9PSBOVUxMIHx8IG9sZF92YWxbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBvbGRfdmFsID0gTlVMTDsKLSAgICAgIG5ld192YWxfbGVuICs9IDEgKyBzaXplb2YgKExPQ0FMRURJUikgLSAxCi0JICAgICAgICAgICAgICsgc2l6ZW9mICgiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotICAgIH0KLSAgZWxzZQotICAgIG5ld192YWxfbGVuICs9IHN0cmxlbiAob2xkX3ZhbCk7Ci0KLSAgbmV3X3ZhbCA9IChjaGFyICopIG1hbGxvYyAobmV3X3ZhbF9sZW4pOwotICBpZiAobmV3X3ZhbCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0jIGlmIEhBVkVfU0VURU5WCi0gIGNwID0gbmV3X3ZhbDsKLSMgZWxzZQotICBjcCA9IHN0cGNweSAobmV3X3ZhbCwgIk5MU1BBVEg9Iik7Ci0jIGVuZGlmCi0KLSAgY3AgPSBzdHBjcHkgKGNwLCBkaXJuYW1lKTsKLSAgY3AgPSBzdHBjcHkgKGNwLCAiLyVML0xDX01FU1NBR0VTLyVOLmNhdDoiKTsKLQotICBpZiAob2xkX3ZhbCA9PSBOVUxMKQotICAgIHsKLSMgaWYgX19TVERDX18KLSAgICAgIHN0cGNweSAoY3AsIExPQ0FMRURJUiAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotIyBlbHNlCi0KLSAgICAgIGNwID0gc3RwY3B5IChjcCwgTE9DQUxFRElSKTsKLSAgICAgIHN0cGNweSAoY3AsICIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0jIGVuZGlmCi0gICAgfQotICBlbHNlCi0gICAgc3RwY3B5IChjcCwgb2xkX3ZhbCk7Ci0KLSMgaWYgSEFWRV9TRVRFTlYKLSAgc2V0ZW52ICgiTkxTUEFUSCIsIG5ld192YWwsIDEpOwotICBmcmVlIChuZXdfdmFsKTsKLSMgZWxzZQotICBwdXRlbnYgKG5ld192YWwpOwotICAvKiBEbyAqbm90KiBmcmVlIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB3ZSBqdXN0IGVudGVyZWQuICBJdCBpcyB1c2VkCi0gICAgIGZyb20gbm93IG9uLiAgICovCi0jIGVuZGlmCi0KLSNlbmRpZgotCi0gIHJldHVybiAoY2hhciAqKSBkb21haW5uYW1lOwotfQotCi0jdW5kZWYgZ2V0dGV4dAotY2hhciAqCi1nZXR0ZXh0IChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IG1zZ2lkOwotCi0gIGlmIChtc2cgPT0gTlVMTCB8fCBjYXRhbG9nID09IChubF9jYXRkKSAtMSkKLSAgICByZXR1cm4gKGNoYXIgKikgbXNnOwotCi0gIC8qIEdldCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBjYXRhbG9nLiAgV2UgYWx3YXlzIHVzZSBzZXQgbnVtYmVyIDEuCi0gICAgIFRoZSBtZXNzYWdlIElEIGlzIGNvbXB1dGVkIGJ5IHRoZSBmdW5jdGlvbiBgbXNnX3RvX2NhdF9pZCcKLSAgICAgd2hpY2ggd29ya3Mgb24gdGhlIHRhYmxlIGdlbmVyYXRlZCBieSBgcG8tdG8tdGJsJy4gICovCi0gIG1zZ2lkID0gbXNnX3RvX2NhdF9pZCAobXNnKTsKLSAgaWYgKG1zZ2lkID09IC0xKQotICAgIHJldHVybiAoY2hhciAqKSBtc2c7Ci0KLSAgcmV0dXJuIGNhdGdldHMgKGNhdGFsb2csIDEsIG1zZ2lkLCAoY2hhciAqKSBtc2cpOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHRhYmxlIGBfbXNnX3RibCcgd2hpY2ggaGFzIGBfbXNnX3RibF9sZW5ndGgnIGVudHJpZXMKLSAgIGZvciB0aGUgb25lIGVxdWFsIHRvIG1zZy4gIElmIGl0IGlzIGZvdW5kIHJldHVybiB0aGUgSUQuICBJbiBjYXNlIHdoZW4KLSAgIHRoZSBzdHJpbmcgaXMgbm90IGZvdW5kIHJldHVybiAtMS4gICovCi1zdGF0aWMgaW50Ci1tc2dfdG9fY2F0X2lkIChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IGNudDsKLQotICBmb3IgKGNudCA9IDA7IGNudCA8IF9tc2dfdGJsX2xlbmd0aDsgKytjbnQpCi0gICAgaWYgKHN0cmNtcCAobXNnLCBfbXNnX3RibFtjbnRdLl9tc2cpID09IDApCi0gICAgICByZXR1cm4gX21zZ190YmxbY250XS5fbXNnX251bWJlcjsKLQotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoZGVzdCwgc3JjKQotICAgICBjaGFyICpkZXN0OwotICAgICBjb25zdCBjaGFyICpzcmM7Ci17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWcuaW4gYi9pbnRsL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5MDQ5Yi4uMDAwMDAwMAotLS0gYS9pbnRsL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfQ0FUR0VUUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaSBsaWJyYXJ5ICgtbGkpLiAgKi8KLSN1bmRlZiBIQVZFX0xJQkkKZGlmZiAtLWdpdCBhL2ludGwvY29uZmlndXJlIGIvaW50bC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0MWVlYTAuLjAwMDAwMDAKLS0tIGEvaW50bC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUwICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1kZ2V0dGV4dC5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTYyOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTY6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjQ4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Nzc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDc5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3OTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MTc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjI6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjgzMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDY6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdDQz0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODc2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkwMzogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI0OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjkzNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk1NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwODI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwMzogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTExNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDM6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNzY6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjQ0OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZiBIQVZFX0FMTE9DQV9ICi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI3MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS5vCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzA0OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMzQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzg5OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDQ2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ4MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTMzOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjgxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3MTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE3MTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NDk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgwNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTgxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTAxOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MjE6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0MDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTY3OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5Nzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5NTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDMwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDQyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTU5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTk0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjY2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyNTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ1MzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDYzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBDQ0AlJENDJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLWFjX3NvdXJjZXM9IiRubHNfY3ZfaGVhZGVyX2xpYmd0IgotYWNfZGVzdHM9IiRubHNfY3ZfaGVhZGVyX2ludGwiCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKLXdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLSAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCi0gIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgotCi0gIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgotCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiAkYWNfZGVzdAotCi0gICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gIGVzYWMKLQotICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgotICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAotICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZG9uZQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9pbnRsL2NvbmZpZ3VyZS5pbiBiL2ludGwvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE5YzI0Li4wMDAwMDAwCi0tLSBhL2ludGwvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLUFDX0lOSVQoZGdldHRleHQuYykKLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1BTV9QUk9HX0lOU1RBTEwKLUNZX0dOVV9HRVRURVhUCi1BQ19MSU5LX0ZJTEVTKCRubHNfY3ZfaGVhZGVyX2xpYmd0LCAkbmxzX2N2X2hlYWRlcl9pbnRsKQotCi1BQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9pbnRsL2RjZ2V0dGV4dC5jIGIvaW50bC9kY2dldHRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNmJmZC4uMDAwMDAwMAotLS0gYS9pbnRsL2RjZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY2dldHRleHQoMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLSNpZm5kZWYgX19zZXRfZXJybm8KLSMgZGVmaW5lIF9fc2V0X2Vycm5vKHZhbCkgZXJybm8gPSAodmFsKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIF9HTlVfU09VUkNFCi0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBnZXRjd2QgX19nZXRjd2QKLSMgZGVmaW5lIHN0cGNweSBfX3N0cGNweQotI2Vsc2UKLSMgaWYgIWRlZmluZWQgSEFWRV9HRVRDV0QKLWNoYXIgKmdldHdkICgpOwotIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKLSMgZWxzZQotY2hhciAqZ2V0Y3dkICgpOwotIyBlbmRpZgotIyBpZm5kZWYgSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotLyogQW1vdW50IHRvIGluY3JlYXNlIGJ1ZmZlciBzaXplIGJ5IGluIGVhY2ggdHJ5LiAgKi8KLSNkZWZpbmUgUEFUSF9JTkNSIDMyCi0KLS8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLwotLyogTm9uLVBPU0lYIEJTRCBzeXN0ZW1zIG1pZ2h0IGhhdmUgZ2NjJ3MgbGltaXRzLmgsIHdoaWNoIGRvZXNuJ3QgZGVmaW5lCi0gICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKLSAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KLSNpZiBkZWZpbmVkKF9QT1NJWF9WRVJTSU9OKSB8fCAoZGVmaW5lZChIQVZFX0xJTUlUU19IKSAmJiAhZGVmaW5lZChfX0dOVUNfXykpCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCi0jIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKF9QQ19QQVRIX01BWCkKLSMgZGVmaW5lIFBBVEhfTUFYIChwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpIDwgMSA/IDEwMjQgOiBwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpKQotI2VuZGlmCi0KLS8qIERvbid0IGluY2x1ZGUgc3lzL3BhcmFtLmggaWYgaXQgYWxyZWFkeSBoYXMgYmVlbi4gICovCi0jaWYgZGVmaW5lZChIQVZFX1NZU19QQVJBTV9IKSAmJiAhZGVmaW5lZChQQVRIX01BWCkgJiYgIWRlZmluZWQoTUFYUEFUSExFTikKLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGRlZmluZSBQQVRIX01BWCBNQVhQQVRITEVOCi0jZW5kaWYKLQotI2lmbmRlZiBQQVRIX01BWAotIyBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCi0jZW5kaWYKLQotLyogWFBHMyBkZWZpbmVzIHRoZSByZXN1bHQgb2YgYHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpJyBhczoKLSAgIGBgRGlyZWN0cyBgc2V0bG9jYWxlKCknIHRvIHF1ZXJ5IGBjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotICAgICBzZXR0aW5nIG9mIGBsb2NhbCcuJycKLSAgIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZXhhY3QgZm9ybWF0LiAgQW5kIGV2ZW4gd29yc2U6IFBPU0lYCi0gICBkZWZpbmVzIHRoaXMgbm90IGF0IGFsbC4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQKLSAgIHN5c3RlbSAoZS5nLiB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKLSNlbmRpZgotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCi0gICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCi1jb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gPSAibWVzc2FnZXMiOwotCi0vKiBWYWx1ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGRvbWFpbiBmb3IgZ2V0dGV4dCgzKS4gICovCi1jb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotCi0vKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCi1jb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXSA9IEdOVUxPQ0FMRURJUjsKLQotLyogTGlzdCB3aXRoIGJpbmRpbmdzIG9mIHNwZWNpZmljIGRvbWFpbnMgY3JlYXRlZCBieSBiaW5kdGV4dGRvbWFpbigpCi0gICBjYWxscy4gICovCi1zdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjaGFyICpmaW5kX21zZyBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLQkJCSAgICAgICBjb25zdCBjaGFyICptc2dpZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNhdGVnb3J5X3RvX25hbWUgUEFSQU1TICgoaW50IGNhdGVnb3J5KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgUEFSQU1TICgoaW50IGNhdGVnb3J5LAotCQkJCQkJIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkpOwotCi0KLS8qIEZvciB0aG9zZSBsb29zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLSNpZmRlZiBIQVZFX0FMTE9DQQotLyogTm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCi0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLwotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLwotI2Vsc2UKLXN0cnVjdCBibG9ja19saXN0Ci17Ci0gIHZvaWQgKmFkZHJlc3M7Ci0gIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OwotfTsKLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCi0gICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCi0gICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAotICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAotICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCi0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCi0jZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIERDR0VUVEVYVCBkY2dldHRleHRfXwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWNoYXIgKgotRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0jaWZuZGVmIEhBVkVfQUxMT0NBCi0gIHN0cnVjdCBibG9ja19saXN0ICpibG9ja19saXN0ID0gTlVMTDsKLSNlbmRpZgotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW47Ci0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWU7Ci0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5dmFsdWU7Ci0gIGNoYXIgKmRpcm5hbWUsICp4ZG9tYWlubmFtZTsKLSAgY2hhciAqc2luZ2xlX2xvY2FsZTsKLSAgY2hhciAqcmV0dmFsOwotICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLQotICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KLSAgaWYgKG1zZ2lkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogSWYgRE9NQUlOTkFNRSBpcyBOVUxMLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGVmYXVsdCBkb21haW4uICBJZgotICAgICBDQVRFR09SWSBpcyBub3QgTENfTUVTU0FHRVMgdGhpcyBtaWdodCBub3QgbWFrZSBtdWNoIHNlbnNlIGJ1dCB0aGUKLSAgICAgZGVmaW50aW9uIGxlZnQgdGhpcyB1bmRlZmluZWQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIGRvbWFpbm5hbWUgPSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLwotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKLSAgICBkaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLSAgZWxzZSBpZiAoYmluZGluZy0+ZGlybmFtZVswXSA9PSAnLycpCi0gICAgZGlybmFtZSA9IGJpbmRpbmctPmRpcm5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgcmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUgbm93LiAgKi8KLSAgICAgIHNpemVfdCBkaXJuYW1lX2xlbiA9IHN0cmxlbiAoYmluZGluZy0+ZGlybmFtZSkgKyAxOwotICAgICAgc2l6ZV90IHBhdGhfbWF4OwotICAgICAgY2hhciAqcmV0OwotCi0gICAgICBwYXRoX21heCA9ICh1bnNpZ25lZCkgUEFUSF9NQVg7Ci0gICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KLQotICAgICAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7Ci0gICAgICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGRpcm5hbWUpOwotCi0gICAgICBfX3NldF9lcnJubyAoMCk7Ci0gICAgICB3aGlsZSAoKHJldCA9IGdldGN3ZCAoZGlybmFtZSwgcGF0aF9tYXgpKSA9PSBOVUxMICYmIGVycm5vID09IEVSQU5HRSkKLQl7Ci0JICBwYXRoX21heCArPSBQQVRIX0lOQ1I7Ci0JICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKLQkgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7Ci0JICBfX3NldF9lcnJubyAoMCk7Ci0JfQotCi0gICAgICBpZiAocmV0ID09IE5VTEwpCi0JewotCSAgLyogV2UgY2Fubm90IGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIERvbid0IHNpZ25hbCBhbgotCSAgICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KLQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0JICByZXR1cm4gKGNoYXIgKikgbXNnaWQ7Ci0JfQotCi0gICAgICBzdHBjcHkgKHN0cGNweSAoc3RyY2hyIChkaXJuYW1lLCAnXDAnKSwgIi8iKSwgYmluZGluZy0+ZGlybmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyBkZXRlcm1pbmUgdGhlIHN5bWJvbGljIG5hbWUgb2YgQ0FURUdPUlkgYW5kIGl0cyB2YWx1ZS4gICovCi0gIGNhdGVnb3J5bmFtZSA9IGNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KTsKLSAgY2F0ZWdvcnl2YWx1ZSA9IGd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKLQotICB4ZG9tYWlubmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeW5hbWUpCi0JCQkJICsgc3RybGVuIChkb21haW5uYW1lKSArIDUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKLQotICBzdHBjcHkgKHN0cGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAotCQkgIGRvbWFpbm5hbWUpLAotCSAgIi5tbyIpOwotCi0gIC8qIENyZWF0aW5nIHdvcmtpbmcgYXJlYS4gICovCi0gIHNpbmdsZV9sb2NhbGUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnl2YWx1ZSkgKyAxKTsKLSAgQUREX0JMT0NLIChibG9ja19saXN0LCBzaW5nbGVfbG9jYWxlKTsKLQotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGdpdmVuIHN0cmluZy4gIFRoaXMgaXMgYSBsb29wIGJlY2F1c2Ugd2UgcGVyaGFwcwotICAgICBnb3QgYW4gb3JkZXJlZCBsaXN0IG9mIGxhbmd1YWdlcyB0byBjb25zaWRlciBmb3IgdGggdHJhbnNsYXRpb24uICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCi0gICAgICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gPT0gJzonKQotCSsrY2F0ZWdvcnl2YWx1ZTsKLSAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCi0JewotCSAgLyogVGhlIHdob2xlIGNvbnRlbnRzIG9mIENBVEVHT1JZVkFMVUUgaGFzIGJlZW4gc2VhcmNoZWQgYnV0Ci0JICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCi0JICAgICBieSBpbXBsaWNpdGx5IGFwcGVuZGluZyBhICJDIiBlbnRyeSwgaS5lLiBubyB0cmFuc2xhdGlvbgotCSAgICAgd2lsbCB0YWtlIHBsYWNlLiAgKi8KLQkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7Ci0JICBzaW5nbGVfbG9jYWxlWzFdID0gJ1wwJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqY3AgPSBzaW5nbGVfbG9jYWxlOwotCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKLQkgICAgKmNwKysgPSAqY2F0ZWdvcnl2YWx1ZSsrOwotCSAgKmNwID0gJ1wwJzsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCi0JIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCi0JICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCi0JewotCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQkgIHJldHVybiAoY2hhciAqKSBtc2dpZDsKLQl9Ci0KLQotICAgICAgLyogRmluZCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBjYXRhbG9nIG1hdGNoaW5nIHRoZQotCSBET01BSU5OQU1FIGFuZCBDQVRFR09SWS4gICovCi0gICAgICBkb21haW4gPSBfbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIHNpbmdsZV9sb2NhbGUsIHhkb21haW5uYW1lKTsKLQotICAgICAgaWYgKGRvbWFpbiAhPSBOVUxMKQotCXsKLQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4sIG1zZ2lkKTsKLQotCSAgaWYgKHJldHZhbCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaW50IGNudDsKLQotCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQkJewotCQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBtc2dpZCk7Ci0KLQkJICBpZiAocmV0dmFsICE9IE5VTEwpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgICAgICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgICAgIHJldHVybiByZXR2YWw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2RjZ2V0dGV4dCwgZGNnZXR0ZXh0KTsKLSNlbmRpZgotCi0KLXN0YXRpYyBjaGFyICoKLWZpbmRfbXNnIChkb21haW5fZmlsZSwgbXNnaWQpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgc2l6ZV90IHRvcCwgYWN0LCBib3R0b207Ci0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47Ci0KLSAgaWYgKGRvbWFpbl9maWxlLT5kZWNpZGVkID09IDApCi0gICAgX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSk7Ci0KLSAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOwotCi0gIC8qIExvY2F0ZSB0aGUgTVNHSUQgYW5kIGl0cyB0cmFuc2xhdGlvbi4gICovCi0gIGlmIChkb21haW4tPmhhc2hfc2l6ZSA+IDIgJiYgZG9tYWluLT5oYXNoX3RhYiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFVzZSB0aGUgaGFzaGluZyB0YWJsZS4gICovCi0gICAgICBubHNfdWludDMyIGxlbiA9IHN0cmxlbiAobXNnaWQpOwotICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7Ci0gICAgICBubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7Ci0gICAgICBubHNfdWludDMyIGluY3IgPSAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOwotICAgICAgbmxzX3VpbnQzMiBuc3RyID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7Ci0KLSAgICAgIGlmIChuc3RyID09IDApCi0JLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ubGVuZ3RoKSA9PSBsZW4KLQkgICYmIHN0cmNtcCAobXNnaWQsCi0JCSAgICAgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgICAgIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLm9mZnNldCkpID09IDApCi0JcmV0dXJuIChjaGFyICopIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCQkgIGRvbWFpbi0+dHJhbnNfdGFiW25zdHIgLSAxXS5vZmZzZXQpOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKLQkgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKLQkgIGVsc2UKLQkgICAgaWR4ICs9IGluY3I7Ci0KLQkgIG5zdHIgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKLQkgIGlmIChuc3RyID09IDApCi0JICAgIC8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLwotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5sZW5ndGgpID09IGxlbgotCSAgICAgICYmIHN0cmNtcCAobXNnaWQsCi0JCQkgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJCSAgIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLm9mZnNldCkpCi0JICAgICAgICAgPT0gMCkKLQkgICAgcmV0dXJuIChjaGFyICopIGRvbWFpbi0+ZGF0YQotCSAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW25zdHIgLSAxXS5vZmZzZXQpOwotCX0KLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0KLSAgLyogTm93IHdlIHRyeSB0aGUgZGVmYXVsdCBtZXRob2Q6ICBiaW5hcnkgc2VhcmNoIGluIHRoZSBzb3J0ZWQKLSAgICAgYXJyYXkgb2YgbWVzc2FnZXMuICAqLwotICBib3R0b20gPSAwOwotICB0b3AgPSBkb21haW4tPm5zdHJpbmdzOwotICB3aGlsZSAoYm90dG9tIDwgdG9wKQotICAgIHsKLSAgICAgIGludCBjbXBfdmFsOwotCi0gICAgICBhY3QgPSAoYm90dG9tICsgdG9wKSAvIDI7Ci0gICAgICBjbXBfdmFsID0gc3RyY21wIChtc2dpZCwgZG9tYWluLT5kYXRhCi0JCQkgICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkgICAgZG9tYWluLT5vcmlnX3RhYlthY3RdLm9mZnNldCkpOwotICAgICAgaWYgKGNtcF92YWwgPCAwKQotCXRvcCA9IGFjdDsKLSAgICAgIGVsc2UgaWYgKGNtcF92YWwgPiAwKQotCWJvdHRvbSA9IGFjdCArIDE7Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0gIC8qIElmIGFuIHRyYW5zbGF0aW9uIGlzIGZvdW5kIHJldHVybiB0aGlzLiAgKi8KLSAgcmV0dXJuIGJvdHRvbSA+PSB0b3AgPyBOVUxMIDogKGNoYXIgKikgZG9tYWluLT5kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgICBkb21haW4tPnRyYW5zX3RhYlthY3RdLm9mZnNldCk7Ci19Ci0KLQotLyogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBsb2NhbGUgQ0FURUdPUlkuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpCi0gICAgIGludCBjYXRlZ29yeTsKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0gIHN3aXRjaCAoY2F0ZWdvcnkpCi0gIHsKLSNpZmRlZiBMQ19DT0xMQVRFCi0gIGNhc2UgTENfQ09MTEFURToKLSAgICByZXR2YWwgPSAiTENfQ09MTEFURSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19DVFlQRQotICBjYXNlIExDX0NUWVBFOgotICAgIHJldHZhbCA9ICJMQ19DVFlQRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19NT05FVEFSWQotICBjYXNlIExDX01PTkVUQVJZOgotICAgIHJldHZhbCA9ICJMQ19NT05FVEFSWSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19OVU1FUklDCi0gIGNhc2UgTENfTlVNRVJJQzoKLSAgICByZXR2YWwgPSAiTENfTlVNRVJJQyI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19USU1FCi0gIGNhc2UgTENfVElNRToKLSAgICByZXR2YWwgPSAiTENfVElNRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19NRVNTQUdFUwotICBjYXNlIExDX01FU1NBR0VTOgotICAgIHJldHZhbCA9ICJMQ19NRVNTQUdFUyI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19SRVNQT05TRQotICBjYXNlIExDX1JFU1BPTlNFOgotICAgIHJldHZhbCA9ICJMQ19SRVNQT05TRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19BTEwKLSAgY2FzZSBMQ19BTEw6Ci0gICAgLyogVGhpcyBtaWdodCBub3QgbWFrZSBzZW5zZSBidXQgaXMgcGVyaGFwcyBiZXR0ZXIgdGhhbiBhbnkgb3RoZXIKLSAgICAgICB2YWx1ZS4gICovCi0gICAgcmV0dmFsID0gIkxDX0FMTCI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICAvKiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGZvciBhIGRlZmF1bHQgdmFsdWUgbGV0IG1lIGtub3cuICAqLwotICAgIHJldHZhbCA9ICJMQ19YWFgiOwotICB9Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogR3Vlc3MgdmFsdWUgb2YgY3VycmVudCBsb2NhbGUgZnJvbSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKQotICAgICBpbnQgY2F0ZWdvcnk7Ci0gICAgIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0gIC8qIFRoZSBoaWdoZXN0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50Ci0gICAgIHZhcmlhYmxlLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBgTEFOR1VBR0UnIGlzIG5vdCBzZXQuICBTbyB3ZSBoYXZlIHRvIHByb2NlZWQgd2l0aCB0aGUgUE9TSVgKLSAgICAgbWV0aG9kcyBvZiBsb29raW5nIHRvIGBMQ19BTEwnLCBgTENfeHh4JywgYW5kIGBMQU5HJy4gIE9uIHNvbWUKLSAgICAgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZSBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLwotI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAotICByZXR1cm4gc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCk7Ci0jZWxzZQotICAvKiBTZXR0aW5nIG9mIExDX0FMTCBvdmVyd3JpdGVzIGFsbCBvdGhlci4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBOZXh0IGNvbWVzIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNhdGVnb3J5LiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52IChjYXRlZ29yeW5hbWUpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBMYXN0IHBvc3NpYmlsaXR5IGlzIHRoZSBMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFORyIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBXZSB1c2UgQyBhcyB0aGUgZGVmYXVsdCBkb21haW4uICBQT1NJWCBzYXlzIHRoaXMgaXMgaW1wbGVtZW50YXRpb24KLSAgICAgZGVmaW5lZC4gICovCi0gIHJldHVybiAiQyI7Ci0jZW5kaWYKLX0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoZGVzdCwgc3JjKQotICAgICBjaGFyICpkZXN0OwotICAgICBjb25zdCBjaGFyICpzcmM7Ci17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9kZ2V0dGV4dC5jIGIvaW50bC9kZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmRlNjc3Li4wMDAwMDAwCi0tLSBhL2ludGwvZGdldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIGRnZXR0ZXh0LmMgLS0gaW1wbGVtZW50YXRpb24gb2YgdGhlIGRnZXR0ZXh0KDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgREdFVFRFWFQgX19kZ2V0dGV4dAotIyBkZWZpbmUgRENHRVRURVhUIF9fZGNnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgREdFVFRFWFQgZGdldHRleHRfXwotIyBkZWZpbmUgRENHRVRURVhUIGRjZ2V0dGV4dF9fCi0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1jaGFyICoKLURHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBEQ0dFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUyk7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2RnZXR0ZXh0LCBkZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZXhwbG9kZW5hbWUuYyBiL2ludGwvZXhwbG9kZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjNDZlOS4uMDAwMDAwMAotLS0gYS9pbnRsL2V4cGxvZGVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KLSNpZm5kZWYgTlVMTAotIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgZWxzZQotIyAgZGVmaW5lIE5VTEwgMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotaW50Ci1fbmxfZXhwbG9kZV9uYW1lIChuYW1lLCBsYW5ndWFnZSwgbW9kaWZpZXIsIHRlcnJpdG9yeSwgY29kZXNldCwKLQkJICBub3JtYWxpemVkX2NvZGVzZXQsIHNwZWNpYWwsIHNwb25zb3IsIHJldmlzaW9uKQotICAgICBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICoqbGFuZ3VhZ2U7Ci0gICAgIGNvbnN0IGNoYXIgKiptb2RpZmllcjsKLSAgICAgY29uc3QgY2hhciAqKnRlcnJpdG9yeTsKLSAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipzcGVjaWFsOwotICAgICBjb25zdCBjaGFyICoqc3BvbnNvcjsKLSAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uOwotewotICBlbnVtIHsgdW5kZWNpZGVkLCB4cGcsIGNlbiB9IHN5bnRheDsKLSAgY2hhciAqY3A7Ci0gIGludCBtYXNrOwotCi0gICptb2RpZmllciA9IE5VTEw7Ci0gICp0ZXJyaXRvcnkgPSBOVUxMOwotICAqY29kZXNldCA9IE5VTEw7Ci0gICpub3JtYWxpemVkX2NvZGVzZXQgPSBOVUxMOwotICAqc3BlY2lhbCA9IE5VTEw7Ci0gICpzcG9uc29yID0gTlVMTDsKLSAgKnJldmlzaW9uID0gTlVMTDsKLQotICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKLSAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nIGFuZCBgQCcgaWYKLSAgICAgd2UgdXNlIFhQRzQgc3R5bGUsIGFuZCBgXycsIGArJywgYW5kIGAsJyBpZiB3ZSB1c2UgQ0VOIHN5bnRheC4gICovCi0gIG1hc2sgPSAwOwotICBzeW50YXggPSB1bmRlY2lkZWQ7Ci0gICpsYW5ndWFnZSA9IGNwID0gbmFtZTsKLSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ18nICYmIGNwWzBdICE9ICdAJwotCSAmJiBjcFswXSAhPSAnKycgJiYgY3BbMF0gIT0gJywnKQotICAgICsrY3A7Ci0KLSAgaWYgKCpsYW5ndWFnZSA9PSBjcCkKLSAgICAvKiBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2U6IGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQuICBVc2UKLSAgICAgICB0aGlzIGVudHJ5IGFzIGl0IGlzIHdpdGhvdXQgZXhwbG9kaW5nLiAgUGVyaGFwcyBpdCBpcyBhbiBhbGlhcy4gICovCi0gICAgY3AgPSBzdHJjaHIgKCpsYW5ndWFnZSwgJ1wwJyk7Ci0gIGVsc2UgaWYgKGNwWzBdID09ICdfJykKLSAgICB7Ci0gICAgICAvKiBOZXh0IGlzIHRoZSB0ZXJyaXRvcnkuICAqLwotICAgICAgY3BbMF0gPSAnXDAnOwotICAgICAgKnRlcnJpdG9yeSA9ICsrY3A7Ci0KLSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcuJyAmJiBjcFswXSAhPSAnQCcKLQkgICAgICYmIGNwWzBdICE9ICcrJyAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQotCSsrY3A7Ci0KLSAgICAgIG1hc2sgfD0gVEVSUklUT1JZOwotCi0gICAgICBpZiAoY3BbMF0gPT0gJy4nKQotCXsKLQkgIC8qIE5leHQgaXMgdGhlIGNvZGVzZXQuICAqLwotCSAgc3ludGF4ID0geHBnOwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKmNvZGVzZXQgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnQCcpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gWFBHX0NPREVTRVQ7Ci0KLQkgIGlmICgqY29kZXNldCAhPSBjcCAmJiAoKmNvZGVzZXQpWzBdICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gX25sX25vcm1hbGl6ZV9jb2Rlc2V0ICgqY29kZXNldCwKLQkJCQkJCQkgICBjcCAtICpjb2Rlc2V0KTsKLQkgICAgICBpZiAoc3RyY21wICgqY29kZXNldCwgKm5vcm1hbGl6ZWRfY29kZXNldCkgPT0gMCkKLQkJZnJlZSAoKGNoYXIgKikgKm5vcm1hbGl6ZWRfY29kZXNldCk7Ci0JICAgICAgZWxzZQotCQltYXNrIHw9IFhQR19OT1JNX0NPREVTRVQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChjcFswXSA9PSAnQCcgfHwgKHN5bnRheCAhPSB4cGcgJiYgY3BbMF0gPT0gJysnKSkKLSAgICB7Ci0gICAgICAvKiBOZXh0IGlzIHRoZSBtb2RpZmllci4gICovCi0gICAgICBzeW50YXggPSBjcFswXSA9PSAnQCcgPyB4cGcgOiBjZW47Ci0gICAgICBjcFswXSA9ICdcMCc7Ci0gICAgICAqbW9kaWZpZXIgPSArK2NwOwotCi0gICAgICB3aGlsZSAoc3ludGF4ID09IGNlbiAmJiBjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcrJwotCSAgICAgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkrK2NwOwotCi0gICAgICBtYXNrIHw9IFhQR19NT0RJRklFUiB8IENFTl9BVURJRU5DRTsKLSAgICB9Ci0KLSAgaWYgKHN5bnRheCAhPSB4cGcgJiYgKGNwWzBdID09ICcrJyB8fCBjcFswXSA9PSAnLCcgfHwgY3BbMF0gPT0gJ18nKSkKLSAgICB7Ci0gICAgICBzeW50YXggPSBjZW47Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnKycpCi0JewotIAkgIC8qIE5leHQgaXMgc3BlY2lhbCBhcHBsaWNhdGlvbiAoQ0VOIHN5bnRheCkuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKnNwZWNpYWwgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IENFTl9TUEVDSUFMOwotCX0KLQotICAgICAgaWYgKGNwWzBdID09ICcsJykKLQl7Ci0gCSAgLyogTmV4dCBpcyBzcG9uc29yIChDRU4gc3ludGF4KS4gICovCi0JICBjcFswXSA9ICdcMCc7Ci0JICAqc3BvbnNvciA9ICsrY3A7Ci0KLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdfJykKLQkgICAgKytjcDsKLQotCSAgbWFzayB8PSBDRU5fU1BPTlNPUjsKLQl9Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnXycpCi0JewotIAkgIC8qIE5leHQgaXMgcmV2aXNpb24gKENFTiBzeW50YXgpLiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpyZXZpc2lvbiA9ICsrY3A7Ci0KLQkgIG1hc2sgfD0gQ0VOX1JFVklTSU9OOwotCX0KLSAgICB9Ci0KLSAgLyogRm9yIENFTiBzeW50YXggdmFsdWVzIGl0IG1pZ2h0IGJlIGltcG9ydGFudCB0byBoYXZlIHRoZQotICAgICBzZXBhcmF0b3IgY2hhcmFjdGVyIGluIHRoZSBmaWxlIG5hbWUsIG5vdCBmb3IgWFBHIHN5bnRheC4gICovCi0gIGlmIChzeW50YXggPT0geHBnKQotICAgIHsKLSAgICAgIGlmICgqdGVycml0b3J5ICE9IE5VTEwgJiYgKCp0ZXJyaXRvcnkpWzBdID09ICdcMCcpCi0JbWFzayAmPSB+VEVSUklUT1JZOwotCi0gICAgICBpZiAoKmNvZGVzZXQgIT0gTlVMTCAmJiAoKmNvZGVzZXQpWzBdID09ICdcMCcpCi0JbWFzayAmPSB+WFBHX0NPREVTRVQ7Ci0KLSAgICAgIGlmICgqbW9kaWZpZXIgIT0gTlVMTCAmJiAoKm1vZGlmaWVyKVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflhQR19NT0RJRklFUjsKLSAgICB9Ci0KLSAgcmV0dXJuIG1hc2s7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2ZpbmRkb21haW4uYyBiL2ludGwvZmluZGRvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg1ZDRkLi4wMDAwMDAwCi0tLSBhL2ludGwvZmluZGRvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qIEhhbmRsZSBsaXN0IG9mIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0vKiBMaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMuICAqLwotc3RhdGljIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9sb2FkZWRfZG9tYWluczsKLQotCi0vKiBSZXR1cm4gYSBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgZGVzY3JpYmVkIGJ5Ci0gICB0aGUgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkgcGFyYW1ldGVycyB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnRseQotICAgZXN0YWJsaXNoZWQgYmluZGluZ3MuICAqLwotc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi1fbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIGxvY2FsZSwgZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLSAgICAgY2hhciAqbG9jYWxlOwotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7Ci0gIGNvbnN0IGNoYXIgKmxhbmd1YWdlOwotICBjb25zdCBjaGFyICptb2RpZmllcjsKLSAgY29uc3QgY2hhciAqdGVycml0b3J5OwotICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQ7Ci0gIGNvbnN0IGNoYXIgKnNwZWNpYWw7Ci0gIGNvbnN0IGNoYXIgKnNwb25zb3I7Ci0gIGNvbnN0IGNoYXIgKnJldmlzaW9uOwotICBjb25zdCBjaGFyICphbGlhc192YWx1ZTsKLSAgaW50IG1hc2s7Ci0KLSAgLyogTE9DQUxFIGNhbiBjb25zaXN0IG9mIHVwIHRvIGZvdXIgcmVjb2duaXplZCBwYXJ0cyBmb3IgdGhlIFhQRyBzeW50YXg6Ci0KLQkJbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0KLQotICAgICBhbmQgc2l4IHBhcnRzIGZvciB0aGUgQ0VOIHN5bnRheDoKLQotCWxhbmd1YWdlW190ZXJyaXRvcnldWythdWRpZW5jZV1bK3NwZWNpYWxdWyxbc3BvbnNvcl1bX3JldmlzaW9uXV0KLQotICAgICBCZXNpZGUgdGhlIGZpcnN0IGFsbCBvZiB0aGVtIGFyZSBhbGxvd2VkIHRvIGJlIG1pc3NpbmcuICBJZiB0aGUKLSAgICAgZnVsbCBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZCwgdGhlIGxlc3Mgc3BlY2lmaWMgb25lIGFyZQotICAgICBsb29rZWQgZm9yLiAgVGhlIHZhcmlvdXMgcGFydCB3aWxsIGJlIHN0cmlwcGVkIG9mIGFjY29yZGluZyB0bwotICAgICB0aGUgZm9sbG93aW5nIG9yZGVyOgotCQkoMSkgcmV2aXNpb24KLQkJKDIpIHNwb25zb3IKLQkJKDMpIHNwZWNpYWwKLQkJKDQpIGNvZGVzZXQKLQkJKDUpIG5vcm1hbGl6ZWQgY29kZXNldAotCQkoNikgdGVycml0b3J5Ci0JCSg3KSBhdWRpZW5jZS9tb2RpZmllcgotICAgKi8KLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgdGVzdGVkIGZvciB0aGlzIGxvY2FsZSBlbnRyeSB0aGVyZSBoYXMgdG8KLSAgICAgYmUgb25lIGRhdGEgc2V0IGluIHRoZSBsaXN0IG9mIGxvYWRlZCBkb21haW5zLiAgKi8KLSAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAotCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCAwLCBsb2NhbGUsIE5VTEwsIE5VTEwsCi0JCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgZG9tYWlubmFtZSwgMCk7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGlzIGxvY2FsZS4gICovCi0gICAgICBpbnQgY250OwotCi0gICAgICBpZiAocmV0dmFsLT5kZWNpZGVkID09IDApCi0JX25sX2xvYWRfZG9tYWluIChyZXR2YWwpOwotCi0gICAgICBpZiAocmV0dmFsLT5kYXRhICE9IE5VTEwpCi0JcmV0dXJuIHJldHZhbDsKLQotICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotCXsKLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCi0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSk7Ci0KLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIHJldHVybiBjbnQgPj0gMCA/IHJldHZhbCA6IE5VTEw7Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgfQotCi0gIC8qIFNlZSB3aGV0aGVyIHRoZSBsb2NhbGUgdmFsdWUgaXMgYW4gYWxpYXMuICBJZiB5ZXMgaXRzIHZhbHVlCi0gICAgICpvdmVyd3JpdGVzKiB0aGUgYWxpYXMgbmFtZS4gIE5vIHRlc3QgZm9yIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcwotICAgICBkb25lLiAgKi8KLSAgYWxpYXNfdmFsdWUgPSBfbmxfZXhwYW5kX2FsaWFzIChsb2NhbGUpOwotICBpZiAoYWxpYXNfdmFsdWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChhbGlhc192YWx1ZSkgKyAxOwotICAgICAgbG9jYWxlID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBtZW1jcHkgKGxvY2FsZSwgYWxpYXNfdmFsdWUsIGxlbik7Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBkZXRlcm1pbmUgdGhlIHNpbmdsZSBwYXJ0cyBvZiB0aGUgbG9jYWxlIG5hbWUuICBGaXJzdAotICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycgYW5kIGBAJyBpZgotICAgICB3ZSB1c2UgWFBHNCBzdHlsZSwgYW5kIGBfJywgYCsnLCBhbmQgYCwnIGlmIHdlIHVzZSBDRU4gc3ludGF4LiAgKi8KLSAgbWFzayA9IF9ubF9leHBsb2RlX25hbWUgKGxvY2FsZSwgJmxhbmd1YWdlLCAmbW9kaWZpZXIsICZ0ZXJyaXRvcnksCi0JCQkgICAmY29kZXNldCwgJm5vcm1hbGl6ZWRfY29kZXNldCwgJnNwZWNpYWwsCi0JCQkgICAmc3BvbnNvciwgJnJldmlzaW9uKTsKLQotICAvKiBDcmVhdGUgYWxsIHBvc3NpYmxlIGxvY2FsZSBlbnRyaWVzIHdoaWNoIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4KLSAgICAgZ2VuZXJhbGl6YXRpb24uICAqLwotICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCi0JCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIG1hc2ssIGxhbmd1YWdlLCB0ZXJyaXRvcnksCi0JCQkgICAgICAgY29kZXNldCwgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJCSAgICAgICBzcG9uc29yLCByZXZpc2lvbiwgZG9tYWlubmFtZSwgMSk7Ci0gIGlmIChyZXR2YWwgPT0gTlVMTCkKLSAgICAvKiBUaGlzIG1lYW5zIHdlIGFyZSBvdXQgb2YgY29yZS4gICovCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQotICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsKTsKLSAgaWYgKHJldHZhbC0+ZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGludCBjbnQ7Ci0gICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JewotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKLQkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdKTsKLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIHJvb20gZm9yIGFuIGFsaWFzIHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICBGcmVlIGl0IG5vdy4gICovCi0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotICAgIGZyZWUgKGxvY2FsZSk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2ludGwvZ2V0dGV4dC5jIGIvaW50bC9nZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzZkMjEuLjAwMDAwMDAKLS0tIGEvaW50bC9nZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgX19uZWVkX05VTEwKLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotIyBpZmRlZiBTVERDX0hFQURFUlMKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCi0jIGVsc2UKLSMgIGlmZGVmIEhBVkVfU1RSSU5HX0gKLSMgICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGVsc2UKLSMgICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgR0VUVEVYVCBfX2dldHRleHQKLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKLSNlbHNlCi0jIGRlZmluZSBHRVRURVhUIGdldHRleHRfXwotIyBkZWZpbmUgREdFVFRFWFQgZGdldHRleHRfXwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotY2hhciAqCi1HRVRURVhUIChtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBER0VUVEVYVCAoTlVMTCwgbXNnaWQpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19nZXR0ZXh0LCBnZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9nZXR0ZXh0LmggYi9pbnRsL2dldHRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0YjllMy4uMDAwMDAwMAotLS0gYS9pbnRsL2dldHRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKiBJbnRlcm5hbCBoZWFkZXIgZm9yIEdOVSBnZXR0ZXh0IGludGVybmF0aW9uYWxpemF0aW9uIGZ1bmN0aW9ucwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi0gICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVFRFWFRfSAotI2RlZmluZSBfR0VUVEVYVF9IIDEKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBIQVZFX0xJTUlUU19IIHx8IF9MSUJDCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQuICAqLwotI2RlZmluZSBfTUFHSUMgMHg5NTA0MTJkZQotI2RlZmluZSBfTUFHSUNfU1dBUFBFRCAweGRlMTIwNDk1Ci0KLS8qIFJldmlzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudGx5IHVzZWQgLm1vIChiaW5hcnkpIGZpbGUgZm9ybWF0LiAgKi8KLSNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSIDAKLQotLyogVGhlIGZvbGxvd2luZyBjb250b3J0aW9ucyBhcmUgYW4gYXR0ZW1wdCB0byB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yCi0gICB0byBkZXRlcm1pbmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIDMyIGJpdHMgd2lkZS4gIEFuCi0gICBhbHRlcm5hdGl2ZSBhcHByb2FjaCBpcyB0byB1c2UgYXV0b2NvbmYncyBBQ19DSEVDS19TSVpFT0YgbWFjcm8sIGJ1dAotICAgZG9pbmcgdGhhdCB3b3VsZCByZXF1aXJlIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY29tcGlsZSBhbmQgKnJ1bioKLSAgIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZS4gIExvY2FsbHkgcnVubmluZyBjcm9zcy1jb21waWxlZCBleGVjdXRhYmxlcwotICAgaXMgdXN1YWxseSBub3QgcG9zc2libGUuICAqLwotCi0jaWYgX19TVERDX18KLSMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgNDI5NDk2NzI5NVUKLSNlbHNlCi0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKLSNlbmRpZgotCi0vKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgotICAgVGhpcyBzaG91bGQgYmUgdmFsaWQgZm9yIGFsbCBzeXN0ZW1zIEdOVSBjYXJlcyBhYm91dCBiZWNhdXNlCi0gICB0aGF0IGRvZXNuJ3QgaW5jbHVkZSAxNi1iaXQgc3lzdGVtcywgYW5kIG9ubHkgbW9kZXJuIHN5c3RlbXMKLSAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCi0KLSNpZm5kZWYgVUlOVF9NQVgKLSMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKLSNlbmRpZgotCi0jaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotdHlwZWRlZiB1bnNpZ25lZCBubHNfdWludDMyOwotI2Vsc2UKLSMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgbmxzX3VpbnQzMjsKLSMgZWxzZQotIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBubHNfdWludDMyOwotIyAgZWxzZQotICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKLSAgICAgbm90IHBvcnRhYmxlIGVub3VnaC4gICovCi0gICJDYW5ub3QgZGV0ZXJtaW5lIHVuc2lnbmVkIDMyLWJpdCBkYXRhIHR5cGUuIgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0KLS8qIEhlYWRlciBmb3IgYmluYXJ5IC5tbyBmaWxlIGZvcm1hdC4gICovCi1zdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKLXsKLSAgLyogVGhlIG1hZ2ljIG51bWJlci4gICovCi0gIG5sc191aW50MzIgbWFnaWM7Ci0gIC8qIFRoZSByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0LiAgKi8KLSAgbmxzX3VpbnQzMiByZXZpc2lvbjsKLSAgLyogVGhlIG51bWJlciBvZiBzdHJpbmdzIHBhaXJzLiAgKi8KLSAgbmxzX3VpbnQzMiBuc3RyaW5nczsKLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KLSAgbmxzX3VpbnQzMiBvcmlnX3RhYl9vZmZzZXQ7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRpb24gc3RyaW5ncy4gICovCi0gIG5sc191aW50MzIgdHJhbnNfdGFiX29mZnNldDsKLSAgLyogU2l6ZSBvZiBoYXNoaW5nIHRhYmxlLiAgKi8KLSAgbmxzX3VpbnQzMiBoYXNoX3RhYl9zaXplOwotICAvKiBPZmZzZXQgb2YgZmlyc3QgaGFzaGluZyBlbnRyeS4gICovCi0gIG5sc191aW50MzIgaGFzaF90YWJfb2Zmc2V0OwotfTsKLQotc3RydWN0IHN0cmluZ19kZXNjCi17Ci0gIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLiAgKi8KLSAgbmxzX3VpbnQzMiBsZW5ndGg7Ci0gIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCi0gIG5sc191aW50MzIgb2Zmc2V0OwotfTsKLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLSNlbmRpZgkvKiBnZXR0ZXh0LmggICovCmRpZmYgLS1naXQgYS9pbnRsL2dldHRleHRQLmggYi9pbnRsL2dldHRleHRQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOGQ1NTIuLjAwMDAwMDAKLS0tIGEvaW50bC9nZXR0ZXh0UC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogSGVhZGVyIGRlc2NyaWJpbmcgaW50ZXJuYWxzIG9mIGdldHRleHQgbGlicmFyeQotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRURVhUUF9ICi0jZGVmaW5lIF9HRVRURVhUUF9ICi0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgVwotIyBkZWZpbmUgVyhmbGFnLCBkYXRhKSAoKGZsYWcpID8gU1dBUCAoZGF0YSkgOiAoZGF0YSkpCi0jZW5kaWYKLQotCi1zdGF0aWMgbmxzX3VpbnQzMiBTV0FQIFBBUkFNUyAoKG5sc191aW50MzIgaSkpOwotCi1zdGF0aWMgaW5saW5lIG5sc191aW50MzIKLVNXQVAgKGkpCi0gICAgIG5sc191aW50MzIgaTsKLXsKLSAgcmV0dXJuIChpIDw8IDI0KSB8ICgoaSAmIDB4ZmYwMCkgPDwgOCkgfCAoKGkgPj4gOCkgJiAweGZmMDApIHwgKGkgPj4gMjQpOwotfQotCi0KLXN0cnVjdCBsb2FkZWRfZG9tYWluCi17Ci0gIGNvbnN0IGNoYXIgKmRhdGE7Ci0gIGludCBtdXN0X3N3YXA7Ci0gIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqb3JpZ190YWI7Ci0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqdHJhbnNfdGFiOwotICBubHNfdWludDMyIGhhc2hfc2l6ZTsKLSAgbmxzX3VpbnQzMiAqaGFzaF90YWI7Ci19OwotCi1zdHJ1Y3QgYmluZGluZwotewotICBzdHJ1Y3QgYmluZGluZyAqbmV4dDsKLSAgY2hhciAqZG9tYWlubmFtZTsKLSAgY2hhciAqZGlybmFtZTsKLX07Ci0KLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9maW5kX2RvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2Rpcm5hbWUsCi0JCQkJCQkgY2hhciAqX19sb2NhbGUsCi0JCQkJCQkgY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci12b2lkIF9ubF9sb2FkX2RvbWFpbiBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfX2RvbWFpbikpOwotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotI2VuZGlmIC8qIGdldHRleHRQLmggICovCmRpZmYgLS1naXQgYS9pbnRsL2hhc2gtc3RyaW5nLmggYi9pbnRsL2hhc2gtc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NmU4NDEuLjAwMDAwMDAKLS0tIGEvaW50bC9oYXNoLXN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogSW1wbGVtZW50cyBhIHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi0gICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX1ZBTFVFU19ICi0jIGluY2x1ZGUgPHZhbHVlcy5oPgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoQXJncykgQXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKEFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgYXNzdW1lIHRvIGhhdmUgYHVuc2lnbmVkIGxvbmcgaW50JyB2YWx1ZSB3aXRoIGF0IGxlYXN0IDMyIGJpdHMuICAqLwotI2RlZmluZSBIQVNIV09SREJJVFMgMzIKLQotCi0vKiBEZWZpbmVzIHRoZSBzbyBjYWxsZWQgYGhhc2hwancnIGZ1bmN0aW9uIGJ5IFAuSi4gV2VpbmJlcmdlcgotICAgW3NlZSBBaG8vU2V0aGkvVWxsbWFuLCBDT01QSUxFUlM6IFByaW5jaXBsZXMsIFRlY2huaXF1ZXMgYW5kIFRvb2xzLAotICAgMTk4NiwgMTk4NyBCZWxsIFRlbGVwaG9uZSBMYWJvcmF0b3JpZXMsIEluYy5dICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaGFzaF9zdHJpbmcgUEFSQU1TICgoY29uc3QgY2hhciAqX19zdHJfcGFyYW0pKTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1oYXNoX3N0cmluZyAoc3RyX3BhcmFtKQotICAgICBjb25zdCBjaGFyICpzdHJfcGFyYW07Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwsIGc7Ci0gIGNvbnN0IGNoYXIgKnN0ciA9IHN0cl9wYXJhbTsKLQotICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgKi8KLSAgaHZhbCA9IDA7Ci0gIHdoaWxlICgqc3RyICE9ICdcMCcpCi0gICAgewotICAgICAgaHZhbCA8PD0gNDsKLSAgICAgIGh2YWwgKz0gKHVuc2lnbmVkIGxvbmcpICpzdHIrKzsKLSAgICAgIGcgPSBodmFsICYgKCh1bnNpZ25lZCBsb25nKSAweGYgPDwgKEhBU0hXT1JEQklUUyAtIDQpKTsKLSAgICAgIGlmIChnICE9IDApCi0JewotCSAgaHZhbCBePSBnID4+IChIQVNIV09SREJJVFMgLSA4KTsKLQkgIGh2YWwgXj0gZzsKLQl9Ci0gICAgfQotICByZXR1cm4gaHZhbDsKLX0KZGlmZiAtLWdpdCBhL2ludGwvaW50bC1jb21wYXQuYyBiL2ludGwvaW50bC1jb21wYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZWZhMC4uMDAwMDAwMAotLS0gYS9pbnRsL2ludGwtY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKiBpbnRsLWNvbXBhdC5jIC0gU3R1YiBmdW5jdGlvbnMgdG8gY2FsbCBnZXR0ZXh0IGZ1bmN0aW9ucyBmcm9tIEdOVSBnZXR0ZXh0Ci0gICBMaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmdldHRleHQuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0KLSN1bmRlZiBnZXR0ZXh0Ci0jdW5kZWYgZGdldHRleHQKLSN1bmRlZiBkY2dldHRleHQKLSN1bmRlZiB0ZXh0ZG9tYWluCi0jdW5kZWYgYmluZHRleHRkb21haW4KLQotCi1jaGFyICoKLWJpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotewotICByZXR1cm4gYmluZHRleHRkb21haW5fXyAoZG9tYWlubmFtZSwgZGlybmFtZSk7Ci19Ci0KLQotY2hhciAqCi1kY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci0gICAgIGludCBjYXRlZ29yeTsKLXsKLSAgcmV0dXJuIGRjZ2V0dGV4dF9fIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOwotfQotCi0KLWNoYXIgKgotZGdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIGRnZXR0ZXh0X18gKGRvbWFpbm5hbWUsIG1zZ2lkKTsKLX0KLQotCi1jaGFyICoKLWdldHRleHQgKG1zZ2lkKQotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIGdldHRleHRfXyAobXNnaWQpOwotfQotCi0KLWNoYXIgKgotdGV4dGRvbWFpbiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgcmV0dXJuIHRleHRkb21haW5fXyAoZG9tYWlubmFtZSk7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2ludGxoLmluc3QuaW4gYi9pbnRsL2ludGxoLmluc3QuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDMyM2MuLjAwMDAwMDAKLS0tIGEvaW50bC9pbnRsaC5pbnN0LmluCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCSU5UTF9ICi0jZGVmaW5lIF9MSUJJTlRMX0gJMQotCi1ASU5DTFVERV9MT0NBTEVfSEAKLQotLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCi0gICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KLSNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotZXh0ZXJuIGNoYXIgKmdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkY2dldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotCQkJCWludCBfX2NhdGVnb3J5KSk7Ci0KLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1leHRlcm4gY2hhciAqdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci0KLQotLyogT3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gICovCi0jaWYgZGVmaW5lZCBfX09QVElNSVpFRAotLyogVGhlc2UgbXVzdCBiZSBhIG1hY3JvLiAgSW5saW5lZCBmdW5jdGlvbnMgYXJlIHVzZWxlc3MgYmVjYXVzZSB0aGUKLSAgIGBfX2J1aWx0aW5fY29uc3RhbnRfcCcgcHJlZGljYXRlIGluIGRjZ2V0dGV4dCB3b3VsZCBhbHdheXMgcmV0dXJuCi0gICBmYWxzZS4gICovCi0KLSMgZGVmaW5lIGdldHRleHQobXNnaWQpIGRnZXR0ZXh0ICgoY2hhciAqKSAwLCBtc2dpZCkKLQotIyBkZWZpbmUgZGdldHRleHQoZG9tYWlubmFtZSwgbXNnaWQpCQkJCQkgICAgICBcCi0gIGRjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKQotCi0jIGlmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3KQotLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBsb2FkbXNnY2F0LmMuICBXZSBuZWVkIGEgc2lnbiwKLSAgIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbAotICAgdHJhbnNsYXRpb25zLiAgKi8KLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQotIyAgZGVmaW5lIGRjZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCQkJICAgICAgXAotICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCi0gICAoewkJCQkJCQkJCSAgICAgIFwKLSAgICAgY2hhciAqX19yZXN1bHQ7CQkJCQkJCSAgICAgIFwKLSAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChtc2dpZCkpCQkJCQkgICAgICBcCi0gICAgICAgewkJCQkJCQkJICAgICAgXAotCSBzdGF0aWMgY2hhciAqX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotCSBzdGF0aWMgaW50IF9fY2F0YWxvZ19jb3VudGVyX187CQkJCSAgICAgIFwKLQkgaWYgKCEgX190cmFuc2xhdGlvbl9fIHx8IF9fY2F0YWxvZ19jb3VudGVyX18gIT0gX25sX21zZ19jYXRfY250cikgICAgXAotCSAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgIF9fdHJhbnNsYXRpb25fXyA9CQkJCQkJICAgICAgXAotCSAgICAgICAoZGNnZXR0ZXh0KSAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJCSAgICAgIFwKLQkgICAgIF9fY2F0YWxvZ19jb3VudGVyX18gPSBfbmxfbXNnX2NhdF9jbnRyOwkJCSAgICAgIFwKLQkgICB9CQkJCQkJCQkgICAgICBcCi0JIF9fcmVzdWx0ID0gX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotICAgICAgIH0JCQkJCQkJCSAgICAgIFwKLSAgICAgZWxzZQkJCQkJCQkJICAgICAgXAotICAgICAgIF9fcmVzdWx0ID0gKGRjZ2V0dGV4dCkgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CSAgICAgIFwKLSAgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCi0gICAgfSkpCi0jIGVuZGlmCi0jZW5kaWYgLyogT3B0aW1pemluZy4gKi8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogbGliaW50bC5oICovCmRpZmYgLS1naXQgYS9pbnRsL2wxMG5mbGlzdC5jIGIvaW50bC9sMTBuZmxpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyYmMxMy4uMDAwMDAwMAotLS0gYS9pbnRsL2wxMG5mbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qIEhhbmRsZSBsaXN0IG9mIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIF9HTlVfU09VUkNFCi0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX0FSR1pfSAotIyBpbmNsdWRlIDxhcmd6Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCi0jaWZuZGVmIE5VTEwKLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jIGVsc2UKLSMgIGRlZmluZSBOVUxMIDAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBfX3N0cGNweShkZXN0LCBzcmMpCi0jZWxzZQotIyBpZm5kZWYgSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotLyogRGVmaW5lIGZ1bmN0aW9uIHdoaWNoIGFyZSB1c3VhbGx5IG5vdCBhdmFpbGFibGUuICAqLwotCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgSEFWRV9fX0FSR1pfQ09VTlQKLS8qIFJldHVybnMgdGhlIG51bWJlciBvZiBzdHJpbmdzIGluIEFSR1ouICAqLwotc3RhdGljIHNpemVfdCBhcmd6X2NvdW50X18gUEFSQU1TICgoY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGxlbikpOwotCi1zdGF0aWMgc2l6ZV90Ci1hcmd6X2NvdW50X18gKGFyZ3osIGxlbikKLSAgICAgY29uc3QgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgc2l6ZV90IGNvdW50ID0gMDsKLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKLSAgICAgIGFyZ3ogKz0gcGFydF9sZW4gKyAxOwotICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICByZXR1cm4gY291bnQ7Ci19Ci0jIHVuZGVmIF9fYXJnel9jb3VudAotIyBkZWZpbmUgX19hcmd6X2NvdW50KGFyZ3osIGxlbikgYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCi0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9DT1VOVCAqLwotCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0vKiBNYWtlICdcMCcgc2VwYXJhdGVkIGFyZyB2ZWN0b3IgQVJHWiBwcmludGFibGUgYnkgY29udmVydGluZyBhbGwgdGhlICdcMCdzCi0gICBleGNlcHQgdGhlIGxhc3QgaW50byB0aGUgY2hhcmFjdGVyIFNFUC4gICovCi1zdGF0aWMgdm9pZCBhcmd6X3N0cmluZ2lmeV9fIFBBUkFNUyAoKGNoYXIgKmFyZ3osIHNpemVfdCBsZW4sIGludCBzZXApKTsKLQotc3RhdGljIHZvaWQKLWFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQotICAgICBjaGFyICphcmd6OwotICAgICBzaXplX3QgbGVuOwotICAgICBpbnQgc2VwOwotewotICB3aGlsZSAobGVuID4gMCkKLSAgICB7Ci0gICAgICBzaXplX3QgcGFydF9sZW4gPSBzdHJsZW4gKGFyZ3opOwotICAgICAgYXJneiArPSBwYXJ0X2xlbjsKLSAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBpZiAobGVuID4gMCkKLQkqYXJneisrID0gc2VwOwotICAgIH0KLX0KLSMgdW5kZWYgX19hcmd6X3N0cmluZ2lmeQotIyBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgYXJnel9zdHJpbmdpZnlfXyAoYXJneiwgbGVuLCBzZXApCi0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9TVFJJTkdJRlkgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX05FWFQKLXN0YXRpYyBjaGFyICphcmd6X25leHRfXyBQQVJBTVMgKChjaGFyICphcmd6LCBzaXplX3QgYXJnel9sZW4sCi0JCQkJICBjb25zdCBjaGFyICplbnRyeSkpOwotCi1zdGF0aWMgY2hhciAqCi1hcmd6X25leHRfXyAoYXJneiwgYXJnel9sZW4sIGVudHJ5KQotICAgICBjaGFyICphcmd6OwotICAgICBzaXplX3QgYXJnel9sZW47Ci0gICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotewotICBpZiAoZW50cnkpCi0gICAgewotICAgICAgaWYgKGVudHJ5IDwgYXJneiArIGFyZ3pfbGVuKQotICAgICAgICBlbnRyeSA9IHN0cmNociAoZW50cnksICdcMCcpICsgMTsKLQotICAgICAgcmV0dXJuIGVudHJ5ID49IGFyZ3ogKyBhcmd6X2xlbiA/IE5VTEwgOiAoY2hhciAqKSBlbnRyeTsKLSAgICB9Ci0gIGVsc2UKLSAgICBpZiAoYXJnel9sZW4gPiAwKQotICAgICAgcmV0dXJuIGFyZ3o7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci19Ci0jIHVuZGVmIF9fYXJnel9uZXh0Ci0jIGRlZmluZSBfX2FyZ3pfbmV4dChhcmd6LCBsZW4sIGVudHJ5KSBhcmd6X25leHRfXyAoYXJneiwgbGVuLCBlbnRyeSkKLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX05FWFQgKi8KLQotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGJpdHMgc2V0IGluIFguICAqLwotc3RhdGljIGludCBwb3AgUEFSQU1TICgoaW50IHgpKTsKLQotc3RhdGljIGlubGluZSBpbnQKLXBvcCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIC8qIFdlIGFzc3VtZSB0aGF0IG5vIG1vcmUgdGhhbiAxNiBiaXRzIGFyZSB1c2VkLiAgKi8KLSAgeCA9ICgoeCAmIH4weDU1NTUpID4+IDEpICsgKHggJiAweDU1NTUpOwotICB4ID0gKCh4ICYgfjB4MzMzMykgPj4gMikgKyAoeCAmIDB4MzMzMyk7Ci0gIHggPSAoKHggPj4gNCkgKyB4KSAmIDB4MGYwZjsKLSAgeCA9ICgoeCA+PiA4KSArIHgpICYgMHhmZjsKLQotICByZXR1cm4geDsKLX0KLQotDAotc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi1fbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBtYXNrLCBsYW5ndWFnZSwKLQkJICAgIHRlcnJpdG9yeSwgY29kZXNldCwgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJICAgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgZG9fYWxsb2NhdGUpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0OwotICAgICBjb25zdCBjaGFyICpkaXJsaXN0OwotICAgICBzaXplX3QgZGlybGlzdF9sZW47Ci0gICAgIGludCBtYXNrOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgICAgY29uc3QgY2hhciAqdGVycml0b3J5OwotICAgICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotICAgICBjb25zdCBjaGFyICpzcGVjaWFsOwotICAgICBjb25zdCBjaGFyICpzcG9uc29yOwotICAgICBjb25zdCBjaGFyICpyZXZpc2lvbjsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGludCBkb19hbGxvY2F0ZTsKLXsKLSAgY2hhciAqYWJzX2ZpbGVuYW1lOwotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpsYXN0ID0gTlVMTDsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOwotICBjaGFyICpjcDsKLSAgc2l6ZV90IGVudHJpZXM7Ci0gIGludCBjbnQ7Ci0KLSAgLyogQWxsb2NhdGUgcm9vbSBmb3IgdGhlIGZ1bGwgZmlsZSBuYW1lLiAgKi8KLSAgYWJzX2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJsaXN0X2xlbgotCQkJCSAgKyBzdHJsZW4gKGxhbmd1YWdlKQotCQkJCSAgKyAoKG1hc2sgJiBURVJSSVRPUlkpICE9IDAKLQkJCQkgICAgID8gc3RybGVuICh0ZXJyaXRvcnkpICsgMSA6IDApCi0JCQkJICArICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAoY29kZXNldCkgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKG5vcm1hbGl6ZWRfY29kZXNldCkgKyAxIDogMCkKLQkJCQkgICsgKCgobWFzayAmIFhQR19NT0RJRklFUikgIT0gMAotCQkJCSAgICAgIHx8IChtYXNrICYgQ0VOX0FVRElFTkNFKSAhPSAwKQotCQkJCSAgICAgPyBzdHJsZW4gKG1vZGlmaWVyKSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBDRU5fU1BFQ0lBTCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKHNwZWNpYWwpICsgMSA6IDApCi0JCQkJICArICgoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAotCQkJCSAgICAgIHx8IChtYXNrICYgQ0VOX1JFVklTSU9OKSAhPSAwKQotCQkJCSAgICAgPyAoMSArICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCi0JCQkJCSAgICAgPyBzdHJsZW4gKHNwb25zb3IpICsgMSA6IDApCi0JCQkJCSsgKChtYXNrICYgQ0VOX1JFVklTSU9OKSAhPSAwCi0JCQkJCSAgID8gc3RybGVuIChyZXZpc2lvbikgKyAxIDogMCkpIDogMCkKLQkJCQkgICsgMSArIHN0cmxlbiAoZmlsZW5hbWUpICsgMSk7Ci0KLSAgaWYgKGFic19maWxlbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHZhbCA9IE5VTEw7Ci0gIGxhc3QgPSBOVUxMOwotCi0gIC8qIENvbnN0cnVjdCBmaWxlIG5hbWUuICAqLwotICBtZW1jcHkgKGFic19maWxlbmFtZSwgZGlybGlzdCwgZGlybGlzdF9sZW4pOwotICBfX2FyZ3pfc3RyaW5naWZ5IChhYnNfZmlsZW5hbWUsIGRpcmxpc3RfbGVuLCAnOicpOwotICBjcCA9IGFic19maWxlbmFtZSArIChkaXJsaXN0X2xlbiAtIDEpOwotICAqY3ArKyA9ICcvJzsKLSAgY3AgPSBzdHBjcHkgKGNwLCBsYW5ndWFnZSk7Ci0KLSAgaWYgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJ18nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCB0ZXJyaXRvcnkpOwotICAgIH0KLSAgaWYgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLic7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIGNvZGVzZXQpOwotICAgIH0KLSAgaWYgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcuJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbm9ybWFsaXplZF9jb2Rlc2V0KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIChYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0UpKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY29tcG9uZW50IGNhbiBiZSBwYXJ0IG9mIGJvdGggc3ludGFjZXMgYnV0IGhhcyBkaWZmZXJlbnQKLQkgbGVhZGluZyBjaGFyYWN0ZXJzLiAgRm9yIENFTiB3ZSB1c2UgYCsnLCBlbHNlIGBAJy4gICovCi0gICAgICAqY3ArKyA9IChtYXNrICYgQ0VOX0FVRElFTkNFKSAhPSAwID8gJysnIDogJ0AnOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBtb2RpZmllcik7Ci0gICAgfQotICBpZiAoKG1hc2sgJiBDRU5fU1BFQ0lBTCkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcrJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgc3BlY2lhbCk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiAoQ0VOX1NQT05TT1IgfCBDRU5fUkVWSVNJT04pKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJywnOwotICAgICAgaWYgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDApCi0JY3AgPSBzdHBjcHkgKGNwLCBzcG9uc29yKTsKLSAgICAgIGlmICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKLQl7Ci0JICAqY3ArKyA9ICdfJzsKLQkgIGNwID0gc3RwY3B5IChjcCwgcmV2aXNpb24pOwotCX0KLSAgICB9Ci0KLSAgKmNwKysgPSAnLyc7Ci0gIHN0cGNweSAoY3AsIGZpbGVuYW1lKTsKLQotICAvKiBMb29rIGluIGxpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucyB3aGV0aGVyIGl0IGlzIGFscmVhZHkKLSAgICAgYXZhaWxhYmxlLiAgKi8KLSAgbGFzdCA9IE5VTEw7Ci0gIGZvciAocmV0dmFsID0gKmwxMG5maWxlX2xpc3Q7IHJldHZhbCAhPSBOVUxMOyByZXR2YWwgPSByZXR2YWwtPm5leHQpCi0gICAgaWYgKHJldHZhbC0+ZmlsZW5hbWUgIT0gTlVMTCkKLSAgICAgIHsKLQlpbnQgY29tcGFyZSA9IHN0cmNtcCAocmV0dmFsLT5maWxlbmFtZSwgYWJzX2ZpbGVuYW1lKTsKLQlpZiAoY29tcGFyZSA9PSAwKQotCSAgLyogV2UgZm91bmQgaXQhICAqLwotCSAgYnJlYWs7Ci0JaWYgKGNvbXBhcmUgPCAwKQotCSAgewotCSAgICAvKiBJdCdzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICAgIHJldHZhbCA9IE5VTEw7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JbGFzdCA9IHJldHZhbDsKLSAgICAgIH0KLQotICBpZiAocmV0dmFsICE9IE5VTEwgfHwgZG9fYWxsb2NhdGUgPT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChhYnNfZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0KLSAgcmV0dmFsID0gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikKLSAgICBtYWxsb2MgKHNpemVvZiAoKnJldHZhbCkgKyAoX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikKLQkJCQkqICgxIDw8IHBvcCAobWFzaykpCi0JCQkJKiBzaXplb2YgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikpKTsKLSAgaWYgKHJldHZhbCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHZhbC0+ZmlsZW5hbWUgPSBhYnNfZmlsZW5hbWU7Ci0gIHJldHZhbC0+ZGVjaWRlZCA9IChfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSAhPSAxCi0JCSAgICAgfHwgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKLQkJCSAmJiAobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApKTsKLSAgcmV0dmFsLT5kYXRhID0gTlVMTDsKLQotICBpZiAobGFzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJldHZhbC0+bmV4dCA9ICpsMTBuZmlsZV9saXN0OwotICAgICAgKmwxMG5maWxlX2xpc3QgPSByZXR2YWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dmFsLT5uZXh0ID0gbGFzdC0+bmV4dDsKLSAgICAgIGxhc3QtPm5leHQgPSByZXR2YWw7Ci0gICAgfQotCi0gIGVudHJpZXMgPSAwOwotICAvKiBJZiB0aGUgRElSTElTVCBpcyBhIHJlYWwgbGlzdCB0aGUgUkVUVkFMIGVudHJ5IGNvcnJlc3BvbmRzIG5vdCB0bwotICAgICBhIHJlYWwgZmlsZS4gIFNvIHdlIGhhdmUgdG8gdXNlIHRoZSBESVJMSVNUIHNlcGFyYXRpb24gbWVjaGFuaXNtCi0gICAgIG9mIHRoZSBpbm5lciBsb29wLiAgKi8KLSAgY250ID0gX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgPT0gMSA/IG1hc2sgLSAxIDogbWFzazsKLSAgZm9yICg7IGNudCA+PSAwOyAtLWNudCkKLSAgICBpZiAoKGNudCAmIH5tYXNrKSA9PSAwCi0JJiYgKChjbnQgJiBDRU5fU1BFQ0lGSUMpID09IDAgfHwgKGNudCAmIFhQR19TUEVDSUZJQykgPT0gMCkKLQkmJiAoKGNudCAmIFhQR19DT0RFU0VUKSA9PSAwIHx8IChjbnQgJiBYUEdfTk9STV9DT0RFU0VUKSA9PSAwKSkKLSAgICAgIHsKLQkvKiBJdGVyYXRlIG92ZXIgYWxsIGVsZW1lbnRzIG9mIHRoZSBESVJMSVNULiAgKi8KLQljaGFyICpkaXIgPSBOVUxMOwotCi0Jd2hpbGUgKChkaXIgPSBfX2FyZ3pfbmV4dCAoKGNoYXIgKikgZGlybGlzdCwgZGlybGlzdF9sZW4sIGRpcikpCi0JICAgICAgICE9IE5VTEwpCi0JICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzKytdCi0JICAgID0gX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXIsIHN0cmxlbiAoZGlyKSArIDEsIGNudCwKLQkJCQkgIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCi0JCQkJICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAotCQkJCSAgc3BvbnNvciwgcmV2aXNpb24sIGZpbGVuYW1lLCAxKTsKLSAgICAgIH0KLSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllc10gPSBOVUxMOwotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi0vKiBOb3JtYWxpemUgY29kZXNldCBuYW1lLiAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBjb2Rlc2V0Ci0gICBuYW1lcy4gIE5vcm1hbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbgotICAgbmFtZXMuICAqLwotY29uc3QgY2hhciAqCi1fbmxfbm9ybWFsaXplX2NvZGVzZXQgKGNvZGVzZXQsIG5hbWVfbGVuKQotICAgICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICAgICBzaXplX3QgbmFtZV9sZW47Ci17Ci0gIGludCBsZW4gPSAwOwotICBpbnQgb25seV9kaWdpdCA9IDE7Ci0gIGNoYXIgKnJldHZhbDsKLSAgY2hhciAqd3A7Ci0gIHNpemVfdCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCi0gICAgaWYgKGlzYWxudW0gKGNvZGVzZXRbY250XSkpCi0gICAgICB7Ci0JKytsZW47Ci0KLQlpZiAoaXNhbHBoYSAoY29kZXNldFtjbnRdKSkKLQkgIG9ubHlfZGlnaXQgPSAwOwotICAgICAgfQotCi0gIHJldHZhbCA9IChjaGFyICopIG1hbGxvYyAoKG9ubHlfZGlnaXQgPyAzIDogMCkgKyBsZW4gKyAxKTsKLQotICBpZiAocmV0dmFsICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG9ubHlfZGlnaXQpCi0Jd3AgPSBzdHBjcHkgKHJldHZhbCwgImlzbyIpOwotICAgICAgZWxzZQotCXdwID0gcmV0dmFsOwotCi0gICAgICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKLQlpZiAoaXNhbHBoYSAoY29kZXNldFtjbnRdKSkKLQkgICp3cCsrID0gdG9sb3dlciAoY29kZXNldFtjbnRdKTsKLQllbHNlIGlmIChpc2RpZ2l0IChjb2Rlc2V0W2NudF0pKQotCSAgKndwKysgPSBjb2Rlc2V0W2NudF07Ci0KLSAgICAgICp3cCA9ICdcMCc7Ci0gICAgfQotCi0gIHJldHVybiAoY29uc3QgY2hhciAqKSByZXR2YWw7Ci19Ci0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoZGVzdCwgc3JjKQotICAgICBjaGFyICpkZXN0OwotICAgICBjb25zdCBjaGFyICpzcmM7Ci17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9saWJnZXR0ZXh0LmggYi9pbnRsL2xpYmdldHRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0ZGU0ZC4uMDAwMDAwMAotLS0gYS9pbnRsL2xpYmdldHRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKiBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgKGUuZy4gU29sYXJpcykgd2Ugc29tZXRpbWVzIGhhdmUgdG8gaW5jbHVkZQotICAgdGhlIHN5c3RlbXMgbGliaW50bC5oIGFzIHdlbGwgYXMgdGhpcyBmaWxlIHdlIGhhdmUgbW9yZSBjb21wbGV4Ci0gICBpbmNsdWRlIHByb3RlY3Rpb24gYWJvdmUuICBCdXQgdGhlIHN5c3RlbXMgaGVhZGVyIG1pZ2h0IHBlcmhhcHMgYWxzbwotICAgZGVmaW5lIF9MSUJJTlRMX0ggYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIHByb3RlY3QgdGhlIGRlZmluaXRpb24gaGVyZS4gICovCi0KLSNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCkgfHwgIWRlZmluZWQgKF9MSUJHRVRURVhUX0gpCi0jaWYgIWRlZmluZWQgKF9MSUJJTlRMX0gpCi0jIGRlZmluZSBfTElCSU5UTF9ICTEKLSNlbmRpZgotI2RlZmluZSBfTElCR0VUVEVYVF9ICTEKLQotLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCi0gICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KLSNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTlVMTAotIyBpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fR05VQ19fCi0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgZWxzZQotIyAgZGVmaW5lIE5VTEwgKDApCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmICFIQVZFX0xDX01FU1NBR0VTCi0vKiBUaGlzIHZhbHVlIGRldGVybWluZXMgdGhlIGJlaGF2aW91ciBvZiB0aGUgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpCi0gICBmdW5jdGlvbi4gIEJ1dCBzb21lIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoaXMgZGVmaW5lZC4gIERlZmluZSBpdAotICAgdG8gYSBkZWZhdWx0IHZhbHVlLiAgKi8KLSMgZGVmaW5lIExDX01FU1NBR0VTICgtMSkKLSNlbmRpZgotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3IgZ2V0dGV4dC11c2luZy1jYXRnZXRzIGludGVyZmFjZS4gIERlcml2ZWQgZnJvbQotICAgSmltIE1leWVyaW5nJ3MgbGliaW50bC5oLiAgKi8KLXN0cnVjdCBfbXNnX2VudAotewotICBjb25zdCBjaGFyICpfbXNnOwotICBpbnQgX21zZ19udW1iZXI7Ci19OwotCi0KLSNpZiBIQVZFX0NBVEdFVFMKLS8qIFRoZXNlIHR3byB2YXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gdGhlIGF1dG9tYXRpY2FsbHkgYnkgcG8tdG8tdGJsLnNlZAotICAgZ2VuZXJhdGVkIGZpbGUgYGNhdC1pZC10YmwuYycuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfbXNnX2VudCBfbXNnX3RibFtdOwotZXh0ZXJuIGludCBfbXNnX3RibF9sZW5ndGg7Ci0jZW5kaWYKLQotCi0vKiBGb3IgYXV0b21hdGljYWwgZXh0cmFjdGlvbiBvZiBtZXNzYWdlcyBzb21ldGltZXMgbm8gcmVhbAotICAgdHJhbnNsYXRpb24gaXMgbmVlZGVkLiAgSW5zdGVhZCB0aGUgc3RyaW5nIGl0c2VsZiBpcyB0aGUgcmVzdWx0LiAgKi8KLSNkZWZpbmUgZ2V0dGV4dF9ub29wKFN0cikgKFN0cikKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1leHRlcm4gY2hhciAqZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkpOwotZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSBjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkY2dldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotCQkJCWludCBfX2NhdGVnb3J5KSk7Ci1leHRlcm4gY2hhciAqZGNnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKLQotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW5fXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW5fXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotCi0jaWYgRU5BQkxFX05MUwotCi0vKiBTb2xhcmlzIDIuMyBoYXMgdGhlIGdldHRleHQgZnVuY3Rpb24gYnV0IGRjZ2V0dGV4dCBpcyBtaXNzaW5nLgotICAgU28gd2Ugb21pdCB0aGlzIG9wdGltaXphdGlvbiBmb3IgU29sYXJpcyAyLjMuICBCVFcsIFNvbGFyaXMgMi40Ci0gICBoYXMgZGNnZXR0ZXh0LiAgKi8KLSMgaWYgIUhBVkVfQ0FUR0VUUyAmJiAoIUhBVkVfR0VUVEVYVCB8fCBIQVZFX0RDR0VUVEVYVCkKLQotIyAgZGVmaW5lIGdldHRleHQoTXNnaWQpCQkJCQkJICAgICAgXAotICAgICBkZ2V0dGV4dCAoTlVMTCwgTXNnaWQpCi0KLSMgIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkJCQkJCSAgICAgIFwKLSAgICAgZGNnZXR0ZXh0IChEb21haW5uYW1lLCBNc2dpZCwgTENfTUVTU0FHRVMpCi0KLSMgIGlmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3Ci0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGxvYWRtc2djYXQuYy4gIFdlIG5lZWQgYSBzaWduLAotICAgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYWxsCi0gICB0cmFuc2xhdGlvbnMuICAqLwotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCi0jICAgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpCQkJICAgICAgXAotICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCi0gICAoewkJCQkJCQkJCSAgICAgIFwKLSAgICAgY2hhciAqX19yZXN1bHQ7CQkJCQkJCSAgICAgIFwKLSAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChNc2dpZCkpCQkJCQkgICAgICBcCi0gICAgICAgewkJCQkJCQkJICAgICAgXAotCSBzdGF0aWMgY2hhciAqX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotCSBzdGF0aWMgaW50IF9fY2F0YWxvZ19jb3VudGVyX187CQkJCSAgICAgIFwKLQkgaWYgKCEgX190cmFuc2xhdGlvbl9fIHx8IF9fY2F0YWxvZ19jb3VudGVyX18gIT0gX25sX21zZ19jYXRfY250cikgICAgXAotCSAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgIF9fdHJhbnNsYXRpb25fXyA9CQkJCQkJICAgICAgXAotCSAgICAgICBkY2dldHRleHRfXyAoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KTsJCSAgICAgIFwKLQkgICAgIF9fY2F0YWxvZ19jb3VudGVyX18gPSBfbmxfbXNnX2NhdF9jbnRyOwkJCSAgICAgIFwKLQkgICB9CQkJCQkJCQkgICAgICBcCi0JIF9fcmVzdWx0ID0gX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotICAgICAgIH0JCQkJCQkJCSAgICAgIFwKLSAgICAgZWxzZQkJCQkJCQkJICAgICAgXAotICAgICAgIF9fcmVzdWx0ID0gZGNnZXR0ZXh0X18gKERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSk7CQkgICAgICBcCi0gICAgIF9fcmVzdWx0OwkJCQkJCQkJICAgICAgXAotICAgIH0pKQotIyAgZW5kaWYKLSMgZW5kaWYKLQotI2Vsc2UKLQotIyBkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKE1zZ2lkKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpIChNc2dpZCkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpIChNc2dpZCkKLSMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpIHdoaWxlICgwKSAvKiBub3RoaW5nICovCi0KLSNlbmRpZgotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2xpYmludGwuZ2xpYmMgYi9pbnRsL2xpYmludGwuZ2xpYmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWI4ZjkuLjAwMDAwMDAKLS0tIGEvaW50bC9saWJpbnRsLmdsaWJjCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIGxpYmdldHRleHQuaCAtLSBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLUNvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIuCi1UaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBmaWxlIGxpYmdldHRleHQuaCBpbiB0aGUgR05VIGdldHRleHQgcGFja2FnZS4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQklOVExfSAotI2RlZmluZSBfTElCSU5UTF9ICTEKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLSNkZWZpbmUgX19uZWVkX05VTEwKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCi0gICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KLSNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQotCi1fX0JFR0lOX0RFQ0xTCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotZXh0ZXJuIGNoYXIgKmdldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqX19nZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGdldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICAgX19jb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqX19kZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLSAgIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGNnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KSk7Ci1leHRlcm4gY2hhciAqX19kY2dldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICAgICAgX19jb25zdCBjaGFyICpfX21zZ2lkLCBpbnQgX19jYXRlZ29yeSkpOwotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLWV4dGVybiBjaGFyICpfX3RleHRkb21haW4gX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBfX2NvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotZXh0ZXJuIGNoYXIgKl9fYmluZHRleHRkb21haW4gX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgIF9fY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci0KLQotLyogT3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGFib3ZlLiAgKi8KLSNpZiBkZWZpbmVkIF9fT1BUSU1JWkVECi0vKiBUaGVzZSBtdXN0IGJlIGEgbWFjcm8uICBJbmxpbmVkIGZ1bmN0aW9ucyBhcmUgdXNlbGVzcyBiZWNhdXNlIHRoZQotICAgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBwcmVkaWNhdGUgaW4gZGNnZXR0ZXh0IHdvdWxkIGFsd2F5cyByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLQotIyBkZWZpbmUgZ2V0dGV4dChtc2dpZCkgZGdldHRleHQgKE5VTEwsIG1zZ2lkKQotCi0jIGRlZmluZSBkZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCkJCQkJCSAgICAgIFwKLSAgZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpCi0KLSMgaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcpCi0jICBkZWZpbmUgZGNnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkJCQkgICAgICBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICh7CQkJCQkJCQkJICAgICAgXAotICAgICBjaGFyICpyZXN1bHQ7CQkJCQkJCSAgICAgIFwKLSAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChtc2dpZCkpCQkJCQkgICAgICBcCi0gICAgICAgewkJCQkJCQkJICAgICAgXAotCSBleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CQkJCQkgICAgICBcCi0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0JIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAotCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCi0JICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCi0JICAgICAgIF9fZGNnZXR0ZXh0ICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkJICAgICAgXAotCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAotCSAgIH0JCQkJCQkJCSAgICAgIFwKLQkgcmVzdWx0ID0gX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotICAgICAgIH0JCQkJCQkJCSAgICAgIFwKLSAgICAgZWxzZQkJCQkJCQkJICAgICAgXAotICAgICAgIHJlc3VsdCA9IF9fZGNnZXR0ZXh0ICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkgICAgICBcCi0gICAgIHJlc3VsdDsJCQkJCQkJCSAgICAgIFwKLSAgICB9KSkKLSMgZW5kaWYKLSNlbmRpZiAvKiBPcHRpbWl6aW5nLiAqLwotCi0KLV9fRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBsaWJpbnRsLmggKi8KZGlmZiAtLWdpdCBhL2ludGwvbGludXgtbXNnLnNlZCBiL2ludGwvbGludXgtbXNnLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxOGU3Mi4uMDAwMDAwMAotLS0gYS9pbnRsL2xpbnV4LW1zZy5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyBwbzJtc2cuc2VkIC0gQ29udmVydCBVbmlmb3J1bSBzdHlsZSAucG8gZmlsZSB0byBMaW51eCBzdHlsZSAubXNnIGZpbGUKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jCi0jIFRoZSBmaXJzdCBkaXJlY3RpdmUgaW4gdGhlIC5tc2cgc2hvdWxkIGJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotIyBtZXNzYWdlIHNldCBudW1iZXIuICBXZSB1c2UgYWx3YXlzIHNldCBudW1iZXIgMS4KLSMKLTEgewotICBpXAotJHNldCAxICMgQXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHBvMm1zZy5zZWQKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgTWl0Y2gncyBvbGQgY2F0YWxvZyBmb3JtYXQgZG9lcyBub3QgYWxsb3cgY29tbWVudHMuCi0jCi0jIFdlIGNvcHkgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYXMgYSBjb21tZW50IGludG8gdGhlIC5tc2cgZmlsZS4KLSMKLS9ebXNnaWQvIHsKLSAgcy9tc2dpZFsgCV0qIi8vCi0jCi0jIFRoaXMgZG9lcyBub3Qgd29yayBub3cgd2l0aCB0aGUgbmV3IGZvcm1hdC4KLSMgLyIkLyEgewotIyAgIHMvXFwkLy8KLSMgICBzLyQvIC4uLiAobW9yZSBsaW5lcyBmb2xsb3dpbmcpIi8KLSMgfQotICB4Ci0jIFRoZSBmb2xsb3dpbmcgbmljZSBzb2x1dGlvbiBpcyBieQotIyBCcnVubyA8SGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KLSAgdGQKLSMgSW5jcmVtZW50IGEgZGVjaW1hbCBudW1iZXIgaW4gcGF0dGVybiBzcGFjZS4KLSMgRmlyc3QgaGlkZSB0cmFpbGluZyBgOScgZGlnaXRzLgotICA6ZAotICBzLzlcKF8qXCkkL19cMS8KLSAgdGQKLSMgQXNzdXJlIGF0IGxlYXN0IG9uZSBkaWdpdCBpcyBhdmFpbGFibGUuCi0gIHMvXlwoXypcKSQvMFwxLwotIyBJbmNyZW1lbnQgdGhlIGxhc3QgZGlnaXQuCi0gIHMvOFwoXypcKSQvOVwxLwotICBzLzdcKF8qXCkkLzhcMS8KLSAgcy82XChfKlwpJC83XDEvCi0gIHMvNVwoXypcKSQvNlwxLwotICBzLzRcKF8qXCkkLzVcMS8KLSAgcy8zXChfKlwpJC80XDEvCi0gIHMvMlwoXypcKSQvM1wxLwotICBzLzFcKF8qXCkkLzJcMS8KLSAgcy8wXChfKlwpJC8xXDEvCi0jIENvbnZlcnQgdGhlIGhpZGRlbiBgOScgZGlnaXRzIHRvIGAwJ3MuCi0gIHMvXy8wL2cKLSAgeAotICBHCi0gIHMvXCguKlwpIlxuXChbMC05XSpcKS8kICNcMiBPcmlnaW5hbCBNZXNzYWdlOihcMSkvcAotfQotIwotIyBUaGUgLm1zZyBmaWxlIGNvbnRhaW5zLCBvdGhlciB0aGVuIHRoZSAucG8gZmlsZSwgb25seSB0aGUgdHJhbnNsYXRpb25zCi0jIGJ1dCBlYWNoIGdpdmVuIGEgdW5pcXVlIElELiAgU3RhcnRpbmcgZnJvbSAxIGFuZCBpbmNyZW1lbnRpbmcgYnkgMSBmb3IKLSMgZWFjaCBtZXNzYWdlIHdlIGFzc2lnbiB0aGVtIHRvIHRoZSBtZXNzYWdlcy4KLSMgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIC5wbyBmaWxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNhdC1pZC10YmwuYyBmaWxlCi0jICh3aXRoIHBvLXRvLXRibCkgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGhlcmUuICAoQXQgbGVhc3QgdGhlIG9yZGVyCi0jIG9mIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBiZSBjaGFuZ2VkLikKLSMKLS9ebXNnc3RyLyB7Ci0gIHMvbXNnc3RyWyAJXSoiXCguKlwpIi8jIFwxLwotIyBDbGVhciBzdWJzdGl0dXRpb24gZmxhZy4KLSAgdGIKLSMgQXBwZW5kIHRoZSBuZXh0IGxpbmUuCi0gIDpiCi0gIE4KLSMgTG9vayB3aGV0aGVyIHNlY29uZCBwYXJ0IGlzIGNvbnRpbnVhdGlvbiBsaW5lLgotICBzL1woLipcblwpIlwoLipcKSIvXDFcMi8KLSMgWWVzLCB0aGVuIGJyYW5jaC4KLSAgdGEKLSAgUAotICBECi0jIE5vdGUgdGhhdCBEIGluY2x1ZGVzIGEganVtcCB0byB0aGUgc3RhcnQhIQotIyBXZSBmb3VuZCBhIGNvbnRpbnVhdGlvbiBsaW5lLiAgQnV0IGJlZm9yZSBwcmludGluZyBpbnNlcnQgJ1wnLgotICA6YQotICBzL1woLipcKVwoXG4uKlwpL1wxXFxcMi8KLSAgUAotIyBXZSBjYW5ub3QgdXNlIEQgaGVyZS4KLSAgcy8uKlxuXCguKlwpL1wxLwotICB0YgotfQotZApkaWZmIC0tZ2l0IGEvaW50bC9sb2FkaW5mby5oIGIvaW50bC9sb2FkaW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdjMmViLi4wMDAwMDAwCi0tLSBhL2ludGwvbG9hZGluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEVuY29kaW5nIG9mIGxvY2FsZSBuYW1lIHBhcnRzLiAgKi8KLSNkZWZpbmUgQ0VOX1JFVklTSU9OCQkxCi0jZGVmaW5lIENFTl9TUE9OU09SCQkyCi0jZGVmaW5lIENFTl9TUEVDSUFMCQk0Ci0jZGVmaW5lIFhQR19OT1JNX0NPREVTRVQJOAotI2RlZmluZSBYUEdfQ09ERVNFVAkJMTYKLSNkZWZpbmUgVEVSUklUT1JZCQkzMgotI2RlZmluZSBDRU5fQVVESUVOQ0UJCTY0Ci0jZGVmaW5lIFhQR19NT0RJRklFUgkJMTI4Ci0KLSNkZWZpbmUgQ0VOX1NQRUNJRklDCShDRU5fUkVWSVNJT058Q0VOX1NQT05TT1J8Q0VOX1NQRUNJQUx8Q0VOX0FVRElFTkNFKQotI2RlZmluZSBYUEdfU1BFQ0lGSUMJKFhQR19DT0RFU0VUfFhQR19OT1JNX0NPREVTRVR8WFBHX01PRElGSUVSKQotCi0KLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGludCBkZWNpZGVkOwotCi0gIGNvbnN0IHZvaWQgKmRhdGE7Ci0KLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbmV4dDsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqc3VjY2Vzc29yWzFdOwotfTsKLQotCi1leHRlcm4gY29uc3QgY2hhciAqX25sX25vcm1hbGl6ZV9jb2Rlc2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvZGVzZXQsCi0JCQkJCQkgIHNpemVfdCBuYW1lX2xlbikpOwotCi1leHRlcm4gc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi1fbmxfbWFrZV9sMTBuZmxpc3QgUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3QsCi0JCQkgICAgY29uc3QgY2hhciAqZGlybGlzdCwgc2l6ZV90IGRpcmxpc3RfbGVuLCBpbnQgbWFzaywKLQkJCSAgICBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqdGVycml0b3J5LAotCQkJICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQsCi0JCQkgICAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAotCQkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLCBjb25zdCBjaGFyICpzcGVjaWFsLAotCQkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAotCQkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpKTsKLQotCi1leHRlcm4gY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci0KLWV4dGVybiBpbnQgX25sX2V4cGxvZGVfbmFtZSBQQVJBTVMgKChjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsCi0JCQkJICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXIsCi0JCQkJICAgICBjb25zdCBjaGFyICoqdGVycml0b3J5LAotCQkJCSAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQsCi0JCQkJICAgICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0LAotCQkJCSAgICAgY29uc3QgY2hhciAqKnNwZWNpYWwsCi0JCQkJICAgICBjb25zdCBjaGFyICoqc3BvbnNvciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipyZXZpc2lvbikpOwpkaWZmIC0tZ2l0IGEvaW50bC9sb2FkbXNnY2F0LmMgYi9pbnRsL2xvYWRtc2djYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlOTBhOS4uMDAwMDAwMAotLS0gYS9pbnRsL2xvYWRtc2djYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVApIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBJU08gQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIElTTyBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBmc3RhdCAgX19mc3RhdAotIyBkZWZpbmUgb3BlbiAgIF9fb3BlbgotIyBkZWZpbmUgY2xvc2UgIF9fY2xvc2UKLSMgZGVmaW5lIHJlYWQgICBfX3JlYWQKLSMgZGVmaW5lIG1tYXAgICBfX21tYXAKLSMgZGVmaW5lIG11bm1hcCBfX211bm1hcAotI2VuZGlmCi0KLS8qIFdlIG5lZWQgYSBzaWduLCB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQKLSAgIHdpdGggYWxsIHRyYW5zbGF0aW9ucy4gIFRoaXMgaXMgaW1wb3J0YW50IGlmIHRoZSB0cmFuc2xhdGlvbnMgYXJlCi0gICBjYWNoZWQgYnkgb25lIG9mIEdDQydzIGZlYXR1cmVzLiAgKi8KLWludCBfbmxfbXNnX2NhdF9jbnRyID0gMDsKLQotCi0vKiBMb2FkIHRoZSBtZXNzYWdlIGNhdGFsb2dzIHNwZWNpZmllZCBieSBGSUxFTkFNRS4gIElmIGl0IGlzIG5vIHZhbGlkCi0gICBtZXNzYWdlIGNhdGFsb2cgZG8gbm90aGluZy4gICovCi12b2lkCi1fbmxfbG9hZF9kb21haW4gKGRvbWFpbl9maWxlKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZTsKLXsKLSAgaW50IGZkOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgc3RydWN0IG1vX2ZpbGVfaGVhZGVyICpkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMTsKLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICBpbnQgdXNlX21tYXAgPSAwOwotI2VuZGlmCi0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47Ci0KLSAgZG9tYWluX2ZpbGUtPmRlY2lkZWQgPSAxOwotICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7Ci0KLSAgLyogSWYgdGhlIHJlY29yZCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBsb2NhbGUgdGhlIEZJTEVOQU1FCi0gICAgIG1pZ2h0IGJlIE5VTEwuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCi0gICAgIHNwZWNpZmljYXRpb24gdGhlIGxvY2FsZSBmaWxlIG5hbWUgaXMgZGlmZmVyZW50IGZvciBYUEcgYW5kIENFTgotICAgICBzeW50YXguICAqLwotICBpZiAoZG9tYWluX2ZpbGUtPmZpbGVuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIFRyeSB0byBvcGVuIHRoZSBhZGRyZXNzZWQgZmlsZS4gICovCi0gIGZkID0gb3BlbiAoZG9tYWluX2ZpbGUtPmZpbGVuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICByZXR1cm47Ci0KLSAgLyogV2UgbXVzdCBrbm93IGFib3V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGZzdGF0IChmZCwgJnN0KSAhPSAwCi0gICAgICAmJiBzdC5zdF9zaXplIDwgKG9mZl90KSBzaXplb2YgKHN0cnVjdCBtb19maWxlX2hlYWRlcikpCi0gICAgewotICAgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLwotICAgICAgY2xvc2UgKGZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICAvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIGxvYWQgdGhlIGZpbGUuICBJZiBtbWFwKCkgaXMgYXZhaWxhYmxlIHdlIHRyeQotICAgICB0aGlzIGZpcnN0LiAgSWYgbm90IGF2YWlsYWJsZSBvciBpdCBmYWlsZWQgd2UgdHJ5IHRvIGxvYWQgaXQuICAqLwotICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtbWFwIChOVUxMLCBzdC5zdF9zaXplLCBQUk9UX1JFQUQsCi0JCQkJCSBNQVBfUFJJVkFURSwgZmQsIDApOwotCi0gIGlmIChkYXRhICE9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEpCi0gICAgewotICAgICAgLyogbW1hcCgpIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuICAqLwotICAgICAgY2xvc2UgKGZkKTsKLSAgICAgIHVzZV9tbWFwID0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJZiB0aGUgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSAoaS5lLiBtbWFwJ2VkKSB3ZSB0cnkgdG8gbG9hZAotICAgICBpdCBtYW51YWxseS4gICovCi0gIGlmIChkYXRhID09IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEpCi0gICAgewotICAgICAgb2ZmX3QgdG9fcmVhZDsKLSAgICAgIGNoYXIgKnJlYWRfcHRyOwotCi0gICAgICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtYWxsb2MgKHN0LnN0X3NpemUpOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAgIHRvX3JlYWQgPSBzdC5zdF9zaXplOwotICAgICAgcmVhZF9wdHIgPSAoY2hhciAqKSBkYXRhOwotICAgICAgZG8KLQl7Ci0JICBsb25nIGludCBuYiA9IChsb25nIGludCkgcmVhZCAoZmQsIHJlYWRfcHRyLCB0b19yZWFkKTsKLQkgIGlmIChuYiA9PSAtMSkKLQkgICAgewotCSAgICAgIGNsb3NlIChmZCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHJlYWRfcHRyICs9IG5iOwotCSAgdG9fcmVhZCAtPSBuYjsKLQl9Ci0gICAgICB3aGlsZSAodG9fcmVhZCA+IDApOwotCi0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICAvKiBVc2luZyB0aGUgbWFnaWMgbnVtYmVyIHdlIGNhbiB0ZXN0IHdoZXRoZXIgaXQgcmVhbGx5IGlzIGEgbWVzc2FnZQotICAgICBjYXRhbG9nIGZpbGUuICAqLwotICBpZiAoZGF0YS0+bWFnaWMgIT0gX01BR0lDICYmIGRhdGEtPm1hZ2ljICE9IF9NQUdJQ19TV0FQUEVEKQotICAgIHsKLSAgICAgIC8qIFRoZSBtYWdpYyBudW1iZXIgaXMgd3Jvbmc6IG5vdCBhIG1lc3NhZ2UgY2F0YWxvZyBmaWxlLiAgKi8KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOwotICAgICAgZWxzZQotI2VuZGlmCi0JZnJlZSAoZGF0YSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvbWFpbl9maWxlLT5kYXRhCi0gICAgPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2FkZWRfZG9tYWluKSk7Ci0gIGlmIChkb21haW5fZmlsZS0+ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7Ci0gIGRvbWFpbi0+ZGF0YSA9IChjaGFyICopIGRhdGE7Ci0gIGRvbWFpbi0+bXVzdF9zd2FwID0gZGF0YS0+bWFnaWMgIT0gX01BR0lDOwotCi0gIC8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdmFpbGFibGUgdGFibGVzLiAgKi8KLSAgc3dpdGNoIChXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+cmV2aXNpb24pKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBkb21haW4tPm5zdHJpbmdzID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5zdHJpbmdzKTsKLSAgICAgIGRvbWFpbi0+b3JpZ190YWIgPSAoc3RydWN0IHN0cmluZ19kZXNjICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ190YWJfb2Zmc2V0KSk7Ci0gICAgICBkb21haW4tPnRyYW5zX3RhYiA9IChzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc190YWJfb2Zmc2V0KSk7Ci0gICAgICBkb21haW4tPmhhc2hfc2l6ZSA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5oYXNoX3RhYl9zaXplKTsKLSAgICAgIGRvbWFpbi0+aGFzaF90YWIgPSAobmxzX3VpbnQzMiAqKQotCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX29mZnNldCkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRoaXMgaXMgYW4gaWxsZWdhbCByZXZpc2lvbi4gICovCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKLSAgICAgIGlmICh1c2VfbW1hcCkKLQltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzdC5zdF9zaXplKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCWZyZWUgKGRhdGEpOwotICAgICAgZnJlZSAoZG9tYWluKTsKLSAgICAgIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogU2hvdyB0aGF0IG9uZSBkb21haW4gaXMgY2hhbmdlZC4gIFRoaXMgbWlnaHQgbWFrZSBzb21lIGNhY2hlZAotICAgICB0cmFuc2xhdGlvbnMgaW52YWxpZC4gICovCi0gICsrX25sX21zZ19jYXRfY250cjsKLX0KZGlmZiAtLWdpdCBhL2ludGwvbG9jYWxlYWxpYXMuYyBiL2ludGwvbG9jYWxlYWxpYXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkOTE5NC4uMDAwMDAwMAotLS0gYS9pbnRsL2xvY2FsZWFsaWFzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyogSGFuZGxlIGFsaWFzZXMgZm9yIGxvY2FsZSBuYW1lcwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLSNlbHNlCi0jIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYQotY2hhciAqYWxsb2NhICgpOwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIF9HTlVfU09VUkNFCi0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBzdHJjYXNlY21wIF9fc3RyY2FzZWNtcAotI2VuZGlmCi0KLQotLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLwotI2lmZGVmIEhBVkVfQUxMT0NBCi0vKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCi0jZWxzZQotc3RydWN0IGJsb2NrX2xpc3QKLXsKLSAgdm9pZCAqYWRkcmVzczsKLSAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7Ci19OwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAotICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKLSAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKLSAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCi0gICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCi0gICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKLSAgICAgIGZyZWUgKG9sZCk7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYShzaXplKSAobWFsbG9jIChzaXplKSkKLSNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLwotCi0KLXN0cnVjdCBhbGlhc19tYXAKLXsKLSAgY29uc3QgY2hhciAqYWxpYXM7Ci0gIGNvbnN0IGNoYXIgKnZhbHVlOwotfTsKLQotCi1zdGF0aWMgc3RydWN0IGFsaWFzX21hcCAqbWFwOwotc3RhdGljIHNpemVfdCBubWFwID0gMDsKLXN0YXRpYyBzaXplX3QgbWF4bWFwID0gMDsKLQotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIHNpemVfdCByZWFkX2FsaWFzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbmFtZV9sZW4pKTsKLXN0YXRpYyB2b2lkIGV4dGVuZF9hbGlhc190YWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGFsaWFzX2NvbXBhcmUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpKTsKLQotCi1jb25zdCBjaGFyICoKLV9ubF9leHBhbmRfYWxpYXMgKG5hbWUpCi0gICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmxvY2FsZV9hbGlhc19wYXRoID0gTE9DQUxFX0FMSUFTX1BBVEg7Ci0gIHN0cnVjdCBhbGlhc19tYXAgKnJldHZhbDsKLSAgc2l6ZV90IGFkZGVkOwotCi0gIGRvCi0gICAgewotICAgICAgc3RydWN0IGFsaWFzX21hcCBpdGVtOwotCi0gICAgICBpdGVtLmFsaWFzID0gbmFtZTsKLQotICAgICAgaWYgKG5tYXAgPiAwKQotCXJldHZhbCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIGJzZWFyY2ggKCZpdGVtLCBtYXAsIG5tYXAsCi0JCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAotCQkJCQkgICAgICAgKGludCAoKikgUEFSQU1TICgoY29uc3Qgdm9pZCAqLAotCQkJCQkJCQkgY29uc3Qgdm9pZCAqKSkKLQkJCQkJCSkgYWxpYXNfY29tcGFyZSk7Ci0gICAgICBlbHNlCi0JcmV0dmFsID0gTlVMTDsKLQotICAgICAgLyogV2UgcmVhbGx5IGZvdW5kIGFuIGFsaWFzLiAgUmV0dXJuIHRoZSB2YWx1ZS4gICovCi0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JcmV0dXJuIHJldHZhbC0+dmFsdWU7Ci0KLSAgICAgIC8qIFBlcmhhcHMgd2UgY2FuIGZpbmQgYW5vdGhlciBhbGlhcyBmaWxlLiAgKi8KLSAgICAgIGFkZGVkID0gMDsKLSAgICAgIHdoaWxlIChhZGRlZCA9PSAwICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcpCi0JewotCSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0KLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSA9PSAnOicpCi0JICAgICsrbG9jYWxlX2FsaWFzX3BhdGg7Ci0JICBzdGFydCA9IGxvY2FsZV9hbGlhc19wYXRoOwotCi0JICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJ1wwJyAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnOicpCi0JICAgICsrbG9jYWxlX2FsaWFzX3BhdGg7Ci0KLQkgIGlmIChzdGFydCA8IGxvY2FsZV9hbGlhc19wYXRoKQotCSAgICBhZGRlZCA9IHJlYWRfYWxpYXNfZmlsZSAoc3RhcnQsIGxvY2FsZV9hbGlhc19wYXRoIC0gc3RhcnQpOwotCX0KLSAgICB9Ci0gIHdoaWxlIChhZGRlZCAhPSAwKTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgc2l6ZV90Ci1yZWFkX2FsaWFzX2ZpbGUgKGZuYW1lLCBmbmFtZV9sZW4pCi0gICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgICBpbnQgZm5hbWVfbGVuOwotewotI2lmbmRlZiBIQVZFX0FMTE9DQQotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7Ci0jZW5kaWYKLSAgRklMRSAqZnA7Ci0gIGNoYXIgKmZ1bGxfZm5hbWU7Ci0gIHNpemVfdCBhZGRlZDsKLSAgc3RhdGljIGNvbnN0IGNoYXIgYWxpYXNmaWxlW10gPSAiL2xvY2FsZS5hbGlhcyI7Ci0KLSAgZnVsbF9mbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZm5hbWVfbGVuICsgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZnVsbF9mbmFtZSk7Ci0gIG1lbWNweSAoZnVsbF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbik7Ci0gIG1lbWNweSAoJmZ1bGxfZm5hbWVbZm5hbWVfbGVuXSwgYWxpYXNmaWxlLCBzaXplb2YgYWxpYXNmaWxlKTsKLQotICBmcCA9IGZvcGVuIChmdWxsX2ZuYW1lLCAiciIpOwotICBpZiAoZnAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWRkZWQgPSAwOwotICB3aGlsZSAoIWZlb2YgKGZwKSkKLSAgICB7Ci0gICAgICAvKiBJdCBpcyBhIHJlYXNvbmFibGUgYXBwcm9hY2ggdG8gdXNlIGEgZml4IGJ1ZmZlciBoZXJlIGJlY2F1c2UKLQkgYSkgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZmlyc3QgdHdvIGZpZWxkcwotCSBiKSB0aGVzZSBmaWVsZHMgbXVzdCBiZSB1c2FibGUgYXMgZmlsZSBuYW1lcyBhbmQgc28gbXVzdCBub3QKLQkgICAgYmUgdGhhdCBsb25nCi0gICAgICAgKi8KLSAgICAgIGNoYXIgYnVmW0JVRlNJWl07Ci0gICAgICBjaGFyICphbGlhczsKLSAgICAgIGNoYXIgKnZhbHVlOwotICAgICAgY2hhciAqY3A7Ci0KLSAgICAgIGlmIChmZ2V0cyAoYnVmLCBCVUZTSVosIGZwKSA9PSBOVUxMKQotCS8qIEVPRiByZWFjaGVkLiAgKi8KLQlicmVhazsKLQotICAgICAgY3AgPSBidWY7Ci0gICAgICAvKiBJZ25vcmUgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoY3BbMF0pKQotCSsrY3A7Ci0KLSAgICAgIC8qIEEgbGVhZGluZyAnIycgc2lnbmFscyBhIGNvbW1lbnQgbGluZS4gICovCi0gICAgICBpZiAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnIycpCi0JewotCSAgYWxpYXMgPSBjcCsrOwotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKGNwWzBdKSkKLQkgICAgKytjcDsKLQkgIC8qIFRlcm1pbmF0ZSBhbGlhcyBuYW1lLiAgKi8KLQkgIGlmIChjcFswXSAhPSAnXDAnKQotCSAgICAqY3ArKyA9ICdcMCc7Ci0KLQkgIC8qIE5vdyBsb29rIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2YWx1ZS4gICovCi0JICB3aGlsZSAoaXNzcGFjZSAoY3BbMF0pKQotCSAgICArK2NwOwotCi0JICBpZiAoY3BbMF0gIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGNoYXIgKnRwOwotCSAgICAgIHNpemVfdCBsZW47Ci0KLQkgICAgICB2YWx1ZSA9IGNwKys7Ci0JICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKGNwWzBdKSkKLQkJKytjcDsKLQkgICAgICAvKiBUZXJtaW5hdGUgdmFsdWUuICAqLwotCSAgICAgIGlmIChjcFswXSA9PSAnXG4nKQotCQl7Ci0JCSAgLyogVGhpcyBoYXMgdG8gYmUgZG9uZSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgdGVzdAotCQkgICAgIGZvciB0aGUgZW5kIG9mIGxpbmUgcG9zc2libGUuICBXZSBhcmUgbG9va2luZyBmb3IKLQkJICAgICB0aGUgdGVybWluYXRpbmcgJ1xuJyB3aGljaCBkbyBub3Qgb3ZlcndyaXRlIGhlcmUuICAqLwotCQkgICpjcCsrID0gJ1wwJzsKLQkJICAqY3AgPSAnXG4nOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoY3BbMF0gIT0gJ1wwJykKLQkJKmNwKysgPSAnXDAnOwotCi0JICAgICAgaWYgKG5tYXAgPj0gbWF4bWFwKQotCQlleHRlbmRfYWxpYXNfdGFibGUgKCk7Ci0KLQkgICAgICAvKiBXZSBjYW5ub3QgZGVwZW5kIG9uIHN0cmR1cCBhdmFpbGFibGUgaW4gdGhlIGxpYmMuICBTaWdoISAgKi8KLQkgICAgICBsZW4gPSBzdHJsZW4gKGFsaWFzKSArIDE7Ci0JICAgICAgdHAgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICAgICAgaWYgKHRwID09IE5VTEwpCi0JCXsKLQkJICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JCSAgcmV0dXJuIGFkZGVkOwotCQl9Ci0JICAgICAgbWVtY3B5ICh0cCwgYWxpYXMsIGxlbik7Ci0JICAgICAgbWFwW25tYXBdLmFsaWFzID0gdHA7Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKHZhbHVlKSArIDE7Ci0JICAgICAgdHAgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICAgICAgaWYgKHRwID09IE5VTEwpCi0JCXsKLQkJICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JCSAgcmV0dXJuIGFkZGVkOwotCQl9Ci0JICAgICAgbWVtY3B5ICh0cCwgdmFsdWUsIGxlbik7Ci0JICAgICAgbWFwW25tYXBdLnZhbHVlID0gdHA7Ci0KLQkgICAgICArK25tYXA7Ci0JICAgICAgKythZGRlZDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUG9zc2libHkgbm90IHRoZSB3aG9sZSBsaW5lIGZpdHMgaW50byB0aGUgYnVmZmVyLiAgSWdub3JlCi0JIHRoZSByZXN0IG9mIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlIChzdHJjaHIgKGNwLCAnXG4nKSA9PSBOVUxMKQotCXsKLQkgIGNwID0gYnVmOwotCSAgaWYgKGZnZXRzIChidWYsIEJVRlNJWiwgZnApID09IE5VTEwpCi0JICAgIC8qIE1ha2Ugc3VyZSB0aGUgaW5uZXIgbG9vcCB3aWxsIGJlIGxlZnQuICBUaGUgb3V0ZXIgbG9vcAotCSAgICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KLQkgICAgKmNwID0gJ1xuJzsKLQl9Ci0gICAgfQotCi0gIC8qIFNob3VsZCB3ZSB0ZXN0IGZvciBmZXJyb3IoKT8gIEkgdGhpbmsgd2UgaGF2ZSB0byBzaWxlbnRseSBpZ25vcmUKLSAgICAgZXJyb3JzLiAgLS1kcmVwcGVyICAqLwotICBmY2xvc2UgKGZwKTsKLQotICBpZiAoYWRkZWQgPiAwKQotICAgIHFzb3J0IChtYXAsIG5tYXAsIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCi0JICAgKGludCAoKikgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSkgYWxpYXNfY29tcGFyZSk7Ci0KLSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotICByZXR1cm4gYWRkZWQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWV4dGVuZF9hbGlhc190YWJsZSAoKQotewotICBzaXplX3QgbmV3X3NpemU7Ci0gIHN0cnVjdCBhbGlhc19tYXAgKm5ld19tYXA7Ci0KLSAgbmV3X3NpemUgPSBtYXhtYXAgPT0gMCA/IDEwMCA6IDIgKiBtYXhtYXA7Ci0gIG5ld19tYXAgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBtYWxsb2MgKG5ld19zaXplCi0JCQkJCSAqIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCkpOwotICBpZiAobmV3X21hcCA9PSBOVUxMKQotICAgIC8qIFNpbXBseSBkb24ndCBleHRlbmQ6IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29yZS4gICovCi0gICAgcmV0dXJuOwotCi0gIG1lbWNweSAobmV3X21hcCwgbWFwLCBubWFwICogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSk7Ci0KLSAgaWYgKG1heG1hcCAhPSAwKQotICAgIGZyZWUgKG1hcCk7Ci0KLSAgbWFwID0gbmV3X21hcDsKLSAgbWF4bWFwID0gbmV3X3NpemU7Ci19Ci0KLQotc3RhdGljIGludAotYWxpYXNfY29tcGFyZSAobWFwMSwgbWFwMikKLSAgICAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMTsKLSAgICAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMjsKLXsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJDQVNFQ01QCi0gIHJldHVybiBzdHJjYXNlY21wIChtYXAxLT5hbGlhcywgbWFwMi0+YWxpYXMpOwotI2Vsc2UKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtYXAxLT5hbGlhczsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtYXAyLT5hbGlhczsKLSAgdW5zaWduZWQgY2hhciBjMSwgYzI7Ci0KLSAgaWYgKHAxID09IHAyKQotICAgIHJldHVybiAwOwotCi0gIGRvCi0gICAgewotICAgICAgLyogSSBrbm93IHRoaXMgc2VlbXMgdG8gYmUgb2RkIGJ1dCB0aGUgdG9sb3dlcigpIGZ1bmN0aW9uIGluCi0JIHNvbWUgc3lzdGVtcyBsaWJjIGNhbm5vdCBoYW5kbGUgbm9uYWxwaGEgY2hhcmFjdGVycy4gICovCi0gICAgICBjMSA9IGlzdXBwZXIgKCpwMSkgPyB0b2xvd2VyICgqcDEpIDogKnAxOwotICAgICAgYzIgPSBpc3VwcGVyICgqcDIpID8gdG9sb3dlciAoKnAyKSA6ICpwMjsKLSAgICAgIGlmIChjMSA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgKytwMTsKLSAgICAgICsrcDI7Ci0gICAgfQotICB3aGlsZSAoYzEgPT0gYzIpOwotCi0gIHJldHVybiBjMSAtIGMyOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9pbnRsL3BvMnRibC5zZWQuaW4gYi9pbnRsL3BvMnRibC5zZWQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYmNjYTQuLjAwMDAwMDAKLS0tIGEvaW50bC9wbzJ0Ymwuc2VkLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLSMgcG8ydGJsLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gbG9va3VwIHRhYmxlIGZvciBjYXRnZXRzCi0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotMSB7Ci0gIGlcCi0vKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBwbzJ0Ymwuc2VkIGZyb20gQFBBQ0tBR0UgTkFNRUAucG90LiAgKi9cCi1cCi0jaWYgSEFWRV9DT05GSUdfSFwKLSMgaW5jbHVkZSA8Y29uZmlnLmg+XAotI2VuZGlmXAotXAotI2luY2x1ZGUgImxpYmdldHRleHQuaCJcCi1cCi1jb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXSA9IHsKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgV3JpdGUgbXNnaWQgZW50cmllcyBpbiBDIGFycmF5IGZvcm0uCi0jCi0vXm1zZ2lkLyB7Ci0gIHMvbXNnaWRbIAldKlwoIi4qIlwpLyAge1wxLwotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZQotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KLSAgcy9cKC4qXCkiXChcblwpIlwoLioiXCkvXDFcMlwzLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotIyBCZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBmaWxlIGNvcnJlY3RseSBmb3JtZWQgdGhlIGxpbmUKLSMganVzdCByZWFkIGNhbm5vdCBiZSBhZ2FpbiBiZSBhIG1zZ2lkIGxpbmUuICBTbyBpdCdzIHNhZmUgdG8gaWdub3JlCi0jIGl0LgotICBzL1woLipcKVxuLiovXDEvCi0gIGJjCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgotICBzLy4qXG5cKC4qXCkvXDEvCi0jIFNvbWUgYnVnZ3kgc2VkcyBkbyBub3QgY2xlYXIgdGhlIGBzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbiBzaW5jZSBsYXN0IGBgdCcnJwotIyBmbGFnIG9uIGBOJywgc28gd2UgZG8gYSBgdCcgaGVyZSB0byBjbGVhciBpdC4KLSAgdGIKLSMgTm90IHJlYWNoZWQKLSAgOmMKLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSAgRwotICBzL1woLipcKVxuXChbMC05XSpcKS9cMSwgXDJ9LC8KLSAgcy9cKC4qXCkiJC9cMS8KLSAgcAotfQotIwotIyBMYXN0IGxpbmUuCi0jCi0kIHsKLSAgaVwKLX07XAotCi0gIGcKLSAgcy8wKlwoLipcKS9pbnQgX21zZ190YmxfbGVuZ3RoID0gXDE7L3AKLX0KLWQKZGlmZiAtLWdpdCBhL2ludGwvdGV4dGRvbWFpbi5jIGIvaW50bC90ZXh0ZG9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDkzNDAuLjAwMDAwMDAKLS0tIGEvaW50bC90ZXh0ZG9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRleHRkb21haW4oMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgdGV4dCBkb21haW4uICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXTsKLQotLyogRGVmYXVsdCB0ZXh0IGRvbWFpbiBpbiB3aGljaCBlbnRyaWVzIGZvciBnZXR0ZXh0KDMpIGFyZSB0byBiZSBmb3VuZC4gICovCi1leHRlcm4gY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBURVhURE9NQUlOIF9fdGV4dGRvbWFpbgotIyBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKLSNlbHNlCi0jIGRlZmluZSBURVhURE9NQUlOIHRleHRkb21haW5fXwotI2VuZGlmCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotY2hhciAqCi1URVhURE9NQUlOIChkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICBjaGFyICpvbGQ7Ci0KLSAgLyogQSBOVUxMIHBvaW50ZXIgcmVxdWVzdHMgdGhlIGN1cnJlbnQgc2V0dGluZy4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIG9sZCA9IChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIC8qIElmIGRvbWFpbiBuYW1lIGlzIHRoZSBudWxsIHN0cmluZyBzZXQgdG8gZGVmYXVsdCBkb21haW4gIm1lc3NhZ2VzIi4gICovCi0gIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcKLSAgICAgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pID09IDApCi0gICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBmb2xsb3dpbmcgbWFsbG9jIGZhaWxzIGBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbicKLQkgd2lsbCBiZSBOVUxMLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGFuZCBzbyBzaWduYWxzIHdlCi0JIGFyZSBvdXQgb2YgY29yZS4gICovCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0gICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IHN0cmR1cCAoZG9tYWlubmFtZSk7Ci0jZWxzZQotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwotICAgICAgY2hhciAqY3AgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAoY3AgIT0gTlVMTCkKLQltZW1jcHkgKGNwLCBkb21haW5uYW1lLCBsZW4pOwotICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBjcDsKLSNlbmRpZgotICAgIH0KLQotICBpZiAob2xkICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQotICAgIGZyZWUgKG9sZCk7Ci0KLSAgcmV0dXJuIChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX190ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC94b3Blbi1tc2cuc2VkIGIvaW50bC94b3Blbi1tc2cuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTljMGJiLi4wMDAwMDAwCi0tLSBhL2ludGwveG9wZW4tbXNnLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIFgvT3BlbiBzdHlsZSAubXNnIGZpbGUKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jCi0jIFRoZSBmaXJzdCBkaXJlY3RpdmUgaW4gdGhlIC5tc2cgc2hvdWxkIGJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotIyBtZXNzYWdlIHNldCBudW1iZXIuICBXZSB1c2UgYWx3YXlzIHNldCBudW1iZXIgMS4KLSMKLTEgewotICBpXAotJHNldCAxICMgQXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHBvMm1zZy5zZWQKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgV2UgY29weSBhbGwgY29tbWVudHMgaW50byB0aGUgLm1zZyBmaWxlLiAgUGVyaGFwcyB0aGV5IGNhbiBoZWxwLgotIwotL14jLyBzL14jWyAJXSovJCAvcAotIwotIyBXZSBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFzIGEgY29tbWVudCBpbnRvIHRoZSAubXNnIGZpbGUuCi0jCi0vXm1zZ2lkLyB7Ci0jIERvZXMgbm90IHdvcmsgbm93Ci0jICAvIiQvISB7Ci0jICAgIHMvXFwkLy8KLSMgICAgcy8kLyAuLi4gKG1vcmUgbGluZXMgZm9sbG93aW5nKSIvCi0jICB9Ci0gIHMvXm1zZ2lkWyAJXSoiXCguKlwpIiQvJCBPcmlnaW5hbCBNZXNzYWdlOiBcMS8KLSAgcAotfQotIwotIyBUaGUgLm1zZyBmaWxlIGNvbnRhaW5zLCBvdGhlciB0aGVuIHRoZSAucG8gZmlsZSwgb25seSB0aGUgdHJhbnNsYXRpb25zCi0jIGJ1dCBlYWNoIGdpdmVuIGEgdW5pcXVlIElELiAgU3RhcnRpbmcgZnJvbSAxIGFuZCBpbmNyZW1lbnRpbmcgYnkgMSBmb3IKLSMgZWFjaCBtZXNzYWdlIHdlIGFzc2lnbiB0aGVtIHRvIHRoZSBtZXNzYWdlcy4KLSMgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIC5wbyBmaWxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNhdC1pZC10YmwuYyBmaWxlCi0jICh3aXRoIHBvLXRvLXRibCkgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGhlcmUuICAoQXQgbGVhc3QgdGhlIG9yZGVyCi0jIG9mIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBiZSBjaGFuZ2VkLikKLSMKLS9ebXNnc3RyLyB7Ci0gIHMvbXNnc3RyWyAJXSoiXCguKlwpIi9cMS8KLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSMgQnJpbmcgdGhlIGxpbmUgaW4gdGhlIGZvcm1hdCBgPG51bWJlcj4gPG1lc3NhZ2U+JwotICBHCi0gIHMvXlteXG5dKiQvJiAvCi0gIHMvXCguKlwpXG5cKFswLTldKlwpL1wyIFwxLwotIyBDbGVhciBmbGFnIGZyb20gbGFzdCBzdWJzdGl0dXRpb24uCi0gIHRiCi0jIEFwcGVuZCB0aGUgbmV4dCBsaW5lLgotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBhIGNvbnRpbnVhdGlvbiBsaW5lLgotICBzL1woLipcblwpIlwoLipcKSIvXDFcMi8KLSMgWWVzLCB0aGVuIGJyYW5jaC4KLSAgdGEKLSAgUAotICBECi0jIE5vdGUgdGhhdCBgRCcgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgdGhlIHNlZCBjb21tYW5kIGBEJyBoZXJlCi0gIHMvLipcblwoLipcKS9cMS8KLSAgdGIKLX0KLWQKZGlmZiAtLWdpdCBhL2xkL0NoYW5nZUxvZyBiL2xkL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyNmNlMC4uMDAwMDAwMAotLS0gYS9sZC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw5Njc1ICswLDAgQEAKLTE5OTktMTItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBGaXggYXJtLWVwb2MtcGUgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JCi0JKiBlbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoIChTQ1JJUFRfTkFNRSk6IFNldCB0byBlcG9jcGUuCi0KLQkqIHNjcmlwdHRlbXBsL2Vwb2NwZS5zYzogTmV3IGZpbGU6IGNvcHkgb2YgcGUuc2MsIGN1c3RvbWlzZWQgZm9yCi0JRVBPQyBieSBwbGFjaW5nIC5yZGF0YSBpbnRvIC50ZXh0LgotCi0xOTk5LTExLTI2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBjb25maWd1cmUuaW46IFB1dCBBQ19NU0dfQ0hFQ0tJTkcvQUNfTVNHX1JFU1VMVCBhcm91bmQgY2hlY2sgZm9yCi0JU1RSSU5HSUZZLiAgVXNlIHllcy9ubyBpbnN0ZWFkIG9mIHRydWUvZmFsc2UgYXMgdmFsdWUgZm9yIGNhY2hlCi0JdmFyaWFibGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMTEtMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChJR05PUkVfU0VDVElPTik6IFNlY3Rpb24gbXVzdCBoYXZlIGJvdGggQUxMT0MgYW5kIExPQUQKLQlhdHRyaWJ1dGVzIGluIG9yZGVyIHRvIGJlIGNoZWNrZWQuCi0KLTE5OTktMTEtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKTogRml4IHRlc3QgdG8gZGV0ZXJtaW5lCi0JaWYgYSBzZWN0aW9uIHNob3VsZCBiZSB0ZXN0ZWQuCi0JKElHTk9SRV9TRUNUSU9OKTogTmV3IG1hY3JvLgotCi1XZWQgTm92ICAzIDIzOjMxOjE5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JQ2xlYW4gdXAgY29kZSB0byB1c2UgRVhUUkFfU0hMSUJfRVhURU5TSU9OLgotCi0xOTk5LTExLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggKE9VVFBVVF9GT1JNQVQpOiBDaGFuZ2UgdG8gbGl0dGxlIGVuZGlhbi4KLQkqIGVtdWxwYXJhbXMvbWNvcmVwZS5zaCAoT1VUUFVUX0ZPUk1BVCk6IENoYW5nZSB0byBsaXR0bGUgZW5kaWFuLgotCi0xOTk5LTExLTAxICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogUmV3b3JrIHRvIHVzZSBoYXNoIHRhYmxlLgotCShhbHJlYWR5X2xpbmtlZF9uZXdmdW5jKTogTmV3IGZ1bmN0aW9uLgotCShhbHJlYWR5X2xpbmtlZF90YWJsZV9pbml0KTogTmV3IGZ1bmN0aW9uLgotCShhbHJlYWR5X2xpbmtlZF90YWJsZV9mcmVlKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3Byb2Nlc3MpOiBJbml0aWFsaXplIGFuZCBmcmVlIHRoZSBhbHJlYWR5X2xpbmtlZCBoYXNoIHRhYmxlLgotCi0xOTk5LTEwLTI3ICBBbmRyZWFzIEphZWdlciAgPGFqQHN1c2UuZGU+Ci0KLQkqIGxkL2NvbmZpZ3VyZS5ob3N0OiBBZGRlZCBIT1NUSU5HX0NSVDAsIEhPU1RJTkdfTElCUyBmb3IgCi0JdGFyZ2V0ICJtaXBzKi0qLWxpbnV4LWdudSoiLgotCi0xOTk5LTEwLTI3ICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbTogSW5jbHVkZSBjdHlwZS5oIHRvIHByZXZlbnQgY29tcGlsZSB0aW1lCi0Jd2FybmluZ3MuIAotCi0xOTk5LTEwLTI2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbSAoZ2xke31fZmluaXNoKTogUmVtb3ZlIGV4dHJhbmVvdXMKLQl1bmRlcnNjb3JlIGZyb20gcHJvdG90eXBlLgotCSogZW11bHRlbXBsL2FybWVsZi5lbSAoZ2xke31fZmluaXNoKTogUmVtb3ZlIGV4dHJhbmVvdXMKLQl1bmRlcnNjb3JlIGZyb20gcHJvdG90eXBlLgotCi0xOTk5LTEwLTA3ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoLnJlbC5zZGF0YSk6IENvbWJpbmUgYWxsIHRoZSBzZGF0YSByZWxvY3MKLQliZWluZyAucmVsLnNkYXRhLCAucmVsLnNkYXRhLiosIC5yZWwuZ251LmxpbmtvbmNlLnMqLgotCSgucmVsYS5zZGF0YSk6IExpa2V3aXNlIGZvciAucmVsYS5zZGF0YS4qIGFuZCAucmVsYS5nbnUubGlua29uY2UucyouCi0JKC5yZWwuc2Jzcyk6IE1ha2UgbGlrZSAucmVsLmJzcy4KLQkoLnJlbGEuc2Jzcyk6IE1ha2UgbGlrZSAucmVsLmJzcy4KLQkoLnNkYXRhKTogRG9uJ3QgaW5jbHVkZSAuZ251LmxpbmtvbmNlLnMuKiBvciAuc2RhdGEuKiB3aGVuCi0JbGQgLXIuCi0JKC5zYnNzKTogRG8gdGhlIHNhbWUgdGhpbmdzIGFzIGZvciAuYnNzOiBpbmNsdWRlIFNEQVRBX1NUQVJUX1NZTUJPTFMsCi0JLmR5bnNic3MuCi0KLTE5OTktMDktMjkgIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBEZWZlcgotCW1lcmdpbmcgc2VjdGlvbnMgd2hlbiBub3QgcmVsb2NhdGluZy4KLQotMTk5OS0wOS0yOCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHBlLWRsbC5jIChwcm9jZXNzX2RlZl9maWxlKTogTW92ZSB0aGUgb2Zmc2V0IGxvb2t1cCBmcm9tIGhlcmUgdG8KLQkoZmlsbF9leHBvcnRlZF9vZmZzZXRzKTogaGVyZS4gTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZmlsbF9lZGF0YSk6IFVzZS4KLQkKLTE5OTktMDktMjggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBkZWZmaWxlcC55ICh0b2tlbnMpOiBBZGQgdXBwZXIgYW5kIGxvd2VyIGNhc2UgdmVyc2lvbnMgb2YgREFUQSwKLQlDT05TVEFOVCwgTk9OQU1FIGFuZCBQUklWQVRFIHRva2Vucy4KLQkoY29tbWFuZCk6IFVzZSBEQVRBVS4KLQkoZXhwbGluZSk6IEFsbG93IGZvciBkcmVjdHZlIHN5bnRheCBhcyB3ZWxsLgotCShleHBfb3B0X2xpc3QpOiBMaWtld2lzZS4KLQkoZXhwX29wdCk6IExpa2V3aXNlLgotCSogcGUtZGxsLmMgKG1ha2Vfb25lKTogT25seSBnZW5lcmF0ZSB0aGUgaWRhdGEgZW50cmllcyBmb3IgZGF0YQotCXN5bWJvbHMuCi0KLTE5OTktMDktMjggIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjICguc2RhdGEpOiBJbmNsdWRlIC5nbnUubGlua29uY2Uucy4qIHNlY3Rpb25zCi0JaW4gLnNkYXRhIHRvby4KLQotMTk5OS0wOS0yNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjICguYnNzKTogQWNjZXB0IHNlY3Rpb25zIG5hbWVkIC5ic3MuKgotCSguc2Jzcyk6IEFjY2VwdCBzZWN0aW9ucyBuYW1lcyAuc2Jzcy4qCi0KLTE5OTktMDktMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgZWFybV9lcG9jX3BlLmMgYnVpbGQgdGFyZ2V0LiAKLQotU2F0IFNlcCAxOCAwNzo1NzoxMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKE9USEVSX1JFQURPTkxZX1NZTUJPTFMpOiBSZW1vdmUgIi5zdHVicyIsCi0JdGhleSd2ZSBiZWVuIHJlbmFtZWQgdG8gIi5zdHViIiwgd2hpY2ggaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5Ci0JYnkgZWxmLnNjLgotCi1GcmkgU2VwIDE3IDExOjAwOjMzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoVEVYVF9TVEFSVF9TWU1CT0xTKTogS2lsbCBjb21wbGV0ZWx5LgotCShEQVRBX1NUQVJUX1NZTUJPTFMpOiBLaWxsIF9faHBfbG9hZF9tYXAgZGVmaW5pdGlvbgotCi1UaHUgU2VwIDE2IDEwOjU5OjU2IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JVXNlIHRoZSBzYW1lIGZpbGVuYW1lIGV4dGVuc2lvbiBmb3IgdGhlIGJmZF9lbGZfZHRfbmVlZGVkX25hbWUgY2FsbAotCWFzIHdlIGRpZCBmb3IgZmluZGluZyB0aGUgbGlicmFyeS4KLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoREFUQV9TVEFSVF9TWU1CT0xTKTogRGVmaW5lLgotCShPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBObyBsb25nZXIgZGVmaW5lIF9faHBfbG9hZF9tYXAuCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKFRFWFRfU1RBUlRfU1lNQk9MUyk6IERlZmluZS4KLQotV2VkIFNlcCAxNSAwMjo0Nzo0MyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKFNITElCX1RFWFRfU1RBUlRfQUREUik6IERlZmluZS4KLQkoU0hMSUJfREFUQV9BRERSKTogTGlrZXdpc2UuCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKFRFWFRfRFlOQU1JQyk6IERlZmluZS4KLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5oIChPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiAgTm8gbG9uZ2VyIGNvbWJpbmUKLQl0aGUgLnBsdCwgLmRsdCwgLm9wZCAgaW50byBhIHNpbmdsZSBvdXRwdXQgc2VjdGlvbi4gIFByb3ZpZGUgdmFsdWVzCi0JZm9yIF9fZ3AgYW5kIF9faHBfbG9hZF9tYXAuCi0KLTE5OTktMDktMTQgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKENhbm9uaWNhbGl6YXRpb24gb2YgdGFyZ2V0IG5hbWVzKTogUmVtb3ZlIGFkZGluZwotCSR7Q09ORklHX1NIRUxMfSBpbiBmcm9udCBvZiAkYWNfY29uZmlnX3N1Yiwgc2luY2UgYXV0b2NvbmZpZyAyLjE0Ci0JZ2VuZXJhdGVzICRhY19jb25maWdfc3ViIHdpdGggYSAke0NPTkZJR19TSEVMTH0gYWxyZWFkeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wOS0xNCAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBhbGxvdyBmb3IgCi0JdGVybWluYXRpbmcgbnVsbC4KLQotMTk5OS0wOS0xNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEVYVFJBX1NITElCX0VYVEVOU0lPTiB0byAiLnNsIiBmb3IgSFAgdGFyZ2V0LgotCSogY29uZmlnLmluOiBBZGQgRVhUUkFfU0hMSUJfRVhURU5TSU9OLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlTZWFyY2ggZm9yIHNlY29uZCBzaGFyZWQgbGliIGV4dGVuc2lvbiBvbmx5IGlmIEVYVFJBX1NITElCX0VYVEVOU0lPTgotCWlzIGRlZmluZWQuCi0KLTE5OTktMDktMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZWFybV9lcG9jX3BlLmMgYnVpbGQgdGFyZ2V0LgotCi1UdWUgU2VwIDE0IDA1OjI2OjM0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoT1RIRVJfR09UX1JFTE9DX1NFQ1RJT05TKTogQWRkIC5yZWxhLmRsdC4KLQotMTk5OS0wOS0xMyAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogUmVtb3ZlIHRoZSBvdXRwdXQgZmlsZSBhdCB0aGUgc3RhcnQsIGluIGNhc2UgaXQKLQlpcyBub3Qgd3JpdGFibGUuCi0KLU1vbiBTZXAgMTMgMDA6MTc6MTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlTZWFyY2ggZm9yIGZpbGUgd2l0aCAuc2wgZXh0ZW5zaW9uIGlmIG5vIGZpbGUgd2l0aCBhIC5zbyBleHRlbnNpb24KLQlpcyBmb3VuZC4KLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogUHV0IC5wbHQKLQlhdCB0aGUgc3RhcnQgb2YgdGhlIC5kbHQgb3V0cHV0IHNlY3Rpb24uCi0KLTE5OTktMDktMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBwZS5lbTogRG9uJ3QgaW5jbHVkZSAiLi4vYmZkL2xpYmJmZC5oIi4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBVc2UgeG1hbGxvYyByYXRoZXIgdGhhbgotCWJmZF9hbGxvYy4KLQotCSogcGUtZGxsLmg6IE5ldyBmaWxlLgotCSogcGUtZGxsLmM6IEluY2x1ZGUgInBlLWRsbC5oIi4gIE1hcmsgdW51c2VkIGFyZ3VtZW50cyBhcyBuZWVkZWQKLQl0byBhdm9pZCB3YXJuaW5ncy4KLQkoZWRhdGFfc3osIHJlbG9jX3N6KTogQ2hhbmdlIGZyb20gaW50IHRvIHNpemVfdC4KLQkocGVfZGV0YWlsc190eXBlKTogQ2hhbmdlIHR5cGUgb2YgaW1hZ2ViYXNlX3JlbG9jIGZyb20gaW50IHRvCi0JdW5zaWduZWQgaW50LgotCShwZV9kZXRhaWxfbGlzdCk6IEZ1bGx5IGluaXRpYWxpemUgbGFzdCBlbnRyeS4KLQkocGVfZGxsX2lkX3RhcmdldCk6IENoYW5nZSBwYXJhbWV0ZXIgdG8gY29uc3QuCi0JKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IExpa2V3aXNlLgotCShwZV9kbGxfZ2VuZXJhdGVfaW1wbGliKTogTGlrZXdpc2UuCi0JKHBlX2ltcGxpZWRfaW1wb3J0X2RsbCk6IExpa2V3aXNlLiAgQ2hhbmdlIGRsbF9uYW1lIHRvIGNvbnN0LgotCSogZW11bHRlbXBsL3BlLmVtOiBJbmNsdWRlICJwZS1kbGwuaCIuICBSZW1vdmUgZGVjbGFyYXRpb25zIG5vdyBpbgotCXBlLWRsbC5oLgotCShpbml0KTogRnVsbHkgaW5pdGlhbGl6ZSBfX2RsbF9fIGVudHJ5LgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCi0Jc2VxdWVuY2UsIGVsdCwgYW5kIGkuCi0JKiBkZWZmaWxlLmg6IEFkZCBwcmVwcm9jZXNzb3IgZ3VhcmQuCi0JKiBkZWZmaWxlcC55IChkZWZfZGVidWcpOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEhGSUxFUyk6IEFkZCBwZS1kbGwuaC4KLQotMTk5OS0wOS0xMiAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGxkLmggKGxkX2Fib3J0KTogRGVjbGFyZS4KLQkoYWJvcnQpOiBEZWZpbmUuCi0JKiBsZG1pc2MuYyAobGRfYWJvcnQpOiBEZWZpbmUuCi0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBVc2UgJHtFTlRSWX0gcmF0aGVyIHRoYW4gX21haW5DUlRTdGFydHVwLgotCU1vdmUgLmJzcyBzZWN0aW9uIGFmdGVyIC5yZGF0YS4gIE1vdmUgLnJlbG9jIHNlY3Rpb24gYWZ0ZXIgLnJzcmMuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVXNlIHN0cnRvdWwgZm9yIC0tc3BsaXQtYnktcmVsb2MKLQlhcmd1bWVudC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBJZiB3ZSBnZXQgYW4gdW5yZWNvZ25pemVkIGFyZ3VtZW50LAotCW1lbnRpb24gLS1oZWxwLgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IFVzZSBjb21kYXQgaW5mb3JtYXRpb24gaWYgaXQKLQlpcyBhdmFpbGFibGUuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UKTogSWYKLQlPVkVSUklERV9TRUNUSU9OX0FMSUdOTUVOVCBpcyBkZWZpbmVkLCBjaGFuZ2UgdG8gdGhhdC4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFVzZSBFWEVDVVRBQkxFX05BTUUgaWYgaXQgaXMKLQlkZWZpbmVkLCByYXRoZXIgdGhhbiBhLmV4ZS4KLQkoaW5pdCk6IERlZmluZSBfX3N1YnN5c3RlbV9fIGFzICR7U1VCU1lTVEVNfS4KLQkoc2V0X3BlX3N1YnN5c3RlbSk6IEFkZCAke0lOSVRJQUxfU1lNQk9MX0NIQVJ9IGJlZm9yZSBlbnRyeSBzeW1ib2wKLQluYW1lLgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0KTogQ2hhbmdlIGxvY2FsIHZhcmlhYmxlIGRlc2lyZWRfZW5kaWFuCi0JZnJvbSBpbnQgdG8gZW51bSBiZmRfZW5kaWFuLgotCi0JKiBlbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoOiBEZWZpbmUgRU5UUlksIFNVQlNZU1RFTSBhbmQKLQlJTklUSUFMX1NZTUJPTF9DSEFSLgotCSogZW11bHBhcmFtcy9hcm1wZS5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21vcmVwZS5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL3BwY3BlLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvaTM4NnBlLnNoIChFTlRSWSk6IERlZmluZSBhcyBfbWFpbkNSVFN0YXJ0dXAuCi0JKFNVQlNZU1RFTSk6IERlZmluZSBhcyBQRV9ERUZfU1VCU1lTVEVNLgotCi1GcmkgU2VwIDEwIDAwOjIyOjUwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoTElCX1BBVEgpOiBEZWZpbmUuCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKE9USEVSX1JFQURPTkxZX1NFQ1RJT05TKTogUHV0IHN0dWJzIGJlZm9yZQotCXVud2luZGVycyBzbyB0aGF0IHRoZXkgYXJlIGNsb3NlciB0byB0aGUgdGV4dCBzZWN0aW9uLgotCShPVEhFUl9CU1NfU0VDVElPTlMpOiBEZWZpbmUuCi0JKEVYRUNVVEFCTEVfU1lNQk9MUyk6IFByb3ZpZGUgX19TWVNURU1fSUQgYW5kIF9GUFVfU1RBVFVTLgotCShJTklUX1NUQVJULCBJTklUX0VORCk6IERlZmluZS4KLQkoRklOSV9TVEFSVCwgRklOSV9FTkQpOiBEZWZpbmUuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBzdXBwb3J0IGZvciBJTklUX1NUQVJULCBJTklUX0VORCwKLQlGSU5JX1NUQVJULCBGSU5JX0VORCBhbmQgT1RIRVJfQlNTX1NFQ1RJT05TLgotCi1UaHUgU2VwICA5IDIxOjQzOjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoVEVYVF9TVEFSVF9BRERSKTogTW92ZSB1cCBvbmUgcGFnZS4KLQkoREFUQV9BRERSKTogRGVmaW5lLgotCi0xOTk5LTA5LTA5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoUkVBRE9OTFlfU1RBUlRfQUREUik6IFNldCB0byAweDIwMDAwMDQuCi0KLTE5OTktMDktMDkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGxkLnRleGluZm86IEZpeCBhcmd1bWVudHMgb2YgQHZhciB0byBub3QgY29udGFpbiBwdW5jdHVhdGlvbi4KLQotVGh1IFNlcCAgOSAwNTo1MjozNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IERlZmluZS4KLQotMTk5OS0wOS0wOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmNjRocHBhLnNoIChFTEZTSVpFKTogTmV3LiAgU2V0IHRvIDY0LgotCi1XZWQgU2VwICA4IDAwOjA3OjM5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoRU5UUlkpOiBEZWZpbmUgdG8gbWFpbi4KLQotMTk5OS0wOS0wMyAgU2NvdHQgQmFtYnJvdWdoICA8c2NvdHRiQG5ldHdpbmRlci5vcmc+Ci0KLQkqIGxkL2NvbmZpZ3VyZS5ob3N0OiBBZGRlZCBIT1NUSU5HX0NSVDAsIEhPU1RJTkdfTElCUyBmb3IgCi0JdGFyZ2V0ICJhcm0qLSotbGludXgtZ251KiIKLQotMTk5OS0wOS0wNCAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcG9ib3guY29tPgotCi0JKiBjb25maWd1cmUudGd0IChwamwtKi0qLCBwai0qLSopOiBOZXcgdGFyZ2V0cy4KLQkqIGVtdWxwYXJhbXMvcGplbGYuc2g6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9wamxlbGYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvcGouc2M6IE5ldyBmaWxlLgkKLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlcGplbGYubyBhbmQgZXBqbGVsZi5vLgotCShlcGplbGYubywgZXBqbGVsZi5vKTogTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIFNlcCAgMyAyMDoxNzowOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmNjRocHBhLnNoIChNQVhQQUdFU0laRSk6IERlZmluZS4KLQkoT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMsIERBVEFfUExUKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgIDIgMTQ6MzI6MDMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjY0aHBwYS5zaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUudGd0IChocHBhKnctKi0qKTogVXNlIGVsZjY0aHBwYSBlbXVsYXRpb24uCi0JKiBNYWtlZmlsZS5hbSAoQUxMXzY0X0VNVUxBVElPTlMpOiBBZGQgZWVsZjY0aHBwYS5vCi0JKGVlbGY2NGhwcGEuYyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KLQotMTk5OS0wOC0yNSAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMvYXJtZWxmLnNoIChPVEhFUl9CU1NfU1lNQk9MUyk6IEFkZCBfX2VuZF9fLgotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaDogTGlrZXdpc2UuCi0KLTE5OTktMDgtMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlGcm9tIGEgcGF0Y2ggc3VibWl0dGVkIGJ5IFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGJhYWxwZXJhemltLmZyb2IuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChhcm0tKi1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlYXJtbmJzZC5vLgotCShlYXJtbmJzZC5jKTogTmV3IHJ1bGUgd2l0aCBkZXBzLgotCSogTWFrZWZpbGUub246IFJlZ2VuZXJhdGUuCi0JKiBlbXVscGFyYW1zL2FybW5ic2Quc2g6IE5ldyBmaWxlLgotCi0xOTk5LTA4LTIzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggKFBBUlNFX0FORF9MSVNUX0FSR1MpOiBEZWZpbmUuCi0JSW1wbGVtZW50IC0tYmFzZS1maWxlIGNvbW1hbmQgbGluZSBzd2l0Y2guCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogQWRkIGFiaWxpdHkgZm9yIGluZGl2aWR1YWwgdGFyZ2V0cyB0byBoYXZlCi0JdGhlaXIgb3duIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyBieSBkZWZpbmluZyBQQVJTRV9BTkRfTElTVF9BUkdTLgotCi0xOTk5LTA4LTE5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlICR7Q0N9IGluc3RlYWQgb2YgZ2NjIGZvciBmaW5kaW5nIGNvbXBpbGVyCi0JcmVsYXRlZCBmaWxlcy4KLQotMTk5OS0wOC0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvbWNvcmVwZS5zYyAoT1VUUFVUX0ZPUk1BVCk6IEZpeCB0eXBvLgotCi0xOTk5LTA4LTA5ICBNYXJrIEVsYnJlY2h0ICA8c25vd2JhbGwzQGJpZ2Zvb3QuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYzogSGFuZGxlIGcrKyBleGNlcHRpb24gc2VjdGlvbnMuCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBXYWxseSBJaW11cmEgPGlpbXVyYUBtaWNyb3VuaXR5LmNvbT46Ci0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogV2hlbiBjaGVja2luZyB3aGV0aGVyIGFuIGFkZHJlc3MKLQlpcyB3aXRoaW4gYSByZWdpb24sIGRvbid0IGdldCBjb25mdXNlZCBieSB3cmFwcGluZyBhcm91bmQgYXQgdGhlCi0JZW5kIG9mIHRoZSBhZGRyZXNzIHNwYWNlLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IFVwZGF0ZSBmb3IgcmVuYW1pbmcgb2YgU0VDX1NIT1JUIHRvCi0JU0VDX1NNQUxMX0RBVEEuCi0KLQkqIE1ha2VmaWxlLmFtOiBSZW5hbWUgLmRlcCogZmlsZXMgdG8gREVQKi4gIENoYW5nZSBERVAgdmFyaWFibGUgdG8KLQlNS0RFUC4gIFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotbGludXgtZ251Kik6IE5ldyBob3N0LgotCShzcGFyYzY0LSotbGludXgtZ251Kik6IE5ldyBob3N0LgotCi0xOTk5LTA4LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGV4c3VwLmMgKGlzX251bSk6IFJlaW5kZW50LgotCShwYXJzZV9hcmdzKTogTWVudGlvbiBwcm9ncmFtIG5hbWUgaW4gZXJyb3IgbWVzc2FnZS4KLQotCSogZW11bHRlbXBsL29zdHJpbmcuc2VkOiBSZW5hbWUgZnJvbSBzdHJpbmdpZnkuc2VkLgotCSogZW11bHRlbXBsL2FzdHJpbmcuc2VkOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChzdHJpbmdpZnkuc2VkKTogTmV3IHRhcmdldC4KLQkoR0VOX0RFUEVORFMpOiBDaGFuZ2UgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIHRvCi0Jc3RyaW5naWZ5LnNlZC4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIFNUUklOR0lGWS4KLQkqIGVtdWx0ZW1wbC8qLmVtOiBVc2Ugc3RyaW5naWZ5LnNlZCBmcm9tIGJ1aWxkIGRpcmVjdG9yeSByYXRoZXIKLQl0aGFuIHNvdXJjZSBkaXJlY3RvcnkuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IFVzZSBzdHJpbmdpZnkuc2VkIHJhdGhlciB0aGFuIGlubGluZSBzZWQKLQlzY3JpcHQuCi0JKiBlbXVsdGVtcGwvZ2xkOTYwLmVtLCBlbXVsdGVtcGwvZ2xkOTYwYy5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbSwgZW11bHRlbXBsL2xpbnV4LmVtOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9sbms5NjAuZW0sIGVtdWx0ZW1wbC9zdW5vcy5lbTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA1ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogZW11bHBhcmFtcy9pMzg2cGUuc2g6IERlZmluZSBFTlRSWSwgU1VCU1lTVEVNLCBhbmQKLQlJTklUSUFMX1NZTUJPTF9DSEFSLgotCSogZW11bHBhcmFtcy9pMzg2cGVfcG9zaXguc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFlBQ0MpOiBJZiBiaXNvbiBpcyBub3QgaW4gdGhlIHNvdXJjZSB0cmVlLCB1c2UKLQlAWUFDQ0AgcmF0aGVyIHRoYW4gYmlzb24gLXkuCi0JKExFWCk6IElmIGZsZXggaXMgbm90IGluIHRoZSBzb3VyY2UgdHJlZSwgdXNlIEBMRVhAIHJhdGhlciB0aGFuCi0JZmxleC4KLQkoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWkzODZwZV9wb3NpeC5vLgotCShlaTM4NnBlX3Bvc2l4LmMpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotaW50ZXJpeCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1Nl04Ni1wYy1pbnRlcml4Kik6IE5ldyBob3N0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChNQVhQQUdFU0laRSk6IENoYW5nZSB0byAweDEwMDAwLgotCSogZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoIChNQVhQQUdFU0laRSk6IExpa2V3aXNlLgotCi0xOTk5LTA4LTAzICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IFJlbW92ZSBlZ28zMi5vLgotCShlZ28zMi5jKTogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDctMjIgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoIChEQVRBX1NUQVJUX1NZTUJPTFMpOiBEZWZpbmUuCi0JKE9USEVSX0JTU19TWU1CT0xTLCBPVEhFUl9CU1NfRU5EX1NZTUJPTFMpOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIChEQVRBX1NUQVJUX1NZTUJPTFMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKGFybSotKi11Y2xpbnV4KiwgdGh1bWItKi11Y2xpbnV4KiwKLQl0aHVtYi0qLWxpbnV4LWdudSopOiBOZXcgdGFyZ2V0cy4KLQotMTk5OS0wNy0yMSAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0BiaWdmb290LmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IEFkZCBoYW5kbGluZyBvZiBsaW5rb25jZSBzZWN0aW9ucy4KLQotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQkqIGVtdWxwYXJhbXMvZ28zMi5zaDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQkqIHNjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjOiBSZW1vdmU7IG9ic29sZXRlLgotCi0xOTk5LTA3LTIxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqZWwtKi12eHdvcmtzKik6IE5ldyB0YXJnZXQuCi0KLTE5OTktMDctMjEgIEJyYWQgTS4gR2FyY2lhICA8YmdhcmNpYUBmb3JlLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotdnh3b3JrcyopOiBOZXcgdGFyZ2V0LgotCi1UdWUgSnVsIDIwIDE1OjE4OjQ2IDE5OTkgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19nY19zZWN0aW9ucyk6IE9ubHkgaGFuZGxlIHRoZSBzdGFydCBzeW1ib2wKLQlzcGVjaWFsbHkgaWYgdGhlcmUgaXMgb25lLgotCi1Nb24gSnVsIDE5IDE0OjE5OjE0IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogQWRkCi0JLk1JUFMuZXZlbnRzIGFuZCAuTUlQUy5jb250ZW50IGhhbmRsaW5nLgotCSogZW11bHBhcmFtcy9lbGY2NGJtaXAuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBMaWtld2lzZS4KLQotMTk5OS0wNy0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGdldF90YXJnZXQpOiBOZXcgZnVuY3Rpb246IFJldHVybiB0cnVlIGlmZiB0aGUKLQlnaXZlbiB0YXJnZXQgaXMgdGhlIHRhcmdldCBiZWluZyBzb3VnaHQuCi0JKHN0cmljcHkpOiBOZXcgZnVuY3Rpb246ICBMaWtlIHN0cmNweSBidXQgY29udmVydCB0byBsb3dlcgotCWNhc2UgYXMgd2VsbC4KLQkoc3RyY3V0KTogTmV3IGZ1bmN0aW9uOiAgTGlrZSBzdHJzdHIgYnV0IHJlbW92ZSB0aGUgbG9jYXRlZAotCXN1YnN0cmluZyBhcyB3ZWxsLgotCShuYW1lX2NvbXBhcmUpOiBOZXcgZnVuY3Rpb246IENvbXB1dGUgYSBjb21wYXRhYmlsaXR5IHJhdGluZwotCWZvciB0d28gdGFyZ2V0IG5hbWVzLgotCSh3aW5uZXIpOiBOZXcgdmFyaWFibGU6IEJlc3QgdGFyZ2V0IGZvdW5kIGJ5Ci0JY2xvc2VzdF90YXJnZXRfbWF0Y2goKSBzbyBmYXIuCi0JKGNsb3Nlc3RfdGFyZ2V0X21hdGNoKTogTmV3IGZ1bmN0aW9uOiBGaW5kIHRoZSB0YXJnZXQgd2hpY2ggaXMKLQl0aGUgY2xvc2VzdCBtYXRjaCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LgotCShnZXRfZmlyc3RfaW5wdXRfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uOiBGaW5kIHRoZSB0YXJnZXQgZm9ybWF0Ci0Jb2YgdGhlIGZpcnN0IG9mIHRoZSBsaW5rZXIncyBpbnB1dCBmaWxlLgotCShvcGVuX291dHB1dCk6IEJlIG1vcmUgY2xldmVyIGFib3V0IGRlY2lkaW5nIHRoZSBvdXRwdXQgdGFyZ2V0Ci0JZm9ybWF0LiAKLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoOiBBZGQgNjQtYml0IGRpcmVjdG9yaWVzIHRvIG5hdGl2ZSBMSUJfUEFUSC4KLQotVGh1IEp1bCAxNSAxNTo1NToxNSAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IHVwIEhPU1RJTkdfQ1JUMCBhbmQgSE9TVElOR19MSUJTIGZvciBJUklYNi4KLQotMTk5OS0wNy0xNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVtcCB2ZXJzaW9uIG51bWJlciB0byAyLjkuNS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNy0xNCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IENvcHkgU0VDX1NIT1JUIHRvIG91dHB1dCBzZWN0aW9uLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFJlLW9yZGVyIC5yZWxbYV0uZm9vIG91dHB1dHMgdG8gdGhlCi0Jc2FtZSBvcmRlciBzZWVuIGZvciB0aGUgbWFpbiBzZWN0aW9ucy4gIEFkZAotCU9USEVSX1JFQURPTkxZX1JFTE9DX1NFQ1RJT05TIGFuZCBPVEhFUl9HT1RfUkVMT0NfU0VDVElPTlMuCi0KLTE5OTktMDctMTIgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSAobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogRmlsbCBpbgotCXN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogQWRkIG1pc3NpbmcKLQljb21tYSBpbiBpbml0aWFsaXplci4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCWFzIGFwcHJvcHJpYXRlLiAgRmlsbCBpbiBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLgotCi0xOTk5LTA3LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGRmaWxlLmM6IFJldmVydCBwYXRjaCBvZiAxOTk5LTA3LTA4LgotCShsZGZpbGVfdHJ5X29wZW5fYmZkKTogSWYgd2UgYXJlIHNlYXJjaGluZyBmb3IgdGhlIGZpbGUsIHNraXAKLQlmaWxlcyB3aXRoIGFuIGluY29tcGF0aWJsZSBhcmNoaXRlY3R1cmUuCi0KLTE5OTktMDctMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2MgKE9VVFBVVF9GT1JNQVQpOiBJbmNsdWRlIGJpZyBlbmRpYW4gYW5kCi0JbGl0dGxlIGVuZGlhbiBmb3JtYXRzLgotCi0xOTk5LTA3LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL21jb3JlcGUuc2M6IGZpeCBxdW90aW5nIHByb2JsZW0sIGZvciBiYXNoIDIueAotCi0xOTk5LTA3LTA4ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IFNraXAgbGlicmFyaWVzIG1hZGUgZm9yCi0JaW5jb21wYXRpYmxlIGFyY2hpdGVjdHVyZXMgaW4gdGhlIHNlYXJjaCBwYXRoLiBMZXQgdGhlIHVzZXIga25vdwotCWFib3V0IGFueSBzdWNoIHNraXBzLgotCi1UaHUgSnVsICA4IDEyOjMyOjIzIDE5OTkgIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS50Z3QgKGhwcGEqLWxpbnV4LWdudSopOiBOZXcgdGFyZ2V0LgotCi0xOTk5LTA3LTA3ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMXzY0X0VNVUxBVElPTlMpOiBBZGQgZWVsZjY0Ym1pcC4KLQkoZWVsZjY0Ym1pcCk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmUudGd0IChtaXBzLXNnaS1pcml4NiopOiBBZGQgNjQtYml0IGVtdWxhdGlvbi4KLQkqIGVtdWxwYXJhbXMvZWxmNjRibWlwLnNoOiBOZXcgZmlsZS4KLQotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChhZnRlcl9vcGVuKTogQWJvcnQgaWYgaW5wdXQgZm9ybWF0IGlzIEFSTSBhbmQKLQlvdXRwdXQgZm9ybWF0IGlzIG5vdC4gCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbSAoYWZ0ZXJfb3Blbik6IEFib3J0IGlmIGlucHV0IGZvcm1hdCBpcyBBUk0KLQlhbmQgb3V0cHV0IGZvcm1hdCBpcyBub3QuIAotCSogZW11bHRlbXBsL2FybWVsZi5lbSAoYWZ0ZXJfb3Blbik6IEFib3J0IGlmIGlucHV0IGZvcm1hdCBpcyBBUk0KLQlhbmQgb3V0cHV0IGZvcm1hdCBpcyBub3QuIAotCi0xOTk5LTA3LTAyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGRsYW5nLmM6IFJldmVydCBjaGFuZ2Ugb2YgMTk5OS0wNi0yMy4KLQotMTk5OS0wNi0zMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMmJtaXBuMzIuby4KLQkoZWVsZjMyYm1pcG4zMi5jKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMtc2dpLWlyaXg2Kik6IE1ha2UgbjMyIHRoZSBkZWZhdWx0Ci0JZW11bGF0aW9uLgotCSogZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2g6IE5ldyBmaWxlLgotCQotMTk5OS0wNi0yOCAgSmltIFBpY2sgPGppbUBqaW1waWNrLmNvbT4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbTogQWRkZWQgY29kZSBzbyB0aGF0IC54cyBsaW5rZXIgc2NyaXB0cyBhcmUKLQljYWxsZWQgc28gdGhhdCBBUk0gc2hhcmVkIGxpYnJhcmllcyBhcmUgYnVpbHQgY29ycmVjdGx5LgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLmluaXRfZnVuY3Rpb24gYW5kCi0JbGlua19pbmZvLmZpbmlfZnVuY3Rpb24uCi0JKiBsZXhzdXAuYyAoT1BUSU9OX0lOSVQpOiBOZXcgbWFjcm8uCi0JKE9QVElPTl9GSU5JKTogTGlrZXdpc2UuCi0JKGxkX29wdGlvbnMpOiBBZGQgZGVzY3JpcHRpb25zIGZvciB0aGVtLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIHRoZW0uCi0KLTE5OTktMDYtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IE9ubHkgZGlzY2FyZCBsaW5rIG9uY2UKLQlzZWN0aW9ucyBpZiB3ZSBhcmUgYnVpbGRpbmcgY29uc3RydWN0b3JzLgotCi0xOTk5LTA2LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChMb2NhdGlvbiBDb3VudGVyKTogRGVzY3JpYmUgYmVoYXZpb3VyIG9mCi0JbG9jYXRpb24gY291bnRlciBpbnNpZGUgc2VjdGlvbiBzdGF0ZW1lbnRzLgotCi0xOTk5LTA2LTIwICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKFdSSVRBQkxFX1JPREFUQSk6IE5ldyB2YXJpYWJsZSBmb3IKLQljb250cm9sbGluZyB3aGV0aGVyIG9yIG5vdCAucm9kYXRhIGlzIGluIHRoZSBkYXRhIHNlZ21lbnQgb3IgdGhlCi0JdGV4dCBzZWdtZW50LgotCi0xOTk5LTA2LTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IEFkZCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCAtLXRodW1iLWVudHJ5LgotCSogZW11bHRlbXBsL2FybWVsZi5lbTogQWRkIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIC0tdGh1bWItZW50cnkuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogQWRkIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIC0tdGh1bWItZW50cnkuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBuZXcgQVJNIGNvbW1hbmQgbGluZSBzd2l0Y2g6IC0tdGh1bWItZW50cnkuCQotMTk5OS0wNi0yMCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUuaW4gKGFsbF9saWJwYXRoKTogQWNjdW11bGF0ZSBhY3Jvc3MgYWxsIGVuYWJsZWQgdGFyZ2V0cy4KLQotU3VuIEp1biAyMCAxNDoxMDozMyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBXYXRjaCBFTVVMQVRJT05fTElCUEFUSCBpbnN0ZWFkIG9mCi0JREVGQVVMVF9FTVVMQVRJT04uCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBMaWtld2lzZS4KLQotRnJpIEp1biAxOCAxNToyNDo0OCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoR0VOU0NSSVBUUyk6IFBhc3MgRU1VTEFUSU9OX0xJQlBBVEgsIG5vdCBFTVVMLgotCSogY29uZmlndXJlLmluIChhbGxfZW11bHMpOiBBZGQgdGFyZ19leHRyYV9saWJwYXRoLgotCShhbGxfbGlicGF0aCwgRU1VTEFUSU9OX0xJQlBBVEgpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotbGludXgtZ251Kik6IERlZmluZSB0YXJnX2V4dHJhX2xpYnBhdGguCi0JKiBnZW5zY3JpcHRzLnNoIChMSUJfUEFUSCk6IERlZmluZSBpZiBlbXVsYXRpb24gaW4gRU1VTEFUSU9OX0xJQlBBVEguCi0KLU1vbiBKdW4gMTQgMTA6Mzg6MzYgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC50ZXhpbmZvOiBGaXggdXNlIG9mIEBpdGVtIHZzLiBAaXRlbXguCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBUaG9tYXMgWmVua2VyIDx0aHpAbGVubmFydHotZWxlY3Ryb25pYy5kZT46Ci0JKiBsZGdyYW0ueSAoYXR0cmlidXRlc19vcHQpOiBVc2UgYXR0cmlidXRlc19saXN0IGluc3RlYWQgb2YgTkFNRS4KLQkoYXR0cmlidXRlc19saXN0LCBhdHRyaWJ1dGVzX3N0cmluZyk6IE5ldyBub250ZXJtaW5hbHMuCi0JKiBsZGxhbmcuYyAobGFuZ19zZXRfZmxhZ3MpOiBBZGQgaW52ZXJ0IHBhcmFtZXRlci4gIERvbid0IGhhbmRsZQotCSchJy4KLQkqIGxkbGFuZy5jIChsYW5nX3NldF9mbGFncyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlKTogRG9uJ3QgYWRkCi0JZW50cnlfc3ltYm9sIGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZQotCWxpbmsuICBGcm9tIDxqZWZmZGJAZ29vZG5ldC5jb20+LgotCi0xOTk5LTA2LTEyICBEYXZpZCBPJ0JyaWVuICA8b2JyaWVuQGZyZWVic2Qub3JnPgotCi0JKiBjb25maWd1cmUudGd0OiAoaVszNDU2XTg2LSotZnJlZWJzZCopOiBOb3cgZGVmYXVsdHMgdG8gRUxGLgotCi0xOTk5LTA2LTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAoaGVscCk6IFJlc3RvcmUgcHJldmlvdXMgZm9ybWF0IG9mIG91dHB1dC4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBJZiBjb21waWxpbmcgZm9yIGFybV9lcG9jX3BlIHJlbmFtZQotCWludGVyd29ya2luZyBmdW5jdGlvbnMgdG8gYXZvaWQgYSBuYW1lIHNwYWNlIGNsYXNoLgotCi0xOTk5LTA2LTAyICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IEFkZCBpbml0cCBzdXBwb3J0LgotCi0xOTk5LTA2LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IFJlbmFtZSBnbG9iYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMgdG8KLQlhdm9pZCBuYW1lIGNvbGxpc2lvbiB3aGVuIGFsbCB0YXJnZXRzIEJGRCBpcyBidWlsdC4KLQotMTk5OS0wNS0zMCAgQ29ydCBEb3VnYW4gIDxjb3J0QGF0dGlzLmNzLm5tdC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZWxmMzJwcGNsaW51eC5vLgotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWxpbnV4LWdudSk6IFVzZSBpdC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaDogTmV3IGZpbGUuCi0KLTE5OTktMDUtMjkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQ2xhcmlmeSB0aGF0IG9wdGlvbnMgd2hpY2ggcmVmZXIgdG8gZmlsZXMKLQltdXN0IGJlIHByb3Blcmx5IG9yZGVyZWQuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW0gKC4uLl9wYXJzZV9hcmdzKTogTmV3IGZ1bmN0aW9uOiBQYXJzZQotCWNvbW1hbmQgbGluZSBvcHRpb24uICBBY2NlcHQgYXJtLWVsZiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uCi0JJy1wJyBvciAnLS1uby1waXBlbGluZS1rbm93bGVkZ2UnLgotCSguLi5fbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uOiBEZXNjcmliZSB0aGUgbmV3IGNvbW1hbmQgbGluZQotCW9wdGlvbi4KLQkoLi4uX2JlZm9yZV9hbGxvY2F0aW9uKTogUGFzcyB0aGUgdmFsdWUgb2YgdGhlIG5ldyB2YXJpYWJsZQotCW5vX3BpcGVsaW5lX2tub3dsZWRnZSB0byBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24uCi0JCi0JKiBlbXVsdGVtcC9hcm1lbGZfb2FiaS5lbSAoLi4uX2JlZm9yZV9hbGxvY2F0aW9uKTogUGFzcyB6ZXJvIGFzCi0JdGhlIHRoaXJkIHBhcmFtZXRlciB0byBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24uCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChoZWxwKTogTWlub3IgZm9ybWF0dGluZyBjaGFuZ2VzLgotCi0xOTk5LTA1LTI4ICBNYXJ0aW4gRG9yZXkgIDxtZG9yZXlAbWFkZ2UuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpOTYwLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL2VsZjMyX2k5NjAuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMl9pOTYwLm8uCi0JKGVlbGYzMl9pOTYwLmMpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDUtMjYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2ggKFRFTVBMQVRFX05BTUUpOiBTZXQgdG8gYXJtZWxmX29hYmkuIAotCi0xOTk5LTA1LTI0ICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtIChiZWZvcmVfcGFyc2UpOiBTZXQgY29uZmlnLmR5bmFtaWNfbGluayBhbmQKLSAJY29uZmlnLmhhc19zaGFyZWQuCi0JKiBlbXVscGFyYW1zL2FybWVsZi5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IExpa2V3aXNlLgotCi0xOTk5LTA0LTEzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBBZGQgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBzaGFyZWQgb2JqZWN0cwotCShjb3BpZWQgZnJvbSBlbGYzMi5lbSkuCi0KLVdlZCBNYXkgMTkgMTI6NDQ6MjYgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZWFybWxpbnV4Lm8gYW5kCi0JZWFybTI2bGludXgubywgYWRkIGVhcm1lbGZfbGludXgubyBhbmQgZWFybWVsZl9saW51eDI2Lm8uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgotCShURU1QTEFURV9OQU1FKTogRGVmaW5lLgotCi1UaHUgTWF5IDEzIDA5OjQ4OjA5IDE5OTkgIEpvZWwgU2hlcnJpbGwgKGpvZWxAT0FSY29ycC5jb20pCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKGkzODYtKi1ydGVtc2VsZiosIHNoLSotcnRlbXNlbGYqKTogTmV3IHRhcmdldHMuCi0JKG1pcHMqZWwtKi1ydGVtcyosIHBvd2VycGNsZS0qLXJ0ZW1zKik6IE5ldyB0YXJnZXRzLgotCi0xOTk5LTA1LTEwICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFNwZWNpZnkgdGhlIG91dHB1dCBhcmNoLCB3aGljaCBJYW4gc2F5cyBpcwotCXRoZSBSaWdodCBUaGluZyB0byBkby4KLQotCSogZW11bHRlbXBsL3BlLmVtOiB2YXJpb3VzIGNoYW5nZXMgdG8gcGFyYW1ldGVyaXplIHRoZQotCXRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4KLQkoZ2xkX2kzODZwZV9hZnRlcl9vcGVuKTogRGV0ZWN0IGFuZCBmaXggTVMgaW1wb3J0IGxpYnJhcmllcwotCWJ5IHJlbmFtaW5nIHRoZSBtZW1iZXIgb2JqZWN0cyAod2hpY2ggYXJlIGFsbCBuYW1lZCB0aGUgc2FtZSkuCi0KLQkqIHBlLWRsbC5jOiB2YXJpb3VzIGNoYW5nZXMgdG8gcGFyYW1ldGVyaXplIHRoZSB0YXJnZXQtc3BlY2lmaWMKLQlpbmZvcm1hdGlvbi4KLQkoZ2VuZXJhdGVfcmVsb2MpOiBzdXBwb3J0IHJlbG9jcyBtb3JlIGdlbmVyaWNhbGx5IHRvIGFsbG93IGZvcgotCWV4cGFuc2lvbi4KLQkocGVfZXhlX2J1aWxkX3NlY3Rpb25zKTogbmV3OyB1c2VkIHRvIGFkZCAucmVsb2NzIHRvIC5leGVzCi0JKHBlX2V4ZV9maWxsX3NlY3Rpb25zKTogZGl0dG8KLQotMTk5OS0wNS0xMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOgotCUNoZWNrIGZvciBUQVJHRVRfSVNfYXJtX2Vwb2NfcGUuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCi0xOTk5LTA1LTEyICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdhbGtfd2lsZCwgd2Fsa193aWxkX2ZpbGUsIHdhbGtfd2lsZF9zZWN0aW9uLAotCW91dHB1dF9zZWN0aW9uX2NhbGxiYWNrLCBnY19zZWN0aW9uX2NhbGxiYWNrKTogTmV3IGZ1bmN0aW9ucyBmb3IKLQlnZW5lcmljIHNlY3Rpb24gd2Fsa3MuCi0JKHdpbGQsIGxhbmdfZ2Nfd2lsZCk6IFVzZSB3YWxrX3dpbGQuCi0JKHdpbGRfZmlsZSwgbGFuZ19nY193aWxkX2ZpbGUpOiBEZWxldGVkLiBDb21tb24gbG9naWMgbW92ZWQgdG8KLQl3YWxrX3dpbGRfZmlsZS4KLQkod2lsZF9zZWN0aW9uLCBsYW5nX2djX3dpbGRfc2VjdGlvbik6IERlbGV0ZWQuIENvbW1vbiBsb2dpYyBtb3ZlZAotCXRvIHdhbGtfZmlsZF9zZWN0aW9uLiAgVW5pcXVlIGxvZ2ljIG1vdmVkIGludG8gY2FsbGJhY2tzCi0Jb3V0cHV0X3NlY3Rpb25fY2FsbGJhY2sgYW5kIGdjX3NlY3Rpb25fY2FsbGJhY2suCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTEyICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2g6IE5ldyBmaWxlLiAgU3VwcG9ydCBmb3IgQVJNIAotCUdOVS9MaW51eCBFTEYgQUJJLgotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaDogTmV3IGZpbGUuIEFQQ1MtMjYgdmVyc2lvbiBvZiBhYm92ZS4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEZvciBhcm0qLSotbGludXgtZ251Kiwgc2V0IGRlZmF1bHQgZW11bGF0aW9uIHRvCi0JYGFybWVsZl9saW51eCcsIGFuZCBhbHNvIGluY2x1ZGUgYGFybWVsZl9saW51eDI2JyBhbmQgYGFybWVsZicuCi0JKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGVzIHRvIG1ha2UgZWFybWxpbnV4LmMgYW5kIGVhcm1saW51eDI2LmMuCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhcm1saW51eC5vIGFuZCBlYXJtbGludXgyNi5vLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbGZfaTM4Nl9iZS5vLgotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotYmVvcyopOiBVc2UgaXQuCi0JKiBlbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW4gKGVudmlyb24pOiBEZXRlY3QgZGVjbGFyYXRpb24uCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IGRlY2xhcmUgZW52aXJvbi4KLQkqIHN5c2RlcC5oIChlbnZpcm9uKTogRGVjbGFyZSBpZiBuZWVkZWQuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyk6IE5ldy4KLQkodmVyc19kZWZucyk6IEFjY2VwdCBgZXh0ZXJuICJsYW5nIiB7IH0nIHN5bnRheC4KLQkqIGxkbGV4LmwgKHZlcnNfbm9kZV9uZXN0aW5nKTogTmV3LgotCShWX0lERU5USUZJRVIpOiBBY2NlcHQgLiBhbmQgJCBpbiBzeW1ib2xzLgotCShWRVJTX05PREUpOiBBY2NlcHQgYGV4dGVybiAibGFuZyIgeyB9JyB0b2tlbnMuICBOZXN0IFZFUlNfTk9ERSBzdGF0ZXMuCi0JKiBsZGxhbmcuYyAobGFuZ19uZXdfdmVyc19yZWdleCk6IE5ldyBgbGFuZycgYXJndW1lbnQuICBVcGRhdGUgY2FsbGVycy4KLQkobGFuZ192ZXJzX21hdGNoX2xhbmdfYyk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ192ZXJzX21hdGNoX2xhbmdfY3BsdXNwbHVzKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19qYXZhKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX2RvX3ZlcnNpb25fZXhwb3J0c19zZWN0aW9uKTogRml4IGl0ZXJhdGlvbi4gIERvbid0IGZyZWUKLQlzZWN0aW9uIGNvbnRlbnRzLCBhcyBpdCBpcyBzdGlsbCBpbiB1c2UgYnkgdGhlIHBhdHRlcm5zLgotCi0xOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXQgbGlua19pbmZvLm5vX3VuZGVmaW5lZC4KLQkqIGxleHN1cC5jOiBBZGQgY29tbWFuZC1saW5lIG9wdGlvbiAtLW5vLXVuZGVmaW5lZC4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUKLQlzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIGl0LgotCi0xOTk5LTA0LTA2ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkbWFpbi5oIChkZW1hbmdsaW5nKTogRGVjbGFyZS4KLQkqIGxkbWFpbi5jIChkZW1hbmdsaW5nKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkobWFpbik6IEluaXRpYWxpemUgZGVtYW5nbGluZy4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBEb24ndCBkZW1hbmdsZSBzeW1ib2wgaWYgISBkZW1hbmdsaW5nLgotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMsIHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1kZW1hbmdsZSBhbmQKLQktLW5vLWRlbWFuZ2xlLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS1kZW1hbmdsZS8tLW5vLWRlbWFuZ2xlLgotCi0JKiBsZGxleC5sIChWX0lERU5USUZJRVIpOiBBbGxvdyAnLicgaW4gc3ltYm9sLgotCi0xOTk5LTA0LTA1ICBDaHJpcyBUb3JlayAgPHRvcmVrQEJTREkuQ09NPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBDaGVjayB0aGF0Ci0JYSBzaGFyZWQgbGlicmFyeSByZWFsbHkgZXhpc3RzLCBhdm9pZGluZyBicm9rZW4gc3ltbGlua3MuCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9maWxlKTogR2VuZXJhdGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBpZgotCXdlIGNhbid0IGZpbmQgYSAtbCBmaWxlLgotCi0xOTk5LTA0LTA1ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaTM4Ni0qLXBlKTogYWRkIHRhcmdfZXh0cmFfb2ZpbGVzIGZvciBvdGhlciBQRQotCXRhcmdldHMgKGkzODYtcGUgYW5kIGkzODYtd2lubnQpCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkZWZmaWxlcC55OiBJbmNsdWRlICJzeXNkZXAuaCIgYW5kICJsZG1pc2MuaCIuCi0JKGRlZl9maWxlX2FkZF9kaXJlY3RpdmUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gdm9pZC4gIFJlbW92ZQotCXVudXNlZCBsb2NhbHMgc2hfcmVzZXJ2ZSwgc2hfY29tbWl0LCBhbmQgai4KLQkoZGVmX3VuZ2V0Yyk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkoZGVmX2xleCk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiBvZiB8fCB3aXRoaW4gJiYuCi0JKiBkZWZmaWxlLmggKGRlZl9maWxlX2FkZF9kaXJlY3RpdmUpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBwZS1kbGwuYzogSW5jbHVkZSA8dGltZS5oPiwgPGN0eXBlLmg+LCBhbmQgImxkZW11bC5oIi4KLQkoZ2VuZXJhdGVfZWRhdGEpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGkuCi0JKHF1b3RlcHV0KTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkocGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlKTogRml4IHR5cGUgaW4gZm9ybWF0IHN0cmluZy4KLQkocXVpY2tfc3ltYm9sKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBibGhlLgotCShwZV9kbGxfZ2VuZXJhdGVfaW1wbGliKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkocGVfcHJvY2Vzc19pbXBvcnRfZGVmcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGFyX2hlYWQsIGFyX3RhaWwsCi0JYW5kIG4uCi0JKHBlX2FzMTYpOiBDb21tZW50IG91dC4KLQotMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBtaXBzKi0qLXZ4d29ya3MqIHRhcmdldC4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhcm1fZXBvY19wZS5vCi0JQWRkIGJ1aWxkIHJ1bGUgYW5kIGRlcGVuZGVuY2llcyBmb3IgZWFybV9lcG9jX3BlLmMuCi0KLQkqIGVtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2g6IE5ldyBmaWxlLgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgJ3RhcmdfZXh0cmFfb2ZpbGVzJyBmb3IgQVJNIGJhc2VkIFBFCi0JdGFyZ2V0cy4gCi0KLTE5OTktMDMtMzEgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBjb25maWd1cmUudGd0OiBNYXRjaCBgYXJtKi0qLWxpbnV4LWdudSonIG5vdAotIAlgYXJtdiotKi1saW51eC1nbnUnLgotCi0xOTk5LTAzLTI2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IHRoZSAuZWhfZnJhbWUgYW5kIC5nY2NfZXhjZXB0X3RhYmxlCi0Jc2VjdGlvbnMgaW4gdGhlIGRhdGEgc2VnbWVudC4KLQotRnJpIE1hciAyNiAxMjowNTo1MSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAod2lsZGNhcmRfc3BlYyk6IEFkZCBleGNsdWRlX25hbWUuCi0gICAgICAgICogbGRncmFtLnkgKEVYQ0xVREVfRklMRSk6IE5ldyB0b2tlbi4KLQkod2lsZGNhcmRfc3BlYyk6IFNldCBleGNsdWRlX25hbWUuCi0JKGZpbGVfTkFNRV9saXN0KTogUmVjb2duaXplIEVYQ0xVREVfRklMRS4KLSAgICAgICAgKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogQ2hlY2sgZm9yIGV4Y2x1ZGVkIGZpbGVzLgotCShwcmludF93aWxkX3N0YXRlbWVudCk6IFByaW50IGV4Y2x1ZGVkIGZpbGVzLgotCShsYW5nX2FkZF93aWxkKTogTmV3IGFyZ3VtZW50IGV4Y2x1ZGVfZmlsZW5hbWUuCi0JU2V0IGV4Y2x1ZGVfZmlsZW5hbWUuCi0JKiBsZGxhbmcuaCAobGFuZ193aWxkX3N0YXRlbWVudF90eXBlKTogIEFkZCBleGNsdWRlX2ZpbGVuYW1lLgotCSogbGRsZXgubDogTmV3IHRva2VuIEVYQ0xVREVfRklMRS4KLQkqIG1yaS5jIChtcmlfZHJhd190cmVlKTogIEFkZCBhcmd1bWVudCB0byBsYW5nX2FkZF93aWxkLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjIChDVE9SLCBEVE9SKTogIEV4Y2x1ZGUgY3J0ZW5kLm8gZnJvbSBjdG9yIHdpbGRjYXJkLgotCVJlb3JkZXIgc29ydGVkIGFuZCB1bnNvcnRlZCBjdG9ycy4KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2MgKENUT1IsIERUT1IpOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2MgKENUT1IsIERUT1IpOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoQ1RPUiwgRFRPUik6IExpa2V3aXNlLgotCQotMTk5OS0wMy0yNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZ2Nfc2VjdGlvbnMpOiBJZiBlbnRyeV9zeW1ib2wgaXMgbm90IGRlZmluZWQsCi0JZGVmYXVsdCB0byAic3RhcnQiLgotCi0xOTk5LTAzLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBleHBsaWNpdCBwbGFjZW1lbnRzIGZvciB0aGUgLmVoX2ZyYW1lCi0JYW5kIC5nY2NfZXhjZXB0X3RhYmxlIHNlY3Rpb25zLiAKLQotV2VkIE1hciAgMyAwOToxMzozNCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNsbT4KLSAKLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFJlbW92ZSAuZW5kLmN0b3JzIGFuZCAuZW5kLmR0b3JzCi0gICAgICAgIHNlY3Rpb25zLiAgUmVvcmRlciAuY3RvcnMgc2VjdGlvbiBlbnRyaWVzLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IExpa2V3aXNlLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLTE5OTktMDItMjYgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IFdyb25nIGVycm9yIG1zZyBmb3IgLXIgYW5kIC0tbXBjODYwYzAuCi0KLTE5OTktMDItMjUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKTogUmVtb3ZlIGV4dHJhbmVvdXMKLQliYWNrc2xhc2guIAotCi1UaHUgRmViIDI1IDE1OjA3OjI0IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IERvbid0IGdhdGhlciAuY3RvciBhbmQgLmR0b3Igc2VjdGlvbnMKLSAgICAgICAgZm9yIHJlbG9jYXRlYWJsZSBsaW5rcy4KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotICAgICAgICAKLTE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBsZGludC50ZXhpbmZvOiByZW1vdmUgZXh0cmFuZW91cyByaWdodCBicmFjZS4KLQkqIGxkbWFpbi5jIChtYWluKTogaW5pdGlhbGl6ZSBhbmQgY2hlY2sgb3B0aW9uICJtcGM4NjBjMCIuCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucywgcGFyc2VfYXJncyk6IGFkZCBvcHRpb24gIm1wYzg2MGMwIi4KLQotV2VkIEZlYiAxNyAxMjoxMDowNiAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogbXB3LWVsZm1pcHMuYyAoZ2xkZWxmMzJlYm1pcF9iZWZvcmVfYWxsb2NhdGlvbik6IFJlbW92ZSBzcGVjaWFsCi0JLnJlZ2luZm8gc2VjdGlvbiBoYW5kbGluZy4gCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggKElOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMpOiBSZW1vdmVkCi0JKiBlbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggKElOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMpOiBSZW1vdmVkCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBmcm9tOiBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQkKLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZGVkIGFybXYqLSotbGludXgtZ251IHRvICR0YXJnX2VtdWwKLQlyZWNvZ25pdGlvbi4gCi0KLVdlZCBGZWIgMTcgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotIAotICAgICAgICAqIGVtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbQotICAgICAgICAoYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMsCi0gICAgICAgIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLAotICAgICAgICBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBEZWZpbmUgdGhlbSB0byB1c2UgdGhlCi0gICAgICAgIG9sZCBBQkkgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucy4KLQotVHVlIEZlYiAxNiAxNjo0ODoxOSAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgQ2hhbmdlIEFNX1BST0dfSU5TVEFMTAotCXRvIEFDX1BST0dfSU5TVEFMTC4gIENoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhULgotCSogTWFrZWZpbGUuYW0gKGVhcm1lbGZfb2FiaS5jKTogQ2hhbmdlcyBzcGFjZXMgdG8gdGFiLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViIDE1IDE4OjIxOjQ4IDE5OTkgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBsZGV4cC5oIChzdHJ1Y3QgZXRyZWVfdmFsdWVfdHlwZSk6IENoYW5nZSB2YWxpZCBvbnRvIHZhbGlkX3AuCi0KLQkqIGxkZXhwLmMgKG5ld19hYnMpOiBEaXR0by4KLQkobmV3X3JlbCwgbmV3X3JlbF9mcm9tX3NlY3Rpb24sIGZvbGRfYmluYXJ5LCBpbnZhbGlkLCBmb2xkX25hbWUsCi0gCWV4cF9mb2xkX3RyZWUsIGV4cF9iaW5vcCwgZXhwX3RyaW5vcCwgc3RhdF9hbGxvYywKLSAJZXhwX2dldF9hYnNfaW50KTogRGl0dG8KLQotCSogbGRsYW5nLmMgKHByaW50X2Fzc2lnbm1lbnQsIGxhbmdfc2l6ZV9zZWN0aW9ucywKLQlsYW5nX2RvX2Fzc2lnbm1lbnRzKTogRGl0dG8uCi0JCi0xOTk5LTAyLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3Nlcyk6IE5ldyBmdW5jdGlvbjogQ2hlY2sKLQlhZGRyZXNzZXMgYXNzaWduZWQgdG8gc2VjdGlvbiBmb3Igb3ZlcmxhcHMuCi0JKGxhbmdfcHJvY2Vzcyk6IENhbGwgbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyBpZiBzdWl0YWJsZS4KLQotCSogbGQuaDogQWRkIG5ldyBib29sZWFuIGZpZWxkIHRvIGFyZ3NfdHlwZSBzdHJ1Y3R1cmU6Ci0JJ2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzJy4KLQotCSogbGRtYWluLmM6IEluaXRpYWxpc2UgY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgZmllbGQgdG8gdHJ1ZS4KLQotCSogbGV4c3VwLmM6IEFkZCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgJy0tbm8tY2hlY2stc2VjdGlvbnMnIGFuZAotCSctLWNoZWNrLXNlY3Rpb25zJy4KLQotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zICctLWNoZWNrLXNlY3Rpb25zJwotCWFuZCAnLS1uby1jaGVjay1zZWN0aW9ucycuCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gdGFyZ2V0LgotCi1XZWQgRmViICAzIDE5OjQxOjAxIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogSnVzdCBzZXQgU0VDX0tFRVAgb25jZS4gIENoZWNrIGZvcgotCWFuIG93bmVyIG9mIGEgc2VjdGlvbiBiZWZvcmUgdXNpbmcgaXQgdG8gbG9vayB1cCBhIHJlbG9jIHR5cGUuCi0JRG9uJ3Qgc2V0IFNFQ19LRUVQIGZvciB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQotTW9uIEZlYiAgMSAxMTozOTo0NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtIChlYXJtZWxmX29hYmkubyk6ICBOZXcuCi0gICAgICAgICogTWFrZWZpbGUuaW46ICBSZWdlbmVyYXRlLgotICAgICAgICAqIGNvbmZpZ3VyZS50Z3QgKGFybS0qLW9hYmkpOiAgTmV3LgotICAgICAgICAodGh1bWItKi1vYWJpKTogIE5ldy4KLSAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoOiAgTmV3LgotICAgICAgICAqIGVtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbTogIE5ldy4KLQotMTk5OS0wMS0zMSAxNzo1NzozMSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLWZsZWFkaW5nLXVuZGVyc2NvcmVzCi0Jc3dpdGNoIGluIGFsbCBsaW5rZXIgZ2VuZXJhdGVkIHN5bWJvbHMuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGN7LGxlfSotKi12eHdvcmtzKTogQWRkIGFzIGFsaWFzZXMgZm9yCi0JcG93ZXJwY3ssbGV9LSotZWFiaS4KLQotV2VkIEphbiAyMCAxNzowMTo0OCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKik6IE5ldyB0YXJnZXQuICBGcm9tIFBhdmVsCi0JUm9za2luIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT4uCi0KLTE5OTktMDEtMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDb3VudCBsb2FkYWJsZSBzZWN0aW9ucyBhcwotICAgICAgICAgIGNvbnRyaWJ1dGluZyB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBzZWdtZW50LgotCi0xOTk5LTAxLTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogT25seSB1cGRhdGUgdGhlIGN1cnJlbnQKLSAgICAgICAgICBhZGRyZXNzIG9mIGEgcmVnaW9uIGlmIHRoZSBzZWN0aW9uIGp1c3QgcGxhY2VkIGludG8gaXQgaXMgYW4KLSAgICAgICAgICBhbGxvY2F0ZWQgc2VjdGlvbi4KLQotMTk5OS0wMS0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlcGxhY2UgZWZyMzAubyB3aXRoIGVlbGYzMmZyMzAuby4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWd1cmUudGd0OiBSZXBsYWNlIGZyMzAgd2l0aCBlbGYzMmZyMzAuCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJmcjMwLnNoOiBOZXcgZmlsZTogUmVwbGFjZXMgZnIzMC5zaCwgYW5kIHVzZXMKLQlnZW5lcmljIGVsZi5zYyBzY3JpcHQuICBBbHNvIHJlcGxhY2VzIHRoZSAuc3RhY2sgc2VjdGlvbiB3aXRoIGEKLQl1c2VyIGRlZmluYWJsZSBzeW1ib2wgX19zdGFjay4KLQotMTk5OS0wMS0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZnIzMC5zYzogRmlsbCAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd2l0aCBOT1AKLQlwYXR0ZXJuLiAKLQotMTk5OS0wMS0wMyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogTm8gbG9uZ2VyIHByb3ZpZGUgSE9TVElOR19FTVUsCi0JSE9TVElOR19DUlQwLCBIT1NUSU5HX0xJQlM7IHRoZSB0ZXN0IHN1aXRlIGNhbiBleHRyYWN0IHRoZW0gZnJvbQotCWNvbmZpZ3VyZS5ob3N0IGFuZCBjb25maWd1cmUudGd0IG5vdy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk4LTEyLTI3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MsIGNhc2UgT1BUSU9OX1JQQVRIKTogQXZvaWQgYWRkaW5nIGR1cGxpY2F0ZQotCWVsZW1lbnRzIHRvIHJwYXRoLgotCi1UaHUgRGVjIDEwIDExOjEyOjI4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIHBlLWRsbC5vIGFuZCBkZWZmaWxlcC5vLgotCShBTExfRU1VTF9FWFRSQV9PRklMRVMpOiBOZXcgdmFyaWFibGUuICBQdXQgdGhlbSBoZXJlIGluc3RlYWQuCi0JKiBjb25maWd1cmUuaW46IFNldCBFTVVMX0VYVFJBX09GSUxFUyB0byAkKEFMTF9FTVVMX0VYVFJBX09GSUxFUykKLQlpZiBjb25maWd1cmluZyB3aXRoIGFsbCB0YXJnZXRzLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZC4KLQotCSogZW11bHRlbXBsL3BlLmVtIChwZV9lbmFibGVfc3RkY2FsbF9maXh1cCk6IE1ha2Ugc3RhdGljLgotCShwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlcyk6IFJlbW92ZWQsIHVudXNlZC4KLQkocGVfZGVmX2ZpbGUsIHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZywgcGVfZGxsX2tpbGxfYXRzLAotCXBlX2RsbF9zdGRjYWxsX2FsaWFzZXMpOiBEb24ndCBpbml0aWFsaXplIHRoZW0sIHRoaXMgZmlsZSBtYXkgYmUKLQljb21waWxlZCBtb3JlIHRoYW4gb25jZS4KLQkqIHBlLWRsbC5jIChwZV9kZWZfZmlsZSwgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nLAotCXBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzLCBwZV9kbGxfa2lsbF9hdHMsCi0JcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyk6IERlZmluZSBhbmQgaW5pdGlhbGl6ZSB0aGVtIGhlcmUgaW5zdGVhZC4KLQkoZ2VuZXJhdGVfcmVsb2MpOiBGaXggYWxsb2NhdGlvbiBvZiByZWxvY19hZGRyZXNzZXMgYXJyYXkgdG8gdXNlCi0JYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuICBGaXggZWxlbWVudCBzaXplIGluIHFzb3J0IGNhbGwuCi0JKHJlbG9jX3NvcnQpOiBDb21wYXJlIHBvaW50ZXJzIHRvIGJmZF92bWEgaW5zdGVhZCBvZiB1bnNpZ25lZAotCWxvbmcuCi0KLU1vbiBEZWMgIDcgMjE6MTA6MDkgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gIDxqLmoudmFuZGVyaGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKTogQWRkIGN5Z3dpbiB0YXJnZXQgc3BlY2lmaWMKLQlmaWxlcy4KLQotU3VuIERlYyAgNiAxNjozMzozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OCotKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gQXltZXJpYyBWaW5jZW50Ci0JPGF5bWVyaWMudmluY2VudEBlbWkudS1ib3JkZWF1eC5mcj4uCi0KLTE5OTgtMTItMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZnIzMC5zaCAoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIFRFWFRfU1RBUlRfQUREUgotCWZyb20gMHgxMDAwMDAgdG8gMHgxMDAwMCBzbyB0aGF0IGl0IGZpdHMgaW4gMjAgYml0cy4KLQotU2F0IE5vdiAyOCAyMjozMjoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5oIChsZGVtdWxfcmVjb2duaXplZF9maWxlKTogRGVjbGFyZS4KLQotU2F0IE5vdiAyOCAyMjozMDo1NSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF93aWxkKTogRG9uJ3QgcHJldGVuZCB0aGF0IHRoZXJlIGlzIGFuIGlucHV0Ci0JZmlsZSBpZiB0aGUgZmlsZW5hbWUgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLgotCi0xOTk4LTExLTI1ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IG5ldyBob29rICJyZWNvZ25pemVkX2ZpbGUiCi0JKiBsZGVtdWwuYyAobGRlbXVsX3JlY29nbml6ZWRfZmlsZSk6IG5ldyBmdW5jdGlvbiwgbmV3IGhvb2sKLQkqIGxkaW50LnRleGluZm86IGRvY3VtZW50IG5ldyBob29rLgotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IGNhbGwgcmVjb2duaXplZF9ob29rIGZvciBhbGwgb2JqZWN0cyB3ZQotCWRvIHJlY29nbml6ZSwgaW4gY2FzZSB0aGUgZW11bGF0aW9uIG5lZWRzIHRvIGhhbmRsZSB0aGVtCi0Jc3BlY2lhbGx5LiAgUEUgRExMcyB1c2UgdGhpcy4KLQkqIHBlLWRsbC5jIChwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiB0YWtlIG91dCBoYWNrIGFuZCBkZWJ1ZwotCXByaW50ZnMKLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfcmVjb2duaXplZF9maWxlKTogbmV3IGZ1bmN0aW9uCi0JKGdsZF9pNDg2X3VucmVjb2duaXplZF9maWxlKTogdGFrZSBvdXQgaGFjawotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmMgKGZpbGxfZWRhdGEpOiBmaWxsIGluIHRpbWVzdGFtcAotCShtYWtlX2hlYWQpOiBuYW1lIG9iamVjdCBmaWxlcyBzZXF1ZW50aWFsbHkgdG8gZW5zdXJlCi0JdGhleSBsaW5rIGluIHRoZSByaWdodCBvcmRlci4KLQkobWFrZV90YWlsKTogc2FtZSBoZXJlCi0JKHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMpOiB1c2Ugc2VxdWVudGlhbCBuYW1lcyBmb3IgYmZkcyB0byBlbnN1cmUKLQlwcm9wZXIgbGluayBvcmRlci4KLQkocGVfaW1wbGllZF9pbXBvcnRfZGxsKTogbmV3IGZ1bmN0aW9uOyBoYW5kbGVzIGxpbmtpbmcgZGlyZWN0bHkKLQlhZ2FpbnN0IERMTHMgYnkgc2ltdWxhdGluZyBJTVBPUlRTIGRpcmVjdGl2ZXMuICAqIGVtdWx0ZW1wbC9wZS5lbQotCShnbGRfaTM4NnBlX2JlZm9yZV9wYXJzZSk6IGhhY2sgYmZkIHRvIG5vdCByZWNvZ25pemUgLmRsbCBmaWxlcwotCXZpYSBiZmRfcGVfZGxsX25vdF9yZWNvZ25pemVkX2hhY2sKLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZwZV9wYXJzZV9hcmdzKTogQ29uZGl0aW9uYWxpemUgY2FsbCB0bwotCXBlX2RsbF9hZGRfZXhjbHVkZXMKLQotTW9uIE5vdiAyMyAxNDozNjoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGFmdGVyX3BhcnNlKTogT25seSBjcmVhdGUgYW4gdW5kZWZpbmVkIGVudHJ5Ci0Jc3ltYm9sIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2cGVfYWZ0ZXJfb3Blbik6IGNhbGwKLQlwZV9wcm9jZXNzX2ltcG9ydF9kZWZzCi0JKiBwZS1kbGwuYyAocGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlKTogY2FsY3VsYXRlIEJBU0UgZnJvbQotCXBlX2RhdGEsIG9ubHkgcHJpbnQgaWYgYWN0dWFsbHkgc2V0LiAgUHJpbnQgdmVyc2lvbiBvbmx5IGlmCi0Jc2V0LgotCShzYXZlX3JlbG9jcyk6IHNhdmUgcmVsb2NzIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCi0JKG1ha2Vfb25lKTogc3VwcG9ydCBpbnRlcm5hbC9leHRlcm5hbCBkaWZmZXJlbnQgbmFtZXMuCi0JKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBzdXBwb3J0IG5ldyBtYWtlX29uZQotCShwZV9wcm9jZXNzX2ltcG9ydF9kZWZzKTogbmV3IGZ1bmN0aW9uOyBoYW5kbGVzIElNUE9SVAotCWRpcmVjdGl2ZXMgaW4gLmRlZiBmaWxlcy4KLQotRnJpIE5vdiAyMCAxMzowNjo0OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQ29wZSB3aXRoIGVtcHR5IHN5bWJvbCBuYW1lcy4KLQotVGh1IE5vdiAxOSAxMzozMToxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogQWRkIHByb3Zpc2lvbiBvZiAnX2VuZCcgc3ltYm9sLgotCi1XZWQgTm92IDE4IDE4OjE4OjQzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IGNoYW5nZSByZWZzIGZyb20gY3lnd2luMzIqIHRvIGN5Z3dpbiouCi0JKiBhY2xvY2FsLm00OiByZWdlbmVyYXRlCi0JKiBjb25maWd1cmUuaW46IGRvbid0IG5lZWQgdG8gY2FsbCBBTV9DWUdXSU4zMi4KLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1Nb24gTm92IDE2IDIyOjE0OjA3IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2X2ZpbmlzaCk6IGdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5Ci0JKiBkZWZmaWxlLmg6IGFkZCBoaW50IG1lbWJlci4KLQkqIHBlLWRsbC5jIChwZV9kbGxfZ2VuZXJhdGVfaW1wbGliKTogTmV3IGZ1bmN0aW9uIHdpdGggaGVscGVyczsKLSAJZ2VuZXJhdGVzIHRoZSBpbXBvcnQgbGlicmFyeSBkaXJlY3RseSBmcm9tIHRoZSBleHBvcnQgdGFibGUuCi0JKGZpbGxfZWRhdGEpOiByZW1lbWJlciB0aGUgYWN0dWFsIGhpbnQgZm9yIHRoZSBpbXBvcnQgbGlicmFyeS4KLQotU2F0IE5vdiAxNCAxNDozNjoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLjE6IFNvbWUgY2xlYW51cHMgZnJvbSBOT0tVQkkgSGlyb3Rha2EgPGhub2t1YmlAeXl5Lm9yLmpwPi4KLQotVGh1IE5vdiAxMiAxOToyMTo1NyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2xkLnBvdDogUmVnZW5lcmF0ZWQuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLVdlZCBOb3YgMTEgMTg6MTA6MTUgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jIChnZW5lcmF0ZV9yZWxvYyk6IGRvbid0IG91dHB1dCBQRSByZWxvY3MgZm9yIHNlY3Rpb25zCi0gCXRoYXQgd29uJ3QgYmUgbG9hZGVkLgotCi1XZWQgTm92IDExIDEzOjQ0OjU0IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAoZmlsbF9lZGF0YSk6IGRvbid0IHN0cmlwIHVuZGVyc2NvcmVzCi0KLVR1ZSBOb3YgMTAgMjE6Mjg6MTkgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IGFkZGVkIGkzODZwZSBvcHRpb24gc3VtbWFyeQotCi1UdWUgTm92IDEwIDE3OjUzOjE3IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAocHJvY2Vzc19kZWZfZmlsZSk6IHByb3Blcmx5IG5vdGUgdW5kZWZpbmVkIGV4cG9ydGVkCi0gCXN5bWJvbHMsIGNsZWFuIHVwIG9sZCBjb2RlLgotCShwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBkb24ndCBjcmFzaCBpZiBwZV9kZWZfZmlsZSBpcyBOVUxMCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2X3BhcnNlX2FyZ3MpOiBhZGQKLSAJKGVuL2RpcylhYmxlLXN0ZGNhbGwtZml4dXBzCi0JKHBlX2ZpeHVwX3N0ZGNhbGxzKTogd2FybiBhYm91dCBzdGRjYWxsIGZpeHVwcwotCShnbGRfaTM4Nl91bnJlY29nbml6ZWRfZmlsZSk6IG1ha2UgZXhwb3J0ZWQgc3ltYm9scyB1bmRlZnMgc28gdGhhdAotIAlhcmNoaXZlIG1lbWJlcnMgZ2V0IHB1bGxlZCBpbgotCi1UdWUgTm92IDEwIDE0OjUwOjUxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogQWRkIEtFRVAgYXR0cmlidXRlIHRvIC5pbml0LAotICAgICAgICAuZmluaSwgLmR0b3JzIGFuZCAuY3RvcnMuICBBZGQgLmRhdGEgYW5kIC50ZXh0Ci0gICAgICAgIHdpbGRjYXJkcyB0byBzdXBwb3J0IHNlY3Rpb24gZ2FyYmFnZSBjb2xsZWN0aW9uLgotCi1Nb24gTm92ICA5IDIyOjUyOjUwIDE5OTggIERKIERlbG9yaWUgIDxkakBpbmR5LmRlbG9yaWUuY29tPgotCi0JKiBkZWZmaWxlcC55OiBwcm9wZXJseSBoYW5kbGUgcmVsb2NzIHdpdGggbXVsdGlwbGUgZGVmX2ZpbGVzLAotCWNhY2hlIGltcG9ydCBtb2R1bGUgbmFtZXMKLQotTW9uIE5vdiAgOSAyMjo0NDo1OCAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmMgKHByb2Nlc3NfZGVmX2ZpbGUpOiBkb24ndCBhc3N1bWUgZXhwb3J0cyB3b24ndCBtb3ZlCi0JZHVyaW5nIGEgcmVhbGxvYwotCi1Nb24gTm92ICA5IDE2OjQxOjMwIDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYzogTmV3IGZpbGU7IGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCi0JKiBkZWZmaWxlLmg6IE5ldyBmaWxlOyBkaXJlY3Qgc3VwcG9ydCBmb3IgUEUgRExMcwotCSogZGVmZmlsZXAueTogTmV3IGZpbGU7IGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCi0JKiBlbXVsdGVtcGwvcGUuZW06IGFkZCBkaXJlY3Qgc3VwcG9ydCBmb3IgUEUgRExMcwotCSogY29uZmlndXJlLnRndDogYWxsb3cgdGFyZ2V0LXNwZWNpZmljIGV4dHJhIGZpbGVzCi0JKiBjb25maWd1cmUuaW46IGFsbG93IHRhcmdldC1zcGVjaWZpYyBleHRyYSBmaWxlcwotCSogbGRsYW5nLmMgKGxhbmdfYWRkX2Fzc2lnbm1lbnQpOiByZXR1cm4gdGhlIGFzc2lnbm1lbnQgc28gdGhhdAotIAlvbmUgY2FuIGNoYW5nZSB0aGUgdmFsdWUgbGF0ZXIgYmFzZWQgb24gdGhlIG9iamVjdCBmaWxlcyAocGUtZGxsCi0gCURFRiBmaWxlcyBkbyB0aGlzKQotCSogbGRpbnQudGV4aW5mbzogYWRkIHNlY3Rpb24gZm9yIGVtdWxhdGlvbiB3YWxrdGhyb3VnaAotCSogTWFrZWZpbGUuYW06IGFkZCBuZXcgZmlsZXMgYW5kIHRhcmdldC1zcGVjaWZpYyBleHRyYSBmaWxlcwotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4Nl9saXN0X29wdGlvbnMpOiBsaXN0IGRsbC1zcGVjaWZpYwotCW9wdGlvbnMuCi0JKiBwZS1kbGwuYyAocHJvY2Vzc19kZWZfZmlsZSk6IGF1dG8tZXhwb3J0IGV2ZXJ5dGhpbmcgaWYKLQlub3RoaW5nIGlzIG90aGVyd2lzZSBleHBvcnRlZC4KLQkKLVdlZCBOb3YgIDQgMTY6Mzk6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBGUjMwIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogZW11bHBhcmFtcy9mcjMwLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXAvZnIzMC5zYzogTmV3IGZpbGUuCi0JCi1Nb24gTm92ICAyIDE0OjQ3OjE1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbGRtYWluLmMgKG1haW4pOiAgRG9uJ3QgcmVwb3J0IGVycm9yIGZvciBkeW5hbWljIGxpbmtzIGFuZAotICAgICAgICAtLWdjLXNlY3Rpb25zLgotCi0xOTk4LTEwLTI2IDE2OjA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBDaGFuZ2UgdGV4dCBvZiAtTyB0byBPcHRpbWl6ZSBvdXRwdXQgZmlsZSIuCi0JKHBhcnNlX2FyZ3MpOiBTZXQgbGlua19pbmZvLm9wdGltaXplIGJhc2VkIG9uIC1PIGFyZ3VtZW50LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby5vcHRpbXplIHRvIGZhbHNlLgotCSogbGQudGV4aW5mbzogRGVzY3JpYmUgLU8gb3B0aW9uLgotCSogbGQuMTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgMTIgMTQ6Mjk6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTW92ZSAuc2JzcyBhbmQgLnNjb21tb24gc2VjdGlvbnMgaW50byB0aGVpcgotCW93biBzZWdtZW50LCBzbyB0aGF0IHRoZXkgY2FuIGJlIG5leHQgdG8gdGhlIC5ic3Mgc2VjdGlvbiBhbmQgc28KLQlpbml0aWFsaXNlZCBieSB0aGUgc2FtZSBwaWVjZSBvZiBjb2RlLgotCi1GcmkgT2N0ICA5IDE1OjU5OjUyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmLnNjOiAgTWVyZ2UgLnNkYXRhLiogZXRjIHNlY3Rpb25zLgotICAgICAgICAqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6ICBTZXQgU0VDX0tFRVAgZm9yCi0gICAgICAgIGN0b3Igc2VjdGlvbnMuCi0KLU1vbiBPY3QgIDUgMDk6NDA6NDMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBsZG1haW4uYyAobWFpbik6ICBFcnJvciBpZiAtLWdjLXNlY3Rpb25zIGFuZAotICAgICAgICBkeWFubWljIGxpbmtpbmcuCi0gICAgICAgICogc2NyaXB0dGVtcGwvdjg1MC5zYzogIEFkZCBLRUVQIGF0dHJpYnV0ZSB0byAuaW5pdCwKLSAgICAgICAgLmZpbmksIC5kdG9ycyBhbmQgLmN0b3JzLiAgQWRkIC5kYXRhIGFuZCAudGV4dAotICAgICAgICB3aWxkY2FyZHMgdG8gc3VwcG9ydCBzZWN0aW9uIGdhcmJhZ2UgY29sbGVjdGlvbi4KLQotV2VkIFNlcCAzMCAxMToxOToxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBSZW5hbWUgLmNhbGxfdGFibGUgc2VjdGlvbiB0bwotCS5jYWxsX3RhYmxlX2RhdGEgYW5kIGNyZWF0ZSBhIG5ldyBzZWN0aW9uIGNhbGxlZAotCS5jYWxsX3RhYmxlX3RleHQuCi0KLVN1biBTZXAgMjAgMDA6NDM6MjYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBhbGlnbm1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgLmJzcwotCXNlY3Rpb24sIHNvIHRoYXQgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1lbXNpemUgb2YgdGhlIHNlZ21lbnQuCi0KLUZyaSBTZXAgMTggMTM6NDI6NDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZF9wbGFjZV9vcnBoYW4pOiBEb24ndCBwcm9jZXNzIGZvcgotICAgICAgICBzZWN0aW9ucyB3aXRoIFNFQ19FWENMVURFIGZsYWcuCi0KLUZyaSBTZXAgIDQgMDk6MjQ6MDIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMzB2ZWxmLnNoIChURVhUX1NJWkUpOiBJbmNyZWFzZWQgdG8gMjAwMEsuCi0JKERBVEFfU0laRSk6IEluY3JlYXNlZCB0byAyMDAwSy4KLQotVGh1IFNlcCAgMyAxNzozMDo1OCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFRFTVBMQVRFX05BTUUpOiBVc2UgZWxmMzIuCi0KLU1vbiBBdWcgMzEgMDE6MDY6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5hbTogIENoYW5nZSBhcm1lbGYuc2MgdG8gZWxmLnNjCi0gICAgICAgICogTWFrZWZpbGUuaW46ICBSZWdlbmVyYXRlLgotCi1Nb24gQXVnIDMxIDExOjEyOjA0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHBhcmFtcy9hcm1lbGYuc2g6ICBDaGFuZ2UgU0NSSVBUX05BTUUgdG8KLSAgICAgICAgZWxmLiAgQ2hhbmdlIFRFWFRfU1RBUlRfQUREUiB0byAweDgwMDAuICBEZWZpbmUKLSAgICAgICAgT1RIRVJfVEVYVF9TRUNUSU9OUywgT1RIRVJfQlNTX1NZTUJPTFMgYW5kCi0gICAgICAgIE9USEVSX0JTU19FTkRfU1lNQk9MUy4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGYuc2M6ICBNb2RpZnkgdG8gdXNlCi0gICAgICAgIE9USEVSX0JTU19FTkRfU1lNQk9MUy4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBSZW1vdmUgZmlsZS4KLQotVHVlIEF1ZyAxOCAxMjowNTozNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVtdWx0ZW1wbC9hcm1lbGYuZW0gKGdsZF9hcm1lbGZfYmVmb3JlX2FsbG9jYXRpb24pOgotICAgICAgICBBZGQgYmZkXyBwcmVmaXggdG8gZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgICAgICAgYW5kIGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMuCi0gICAgICAgIChnbGRfYXJtZWxmX2FmdGVyX29wZW4pOiBBZGQgYmZkXyBwcmVmaXggdG8KLSAgICAgICAgZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZy4KLQotRnJpIEF1ZyAxNCAxNTozNDoyOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBsZGdyYW0ueTogSW5jbHVkZSAibGRjdG9yLmgiLgotCShzdGF0ZW1lbnQpOiBBY2NlcHQgU09SVCBhcm91bmQgQ09OU1RSVUNUT1JTLgotCSogbGRjdG9yLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShjb25zdHJ1Y3RvcnNfc29ydGVkKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoY3Rvcl9wcmlvLCBjdG9yX2NtcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IFNvcnQgY29uc3RydWN0b3JzIGlmIHJlcXVlc3RlZC4KLQkqIGxkY3Rvci5oIChjb25zdHJ1Y3RvcnNfc29ydGVkKTogRGVjbGFyZS4KLQkqIGxkbGFuZy5jIChwcmludF9zdGF0ZW1lbnQpOiBQcmludCBzb3J0ZWQgQ09OU1RSVUNUT1JTCi0JY29ycmVjdGx5LgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgc29ydCBhcm91bmQgQ09OU1RSVUNUT1JTLgotCSogbGQudGV4aW5mbyAoT3V0cHV0IFNlY3Rpb24gS2V5d29yZHMpOiBEb2N1bWVudCBTT1JUCi0gCShDT05TVFJVQ1RPUlMpLgotCi1UaHUgQXVnIDEzIDEyOjIwOjM5IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogIERlZmluZSBURU1QTEFURV9OQU1FIHRvIGFybWVsZi4KLSAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIEluY2x1ZGUgLmdsdWVfN3QgYW5kIC5nbHVlNwotICAgICAgIHNlY3Rpb25zLgotICAgICAgICogZW11bHRlbXBsL2FybWVsZi5lbTogTmV3IGZpbGUuCi0KLVRodSBBdWcgMTMgMTI6NTI6NDUgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAobGQuZHZpKTogVXNlICIgaW5zdGVhZCBvZiAnIGZvciBNQUtFSU5GTy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXVnIDExIDE2OjE3OjAxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgQ2hhbmdlIHRleHQgc3RhcnQgYWRkcmVzcwotICAgICAgICBiYWNrIHRvIHplcm8uCi0KLVR1ZSBBdWcgMTEgMTA6MDE6MTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvbW4xMDIwMC5zaCAoTUFYX1BBR0VTSVpFKTogRGVmaW5lIHRvIDEuCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaCAoTUFYX1BBR0VTSVpFKTogRGVmaW5lIHRvIDEuCi0KLVN1biBBdWcgIDkgMjA6MzE6MjcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBTZXQgdGV4dCBzdGFydCBhZGRyZXNzIHRvCi0gICAgICAgIDB4ODAwMC4gIEFkZCBfX2Jzc19lbmQgZGVmaW5pdGlvbi4KLQotU2F0IEF1ZyAgMSAxMTo0NzozNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIE5ldyBmaWxlLgotICAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmLnNoOiBTZXQgU0NSSVBUX05BTUUgdG8gZWxmYXJtLgotCi1GcmkgSnVsIDMxIDE1OjU2OjE2IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHBhcmFtcy9hcm1lbGYuc2g6IE5ldyBmaWxlLgotICAgICAgICAqIGNvbmZpZ3VyZS50Z3Q6ICBSZWNvZ25pemUgdGh1bWItZWxmIGFuZCBhcm0tZWxmLgotICAgICAgICAqIE1ha2VmaWxlLmFtIChlYXJtZWxmLm8pOiBOZXcuCi0gICAgICAgICogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBKdWwgMjQgMTI6MDA6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUudGd0OiBSZWNvZ25pemUgaDhbMzVdMDAqLWNvZmYqIGFzIHdlbGwgYXMgLWhtcyouCi0KLVRodSBKdWwgMjMgMTE6MTU6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBJZiBBTElHTk1FTlQgaXMgZGVmaW5lZCwgdXNlIGl0IHRvIHNldAotCWFsaWdubWVudCBvZiBlbmQgc3ltYm9sLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoQUxJR05NRU5UKTogRGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCAoQUxJR05NRU5UKTogRGVmaW5lLgotCSogbGRpbnQudGV4aW5mbyAoZW11bGF0aW9uIHBhcmFtZXRlcnMpOiBEb2N1bWVudCBBTElHTk1FTlQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50LgotCi0JKiBsZGxhbmcuYyAobGFuZ19nY19zZWN0aW9uc18xKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2ggdG8KLQlhdm9pZCB3YXJuaW5ncy4KLQotVHVlIEp1bCAxNCAxNTo0MjoxNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpPzg2LSotYmVvc3twZSxlbGYsfSopOiBSZWNvZ25pemUuCi0JKiBNYWtlZmlsZS5hbSAoZWkzODZiZW9zLm8pOiBOZXcuCi0JKiBlbXVscGFyYW1zL2kzODZiZW9zLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWx0ZW1wbC9iZW9zLmVtLCBzY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYzogTmV3IGZpbGUuCi0KLVR1ZSBKdWwgMTQgMTU6MzU6NDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmM6IE5ldyBvcHRpb24gLS12ZXJzaW9uLWV4cG9ydHMtc2VjdGlvbi4KLQkqIGxkLmggKHN0cnVjdCBhcmdzX3R5cGUpOiBBZGQgdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24uCi0JKiBsZGxhbmcuYyAobGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19wcm9jZXNzKTogQ2FsbCBpdC4KLQotTW9uIEp1bCAxMyAxMzoyMDoyMyAxOTk4ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0B0cmFuc21ldGEuY29tPgotCi0JKiBsZGxleC5sOiBBY2NlcHQgQVNTRVJULgotCSogbGRncmFtLnkgKGV4cCk6IEFkZCBBU1NFUlRfSyBjYXNlLgotCSogbGRleHAuaCAobm9kZV90eXBlKTogQWRkIGV0cmVlX2Fzc2VydCB0byBub2RlX2NsYXNzIGVudW0uCi0JKGV0cmVlX3R5cGUpOiBBZGQgYXNzZXJ0X3MgZmllbGQuCi0JKGV4cF9hc3NlcnQpOiBEZWNsYXJlLgotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IEhhbmRsZSBldHJlZV9hc3NlcnQuCi0JKGV4cF9hc3NlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKGV4cF9wcmludF90cmVlKTogSGFuZGxlIGV0cmVlX2Fzc2VydC4KLQkqIGxkLnRleGluZm8gKE1pc2NlbGxhbmVvdXMgQ29tbWFuZHMpOiBEb2N1bWVudCBBU1NFUlQuCi0KLVdlZCBKdWwgIDggMTQ6MDM6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueTogQ2hhbmdlIE1BWCB0byBNQVhfSyBhbmQgTUlOIHRvIE1JTl9LLCB0byBhdm9pZAotCWNvbmZsaWN0cyB3aXRoIHN5c3RlbSBoZWFkZXIgZmlsZXMuICBDaGFuZ2UgYWxsIHVzZXMuCi0KLQkqIE1ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVsICA3IDE4OjAzOjIyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxkdmVyLnRleGkpOiBOZXcgdGFyZ2V0LgotCShsZC5pbmZvLCBsZC5kdmkpOiBEZXBlbmQgdXBvbiBsZHZlci50ZXhpLgotCSogbGQudGV4aW5mbzogSW5jbHVkZSBsZHZlci50ZXhpLiAgTWVudGlvbiB2ZXJzaW9uIG51bWJlciBvbiB0aXRsZQotCXBhZ2UgYW5kIGluIHRvcCBub2RlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBKdWwgIDYgMTQ6NTU6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1zb2xhcmlzKik6IE5ldyB0YXJnZXQuCi0KLUZyaSBKdWwgIDMgMTQ6MTk6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogRG9uJ3QgZ2V0IGFuIGFzc2VydGlvbiBmYWlsdXJlIGlmIHRoZQotCXNlY3Rpb24gaXMgZGlzY2FyZGVkLgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVXNlIFNPUlQgdG8gc29ydCBzZWN0aW9ucyBhcHByb3ByaWF0ZWx5LgotCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X2J5X2ZpbGVfbmFtZSk6IFJlbW92ZS4KLQkoc29ydF9ieV9zZWN0aW9uX25hbWUpOiBSZW1vdmUuCi0JKHNvcnRfc2VjdGlvbnNfMSwgc29ydF9zZWN0aW9ucyk6IFJlbW92ZS4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogRG9uJ3QgY2FsbAotCXNvcnRfc2VjdGlvbnMuCi0JKGhvbGRfc2VjdGlvbiwgaG9sZF9zZWN0aW9uX25hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoaG9sZF91c2UsIGhvbGRfdGV4dCwgaG9sZF9yZGF0YSwgaG9sZF9kYXRhLCBob2xkX2Jzcyk6IExpa2V3aXNlLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUmV3cml0ZS4gIExvb2sgZm9yIGEgZ29vZAotCXBsYWNlIHRvIHB1dCB0aGUgc2VjdGlvbi4gIEFsaWduIHRoZSBzZWN0aW9uLiAgU29ydCB0aGUgaW5wdXQKLQlzZWN0aW9ucyBieSBuYW1lLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGxkbGFuZy5jICh3aWxkX3NvcnQpOiBXaGVuIHNvcnRpbmcgYnkgZmlsZSBuYW1lLCBzb3J0IGJ5IGFyY2hpdmUKLQluYW1lIGZpcnN0LgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9wZV9zdWJzeXN0ZW0pOiBEb24ndCBjYWxsCi0JbGRsYW5nX2FkZF91bmRlZi4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIG5ldyBhZnRlcl9wYXJzZSBmdW5jdGlvbgotCXJhdGhlciB0aGFuIGFmdGVyX3BhcnNlX2RlZmF1bHQuCi0KLQkqIGxkZ3JhbS55IChleHRlcm5fbmFtZV9saXN0KTogRG8gbm90IHJlcXVpcmUgc3ltYm9scyB0byBiZQotCXNlcGFyYXRlZCBieSBjb21tYXMuCi0JKGlmaWxlX3AxKTogQWRkIEVYVEVSTi4KLQkqIGxkbGV4Lmw6IEFjY2VwdCBFWFRFUk4gaW4gQk9USCBhbmQgU0NSSVBUIG1vZGUgYXMgd2VsbCBhcyBNUkkKLQltb2RlLgotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IE1lbnRpb24gdGhhdCBFWFRFUk4gaXMgZXF1aXZhbGVudCB0byAtdS4KLQkoTWlzY2VsbGFuZW91cyBDb21tYW5kcyk6IERvY3VtZW50IEVYVEVSTi4KLQotV2VkIEp1bCAgMSAxOTo0MDozNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBnY19zZWN0aW9ucy4KLQkqIGxkZ3JhbS55IChsZGdyYW1faGFkX2tlZXAsIEtFRVApOiBOZXcuCi0JKGlucHV0X3NlY3Rpb25fc3BlY19ub19rZWVwKTogUmVuYW1lIGZyb20gb2xkIGlucHV0X3NlY3Rpb25fc3BlYy4KLQkoaW5wdXRfc2VjdGlvbl9zcGVjKTogTmV3LiAgUmVjb2duaXplIEtFRVAuCi0JKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogSGFuZGxlIGtlZXAgc2VjdGlvbnMuCi0JKGxhbmdfZ2Nfd2lsZF9zZWN0aW9uLCBsYW5nX2djX3dpbGRfZmlsZSwgbGFuZ19nY193aWxkKTogTmV3LgotCShsYW5nX2djX3NlY3Rpb25zXzEsIGxhbmdfZ2Nfc2VjdGlvbnMpOiBOZXcuCi0JKGxhbmdfcHJvY2Vzcyk6IEludm9rZSBsYW5nX2djX3NlY3Rpb25zLgotCShsYW5nX2FkZF93aWxkKTogQWRkIGtlZXAgYXJndW1lbnQuICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKiBsZGxhbmcuaCAobGFuZ193aWxkX3N0YXRlbWVudF9zdHJ1Y3QpOiBBZGQga2VlcF9zZWN0aW9ucy4KLQkqIGxkbGV4LmwgKEtFRVApOiBNYXRjaCBpdC4KLQkqIGxkbWFpbi5jIChtYWluKTogRXJyb3Igb24gLXIgYW5kIC0tZ2Mtc2VjdGlvbnMuCi0JKiBsZXhzdXAuYzogQWRkIC0tZ2Mtc2VjdGlvbnMuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTWVyZ2UgLnRleHQuKiBldGMgc2VjdGlvbnMgYXBwcm9wcmlhdGVseS4KLQlNYXJrIHN0YXJ0dXAgc2VjdGlvbnMgd2l0aCBLRUVQLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotCSogbGQudGV4aW5mbzogVXBkYXRlIGZvciAtLWdjLXNlY3Rpb25zIGFuZCBLRUVQLgotCi1XZWQgSnVsICAxIDE1OjIxOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUGV0ZXIgSm9yZGFuIDxwam9yZGFuQGNobGEudXNjLmVkdT46Ci0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYzogQ29ycmVjdCBjb25zdHJ1Y3RvciBoYW5kbGluZyBmb3IgLXUuCi0KLVR1ZSBKdW4gMjMgMTU6MTc6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWxvY2FsKTogTWFrZSBsZHNjcmlwdHMgc3ViZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdW4gMjMgMTU6MTc6MDQgMTk5OCAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgbGV0IEVYRUVYVCBpbnRlcmZlcmUKLQl3aXRoIHRoZSBwcm9ncmFtIHRyYW5zZm9ybSBuYW1lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVN1biBKdW4gMjEgMjM6NTU6MTYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiBOb3RlIHRoYXQgLXJlbGF4IG1heSBtYWtlIHN5bWJvbGljIGRlYnVnZ2luZwotCWltcG9zc2libGUgb24gc29tZSBwbGF0Zm9ybXMuCi0KLVR1ZSBKdW4gMTYgMTI6NTE6MTMgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogTWFrZWZpbGUuYW0gKE1ha2VmaWxlKTogUmVtb3ZlIHRhcmdldC4KLQkoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmhvc3QgKHBvd2VycGMqLSotbGludXgtZ251Kik6IE5ldyBob3N0LgotCi1GcmkgSnVuIDEyIDE3OjM4OjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKElOUFVUX0ZJTEVTKTogT3B0aW9uYWwgSU5QVVQgc3BlYy4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogQ2hhbmdlIHRvcCBvZgotCXN0YWNrIHRvIDhNQi4KLQotRnJpIEp1biAxMiAxOTozMzoxNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChIRklMRVMpOiBSZW1vdmUgY29uZmlnLmguCi0JKEVNVUxBVElPTl9PRklMRVMsIFBPVEZJTEVTKTogTW92ZSBwYXRjaCBvZiBNYXkgMTQgZnJvbQotCU1ha2VmaWxlLmluIHRvIE1ha2VmaWxlLmFtLgotCShlYXJtY29mZi5jKTogRGVwZW5kIHVwb24gYXJtY29mZi5lbSwgbm90IGdlbmVyaWMuZW0uCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogQ29ycmVjdCBtaXNzcGVsbGluZyBpbiAkKFBBQ0tBR0UpLgotCSgkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QpOiBQYXNzIC1DIHRvICQoWEdFVFRFWFQpLgotCSogTWFrZWZpbGUuaW4sIHBvL1BPVEZJTEVTLmluLCBwby9sZC5wb3Q6IFJlYnVpbGQuCi0KLUZyaSBKdW4gMTIgMTM6NDM6MTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLVR1ZSBKdW4gIDkgMDk6MzY6NDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogQWRkIENPTlNUIHR5cGUgbW9kaWZpZXIgdG8gZGVjbGFyYXRpb24KLQlvZiAnc2VuZCcuCi0KLUZyaSBKdW4gIDUgMTg6MTk6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOiBTZXQKLQljb25maWcuaGFzX3NoYXJlZCB0byB0cnVlLgotCSogZW11bHRlbXBsL2xpbnV4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOgotCUxpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOgotCUxpa2V3aXNlLgotCi1UdWUgSnVuICAyIDEyOjU1OjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogSWYgdGhlIGVudHJ5IHN5bWJvbCBpcyBub3QgZm91bmQsIHRyeQotCXBhcnNpbmcgaXQgYXMgYSBudW1iZXIuCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogRG9jdW1lbnQgdGhpcy4KLQotTW9uIEp1biAgMSAxNDowMToyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKElucHV0IFNlY3Rpb24gV2lsZGNhcmRzKTogRG9jdW1lbnQgU09SVCBrZXl3b3JkLgotCi1Nb24gTWF5IDE4IDEyOjQyOjUzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogTmV3IG1lbWJlciBoYXNfc2hhcmVkLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGl0LgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOiBTZXQgaXQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFRyZWF0IC1zaGFyZWQgYXMgZXJyb3IgaWYgbm90IHN1cHBvcnRlZC4KLQotTW9uIE1heSAxOCAxMzoxNDo0MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEphc29uIE1lcnJpbGwgPGphc29uQGN5Z251cy5jb20+OgotCSogbGRsYW5nLmMgKHdpbGRfc29ydCk6IENvcnJlY3Qgb3JkZXIgb2Ygc29ydC4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0ICpjcnRiZWdpbi5vIGJlZm9yZSBvdGhlciAuY3RvcnMgYW5kCi0JLmR0b3JzLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLUZyaSBNYXkgMTUgMDA6MjI6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUga2V5d29yZCBTT1JULgotCSogbGRncmFtLnkgKGN1cnJlbnRfZmlsZSk6IENoYW5nZSB0byBzdHJ1Y3Qgd2lsZGNhcmRfc3BlYy4KLQkoJXVuaW9uKTogQWRkIG5ldyBmaWVsZHMgY25hbWUgYW5kIHdpbGRjYXJkLgotCSh3aWxkY2FyZF9uYW1lLCB3aWxkY2FyZF9zcGVjKTogTmV3IG5vbnRlcm1pbmFscy4KLQkoZmlsZV9OQU1FX2xpc3QpOiBVc2Ugd2lsZGNhcmRfc3BlYy4KLQkoaW5wdXRfc2VjdGlvbl9zcGVjKTogQ2hhbmdlIGN1cnJlbnRfZmlsZSB1c2FnZS4KLQkqIGxkLmggKHN0cnVjdCB3aWxkY2FyZF9zcGVjKTogRGVmaW5lLgotCSogbGRsYW5nLmggKGxhbmdfd2lsZF9zdGF0ZW1lbnRfc3RydWN0KTogQWRkIG5ldyBmaWVsZHMKLQlzZWN0aW9uc19zb3J0ZWQgYW5kIGZpbGVuYW1lc19zb3J0ZWQuCi0JKGxhbmdfYWRkX3dpbGQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsZGxhbmcuYyAod2lsZF9zb3J0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkod2lsZF9zZWN0aW9uKTogVXNlIHdpbGRfc29ydC4KLQkocHJpbnRfd2lsZF9zdGF0ZW1lbnQpOiBQcmludCBzb3J0aW5nIGluZm9ybWF0aW9uLgotCShsYW5nX2FkZF93aWxkKTogQWRkIG5ldyBwYXJhbWV0ZXJzIHNlY3Rpb25zX3NvcnRlZCBhbmQKLQlmaWxlbmFtZXNfc29ydGVkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiBVcGRhdGUgY2FsbHMgdG8gbGFuZ19hZGRfd2lsZC4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogU29ydCAuY3RvcnMuKiBhbmQgLmR0b3JzLiogYnkgc2VjdGlvbiBuYW1lLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLVRodSBNYXkgMTQgMTg6Mzk6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lLgotCi1UaHUgTWF5IDE0IDE0OjUxOjI0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5oOiBBZGQgbmV3IHByb3RvdHlwZTogbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMuCi0JKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBuZXcgZmllbGQ6IGxpc3Rfb3B0aW9ucy4KLQkqIGxkZW11bC5jIChsZGVtdWxfbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uLiAgQ2FsbCB0aGUKLQlsaXN0X29wdGlvbnMgZmllbGQgb2YgdGhlIGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBmb3IgZWFjaAotCXN1cHBvcnRlZCBlbXVsYXRpb24sIGlmIHN1Y2ggYSBmdW5jdGlvbiBpcyBwcmVzZW50LgotCSogbGV4c3VwLmMgKGhlbHApOiBDYWxsIGxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zLgotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfPD5fbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uLiAgRGVzY3JpYmUKLQl0aGUgcGUgZW11bGF0aW9uIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCSogZW11bHRlbXBsL2FybWNvZmYuZW0gKGdsZDw+X2xpc3Rfb3B0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQlEZXNjcmliZSAgdGhlIGFybWNvZmYgZW11bGF0aW9uIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IEFkZCBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOgotCS0tc3VwcG9ydC1vbGQtY29kZS4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBEaXR0by4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHRoZSAtLXN1cHBvcnQtb2xkLWNvZGUgb3B0aW9uLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVtdWxhdGlvbiBmaWxlcyBmb3IgUE9URklMRVMuaW4gdGFyZ2V0LgotCSogZW11bHRlbXBsL3BlLmVtOiBJbnRlcm5hdGlvbmFsaXNlIHN1aXRhYmxlIHN0cmluZ3MuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogSW50ZXJuYXRpb25hbGlzZSBzdWl0YWJsZSBzdHJpbmdzLgotCSogcG8vUE9URklMRVMuaW46IFJlYnVpbHQuCi0KLVN1biBNYXkgMTAgMjI6MzY6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotVHVlIEFwciAyOCAxOToxODozMCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQ29uZGl0aW9uYWxseSBjYWxsIHNldGxvY2FsZS4KLQkqIGxkLmg6IEluY2x1ZGUgPGxvY2FsZS5oPiBpZiBIQVZFX0xPQ0FMRV9ILgotCShMQ19NRVNTQUdFUyk6IE5vdyBjYW4gYmUgZGVmaW5lZCBldmVuIHdoZW4gRU5BQkxFX05MUy4KLQotTW9uIEFwciAyNyAxMTo1NjoyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOS40Ci0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpIFstcnBhdGgtbGlua106IE1lbnRpb24gbGQuc28uY29uZi4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbG9iYWxfdmVyY2hlY2tfbmVlZGVkKTogTmV3IGZpbGUgc3RhdGljCi0JdmFyaWFibGUuCi0JKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBDaGVjayBmb3Igc2hhcmVkIGxpYnJhcmllcwotCXR3aWNlLCBvbmNlIHdpdGggZm9yY2Ugc2V0IHRvIDAgYW5kIG9uY2Ugd2l0aCBpdCBzZXQgdG8gMS4KLSAJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYpOiBBZGQgZm9yY2UgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkKTogTGlrZXdpc2UuICBJZiBub3QgZm9yY2UsIGNoZWNrCi0Jd2hldGhlciB0aGUgbGlicmFyaWVzIG5lZWRzIGFueSBpbmNvbXBhdGlibGUgdmVyc2lvbnMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotV2VkIEFwciAyMiAxNjowMTozNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCi0KLVdlZCBBcHIgMjIgMTI6NDA6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IEFkZCAkKElOVExMSUJTKSB0byBMSUJJQkVSVFkgd2hlbgotCWludm9raW5nIHJ1bnRlc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBDaGFuZ2UgLWwgb3B0aW9ucyBpbnRvIC0tbGlicmFyeSBvcHRpb25zCi0JdG8gYXZvaWQgY29uZnVzaW9uIGJldHdlZW4gLWxpIGFuZCAtbGlicmFyeS4KLQotCSogbGQudGV4aW5mbyAoTUVNT1JZKTogQ2xhcmlmeSB1c2Ugb2YgPlJFR0lPTi4KLQotVHVlIEFwciAyMSAyMzoxMjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYW55IGZpbGVzOiBBZGRlZCBnZXR0ZXh0IGludm9jYXRpb25zIGFyb3VuZCB1c2VyLXZpc2libGUKLQlzdHJpbmdzLgotCSogbGQuaDogQWRkZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzLgotCSogbGRtYWluLmM6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgdGV4dGRvbWFpbi4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLiAgVXNlIEFNX1BST0dfTEVYLgotCShURElSUyk6IEFDX1NVQlNUIGVhcmx5IG9uLCB0byBhdm9pZCBoYXZpbmcgdmFsdWUgc3BsaXQgd2hlbiBpdAotCWhhcHBlbnMgdG8gY3Jvc3MgbGluZSA5MCBvZiB0aGUgZ2VuZXJhdGVkIHNlZCBzY3JpcHQuCi0JKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IE5ldyBtYWNyby4KLQkoUE9URklMRVMpOiBMaWtld2lzZS4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCShsZF9uZXdfTERBREQpOiBBZGRlZCBJTlRMTElCUy4KLQkobGRfbmV3X0RFUEVOREVOQ0lFUyk6IEFkZGVkIElOVExERVBTLgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2dhcy5wb3Q6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAyMSAyMzowNzowNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKFNpbXBsZSBFeGFtcGxlKTogUmV3cml0ZSBhIGZldyB0aGluZ3MgYXMgc3VnZ2VzdGVkCi0JYnkgTmljayBDbGlmdG9uIDxuaWNrY0BjeWdudXMuY29tPi4KLQkoUFJPVklERSk6IExpa2V3aXNlLgotCi1UdWUgQXByIDIxIDA5OjU1OjA2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogUmVuYW1lIGV4dGVybmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zCi0JdG8gY29uZm9ybSB0byBCRkQgbmFtaW5nIGNvbnZlbnRpb25zLiAgQWRkIGNvZGUgdG8gX2FmdGVyX29wZW4oKQotCWZ1bmN0aW9uIHRvIG9idGFpbiBhIGJmZCBmb3IgdXNlIGJ5IHRoZSBpbnRlcndvcmtpbmcgY29kZS4KLQotCSogZW11bHRlbXBsL2FybWNvZmYuZW06IFJlbmFtZSBleHRlcm5hbCBhcm0gaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucwotCXRvIGNvbmZvcm0gdG8gQkZEIG5hbWluZyBjb252ZW50aW9ucy4gIEFkZCBuZXcgX2FmdGVyX29wZW4oKQotCWZ1bmN0aW9uIHRvIG9idGFpbiBhIGJmZCBmb3IgdXNlIGJ5IHRoZSBpbnRlcndvcmtpbmcgY29kZS4KLQotU3VuIEFwciAxOSAxOToyMzowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKSBbY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW1dOgotCVVwZGF0ZSBkb3QgYW5kIHRoZSBkZWZhdWx0IG1lbW9yeSBzZWN0aW9uIGV2ZW4gd2hlbiByZWxheGluZy4KLQotU2F0IEFwciAxOCAxODo0MToxMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogTWFuaXB1bGF0ZSB0aGUgc2VjdGlvbidzIGNvb2tlZCBzaXplCi0JcmF0aGVyIHRoYW4gaXRzIHJhdyBzaXplLgotCi1UdWUgQXByICA3IDEzOjM1OjI5IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlndXJlLmluIChURVNUQkZETElCKTogTmV3LiAgRGVmaW5lZCBhbmQgc3Vic3RpdHV0ZWQuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVEJGRExJQik6IENoYW5nZWQgdG8gQFRFU1RCRkRMSUJALgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAgNiAxNTozMzozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZC5pbmZvKTogSW52b2tlIG1ha2VpbmZvIHdpdGggLUkgb3B0aW9ucyBkaXJlY3RseQotCXJhdGhlciB0aGFuIHJlbHlpbmcgb24gZGVmYXVsdCBydWxlLiAgRG9uJ3QgZGVwZW5kIHVwb24KLQliZmRzdW1tLnRleGkuCi0JKGxkLmR2aSk6IExpa2V3aXNlLgotCShiZmRzdW1tLnRleGkpOiBSZW1vdmUgdGFyZ2V0LgotCShDTEVBTkZJTEVTKTogVGFrZSBiZmRzdW1tLnRleGkgb3V0IG9mIHZhbHVlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVN1biBBcHIgIDUgMTM6MDc6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVXNlIHNoZWxsIHZhcmlhYmxlcyB0byBhdm9pZCBkZXBlbmRpbmcgdXBvbgotCWhvdyAkIGlzIGhhbmRsZWQgd2hlbiBleHBhbmRpbmcgYSBzaGVsbCBzdWJzdGl0dXRpb24uCi0KLUZyaSBBcHIgIDMgMDA6NTY6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IEFkZCBsZC5sb2cgYW5kIGxkLnN1bS4KLQkoRElTVENMRUFORklMRVMpOiBBZGQgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IHRoZSB0ZGlycyBpbiBhIGZpbGUgYW5kIHVzZSBBQ19TVUJTVF9GSUxFLAotCXJhdGhlciB0aGFuIGluIGEgc2hlbGwgdmFyaWFibGUgYW5kIHVzaW5nIEFDX1NVQlNULgotCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogUmVtb3ZlIGxkc2NyaXB0cy4gIEFkZCB0ZGlycy4KLSAJKGRpc3RjbGVhbi1sb2NhbCk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBsZC50ZXhpbmZvOiBDb21wbGV0ZWx5IHJld3JpdGUgbGlua2VyIHNjcmlwdCBkb2N1bWVudGF0aW9uLgotCi1Nb24gTWFyIDMwIDEyOjQ3OjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi1TYXQgTWFyIDI4IDE2OjQ4OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBSZW1vdmUgdG1wZGlyLgotCShtb3N0bHljbGVhbi1sb2NhbCk6IE5ldyB0YXJnZXQgdG8gcmVtb3ZlIHRtcGRpci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogbGRjcmVmLmMgKG91dHB1dF9jcmVmKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbGRmaWxlLmMgKGxkZmlsZV9hZGRfYXJjaCk6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKGxhbmdfbGVhdmVfb3ZlcmxheV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBsZXhzdXAuYyAoT1BUSU9OX0NPVU5UKTogTGlrZXdpc2UuCi0JKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKToKLQlMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiBJbml0aWFsaXplIHZhcmlhYmxlcyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IENvcnJlY3QgbmFtZSAod2FzCi0JTU9TVENMRUFORklMRVMpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjcgMTY6Mzk6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFB1dAotCUFSTSBjb2RlIGluc2lkZSBpZmRlZiBUQVJHRVRfSVNfYXJtcGUuCi0KLVdlZCBNYXIgMjUgMTE6MzQ6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKExERElTVFNUVUZGKTogTmV3IHZhcmlhYmxlLgotCShkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBPbmx5IGluY2x1ZGUgLmlkYXRhXCRbMC03XSBpbiAuaWRhdGEgd2hlbgotCXJlbG9jYXRpbmcuCi0KLVR1ZSBNYXIgMjQgMTU6NTk6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2MgKC50ZXh0KTogQWRkIC5nbHVlXzcgYW5kIC5nbHVlXzd0IHNlY3Rpb25zIHRvCi0JaG9sZCBBcm0vVGh1bWIgc3R1YnMuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX3BlX2JlZm9yZV9hbGxvY2F0aW9uKTogQ2FsbAotCWFybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChmb3IgQVJNL1RodW1iIHRhcmdldHMpIGluIG9yZGVyIHRvCi0JZ2F0aGVyIGludGVyd29ya2luZyBzdGIgaW5mb3JtYXRpb24uCi0KLU1vbiBNYXIgMjMgMTg6NTQ6MTUgMTk5OCAgSm9lbCBTaGVycmlsbCAgPGpvZWxAT0FSY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IChzaCotKi1ydGVtcyopOiBTd2l0Y2hlZCBmcm9tIEVMRiB0byBDT0ZGLgotCi1GcmkgTWFyIDIwIDE5OjE3OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVRodSBNYXIgMTkgMTQ6NTQ6NDUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSAuZGF0YSRub2NvcHkKLQlzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhIG9uIGZvcmsuICBUaGUgbGlua2VyIHVzZWQgdG8KLQlpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotCWJyZWFrcyBidWlsZGluZyB0aGUgY3lnd2luMzIgZGxsLiAgVGhlIGZpeCBpcyB0byByZW5hbWUgdGhlCi0Jc2VjdGlvbgkiLmRhdGFfY3lnd2luX25vY29weSIgYW5kIGV4cGxpY3RseSBpbmNsdWRlIGl0IGFmdGVyCi0JX19kYXRhX2VuZF9fLgotCi1XZWQgTWFyIDE4IDA5OjQyOjI0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi1TdW4gTWFyICA4IDIzOjM0OjE0IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjbGl0ZSotKi1lbGYpOiBBZGRlZC4KLQotTW9uIE1hciAgMiAxOToyNDowOCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIHRoZSBkZWZhdWx0IG1lbW9yeSByZWdpb24gaXMKLQkqZGVmYXVsdCosIHNlZSBpZiB0aGVyZSBpcyBhIG1lbW9yeSByZWdpb24gdGhhdCBjb3VsZCBiZSB1c2VkLgotCi1UaHUgRmViIDI2IDE3OjA5OjUzIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBBZGQgc3VwcG9ydCBmb3IgLmVpdF92IHNlY3Rpb24gYW5kIHB1dAotCWl0IGF0IDB4ZmZmZmYwMjAuCi0JKiBlbXVscGFyYW1zL2QzMHZ7ZWxmLF9vLF9lfS5zaDogRGl0dG8uCi0KLU1vbiBGZWIgMjMgMTc6NDY6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfc2VjdGlvbnMpOiBQZXJtaXQgdGhlIHdpbGRjYXJkIHRvIGluY2x1ZGUKLQlhIHRyYWlsaW5nICcqJyB3aGVuIHNvcnRpbmcgZ3JvdXBlZCBzZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBJbmNsdWRlIGdyb3VwZWQgc2VjdGlvbnMgdXNpbmcgTkFNRVwkKi4gIE9ubHkKLQlpbmNsdWRlIHRoZW0gd2hlbiByZWxvY2F0aW5nLgotCi1XZWQgRmViIDE4IDIzOjM5OjQ2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBJbnN0YWxsIHByb3Blcmx5IHdoZW4gbG4KLQlmYWlscyBvciB0b29sZGlyID09IHByZWZpeC4KLQotRnJpIEZlYiAxMyAxNToyNDowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0KLVRodSBGZWIgMTIgMTQ6MTA6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFsaWduIHRoZSBfZW5kIHN5bWJvbCBhY2NvcmRpbmcgdG8gdGhlIEVMRgotIAlmb3JtYXQgc2l6ZS4gIEZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+LgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBjb25maWd1cmUuaG9zdCAoYWxwaGEqLSotbmV0YnNkKik6IE5ldyBob3N0LgotCSogY29uZmlndXJlLnRndCAoYWxwaGEqLSotbmV0YnNkKiwgcG93ZXJwYy0qLW5ldGJzZCopOiBOZXcKLQl0YXJnZXRzLgotCi0JKiBsZXhzdXAuYyAoaGVscCk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0JKiBsZC50ZXhpbmZvIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMTAgMTg6MDU6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogV2FybiBpZiBzb21lIG1lbW9yeSByZWdpb25zIHdlcmUKLQlkZWZpbmVkLCBidXQgYSBsb2FkYWJsZSBzZWN0aW9uIGlzIGdvaW5nIGludG8gdGhlIGRlZmF1bHQgbWVtb3J5Ci0JcmVnaW9uLgotCi1UdWUgRmViIDEwIDE2OjE3OjIwIDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogbGRsZXgubCAoVl9JREVOVElGSUVSKTogQWxsb3cgJy4nIGFzIHN5bWJvbCBwcmVmaXguCi0KLVR1ZSBGZWIgMTAgMTU6MDk6NDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTWFrZWZpbGUpOiBBZGQgdGFyZ2V0LCBmb3IgZGVwZW5kZW5jaWVzIG9uCi0JY29uZmlndXJlLmhvc3QgYW5kIGNvbmZpZ3VyZS50Z3QuCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlndXJlLnRndDogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEZlYiAgOSAxMzo0NDo0MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2MgKC5zdGFjayk6IE1vdmUgc3RhY2sgdG8gMHgwMC4uN0ZGRS4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChSRUFET05MWV9TVEFSVF9BRERSKTogUmVhZCBvbmx5IHNlY3Rpb24KLSAJbW92ZWQgdG8gMHgwMC4uLi4uNC4KLQotU2F0IEZlYiAgNyAxNTo0MToyNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UaHUgRmViICA1IDEyOjE2OjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFJlbW92ZSAke1JFTE9DQVRJTkctMH0gZnJvbSBhbGwgc2VjdGlvbnMuCi0JRnJvbSBUaG9tYXMgZGUgTGVsbGlzIDx0ZGVsQHdycy5jb20+LgotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVdlZCBGZWIgIDQgMTM6MDI6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGRfbmV3X0xEQUREKTogUmVtb3ZlIEBMRVhMSUJALgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDIgMTk6MzQ6NTQgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCUFkZCB0bXMzMjBjMzAgc3VwcG9ydDoKLQkqIGNvbmZpZ3VyZS50Z3QgKHRpYzMwLSotKmFvdXQqLCB0aWMzMC0qLSpjb2ZmKik6IE5ldyB0YXJnZXRzLgotCSogZW11bHBhcmFtcy90aWMzMGFvdXQuc2g6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy90aWMzMGNvZmYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3RpYzMwY29mZi5zYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXRpYzMwYW91dC5vIGFuZAotCWV0aWMzMGNvZmYuby4KLQkoZXRpYzMwYW91dC5jLCBldGljMzBjb2ZmLmMpOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDE0OjEwOjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IENvcnJlY3QgSE9TVElOR19DUlQwIGluIGFscGhhKi0qLWxpbnV4KiBjYXNlIHRvCi0JYWNjZXB0IGVpdGhlciBsZC5zbyBvciBsZC1saW51eC5zby4KLQotRnJpIEphbiAzMCAxOToxNjoyOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoe0NDLENYWH1fRk9SX1RBUkdFVCk6IENoYW5nZSBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0JdG8gdHJhbnNmb3JtLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLUZyaSBKYW4gMzAgMTk6MTU6MTcgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBQdXQgLmR5bnNic3MgaW4gLnNic3MuCi0KLUZyaSBKYW4gMzAgMTE6NDM6NDkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogTWFrZWZpbGUuYW0gKGVlbGYzMmJzbWlwLmMsIGVlbGYzMmxzbWlwLmMpOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgSmFuIDI5IDE2OjA0OjIxIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBsZGZpbGUuYyAoc2xhc2gpOiBTZXQgdG8gYmFja3NsYXNoIGlmIF9XSU4zMiBidXQgbm90Ci0JX19DWUdXSU4zMl9fLgotCShsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IElmIF9fTVNET1NfXyBvciBfV0lOMzIsIGFjY2VwdCBhCi0JbGVhZGluZyBiYWNrc2xhc2ggb3IgYSBsZWFkaW5nIHg6IGFzIGFuIGFic29sdXRlIHBhdGguCi0JKGxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZSk6IFVzZSBzbGFzaCByYXRoZXIgdGhhbiAvIHdoZW4KLQlnZW5lcmF0aW5nIG5hbWUgdG8gdHJ5LgotCSogbGV4c3VwLmMgKFBBVEhfU0VQQVJBVE9SKTogRGVmaW5lLgotCShzZXRfZGVmYXVsdF9kaXJsaXN0KTogVXNlIFBBVEhfU0VQQVJBVE9SIHJhdGhlciB0aGFuICc6Jy4KLQotV2VkIEphbiAyOCAxNDowNjozMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChFTEZTSVpFKTogNjQKLQkoVEVYVF9TVEFSVF9BRERSKTogUm91bmQgb2ZmLCBzaW5jZSBTSVpFT0ZfSEVBREVSUyBpcyBhZGRlZCBsYXRlci4KLQkoREFUQV9QTFQpOiBOZWVkZWQgYnkgdjkgYWJpLgotCi1XZWQgSmFuIDI4IDE2OjM3OjI3IDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuICA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1taW5ndzMyKik6IE5ldyBlbnRyeS4KLQotV2VkIEphbiAyOCAxNTo1MTo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogT25seSBpbmNsdWRlIGxpbmtvbmNlIHNlY3Rpb25zIGluIGZpbmFsCi0Jc2VjdGlvbnMgd2hlbiByZWxvY2F0aW5nLgotCi1XZWQgSmFuIDI4IDE0OjEwOjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IEFkZCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlcyBvZgotCWluZm9ybWF0aW9uIGluY2x1ZGVkIGluIGEgbGluayBtYXAuCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBNZW50aW9uIExERU1VTEFUSU9OIGluIGRlc2NyaXB0aW9uIG9mIC1tLgotCShFbnZpcm9ubWVudCk6IE1lbnRpb24gTERFTVVMQVRJT04uCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBDbGFyaWZ5IC0tZXhwb3J0LWR5bmFtaWMgYSBiaXQuCi0KLVRodSBKYW4gMjIgMTY6MDc6MjMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubCAoPFNDUklQVD57V0lMRENIQVJ9Kik6IFRha2UgY2FyZSBmb3IgdGhlIGNvbW1lbnRzIHRoaXMKLQlwYXR0ZXJuIGNvdWxkIG1hdGNoLgotCi1XZWQgSmFuIDIxIDIyOjI2OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMpOiBXaGVuIGRvaW5nCi0JYSByZWxvY2F0ZWFibGUgbGluaywgc2V0IHRoZSBpbWFnZSBiYXNlIHRvIDAsIGFuZCBkb24ndCBkZWZpbmUgdGhlCi0JdmFyaW91cyBzeW1ib2xzLgotCSogZW11bHBhcmFtcy9pMzg2cGUuc2ggKFJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUKTogRGVmaW5lLgotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFN3YXAgdGhlIC5kYXRhIGFuZCAuYnNzIHNlY3Rpb25zIHNvIHRoYXQKLQkuZGF0YSBjb21lcyBmaXJzdC4gIElmIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHVzZQotCVJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUIGlmIGl0IGlzIGRlZmluZWQsIGFuZCBzdGFydCB0aGUKLQlzZWN0aW9ucyBhdCAwLCBhbmQgZG9uJ3QgZGVmaW5lIGFueSBzeW1ib2xzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19tZW1vcnlfZGVmYXVsdCk6IENvcnJlY3QgcGFyZW50aGlzaXphdGlvbiBvZgotCWV4cHJlc3Npb24uCi0KLVdlZCBKYW4gMjEgMjE6MjA6MzIgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IERvbid0IGluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN5cy9zdGF0LmgKLQloZXJlOyB0aGV5IGFyZSBpbmNsdWRlZCBhbHJlYWR5IHZpYSBzeXNkZXAuaC4KLQotVHVlIEphbiAgNiAxMzo0MDowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pOTYwLnNjOiBEb24ndCBleHBsaWNpdGx5IHNldCAuZGF0YSBhbmQgLmJzcyBzdGFydC4KLQotRnJpIEphbiAgMiAyMDoxNTozNyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKGF0dHJpYnV0ZXNfb3B0KTogUGFzcyByZWdpb24gcG9pbnRlciB0bwotCWxhbmdfc2V0X2ZsYWdzLCBub3QgJnJlZ2lvbi0+ZmxhZ3MuCi0KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9kZWZhdWx0KTogTmV3IGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgYQotCWRlZmF1bHQgbWVtb3J5IHJlZ2lvbiBmb3IgYSBzZWN0aW9uIGlmIGl0IHdhcyBub3Qgc3BlY2lmaWVkLgotCShsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKTogWmVybyBmbGFncywgbm90X2ZsYWdzIGZpZWxkLgotCShsYW5nX21hcHssX2ZsYWdzfSk6IFByaW50IGF0dHJpYnV0ZSBmbGFncyBpbiBtZW1vcnkgbWFwLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBDYWxsIGxhbmdfbWVtb3J5X2RlZmF1bHQgdG8gZ2V0IGRlZmF1bHQKLQltZW1vcnkgcmVnaW9uLgotCShsYW5nX3NldF9mbGFncyk6IEltcGxlbWVudCBhdHRyaWJ1dGUgZmxhZ3MgZm9yIHJlYWwuICBUYWtlIG5ldwotCWFyZ3VtZW50IHRvIGdpdmUgdGhlIGZsYWdzIHdlIGFyZSB0byBza2lwIGZvciB0aGlzIHJlZ2lvbi4KLQotCSogbGRsYW5nLmggKG1lbW9yeV9yZWdpb25fc3RydWN0KTogQWRkIG5vdF9mbGFncyBmaWVsZCwgbWFrZSBib3RoCi0JZmxhZ3MgZmllbGRzIGZsYWd3b3JkIHR5cGUuCi0JKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGUpOiBNYWtlIGZsYWdzIGZpZWxkIGZsYWd3b3JkIHR5cGUuCi0JKGxhbmdfc2V0X2ZsYWdzKTogVXBkYXRlIHByb3RvdHlwZSB0byBtYXRjaCBuZXcgY2FsbGluZyBzZXF1ZW5jZS4KLQkobGFuZ19tZW1vcnlfcmVnaW9uX2RlZmF1bHQpOiBBZGQgcHJvdG90eXBlLgotCi0JKiBlbXVscGFyYW1zL2QzMHZ7X2UsX28sZWxmfS5zaCAoe1RFWFQsREFUQSxFTUVNfV9ERUZfU0VDVElPTik6Ci0JRGVmaW5lIHdoZXRoZXIgb3Igbm90IHRoZSByZWdpb24gZ2V0cyBkZWZhdWx0IHNlY3Rpb25zLCBhbmQgaWYgc28sCi0Jd2hhdCBzZWN0aW9ucy4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAoTUVNT1JZKTogU2V0IHVwIHdoaWNoIG9mIHRoZSByZWdpb25zIGdldAotCWRlZmF1bHQgc2VjdGlvbnMuCi0KLVRodSBKYW4gIDEgMjI6NTg6MDQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2MgKC5laF9mcmFtZSk6IExpbmsgaW50byB0aGUgZGF0YSBzZWN0aW9uLgotCi1UaHUgSmFuICAxIDE4OjA0OjUxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBGaXggdHlwby4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwcy5zYzogTGlrZXdpc2UuCi0KLVN1biBEZWMgMjEgMTI6NTE6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGV4cC5jIChmb2xkX25hbWUpOiBEb24ndCBjcmFzaCBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gYQotCXNlY3Rpb24gd2l0aCBubyBvdXRwdXQgc2VjdGlvbiwgc3VjaCBhcyBhIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24uCi0KLVdlZCBEZWMgMTcgMTI6MTQ6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEtlZXAgdHJhY2sgb2Ygd2hlcmUgd2UgYXJlIGluIHRoZSBvcHRpb24KLQlwYXJzaW5nIGJlZm9yZSBjYWxsaW5nIGxkZW11bF9wYXJzZV9hcmdzLCBzbyB0aGF0IHdlIGRvbid0IGNhbGwgaXQKLQltdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBhcmd1bWVudCBhbmQgY29uZnVzZSB0aGUgZ2V0b3B0Ci0JaW50ZXJuYWxzLgotCi1UaHUgRGVjIDExIDA5OjAwOjE1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChkMzB2LWVsZi0qKTogUmVuYW1lIGQzMHZlbGZfZSB0byBkMzB2X2UgYW5kCi0JZDMwdmVsZl9vIHRvIGQzMHZfbyB0byB3b3JrIGluIERPUyBlbnZpcm9ubWVudHMuCi0JKiBNYWtlZmlsZS57YW0saW59OiBEaXR0by4KLQotCSogZW11bHBhcmFtcy9kMzB2X3tvLGV9OiBSZW5hbWUgZnJvbSBkMzB2ZWxmX3tvLGV9LgotCSogZW11bHBhcmFtcy9kMzB2ZWxmX3tvLGV9OiBEZWxldGVkLgotCi1XZWQgRGVjIDEwIDE3OjQwOjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IEFkZCBnbHVlIHNlY3Rpb25zIChjb2RlIHRha2VuIGZyb20gQXJtCi0JYnJhbmNoKS4KLQotCSogZW11bHBhcmFtcy9hcm1jb2ZmLnNoIChURU1QTEFURV9OQU1FKTogU2V0IHRvIGFybWNvZmYuCi0KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBOZXcgZmlsZSwgaW1wb3J0ZWQgZnJvbSBBcm0gYnJhbmNoLgotCi1XZWQgRGVjIDEwIDE0OjEwOjQ0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBBZGQgLnJlbCBhbmQgLnJlbGEgc2VjdGlvbnMgZm9yIGFsbAotCWRlZmluZWQgc2VjdGlvbnMuICBTZXQgdXAgX197RCxDfVRPUl97TElTVCxFTkR9X18uICBBZGQgb25jaGlwIGFuZAotCWV4dGVybmFsIG1lbW9yeSBzZWN0aW9ucyBmb3Igcm9kYXRhLiAgRGVsZXRlIC5zdHJpbmcsIC5yb2RhdGExLAotCWFuZCAuZGF0YTEgc2VjdGlvbnMuCi0KLVR1ZSBEZWMgIDkgMTU6Mjg6MTcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgT2N0IDIzIGNoYW5nZXMgdG8gTWFrZWZpbGUuaW4gaGVyZS4KLQotCSogTWFrZWZpbGUue2FtLGlufTogKEFMTF9FTVVMQVRJT05TKTogQWRkIGVkMTB2ZWxmLm8uCi0KLQkqIE1ha2VmaWxlLnthbSxpbn06IChBTExfRU1VTEFUSU9OUyk6IEFkZCBldGljODBjb2ZmLm8uCi0KLQkqIE1ha2VmaWxlLnthbSxpbn06IChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZDMwdmVsZnssX2UsX299Lm8uCi0JKGVkMzB2ZWxmX2UuYyk6IExpa2UgZDMwdmVsZiwgZXhjZXB0IC50ZXh0Ly5kYXRhL2V0YyBhbHdheXMgZ28gaW4KLQlleHRlcm5hbCBtZW1vcnkuCi0JKGVkMzB2ZWxmX28uYyk6IExpa2UgZDMwdmVsZiwgZXhjZXB0IC50ZXh0Ly5kYXRhL2V0YyBhbHdheXMgZ28gaW4KLQlvbmNoaXAgbWVtb3J5LgotCi0JKiBlbXVscGFyYW1zL2QzMHZlbGYuc2ggKFNUQUNLX1NUQVJUX0FERFIpOiBUb3Agb2YgZGVmYXVsdAotCXN0YWNrLgotCSh7VEVYVCxEQVRBLEVNRU19X1NJWkUpOiBTaXplcyBvZiB0aGUgMyBtZW1vcnkgYXJlYXMuCi0JKHtURVhULERBVEEsQlNTfV9NRU1PUlkpOiBXaGljaCBtZW1vcnkgcmVnaW9uIC50ZXh0LCAuZGF0YSwgYW5kCi0JLmJzcyBzaG91bGQgZ28gaW4uCi0KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZl97ZSxvfS5zaDogTmV3IGZpbGVzIHRvIGJlIGV4cGxpY2l0IHdoZXRoZXIKLQkudGV4dCwgLmRhdGEsIGV0YyBnbyBpbiBleHRlcm5hbCBtZW1vcnkgb3Igb25jaGlwIG1lbW9yeS4KLQotCSogY29uZmlndXJlLnRndCAoZDMwdi0qLSpleHQqKTogTmV3IGNvbmZpZ3VyYXRpb24gdG8gZGVmYXVsdAotCS50ZXh0LCAuZGF0YSwgZXRjLiBpbiBleHRlcm5hbCBtZW1vcnkuCi0JKGQzMHYtKi0qb25jaGlwKik6IE5ldyBjb25maWd1cmF0aW9uIHRvIGRlZmF1bHQgLnRleHQsIC5kYXRhLAotCWV0Yy4gaW4gb25jaGlwIG1lbW9yeS4KLQkoZDMwdi0qLSopOiBBZGQgZDMwdmVsZl97ZSxvfSBlbXVsYXRpb25zLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBBbGxvdyAudGV4dCwgLmRhdGEsIC5ic3MgdG8gYmUgcHV0IGluCi0JZWl0aGVyIHRoZSBvbmNoaXAgdGV4dC9kYXRhIGFyZWFzIG9yIHRoZSBleHRlcm5hbCBtZW1vcnkgYXJlYS4KLQkoTUVNT1JZKTogR2V0IHNpemVzIGZyb20gZDMwdmVsZi5zaC4KLQkoLmV7ZGF0YSx0ZXh0LGJzc30pOiBQdXQgc2VjdGlvbnMgaW4gdGhlIGV4dGVybmFsIG1lbW9yeSByZWdpb24uCi0JKC5zdGV4dCk6IFB1dCBzZWN0aW9uIGluIHRoZSBvbmNoaXAgdGV4dCByZWdpb24uCi0JKC5ze2RhdGEsYnNzfSk6IFB1dCBzZWN0aW9ucyBpbiB0aGUgb25jaGlwIGRhdGEgcmVnaW9uLgotCShfX3N0YWNrKTogQXNzaWduIGZyb20gJHtTVEFDS19TVEFSVF9BRERSfS4KLQkoLnRleHQpOiBQdXQgaW4gJHtURVhUX01FTU9SWX0gbWVtb3J5IHJlZ2lvbi4KLQkoLmRhdGF7LDF9Ly5zdHJpbmdzLy5yb2RhdGF7LDF9KTogUHV0IGluICR7REFUQV9NRU1PUll9IG1lbW9yeQotCXJlZ2lvbi4KLQkoLmJzcyk6IFB1dCBpbiAke0JTU19NRU1PUll9IG1lbW9yeSByZWdpb24uCi0KLVR1ZSBEZWMgIDIgMTA6MTQ6NDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLVNhdCBOb3YgMjIgMTU6MjM6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sOiBEb24ndCBkZWZpbmUgaGV4X21vZGUuICBDb3JyZWN0IG51bWJlciByZWdleHAgdG8gbm90Ci0JYWNjZXB0IGhleCBkaWdpdHMgd2l0aG91dCBhIGxlYWRpbmcgJCBvciAweC4gIEhhbmRsZSBsZWFkaW5nICQKLQljb3JyZWN0bHkuICBQYXNzIDAgcmF0aGVyIHRoYW4gaGV4X21vZGUgdG8gYmZkX3NjYW5fdm1hLgotCSogbGRsZXguaCAoaGV4X21vZGUpOiBEb24ndCBkZWNsYXJlLgotCi1TdW4gTm92IDE2IDIwOjE2OjQ1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QzMHZlbGYuc2ggKHtEQVRBLEVNRU19X1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgc3RhcnQKLQlvZiBpbnRlcm5hbCBkYXRhIGFyZWEgYW5kIGV4dGVybmFsIG1lbW9yeSBvbiBjaGlwLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBEZWZpbmUgYSBNRU1PUlkgcmVnaW9uIHRoYXQgZGVzY3JpYmVzCi0JdGhlIDMgcmVnaW9ucyBvZiBtZW1vcnkgb24gdGhlIGNoaXAuICBQdXQgLnRleHQvLmluaXQvLmZpbmkgaW50bwotCXRoZSB0ZXh0IG1lbW9yeSByZWdpb24sIHB1dCBvdGhlciBzZWdtZW50cyBpbnRvIHRoZSBkYXRhIG1lbW9yeQotCXJlZ2lvbi4gIEFkZCBtb3JlIG9mIHRoZSBzdGFuZGFyZCBlbGYgc2VjdGlvbnMuICBEZWZhdWx0IF9fc3RhY2sKLQl0byBiZSAweDIwMDA4MDAwLCB3aGljaCBpcyAxIGJ5dGUgYmV5b25kIGVuZCBvZiB0aGUgaW50ZXJuYWwgZGF0YQotCXJlZ2lvbi4KLQotVGh1IE5vdiAxMyAxMzo0NTowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBNYWtlIEZyZWVCU0QgYSBpMzg2YnNkCi0gCXZhcmlhbnQuCi0KLVN1biBOb3YgIDIgMTQ6NTE6MzYgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlndXJlLmhvc3QgKGFscGhhKi0qLWxpbnV4Kik6IENvcnJlY3QgSE9TVElOR19DUlQwLiAgU2V0Ci0JSE9TVElOR19MSUJTLgotCi1UaHUgT2N0IDMwIDEyOjI1OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIHdhcm5fbWlzbWF0Y2ggZmllbGQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgd2Fybl9taXNtYXRjaCBmaWVsZC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0tbm8td2Fybi1taXNtYXRjaCBvcHRpb24uCi0JKiBsZGxhbmcuYyAoaWdub3JlX2JmZF9lcnJvcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxhbmdfY2hlY2spOiBJZiB3YXJuX21pc21hdGNoIGlzIGZhbHNlLCBkb24ndCB3YXJuIGFib3V0Ci0JbWlzbWF0Y2hlZCBpbnB1dCBmaWxlcy4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IG5ldyBvcHRpb24uCi0KLVRodSBPY3QgMjMgMTQ6Mzg6MTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogUmVuYW1lIGxpbmtlciBzeW1ib2wgJ19zdGFjaycgdG8gJ19fc3RhY2snCi0JdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggQyBjb2RlIHdoaWNoIGlzIGRlZmluaW5nIGEgdmFyaWFibGUgY2FsbGVkCi0JJ3N0YWNrJy4KLQotVGh1IE9jdCAyMyAwMDo1Nzo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogTW92ZSBlZWxmNjRfc3BhcmMubyAuLi4KLQkoQUxMXzY0X0VNVUxBVElPTlMpOiAuLi4gaGVyZS4KLQkoZWVsZjY0X3NwYXJjLmMpOiBUZW1wbGF0ZSBzaG91bGQgYmUgZWxmMzIgbm90IGdlbmVyaWMuCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChURU1QTEFURV9OQU1FKTogTmV3IGRlZmluaXRpb24uCi0KLVRodSBPY3QgMjMgMDA6NDQ6MjAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAZG90LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzcGFyYzY0LSotbGludXgqLgotCSogZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBULCBOT1ApOiBOZXcuCi0KLVdlZCBPY3QgMjIgMTE6Mjk6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogUHV0IC5laF9mcmFtZSBpbiAucmRhdGEuCi0KLUZyaSBPY3QgMTcgMDA6MDA6MTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlKTogT25seSBjaGVjayBnbG9iYWxzPD0+bG9jYWxzLAotCXNpbmNlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBleHBvcnQgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lCi0Jc3ltYm9sLgotCi1XZWQgT2N0IDE1IDE0OjUyOjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFB1dCAuc3RhYiBhbmQgLnN0YWJzdHIgc2VjdGlvbnMgYXQgZW5kLgotCi1XZWQgT2N0ICA4IDEyOjM3OjA1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QsIGNvbmZpZ3VyZS5ob3N0OiBDaGFuZ2UgYWxwaGEtKi0qIHRvIGFscGhhKi0qLSo7Ci0JY29uZmlnLmd1ZXNzIG5vdyByZWNvZ25pemVzIGFscGhhZXY1IGV0Yy4KLQotRnJpIE9jdCAgMyAxNDoyMzowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBEb24ndCB0cmVhdAotCS1zIGFuZCAtdSBhcyAtc3RhdGljIGFuZCAtdW5peC4KLQotVGh1IE9jdCAgMiAxODo0MDoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBSZXdyaXRlIGZsYWcgaGFuZGxpbmcgZm9yIGNsYXJpdHkuICBJZiB3ZQotIAlhcmUgbm90IGFkZGluZyB0aGUgZmlyc3QgaW5wdXQgc2VjdGlvbiwgYW5kIFNFQ19SRUFET05MWSBpcyBjbGVhcgotIAlvbiB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoZW4gZG9uJ3QgY29weSBpdCBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uLgotICAJSWYgU0VDX1JFQURPTkxZIGlzIG5vdCBzZXQgb24gdGhlIGlucHV0IHNlY3Rpb24sIHRoZW4gY2xlYXIgaXQgb24KLSAJdGhlIG91dHB1dCBzZWN0aW9uLgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi1zZ2ktaXJpeFs1Nl0qKTogVXNlIGVsZjMyYnNtaXAgcmF0aGVyIHRoYW4KLQllbGYzMmJtaXAuCi0JKG1pcHMqZWwtKi1saW51eCopOiBDaGFuZ2UgZWxmMzJsbWlwIHRvIGVsZjMybHNtaXAgYW5kIGVsZjMyYm1pcAotCXRvIGVsZjMyYnNtaXAuCi0JKG1pcHMqLSotbGludXgqKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyYnNtaXAuc2g6IE5ldyBmaWxlOyBqdXN0IGxpa2UgZWxmMzJibWlwLnNoLCBidXQKLQlzZXR0aW5nIEVOVFJZIHRvIF9fc3RhcnQuCi0JKiBlbXVscGFyYW1zL2VsZjMybHNtaXAuc2g6IE5ldyBmaWxlOyBqdXN0IGxpa2UgZWxmMzJsbWlwLnNoLCBidXQKLQlzZXR0aW5nIEVOVFJZIHRvIF9fc3RhcnQuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFsd2F5cyBzZXQgRU5UUlkgdG8gX3N0YXJ0IGlmIGl0IHdhcyBub3QKLQlhbHJlYWR5IHNldC4KLQotV2VkIE9jdCAgMSAxNjo0MTowMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3Y4NTAuc2ggKFJPWkRBVEFfU1RBUlRfQUREUiwgUk9TREFUQV9TVEFSVF9BRERSKTogTmV3Ci0JVmFyaWFibGVzLgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBNb3ZlIHJlYWQgb25seSBhcmVhcyBvdXQgb2YgemVybyBhbmQgc21hbGwKLQlkYXRhIHNlY3Rpb25zIGFuZCBpbnRvIHRoZWlyIG93biBzZWN0aW9ucy4KLQotV2VkIFNlcCAyNCAxNjo1OToxNSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS50Z3QgKHNoKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2Ugc2gtKi1lbGYqLgotCi1XZWQgU2VwIDI0IDExOjMzOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoU2VjdGlvbiBPcHRpb25zKTogSW1wcm92ZSBkb2N1bWVudGF0aW9uIG9mIE5PTE9BRAotCWRpcmVjdGl2ZS4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gU2VwIDIyIDE3OjI0OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IFJldmVydCBwYXRjaCBvZiBTZXB0ZW1iZXIgMy4KLQotV2VkIFNlcCAxNyAxNjo0NTozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSwgTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBldjg1MC5jCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHY4NTAgdGFyZ2V0LgotCi1XZWQgU2VwIDE3IDE2OjQzOjM5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvdjg1MC5zaCAoQ0FMTF9UQUJMRV9TVEFSVF9BRERSKTogTmV3IGVudHJ5LgotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogQWRkIGNhbGwgdGFibGUgZGF0YSBhcmVhCi0KLU1vbiBTZXAgMTUgMTE6Mjk6MTMgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBjaGFuZ2UgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogUHV0IC5yb2RhdGEgaW4gdGhlIC50ZXh0IHNlY3Rpb24uCi0KLVR1ZSBTZXAgIDkgMDc6NDk6NTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKTogUmVtb3ZlIGV4dHJhbmVvdXMKLQlpbml0aWFsaXphdGlvbiBvZiBwLgotCi1UaHUgU2VwICA0IDA5OjAzOjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEluCi0JZXhwcmVzc2lvbiBwcm9kdWNlZCBmb3IgLWJwVCBhbmQgLWJwRCBvcHRpb25zLCBhbGlnbiB0byBhIDMyIGJ5dGUKLQlib3VuZGFyeSByYXRoZXIgdGhhbiBhbiA4IGJ5dGUgYm91bmRhcnkuCi0JKiBzY3JpcHR0ZW1wbC9haXguc2M6IFB1dCAudG9jYnNzIGF0IHN0YXJ0IG9mIC5ic3Mgc2VjdGlvbi4KLQotCSogbGRtaXNjLmgsIGxkbWlzYy5jLCBsZGNyZWYuYzogUmVuYW1lIGZpbmZvIHRvIGxmaW5mbywgdG8gYXZvaWQKLQlmdW5jdGlvbiBuYW1lIGNvbmZsaWN0IHdpdGggQUlYIDQuMiB1bmlzdGQuaCBoZWFkZXIgZmlsZS4KLQotV2VkIFNlcCAgMyAxNToxMjozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBDbGVhciBTRUNfSEFTX0NPTlRFTlRTIGZyb20gYQotCW5vbG9hZF9zZWN0aW9uLgotCi1GcmkgQXVnIDI5IDAwOjMyOjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxkX25ld19ERVBFTkRFTkNJRVMpOiBSZW1vdmUgQExFWExJQkAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEF1ZyAyOCAxMDoxMjoxMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChhcmMtKi1lbGYqKTogUmVjb2duaXplLgotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhcmNlbGYuby4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogZW11bHBhcmFtcy9hcmNlbGYuc2g6IE5ldyBmaWxlLgotCi1XZWQgQXVnIDIwIDExOjE0OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRjYXJkcCk6IERvbid0IGxldCBhIGJhY2tzbGFzaCBieSBpdHNlbGYgY2F1c2UgYQotCXBhdHRlcm4gdG8gYmUgdHJlYXRlZCBhcyBhIHdpbGRjYXJkIHBhdHRlcm4uCi0KLQkqIGxkZ3JhbS55IChhdHlwZSk6IEFjY2VwdCBwYXJlbnRoZXNlcyB3aXRoIG5vIHR5cGUuCi0KLQkqIGxkLnRleGluZm8gKFNlY3Rpb24gRGVmaW5pdGlvbik6IENsYXJpZnkgdXNlIG9mIHdoaXRlc3BhY2UuCi0JKFNlY3Rpb24gUGxhY2VtZW50KTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMTggMTE6MTI6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMTE6MTI6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLVNhdCBBdWcgIDkgMDA6NDI6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGQuaW5mbyk6IENoYW5nZSBkZXBlbmRlbmN5IGZyb20KLQkkKEJGRERJUikvZG9jL2JmZHN1bW0udGV4aSB0byBiZmRzdW1tLnRleGkuCi0JKGxkLmR2aSk6IExpa2V3aXNlLgotCShiZmRzdW1tLnRleGkpOiBOZXcgdGFyZ2V0LgotCShDTEVBTkZJTEVTKTogQWRkIGJmZHN1bW0udGV4aS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUsIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlCi0Jc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFDX1BST0dfWUFDQywKLQlBQ19QUk9HX0xFWCwgYW5kIEFDX0RFQ0xfWVlURVhULiAgQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsCi0JQU1fQ1lHV0lOMzIsIGFuZCBBTV9FWEVFWFQuICBEb24ndCBjYWxsIENZX0NZR1dJTjMyIG9yIENZX0VYRUVYVC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBEb24ndCBzZXQgSExERkxBR1MsIEhMREVOViwgb3IgUlBBVEhfRU5WVkFSLgotCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFIGFuZCBWRVJTSU9OLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBsZHZlci5jIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBTZXQgbGRfcHJvZ3JhbV92ZXJzaW9uIGZyb20KLQlWRVJTSU9OLgotCSogbGRncmFtLnksIGxkbGV4Lmw6IFJlcGxhY2UgVkVSU0lPTiB3aXRoIFZFUlNJT05LLgotCSogTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVsIDI4IDE5OjA0OjUwIDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNybyB0byBsb29rIGZvcgotICAgICAgICB3aW4zMiBkZXBlbmRlbmNpZXMuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0gICAgICAgICogTWFrZWZpbGUuaW46IEFkZCAkKEVYRUVYVCkgdG8gZXhlY3V0YWJsZS4KLQotVHVlIEp1bCAyMiAxODo1MDozOCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGVtdWxwYXJhbXMvaTM4NmdvMzIuc2ggKE9VVFBVVF9GT1JNQVQpOiBTZXQgdG8gImNvZmYtZ28zMiIuCi0JKFNFR01FTlRfU0laRSk6IFNldCB0byAweDIwMC4KLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBSZXdyaXRlLgotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotbXNkb3NkamdwcCopOiBOZXcgdGFyZ2V0LgotCi1Nb24gSnVsICA3IDEyOjM5OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gTWFuZnJlZCBIb2xsc3RlaW4gPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+OgotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1Nl04Ni0qLWxpbnV4KmxpYmMxKik6IFJlbmFtZWQgZnJvbQotCWlbMzQ1Nl04Ni0qLWxpbnV4Ki4KLQkoaVszNDU2XTg2LSotbGludXgqKTogTmV3IGhvc3QuCi0KLVRodSBKdW4gMjYgMTM6NTQ6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogUHV0IC5yc3JjIGFmdGVyIC5yZWxvYy4gIFB1dCBpbnB1dCAucnNyYwotCXNlY3Rpb25zIGluIHRoZSBvdXRwdXQgLnJzcmMgc2VjdGlvbi4KLQotV2VkIEp1biAyNSAxMjo0ODo0MSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmhvc3QgKG02OCotKi1saW51eCpsaWJjMSopOiBSZW5hbWVkIGZyb20KLQlgbTY4Ki0qLWxpbnV4KicuCi0JKG02OCotKi1saW51eCopOiBOZXcgY29uZmlndXJhdGlvbiBmb3IgdXNlIHdpdGggR05VIGxpYmMgMi4KLQotTW9uIEp1biAxNiAxOToxODoyMSAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IENvcnJlY3QgLnJlbGEuc2RhdGEgZW50cmllcy4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBQdXQgdGhlIFBMVCBiZXR3ZWVuIHRoZSBzbWFsbCBhbmQgbGFyZ2UKLQlCU1Mgc2VnbWVudHMuCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChURVhUX1NUQVJUX0FERFIpOiBUaGUgQUJJIHNheXMgYEEKLQlwcm9ncmFtIGJhc2Ugb2YgMHgwMjAwMDAwMCBpcyByZWNvbW1lbmRlZC4uLicgYmVjYXVzZSBvdGhlcndpc2UKLQlzaGFyZWQgbGlicmFyaWVzIGFyZSBsZXNzIGVmZmljaWVudC4gIFdlIHVzZSAweDAxODAwMDAwIGJlY2F1c2UKLQlvdGhlcndpc2UgaXQncyBpbXBvc3NpYmxlIHRvIGJyYW5jaCB0byBsb2NhdGlvbiAwLCBmb3IgaW5zdGFuY2UgaWYKLQl5b3UgaGF2ZSBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0KLU1vbiBKdW4gMTYgMTI6NDk6MzYgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbGRsYW5nLmMgKGxhbmdfcGxhY2VfdW5kZWZpbmVkcyk6IEFkZCBcbiBpbiBlaW5mbyBjYWxsLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGxkbGV4Lmw6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKToKLQlMaWtld2lzZS4KLQkoY2hlY2tfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlMaWtld2lzZS4KLQkqIG1wdy1lcHBjbWFjLmMgKGdsZHBwY21hY29zX3JlYWRfZmlsZSk6IExpa2V3aXNlLgotCSogbXB3LWlkdG1pcHMuYyAoZ2xkbWlwc2lkdF9hZnRlcl9vcGVuKTogTGlrZXdpc2UuCi0JKGNoZWNrX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGdsZG1pcHNpZHRfYWZ0ZXJfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX2Nob29zZV9tb2RlKTogUmVtb3ZlIHVudXNlZCBlaW5mbyBhcmd1bWVudC4KLQotRnJpIEp1biAgNiAyMzo0Nzo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBBZGQgemVyb2VzIGFmdGVyIC5pZGF0YSQzIHRvIG1hcmsgdGhlIGVuZCBvZgotCXRoZSBpbXBvcnQgbGlzdC4KLQotVGh1IE1heSAyOSAxMzoxMzoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IERvbid0Ci0JY3Jhc2ggaWYgYW4gb3V0cHV0IHNlY3Rpb24gaGFzIG5vIEJGRCBzZWN0aW9uLgotCi1GcmkgTWF5IDIzIDE1OjIzOjI1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IEFkZCBlbnRyeSBmb3IgdGhlIG5ldyAidGFzay1saW5rIiBvcHRpb24uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgdGhlICJ0YXNrLWxpbmsiIG9wdGlvbi4KLQkoT1BUSU9OX1RBU0tfTElOSyk6IEFkZCBkZWZpbmUuCi0KLVdlZCBNYXkgMjEgMTc6NDQ6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IENvcnJlY3QgY2hlY2sgb2YgZmNsb3NlIHJldHVybiB2YWx1ZSB3aGVuCi0JaGFuZGxpbmcgLS1mb3JjZS1leGUtc3VmZml4LgotCi1UaHUgTWF5IDE1IDExOjM1OjI5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogQWRkIHRlc3Qgb2YgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZQotCWNhbGwgdG8gYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoKS4KLQotTW9uIE1heSAxMiAyMzoyMjo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFJlbW92ZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogU2V0IEVOVFJZIGJhc2VkIG9uIHRhcmdldC4gIFBlcm1pdAotCVRFWFRfRFlOQU1JQyB0byBjb250cm9sIC5keW5hbWljIHNlZ21lbnQuICBQZXJtaXQKLQlTSExJQl9URVhUX1NUQVJUX0FERFIgdG8gc2V0IHN0YXJ0IG9mIHNoYXJlZCBvYmplY3QuICBTdXBwb3J0Ci0JSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUy4gIFB1dCAuc3R1YiBpbiAudGV4dC4gIE9ubHkgcHV0Ci0JLmdudS5saW5rb25jZS50KiBpbiAudGV4dCB3aGVuIHJlbG9jYXRpbmcuICBTdXBwb3J0Ci0JT1RIRVJfVEVYVF9TRUNUSU9OUy4gIFN1cHBvcnQgU0hMSUJfREFUQV9BRERSIGFzIHdlbGwgYXMKLQlEQVRBX0FERFIuICBTdXBwb3J0IE9USEVSX0dPVF9TWU1CT0xTIGFuZCBPVEhFUl9HT1RfU0VDVElPTlMuCi0JKiBlbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggKFNDUklQVF9OQU1FKTogU2V0IHRvIGVsZi4KLQkoREFUQV9BRERSKTogRG9uJ3Qgc2V0LgotCShJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TKTogUmVuYW1lIGZyb20gT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMuCi0JKE9USEVSX1RFWFRfU0VDVElPTlMpOiBTZXQuCi0JKE9USEVSX0dPVF9TRUNUSU9OUyk6IFJlbmFtZSBmcm9tIE9USEVSX1JFQURXUklURV9TRUNUSU9OUy4KLQkoTUFDSElORSk6IFNldCB0byBlbXB0eSBzdHJpbmcuCi0JKiBlbXVscGFyYW1zL2VsZjMybDQzMDAuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaDogTGlrZXdpc2UuICBBbHNvOgotCShURVhUX0RZTkFNSUMpOiBTZXQuCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcHMuc2g6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKGVlbGYzMmJtaXBzLmMpOiBEZXBlbmQgdXBvbiBlbGYuc2MgcmF0aGVyIHRoYW4KLQllbGZtaXBzLnNjLgotCShlZWxmMzJlYm1pcHMuYywgZWVsZjMyZWxtaXBzLmMsIGVlbGYzMmxtaXAuYyk6IExpa2V3aXNlLgotCi1Nb24gTWF5IDEyIDExOjExOjA2IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IERvbid0IGFsaWduIHRoZSBkYXRhIHNlZ21lbnQgb24gdGhlIG5leHQgOAotCWJ5dGUgYm91bmRhcnksIGluc3RlYWQgbGV0IHRoZSBsaW5rZXIgdXNlIHdoYXRldmVyIHRoZSBpbmRpdmlkdWFsCi0Jc2VjdGlvbnMgcmVxdWlyZS4KLQotRnJpIE1heSAgOSAxNzo0NTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLWdudSopOiBEb24ndCBpbmNsdWRlIE1hY2ggc3VwcG9ydC4KLQotVHVlIE1heSAgNiAxMzoyMToxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFNlYW4gTWNOZWlsIDxzZWFuQG1jbmVpbC5jb20+OgotCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X2J5X2ZpbGVfbmFtZSk6IFNvcnQgYnkgYXJjaGl2ZSBuYW1lCi0JZmlyc3QuCi0JKHNvcnRfc2VjdGlvbnMpOiBTb3J0IGFsbCBzZWN0aW9ucywgbm90IGp1c3Qgc2VjdGlvbnMgaW4gdGhlIHNhbWUKLQlhcmNoaXZlLgotCi1Nb24gTWF5ICA1IDE4OjE5OjU1IDE5OTcgIFBoaWxpcCBCbHVuZGVsbCAgPHBqYjI3QGNhbS5hYy51az4KLQotCSogY29uZmlndXJlLnRndCwgY29uZmlndXJlLmhvc3Q6IGNvcGUgd2l0aCAnKi0qLWxpbnV4LWdudWFvdXQnCi0JdGFyZ2V0cy4KLQotRnJpIE1heSAgMiAxNTo1NDoyOCAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjICgudGV4dCk6IEFkZCBhIGxlYWRpbmcgdW5kZXJzY29yZSB0bwotCV9fe0QsQ31UT1Jfe0xJU1QsRU5EfV9fIGRlZmluYXRpb25zLiAgUmVhcnJhbmdlIHRoZSBvcmRlciBvZiBpdGVtcwotCWluIHRoZSAudGV4dCBzZWN0aW9uLiAgTW92ZSAuY29uc3QsIC5jdG9ycywgLmR0b3JzIGludG8gc2VwYXJhdGUKLQlzZWN0aW9ucy4KLQotV2VkIEFwciAzMCAxMjoyMzoyMSAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2MgKF9fLmluaXRwLmVuZCwgX2V0ZXh0KTogQWRkZWQgd2hpdGVzcGFjZQotCWFyb3VuZCBhc3NpZ25tZW50IG9mIGN1cnJlbnQgbG9jYXRpb24gcG9pbnRlci4KLQotVGh1IEFwciAxNyAxMzowNzoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IE1ha2Ugc3VyZSB0aGUgc2V0IGlzIGFsaWduZWQKLQlhcHByb3ByaWF0ZWx5LgotCi1UdWUgQXByIDE1IDEzOjE5OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1hGT1JNLCBJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGxkLm5ldyBhbmQgaW5zdGFsbGRpcnMuICBVc2UKLQkkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZwotCSQoSU5TVEFMTF9YRk9STSkgYW5kICQoSU5TVEFMTF9YRk9STTEpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwtaW5mbyk6IFJ1biBta2luc3RhbGxkaXJzLgotCi1Nb24gQXByIDE0IDEyOjA2OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAgNCAxMTo0Mjo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShzb3J0X3NlY3Rpb25zXzEpOiBVc2UgeG1hbGxvYyByYXRoZXIgdGhhbiBhbGxvY2EuCi0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBTUVVBRC4KLQkqIGxkZ3JhbS55IChsZW5ndGgpOiBBZGQgU1FVQUQuCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBVc2UgU1FVQUQgZm9yIGEgc2lnbmVkIDggYnl0ZQotCXJlbG9jLgotCSogbGRsYW5nLmMgKHByaW50X2RhdGFfc3RhdGVtZW50KTogSGFuZGxlIFNRVUFELgotCShsYW5nX3NpemVfc2VjdGlvbnMsIGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZS4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90b2tlbik6IEFkZCBTUVVBRCB0byB0YWJsZS4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IEhhbmRsZSBTUVVBRC4KLQkqIGxkLnRleGluZm8gKFNlY3Rpb24gRGF0YSBFeHByZXNzaW9ucyk6IERvY3VtZW50IFNRVUFELgotCi1UaHUgQXByICAzIDEzOjE5OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGR2ZXIuYyAobGRfcHJvZ3JhbV92ZXJzaW9uKTogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVdlZCBBcHIgIDIgMTE6NTU6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtcHctaWR0bWlwcy5jOiBSZW5hbWUgZnJvbSBtcHctZW1pcHNpZHQuYy4KLQkqIG1wdy1lbGZtaXBzLmM6IFJlbmFtZSBmcm9tIG1wdy1lbWlwc2VsZi5jLgotCSogbXB3LWNvbmZpZy5pbjogVXBkYXRlIGFjY29yZGluZ2x5LgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQ2FsbCBsYW5nX2NoZWNrIGltbWVkaWF0ZWx5IGFmdGVyCi0Jb3BlbmluZyB0aGUgaW5wdXQgZmlsZXMsIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmsuCi0KLU1vbiBNYXIgMzEgMjM6NDQ6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGluaXQpOiBGdWxseSBicmFja2V0IGluaXRpYWxpemVyLgotCShzZXRfcGVfc3RhY2tfaGVhcCk6IFJlbW92ZSBsb2NhbHMgYmVnaW5fY29tbWl0IGFuZCBlbmQuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBpLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHB0ci4KLQotTW9uIE1hciAzMSAxNjozNTo1MSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS50Z3QgKGhwcGEqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBocHBhLSotKmVsZiouCi0KLUZyaSBNYXIgMjggMTU6Mjk6MjMgMTk5NyAgSC5KLiBMdSA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JQ29udHJpYnV0ZWQgYnkgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1PjoKLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjKi0qLWxpbnV4YW91dCopOiBOZXcgdGFyZ2V0LgotCShzcGFyYyotKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlc3BhcmNsaW51eC5vLgotCShlc3BhcmNsaW51eC5jKTogTmV3IHRhcmdldC4KLQotRnJpIE1hciAyOCAxNDozMDoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT46Ci0JKiBjb25maWd1cmUudGd0OiBTZXQgdGFyZ19leHRyYV9lbXVscyBmb3IgbWlwcyplbC0qLWxpbnV4KiBhbmQKLQltaXBzKi0qLWxpbnV4Ki4gIFVzZSBlbGYzMmJtaXAgYW5kIGVsZjMybG1pcCwgbm90IGVsZjMyZWJtaXAgYW5kCi0JZWxmMzJlbG1pcC4KLQotVGh1IE1hciAyNyAxNzoxNDozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVXBkYXRlIGNvcHlyaWdodCBkYXRlIGluIHZlcnNpb24KLQltZXNzYWdlLgotCi1GcmkgTWFyIDIxIDEyOjI4OjQxIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGVtdWxwYXJhbXMvZGVsdGE2OC5zaCAoT1VUUFVUX0ZPUk1BVCk6IFNldCB0byAiY29mZi1tNjhrLXN5c3YiLgotCi1UdWUgTWFyIDE4IDExOjE2OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBJbmNsdWRlICJvYnN0YWNrLmgiLgotCi1Nb24gTWFyIDE3IDE5OjI2OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmM6IEluY2x1ZGUgIm9ic3RhY2suaCIuCi0KLVNhdCBNYXIgMTUgMjM6MjM6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMtKi1iZW9zKik6IFVzZSBhaXhwcGMgZm9yIHRhcmdfZW11bC4KLQotU2F0IE1hciAxNSAxODoxMDozOCAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogbGRlbXVsLmggKGxkZW11bF9saXN0X2VtdWxhdGlvbnMpOiBVc2UgZnVsbCBwcm90b3R5cGUuCi0JKiBsZGxhbmcuYyAocHJpbnRfb25lX3N5bWJvbCk6IEFkZCBkZWNsYXJhdGlvbi4KLQkqIGxkbGFuZy5oIChkcHJpbnRfc3RhdGVtZW50cyk6IERlY2xhcmUuCi0JKiBsZG1haW4uYyAocmVtb3ZlX291dHB1dCk6IERlY2xhcmUuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRGVjbGFyZS4KLQkqIGxkd3JpdGUuYyAoY2xvbmVfc2VjdGlvbik6IERlY2xhcmUuCi0JKHNwbGl0X3NlY3Rpb25zKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlLgotCSogbXJpLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHN0cmR1cCk6IERvbid0IGRlY2xhcmUuCi0JKG1yaV9hbGlhcyk6IFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQotRnJpIE1hciAxNCAyMTozMDowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IENoYW5nZSBoYW5kbGluZyBvZiBkYXRhIGFyZWEgd2hlbgotCWdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB0byBub3Qgc2tpcCBhIGxhcmdlIGJsb2NrIG9mIG1lbW9yeS4KLQlGcm9tIFBlciBGb2dlbHN0cm9tIDxwZWZvQGN2cy5vcGVuYnNkLm9yZz4uCi0KLVdlZCBNYXIgMTIgMjE6MzM6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobXVsdGlwbGVfZGVmaW5pdGlvbik6IE9ubHkgc2tpcCB0aGUgd2FybmluZyBpZiB0aGUKLQlvdXRwdXQgc2VjdGlvbiBpcyBhYnNvbHV0ZSB3aGVuIHRoZSBpbnB1dCBzZWN0aW9uIGlzIG5vdAotCWFic29sdXRlLgotCi0JKiBsZGxleC5sOiBBY2NlcHQgd2hpdGVzcGFjZSBpbiBWRVJTX1NUQVJUIHN0YXRlLiAgV2FybiBhYm91dAotCWludmFsaWQgY2hhcmFjdGVycyBpbiBWRVJTXyogc3RhdGVzLgotCi1UdWUgTWFyIDExIDEzOjUxOjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogRG9uJ3QgbGV0IGEKLQl0cmFpbGluZyBzcGFjZSBsZWFkIHVzIHRvIHRoaW5rIHRoYXQgdGhlcmUgaXMgYSB6ZXJvIGFkZHJlc3MuCi0KLVN1biBNYXIgIDkgMjM6MDY6MzUgMTk5NyAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFuZGFudGUuamljLmNvbT4KLQotCSogbGRncmFtLnkgKHZlcnNfbm9kZSk6IENvcnJlY3QgdHlwbyBvZiAnKCcgIGZvciAneycuCi0KLUZyaSBNYXIgIDcgMTg6NDA6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAoRU5UUlkpOiBFbnRyeSBzeW1ib2wgaXMgX19zdGFydAotCXJhdGhlciB0aGFuIF9zdGFydC4KLQkoX19lZGF0YSk6IERlZmluZSB0aGlzIHJhdGhlciB0aGFuICJlZGF0YSIuCi0JKF9fZW5kKTogRGVmaW5lIHRoaXMgcmF0aGVyIHRoYW4gImVuZCIuCi0KLVR1ZSBNYXIgIDQgMTc6MTg6MzUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRpYzgwLSotKik6IEFsbG93IGRyb3BwaW5nIG9mIC1jb2ZmLgotCi1TdW4gTWFyICAyIDIyOjU5OjQ5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobGQuZHZpKTogU2V0IE1BS0VJTkZPIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHdlbGwKLQlhcyBURVhJTlBVVFMuICBOZWVkZWQgZm9yIGJ1aWxkaW5nIGluIHNlcGFyYXRlIGJ1aWxkIGRpci4KLQkqIGxkaW50LnRleGluZm8gKFNDUklQVF9OQU1FKTogRml4IHR5cG8uCi0JKiBlbXVscGFyYW1zL3RpYzgwY29mZi5zaDogUmV3cml0ZSB0byBpbmNsdWRlIGludGVybmFsIGRvY3VtZW50YXRpb24KLQlhYm91dCBlYWNoIHNoZWxsIHZhcmlhYmxlIHRoYXQgaXMgc2V0IChvciBub3Qgc2V0KS4KLQkqIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYzogQ29tcGxldGUgcmV3cml0ZS4KLQotRnJpIEZlYiAyOCAxNzo0MjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKGxkbWFpbi5vKTogRGVmaW5lIFRBUkdFVCB3aGVuIGNvbXBpbGluZy4KLQotVGh1IEZlYiAyNyAxMTo0MTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3QgaW5pdGlhbGl6ZSBsaW5rX2luZm8ubHByZWZpeCBvcgotCWxpbmtfaW5mby5scHJlZml4X2xlbi4KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtIChocHBhZWxmX2JlZm9yZV9wYXJzZSk6IExpa2V3aXNlLgotCi0JKiBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogUmVtb3ZlLgotCSogZW11bHBhcmFtcy9tODhrYmNzLnNoIChURU1QTEFURV9OQU1FKTogRG9uJ3Qgc2V0LgotCSogTWFrZWZpbGUuaW4gKGVtODhrYmNzLmMpOiBEZXBlbmQgdXBvbiBnZW5lcmljLmVtIHJhdGhlciB0aGFuCi0JbTg4a2Jjcy5lbS4KLQotCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiBQYXNzIG5vbG9hZF9zZWN0aW9uLCBub3QgU0VDX05FVkVSX0xPQUQsCi0JdG8gbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuICBGcm9tIE1hcmsgUmFzaW4KLQk8bWFyay5yYXNpbkB0ZWxyYWQuY28uaWw+LgotCi1XZWQgRmViIDI2IDExOjUxOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IENsZWFyIFNFQ19JU19DT01NT04gZnJvbSBjb21tb24KLQlzZWN0aW9uLgotCi1UdWUgRmViIDI1IDIwOjM4OjExIDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotKi1sbmV3cyopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKGVtaXBzbG5ld3MuYyk6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL21pcHNsbmV3cy5zaDogTmV3IGZpbGUuCi0KLVR1ZSBGZWIgMjUgMTY6MDQ6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGhvbGRfaW50ZXJwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUHV0IGxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zCi0JYWZ0ZXIgaG9sZF9pbnRlcnAuICBDaG9vc2UgYSB1bmlxdWUgb3V0cHV0IHNlY3Rpb24gbmFtZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IERvbid0IHNldCBob2xkX3VzZSBpZiB0aGUKLQlTRUNfTE9BRCBvciBTRUNfQUxMT0MgZmxhZ3MgZGlmZmVyLiAgU2V0IGhvbGRfaW50ZXJwLgotCi1Nb24gRmViIDI0IDE4OjE2OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGxkbGV4LmwgKFZfVEFHLCBWX0lERU5USUZJRVIpOiBOZXcgbWFjcm9zLgotCShWRVJTX1NUQVJULCBWRVJTX1NDUklQVCwgVkVSU19OT0RFKTogTmV3IHN0YXRlcyB0byBwYXJzZSB2ZXJzaW9uCi0JaW5mb3JtYXRpb24uCi0JKGxkbGV4X3ZlcnNpb25fc2NyaXB0LCBsZGxleF92ZXJzaW9uX2ZpbGUpOiBOZXcgZnVuY3Rpb25zLgotCSogbGRsZXguaCAoZW51bSBpbnB1dF9lbnVtKTogQWRkIGlucHV0X3ZlcnNpb25fc2NyaXB0LgotCShsZGxleF92ZXJzaW9uX3NjcmlwdCk6IERlY2xhcmUuCi0JKGxkbGV4X3ZlcnNpb25fZmlsZSk6IERlY2xhcmUuCi0JKiBsZGdyYW0ueSAoJXVuaW9uKTogQWRkIGRlZmxpc3QsIHZlcnN5bXMsIGFuZCB2ZXJzbm9kZS4KLQkoVkVSU19UQUcsIFZFUlNfSURFTlRJRklFUik6IE5ldyB0ZXJtaW5hbHMuCi0JKEdMT0JBTCwgTE9DQUwsIFZFUlNJT04sIElOUFVUX1ZFUlNJT05fU0NSSVBUKTogTmV3IHRlcm1pbmFscy4KLQkoZmlsZSk6IEFjY2VwdCBJTlBVVF9WRVJTSU9OX1NDUklQVC4KLQkoaWZpbGVfcDEpOiBBY2NlcHQgdmVyc2lvbi4KLQkodmVyc2lvbl9zY3JpcHRfZmlsZSk6IE5ldyBub250ZXJtaW5hbC4KLQkodmVyc2lvbiwgdmVyc19ub2RlcywgdmVyc19ub2RlKTogTGlrZXdpc2UuCi0JKHZlcmRlcCwgdmVyc190YWcsIHZlcl9kZWZucyk6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKGxhbmdfZWxmX3ZlcnNpb25faW5mbyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGxhbmdfbmV3X3ZlcnNfcmVnZXgpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfbmV3X3ZlcnNfbm9kZSk6IE5ldyBmdW5jdGlvbi4KLQkodmVyc2lvbl9pbmRleCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX2FkZF92ZXJzX2RlcGVuZCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5oIChsYW5nX2VsZl92ZXJzaW9uX2luZm8pOiBEZWNsYXJlLgotCShsYW5nX25ld192ZXJzX3JlZ2V4LCBsYW5nX25ld192ZXJzX25vZGUpOiBEZWNsYXJlLgotCShsYW5nX2FkZF92ZXJzX2RlcGVuZCwgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUpOiBEZWNsYXJlLgotCSogbGV4c3VwLmMgKE9QVElPTl9WRVJTSU9OX1NDUklQVCk6IERlZmluZS4KLQkobGRfb3B0aW9ucyk6IEFkZCAidmVyc2lvbi1zY3JpcHQiLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIE9QVElPTl9WRVJTSU9OX1NDUklQVC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVBhc3MgbGFuZ19lbGZfdmVyc2lvbl9pbmZvIHRvIHNpemVfZHluYW1pY19zZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIC5nbnUudmVyc2lvbiBzZWN0aW9ucy4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHN5bWJvbCB2ZXJzaW9uaW5nLgotCi1GcmkgRmViIDIxIDE3OjM3OjUxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZWQzMHZlbGYuYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0IChkMzB2LSotKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL2QzMHZlbGYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTmV3IGZpbGUuCi0KLUZyaSBGZWIgMTQgMTg6Mjg6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb24gQ29tbWFuZHMpOiBEb2N1bWVudCB0aGUgSU5DTFVERSBjb21tYW5kLgotCi1UaHUgRmViIDEzIDIwOjMxOjM3IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfTkVFRF9ERUNMQVJBVElPTiBvbiBnZXRlbnYuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVik6IE5ldyBtYWNyby4KLQkqIHN5c2RlcC5oIChnZXRlbnYpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogbGRlbXVsLmMgKGxkX2VtdWxfZGVmYXVsdF90YXJnZXQpOiBEbyBub3QgY2FzdCBnZXRlbnYgcmV0dXJuCi0JdmFsdWUuCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVR1ZSBGZWIgMTEgMTU6MzQ6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBXaGVuIHJlbG9jYXRpbmcsIHB1dCAubWlwczE2LmZuLiogYW5kCi0JLm1pcHMxNi5jYWxsLiogaW4gLnRleHQuCi0KLVN1biBGZWIgIDkgMTg6MDk6MTMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvdGljODBjb2ZmLnNoOiBOZXcgKGR1bW15KSBmaWxlIGZvciBUSWM4MC4KLQkqIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYzogTmV3IChkdW1teSkgZmlsZSBmb3IgVEljODAuCi0JKiBNYWtlZmlsZS5pbiAoZXRpYzgwY29mZi5jKTogQWRkIHRhcmdldCBhbmQgcnVsZSB0byBidWlsZCBpdC4KLQkqIGNvbmZpZ3VyZS50Z3QgKHRpYzgwLSotY29mZik6IFNldCB0YXJnX2VtdWwgdG8gdGljODBjb2ZmLgotCi1GcmkgSmFuIDMxIDEzOjE2OjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogU2VhcmNoIGZvcgotCSIuc28iIGluIHRoZSBuYW1lLCBub3QgIi5zby4iLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyKTogQWNjZXB0IGEgcGxhaW4gLnNvIGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluIChsZC5pbmZvKTogQWRkIC1JJChzcmNkaXIpLiAgRnJvbSBBbGFuIE1vZHJhCi0JPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1Pi4KLQotVGh1IEphbiAzMCAxMTozMTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTa2lwIHRoZSBkaXJlY3RvcnkgbmFtZSB3aGVuCi0Jc2VhcmNoaW5nIGZvciAiLnNvLiIuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBNYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyeSBuYW1lCi0JaGFzIGEgdmVyc2lvbiBudW1iZXIsIGFuZCB0aGF0IG9ubHkgdmVyc2lvbiBudW1iZXJzIGZvbGxvdyAuc28uCi0KLVdlZCBKYW4gMjkgMTg6MTU6MDAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6Ci0JKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYzogYWRkICooLmdjY19leGNlcHRfdGFibGUpIHRvIHRoZSB0ZXh0Ci0Jc2VjdGlvbiBzbyBXaW4zMiBleGVjdXRhYmxlcyBhcmUgdmFsaWQuCi0KLU1vbiBKYW4gMjcgMTI6Mjg6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFB1dCBsaW5rb25jZSByZWxvYyBzZWN0aW9uIGluIG90aGVyCi0gCWFwcHJvcHJpYXRlIHJlbG9jIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogQWRkIGxpbmtvbmNlIHN1cHBvcnQuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotCi1GcmkgSmFuIDI0IDEwOjQ0OjA5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL21uMTAyMDAuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBNb3ZlIHRoZQotCXN0YWNrIHVwIHRvIDB4ODAwMDAuCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IExpa2V3aXNlLgotCi1UdWUgSmFuIDIxIDEyOjExOjEwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBVc2UgUFJPVklERQotCXRvIGRlZmluZSBgX3N0YWNrJy4KLQotVGh1IEphbiAxNiAxNzowNzo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IFJlbmFtZSBhdXhpbGlhcnlfZmlsdGVyX3NobGliIHRvCi0JYXV4aWxpYXJ5X2ZpbHRlcnMsIGFuZCBtYWtlIGl0IGNoYXIgKiouCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtZiBieSBzZXR0aW5nIHVwIGFuIGFycmF5LgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFVzZQotCW5ldyBuYW1lIG9mIGF1eGlsaWFyeV9maWx0ZXJzLgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogSW1wcm92ZSBkb2N1bWVudGF0aW9uIG9mIC0tZmlsdGVyIGFuZAotCS0tYXV4aWxpYXJ5LgotCi1UdWUgSmFuIDE0IDE1OjQ0OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IENsYXJpZnkgdGhhdCB0aGUgbm9ybWFsIHVzYWdlIGlzIC1ULgotCShDb21tYW5kcyk6IExpa2V3aXNlLgotCi1UaHUgSmFuICA5IDExOjI2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogQ29ycmVjdCBtYXNrIHVzZWQgZm9yIC5kYXRhIGFkZHJlc3MuCi0KLVdlZCBKYW4gIDggMTU6MTQ6NTkgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBtYWtlIGRlZmF1bHQgZXhlY3V0YWJsZSBhLmV4ZSBpbnN0ZWFkIG9mCi0JYS5vdXQKLQotRnJpIEphbiAgMyAxNzozMzozNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNb3ZlIC5nb3QgY2xvc2VyIHRvIC5zZGF0YSBhbmQgLnNic3MgYnkKLQlzaGlmdGluZyAucGx0IGJhY2suICBSdW1vdXIgaGFzIGl0IHRoYXQgdGhlIE5ldEJTRCBsZC5zbyBkZXBlbmRzCi0Jb24gLmR5bmFtaWMgYmVpbmcgYWZ0ZXIgLmdvdCwgc28gd2UgbGVhdmUgdGhhdC4KLQotRnJpIEphbiAgMyAxNDowNDo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IERvbid0IHJlbW92ZSBjb25maWdkb2MudGV4aS4KLSAJKG1haW50YWluZXItY2xlYW4pOiBEbyByZW1vdmUgY29uZmlnZG9jLnRleGkuCi0KLQkqIGxkLnRleGluZm8gKE9wZXJhdG9ycyk6IFJlbW92ZSAnQCcgZnJvbSBAc21hbGxleG1wbGUgaW4gY29tbWVudAotCXRvIGF2b2lkIGNvbmZ1c2luZyB0ZXhpMnJvZmYuCi0KLUZyaSBKYW4gIDMgMTE6Mjc6MDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjICguemRhdGEpOiBBZGQgLnpjb21tb24gc2VjdGlvbi4KLQkoLnRkYXRhKTogQWRkIC50Y29tbW9uIGFuZCAudGNvbW1vbl9ieXRlIHNlY3Rpb25zLgotCi1UaHUgSmFuICAyIDE4OjE0OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyplbC0qLWxpbnV4KiwgbWlwcyotKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFVzZSBfX3N0YXJ0IGFzIHRoZSBlbnRyeSBhZGRyZXNzIGZvcgotCW1pcHMqLSotbGludXgqLgotCi1UdWUgRGVjIDMxIDE0OjQ4OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpbHRlcl9zaGxpYiBhbmQgYXV4aWxpYXJ5X2ZpbHRlcl9zaGxpYgotCWZpZWxkcy4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC0tYXV4aWxpYXJ5Ly1mIGFuZAotCS0tZmlsdGVyLy1GLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBmaWx0ZXJfc2hsaWIgYW5kIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIgdG8KLQlzaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLWZpbHRlci8tRiBhbmQgLS1hdXhpbGlhcnkvLWYuCi0KLU1vbiBEZWMgMzAgMTM6NTU6NTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjICgudGRhdGEpIEFkZCAudGJzcyBhbmQgLnRieXRlIHNlY3Rpb25zLgotCi1XZWQgRGVjIDE4IDIyOjU3OjM1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVc2UgTmV3Rm9sZGVyUmVjdXJzaXZlIGZvciBpbnN0YWxsYXRpb24uCi0KLUZyaSBEZWMgMTMgMTQ6MDg6NTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBNYWtlIHN1cmUgX197ZSxnfXAgc3RhcnQgcmVsYXRpdmUgdG8gdGhlCi0Je3MsdH1kYXRhIHNlY3Rpb25zLiAgRG8gbm90IGVtaXQgYW55IGxpbmtlciBnZW5lcmF0ZWQgc3ltYm9scyBpZgotCS1yLiAgVXNlIHtURVhULHtaLFMsVH1EQVRBfV9TVEFSVF9BRERSIHZhcmlhYmxlcyB0byBpbml0aWFsaXplCi0Jd2hlcmUgdGhlIGRpZmZlcmVudCBzZWN0aW9ucyBnby4gIENoYW5nZSBzb21lIHdoaXRlc3BhY2UuCi0KLQkqIGVtdWxwYXJhbXMvdjg1MC5zaCAoe1RFWFQse1osUyxUfURBVEF9X1NUQVJUX0FERFIpOiBEZWZpbmUKLQlhcHByb3ByaWF0ZWx5LiAgUmVtb3ZlIGNydWQgbm90IHVzZWQgYW55bW9yZS4KLQotRnJpIERlYyAxMyAxMDoxOTo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbW4xMDIwMC5jKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEhhbmRsZSBtbjEwMjAwLgotCSogZW11bHBhcm1zL21uMTAyMDAuc2g6IE5ldyBmaWxlLgotCi1UaHUgRGVjIDEyIDE3OjA0OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2dsZDk2MGMuZW06IEluY2x1ZGUgPGN0eXBlLmg+LgotIAkoZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCk6IEdldCB0aGUgbWFjaGluZSB0eXBlIGZyb20gdGhlIC1BIG9wdGlvbgotCWlmIHRoZXJlIGlzIG9uZSwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIGNvcmUuCi0KLVNhdCBEZWMgIDcgMTA6MDc6NTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaDogSGFuZGxlIGxlYWRpbmcgdW5kZXJzY29yZXMuCi0KLVRodSBEZWMgIDUgMTM6NDU6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBPbmx5Ci0Jc2V0IGhvbGRfcmVsIGlmIFNFQ19BTExPQyBpcyBzZXQuCi0KLVR1ZSBEZWMgIDMgMTE6Mjk6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IFNldCB0aGUgb3V0cHV0X29mZnNldCBhcyB3ZWxsCi0JYXMgdGhlIG91dHB1dF9zZWN0aW9uIHdoZW4gb25seSByZWFkaW5nIHN5bWJvbHMgZnJvbSBhIGZpbGUuCi0KLU1vbiBEZWMgIDIgMTE6NDM6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zLyouc2g6IE1ha2Ugc3VyZSB0aGF0IGVhY2ggc2V0IG9mIHBhcmFtZXRlcnMgd2hpY2gKLQl1c2VzIHRoZSBlbGYuc2Mgc2NyaXB0IHNldHMgTUFDSElORS4KLQotV2VkIE5vdiAyNyAwMzoyMjowNSAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnssbWlwcyxwcGN9LnNjOiBBZGQgdGhlIHJlbWFpbmluZyBEV0FSRiBzZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTGlrZXdpc2UuCi0KLVR1ZSBOb3YgMjYgMTY6NTg6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi1Nb24gTm92IDI1IDEyOjE3OjU1IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMpOiBBZGQgY2FzZQotCWZvciBiZmRfdm1hIHRvIGluaXQgbG9vcC4KLQotTW9uIE5vdiAyNSAwOTo1NTowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoOiBSZW1vdmUgYm9ndXMgJ18nIHByZWZpeCBmb3IKLQllbnRyeSBzeW1ib2wgYW5kIGN0b3IvZHRvciBzdHVmZi4KLQotRnJpIE5vdiAxNSAxMzowMDoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbW4xMDMwMC5jKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEhhbmRsZSBtbjEwMzAwLgotCSogZW11bHBhcm1zL21uMTAzMDAuc2g6IE5ldyBmaWxlLgotCi1UdWUgTm92ICA1IDEwOjU3OjUwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFJFQURPTkxZX1NUQVJUX0FERFIpOiBDaGFuZ2VkIHRvIDB4MjAwMDAwNC4KLQkoRU1CRURERUQpOiBEZWZpbmUuCi0KLUZyaSBOb3YgIDEgMTA6MDE6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBBZGQgc2VjdGlvbiBvbiByZXBvcnRpbmcgYnVncy4KLQotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IE1ha2Ugc3VyZSB0aGUgZXRleHQgYW5kIF9fQ1RPUl9MSVNUX18KLQlzeW1ib2xzIGFyZSBjb3JyZWN0bHkgYWxpZ25lZC4KLQotVGh1IE9jdCAzMSAwOToyODo1OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdGVtcGwvdjg1MC5zYyAoemRhdGEpOiBIYW5kbGUgcmVzemRhdGEsIHJvbXpkYXRhIGFuZAotCXJvbXpic3MgdG9vLgotCi1UdWUgT2N0IDI5IDEyOjMzOjA1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2g6IENoYW5nZXMgbmVlZGVkIGZvciBEMTBWLUVWQSBib2FyZC4KLQlTZXQgVEVYVF9TVEFSVF9BRERSIHRvIDB4MTAwMDAwMC4gU2V0IFJFQURPTkxZX1NUQVJUX0FERFIgdG8KLQkweDIwMDAwMDAuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6ICBGaXggY2FsY3VsYXRpb24gb2YgLnRleHQuICBDaGFuZ2UKLQkuc3RhY2sgdG8gc3RhcnQgYXQgMHgyMDA3ZmZlLgotCi1Nb24gT2N0IDI4IDE1OjM3OjAwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjbGV0Ki0qLWFvdXQqKTogRGVsZXRlLCB1c2Ugc3BhcmMqLSotYW91dCouCi0KLVdlZCBPY3QgMjMgMTY6MTc6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHRlbXBsL3Y4NTAuc2MgKHpkYXRhKTogRml4IHR5cG8gInpyb2RhdGEiIC0+ICJyb3pkYXRhIi4KLQotCSogc2NyaXB0ZW1wbC92ODUwLnNjICh6ZGF0YSk6IE1ha2Ugc3VyZSB0aGlzIHN0YXlzCi0JaW4gbG8tbWVtb3J5LgotCi1UdWUgT2N0IDIyIDExOjM2OjQ3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYyAoX19lcCk6IFB1dCBpdCBhdCB0aGUgc3RhcnQKLQlvZiB0aGUgdGRhIHNlY3Rpb24uCi0KLQkqIHNjcmlwdGVtcGwvdjg1MC5zYzogTW92ZSBhbGwgIm5vcm1hbCIgc2VjdGlvbnMgaW50bwotCXRoZSBleHRlcm5hbCBtZW1vcnkgcmVnaW9uICgweDEwMDAwMCAtIDB4MjAwMDAwKS4KLQotTW9uIE9jdCAyMSAxNzoxNjo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBDbG9uZSBmcm9tIGVsZi5zYywgbW92ZSAudGV4dCB0bwotCTB4MTAwMDAsIHNvIHRoYXQgaXMgbW9yZSByb29tIGZvciBkYXRhLgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFRFWFRfU1RBUlRfQUREUik6IE5vdyAweDEwMDAwMC4KLQkoUkVBRE9OTFlfU1RBUlRfQUREUik6IE5vdyAweDAuCi0JKFNDUklQVF9OQU1FKTogTm93IGVsZmQxMHYuCi0KLQkqIE1ha2VmaWxlLmluIChlZDEwdmVsZi5jKTogRGVwZW5kIG9uIGVsZmQxMHYuc2MsIG5vdCBlbGYuc2MuCi0KLUZyaSBPY3QgMTggMjI6MTI6NDkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoCShURVhUX1NUQVJUX0FERFIpOiBDaGFuZ2UgZnJvbSAwIHRvIDB4MTAwLgotCi1GcmkgT2N0IDE4IDE1OjQzOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIGVlbGY2NGFscGhhLm8uCi0JKEFMTF82NF9FTVVMQVRJT05TKTogTmV3IHZhcmlhYmxlLgotCSogY29uZmlndXJlLmluOiBBY2NlcHQgLS1lbmFibGUtNjQtYml0LWJmZCBvcHRpb24uICBJZiBpdCBpcyBzZXQKLQl3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLCBpbmNsdWRlIEFMTF82NF9FTVVMQVRJT05TIGluCi0JRU1VTEFUSU9OX09GSUxFUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE9jdCAxOCAxMjo1ODozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKF9fZ3AsIF9fZXApOiBEZWZpbmUuCi0KLVRodSBPY3QgMTcgMTg6MTQ6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBUcnkgdG8gY29uc2lzdGVudGx5IHVzZSBhIHNpbmdsZSBvciBhIGRvdWJsZSBkYXNoCi0JZm9yIGVhY2ggb3B0aW9uLgotCi1UaHUgT2N0IDE3IDEwOjE3OjIwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaCAoRU1CRURERUQpOiBEZWZpbmUuCi0KLVRodSBPY3QgMTcgMTA6NTY6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjICguemRhdGEpOiBBZGQgdGhpcyBiZWZvcmUgLnRleHQuCi0JKC5zZGF0YSk6IEFsc28gaW5jbHVkZSAucm9zZGF0YSBhcyBwYXJ0IG9mIHRoZSAuc2RhdGEuCi0JKC50ZGF0YSk6IEluY2x1ZGUgdGhpcyBqdXN0IGJlZm9yZSAuc2RhdGEuCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoIChTQ1JJUFRfTkFNRSk6IFVzZSAidjg1MCIgbm90ICJlbGYiLgotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogV3JhcCBzY3JpcHQgd2l0aCBhICJjYXQgPDwgRU9GIi4KLQotV2VkIE9jdCAxNiAyMzoxMDowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE5ldyBsaW5rZXIgc2NyaXB0IGZvciB0aGUgVjg1MC4KLQkqIE1ha2VmaWxlLmluOiBVc2UgaXQuCi0KLVRodSBPY3QgMTAgMTc6NTc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMyYjQzMDAuc2g6IERlZmluZSBfZ3AgaW4gT1RIRVJfR09UX1NZTUJPTFMsIG5vdAotCU9USEVSX1JFQURXUklURV9TRUNUSU9OUy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaDogTGlrZXdpc2UuCi0KLVdlZCBPY3QgIDkgMTQ6MzY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCB3YXJuX3NlY3Rpb25fYWxpZ24gZmllbGQuCi0JKiBsZXhzdXAuYyAoT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTik6IERlZmluZS4KLQkobGRfb3B0aW9ucyk6IEFkZCAtLXdhcm4tc2VjdGlvbi1hbGlnbi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSAtLXdhcm4tc2VjdGlvbi1hbGlnbi4KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiB3YXJuX3NlY3Rpb25fYWxpZ24sIHdhcm4gaWYKLQl0aGUgc3RhcnQgb2YgYSBzZWN0aW9uIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0td2Fybi1zZWN0aW9uLWFsaWduLgotCSogbGQudGV4aW5mbzogQ2hhbmdlIHNvbWUgc2luZ2xlIGRhc2hlcyB0byBkb3VibGUgZGFzaGVzLgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9wZV9zdWJzeXN0ZW0pOiBSZWNvcmQgZW50cnkgc3ltYm9sIGZvciBlYWNoCi0Jc3Vic3lzdGVtIHR5cGUuICBJZmRlZiBvdXQgb3MyIHR5cGUuICBSZWNvZ25pemUgYSB2ZXJzaW9uIG51bWJlci4KLQotVHVlIE9jdCAgOCAxMjowNzoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3N1YnN5c3RlbSk6IFdoZW4gc2V0dGluZyB0aGUgc3Vic3lzdGVtCi0JdG8gd2luZG93cywgc2V0IHRoZSBlbnRyeSBwb2ludC4KLQotCSogTWFrZWZpbGUuaW4gKGxkbGV4LmMpOiBEb24ndCBwYXNzIGFueSBvcHRpb25zIHRvICQoTEVYKS4KLQotTW9uIE9jdCAgNyAxNzoyOTowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBNZW50aW9uIC5zbyBleHRlbnNpb25zIGZvciBzaGFyZWQKLQlsaWJyYXJpZXMuCi0KLVN1biBPY3QgIDYgMjI6MzU6MzYgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZ7LG1pcHMscHBjfS5zYzogQWRkIERXQVJGIDIgc2VjdGlvbnMuCi0KLUZyaSBPY3QgIDQgMTg6NDk6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogT25seSBzZXQgdGhlIGFkZHJlc3Mgb2YgLnRleHQgaWYKLQlSRUxPQ0FUSU5HLgotCi1GcmkgT2N0ICA0IDEwOjU5OjUyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvc3BhcmNhb3V0LnNoICh7QklHLExJVFRMRX1fT1VUUFVUX0ZPUk1BVCk6IERlZmluZS4KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2MgKHtCSUcsTElUVExFfV9PVVRQVVRfRk9STUFUKTogUHJvdmlkZSBkZWZhdWx0LgotCShPVVRQVVRfRk9STUFUKTogU3VwcG9ydCBiaS1lbmRpYW4gdGFyZ2V0cy4KLQotVGh1IE9jdCAgMyAxMzo1MjowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guaCwgZm5tYXRjaC5jOiBSZW1vdmUgKG5vdyBpbiBsaWJpYmVydHkpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBSZW1vdmUgZm5tYXRjaC5jLgotCShIRklMRVMpOiBSZW1vdmUgZm5tYXRjaC5oLgotCShPRklMRVMpOiBSZW1vdmUgZm5tYXRjaC5vLgotCi1UaHUgT2N0ICAzIDE1OjQxOjI0IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IE1vdmUgY29uZmlnLmxvZyB0byBkaXN0Y2xlYW4uCi0KLVdlZCBPY3QgIDIgMjM6NDU6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVtdWx0bXBsL3BlLmVtOiBpbmNyZWFzZSBzaXplIG9mIHN0YWNrIHJlc2VydmUgdG8gMHgyMDAwMDAwCi0gICAgICAgIChuZWNlc3NhcnkgaW4gb3JkZXIgdG8gY29tcGlsZSBwYXJzZS5jIGluIGdjYyBzb3VyY2VzIHVuZGVyIE5UKQotCi1XZWQgT2N0ICAyIDE0OjQ5OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBGaXggdHlwbyBpbiAtLXJwYXRoLWxpbmsgZGVzY3JpcHRpb24uCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBTdWdnZXN0Ci0JLS1ycGF0aCBpZiBhIG5lZWRlZCBsaWJyYXJ5IGlzIG5vdCBmb3VuZC4KLQotVHVlIE9jdCAgMSAxNjoxNzozMyAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIG1pcHMqLSotZWxmKi4KLQotVHVlIE9jdCAgMSAxNTo1MDozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBHaXZlIG1vcmUgZGV0YWlsIG9uIC1sIG9wdGlvbi4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogSGFuZGxlIENSRUFURV9TSExJQiB0aGUgc2FtZSB3YXkgdGhhdAotCWVsZi5zYyBkb2VzLCBzbyB0aGF0IGdsaWJjIHdvcmtzIGJldHRlci4KLQotCSogbGR2ZXIuYyAobGRfcHJvZ3JhbV92ZXJzaW9uKTogTmV3IHZhcmlhYmxlLgotCShsZHZlcnNpb24pOiBVc2UgaXQuCi0JKiBsZHZlci5oIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBEZWNsYXJlLgotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBIYW5kbGUgLS1kbGwtdmVyYm9zZSBsaWtlIC0tdmVyYm9zZSwgbm90Ci0JLS12ZXJzaW9uLiAgQ2hhbmdlIC0tdmVyc2lvbiBoYW5kbGluZyB0byBtYXRjaCBjdXJyZW50IEdOVQotCXN0YW5kYXJkcy4KLQkoaGVscCk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQotTW9uIFNlcCAzMCAxMjoxNDo0MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZW0zMnJlbGYuYyk6IEFkZCBydWxlIGZvci4KLQkqIGNvbmZpZ3VyZS50Z3QgKG0zMnItKi0qKTogUmVjb2duaXplLgotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoOiBOZXcgZmlsZS4KLQotVGh1IFNlcCAyNiAxMzo1ODo0NyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIHN5bWJvbGljIGRvdWJsZXF1b3RpbmcgdG8gbGRtYWluIGNvbXBpbGUgZWRpdC4KLQkqIG1wdy1jb25maWcuaW46IEFkZCBtaXBzLSotKiBjYXNlIGFzIG1pcHMtZWxmLCBhbmQgdXNlIG1vcmUKLQl3aWxkY2FyZHMgaW4gbWF0Y2hpbmcuCi0JKiBtcHctZW1pcHNlbGYuYzogTmV3IGZpbGUsIHByZWdlbmVyYXRlZCBtaXBzIGVsZiBlbXVsYXRpb24uCi0KLVR1ZSBTZXAgMTcgMTI6MTg6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGludC50ZXhpbmZvOiBSZXdyb3RlLgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgY2FzZXMgZm9yIE1JUFMgNTAwMCBsaWtlIE1JUFMgNDMwMC4KLQotTW9uIFNlcCAxNiAxNzo1NToyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IE9ubHkgZGVmaW5lIHN5bWJvbHMgaWYgUkVMT0NBVElORy4gIEZpeAotCXN5bnRheCBlcnJvciBvbiBfX2VuZF9fIGxpbmUuCi0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IEZvciAtTiBvciAtbiwgZG9uJ3QgYWxpZ24gLmRhdGEuICBGcm9tCi0gCUNocmlzIEhhZGxleSA8Q2hyaXN0b3BoZXIuSGFkbGV5QGNsLmNhbS5hYy51az4KLQotU3VuIFNlcCAxNSAyMjowOTo1NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoOiBGaXggT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUy4KLQotU3VuIFNlcCAxNSAxMDozODoxNiAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJtcy9kMTB2LnNoOiBTZXQgT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyB0byBwdXQKLQlzdGFjayBhdCB0b3Agb2Ygc2ltdWxhdG9yIG1lbW9yeS4KLQotRnJpIFNlcCAxMyAxNTo0OTo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4LmwgKFNZTUJPTENIQVJOKTogQWRkICQsIF8sIGFuZCB+LgotCi1XZWQgU2VwIDExIDIzOjMwOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKGdldF9lbXVsYXRpb24pOiBDaGVjayBmb3IgLW1pcHM0IGxpa2UgLW1pcHMxLCBldC4gYWwuCi0KLVRodSBTZXAgIDUgMTU6MjQ6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IEFjY2VwdCBhIGxhbmdfaW5wdXRfc3RhdGVtZW50Ci0JYXMgdGhlIFBUUiBhcmd1bWVudC4gIElmIHRoZSBmaWxlIGlzIHN5bWJvbHMgb25seSwgZGlzY2FyZCBhbGwKLQlpbnB1dCBzZWN0aW9ucy4KLQkobGRsYW5nX2FkZF9maWxlKTogUGFzcyBlbnRyeSB0byBiZmRfbWFwX292ZXJfc2VjdGlvbnMuCi0KLVdlZCBTZXAgIDQgMTU6NTM6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChhbHBoYS0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBGaWxhIEtvbG9kbnkKLQk8ZmlsYUBpYmkuY29tPi4KLQotVHVlIFNlcCAgMyAwMDo1Mjo1NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoOiBTZXQgT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUwotCi1TdW4gU2VwICAxIDIxOjQ4OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL3Y4NTAuc2g6IFNldCBFTUJFRERFRC4KLQotRnJpIEF1ZyAzMCAyMjozMDozMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoOiBFbnRyeSBzeW1ib2wgaXMgIl9zdGFydCIsIHR3ZWFrCi0JY3Rvci9kdG9yIHN1cHBvcnQuCi0KLUZyaSBBdWcgMzAgMTg6MzI6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzaC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9zaGVsZi5zaDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL3NobGVsZi5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXNoZWxmLm8gYW5kIGVzaGxlbGYuby4KLQkoZXNoZWxmLmMsIGVzaGxlbGYuYyk6IE5ldyB0YXJnZXRzLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBJZiBFTUJFRERFRCBpcyBkZWZpbmVkLCB0aGVuIGRvbid0IGFkZAotCVNJWkVPRl9IRUFERVJTIHRvIFRFWFRfU1RBUlRfQUREUi4gIEV4cGFuZCBDVE9SX1NUQVJUIGFuZCBDVE9SX0VORAotCWFyb3VuZCAuY3RvcnMsIGFuZCBEVE9SX1NUQVJUIGFuZCBEVE9SX0VORCBhcm91bmQgLmR0b3JzLiAgRXhwYW5kCi0JT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyBpZiBSRUxPQ0FUSU5HLgotCi1UaHUgQXVnIDI5IDE2OjU3OjQ2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLntob3N0LHRndH0gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtCi0JcHJvLgotCi1Nb24gQXVnIDI2IDEyOjU4OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKHNlY3Rpb24pOiBBZGQgb3B0X25vY3Jvc3NyZWZzOyBwYXNzIHZhbHVlIHRvCi0JbGFuZ19lbnRlcl9vdmVybGF5LgotCShvcHRfbm9jcm9zc3JlZnMpOiBOZXcgbm9udGVybWluYWwuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgTk9DUk9TU1JFRlMga2V5d29yZCBpbiBFWFBSRVNTSU9OIG1vZGUuCi0JKiBsZGxhbmcuYyAob3ZlcmxheV9ub2Nyb3NzcmVmcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfZW50ZXJfb3ZlcmxheSk6IEFkZCBub2Nyb3NzcmVmcyBwYXJhbWV0ZXIuCi0JKGxhbmdfbGVhdmVfb3ZlcmxheSk6IE9ubHkgYWRkIG5vY3Jvc3NyZWZzIGlmIG92ZXJsYXlfbm9jcm9zc3JlZnMKLQlpcyBzZXQuICBJbml0aWFsaXplIG92ZXJsYXlfbm9jcm9zc3JlZnMuCi0JKiBsZGxhbmcuaCAobGFuZ19lbnRlcl9vdmVybGF5KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGQudGV4aW5mbyAoT3ZlcmxheXMpOiBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogUHJpbnQgR05VIGxkIGluIHRoZSB2ZXJzaW9uIG1lc3NhZ2UuCi0KLVRodSBBdWcgMjIgMTc6MTA6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhMREVOVi4KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBITERFTlYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERU5WKTogTmV3IHZhcmlhYmxlLgotCSgkKExEX1BST0cpKTogVXNlICQoSExERU5WKS4KLQotVGh1IEF1ZyAyMiAxNjoyOToyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChldjg1MC5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKHY4NTAtKi0qKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvdjg1MC5zaDogTmV3IGZpbGUuCi0KLVRodSBBdWcgMjIgMTE6MTY6MDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBAREFTSF9DX0ZMQUdAIHRvIGNvbXBpbGVyIGVkaXQuCi0KLVdlZCBBdWcgMjEgMTE6MjY6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFB1dCAuZ251LmxpbmtvbmNlKiBzZWN0aW9ucyBpbiBhcHByb3ByaWF0ZQotCWNvbnRhaW5pbmcgc2VjdGlvbnMuCi0KLU1vbiBBdWcgMTkgMTM6MDE6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmM6IEluY2x1ZGUgc3lzZGVwLmguCi0KLU1vbiBBdWcgMTkgMTE6Mjg6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBnZW5zY3JpcHRzLnNoOiBVbmRvIDgvMTYgY2hhbmdlLgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKE1BQ0hJTkUpOiBFeHBsaWNpdGx5IHNldCB0byBub3RoaW5nLgotCi1GcmkgQXVnIDE2IDE5OjE4OjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZ2Vuc2NyaXB0cy5zaDogRXhwbGljaXRseSByZXNldCBhbnkgc2hlbGwgdmFyaWFibGVzIHNldCBvciB1c2VkCi0JYnkgdGhlIHZhcmlvdXMgLnNjIHNjcmlwdHMgdG8gYWxsb3cgaW5hZHZlcnRhbnQgdXNlIG9mIHRoZXNlCi0JbmFtZXMgYXMgbm9ybWFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBieSB0aGUgcGVyc29uIHJ1bm5pbmcKLQljb25maWd1cmUuCi0KLQkqIE1ha2VmaWxlLmluIChlZDEwdmVsZi5jKTogVXNlIHRkaXJfZDEwdiwgbm90IHRkaXJfYXJjZWxmLgotCi1GcmkgQXVnIDE2IDE0OjE1OjQxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYyAoX19ic3Nfc3RhcnRfXywgX19ic3NfZW5kX18sCi0gCV9fZGF0YV9zdGFydF9fLCBfX2RhdGFfZW5kX18pOiBBZGRlZCB0byBrZWVwIGluIHN5bmMuIHdpdGggdGhlCi0gCWRlZmF1bHQgQVJNIGNydDAucy4gQWRkZWQgX19DVE9SX0xJU1RfXyBhbmQgX19EVE9SX0xJU1RfXyBzdXBwb3J0LgotCi1UaHUgQXVnICA4IDE0OjI0OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRjcmVmLmMgKGNoZWNrX3JlbG9jX3JlZnMpOiBJZiBpbmZvLT5zYW1lLCBsb29rIGZvciBhbnkgc3ltYm9sCi0JZGVmaW5lZCBpbiBpbmZvLT5kZWZzZWMsIG5vdCBqdXN0IHRoZSBzZWN0aW9uIHN5bWJvbC4KLQotV2VkIEF1ZyAgNyAxNDo0MDo0OCAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURfREVDTEFSQVRJT04gb24gc3Ryc3RyIGFuZCBzYnJrLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCi0JKE5FRURfREVDTEFSQVRJT05fU0JSSyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmggKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKiBsZG1haW4uYyAoc2Jyayk6IERlY2xhcmUgaWYgSEFWRV9TQlJLIGFuZAotCU5FRURfREVDTEFSQVRJT05fU0JSSy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcmVjb3JkX3BoZHJzKTogQ2FzdCB4bWFsbG9jIGFuZCB4cmVhbGxvYyByZXR1cm4uCi0KLU1vbiBBdWcgIDUgMTY6MjY6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgT1ZFUkxBWS4KLQkqIGxkZ3JhbS55OiBBZGQgc2VjdGlvbl9waGRyIGZpZWxkIHRvICV1bmlvbi4KLQkoc2VjdGlvbik6IEhhbmRsZSBwaGRyX29wdCByZXN1bHQuICBBZGQgT1ZFUkxBWSBjYXNlLgotCShvcHRfZXhwX3dpdGhvdXRfdHlwZSk6IE5ldyBub250ZXJtaW5hbC4KLQkocGhkcl9vcHQpOiBSZXR1cm4gbGlzdCBvZiBwaGRycy4KLQkob3ZlcmxheV9zZWN0aW9uKTogTmV3IG5vbnRlcm1pbmFsLgotCSogbGRsYW5nLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IEFkZCBwaGRycyBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShsYW5nX3NlY3Rpb25faW5fcGhkcik6IFJlbW92ZS4KLQkob3ZlcmxheV92bWEsIG92ZXJsYXlfbG1uLCBvdmVybGF5X21heCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3Qgb3ZlcmxheV9saXN0KTogRGVmaW5lLgotCShvdmVybGF5X2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsYW5nX2VudGVyX292ZXJsYXksIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9ucy4KLQkobGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24sIGxhbmdfbGVhdmVfb3ZlcmxheSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBsZGxhbmcuaCAobGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBVcGRhdGUKLQlkZWNsYXJhdGlvbiBmb3IgbmV3IHBhcmFtZXRlci4KLQkobGFuZ19zZWN0aW9uX2luX3BoZHIpOiBEb24ndCBkZWNsYXJlLgotCShsYW5nX2VudGVyX292ZXJsYXksIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uKTogRGVjbGFyZS4KLQkobGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24sIGxhbmdfbGVhdmVfb3ZlcmxheSk6IERlY2xhcmUuCi0JKiBsZC50ZXhpbmZvIChPdmVybGF5cyk6IE5ldyBub2RlIHVuZGVyIFNFQ1RJT05TLCBkb2N1bWVudGluZwotCW92ZXJsYXlzLgotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgTUFYIGFuZCBNSU4uCi0JKiBsZGdyYW0ueSAoTUFYLCBNSU4pOiBOZXcgdGVybWluYWxzLgotCShleHApOiBSZWNvZ25pemUgTUFYIGFuZCBNSU4uCi0JKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IEhhbmRsZSBNQVggYW5kIE1JTi4KLQkqIGxkLnRleGluZm8gKEFyaXRobWV0aWMgRnVuY3Rpb25zKTogRG9jdW1lbnQgTUFYIGFuZCBNSU4uCi0KLQkqIGxkLnRleGluZm8gKFBIRFJTKTogVXNlIEBjaW5kZXgsIG5vdCBAa2luZGV4LCBmb3IgcHJvZ3JhbSBoZWFkZXIKLQlpbmRleCBlbnRyaWVzLgotCi0JKiBsZGdyYW0ueSAoU0laRU9GLCBBRERSKTogRG8gbm90IHNwZWNpZnkgdHlwZS4KLQotCSogbGRjcmVmLmMgKGNoZWNrX25vY3Jvc3NyZWYpOiBTa2lwIHN5bWJvbHMgd2l0aCBubyBvdXRwdXQKLQlzZWN0aW9ucy4KLQotRnJpIEF1ZyAgMiAxNDo1Nzo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChMT0FEQUREUik6IE5ldyB0ZXJtaW5hbC4KLQkoZXhwKTogSGFuZGxlIExPQURBRERSLgotCSogbGRsZXgubDogUmVjb2duaXplIExPQURBRERSLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQWRkIExPQURBRERSLgotCShmb2xkX25hbWUpOiBJbXBsZW1lbnQgTE9BREFERFIuCi0JKiBsZGxhbmcuYyAoZXhwX2luaXRfb3MpOiBUcmVhdCBMT0FEQUREUiBsaWtlIEFERFIuCi0JKiBsZC50ZXhpbmZvIChBcml0aG1ldGljIEZ1bmN0aW9ucyk6IERvY3VtZW50IExPQURBRERSLgotCi1UaHUgQXVnICAxIDEyOjUyOjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoY2hlY2tfbm9jcm9zc3JlZnMpOiBEZWNsYXJlLgotCSogbGRsYW5nLmggKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYpOiBEZWZpbmUuCi0JKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzKTogRGVmaW5lLgotCShub2Nyb3NzcmVmX2xpc3QpOiBEZWNsYXJlLgotCShsYW5nX2FkZF9ub2Nyb3NzcmVmKTogRGVjbGFyZS4KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBOT0NST1NTUkVGUyBrZXl3b3JkLgotCSogbGRncmFtLnkgKCV1bmlvbik6IEFkZCBub2Nyb3NzcmVmIGZpZWxkLgotCShOT0NST1NTUkVGUyk6IE5ldyB0ZXJtaW5hbC4KLQkoaWZpbGVfcDEpOiBSZWNvZ25pemUgTk9DUk9TU1JFRlMuCi0JKG5vY3Jvc3NyZWZfbGlzdCk6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGFuZy5jIChub2Nyb3NzcmVmX2xpc3QpOiBEZWZpbmUuCi0JKGxhbmdfYWRkX25vY3Jvc3NyZWYpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZG1haW4uYyAobWFpbik6IElmIG5vY3Jvc3NyZWZfbGlzdCBpcyBub3QgTlVMTCwgY2FsbAotCWNoZWNrX25vY3Jvc3NyZWZzLgotCSh3YXJuaW5nX2NhbGxiYWNrKTogRnJlZSBzeW1ib2xzIGlmIHRoZXJlIGlzIG5vIHBsYWNlIHRvIHN0b3JlCi0JdGhlbS4KLQkobm90aWNlKTogQ2FsbCBhZGRfY3JlZiBpZiBub2Nyb3NzcmVmX2xpc3QgaXMgbm90IE5VTEwuCi0JKiBsZGNyZWYuYzogSW5jbHVkZSAibGRleHAuaCIgYW5kICJsZGxhbmcuaCIuCi0JKGNoZWNrX25vY3Jvc3NyZWZzKTogTmV3IGZ1bmN0aW9uLgotCShjaGVja19ub2Nyb3NzcmVmKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IGNoZWNrX3JlZnNfaW5mbyk6IERlZmluZS4KLQkoY2hlY2tfcmVmcywgY2hlY2tfcmVsb2NfcmVmcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogbGQudGV4aW5mbyAoT3B0aW9uIENvbW1hbmRzKTogRG9jdW1lbnQgTk9DUk9TU1JFRlMuCi0KLQkqIGxkLnRleGluZm8gKFNlY3Rpb24gUGxhY2VtZW50KTogSW1wcm92ZSB0aGUgd29yZGluZyBvZiB0aGUKLQl3aWxkY2FyZCBkb2N1bWVudGF0aW9uLiAgTWVudGlvbiB0aGF0IHdpbGRjYXJkcyBhcmUgb25seSBzZWFyY2hlZAotCWZvciBvbiB0aGUgY29tbWFuZCBsaW5lLCBub3QgaW4gdGhlIGZpbGUgc3lzdGVtLgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBNb3ZlCi0JZGVmaW5pdGlvbiBvZiBsaWJfcGF0aCBpbnNpZGUgY29uZGl0aW9uIHdoZXJlIGl0IGlzIHVzZWQuCi0KLVdlZCBKdWwgMzEgMTM6MTc6MTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLSAJKiBlbXVscGFyYW1zL2QxMHZlbGYuc2g6IE5vdyB3b3JrcyB3aXRoIGVsZi5zYy4KLQotV2VkIEp1bCAzMSAxMTo1MjowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChTQ1JJUFRfTkFNRSk6IENoYW5nZSB0byB2YW5pbGxhLgotCi1UdWUgSnVsIDMwIDE0OjQ2OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEFkZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlIHJlc3VsdAotCXZhbHVlIHdoZW4gY29tcHV0aW5nIHRoZSBhZGRyZXNzIG9mIGEgc2VjdGlvbi4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGNyZWYgZmllbGQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFNldCBjb21tYW5kX2xpbmUuY3JlZi4KLQkqIGxkbWFpbi5jIChtYWluKTogQ2hlY2sgY29tbWFuZF9saW5lLmNyZWYgcmF0aGVyIHRoYW4KLQlsaW5rX2luZm8ubm90aWNlX2FsbC4KLQkobm90aWNlKTogTGlrZXdpc2UuCi0KLQkqIGxkY3JlZi5jIChvdXRwdXRfb25lX2NyZWYpOiBEb24ndCBjcmFzaCBpZiBhIHN5bWJvbCBpcyBkZWZpbmVkCi0JaW4gYSBzZWN0aW9uIHdpdGhvdXQgYW4gb3duZXIuCi0KLU1vbiBKdWwgMjkgMTc6MjM6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmgsIGZubWF0Y2guYzogTmV3IGZpbGVzLgotCSogbGRsZXgubDogUmVtb3ZlIHVudXNlZCBkZWZpbml0aW9uIG9mIEZJTEVOQU1FLiAgQWRkIGRlZmluaXRpb24KLQlvZiBXSUxEQ0hBUi4gIEluIFNDUklQVCBtb2RlLCBhY2NlcHQgYW55IHNlcXVlbmNlIG9mIFdJTERDSEFSIGFzIGEKLQlOQU1FLgotCSogbGRncmFtLnkgKGZpbGVfTkFNRV9saXN0KTogQWNjZXB0ICcqJyBhbmQgJz8nIHNwZWNpYWxseS4KLQkoaW5wdXRfc2VjdGlvbl9zcGVjKTogQWNjZXB0ICc/JyBzcGVjaWFsbHkuCi0JKHN0YXRlbWVudCk6IENoYW5nZSBleHAgdG8gbXVzdGJlX2V4cCBpbiBsZW5ndGggYW5kIEZJTEwgY2FzZXMuCi0JKHNlY3Rpb24pOiBDYWxsIGxkbGV4X3NjcmlwdCBiZWZvcmUgc2VjdGlvbiBzdGF0ZW1lbnRzLCBhbmQgY2FsbAotCWxkbGV4X3BvcHN0YXRlIGFmdGVyIHRoZW0uCi0JKiBsZGxhbmcuYzogSW5jbHVkZSAiZm5tYXRjaC5oIi4KLQkod2lsZGNhcmRwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkod2lsZF9zZWN0aW9uKTogUGVybWl0IHRoZSBzZWN0aW9uIG5hbWUgdG8gYmUgYSB3aWxkY2FyZC4KLQkod2lsZF9maWxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiB3aWxkLgotCSh3aWxkKTogQ2FsbCB3aWxkX2ZpbGUuICBQZXJtaXQgdGhlIGZpbGUgbmFtZSB0byBiZSBhIHdpbGRjYXJkLgotCShvcGVuX2lucHV0X2JmZHMpOiBEb24ndCBjYWxsIGxvb2t1cF9uYW1lIGZvciBhIHdpbGRjYXJkIHBhdHRlcm4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShDRklMRVMpOiBBZGQgZm5tYXRjaC5jLgotCShIRklMRVMpOiBBZGQgZm5tYXRjaC5oLgotCShPRklMRVMpOiBBZGQgZm5tYXRjaC5vLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdGhhdCBmaWxlIGFuZCBzZWN0aW9uIG5hbWVzIGNhbiBub3cgYmUKLQl3aWxkY2FyZCBwYXR0ZXJucy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcGxhY2Vfb3JwaGFucyk6IENvcnJlY3QgY29uZGl0aW9uOiBwbGFjZSBhIGNvbW1vbgotCXNlY3Rpb24gaWYgbm90IHJlbG9jYXRlYWJsZSBvciBpZiBjb21tb24gZGVmaW5pdGlvbnMgYXJlIGZvcmNlZC4KLQotV2VkIEp1bCAyNCAxMjoxNjozOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChTQ1JJUFRfTkFNRSk6IENoYW5nZSB0byBlbGYuCi0KLVdlZCBKdWwgMjQgMTM6Mzg6MjIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogY29uZmlndXJlLnRndCAoZDEwdi0qLSopOiBEb24ndCByZXF1aXJlIHRoZSAtZWxmLCBhbGxvdyBwbGFpbiBkMTB2LgotCi1UdWUgSnVsIDIzIDEwOjM2OjE5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZWQxMHZlbGYuYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0IChkMTB2LSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2g6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDE4IDE2OjI1OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmMqLSotc3lzdjQqKTogTmV3IHRhcmdldC4gIEZyb20gQW5kcmV3IEdpZXJ0aAotCTxBTkRSRVdHQG1pY3JvbGlzZS5jby51az4uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGFuZ2UgaXJpeDUgdG8gaXJpeFs1Nl0qLgotCSogY29uZmlndXJlLnRndDogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMTcgMTA6NTI6NDYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9zZWN0aW9ucyk6IFBheSBhdHRlbnRpb24gdG8gcmV0dXJuIGNvZGUuCi0KLQkqIGxkbWlzYy5jIChkZW1hbmdsZSk6IFJlbW92ZSBhbGwgcHJlZml4ICcuJ3MgZnJvbSBhIG5hbWUuCi0KLU1vbiBKdWwgMTUgMTE6NDk6NDkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUm91bmQKLSAJdGhlIHZhbHVlIG9mIF9fc3RhcnRfU0VDTkFNRSB0byB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGJ5IHRoZQotIAlzZWN0aW9uIHRvIGJlIHBsYWNlZC4KLQotVHVlIEp1bCAgOSAxMjowOTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqZWwtKi1lbGYqKTogVXNlIGVsZjMyZWxtaXAuCi0JKG1pcHMqLSotZWxmKik6IFVzZSBlbGYzMmVibWlwLgotCSogZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggKEVNQkVEREVEKTogRG9uJ3QgZGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggKEVNQkVEREVEKTogRG9uJ3QgZGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoOiBOZXcgZmlsZTsgY29weSBvZiBlbGYzMmxtaXAuc2ggd2l0aAotCUVNQkVEREVEIGRlZmluZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWJtaXAuc2g6IE5ldyBmaWxlOyBjb3B5IG9mIGVsZjMyYm1pcC5zaCB3aXRoCi0JRU1CRURERUQgZGVmaW5lZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCAoRU1CRURERUQpOiBEZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMybDQzMDAuc2ggKEVNQkVEREVEKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMmVibWlwLm8gZWVsZjMyZWxtaXAuby4KLQkoZWVsZjMyZWJtaXAuYywgZWVsZjMyZWxtaXAuYyk6IE5ldyB0YXJnZXRzLgotCi1UaHUgSnVsICA0IDEyOjAxOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogU2V0IHZlcnNpb24gdG8gY3lnbnVzLTIuNy4xLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLQkqIGVtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaDogUmVuYW1lIGZyb20gcGM1MzJtYWNoYW91dC5zaCB0byBhdm9pZAotCVN5c3RlbSBWIGZpbGUgbmFtZSBsaW1pdGF0aW9ucy4KLQkqIGNvbmZpZ3VyZS50Z3QgKG5jMzJrLXBjNTMyLW1hY2gqLCBuczMyay1wYzUzMi11eCopOiBVc2UKLQlwYzUzMm1hY2hhIHJhdGhlciB0aGFuIHBjNTMybWFjaGFvdXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBDaGFuZ2UgZXBjNTMybWFjaGFvdXQubyB0bwotCWVwYzUzMm1hY2hhLm8uCi0JKGVwYzUzMm1hY2hhLmMpOiBSZW5hbWUgdGFyZ2V0IGZyb20gZXBjNTMybWFjaGFvdXQuYy4KLQotV2VkIEp1bCAgMyAxMTo0MDoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChwcmludF9wYWRkaW5nX3N0YXRlbWVudCk6IFVzZSAldSwgbm90ICV4LCB0byBwcmludAotCWZpbGwgdmFsdWUuCi0KLVN1biBKdW4gMzAgMTE6MTY6NDMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctZXBwY21hYy5jOiBVcGRhdGUgdG8gcmVmbGVjdCBNYXkgMjMgY2hhbmdlIHRvIGFpeC5lbS4KLQotVGh1IEp1biAyNyAxNDowMzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFB1dCB0aGUgLnNhCi0JZmlsZSBqdXN0IGJlZm9yZSB0aGUgLnNvIGZpbGUsIHJhdGhlciB0aGFuIGp1c3QgYWZ0ZXIuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgLXByaW50LWZpbGUtbmFtZT1GSUxFIHJhdGhlciB0aGFuIHBpcGluZwotCS1wcmludC1saWJnY2MtZmlsZS1uYW1lIHRocm91Z2ggc2VkLgotCShpWzM0NV04NiotKi1zY28qLCBpWzM0NV04Ni0qLWlzYyopOiBDcmVhdGUgY3J0YmVnaW4ubyBhbmQKLQljcnRlbmQubyBmaWxlcywgaW4gY2FzZSBnY2MgZG9lc24ndCB1c2UgdGhlbS4KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBjcnRiZWdpbi5vIGFuZCBjcnRlbmQuby4KLQotV2VkIEp1biAyNiAxNTo1NzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLWRlYy1vc2YqKTogTmV3IHRhcmdldC4KLQotVHVlIEp1biAyNSAyMjoxNToyOSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKLQlJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotCShkb2NkaXIpOiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotCShBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIEp1biAyNCAxODo0ODoxNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoX0dMT0JBTF9PRkZTRVRfVEFCTEVfKTogRG9uJ3QgZG8gYQotCVBST1ZJREUgb2YgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBzaW5jZSBpdCBuZWVkcyB0byBiZSBhdCBhCi0Jbm9uLWZpeGVkIGxvY2F0aW9uLgotCi1Nb24gSnVuIDI0IDE3OjU1OjMxIDE5OTYgIEpvdWtlIE51bWFuICA8am51bWFuQGJhemlzLm5sPgotCi0JKiBsZGxhbmcuaCAoZW51bSBzZWN0aW9uX3R5cGUpOiBEZWZpbmUuCi0JKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUpOiBSZW1vdmUgbG9hZGFibGUgZmllbGQuICBBZGQKLQlzZWN0eXBlIGZpZWxkLgotCShsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IENoYW5nZSBmbGFncyBwYXJhbWV0ZXIgaW4KLQlwcm90b3R5cGUgdG8gc2VjdHlwZS4KLQkqIGxkZ3JhbS55ICh0eXBlYml0cyk6IFJlbW92ZS4KLQkoc2VjdHlwZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG9wdF9hdCk6IFVzZSBzZWN0eXBlIHJhdGhlciB0aGFuIHR5cGViaXRzLgotCSh0eXBlKTogU2V0IHNlY3R5cGUgcmF0aGVyIHRoYW4gdHlwZWJpdHMuCi0JKGF0eXBlKTogTGlrZXdpc2UuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgRFNFQ1QsIENPUFksIElORk8sIGFuZCBPVkVSTEFZIGluCi0JRVhQUkVTU0lPTiBtb2RlLgotCSogbGRsYW5nLmMgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCk6IFNldCBzZWN0eXBlCi0JZmllbGQgcmF0aGVyIHRoYW4gbG9hZGFibGUgZmllbGQuCi0JKHdpbGRfZG9pdCk6IENoZWNrIHNlY3R5cGUgcmF0aGVyIHRoYW4gbG9hZGFibGUuCi0JKGxhbmdfcmVjb3JkX3BoZHJzKTogTGlrZXdpc2UuCi0JKGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUmVuYW1lIGZsYWdzIHBhcmFtZXRlciB0bwotCXNlY3R5cGUuICBTZXQgc2VjdHlwZSBmaWVsZCByYXRoZXIgdGhhbiBsb2FkYWJsZSBmaWVsZC4gIFNldCBmbGFncwotCWZpZWxkIGJhc2VkIG9uIHNlY3R5cGUuCi0KLU1vbiBKdW4gMjQgMTI6MDA6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEZvcmNlIC5zdGFiKiBhbmQgLmNvbW1lbnQgc2VjdGlvbnMgdG8gc3RhcnQKLQlhdCAwLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKLQl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQotRnJpIEp1biAyMSAxNzo0MDo1NiAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBtZXJsaW4uZ2NzLnJlZHN0b25lLmFybXkubWlsPgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgc3VwcG9ydCBmb3IgKi0qLXJ0ZW1zKiBjb25maWd1cmF0aW9ucy4KLQotRnJpIEp1biAyMSAxMzowNTo1MSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlndXJlLnRndCAoYWxwaGEtKi1saW51eGVjb2ZmKik6IE5ldyB0YXJnZXQuCi0JKGFscGhhLSotbGludXgqKTogVXNlIGVsZjY0YWxwaGEuCi0JKiBlbXVscGFyYW1zL2VsZjY0YWxwaGEuc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBJZiBFTEZTSVpFIGlzIG5vdCBzZXQsIHNldCBpdCB0byAzMi4gIFVzZQotCSR7RUxGU0laRX0gcmF0aGVyIHRoYW4gMzIgd2hlbiBjYWxsaW5nIEJGRCByb3V0aW5lcy4KLQkoaG9sZF9yb2RhdGEpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBVc2UgaG9sZF9yb2RhdGEgZm9yIGEKLQlyZWFkb25seSBzZWN0aW9uIHRoYXQgaXMgbm90IGNvZGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBTZXQgaG9sZF9yb2RhdGEuICBEb24ndCB1c2UKLQlhIC5yZWwgc2VjdGlvbiB1bmxlc3MgaXRzIGJmZF9zZWN0aW9uIGZpZWxkIGlzIG5vdCBOVUxMLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGY2NGFscGhhLm8uCi0JKGVlbGY2NGFscGhhLmMpOiBOZXcgdGFyZ2V0LgotCi1GcmkgSnVuIDIxIDEyOjQ1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgMCBpbiAlVyBjYXNlLgotCi1UaHUgSnVuIDIwIDEzOjU1OjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBlbm91Z2ggc3VwcG9ydCB0byB1bmRlcnN0YW5kIHRoZSBnY2Mgc3ZyMy5pZmlsZSBzY3JpcHQ6Ci0JKiBsZGxleC5sOiBSZWNvZ25pemUgQkxPQ0sgYW5kIEdST1VQIGluIEVYUFJFU1NJT04gY29udGV4dC4gIEFkZAotCUJJTkQga2V5d29yZC4KLQkqIGxkZ3JhbS55OiBBZGQgQklORCB0b2tlbi4KLQkoc2VjdGlvbik6IFJlY29nbml6ZSBHUk9VUC4KLQkob3B0X2V4dF93aXRoX3R5cGUpOiBSZWNvZ25pemUgYSBjb3VwbGUgb2YgY2FzZXMgb2YgQklORC4KLQkqIGxkbGFuZy5jIChpbml0X29zKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgc2VjdGlvbiBpcyBhbHJlYWR5Ci0JaW5pdGlhbGl6ZWQuICBDYWxsIGV4cF9pbml0X29zIG9uIGFkZHJfdHJlZSBmaWVsZC4KLQkoZXhwX2luaXRfb3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zKTogQ2FsbCBleHBfaW5pdF9vcyBvbiBhc3NpZ25tZW50Ci0JZXhwcmVzc2lvbi4KLQkobGFuZ19wbGFjZV9vcnBoYW5zKTogQ2hlY2sgZm9yIGNvbW1vbiBzZWN0aW9ucyBieSBuYW1lIENPTU1PTgotCXJhdGhlciB0aGFuIGJ5IGNvbW1vbl9zZWN0aW9uIGZpZWxkLiAgRG9uJ3Qgd2FybiBhYm91dCBhYnNlbmNlIG9mCi0JW0NPTU1PTl0gY29tbWFuZC4KLQotCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBSZW1vdmUgdXNlbGVzcyBmaWVsZHMKLQljb21tb25fc2VjdGlvbiwgY29tbW9uX291dHB1dF9zZWN0aW9uLCBhbmQgY29tcGxhaW5lZCwgYXMgd2VsbCBhcwotCWFsbCByZWZlcmVuY2VzIHRvIHRoZW0uCi0KLQkqIGxkZXhwLmM6IFJlaW5kZW50IGEgbG90IG9mIGNvZGUuCi0JKGV4cF9mb2xkX3RyZWUpOiBDYWxsIEZBSUwgcmF0aGVyIHRoYW4gZWluZm8gaW4gZGVmYXVsdCBjYXNlLgotCi1XZWQgSnVuIDE5IDExOjQwOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKG04OCotKi1kZ3V4Kik6IFF1b3RlIEhPU1RJTkdfQ1JUMC4gIEZyb20KLQk8cmFuZGFsbC5ocm9uQG1lZGFwaGlzLmNvbT4uCi0KLVR1ZSBKdW4gMTggMTU6NTM6MDkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwcy5zYzogTmV3IGZpbGUgZm9yIEg4L1MuCi0JKiBlbXVscGFyYXJtcy9oODMwMHMuc2g6IE5ldyBmaWxlIGZvciBIOC9TLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIEg4L1MuCi0JKGVfaDgzMDBzLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLnRndDogQWRkIEg4L1MgdG8gdGFyZ19leHRyYV9lbXVscy4KLQotVHVlIEp1biAxOCAxNzo1NTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1XTg2Ki0qLWlzYyopOiBOZXcgdGFyZ2V0LiAgRnJvbQotCTx1ZGRlYm9yZ0BjYXJtZW4uc2U+LgotCi1XZWQgSnVuIDEyIDEyOjQ2OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLSAJKHBhcnNlX2FyZ3MpOiBDb3B5IHRoZSAtWSBhcmd1bWVudCBpbnRvIG1lbW9yeS4KLSAJKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBEb24ndCBwdXQgdGhlICc6JyBiYWNrIGludG8gdGhlIGRpcmVjdG9yeQotCWxpc3QuCi0KLUZyaSBKdW4gIDcgMTE6Mjc6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiB0byBhZGQKLQlMRF9MSUJSQVJZX1BBVEggdG8gdGhlIGxpc3Qgb2Ygc2VhcmNoIGRpcmVjdG9yaWVzLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBBZGQgbmV3IHNldF9zeW1ib2xzIHJvdXRpbmUuCi0KLVRodSBKdW4gIDYgMTE6NTA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaCAoT1RIRVJfR09UX1NZTUJPTFMpOiBVc2UgQUxJR04oMTYpCi0JcmF0aGVyIHRoYW4gLiB3aGVuIGNvbXB1dGluZyBfZ3AgdmFsdWUuICBGcm9tIFBlciBGb2dlbHN0cm9tLgotCSogZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggKE9USEVSX0dPVF9TWU1CT0xTKTogTGlrZXdpc2UuCi0KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3QgY2xvc2UgYW5kIHVubGluayB0aGUgZmlsZSBvbiBlcnJvciwgc2luY2UKLQlyZW1vdmVfb3V0cHV0IHdpbGwgZG8gaXQgYW55aG93LgotCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0KTogU2V0IGJvb2xlYW4gdmFyaWFibGUgdG8gdHJ1ZSwgbm90IDEuCi0KLVdlZCBKdW4gIDUgMTg6MzQ6MTQgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL3tlbGYzMmI0MzAwLnNoLGVsZjMybDQzMDAuc2h9IChTQ1JJUFRfTkFNRSk6IFVzZQotCWVsZm1pcHMgaW5zdGVhZCBvZiBlbGYuCi0KLVR1ZSBKdW4gIDQgMTg6NDM6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGNyZWYuYzogTmV3IGZpbGUuCi0JKiBsZC5oIChhZGRfY3JlZiwgb3V0cHV0X2NyZWYpOiBEZWNsYXJlLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIG5vdGljZV9hbGwgZmllbGQuICBJZiBpdCBpcyBzZXQgYXQKLQllbmQgb2YgbGluaywgY2FsbCBvdXRwdXRfY3JlZi4KLQkobm90aWNlKTogUmVuYW1lIGZyb20gbm90aWNlX3lzeW0uICBDaGVjayBub3RpY2VfYWxsLgotCSogbGRtaXNjLmMgKGZpbmZvKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCSogbGRtaXNjLmggKGZpbmZvKTogRGVjbGFyZS4KLQkqIGxleHN1cC5jIChPUFRJT05fQ1JFRik6IERlZmluZS4KLQkobGRfb3B0aW9ucyk6IEFkZCAiY3JlZiIuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgT1BUSU9OX0NSRUYuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCBsZGNyZWYuYy4KLQkoT0ZJTEVTKTogQWRkIGxkY3JlZi5vLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS1jcmVmLgotCi1UdWUgSnVuICA0IDEyOjEyOjI1IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE1ha2UgJCh0b29sZGlyKSBhbmQgJCh0b29sZGlyKS9iaW4uCi0KLUZyaSBNYXkgMzEgMTI6NDA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfc2VjdGlvbnMpOiBEb24ndCBhc3N1bWUgdGhhdCBhCi0Jd2lsZF9zdGF0ZW1lbnQgaGFzIGEgc2VjdGlvbiBuYW1lLgotCi1XZWQgTWF5IDI5IDEzOjEzOjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogUXVvdGUgdGVzdCAteiBhcmd1bWVudC4KLQotCSogbGQudGV4aW5mbzogQ2xhcmlmeSB0aGUgQ09OU1RSVUNUT1JTIGNvbW1hbmQuCi0KLVRodSBNYXkgMjMgMTY6MDc6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBJbml0aWFsaXplCi0JZmlsZSwgbm90IGltcGZpbGUuCi0KLVdlZCBNYXkgMjIgMTE6MzE6MzAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBEb24ndCBjb3B5IG92ZXIgU0VDX0xJTktfe09OQ0UsRFVQTElDQVRFU30KLQlpZiBmaW5hbCBsaW5rLgotCSogZW11bHRlbXBsL3BlLmVtIChzZnVuYyk6IFJlbmFtZWQgdG8gc29ydF9ieV9maWxlX25hbWUuCi0JKHNvcnRfYnlfc2VjdGlvbl9uYW1lLCBzb3J0X3NlY3Rpb25zXzEpOiBOZXcgZnVuY3Rpb25zLgotCShzb3J0X3NlY3Rpb25zKTogT25seSBzb3J0IGJ5IGZpbGUgbmFtZSBzZWN0aW9ucyBpbiAuaWRhdGEuCi0JQWRkICJHcm91cGVkIFNlY3Rpb25zIiBzdXBwb3J0LgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZXdyaXRlIHRvIHN1cHBvcnQgR3JvdXBlZAotCVNlY3Rpb25zLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogRGVsZXRlLgotCSogc2NyaXB0dGVtcGwvcGUuc2MgKC50ZXh0LC5kYXRhLC5yZGF0YSk6IEFkZCAqKC5mb29cJCkuCi0JKC5DUlQsLnJzcmMpOiBSZXdyaXRlIHRvIHVzZSBHcm91cGVkIFNlY3Rpb24gc3VwcG9ydC4KLQotVHVlIE1heSAyMSAxNDozMTo0OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1lcHBjbWFjLmM6IFVwZGF0ZSB0byByZWZsZWN0IGNoYW5nZXMgdG8gYWl4LmVtLgotCi1TdW4gTWF5IDE5IDE2OjU5OjQ0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoZHByaW50X3N0YXRlbWVudCk6IFN0b3AgcHJpbnRpbmcgYXQgZW5kIG9mIGxpc3QuCi0KLVNhdCBNYXkgMTggMTM6MTI6MDUgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIC0tZm9yY2UtZXhlLXN1ZmZpeAotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZvcmNlX2V4ZV9zdWZmaXguCi0JKiBsZC50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbi4KLQkqIGxkbWFpbi5jIChtYWluKTogIEFkZCBzdXBwb3J0IGZvciBvcHRpb24uCi0JKiBsZXhzdXAuYyAoT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVgpOiBOZXcuCi0JKGxkX29wdGlvbnMsIHBhcnNlX2FyZ3MpOiAgQWRkIHN1cHBvcnQgZm9yIG9wdGlvbi4KLQotV2VkIE1heSAxNSAxMjo1MDoyNSAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3ZhbHVlKTogUGFzcyAwIG5vdCAxNiB0byBzdHJ0b3VsIGNhbGwuCi0KLUZyaSBNYXkgMTAgMTY6Mjg6NDQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKF9fc3RhY2spOiBNYWtlIF9fc3RhY2sgMCBpZiBpdCB3YXMKLQlyZWZlcmVuY2VkIGJ1dCBub3QgZGVmaW5lZC4KLQotVGh1IE1heSAgOSAwODo1MjoyMyAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3tlbGYzMmJtaXAuc2gsZWxmMzJsbWlwLnNoLG1pcHNpZHQuc2gsbWlwc2lkdGwuc2h9OgotCVNldCBhIG5ldyB2YXJpYWJsZSB0byBzaWduaWZ5IGlmIHRoZSBmaW5hbCB0YXJnZXQgaXMgYW4gZW1iZWRkZWQKLQlzeXN0ZW0uCi0JKiBzY3JpcHR0ZW1wbC97bWlwcy5zYyxlbGZtaXBzLnNjfTogRG9uJ3QgYWRkIFNJWkVPRl9IRUFERVJTIHRvCi0JLnRleHQgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4KLQotVHVlIE1heSAgNyAxMDo1NjoxMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogTmV3IGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShob2xkX3tzZWN0aW9uLHVzZSx0ZXh0LHJkYXRhLGRhdGF9KTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVwZGF0ZSBvcnBoYW4gZmllbGQuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogV2hpdGVzcGFjZSBjbGVhbnVwLiAgU2VtaWNvbG9uIHVzYWdlIGNsZWFudXAuCi0JKElOSVQsRklOSSk6IERlbGV0ZSwgdW51c2VkLgotCSgudGV4dCk6IERvY3VtZW50IG9ycGhhbiAudGV4dC5mb28gc2VjdGlvbnMuCi0JKC5yZGF0YSk6IERvY3VtZW50IG9ycGhhbiAucmRhdGEuZm9vIHNlY3Rpb25zLgotCSguZGF0YSk6IERvY3VtZW50IG9ycGhhbiAuZGF0YS5mb28gc2VjdGlvbnMuCi0KLVR1ZSBNYXkgIDcgMTE6MzU6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogUGxhY2UgIi50aW55IiBzZWN0aW9ucyByaWdodAotCWFmdGVyICIuZGF0YSIgc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IFBsYWNlICIudGlueSIgc2VjdGlvbnMgaW50bwotCXRoZSAidGlueSIgbWVtb3J5IHJlZ2lvbiwgMHhmZjgwMDAgdGhyb3VnaCAweGZmZmYwMC4KLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IFNldCB0aGUgZW50cnkgcG9pbnQgdG8gdGhlIHZhbHVlIG9mCi0JIl9zdGFydCIgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogUGxhY2UgLnJvZGF0YSBzZWN0aW9ucyBiZWZvcmUgLnRleHQKLQlzZWN0aW9ucyBpbiBtYWluIHJhbS4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCi0KLU1vbiBNYXkgIDYgMjM6MzI6MzAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IFVzZSAiZWlnaHQiLCBub3QgImVpZ2h0Yml0IiBmb3IgdGhlCi0JOC1iaXQgcmVnaW9uIGFuZCA4LWJpdCBzZWN0aW9ucy4KLQotV2VkIE1heSAgMSAxNzo1MDowNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IEZpeCB0eXBvcy4KLQotTW9uIEFwciAyOSAyMDozMTowNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLmVuZGp1bmspOiBEZWZpbmUgX19lbmRfXy4KLQotTW9uIEFwciAyOSAxNzowNToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsb25nZXN0X3NlY3Rpb25fbmFtZSk6IFJlbW92ZS4KLQkoU0VDVElPTl9OQU1FX01BUF9MRU5HVEgpOiBEZWZpbmUuCi0JKHByaW50X3NpemUsIHByaW50X2FsaWdubWVudCwgcHJpbnRfZmlsbCwgcHJpbnRfc2VjdGlvbik6IFJlbW92ZS4KLQkocHJpbnRfZmxhZ3MpOiBSZW1vdmUuCi0JKGxhbmdfbWFwKTogUmV3cml0ZS4KLQkocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfYXNzaWdubWVudCk6IFJld3JpdGUuCi0JKHByaW50X29uZV9zeW1ib2wpOiBSZXdyaXRlLgotCShwcmludF9pbnB1dF9zZWN0aW9uKTogUmV3cml0ZS4KLQkocHJpbnRfZmlsbF9zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF9kYXRhX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X2FkZHJlc3Nfc3RhdGVtZW50KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfcmVsb2Nfc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF93aWxkX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X3N0YXRlbWVudF9saXN0KTogQ2xlYW4gdXAuCi0JKHByaW50X3N0YXRlbWVudCk6IENsZWFuIHVwLiAgU29tZSBtaW5vciBvdXRwdXQgY2hhbmdlcy4KLQkocHJpbnRfc3RhdGVtZW50cyk6IENsZWFuIHVwLgotCShsb2FkX3N5bWJvbHMpOiBQdXQgYW5vdGhlciAtIGJlZm9yZSAtd2hvbGUtYXJjaGl2ZS4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90cmVlKTogQ2hhbmdlIGV0cmVlX3ZhbHVlIGFuZCBldHJlZV9yZWwgdG8KLQlwcmludCAweCBhbmQgdG8gb21pdCBsZWFkaW5nIHplcm9lcy4gIEZvciBldHJlZV9yZWwsIHVzZSAlQiB0bwotCXByaW50IHRoZSBCRkQuICBGb3IgZXRyZWVfYXNzaWduLCByZW1vdmUgdGhlIHNwYWNlIGFmdGVyIHRoZQotCWRlc3RpbmF0aW9uIG5hbWUuCi0JKiBsZHdyaXRlLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoY2xvbmVfc2VjdGlvbik6IENhbGwgeHN0cmR1cCwgbm90IHN0cmR1cC4KLQkobGR3cml0ZSk6IERvbid0IHByaW50IGFueSBtYXAgaW5mb3JtYXRpb24uCi0JKHByaW50X3N5bWJvbF90YWJsZSwgcHJpbnRfZmlsZV9zdHVmZiwgcHJpbnRfc3ltYm9sKTogUmVtb3ZlLgotCSogbGRtYWluLmMgKG1haW4pOiBDYWxsIGxhbmdfbWFwIHdoZW4gYXBwcm9wcmlhdGUuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQWRkIHN1cHBvcnQgZm9yICVXLgotCShwcmludF9hZGRyZXNzKTogUmVtb3ZlLgotCSogbGRtaXNjLmggKHByaW50X2FkZHJlc3MpOiBEb24ndCBkZWNsYXJlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1Nb24gQXByIDI5IDEwOjI5OjA3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki0qLWxpbnV4Kik6IEFkZCAtZHluYW1pYy1saW5rZXIgdG8KLSAJSE9TVElOR19DUlQwLiAgU2VhcmNoIC1sZ2NjIGJvdGggYmVmb3JlIGFuZCBhZnRlciAtbGMgaW4KLSAJSE9TVElOR19MSUJTLiAgTG9vayBmb3IgY3J0e2JlZ2luLGVuZH0ubyBpbiB0aGUgY29tcGlsZXIgZGlyZWN0b3J5Ci0gCWF0IGZpcnN0LgotCShpWzM0NV04Ni0qLWxpbnV4Kik6IExvb2sgZm9yIGNydHtiZWdpbixlbmR9Lm8gaW4gdGhlIGNvbXBpbGVyCi0JZGlyZWN0b3J5IGF0IGZpcnN0LgotCi1GcmkgQXByIDI2IDE0OjQyOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtaXNjLmggKGRlbWFuZ2xlKTogRGVjbGFyZS4KLQkqIGxkbWlzYy5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuICBJbmNsdWRlIGRlbWFuZ2xlLmggd2l0aCAiIiwKLSAJbm90IDw+LgotCShkZW1hbmdsZSk6IE1ha2Ugbm9uLXN0YXRpYy4gIFJlbW92ZSByZW1vdmVfdW5kZXJzY29yZSBwYXJhbXRlci4KLQlBbHdheXMgcmV0dXJuIGFuIGFsbG9jYXRlZCBzdHJpbmcuCi0JKHZmaW5mbyk6IEZyZWUgcmVzdWx0IG9mIGRlbWFuZ2xlLiAgQWRkIGNhc2UgJ0cnLiAgVXNlICVUIHRvIHByaW50Ci0JZnVuY3Rpb25uYW1lLCByYXRoZXIgdGhhbiBjYWxsaW5nIGRlbWFuZ2xlLiAgUHJpbnQgYSBjb2xvbiBiZXR3ZWVuCi0JdGhlIEJGRChzZWN0aW9uK29mZnNldCkgYW5kIHRoZSBsaW5lIG51bWJlci4KLQkqIGxkbWFpbi5jIChhZGRfYXJjaGl2ZV9lbGVtZW50KTogSW1wcm92ZSBmb3JtYXQgb2YgYXJjaGl2ZQotCWluZm9ybWF0aW9uIGluIG1hcCBmaWxlLgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IERvbid0IHByaW50IGFueXRoaW5nIHRvIHRoZSBtYXAgZmlsZS4KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBJbXByb3ZlIGZvcm1hdCBvZiBjb21tb24gc3ltYm9sCi0JaW5mb3JtYXRpb24gaW4gbWFwIGZpbGUuCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBJZiBwcm9kdWNpbmcgYSBtYXAgZmlsZSwgcHJpbnQgc2V0Ci0JaW5mb3JtYXRpb24uCi0JKiBsZHdyaXRlLmMgKHByaW50X3N5bWJvbF90YWJsZSk6IFByaW50IGEgbmV3bGluZSBiZWZvcmUgdGhlCi0JaGVhZGVyIGluIHRoZSBtYXAgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IFJlaW5kZW50LgotCi1Nb24gQXByIDIyIDEyOjA3OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIF9jb29rZWRfc2l6ZSBpcyBub3QgMCwgdGhlbgotCWRvbid0IGNsb2JiZXIgaXQgd2hlbiBub3QgcmVsYXhpbmcuCi0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogUmVtb3ZlIHRyYWRpdGlvbmFsX2Zvcm1hdCBmaWVsZC4KLQkqIGxkbWFpbi5jIChtYWluKTogVXNlIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgcmF0aGVyIHRoYW4KLQljb25maWcudHJhZGl0aW9uYWxfZm9ybWF0LgotCSogbGRsYW5nLmMgKGxkbGFuZ19vcGVuX291dHB1dCk6IExpa2V3aXNlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIG1wdy1lcHBjbWFjLmMgKGdsZHBwY21hY29zX3BhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IERpc2NhcmQgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHdlIGFyZQotCXN0cmlwcGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLQkqIGVtdWxwYXJhbXMvejgwMDIuc2ggKEFSQ0gpOiBTZXQgdG8gejgwMDIsIG5vdCB6OGsuCi0KLVR1ZSBBcHIgMTYgMTY6Mzg6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IENvcnJlY3QgaGFuZGxpbmcgb2Ygc3VidHJhY3Rpb24gd2l0aAotCWFic29sdXRlIHZhbHVlcy4KLQkoZm9sZF9uYW1lKTogUGVybWl0IHN5bWJvbHMgaW4gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0uCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IE9ubHkgUFJPVklERSBfX3N0YWNrIHdoZW4gUkVMT0NBVElORy4gIFVuZG8KLQlhY2NpZGVudGFsIGNoYW5nZXMgaW4gbGFzdCBwYXRjaC4KLQotVHVlIEFwciAxNiAxMDoyNTo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMqLSote3N5c3YsbGludXh9KTogQWRkIGFsaWFzZXMuCi0JKHBvd2VycGNsZSotKi17c3lzdixzb2xhcmlzfSk6IERpdHRvLgotCi1Nb24gQXByIDE1IDE0OjUwOjU2IDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IEFkZCBQUk9WSURFIChfX3N0YWNrID0gMCkgc28gSSBjYW4gdXNlIGl0Ci0JaW4gbTY4ay9jcnQwLlMgd2l0aG91dCB0aGluZ3MgYmxvd2luZyB1cC4KLQotRnJpIEFwciAxMiAxNjo0MDo1NiAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogUmVtb3ZlIGRlZmF1bHQgYWRkcmVzcyBmb3IgLmRhdGEgc28KLQkudGV4dCwgLmRhdGEsIGFuZCAuYnNzIGFyZSBhbGwgc2VxdWVudGlhbC4KLQotVGh1IEFwciAxMSAxMjowNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBSZW1vdmUgcmVnaW9ucyBhbmQgc2ltcGxpZnkuCi0KLVdlZCBBcHIgMTAgMTQ6NDE6NTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogQWRkIHRoZSAiOC1iaXQgYXJlYSIgaW4gdGhlIHVwcGVyIDI1NgotCWJ5dGVzIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiAgUHV0IGRhdGEgZnJvbSB0aGUgIi5laWdodCIgc2VjdGlvbnMKLQlpbnRvIHRoZSA4LWJpdCBhcmVhLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotVHVlIEFwciAgOSAxNDoxMDo0MiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKToKLQlQYXNzICRBUkNIIHRvIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggaW5zdGVhZCBvZiBzZXR0aW5nCi0JbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgZGlyZWN0bHkuCi0KLVR1ZSBBcHIgIDkgMTQ6MjI6MTUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKC5pbml0LC5maW5pKTogUHV0IC5pbml0LCAuZmluaSBzZWN0aW9uCi0JbmV4dCB0byAudGV4dC4gIFB1dCBfZXRleHQgYWZ0ZXIgLnRleHQsIC5pbml0LCAuZmluaSwgYW5kCi0JLnJvZGF0YXssMn0gc2VjdGlvbnMuCi0KLVR1ZSBBcHIgIDkgMTI6MTg6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBSZWFycmFuZ2Ugb3B0aW9uIGRvY3VtZW50YXRpb24uCi0KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocGFyc2VfYXJncyk6IEJ1aWxkIHNob3J0b3B0cyBhbmQgbG9uZ29wdHMgZnJvbSBsZF9vcHRpb25zIGFycmF5LgotCShoZWxwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGxkdmVyLmggKGhlbHApOiBEb24ndCBkZWNsYXJlLgotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogUmVpbmRlbnQuCi0JKGhlbHApOiBSZW1vdmUuCi0KLQkqIGxkLnRleGluZm8sIGxkLjE6IE1lbnRpb24gLUUgYXMgYSBzeW5vbnltIGZvciAtZXhwb3J0LWR5bmFtaWMuCi0KLU1vbiBBcHIgIDggMTE6NTY6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IFdoZW4gY2hlY2tpbmcgZm9yIGEgbmF0aXZlIGVtdWxhdGlvbiwgY2hlY2sKLQl0aGF0IHRoZSBjdXJyZW50IGVtdWxhdGlvbiBpcyB0aGUgZGVmYXVsdCBlbXVsYXRpb24uCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IExpa2V3aXNlLgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgLUUgYXMgYSBzeW5vbnltIGZvciAtZXhwb3J0LWR5bmFtaWMsCi0JZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkuCi0KLUZyaSBBcHIgIDUgMTQ6MzA6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYpOiBOZXcKLQlzdGF0aWMgZnVuY3Rpb24sIGlmICR7aG9zdH0gPSAke3RhcmdldH0uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBDYWxsIGNoZWNrX2xkX3NvX2NvbmYgdG8gZmluZCBhCi0JbmVlZGVkIHNoYXJlZCBsaWJyYXJ5IGlmICR7aG9zdH0gPSAkW3RhcmdldH0uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLWxpbnV4Kik6IEFkZCAtZHluYW1pYy1saW5rZXIgdG8KLQlIT1NUSU5HX0NSVDAuICBTZWFyY2ggLWxnY2MgYm90aCBiZWZvcmUgYW5kIGFmdGVyIC1sYyBpbgotCUhPU1RJTkdfTElCUy4KLQotCSogY29uZmlndXJlLnRndDogQWRkIGlbMzQ1XTg2LSotZnJlZWJzZGVsZiogdGFyZ2V0OyBmcm9tIEpvaG4KLQlQb2xzdHJhIDxqZHBAcG9sc3RyYS5jb20+LgotCi1GcmkgQXByICA1IDE4OjExOjI1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZW11bHBhcmFtcy9lbGYzMntiLGx9NDMwMC5zaCAoTUFDSElORSk6IEFkZCBleHBsaWNpdAotIAlhcmNoaXRlY3R1cmUgbnVtYmVyLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgJE1BQ0hJTkUgZGVmaW5pdGlvbiBpZiBwcmVzZW50LgotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEZvcmNlIDQxMDAgYnVpbGQgdG8gdXNlIHNhbWUKLSAJdGVtcGxhdGUgYXMgNDMwMC4KLQotTW9uIEFwciAgMSAxNzozNTo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDaGFuZ2UgcmVnaW9uIGNoZWNrIHRvIGhhbmRsZQotCXJlZ2lvbnMgd2hpY2ggZW5kIGF0IHRoZSBoaWdoZXN0IHBvc3NpYmxlIGFkZHJlc3MgY29ycmVjdGx5LgotCUZyb20gUm9sYW5kIFdlYmVyIDxyb3dlYmVyQGlyYS51a2EuZGU+LgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHdpbGRfZG9pdCk6IERpc2NhcmQgc2VjdGlvbnMgd2l0aCBTRUNfRVhDTFVERSBzZXQgaWYgbm90IGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluay4gIERvbid0IHdvcnJ5IGFib3V0IHNlY3Rpb24gYmVpbmcgTlVMTCwgc2luY2UgaXQKLQluZXZlciBzaG91bGQgYmUuICBEb24ndCBjYWxsIGluaXRfb3MgdW5sZXNzIHRoZSBzZWN0aW9uIGlzIGdvaW5nCi0JdG8gYmUgYWRkZWQuCi0JKGxkbGFuZ19hZGRfZmlsZSk6IENhbGwgc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCBmb3IgZWFjaCBzZWN0aW9uLgotCSogbGRtYWluLmMgKG11bHRpcGxlX2RlZmluaXRpb24pOiBEb24ndCB3YXJuIGFib3V0IG11bHRpcGxlCi0JZGVmaW5pdGlvbnMgaW4gc2VjdGlvbnMgd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4KLQotU3VuIE1hciAzMSAwMDozMDo0NyAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC97cHBjcGUuc2MsIHBlLnNjfSAoLmp1bmspOiBSZW1vdmUgYW5kIHVzZSAvRElTQ0FSRC8uCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGluaXQpOiBSZW1vdmUgc3BlY2lhbCBjYXNlIFBQQyBjb2RlLgotCi1GcmkgTWFyIDI5IDAwOjAxOjI5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IE1ha2UgdmVjdG9ycyBzZWN0aW9uIDB4YzQgYnl0ZXMgbG9uZwotCXNvIGFzIG5vdCB0byBvdmVyd3JpdGUgdGhlIG1hZ2ljIHN5c2NhbGwgZW50cnkgYXQgMHhjNC4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjggMTE6MDU6NDcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmM2NC0qLXNvbGFyaXMyKik6IERlbGV0ZS4KLQlTdGljayB3aXRoIHNwYXJjLSotc29sYXJpczIqLgotCi1XZWQgTWFyIDI3IDEyOjMzOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoRElTQ0FSRF9TRUNUSU9OX05BTUUpOiBEZWZpbmUgdG8gIi9ESVNDQVJELyIuCi0JKiBsZGxhbmcuYyAoaW5pdF9vcyk6IEZhaWwgb24gYW4gYXR0ZW1wdCB0byBpbml0aWFsaXplIGFueSBzZWN0aW9uCi0JbmFtZWQgRElTQ0FSRF9TRUNUSU9OX05BTUUuCi0JKHdpbGRfZG9pdCk6IERpc2NhcmQgaW5wdXQgc2VjdGlvbnMgYXNzaWduZWQgdG8gYW4gb3V0cHV0IHNlY3Rpb24KLQluYW1lZCBESVNDQVJEX1NFQ1RJT05fTkFNRS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHVzZSBvZiAvRElTQ0FSRC8uCi0KLQkqIGxkbGFuZy5jOiBGaXggc29tZSBpbmRlbnRhdGlvbiBhbmQgY29tbWVudHMuCi0KLVR1ZSBNYXIgMjYgMTg6MTQ6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUuCi0KLVRodSBNYXIgMjEgMTM6MTc6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBGaXggYSBjb3VwbGUgb2YgaW5kZXhpbmcgZW50cmllcy4gIE1lbnRpb24gdGhhdAotCS0tdmVyYm9zZSBkaXNwbGF5cyBidWlsdGluIGxpbmtlciBzY3JpcHRzLgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogY2FzZSAnSSc6IElmIHRoZSBmaWxlIGlzIG5vdCBpbiBhbiBhcmNoaXZlLAotCWFuZCB0aGUgbG9jYWwgc3ltYm9sIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIGZpbGVuYW1lLCBwcmludCB0aGUKLQlmaWxlbmFtZSBhcyB3ZWxsLgotCi0JUGF0Y2hlcyBmcm9tIEpvaG4gUG9sc3RyYSA8amRwQHBvbHN0cmEuY29tPiBmb3IgRnJlZUJTRCBFTEY6Ci0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IC1Cc2hhcmVhYmxlIGlzIGEgc3lub255bSBmb3IgLXNoYXJlZC4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IE1ha2UgdGhlIHNhbWUKLQlhcyBURVhUX1NUQVJUX0FERFIuCi0KLVdlZCBNYXIgMjAgMTg6MTg6MjUgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLnRleGluZm86IEZpeCB0eXBvcy4gIFVzZSBAcHhyZWYgb25seSBpbnNpZGUgcGFyZW50aGVzZXMuCi0KLVdlZCBNYXIgMjAgMTY6NTY6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAoYWRkX3dyYXApOiBOZXcgZnVuY3Rpb24uCi0JKiBsZG1haW4uaCAoYWRkX3dyYXApOiBEZWNsYXJlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBDYWxsIGFkZF93cmFwLgotCi1UdWUgTWFyIDE5IDE2OjQ0OjIwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYyotKi1zb2xhcmlzMiogaG9zdCk6IEFjY2VwdCBhbnkgc3BhcmMgdmFyaWFudC4KLQotV2VkIE1hciAxMyAxNzo0NzozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBDaGFuZ2UgbmFtZSBvZiBwYWdlIHplcm8gbWVtb3J5Ci0JZnJvbSAibnVsbCIgdG8gInZlY3RvcnMiLiAgQ3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIGZvcgotCXZlY3RvcnMuICBBZGQgY29tbWVudHMgb24gaG93IHRvIGV4cGxpY2l0bHkgcGxhY2UgaXRlbXMKLQlpbiB0aGUgdmVjdG9yIHRhYmxlLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotV2VkIE1hciAxMyAxMjo0MDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9sbms5NjAuZW0gKG1hY2hpbmVfdGFibGUpOiBBZGQganggYW5kIGh4LgotCi0JKiBnZW5zY3JpcHRzLnNoOiBEb24ndCB1c2UgJHs5Oi14eH0sIHNpbmNlIFVsdHJpeCAvYmluL3NoIGRvZXNuJ3QKLQlzdXBwb3J0IGl0LgotCi1UdWUgTWFyIDEyIDEyOjQzOjU5IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGtvYWxhLmF6c3Rhcm5ldC5jb20+Ci0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIHdhcm5fbXVsdGlwbGVfZ3AgZmllbGQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtLXdhcm4tbXVsdGlwbGUtZ3AuCi0JKiBsZG1haW4uYyAod2FybmluZ19jYWxsYmFjayk6IFN1cHByZXNzIG11bHRpcGxlIGdwIHZhbHVlcyB3YXJuaW5nCi0JaWYgLS13YXJuX211bHRpcGxlX2dwIHdhcyBub3QgdXNlZC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0td2Fybi1tdWx0aXBsZS1ncC4KLQotVHVlIE1hciAxMiAxMjowMjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0td3JhcC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBsaW5rX2luZm8ud3JhcF9oYXNoLgotCSogbGRleHAuYyAoZm9sZF9uYW1lKTogVXNlIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgaW4gREVGSU5FRAotCWFuZCBOQU1FIGNhc2VzLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13cmFwLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLQlEb24ndCBkbyBTdW5PUyBzdHlsZSBkeW5hbWljIGxpbmtpbmcgZm9yIHNwYXJjLWFvdXQ6Ci0JKiBjb25maWd1cmUudGd0IChzcGFyYzY0LSotYW91dCopOiBVc2Ugc3BhcmNhb3V0LCBub3Qgc3VuNC4KLQkoc3BhcmNsaXRlKi1mdWppdHN1LSosIHNwYXJjKi0qLWFvdXQpOiBMaWtld2lzZS4KLQkoc3BhcmMqLXdycy12eHdvcmtzKik6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9zcGFyY2FvdXQuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVzcGFyY2FvdXQuby4KLQkoZXNwYXJjYW91dC5jKTogTmV3IHRhcmdldC4KLQotV2VkIE1hciAgNiAxNjowNjo1MiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLnNkYXRhMiwgLnNic3MyKTogSW1wbGVtZW50IEZlYiAyIGNoYW5nZQotIAlpbiBhIGRpZmZlcmVudCBtYW5uZXIgdG8gd29yayBhcm91bmQgZGlmZmVyZW5jZXMgaW4gc2hlbGwgdmFyaWFibGUKLSAJZXhwYW5zaW9uLgotCi1XZWQgTWFyICA2IDE4OjA4OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmggKGxkZW11bF91bnJlY29nbml6ZWRfZmlsZSk6IERlY2xhcmUuCi0JKGxkZW11bGF0aW9uX3hmZXJfdHlwZSk6IEFkZCB1bnJlY29nbml6ZWRfZmlsZSBmaWVsZC4KLQkqIGxkZW11bC5jIChsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogSWYgYSBmaWxlIGNhbiBub3QgYmUgcmVjb2duaXplZCwgY2FsbAotCWxkZW11bF91bnJlY29nbml6ZWRfZmlsZSBiZWZvcmUgdHJ5aW5nIGl0IGFzIGEgbGlua2VyIHNjcmlwdC4KLQkqIGFpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUpOiBOZXcgc3RhdGljCi0JZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IFVzZSBGT1BFTl9SVCwgbm90ICJyIi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogSW5pdGlhbGl6ZSB1bnJlY29nbml6ZWRfZmlsZS4KLQotTW9uIE1hciAgNCAxNDoxMToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkKTogSGFuZGxlIGZvby5hKC50ZXh0KSBieSBtYXBwaW5nIGVhY2ggaW5jbHVkZWQKLQltZW1iZXIgb2YgZm9vLmEgc2VwYXJhdGVseS4gIEZyb20gSm91a2UgTnVtYW4gPGpudW1hbkBiYXppcy5ubD4uCi0KLUZyaSBNYXIgIDEgMTA6MjQ6NTkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCk6Ci0JU2VhcmNoIHRyaW5hcnkuY29uZCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdHJpbmFyeS5saHMgdHdpY2UuCi0KLVR1ZSBGZWIgMjcgMTU6MDg6NDMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0JKEBURElSU0ApOiBFZGl0IG91dCwgY2FuJ3QgdXNlIGdlbnNjcmlwdHMuCi0KLVR1ZSBGZWIgMjcgMTU6MDk6MjEgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OGstKi1saW51eGFvdXQqLCBtNjhrLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBlbXVscGFyYW1zL202OGtsaW51eC5zaDogTmV3IGZpbGUuCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlDYWxsIGJmZF8ke0VNVUxBVElPTl9OQU1FfV9zaXplX2R5bmFtaWNfc2VjdGlvbnMgaW5zdGVhZCBvZgotCWJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW02OGtsaW51eC5vLgotCShlbTY4a2xpbnV4LmMpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKG02OCotKi1saW51eGFvdXQqLCBtNjgqLSotbGludXgqKTogTmV3IGhvc3RzLgotCi1UdWUgRmViIDI3IDEyOjU1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogU29ydCBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4KLQlGaWxsIGluIG1pc3NpbmcgZW50cmllcy4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLS1uby13aG9sZS1hcmNoaXZlLgotCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBBZGQgd2hvbGVfYXJjaGl2ZSBmaWVsZC4KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBTZXQgd2hvbGVfYXJjaGl2ZSBmaWVsZC4KLQkobG9hZF9zeW1ib2xzKTogQ2hlY2sgaW5wdXQgZmlsZSBzcGVjaWZpYyB3aG9sZV9hcmNoaXZlIGZpZWxkCi0JcmF0aGVyIHRoYW4gZ2xvYmFsIHZhcmlhYmxlLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS1uby13aG9sZS1hcmNoaXZlLgotCi1UdWUgRmViIDIwIDE2OjA3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogQ29ycmVjdCBnbGRpOTYwIHRvIGdsZDk2MC4KLQotTW9uIEZlYiAxOSAxMToxNjo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTogQ2hlY2sKLQl0aGUgU09OQU1FIGlmIGl0IGlzIGF2YWlsYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOiBVc2UgdGhlIFNPTkFNRSwgbm90IHRoZQotCWZpbGVuYW1lLCB3aGVuIGNoZWNraW5nIGZvciBjb25mbGljdGluZyBsaWJyYXJ5IHZlcnNpb25zLiAgRG9uJ3QKLQlhc3N1bWUgdGhhdCB0aGUgc3VmZml4IGlzIG9ubHkgbnVtYmVycyBhbmQgZG90cy4KLQotCSogbGQudGV4aW5mbzogTWVudGlvbiB0aGF0IC1SIGNhbiBiZSB1c2VkIGZvciAtcnBhdGguCi0KLVN1biBGZWIgMTggMTU6MDU6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogQ2hlY2sgZm9yICdkbyBub3QgbWl4JyBmcm9tIG5hdGl2ZSBsaW5rZXIgYmVmb3JlCi0JdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0KLVRodSBGZWIgMTUgMTM6NTg6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBleHBsaWNpdCBzdWJzdGl0dXRpb24gb2YgQ0ZMQUdTOyBhdXRvY29uZgotCWRvZXMgaXQgYW55aG93LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKExERkxBR1MpOiBTZXQgdG8gQExERkxBR1NALgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQyBiZWZvcmUgY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogUmVtb3ZlIGdvMzIgaG9zdCwgc2luY2UgaXQgc2hvdWxkIG5vIGxvbmdlciBiZQotCW5lY2Vzc2FyeS4gIERvbid0IHNldCBDQyBmb3Igcm9tcCBob3N0LgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IERvbid0IHNraXAgYSBwYWdlIGluIHZpcnR1YWwgbWVtb3J5IHNwYWNlIGlmCi0JdGhlIHRleHQgc2VnbWVudCBlbmRzIGV4YWN0bHkgb24gYSBwYWdlIGJvdW5kYXJ5LgotCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgUlBBVEhfRU5WVkFSLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IFNldCBSUEFUSF9FTlZWQVIuCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShjaGVjayk6IFVzZSAkKFJQQVRIX0VOVlZBUikgcmF0aGVyIHRoYW4gTERfTElCUkFSWV9QQVRILgotCi1XZWQgRmViIDE0IDE4OjQ5OjAxIDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlndXJlLmluOiBSZWRvIGVtdWxhdGlvbiBoYW5kbGluZyBzbyB0aGF0IGVhY2ggZW11bGF0aW9uCi0Jc2VhcmNoZXMgdGhlIGNvcnJlY3QgdG9vbCBkaXJlY3RvcnksIGJhc2VkIG9uIHRoZSB0YXJnZXQgYWxpYXMuCi0JRm9yIGV4YW1wbGUsICJjb25maWd1cmUgLS1lbmFibGUtdGFyZ2V0cz1tNjhrLWNvZmYgaTM4Ni1saW51eCIKLQl3aWxsIHNlYXJjaCAvdXNyL2xvY2FsL2kzODYtbGludXgvbGliIGZvciBsaW51eCBhbmQKLQkvdXNyL2xvY2FsL202OGstY29mZi9saWIgZm9yIG02OGstY29mZi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzcGVjaWFsIHRkaXIgc2V0dGluZ3MgZm9yIExpbnV4LgotCSogTWFrZWZpbGUuaW46IEFkZCBAVERJUlNALiAgUGFzcyAiJCh0ZGlyX0VNVUwpIiB0byAke0dFTlNDUklQVFN9Ci0JZm9yIGVhY2ggZUVNVUwuYyB0YXJnZXQuCi0JKiBnZW5zY3JpcHRzLnNoOiBBY2NlcHQgc3BlY2lmaWMgYWxpYXMgYXMgOXRoIGFyZ3VtZW50LCBhbmQgdXNlIGl0Ci0JaW4gTElCX1BBVEguCi0KLVdlZCBGZWIgMTQgMTY6Mzg6MzYgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2V0X3N0YXJ0b2YpOiBEb24ndCBkbyBhbnl0aGluZyBmb3IgYQotCXJlbG9jYXRlYWJsZSBsaW5rLgotCi0JKiBsZGdyYW0ueSAobXJpX3NjcmlwdF9maWxlKTogQ2FsbCBtcmlfZHJhd190cmVlLgotCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBEb24ndCBib3RoZXIgdG8KLQljcmVhdGUgbWVtb3J5IHJlZ2lvbnMuCi0JKG1yaV9sb2FkKTogRG9uJ3QgY2FsbCBtcmlfZHJhd190cmVlLgotCSogbXJpLmggKG1yaV9kcmF3X3RyZWUpOiBEZWNsYXJlLgotCi0JKiBjb25maWd1cmUudGd0IChtNjgqLSotcHNvcyk6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL202OGtwc29zLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3Bzb3Muc2M6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtNjhrcHNvcy5vLgotCShlbTY4a3Bzb3MuYyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBGZWIgMTQgMTE6MDk6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICgqLSotaWVlZSopOiBOZXcgdGFyZ2V0OyB1c2UgdmFuaWxsYS4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOiBTdHJpcAotCWA6Zm9vJyBmcm9tICR7QVJDSH0uCi0KLVR1ZSBGZWIgMTMgMTU6NTg6NTggMTk5NiAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBzbmFrZS5jcy51dGFoLmVkdT4KLQotCSogc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjOiBEb24ndCBwYWQgdGhlIC50ZXh0IHNlY3Rpb24uICBQdXQKLQkucm9kYXRhIGluIC5kYXRhLgotCi1UdWUgRmViIDEzIDE0OjA0OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOiBXYXJuIGlmCi0JaXQgbG9va3MgbGlrZSB3ZSBtaWdodCBiZSBsaW5raW5nIGluIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlCi0Jc2FtZSBzaGFyZWQgbGlicmFyeS4gIEJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBIIEogTHUgPGhqbEB6b29tLmNvbT4uCi0KLVRodSBGZWIgIDggMTk6MjU6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgd2hlbiBhCi0JcGFkZGluZyBzdGF0ZW1lbnQgaXMgZW5jb3VudGVyZWQuCi0KLVdlZCBGZWIgIDcgMTQ6MDE6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IExvb2sgZm9yIC0tZW5hYmxlLXNoYXJlZC4gIENoYW5nZSB0aGUgdmFsdWUgb2YKLQlCRkRMSUIgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSBvbiBTdW5PUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBJZiB1c2luZyBhIHNoYXJlZCBCRkQgbGlicmFyeSwgdHJ5IHRvIHBhc3MgYQotCXJlYXNvbmFibGUgLXJwYXRoIG9wdGlvbiB3aGVuIGxpbmtpbmcuCi0JKiBNYWtlZmlsZS5pbiAoQkZETElCKTogU2V0IHRvIEBCRkRMSUJALgotCi1UdWUgRmViICA2IDEyOjI5OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChBUkNIKTogQ2hhbmdlIHRvIGBzcGFyYzp2OScuCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbTogU3RyaXAgYDpmb28nIGZyb20gJHtBUkNIfS4KLQotTW9uIEZlYiAgNSAxNjoyNTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KLQlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluIChITERGTEFHUyk6IE5ldyBzdWJzdGl0dXRpb24uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhMREZMQUdTIG9uIFN1bk9TLgotCSogTWFrZWZpbGUuaW4gKEhMREZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShCRkRERVApOiBOZXcgdmFyaWFibGUuCi0JKEJGRExJQik6IENoYW5nZSB0byAtTC4uL2JmZCAtbGJmZC4KLQkoJChMRF9QUk9HKSk6IERlcGVuZCB1cG9uICQoQkZEREVQKSByYXRoZXJuIHRoYW4gJChCRkRMSUIpLiAgVXNlCi0JJChITERGTEFHUykgaW4gbGluay4KLQkoY2hlY2spOiBTZXQgTERfTElCUkFSWV9QQVRIIGluIHRoZSBlbnZpcm9ubWVudC4KLQotRnJpIEZlYiAgMiAxOToyNjoyNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKC5zZGF0YTIsIC5zYnNzMik6IFB1dCAuc2RhdGEyIGFuZCAuc2JzcwotCWluIHRoZSByZWFkLW9ubHkgc2VjdGlvbiwgbm90IHJlYWQvd3JpdGUgdW5sZXNzIHdlIGFyZSBtYWtpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LgotCSguZGVidWcqKTogQWRkIGR3YXJmIGRlYnVnIHNlY3Rpb25zLgotCSgucmVsYS57c2RhdGEqLHNic3MqfSk6IEFkZCBzZWN0aW9ucy4KLQotRnJpIEZlYiAgMiAxNjo1MDoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAgMSAxMDo1MDo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKFRFWFRfU1RBUlRfQUREUik6IENoYW5nZSB0byAweDgwNDgwMDAsCi0JZm9yIFNWUjQgY29tcGF0aWJpbGl0eS4KLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IENvcnJlY3QgaGFuZGxpbmcgb2YgQUJTT0xVVEUuCi0KLVdlZCBKYW4gMzEgMTc6MzA6MTkgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDVdODYtKi1jeWd3aW4zMiwgcG93ZXJwY2xlLSotY3lnd2luMzIpOiBOZXcuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGRlZmluZm8gaW5pdCk6IE1ha2UgdGhlIGRlZmF1bHQgc3RhY2sgcmVzZXJ2ZQotCW9mIGEgUFBDIGxhcmdlci4KLQotV2VkIEphbiAzMSAxNDozNDoyMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlndXJlLnRndCAobTY4Ki1hcHBsZS1hdXgqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvbTY4a2F1eC5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9tNjhrYXV4LnNjOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbTY4a2F1eC5vLgotCShlbTY4a2F1eC5jKTogTmV3IHRhcmdldC4KLQotVHVlIEphbiAzMCAxMzoxODo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBJZ25vcmUKLQktYm5vZW50cnksIHNpbmNlIHRoZSByaWdodCB0aGluZyB0ZW5kcyB0byBoYXBwZW4gYW55aG93LgotCi1Nb24gSmFuIDI5IDEyOjI5OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLWV4cG9ydC1keW5hbWljLgotCi1GcmkgSmFuIDI2IDExOjExOjU1IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IENoZWNrIGZvciBuYXRpdmUgY29tcGlsZSBieSBjb21wYXJpbmcKLQkke3RhcmdldH0gYW5kICR7aG9zdH0uCi0KLVRodSBKYW4gMjUgMTY6NDY6NTggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL3tlbGYzMmI0MzAwLnNoLCBlbGYzMmw0MzAwLnNofTogQ2hhbmdlZAotIAlURVhUX1NUQVJUX0FERFIgdG8gYWxsb3cgdXNlIG9uIElEVCBhbmQgUE1PTiBzeXN0ZW1zLgotCi1XZWQgSmFuIDI0IDIwOjU5OjQwIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOgotCWNvcnJlY3Qgc3BlbGxpbmcuCi0KLVdlZCBKYW4gMjQgMTY6NTk6MTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjNjQtKi1zb2xhcmlzMiopOiBOZXcgY29uZmlndXJhdGlvbi4KLQkoc3BhcmM2NC0qLWFvdXQqKTogUmVuYW1lZCBmcm9tIHNwYXJjNjQqLgotCi1Nb24gSmFuIDIyIDEzOjAxOjM1IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoR0VOU0NSSVBUUyk6IFBhc3MgQGhvc3RAIEB0YXJnZXRAIEB0YXJnZXRfYWxpYXNALgotCSogZ2Vuc2NyaXB0cy5zaDogU2V0IGhvc3QsIHRhcmdldCBhbmQgdGFyZ2V0X2FsaWFzIHZhcmlhYmxlcy4KLQlDaGVjayBmb3IgbmF0aXZlIGNvbXBpbGUgYnkgY29tcGFyaW5nICR7dGFyZ2V0fSBhbmQgJHtob3N0fS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBUZXN0ICR7dGFyZ2V0fSwgbm90ICR7dGFyZ2V0X2FsaWFzfS4KLQotTW9uIEphbiAyMiAxMTowMzoyMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogUmVmaW5lIGVhYmkgc3VwcG9ydCB0byBiZXR0ZXIgc3VwcG9ydAotCS5zZGF0YSwgLnNkYXRhMiwgLnNic3MsIGV0Yy4gc2VjdGlvbnMuCi0KLVR1ZSBKYW4gMTYgMTU6MTY6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoJXVuaW9uKTogQWRkIHBoZHIgZmllbGQuCi0JKHBoZHIpOiBVc2UgcGhkcl9xdWFsaWZpZXJzIHJhdGhlciB0aGFuIG9wdF9oZHJzIGFuZCBvcHRfYXQuCi0JKHBoZHJfcXVhbGlmaWVycyk6IE5ldyBub250ZXJtaW5hbC4gIEFkZCBzdXBwb3J0IGZvciBGTEFHUy4KLQkob3B0X2hkcnMsIGhkcik6IFJlbW92ZS4KLQkocGhkcl92YWwpOiBOZXcgbm9udGVybWluYWwuCi0JKiBsZGxhbmcuYyAobGFuZ19uZXdfcGhkcik6IFJlcGxhY2UgaGRycyBwYXJhbWV0ZXIgd2l0aCBmaWxlaGRyCi0JYW5kIHBoZHJzIHBhcmFtZXRlcnMuICBBZGQgZmxhZ3MgcGFyYW1ldGVyLgotCShsYW5nX3JlY29yZF9waGRycyk6IFVwZGF0ZSBmb3IgY2hhbmdlcyB0byBsYW5nX3BoZHIuICBQYXNzIGZsYWdzCi0JdG8gYmZkX3JlY29yZF9waGRyLgotCSogbGRsYW5nLmggKHN0cnVjdCBsYW5nX3BoZHIpOiBSZXBsYWNlIGhkcnMgZmllbGQgd2l0aCBmaWxlaGRyIGFuZAotCXBoZHJzIGZpZWxkcy4gIEFkZCBmbGFncyBmaWVsZC4KLQkoTEFOR19QSERSX0ZJTEVIRFIsIExBTkdfUEhEUl9QSERSUyk6IFJlbW92ZS4KLQkobGFuZ19uZXdfcGhkcik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IEZMQUdTLgotCi1Nb24gSmFuIDE1IDE1OjA3OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JRG9uJ3QgbWFrZSBhIHNoYXJlZCBsaWJyYXJ5IGJlY2F1c2Ugb2YgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSB0bwotCV9fR0xPQkFMX09GRlNFVF9UQUJMRV8uCi0KLQlBZGQgc29tZSBJcml4IDUgc3VwcG9ydCwgbW9zdGx5IGZyb20gS2F6dW1vdG8gS29qaW1hCi0gICAgICAgIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD46Ci0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaCAoU0NSSVBUX05BTUUpOiBDaGFuZ2UgdG8gZWxmbWlwcy4KLQkoU0hMSUJfVEVYVF9TVEFSVF9BRERSKTogRGVmaW5lLgotCShPVEhFUl9HT1RfU1lNQk9MUyk6IERlZmluZS4KLQkoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogUmVtb3ZlIGluaXRpYWxpemF0aW9uIG9mIF9ncC4KLQkoRVhFQ1VUQUJMRV9TWU1CT0xTKTogRG9uJ3QgZGVmaW5lLgotCShEWU5BTUlDX0xJTkspOiBEb24ndCBkZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaDogU2FtZSBjaGFuZ2VzIGFzIGVsZjMyYm1pcC5zaC4KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMqLWRlYy1ic2QqKTogQ2hhbmdlIG1pcHMgdG8gbWlwcyouCi0JKG1pcHMqLXNnaS1pcml4NCopOiBMaWtld2lzZS4KLQkobWlwcyotc2dpLWlyaXg1Kik6IE5ldyBlbnRyeS4KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJibWlwLmMpOiBEZXBlbmQgdXBvbiBlbGZtaXBzLnNjIHJhdGhlciB0aGFuCi0JZWxmLnNjLgotCShlZWxmMzJsbWlwLmMpOiBMaWtld2lzZS4KLQotU2F0IEphbiAxMyAwOTo0MTo0MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogUmVtb3ZlIHN1cHBvcnQgZm9yIC5yZWwuKiBzZWN0aW9ucy4gIEFkZAotCS5yZWxhLmdvdC5uZWcgc2VjdGlvbi4KLQotRnJpIEphbiAxMiAxNDo1NjoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3NoLnNjOiBPbmx5IGJ1aWxkIGNvbnN0cnVjdG9ycyB3aGVuIENPTlNUUlVDVElORy4KLQotCSogbGRtaXNjLmM6IEluY2x1ZGUgPHN0ZGFyZy5oPiByYXRoZXIgdGhhbiA8dmFyYXJncy5oPiBpZgotCUFOU0lfUFJPVE9UWVBFUyBpcyBkZWZpbmVkLiAgUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YKLQlXSU5ET1dTX05ULiAgVmFyaW91cyBpbmRlbmRhdGlvbiBmaXhlcy4KLQkodmZpbmZvKTogQ2hhbmdlIGZtdCBwYXJhbWV0ZXIgdG8gY29uc3QgY2hhciAqLgotCShpbmZvX21zZyk6IFdyaXRlIDxzdGRhcmcuaD4gdmVyc2lvbi4KLQkoZWluZm8sIG1pbmZvLCBmaW5mbyk6IExpa2V3aXNlLgotCShpbmZvX2Fzc2VydCk6IENoYW5nZSBmaWxlIHBhcmFtZXRlciB0byBjb25zdCBjaGFyICouCi0JKiBsZG1pc2MuaCAoZWluZm8sIG1pbmZvLCBpbmZvX21zZyk6IElmIEFOU0lfUFJPVE9UWVBFUyBpcwotCWRlZmluZWQsIHVzZSBhIHJlYWwgcHJvdG90eXBlLgotCShpbmZvX2Fzc2VydCk6IENoYW5nZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QgY2hhciAqLgotCi1GcmkgSmFuIDEyIDEzOjI5OjU1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLnNkYXRhMi8uc2JzczIsIGV0Yy4gIEFkZAotCWluIG9sZCBzdXBwb3J0IHRoYXQgMi43LjIgbmVlZHMsIGJ1dCB0aGUgY3VycmVudCBjb21waWxlciBkb2VzCi0Jbm90LgotCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMyeyxsfXBwYy5jKTogRml4IHVwIGRlcGVuZGVuY2llcyB0byB1c2UgdGhlCi0JY29ycmVjdCBMaW5rZXIgc2NyaXB0IHRlbXBsYXRlLgotCi0JKiBlbXVscGFyYW1zL2VsZjMyeyxsfXBwYy5zaCAoVEVYVF9TVEFSVF9BRERSKTogU2V0IHRvIDB4NDAwMDAsCi0Jbm90IDB4NDAwMDAwLgotCShEQVRBX0FERFIsTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogRGVsZXRlLgotCi1UdWUgSmFuICA5IDE1OjUzOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IFB1dCAucmNvbnN0IHJpZ2h0IGFmdGVyIC5yZGF0YS4KLQotRnJpIEphbiAgNSAxNDowNzo0NSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0Jc29ydCB1c2luZyByaWdodCBwb2ludGVyLgotCi1GcmkgSmFuICA1IDEyOjI1OjQ3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBSZW1vdmUgc3VwcG9ydCBmb3IgY3JlYXRpbmcgc3BlY2lhbAotCWxhYmVscyBmb3IgZWFiaSBzZWN0aW9uIGJlZ2luL2VuZCBoZXJlLiAgVGhlIGNvbXBpbGVyIG5vdyB1c2VzCi0JY3J0e2ksbn0ubyB0byBjcmVhdGUgdGhlc2Ugc3ltYm9scy4KLQotVGh1IEphbiAgNCAxNzowODo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGFuZ2UgZXhpc3RpbmcgTGludXggSE9TVElOR19DUlQwIHRvIGJlIHVzZWQKLQlmb3IgYS5vdXQgb25seSwgYW5kIHB1dCBpbiBhcHByb3ByaWF0ZSBIT1NUSU5HX0NSVDAgYW5kCi0JSE9TVElOR19MSUJTIHZhbHVlcyBmb3IgTGludXggRUxGLgotCi1UaHUgSmFuICA0IDEyOjAyOjA1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBVc2UgYWxsIDY0SyBmb3IgcmFtLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBEZWZpbmUgMjU2SyByYW0gc2l6ZS4KLQotVGh1IERlYyAyMSAxNTo1NzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogUGFzcwotCWV4cG9ydF9kZWZpbmVzIGFzIHRydWUgdG8gYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyBpZiAtdW5peAotCXdhcyB1c2VkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgLWJFIHdhcyB1c2VkLgotCi1UdWUgRGVjIDE5IDE3OjM1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE9ubHkgc2V0Ci0JcmVsb2NhdGVhYmxlIGJlZm9yZSBjYWxsaW5nIGxkY3Rvcl9idWlsZF9zZXRzIGlmIHRoZSBvdXRwdXQgZmlsZQotCWlzIGluIGFuIFhDT0ZGIGZvcm1hdC4KLQotRnJpIERlYyAxNSAxNjozNDozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IFdoZW4gaGFuZGxpbmcgYSBkYXRhIHN0YXRlbWVudCwgaWYKLQl0aGUgZW5kaWFubmVzcyBvZiB0aGUgb3V0cHV0IGZpbGUgaXMgdW5rbm93biwgdXNlIHRoZSBlbmRpYW5uZXNzCi0Jb2YgdGhlIGlucHV0IGZpbGUuCi0KLVR1ZSBEZWMgMTIgMTM6NTU6NDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBSZWNvZ25pemUgbWlwcy0qLSogYXMgZXF1aXZhbGVudCB0bwotCW1pcHMtaWR0LWVjb2ZmLgotCSogbXB3LWVwcGNtYWNvcy5jOiBSZW5hbWUgdG8gc2hvcnRlciBtcHctZXBwY21hYy5jLgotCSogbXB3LWxkLnI6IEFkZCB2ZXJzaW9uIHJlc291cmNlcy4KLQkoY2ZyZyk6IFVzZSBzeW1ib2xpYyBpbnN0ZWFkIG9mIGxpdGVyYWwgbmFtZSBmb3IgZXhlY3V0YWJsZS4KLQotTW9uIERlYyAxMSAxNToxMzo0MSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcHBjcGUuc2MgKEZJTkkpOiBNb3ZlZCB0aGUgLnJlbG9jIHNlY3Rpb24uCi0KLVdlZCBEZWMgIDYgMTQ6MzM6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHByaW50X3N0YXRlbWVudHssc30pOiBEZWxldGUgZHVwbGljYXRlIHByb3RvdHlwZS4KLQkocHJpbnRfc3RhdGVtZW50X2xpc3QpOiBSZW5hbWVkIGZyb20gcHJpbnRfc3RhdGVtZW50LiAgQWxsIGNhbGxlcnMKLQl1cGRhdGVkLgotCShwcmludF9zdGF0ZW1lbnQpOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQganVzdCBvbmUgc3RhdGVtZW50LgotCShwcmludF97ZGF0YSxyZWxvYyxwYWRkaW5nfV9zdGF0ZW1lbnQpOiBEb24ndCBjcmFzaCBpZgotCW91dHB1dF9zZWN0aW9uID09IE5VTEwuCi0JKGRwcmludF9zdGF0ZW1lbnQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogRml4Ci0JY2FsbCB0byBzb3J0X3NlY3Rpb25zLgotCi1XZWQgRGVjICA2IDE0OjU5OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAodW5peF9sZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBIYW5kbGUgLXVuaXguCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogSWYgdW5peF9sZCwgcGFzcwotCWdjIGFzIGZhbHNlIGFuZCBleHBvcnRfZGVmaW5lZHMgYXMgdHJ1ZSB0byBzaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBQZXJtaXQgYXNzaWdubWVudHMgdG8gZG90IGluIHRoZSBmaW5hbAotCXBoYXNlIGlmIHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgYWJzX291dHB1dF9zZWN0aW9uLgotCi0KLVR1ZSBEZWMgIDUgMDk6NDk6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBGaXggY2FsbAotCXRvIHNvcnRfc2VjdGlvbnMuCi0KLUZyaSBEZWMgIDEgMTY6NDg6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoUEhEUlMpOiBOZXcgdG9rZW4uCi0JKGlmaWxlX3AxKTogQWNjZXB0IHBoZHJzLgotCShzZWN0aW9uKTogQWNjZXB0IHBoZHJfb3B0IGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gZGVmaW5pdGlvbi4KLQkocGhkcl9vcCk6IE5ldyBub250ZXJtaW5hbC4KLQkocGhkcnMsIHBoZHJfbGlzdCwgcGhkciwgcGhkcl90eXBlLCBvcHRfaGRycywgaGRyKTogTGlrZXdpc2UuCi0JKiBsZGxleC5sOiBBY2NlcHQgUEhEUlMuCi0JKiBsZGxhbmcuaCAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0KTogRGVmaW5lLgotCShsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlKTogQWRkIHBoZHJzIGZpZWxkLgotCShzdHJ1Y3QgbGFuZ19waGRyKTogRGVmaW5lLgotCShMQU5HX1BIRFJfRklMRUhEUiwgTEFOR19QSERSX1BIRFJTKTogRGVmaW5lLgotCShsYW5nX25ld19waGRyKTogRGVjbGFyZS4KLQkqIGxkbGFuZy5jIChsYW5nX3BoZHJfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCk6IEluaXRpYWxpemUgcGhkcnMgZmllbGQuCi0JKGxhbmdfcHJvY2Vzcyk6IENhbGwgbGFuZ19yZWNvcmRfcGhkcnMuCi0JKGxhbmdfbmV3X3BoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfc2VjdGlvbl9pbl9waGRyKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3JlY29yZF9waGRycyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBQSERSUy4KLQotVGh1IE5vdiAzMCAxMzoxNDozMCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcHBjcGUuc2M6IE1vdmVkIC5lZGF0YSBpbnRvIGl0cyBvd24gc2VjdGlvbiB0bwotCWV4cG9zZSBpdC4KLQotVGh1IE5vdiAzMCAxMTozMjozNCAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29uZmlndXJlLmhvc3QgKG02OCotbW90b3JvbGEtc3lzdik6IERlZmluZSBIT1NUSU5HX0NSVDAgYW5kCi0JSE9TVElOR19MSUJTIGZvciB0ZXN0aW5nLgotCShtODgqLW1vdG9yb2xhLXN5c3YzKTogRGVmaW5lIEhPU1RJTkdfQ1JUMCBhbmQgSE9TVElOR19MSUJTIGZvcgotCXRlc3RpbmcuCi0KLVR1ZSBOb3YgMjggMTI6MTQ6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFNldCBjb25maWcuZHluYW1pY19saW5rIHRvIGZhbHNlIGZvciAtTgotCWFuZCAtbi4KLQotTW9uIE5vdiAyNyAxMzoxMjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNy4KLQotRnJpIE5vdiAyNCAxODozNTozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVHdvIC5qdW5rJ3MgaXMgdG9vIG11Y2gganVuay4KLQotVHVlIE5vdiAyMSAxNjoxNDozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9ORUVEX0RFQ0xBUkFUSU9OLgotCSogYWNjb25maWcuaDogUHV0IE5FRURfREVDTEFSQVRJT05fRlJFRSBpbiBAVE9QQCBzZWN0aW9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLQkqIGxkbWFpbi5jIChjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IERvbid0IHdhcm4gYWJvdXQgQkZEX1JFTE9DX0NUT1IKLQliZWluZyB1bnN1cHBvcnRlZCBpZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rIGFuZCB0aGUgaW5wdXQKLQlCRkQgc3VwcG9ydHMgaXQsIHNpbmNlIGxkY3Rvcl9idWlsZF9zZXRzIGNhbiBjb3BlIHdpdGggdGhhdCBjYXNlLgotCi1GcmkgTm92IDE3IDE2OjIzOjE1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLW1hY29zKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL3BwY21hY29zLnNoOiBOZXcgZmlsZSwgUG93ZXJNYWMgZW11bGF0aW9uLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVwcGNtYWNvcy5vLgotCShlcHBjbWFjb3MuYyk6IE5ldyB0YXJnZXQuCi0JKiBtcHctZXBwY21hY29zLmM6IFVwZGF0ZS4KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgYXR0ZW1wdHMgdG8gdXNlIHtHRU5TQ1JJUFRTfS4KLQotRnJpIE5vdiAxNyAxMDozNzoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogVXNlIEBob3N0QCBhbmQgQHRhcmdldEAsIG5vdAotCSQoaG9zdF9jYW5vbmljYWwpIGFuZCAkKHRhcmdldF9jYW5vbmljYWwpLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCi1UaHUgTm92IDE2IDExOjIzOjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjICguZW5kanVuayk6IE1vdmUgZGVmaW5pdGlvbiBvZiBgZW5kJyB0byBoZXJlCi0Jc28gdGhlIG1hbGxvYyBoZWFwIGJlZ2lucyBhdCBhIHNhbmUgcGxhY2UuCi0KLVRodSBOb3YgMTYgMDM6MDk6MzIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlWZXJzaW9uIDIuNiByZWxlYXNlZC4KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFVwZGF0ZSB0byAyLjYuCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IERlbGV0ZSBsZGVtdWwtbGlzdC5oIGhlcmUsIGJ1dCBub3QKLQkkKEdFTkVSQVRFRF8qRklMRVMpLCBzaW5jZSB0aGV5IG5lZWQgdG8gYmUgcmV0YWluZWQgYnkgZGlzdGNsZWFuLgotCShtYWludGFpbmVyLWNsZWFuLCByZWFsY2xlYW4pOiBEZWxldGUgdGhlbSBoZXJlLgotCi1UdWUgTm92IDE0IDE3OjA4OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IE9wZW4gdGhlCi0JYmFzZSBmaWxlIHdpdGggRk9QRU5fV0IsIG5vdCAidyIuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFVzZSB0aGUKLQllbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9SVU5fUEFUSCBpZiBuZWl0aGVyIC1ycGF0aCBub3IgLXJwYXRoLWxpbmsKLQl3ZXJlIHVzZWQuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogVXNlIHRoZSBlbnZpcm9ubWVudAotCXZhcmlhYmxlIExEX1JVTl9QQVRIIGlmIC1ycGF0aCB3YXMgbm90IHVzZWQuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCBMRF9SVU5fUEFUSC4KLQotVGh1IE5vdiAgOSAxMzowOToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBSZWNvZ25pemUKLQktYmwgYW5kIC1ibG9hZG1hcCBvcHRpb25zLgotCi0JKiBsZGZpbGUuYyAobGRmaWxlX3RyeV9vcGVuX2JmZCk6IElmIGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCwKLQlyZXBvcnQgYSBiZXR0ZXIgZXJyb3IuCi0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQWRkCi0JbmV3IGxvY2FsIHZhcmlhYmxlIHNwZWNpYWxfc2VjdGlvbnMsIGFuZCBwYXNzIGl0IHRvCi0Jc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgTG9vayB0aHJvdWdoIHRoZSByZXN1bHRzLCBhbmQgbW92ZSB0aGUKLQlzZWN0aW9ucyBhcm91bmQgaW4gdGhlIG1hcHBpbmcgc28gdGhhdCB0aGV5IGFyZSBkZWZpbmVkIGNvcnJlY3RseS4KLQotV2VkIE5vdiAgOCAxMTo0MDo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5jIChsZGVtdWxfZGVmYXVsdF90YXJnZXQpOiBDYXN0IGdldGVudiByZXR1cm4gdmFsdWUuCi0KLVR1ZSBOb3YgIDcgMTE6MTU6MzYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvcHBjcGUuc2ggKEFSQ0gpOiBOZXcgZmlsZSBmb3IgUG93ZXJQQyBQb3J0YWJsZQotCUV4ZWN1dGFibGUgc3VwcG9ydC4KLQkqIHNjcmlwdHRlbXBsL3BwY3BlLnNjOiBOZXcgZmlsZSBmb3IgUG93ZXJQQyBQb3J0YWJsZSBFeGVjdXRhYmxlCi0Jc3VwcG9ydC4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZGVkIHBvd2VycGNsZS1wZSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlcHBjcGUubyB0YXJnZXQuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoVEFSR0VUX0lTX3BwY3BlKTogZmlsZSB0YWlsb3JpbmcgbWFjcm8KLQkoZ2xkXyRfYmVmb3JlX2FsbG9jYXRpb24pOiBhZGRlZCBob29rcyBmb3IgdG9jIGNvbnN0cnVjdGlvbiBiYXNlZAotCW9uIHRoZSBhYm92ZSBtYWNyby4KLQotVHVlIE5vdiAgNyAxMTo0NzoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IFRoZSBsaW5rZXIgZG9lcyBub3QgdXNlIF9tYWluIGFzIGFuIGVudHJ5IHBvaW50LgotCi1UdWUgTm92ICA3IDExOjQ2OjExIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjICguZGF0YSk6IENhbGN1bGF0ZSBuZXh0IGJvdW5kYXJ5IG1vZHVsbwotCTB4MjAwMCBub3QgMHgyMDAuCi0KLU1vbiBOb3YgIDYgMTA6NTk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCB0ZXN0IGZvciB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZC4KLQkqIHN5c2RlcC5oOiBEZWNsYXJlIGZyZWUgaWYgbmVjZXNzYXJ5LiAgSW5jbHVkZSAiYW5zaWRlY2wuaCIuCi0JKiBhY2NvbmZpZy5oOiBFeHBsYWluIE5FRURfREVDTEFSQVRJT05fRlJFRS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFRha2UgQjo6IG91dCBvZiBzaG9ydG9wdHMuCi0KLVN1biBOb3YgIDUgMDM6MDg6MjggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggKEVYRUNVVEFCTEVfU1lNQk9MUyk6IFNldCBfX0RZTkFNSUMgdG8gMAotCWZvciBub3csIGFzIHdpdGggbTY4azRrYnNkLCB1bnRpbCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGdldHMKLQlkb25lLgotCi0JKiBjb25maWd1cmUuaG9zdDogRm9yIGkzODYgQlNEIHZhcmlhbnRzLCBjcnQwLm8gbGl2ZXMgaW4KLQkvdXNyL2xpYi4gIChUcnVlIGZvciBOZXRCU0QgYXQgbGVhc3QsIHVuY29uZmlybWVkIGZvciBvdGhlcnMuKQotCi1XZWQgTm92ICAxIDE1OjQyOjQ1IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWRlbHRhNjguby4KLQkoZWRlbHRhNjguYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0IChtNjgqLW1vdG9yb2xhLXN5c3YqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvZGVsdGE2OC5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9kZWx0YTY4LnNjOiBOZXcgZmlsZS4KLQotCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYzogSGFuZGxlIC5pbml0IGFuZCAuZmluaS4gIENoYW5nZSBzZWN0aW9uCi0JYWRkcmVzc2VzLgotCi1XZWQgTm92ICAxIDExOjQxOjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKG1yaV9zY3JpcHRfY29tbWFuZCk6IEFjY2VwdCAnLCcgYXMgd2VsbCBhcyAnPScgaW4KLQlBTElHTiBhbmQgQUxJR05NT0Qgc3RhdGVtZW50cy4KLQotCSogZW11bHRlbXBsL2FpeC5lbTogSW5jbHVkZSBsZGdyYW0uaC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEhhbmRsZSAtcEQgYW5kIC1wVCwgYXMgdXNlZCBvbgotCUFJWCA0LjEuCi0JKiBNYWtlZmlsZS5pbiAoJChFTVVMQVRJT05fT0ZJTEVTKSk6IERlcGVuZCB1cG9uIGxkZ3JhbS5oLgotCi1UdWUgT2N0IDMxIDE4OjIyOjI0IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChhbHBoYS0qLWxpbnV4Kik6IE5ldyBob3N0LgotCSogY29uZmlndXJlLnRndCAoYWxwaGEtKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCi1UdWUgT2N0IDMxIDEyOjM2OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZXhwb3J0X2ZpbGVzKTogUmVtb3ZlLgotCShpbXBvcnRfZmlsZXMpOiBNYWtlIHN0YXRpYy4KLQkoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCk6IERlZmluZS4KLQkoZXhwb3J0X3N5bWJvbHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSGFuZGxlIGFuIGluaXRpYWwgLWIgb3B0aW9uCi0JY29ycmVjdGx5LiAgQ2FsbCByZWFkX2ZpbGUgZm9yIGFuIGV4cG9ydCBmaWxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IENhbGwKLQliZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCBmb3IgZWFjaCBleHBvcnQgc3ltYm9sLCByYXRoZXIgdGhhbgotCWNhbGxpbmcgcmVhZF9maWxlIGZvciBlYWNoIGV4cG9ydCBmaWxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBGb3IgYW4gZXhwb3J0IGZpbGUsIG1ha2UgdGhlCi0JZXhwb3J0ZWQgc3ltYm9scyB1bmRlZmluZWQsIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSBleHBvcnRfc3ltYm9scwotCWxpc3QuCi0KLVNhdCBPY3QgMjggMDA6MTA6MDMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6Ci0JRG9uJ3QgaGFuZyBpZiBsYXN0IG9wdGlvbiBpcyB1bnJlY29nbmlzZWQuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IEluc2VydCBjcmVhdGVkCi0Jc3ltYm9scyBpbnRvIEFCUyBvdXRwdXQgc2VjdGlvbi4KLQotRnJpIE9jdCAyNyAxODowMzoxNyAxOTk1ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiAgTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIE5ldEJTRAotCW02OGs0ayBhcmNoLgotCShlbTY4azRrbmJzZC5jKTogTmV3IHJ1bGUuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBOZXRCU0QgbTY4azRrIGFyY2guCi0KLQkqIGdlbnNjcmlwdHMuc2gsIGxkaW50LnRleGluZm8sCi0JZW11bHBhcmFtcy97YTI5ayxhcm1hb3V0Yixhcm1hb3V0bCxjb2ZmX3NwYXJjLGVibW9uMjlrLGdsZDk2MCwKLQlnbGQ5NjBjb2ZmLGdvMzIsaDgzMDAsaDgzMDBoLGg4NTAwLGg4NTAwYixoODUwMGMsaDg1MDBtLGg4NTAwcywKLQlocDMwMGJzZCxocDNocHV4LGhwcGFlbGYuc2gsaTM4NmFvdXQsaTM4NmJzZCxpMzg2Y29mZixpMzg2Z28zMiwKLQlpMzg2bGludXgsaTM4Nmx5bngsaTM4Nm5ic2QsbG5rOTYwLG02OGthb3V0LG02OGtjb2ZmLG02OGtseW54LAotCW04OGtiY3MsbWlwc2JpZyxtaXBzYnNkLG1pcHNpZHQsbWlwc2lkdGwsbWlwc2xpdCxuZXdzLG5zMzJrbmJzZCwKLQlwYzUzMm1hY2hhb3V0LHJpc2NpeCxzYTI5MjAwLHNoLHNobCxzcGFyY2x5bngsc3BhcmNuYnNkLAotCXN0MjAwMCxzdW4zLHN1bjQsdmFuaWxsYSx2YXgsdnN0YSx3NjUsejgwMDEsejgwMDJ9LnNoOiBDaGFuZ2VkCi0JUEFHRV9TSVpFIHRvIFRBUkdFVF9QQUdFX1NJWkUuCi0KLQkqIGVtdWxwYXJhbXMvbTY4a25ic2QuaDogRGl0dG8uCi0JKFRFWFRfU1RBUlRfQUREUiwgTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogV2UgaGF2ZSA4SyBwYWdlc2l6ZS4KLQkoRVhFQ1VUQUJMRV9TWU1CT0xTKTogSGFyZGNvZGUgX19EWU5BTUlDIHRvIHplcm8gZm9yIHRoZSB0aW1lCi0JYmVpbmcuCi0KLQkqIGVtdWxwYXJhbXMvbTY4azRrbmJzZC5zaDogTmV3IGZpbGUuCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IEV4cGFuZCBFWEVDVVRBQkxFX1NZTUJPTFMgaWYgcmVsb2NhdGluZy4KLQotRnJpIE9jdCAyNyAxNzo1OTowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW06IEluY2x1ZGUgbGRjdG9yLmguCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IENhbGwgZmluZF9yZWxvY3MuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVzZSBuZXcgYWZ0ZXJfb3BlbiBmdW5jdGlvbi4KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogVXNlIENPTlNUUlVDVE9SUyBpbiAuZGF0YS4KLQkqIGxkY3Rvci5jIChzdHJ1Y3Qgc2V0X2luZm8pOiBNb3ZlIGRlZmluaXRpb24gaW50byBsZGN0b3IuaC4KLQkoc3RydWN0IHNldF9lbGVtZW50KTogTGlrZXdpc2UuCi0JKHNldHMpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogQWRkIG5hbWUgcGFyYW1ldGVyLiAgU2F2ZSBpdCBpbiB0aGUgbmV3Ci0Jc2V0IGVsZW1lbnQuCi0JKGxkY3Rvcl9idWlsZF9zZXRzKTogQXZvaWQgYmVpbmcgY2FsbGVkIHR3aWNlLiAgUGFzcyBzZXQgZWxlbWVudAotCW5hbWUgdG8gbGFuZ19hZGRfcmVsb2MuCi0JKiBsZGN0b3IuaCAoc3RydWN0IHNldF9pbmZvKTogTW92ZSBkZWZpbml0aW9uIGhlcmUgZnJvbSBsZGN0b3IuYy4KLQkoc3RydWN0IHNldF9lbGVtZW50KTogTGlrZXdpc2UuICBBZGQgbmV3IGZpZWxkIG5hbWUuCi0JKHNldHMpOiBEZWNsYXJlLgotCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IERlY2xhcmUgbmV3IG5hbWUgcGFyYW1ldGVyLgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogRG9uJ3QgaW5zaXN0IHRoYXQgZWl0aGVyIG5hbWUgb3IKLQlzZWN0aW9uIGJlIE5VTEwgaW4gYSBsYW5nX3JlbG9jX3N0YXRlbWVudC4KLQkqIGxkbWFpbi5jIChhZGRfdG9fc2V0KTogUGFzcyBOVUxMIHRvIGxkY3Rvcl9hZGRfbmV3X3NldF9lbnRyeSBmb3IKLQluZXcgbmFtZSBwYXJhbWV0ZXIuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogUGFzcyBuYW1lIHRvIGxkY3Rvcl9hZGRfbmV3X3NldF9lbnRyeSBmb3IKLQluZXcgbmFtZSBwYXJhbWV0ZXIuCi0KLQkqIGxkbWlzYy5jIChkZW1hbmdsZSk6IEZpeCBpbmRlbnRhdGlvbi4gIFJlbW92ZSBhIGxlYWRpbmcgcGVyaW9kLgotCi1UaHUgT2N0IDI2IDIyOjIyOjQ5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIFBvd2VyTWFjIHRhcmdldCBzdXBwb3J0LCBnZW5lcmF0ZSBjb25maWcuaC4KLQkqIG1hYy1sZC5yOiBOZXcgZmlsZSwgTWFjIHJlc291cmNlcy4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIGVkaXRzIE1ha2VmaWxlLmluIGludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtcHctZXBwY21hY29zLmM6IFByZWJ1aWx0IHZlcnNpb24gb2YgUG93ZXJNYWMgbGlua2luZyBzY3JpcHQuCi0KLVRodSBPY3QgMjYgMTQ6MTE6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogVHJlYXQKLQktc3RhdGljIGFzIGEgc3lub255bSBmb3IgLWJuc28uCi0KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogTW92ZSBzcGVjaWFsIHN5bWJvbHMgaW5zaWRlIHNlY3Rpb25zLgotCUFsd2F5cyBzdGFydCAuZGF0YSBhdCAwLgotCi1XZWQgT2N0IDI1IDExOjUyOjEyIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIEFsc28gbWFrZSBpbmZvLgotCShtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6ICBBbHNvIGRlbGV0ZSAqLmluZm8qLgotCi1XZWQgT2N0IDI1IDExOjI3OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbTogQWRkIHN1cHBvcnQgZm9yIHZhcmlvdXMgQUlYIGxpbmtlciBvcHRpb25zLAotCWZvciBBSVggaW1wb3J0IGFuZCBleHBvcnQgZmlsZXMsIGFuZCBmb3IgQUlYIHNoYXJlZCBvYmplY3RzLgotCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBBZGQgLnBhZC4gIFB1dCAuZHMganVzdCBiZWZvcmUgdGhlIFRPQy4KLQotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIG5ldyBmaWVsZCBsaW5rX2luZm8uc3RhdGljX2xpbmsuCi0KLQkqIGxkbWFpbi5jIChhZGRfa2VlcHN5bXNfZmlsZSk6IEFkZCBcbiBhdCBlbmQgb2YgZWluZm8gY2FsbHMuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogTGlrZXdpc2UuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogTGlrZXdpc2UuCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogbGQudGV4aW5mbzogVGhlIE1SSSBBTElHTiBkaXJlY3RpdmUgaXMgc3VwcG9ydGVkLgotCi1Nb24gT2N0IDIzIDExOjQ2OjQzIDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL2VsZjMydnI0MzAwLnNoOiBEZWxldGVkLgotCSogZW11bHBhcmFtcy9lbGYzMnZyNDMwMGVsLnNoOiBEZWxldGVkLgotCSogZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoOiBBZGRlZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaDogQWRkZWQuCi0JKiBjb25maWd1cmUudGd0LCBNYWtlZmlsZS5pbjogVXBkYXRlZCB0aGUgYnVpbGQgdG8gdXNlIHRoZQotIAluZXcgOC4zIHVuaXF1ZSBuYW1lcy4KLQotVGh1IE9jdCAxOSAxNzo0MTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChlbnRyeV9zeW1ib2wpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKiBsZGxhbmcuaCAoZW50cnlfc3ltYm9sKTogRGVjbGFyZS4KLQotCSogbGRsZXgubDogVHJlYXQgUFJPVklERSBhcyBhIGtleXdvcmQgaW4gZXhwcmVzc2lvbiBzdGF0ZS4KLQotV2VkIE9jdCAxOCAxNzozNDowNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLmJzcyk6IE1vdmUgdG8gYmUgYWZ0ZXIgLnRleHQKLQotVHVlIE9jdCAxNyAxMjoyMjowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCk6Ci0JU2VhcmNoIHRyaW5hcnkuY29uZCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdHJpbmFyeS5saHMgdHdpY2UuICBGcm9tCi0JbGlubGlAaWhwLlBIeXMuZXRoei5DSC4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogTW92ZQotCWRpcmVjdG9yeSBzZWFyY2hpbmcgY29kZSBpbnRvIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBleHRyYWN0ZWQKLQlmcm9tIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28uCi0JKGdsb2JhbF9uZWVkZWQsIGdsb2JhbF9mb3VuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBVc2UgbmV3IGFmdGVyX29wZW4gZnVuY3Rpb24uCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBNZW50aW9uIC1ycGF0aC1saW5rIG9uIFN1bk9TLgotCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMycHBjLmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSwgbm90IGdlbmVyaWMuZW0uCi0JKGVlbGYzMmxwcGMuYyk6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmxwcGMuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCi0JKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZSBhcyB5ZXMuCi0KLU1vbiBPY3QgMTYgMTk6MTE6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IFN0cnVjdCBiZmRfZWxmX2xpbmtfbmVlZGVkX2xpc3QgaXMgbm93IG5hbWVkCi0JYmZkX2xpbmtfbmVlZGVkLWxpc3Q7IG1ha2UgYXBwcm9wcmlhdGUgY2hhbmdlcy4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgYWl4cHBjLgotCShyczYwMDAtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIGFpeHJzNi4KLQkqIGVtdWxwYXJhbXMvYWl4cHBjLnNoLCBlbXVscGFyYW1zL2FpeHJzNi5zaDogTmV3IGZpbGVzLgotCSogZW11bHRlbXBsL2FpeC5lbTogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9haXguc2M6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhaXhwcGMubyBhbmQgZWFpeHJzNi5vLgotCShlYWl4cHBjLmMsIGVhaXhyczYuYyk6IE5ldyB0YXJnZXRzLgotCi1GcmkgT2N0IDEzIDE0OjAwOjM3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXAvcGUuc2MgKC5yZWxvYyk6IE1vdmUgdG8gdGhlIGVuZC4KLQotVHVlIE9jdCAxMCAxNzo1MzoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IERvbid0IHRyeSB0byB1c2UgYW4gZW50cnlfc3ltYm9sIGZyb20gYQotCXNlY3Rpb24gd2hpY2ggd2FzIG5vdCBsaW5rZWQgaW50byB0aGUgZmluYWwgb3V0cHV0LgotCi1UdWUgT2N0IDEwIDEwOjE3OjIyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBGaXgKLQlmYXRhbCB0eXBvcy4KLQotVHVlIE9jdCAxMCAwMTowMTo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBycGF0aF9saW5rIGZpZWxkLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogU2VhcmNoIGZvcgotCXJlcXVpcmVkIGRlcGVuZGVuY2llcyBpbiBycGF0aF9saW5rIHBhdGguICBPbmx5IHNlYXJjaAotCUxEX0xJQlJBUllfUEFUSCB3aGVuIGNvbmZpZ3VyZWQgbmF0aXZlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLXJwYXRoLWxpbmsuCi0JKiBsZC4xLCBsZC50ZXhpbmZvOiBEb2N1bWVudCAtcnBhdGgtbGluay4KLQotU2F0IE9jdCAgNyAxNzowNzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IERvbid0Ci0JYm90aGVyIHNlYXJjaGluZyBmb3IgbmVlZGVkIGxpYnJhcmllcyB1bmxlc3MgZG9pbmcgYSBmaW5hbCBsaW5rLgotCi1GcmkgT2N0ICA2IDE2OjI2OjE2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQvbGQuMTogRml4IGZvcm1hdHRpbmcgYnVncy4KLQotV2VkIE9jdCAgNCAxNzozNzo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGV4cF9nZXRfYWJzX2ludCk6IFJldHVybiBiZmRfdm1hLCBub3QgaW50LgotCSogbGRleHAuaCAoZXhwX2dldF9hYnNfaW50KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFVzZSBmcHJpbnRmX3ZtYSB0bwotCXByaW50IHJldHVybiB2YWx1ZSBvZiBleHBfZ2V0X2Fic19pbnQuCi0KLU1vbiBPY3QgIDIgMTM6NTY6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsb2JhbF9zdGF0KTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkKTogQ2FsbCBzdGF0X25lZWRlZCB0byBtYWtlIHN1cmUKLQl0aGF0IHRoZSBmaWxlIGhhcyBub3QgYWxyZWFkeSBiZWVuIGluY2x1ZGVkIHVuZGVyIGFub3RoZXIgbmFtZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1GcmkgU2VwIDI5IDEyOjAwOjE4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogU3RhcnQgLnRleHQgYXQgMHg4MDAwLgotCVN0YXJ0IC5kYXRhIGF0IDB4NDAwMDAuCi0KLUZyaSBTZXAgMjkgMTE6MDk6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogSWYKLQljb21tYW5kX2xpbmUucnBhdGggaXMgc2V0LCB1c2UgaXQsIHJhdGhlciB0aGFuIHRoZSAtTCBvcHRpb25zLCB0bwotCWJ1aWxkIHRoZSBydWxlcyBzZWN0aW9uLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdGhpcyB1c2Ugb2YgLXJwYXRoLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IERvbid0IHNldCBsaW5rX2luZm8uc2hhcmVkIGZvciAtYXNzZXJ0Ci0JcHVyZS10ZXh0LiAgUGFzcyB0cnVlLCBub3QgMSwgdG8gbGFuZ19hZGRfZW50cnkuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGZpbmRfYXNzaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZm91bmRfYXNzaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBSZW5hbWUgbG9jYWwgaCB0byBoZHluLgotCUlmIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbmQgbm8gc3RhcnQgc3ltYm9sIHdhcyBzcGVjaWZpZWQgb24KLQl0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlcmUgYXJlIGFueSB1bmRlZmluZWQgc3ltYm9scywgc2V0Ci0JbGlua19pbmZvLnNoYXJlZC4gIElmIGxpbmtfaW5mby5zaGFyZWQgaXMgc2V0LCBzZXQgdGhlIGFkZHJlc3Mgb2YKLQl0aGUgLnRleHQgc2VjdGlvbiB0byAweDIwLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2Fzc2lnbm1lbnQpOiBSZW5hbWUgZnJvbQotCWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQuICBJZiBmaW5kX2Fzc2lnbiBpcwotCXNldCwgdGhlbiBqdXN0IHNldCBmb3VuZF9hc3NpZ24gYmFzZWQgb24gd2hldGhlciBhbiBhc3NpZ25tZW50IGlzCi0JZm91bmQgdG8gZmluZF9hc3NpZ24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQpOiBEb24ndCB1c2UgYSBzcGVjaWFsIHNjcmlwdCB3aGVuCi0JcHJvZHVjaW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKiBlbXVscGFyYW1zL3N1bjQuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IFJlbW92ZS4KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IFJlbW92ZSBDUkVBVEVfU0hMSUIgdGVzdHMuCi0JKiBsZGxhbmcuYyAoZW50cnlfZnJvbV9jbWRsaW5lKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkobGFuZ19hZGRfZW50cnkpOiBDaGFuZ2UgY21kbGluZSBwYXJhbWV0ZXIgZnJvbSBpbnQgdG8gYm9vbGVhbi4KLQlVc2UgZ2xvYmFsIGVudHJ5X2Zyb21fY21kbGluZSByYXRoZXIgdGhhbiBmdW5jdGlvbiBzdGF0aWMKLQlmcm9tX2NtZGxpbmUuCi0JKiBsZGxhbmcuaCAoZW50cnlfZnJvbV9jbWRsaW5lKTogRGVjbGFyZS4KLQkobGFuZ19hZGRfZW50cnkpOiBDaGFuZ2UgZGVjbGFyYXRpb24gb2Ygc2Vjb25kIHBhcmFtZXRlciBmcm9tIGludAotCXRvIGJvb2xlYW4uCi0JKiBsZGdyYW0ueTogUGFzcyBmYWxzZSwgbm90IDAsIHRvIGxhbmdfYWRkX2VudHJ5LgotCi1UaHUgU2VwIDI4IDEyOjM0OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAocGFyc2luZ19kZWZzeW0pOiBEZWNsYXJlLgotCSogbGRsZXguaCAobGV4X3N0cmluZyk6IERlY2xhcmUuCi0JKiBsZGxleC5sIChsZXhfc3RyaW5nKTogRGVmaW5lLgotCSogbGV4c3VwLmMgKHBhcnNpbmdfZGVmc3ltKTogRGVmaW5lLgotCShwYXJzZV9hcmdzKTogSW4gT1BUSU9OX0RFRlNZTSBjYXNlLCBzZXQgbGV4X3N0cmluZyBiZWZvcmUgY2FsbGluZwotCWxleF9yZWRpcmVjdCwgYW5kIGNsZWFyIGl0IGFmdGVyIGNhbGxpbmcgeXlwYXJzZS4gIFNldAotCXBhcnNpbmdfZGVmc3ltIGFyb3VuZCBjYWxsIHRvIHl5cGFyc2UuCi0JKiBsZG1haW4uYyAobWFpbik6IFNldCBsZXhfc3RyaW5nIGJlZm9yZSBjYWxsaW5nIGxleF9yZWRpcmVjdCwgYW5kCi0JY2xlYXIgaXQgYWZ0ZXIgY2FsbGluZyB5eXBhcnNlLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEZvciAlUywgaGFuZGxlIC0tZGVmc3ltIGFyZ3VtZW50cyBhbmQgYnVpbHQKLQlpbiBsaW5rZXIgc2NyaXB0cyBjb3JyZWN0bHkuCi0KLQkqIHNjcmlwdHRlbXBsL3NwYXJjY29mZi5zYzogQWRkIC5jdG9ycy8uZHRvcnMgaGFuZGxpbmcgbGlrZSBvdGhlcgotCUNPRkYgdGFyZ2V0cywgYWxsb3dpbmcgZm9yIHRoZSBsZWFkaW5nIHVuZGVyc2NvcmUgdXNlZCBvbiBTUEFSQwotCUNPRkYuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1hc3NlcnQuCi0JKiBlbXVscGFyYW1zL3N1bjQuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCk6IFVzZSB0aGUKLQlzaGFyZWQgbGlicmFyeSBzY3JpcHQgd2hlbiBhcHByb3ByaWF0ZS4KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IElmIENSRUFURV9TSExJQiBpcyBzZXQsIHN0YXJ0IHRoZSAudGV4dAotCXNlY3Rpb24gYXQgU0laRU9GX0hFQURFUlMuCi0KLVRodSBTZXAgMjggMDE6NDA6MzcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZWFybWNvZmYuYyk6IEJ1aWxkLgotCSogY29uZmlndXJlLnRndCAoYXJtLSotY29mZik6IE5ldyB0YXJnZXQKLQkqIGVtdWxwYXJtcy9hcm1jb2ZmLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IE5ldyBmaWxlLgotCi1UdWUgU2VwIDI2IDEwOjU5OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2M6IFJlbW92ZSAuZGF0YTI7IG5vIGxvbmdlciBuZWVkZWQuCi0KLUZyaSBTZXAgMjIgMTg6MDk6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGZpbGUuYyAobGRmaWxlX3NldF9vdXRwdXRfYXJjaCk6IE1ha2UgYXJjaCBjb25zdC4KLQotVGh1IFNlcCAyMSAxNzo1NToyNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQ29ycmVjdGx5IGxvY2F0ZSBfX2Jzc19zdGFydCBhdCB0aGUKLQliZWdpbm5pbmcgb2YgdGhlIC5ic3MgYXJlYSwgbm90IGF0IHRoZSBlbmQgb2YgZGF0YS4gIEFkZAotCV9fc2Jzc197c3RhcnQsZW5kfSBzeW1ib2xzLgotCi1XZWQgU2VwIDIwIDEyOjI5OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBRdW90ZSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpLgotCShDWFhfRk9SX1RBUkdFVCwgaW5zdGFsbCk6IExpa2V3aXNlLgotCi1Nb24gU2VwIDE4IDE0OjUzOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgYnkgQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBSZW1vdmUgYnJva2Vuc2VkIHN0dWZmLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCShpbnN0YWxsKTogTGlrZXdpc2UuCi0JKEdFTkVSQVRFRF9IRklMRVMpOiBSZW1vdmUgY29uZmlnLmguCi0JKC5kZXApOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQotTW9uIFNlcCAxOCAxNDozOTozOCAxOTk1ICBBcm5lIEguIEp1dWwgIDxhcm5lakBwdnYudW5pdC5ubz4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotZGVjLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCi1GcmkgU2VwIDE1IDIwOjAxOjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTg4Ki0qLWRndXgqKTogRml4IGFub3RoZXIgc2hlbGwgc3ludGF4IGVycm9yLgotCi1GcmkgU2VwIDE1IDIzOjI4OjA1IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1ic2QqKTogRml4IHNoZWxsIHN5bnRheCBlcnJvci4KLQotVGh1IFNlcCAxMiAxMjo1MDo0OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wL3BlLnNjOiAgQWxsb3cgYm90aCBzcGVsbGluZ3Mgb2YgLmN0b3JzLy5kdG9ycy4KLQlTdGFydCAudGV4dCBzZWN0aW9uIG9uIHRoZSByaWdodCBib3VuZGFyeS4gQWx3YXlzIGFsaWduCi0Jc3RhYnMuCi0KLVR1ZSBTZXAgMTIgMTI6MjQ6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0KLQkqIGxkbWFpbi5jIChzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvKTogRGVmaW5lLgotCSh3YXJuaW5nX2NhbGxiYWNrKTogQWRkIG5ldyBwYXJhbWV0ZXIgc3ltYm9sLiAgQ2FsbAotCXdhcm5pbmdfZmluZF9yZWxvYyB0byB0cnkgdG8gZmluZCB0aGUgc2VjdGlvbiBhbmQgVk1BLgotCSh3YXJuaW5nX2ZpbmRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBOVUxMIGFzIHN5bWJvbCBwYXJhbWV0ZXIgdG8gd2FybmluZyBjYWxsYmFjay4KLQotCSogbGQudGV4aW5mbzogQ2xhcmlmeSAtTCBvcHRpb24uCi0KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSh0b3Bvd2VyKTogTGlrZXdpc2UuICBBbHNvLCByZWluZGVudC4KLQkqIGxkd3JpdGUuYyAoY2xvbmVfc2VjdGlvbik6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBBZGQKLQljYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0KLUZyaSBTZXAgIDggMTY6MzI6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS50Z3QuCi0KLQkqIGxkZW11bC5oIChsZGVtdWxfc2V0X3N5bWJvbHMpOiBEZWNsYXJlLgotCShsZGVtdWxfcGFyc2VfYXJncyk6IERlY2xhcmUuCi0JKiBsZGVtdWwuYyAobGRlbXVsX3BhcnNlX2FyZ3MpOiBGaXggaW5kZW50YXRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19IRUFERVJfRElSRU5ULgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IFVzZSBhdXRvY29uZiByZWNvbW1lbmQgbWVjaGFuaXNtIHRvIGRlZmluZQotCURJUiBhbmQgc3RydWN0IGRpcmVudC4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotKi1ic2QqKTogTmV3IGNhc2UuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni1zZXF1ZW50LXB0eCogfCBpWzM0NV04Ni1zZXF1ZW50LXN5c3YqKQotCU5ldyBjYXNlLgotCSogY29uZmlndXJlLnRndCAoaVszNDVdODYtKi1wdHgqKTogTmV3IGNhc2UuCi0KLVRodSBTZXAgIDcgMTA6NDg6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuaW46IFJlbmFtZSBmcm9tIGNvbmZpZy5oLmluLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIgd2l0aCBjb25maWcuaDpjb25maWcuaW4uCi0JQ2hlY2sgZm9yIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuIGNyZWF0aW5nIHN0YW1wLWguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIGNvbmZpZy5pbiByYXRoZXIgdGhhbgotCWNvbmZpZy5oLmluLiAgU2V0IENPTkZJR19IRUFERVJTIHRvIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuCi0JY2FsbGluZyBjb25maWcuc3RhdHVzLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5oIGFuZCBzdGFtcC1oLgotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1zdW5vczY0Kik6IFJlbW92ZS4KLQkqIGxkbGFuZy5jIChsYW5nX21hcCk6IENoZWNrIEJGRDY0LCBub3QgSE9TVF82NF9CSVQuCi0KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBEb24ndCB3YXJuIGFib3V0IG1vdmluZyB0aGUgbG9jYXRpb24KLQljb3VudGVyIGJhY2t3YXJkIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi1XZWQgU2VwICA2IDE0OjQyOjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIHRvIHVzZSBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS50Z3Q6IE5ldyBmaWxlLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvY29uZi4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmguaW46IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvaGVhZGVyLgotCSogc3lzZGVwLmg6IE5ldyBmaWxlLgotCSogbGQuaDogSW5jb3Jwb3JhdGUgb2xkIGNvbnRlbnRzIG9mIGNvbmZpZy5oLgotCSogY29uZmlnLmg6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgZm9yIG5ldyBjb25maWd1cmUgc2NyaXB0LiAgQWxzbzoKLQkoQ0NfRk9SX0JVSUxEKTogUmVtb3ZlLgotCShsZG1haW4ubyk6IERvbid0IGJvdGhlciB0byBlbnN1cmUgdGhhdCBFTVVMIGlzIG5vbi1lbXB0eS4KLQkoZGVwLnNlZCk6IFVzZSBAU1JDRElSQCwgbm90IEBzcmNkaXJALgotCSogZGVwLWluLnNlZDogVXNlIEBTUkNESVJALCBub3QgQHNyY2RpckAuCi0JKiBnZW5zY3JpcHRzLnNoOiBDcmVhdGUgbGRzY3JpcHRzIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSogbGRlbXVsLmMsIGxleHN1cC5jLCBtcHctZW1pcHNpZHQuYzogRG9uJ3QgaW5jbHVkZSAiY29uZmlnLmgiLgotCSogbXB3LWVzaC5jLCBlbXVsdGVtcC8qLmVtOiBMaWtld2lzZS4KLQkqIGxkbWFpbi5jOiBMaWtld2lzZS4gIEluY2x1ZGUgPGN0eXBlLmg+LiAgRG9uJ3QgdHJ5IHRvIHNldAotCUhBVkVfU0JSSyBoZXJlLgotCSogY29uZmlnLyoubXQsIGNvbmZpZy8qLm1oOiBSZW1vdmUuCi0KLVR1ZSBTZXAgIDUgMTQ6NTU6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAotCW5zMzJrLXBjNTMyLWxpdGVzKiBsaWtlIG5zMzJrLXBjNTMyLW5ldGJzZCouICBGcm9tIElhbiBEYWxsLgotCi1GcmkgU2VwICAxIDIyOjI5OjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBGaXggdHlwbyBpbiBzcGVsbGluZyBvZiAuY3RvcnMvLmR0b3JzLgotCi1GcmkgU2VwICAxIDEzOjEzOjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKHdhcm5pbmdfY2FsbGJhY2spOiBBZGQgYWJmZCwgc2VjdGlvbiwgYW5kIGFkZHJlc3MKLQlwYXJhbWV0ZXJzLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JQ2hhbmdlIGNhbGwgdG8gd2FybmluZyBhY2NvcmRpbmdseS4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBJZiBub3QKLQlyZWxvY2F0ZWFibGUgYW5kIG5vdCBzaGFyZWQsIHB1dCAuZ251Lndhcm5pbmcuU1lNQk9MIHNlY3Rpb25zIGludG8KLQl0aGUgLnRleHQgc2VjdGlvbi4KLQotRnJpIFNlcCAgMSAwODozNToxNiAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBtaXBzKnZyNDMwMC1pZHQtZWxmKiBhbmQKLSAgICAgICAgbWlwcyp2cjQzMDBlbC1pZHQtZWxmKiB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IEFkZGVkIGVlbGYzMnZyNDMwMCogdGFyZ2V0cy4KLQkqIGVtdWxwYXJhbXMve2VsZjMydnI0MzAwLnNoLCBlbGYzMnZyNDMwMGVsLnNofTogQWRkZWQuCi0JKiBjb25maWcve21pcHMtdnI0MzAwLm10LCBtaXBzLXZyNDMwMGVsLm10fTogQWRkZWQuCi0KLUZyaSBTZXAgIDEgMTA6NTE6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hMjlrLnNjOiBGaXggdG8gYmUgcmVhc29uYWJsZS4gIEZyb20gQnJlbmRhbiBLZWhvZQotCTxicmVuZGFuQGN5Z251cy5jb20+LgotCi1UaHUgQXVnIDMxIDE2OjM3OjA3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5jIChsZGVtdWxfcGFyc2VfYXJncyk6IE5ldy4KLQkqIGxkZW11bC5oIChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgcGFyc2VfYXJncy4KLQkqIGxleHN1cC5jIChhbGwgcGUgc3R1ZmYpOiBNb3ZlZCBpbnRvIHBlLmVtCi0JKHBhcnNlX2FyZ3MpOiBDYWxsIGVtdWxhdGlvbiBhcmcgcGFyc2VyLgotCSogZW11bHRlbXBsL3BlLmVtIChwYXJzZV9hcmdzKTogaGFuZGxlIFBFIHNwZWNmaWMgYXJncy4KLQotVGh1IEF1ZyAzMSAxNzowMTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKTogRG9uJ3QgdXNlIHRoZSBmaXJzdCByZWdpb24KLQlhcyB0aGUgZGVmYXVsdCByZWdpb24uICBDcmVhdGUgYSBuZXcgcmVnaW9uIGluc3RlYWQuCi0KLVR1ZSBBdWcgMjkgMTQ6MjE6NDEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9zZXRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkZW11bC5oIChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgc2V0X3N5bWJvbHMuCi0JKiBsZG1haW4uYyAobWFpbik6IEFkZCBjYWxsIHRvIGxkZW11bF9zZXRfc3ltYm9scy4KLQkqIGxleHN1cC5jIChzZXRfcGVfdmFsdWUpOiBOZXcgYXJncy4KLQkoc2V0X3BlX25hbWUpOiBOZXcuCi0JKHBhcnNlX2FyZ3MpOiBDb3BlIHdpdGggbmV3IHNldF9wZV92YWx1ZSBhcmdzLgotCSogZW11bHRlbXBsL3BlLmVtIChzZXRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIHNldF9zeW1ib2xzLgotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFVzZSBuZXcgc3ltYm9scy4KLQotVGh1IEF1ZyAyNCAxODoxMjoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogRG9uJ3QgY2FsbCBzZXRfZGVmYXVsdF9kaXJsaXN0IGZvciAtTy4KLQlGb3IgLVksIGlnbm9yZSBhIGxlYWRpbmcgYFAsJywgYW5kIG9ubHkgY2FsbCBzZXRfZGVmYXVsdF9kaXJsaXN0Ci0JYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgdGhlIG90aGVyIGFyZ3VtZW50cy4KLQotVHVlIEF1ZyAyMiAwNzozNjo1OCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogS2VlcCAuZWRhdGEsIGRvbid0IGJhc2Ugc3RhYnMgYXQgMC4KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2g6IFJ1biBQRSBzY3JpcHQuCi0KLU1vbiBBdWcgMjEgMTg6MzA6NDIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBSZW1vdmUgUEUgc3R1ZmYuCi0JKiBsZXhzdXAuYyAob3B0aW9ucyk6IExvYWQgbW9yZSBQRSBvcHRpb25zLgotCShzZXRfcGVfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBBdWcgMTcgMTM6MzU6NDkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCi0JKiBlbXVsdGVtcGwve2FybXBlLnNjLCBpMzg2cGUuc2N9OiBEZWxldGVkLgotCSogZW11bHRlbXBsL3BlLnNjOiBOZXcgZmlsZSBwZXJmb3JtcyBnZW5lcmljIFBFIHN1cHBvcnQgYW5kIHNvcnRzCi0JYXJjaGl2ZSBtZW1iZXJzLgotCSogZW11bHBhcmFtcy97YXJtcGUuc2gsaTM4NnBlLnNofTogVXNlIG5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwve2FybXBlLnNjLCBpMzg2cGUuc2N9OiBEZWxldGVkCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogTmV3LgotCSogTWFrZWZpbGUuaW46IFVzZSBuZXcgZmlsZXMuCi0KLVRodSBBdWcgMTcgMTQ6NDY6MzQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaDg1MDBzLnNjICgucmRhdGEpOiBBbGwgZGF0YSBtdXN0IGdvIGluIGRhdGEgc2VnbWVudC4KLQkoLnN0cmluZ3MsLmN0b3JzLC5kdG9ycyk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDE2IDExOjM4OjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybXBlLnNjOiBBbHdheXMgc3RhcnQgY29kZSBhdCAweDQwMTAwMCwgZXZlbgotCWlmIC1yLgotCSogbGR3cml0ZS5jIChzdHJkdXApOiBOZXcgZXh0ZXJuIGRlY2xhcmF0aW9uLgotCSogbGRncmFtLnkgKGF0eXBlKTogTmV3IHJ1bGUgdG8gY2xhcmlmeSB0eXBlIHBhcnNpbmcuCi0JKiBsZGxhbmcuYyAoaW5pdF9vcyk6IFJlbW92ZSBjb21tZW50ZWQgb3V0IGNvZGUuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IFNldCBTRUNfQUxMT0MgYW5kIFNFQ19MT0FEIGJpdHMKLQl1bmxlc3MgdG9sZCBub3QgdG8gYnkgdGhlIGxpbmsgc2NyaXB0LgotCi1XZWQgQXVnIDE2IDExOjQ1OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2V0X3N0YXJ0b2YpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsYW5nX3Byb2Nlc3MpOiBDYWxsIGl0LgotCi0JKiBsZGdyYW0ueTogVHdlYWsgY2FzZXN5bWxpc3QgdG8gYXZvaWQgYmlzb24gZXJyb3JzLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFjY2VwdCAtaCBhcyBhIHN5bm9ueW0gZm9yIC0tc29uYW1lLCBmb3IKLQlTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLVR1ZSBBdWcgMTUgMTc6MzE6MTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoWVlERUJVRyk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMS4KLQkoQ0FTRSwgRVhURVJOLCBTVEFSVCk6IE5ldyB0b2tlbnMuCi0JKG1yaV9zY3JpcHRfY29tbWFuZCk6IEhhbmRsZSBDQVNFLCBFWFRFUk4sIElOQ0xVREUsIFNUQVJULgotCShjYXNlc3ltbGlzdCk6IE5ldyBub250ZXJtaW5hbC4KLQkoZXh0ZXJuX25hbWVfbGlzdCk6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGV4Lmw6IEFjY2VwdCBsb3dlciBjYXNlIHRyYWlsaW5nIGJhc2Ugc3BlY2lmaWVycy4gIERvbid0Ci0JaWdub3JlIHRoZSBmaXJzdCBkaWdpdCB3aGVuIHRoZSBiYXNlIGlzIGEgc3VmZml4LiAgQWNjZXB0IG1hbnkKLQlFWFBSRVNTSU9OIHN0YXRlIHRva2VucyBpbiBNUkkgc3RhdGUuICBTdXBwb3J0IE1SSSBjb250aW51YXRpb24KLQlsaW5lcyBhbmQgTVJJIHNlbWljb2xvbiBjb21tZW50cy4gIEFjY2VwdCBhbGwgTVJJIGtleXdvcmRzIGluCi0JbG93ZXIgY2FzZS4gIEFkZCBDQVNFLCBFWFRFUk4sIGFuZCBTVEFSVCBNUkkga2V5d29yZHMuCi0KLVR1ZSBBdWcgIDggMTk6MTQ6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBVc2UgeG1hbGxvYwotCWluc3RlYWQgb2YgYWxsb2NhLgotCi1UdWUgQXVnICA4IDE1OjI0OjA1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQsIENYWF9GT1JfVEFSR0VUKTogRG9uJ3QgdXNlCi0JJHIvLi4vZ2NjL3hnY2MgdW5sZXNzIGl0IGlzIHByZXNlbnQuCi0KLVRodSBBdWcgIDMgMTE6NTY6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogT25seSBwdXQgLmN0b3JzIGFuZCAuZHRvcnMgaW4gLnRleHQKLQl3aGVuIENPTlNUUlVDVElORy4KLQkqIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL253LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL3NhMjkyMDAuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjOiBMaWtld2lzZS4KLQotRnJpIEp1bCAyOCAxMjowMjoyMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3t6ODAwMS5zaCwgejgwMDIuc2h9OiBGaXggdHlwby4KLQotVGh1IEp1bCAyNyAyMTowNjoyMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWxpbnV4b2xkbGQpOiBUcmVhdCBsaWtlIGxpbnV4YW91dCouCi0KLVRodSBKdWwgMjcgMTU6MjY6MjggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaTM4NnBlLnNjOiBDb3BlIHdpdGggY29uc3RydWN0b3JzLgotCSogc2NyaXB0dGVtcGwvejhrc2ltLnNjOiBEZWxldGVkLgotCSogc2NyaXB0dGVtcGwvejgwMDAuc2M6IFJlc3VycmVjdGVkIGFzIHRoaXMsIGJ1dAotCWNhbiBoYW5kbGUgejgwMDEgYW5kIHo4MDAyIGZvcm1hdHMuCi0JKiBlbXVscGFyYW1zL3o4a3NpbS5zaDogRGVsZXRlZC4KLQkqIGVtdWxwYXJhbXMve3o4MDAxLnNoLCB6ODAwMi5zaH06IE5ldyBmaWxlcy4KLQkqIGNvbmZpZy96OGtzaW0ubXQ6IERlbGV0ZWQKLQkqIGNvbmZpZy96OGstY29mZi5tdDogTmV3LCBnZW5lcmF0ZXMgYm90aCBlbXVsYXRpb25zLgotCi1UdWUgSnVsIDI1IDE0OjUzOjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEluICVDIGFuZCAlRCBjYXNlLCBhbHdheXMgcHJpbnQgdGhlIEJGRCB1c2luZwotCSVCLCBpbiBjYXNlIGl0IGlzIGluIGFuIGFyY2hpdmUuCi0KLU1vbiBKdWwgMjQgMTU6MjM6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQ2FsbCByZXNldF9tZW1vcnlfcmVnaW9ucyBmb3IgZWFjaAotCXJlbGF4YXRpb24gcGFzcy4KLQotRnJpIEp1bCAyMSAyMjo0OTo0NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLnNkYXRhLCAuc2JzcywgYW5kCi0JX1NEQV9CQVNFLgotCi1UaHUgSnVsIDIwIDE2OjI2OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAoY29uc3RydWN0b3JfY2FsbGJhY2spOiBBbGxvY2F0ZSBzZXRfbmFtZSBpbiBzdGFjawotCWZyYW1lLCByYXRoZXIgdGhhbiBhbHdheXMgY2FsbGluZyBhbGxvY2Egd2l0aCBhIGZpeGVkIHNpemUuCi0KLVdlZCBKdWwgMTkgMTY6MjE6NDMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9hcm1wZS5zaCAoT1VUUFVUX0ZPUk1BVCk6IENoYW5nZSB0byBwZWktYXJtLWxpdHRsZS4KLQkoTElUVExFX09VVFBVVF9GT1JNQVQsIEJJR19PVVRQVVRfRk9STUFUKTogRGVmaW5lLgotCi1Nb24gSnVsIDE3IDEzOjU3OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogU2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGNsb25lCi0Jc2VjdGlvbiB0byB0aGF0IG9mIHRoZSBzZWN0aW9uIGJlaW5nIGNsb25lZC4KLQotCSogbGR3cml0ZS5jIChzcGxpdF9zZWN0aW9ucyk6IERvbid0IHNwbGl0IHRoZSBmaXJzdCBpbnB1dCBzZWN0aW9uCi0JaW50byBhIG5ldyBvdXRwdXQgc2VjdGlvbi4KLQotU2F0IEp1bCAxNSAwMDoyNjozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KLQkoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lIGFzIHllcy4KLQotRnJpIEp1bCAxNCAxMjoxMTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9taXBzZWNvZmYuZW0gKGNoZWNrX3NlY3Rpb25zKTogVXNlICVQLCBub3QgJUYuCi0KLQkqIGxkdmVyLmMgKGhlbHApOiBVcGRhdGUgbGlzdCBvZiBvcHRpb25zIHRvIG1hdGNoIGN1cnJlbnRseQotCXN1cHBvcnRlZCBsaXN0LgotCi1UaHUgSnVsIDEzIDEzOjUyOjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2xuazk2MC5lbSAobGRfbG5rOTYwX2VtdWxhdGlvbik6IEluaXRpYWxpemUKLQlhZnRlcl9vcGVuIGZpZWxkLgotCi0JKiBsZGV4cC5jIChleHBfaW50b3ApOiBEb24ndCBjYXN0IHN0YXRfYWxsb2MgYXJnIHRvIGJmZF9zaXplX3R5cGU7Ci0JaXQgdGFrZXMgYSBzaXplX3QgYW55aG93LgotCShleHBfYmlub3ApOiBMaWtld2lzZS4KLQkoZXhwX3RyaW5vcCk6IExpa2V3aXNlLgotCShleHBfdW5vcCk6IExpa2V3aXNlLgotCShleHBfbmFtZW9wKTogTGlrZXdpc2UuCi0JKGV4cF9hc3NvcCk6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBMaWtld2lzZS4KLQkoaW5pdF9vcyk6IExpa2V3aXNlLgotCShsZGxhbmdfYWRkX3VuZGVmKTogTGlrZXdpc2UuCi0JKGluc2VydF9wYWQpOiBMaWtld2lzZS4KLQkqIGxkZmlsZS5jIChsZGZpbGVfYWRkX2FyY2gpOiBEb24ndCBjYXN0IHhtYWxsb2MgYXJnIHRvCi0JYmZkX3NpemVfdHlwZS4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSXQncyBlYXJtYW91dGIubywgbm90IGVhcm1vdXRiLm8uCi0KLVdlZCBKdWwgMTIgMTE6MzI6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuaCAobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlKTogQWRkIHNlYXJjaCBwYXJhbWV0ZXIgdG8KLQlkZWNsYXJhdGlvbi4KLQkobGRfZW11bGF0aW9uX3hmZXJfdHlwZSk6IEFkZCBzZWFyY2ggcGFyYW1ldGVyIHRvCi0Jb3Blbl9keW5hbWljX2FyY2hpdmUgZW50cnkgcG9pbnQuCi0JKiBsZGVtdWwuYyAobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlKTogQWRkIHNlYXJjaCBwYXJhbWV0ZXIuCi0JKiBsZGZpbGUuYyAobGRmaWxlX3RyeV9vcGVuX2JmZCk6IFJlbmFtZSBmcm9tIHRyeV9vcGVuX2JmZCwgYW5kCi0JbWFrZSBub24tc3RhdGljLiAgQ2hhbmdlIGFsbCBjYWxsZXJzIHRvIHVzZSBuZXcgbmFtZS4KLQkobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBNYWtlIHN0YXRpYy4gIElmIGVudHJ5IGlzIGR5bmFtaWMsIGNhbGwKLQlsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUuCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBEb24ndCBjYWxsIGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZS4KLQkqIGxkZmlsZS5oIChsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IERvbid0IGRlY2xhcmUuCi0JKGxkZmlsZV90cnlfb3Blbl9iZmQpOiBEZWNsYXJlLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JQWNjZXB0IHNlYXJjaCBwYXJhbWV0ZXIuICBEb24ndCBzZWFyY2ggZm9yIGEgbGlicmFyeSwganVzdCBsb29rIGluCi0JYSBzaW5nbGUgcGxhY2UuCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlMaWtld2lzZS4KLQotVHVlIEp1bCAxMSAxNjo0NDoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChzZXRfc2NyaXB0c19kaXIpOiBEb24ndCBiYXNlIHNjcmlwdCBkaXJlY3Rvcnkgb24KLQljdXJyZW50IGRpcmVjdG9yeS4KLQotVHVlIEp1bCAxMSAxMjoyOTowMiAxOTk1ICBSaWNrIFNsYWRrZXkgIDxqcnNAd29ybGQuc3RkLmNvbT4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IERvbid0IHByaW50IHRoZSBsaW5lIG51bWJlciBpZiBpdCBpc24ndAotCW1lYW5pbmdmdWwuCi0KLU1vbiBKdWwgMTAgMTM6Mzg6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBmaWVsZCB3YXJuX2NvbnN0cnVjdG9ycy4KLQkqIGxkbWFpbi5jIChhZGRfdG9fc2V0KTogV2FybiBpZiBjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogTGlrZXdpc2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtd2Fybi1jb25zdHJ1Y3RvcnMuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtd2Fybi1jb25zdHJ1Y3RvcnMuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTogRG9uJ3QKLQlnZXQgY29uZnVzZWQgYnkgZGlyZWN0b3J5IG5hbWVzIGlmIHdlIHNlYXJjaGVkIGZvciB0aGUgZmlsZS4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+OgotCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBBZGQgbmV3IGZpZWxkIGR5bmFtaWMuCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogU2V0IGR5bmFtaWMgZnJvbSBjb25maWcuZHluYW1pY19saW5rLgotCSogbGRmaWxlLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShsZGZpbGVfb3Blbl9maWxlKTogQ2hlY2sgZHluYW1pYyBmaWVsZCBvZiBlbnRyeSwgbm90IGdsb2JhbAotCWR5bmFtaWNfbGluayBmaWVsZC4gIERvbid0IGRvIGEgZHluYW1pYyBzZWFyY2ggd2hlbiBkb2luZyBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IHdhcm4gYWJvdXQgZHluYW1pY19saW5rIGZvciBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTa2lwIGZpbGUgaWYKLQlkeW5hbWljIGlzIGZhbHNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6IEFsd2F5cwotCWxvb3Agb3ZlciBpbnB1dCBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLUJzdGF0aWMsIC1CZHluYW1pYywgLUJzaGFyZWQsIGFuZAotCS1zaGFyZWQuCi0KLU1vbiBKdWwgMTAgMTM6Mjk6NDMgMTk5NSAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFpYi5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogU2V0IGxpbmtfaW5mby5zeW1ib2xpYyB0byBmYWxzZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1Cc3ltYm9saWMuCi0KLVdlZCBKdWwgIDUgMDA6MTI6MTEgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChIQVZFX1NCUkspOiAgRGVmaW5lIGZvciBldmVyeXRoaW5nIGV4Y2VwdAotCXNwZWNpZmljIHN5c3RlbXMgdGhhdCBhcmUga25vd24gdG8gbm90IHN1cHBvcnQgc2Jyay4KLQkobWFpbik6ICBVc2UgSEFWRV9TQlJLIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byB1c2Ugc2Jyay4KLQotVHVlIEp1bCAgNCAxMjo1NTo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCk6Ci0JSGFuZGxlIGV0cmVlX3Byb3ZpZGUuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xvYmFsX25lZWRlZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsb2JhbF9mb3VuZCk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk6IExpa2V3aXNlLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBSZXBsYWNlIGFmdGVyX29wZW5fZGVmYXVsdCB3aXRoCi0JZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbi4KLQotTW9uIEp1bCAgMyAxNDoyNjozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi13aW4zMik6IE5ldyB0YXJnZXQuCi0KLU1vbiBKdWwgIDMgMTQ6Mzk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExldCAtRyBlaXRoZXIgc2V0IHRoZSBzbWFsbCBkYXRhIHNpemUgb3IKLQliZSBlcXVpdmFsZW50IHRvIC0tc2hhcmVkLCBkZXBlbmRpbmcgb24gdGhlIG5leHQgYXJndW1lbnQuICBBY2NlcHQKLQlhbmQgaWdub3JlIC16IGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLVN1biBKdWwgIDIgMTc6NTI6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENhc3QgZm9wZW4gcmVzdWx0IHRvIFBUUiBiZWZvcmUgc3RvcmluZwotCWl0IGluIGxpbmtfaW5mby5iYXNlX2ZpbGUuICBGaXggaW5kZW50YXRpb24uCi0KLVdlZCBKdW4gMjggMTc6MTE6MjUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBBbHdheXMgaW5pdGlhbGl6ZSBQRSBpbmZvIGluIGxpbmtfaW5mby4KLQkqIGxleHN1cC5jIChPUFRJT05fQkFTRV9GSUxFKTogTmV3IG9wdGlvbi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSBuZXcgb3B0aW9uLgotCSogZW11bHBhcmFtcy9hcm1wZS5zaDogT3V0cHV0IHBlaS4KLQkqIGVtdWx0ZW1wbC9pMzg2cGUuZW06IEFkZCBuZXdsaW5lIHRvIGVuZC4KLQkqIHNjcmlwdHRlbXBsL2FybXBlLnNjOiBDaGFuZ2Ugb3V0cHV0IGFuZCBxdW90ZSB0aGUgJHMuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2cGUuc2M6IENoYW5nZSBvdXRwdXQgYW5kIHF1b3RlIHRoZSAkcy4KLQotVGh1IEp1biAyMiAxOTo1NTo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU3VuIE1heSAgNyAxMTo1Mzo0MSBNRFQgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbXNkb3MqLCBpMzg2LSotbW9zcyopOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGkzODZtc2Rvcy5vLgotCShpMzg2bXNkb3Mubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvaTM4Ni1tc2Rvcy5tdDogQ3JlYXRlZC4KLQkqIGVtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoOiBDcmVhdGVkLgotCSogc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjOiBDcmVhdGVkLgotCi1UaHUgSnVuIDIyIDE1OjA2OjM1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjICguZml4dXApOiBBZGQgc3VwcG9ydCBmb3IgYSAuZml4dXAgc2VjdGlvbgotCXRoYXQgY29udGFpbnMgcG9pbnRlcnMgdG8gYmUgcmVsb2NhdGVkLgotCi1UdWUgSnVuIDIwIDE3OjQ3OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWVzaC5jOiBOZXcgZmlsZSwgbW9kaWZpZWQgZm9yIE1QVyBmcm9tIGVzaC5jLgotCSogc2NyaXB0dGVtcGwvc2guc2M6IFJlZm9ybWF0dGVkIHRvIHNpbXBsaWZ5IE1QV2lmaWNhdGlvbiwKLQl1c2UgKigpIHRvIGNvbmNhdCBzdGFiIHNlY3Rpb25zIGluc3RlYWQgb2YgW10uCi0KLVRodSBKdW4gMTUgMDg6NDg6MTYgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IEFkZCBjb25zdHJ1Y3RvciBzdXBwb3J0LgotCi1UdWUgSnVuIDEzIDA5OjExOjIwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiAgQW55IHNlY3Rpb24gd2l0aCBhIERBVEEKLQlzdGF0ZW1lbnQgaGFzIGNvbnRlbnRzLgotCi1TdW4gSnVuIDExIDE1OjIwOjQ2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvbTY4a2VsZi5zaCAoTk9QKTogRGVmaW5lLgotCShEWU5BTUlDX0xJTkspOiBEb24ndCBkZWZpbmUuCi0JKFRFWFRfU1RBUlRfQUREUik6IFNldCB0byAweDgwMDAwMDAwOyB0aGUgZXh0cmEgMHgxMDAgZm9yIGhlYWRlcnMKLQl3aWxsIGNvbWUgZnJvbSB0aGUgbGlua2VyIHNjcmlwdC4KLQotVGh1IEp1biAgOCAxNDoxNzozMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoLCBzY3JpcHRlbXBsL2FybXBlLnNjOiBBZGQgZW5kIGFuZCBzdGFjay4KLQotTW9uIEp1biAgNSAwMjoxNjoyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1nbnUqKTogVXNlIEdOVSBlbGYgY29uZmlnLgotCi1UaHUgTWF5IDI1IDExOjQ5OjI4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCUZyb20gQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQkqIE1ha2VmaWxlLmluOiBGaXh1cCBtb3JlIGdvdGNoYXMgZnJvbSByZW5hbWluZyBlbGYzMnBwY2xlIHRvCi0JZWxmMzJscHBjLgotCi1XZWQgTWF5IDI0IDExOjIzOjIxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgQVJNLVBFLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGFybXBlLm8KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGFybXBlLgotCSogY29uZmlnL2FybS1wZS5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2FybXBlLnNjOiBOZXcgZmlsZS4KLQotCi1Nb24gTWF5IDIyIDE1OjE5OjI2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChoODMwMGgtKi1obXMpOiBEZWxldGVkCi0JKiBjb25maWcvY2YtaDgzMDBoLm10OiBEZWxldGVkLgotCi1UaHUgTWF5IDE4IDA0OjI2OjEwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQlGcm9tIERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybW91dFtsYl0ubwotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXJteyxlW2xiXS0qLWFvdXQuCi0JKiBjb25maWcvYXJtW2xiXS1hb3V0Lm10OiBOZXcgZmlsZXMuCi0JKiBlbXVscGFyYW1zL2FybWFvdXRbbGJdLnNoOiBOZXcgZmlsZXMuCi0JKiBzY3JpcHR0ZW1wbC9hcm1hb3V0LnNjOiBOZXcgZmlsZS4KLQotVHVlIE1heSAxNiAxODoyNzoxMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9wcGNsZS1lbGYzMi5tdCAoRU1VTCk6IFVzZSBlbGYzMmxwcGMsIG5vdCBlbGYzMnBwY2xlLCB0bwotCWJlIHVuaXF1ZSBpbiA4IGNoYXJhY3RlcnMgZm9yIERPUy4KLQotCSogZW11bHBhcmFtcy9lbGYzMmxwcGMuc2g6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gZWxmMzJwcGNsZS5zaC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGNsZS5zaDogRGVsZXRlZC4KLQotRnJpIE1heSAxMiAxMTowMzo1NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCQkJICBUb20gR3JpZXN0IDxncmllc3RAY3MueWFsZS5lZHU+Ci0KLQlJbml0aWFsIHN1cHBvcnQgZm9yIFBFIGV4ZWN1dGFibGVzIChlZyBOVCwgd2luMzIpCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWd1cmUuaW4sIGVpMzg2cGUpOiBBZGQgc3VwcG9ydC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBQRSBhcmd1bWVudCBpbmZvLgotCSogbGR3cml0ZS5jIChwcmludF9maWxlX3N0dWZmKTogRG9uJ3QgcHJpbnQgb3V0IC5kcmVjdHZlCi0JYW5kIC5kZWJ1ZyBzZWN0aW9uIGluZm8uCi0JKiBsZXhzdXAuYyAoc2V0X3N1YnN5c3RlbSwgc2V0X3N0YWNrX2hlYXAsIE9QVElPTl9IRUFQLAotCSBPUFRJT05fU1VCU1lTVEVNLCBwYXJzZV9hcmdzbSBzZXRfc3Vic3lzdGVtLCBzZXRfc3RhY2tfaGVhcCk6Ci0JIEhhbmRsZSBuZXcgYXJndW1lbnRzLgotCSogY29uZmlnL2kzODYtcGUubXQsIGVtdWx0ZW1wbC9pMzg2cGUuZW0sIHNjcmlwdHRlbXBsL2kzODZwZS5zYzoKLQlOZXcgZmlsZXMKLQotV2VkIE1heSAxMCAxODozNzo1OSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYzogIFJlbW92ZSAuUEFSSVNDLnVud2luZCBzZWN0aW9uIGZyb20gdGV4dAotCXNlZ21lbnQuICBUaGlzIGFsbG93cyBsZCAtciB0byBwcmVzZXJ2ZSB1bndpbmQgc2VjdGlvbnMuCi0KLVR1ZSBNYXkgIDkgMTc6MTk6NTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMnBwY2xlLm8uCi0JKGVlbGYzMnBwY2xlLmMpOiBTdXBwb3J0IGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMuCi0KLQkqIGNvbmZpZy9wcGNsZS1lbGYzMi5tdDogTmV3IGZpbGUgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGNsZS5zaDogRGl0dG8uCi0KLVdlZCBNYXkgIDMgMTI6NTY6MzIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IENoZWNrCi0Jc3Vic2VjdGlvbl9hbGlnbm1lbnQsIGluc3RlYWQgb2YgY2hlY2tpbmcgc2VjdGlvbl9hbGlnbm1lbnQgdHdpY2UuCi0JTm90aWNlZCBieSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4uCi0KLVR1ZSBNYXkgIDIgMTY6MzY6MDcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1saXRlcyopOiBIYW5kbGUgbGlrZSBocHBhKi0qLSplbGYqLgotCi1Nb24gQXByIDI0IDE5OjIxOjAyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsZHdyaXRlLmMgKGxkd3JpdGUpOiBCZWZvcmUgZG9pbmcgYW55dGhpbmcsIHJlc2V0IHRoZSBlcnJvcgotCWNvZGUuICBJZiBiZmRfZmluYWxfbGluayByZXR1cm5zIGFuIGVycm9yLCBidXQgdGhlIGVycm9yIGNvZGUgaXMKLQl1bnNldCwgZG9uJ3QgaXNzdWUgYW4gZXh0cmEgbWVzc2FnZS4gIEFzc3VtZSBhIGNvcnJlY3QgZXJyb3IKLQltZXNzYWdlIHdhcyBhbHJlYWR5IHNldC4KLQotRnJpIEFwciAxNCAxNjozMToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbTY4a2VsZi5vLgotCShlbTY4a2VsZi5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9tNjhrLWVsZi5tdCwgZW11bHBhcmFtcy9tNjhrZWxmLnNoOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFVzZSB0aGVtIGZvciBtNjgqLSotZWxmLgotCi1UdWUgQXByIDExIDEyOjAyOjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgotCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0KLQkqIG1wdy1jb25maWcuaW4gKGkzODYtdW5rbm93bi1hb3V0KTogQ2hhbmdlIHRvIGkzODYtdW5rbm93bi1nbzMyLgotCShpMzg2LXVua25vd24tY29mZik6IFJlbW92ZS4KLQkoc2gtaGl0YWNoaS1obXMpOiBOZXcgdGFyZ2V0LgotCShlbXVsYXRpb25fb2ZpbGVzKTogU2V0IGNvcnJlY3RseSBmb3IgZWFjaCB0YXJnZXQuCi0JKHZlcnNpb24sIFRERUZJTkVTKTogQWRkIHRvIG1ha2VmaWxlIGZyYWdtZW50LgotCSogbXB3LW1ha2UuaW4gKEJJU09OKTogVXNlIGJ5YWNjIGluc3RlYWQgb2YgYmlzb24uCi0JKGVtXyouYyk6IFJlcGxhY2Ugd2l0aCBlKi5jIGV2ZXJ5d2hlcmUuCi0JKGxkZ3JhbS5oKTogU2VwYXJhdGUgYWN0aW9uIGZyb20gbGRncmFtLmMgZ2VuZXJhdGlvbi4KLQkoTERfUFJPRyk6IERlcGVuZCBvbiBWZXJzaW9uLnIuCi0JKFZlcnNpb24ucik6IGdlbmVyYXRlIGZyb20gdmVyc2lvbiBpbmZvLgotCSogbXB3LWVtaXBzaWR0LmM6IE5ldyBmaWxlLCBtb2RpZmllZCBmb3IgTVBXIGZyb20gZW1pcHNpZHQuYy4KLQotCSogbXB3LWNvbmZpZy5pbiAobTY4ay1hcHBsZS1tYWNvcywgcHBjLWFwcGxlLW1hY29zLAotICAgICAgICBpMzg2LXVua25vd24tYW91dCwgaTM4Ni11bmtub3duLWNvZmYpOiBOZXcgdGFyZ2V0cy4KLQkobTY4ay1hb3V0LCBtNjhrLWNvZmYpOiBSZW1vdmUgdGFyZ2V0cy4KLQkobWsudG1wKTogQWRkIGRlZmluaXRpb24gb2YgRU1VTC4KLQotCSogbXB3LWNvbmZpZy5pbiAoZW11bG5hbWUpOiBTZXQgYmFzZWQgb24gdGFyZ2V0LgotCShsZGVtdWwtbGlzdC5oKTogQ29uc3RydWN0LgotCSogbXB3LW1ha2UuaW4gKGluc3RhbGwtb25seSk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBEZXBlbmQgb24gaW5zdGFsbC1vbmx5LgotCi0JKiBtcHctbWFrZS5pbiAoYmluZGlyKTogRml4IHBhdGhuYW1lLgotCShpbnN0YWxsKTogTW92ZSBoZXJlIGZyb20gbXB3LWJ1aWxkLmluLgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnQuCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyBtYWtlZmlsZSBmcmFnbWVudC4KLQkoVGhpcyBmaWxlIGlzIHNlbWktYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbi4pCi0JKiBsZGZpbGUuYyAoc2xhc2gpOiBJZiBNUFcsIHNldCB0byBgOicuCi0JKiBsZGxleC5sIChUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRCk6IElmIE1QVywgc2V0IHRoaXMgdG8KLQlwcmV2ZW50IHJlZGVmaW5pdGlvbiBlcnJvcnMuCi0KLVR1ZSBBcHIgIDQgMTc6NTU6MTggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAYmFuZy5oYWNrLmNvbT4KLQotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogQWxpZ24gY2xvbmUgc2VjdGlvbnMgb24gZXZlbgotCWJvdW5kYXJpZXMuCi0KLVRodSBNYXIgMzAgMTQ6MzI6MjYgMTk5NSAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBsaW51eCB0byBkZWZhdWx0IHRvIGVsZi4gIFVzaW5nCi0JaVszNDVdODYtKi1saW51eGFvdXQgd2lsbCBidWlsZCBhIGxpbmtlciB3aGljaCBkZWZhdWx0cyB0byBhLm91dC4KLQkqIGNvbmZpZy9pMzg2LWxhb3V0Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGludXgubXQuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxlbGYubXQuCi0JKiBjb25maWcvaTM4Ni1sZWxmLm10OiBSZW1vdmUuCi0KLVRodSBNYXIgMzAgMTM6MDk6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IElmIG9wZW5pbmcgdGhlIG1hcCBmaWxlIGZhaWxzLCBjYWxsCi0gICAgICAgIGJmZF9zZXRfZXJyb3IgYmVmb3JlIGNhbGxpbmcgZWluZm8uCi0KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IHRoZSAtbm8ta2VlcC1tZW1vcnkgb3B0aW9uLgotCi1Nb24gTWFyIDI3IDExOjEwOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBSZXZlcnQgcGF0Y2ggb2YgTWFyY2ggMTAsIHNpbmNlIHRoZSBTVlI0IGxpbmtlcgotCWRvZXMgbWFyayBzaGFyZWQgbGlicmFyaWVzIGFzIGV4ZWN1dGFibGUuCi0KLVR1ZSBNYXIgMjEgMTU6MTU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBDaGFuZ2UgcG93ZXIgdG8gaW50LiAgUGFzcyBsYXJnZXIgdmFsdWVzCi0JYmVmb3JlIHNtYWxsZXIgdmFsdWVzLgotCShsYW5nX29uZV9jb21tb24pOiBUcmVhdCBpbmZvIGFzIGludCAqLiAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvcgotCWxhc3QgdmFsdWUsIHNpbmNlIGl0IGlzIG5vdyB6ZXJvLgotCi1TYXQgTWFyIDE4IDAxOjQ5OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IEFuIGVtcHR5IGFyY2hpdmUgaXMgT0suCi0KLUZyaSBNYXIgMTcgMTY6MTU6MzEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAocHJvZ3Jlc3MuaCk6IEluY2x1ZGUuCi0JKG1haW4pOiBDYWxsIFNUQVJUX1BST0dSRVNTIGFuZCBFTkRfUFJPR1JFU1MuCi0KLVRodSBNYXIgMTYgMTc6MTc6MzMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTW92ZSBfR09UMl9FTkRfIGFmdGVyIHRoZSAuY3RvcnMgYW5kCi0JLmR0b3JzIHNlY3Rpb25zLCBzbyB0aGF0IHRoZXNlIHBvaW50ZXJzIGdldCByZWxvY2F0ZWQgYWxzby4KLQlEZWZpbmUgdGhlIHN5bWJvbHMgX197QyxEfVRPUl97TElTVCxFTkR9X18gdG8gbWFyayB0aGUgYmVnaW5uaW5nCi0JYW5kIGVuZCBvZiB0aGUgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzLgotCi1UaHUgTWFyIDE2IDEzOjU5OjE0IDE5OTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBJZiB3aG9sZV9hcmNoaXZlIGlzIHRydWUgYW5kIEVOVFJZCi0JZGVzY3JpYmVzIGFuIGFyY2hpdmUsIGNhbGwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgb24gZWFjaCBtZW1iZXIuCi0JKiBsZG1haW4uYyAod2hvbGVfYXJjaGl2ZSk6IE5ldyB2YXJpYWJsZS4KLQkobWFpbik6IEluaXRpYWxpemUgaXQgdG8gZmFsc2UuCi0JKiBsZG1haW4uaDogRGVjbGFyZSB3aG9sZV9hcmNoaXZlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBHcm9rIC0td2hvbGUtYXJjaGl2ZSBzd2l0Y2guCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLXdob2xlLWFyY2hpdmUuCi0KLVRodSBNYXIgMTYgMTE6Mzg6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZW5zY3JpcHRzLnNoIChFTVVMQVRJT05fTkFNRSk6IFNldCBMSUJfUEFUSCB0byBlbXB0eSB3aGVuIG5vdAotCXVzaW5nIHRoZSBkZWZhdWx0IGVtdWxhdGlvbi4KLQotCSogY29uZmlnL2RndXgubWggKEhPU1RJTkdfRU1VKTogVXNlIC1tIHJhdGhlciB0aGFuIHRyeWluZyB0byBzZXQKLQlMREVNVUxBVElPTi4KLQkqIGNvbmZpZy9ocHBhZWxmLm1oIChIT1NUSU5HX0VNVSk6IExpa2V3aXNlLgotCi1UdWUgTWFyIDE0IDEyOjI4OjAzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogU2V0IGZvcmNlX21hagotCWZvciAtbGMuTi4gIEZyb20gSC5KLiBMdSA8aGpsQG55bmV4c3QuY29tPi4KLQotRnJpIE1hciAxMCAxNDo0Mzo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3Qgc2V0IEVYRUNfUCBpZiBsaW5rX2luZm8uc2hhcmVkIGlzIHNldC4KLQotCSogbGRsZXgubDogUmV0dXJuIC1sRklMRU5BTUUgYXMgdGhlIHRva2VuIExOQU1FLgotCSogbGRncmFtLnk6IEFkZCB0b2tlbiBMTkFNRS4KLQkoaW5wdXRfbGlzdCk6IFRyZWF0IExOQU1FIGxpa2UgTkFNRSwgYnV0IHBhc3MgaXQgdG8KLQlsYW5nX2FkZF9pbnB1dF9maWxlIGFzIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB1c2luZyAtbEZJTEVOQU1FIGluIElOUFVULgotCi1UaHUgTWFyICA5IDEyOjIxOjUxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiBJZiB0aGUgYXJjaGl0ZWN0dXJlcyBhcmUgY29tcGF0aWJsZSBjYWxsCi0JYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgdG8gbGV0IHRoZSBiYWNrZW5kIGRvIGFkZGl0aW9uYWwKLQljaGVja3MuCi0KLVR1ZSBNYXIgIDcgMDA6NTM6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX2Nob29zZV9tb2RlKTogSWYgZW11bGF0aW9uIG5vdCByZWNvZ25pemVkLCBsaXN0Ci0JYWxsIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi1Nb24gTWFyICA2IDE0OjAzOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9saXN0X2VtdWxhdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGVtdWwuaCAobGRlbXVsX2xpc3RfZW11bGF0aW9ucyk6IERlY2xhcmUuCi0JKiBsZHZlci5jIChoZWxwKTogTGlzdCBzdXBwb3J0ZWQgdGFyZ2V0cyBhbmQgZW11bGF0aW9ucy4KLQotRnJpIE1hciAgMyAxNTo0MDozNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKC5kZWJ1Zyk6IFJlbG9jYXRlIHRvIGFkZHJlc3MgMC4KLQkoLmRlYnVnX3NyY2luZm8sIC5kZWJ1Z19hcmFuZ2VzLCAuZGVidWdfcHVibmFtZXMsCi0JLmRlYnVnX3NmbmFtZXMsIC5saW5lKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgIDMgMTc6MDc6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGhvbGRfcmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUGxhY2UgcmVhZG9ubHkgc2VjdGlvbnMgd2l0aAotCWNvbnRlbnRzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggIi5yZWwiIGFmdGVyIGhvbGRfcmVsLiAgUmVtb3ZlIHRoZQotCWFzc2VydGlvbiB3aGljaCBjaGVja2VkIGZvciB1bnBsYWNlZCAucmVsIHNlY3Rpb25zLiAgRG9uJ3QgdHJ5IHRvCi0Jc29ydCB0aGUgc2VjdGlvbiBpbnRvIHBsYWNlIGlmIHBsYWNlLT5iZmRfc2VjdGlvbiBpcyBOVUxMLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogU2V0IGhvbGRfcmVsIHRvIHRoZSBmaXJzdAotCXNlY3Rpb24gYmVnaW5uaW5nIHdpdGggIi5yZWwiLgotCi1UaHUgTWFyICAyIDE0OjM0OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCURvYyBub3RlIGZyb20gcGllcnJlQHBoaS5sYS50Y2UuY29tIChQaWVycmUgV2lsbGFyZCk6Ci0JKiBsZC50ZXhpbmZvOiAtWCBhbmQgLXggd29yayBldmVuIGlmIC1zIG9yIC1TIGFyZSBub3Qgc3BlY2lmaWVkLgotCSogbGQuMTogU2ltaWxhciBjaGFuZ2UuCi0KLVdlZCBNYXIgIDEgMTM6NTE6MTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2dsZDk2MGNvZmYuc2ggKENPRkZfQ1RPUlMpOiBEZWZpbmUuCi0JKiBzY3JpcHR0ZW1wbC9pOTYwLnNjOiBVc2UgQ09GRl9DVE9SUyBpZiBDT05TVFJVQ1RJTkcuCi0KLVR1ZSBGZWIgMjggMTI6NDI6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbGludXhlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWxlbGYuCi0JKGlbMzQ1XTg2LSotZ251ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1nZWxmLgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1nZWxmLm10OiBOZXcgZmlsZS4KLQotVHVlIEZlYiAyOCAxMDoyNzo1NCAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggb24gbWlwcy1lY29mZiwgYW5kIGRlZmF1bHQgdG8gdGhlIElEVAotCWNvbmZpZ3VyYXRpb24uCi0KLUZyaSBGZWIgMTcgMTM6MDY6NDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQWRkIHN1cHBvcnQgZm9yIC5nb3QxIGFuZCAuZ290MiBzZWN0aW9ucy4KLQlPZmZzZXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIDMyNzY4IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBHT1QgYXJlYQotCXRvIGRvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgdGFibGUuCi0KLVRodSBGZWIgIDkgMTg6Mjk6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvIHJlY3Vyc2l2ZSBkZWxldGlvbiwgc2luY2UgbGRzY3JpcHRzCi0JaXMgYSBkaXJlY3RvcnkuCi0KLVRodSBGZWIgIDkgMTE6Mzg6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IElmIHRyYWNlX2ZpbGVfdHJpZXMgaXMgdHJ1ZSwgYW5kIHdlIGFyZSB1c2luZwotCWFuIGludGVybmFsIGxpbmtlciBzY3JpcHQsIHByaW50IG91dCB0aGUgc2NyaXB0LgotCSogbGRmaWxlLmMgKHRyeV9vcGVuKTogUmVpbmRlbnQgZnVuY3Rpb24uICBNYWtlIHRoZSBtZXNzYWdlcyBhYm91dAotCW9wZW5pbmcgc2NyaXB0IGZpbGVzIG1vcmUgaW5mb3JtYXRpdmUuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogRm9yIC1WLCBjYWxsIGxkdmVyc2lvbiB3aXRoIDEsIG5vdCAwLgotCSogbGQudGV4aW5mbywgbGQuMTogVXBkYXRlIGFjY29yZGluZ2x5LgotCi1XZWQgRmViICA4IDE3OjM0OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IEFkanVzdCByZWZlcmVuY2VzIHRvIGNvbW1vbiBzeW1ib2wKLQlpbmZvcm1hdGlvbiBmb3IgbmV3IHN0cnVjdHVyZS4KLQotTW9uIEZlYiAgNiAxMjoxNzoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jICh1bmRlZmluZWRfc3ltYm9sKTogSGFuZGxlIHNlY3Rpb24gYmVpbmcgTlVMTC4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogSGFuZGxlIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKHByaW50X29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkobGFuZ19maW5pc2gpOiBMaWtld2lzZS4KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9jb21tb24pOiBMaWtld2lzZS4KLQkqIGxkd3JpdGUuYyAocHJpbnRfc3ltYm9sKTogTGlrZXdpc2UuICBBbHNvLCBiZmRfbGlua19oYXNoX3dlYWsKLQlyZW5hbWVkIHRvIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLgotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogU2V0IGFkZHJlc3Mgb2YgLmRhdGEgc2VjdGlvbiBjb3JyZWN0bHkKLQl3aGVuIC1uIG9yIC1OIGlzIHVzZWQuICBQYXRjaCBmcm9tIENocmlzIEcgRGVtZXRyaW91Ci0JPENocmlzX0dfRGVtZXRyaW91QExBR0FWVUxJTi5QREwuQ1MuQ01VLkVEVT4uCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBTaW1pbGFyIGNoYW5nZS4KLQotVHVlIEphbiAzMSAxNjoyMDo1MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2xhcmlmeSBlcnJvciBtZXNzYWdlIHdoZW4gdXNlcgotCXNwZWNpZmllZCBzdGFydCBhZGRyIGNvbmZsaWN0cyB3aXRoIHJlZ2lvbi4gIEZpeCByZXNldHRpbmcgb2YKLQlyZWdpb24gcG9pbnRlci4KLQotVHVlIEphbiAzMSAxMjozNzowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IEluIGNhc2UgTkFNRSwgcGVybWl0IGFuIGFic29sdXRlIHN5bWJvbAotCWluIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLgotCi1Nb24gSmFuIDMwIDExOjMzOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlcGVuZCB1cG9uIGNsZWFuLiAgRG9uJ3QgYm90aGVyIHRvCi0JcmVtb3ZlIGZpbGVzIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBieSBjbGVhbi4gIEZyb20gcGF0Y2ggYnkKLQlhbGFuQFNQUkkuTGV2ZWxzLlVuaVNBLkVkdS5BdSAoQWxhbiBNb2RyYSkuCi0KLUZyaSBKYW4gMjcgMTY6Mjc6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogRm9yCi0JYSBNSVBTIHRhcmdldCwgY2xvYmJlciB0aGUgc2l6ZSBvZiBhbGwgYnV0IHRoZSBmaXJzdCBpbnB1dAotCS5yZWdpbmZvIHNlY3Rpb24gdG8gYmUgMCwgc28gdGhhdCBsYW5nX3NpemVfc2VjdGlvbnMgc2V0cyB0aGUKLQljb3JyZWN0IHNpemUgZm9yIHRoZSBvdXRwdXQgLnJlZ2luZm8gc2VjdGlvbi4KLQotVGh1IEphbiAyNiAxOTo1MzozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaXMuCi0KLVRodSBKYW4gMjYgMTI6MzM6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWFiaS4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBOZXcgZmlsZSBmb3IgUG93ZXJQQyBlbWJlZGRlZCBBQkkKLQlzdXBwb3J0LgotCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChTQ1JJUFRfTkFNRSk6IFVzZSBlbGZwcGMuc2MgaW5zdGVhZCBvZgotCWVsZi5zYywgd2hpY2ggZGVmaW5lcyBzb21lIG5ldyBzeW1ib2xzIFBvd2VyUEMgZWxmIG5lZWRzLgotCi1UdWUgSmFuIDI0IDEwOjMyOjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogRG9uJ3QgZHVtcCBjb3JlIGlmIGEKLQljb25zdHJ1Y3RvciBlbnRyeSBpcyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQotTW9uIEphbiAyMyAxMzo1ODoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1nbnUqKTogU2V0IGxkX3RhcmdldCB0byBpMzg2LWdudS4KLQkqIGNvbmZpZy9pMzg2LWdudS5tdDogTmV3IGZpbGUuICBJbmNsdWRlIEVMRiBzdXBwb3J0LgotCi1UaHUgSmFuIDE5IDE2OjIyOjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IElmCi0JdGhlcmUgYXJlIGFueSBpbnB1dCBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcsIHRyZWF0IHRoZW0gYXMKLQljb250YWluaW5nIGEgd2FybmluZyBtZXNzYWdlIHRvIGJlIHByaW50ZWQgYnkgdGhlIGxpbmtlciwgYW5kCi0JY2xvYmJlciB0aGUgc2l6ZSBzbyB0aGF0IHRoZSBtZXNzYWdlIGlzIG5vdCBjb3BpZWQgaW50byB0aGUgb3V0cHV0Ci0JZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IC5nbnUud2FybmluZyBzZWN0aW9ucyBpbnRvIHRoZSAudGV4dAotCXNlY3Rpb24uCi0KLVN1biBKYW4gMTUgMTY6NDU6MDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodzY1LSotKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlLgotCSogc2NyaXB0dGVtcGwvdzY1LnNjOiBOZXcuCi0JKiBjb25maWcvY29mZi13NjUubXQ6IE5ldy4KLQotVGh1IEphbiAxMiAwMTozMjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3BsYWNlX29ycGhhbnMpOiBEb24ndCBpZ25vcmUgZmlsZXMgd2l0aAotCWp1c3Rfc3ltc19mbGFnIHNldC4gIEluc3RlYWQsIHB1dCBhbGwgdGhlaXIgc2VjdGlvbnMgaW4KLQliZmRfYWJzX3NlY3Rpb25fcHRyLCB1c2luZyB0aGUgc2VjdGlvbiBWTUEgYXMgdGhlIG91dHB1dF9vZmZzZXQuCi0KLVdlZCBKYW4gMTEgMjI6NTk6MDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogRG9uJ3QgdXNlIGBjb25zdCcgd2l0aCB0eXBlZGVmCi0JbmFtZSBgcmVsb2NfaG93dG9fdHlwZScsIHNpbmNlIGl0J3Mgbm93IGRlZmluZWQgdG8gYmUgY29uc3QuCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfcmVsb2MpOiBEaXR0by4KLQkqIGxkbGFuZy5oIChsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlLCBsYW5nX2FkZF9yZWxvYyk6IERpdHRvLgotCi1XZWQgSmFuIDExIDExOjI0OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRleHAuYyAoZm9sZF9iaW5hcnkpOiBBZGRpbmcgb3Igc3VidHJhY3RpbmcgYW4gYWJzb2x1dGUgdmFsdWUKLQl0byBhIHJlbGF0aXZlIHZhbHVlIGRvZXMgbm90IHJlcXVpcmUgZm9yY2luZyB0aGUgcmVsYXRpdmUgdmFsdWUgdG8KLQliZSBhYnNvbHV0ZS4gIEFsc28sIHJlaW5kZW50IGZ1bmN0aW9uLgotCi1XZWQgRGVjIDI4IDIyOjA1OjUyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkd3JpdGUuYyAoY2xvbmVfc2VjdGlvbik6IENyZWF0ZSBhIHN5bWJvbCB3aXRoIHRoZQotCXNhbWUgbmFtZSBhcyB0aGUgc2VjdGlvbi4KLQotTW9uIERlYyAxOSAxNDowMjoxMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZC5oIChzcGxpdF9ieV9yZWxvYywgc3BsaXRfYnlfZmlsZSk6IE5ldyBmbGFncy4KLQkqIGxkd3JpdGUuYyAgKGNsb25lX3NlY3Rpb24sIHNwbGl0X3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVW5kZXJzdGFuZCBuZXcgc3BsaXQgb3B0aW9ucy4KLQotRnJpIERlYyAgOSAxNzoyMjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTW92ZSAuY3RvcnMgYW5kIC5kdG9ycyBmcm9tIC50ZXh0IHNlZ21lbnQgdG8KLQkuZGF0YSBzZWdtZW50LiAgVGhleSBtdXN0IGJlIHdyaXRhYmxlIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LiAgRnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+LgotCi1GcmkgRGVjICAyIDE0OjA5OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AcnRsLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9taXBvc2Vjb2ZmLmVtOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdC5zaCAoVEVNUExBVEVfTkFNRSk6IFNldCB0byBtaXBzZWNvZmYuCi0JKiBlbXVscGFyYW1zL21pcHNpZHRsLnNoIChURU1QTEFURV9OQU1FKTogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBQdXQgLnJlbC5zZGF0YSBzZWN0aW9ucyBpbiAudGV4dCwgYW5kCi0JcHJvdmlkZSBfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgYW5kIF9fcnVudGltZV9yZWxvY19zdG9wIGlmIHRoZXkgYXJlCi0JdXNlZC4gICBBbGlnbiBfZmRhdGEgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LgotCSogTWFrZWZpbGUuaW4gKGVtaXBzaWR0LmMpOiBEZXBlbmQgdXBvbiBtaXBzZWNvZmYuZW0gcmF0aGVyIHRoYW4KLQlnZW5lcmljLmVtLgotCShlbWlwc2lkdGwuYyk6IExpa2V3aXNlLgotCShjaGVjayk6IFBhc3MgQ0NfRk9SX0hPU1QgYW5kIENGTEFHU19GT1JfSE9TVCB0byBydW50ZXN0LgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgbmV3IGZpZWxkIGVtYmVkZGVkX3JlbG9jcy4KLQkqIGxkZW11bC5oIChsZGVtdWxfYWZ0ZXJfb3BlbiwgYWZ0ZXJfb3Blbl9kZWZhdWx0KTogRGVjbGFyZS4KLQkobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIG5ldyBmaWVsZCBhZnRlcl9vcGVuLgotCSogbGRlbXVsLmMgKGxkZW11bF9hZnRlcl9vcGVuKTogTmV3IGZ1bmN0aW9uLgotCShhZnRlcl9vcGVuX2RlZmF1bHQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQ2FsbCBsZGVtdWxfYWZ0ZXJfb3Blbi4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0tZW1iZWRkZWQtcmVsb2NzLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplCi0JbmV3IGFmdGVyX29wZW4gZmllbGQgdG8gYWZ0ZXJfb3Blbl9kZWZhdWx0LgotCSogZW11bHRlbXBsL2dlbmVyaWMuZW0sIGVtdWx0ZW1wbC9nbGQ5NjAuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2dsZDk2MGMuZW0sIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSwgZW11bHRlbXBsL204OGtiY3MuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtLCBlbXVsdGVtcGwvdmFuaWxsYS5lbTogTGlrZXdpc2UuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBNZW50aW9uIC1lbWJlZGRlZC1yZWxvY3MuCi0KLVdlZCBOb3YgMjMgMjI6MDQ6NDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBlc2hsLm8uCi0JKiBjb25maWcvY29mZi1zaC5tdDogQWRkIHNobCBlbXVsYXRpb24uCi0KLVR1ZSBOb3YgMjIgMTE6NTU6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEZpbGwgLnRleHQgc2VjdGlvbiB3aXRoIE5PUFMuICBGcm9tIEVyaWMKLQlZb3VuZ2RhbGUgPGVyaWNAYWliLmNvbT4uCi0KLVRodSBOb3YgMTcgMTQ6Mzk6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JUGF0Y2hlcyBmcm9tIHBpcmtlckBlaXVuaXgudHV3aWVuLmFjLmF0IChNYXJ0aW4gUGlya2VyKS4KLQkqIGNvbmZpZy9pMzg2bGludXgubWg6IE5ldyBmaWxlOyBzZXQgSE9TVElOR19DUlQwLgotCSogZ2Vuc2NyaXB0cy5zaDogRG9uJ3QgcHV0ICR7bGliZGlyfSBpbiBMSUJfUEFUSCBpZiBpdCBpcwotCS91c3IvbGliLCBzaW5jZSB0aGF0IGlzIGFscmVhZHkgaW4gTElCX1BBVEguCi0KLVdlZCBOb3YgMTYgMTA6MDM6MDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2MgKC50ZXh0KTogSGFuZGxlIGEgdXNlIHJkZWZpbmVkIHRleHQgc3RhcnQKLQlhZGRyZXNzLgotCSguZGF0YSwgLmJzcyk6IElmICItTiIsIHRoZW4gcGxhY2UgdGhlIGRhdGEvYnNzIGp1c3QgYWZ0ZXIgdGhlIGVuZAotCW9mIHRoZSAudGV4dCBzZWN0aW9uIHJhdGhlciB0aGFuIGF0IHRoZSBkZWZhdWx0IDB4NDAwMDAwMDAuCi0KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2MgKC50ZXh0KTogUGxhY2UgdW53aW5kIGRlc2NyaXB0b3JzIGluIHRoZQotCXRleHQgc2VnbWVudC4KLQotU2F0IE5vdiAxMiAxNTo1NTo1NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlQYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYWliLmNvbT46Ci0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBEb24ndCB3YXJuIGlmIGVudHJ5IHN5bWJvbCBub3QgZm91bmQKLQl3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogV2FybiBpZgotCWF0dGVtcHRpbmcgdG8gcGxhY2UgYW4gb3JwaGFuZWQgcmVsb2NhdGlvbiBzZWN0aW9uIHdoZW4gZ2VuZXJhdGluZwotCWEgZHluYW1pY2FsbHkgbGlua2VkIG9iamVjdC4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgRU5UUlkoJHtFTlRSWX0pLCBhbmQgZGVmYXVsdCAke0VOVFJZfSB0bwotCV9zdGFydC4KLQotRnJpIE5vdiAxMSAxNDoyNzoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBmaWVsZCBleHBvcnRfZHluYW1pYy4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC0tZXhwb3J0LWR5bmFtaWMuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIGV4cG9ydF9keW5hbWljIGFyZ3VtZW50IHRvIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0KLVdlZCBOb3YgIDkgMTI6NDc6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogU2V0IFNFQ19BTExPQyBpbiBhbnkgc2VjdGlvbiB3aGVyZQotCXdlIGFsbG9jYXRlIGNvbW1vbiBzeW1ib2xzLgotCi1UdWUgTm92ICA4IDE3OjUwOjQzIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY0BhaWIuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCAucmVsLmluaXQsIC5yZWxhLmluaXQsIC5yZWwuZmluaSwgYW5kCi0JLnJlbGEuZmluaSB0byB0aGUgbGlzdCBvZiAucmVsKiBzZWN0aW9ucy4KLQotVHVlIE5vdiAgOCAxNzo0Nzo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBBZGQgbmV3IGFyZ3VtZW50IHBsYWNlLiAgT25seSBhY2NlcHQKLQlsaW5rZXIgc2NyaXB0cyBpZiBwbGFjZSBpcyBub3QgTlVMTC4gIFB1dCBjb21tYW5kcyBmb3VuZCBpbiBhbgotCWFzc3VtZWQgbGlua2VyIHNjcmlwdCBpbnRvIHBsYWNlLgotCShsb29rdXBfbmFtZSk6IFBhc3MgTlVMTCBhcyBwbGFjZSBhcmd1bWVudCB0byBsb2FkX3N5bWJvbHMuCi0JKG9wZW5faW5wdXRfYmZkcyk6IEluIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW0gY2FzZSwgcGFzcyBhIHBsYWNlCi0JYXJndW1lbnQgdG8gbG9hZF9zeW1ib2xzLCBhbmQgc3RvcmUgYW55IG5ldyBzdGF0ZW1lbnRzIGFmdGVyIHRoZQotCWN1cnJlbnQgb25lLgotCi1Nb24gTm92ICA3IDE1OjUzOjAyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IEJ1bXAgdG8gMi41LjMuCi0KLUZyaSBOb3YgIDQgMTU6MTE6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGUqbmJzZC5jKTogRml4IHR5cG8gaW4gZGVwZW5kZW5jaWVzLgotCi1UaHUgTm92ICAzIDE5OjM1OjQ0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IEFkZCBtaXNzaW5nICJlbHNlIHRydWUiIGNsYXVzZS4KLQotCSogZW11bHBhcmFtcy92YXguc2ggKE9VVFBVVF9GT1JNQVQpOiBVc2UgImEub3V0Ii4KLQotCSogc2NyaXB0dGVtcGwvZ28zMmNvZmYuc2M6IENoYW5nZXMgZnJvbSBESiBEZWxvcmllOiBDaGFuZ2UgZGVmYXVsdAotCWVudHJ5IHBvaW50IHRvICJzdGFydCIuICBBbGlnbiBhdCBlbmQgb2YgZWFjaCBzZWN0aW9uIHRvIDB4MjAwLgotCVN0YXJ0IC50ZXh0IHNlY3Rpb24gMHgxMDAwIGxhdGVyLiAgQWRkIF9ldGV4dCwgX2VkYXRhLCBfZW5kCi0Jc3ltYm9scy4KLQotV2VkIE5vdiAgMiAxMjoxNzo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYWRkX3NldF9lbnRyeSk6IERvbid0IHBlcm1pdCBhIHNldCB0byBiZQotCWNvbXBvc2VkIG9mIGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzLgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IElmIHRoZSBvdXRwdXQgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0JcmVsb2MsIGFuZCB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdHJ5IGdldHRpbmcKLQl0aGUgcmVsb2MgZnJvbSB0aGUgaW5wdXQgZm9ybWF0LgotCi1UdWUgTm92ICAxIDEwOjMwOjE5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW02OGtuYnNkLm8uCi0JICAoZW02OGtuYnNkLmMpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWcvbTY4ay1uYnNkLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvbTY4a25ic2Quc2g6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChtNjgqLSotbmV0YnNkKik6IFVzZSBhYm92ZSBjb25maWdzLgotCi1Nb24gT2N0IDMxIDE5OjM1OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogSWYgd2UgZmluZCBhbgotCWFwcHJvcHJpYXRlbHkgbmFtZWQgc3RhdGljIGxpYnJhcnksIHN0b3AgdGhlIHNlYXJjaCBhdCB0aGF0Ci0JZGlyZWN0b3J5LgotCi1XZWQgT2N0IDI2IDEzOjU5OjEyIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZWkzODZuYnNkLm8sIGVuczMya25ic2QubwotCSAgYW5kIGVzcGFyY25ic2Qubzsgc29ydGVkIGVudHJpZXMuCi0gICAgICAgICAgKGVpMzg2bmJzZC5jLGVuczMya25ic2QuYyxlc3BhcmNuYnNkLmMpOiBOZXcgdGFyZ2V0cy4KLQotCSogY29uZmlnL25ldGJzZDUzMi5tdDogUmVtb3ZlZC4KLQkqIGVtdWxwYXJhbXMvbmV0YnNkNTMyLnNoOiBSZW1vdmVkLgotCi0JKiBjb25maWcve2kzODYtbmJzZC5tdCxuczMyay1uYnNkLm10LHNwYXJjLW5ic2QubXR9OiBOZXcgZmlsZXMuCi0JKiBlbXVscGFyYW1zL3tpMzg2bmJzZC5zaCxuczMya25ic2Quc2gsc3BhcmNuYnNkLnNofTogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLW5ldGJzZCosIG5zMzJrLXBjNTMyLW5ldGJzZCosCi0JICBzcGFyYyotKi1uZXRic2QqKTogVXNlIGFib3ZlIGNvbmZpZ3MuCi0KLVR1ZSBPY3QgMjUgMTE6NDc6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobXVsdGlwbGVfY29tbW9uKTogT25lIG9mIHRoZSB0eXBlcyBtYXkgbm93IGJlCi0JYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4gIFRoZSBvbGQgQkZEIGFyZ3VtZW50IG1heSBiZSBOVUxMLgotCi1UaHUgT2N0IDIwIDIyOjAxOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgKiBhdCB0aGUgZW5kIG9mIG02OGstaHAtaHB1eC4KLQotVHVlIE9jdCAxOCAxNTo1ODozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkbGV4Lmw6IENhc3QgYXNzaWdubWVudCB0byB5eV9jaF9idWYgZmllbGQgdG8gY2hhciAqLCBub3QgdG8KLQlZWV9DSEFSICouCi0KLU1vbiBPY3QgMTcgMTQ6NTM6MTYgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9udy5zYzogR2F0aGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kCi0JICBkZWZpbmUgX19DVE9SX19MSVNUX18gYW5kIF9fRFRPUl9MSVNUX18gYXBwcm9wcmlhdGVseS4KLQotRnJpIE9jdCAxNCAxNDozNTozOCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlaTM4Nm53Lm8gYW5kIGVwcGNudy5vLgotCSAgKGVpMzg2bncuYywgZXBwY253LmMpOiBOZXcgdGFyZ2V0cy4KLQotCSogY29uZmlnL3tpMzg2LHBwY30tbncubXQsIGVtdWxwYXJhbXMve2kzODYscHBjfW53LnNoLAotCSAgc2NyaXB0dGVtcGwvbncuc2M6IE5ldyBmaWxlcywgZm9yIGkzODYgYW5kIHBvd2VycGMgbmV0d2FyZS4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2VkIG5ldHdhcmUgbGRfdGFyZ2V0IG5hbWUgdG8gYmUge2kzODYscHBjfS1udwotCSAgaW5zdGVhZCBvZiB7aTM4NixwcGN9LWVsZi4KLQotIAkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbmV0d2FyZSk6IFJlbW92ZWQuICBUaGVyZSBpcyBubyBzdWNoCi0JICB0aGluZyBhbnltb3JlLgotCi0JKiBsZGludC50ZXhpbmZvOiBNb3ZlIG1pc3BsYWNlZCBgQGVuZCBpZnRleCcuCi0KLUZyaSBPY3QgMTQgMTI6MDI6MTggMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljQGFpYi5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIC5yZWwuY3RvcnMsIC5yZWxhLmN0b3JzLCAucmVsLmR0b3JzLCBhbmQKLQkucmVsYS5kdG9ycyB0byB0aGUgbGlzdCBvZiAucmVsKiBzZWN0aW9ucy4KLQotVGh1IE9jdCAxMyAxNDoxNjoyNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBVcGRhdGUgdG8gdmVyc2lvbiAyLjUuCi0JKiBWZXJzaW9uIDIuNSByZWxlYXNlZC4KLQotCSogY29uZmlndXJlLmluIChhbGxfdGFyZ2V0cyk6IEhhbmRsZSBpMzg2LWxpbnV4Ki4KLQotVGh1IE9jdCAxMyAxMToyNDozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IFNldCBfZXRleHQgYW5kIF9fZXRleHQgdG8gLiwgbm90Ci0JJHtEQVRBX0FMSUdOTUVOVH0uICBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBTdW5PUywgYW5kLCB3aXRoIGx1Y2ssCi0Jd2lsbCBub3QgYnJlYWsgYW55IG90aGVyIHN5c3RlbS4gIEZyb20gRXJpYyBWYWxldHRlCi0JPGV2QGNob3J1cy5mcj4uCi0KLVdlZCBPY3QgMTIgMTY6MjI6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENoYW5nZSAtViB0byBiZSBhIHN5bm9ueW0gZm9yIC12LiAgQWRkCi0JLS12ZXJib3NlIHRvIGdldCB0aGUgb2xkIC1WIGJlaGF2aW91ci4KLQkqIGxkLjEsIGxkLnRleGluZm86IERvY3VtZW50IHRoaXMgY2hhbmdlLgotCi1UdWUgU2VwIDI3IDE0OjU2OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZW1vdmUKLQlhc3NlcnRpb24sIHNpbmNlIGl0IGNvdWxkIGZhaWwgd2l0aCBhIHVzZXIgZGVmaW5lZCBsaW5rZXIgc2NyaXB0LgotCi0JKiBsZGV4cC5jIChmb2xkX25hbWUpOiBGb3IgREVGSU5FRCBjYXNlLCBkb24ndCB0cnkgdG8gbG9vayB1cCB0aGUKLQluYW1lIGluIHRoZSBoYXNoIHRhYmxlIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UtLXRoZSBoYXNoIHRhYmxlIGRvZXMKLQlub3QgZXZlbiBleGlzdCBhdCB0aGF0IHBvaW50LCBtdWNoIGxlc3MgaGF2ZSB0aGUgcmlnaHQgdmFsdWUuCi0KLQkqIE1ha2VmaWxlLmluIChDQyk6IERlZmluZS4KLQkoQ1hYKTogTW92ZSBkZWZpbml0aW9uLCBjaGFuZ2UgZnJvbSBnKysgdG8gZ2NjLgotCShFWFBFQ1QsIFJVTlRFU1QpOiBDb3B5IGRlZmluaXRpb25zIGZyb20gdG9wIGxldmVsIE1ha2VmaWxlLmluLgotCShSVU5URVNUX0NDLCBSVU5URVNUX0NGTEFHUyk6IFJlbW92ZS4KLQkoUlVOVEVTVF9DWFgsIFJVTlRFU1RfQ1hYRkxBR1MpOiBSZW1vdmUuCi0JKENDX0ZPUl9UQVJHRVQsIENYWF9GT1JfVEFSR0VUKTogQ29weSBmcm9tIHRvcCBsZXZlbCBNYWtlZmlsZS5pbi4KLQkoLmNjLm8pOiBDb21tZW50IG91dC4KLQkodGVzdGRpcik6IFJlbW92ZS4KLQkoc2l0ZS5leHApOiBEb24ndCBjcmVhdGUgdGVzdGRpciBvciBzZXQgdG1wZGlyLgotCShjaGVjayk6IFJ1biBjaGVja3MgZXZlbiBpZiBub3QgcnVubmluZyBuYXRpdmUuICBVc2UgQ0NfRk9SX1RBUkdFVAotCWluc3RlYWQgb2YgUlVOVEVTVF9DQywgYW5kIGxpa2V3aXNlIGZvciBDWFguCi0JKGNkdGVzdCB0YXJnZXRzKTogQ29tbWVudCBvdXQuCi0JKiBjb25maWcvc29sYXJpczIubWggKEhPU1RJTkdfTElCUyk6IE9ubHkgbWVudGlvbiBjcnRlbmQubyBvbmNlLgotCSogY2R0ZXN0LWJhci5jYywgY2R0ZXN0LWZvby5jYywgY2R0ZXN0LWZvby5oOiBSZW1vdmUuCi0JKiBjZHRlc3QtbWFpbi5jYywgY2R0ZXN0LmV4cDogUmVtb3ZlLgotCi1Nb24gU2VwIDI2IDExOjQwOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMmJtaXAuc2g6IFJlbmFtZSBmcm9tIGVsZjMybWlwYi5zaCB0byBhdm9pZCBET1MKLQlmaWxlIG5hbWluZyBwcm9ibGVtcy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwLnNoOiBSZW5hbWUgZnJvbSBlbGYzMm1pcGwuc2guCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBSZW5hbWUgZWVsZjMybWlwYi5vIHRvCi0JZWVsZjMyYm1pcC5vIGFuZCBlZWxmMzJtaXBsLm8gdG8gZWVsZjMybG1pcC5vLgotCShlZWxmMzJibWlwLmMpOiBSZW5hbWUgZnJvbSBlZWxmMzJtaXBiLmMuICBVc2UgZWxmMzJibWlwLnNoLgotCShlZWxmMzJsbWlwLmMpOiBSZW5hbWUgZnJvbSBlZWxmMzJtaXBsLmMuICBVc2UgZWxmMzJsbWlwLnNoLgotCSogY29uZmlnL21pcHNiLWVsZjMyLm10IChFTVVMKTogVXNlIGVsZjMyYm1pcCwgbm90IGVsZjMybWlwYi4KLQkqIGNvbmZpZy9taXBzbC1lbGYzMi5tdCAoRU1VTCk6IFVzZSBlbGYzMmxtaXAsIG5vdCBlbGYzMm1pcGwuCi0KLQkqIGdlbnNjcmlwdHMuc2g6IEFsd2F5cyBzZWFyY2ggL3Vzci9sb2NhbC9UQVJHRVQvbGliLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IElmIC1OIGlzIHNldCwgZm9yY2UgREFUQV9BRERSIHRvIGJlICIuIi4KLQotRnJpIFNlcCAyMyAxNTowNTo0OSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBpMzg2LWJzZGkqIHRhcmdldHMgbGlrZSBpMzg2LWJzZC4KLQotRnJpIFNlcCAyMyAwMDowNjo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIHN1cHBvcnQgZm9yIC1hIGZvciBIUC9VWAotCWNvbXBhdGliaWxpdHkuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogLWMgdGFrZXMgYW4gYXJndW1lbnQuCi0KLVR1ZSBTZXAgMjAgMTQ6MzU6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgbmV3IGZpZWxkIGVuZGlhbi4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1FQiBhbmQgLUVMIGJ5IHNldHRpbmcKLQljb21tYW5kX2xpbmUuZW5kaWFuLgotCSogbGRncmFtLnkgKGlmaWxlX3AxKTogQWNjZXB0IE9VVFBVVF9GT1JNQVQgd2l0aCB0aHJlZSBhcmd1bWVudHMuCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCk6IEFkZCBhcmd1bWVudHMgYmlnIGFuZCBsaXR0bGUuCi0JSWYgY29tbWFuZF9saW5lLmVuZGlhbiBpcyBzZXQsIHVzZSBpdCB0byBzZWxlY3QgYmlnIG9yIGxpdHRsZQotCXJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkqIGxkbGFuZy5oIChsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2g6IERlZmluZSBCSUdfT1VUUFVUX0ZPUk1BVCBhbmQKLQlMSVRUTEVfT1VUUFVUX0ZPUk1BVC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBsLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2JpZy5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21pcHNic2Quc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzaWR0LnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdGwuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzbGl0LnNoOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRGVmaW5lIEJJR19PVVRQVVRfRk9STUFUIGFuZAotCUxJVFRMRV9PVVRQVVRfRk9STUFUIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBQYXNzIHRoZW0gdG8KLQlPVVRQVVRfRk9STUFULgotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogUGFzcyBCSUdfT1VUUFVUX0ZPUk1BVCBhbmQKLQlMSVRUTEVfT1VUUFVUX0ZPUk1BVCB0byBPVVRQVVRfRk9STUFULgotCSogc2NyaXB0dGVtcGwvbWlwc2JzZC5zYzogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluIChsZGdyYW0uaCk6IE1ha2Ugc2VwYXJhdGUgdGFyZ2V0IGZyb20gbGRncmFtLmMsCi0JZGVwZW5kaW5nIHVwb24gbGRncmFtLmMsIHNvIHRoYXQgYSBwYXJhbGxlbCBtYWtlIGRvZXMgbm90IHRyeSB0bwotCWJ1aWxkIGJvdGggYXQgb25jZS4KLQotCSogY29uZmlndXJlLmluIChtaXBzKmVsLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMm1pcGIubyBhbmQgZWVsZjMybWlwbC5vLgotCShlZWxmMzJtaXBsLmMpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWcvbWlwc2wtZWxmMzIubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGwuc2g6IE5ldyBmaWxlLgotCi1GcmkgU2VwIDE2IDEyOjE2OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBSYXRoZXIgdGhhbiBwcm9oaWJpdGluZyBsZCAtciAtcywgdHJlYXQgaXQgYXMKLQlsZCAtciAtUyAteC4KLQotVGh1IFNlcCAxNSAxMzowNTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBQcmludCBCRkQgZmlsZSBuYW1lIGFzIHdlbGwgYXMgZmlsZSBuYW1lCi0JcmV0dXJuZWQgYnkgZmluZF9uZWFyZXN0X2xpbmUsIGluIGNhc2UgdGhlIGZpbGUgbmFtZSBpcyBzb21ldGhpbmcKLQl1bmhlbHBmdWwgc3VjaCBhcyBhIC5oIGZpbGUuICBIYW5kbGUgJXUuCi0KLVdlZCBTZXAgMTQgMTI6NDk6MTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfZG9fYXNzaWdubWVudHMpOiBNYWtlIHN1cmUgb3V0cHV0IHN0YXRlbWVudAotCWhhcyBhbiBhdHRhY2hlZCBiZmRfc2VjdGlvbiBiZWZvcmUgdHJ5aW5nIHRvIGRlcmVmZXJlbmNlIGl0LgotCi1XZWQgU2VwIDE0IDEyOjQ4OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgbmV3IGZpZWxkIHdhcm5fb25jZS4KLQkqIGxkbWFpbi5jICh1bmRlZmluZWRfc3ltYm9sKTogSGFuZGxlIC13YXJuLW9uY2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtd2Fybi1vbmNlLgotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IERvY3VtZW50IC13YXJuLW9uY2UuCi0JKiBsZC4xOiBMaWtld2lzZS4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEhhbmRsZSAlRCBhcyAlQywgYnV0IG5ldmVyIHByaW50IHRoZSBmdW5jdGlvbgotCW5hbWUuICBGb3IgJUMsIHByaW50IHRoZSBmdW5jdGlvbiBuYW1lIG9uIGEgc2VwYXJhdGUgbGluZSwgdG8ga2VlcAotCXRoZSBsZW5ndGggb2YgZXJyb3IgbWVzc2FnZXMgdW5kZXIgY29udHJvbC4KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9kZWZpbml0aW9uKTogVXNlICVEIGZvciBgYGZpcnN0IGRlZmluZWQKLQloZXJlLicnCi0JKHVuZGVmaW5lZF9zeW1ib2wpOiBVc2UgJUQgZm9yIGBgbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcwotCWZvbGxvdycnLgotCi0JKiBsZG1pc2MuYyAobXVsdGlwbGVfd2Fybik6IFJlbW92ZTsgbm8gbG9uZ2VyIHVzZWQuCi0JKiBsZG1pc2MuaCAobXVsdGlwbGVfd2Fybik6IERvbid0IGRlY2xhcmUuCi0KLVR1ZSBTZXAgMTMgMjA6NDc6NTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFByaW50IGFsbCBsaW5lcwotCXRvIHRoZSBtYXAgZmlsZS4KLQotVHVlIFNlcCAxMyAxNjozMDoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBDaGVjayBmb3IgYXJjaGl2ZSBiZWZvcmUgb2JqZWN0LiAgVXNlCi0JYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzLCBhbmQsIGlmIGFtYmlndW91cywgcHJpbnQgYSBsaXN0IG9mCi0JbWF0Y2hpbmcgZm9ybWF0cy4gIElmIGZpbGUgZm9ybWF0IGlzIG5vdCByZWNvZ25pemVkLCB0cmVhdCBmaWxlIGFzCi0JYSBsaW5rZXIgc2NyaXB0LgotCSogbGRncmFtLnkgKHl5ZXJyb3IpOiBJZiBhc3N1bWluZyBhbiBvYmplY3QgZmlsZSBpcyBhIHNjcmlwdCwKLQltZW50aW9uIHRoYXQuICBUd2VhayB0aGUgZm9ybWF0IG9mIHRoZSBlcnJvciBtZXNzYWdlcy4KLQkqIGxkbGV4LmwgKGxleF93YXJuX2ludmFsaWQpOiBJZiBhc3N1bWluZyBhbiBvYmplY3QgaXMgYSBzY3JpcHQsCi0JZ3Vlc3MgdGhhdCB0aGlzIGlzIG5vdCBhY3R1YWxseSBhIHNjcmlwdCwgYW5kIGp1c3QgcmVwb3J0IHRoYXQgdGhlCi0JZmlsZSBmb3JtYXQgd2FzIG5vdCByZWNvZ25pemVkLgotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IEFkbWl0IHRoYXQgLSggbWF5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UuCi0JQWRkIG5vdGUgdGhhdCB1bnJlY29nbml6ZWQgb2JqZWN0IGZpbGVzIGFyZSBub3cgdHJlYXRlZCBhcyBsaW5rZXIKLQlzY3JpcHRzLgotCi0JKiBsZGZpbGUuYyAobGRmaWxlX2lucHV0X2ZpbGVuYW1lKTogTWFrZSBjb25zdC4KLQkobGRmaWxlX2Fzc3VtZWRfc2NyaXB0KTogTmV3IHZhcmlhYmxlLgotCSh0cnlfb3Blbik6IENoYW5nZSBhcmd1bWVudHMgdHlwZXMgdG8gY29uc3QuCi0JKGxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZSk6IExpa2V3aXNlLgotCShsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUpOiBMaWtld2lzZS4gIEFsc28sIHNldCBsaW5lbm8gdG8gMS4KLQkqIGxkZmlsZS5oOiBVcGRhdGUgZGVjbGFyYXRpb25zIGZvciBsZGZpbGUuYyBjaGFuZ2VzLgotCSogbGRsZXgubDogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGZpbGVfbmFtZV9zdGFjayk6IENoYW5nZSB0byBiZSBjb25zdCBjaGFyICouCi0JKGxpbmVub19zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKDw8RU9GPj4pOiBTZXQgbGluZW5vIGFzIHdlbGwgYXMgbGRmaWxlX2lucHV0X2ZpbGVuYW1lLgotCShsZXhfcHVzaF9maWxlKTogTWFrZSBuYW1lIGFyZ3VtZW50IGNvbnN0LiAgSW5pdGlhbGl6ZQotCWxpbmVub19zdGFjayBlbnRyeS4KLQkobGV4X3JlZGlyZWN0KTogSW5pdGlhbGl6ZSBsaW5lbm9fc3RhY2sgZW50cnkuCi0JKGxleF93YXJuX2ludmFsaWQpOiBIYW5kbGUgbm9uIHByaW50YWJsZSBjaGFyYWN0ZXJzIG5pY2VseS4KLQkqIGxkbGV4LmggKGxleF9wdXNoX2ZpbGUpOiBEZWNsYXJlIHNlY29uZCBhcmd1bWVudCBhcyBjb25zdC4KLQotCSogbGRncmFtLnkgKGlmaWxlX3AxKTogUmVjb2duaXplIEdST1VQLgotCSogbGRsZXgubDogUmVjb2duaXplIEdST1VQLgotCSogbGQudGV4aW5mbyAoT3B0aW9uIENvbW1hbmRzKTogRG9jdW1lbnQgR1JPVVAuCi0KLU1vbiBTZXAgMTIgMTc6MDQ6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTY4a2x5bngubWg6IE5ldyBmaWxlLgotCi1Nb24gU2VwIDEyIDAxOjUwOjAzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbTogQWRkIG5ld2xpbmVzIHRvIHRoZSBlcnJvciBtZXNzYWdlcy4KLQotU2F0IFNlcCAxMCAxNjowNTozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2bHlueC5taDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2bHlueC5zYzogRG9uJ3QgcHV0IC5jdG9ycyBhbmQgLmR0b3JzIGluIC50ZXh0Ci0JdW5sZXNzIENPTlNUUlVDVElORy4KLQotVGh1IFNlcCAgOCAxMzoyNToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCShHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUgYXMgeWVzLgotCShEWU5BTUlDX0xJTkspOiBEZWZpbmUgYXMgZmFsc2UuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6Ci0JSW5pdGlhbGl6ZSBjb25maWcuZHluYW1pY19saW5rIHRvIERZTkFNSUNfTElOSyBpZiBpdCBpcyBkZWZpbmVkLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZXNldCBzdGF0X3B0ciBhdCBlbmQuCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMybWlwYi5jKTogRGVwZW5kIHVwb24gZWxmMzIuZW0gcmF0aGVyIHRoYW4KLQlnZW5lcmljLmVtLgotCi1UaHUgU2VwICA4IDE2OjMwOjM3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9oODUwMGIuc2M6IFB1dCByZGF0YSBzdHVmZiBpbnRvIG93biBzZWdtZW50LgotCi1UaHUgU2VwICA4IDEzOjI1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogRG9uJ3QgZGVmaW5lOwotCS5nb3Qgc2VjdGlvbiBpcyBub3cgZXhwbGljaXRseSBoYW5kbGVkIGluIGVsZi5zYy4KLQotV2VkIFNlcCAgNyAxMzowODozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBSZWRvIHNjcmlwdCB0byBzZXQgLiBvdXRzaWRlIG9mIHNlY3Rpb25zCi0JYW5kIG5vdCBib3RoZXIgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHNlY3Rpb24gYWRkcmVzc2VzLgotCUV4cGxpY2l0bHkgcGxhY2UgLnNkYXRhIHNlY3Rpb24uCi0KLVR1ZSBTZXAgIDYgMjM6NTE6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogUHV0IC5ic3MgaW4gZGF0YSBzZWdtZW50LgotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogQ2hhbmdlIC5zdGFiIGFuZCAuc3RhYnN0ciB0byB1c2UgYSBWTUEgb2YKLQkwLCBhbmQgdG8gb25seSBiZSBtYXJrZWQgYXMgTk9MT0FEIGlmIHJlbG9jYXRpbmcuCi0JKiBzY3JpcHR0ZW1wbC9oODUwMC5zYywgc2NyaXB0dGVtcGwvaDg1MDBiLnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2g4NTAwYy5zYywgc2NyaXB0dGVtcGwvaDg1MDBtLnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2g4NTAwcy5zYywgc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MsIHNjcmlwdHRlbXBsL2kzODZseW54LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjLCBzY3JpcHR0ZW1wbC9tNjhrbHlueC5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9zaC5zYywgc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL3NwYXJjbHlueC5zYzogTGlrZXdpc2UuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgKGRpc2FibGVkKSB0aGUgQVJNL1JJU0NpWC4KLQkqIGNvbmZpZy9yaXNjaXgubXQsIGVtdWxwYXJhbXMvcmlzY2l4LnNoLCBzY3JpcHR0ZW1wbC9yaXNjaXguc2M6Ci0JTmV3IGZpbGVzLgotCi1UdWUgQXVnIDMwIDExOjQ4OjA4IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpZWxkIHNvbmFtZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1zb25hbWUgYXJndW1lbnQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IEluIGNhbGwgdG8gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucywKLQlwYXNzIHNvbmFtZS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IC1zb25hbWUuCi0KLU1vbiBBdWcgMjkgMTU6MjE6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IERvbid0IHRyeSB0byBzZXQgdGhlIGFyY2hpdGVjdHVyZSBpZiB0aGUKLQlpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIGFyZSBpbmNvbXBhdGlibGUuICBKdXN0IHdhcm4uCi0KLVdlZCBBdWcgMjQgMTI6NTI6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCi1TdW4gQXVnIDIxIDE2OjE3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9ocDNocHV4LnNoOiBEZWZpbmUgX19EWU5BTUlDIHRvIGJlIDAuCi0KLVRodSBBdWcgMTggMTU6Mzc6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JTWFrZSB0aGUgRUxGIGxpbmtlciBoYW5kbGUgb3JwaGFuZWQgc2VjdGlvbnMgcmVhc29uYWJseS4gIEFsc28sCi0JZGVmaW5lIF9fc3RhcnRfU0VDTkFNRSBhbmQgX19zdG9wX1NFQ05BTUUgYXJvdW5kIHNlY3Rpb25zIHdob3NlCi0JbmFtZXMgY2FuIGJlIHJlcHJlc2VudGVkIGluIEMsIGZvciB0aGUgYmVuZWZpdCBvZiBzeW1ib2wgc2V0cyBpbgotCWdsaWJjLgotCSogbGRlbXVsLmggKGxkZW11bF9wbGFjZV9vcnBoYW4pOiBEZWNsYXJlLgotCShsZF9lbXVsYXRpb25feGZlcl90eXBlKTogQWRkIHBsYWNlX29ycGhhbiBmaWVsZC4KLQkqIGxkZW11bC5jIChsZGVtdWxfcGxhY2Vfb3JwaGFuKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmggKHdpbGRfZG9pdCk6IERlY2xhcmUuCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogTWFrZSBub25zdGF0aWMuCi0JKGxhbmdfcGxhY2Vfb3JwaGFucyk6IENhbGwgbGRlbXVsX3BsYWNlX29ycGhhbi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogSW5jbHVkZSA8Y3R5cGUuaD4gYW5kICJsZGdyYW0uaCIuCi0JKGhvbGRfc2VjdGlvbiwgaG9sZF91c2UsIGhvbGRfdGV4dCwgaG9sZF9kYXRhLCBob2xkX2Jzcyk6IE5ldwotCXN0YXRpYyB2YXJpYWJsZXMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplIHBsYWNlX29ycGhhbiBmaWVsZC4KLQotVHVlIEF1ZyAxNiAwMDoxNzoyMCAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IEFkZCAubGludXgtZHluYW1pYyBhZnRlciAuZGF0YS4KLQotVHVlIEF1ZyAxNiAwMDowODoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKSBUcmVhdCAtLWRsbC12ZXJib3NlIGFzIC0tdmVyc2lvbiwgZm9yCi0JTGludXggY29tcGF0aWJpbGl0eS4gIEZyb20gaGpsQG55bmV4c3QuY29tIChILkouIEx1KS4KLQotTW9uIEF1ZyAxNSAxNzoxNzozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmggKGV4cF9nZXRfYWJzX2ludCk6IERlY2xhcmUuCi0KLVNhdCBBdWcgIDYgMDE6NDU6MzkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfZG9fYXNzaWdubWVudHMpOiAgSGFuZGxlIGNvbXBsZXggQVQncyBiZXR0ZXIuCi0JKiBsZGV4cC5jIChleHBfZ2V0X2Fic19pbnQpOiAgTmV3IGZ1bmN0aW9uLgotCi1GcmkgQXVnICA1IDIwOjU1OjU1IDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGk5NjAtbmluZHktY29mZiBzdXBwb3J0LgotCi1UaHUgQXVnICA0IDE0OjQ1OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCAoeXlfY3JlYXRlX3N0cmluZ19idWZmZXIpOiBIYW5kbGUgY2hhbmdlIHRvIGludGVybmFsCi0JaW50ZXJmYWNlIGluIGZsZXggMi40LjcuCi0KLVR1ZSBBdWcgIDIgMTE6NTI6MDYgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQpOgotCU5ldyBmdW5jdGlvbjsgYWRkIDB4MjAgdG8gYW55IHVzZSBvZiAtVHRleHQuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogTmV3Ci0JZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVzZSB0aGUgbmV3IGZ1bmN0aW9uCi0JZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMuCi0KLU1vbiBBdWcgIDEgMTU6NTA6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBSZWRvIHNjcmlwdCB0byBzZXQgLiBvdXRzaWRlIG9mIHNlY3Rpb25zCi0JYW5kIG5vdCBib3RoZXIgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHNlY3Rpb24gYWRkcmVzc2VzLgotCi1UdWUgSnVsIDI2IDExOjAyOjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBDb3B5IHNldmVyYWwgbW9yZSByZWxvY2F0aW9uIHNlY3Rpb25zIGludG8KLQl0aGUgb3V0cHV0LiAgUHV0IC5nb3QucGx0IHNlY3Rpb25zIGludG8gLmdvdC4KLQotRnJpIEp1bCAyMiAxMjoxNTozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogVXNlIFBST1ZJREUgdG8gZGVmaW5lIGV0ZXh0LCBlZGF0YSwgYW5kIGVuZC4KLQotCUFkZCBhIG5ldyBzY3JpcHQgb3BlcmF0b3IsIFBST1ZJREUsIHRvIGRlZmluZSBhIHN5bWJvbCBvbmx5IGlmIGl0Ci0JaXMgbmVlZGVkLgotCSogbGRncmFtLnkgKFBST1ZJREUpOiBOZXcgdG9rZW4uCi0JKGFzc2lnbm1lbnQpOiBBY2NlcHQgUFJPVklERS4KLQkqIGxkbGV4LmwgKFBST1ZJREUpOiBOZXcgdG9rZW4uCi0JKiBsZGV4cC5oIChub2RlX3R5cGUpOiBBZGQgZXRyZWVfcHJvdmlkZSB0byBub2RlX2NsYXNzIGVudW0uCi0JKGV4cF9wcm92aWRlKTogRGVjbGFyZS4KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBIYW5kbGUgZXRyZWVfcHJvdmlkZS4KLQkoZXhwX3Byb3ZpZGUpOiBOZXcgZnVuY3Rpb24uCi0JKGV4cF9wcmludF90cmVlKTogSGFuZGxlIGV0cmVlX3Byb3ZpZGUuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBQUk9WSURFLgotCi0JKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBQYXNzIGRlc2lyZWQgYWxpZ25tZW50IHRvCi0gICAgICAgIGxhbmdfb25lX2NvbW1vbiBhcyBwb3dlciBvZiB0d28uCi0JKGxhbmdfb25lX2NvbW1vbik6IEdldCBjb21tb24gc3ltYm9sIGFsaWdubWVudCBmcm9tIGxpbmtlciBoYXNoCi0JdGFibGUgZW50cnkuICBUcmVhdCBkZXNpcmVkIGFsaWdubWVudCBhcyBhIHBvd2VyIG9mIHR3by4KLQotCSogbGRsYW5nLmMgKHdpbGRfc2VjdGlvbik6IEF0dGFjaCBhbGwgc2VjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLAotCW5vdCBqdXN0IHRoZSBmaXJzdCBvbmUuICBJZiB0aGVyZSBpcyBubyBuYW1lLCBhdHRhY2ggYWxsIHNlY3Rpb25zCi0JZXZlbiBpZiB0aGUgU0VDX0lTX0NPTU1PTiBmbGFnIGlzIHNldC4KLQotV2VkIEp1bCAyMCAxNTo0OToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBmaWVsZCBycGF0aC4KLQkqIGxleHN1cC5jIChTX0lTRElSKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKHBhcnNlX2FyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgLXJwYXRoLiAgSWYgLVIgaXMgdXNlZCB0byBuYW1lIGEKLQlkaXJlY3RvcnksIHRyZWF0IGl0IGFzIC1ycGF0aCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBjb21tYW5kX2xpbmUucnBhdGggdG8gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb21tYW5kX2xpbmUucnBhdGggdG8gTlVMTC4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IC1ycGF0aCBvcHRpb24uCi0KLVN1biBKdWwgMTAgMDA6MzM6MjQgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIGVtdWxwYXJhbXMvcGM1MzJtYWNoYW91dC5zaDogTmV3IGZpbGUuIFBjNTMyIG1hY2ggc2NyaXB0Ci0JcGFyYW1ldGVycy4KLQotCSogZW11bHBhcmFtcy9uZXRic2Q1MzIuc2g6IE5ldyBmaWxlLiBOZXRic2QgNTMyIHNjcmlwdCBwYXJhbWV0ZXJzLgotCi0JKiBjb25maWcvcGM1MzJtYWNoLm10OiBOZXcgZmlsZS4gUGM1MzIgbWFjaCB0YXJnZXQgc3VwcG9ydC4KLQotCSogY29uZmlnL3BjNTMybWFjaC5taDogTmV3IGZpbGUuIFBjNTMyIG1hY2ggaG9zdCBzdXBwb3J0LgotCi0JKiBjb25maWcvbmV0YnNkNTMyLm10OiBOZXcgZmlsZS4gTmV0YnNkIDUzMiB0YXJnZXQgc3VwcG9ydC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbnMzMmstcGM1MzItbWFjaCBhbmQgbnMzMmstcGM1MzItbmV0YnNkIHN1cHBvcnQuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZXBjbWFjaGFvdXQuYyBkZXBlbmRlbmN5IGFuZCBlbmV0YnNkNTMyLmMKLQlkZXBlbmRlbmN5LgotCi1GcmkgSnVsICA4IDEwOjU3OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFVzZQotCWJmZF9hYnNfc2VjdGlvbl9wdHIsIG5vdCAmYmZkX2Fic19zZWN0aW9uLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENoYW5nZWQgInJldGFpbi1zeW1ib2xzLWZpbGUiIGZyb20KLQlub19hcmd1bWVudCB0byByZXF1aXJlZF9hcmd1bWVudC4gIEZyb20gZGptLgotCi1UaHUgSnVsICA3IDEyOjI5OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBFeHBsaWNpdGx5IG1lbnRpb24gLnN0YWIgYW5kIC5zdGFic3RyCi0Jc2VjdGlvbnMgdG8gZm9yY2UgYSBWTUEgb2YgMDsgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZQotCW5vdCBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGxpbmtlciBzdHlsZS4KLQotTW9uIEp1bCAgNCAxOTozNTo0NSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAoX19zdGFja196ZXJvKTogRG9uJ3QgZGVmaW5lIHRoaXMgbmFtZSwKLQlpdCB3YXMgZm9yIHRoZSBIUFVYIGR5bmFtaWMgbG9hZGVyJ3MgdXNlIGFuZCBpdCBjcmVhdGVzIHByb2JsZW1zCi0Jd2l0aCBFTEYgR0RCLgotCi1GcmkgSnVsICAxIDEyOjUzOjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsZGxhbmcuYyAobGFuZ19kb19hc3NpZ25tZW50cyk6IE5vIGxvbmdlciBzdGF0aWMuICBEZWxldGUgZGVjbC4KLQkqIGxkbGFuZy5oIChsYW5nX2RvX2Fzc2lnbm1lbnRzKTogUHV0IGV4dGVybmFsIGRlY2wgaGVyZS4KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBNaW5vciBjbGVhbnVwcyB0aHJvdWdob3V0IGZpbGUuCi0JKGhwcGFfZWxmX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogUmV3cml0ZS4KLQkoaHBwYWVsZl9maW5pc2gpOiBSZXdyaXRlLgotCi1XZWQgSnVuIDI5IDE2OjUwOjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NvbGFyaXMyLm1oIChOQVRJVkVfTElCX0RJUlMpOiBEZWZpbmUgYXMgL3Vzci9jY3MvbGliLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFjY2VwdCAtQnN0YXRpYyBhbmQgLUJkeW5hbWljLiAgRG8gbm90Ci0JYWNjZXB0IHBsYWluIC1CLgotCSogbGQudGV4aW5mbzogLUJzdGF0aWMgaXMgbm90IGlnbm9yZWQuCi0KLVR1ZSBKdW4gMjggMTI6MTM6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgXHIgdGhlIHNhbWUgYXMgXG4uCi0KLVRodSBKdW4gMjMgMTc6NTM6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBzaGFyZWQgbGlicmFyaWVzLCBmcm9tIEVyaWMKLQlZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZ2Vuc2NyaXB0cy5zaDogSWYgdGhlIGVtdWxhdGlvbiBwYXJhbWV0ZXIgZmlsZSBzZXRzCi0gICAgICAgIEdFTkVSQVRFX1NITElCX1NDUklQVCwgZ2VuZXJhdGUgYSAueHMgc2NyaXB0IGZpbGUgd2l0aAotCUNSRUFURV9TSExJQiBkZWZpbmVkLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KTogSWYKLQlsaW5rX2luZm8uc2hhcmVkIGlzIHNldCwgdXNlIHRoZSAueHMgc2NyaXB0IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IElmIENSRUFURV9TSExJQiBpcyBzZXQsIGRvbid0IGNyZWF0ZSBhCi0JLmludGVycCBzZWN0aW9uLCBhbmQgZG9uJ3QgaW5jbHVkZSBURVhUX1NUQVJUX0FERFIgaW4gdGhlIHN0YXJ0aW5nCi0JYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgotCi1UaHUgSnVuIDIzIDEyOjUyOjIyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cy4KLQotV2VkIEp1biAyMiAxMzo0MjoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIHN1cHBvcnQgZm9yIG5ldyBvcHRpb25zIC0oIC0pIHdpdGgKLQlzeW5vbnltcyAtLXN0YXJ0LWdyb3VwIC0tZW5kLWdyb3VwLgotCSogbGRsYW5nLmggKGVudW0gc3RhdGVtZW50X2VudW0pOiBBZGQgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bS4KLQkobGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSk6IERlZmluZSBuZXcgc3RydWN0LgotCShsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlKTogQWRkIGdyb3VwX3N0YXRlbWVudCBmaWVsZC4KLQkobGFuZ19lbnRlcl9ncm91cCwgbGFuZ19sZWF2ZV9ncm91cCk6IERlY2xhcmUuCi0JKiBsZGxhbmcuYyAobGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyKTogSGFuZGxlCi0JbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bS4KLQkobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucywgcHJpbnRfc3RhdGVtZW50KTogTGlrZXdpc2UuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucywgbGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgotCShvcGVuX2lucHV0X2JmZHMpOiBDb21wbGV0ZWx5IHJld3JpdGUuICBOb3cgZG9lcyBpdHMgb3duIGxvb3BpbmcsCi0JcmF0aGVyIHRoYW4gdXNpbmcgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBIYW5kbGUgZ3JvdXBzLgotCShsYW5nX3Byb2Nlc3MpOiBVcGRhdGUgY2FsbCB0byBvcGVuX2lucHV0X2JmZHMuCi0JKHByaW50X2dyb3VwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGFuZ19lbnRlcl9ncm91cCwgbGFuZ19sZWF2ZV9ncm91cCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBJZiB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuCi0Jb3BlbmVkLCBqdXN0IHJldHVybiByYXRoZXIgdGhhbiB0YWtpbmcgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCi0JKiBsZHZlci5jIChoZWxwKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi0JKiBsZGxhbmcuYyAoZW5kX29mX2RhdGFfc2VjdGlvbl9zdGF0ZW1lbnRfbGlzdCk6IERvbid0IGRlZmluZS4KLQkobGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBEb24ndCBzZXQgb2Jzb2xldGUgdmFyaWFibGUKLQllbmRfb2ZfZGF0YV9zZWN0aW9uX3N0YXRlbWVudF9saXN0LgotCi0JKiBzY3JpcHR0ZW1wbC9nbzMyY29mZi5zYzogRG9uJ3QgcHV0ICR7REFUQV9BTElHTk1FTlR9IGluc2lkZSBhbgotCUFMSUdOLgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQWRqdXN0IGN1cnJlbnQgcmVnaW9uIGFkZHJlc3MKLQlldmVuIGZvciBzZWN0aW9ucyB3aXRoIGFuIGV4cGxpY2l0IGFkZHJlc3MuICBGcm9tCi0JcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaCBDYW1wYmVsbCkuCi0KLQkqIGVtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIChOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBTZXQgdG8gMC4KLQlGcm9tIGpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgotCi0JKiBzY3JpcHR0ZW1wbC9taXBzYnNkLnNjOiBMZXQgc2VjdGlvbnMgYWxpZ24gdG8gdGhlaXIgbmF0dXJhbAotCWJvdW5kYXJpZXMuCi0KLVR1ZSBKdW4gMjEgMTE6Mjc6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19pbml0KTogVXNlIG5ldyBiZmRfYWJzX3NlY3Rpb25fcHRyLCBub3QKLQkmYmZkX2Fic19zZWN0aW9uLgotCShsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mKTogTGlrZXdpc2UuCi0JKGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YpOiBMaWtld2lzZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogVXNlIGJmZF9pc19hYnNfc2VjdGlvbiB0byBjaGVjayBmb3IgdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4gIERvbid0IHRyeSB0byBzZXQgdGhlIFZNQSBvciBvdXRwdXRfb2Zmc2V0IG9yCi0Jc2l6ZSBvZiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQkqIGxkbWFpbi5jIChub3RpY2VfeXN5bSk6IFVzZSBiZmRfaXNfdW5kX3NlY3Rpb24gdG8gY2hlY2sgZm9yIHRoZQotCXVuZGVmaW5lZCBzZWN0aW9uLgotCi1UaHUgSnVuIDE2IDIyOjQ4OjQxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjOiBQbGFjZSAuZGF0YSBhbmQgLmJzcyBhdCAweDQwMDAwMDAwCi0Jd2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRhYmxlIG9iamVjdHMuCi0KLVRodSBKdW4gMTYgMTQ6MjU6MjIgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBlbXVsdGVtcGwvbGludXguZW06IE5ldyBmaWxlIHByb3ZpZGluZyBzdXBwb3J0IGZvciBsaW5raW5nCi0JYWdhaW5zdCBMaW51eCBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlnL2kzODYtbGludXgubXQgKGVpMzg2bGludXguYyk6IERlcGVuZCB1cG9uIGxpbnV4LmVtLgotCSogZW11bHBhcmFtcy9pMzg2bGludXguc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgbGludXguCi0KLVRodSBKdW4gMTYgMTI6MjI6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCAtc2hhcmVkIHRvIGxvbmdvcHRzLCBhbmQgaGFuZGxlIGl0LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby5zaGFyZWQgdG8gZmFsc2UuICBHaXZlCi0JZXJyb3IgaWYgbGlua19pbmZvLnJlbG9jYXRlYWJsZSBhbmQgbGlua19pbmZvLnNoYXJlZCBhcmUgYm90aCBzZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgRU1VTF9FWFRSQSogaXMgZGVmaW5lZCBpbiBhIGNvbmZpZyBmaWxlLCB0cmVhdAotCWl0IGFzIG5hbWluZyBhbiBlbXVsYXRpb24gdG8gYmUgYWRkZWQgdG8gRU1VTEFUSU9OX09GSUxFUy4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChFTVVMX0VYVFJBMSk6IERlZmluZSBhcyBlbGZfaTM4Ni4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShBTExfRU1VTEFUSU9OUyk6IEFkZCBlaTM4NmxpbnV4Lm8sIGVlbGYzMl9zcGFyYy5vLAotCWVlbGY2NF9zcGFyYy5vLiAgUmVtb3ZlICQoT1RIRVJfRU1VTEFUSU9OUykuCi0JKGVpMzg2bGludXguYywgZWVsZjMyX3NwYXJjLmMsIGVlbGY2NF9zcGFyYy5jKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IERvbid0IGRlZmluZS4KLQkoZWkzODZsaW51eC5jKTogUmVtb3ZlOyBub3cgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWcvaTM4Ni1seW54Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL202OGstbHlueC5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3NwYXJjNjQtZWxmLm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCShlZWxmNjRfc3BhcmMuYyk6IFJlbW92ZTsgbm93IGluIE1ha2VmaWxlLmluLgotCSogY29uZmlnL3N1bjRzb2wyLm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCShlZWxmMzJfc3BhcmMuYyk6IFJlbW92ZTsgbm93IGluIE1ha2VmaWxlLmluLgotCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdHJlZSk6IERvbid0IGNyYXNoIGlmIGV0cmVlX3JlbCBzZWN0aW9uIGhhcwotCW5vIG93bmVyLS1pdCBtaWdodCBiZSBiZmRfYWJzX3NlY3Rpb24uICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBMZXQgc2VjdGlvbnMgYWxpZ24gdG8gdGhlaXIgbmF0dXJhbAotCWJvdW5kYXJpZXMuCi0KLVdlZCBKdW4gMTUgMDE6NTQ6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGVtdWwuaCAobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlKTogRGVjbGFyZS4KLQkobGRfZW11bGF0aW9uX3hmZXJfdHlwZSk6IEFkZCBuZXcgZmllbGQgb3Blbl9keW5hbWljX2FyY2hpdmUuCi0JKiBsZGVtdWwuYzogSW5jbHVkZSBsZGV4cC5oIGFuZCBsZGxhbmcuaC4KLQkobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLgotCSogbGRmaWxlLmggKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogRGVjbGFyZS4KLQkqIGxkZmlsZS5jOiBJbmNsdWRlIGxkZW11bC5oLgotCSh0cnlfb3Blbl9iZmQpOiBSZW5hbWUgZnJvbSBjYWNoZV9iZmRfb3BlbnIuICBSZXR1cm4gYm9vbGVhbgotCWFyZ3VtZW50LCBub3QgYmZkICouICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogUmVuYW1lIGZyb20gb3Blbl9hLiAgUmV0dXJuIGJvb2xlYW4KLQlhcmd1bWVudCwgbm90IGJmZCAqLiAgQ2xlYW4gdXAuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBJZiBkb2luZyBhIGR5bmFtaWMgbGluaywgY2FsbAotCWxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGUgZXh0ZW5zaW9uIG9mCi0JYSBkeW5hbWljIG9iamVjdCBpcyAiLnNvIi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCU5ldyBmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogSW5pdGlhbGl6ZSBvcGVuX2R5bmFtaWNfYXJjaGl2ZQotCWZpZWxkLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBMaWtld2lzZS4KLQotCSogbGRtYWluLmMgKGdldF9lbXVsYXRpb24pOiBJZ25vcmUgLW00ODYgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IElnbm9yZSAtcW1hZ2ljIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCUFjY2VwdCAtc3RhdGljIGFzIGEgc3lub255bSBmb3IgLW5vbl9zaGFyZWQuCi0KLQlMZXQgdGhlIHVzZXIgY2hhbmdlIHRoZSBkeW5hbWljIGxpbmtlciB1c2VkIGJ5IEVMRiBjb2RlLgotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIG5ldyBmaWVsZCBpbnRlcnByZXRlci4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIGR5bmFtaWMtbGlua2VyIHRvIGxvbmdvcHRzLCBhbmQKLQloYW5kbGUgaXQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgY29tbWFuZF9saW5lLmludGVycHJldGVyIHRvIE5VTEwuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogR2V0Ci0JdGhlIEVMRiBiYWNrZW5kIHRvIHJldHVybiB0aGUgLmludGVycCBzZWN0aW9uLiAgSWYKLQljb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgaXMgbm90IE5VTEwsIHNldCB0aGUgY29udGVudHMgb2YgLmludGVycAotCXRvIGl0LgotCSogbGQudGV4aW5mbzogTWVudGlvbiAtZHluYW1pYy1saW5rZXIuCi0KLQkqIGNvbmZpZy9zdW40c29sMi5tdCAoZWVsZjMyX3NwYXJjLmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSwgbm90Ci0JZ2VuZXJpYy5lbS4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBTb3J0IG91dCB0aGUgb3B0aW9uIG1hY3JvcyBhbmQgY2hhbmdlIHRoZQotCWRlZmluaXRpb25zIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBhIG5ldyBvcHRpb24uCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IERlZmluZSBfX2V0ZXh0IGFuZCBfX2VkYXRhIHRvIGdvIGFsb25nIHdpdGgKLQlfZXRleHQgYW5kIF9lZGF0YS4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgbmV3IGZpZWxkIHRyYWRpdGlvbmFsX2Zvcm1hdC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIHRyYWRpdGlvbmFsLWZvcm1hdCB0byBsb25nb3B0cywgYW5kCi0JaGFuZGxlIGl0LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGNvbmZpZy50cmFkaXRpb25hbF9mb3JtYXQgdG8gZmFsc2UuCi0JKiBsZGxhbmcuYyAobGRsYW5nX29wZW5fb3V0cHV0KTogU2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaW4gQkZECi0JZmxhZ3Mgb2Ygb3V0cHV0X2JmZCBhY2NvcmRpbmcgdG8gY29uZmlnLnRyYWRpdGlvbmFsX2Zvcm1hdC4KLQkqIGxkdmVyLmMgKGhlbHApOiBNZW50aW9uIC10cmFkaXRpb25hbC1mb3JtYXQuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCAtdHJhZGl0aW9uYWwtZm9ybWF0LgotCi1UdWUgSnVuIDE0IDIzOjEwOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9hZGRfZW50cnkpOiBBZGQgZW50cmllcyB0byBhIHNldCBpbiB0aGUgb3JkZXIKLQl0aGV5IGFyZSBlbmNvdW50ZXJlZC4KLQotVHVlIEp1biAxNCAxODowNTowOSAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIChURVhUX1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgMHgxMDAwLgotCShOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgMHgyMC4KLQotTW9uIEp1biAxMyAxNTo0NjowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBEZWZpbmUgX2Z0ZXh0LCBfZXRleHQgYW5kIF9mZGF0YSBpbnN0ZWQgb2YKLQlfRlRFWFQsIF9FVEVYVCBhbmQgX0ZEQVRBLiAgRG9udCBkZWZpbmUgX0VORC4KLQotCSogbGRmaWxlLmMgKG9wZW5fYSk6IElmIHRoaXMgaXMgbm90IGFuIGFyY2hpdmUsIHRyeSB0byBvcGVuIGl0IGluCi0JdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGJlZm9yZSBzZWFyY2hpbmcgZm9yIGl0LgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFRyZWF0IC1pIGFzIGEgc3lub255bSBmb3IgLXIuCi0KLQkqIGxkZ3JhbS55IChleHApOiBUcmVhdCBCTE9DSyBhcyBhIHN5bm9ueW0gZm9yIEFMSUdOLCBzbyB0aGF0Ci0JQkxPQ0sgd29ya3MgaW4gYSBzZWN0aW9uIGFkZHJlc3MgYXMgZG9jdW1lbnRlZC4KLQotCSogbGRncmFtLnkgKFlZREVCVUcpOiBEb24ndCBkZWZpbmUuCi0KLUZyaSBKdW4gMTAgMTY6NDU6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZ2xkOTYwLmVtOiBQYXNzIGZhbHNlIGZvciBuZXcgYXJndW1lbnQgdG8KLQlsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aC4KLQkqIGVtdWx0ZW1wbC9nbGQ5NjBjLmVtLCBlbXVsdGVtcGwvbG5rOTYwLmVtOiBMaWtld2lzZS4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBPbmx5IGxvb2sgZm9yIC5zbyBmaWxlcyBpZiBkb2luZyBhIGR5bmFtaWMKLQlsaW5rLgotCi1UaHUgSnVuICA5IDA4OjM1OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaTk2MC5zYzogQWRkIENPTlNUUlVDVE9SUyB0byAuZGF0YS4KLQotVGh1IEp1biAgOSAwNjo1MjoyOSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IERlbGV0ZSBsZC5uZXcgZGVwZW5kZW5jeSBzbyB0aGF0IGEgcmVncmVzc2lvbgotCSAgdGVzdCBkb2Vzbid0IHRyaWdnZXIgYSByZWJ1aWxkIG9mIHRoZSBsaW5rZXIuCi0KLVRodSBKdW4gIDkgMDA6MTc6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyk6IEZvciBsYW5nX2FkZHJlc3MsIGNhbGwKLQlpbml0X29zIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gY2FsbGVkLgotCi1UaHUgSnVuICAyIDE3OjI0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCBzdXBwb3J0IGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgotCSogYW91dC5zYzogRG9uJ3QgZGVmaW5lIF9fRFlOQU1JQyBoZXJlLiAgQWRkIG5ldyBzZWN0aW9ucyB1c2VkIGJ5Ci0Jc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBjb2RlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBzdW5vcy4KLQkqIGVtdWxwYXJhbXMvc3VuMy5zaCAoVEVNUExBVEVfTkFNRSk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKGVzdW40LmMpOiBEZXBlbmQgdXBvbiBzdW5vcy5lbSwgbm90IGdlbmVyaWMuZW0uCi0JKGVzdW4zLmMpOiBMaWtld2lzZS4KLQotCSogbGRsYW5nLmM6IE1pbm9yIGZvcm1hdHRpbmcgY2xlYW51cHMuCi0JKGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5oIChsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUpOiBEZWNsYXJlLgotCi0JKiBsZGZpbGUuaCAoc2VhcmNoX2RpcnNfdHlwZSk6IE1vdmUgZnJvbSBsZGZpbGUuYywgYW5kIGFkZCBjbWRsaW5lCi0JZmllbGQuCi0JKHNlYXJjaF9oZWFkKTogRGVjbGFyZS4KLQkobGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgpOiBBZGQgbmV3IGNtZGxpbmUgYXJndW1lbnQgaW4gcHJvdG90eXBlLgotCSogbGRmaWxlLmMgKHNlYXJjaF9oZWFkKTogTWFrZSBub24tc3RhdGljLgotCShzZWFyY2hfZGlyc190eXBlKTogTW92ZSB0byBsZGZpbGUuaC4KLQkobGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgpOiBBY2NlcHQgY21kbGluZSBhcmd1bWVudCwgYW5kIHNhdmUgaXQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFBhc3MgdHJ1ZSBmb3IgbmV3IGNtZGxpbmUgYXJndW1lbnQgb2YKLQlsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aC4KLQkoc2V0X2RlZmF1bHRfZGlybGlzdCk6IExpa2V3aXNlLgotCSogbGRtYWluLmMgKGNoZWNrX2Zvcl9zY3JpcHRzX2Rpcik6IFBhc3MgZmFsc2UgZm9yIG5ldyBjbWRsaW5lCi0JYXJndW1lbnQgb2YgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGguCi0JKiBsZGdyYW0ueSAoaWZpbGVfcDEpOiBMaWtld2lzZS4KLQotV2VkIEp1biAgMSAxNDoyNDowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5oIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKTogUmVtb3ZlIGZpZWxkcyBzdWJmaWxlcywKLQl0b3RhbF9zaXplLCBzdXBlcmZpbGUgYW5kIGNoYWluLgotCSogbGRmaWxlLmMgKG9wZW5fYSk6IERvbid0IGNsZWFyIHNlYXJjaF9kaXJzX2ZsYWcuCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBEb24ndCB0cnkgdG8gb3BlbiBzdXBlcmZpbGUuICBBc3NlcnQgdGhhdCBmaWxlCi0JaGFzIG5vdCBhbHJlYWR5IGJlZW4gb3BlbmVkLgotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IERvbid0IGluaXRpYWxpemUgc3VwZXJmaWxlLgotCSogbGRtYWluLmMgKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBEb24ndCBpbml0aWFsaXplIHN1YmZpbGVzIG9yCi0JY2hhaW4gb3Igc3VwZXJmaWxlLiAgSW5pdGlhbGl6ZSBzZWFyY2hfZGlyc19mbGFnIHRvIGZhbHNlLgotCi1GcmkgTWF5IDI3IDEyOjI1OjMzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IENoYW5nZWQgdmVyc2lvbiB0byAiY3lnbnVzLTIuNC4xIi4KLQotCUNoYW5nZXMgZnJvbSBiaW51dGlscy0yLjQgcmVsZWFzZToKLQotCSogZ2Vuc2NyaXB0cy5zaCAoUkVMT0NBVElORywgQ09OU1RSVUNUSU5HKTogV2hlbiBzZXR0aW5nCi0JdmFyaWFibGVzLCB1c2Ugd2hpdGVzcGFjZSwgc28gc2NyaXB0cyBkb24ndCBicmVhay4KLQotCSogY29uZmlnL2FscGhhb3NmLm1oIChIREVGSU5FUywgQ0ZMQUdTKTogRGVsZXRlZC4KLQotCSogZW11bHRlbXBsL2dlbmVyaWMuZW06IEZpbmQgZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQgaW4gJHtzcmNkaXJ9LgotCi0JKiBjZHRlc3QtYmFyLmNjOiBSZW5hbWVkIGZyb20gY2R0ZXN0LWZ1bmMuY2MuCi0JKiBNYWtlZmlsZS5pbjogTm90ZWQgY2hhbmdlLgotCi0JKiBzY3JpcHR0ZW1wbC9hMjlrLnNjOiBEb24ndCBpbmNsdWRlIC9sYWIzL3UzLy4uLi4vc2VnbWVudHMubzsgSQotCWRvbid0IGtub3cgd2hlcmUgdGhhdCdzIHN1cHBvc2VkIHRvIGNvbWUgZnJvbSwgb3Igd2h5IGl0J3MKLQluZWNlc3NhcnkuCi0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIHRvIGxhdGVzdCBtYWtlZmlsZS5pbgotCSogZW11bHBhcmEvZ28zMi5zaDogc2V0IHRvIGNvZmYtZ28zMiBub3QgYW91dAotCSogZW11bHRlbXAvZ2VuZXJpYy5lbTogc3RyZW5ndGgtcmVkdWNlIHRoZSBzdHJ1Y3R1cmUgb2YKLQkgIHRoaXMgc2hlbGwgc2NyaXB0LCBzaW5jZSB0aGUgb25seSBhdmFpbGFibGUgc2hlbGwgZm9yCi0JICBET1MgY2FuJ3QgaGFuZGxlIGNvbXBsZXggc3ludGF4LgotCSogZW11bHRlbXAvc3RyaW5naWZ5LnNlZDogZm9yICJzZWQgLWYiIGluc3RlYWQgb2YgaW5saW5lLgotCSogbWFrZWZpbGUuaW46IGRlcGVuZCBvbiBzdHJpbmdpZnkuc2VkIGFzIHdlbGwgYXMgZ2Vuc2NyaXB0cy5zaAotCSogc2NyaXB0dGVtcC9nbzMyY29mZi5zYzogY29ycmVjdCBmb3IgZGpncHAgMS4xMSdzIENPRkYgZm9ybWF0Ci0JKiBnZW5zY3JpcHRzLnNoOiBlbXB0eSB2YXJpYWJsZXMgYXJlbid0IGFsd2F5cyBjb25zaWRlcmVkICJzZXQiLAotCSAgc28gc2V0IHRoZW0gdG8gInkiIGluc3RlYWQuCi0KLUZyaSBNYXkgMjcgMDE6MDg6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoZW50cnlfc3ltYm9sKTogTWFrZSBzdGF0aWMuCi0JKGxhbmdfYWRkX2VudHJ5KTogQWRkIGNtZGxpbmUgYXJndW1lbnQuCi0JKiBsZGxhbmcuaCAobGFuZ19hZGRfZW50cnkpOiBDaGFuZ2UgcHJvdG90eXBlLgotCSogbGRncmFtLnkgKHN0YXRlbWVudF9hbnl3aGVyZSk6IENoYW5nZSBsYW5nX2FkZF9lbnRyeSBjYWxsLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQotVHVlIE1heSAyNCAxNjoxMzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnNoIChPVEhFUl9SRUFET05MWV9TRUNUSU9OUyk6IERvbid0IGdpdmUKLQkucmVnaW5mbyBhbiBhZGRyZXNzLgotCShPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBEb24ndCBnaXZlIC5saXQ0IG9yIC5saXQ4IGFuIGFkZHJlc3MuCi0JKE9USEVSX1NFQ1RJT05TKTogRGVmaW5lIGZvciAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgT1RIRVJfU0VDVElPTlMgYXQgZW5kIG9mIHNjcmlwdC4KLQotVGh1IE1heSAxOSAxMzozMTozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgRUxGIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBmaWVsZCBkeW5hbWljX2xpbmsuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgY29uZmlnLmR5bmFtaWNfbGluayB0byBmYWxzZS4gIFdhcm4KLQlvbiBhdHRlbXB0cyB0byB1c2UgLXIgd2l0aCAtcmVsYXgsIC1jYWxsX3NoYXJlZCBvciAtcy4KLQkqIGxleHN1cC5jIChsb25nb3B0cyk6IFNlcGFyYXRlIE9QVElPTl9DQUxMX1NIQVJFRCBmcm9tCi0JT1BUSU9OX05PTl9TSEFSRUQuICBBZGQgT1BUSU9OX0lHTk9SRS4gIEFkanVzdCBtYWNybyB2YWx1ZXMKLQlhY2NvcmRpbmdseS4gIEFkZCAiZHkiIGFuZCAibm9uX3NoYXJlZCIgb3B0aW9ucy4gIENoYW5nZSAiUXkiIHRvCi0JT1BUSU9OX0lHTk9SRSBmb3Igbm93LiAgSGFuZGxlIE9QVElPTl9DQUxMX1NIQVJFRCBhbmQKLQlPUFRJT05fTk9OX1NIQVJFRCBieSBzZXR0aW5nIGR5bmFtaWNfbGluayBmaWVsZCBhY2NvcmRpbmdseS4KLQlIYW5kbGUgT1BUSU9OX0lHTk9SRSBieSBpZ25vcmluZyBpdC4gIENsZWFyIGR5bmFtaWNfbGluayBmaWVsZCBmb3IKLQktciBhbmQgLVVyLgotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBJZiBjb25maWcuZHluYW1pY19saW5rIGlzIHRydWUsIHRyeQotCW9wZW5pbmcgYSBmaWxlIHdpdGggYSAuc28gZXh0ZW5zaW9uIGZpcnN0LgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggKFRFWFRfU1RBUlRfQUREUik6IENoYW5nZSB0byAweDEwMDAwLgotCShOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBMaWtld2lzZS4KLQkoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KLQkoREFUQV9QTFQpOiBEZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZl9pMzg2LnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgcGxhY2VtZW50IGZvciBuZXcgZHluYW1pYyBzZWN0aW9ucy4KLQlEb24ndCB1c2UgQ1JFQVRFX09CSkVDVF9TWU1CT0xTLiAgRGVmaW5lIF9ldGV4dCwgX2VkYXRhIGFuZCBfZW5kCi0Jb3V0c2lkZSBvZiBhbnkgc2VjdGlvbi4gIERvbid0IHVzZSBBTElHTig4KTsganVzdCBsZXQgb25lIHNlY3Rpb24KLQlWTUEgZm9sbG93IGFub3RoZXIuICBQdXQgLmR5bmJzcyBpbiAuYnNzLiAgRG9uJ3QgbWVudGlvbiBkZWJ1Z2dpbmcKLQlzZWN0aW9uczsgdGhleSdsbCBiZSBoYW5kbGVkIGNvcnJlY3RseSBhbnlob3cuCi0JKiBNYWtlZmlsZS5pbiAoZWVsZl9pMzg2LmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSwgbm90IGdlbmVyaWMuZW0uCi0KLVdlZCBNYXkgMTggMTA6MTU6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlZGlyZWN0IG91dHB1dCBvZiBsbiB0byAvZGV2L251bGwuCi0KLU1vbiBNYXkgMTYgMTM6MzU6MDggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgb2YKLQkuaHBwYV9saW5rZXJfc3R1YnMgdG8gLlBBUklTQy5zdHVicy4KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2M6IExpa2V3aXNlLgotCi1GcmkgTWF5IDEzIDEzOjAwOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IENoYW5nZSBgYG5vIGF0dGFjaGVkCi0Jb3V0cHV0IHNlY3Rpb24nJyBtZXNzYWdlIHNsaWdodGx5LgotCShsYW5nX2RvX2Fzc2lnbm1lbnRzKTogRG9uJ3QgcmVjdXJzZSBkb3duIGlmIHRoZXJlIGlzIG5vIHJlYWwKLQlzZWN0aW9uLgotCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IENoYW5nZSBlbV8gdG8gZSB0bwotCW1hdGNoIGNvcnJlc3BvbmRpbmcgY2hhbmdlIGluIGVtdWxhdGlvbiB0ZW1wbGF0ZXMuCi0JKiBjb25maWcvaTM4Ni1seW54Lm10LCBjb25maWcvbTY4ay1seW54Lm10OiBMaWtld2lzZS4KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10LCBjb25maWcvc3VuNHNvbDIubXQ6IExpa2V3aXNlLgotCi1XZWQgTWF5IDExIDE4OjE2OjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFVwZGF0ZWQgdmVyc2lvbiBudW1iZXIuCi0KLQkqIGNkdGVzdC1mb28uY2M6IFVzZSBleHBsaWNpdCAiI3ByYWdtYSBpbXBsZW1lbnRhdGlvbiIuCi0JKiBjZHRlc3QtYmFyLmNjOiBSZW5hbWVkIGZyb20gY2R0ZXN0LWZ1bmMuY2MuCi0JKiBNYWtlZmlsZS5pbjogUmVmZXJlbmNlcyB0byBjZHRlc3QtZnVuYy5vIGNoYW5nZWQgdG8KLQljZHRlc3QtYmFyLm8uCi0KLVdlZCBNYXkgMTEgMTY6MjQ6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRG9uJ3QgY3JlYXRlIHVubmVjZXNzYXJ5IG91dHB1dCBzZWN0aW9ucy4KLQkqIGxkbGFuZy5jIChvdXRfYmZkX2dldF9zZWN0aW9uX2J5X25hbWUpOiBSZW1vdmUuCi0JKHdpbGRfc2VjdGlvbik6IENhbGwgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgcmF0aGVyIHRoYW4KLQlvdXJfYmZkX2dldF9zZWN0aW9uX2J5X25hbWUuICBEb24ndCBjYWxsIHdpbGRfZG9pdCBpZiB0aGVyZSBpcyBubwotCXNlY3Rpb24uCi0JKGxhbmdfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBSZW1vdmUuCi0JKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMpOiBGb3Igc2V2ZXJhbCBjYXNlcywgY2FsbCBpbml0X29zIGlmCi0JaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2FsbGVkLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiBvdXRwdXQgc2VjdGlvbiB3YXMgbm90IGNyZWF0ZWQsIHNraXAgaXQuCi0JKGxhbmdfcHJvY2Vzcyk6IERvbid0IGNhbGwgbGFuX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzLgotCShsYW5nX3BsYWNlX29ycGhhbnMpOiBTa2lwIGZpbGVzIHdpdGgganVzdF9zeW1zX2ZsYWdzIHNldCB0byB0cnVlLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgY2hhbmdlLgotCi1UdWUgTWF5IDEwIDE0OjMxOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IERvbid0IGJvdGhlciBpbml0aWFsaXppbmcgdGhlIHZtYSBhbmQKLQlzZWN0aW9uIHNpemUuICBEb24ndCBzcGVjaWFsIGNhc2UgU0VDX1NIQVJFRF9MSUJSQVJZLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBIYW5kbGUgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbnMKLQlzcGVjaWFsbHkuCi0KLUZyaSBNYXkgIDYgMTI6MjQ6MjcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWggOiBOZXcgZmlsZSBmb3IgWGdvMzJYLgotCi1GcmkgTWF5ICA2IDE1OjE1OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSk6IFNldCBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwKLQliZWZvcmUgY2FsbGluZyBlaW5mbywgc2luY2Ugd2UgYXJlIHJlcG9ydGluZyBhbiBmb3BlbiBmYWlsdXJlLgotCUZyb20ganJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICJlIiByYXRoZXIgdGhhbiAiZW1fIiBhcyBwcmVmaXggZm9yCi0JZW11bGF0aW9ucy4KLQotRnJpIE1heSAgNiAwMTowODoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2dlbmVyaWMuZW06IFVzZSAiZSIgcmF0aGVyIHRoYW4gImVtXyIgYXMgcHJlZml4IGZvcgotCWZpbGVuYW1lLgotCSogZW11bHRlbXBsL2dsZDk2MC5lbSwgZW11bHRlbXBsL2dsZDk2MGMuZW0sIGVtdWx0ZW1wbC9sbms5NjAuZW0sCi0JZW11bHRlbXBsL2hwcGFlbGYuZW0sIGVtdWx0ZW1wbC9tODhrYmNzLmVtLCBlbXVsdGVtcGwvdmFuaWxsYS5lbToKLQlEaXR0by4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGFsbCBnZW5lcmF0ZWQgZmlsZSBuYW1lcy4KLQkobGRlbXVsLWxpc3QuaCk6IERlcGVuZCBvbiBNYWtlZmlsZSwgbm90IGNvbmZpZy5zdGF0dXMuICBDaGFuZ2VkCi0Jc2VkIHBhdHRlcm5zIHRvIGhhbmRsZSBuZXcgZmlsZW5hbWVzLgotCi0JKiBjb25maWcvbWlwc2wtaWR0Lm10OiBSZW5hbWVkIGZyb20gbWlwcy1pZHRsLm10LgotCSogY29uZmlndXJlLmluOiBBZGp1c3RlZC4KLQotVGh1IE1heSAgNSAxNTowNzozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogRG9uJ3QgdXNlICIkPCoiLCBpdCBkb2Vzbid0IGFsd2F5cwotCXdvcmsuICBJbnN0ZWFkLCBjaGVjayBidWlsZCBkaXIgYW5kICRzcmNkaXIgZXhwbGljaXRseSwgYW5kIHVzZQotCWBlY2hvJyB0byBnZXQgYWxsIHRoZSBmaWxlbmFtZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaDgzMDBoLSotaG1zKTogQ2hhbmdlZCBsZF90YXJnZXQgbmFtZSB0bwotCWNmLWg4MzAwaC4KLQkqIGNvbmZpZy9jZi1oODMwMGgubXQ6IFJlbmFtZWQgZnJvbSBjb2ZmLWg4MzAwaC5tdCwgdG8gbWFrZSBpdAotCXVuaXF1ZSBpbiA4LjMuCi0KLQkqIGNvbmZpZy9pOTYwY29mZi5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2dsZDk2MGNvZmYuc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL2dsZDk2MGMuZW06IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChpOTYwLSotdnh3b3JrczUqIGV4Y2VwdCAtdnh3b3JrczUuMCopOiBVc2UKLQlpOTYwY29mZiBjb25maWd1cmF0aW9uLgotCSogTWFrZWZpbGUuaW4gKGVtX2dsZDk2MGNvZmYuYyk6IEFkZGVkIGRlcGVuZGVuY2llcywgYnVpbGQgcnVsZS4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIGVtX2RlbHRhNjgubywgc2luY2UgdGhlCi0JY29kZSBpc24ndCBpbmNsdWRlZCBpbiBGU0YgcmVsZWFzZXMsIGFuZCBpdCBjYW4gc3RpbGwgYmUKLQlleHBsaWNpdGx5IHNlbGVjdGVkLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgc2l0ZS5iYWsgYW5kIHRtcGRpci4KLQkoU1RBR0VTVFVGRik6IFJlbW92ZWQgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpLgotCShtb3N0bHljbGVhbik6IERlbGV0ZSB0aGVtIGV4cGxpY2l0bHkgaGVyZS4gIEFsc28gcmVtb3ZlIHRtcGRpci4KLQotCVBhdGNoZXMgZnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkqIGNvbmZpZy9taXBzYnNkLm1oOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChlbV9taXBzYnNkLmMpOiBVc2UgbWlwc2JzZC5zYywgbm90IGFvdXQuc2MuCi0JKiBzY3JpcHR0ZW1wbC9taXBzYnNkLnNjOiBEb24ndCBkZWZpbmUgX19EWU5BTUlDLgotCSogZW11bHBhcmFtcy9taXBzYnNkLnNoIChPVVRQVVRfRk9STUFUKTogRml4IG5hbWUgdG8gaGF2ZSBgYS5vdXQnCi0JaW5zdGVhZCBvZiBgYW91dCcuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWdudSopOiBUcmVhdCBsaWtlIGkzODYtKi1tYWNoKi4KLQotV2VkIE1heSAgNCAxMTo1OTo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tNjhrLm10IChFTVVMKTogU2V0IHRvIG02OGthb3V0LgotCSogZW11bHBhcmFtcy9tNjhrYW91dC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW1fbTY4a2FvdXQuby4KLQkoZW1fbTY4a2FvdXQuYyk6IE5ldyB0YXJnZXQuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiBkb3QgbW92ZXMgYmVjYXVzZSBvZiBhbgotCWFzc2lnbm1lbnQsIGRvbid0IHRyeSB0byBpbnNlcnQgYSBwYWQgaW50byB0aGUgYWJzb2x1dGUgb3V0cHV0Ci0Jc2VjdGlvbiwganVzdCBjaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbgotCWluc3RlYWQuCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBjZHRlc3QudG1wLCBjZHRlc3QtdXIsCi0JY2R0ZXN0LXVyLm91dCwgYW5kIGNkdGVzdC11ci50bXAuCi0KLVdlZCBBcHIgMjcgMTY6MDM6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9zYTI5MjAwLnNjOiBBbGlnbiBhbGwgc2VjdGlvbnMgdG8gZm91ciBieXRlCi0JYm91bmRhcmllcy4KLQotV2VkIEFwciAyNyAxMDo0ODowMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBTdXBwb3J0IGZvciBnbzMyIGNvZmYuCi0JKiBjb25maWcvaTM4Ni1nbzMyLm10OiBOZXcgZmlsZQotCSogZW11bHBhcmFtcy9pMzg2Z28zMi5zaDogTmV3IGZpbGUKLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBOZXcgZmlsZQotCi1UdWUgQXByIDI2IDE3OjIwOjAzIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVtX202OGtseW54LmMsIGVtX2kzODZseW54LmMsIGVtX3NwYXJjbHlueC5jKTogVXNlCi0JTHlueC1zcGVjaWZpYyBzY3JpcHQgdGVtcGxhdGVzLgotCSogY29uZmlndXJlLmluIChzcGFyY2xpdGUqLSotY29mZik6IFVzZSBjb2ZmLXNwYXJjLgotCSogZW11bHBhcmFtcy9pMzg2bHlueC5zaCAoU0NSSVBUX05BTUUpOiBTZXQgdG8gaTM4Nmx5bnguCi0JKiBlbXVscGFyYW1zL3NwYXJjbHlueC5zaCAoU0NSSVBUX05BTUUpOiBTZXQgdG8gc3BhcmNseW54LgotCShFTlRSWSk6IFNldCB0byBfX21haW4uCi0JKiBzY3JpcHR0ZW1wbC9pMzg2bHlueC5zYzogTmV3IGZpbGUsIHNjcmlwdCBmb3IgSTM4NiBMeW54LgotCSogc2NyaXB0dGVtcGwvbTY4a2x5bnguc2M6IEFkZCBpbnNlcnRpb24gb2YgY3Rvci9kdG9yIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjOiBOZXcgZmlsZSwgc2NyaXB0IGZvciB1U3BhcmMgTHlueC4KLQotVHVlIEFwciAyNiAxMjo0MTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IEZvcmNlIF9ncCBhbmQgLmxpdDggdG8gYmUgYWxpZ25lZCB0byBhIDE2Ci0JYnl0ZSBib3VuZGFyeSwgaW4gY2FzZSB0aGUgZ2xvYmFsIGNvbnN0cnVjdG9ycyBkbyBub3QgdGFrZSB1cCBhbgotCWV2ZW4gMTYgYnl0ZXMuCi0KLQkqIGNvbmZpZy9pMzg2djQubWggKEhPU1RJTkdfQ1JUMCk6IElmIC4uL2djYy9jcnRiZWdpbi5vIGRvZXMgbm90Ci0JZXhpc3QsIGdldCBjcnRiZWdpbiBiYXNlZCBvbiBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWUuCi0JKEhPU1RJTkdfTElCUyk6IFNpbWlsYXIgY2hhbmdlIGZvciAuLi9nY2MvY3J0ZW5kLm8uCi0KLU1vbiBBcHIgMjUgMTU6Mjc6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogV2hlbiBubyBhZGRyZXNzIGlzIGdpdmVuIGZvciBhCi0Jc2VjdGlvbiwgYWxpZ24gaXQgYWNjb3JkaW5nIHRvIGl0cyByZXF1aXJlbWVudHMuCi0KLVRodSBBcHIgMjEgMTc6MjQ6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4sIGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWdkb2MudGV4aS4KLQotVHVlIEFwciAxOSAxMjoxMjoxNSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGlbMzRdODYtKi1ic2QzODYgdG8gdGhlIHBhdHRlcm5zIHJlY29nbml6ZWQuCi0KLUZyaSBBcHIgMTUgMTQ6MzU6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogV2hlbiByZWxheGluZywgYWRqdXN0IHRoZQotCXBvc2l0aW9uIG9mIGEgcGFkZGluZyBzdGF0ZW1lbnQsIGFuZCBhZGp1c3QgZG90IGFjY29yZGluZ2x5LgotCi1Nb24gQXByIDExIDE3OjM3OjA5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEVYUEVDVCwgUlVOVEVTVCk6IFNldCB0aGVzZSBmb3IgdGhlIGNoZWNrIGdvYWwuCi0KLU1vbiBBcHIgMTEgMTI6MzI6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogSWYgcmVsb2NhdGluZywgZG9uJ3QgcHV0IC5pbml0IGFuZAotCS5maW5pIHNlY3Rpb25zIGludG8gLnRleHQ7IGtlZXAgdGhlbSBzZXBhcmF0ZS4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oIChIT1NUSU5HX0NSVDApOiBJZiAuLi9nY2MvY3J0YmVnaW4ubyBkb2VzIG5vdAotCWV4aXN0LCBnZXQgY3J0YmVnaW4gYmFzZWQgb24gZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lLgotCShIT1NUSU5HX0xJQlMpOiBTaW1pbGFyIGNoYW5nZSBmb3IgLi4vZ2NjL2NydGVuZC5vLgotCi1Nb24gQXByIDExIDEwOjMxOjAwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogU2V0IFRDTF9MSUJSQVJZIGZvciBydW50ZXN0LgotCi1XZWQgQXByICA2IDAwOjA5OjM3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotKmVsZiopOiBEb24ndCByZXF1aXJlICItaHAtIiBmb3IgdGhlCi0JbWFudWZhY3R1cmVyLgotCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbSAoaHBwYWVsZl9maW5pc2gpOiBPbmx5IHJlc2l6ZSBzZWN0aW9ucwotCWlmIGJ1aWxkaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4KLQotVHVlIEFwciAgNSAxMjoxNzozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiBiZmRfY2xvc2UuCi0KLVRodSBNYXIgMzEgMTg6MDc6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogQ2xlYW4gdXAgc2VjdGlvbiBhbGlnbm1lbnQgdG8gZW5zdXJlIHRoYXQKLQlzZWN0aW9ucyBuZXZlciBvdmVybGFwIHdoZW4gdXNpbmcgLXIuCi0KLVdlZCBNYXIgMzAgMTU6NTE6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQ2hhbmdlIHN5bWJvbCByZWFkaW5nIHNsaWdodGx5IGZvciByZWNlbnQgQkZECi0JY2hhbmdlczogZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCByZW5hbWVkIGFuZCByZXR1cm5zIGxvbmcsCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgcmV0dXJucyBsb25nLCBjaGVjayBmb3IgZXJyb3IgaW5kaWNhdGlvbnMuCi0KLUZyaSBNYXIgMjUgMTc6MjA6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAocHJpbnRfaW5wdXRfc2VjdGlvbik6IEZvciBzZWN0aW9uIHNpemUsIHVzZQotCV9jb29rZWRfc2l6ZSBpZiBpdCBpcyBub24temVybywgc2l6ZSBvdGhlcndpc2UuCi0JKHNpemVfaW5wdXRfc2VjdGlvbik6IExpa2V3aXNlLgotCShsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UgKGNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pLgotCi1UaHUgTWFyIDI0IDE1OjIwOjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IEFkZCBuZXcgYXJndW1lbnQgYWRkX3RvX2xpc3QuICBEb24ndCBzZXQKLQlyZWFsIHRvIHRydWUgZm9yIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bS4gIENsZWFyIHRoZV9iZmQuCi0JKGxhbmdfYWRkX2lucHV0X2ZpbGUpOiBQYXNzIHRydWUgdG8gbmV3X2FmaWxlIGZvciBhZGRfdG9fbGlzdC4KLQkobG9va3VwX25hbWUpOiBSZW1vdmUgZm9yY2VfbG9hZCBhcmd1bWVudC4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JUGFzcyBmYWxzZSB0byBuZXdfYWZpbGUgZm9yIGFkZF90b19saXN0LiAgU3BsaXQgbG9hZGluZyBvZiBzeW1ib2xzCi0Jb3V0IGludG8gc2VwYXJhdGUgZnVuY3Rpb24uCi0JKGxvYWRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiBzcGxpdCBvdXQgb2YgbG9va3VwX25hbWUuICBEb24ndCBsb2FkCi0JdGhlIHN5bWJvbHMgaWYgdGhleSBhcmUgYWxyZWFkeSBsb2FkZWQuCi0JKG9wZW5faW5wdXRfYmZkcyk6IEZvciBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtIGNhbGwgbG9hZF9zeW1ib2xzCi0JcmF0aGVyIHRoYW4gbG9va3VwX25hbWUuCi0JKGxhbmdfcHJvY2Vzcyk6IFBhc3MgYWJzX291dHB1dF9zZWN0aW9uIHJhdGhlciB0aGFuIE5VTEwgdG8KLQlsYW5nX3NpemVfc2VjdGlvbnMuCi0JKGxhbmdfc3RhcnR1cCk6IFNldCByZWFsIGZpZWxkIG9mIGZpcnN0X2ZpbGUgdG8gdHJ1ZS4KLQotV2VkIE1hciAyMyAxNDoxNTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChoYWRfcmVsYXgpOiBSZW1vdmVkLgotCShyZWxheF9hZ2Fpbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENoYW5nZSBjYWxsIHRvIGJmZF9yZWxheF9zZWN0aW9uIHRvCi0JY29ycmVzcG9uZCB0byBCRkQgY2hhbmdlcy4gIFNldCByZWxheF9hZ2FpbiBhcHByb3ByaWF0ZWx5LgotCShsYW5nX3Byb2Nlc3MpOiBSZW1vdmUgI2lmIDAgY29kZS4gIFdoZW4gcmVsYXhpbmcsIGtlZXAgY2FsbGluZwotCWxhbmdfZG9fYXNzaWdubWVudHMgYW5kIGxhbmdfc2l6ZV9zZWN0aW9ucyB1bnRpbCByZWxheF9hZ2FpbgotCWJlY29tZXMgZmFsc2UuCi0KLQkqIGVtdWx0ZW1wL2dsZDk2MC5lbTogSW5jbHVkZSBsaWJpYmVydHkuaAotCShnbGQ5NjBfYmVmb3JlX3BhcnNlKTogUGFzcyBOVUxMIGFzIGZpbmFsIGFyZ3VtZW50IHRvIGNvbmNhdC4KLQotVHVlIE1hciAyMiAxMzowODoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IEZvcmNlIF9lbmQgYW5kIF9fZW5kIHRvIGJlIGFsaWduZWQgdG8gYQotCWZvdXIgYnl0ZSBib3VuZGFyeS4KLQotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSGFuZGxlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bSBieQotCWJ1aWxkaW5nIGEgYmZkX2RhdGFfbGlua19vcmRlciwgcmF0aGVyIHRoYW4gYnkgc2V0dGluZyB0aGUgc2VjdGlvbgotCWNvbnRlbnRzIGltbWVkaWF0ZWx5LgotCi1Nb24gTWFyIDIxIDE4OjI4OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gbWFrZSAtVXIgd29yayBhZ2Fpbi4KLQkqIGxkbWFpbi5jIChhZGRfdG9fc2V0KTogTm93IHRha2VzIHJlbG9jIGFyZ3VtZW50IHJhdGhlciB0aGFuCi0JYml0c2l6ZS4gIENoZWNrIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgaGVyZS4gIElmIGFuIG5ldyBoYXNoCi0JdGFibGUgZW50cnkgaXMgY3JlYXRlZCwgbWFyayBpdCBhcyB1bmRlZmluZWQuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogTm8gbG9uZ2VyIHRha2VzIGJpdHNpemUgYXJndW1lbnQuICBQYXNzCi0JQkZEX1JFTE9DX0NUT1IgdG8gbGRjdG9yX2FkZF9zZXRfZW50cnksIGJ1dCBmaXJzdCBtYWtlIHN1cmUgdGhlCi0JQkZEIGJhY2tlbmQgc3VwcG9ydHMgaXQuCi0JKHJlbG9jX292ZXJmbG93KTogSGFuZGxlIGEgTlVMTCBhYmZkIGFyZ3VtZW50LgotCShyZWxvY19kYW5nZXJvdXMsIHVuYXR0YWNoZWRfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxkY3Rvci5jOiBJbmNsdWRlIGxkbWFpbi5oLgotCShzdHJ1Y3Qgc2V0X2luZm8pOiBDaGFuZ2UgYml0c2l6ZSBmaWVsZCB0byByZWxvYy4KLQkobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBOb3cgdGFrZXMgcmVsb2MgYXJndW1lbnQgcmF0aGVyIHRoYW4KLQliaXRzaXplLiAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgaGVyZS4KLQkobGRjdG9yX2J1aWxkX3NldHMpOiBHZXQgdGhlIHNpemUgZnJvbSB0aGUgcmVsb2MgaG93dG8uICBJZgotCWdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgY2FsbCBsYW5nX2FkZF9yZWxvYyByYXRoZXIgdGhhbgotCWxhbmdfYWRkX2RhdGEuCi0JKiBsZGN0b3IuaCAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gdXNlIHJlbG9jCi0JaW5zdGVhZCBvZiBiaXRzaXplLgotCSogbGRsYW5nLmggKHN0YXRlbWVudF9lbnVtKTogQWRkIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0uCi0JKGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUpOiBOZXcgc3RydWN0dXJlLgotCShsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlKTogQWRkIHJlbG9jX3N0YXRlbWVudCBmaWVsZC4KLQkobGFuZ19hZGRfcmVsb2MpOiBEZWNsYXJlIG5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5jIChsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIpOiBIYW5kbGUKLQlsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtLgotCShtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zLCBwcmludF9zdGF0ZW1lbnQpOiBMaWtld2lzZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UuCi0JKHByaW50X3JlbG9jX3N0YXRlbWVudCk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19hZGRfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bS4KLQotCSogTWFrZWZpbGUuaW4gKGNkdGVzdC5vdXQsIGNkdGVzdC11ci5vKTogTmV3IHRhcmdldHMuCi0JKGNkdGVzdC11ciwgY2R0ZXN0LXVyLm91dCk6IE5ldyB0YXJnZXRzLgotCShjaGVjay1jZHRlc3QpOiBOb3cgYWxzbyBjaGVjayB0aGF0IC1VciB3b3JrcyBjb3JyZWN0bHkuCi0KLQkqIHNjcmlwdHRlbXAvYWxwaGEuc2M6IEFsaWduIGFsbCBzZWN0aW9ucyB0byAxNiBieXRlIGJvdW5kYXJpZXMuCi0KLVRodSBNYXIgMTcgMTI6NDU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogTW92ZSBsYW5nX2NvbW1vbiBjYWxsIGJlZm9yZQotCW1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMsIHRvIGVuc3VyZSB0aGF0IGFueSBhbGlnbm1lbnQKLQljb25zdHJhaW50cyBzZXQgYnkgY29tbW9uIHN5bWJvbHMgYXJlIGNvcGllZCBvdmVyIHRvIHRoZSBvdXRwdXQKLQlzZWN0aW9ucy4KLQotRnJpIE1hciAxMSAyMjoxNzozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFRFTVBMQVRFX05BTUUpOiBEb24ndCBkZWZpbmUuCi0JKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IFJlbmFtZSAudG9jIHRvIC5nb3QuCi0JKiBNYWtlZmlsZS5pbiAoZW1fZWxmMzJwcGMuYyk6IERlcGVuZCB1cG9uIGdlbmVyaWMuZW0sIG5vdCBwcGMuZW0uCi0JKiBlbXVsdGVtcGwvcHBjLmVtOiBSZW1vdmUgdWdseSBzdHViIGNvZGU7IHR1cm5zIG91dCBub3QgdG8gYmUKLQluZWVkZWQgZm9yIEVMRi4KLQotVHVlIE1hciAgOCAwNDoyMjoyNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2YnNkLm1oOiBOZXcgZmlsZS4KLQotTW9uIE1hciAgNyAxNToyMzoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZi5zYzogUGVybWl0IFRFWFRfU1RBUlRfU1lNQk9MUyBhbmQgREFUQV9TVEFSVF9TWU1CT0xTIHRvIGJlCi0JZGVmaW5lZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnMgKFRFWFRfU1RBUlRfU1lNQk9MUyk6IERlZmluZSBfZnRleHQuCi0JKERBVEFfU1RBUlRfU1lNQk9MUyk6IERlZmluZSBfZmRhdGEuCi0KLU1vbiBGZWIgMjggMTA6NTk6MTQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoY2F0KTogRGVmaW5lIHVzaW5nIEFOU0kgc3R5bGUgaWYgQUxNT1NUX1NUREMgZGVmaW5lZC4KLQotU3VuIEZlYiAyNyAxNjoyOTozOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfZmluaXNoKTogVXBkYXRlIGNvbW1lbnRzLiAgVGhpcwotCXdvcmtzIGFnYWluLiAgQXR0YWNoIHNvbWUgb3V0cHV0IHN5bWJvbHMgdG8gdGhlIHN0dWIgZmlsZSBiZmQuCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBJbmNsdWRlIGVsZjMyLWhwcGEuaC4KLQkoZmlsZV9jaGFpbik6IEFkZCBkZWNsLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEZWxldGUgZGVjbC4KLQkoaHBwYWVsZl9maW5pc2gpOiBSZWVuYWJsZSBjb2RlLiAgRG8gbm90IHBhc3Mgc3ltYm9scwotCWRvd24gdG8gaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uLgotCi1TYXQgRmViIDI2IDEwOjU4OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHdyaXRlX21hcCk6IERvbid0IGRlZmluZS4gIFJlbW92ZWQgYWxsIHJlZmVyZW5jZXMuCi0JSnVzdCB1c2UgbWFwX2ZpbGUgb3IgbWFwX2ZpbGVuYW1lIGluc3RlYWQuCi0JKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBVc2UgbWluZm8gdG8gd3JpdGUgbWFwIGluZm9ybWF0aW9uLCBub3QKLQlpbmZvX21zZy4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBVc2UgZnByaW50ZiB0byB3cml0ZSBtYXAgaW5mb3JtYXRpb24sIG5vdAotCWluZm9fbXNnLgotCSogbGRtYWluLmggKHdyaXRlX21hcCk6IERvbid0IGRlY2xhcmUuCi0JKiBsZGdyYW0ueSAobXJpX3NjcmlwdF9jb21tYW5kKTogUmVtb3ZlZCByZWZlcmVuY2UgdG8gd3JpdGVfbWFwLgotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IExpa2V3aXNlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQotRnJpIEZlYiAyNSAxOToxMjowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRm9yY2UgYWxsIHNlY3Rpb25zIHRvIGJlIGFsaWduZWQuCi0KLQkqIGxkZ3JhbS55IChzZWN0aW9uKTogUmV2ZXJzZSB0aGUgb3JkZXIgb2YgbWVtc3BlY19vcHQgYW5kCi0JZmlsbF9vcHQgdG8gYXZvaWQgYW4gYW1iaWd1aXR5IHdoZW4gYm90aCBhcmUgdXNlZC4KLQkqIGxkLnRleGluZm86IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0KLQkqIGxkZ3JhbS55OiBNb3ZlIGluY2x1ZGUgb2YgbGRsZXguaCBiYWNrIHdpdGggb3RoZXIgaW5jbHVkZXMuCi0JKiBsZGxleC5oIChpbnB1dF90eXBlKTogRG9uJ3QgaW5pdGlhbGl6ZSBlbnVtIGNvbnN0YW50cyB0bwotCXBhcnRpY3VsYXIgdmFsdWVzLgotCSogbGRsZXgubDogVXNlIGEgc3dpdGNoIHRvIHJldHVybiB0aGUgcmlnaHQgdG9rZW4gYmFzZWQgb24KLQlpbnB1dF90eXBlLCByYXRoZXIgdGhhbiBrbm93aW5nIHRoYXQgaW5wdXRfdHlwZSBoYXMgYSB2YWx1ZSBiYXNlZAotCW9uIGEgdG9rZW4gdHlwZS4KLQotCSogbGRncmFtLnkgKGRpcmxpc3RfcHRyKTogUmVtb3ZlZDsgbm90IHVzZWQuCi0JKiBsZXhzdXAuYzogSW5jbHVkZSBsZHZlci5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1GcmkgRmViIDI1IDE4OjU1OjU0IDE5OTQgIFRlZCBMZW1vbiAgKG1lbGxvbkBwZXBwZXIubmNkLmNvbSkKLQotCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogZG9uJ3QgY2FsbCBiZmRfc2V0X2dwX3NpemUuCi0JKGxkbGFuZ19hZGRfZmlsZSk6IGNhbGwgaXQgaGVyZSBpbnN0ZWFkLgotCi1GcmkgRmViIDI1IDE4OjEzOjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IEluY2x1ZGUgbGRsZXguaCBhZnRlciAldG9rZW4gZGVjbHMsIGZvciBieWFjYy4KLQotRnJpIEZlYiAyNSAxMDo0NzoyNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBGaXJzdCBhdHRlbXB0IHRvIGNsZWFuIHRoaXMgZmlsZSB1cC4KLQlBZGQgY29tbWVudHMgaW4gc2V2ZXJhbCBmdW5jdGlvbnMgYXMgdG8gdGhlaXIgcHVycG9zZSBhbmQKLQlob3cgdGhleSBmdW5jdGlvbiAob3IgbXkgY3VycmVudCBiZXN0IGd1ZXNzKS4gIENsZWFuIHVwIGhvcnJpYmxlCi0Jc3BhY2luZyBhbmQgaW5kZW50aW9uIHRoYXQgbmV2ZXIgc2hvdWxkIGhhdmUgYmVlbiBhY2NlcHRlZCBpbiB0aGUKLQlmaXJzdCBwbGFjZS4gIEFkZCBGSVhNRXMgZm9yIGlzc3VlcyB3aGljaCBuZWVkIHRvIGJlIHJlc29sdmVkLgotCURpc2FibGUgbGlua2VyLXN0dWIgZ2VuZXJhdGlvbiB1bnRpbCBpdCBnZXRzIGZpeGVkLiAgVGhpcyBhbGxvd3MKLQl0aGUgbGlua2VyIHRvIGF0IGxlYXN0IHdvcmsgb24gc2ltcGxlIGNvZGUgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBObyBsb25nZXIgc3RhdGljIChQQSBFTEYgY2FsbHMKLQlpdCB2aWEgaHBwYWVsZl9maW5pc2gpLiAgUHJvdG90eXBlIG1vdmVkIGludG8gbGRsYW5nLmguCi0JKGxhbmdfcHJvY2Vzcyk6IE1vdmUgcHJvYmxlbWF0aWMgZXh0cmEgY2FsbCB0byBsYW5nX3NpemVfc2VjdGlvbnMKLQlpbnRvIHRoZSBQQSBFTEYgc3BlY2lmaWMgY29kZS4KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtIChocHBhZWxmX2ZpbmlzaCk6IEV4dHJhIGNhbGwgdG8KLQlsYW5nX3NpemVfc2VjdGlvbnMgbW92ZWQgaGVyZS4KLQotVGh1IEZlYiAyNCAxNjo0NzozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYy0qLWVsZiopOiBOZXcgdGFyZ2V0OyB1c2UgcHBjLWVsZjMyLgotCSogY29uZmlnL3BwYy1lbGYzMi5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWx0ZW1wbC9wcGMuZW06IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fZWxmMzJwcGMuby4KLQkoZW1fZWxmMzJwcGMuYyk6IE5ldyB0YXJnZXQ7IHVzZXMgZWxmMzJwcGMuc2gsIHBwYy5lbSBhbmQgZWxmLnNjLgotCShFTVVMQVRJT05fT0ZJTEVTKTogQWRkZWQgZGVwZW5kZW5jaWVzIG9uIGxkZXhwLmggYW5kIGxkbGFuZy5oLgotCi1UaHUgRmViIDI0IDEyOjI3OjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVc2Ugc3ltYm9saWMgbnVtYmVycyBmb3IgbG9uZyBvcHRpb25zLgotCUZpeCBtaXN1bmRlcnN0YW5kaW5nIGluIC1ZIGFuZCAtY2FsbF9zaGFyZWQgZXQgYWwuCi0KLQlVc2UgZ2V0b3B0IGluc3RlYWQgb2YgbGV4IGFuZCB5YWNjIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUuCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBEb2N1bWVudCBjaGFuZ2VzIHRvIG9wdGlvbiBzeW50YXguCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGxkdmVyLmMgKGhlbHApOiBUd2VhayBkYXNoZXMgaW4gdXNhZ2UgbWVzc2FnZS4KLQkqIGxkZ3JhbS55ICgldW5pb24pOiBSZW1vdmUgdW51c2VkIG1lbWJlcnMuCi0JUmVtb3ZlICV0b2tlbnMgZm9yIGNvbW1hbmQgbGluZSBvcHRpb25zOyBhZGQgb25lcyBmb3IgaW5wdXQgdHlwZXMuCi0JKGNvbW1hbmRfbGluZSk6IFJ1bGVzIHJlbW92ZWQuCi0JKGZpbGUpOiBJbnN0ZWFkIG9mIGNvbW1hbmQgbGluZSwgcmVjb2duaXplIGFuCi0JaW5wdXQgdHlwZSBpbmRpY2F0b3IsIHRoZW4gdXNlIHRoZSBub250ZXJtaW5hbCBmb3IgdGhhdCB0eXBlLgotCShkZWZzeW1fZXhwcik6IE5ldyBub250ZXJtaW5hbCBmcm9tIGNvZGUgZm9ybWVybHkgaW4gY29tbWFuZF9saW5lLgotCSogbGRsZXguaDogRGVjbGFyZSBwYXJzZXIgaW5wdXQgdHlwZSBlbnVtIGFuZCB2YXJpYWJsZS4KLQlEb24ndCBkZWNsYXJlIHBhcnNlX2xpbmUuCi0JKiBsZGxleC5sOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4gIE1ha2Ugc29tZSB1c2VkIG9uZXMgc3RhdGljCi0JYW5kIGNvbW1lbnQgdGhlbS4KLQkoQ09NTUFORCk6IFN0YXJ0IHN0YXRlIGFuZCBpdHMgcnVsZXMgcmVtb3ZlZC4KLQlBdCBzdGFydCBvZiB5eWxleCwgcmV0dXJuIGlucHV0IHN0YXRlIHRva2VuIGlmIGF0IHN0YXJ0IG9mIGlucHV0LgotCShsZXhfcmVkaXJlY3QpOiBEb24ndCBuZWVkIHRvIHNldCB5eW91dC4KLQkobGRsZXhfY29tbWFuZCk6IEZ1bmN0aW9uIHJlbW92ZWQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluc3RlYWQgb2YgY2FsbGluZyBwYXJzZV9saW5lLCBzZXQgdXAgdGhlCi0JcmVkaXJlY3Rpb25zIGFuZCBjYWxsIHl5cGFyc2UgZGlyZWN0bHkuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogSWYgdGhlcmUncyBubyBpbnB1dCBmaWxlbmFtZSwgcHJpbnQgbm90aGluZywgbm90Ci0JImNvbW1hbmQgbGluZSIuCi0JKiBsZXhzdXAuYzogUmVtb3ZlICNpZiAwJ2QgY29kZS4KLQkocGFyc2VfbGluZSk6IEZ1bmN0aW9uIHJlbW92ZWQuCi0JKHBhcnNlX2FyZ3MpOiBSZXdyaXRlIHRvIHVzZSBnZXRvcHRfbG9uZ19vbmx5LgotCShzZXRfZGVmYXVsdF9kaXJsaXN0KTogTmV3IGZ1bmN0aW9uIGZyb20gY29kZSBmb3JtZXJseSBpbgotCWxkZ3JhbS55OmNvbW1hbmRfbGluZS4KLQkoc2V0X3NlY3Rpb25fc3RhcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbSwgZW11bHRlbXBsL2dsZDk2MC5lbSwgZW11bHRlbXBsL2hwcGFlbGYuZW0sCi0JZW11bHRlbXBsL2xuazk2MC5lbSwgZW11bHRlbXBsL204OGtiY3MuZW06IERvbid0IGVuY2xvc2UKLQljb21waWxlZC1pbiBsaW5rIHNjcmlwdHMgaW4gInsiIGFuZCAifSIsIGFzIHRoZSBncmFtbWFyIG5vIGxvbmdlcgotCXdhbnRzIHRoZW0gdG8gYmUuCi0KLVRodSBGZWIgMjQgMDg6NDM6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGQuZHZpKTogRGVwZW5kIG9uIGNvbmZpZ2RvYy50ZXhpLCBidXQgZG9uJ3QKLQlyZXF1aXJlIHRoYXQgaXQgYmUgaW4gJChzcmNkaXIpLgotCi1UdWUgRmViIDIyIDA5OjIxOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IE9ubHkgYWxpZ24gc2VjdGlvbiB0byBhbGlnbm1lbnQKLQlyZXF1aXJlZCBieSBsaW5rZXIgc2NyaXB0LCBub3QgdG8gbWF4aW11bSBhbGlnbm1lbnQgb2YgaW5wdXQKLQlzZWN0aW9ucy4KLQotCSogbGRsYW5nLmggKGxhcmdlc3Rfc2VjdGlvbik6IERvbid0IGRlY2xhcmUuCi0JKiBsZGxhbmcuYyAobGFyZ2VzdF9zZWN0aW9uKTogRG9uJ3QgZGVmaW5lLgotCShzaXplX2lucHV0X3NlY3Rpb24pOiBEb24ndCBzZXQgbGFyZ2VzdF9zZWN0aW9uOyBub3QgdXNlZC4KLQotTW9uIEZlYiAyMSAxNToxNToyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBQYXNzIE5VTEwgYXMgbGFzdCBhcmd1bWVudCB0byBjb25jYXQuCi0KLVRodSBGZWIgMTcgMTU6NTE6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYywgbGRtYWluLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0KLQkqIGxkbWlzYy5oIChjb25jYXQpOiBEb24ndCBkZWNsYXJlLgotCSogbGRtaXNjLmMgKGNvbmNhdCk6IERvbid0IGRlZmluZTsganVzdCB1c2UgdGhlIG9uZSBpbiBsaWJpYmVydHkuCi0KLQkqIGxkLmggKGFzX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFJlbW92ZWQ7IG5vdCB1c2VkLgotCi1UaHUgRmViIDE3IDA5OjMyOjE0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMsIGxkbWFpbi5jLCBsZG1pc2MuYzogVXNlIGJmZF9nZXRfZXJyb3IgYW5kCi0JYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgotCi1UdWUgRmViIDE1IDIwOjE0OjUzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IElmIHRoZSBjb29rZWQgc2l6ZSBvZiB0aGUgc2VjdGlvbgotCWhhcyBiZWVuIHNldCwgdXNlIGl0LCBmb3IgZGV0ZXJtaW5pbmcgbGlua19vcmRlciBzaXplLgotCShsZHdyaXRlKTogSW4gdGhlIGVycm9yIG1lc3NhZ2UgZGlzcGxheWVkIGlmIGJmZF9maW5hbF9saW5rIGZhaWxzLAotCWluZGljYXRlIHRoYXQgaXQgd2FzIGluIGZhY3QgdGhlIGZpbmFsIGxpbmsgc3RlcCB0aGF0IGZhaWxlZC4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENsZWFyIGJmZF9lcnJvciBiZWZvcmUgY2FsbGluZwotCWJmZF9yZWxheF9zZWN0aW9uLCBpbiBjYXNlIGl0IHJldHVybnMgZmFsc2UgYnV0IGRvZXNuJ3QgZmxhZyBhbgotCWVycm9yLiAgSWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIGluZGljYXRlIHdoaWNoIG9uZSBpdCBpcyBpbiB0aGUKLQllcnJvciBtZXNzYWdlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogRGVwZW5kIG9uIGxkLmluZm8sIGFuZCB1c2UgIiQ8KiIgc28KLQlpdCdsbCBnZXQgcGlja2VkIHVwIGZyb20gJChzcmNkaXIpIGlmIGFwcHJvcHJpYXRlLgotCi1UdWUgRmViIDE1IDE2OjMyOjA0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogT25seSBwYWQgLnRleHQgaWYgUEFEX1RFWFQgaXMgc2V0LgotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoUEFEX1RFWFQpOiBTZXQgUEFEX1RFWFQuCi0KLUZyaSBGZWIgMTEgMTc6MDI6NDkgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sIChjb21tZW50KTogSW5jcmVtZW50IGxpbmUgbnVtYmVyIHdoZW4gbmV3bGluZSBpcyByZWFkLgotCi1GcmkgRmViIDExIDE3OjM2OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogVGFrZSBuZXcgYXJndW1lbnQsIGZvcmNlX2xvYWQuICBJZiB0cnVlLAotCXJlbG9hZCB0aGUgZmlsZSBldmVuIGlmIGl0IGlzIGFscmVhZHkgbG9hZGVkLgotCSh3aWxkKTogQ2FsbCBsb29rdXBfbmFtZSB3aXRoIGZvcmNlX2xvYWQgYXJndW1lbnQgb2YgMC4KLQkob3Blbl9pbnB1dF9iZmRzKTogQ2FsbCBsb29rdXBfbmFtZSB3aXRoIGZvcmNlX2xvYWQgYXJndW1lbnQgb2YgMS4KLQkocHJpbnRfc3ltYm9sKTogUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIG5vbi1leGlzdGVudCBmdW5jdGlvbi4KLQkocHJpbnRfb25lX3N5bWJvbCk6IFJldHVybiB0cnVlIHJhdGhlciB0aGFuIGZhbGxpbmcgb2ZmIGVuZC4KLQotVGh1IEZlYiAxMCAxMTo1MjozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogVXNlICVsZCB3aGVuIHByaW50aW5nIGxvbmcgdmFsdWVzLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE1vdmUgX2VkYXRhIGFmdGVyIHRoZSAuc2RhdGEgc2VjdGlvbi4KLQlQZXJtaXQgT1RIRVJfQlNTX1NZTUJPTFMgdG8gYmUgZGVmaW5lZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnMgKE9USEVSX0JTU19TWU1CT0xTKTogRGVmaW5lIF9mYnNzLgotCi1Nb24gRmViICA3IDE2OjMxOjE1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBSZW5hbWUgYWxsICJocHBhb3NmIiBmaWxlcyB0byAiaHBwYWVsZiIuCi0JKiBDaGFuZ2UgYWxsICJvc2YiIHJlZmVyZW5jZXMgdG8gImVsZiIgaW4gaHBwYWVsZiBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLVN1biBGZWIgIDYgMjA6MzE6NTYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgeGF0ZXhpdCwgbm90IGF0ZXhpdC4KLQlDYWxsIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZS4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENoZWNrIGlmIGJmZF9yZWxheF9zZWN0aW9uIHNldAotCWJmZF9lcnJuby4KLQotU2F0IEZlYiAgNSAwMzo1NDozNCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9sbms5NjAuZW0gKGFwcGVuZCksIGVtdWx0ZW1wbC9ocHBhb3NmLmVtCi0JKGhwcGFvc2ZfZmluaXNoKTogQ2FsbCB4bWFsbG9jLCBub3QgbGRtYWxsb2MuCi0JKiBsZG1haW4uYyAocHJlc2VydmVfb3V0cHV0KTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkobWFpbik6IERvIGl0IGhlcmUgaW5zdGVhZC4KLQotRnJpIEZlYiAgNCAyMzowMjoxOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGRsYW5nLmggKExBTkdfRk9SX0VBQ0hfe0lOUFVULE9VVFBVVH1fU0VDVElPTik6IERlbGV0ZSAodW51c2VkKQotCUdOVSBDIHNwZWNpZmljIG1hY3Jvcy4KLQotCSogZW11bHRlbXBsL2hwcGFvc2YuZW0gKGhwcGFvc2ZfZmluaXNoKTogRXhwYW5kIHRoZSBvbmx5IHJlbWFpbmluZwotCWNhbGwgdG8gTEFOR19GT1JfRUFDSF9JTlBVVF9TRUNUSU9OLgotCi1GcmkgRmViICA0IDE2OjI2OjA4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKGxkbWFsbG9jLCB4bWFsbG9jLCBsZHJlYWxsb2MsIHhyZWFsbG9jKTogRnVuY3Rpb25zCi0JZGVsZXRlZDsgd2lsbCB1c2UgbGliaWJlcnR5IHZlcnNpb25zIGluc3RlYWQuCi0JKiBsZGN0b3IuYyBsZGZpbGUuYyBsZGxhbmcuYyBsZG1haW4uYyBsZG1pc2MuYyBsZG1pc2MuaCBsZXhzdXAuYwotCW1yaS5jIE1ha2VmaWxlLmluOiBDaGFuZ2UgY2FsbGVycy4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IFJlbW92ZSBjbGVhbnVwIGNvZGUuCi0JKiBsZG1haW4uYyAocmVtb3ZlX291dHB1dCk6IFB1dCBpdCBoZXJlIChuZXcgZnVuY3Rpb24pLgotCShwcmVzZXJ2ZV9vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1haW4pOiBSZWdpc3RlciByZW1vdmVfb3V0cHV0IGFuZCBwcmVzZXJ2ZV9vdXRwdXQgd2l0aCBhdGV4aXQuCi0JKiBsZG1haW4uYyBsZGdyYW0ueTogQ2FsbCB4ZXhpdCBpbnN0ZWFkIG9mIGV4aXQuCi0JKiBsZG1pc2MuaDogRGVjbGFyZSB4ZXhpdC4KLQotRnJpIEZlYiAgNCAxNToxOTowMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogTG90cyBvZiBuZXcgSDgvNTAwIG1lbW9yeSBtb2RlbHMuCi0KLVN1biBKYW4gMzAgMTQ6MzM6NDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogUmVtb3ZlZCBkdXBsaWNhdGUgcnVsZXMuCi0JKHl5d3JhcCk6IFByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9uLCBuZWVkZWQgd2l0aCBzb21lIHZlcnNpb25zIG9mCi0JZmxleC4KLQotRnJpIEphbiAyOCAwOToxMjo1NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBGb3IgYCVJJywgaWYgdGhlIGZpbGUgaXMgaW4gYW4gYXJjaGl2ZSwgcHJpbnQKLQl0aGUgYXJjaGl2ZSBmaWxlbmFtZSB0b28uCi0KLQkqIGxkbGV4Lmw6IEFkZCBydWxlIHRvIGNhdGNoIGludmFsaWQgaW5wdXQgY2hhcmFjdGVycyBpbnN0ZWFkIG9mCi0JcHJpbnRpbmcgdGhlbS4gIEluY2x1ZGUgImxkbWFpbi5oIiBmb3IgcHJvZ3JhbV9uYW1lIGRlY2wuCi0JKGxleF93YXJuX2ludmFsaWQpOiBOZXcgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY3kuCi0KLUZyaSBKYW4gMjggMTI6NTg6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogRG9uJ3QgYm90aGVyIHJ1bm5pbmcgYW55IHRlc3RzIG9mCi0JY3Jvc3MtbGlua2VyIHVudGlsIHRoZSB0ZXN0IHN1aXRlIG5vIGxvbmdlciBhc3N1bWVzIG5hdGl2ZSBtb2RlLgotCi1UaHUgSmFuIDI3IDE3OjE5OjU0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChwcmludF9vbmVfc3ltYm9sLCBwcmludF9pbnB1dF9zZWN0aW9uKTogIFByaW50Ci0JZ2xvYmFsIHN5bWJvbHMgaW4gc3ltYm9sIHRhYmxlIGFnYWluLgotCi1UaHUgSmFuIDI3IDEyOjM1OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgbGRtYWluLmggbGRncmFtLnk6IElmIC12IC1WIG9yIC0tdmVyc2lvbiB3YXMgZ2l2ZW4sCi0JZXhpdCBzdWNjZXNzZnVsbHkgaW5zdGVhZCBvZiBjb21wbGFpbmluZyBpZiBubyBpbnB1dCBmaWxlcyBhcmUKLQlnaXZlbi4KLQotVHVlIEphbiAyNSAxMzoxOTo0MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBGb3JtYXQgdmFyaWFibGUgZGVmaW5pdGlvbnMgY29uc2lzdGVudGx5LgotCShMRF9QUk9HKTogUmVtb3ZlIHVubmVjZXNzYXJ5IHZhcmlhYmxlcyBmcm9tIGxpbmsgY29tbWFuZCwKLQljaGFuZ2UgdmFyaWFibGUgTE9BRExJQkVTIHRvIEVYVFJBTElCUy4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDb21wdXRlIGFuZCBkaXNwbGF5IHRvdGFsIGV4ZWN1dGlvbiB0aW1lLgotCSogbGQudGV4aW5mbyAoLXN0YXRzKTogRG9jdW1lbnQgdGhlIG9wdGlvbi4KLQotTW9uIEphbiAyNCAxMjo1NjozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChyZWxvY19vdmVyZmxvdyk6IEFkZGVkIG5hbWUsIHJlbG9jX25hbWUgYW5kIGFkZGVuZAotCWFyZ3VtZW50cy4KLQotCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogU2V0IEJGRCBHUCBzaXplIHRvIC1HIGFyZ3VtZW50IHZhbHVlCi0JYWZ0ZXIgb3BlbmluZyBCRkQuCi0KLQkqIGxkbGFuZy5jIChyZWxheGluZyk6IFJlbW92ZWQgZ2xvYmFsIHZhcmlhYmxlLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiB0aGUgY2Fub25pY2FsIHN5bWJvbHMgaGF2ZSBub3QgYWxyZWFkeQotCWJlZW4gcmVhZCBpbiwgcmVhZCB0aGVtIGluIGJlZm9yZSByZWxheGluZy4KLQkqIGxkbGFuZy5oIChyZWxheGluZyk6IFJlbW92ZWQgZGVjbGFyYXRpb24uCi0KLUZyaSBKYW4gMjEgMDA6NDQ6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogSW5pdGlhbGl6ZSBsb2FkZWQgZmllbGQgdG8gZmFsc2UuCi0JKGxvb2t1cF9uYW1lKTogSWYgZmlsZSB3YXMgYWxyZWFkeSBsb2FkZWQsIGRvbid0IGNhbGwgdGhlCi0JYWRkX3N5bWJvbHMgZW50cnkgcG9pbnQgYWdhaW4uCi0KLVdlZCBKYW4gMTkgMTM6NTc6MDAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiBDbGFyaWZ5IHdoYXQgLVQgb3B0aW9uIGRvZXMuCi0KLVR1ZSBKYW4gMTggMTY6MTg6MTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYzogRG9uJ3QgdXNlIENSRUFURV9PQkpFQ1RfU1lNQk9MUywgdGhhdCdzCi0JZm9yIGEub3V0LgotCi1UdWUgSmFuIDExIDEzOjIyOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBJZiB0cmFjZV9maWxlcyBvcgotCXRyYWNlX2ZpbGVfdHJpZXMsIHByaW50IGZpbGUgbmFtZS4KLQkqIGxkbGFuZy5jIChsb29rdXBfbmFtZSk6IExpa2V3aXNlLgotCShsZGxhbmdfYWRkX2ZpbGUpOiBEb24ndCBwdXQgZmlsZXMgb24gaW5wdXRfYmZkcyBsaXN0IGluIHJldmVyc2UKLQlvcmRlci4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBDb3JyZWN0IHR5cG8uCi0KLU1vbiBKYW4gMTAgMTk6NDk6MDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSwgbGRsZXgubDogTWFrZSB0aGUgc3BhY2UgYmV0d2VlbiAtZSwgLXUsIGFuZCAteSBhbmQKLQl0aGVpciBhcmd1bWVudHMgb3B0aW9uYWwsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBHTlUgbGQuCi0KLUZyaSBKYW4gIDcgMjA6MDA6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuYzogRGVmaW5lIF9fYnNzX3N0YXJ0IGJlZm9yZSB0aGUgLnNic3Mgc2VjdGlvbi4KLQotVGh1IEphbiAgNiAwMDoxMzoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChhZGRfdG9fc2V0KTogQWRkIGJpdHNpemUgYXJndW1lbnQuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogTmV3IGZ1bmN0aW9uLgotCShsaW5rX2NhbGxiYWNrcyk6IEFkZCBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4KLQkqIGxkY3Rvci5jIChzdHJ1Y3Qgc2V0X2luZm8pOiBBZGQgYml0c2l6ZSBmaWVsZC4KLQkobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBBZGQgYml0c2l6ZSBhcmd1bWVudC4KLQkobGRjdG9yX2J1aWxkX3NldHMpOiBCYXNlIHRoZSBzaXplIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgc2V0IG9uCi0JdGhlIGJpdHNpemUsIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyBMT05HLgotCSogbGRjdG9yLmggKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogQWRkIGJpdHNpemUgdG8gZGVjbGFyYXRpb24uCi0KLQkqIGxkLmggKFFVQURfU0laRSk6IERlZmluZS4KLQkqIGxkZ3JhbS55IChRVUFEKTogTmV3IHRva2VuLgotCShsZW5ndGgpOiBIYW5kbGUgaXQuCi0JKiBsZGxleC5sOiBSZXR1cm4gUVVBRC4KLQkqIGxleHN1cC5jIChrZXl3b3Jkcyk6IEFkZCBRVUFELgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSGFuZGxlIFFVQUQuCi0JKiBsZGxhbmcuYyAocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBIYW5kbGUgUVVBRC4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZS4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90b2tlbik6IEFkZCBRVUFEIHRvIHRhYmxlLgotCSogbGQudGV4aW5mbzogRGVzY3JpYmUgUVVBRC4KLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IERvbid0IGNyZWF0ZSAubGl0NCBvciAuc2RhdGEgc2VjdGlvbnMsCi0Jc2luY2UgdGhlIEFscGhhIGRvZXNuJ3QgdXNlIHRoZW0uCi0KLVdlZCBKYW4gIDUgMTc6NDI6MTYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGVtdWwuaCAobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQ29tbWVudCB0aGUgbWVtYmVycy4KLQotU2F0IEphbiAgMSAxMzozOTozMSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBWU1RhIG1pY3JvLWtlcm5lbC4KLQkqIGNvbmZpZy92c3RhLm10LCBlbXVscGFyYW1zL3ZzdGEuc2g6IE5ldyBmaWxlcyBmb3IgVlNUYS4KLQotU2F0IEphbiAgMSAxMDo1MzozNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IFBhZCAudGV4dCB0byBEQVRBX0FMSUdOTUVOVCBpZiByZWxvY2F0aW5nOwotCW5lZWRlZCBmb3IgaTM4Nm1hY2guICAoU2hvdWxkIGJlIGEgbm8tb3Agb24gb3RoZXIgc3lzdGVtcy4pCi0KLQkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2ggKFNFR01FTlRfU0laRSk6IEZpeCBhZ2Fpbi4KLQkoUEFHRV9TSVpFKTogRG9uJ3QgZGVmaW5lOyBub3QgdXNlZC4KLQotRnJpIERlYyAzMSAxNjoxMjowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55ICh5eWVycm9yKTogTWFrZSBhcmd1bWVudCBjb25zdCBjaGFyICosIGFuZCBhY3R1YWxseQotCXByaW50IGl0IG91dCByYXRoZXIgdGhhbiBhc3N1bWluZyBpdCBpcyBhIHN5bnRheCBlcnJvci4KLQkqIGxkbWlzYy5oOiBDaGFuZ2UgZGVjbGFyYXRpb24gb2YgeXllcnJvci4KLQkqIGxkZW11bC5jLCBsZHdyaXRlLmM6IEFkZCAvKkFSR1NVU0VEKi8gYXMgYXBwcm9wcmlhdGUuCi0KLUZyaSBEZWMgMzEgMTE6Mzc6MjggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoIChOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBEb24ndCBpbmNsdWRlCi0JZXhlYyBoZWFkZXIgb2Zmc2V0LCBzaW5jZSB0aGUgZXhlYyBoZWFkZXIgaXNuJ3QgbG9hZGVkLgotCShQQUdFX1NJWkUsIFNFR01FTlRfU0laRSk6IEFncmVlIHdpdGggYmZkL2kzODZtYWNoMy5jLgotCi1UaHUgRGVjIDMwIDEzOjAxOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUEgbWFqb3IgcmV3cml0ZSB0byBtb3ZlIHRoZSBidWxrIG9mIHRoZSBsaW5rZXIgaW50byBCRkQgc28gdGhhdAotCW1vcmUgZWZmaWNpZW50IGJhY2tlbmQgY29kZSBjYW4gYmUgd3JpdHRlbiBmb3Igc3BlY2lmaWMgb2JqZWN0Ci0JZmlsZXMuCi0JKiBsZGVycm9yLmMsIGxkZXJyb3IuaCwgbGRpbmRyLmMsIGxkaW5kci5oLCBsZHN5bS5jLCBsZHN5bS5oLAotCWxkd2Fybi5jLCBsZHdhcm4uaCwgcmVsYXguYywgcmVsYXguaDogUmVtb3ZlZC4KLQkqIGxkY3Rvci5jLCBsZGN0b3IuaDogQ29tcGxldGUgcmV3cml0ZS4KLQkqIGxkd3JpdGUuYywgbGR3cml0ZS5oOiBDb21wbGV0ZSByZXdyaXRlLgotCSogbGQuaCAoc3RyaXBfc3ltYm9sc190eXBlLCBzdHJpcF9zeW1ib2xzKTogUmVtb3ZlZC4gIFVzZQotCWxpbmtfaW5mby5zdHJpcCBpbnN0ZWFkLiAgQ2hhbmdlZCBhbGwgdXNlcy4KLQkoZGlzY2FyZF9sb2NhbHNfdHlwZSwgZGlzY2FyZF9sb2NhbHMpOiBSZW1vdmVkLiAgVXNlCi0JbGlua19pbmZvLmRpc2NhcmQgaW5zdGVhZC4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKGxkX2NvbmZpZ190eXBlKTogUmVtb3ZlZCByZWxvY2F0ZWFibGVfb3V0cHV0IGZpZWxkOyB1c2UKLQlsaW5rX2luZm8ucmVsb2NhdGVhYmxlIGluc3RlYWQ7IGNoYW5nZWQgYWxsIHVzZXMuICBBZGRlZCBzdGF0cwotCWZpZWxkLgotCShzZXRfYXN5bWJvbF9jaGFpbiwgZ2V0X2FzeW1ib2xfY2hhaW4sIGdldF9sb2FkZXJfc3ltYm9sLAotCXNldF9sb2FkZXJfc3ltYm9sKTogUmVtb3ZlZC4KLQkqIGxkZXhwLmggKG5vZGVfY2xhc3MpOiBBZGRlZCBldHJlZV9yZWwuCi0JKGV0cmVlX3R5cGUpOiBBZGRlZCByZWwgZmllbGQuCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdG9rZW4pOiBCcmFja2V0ZWQgdGFibGUgaW5pdGlhbGl6YXRpb24uCi0JKGV4cF9yZWxvcCk6IE5ldyBmdW5jdGlvbi4KLQkoZm9sZF9uYW1lKTogVXNlIGxpbmtlciBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGxkc3ltIGZ1bmN0aW9ucy4KLQkoZXhwX2ZvbGRfdHJlZSk6IExpa2V3aXNlLiAgQWxzbywgaGFuZGxlIGV0cmVlX3JlbCBjYXNlLgotCShleHBfcHJpbnRfdHJlZSk6IEhhbmRsZSBldHJlZV9yZWwuCi0JKiBsZGdyYW0ueSAoc3RyaXBfc3ltYm9scywgZGlzY2FyZF9sb2NhbHMpOiBSZW1vdmVkLgotCShPUFRJT05fc3RhdHMsIE9QVElPTl9ub19rZWVwX21lbW9yeSk6IE5ldyB0b2tlbnMuICBIYW5kbGUgdGhlbS4KLQkoUkVMKTogTmV3IHRva2VuLiAgRG9lcyBub3QgYXBwZWFyIGluIGdyYW1tYXIsIGJ1dCBuZWVkZWQgZm9yCi0JZXhwcmVzc2lvbiBjb2RlLgotCShmaWxlKTogRG9uJ3QgY2FsbCBsYW5nX2ZpbmFsOyBpdCdzIGNhbGxlZCBieSBtYWluIGFueWhvdy4KLQkqIGxkbGV4Lmw6IEFjY2VwdCAtc3RhdHMgYW5kIC1uby1rZWVwLW1lbW9yeSBvcHRpb25zLgotCSogbGRsYW5nLmggKGZpbGxfdHlwZSk6IE1ha2UgdW5zaWduZWQgaW50LCBub3QgdW5zaWduZWQgc2hvcnQuCi0JKiBsZGxhbmcuYzogQ29uc2lzdGVudGx5IHVzZSBmaWxsX3R5cGUgZm9yIGZpbGwgYXJndW1lbnQuCi0JKGxhbmdfaW5pdF9zY3JpcHRfZmlsZSwgc2NyaXB0X2ZpbGUpOiBSZW1vdmVkLgotCShjcmVhdGVfb2JqZWN0X3N5bWJvbHMpOiBSZW1vdmVkLiAgVXNlCi0JbGlua19pbmZvLmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uIGluc3RlYWQuICBDaGFuZ2VkIGFsbAotCXVzZXMuCi0JKGxhbmdfYWRkX2tlZXBzeW1zX2ZpbGUpOiBSZW1vdmVkLgotCShsb29rdXBfbmFtZSk6IENhbGwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgaW5zdGVhZCBvZgotCWxkbWFpbl9vcGVuX2ZpbGVfcmVhZF9zeW1ib2wuCi0JKHdpbGQpOiBEb24ndCBpdGVyYXRlIG92ZXIgc2NyaXB0X2ZpbGUuCi0JKG9wZW5fb3V0cHV0KTogQ3JlYXRlIGxpbmsgaGFzaCB0YWJsZS4KLQkobGFuZ19wbGFjZV91bmRlZmluZWRzKTogUmV3cm90ZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogSGFuZGxlIHJlbGF4aW5nIChkb2Vzbid0IHdvcmsgeWV0KS4KLQkobGFuZ19yZWxvY2F0ZV9nbG9iYWxzKTogUmVtb3ZlZC4KLQkobGFuZ19maW5pc2gpOiBVc2UgbGluayBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGxkc3ltIGZ1bmN0aW9ucy4KLQkobGFuZ19jb21tb24pOiBSZXdyb3RlLgotCShsYW5nX29uZV9jb21tb24pOiBOZXcgZnVuY3Rpb24uCi0JKGxkbGFuZ19hZGRfZmlsZSk6IEFkZCBmaWxlIHRvIGxpbmtfaW5mby5pbnB1dF9iZmRzIGxpc3QuICBTZXQKLQl1c3JkYXRhLgotCShjcmVhdGVfc3ltYm9sKTogUmVtb3ZlZC4KLQkobGFuZ19wcm9jZXNzKTogRG9uJ3QgY2FsbCBsYW5nX2luaXRfc2NyaXB0X2ZpbGUuICBDYWxsCi0JbGRjdG9yX2J1aWxkX3NldHMgcmF0aGVyIHRoYW4gZmluZF9jb25zdHJ1Y3RvcnMuICBEb24ndCBjYWxsCi0JbGFuZ19yZWxvY2F0ZV9nbG9iYWxzLgotCShsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mKTogUmV3cm90ZS4KLQkobGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZik6IFJld3JvdGUuCi0JKiBsZG1haW4uYyAoaGFkX3kpOiBSZW1vdmVkLgotCShscHJlZml4LCBscHJlZml4X2xlbik6IFJlbW92ZWQ7IHVzZSBsaW5rX2luZm8gZmllbGRzIGluc3RlYWQuCi0JQ2hhbmdlZCBhbGwgdXNlcy4KLQkobXVsdGlwbGVfZGVmX2NvdW50LCBjb21tb25zX3BlbmRpbmcsIHVuZGVmaW5lZF9nbG9iYWxfc3ltX2NvdW50LAotCXRvdGFsX3N5bWJvbHNfc2VlbiwgdG90YWxfZmlsZXNfc2Vlbik6IFJlbW92ZWQuCi0JKGxpbmtfY2FsbGJhY2tzLCBsaW5rX2luZm8pOiBOZXcgdmFyaWFibGVzLgotCShtYWluKTogSW5pdGlhbGl6ZSBsaW5rX2luZm8uICBEb24ndCBjYWxsIGluaXRfYmZkX2Vycm9yX3ZlY3RvciBvcgotCWxkc3ltX2luaXQuICBEb24ndCBzZXQgbm93IHVudXNlZCB2YXJpYWJsZXMuICBIYW5kbGUgLXN0YXRzLgotCShnZXRfZW11bGF0aW9uKTogUmVtb3ZlZCBvYnNvbGV0ZSBhbmQgbm9uZnVuY3Rpb25hbCBHTlU5NjAgY29kZS4KLQkoYWRkX3lzeW0pOiBSZXdyb3RlLgotCShyZWFkX2VudHJ5X3N5bWJvbHMsIHJlZml6ZSwgZW50ZXJfZ2xvYmFsX3JlZiwgZW50ZXJfZmlsZV9zeW1ib2xzLAotCXNlYXJjaF9saWJyYXJ5LCBnbnU5NjBfY2hlY2tfZm9ybWF0LCBkZWNvZGVfbGlicmFyeV9zdWJmaWxlLAotCWxpbmVhcl9saWJyYXJ5LCBzeW1kZWZfbGlicmFyeSwgY2xlYXJfc3ltcywgc3ViZmlsZV93YW50ZWRfcCk6Ci0JUmVtb3ZlZC4KLQkoYWRkX2tlZXBzeW1zX2ZpbGUsIGFkZF9hcmNoaXZlX2VsZW1lbnQsIG11bHRpcGxlX2RlZmluaXRpb24sCi0JbXVsdGlwbGVfY29tbW9uLCBhZGRfdG9fc2V0LCB3YXJuaW5nX2NhbGxiYWNrLCB1bmRlZmluZWRfc3ltYm9sLAotCXJlbG9jX292ZXJmbG93LCByZWxvY19kYW5nZXJvdXMsIHVuYXR0YWNoZWRfcmVsb2MsIG5vdGljZV95c3ltKToKLQlOZXcgZnVuY3Rpb25zLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEFjY2VwdCBhIHN0cmluZyBmb3IgJVQsIG5vdCBhIHN5bWJvbC4gIERvbid0Ci0JcmVxdWlyZSBzeW1ib2xzIGZvciAlQzsgbG9vayB0aGVtIHVwIGluc3RlYWQuCi0JKiBlbXVsdGVtcGwvaHBwYW9zZi5lbTogUGFzcyBsaW5rX2luZm8gdG8KLQlocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IFJlbW92ZWQgbGRlcnJvci5jLCBsZGluZHIuYywgbGRzeW0uYywgbGR3YXJuLmMsIGFuZAotCXJlbGF4LmMuCi0JKEhGSUxFUyk6IFJlbW92ZWQgbGRlcnJvci5oLCBsZGluZHIuaCwgbGRzeW0uaCwgbGR3YXJuLmgsIGFuZAotCXJlbGF4LmguCi0JKEVNVUxBVElPTl9PRklMRVMpOiBEZXBlbmQgb24gYmZkbGluay5oLCBsZG1haW4uaCwgbGRleHAuaCwKLQlsZGxhbmcuaCBhbmQgbGRjdG9yLmguCi0KLQkqIE1ha2VmaWxlLmluIChsZGxleC5jKTogRG9uJ3QgZGVwZW5kIG9uIGxkZ3JhbS5oLiAgUmVtb3ZlCi0JZGVjbGFyYXRpb25zIG9mIGZyZWUgYW5kIG1hbGxvYyBmcm9tIGZsZXggb3V0cHV0LiAgQ2hhbmdlIG1hbGxvYwotCXRvIGxkbWFsbG9jIGluIGZsZXggb3V0cHV0LgotCi1UaHUgRGVjIDE2IDIxOjE5OjU3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsZG1haW4uYyAobHByZWZpeCk6IENoYW5nZSBkZWZhdWx0IGZyb20gYSBjaGFyIHRvIGEgc3RyaW5nCi0Jd2l0aCBvbmx5IG9uZSBjaGFyYWN0ZXIuCi0JKGxwcmVmaXhfbGVuKTogU2V0IGRlZmF1bHQgdG8gb25lLgotCi0JKiBsZG1haW4uaCAobHByZWZpeF9sZW4pOiBEZWNsYXJlLgotCi0JKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6IFVzZSBzdHJuY21wIHJhdGhlciB0aGFuIGEgY2hhcmFjdGVyCi0JY29tcGFyaXNvbiBmb3IgbHByZWZpeC4KLQotCSogZW11bHRtcGwvbTg4a2Jjcy5lbSAoYmVmb3JlX3BhcnNlKTogU2V0IGxwcmVmaXggYW5kIGxwcmVmaXhfbGVuCi0JY29ycmVjdGx5LgotCi0JKiBlbXVsdG1wbC9ocHBhb3NmLmVtOiBJbmNsdWRlIGxkZXhwLmguCi0JKGJlZm9yZV9wYXJzZSk6IFNldCBscHJlZml4IGFuZCBscHJlZml4X2xlbiBjb3JyZWN0bHkuCi0KLVR1ZSBEZWMgMTQgMTc6MTk6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5oOiBEb24ndCBkZWNsYXJlIHl5d3JhcCBpZiBpdCBpcyBhIG1hY3JvLgotCSogbGRsZXgubDogSW5jbHVkZSBzeXNkZXAuaC4KLQkqIGxkbGFuZy5jIChsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIsCi0JbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQpOiBGb3Jnb3QgdG8gdXNlIFBBUkFNUy4KLQotTW9uIERlYyAxMyAxNDozMDowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCAuUEhPTlkgdGFyZ2V0cyB3aGVyZSBhcHByb3ByaWF0ZS4gIEFkZGVkIHNvbWUKLQljb21tZW50cy4gIEFsc286Ci0JKGdjY2xpYmRpciwgdmVyc2lvbik6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcy4KLQkoREVQKTogTmV3IHZhcmlhYmxlLCBzZXQgdG8gbWtkZXAuCi0JKEFMTF9DRkxBR1MpOiBOZXcgdmFyaWFibGUuICBVc2VkIGluIC5jLm8gdGFyZ2V0LgotCShDRklMRVMsIEhGSUxFUywgR0VORVJBVEVEX0NGSUxFUywgR0VORVJBVEVEX0hGSUxFUyk6IE5ldwotCXZhcmlhYmxlcy4KLQkoSEVBREVSUywgTUFOU09VUkNFUywgTERDU09VUkNFUywgR0VORVJBVEVEX1NPVVJDRVMsCi0JR0VORVJBVEVEX0hFQURFUlMsIExEU09VUkNFUywgQkZEX1NPVVJDRVMsIFNPVVJDRVMpOiBSZW1vdmVkCi0JbW9zdGx5IG9ic29sZXRlIHZhcmlhYmxlcy4gIEFkanVzdGVkIHJlbWFpbmluZyB1c2VzLgotCShERUZfRU1VTCk6IFJlbW92ZWQgdmFyaWFibGUuCi0JKGxkbWFpbi5vKTogSGFuZGxlIHVuZGVmaW5lZCBFTVVMIGVycm9yIGNvcnJlY3RseS4KLQkobGRlbXVsLWxpc3QuaCk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzIHJhdGhlciB0aGFuIE1ha2VmaWxlLgotCUNyZWF0ZSB2aWEgdGVtcG9yYXJ5IGZpbGUuCi0JKHZlcjk2MC5jLCByb2xsLCBtYWtlKTogUmVtb3ZlZCBvYnNvbGV0ZSB0YXJnZXRzLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCwgZGVwLCBkZXAtaW4pOiBOZXcgdGFyZ2V0cy4gIFVzZWQgdG8gcmVidWlsZAotCWRlcGVuZGVuY2llcy4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLCB1c2VkIHdoZW4gcmVidWlsZGluZyBkZXBlbmRlbmNpZXMuCi0KLVNhdCBEZWMgMTEgMTQ6NDM6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JTWFkZSBtYW55IGNoYW5nZXMgdG8gZWxpbWluYXRlIGdjYyB3YXJuaW5ncy4gIE1hZGUgdmFyaW91cwotCWNvc21ldGljIGNoYW5nZXMsIGRlY2xhcmVkIHZhcmlvdXMgdGhpbmdzIGluIGhlYWRlciBmaWxlcywgcmVtb3ZlZAotCXZhcmlvdXMgZXh0ZXJuIGRlY2xhcmF0aW9ucyBmcm9tIC5jIGZpbGVzLiAgTm8gc3Vic3RhbnRpdmUKLQljaGFuZ2VzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogSWZkZWYgb3V0IGZpbmFsIGNhbGwgdG8KLQlsYW5nX3NpemVfc2VjdGlvbnMgYWdhaW4gKHJldmVydGluZyBjaGFuZ2Ugb2YgTm92ZSAyKSwgc2luY2UgaXQKLQlicmVha3MgdGhlIFN1bjQgbGlua2VyLgotCi1UaHUgRGVjICAyIDE2OjMxOjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW5ldHdhcmUqKTogTmV3IHRhcmdldDsgdXNlIGFscGhhLgotCi1XZWQgRGVjICAxIDE0OjA0OjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEdyb3VwIHRhcmdldHMgYnkgQ1BVLiAgTWVyZ2Ugc29tZSBtNjhrIHRhcmdldAotCWVudHJpZXMgd2l0aCBkaWZmZXJlbnQgQ1BVIHNwZWNzIHRoYXQgdXNlIHRoZSBzYW1lIGxkX3RhcmdldAotCXZhbHVlcy4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3BhcmMqLSotY29mZi4KLQkqIGNvbmZpZy9jb2ZmLXNwYXJjLm10LCBlbXVscGFyYW1zL2NvZmZfc3BhcmMuc2g6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9jb2ZmX3NwYXJjLm8uCi0JKGVtX2NvZmZfc3BhcmMuYyk6IEFkZCBkZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIHJ1bGVzLgotCi0JKiBsZG1pc2MuYyAoZXJybm8sIHN5c19uZXJyLCBzeXNfZXJybGlzdCk6IERvbid0IGRlY2xhcmUuCi0KLVdlZCBEZWMgIDEgMTI6MTk6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSAoT1BUSU9OX2NhbGxfc2hhcmVkLCBPUFRJT05fbm9uX3NoYXJlZCwgT1BUSU9OX092YWwpOgotCU5ldyB0b2tlbnMuCi0JKGNvbW1hbmRfbGluZV9vcHRpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSB0aGVtIChmb3Igbm93KS4KLQkqIGxkbGV4LmwgKDxDT01NQU5EPik6IEhhbmRsZSAtbm9uX3NoYXJlZCwgLWNhbGxfc2hhcmVkLCBhbmQgLU9uCi0Jd2hlcmUgbiBpcyBhIG51bWJlci4KLQotTW9uIE5vdiAyMiAxNDoxNDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChzdWJmaWxlX3dhbnRlZF9wKTogSWYgbWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2hpY2ggaXMKLQlub3QgaW4gYmZkX2NvbV9zZWN0aW9uLCBjcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIEJGRCBzbyB0aGF0IGl0Ci0JY2FuIGJlIHBsYWNlZCBpbiB0aGUgcmlnaHQgb3V0cHV0IHNlY3Rpb24uCi0KLUZyaSBOb3YgMTkgMTQ6MTI6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLXNnaS1pcml4NSopOiBOZXcgdGFyZ2V0LiAgVXNlIG1pcHNiLWVsZjMyLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcHNiLnNoIChEQVRBX0FERFIpOiBEZWZpbmUuCi0JKE9USEVSX1JFQURPTkxZX1NFQ1RJT05TKTogRGVmaW5lIGZvciAucmVnaW5mby4KLQkoRVhFQ1VUQUJMRV9TWU1CT0xTKTogRGVmaW5lIGZvciBfRFlOQU1JQ19MSU5LLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgRVhFQ1VUQUJMRV9TWU1CT0xTIHdoZW4gbm90IHJlbG9jYXRpbmcuCi0JTW92ZSBPVEhFUl9SRUFET05MWV9TRUNUSU9OUyBhZnRlciBhbGwgdGhlIG90aGVyIHJlYWRvbmx5Ci0Jc2VjdGlvbnMuICBEb24ndCB1c2UgREFUQV9BRERSIHR3aWNlLgotCi0JKiBsZG1haW4uYyAoZW50ZXJfZmlsZV9zeW1ib2xzKTogUmVtb3ZlZCBkdXBsaWNhdGUgdGVzdHMgb2YgcC4gIElmCi0JcCBpcyBpbiBhIGNvbW1vbiBzZWN0aW9uLCBtYWtlIHN1cmUgdGhlIEJGRCBoYXMgYSBzZWN0aW9uIG9mIHRoYXQKLQluYW1lLgotCi0JKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBBZGQgbmV3bGluZSB0byBlcnJvciBtZXNzYWdlLgotCi1UaHUgTm92IDExIDE1OjU0OjQxIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9tNjhrbHlueC5zaCAoU0NSSVBUX05BTUUpOiBEZWZpbmUgdG8gdXNlIGEKLQlMeW54LXNwZWNpZmljIHNjcmlwdCBpbnN0ZWFkIG9mIG02OGtjb2ZmLgotCShPVVRQVVRfRk9STUFUKTogRGVmaW5lIGFzICJjb2ZmLW02OGstbHlueCIuCi0JKEVOVFJZKTogRGVmaW5lIGFzIF9fbWFpbi4KLQkoVEVYVF9TVEFSVF9BRERSKTogRGVmaW5lIGFzIDAuCi0JKFBBR0VfU0laRSk6IERlZmluZSBhcyAweDEwMDAuCi0JKiBlbXVscGFyYW1zL2kzODZseW54LnNoLCBlbXVscGFyYW1zL3NwYXJjbHlueC5zaDogRml4IGNvbW1lbnQuCi0JKiBzY3JpcHR0ZW1wbC9tNjhrbHlueC5zYzogTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDggMTI6MDA6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IElnbm9yZSAtbWlwczEsIC1taXBzMiBhbmQgLW1pcHMzCi0JYXJndW1lbnRzIHJhdGhlciB0aGFuIHRyZWF0aW5nIHRoZW0gYXMgZW11bGF0aW9uIG5hbWVzLgotCi1GcmkgTm92ICA1IDA5OjAyOjUyIDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAYmx1ZXMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTdXBwb3J0IHg4NiB1bml4d2FyZSBhbmQgbmV0d2FyZSBwbHVzIGdlbmVyaWMgbmV0d2FyZS4KLQotRnJpIE5vdiAgNSAyMTo0Nzo1NSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2ggKFRFWFRfU1RBUlRfQUREUiwgTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKToKLQlDb3JyZWN0IHZhbHVlcyAoPykuCi0KLVdlZCBOb3YgIDMgMTU6MTA6MTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCBkZWxldGUgZHZpIG9yIGluZm8gZmlsZXMuCi0JKGxkLmluZm8pOiBVcGRhdGUgZGVwZW5kZW5jeSBsaXN0LgotCShsZC5kdmkpOiBEaXR0by4gIEV4dGVuZCBURVhJTlBVVFMgdG8gZ2V0IGJmZHN1bW0udGV4aS4KLQotV2VkIE5vdiAgMyAxMjowNzozOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9vdXRwdXQpOiBUYWtlIG5ldyBhcmcsIEZST01fU0NSSVBULgotCVNldCBvdXRwdXRfZmlsZW5hbWUgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBub2RlLgotCShvcGVuX291dHB1dCk6IERvbid0IHNldCBvdXRwdXRfZmlsZW5hbWUuCi0JKGxhbmdfZmluYWwpOiBDcmVhdGUgdGhlIG5ldyBub2RlIGhlcmUuCi0JKiBsZGxhbmcuYywgbGRsYW5nLmgsIGxkZ3JhbS55LCBtcmkuYzogcGFzcyBGUk9NX1NDUklQVC4KLQotVHVlIE5vdiAgMiAxNTo0NTo1MSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotIAlGcm9tIFBldGUgSG9vZ2VuYm9vbSAoaG9vZ2VuQGNzLnV0YWguZWR1KToKLQotCSogc2NyaXB0dGVtcGwvaHBwYW9zZi5zYzogKF9fX3N0YWNrX3plcm8sIGV0ZXh0LCBfZXRleHQsCi0JZWRhdGEsIF9lZGF0YSwgZW5kKTogQWRkIGRlZmluaXRpb25zIG9mIHRoZXNlIHN5bWJvbHMuCi0JKF9fZW5kKTogIFJlbW92ZSBkZWZpbml0aW9uIG9mIHRoaXMgc3ltYm9sLgotCShfX2RhdGFfc3RhcnQpOiBNb3ZlIGRlZmluaXRpb24gb2YgdGhpcyBzeW1ib2wuCi0KLQkqIGVtdWx0ZW1wbC9ocHBhb3NmLmVtOiAgVmFyaW91cyBmaXhlcyBhbmQgc3VwcG9ydCBmb3IgbGlua2VyIHN0dWIKLQlnZW5lcmF0aW9uLgotCShocHBhb3NmX2ZpbmlzaCwgaHBwYW9zZl9zZWFyY2hfZm9yX3BhZGRpbmdfc3RhdGVtZW50cywKLQlocHBhb3NmX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogTmV3IGZ1bmN0aW9ucyBpbgotCXN1cHBvcnQgb2YgbGlua2VyIHN0dWIgZ2VuZXJhdGlvbi4KLQkobGRfaHBwYW9zZl9lbXVsYXRpb24pOiAgUmVkZWZpbmUgdG8gaW5jbHVkZSBuZXcKLQllbXVsYXRpb24tc3BlY2lmaWMgcm91dGluZXMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBSZS1lbmFibGUgbGFzdCBjYWxsIGxhbmdfc2l6ZV9zZWN0aW9ucy4KLQlQYXNzIGFic19vdXRwdXRfc2VjdGlvbiByYXRoZXIgdGhhbiBOVUxMIHRvIGF2b2lkIGludmFsaWRhdGluZwotCWFic29sdXRlIHN5bWJvbHMuCi0KLVRodSBPY3QgMjggMjE6MTY6NDIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW1faTM4Nm1hY2guby4KLQkoZW1faTM4Nm1hY2guYyk6IE5ldyBydWxlLgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotbWFjaCopOiBOZXcgY2FzZS4KLQkqIGNvbmZpZy9pMzg2LW1hY2gubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaDogTmV3IGZpbGUuCi0KLUZyaSBPY3QgMjkgMTQ6NTU6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZC5oIChmbGFnX2lzXyopOiBSZW1vdmVkIG1hY3Jvcy4KLQkqIGxkbWFpbi5jIChlbnRlcl9nbG9iYWxfcmVmKSwgbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOgotCUNvbnNpc3RlbnRseSBjaGVjayB0aGUgQkZEIHN5bWJvbCBmbGFncyBkaXJlY3RseSwgcmF0aGVyIHRoYW4KLQl1c2luZyBmaWxlX2lzXyogbWFjcm9zLgotCi1UaHUgT2N0IDI4IDE5OjA4OjQyIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1seW54b3MqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgcnVsZSBmb3IgZW1fc3BhcmNseW54LmMuCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIEx5bnggZW11bGF0aW9ucy4KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvc3BhcmNseW54LnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3NwYXJjY29mZi5zYzogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjggMTM6NTA6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY3kgZm9yICQoRU1VTEFUSU9OX09GSUxFUykuCi0KLU1vbiBPY3QgMjUgMTY6MDk6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxheC5jICh3cml0ZV9yZWxheCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfc2VjbGV0X2xpbmsuCi0KLU1vbiBPY3QgMjUgMDk6MzE6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZSk6IE5ldyB2YXJpYWJsZS4KLQkob3Blbl9vdXRwdXQpOiBTZXQgaXQgYWZ0ZXIgYmZkIG9wZW4gc3VjY2VlZHMuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogVGVzdCBpdC4KLQotCUNoYW5nZXMgZnJvbSBQZXRlciBIb29nZW5ib29tLCBob29nZW5AY3MudXRhaC5lZHU6Ci0KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogU2V0IHRoZSBCU0ZfRklMRSBmbGFnIGZvciBvYmplY3QKLQlzeW1ib2xzLgotCi0JKiBsZGVtdWwuYzogU3VwcG9ydCB3YXMgYWRkZWQgdG8gYWxsb3cgZW11bGF0aW9uLXNwZWNpZmljCi0JcHJvY2Vzc2luZyB0byBvY2N1ci4gIFRoaXMgc3VwcG9ydCB3YXMgYWRkZWQgcHJpbWFyaWx5IGZvciBsaW5rZXIKLQlzdHViIGdlbmVyYXRpb24gaW4gdGhlIGVsZjMyLWhwcGEgZ2xkLgotCShsZGVtdWxfZmluaXNoLCBsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiAgTmV3Ci0JZnVuY3Rpb25zLgotCSogbGRlbXVsLmg6IFN1cHBvcnQgd2FzIGFkZGVkIHRvIGFsbG93IGVtdWxhdGlvbi1zcGVjaWZpYwotCXByb2Nlc3NpbmcgdG8gb2NjdXIuIChBcyBkZXNjcmliZWQgYWJvdmUuKSAgQWRkZWQgZmluaXNoIGFuZAotCWNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIGZpZWxkcyB0bwotCWxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBzdHJ1Y3R1cmUuCi0JKiBsZGxhbmcuYzogQWRkIGNhbGxzIHRvIGVtdWxhdGlvbi1zcGVjaWZpYyByb3V0aW5lcy4KLQkobGFuZ19wcm9jZXNzKTogIEFkZCBjYWxsIHRvCi0JbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIGZ1bmN0aW9uLgotCShsYW5nX3Byb2Nlc3MpOiAgQWRkIGNhbGwgdG8gYSBlbXVsYXRpb24tc3BlY2lmaWMgcm91dGluZSAoYW5kCi0Jc29tZSBwcm9jZXNzaW5nIGFmdGVyIHRoZSBjYWxsKS4KLQotRnJpIE9jdCAyMiAyMDo1NDoxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogbWlwcyotIGluc3RlYWQgb2YgbWlwcy0sIG1pcHMqZWwgY2hhbmdlcwotCi1UdWUgT2N0IDE5IDE1OjQ2OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW9zZiopOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEubXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9hbHBoYS5vLgotCShlbV9hbHBoYS5jKTogTmV3IHRhcmdldDsgdXNlIGFscGhhLnNoIGFuZCBhbHBoYS5zYy4KLQkqIGNvbmZpZy9hbHBoYW9zZi5taCAoTkFUSVZFX0xJQl9ESVJTLCBIT1NUSU5HX0NSVDApOiBEZWZpbmUuCi0JKiBjb25maWcvYWxwaGEubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hbHBoYS5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogTmV3IGZpbGUuCi0KLUZyaSBPY3QgMTUgMDI6MjA6MDQgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucywgbGFuZ19jb21tb24pOiBBTElHTl9OIGNhbid0IGhhbmRsZQotCXR5cGVzIG9mIGRpZmZlcmVudCBzaXplcyAoZWc6IDY0IGFuZCAzMiBiaXRzKSwgc28gY29lcmNlLgotCSogbGQuaCAoQUxJR05fTik6IEFkZCB3YXJuaW5nIGFib3V0IHVzYWdlLgotCi1XZWQgT2N0IDEzIDE2OjAyOjM5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGVudGVyX2dsb2JhbF9yZWYpOiBKdXN0IGlnbm9yZSBhbnkgd2VhayBzeW1ib2wgZm9yCi0Jd2hpY2ggd2UgYWxyZWFkeSBoYXZlIGEgZGVmaW5pdGlvbiwgcmF0aGVyIHRoYW4gY2hlY2tpbmcgaW4KLQlzZXZlcmFsIGRpZmZlcmVudCBwbGFjZXMgd2hldGhlciB0aGUgc3ltYm9sIGlzIHdlYWsuCi0KLVR1ZSBPY3QgMTIgMTc6MzA6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lbGYqKTogTmV3IHRhcmdldDsgdXNlIG1pcHNiLWVsZjMyLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBPbmx5IHVzZSBPVEhFUl9SRUFET05MWV9TRUNUSU9OUyBhbmQKLQlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgaWYgcmVsb2NhdGluZy4gIFNoZWxsIHZhcmlhYmxlcyBhcmUgbm90Ci0JZXhwYW5kZWQgd2l0aGluIHRoZW0uCi0JKiBjb25maWcvbWlwc2ItZWxmMzIubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGVtX2VsZjMybWlwYi5jKTogTmV3IHRhcmdldC4KLQotVGh1IFNlcCAzMCAxNzowMDozNiAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55OiBJbiBpbnB1dF9saXN0LCBjaGFuZ2UgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSB0bwotCWxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtIHNvIG9iamVjdHMgYnJvdWdodCBpbiB1c2luZwotCUlOUFVUKCkgZG8gYSBwYXRoIGxvb2t1cC4KLQotVHVlIFNlcCAyOCAxMzozMToyMyAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEx5bnggbGRfdGFyZ2V0IHRvIGJlIHtpMzg2LG02OGt9LWx5bngKLQlpbnN0ZWFkIG9mIHtpMzg2LG02OGt9LWNvZmYuCi0JKiBNYWtlZmlsZS5pbiAoZW1faTM4Nmx5bnguYywgZW1fbTY4a2x5bnguYyk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlnL2kzODYtbHlueC5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvbTY4ay1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvaTM4Nmx5bnguc2g6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9tNjhrbHlueC5zaDogTmV3IGZpbGUuCi0KLQkqIHNjcmlwdHRlbXBsL2kzODZjb2ZmLnNjOiBNYWtlIEVOVFJZIGdldCBpdHMgdmFsdWUgZnJvbSAke0VOVFJZfSwKLQlidXQgZGVmYXVsdGluZyB0byBfc3RhcnQuCi0KLQkqIGxkZW11bC5jLCBsZGZpbGUuYywgbGRsYW5nLmMsIGxkbWFpbi5jLCBsZG1pc2MuYywgbGRtaXNjLmgsCi0JbGRzeW0uYywgbGR3YXJuLmM6IFJlbmFtZSBpbmZvIHRvIGluZm9fbXNnLCB0byBhdm9pZCBjb25mbGljdCB3aXRoCi0JTHlueE9TIGxpYmMuCi0KLVRodSBTZXAgMjMgMTQ6NTE6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc29sYXJpczIubWg6IE5ldyBmaWxlLiAgRGVmaW5lIEhPU1RJTkdfQ1JUMCBhbmQKLQlIT1NUSU5HX0xJQlMgZm9yIHRlc3RpbmcuCi0KLUZyaSBTZXAgMTcgMTc6NTI6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRmluaXNoIHVwIHN1cHBvcnQgZm9yIGkzODYtc3lzdjQgKHdpdGhvdXQgc2hhcmVkIGxpYnJhcmllcyk6Ci0JKiBsZC5oIChmbGFnX2lzX3dlYWspOiBEZWZpbmUuCi0JKiBsZGxhbmcuYyAocHJpbnRfc3ltYm9sKTogTWVudGlvbiB3aGV0aGVyIHN5bWJvbCBpcyB3ZWFrLgotCShwcmludF9pbnB1dF9zZWN0aW9uKTogUHJpbnQgd2VhayBzeW1ib2xzIGFzIGdsb2JhbHMuCi0JKiBsZG1haW4uYyAocmVmaXplKTogRG8gbm90IHplcm8gb3V0IEJTRl9XRUFLIGZsYWcuCi0JKGVudGVyX2dsb2JhbF9yZWYpOiBEbyBub3Qgd2FybiBpZiBhIHdlYWsgc3ltYm9sIHJlZGVmaW5lcyBhCi0JZ2xvYmFsIHN5bWJvbC4gIERvIG5vdCBsZXQgYSB3ZWFrIHN5bWJvbCByZWRlZmluZSBhIGNvbW1vbiBzeW1ib2wuCi0JKGVudGVyX2ZpbGVfc3ltYm9scyk6IFRyZWF0IHdlYWsgc3ltYm9scyBhcyBnbG9iYWwgc3ltYm9scy4KLQkoc3ViZmlsZV93YW50ZWRfcCk6IERvIG5vdCBwdWxsIGluIGFuIG9iamVjdCBmaWxlIGZyb20gYSBhcmNoaXZlCi0JanVzdCB0byByZXNvbHZlIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBEb24ndCBuZWVkbGVzc2x5IG1hbGxvYyBzcGFjZSBhZnRlciBhIGZhdGFsCi0JZXJyb3I7IHRoZSBlcnJvciBtaWdodCBiZSB0aGF0IG1hbGxvYyBoYXMgcnVuIG91dCBvZiBzcGFjZS4KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogVHJlYXQgd2VhayBzeW1ib2xzIGFzIGdsb2JhbC4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXN5c3Y0KiwgaVszNF04Ni0qLWVsZiopOiBOZXcgdGFyZ2V0czsKLQl1c2UgaTM4Ni1lbGYuCi0JKiBjb25maWcvaTM4NnY0Lm1oOiBOZXcgZmlsZTsgc2V0IE5BVElWRV9MSUJfRElSUyB0byAvdXNyL2Njcy9saWIuCi0JKiBjb25maWcvaTM4Ni1lbGYubXQ6IE5ldyBmaWxlOyBzZXQgRU1VTCB0byBlbGZfaTM4Ni4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgJHtOT1B9IGFzIGZpbGxlciAoZGVmYXVsdHMgdG8gMCkuCi0JKiBNYWtlZmlsZS5pbiAoTkFUSVZFX0xJQl9ESVJTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCShBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9lbGZfaTM4Ni5vLgotCShHRU5TQ1JJUFRTKTogUGFzcyBOQVRJVkVfTElCX0RJUlMgYXMgc2l4dGggYXJndW1lbnQuCi0JKGVtX2VsZl9pMzg2LmMpOiBOZXcgdGFyZ2V0LCBsaWtlIG90aGVyIGVtXyouYyB0YXJnZXRzLgotCSgkKExEX1BST0cpKTogUGFzcyAkKENGTEFHUykgdG8gJChDQykuCi0JKiBnZW5zY3JpcHRzLnNoOiBBY2NlcHQgTkFUSVZFX0xJQl9ESVJTIGFzIHNpeHRoIGFyZ3VtZW50LiAgSWYKLQlub25lbXB0eSwgYW5kIGNvbmZpZ3VyZWQgZm9yIG5hdGl2ZSwgYWRkIGl0IHRvIExJQl9QQVRILgotCi1GcmkgU2VwIDE3IDEzOjA3OjM5IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwve2g4MzAwLnNjLGg4NTAwLnNjLGkzODZjb2ZmLnNjLG02OGtjb2ZmLnNjLHNoLnNjfToKLQlBZGRlZCBzdGF0ZW1lbnRzIHRvIHBhc3Mgc3RhYiBhbmQgc3RhYnN0ciBzZWN0aW9ucyB0aHJvdWdoIGFuZAotCW1hcmsgdGhlbSBhcyBOT0xPQUQsIHdoaWNoIG1ha2VzIEdEQiBoYXBwaWVyLgotCi1XZWQgU2VwIDE1IDE2OjAyOjI5IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgbTY4ay1seW54LWx5bnhvcyBjb25maWcuCi0KLQkqIE1ha2VmaWxlLmluOiBVc2UgJChTSEVMTCkgdG8gcnVuIGdlbnNjcmlwdHMuc2guCi0KLVN1biBTZXAgMTIgMTY6MDQ6NDAgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvY29mZi1oODMwMC5tdDogQWRkIEVNVUw9aDgzMDBoLgotCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgc2V0X3NjcmlwdHNfZGlyIGFmdGVyIGFyZ3YgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCi1GcmkgU2VwIDEwIDA5OjM2OjI5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIENYWCBiYWNrIHRvIGcrKy4KLQotRnJpIFNlcCAxMCAwOTozNDoyOSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRml4ZWQgUlVOVEVTVCogQ1hYIENYWEZMQUdTIG1hY3JvcyBhbmQgY2hlY2sgcnVsZS4KLQotRnJpIFNlcCAxMCAwNzoyNjo1NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogVXNlIHNoZWxsIHdpbGRjYXJkcy4KLQotVHVlIFNlcCAgNyAxODowNDo1NCAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIGFkZCBURVhJTlBVVFMgdmFyaWFibGUgYW5kIHVzZSBpdCBpbiBsZC5kdmkgdGFyZ2V0Ci0KLUZyaSBTZXAgIDMgMTY6NDY6NDEgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogbGQudGV4aW5mbzogcmUtZW5hYmxlIGluY2x1ZGVkIGNvbmZpZyBmaWxlOyBjb25kaXRpb25hbGl6ZSBkb2MKLQlmb3IgLW9mb3JtYXQgdG8gaW50ZXJhY3QgcHJvcGVybHkgd2l0aCBTaW5nbGVGb3JtYXQgZG9jIGNvbmZpZwotCXZhcjsgcmVuYW1lIEB1cC9AZG93biB0byBAcmFpc2VzZWN0aW9ucy9AbG93ZXJzZWN0aW9ucy4KLQotV2VkIEF1ZyAyNSAxNjoyOTo1NiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG04ODExMC4KLQotVHVlIEF1ZyAyNCAxODo0OTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlGcm9tIFBldGVyIEhvb2dlbmJvb20gPGhvb2dlbkBzaGFmZXIuY3MudXRhaC5lZHU+OgotCSogZW11bHRlbXBsL2hwcGFvc2YuZW0gKGxkX2hwcGFvc2ZfZW11bGF0aW9uKTogQ29ycmVjdCBuYW1lIGZvciBQQQotCUVMRiBlbXVsYXRpb24gaXMgImVsZjMyLWhwcGEiIG5vdCAiZWxmLWJpZyIuCi0JKGhwcGFvc2ZfYmVmb3JlX3BhcnNlKTogUmVtb3ZlIHVubmVlZGVkIHByb2Nlc3Npbmcgb2YgZW52aXJvbm1lbnQKLQl2YXJpYWJsZXMuCi0JKiBzY3JpcHR0ZW1wbC9ocHBhb3NmLnNjOiBJbmNsdWRlIC5ocHBhX2xpbmtlcl9zdHVicyBzZWN0aW9ucyBpbgotCS50ZXh0IHNlZ21lbnQgb2Ygb3V0cHV0IGZpbGUuCi0JKiBlbXVscGFyYW1zL2hwcGFvc2Yuc2ggKE9VVFBVVF9GT1JNQVQpOiBVc2UgZWxmMzItaHBwYS4KLQotVHVlIEF1ZyAyNCAxNjoxNzowMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGxkLmg6IGRlZmluZSBCWVRFX1NJWkUsIFNIT1JUX1NJWkUsIGFuZCBMT05HX1NJWkUgd2hpY2ggYXJlIG5vCi0JICBsb25nZXIgaW4gYmZkLmguCi0KLQkqIGxkbGFuZy5jLCBsZC5oOiB1cGRhdGVkIGNvcHlyaWdodC4KLQotVHVlIEF1ZyAxNyAxNToyMjowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChvcGVuX291dHB1dCwgbGFuZ19jaGVjayk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9zZXRfYXJjaF9tYWNoLgotCi1UdWUgQXVnIDE3IDA3OjAyOjE5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4NTAwLnNjOiBTdGFydCBhbGwgc2VjdGlvbnMgaW4gYSBkaWZmZXJlbnQgc2VnbWVudC4KLQkqIHNjcmlwdHRlbXBsL3o4a3NpbS5zYzogSGFuZGxlIGNvbnN0cnVjdG9ycwotCi1UaHUgQXVnIDEyIDE2OjA1OjM3IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogcmV2ZXJ0IGVhcmxpZXIgY2hhbmdlcyBiYWNrIHRvIGV4ZWN1dGUgcnVudGVzdAotICAgICAgICAgIHdpdGggbWFrZSBjaGVjay4gY2R0ZXN0IGFuZCBib290c3RyYXAgbm93IGZ1bmN0aW9uIGFzIHRoZXkKLQkgIGRpZCB3aXRoaW4gdGhlIE1ha2VmaWxlLgotCi1UaHUgQXVnIDEyIDEwOjIwOjA1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IAlVcGRhdGUgZGVwZW5kZW5jaWVzLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBFTVVMQVRJT05fT0ZJTEVTIGluIE1ha2VmaWxlIGJhc2VkIG9uCi0JLS13aXRoLXRhcmdldHMgb3B0aW9uLgotCi1UaHUgQXVnIDEyIDA4OjUyOjI5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGVjayB0YXJnZXRzIHJlaW1wbGVtZW50ZWQgdG8gb2xkIHdheS4KLQotV2VkIEF1ZyAxMSAwODoyNjoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2di5taCwgY29uZmlnL2lyaXg0Lm1oOiBVc2UgZ2NjCi0JLXByaW50LWxpYmdjYy1maWxlLW5hbWUgcmF0aGVyIHRoYW4gJChsaWJkaXIpL2xpYmdjYy5hLgotCSogY29uZmlnL2kzODZzY28ubWg6IE5ldyBmaWxlOyBjb3B5IG9mIGkzODZ2Lm1oIHRvIGNvcnJlc3BvbmQgdG8KLQliZmQvY29uZmlndXJlLmhvc3QgY2hhbmdlLgotCi1Nb24gQXVnICA5IDE0OjI1OjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBIYW5kbGUgLmxpbmUgYW5kIC5kZWJ1Zyogc2VjdGlvbnMuCi0KLQkqIGxkbGV4Lmw6IFVzZSBiZmRfc2Nhbl92bWEsIG5vdCBzdHJ0b3VsLgotCi1GcmkgQXVnICA2IDA4OjU3OjM5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYywgbGRmaWxlLmMsIGxkbGFuZy5jLCBsZXhzdXAuYywgbGRtYWluLmMsIGxkZW11bC5jOgotCVJlbW92ZSBpbml0YWwgY2FwcyBpbiBzb21lIGVycm9yIG1lc3NhZ2VzLCBjaGFuZ2UgImNhbid0IiB0bwotCSJjYW5ub3QiLCBhZGQgbWlzc2luZyBjb2xvbnMuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogUHJpbnQgIiUlIiBhcyBhIHNpbmdsZSAlLgotCUZvciAnJScgZm9sbG93ZWQgYnkgdW5yZWNvZ25pemVkIGNoYXJhY3RlciwgcHJpbnQgdGhlbSBib3RoCi0JdmVyYmF0aW0gaW5zdGVhZCBvZiBleHBlY3RpbmcgYSBjaGFyICogYXJnLgotCUZvciAnJUMnLCBkb24ndCBwdXQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gcGFyZW5zLgotCi0JKiBsZGV4cC5jIChpbnZhbGlkKTogUGFzcyAiJSUiLCBub3QgIiUgIi4KLQotRnJpIEF1ZyAgNiAxNDozMToyMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IEFsd2F5cyBkZWZpbmUgX2Z0ZXh0LCBfZmRhdGEsIF9mYnNzLgotCShCU1NfVkFSKTogUmVtb3ZlZDsgbm93IGFsd2F5cyBkZWZpbmUgX2Zic3MuCi0JKiBlbXVscGFyYW1zL21pcHNpZHQuc2gsIGVtdWxwYXJhbXMvbWlwc2lkdGwuc2ggKEJTU19WQVIpOgotCVJlbW92ZWQuCi0KLVRodSBBdWcgIDUgMTU6NTU6MTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHo4ay1jb2ZmIGlzIHRoZSBzYW1lIGFzIHo4ay1zaW0KLQotV2VkIEF1ZyAgNCAyMTowMDoxOCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiB0ZXN0c3VpdGUvbGliL2xkLmV4cDogbmV3IGZpbGUKLQkqIHRlc3RzdWl0ZS9jb25maWcvdW5peC1sZC5leHA6IG5ldyBmaWxlCi0JKiB0ZXN0c3VpdGUvbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IG5ldyBmaWxlCi0JKiBNYWtlZmlsZS5pbjogYWRkIGRlamFnbnUgc3VwcG9ydCBmb3IgbWFrZSBjaGVjawotCi1XZWQgQXVnICA0IDE3OjUyOjMyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCAoY29tbWVudCk6IEFkZCBtaXNzaW5nIG5ld2xpbmUgaW4gbWVzc2FnZS4KLQkqIGxkaW5kci5jIChhZGRfaW5kaXJlY3QpOiBEaXR0by4KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBEaXR0by4KLQotVHVlIEF1ZyAgMyAxMDo1Nzo0MSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55LCBsZGxleC5sLCBtcmkuYywgbGR3cml0ZS5jOiBDaGFuZ2UgbXVsdGlwbGUgY29tbW9ucwotCWludG8gZXh0ZXJucy4KLQotCSogbGRtaXNjLmMgKG11bHRpcGxlX3dhcm4pOiBOZXcgZnVuY3Rpb24uCi0JKiBsZG1pc2MuaDogRGVjbGFyZSBpdC4KLQkqIGxkbWFpbi5jIChlbnRlcl9nbG9iYWxfcmVmKTogQ2FsbCBpdC4KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIHdhcm5fY29tbW9uLgotCSogbGRsZXgubCwgbGRncmFtLnk6IFNldCBpdCB3aXRoIC13YXJuLWNvbW1vbiBvcHRpb24uCi0JKiBsZHZlci5jIChoZWxwKTogRG9jdW1lbnQgaXQuCi0KLU1vbiBBdWcgIDIgMTI6MDQ6MzYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBob29rcyBmb3IgLnNkYXRhLCAuc2JzcywgYW5kCi0JdGFyZ2V0LXNwZWNpZmljIHNlY3Rpb25zLCBhbmQgZm9yIGNoYW5naW5nIGRhdGEgc2VjdGlvbiB2bWEuCi0KLU1vbiBKdWwgMjYgMTQ6MDA6MDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55IChPUFRJT05fUXksIE9QVElPTl9ZLCBPUFRJT05fZG4sIE9QVElPTl9ZUCk6IE5ldwotCXRlcm1pbmFscywgZm9yIFNvbGFyaXMuCi0JKGRpcmxpc3RfcHRyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBuZXcgb3B0aW9ucy4KLQotCSogbGRsZXgubDogQWNjZXB0IGNvbW1hbmQtbGluZSBvcHRpb25zICItUXkiLCAiLWRuIiwgIi1ZIiwgYW5kCi0JIi1ZUCwuLi4iLgotCi0JKiBjb25maWcvc3VuNHNvbDIubXQ6IFBhc3MgZW11bGF0aW9uIG5hbWUgd2l0aG91dCAiLnNoIi4KLQotCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5jOiBSZW5hbWVkIGZyb20gZWxmMzItc3BhcmMuYy4KLQkqIGNvbmZpZy9zdW40c29sMi5tdCAoZW1fZWxmMzJfc3BhcmMuYyk6IEFkanVzdGVkIGFjY29yZGluZ2x5LgotCi1GcmkgSnVsIDIzIDEzOjUxOjA5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgc3VwcG9ydCBmb3IgLmluaXQsIC5maW5pLCAuY3RvcnMsCi0JLmR0b3JzLCAuZGF0YTEsIC5yb2RhdGExIHNlY3Rpb25zLCBpbnN0ZWFkIG9mIGNvbWJpbmluZyB0aGVtIGludG8KLQlvdGhlciBzZWN0aW9ucy4gIEZvciBgLXInLCBzZXQgYWxsIHNlY3Rpb24gc3RhcnQgYWRkcmVzc2VzIHRvCi0JemVyby4KLQotCSogZW11bHBhcmFtcy9lbGYzMi1zcGFyYy5zaCAoVEVYVF9TVEFSVF9BRERSLAotCU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IFZhbHVlIHNob3VsZCBiZSAweDEwMTAwLgotCShNQVhQQUdFU0laRSk6IFJlbmFtZWQgZnJvbSBQQUdFX1NJWkUuCi0KLVdlZCBKdWwgMjEgMTQ6Mjg6NDIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZW5zY3JpcHRzLnNoOiBJZiB0aGlzIGlzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiwgc2V0Ci0JQ09NUElMRV9JTi4KLQkqIGVtdWx0ZW1wbC8qLmVtOiBVc2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY29tcGlsZSBpbiB0aGUKLQlzY3JpcHRzLgotCi0JKiBNYWtlZmlsZS5pbiAoR0VOU0NSSVBUUyk6IFBhc3MgdGhlIGRlZmF1bHQgZW11bGF0aW9uIG5hbWUgdG8KLQlnZW5zY3JpcHRzLnNoLiAgUGFzcyB0aGUgY3VycmVudCBlbXVsYXRpb24gbmFtZSB3aXRob3V0ICIuc2giIG9uCi0JdGhlIGVuZC4KLQkqIGdlbnNjcmlwdHMuc2g6IFRha2UgYW4gZGVmYXVsdCBlbXVsYXRpb24gYXJnLgotCVVzZSB0aGUgY3VycmVudCBlbXVsYXRpb24gbmFtZSBhcyBFTVVMQVRJT05fTkFNRS4KLQlNYWtlIGRlZmF1bHQgbGliIHBhdGggZm9yIGNyb3NzLWNvbXBpbGluZyAnOicsIG5vdCBudWxsLgotCSogZW11bHBhcmFtcy8qLnNoOiBEb24ndCBzZXQgRU1VTEFUSU9OX05BTUUuCi0JKiBsZGVtdWwuYyAobGRlbXVsX2dldF9zY3JpcHQpOiBUYWtlIGlzZmlsZSBhcmcuCi0JUGFzcyBpdCB0byBlbXVsYXRpb24ncyBnZXRfc2NyaXB0IGZ1bmN0aW9uLgotCSogbGRlbXVsLmg6IEFkanVzdCBnZXRfc2NyaXB0IHByb3RvdHlwZXMuCi0JKiBsZGZpbGUuYyAobGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKTogUmVuYW1lZCBmcm9tIGZpbmRfYV9uYW1lLgotCU5vIGxvbmdlciBzdGF0aWMuCi0JKiBsZGZpbGUuaDogRGVjbGFyZSBpdC4KLQkqIGxkZ3JhbS55OiBBY2NlcHQgYSBzY3JpcHQgb24gdGhlIGNvbW1hbmQgbGluZSBhZ2FpbiwKLQlmb3IgcGFyc2luZyBjb21waWxlZC1pbiBzY3JpcHRzLgotCSogbGRtYWluLmMgKG1haW4pOiBJZiBsZCBzY3JpcHQgaXMgYSBmaWxlLCBwYXJzZSBpdCBhcyBhIC1UCi0Jb3B0aW9uLCBvdGhlcndpc2UgcGFyc2UgaXQgZGlyZWN0bHkuCi0JKiBlbXVsdGVtcGwvKi5lbSAoKmdldF9zY3JpcHQpOiBSZXR1cm4gdGhlIHNjcmlwdHMgdGhlbXNlbHZlcyBpZgotCXRoaXMgaXMgdGhlIGRlZmF1bHQgZW11bGF0aW9uOyBvdGhlcndpc2UgcmV0dXJuIHRoZWlyIGZpbGUgbmFtZXMuCi0JKiBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogTmV3IGZpbGUsIHRvIHRha2UgbTg4a2JjcyAjaWZkZWYgb3V0IG9mCi0JZ2VuZXJpYy5lbS4KLQkqIGVtdWxwYXJhbXMvbTg4a2Jjcy5zaDogVXNlIGl0LgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZTo6dW5peF9yZWxvY2F0ZSk6IFJlbW92ZSB1bnVzZWQgZWxlbWVudC4KLQotVHVlIEp1bCAyMCAxMjowMTo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IERlbGV0ZSBlbV9pMzg2bGludXgubyAoZm9yIHdoaWNoCi0JdGhlcmUncyBubyBjaGFuZ2UgbG9nIGVudHJ5IHlldCwgdHNrIHRzaykgZnJvbSB0aGUgbGlzdCBvZgotCWVtdWxhdGlvbnMgY29tcGlsZWQgaW4gdW50aWwgTWFyayBnZXRzIGFyb3VuZCB0byBjaGVja2luZyBpbgotCWVtdWxwYXJhbXMvaTM4NmxpbnV4LnNoLgotCShsZGVtdWwtbGlzdC5oKTogRGVwZW5kIG9uIE1ha2VmaWxlLCBzbyBpZiBFTVVMQVRJT05fT0ZJTEVTIGlzCi0JY2hhbmdlZCwgdGhpcyBmaWxlIGdldHMgdXBkYXRlZC4KLQotRnJpIEp1bCAxNiAxNDoxNDozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55IChPUFRJT05fTGZpbGUpOiBOZXcgdG9rZW4uCi0JKGNvbW1hbmRfbGluZV9vcHRpb24pOiBBY2NlcHQgT1BUSU9OX0wgTkFNRSAod2hpdGVzcGFjZSBhZnRlciAtTCkuCi0JKiBsZGxleC5sICg8Q09NTUFORD4pOiBBY2NlcHQgLUwgd2l0aG91dCBGSUxFTkFNRS4KLQotRnJpIEp1bCAxNiAxMzo0NDoyNiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGg4LzMwMGggc3VwcG9ydCBuZWVkcyBvd24gLm10IGZpbGUuCi0JY29uZmlnL2NvZmYtaDgzMDBoLm10OiBOZXcgZmlsZS4KLQotVGh1IEp1bCAxNSAxMjo0NDozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jOiBEb24ndCBpbmNsdWRlIHN5cy9zdGF0Lmg7IGl0IGFscmVhZHkgZ290IGluY2x1ZGVkCi0Jc29tZXdoZXJlIGFsb25nIHRoZSB3YXkuCi0KLVRodSBKdWwgMTUgMTQ6NDM6MzQgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBoODMwMGggc3VwcG9ydC4KLQllbXVscGFyYW1zL2g4MzAwaC5zaDogTmV3IGZpbGUuCi0Jc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBOZXcgZmlsZS4KLQotVGh1IEp1bCAxNSAxMjo0NDozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9maWxlKTogSW4gZXJyb3IgbWVzc2FnZSwgdXNlIHRoZSBuYW1lIHRoZQotCXVzZXIgZ2F2ZSAoZS5nLiwgIi1sYyIpLCByYXRoZXIgdGhhbiB0aGUgYmFzZSBmaWxlIG5hbWUuCi0KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBEb24ndCBhc3NpZ24gYW4gaW50IHRvIGFuIGVudW0uCi0KLQkqIGxkbWFpbi5bY2hdOiBSZW1vdmUgaW5pdGlhbCBRXyBmcm9tIGZ1bmN0aW9uIG5hbWVzLgotCSogbGRleHAuYywgbGRpbmRyLmMsIGxkbGFuZy5jOiBDaGFuZ2UgY2FsbGVycy4KLQotCSogbGRmaWxlLmMsIGxkbWFpbi5jLCBsZGdyYW0ueTogUmVuYW1lIG9wdGlvbl92IHRvIHRyYWNlX2ZpbGVfdHJpZXMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBNb3ZlIGxvYWRpbmcgb2YgZGVmYXVsdCBzY3JpcHQgZnJvbQotCWhlcmUgdG8gbWFpbi4gIEFkZCBhICIvIiB0byBzdGFydCBvZiBzY3JpcHQgbmFtZSB0byBwcmV2ZW50Ci0JZmluZGluZyBpdCBpbiAiLiIgZmlyc3QuCi0KLQkqIGxkbWFpbi5jIChzZXRfc2NyaXB0c19kaXIpOiBEb24ndCBsb29rIGluICIuIiBmaXJzdC4KLQotCSogbGRncmFtLnksIGxkbGFuZy5jLCBsZHN5bS5jOiBSZW1vdmUgdHJhY2VzIG9mIHVudXNlZCB2YXIKLQlvcHRpb25fbG9uZ21hcC4KLQotVGh1IEp1bCAxNSAxMDo1NTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbV9tODhrYmNzLmMpOiBDb3JyZWN0IGRlcGVuZGVuY3kuCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjOiBJdCdzIEFSQ0gsIG5vdCBhcmNoLiAgUmVtb3ZlZCBUQVJHRVQKLQlzdGF0ZW1lbnQuICBDaGFuZ2VkIE9VVFBVVF9GT1JNQVQgdG8gdXNlICR7T1VUUFVUX0ZPUk1BVH0uCi0JKiBlbXVscGFyYW1zL204OGtiY3Muc2g6IEl0J3MgY29mZi1tODhrYmNzLCBub3QgbTg4a2Jjcy4KLQotV2VkIEp1bCAxNCAyMTo0Mjo1MyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jIChsZGxhbmdfb3Blbl9maWxlLCBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUpLAotCW1haW4uYyAobWFpbik6IFByaW50IHRoZSBlcnJubyBzdHJpbmcgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0KLVR1ZSBKdWwgMTMgMjA6MDA6MzAgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgaDgzMDBoIGZvciB0YXJnZXQgY3B1LgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogSGF2ZSBkZW1hbmdsZSByZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlIGlmCi0JcHJlc2VudCAoZGVtYW5nbGUgaXMgc21hcnQgZW5vdWdoIHRvIGtub3cgd2hldGhlciB0byBkbyBpdCBvciBub3QpLgotCi1Nb24gSnVsIDEyIDExOjQ1OjQ4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHNldF9zY3JpcHRzX2Rpcik6IENoZWNrIC4gYW5kIDxsZCBiaW4gZGlyPi8uLi9saWIgZm9yCi0JbGRzY3JpcHRzLCBhcyB3ZWxsIGFzIDxsZCBiaW4gZGlyPiBhbmQgU0NSSVBURElSLgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogVXNlIHNpemVvZiBpbnN0ZWFkIG9mIG1hZ2ljIGNvbnN0YW50LgotCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbiwgY2hlY2tfZm9yX3NjcmlwdHNfZGlyLAotCXNldF9zY3JpcHRzX2Rpcik6ICBOZXcgZnVuY3Rpb25zLgotCShtYWluKTogQ2FsbCB0aGVtLgotCi1Nb24gSnVsIDEyIDEwOjU3OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEluY2x1ZGUgLmluaXQsIC5maW5pLCAucm9kYXRhIHNlY3Rpb25zLgotCUNyZWF0ZSBzeW1ib2wgImVuZCIgaW5zdGVhZCBvZiAiX19lbmQiLiAgQ29tbWVudCBvdXQgc29tZSBwYXJ0cwotCXRoYXQgbWF5IG5vdCBiZSBuZWVkZWQgKHlldCkgZm9yIGVsZi4KLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgc3BhcmMtZWxmIGFuZCBzcGFyYy1zb2xhcmlzMiBjb25maWdzLgotCi1UaHUgSnVsICA4IDE1OjMzOjMyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSW5jbHVkZSAkKE9USEVSX0VNVUxBVElPTlMpLgotCi0JKiBsZG1pc2MuaCAoZWluZm8sIG1pbmZvLCBpbmZvKTogRG9uJ3QgYm90aGVyIHdpdGggUEFSQU1TIG1hY3JvCi0Jd2hlbiBubyBwcm90b3R5cGUgaXMgYmVpbmcgc3VwcGxpZWQuCi0JKGxkbWFsbG9jLCBsZHJlYWxsb2MpOiBTaXplIGFyZ3VtZW50IGlzIG5vdyBzaXplX3QuCi0KLQkqIGxkbWlzYy5jIChmaW5mbyk6IE5ldyBmdW5jdGlvbiwgYWNjZXB0cyBGSUxFKiBhcmd1bWVudC4KLQkodmZpbmZvLCBjYXNlICd2Jyk6IE5ldyBmb3JtYXQgY2hhcmFjdGVyOyBkaXNwbGF5cyBiZmRfdm1hIGluIGhleAotCXdpdGhvdXQgbGVhZGluZyB6ZXJvcy4KLQkodmZpbmZvLCBjYXNlcyAnUicgYW5kICdDJyk6IFVzZSBmaW5mbygldikgd2hlbiBkaXNwbGF5aW5nIGEKLQliZmRfdm1hIHZhbHVlLCBpbnN0ZWFkIG9mIGZwcmludGYoJXgpIHdoaWNoIHdvbid0IGhvbGQgYSBsb25nIGxvbmcKLQl2YWx1ZS4KLQkoY29uY2F0LCBidXlzdHJpbmcpOiBTdHJpbmcgbGVuZ3RocyBhcmUgc2l6ZV90LgotCShsZG1hbGxvYywgbGRyZWFsbG9jLCB4cmVhbGxvYyk6IFNpemUgYXJndW1lbnQgaXMgbm93IHNpemVfdC4KLQotCSogbGRsYW5nLmMgKG5ld19zdGF0ZW1lbnQpOiBTaXplIGFyZ3VtZW50IGlzIG5vdyBzaXplX3QuICBBZGRlZAotCWZvcndhcmQgZGVjbGFyYXRpb24gd2l0aCBwcm90b3R5cGUuCi0KLVRodSBKdWwgIDggMTA6NTM6NDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSAoT1BUSU9OX3YpOiBEb24ndCB0dXJuIG9uIHZlcmJvc2Ugb3V0cHV0LgotCi1XZWQgSnVsICA3IDE3OjEwOjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogR2V0IHJpZCBvZiBsb2NhbCB0eXBlZGVmIGZvciBiZmRfdm1hISAgR2V0IGl0IGZyb20KLQliZmQuaCBpbnN0ZWFkLgotCi1XZWQgSnVsICA3IDExOjMzOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIGFzICQodG9vbGRpcikvYmluL2dsZDsKLQljb2xsZWN0MiBkb2Vzbid0IGxvb2sgZm9yIGdsZCBhbnkgbW9yZSBhbnlob3cuCi0KLU1vbiBKdWwgIDUgMTQ6Mjk6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19yZWxvY2F0ZV9nbG9iYWxzKTogU2tpcCBpbmRpcmVjdCBzeW1ib2xzLCB3aGljaAotCW5vdyBoYXZlIGEgbm9uIE5VTEwgc3JlZnNfY2hhaW4uCi0KLQkqIGNvbmZpZy9ocDMwMGhwdXgubXQ6IFVzZSBlbXVsYXRpb24gaHAzaHB1eCByYXRoZXIgdGhhbgotCWhwMzAwaHB1eCwgc2luY2UgdGhlIGxhdHRlciBkb2VzIG5vdCBleGlzdC4KLQotRnJpIEp1bCAgMiAxODowNjowNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdlbnNjcmlwdHMuc2g6IFB1dCB0aGUgc2NyaXB0cyBpbiB0aGUgbGRzY3JpcHRzIGRpcmVjdG9yeSwgbm90Ci0JZW11bGF0aW9ucy4KLQkqIGNvbmZpZ3VyZS5pbiAobGRzY3JpcHRzKTogTWFrZSwgaW5zdGVhZCBvZiBlbXVsYXRpb25zLgotCSogTWFrZWZpbGUuaW4gKHNjcmlwdGRpcik6IFRha2Ugb2ZmIHRoZSAibGQiIHBhcnQuCi0JKGluc3RhbGwsIGNsZWFuLCBkaXN0Y2xlYW4pOiBVc2UgbGRzY3JpcHRzLCBub3QgZW11bGF0aW9ucy4KLQlJbiB0ZXN0cywgZG9uJ3QgcGFzcyAtTGVtdWxhdGlvbnMuCi0JRG9uJ3QgcGFzcyB0b29sZGlyL2xpYiB0byBnZW5zY3JpcHRzLnNoLgotCSogZ2Vuc2NyaXB0cy5zaDogRG9uJ3QgdGFrZSB0b29sZGlyL2xpYiBhcmcuCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQWRkICJsZHNjcmlwdHMvIiB0byB0aGUgbmFtZSBvZiB0aGUKLQlkZWZhdWx0IHNjcmlwdCBmaWxlLgotCi1GcmkgSnVsICAyIDE3OjEzOjM1IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBBZGQgLnRvcnMgc2VjdGlvbiBmb3IgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcnMuCi0KLVRodSBKdWwgIDEgMTY6Mzg6NDUgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2NvZmYtaDgzMDAubXQ6IEVNVUw9aDgzMDBobXMgLT4gaDgzMDAuCi0KLVdlZCBKdW4gMzAgMTU6NDU6NTUgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoLnkuYyk6IHNraXAgZGVmYXVsdCAueS5jIHJ1bGVzLiBnbnUgbWFrZSBjYW4gbm93Ci0JICBydW4gaW4gcGFyYWxsZWwgd2l0aG91dCBjb2xsaWRpbmcgb24geWFjYydzIHN0YXRpYyBmaWxlIG5hbWVzLgotCSAgV2l0aG91dCB0aGUgc3R1YiBydWxlLCBtYWtlIHdpbGwgdHJ5IHRvIHN0YXJ0IHR3byB5YWNjJ3MKLQkgIGNvbmN1cnJlbnRseSB3aGljaCBmYWlscyBiZWNhdXNlIG9mIHlhY2MncyBzdGF0aWMgZmlsZSBuYW1lcy4KLQotVHVlIEp1biAyOSAxMjoyMDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChzdWJmaWxlX3dhbnRlZF9wKTogRG9uJ3QgZHVtcCBjb3JlIGlmIHRoZXJlIGFyZSBubwotCXN5bWJvbHMuCi0KLU1vbiBKdW4gMjggMTI6MjI6MTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZW5zY3JpcHRzLnNoIChMSUJfUEFUSCk6IE9ubHkgYWRkIC91c3IvbG9jYWwvbGliIGlmIGl0J3MKLQlkaWZmZXJlbnQgZnJvbSBsaWJkaXIuCi0KLQkqIE1ha2VmaWxlLmluIChzY3JpcHRkaXIpOiBCYXNlIG9uIHRvb2xkaXIsIG5vdCBkYXRhZGlyLgotCi1TYXQgSnVuIDI2IDEyOjAzOjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAoaGVscCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkdmVyLmg6IERlY2xhcmUgaXQuCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogUmVjb2duaXplIG5ldyBvcHRpb25zIC0taGVscCBhbmQgLS12ZXJzaW9uLgotCi1Nb24gSnVuIDIxIDIwOjM5OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBEb24ndCBuZWVkIC4uL2luY2x1ZGUgYW55IG1vcmUuCi0KLU1vbiBKdW4gMjEgMTY6Mzg6MzUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogU3VwcG9ydCBuZXcgLW9mb3JtYXQgb3B0aW9uLgotCVJlbW92ZSBhdHRlbXB0IGF0IHN1cHBvcnRpbmcgc2NyaXB0IGZyYWdtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLgotCSogbGRsYW5nLmMgKGxhbmdfYWRkX291dHB1dF9mb3JtYXQpOiBUYWtlIG5ldyBhcmcsIEZST01fU0NSSVBULgotCSogbXJpLmMgKG1yaV9mb3JtYXQpLCBsZGdyYW0ueTogQ2hhbmdlIGNhbGxlcnMuCi0JKiBsZGxhbmcuaDogQ2hhbmdlIHByb3RvdHlwZS4KLQotVGh1IEp1biAxNyAxNjo1Mzo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2Fub25pY2FsaXplIGluc3RhbGwuc2g7IGZvciB1c2Ugd2l0aGluCi0JdGhpcyBkaXJlY3RvcnkgKGFuZCBzdWJkaXJzKQotCi1UaHUgSnVuIDE3IDE0OjMzOjA5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IFR3ZWFrIGdyYW1tYXIgdG8gbWFrZSByZXBvcnRpbmcgb2YgaW52YWxpZCBvcHRpb25zIHdvcmsuCi0KLQkqIE1ha2VmaWxlLmluICguY2Mubyk6IFJlc3RvcmUgLlNVRkZJWEVTIGVudHJ5IGZvciAuY2MKLQlhbmQgLmNjLm8gcnVsZS4KLQotV2VkIEp1biAxNiAxMTo0NTozMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9jb21tYW5kKTogRG9uJ3QgdHJ5IC5sZCBleHRlbnNpb24uCi0JSXQgd2Fzbid0IGRvY3VtZW50ZWQgKG9yIGxpa2VseSB1c2VkKSBhbmQgd2FzdGVzIHRpbWUuCi0JKHRyeV9vcGVuKTogSWYgRVhURU4gaXMgZW1wdHksIGRvbid0IHRyeSBpdC4KLQotCSogbGRjdG9yLmMsIGxkZXJyb3IuYywgbGRleHAuYywgbGRmaWxlLmMsIGxkaW5kci5jLCBsZGxhbmcuYywKLQlsZGxleC5sLCBsZG1haW4uYywgbGRtaXNjLmMsIGxkc3ltLmMsIGxkdmVyLmMsIGxkd2Fybi5jLAotCWxkd3JpdGUuYywgbGV4c3VwLmMsIG1yaS5jLCByZWxheC5jOiBSZXBsYWNlIERFRlVOIG1hY3JvIGNhbGxzCi0Jd2l0aCBub3JtYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCi0JKiBNb3ZlICouZW0gdG8gZW11bHRlbXBsLyouZW0uICBNb3ZlICouc2ggdG8gZW11bHBhcmFtcy8qLnNoLgotCU1vdmUgKi5zYy1zaCB0byBzY3JpcHR0ZW1wbC8qLnNjLgotCSoge2VtdWx0ZW1wbCxlbXVscGFyYW1zLHNjcmlwdHRlbXBsfS9SRUFETUU6IE5ldyBmaWxlcy4KLQkqIHNoLmVtLCBzdDIwMDAuZW0sIHo4a3NpbS5lbSwgaDgzMDBobXMuZW0sIGg4NTAwaG1zLmVtOiBGaWxlcwotCXJlbW92ZWQsIHJlcGxhY2VkIHdpdGggZ2VuZXJpYy5lbS4KLQkqIGg4MzAwLnNoLCBoODUwMC5zaCwgaDgzMDAuc2MsIGg4NTAwLnNjOiBSZW5hbWVkIGZyb20KLQkgaDhbMzVdMDBobXMuc1tjaF0uICBDaGFuZ2UgdGhlaXIgY29udGVudHMgdG8gb21pdCB0aGUgImhtcyIuCi0KLQkqICouZW0gKCpfZ2V0X3NjcmlwdCk6IFJldHVybiBzY3JpcHQgbmFtZSBpbnN0ZWFkIG9mIHNjcmlwdCBjb250ZW50cy4KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDaGFuZ2UgY2FsbGVyLgotCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogUmVjb2duaXplIC1tIG9wdGlvbi4KLQlDaGVjayBmb3IgaW5wdXQgZmlsZXMgYWZ0ZXIgKmFsbCogb3B0aW9ucyBpbiBncmFtbWFyLgotCSogbGRtYWluLmMgKG1haW4pOiBDaGVjayBmb3IgLW0gb3B0aW9ucy4gIEFkZCBkZWZhdWx0IGRpcmVjdG9yeQotCWZvciAtbS4KLQotCSogbWtzY3JpcHQuYzogRmlsZSByZW1vdmVkLgotCSogZ2Vuc2NyaXB0cy5zaDogVGFrZSB0d28gbW9yZSBwYXJhbWV0ZXJzLCB0b29sZGlybGliIGFuZCBsaWJkaXIsCi0JdG8gYWRkIHRvIHRoZSBkZWZhdWx0IExJQl9QQVRILgotCUxvb2sgZm9yIGlucHV0IGZpbGVzIGluIHRoZSBuZXcgc3ViZGlyZWN0b3JpZXMuCi0JQ3JlYXRlIHRoZSBzY3JpcHRzIGluIGVtdWxhdGlvbnMgc3ViZGlyZWN0b3J5IGFuZCBkb24ndCBmaWx0ZXIKLQl0aGVtIHRocm91Z2ggbWtzY3JpcHQuCi0JKiBjb25maWd1cmUuaW46IE1ha2UgdGhlIGVtdWxhdGlvbnMgc3ViZGlyZWN0b3J5LgotCi0JKiBNYWtlZmlsZS5pbjogQWNjb3VudCBmb3IgYWxsIG9mIHRoZSBhYm92ZSBjaGFuZ2VzLgotCVJlbW92ZSB1bnVzZWQgLlNVRkZJWEVTLiAgR2V0IGxpYmdjYy5hIHBhdGggd2l0aCBnY2MKLQktcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSBpbnN0ZWFkIG9mICQobGliZGlyKS9saWJnY2MuYS4KLQlQdXQgQ0ZMQUdTIGxhc3QgaW4gdGhlIGNvbXBpbGF0aW9uIHJ1bGVzLgotCUFkZCAtSS4uL2JmZCB0byBJTkNMVURFUyBzbyBzeXNkZXAuaCBpcyBmb3VuZC4KLQotVHVlIEp1biAxNSAyMzowNDo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IExvb2sgaW4gLi4vaW5jbHVkZSwgbm90IC4uL2JmZC4KLQotCSogYW91dC5zYy1zaDogQWRkIFNITElCX1BBVEggbGlrZSBTVEFDS1pFUk8uICBNYWtlIFNUQUNLWkVSTwotCWRlcGVuZGVudCBvbiBSRUxPQ0FUSU5HLCBub3QgUkVMT0NBVElPTi4KLQkqIGhwM2hwdXguc2ggKFNITElCX1BBVEgpOiBEZWZpbmUgaXQuCi0KLU1vbiBKdW4gMTQgMTk6MDY6MTUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGZpbGUuYyAodHJ5X29wZW4pOiBJZiBvcGVuaW5nIHdpdGhvdXQgdGhlIGV4dGVuc2lvbiBmYWlscywKLQl0cnkgd2l0aCB0aGUgZXh0ZW5zaW9uIGV2ZW4gaWYgLXYgb3IgLVYgd2FzIGdpdmVuLgotCWhhZF9zY3JpcHQgaXMgaW1wb3J0ZWQgKGZyb20gbGRncmFtLnkpLCBub3QgZXhwb3J0ZWQuCi0KLU1vbiBKdW4gMTQgMTY6MjY6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0LCB1c2UgSU5TVEFMTF9YRk9STQotCi1UaHUgSnVuIDEwIDE0OjAwOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERvbid0IGxvc2UgdGhlIG9sZCBmbGFnIGJpdHMuCi0JKiBsZGdyYW0ueSAoc3RhdGVtZW50X2xpc3Rfb3B0KTogTmV3IG5vbnRlcm1pbmFsLCBlaXRoZXIgZW1wdHkgb3IKLQlzdGF0ZW1lbnRfbGlzdC4KLQkoc2VjdGlvbik6IFVzZSBzdGF0ZW1lbnRfbGlzdF9vcHQsIG5vdCBzdGF0ZW1lbnRfbGlzdC4KLQkqIG02OGtjb2ZmLnNjLXNoOiBHYXRoZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQgZGVmaW5lCi0JX19DVE9SX0xJU1RfXyBhbmQgX19EVE9SX0xJU1RfXyBhcHByb3ByaWF0ZWx5LgotCSogc2EyOTIwMC5zYy1zaDogR2F0aGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kIGRlZmluZQotCV9fX0NUT1JfTElTVF9fIGFuZCBfX19EVE9SX0xJU1RfXyBhcHByb3ByaWF0ZWx5LgotCi1Nb24gSnVuICA3IDEyOjUzOjI4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogIEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgotCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KLQotRnJpIEp1biAgNCAxNjoxODoyNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgaW5zdGFsbDphbGwgYW5kIGluc3RhbGwtaW5mbzppbmZvCi0JZGVwZW5kZW5jaWVzICh0aGVzZSBjYXVzZSBzb21lIHNwdXJpb3VzIHJlYnVpbGRzIGF0ICdtYWtlIGluc3RhbGwnCi0gICAgICAgIHRpbWUpCi0KLUZyaSBKdW4gIDQgMDg6NTA6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtaWR0LWVjb2ZmbCopOiBOZXcgdGFyZ2V0OyB1c2UgbWlwcy1pZHRsLgotCShtaXBzLWlkdC1lY29mZiopOiBBZGRlZCB0cmFpbGluZyAnKicuCi0JKiBjb25maWcvbWlwcy1pZHRsLm10OiBOZXcgZmlsZTsgdXNlIEVNVUwgb2YgbWlwc2lkdGwuCi0JKiBtaXBzaWR0bC5zaDogTmV3IGZpbGU7IGxpa2UgbWlwc2lkdC5zaCwgYnV0IGxpdHRsZSBlbmRpYW4uCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzaWR0bC5vLgotCi0JKiBjb25maWcvc3VuMy5taCAoSE9TVElOR19MSUJTLCBIT1NUSU5HX0VNVSk6IFJlbW92ZWQgb2Jzb2xldGUgYW5kCi0JaW5jb3JyZWN0IGRlZmluaXRpb25zLgotCi1UdWUgSnVuICAxIDE0OjU2OjEwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiAgV3JpdGUgQlNGX0NPTlNUUlVDVE9SCi0Jc3ltYm9scywgdW5sZXNzIHN0cmlwcGluZy4KLQotVHVlIE1heSAyNSAxNTozNDoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjb25maWd1cmUgbG9va3MgZm9yICMjIyMsIHNvIHJlbW92ZSBsaW5lcyB3aXRoIG1hbnkKLQknIycgY2hhcmFjdGVycy4KLQkqIGNvbmZpZy9pcml4NC5taCwgY29uZmlnL2kzODZ2Lm1oOiBOZXcgZmlsZXM7IHNldCBIT1NUSU5HX0NSVDAKLQlhbmQgSE9TVElOR19MSUJTIGNvcnJlY3RseSBzbyB0aGF0IGBgbWFrZSBjaGVjaycnIHdpbGwgd29yay4KLQotVGh1IE1heSAyMCAxMzo1NjoxNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogIERlZmluZSBfZXRleHQsIF9lZGF0YSwgYW5kIF9lbmQsIGluIGFkZGl0aW9uCi0JdG8gZXRleHQsIGVkYXRhLCBhbmQgZW5kLiAgTmVlZGVkIGZvciBJUklYIDQuMC41Ri4KLQlQYXRjaCBmcm9tIG13cEBpY29uaXgub3ouYXUgKE1pY2hhZWwgUGFkZG9uKS4KLQotCSogVmVyc2lvbiAyLjIuMSByZWxlYXNlZC4KLQotVGh1IE1heSAyMCAxMTo0MjowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1pcHNic2Quc2Mtc2g6IFJlbmFtZWQgZnJvbSBhb3V0LW1pcHNic2Quc2Mtc2guCi0JKiBtaXBzYnNkLnNoIChFTVVMQVRJT05fTkFNRSk6IFVzZSBuZXcgZmlsZSBuYW1lLgotCi1UdWUgTWF5IDE4IDE3OjEwOjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExERElTVFNUVUZGKTogUmVtb3ZlIGxkLm1tIHNpbmNlIHdlIGNhbid0IGJ1aWxkIGl0Ci0JcHJvcGVybHkgcmlnaHQgbm93LgotCi0JKiBWZXJzaW9uIDIuMiByZWxlYXNlZC4KLQotTW9uIE1heSAxNyAxNTozNzoyOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogQnVtcCB2ZXJzaW9uIG51bWJlciB0byAyLjIuCi0KLU1vbiBNYXkgMTcgMTI6NDQ6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE5FV1M6ICBOZXcgZmlsZS4KLQotRnJpIE1heSAxNCAxMToyNjoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6IERvbid0IGRlZmluZSBCU1NfVkFSIHVubGVzcyByZWxvY2F0aW5nLgotCi1XZWQgTWF5IDEyIDEzOjMzOjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1rc2NyaXB0Lm8sIG1rc2NyaXB0KTogQnVpbGQgbWtzY3JpcHQgdmlhCi0JbWtzY3JpcHQubywgcmF0aGVyIHRoYW4gZGlyZWN0bHkgZnJvbSBta3NjcmlwdC5jLgotCi1UdWUgTWF5ICA0IDIxOjU4OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBMb29rIGZvciAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSByZWxhdGl2ZSB0bwotCSR7c3JjZGlyfSwgbm90IHJlbGF0aXZlIHRvIGJ1aWxkIGRpcmVjdG9yeS4KLQotCSogaHBwYW9zZi5lbSwgaHBwYW9zZi5zYy1zaCwgaHBwYW9zZi5zaDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaHBwYSotaHAtb3NmLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSW5jbHVkZSBocHBhb3NmIGVtdWxhdGlvbi4KLQkoZW1faHBwYW9zZi5jKTogQnVpbGQgaXQuCi0JKiBjb25maWcvaHBwYW9zZi5taCwgaHBwYW9zZi5tdDogTmV3IGZpbGVzLgotCi0JKiBsZC5oIChBTElHTl9OKTogUmVuYW1lZCBmcm9tIEFMSUdOLCBiZWNhdXNlIHRoYXQgY29uZmxpY3RlZCB3aXRoCi0Jc29tZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgQWxsIHVzZXMgY2hhbmdlZC4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaTM4Ni1haXggY29uZmlndXJhdGlvbnMgYXMgaTM4Ni1jb2ZmCi0JdGFyZ2V0cy4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbTY4Ki0qLWhwdXguCi0JKiBhb3V0LnNjLXNoOiBJZiBTVEFDS1pFUk8gYW5kIFJFTE9DQVRJTkcgYXJlIGJvdGggZGVmaW5lZCwgb3V0cHV0Ci0JdGhlIHZhbHVlIG9mIFNUQUNLWkVSTy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEluY2x1ZGUgaHAzMDAtaHB1eCBlbXVsYXRpb24uCi0JKGVtX2hwM2hwdXguYyk6IEJ1aWxkIGl0LgotCSogaHAzaHB1eC5zaCwgY29uZmlnL2hwMzAwaHB1eC5tdDogTmV3IGZpbGVzLgotCi1UdWUgTWF5ICA0IDEyOjM3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogUHV0IGNvbnN0cnVjdG9ycyBpbiB0aGUgLmRhdGEgc2VjdGlvbi4KLQkqIE1ha2VmaWxlLmluIChjZHRlc3QpOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGxkLm5ldy4KLQotTW9uIE1heSAgMyAxOTo0MzozOSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgZGVmaW5pdGlvbiBvZiAkKHRvb2xkaXIpIHRvIG1hdGNoIEZTRi4KLQkqIHZheC5zaCwgY29uZmlnL3ZheC5tdCwgY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjoKLQlTdXBwb3J0IFZBWCBVbHRyaXggYW5kIEJTRC4KLQotTW9uIEFwciAyNiAxODozNTo0NyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2guZW0sIHNoLnNoLCBzaC5zYy1zaDogTmV3IGZpbGVzIHN1cHBvcnRpbmcgSGl0YWNoaSBTSC4KLQotV2VkIEFwciAxNCAyMTowMTo1MSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmggKHN0cnVjdCBtZW1vcnlfcmVnaW9uKTogIENoYW5nZSBgbGVuZ3RoJyBhbmQKLQlgb2xkX2xlbmd0aCcgZmllbGRzIHRvIGJmZF9zaXplX3R5cGUuICBFbGltaW5hdGUgdXNlIG9mIGJmZF9vZmZzZXQuCi0JKiBsZGxhbmcuYywgbXJpLmM6ICBDb3JyZXNwb25kaW5nIGNoYW5nZXMsIHBsdXMgbGludC4KLQotVGh1IEFwciAgOCAyMjowODoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGFsbCBpMzg2IHRhcmdldHMsIGFjY2VwdCBpNDg2IGFzIHdlbGwuCi0KLU1vbiBBcHIgIDUgMTc6MzM6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogUHJlc2VydmUgYWxsIGZsYWdzIGZvciBhCi0JU0VDX1NIQVJFRF9MSUJSQVJZIHNlY3Rpb24uCi0JKHNpemVfaW5wdXRfc2VjdGlvbik6IENvbnNpZGVyIGFueSBTRUNfSEFTX0NPTlRFTlRTIHNlY3Rpb24gd2hlbgotCWNvbXB1dGluZyBsYXJnZXN0X3NlY3Rpb24uCi0KLUZyaSBBcHIgIDIgMTQ6MzM6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogSW5pdGlhbGl6ZSBhbGwKLQlmaWVsZHMgb2YgbmV3bHkgY3JlYXRlZCBzdHJ1Y3R1cmUuCi0KLVdlZCBNYXIgMzEgMTg6MTk6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoZ19zd2l0Y2hfdmFsdWUpOiBOZXcgdmFyaWFibGUuCi0JKiBsZGdyYW0ueSAoT1BUSU9OX0csIE9QVElPTl9HdmFsKTogTmV3IHRva2Vucy4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCAtRyBhbmQgc2V0IGdfc3dpdGNoX3ZhbHVlLgotCSogbGRsZXgubCAoQ09NTUFORCk6IEFjY2VwdCAtRy4KLQkqIGxkbGFuZy5jIChvcGVuX291dHB1dCk6IENhbGwgYmZkX3NldF9ncF9zaXplIG9uIG5ldyBCRkQuCi0KLVR1ZSBNYXIgMzAgMDk6NDA6MjUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlTdXBwb3J0IGZvciBsaW5raW5nIGFuZCBsb2FkaW5nIGF0IGRpZmZlcmVudCBwbGFjZXM6Ci0KLQkqIGxkbGV4Lmw6IEFkZCAiQVQiIGtleXdvcmQuCi0JKiBsZGdyYW0ueTogQ2xlYW51cCwgYW5kIHBhcnNlIEFULgotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFByaW50IG91dHB1dCBhZGRyZXNzCi0Jb2Ygc2VjdGlvbiBpbiBtYXAuIChsYW5nX3NpemVfc2VjdGlvbnMpOiBGaWxsIHNlY3Rpb25zJyBsbWEgd2l0aAotCWxvYWQgYWRkcmVzcy4KLQkqIGxkbGFuZy5oIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlKTogQWRkIGxvYWRfYmFzZQotCWluZm9ybWF0aW9uLgotCi0JKiBsZGluZHIuYyAoYWRkX2luZGlyZWN0KTogS2VlcCBtb3JlIGluZm9ybWF0aW9uIGluIHRoZSBhbGlhcwotCXN5bWJvbCBjaGFpbi4KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiAgRG9uJ3QgaW5oZXJpdCBORVZFUl9MT0FEIHNlY3Rpb24KLQlhdHRyaWJ1dGUgZnJvbSBhbiBpbnB1dCBzZWN0aW9uLgotCSogbGRtYWluLmMgKFFfZW50ZXJfZmlsZV9zeW1ib2xzKTogQ29tbW9uIHNlY3Rpb24gaXMgTkVWRVJfTE9BRCBieQotCWRlZmF1bHQuIChRX2VudGVyX2ZpbGVfc3ltYm9zKTogSW5kaXJlY3Qgc3ltYm9scyBub3cgYXJlIGtub3duIGJ5Ci0JdGhlaXIgc2VjdGlvbiwgbm90IGEgc3BlY2lhbCBzeW1ib2wgZmxhZy4KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogSW5kaXJlY3Qgc3ltYm9scyBhcmVuJ3QgbG9jYWwuCi0JKHdyaXRlX2ZpbGVfZ2xvYmFscyk6IFdyaXRlIHRoZSBtYXBwaW5nIGZvciBhbiBpbmRpcmVjdCBzeW1ib2wuCi0JKiByZWxheC5jIChidWlsZF9pdCk6IFdoZW4gZm9yY2VkIHRvIHdyaXRlIGEgTkVWRVJfTE9BRCBzZWN0aW9uLAotCWZpbGwgaXQgd2l0aCB6ZXJvcy4KLQotVHVlIE1hciAyMyAxMzoyNDoxMCAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiAgY2hhbmdlcyBmb3IgcTEKLQotVHVlIE1hciAyMyAwMDoxMzoyOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZHZpIHRhcmdldCwgZGVmaW5lICYgdXNlIFRFWEkyRFZJLCBhZGQgaW5zdGFsbGNoZWNrCi0KLU1vbiBNYXIgIDggMjA6MzA6MzUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVuYW1lIEhPU1RfQ0MgdG8gQ0NfRk9SX0JVSUxECi0KLVRodSBNYXIgIDQgMTI6NDQ6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiBBZGRlZCB2YXJpYWJsZXMgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4gYnkgYQotCXNwZWNpZmljIGVtdWxhdGlvbi4KLQkqIG1pcHNpZHQuc2g6IE5ldyBmaWxlOyBlbXVsYXRpb24gZm9yIElEVCBNSVBTIGJvYXJkLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fbWlwc2lkdC5vLgotCShlbV9taXBzaWR0LmMpOiBOZXcgdGFyZ2V0LiAgVXNlcyBtaXBzaWR0LnNoIGFuZCBtaXBzLnNjLXNoLgotCSogY29uZmlnL21pcHMtaWR0Lm10OiBOZXcgZmlsZTsgc2V0cyBFTVVMIHRvIG1pcHNpZHQuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtaWR0LWVjb2ZmKTogTmV3IHRhcmdldDsgdXNlcyBtaXBzLWlkdC4KLQotU2F0IEZlYiAyNyAwMDowMDoxNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtbWlwc2JzZC5zYy1zaCwgbWlwc2JzZC5zaDogTmV3IGZpbGVzIGZyb20gUmFscGggQ2FtcGJlbGwsCi0JcmFscGhjQHB5cmFtaWQuY29tLgotCSogaTM4NmJzZC5zaCwgY29uZmlnL2kzODZic2QubXQ6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IEFkZGVkIHN1cHBvcnQgZm9yIG1pcHNic2QgYW5kIDM4NmJzZC4KLQotVGh1IEZlYiAyNSAxNTozMzoxMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1yaS5jOiAgQWRkIGV4dGVybiBkZWNsYXJhdGlvbiBvZiBzdHJkdXAuCi0JKiBsZHN5bS5jIChLRUVQIG1hY3JvKTogIEFkZCBzcGFjZXMgYXJvdW5kICc9JyBmb3IgdGhlCi0Jc2FrZSBvZiBvbGQgKGUuZy4gUENDKSBjb21waWxlcnMuCi0KLVdlZCBGZWIgMjQgMTk6NDk6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiAgQnVtcCB0byB2ZXJzaW9uIDIuMS4KLQotRnJpIEZlYiAxMiAwODowOToxMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IGFsbG93IHNlY3Rpb24gdHlwZXMgd2l0aG91dCBhZGRyZXNzICBleHByZXNzaW9ucy4KLQkqIGxkbGFuZy5jIChsYW5nX3JlbG9jYXRlX2dsb2JhbHMpOiBhdm9pZCBwb3NzaWJsZSBoYW5nIHdpdGgKLQl1bmRlZmluZWQgYnV0IHVucmVmZXJlbmNlZCBzeW1ib2xzLgotCSogcmVsYXguYyAocmVsYXhfc2VjdGlvbik6IGRvbid0IGNvbXBsYWluIGlmIHRoZSBzY3JpcHQgZmlsZSBpc24ndAotCXJlbGF4YWJsZSBidXQgLXJlbGF4IGlzIHNldAotCi1UaHUgRmViIDE4IDE3OjU4OjQ1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBnbzMyIGlzIHRoZSAzcmQgcGFydCBvZiB0aGUgdHJpcGxlLCBub3QgdGhlIDJuZAotCi1XZWQgRmViICAzIDA5OjA1OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwc2JpZy5zaDogTmV3IGZpbGUuICBCaWcgZW5kaWFuIE1JUFMgZW11bGF0aW9uLgotCSogY29uZmlnL21pcHMtYmlnLm10OiBOZXcgZmlsZS4gIFVzZSBtaXBzYmlnIGVtdWxhdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeCopOiBVc2UgdGFyZ2V0IG1pcHMtYmlnLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fbWlwc2JpZy5vLgotCShlbV9taXBzYmlnLmMpOiBOZXcgdGFyZ2V0LiAgVXNlcyBtaXBzYmlnLnNoLgotCi1UdWUgRmViICAyIDExOjMyOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogUHV0IC5zY29tbW9uIHNlY3Rpb25zIGludG8gLnNic3Mgc2VjdGlvbi4KLQotCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBQcmVzZXJ2ZSBzZWN0aW9uIG9mIGNvbW1vbiBzeW1ib2xzLAotCXJhdGhlciB0aGFuIGFsd2F5cyBwdXR0aW5nIHRoZW0gaW4gYmZkX2NvbV9zZWN0aW9uLgotCSogbGRsYW5nLmMgKGxhbmdfY29tbW9uKTogSWYgYSBjb21tb24gc3ltYm9sIGlzIG5vdCBpbgotCWJmZF9jb21fc2VjdGlvbiwgcHV0IGluIGEgc2VjdGlvbiBvZiB0aGUgc2FtZSBuYW1lLCByYXRoZXIgdGhhbgotCWFsd2F5cyBwdXR0aW5nIGl0IGluIHNlY3Rpb24gQ09NTU9OLgotCi1GcmkgSmFuIDI5IDA5OjU3OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBjb21tb24KLQlkZWZpbml0aW9uIG9mIGEgc3ltYm9sLCBkb24ndCBuZWNlc3NhcmlseSBwdWxsIGluIGFuIG9iamVjdCBmaWxlCi0JdGhhdCBwcm92aWRlcyBhIG5vbi1jb21tb24gZGVmaW5pdGlvbi4KLQotCSogbGRsZXgubCAoQ09NTUFORCk6IEFjY2VwdCAtRUIgYW5kIC1FTCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLAotCXJldHVybmluZyBPUFRJT05fRUIgYW5kIE9QVElPTl9FTC4gIGdjYyBwYXNzZXMgdGhlc2UgdG8gYSBNSVBTCi0JbGlua2VyLgotCSogbGRncmFtLnkgKE9QVElPTl9FQiwgT1BUSU9OX0VMKTogTmV3IHRva2Vucy4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBhbmQgaWdub3JlIE9QVElPTl9FQiBhbmQgT1BUSU9OX0VMLgotCi1UaHUgSmFuIDI4IDE1OjEyOjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgJCh0b29sZGlyKS9iaW4vZ2xkIGJlZm9yZSBjcmVhdGluZwotCXRoZSBsaW5rIHRvIGl0LgotCi1UdWUgSmFuIDI2IDExOjQ5OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMsIGxkc3ltLmM6IFVzZSBuZXcgYmZkX2lzX2NvbV9zZWN0aW9uIG1hY3JvIHJhdGhlciB0aGFuCi0JY2hlY2tpbmcgZm9yIGVxdWFsaXR5IHRvIGJmZF9jb21fc2VjdGlvbi4KLQotRnJpIEphbiAyMiAxNDoyMjo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6IE5ldyBmaWxlLiAgVWx0cml4LCBhbmQgaG9wZWZ1bGx5IG90aGVyIE1JUFMgRUNPRkYKLQl0YXJnZXRzLCBsaW5rZXIgc2NyaXB0LgotCSogbWlwc2xpdC5zaDogTmV3IGZpbGUuICBMaXR0bGUgZW5kaWFuIE1JUFMgZW11bGF0aW9uLgotCSogY29uZmlnL21pcHMtbGl0Lm10OiBOZXcgZmlsZS4gIFVzZSBtaXBzbGl0IGVtdWxhdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtdWx0cml4Kik6IFVzZSB0YXJnZXQgbWlwcy1saXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzbGl0Lm8uCi0JKGVtX21pcHNsaXQuYyk6IE5ldyB0YXJnZXQuICBVc2VzIG1pcHNsaXQuc2guCi0KLVRodSBKYW4gMTQgMTU6MzA6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEluc3RhbGwgbGQgYXMgYm90aCAkKHRvb2xkaXIpL2Jpbi9sZCBhbmQKLQkkKHRvb2xkaXIpL2Jpbi9nbGQsIHNvIHRoYXQgZ2NjIGNhbiBmaW5kIGl0IHdpdGggb3Igd2l0aG91dAotCWNvbGxlY3QyLgotCi1Nb24gSmFuIDExIDE4OjUwOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGR3cml0ZS5jOiBSZW1vdmVkIHBlcmZvcm1fcmVsb2NhdGlvbiwgY29weV9hbmRfcmVsb2NhdGUsIGFuZAotCXdyaXRlX25vcmVsLiAgQWxsIGxpbmtpbmcgaXMgbm93IGRvbmUgdmlhIHdyaXRlX3JlbGF4LiAgQ2FsbAotCWxkc3ltX3dyaXRlIGJlZm9yZSBjYWxsaW5nIHdyaXRlX3JlbGF4LgotCSogcmVsYXguYzogQWRkZWQgY29weXJpZ2h0LgotCSh3cml0ZV9yZWxheCk6IFJlbmFtZWQgZnJvbSB3cml0ZV9yZWxheG5vcmVsLiAgQWRkZWQgcmVsb2NhdGVhYmxlCi0JYXJndW1lbnQuICBzZWNsZXRfZHVtcCByZW5hbWVkIHRvIGJmZF9zZWNsZXRfbGluay4KLQkqIHJlbGF4Lmg6IEFkZGVkIGNvcHlyaWdodC4KLQotTW9uIEphbiAxMSAxNTo0MTo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGRlY29kZV9saWJyYXJ5X3N1YmZpbGUpOiBQYXRjaCBmcm9tCi0JaG9vZ2VuQHNoYWZlci5jcy51dGFoLmVkdSwgZG9uJ3QgcmVyZWFkIGxpYnJhcnkgc3ltYm9sIHRhYmxlcy4KLQotRnJpIEphbiAgOCAxODowNDozMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy92eHdvcmtzOTYwLm10IHJlbmFtZWQgdG8gY29uZmlnL2k5NjAubXQKLQotCSogY29uZmlndXJlLmluOiBzcGFyYy1hb3V0IGVtdWxhdGVzIGEgc3VuNCwgYXMgZG9lcwotCXNwYXJjKi12eHdvcmtzLCBpOTYwLW5pbmR5IHVzZXMgZ2xkOTYwIGVtdWxhdGlvbgotCi1GcmkgSmFuICA4IDE0OjM5OjA3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JIEZpeCBzdXBwb3J0IGZvciBOT0xPQUQsIGFkZCBJTkNMVURFCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fY29tbWFuZF9maWxlKTogcGFzcyBmaWxlIG5hbWUgdG8KLQlsZXhfcHVzaF9maWxlLgotCSogbGRsZXgubCwgbGRncmFtLnk6IHRpZHkgdXAsIHBhcnNlIElOQ0xVREUgYW5kIE5PTE9BRAotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IG1ha2Ugb3V0cHV0IHNlY3Rpb25zIGluaGVyaXQgTkVWRVJfTE9BRAotCWF0dHJpYnV0ZS4KLQotVGh1IEphbiAgNyAxMDoyMjoxOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcuaDogbm8gbW9yZSBkZWZhdWx0IGVtdWxhdGlvbi4gIE1ha2UgdGhlIGxhY2sKLQlvZiBlbXVsYXRpb24gYSBjb21waWxlIHRpbWUgZXJyb3IKLQotV2VkIEphbiAgNiAwMTowODozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXNlIGFsbCBzcGFyY2xpdGUgdmFyaWFudHMsIG5vdCBqdXN0ICdzcGFyY2xpdGUnCi0KLU1vbiBEZWMgMjggMTE6MTU6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrY29mZi5zYy1zaDogZGVmaW5lIF9lbmQgYXMgd2VsbCBhcyBlbmQsIGZvciBjb25zaXN0ZW5jeSB3aXRoCi0JYW91dC5zYy1zaC4KLQotCSogY29uZmlndXJlLmluOiBhY2NlcHQgKi1lcmljc3Nvbi1vc2UgZm9yIGFueSBtNjhrIENQVS4KLQotCSogbGR3cml0ZS5jICh3cml0ZV9yZWwpOiBkb24ndCBhbHdheXMgc2V0IFNFQ19IQVNfQ09OVEVOVFMgZmxhZwotCWZvciBlYWNoIG91dHB1dCBzZWN0aW9uLgotCi1Nb24gRGVjIDIxIDE2OjA2OjU5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYywgbGRsYW5nLmMsIGxkbWFpbi5jLCBsZHN5bS5jLCBsZHdhcm4uYzogIFVzZSBuZXcKLQltYWNybyBiZmRfYXN5bWJvbF9iZmQgYXMgYXBwcm9wcmlhdGUuCi0JKiBNYWtlZmlsZS5pbjogIFVuLWR1cGxpY2F0ZSBsZGxleC5jIGRlcGVuZGVuY3kuCi0JKiBjb25kaWd1cmUuaW46ICBSZXBsYWNlIG15X2hvc3QgY2FzZSB0YWJsZSBieSBzb3VyY2luZwotCS4uL2JmZC9jb25maWd1cmUuaG9zdC4gIEFsbG93IHN0ZC1ob3N0IGFzIHRoZSBkZWZhdWx0LgotCSogbGRtaXNjLmM6ICBDaGFuZ2UgbG9naWMgZm9yIEMrKyBuYW1lIGRlbWFuZ2xpbmc6ICBUaGVyZSBpcwotCW5vIGluaXRpYWwgJ18nIHRvIHJlbW92ZSBmcm9tIHN0YWItZGVyaXZlZCBmdW5jdGlvbiBuYW1lcy4KLQotU3VuIERlYyAxMyAxNjozMToyNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfaW5pdF9zY3JpcHRfZmlsZSk6IGRvbid0IGF0dGFjaCB0aGUgb3V0cHV0IGZpbGUKLQlzZWN0aW9ucyB0byB0aGUgc2NyaXB0IGZpbGUuCi0KLVdlZCBEZWMgIDkgMDg6Mzg6MDUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0JKiBsZGxhbmcuYyAod2lsZCk6IHJ1biBleHBhbnNpb24gbG9vcCBvdmVyIGNvbW1hbmQgbGluZSBiZmQgdG9vLgotCShsYW5nX2luaV9zY3JpcHRfZmlsZSk6IGluaXRpYWxpemUgbW9yZSBwYXJ0cyBvZiB0aGUgY29tbWFuZCBsaW5lCi0JYmZkLgotCSogbGRsZXgubDogZml4IERFRklORUQgc3RhcnQgc3RhdGVzLgotCi1Nb24gRGVjICA3IDA4OjQzOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCSAteSBzdXBwb3J0Ci0JKiBsZC50ZXhpbmZvOiBuZXcgZG9jLgotCSogbGRncmFtLnksIGxkbGV4Lmw6IHVuZGVyc3RhbmQgLXk8c3ltYm9sPgotCSogbGRtYWluLmMgKFFfZW50ZXJfZmlsZV9zeW1ib2xzKTogaWYgaGFkIC15LCBsb29rdXAgc3ltYm9sIGFuZAotCXByaW50IGluZm8uIChhZGRfeXN5bSk6IG5ldyBmdW5jdGlvbi4KLQkqIGxkc3ltLmg6IChsZHN5bV90eXBlKTogbmV3IGRlZmluZSBTWU1fWS4KLQotU2F0IE5vdiAyMSAwMzoxNToyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGRjdG9yLmgsIGxkZXJyb3IuaCwgbGRleHAuaCwgbGRmaWxlLmgsIGxkaW5kci5oLCBsZGxhbmcuYywKLQlsZGxhbmcuaCwgbGRsZXguaCwgbGRtYWluLmgsIGxkbWlzYy5oLCBsZHN5bS5oLCBsZHZlci5oLCBsZHdhcm4uaCwKLQlsZHdyaXRlLmgsIHJlbGF4Lmg6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGFuZCBQUk9UTyBhbnNpLWdsdWUKLQltYWNyb3Mgd2l0aCBQQVJBTVMuICBSZWNyZWF0aW9uYWwgY2xlYW51cC4gIFVwZGF0ZSBjb3B5cmlnaHRzLgotCi1UdWUgTm92IDEwIDAwOjIzOjM3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biB0aGUgYmZkIHNvdXJjZSBkaXJlY3RvcnkgZm9yIGluY2x1ZGVzCi0KLVRodSBOb3YgIDUgMTU6NDE6NTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogZG9uJ3QgY2hhbmdlIHNpemUgYW5kIGFkZHJlc3MgZm9yCi0JU0VDX1NIQVJFRF9MSUJSQVJZIHNlY3Rpb25zIHJhdGhlciB0aGFuIGZvciBTRUNfTkVWRVJfTE9BRAotCXNlY3Rpb25zLgotCi1UaHUgTm92ICA1IDExOjMzOjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxheC5jIChidWlsZF9pdCk6IHJlLWVuYWJsZSB0aGUgcHJvY2Vzc2luZyBvZiBkYXRhX3N0YXRlbWVudHMKLQlpbiBzY3JpcHRzLCBtYWtlcyBjb3VudGVkIGNvbnRydWN0b3IgbGlzdHMgd29yayBhZ2Fpbi4KLQotVGh1IE5vdiAgNSAwNTo0MzowMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGRlbXVsLmg6ICBSZW1vdmUgdXNlcyBvZiBTREVGIGFuZCBQUk9UTyBtYWNyb3MgKHVzZSBQQVJBTVMpLgotCi1UdWUgT2N0IDIwIDEwOjU2OjA2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4a2NvZmYuc2Mtc2g6IGRvbid0IHVzZSBpbml0aWFsIHVuZGVyc2NvcmVzIGZvciBldGV4dCwgZWRhdGEKLQlhbmQgZW5kLgotCi1Nb24gT2N0IDE5IDA5OjQ1OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogU3VwcG9ydCBmb3IgaTM4Ni1zeXN2LgotCWNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIGkzODYtKi1zeXN2KiBhbmQgaTM4Ni0qLXNjbyouCi0JaTM4NmNvZmYuc2Mtc2g6IHJld3JvdGUgdG8gc3VwcG9ydCBTVlIzIGJ5IGRlZmF1bHQuCi0JbGRjdG9yLmMgKGZpbmRfY29uc3RydWN0b3JzKTogcHJlc2VydmUgc3RhdF9wdHIuCi0JbGRsYW5nLmMgKHdpbGRfZG9pdCk6IGluaXRpYWxpemUgdm1hIGFuZCBzaXplIG9mIG5ldyBvdXRwdXQKLQlzZWN0aW9uIHRvIGNvcnJlc3BvbmRpbmcgaW5wdXQgc2VjdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yCi0Jc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogZG9uJ3QgbW9kaWZ5IHZtYSBhbmQgc2l6ZSBvZiBzZWN0aW9ucyB3aGljaAotCWFyZSBuZXZlciBsb2FkZWQgKGZvciBzaGFyZWQgbGlicmFyaWVzKS4KLQlsZHdyaXRlLmMgKGNvcHlfYW5kX3JlbG9jYXRlKTogY29weSB0aGUgY29udGVudHMgb2YgYW55IHNlY3Rpb24KLQl3aGljaCBoYXMgY29udGVudHMsIG5vdCBqdXN0IHNlY3Rpb25zIHdoaWNoIGFyZSBsb2FkZWQgKGZvciBzaGFyZWQKLQlsaWJyYXJpZXMpLgotCi1UaHUgT2N0IDE1IDE1OjIwOjI2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoc2l6ZV9pbnB1dF9zZWN0aW9uKTogY291bnQgdGhlIHNpemVzIG9mIGFsbCBzZWN0aW9ucwotICAgICAgICB3ZSBhbGxvY2F0ZS4KLQotVGh1IE9jdCAgOCAwOTowNToyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKGRlbWFuZ2xlLHZmaW5mbyk6IHVzZSB0aGUgbmV3IHVuZGVyc2NvcmUgaW4gYmZkIHRvCi0JdG8gZGVtYW5nbGUgc3ltYm9scyBiZXR0ZXIKLQotVHVlIE9jdCAgNiAxMzowODo1NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IGRvbid0IHdhcm4gaWYgLWUgc3RhcnQgc3ltYm9sIGRvZXMgbm90Ci0JZXhpc3Qgd2hlbiBsaW5raW5nIHdpdGggLXIuCi0KLU1vbiBPY3QgIDUgMTQ6MDc6MzcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0LnNjLXNoLCBtNjhrY29mZi5zYy1zaDogc2V0IF9fYnNzX3N0YXJ0IHRvIHRoZSBzdGFydCBvZiB0aGUKLQkuYnNzIHNlZ21lbnQuCi0KLU1vbiBPY3QgIDUgMDg6NTU6MTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChsaW5lYXJfbGlicmFyeSk6IGRvbid0IGV2ZW4gdGhpbmsgYWJvdXQgcHJvY2Vzc2luZwotCWFuIG9iamVjdCBmaWxlIGlmIGl0J3MgYWxyZWFkeSBiZWVuIGRvbmUKLQotVGh1IE9jdCAgMSAyMzoxNDo1OSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdGhlIGhwOTAwMC8zMDAgY29uZmlnIGZpbGUgaXMgbm93IGhwMzAwCi0KLVdlZCBTZXAgMzAgMDc6MzQ6MDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy96OGtzaW0ubXQ6IG5ldyBmaWxlCi0KLUZyaSBTZXAgMjUgMTM6NDk6NTIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGt5cmlhdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxkZXhwLm8sIGxkY3Rvci5vLCBsZGxhbmcubywgbGRtYWluLm8sIGxkd3JpdGUubywKLQlsZXhzdXAubywgbXJpLm8sIHJlbGF4Lm8pOiBJbmRpY2F0ZSBkZXBlbmRlbmNlIG9uIGxkZ3JhbS5oLgotCi0JKiBsZC5oIChzdHJpcF9zeW1ib2xzX3R5cGUpOiBBZGQgdmFsdWUgU1RSSVBfU09NRS4KLQkqIGxkZ3JhbS55IChPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRSk6IE5ldyB0ZXJtaW5hbCB0b2tlbi4KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9rZWVwc3ltc19maWxlKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsZXgubDogSGFuZGxlICItcmV0YWluLXN5bWJvbHMtZmlsZSIuCi0JKiBsZHN5bS5jIChrZWVwc3ltc19maWxlLCBrZXB0X3N5bXMpOiBOZXcgdmFycy4KLQkocHJvY2Vzc19rZWVwc3ltcyk6IE5ldyBmdW5jdGlob247IHJlYWRzIGZpbGUsIG1hcmtzIHN5bWJvbHMgZm9yCi0Jc2F2aW5nLgotCSh3cml0ZV9maWxlX2xvY2Fscyk6IEZpbGUgc3ltYm9scyBzaG91bGQgYWx3YXlzIGJlIGtlcHQuCi0JKGxkc3ltX3dyaXRlKTogV2FybiBhYm91dCAiLXJldGFpbi1zeW1ib2xzLWZpbGUiIG92ZXJyaWRpbmcgIi1TIgotCWFuZCAiLXMiLiAgUHJvY2VzcyByZXRhaW4tc3ltYm9scyBmaWxlIGJlZm9yZSBzZXR0aW5nIHN5bXRhYi4KLQkqIGxkc3ltLmggKFNZTV9LRUVQKTogTmV3IGZsYWcgZm9yIGxkc3ltX3R5cGUgZmxhZ3MuCi0JKGtlZXBzeW1zX2ZpbGUsIGtlcHRfc3ltcyk6IERlY2xhcmUgdGhlbS4KLQotCSogbGRtYWluLmMgKG1haW4pOiBOb24tZmF0YWwgZXJyb3JzIHNob3VsZCBzdGlsbCBjYXVzZSBub24temVybwotCWV4aXQgc3RhdHVzIGV2ZW4gd2l0aCAtci4KLQotRnJpIFNlcCAyNSAxMTowODowMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIHo4awotCSogejhrc2ltLmVtLCB6OGtzaW0uc2Mtc2gsIHo4a3NpbS5zaDogbmV3IGZpbGVzCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBtb2RpZmllZCB0byByZWZsZWN0IGFib3ZlCi0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogd2hlbiBsaW5raW5nIGNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyZXMsCi0JbWFrZSB0aGUgb3V0cHV0IGZpbGUgcmVmbGVjdCBhdCBsZWFzdCBvbmUgb2YgdGhlIGJhZCBpbnB1dHMuCi0KLVR1ZSBTZXAgMTUgMTU6MzU6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGlmICQodG9vbGRpcikgZXhpc3RzLCBpbnN0YWxsIGxkIGluCi0JJCh0b29sZGlyKS9iaW4uCi0KLUZyaSBTZXAgMTEgMTA6MjQ6MjIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IG1vZGlmaWVkIHRvIHN1cHBvcnQgaTM4Ni1jb2ZmCi0JKiBpMzg2Y29mZi5zaDogbmV3IGZpbGUKLQotV2VkIFNlcCAgOSAxMTo1Mjo1OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBtNjhrY29mZi5zaCwgbTY4a2NvZmYuc2Mtc2gsIGNvbmZpZy9tNjhrLWNvZmYubXQ6Ci0JYWRkZWQgbTY4ay1jb2ZmIGVtdWxhdGlvbiBtb2RlLCBzdG9sZW4gZnJvbSBhMjlrIGVtdWxhdGlvbi4KLQlBbG1vc3QgY2VydGFpbmx5IHdyb25nLCBidXQgcGVyaGFwcyBiZXR0ZXIgdGhhbiBzdW4zLgotCi1UaHUgU2VwICAzIDE0OjE5OjMwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIE1ha2VmaWxlLmRvcywgZ2VuZXJpYy5lbSwgZ2Vuc2NyaXB0cy5zaCwKLQlnbGQ5NjAuZW0sIGg4MzAwaG1zLmVtLCBoODMwMHhyYXkuZW0sIGxuazk2MC5lbSwgc3QyMDAwLmVtLAotCXZhbmlsbGEuZW06ICBSZW5hbWUgYWxsIChnZW5lcmF0ZWQpIGxkX18qLmMgZmlsZXMgdG8gZW1fLmMuCi0JVGhpcyBpcyBvbmUgY2hhcmFjdGVyIHNob3J0ZXIsIGFuZCBsZXRzIHBlb3BsZSBidWlsZCBvbgotCVNWUjMgc3lzdGVtLiAobGRfX2g4MzAweHJheS5bY29dIHdhcyB0aGUga2lsbGVyIHRoZXJlOwotCWg4MzAweHJheS5zYy1zaCBpcyBhbHNvIG92ZXJsb25nLCBidXQgc2VlbXMgaGFybWxlc3MuKQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBKb25hdGhhbiBSeXNocGFuIDxoaXRhY2hpIWFtaXRvIWpvbj4uCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiAgRml4IHR5cG8gbW9zdGNsZWFuIC0+IG1vc3RseWNsZWFuLgotCSogY29uZmlndXJlLmluOiAgQWRkIGhvc3QgaXNjLgotCi0JKiBsZHZlci5jOiAgQ2FsbCBpdCB2ZXJzaW9uIDIuMC4KLQotV2VkIFNlcCAgMiAwMDoyMTozMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBCdW1wIHRvIHZlcnNpb24gMC45OC4KLQkqIFRPRE86ICBOZXcgZmlsZS4KLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBtb3N0bHljbGVhbiwgZGlzdGNsZWFuLCByZWFsY2xlYW4gcnVsZXMuCi0KLVR1ZSBTZXAgIDEgMjM6NDI6MTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAoeHJlYWxsb2MpOiAgTmV3IChuZWVkZWQgYnkgLi4vbGliaWJlcnR5L2NwbHVzLmRlbS5jKS4KLQkqIGxkbGV4Lmw6IE1vdmVkIGNvbW1lbnQoKSB0byBlbmQsIHNpbmNlIHNvbWUgY29tcGlsZXJzCi0Jb3RoZXJ3aXNlIGhhdmUgcHJvYmxlbXMgd2l0aCBpbnB1dCgpIHVzZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuCi0KLVR1ZSBTZXAgIDEgMTc6NDU6NTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIFNvbGFyaXMgMiBhbmQgSXJpeCA0IGhvc3Qgc3VwcG9ydC4KLQotTW9uIEF1ZyAzMSAxOToyNzoxMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgLVMgZmxhZyBmcm9tIHRoZSBGTEVYIGRlZmluaXRpb24KLQotCSogY29uZmlndXJlLmluOiByZXdyb3RlLCB1c2luZyBuZXcgc3R5bGUgY2FzZSBzdGF0ZW1lbnQuICB1c2UKLQltNjhrLm10IGZvciBtNjhrLWFvdXQgc3lzdGVtcwotCi1TdW4gQXVnIDMwIDIxOjM4OjUzIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1hcCAibGQiIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB3aGVuCi0JaW5zdGFsbGluZy4KLQotU3VuIEF1ZyAzMCAxODoxMjoxMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgUmVtb3ZlZC4gIFVzZSB0aGUgdmVyc2lvbiBpbiBsaWJpYmVydHkgbm93LgotCSogbGRtaXNjLmM6ICBVc2UgbmV3IGxpYmliZXJ0eSB2ZXJzaW9uIG9mIGNwbHVzX2RlbWFuZ2xlKCkuCi0KLVRodSBBdWcgMjcgMTY6Mzg6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBnbGQ5NjAuZW0gKGdsZDk2MF9jaG9vc2VfdGFyZ2V0KTogZGVmYXVsdCB0byBsaXR0bGUgZW5kaWFuLCBub3QKLQliaWcgZW5kaWFuLgotCi1XZWQgQXVnIDI2IDE3OjI4OjUxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogZG9uJ3QgcGFzcyBudWxsIHBvaW50ZXJzIHdoZW4KLQlhYnNfb3V0cHV0X3NlY3Rpb24gaXMgd2hhdCBpcyByZXF1aXJlZC4KLQkqIGxkd3JpdGUuYyAobGR3cml0ZSk6IHVzZSBtYWxsb2MgdG8gYWxsb2NhdGUgdGhlIGxhcmdlc3Qgc3BhY2UKLQl1c2VkLCBhbmQgcGFzcyB0aGF0IGRvd24uCi0JKiByZWxheC5jLHJlbGF4LmggKHdyaXRlX3JlbGF4bm9yZWwpOiB1c2UgdGhlIHBhc3NlZCBtYWxsb2MgYXJlYSByYXRoZXIKLQl0aGFuIGFsbG9jYS4KLQotTW9uIEF1ZyAyNCAxNDo0MjowNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL29zZTY4Lm10OiByZW5hbWVkIE9TRSB0byBvc2UuCi0KLVRodSBBdWcgMjAgMTk6NTU6MjIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogUmVvcmRlciBjaGVjayBmb3IgY29tbW9uIG9yCi0JdW5kZWZpbmVkIHN5bWJvbHMgc28gdGhhdCBpdCB3b3Jrcy4KLQotVHVlIEF1ZyAxOCAxMzo0MTozNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWNjZXB0IGFsbCBtNjhLIGZhbWlseSBtZW1iZXJzLgotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLVRodSBBdWcgMTMgMTE6NDk6MzQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IG5vdyBwYXJzZXMgY29tbWVudCBjb3JyZWN0bHksIGFkZGVkIH4gdG8gYWNjZXB0YWJsZQotCWNoYXJzIGluIGZpbGVuYW1lcwotCi0JKiBsZGV4cC5jIChleHBfdW5vcCk6IHBhc3MgZG93biBhYnNfb3V0cHV0X3NlY3Rpb24gLSBub3cgY2FuIGhhdmUKLQl1bmFyeSAtdmUgY29uc3RhbnRzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiB3YXJuIHdoZW4gYW4gZW50cnkgc3ltYm9sIHN1cHBsaWVkIG9uCi0JdGhlIGNvbW1hbmQgbGluZSBjYW4ndCBiZSBmb3VuZC4KLQotRnJpIEF1ZyAgNyAxMjozMToxMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmg6IGFkZCBuZXcgZmllbGQgImxvYWRhYmxlIiB0byBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JKiBsZGxhbmcuYyAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogaW5pdGlsaXplIG5ldwotCWZpZWxkLiAod2lsZF9kb2l0KTogaWYgbmV3IGZpZWxkIGlzIG5vdCBzZXQsIHRoZW4gc3RvcCBvdXRwdXQKLQlzZWN0aW9uIGZyb20gYmVpbmcgbG9hZGFibGUuCi0JKGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogc2V0IHRoZSBmaWVsZCBmcm9tIHRoZQotCU5PTE9BRCBrZXl3b3JkCi0JKiBsZGdyYW0ueTogbmV3IHN5bmF4IGZvciBOT0xPQUQuIFJlbW92ZXMgYSBzaGlmdC9yZWR1Y2UgdG9vLgotCSogaDgzMDBobXMuc2Mtc2gsIGg4MzAwaG1zLmVtOiBnZXQgLXIgcmlnaHQuCi0KLVRodSBBdWcgIDYgMTg6MzU6MjEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGludC50ZXhpbmZvOiAgTmV3IGludGVybmFscyBtYW51YWwgKGJlZ2lubmluZ3MgdGhlcmVvZikuCi0JKiBQT1JUSU5HOiAgUmVtb3ZlZCwgbWVyZ2VkIGludG8gbGRpbnQudGV4aW5mby4KLQotVHVlIEF1ZyAgNCAyMToxMjoyOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNkdGVzdC1tYWluLmNjLCBjZHRlc3QtZnVuYy5jYywgY2R0ZXN0LWZvby5oLCBjZHRlc3QtZm9vLmNjLAotCWNkdGVzdC5leHA6ICBBIHRlc3QgcHJvZ3JhbSAoY29waWVkIGZyb20gbGliZysrL3Rlc3QtaW5zdGFsbCkKLQl0aGF0IHRlc3RzIHRoYXQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3JzIGFyZSBoYW5kbGVkCi0JY29ycnJlY3RseS4KLQotTW9uIEF1ZyAgMyAxNDo1ODoxOSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaW5zdGFsbCBmcm9tIGxkLm5ldywgcmVuYW1pbmcgZHVyaW5nIHRoZQotCWNvcHksIG9yIGVsc2UgdGhlIG5leHQgJ21ha2UgaW5zdGFsbCcgbmVlZHMgdG8gcmUtbGluayBsZC4KLQotTW9uIEp1bCAyMCAwMzozNzowNiAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZ2VuZXJhbGlzZSBocCByZWNvZ25pdGlvbiAoZnJvbSBzZWYpLgotCi1TYXQgSnVsIDE4IDE0OjQ2OjA0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgYnNkIGFuZCBocHV4IGhwcGEgY29uZmlndXJhdGlvbnMuCi0JZXJyb3IgbWVzc2FnZXMgZWNobyB0byBzdGRlcnIsIG5vdCBzdGRvdXQKLQotRnJpIEp1bCAxNyAyMjowNjoxMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmRvcywgZ2xkLjEsIGxkLnRleGluZm8sIGxkZW11bC5jLCBsZGZpbGUuYywgbGRsYW5nLmMsCi0JICBsZG1pc2MuYzogcmVtb3ZlZCByY3NpZCdzLgotCi1UdWUgSnVsIDE0IDA4OjM0OjM0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19tYXApOiBwcmludCBjaGFuZ2VzIGluIHNpemVzIGR1ZSB0byByZWxheGluZwotCShzaXplX2lucHV0X3NlY3Rpb24pOiBtYWludGFpbiB0aGUgZGVsdGEgaW5mb3JtYXRpb24uCi0JKiBsZGxhbmcuaDogYWRkIG5ldyBmaWVsZCB0byBzdHJ1Y3QgdG8gY29udGFpbiBkZWx0YSBpbmZvLgotCSogcmVsYXguYyAgKHJlbGF4X3NlY3Rpb24pOiBjb21wbGFpbiBpZiBpbnB1dCBub3QgcmVsYXhhYmxlLgotCSogbGRsZXgubCA6IGFkZCAnXycsICcsJyBhbmQgJyQnIHRvIGNoYXJzIHdoaWNoIGNhbiBhcHBlYXIgYXQgdGhlCi0Jc3RhcnQgb2YgYSBmaWxlbmFtZQotCi1Nb24gSnVsIDEzIDE3OjMzOjAwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyhtYWluKTogcHJldmVudCAtciBhbmQgLXJlbGF4IGZyb20gYmVpbmcgb24gYXQgdGhlIHNhbWUKLQl0aW1lLgotCi1XZWQgSnVsICAxIDE3OjUxOjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoUV9lbnRlcl9nbG9iYWxfcmVmKSwgbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IGZpeCBmb3IKLQlhbGlhc2luZyBwcm9ibGVtcwotCi0KLVRodSBKdW4gMTggMDk6Mzg6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwaG1zLmVtLCBoODMwMGhtcy5zYy1zaDogIGRvIHRoZSByaWdodCB0aGluZyBmb3IgLXIKLQkqIGxkZXhwLmM6ICBsaW50Ci0JKiBsZGxhbmcuYyhvcGVuX291dHB1dCk6IHNldCB0aGUgdGFyZ2V0IGFyY2ggYW5kIG1hY2hpbmUgYXMgc29vbgotCWFzIHdlIGNhbi4gKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IHVzZSBuZXcgbWFjcm9zIGZvciBzZXR0aW5nIHZtYQotCSogbGR3cml0ZS5jOiBsaW50Ci0KLU1vbiBKdW4gMTUgMDg6NDc6NDMgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChteV90YXJnZXQpOiBBY2NlcHQgbTY4MD8wIGZvciB3cnMgYXMgdnh3b3JrczY4LgotCUFsc28gZGVsZXRlZCBhbiB1bnJlYWNoYWJsZSBwYXRoIHRvIHdycy4KLQotV2VkIE1heSAyNyAyMzoyNDoxOSAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IHVzZSAtZCB0ZXN0IGZvciAkdG9vbGRpciBiZWZvcmUKLQlpbnN0YWxsaW5nIGxkIHRoZXJlIHNvIHRoYXQgJHRvb2xkaXIgY2FuIGJlIGluaGVyaXRlZCBmcm9tCi0JdG9wLWxldmVsIE1ha2VmaWxlLgotCi1XZWQgTWF5IDI3IDE2OjU2OjQ4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmM6ICBUd28gbm9uLXN1YnN0YW50aWFsIGNoYW5nZXMgZm9yIHRoZSBzYWtlIG9mCi0JdGhlIG9sZCBQb3J0YWJsZSBDIENvbXBpbGVyLgotCi1XZWQgTWF5IDI3IDE1OjE1OjU4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgICAgICogbGRncmFtLnksIGxkbGV4Lmw6IHBhcnNlIEFCU09MVVRFCi0JKiBsZGV4cC5jOiBhZGQgc3VwcG9ydCBmb3IgQUJTT0xVVEUKLQotV2VkIE1heSAyNyAxMzowNzoyMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgZGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgSE9TVElOR19DUlQwLAotCUhPU1RJTkdfTElCUywgYW5kIEhPU1RJTkdfRU1VLCBiYXNlZCBvbiB0aG9zZSBpbiBjb25maWcvKi5taC4KLQkqIGNvbmZpZy8qLm1oOiAgTWlzY2VsbGFuZW91cyBjbGVhbi11cDogIFJlbW92ZWQgZGVmaW5pdGlvbnMKLQlvZiBZQUNDIChzaW5jZSBpdCBpcyBub3QgbG9uZ2VyIHVzZWQgaW4gdGhlIE1ha2VmaWxlKS4KLQlSZW1vdmUgSE9TVElOR18qIGRlZmluaXRpb25zIHRoYXQgYXJlIHN1YnN1bWVkIGJ5IHRoZQotCW9uZXMgYWRkZWQgdG8gTWFrZWZpbGUuaW4uICBSZW1vdmVkIG1vc3QgZGVmaW5pdGlvbnMgb2YgQ0MuCi0JKiBjb25maWcve3NwYXJjLG5ld3MsaHAzMDBic2QsZGVjc3RhdGlvbn0ubWg6ICBSZW1vdmVkOwotCVRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkLgotCi1GcmkgTWF5IDIyIDEzOjQ3OjE5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFVzZSBzcmNkaXIgaW5zdGVhZCBvZiBWUEFUSCBpbiBsZGdyYW0vbGRsZXgKLQlydWxlcywgc2luY2UgdGhlc2UgYXJlIHVzZWQgd2hlbiBidWlsZGluZyBhIGRpc3RyaWJ1dGlvbi4KLQkqIE1ha2VmaWxlLmluIChsZGxleC5jKTogIERvbid0IHJlLWRpcmVjdCBvdXRwdXQsIHNpbmNlIHRoYXQKLQlsZWF2ZXMgYSBib2d1cyBvdXRwdXQgZmlsZXMgaWYgaXQgZmFpbHMuCi0KLQkqIGNvbmZpZy9zcGFyYy5taDogIEZpeCBIT1NUSU5HX0xJQlMgc28gaXQgaGFzIGEgY2hhbmNlIG9mIHdvcmtpbmcuCi0JKiBsZGxleC5jOiAgRml4IHNvbWUgdW5uZWNlc3NhcnkgZmxleC1zcGVjaWZpYy1pc21zLgotCi1GcmkgTWF5ICA4IDExOjQ5OjQzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogbW92ZSBzcHVyaW91cyBzZW1pY29sb24KLQkqIGxkZXhwLmg6IGZpeCBwcm90b3R5cGUKLQotVGh1IE1heSAgNyAxNzowMToxMiAxOTkyICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiByZWZlcmVuY2VzIHRvIGxpbmtlciBub3cgc2F5ICJsZCIgbm90ICJnbGQiLgotCi1XZWQgTWF5ICA2IDEzOjI2OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JY2hhbmdlZCBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIFFfZW50ZXJfZ2xvYmFsX3JlZgotCSogbGRleHAuYywgbGRsYW5nLmMsIGxkbWFpbi5jOiByZWZsZWN0IHRoaXMKLQkqIGxkdmVyLmM6IGJ1bXAgdmVyc2lvbiB0byAxLjk3LjEKLQkqIGxkaW5kci5jIChhZGRfaW5kaXJlY3QpOiB3aGVuIGFuIGVkaWN0IGRlY2xhcmluZyBhbiBpbmRpcmVjdAotCXN5bWJvbCBpcyBmb3VuZCwgbWFrZSBzdXJlIHRoYXQgYW55IGlkZWFzIGFib3V0IHRoZSBzeW1ib2wgYmVpbmcKLQljb21tb24gYXJlIGNoYW5nZWQgaWYgaXQgbm93IGtub3duIHRvIGJlIGRlZmluZWQuCi0JKiBsZG1haW4uYyAobGluZWFyX2xpYnJhcnkpOiBjb21wbGFpbiBvbmNlIGlmIGFyY2hpdmUgaXNuJ3QKLQlyYW5saWJiZWQuCi0JKiBsZGxhbmcuaCwgbGRsYW5nLmM6IG1ha2Ugcm9vbSBmb3IgYW5kIGluaXRpYWxpemUgdGhlIGNvbXBsYWluCi0Jb25jZSBmaWVsZC4KLQotV2VkIE1heSAgNiAxMTowNzozNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgZmxleCAmIGJpc29uIGZyb20gLi4vIGlmIHRoZXkgZXhpc3QuCi0KLVR1ZSBNYXkgIDUgMTc6NDc6MzMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbGF4LmMgKGJ1aWxkX2l0KTogZG9uJ3QgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIG91dHB1dCBmaWxlIGZvcgotCXN0dWZmIGlmIC1SIGZsYWcgYXBwbHlzIHRvIGl0LgotCSogbGRmaWxlLmM6IG1lcmdlIGluIFZNUyBmaWxlbmFtZSBzdXBwb3J0Ci0JKiBsZG1haW4uYyAobWFpbik6IHRha2Ugb3V0IC4vIGZyb20gbGlicmFyeSBwYXRoLCBhbmQgY2xvc2UgZmlsZQotCWJlZm9yZSB1bmxpbmtpbmcuIE1ha2UgbXVsdGlwbGUgZGVmcyBvZiBhIHN5bWJvbCBjcmVhdGUgYW4KLQl1bmV4ZWNhYmxlIGZpbGUuCi0JKiBsZG1pc2MuYzogZmF0YWwgZXJyb3NycyBkZWxldGUgb3V0cHV0IGZpbGUKLQotVHVlIE1heSAgNSAxNDowNTowNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBJbmNyZWFzZSB2ZXJzaW9uIG51bWJlciB0byAxLjk3LCBmb3IgY29uc2lzdGVuY3kKLQl3aXRoIC4uL2JpbnV0aWxzLgotCi1UdWUgTWF5ICA1IDEyOjEyOjI0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRkxFWCAtPiBMRVguCi0KLQkqIGxkLnRleGluZm86IHt9IC0+IEB7QH0uCi0KLU1vbiBNYXkgIDQgMTc6NTI6NDEgMTk5MiAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogbGQudGV4aW5mbzogZGVzY3JpYmUgYWx0ZXJuYXRlLCBNUkktY29tcGF0aWJsZSBsaW5rZXIgc2NyaXB0cwotCShhbmQgYXNzb2NpYXRlZCBjaGFuZ2UgaW4gLWMgb3B0aW9uLCBub3cgdXNlZCBmb3IgdGhlc2Ugc2NyaXB0cykKLQotTW9uIE1heSAgNCAxNjoxMDoxMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogQnVtcGVkIHZlcnNpb24gdG8gMS45NiAtIG5ldyByZWxlYXNlLCByZXN5bmMgd2l0aCB0aGUKLQliZmQgdG9vICMuCi0JKiBsZGV4cC5jLCBsZGxhbmcuYzogbm93IGJ1aWxkIG1lbW9yeSBzaGFwZSB0cmVlIGluIG9ic3RhY2tzCi0JcmF0aGVyIHRoYW4gd2l0aCByYXcgbWFsbG9jLCBtYWtlcyBpdCBlYXNpZXIgdG8gdHJhY2sgd2hlcmUgbWVtb3J5Ci0JaXMgZ29pbmcuCi0JKiBsZHN5bS5oLCBsZHN5bS5jOiBjcmVhdGUgb2JzdGFjayBmb3IgYWxsIGdsb2JhbCBzeW1ib2xzIHRvby4KLQkqIGxkd3JpdGUuYyAobGR3cml0ZSk6IG1vdmVkIG1hbGxvYyBzbyBvbmx5IHVzZWQgd2hlbiBuZWVkZWQuCi0JKiBzYTI5MjAwLXNjLnNoOiBhZGRlZCBzdXBwb3J0IGZvciAubGl0LCBkYXRhMSBhbmQgZGF0YTIgc2VjdGlvbnMuCi0KLQotRnJpIE1heSAgMSAxODoxNzo1MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NwYXJjLm1oOiB1c2UgLi4vZ2NjL2xpYmdjYy5hIG9uIGNoZWNrIGlmIGl0IGV4aXN0cy4KLQotCSogTWFrZWZpbGUuaW46IHVzZSBib290c3RyYXAgZm9yIGNoZWNrLgotCi1GcmkgTWF5ICAxIDEzOjAzOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSwgbGRsZXguYywgbXJpLmM6IGFkZGVkIG1vcmUgY29tcGF0aWJsZSB3b3JkczsgQkFTRSwgQUxJQVMgYW5kCi0JUFVCTElDLgotCSogTWFrZWZpbGUuaW46IG5vdyB1c2UgZmxleCwgbm90IGxleAotCSogbGRsZXgubCwgbGRsYW5nLmMsIGxkY3Rvci5jOiBsaW50Ci0KLVdlZCBBcHIgMjIgMTI6NDg6NDIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IGFkZGVkIENNREZJTEVOQU1FQ0hBUiBzdGF0ZSBzbyB0aGF0IHlvdSBjYW4gbGV4Ci0JZGlmZmVyZW50IHNvcnRzIG9mIGZpbGVuYW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lIHRoYW4gaW4gYSBzY3JpcHQuCi0KLU1vbiBBcHIgMjAgMjI6Mzc6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHBhc3NlZCBvbiB0aGUKLQkgIG1ha2UgY29tbWFuZCBsaW5lLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotRnJpIEFwciAxNyAwODo1NzoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsYXguYzogYWRkZWQgaGFuZGxpbmcgZm9yIG5ldyAicGFkZGluZyIgc2VjbGV0IHR5cGUsIHVzZWQgdG8KLQlmaWxsIG91dCBnYXBzIGJldHdlZW4gc2VjdGlvbi4KLQkqIGxkZ3JhbS55LCBsZGxleC5sOiBub3cgLWRlZnN5bSBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIGRvbmUKLQlwcm9wZXJseS4KLQotV2VkIEFwciAxNSAyMToyMDowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB0aGUgdG9vbGRpciBjb3B5IG9mIGxkIGdvZXMgZGlyZWN0bHkgaW4gdG9vbGRpci4KLQotV2VkIEFwciAxNSAxNjowOTozMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbXJpLmMsIGxkZ3JhbS55LCBsZGxleC5sOiBhZGRlZCBzdXBwb3J0IGZvciBtaW5pbWFsIHN0cmFuZ2UgbGluawotCXNjcmlwdHMuCi0KLVRodSBBcHIgIDkgMDU6NTI6MDIgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogSW5zdGFsbCBzZWNvbmQgY29weSBpbiAkKHRvb2xkaXIpL2JpbgotCXdpdGhvdXQgJChwcm9ncmFtX3ByZWZpeCksIHNpbmNlIHRoYXQncyB3aGF0IGdjYyBleHBlY3RzLgotCi1TYXQgQXByICA0IDE3OjQ0OjA2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sLCBsZGdyYW0ueSwgbGRsZXguaDogUmV3cm90ZSBsZXhlci4gTm93IGl0J3MgbXVjaCBuaWNlci4KLQkqIGg4MzAwKjogZml4IGJpdCByb3QgYW5kIGFkZCBzdXBwb3J0IGZvciBoODMwMHhyYXkgdGFyZ2V0Ci0JKiBnbzMyLnNoOiB0YXJnZXQgZW11bGF0aW9uIGZvciBnbzMyLgotCi1Nb24gTWFyIDE2IDE0OjUzOjI5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBnbGQ5NjAuZW0sIGk5NjAuc2Mtc2guIEZpeCBpOTYwIGJpdCByb3QKLQotRnJpIE1hciAxMyAxOTo0NzoyMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluc3RhbGwgbWFuIHBhZ2UuCi0KLUZyaSBNYXIgMTMgMDg6MjM6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC08Zm9vPiByZW5hbWVkIHRvIDxmb28+Lm10Ci0JKiBjb25maWcvbWgtPGZvbz4gcmVuYW1lZCB0byA8Zm9vPi5tdAotCSogY29uZmlndXJlLmluIGNoYW5nZWQgdG8gcmVmbGVjdCB0aGlzCi0JKiBnZW5zY3JpcHRzLnNoIG5vdyBtYWtlIC54Ym4gZmlsZXMgcmF0aGVyIHRoYW4gLnhOIGZpbGVzCi0KLVNhdCBNYXIgIDcgMDM6NDA6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmg6IGZpeCBkZWNsIG9mIGxkdmVyc2lvbi4KLQotRnJpIE1hciAgNiAyMjowMDozNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KLQotRnJpIE1hciAgNiAwNjo1OTowNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKFFfZW50ZXJfZmlsZV9zeW1ib2xzKTogbm93IGFsaWFzZXMgd29yayBhZ2FpbgotCi1UaHUgTWFyICA1IDIxOjM5OjI5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2xlYW4taW5mbyB0YXJnZXQuCi0KLVRodSBNYXIgIDUgMTY6NTU6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90cmVlKTogZG9uJ3QgdHJ5IGFuZCBmb2xsb3cgbnVsbCBwb2ludGVycwotCWFyb3VuZC4KLQkqIGxkZ3JhbS55OiByZW1vdmUgMTEgc2hpZnQgcmVkdWNlIGVycm9ycwotCi1UdWUgTWFyICAzIDE1OjQ2OjM5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LgotCi1GcmkgRmViIDI4IDA4OjE3OjQ1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoc2l6ZV9pbnB1dF9zZWN0aW9uKTogZG9uJ3QgbW92ZSBhYnNvbHV0ZSBzZWN0aW9ucwotCWFyb3VuZCEKLQotCi1UaHUgRmViIDI3IDA5OjIwOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogeWV0IGFub3RoZXIgY29weSBvZiB0aGlzIC0gbWF5YmUgaXQgc2hvdWxkIGdvIGludG8KLQlsaWJpYmVydHkgPwotCSogbGRncmFtLnk6IG5vdyAtViBhbmQgLXYgaGF2ZSBkaWZmZXJlbnQgYWN0aW9ucwotCSogbGR2ZXIuYzogaWYgLVYsIHByaW50cyBsaXN0IG9mIGVtdWxhdGlvbnMgY29tcGlsZWQgaW4KLQkqIGxkbWlzYy5jOiBzdXBwb3J0IGZvciBjcGx1cyBkZW1hbmdsaW5nCi0KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLVRodSBGZWIgMjAgMTc6NDM6NDYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIG1rc2NyaXB0IHJ1bGUgaW50byBvbmUgZm9yIC4vbWtzY3JpcHQKLQkoZm9yIHRoZSBzYWtlIG9mIG1ha2VzIHRoYXQgZG9uJ3QgcmVhbGl6ZSB0aGV5J3JlIHRoZSBzYW1lKS4KLQkqIFBPUlRJTkc6ICBBZGQgbW9yZSBkZXRhaWxzLgotCSogZ2Vuc2NyaXB0cy5zaDogIEFkZCBtb3JlIHRhaWxvcmFiaWxpdHkgb2YgREFUQV9BTElHTk1FTlQuCi0KLU1vbiBGZWIgMTcgMTI6MDQ6MzYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhbmQgbmV3IGZpbGVzIGhwMzAwYnNkLnNoLCBjb25maWcvbWgtaHAzMDBic2QsCi0JY29uZmlnL210LWhwMzAwYnNkOiAgTmV3IHBvcnQgdG8gaHAzMDAgcnVubmluZyBCU0QuCi0KLVNhdCBGZWIgMTUgMTM6NTk6NTQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQlNYWpvciByZXdyaXRlIG9mIGhvdyBsZCBpcyBjb25maWd1cmVkLiAgVGhlIG1ham9yIGlkZWEKLQlpcyB0byB1c2Ugc2hlbGwgc2NyaXB0cyB0byBnZW5lcmF0ZSBldmVyeXRoaW5nLgotCSogZ2VuZXJpYy5lbSByZXBsYWNlcyBsZHRlbXBsYXRlLgotCSogT3RoZXIgKi5lbSBmaWxlcyByZXBsYWNlIHZhcmlvdXMgKi5jIGZpbGVzLgotCUEgKi5lbSBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgZ2VuZXJhdGVzIHRoZSBjb3JyZXNwb25kaW5nCi0JbGRfXyouYyBmaWxlIHRoYXQgaW1wbGVtZW50cyBhbiBlbXVsYXRpb24uICBUaGlzIGlzIHVzdWFsbHkKLQlhIHN0cmFpZ2h0ICdjYXQnIG9mIGEgaGVyZS1kb2N1bWVudCwgcG9zc2libHkgd2l0aCBzdWJzdGl0dXRpb25zLgotCSogU2NyaXB0IGZpbGVzICgqLnNjKSBhcmUgcGxhY2VzIGJ5ICouc2Mtc2ggc2NyaXB0cy4KLQlBZ2FpbiwgdGhlc2UgYXJlIHNpbXBsZSBzaGVsbCBzY3JpcHRzIHRoYXQgJ2NhdCcKLQloZXJlLWRvY3VtZW50cywgdXN1YWxseSB3aXRoIHNvbWUgc3Vic3RpdHV0aW9ucy4KLQlUaGUgb3V0cHV0IGEgKi5zYy1zaCBpcyBhIHNjcmlwdCBmaWxlLgotCSogRWFjaCBlbXVsYXRpb24gaXMgZGVmaW5lZCBieSBhIHNob3J0IHNoZWxsIHNjcmlwdCB3aXRoCi0JZXh0ZW5zaW9uICouc2ggdGhhdCBzcGVjaWZpZXMgdGhlIGVtdWxhdGlvbi1zcGVjaWZpYwotCXBhcmFtZXRlcnMgKHN1Y2ggYXMgdGhlIG5hbWUgb2YgdGhlICouc2gtc2MgYW5kICouZW0KLQlmaWxlcyB0byB1c2UpLgotCSogZ2Vuc2NyaXB0LnNoIGlzIHRoZSBtYXN0ZXIgc2hlbGwgc2NyaXB0IHVzZWQgdG8gZ2VuZXJhdGUKLQlhbiBlbXVsYXRpb24uICBJdCBpcyBwYXNzZWQgdmFyaW91cyBhcmd1bWVudCwgaW5jbHVkaW5nCi0JdGhlIG5hbWUgYSB0aGUgZW11bGF0aW9uLXNwZWNpaWMgKi5zaCBmaWxlIHRoYXQgaXQKLQkic291cmNlcyIgdG8gc2V0IHZhcmlhYmxlcyB0byBlbXVsYXRpb24tc3BlY2lmYyBwYXJhbWV0ZXJzLgotCSogY29uZmlnL210LWZvbzogIENoYW5nZWQgRU1VTD1HTERGT09fRU1VTEFUSU9OX05BTUUKLQl0byBFTVVMPWZvby4gKFRoZSBHTERGT09fRU1VTEFUSU9OX05BTUVzIGhhdmUgYmVlIHJlbW92ZWQuKQotCSogY29uZmlnL21oLWZvbzogIFJlbmFtZSBMREVNVUxBVElPTiBuYW1lcyBhcyBhcHByb3ByaWF0ZQotCSh1c3VhbGx5ICdnbGRmb28nIC0+IHBsYWluICdmb28nKS4KLQkqIGxkd3JpdGUuYzogIEZpeGVkIGEgdHlwbyBpbiBhIGNvbW1lbnQuCi0JKiBNYWtlZmlsZS5pbjogIE1ham9yIGNoYW5nZXMuICBSZW1vdmVkIHNvbWUgdGhlIHNlZAotCW1hZ2ljIHRvIGNvbnZlcnRzIHNjcmlwdHMsIHNpbmNlIHRoYXQgaXMgbm93IGhhbmRsZWQKLQlieSBnZW5zY3JpcHRzLnNoIGFuZCB0aGUgKi5zYy1zaCBzY2lwdCBnZW5lcmF0b3JzLgotCSogY29uZmlnLmg6ICBSZW1vdmUgYSBidW5jaCBvZiBtYWNyb3MgZGVmaW5pbmcgZW11bGF0aW9ucwotCWFuZCB0YXJnZXRzLiAgVGhpcyBiZWNvbWVzIG9uZSBsZXNzIGZpbGUgdG8gZWRpdCB3aGVuCi0JYWRkaW5nIGVtdWxhdGlvbnMgb3IgdGFyZ2V0cy4KLQkqIGxkZW11bC5oIChzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogIEFkZAotCWVtdWxhdGlvbl9uYW1lIGFuZCB0YXJnZXRfbmFtZSBmaWVsZHMuCi0JKiBsZGVtdWwuYywgbGRlbXVsLmg6ICBEZWZpbmUgc29tZSBkZWZhdWx0IGZ1bmN0aW9ucyB1c2VkCi0JYnkgbW9zdCBlbXVsYXRpb25zIChhbmQgcmVtb3ZlIGZyb20gdGhlICouZW0gc2NyaXB0cykuCi0JKiBsZGVtdWwuYyAobGRlbXVsX2Nob29zZV90YXJnZXQpOiAgU2VhcmNoIHRoZSBuZXcKLQlsZF9lbXVsYXRpb25zIGFycmF5IHVzaW5nIGEgbG9vcCAoaW5zdGVhZCBvZiBhIGhhcmR3aXJlZAotCW5lc3RlZCBpZiBzdGF0ZW1lbnQpLgotCURlZmluZSB0aGUgbGRfZW11bGF0aW9uIGZyb20gdGhlIGF1dG9tYXRpY2FsbHktZ2VlbnJhdGVkCi0JbGRlbXVsLWxpc3QuaC4gIFRoaXMgbWVhbnMgeW91IG5vIGxvbmdlciBoYXZlIHRvIGVkaXQgbGRlbXVsLmMKLQl0byBhZGQgYSBuZXcgZW11bGF0aW9uLgotCSogbGRtYWluLmM6ICBSZXBsYWNlIHtHTEQsTE5LfTk2MF9FTVVMQVRJT05fTkFNRSBieQotCXRoZWlyIGV4cGFuc2lvbnMsIHNpbmNlIHRoZSBmb3JtZXIgbm8gbG9uZ2VyIGV4aXN0LgotCSogUE9SVElORzogIEEgdmVyeSByb3VnaCBmaXJzdCBkcmFmdCBvZiBhIHBvcnRpbmcgZ3VpZGUuCi0KLQkqIGxkZ3JhbS55LCBsZGxleC5sLCBsZXhzdXAuYzogQ2hhbmdlcyB0byBhbGxvdyBhbiBhc3NpZ25tZW50Ci0JdG8gYmUgdGVybWluYXRlZCBieSBhIG5ldy1saW5lIChpbnN0ZWFkIG9mIHJlcXVpcmluZyBhIHNlbWljb2xvbikuCi0KLU1vbiBGZWIgMTAgMTY6MjE6MDIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmMsIGxkbGFuZy5jOiBhZGRlZCBuZXcgaWRlYSAiYWJzX291dHB1dF9zZWN0aW9uIiwgcmVtb3ZlcwotCXRlc3RzIGZvciBOVUxMIHBvaW50ZXJzIGFsbCBvdmVyIHRoZSBwbGFjZS4KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiByZW1lbWJlciB0byByZWxvY2F0ZSBnbG9iYWwgc3ltYm9scwotCSphZnRlciogcmVsYXhpbmcgaGFzIGRvbmUgaXQgc3R1ZmYuCi0KLVRodSBGZWIgIDYgMTE6NDA6MTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC1jb2ZmLWg4MzAwOiB1c2UgRU1VTCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZQotCSogbGRsYW5nLmM6IChwcmludF9wYWRkaW5nX3N0YXRlbWVudCk6IHByaW50IHRoZSByaWdodCBhZGRyZXNzLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oLCBsZGVtdWwuYzogcmVuYW1lZCAgaDgzMDBoZHMgdG8gaDgzMDBobXMKLQotCi1UdWUgRmViICA0IDE1OjI4OjAxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBQdXQgcGFjayAtbm9pbmhpYml0LWV4ZWMgYW5kIC1zb3J0LWNvbW1vbgotCSogbGRsYW5nLmMgKHByaW50X2RhdGFfc3RhdGVtZW50KTogcHJpbnQgdGhlIHJpZ2h0IGFkZHJlc3MuCi0KLVRodSBKYW4gMzAgMTc6NTE6NTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVGhlIHJ1bGUgZm9yIHRlc3RpbmcgbGQgYnkgcmUtbGlua2luZyBpdHNlbGYKLQl2aWEgYW4gaW50ZXJtZWRpYXRlIC1yIGxpbmsgd2FzIG1vdmVkIHRvIHRoZSBsZDEgcnVsZQotCWluc3RlYWQgb2YgdGhlIGxkMiBydWxlLiAgVGhpcyBhbGxvd3MgbGQyIGFuZCBsZDMgdG8gYmUgaWRlbnRpY2FsLAotCXdoaWNoIGFsbG93cyB0aGUgYm9vdHN0cmFwIHJ1bGUgdG8gd29yay4KLQkqIGxkY3Rvci5jIChmaW5kX2NvbnN0cnVjdG9ycyk6ICBEb24ndCBjcmVhdGUgYSBjb25zdHJ1Y3RvcgotCWxpc3QgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIChhcyB3b3VsZCBoYXBwZW4gaWYgbGQgaXMKLQlpbnZva2VkIGJ5IGNvbGxlY3QpLgotCi1XZWQgSmFuIDI5IDA4OjM1OjM5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3BhcmMuaDogbm93IHVzZXMgbGliZ2NjLmEKLQkqIGxkbWFpbi5jOiBxdWl0IHVzaW5nIGV4aXQKLQkqICpzYzogdXNlICooQ09NTU9OKSByYXRoZXIgdGhhbiBbQ09NTU9OXQotCSogbGRsZXgubCwgbGV4c3VwLmM6IG11Y2ggdGhpbmtpbmcgbW92ZWQgZnJvbSAubCBhbmQgcHV0IGludG8gLmMsCi0JdG8gYWxsb3cgcHJlcHJvY2Vzc2luZyBvZiAubCBmaWxlLgotCSogTWFrZWZpbGUuaW46IE5ldyBsZGxleC5sIG1hbmdsaW5nCi0JKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IHBlcmZvcm0gZXhwcmVzc2lvbnMgd2l0aCAlIGFuZCAvIGluCi0JaW50ZWdlci4KLQkqIGxkZmlsZS5jIChvcGVuX2EpOiBvcGVuIGFyY2hpdmVzIG9uIFZNUyBpbiBhIHNwZWNpYWwgd2F5Ci0KLQotVHVlIEphbiAyOCAxMDoxODoxNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IG1hcCAtTSBiZWhhdmUgaW4gdGhlIHNhbWUgd2F5IGFzIC1NYXAgKHNldHMgZmlsZSBuYW1lCi0JdG8gYmUgIi0iLgotCSogbGRzeW0uYywgbGRsYW5nLmM6IHJlbWVtYmVyIHRoYXQgc2l6ZSBvZiBhIHNlY3Rpb24gaXMgZGVwZW5kZW50IG9uCi0Jd2hldGhlciBvciBub3QgcmVsYXhpbmcgaGFzIGJlZW4gZG9uZS4KLQkqIGxkbWFpbi5jOiBkb24ndCBvcGVuIGEgbWFwIGZpbGUgaWYgaXQgZG9lc24ndCBoYXZlIGEgbmFtZQotCSogcmVsYXguYzogYWxsIHRoZSBicmFpbnMgaGF2ZSBtb3ZlZCBpbnRvIGJmZC4KLQkqIGxkd3JpdGUuYzogYW1tZW5kIGNvbW1lbnQKLQotRnJpIEphbiAyNCAxNDoyMzo0NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHJlbGF4LCBhbHNvIG1hZGUgdGhyZWUgc3RhZ2UgZ28gdGhyb3VnaCBhCi0JcGFydGlhbCBsaW5rIHN0YWdlLgotCSogcmVsYXguYyA6IGFkZGVkCi0JKiBjb25maWcuaDogaWYgR05VOTYwIGRlZmluZWQsIHRoZW4gZGVmYXVsdCBlbXVsYXRpb24gbW9kZSBpcwotCUdMRDk2MAotCSogbGRleHAuaCwgbGRleHAuYzogbWFwIHRvIGZpbGUgaG9va3MKLQkqIGxkbGFuZy5jOiBtYXAgdG8gZmlsZSBob29rcwotCSogbGRncmFtLnk6IGFkZGVkIC1NYXAgLXJlbGF4Ci0JKiBsZGxleC5sOiBhZGRlZCAtcmVsYXgsIC1NYXAKLQkqIGxkbWFpbi5jOiBvcGVuIG1hcCBmaWxlCi0JKiBsZG1pc2MuYzogc3VwcG9ydCBmb3IgbWFwIGZpbGUKLQkqIGxkd3JpdGUuYzogbmV3IHJlbGF4IG1hZ2ljCi0KLVRodSBEZWMgMTkgMTg6NDk6NTEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcvdG0tKi5oOiAgQ2xlYW4gdXAgbWFrZSBvdXRwdXQsIG9ubHkKLQlwYXNzIERFRkFVTFRfRU1VTEFUSU9OIHRvIGxkbWFpbi5jLgotCi1XZWQgRGVjIDE4IDE1OjAyOjQ3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTQuCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjMgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLU1vbiBEZWMgIDkgMTY6MjY6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUGFzcyAteSB0byBiaXNvbi4gIChBZ2FpbjsKLQlhY2NpZGVudGFsbHkgZGVsZXRlZCBieSBSaWNoLikKLQkqIG5ld3Muc2MsIGxkZ2xkNjhrLnNjOiAgRGVmaW5lIF9fZW5kIGFzIHdlbGwgYXMgX2VuZC4KLQotU2F0IERlYyAgNyAxNzoxOToyNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRpbmRyLmg6IGFkZGVkIHRvIGNvbnRhaW4gcHJvdG90eXBlcyBvZiBsZGluZHIuYwotCSogbGRmaWxlLmM6IGluY2x1ZGUgY3R5cGUuaAotCSogbGRtYWluLmM6IGluY2x1ZGUgdGhlIHJlcXVyaWVkIHByb3RvdHlwZSBoZWFkZXJzCi0JKiBsZHdyaXRlLmM6IGdldF9yZWxvY191cHBlcl9ib3VuZCBoYXMgYmVlbiByZW5hbWVkCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZAotCi1GcmkgRGVjICA2IDIzOjI5OjI2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHB1bnQgImZ1bmRhbWVudGFsIiBtb2RlIGJlY2F1c2UgaXQgYnJlYWtzIG15IGVtYWNzCi0JICBtYWNyb3MuICBpbnN0YWxsIHVzaW5nIElOU1RBTExfUFJPR1JBTSBhbmQgSU5TVEFMTF9EQVRBLiAgcmVtb3ZlCi0JICBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMsIGJzZCBtYWtlIGNhbid0IGNvcGUuICBhZGRlZAotCSAgc3RhbmRhcmRzLnRleHQgc3VwcG9ydCBhbmQgbWFkZSBpdCBsb29rIGxpa2UgYWxsIHRoZSBvdGhlcgotCSAgbWFrZWZpbGVzLgotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyZSBub3cgcnVucyBlbnRpcmVseSBpbiBvYmpkaXIgc28gbWFrZSBmaWxlCi0JICBleGlzdGVuY2UgY2hlY2tzIGFnYWluc3QgJHtzcmNkaXJ9LiAgTWFyayB0aGlzIGRpcmVjdG9yeSBhcwotCSAgdGFyZ2V0IGRlcGVuZGVudC4KLQotVGh1IERlYyAgNSAyMjo0NjoxNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLVdlZCBEZWMgIDQgMjM6MzY6NTUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBCdW1wZWQgdmVyc2lvbiB0byAxLjkzLgotCSogTWFrZWZpbGUuaW46ICBQYXNzIC15IHRvIGJpc29uLgotCi1Nb24gTm92IDI1IDE4OjI4OjQwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5oOiBoOCBpcyBub3cgY29mZiwgbm90IGllZWUKLQkqIGg4MzAwaGRzLnNjOiByZWZsZWN0IHRoZSBzYW1lCi0KLVRodSBOb3YgMTQgMTk6NTU6MDkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbigpKTogIFVwZGF0ZSB0byAxLjkyLgotCSogbGRjdG9yLmM6IFRoZXJlIGFyZSB0d28gcGxhY2VzIGNvbnN0cnVjdG9yIHNldHMKLQljYW4gYmUgZGVmaW5lZC4gIE9uZSBvZiB0aGVtIGNoZWNrZWQgZm9yIGFuIGV4aXN0aW5nCi0JZHVwbGljYXRlLCB0aGUgb3RoZXIgZGlkbid0LiAgVW5mb3J0dW5hdGVseSwgdGhlIGxhdHRlcgotCXdhcyBjYWxsZWQgYWZ0ZXIgdGhlIGZvcm1lciAuLi4KLQlTbywgZmFjdG9yIG91dCBjb2RlIGZvciBpbnNlcnRpbmcgYSBuZXcgZWxlbWVudCBpbnRvCi0JY29uc3RydWN0b3JfbmFtZV9saXN0IChhZnRlciBjaGVja2luZyBmb3IgYSBkdXBsaWNhdGUpCi0JaW50byBhIG5ldyBmdW5jdGlvbiBhZGRfY29uc3RydWN0b3JfbmFtZSwgYW5kIGNhbGwKLQlpdCBmcm9tIGJvdGggYWZvcmVtZW50aW9uZWQgcGxhY2VzIChsZGxhbmdfYWRkX2NvbnN0cnVjdG9yCi0JYW5kIGxkbGFuZ19jaGVja19mb3JfY29uc3RydWN0b3JzKS4KLQotV2VkIE5vdiAxMyAxNToxNzo0MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgLmMgZmlsZXMgZ2VuZXJhdGVkIGZyb20gbGR0ZW1wbGF0ZQotCXRvIGhhdmUgbmFtZXMgc3RhcnRpbmcgd2l0aCBsZF9fLiAgVGhpcyBoZWxwcyAnbWFrZSBjbGVhbicuCi0KLVR1ZSBOb3YgMTIgMTg6MzY6NTAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFRha2Ugb3V0IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgaW5zdGFsbAotCSogbTg4a2Jjcy5zYzogcHV0IGluIGNvbnRydWN0b3IgYmxvY2tzLgotCi1Nb24gTm92IDExIDE4OjQ3OjMzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYywgbGRtaXNjLmg6ICBSZS13cml0ZSBpbmZvKCkgdG8gdGFrZSBhIGZpbGVuYW1lCi0JcGFyYW1ldGVyLCBhIGZvcm1hdCwgYW5kIGFuIGFyZyBwb2ludGVyLCBhbmQgcmVuYW1lIGl0IHRvCi0JdmZpbmZvKCkuICBXcml0ZSBpbmZvKCkgaW4gdGVybXMgb2YgbmV3IHZmaW5mbygpLgotCU5ldyBlaW5mbygpIGlzIHRoZSBzYW1lIGFzIGluZm8oKSwgZXhjZXB0IGl0IHdyaXRlcyB0byBzdGRlcnIuCi0JKiBsZGVtdWwuYywgbGRleHAuYywgbGRsYW5nLmMsIGxkbG5rOTYwLmMsIGxkbWFpbi5jLCBsZHdyaXRlLmMsCi0JbGRtaXNjLmM6ICBSZXBsYWNlICJlcnJvciIgY2FsbHMgdG8gaW5mbygpIGJ5IG5ldyBlaW5mbygpLgotCi1Nb24gTm92IDExIDA5OjU3OjMyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCBsZGdyYW0ueTogbWFkZSAtViBvcHRpb24gZG8gc2FtZSBhcyAtdgotCSogTWFrZWZpbGUuaW46IEFkZGVkICQoTUlOVVNfRykgZmxhZyBzbyBkZWJ1Z2dpbmcgY2FuIGJlCi0JdHVybmVkIG9mZgotCi1TdW4gTm92ICAzIDE2OjM3OjM3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQkgaTM4NiBhb3V0IGNoYW5nZXMgZnJvbSBCb2IgS3VrdXJhCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmg6IGFkZGVkIGkzODZhb3V0IHN1cHBvcnQKLQkqIGNvbmZpZ3VyZS5pbjogZml4ZWQgL2gte215aG9zdH0gdHlwbwotCSogbGRncmFtLnk6IC1NTSBub3cgZ2l2ZXMgbW9yZSBib3JpbmcgbWFwLgotCSogbGRsYW5nLmM6IG5vdyBkb2VzIERfUEFHRUQgZmxhZyB0aGUgcmlnaHQgd2F5LgotCSogbGRzeW0uYzogLU1NIGZsYWdzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgotCi1TdW4gTm92ICAzIDE1OjAwOjAzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBGaXhlZCB0eXBvLiAgQWxzbywgYSBmaXggZm9yIGhwMzAwYnNkLgotCSogbGRsYW5nLmMgKGluaXRfb3MpOiAgQ29tcGVuc2F0ZSBmb3IgQkZEIGNoYW5nZSwKLQl3aGVyZSBiZmRfbWFrZV9zZWN0aW9uIG5vdyByZXR1cm5zIE5VTEwgZm9yIGEgZHVwbGljYXRlCi0Jc2VjdGlvbiByZXF1ZXN0LCBpbnN0ZWFkIG9mIHRoZSBvbGQgc2VjdGlvbi4KLQotVGh1IE9jdCAxNyAxNToyNzoxMyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogQnVtcCB0byB2ZXJzaW9uIDEuOTEgKGNvbnNpc3RlbnQgd2l0aCBiaW51dGlscykuCi0KLVdlZCBPY3QgMTYgMTI6Mjc6MDggMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcuaCwgbGQuaCwgbGRlbXVsLmMsIGxkZXhwLmMsIGxkZXhwLmgsCi0JbGRncmFtLnksIGxkbGV4LmwsIGxkbG5rOTYwLmMsIGxkbWFpbi5jLCBsZG1pc2MuYywgbGRtaXNjLmgsCi0JbGRzeW0uYywgbGRzeW0uaCwgbGR0ZW1wbGF0ZSwgbGR2YW5pbGxhLmMsIGxkdmVyLmMsIGxkdmVyLmgsCi0JbGR3YXJuLmMsIGxkd2Fybi5oLCBsZHdyaXRlLmMsIGxkd3JpdGUuaCwgbWtzY3JpcHQuYzoKLQlBZGQgb3IgdXBkYXRlIGNvcHlyaWdodCBub3RpY2VzLgotCi1Nb24gT2N0IDE0IDIzOjU1OjI3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2VkIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgbmFtZSBzY2hlbWUKLQl0byBiZSBjb25zaXN0ZW50IHdpdGggZ2NjLiAgQWxzbyBjaGFuZ2VkICdpbnN0YWxsJy4KLQotTW9uIE9jdCAxNCAxNzozMDowMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgbGQubW0sIGxkLm1lCi0KLU1vbiBPY3QgMTQgMTc6Mjc6MjQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBsZHRlbXBsYXRlOiAgTmVlZCB0byB1c2Ugc2VwYXJhdGUgc2NyaXB0cwotCWZvciAtbiBhbmQgLU4gb3B0aW9ucy4gIFlldCBtb3JlIGNvbXBsaWNhdGlvbi4KLQotRnJpIE9jdCAxMSAyMjo0MDo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCB1c2luZyAkPCBpbiBleHBsaWNpdCBNYWtlIHJ1bGVzIChpdCBkb2Vzbid0Ci0Jd29yaykuICBBZGQgc29tZSBsaW5lcyB0byBhdm9pZCBTdW4gTWFrZSBWUEFUSCBidWdzLgotCi1GcmkgT2N0IDExIDE2OjQyOjIyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBuZXdzLnNjOiBBZGQgYWxpZ25tZW50IGZvciBkYXRhIHNlZ21lbnQuCi0JKiBsZHRlbXBsYXRlOiBBZGQgKHlldCBhbm90aGVyKSBzY3JpcHQgdG8gZ2V0IGZvciAtbiBvciAtTgotCW9wdGlvbnMuICAoVGhlc2UgbmVlZCBkaWZmZXJlbnQgYWxpZ25tZW50IHRoYW4gWk1BR0lDIGZpbGVzLikKLQkqIE1ha2VmaWxlLmluOiAgQWRkIHN0dWZmIGZvciBuZXcgZm9vLnhuIHNjcmlwdHMuCi0JVGhlc2UgYXJlIGdlbmVyYXRlZCBieSByZXBsYWNpbmcgIkFMSUdOKDB4Li4uMDApIiBieSAiLiIuCi0KLUZyaSBPY3QgMTEgMTU6NDM6MDQgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5ldyB0YXJnZXRzIGxkLm1zLCBsZC1pbmRleC5tcwotCWxkLnRleGluZm86IHJlbW92ZSB0YWJzLCBvdGhlciBjbGVhbnVwcyBmb3IgdGV4aTJyb2ZmCi0KLUZyaSBPY3QgMTEgMTM6NTE6NTQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogTWFrZSBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkIGJlIHRydWUKLQlieSBkZWZhdWx0LiAgRG9uJ3QgdGhlIFdQX1RFWFQgYW5kIERfUEFHRUQgZmxhZ3Mgb2YKLQlvdXRwdXRfYmZkIGhlcmU7IGl0J3MgdG9vIGxhdGUsIHNvIHNldCBpdCB3aGVuIG91dHB1dF9iZmQKLQlpcyBjcmVhdGVkIChpbiBsZGxhbmcuYykuICBBbHNvIGZpeCBzZXR0aW5nIG9mIEVYRUNfUCBmbGFnCi0JKiBsZGxhbmcuYyAobGRsYW5nX29wZW5fb3V0cHV0KTogIFNldCBvdXRwdXRfYmZkLT5mbGFncyBoZXJlLgotCSogbGRsYW5nLmM6IFJlbW92ZSBzb21lIGR1cGxpY2F0ZSBleHRlcm4gZGVjbGFyYXRpb25zLgotCSogbGRncmFtLnk6IEZpeGVzIHRvIC1OIGFuZCAtbiBvcHRpb25zLgotCSogTWFrZWZpbGUuaW46ICBSZWNvZ25pemUgdXBwZXIgY2FzZSBsZXR0ZXJzIGluIHNlZCBzY3JpcHQKLQl0byByZW1vdmUgYXNzaWdubWVudHMgZnJvbSBzY3JpcHQgZmlsZXMuCi0JKiBsZHRlbXBsYXRlOiAgRG9uJ3QgYXNzdWttZSB0aGF0IC1OIG9yIC1uIG9wdGlvbnMKLQlpbXBseSB1c2Ugb2YgLXIgc2NyaXB0LgotCSogbWtzY3JpcHQuYzogIFR3ZWFraW5nIHRvIGNvcnJlY3RseSBoYW5kbGUgXG4gYW5kIFxcIGluIGlucHV0LgotCi1GcmkgT2N0IDExIDEwOjI5OjI3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR0ZW1wbGF0ZTogaW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmguCi0KLUZyaSBPY3QgMTEgMDQ6MjQ6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSZXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIHNjaGVtZSBmb3IgYmZkLCBiaW51dGlscywgbGQuCi0KLQkqIGluY2x1ZGUvc3lzL2gtKi5oOiAgTW92ZSB0byBiZmQvaG9zdHMvaC0qLmguCi0JKiBjb25maWd1cmUuaW46ICBSZXZpc2UgdG8gc3ltbGluayBzeXNkZXAuaCB0byAuLi9iZmQvaG9zdHMvaC14eHguaC4KLQlDaGFuZ2Ugc29tZSBjb25maWcgbmFtZXMgdG8gbWF0Y2ggb3RoZXIgZGlycy4KLQkqICouYzogIEluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLCBzbyBhbnNpZGVjbCBhbmQgUFJPVE8oKQotCWdldCBkZWZpbmVkIGZpcnN0LgotCSogY29uZmlnLzogIFJlbmFtZSBzb21lIGNvbmZpZyBmaWxlcyB0byBtYXRjaCB1cCBoLSouaCBuYW1lcy4KLQlSZW1vdmUgYWxsIHRoZSBIT1NUX1NZUyBkZWZpbml0aW9ucyBmcm9tIHRoZSBjb25maWcgZmlsZXMuCi0KLVR1ZSBPY3QgIDggMTY6MDA6NTcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmgsIGxkbGFuZy5oOiBDaGFuZ2UgZW51bSBib29sZWFuIC0+IGVudW0gYmZkX2Jvb2xlYW4uCi0JKiBsZHRlbXBsYXRlOiBSZW1vdmUgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggY2FsbHM7Ci0JanVzdCB1c2UgdGhlIFNFQVJDSF9ESVIgY29tbWFuZHMgaW4gdGhlIHNjcmlwdCBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgTElCX1BBVEggbWFjcm8sIHdoaWNoIGlmIHNldCBpcyB1c2VkIHRvIHJlcGxhY2UKLQl0aGUgU0VBUkNIX0RJUiBjb21tYW5kcyBpbiB0aGUgc2NyaXB0cyAodXNpbmcgdWdseSBzZWQgbWFnaWMpLgotCVRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciBjcm9zcy1saW5raW5nLCB3aGVyZSB5b3Ugd291bGQKLQlwbGFjZSBsaWJhcmllcyBpbiBhIGRpZmZlcmVudCBwbGFjZSB0aGFuIG5hdGl2ZSBsaWJyYXJpZXMuCi0JQWxzbywgZW11bGF0aW9ucyBtYWRlIGZyb20gbGR0ZW1wbGF0ZSBub3cgdXNlICQoc3JjZGlyKS4KLQkqIGxkZ2xkYTI5ay5zYzogIENoYW5nZSBTRUFSQ0hfRElSIGNvbW1hbmRzIHRvIGEgY29udmVudGlvbmFsCi0JZm9ybTsgcGVvcGxlIGNhbiB1c2UgdGhlIE1ha2VmaWxlJ3MgTElCX1BBVEggdG8gb3ZlcnJpZGUuCi0KLVR1ZSBPY3QgIDggMTQ6NTE6MjEgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCB0YXJnZXQgbGQuZHZpLCBhZGQgdGFyZ2V0IGxkLmluZm8KLQlsZC50ZXhpbmZvOiBtYWtlIGluZm8gZmlsZW5hbWUgbGQuaW5mbwotCi1GcmkgT2N0ICA0IDIxOjUxOjU4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIHVzaW5nICQ8IGluIG5vbi1zdWZmaXggcnVsZXMgKGJyZWFrcyBvbiBTdW4KLQlNYWtlKS4KLQkqIGxkZmlsZS5jLCBsZGxhbmcuYywgbGRtYWluLmMsIGxkd3JpdGUuYzogIENvcGUgd2l0aCByZW5hbWVzIG9mIGEKLQlmZXcgQkZEIHR5cGVzICYgZW51bXMuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2xkL01ha2VmaWxlLmFtIGIvbGQvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxMmYuLjAwMDAwMDAKLS0tIGEvbGQvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw5MDIgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi0jIyBGSVhNRTogd29yayBhcm91bmQgYXBwYXJlbnQgYXV0b21ha2UgYnVnLgotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXTsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLzsgZWxzZSBlY2hvIEBZQUNDQDsgZmlgCi1ZRkxBR1MgPSAtZAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF07IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXg7IGVsc2UgZWNobyBATEVYQDsgZmlgCi0KLSMgV2UgcHV0IHRoZSBzY3JpcHRzIGluIHRoZSBkaXJlY3RvcnkgJChzY3JpcHRkaXIpL2xkc2NyaXB0cy4KLSMgV2UgY2FuJ3QgcHV0IHRoZSBzY3JpcHRzIGluICQoZGF0YWRpcikgYmVjYXVzZSB0aGUgU0VBUkNIX0RJUgotIyBkaXJlY3RpdmVzIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZvciBuYXRpdmUgYW5kIGNyb3NzIGxpbmtlcnMuCi1zY3JpcHRkaXIgPSAkKHRvb2xkaXIpL2xpYgotCi1FTVVMID0gQEVNVUxACi1FTVVMQVRJT05fT0ZJTEVTID0gQEVNVUxBVElPTl9PRklMRVNACi1FTVVMX0VYVFJBX09GSUxFUyA9IEBFTVVMX0VYVFJBX09GSUxFU0AKLQotIyBTZWFyY2ggcGF0aCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgLWxmb28gbGlicmFyaWVzLgotIyBJZiBMSUJfUEFUSCBpcyBlbXB0eSwgdGhlIG9uZXMgaW4gdGhlIHNjcmlwdCAoaWYgYW55KSBhcmUgbGVmdCBhbG9uZS4KLSMgKFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiwgdW5sZXNzIGJ1aWxkaW5nCi0jIGEgY3Jvc3MtbGlua2VyLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGlzIGVtcHR5LiAgU2VlIGdlbnNjcmlwdHMuc2guKQotIyBPdGhlcndpc2UsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9uZXMgZ2l2ZW4gaW4gTElCX1BBVEgsCi0jIHdoaWNoIG1heSBoYXZlIHRoZSBmb3JtOiBMSUJfUEFUSD0vbGliOi91c3IvbG9jYWwvbGliCi1MSUJfUEFUSCA9Ci0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIJPSAkKEJBU0VESVIpL2luY2x1ZGUKLU1LREVQID0gbWtkZXAKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB0byBidWlsZAotRE9DVkVSID0gZ2VuCi0KLSNzdHVmZiBmb3Igc2VsZiBob3N0aW5nIChjYW4gYmUgb3ZlcnJpZGRlbiBpbiBjb25maWcgZmlsZSkuCi1IT1NUSU5HX0NSVDAgPSBASE9TVElOR19DUlQwQAotSE9TVElOR19MSUJTID0gQEhPU1RJTkdfTElCU0AKLUhPU1RJTkdfRU1VID0gLW0gJChFTVVMKQotCi0jIFNldHVwIHRoZSB0ZXN0aW5nIGZyYW1ld29yaywgaWYgeW91IGhhdmUgb25lCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgXAotCXRoZW4gZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKLQllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHtzcmNyb290fS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IFwKLQl0aGVuIGVjaG8gJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IDsgXAotCWVsc2UgZWNobyBydW50ZXN0IDsgZmlgCi0KLVJVTlRFU1RGTEFHUyA9Ci0KLUNDX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDQyk7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUNYWCA9IGdjYwotQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1ub2luc3RfUFJPR1JBTVMgPSBsZC1uZXcKLWluZm9fVEVYSU5GT1MgPSBsZC50ZXhpbmZvCi1ub2luc3RfVEVYSU5GT1MgPSBsZGludC50ZXhpbmZvCi1tYW5fTUFOUyA9IGxkLjEKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoQkZERElSKSAtSSQoSU5DRElSKSAtSSQodG9wX3NyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgJChIREVGSU5FUykgJChDRkxBR1MpIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotQkZETElCID0gLi4vYmZkL2xpYmJmZC5sYQotTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLUFMTF9FTVVMQVRJT05TID0gXAotCWVhMjlrLm8gXAotCWVhaXhwcGMubyBcCi0JZWFpeHJzNi5vIFwKLQllYWxwaGEubyBcCi0JZWFyY2VsZi5vIFwKLQllYXJtZWxmLm8gXAotCWVhcm1lbGZfb2FiaS5vIFwKLQllYXJtZWxmX2xpbnV4Lm8gXAotCWVhcm1lbGZfbGludXgyNi5vIFwKLQllYXJtYW91dGIubyBcCi0JZWFybWFvdXRsLm8gXAotCWVhcm1jb2ZmLm8gXAotCWVhcm1uYnNkLm8gXAotCWVhcm1wZS5vIFwKLQllYXJtX2Vwb2NfcGUubyBcCi0JZWNvZmZfc3BhcmMubyBcCi0JZWQxMHZlbGYubyBcCi0JZWQzMHZlbGYubyBcCi0JZWQzMHZfZS5vIFwKLQllZDMwdl9vLm8gXAotCWVkZWx0YTY4Lm8gXAotCWVlYm1vbjI5ay5vIFwKLQllZWxmMzJfc3BhcmMubyBcCi0JZWVsZjMyX2k5NjAubyBcCi0JZWVsZjMyYjQzMDAubyBcCi0JZWVsZjMyYm1pcC5vIFwKLQllZWxmMzJlYm1pcC5vIFwKLQllZWxmMzJlbG1pcC5vIFwKLQllZWxmMzJibWlwbjMyLm8gXAotCWVlbGYzMmw0MzAwLm8gXAotCWVlbGYzMmxtaXAubyBcCi0JZWVsZjMybHBwYy5vIFwKLQllZWxmMzJwcGMubyBcCi0JZWVsZjMycHBjbGludXgubyBcCi0JZWVsZl9pMzg2Lm8gXAotCWVlbGZfaTM4Nl9iZS5vIFwKLQllZ2xkOTYwLm8gXAotCWVnbGQ5NjBjb2ZmLm8gXAotCWVlbGYzMmZyMzAubyBcCi0JZWVsZjMybWNvcmUubyBcCi0JZWg4MzAwLm8gXAotCWVoODMwMGgubyBcCi0JZWg4MzAwcy5vIFwKLQllaDg1MDAubyBcCi0JZWg4NTAwYi5vIFwKLQllaDg1MDBjLm8gXAotCWVoODUwMG0ubyBcCi0JZWg4NTAwcy5vIFwKLQllaHAzMDBic2QubyBcCi0JZWhwM2hwdXgubyBcCi0JZWhwcGFlbGYubyBcCi0JZWkzODZhb3V0Lm8gXAotCWVpMzg2YmVvcy5vIFwKLQllaTM4NmJzZC5vIFwKLQllaTM4NmNvZmYubyBcCi0JZWkzODZnbzMyLm8gXAotCWVpMzg2bGludXgubyBcCi0JZWkzODZseW54Lm8gXAotCWVpMzg2bWFjaC5vIFwKLQllaTM4Nm1vc3MubyBcCi0JZWkzODZtc2Rvcy5vIFwKLQllaTM4Nm5ic2QubyBcCi0JZWkzODZudy5vIFwKLQllaTM4NnBlLm8gXAotCWVpMzg2cGVfcG9zaXgubyBcCi0JZWxuazk2MC5vIFwKLQllbTY4azRrbmJzZC5vIFwKLQllbTY4a2FvdXQubyBcCi0JZW02OGthdXgubyBcCi0JZW02OGtjb2ZmLm8gXAotCWVtNjhrZWxmLm8gXAotCWVtNjhrbGludXgubyBcCi0JZW02OGtseW54Lm8gXAotCWVtNjhrbmJzZC5vIFwKLQllbTY4a3Bzb3MubyBcCi0JZW04OGtiY3MubyBcCi0JZW1jb3JlcGUubyBcCi0JZW1pcHNiaWcubyBcCi0JZW1pcHNic2QubyBcCi0JZW1pcHNpZHQubyBcCi0JZW1pcHNpZHRsLm8gXAotCWVtaXBzbGl0Lm8gXAotCWVtaXBzbG5ld3MubyBcCi0JZW5ld3MubyBcCi0JZXBqZWxmLm8gXAotCWVwamxlbGYubyBcCi0JZW5zMzJrbmJzZC5vIFwKLQllcGM1MzJtYWNoYS5vIFwKLQllcHBjbWFjb3MubyBcCi0JZXBwY253Lm8gXAotCWVwcGNwZS5vIFwKLQllcmlzY2l4Lm8gXAotCWVzYTI5MjAwLm8gXAotCWVzaC5vIFwKLQllc2hlbGYubyBcCi0JZXNobGVsZi5vIFwKLQllc2hsLm8gXAotCWVzcGFyY2FvdXQubyBcCi0JZXNwYXJjbGludXgubyBcCi0JZXNwYXJjbHlueC5vIFwKLQllc3BhcmNuYnNkLm8gXAotCWVzdDIwMDAubyBcCi0JZXN1bjMubyBcCi0JZXN1bjQubyBcCi0JZXRpYzMwYW91dC5vIFwKLQlldGljMzBjb2ZmLm8gXAotCWV0aWM4MGNvZmYubyBcCi0JZXZhbmlsbGEubyBcCi0JZXZheC5vIFwKLQlldnN0YS5vIFwKLQlldzY1Lm8gXAotCWV6ODAwMS5vIFwKLQllejgwMDIubwotCi1BTExfNjRfRU1VTEFUSU9OUyA9IFwKLQllZWxmNjRfc3BhcmMubyBcCi0JZWVsZjY0YWxwaGEubyBcCi0JZWVsZjY0Ym1pcC5vIFwKLQllZWxmNjRocHBhLm8KLQotQUxMX0VNVUxfRVhUUkFfT0ZJTEVTID0gXAotCXBlLWRsbC5vIFwKLQlkZWZmaWxlcC5vCi0KLUNGSUxFUyA9IGxkY3Rvci5jIGxkZW11bC5jIGxkZXhwLmMgbGRmaWxlLmMgbGRsYW5nLmMgXAotCWxkbWFpbi5jIGxkbWlzYy5jIGxkdmVyLmMgbGR3cml0ZS5jIGxleHN1cC5jIFwKLQltcmkuYyBsZGNyZWYuYyBwZS1kbGwuYwotCi1IRklMRVMgPSBsZC5oIGxkY3Rvci5oIGxkZW11bC5oIGxkZXhwLmggbGRmaWxlLmggXAotCWxkbGFuZy5oIGxkbGV4LmggbGRtYWluLmggbGRtaXNjLmggbGR2ZXIuaCBcCi0JbGR3cml0ZS5oIG1yaS5oIGRlZmZpbGUuaCBwZS1kbGwuaAotCi1HRU5FUkFURURfQ0ZJTEVTID0gbGRncmFtLmMgbGRsZXguYyBkZWZmaWxlcC5jCi1HRU5FUkFURURfSEZJTEVTID0gbGRncmFtLmggbGRlbXVsLWxpc3QuaCBkZWZmaWxlcC5oCi0KLU9GSUxFUyA9IGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gbGRtYWluLm8gXAotCWxkd3JpdGUubyBsZGV4cC5vICBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIFwKLQlsZGZpbGUubyBsZGNyZWYubyAke0VNVUxBVElPTl9PRklMRVN9ICR7RU1VTF9FWFRSQV9PRklMRVN9Ci0KLVNUQUdFU1RVRkYgPSAqLm8gbGRzY3JpcHRzLyogZSouYwotCi0jIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBqdXN0IGEgbGlzdCBvZiB0aG9zZSBlbXVsYXRpb24gdGVtcGxhdGUgZmlsZXMKLSMgdGhhdCBjb250YWluIGludGVybmF0aW9uYWxpc2VkIHN0cmluZ3MuCi1FTVVMQVRJT05fRklMRVMgPSBlbXVsdGVtcGwvcGUuZW0gZW11bHRlbXBsL2FybWNvZmYuZW0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChIRklMRVMpICQoRU1VTEFUSU9OX0ZJTEVTKQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1sZG1haW4ubzogbGRtYWluLmMgY29uZmlnLnN0YXR1cwotCSQoQ09NUElMRSkgLWMgLURERUZBVUxUX0VNVUxBVElPTj0nIiQoRU1VTCkiJyAtRFNDUklQVERJUj0nIiQoc2NyaXB0ZGlyKSInIC1EVEFSR0VUPSciQHRhcmdldEAiJyAkKHNyY2RpcikvbGRtYWluLmMKLQotbGRlbXVsLWxpc3QuaDogTWFrZWZpbGUKLQkoZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAgRE8gTk9UIEVESVQhICovIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gImV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkXyQke2Z9X2VtdWxhdGlvbjsiOyBcCi0JZG9uZTtcCi0JZWNobyAiIjtcCi0JZWNobyAiI2RlZmluZSBFTVVMQVRJT05fTElTVCBcXCI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICIgICZsZF8kJHtmfV9lbXVsYXRpb24sIFxcIjsgXAotCWRvbmU7XAotCWVjaG8gIiAgMCIpID5sZGVtdWwtdG1wLmgKLQltdiBsZGVtdWwtdG1wLmggbGRlbXVsLWxpc3QuaAotCi1zdHJpbmdpZnkuc2VkOiAke3NyY2Rpcn0vZW11bHRlbXBsLyQoU1RSSU5HSUZZKQotCSAgY3AgJHtzcmNkaXJ9L2VtdWx0ZW1wbC8kKFNUUklOR0lGWSkgc3RyaW5naWZ5LnNlZAotCi0jIFRoZXNlIGFsbCBzdGFydCB3aXRoIGUgc28gJ21ha2UgY2xlYW4nIGNhbiBmaW5kIHRoZW0uCi0KLUdFTlNDUklQVFMgPSAkKFNIRUxMKSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCAke3NyY2Rpcn0gJHtsaWJkaXJ9IEBob3N0QCBAdGFyZ2V0QCBAdGFyZ2V0X2FsaWFzQCAiQEVNVUxBVElPTl9MSUJQQVRIQCIgIkBOQVRJVkVfTElCX0RJUlNAIgotR0VOX0RFUEVORFMgPSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCBzdHJpbmdpZnkuc2VkCi1AVERJUlNACi0KLWVhMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2EyOWsuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2EyOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGEyOWsgIiQodGRpcl9hMjlrKSIKLWVhaXhwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWl4cHBjICIkKHRkaXJfYWl4cHBjKSIKLWVhaXhyczYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cnM2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWl4cnM2ICIkKHRkaXJfYWl4cnM2KSIKLWVhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hbHBoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWxwaGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFscGhhICIkKHRkaXJfYWxwaGEpIgotZWFyY2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcmNlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJjZWxmICIkKHRkaXJfYXJjZWxmKSIKLWVhcm1lbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmICIkKHRkaXJfYXJtZWxmKSIKLWVhcm1lbGZfb2FiaS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX29hYmkgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9saW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXggIiQodGRpcl9hcm1lbGZfbGludXgpIgotZWFybWVsZl9saW51eDI2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4MjYgIiQodGRpcl9hcm1lbGZfbGludXgyNikiCi1lYXJtYW91dGIuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRiICIkKHRkaXJfYXJtYW91dGIpIgotZWFybWFvdXRsLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1hb3V0bCAiJCh0ZGlyX2FybWFvdXRsKSIKLWVhcm1jb2ZmLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWNvZmYgIiQodGRpcl9hcm1jb2ZmKSIKLWVhcm1uYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybW5ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybW5ic2QgIiQodGRpcl9hcm1uYnNkKSIKLWVhcm1fZXBvY19wZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2Vwb2NwZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtX2Vwb2NfcGUgIiQodGRpcl9hcm1wZSkiCi1lYXJtcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtcGUgIiQodGRpcl9hcm1wZSkiCi1lY29mZl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGNvZmZfc3BhcmMgIiQodGRpcl9jb2ZmX3NwYXJjKSIKLWVkMTB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QxMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQxMHZlbGYgIiQodGRpcl9kMTB2KSIKLWVkMzB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZlbGYgIiQodGRpcl9kMzB2KSIKLWVkMzB2X28uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9vLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X28gIiQodGRpcl9kMzB2KSIKLWVkMzB2X2UuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9lLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X2UgIiQodGRpcl9kMzB2KSIKLWVkZWx0YTY4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2RlbHRhNjguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGRlbHRhNjggIiQodGRpcl9kZWx0YTY4KSIKLWVlYm1vbjI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVibW9uMjlrICIkKHRkaXJfZWJtb24yOWspIgotZWVsZjMyZnIzMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZnIzMCAiJCh0ZGlyX2ZyMzApIgotZWVsZjMybWNvcmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJtY29yZSAiJCh0ZGlyX21jb3JlKSIKLWVtMzJyZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL20zMnJlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTMycmVsZiAiJCh0ZGlyX20zMnIpIgotZWVsZjMyX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMl9zcGFyYyAiJCh0ZGlyX2VsZjMyX3NwYXJjKSIKLWVlbGYzMl9pOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyX2k5NjAgIiQodGRpcl9lbGYzMl9pOTYwKSIKLWVlbGYzMmI0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYjQzMDAgIiQodGRpcl9lbGYzMmI0MzAwKSIKLWVlbGYzMmJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJtaXAgIiQodGRpcl9lbGYzMmJtaXApIgotZWVsZjMyYnNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJic21pcCAiJCh0ZGlyX2VsZjMyYnNtaXApIgotZWVsZjMyZWJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlYm1pcCAiJCh0ZGlyX2VsZjMyZWJtaXApIgotZWVsZjMyZWxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlbG1pcCAiJCh0ZGlyX2VsZjMyZWxtaXApIgotZWVsZjMyYm1pcG4zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYm1pcG4zMiAiJCh0ZGlyX2VsZjMyYm1pcG4zMikiCi1lZWxmMzJsNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmw0MzAwICIkKHRkaXJfZWxmMzJsNDMwMCkiCi1lZWxmMzJsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsbWlwICIkKHRkaXJfZWxmMzJsbWlwKSIKLWVlbGYzMmxwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxwcGMgIiQodGRpcl9lbGYzMmxwcGMpIgotZWVsZjMybHNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsc21pcCAiJCh0ZGlyX2VsZjMybHNtaXApIgotZWVsZjMycHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMnBwYyAiJCh0ZGlyX2VsZjMycHBjKSIKLWVlbGYzMnBwY2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMycHBjbGludXggIiQodGRpcl9lbGYzMnBwY2xpbnV4KSIKLWVlbGY2NGFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0YWxwaGEgIiQodGRpcl9lbGY2NGFscGhhKSIKLWVlbGY2NGhwcGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRocHBhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NGhwcGEgIiQodGRpcl9lbGY2NGhwcGEpIgotZWVsZjY0X3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NF9zcGFyYyAiJCh0ZGlyX2VsZjY0X3NwYXJjKSIKLWVlbGY2NGJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NGJtaXAgIiQodGRpcl9lbGY2NGJtaXApIgotZWVsZl9pMzg2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4NiAiJCh0ZGlyX2VsZl9pMzg2KSIKLWVlbGZfaTM4Nl9iZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmX2kzODZfYmUgIiQodGRpcl9lbGZfaTM4Nl9iZSkiCi1lZ2xkOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dsZDk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjAgIiQodGRpcl9nbGQ5NjApIgotZWdsZDk2MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ2xkOTYwY29mZiAiJCh0ZGlyX2dsZDk2MGNvZmYpIgotZWg4MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDAgIiQodGRpcl9oODMwMCkiCi1laDgzMDBoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMGggIiQodGRpcl9oODMwMGgpIgotZWg4MzAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMHMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDBzICIkKHRkaXJfaDgzMDBzKSIKLWVoODUwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwICIkKHRkaXJfaDg1MDApIgotZWg4NTAwYi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBiICIkKHRkaXJfaDg1MDBiKSIKLWVoODUwMGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwYyAiJCh0ZGlyX2g4NTAwYykiCi1laDg1MDBtLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwbS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBtLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMG0gIiQodGRpcl9oODUwMG0pIgotZWg4NTAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMHMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBzICIkKHRkaXJfaDg1MDBzKSIKLWVocDMwMGJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDMwMGJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHAzMDBic2QgIiQodGRpcl9ocDMwMGJzZCkiCi1laHAzaHB1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDNocHV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDNocHV4ICIkKHRkaXJfaHAzaHB1eCkiCi1laHBwYWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocHBhZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9ocHBhZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocHBhZWxmICIkKHRkaXJfaHBwYWVsZikiCi1laTM4NmFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZhb3V0ICIkKHRkaXJfaTM4NmFvdXQpIgotZWkzODZiZW9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZiZW9zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9iZW9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmJlb3MgIiQodGRpcl9pMzg2YmVvcykiCi1laTM4NmJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YnNkICIkKHRkaXJfaTM4NmJzZCkiCi1laTM4NmNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2Y29mZiAiJCh0ZGlyX2kzODZjb2ZmKSIKLWVpMzg2Z28zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Z28zMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZnbzMyICIkKHRkaXJfaTM4NmdvMzIpIgotZWkzODZsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bGludXggIiQodGRpcl9pMzg2bGludXgpIgotZWkzODZseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nmx5bnggIiQodGRpcl9pMzg2bHlueCkiCi1laTM4Nm1hY2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtYWNoICIkKHRkaXJfaTM4Nm1hY2gpIgotZWkzODZtb3NzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtb3NzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtb3NzICIkKHRkaXJfaTM4Nm1vc3MpIgotZWkzODZtc2Rvcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1zZG9zICIkKHRkaXJfaTM4Nm1zZG9zKSIKLWVpMzg2bmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm5ic2QgIiQodGRpcl9pMzg2bmJzZCkiCi1laTM4Nm53LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bncgIiQodGRpcl9pMzg2bncpIgotZWkzODZwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2cGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NnBlICIkKHRkaXJfaTM4NnBlKSIKLWVpMzg2cGVfcG9zaXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NnBlX3Bvc2l4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZwZV9wb3NpeCAiJCh0ZGlyX2kzODZwZV9wb3NpeCkiCi1lbG5rOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2xuazk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbG5rOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBsbms5NjAgIiQodGRpcl9sbms5NjApIgotZW02OGs0a25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4azRrbmJzZCAiJCh0ZGlyX202OGs0a25ic2QpIgotZW02OGthb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGthb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrYW91dCAiJCh0ZGlyX202OGthb3V0KSIKLWVtNjhrYXV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGthdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGthdXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthdXggIiQodGRpcl9tNjhrYXV4KSIKLWVtNjhrY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtjb2ZmICIkKHRkaXJfbTY4a2NvZmYpIgotZW02OGtlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2VsZiAiJCh0ZGlyX202OGtlbGYpIgotZW02OGtsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbGludXggIiQodGRpcl9tNjhrbGludXgpIgotZW02OGtseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2x5bnggIiQodGRpcl9tNjhrbHlueCkiCi1lbTY4a25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtuYnNkICIkKHRkaXJfbTY4a25ic2QpIgotZW02OGtwc29zLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtwc29zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHNvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a3Bzb3MgIiQodGRpcl9tNjhrcHNvcykiCi1lbTg4a2Jjcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tODhrYmNzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtODhrYmNzICIkKHRkaXJfbTg4a2JjcykiCi1lbWNvcmVwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tY29yZXBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1jb3JlcGUgIiQodGRpcl9tY29yZXBlKSIKLWVtaXBzYmlnLmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzYmlnLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzYmlnCi1lbWlwc2JzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzYnNkCi1lbWlwc2lkdC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzaWR0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHQgIiQodGRpcl9taXBzaWR0KSIKLWVtaXBzaWR0bC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzaWR0bC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzaWR0bCAiJCh0ZGlyX21pcHNpZHRsKSIKLWVtaXBzbGl0LmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzbGl0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzbGl0ICIkKHRkaXJfbWlwc2xpdCkiCi1lbWlwc2xuZXdzLmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzbG5ld3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsbmV3cwotZW1uMTAzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDMwMCAiJCh0ZGlyX21uMTAzMDApIgotZW1uMTAyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDIwMCAiJCh0ZGlyX21uMTAyMDApIgotZW5ld3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbmV3cyAiJCh0ZGlyX25ld3MpIgotZW5zMzJrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9uczMya25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG5zMzJrbmJzZCAiJCh0ZGlyX25zMzJrbmJzZCkiCi1lcGM1MzJtYWNoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwYzUzMm1hY2hhICIkKHRkaXJfcGM1MzJtYWNoYSkiCi1lcGplbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcGplbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBqZWxmICIkKHRkaXJfcGplbGYpIgotZXBqbGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wamxlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBqbGVsZiAiJCh0ZGlyX3BqbGVsZikiCi1lcHBjbWFjb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNtYWNvcyAiJCh0ZGlyX3BwY21hY29zKSIKLWVwcGNudy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNudyAiJCh0ZGlyX3BwY253KSIKLWVwcGNwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BwY3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNwZSAiJCh0ZGlyX3BwY3BlKSIKLWVyaXNjaXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcmlzY2l4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSByaXNjaXggIiQodGRpcl9yaXNjaXgpIgotZXNhMjkyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2EyOTIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2EyOTIwMCAiJCh0ZGlyX3NhMjkyMDApIgotZXNoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2ggIiQodGRpcl9zaCkiCi1lc2hlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNoZWxmICIkKHRkaXJfc2hlbGYpIgotZXNobGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGxlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobGVsZiAiJCh0ZGlyX3NobGVsZikiCi1lc2hsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobCAiJCh0ZGlyX3NobCkiCi1lc3BhcmNhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNhb3V0ICIkKHRkaXJfc3BhcmNhb3V0KSIKLWVzcGFyY2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2xpbnV4ICIkKHRkaXJfc3BhcmNsaW51eCkiCi1lc3BhcmNseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2x5bnggIiQodGRpcl9zcGFyY2x5bngpIgotZXNwYXJjbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbmJzZCAiJCh0ZGlyX3NwYXJjbmJzZCkiCi1lc3QyMDAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N0MjAwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3QyMDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdDIwMDAgIiQodGRpcl9zdDIwMDApIgotZXN1bjMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuMy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjMgIiQodGRpcl9zdW4zKSIKLWVzdW40LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N1bjQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3N1bm9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdW40ICIkKHRkaXJfc3VuNCkiCi1ldGljMzBhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGFvdXQgIiQodGRpcl90aWMzMGFvdXQpIgotZXRpYzMwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWMzMGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljMzBjb2ZmICIkKHRkaXJfdGljMzBjb2ZmKSIKLWV0aWM4MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzgwY29mZiAiJCh0ZGlyX3RpYzgwY29mZikiCi1ldmFuaWxsYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92YW5pbGxhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC92YW5pbGxhLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YW5pbGxhICIkKHRkaXJfdmFuaWxsYSkiCi1ldmF4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZheC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdmF4ICIkKHRkaXJfdmF4KSIKLWV2c3RhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZzdGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZzdGEgIiQodGRpcl92c3RhKSIKLWV2ODUwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3Y4NTAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC92ODUwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2ODUwICIkKHRkaXJfdjg1MCkiCi1ldzY1LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3c2NS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdzY1LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB3NjUgIiQodGRpcl93NjUpIgotZXo4MDAxLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3o4MDAxLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC96ODAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gejgwMDEgIiQodGRpcl96ODAwMSkiCi1lejgwMDIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMiAiJCh0ZGlyX3o4MDAyKSIKLQotbGRfbmV3X1NPVVJDRVMgPSBsZGdyYW0ueSBsZGxleC5sIGxleHN1cC5jIGxkbGFuZy5jIG1yaS5jIGxkY3Rvci5jIGxkbWFpbi5jIFwKLQlsZHdyaXRlLmMgbGRleHAuYyBsZGVtdWwuYyBsZHZlci5jIGxkbWlzYy5jIGxkZmlsZS5jIGxkY3JlZi5jCi1sZF9uZXdfREVQRU5ERU5DSUVTID0gJChFTVVMQVRJT05fT0ZJTEVTKSAkKEVNVUxfRVhUUkFfT0ZJTEVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTERFUFMpCi1sZF9uZXdfTERBREQgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotIyBUaGUgZ2VuZXJhdGVkIGVtdWxhdGlvbiBmaWxlcyBtb3N0bHkgaGF2ZSB0aGUgc2FtZSBkZXBlbmRlbmNpZXMuCi0kKEVNVUxBVElPTl9PRklMRVMpOiAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtYWluLmggbGRlbXVsLmggbGRmaWxlLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkY3Rvci5oIGxkZXhwLmggbGRsYW5nLmggbGRncmFtLmgKLQotIyBUaGlzIGlzIHRoZSByZWFsIGxpYmJmZC5hIGNyZWF0ZWQgYnkgbGlidG9vbC4KLVRFU1RCRkRMSUIgPSBAVEVTVEJGRExJQkAKLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNyb290PWBjZCAkKHNyY2RpcikgJiYgcHdkYDsgZXhwb3J0IHNyY3Jvb3Q7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY3Jvb3R9L3Rlc3RzdWl0ZSBcCi0JCUNDPSIkKENDX0ZPUl9UQVJHRVQpIiBDRkxBR1M9IiQoQ0ZMQUdTKSIgXAotCQlDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIiBDWFhGTEFHUz0iJChDWFhGTEFHUykiIFwKLQkJQ0NfRk9SX0hPU1Q9IiQoQ0MpIiBDRkxBR1NfRk9SX0hPU1Q9IiQoQ0ZMQUdTKSIgXAotCQlPRklMRVM9IiQoT0ZJTEVTKSIgQkZETElCPSIkKFRFU1RCRkRMSUIpIiBcCi0JCUxJQklCRVJUWT0iJChMSUJJQkVSVFkpICQoSU5UTExJQlMpIiBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBSdWxlcyBmb3IgdGVzdGluZyBieSByZWxpbmtpbmcgbGQgaXRzZWxmLgotIyBBIHNpbWlsYXIgdGVzdCBpcyBpbiB0aGUgdGVzdHN1aXRlLiAgVGhpcyB0YXJnZXQgaXMgZm9yIGVhc2Ugb2YgdXNlCi0jIHdoZW4gcG9ydGluZyBsZC4KLQotbGQtcGFydGlhbC5vOiBsZC1uZXckKEVYRUVYVCkKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZC1wYXJ0aWFsLm8gLXIgJChPRklMRVMpCi1sZDEkKEVYRUVYVCk6IGxkLXBhcnRpYWwubwotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMSQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgbGQtcGFydGlhbC5vICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDEtZnVsbCQoRVhFRVhUKTogbGQtbmV3Ci0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxLWZ1bGwkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQyJChFWEVFWFQpOiBsZDEkKEVYRUVYVCkKLQkuL2xkMSQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDIkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQzJChFWEVFWFQpOiBsZDIkKEVYRUVYVCkKLQkuL2xkMiQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDMkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotYm9vdHN0cmFwOiBsZDMkKEVYRUVYVCkKLQljbXAgbGQyJChFWEVFWFQpIGxkMyQoRVhFRVhUKQotCi0uUEhPTlk6IGJvb3RzdHJhcAotCi0jIEEgdGVzdCBwcm9ncmFtIGZvciBDKysgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4KLSMgVGhpcyB0ZXN0IGlzIG5vdyBpbiB0aGUgdGVzdHN1aXRlLgotIwotI2NkdGVzdDogY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vIGxkLm5ldwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QgJChIT1NUSU5HX0NSVDApIFwKLSMJICBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gJChIT1NUSU5HX0xJQlMpCi0jCi0jY2R0ZXN0Lm91dDogY2R0ZXN0Ci0jCS4vY2R0ZXN0ID4gY2R0ZXN0LnRtcAotIwltdiBjZHRlc3QudG1wIGNkdGVzdC5vdXQKLSMKLSNjZHRlc3QtdXIubzogY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vIGxkLm5ldwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIubyAtVXIgY2R0ZXN0LW1haW4ubyBcCi0jCSAgY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubwotIwotI2NkdGVzdC11cjogY2R0ZXN0LXVyLm8KLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0LXVyICQoSE9TVElOR19DUlQwKSBjZHRlc3QtdXIubyBcCi0jCSAgJChIT1NUSU5HX0xJQlMpCi0jCi0jY2R0ZXN0LXVyLm91dDogY2R0ZXN0LXVyCi0jCS4vY2R0ZXN0LXVyID4gY2R0ZXN0LXVyLnRtcAotIwltdiBjZHRlc3QtdXIudG1wIGNkdGVzdC11ci5vdXQKLSMKLSNjaGVjay1jZHRlc3Q6IGNkdGVzdC5vdXQgY2R0ZXN0LXVyLm91dCAkKHNyY2RpcikvY2R0ZXN0LmV4cAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC5vdXQKLSMJZGlmZiAkKHNyY2RpcikvY2R0ZXN0LmV4cCBjZHRlc3QtdXIub3V0Ci0jCi0jLlBIT05ZOiBjaGVjay1jZHRlc3QKLQotIyBFTkQgT0YgQ0hFQ0sgVEFSR0VUUwotCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotIyBNYW51YWwgY29uZmlndXJhdGlvbiBmaWxlOyBub3QgdXN1YWxseSBhdHRhY2hlZCB0byBub3JtYWwgY29uZmlndXJhdGlvbiwKLSMgYmVjYXVzZSBhbG1vc3QgYWxsIGNvbmZpZ3MgdXNlICJnZW4iIHZlcnNpb24gb2YgbWFudWFsLgotIyAgU2V0IERPQ1ZFUiBhYm92ZSB0byBjaGFuZ2UuCi1jb25maWdkb2MudGV4aToJJHtET0NWRVJ9LWRvYy50ZXhpCi0JbG4gLXMgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBsbiAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aQotCi1sZHZlci50ZXhpOiBNYWtlZmlsZQotCXJtIC1mICRACi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gJEAKLQotbGQuaW5mbzogJChzcmNkaXIpL2xkLnRleGluZm8gY29uZmlnZG9jLnRleGkgbGR2ZXIudGV4aQotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpIC1JICQoQkZERElSKS9kb2MgJChzcmNkaXIpL2xkLnRleGluZm8KLQotbGQuZHZpOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mbzokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0iJChNQUtFSU5GTykgLUkgJChzcmNkaXIpIC1JICQoQkZERElSKS9kb2MiICQoVEVYSTJEVkkpICQoc3JjZGlyKS9sZC50ZXhpbmZvCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gbGR2ZXIudGV4aQotCi0jIFdlIHdhbnQgdG8gcmVjb25maWd1cmUgaWYgY29uZmlndXJlLmhvc3Qgb3IgY29uZmlndXJlLnRndCBjaGFuZ2VzLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlndXJlLmhvc3QgJChzcmNkaXIpL2NvbmZpZ3VyZS50Z3QKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGxkMSQoRVhFRVhUKSBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpIFwKLQlsZGVtdWwtbGlzdC5oIGNydGJlZ2luLm8gY3J0ZW5kLm8gbGQubG9nIGxkLnN1bQotbW9zdGx5Y2xlYW4tbG9jYWw6Ci0JLXJtIC1yZiB0bXBkaXIKLUNMRUFORklMRVMgPSBkZXAuc2VkIERFUCBERVAxCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGxkLW5ldyQoRVhFRVhUKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpICQodG9vbGRpcikvYmluCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0Jbj1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBsZC1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQlmaQotCi1pbnN0YWxsLWRhdGEtbG9jYWw6Ci0JJChta2luc3RhbGxkaXJzKSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzCi0JZm9yIGYgaW4gbGRzY3JpcHRzLyo7IGRvIFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGYgJChzY3JpcHRkaXIpLyQkZiA7IFwKLQlkb25lCi0KLSMgU3R1ZmYgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYSBkaXN0cmlidXRpb24uICBUaGUgZGlzdHN0dWZmCi0jIHRhcmdldCBpcyBydW4gYnkgdGhlIHRheiB0YXJnZXQgaW4gLi4vTWFrZWZpbGUuaW4uCi1MRERJU1RTVFVGRiA9IGxkZ3JhbS5jIGxkZ3JhbS5oIGxkbGV4LmMKLWRpc3RzdHVmZjogJChMRERJU1RTVFVGRikgaW5mbwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRkaXJzIHNpdGUuZXhwIHNpdGUuYmFrCi1kaXN0Y2xlYW4tbG9jYWw6Ci0Jcm0gLXJmIGxkc2NyaXB0cwotCi0jIFRhcmdldHMgdG8gcmVidWlsZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBNYWtlZmlsZS4KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIERFUDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLURFUDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIERFUDEKLQlzZWQgLWYgZGVwLnNlZCA8REVQMSA+REVQCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi1ERVAxOiAkKENGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKQotCXJtIC1mIERFUDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQkkKE1LREVQKSAtZiBERVAyICQoSU5DTFVERVMpICQ/Ci0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUDIgREVQMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1sZGN0b3IubzogbGRjdG9yLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oIGxkY3Rvci5oCi1sZGVtdWwubzogbGRlbXVsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkZW11bC5oIFwKLSAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZG1haW4uaCBsZGVtdWwtbGlzdC5oCi1sZGV4cC5vOiBsZGV4cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBsZGdyYW0uaCBsZGxhbmcuaAotbGRmaWxlLm86IGxkZmlsZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZG1haW4uaCBsZGdyYW0uaCBcCi0gIGxkbGV4LmggbGRlbXVsLmgKLWxkbGFuZy5vOiBsZGxhbmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRncmFtLmggbGRleHAuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGxleC5oIGxkbWlzYy5oIFwKLSAgbGRjdG9yLmggbGRmaWxlLmggJChJTkNESVIpL2ZubWF0Y2guaCAkKElOQ0RJUikvZGVtYW5nbGUuaAotbGRtYWluLm86IGxkbWFpbi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL3Byb2dyZXNzLmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRtaXNjLmggbGR3cml0ZS5oIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggXAotICBsZGxleC5oIGxkZmlsZS5oIGxkY3Rvci5oCi1sZG1pc2MubzogbGRtaXNjLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZGdyYW0uaCBsZGxleC5oIGxkbWFpbi5oIGxkZmlsZS5oCi1sZHZlci5vOiBsZHZlci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZHZlci5oIFwKLSAgbGRlbXVsLmggbGRtYWluLmgKLWxkd3JpdGUubzogbGR3cml0ZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGR3cml0ZS5oIFwKLSAgbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmgKLWxleHN1cC5vOiBsZXhzdXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZ3JhbS5oIGxkbGV4LmggbGRmaWxlLmggXAotICBsZHZlci5oIGxkZW11bC5oCi1tcmkubzogbXJpLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZG1pc2MuaCBtcmkuaCBsZGdyYW0uaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWxkY3JlZi5vOiBsZGNyZWYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZG1haW4uaCBsZG1pc2MuaCBsZGV4cC5oIFwKLSAgbGRsYW5nLmgKLXBlLWRsbC5vOiBwZS1kbGwuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCi0gIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oIGxkZW11bC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAuLi9iZmQvbGliY29mZi5oIGRlZmZpbGUuaCBwZS1kbGwuaAotbGRncmFtLm86IGxkZ3JhbS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRleHAuaCBsZHZlci5oIGxkbGFuZy5oIGxkZW11bC5oIGxkZmlsZS5oIGxkbWlzYy5oIFwKLSAgbGRtYWluLmggbXJpLmggbGRjdG9yLmggbGRsZXguaAotbGRsZXgubzogbGRsZXguYyAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIGxkLmggbGRncmFtLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZGxleC5oIFwKLSAgbGRtYWluLmgKLWRlZmZpbGVwLm86IGRlZmZpbGVwLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBsZC5oIGxkbWlzYy5oIGRlZmZpbGUuaAotCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL2xkL01ha2VmaWxlLmluIGIvbGQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTM2ZGQuLjAwMDAwMDAKLS0tIGEvbGQvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTg3ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFTID0gQEFTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FTVVMQVRJT05fTElCUEFUSCA9IEBFTVVMQVRJT05fTElCUEFUSEAKLUVYRUVYVCA9IEBFWEVFWFRACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUhERUZJTkVTID0gQEhERUZJTkVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OQVRJVkVfTElCX0RJUlMgPSBATkFUSVZFX0xJQl9ESVJTQAotTk0gPSBATk1ACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1TVFJJTkdJRlkgPSBAU1RSSU5HSUZZQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwkKHNyY2RpcikvLi4vYmlzb24vOyBlbHNlIGVjaG8gQFlBQ0NAOyBmaWAKLVlGTEFHUyA9IC1kCi1MRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXTsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleDsgZWxzZSBlY2hvIEBMRVhAOyBmaWAKLQotIyBXZSBwdXQgdGhlIHNjcmlwdHMgaW4gdGhlIGRpcmVjdG9yeSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzLgotIyBXZSBjYW4ndCBwdXQgdGhlIHNjcmlwdHMgaW4gJChkYXRhZGlyKSBiZWNhdXNlIHRoZSBTRUFSQ0hfRElSCi0jIGRpcmVjdGl2ZXMgbmVlZCB0byBiZSBkaWZmZXJlbnQgZm9yIG5hdGl2ZSBhbmQgY3Jvc3MgbGlua2Vycy4KLXNjcmlwdGRpciA9ICQodG9vbGRpcikvbGliCi0KLUVNVUwgPSBARU1VTEAKLUVNVUxBVElPTl9PRklMRVMgPSBARU1VTEFUSU9OX09GSUxFU0AKLUVNVUxfRVhUUkFfT0ZJTEVTID0gQEVNVUxfRVhUUkFfT0ZJTEVTQAotCi0jIFNlYXJjaCBwYXRoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGZvciAtbGZvbyBsaWJyYXJpZXMuCi0jIElmIExJQl9QQVRIIGlzIGVtcHR5LCB0aGUgb25lcyBpbiB0aGUgc2NyaXB0IChpZiBhbnkpIGFyZSBsZWZ0IGFsb25lLgotIyAoVGhlIGRlZmF1bHQgaXMgdXN1YWxseSAvbGliOi91c3IvbGliOi91c3IvbG9jYWwvbGliLCB1bmxlc3MgYnVpbGRpbmcKLSMgYSBjcm9zcy1saW5rZXIsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgaXMgZW1wdHkuICBTZWUgZ2Vuc2NyaXB0cy5zaC4pCi0jIE90aGVyd2lzZSwgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgb25lcyBnaXZlbiBpbiBMSUJfUEFUSCwKLSMgd2hpY2ggbWF5IGhhdmUgdGhlIGZvcm06IExJQl9QQVRIPS9saWI6L3Vzci9sb2NhbC9saWIKLUxJQl9QQVRIID0gCi0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIgPSAkKEJBU0VESVIpL2luY2x1ZGUKLU1LREVQID0gbWtkZXAKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB0byBidWlsZAotRE9DVkVSID0gZ2VuCi0KLSNzdHVmZiBmb3Igc2VsZiBob3N0aW5nIChjYW4gYmUgb3ZlcnJpZGRlbiBpbiBjb25maWcgZmlsZSkuCi1IT1NUSU5HX0NSVDAgPSBASE9TVElOR19DUlQwQAotSE9TVElOR19MSUJTID0gQEhPU1RJTkdfTElCU0AKLUhPU1RJTkdfRU1VID0gLW0gJChFTVVMKQotCi0jIFNldHVwIHRoZSB0ZXN0aW5nIGZyYW1ld29yaywgaWYgeW91IGhhdmUgb25lCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgXAotCXRoZW4gZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKLQllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLQotUlVOVEVTVCA9IGBpZiBbIC1mICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgXAotCXRoZW4gZWNobyAkJHtzcmNyb290fS8uLi9kZWphZ251L3J1bnRlc3QgOyBcCi0JZWxzZSBlY2hvIHJ1bnRlc3QgOyBmaWAKLQotCi1SVU5URVNURkxBR1MgPSAKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotCi1DWFggPSBnY2MKLUNYWF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ1hYKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotCi1ub2luc3RfUFJPR1JBTVMgPSBsZC1uZXcKLWluZm9fVEVYSU5GT1MgPSBsZC50ZXhpbmZvCi1ub2luc3RfVEVYSU5GT1MgPSBsZGludC50ZXhpbmZvCi1tYW5fTUFOUyA9IGxkLjEKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoQkZERElSKSAtSSQoSU5DRElSKSAtSSQodG9wX3NyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgJChIREVGSU5FUykgJChDRkxBR1MpIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotQkZETElCID0gLi4vYmZkL2xpYmJmZC5sYQotTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLUFMTF9FTVVMQVRJT05TID0gXAotCWVhMjlrLm8gXAotCWVhaXhwcGMubyBcCi0JZWFpeHJzNi5vIFwKLQllYWxwaGEubyBcCi0JZWFyY2VsZi5vIFwKLQllYXJtZWxmLm8gXAotCWVhcm1lbGZfb2FiaS5vIFwKLQllYXJtZWxmX2xpbnV4Lm8gXAotCWVhcm1lbGZfbGludXgyNi5vIFwKLQllYXJtYW91dGIubyBcCi0JZWFybWFvdXRsLm8gXAotCWVhcm1jb2ZmLm8gXAotCWVhcm1uYnNkLm8gXAotCWVhcm1wZS5vIFwKLQllYXJtX2Vwb2NfcGUubyBcCi0JZWNvZmZfc3BhcmMubyBcCi0JZWQxMHZlbGYubyBcCi0JZWQzMHZlbGYubyBcCi0JZWQzMHZfZS5vIFwKLQllZDMwdl9vLm8gXAotCWVkZWx0YTY4Lm8gXAotCWVlYm1vbjI5ay5vIFwKLQllZWxmMzJfc3BhcmMubyBcCi0JZWVsZjMyX2k5NjAubyBcCi0JZWVsZjMyYjQzMDAubyBcCi0JZWVsZjMyYm1pcC5vIFwKLQllZWxmMzJlYm1pcC5vIFwKLQllZWxmMzJlbG1pcC5vIFwKLQllZWxmMzJibWlwbjMyLm8gXAotCWVlbGYzMmw0MzAwLm8gXAotCWVlbGYzMmxtaXAubyBcCi0JZWVsZjMybHBwYy5vIFwKLQllZWxmMzJwcGMubyBcCi0JZWVsZjMycHBjbGludXgubyBcCi0JZWVsZl9pMzg2Lm8gXAotCWVlbGZfaTM4Nl9iZS5vIFwKLQllZ2xkOTYwLm8gXAotCWVnbGQ5NjBjb2ZmLm8gXAotCWVlbGYzMmZyMzAubyBcCi0JZWVsZjMybWNvcmUubyBcCi0JZWg4MzAwLm8gXAotCWVoODMwMGgubyBcCi0JZWg4MzAwcy5vIFwKLQllaDg1MDAubyBcCi0JZWg4NTAwYi5vIFwKLQllaDg1MDBjLm8gXAotCWVoODUwMG0ubyBcCi0JZWg4NTAwcy5vIFwKLQllaHAzMDBic2QubyBcCi0JZWhwM2hwdXgubyBcCi0JZWhwcGFlbGYubyBcCi0JZWkzODZhb3V0Lm8gXAotCWVpMzg2YmVvcy5vIFwKLQllaTM4NmJzZC5vIFwKLQllaTM4NmNvZmYubyBcCi0JZWkzODZnbzMyLm8gXAotCWVpMzg2bGludXgubyBcCi0JZWkzODZseW54Lm8gXAotCWVpMzg2bWFjaC5vIFwKLQllaTM4Nm1vc3MubyBcCi0JZWkzODZtc2Rvcy5vIFwKLQllaTM4Nm5ic2QubyBcCi0JZWkzODZudy5vIFwKLQllaTM4NnBlLm8gXAotCWVpMzg2cGVfcG9zaXgubyBcCi0JZWxuazk2MC5vIFwKLQllbTY4azRrbmJzZC5vIFwKLQllbTY4a2FvdXQubyBcCi0JZW02OGthdXgubyBcCi0JZW02OGtjb2ZmLm8gXAotCWVtNjhrZWxmLm8gXAotCWVtNjhrbGludXgubyBcCi0JZW02OGtseW54Lm8gXAotCWVtNjhrbmJzZC5vIFwKLQllbTY4a3Bzb3MubyBcCi0JZW04OGtiY3MubyBcCi0JZW1jb3JlcGUubyBcCi0JZW1pcHNiaWcubyBcCi0JZW1pcHNic2QubyBcCi0JZW1pcHNpZHQubyBcCi0JZW1pcHNpZHRsLm8gXAotCWVtaXBzbGl0Lm8gXAotCWVtaXBzbG5ld3MubyBcCi0JZW5ld3MubyBcCi0JZXBqZWxmLm8gXAotCWVwamxlbGYubyBcCi0JZW5zMzJrbmJzZC5vIFwKLQllcGM1MzJtYWNoYS5vIFwKLQllcHBjbWFjb3MubyBcCi0JZXBwY253Lm8gXAotCWVwcGNwZS5vIFwKLQllcmlzY2l4Lm8gXAotCWVzYTI5MjAwLm8gXAotCWVzaC5vIFwKLQllc2hlbGYubyBcCi0JZXNobGVsZi5vIFwKLQllc2hsLm8gXAotCWVzcGFyY2FvdXQubyBcCi0JZXNwYXJjbGludXgubyBcCi0JZXNwYXJjbHlueC5vIFwKLQllc3BhcmNuYnNkLm8gXAotCWVzdDIwMDAubyBcCi0JZXN1bjMubyBcCi0JZXN1bjQubyBcCi0JZXRpYzMwYW91dC5vIFwKLQlldGljMzBjb2ZmLm8gXAotCWV0aWM4MGNvZmYubyBcCi0JZXZhbmlsbGEubyBcCi0JZXZheC5vIFwKLQlldnN0YS5vIFwKLQlldzY1Lm8gXAotCWV6ODAwMS5vIFwKLQllejgwMDIubwotCi0KLUFMTF82NF9FTVVMQVRJT05TID0gXAotCWVlbGY2NF9zcGFyYy5vIFwKLQllZWxmNjRhbHBoYS5vIFwKLQllZWxmNjRibWlwLm8gXAotCWVlbGY2NGhwcGEubwotCi0KLUFMTF9FTVVMX0VYVFJBX09GSUxFUyA9IFwKLQlwZS1kbGwubyBcCi0JZGVmZmlsZXAubwotCi0KLUNGSUxFUyA9IGxkY3Rvci5jIGxkZW11bC5jIGxkZXhwLmMgbGRmaWxlLmMgbGRsYW5nLmMgXAotCWxkbWFpbi5jIGxkbWlzYy5jIGxkdmVyLmMgbGR3cml0ZS5jIGxleHN1cC5jIFwKLQltcmkuYyBsZGNyZWYuYyBwZS1kbGwuYwotCi0KLUhGSUxFUyA9IGxkLmggbGRjdG9yLmggbGRlbXVsLmggbGRleHAuaCBsZGZpbGUuaCBcCi0JbGRsYW5nLmggbGRsZXguaCBsZG1haW4uaCBsZG1pc2MuaCBsZHZlci5oIFwKLQlsZHdyaXRlLmggbXJpLmggZGVmZmlsZS5oIHBlLWRsbC5oCi0KLQotR0VORVJBVEVEX0NGSUxFUyA9IGxkZ3JhbS5jIGxkbGV4LmMgZGVmZmlsZXAuYwotR0VORVJBVEVEX0hGSUxFUyA9IGxkZ3JhbS5oIGxkZW11bC1saXN0LmggZGVmZmlsZXAuaAotCi1PRklMRVMgPSBsZGdyYW0ubyBsZGxleC5vIGxleHN1cC5vIGxkbGFuZy5vIG1yaS5vIGxkY3Rvci5vIGxkbWFpbi5vIFwKLQlsZHdyaXRlLm8gbGRleHAubyAgbGRlbXVsLm8gbGR2ZXIubyBsZG1pc2MubyBcCi0JbGRmaWxlLm8gbGRjcmVmLm8gJHtFTVVMQVRJT05fT0ZJTEVTfSAke0VNVUxfRVhUUkFfT0ZJTEVTfQotCi0KLVNUQUdFU1RVRkYgPSAqLm8gbGRzY3JpcHRzLyogZSouYwotCi0jIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBqdXN0IGEgbGlzdCBvZiB0aG9zZSBlbXVsYXRpb24gdGVtcGxhdGUgZmlsZXMKLSMgdGhhdCBjb250YWluIGludGVybmF0aW9uYWxpc2VkIHN0cmluZ3MuCi1FTVVMQVRJT05fRklMRVMgPSBlbXVsdGVtcGwvcGUuZW0gZW11bHRlbXBsL2FybWNvZmYuZW0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChIRklMRVMpICQoRU1VTEFUSU9OX0ZJTEVTKQotCi0jIFRoZXNlIGFsbCBzdGFydCB3aXRoIGUgc28gJ21ha2UgY2xlYW4nIGNhbiBmaW5kIHRoZW0uCi0KLUdFTlNDUklQVFMgPSAkKFNIRUxMKSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCAke3NyY2Rpcn0gJHtsaWJkaXJ9IEBob3N0QCBAdGFyZ2V0QCBAdGFyZ2V0X2FsaWFzQCAiQEVNVUxBVElPTl9MSUJQQVRIQCIgIkBOQVRJVkVfTElCX0RJUlNAIgotR0VOX0RFUEVORFMgPSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCBzdHJpbmdpZnkuc2VkCi0KLWxkX25ld19TT1VSQ0VTID0gbGRncmFtLnkgbGRsZXgubCBsZXhzdXAuYyBsZGxhbmcuYyBtcmkuYyBsZGN0b3IuYyBsZG1haW4uYyBcCi0JbGR3cml0ZS5jIGxkZXhwLmMgbGRlbXVsLmMgbGR2ZXIuYyBsZG1pc2MuYyBsZGZpbGUuYyBsZGNyZWYuYwotCi1sZF9uZXdfREVQRU5ERU5DSUVTID0gJChFTVVMQVRJT05fT0ZJTEVTKSAkKEVNVUxfRVhUUkFfT0ZJTEVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTERFUFMpCi1sZF9uZXdfTERBREQgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotIyBUaGlzIGlzIHRoZSByZWFsIGxpYmJmZC5hIGNyZWF0ZWQgYnkgbGlidG9vbC4KLVRFU1RCRkRMSUIgPSBAVEVTVEJGRExJQkAKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBsZHZlci50ZXhpCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGxkMSQoRVhFRVhUKSBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpIFwKLQlsZGVtdWwtbGlzdC5oIGNydGJlZ2luLm8gY3J0ZW5kLm8gbGQubG9nIGxkLnN1bQotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCBERVAgREVQMQotCi0jIFN0dWZmIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgZGlzdHJpYnV0aW9uLiAgVGhlIGRpc3RzdHVmZgotIyB0YXJnZXQgaXMgcnVuIGJ5IHRoZSB0YXogdGFyZ2V0IGluIC4uL01ha2VmaWxlLmluLgotTERESVNUU1RVRkYgPSBsZGdyYW0uYyBsZGdyYW0uaCBsZGxleC5jCi0KLURJU1RDTEVBTkZJTEVTID0gdGRpcnMgc2l0ZS5leHAgc2l0ZS5iYWsKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1ub2luc3RfUFJPR1JBTVMgPSAgbGQtbmV3JChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKG5vaW5zdF9QUk9HUkFNUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotbGRfbmV3X09CSkVDVFMgPSAgbGRncmFtLm8gbGRsZXgubyBsZXhzdXAubyBsZGxhbmcubyBtcmkubyBsZGN0b3IubyBcCi1sZG1haW4ubyBsZHdyaXRlLm8gbGRleHAubyBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIGxkZmlsZS5vIGxkY3JlZi5vCi1sZF9uZXdfTERGTEFHUyA9IAotTEVYX09VVFBVVF9ST09UID0gQExFWF9PVVRQVVRfUk9PVEAKLUxFWExJQiA9IEBMRVhMSUJACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLVRFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4Ci1JTkZPX0RFUFMgPSBsZC5pbmZvCi1EVklTID0gbGQuZHZpCi1URVhJTkZPUyA9IGxkLnRleGluZm8KLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotTUFOUyA9ICQobWFuX01BTlMpCi0KLU5ST0ZGID0gbnJvZmYKLURJU1RfQ09NTU9OID0gIFJFQURNRSAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFwKLU5FV1MgVE9ETyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBjb25maWcuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBcCi1sZGdyYW0uYyBsZGxleC5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGxkX25ld19TT1VSQ0VTKQotT0JKRUNUUyA9ICQobGRfbmV3X09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X1BST0dSQU1TKSIgfHwgcm0gLWYgJChub2luc3RfUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotbGQtbmV3JChFWEVFWFQpOiAkKGxkX25ld19PQkpFQ1RTKSAkKGxkX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGxkLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChsZF9uZXdfTERGTEFHUykgJChsZF9uZXdfT0JKRUNUUykgJChsZF9uZXdfTERBREQpICQoTElCUykKLS5sLmM6Ci0JJChMRVgpICQoQU1fTEZMQUdTKSAkKExGTEFHUykgJDwgJiYgbXYgJChMRVhfT1VUUFVUX1JPT1QpLmMgJEAKLS55LmM6Ci0JJChZQUNDKSAkKEFNX1lGTEFHUykgJChZRkxBR1MpICQ8ICYmIG12IHkudGFiLmMgJCouYwotCWlmIHRlc3QgLWYgeS50YWIuaDsgdGhlbiBcCi0JaWYgY21wIC1zIHkudGFiLmggJCouaDsgdGhlbiBybSAtZiB5LnRhYi5oOyBlbHNlIG12IHkudGFiLmggJCouaDsgZmk7IFwKLQllbHNlIDo7IGZpCi1sZGdyYW0uaDogbGRncmFtLmMKLQotCi1sZC5pbmZvOiBsZC50ZXhpbmZvCi1sZC5kdmk6IGxkLnRleGluZm8KLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgbGQuYXV4IGxkLmNwIGxkLmNwcyBsZC5kdmkgbGQuZm4gbGQuZm5zIGxkLmt5IGxkLmt5cyBsZC5wcyBcCi0JICBsZC5sb2cgbGQucGcgbGQudG9jIGxkLnRwIGxkLnRwcyBsZC52ciBsZC52cnMgbGQub3AgbGQudHIgXAotCSAgbGQuY3YgbGQuY24KLQotY2xlYW4tYW1pbmZvOgotCi1kaXN0Y2xlYW4tYW1pbmZvOgotCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKLQlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKLQkgIHJtIC1mICQkaTsgXAotCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCi0JICAgIHJtIC1mICQkaS1bMC05XSo7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCi0KLWluc3RhbGwtbWFuMToKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbjFkaXIpCi0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKLQkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLQotdW5pbnN0YWxsLW1hbjE6Ci0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi1pbnN0YWxsLW1hbjogJChNQU5TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtbWFuMQotdW5pbnN0YWxsLW1hbjoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1tYW4xCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIGRpc3QtaW5mbwotCi1ERUpBVE9PTCA9ICQoUEFDS0FHRSkKLQotUlVOVEVTVERFRkFVTFRGTEFHUyA9IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHNyY2Rpcgotc2l0ZS5leHA6IE1ha2VmaWxlCi0JQGVjaG8gJ01ha2luZyBhIG5ldyBzaXRlLmV4cCBmaWxlLi4uJwotCUB0ZXN0ICEgLWYgc2l0ZS5iYWsgfHwgcm0gLWYgc2l0ZS5iYWsKLQlAZWNobyAnIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjJyA+ICRALXQKLQlAZWNobyAnIyBEbyBub3QgZWRpdCBoZXJlLiAgSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzJyA+PiAkQC10Ci0JQGVjaG8gJyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0b29sICQoREVKQVRPT0wpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBzcmNkaXIgJChzcmNkaXIpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBvYmpkaXInIGBwd2RgID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfYWxpYXMgJChob3N0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF90cmlwbGV0ICQoaG9zdF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X2FsaWFzICQodGFyZ2V0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X3RyaXBsZXQgJCh0YXJnZXRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX2FsaWFzICQoYnVpbGRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gTm90IEVkaXQgIyMnID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IHNlZCAnMSwvXiMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlLiojIy8gZCcgc2l0ZS5leHAgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgbXYgc2l0ZS5leHAgc2l0ZS5iYWsKLQlAbXYgJEAtdCBzaXRlLmV4cAotaW5mby1hbTogJChJTkZPX0RFUFMpCi1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOiAkKERWSVMpCi1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLURFSkFHTlUKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtbG9jYWwKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogImxkbGV4bGxkZ3JhbWhsZGdyYW1jJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mIGxkbGV4bCBsZGdyYW1oIGxkZ3JhbWMgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIFwKLQkJbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JCW1vc3RseWNsZWFuLWxvY2FsCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIFwKLQkJY2xlYW4tYW1pbmZvIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCi0JCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtIGRpc3RjbGVhbi1sb2NhbAotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCi0JCW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi10YWdzIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1jbGVhbi1ub2luc3RQUk9HUkFNUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gXAotbW9zdGx5Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIFwKLW1haW50YWluZXItY2xlYW4tYW1pbmZvIGluc3RhbGwtbWFuMSB1bmluc3RhbGwtbWFuMSBpbnN0YWxsLW1hbiBcCi11bmluc3RhbGwtbWFuIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCi1kaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGNoZWNrLURFSkFHTlUgXAotaW5mby1hbSBpbmZvIGR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBcCi1pbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1pbmZvIGFsbC1yZWN1cnNpdmUtYW0gaW5zdGFsbC1leGVjLWxvY2FsIFwKLWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtZGF0YS1hbSBcCi1pbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IFwKLWFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi1kaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCi1tb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWxkbWFpbi5vOiBsZG1haW4uYyBjb25maWcuc3RhdHVzCi0JJChDT01QSUxFKSAtYyAtRERFRkFVTFRfRU1VTEFUSU9OPSciJChFTVVMKSInIC1EU0NSSVBURElSPSciJChzY3JpcHRkaXIpIicgLURUQVJHRVQ9JyJAdGFyZ2V0QCInICQoc3JjZGlyKS9sZG1haW4uYwotCi1sZGVtdWwtbGlzdC5oOiBNYWtlZmlsZQotCShlY2hvICIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuICBETyBOT1QgRURJVCEgKi8iO1wKLQlmb3IgZiBpbiBgZWNobyAiICIgJHtFTVVMQVRJT05fT0ZJTEVTfSAiIiBcCi0JIHwgc2VkIC1lICdzLyBlLyBsZC9nJyAtZSAncy8gbGQvIC9nJyAtZSAncy9bLl1vLy9nJ2A7IGRvIFwKLQkgICAgZWNobyAiZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfJCR7Zn1fZW11bGF0aW9uOyI7IFwKLQlkb25lO1wKLQllY2hvICIiO1wKLQllY2hvICIjZGVmaW5lIEVNVUxBVElPTl9MSVNUIFxcIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gIiAgJmxkXyQke2Z9X2VtdWxhdGlvbiwgXFwiOyBcCi0JZG9uZTtcCi0JZWNobyAiICAwIikgPmxkZW11bC10bXAuaAotCW12IGxkZW11bC10bXAuaCBsZGVtdWwtbGlzdC5oCi0KLXN0cmluZ2lmeS5zZWQ6ICR7c3JjZGlyfS9lbXVsdGVtcGwvJChTVFJJTkdJRlkpCi0JICBjcCAke3NyY2Rpcn0vZW11bHRlbXBsLyQoU1RSSU5HSUZZKSBzdHJpbmdpZnkuc2VkCi1AVERJUlNACi0KLWVhMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2EyOWsuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2EyOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGEyOWsgIiQodGRpcl9hMjlrKSIKLWVhaXhwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWl4cHBjICIkKHRkaXJfYWl4cHBjKSIKLWVhaXhyczYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cnM2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWl4cnM2ICIkKHRkaXJfYWl4cnM2KSIKLWVhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hbHBoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWxwaGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFscGhhICIkKHRkaXJfYWxwaGEpIgotZWFyY2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcmNlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJjZWxmICIkKHRkaXJfYXJjZWxmKSIKLWVhcm1lbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmICIkKHRkaXJfYXJtZWxmKSIKLWVhcm1lbGZfb2FiaS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX29hYmkgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9saW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXggIiQodGRpcl9hcm1lbGZfbGludXgpIgotZWFybWVsZl9saW51eDI2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4MjYgIiQodGRpcl9hcm1lbGZfbGludXgyNikiCi1lYXJtYW91dGIuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRiICIkKHRkaXJfYXJtYW91dGIpIgotZWFybWFvdXRsLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1hb3V0bCAiJCh0ZGlyX2FybWFvdXRsKSIKLWVhcm1jb2ZmLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWNvZmYgIiQodGRpcl9hcm1jb2ZmKSIKLWVhcm1uYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybW5ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybW5ic2QgIiQodGRpcl9hcm1uYnNkKSIKLWVhcm1fZXBvY19wZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2Vwb2NwZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtX2Vwb2NfcGUgIiQodGRpcl9hcm1wZSkiCi1lYXJtcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtcGUgIiQodGRpcl9hcm1wZSkiCi1lY29mZl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGNvZmZfc3BhcmMgIiQodGRpcl9jb2ZmX3NwYXJjKSIKLWVkMTB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QxMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQxMHZlbGYgIiQodGRpcl9kMTB2KSIKLWVkMzB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZlbGYgIiQodGRpcl9kMzB2KSIKLWVkMzB2X28uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9vLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X28gIiQodGRpcl9kMzB2KSIKLWVkMzB2X2UuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9lLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X2UgIiQodGRpcl9kMzB2KSIKLWVkZWx0YTY4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2RlbHRhNjguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGRlbHRhNjggIiQodGRpcl9kZWx0YTY4KSIKLWVlYm1vbjI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVibW9uMjlrICIkKHRkaXJfZWJtb24yOWspIgotZWVsZjMyZnIzMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZnIzMCAiJCh0ZGlyX2ZyMzApIgotZWVsZjMybWNvcmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJtY29yZSAiJCh0ZGlyX21jb3JlKSIKLWVtMzJyZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL20zMnJlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTMycmVsZiAiJCh0ZGlyX20zMnIpIgotZWVsZjMyX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMl9zcGFyYyAiJCh0ZGlyX2VsZjMyX3NwYXJjKSIKLWVlbGYzMl9pOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyX2k5NjAgIiQodGRpcl9lbGYzMl9pOTYwKSIKLWVlbGYzMmI0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYjQzMDAgIiQodGRpcl9lbGYzMmI0MzAwKSIKLWVlbGYzMmJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJtaXAgIiQodGRpcl9lbGYzMmJtaXApIgotZWVsZjMyYnNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJic21pcCAiJCh0ZGlyX2VsZjMyYnNtaXApIgotZWVsZjMyZWJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlYm1pcCAiJCh0ZGlyX2VsZjMyZWJtaXApIgotZWVsZjMyZWxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlbG1pcCAiJCh0ZGlyX2VsZjMyZWxtaXApIgotZWVsZjMyYm1pcG4zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYm1pcG4zMiAiJCh0ZGlyX2VsZjMyYm1pcG4zMikiCi1lZWxmMzJsNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmw0MzAwICIkKHRkaXJfZWxmMzJsNDMwMCkiCi1lZWxmMzJsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsbWlwICIkKHRkaXJfZWxmMzJsbWlwKSIKLWVlbGYzMmxwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxwcGMgIiQodGRpcl9lbGYzMmxwcGMpIgotZWVsZjMybHNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsc21pcCAiJCh0ZGlyX2VsZjMybHNtaXApIgotZWVsZjMycHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMnBwYyAiJCh0ZGlyX2VsZjMycHBjKSIKLWVlbGYzMnBwY2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMycHBjbGludXggIiQodGRpcl9lbGYzMnBwY2xpbnV4KSIKLWVlbGY2NGFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0YWxwaGEgIiQodGRpcl9lbGY2NGFscGhhKSIKLWVlbGY2NGhwcGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRocHBhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NGhwcGEgIiQodGRpcl9lbGY2NGhwcGEpIgotZWVsZjY0X3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NF9zcGFyYyAiJCh0ZGlyX2VsZjY0X3NwYXJjKSIKLWVlbGY2NGJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NGJtaXAgIiQodGRpcl9lbGY2NGJtaXApIgotZWVsZl9pMzg2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4NiAiJCh0ZGlyX2VsZl9pMzg2KSIKLWVlbGZfaTM4Nl9iZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmX2kzODZfYmUgIiQodGRpcl9lbGZfaTM4Nl9iZSkiCi1lZ2xkOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dsZDk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjAgIiQodGRpcl9nbGQ5NjApIgotZWdsZDk2MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ2xkOTYwY29mZiAiJCh0ZGlyX2dsZDk2MGNvZmYpIgotZWg4MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDAgIiQodGRpcl9oODMwMCkiCi1laDgzMDBoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMGggIiQodGRpcl9oODMwMGgpIgotZWg4MzAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMHMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDBzICIkKHRkaXJfaDgzMDBzKSIKLWVoODUwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwICIkKHRkaXJfaDg1MDApIgotZWg4NTAwYi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBiICIkKHRkaXJfaDg1MDBiKSIKLWVoODUwMGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwYyAiJCh0ZGlyX2g4NTAwYykiCi1laDg1MDBtLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwbS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBtLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMG0gIiQodGRpcl9oODUwMG0pIgotZWg4NTAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMHMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBzICIkKHRkaXJfaDg1MDBzKSIKLWVocDMwMGJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDMwMGJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHAzMDBic2QgIiQodGRpcl9ocDMwMGJzZCkiCi1laHAzaHB1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDNocHV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDNocHV4ICIkKHRkaXJfaHAzaHB1eCkiCi1laHBwYWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocHBhZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9ocHBhZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocHBhZWxmICIkKHRkaXJfaHBwYWVsZikiCi1laTM4NmFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZhb3V0ICIkKHRkaXJfaTM4NmFvdXQpIgotZWkzODZiZW9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZiZW9zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9iZW9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmJlb3MgIiQodGRpcl9pMzg2YmVvcykiCi1laTM4NmJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YnNkICIkKHRkaXJfaTM4NmJzZCkiCi1laTM4NmNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2Y29mZiAiJCh0ZGlyX2kzODZjb2ZmKSIKLWVpMzg2Z28zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Z28zMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZnbzMyICIkKHRkaXJfaTM4NmdvMzIpIgotZWkzODZsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bGludXggIiQodGRpcl9pMzg2bGludXgpIgotZWkzODZseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nmx5bnggIiQodGRpcl9pMzg2bHlueCkiCi1laTM4Nm1hY2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtYWNoICIkKHRkaXJfaTM4Nm1hY2gpIgotZWkzODZtb3NzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtb3NzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtb3NzICIkKHRkaXJfaTM4Nm1vc3MpIgotZWkzODZtc2Rvcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1zZG9zICIkKHRkaXJfaTM4Nm1zZG9zKSIKLWVpMzg2bmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm5ic2QgIiQodGRpcl9pMzg2bmJzZCkiCi1laTM4Nm53LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bncgIiQodGRpcl9pMzg2bncpIgotZWkzODZwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2cGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NnBlICIkKHRkaXJfaTM4NnBlKSIKLWVpMzg2cGVfcG9zaXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NnBlX3Bvc2l4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZwZV9wb3NpeCAiJCh0ZGlyX2kzODZwZV9wb3NpeCkiCi1lbG5rOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2xuazk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbG5rOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBsbms5NjAgIiQodGRpcl9sbms5NjApIgotZW02OGs0a25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4azRrbmJzZCAiJCh0ZGlyX202OGs0a25ic2QpIgotZW02OGthb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGthb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrYW91dCAiJCh0ZGlyX202OGthb3V0KSIKLWVtNjhrYXV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGthdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGthdXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthdXggIiQodGRpcl9tNjhrYXV4KSIKLWVtNjhrY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtjb2ZmICIkKHRkaXJfbTY4a2NvZmYpIgotZW02OGtlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2VsZiAiJCh0ZGlyX202OGtlbGYpIgotZW02OGtsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbGludXggIiQodGRpcl9tNjhrbGludXgpIgotZW02OGtseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2x5bnggIiQodGRpcl9tNjhrbHlueCkiCi1lbTY4a25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtuYnNkICIkKHRkaXJfbTY4a25ic2QpIgotZW02OGtwc29zLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtwc29zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHNvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a3Bzb3MgIiQodGRpcl9tNjhrcHNvcykiCi1lbTg4a2Jjcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tODhrYmNzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtODhrYmNzICIkKHRkaXJfbTg4a2JjcykiCi1lbWNvcmVwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tY29yZXBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1jb3JlcGUgIiQodGRpcl9tY29yZXBlKSIKLWVtaXBzYmlnLmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzYmlnLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzYmlnCi1lbWlwc2JzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzYnNkCi1lbWlwc2lkdC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzaWR0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHQgIiQodGRpcl9taXBzaWR0KSIKLWVtaXBzaWR0bC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzaWR0bC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzaWR0bCAiJCh0ZGlyX21pcHNpZHRsKSIKLWVtaXBzbGl0LmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzbGl0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzbGl0ICIkKHRkaXJfbWlwc2xpdCkiCi1lbWlwc2xuZXdzLmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzbG5ld3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsbmV3cwotZW1uMTAzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDMwMCAiJCh0ZGlyX21uMTAzMDApIgotZW1uMTAyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDIwMCAiJCh0ZGlyX21uMTAyMDApIgotZW5ld3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbmV3cyAiJCh0ZGlyX25ld3MpIgotZW5zMzJrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9uczMya25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG5zMzJrbmJzZCAiJCh0ZGlyX25zMzJrbmJzZCkiCi1lcGM1MzJtYWNoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwYzUzMm1hY2hhICIkKHRkaXJfcGM1MzJtYWNoYSkiCi1lcGplbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcGplbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBqZWxmICIkKHRkaXJfcGplbGYpIgotZXBqbGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wamxlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBqbGVsZiAiJCh0ZGlyX3BqbGVsZikiCi1lcHBjbWFjb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNtYWNvcyAiJCh0ZGlyX3BwY21hY29zKSIKLWVwcGNudy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNudyAiJCh0ZGlyX3BwY253KSIKLWVwcGNwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BwY3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNwZSAiJCh0ZGlyX3BwY3BlKSIKLWVyaXNjaXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcmlzY2l4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSByaXNjaXggIiQodGRpcl9yaXNjaXgpIgotZXNhMjkyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2EyOTIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2EyOTIwMCAiJCh0ZGlyX3NhMjkyMDApIgotZXNoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2ggIiQodGRpcl9zaCkiCi1lc2hlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNoZWxmICIkKHRkaXJfc2hlbGYpIgotZXNobGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGxlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobGVsZiAiJCh0ZGlyX3NobGVsZikiCi1lc2hsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobCAiJCh0ZGlyX3NobCkiCi1lc3BhcmNhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNhb3V0ICIkKHRkaXJfc3BhcmNhb3V0KSIKLWVzcGFyY2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2xpbnV4ICIkKHRkaXJfc3BhcmNsaW51eCkiCi1lc3BhcmNseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2x5bnggIiQodGRpcl9zcGFyY2x5bngpIgotZXNwYXJjbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbmJzZCAiJCh0ZGlyX3NwYXJjbmJzZCkiCi1lc3QyMDAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N0MjAwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3QyMDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdDIwMDAgIiQodGRpcl9zdDIwMDApIgotZXN1bjMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuMy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjMgIiQodGRpcl9zdW4zKSIKLWVzdW40LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N1bjQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3N1bm9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdW40ICIkKHRkaXJfc3VuNCkiCi1ldGljMzBhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGFvdXQgIiQodGRpcl90aWMzMGFvdXQpIgotZXRpYzMwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWMzMGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljMzBjb2ZmICIkKHRkaXJfdGljMzBjb2ZmKSIKLWV0aWM4MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzgwY29mZiAiJCh0ZGlyX3RpYzgwY29mZikiCi1ldmFuaWxsYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92YW5pbGxhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC92YW5pbGxhLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YW5pbGxhICIkKHRkaXJfdmFuaWxsYSkiCi1ldmF4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZheC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdmF4ICIkKHRkaXJfdmF4KSIKLWV2c3RhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZzdGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZzdGEgIiQodGRpcl92c3RhKSIKLWV2ODUwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3Y4NTAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC92ODUwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2ODUwICIkKHRkaXJfdjg1MCkiCi1ldzY1LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3c2NS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdzY1LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB3NjUgIiQodGRpcl93NjUpIgotZXo4MDAxLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3o4MDAxLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC96ODAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gejgwMDEgIiQodGRpcl96ODAwMSkiCi1lejgwMDIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMiAiJCh0ZGlyX3o4MDAyKSIKLQotIyBUaGUgZ2VuZXJhdGVkIGVtdWxhdGlvbiBmaWxlcyBtb3N0bHkgaGF2ZSB0aGUgc2FtZSBkZXBlbmRlbmNpZXMuCi0kKEVNVUxBVElPTl9PRklMRVMpOiAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtYWluLmggbGRlbXVsLmggbGRmaWxlLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkY3Rvci5oIGxkZXhwLmggbGRsYW5nLmggbGRncmFtLmgKLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNyb290PWBjZCAkKHNyY2RpcikgJiYgcHdkYDsgZXhwb3J0IHNyY3Jvb3Q7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY3Jvb3R9L3Rlc3RzdWl0ZSBcCi0JCUNDPSIkKENDX0ZPUl9UQVJHRVQpIiBDRkxBR1M9IiQoQ0ZMQUdTKSIgXAotCQlDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIiBDWFhGTEFHUz0iJChDWFhGTEFHUykiIFwKLQkJQ0NfRk9SX0hPU1Q9IiQoQ0MpIiBDRkxBR1NfRk9SX0hPU1Q9IiQoQ0ZMQUdTKSIgXAotCQlPRklMRVM9IiQoT0ZJTEVTKSIgQkZETElCPSIkKFRFU1RCRkRMSUIpIiBcCi0JCUxJQklCRVJUWT0iJChMSUJJQkVSVFkpICQoSU5UTExJQlMpIiBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBSdWxlcyBmb3IgdGVzdGluZyBieSByZWxpbmtpbmcgbGQgaXRzZWxmLgotIyBBIHNpbWlsYXIgdGVzdCBpcyBpbiB0aGUgdGVzdHN1aXRlLiAgVGhpcyB0YXJnZXQgaXMgZm9yIGVhc2Ugb2YgdXNlCi0jIHdoZW4gcG9ydGluZyBsZC4KLQotbGQtcGFydGlhbC5vOiBsZC1uZXckKEVYRUVYVCkKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZC1wYXJ0aWFsLm8gLXIgJChPRklMRVMpCi1sZDEkKEVYRUVYVCk6IGxkLXBhcnRpYWwubwotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMSQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgbGQtcGFydGlhbC5vICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDEtZnVsbCQoRVhFRVhUKTogbGQtbmV3Ci0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxLWZ1bGwkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQyJChFWEVFWFQpOiBsZDEkKEVYRUVYVCkKLQkuL2xkMSQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDIkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQzJChFWEVFWFQpOiBsZDIkKEVYRUVYVCkKLQkuL2xkMiQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDMkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotYm9vdHN0cmFwOiBsZDMkKEVYRUVYVCkKLQljbXAgbGQyJChFWEVFWFQpIGxkMyQoRVhFRVhUKQotCi0uUEhPTlk6IGJvb3RzdHJhcAotCi0jIEEgdGVzdCBwcm9ncmFtIGZvciBDKysgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4KLSMgVGhpcyB0ZXN0IGlzIG5vdyBpbiB0aGUgdGVzdHN1aXRlLgotIwotI2NkdGVzdDogY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vIGxkLm5ldwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QgJChIT1NUSU5HX0NSVDApIFwKLSMJICBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gJChIT1NUSU5HX0xJQlMpCi0jCi0jY2R0ZXN0Lm91dDogY2R0ZXN0Ci0jCS4vY2R0ZXN0ID4gY2R0ZXN0LnRtcAotIwltdiBjZHRlc3QudG1wIGNkdGVzdC5vdXQKLSMKLSNjZHRlc3QtdXIubzogY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vIGxkLm5ldwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIubyAtVXIgY2R0ZXN0LW1haW4ubyBcCi0jCSAgY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubwotIwotI2NkdGVzdC11cjogY2R0ZXN0LXVyLm8KLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0LXVyICQoSE9TVElOR19DUlQwKSBjZHRlc3QtdXIubyBcCi0jCSAgJChIT1NUSU5HX0xJQlMpCi0jCi0jY2R0ZXN0LXVyLm91dDogY2R0ZXN0LXVyCi0jCS4vY2R0ZXN0LXVyID4gY2R0ZXN0LXVyLnRtcAotIwltdiBjZHRlc3QtdXIudG1wIGNkdGVzdC11ci5vdXQKLSMKLSNjaGVjay1jZHRlc3Q6IGNkdGVzdC5vdXQgY2R0ZXN0LXVyLm91dCAkKHNyY2RpcikvY2R0ZXN0LmV4cAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC5vdXQKLSMJZGlmZiAkKHNyY2RpcikvY2R0ZXN0LmV4cCBjZHRlc3QtdXIub3V0Ci0jCi0jLlBIT05ZOiBjaGVjay1jZHRlc3QKLQotIyBFTkQgT0YgQ0hFQ0sgVEFSR0VUUwotCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotIyBNYW51YWwgY29uZmlndXJhdGlvbiBmaWxlOyBub3QgdXN1YWxseSBhdHRhY2hlZCB0byBub3JtYWwgY29uZmlndXJhdGlvbiwKLSMgYmVjYXVzZSBhbG1vc3QgYWxsIGNvbmZpZ3MgdXNlICJnZW4iIHZlcnNpb24gb2YgbWFudWFsLgotIyAgU2V0IERPQ1ZFUiBhYm92ZSB0byBjaGFuZ2UuCi1jb25maWdkb2MudGV4aToJJHtET0NWRVJ9LWRvYy50ZXhpCi0JbG4gLXMgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBsbiAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aQotCi1sZHZlci50ZXhpOiBNYWtlZmlsZQotCXJtIC1mICRACi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gJEAKLQotbGQuaW5mbzogJChzcmNkaXIpL2xkLnRleGluZm8gY29uZmlnZG9jLnRleGkgbGR2ZXIudGV4aQotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpIC1JICQoQkZERElSKS9kb2MgJChzcmNkaXIpL2xkLnRleGluZm8KLQotbGQuZHZpOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mbzokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0iJChNQUtFSU5GTykgLUkgJChzcmNkaXIpIC1JICQoQkZERElSKS9kb2MiICQoVEVYSTJEVkkpICQoc3JjZGlyKS9sZC50ZXhpbmZvCi0KLSMgV2Ugd2FudCB0byByZWNvbmZpZ3VyZSBpZiBjb25maWd1cmUuaG9zdCBvciBjb25maWd1cmUudGd0IGNoYW5nZXMuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdCAkKHNyY2RpcikvY29uZmlndXJlLnRndAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLW1vc3RseWNsZWFuLWxvY2FsOgotCS1ybSAtcmYgdG1wZGlyCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGxkLW5ldyQoRVhFRVhUKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpICQodG9vbGRpcikvYmluCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0Jbj1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBsZC1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQlmaQotCi1pbnN0YWxsLWRhdGEtbG9jYWw6Ci0JJChta2luc3RhbGxkaXJzKSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzCi0JZm9yIGYgaW4gbGRzY3JpcHRzLyo7IGRvIFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGYgJChzY3JpcHRkaXIpLyQkZiA7IFwKLQlkb25lCi1kaXN0c3R1ZmY6ICQoTERESVNUU1RVRkYpIGluZm8KLWRpc3RjbGVhbi1sb2NhbDoKLQlybSAtcmYgbGRzY3JpcHRzCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgREVQMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgREVQMQotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgREVQMQotCXNlZCAtZiBkZXAuc2VkIDxERVAxID5ERVAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLURFUDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgREVQMgotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCSQoTUtERVApIC1mIERFUDIgJChJTkNMVURFUykgJD8KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWxkY3Rvci5vOiBsZGN0b3IuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmggbGRjdG9yLmgKLWxkZW11bC5vOiBsZGVtdWwuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGRlbXVsLmggXAotICBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbWFpbi5oIGxkZW11bC1saXN0LmgKLWxkZXhwLm86IGxkZXhwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZG1pc2MuaCBsZGV4cC5oIGxkZ3JhbS5oIGxkbGFuZy5oCi1sZGZpbGUubzogbGRmaWxlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbWFpbi5oIGxkZ3JhbS5oIFwKLSAgbGRsZXguaCBsZGVtdWwuaAotbGRsYW5nLm86IGxkbGFuZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIGxkbGV4LmggbGRtaXNjLmggXAotICBsZGN0b3IuaCBsZGZpbGUuaCAkKElOQ0RJUikvZm5tYXRjaC5oICQoSU5DRElSKS9kZW1hbmdsZS5oCi1sZG1haW4ubzogbGRtYWluLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZG1pc2MuaCBsZHdyaXRlLmggbGRncmFtLmggbGRleHAuaCBsZGxhbmcuaCBsZGVtdWwuaCBcCi0gIGxkbGV4LmggbGRmaWxlLmggbGRjdG9yLmgKLWxkbWlzYy5vOiBsZG1pc2MuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGxkLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkZ3JhbS5oIGxkbGV4LmggbGRtYWluLmggbGRmaWxlLmgKLWxkdmVyLm86IGxkdmVyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkdmVyLmggXAotICBsZGVtdWwuaCBsZG1haW4uaAotbGR3cml0ZS5vOiBsZHdyaXRlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaAotbGV4c3VwLm86IGxleHN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRncmFtLmggbGRsZXguaCBsZGZpbGUuaCBcCi0gIGxkdmVyLmggbGRlbXVsLmgKLW1yaS5vOiBtcmkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkbWlzYy5oIG1yaS5oIGxkZ3JhbS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotbGRjcmVmLm86IGxkY3JlZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggXAotICBsZGxhbmcuaAotcGUtZGxsLm86IHBlLWRsbC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGR3cml0ZS5oIFwKLSAgbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmggbGRlbXVsLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIC4uL2JmZC9saWJjb2ZmLmggZGVmZmlsZS5oIHBlLWRsbC5oCi1sZGdyYW0ubzogbGRncmFtLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZGV4cC5oIGxkdmVyLmggbGRsYW5nLmggbGRlbXVsLmggbGRmaWxlLmggbGRtaXNjLmggXAotICBsZG1haW4uaCBtcmkuaCBsZGN0b3IuaCBsZGxleC5oCi1sZGxleC5vOiBsZGxleC5jIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZGdyYW0uaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbGV4LmggXAotICBsZG1haW4uaAotZGVmZmlsZXAubzogZGVmZmlsZXAuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIGxkLmggbGRtaXNjLmggZGVmZmlsZS5oCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9sZC9ORVdTIGIvbGQvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3ODkwZS4uMDAwMDAwMAotLS0gYS9sZC9ORVdTCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS0qLSB0ZXh0IC0qLQotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4xMDoKLQotKiBBZGRlZCBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdW51c2VkIHNlY3Rpb25zLCBlbmFibGVkIGJ5IC0tZ2Mtc2VjdGlvbnMuIAotICBJdCBkb2VzIHJlcXVpcmUgYSBiaXQgb2YgYmFja2VuZCBzdXBwb3J0OyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXJlCi0gIHBwYy1lbGYsIG1pcHMtZWxmLCBhbmQgbW4xMDMwMC1lbGYuICBPdGhlcnMgd2lsbCBpZ25vcmUgdGhlIG9wdGlvbi4KLQotKiBBZGRlZCBTT1JUIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIHRvIHBlcm1pdCBzb3J0aW5nIHNlY3Rpb25zIGJ5IGZpbGUKLSAgbmFtZSBvciBzZWN0aW9uIG5hbWUuCi0KLSogQWRkZWQgRVhURVJOIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGFzIGFuIGVxdWl2YWxlbnQgdG8gdGhlIC11Ci0gIGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLSogQWRkZWQgQVNTRVJUIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIEFkZGVkIEVYQ0xVREVfRklMRSB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSBmb3IgZnVydGhlciBjb250cm9sIG92ZXIKLSAgd2lsZGNhcmQgZmlsZSBuYW1lcy4KLQotKiBBZGRlZCAtTyBvcHRpb24gdG8gb3B0aW1pemUgbGlua2VyIG91dHB1dCAoYXMgb2YgdGhpcyB3cml0aW5nLCB0aGlzIG9ubHkKLWFmZmVjdHMgRUxGIHNoYXJlZCBsaWJyYXJ5IGdlbmVyYXRpb24pLgotCi0qIFRoZSAtZSBvcHRpb24gbm93IGFjY2VwdHMgYSBudW1iZXIgYXMgd2VsbCBhcyBhIHN5bWJvbCBuYW1lLgotCi0qIEFkZGVkIC0tbm8tdW5kZWZpbmVkIG9wdGlvbiB0byBkaXNhbGxvdyB1bmRlZmluZWQgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEKLSAgc2hhcmVkIGxpYnJhcnkuCi0KLSogQWRkZWQgLS1kZW1hbmdsZSBhbmQgLS1uby1kZW1hbmdsZSBvcHRpb25zLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi45OgotCi0qIEFkZGVkIFNRVUFEIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIE5ldyBvcHRpb24gLS1uby13YXJuLW1pc21hdGNoLgotCi0qIFRoZSBNRU1PUlkgY29tbWFuZCBub3cgcGFyc2VzIHRoZSBhdHRyaWJ1dGVzIHRvIGRldGVybWluZSB3aGVyZSBzZWN0aW9ucyB0aGF0Ci0gIGFyZSBub3QgcGxhY2VkIGluIGEgc3BlY2lmaWMgbWVtb3J5IHJlZ2lvbiBhcmUgcGxhY2VkLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi44OgotCi0qIExpbmtlciBzY3JpcHRzIG1heSBub3cgY29udGFpbiBzaGVsbCB3aWxkY2FyZCBjaGFyYWN0ZXJzIGZvciBmaWxlIGFuZCBzZWN0aW9uCi0gIG5hbWVzLgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIHN5bWJvbCB2ZXJzaW9ucyBpbiBFTEYuCi0KLSogVGhlIE5PQ1JPU1NSRUZTIGNvbW1hbmQgd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIFRoZSBMT0FEQUREUiBleHByZXNzaW9uIHdhcyBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBNQVggYW5kIE1JTiBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBUaGUgT1ZFUkxBWSBjb25zdHJ1Y3Qgd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIE5ldyBvcHRpb24gLS13YXJuLXNlY3Rpb24tYWxpZ24gdG8gd2FybiB3aGVuIHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uCi0gIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudCBvZiBhbiBpbnB1dCBzZWN0aW9uLgotCi0qIE5ldyBvcHRpb25zIC0tZmlsdGVyLy1GIGFuZCAtLWF1eGlsaWFyeS8tZi4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuNzoKLQotKiBOZXcgb3B0aW9uIC0tY3JlZiB0byBwcmludCBvdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuCi0KLSogTmV3IG9wdGlvbiAtLXdyYXAgU1lNQk9MLgotCi0qIE5ldyBvcHRpb24gLS1uby13aG9sZS1hcmNoaXZlLCB0byB0dXJuIG9mZiB0aGUgZWZmZWN0IG9mIC0td2hvbGUtYXJjaGl2ZS4KLQotKiBJbnB1dCBzZWN0aW9ucyBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb24gL0RJU0NBUkQvIGluIHRoZSBsaW5rZXIgc2NyaXB0Ci0gIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi0qIFRoZSBTdW5PUyBhbmQgRUxGIGxpbmtlcnMgbm93IG1lcmdlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGljaCB1c2VzCi0gIHRoZSBOX0JJTkNMIGFuZCBOX0VJTkNMIHN0YWIgdHlwZXMuICBUaGlzIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcKLSAgaW5mb3JtYXRpb24gZ2VuZXJhdGVkLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi42OgotCi0qIFdoZW4gYW4gRUxGIHNlY3Rpb24gbmFtZSBpcyByZXByZXNlbnRhYmxlIGFzIGEgQyBpZGVudGlmaWVyICh0aGlzIGlzIG5vdCB0cnVlCi1vZiBtb3N0IEVMRiBzZWN0aW9uIG5hbWVzKSwgdGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHN5bWJvbHMKLV9fc3RhcnRfU0VDTkFNRSBhbmQgX19zdG9wX1NFQ05BTUUsIHdoZXJlIFNFQ05BTUUgaXMgdGhlIHNlY3Rpb24gbmFtZSwgYXQgdGhlCi1iZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgZ2xpYmMuCi0KLSogV2hlbiBhbiBFTEYgc2VjdGlvbiBuYW1lZCAuZ251Lndhcm5pbmcgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQgZmlsZSwgdGhlCi1jb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcmUgZGlzcGxheWVkIGFzIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGUgc2VjdGlvbiBpcwotbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdXNlZCBieSBnbGliYy4KLQotKiBXaGVuIGFuIEVMRiBzZWN0aW9uIG5hbWVkIC5nbnUud2FybmluZy5TWU1CT0wgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQKLWZpbGUsIGFuZCB0aGUgc3ltYm9sIFNZTUJPTCBpcyByZWZlcmVuY2VkIGJ5IHNvbWUgb2JqZWN0IGZpbGUsIHRoZSBjb250ZW50cyBvZgotdGhlIHNlY3Rpb24gYXJlIGRpc3BsYXllZCBhcyBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIHNlY3Rpb24gaXMgbm90IGNvcGllZCBpbnRvCi10aGUgb3V0cHV0IGZpbGUsIHVubGVzcyBkb2luZyBhIHJlbG9jYXRlYWJsZSBvciBzaGFyZWQgbGluay4gIFRoaXMgaXMgdXNlZCBieQotZ2xpYmMuCi0KLSogTmV3IG9wdGlvbnMgLXNwbGl0LWJ5LXJlbG9jIGFuZCAtc3BsaXQtYnktZmlsZS4KLQotKiBUaGUgbGlua2VyIG5vdyBzdXBwb3J0cyBsaW5raW5nIFBJQyBjb21waWxlZCBjb2RlIG9uIFNQQVJDIFN1bk9TLiAgSXQgY2FuCi1hbHNvIGNyZWF0ZSBTUEFSQyBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQsIGxpa2UgdGhlIG5hdGl2ZSBTdW5PUyBsaW5rZXIsCi13aWxsIGRvIHNvIHdoZW5ldmVyIHRoZXJlIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gdGhlIGxpbmsgYW5kIG5laXRoZXIgdGhlIC1lCi1ub3IgdGhlIC1yIG9wdGlvbiB3YXMgdXNlZC4KLQotKiBUaGUgLXJwYXRoIG9wdGlvbiBtYXkgYmUgdXNlZCBvbiBTdW5PUyB0byBzZXQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gYmUKLXNlYXJjaGVkIGF0IHJ1biB0aW1lLiAgVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb2YgYnVpbGRpbmcgdGhlIGxpc3QgZnJvbSB0aGUKLS1MIG9wdGlvbnMuCi0KLSogVGhlIENPRkYgbGlua2VyIG5vdyBjb21iaW5lcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHN0cnVjdHMsIHVuaW9ucywgYW5kCi1lbnVtcywgc28gdGhhdCBldmVuIGlmIHRoZSBzYW1lIHR5cGUgaXMgZGVmaW5lZCBpbiBtdWx0aXBsZSBpbnB1dCBmaWxlcyBpdCB3aWxsCi1vbmx5IGJlIGRlZmluZWQgb25jZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBUaGUgLS10cmFkaXRpb25hbC1mb3JtYXQgc3dpdGNoIHdpbGwKLXByZXZlbnQgdGhpcyBvcHRpbWl6YXRpb24uCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjU6Ci0KLSogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgbGlua2luZyBhZ2FpbnN0IFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuICBJdCBzdGlsbCBjYW4KLW5vdCBsaW5rIFN1bk9TIFBJQyAoUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSkgZmlsZXMsIHNvIGl0IGNhbiBub3QgYmUgdXNlZCB0bwotZ2VuZXJhdGUgc2hhcmVkIGxpYmFyaWVzLgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIGxpbmtpbmcgYWdhaW5zdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlIGkzODYKLShVbml4V2FyZSkgYW5kIFNQQVJDIChTb2xhcmlzKS4gIEl0IGNhbiBhbHNvIGxpbmsgRUxGIFBJQyBmaWxlcywgYW5kIGNhbiBiZQotdXNlZCB0byBnZW5lcmF0ZSBzaGFyZWQgbGlicmFyaWVzLiAgU2hhcmVkIGxpYnJhcnkgZ2VuZXJhdGlvbiBpcyBub3Qgd2VsbAotdGVzdGVkOyBwbGVhc2UgcmVwb3J0IGFueSBwcm9ibGVtcyBlbmNvdW50ZXJlZC4gIFRoZSBsaW5rZXIgaXMgbm93IGVuYWJsZWQgZm9yCi1Tb2xhcmlzIGFnYWluLgotCi0qIEVyaWMgWW91bmdkYWxlIGhhcyBjb250cmlidXRlZCBMaW51eCBzdXBwb3J0IGNvZGUsIGluY2x1ZGluZyBsaW5raW5nIGFnYWluc3QKLUxpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgbGlua2VyIHByb2R1Y2VzIExpbnV4IFFNQUdJQyBiaW5hcmllcy4KLQotKiBUaGUgRUxGIGJhY2tlbmQgaGFzIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIGNvZGUuICBUbyB1c2UgdGhlIG5ldwotRUxGIGxpbmtlciwgZWFjaCBwYXJ0aWN1bGFyIHRhcmdldCByZXF1aXJlcyBhIHJlbG9jYXRpb24gZnVuY3Rpb24uICBTbyBmYXIsCi10aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIGkzODYgKFVuaXhXYXJlKSwgU1BBUkMgKFNvbGFyaXMpIE1JUFMgKElyaXgKLTUpLCBhbmQgSFBQQSBFTEYgdGFyZ2V0cy4KLQotKiBUaGUgLSggKC0tc3RhcnQtZ3JvdXApIGFuZCAtKSAoLS1lbmQtZ3JvdXApIG9wdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvCi1zdXBwb3J0IHNlYXJjaGluZyBhIGdyb3VwIG9mIGFyY2hpdmVzIGFzIHRob3VnaCB0aGV5IHdlcmUgYSBzaW5nbGUgYXJjaGl2ZS4KLVRoaXMgY2FuIGFsc28gYmUgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQsIGFzIEdST1VQICggZmlsZXMgKS4KLQotKiBXaGVuIGEgZmlsZSBpcyBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlIGxpbmtlciBkb2VzIG5vdCByZWNvZ25pemUKLWl0IGFzIGFuIG9iamVjdCBmaWxlLCB0aGUgbGlua2VyIHdpbGwgbm93IHRyZWF0IHRoZSBmaWxlIGFzIGEgbGlua2VyIHNjcmlwdAotZmlsZS4gIEEgbGlua2VyIHNjcmlwdCBuYW1lZCBpbiB0aGlzIHdheSBhdWdtZW50cywgYnV0IGRvZXMgbm90IHJlcGxhY2UsIHRoZQotZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi0qIFRoZSAtd2Fybi1vbmNlIG9wdGlvbiB3YXMgYWRkZWQuICBJdCBjYXVzZXMgdGhlIGxpbmtlciB0byBvbmx5IHdhcm4gb25jZSBwZXIKLXVuZGVmaW5lZCBzeW1ib2wsIHJhdGhlciB0aGFuIG9uY2UgcGVyIHJlZmVyZW5jZS4KLQotKiBUaGUgQ09GRiBiYWNrZW5kIGhhcyBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGxpbmtlciBjb2RlLiAgQXMgd2l0aCBFTEYsIHRvCi11c2UgdGhlIG5ldyBsaW5rZXIsIGVhY2ggcGFydGljdWxhciB0YXJnZXQgcmVxdWlyZXMgYSByZWxvY2F0aW9uIGZ1bmN0aW9uLiAgU28KLWZhciwgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB3cml0dGVuIGZvciB0aGUgaTM4NiwgbTY4aywgYTI5ayBhbmQgU0ggdGFyZ2V0cy4KLQotKiBUaGUgLVYgZmxhZyB3YXMgbWFkZSBhIHN5bm9ueW0gZm9yIC12LCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LiAgVGhlIG9sZCAtVgotYmVoYXZpb3VyIGlzIGF2YWlsYWJsZSB2aWEgLS12ZXJib3NlLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi40OgotCi0qIE5ldyBsaW5rZXIgY29kZSwgYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBUYXlsb3IuICBGb3IgYS5vdXQgYW5kIGVjb2ZmCi0gIGZvcm1hdHMgKHNvIGZhciksIHRoaXMgc2hvdWxkIHJlc3VsdCBpbiBjb25zaWRlcmFibGUgc2F2aW5ncyBpbiB0aW1lCi0gIGFuZCBtZW1vcnkgdXNlZCB3aGlsZSBsaW5raW5nOyBzbGlnaHRseSBwb29yZXIgcGVyZm9ybWFuY2UgdGhhbgotICBiZWZvcmUgZm9yIGZvcm1hdHMgbm90IGNvbnZlcnRlZCB5ZXQuCi0KLSogQ29tbWFuZC1saW5lIHBhcnNpbmcgaXMgbm8gbG9uZ2VyIGRvbmUgd2l0aCBmbGV4LiAgVGhpcyBtZWFucwotICBvZGRiYWxsIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzIHdvbid0IGdldCB0cmVhdGVkIGFzIGFyZ3VtZW50Ci0gIHNlcGFyYXRvcnMuCi0KLSogSFAtUEEgRUxGIHN1cHBvcnQsIGJ5IEplZmYgTGF3LiAgKE5vIFNPTSBzdXBwb3J0IHlldC4pCi0KLSogTWFjaCBpMzg2IHN1cHBvcnQsIGJ5IERhdmlkIE1hY2tlbnppZS4KLQotKiBJcml4IDQgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm93IHN1cHBvcnRlZCAoSXJpeCA1IHVzZXMgRUxGLCBhbmQgRUxGIHNoYXJlZAotICBsaWJyYXJpZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkKS4KLQotKiBDT0ZGIHNoYXJlZCBsaWJyYXJpZXMgKGFzIG9uIFNDTykgc2hvdWxkIHdvcmsgYXMgd2VsbC4KLQotKiBUaGUgbGlua2VyIGlzIGRpc2FibGVkIGZvciBTb2xhcmlzLiAgKEFjdHVhbGx5LCBpdCB3YXMgaW4gMi4zIGFsc28sIEkganVzdAotICBmb3Jnb3QgdG8gbm90ZSBpdC4pICBTb21lIG9mIHRoZWlyIEMgbGlicmFyeSByb3V0aW5lcyBkb24ndCB3b3JrIHdoZW4KLSAgc3RhdGljYWxseSBsaW5rZWQsIGFuZCB0aGUgR05VIGxpbmtlciBkb2Vzbid0IHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHlldC4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMzoKLQotKiBXZWFrIHN5bWJvbHMgYXJlIG5vdyBzdXBwb3J0ZWQuCi0KLSogRUxGIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuICBUaGUgbGlua2VyIGhhcyBiZWVuIGJvb3RzdHJhcHBlZCBvbgotICBVbml4V2FyZSBhbmQgU29sYXJpcy4KLQotKiBBbHBoYSBPU0YvMSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIChub24gZHluYW1pYyBsaW5raW5nIG9ubHkpLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4yOgotCi0qIFRoZSBgYmZkJyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVkdWNlIGEub3V0LWZvcm1hdCBzdHJpbmcKLSAgdGFibGUgc2l6ZS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IGZpbGVzIGxpbmtlZCBmcm9tIG1hbnkgaW5wdXQKLSAgZmlsZXMgd2l0aCBkdXBsaWNhdGUgc3ltYm9scyAoYC1nJyBkZWJ1Z2dpbmcgcmVjb3Jkcywgb3IgaWRlbnRpY2FsCi0gIHN0YXRpYyBzeW1ib2xzKSBzaG91bGQgYmUgbXVjaCBzbWFsbGVyLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4xOgotCi0qIFRoZSBsZCAteVNZTUJPTCBmbGFnICh0byB0cmFjZSByZWZlcmVuY2VzIHRvIFNZTUJPTCkgaXMgbm93IGltcGxlbWVudGVkLgotCi0qIFRoZXJlIGlzIG5vdyBzdXBwb3J0IGZvciB3cml0aW5nIEVDT0ZGIGZpbGVzLCBzbyBsZCBhbmQgdGhlCi0gIG90aGVyIHV0aWxpdGllcyBzaG91bGQgd29yayBvbiBSaXNjL1VsdHJpeCBhbmQgSXJpeC4KLQotDAotTG9jYWwgdmFyaWFibGVzOgotZmlsbC1jb2x1bW46IDc5Ci1FbmQ6CmRpZmYgLS1naXQgYS9sZC9SRUFETUUgYi9sZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDdkMDQuLjAwMDAwMDAKLS0tIGEvbGQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotVGhpcyBpcyB0aGUgR05VIGxpbmtlci4gIEl0IGlzIGRpc3RyaWJ1dGVkIHdpdGggb3RoZXIgImJpbmFyeQotdXRpbGl0aWVzIiB3aGljaCBzaG91bGQgYmUgaW4gLi4vYmludXRpbHMuICBTZWUgLi4vYmludXRpbHMvUkVBRE1FIGZvcgotbW9yZSBnZW5lcmFsIG5vdGVzLCBpbmNsdWRpbmcgd2hlcmUgdG8gc2VuZCBidWcgcmVwb3J0cy4KLQotVGhlcmUgYXJlIG1hbnkgZmVhdHVyZXMgb2YgdGhlIGxpbmtlcjoKLQotKiBUaGUgbGlua2VyIHVzZXMgYSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkgKC4uL2JmZCkKLSAgdGhhdCBpdCB1c2VzIHRvIHJlYWQgYW5kIHdyaXRlIG9iamVjdCBmaWxlcy4gIFRoaXMgaGVscHMKLSAgaW5zdWxhdGUgdGhlIGxpbmtlciBpdHNlbGYgZnJvbSB0aGUgZm9ybWF0IG9mIG9iamVjdCBmaWxlcy4KLQotKiBUaGUgbGlua2VyIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBvYmplY3QgZmlsZQotICBmb3JtYXRzLiAgSXQgY2FuIGV2ZW4gaGFuZGxlIG11bHRpcGxlIGZvcm1hdHMgYXQgb25jZToKLSAgUmVhZCB0d28gaW5wdXQgZm9ybWF0cyBhbmQgd3JpdGUgYSB0aGlyZC4KLQotKiBUaGUgbGlua2VyIGNhbiBiZSBjb25maWd1cmVkIGZvciBjcm9zcy1saW5raW5nLgotCi0qIFRoZSBsaW5rZXIgc3VwcG9ydHMgYSBjb250cm9sIGxhbmd1YWdlLgotCi0qIFRoZXJlIGlzIGEgdXNlciBtYW51YWwgKGxkLnRleGluZm8pLCBhcyB3ZWxsIGFzIHRoZQotICBiZWdpbm5pbmdzIG9mIGFuIGludGVybmFscyBtYW51YWwgKGxkaW50LnRleGluZm8pLgotCi1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1TZWUgLi4vYmludXRpbHMvUkVBRE1FLgotCi1JZiB5b3Ugd2FudCB0byBtYWtlIGEgY3Jvc3MtbGlua2VyLCB5b3UgbWF5IHdhbnQgdG8gc3BlY2lmeQotYSBkaWZmZXJlbnQgc2VhcmNoIHBhdGggb2YgLWxmb28gbGlicmFyaWVzIHRoYW4gdGhlIGRlZmF1bHQuCi1Zb3UgY2FuIGRvIHRoaXMgYnkgc2V0dGluZyB0aGUgTElCX1BBVEggdmFyaWFibGUgaW4gLi9NYWtlZmlsZS4KLQotVG8gYnVpbGQganVzdCB0aGUgbGlua2VyLCBtYWtlIHRoZSB0YXJnZXQgYWxsLWxkIGZyb20gdGhlIHRvcCBsZXZlbAotZGlyZWN0b3J5IChvbmUgZGlyZWN0b3J5IGFib3ZlIHRoaXMgb25lKS4KLQotUG9ydGluZyB0byBhIG5ldyB0YXJnZXQKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSB0aGUgbGRpbnQudGV4aW5mbyBtYW51YWwuCi0KLVJlcG9ydGluZyBidWdzIGV0YwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLUtub3duIHByb2JsZW1zCi09PT09PT09PT09PT09PQotCi1UaGUgU29sYXJpcyBsaW5rZXIgbm9ybWFsbHkgZXhwb3J0cyBhbGwgZHluYW1pYyBzeW1ib2xzIGZyb20gYW4KLWV4ZWN1dGFibGUuICBUaGUgR05VIGxpbmtlciBkb2VzIG5vdCBkbyB0aGlzIGJ5IGRlZmF1bHQuICBUaGlzIGlzCi1iZWNhdXNlIHRoZSBHTlUgbGlua2VyIHRyaWVzIHRvIHByZXNlbnQgdGhlIHNhbWUgaW50ZXJmYWNlIGZvciBhbGwKLXNpbWlsYXIgdGFyZ2V0cyAoaW4gdGhpcyBjYXNlLCBhbGwgbmF0aXZlIEVMRiB0YXJnZXRzKS4gIFRoaXMgZG9lcyBub3QKLW1hdHRlciBmb3Igbm9ybWFsIHByb2dyYW1zLCBidXQgaXQgY2FuIG1ha2UgYSBkaWZmZXJlbmNlIGZvciBwcm9ncmFtcwotd2hpY2ggdHJ5IHRvIGRsb3BlbiBhbiBleGVjdXRhYmxlLCBzdWNoIGFzIFBFUkwgb3IgVGNsLiAgWW91IGNhbiBtYWtlCi10aGUgR05VIGxpbmtlciBleHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scyB3aXRoIHRoZSAtRSBvcgotLS1leHBvcnQtZHluYW1pYyBjb21tYW5kIGxpbmUgb3B0aW9uLgotCi1IUC9VWCA5LjAxIGhhcyBhIHNoZWxsIGJ1ZyB0aGF0IGNhdXNlcyB0aGUgbGlua2VyIHNjcmlwdHMgdG8gYmUKLWdlbmVyYXRlZCBpbmNvcnJlY3RseS4gIFRoZSBzeW1wdG9tIG9mIHRoaXMgYXBwZWFycyB0byBiZSAiZmF0YWwgZXJyb3IKLS0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciIGVycm9yIG1lc3NhZ2VzLiAgVGhlcmUgYXJlIHZhcmlvdXMKLXdvcmthcm91bmRzIHRvIHRoaXM6Ci0gICogQnVpbGQgYW5kIGluc3RhbGwgYmFzaCwgYW5kIGJ1aWxkIHdpdGggIm1ha2UgU0hFTEw9YmFzaCIuCi0gICogVXBkYXRlIHRvIGEgdmVyc2lvbiBvZiBIUC9VWCB3aXRoIGEgd29ya2luZyBzaGVsbCAoZS5nLiwgOS4wNSkuCi0gICogUmVwbGFjZSAiKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSIgaW4KLSAgICBnZW5zY3JpcHRzLnNoIHdpdGggInNoICR7c3JjZGlyfS4uLiIgKG5vIHBhcmVucykgYW5kIG1ha2Ugc3VyZSB0aGUKLSAgICBlbXVscGFyYW1zIHNjcmlwdCB1c2VkIGV4cG9ydHMgYW55IHNoZWxsIHZhcmlhYmxlcyBpdCBzZXRzLgpkaWZmIC0tZ2l0IGEvbGQvVE9ETyBiL2xkL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2Q5OGIuLjAwMDAwMDAKLS0tIGEvbGQvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVm9sdW50ZWVycyB0byB0YWNrbGUgc29tZSBvZiB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHdlbGNvbWU6Ci0KLVN1cHBvcnQgdGhlICJ0cmFkaXRpb25hbCIgQlNEICAtQSBmbGFnIChpbmNyZW1lbnRhbCBsb2FkaW5nKS4KLShUaGVyZSBpcyBhIC1BIGZsYWcgaW4gbGQgbm93LCBidXQgaXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotYXJjaGl0ZWN0dXJlLiAgVGhhdCBzaG91bGQgcHJvYmFibHkgYmUgY2hhbmdlZC4pCi0KLVN1cHBvcnQgZm9yIGR5bmFtaWMgbG9hZGluZyAoYSBsYSBkbGQsIGJ1dCBiZmQtYmFzZWQpIHdvdWxkIGJlIG5pY2UuCi0KLUF2b2lkIHJlLW9wZW4gKGFuZCByZS1zZWVraW5nKSBvdXRwdXQgYmZkIGFuZCBhcmNoaXZlcy4KZGlmZiAtLWdpdCBhL2xkL2FjaW5jbHVkZS5tNCBiL2xkL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiMDliOS4uMDAwMDAwMAotLS0gYS9sZC9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvbGQvYWNsb2NhbC5tNCBiL2xkL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTM0YjAuLjAwMDAwMDAKLS0tIGEvbGQvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMjAgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+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+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotCi1kbmwgQU1fUFJPR19MRVgKLWRubCBMb29rIGZvciBmbGV4LCBsZXggb3IgbWlzc2luZywgdGhlbiBydW4gQUNfUFJPR19MRVggYW5kIEFDX0RFQ0xfWVlURVhUCi1BQ19ERUZVTihBTV9QUk9HX0xFWCwKLVttaXNzaW5nX2Rpcj1pZmVsc2UoWyQxXSwsYGNkICRhY19hdXhfZGlyICYmIHB3ZGAsJDEpCi1BQ19DSEVDS19QUk9HUyhMRVgsIGZsZXggbGV4LCAiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIpCi1BQ19QUk9HX0xFWAotQUNfREVDTF9ZWVRFWFRdKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCmRpZmYgLS1naXQgYS9sZC9jb25maWcuaW4gYi9sZC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMTdiZGMuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0RJUkVOVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotCi0vKiBEZWZpbmUgaWYgZW52aXJvbiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLQotLyogQWRkaXRpb25hbCBleHRlbnNpb24gYSBzaGFyZWQgb2JqZWN0IG1pZ2h0IGhhdmUuICovCi0jdW5kZWYgRVhUUkFfU0hMSUJfRVhURU5TSU9OCi0KZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZSBiL2xkL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI0ZWM1ZS4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw1Mjg0ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9bGRtYWluLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTk0OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjMzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2ODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MjE6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzc4OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1sZAotCi1WRVJTSU9OPTIuOS41Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+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+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTY0LWJpdC1iZmQgb3IgLS1kaXNhYmxlLTY0LWJpdC1iZmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfNjRfYml0X2JmZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfNjRfYml0X2JmZCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50NjQ9ZmFsc2UKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTkxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDIzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMDM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAzOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDY1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3MDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA3OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDk4OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNDE6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE5NjogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjM0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjc2OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjk3OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzAyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQwMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ3NjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ5MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MTY6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU0OTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTg0OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU4OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYxNzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjgyOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY4NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MTI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzY3OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc3NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4MTk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODI0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODI5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4NTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkxMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkxOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwODc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDkyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDk3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEyNzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTU1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTg0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI0NjogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjUxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNzk6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI5OTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzE4OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMzMjg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzQ1OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM3MzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzODEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDA4OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDIwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ4MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ4NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTM3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU3MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY0NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2Nzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzE1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODA1OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODMzOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzODM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM4NDM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTA2OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTIyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTM5OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5NDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTUxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NzA6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmopIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+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+JjYKLWZpCi0KLWZpCi0KLQotCi1jYXNlICIke2hvc3R9IiBpbgotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNFX0JJTkFSWV9GT1BFTiAxCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDc1OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTAxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MjI6IGNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1MjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZnJlZQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZT1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZT15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTY5OiBjaGVja2luZyB3aGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTc0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHNicmsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTk1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3Nicms9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3Nicms9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc2JyayA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TQlJLIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjE2OiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDYyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2NjM6IGNoZWNraW5nIHdoZXRoZXIgZW52aXJvbiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2NjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZW52aXJvbgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2ODk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24iIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04gMQotRU9GCi0KLWZpCi0KLQotIyBXaGVuIGNvbnZlcnRpbmcgbGlua2VyIHNjcmlwdHMgaW50byBzdHJpbmdzIGZvciB1c2UgaW4gZW11bGF0aW9uCi0jIGZpbGVzLCB1c2UgYXN0cmluZy5zZWQgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIEFOU0kgc3RyaW5nCi0jIGNvbmNhdGVuYXRpb24sIG9yIG9zdHJpbmcuc2VkIG90aGVyd2lzZS4gIFRoaXMgaXMgdG8gc3VwcG9ydCB0aGUKLSMgYnJva2VuIE1pY3Jvc29mdCBNU1ZDIGNvbXBpbGVyLCB3aGljaCBsaW1pdHMgdGhlIGxlbmd0aCBvZiBzdHJpbmcKLSMgY29uc3RhbnRzLCB3aGlsZSBzdGlsbCBzdXBwb3J0aW5nIHByZS1BTlNJIGNvbXBpbGVycyB3aGljaCBkbyBub3QKLSMgc3VwcG9ydCBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzE3OiBjaGVja2luZyB3aGV0aGVyIEFOU0kgQyBzdHJpbmcgY29uY2F0ZW5hdGlvbiB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1jaGFyICphID0gImEiICJhIjsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzI5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb249eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGxkX2N2X3N0cmluZ19jb25jYXRlbmF0aW9uPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGxkX2N2X3N0cmluZ19jb25jYXRlbmF0aW9uIiAxPiY2Ci1pZiB0ZXN0ICIkbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb24iID0gInllcyI7IHRoZW4KLSAgU1RSSU5HSUZZPWFzdHJpbmcuc2VkCi1lbHNlCi0gIFNUUklOR0lGWT1vc3RyaW5nLnNlZAotZmkKLQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotYWxsX3RhcmdldHM9Ci1FTVVMPQotYWxsX2VtdWxzPQotYWxsX2VtdWxfZXh0cmFzPQotYWxsX2xpYnBhdGg9Ci0KLXJtIC1mIHRkaXJzCi0KLWZvciB0YXJnX2FsaWFzIGluIGBlY2hvICR0YXJnZXRfYWxpYXMgJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLWRvCi0gIGlmIHRlc3QgIiR0YXJnX2FsaWFzIiA9ICJhbGwiOyB0aGVuCi0gICAgYWxsX3RhcmdldHM9dHJ1ZQotICBlbHNlCi0gICAgIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi0gICAgcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdGFyZ19hbGlhcyAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkcmVzdWx0IjsgdGhlbgotCXRhcmc9JHJlc3VsdAotICAgIGVsc2UKLQl0YXJnPSR0YXJnX2FsaWFzCi0gICAgZmkKLQotICAgIC4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS50Z3QKLQotICAgIGlmIHRlc3QgIiR0YXJnIiA9ICIkdGFyZ2V0IjsgdGhlbgotICAgICAgRU1VTD0kdGFyZ19lbXVsCi0gICAgZmkKLQotICAgIGZvciBpIGluICR0YXJnX2VtdWwgJHRhcmdfZXh0cmFfZW11bHMgJHRhcmdfZXh0cmFfbGlicGF0aDsgZG8KLQljYXNlICIgJGFsbF9lbXVscyAiIGluCi0JKiIgZSR7aX0ubyAiKikgOzsKLQkqKQotCSAgYWxsX2VtdWxzPSIkYWxsX2VtdWxzIGUke2l9Lm8iCi0JICBldmFsIHJlc3VsdD1cJHRkaXJfJGkKLQkgIHRlc3QgLXogIiRyZXN1bHQiICYmIHJlc3VsdD0kdGFyZ19hbGlhcwotCSAgZWNobyB0ZGlyXyRpPSRyZXN1bHQgPj4gdGRpcnMKLQkgIDs7Ci0JZXNhYwotICAgIGRvbmUKLQotICAgIGZvciBpIGluICR0YXJnX2VtdWwgJHRhcmdfZXh0cmFfbGlicGF0aDsgZG8KLQljYXNlICIgJGFsbF9saWJwYXRoICIgaW4KLQkqIiAke2l9ICIqKSA7OwotCSopCi0JICBpZiB0ZXN0IC16ICIkYWxsX2xpYnBhdGgiOyB0aGVuCi0JICAgIGFsbF9saWJwYXRoPSR7aX0KLQkgIGVsc2UKLQkgICAgYWxsX2xpYnBhdGg9IiRhbGxfbGlicGF0aCAke2l9IgotCSAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGRvbmUKLQotICAgIGZvciBpIGluICR0YXJnX2V4dHJhX29maWxlczsgZG8KLQljYXNlICIgJGFsbF9lbXVsX2V4dHJhcyAiIGluCi0JKiIgJHtpfSAiKikgOzsKLQkqKQotCSAgYWxsX2VtdWxfZXh0cmFzPSIkYWxsX2VtdWxfZXh0cmFzICR7aX0iCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0gIGZpCi1kb25lCi0KLQotCi1URElSUz10ZGlycwotCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geHRydWU7IHRoZW4KLSAgaWYgdGVzdCB4JHt3YW50NjR9ID0geHRydWU7IHRoZW4KLSAgICBFTVVMQVRJT05fT0ZJTEVTPSckKEFMTF9FTVVMQVRJT05TKSAkKEFMTF82NF9FTVVMQVRJT05TKScKLSAgZWxzZQotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpJwotICBmaQotICBFTVVMX0VYVFJBX09GSUxFUz0nJChBTExfRU1VTF9FWFRSQV9PRklMRVMpJwotZWxzZQotICBFTVVMQVRJT05fT0ZJTEVTPSRhbGxfZW11bHMKLSAgRU1VTF9FWFRSQV9PRklMRVM9JGFsbF9lbXVsX2V4dHJhcwotZmkKLQotCi0KLUVNVUxBVElPTl9MSUJQQVRIPSRhbGxfbGlicGF0aAotCi0KLWlmIHRlc3QgeCR7ZW5hYmxlX3N0YXRpY30gPSB4bm87IHRoZW4KLSAgVEVTVEJGRExJQj0iLS1ycGF0aCAuLi9iZmQvLmxpYnMgLi4vYmZkLy5saWJzL2xpYmJmZC5zbyIKLWVsc2UKLSAgVEVTVEJGRExJQj0iLi4vYmZkLy5saWJzL2xpYmJmZC5hIgotZmkKLQotCi10YXJnZXRfdmVuZG9yPSR7dGFyZ2V0X3ZlbmRvcj0kaG9zdF92ZW5kb3J9Ci1jYXNlICIkdGFyZ2V0X3ZlbmRvciIgaW4KLSAgaHApIEVYVFJBX1NITElCX0VYVEVOU0lPTj0iLnNsIiA7OwotICAqKSAgRVhUUkFfU0hMSUJfRVhURU5TSU9OPSA7OwotZXNhYwotaWYgdGVzdCB4JHtFWFRSQV9TSExJQl9FWFRFTlNJT059ICE9IHggOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIEVYVFJBX1NITElCX0VYVEVOU0lPTiAiJEVYVFJBX1NITElCX0VYVEVOU0lPTiIKLUVPRgotCi1maQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDQ0AlJENDJWcKLXMlQExEQCUkTEQlZwotcyVATk1AJSROTSVnCi1zJUBVU0VfU1lNQk9MX1VOREVSU0NPUkVAJSRVU0VfU1lNQk9MX1VOREVSU0NPUkUlZwotcyVATE5fU0AlJExOX1MlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAQVNAJSRBUyVnCi1zJUBMSUJUT09MQCUkTElCVE9PTCVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQFlBQ0NAJSRZQUNDJWcKLXMlQExFWEAlJExFWCVnCi1zJUBMRVhMSUJAJSRMRVhMSUIlZwotcyVATEVYX09VVFBVVF9ST09UQCUkTEVYX09VVFBVVF9ST09UJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBIT1NUSU5HX0NSVDBAJSRIT1NUSU5HX0NSVDAlZwotcyVASE9TVElOR19MSUJTQCUkSE9TVElOR19MSUJTJWcKLXMlQE5BVElWRV9MSUJfRElSU0AlJE5BVElWRV9MSUJfRElSUyVnCi1zJUBTVFJJTkdJRllAJSRTVFJJTkdJRlklZwotcyVARU1VTEAlJEVNVUwlZwotL0BURElSU0AvciAkVERJUlMKLXMlQFRESVJTQCUlZwotcyVARU1VTEFUSU9OX09GSUxFU0AlJEVNVUxBVElPTl9PRklMRVMlZwotcyVARU1VTF9FWFRSQV9PRklMRVNAJSRFTVVMX0VYVFJBX09GSUxFUyVnCi1zJUBFTVVMQVRJT05fTElCUEFUSEAlJEVNVUxBVElPTl9MSUJQQVRIJWcKLXMlQFRFU1RCRkRMSUJAJSRURVNUQkZETElCJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlLmhvc3QgYi9sZC9jb25maWd1cmUuaG9zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlZDE4OC4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUuaG9zdAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0jIFRoaXMgaXMgdGhlIGxpbmtlciBob3N0IHNwZWNpZmljIGZpbGUuICBUaGlzIGlzIGludm9rZWQgYnkgdGhlCi0jIGF1dG9jb25mIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LiAgUHV0dGluZyBpdCBpbiBhIHNlcGFyYXRlIHNoZWxsCi0jIGZpbGUgbGV0cyB1cyBza2lwIHJ1bm5pbmcgYXV0b2NvbmYgd2hlbiBtb2RpZnlpbmcgaG9zdCBzcGVjaWZpYwotIyBpbmZvcm1hdGlvbi4KLQotIyBUaGlzIGZpbGUgc2V0cyB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKLSMgIEhERUZJTkVTCQlob3N0IHNwZWNpZmljIGNvbXBpbGVyIGZsYWdzCi0jICBIT1NUSU5HX0NSVDAJCWNydDAubyBmaWxlIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKLSMgIEhPU1RJTkdfTElCUwkJbGlicmFyaWVzIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKLSMgIE5BVElWRV9MSUJfRElSUwlsaWJyYXJ5IGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBvbiB0aGlzIGhvc3QKLQotSERFRklORVM9Ci1IT1NUSU5HX0NSVDA9L2xpYi9jcnQwLm8KLUhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYycKLU5BVElWRV9MSUJfRElSUz0KLQotY2FzZSAiJHtob3N0fSIgaW4KLQotYWxwaGEqLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgYGVncmVwICJsZFteIF0qXC5zbyIgXGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1zcGVjc1xgIHwgc2VkIC1lICJzLC4qLWR5bmFtaWMtbGlua2VyWyAJXVsgCV0qXCguKi9sZFteIF0qLnNvLi5cKS4qLFwxLCJgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnQxLm9gIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRpLm9gIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1MYGRpcm5hbWUgXGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1saWJjLnNvXGBgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0bi5vYCcKLSAgOzsKLQotYWxwaGEqLSotbmV0YnNkKikKLSAgIyBUaGUgbmV3IEJTRCBgbWFrZScgaGFzIGEgYnVnOiBpdCBkb2Vzbid0IHBhc3MgZW1wdHkgYXJndW1lbnRzIGluCi0gICMgc2hlbGwgY29tbWFuZHMuICBTbyB3ZSBuZWVkIHRvIG1ha2UgdGhpcyB2YWx1ZSBub24tZW1wdHkgaW4gb3JkZXIKLSAgIyBmb3IgdGhlIGdlbnNjcmlwdHMuc2ggY2FsbCB0byB3b3JrLiAgVGhlcmUncyBub3RoaW5nIG1hZ2ljIGFib3V0Ci0gICMgdGhlIHZhbHVlIGAvbGliJzsgaXQncyBqdXN0IGEgZHVtbXkuCi0gIE5BVElWRV9MSUJfRElSUz0vbGliCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotYWxwaGEqLSotKikKLSAgSE9TVElOR19DUlQwPS91c3IvY2NzL2xpYi9jcnQwLm8KLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1hcm0qLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctcCAtZHluYW1pYy1saW5rZXIgYGZncmVwIGxkLWxpbnV4LnNvIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9c3BlY3NcYCB8IHNlZCAtZSAicywuKi1keW5hbWljLWxpbmtlclsgCV1bIAldKlwoLiovbGQtbGludXguc28uLlwpLiosXDEsImAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1pWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCogfCBpWzM0NTZdODYtKi1uZXRic2QqKQotICAjIFRoZSBuZXcgQlNEIGBtYWtlJyBoYXMgYSBidWc6IGl0IGRvZXNuJ3QgcGFzcyBlbXB0eSBhcmd1bWVudHMgaW4KLSAgIyBzaGVsbCBjb21tYW5kcy4gIFNvIHdlIG5lZWQgdG8gbWFrZSB0aGlzIHZhbHVlIG5vbi1lbXB0eSBpbiBvcmRlcgotICAjIGZvciB0aGUgZ2Vuc2NyaXB0cy5zaCBjYWxsIHRvIHdvcmsuICBUaGVyZSdzIG5vdGhpbmcgbWFnaWMgYWJvdXQKLSAgIyB0aGUgdmFsdWUgYC9saWInOyBpdCdzIGp1c3QgYSBkdW1teS4KLSAgTkFUSVZFX0xJQl9ESVJTPS9saWIKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1pWzM0NTZdODYtKi1zeXN2NCopCi0gIEhPU1RJTkdfQ1JUMD0nL3Vzci9jY3MvbGliL2NydDEubyAvdXNyL2Njcy9saWIvY3J0aS5vIC91c3IvY2NzL2xpYi92YWx1ZXMtWGEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL3Vzci9jY3MvbGliL2NydG4ubycKLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1pWzM0NTZdODYtc2VxdWVudC1wdHgqIHwgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQwLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgJwotICA7OwotCi1pWzM0NTZdODYtKi1zeXN2KikKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBmaWAgL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXNvbGFyaXMqKQotICBIT1NUSU5HX0NSVDA9J2BpZiBbIC1mIC4uL2djYy9jcnQxLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnQxLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnQxLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0aS5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0aS5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0aS5vOyBmaWAgL3Vzci9jY3MvbGliL3ZhbHVlcy1YYS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0bi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0bi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0bi5vOyBmaWAnCi0gIE5BVElWRV9MSUJfRElSUz0vdXNyL2Njcy9saWIKLSAgOzsKLQotaVszNDU2XTg2LSotc2NvKiB8IGlbMzQ1Nl04Ni0qLWlzYyopCi0gICMgSW4gc29tZSBjb25maWd1cmF0aW9ucyBnY2MgZG9lcyBub3QgdXNlIGNydGJlZ2luLm8gYW5kIGNydGVuZC5vLgotICAjIEluIHRoYXQgY2FzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vIHdpbGwgc2ltcGx5IHByaW50Ci0gICMgY3J0YmVnaW4uby4gIFdlIGNyZWF0ZSBkdW1teSBjcnRiZWdpbi5vIGFuZCBjcnRlbmQubyBmaWxlcyB0bwotICAjIGhhbmRsZSB0aGlzLgotICBlY2hvICJpbnQgZHVtbXlfY3J0YmVnaW4gKCkgeyByZXR1cm4gMDsgfSIgPiBjcnRiZWdpbi5jCi0gICR7Q0N9IC1jIGNydGJlZ2luLmMgLW8gY3J0YmVnaW4ubwotICBybSAtZiBjcnRiZWdpbi5jCi0gIGVjaG8gImludCBkdW1teV9jcnRlbmcgKCkgeyByZXR1cm4gMDsgfSIgPiBjcnRlbmQuYwotICAke0NDfSAtYyBjcnRlbmQuYyAtbyBjcnRlbmQubwotICBybSAtZiBjcnRlbmQuYwotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvbGliL2NydG4ubycKLSAgOzsKLQotaVszNDU2XTg2LSotbGludXgqYW91dCogfCBpWzM0NTZdODYtKi1saW51eG9sZGxkKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWxpbnV4KmxpYmMxKikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYi9sZC1saW51eC5zby4xIC91c3IvbGliL2NydDEubyAvdXNyL2xpYi9jcnRpLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbGlmIFsgLWYgL3Vzci9saWIvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gL3Vzci9saWIvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRlbmQubyBdOyB0aGVuIGVjaG8gL3Vzci9saWIvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIGBmZ3JlcCBsZC1saW51eC5zbyBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPXNwZWNzXGAgfCBzZWQgLWUgInMsLiotZHluYW1pYy1saW5rZXJbIAldWyAJXSpcKC4qL2xkLWxpbnV4LnNvLi5cKS4qLFwxLCJgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnQxLm9gIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRpLm9gIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1MYGRpcm5hbWUgXGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1saWJjLnNvXGBgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0bi5vYCcKLSAgOzsKLQotaVszNDU2XTg2LSotbHlueG9zKikKLSAgSE9TVElOR19DUlQwPS9saWIvaW5pdDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgLWxtIC9saWIvaW5pdG4ubycKLSAgOzsKLQotaVszNDU2XTg2LXBjLWludGVyaXgqKQotICBIT1NUSU5HX0NSVDA9JyQkSU5URVJJWF9ST09UL3Vzci9saWIvY3J0MC5vJwotICBOQVRJVkVfTElCX0RJUlM9JyQkSU5URVJJWF9ST09UL3Vzci9saWIvJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTCAkJFgvbG9jYWxfYmluIC1MICQkSU5URVJJWF9ST09UL3Vzci9saWIgLWxjIC1sY3BzeCAtbGMgLWxjcHN4ICQkSU5URVJJWF9ST09UL3Vzci9saWIvcHN4ZGxsLmEgJCRJTlRFUklYX1JPT1QvdXNyL2xpYi9wc3hkbGwyLmEnCi0gIDs7Ci0KLW1pcHMqLWRlYy1ic2QqKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLW1pcHMqLXNnaS1pcml4NCopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQxLm8KLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotbWlwcyotc2dpLWlyaXg1KikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1taXBzKi1zZ2ktaXJpeDYqKQotICBIT1NUSU5HX0NSVDA9Jy91c3IvbGliMzIvY3J0MS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubyA7IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1ML3Vzci9saWIzMiAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm8gOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYjMyL2NydG4ubyAtaW5pdCBfX2RvX2dsb2JhbF9jdG9ycyAtZmluaSBfX2RvX2dsb2JhbF9kdG9ycycKLSAgOzsKLQotbWlwcyotKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1tNjgqLSotbGludXgqYW91dCopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotbTY4Ki0qLWxpbnV4KmxpYmMxKikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYi9sZC1saW51eC5zby4xIC91c3IvbGliL2NydDEubyAvdXNyL2xpYi9jcnRpLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbGlmIFsgLWYgL3Vzci9saWIvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gL3Vzci9saWIvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRlbmQubyBdOyB0aGVuIGVjaG8gL3Vzci9saWIvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW02OCotKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1tNjgqLSotbHlueG9zKikKLSAgSE9TVElOR19DUlQwPS9saWIvaW5pdDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgLWxtIC9saWIvaW5pdG4ubycKLSAgOzsKLQotbTY4Ki1tb3Rvcm9sYS1zeXN2KQotICBIT1NUSU5HX0NSVDA9J2BpZiBbIC1mIC4uL2djYy9jcnQwLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnQwLm87IGVsaWYgWyAtZiBcYCR7Q0N9IC1wcmludC1maWxlLW5hbWU9XGBjcnQwLm8gXTsgdGhlbiBlY2hvIFxgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1cYGNydDAubzsgZWxzZSBlY2hvIC9saWIvY3J0MC5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYzg4MSBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAnCi0gIDs7Ci0KLW02OCotc3VuLSopCi0gIEhPU1RJTkdfQ1JUMD0nL3Vzci9saWIvY3J0MC5vIC91c3IvbGliL0ZjcnQxLm8gLUwvdXNyL2xpYi9mc29mdC5vJwotICA7OwotCi1tODgqLSotZGd1eCopCi0gIEhERUZJTkVTPS1EX191c2luZ19ER1VYCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQwLm8gLVgnCi0gIEhPU1RJTkdfTElCUz0vdXNyL3NkZS9tODhrYmNzL2xpYi9saWJjLmEKLSAgOzsKLQotbTg4Ki1tb3Rvcm9sYS1zeXN2MykKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgJwotICA7OwotCi1wb3dlcnBjKi0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQuc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLXJvbXAtKi0qKQotICBIREVGSU5FUz0tRE5PX1ZBUkFSR1MKLSAgOzsKLQotc3BhcmMqLSotc29sYXJpczIqKQotICBIT1NUSU5HX0NSVDA9J2BpZiBbIC1mIC4uL2djYy9jcnQxLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnQxLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnQxLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0aS5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0aS5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0aS5vOyBmaWAgL3Vzci9jY3MvbGliL3ZhbHVlcy1YYS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0bi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0bi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0bi5vOyBmaWAnCi0gIE5BVElWRV9MSUJfRElSUz0vdXNyL2Njcy9saWIKLSAgOzsKLQotc3BhcmMtKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjIgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1zcGFyYzY0LSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYjY0L2xkLWxpbnV4LnNvLjIgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1lc2FjCmRpZmYgLS1naXQgYS9sZC9jb25maWd1cmUuaW4gYi9sZC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZmM1ZjYuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Ci1kbmwKLUFDX1BSRVJFRygyLjEzKQotQUNfSU5JVChsZG1haW4uYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BTV9JTklUX0FVVE9NQUtFKGxkLCAyLjkuNSkKLQotQU1fUFJPR19MSUJUT09MCi0KLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9uc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoNjQtYml0LWJmZCwKLVsgIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgIHdhbnQ2ND10cnVlICA7OwotICBubykgICB3YW50NjQ9ZmFsc2UgOzsKLSAgKikgICAgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIDY0LWJpdC1iZmQgb3B0aW9uKSA7OwotZXNhY10sW3dhbnQ2ND1mYWxzZV0pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotQUNfUFJPR19DQwotQUNfUFJPR19JTlNUQUxMCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotQUNfRVhFRVhUCi0KLUFDX1BST0dfWUFDQwotQU1fUFJPR19MRVgKLQotQU1fTUFJTlRBSU5FUl9NT0RFCi0KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQUNfU1VCU1QoSE9TVElOR19DUlQwKQotQUNfU1VCU1QoSE9TVElOR19MSUJTKQotQUNfU1VCU1QoTkFUSVZFX0xJQl9ESVJTKQotCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB1bmlzdGQuaCkKLUFDX0NIRUNLX0ZVTkNTKHNicmspCi1BQ19IRUFERVJfRElSRU5UCi0KLUJGRF9CSU5BUllfRk9QRU4KLQotQkZEX05FRURfREVDTEFSQVRJT04oc3Ryc3RyKQotQkZEX05FRURfREVDTEFSQVRJT04oZnJlZSkKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHNicmspCi1CRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihlbnZpcm9uKQotCi0jIFdoZW4gY29udmVydGluZyBsaW5rZXIgc2NyaXB0cyBpbnRvIHN0cmluZ3MgZm9yIHVzZSBpbiBlbXVsYXRpb24KLSMgZmlsZXMsIHVzZSBhc3RyaW5nLnNlZCBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgQU5TSSBzdHJpbmcKLSMgY29uY2F0ZW5hdGlvbiwgb3Igb3N0cmluZy5zZWQgb3RoZXJ3aXNlLiAgVGhpcyBpcyB0byBzdXBwb3J0IHRoZQotIyBicm9rZW4gTWljcm9zb2Z0IE1TVkMgY29tcGlsZXIsIHdoaWNoIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIHN0cmluZwotIyBjb25zdGFudHMsIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgcHJlLUFOU0kgY29tcGlsZXJzIHdoaWNoIGRvIG5vdAotIyBzdXBwb3J0IHN0cmluZyBjb25jYXRlbmF0aW9uLgotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIEFOU0kgQyBzdHJpbmcgY29uY2F0ZW5hdGlvbiB3b3Jrc10pCi1BQ19DQUNIRV9WQUwobGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb24sCi1bQUNfVFJZX0NPTVBJTEUoLFtjaGFyICphID0gImEiICJhIjtdLAotICBbbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb249eWVzXSwKLSAgW2xkX2N2X3N0cmluZ19jb25jYXRlbmF0aW9uPW5vXSldKQotQUNfTVNHX1JFU1VMVCgkbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb24pCi1pZiB0ZXN0ICIkbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb24iID0gInllcyI7IHRoZW4KLSAgU1RSSU5HSUZZPWFzdHJpbmcuc2VkCi1lbHNlCi0gIFNUUklOR0lGWT1vc3RyaW5nLnNlZAotZmkKLUFDX1NVQlNUKFNUUklOR0lGWSkKLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLWFsbF90YXJnZXRzPQotRU1VTD0KLWFsbF9lbXVscz0KLWFsbF9lbXVsX2V4dHJhcz0KLWFsbF9saWJwYXRoPQotCi1kbmwgV2UgbmVlZCB0byBnZXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0ZGlyIGRlZmluaXRpb25zIGludG8KLWRubCBNYWtlZmlsZS4gIFdlIGNhbid0IGRvIGl0IHVzaW5nIEFDX1NVQlNULCBiZWNhdXNlIGF1dG9jb25mIGRvZXMKLWRubCBub3QgcGVybWl0IGxpdGVyYWwgbmV3bGluZXMgaW4gYW4gQUNfU1VCU1QgdmFyaWFibGVzLiAgU28gd2UgdXNlIGEKLWRubCBmaWxlLgotcm0gLWYgdGRpcnMKLQotZm9yIHRhcmdfYWxpYXMgaW4gYGVjaG8gJHRhcmdldF9hbGlhcyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotZG8KLSAgaWYgdGVzdCAiJHRhcmdfYWxpYXMiID0gImFsbCI7IHRoZW4KLSAgICBhbGxfdGFyZ2V0cz10cnVlCi0gIGVsc2UKLSAgICAjIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLSAgICByZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnX2FsaWFzIDI+L2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCi0JdGFyZz0kcmVzdWx0Ci0gICAgZWxzZQotCXRhcmc9JHRhcmdfYWxpYXMKLSAgICBmaQotCi0gICAgLiAke3NyY2Rpcn0vY29uZmlndXJlLnRndAotCi0gICAgaWYgdGVzdCAiJHRhcmciID0gIiR0YXJnZXQiOyB0aGVuCi0gICAgICBFTVVMPSR0YXJnX2VtdWwKLSAgICBmaQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZW11bCAkdGFyZ19leHRyYV9lbXVscyAkdGFyZ19leHRyYV9saWJwYXRoOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxzICIgaW4KLQkqIiBlJHtpfS5vICIqKSA7OwotCSopCi0JICBhbGxfZW11bHM9IiRhbGxfZW11bHMgZSR7aX0ubyIKLQkgIGV2YWwgcmVzdWx0PVwkdGRpcl8kaQotCSAgdGVzdCAteiAiJHJlc3VsdCIgJiYgcmVzdWx0PSR0YXJnX2FsaWFzCi0JICBlY2hvIHRkaXJfJGk9JHJlc3VsdCA+PiB0ZGlycwotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZW11bCAkdGFyZ19leHRyYV9saWJwYXRoOyBkbwotCWNhc2UgIiAkYWxsX2xpYnBhdGggIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGlmIHRlc3QgLXogIiRhbGxfbGlicGF0aCI7IHRoZW4KLQkgICAgYWxsX2xpYnBhdGg9JHtpfQotCSAgZWxzZQotCSAgICBhbGxfbGlicGF0aD0iJGFsbF9saWJwYXRoICR7aX0iCi0JICBmaQotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZXh0cmFfb2ZpbGVzOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxfZXh0cmFzICIgaW4KLQkqIiAke2l9ICIqKSA7OwotCSopCi0JICBhbGxfZW11bF9leHRyYXM9IiRhbGxfZW11bF9leHRyYXMgJHtpfSIKLQkgIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgZmkKLWRvbmUKLQotQUNfU1VCU1QoRU1VTCkKLQotVERJUlM9dGRpcnMKLUFDX1NVQlNUX0ZJTEUoVERJUlMpCi0KLWRubCBGSVhNRTogV2Ugd2lsbCBidWlsZCBhIDY0IGJpdCBCRkQgZm9yIGEgNjQgYml0IGhvc3Qgb3IgYSA2NCBiaXQKLWRubCB0YXJnZXQsIGFuZCBpbiB0aG9zZSBjYXNlcyB3ZSBzaG91bGQgYWxzbyBidWlsZCB0aGUgNjQgYml0Ci1kbmwgZW11bGF0aW9ucy4KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geHRydWU7IHRoZW4KLSAgaWYgdGVzdCB4JHt3YW50NjR9ID0geHRydWU7IHRoZW4KLSAgICBFTVVMQVRJT05fT0ZJTEVTPSckKEFMTF9FTVVMQVRJT05TKSAkKEFMTF82NF9FTVVMQVRJT05TKScKLSAgZWxzZQotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpJwotICBmaQotICBFTVVMX0VYVFJBX09GSUxFUz0nJChBTExfRU1VTF9FWFRSQV9PRklMRVMpJwotZWxzZQotICBFTVVMQVRJT05fT0ZJTEVTPSRhbGxfZW11bHMKLSAgRU1VTF9FWFRSQV9PRklMRVM9JGFsbF9lbXVsX2V4dHJhcwotZmkKLUFDX1NVQlNUKEVNVUxBVElPTl9PRklMRVMpCi1BQ19TVUJTVChFTVVMX0VYVFJBX09GSUxFUykKLQotRU1VTEFUSU9OX0xJQlBBVEg9JGFsbF9saWJwYXRoCi1BQ19TVUJTVChFTVVMQVRJT05fTElCUEFUSCkKLQotaWYgdGVzdCB4JHtlbmFibGVfc3RhdGljfSA9IHhubzsgdGhlbgotICBURVNUQkZETElCPSItLXJwYXRoIC4uL2JmZC8ubGlicyAuLi9iZmQvLmxpYnMvbGliYmZkLnNvIgotZWxzZQotICBURVNUQkZETElCPSIuLi9iZmQvLmxpYnMvbGliYmZkLmEiCi1maQotQUNfU1VCU1QoVEVTVEJGRExJQikKLQotdGFyZ2V0X3ZlbmRvcj0ke3RhcmdldF92ZW5kb3I9JGhvc3RfdmVuZG9yfQotY2FzZSAiJHRhcmdldF92ZW5kb3IiIGluCi0gIGhwKSBFWFRSQV9TSExJQl9FWFRFTlNJT049Ii5zbCIgOzsKLSAgKikgIEVYVFJBX1NITElCX0VYVEVOU0lPTj0gOzsKLWVzYWMKLWlmIHRlc3QgeCR7RVhUUkFfU0hMSUJfRVhURU5TSU9OfSAhPSB4IDsgdGhlbgotICBBQ19ERUZJTkVfVU5RVU9URUQoRVhUUkFfU0hMSUJfRVhURU5TSU9OLCAiJEVYVFJBX1NITElCX0VYVEVOU0lPTiIsCi0gICBbQWRkaXRpb25hbCBleHRlbnNpb24gYSBzaGFyZWQgb2JqZWN0IG1pZ2h0IGhhdmUuXSkKLWZpCi0KLUFDX09VVFBVVChNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9sZC9jb25maWd1cmUudGd0IGIvbGQvY29uZmlndXJlLnRndApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4OWNhOS4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUudGd0CisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLSMgVGhpcyBpcyB0aGUgbGlua2VyIHRhcmdldCBzcGVjaWZpYyBmaWxlLiAgVGhpcyBpcyBpbnZva2VkIGJ5IHRoZQotIyBhdXRvY29uZiBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdC4gIFB1dHRpbmcgaXQgaW4gYSBzZXBhcmF0ZSBzaGVsbAotIyBmaWxlIGxldHMgdXMgc2tpcCBydW5uaW5nIGF1dG9jb25mIHdoZW4gbW9kaWZ5aW5nIHRhcmdldCBzcGVjaWZpYwotIyBpbmZvcm1hdGlvbi4KLQotIyBUaGlzIGZpbGUgc3dpdGNoZXMgb24gdGhlIHNoZWxsIHZhcmlhYmxlICR7dGFyZ30sIGFuZCBzZXRzIHRoZQotIyBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgdGFyZ19lbXVsCQluYW1lIG9mIGxpbmtlciBlbXVsYXRpb24gdG8gdXNlCi0jICB0YXJnX2V4dHJhX2VtdWxzCWFkZGl0aW9uYWwgbGlua2VyIGVtdWxhdGlvbnMgdG8gcHJvdmlkZQotIyAgdGFyZ19leHRyYV9saWJwYXRoCWFkZGl0aW9uYWwgbGlua2VyIGVtdWxhdGlvbnMgdXNpbmcgTElCX1BBVEgKLSMgIHRhcmdfZXh0cmFfb2ZpbGVzCWFkZGl0aW9uYWwgb2JqZWN0cyBuZWVkZWQgYnkgdGhlIGVtdWxhdGlvbgotCi10YXJnX2V4dHJhX2VtdWxzPQotdGFyZ19leHRyYV9vZmlsZXM9Ci0KLWNhc2UgIiR7dGFyZ30iIGluCi1hcm0tZXBvYy1wZSkJCXRhcmdfZW11bD1hcm1fZXBvY19wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWFybS0qLXBlKQkJdGFyZ19lbXVsPWFybXBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotYXJjLSotZWxmKikJCXRhcmdfZW11bD1hcmNlbGYgOzsKLWQxMHYtKi0qKQkJdGFyZ19lbXVsPWQxMHZlbGYgOzsKLWQzMHYtKi0qZXh0KikJCXRhcmdfZW11bD1kMzB2X2U7IHRhcmdfZXh0cmFfZW11bHM9ImQzMHZlbGYgZDMwdl9vIiA7OwotZDMwdi0qLSpvbmNoaXAqKQl0YXJnX2VtdWw9ZDMwdl9vOyB0YXJnX2V4dHJhX2VtdWxzPSJkMzB2ZWxmIGQzMHZfZSIgOzsKLWQzMHYtKi0qKQkJdGFyZ19lbXVsPWQzMHZlbGY7IHRhcmdfZXh0cmFfZW11bHM9ImQzMHZfZSBkMzB2X28iIDs7Ci1zcGFyYzY0LSotYW91dCopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKLXNwYXJjNjQtKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjY0X3NwYXJjIDs7Ci1zcGFyYy1zdW4tc3Vub3M0KikgCXRhcmdfZW11bD1zdW40IDs7Ci1zcGFyY2xpdGUqLSotZWxmKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKLXNwYXJjbGl0ZSotKi1jb2ZmKQl0YXJnX2VtdWw9Y29mZl9zcGFyYyA7Owotc3BhcmNsaXRlKi1mdWppdHN1LSopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKLXNwYXJjKi0qLWFvdXQpCQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYyotKi1jb2ZmKQkJdGFyZ19lbXVsPWNvZmZfc3BhcmMgOzsKLXNwYXJjKi0qLWVsZikJCXRhcmdfZW11bD1lbGYzMl9zcGFyYyA7Owotc3BhcmMqLSotc3lzdjQqKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKLXNwYXJjKi0qLWxpbnV4KmFvdXQqKQl0YXJnX2VtdWw9c3BhcmNsaW51eAotCQkJdGFyZ19leHRyYV9lbXVscz0iZWxmMzJfc3BhcmMgc3VuNCIKLQkJCXRkaXJfZWxmMzJfc3BhcmM9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9hb3V0Ly8nYAotCQkJdGRpcl9zdW40PXNwYXJjLXN1bi1zdW5vczQKLQkJCTs7Ci1zcGFyYzY0LSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZjY0X3NwYXJjCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMl9zcGFyYyBzcGFyY2xpbnV4IHN1bjQiCi0JCQl0ZGlyX2VsZjMyX3NwYXJjPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvNjQvLydgCi0JCQl0ZGlyX3NwYXJjbGludXg9JHt0ZGlyX2VsZjMyX3NwYXJjfWFvdXQKLQkJCXRkaXJfc3VuND1zcGFyYy1zdW4tc3Vub3M0Ci0JCQk7Owotc3BhcmMqLSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJzcGFyY2xpbnV4IHN1bjQiCi0JCQl0ZGlyX3NwYXJjbGludXg9JHt0YXJnX2FsaWFzfWFvdXQKLQkJCXRkaXJfc3VuND1zcGFyYy1zdW4tc3Vub3M0Ci0JCQk7Owotc3BhcmMqLSotbHlueG9zKikJdGFyZ19lbXVsPXNwYXJjbHlueCA7Owotc3BhcmMqLSotbmV0YnNkKikJdGFyZ19lbXVsPXNwYXJjbmJzZCA7Owotc3BhcmMqLSotc29sYXJpczIqKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKLXNwYXJjKi13cnMtdnh3b3JrcyopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKLXNwYXJjKi0qLXJ0ZW1zKikJdGFyZ19lbXVsPXNwYXJjYW91dCA7OwotaTk2MC13cnMtdnh3b3JrczUuMCopCXRhcmdfZW11bD1nbGQ5NjAgOzsKLWk5NjAtd3JzLXZ4d29ya3M1KikJdGFyZ19lbXVsPWdsZDk2MGNvZmYgOzsKLWk5NjAtd3JzLXZ4d29ya3MqKQl0YXJnX2VtdWw9Z2xkOTYwIDs7Ci1pOTYwLSotY29mZikJCXRhcmdfZW11bD1nbGQ5NjBjb2ZmIDs7Ci1pOTYwLWludGVsLW5pbmR5KQl0YXJnX2VtdWw9Z2xkOTYwIDs7Ci1pOTYwLSotcnRlbXMqKQkJdGFyZ19lbXVsPWdsZDk2MGNvZmYgOzsKLWk5NjAtKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjMyX2k5NjAgOzsKLW0zMnItKi0qKQkJdGFyZ19lbXVsPW0zMnJlbGYgOzsKLW02OCotc3VuLXN1bm9zWzM0XSopCXRhcmdfZW11bD1zdW4zIDs7Ci1tNjgqLXdycy12eHdvcmtzKikJdGFyZ19lbXVsPXN1bjMgOzsKLW02OCotZXJpY3Nzb24tb3NlKQl0YXJnX2VtdWw9c3VuMyA7OwotbTY4Ki1hcHBsZS1hdXgqKQl0YXJnX2VtdWw9bTY4a2F1eCA7OwotKi10YW5kZW0tbm9uZSkJCXRhcmdfZW11bD1zdDIwMDAgOzsKLWlbMzQ1Nl04Ni0qLXZzdGEpCXRhcmdfZW11bD12c3RhIDs7Ci1pWzM0NTZdODYtZ28zMi1ydGVtcyopCXRhcmdfZW11bD1pMzg2Z28zMiA7OwotaVszNDU2XTg2LSotZ28zMikJdGFyZ19lbXVsPWkzODZnbzMyIDs7Ci1pWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikgdGFyZ19lbXVsPWkzODZnbzMyIDs7Ci1pWzM0NTZdODYtKi1haXgqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLXNjbyopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotaXNjKikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1seW54b3MqKQl0YXJnX2VtdWw9aTM4Nmx5bnggOzsKLWlbMzQ1Nl04Ni0qLWNvZmYpCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotcnRlbXNlbGYqKSAgdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1ydGVtcyopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotYnNkKQl0YXJnX2VtdWw9aTM4NmJzZCA7OwotaVszNDU2XTg2LSotYnNkMzg2KQl0YXJnX2VtdWw9aTM4NmJzZCA7OwotaVszNDU2XTg2LSotYnNkaSopCXRhcmdfZW11bD1pMzg2YnNkIDs7Ci1pWzM0NTZdODYtKi1hb3V0KQl0YXJnX2VtdWw9aTM4NmFvdXQgOzsKLWlbMzQ1Nl04Ni0qLWxpbnV4KmFvdXQqKQl0YXJnX2VtdWw9aTM4NmxpbnV4Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPWVsZl9pMzg2Ci0JCQl0ZGlyX2VsZl9pMzg2PWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvYW91dC8vJ2AKLQkJCTs7Ci1pWzM0NTZdODYtKi1saW51eG9sZGxkKQl0YXJnX2VtdWw9aTM4NmxpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmX2kzODYKLQkJCXRhcmdfZXh0cmFfZW11bHM9aTM4NmxpbnV4Ci0JCQl0ZGlyX2kzODZsaW51eD0ke3RhcmdfYWxpYXN9YW91dAotCQkJOzsKLWlbMzQ1Nl04Ni0qLXN5c3Y0KikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1zb2xhcmlzMiopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotdW5peHdhcmUpCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotc29sYXJpcyopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotbmV0YnNkKikJdGFyZ19lbXVsPWkzODZuYnNkIDs7Ci1pWzM0NTZdODYtKi1uZXR3YXJlKQl0YXJnX2VtdWw9aTM4Nm53IDs7Ci1pWzM0NTZdODYtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLWZyZWVic2Rhb3V0KiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdLiogfCBpWzM0NTZdODYtKi1mcmVlYnNkWzEyXSkKLQkJCXRhcmdfZW11bD1pMzg2YnNkIDs7Ci1pWzM0NTZdODYtKi1mcmVlYnNkKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1zeXN2KikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1wdHgqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLW1hY2gqKQl0YXJnX2VtdWw9aTM4Nm1hY2ggOzsKLWlbMzQ1Nl04Ni0qLWdudSopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotbXNkb3MqKQl0YXJnX2VtdWw9aTM4Nm1zZG9zOyB0YXJnX2V4dHJhX2VtdWxzPWkzODZhb3V0IDs7Ci1pWzM0NTZdODYtKi1tb3NzKikJdGFyZ19lbXVsPWkzODZtb3NzOyB0YXJnX2V4dHJhX2VtdWxzPWkzODZtc2RvcyA7OwotaVszNDU2XTg2LSotd2lubnQqKQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotcGUpCQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotY3lnd2luKikJdGFyZ19lbXVsPWkzODZwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotaW50ZXJpeCopCXRhcmdfZW11bD1pMzg2cGVfcG9zaXg7Ci0gCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1iZW9zcGUqKSAgICB0YXJnX2VtdWw9aTM4NmJlb3MgOzsKLWlbMzQ1Nl04Ni0qLWJlb3MqKQl0YXJnX2VtdWw9ZWxmX2kzODZfYmUgOzsKLWlbMzQ1Nl04Ni0qLXZ4d29ya3MqKQl0YXJnX2VtdWw9aTM4NmFvdXQgOzsKLW04Ki0qLSopCQl0YXJnX2VtdWw9bTg4a2JjcyA7OwotYTI5ay0qLXVkaSkJCXRhcmdfZW11bD1zYTI5MjAwIDs7Ci1hMjlrLSotZWJtb24pCQl0YXJnX2VtdWw9ZWJtb24yOWsgOzsKLWEyOWstKi0qKQkJdGFyZ19lbXVsPWEyOWsgOzsKLSMgIGFybS0qLXJpc2NpeCopCQl0YXJnX2VtdWw9cmlzY2l4IDs7Ci1hcm0tKi1hb3V0IHwgYXJtZWwtKi1hb3V0KSB0YXJnX2VtdWw9YXJtYW91dGwgOzsKLWFybWViLSotYW91dCkJCXRhcmdfZW11bD1hcm1hb3V0YiA7OwotYXJtLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci1hcm0tKi1uZXRic2QqKQkJdGFyZ19lbXVsPWFybW5ic2QgOzsKLWFybS0qLWVsZikJCXRhcmdfZW11bD1hcm1lbGYgOzsKLWFybS0qLW9hYmkpCQl0YXJnX2VtdWw9YXJtZWxmX29hYmkgOzsKLWFybSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9YXJtZWxmX2xpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPSJhcm1lbGZfbGludXgyNiBhcm1lbGYiIDs7Ci1hcm0qLSotdWNsaW51eCopCXRhcmdfZW11bD1hcm1lbGZfbGludXg7IHRhcmdfZXh0cmFfZW11bHM9YXJtZWxmIDs7Ci10aHVtYi0qLWxpbnV4LWdudSogfCB0aHVtYi0qLXVjbGludXgqKQl0YXJnX2VtdWw9YXJtZWxmX2xpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPWFybWVsZiA7Owotc3Ryb25nYXJtLSotY29mZikJdGFyZ19lbXVsPWFybWNvZmYgOzsKLXN0cm9uZ2FybS0qLWVsZikJdGFyZ19lbXVsPWFybWVsZiA7OwotdGh1bWItKi1jb2ZmKQkJdGFyZ19lbXVsPWFybWNvZmYgOzsKLXRodW1iLSotZWxmKQkJdGFyZ19lbXVsPWFybWVsZiA7OwotdGh1bWItKi1vYWJpKSAgICAgICAgICAgdGFyZ19lbXVsPWFybWVsZl9vYWJpIDs7Ci10aHVtYi1lcG9jLXBlKQkJdGFyZ19lbXVsPWFybV9lcG9jX3BlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotdGh1bWItKi1wZSkJCXRhcmdfZW11bD1hcm1wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWg4MzAwLSotaG1zKiB8IGg4MzAwLSotY29mZiopCi0JCQl0YXJnX2VtdWw9aDgzMDA7IHRhcmdfZXh0cmFfZW11bHM9Img4MzAwaCBoODMwMHMiCi0JCQk7OwotaDg1MDAtKi1obXMqIHwgaDg1MDAtKi1jb2ZmKikKLQkJCXRhcmdfZW11bD1oODUwMAotCQkJdGFyZ19leHRyYV9lbXVscz0iaDg1MDBzIGg4NTAwYiBoODUwMG0gaDg1MDBjIgotCQkJOzsKLXNoLSotZWxmKiB8IHNoLSotcnRlbXNlbGYqKQotCQkJdGFyZ19lbXVsPXNoZWxmCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJzaGxlbGYgc2ggc2hsIgotCQkJOzsKLXNoLSotKnxzaC0qLXJ0ZW1zKikJdGFyZ19lbXVsPXNoOyB0YXJnX2V4dHJhX2VtdWxzPXNobCA7OwotbTY4ay1zb255LSopCQl0YXJnX2VtdWw9bmV3cyA7OwotbTY4ay1ocC1ic2QqKQkJdGFyZ19lbXVsPWhwMzAwYnNkIDs7Ci1tNjgqLW1vdG9yb2xhLXN5c3YqKQl0YXJnX2VtdWw9ZGVsdGE2OCA7OwotbTY4Ki0qLWFvdXQpCQl0YXJnX2VtdWw9bTY4a2FvdXQgOzsKLW02OCotKi1jb2ZmKQkJdGFyZ19lbXVsPW02OGtjb2ZmIDs7Ci1tNjgqLSotZWxmKQkJdGFyZ19lbXVsPW02OGtlbGYgOzsKLW02OCotKi1ocHV4KikJCXRhcmdfZW11bD1ocDNocHV4IDs7Ci1tNjhrLSotbGludXgqYW91dCopCXRhcmdfZW11bD1tNjhrbGludXgKLQkJCXRhcmdfZXh0cmFfZW11bHM9bTY4a2VsZgotCQkJdGRpcl9tNjhrZWxmPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvYW91dC8vJ2AKLQkJCTs7Ci1tNjhrLSotbGludXgtZ251KikJdGFyZ19lbXVsPW02OGtlbGYKLQkJCXRhcmdfZXh0cmFfZW11bHM9bTY4a2xpbnV4Ci0JCQl0ZGlyX202OGtsaW51eD1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2xpbnV4L2xpbnV4YW91dC8nYAotCQkJOzsKLW02OCotKi1nbnUqKQkJdGFyZ19lbXVsPW02OGtlbGYgOzsKLW02OCotKi1seW54b3MqKQkJdGFyZ19lbXVsPW02OGtseW54IDs7Ci1tNjgqLWhwKi1uZXRic2QqKQl0YXJnX2VtdWw9bTY4azRrbmJzZCA7OwotbTY4Ki0qLW5ldGJzZCopCQl0YXJnX2VtdWw9bTY4a25ic2QgOzsKLW02OCotKi1wc29zKikJCXRhcmdfZW11bD1tNjhrcHNvcyA7OwotbTY4Ki0qLXJ0ZW1zKikJCXRhcmdfZW11bD1tNjhrY29mZiA7OwotaHBwYSp3Ki0qKQkJdGFyZ19lbXVsPWVsZjY0aHBwYSA7OwotaHBwYSotKi0qZWxmKikJCXRhcmdfZW11bD1ocHBhZWxmIDs7Ci1ocHBhKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1ocHBhZWxmIDs7Ci1ocHBhKi0qLWxpdGVzKikJCXRhcmdfZW11bD1ocHBhZWxmIDs7Ci1ocHBhKi0qLXJ0ZW1zKikJCXRhcmdfZW11bD1ocHBhZWxmIDs7Ci12YXgtZGVjLXVsdHJpeCogfCB2YXgtZGVjLWJzZCopIHRhcmdfZW11bD12YXggOzsKLW1pcHMqLWRlYy11bHRyaXgqKQl0YXJnX2VtdWw9bWlwc2xpdCA7OwotbWlwcyotZGVjLW9zZiopCQl0YXJnX2VtdWw9bWlwc2xpdCA7OwotbWlwcyotc2dpLWlyaXg1KikJdGFyZ19lbXVsPWVsZjMyYnNtaXAgOzsKLW1pcHMqLXNnaS1pcml4NiopCXRhcmdfZW11bD1lbGYzMmJtaXBuMzIKLQkgICAgICAgICAgICAgICAgdGFyZ19leHRyYV9lbXVscz0iZWxmMzJic21pcCBlbGY2NGJtaXAiCi0JICAgICAgICAgICAgICAgIDs7Ci1taXBzKi1zZ2ktaXJpeCopCXRhcmdfZW11bD1taXBzYmlnIDs7Ci1taXBzKmVsLSotZWNvZmYqKQl0YXJnX2VtdWw9bWlwc2lkdGwgOzsKLW1pcHMqLSotZWNvZmYqKQkJdGFyZ19lbXVsPW1pcHNpZHQgOzsKLW1pcHMqLWRlYy1ic2QqKQkJdGFyZ19lbXVsPW1pcHNic2QgOzsKLW1pcHMqLWRlYy1uZXRic2QqKQl0YXJnX2VtdWw9ZWxmMzJsbWlwIDs7Ci1taXBzKi0qLWJzZCopCQl0YXJnX2VtdWw9bWlwc2JpZyA7OwotbWlwcyp2cjQzMDBlbC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmw0MzAwIDs7Ci1taXBzKnZyNDMwMC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmI0MzAwIDs7Ci1taXBzKnZyNDEwMGVsLSotZWxmKikJdGFyZ19lbXVsPWVsZjMybDQzMDAgOzsKLW1pcHMqdnI0MTAwLSotZWxmKikJdGFyZ19lbXVsPWVsZjMyYjQzMDAgOzsKLW1pcHMqdnI1MDAwZWwtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJsNDMwMCA7OwotbWlwcyp2cjUwMDAtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJiNDMwMCA7OwotbWlwcyplbC0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmMzJlbG1pcCA7OwotbWlwcyotKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjMyZWJtaXAgOzsKLW1pcHMqZWwtKi1ydGVtcyopCXRhcmdfZW11bD1lbGYzMmVsbWlwIDs7Ci1taXBzKi0qLXJ0ZW1zKikJCXRhcmdfZW11bD1lbGYzMmVibWlwIDs7Ci1taXBzKmVsLSotdnh3b3JrcyopCXRhcmdfZW11bD1lbGYzMmVsbWlwIDs7Ci1taXBzKi0qLXZ4d29ya3MqKQl0YXJnX2VtdWw9ZWxmMzJlYm1pcCA7OwotbWlwcyplbC0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmxzbWlwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmJzbWlwIG1pcHNsaXQgbWlwc2JpZyIKLQkJCTs7Ci1taXBzKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmJzbWlwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmxzbWlwIG1pcHNiaWcgbWlwc2xpdCIKLQkJCTs7Ci1taXBzKi0qLWxuZXdzKikJCXRhcmdfZW11bD1taXBzbG5ld3MgOzsKLW1uMTAyMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAyMDAgOzsKLW1uMTAzMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAzMDAgOzsKLWFscGhhKi0qLWxpbnV4ZWNvZmYqKQl0YXJnX2VtdWw9YWxwaGEgdGFyZ19leHRyYV9lbXVscz1lbGY2NGFscGhhCi0JCQl0ZGlyX2VsZjY0YWxwaGE9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9lY29mZi8vJ2AKLQkJCTs7Ci1hbHBoYSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSB0YXJnX2V4dHJhX2VtdWxzPWFscGhhCi0JCQl0ZGlyX2FscGhhPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvbGludXgvbGludXhlY29mZi8nYAotCQkJOzsKLWFscGhhKi0qLW9zZiopCQl0YXJnX2VtdWw9YWxwaGEgOzsKLWFscGhhKi0qLWdudSopCQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSA7OwotYWxwaGEqLSotbmV0d2FyZSopCXRhcmdfZW11bD1hbHBoYSA7OwotYWxwaGEqLSotbmV0YnNkKikJdGFyZ19lbXVsPWVsZjY0YWxwaGEgOzsKLXo4ay0qLWNvZmYpIAkJdGFyZ19lbXVsPXo4MDAyOyB0YXJnX2V4dHJhX2VtdWxzPXo4MDAxIDs7Ci1uczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikJdGFyZ19lbXVsPXBjNTMybWFjaGEgOzsKLW5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopIHRhcmdfZW11bD1uczMya25ic2QgOzsKLXBvd2VycGMtKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmMzJwcGNsaW51eDsgdGFyZ19leHRyYV9lbXVscz1lbGYzMnBwYzsKLQkJCXRhcmdfZXh0cmFfbGlicGF0aD1lbGYzMnBwYyA7OwotcGpsKi0qLSopCSAgICAgICAgdGFyZ19lbXVsPXBqbGVsZiA7IHRhcmdfZXh0cmFfZW11bHM9ImVsZl9pMzg2IiA7OwotcGoqLSotKikJICAgICAgICB0YXJnX2VtdWw9cGplbGYgOzsKLXBvd2VycGMtKi1lbGYqIHwgcG93ZXJwYy0qLWVhYmkqIHwgcG93ZXJwYy0qLXN5c3YqIFwKLSAgfCBwb3dlcnBjLSotbmV0YnNkKiB8IHBvd2VycGMtKi12eHdvcmtzKikKLQl0YXJnX2VtdWw9ZWxmMzJwcGMgOzsKLXBvd2VycGNsZS0qLWVsZiogfCBwb3dlcnBjbGUtKi1lYWJpKiB8IHBvd2VycGNsZS0qLXNvbGFyaXMqIFwKLSAgfCBwb3dlcnBjbGUtKi1zeXN2KiB8IHBvd2VycGNsZS0qLXZ4d29ya3MqKQotCXRhcmdfZW11bD1lbGYzMmxwcGMgOzsKLXBvd2VycGNsZS0qLXJ0ZW1zKikJdGFyZ19lbXVsPWVsZjMybGVwcGMgOzsKLXBvd2VycGMtKi1ydGVtcyopCXRhcmdfZW11bD1lbGYzMnBwYyA7OwotcG93ZXJwYy0qLW1hY29zKikJdGFyZ19lbXVsPXBwY21hY29zIDs7Ci1wb3dlcnBjLSotbmV0d2FyZSopCXRhcmdfZW11bD1wcGNudyA7OwotcG93ZXJwY2xlLSotcGUpICAgICAgICAgdGFyZ19lbXVsPXBwY3BlIDs7Ci1wb3dlcnBjbGUtKi13aW5udCopICAgICB0YXJnX2VtdWw9cHBjcGUgOzsKLXBvd2VycGNsZS0qLWN5Z3dpbiopICAgdGFyZ19lbXVsPXBwY3BlIDs7Ci1wb3dlcnBjLSotYWl4KikJCXRhcmdfZW11bD1haXhwcGMgOzsKLXBvd2VycGMtKi1iZW9zKikJdGFyZ19lbXVsPWFpeHBwYyA7OwotcnM2MDAwLSotYWl4KikJCXRhcmdfZW11bD1haXhyczYgOzsKLXRpYzMwLSotKmFvdXQqKQkJdGFyZ19lbXVsPXRpYzMwYW91dCA7OwotdGljMzAtKi0qY29mZiopCQl0YXJnX2VtdWw9dGljMzBjb2ZmIDs7Ci10aWM4MC0qLSopCQl0YXJnX2VtdWw9dGljODBjb2ZmIDs7Ci12ODUwLSotKikJCXRhcmdfZW11bD12ODUwIDs7Ci12ODUwZS0qLSopCQl0YXJnX2VtdWw9djg1MCA7Owotdjg1MGVhLSotKikJCXRhcmdfZW11bD12ODUwIDs7Ci13NjUtKi0qKQkJdGFyZ19lbXVsPXc2NSA7OwotZnIzMC0qLSopCQl0YXJnX2VtdWw9ZWxmMzJmcjMwIDs7Ci1tY29yZS0qLXBlKQkJdGFyZ19lbXVsPW1jb3JlcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1tY29yZS0qLWVsZikJCXRhcmdfZW11bD1lbGYzMm1jb3JlIDs7Ci0qLSotYW91dCkJCXRhcmdfZW11bD0ke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0gOzsKLSotKi1jb2ZmKQkJdGFyZ19lbXVsPSR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfSA7OwotKi0qLW5ldHdhcmUpCQl0YXJnX2VtdWw9JHt0YXJnZXRfY3B1fS1udyA7OwotKi0qLWllZWUqKQkJdGFyZ19lbXVsPXZhbmlsbGEgOzsKLQotKikKLSAgZWNobyAyPiYxICIqKiogbGQgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgJHt0YXJnfSIKLSAgZWNobyAyPiYxICIqKiogc2VlIGxkL2NvbmZpZ3VyZS50Z3QgZm9yIHN1cHBvcnRlZCB0YXJnZXRzIgotICBleGl0IDEKLQotZXNhYwpkaWZmIC0tZ2l0IGEvbGQvZGVmZmlsZS5oIGIvbGQvZGVmZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmM3MTBkLi4wMDAwMDAwCi0tLSBhL2xkL2RlZmZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBkZWZmaWxlLmggLSBoZWFkZXIgZm9yIC5ERUYgZmlsZSBwYXJzZXIKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgREogRGVsb3JpZSBkakBjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgREVGRklMRV9ICi0jZGVmaW5lIERFRkZJTEVfSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogREVGIHN0b3JhZ2UgZGVmaW5pdGlvbnMuICBOb3RlIHRoYXQgYW55IG9yZGluYWwgbWF5IGJlIHplcm8sIGFuZAotICAgYW55IHBvaW50ZXIgbWF5IGJlIE5VTEwsIGlmIG5vdCBkZWZpbmVkIGJ5IHRoZSBERUYgZmlsZS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfc2VjdGlvbgotICB7Ci0gICAgY2hhciAqbmFtZTsJCQkvKiBhbHdheXMgc2V0ICovCi0gICAgY2hhciAqY2xhc3M7CQkvKiBtYXkgYmUgTlVMTCAqLwotICAgIGNoYXIgZmxhZ19yZWFkLCBmbGFnX3dyaXRlLCBmbGFnX2V4ZWN1dGUsIGZsYWdfc2hhcmVkOwotICB9Ci1kZWZfZmlsZV9zZWN0aW9uOwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9leHBvcnQKLSAgewotICAgIGNoYXIgKm5hbWU7CQkJLyogYWx3YXlzIHNldCAqLwotICAgIGNoYXIgKmludGVybmFsX25hbWU7CS8qIGFsd2F5cyBzZXQsIG1heSA9PSBuYW1lICovCi0gICAgaW50IG9yZGluYWw7CQkvKiAtMSBpZiBub3Qgc3BlY2lmaWVkICovCi0gICAgaW50IGhpbnQ7Ci0gICAgY2hhciBmbGFnX3ByaXZhdGUsIGZsYWdfY29uc3RhbnQsIGZsYWdfbm9uYW1lLCBmbGFnX2RhdGE7Ci0gIH0KLWRlZl9maWxlX2V4cG9ydDsKLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfbW9kdWxlCi0gIHsKLSAgICBzdHJ1Y3QgZGVmX2ZpbGVfbW9kdWxlICpuZXh0OwotICAgIHZvaWQgKnVzZXJfZGF0YTsKLSAgICBjaGFyIG5hbWVbMV07IC8qIGV4dGVuZGVkIHZpYSBtYWxsb2MgKi8KLSAgfQotZGVmX2ZpbGVfbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9pbXBvcnQKLSAgewotICAgIGNoYXIgKmludGVybmFsX25hbWU7CS8qIGFsd2F5cyBzZXQgKi8KLSAgICBkZWZfZmlsZV9tb2R1bGUgKm1vZHVsZTsJLyogYWx3YXlzIHNldCAqLwotICAgIGNoYXIgKm5hbWU7CQkJLyogbWF5IGJlIE5VTEw7IGVpdGhlciB0aGlzIG9yIG9yZGluYWwgd2lsbCBiZSBzZXQgKi8KLSAgICBpbnQgb3JkaW5hbDsJCS8qIG1heSBiZSAtMSAqLwotICB9Ci1kZWZfZmlsZV9pbXBvcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlCi0gIHsKLQotICAgIC8qIGZyb20gdGhlIE5BTUUgb3IgTElCUkFSWSBjb21tYW5kICovCi0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgaXNfZGxsOwkJCS8qIC0xIGlmIE5BTUUvTElCUkFSWSBub3QgZ2l2ZW4gKi8KLSAgICBiZmRfdm1hIGJhc2VfYWRkcmVzczsJLyogKGJmZF92bWEpKC0xKSBpZiB1bnNwZWNpZmllZCAqLwotCi0gICAgLyogZnJvbSB0aGUgREVTQ1JJUFRJT04gY29tbWFuZCAqLwotICAgIGNoYXIgKmRlc2NyaXB0aW9uOwotCi0gICAgLyogZnJvbSB0aGUgU1RBQ0svSEVBUCBjb21tYW5kLCAtMSBpZiB1bnNwZWNpZmllZCAqLwotICAgIGludCBzdGFja19yZXNlcnZlLCBzdGFja19jb21taXQ7Ci0gICAgaW50IGhlYXBfcmVzZXJ2ZSwgaGVhcF9jb21taXQ7Ci0KLSAgICAvKiBmcm9tIHRoZSBTRUNUSU9OL1NFR01FTlQgY29tbWFuZHMgKi8KLSAgICBpbnQgbnVtX3NlY3Rpb25fZGVmczsKLSAgICBkZWZfZmlsZV9zZWN0aW9uICpzZWN0aW9uX2RlZnM7Ci0KLSAgICAvKiBmcm9tIHRoZSBFWFBPUlRTIGNvbW1hbmRzICovCi0gICAgaW50IG51bV9leHBvcnRzOwotICAgIGRlZl9maWxlX2V4cG9ydCAqZXhwb3J0czsKLQotICAgIC8qIHVzZWQgYnkgaW1wb3J0cyBmb3IgbW9kdWxlIG5hbWVzICovCi0gICAgZGVmX2ZpbGVfbW9kdWxlICptb2R1bGVzOwotCi0gICAgLyogZnJvbSB0aGUgSU1QT1JUUyBjb21tYW5kcyAqLwotICAgIGludCBudW1faW1wb3J0czsKLSAgICBkZWZfZmlsZV9pbXBvcnQgKmltcG9ydHM7Ci0KLSAgICAvKiBmcm9tIHRoZSBWRVJTSU9OIGNvbW1hbmQsIC0xIGlmIG5vdCBzcGVjaWZpZWQgKi8KLSAgICBpbnQgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcjsKLSAgfQotZGVmX2ZpbGU7Ci0KLWV4dGVybiBkZWZfZmlsZSAqZGVmX2ZpbGVfZW1wdHkgUEFSQU1TICgodm9pZCkpOwotCi0vKiBhZGRfdG8gbWF5IGJlIE5VTEwuICBJZiBub3QsIHRoaXMgLmRlZiBpcyBhcHBlbmRlZCB0byBpdCAqLwotZXh0ZXJuIGRlZl9maWxlICpkZWZfZmlsZV9wYXJzZSBQQVJBTVMgKChjb25zdCBjaGFyICpfZmlsZW5hbWUsCi0JCQkJCSBkZWZfZmlsZSAqIF9hZGRfdG8pKTsKLQotZXh0ZXJuIHZvaWQgZGVmX2ZpbGVfZnJlZSBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYpKTsKLQotZXh0ZXJuIGRlZl9maWxlX2V4cG9ydCAqZGVmX2ZpbGVfYWRkX2V4cG9ydCBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9uYW1lLAotCQkJCQkJIGNvbnN0IGNoYXIgKl9pbnRlcm5hbF9uYW1lLAotCQkJCQkJICAgICBpbnQgX29yZGluYWwpKTsKLQotZXh0ZXJuIGRlZl9maWxlX2ltcG9ydCAqZGVmX2ZpbGVfYWRkX2ltcG9ydCBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9uYW1lLAotCQkJCQkJICAgICBjb25zdCBjaGFyICpfZnJvbSwKLQkJCQkJCSAgICAgaW50IF9vcmRpbmFsLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqX2ltcG9ydGVkX25hbWUpKTsKLQotZXh0ZXJuIHZvaWQgZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCi0JCQkJCSAgICBjb25zdCBjaGFyICpwYXJhbSwKLQkJCQkJICAgIGludCBsZW4pKTsKLQotI2lmZGVmIERFRl9GSUxFX1BSSU5UCi1leHRlcm4gdm9pZCBkZWZfZmlsZV9wcmludCBQQVJBTVMgKChGSUxFICogX2ZpbGUsCi0JCQkJICAgIGRlZl9maWxlICogX2RlZikpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBERUZGSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2xkL2RlZmZpbGVwLnkgYi9sZC9kZWZmaWxlcC55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWFhNzAzLi4wMDAwMDAwCi0tLSBhL2xkL2RlZmZpbGVwLnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE4ICswLDAgQEAKLSV7IC8qIGRlZmZpbGVwLnkgLSBwYXJzZXIgZm9yIC5kZWYgZmlsZXMgKi8KLQotLyogICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImRlZmZpbGUuaCIKLQotI2RlZmluZSBUUkFDRSAwCi0KLSNkZWZpbmUgUk9VTkRfVVAoYSwgYikgKCgoYSkrKChiKS0xKSkmfigoYiktMSkpCi0KLS8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLCBldGMpLAotICAgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMsIHNvIHdlIGNhbiBoYXZlIG11bHRpcGxlCi0gICB5YWNjIGdlbmVyYXRlZCBwYXJzZXJzIGluIGxkLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBvbmx5IHRoZSB2YXJpYWJsZXMKLSAgIHByb2R1Y2VkIGJ5IHlhY2MuICBJZiBvdGhlciBwYXJzZXIgZ2VuZXJhdG9ycyAoYmlzb24sIGJ5YWNjLCBldGMpIHByb2R1Y2UKLSAgIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQgY29uZmxpY3QgYXQgbGluayB0aW1lLCB0aGVuIHRob3NlIHBhcnNlcgotICAgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlIGZpeGVkIGluc3RlYWQgb2YgYWRkaW5nIHRob3NlIG5hbWVzIHRvIHRoaXMgbGlzdC4gKi8KLQotI2RlZmluZQl5eW1heGRlcHRoIGRlZl9tYXhkZXB0aAotI2RlZmluZQl5eXBhcnNlCWRlZl9wYXJzZQotI2RlZmluZQl5eWxleAlkZWZfbGV4Ci0jZGVmaW5lCXl5ZXJyb3IJZGVmX2Vycm9yCi0jZGVmaW5lCXl5bHZhbAlkZWZfbHZhbAotI2RlZmluZQl5eWNoYXIJZGVmX2NoYXIKLSNkZWZpbmUJeXlkZWJ1ZwlkZWZfZGVidWcKLSNkZWZpbmUJeXlwYWN0CWRlZl9wYWN0CQotI2RlZmluZQl5eXIxCWRlZl9yMQkJCQotI2RlZmluZQl5eXIyCWRlZl9yMgkJCQotI2RlZmluZQl5eWRlZglkZWZfZGVmCQkKLSNkZWZpbmUJeXljaGsJZGVmX2NoawkJCi0jZGVmaW5lCXl5cGdvCWRlZl9wZ28JCQotI2RlZmluZQl5eWFjdAlkZWZfYWN0CQkKLSNkZWZpbmUJeXlleGNhCWRlZl9leGNhCi0jZGVmaW5lIHl5ZXJyZmxhZyBkZWZfZXJyZmxhZwotI2RlZmluZSB5eW5lcnJzCWRlZl9uZXJycwotI2RlZmluZQl5eXBzCWRlZl9wcwotI2RlZmluZQl5eXB2CWRlZl9wdgotI2RlZmluZQl5eXMJZGVmX3MKLSNkZWZpbmUJeXlfeXlzCWRlZl95eXMKLSNkZWZpbmUJeXlzdGF0ZQlkZWZfc3RhdGUKLSNkZWZpbmUJeXl0bXAJZGVmX3RtcAotI2RlZmluZQl5eXYJZGVmX3YKLSNkZWZpbmUJeXlfeXl2CWRlZl95eXYKLSNkZWZpbmUJeXl2YWwJZGVmX3ZhbAotI2RlZmluZQl5eWxsb2MJZGVmX2xsb2MKLSNkZWZpbmUgeXlyZWRzCWRlZl9yZWRzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eXRva3MJZGVmX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5bGhzCWRlZl95eWxocwotI2RlZmluZSB5eWxlbglkZWZfeXlsZW4KLSNkZWZpbmUgeXlkZWZyZWQgZGVmX3l5ZGVmcmVkCi0jZGVmaW5lIHl5ZGdvdG8JZGVmX3l5ZGdvdG8KLSNkZWZpbmUgeXlzaW5kZXggZGVmX3l5c2luZGV4Ci0jZGVmaW5lIHl5cmluZGV4IGRlZl95eXJpbmRleAotI2RlZmluZSB5eWdpbmRleCBkZWZfeXlnaW5kZXgKLSNkZWZpbmUgeXl0YWJsZQkgZGVmX3l5dGFibGUKLSNkZWZpbmUgeXljaGVjawkgZGVmX3l5Y2hlY2sKLQotc3RhdGljIGludCBkZWZfbGV4ICgpOwotCi1zdGF0aWMgdm9pZCBkZWZfZGVzY3JpcHRpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkZWZfZXhwb3J0cyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9oZWFwc2l6ZSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZGVmX2ltcG9ydAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZGVmX2xpYnJhcnkgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfc2VjdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZGVmX3NlY3Rpb25fYWx0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkZWZfc3RhY2tzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfdmVyc2lvbiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZGVmX2RpcmVjdGl2ZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgZGVmX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZGVmX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBkZWZfbGV4IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGludCBsZXhfZm9yY2VkX3Rva2VuID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpsZXhfcGFyc2Vfc3RyaW5nID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpsZXhfcGFyc2Vfc3RyaW5nX2VuZCA9IDA7Ci0KLSV9Ci0KLSV1bmlvbiB7Ci0gIGNoYXIgKmlkOwotICBpbnQgbnVtYmVyOwotfTsKLQotJXRva2VuIE5BTUUsIExJQlJBUlksIERFU0NSSVBUSU9OLCBTVEFDS1NJWkUsIEhFQVBTSVpFLCBDT0RFLCBEQVRBVSwgREFUQUwKLSV0b2tlbiBTRUNUSU9OUywgRVhQT1JUUywgSU1QT1JUUywgVkVSU0lPTkssIEJBU0UsIENPTlNUQU5UVSwgQ09OU1RBTlRMCi0ldG9rZW4gUFJJVkFURVUsIFBSSVZBVEVMCi0ldG9rZW4gUkVBRCBXUklURSBFWEVDVVRFIFNIQVJFRCBOT05BTUVVIE5PTkFNRUwgRElSRUNUSVZFCi0ldG9rZW4gPGlkPiBJRAotJXRva2VuIDxudW1iZXI+IE5VTUJFUgotJXR5cGUgIDxudW1iZXI+IG9wdF9iYXNlIG9wdF9vcmRpbmFsCi0ldHlwZSAgPG51bWJlcj4gYXR0ciBhdHRyX2xpc3Qgb3B0X251bWJlciBleHBfb3B0X2xpc3QgZXhwX29wdAotJXR5cGUgIDxpZD4gb3B0X25hbWUgb3B0X2VxdWFsX25hbWUgCi0KLSUlCi0KLXN0YXJ0OiBzdGFydCBjb21tYW5kCi0JfCBjb21tYW5kCi0JOwotCi1jb21tYW5kOiAKLQkJTkFNRSBvcHRfbmFtZSBvcHRfYmFzZSB7IGRlZl9uYW1lICgkMiwgJDMpOyB9Ci0JfAlMSUJSQVJZIG9wdF9uYW1lIG9wdF9iYXNlIHsgZGVmX2xpYnJhcnkgKCQyLCAkMyk7IH0KLQl8CURFU0NSSVBUSU9OIElEIHsgZGVmX2Rlc2NyaXB0aW9uICgkMik7fQotCXwJU1RBQ0tTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX3N0YWNrc2l6ZSAoJDIsICQzKTt9Ci0JfAlIRUFQU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9oZWFwc2l6ZSAoJDIsICQzKTt9Ci0JfAlDT0RFIGF0dHJfbGlzdCB7IGRlZl9zZWN0aW9uICgiQ09ERSIsICQyKTt9Ci0JfAlEQVRBVSBhdHRyX2xpc3QgIHsgZGVmX3NlY3Rpb24gKCJEQVRBIiwgJDIpO30KLQl8CVNFQ1RJT05TIHNlY2xpc3QKLQl8CUVYUE9SVFMgZXhwbGlzdCAKLQl8CUlNUE9SVFMgaW1wbGlzdAotCXwJVkVSU0lPTksgTlVNQkVSIHsgZGVmX3ZlcnNpb24gKCQyLCAwKTt9Ci0JfAlWRVJTSU9OSyBOVU1CRVIgJy4nIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwgJDQpO30KLQl8CURJUkVDVElWRSBJRCB7IGRlZl9kaXJlY3RpdmUgKCQyKTt9Ci0JOwotCi0KLWV4cGxpc3Q6Ci0JCS8qIEVNUFRZICovCi0JfAlleHBsaW5lCi0JfAlleHBsaXN0IGV4cGxpbmUKLQk7Ci0KLWV4cGxpbmU6Ci0JCS8qIFRoZSBvcHRfY29tbWEgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgYm90aCB0aGUgdXN1YWwKLQkJICBERUYgZmlsZSBzeW50YXggYXMgd2VsbCBhcyAuZHJlY3R2ZSBzeW50YXggd2hpY2gKLQkJICBtYW5kYXRlcyA8ZXhwc3ltPiw8ZXhwb3B0bGlzdD4uICAqLwotCQlJRCBvcHRfZXF1YWxfbmFtZSBvcHRfb3JkaW5hbCBvcHRfY29tbWEgZXhwX29wdF9saXN0Ci0JCQl7IGRlZl9leHBvcnRzICgkMSwgJDIsICQzLCAkNSk7IH0KLQk7Ci1leHBfb3B0X2xpc3Q6Ci0JCS8qIFRoZSBvcHRfY29tbWEgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgYm90aCB0aGUgdXN1YWwKLQkJICAgREVGIGZpbGUgc3ludGF4IGFzIHdlbGwgYXMgLmRyZWN0dmUgc3ludGF4IHdoaWNoCi0JCSAgIGFsbG93cyBmb3IgY29tbWEgc2VwYXJhdGVkIG9wdCBsaXN0LiAgKi8KLQkJZXhwX29wdCBvcHRfY29tbWEgZXhwX29wdF9saXN0IHsgJCQgPSAkMSB8ICQzOyB9Ci0JfAl7ICQkID0gMDsgfQotCTsKLWV4cF9vcHQ6Ci0JCU5PTkFNRVUJCXsgJCQgPSAxOyB9Ci0JfAlOT05BTUVMCQl7ICQkID0gMTsgfQotCXwJQ09OU1RBTlRVCXsgJCQgPSAyOyB9Ci0JfAlDT05TVEFOVEwJeyAkJCA9IDI7IH0KLQl8CURBVEFVCQl7ICQkID0gNDsgfQotCXwJREFUQUwJCXsgJCQgPSA0OyB9Ci0JfAlQUklWQVRFVQl7ICQkID0gODsgfQotCXwJUFJJVkFURUwJeyAkJCA9IDg7IH0KLQk7Ci1pbXBsaXN0OgkKLQkJaW1wbGlzdCBpbXBsaW5lCi0JfAlpbXBsaW5lCi0JOwotCi1pbXBsaW5lOgotICAgICAgICAgICAgICAgSUQgJz0nIElEICcuJyBJRCAnLicgSUQgICAgIHsgZGVmX2ltcG9ydCAoJDEsICQzLCAkNSwgJDcsIC0xKTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAnLicgTlVNQkVSIHsgZGVmX2ltcG9ydCAoJDEsICQzLCAkNSwgIDAsICQ3KTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsICQzLCAgMCwgJDUsIC0xKTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBOVU1CRVIgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsICQzLCAgMCwgIDAsICQ1KTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsICQxLCAkMywgJDUsIC0xKTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIElEICAgICAgICAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsICQxLCAgMCwgJDMsIC0xKTsgfQotOwotCi1zZWNsaXN0OgotCQlzZWNsaXN0IHNlY2xpbmUKLQl8CXNlY2xpbmUKLQk7Ci0KLXNlY2xpbmU6Ci0JSUQgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCQxLCAkMik7fQotCXwgSUQgSUQgeyBkZWZfc2VjdGlvbl9hbHQgKCQxLCAkMik7fQotCTsKLQotYXR0cl9saXN0OgotCWF0dHJfbGlzdCBvcHRfY29tbWEgYXR0ciB7ICQkID0gJDEgfCAkMzsgfQotCXwgYXR0ciB7ICQkID0gJDE7IH0KLQk7Ci0KLW9wdF9jb21tYToKLQknLCcKLQl8IAotCTsKLW9wdF9udW1iZXI6ICcsJyBOVU1CRVIgeyAkJD0kMjt9Ci0JfAkgICB7ICQkPS0xO30KLQk7Ci0JCi1hdHRyOgotCQlSRUFECXsgJCQgPSAxO30KLQl8CVdSSVRFCXsgJCQgPSAyO30JCi0JfAlFWEVDVVRFCXsgJCQ9NDt9Ci0JfAlTSEFSRUQJeyAkJD04O30KLQk7Ci0KLW9wdF9uYW1lOiBJRAkJeyAkJCA9ICQxOyB9Ci0JfAkJeyAkJCA9IDA7IH0KLQk7Ci0KLW9wdF9vcmRpbmFsOiAKLQkgICdAJyBOVU1CRVIgICAgIHsgJCQgPSAkMjt9Ci0JfCAgICAgICAgICAgICAgICB7ICQkID0gLTE7fQotCTsKLQotb3B0X2VxdWFsX25hbWU6Ci0gICAgICAgICAgJz0nIElECXsgJCQgPSAkMjsgfQotICAgICAgICB8IAkJeyAkJCA9ICAwOyB9CQkJIAotCTsKLQotb3B0X2Jhc2U6IEJBU0UJJz0nIE5VTUJFUgl7ICQkID0gJDM7fQotCXwJeyAkJCA9IDA7fQotCTsKLQotCQotCi0lJQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIEZJTEUgKnRoZV9maWxlOwotc3RhdGljIGNvbnN0IGNoYXIgKmRlZl9maWxlbmFtZTsKLXN0YXRpYyBpbnQgbGluZW51bWJlcjsKLXN0YXRpYyBkZWZfZmlsZSAqZGVmOwotc3RhdGljIGludCBzYXdfbmV3bGluZTsKLQotc3RydWN0IGRpcmVjdGl2ZQotICB7Ci0gICAgc3RydWN0IGRpcmVjdGl2ZSAqbmV4dDsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCBsZW47Ci0gIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGlyZWN0aXZlICpkaXJlY3RpdmVzID0gMDsKLQotZGVmX2ZpbGUgKgotZGVmX2ZpbGVfZW1wdHkgKCkKLXsKLSAgZGVmX2ZpbGUgKnJ2ID0gKGRlZl9maWxlICopIHhtYWxsb2MgKHNpemVvZiAoZGVmX2ZpbGUpKTsKLSAgbWVtc2V0IChydiwgMCwgc2l6ZW9mIChkZWZfZmlsZSkpOwotICBydi0+aXNfZGxsID0gLTE7Ci0gIHJ2LT5iYXNlX2FkZHJlc3MgPSAoYmZkX3ZtYSkgKC0xKTsKLSAgcnYtPnN0YWNrX3Jlc2VydmUgPSBydi0+c3RhY2tfY29tbWl0ID0gLTE7Ci0gIHJ2LT5oZWFwX3Jlc2VydmUgPSBydi0+aGVhcF9jb21taXQgPSAtMTsKLSAgcnYtPnZlcnNpb25fbWFqb3IgPSBydi0+dmVyc2lvbl9taW5vciA9IC0xOwotICByZXR1cm4gcnY7Ci19Ci0KLWRlZl9maWxlICoKLWRlZl9maWxlX3BhcnNlIChmaWxlbmFtZSwgYWRkX3RvKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgZGVmX2ZpbGUgKmFkZF90bzsKLXsKLSAgc3RydWN0IGRpcmVjdGl2ZSAqZDsKLQotICB0aGVfZmlsZSA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLSAgZGVmX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIGxpbmVudW1iZXIgPSAxOwotICBpZiAoIXRoZV9maWxlKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoYWRkX3RvKQotICAgIHsKLSAgICAgIGRlZiA9IGFkZF90bzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkZWYgPSBkZWZfZmlsZV9lbXB0eSAoKTsKLSAgICB9Ci0KLSAgc2F3X25ld2xpbmUgPSAxOwotICBpZiAoZGVmX3BhcnNlICgpKQotICAgIHsKLSAgICAgIGRlZl9maWxlX2ZyZWUgKGRlZik7Ci0gICAgICBmY2xvc2UgKHRoZV9maWxlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmY2xvc2UgKHRoZV9maWxlKTsKLQotICBmb3IgKGQgPSBkaXJlY3RpdmVzOyBkOyBkID0gZC0+bmV4dCkKLSAgICB7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoIkFkZGluZyBkaXJlY3RpdmUgJTA4eCBgJXMnXG4iLCBkLT5uYW1lLCBkLT5uYW1lKTsKLSNlbmRpZgotICAgICAgZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSAoZGVmLCBkLT5uYW1lLCBkLT5sZW4pOwotICAgIH0KLQotICByZXR1cm4gZGVmOwotfQotCi12b2lkCi1kZWZfZmlsZV9mcmVlIChkZWYpCi0gICAgIGRlZl9maWxlICpkZWY7Ci17Ci0gIGludCBpOwotICBpZiAoIWRlZikKLSAgICByZXR1cm47Ci0gIGlmIChkZWYtPm5hbWUpCi0gICAgZnJlZSAoZGVmLT5uYW1lKTsKLSAgaWYgKGRlZi0+ZGVzY3JpcHRpb24pCi0gICAgZnJlZSAoZGVmLT5kZXNjcmlwdGlvbik7Ci0KLSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9zZWN0aW9uX2RlZnM7IGkrKykKLQl7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSkKLQkgICAgZnJlZSAoZGVmLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSk7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpCi0JICAgIGZyZWUgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzKTsKLQl9Ci0gICAgICBmcmVlIChkZWYtPnNlY3Rpb25fZGVmcyk7Ci0gICAgfQotCi0gIGlmIChkZWYtPmV4cG9ydHMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX2V4cG9ydHM7IGkrKykKLQl7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUKLQkgICAgICAmJiBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSAhPSBkZWYtPmV4cG9ydHNbaV0ubmFtZSkKLQkgICAgZnJlZSAoZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPmV4cG9ydHNbaV0ubmFtZSk7Ci0JfQotICAgICAgZnJlZSAoZGVmLT5leHBvcnRzKTsKLSAgICB9Ci0KLSAgaWYgKGRlZi0+aW1wb3J0cykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1faW1wb3J0czsgaSsrKQotCXsKLQkgIGlmIChkZWYtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZQotCSAgICAgICYmIGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lICE9IGRlZi0+aW1wb3J0c1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JICBpZiAoZGVmLT5pbXBvcnRzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+aW1wb3J0c1tpXS5uYW1lKTsKLQl9Ci0gICAgICBmcmVlIChkZWYtPmltcG9ydHMpOwotICAgIH0KLQotICB3aGlsZSAoZGVmLT5tb2R1bGVzKQotICAgIHsKLSAgICAgIGRlZl9maWxlX21vZHVsZSAqbSA9IGRlZi0+bW9kdWxlczsKLSAgICAgIGRlZi0+bW9kdWxlcyA9IGRlZi0+bW9kdWxlcy0+bmV4dDsKLSAgICAgIGZyZWUgKG0pOwotICAgIH0KLQotICBmcmVlIChkZWYpOwotfQotCi0jaWZkZWYgREVGX0ZJTEVfUFJJTlQKLXZvaWQKLWRlZl9maWxlX3ByaW50IChmaWxlLCBkZWYpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGRlZl9maWxlICpkZWY7Ci17Ci0gIGludCBpOwotICBmcHJpbnRmIChmaWxlLCAiPj4+PiBkZWZfZmlsZSBhdCAweCUwOHhcbiIsIGRlZik7Ci0gIGlmIChkZWYtPm5hbWUpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgbmFtZTogJXNcbiIsIGRlZi0+bmFtZSA/IGRlZi0+bmFtZSA6ICIodW5zcGVjaWZpZWQpIik7Ci0gIGlmIChkZWYtPmlzX2RsbCAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBpcyBkbGw6ICVzXG4iLCBkZWYtPmlzX2RsbCA/ICJ5ZXMiIDogIm5vIik7Ci0gIGlmIChkZWYtPmJhc2VfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgKC0xKSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBiYXNlIGFkZHJlc3M6IDB4JTA4eFxuIiwgZGVmLT5iYXNlX2FkZHJlc3MpOwotICBpZiAoZGVmLT5kZXNjcmlwdGlvbikKLSAgICBmcHJpbnRmIChmaWxlLCAiICBkZXNjcmlwdGlvbjogYCVzJ1xuIiwgZGVmLT5kZXNjcmlwdGlvbik7Ci0gIGlmIChkZWYtPnN0YWNrX3Jlc2VydmUgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgc3RhY2sgcmVzZXJ2ZTogMHglMDh4XG4iLCBkZWYtPnN0YWNrX3Jlc2VydmUpOwotICBpZiAoZGVmLT5zdGFja19jb21taXQgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgc3RhY2sgY29tbWl0OiAweCUwOHhcbiIsIGRlZi0+c3RhY2tfY29tbWl0KTsKLSAgaWYgKGRlZi0+aGVhcF9yZXNlcnZlICE9IC0xKQotICAgIGZwcmludGYgKGZpbGUsICIgIGhlYXAgcmVzZXJ2ZTogMHglMDh4XG4iLCBkZWYtPmhlYXBfcmVzZXJ2ZSk7Ci0gIGlmIChkZWYtPmhlYXBfY29tbWl0ICE9IC0xKQotICAgIGZwcmludGYgKGZpbGUsICIgIGhlYXAgY29tbWl0OiAweCUwOHhcbiIsIGRlZi0+aGVhcF9jb21taXQpOwotCi0gIGlmIChkZWYtPm51bV9zZWN0aW9uX2RlZnMgPiAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgIHNlY3Rpb24gZGVmczpcbiIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX3NlY3Rpb25fZGVmczsgaSsrKQotCXsKLQkgIGZwcmludGYgKGZpbGUsICIgICAgbmFtZTogYCVzJywgY2xhc3M6IGAlcycsIGZsYWdzOiIsCi0JCSAgIGRlZi0+c2VjdGlvbl9kZWZzW2ldLm5hbWUsIGRlZi0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3JlYWQpCi0JICAgIGZwcmludGYgKGZpbGUsICIgUiIpOwotCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfd3JpdGUpCi0JICAgIGZwcmludGYgKGZpbGUsICIgVyIpOwotCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfZXhlY3V0ZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBYIik7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19zaGFyZWQpCi0JICAgIGZwcmludGYgKGZpbGUsICIgUyIpOwotCSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0JfQotICAgIH0KLQotICBpZiAoZGVmLT5udW1fZXhwb3J0cyA+IDApCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiAgZXhwb3J0czpcbiIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX2V4cG9ydHM7IGkrKykKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCAiICAgIG5hbWU6IGAlcycsIGludDogYCVzJywgb3JkaW5hbDogJWQsIGZsYWdzOiIsCi0JCSAgIGRlZi0+ZXhwb3J0c1tpXS5uYW1lLCBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSwKLQkJICAgZGVmLT5leHBvcnRzW2ldLm9yZGluYWwpOwotCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX3ByaXZhdGUpCi0JICAgIGZwcmludGYgKGZpbGUsICIgUCIpOwotCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX2NvbnN0YW50KQotCSAgICBmcHJpbnRmIChmaWxlLCAiIEMiKTsKLQkgIGlmIChkZWYtPmV4cG9ydHNbaV0uZmxhZ19ub25hbWUpCi0JICAgIGZwcmludGYgKGZpbGUsICIgTiIpOwotCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX2RhdGEpCi0JICAgIGZwcmludGYgKGZpbGUsICIgRCIpOwotCSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0JfQotICAgIH0KLQotICBpZiAoZGVmLT5udW1faW1wb3J0cyA+IDApCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiAgaW1wb3J0czpcbiIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX2ltcG9ydHM7IGkrKykKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCAiICAgIGludDogJXMsIGZyb206IGAlcycsIG5hbWU6IGAlcycsIG9yZGluYWw6ICVkXG4iLAotCQkgICBkZWYtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSwKLQkJICAgZGVmLT5pbXBvcnRzW2ldLm1vZHVsZSwKLQkJICAgZGVmLT5pbXBvcnRzW2ldLm5hbWUsCi0JCSAgIGRlZi0+aW1wb3J0c1tpXS5vcmRpbmFsKTsKLQl9Ci0gICAgfQotICBpZiAoZGVmLT52ZXJzaW9uX21ham9yICE9IC0xKQotICAgIGZwcmludGYgKGZpbGUsICIgIHZlcnNpb246ICVkLiVkXG4iLCBkZWYtPnZlcnNpb25fbWFqb3IsIGRlZi0+dmVyc2lvbl9taW5vcik7Ci0gIGZwcmludGYgKGZpbGUsICI8PDw8IGRlZl9maWxlIGF0IDB4JTA4eFxuIiwgZGVmKTsKLX0KLSNlbmRpZgotCi1kZWZfZmlsZV9leHBvcnQgKgotZGVmX2ZpbGVfYWRkX2V4cG9ydCAoZGVmLCBleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsKQotICAgICBkZWZfZmlsZSAqZGVmOwotICAgICBjb25zdCBjaGFyICpleHRlcm5hbF9uYW1lOwotICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotICAgICBpbnQgb3JkaW5hbDsKLXsKLSAgZGVmX2ZpbGVfZXhwb3J0ICplOwotICBpbnQgbWF4X2V4cG9ydHMgPSBST1VORF9VUChkZWYtPm51bV9leHBvcnRzLCAzMik7Ci0gIGlmIChkZWYtPm51bV9leHBvcnRzID49IG1heF9leHBvcnRzKQotICAgIHsKLSAgICAgIG1heF9leHBvcnRzID0gUk9VTkRfVVAoZGVmLT5udW1fZXhwb3J0cysxLCAzMik7Ci0gICAgICBpZiAoZGVmLT5leHBvcnRzKQotCWRlZi0+ZXhwb3J0cyA9IChkZWZfZmlsZV9leHBvcnQgKikgeHJlYWxsb2MgKGRlZi0+ZXhwb3J0cywgbWF4X2V4cG9ydHMgKiBzaXplb2YgKGRlZl9maWxlX2V4cG9ydCkpOwotICAgICAgZWxzZQotCWRlZi0+ZXhwb3J0cyA9IChkZWZfZmlsZV9leHBvcnQgKikgeG1hbGxvYyAobWF4X2V4cG9ydHMgKiBzaXplb2YgKGRlZl9maWxlX2V4cG9ydCkpOwotICAgIH0KLSAgZSA9IGRlZi0+ZXhwb3J0cyArIGRlZi0+bnVtX2V4cG9ydHM7Ci0gIG1lbXNldCAoZSwgMCwgc2l6ZW9mIChkZWZfZmlsZV9leHBvcnQpKTsKLSAgaWYgKGludGVybmFsX25hbWUgJiYgIWV4dGVybmFsX25hbWUpCi0gICAgZXh0ZXJuYWxfbmFtZSA9IGludGVybmFsX25hbWU7Ci0gIGlmIChleHRlcm5hbF9uYW1lICYmICFpbnRlcm5hbF9uYW1lKQotICAgIGludGVybmFsX25hbWUgPSBleHRlcm5hbF9uYW1lOwotICBlLT5uYW1lID0geHN0cmR1cCAoZXh0ZXJuYWxfbmFtZSk7Ci0gIGUtPmludGVybmFsX25hbWUgPSB4c3RyZHVwIChpbnRlcm5hbF9uYW1lKTsKLSAgZS0+b3JkaW5hbCA9IG9yZGluYWw7Ci0gIGRlZi0+bnVtX2V4cG9ydHMrKzsKLSAgcmV0dXJuIGU7Ci19Ci0KLXN0YXRpYyBkZWZfZmlsZV9tb2R1bGUgKgotZGVmX3N0YXNoX21vZHVsZSAoZGVmLCBuYW1lKQotICAgICBkZWZfZmlsZSAqZGVmOwotICAgICBjaGFyICpuYW1lOwotewotICBkZWZfZmlsZV9tb2R1bGUgKnM7Ci0gIGZvciAocz1kZWYtPm1vZHVsZXM7IHM7IHM9cy0+bmV4dCkKLSAgICBpZiAoc3RyY21wIChzLT5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIHM7Ci0gIHMgPSAoZGVmX2ZpbGVfbW9kdWxlICopIHhtYWxsb2MgKHNpemVvZiAoZGVmX2ZpbGVfbW9kdWxlKSArIHN0cmxlbiAobmFtZSkpOwotICBzLT5uZXh0ID0gZGVmLT5tb2R1bGVzOwotICBkZWYtPm1vZHVsZXMgPSBzOwotICBzLT51c2VyX2RhdGEgPSAwOwotICBzdHJjcHkgKHMtPm5hbWUsIG5hbWUpOwotICByZXR1cm4gczsKLX0KLQotZGVmX2ZpbGVfaW1wb3J0ICoKLWRlZl9maWxlX2FkZF9pbXBvcnQgKGRlZiwgbmFtZSwgbW9kdWxlLCBvcmRpbmFsLCBpbnRlcm5hbF9uYW1lKQotICAgICBkZWZfZmlsZSAqZGVmOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICptb2R1bGU7Ci0gICAgIGludCBvcmRpbmFsOwotICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotewotICBkZWZfZmlsZV9pbXBvcnQgKmk7Ci0gIGludCBtYXhfaW1wb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2ltcG9ydHMsIDE2KTsKLSAgaWYgKGRlZi0+bnVtX2ltcG9ydHMgPj0gbWF4X2ltcG9ydHMpCi0gICAgewotICAgICAgbWF4X2ltcG9ydHMgPSBST1VORF9VUChkZWYtPm51bV9pbXBvcnRzKzEsIDE2KTsKLSAgICAgIGlmIChkZWYtPmltcG9ydHMpCi0JZGVmLT5pbXBvcnRzID0gKGRlZl9maWxlX2ltcG9ydCAqKSB4cmVhbGxvYyAoZGVmLT5pbXBvcnRzLCBtYXhfaW1wb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7Ci0gICAgICBlbHNlCi0JZGVmLT5pbXBvcnRzID0gKGRlZl9maWxlX2ltcG9ydCAqKSB4bWFsbG9jIChtYXhfaW1wb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7Ci0gICAgfQotICBpID0gZGVmLT5pbXBvcnRzICsgZGVmLT5udW1faW1wb3J0czsKLSAgbWVtc2V0IChpLCAwLCBzaXplb2YgKGRlZl9maWxlX2ltcG9ydCkpOwotICBpZiAobmFtZSkKLSAgICBpLT5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGlmIChtb2R1bGUpCi0gICAgaS0+bW9kdWxlID0gZGVmX3N0YXNoX21vZHVsZShkZWYsIG1vZHVsZSk7Ci0gIGktPm9yZGluYWwgPSBvcmRpbmFsOwotICBpZiAoaW50ZXJuYWxfbmFtZSkKLSAgICBpLT5pbnRlcm5hbF9uYW1lID0geHN0cmR1cCAoaW50ZXJuYWxfbmFtZSk7Ci0gIGVsc2UKLSAgICBpLT5pbnRlcm5hbF9uYW1lID0gaS0+bmFtZTsKLSAgZGVmLT5udW1faW1wb3J0cysrOwotICByZXR1cm4gaTsKLX0KLQotc3RydWN0Ci17Ci0gIGNoYXIgKnBhcmFtOwotICBpbnQgdG9rZW47Ci19Ci1kaXJvcHRzW10gPQotewotICB7ICItaGVhcCIsIEhFQVBTSVpFIH0sCi0gIHsgIi1zdGFjayIsIFNUQUNLU0laRSB9LAotICB7ICItYXR0ciIsIFNFQ1RJT05TIH0sCi0gIHsgIi1leHBvcnQiLCBFWFBPUlRTIH0sCi0gIHsgMCwgMCB9Ci19OwotCi12b2lkCi1kZWZfZmlsZV9hZGRfZGlyZWN0aXZlIChteV9kZWYsIHBhcmFtLCBsZW4pCi0gICAgIGRlZl9maWxlICpteV9kZWY7Ci0gICAgIGNvbnN0IGNoYXIgKnBhcmFtOwotICAgICBpbnQgbGVuOwotewotICBkZWZfZmlsZSAqc2F2ZV9kZWYgPSBkZWY7Ci0gIGNvbnN0IGNoYXIgKnBlbmQgPSBwYXJhbSArIGxlbjsKLSAgY29uc3QgY2hhciAqdGVuZCA9IHBhcmFtOwotICBpbnQgaTsKLQotICBkZWYgPSBteV9kZWY7Ci0KLSAgd2hpbGUgKHBhcmFtIDwgcGVuZCkKLSAgICB7Ci0gICAgICB3aGlsZSAocGFyYW0gPCBwZW5kICYmIGlzc3BhY2UgKCpwYXJhbSkpCi0JcGFyYW0rKzsKLSAgICAgIGZvciAodGVuZCA9IHBhcmFtICsgMTsKLQkgICB0ZW5kIDwgcGVuZCAmJiAhKGlzc3BhY2UgKHRlbmRbLTFdKSAmJiAqdGVuZCA9PSAnLScpOwotCSAgIHRlbmQrKyk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGRpcm9wdHNbaV0ucGFyYW07IGkrKykKLQl7Ci0JICBpbnQgbGVuID0gc3RybGVuIChkaXJvcHRzW2ldLnBhcmFtKTsKLQkgIGlmICh0ZW5kIC0gcGFyYW0gPj0gbGVuCi0JICAgICAgJiYgc3RybmNtcCAocGFyYW0sIGRpcm9wdHNbaV0ucGFyYW0sIGxlbikgPT0gMAotCSAgICAgICYmIChwYXJhbVtsZW5dID09ICc6JyB8fCBwYXJhbVtsZW5dID09ICcgJykpCi0JICAgIHsKLQkgICAgICBsZXhfcGFyc2Vfc3RyaW5nX2VuZCA9IHRlbmQ7Ci0JICAgICAgbGV4X3BhcnNlX3N0cmluZyA9IHBhcmFtICsgbGVuICsgMTsKLQkgICAgICBsZXhfZm9yY2VkX3Rva2VuID0gZGlyb3B0c1tpXS50b2tlbjsKLQkgICAgICBzYXdfbmV3bGluZSA9IDA7Ci0JICAgICAgZGVmX3BhcnNlICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoIWRpcm9wdHNbaV0ucGFyYW0pCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGVpbmZvIChfKCJXYXJuaW5nOiAuZHJlY3R2ZSBgJS4qcycgdW5yZWNvZ25pemVkXG4iKSwKLQkJIHRlbmQgLSBwYXJhbSwgcGFyYW0pOwotCX0KLSAgICAgIGxleF9wYXJzZV9zdHJpbmcgPSAwOwotICAgICAgcGFyYW0gPSB0ZW5kOwotICAgIH0KLQotICBkZWYgPSBzYXZlX2RlZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gUGFyc2VyIENhbGxiYWNrcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotZGVmX25hbWUgKG5hbWUsIGJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBiYXNlOwotewotICBpZiAoZGVmLT5uYW1lKQotICAgIGZyZWUgKGRlZi0+bmFtZSk7Ci0gIGRlZi0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBkZWYtPmJhc2VfYWRkcmVzcyA9IGJhc2U7Ci0gIGRlZi0+aXNfZGxsID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9saWJyYXJ5IChuYW1lLCBiYXNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgYmFzZTsKLXsKLSAgaWYgKGRlZi0+bmFtZSkKLSAgICBmcmVlIChkZWYtPm5hbWUpOwotICBkZWYtPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgZGVmLT5iYXNlX2FkZHJlc3MgPSBiYXNlOwotICBkZWYtPmlzX2RsbCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfZGVzY3JpcHRpb24gKHRleHQpCi0gICAgIGNvbnN0IGNoYXIgKnRleHQ7Ci17Ci0gIGludCBsZW4gPSBkZWYtPmRlc2NyaXB0aW9uID8gc3RybGVuIChkZWYtPmRlc2NyaXB0aW9uKSA6IDA7Ci0gIGxlbiArPSBzdHJsZW4gKHRleHQpICsgMTsKLSAgaWYgKGRlZi0+ZGVzY3JpcHRpb24pCi0gICAgewotICAgICAgZGVmLT5kZXNjcmlwdGlvbiA9IChjaGFyICopIHhyZWFsbG9jIChkZWYtPmRlc2NyaXB0aW9uLCBsZW4pOwotICAgICAgc3RyY2F0IChkZWYtPmRlc2NyaXB0aW9uLCB0ZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkZWYtPmRlc2NyaXB0aW9uID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgICAgIHN0cmNweSAoZGVmLT5kZXNjcmlwdGlvbiwgdGV4dCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZGVmX3N0YWNrc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQotICAgICBpbnQgcmVzZXJ2ZTsKLSAgICAgaW50IGNvbW1pdDsKLXsKLSAgZGVmLT5zdGFja19yZXNlcnZlID0gcmVzZXJ2ZTsKLSAgZGVmLT5zdGFja19jb21taXQgPSBjb21taXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfaGVhcHNpemUgKHJlc2VydmUsIGNvbW1pdCkKLSAgICAgaW50IHJlc2VydmU7Ci0gICAgIGludCBjb21taXQ7Ci17Ci0gIGRlZi0+aGVhcF9yZXNlcnZlID0gcmVzZXJ2ZTsKLSAgZGVmLT5oZWFwX2NvbW1pdCA9IGNvbW1pdDsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9zZWN0aW9uIChuYW1lLCBhdHRyKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgYXR0cjsKLXsKLSAgZGVmX2ZpbGVfc2VjdGlvbiAqczsKLSAgaW50IG1heF9zZWN0aW9ucyA9IFJPVU5EX1VQKGRlZi0+bnVtX3NlY3Rpb25fZGVmcywgNCk7Ci0gIGlmIChkZWYtPm51bV9zZWN0aW9uX2RlZnMgPj0gbWF4X3NlY3Rpb25zKQotICAgIHsKLSAgICAgIG1heF9zZWN0aW9ucyA9IFJPVU5EX1VQKGRlZi0+bnVtX3NlY3Rpb25fZGVmcysxLCA0KTsKLSAgICAgIGlmIChkZWYtPnNlY3Rpb25fZGVmcykKLQlkZWYtPnNlY3Rpb25fZGVmcyA9IChkZWZfZmlsZV9zZWN0aW9uICopIHhyZWFsbG9jIChkZWYtPnNlY3Rpb25fZGVmcywgbWF4X3NlY3Rpb25zICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICAgIGVsc2UKLQlkZWYtPnNlY3Rpb25fZGVmcyA9IChkZWZfZmlsZV9zZWN0aW9uICopIHhtYWxsb2MgKG1heF9zZWN0aW9ucyAqIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7Ci0gICAgfQotICBzID0gZGVmLT5zZWN0aW9uX2RlZnMgKyBkZWYtPm51bV9zZWN0aW9uX2RlZnM7Ci0gIG1lbXNldCAocywgMCwgc2l6ZW9mIChkZWZfZmlsZV9zZWN0aW9uKSk7Ci0gIHMtPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgaWYgKGF0dHIgJiAxKQotICAgIHMtPmZsYWdfcmVhZCA9IDE7Ci0gIGlmIChhdHRyICYgMikKLSAgICBzLT5mbGFnX3dyaXRlID0gMTsKLSAgaWYgKGF0dHIgJiA0KQotICAgIHMtPmZsYWdfZXhlY3V0ZSA9IDE7Ci0gIGlmIChhdHRyICYgOCkKLSAgICBzLT5mbGFnX3NoYXJlZCA9IDE7Ci0KLSAgZGVmLT5udW1fc2VjdGlvbl9kZWZzKys7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfc2VjdGlvbl9hbHQgKG5hbWUsIGF0dHIpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmF0dHI7Ci17Ci0gIGludCBhdmFsID0gMDsKLSAgZm9yICg7ICphdHRyOyBhdHRyKyspCi0gICAgewotICAgICAgc3dpdGNoICgqYXR0cikKLQl7Ci0JY2FzZSAnUic6Ci0JY2FzZSAncic6Ci0JICBhdmFsIHw9IDE7Ci0JICBicmVhazsKLQljYXNlICdXJzoKLQljYXNlICd3JzoKLQkgIGF2YWwgfD0gMjsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCWNhc2UgJ3gnOgotCSAgYXZhbCB8PSA0OwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JY2FzZSAncyc6Ci0JICBhdmFsIHw9IDg7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBkZWZfc2VjdGlvbiAobmFtZSwgYXZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfZXhwb3J0cyAoZXh0ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSwgb3JkaW5hbCwgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKmV4dGVybmFsX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGRlZl9maWxlX2V4cG9ydCAqZGZlOwotCi0gIGlmICghaW50ZXJuYWxfbmFtZSAmJiBleHRlcm5hbF9uYW1lKQotICAgIGludGVybmFsX25hbWUgPSBleHRlcm5hbF9uYW1lOwotI2lmIFRSQUNFCi0gIHByaW50ZiAoImRlZl9leHBvcnRzLCBleHQ9JXMgaW50PSVzXG4iLCBleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lKTsKLSNlbmRpZgotCi0gIGRmZSA9IGRlZl9maWxlX2FkZF9leHBvcnQgKGRlZiwgZXh0ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSwgb3JkaW5hbCk7Ci0gIGlmIChmbGFncyAmIDEpCi0gICAgZGZlLT5mbGFnX25vbmFtZSA9IDE7Ci0gIGlmIChmbGFncyAmIDIpCi0gICAgZGZlLT5mbGFnX2NvbnN0YW50ID0gMTsKLSAgaWYgKGZsYWdzICYgNCkKLSAgICBkZmUtPmZsYWdfZGF0YSA9IDE7Ci0gIGlmIChmbGFncyAmIDgpCi0gICAgZGZlLT5mbGFnX3ByaXZhdGUgPSAxOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX2ltcG9ydCAoaW50ZXJuYWxfbmFtZSwgbW9kdWxlLCBkbGxleHQsIG5hbWUsIG9yZGluYWwpCi0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsKLSAgICAgY29uc3QgY2hhciAqZGxsZXh0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgb3JkaW5hbDsKLXsKLSAgY2hhciAqYnVmID0gMDsKLQotICBpZiAoZGxsZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChtb2R1bGUpICsgc3RybGVuIChkbGxleHQpICsgMik7Ci0gICAgICBzcHJpbnRmIChidWYsICIlcy4lcyIsIG1vZHVsZSwgZGxsZXh0KTsKLSAgICAgIG1vZHVsZSA9IGJ1ZjsKLSAgICB9Ci0KLSAgZGVmX2ZpbGVfYWRkX2ltcG9ydCAoZGVmLCBuYW1lLCBtb2R1bGUsIG9yZGluYWwsIGludGVybmFsX25hbWUpOwotICBpZiAoYnVmKQotICAgIGZyZWUgKGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfdmVyc2lvbiAobWFqb3IsIG1pbm9yKQotICAgICBpbnQgbWFqb3I7Ci0gICAgIGludCBtaW5vcjsKLXsKLSAgZGVmLT52ZXJzaW9uX21ham9yID0gbWFqb3I7Ci0gIGRlZi0+dmVyc2lvbl9taW5vciA9IG1pbm9yOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX2RpcmVjdGl2ZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHN0cnVjdCBkaXJlY3RpdmUgKmQgPSAoc3RydWN0IGRpcmVjdGl2ZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBkaXJlY3RpdmUpKTsKLSAgZC0+bmV4dCA9IGRpcmVjdGl2ZXM7Ci0gIGRpcmVjdGl2ZXMgPSBkOwotICBkLT5uYW1lID0geHN0cmR1cCAoc3RyKTsKLSAgZC0+bGVuID0gc3RybGVuIChzdHIpOwotfQotCi1zdGF0aWMgaW50Ci1kZWZfZXJyb3IgKGVycikKLSAgICAgY29uc3QgY2hhciAqZXJyOwotewotICBlaW5mbyAoIiVQOiAlczolZDogJXNcbiIsIGRlZl9maWxlbmFtZSwgbGluZW51bWJlciwgZXJyKTsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBMZXhpY2FsIFNjYW5uZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3VuZGVmIFRSQUNFCi0jZGVmaW5lIFRSQUNFIDAKLQotLyogTmV2ZXIgZnJlZWQsIGJ1dCBhbHdheXMgcmV1c2VkIGFzIG5lZWRlZCwgc28gbm8gcmVhbCBsZWFrICovCi1zdGF0aWMgY2hhciAqYnVmZmVyID0gMDsKLXN0YXRpYyBpbnQgYnVmbGVuID0gMDsKLXN0YXRpYyBpbnQgYnVmcHRyID0gMDsKLQotc3RhdGljIHZvaWQKLXB1dF9idWYgKGMpCi0gICAgIGNoYXIgYzsKLXsKLSAgaWYgKGJ1ZnB0ciA9PSBidWZsZW4pCi0gICAgewotICAgICAgYnVmbGVuICs9IDUwOwkJLyogb3Zlcmx5IHJlYXNvbmFibGUsIGVoPyAqLwotICAgICAgaWYgKGJ1ZmZlcikKLQlidWZmZXIgPSAoY2hhciAqKSB4cmVhbGxvYyAoYnVmZmVyLCBidWZsZW4gKyAxKTsKLSAgICAgIGVsc2UKLQlidWZmZXIgPSAoY2hhciAqKSB4bWFsbG9jIChidWZsZW4gKyAxKTsKLSAgICB9Ci0gIGJ1ZmZlcltidWZwdHIrK10gPSBjOwotICBidWZmZXJbYnVmcHRyXSA9IDA7CQkvKiBub3Qgb3B0aW1hbCwgYnV0IHZlcnkgY29udmVuaWVudCAqLwotfQotCi1zdGF0aWMgc3RydWN0Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCB0b2tlbjsKLX0KLXRva2Vuc1tdID0KLXsKLSAgeyAiQkFTRSIsIEJBU0UgfSwKLSAgeyAiQ09ERSIsIENPREUgfSwKLSAgeyAiQ09OU1RBTlQiLCBDT05TVEFOVFUgfSwKLSAgeyAiY29uc3RhbnQiLCBDT05TVEFOVEwgfSwKLSAgeyAiREFUQSIsIERBVEFVIH0sCi0gIHsgImRhdGEiLCBEQVRBTCB9LAotICB7ICJERVNDUklQVElPTiIsIERFU0NSSVBUSU9OIH0sCi0gIHsgIkRJUkVDVElWRSIsIERJUkVDVElWRSB9LAotICB7ICJFWEVDVVRFIiwgRVhFQ1VURSB9LAotICB7ICJFWFBPUlRTIiwgRVhQT1JUUyB9LAotICB7ICJIRUFQU0laRSIsIEhFQVBTSVpFIH0sCi0gIHsgIklNUE9SVFMiLCBJTVBPUlRTIH0sCi0gIHsgIkxJQlJBUlkiLCBMSUJSQVJZIH0sCi0gIHsgIk5BTUUiLCBOQU1FIH0sCi0gIHsgIk5PTkFNRSIsIE5PTkFNRVUgfSwKLSAgeyAibm9uYW1lIiwgTk9OQU1FTCB9LAotICB7ICJQUklWQVRFIiwgUFJJVkFURVUgfSwKLSAgeyAicHJpdmF0ZSIsIFBSSVZBVEVMIH0sCi0gIHsgIlJFQUQiLCBSRUFEIH0sCi0gIHsgIlNFQ1RJT05TIiwgU0VDVElPTlMgfSwKLSAgeyAiU0VHTUVOVFMiLCBTRUNUSU9OUyB9LAotICB7ICJTSEFSRUQiLCBTSEFSRUQgfSwKLSAgeyAiU1RBQ0tTSVpFIiwgU1RBQ0tTSVpFIH0sCi0gIHsgIlZFUlNJT04iLCBWRVJTSU9OSyB9LAotICB7ICJXUklURSIsIFdSSVRFIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgaW50Ci1kZWZfZ2V0YyAoKQotewotICBpbnQgcnY7Ci0gIGlmIChsZXhfcGFyc2Vfc3RyaW5nKQotICAgIHsKLSAgICAgIGlmIChsZXhfcGFyc2Vfc3RyaW5nID49IGxleF9wYXJzZV9zdHJpbmdfZW5kKQotCXJ2ID0gRU9GOwotICAgICAgZWxzZQotCXJ2ID0gKmxleF9wYXJzZV9zdHJpbmcrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBydiA9IGZnZXRjICh0aGVfZmlsZSk7Ci0gICAgfQotICBpZiAocnYgPT0gJ1xuJykKLSAgICBzYXdfbmV3bGluZSA9IDE7Ci0gIHJldHVybiBydjsKLX0KLQotc3RhdGljIGludAotZGVmX3VuZ2V0YyAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChsZXhfcGFyc2Vfc3RyaW5nKQotICAgIHsKLSAgICAgIGxleF9wYXJzZV9zdHJpbmctLTsKLSAgICAgIHJldHVybiBjOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiB1bmdldGMgKGMsIHRoZV9maWxlKTsKLX0KLQotc3RhdGljIGludAotZGVmX2xleCAoKQotewotICBpbnQgYywgaSwgcTsKLQotICBpZiAobGV4X2ZvcmNlZF90b2tlbikKLSAgICB7Ci0gICAgICBpID0gbGV4X2ZvcmNlZF90b2tlbjsKLSAgICAgIGxleF9mb3JjZWRfdG9rZW4gPSAwOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGZvcmNpbmcgdG9rZW4gJWRcbiIsIGkpOwotI2VuZGlmCi0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgYyA9IGRlZl9nZXRjICgpOwotCi0gIC8qIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlIChjICE9IEVPRiAmJiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSAmJiBzYXdfbmV3bGluZSkKLSAgICBjID0gZGVmX2dldGMgKCk7Ci0KLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBFT0ZcbiIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHNhd19uZXdsaW5lICYmIGMgPT0gJzsnKQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpOwotICAgICAgaWYgKGMgPT0gJ1xuJykKLQlyZXR1cm4gZGVmX2xleCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgLyogbXVzdCBiZSBzb21ldGhpbmcgZWxzZSAqLwotICBzYXdfbmV3bGluZSA9IDA7Ci0KLSAgaWYgKGlzZGlnaXQgKGMpKQotICAgIHsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgKGlzeGRpZ2l0IChjKSB8fCAoYyA9PSAneCcpKSkKLQl7Ci0JICBwdXRfYnVmIChjKTsKLQkgIGMgPSBkZWZfZ2V0YyAoKTsKLQl9Ci0gICAgICBpZiAoYyAhPSBFT0YpCi0JZGVmX3VuZ2V0YyAoYyk7Ci0gICAgICB5eWx2YWwubnVtYmVyID0gc3RydG91bCAoYnVmZmVyLCAwLCAwKTsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBgJXMnIHJldHVybnMgTlVNQkVSICVkXG4iLCBidWZmZXIsIHl5bHZhbC5udW1iZXIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gTlVNQkVSOwotICAgIH0KLQotICBpZiAoaXNhbHBoYSAoYykgfHwgc3RyY2hyICgiJDotXz8iLCBjKSkKLSAgICB7Ci0gICAgICBidWZwdHIgPSAwOwotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIChpc2FsbnVtIChjKSB8fCBzdHJjaHIgKCIkOi1fPy9AIiwgYykpKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIGlmIChjICE9IEVPRikKLQlkZWZfdW5nZXRjIChjKTsKLSAgICAgIGZvciAoaSA9IDA7IHRva2Vuc1tpXS5uYW1lOyBpKyspCi0JaWYgKHN0cmNtcCAodG9rZW5zW2ldLm5hbWUsIGJ1ZmZlcikgPT0gMCkKLQkgIHsKLSNpZiBUUkFDRQotCSAgICBwcmludGYgKCJsZXg6IGAlcycgaXMgYSBzdHJpbmcgdG9rZW5cbiIsIGJ1ZmZlcik7Ci0jZW5kaWYKLQkgICAgcmV0dXJuIHRva2Vuc1tpXS50b2tlbjsKLQkgIH0KLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBgJXMnIHJldHVybnMgSURcbiIsIGJ1ZmZlcik7Ci0jZW5kaWYKLSAgICAgIHl5bHZhbC5pZCA9IHhzdHJkdXAgKGJ1ZmZlcik7Ci0gICAgICByZXR1cm4gSUQ7Ci0gICAgfQotCi0gIGlmIChjID09ICdcJycgfHwgYyA9PSAnIicpCi0gICAgewotICAgICAgcSA9IGM7Ci0gICAgICBjID0gZGVmX2dldGMgKCk7Ci0gICAgICBidWZwdHIgPSAwOwotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gcSkKLQl7Ci0JICBwdXRfYnVmIChjKTsKLQkgIGMgPSBkZWZfZ2V0YyAoKTsKLQl9Ci0gICAgICB5eWx2YWwuaWQgPSB4c3RyZHVwIChidWZmZXIpOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBJRFxuIiwgYnVmZmVyKTsKLSNlbmRpZgotICAgICAgcmV0dXJuIElEOwotICAgIH0KLQotICBpZiAoYyA9PSAnPScgfHwgYyA9PSAnLicgfHwgYyA9PSAnQCcgfHwgYyA9PSAnLCcpCi0gICAgewotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlYycgcmV0dXJucyBpdHNlbGZcbiIsIGMpOwotI2VuZGlmCi0gICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBsaW5lbnVtYmVyKys7Ci0gICAgICBzYXdfbmV3bGluZSA9IDE7Ci0gICAgfQotCi0gIC8qcHJpbnRmICgibGV4OiAweCUwMnggaWdub3JlZFxuIiwgYyk7ICovCi0gIHJldHVybiBkZWZfbGV4ICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvZGVwLWluLnNlZCBiL2xkL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODBlYjAuLjAwMDAwMDAKLS0tIGEvbGQvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTpsb29wCi0vXFwkL04KLS9cXCQvYiBsb29wCi0KLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi1zIVwuXC4vYmZkL2hvc3RzL1teIF0qXC5oICEgIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvUkVBRE1FIGIvbGQvZW11bHBhcmFtcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDZkMjYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgcmVhZCBieSBnZW5zY3JpcHRzLnNoIGFzIHNoZWxsIGNvbW1hbmRzLgotVGhleSBzZXQgcGFyYW1ldGVycyBmb3IgdGhlIGVtdWxhdGlvbnMuCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2EyOWsuc2ggYi9sZC9lbXVscGFyYW1zL2EyOWsuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzhlODUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hMjlrLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hMjlrCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWEyOWstYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9haXhwcGMuc2ggYi9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZTY4Ni4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVEVNUExBVEVfTkFNRT1haXgKLVNDUklQVF9OQU1FPWFpeAotT1VUUFVUX0ZPUk1BVD0iYWl4Y29mZi1yczYwMDAiCi1BUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYWl4cnM2LnNoIGIvbGQvZW11bHBhcmFtcy9haXhyczYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2MzZjcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9haXhyczYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9YWl4Ci1TQ1JJUFRfTkFNRT1haXgKLU9VVFBVVF9GT1JNQVQ9ImFpeGNvZmYtcnM2MDAwIgotQVJDSD1yczYwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2ggYi9sZC9lbXVscGFyYW1zL2FscGhhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE5MjNmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVNDUklQVF9OQU1FPWFscGhhCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVhbHBoYSIKLUFSQ0g9YWxwaGEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJjZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzljMTcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFyYyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcmMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJjIgotVEVYVF9TVEFSVF9BRERSPTB4MAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPWFyYwotTUFDSElORT0KLUVOVFJZPXN0YXJ0Ci0jVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZmEyMmQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPWVwb2NwZQotT1VUUFVUX0ZPUk1BVD0iZXBvYy1wZWktYXJtLWxpdHRsZSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlcG9jLXBlaS1hcm0tbGl0dGxlIgotQklHX09VVFBVVF9GT1JNQVQ9ImVwb2MtcGVpLWFybS1iaWciCi1URU1QTEFURV9OQU1FPXBlCi1FTlRSWT0iX21haW5DUlRTdGFydHVwIgotU1VCU1lTVEVNPVBFX0RFRl9TVUJTWVNURU0KLUlOSVRJQUxfU1lNQk9MX0NIQVI9XCJfXCIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2ggYi9sZC9lbXVscGFyYW1zL2FybWFvdXRiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWFiNmYxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFybWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWFybS1iaWciCi1IRUFERVJfU1RBUlRfQUREUj0weDgwMDAKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUkVTUz0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MzI3NjgKLUFSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1hb3V0bC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMWYzMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hcm1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1hcm0tbGl0dGxlIgotSEVBREVSX1NUQVJUX0FERFI9MHg4MDAwCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFJFU1M9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTMyNzY4Ci1BUkNIPWFybQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRmN2QzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPWFybWNvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYXJtLWxpdHRsZSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJjb2ZmLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iY29mZi1hcm0tYmlnIgotVEVNUExBVEVfTkFNRT1hcm1jb2ZmCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc5YjY0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ2FybSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZgotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKiguZ2x1ZV83dCkgKiguZ2x1ZV83KScKLU9USEVSX0JTU19TWU1CT0xTPSdfX2Jzc19zdGFydF9fID0gLjsnCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9J19ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOycKLQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotCi1BUkNIPWFybQotTUFDSElORT0KLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLQotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggYi9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1ZThiZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLUFSQ0g9YXJtCi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcm0iCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotTUFYUEFHRVNJWkU9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19fZGF0YV9zdGFydCA9IC4gOyc7Ci1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7JwotCi0jIFRoaXMgbmVlZHMgdG8gYmUgaGlnaCBlbm91Z2ggc28gdGhhdCB3ZSBjYW4gbG9hZCBsZC5zbyBiZWxvdyBpdCwKLSMgeWV0IGxvdyBlbm91Z2ggdG8gc3RheSBhd2F5IGZyb20gdGhlIG1tYXAgYXJlYSBhdCAweDQwMDAwMDAwLgotIyBBbHNvLCBpdCBpcyBzbWFsbCBlbm91Z2ggc28gdGhhdCByZWxvY3Mgd2hpY2ggYXJlIHBvaW50aW5nCi0jIGF0IGFic29sdXRlIDAgd2lsbCBzdGlsbCBiZSBmaXhlZCB1cC4KLVRFWFRfU1RBUlRfQUREUj0weDAyMDAwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkMWIwZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ2FybSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1NQVhQQUdFU0laRT0weDgwMDAKLVRFTVBMQVRFX05BTUU9YXJtZWxmCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0KLURBVEFfU1RBUlRfU1lNQk9MUz0nX19kYXRhX3N0YXJ0ID0gLiA7JzsKLU9USEVSX0JTU19TWU1CT0xTPSdfX2Jzc19zdGFydF9fID0gLjsnCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9J19ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOycKLQotIyBUaGlzIG5lZWRzIHRvIGJlIGhpZ2ggZW5vdWdoIHNvIHRoYXQgd2UgY2FuIGxvYWQgbGQuc28gYmVsb3cgaXQsCi0jIHlldCBsb3cgZW5vdWdoIHRvIHN0YXkgYXdheSBmcm9tIHRoZSBtbWFwIGFyZWEgYXQgMHgwMTEwMDAwMC4KLSMgQWxzbywgaXQgaXMgc21hbGwgZW5vdWdoIHNvIHRoYXQgcmVsb2NzIHdoaWNoIGFyZSBwb2ludGluZwotIyBhdCBhYnNvbHV0ZSAwIHdpbGwgc3RpbGwgYmUgZml4ZWQgdXAuCi0jIFRoZXNlIHZhbHVlcyBnaXZlIHVzIGFib3V0IDAuNU1CIGZvciBsZC5zbywgMTYuNU1CIGZvciB1c2VyIAotIyBwcm9ncmFtcywgYW5kIDE1TUIgZm9yIG1tYXAgd2hpY2ggc2VlbXMgYSByZWFzb25hYmxlIGNvbXByb21pc2UuCi1URVhUX1NUQVJUX0FERFI9MHgwMDA4MDAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NjgzMjguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybS1vYWJpIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ2FybS1vYWJpIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybS1vYWJpIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEVNUExBVEVfTkFNRT1hcm1lbGZfb2FiaQotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKiguZ2x1ZV83dCkgKiguZ2x1ZV83KScKLU9USEVSX0JTU19TWU1CT0xTPSdfX2Jzc19zdGFydF9fID0gLjsnCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9J19ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsnCi0gCi0gCi1BUkNIPWFybQotTUFDSElORT0KLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLSAKLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyNzc5MS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybW5ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWFybS1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1hcm0KLUVYRUNVVEFCTEVfU1lNQk9MUz0nX19EWU5BTUlDID0gMDsnCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybXBlLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1wZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3YzlkZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9cGUKLU9VVFBVVF9GT1JNQVQ9InBlaS1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9InBlaS1hcm0tbGl0dGxlIgotQklHX09VVFBVVF9GT1JNQVQ9InBlaS1hcm0tYmlnIgotVEVNUExBVEVfTkFNRT1wZQotRU5UUlk9Il9tYWluQ1JUU3RhcnR1cCIKLVNVQlNZU1RFTT1QRV9ERUZfU1VCU1lTVEVNCi1JTklUSUFMX1NZTUJPTF9DSEFSPVwiX1wiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2ggYi9sZC9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjg1MmEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1zcGFyY2NvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtc3BhcmMiCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cyAoYm9ycm93ZWQgZnJvbSBzcGFyYyBseW54KQotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzQyMTQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMTB2ZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmZDEwdgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZDEwdiIKLVRFWFRfU1RBUlRfQUREUj0weDAxMDAwMDAwCi1SRUFET05MWV9TVEFSVF9BRERSPTB4MDIwMDAwMDQKLUFSQ0g9ZDEwdgotTUFYUEFHRVNJWkU9MzIKLUVNQkVEREVEPXQKLVRFTVBMQVRFX05BTUU9ZWxmMzIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZDMwdl9lLnNoIGIvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWI1YTIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmZDMwdgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZDMwdiIKLVRFWFRfU1RBUlRfQUREUj0weDAwMDAwMDAwCi1EQVRBX1NUQVJUX0FERFI9MHgyMDAwMDAwMAotRU1FTV9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLVNUQUNLX1NUQVJUX0FERFI9MHgyMDAwODAwMAotRUlUX1NUQVJUX0FERFI9MHhmZmZmZjAyMAotVEVYVF9TSVpFPTY0SwotREFUQV9TSVpFPTMySwotRU1FTV9TSVpFPThNCi1FSVRfU0laRT0zMjAKLVRFWFRfTUVNT1JZPWVtZW0KLURBVEFfTUVNT1JZPWVtZW0KLUJTU19NRU1PUlk9ZW1lbQotVEVYVF9ERUZfU0VDVElPTj0iIgotREFUQV9ERUZfU0VDVElPTj0iIgotRU1FTV9ERUZfU0VDVElPTj0iKHJ3eCkiCi1BUkNIPWQzMHYKLUVNQkVEREVEPXQKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZDMwdl9vLnNoIGIvbGQvZW11bHBhcmFtcy9kMzB2X28uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmNiNDIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMzB2X28uc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmZDMwdgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZDMwdiIKLVRFWFRfU1RBUlRfQUREUj0weDAwMDAwMDAwCi1EQVRBX1NUQVJUX0FERFI9MHgyMDAwMDAwMAotRU1FTV9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLVNUQUNLX1NUQVJUX0FERFI9MHgyMDAwODAwMAotRUlUX1NUQVJUX0FERFI9MHhmZmZmZjAyMAotVEVYVF9TSVpFPTY0SwotREFUQV9TSVpFPTMySwotRU1FTV9TSVpFPThNCi1FSVRfU0laRT0zMjAKLVRFWFRfTUVNT1JZPXRleHQKLURBVEFfTUVNT1JZPWRhdGEKLUJTU19NRU1PUlk9ZGF0YQotVEVYVF9ERUZfU0VDVElPTj0iKHgpIgotREFUQV9ERUZfU0VDVElPTj0iKHJ3KSIKLUVNRU1fREVGX1NFQ1RJT049IiIKLUFSQ0g9ZDMwdgotRU1CRURERUQ9dApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDlkZTc4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZDMwdmVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMzB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMzB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDAwMDAKLURBVEFfU1RBUlRfQUREUj0weDIwMDAwMDAwCi1FTUVNX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotU1RBQ0tfU1RBUlRfQUREUj0weDIwMDA4MDAwCi1FSVRfU1RBUlRfQUREUj0weGZmZmZmMDIwCi1URVhUX1NJWkU9MjAwMEsKLURBVEFfU0laRT0yMDAwSwotRU1FTV9TSVpFPThNCi1FSVRfU0laRT0zMjAKLVRFWFRfTUVNT1JZPXRleHQKLURBVEFfTUVNT1JZPWRhdGEKLUJTU19NRU1PUlk9ZGF0YQotVEVYVF9ERUZfU0VDVElPTj0iKHgpIgotREFUQV9ERUZfU0VDVElPTj0iKHJ3KSIKLUVNRU1fREVGX1NFQ1RJT049IiIKLUFSQ0g9ZDMwdgotRU1CRURERUQ9dApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kZWx0YTY4LnNoIGIvbGQvZW11bHBhcmFtcy9kZWx0YTY4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2M1OTA5Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZGVsdGE2OC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9ZGVsdGE2OAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrLXN5c3YiCi1URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWJtb24yOWsuc2ggYi9sZC9lbXVscGFyYW1zL2VibW9uMjlrLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmMyYmQxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWJtb24yOWsuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWVibW9uMjlrCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWEyOWstYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGVjM2ZhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJfaTk2MC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1URU1QTEFURV9OQU1FPWVsZjMyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1pOTYwIgotQVJDSD1pOTYwCi1NQUNISU5FPQotVEVYVF9TVEFSVF9BRERSPTAKLUVNQkVEREVEPXllcwotTUFYUEFHRVNJWkU9MHgyMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlMjMyNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1zcGFyYyIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwMAotQUxJR05NRU5UPTgKLUFSQ0g9c3BhcmMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1EQVRBX1BMVD0KLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmOGQ5OC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4YTAwMjAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfRFlOQU1JQ19MSU5LID0gMDsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRFlOQU1JQ19MSU5LPWZhbHNlCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2M0MTEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcG4zMi5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NmY0MmE5Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIyBUaGlzIGlzIGFuIEVMRiBwbGF0Zm9ybS4KLVNDUklQVF9OQU1FPWVsZgotCi0jIEhhbmRsZSBib3RoIGJpZy0gYW5kIGxpdHRsZS1lbmRlZCAzMi1iaXQgTUlQUyBvYmplY3RzLgotQVJDSD1taXBzCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLQotVEVNUExBVEVfTkFNRT1lbGYzMgotCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMDAKLUVOVFJZPV9fc3RhcnQKLQotIyBHT1QtcmVsYXRlZCBzZXR0aW5ncy4gIAotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotICAuc3JkYXRhIDogeyAqKC5zcmRhdGEpIH0KLScKLQotIyBNYWdpYyBzeW1ib2xzLgotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotIyBJUklYNiBkZWZpbmVzIHRoZXNlIHN5bWJvbHMuICAweDM0IGlzIHRoZSBzaXplIG9mIHRoZSBFTEYgaGVhZGVyLgotRVhFQ1VUQUJMRV9TWU1CT0xTPSIKLSAgX19kc29fZGlzcGxhY2VtZW50ID0gMDsKLSAgX19lbGZfaGVhZGVyID0gJHtURVhUX1NUQVJUX0FERFJ9OwotICBfX3Byb2dyYW1faGVhZGVyX3RhYmxlID0gJHtURVhUX1NUQVJUX0FERFJ9ICsgMHgzNDsKLSIKLQotIyBUaGVyZSBhcmUgb2Z0ZW4gZHluYW1pYyByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZSAucm9kYXRhIHNlY3Rpb24uCi0jIFNldHRpbmcgRFRfVEVYVFJFTCBpbiB0aGUgLmR5bmFtaWMgc2VjdGlvbiBkb2VzIG5vdCBjb252aW5jZSB0aGUKLSMgSVJJWDYgbGlua2VyIHRvIHBlcm1pdCByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZSB0ZXh0IHNlZ21lbnQuCi0jIEZvbGxvd2luZyB0aGUgSVJJWCBsaW5rZXIsIHdlIHNpbXBseSBwdXQgLnJvZGF0YSBpbiB0aGUgZGF0YQotIyBzZWdtZW50LgotV1JJVEFCTEVfUk9EQVRBPQotCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScKLSAgLk1JUFMuZXZlbnRzLnRleHQgOgotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy50ZXh0KQotICAgICAgICooLk1JUFMuZXZlbnRzLmdudS5saW5rb25jZS50KikKLSAgICB9Ci0gIC5NSVBTLmNvbnRlbnQudGV4dCA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQudGV4dCkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLk1JUFMuZXZlbnRzLmRhdGEgOiAKLSAgICB7Ci0gICAgICAgKiguTUlQUy5ldmVudHMuZGF0YSkKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5nbnUubGlua29uY2UuZCopCi0gICAgfQotICAuTUlQUy5jb250ZW50LmRhdGEgOiAKLSAgICB7Ci0gICAgICAgKiguTUlQUy5jb250ZW50LmRhdGEpCi0gICAgICAgKiguTUlQUy5jb250ZW50LmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5NSVBTLmV2ZW50cy5yb2RhdGEgOiAKLSAgICB7Ci0gICAgICAgKiguTUlQUy5ldmVudHMucm9kYXRhKQotICAgICAgICooLk1JUFMuZXZlbnRzLmdudS5saW5rb25jZS5yKikKLSAgICB9Ci0gIC5NSVBTLmNvbnRlbnQucm9kYXRhIDogCi0gICAgewotICAgICAgICooLk1JUFMuY29udGVudC5yb2RhdGEpCi0gICAgICAgKiguTUlQUy5jb250ZW50LmdudS5saW5rb25jZS5yKikKLSAgICB9Ci0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjEzMDcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLURBVEFfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAotVEVYVF9EWU5BTUlDPQotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU5UUlk9X19zdGFydApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGVhOGZkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjAwOGM4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWJlMWY1My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWZyMzAiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMAotQVJDSD1mcjMwCi1NQVhQQUdFU0laRT0yNTYKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCi1OT1A9MHg5ZmEwCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPSdQUk9WSURFIChfX3N0YWNrID0gMHgyMDAwMDApOycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MGRlODguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weGEwMDIwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLUVYRUNVVEFCTEVfU1lNQk9MUz0nX0RZTkFNSUNfTElOSyA9IDA7JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLURZTkFNSUNfTElOSz1mYWxzZQotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybG1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzMxMmY0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLURBVEFfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAotVEVYVF9EWU5BTUlDPQotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybHBwYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmZmM2MS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybHBwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotU0NSSVBUX05BTUU9ZWxmcHBjCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1wb3dlcnBjbGUiCi1URVhUX1NUQVJUX0FERFI9MHg0MDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotQVJDSD1wb3dlcnBjCi1NQUNISU5FPQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmRjOGExLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVOVFJZPV9fc3RhcnQKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2OWUxMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW1jb3JlLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1tY29yZS1iaWciCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbWNvcmUtbGl0dGxlIgotUEFHRV9TSVpFPTB4MTAwMAotVEFSR0VUX1BBR0VfU0laRT0weDQwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTAKLUFSQ0g9bWNvcmUKLUVNQkVEREVEPXllcwotCi0jIFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBOT1AgdmFsdWUgLSBpdCBtdXN0IHdvcmsgZm9yIGJvdGgKLSMgYmlnIGVuZGlhbiBhbmQgbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLiAgVW5mb3J0dW5hdGVseSB0aGVyZSBpcwotIyBubyBzeW1tZXRyaWNhbCBtY29yZSBvcGNvZGUgdGhhdCBmdW5jdGlvbnMgYXMgYSBub29wLiAgVGhlCi0jIGNob3NlbiBzb2x1dGlvbiBpcyB0byB1c2UgInRzdCByMCwgcjE0Ii4gIFRoaXMgaXMgYSBzeW1ldHJpY2FsCi0jIHZhbHVlLCBhbmQgYXBhcnQgZnJvbSB0aGUgY29ycnVwdGlvbiBvZiB0aGUgQyBiaXQsIGl0IGhhcyBubyBvdGhlcgotIyBzaWRlIGVmZmVjdHMuICBTaW5jZSB0aGUgY2FycnkgYml0IGlzIG5ldmVyIHRlc3RlZCB3aXRob3V0IGJlaW5nCi0jIGV4cGxpY2l0bHkgc2V0IGZpcnN0LCBhbmQgc2luY2UgdGhlIE5PUCBjb2RlIGlzIG9ubHkgdXNlZCBhcyBhCi0jIGZpbGwgdmFsdWUgYmV0d2VlbiBpbmRlcGVuZGFudGx5IHZpYWJsZSBwZWljZXMgb2YgY29kZSwgaXQgc2hvdWxkCi0jIG5vdCBtYXR0ZXIuCi1OT1A9MHgwZTBlCi0KLU9USEVSX0JTU19TWU1CT0xTPSJfX2Jzc19zdGFydF9fID0gLiA7IgotT1RIRVJfQlNTX0VORF9TWU1CT0xTPSJfX2Jzc19lbmRfXyA9IC4gOyIKLQotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwotCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0KLSMgVGhpcyBjb2RlIGdldHMgaW5zZXJ0ZWQgaW50byB0aGUgZ2VuZXJpYyBlbGYzMi5zYyBsaW5rZXIgc2NyaXB0Ci0jIGFuZCBhbGxvd3MgdXMgdG8gZGVmaW5lIG91ciBvd24gY29tbWFuZCBsaW5lIHN3aXRjaGVzLgotUEFSU0VfQU5EX0xJU1RfQVJHUz0nCi0KLSNkZWZpbmUgT1BUSU9OX0JBU0VfRklMRQkJMzAwCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotc3RhdGljIHZvaWQKLWdsZF9lbGYzMm1jb3JlX2xpc3Rfb3B0aW9ucyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1iYXNlX2ZpbGUgPGJhc2VmaWxlPiAgICAgIEdlbmVyYXRlIGEgYmFzZSBmaWxlIGZvciByZWxvY2F0YWJsZSBETExzXG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdsZF9lbGYzMm1jb3JlX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCAgICAgICAgbG9uZ2luZDsKLSAgaW50ICAgICAgICBvcHRjOwotICBpbnQgICAgICAgIHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCAgICAgICAgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50ICAgICAgICB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICAKLSAgd2FudGVycm9yICA9IG9wdGVycjsKLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjICAgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmIGxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfRklMRToKLSAgICAgIGxpbmtfaW5mby5iYXNlX2ZpbGUgPSAoUFRSKSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XQik7Ci0gICAgICBpZiAobGlua19pbmZvLmJhc2VfZmlsZSA9PSBOVUxMKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW5ub3Qgb3BlbiBiYXNlIGZpbGUgJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICB4ZXhpdCAoMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMycHBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTM4ODBjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZnBwYwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwYyIKLVRFWFRfU1RBUlRfQUREUj0weDAxODAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwCi1BUkNIPXBvd2VycGMKLU1BQ0hJTkU9CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTZjN2IuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1TQ1JJUFRfTkFNRT1lbGZwcGMKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBvd2VycGMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMAotQVJDSD1wb3dlcnBjCi1NQUNISU5FPQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjJlNGYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotRUxGU0laRT02NAotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmNjQtc3BhcmMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKLUFSQ0g9InNwYXJjOnY5IgotTUFDSElORT0KLURBVEFfUExUPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotTk9QPTB4MDEwMDAwMDAKLQotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF07IHRoZW4KLSAgY2FzZSAiICRFTVVMQVRJT05fTElCUEFUSCAiIGluCi0gICAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi0gICAgICAjIE5hdGl2ZSwgYW5kIGRlZmF1bHQgb3IgZW11bGF0aW9uIHJlcXVlc3RpbmcgTElCX1BBVEguCi0KLSAgICAgICMgTGludXggYW5kIFNvbGFyaXMgbW9kaWZ5IHRoZSBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGgKLSAgICAgICMgdG8gZmlyc3QgaW5jbHVkZSBhIDY0LWJpdCBzcGVjaWZpYyBkaXJlY3RvcnkuICBJdCdzIHB1dAotICAgICAgIyBpbiBzbGlnaHRseSBkaWZmZXJlbnQgcGxhY2VzIG9uIHRoZSB0d28gc3lzdGVtcy4KLSAgICAgIGNhc2UgIiR0YXJnZXQiIGluCi0gICAgICAgIHNwYXJjKi1saW51eCopCi0gICAgICAgICAgc3VmZml4PTY0IDs7Ci0gICAgICAgIHNwYXJjKi1zb2xhcmlzKikKLSAgICAgICAgICBzdWZmaXg9L3NwYXJjdjkgOzsKLSAgICAgIGVzYWMKLQotICAgICAgaWYgWyAtbiAiJHtzdWZmaXh9IiBdOyB0aGVuCi0KLQlMSUJfUEFUSD0vbGliJHtzdWZmaXh9Oi9saWIKLQlMSUJfUEFUSD0ke0xJQl9QQVRIfTovdXNyL2xpYiR7c3VmZml4fTovdXNyL2xpYgotCWlmIFsgLW4gIiR7TkFUSVZFX0xJQl9ESVJTfSIgXTsgdGhlbgotCSAgTElCX1BBVEg9JHtMSUJfUEFUSH06YGVjaG8gJHtOQVRJVkVfTElCX0RJUlN9IHwgc2VkIHMvOi8ke3N1ZmZpeH06L2dgJHtzdWZmaXh9OiR7TkFUSVZFX0xJQl9ESVJTfQotCWZpCi0JaWYgWyAiJHtsaWJkaXJ9IiAhPSAvdXNyL2xpYiBdOyB0aGVuCi0JICBMSUJfUEFUSD0ke0xJQl9QQVRIfToke2xpYmRpcn0ke3N1ZmZpeH06JHtsaWJkaXJ9Ci0JZmkKLQlpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbG9jYWwvbGliIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9Oi91c3IvbG9jYWwvbGliJHtzdWZmaXh9Oi91c3IvbG9jYWwvbGliCi0JZmkKLQotICAgICAgZmkKLSAgICA7OwotICBlc2FjCi1maQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmEyMWYyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUVOVFJZPV9fc3RhcnQKLVNDUklQVF9OQU1FPWVsZgotRUxGU0laRT02NAotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmNjQtYWxwaGEiCi1URVhUX1NUQVJUX0FERFI9IjB4MTIwMDAwMDAwIgotTUFYUEFHRVNJWkU9MHgxMDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0iMHgxMjAwMDAwMDAiCi1BUkNIPWFscGhhCi1NQUNISU5FPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotREFUQV9QTFQ9Ci1OT1A9MHg0N2ZmMDQxZgotCi1PVEhFUl9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjY0Ym1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmNjRibWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDg1MmQ1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmNjRibWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyBUaGlzIGlzIGFuIEVMRiBwbGF0Zm9ybS4KLVNDUklQVF9OQU1FPWVsZgotCi0jIEhhbmRsZSBib3RoIGJpZy0gYW5kIGxpdHRsZS1lbmRlZCAzMi1iaXQgTUlQUyBvYmplY3RzLgotQVJDSD1taXBzCi1PVVRQVVRfRk9STUFUPSJlbGY2NC1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjY0LWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmNjQtbGl0dGxlbWlwcyIKLQotIyBOb3RlIHRoYXQgdGhlIGVsZjMyIHRlbXBsYXRlIGlzIHVzZWQgZm9yIDY0LWJpdCBlbXVsYXRpb25zIGFzIHdlbGwgCi0jIGFzIDMyLWJpdCBlbXVsYXRpb25zLgotRUxGU0laRT02NAotVEVNUExBVEVfTkFNRT1lbGYzMgotCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMDAKLUVOVFJZPV9fc3RhcnQKLQotIyBHT1QtcmVsYXRlZCBzZXR0aW5ncy4gIAotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotICAuc3JkYXRhIDogeyAqKC5zcmRhdGEpIH0KLScKLQotIyBNYWdpYyBzeW1ib2xzLgotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotIyBJUklYNiBkZWZpbmVzIHRoZXNlIHN5bWJvbHMuICAweDQwIGlzIHRoZSBzaXplIG9mIHRoZSBFTEYgaGVhZGVyLgotRVhFQ1VUQUJMRV9TWU1CT0xTPSIKLSAgX19kc29fZGlzcGxhY2VtZW50ID0gMDsKLSAgX19lbGZfaGVhZGVyID0gJHtURVhUX1NUQVJUX0FERFJ9OwotICBfX3Byb2dyYW1faGVhZGVyX3RhYmxlID0gJHtURVhUX1NUQVJUX0FERFJ9ICsgMHg0MDsKLSIKLQotIyBUaGVyZSBhcmUgb2Z0ZW4gZHluYW1pYyByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZSAucm9kYXRhIHNlY3Rpb24uCi0jIFNldHRpbmcgRFRfVEVYVFJFTCBpbiB0aGUgLmR5bmFtaWMgc2VjdGlvbiBkb2VzIG5vdCBjb252aW5jZSB0aGUKLSMgSVJJWDYgbGlua2VyIHRvIHBlcm1pdCByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZSB0ZXh0IHNlZ21lbnQuCi0jIEZvbGxvd2luZyB0aGUgSVJJWCBsaW5rZXIsIHdlIHNpbXBseSBwdXQgLnJvZGF0YSBpbiB0aGUgZGF0YQotIyBzZWdtZW50LgotV1JJVEFCTEVfUk9EQVRBPQotCi0KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9JwotICAuTUlQUy5ldmVudHMudGV4dCA6Ci0gICAgewotICAgICAgICooLk1JUFMuZXZlbnRzLnRleHQpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC50ZXh0IDogCi0gICAgewotICAgICAgICooLk1JUFMuY29udGVudC50ZXh0KQotICAgICAgICooLk1JUFMuY29udGVudC5nbnUubGlua29uY2UudCopCi0gICAgfQotICAuTUlQUy5ldmVudHMuZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5kYXRhKQotICAgICAgICooLk1JUFMuZXZlbnRzLmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5NSVBTLmNvbnRlbnQuZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZGF0YSkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLk1JUFMuZXZlbnRzLnJvZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5yb2RhdGEpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC5yb2RhdGEgOiAKLSAgICB7Ci0gICAgICAgKiguTUlQUy5jb250ZW50LnJvZGF0YSkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmNjRocHBhLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NGhwcGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyOWFkNDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGY2NGhwcGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLUVMRlNJWkU9NjQKLU9VVFBVVF9GT1JNQVQ9ImVsZjY0LWhwcGEiCi1MSUJfUEFUSD0vdXNyL2xpYi9wYTIwXzY0Oi9vcHQvbGFuZ3Rvb2xzL2xpYi9wYTIwXzY0Ci1URVhUX1NUQVJUX0FERFI9MHg0MDAwMDAwMDAwMDAxMDAwCi1EQVRBX0FERFI9MHg4MDAwMDAwMDAwMDAxMDAwCi0KLSMgVGhlIEhQIGR5bmFtaWMgbGlua2VyIGFjdHVhbGx5IHJlcXVpcmVzIHlvdSBzZXQgdGhlIHN0YXJ0IG9mIHRleHQgYW5kCi0jIGRhdGEgdG8gc29tZSByZWFzb25hYmxlIHZhbHVlLiAgT2YgY291cnNlIG5vYm9keSBrbm93cyB3aGF0IHJlYXNvYW5ibGUKLSMgcmVhbGx5IGlzLCBzbyB3ZSBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZXMgdGhhdCBIUCdzIGxpbmtlciB1c2VzLgotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NDAwMDAwMDAwMDAwMTAwMAotU0hMSUJfREFUQV9BRERSPTB4ODAwMDAwMDAwMDAwMTAwMAotCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLU1BWFBBR0VTSVpFPTQwOTYKLUFSQ0g9aHBwYQotTUFDSElORT1ocHBhMi4wdwotRU5UUlk9Im1haW4iCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0jIFdlIHJlYWxseSB3YW50IG11bHRpcGxlIC5zdHViIHNlY3Rpb25zLCBvbmUgZm9yIGVhY2ggaW5wdXQgLnRleHQgc2VjdGlvbiwKLSMgYnV0IGZvciBub3cgdGhpcyBpcyBnb29kIGVub3VnaC4KLU9USEVSX1JFQURPTkxZX1NFQ1RJT05TPScuUEFSSVNDLnVud2luZCA6IHsgKiguUEFSSVNDLnVud2luZCkgfSAnCi0KLSMgVGhlIFBBNjQgRUxGIHBvcnQgdHJlYXRzIC5wbHQgc2VjdGlvbnMgZGlmZmVyZW50bHkgdGhhbiBtb3N0LiAgV2UgYWxzbyBoYXZlCi0jIHRvIGNyZWF0ZSBhIC5vcGQgc2VjdGlvbi4gIFdoYXQgbW9zdCBzeXN0ZW1zIGNhbGwgdGhlIC5nb3QsIHdlIGNhbGwgdGhlIC5kbHQKLU9USEVSX1JFQURXUklURV9TRUNUSU9OUz0nLm9wZCA6IHsgKigub3BkKSB9IFBST1ZJREUgKF9fZ3AgPSAuKTsgLnBsdCA6IHsgKigucGx0KSB9IC5kbHQgOiB7ICooLmRsdCkgfScKLQotIyBUaGUgUEE2NCBFTEYgcG9ydCBoYXMgdHdvIGFkZGl0aW9uYWwgYnNzIHNlY3Rpb25zLiBodWdlIGJzcyBhbmQgdGhyZWFkIGJzcy4KLSMgTWFrZSBzdXJlIHRoZXkgZW5kIHVwIGluIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbi4gIFdlIGFsc28gaGF2ZSB0byBzZXQKLSMgX19UTFNfU0laRSB0byB0aGUgc2l6ZSBvZiB0aGUgdGhyZWFkIGJzcyBzZWN0aW9uLgotT1RIRVJfQlNTX1NFQ1RJT05TPScuaGJzcyA6IHsgKiguaGJzcykgfSAudGJzcyA6IHsgKigudGJzcykgfScKLSNPVEhFUl9CU1NfRU5EX1NZTUJPTFM9J1BST1ZJREUgKF9fVExTX1NJWkUgPSBTSVpFT0YgKC50YnNzKSk7JwotT1RIRVJfQlNTX0VORF9TWU1CT0xTPSdQUk9WSURFIChfX1RMU19TSVpFID0gMCk7JwotCi0jIEhQcyB1c2UgLmRsdCB3aGVyZSBzeXN0ZW1zIHVzZSAuZ290LiAgU2lnaC4KLU9USEVSX0dPVF9SRUxPQ19TRUNUSU9OUz0nLnJlbGEuZGx0IDogeyAqKC5yZWxhLmRsdCkgfScKLQotIyBXZSdyZSBub3QgYWN0dWFsbHkgcHJvdmlkaW5nIGEgc3ltYm9sIGFueW1vcmUgKGR1ZSB0byB0aGUgaW5hYmlsaXR5IHRvIGJlCi0jIHNhZmUgaW4gcmVnYXJkcyB0byBzaGFyZWQgbGlicmFyaWVzKS4gU28gd2UganVzdCBhbGxvY2F0ZSB0aGUgaHVuayBvZiBzcGFjZQotIyB1bmNvbmRpdGlvbmFsbHksIGJ1dCBkbyBub3QgbWVzcyBhcm91bmQgd2l0aCB0aGUgc3ltYm9sIHRhYmxlLgotREFUQV9TVEFSVF9TWU1CT0xTPScuICs9IDE2OycKLQotIyBUaGUgbGlua2VyIGlzIHJlcXVpcmVkIHRvIGRlZmluZSB0aGVzZSB0d28gc3ltYm9scy4KLUVYRUNVVEFCTEVfU1lNQk9MUz0nUFJPVklERSAoX19TWVNURU1fSUQgPSAweDIxNCk7IFBST1ZJREUgKF9GUFVfU1RBVFVTID0gMHgwKTsnCi1EQVRBX1BMVD0KLQotIyAuZHluYW1pYyBzaG91bGQgYmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSAudGV4dCBzZWdtZW50LgotVEVYVF9EWU5BTUlDPQotCi0jIFRoZSBQQTY0IEVMRiBwb3J0IG5lZWRzIHR3byBhZGRpdGlvbmFsIGluaXRpYWxpemVyIHNlY3Rpb25zIGFuZCBhbHNvIHdhbnRzCi0jIGEgc3RhcnQvZW5kIHN5bWJvbCBwYWlyIGZvciB0aGUgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zLgotSU5JVF9TVEFSVD0nS0VFUCAoKiguSFAuaW5pdCkpOyBQUk9WSURFIChfX3ByZWluaXRfc3RhcnQgPSAuKTsgS0VFUCAoKigucHJlaW5pdCkpOyBQUk9WSURFIChfX3ByZWluaXRfZW5kID0gLik7IFBST1ZJREUgKF9faW5pdF9zdGFydCA9IC4pOycKLUlOSVRfRU5EPSdQUk9WSURFIChfX2luaXRfZW5kID0gLik7JwotRklOSV9TVEFSVD0nUFJPVklERSAoX19maW5pX3N0YXJ0ID0gLik7JwotRklOSV9FTkQ9J1BST1ZJREUgKF9fZmluaV9lbmQgPSAuKTsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZl9pMzg2LnNoIGIvbGQvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmNTY3Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZl9pMzg2LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MDgwNDgwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDgwNDgwMDAKLUFSQ0g9aTM4NgotTUFDSElORT0KLU5PUD0weDkwOTAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2ggYi9sZC9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc3YTA2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotI1NITElCX1RFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1BUkNIPWkzODYKLU1BQ0hJTkU9Ci1OT1A9MHg5MDkwCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2dsZDk2MC5zaCBiL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjgxYTc4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1pOTYwCi1PVVRQVVRfRk9STUFUPSIiCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9aTk2MAotVEVNUExBVEVfTkFNRT1nbGQ5NjAKLUdMRF9TVFlMRT0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjAyMjAuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotU0NSSVBUX05BTUU9aTk2MAotT1VUUFVUX0ZPUk1BVD0iIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPWk5NjAKLVRFTVBMQVRFX05BTUU9Z2xkOTYwYwotR0xEX1NUWUxFPTEKLUNPRkZfQ1RPUlM9JwotCV9fX0NUT1JfTElTVF9fID0gLjsKLQlMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpCi0JKiguY3RvcnMpCi0JTE9ORygwKQotCV9fX0NUT1JfRU5EX18gPSAuOwotCV9fX0RUT1JfTElTVF9fID0gLjsKLQlMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpCi0JKiguZHRvcnMpCi0JTE9ORygwKQotCV9fX0RUT1JfRU5EX18gPSAuOwotJwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZWIzYzQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDgzMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDgzMDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODMwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMGguc2ggYi9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiNzk0ZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDgzMDBoCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4MzAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDgzMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDgzMDBzLnNoIGIvbGQvZW11bHBhcmFtcy9oODMwMHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2I0ZjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODMwMHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4MzAwcwotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0Y2E4MC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwYi5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQzZmVlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMGIKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODUwMGMuc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwYTA2NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDg1MDBjCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBtLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMG0uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOWY3YjYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMG0uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwbQotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwcy5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWUyOTRhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMHMKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9ocDMwMGJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvaHAzMDBic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNWM1MGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9ocDMwMGJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaHAzMDBic2QiCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaCBiL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiYWRkOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2hwM2hwdXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWhwMzAwaHB1eCIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLUFSQ0g9bTY4awotU1RBQ0taRVJPPSJfX19zdGFja196ZXJvID0gMHgyMDAwOyBfX0RZTkFNSUMgPSAwOyIKLSMgVGhpcyBpcyBuZWVkZWQgZm9yIEhQVVggOS4wOyBpdCBpcyB1bm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgZm9yIDguMC4KLVNITElCX1BBVEg9Il9fX2RsZF9zaGxpYl9wYXRoID0gMDsiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2hwcGFlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2hwcGFlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Yjg5ZWEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9ocHBhZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1ocHBhZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1ocHBhIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPWhwcGEKLVNUQVJUPSIkU1RBUlQkIgotVEVNUExBVEVfTkFNRT1ocHBhZWxmCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZhb3V0LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2YW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5ZTU1NC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZhb3V0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2IgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZiZW9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjlkYTVmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUFSQ0g9aTM4NgotU0NSSVBUX05BTUU9aTM4NmJlb3MKLU9VVFBVVF9GT1JNQVQ9InBlaS1pMzg2IgotUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9InBlLWkzODYiCi1URU1QTEFURV9OQU1FPWJlb3MKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjMGUyZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtYnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDE3YjdkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWkzODZjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2Z28zMi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmMTZjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1pMzg2Z28zMgotT1VUUFVUX0ZPUk1BVD0iY29mZi1nbzMyIgotVEVYVF9TVEFSVF9BRERSPTB4MTBhOAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVNFR01FTlRfU0laRT0weDIwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1pMzg2Ci0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTY0MjIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtbGludXgiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTAKLUFSQ0g9aTM4NgotVEVNUExBVEVfTkFNRT1saW51eApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bHlueC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGMxNzUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bHlueC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4Nmx5bngKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaTM4Ni1seW54IgotIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KLUVOVFJZPV9tYWluCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cwotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtYWNoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NiMjc2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW1hY2gzIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1TRUdNRU5UX1NJWkU9MHgxMDAwCi1QQURfVEVYVD10Ci1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtb3NzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWUwZTA1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgwMDAwMjAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwMDAwMjAwMAotQVJDSD1pMzg2Ci1NQUNISU5FPQotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxMWZhMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4Nm1zZG9zCi1PVVRQVVRfRk9STUFUPSJtc2RvcyIKLVRFWFRfU1RBUlRfQUREUj0weDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLVNFR01FTlRfU0laRT0weDEwCi1QQURfVEVYVD10Ci1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggYi9sZC9lbXVscGFyYW1zL2kzODZuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU2YTM4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9aTM4NgotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm53LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bncuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MGVkNjcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bncuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPW53Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MDgwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDgwMDAwMDAKLUFSQ0g9aTM4NgotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2cGUuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhZGQyMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZwZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQVJDSD1pMzg2Ci1TQ1JJUFRfTkFNRT1wZQotT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCi1SRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfbWFpbkNSVFN0YXJ0dXAiCi1TVUJTWVNURU09UEVfREVGX1NVQlNZU1RFTQotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2cGVfcG9zaXguc2ggYi9sZC9lbXVscGFyYW1zL2kzODZwZV9wb3NpeC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmNTFiNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZwZV9wb3NpeC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQVJDSD1pMzg2Ci1TQ1JJUFRfTkFNRT1wZQotT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCi1SRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfX19Qb3NpeFByb2Nlc3NTdGFydHVwIgotU1VCU1lTVEVNPTcKLUVYRUNVVEFCTEVfTkFNRT1hLm91dAotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9sbms5NjAuc2ggYi9sZC9lbXVscGFyYW1zL2xuazk2MC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmM2ZjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2xuazk2MC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9aTk2MAotT1VUUFVUX0ZPUk1BVD0iIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPWk5NjAKLVRFTVBMQVRFX05BTUU9bG5rOTYwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2ggYi9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzcwNWEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tMzJyZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbTMyciIKLVRFWFRfU1RBUlRfQUREUj0weDEwMAotQVJDSD1tMzJyCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MzIKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiBzaW11bGF0b3IgbWVtb3J5ICg4TUIpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nUFJPVklERSAoX3N0YWNrID0gMHg4MDAwMDApOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjMjRjMGUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1tNjhrNGstbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bTY4awotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggYi9sZC9lbXVscGFyYW1zL202OGthb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZhYWY3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXplcm8tYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLVNFR01FTlRfU0laRT0weDIwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllODZjYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGthdXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPW02OGthdXgKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ay1hdXgiCi1TRUdNRU5UX1NJWkU9MHg0MDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0iJFNFR01FTlRfU0laRSArIFNJWkVPRl9IRUFERVJTIgotTk9OX1BBR0VEX1RFWFRfU1RBUlRfQUREUj1TSVpFT0ZfSEVBREVSUwotREFUQV9BTElHTk1FTlRfPSIoLiAmICgtJFNFR01FTlRfU0laRSB8ICRUQVJHRVRfUEFHRV9TSVpFLTEpKSArICRTRUdNRU5UX1NJWkUiCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2ggYi9sZC9lbXVscGFyYW1zL202OGtjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3YzBkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPW02OGtjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtlbGYuc2ggYi9sZC9lbXVscGFyYW1zL202OGtlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzUyYzUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tNjhrIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MjAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPSR7VEVYVF9TVEFSVF9BRERSfQotQVJDSD1tNjhrCi1NQUNISU5FPQotTk9QPTB4NGU3NQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrbGludXguc2ggYi9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjM2RhZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbTY4ay1saW51eCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1tNjhrCi1URU1QTEFURV9OQU1FPWxpbnV4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtseW54LnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrbHlueC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyMGZlYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtseW54LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1tNjhrbHlueAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrLWx5bngiCi0jIFRoaXMgaXMgd2hhdCBMeW54T1MgL2xpYi9pbml0MS5vIHdhbnRzLgotRU5UUlk9X19tYWluCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cwotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL202OGtuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQyODA3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW02OGstbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLUFSQ0g9bTY4awotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggYi9sZC9lbXVscGFyYW1zL202OGtwc29zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGViOGNhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPXBzb3MKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHgyMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1BUkNIPW02OGsKLVRFTVBMQVRFX05BTUU9ZWxmMzIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaCBiL2xkL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NzM3Yy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL204OGtiY3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPW04OGtiY3MKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTg4a2JjcyIKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD1tODhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2ggYi9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTllMDIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tY29yZXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BUkNIPW1jb3JlCi1TQ1JJUFRfTkFNRT1tY29yZXBlCi1PVVRQVVRfRk9STUFUPSJwZWktbWNvcmUtbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9InBlaS1tY29yZS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0icGVpLW1jb3JlLWJpZyIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfbWFpbkNSVFN0YXJ0dXAiCi1TVUJTWVNURU09UEVfREVGX1NVQlNZU1RFTQotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmUyOTUzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2JpZy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNic2Quc2ggYi9sZC9lbXVscGFyYW1zL21pcHNic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZmIzNWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzYnNkCi1PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWJpZyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWxpdHRsZSIKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLVRBUkdFVF9QQUdFX1NJWkU9NDA5NgotQVJDSD1taXBzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNpZHQuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNpZHQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTc2ZjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzaWR0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCi1FTlRSWT1zdGFydAotVEVYVF9TVEFSVF9BRERSPTB4YTAwMTIwMDAKLURBVEFfQUREUj0uCi1URU1QTEFURV9OQU1FPW1pcHNlY29mZgotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNpZHRsLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzaWR0bC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyNzlkZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNpZHRsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCi1FTlRSWT1zdGFydAotVEVYVF9TVEFSVF9BRERSPTB4YTAwMTIwMDAKLURBVEFfQUREUj0uCi1URU1QTEFURV9OQU1FPW1pcHNlY29mZgotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjIzNDQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzbGl0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmI5MWMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bWlwcwotVEVYVF9TVEFSVF9BRERSPTB4ODAwODAwMDAKLURBVEFfQUREUj0uCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbW4xMDIwMC5zaCBiL2xkL2VtdWxwYXJhbXMvbW4xMDIwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyNDMyMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21uMTAyMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tbjEwMjAwIgotVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1tbjEwMjAwCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MQotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLQotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwotCi0jIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KLSMgWFhYIFRoZXNlIHNob3VsZCBkZWZpbml0ZWx5IGRpc2FwcGVhci4KLUNUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCi1DVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCi1EVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JwotRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tbjEwMzAwLnNoIGIvbGQvZW11bHBhcmFtcy9tbjEwMzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE0MGU1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbW4xMDMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW1uMTAzMDAiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPW1uMTAzMDAKLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0xCi1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCi0KLSMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgotIyBYWFggVGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZGlzYXBwZWFyLgotQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKLUNUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKLURUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCi1EVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL25ld3Muc2ggYi9sZC9lbXVscGFyYW1zL25ld3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGRkZjkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9uZXdzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1uZXdzb3MzIgotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9uczMya25ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGZkZjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9uczMya25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW5zMzJrLW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPW5zMzJrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2ggYi9sZC9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWQwNzkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1wYzUzMi1tYWNoIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0iMHgxMDAyMCIKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1BUkNIPW5zMzJrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BqZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9wamVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmZDJiMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BqZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBqIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1BUkNIPXBqCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BqbGVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvcGpsZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTk1OGZkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcGpsZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBqbCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotQVJDSD1wagpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wcGNtYWNvcy5zaCBiL2xkL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjgwMGMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wcGNtYWNvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVEVNUExBVEVfTkFNRT1haXgKLVNDUklQVF9OQU1FPWFpeAotT1VUUFVUX0ZPUk1BVD0ieGNvZmYtcG93ZXJtYWMiCi1BUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcHBjbncuc2ggYi9sZC9lbXVscGFyYW1zL3BwY253LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2VhZDQzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcHBjbncuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPW53Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1wb3dlcnBjIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLUFSQ0g9cG93ZXJwYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wcGNwZS5zaCBiL2xkL2VtdWxwYXJhbXMvcHBjcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDA5ZWYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wcGNwZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotQVJDSD1wb3dlcnBjCi1TQ1JJUFRfTkFNRT1wcGNwZQotT1VUUFVUX0ZPUk1BVD0icGVpLXBvd2VycGNsZSIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfbWFpbkNSVFN0YXJ0dXAiCi1TVUJTWVNURU09UEVfREVGX1NVQlNZU1RFTQotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9yaXNjaXguc2ggYi9sZC9lbXVscGFyYW1zL3Jpc2NpeC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmNmQ5Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3Jpc2NpeC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9cmlzY2l4Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1yaXNjaXgiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4ODAwMAotQVJDSD1hcm0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2EyOTIwMC5zaCBiL2xkL2VtdWxwYXJhbXMvc2EyOTIwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1MmY5Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NhMjkyMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXNhMjkyMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCi1URVhUX1NUQVJUX0FERFI9MHg0MDAwNDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaC5zaCBiL2xkL2VtdWxwYXJhbXMvc2guc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODQ0ZmIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9c2gKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtc2giCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1zaApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaGVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvc2hlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGI1ODcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zaGVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItc2giCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1NQVhQQUdFU0laRT0xMjgKLUFSQ0g9c2gKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTUJFRERFRD15ZXMKLQotIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCi1FTlRSWT1zdGFydAotQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKLUNUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKLURUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCi1EVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHgzMDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NobC5zaCBiL2xkL2VtdWxwYXJhbXMvc2hsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBhYWM4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2hsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zaAotT1VUUFVUX0ZPUk1BVD0iY29mZi1zaGwiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1zaApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaGxlbGYuc2ggYi9sZC9lbXVscGFyYW1zL3NobGVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyN2Y4Ni4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NobGVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItc2hsIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotTUFYUEFHRVNJWkU9MTI4Ci1BUkNIPXNoCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCi0KLSMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgotRU5UUlk9c3RhcnQKLUNUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCi1DVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCi1EVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JwotRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4MzAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjYW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5YjkyNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NwYXJjYW91dC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgotQklHX09VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJhLm91dC1zcGFyYy1saXR0bGUiCi1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoIGIvbGQvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NiMGJlYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NwYXJjbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXNwYXJjLWxpbnV4IgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCi1BUkNIPXNwYXJjCi1URU1QTEFURV9OQU1FPWxpbnV4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjbHlueC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWViMzBiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zcGFyY2x5bngKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtc3BhcmMtbHlueCIKLSMgVGhpcyBpcyB3aGF0IEx5bnhPUyAvbGliL2luaXQxLm8gd2FudHMuCi1FTlRSWT1fX21haW4KLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9zcGFyY25ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2RhZjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zcGFyY25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXNwYXJjLW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3N0MjAwMC5zaCBiL2xkL2VtdWxwYXJhbXMvc3QyMDAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk4ODMyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3QyMDAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zdDIwMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ayIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3VuMy5zaCBiL2xkL2VtdWxwYXJhbXMvc3VuMy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwZjcxZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3N1bjMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgyMDAwCi1TRUdNRU5UX1NJWkU9MHgyMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotQVJDSD1tNjhrCi1URU1QTEFURV9OQU1FPXN1bm9zCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3N1bjQuc2ggYi9sZC9lbXVscGFyYW1zL3N1bjQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDI3NzUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zdW40LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotQUxJR05NRU5UPTgKLUFSQ0g9c3BhcmMKLVRFTVBMQVRFX05BTUU9c3Vub3MKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoIGIvbGQvZW11bHBhcmFtcy90aWMzMGFvdXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNGMxM2YuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy90aWMzMGFvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXRpYzMwYW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtdGljMzAiCi1PVVRQVVRfQVJDSD0idG1zMzIwYzMwIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9dG1zMzIwYzMwCi1CSUc9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy90aWMzMGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL3RpYzMwY29mZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3Nzk0My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3RpYzMwY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9dGljMzBjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXRpYzMwIgotT1VUUFVUX0FSQ0g9InRtczMyMGMzMCIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXRtczMyMGMzMAotQklHPTEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy90aWM4MGNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzAzMjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy90aWM4MGNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBzb3VyY2VkIGJ5IHRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdC4KLSMgVGhlc2UgYXJlIHNoZWxsIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIGxhdGVyIGJ5IGVpdGhlciBnZW5zY3JpcHRzCi0jIG9yIG9uIG9mIHRoZSBzY3JpcHRzIHRoYXQgaXQgc291cmNlcy4KLQotIyBUaGUgbmFtZSBvZiB0aGUgc2NyaXB0dGVtcGwgc2NyaXB0IHRvIHVzZS4gIEluIHRoaXMgY2FzZSwgZ2Vuc2NyaXB0cwotIyB1c2VzIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYwotIwotU0NSSVBUX05BTUU9dGljODBjb2ZmCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGVtdWx0ZW1wbCBzY3JpcHQgdG8gdXNlLiAgSWYgc2V0IHRvICJ0ZW1wbGF0ZSIgdGhlbgotIyBnZW5zY3JpcHRzLnNoIHdpbGwgdXNlIHRoZSBzY3JpcHQgZW11bHRlbXBsL3RlbXBsYXRlLmVtLiAgSWYgbm90IHNldCwKLSMgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAiZ2VuZXJpYyIuCi0jCi0jIFRFTVBMQVRFX05BTUU9Ci0KLSMgSWYgdGhpcyBpcyBzZXQgdG8gYW4gbm9uZW1wdHkgc3RyaW5nLCBnZW5zY3JpcHRzLnNoIHdpbGwgaW52b2tlIHRoZQotIyBzY3JpcHR0ZW1wbCBzY3JpcHQgYW4gZXh0cmEgdGltZSB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBzY3JpcHQuCi0jCi0jIEdFTkVSQVRFX1NITElCX1NDUklQVD0KLQotIyBUaGUgQkZEIG91dHB1dCBmb3JtYXQgdG8gdXNlLiAgVGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB3aWxsIHVzZSBpdCBpbgotIyBhbiBPVVRQVVRfRk9STUFUIGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0jCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXRpYzgwIgotCi0jIFRoaXMgaXMgbm9ybWFsbHkgc2V0IHRvIGluZGljYXRlIHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlLCBzdWNoIGFzCi0jICJzcGFyYyIuICBUaGUgc2NyaXB0dGVtcGwgc2NyaXB0IHdpbGwgbm9ybWFsbHkgdXNlIGl0IGluIGFuIE9VVFBVVF9BUkNICi0jIGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0jCi1BUkNIPXRpYzgwCi0KLSMgU29tZSBzY3JpcHR0ZW1wbCBzY3JpcHRzIHVzZSB0aGlzIHRvIHNldCB0aGUgZW50cnkgYWRkcmVzcyBpbiBhbiBFTlRSWQotIyBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotIwotIyBFTlRSWT0KLQotIyBUaGUgc2NyaXB0dGVtcGwgc2NyaXB0IHVzZXMgdGhpcyB0byBzZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlCi0jICIudGV4dCIgc2VjdGlvbi4KLSMKLVRFWFRfU1RBUlRfQUREUj0weDIwMDAwMDAKLQotIyBJZiB0aGlzIGlzIGRlZmluZWQsIHRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCBzZXRzIFRFWFRfU1RBUlRfQUREUiB0bwotIyBpdHMgdmFsdWUgYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdHRlbXBsIHNjcmlwdCBmb3IgdGhlIC1uIGFuZCAtTgotIyBvcHRpb25zLgotIwotIyBOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9Ci0KLSMgVGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHVzZXMgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgCi0jIERBVEFfQUxJR05NRU5UIHdoZW4gcnVubmluZyB0aGUgc2NyaXB0dGVtcGwgc2NyaXB0LgotIwotIyBTRUdNRU5UX1NJWkU9Ci0KLSMgSWYgU0VHTUVOVF9TSVpFIGlzIG5vdCBkZWZpbmVkLCB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgdXNlcyB0aGlzCi0jIHRvIGRlZmluZSBpdC4KLSMKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3Y4NTAuc2ggYi9sZC9lbXVscGFyYW1zL3Y4NTAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YmZiZDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy92ODUwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPXY4NTAKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXY4NTAiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKLVpEQVRBX1NUQVJUX0FERFI9MHgxNjAKLVJPWkRBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotU0RBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotUk9TREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1UREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1DQUxMX1RBQkxFX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLUFSQ0g9djg1MAotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92YW5pbGxhLnNoIGIvbGQvZW11bHBhcmFtcy92YW5pbGxhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGEzYjcyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdmFuaWxsYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9dmFuaWxsYQotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPXVua25vd24KLVRFTVBMQVRFX05BTUU9dmFuaWxsYQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92YXguc2ggYi9sZC9lbXVscGFyYW1zL3ZheC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4NTQ4My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3ZheC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQiCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT0xMDI0Ci1BUkNIPXZheApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92c3RhLnNoIGIvbGQvZW11bHBhcmFtcy92c3RhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYyNDliLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdnN0YS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1TRUdNRU5UX1NJWkU9MHg0MDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9aTM4NgotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3c2NS5zaCBiL2xkL2VtdWxwYXJhbXMvdzY1LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjAyYjIzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdzY1LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT13NjUKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtdzY1IgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotVEFSR0VUX1BBR0VfU0laRT02NAotQVJDSD13NjUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvejgwMDEuc2ggYi9sZC9lbXVscGFyYW1zL3o4MDAxLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY0NWMzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvejgwMDEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXo4MDAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXo4ayIKLU9VVFBVVF9BUkNIPSJ6ODAwMSIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXo4awotQklHPTEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvejgwMDIuc2ggYi9sZC9lbXVscGFyYW1zL3o4MDAyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTliNWY1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvejgwMDIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPXo4MDAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXo4ayIKLU9VVFBVVF9BUkNIPSJ6ODAwMiIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXo4MDAyCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvUkVBRE1FIGIvbGQvZW11bHRlbXBsL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlYzBhYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1UaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHNvdXJjZWQgYnkgZ2Vuc2NyaXB0cy5zaCwgYWZ0ZXIKLXNldHRpbmcgc29tZSB2YXJpYWJsZXMgdG8gc3Vic3RpdHV0ZSBpbiwgdG8gcHJvZHVjZQotQyBzb3VyY2UgZmlsZXMgdGhhdCBjb250YWluIGp1bXAgdGFibGVzIGZvciBlYWNoIGVtdWxhdGlvbi4KZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9haXguZW0gYi9sZC9lbXVsdGVtcGwvYWl4LmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ4YWYwLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9haXguZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDU0ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogQUlYIGVtdWxhdGlvbiBjb2RlIGZvciAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIEFJWCBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZyZWUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi0vKiBUaGUgZmlsZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGVhY2ggc2VjdGlvbi4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotCi0vKiBUaGUgbWF4aW11bSBzaXplIHRoZSBzdGFjayBpcyBwZXJtaXR0ZWQgdG8gZ3Jvdy4gIFRoaXMgaXMgc3RvcmVkIGluCi0gICB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heHN0YWNrOwotCi0vKiBUaGUgbWF4aW11bSBkYXRhIHNpemUuICBUaGlzIGlzIHN0b3JlZCBpbiB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heGRhdGE7Ci0KLS8qIFdoZXRoZXIgdG8gcGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotc3RhdGljIGludCBnYyA9IDE7Ci0KLS8qIFRoZSBtb2R1bGUgdHlwZSB0byB1c2UuICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG1vZHR5cGUgPSAoJzEnIDw8IDgpIHwgJ0wnOwotCi0vKiBXaGV0aGVyIHRoZSAudGV4dCBzZWN0aW9uIG11c3QgYmUgcmVhZC1vbmx5IChpLmUuLCBubyByZWxvY3MKLSAgIHBlcm1pdHRlZCkuICAqLwotc3RhdGljIGludCB0ZXh0cm87Ci0KLS8qIFdoZXRoZXIgdG8gaW1wbGVtZW50IFVuaXggbGlrZSBsaW5rZXIgc2VtYW50aWNzLiAgKi8KLXN0YXRpYyBpbnQgdW5peF9sZDsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbXBvcnQgZmlsZSBsaXN0LiAgKi8KLQotc3RydWN0IGZpbGVsaXN0Ci17Ci0gIHN0cnVjdCBmaWxlbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLS8qIExpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmlsZWxpc3QgKmltcG9ydF9maWxlczsKLQotLyogTGlzdCBvZiBleHBvcnQgc3ltYm9scyByZWFkIGZyb20gdGhlIGV4cG9ydCBmaWxlcy4gICovCi0KLXN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QKLXsKLSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYm9vbGVhbiBzeXNjYWxsOwotfTsKLQotc3RhdGljIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKmV4cG9ydF9zeW1ib2xzOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGRvbmUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi0gIGNvbmZpZy5oYXNfc2hhcmVkID0gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIEFJWCBzcGVjaWZpYyBvcHRpb25zLiAgKi8KLQotc3RhdGljIGludAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCBpbmR4OwotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGxvbmcgdmFsOwotICBjaGFyICplbmQ7Ci0KLSNkZWZpbmUgT1BUSU9OX0lHTk9SRSAoMzAwKQotI2RlZmluZSBPUFRJT05fQVVUT0lNUCAoT1BUSU9OX0lHTk9SRSArIDEpCi0jZGVmaW5lIE9QVElPTl9FUk5PVE9LIChPUFRJT05fQVVUT0lNUCArIDEpCi0jZGVmaW5lIE9QVElPTl9FUk9LIChPUFRJT05fRVJOT1RPSyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlQgKE9QVElPTl9FUk9LICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNUE9SVCAoT1BUSU9OX0VYUE9SVCArIDEpCi0jZGVmaW5lIE9QVElPTl9MT0FETUFQIChPUFRJT05fSU1QT1JUICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BWERBVEEgKE9QVElPTl9MT0FETUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BWFNUQUNLIChPUFRJT05fTUFYREFUQSArIDEpCi0jZGVmaW5lIE9QVElPTl9NT0RUWVBFIChPUFRJT05fTUFYU1RBQ0sgKyAxKQotI2RlZmluZSBPUFRJT05fTk9BVVRPSU1QIChPUFRJT05fTU9EVFlQRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT1NUUkNNUENUIChPUFRJT05fTk9BVVRPSU1QICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BEIChPUFRJT05fTk9TVFJDTVBDVCArIDEpCi0jZGVmaW5lIE9QVElPTl9QVCAoT1BUSU9OX1BEICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUUkNNUENUIChPUFRJT05fUFQgKyAxKQotI2RlZmluZSBPUFRJT05fVU5JWCAoT1BUSU9OX1NUUkNNUENUICsgMSkKLQotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0gewotICAgIHsiYmFzaXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiYXV0b2ltcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVVUT0lNUH0sCi0gICAgeyJiY29tcHJsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJjcmxkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmNyb3IzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhEQVRBfSwKLSAgICB7ImJFIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAotICAgIHsiYmVybm90b2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAotICAgIHsiYmVyb2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VST0t9LAotICAgIHsiYmVycm1zZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJleHBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVH0sCi0gICAgeyJiZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJOT1RPS30sCi0gICAgeyJiZ2MiLCBub19hcmd1bWVudCwgJmdjLCAxfSwKLSAgICB7ImJoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmhhbHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiSSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QT1JUfSwKLSAgICB7ImJpbXBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCi0gICAgeyJibCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCi0gICAgeyJibG9hZG1hcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCi0gICAgeyJibWF4ZGF0YSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCi0gICAgeyJibWF4c3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWFNUQUNLfSwKLSAgICB7ImJNIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKLSAgICB7ImJtb2R0eXBlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKLSAgICB7ImJub2F1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJibm9kZWxjc2VjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJub2VudHJ5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYm5vZ2MiLCBub19hcmd1bWVudCwgJmdjLCAwfSwKLSAgICB7ImJuc28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJibm9zdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9TVFJDTVBDVH0sCi0gICAgeyJibm90ZXh0cm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMH0sCi0gICAgeyJibnJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAotICAgIHsiYnBEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QRH0sCi0gICAgeyJicFQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BUfSwKLSAgICB7ImJybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKLSAgICB7ImJTIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCi0gICAgeyJic28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAotICAgIHsiYnN0cmNtcGN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVFJDTVBDVH0sCi0gICAgeyJidGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDF9LAotICAgIHsic3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsidW5peCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVU5JWH0sCi0gICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotICB9OwotCi0gIC8qIE9wdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBBSVggbGlua2VyIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0OiAtZiwKLSAgICAgLVMsIC12LCAtWiwgLWJiaW5kY21kcywgLWJiaW5kZXIsIC1iYmluZG9wdHMsIC1iY2FsbHMsIC1iY2FwcywKLSAgICAgLWJjcm9yMTUsIC1iZGVidWdvcHQsIC1iZGJnLCAtYmRlbGNzZWN0LCAtYmV4PywgLWJmaWxlbGlzdCwgLWJmbCwKLSAgICAgLWJnY2J5cGFzcywgLWJnbGluaywgLWJpbnNlcnQsIC1iaSwgLWJsb2FkbWFwLCAtYmwsIC1ibWFwLCAtYm5sLAotICAgICAtYm5vYmluZCwgLWJub2NvbXBybGQsIC1ibm9jcmxkLCAtYm5vZXJybXNnLCAtYm5vZ2xpbmssCi0gICAgIC1ibm9sb2FkbWFwLCAtYm5sLCAtYm5vb2JqcmVvcmRlciwgLWJub3F1aWV0LCAtYm5vcmVvcmRlciwKLSAgICAgLWJub3R5cGNoaywgLWJub3gsIC1icXVpZXQsIC1iUiwgLWJyZW5hbWUsIC1icmVvcmRlciwgLWJ0eXBjaGssCi0gICAgIC1ieCwgLWJYLCAtYnhyZWYuICAqLwotCi0gIC8qIElmIHRoZSBjdXJyZW50IG9wdGlvbiBzdGFydHMgd2l0aCAtYiwgY2hhbmdlIHRoZSBmaXJzdCA6IHRvIGFuID0uCi0gICAgIFRoZSBBSVggbGlua2VyIHVzZXMgOiB0byBzZXBhcmF0ZSB0aGUgb3B0aW9uIGZyb20gdGhlIGFyZ3VtZW50OwotICAgICBjaGFuZ2luZyBpdCB0byA9IGxldHMgdXMgdHJlYXQgaXQgYXMgYSBnZXRvcHQgb3B0aW9uLiAgKi8KLSAgaW5keCA9IG9wdGluZDsKLSAgaWYgKGluZHggPT0gMCkKLSAgICBpbmR4ID0gMTsKLSAgaWYgKGluZHggPCBhcmdjICYmIHN0cm5jbXAgKGFyZ3ZbaW5keF0sICItYiIsIDIpID09IDApCi0gICAgewotICAgICAgY2hhciAqczsKLQotICAgICAgZm9yIChzID0gYXJndltpbmR4XTsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgqcyA9PSAnOicpCi0JICAgIHsKLQkgICAgICAqcyA9ICc9JzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV2UgYWRkIHMgYW5kIHUgc28gdG8gdGhlIHNob3J0IG9wdGlvbnMgbGlzdCBzbyB0aGF0IC1zIGFuZCAtdSBvbgotICAgICB0aGUgY29tbWFuZCBsaW5lIGRvIG5vdCBtYXRjaCAtc3RhdGljIGFuZCAtdW5peC4gICovCi0KLSAgb3B0ZXJyID0gMDsKLSAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItRDpIOktUOnpzdSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICd1JzoKLSAgICBkZWZhdWx0OgotICAgICAgb3B0aW5kID0gcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAwOgotICAgICAgLyogTG9uZyBvcHRpb24gd2hpY2gganVzdCBzZXRzIGEgZmxhZy4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgdmFsID0gc3RydG9sIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1EIG51bWJlciAlc1xuIiwgb3B0YXJnKTsKLSAgICAgIGVsc2UgaWYgKHZhbCAhPSAtMSkKLQlsYW5nX3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIGV4cF9pbnRvcCAodmFsKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcKLQkgIHx8ICh2YWwgJiAodmFsIC0gMSkpICE9IDApCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtSCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JZmlsZV9hbGlnbiA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSyc6Ci0gICAgY2FzZSAneic6Ci0gICAgICAvKiBGSVhNRTogVGhpcyBzaG91bGQgdXNlIHRoZSBwYWdlIHNpemUgZm9yIHRoZSB0YXJnZXQgc3lzdGVtLiAgKi8KLSAgICAgIGZpbGVfYWxpZ24gPSA0MDk2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIC8qIE9uIEFJWCB0aGlzIGlzIHRoZSBzYW1lIGFzIEdOVSBsZCAtVHRleHQuICBXaGVuIHdlIHNlZSAtVAotICAgICAgICAgbnVtYmVyLCB3ZSBhc3N1bWUgdGhlIEFJWCBvcHRpb24gaXMgaW50ZW5kZWQuICBPdGhlcndpc2UsIHdlCi0gICAgICAgICBhc3N1bWUgdGhlIHVzdWFsIEdOVSBsZCAtVCBvcHRpb24gaXMgaW50ZW5kZWQuICBXZSBjYW4ndCBqdXN0Ci0gICAgICAgICBpZ25vcmUgdGhlIEFJWCBvcHRpb24sIGJlY2F1c2UgZ2NjIHBhc3NlcyBpdCB0byB0aGUgbGlua2VyLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCXsKLQkgIG9wdGluZCA9IHByZXZvcHRpbmQ7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIudGV4dCIsIGV4cF9pbnRvcCAodmFsKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0lHTk9SRToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQVVUT0lNUDoKLSAgICAgIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FUk5PVE9LOgotICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VST0s6Ci0gICAgICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FWFBPUlQ6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUgKG9wdGFyZywgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9JTVBPUlQ6Ci0gICAgICB7Ci0Jc3RydWN0IGZpbGVsaXN0ICpuOwotCXN0cnVjdCBmaWxlbGlzdCAqKmZscHA7Ci0KLQluID0gKHN0cnVjdCBmaWxlbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbGlzdCkpOwotCW4tPm5leHQgPSBOVUxMOwotCW4tPm5hbWUgPSBvcHRhcmc7Ci0JZmxwcCA9ICZpbXBvcnRfZmlsZXM7Ci0Jd2hpbGUgKCpmbHBwICE9IE5VTEwpCi0JICBmbHBwID0gJigqZmxwcCktPm5leHQ7Ci0JKmZscHAgPSBuOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9MT0FETUFQOgotICAgICAgY29uZmlnLm1hcF9maWxlbmFtZSA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUFYREFUQToKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhkYXRhIG51bWJlciAlc1xuIiwKLQkgICAgICAgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltYXhkYXRhID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NQVhTVEFDSzoKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhzdGFjayBudW1iZXIgJXNcbiIsCi0JICAgICAgIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbWF4c3RhY2sgPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01PRFRZUEU6Ci0gICAgICBpZiAoKm9wdGFyZyA9PSAnUycpCi0JewotCSAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7Ci0JICArK29wdGFyZzsKLQl9Ci0gICAgICBpZiAoKm9wdGFyZyA9PSAnXDAnIHx8IG9wdGFyZ1sxXSA9PSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgbW9kdWxlIHR5cGUgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbW9kdHlwZSA9ICgqb3B0YXJnIDw8IDgpIHwgb3B0YXJnWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT0FVVE9JTVA6Ci0gICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT1NUUkNNUENUOgotICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BEOgotICAgICAgLyogVGhpcyBzZXRzIHRoZSBwYWdlIHRoYXQgdGhlIC5kYXRhIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8KLSAgICAgICAgIHN0YXJ0IG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZQotICAgICAgICAgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSwgc28gd2UgbmVlZCB0byBidWlsZCBhbiBhcHByb3ByaWF0ZQotICAgICAgICAgZXhwcmVzc2lvbi4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wRCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JewotCSAgZXRyZWVfdHlwZSAqdDsKLQotCSAgdCA9IGV4cF9iaW5vcCAoJysnLAotCQkJIGV4cF9pbnRvcCAodmFsKSwKLQkJCSBleHBfYmlub3AgKCcmJywKLQkJCQkgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSwKLQkJCQkgICAgZXhwX2ludG9wICgweGZmZikpKTsKLQkgIHQgPSBleHBfYmlub3AgKCcmJywKLQkJCSBleHBfYmlub3AgKCcrJywgdCwgZXhwX2ludG9wICgzMSkpLAotCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgMzEpKTsKLQkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgdCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QVDoKLSAgICAgIC8qIFRoaXMgc2V0IHRoZSBwYWdlIHRoYXQgdGhlIC50ZXh0IHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gc3RhcnQKLSAgICAgICAgIG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZSBvZmZzZXQKLSAgICAgICAgIHdpdGhpbiB0aGUgZmlsZS4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wVCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JewotCSAgZXRyZWVfdHlwZSAqdDsKLQotCSAgdCA9IGV4cF9iaW5vcCAoJysnLAotCQkJIGV4cF9pbnRvcCAodmFsKSwKLQkJCSBleHBfbmFtZW9wIChTSVpFT0ZfSEVBREVSUywgTlVMTCkpOwotCSAgdCA9IGV4cF9iaW5vcCAoJyYnLAotCQkJIGV4cF9iaW5vcCAoJysnLCB0LCBleHBfaW50b3AgKDMxKSksCi0JCQkgZXhwX2ludG9wICh+IChiZmRfdm1hKSAzMSkpOwotCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCB0KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1NUUkNNUENUOgotICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9VTklYOgotICAgICAgdW5peF9sZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBjYW4gbm90IGJlIHJlY29nbml6ZWQgYXMgYSBCRkQKLSAgIG9iamVjdCBvciBhbiBhcmNoaXZlLiAgSWYgdGhlIGZpbGUgc3RhcnRzIHdpdGggIyEsIHdlIG11c3QgdHJlYXQgaXQKLSAgIGFzIGFuIGltcG9ydCBmaWxlLiAgVGhpcyBpcyBmb3IgQUlYIGNvbXBhdGliaWxpdHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgRklMRSAqZTsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgZSA9IGZvcGVuIChlbnRyeS0+ZmlsZW5hbWUsIEZPUEVOX1JUKTsKLSAgaWYgKGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0ID0gZmFsc2U7Ci0KLSAgaWYgKGdldGMgKGUpID09ICcjJyAmJiBnZXRjIChlKSA9PSAnIScpCi0gICAgewotICAgICAgc3RydWN0IGZpbGVsaXN0ICpuOwotICAgICAgc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKLQotICAgICAgbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKLSAgICAgIG4tPm5leHQgPSBOVUxMOwotICAgICAgbi0+bmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKLSAgICAgIGZscHAgPSAmaW1wb3J0X2ZpbGVzOwotICAgICAgd2hpbGUgKCpmbHBwICE9IE5VTEwpCi0JZmxwcCA9ICYoKmZscHApLT5uZXh0OwotICAgICAgKmZscHAgPSBuOwotCi0gICAgICByZXQgPSB0cnVlOwotICAgICAgZW50cnktPmxvYWRlZCA9IHRydWU7Ci0gICAgfQotCi0gIGZjbG9zZSAoZSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBib29sZWFuIHI7Ci0gIHN0cnVjdCBzZXRfaW5mbyAqcDsKLQotICAvKiBDYWxsIGxkY3Rvcl9idWlsZF9zZXRzLCBhZnRlciBwcmV0ZW5kaW5nIHRoYXQgdGhpcyBpcyBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG8gdGhpcyBiZWNhdXNlIEFJWCByZXF1aXJlcyByZWxvY2F0aW9uCi0gICAgIGVudHJpZXMgZm9yIGFsbCByZWZlcmVuY2VzIHRvIHN5bWJvbHMsIGV2ZW4gaW4gYSBmaW5hbAotICAgICBleGVjdXRhYmxlLiAgT2YgY291cnNlLCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpZiB3ZSBhcmUKLSAgICAgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlLiAgKi8KLSAgciA9IGxpbmtfaW5mby5yZWxvY2F0ZWFibGU7Ci0gIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgInhjb2ZmIikgIT0gTlVMTCkKLSAgICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgbGRjdG9yX2J1aWxkX3NldHMgKCk7Ci0gIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSByOwotCi0gIC8qIEZvciBlYWNoIHNldCwgcmVjb3JkIHRoZSBzaXplLCBzbyB0aGF0IHRoZSBYQ09GRiBiYWNrZW5kIGNhbgotICAgICBvdXRwdXQgdGhlIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KLSAgZm9yIChwID0gc2V0czsgcCAhPSAoc3RydWN0IHNldF9pbmZvICopIE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQotCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbwotCSBub3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQljb250aW51ZTsKLQotICAgICAgaWYgKHAtPnJlbG9jICE9IEJGRF9SRUxPQ19DVE9SKQotCXsKLQkgIC8qIEhhbmRsZSB0aGlzIGlmIHdlIG5lZWQgdG8uICAqLwotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBzaXplID0gKHAtPmNvdW50ICsgMikgKiA0OwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcC0+aCwgc2l6ZSkpCi0JZWluZm8gKCIlRiVQOiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0IGZhaWxlZDogJUVcbiIpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBzdHJ1Y3QgZmlsZWxpc3QgKmZsOwotICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICplbDsKLSAgY2hhciAqbGlicGF0aDsKLSAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07Ci0gIGludCBpOwotCi0gIC8qIEhhbmRsZSB0aGUgaW1wb3J0IGFuZCBleHBvcnQgZmlsZXMsIGlmIGFueS4gICovCi0gIGZvciAoZmwgPSBpbXBvcnRfZmlsZXM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlIChmbC0+bmFtZSwgdHJ1ZSk7Ci0gIGZvciAoZWwgPSBleHBvcnRfc3ltYm9sczsgZWwgIT0gTlVMTDsgZWwgPSBlbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZWwtPm5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQllaW5mbyAoIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIG9mIGV4cG9ydCBzeW1ib2wgZmFpbGVkOiAlRVxuIik7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwgZWwtPnN5c2NhbGwpKQotCWVpbmZvICgiJVAlRjogYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgZmFpbGVkOiAlRVxuIik7Ci0gICAgfQotCi0gIC8qIFRyYWNrIGRvd24gYWxsIHJlbG9jYXRpb25zIGNhbGxlZCBmb3IgYnkgdGhlIGxpbmtlciBzY3JpcHQgKHRoZXNlCi0gICAgIGFyZSB0eXBpY2FsbHkgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBlbnRyaWVzIGNyZWF0ZWQgYnkKLSAgICAgQ09OU1RSVUNUT1JTKSBhbmQgbGV0IHRoZSBiYWNrZW5kIGtub3cgaXQgd2lsbCBuZWVkIHRvIGNyZWF0ZQotICAgICAubG9hZGVyIHJlbG9jcyBmb3IgdGhlbS4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcyk7Ci0KLSAgLyogV2UgbmVlZCB0byBidWlsZCBMSUJQQVRIIGZyb20gdGhlIC1MIGFyZ3VtZW50cy4gIElmIGFueSAtcnBhdGgKLSAgICAgYXJndW1lbnRzIHdlcmUgdXNlZCwgdGhvdWdoLCB3ZSB1c2UgLXJwYXRoIGluc3RlYWQsIGFzIGEgR05VCi0gICAgIGV4dGVuc2lvbi4gICovCi0gIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLSAgICBsaWJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBlbHNlIGlmIChzZWFyY2hfaGVhZCA9PSBOVUxMKQotICAgIGxpYnBhdGggPSAoY2hhciAqKSAiIjsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoc2VhcmNoX2hlYWQtPm5hbWUpOwotICAgICAgbGlicGF0aCA9IHhtYWxsb2MgKGxlbiArIDEpOwotICAgICAgc3RyY3B5IChsaWJwYXRoLCBzZWFyY2hfaGVhZC0+bmFtZSk7Ci0gICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkLT5uZXh0OyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCXsKLQkgIHNpemVfdCBubGVuOwotCi0JICBubGVuID0gc3RybGVuIChzZWFyY2gtPm5hbWUpOwotCSAgbGlicGF0aCA9IHhyZWFsbG9jIChsaWJwYXRoLCBsZW4gKyBubGVuICsgMik7Ci0JICBsaWJwYXRoW2xlbl0gPSAnOic7Ci0JICBzdHJjcHkgKGxpYnBhdGggKyBsZW4gKyAxLCBzZWFyY2gtPm5hbWUpOwotCSAgbGVuICs9IG5sZW4gKyAxOwotCX0KLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBYQ09GRiBiYWNrZW5kIHNldCB1cCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgbGlicGF0aCwKLQkJCQkJIGVudHJ5X3N5bWJvbCwgZmlsZV9hbGlnbiwKLQkJCQkJIG1heHN0YWNrLCBtYXhkYXRhLAotCQkJCQkgZ2MgJiYgISB1bml4X2xkID8gdHJ1ZSA6IGZhbHNlLAotCQkJCQkgbW9kdHlwZSwKLQkJCQkJIHRleHRybyA/IHRydWUgOiBmYWxzZSwKLQkJCQkJIHVuaXhfbGQsCi0JCQkJCSBzcGVjaWFsX3NlY3Rpb25zKSkKLSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzcGVjaWFsIHNlY3Rpb25zLCBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlIGluIHRoZSBsaW5rIG9yZGVyaW5nLiAgVGhpcyBpcyBlc3BlY2lhbGx5IG1hZ2ljLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcGxzOwotICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmlzOwotICAgICAgY29uc3QgY2hhciAqb25hbWU7Ci0gICAgICBib29sZWFuIHN0YXJ0OwotCi0gICAgICBzZWMgPSBzcGVjaWFsX3NlY3Rpb25zW2ldOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBSZW1vdmUgdGhpcyBzZWN0aW9uIGZyb20gdGhlIGxpc3Qgb2YgdGhlIG91dHB1dCBzZWN0aW9uLgotICAgICAgICAgVGhpcyBhc3N1bWVzIHdlIGtub3cgd2hhdCB0aGUgc2NyaXB0IGxvb2tzIGxpa2UuICAqLwotICAgICAgaXMgPSBOVUxMOwotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotICAgICAgaWYgKG9zID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBjYW4ndCBmaW5kIG91dHB1dCBzZWN0aW9uICVzXG4iLAotCSAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGZvciAocGxzID0gJm9zLT5jaGlsZHJlbi5oZWFkOyAqcGxzICE9IE5VTEw7IHBscyA9ICYoKnBscyktPm5leHQpCi0JewotCSAgaWYgKCgqcGxzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KLQkgICAgICAmJiAoKnBscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCi0JICAgIHsKLQkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcGxzOwotCSAgICAgICpwbHMgPSAoKnBscyktPm5leHQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSkKLQkgICAgewotCSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwd2xzOwotCi0JICAgICAgZm9yIChwd2xzID0gJigqcGxzKS0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZDsKLQkJICAgKnB3bHMgIT0gTlVMTDsKLQkJICAgcHdscyA9ICYoKnB3bHMpLT5uZXh0KQotCQl7Ci0JCSAgaWYgKCgqcHdscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JCSAgICAgICYmICgqcHdscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCi0JCSAgICB7Ci0JCSAgICAgIGlzID0gKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICopICpwd2xzOwotCQkgICAgICAqcHdscyA9ICgqcHdscyktPm5leHQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKGlzICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQkKLQotICAgICAgaWYgKGlzID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBjYW4ndCBmaW5kICVzIGluIG91dHB1dCBzZWN0aW9uXG4iLAotCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc2VjLT5vd25lciwgc2VjKSk7Ci0KLSAgICAgIC8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHRoZSBzZWN0aW9uIHNob3VsZCBnby4gICovCi0gICAgICBzd2l0Y2ggKGkpCi0JewotCWRlZmF1bHQ6IC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCi0JY2FzZSAwOgotCSAgLyogX3RleHQgKi8KLQkgIG9uYW1lID0gIi50ZXh0IjsKLQkgIHN0YXJ0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIC8qIF9ldGV4dCAqLwotCSAgb25hbWUgPSAiLnRleHQiOwotCSAgc3RhcnQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIC8qIF9kYXRhICovCi0JICBvbmFtZSA9ICIuZGF0YSI7Ci0JICBzdGFydCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDM6Ci0JICAvKiBfZWRhdGEgKi8KLQkgIG9uYW1lID0gIi5kYXRhIjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JY2FzZSA1OgotCSAgLyogX2VuZCBhbmQgZW5kICovCi0JICBvbmFtZSA9ICIuYnNzIjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChvbmFtZSk7Ci0KLSAgICAgIGlmIChzdGFydCkKLQl7Ci0JICBpcy0+aGVhZGVyLm5leHQgPSBvcy0+Y2hpbGRyZW4uaGVhZDsKLQkgIG9zLT5jaGlsZHJlbi5oZWFkID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgaXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlzLT5oZWFkZXIubmV4dCA9IE5VTEw7Ci0JICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZvcy0+Y2hpbGRyZW4sCi0JCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzLAotCQkJCSAmaXMtPmhlYWRlci5uZXh0KTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZWFkIGFuIGltcG9ydCBvciBleHBvcnQgZmlsZS4gIEZvciBhbiBpbXBvcnQgZmlsZSwgdGhpcyBpcyBjYWxsZWQKLSAgIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiBlbXVsYXRpb24gcm91dGluZS4gIEZvciBhbiBleHBvcnQgZmlsZSwKLSAgIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBwYXJzZV9hcmdzIGVtdWxhdGlvbiByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSAoZmlsZW5hbWUsIGltcG9ydCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJvb2xlYW4gaW1wb3J0OwotewotICBzdHJ1Y3Qgb2JzdGFjayAqbzsKLSAgRklMRSAqZjsKLSAgaW50IGxpbmVubzsKLSAgaW50IGM7Ci0gIGJvb2xlYW4ga2VlcDsKLSAgY29uc3QgY2hhciAqaW1wcGF0aDsKLSAgY29uc3QgY2hhciAqaW1wZmlsZTsKLSAgY29uc3QgY2hhciAqaW1wbWVtYmVyOwotCi0gIG8gPSAoc3RydWN0IG9ic3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb2JzdGFjaykpOwotICBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbiAobywgMCwgMCwgeG1hbGxvYywgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZnJlZSk7Ci0KLSAgZiA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUlQpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlaW5mbyAoIiVGJXM6ICVFXG4iLCBmaWxlbmFtZSk7Ci0gICAgfQotCi0gIGtlZXAgPSBmYWxzZTsKLQotICBpbXBwYXRoID0gTlVMTDsKLSAgaW1wZmlsZSA9IE5VTEw7Ci0gIGltcG1lbWJlciA9IE5VTEw7Ci0KLSAgbGluZW5vID0gMDsKLSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciAqc3ltbmFtZTsKLSAgICAgIGJvb2xlYW4gc3lzY2FsbDsKLSAgICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBpZiAoYyAhPSAnXG4nKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKG8sIGMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBvYnN0YWNrXzFncm93IChvLCAnXDAnKTsKLSAgICAgICsrbGluZW5vOwotCi0gICAgICBzID0gKGNoYXIgKikgb2JzdGFja19iYXNlIChvKTsKLSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSsrczsKLSAgICAgIGlmICgqcyA9PSAnXDAnCi0JICB8fCAqcyA9PSAnKicKLQkgIHx8ICgqcyA9PSAnIycgJiYgc1sxXSA9PSAnICcpCi0JICB8fCAoISBpbXBvcnQgJiYgKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKSkKLQl7Ci0JICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKQotCXsKLQkgIHMgKz0gMjsKLQkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgICArK3M7Ci0JICBpZiAoKnMgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGltcHBhdGggPSBOVUxMOwotCSAgICAgIGltcGZpbGUgPSBOVUxMOwotCSAgICAgIGltcG1lbWJlciA9IE5VTEw7Ci0JICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnMgPT0gJygnKQotCSAgICBlaW5mbyAoIiVGJXMlZDogIyEgKFttZW1iZXJdKSBpcyBub3Qgc3VwcG9ydGVkIGluIGltcG9ydCBmaWxlc1xuIiwKLQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyIGNzOwotCSAgICAgIGNoYXIgKmZpbGU7Ci0KLQkgICAgICAodm9pZCkgb2JzdGFja19maW5pc2ggKG8pOwotCSAgICAgIGtlZXAgPSB0cnVlOwotCSAgICAgIGltcHBhdGggPSBzOwotCSAgICAgIGZpbGUgPSBOVUxMOwotCSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykgJiYgKnMgIT0gJygnICYmICpzICE9ICdcMCcpCi0JCXsKLQkJICBpZiAoKnMgPT0gJy8nKQotCQkgICAgZmlsZSA9IHMgKyAxOwotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChmaWxlICE9IE5VTEwpCi0JCXsKLQkJICBmaWxlWy0xXSA9ICdcMCc7Ci0JCSAgaW1wZmlsZSA9IGZpbGU7Ci0JCSAgaWYgKGltcHBhdGggPT0gZmlsZSAtIDEpCi0JCSAgICBpbXBwYXRoID0gIi8iOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW1wZmlsZSA9IGltcHBhdGg7Ci0JCSAgaW1wcGF0aCA9ICIiOwotCQl9Ci0JICAgICAgY3MgPSAqczsKLQkgICAgICAqcyA9ICdcMCc7Ci0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcykpCi0JCXsKLQkJICArK3M7Ci0JCSAgY3MgPSAqczsKLQkJfQotCSAgICAgIGlmIChjcyAhPSAnKCcpCi0JCXsKLQkJICBpbXBtZW1iZXIgPSAiIjsKLQkJICBpZiAoY3MgIT0gJ1wwJykKLQkJICAgIGVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQgZmlsZVxuIiwKLQkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKytzOwotCQkgIGltcG1lbWJlciA9IHM7Ci0JCSAgd2hpbGUgKCpzICE9ICcpJyAmJiAqcyAhPSAnXDAnKQotCQkgICAgKytzOwotCQkgIGlmICgqcyA9PSAnKScpCi0JCSAgICAqcyA9ICdcMCc7Ci0JCSAgZWxzZQotCQkgICAgZWluZm8gKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iLAotCQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgdG8gYmUgaW1wb3J0ZWQgb3IgZXhwb3J0ZWQuICAqLwotICAgICAgc3ltbmFtZSA9IHM7Ci0gICAgICBzeXNjYWxsID0gZmFsc2U7Ci0gICAgICBhZGRyZXNzID0gKGJmZF92bWEpIC0xOwotCi0gICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICdcMCcpCi0JKytzOwotICAgICAgaWYgKCpzICE9ICdcMCcpCi0JewotCSAgY2hhciAqc2U7Ci0KLQkgICpzKysgPSAnXDAnOwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgICAgKytzOwotCi0JICBzZSA9IHM7Ci0JICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlKSAmJiAqc2UgIT0gJ1wwJykKLQkgICAgKytzZTsKLQkgIGlmICgqc2UgIT0gJ1wwJykKLQkgICAgewotCSAgICAgICpzZSsrID0gJ1wwJzsKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkpCi0JCSsrc2U7Ci0JICAgICAgaWYgKCpzZSAhPSAnXDAnKQotCQllaW5mbyAoIiVzJWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIsCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCi0JICBpZiAocyA9PSBzZSkKLQkgICAgewotCSAgICAgIC8qIFRoZXJlIHdhcyBubyBhZGRyZXNzIGFmdGVyIGFsbC4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzdmMiKSA9PSAwCi0JCSAgIHx8IHN0cmNhc2VjbXAgKHMsICJzeXNjYWxsIikgPT0gMCkKLQkgICAgc3lzY2FsbCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICplbmQ7Ci0KLQkgICAgICBhZGRyZXNzID0gc3RydG91bCAocywgJmVuZCwgMCk7Ci0JICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQkJZWluZm8gKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiwKLQkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBpbXBvcnQpCi0JewotCSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbjsKLQotCSAgbGRsYW5nX2FkZF91bmRlZiAoc3ltbmFtZSk7Ci0JICBuID0gKChzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICopCi0JICAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCkpKTsKLQkgIG4tPm5leHQgPSBleHBvcnRfc3ltYm9sczsKLQkgIG4tPm5hbWUgPSBidXlzdHJpbmcgKHN5bW5hbWUpOwotCSAgbi0+c3lzY2FsbCA9IHN5c2NhbGw7Ci0JICBleHBvcnRfc3ltYm9scyA9IG47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHN5bW5hbWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkgICAgdHJ1ZSk7Ci0JICBpZiAoaCA9PSBOVUxMIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4ganVzdCBpZ25vcmUgYXR0ZW1wdHMgdG8gaW1wb3J0IGFuIHVucmVmZXJlbmNlZAotCQkgc3ltYm9sLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGgsCi0JCQkJCSAgICAgYWRkcmVzcywgaW1wcGF0aCwgaW1wZmlsZSwKLQkJCQkJICAgICBpbXBtZW1iZXIpKQotCQllaW5mbyAoIiVYJXM6JWQ6IGZhaWxlZCB0byBpbXBvcnQgc3ltYm9sICVzOiAlRVxuIiwKLQkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8sIHN5bW5hbWUpOwotCSAgICB9Ci0JfQotCi0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotICAgIH0KLQotICBpZiAob2JzdGFja19vYmplY3Rfc2l6ZSAobykgPiAwKQotICAgIHsKLSAgICAgIGVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IGlnbm9yaW5nIHVudGVybWluYXRlZCBsYXN0IGxpbmVcbiIsCi0JICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0gICAgfQotCi0gIGlmICghIGtlZXApCi0gICAgewotICAgICAgb2JzdGFja19mcmVlIChvLCBOVUxMKTsKLSAgICAgIGZyZWUgKG8pOwotICAgIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIHNhdmVzIHVzIGZyb20gd29ycnlpbmcgYWJvdXQgZGVjbGFyaW5nIGZyZWUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZnJlZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIGZyZWUgKHApOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9va3MgZm9yIHJlbG9jYXRpb25zIGFuZCBhc3NpZ25tZW50cwotICAgdG8gc3ltYm9scy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcyAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0pCi0gICAgewotICAgICAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcnM7Ci0KLSAgICAgIHJzID0gJnMtPnJlbG9jX3N0YXRlbWVudDsKLSAgICAgIGlmIChycy0+bmFtZSA9PSBOVUxMKQotCWVpbmZvICgiJUYlUDogb25seSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIHBlcm1pdHRlZFxuIik7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcnMtPm5hbWUpKQotCWVpbmZvICgiJUYlUDogYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgZmFpbGVkOiAlRVxuIik7Ci0gICAgfQotCi0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICBleHAtPmFzc2lnbi5kc3QpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgMCwJLyogZmluaXNoICovCi0gIDAsCS8qIGNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICovCi0gIDAsCS8qIG9wZW5fZHluYW1pY19hcmNoaXZlICovCi0gIDAsCS8qIHBsYWNlX29ycGhhbiAqLwotICAwLAkvKiBzZXRfc3ltYm9scyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZQotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FybWNvZmYuZW0gYi9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiNzlkNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci1zdGF0aWMgaW50ICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUygoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggUEFSQU1TICgodm9pZCkpOwotCi0vKiBJZiB0cnVlLCB0aGVuIGludGVyd29ya2luZyBzdHVicyB3aGljaCBzdXBwb3J0IGNhbGxzIHRvIG9sZCwgbm9uLWludGVyd29ya2luZwotICAgYXdhcmUgQVJNIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCi0KLXN0YXRpYyBpbnQgc3VwcG9ydF9vbGRfY29kZSA9IDA7Ci1zdGF0aWMgY2hhciAqIHRodW1iX2VudHJ5X3N5bWJvbCA9IE5VTEw7Ci0KLSNkZWZpbmUgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUJCTMwMAotI2RlZmluZSBPUFRJT05fVEhVTUJfRU5UUlkJCTMwMQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KLXsKLSAgeyJzdXBwb3J0LW9sZC1jb2RlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFfSwKLSAgeyJ0aHVtYi1lbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEhVTUJfRU5UUll9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXN1cHBvcnQtb2xkLWNvZGUgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS10aHVtYi1lbnRyeT08c3ltPiAgU2V0IHRoZSBlbnRyeSBwb2ludCB0byBiZSBUaHVtYiBzeW1ib2wgPHN5bT5cbiIpKTsKLX0KLQotc3RhdGljIGludAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50ICAgICBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCAgICAgICAgbG9uZ2luZDsKLSAgaW50ICAgICAgICBvcHRjOwotICBpbnQgICAgICAgIHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCAgICAgICAgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50ICAgICAgICB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICAKLSAgd2FudGVycm9yICA9IG9wdGVycjsKLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjICAgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmIGxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREU6Ci0gICAgICBzdXBwb3J0X29sZF9jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVEhVTUJfRU5UUlk6Ci0gICAgICB0aHVtYl9lbnRyeV9zeW1ib2wgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQwKLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICAvKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViIHNlY3Rpb24gKi8KLQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUgaW5mb3JtYXRpb24gKi8KLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lIG9wdGlvbj8ga3JrQGN5Z251cy5jb20gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoISBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLQkgICAgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbywgc3VwcG9ydF9vbGRfY29kZSkpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgImFybSIpID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlIGFybSBiYWNrZW5kIG5lZWRzIHNwZWNpYWwgZmllbGRzIGluIHRoZSBvdXRwdXQgaGFzaCBzdHJ1Y3R1cmUuCi0JIFRoZXNlIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIGFuIGFybSBmb3JtYXQsCi0JIGhlbmNlIHdlIGRvIG5vdCBzdXBwb3J0IGxpbmtpbmcgYW5kIGNoYW5naW5nIG91dHB1dCBmb3JtYXRzIGF0IHRoZQotCSBzYW1lIHRpbWUuICBVc2UgYSBsaW5rIGZvbGxvd2VkIGJ5IG9iamNvcHkgdG8gY2hhbmdlIG91dHB1dCBmb3JtYXRzLiAgKi8KLSAgICAgIGVpbmZvICgiJUYlWCVQOiBlcnJvcjogY2Fubm90IGNoYW5nZSBvdXRwdXQgZm9ybWF0IHdoaWxzdCBsaW5raW5nIEFSTSBiaW5hcmllc1xuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbykpCi0JICBicmVhazsKLSAgICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUygodm9pZCkpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQotICBpZiAodGh1bWJfZW50cnlfc3ltYm9sID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdGh1bWJfZW50cnlfc3ltYm9sLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0gICAgICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZmZXJbMzJdOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICAKLSAgICAgIC8qIFNwZWNpYWwgcHJvY2VzaW5nIGlzIHJlcXVpcmVkIGZvciBhIFRodW1iIGVudHJ5IHN5bWJvbC4gIFRoZQotCSBib3R0b20gYml0IG9mIGl0cyBhZGRyZXNzIG11c3QgYmUgc2V0LiAgKi8KLSAgICAgIHZhbCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLAotCQkJCSAgICBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIHZhbCB8PSAxOwotCi0gICAgICAvKiBOb3cgY29udmVydCB0aGlzIHZhbHVlIGludG8gYSBzdHJpbmcgYW5kIHN0b3JlIGl0IGluIGVudHJ5X3N5bWJvbAotICAgICAgICAgd2hlcmUgdGhlIGxhbmdfZmluaXNoKCkgZnVuY3Rpb24gd2lsbCBwaWNrIGl0IHVwLiAgKi8KLSAgICAgIGJ1ZmZlclswXSA9ICcwJzsKLSAgICAgIGJ1ZmZlclsxXSA9ICd4JzsKLSAgICAgIAotICAgICAgc3ByaW50Zl92bWEgKGJ1ZmZlciArIDIsIHZhbCk7Ci0KLSAgICAgIGlmIChlbnRyeV9zeW1ib2wgIT0gTlVMTCAmJiBlbnRyeV9mcm9tX2NtZGxpbmUpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiAnLS10aHVtYi1lbnRyeSAlcycgaXMgb3ZlcnJpZGluZyAnLWUgJXMnXG4iKSwKLQkgICAgICAgdGh1bWJfZW50cnlfc3ltYm9sLCBlbnRyeV9zeW1ib2wpOwotICAgICAgZW50cnlfc3ltYm9sID0gYnVmZmVyOwotICAgIH0KLSAgZWxzZQotICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogY29ubm90IGZpbmQgdGh1bWIgc3RhcnQgc3ltYm9sICVzXG4iKSwgdGh1bWJfZW50cnlfc3ltYm9sKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCAoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2gsIC8qIGZpbmlzaCAqLwotICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLCAvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBOVUxMLCAvKiBwbGFjZSBvcnBoYW4gKi8KLSAgTlVMTCwgLyogc2V0X3N5bWJvbHMgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncywKLSAgTlVMTCwgLyogdW5yZWNvZ25pc2VkIGZpbGUgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYXJtZWxmLmVtIGIvbGQvZW11bHRlbXBsL2FybWVsZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhMWIzYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYXJtZWxmLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTI5MSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1FTEZTSVpFPTMyCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWFyY2hfZGlyc190eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLXN0YXRpYyBpbnQgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucyBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLQwKLXN0YXRpYyBpbnQgbm9fcGlwZWxpbmVfa25vd2xlZGdlID0gMDsKLXN0YXRpYyBjaGFyICogdGh1bWJfZW50cnlfc3ltYm9sID0gTlVMTDsKLQotI2RlZmluZSBPUFRJT05fVEhVTUJfRU5UUlkJCTMwMQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KLXsKLSAgeyAibm8tcGlwZWxpbmUta25vd2xlZGdlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdwJ30sCi0gIHsgInRodW1iLWVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9USFVNQl9FTlRSWX0sCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDAgfQotfTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLXAgLS1uby1waXBlbGluZS1rbm93bGVkZ2UgIFN0b3AgdGhlIGxpbmtlciBrbm93aW5nIGFib3V0IHRoZSBwaXBlbGluZSBsZW5ndGhcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAtLXRodW1iLWVudHJ5PTxzeW0+ICAgICAgU2V0IHRoZSBlbnRyeSBwb2ludCB0byBiZSBUaHVtYiBzeW1ib2wgPHN5bT5cbiIpKTsKLX0KLQotc3RhdGljIGludAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50ICAgICBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCAgICAgICAgbG9uZ2luZDsKLSAgaW50ICAgICAgICBvcHRjOwotICBpbnQgICAgICAgIHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCAgICAgICAgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50ICAgICAgICB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICAKLSAgd2FudGVycm9yICA9IG9wdGVycjsKLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjICAgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLXAiLCBsb25nb3B0cywgJiBsb25naW5kKTsKLSAgb3B0ZXJyID0gcHJldm9wdGVycjsKLQotICBzd2l0Y2ggKG9wdGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAod2FudGVycm9yKQotCXhleGl0ICgxKTsKLSAgICAgIG9wdGluZCA9ICBwcmV2b3B0aW5kOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlICdwJzoKLSAgICAgIG5vX3BpcGVsaW5lX2tub3dsZWRnZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1RIVU1CX0VOVFJZOgotICAgICAgdGh1bWJfZW50cnlfc3ltYm9sID0gb3B0YXJnOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0MCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLSAgY29uZmlnLmR5bmFtaWNfbGluayA9ICR7RFlOQU1JQ19MSU5LLXRydWV9OwotICBjb25maWcuaGFzX3NoYXJlZCA9IGBpZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIiA7IHRoZW4gZWNobyB0cnVlIDsgZWxzZSBlY2hvIGZhbHNlIDsgZmlgOwotfQotCi0vKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgYXJjaGl2ZS4gIFRoaXMgaXMgd2hlcmUgd2Uga25vdyB0aGF0IEVMRgotICAgZHluYW1pYyBsaWJyYXJpZXMgaGF2ZSBhbiBleHRlbnNpb24gb2YgLnNvLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqc3RyaW5nOwotCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxlbmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKLQotICBzdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQotCQkJICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc28iKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNvIiwgc2VhcmNoLT5uYW1lLCBmaWxlbmFtZSwgYXJjaCk7Ci0KLSAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCi0gIC8qIFdlIGhhdmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGluIHRoZSBsaW5rLiAgVGhlIEVMRgotICAgICBiYWNrZW5kIGxpbmtlciB3aWxsIGNyZWF0ZSBhIERUX05FRURFRCBlbnRyeSBpbiB0aGUgLmR5bmFtaWMKLSAgICAgc2VjdGlvbiBuYW1pbmcgdGhpcyBmaWxlLiAgSWYgdGhpcyBmaWxlIGluY2x1ZGVzIGEgRFRfU09OQU1FCi0gICAgIGVudHJ5LCBpdCB3aWxsIGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZSBFTEYgbGlua2VyIHdpbGwganVzdCB1c2UKLSAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICBGb3IgYW4gYXJjaGl2ZSBmb3VuZCBieSBzZWFyY2hpbmcsIGxpa2UKLSAgICAgdGhpcyBvbmUsIHRoZSBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGNvbnNpc3Qgb2YganVzdCB0aGUgbmFtZSBvZgotICAgICB0aGUgZmlsZSwgd2l0aG91dCB0aGUgcGF0aCBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbmQgaXQuICBOb3RlCi0gICAgIHRoYXQgd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaWYgd2UgaGF2ZSBhIGR5bmFtaWMgb2JqZWN0OyBhbgotICAgICBhcmNoaXZlIHdpbGwgbmV2ZXIgYmUgcmVmZXJlbmNlZCBieSBhIERUX05FRURFRCBlbnRyeS4KLQotICAgICBGSVhNRTogVGhpcyBhcHByb2FjaC0tdXNpbmcgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUtLWlzIG5vdAotICAgICB2ZXJ5IHByZXR0eS4gIEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdGhpbmsgb2YgYW55dGhpbmcgdGhhdCBpcwotICAgICBwcmV0dHksIHRob3VnaC4gICovCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCwgYmZkX29iamVjdCkKLSAgICAgICYmIChlbnRyeS0+dGhlX2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgKm5lZWRlZF9uYW1lOwotCi0gICAgICBBU1NFUlQgKGVudHJ5LT5pc19hcmNoaXZlICYmIGVudHJ5LT5zZWFyY2hfZGlyc19mbGFnKTsKLSAgICAgIG5lZWRlZF9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkKLQkJCQkgICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCQkgICAgICArIHNpemVvZiAibGliLnNvIik7Ci0gICAgICBzcHJpbnRmIChuZWVkZWRfbmFtZSwgImxpYiVzJXMuc28iLCBmaWxlbmFtZSwgYXJjaCk7Ci0gICAgICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoZW50cnktPnRoZV9iZmQsIG5lZWRlZF9uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotLyogRm9yIGEgbmF0aXZlIGxpbmtlciwgY2hlY2sgdGhlIGZpbGUgL2V0Yy9sZC5zby5jb25mIGZvciBkaXJlY3RvcmllcwotICAgaW4gd2hpY2ggd2UgbWF5IGZpbmQgc2hhcmVkIGxpYnJhcmllcy4gIC9ldGMvbGQuc28uY29uZiBpcyByZWFsbHkKLSAgIG9ubHkgbWVhbmluZ2Z1bCBvbiBMaW51eCwgYnV0IHdlIGNoZWNrIGl0IG9uIG90aGVyIHN5c3RlbXMgYW55aG93LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZgotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZiAobmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0gIHN0YXRpYyBjaGFyICpsZF9zb19jb25mOwotCi0gIGlmICghIGluaXRpYWxpemVkKQotICAgIHsKLSAgICAgIEZJTEUgKmY7Ci0KLSAgICAgIGYgPSBmb3BlbiAoIi9ldGMvbGQuc28uY29uZiIsIEZPUEVOX1JUKTsKLSAgICAgIGlmIChmICE9IE5VTEwpCi0JewotCSAgY2hhciAqYjsKLQkgIHNpemVfdCBsZW4sIGFsbG9jOwotCSAgaW50IGM7Ci0KLQkgIGxlbiA9IDA7Ci0JICBhbGxvYyA9IDEwMDsKLQkgIGIgPSAoY2hhciAqKSB4bWFsbG9jIChhbGxvYyk7Ci0KLQkgIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCi0JICAgIHsKLQkgICAgICBpZiAobGVuICsgMSA+PSBhbGxvYykKLQkJewotCQkgIGFsbG9jICo9IDI7Ci0JCSAgYiA9IChjaGFyICopIHhyZWFsbG9jIChiLCBhbGxvYyk7Ci0JCX0KLQkgICAgICBpZiAoYyAhPSAnOicKLQkJICAmJiBjICE9ICcgJwotCQkgICYmIGMgIT0gJ1x0JwotCQkgICYmIGMgIT0gJ1xuJwotCQkgICYmIGMgIT0gJywnKQotCQl7Ci0JCSAgYltsZW5dID0gYzsKLQkJICArK2xlbjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChsZW4gPiAwICYmIGJbbGVuIC0gMV0gIT0gJzonKQotCQkgICAgewotCQkgICAgICBiW2xlbl0gPSAnOic7Ci0JCSAgICAgICsrbGVuOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSA9PSAnOicpCi0JICAgIC0tbGVuOwotCi0JICBpZiAobGVuID4gMCkKLQkgICAgYltsZW5dID0gJ1wwJzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZyZWUgKGIpOwotCSAgICAgIGIgPSBOVUxMOwotCSAgICB9Ci0KLQkgIGZjbG9zZSAoZik7Ci0KLQkgIGxkX3NvX2NvbmYgPSBiOwotCX0KLQotICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICBpZiAobGRfc29fY29uZiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGRfc29fY29uZiwgbmFtZSwgZm9yY2UpOwotfQotCi1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLS8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aAotICAgYmV0d2VlbiBhZnRlcl9vcGVuIGFuZCBjaGVja19uZWVkZWQgYW5kIHN0YXRfbmVlZGVkIGFuZCB2ZXJjaGVjay4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF9uZWVkZWQ7Ci1zdGF0aWMgc3RydWN0IHN0YXQgZ2xvYmFsX3N0YXQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfZm91bmQ7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfdmVyY2hlY2tfbmVlZGVkOwotc3RhdGljIGJvb2xlYW4gZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZDsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOwotCi0gIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgImFybSIpID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlIGFybSBiYWNrZW5kIG5lZWRzIHNwZWNpYWwgZmllbGRzIGluIHRoZSBvdXRwdXQgaGFzaCBzdHJ1Y3R1cmUuCi0JIFRoZXNlIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIGFuIGFybSBmb3JtYXQsCi0JIGhlbmNlIHdlIGRvIG5vdCBzdXBwb3J0IGxpbmtpbmcgYW5kIGNoYW5naW5nIG91dHB1dCBmb3JtYXRzIGF0IHRoZQotCSBzYW1lIHRpbWUuICBVc2UgYSBsaW5rIGZvbGxvd2VkIGJ5IG9iamNvcHkgdG8gY2hhbmdlIG91dHB1dCBmb3JtYXRzLiAgKi8KLSAgICAgIGVpbmZvICgiJUYlWCVQOiBlcnJvcjogY2Fubm90IGNoYW5nZSBvdXRwdXQgZm9ybWF0IHdoaWxzdCBsaW5raW5nIEFSTSBiaW5hcmllc1xuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JLyogVGhlIGludGVyd29ya2luZyBiZmQgbXVzdCBiZSB0aGUgbGFzdCBvbmUgdG8gYmUgcHJvY2Vzc2VkICovCi0JaWYgKCFpcy0+bmV4dCkKLQkgIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pOwotICAgICAgfQotICB9Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgd2hlbiBkb2luZyBhIGZpbmFsIGxpbmsuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSB8fCBsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybjsKLQotICAvKiBHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXBwZWFyIGluIERUX05FRURFRCBlbnRyaWVzIGluCi0gICAgIGR5bmFtaWMgb2JqZWN0cyBpbmNsdWRlZCBpbiB0aGUgbGluayAob2Z0ZW4gdGhlcmUgd2lsbCBiZSBub25lKS4KLSAgICAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdAotICAgICB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZQotICAgICBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcKLSAgICAgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbiBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUKLSAgICAgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcwotICAgICBsb29wLiAgKi8KLSAgbmVlZGVkID0gYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsbDsKLSAgICAgIGludCBmb3JjZTsKLQotICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCi0gICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQotCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsLT5uYW1lKSA9PSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAobGwgIT0gbCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgZmlsZSB3YXMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgZXhwbGljaXRseS4gICovCi0gICAgICBnbG9iYWxfbmVlZGVkID0gbDsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IGZhbHNlOwotICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOwotICAgICAgaWYgKGdsb2JhbF9mb3VuZCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgbmVlZCB0byBmaW5kIHRoaXMgZmlsZSBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlLiAgV2UKLQkgd2FudCB0byBzZWFyY2ggZm9yIHRoZSBmaWxlIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoZSBkeW5hbWljCi0JIGxpbmtlciB3aWxsIHNlYXJjaC4gIFRoYXQgbWVhbnMgdGhhdCB3ZSB3YW50IHRvIHVzZQotCSBycGF0aF9saW5rLCBycGF0aCwgdGhlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLQkgTERfTElCUkFSWV9QQVRIIChuYXRpdmUgb25seSksIHRoZW4gdGhlIGxpbmtlciBzY3JpcHQKLQkgTElCX1NFQVJDSF9ESVJTLiAgV2UgZG8gbm90IHNlYXJjaCB1c2luZyB0aGUgLUwgYXJndW1lbnRzLgotCi0JIFdlIHNlYXJjaCB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lLCB3ZSBza2lwIG9iamVjdHMgd2hpY2ggbWF5Ci0JIGludHJvZHVjZSB2ZXJzaW9uIG1pc21hdGNoZXMuICBUaGUgc2Vjb25kIHRpbWUsIHdlIGZvcmNlCi0JIHRoZWlyIHVzZS4gIFNlZSBnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayBjb21tZW50LiAgKi8KLSAgICAgIGZvciAoZm9yY2UgPSAwOyBmb3JjZSA8IDI7IGZvcmNlKyspCi0JewotCSAgY29uc3QgY2hhciAqbGliX3BhdGg7Ci0JICBzaXplX3QgbGVuOwotCSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCi0JCQkJCQkgIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLAotCQkJCQkJICBsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotCSAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID09IE5VTEwKLQkgICAgICAmJiBjb21tYW5kX2xpbmUucnBhdGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLQkgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUsCi0JCQkJCQkgICAgICBmb3JjZSkpCi0JCWJyZWFrOwotCSAgICB9Ci1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpOwotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotRU9GCi0gIDs7Ci0gIGVzYWMKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgbGVuID0gc3RybGVuIChsLT5uYW1lKTsKLQkgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JICAgIHsKLQkgICAgICBjaGFyICpmaWxlbmFtZTsKLQotCSAgICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JCWNvbnRpbnVlOwotCSAgICAgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpICsgbGVuICsgMik7Ci0JICAgICAgc3ByaW50ZiAoZmlsZW5hbWUsICIlcy8lcyIsIHNlYXJjaC0+bmFtZSwgbC0+bmFtZSk7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGZpbGVuYW1lLCBmb3JjZSkpCi0JCWJyZWFrOwotCSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQkgICAgfQotCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCSAgICBicmVhazsKLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotRU9GCi0gIDs7Ci0gIGVzYWMKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCX0KLQotICAgICAgaWYgKGZvcmNlIDwgMikKLQljb250aW51ZTsKLQotICAgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kICh0cnkgdXNpbmcgLS1ycGF0aClcbiIsCi0JICAgICBsLT5uYW1lLCBsLT5ieSk7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggZm9yIGEgbmVlZGVkIGZpbGUgaW4gYSBwYXRoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKHBhdGgsIG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpwYXRoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHNpemVfdCBsZW47Ci0KLSAgaWYgKHBhdGggPT0gTlVMTCB8fCAqcGF0aCA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgbGVuID0gc3RybGVuIChuYW1lKTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciAqZmlsZW5hbWUsICpzc2V0OwotCi0gICAgICBzID0gc3RyY2hyIChwYXRoLCAnOicpOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlzID0gcGF0aCArIHN0cmxlbiAocGF0aCk7Ci0KLSAgICAgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocyAtIHBhdGggKyBsZW4gKyAyKTsKLSAgICAgIGlmIChzID09IHBhdGgpCi0Jc3NldCA9IGZpbGVuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAoZmlsZW5hbWUsIHBhdGgsIHMgLSBwYXRoKTsKLQkgIGZpbGVuYW1lW3MgLSBwYXRoXSA9ICcvJzsKLQkgIHNzZXQgPSBmaWxlbmFtZSArIChzIC0gcGF0aCkgKyAxOwotCX0KLSAgICAgIHN0cmNweSAoc3NldCwgbmFtZSk7Ci0KLSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChmaWxlbmFtZSwgZm9yY2UpKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmcmVlIChmaWxlbmFtZSk7Ci0KLSAgICAgIGlmICgqcyA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgcGF0aCA9IHMgKyAxOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CSAgCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHBvc3NpYmxlIG5hbWUgZm9yIGEgZHluYW1pYyBvYmplY3QKLSAgIG5hbWVkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LiAgVGhlIEZPUkNFIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlcgotICAgdG8gc2tpcCB0aGUgY2hlY2sgZm9yIGEgY29uZmxpY3RpbmcgdmVyc2lvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBiZmQgKmFiZmQ7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAobmFtZSwgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB0aGlzIG9iamVjdCB3b3VsZCBpbmNsdWRlIGFueSBjb25mbGljdGluZyBsaWJyYXJ5Ci0gICAgIHZlcnNpb25zLiAgSWYgRk9SQ0UgaXMgc2V0LCB0aGVuIHdlIHNraXAgdGhpcyBjaGVjazsgd2UgdXNlIHRoaXMKLSAgICAgdGhlIHNlY29uZCB0aW1lIGFyb3VuZCwgaWYgd2UgY291bGRuJ3QgZmluZCBhbnkgY29tcGF0aWJsZQotICAgICBpbnN0YW5jZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0gIGlmICghIGZvcmNlKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkOwotCi0gICAgICBpZiAoISBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QgKGFiZmQsICZuZWVkZWQpKQotCWVpbmZvICgiJUYlUDolQjogYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IGZhaWxlZDogJUVcbiIsIGFiZmQpOwotCi0gICAgICBpZiAobmVlZGVkICE9IE5VTEwpCi0JewotCSAgZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZCA9IG5lZWRlZDsKLQkgIGdsb2JhbF92ZXJjaGVja19mYWlsZWQgPSBmYWxzZTsKLQkgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2spOwotCSAgaWYgKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpCi0JICAgIHsKLQkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkgICAgICAvKiBSZXR1cm4gZmFsc2UgdG8gZm9yY2UgdGhlIGNhbGxlciB0byBtb3ZlIG9uIHRvIHRyeQotICAgICAgICAgICAgICAgICBhbm90aGVyIGZpbGUgb24gdGhlIHNlYXJjaCBwYXRoLiAgKi8KLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogQnV0IHdhaXQhICBJdCBnZXRzIG11Y2ggd29yc2UuICBPbiBMaW51eCwgaWYgYSBzaGFyZWQKLSAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IHVzZSBsaWJjIGF0IGFsbCwgd2UgYXJlIHN1cHBvc2VkIHRvIHNraXAKLSAgICAgICAgICAgICBpdCB0aGUgZmlyc3QgdGltZSBhcm91bmQgaW4gY2FzZSB3ZSBlbmNvdW50ZXIgYSBzaGFyZWQKLSAgICAgICAgICAgICBsaWJyYXJ5IGxhdGVyIG9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aGljaCBkb2VzIHVzZSB0aGUKLSAgICAgICAgICAgICB2ZXJzaW9uIG9mIGxpYmMgdGhhdCB3ZSB3YW50LiAgVGhpcyBpcyBtdWNoIHRvbyBob3JyaWJsZQotICAgICAgICAgICAgIHRvIHVzZSBvbiBhbnkgc3lzdGVtIG90aGVyIHRoYW4gTGludXguICAqLwotCi1FT0YKLWNhc2UgJHt0YXJnZXR9IGluCi0gICotKi1saW51eC1nbnUqKQotICAgIGNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbDsKLQotCSAgICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JICAgICAgaWYgKHN0cm5jbXAgKGwtPm5hbWUsICJsaWJjLnNvIiwgNykgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIGlmIChsID09IE5VTEwpCi0JICAgICAgewotCQkodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQotRU9GCi0gICAgOzsKLWVzYWMKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JfQotICAgIH0KLQotICAvKiBXZSd2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IG1hdGNoaW5nIHRoZSBEVF9ORUVERUQgZW50cnkuICAqLwotCi0gIC8qIFdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlcmUgaXMgbm8gb3RoZXIgaW5wdXQgZmlsZSBvZiB0aGUKLSAgICAgc2FtZSBuYW1lLiAgV2UgbXVzdCBub3cgY2hlY2sgYWdhaW4gdGhhdCB3ZSBhcmUgbm90IGluY2x1ZGluZyB0aGUKLSAgICAgc2FtZSBmaWxlIHR3aWNlLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2Ugb24gbWFueSBzeXN0ZW1zCi0gICAgIGxpYmMuc28gaXMgYSBzeW1saW5rIHRvLCBlLmcuLCBsaWJjLnNvLjEuICBUaGUgU09OQU1FIGVudHJ5IHdpbGwKLSAgICAgcmVmZXJlbmNlIGxpYmMuc28uMS4gIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBsaWJjLnNvLCB3ZQotICAgICBkb24ndCB3YW50IHRvIGluY2x1ZGUgbGliYy5zby4xIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGZpbGUsIGFuZCB3ZQotICAgICBjYW4gb25seSBjaGVjayB0aGF0IHVzaW5nIHN0YXQuICAqLwotCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJmdsb2JhbF9zdGF0KSAhPSAwKQotICAgIGVpbmZvICgiJUYlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiwgYWJmZCk7Ci0gIGdsb2JhbF9mb3VuZCA9IGZhbHNlOwotICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkKTsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICB7Ci0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIGZvdW5kIHRoZSBmaWxlLCBldmVuIHRob3VnaAotICAgICAgICAgd2UgYXJlbid0IGdvaW5nIHRvIGRvIGFueXRoaW5nIHdpdGggaXQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRlbGwgdGhlIEVMRiBiYWNrZW5kIHRoYXQgZG9uJ3Qgd2FudCB0aGUgb3V0cHV0IGZpbGUgdG8gaGF2ZSBhCi0gICAgIERUX05FRURFRCBlbnRyeSBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGFiZmQsICIiKTsKLQotICAvKiBBZGQgdGhpcyBmaWxlIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAocy0+ZmlsZW5hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzb25hbWU7Ci0KLSAgICAgIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gICAgICBpZiAoc29uYW1lICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoc29uYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQkgIAotICBpZiAocy0+c2VhcmNoX2RpcnNfZmxhZwotICAgICAgJiYgcy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpID09IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZjsKLQotICAgICAgZiA9IHN0cnJjaHIgKHMtPmZpbGVuYW1lLCAnLycpOwotICAgICAgaWYgKGYgIT0gTlVMTAotCSAgJiYgc3RyY21wIChmICsgMSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgcnVubmluZyBzdGF0IG9uCi0gICB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLSAgY29uc3QgY2hhciAqc29uYW1lOwotICBjb25zdCBjaGFyICpmOwotCi0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBpZiAoYmZkX3N0YXQgKHMtPnRoZV9iZmQsICZzdCkgIT0gMCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iLCBzLT50aGVfYmZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHN0LnN0X2RldiA9PSBnbG9iYWxfc3RhdC5zdF9kZXYKLSAgICAgICYmIHN0LnN0X2lubyA9PSBnbG9iYWxfc3RhdC5zdF9pbm8pCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogV2UgaXNzdWUgYSB3YXJuaW5nIGlmIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIGluY2x1ZGluZyB0d28KLSAgICAgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIHNoYXJlZCBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsCi0gICAgIHRoZXJlIG1heSBiZSBhIHByb2JsZW0gaWYgLWxjIHBpY2tzIHVwIGxpYmMuc28uNiBidXQgc29tZSBvdGhlcgotICAgICBzaGFyZWQgbGlicmFyeSBoYXMgYSBEVF9ORUVERUQgZW50cnkgb2YgbGliYy5zby41LiAgVGhpcyBpcyBhCi0gICAgIGh1ZXJpc3RpYyB0ZXN0LCBhbmQgaXQgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG5hbWUgbG9va3MgbGlrZQotICAgICBOQU1FLnNvLlZFUlNJT04uICBGSVhNRTogRGVwZW5kaW5nIG9uIGZpbGUgbmFtZXMgaXMgZXJyb3ItcHJvbmUuCi0gICAgIElmIHdlIHJlYWxseSB3YW50IHRvIGlzc3VlIHdhcm5pbmdzIGFib3V0IG1peGluZyB2ZXJzaW9uIG51bWJlcnMKLSAgICAgb2Ygc2hhcmVkIGxpYnJhcmllcywgd2UgbmVlZCB0byBmaW5kIGEgYmV0dGVyIHdheS4gICovCi0KLSAgaWYgKHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSAhPSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ID0gc3Ryc3RyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAiLnNvLiIpOwotICBpZiAoc3VmZml4ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggKz0gc2l6ZW9mICIuc28uIiAtIDE7Ci0KLSAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgaWYgKHNvbmFtZSA9PSBOVUxMKQotICAgIHNvbmFtZSA9IHMtPmZpbGVuYW1lOwotCi0gIGYgPSBzdHJyY2hyIChzb25hbWUsICcvJyk7Ci0gIGlmIChmICE9IE5VTEwpCi0gICAgKytmOwotICBlbHNlCi0gICAgZiA9IHNvbmFtZTsKLQotICBpZiAoc3RybmNtcCAoZiwgZ2xvYmFsX25lZWRlZC0+bmFtZSwgc3VmZml4IC0gZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBtYXkgY29uZmxpY3Qgd2l0aCAlc1xuIiwKLQkgICBnbG9iYWxfbmVlZGVkLT5uYW1lLCBnbG9iYWxfbmVlZGVkLT5ieSwgZik7Ci19Ci0KLS8qIE9uIExpbnV4LCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lCi0gICBzaGFyZWQgbGlicmFyeSBsaW5rZWQgYWdhaW5zdCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgbGliYy4gIFRoZQotICAgZHluYW1pYyBsaW5rZXIgc29tZWhvdyB0YWdzIHdoaWNoIGxpYmMgdmVyc2lvbiB0byB1c2UgaW4KLSAgIC9ldGMvbGQuc28uY2FjaGUsIGFuZCwgYmFzZWQgb24gdGhlIGxpYmMgdGhhdCBpdCBzZWVzIGluIHRoZQotICAgZXhlY3V0YWJsZSwgY2hvb3NlcyB3aGljaCB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgbGlicmFyeSB0byB1c2UuCi0KLSAgIFdlIHRyeSB0byBkbyBhIHNpbWlsYXIgY2hlY2sgaGVyZSBieSBjaGVja2luZyB3aGV0aGVyIHRoaXMgc2hhcmVkCi0gICBsaWJyYXJ5IG5lZWRzIGFueSBvdGhlciBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIG1heSBjb25mbGljdCB3aXRoCi0gICBsaWJyYXJpZXMgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgSWYgaXQgZG9lcywgd2UKLSAgIHNraXAgaXQsIGFuZCB0cnkgdG8gZmluZCBhbm90aGVyIHNoYXJlZCBsaWJyYXJ5IGZhcnRoZXIgb24gZG93biB0aGUKLSAgIGxpbmsgcGF0aC4KLQotICAgVGhpcyBpcyBjYWxsZWQgdmlhIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZS4KLSAgIEdMT0JBTF9WRVJDSEVDS19ORUVERUQgaXMgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBuZWVkZWQgYnkgdGhlIG9iamVjdAotICAgd2hpY2ggd2UgYXIgY2hlY2tpbmcuICBUaGlzIHNldHMgR0xPQkFMX1ZFUkNIRUNLX0ZBSUxFRCBpZiB3ZSBmaW5kCi0gICBhIGNvbmZsaWN0aW5nIHZlcnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZSwgKmY7Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbDsKLQotICBpZiAoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwKLSAgICAgIHx8IChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKHMtPnRoZV9iZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgaWYgKHNvbmFtZSA9PSBOVUxMKQotICAgIHNvbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKHMtPnRoZV9iZmQpOwotCi0gIGYgPSBzdHJyY2hyIChzb25hbWUsICcvJyk7Ci0gIGlmIChmICE9IE5VTEwpCi0gICAgKytmOwotICBlbHNlCi0gICAgZiA9IHNvbmFtZTsKLQotICBmb3IgKGwgPSBnbG9iYWxfdmVyY2hlY2tfbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLQotICAgICAgaWYgKHN0cmNtcCAoZiwgbC0+bmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBQcm9iYWJseSBjYW4ndCBoYXBwZW4sIGJ1dCBpdCdzIGFuIGVhc3kgY2hlY2suICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyY2hyIChsLT5uYW1lLCAnLycpICE9IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN1ZmZpeCA9IHN0cnN0ciAobC0+bmFtZSwgIi5zby4iKTsKLSAgICAgIGlmIChzdWZmaXggPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gICAgICBpZiAoc3RybmNtcCAoZiwgbC0+bmFtZSwgc3VmZml4IC0gbC0+bmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBIZXJlIHdlIGtub3cgdGhhdCBTIGlzIGEgZHluYW1pYyBvYmplY3QgRk9PLlNPLlZFUjEsIGFuZAotICAgICAgICAgICAgIHRoZSBvYmplY3Qgd2UgYXJlIGNvbnNpZGVyaW5nIG5lZWRzIGEgZHluYW1pYyBvYmplY3QKLSAgICAgICAgICAgICBGT08uU08uVkVSMiwgYW5kIFZFUjEgYW5kIFZFUjIgYXJlIGRpZmZlcmVudC4gIFRoaXMKLSAgICAgICAgICAgICBhcHBlYXJzIHRvIGJlIGEgdmVyc2lvbiBtaXNtYXRjaCwgc28gd2UgdGVsbCB0aGUgY2FsbGVyCi0gICAgICAgICAgICAgdG8gdHJ5IGEgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5LiAgKi8KLQkgIGdsb2JhbF92ZXJjaGVja19mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHJhbmRvbSBTSEZfQUxMT0MKLSAgIHNlY3Rpb25zIGluIHRoZSByaWdodCBzZWdtZW50LiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICpob2xkX3NlY3Rpb247Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF91c2U7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF90ZXh0Owotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcm9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2JzczsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JlbDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2ludGVycDsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcGxhY2U7Ci0gIGFzZWN0aW9uICpzbmV3LCAqKnBwczsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpvbGQ7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gIGV0cmVlX3R5cGUgKmFkZHJlc3M7Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWUsICpwczsKLSAgY29uc3QgY2hhciAqb3V0c2VjbmFtZTsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzY3JpcHQgdG8gc2VlIHdoZXJlIHRvIHBsYWNlIHRoaXMgc2VjdGlvbi4gICovCi0gIGhvbGRfc2VjdGlvbiA9IHM7Ci0gIGhvbGRfdXNlID0gTlVMTDsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOwotCi0gIGlmIChob2xkX3VzZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBwbGFjZWQgYSBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdXNlLT5jaGlsZHJlbiwgcywgaG9sZF91c2UsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCB0aGVuIGFsd2F5cyBwdXQgLmdudS53YXJuaW5nLlNZTUJPTAotICAgICBzZWN0aW9ucyBpbnRvIHRoZSAudGV4dCBzZWN0aW9uIHRvIGdldCB0aGVtIG91dCBvZiB0aGUgd2F5LiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnNoYXJlZAotICAgICAgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSA9PSAwCi0gICAgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB3aWxkX2RvaXQgKCZob2xkX3RleHQtPmNoaWxkcmVuLCBzLCBob2xkX3RleHQsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIERlY2lkZSB3aGljaCBzZWdtZW50IHRoZSBzZWN0aW9uIHNob3VsZCBnbyBpbiBiYXNlZCBvbiB0aGUKLSAgICAgc2VjdGlvbiBuYW1lIGFuZCBzZWN0aW9uIGZsYWdzLiAgV2UgcHV0IGxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zCi0gICAgIHJpZ2h0IGFmdGVyIHRoZSAuaW50ZXJwIHNlY3Rpb24sIHNvIHRoYXQgdGhlIFBUX05PVEUgc2VnbWVudCBpcwotICAgICBzdG9yZWQgcmlnaHQgYWZ0ZXIgdGhlIHByb2dyYW0gaGVhZGVycyB3aGVyZSB0aGUgT1MgY2FuIHJlYWQgaXQKLSAgICAgaW4gdGhlIGZpcnN0IHBhZ2UuICAqLwotICBwbGFjZSA9IE5VTEw7Ci0gIGlmIChzLT5mbGFncyAmIFNFQ19FWENMVURFKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIubm90ZSIsIDQpID09IDAKLSAgICAgICYmIGhvbGRfaW50ZXJwICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2ludGVycDsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2JzczsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwCi0JICAgJiYgaG9sZF9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2RhdGE7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKHNlY25hbWUsICIucmVsIiwgNCkgPT0gMAotCSAgICYmIGhvbGRfcmVsICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JlbDsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0NPREUpID09IDAKLQkgICAmJiAocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3JvZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yb2RhdGE7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF90ZXh0OwotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ2hvb3NlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBzZWN0aW9uLiAgVGhpcyB3aWxsIGJlIG5lZWRlZCBpZiB0aGUKLSAgICAgc2FtZSBzZWN0aW9uIG5hbWUgYXBwZWFycyBpbiB0aGUgaW5wdXQgZmlsZSB3aXRoIGRpZmZlcmVudAotICAgICBsb2FkYWJsZSBvciBhbGxvY2F0ZWFibGUgY2hhcmFjdGVyaXN0aWNzLiAgKi8KLSAgb3V0c2VjbmFtZSA9IHNlY25hbWU7Ci0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgY2hhciAqbmV3bmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKG91dHNlY25hbWUpOwotICAgICAgbmV3bmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBvdXRzZWNuYW1lKTsKLSAgICAgIGkgPSAwOwotICAgICAgZG8KLQl7Ci0JICBzcHJpbnRmIChuZXduYW1lICsgbGVuLCAiJWQiLCBpKTsKLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5ld25hbWUpICE9IE5VTEwpOwotCi0gICAgICBvdXRzZWNuYW1lID0gbmV3bmFtZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHB1dCBpdCBpbiB0aGUgcmlnaHQKLSAgICAgcGxhY2UuICBUaGlzIHNodWZmbGluZyBpcyB0byBtYWtlIHRoZSBvdXRwdXQgZmlsZSBsb29rIG5lYXRlci4gICovCi0gIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKTsKLSAgaWYgKHNuZXcgPT0gTlVMTCkKLSAgICAgIGVpbmZvICgiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iLAotCSAgICAgb3V0cHV0X2JmZC0+eHZlYy0+bmFtZSwgb3V0c2VjbmFtZSk7Ci0gIGlmIChwbGFjZS0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKHBwcyA9ICZvdXRwdXRfYmZkLT5zZWN0aW9uczsgKnBwcyAhPSBzbmV3OyBwcHMgPSAmKCpwcHMpLT5uZXh0KQotCTsKLSAgICAgICpwcHMgPSBzbmV3LT5uZXh0OwotICAgICAgc25ldy0+bmV4dCA9IHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dDsKLSAgICAgIHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dCA9IHNuZXc7Ci0gICAgfQotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBvbGQgPSBzdGF0X3B0cjsKLSAgc3RhdF9wdHIgPSAmYWRkOwotICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gIC8qIElmIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIGlzIHJlcHJlc2VudGFibGUgaW4gQywgdGhlbiBjcmVhdGUKLSAgICAgc3ltYm9scyB0byBtYXJrIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGZvciAocHMgPSBvdXRzZWNuYW1lOyAqcHMgIT0gJ1wwJzsgcHMrKykKLSAgICBpZiAoISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnBzKSAmJiAqcHMgIT0gJ18nKQotICAgICAgYnJlYWs7Ci0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIG91dHNlY25hbWUgKyBzaXplb2YgIl9fc3RhcnRfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdGFydF8lcyIsIG91dHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkJCQlleHBfaW50b3AgKChiZmRfdm1hKSAxCi0JCQkJCQkJICAgPDwgcy0+YWxpZ25tZW50X3Bvd2VyKSkpKTsKLSAgICB9Ci0KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICBhZGRyZXNzID0gTlVMTDsKLSAgZWxzZQotICAgIGFkZHJlc3MgPSBleHBfaW50b3AgKChiZmRfdm1hKSAwKTsKLQotICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAob3V0c2VjbmFtZSwgYWRkcmVzcywgMCwKLQkJCQkgICAgICAgKGJmZF92bWEpIDAsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwpOwotCi0gIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChvdXRzZWNuYW1lKTsKLSAgd2lsZF9kb2l0ICgmb3MtPmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0KLSAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgICAoKGJmZF92bWEpIDAsICIqZGVmYXVsdCoiLCAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopIE5VTEwpOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0KLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gb3V0c2VjbmFtZSArIHNpemVvZiAiX19zdG9wXyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RvcF8lcyIsIG91dHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlIG5ldyBzdGF0ZW1lbnQgbGlzdCByaWdodCBhZnRlciBQTEFDRS4gICovCi0gICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLSAgcGxhY2UtPmhlYWRlci5uZXh0ID0gYWRkLmhlYWQ7Ci0KLSAgc3RhdF9wdHIgPSBvbGQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb24tPm5hbWUpID09IDAKLSAgICAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiAoKGhvbGRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotCSAgPT0gKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKSkpCi0gICAgaG9sZF91c2UgPSBvczsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICBob2xkX3RleHQgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5yb2RhdGEiKSA9PSAwKQotICAgIGhvbGRfcm9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotICBlbHNlIGlmIChob2xkX3JlbCA9PSBOVUxMCi0JICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLQkgICAmJiAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICYmIHN0cm5jbXAgKG9zLT5uYW1lLCAiLnJlbCIsIDQpID09IDApCi0gICAgaG9sZF9yZWwgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5pbnRlcnAiKSA9PSAwKQotICAgIGhvbGRfaW50ZXJwID0gb3M7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgLyogV2UgY2FsbCByZWNvcmRfbGlua19hc3NpZ25tZW50IGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLgotCSBUaGlzIGlzIGJlY2F1c2UgaWYgaXQgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCB3ZQotCSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgZGVmaW5lZCBieSB0aGUgbGlua2VyIHNjcmlwdCwKLQkgbm90IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCAoYmVjYXVzZSB3ZSBhcmUgc2V0dGluZwotCSBzeW1ib2xzIGxpa2UgZXRleHQpLiAgSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhcgotCSBvYmplY3QsIHRoZW4sIGFzIGl0IGhhcHBlbnMsIGNhbGxpbmcgcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCSB3aWxsIGRvIG5vIGhhcm0uICAqLwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkJIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBleHAtPmFzc2lnbi5kc3QsCi0JCSAgZXhwLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfcHJvdmlkZSA/IHRydWUgOiBmYWxzZSkpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBhbmQKLSAgIHRlbGxzIHRoZSBFTEYgYmFja2VuZCBhYm91dCB0aGVtLCBpbiBjYXNlIHRoZXkgYXJlIGFzc2lnbm1lbnRzIHRvCi0gICBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSkKLSAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJwYXRoOwotICBhc2VjdGlvbiAqc2ludGVycDsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBFTEYgYmFja2VuZCBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCk7Ci0KLSAgLyogTGV0IHRoZSBFTEYgYmFja2VuZCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zIHJlcXVpcmVkCi0gICAgIGJ5IGR5bmFtaWMgbGlua2luZy4gICovCi0gIHJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBpZiAocnBhdGggPT0gTlVMTCkKLSAgICBycGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0gIGlmICghIChiZmRfZWxmJHtFTEZTSVpFfV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgICAgICAgIChvdXRwdXRfYmZkLCBjb21tYW5kX2xpbmUuc29uYW1lLCBycGF0aCwKLQkgIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYywgY29tbWFuZF9saW5lLmZpbHRlcl9zaGxpYiwKLQkgIChjb25zdCBjaGFyICogY29uc3QgKikgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzLAotCSAgJmxpbmtfaW5mbywgJnNpbnRlcnAsIGxhbmdfZWxmX3ZlcnNpb25faW5mbykpKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLQotICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIGR5bmFtaWMgbGlua2VyIHdlIGFyZSB1c2luZy4gICovCi0gIGlmIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgIT0gTlVMTAotICAgICAgJiYgc2ludGVycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpbnRlcnAtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcjsKLSAgICAgIHNpbnRlcnAtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLmludGVycHJldGVyKSArIDE7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGFueSBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcuICBBcyBhIEdOVSBleHRlbnNpb25zLAotICAgICB3ZSB0cmVhdCBzdWNoIHNlY3Rpb25zIGFzIGNvbnRhaW5pbmcgd2FybmluZyBtZXNzYWdlcy4gIFdlIHByaW50Ci0gICAgIG91dCB0aGUgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiB6ZXJvIG91dCB0aGUgc2VjdGlvbiBzaXplIHNvCi0gICAgIHRoYXQgaXQgZG9lcyBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlhc2VjdGlvbiAqczsKLQliZmRfc2l6ZV90eXBlIHN6OwotCWNoYXIgKm1zZzsKLQlib29sZWFuIHJldDsKLQotCWlmIChpcy0+anVzdF9zeW1zX2ZsYWcpCi0JICBjb250aW51ZTsKLQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZ251Lndhcm5pbmciKTsKLQlpZiAocyA9PSBOVUxMKQotCSAgY29udGludWU7Ci0KLQlzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzKTsKLQltc2cgPSB4bWFsbG9jICgoc2l6ZV90KSBzeiArIDEpOwotCWlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCi0JICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuZ251Lndhcm5pbmc6ICVFXG4iLAotCQkgaXMtPnRoZV9iZmQpOwotCW1zZ1tzel0gPSAnXDAnOwotCXJldCA9IGxpbmtfaW5mby5jYWxsYmFja3MtPndhcm5pbmcgKCZsaW5rX2luZm8sIG1zZywKLQkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSAgICBpcy0+dGhlX2JmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSAgICAoYmZkX3ZtYSkgMCk7Ci0JQVNTRVJUIChyZXQpOwotCWZyZWUgKG1zZyk7Ci0KLQkvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUsIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgY29weWluZyB0aGUKLQkgICB3YXJuaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQlzLT5fcmF3X3NpemUgPSAwOwotICAgICAgfQotICB9Ci0KLSAgLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YiBzZWN0aW9uICovCi0KLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlIGluZm9ybWF0aW9uICovCi0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZSBvcHRpb24/IGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgIG5vX3BpcGVsaW5lX2tub3dsZWRnZSkpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggUEFSQU1TKCh2b2lkKSkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0gIGlmICh0aHVtYl9lbnRyeV9zeW1ib2wgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIAotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB0aHVtYl9lbnRyeV9zeW1ib2wsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLSAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZmZlclszMl07Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIAotICAgICAgLyogU3BlY2lhbCBwcm9jZXNpbmcgaXMgcmVxdWlyZWQgZm9yIGEgVGh1bWIgZW50cnkgc3ltYm9sLiAgVGhlCi0JIGJvdHRvbSBiaXQgb2YgaXRzIGFkZHJlc3MgbXVzdCBiZSBzZXQuICAqLwotICAgICAgdmFsID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJICAgIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotCSAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgdmFsIHw9IDE7Ci0KLSAgICAgIC8qIE5vdyBjb252ZXJ0IHRoaXMgdmFsdWUgaW50byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW4gZW50cnlfc3ltYm9sCi0gICAgICAgICB3aGVyZSB0aGUgbGFuZ19maW5pc2goKSBmdW5jdGlvbiB3aWxsIHBpY2sgaXQgdXAuICAqLwotICAgICAgYnVmZmVyWzBdID0gJzAnOwotICAgICAgYnVmZmVyWzFdID0gJ3gnOwotICAgICAgCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmZmVyICsgMiwgdmFsKTsKLQotICAgICAgaWYgKGVudHJ5X3N5bWJvbCAhPSBOVUxMICYmIGVudHJ5X2Zyb21fY21kbGluZSkKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIpLAotCSAgICAgICB0aHVtYl9lbnRyeV9zeW1ib2wsIGVudHJ5X3N5bWJvbCk7Ci0gICAgICBlbnRyeV9zeW1ib2wgPSBidWZmZXI7Ci0gICAgfQotICBlbHNlCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjb25ub3QgZmluZCB0aHVtYiBzdGFydCBzeW1ib2wgJXNcbiIpLCB0aHVtYl9lbnRyeV9zeW1ib2wpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1pZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIiA7IHRoZW4KLSAgICAgICAgZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpIHJldHVybicgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLSAgICAgICAgc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHMgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWZpCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cyI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2gsIC8qIGZpbmlzaCAqLwotICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuLAotICBOVUxMLCAvKiBzZXRfc3ltYm9scyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAotICBOVUxMLCAvKiB1bnJlY29nbmlzZWQgZmlsZSAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMsCi0gIE5VTEwgLyogcmVjb2duaXplZCBmaWxlICovCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0gYi9sZC9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMmRmZTQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogZW11bGF0ZSB0aGUgb3JpZ2luYWwgZ2xkIGZvciB0aGUgZ2l2ZW4gJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2RlZmluZSBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICAvKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViIHNlY3Rpb24gKi8KLQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUgaW5mb3JtYXRpb24gKi8KLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lIG9wdGlvbj8ga3JrQGN5Z251cy5jb20gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoIWJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICZsaW5rX2luZm8sIDApKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIpLCBpcy0+ZmlsZW5hbWUpOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLwotICBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOwotfQotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotCi0gIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICB7Ci0gICAgICAvKiBUaGUgaW50ZXJ3b3JraW5nIGJmZCBtdXN0IGJlIHRoZSBsYXN0IG9uZSB0byBiZSBwcm9jZXNzZWQgKi8KLSAgICAgIGlmICghaXMtPm5leHQpCi0gICAgICAgICBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgKGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsIC8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLCAvKiBzZXRfc3ltYm9scyAqLwotICBOVUxMLAotICBOVUxMLCAvKiB1bnJlY29nbmlzZWQgZmlsZSAqLwotICBOVUxMCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYXN0cmluZy5zZWQgYi9sZC9lbXVsdGVtcGwvYXN0cmluZy5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmQ4YTYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2FzdHJpbmcuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMSBzL14vIi8KLTI1cy9cXCQvIi8KLTI2cy9eLyIvCi01MHMvXFwkLyIvCi01MXMvXi8iLwotNzVzL1xcJC8iLwotNzZzL14vIi8KLTEwMHMvXFwkLyIvCi0xMDFzL14vIi8KLSQgcy8kL24iLwotJCBzL1xcbiJuIiQvXFxuIi8KZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9iZW9zLmVtIGIvbGQvZW11bHRlbXBsL2Jlb3MuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDkwY2EuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2Jlb3MuZW0KKysrIC9kZXYvbnVsbApAQCAtMSw4MzcgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgV0lORE9XU19OVCAqLwotLyogVGhlIG9yaWdpbmFsIGZpbGUgZ2VuZXJhdGVkIHJldHVybmVkIGRpZmZlcmVudCBkZWZhdWx0IHNjcmlwdHMgZGVwZW5kaW5nCi0gICBvbiB3aGV0aGVyIGNlcnRhaW4gc3dpdGNoZXMgd2VyZSBzZXQsIGJ1dCB0aGVzZSBzd2l0Y2hlcyBwZXJ0YWluIHRvIHRoZQotICAgTGludXggc3lzdGVtIGFuZCB0aGF0IHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBjb2ZmLiAgSW4gdGhlIE5UIGNhc2UsIHdlCi0gICBvbmx5IGRldGVybWluZSBpZiB0aGUgc3Vic3lzdGVtIGlzIGNvbnNvbGUgb3Igd2luZG93cyBpbiBvcmRlciB0byBzZWxlY3QKLSAgIHRoZSBjb3JyZWN0IGVudHJ5IHBvaW50IGJ5IGRlZmF1bHQuICovIAotICAKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSNpZiAwIC8qIGFyZ3VtZW50IHRvIHFzb3J0IHNvIGRvbid0IHByb3RvdHlwZSAqLwotc3RhdGljIGludCBzb3J0X2J5X2ZpbGVfbmFtZSBQQVJBTVMgKCh2b2lkICosIHZvaWQgKikpOwotc3RhdGljIGludCBzb3J0X2J5X3NlY3Rpb25fbmFtZSBQQVJBTVMgKCh2b2lkICosIHZvaWQgKikpOwotI2VuZGlmCi1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnNvcnRfc2VjdGlvbnNfMQotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqLCBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICosIGludCwKLQkgICBpbnQgKCopKCkpKTsKLXN0YXRpYyB2b2lkIHNvcnRfc2VjdGlvbnMgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZTsKLXN0YXRpYyBpbnQgZGxsOwotCi1leHRlcm4gY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJhLmV4ZSI7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLX0KLQwKLS8qIFBFIGZvcm1hdCBleHRyYSBjb21tYW5kIGxpbmUgb3B0aW9ucy4gICovCi0KLS8qIFVzZWQgZm9yIHNldHRpbmcgZmxhZ3MgaW4gdGhlIFBFIGhlYWRlci4gKi8KLSNkZWZpbmUgT1BUSU9OX0JBU0VfRklMRQkJKDMwMCAgKyAxKQotI2RlZmluZSBPUFRJT05fRExMCQkJKE9QVElPTl9CQVNFX0ZJTEUgKyAxKQotI2RlZmluZSBPUFRJT05fRklMRV9BTElHTk1FTlQJCShPUFRJT05fRExMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNQUdFX0JBU0UJCShPUFRJT05fRklMRV9BTElHTk1FTlQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX0lNQUdFX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTgkJKE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OCShPUFRJT05fTUFKT1JfT1NfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OCShPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTgkJKE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OCShPUFRJT05fTUlOT1JfT1NfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVAkoT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUQUNLICAgICAgICAgICAgICAgICAgICAoT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NVQlNZU1RFTSAgICAgICAgICAgICAgICAoT1BUSU9OX1NUQUNLICsgMSkKLSNkZWZpbmUgT1BUSU9OX0hFQVAJCQkoT1BUSU9OX1NVQlNZU1RFTSArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7Ci0gIC8qIFBFIG9wdGlvbnMgKi8KLSAgICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKLSAgICB7ImRsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMfSwKLSAgICB7ImZpbGUtYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GSUxFX0FMSUdOTUVOVH0sCi0gICAgeyJoZWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUFQfSwgCi0gICAgeyJpbWFnZS1iYXNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTUFHRV9CQVNFfSwgCi0gICAgeyJtYWpvci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OfSwKLSAgICB7Im1ham9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX09TX1ZFUlNJT059LAotICAgIHsibWFqb3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgICB7Im1pbm9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT059LAotICAgIHsibWlub3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTn0sCi0gICAgeyJtaW5vci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT059LAotICAgIHsic2VjdGlvbi1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UfSwKLSAgICB7InN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFDS30sCi0gICAgeyJzdWJzeXN0ZW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVQlNZU1RFTX0sCi0gICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci0gIH07Ci0KLQotLyogUEUvV0lOMzI7IGFkZGVkIHJvdXRpbmVzIHRvIGdldCB0aGUgc3Vic3lzdGVtIHR5cGUsIGhlYXAgYW5kL29yIHN0YWNrCi0gICBwYXJhbWV0ZXJzIHdoaWNoIG1heSBiZSBpbnB1dCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB2b2lkICpwdHI7Ci0gIGludCBzaXplOwotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKnN5bWJvbDsKLSAgaW50IGluaXRlZDsKLX0gZGVmaW5mbzsKLQotI2RlZmluZSBEKGZpZWxkLHN5bWJvbCxkZWYpICB7JnBlLmZpZWxkLHNpemVvZihwZS5maWVsZCksIGRlZiwgc3ltYm9sLDB9Ci0KLXN0YXRpYyBkZWZpbmZvIGluaXRbXSA9Ci17Ci0gIC8qIGltYWdlYmFzZSBtdXN0IGJlIGZpcnN0ICovCi0jZGVmaW5lIElNQUdFQkFTRU9GRiAwCi0gIEQoSW1hZ2VCYXNlLCJfX2ltYWdlX2Jhc2VfXyIsIEJFT1NfRVhFX0lNQUdFX0JBU0UpLAotI2RlZmluZSBETExPRkYgMQotICB7JmRsbCwgc2l6ZW9mKGRsbCksIDAsICJfX2RsbF9fIn0sCi0gIEQoU2VjdGlvbkFsaWdubWVudCwiX19zZWN0aW9uX2FsaWdubWVudF9fIiwgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UKSwKLSAgRChGaWxlQWxpZ25tZW50LCJfX2ZpbGVfYWxpZ25tZW50X18iLCBQRV9ERUZfRklMRV9BTElHTk1FTlQpLAotICBEKE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19tYWpvcl9vc192ZXJzaW9uX18iLCA0KSwKLSAgRChNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWlub3Jfb3NfdmVyc2lvbl9fIiwgMCksCi0gIEQoTWFqb3JJbWFnZVZlcnNpb24sIl9fbWFqb3JfaW1hZ2VfdmVyc2lvbl9fIiwgMSksCi0gIEQoTWlub3JJbWFnZVZlcnNpb24sIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIiwgMCksCi0gIEQoTWFqb3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCA0KSwKLSAgRChNaW5vclN1YnN5c3RlbVZlcnNpb24sIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsIDApLAotICBEKFN1YnN5c3RlbSwiX19zdWJzeXN0ZW1fXyIsIDMpLAotICBEKFNpemVPZlN0YWNrUmVzZXJ2ZSwiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsIDB4MjAwMDAwMCksCi0gIEQoU2l6ZU9mU3RhY2tDb21taXQsIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIsIDB4MTAwMCksCi0gIEQoU2l6ZU9mSGVhcFJlc2VydmUsIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsIDB4MTAwMDAwKSwKLSAgRChTaXplT2ZIZWFwQ29tbWl0LCJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIsIDB4MTAwMCksCi0gIEQoTG9hZGVyRmxhZ3MsIl9fbG9hZGVyX2ZsYWdzX18iLCAweDApLAotICB7IE5VTEwsIDAsIDAsIE5VTEwsIDAgfQotfTsKLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX25hbWUgKG5hbWUsIHZhbCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGludCBpOwotICAvKiBGaW5kIHRoZSBuYW1lIGFuZCBzZXQgaXQuICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ucHRyOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgaW5pdFtpXS5zeW1ib2wpID09IDApCi0JewotCSAgaW5pdFtpXS52YWx1ZSA9IHZhbDsKLQkgIGluaXRbaV0uaW5pdGVkID0gMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBhYm9ydCgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfc3Vic3lzdGVtICgpCi17Ci0gIGNvbnN0IGNoYXIgKnN2ZXI7Ci0gIGludCBsZW47Ci0gIGludCBpOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IAotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjb25zdCBpbnQgdmFsdWU7Ci0gICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICB9Ci0gIHZbXSA9Ci0gICAgewotICAgICAgeyAibmF0aXZlIiwgMSwgIl9OdFByb2Nlc3NTdGFydHVwIiB9LAotICAgICAgeyAid2luZG93cyIsIDIsICJfV2luTWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJ3d2luZG93cyIsIDIsICJfd1dpbk1haW5DUlRTdGFydHVwIiB9LAotICAgICAgeyAiY29uc29sZSIsIDMsICJfbWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJ3Y29uc29sZSIsIDMsICJfd21haW5DUlRTdGFydHVwIiB9LAotI2lmIDAKLSAgICAgIC8qIFRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IHJlY29nbml6ZSB0aGlzLiAgKi8KLSAgICAgIHsgIm9zMiIsIDUsICIiIH0sCi0jZW5kaWYKLSAgICAgIHsgInBvc2l4IiwgNywgIl9fX1Bvc2l4UHJvY2Vzc1N0YXJ0dXAifSwKLSAgICAgIHsgMCwgMCwgMCB9Ci0gICAgfTsKLQotICBzdmVyID0gc3RyY2hyIChvcHRhcmcsICc6Jyk7Ci0gIGlmIChzdmVyID09IE5VTEwpCi0gICAgbGVuID0gc3RybGVuIChvcHRhcmcpOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZW5kOwotCi0gICAgICBsZW4gPSBzdmVyIC0gb3B0YXJnOwotICAgICAgc2V0X3BlX25hbWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLAotCQkgICBzdHJ0b3VsIChzdmVyICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgPT0gJy4nKQotCXNldF9wZV9uYW1lICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgICBzdHJ0b3VsIChlbmQgKyAxLCAmZW5kLCAwKSk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIik7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IHZbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChvcHRhcmcsIHZbaV0ubmFtZSwgbGVuKSA9PSAwCi0JICAmJiB2W2ldLm5hbWVbbGVuXSA9PSAnXDAnKQotCXsKLQkgIHNldF9wZV9uYW1lICgiX19zdWJzeXN0ZW1fXyIsIHZbaV0udmFsdWUpOwotCi0JICAvKiBJZiB0aGUgc3Vic3lzdGVtIGlzIHdpbmRvd3MsIHdlIHVzZSBhIGRpZmZlcmVudCBlbnRyeQotCSAgICAgcG9pbnQuICBXZSBhbHNvIHJlZ2lzdGVyIHRoZSBlbnRyeSBwb2ludCBhcyBhbiB1bmRlZmluZWQKLQkgICAgIHN5bWJvbC4gZnJvbSBsYW5nX2FkZF9lbnRyeSgpIFRoZSByZWFzb24gd2UgZG8KLQkgICAgIHRoaXMgaXMgc28gdGhhdCB0aGUgdXNlcgotCSAgICAgZG9lc24ndCBoYXZlIHRvIGJlY2F1c2UgdGhleSB3b3VsZCBoYXZlIHRvIHVzZSB0aGUgLXUKLQkgICAgIHN3aXRjaCBpZiB0aGV5IHdlcmUgc3BlY2lmeWluZyBhbiBlbnRyeSBwb2ludCBvdGhlciB0aGFuCi0JICAgICBfbWFpbkNSVFN0YXJ0dXAuICBTcGVjaWZpY2FsbHksIGlmIGNyZWF0aW5nIGEgd2luZG93cwotCSAgICAgYXBwbGljYXRpb24sIGVudHJ5IHBvaW50IF9XaW5NYWluQ1JUU3RhcnR1cCBtdXN0IGJlCi0JICAgICBzcGVjaWZpZWQuICBXaGF0IEkgaGF2ZSBmb3VuZCBmb3Igbm9uIGNvbnNvbGUKLQkgICAgIGFwcGxpY2F0aW9ucyAoZW50cnkgbm90IF9tYWluQ1JUU3RhcnR1cCkgaXMgdGhhdCB0aGUgLm9iagotCSAgICAgdGhhdCBjb250YWlucyBtYWluQ1JUU3RhcnR1cCBpcyBicm91Z2h0IGluIHNpbmNlIGl0IGlzCi0JICAgICB0aGUgZmlyc3QgZW5jb3VudGVyZWQgaW4gbGliYy5saWIgYW5kIGl0IGhhcyBvdGhlcgotCSAgICAgc3ltYm9scyBpbiBpdCB3aGljaCB3aWxsIGJlIHB1bGxlZCBpbiBieSB0aGUgbGluawotCSAgICAgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIGFkZGluZyAtdSB3aXRoIHRoZSBlbnRyeSBwb2ludAotCSAgICAgbmFtZSBzcGVjaWZpZWQgZm9yY2VzIHRoZSBjb3JyZWN0IC5vYmogdG8gYmUgdXNlZC4gIFdlCi0JICAgICBjYW4gYXZvaWQgbWFraW5nIHRoZSB1c2VyIGRvIHRoaXMgYnkgYWx3YXlzIGFkZGluZyB0aGUKLQkgICAgIGVudHJ5IHBvaW50IG5hbWUgYXMgYW4gdW5kZWZpbmVkIHN5bWJvbC4gICovCi0JICBsYW5nX2FkZF9lbnRyeSAodltpXS5lbnRyeSwgMSk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlaW5mbyAoIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIsIG9wdGFyZyk7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3ZhbHVlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotICAgICAKLXsKLSAgY2hhciAqZW5kOwotICBzZXRfcGVfbmFtZSAobmFtZSwgIHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCkpOwotICBpZiAoZW5kID09IG9wdGFyZykKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIsIG9wdGFyZyk7Ci0gICAgfQotCi0gIG9wdGFyZyA9IGVuZDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdGFja19oZWFwIChyZXNuYW1lLCBjb21uYW1lKQotICAgICBjaGFyICpyZXNuYW1lOwotICAgICBjaGFyICpjb21uYW1lOwotewotICBzZXRfcGVfdmFsdWUgKHJlc25hbWUpOwotICBpZiAoKm9wdGFyZyA9PSAnLCcpCi0gICAgewotICAgICAgb3B0YXJnKys7Ci0gICAgICBzZXRfcGVfdmFsdWUgKGNvbW5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wdGFyZykKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQJUY6IHN0cmFuZ2UgaGV4IGluZm8gZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iLCBvcHRhcmcpOwotICAgIH0KLX0KLQotCi0KLXN0YXRpYyBpbnQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICB3YW50ZXJyb3IgPSBvcHRlcnI7Ci0KLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi0iLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfRklMRToKLSAgICAgIGxpbmtfaW5mby5iYXNlX2ZpbGUgPSAoUFRSKSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XQik7Ci0gICAgICBpZiAobGlua19pbmZvLmJhc2VfZmlsZSA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIiwKLQkJICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBQRSBvcHRpb25zICovCi0gICAgY2FzZSBPUFRJT05fSEVBUDogCi0gICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsICJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1RBQ0s6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VCU1lTVEVNOgotICAgICAgc2V0X3BlX3N1YnN5c3RlbSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfb3NfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9GSUxFX0FMSUdOTUVOVDoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fZmlsZV9hbGlnbm1lbnRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX3NlY3Rpb25fYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RMTDoKLSAgICAgIHNldF9wZV9uYW1lICgiX19kbGxfXyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9faW1hZ2VfYmFzZV9fIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotDAotLyogQXNzaWduIHZhbHVlcyB0byB0aGUgc3BlY2lhbCBzeW1ib2xzIGJlZm9yZSB0aGUgbGlua2VyIHNjcmlwdCBpcwotICAgcmVhZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMoKQotewotICAvKiBSdW4gdGhyb3VnaCBhbmQgaW52ZW50IHN5bWJvbHMgZm9yIGFsbCB0aGUKLSAgICAgbmFtZXMgYW5kIGluc2VydCB0aGUgZGVmYXVsdHMuICovCi0gIGludCBqOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnNhdmU7Ci0KLSAgaWYgKCFpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkKQotICAgIHsKLSAgICAgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlIGlmIChpbml0W0RMTE9GRl0udmFsdWUpCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gQkVPU19ETExfSU1BR0VfQkFTRTsKLSAgICAgIGVsc2UKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBCRU9TX0VYRV9JTUFHRV9CQVNFOwotICAgIH0KLQotICAvKiBEb24ndCBkbyBhbnkgc3ltYm9sIGFzc2lnbm1lbnRzIGlmIHRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICAvKiBHbHVlIHRoZSBhc3NpZ25tZW50cyBpbnRvIHRoZSBhYnMgc2VjdGlvbiAqLwotICBzYXZlID0gc3RhdF9wdHI7Ci0KLSAgc3RhdF9wdHIgPSAmKGFic19vdXRwdXRfc2VjdGlvbi0+Y2hpbGRyZW4pOwotCi0gIGZvciAoaiA9IDA7IGluaXRbal0ucHRyOyBqKyspCi0gICAgewotICAgICAgbG9uZyB2YWwgPSBpbml0W2pdLnZhbHVlOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScgLGluaXRbal0uc3ltYm9sLCBleHBfaW50b3AgKHZhbCkpKTsKLSAgICAgIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKHNob3J0KSkKLQkqKHNob3J0ICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGludCkpCi0JKihpbnQgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YobG9uZykpCi0JKihsb25nICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICAvKiBUaGlzIG1pZ2h0IGJlIGEgbG9uZyBsb25nIG9yIG90aGVyIHNwZWNpYWwgdHlwZS4gICovCi0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGJmZF92bWEpKQotCSooYmZkX3ZtYSAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZQlhYm9ydCgpOwotICAgIH0KLSAgLyogUmVzdG9yZSB0aGUgcG9pbnRlci4gKi8KLSAgc3RhdF9wdHIgPSBzYXZlOwotICAKLSAgaWYgKHBlLkZpbGVBbGlnbm1lbnQgPgotICAgICAgcGUuU2VjdGlvbkFsaWdubWVudCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4oKQotewotICAvKiBQYXNzIHRoZSB3YWNreSBQRSBjb21tYW5kIGxpbmUgb3B0aW9ucyBpbnRvIHRoZSBvdXRwdXQgYmZkLgotICAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgYSBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYnkKLSAgICAgaW5jbHVkaW5nIGFuIGludGVybmFsIEJGRCBoZWFkZXIuICAqLwotICBpZiAoIWNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpCi0gICAgewotICAgICAgZWluZm8gKCIlRiVQOiBQRSBvcGVyYXRpb25zIG9uIG5vbiBQRSBmaWxlLlxuIik7Ci0gICAgfQotCi0gIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkciA9IHBlOwotICBwZV9kYXRhKG91dHB1dF9iZmQpLT5kbGwgPSBpbml0W0RMTE9GRl0udmFsdWU7Ci0KLX0KLQwKLS8qIENhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgcXNvcnQgaW4gc29ydF9zZWN0aW9ucy4gKi8KLQotc3RhdGljIGludAotc29ydF9ieV9maWxlX25hbWUgKGEsIGIpCi0gICAgIHZvaWQgKmE7Ci0gICAgIHZvaWQgKmI7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYSA9IGE7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYiA9IGI7Ci0gIGludCBpLCBhX3NlYywgYl9zZWM7Ci0KLSAgaSA9IHN0cmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lLAotCSAgICAgICgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLT5teV9hcmNoaXZlLT5maWxlbmFtZSk7Ci0gIGlmIChpICE9IDApCi0gICAgcmV0dXJuIGk7Ci0KLSAgaSA9IHN0cmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPmZpbGVuYW1lLAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPmZpbGVuYW1lKTsKLSAgaWYgKGkgIT0gMCkKLSAgICByZXR1cm4gaTsKLSAgLyogdGhlIHRhaWwgaWRhdGE0LzUgYXJlIHRoZSBvbmx5IG9uZXMgd2l0aG91dCByZWxvY3MgdG8gYW4KLSAgICAgaWRhdGEkNiBzZWN0aW9uIHVubGVzcyB3ZSBhcmUgaW1wb3J0aW5nIGJ5IG9yZGluYWwsIAotICAgICBzbyBzb3J0IHRoZW0gdG8gbGFzdCB0byB0ZXJtaW5hdGUgdGhlIElBVAotICAgICBhbmQgSE5UIHByb3Blcmx5LiBpZiBubyByZWxvYyB0aGlzIG9uZSBpcyBpbXBvcnQgYnkgb3JkaW5hbAotICAgICBzbyB3ZSBoYXZlIHRvIHNvcnQgYnkgc2VjdGlvbiBjb250ZW50cyAqLwotCi0gIGlmICggKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ICsgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQpICkKLSAgICB7Ci0gICAgICAgaSA9ICAoKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ID4gCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCkgPyAtMSA6IDApOwotICAgICAgIGlmICggaSAhPSAwKQotICAgICAgICAgcmV0dXJuIGk7Ci0KLSAgICAgICAgcmV0dXJuICAoKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ID4gCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCkgPyAwIDogMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgIGlmICggKHN0cmNtcCggKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQ2IikgPT0gMCkgKQotICAgICAgICAgIHJldHVybiAwOyAvKiBkb24ndCBzb3J0IC5pZGF0YSQ2IG9yIC5pZGF0YSQ3IEZJWE1FIGRsbHRvb2wgZWxpbWluYXRlIC5pZGF0YSQ3ICovCi0KLSAgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLCAKLSAgICAgICAgICgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24sICZhX3NlYywgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSlzaXplb2YoYV9zZWMpKSkKLSAgICAgICAgICAgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5pZGF0YTogJUVcbiIsCi0gICAgICAgICAgICAgICAgICgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkKTsKLQotICAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQsIAotICAgICAgICAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLCAmYl9zZWMsIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpc2l6ZW9mKGJfc2VjKSApKQotICAgICAgICAgICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuaWRhdGE6ICVFXG4iLAotICAgICAgICAgICAgICAgICgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkKTsKLQotICAgICAgaSA9ICAoKGFfc2VjIDwgYl9zZWMpID8gLTEgOiAwKTsKLSAgICAgIGlmICggaSAhPSAwKQotICAgICAgICByZXR1cm4gaTsKLSAgICAgIHJldHVybiAgKChhX3NlYyA8IGJfc2VjKSA/IDAgOiAxKTsKLSAgIH0KLXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zb3J0X2J5X3NlY3Rpb25fbmFtZSAoYSwgYikKLSAgICAgdm9pZCAqYTsKLSAgICAgdm9pZCAqYjsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJhID0gYTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJiID0gYjsKLSAgaW50IGk7Ci0gIGkgPSBzdHJjbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lKTsKLS8qIHRoaXMgaXMgYSBoYWNrIHRvIG1ha2UgLnN0YWIgYW5kIC5zdGFic3RyIGxhc3QsIHNvIHdlIGRvbid0IGhhdmUKLSAgIHRvIGZpeCBzdHJpcC9vYmpjb3B5IGZvciAucmVsb2Mgc2VjdGlvbnMuCi0gICBGSVhNRSBzdHJpcHBpbmcgaW1hZ2VzIHdpdGggYSAucnNyYyBzZWN0aW9uIHN0aWxsIG5lZWRzIHRvIGJlIGZpeGVkICovCi0gIGlmICggaSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoc3RybmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICAgICAgICAgJiYgKHN0cm5jbXAgKCgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsICIuc3RhYiIsIDUpICE9IDApKQotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0gIHJldHVybiBpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIHNvcnRfc2VjdGlvbnMgdG8gYSBjb250aWd1b3VzIHN1YnNldCBvZiBhIGxpc3Qgb2Ygc2VjdGlvbnMuCi0gICBORVhUX0FGVEVSIGlzIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IG9uZSB0byBzb3J0LgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgZWxlbWVudCdzICJuZXh0IiBwb2ludGVyLiAgKi8KLQotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKioKLXNvcnRfc2VjdGlvbnNfMSAoc3RhcnRwdHIsIG5leHRfYWZ0ZXIsIGNvdW50LCBzb3J0X2Z1bmMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipzdGFydHB0ciwqbmV4dF9hZnRlcjsKLSAgICAgaW50IGNvdW50OwotICAgICBpbnQgKCpzb3J0X2Z1bmMpICgpOwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqdmVjOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpwOwotICBpbnQgaTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJldDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gc3RhcnRwdHI7Ci0KLSAgdmVjID0gKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqKQotCSB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSkpOwotCi0gIGZvciAocCA9ICpzdGFydHB0ciwgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwID0gcC0+bmV4dCkKLSAgICB2ZWNbaV0gPSBwOwotCi0gIHFzb3J0ICh2ZWMsIGNvdW50LCBzaXplb2YgKHZlY1swXSksIHNvcnRfZnVuYyk7Ci0KLSAgLyogRmlsbCBpbiB0aGUgbmV4dCBwb2ludGVycyBhZ2Fpbi4gKi8KLSAgKnN0YXJ0cHRyID0gdmVjWzBdOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspCi0gICAgdmVjW2ldLT5oZWFkZXIubmV4dCA9IHZlY1tpICsgMV07Ci0gIHZlY1tpXS0+aGVhZGVyLm5leHQgPSBuZXh0X2FmdGVyOwotICByZXQgPSAmdmVjW2ldLT5oZWFkZXIubmV4dDsKLSAgZnJlZSAodmVjKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU29ydCB0aGUgLmlkYXRhXCRmb28gaW5wdXQgc2VjdGlvbnMgb2YgYXJjaGl2ZXMgaW50byBmaWxlbmFtZSBvcmRlci4KLSAgIFRoZSByZWFzb24gaXMgc28gZGxsdG9vbCBjYW4gYXJyYW5nZSB0byBoYXZlIHRoZSBwZSBkbGwgaW1wb3J0IGluZm9ybWF0aW9uCi0gICBnZW5lcmF0ZWQgY29ycmVjdGx5IC0gdGhlIGhlYWQgb2YgdGhlIGxpc3QgZ29lcyBpbnRvIGRoLm8sIHRoZSB0YWlsIGludG8KLSAgIGR0Lm8sIGFuZCB0aGUgZ3V0cyBpbnRvIGRzW25ubm5dLm8uICBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlCi0gICAuaWRhdGEgc2VjdGlvbi4KLSAgIEZJWE1FOiBUaGlzIG1heSBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4gIEluc3RlYWQgb2YKLSAgIHNvcnRpbmcgb24gZGgubywgZHNbbm5ubl0ubywgZHQubywgb25lIGNvdWxkLCBmb3IgZXhhbXBsZSwgaGF2ZSBkaC5vIHVzZQotICAgLmlkYXRhXCQ0aCwgaGF2ZSBkc1tubm5uXS5vIHVzZSAuaWRhdGFcJDRzW25ubm5dLCBhbmQgaGF2ZSBkdC5vIHVzZSAuaWRhdGFcJDR0LgotICAgVGhpcyB3b3VsZCBoYXZlIHRvIGJlIGVsYWJvcmF0ZWQgdXBvbiB0byBoYW5kbGUgbXVsdGlwbGUgZGxsJ3MKLSAgIFthc3N1bWluZyBzdWNoIGFuIGVsb2JvcmF0aW9uIGlzIHBvc3NpYmxlIG9mIGNvdXJzZV0uCi0KLSAgIFdlIGFsc28gc29ydCBzZWN0aW9ucyBpbiAnXCQnIHdpbGQgc3RhdGVtZW50cy4gIFRoZXNlIGFyZSBjcmVhdGVkIGJ5IHRoZQotICAgcGxhY2Vfb3JwaGFucyByb3V0aW5lIHRvIGltcGxlbWVudCBncm91cGVkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvcnRfc2VjdGlvbnMgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGZvciAoOyBzIDsgcyA9IHMtPm5leHQpCi0gICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQlzb3J0X3NlY3Rpb25zIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQl7Ci0JICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcCA9ICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkOwotCi0JICAvKiBJcyB0aGlzIHRoZSAuaWRhdGEgc2VjdGlvbj8gICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lICE9IE5VTEwKLQkgICAgICAmJiBzdHJuY21wIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsICIuaWRhdGEiLCA2KSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU29ydCB0aGUgY2hpbGRyZW4uICBXZSB3YW50IHRvIHNvcnQgYW55IG9iamVjdHMgaW4KLSAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXJjaGl2ZS4gIEluIG9yZGVyIHRvIGhhbmRsZSB0aGUgY2FzZSBvZgotICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgYSBzaW5nbGUgYXJjaGl2ZSBtdWx0aXBsZSB0aW1lcywgd2Ugc29ydAotICAgICAgICAgICAgICAgICBhbGwgdGhlIGNoaWxkcmVuIGJ5IGFyY2hpdmUgbmFtZSBhbmQgdGhlbiBieSBvYmplY3QKLSAgICAgICAgICAgICAgICAgbmFtZS4gIEFmdGVyIHNvcnRpbmcgdGhlbSwgd2UgcmUtdGhyZWFkIHRoZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgIGNoYWluLiAgKi8KLQotCSAgICAgIHdoaWxlICgqcCkKLQkJewotCQkgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXJ0ID0gKnA7Ci0JCSAgaWYgKHN0YXJ0LT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCQkgICAgICB8fCAhc3RhcnQtPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQtPm15X2FyY2hpdmUpCi0JCSAgICBwID0gJihzdGFydC0+aGVhZGVyLm5leHQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqZW5kOwotCQkgICAgICBpbnQgY291bnQ7Ci0KLQkJICAgICAgZm9yIChlbmQgPSBzdGFydCwgY291bnQgPSAwOwotCQkJICAgZW5kICYmIGVuZC0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW07Ci0JCQkgICBlbmQgPSBlbmQtPm5leHQpCi0JCQljb3VudCsrOwotCi0JCSAgICAgIHAgPSBzb3J0X3NlY3Rpb25zXzEgKHAsIGVuZCwgY291bnQsIHNvcnRfYnlfZmlsZV9uYW1lKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIGdyb3VwZWQgc2VjdGlvbnMsIHNvcnQgdGhlbS4KLQkgICAgIFRoZSBsaW5rZXIgc2NyaXB0IG11c3QgZXhwbGljaXRseSBtZW50aW9uICIqKC5mb29cJCkiIG9yCi0JICAgICAiKiguZm9vXCQqKSIuICBEb24ndCBzb3J0IHRoZW0gaWYgXCQgaXMgbm90IHRoZSBsYXN0Ci0JICAgICBjaGFyYWN0ZXIgKG5vdCBzdXJlIGlmIHRoaXMgaXMgcmVhbGx5IHVzZWZ1bCwgYnV0IGl0Ci0JICAgICBhbGxvd3MgZXhwbGljaXRseSBtZW50aW9uaW5nIHNvbWUgXCQgc2VjdGlvbnMgYW5kIGxldHRpbmcKLQkgICAgIHRoZSBsaW5rZXIgaGFuZGxlIHRoZSByZXN0KS4gICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGFyICpxID0gc3RyY2hyIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsICdcJCcpOwotCi0JICAgICAgaWYgKHEgIT0gTlVMTAotCQkgICYmIChxWzFdID09ICdcMCcKLQkJICAgICAgfHwgKHFbMV0gPT0gJyonICYmIHFbMl0gPT0gJ1wwJykpKQotCQl7Ci0JCSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqZW5kOwotCQkgIGludCBjb3VudDsKLQotCQkgIGZvciAoZW5kID0gKnAsIGNvdW50ID0gMDsgZW5kOyBlbmQgPSBlbmQtPm5leHQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChlbmQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCQkJYWJvcnQgKCk7Ci0JCSAgICAgIGNvdW50Kys7Ci0JCSAgICB9Ci0JCSAgKHZvaWQpIHNvcnRfc2VjdGlvbnNfMSAocCwgZW5kLCBjb3VudCwgc29ydF9ieV9zZWN0aW9uX25hbWUpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotfQotCi1zdGF0aWMgdm9pZCAgCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24oKQotewotICBleHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzdGF0X3B0cjsKLQotI2lmZGVmIFRBUkdFVF9JU19wcGNwZQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IHRvYyBpbmZvcm1hdGlvbiAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24oaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQotCSAgewotCSAgICBlaW5mbygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIiwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uICgmbGlua19pbmZvKTsKLSNlbHNlCi0jaWZkZWYgVEFSR0VUX0lTX2FybXBlCi0gIC8qIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViCi0gICAgIHNlY3Rpb24uCi0KLSAgICAgSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlCi0gICAgIGluZm9ybWF0aW9uLiAgRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lCi0gICAgIG9wdGlvbj8gIGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFhcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKSkKLQkgIHsKLQkgICAgZWluZm8gKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOwotI2VuZGlmIC8qIFRBUkdFVF9JU19hcm1wZSAqLwotI2VuZGlmIC8qIFRBUkdFVF9JU19wcGNwZSAqLwotCi0gIHNvcnRfc2VjdGlvbnMgKHN0YXRfcHRyLT5oZWFkKTsKLX0KLQwKLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHNlY3Rpb25zIHdpdGggYSAnXCQnIGluIHRoZW0KLSAgIGludG8gdGhlIHJpZ2h0IHBsYWNlLiAgQW55IHNlY3Rpb24gd2l0aCBhICdcJCcgaW4gdGhlbSAoZS5nLiAudGV4dFwkZm9vKQotICAgZ2V0cyBtYXBwZWQgdG8gdGhlIG91dHB1dCBzZWN0aW9uIHdpdGggZXZlcnl0aGluZyBmcm9tIHRoZSAnXCQnIG9uIHN0cmlwcGVkCi0gICAoZS5nLiAudGV4dCkuCi0gICBTZWUgdGhlIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0Ci0gICBTcGVjaWZpY2F0aW9uIDQuMSwgc2VjdGlvbiA0LjIsIEdyb3VwZWQgU2VjdGlvbnMuCi0KLSAgIEZJWE1FOiBUaGlzIGlzIG5vdyBoYW5kbGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IHVzaW5nIHdpbGRjYXJkcywKLSAgIGJ1dCBJJ20gbGVhdmluZyB0aGlzIGhlcmUgaW4gY2FzZSB3ZSB3YW50IHRvIGVuYWJsZSBpdCBmb3Igc2VjdGlvbnMKLSAgIHdoaWNoIGFyZSBub3QgbWVudGlvbmVkIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgY2hhciAqb3V0cHV0X3NlY25hbWUsICpwczsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmw7Ci0KLSAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRG9uJ3QgcHJvY2VzcyBncm91cGVkIHNlY3Rpb25zIHVubGVzcyBkb2luZyBhIGZpbmFsIGxpbmsuCi0gICAgIElmIHRoZXkncmUgbWFya2VkIGFzIENPTURBVCBzZWN0aW9ucywgd2UgZG9uJ3Qgd2FudCAudGV4dFwkZm9vIHRvCi0gICAgIGVuZCB1cCBpbiAudGV4dCBhbmQgdGhlbiBoYXZlIC50ZXh0IGRpc2FwcGVhciBiZWNhdXNlIGl0J3MgbWFya2VkCi0gICAgIGxpbmstb25jZS1kaXNjYXJkLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIEV2ZXJ5dGhpbmcgZnJvbSB0aGUgJ1wkJyBvbiBnZXRzIGRlbGV0ZWQgc28gZG9uJ3QgYWxsb3cgJ1wkJyBhcyB0aGUKLSAgICAgZmlyc3QgY2hhcmFjdGVyLiAgKi8KLSAgaWYgKCpzZWNuYW1lID09ICdcJCcpCi0gICAgZWluZm8gKCIlUCVGOiBzZWN0aW9uICVzIGhhcyAnXCQnIGFzIGZpcnN0IGNoYXJhY3RlclxuIiwgc2VjbmFtZSk7Ci0gIGlmIChzdHJjaHIgKHNlY25hbWUgKyAxLCAnXCQnKSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb29rIHVwIHRoZSBvdXRwdXQgc2VjdGlvbi4gIFRoZSBNaWNyb3NvZnQgc3BlY3Mgc2F5IHNlY3Rpb25zIG5hbWVzIGluCi0gICAgIGltYWdlIGZpbGVzIG5ldmVyIGNvbnRhaW4gYSAnXCQnLiAgRm9ydHVuYXRlbHksIGxhbmdfLi4uX2xvb2t1cCBjcmVhdGVzCi0gICAgIHRoZSBzZWN0aW9uIGlmIGl0IGRvZXNuJ3QgZXhpc3QuICAqLwotICBvdXRwdXRfc2VjbmFtZSA9IGJ1eXN0cmluZyAoc2VjbmFtZSk7Ci0gIHBzID0gc3RyY2hyIChvdXRwdXRfc2VjbmFtZSArIDEsICdcJCcpOwotICAqcHMgPSAwOwotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0cHV0X3NlY25hbWUpOwotCi0gIC8qIEZpbmQgdGhlICdcJCcgd2lsZCBzdGF0ZW1lbnQgZm9yIHRoaXMgc2VjdGlvbi4gIFdlIGN1cnJlbnRseSByZXF1aXJlIHRoZQotICAgICBsaW5rZXIgc2NyaXB0IHRvIGV4cGxpY2l0bHkgbWVudGlvbiAiKiguZm9vXCQpIi4KLSAgICAgRklYTUU6IHBwY3BlLnNjIGhhcyAuQ1JUXCRmb28gaW4gdGhlIC5yZGF0YSBzZWN0aW9uLiAgQWNjb3JkaW5nIHRvIHRoZQotICAgICBNaWNyb3NvZnQgZG9jcyB0aGlzIGlzbid0IGNvcnJlY3Qgc28gaXQncyBub3QgKGN1cnJlbnRseSkgaGFuZGxlZC4gICovCi0KLSAgcHNbMF0gPSAnXCQnOwotICBwc1sxXSA9IDA7Ci0gIGZvciAobCA9IG9zLT5jaGlsZHJlbi5oZWFkOyBsOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobC0+aGVhZGVyLnR5cGUgPT0gbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtCi0JICAmJiBzdHJjbXAgKGwtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgb3V0cHV0X3NlY25hbWUpID09IDApCi0JYnJlYWs7Ci0gICAgfQotICBwc1swXSA9IDA7Ci0gIGlmIChsID09IE5VTEwpCi0jaWYgMQotICAgIGVpbmZvICgiJVAlRjogKiglc1wkKSBtaXNzaW5nIGZyb20gbGlua2VyIHNjcmlwdFxuIiwgb3V0cHV0X3NlY25hbWUpOwotI2Vsc2UgLyogRklYTUU6IFRoaXMgYmxvY2sgaXMgdW50cmllZC4gIEl0IGV4aXN0cyB0byBjb252ZXkgdGhlIGludGVudCwKLQkgc2hvdWxkIG9uZSBkZWNpZGUgdG8gbm90IHJlcXVpcmUgKiguZm9vXCQpIHRvIGFwcGVhciBpbiB0aGUgbGlua2VyCi0JIHNjcmlwdC4gICovCi0gICAgewotICAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJCQkJCSZvcy0+Y2hpbGRyZW4pOwotICAgICAgbmV3LT5zZWN0aW9uX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKG91dHB1dF9zZWNuYW1lKSArIDIpOwotICAgICAgc3ByaW50ZiAobmV3LT5zZWN0aW9uX25hbWUsICIlc1wkIiwgb3V0cHV0X3NlY25hbWUpOwotICAgICAgbmV3LT5maWxlbmFtZSA9IE5VTEw7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoJm5ldy0+Y2hpbGRyZW4pOwotICAgICAgbCA9IG5ldzsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBMaW5rIHRoZSBpbnB1dCBzZWN0aW9uIGluIGFuZCB3ZSdyZSBkb25lIGZvciBub3cuCi0gICAgIFRoZSBzZWN0aW9ucyBzdGlsbCBoYXZlIHRvIGJlIHNvcnRlZCwgYnV0IHRoYXQgaGFzIHRvIHdhaXQgdW50aWwKLSAgICAgYWxsIHN1Y2ggc2VjdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSB1cy4gIFRoZSBzb3J0aW5nIGlzIGRvbmUgYnkKLSAgICAgc29ydF9zZWN0aW9ucy4gICovCi0gIHdpbGRfZG9pdCAoJmwtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi1zdGF0aWMgY2hhciAqCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsIC8qIGZpbmlzaCAqLwotICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLCAvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbSBiL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmZjRkOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZWxmMzIuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTg1ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLSMgVGhpcyBmaWxlIGlzIG5vdyBtaXNuYW1lZCwgYmVjYXVzZSBpdCBzdXBwb3J0cyBib3RoIDMyIGJpdCBhbmQgNjQgYml0Ci0jIEVMRiBlbXVsYXRpb25zLgotdGVzdCAteiAiJHtFTEZTSVpFfSIgJiYgRUxGU0laRT0zMgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiAke0VMRlNJWkV9IGJpdCBFTEYgZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBFTEYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfYGVjaG8gJHtBUkNIfSB8IHNlZCAtZSAncy86LiovLydgOwotICBjb25maWcuZHluYW1pY19saW5rID0gJHtEWU5BTUlDX0xJTkstdHJ1ZX07Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gYGlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbiBlY2hvIHRydWUgOyBlbHNlIGVjaG8gZmFsc2UgOyBmaWA7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCi0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28gKG9yIC5zbCBvbiBvZGRiYWxsIHN5c3RlbXMKLSAgIGxpa2UgaHB1eCkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gZW50cnktPmZpbGVuYW1lOwotCi0gIC8qIFRoaXMgYWxsb2NhdGVzIGEgZmV3IGJ5dGVzIHRvbyBtYW55IHdoZW4gRVhUUkFfU0hMSUJfRVhURU5TSU9OCi0gICAgIGlzIGRlZmluZWQsIGJ1dCBpdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZSBoZWFkYWNoZSB0byBvcHRpbWl6ZQotICAgICBhd2F5IHRob3NlIHR3byBieXRlcyBvZiBzcGFjZS4gICovCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotI2lmZGVmIEVYVFJBX1NITElCX0VYVEVOU0lPTgotCQkJICAgICArIHN0cmxlbiAoRVhUUkFfU0hMSUJfRVhURU5TSU9OKQotI2VuZGlmCi0JCQkgICAgICsgc2l6ZW9mICIvbGliLnNvIik7Ci0KLSAgc3ByaW50ZiAoc3RyaW5nLCAiJXMvbGliJXMlcy5zbyIsIHNlYXJjaC0+bmFtZSwgZmlsZW5hbWUsIGFyY2gpOwotCi0jaWZkZWYgRVhUUkFfU0hMSUJfRVhURU5TSU9OCi0gIC8qIFRyeSB0aGUgLnNvIGV4dGVuc2lvbiBmaXJzdC4gIElmIHRoYXQgZmFpbHMgYnVpbGQgYSBuZXcgZmlsZW5hbWUKLSAgICAgdXNpbmcgRVhUUkFfU0hMSUJfRVhURU5TSU9OLiAgKi8KLSAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0gICAgc3ByaW50ZiAoc3RyaW5nLCAiJXMvbGliJXMlcyVzIiwgc2VhcmNoLT5uYW1lLAotCSAgICAgZmlsZW5hbWUsIGFyY2gsIEVYVFJBX1NITElCX0VYVEVOU0lPTik7Ci0jZW5kaWYKLQotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0KLSAgLyogV2UgaGF2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgaW4gdGhlIGxpbmsuICBUaGUgRUxGCi0gICAgIGJhY2tlbmQgbGlua2VyIHdpbGwgY3JlYXRlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSAuZHluYW1pYwotICAgICBzZWN0aW9uIG5hbWluZyB0aGlzIGZpbGUuICBJZiB0aGlzIGZpbGUgaW5jbHVkZXMgYSBEVF9TT05BTUUKLSAgICAgZW50cnksIGl0IHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlIEVMRiBsaW5rZXIgd2lsbCBqdXN0IHVzZQotICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gIEZvciBhbiBhcmNoaXZlIGZvdW5kIGJ5IHNlYXJjaGluZywgbGlrZQotICAgICB0aGlzIG9uZSwgdGhlIERUX05FRURFRCBlbnRyeSBzaG91bGQgY29uc2lzdCBvZiBqdXN0IHRoZSBuYW1lIG9mCi0gICAgIHRoZSBmaWxlLCB3aXRob3V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIHVzZWQgdG8gZmluZCBpdC4gIE5vdGUKLSAgICAgdGhhdCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZSBoYXZlIGEgZHluYW1pYyBvYmplY3Q7IGFuCi0gICAgIGFyY2hpdmUgd2lsbCBuZXZlciBiZSByZWZlcmVuY2VkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LgotCi0gICAgIEZJWE1FOiBUaGlzIGFwcHJvYWNoLS11c2luZyBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZS0taXMgbm90Ci0gICAgIHZlcnkgcHJldHR5LiAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0aGluayBvZiBhbnl0aGluZyB0aGF0IGlzCi0gICAgIHByZXR0eSwgdGhvdWdoLiAgKi8KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0KQotICAgICAgJiYgKGVudHJ5LT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgY2hhciAqbmVlZGVkX25hbWU7Ci0KLSAgICAgIEFTU0VSVCAoZW50cnktPmlzX2FyY2hpdmUgJiYgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpOwotCi0gICAgICAvKiBSYXRoZXIgdGhhbiBkdXBsaWNhdGluZyB0aGUgbG9naWMgYWJvdmUuICBKdXN0IHVzZSB0aGUKLQkgZmlsZW5hbWUgd2UgcmVjb3JkZWQgZWFybGllci4KLQotCSBGaXJzdCBzdHJpcCBvZmYgZXZlcnl0aGluZyBiZWZvcmUgdGhlIGxhc3QgJy8nLiAgKi8KLSAgICAgIGZpbGVuYW1lID0gc3RycmNociAoZW50cnktPmZpbGVuYW1lLCAnLycpOwotICAgICAgZmlsZW5hbWUrKzsKLQotICAgICAgbmVlZGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKSArIDEpOwotICAgICAgc3RyY3B5IChuZWVkZWRfbmFtZSwgZmlsZW5hbWUpOwotICAgICAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGVudHJ5LT50aGVfYmZkLCBuZWVkZWRfbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLS8qIEZvciBhIG5hdGl2ZSBsaW5rZXIsIGNoZWNrIHRoZSBmaWxlIC9ldGMvbGQuc28uY29uZiBmb3IgZGlyZWN0b3JpZXMKLSAgIGluIHdoaWNoIHdlIG1heSBmaW5kIHNoYXJlZCBsaWJyYXJpZXMuICAvZXRjL2xkLnNvLmNvbmYgaXMgcmVhbGx5Ci0gICBvbmx5IG1lYW5pbmdmdWwgb24gTGludXgsIGJ1dCB3ZSBjaGVjayBpdCBvbiBvdGhlciBzeXN0ZW1zIGFueWhvdy4gICovCi0KLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYgKG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkOwotICBzdGF0aWMgY2hhciAqbGRfc29fY29uZjsKLQotICBpZiAoISBpbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBGSUxFICpmOwotCi0gICAgICBmID0gZm9wZW4gKCIvZXRjL2xkLnNvLmNvbmYiLCBGT1BFTl9SVCk7Ci0gICAgICBpZiAoZiAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKmI7Ci0JICBzaXplX3QgbGVuLCBhbGxvYzsKLQkgIGludCBjOwotCi0JICBsZW4gPSAwOwotCSAgYWxsb2MgPSAxMDA7Ci0JICBiID0gKGNoYXIgKikgeG1hbGxvYyAoYWxsb2MpOwotCi0JICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQotCSAgICB7Ci0JICAgICAgaWYgKGxlbiArIDEgPj0gYWxsb2MpCi0JCXsKLQkJICBhbGxvYyAqPSAyOwotCQkgIGIgPSAoY2hhciAqKSB4cmVhbGxvYyAoYiwgYWxsb2MpOwotCQl9Ci0JICAgICAgaWYgKGMgIT0gJzonCi0JCSAgJiYgYyAhPSAnICcKLQkJICAmJiBjICE9ICdcdCcKLQkJICAmJiBjICE9ICdcbicKLQkJICAmJiBjICE9ICcsJykKLQkJewotCQkgIGJbbGVuXSA9IGM7Ci0JCSAgKytsZW47Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAobGVuID4gMCAmJiBiW2xlbiAtIDFdICE9ICc6JykKLQkJICAgIHsKLQkJICAgICAgYltsZW5dID0gJzonOwotCQkgICAgICArK2xlbjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsZW4gPiAwICYmIGJbbGVuIC0gMV0gPT0gJzonKQotCSAgICAtLWxlbjsKLQotCSAgaWYgKGxlbiA+IDApCi0JICAgIGJbbGVuXSA9ICdcMCc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcmVlIChiKTsKLQkgICAgICBiID0gTlVMTDsKLQkgICAgfQotCi0JICBmY2xvc2UgKGYpOwotCi0JICBsZF9zb19jb25mID0gYjsKLQl9Ci0KLSAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGxkX3NvX2NvbmYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxkX3NvX2NvbmYsIG5hbWUsIGZvcmNlKTsKLX0KLQotRU9GCi0gIDs7Ci0gIGVzYWMKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmFjayBhbmQgZm9ydGgKLSAgIGJldHdlZW4gYWZ0ZXJfb3BlbiBhbmQgY2hlY2tfbmVlZGVkIGFuZCBzdGF0X25lZWRlZCBhbmQgdmVyY2hlY2suICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfbmVlZGVkOwotc3RhdGljIHN0cnVjdCBzdGF0IGdsb2JhbF9zdGF0Owotc3RhdGljIGJvb2xlYW4gZ2xvYmFsX2ZvdW5kOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF92ZXJjaGVja19mYWlsZWQ7Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqbDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gRFRfTkVFREVEIGVudHJpZXMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rIChvZnRlbiB0aGVyZSB3aWxsIGJlIG5vbmUpLgotICAgICBGb3IgZWFjaCBzdWNoIGZpbGUsIHdlIHdhbnQgdG8gdHJhY2sgZG93biB0aGUgY29ycmVzcG9uZGluZwotICAgICBsaWJyYXJ5LCBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBsaW5rLiAgVGhpcyBpcyB3aGF0Ci0gICAgIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIHdpbGwgZG8uICBUcmFja2luZyB0aGUgZmlsZXMgZG93biBoZXJlCi0gICAgIHBlcm1pdHMgb25lIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgYW5vdGhlciB3aXRob3V0IHJlcXVpcmluZwotICAgICBzcGVjaWFsIGFjdGlvbiBieSB0aGUgcGVyc29uIGRvaW5nIHRoZSBsaW5rLiAgTm90ZSB0aGF0IHRoZQotICAgICBuZWVkZWQgbGlzdCBjYW4gYWN0dWFsbHkgZ3JvdyB3aGlsZSB3ZSBhcmUgc3RlcHBpbmcgdGhyb3VnaCB0aGlzCi0gICAgIGxvb3AuICAqLwotICBuZWVkZWQgPSBiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgaW50IGZvcmNlOwotCi0gICAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBmaWxlLCBza2lwIGl0LiAgKi8KLSAgICAgIGZvciAobGwgPSBuZWVkZWQ7IGxsICE9IGw7IGxsID0gbGwtPm5leHQpCi0JaWYgKHN0cmNtcCAobGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQotCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKLQkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAotCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuCi0KLQkgV2Ugc2VhcmNoIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUsIHdlIHNraXAgb2JqZWN0cyB3aGljaCBtYXkKLQkgaW50cm9kdWNlIHZlcnNpb24gbWlzbWF0Y2hlcy4gIFRoZSBzZWNvbmQgdGltZSwgd2UgZm9yY2UKLQkgdGhlaXIgdXNlLiAgU2VlIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIGNvbW1lbnQuICAqLwotICAgICAgZm9yIChmb3JjZSA9IDA7IGZvcmNlIDwgMjsgZm9yY2UrKykKLQl7Ci0JICBjb25zdCBjaGFyICpsaWJfcGF0aDsKLQkgIHNpemVfdCBsZW47Ci0JICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGhfbGluaywKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGgsCi0JCQkJCQkgIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci0JICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTAotCSAgICAgICYmIGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwKLQkJCQkJCSAgICAgIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgIH0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBsZW4gPSBzdHJsZW4gKGwtPm5hbWUpOwotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgewotCSAgICAgIGNoYXIgKmZpbGVuYW1lOwotCi0JICAgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJY29udGludWU7Ci0JICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBsZW4gKyAyKTsKLQkgICAgICBzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBsLT5uYW1lKTsKLQkgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCSAgICB9Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGJyZWFrOwotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYgKGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JfQotCi0gICAgICBpZiAoZm9yY2UgPCAyKQotCWNvbnRpbnVlOwotCi0gICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBub3QgZm91bmQgKHRyeSB1c2luZyAtLXJwYXRoKVxuIiwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlbmFtZSwgKnNzZXQ7Ci0KLSAgICAgIHMgPSBzdHJjaHIgKHBhdGgsICc6Jyk7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXMgPSBwYXRoICsgc3RybGVuIChwYXRoKTsKLQotICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIGxlbiArIDIpOwotICAgICAgaWYgKHMgPT0gcGF0aCkKLQlzc2V0ID0gZmlsZW5hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChmaWxlbmFtZSwgcGF0aCwgcyAtIHBhdGgpOwotCSAgZmlsZW5hbWVbcyAtIHBhdGhdID0gJy8nOwotCSAgc3NldCA9IGZpbGVuYW1lICsgKHMgLSBwYXRoKSArIDE7Ci0JfQotICAgICAgc3RyY3B5IChzc2V0LCBuYW1lKTsKLQotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGZpbGVuYW1lLCBmb3JjZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgbmFtZSBmb3IgYSBkeW5hbWljIG9iamVjdAotICAgbmFtZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuICBUaGUgRk9SQ0UgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyCi0gICB0byBza2lwIHRoZSBjaGVjayBmb3IgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIGJmZCAqYWJmZDsKLQotICBhYmZkID0gYmZkX29wZW5yIChuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgb2JqZWN0IHdvdWxkIGluY2x1ZGUgYW55IGNvbmZsaWN0aW5nIGxpYnJhcnkKLSAgICAgdmVyc2lvbnMuICBJZiBGT1JDRSBpcyBzZXQsIHRoZW4gd2Ugc2tpcCB0aGlzIGNoZWNrOyB3ZSB1c2UgdGhpcwotICAgICB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kLCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGFueSBjb21wYXRpYmxlCi0gICAgIGluc3RhbmNlIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLSAgaWYgKCEgZm9yY2UpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0KLSAgICAgIGlmICghIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCAoYWJmZCwgJm5lZWRlZCkpCi0JZWluZm8gKCIlRiVQOiVCOiBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QgZmFpbGVkOiAlRVxuIiwgYWJmZCk7Ci0KLSAgICAgIGlmIChuZWVkZWQgIT0gTlVMTCkKLQl7Ci0JICBnbG9iYWxfdmVyY2hlY2tfbmVlZGVkID0gbmVlZGVkOwotCSAgZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCA9IGZhbHNlOwotCSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayk7Ci0JICBpZiAoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCkKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCSAgICAgIC8qIFJldHVybiBmYWxzZSB0byBmb3JjZSB0aGUgY2FsbGVyIHRvIG1vdmUgb24gdG8gdHJ5Ci0gICAgICAgICAgICAgICAgIGFub3RoZXIgZmlsZSBvbiB0aGUgc2VhcmNoIHBhdGguICAqLwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBCdXQgd2FpdCEgIEl0IGdldHMgbXVjaCB3b3JzZS4gIE9uIExpbnV4LCBpZiBhIHNoYXJlZAotICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3QgdXNlIGxpYmMgYXQgYWxsLCB3ZSBhcmUgc3VwcG9zZWQgdG8gc2tpcAotICAgICAgICAgICAgIGl0IHRoZSBmaXJzdCB0aW1lIGFyb3VuZCBpbiBjYXNlIHdlIGVuY291bnRlciBhIHNoYXJlZAotICAgICAgICAgICAgIGxpYnJhcnkgbGF0ZXIgb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoIGRvZXMgdXNlIHRoZQotICAgICAgICAgICAgIHZlcnNpb24gb2YgbGliYyB0aGF0IHdlIHdhbnQuICBUaGlzIGlzIG11Y2ggdG9vIGhvcnJpYmxlCi0gICAgICAgICAgICAgdG8gdXNlIG9uIGFueSBzeXN0ZW0gb3RoZXIgdGhhbiBMaW51eC4gICovCi0KLUVPRgotY2FzZSAke3RhcmdldH0gaW4KLSAgKi0qLWxpbnV4LWdudSopCi0gICAgY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0JICAgIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgICBpZiAoc3RybmNtcCAobC0+bmFtZSwgImxpYmMuc28iLCA3KSA9PSAwKQotCQlicmVhazsKLQkgICAgaWYgKGwgPT0gTlVMTCkKLQkgICAgICB7Ci0JCSh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCi1FT0YKLSAgICA7OwotZXNhYwotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQl9Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgbWF0Y2hpbmcgdGhlIERUX05FRURFRCBlbnRyeS4gICovCi0KLSAgLyogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBvdGhlciBpbnB1dCBmaWxlIG9mIHRoZQotICAgICBzYW1lIG5hbWUuICBXZSBtdXN0IG5vdyBjaGVjayBhZ2FpbiB0aGF0IHdlIGFyZSBub3QgaW5jbHVkaW5nIHRoZQotICAgICBzYW1lIGZpbGUgdHdpY2UuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvbiBtYW55IHN5c3RlbXMKLSAgICAgbGliYy5zbyBpcyBhIHN5bWxpbmsgdG8sIGUuZy4sIGxpYmMuc28uMS4gIFRoZSBTT05BTUUgZW50cnkgd2lsbAotICAgICByZWZlcmVuY2UgbGliYy5zby4xLiAgSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGxpYmMuc28sIHdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBsaWJjLnNvLjEgaWYgdGhleSBhcmUgdGhlIHNhbWUgZmlsZSwgYW5kIHdlCi0gICAgIGNhbiBvbmx5IGNoZWNrIHRoYXQgdXNpbmcgc3RhdC4gICovCi0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmZ2xvYmFsX3N0YXQpICE9IDApCi0gICAgZWluZm8gKCIlRiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKLSAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOwotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHsKLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgd2UgZm91bmQgdGhlIGZpbGUsIGV2ZW4gdGhvdWdoCi0gICAgICAgICB3ZSBhcmVuJ3QgZ29pbmcgdG8gZG8gYW55dGhpbmcgd2l0aCBpdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGVsbCB0aGUgRUxGIGJhY2tlbmQgdGhhdCBkb24ndCB3YW50IHRoZSBvdXRwdXQgZmlsZSB0byBoYXZlIGEKLSAgICAgRFRfTkVFREVEIGVudHJ5IGZvciB0aGlzIGZpbGUuICAqLwotICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgIiIpOwotCi0gIC8qIEFkZCB0aGlzIGZpbGUgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIsIGFiZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAocy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChzLT5maWxlbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLQotICAgICAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgICAgIGlmIChzb25hbWUgIT0gTlVMTAotCSAgJiYgc3RyY21wIChzb25hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCSAgCi0gIGlmIChzLT5zZWFyY2hfZGlyc19mbGFnCi0gICAgICAmJiBzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmOwotCi0gICAgICBmID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoZiAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGYgKyAxLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBydW5uaW5nIHN0YXQgb24KLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgY29uc3QgY2hhciAqc3VmZml4OwotICBjb25zdCBjaGFyICpzb25hbWU7Ci0gIGNvbnN0IGNoYXIgKmY7Ci0KLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfc3RhdCAocy0+dGhlX2JmZCwgJnN0KSAhPSAwKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIHMtPnRoZV9iZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3Quc3RfZGV2ID09IGdsb2JhbF9zdGF0LnN0X2RldgotICAgICAgJiYgc3Quc3RfaW5vID09IGdsb2JhbF9zdGF0LnN0X2lubykKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQgbG9va3MgbGlrZSB3ZSBhcmUgaW5jbHVkaW5nIHR3bwotICAgICBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwKLSAgICAgdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSBpZiAtbGMgcGlja3MgdXAgbGliYy5zby42IGJ1dCBzb21lIG90aGVyCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGhhcyBhIERUX05FRURFRCBlbnRyeSBvZiBsaWJjLnNvLjUuICBUaGlzIGlzIGEKLSAgICAgaHVlcmlzdGljIHRlc3QsIGFuZCBpdCB3aWxsIG9ubHkgd29yayBpZiB0aGUgbmFtZSBsb29rcyBsaWtlCi0gICAgIE5BTUUuc28uVkVSU0lPTi4gIEZJWE1FOiBEZXBlbmRpbmcgb24gZmlsZSBuYW1lcyBpcyBlcnJvci1wcm9uZS4KLSAgICAgSWYgd2UgcmVhbGx5IHdhbnQgdG8gaXNzdWUgd2FybmluZ3MgYWJvdXQgbWl4aW5nIHZlcnNpb24gbnVtYmVycwotICAgICBvZiBzaGFyZWQgbGlicmFyaWVzLCB3ZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5LiAgKi8KLQotICBpZiAoc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpICE9IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggPSBzdHJzdHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICIuc28uIik7Ci0gIGlmIChzdWZmaXggPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gcy0+ZmlsZW5hbWU7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGlmIChzdHJuY21wIChmLCBnbG9iYWxfbmVlZGVkLT5uYW1lLCBzdWZmaXggLSBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG1heSBjb25mbGljdCB3aXRoICVzXG4iLAotCSAgIGdsb2JhbF9uZWVkZWQtPm5hbWUsIGdsb2JhbF9uZWVkZWQtPmJ5LCBmKTsKLX0KLQotLyogT24gTGludXgsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLSAgIHNoYXJlZCBsaWJyYXJ5IGxpbmtlZCBhZ2FpbnN0IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBsaWJjLiAgVGhlCi0gICBkeW5hbWljIGxpbmtlciBzb21laG93IHRhZ3Mgd2hpY2ggbGliYyB2ZXJzaW9uIHRvIHVzZSBpbgotICAgL2V0Yy9sZC5zby5jYWNoZSwgYW5kLCBiYXNlZCBvbiB0aGUgbGliYyB0aGF0IGl0IHNlZXMgaW4gdGhlCi0gICBleGVjdXRhYmxlLCBjaG9vc2VzIHdoaWNoIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHRvIHVzZS4KLQotICAgV2UgdHJ5IHRvIGRvIGEgc2ltaWxhciBjaGVjayBoZXJlIGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhpcyBzaGFyZWQKLSAgIGxpYnJhcnkgbmVlZHMgYW55IG90aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggbWF5IGNvbmZsaWN0IHdpdGgKLSAgIGxpYnJhcmllcyB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBJZiBpdCBkb2VzLCB3ZQotICAgc2tpcCBpdCwgYW5kIHRyeSB0byBmaW5kIGFub3RoZXIgc2hhcmVkIGxpYnJhcnkgZmFydGhlciBvbiBkb3duIHRoZQotICAgbGluayBwYXRoLgotCi0gICBUaGlzIGlzIGNhbGxlZCB2aWEgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlLgotICAgR0xPQkFMX1ZFUkNIRUNLX05FRURFRCBpcyB0aGUgbGlzdCBvZiBvYmplY3RzIG5lZWRlZCBieSB0aGUgb2JqZWN0Ci0gICB3aGljaCB3ZSBhciBjaGVja2luZy4gIFRoaXMgc2V0cyBHTE9CQUxfVkVSQ0hFQ0tfRkFJTEVEIGlmIHdlIGZpbmQKLSAgIGEgY29uZmxpY3RpbmcgdmVyc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgY29uc3QgY2hhciAqc29uYW1lLCAqZjsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0gIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgKGJmZF9nZXRfZmlsZV9mbGFncyAocy0+dGhlX2JmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHJldHVybjsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gYmZkX2dldF9maWxlbmFtZSAocy0+dGhlX2JmZCk7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGZvciAobCA9IGdsb2JhbF92ZXJjaGVja19uZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc3VmZml4OwotCi0gICAgICBpZiAoc3RyY21wIChmLCBsLT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIFByb2JhYmx5IGNhbid0IGhhcHBlbiwgYnV0IGl0J3MgYW4gZWFzeSBjaGVjay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjaHIgKGwtPm5hbWUsICcvJykgIT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3VmZml4ID0gc3Ryc3RyIChsLT5uYW1lLCAiLnNvLiIpOwotICAgICAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWZmaXggKz0gc2l6ZW9mICIuc28uIiAtIDE7Ci0KLSAgICAgIGlmIChzdHJuY21wIChmLCBsLT5uYW1lLCBzdWZmaXggLSBsLT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIEhlcmUgd2Uga25vdyB0aGF0IFMgaXMgYSBkeW5hbWljIG9iamVjdCBGT08uU08uVkVSMSwgYW5kCi0gICAgICAgICAgICAgdGhlIG9iamVjdCB3ZSBhcmUgY29uc2lkZXJpbmcgbmVlZHMgYSBkeW5hbWljIG9iamVjdAotICAgICAgICAgICAgIEZPTy5TTy5WRVIyLCBhbmQgVkVSMSBhbmQgVkVSMiBhcmUgZGlmZmVyZW50LiAgVGhpcwotICAgICAgICAgICAgIGFwcGVhcnMgdG8gYmUgYSB2ZXJzaW9uIG1pc21hdGNoLCBzbyB3ZSB0ZWxsIHRoZSBjYWxsZXIKLSAgICAgICAgICAgICB0byB0cnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuICAqLwotCSAgZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBjb25zdCBjaGFyICpycGF0aDsKLSAgYXNlY3Rpb24gKnNpbnRlcnA7Ci0KLSAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIG1ha2UgYW55IHZhcmlhYmxlIGFzc2lnbm1lbnRzLCB3ZSBuZWVkIHRvIGxldAotICAgICB0aGUgRUxGIGJhY2tlbmQga25vdyBhYm91dCB0aGVtIGluIGNhc2UgdGhlIHZhcmlhYmxlcyBhcmUKLSAgICAgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQpOwotCi0gIC8qIExldCB0aGUgRUxGIGJhY2tlbmQgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucyByZXF1aXJlZAotICAgICBieSBkeW5hbWljIGxpbmtpbmcuICAqLwotICBycGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgaWYgKHJwYXRoID09IE5VTEwpCi0gICAgcnBhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotICBpZiAoISAoYmZkX2VsZiR7RUxGU0laRX1fc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gICAgICAgICAob3V0cHV0X2JmZCwgY29tbWFuZF9saW5lLnNvbmFtZSwgcnBhdGgsCi0JICBjb21tYW5kX2xpbmUuZXhwb3J0X2R5bmFtaWMsIGNvbW1hbmRfbGluZS5maWx0ZXJfc2hsaWIsCi0JICAoY29uc3QgY2hhciAqIGNvbnN0ICopIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycywKLQkgICZsaW5rX2luZm8sICZzaW50ZXJwLCBsYW5nX2VsZl92ZXJzaW9uX2luZm8pKSkKLSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Ci0KLSAgLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBkeW5hbWljIGxpbmtlciB3ZSBhcmUgdXNpbmcuICAqLwotICBpZiAoY29tbWFuZF9saW5lLmludGVycHJldGVyICE9IE5VTEwKLSAgICAgICYmIHNpbnRlcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW50ZXJwLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXI7Ci0gICAgICBzaW50ZXJwLT5fcmF3X3NpemUgPSBzdHJsZW4gKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcikgKyAxOwotICAgIH0KLQotICAvKiBMb29rIGZvciBhbnkgc2VjdGlvbnMgbmFtZWQgLmdudS53YXJuaW5nLiAgQXMgYSBHTlUgZXh0ZW5zaW9ucywKLSAgICAgd2UgdHJlYXQgc3VjaCBzZWN0aW9ucyBhcyBjb250YWluaW5nIHdhcm5pbmcgbWVzc2FnZXMuICBXZSBwcmludAotICAgICBvdXQgdGhlIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gemVybyBvdXQgdGhlIHNlY3Rpb24gc2l6ZSBzbwotICAgICB0aGF0IGl0IGRvZXMgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JYXNlY3Rpb24gKnM7Ci0JYmZkX3NpemVfdHlwZSBzejsKLQljaGFyICptc2c7Ci0JYm9vbGVhbiByZXQ7Ci0KLQlpZiAoaXMtPmp1c3Rfc3ltc19mbGFnKQotCSAgY29udGludWU7Ci0KLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlzLT50aGVfYmZkLCAiLmdudS53YXJuaW5nIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ogPSBiZmRfc2VjdGlvbl9zaXplIChpcy0+dGhlX2JmZCwgcyk7Ci0JbXNnID0geG1hbGxvYyAoKHNpemVfdCkgc3ogKyAxKTsKLQlpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQotCSAgZWluZm8gKCIlRiVCOiBDYW4ndCByZWFkIGNvbnRlbnRzIG9mIHNlY3Rpb24gLmdudS53YXJuaW5nOiAlRVxuIiwKLQkJIGlzLT50aGVfYmZkKTsKLQltc2dbc3pdID0gJ1wwJzsKLQlyZXQgPSBsaW5rX2luZm8uY2FsbGJhY2tzLT53YXJuaW5nICgmbGlua19pbmZvLCBtc2csCi0JCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgICAgaXMtPnRoZV9iZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkgICAgKGJmZF92bWEpIDApOwotCUFTU0VSVCAocmV0KTsKLQlmcmVlIChtc2cpOwotCi0JLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplLCBzbyB0aGF0IHdlIGRvbid0IHdhc3RlIGNvcHlpbmcgdGhlCi0JICAgd2FybmluZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICAgIH0KLSAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBhbmQKLSAgIHRlbGxzIHRoZSBFTEYgYmFja2VuZCBhYm91dCB0aGVtLCBpbiBjYXNlIHRoZXkgYXJlIGFzc2lnbm1lbnRzIHRvCi0gICBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSkKLSAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKLQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlIGNhbGwgcmVjb3JkX2xpbmtfYXNzaWdubWVudCBldmVuIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4KLQkgVGhpcyBpcyBiZWNhdXNlIGlmIGl0IGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgd2UKLQkgYWN0dWFsbHkgd2FudCB0byB1c2UgdGhlIHZhbHVlIGRlZmluZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsCi0JIG5vdCB0aGUgdmFsdWUgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgKGJlY2F1c2Ugd2UgYXJlIHNldHRpbmcKLQkgc3ltYm9scyBsaWtlIGV0ZXh0KS4gIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIKLQkgb2JqZWN0LCB0aGVuLCBhcyBpdCBoYXBwZW5zLCBjYWxsaW5nIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkgd2lsbCBkbyBubyBoYXJtLiAgKi8KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIChiZmRfZWxmJHtFTEZTSVpFfV9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JCSAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgZXhwLT5hc3NpZ24uZHN0LAotCQkgIGV4cC0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3Byb3ZpZGUgPyB0cnVlIDogZmFsc2UpKSkKLQkgICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQwotICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yb2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfYnNzOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcmVsOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfaW50ZXJwOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgYXNlY3Rpb24gKnNuZXcsICoqcHBzOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLSAgZXRyZWVfdHlwZSAqYWRkcmVzczsKLSAgY29uc3QgY2hhciAqc2VjbmFtZSwgKnBzOwotICBjb25zdCBjaGFyICpvdXRzZWNuYW1lOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaG9sZF9zZWN0aW9uID0gczsKLSAgaG9sZF91c2UgPSBOVUxMOwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik7Ci0KLSAgaWYgKGhvbGRfdXNlICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHBsYWNlZCBhIHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgd2lsZF9kb2l0ICgmaG9sZF91c2UtPmNoaWxkcmVuLCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIHRoZW4gYWx3YXlzIHB1dCAuZ251Lndhcm5pbmcuU1lNQk9MCi0gICAgIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0IHNlY3Rpb24gdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZSB3YXkuICAqLwotICBpZiAoISBsaW5rX2luZm8uc2hhcmVkCi0gICAgICAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDAKLSAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdGV4dC0+Y2hpbGRyZW4sIHMsIGhvbGRfdGV4dCwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogRGVjaWRlIHdoaWNoIHNlZ21lbnQgdGhlIHNlY3Rpb24gc2hvdWxkIGdvIGluIGJhc2VkIG9uIHRoZQotICAgICBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICBXZSBwdXQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMKLSAgICAgcmlnaHQgYWZ0ZXIgdGhlIC5pbnRlcnAgc2VjdGlvbiwgc28gdGhhdCB0aGUgUFRfTk9URSBzZWdtZW50IGlzCi0gICAgIHN0b3JlZCByaWdodCBhZnRlciB0aGUgcHJvZ3JhbSBoZWFkZXJzIHdoZXJlIHRoZSBPUyBjYW4gcmVhZCBpdAotICAgICBpbiB0aGUgZmlyc3QgcGFnZS4gICovCi0gIHBsYWNlID0gTlVMTDsKLSAgaWYgKHMtPmZsYWdzICYgU0VDX0VYQ0xVREUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5ub3RlIiwgNCkgPT0gMAotICAgICAgJiYgaG9sZF9pbnRlcnAgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfaW50ZXJwOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICAgJiYgaG9sZF9ic3MgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfYnNzOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKLQkgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfZGF0YTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoc2VjbmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JICAgJiYgaG9sZF9yZWwgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcmVsOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfcm9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JvZGF0YTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3RleHQ7Ci0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmIHRoZQotICAgICBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGggZGlmZmVyZW50Ci0gICAgIGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICBvdXRzZWNuYW1lID0gc2VjbmFtZTsKLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgICBjaGFyICpuZXduYW1lOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAob3V0c2VjbmFtZSk7Ci0gICAgICBuZXduYW1lID0geG1hbGxvYyAobGVuICsgNSk7Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIG91dHNlY25hbWUpOwotICAgICAgaSA9IDA7Ci0gICAgICBkbwotCXsKLQkgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmV3bmFtZSkgIT0gTlVMTCk7Ci0KLSAgICAgIG91dHNlY25hbWUgPSBuZXduYW1lOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZSByaWdodAotICAgICBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sgbmVhdGVyLiAgKi8KLSAgc25ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIG91dHNlY25hbWUpOwotICBpZiAoc25ldyA9PSBOVUxMKQotICAgICAgZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBvdXRzZWNuYW1lKTsKLSAgaWYgKHBsYWNlLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocHBzID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOyAqcHBzICE9IHNuZXc7IHBwcyA9ICYoKnBwcyktPm5leHQpCi0JOwotICAgICAgKnBwcyA9IHNuZXctPm5leHQ7Ci0gICAgICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotICAgICAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLSAgICB9Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIG9sZCA9IHN0YXRfcHRyOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0gIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgLyogSWYgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaXMgcmVwcmVzZW50YWJsZSBpbiBDLCB0aGVuIGNyZWF0ZQotICAgICBzeW1ib2xzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgZm9yIChwcyA9IG91dHNlY25hbWU7ICpwcyAhPSAnXDAnOyBwcysrKQotICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcHMpICYmICpwcyAhPSAnXycpCi0gICAgICBicmVhazsKLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gb3V0c2VjbmFtZSArIHNpemVvZiAiX19zdGFydF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0YXJ0XyVzIiwgb3V0c2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfdW5vcCAoQUxJR05fSywKLQkJCQkJCWV4cF9pbnRvcCAoKGJmZF92bWEpIDEKLQkJCQkJCQkgICA8PCBzLT5hbGlnbm1lbnRfcG93ZXIpKSkpOwotICAgIH0KLQotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIGFkZHJlc3MgPSBOVUxMOwotICBlbHNlCi0gICAgYWRkcmVzcyA9IGV4cF9pbnRvcCAoKGJmZF92bWEpIDApOwotCi0gIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRzZWNuYW1lLCBhZGRyZXNzLCAwLAotCQkJCSAgICAgICAoYmZkX3ZtYSkgMCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7Ci0KLSAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQotICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotICAgICgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLQotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0b3BfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdG9wXyVzIiwgb3V0c2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpKSk7Ci0gICAgfQotCi0gIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgKmFkZC50YWlsID0gcGxhY2UtPmhlYWRlci5uZXh0OwotICBwbGFjZS0+aGVhZGVyLm5leHQgPSBhZGQuaGVhZDsKLQotICBzdGF0X3B0ciA9IG9sZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24gKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmIChzLT5oZWFkZXIudHlwZSAhPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtKQotICAgIHJldHVybjsKLQotICBvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsIGhvbGRfc2VjdGlvbi0+bmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJvZGF0YSIpID09IDApCi0gICAgaG9sZF9yb2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICBob2xkX2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5ic3MiKSA9PSAwKQotICAgIGhvbGRfYnNzID0gb3M7Ci0gIGVsc2UgaWYgKGhvbGRfcmVsID09IE5VTEwKLQkgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICYmIChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgc3RybmNtcCAob3MtPm5hbWUsICIucmVsIiwgNCkgPT0gMCkKLSAgICBob2xkX3JlbCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmludGVycCIpID09IDApCi0gICAgaG9sZF9pbnRlcnAgPSBvczsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbgotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpIHJldHVybicJCSAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cyAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1maQotCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cyI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1pZiB0ZXN0IC1uICIkUEFSU0VfQU5EX0xJU1RfQVJHUyIgOyB0aGVuCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotc3RhdGljIGludCAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKiBmaWxlKSk7Ci0KLSAkUEFSU0VfQU5EX0xJU1RfQVJHUwotRU9GCi1lbHNlCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0jZGVmaW5lIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzICAgTlVMTAotI2RlZmluZSBnbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIE5VTEwKLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLCAJLyogZmluaXNoICovCi0gIE5VTEwsIAkvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuLAotICBOVUxMLAkJLyogc2V0X3N5bWJvbHMgKi8KLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIE5VTEwsCQkvKiB1bnJlY29nbml6ZWRfZmlsZSAqLwotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zLAotICBOVUxMCQkvKiByZWNvZ25pemVkX2ZpbGUgKi8KLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9nZW5lcmljLmVtIGIvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2Y1MzAuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfc2V0X291dHB1dF9hcmNoICgiYGVjaG8gJHtBUkNIfWAiKTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gYi9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2I0YWYwLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjAuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIAotICogZW11bGF0ZSB0aGUgSW50ZWxzIHBvcnQgb2YgIGdsZAotICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLSNpZmRlZiBHTlU5NjAKLQotc3RhdGljIHZvaWQKLWdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsCi0JCQkJICAgICAgICIvbGliL2xpYmJvdXQiLAotCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi1zdGF0aWMgdm9pZCBnbGQ5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgY2hhciAqZW52IDsKLSAgZW52ID0gIGdldGVudigiRzk2MExJQiIpOwotICBpZiAoZW52KSB7Ci0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoZW52LCBmYWxzZSk7Ci0gIH0KLSAgZW52ID0gZ2V0ZW52KCJHOTYwQkFTRSIpOwotICBpZiAoZW52KQotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwgIi9saWIiLCAoY29uc3QgY2hhciAqKSBOVUxMKSwgZmFsc2UpOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIGJmZF9zZXRfYXJjaF9tYWNoKG91dHB1dF9iZmQsIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBiZmRfbWFjaF9pOTYwX2NvcmUpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfY2hvb3NlX3RhcmdldCgpCi17Ci0jaWZkZWYgR05VOTYwCi0KLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLSAgcmV0dXJuIGJmZF9tYWtlX3RhcmdfbmFtZShCRkRfQk9VVF9GT1JNQVQsIDApOwotCi0jZWxzZQotCi0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudihUQVJHRVRfRU5WSVJPTik7Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7Ci0KLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLQotICByZXR1cm4gImIub3V0LmxpdHRsZSI7Ci0KLSNlbmRpZgotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfZ2xkOTYwX2VtdWxhdGlvbiA9IAotewotICBnbGQ5NjBfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfc2V0X291dHB1dF9hcmNoLAotICBnbGQ5NjBfY2hvb3NlX3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkOTYwX2dldF9zY3JpcHQsCi0gICI5NjAiLAotICAiIgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dsZDk2MGMuZW0gYi9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4OWIyMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAKLSAqIGVtdWxhdGUgdGhlIEludGVscyBwb3J0IG9mICBnbGQKLSAqLwotCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLSNpZmRlZiBHTlU5NjAKLQotc3RhdGljIHZvaWQKLWdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsCi0JCQkJICAgICAgICIvbGliL2xpYmNvZmYiLAotCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi1zdGF0aWMgdm9pZCBnbGQ5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgY2hhciAqZW52IDsKLSAgZW52ID0gIGdldGVudigiRzk2MExJQiIpOwotICBpZiAoZW52KSB7Ci0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoZW52LCBmYWxzZSk7Ci0gIH0KLSAgZW52ID0gZ2V0ZW52KCJHOTYwQkFTRSIpOwotICBpZiAoZW52KQotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwgIi9saWIiLCAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgZmFsc2UpOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSAhPSBOVUxMCi0gICAgICAmJiAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBjaGFyICpzLCAqczE7Ci0KLSAgICAgIHMgPSBjb25jYXQgKCJpOTYwOiIsIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgIGZvciAoczEgPSBzOyAqczEgIT0gJ1wwJzsgczErKykKLQlpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzMSkpCi0JICAqczEgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMxKTsKLSAgICAgIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKHMpOwotICAgICAgZnJlZSAocyk7Ci0gICAgfQotCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0ICgpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfY2hvb3NlX3RhcmdldCgpCi17Ci0jaWZkZWYgR05VOTYwCi0KLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLSAgcmV0dXJuIGJmZF9tYWtlX3RhcmdfbmFtZShCRkRfQk9VVF9GT1JNQVQsIDApOwotCi0jZWxzZQotCi0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudihUQVJHRVRfRU5WSVJPTik7Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7Ci0KLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLQotICByZXR1cm4gImNvZmYtSW50ZWwtbGl0dGxlIjsKLQotI2VuZGlmCi19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZDk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9nbGQ5NjBjb2ZmX2VtdWxhdGlvbiA9IAotewotICBnbGQ5NjBfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfc2V0X291dHB1dF9hcmNoLAotICBnbGQ5NjBfY2hvb3NlX3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkOTYwX2dldF9zY3JpcHQsCi0gICI5NjBjb2ZmIiwKLSAgIiIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9ocHBhZWxmLmVtIGIvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YWJlM2IuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQW4gZW11bGF0aW9uIGZvciBIUCBQQS1SSVNDIEVMRiBsaW5rZXJzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotCi0vKiBTZWN0aW9uIGluIHdoaWNoIHdlIGJ1aWxkIHN0dWJzLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiAqc3R1Yl9zZWM7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqc3R1Yl9maWxlOwotCi0KLS8qIEZJWE1FLiAgVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiAgKi8KLWV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgZmlsZV9jaGFpbjsKLQotLyogUGVyZm9ybSBzb21lIGVtdWxhdGlvbiBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4gIEZvciBQQSBFTEYgd2Ugc2V0Ci0gICB1cCB0aGUgbG9jYWwgbGFiZWwgcHJlZml4IGFuZCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1ocHBhZWxmX2JlZm9yZV9wYXJzZSAoKQotewotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2hwcGE7Ci19Ci0KLS8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1ocHBhZWxmX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaGluZSA9IDA7Ci0KLSAgYmZkX3NldF9hcmNoX21hY2ggKG91dHB1dF9iZmQsIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBtYWNoaW5lKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBpbnB1dCBmaWxlcyBhcmUgb3BlbmVkLiAgV2UgY3JlYXRlIGEgbmV3Ci0gICBmYWtlIGlucHV0IGZpbGUgdG8gaG9sZCB0aGUgc3R1YiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCkKLXsKLSAgc3R1Yl9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAoImxpbmtlciBzdHVicyIsCi0JCQkJICAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKLQkJCQkgICBOVUxMKTsKLSAgc3R1Yl9maWxlLT50aGVfYmZkID0gYmZkX2NyZWF0ZSAoImxpbmtlciBzdHVicyIsIG91dHB1dF9iZmQpOwotICBpZiAoc3R1Yl9maWxlLT50aGVfYmZkID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9hcmNoX21hY2ggKHN0dWJfZmlsZS0+dGhlX2JmZCwKLQkJCSAgICAgIGJmZF9nZXRfYXJjaCAob3V0cHV0X2JmZCksCi0JCQkgICAgICBiZmRfZ2V0X21hY2ggKG91dHB1dF9iZmQpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIEJGRCAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0dWJfc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdHViX2ZpbGUtPnRoZV9iZmQsICIudGV4dCIpOwotICAvKiBEb24ndCBzZXQgU0VDX1JFTE9DIHVudGlsIHdlIGFjdHVhbGx5IGhhdmUgcmVsb2NhdGlvbnMgaW4gdGhpcwotICAgICBzZWN0aW9uLiAgKi8KLSAgaWYgKHN0dWJfc2VjID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdHViX2ZpbGUtPnRoZV9iZmQsIHN0dWJfc2VjLAotCQkJCSAgKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICB8IFNFQ19BTExPQwotCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkgICB8IFNFQ19DT0RFCi0JCQkJICAgfCBTRUNfSU5fTUVNT1JZKSkpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSBzdHViIHNlY3Rpb246ICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGRsYW5nX2FkZF9maWxlIChzdHViX2ZpbGUpOwotfQotCi0vKiBXYWxrIGFsbCB0aGUgbGFuZyBzdGF0ZW1lbnRzIHNwbGljaW5nIG91dCBhbnkgcGFkZGluZyBzdGF0ZW1lbnRzIGZyb20gCi0gICB0aGUgbGlzdC4gICovCi0KLXN0YXRpYyB2b2lkCi1ocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHMsIHByZXYpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwcmV2OwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzcHJldiA9IE5VTEw7Ci0gIGZvciAoOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCi0JLyogV2Ugd2FudCByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsCi0JCQkJCSAgICAgJmNvbnN0cnVjdG9yX2xpc3QuaGVhZCk7Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIGhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LgotCQkJCQkgICAgICAgY2hpbGRyZW4uaGVhZCwKLQkJCQkJICAgICAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LgotCQkJCQkgICAgICAgY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQotCS8qIEh1aD8gIFdoYXQgaXMgYSBsYW5nX3dpbGRfc3RhdGVtZW50PyAgKi8KLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIGhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAocy0+d2lsZF9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkLAotCQkJCQkgICAgICZzLT53aWxkX3N0YXRlbWVudC4KLQkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0KLQkvKiBIZXJlJ3Mgd2hhdCB3ZSBhcmUgcmVhbGx5IGxvb2tpbmcgZm9yLiAgU3BsaWNlIHRoZXNlIG91dCBvZgotCSAgIHRoZSBsaXN0LiAgKi8KLQljYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLQkgIGlmIChzcHJldikKLQkgICAgc3ByZXYtPmhlYWRlci5uZXh0ID0gcy0+aGVhZGVyLm5leHQ7Ci0JICBlbHNlCi0JICAgICoqcHJldiA9ICpzOwotCSAgYnJlYWs7Ci0KLQkvKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoZXNlIGNhc2VzLiAgKi8KLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBzcHJldiA9IHM7Ci0gICAgfQotfQotCi0vKiBGaW5hbCBlbXVsYXRpb24gc3BlY2lmaWMgY2FsbC4gIEZvciB0aGUgUEEgd2UgdXNlIHRoaXMgb3Bwb3J0dW5pdHkKLSAgIHRvIGJ1aWxkIGxpbmtlciBzdHVicy4gICovCi0KLXN0YXRpYyB2b2lkCi1ocHBhZWxmX2ZpbmlzaCAoKQotewotICAvKiBDYWxsIGludG8gdGhlIEJGRCBiYWNrZW5kIHRvIGRvIHRoZSByZWFsIHdvcmsuICAqLwotICBpZiAoZWxmMzJfaHBwYV9zaXplX3N0dWJzIChzdHViX2ZpbGUtPnRoZV9iZmQsIG91dHB1dF9iZmQsICZsaW5rX2luZm8pCi0gICAgICA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3Qgc2l6ZSBzdHViIHNlY3Rpb246ICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICAvKiBJZiB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBzZWN0aW9uIGlzIG5vbnplcm8sIHRoZW4gd2UgbmVlZAotICAgICB0byByZXNpemUgdGhlIHNlY3Rpb25zLCByZWNvbXB1dGUgdGhlIGFzc2lnbm1lbnRzLCBhbmQgZmluYWxseQotICAgICBidWlsZCB0aGUgc3R1YnMuICAqLwotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3R1Yl9maWxlLT50aGVfYmZkLCBzdHViX2ZpbGUtPnRoZV9iZmQtPnNlY3Rpb25zKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIERlbGV0ZSBhbGwgdGhlIHBhZGRpbmcgc3RhdGVtZW50cywgdGhleSdyZSBubyBsb25nZXIgdmFsaWQuICAqLwotICAgICAgaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzdGF0X3B0ci0+aGVhZCwgJnN0YXRfcHRyLT5oZWFkKTsKLSAgICAgIAotICAgICAgLyogUmVzaXplIHRoZSBzZWN0aW9ucy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRfcHRyLT5oZWFkLCBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICZzdGF0X3B0ci0+aGVhZCwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLSAgICAgIAotICAgICAgLyogUmVkbyBzcGVjaWFsIHN0dWZmLiAgKi8KLSAgICAgIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uICgpOwotICAgICAgCi0gICAgICAvKiBEbyB0aGUgYXNzaWdubWVudHMgYWdhaW4uICAqLwotICAgICAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdF9wdHItPmhlYWQsCi0JCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAoZmlsbF90eXBlKSAwLCAoYmZkX3ZtYSkgMCk7Ci0gICAgICAKLSAgICAgIC8qIE5vdyBidWlsZCB0aGUgbGlua2VyIHN0dWJzLiAgKi8KLSAgICAgIGlmIChlbGYzMl9ocHBhX2J1aWxkX3N0dWJzIChzdHViX2ZpbGUtPnRoZV9iZmQsICZsaW5rX2luZm8pID09IGZhbHNlKQotCXsKLQkgIGVpbmZvICgiJVglUDogY2FuIG5vdCBidWlsZCBzdHViczogJUVcbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoZSBzY3JpcHQgaXRzZWxmIGdldHMgaW5zZXJ0ZWQgaGVyZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWhwcGFlbGZfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfaHBwYWVsZl9lbXVsYXRpb24gPSAKLXsKLSAgaHBwYWVsZl9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGhwcGFlbGZfc2V0X291dHB1dF9hcmNoLAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGhwcGFlbGZfZ2V0X3NjcmlwdCwKLSAgImhwcGFlbGYiLAotICAiZWxmMzItaHBwYSIsCi0gIGhwcGFlbGZfZmluaXNoLAotICBocHBhZWxmX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzLAotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2xpbnV4LmVtIGIvbGQvZW11bHRlbXBsL2xpbnV4LmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGEwM2ZmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9saW51eC5lbQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIExpbnV4IGEub3V0IGVtdWxhdGlvbiBjb2RlIGZvciAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIExpbnV4IHN1cHBvcnQgYnkgRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gdHJ1ZTsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBMaW51eAotICAgZHluYW1pYyBsaWJyYXJpZXMgaGF2ZSBhbiBleHRlbnNpb24gb2YgLnNhLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKQotCQkJICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc2EiKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNhIiwgc2VhcmNoLT5uYW1lLCBlbnRyeS0+ZmlsZW5hbWUsIGFyY2gpOwotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvY2F0ZXMgYW55IGFkZHJlc3MgYXNzaWdubWVudCB0bwotICAgLnRleHQsIGFuZCBtb2RpZmllcyBpdCB0byBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXJzLiAgVGhpcwotICAgY2F1c2VzIC1UdGV4dCB0byBtZWFuIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBoZWFkZXIsIHJhdGhlcgotICAgdGhhbiB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiAudGV4dCwgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyCi0gICBMaW51eCB0b29scy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtCi0gICAgICAmJiBzdHJjbXAgKHMtPmFkZHJlc3Nfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICB7Ci0gICAgICBBU1NFUlQgKHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3MtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV92YWx1ZSk7Ci0gICAgICBzLT5hZGRyZXNzX3N0YXRlbWVudC5hZGRyZXNzLT52YWx1ZS52YWx1ZSArPSAweDIwOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIG9wZW5pbmcgdGhlIGlucHV0IEJGRCdzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpCi17Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50KTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgLyogTGV0IHRoZSBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQgYnkKLSAgICAgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgaWYgKCEgYmZkXyR7RU1VTEFUSU9OX05BTUV9X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0gYi9sZC9lbXVsdGVtcGwvbG5rOTYwLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGYyZjYwLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogaW50ZWwgY29mZiBsb2FkZXIgZW11bGF0aW9uIHNwZWNpZmljIHN0dWZmCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyojaW5jbHVkZSAiYXJjaHVyZXMuaCIqLwotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotdHlwZWRlZiBzdHJ1Y3QgbGliX2xpc3QgewotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgbGliX2xpc3QgKm5leHQ7Ci19IGxpYl9saXN0X3R5cGU7Ci0KLXN0YXRpYyBsaWJfbGlzdF90eXBlICpobGxfbGlzdDsKLXN0YXRpYyBsaWJfbGlzdF90eXBlICoqaGxsX2xpc3RfdGFpbCA9ICZobGxfbGlzdDsKLQotc3RhdGljIGxpYl9saXN0X3R5cGUgKnN5c2xpYl9saXN0Owotc3RhdGljIGxpYl9saXN0X3R5cGUgKipzeXNsaWJfbGlzdF90YWlsID0gJnN5c2xpYl9saXN0OwotCi0KLXN0YXRpYyB2b2lkCi1hcHBlbmQobGlzdCwgbmFtZSkKLSAgICAgbGliX2xpc3RfdHlwZSAqKipsaXN0OwotICAgICBjaGFyICpuYW1lOwotewotICBsaWJfbGlzdF90eXBlICplbGVtZW50ID0gCi0gICAgKGxpYl9saXN0X3R5cGUgKikoeG1hbGxvYyhzaXplb2YobGliX2xpc3RfdHlwZSkpKTsKLQotICBlbGVtZW50LT5uYW1lID0gbmFtZTsKLSAgZWxlbWVudC0+bmV4dCA9IChsaWJfbGlzdF90eXBlICopTlVMTDsKLSAgKipsaXN0ID0gZWxlbWVudDsKLSAgKmxpc3QgPSAmZWxlbWVudC0+bmV4dDsKLQotfQotCi1zdGF0aWMgYm9vbGVhbiBoYWRfaGxsID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbiBoYWRfaGxsX25hbWUgPSBmYWxzZTsKLQotc3RhdGljIHZvaWQKLWxuazk2MF9obGwobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaGFkX2hsbCA9IHRydWU7Ci0gIGlmIChuYW1lICE9IChjaGFyICopTlVMTCkgewotICAgIGhhZF9obGxfbmFtZSA9IHRydWU7Ci0gICAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCBuYW1lKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCAKLWxuazk2MF9zeXNsaWIobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXBwZW5kKCZzeXNsaWJfbGlzdF90YWlsLG5hbWUpOwotfQotCi0KLSNpZmRlZiBHTlU5NjAKLQotc3RhdGljIHZvaWQgCi1sbms5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgc3RhdGljIGNoYXIgKmVudl92YXJpYWJsZXNbXSA9IHsgIkc5NjBMSUIiLCAiRzk2MEJBU0UiLCAwIH07Ci0gIGNoYXIgKipwOwotICBjaGFyICplbnYgOwotCi0gIGZvciAoIHAgPSBlbnZfdmFyaWFibGVzOyAqcDsgcCsrICl7Ci0gICAgZW52ID0gIChjaGFyICopIGdldGVudigqcCk7Ci0gICAgaWYgKGVudikgewotICAgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoY29uY2F0KGVudiwiL2xpYi9saWJjb2ZmIiwiIiksIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBlbnY9IChjaGFyICopIGdldGVudigiSTk2MEJBU0UiKTsKLSAgaWYgKCBlbnYgKSB7Ci0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoY29uY2F0KGVudiwiL2xpYiIsIiIpLCBmYWxzZSk7Ci0gIH0KLQotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci0gIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi1zdGF0aWMgdm9pZCAKLWxuazk2MF9iZWZvcmVfcGFyc2UoKQotewotICBjaGFyICpuYW1lID0gZ2V0ZW52KCJJOTYwQkFTRSIpOwotCi0gIGlmIChuYW1lID09IChjaGFyICopTlVMTCkgewotICAgIG5hbWUgPSBnZXRlbnYoIkc5NjBCQVNFIik7Ci0gICAgaWYgKG5hbWUgPT0gKGNoYXIgKilOVUxMKSB7Ci0gICAgICBlaW5mbygiJVAlRiBJOTYwQkFTRSBhbmQgRzk2MEJBU0Ugbm90IHNldFxuIik7Ci0gICAgfQotICB9Ci0KLQotICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQobmFtZSwiL2xpYiIsIiIpLCBmYWxzZSk7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotfQotCi0jZW5kaWYJLyogR05VOTYwICovCi0KLQotc3RhdGljIHZvaWQKLWFkZF9vbihsaXN0LCBzZWFyY2gpCi0gICAgIGxpYl9saXN0X3R5cGUgKmxpc3Q7Ci0gICAgIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgc2VhcmNoOwotewotICB3aGlsZSAobGlzdCkgewotICAgIGxhbmdfYWRkX2lucHV0X2ZpbGUobGlzdC0+bmFtZSwKLQkJCXNlYXJjaCwKLQkJCShjaGFyICopTlVMTCk7Ci0gICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gIH0KLX0KLXN0YXRpYyB2b2lkCi1sbms5NjBfYWZ0ZXJfcGFyc2UoKQotewotICAvKiBJZiB0aGVyZSBoYXMgYmVlbiBubyBhcmNoLCBkZWZhdWx0IHRvIC1LQiAqLwotICBpZiAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWVbMF0gPT0wKSB7Ci0gICAgbGRmaWxlX2FkZF9hcmNoKCJLQiIpOwotICB9Ci0KLSAgLyogaWYgdGhlcmUgaGFzIGJlZW4gbm8gaGxsIGxpc3QgdGhlbiBhZGQgb3VyIG93biAqLwotICAKLSAgaWYoaGFkX2hsbCAmJiAhaGFkX2hsbF9uYW1lKSB7Ci0gICAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCJjZyIpOwotICAgIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmUgPT0gYmZkX21hY2hfaTk2MF9rYV9zYSB8fAotICAJbGRmaWxlX291dHB1dF9tYWNoaW5lID09IGJmZF9tYWNoX2k5NjBfY2EpIHsKLSAgICAgICAgewotCSAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCJmcGciKTsKLSAgICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgYWRkX29uKGhsbF9saXN0LCBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtKTsKLSAgYWRkX29uKHN5c2xpYl9saXN0LCBsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sbms5NjBfYmVmb3JlX2FsbG9jYXRpb24oKQotewotfQotCi1zdGF0aWMgdm9pZAotbG5rOTYwX2FmdGVyX2FsbG9jYXRpb24oKQotewotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSBmYWxzZSkgewotICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YoIi50ZXh0IiwiX2V0ZXh0Iik7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLmRhdGEiLCJfZWRhdGEiKTsKLSAgICBsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mKCIuYnNzIiwiX2Jzc19zdGFydCIpOwotICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YoIi5ic3MiLCJfZW5kIik7Ci0gIH0KLX0KLQotCi1zdGF0aWMgc3RydWN0Ci0gewotICAgdW5zaWduZWQgIGxvbmcgbnVtYmVyOwotICAgY2hhciAqbmFtZTsgCi0gfQotbWFjaGluZV90YWJsZVtdID0KLXsKLSAgeyBiZmRfbWFjaF9pOTYwX2NvcmUJLCJDT1JFIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJLQiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwiU0IiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9tYwksIk1DIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfeGEJLCJYQSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2NhCSwiQ0EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksIktBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJTQSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2p4CSwiSlgiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9oeAksIkhYIiB9LAotCi0gIHsgYmZkX21hY2hfaTk2MF9jb3JlCSwiY29yZSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwia2IiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYl9zYgksInNiIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfbWMJLCJtYyIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX3hhCSwieGEiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9jYQksImNhIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJrYSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2thX3NhCSwic2EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9qeAksImp4IiB9LAotICB7IGJmZF9tYWNoX2k5NjBfaHgJLCJoeCIgfSwKLQotICB7IDAsIChjaGFyICopIE5VTEwgfQotfTsKLQotc3RhdGljIHZvaWQKLWxuazk2MF9zZXRfb3V0cHV0X2FyY2goKQotewotICAvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KLSAgdW5zaWduZWQgaW50IGk7Ci0gIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLSAgZm9yIChpPSAwOyBtYWNoaW5lX3RhYmxlW2ldLm5hbWUgIT0gKGNoYXIqKU5VTEw7IGkrKykgewotICAgIGlmIChzdHJjbXAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUsbWFjaGluZV90YWJsZVtpXS5uYW1lKT09MCkgewotICAgICAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gbWFjaGluZV90YWJsZVtpXS5udW1iZXI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIGxkZmlsZV9vdXRwdXRfbWFjaGluZSk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWxuazk2MF9jaG9vc2VfdGFyZ2V0KCkKLXsKLSNpZmRlZiBHTlU5NjAKLQotICByZXR1cm4gYmZkX21ha2VfdGFyZ19uYW1lKEJGRF9DT0ZGX0ZPUk1BVCwgMCk7Ci0KLSNlbHNlCi0KLSAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52KFRBUkdFVF9FTlZJUk9OKTsKLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLSNpZmRlZiBMTks5NjBfTElUVExFCi0gIHJldHVybiAiY29mZi1JbnRlbC1saXR0bGUiOwotI2Vsc2UKLSAgcmV0dXJuICJjb2ZmLUludGVsLWJpZyI7Ci0jZW5kaWYKLSNlbmRpZgotCi19Ci0KLXN0YXRpYyBjaGFyICoKLWxuazk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9sbms5NjBfZW11bGF0aW9uID0gCi17Ci0gIGxuazk2MF9iZWZvcmVfcGFyc2UsCi0gIGxuazk2MF9zeXNsaWIsCi0gIGxuazk2MF9obGwsCi0gIGxuazk2MF9hZnRlcl9wYXJzZSwKLSAgTlVMTCwJCQkvKiBhZnRlcl9vcGVuICovCi0gIGxuazk2MF9hZnRlcl9hbGxvY2F0aW9uLAotICBsbms5NjBfc2V0X291dHB1dF9hcmNoLAotICBsbms5NjBfY2hvb3NlX3RhcmdldCwKLSAgbG5rOTYwX2JlZm9yZV9hbGxvY2F0aW9uLAotICBsbms5NjBfZ2V0X3NjcmlwdCwKLSAgImxuazk2MCIsCi0gICIiCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtIGIvbGQvZW11bHRlbXBsL21pcHNlY29mZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNTkyNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogSGFuZGxlIGVtYmVkZGVkIHJlbG9jcyBmb3IgTUlQUy4KLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiBiYXNlZCBvbiBnZW5lcmljLmVtLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2hlY2tfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcnVuIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4KLSAgIFdlIGNyZWF0ZSBhIC5yZWwuc2RhdGEgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBmaWxlIHdpdGggYSBub24gemVybwotICAgLnNkYXRhIHNlY3Rpb24uICBUaGUgQkZEIGJhY2tlbmQgd2lsbCBmaWxsIGluIHRoZXNlIHNlY3Rpb25zIHdpdGgKLSAgIG1hZ2ljIG51bWJlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVsb2NhdGUgdGhlIGRhdGEgc2VjdGlvbiBhdCBydW4KLSAgIHRpbWUuICBUaGlzIHdpbGwgb25seSBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgYWxsIHRoZSBpbnB1dCBmaWxlcwotICAgaGF2ZSBiZWVuIGNvbXBpbGVkIHVzaW5nIC1tZW1iZWRkZWQtcGljLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgYmZkICphYmZkOwotCi0gIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKLSAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0KLSAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOwotCi0gICAgICAvKiBOb3RlIHRoYXQgd2UgYXNzdW1lIHRoYXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGhhcyBhbHJlYWR5Ci0gICAgICAgICBiZWVuIHNldCB1cC4gIFdlIGNvdWxkIGNhbGwgYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCwgYnV0Ci0gICAgICAgICB0aGF0IHJldHVybnMgdGhlIHNpemUgb2YgYSBtZW1vcnkgYnVmZmVyIHJhdGhlciB0aGFuIGEgcmVsb2MKLSAgICAgICAgIGNvdW50LiAgV2UgZG8gbm90IHdhbnQgdG8gY2FsbCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLAotICAgICAgICAgYmVjYXVzZSBhbHRob3VnaCBpdCB3b3VsZCBhbHdheXMgd29yayBpdCB3b3VsZCBmb3JjZSB1cyB0bwotICAgICAgICAgcmVhZCBpbiB0aGUgcmVsb2NzIGludG8gQkZEIGNhbm9uaWNhbCBmb3JtLCB3aGljaCB3b3VsZCB3YXN0ZQotICAgICAgICAgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZSBhbmQgbWVtb3J5LiAgKi8KLSAgICAgIGlmIChkYXRhc2VjICE9IE5VTEwgJiYgZGF0YXNlYy0+cmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFzZWN0aW9uICpyZWxzZWM7Ci0KLQkgIHJlbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsLnNkYXRhIik7Ci0JICBpZiAocmVsc2VjID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcmVsc2VjLAotCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZKSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHJlbHNlYywgMikKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxzZWMsCi0JCQkJCSBkYXRhc2VjLT5yZWxvY19jb3VudCAqIDQpKQotCSAgICBlaW5mbyAoIiVGJUI6IGNhbiBub3QgY3JlYXRlIC5yZWwuc2RhdGEgc2VjdGlvbjogJUVcbiIpOwotCX0KLQotICAgICAgLyogRG91YmxlIGNoZWNrIHRoYXQgYWxsIG90aGVyIGRhdGEgc2VjdGlvbnMgYXJlIGVtcHR5LCBhcyBpcwotICAgICAgICAgcmVxdWlyZWQgZm9yIGVtYmVkZGVkIFBJQyBjb2RlLiAgKi8KLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgY2hlY2tfc2VjdGlvbnMsIChQVFIpIGRhdGFzZWMpOwotICAgIH0KLX0KLQotLyogQ2hlY2sgdGhhdCBvZiB0aGUgZGF0YSBzZWN0aW9ucywgb25seSB0aGUgLnNkYXRhIHNlY3Rpb24gaGFzCi0gICByZWxvY3MuICBUaGlzIGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX3NlY3Rpb25zIChhYmZkLCBzZWMsIHNkYXRhc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBzZGF0YXNlYzsKLXsKLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkgPT0gMAotICAgICAgJiYgc2VjICE9IChhc2VjdGlvbiAqKSBzZGF0YXNlYwotICAgICAgJiYgc2VjLT5yZWxvY19jb3VudCAhPSAwKQotICAgIGVpbmZvICgiJVAlWDogc2VjdGlvbiAlcyBoYXMgcmVsb2NzOyBjYW4gbm90IHVzZSAtLWVtYmVkZGVkLXJlbG9jc1xuIiwKLQkgICBhYmZkLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9uIHNpemVzIGFuZCBvZmZzZXRzIGhhdmUKLSAgIGJlZW4gc2V0LiAgSWYgd2UgYXJlIGdlbmVyYXRpbmcgZW1iZWRkZWQgcmVsb2NzLCBpdCBjYWxscyBhIHNwZWNpYWwKLSAgIEJGRCBiYWNrZW5kIHJvdXRpbmUgdG8gZG8gdGhlIHdvcmsuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfYWxsb2NhdGlvbiAoKQotewotICBiZmQgKmFiZmQ7Ci0KLSAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcwotICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YXNlYywgKnJlbHNlYzsKLSAgICAgIGNoYXIgKmVycm1zZzsKLQotICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIGlmIChkYXRhc2VjID09IE5VTEwgfHwgZGF0YXNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsLnNkYXRhIik7Ci0gICAgICBBU1NFUlQgKHJlbHNlYyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyAoYWJmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgIGRhdGFzZWMsIHJlbHNlYywKLQkJCQkJCSAgICZlcnJtc2cpKQotCXsKLQkgIGlmIChlcnJtc2cgPT0gTlVMTCkKLQkgICAgZWluZm8gKCIlQiVYOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlRVxuIiwKLQkJICAgYWJmZCk7Ci0JICBlbHNlCi0JICAgIGVpbmZvICgiJVglQjogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJXNcbiIsCi0JCSAgIGFiZmQsIGVycm1zZyk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uLAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9vc3RyaW5nLnNlZCBiL2xkL2VtdWx0ZW1wbC9vc3RyaW5nLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyNmQzZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvb3N0cmluZy5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXMvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTEgcy9eLyIvCi0kIHMvJC9uIi8KZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9wZS5lbSBiL2xkL2VtdWx0ZW1wbC9wZS5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhMDlmZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvcGUuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjc5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLXJtIC1mIGUke0VNVUxBVElPTl9OQU1FfS5jCi0oZWNobztlY2hvO2VjaG87ZWNobztlY2hvKT5lJHtFTVVMQVRJT05fTkFNRX0uYyAjIHRoZXJlLCBub3cgbGluZSBudW1iZXJzIG1hdGNoIDstKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIFdJTkRPV1NfTlQgKi8KLS8qIFRoZSBvcmlnaW5hbCBmaWxlIGdlbmVyYXRlZCByZXR1cm5lZCBkaWZmZXJlbnQgZGVmYXVsdCBzY3JpcHRzIGRlcGVuZGluZwotICAgb24gd2hldGhlciBjZXJ0YWluIHN3aXRjaGVzIHdlcmUgc2V0LCBidXQgdGhlc2Ugc3dpdGNoZXMgcGVydGFpbiB0byB0aGUKLSAgIExpbnV4IHN5c3RlbSBhbmQgdGhhdCBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgY29mZi4gIEluIHRoZSBOVCBjYXNlLCB3ZQotICAgb25seSBkZXRlcm1pbmUgaWYgdGhlIHN1YnN5c3RlbSBpcyBjb25zb2xlIG9yIHdpbmRvd3MgaW4gb3JkZXIgdG8gc2VsZWN0Ci0gICB0aGUgY29ycmVjdCBlbnRyeSBwb2ludCBieSBkZWZhdWx0LiAqLyAKLSAgCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLQotLyogRklYTUU6IFRoaXMgaXMgYSBCRkQgaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGFuZCB3ZSBzaG91bGQgbm90IGJlCi0gICB1c2luZyBpdCBoZXJlLiAgKi8KLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotI2luY2x1ZGUgInBlLWRsbC5oIgotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0vKiBQZXJtaXQgdGhlIGVtdWxhdGlvbiBwYXJhbWV0ZXJzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlY3Rpb24KLSAgIGFsaWdubWVudCBieSBzZXR0aW5nIE9WRVJSSURFX1NFQ1RJT05fQUxJR05NRU5ULiAgRklYTUU6IFRoaXMgbWFrZXMKLSAgIGl0IHNlZW0gdGhhdCBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCBzaG91bGQgbm90IGRlZmluZQotICAgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5ULiAgKi8KLSNpZiBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgIT0gJHtPVkVSUklERV9TRUNUSU9OX0FMSUdOTUVOVDotUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UfQotI3VuZGVmIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVAotI2RlZmluZSBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgJHtPVkVSUklERV9TRUNUSU9OX0FMSUdOTUVOVH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChUQVJHRVRfSVNfaTM4NnBlKQotI2RlZmluZSBETExfU1VQUE9SVAotI2VuZGlmCi0KLSNkZWZpbmUJUEVfREVGX1NVQlNZU1RFTQkJMwotCi0jaWZkZWYgVEFSR0VUX0lTX2FybV9lcG9jX3BlCi0jZGVmaW5lIGJmZF9hcm1fcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfYXJtX2Vwb2NfcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIFwKLQliZmRfYXJtX2Vwb2NfcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9hcm1fcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2FybV9lcG9jX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqKSk7Ci1zdGF0aWMgaW50IGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZTsKLXN0YXRpYyBpbnQgZGxsOwotc3RhdGljIGludCBzdXBwb3J0X29sZF9jb2RlID0gMDsKLXN0YXRpYyBjaGFyICogdGh1bWJfZW50cnlfc3ltYm9sID0gTlVMTDsKLXN0YXRpYyBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKmltYWdlX2Jhc2Vfc3RhdGVtZW50ID0gMDsKLQotc3RhdGljIGNoYXIgKnBlX291dF9kZWZfZmlsZW5hbWUgPSAwOwotc3RhdGljIGludCBwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9IC0xOyAvKiAwPWRpc2FibGUgMT1lbmFibGUgKi8KLXN0YXRpYyBjaGFyICpwZV9pbXBsaWJfZmlsZW5hbWUgPSAwOwotCi1leHRlcm4gY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIG91dHB1dF9maWxlbmFtZSA9ICIke0VYRUNVVEFCTEVfTkFNRTotYS5leGV9IjsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGNvbmZpZy5oYXNfc2hhcmVkID0gMTsKLSNlbmRpZgotfQotDAotLyogUEUgZm9ybWF0IGV4dHJhIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgKi8KLQotLyogVXNlZCBmb3Igc2V0dGluZyBmbGFncyBpbiB0aGUgUEUgaGVhZGVyLiAqLwotI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCQkoMzAwICArIDEpCi0jZGVmaW5lIE9QVElPTl9ETEwJCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9GSUxFX0FMSUdOTUVOVAkJKE9QVElPTl9ETEwgKyAxKQotI2RlZmluZSBPUFRJT05fSU1BR0VfQkFTRQkJKE9QVElPTl9GSUxFX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OCShPUFRJT05fSU1BR0VfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OCQkoT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT04JKE9QVElPTl9NQUpPUl9PU19WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OCQkoT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT04JKE9QVElPTl9NSU5PUl9PU19WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UCShPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU1RBQ0sgICAgICAgICAgICAgICAgICAgIChPUFRJT05fU0VDVElPTl9BTElHTk1FTlQgKyAxKQotI2RlZmluZSBPUFRJT05fU1VCU1lTVEVNICAgICAgICAgICAgICAgIChPUFRJT05fU1RBQ0sgKyAxKQotI2RlZmluZSBPUFRJT05fSEVBUAkJCShPUFRJT05fU1VCU1lTVEVNICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUJCShPUFRJT05fSEVBUCArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRfREVGCQkJKE9QVElPTl9TVVBQT1JUX09MRF9DT0RFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYUE9SVF9BTEwJCShPUFRJT05fT1VUX0RFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9FWENMVURFX1NZTUJPTFMJCShPUFRJT05fRVhQT1JUX0FMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9LSUxMX0FUUwkJCShPUFRJT05fRVhDTFVERV9TWU1CT0xTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NURENBTExfQUxJQVNFUwkJKE9QVElPTl9LSUxMX0FUUyArIDEpCi0jZGVmaW5lIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUAkoT1BUSU9OX1NURENBTExfQUxJQVNFUyArIDEpCi0jZGVmaW5lIE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVAJKE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTVBMSUJfRklMRU5BTUUJCShPUFRJT05fRElTQUJMRV9TVERDQUxMX0ZJWFVQICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RIVU1CX0VOVFJZCQkoT1BUSU9OX0lNUExJQl9GSUxFTkFNRSArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICAvKiBQRSBvcHRpb25zICovCi0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAotICB7ImRsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMfSwKLSAgeyJmaWxlLWFsaWdubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRklMRV9BTElHTk1FTlR9LAotICB7ImhlYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hFQVB9LCAKLSAgeyJpbWFnZS1iYXNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTUFHRV9CQVNFfSwKLSAgeyJtYWpvci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OfSwKLSAgeyJtYWpvci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OfSwKLSAgeyJtYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT059LAotICB7Im1pbm9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT059LAotICB7Im1pbm9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX09TX1ZFUlNJT059LAotICB7Im1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTn0sCi0gIHsic2VjdGlvbi1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UfSwKLSAgeyJzdGFjayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBQ0t9LAotICB7InN1YnN5c3RlbSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1VCU1lTVEVNfSwKLSAgeyJzdXBwb3J0LW9sZC1jb2RlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFfSwKLSAgeyJ0aHVtYi1lbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEhVTUJfRU5UUll9LAotI2lmZGVmIERMTF9TVVBQT1JUCi0gIC8qIGdldG9wdCBhbGxvd3MgYWJicmV2aWF0aW9ucywgc28gd2UgZG8gdGhpcyB0byBzdG9wIGl0IGZyb20gdHJlYXRpbmcgLW8KLSAgICAgYXMgYW4gYWJicmV2aWF0aW9uIGZvciB0aGlzIG9wdGlvbiAqLwotICB7Im91dHB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09VVF9ERUZ9LAotICB7Im91dHB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09VVF9ERUZ9LAotICB7ImV4cG9ydC1hbGwtc3ltYm9scyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0FMTH0sCi0gIHsiZXhjbHVkZS1zeW1ib2xzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWENMVURFX1NZTUJPTFN9LAotICB7ImtpbGwtYXQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0tJTExfQVRTfSwKLSAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1REQ0FMTF9BTElBU0VTfSwKLSAgeyJlbmFibGUtc3RkY2FsbC1maXh1cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5BQkxFX1NURENBTExfRklYVVB9LAotICB7ImRpc2FibGUtc3RkY2FsbC1maXh1cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTQUJMRV9TVERDQUxMX0ZJWFVQfSwKLSAgeyJvdXQtaW1wbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBMSUJfRklMRU5BTUV9LAotI2VuZGlmCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLQotLyogUEUvV0lOMzI7IGFkZGVkIHJvdXRpbmVzIHRvIGdldCB0aGUgc3Vic3lzdGVtIHR5cGUsIGhlYXAgYW5kL29yIHN0YWNrCi0gICBwYXJhbWV0ZXJzIHdoaWNoIG1heSBiZSBpbnB1dCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdm9pZCAqcHRyOwotICBpbnQgc2l6ZTsKLSAgaW50IHZhbHVlOwotICBjaGFyICpzeW1ib2w7Ci0gIGludCBpbml0ZWQ7Ci19IGRlZmluZm87Ci0KLSNkZWZpbmUgRChmaWVsZCxzeW1ib2wsZGVmKSAgeyZwZS5maWVsZCxzaXplb2YocGUuZmllbGQpLCBkZWYsIHN5bWJvbCwwfQotCi1zdGF0aWMgZGVmaW5mbyBpbml0W10gPQotewotICAvKiBpbWFnZWJhc2UgbXVzdCBiZSBmaXJzdCAqLwotI2RlZmluZSBJTUFHRUJBU0VPRkYgMAotICBEKEltYWdlQmFzZSwiX19pbWFnZV9iYXNlX18iLCBOVF9FWEVfSU1BR0VfQkFTRSksCi0jZGVmaW5lIERMTE9GRiAxCi0gIHsmZGxsLCBzaXplb2YoZGxsKSwgMCwgIl9fZGxsX18iLCAwfSwKLSAgRChTZWN0aW9uQWxpZ25tZW50LCJfX3NlY3Rpb25fYWxpZ25tZW50X18iLCBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQpLAotICBEKEZpbGVBbGlnbm1lbnQsIl9fZmlsZV9hbGlnbm1lbnRfXyIsIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCksCi0gIEQoTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21ham9yX29zX3ZlcnNpb25fXyIsIDQpLAotICBEKE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19taW5vcl9vc192ZXJzaW9uX18iLCAwKSwKLSAgRChNYWpvckltYWdlVmVyc2lvbiwiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iLCAxKSwKLSAgRChNaW5vckltYWdlVmVyc2lvbiwiX19taW5vcl9pbWFnZV92ZXJzaW9uX18iLCAwKSwKLSAgRChNYWpvclN1YnN5c3RlbVZlcnNpb24sIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsIDQpLAotICBEKE1pbm9yU3Vic3lzdGVtVmVyc2lvbiwiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgMCksCi0gIEQoU3Vic3lzdGVtLCJfX3N1YnN5c3RlbV9fIiwgJHtTVUJTWVNURU19KSwKLSAgRChTaXplT2ZTdGFja1Jlc2VydmUsIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iLCAweDIwMDAwMDApLAotICBEKFNpemVPZlN0YWNrQ29tbWl0LCJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iLCAweDEwMDApLAotICBEKFNpemVPZkhlYXBSZXNlcnZlLCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAweDEwMDAwMCksCi0gIEQoU2l6ZU9mSGVhcENvbW1pdCwiX19zaXplX29mX2hlYXBfY29tbWl0X18iLCAweDEwMDApLAotICBEKExvYWRlckZsYWdzLCJfX2xvYWRlcl9mbGFnc19fIiwgMHgwKSwKLSAgeyBOVUxMLCAwLCAwLCBOVUxMLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWJhc2VfZmlsZSA8YmFzZWZpbGU+ICAgICAgICAgICAgIEdlbmVyYXRlIGEgYmFzZSBmaWxlIGZvciByZWxvY2F0YWJsZSBETExzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1kbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgaW1hZ2UgYmFzZSB0byB0aGUgZGVmYXVsdCBmb3IgRExMc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZmlsZS1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgICAgU2V0IGZpbGUgYWxpZ25tZW50XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1oZWFwIDxzaXplPiAgICAgICAgICAgICAgICAgICAgICBTZXQgaW5pdGlhbCBzaXplIG9mIHRoZSBoZWFwXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1pbWFnZS1iYXNlIDxhZGRyZXNzPiAgICAgICAgICAgICBTZXQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyB2ZXJzaW9uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gdmVyc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHJldmlzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgcmV2aXNpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSByZXZpc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc2VjdGlvbi1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgU2V0IHNlY3Rpb24gYWxpZ25tZW50XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdGFjayA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICBTZXQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBzdGFja1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3Vic3lzdGVtIDxuYW1lPls6PHZlcnNpb24+XSAgICAgU2V0IHJlcXVpcmVkIE9TIHN1YnN5c3RlbSBbJiB2ZXJzaW9uXVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3VwcG9ydC1vbGQtY29kZSAgICAgICAgICAgICAgICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tdGh1bWItZW50cnk9PHN5bWJvbD4gICAgICAgICAgICAgU2V0IHRoZSBlbnRyeSBwb2ludCB0byBiZSBUaHVtYiA8c3ltYm9sPlxuIikpOwotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICAgICAgICAgICAgICBFeHBvcnQgc3ltYm9scyB3aXRoIGFuZCB3aXRob3V0IEBublxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgRG9uJ3QgbGluayBfc3ltIHRvIF9zeW1Abm5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgIExpbmsgX3N5bSB0byBfc3ltQG5uIHdpdGhvdXQgd2FybmluZ3NcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWV4Y2x1ZGUtc3ltYm9scyBzeW0sc3ltLC4uLiAgICAgIEV4Y2x1ZGUgc3ltYm9scyBmcm9tIGF1dG9tYXRpYyBleHBvcnRcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgICAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZXhwb3J0IGFsbCBnbG9iYWxzIHRvIERMTFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0ta2lsbC1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIEBubiBmcm9tIGV4cG9ydGVkIHN5bWJvbHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW91dC1pbXBsaWIgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1vdXRwdXQtZGVmIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIC5ERUYgZmlsZSBmb3IgdGhlIGJ1aWx0IERMTFxuIikpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfbmFtZSAobmFtZSwgdmFsKQotICAgICBjaGFyICpuYW1lOwotICAgICBsb25nIHZhbDsKLXsKLSAgaW50IGk7Ci0gIC8qIEZpbmQgdGhlIG5hbWUgYW5kIHNldCBpdC4gKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5wdHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBpbml0W2ldLnN5bWJvbCkgPT0gMCkKLQl7Ci0JICBpbml0W2ldLnZhbHVlID0gdmFsOwotCSAgaW5pdFtpXS5pbml0ZWQgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGFib3J0KCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdWJzeXN0ZW0gKCkKLXsKLSAgY29uc3QgY2hhciAqc3ZlcjsKLSAgaW50IGxlbjsKLSAgaW50IGk7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNvbnN0IGludCB2YWx1ZTsKLSAgICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotICAgIH0KLSAgdltdID0KLSAgICB7Ci0gICAgICB7ICJuYXRpdmUiLCAxLCAiTnRQcm9jZXNzU3RhcnR1cCIgfSwKLSAgICAgIHsgIndpbmRvd3MiLCAyLCAiV2luTWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJjb25zb2xlIiwgMywgIm1haW5DUlRTdGFydHVwIiB9LAotI2lmIDAKLSAgICAgIC8qIFRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IHJlY29nbml6ZSB0aGlzLiAgKi8KLSAgICAgIHsgIm9zMiIsIDUsICIiIH0sCi0jZW5kaWYKLSAgICAgIHsgInBvc2l4IiwgNywgIl9fUG9zaXhQcm9jZXNzU3RhcnR1cCJ9LAotICAgICAgeyAwLCAwLCAwIH0KLSAgICB9OwotCi0gIHN2ZXIgPSBzdHJjaHIgKG9wdGFyZywgJzonKTsKLSAgaWYgKHN2ZXIgPT0gTlVMTCkKLSAgICBsZW4gPSBzdHJsZW4gKG9wdGFyZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICplbmQ7Ci0KLSAgICAgIGxlbiA9IHN2ZXIgLSBvcHRhcmc7Ci0gICAgICBzZXRfcGVfbmFtZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCi0JCSAgIHN0cnRvdWwgKHN2ZXIgKyAxLCAmZW5kLCAwKSk7Ci0gICAgICBpZiAoKmVuZCA9PSAnLicpCi0Jc2V0X3BlX25hbWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLAotCQkgICAgIHN0cnRvdWwgKGVuZCArIDEsICZlbmQsIDApKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBiYWQgdmVyc2lvbiBudW1iZXIgaW4gLXN1YnN5c3RlbSBvcHRpb25cbiIpKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgdltpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKG9wdGFyZywgdltpXS5uYW1lLCBsZW4pID09IDAKLQkgICYmIHZbaV0ubmFtZVtsZW5dID09ICdcMCcpCi0JewotCSAgY29uc3QgY2hhciAqaW5pdGlhbF9zeW1ib2xfY2hhcjsKLQkgIGNvbnN0IGNoYXIgKmVudHJ5OwotCi0JICBzZXRfcGVfbmFtZSAoIl9fc3Vic3lzdGVtX18iLCB2W2ldLnZhbHVlKTsKLQotCSAgaW5pdGlhbF9zeW1ib2xfY2hhciA9ICR7SU5JVElBTF9TWU1CT0xfQ0hBUn07Ci0JICBpZiAoKmluaXRpYWxfc3ltYm9sX2NoYXIgPT0gJ1wwJykKLQkgICAgZW50cnkgPSB2W2ldLmVudHJ5OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqYWxjX2VudHJ5OwotCi0JICAgICAgLyogbGFuZ19hZGRfZW50cnkgZXhwZWN0cyBpdHMgYXJndW1lbnQgdG8gYmUgcGVybWFuZW50bHkKLQkJIGFsbG9jYXRlZCwgc28gd2UgZG9uJ3QgZnJlZSB0aGlzIHN0cmluZy4gICovCi0JICAgICAgYWxjX2VudHJ5ID0geG1hbGxvYyAoc3RybGVuIChpbml0aWFsX3N5bWJvbF9jaGFyKQotCQkJCSAgICsgc3RybGVuICh2W2ldLmVudHJ5KQotCQkJCSAgICsgMSk7Ci0JICAgICAgc3RyY3B5IChhbGNfZW50cnksIGluaXRpYWxfc3ltYm9sX2NoYXIpOwotCSAgICAgIHN0cmNhdCAoYWxjX2VudHJ5LCB2W2ldLmVudHJ5KTsKLQkgICAgICBlbnRyeSA9IGFsY19lbnRyeTsKLQkgICAgfQotCi0JICBsYW5nX2FkZF9lbnRyeSAoZW50cnksIDEpOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgCi0gIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iKSwgb3B0YXJnKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfdmFsdWUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIAotewotICBjaGFyICplbmQ7Ci0gIAotICBzZXRfcGVfbmFtZSAobmFtZSwgIHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCkpOwotICAKLSAgaWYgKGVuZCA9PSBvcHRhcmcpCi0gICAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIpLCBvcHRhcmcpOwotCi0gIG9wdGFyZyA9IGVuZDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdGFja19oZWFwIChyZXNuYW1lLCBjb21uYW1lKQotICAgICBjaGFyICpyZXNuYW1lOwotICAgICBjaGFyICpjb21uYW1lOwotewotICBzZXRfcGVfdmFsdWUgKHJlc25hbWUpOwotICAKLSAgaWYgKCpvcHRhcmcgPT0gJywnKQotICAgIHsKLSAgICAgIG9wdGFyZysrOwotICAgICAgc2V0X3BlX3ZhbHVlIChjb21uYW1lKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpvcHRhcmcpCi0gICAgZWluZm8gKF8oIiVQJUY6IHN0cmFuZ2UgaGV4IGluZm8gZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iKSwgb3B0YXJnKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICB3YW50ZXJyb3IgPSBvcHRlcnI7Ci0KLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi0iLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfRklMRToKLSAgICAgIGxpbmtfaW5mby5iYXNlX2ZpbGUgPSAoUFRSKSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XQik7Ci0gICAgICBpZiAobGlua19pbmZvLmJhc2VfZmlsZSA9PSBOVUxMKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgIHhleGl0ICgxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogUEUgb3B0aW9ucyAqLwotICAgIGNhc2UgT1BUSU9OX0hFQVA6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAiX19zaXplX29mX2hlYXBfY29tbWl0X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NUQUNLOiAKLSAgICAgIHNldF9wZV9zdGFja19oZWFwICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsICJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NVQlNZU1RFTToKLSAgICAgIHNldF9wZV9zdWJzeXN0ZW0gKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9vc192ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRklMRV9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX2ZpbGVfYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19zZWN0aW9uX2FsaWdubWVudF9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9ETEw6Ci0gICAgICBzZXRfcGVfbmFtZSAoIl9fZGxsX18iLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0lNQUdFX0JBU0U6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX2ltYWdlX2Jhc2VfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERToKLSAgICAgIHN1cHBvcnRfb2xkX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fVEhVTUJfRU5UUlk6Ci0gICAgICB0aHVtYl9lbnRyeV9zeW1ib2wgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLSNpZmRlZiBETExfU1VQUE9SVAotICAgIGNhc2UgT1BUSU9OX09VVF9ERUY6Ci0gICAgICBwZV9vdXRfZGVmX2ZpbGVuYW1lID0geHN0cmR1cCAob3B0YXJnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VYUE9SVF9BTEw6Ci0gICAgICBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRVhDTFVERV9TWU1CT0xTOgotICAgICAgcGVfZGxsX2FkZF9leGNsdWRlcyAob3B0YXJnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0tJTExfQVRTOgotICAgICAgcGVfZGxsX2tpbGxfYXRzID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NURENBTExfQUxJQVNFUzoKLSAgICAgIHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRU5BQkxFX1NURENBTExfRklYVVA6Ci0gICAgICBwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVA6Ci0gICAgICBwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9JTVBMSUJfRklMRU5BTUU6Ci0gICAgICBwZV9pbXBsaWJfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybiAxOwotfQotDAotLyogQXNzaWduIHZhbHVlcyB0byB0aGUgc3BlY2lhbCBzeW1ib2xzIGJlZm9yZSB0aGUgbGlua2VyIHNjcmlwdCBpcwotICAgcmVhZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgKCkKLXsKLSAgLyogUnVuIHRocm91Z2ggYW5kIGludmVudCBzeW1ib2xzIGZvciBhbGwgdGhlCi0gICAgIG5hbWVzIGFuZCBpbnNlcnQgdGhlIGRlZmF1bHRzLiAqLwotICBpbnQgajsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzYXZlOwotCi0gIGlmICghaW5pdFtJTUFHRUJBU0VPRkZdLmluaXRlZCkKLSAgICB7Ci0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSAwOwotICAgICAgZWxzZSBpZiAoaW5pdFtETExPRkZdLnZhbHVlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gTlRfRExMX0lNQUdFX0JBU0U7Ci0gICAgICBlbHNlCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gTlRfRVhFX0lNQUdFX0JBU0U7Ci0gICAgfQotCi0gIC8qIERvbid0IGRvIGFueSBzeW1ib2wgYXNzaWdubWVudHMgaWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdsdWUgdGhlIGFzc2lnbm1lbnRzIGludG8gdGhlIGFicyBzZWN0aW9uICovCi0gIHNhdmUgPSBzdGF0X3B0cjsKLQotICBzdGF0X3B0ciA9ICYoYWJzX291dHB1dF9zZWN0aW9uLT5jaGlsZHJlbik7Ci0KLSAgZm9yIChqID0gMDsgaW5pdFtqXS5wdHI7IGorKykKLSAgICB7Ci0gICAgICBsb25nIHZhbCA9IGluaXRbal0udmFsdWU7Ci0gICAgICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKnJ2OwotICAgICAgcnYgPSBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JyAsaW5pdFtqXS5zeW1ib2wsIGV4cF9pbnRvcCAodmFsKSkpOwotICAgICAgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2Yoc2hvcnQpKQotCSooc2hvcnQgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoaW50KSkKLQkqKGludCAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihsb25nKSkKLQkqKGxvbmcgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBsb25nIGxvbmcgb3Igb3RoZXIgc3BlY2lhbCB0eXBlLiAgKi8KLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoYmZkX3ZtYSkpCi0JKihiZmRfdm1hICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlCWFib3J0KCk7Ci0gICAgICBpZiAoaiA9PSBJTUFHRUJBU0VPRkYpCi0JaW1hZ2VfYmFzZV9zdGF0ZW1lbnQgPSBydjsKLSAgICB9Ci0gIC8qIFJlc3RvcmUgdGhlIHBvaW50ZXIuICovCi0gIHN0YXRfcHRyID0gc2F2ZTsKLSAgCi0gIGlmIChwZS5GaWxlQWxpZ25tZW50ID4KLSAgICAgIHBlLlNlY3Rpb25BbGlnbm1lbnQpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIikpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxpbmtlciBzY3JpcHQgYW5kIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucwotICAgaGF2ZSBiZWVuIHJlYWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlICgpCi17Ci0gIC8qIFRoZSBXaW5kb3dzIGxpYnJhcmllcyBhcmUgZGVzaWduZWQgZm9yIHRoZSBsaW5rZXIgdG8gdHJlYXQgdGhlCi0gICAgIGVudHJ5IHBvaW50IGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBPdGhlcndpc2UsIHRoZSAub2JqIHRoYXQKLSAgICAgZGVmaW5lcyBtYWluQ1JUU3RhcnR1cCBpcyBicm91Z2h0IGluIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0Ci0gICAgIGVuY291bnRlcmVkIGluIGxpYmMubGliIGFuZCBpdCBoYXMgb3RoZXIgc3ltYm9scyBpbiBpdCB3aGljaCB3aWxsCi0gICAgIGJlIHB1bGxlZCBpbiBieSB0aGUgbGluayBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgYWN0IGFzCi0gICAgIHRob3VnaCB0aGUgdXNlciBzcGVjaWZpZWQgLXUgd2l0aCB0aGUgZW50cnkgcG9pbnQgc3ltYm9sLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBsaW5rZXIgc2NyaXB0IGFuZCBjb21tYW5kIGxpbmUKLSAgICAgb3B0aW9ucyBoYXZlIGJlZW4gcmVhZCwgc28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByaWdodCBlbnRyeQotICAgICBwb2ludC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgaW5wdXQgZmlsZXMgYXJlCi0gICAgIG9wZW5lZCwgc28gcmVnaXN0ZXJpbmcgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQgd2lsbCBtYWtlIGEKLSAgICAgZGlmZmVyZW5jZS4gICovCi0KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiBlbnRyeV9zeW1ib2wgIT0gTlVMTCkKLSAgICBsZGxhbmdfYWRkX3VuZGVmIChlbnRyeV9zeW1ib2wpOwotfQotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnBlX3VuZGVmX2ZvdW5kX3N5bTsKLQotc3RhdGljIGJvb2xlYW4KLXBlX3VuZGVmX2NkZWNsX21hdGNoIChoLCBzdHJpbmcpCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBQVFIgc3RyaW5nOwotewotICBpbnQgc2wgPSBzdHJsZW4gKHN0cmluZyk7Ci0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5zdHJpbmcsIHN0cmluZywgc2wpID09IDAKLSAgICAgICYmIGgtPnJvb3Quc3RyaW5nW3NsXSA9PSAnQCcpCi0gIHsKLSAgICBwZV91bmRlZl9mb3VuZF9zeW0gPSBoOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXBlX2ZpeHVwX3N0ZGNhbGxzICgpCi17Ci0gIHN0YXRpYyBpbnQgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAwOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWYsICpzeW07Ci0gIGNoYXIgKmF0OwotICBmb3IgKHVuZGVmID0gbGlua19pbmZvLmhhc2gtPnVuZGVmczsgdW5kZWY7IHVuZGVmPXVuZGVmLT5uZXh0KQotICAgIGlmICh1bmRlZi0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICB7Ci0gICAgICBhdCA9IHN0cmNociAodW5kZWYtPnJvb3Quc3RyaW5nLCAnQCcpOwotICAgICAgaWYgKGF0KQotICAgICAgewotCS8qIFRoZSBzeW1ib2wgaXMgYSBzdGRjYWxsIHN5bWJvbCwgc28gbGV0J3MgbG9vayBmb3IgYSBjZGVjbAotCSAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHJlc29sdmUgdG8gdGhhdCAqLwotCWNoYXIgKmNuYW1lID0geHN0cmR1cCAodW5kZWYtPnJvb3Quc3RyaW5nKTsKLQlhdCA9IHN0cmNociAoY25hbWUsICdAJyk7Ci0JKmF0ID0gMDsKLQlzeW0gPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGNuYW1lLCAwLCAwLCAxKTsKLQlpZiAoc3ltICYmIHN5bS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JewotCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOwotCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAotCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgY25hbWUpOwotCSAgICAgIGlmICghIGdhdmVfd2FybmluZ19tZXNzYWdlKQotCQl7Ci0JCSAgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAxOwotCQkgIGVpbmZvKF8oIlVzZSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2Ugd2FybmluZ3NcbiIpKTsKLQkJICBlaW5mbyhfKCJVc2UgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSBmaXh1cHNcbiIpKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCS8qIFRoZSBzeW1ib2wgaXMgYSBjZGVjbCBzeW1ib2wsIHNvIHdlIGxvb2sgZm9yIHN0ZGNhbGwKLQkgICBzeW1ib2xzIC0gd2hpY2ggbWVhbnMgc2Nhbm5pbmcgdGhlIHdob2xlIHN5bWJvbCB0YWJsZSAqLwotCXBlX3VuZGVmX2ZvdW5kX3N5bSA9IDA7Ci0JYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIHBlX3VuZGVmX2NkZWNsX21hdGNoLAotCQkJCShQVFIpIHVuZGVmLT5yb290LnN0cmluZyk7Ci0Jc3ltID0gcGVfdW5kZWZfZm91bmRfc3ltOwotCWlmIChzeW0pCi0JewotCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOwotCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAotCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgc3ltLT5yb290LnN0cmluZyk7Ci0JICAgICAgaWYgKCEgZ2F2ZV93YXJuaW5nX21lc3NhZ2UpCi0JCXsKLQkJICBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDE7Ci0JCSAgZWluZm8oXygiVXNlIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSB3YXJuaW5nc1xuIikpOwotCQkgIGVpbmZvKF8oIlVzZSAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIGZpeHVwc1xuIikpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgLyogUGFzcyB0aGUgd2Fja3kgUEUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaW50byB0aGUgb3V0cHV0IGJmZC4KLSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIGEgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGJ5Ci0gICAgIGluY2x1ZGluZyBhbiBpbnRlcm5hbCBCRkQgaGVhZGVyLiAgKi8KLSAgCi0gIGlmICghY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0gICAgZWluZm8gKF8oIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iKSk7Ci0KLSAgcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkciA9IHBlOwotICBwZV9kYXRhIChvdXRwdXRfYmZkKS0+ZGxsID0gaW5pdFtETExPRkZdLnZhbHVlOwotCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgaWYgKHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwKSAvKiAtMT13YXJuIG9yIDE9ZGlzYWJsZSAqLwotICAgIHBlX2ZpeHVwX3N0ZGNhbGxzICgpOwotCi0gIHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHBlX2RsbF9idWlsZF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVEFSR0VUX0lTX2FybXBlKSB8fCBkZWZpbmVkKFRBUkdFVF9JU19hcm1fZXBvY19wZSkKLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAiYXJtIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgYXJtIGJhY2tlbmQgbmVlZHMgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIG91dHB1dCBoYXNoIHN0cnVjdHVyZS4KLQkgVGhlc2Ugd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgYW4gYXJtIGZvcm1hdCwKLQkgaGVuY2Ugd2UgZG8gbm90IHN1cHBvcnQgbGlua2luZyBhbmQgY2hhbmdpbmcgb3V0cHV0IGZvcm1hdHMgYXQgdGhlCi0JIHNhbWUgdGltZS4gIFVzZSBhIGxpbmsgZm9sbG93ZWQgYnkgb2JqY29weSB0byBjaGFuZ2Ugb3V0cHV0IGZvcm1hdHMuICAqLwotICAgICAgZWluZm8gKCIlRiVYJVA6IGVycm9yOiBjYW5ub3QgY2hhbmdlIG91dHB1dCBmb3JtYXQgd2hpbHN0IGxpbmtpbmcgQVJNIGJpbmFyaWVzXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHsKLSAgICAvKiBGaW5kIGEgQkZEIHRoYXQgY2FuIGhvbGQgdGhlIGludGVyd29ya2luZyBzdHVicy4gICovCi0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmIChiZmRfYXJtX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKSkKLQkgIGJyZWFrOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICB7Ci0gICAgaW50IGlzX21zX2FyY2g7Ci0gICAgYmZkICpjdXJfYXJjaCA9IDA7Ci0gICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaXMyOwotCi0gICAgLyogQ2FyZWZ1bCAtIHRoaXMgaXMgYSBzaGVsbCBzY3JpcHQuICBXYXRjaCB0aG9zZSBkb2xsYXIgc2lnbnMhICovCi0gICAgLyogTWljcm9zb2Z0IGltcG9ydCBsaWJyYXJpZXMgaGF2ZSBldmVyeSBtZW1iZXIgbmFtZWQgdGhlIHNhbWUsCi0gICAgICAgYW5kIG5vdCBpbiB0aGUgcmlnaHQgb3JkZXIgZm9yIHVzIHRvIGxpbmsgdGhlbSBjb3JyZWN0bHkuICBXZQotICAgICAgIG11c3QgZGV0ZWN0IHRoZXNlIGFuZCByZW5hbWUgdGhlIG1lbWJlcnMgc28gdGhhdCB0aGV5J2xsIGxpbmsKLSAgICAgICBjb3JyZWN0bHkuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb2JqZWN0czogdGhlIGhlYWQsIHRoZQotICAgICAgIHRodW5rcywgYW5kIHRoZSBzZW50aW5lbChzKS4gIFRoZSBoZWFkIGlzIGVhc3k7IGl0J3MgdGhlIG9uZQotICAgICAgIHdpdGggaWRhdGEyLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlbnRpbmVscyB3b24ndCBoYXZlIHJlbG9jcywKLSAgICAgICBhbmQgdGhlIHRodW5rcyB3aWxsLiAgSXQncyBlYXNpZXIgdGhhbiBjaGVja2luZyB0aGUgc3ltYm9sCi0gICAgICAgdGFibGUgZm9yIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoaXMtPnRoZV9iZmQtPm15X2FyY2hpdmUpCi0JICB7Ci0JICAgIGJmZCAqYXJjaCA9IGlzLT50aGVfYmZkLT5teV9hcmNoaXZlOwotCSAgICBpZiAoY3VyX2FyY2ggIT0gYXJjaCkKLQkgICAgICB7Ci0JCWN1cl9hcmNoID0gYXJjaDsKLQkJaXNfbXNfYXJjaCA9IDE7Ci0JCWZvciAoaXMyID0gaXM7Ci0JCSAgICAgaXMyICYmIGlzMi0+dGhlX2JmZC0+bXlfYXJjaGl2ZSA9PSBhcmNoOwotCQkgICAgIGlzMiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopaXMyLT5uZXh0KQotCQkgIHsKLQkJICAgIGlmIChzdHJjbXAgKGlzLT50aGVfYmZkLT5maWxlbmFtZSwgaXMyLT50aGVfYmZkLT5maWxlbmFtZSkpCi0JCSAgICAgIGlzX21zX2FyY2ggPSAwOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKGlzX21zX2FyY2gpCi0JICAgICAgewotCQlpbnQgaWRhdGEyID0gMCwgcmVsb2NfY291bnQ9MDsKLQkJYXNlY3Rpb24gKnNlYzsKLQkJY2hhciAqbmV3X25hbWUsIHNlcTsKLQotCQlmb3IgKHNlYyA9IGlzLT50aGVfYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmlkYXRhXCQyIikgPT0gMCkKLQkJICAgICAgaWRhdGEyID0gMTsKLQkJICAgIHJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0JCSAgfQotCi0JCWlmIChpZGF0YTIpIC8qIC5pZGF0YTIgaXMgdGhlIFRPQyAqLwotCQkgIHNlcSA9ICdhJzsKLQkJZWxzZSBpZiAocmVsb2NfY291bnQgPiAwKSAvKiB0aHVua3MgKi8KLQkJICBzZXEgPSAnYic7Ci0JCWVsc2UgLyogc2VudGluZWwgKi8KLQkJICBzZXEgPSAnYyc7Ci0KLQkJbmV3X25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGlzLT50aGVfYmZkLT5maWxlbmFtZSkgKyAzKTsKLQkJc3ByaW50ZiAobmV3X25hbWUsICIlcy4lYyIsIGlzLT50aGVfYmZkLT5maWxlbmFtZSwgc2VxKTsKLQkJaXMtPnRoZV9iZmQtPmZpbGVuYW1lID0gbmV3X25hbWU7Ci0KLQkJbmV3X25hbWUgPSB4bWFsbG9jIChzdHJsZW4oaXMtPmZpbGVuYW1lKSArIDMpOwotCQlzcHJpbnRmIChuZXdfbmFtZSwgIiVzLiVjIiwgaXMtPmZpbGVuYW1lLCBzZXEpOwotCQlpcy0+ZmlsZW5hbWUgPSBuZXdfbmFtZTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLX0KLQwKLXN0YXRpYyB2b2lkICAKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci0jaWZkZWYgVEFSR0VUX0lTX3BwY3BlCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgdG9jIGluZm9ybWF0aW9uICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoJmxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX3BwY3BlICovCi0KLSNpZiBkZWZpbmVkKFRBUkdFVF9JU19hcm1wZSkgfHwgZGVmaW5lZChUQVJHRVRfSVNfYXJtX2Vwb2NfcGUpCi0gIC8qIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViCi0gICAgIHNlY3Rpb24uCi0KLSAgICAgSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlCi0gICAgIGluZm9ybWF0aW9uLiAgRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lCi0gICAgIG9wdGlvbj8gIGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCEgYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0JICAgIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8sIHN1cHBvcnRfb2xkX2NvZGUpKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyBmb3IgaW50ZXJ3b3JraW5nIiksCi0JCSAgIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9hcm1fcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX2FybXBlICovCi19Ci0MCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBpc24ndCByZWNvZ25pemVkIGFzIGEgQkZELiAgV2UKLSAgIGNoZWNrIGhlcmUgZm9yIC5ERUYgZmlsZXMgYW5kIHB1bGwgdGhlbSBpbiBhdXRvbWF0aWNhbGx5LiAqLwotCi1zdGF0aWMgaW50Ci1zYXdfb3B0aW9uKGNoYXIgKm9wdGlvbikKLXsKLSAgaW50IGk7Ci0gIGZvciAoaT0wOyBpbml0W2ldLnB0cjsgaSsrKQotICAgIGlmIChzdHJjbXAgKGluaXRbaV0uc3ltYm9sLCBvcHRpb24pID09IDApCi0gICAgICByZXR1cm4gaW5pdFtpXS5pbml0ZWQ7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlKGVudHJ5KQotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSNpZmRlZiBETExfU1VQUE9SVAotICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotCi0gIGlmIChzdHJjbXAgKGV4dCwgIi5kZWYiKSA9PSAwIHx8IHN0cmNtcCAoZXh0LCAiLkRFRiIpID09IDApCi0gIHsKLSAgICBpZiAocGVfZGVmX2ZpbGUgPT0gMCkKLSAgICAgIHBlX2RlZl9maWxlID0gZGVmX2ZpbGVfZW1wdHkgKCk7Ci0gICAgZGVmX2ZpbGVfcGFyc2UgKGVudHJ5LT5maWxlbmFtZSwgcGVfZGVmX2ZpbGUpOwotICAgIGlmIChwZV9kZWZfZmlsZSkKLSAgICB7Ci0gICAgICBpbnQgaSwgYnVmbGVuPTAsIGxlbjsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGxlbiA9IHN0cmxlbihwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgIGlmIChidWZsZW4gPCBsZW4rMikKLQkgICAgYnVmbGVuID0gbGVuKzI7Ci0JfQotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmbGVuKTsKLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgc3ByaW50ZihidWYsICJfJXMiLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgYnVmLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICAgICAgaC0+dS51bmRlZi5hYmZkID0gTlVMTDsKLQkgICAgICBiZmRfbGlua19hZGRfdW5kZWYgKGxpbmtfaW5mby5oYXNoLCBoKTsKLQkgICAgfQotCX0KLSAgICAgIGZyZWUgKGJ1Zik7Ci0KLSAgICAgIC8qIGRlZl9maWxlX3ByaW50IChzdGRvdXQsIHBlX2RlZl9maWxlKTsgKi8KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+aXNfZGxsID09IDEpCi0JbGlua19pbmZvLnNoYXJlZCA9IDE7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+YmFzZV9hZGRyZXNzICE9IChiZmRfdm1hKSgtMSkpCi0gICAgICB7Ci0JcGUuSW1hZ2VCYXNlID0KLQlwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSA9Ci0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gcGVfZGVmX2ZpbGUtPmJhc2VfYWRkcmVzczsKLQlpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkID0gMTsKLQlpZiAoaW1hZ2VfYmFzZV9zdGF0ZW1lbnQpCi0JICBpbWFnZV9iYXNlX3N0YXRlbWVudC0+ZXhwID0KLQkgICAgZXhwX2Fzc29wICgnPScsICJfX2ltYWdlX2Jhc2VfXyIsIGV4cF9pbnRvcCAocGUuSW1hZ2VCYXNlKSk7Ci0gICAgICB9Ci0KLSNpZiAwCi0gICAgICAvKiBOb3Qgc3VyZSBpZiB0aGVzZSAqc2hvdWxkKiBiZSBzZXQgKi8KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLSAgICAgIHsKLQlwZS5NYWpvckltYWdlVmVyc2lvbiA9IHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yOwotCXBlLk1pbm9ySW1hZ2VWZXJzaW9uID0gcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3I7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSAhPSAtMQotCSAgJiYgISBzYXdfb3B0aW9uICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIpKQotICAgICAgewotCXBlLlNpemVPZlN0YWNrUmVzZXJ2ZSA9IHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlOwotCWlmIChwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0ICE9IC0xKQotCSAgcGUuU2l6ZU9mU3RhY2tDb21taXQgPSBwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0OwotICAgICAgfQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUgIT0gLTEKLQkgICYmICEgc2F3X29wdGlvbiAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIpKQotICAgICAgewotCXBlLlNpemVPZkhlYXBSZXNlcnZlID0gcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZTsKLQlpZiAocGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0ICE9IC0xKQotCSAgcGUuU2l6ZU9mSGVhcENvbW1pdCA9IHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdDsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLSAgCi19Ci0KLXN0YXRpYyBib29sZWFuCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fcmVjb2duaXplZF9maWxlKGVudHJ5KQotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSNpZmRlZiBETExfU1VQUE9SVAotI2lmZGVmIFRBUkdFVF9JU19pMzg2cGUKLSAgcGVfZGxsX2lkX3RhcmdldCAoInBlaS1pMzg2Iik7Ci0jZW5kaWYKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCkgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotICAgICAgaWYgKHN0cmNtcCAoZXh0LCAiLmRsbCIpID09IDAgfHwgc3RyY21wIChleHQsICIuRExMIikgPT0gMCkKLQlyZXR1cm4gcGVfaW1wbGllZF9pbXBvcnRfZGxsIChlbnRyeS0+ZmlsZW5hbWUpOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoICgpCi17Ci0jaWYgZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKQotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLSAgaWYgKHRodW1iX2VudHJ5X3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHRodW1iX2VudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIAotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBzdGF0aWMgY2hhciBidWZmZXJbMzJdOwotCSAgYmZkX3ZtYSB2YWw7Ci0JICAKLQkgIC8qIFNwZWNpYWwgcHJvY2VzaW5nIGlzIHJlcXVpcmVkIGZvciBhIFRodW1iIGVudHJ5IHN5bWJvbC4gIFRoZQotCSAgICAgYm90dG9tIGJpdCBvZiBpdHMgYWRkcmVzcyBtdXN0IGJlIHNldC4gICovCi0JICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkJaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgCi0JICB2YWwgfD0gMTsKLQkgIAotCSAgLyogTm93IGNvbnZlcnQgdGhpcyB2YWx1ZSBpbnRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiBlbnRyeV9zeW1ib2wKLQkgICAgIHdoZXJlIHRoZSBsYW5nX2ZpbmlzaCgpIGZ1bmN0aW9uIHdpbGwgcGljayBpdCB1cC4gICovCi0JICBidWZmZXJbMF0gPSAnMCc7Ci0JICBidWZmZXJbMV0gPSAneCc7Ci0JICAKLQkgIHNwcmludGZfdm1hIChidWZmZXIgKyAyLCB2YWwpOwotCSAgCi0JICBpZiAoZW50cnlfc3ltYm9sICE9IE5VTEwgJiYgZW50cnlfZnJvbV9jbWRsaW5lKQotCSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIpLAotCQkgICB0aHVtYl9lbnRyeV9zeW1ib2wsIGVudHJ5X3N5bWJvbCk7Ci0JICBlbnRyeV9zeW1ib2wgPSBidWZmZXI7Ci0JfQotICAgICAgZWxzZQotCWVpbmZvIChfKCIlUDogd2FybmluZzogY29ubm90IGZpbmQgdGh1bWIgc3RhcnQgc3ltYm9sICVzXG4iKSwgdGh1bWJfZW50cnlfc3ltYm9sKTsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKSAqLwotCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgewotICAgICAgcGVfZGxsX2ZpbGxfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICAgICAgaWYgKHBlX2ltcGxpYl9maWxlbmFtZSkKLQlwZV9kbGxfZ2VuZXJhdGVfaW1wbGliIChwZV9kZWZfZmlsZSwgcGVfaW1wbGliX2ZpbGVuYW1lKTsKLSAgICB9Ci0gIGlmIChwZV9vdXRfZGVmX2ZpbGVuYW1lKQotICAgIHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSAocGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0jZW5kaWYKLX0KLQotDAotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uCi0KLSAgIFdlIHVzZSB0aGlzIHRvIHB1dCBzZWN0aW9ucyBpbiBhIHJlYXNvbmFibGUgcGxhY2UgaW4gdGhlIGZpbGUsIGFuZAotICAgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgYWxpZ25lZCBhcyByZXF1aXJlZC4KLQotICAgV2UgaGFuZGxlIGdyb3VwZWQgc2VjdGlvbnMgaGVyZSBhcyB3ZWxsLiAgQSBzZWN0aW9uIG5hbWVkIC5mb28kbm4KLSAgIGdvZXMgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gLmZvby4gIEFsbCBncm91cGVkIHNlY3Rpb25zIGFyZSBzb3J0ZWQKLSAgIGJ5IG5hbWUuCi0KLSAgIEdyb3VwZWQgc2VjdGlvbnMgZm9yIHRoZSBkZWZhdWx0IHNlY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZQotICAgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IHVzaW5nIHdpbGRjYXJkcywgYW5kIGFyZSBzb3J0ZWQgYnkKLSAgIHNvcnRfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBjaGFyICpob2xkX3NlY3Rpb25fbmFtZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci0KLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHJhbmRvbSBTSEZfQUxMT0MKLSAgIHNlY3Rpb25zIGluIHRoZSByaWdodCBzZWdtZW50LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gIGNoYXIgKmRvbGxhcjsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLQotICBob2xkX3NlY3Rpb24gPSBzOwotCi0gIGhvbGRfc2VjdGlvbl9uYW1lID0geHN0cmR1cCAoc2VjbmFtZSk7Ci0gIGlmICghbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBkb2xsYXIgPSBzdHJjaHIgKGhvbGRfc2VjdGlvbl9uYW1lLCAnJCcpOwotICAgICAgaWYgKGRvbGxhciAhPSBOVUxMKQotCSpkb2xsYXIgPSAnXDAnOwotICAgIH0KLQotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgICAgIGNoYXIgKm91dHNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gICAgICBldHJlZV90eXBlICphZGRyZXNzOwotCi0gICAgICAvKiBUcnkgdG8gcHV0IHRoZSBuZXcgb3V0cHV0IHNlY3Rpb24gaW4gYSByZWFzb25hYmxlIHBsYWNlIGJhc2VkCi0JIG9uIHRoZSBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICAqLwotICAgICAgcGxhY2UgPSBOVUxMOwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX2JzczsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICAgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLQlwbGFjZSA9IGhvbGRfZGF0YTsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgICAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICAgICAmJiBob2xkX3JkYXRhICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX3JkYXRhOwotICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotCXBsYWNlID0gaG9sZF90ZXh0OwotCi0gICAgICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmCi0JIHRoZSBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGgKLQkgZGlmZmVyZW50IGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICAgICAgb3V0c2VjbmFtZSA9IHhzdHJkdXAgKGhvbGRfc2VjdGlvbl9uYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSkgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgY2hhciAqbmV3bmFtZTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBsZW4gPSBzdHJsZW4gKG91dHNlY25hbWUpOwotCSAgbmV3bmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotCSAgc3RyY3B5IChuZXduYW1lLCBvdXRzZWNuYW1lKTsKLQkgIGkgPSAwOwotCSAgZG8KLQkgICAgewotCSAgICAgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgICAgICsraTsKLQkgICAgfQotCSAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotCSAgZnJlZSAob3V0c2VjbmFtZSk7Ci0JICBvdXRzZWNuYW1lID0gbmV3bmFtZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gZnJlZSBPVVRTRUNOQU1FLCBhcyBpdCBtYXkgZ2V0IGF0dGFjaGVkIHRvCi0JIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnQuICAqLwotCi0gICAgICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZQotCSByaWdodCBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sKLQkgbmVhdGVyLiAgKi8KLSAgICAgIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKTsKLSAgICAgIGlmIChzbmV3ID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICAgICAgaWYgKHBsYWNlICE9IE5VTEwgJiYgcGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQkgICAgOwotCSAgKnBwcyA9IHNuZXctPm5leHQ7Ci0JICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotCSAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLQl9Ci0KLSAgICAgIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgb2xkID0gc3RhdF9wdHI7Ci0gICAgICBzdGF0X3B0ciA9ICZhZGQ7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlhZGRyZXNzID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGwgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gYSBwYWdlCi0JICAgICBib3VuZGFyeS4gICovCi0JICBhZGRyZXNzID0gZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiX19zZWN0aW9uX2FsaWdubWVudF9fIikpOwotCX0KLQotICAgICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJCSAgIChiZmRfdm1hKSAwLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICAgICAgaG9sZF91c2UgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotCi0gICAgICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotCSgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsCi0JIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7Ci0KLSAgICAgIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgICAgIGlmIChwbGFjZSAhPSBOVUxMKQotCXsKLQkgICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLQkgIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCX0KLQotICAgICAgc3RhdF9wdHIgPSBvbGQ7Ci0gICAgfQotCi0gIGlmIChkb2xsYXIgPT0gTlVMTCkKLSAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwbDsKLSAgICAgIGJvb2xlYW4gZm91bmRfZG9sbGFyOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGxpc3Q7Ci0KLSAgICAgIC8qIFRoZSBzZWN0aW9uIG5hbWUgaGFzIGEgJyQnLiAgU29ydCBpdCB3aXRoIHRoZSBvdGhlciAnJCcKLSAgICAgICAgIHNlY3Rpb25zLiAgKi8KLQotICAgICAgZm91bmRfZG9sbGFyID0gZmFsc2U7Ci0gICAgICBmb3IgKHBsID0gJmhvbGRfdXNlLT5jaGlsZHJlbi5oZWFkOyAqcGwgIT0gTlVMTDsgcGwgPSAmKCpwbCktPm5leHQpCi0JewotCSAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmxzOwotCSAgY29uc3QgY2hhciAqbG5hbWU7Ci0KLQkgIGlmICgoKnBsKS0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBscyA9ICYoKnBsKS0+aW5wdXRfc2VjdGlvbjsKLQotCSAgbG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobHMtPmlmaWxlLT50aGVfYmZkLCBscy0+c2VjdGlvbik7Ci0JICBpZiAoc3RyY2hyIChsbmFtZSwgJyQnKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGZvdW5kX2RvbGxhcikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZvdW5kX2RvbGxhciA9IHRydWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjbmFtZSwgbG5hbWUpIDwgMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbGlzdCk7Ci0gICAgICB3aWxkX2RvaXQgKCZsaXN0LCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICBpZiAobGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgQVNTRVJUIChsaXN0LmhlYWQtPm5leHQgPT0gTlVMTCk7Ci0JICBsaXN0LmhlYWQtPm5leHQgPSAqcGw7Ci0JICAqcGwgPSBsaXN0LmhlYWQ7Ci0JfQotICAgIH0KLQotICBmcmVlIChob2xkX3NlY3Rpb25fbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb25fbmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJkYXRhIikgPT0gMCkKLSAgICBob2xkX3JkYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotfQotDAotc3RhdGljIGNoYXIgKgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlLAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9maW5pc2gsIC8qIGZpbmlzaCAqLwotICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLCAvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuLAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9yZWNvZ25pemVkX2ZpbGUKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9zdW5vcy5lbSBiL2xkL2VtdWx0ZW1wbC9zdW5vcy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwOTVmZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvc3Vub3MuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDM4ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogU3VuT1MgZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotI2lmZGVmIEhBVkVfRElSRU5UX0gKLSMgaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jZWxzZQotIyBkZWZpbmUgZGlyZW50IGRpcmVjdAotIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzCi0gIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2RpcgotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jb3VudF9uZWVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X25lZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotICBjb25maWcuZHluYW1pY19saW5rID0gdHJ1ZTsKLSAgY29uZmlnLmhhc19zaGFyZWQgPSB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkLAotICAgYnV0IGJlZm9yZSB0aGUgbGlua2VyIHNjcmlwdCBoYXMgYmVlbiByZWFkLiAgSWYgdGhpcyBpcyBhIG5hdGl2ZQotICAgbGlua2VyLCB3ZSBhZGQgdGhlIGRpcmVjdG9yaWVzIGluIExEX0xJQlJBUllfUEFUSCB0byB0aGUgc2VhcmNoCi0gICBsaXN0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzICgpCi17Ci1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0gIGNvbnN0IGNoYXIgKmVudjsKLQotICBlbnYgPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9MSUJSQVJZX1BBVEgiKTsKLSAgaWYgKGVudiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKmw7Ci0KLSAgICAgIGwgPSB4c3RyZHVwIChlbnYpOwotICAgICAgd2hpbGUgKDEpCi0JewotCSAgY2hhciAqYzsKLQotCSAgYyA9IHN0cmNociAobCwgJzonKTsKLQkgIGlmIChjICE9IE5VTEwpCi0JICAgICpjKysgPSAnXDAnOwotCSAgaWYgKCpsICE9ICdcMCcpCi0JICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChsLCBmYWxzZSk7Ci0JICBpZiAoYyA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIGwgPSBjOwotCX0KLSAgICB9Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi19Ci0KLS8qIERlc3BpdGUgdGhlIG5hbWUsIHdlIHVzZSB0aGlzIHJvdXRpbmUgdG8gc2VhcmNoIGZvciBkeW5hbWljCi0gICBsaWJyYXJpZXMuICBPbiBTdW5PUyB0aGlzIHJlcXVpcmVzIGEgZGlyZWN0b3J5IHNlYXJjaC4gIFdlIG5lZWQgdG8KLSAgIGZpbmQgdGhlIC5zbyBmaWxlIHdpdGggdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIuICBUaGUgdXNlciBtYXkKLSAgIHJlc3RyaWN0IHRoZSBtYWpvciB2ZXJzaW9uIGJ5IHNheWluZywgZS5nLiwgLWxjLjEuICBBbHNvLCBpZiB3ZQotICAgZmluZCBhIC5zbyBmaWxlLCB3ZSBuZWVkIHRvIGxvb2sgZm9yIGEgdGhlIHNhbWUgZmlsZSBhZnRlcgotICAgcmVwbGFjaW5nIC5zbyB3aXRoIC5zYTsgaWYgaXQgZXhpc3RzLCBpdCB3aWxsIGJlIGFuIGFyY2hpdmUgd2hpY2gKLSAgIHByb3ZpZGUgc29tZSBpbml0aWFsaXphdGlvbnMgZm9yIGRhdGEgc3ltYm9scywgYW5kIHdlIG5lZWQgdG8KLSAgIHNlYXJjaCBpdCBhZnRlciBpbmNsdWRpbmcgdGhlIC5zbyBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpCi17Ci0gIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk7Ci19Ci0KLS8qIFNlYXJjaCB0aGUgZGlyZWN0b3J5IGZvciBhIC5zbyBmaWxlIGZvciBlYWNoIGxpYnJhcnkgc2VhcmNoLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28gKGlucCkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wOwotewotICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gIGNoYXIgKmZvdW5kID0gTlVMTDsKLSAgY2hhciAqYWxjOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICBpZiAoISBpbnAtPnNlYXJjaF9kaXJzX2ZsYWcKLSAgICAgIHx8ICEgaW5wLT5pc19hcmNoaXZlCi0gICAgICB8fCAhIGlucC0+ZHluYW1pYykKLSAgICByZXR1cm47Ci0KLSAgQVNTRVJUIChzdHJuY21wIChpbnAtPmxvY2FsX3N5bV9uYW1lLCAiLWwiLCAyKSA9PSAwKTsKLQotICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotICAgIHsKLSAgICAgIGJvb2xlYW4gZm91bmRfc3RhdGljOwotCi0gICAgICBmb3VuZCA9IGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIgKHNlYXJjaC0+bmFtZSwgaW5wLT5maWxlbmFtZSwKLQkJCQkJICAgICAgICZmb3VuZF9zdGF0aWMpOwotICAgICAgaWYgKGZvdW5kICE9IE5VTEwgfHwgZm91bmRfc3RhdGljKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoZm91bmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBkaWQgbm90IGZpbmQgYSBtYXRjaGluZyAuc28gZmlsZS4gIFRoaXMgaXNuJ3QgYW4gZXJyb3IsCi0JIHNpbmNlIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEgbWF0Y2hpbmcgLmEgZmlsZSwgd2hpY2ggd2lsbCBiZQotCSBmb3VuZCBieSB0aGUgdXN1YWwgc2VhcmNoLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogUmVwbGFjZSB0aGUgZmlsZW5hbWUgd2l0aCB0aGUgb25lIHdlIGhhdmUgZm91bmQuICAqLwotICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBzdHJsZW4gKGZvdW5kKSArIDIpOwotICBzcHJpbnRmIChhbGMsICIlcy8lcyIsIHNlYXJjaC0+bmFtZSwgZm91bmQpOwotICBpbnAtPmZpbGVuYW1lID0gYWxjOwotCi0gIC8qIFR1cm4gb2ZmIHRoZSBzZWFyY2hfZGlyc19mbGFnIHRvIHByZXZlbnQgbGRmaWxlX29wZW5fZmlsZSBmcm9tCi0gICAgIHNlYXJjaGluZyBmb3IgdGhpcyBmaWxlIGFnYWluLiAgKi8KLSAgaW5wLT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0KLSAgZnJlZSAoZm91bmQpOwotCi0gIC8qIE5vdyBsb29rIGZvciB0aGUgc2FtZSBmaWxlIG5hbWUsIGJ1dCB3aXRoIC5zYSBpbnN0ZWFkIG9mIC5zby4gIElmCi0gICAgIGZvdW5kLCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgaW5wdXQgZmlsZXMuICAqLwotICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGlucC0+ZmlsZW5hbWUpICsgMSk7Ci0gIHN0cmNweSAoYWxjLCBpbnAtPmZpbGVuYW1lKTsKLSAgc3Ryc3RyIChhbGMgKyBzdHJsZW4gKHNlYXJjaC0+bmFtZSksICIuc28iKVsyXSA9ICdhJzsKLSAgaWYgKHN0YXQgKGFsYywgJnN0KSAhPSAwKQotICAgIGZyZWUgKGFsYyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzYTsKLQotICAgICAgLyogQWRkIHRoZSAuc2EgZmlsZSB0byB0aGUgc3RhdGVtZW50IGxpc3QganVzdCBiZWZvcmUgdGhlIC5zbwotCSBmaWxlLiAgVGhpcyBpcyByZWFsbHkgYSBoYWNrLiAgKi8KLSAgICAgIHNhID0gKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopCi0JICAgIHhtYWxsb2MgKHNpemVvZiAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSkpKTsKLSAgICAgICpzYSA9ICppbnA7Ci0KLSAgICAgIGlucC0+ZmlsZW5hbWUgPSBhbGM7Ci0gICAgICBpbnAtPmxvY2FsX3N5bV9uYW1lID0gYWxjOwotCi0gICAgICBpbnAtPmhlYWRlci5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgc2E7Ci0gICAgICBpbnAtPm5leHRfcmVhbF9maWxlID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgc2E7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggYSBkaXJlY3RvcnkgZm9yIGEgLnNvIGZpbGUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyIChkaXJuYW1lLCBmaWxlbmFtZSwgZm91bmRfc3RhdGljKQotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgYm9vbGVhbiAqZm91bmRfc3RhdGljOwotewotICBpbnQgZm9yY2VfbWFqLCBmb3JjZV9taW47Ci0gIGNvbnN0IGNoYXIgKmRvdDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqYWxjOwotICBjaGFyICpmb3VuZDsKLSAgaW50IG1heF9tYWosIG1heF9taW47Ci0gIERJUiAqZGlyOwotICBzdHJ1Y3QgZGlyZW50ICplbnRyeTsKLSAgdW5zaWduZWQgaW50IGRpcm5hbWVsZW47Ci0gIGNoYXIgKmZ1bGxfcGF0aDsKLSAgaW50IHN0YXR2YWw7Ci0gIHN0cnVjdCBzdGF0IHN0OwotCi0gICpmb3VuZF9zdGF0aWMgPSBmYWxzZTsKLQotICBmb3JjZV9tYWogPSAtMTsKLSAgZm9yY2VfbWluID0gLTE7Ci0gIGRvdCA9IHN0cmNociAoZmlsZW5hbWUsICcuJyk7Ci0gIGlmIChkb3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZW4gPSBzdHJsZW4gKGZpbGVuYW1lKTsKLSAgICAgIGFsYyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yY2VfbWFqID0gYXRvaSAoZG90ICsgMSk7Ci0KLSAgICAgIGxlbiA9IGRvdCAtIGZpbGVuYW1lOwotICAgICAgYWxjID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0gICAgICBzdHJuY3B5IChhbGMsIGZpbGVuYW1lLCBsZW4pOwotICAgICAgYWxjW2xlbl0gPSAnXDAnOwotICAgICAgZmlsZW5hbWUgPSBhbGM7Ci0KLSAgICAgIGRvdCA9IHN0cmNociAoZG90ICsgMSwgJy4nKTsKLSAgICAgIGlmIChkb3QgIT0gTlVMTCkKLQlmb3JjZV9taW4gPSBhdG9pIChkb3QgKyAxKTsKLSAgICB9Ci0KLSAgZm91bmQgPSBOVUxMOwotICBtYXhfbWFqID0gbWF4X21pbiA9IDA7Ci0KLSAgZGlyID0gb3BlbmRpciAoZGlybmFtZSk7Ci0gIGlmIChkaXIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgZGlybmFtZWxlbiA9IHN0cmxlbiAoZGlybmFtZSk7Ci0gIAotICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpciAoZGlyKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzOwotICAgICAgaW50IGZvdW5kX21haiwgZm91bmRfbWluOwotCi0gICAgICBpZiAoc3RybmNtcCAoZW50cnktPmRfbmFtZSwgImxpYiIsIDMpICE9IDAKLQkgIHx8IHN0cm5jbXAgKGVudHJ5LT5kX25hbWUgKyAzLCBmaWxlbmFtZSwgbGVuKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZG90ID09IE5VTEwKLQkgICYmIHN0cmNtcCAoZW50cnktPmRfbmFtZSArIDMgKyBsZW4sICIuYSIpID09IDApCi0JewotCSAgKmZvdW5kX3N0YXRpYyA9IHRydWU7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGFjY2VwdCBsaWJmb28uc28gd2l0aG91dCBhIHZlcnNpb24gbnVtYmVyLCBldmVuIHRob3VnaCB0aGUKLSAgICAgICAgIG5hdGl2ZSBsaW5rZXIgZG9lcyBub3QuICBUaGlzIGlzIG1vcmUgY29udmVuaWVudCBmb3IgcGFja2FnZXMKLSAgICAgICAgIHdoaWNoIGp1c3QgZ2VuZXJhdGUgLnNvIGZpbGVzIGZvciBzaGFyZWQgbGlicmFyaWVzLCBhcyBvbiBFTEYKLSAgICAgICAgIHN5c3RlbXMuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGVudHJ5LT5kX25hbWUgKyAzICsgbGVuLCAiLnNvIiwgMykgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIGlmIChlbnRyeS0+ZF9uYW1lWzYgKyBsZW5dID09ICdcMCcpCi0JOwotICAgICAgZWxzZSBpZiAoZW50cnktPmRfbmFtZVs2ICsgbGVuXSA9PSAnLicKLQkgICAgICAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGVudHJ5LT5kX25hbWVbNyArIGxlbl0pKQotCTsKLSAgICAgIGVsc2UKLQljb250aW51ZTsKLQotICAgICAgZm9yIChzID0gZW50cnktPmRfbmFtZSArIDYgKyBsZW47ICpzICE9ICdcMCc7IHMrKykKLQlpZiAoKnMgIT0gJy4nICYmICEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgIGJyZWFrOwotICAgICAgaWYgKCpzICE9ICdcMCcpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlJ3ZlIGZvdW5kIGEgLnNvIGZpbGUuICBXb3JrIG91dCB0aGUgbWFqb3IgYW5kIG1pbm9yCi0JIHZlcnNpb24gbnVtYmVycy4gICovCi0gICAgICBmb3VuZF9tYWogPSAwOwotICAgICAgZm91bmRfbWluID0gMDsKLSAgICAgIHNzY2FuZiAoZW50cnktPmRfbmFtZSArIDMgKyBsZW4sICIuc28uJWQuJWQiLAotCSAgICAgICZmb3VuZF9tYWosICZmb3VuZF9taW4pOwotCi0gICAgICBpZiAoKGZvcmNlX21haiAhPSAtMSAmJiBmb3JjZV9tYWogIT0gZm91bmRfbWFqKQotCSAgfHwgKGZvcmNlX21pbiAhPSAtMSAmJiBmb3JjZV9taW4gIT0gZm91bmRfbWluKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaWxlIHJlYWxseSBleGlzdHMgKGlnbm9yZSBicm9rZW4gc3ltbGlua3MpLiAgKi8KLSAgICAgIGZ1bGxfcGF0aCA9IHhtYWxsb2MgKGRpcm5hbWVsZW4gKyAxICsgc3RybGVuIChlbnRyeS0+ZF9uYW1lKSArIDEpOwotICAgICAgc3ByaW50ZiAoZnVsbF9wYXRoLCAiJXMvJXMiLCBkaXJuYW1lLCBlbnRyeS0+ZF9uYW1lKTsKLSAgICAgIHN0YXR2YWwgPSBzdGF0IChmdWxsX3BhdGgsICZzdCk7Ci0gICAgICBmcmVlIChmdWxsX3BhdGgpOwotICAgICAgaWYgKHN0YXR2YWwgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UndmUgZm91bmQgYSBtYXRjaCBmb3IgdGhlIG5hbWUgd2UgYXJlIHNlYXJjaGluZyBmb3IuICBTZWUKLQkgaWYgdGhpcyBpcyB0aGUgdmVyc2lvbiB3ZSBzaG91bGQgdXNlLiAgSWYgdGhlIG1ham9yIGFuZCBtaW5vcgotCSB2ZXJzaW9ucyBtYXRjaCwgd2UgdXNlIHRoZSBsYXN0IGVudHJ5IGluIGFscGhhYmV0aWNhbCBvcmRlcjsKLQkgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgaG93IFN1bk9TIGRpc3Rpbmd1aXNoZXMgbGliYy5zby4xLjgKLQkgZnJvbSBsaWJjLnNvLjEuOC4xLCBidXQgaXQgb3VnaHQgdG8gc3VmZmljZS4gICovCi0gICAgICBpZiAoZm91bmQgPT0gTlVMTAotCSAgfHwgKGZvdW5kX21haiA+IG1heF9tYWopCi0JICB8fCAoZm91bmRfbWFqID09IG1heF9tYWoKLQkgICAgICAmJiAoZm91bmRfbWluID4gbWF4X21pbgotCQkgIHx8IChmb3VuZF9taW4gPT0gbWF4X21pbgotCQkgICAgICAmJiBzdHJjbXAgKGVudHJ5LT5kX25hbWUsIGZvdW5kKSA+IDApKSkpCi0JewotCSAgaWYgKGZvdW5kICE9IE5VTEwpCi0JICAgIGZyZWUgKGZvdW5kKTsKLQkgIGZvdW5kID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChlbnRyeS0+ZF9uYW1lKSArIDEpOwotCSAgc3RyY3B5IChmb3VuZCwgZW50cnktPmRfbmFtZSk7Ci0JICBtYXhfbWFqID0gZm91bmRfbWFqOwotCSAgbWF4X21pbiA9IGZvdW5kX21pbjsKLQl9Ci0gICAgfQotCi0gIGNsb3NlZGlyIChkaXIpOwotCi0gIGlmIChhbGMgIT0gTlVMTCkKLSAgICBmcmVlIChhbGMpOwotCi0gIHJldHVybiBmb3VuZDsKLX0KLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF9uZWVkZWQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfZm91bmQ7Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqbDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gbGRfbmVlZCBlbnRyaWVzIGluIGR5bmFtaWMKLSAgICAgb2JqZWN0cyBpbmNsdWRlZCBpbiB0aGUgbGluay4gIEZvciBlYWNoIHN1Y2ggZmlsZSwgd2Ugd2FudCB0bwotICAgICB0cmFjayBkb3duIHRoZSBjb3JyZXNwb25kaW5nIGxpYnJhcnksIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wKLSAgICAgdGFibGUgaW4gdGhlIGxpbmsuICBUaGlzIGlzIHdoYXQgdGhlIHJ1bnRpbWUgZHluYW1pYyBsaW5rZXIgd2lsbAotICAgICBkby4gIFRyYWNraW5nIHRoZSBmaWxlcyBkb3duIGhlcmUgcGVybWl0cyBvbmUgZHluYW1pYyBvYmplY3QgdG8KLSAgICAgaW5jbHVkZSBhbm90aGVyIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWwgYWN0aW9uIGJ5IHRoZSBwZXJzb24KLSAgICAgZG9pbmcgdGhlIGxpbmsuICBOb3RlIHRoYXQgdGhlIG5lZWRlZCBsaXN0IGNhbiBhY3R1YWxseSBncm93Ci0gICAgIHdoaWxlIHdlIGFyZSBzdGVwcGluZyB0aHJvdWdoIHRoaXMgbG9vcC4gICovCi0gIG5lZWRlZCA9IGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsbDsKLSAgICAgIGNvbnN0IGNoYXIgKmxuYW1lOwotICAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gICAgICBsbmFtZSA9IGwtPm5hbWU7Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGZpbGUsIHNraXAgaXQuICAqLwotICAgICAgZm9yIChsbCA9IG5lZWRlZDsgbGwgIT0gbDsgbGwgPSBsbC0+bmV4dCkKLQlpZiAoc3RyY21wIChsbC0+bmFtZSwgbG5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoc3RybmNtcCAobG5hbWUsICItbCIsIDIpICE9IDApCi0JewotCSAgYmZkICphYmZkOwotCi0JICBhYmZkID0gYmZkX29wZW5yIChsbmFtZSwgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLQkgIGlmIChhYmZkICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLQkJewotCQkgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCQkgIGFiZmQgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQkgIGlmIChhYmZkICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQotCQl7Ci0JCSAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCSAgYWJmZCA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGFiZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFdlJ3ZlIGZvdW5kIHRoZSBuZWVkZWQgZHluYW1pYyBvYmplY3QuICAqLwotCSAgICAgIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKLQkJZWluZm8gKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiwgYWJmZCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZFxuIiwKLQkJICAgICBsbmFtZSwgbC0+YnkpOwotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbG5hbWUgKz0gMjsKLQotICAgICAgLyogV2Ugd2FudCB0byBzZWFyY2ggZm9yIHRoZSBmaWxlIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoZQotCSBkeW5hbWljIGxpbmtlciB3aWxsIHNlYXJjaC4gIFRoYXQgbWVhbnMgdGhhdCB3ZSB3YW50IHRvIHVzZQotCSBycGF0aF9saW5rLCBycGF0aCBvciAtTCwgdGhlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLQkgTERfTElCUkFSWV9QQVRIIChuYXRpdmUgb25seSksIHRoZW4gKGlmIHJwYXRoIHdhcyB1c2VkKSB0aGUKLQkgbGlua2VyIHNjcmlwdCBMSUJfU0VBUkNIX0RJUlMuICAqLwotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rLAotCQkJCQkgICAgICBsbmFtZSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoY29tbWFuZF9saW5lLnJwYXRoICE9IE5VTEwpCi0JewotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aCwgbG5hbWUpKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKHNlYXJjaC0+bmFtZSwgbG5hbWUpKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0gICAgICB7Ci0JY29uc3QgY2hhciAqbGliX3BhdGg7Ci0KLQlsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpOwotCWlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbG5hbWUpKQotCSAgY29udGludWU7Ci0gICAgICB9Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0gICAgICBpZiAoY29tbWFuZF9saW5lLnJwYXRoICE9IE5VTEwpCi0JewotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChzZWFyY2gtPm5hbWUsIGxuYW1lKSkKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChzZWFyY2ggIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBub3QgZm91bmRcbiIsCi0JICAgICBsLT5uYW1lLCBsLT5ieSk7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggZm9yIGEgbmVlZGVkIGZpbGUgaW4gYSBwYXRoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKHBhdGgsIG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgaWYgKHBhdGggPT0gTlVMTCB8fCAqcGF0aCA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZGlyOwotICAgICAgY2hhciAqZGlyY29weTsKLQotICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JewotCSAgZGlyY29weSA9IE5VTEw7Ci0JICBkaXIgPSBwYXRoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkaXJjb3B5ID0gKGNoYXIgKikgeG1hbGxvYyAocyAtIHBhdGggKyAxKTsKLQkgIG1lbWNweSAoZGlyY29weSwgcGF0aCwgcyAtIHBhdGgpOwotCSAgZGlyY29weVtzIC0gcGF0aF0gPSAnXDAnOwotCSAgZGlyID0gZGlyY29weTsKLQl9Ci0KLSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChkaXIsIG5hbWUpKQotCXJldHVybiB0cnVlOwotCi0gICAgICBpZiAoZGlyY29weSAhPSBOVUxMKQotCWZyZWUgKGRpcmNvcHkpOwotCi0gICAgICBpZiAocyA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgcGF0aCA9IHMgKyAxOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CSAgCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHBvc3NpYmxlIGRpcmVjdG9yeSBmb3IgYSBuZWVkZWQKLSAgIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGRpciwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZGlyOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjaGFyICpmaWxlOwotICBjaGFyICphbGM7Ci0gIGJvb2xlYW4gaWdub3JlOwotICBiZmQgKmFiZmQ7Ci0KLSAgZmlsZSA9IGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIgKGRpciwgbmFtZSwgJmlnbm9yZSk7Ci0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZGlyKSArIHN0cmxlbiAoZmlsZSkgKyAyKTsKLSAgc3ByaW50ZiAoYWxjLCAiJXMvJXMiLCBkaXIsIGZpbGUpOwotICBmcmVlIChmaWxlKTsKLSAgYWJmZCA9IGJmZF9vcGVuciAoYWxjLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXZSd2ZSBmb3VuZCB0aGUgbmVlZGVkIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotICAvKiBBZGQgdGhpcyBmaWxlIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIG5lZWRlZCBvYmplY3QgaW4gdGhlIGxpbmsuICBUaGlzCi0gICBkb2VzIG5vdCBoYXZlIHRvIGJlIHByZWNpc2UsIGFzIGl0IGRvZXMgbm8gaGFybSB0byBpbmNsdWRlIGEKLSAgIGR5bmFtaWMgb2JqZWN0IG1vcmUgdGhhbiBvbmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgaWYgKHMtPmZpbGVuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBpZiAoc3RybmNtcCAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi1sIiwgMikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChzLT5maWxlbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQlnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lLCAqbG5hbWU7Ci0gICAgICBjb25zdCBjaGFyICpzZG90LCAqbGRvdDsKLSAgICAgIGludCBsbWFqLCBsbWluLCBzbWFqLCBzbWluOwotCi0gICAgICBsbmFtZSA9IGdsb2JhbF9uZWVkZWQtPm5hbWUgKyAyOwotCi0gICAgICBzbmFtZSA9IHN0cnJjaHIgKHMtPmZpbGVuYW1lLCAnLycpOwotICAgICAgaWYgKHNuYW1lID09IE5VTEwpCi0Jc25hbWUgPSBzLT5maWxlbmFtZTsKLSAgICAgIGVsc2UKLQkrK3NuYW1lOwotCi0gICAgICBpZiAoc3RybmNtcCAoc25hbWUsICJsaWIiLCAzKSAhPSAwKQotCXJldHVybjsKLSAgICAgIHNuYW1lICs9IDM7Ci0KLSAgICAgIGxkb3QgPSBzdHJjaHIgKGxuYW1lLCAnLicpOwotICAgICAgaWYgKGxkb3QgPT0gTlVMTCkKLQlsZG90ID0gbG5hbWUgKyBzdHJsZW4gKGxuYW1lKTsKLQotICAgICAgc2RvdCA9IHN0cnN0ciAoc25hbWUsICIuc28uIik7Ci0gICAgICBpZiAoc2RvdCA9PSBOVUxMKQotCXJldHVybjsKLQotICAgICAgaWYgKHNkb3QgLSBzbmFtZSAhPSBsZG90IC0gbG5hbWUKLQkgIHx8IHN0cm5jbXAgKGxuYW1lLCBzbmFtZSwgc2RvdCAtIHNuYW1lKSAhPSAwKQotCXJldHVybjsKLQotICAgICAgbG1haiA9IGxtaW4gPSAtMTsKLSAgICAgIHNzY2FuZiAobGRvdCwgIi4lZC4lZCIsICZsbWFqLCAmbG1pbik7Ci0gICAgICBzbWFqID0gc21pbiA9IC0xOwotICAgICAgc3NjYW5mIChzZG90LCAiLnNvLiVkLiVkIiwgJnNtYWosICZzbWluKTsKLSAgICAgIGlmICgoc21haiAhPSBsbWFqICYmIHNtYWogIT0gLTEgJiYgbG1haiAhPSAtMSkKLQkgIHx8IChzbWluICE9IGxtaW4gJiYgc21pbiAhPSAtMSAmJiBsbWluICE9IC0xKSkKLQlyZXR1cm47Ci0KLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgfQotfQotCi0vKiBXZSBuZWVkIHRvIHVzZSBzdGF0aWMgdmFyaWFibGVzIHRvIHBhc3MgaW5mb3JtYXRpb24gYXJvdW5kIHRoZSBjYWxsCi0gICB0byBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEljay4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmaW5kX2Fzc2lnbjsKLXN0YXRpYyBib29sZWFuIGZvdW5kX2Fzc2lnbjsKLQotLyogV2UgbmVlZCB0byB1c2Ugc3RhdGljIHZhcmlhYmxlcyB0byBwYXNzIGluZm9ybWF0aW9uIGFyb3VuZCB0aGUgY2FsbAotICAgdG8gbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlLiAgSWNrLiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUgbmVlZF9zaXplOwotc3RhdGljIGJmZF9zaXplX3R5cGUgbmVlZF9lbnRyaWVzOwotc3RhdGljIGJmZF9ieXRlICpuZWVkX2NvbnRlbnRzOwotc3RhdGljIGJmZF9ieXRlICpuZWVkX3BpbmZvOwotc3RhdGljIGJmZF9ieXRlICpuZWVkX3BuYW1lczsKLQotLyogVGhlIHNpemUgb2Ygb25lIGVudHJ5IGluIHRoZSAubmVlZCBzZWN0aW9uLCBub3QgaW5jbHVkaW5nIHRoZSBmaWxlCi0gICBuYW1lLiAgKi8KLQotI2RlZmluZSBORUVEX0VOVFJZX1NJWkUgKDE2KQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoZHluID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNuZWVkOwotICBhc2VjdGlvbiAqc3J1bGVzOwotICBhc2VjdGlvbiAqc2R5bjsKLQotICAvKiBUaGUgU3VuT1MgbmF0aXZlIGxpbmtlciBjcmVhdGVzIGEgc2hhcmVkIGxpYnJhcnkgd2hlbmV2ZXIgdGhlcmUKLSAgICAgYXJlIGFueSB1bmRlZmluZWQgc3ltYm9scyBpbiBhIGxpbmssIHVubGVzcyAtZSBpcyB1c2VkLiAgVGhpcyBpcwotICAgICBwcmV0dHkgd2VpcmQsIGJ1dCB3ZSBhcmUgY29tcGF0aWJsZS4gICovCi0gIGlmICghIGxpbmtfaW5mby5zaGFyZWQgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmICEgZW50cnlfZnJvbV9jbWRsaW5lKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgCi0gICAgICBmb3IgKGggPSBsaW5rX2luZm8uaGFzaC0+dW5kZWZzOyBoICE9IE5VTEw7IGggPSBoLT5uZXh0KQotCXsKLQkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dS51bmRlZi5hYmZkICE9IE5VTEwKLQkgICAgICAmJiAoaC0+dS51bmRlZi5hYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Quc3RyaW5nLCAiX19EWU5BTUlDIikgIT0gMAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5zdHJpbmcsICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgIT0gMCkKLQkgICAgewotCSAgICAgIGZpbmRfYXNzaWduID0gaC0+cm9vdC5zdHJpbmc7Ci0JICAgICAgZm91bmRfYXNzaWduID0gZmFsc2U7Ci0JICAgICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudCk7Ci0JICAgICAgaWYgKCEgZm91bmRfYXNzaWduKQotCQl7Ci0JCSAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgewotICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgICAgIC8qIFNldCB0aGUgLnRleHQgc2VjdGlvbiB0byBzdGFydCBhdCAweDIwLCBub3QgMHgyMDIwLiAgRklYTUU6Ci0gICAgICAgICBUaGlzIGlzIHRvbyBtYWdpY2FsLiAgKi8KLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLnRleHQiKTsKLSAgICAgIGlmIChvcy0+YWRkcl90cmVlID09IE5VTEwpCi0Jb3MtPmFkZHJfdHJlZSA9IGV4cF9pbnRvcCAoMHgyMCk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgX19EWU5BTUlDIHN5bWJvbC4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlCi0gICAgIGxpbmtlciBzY3JpcHQgYmVjYXVzZSB3ZSB3YW50IHRvIHNldCB0aGUgdmFsdWUgdG8gdGhlIHN0YXJ0IG9mCi0gICAgIHRoZSBkeW5hbWljIHNlY3Rpb24gaWYgdGhlcmUgaXMgb25lLCBvciB0byB6ZXJvIGlmIHRoZXJlIGlzbid0Ci0gICAgIG9uZS4gIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBzeW1ib2wgYmVmb3JlIGNhbGxpbmcKLSAgICAgc2l6ZV9keW5hbWljX3NlY3Rpb25zLCBhbHRob3VnaCB3ZSBjYW4ndCBzZXQgdGhlIHZhbHVlIHVudGlsCi0gICAgIGFmdGVyd2FyZC4gICovCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaGR5biA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgIl9fRFlOQU1JQyIsIHRydWUsIGZhbHNlLAotCQkJCSAgIGZhbHNlKTsKLSAgICAgIGlmIChoZHluID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cDogJUVcbiIpOwotICAgICAgaWYgKCEgYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCi0JCQkJCSAgICAgICJfX0RZTkFNSUMiKSkKLQllaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byBfX0RZTkFNSUM6ICVFXG4iKTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIG1ha2UgYW55IHZhcmlhYmxlIGFzc2lnbm1lbnRzLCB3ZSBuZWVkIHRvIGxldAotICAgICB0aGUgYmFja2VuZCBsaW5rZXIga25vdyBhYm91dCB0aGVtIGluIGNhc2UgdGhlIHZhcmlhYmxlcyBhcmUKLSAgICAgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudCk7Ci0KLSAgLyogTGV0IHRoZSBiYWNrZW5kIGxpbmtlciB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zCi0gICAgIHJlcXVpcmVkIGJ5IGR5bmFtaWMgbGlua2luZy4gICovCi0gIGlmICghIGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sICZzZHluLAotCQkJCQkgJnNuZWVkLCAmc3J1bGVzKSkKLSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Ci0KLSAgaWYgKHNuZWVkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IHVwIHRoZSAubmVlZCBzZWN0aW9uLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGRfbmVlZAotCSBmaWVsZCBpbiBpbmNsdWRlL2FvdXQvc3VuNC5oLiAgKi8KLQotICAgICAgbmVlZF9lbnRyaWVzID0gMDsKLSAgICAgIG5lZWRfc2l6ZSA9IDA7Ci0KLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY291bnRfbmVlZCk7Ci0KLSAgICAgIC8qIFdlIHNob3VsZCBvbmx5IGhhdmUgYSAubmVlZCBzZWN0aW9uIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lCi0JIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgICAgIEFTU0VSVCAobmVlZF9lbnRyaWVzICE9IDApOwotCi0gICAgICBzbmVlZC0+X3Jhd19zaXplID0gbmVlZF9zaXplOwotICAgICAgc25lZWQtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKG5lZWRfc2l6ZSk7Ci0KLSAgICAgIG5lZWRfY29udGVudHMgPSBzbmVlZC0+Y29udGVudHM7Ci0gICAgICBuZWVkX3BpbmZvID0gc25lZWQtPmNvbnRlbnRzOwotICAgICAgbmVlZF9wbmFtZXMgPSBzbmVlZC0+Y29udGVudHMgKyBuZWVkX2VudHJpZXMgKiAxNjsKLQotICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfbmVlZCk7Ci0KLSAgICAgIEFTU0VSVCAoKGJmZF9zaXplX3R5cGUpIChuZWVkX3BuYW1lcyAtIHNuZWVkLT5jb250ZW50cykgPT0gbmVlZF9zaXplKTsKLSAgICB9Ci0KLSAgaWYgKHNydWxlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCB1cCB0aGUgLnJ1bGVzIHNlY3Rpb24uICBUaGlzIGlzIGp1c3QgYSBQQVRIIGxpa2Ugc3RyaW5nCi0JIG9mIHRoZSAtTCBhcmd1bWVudHMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gIFdlIHBlcm1pdCB0aGUKLQkgdXNlciB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcmllcyB1c2luZyB0aGUgLXJwYXRoIGNvbW1hbmQgbGluZQotCSBvcHRpb24uICAqLwotICAgICAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aCkKLQl7Ci0JICBzcnVsZXMtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLnJwYXRoKTsKLQkgIHNydWxlcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgY29tbWFuZF9saW5lLnJwYXRoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQkgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotCSAgc2l6ZSA9IDA7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCSAgICAgIHNpemUgKz0gc3RybGVuIChzZWFyY2gtPm5hbWUpICsgMTsKLQkgIHNydWxlcy0+X3Jhd19zaXplID0gc2l6ZTsKLQkgIGlmIChzaXplID4gMCkKLQkgICAgewotCSAgICAgIGNoYXIgKnA7Ci0KLQkgICAgICBzcnVsZXMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHNpemUpOwotCSAgICAgIHAgPSAoY2hhciAqKSBzcnVsZXMtPmNvbnRlbnRzOwotCSAgICAgICpwID0gJ1wwJzsKLQkgICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCQl7Ci0JCSAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJICAgIHsKLQkJICAgICAgaWYgKHAgIT0gKGNoYXIgKikgc3J1bGVzLT5jb250ZW50cykKLQkJCSpwKysgPSAnOic7Ci0JCSAgICAgIHN0cmNweSAocCwgc2VhcmNoLT5uYW1lKTsKLQkJICAgICAgcCArPSBzdHJsZW4gKHApOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdlIG11c3QgYXNzaWduIGEgdmFsdWUgdG8gX19EWU5BTUlDLiAgSXQgc2hvdWxkIGJlIHplcm8gaWYgd2UgYXJlCi0gICAgIG5vdCBkb2luZyBhIGR5bmFtaWMgbGluaywgb3IgdGhlIHN0YXJ0IG9mIHRoZSAuZHluYW1pYyBzZWN0aW9uIGlmCi0gICAgIHdlIGFyZSBkb2luZyBvbmUuICAqLwotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGhkeW4tPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gICAgICBoZHluLT51LmRlZi52YWx1ZSA9IDA7Ci0gICAgICBpZiAoc2R5biAhPSBOVUxMKQotCWhkeW4tPnUuZGVmLnNlY3Rpb24gPSBzZHluOwotICAgICAgZWxzZQotCWhkeW4tPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGRvZXMgb25lIG9mIHR3byB0aGluZ3M6IGlmIHRoZQotICAgdmFyaWFibGUgZmluZF9hc3NpZ24gaXMgc2V0LCBpdCBzZXRzIGZvdW5kX2Fzc2lnbiBpZiBpdCBmaW5kcyBhbgotICAgYXNzaWdubWVudCB0byB0aGF0IHZhcmlhYmxlOyBvdGhlcndpc2UgaXQgdGVsbHMgdGhlIGJhY2tlbmQgbGlua2VyCi0gICBhYm91dCBhbGwgYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBpbiBjYXNlIHRoZXkgYXJlIGFzc2lnbm1lbnRzIHRvCi0gICBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtCi0gICAgICAmJiAoZmluZF9hc3NpZ24gPT0gTlVMTCB8fCAhIGZvdW5kX2Fzc2lnbikpCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChmaW5kX2Fzc2lnbiAhPSBOVUxMKQotCXsKLQkgIGlmIChzdHJjbXAgKGZpbmRfYXNzaWduLCBleHAtPmFzc2lnbi5kc3QpID09IDApCi0JICAgIGZvdW5kX2Fzc2lnbiA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgZXhwLT5hc3NpZ24uZHN0KSkKLQkgICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIC5uZWVkIHNlY3Rpb24sIGFuZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMuCi0gICBUaGUgYmFja2VuZCB3aWxsIHNldCB0aGUgbGRfbmVlZCBmaWVsZCBvZiB0aGUgZHluYW1pYyBsaW5raW5nCi0gICBpbmZvcm1hdGlvbiB0byBwb2ludCB0byB0aGUgLm5lZWQgc2VjdGlvbi4gIFNlZSBpbmNsdWRlL2FvdXQvc3VuNC5oCi0gICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jb3VudF9uZWVkIChpbnApCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlucDsKLXsKLSAgaWYgKGlucC0+dGhlX2JmZCAhPSBOVUxMCi0gICAgICAmJiAoaW5wLT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgKytuZWVkX2VudHJpZXM7Ci0gICAgICBuZWVkX3NpemUgKz0gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgaWYgKCEgaW5wLT5pc19hcmNoaXZlKQotCW5lZWRfc2l6ZSArPSBzdHJsZW4gKGlucC0+ZmlsZW5hbWUpICsgMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBBU1NFUlQgKGlucC0+bG9jYWxfc3ltX25hbWVbMF0gPT0gJy0nCi0JCSAgJiYgaW5wLT5sb2NhbF9zeW1fbmFtZVsxXSA9PSAnbCcpOwotCSAgbmVlZF9zaXplICs9IHN0cmxlbiAoaW5wLT5sb2NhbF9zeW1fbmFtZSArIDIpICsgMTsKLQl9Ci0gICAgfQotfQotCi0vKiBGaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgLm5lZWQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfbmVlZCAoaW5wKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppbnA7Ci17Ci0gIGlmIChpbnAtPnRoZV9iZmQgIT0gTlVMTAotICAgICAgJiYgKGlucC0+dGhlX2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgYzsKLQotICAgICAgLyogVG8gcmVhbGx5IGZpbGwgaW4gdGhlIC5uZWVkIHNlY3Rpb24gY29udGVudHMsIHdlIG5lZWQgdG8ga25vdwotCSB0aGUgZmluYWwgZmlsZSBwb3NpdGlvbiBvZiB0aGUgc2VjdGlvbiwgYnV0IHdlIGRvbid0LgotCSBJbnN0ZWFkLCB3ZSB1c2Ugb2Zmc2V0cywgYW5kIHJlbHkgb24gdGhlIEJGRCBiYWNrZW5kIHRvCi0JIGZpbmlzaCB0aGUgc2VjdGlvbiB1cCBjb3JyZWN0bHkuICBGSVhNRTogVGFsayBhYm91dCBsYWNrIG9mCi0JIHJlZmVyZW50aWFsIGxvY2FsaXR5LiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5lZWRfcG5hbWVzIC0gbmVlZF9jb250ZW50cywgbmVlZF9waW5mbyk7Ci0gICAgICBpZiAoISBpbnAtPmlzX2FyY2hpdmUpCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG5lZWRfcGluZm8gKyA0KTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBuZWVkX3BpbmZvICsgOCk7Ci0JICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDEwKTsKLQkgIHN0cmNweSAobmVlZF9wbmFtZXMsIGlucC0+ZmlsZW5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICp2ZXJzdHI7Ci0JICBpbnQgbWFqLCBtaW47Ci0KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAweDgwMDAwMDAwLCBuZWVkX3BpbmZvICsgNCk7Ci0JICBtYWogPSAwOwotCSAgbWluID0gMDsKLQkgIHZlcnN0ciA9IHN0cnN0ciAoaW5wLT5maWxlbmFtZSwgIi5zby4iKTsKLQkgIGlmICh2ZXJzdHIgIT0gTlVMTCkKLQkgICAgc3NjYW5mICh2ZXJzdHIsICIuc28uJWQuJWQiLCAmbWFqLCAmbWluKTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSBtYWosIG5lZWRfcGluZm8gKyA4KTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSBtaW4sIG5lZWRfcGluZm8gKyAxMCk7Ci0JICBzdHJjcHkgKG5lZWRfcG5hbWVzLCBpbnAtPmxvY2FsX3N5bV9uYW1lICsgMik7Ci0JfQotCi0gICAgICBjID0gKG5lZWRfcGluZm8gLSBuZWVkX2NvbnRlbnRzKSAvIE5FRURfRU5UUllfU0laRTsKLSAgICAgIGlmIChjICsgMSA+PSBuZWVkX2VudHJpZXMpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG5lZWRfcGluZm8gKyAxMik7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIChjICsgMSkgKiBORUVEX0VOVFJZX1NJWkUsCi0JCSAgICBuZWVkX3BpbmZvICsgMTIpOwotCi0gICAgICBuZWVkX3BpbmZvICs9IE5FRURfRU5UUllfU0laRTsKLSAgICAgIG5lZWRfcG5hbWVzICs9IHN0cmxlbiAobmVlZF9wbmFtZXMpICsgMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLCAvKiBmaW5pc2ggKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMsCi0gIE5VTEwsIC8qIG9wZW5fZHluYW1pY19saWJyYXJ5ICovCi0gIE5VTEwsIC8qIHBsYWNlX29ycGhhbiAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3ZhbmlsbGEuZW0gYi9sZC9lbXVsdGVtcGwvdmFuaWxsYS5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMzZmYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvdmFuaWxsYS5lbQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIEEgdmFuaWxsYSBlbXVsYXRpb24gd2l0aCBubyBkZWZhdWx0cwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotc3RhdGljIHZvaWQgdmFuaWxsYV9iZWZvcmVfcGFyc2UoKQotewotfQotCi1zdGF0aWMgdm9pZAotdmFuaWxsYV9zZXRfb3V0cHV0X2FyY2goKQotewotICAvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KLSAgdW5zaWduZWQgbG9uZyAgbWFjaGluZSA9IDA7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoKG91dHB1dF9iZmQsIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBtYWNoaW5lKTsKLX0KLQotc3RhdGljIGNoYXIgKgotdmFuaWxsYV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17Ci0gICppc2ZpbGUgPSAwOwotICByZXR1cm4gIiI7Ci19Ci0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfdmFuaWxsYV9lbXVsYXRpb24gPSAKLXsKLSAgdmFuaWxsYV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHZhbmlsbGFfc2V0X291dHB1dF9hcmNoLAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHZhbmlsbGFfZ2V0X3NjcmlwdCwKLSAgInZhbmlsbGEiLAotICAiYS5vdXQtc3Vub3MtYmlnIgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZ2VuLWRvYy50ZXhpIGIvbGQvZ2VuLWRvYy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTM2NzI3Li4wMDAwMDAwCi0tLSBhL2xkL2dlbi1kb2MudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIFZBUlM6Ci1AYyAxLiBJbmNsdXNpdmVuZXNzIG9mIHRoaXMgbWFudWFsCi1Ac2V0IEdFTkVSSUMKLQotQGMgMi4gU3BlY2lmaWMgdGFyZ2V0IG1hY2hpbmVzCi1Ac2V0IEg4MzAwCi1Ac2V0IEk5NjAKLQotQGMgMy4gUHJvcGVydGllcyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24KLUBjbGVhciBTaW5nbGVGb3JtYXQKLUBzZXQgVXNlc0VudlZhcnMKLUBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgQ09ORklHVVJBVElPTiBWQVJTCi0KZGlmZiAtLWdpdCBhL2xkL2dlbnNjcmlwdHMuc2ggYi9sZC9nZW5zY3JpcHRzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Mjk0YWY3Li4wMDAwMDAwCi0tLSBhL2xkL2dlbnNjcmlwdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotIyEvYmluL3NoCi0jIGdlbnNjcmlwdHMuc2ggLSBnZW5lcmF0ZSB0aGUgbGQtZW11bGF0aW9uLXRhcmdldCBzcGVjaWZpYyBmaWxlcwotIwotIyBVc2FnZTogZ2Vuc2NyaXB0cy5zaCBzcmNkaXIgbGliZGlyIGhvc3QgdGFyZ2V0IHRhcmdldF9hbGlhcyBcCi0jIGRlZmF1bHRfZW11bGF0aW9uIG5hdGl2ZV9saWJfZGlycyB0aGlzX2VtdWxhdGlvbiB0b29sX2RpcgotIwotIyBTYW1wbGUgdXNhZ2U6Ci0jIGdlbnNjcmlwdHMuc2ggL2RqbS9sZC1kZXZvL2Rldm8vbGQgL3Vzci9sb2NhbC9saWIgc3BhcmMtc3VuLXN1bm9zNC4xLjMgXAotIyBzcGFyYy1zdW4tc3Vub3M0LjEuMyBzcGFyYy1zdW4tc3Vub3M0LjEuMyBzdW40ICIiIHN1bjMgc3BhcmMtc3VuLXN1bm9zNC4xLjMKLSMgcHJvZHVjZXMgc3VuMy54IHN1bjMueGJuIHN1bjMueG4gc3VuMy54ciBzdW4zLnh1IGVtX3N1bjMuYwotCi1zcmNkaXI9JDEKLWxpYmRpcj0kMgotaG9zdD0kMwotdGFyZ2V0PSQ0Ci10YXJnZXRfYWxpYXM9JDUKLUVNVUxBVElPTl9MSUJQQVRIPSQ2Ci1OQVRJVkVfTElCX0RJUlM9JDcKLUVNVUxBVElPTl9OQU1FPSQ4Ci10b29sX2xpYj1gZWNobyAke2xpYmRpcn0gfCBzZWQgLWUgJ3N8L2xpYiR8fCdgLyR7OS0kdGFyZ2V0X2FsaWFzfS9saWIKLQotIyBJbmNsdWRlIHRoZSBlbXVsYXRpb24tc3BlY2lmaWMgcGFyYW1ldGVyczoKLS4gJHtzcmNkaXJ9L2VtdWxwYXJhbXMvJHtFTVVMQVRJT05fTkFNRX0uc2gKLQotaWYgdGVzdCAtZCBsZHNjcmlwdHM7IHRoZW4KLSAgdHJ1ZQotZWxzZQotICBta2RpciBsZHNjcmlwdHMKLWZpCi0KLSMgU2V0IHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoLCBmb3IgbGlicmFyaWVzIG5hbWVkIGJ5IC1sZm9vLgotIyBJZiBMSUJfUEFUSCBpcyBkZWZpbmVkIChlLmcuLCBieSBNYWtlZmlsZSkgYW5kIG5vbi1lbXB0eSwgaXQgaXMgdXNlZC4KLSMgT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBpcyBzZXQgaGVyZS4KLSMKLSMgVGhlIGZvcm1hdCBpcyB0aGUgdXN1YWwgbGlzdCBvZiBjb2xvbi1zZXBhcmF0ZWQgZGlyZWN0b3JpZXMuCi0jIFRvIGZvcmNlIGEgbG9naWNhbGx5IGVtcHR5IExJQl9QQVRILCBkbyBMSUJQQVRIPSI6Ii4KLQotaWYgWyAieCR7TElCX1BBVEh9IiA9ICJ4IiBdIDsgdGhlbgotICAjIENyb3NzLCBvciBuYXRpdmUgbm9uLWRlZmF1bHQgZW11bGF0aW9uIG5vdCByZXF1ZXN0aW5nIExJQl9QQVRILgotICBMSUJfUEFUSD0KLQotICBpZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgICBjYXNlICIgJEVNVUxBVElPTl9MSUJQQVRIICIgaW4KLSAgICAgICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotICAgICAgICAjIE5hdGl2ZSwgYW5kIGRlZmF1bHQgb3IgZW11bGF0aW9uIHJlcXVlc3RpbmcgTElCX1BBVEguCi0gICAgICAgIExJQl9QQVRIPS9saWI6L3Vzci9saWIKLSAgICAgICAgaWYgWyAtbiAiJHtOQVRJVkVfTElCX0RJUlN9IiBdOyB0aGVuCi0JICBMSUJfUEFUSD0ke0xJQl9QQVRIfToke05BVElWRV9MSUJfRElSU30KLSAgICAgICAgZmkKLSAgICAgICAgaWYgWyAiJHtsaWJkaXJ9IiAhPSAvdXNyL2xpYiBdOyB0aGVuCi0JICBMSUJfUEFUSD0ke0xJQl9QQVRIfToke2xpYmRpcn0KLSAgICAgICAgZmkKLSAgICAgICAgaWYgWyAiJHtsaWJkaXJ9IiAhPSAvdXNyL2xvY2FsL2xpYiBdIDsgdGhlbgotCSAgTElCX1BBVEg9JHtMSUJfUEFUSH06L3Vzci9sb2NhbC9saWIKLSAgICAgICAgZmkKLSAgICBlc2FjCi0gIGZpCi1maQotCi0jIEFsd2F5cyBzZWFyY2ggJCh0b29sZGlyKS9saWIsIGFrYSAvdXNyL2xvY2FsL1RBUkdFVC9saWIuCi1MSUJfUEFUSD0ke0xJQl9QQVRIfToke3Rvb2xfbGlifQotCi1MSUJfU0VBUkNIX0RJUlM9YGVjaG8gJHtMSUJfUEFUSH0gfCB0ciAnOicgJyAnIHwgc2VkIC1lICdzL1woW14gXVteIF0qXCkvU0VBUkNIX0RJUihcMSk7L2cnYAotCi0jIEdlbmVyYXRlIDUgb3IgNiBzY3JpcHQgZmlsZXMgZnJvbSBhIG1hc3RlciBzY3JpcHQgdGVtcGxhdGUgaW4KLSMgJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNoLiAgV2hpY2ggb25lIG9mIHRoZSA1IG9yIDYKLSMgc2NyaXB0IGZpbGVzIGlzIGFjdHVhbGx5IHVzZWQgZGVwZW5kcyBvbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBnaXZlbgotIyB0byBsZC4gIChTQ1JJUFRfTkFNRSB3YXMgc2V0IGluIHRoZSBlbXVscGFyYW1zX2ZpbGUuKQotIwotIyBBIC54IHNjcmlwdCBmaWxlIGlzIHRoZSBkZWZhdWx0IHNjcmlwdC4KLSMgQSAueHIgc2NyaXB0IGlzIGZvciBsaW5raW5nIHdpdGhvdXQgcmVsb2NhdGlvbiAoLXIgZmxhZykuCi0jIEEgLnh1IHNjcmlwdCBpcyBsaWtlIC54ciwgYnV0ICpkbyogY3JlYXRlIGNvbnN0cnVjdG9ycyAoLVVyIGZsYWcpLgotIyBBIC54biBzY3JpcHQgaXMgZm9yIGxpbmtpbmcgd2l0aCAtbiBmbGFnIChtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UpLgotIyBBIC54Ym4gc2NyaXB0IGlzIGZvciBsaW5raW5nIHdpdGggLU4gZmxhZyAobWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlKS4KLSMgQSAueHMgc2NyaXB0IGlzIGZvciBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCB0aGUgLS1zaGFyZWQKLSMgICBmbGFnOyBpdCBpcyBvbmx5IGdlbmVyYXRlZCBpZiAkR0VORVJBVEVfU0hMSUJfU0NSSVBUIGlzIHNldCBieSB0aGUKLSMgICBlbXVsYXRpb24gcGFyYW1ldGVycy4KLQotU0VHTUVOVF9TSVpFPSR7U0VHTUVOVF9TSVpFLSR7VEFSR0VUX1BBR0VfU0laRX19Ci0KLSMgRGV0ZXJtaW5lIERBVEFfQUxJR05NRU5UIGZvciB0aGUgNSB2YXJpYW50cywgdXNpbmcKLSMgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgZW11bHBhcmFtcy88ZW11bGF0aW9uPi5zaCBmaWxlIG9yIGRlZmF1bHQuCi0KLURBVEFfQUxJR05NRU5UXz0iJHtEQVRBX0FMSUdOTUVOVF8tJHtEQVRBX0FMSUdOTUVOVC1BTElHTigke1NFR01FTlRfU0laRX0pfX0iCi1EQVRBX0FMSUdOTUVOVF9uPSIke0RBVEFfQUxJR05NRU5UX24tJHtEQVRBX0FMSUdOTUVOVF99fSIKLURBVEFfQUxJR05NRU5UX049IiR7REFUQV9BTElHTk1FTlRfTi0ke0RBVEFfQUxJR05NRU5ULS59fSIKLURBVEFfQUxJR05NRU5UX3I9IiR7REFUQV9BTElHTk1FTlRfci0ke0RBVEFfQUxJR05NRU5ULX19IgotREFUQV9BTElHTk1FTlRfdT0iJHtEQVRBX0FMSUdOTUVOVF91LSR7REFUQV9BTElHTk1FTlRfcn19IgotCi1MRF9GTEFHPXIKLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfcn0KLURFRkFVTFRfREFUQV9BTElHTk1FTlQ9IkFMSUdOKCR7U0VHTUVOVF9TSVpFfSkiCi0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyCi0KLUxEX0ZMQUc9dQotREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF91fQotQ09OU1RSVUNUSU5HPSIgIgotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dQotCi1MRF9GTEFHPQotREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF99Ci1SRUxPQ0FUSU5HPSIgIgotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ci0KLUxEX0ZMQUc9bgotREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9ufQotVEVYVF9TVEFSVF9BRERSPSR7Tk9OUEFHRURfVEVYVF9TVEFSVF9BRERSLSR7VEVYVF9TVEFSVF9BRERSfX0KLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4KLQotTERfRkxBRz1OCi1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX059Ci0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibgotCi1pZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIjsgdGhlbgotICBMRF9GTEFHPXNoYXJlZAotICBEQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX3MtJHtEQVRBX0FMSUdOTUVOVF99fQotICBDUkVBVEVfU0hMSUI9IiAiCi0gICMgTm90ZSB0aGF0IFRFWFRfU1RBUlRfQUREUiBpcyBzZXQgdG8gTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSLgotICAoLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHMKLWZpCi0KLWZvciBpIGluICRFTVVMQVRJT05fTElCUEFUSCA7IGRvCi0gIHRlc3QgIiRpIiA9ICIkRU1VTEFUSU9OX05BTUUiICYmIENPTVBJTEVfSU49dHJ1ZQotZG9uZQotCi0jIEdlbmVyYXRlIGUke0VNVUxBVElPTl9OQU1FfS5jLgotLiAke3NyY2Rpcn0vZW11bHRlbXBsLyR7VEVNUExBVEVfTkFNRS1nZW5lcmljfS5lbQpkaWZmIC0tZ2l0IGEvbGQvaDgtZG9jLnRleGkgYi9sZC9oOC1kb2MudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNjJhMS4uMDAwMDAwMAotLS0gYS9sZC9oOC1kb2MudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLUBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIFZBUlM6Ci1AYyAxLiBJbmNsdXNpdmVuZXNzIG9mIHRoaXMgbWFudWFsCi1AY2xlYXIgR0VORVJJQwotCi1AYyAyLiBTcGVjaWZpYyB0YXJnZXQgbWFjaGluZXMKLUBzZXQgSDgzMDAKLUBzZXQgSGl0YWNoaQotQGNsZWFyIEk5NjAKLQotQGMgMy4gUHJvcGVydGllcyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24KLUBzZXQgU2luZ2xlRm9ybWF0Ci1AY2xlYXIgVXNlc0VudlZhcnMKLUBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgQ09ORklHVVJBVElPTiBWQVJTCi0KZGlmZiAtLWdpdCBhL2xkL2xkLjEgYi9sZC9sZC4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODUxNmI5Li4wMDAwMDAwCi0tLSBhL2xkL2xkLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE1ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggbGQgMSAiMTcgQXVndXN0IDE5OTIiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1sZCBcLSB0aGUgR05VIGxpbmtlcgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgbGQgCi0uUkIgIltcfCIgXC1vICIKLS5JIG91dHB1dFxjCi1cJlx8XSBcYwotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLS5icgotLlJCICJbXHwiIFwtQVxjCi0uSSBhcmNoaXRlY3R1cmVcYwotXCZcfF0gCi0uUkIgIltcfCIgIlwtYlwgIlxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1Cc3RhdGljICJcfF0iICAKLS5SQiAiW1x8IiBcLUJkeW5hbWljICJcfF0iICAKLS5SQiAiW1x8IiBcLUJzeW1ib2xpYyAiXHxdIiAgCi0uUkIgIltcfCIgIlwtY1wgIlxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLVwtY3JlZiAiXHxdIgotLlJCICJbXHwiIFwtZCB8IFwtZGMgfCBcLWRwXGMKLVx8XQotLmJyCi0uUkIgIltcfCIgIlwtZGVmc3ltXCAiXGMKLS5JIHN5bWJvbFxjCi1cJiA9IFxjCi0uSSBleHByZXNzaW9uXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgXC1cLW5vXC1kZW1hbmdsZSAiXHxdIgotLlJCICJbXHwiICJcLWVcICJcYwotLkkgZW50cnlcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1lbWJlZGRlZFwtcmVsb2NzICJcfF0iCi0uUkIgIltcfCIgXC1FICJcfF0iIAotLlJCICJbXHwiIFwtZXhwb3J0XC1keW5hbWljICJcfF0iCi0uUkIgIltcfCIgIlwtZlwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1hdXhpbGlhcnlcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLUZcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLVwtZmlsdGVyXCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1mb3JtYXRcICJcYwotLkkgaW5wdXQtZm9ybWF0XGMKLVwmXHxdIAotLlJCICJbXHwiIFwtZyAiXHxdIiAKLS5SQiAiW1x8IiBcLUcKLS5JIHNpemVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1oXCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1zb25hbWVcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iCi0uUkIgIltcfCIgXC1pICJcfF0iCi0uUkIgIltcfCIgXC1sXGMKLS5JIGFyXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtTFxjCi0uSSBzZWFyY2hkaXJcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1NICJcfF0iIAotLlJCICJbXHwiIFwtTWFwCi0uSSBtYXBmaWxlXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtbQotLkkgZW11bGF0aW9uXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtbiB8IFwtTiAiXHxdIiAKLS5SQiAiW1x8IiBcLW5vaW5oaWJpdC1leGVjICJcfF0iIAotLlJCICJbXHwiIFwtbm9cLWtlZXBcLW1lbW9yeSAiXHxdIiAKLS5SQiAiW1x8IiBcLW5vXC13YXJuXC1taXNtYXRjaCAiXHxdIiAKLS5SQiAiW1x8IiBcLU9cYwotLkkgbGV2ZWxcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1vZm9ybWF0XCAiXGMKLS5JIG91dHB1dC1mb3JtYXRcYwotXCZcfF0gCi0uUkIgIltcfCIgIlwtUlwgIlxjCi0uSSBmaWxlbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtcmVsYXggIlx8XSIKLS5SQiAiW1x8IiBcLXIgfCBcLVVyICJcfF0iIAotLlJCICJbXHwiICJcLXJwYXRoXCAiXGMKLS5JIGRpcmVjdG9yeVxjCi1cJlx8XQotLlJCICJbXHwiICJcLXJwYXRoXC1saW5rXCAiXGMKLS5JIGRpcmVjdG9yeVxjCi1cJlx8XQotLlJCICJbXHwiIFwtUyAiXHxdIiAKLS5SQiAiW1x8IiBcLXMgIlx8XSIgCi0uUkIgIltcfCIgXC1zaGFyZWQgIlx8XSIgCi0uUkIgIltcfCIgXC1zb3J0XC1jb21tb24gIlx8XSIgCi0uUkIgIltcfCIgIlwtc3BsaXRcLWJ5XC1yZWxvY1wgIlxjCi0uSSBjb3VudFxjCi1cJlx8XQotLlJCICJbXHwiIFwtc3BsaXRcLWJ5XC1maWxlICJcfF0iIAotLlJCICJbXHwiICJcLVRcICJcYwotLkkgY29tbWFuZGZpbGVcYwotXCZcfF0gIAotLlJCICJbXHwiICJcLVR0ZXh0XCAiXGMKLS5JIHRleHRvcmdcYwotXCZcfF0gCi0uUkIgIltcfCIgIlwtVGRhdGFcICJcYwotLkkgZGF0YW9yZ1xjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1UYnNzXCAiXGMKLS5JIGJzc29yZ1xjCi1cJlx8XQotLlJCICJbXHwiIFwtdCAiXHxdIiAKLS5SQiAiW1x8IiAiXC11XCAiXGMKLS5JIHN5bVxjCi1cJl0KLS5SQiAiW1x8IiBcLVYgIlx8XSIKLS5SQiAiW1x8IiBcLXYgIlx8XSIKLS5SQiAiW1x8IiBcLVwtdmVyYm9zZSAiXHxdIgotLlJCICJbXHwiIFwtXC12ZXJzaW9uICJcfF0iCi0uUkIgIltcfCIgXC13YXJuXC1jb21tb24gIlx8XSIgCi0uUkIgIltcfCIgXC13YXJuXC1jb25zdHJ1Y3RvcnMgIlx8XSIgCi0uUkIgIltcfCIgXC13YXJuXC1tdWx0aXBsZVwtZ3AgIlx8XSIgCi0uUkIgIltcfCIgXC13YXJuXC1vbmNlICJcfF0iIAotLlJCICJbXHwiIFwtd2Fyblwtc2VjdGlvblwtYWxpZ24gIlx8XSIgCi0uUkIgIltcfCIgXC1cLXdob2xlXC1hcmNoaXZlICJcfF0iIAotLlJCICJbXHwiIFwtXC1ub1wtd2hvbGVcLWFyY2hpdmUgIlx8XSIgCi0uUkIgIltcfCIgIlwtXC13cmFwXCAiXGMKLS5JIHN5bWJvbFxjCi1cJlx8XQotLlJCICJbXHwiIFwtWCAiXHxdIiAKLS5SQiAiW1x8IiBcLXggIlx8XSIgCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotXGMKLS5CIGxkXGMKLVwmIGNvbWJpbmVzIGEgbnVtYmVyIG9mIG9iamVjdCBhbmQgYXJjaGl2ZSBmaWxlcywgcmVsb2NhdGVzCi10aGVpciBkYXRhIGFuZCB0aWVzIHVwIHN5bWJvbCByZWZlcmVuY2VzLiBPZnRlbiB0aGUgbGFzdCBzdGVwIGluCi1idWlsZGluZyBhIG5ldyBjb21waWxlZCBwcm9ncmFtIHRvIHJ1biBpcyBhIGNhbGwgdG8gXGMKLS5CIGxkXGMKLVwmLgotCi1cYwotLkIgbGRcYwotXCYgYWNjZXB0cyBMaW5rZXIgQ29tbWFuZCBMYW5ndWFnZSBmaWxlcyAKLXRvIHByb3ZpZGUgZXhwbGljaXQgYW5kIHRvdGFsIGNvbnRyb2wgb3ZlciB0aGUgbGlua2luZyBwcm9jZXNzLgotVGhpcyBtYW4gcGFnZSBkb2VzIG5vdCBkZXNjcmliZSB0aGUgY29tbWFuZCBsYW5ndWFnZTsgc2VlIHRoZSBgXHxcYwotLkIgbGRcYwotXHwnIGVudHJ5IGluIGBcfFxjCi0uQiBpbmZvXGMKLVx8Jywgb3IgdGhlIG1hbnVhbAotLkkKLWxkOiB0aGUgR05VIGxpbmtlcgotXCYsIGZvciBmdWxsIGRldGFpbHMgb24gdGhlIGNvbW1hbmQgbGFuZ3VhZ2UgYW5kIG9uIG90aGVyIGFzcGVjdHMgb2YKLXRoZSBHTlUgbGlua2VyLiAKLQotVGhpcyB2ZXJzaW9uIG9mIFxjCi0uQiBsZFxjCi1cJiB1c2VzIHRoZSBnZW5lcmFsIHB1cnBvc2UgQkZEIGxpYnJhcmllcwotdG8gb3BlcmF0ZSBvbiBvYmplY3QgZmlsZXMuIFRoaXMgYWxsb3dzIFxjCi0uQiBsZFxjCi1cJiB0byByZWFkLCBjb21iaW5lLCBhbmQKLXdyaXRlIG9iamVjdCBmaWxlcyBpbiBtYW55IGRpZmZlcmVudCBmb3JtYXRzXChlbVwmZm9yIGV4YW1wbGUsIENPRkYgb3IKLVxjCi0uQiBhLm91dFxjCi1cJi4gIERpZmZlcmVudCBmb3JtYXRzIG1heSBiZSBsaW5rZWQgdG9nZXRoZXIgdG8gcHJvZHVjZSBhbnkKLWF2YWlsYWJsZSBraW5kIG9mIG9iamVjdCBmaWxlLiAgWW91IGNhbiB1c2UgYFx8XGMKLS5CIG9iamR1bXAgXC1pXGMKLVx8JyB0byBnZXQgYSBsaXN0IG9mIGZvcm1hdHMgc3VwcG9ydGVkIG9uIHZhcmlvdXMgYXJjaGl0ZWN0dXJlczsgc2VlIAotLkJSIG9iamR1bXAgKCAxICkuCi0KLUFzaWRlIGZyb20gaXRzIGZsZXhpYmlsaXR5LCB0aGUgR05VIGxpbmtlciBpcyBtb3JlIGhlbHBmdWwgdGhhbiBvdGhlcgotbGlua2VycyBpbiBwcm92aWRpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gIE1hbnkgbGlua2VycyBhYmFuZG9uCi1leGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBlbmNvdW50ZXJpbmcgYW4gZXJyb3I7IHdoZW5ldmVyIHBvc3NpYmxlLAotXGMKLS5CIGxkXGMKLVwmIGNvbnRpbnVlcyBleGVjdXRpbmcsIGFsbG93aW5nIHlvdSB0byBpZGVudGlmeSBvdGhlciBlcnJvcnMKLShvciwgaW4gc29tZSBjYXNlcywgdG8gZ2V0IGFuIG91dHB1dCBmaWxlIGluIHNwaXRlIG9mIHRoZSBlcnJvcikuCi0KLVRoZSBHTlUgbGlua2VyIFxjCi0uQiBsZFxjCi1cJiBpcyBtZWFudCB0byBjb3ZlciBhIGJyb2FkIHJhbmdlIG9mIHNpdHVhdGlvbnMsCi1hbmQgdG8gYmUgYXMgY29tcGF0aWJsZSBhcyBwb3NzaWJsZSB3aXRoIG90aGVyIGxpbmtlcnMuICBBcyBhIHJlc3VsdCwKLXlvdSBoYXZlIG1hbnkgY2hvaWNlcyB0byBjb250cm9sIGl0cyBiZWhhdmlvciB0aHJvdWdoIHRoZSBjb21tYW5kIGxpbmUsCi1hbmQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0KLS5TSCBPUFRJT05TCi1UaGUgcGxldGhvcmEgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMgbWF5IHNlZW0gaW50aW1pZGF0aW5nLCBidXQgaW4KLWFjdHVhbCBwcmFjdGljZSBmZXcgb2YgdGhlbSBhcmUgdXNlZCBpbiBhbnkgcGFydGljdWxhciBjb250ZXh0LgotRm9yIGluc3RhbmNlLCBhIGZyZXF1ZW50IHVzZSBvZiBcYwotLkIgbGRcYwotXCYgaXMgdG8gbGluayBzdGFuZGFyZCBVbml4Ci1vYmplY3QgZmlsZXMgb24gYSBzdGFuZGFyZCwgc3VwcG9ydGVkIFVuaXggc3lzdGVtLiAgT24gc3VjaCBhIHN5c3RlbSwgdG8KLWxpbmsgYSBmaWxlIFxjCi0uQiBoZWxsby5vXGMKLVwmOgotLnNwCi0uYnIKLSRcIGxkXCBcLW9cIG91dHB1dFwgL2xpYi9jcnQwLm9cIGhlbGxvLm9cIFwtbGMKLS5icgotLnNwCi1UaGlzIHRlbGxzIFxjCi0uQiBsZFxjCi1cJiB0byBwcm9kdWNlIGEgZmlsZSBjYWxsZWQgXGMKLS5CIG91dHB1dFxjCi1cJiBhcyB0aGUKLXJlc3VsdCBvZiBsaW5raW5nIHRoZSBmaWxlIFxjCi0uQiAvbGliL2NydDAub1xjCi1cJiB3aXRoIFxjCi0uQiBoZWxsby5vXGMKLVwmIGFuZAotdGhlIGxpYnJhcnkgXGMKLS5CIGxpYmMuYVxjCi1cJiB3aGljaCB3aWxsIGNvbWUgZnJvbSB0aGUgc3RhbmRhcmQgc2VhcmNoCi1kaXJlY3Rvcmllcy4KLQotVGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIFxjCi0uQiBsZFxjCi1cJiBtYXkgYmUgc3BlY2lmaWVkIGluIGFueSBvcmRlciwgYW5kCi1tYXkgYmUgcmVwZWF0ZWQgYXQgd2lsbC4gIEZvciB0aGUgbW9zdCBwYXJ0LCByZXBlYXRpbmcgYW4gb3B0aW9uIHdpdGggYQotZGlmZmVyZW50IGFyZ3VtZW50IHdpbGwgZWl0aGVyIGhhdmUgbm8gZnVydGhlciBlZmZlY3QsIG9yIG92ZXJyaWRlIHByaW9yCi1vY2N1cnJlbmNlcyAodGhvc2UgZnVydGhlciB0byB0aGUgbGVmdCBvbiB0aGUgY29tbWFuZCBsaW5lKSBvZiBhbgotb3B0aW9uLiAgCi0KLVRoZSBleGNlcHRpb25zXChlbVwmd2hpY2ggbWF5IG1lYW5pbmdmdWxseSBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlXChlbVwmYXJlCi1cYwotLkIgXC1BXGMKLVwmLCBcYwotLkIgXC1iXGMKLVwmIChvciBpdHMgc3lub255bSBcYwotLkIgXC1mb3JtYXRcYwotXCYpLCBcYwotLkIgXC1kZWZzeW1cYwotXCYsCi1cYwotLkIgXC1MXGMKLVwmLCBcYwotLkIgXC1sXGMKLVwmLCBcYwotLkIgXC1SXGMKLVwmLCBhbmQgXGMKLS5CIFwtdVxjCi1cJi4KLQotVGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHRvIGJlIGxpbmtlZCB0b2dldGhlciwgc2hvd24gYXMgXGMKLS5JIG9iamZpbGVcYwotXCYsCi1tYXkgZm9sbG93LCBwcmVjZWRlLCBvciBiZSBtaXhlZCBpbiB3aXRoIGNvbW1hbmQtbGluZSBvcHRpb25zOyBzYXZlIHRoYXQKLWFuIFxjCi0uSSBvYmpmaWxlXGMKLVwmIGFyZ3VtZW50IG1heSBub3QgYmUgcGxhY2VkIGJldHdlZW4gYW4gb3B0aW9uIGZsYWcgYW5kCi1pdHMgYXJndW1lbnQuCi0KLVVzdWFsbHkgdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggYXQgbGVhc3Qgb25lIG9iamVjdCBmaWxlLCBidXQgb3RoZXIKLWZvcm1zIG9mIGJpbmFyeSBpbnB1dCBmaWxlcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgd2l0aCBcYwotLkIgXC1sXGMKLVwmLAotXGMKLS5CIFwtUlxjCi1cJiwgYW5kIHRoZSBzY3JpcHQgY29tbWFuZCBsYW5ndWFnZS4gIElmIFxjCi0uSSBub1xjCi1cJiBiaW5hcnkgaW5wdXQKLWZpbGVzIGF0IGFsbCBhcmUgc3BlY2lmaWVkLCB0aGUgbGlua2VyIGRvZXMgbm90IHByb2R1Y2UgYW55IG91dHB1dCwgYW5kCi1pc3N1ZXMgdGhlIG1lc3NhZ2UgYFx8XGMKLS5CIE5vIGlucHV0IGZpbGVzXGMKLVx8Jy4KLQotT3B0aW9uIGFyZ3VtZW50cyBtdXN0IGVpdGhlciBmb2xsb3cgdGhlIG9wdGlvbiBsZXR0ZXIgd2l0aG91dCBpbnRlcnZlbmluZwotd2hpdGVzcGFjZSwgb3IgYmUgZ2l2ZW4gYXMgc2VwYXJhdGUgYXJndW1lbnRzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUKLW9wdGlvbiB0aGF0IHJlcXVpcmVzIHRoZW0uCi0KLS5UUAotLkJJICItQSIgImFyY2hpdGVjdHVyZSIKLUluIHRoZSBjdXJyZW50IHJlbGVhc2Ugb2YgXGMKLS5CIGxkXGMKLVwmLCB0aGlzIG9wdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgdGhlCi1JbnRlbCA5NjAgZmFtaWx5IG9mIGFyY2hpdGVjdHVyZXMuICBJbiB0aGF0IFxjCi0uQiBsZFxjCi1cJiBjb25maWd1cmF0aW9uLCB0aGUKLVxjCi0uSSBhcmNoaXRlY3R1cmVcYwotXCYgYXJndW1lbnQgaXMgb25lIG9mIHRoZSB0d28tbGV0dGVyIG5hbWVzIGlkZW50aWZ5aW5nCi1tZW1iZXJzIG9mIHRoZSA5NjAgZmFtaWx5OyB0aGUgb3B0aW9uIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBvdXRwdXQKLXRhcmdldCwgYW5kIHdhcm5zIG9mIGFueSBpbmNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBpbnB1dCBmaWxlcy4KLUl0IGFsc28gbW9kaWZpZXMgdGhlIGxpbmtlcidzIHNlYXJjaCBzdHJhdGVneSBmb3IgYXJjaGl2ZSBsaWJyYXJpZXMsIHRvCi1zdXBwb3J0IHRoZSB1c2Ugb2YgbGlicmFyaWVzIHNwZWNpZmljIHRvIGVhY2ggcGFydGljdWxhcgotYXJjaGl0ZWN0dXJlLCBieSBpbmNsdWRpbmcgaW4gdGhlIHNlYXJjaCBsb29wIG5hbWVzIHN1ZmZpeGVkIHdpdGggdGhlCi1zdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdXIgXGMKLS5CIGxkXGMKLVwmIGNvbW1hbmQgbGluZSBpbmNsdWRlZCBgXHxcYwotLkIgXC1BQ0FcYwotXHwnIGFzCi13ZWxsIGFzIGBcfFxjCi0uQiBcLWx0cnlcYwotXHwnLCB0aGUgbGlua2VyIHdvdWxkIGxvb2sgKGluIGl0cyBidWlsdC1pbiBzZWFyY2gKLXBhdGhzLCBhbmQgaW4gYW55IHBhdGhzIHlvdSBzcGVjaWZ5IHdpdGggXGMKLS5CIFwtTFxjCi1cJikgZm9yIGEgbGlicmFyeSB3aXRoCi10aGUgbmFtZXMKLS5zcAotLmJyCi10cnkKLS5icgotbGlidHJ5LmEKLS5icgotdHJ5Y2EKLS5icgotbGlidHJ5Y2EuYQotLmJyCi0uc3AKLQotVGhlIGZpcnN0IHR3byBwb3NzaWJpbGl0aWVzIHdvdWxkIGJlIGNvbnNpZGVyZWQgaW4gYW55IGV2ZW50OyB0aGUgbGFzdAotdHdvIGFyZSBkdWUgdG8gdGhlIHVzZSBvZiBgXHxcYwotLkIgXC1BQ0FcYwotXHwnLgotCi1GdXR1cmUgcmVsZWFzZXMgb2YgXGMKLS5CIGxkXGMKLVwmIG1heSBzdXBwb3J0IHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBmb3IKLW90aGVyIGFyY2hpdGVjdHVyZSBmYW1pbGllcy4KLQotWW91IGNhbiBtZWFuaW5nZnVsbHkgdXNlIFxjCi0uQiBcLUFcYwotXCYgbW9yZSB0aGFuIG9uY2Ugb24gYSBjb21tYW5kIGxpbmUsIGlmCi1hbiBhcmNoaXRlY3R1cmUgZmFtaWx5IGFsbG93cyBjb21iaW5hdGlvbiBvZiB0YXJnZXQgYXJjaGl0ZWN0dXJlczsgZWFjaAotdXNlIHdpbGwgYWRkIGFub3RoZXIgcGFpciBvZiBuYW1lIHZhcmlhbnRzIHRvIHNlYXJjaCBmb3Igd2hlbiBcYwotLkIgXC1sCi1zcGVjaWZpZXMgYSBsaWJyYXJ5LgotCi0uVFAKLS5CSSAiXC1iICIgImlucHV0LWZvcm1hdCIKLVNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIGlucHV0IG9iamVjdCBmaWxlcyB0aGF0IGZvbGxvdyB0aGlzIG9wdGlvbgotb24gdGhlIGNvbW1hbmQgbGluZS4gIFlvdSBkb24ndCB1c3VhbGx5IG5lZWQgdG8gc3BlY2lmeSB0aGlzLCBhcwotXGMKLS5CIGxkXGMKLVwmIGlzIGNvbmZpZ3VyZWQgdG8gZXhwZWN0IGFzIGEgZGVmYXVsdCBpbnB1dCBmb3JtYXQgdGhlIG1vc3QKLXVzdWFsIGZvcm1hdCBvbiBlYWNoIG1hY2hpbmUuICBcYwotLkkgaW5wdXQtZm9ybWF0XGMKLVwmIGlzIGEgdGV4dCBzdHJpbmcsIHRoZQotbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgQkZEIGxpYnJhcmllcy4gIAotXGMKLS5CIFwtZm9ybWF0IFxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCZcYwotXCYgaGFzIHRoZSBzYW1lIGVmZmVjdCwgYXMgZG9lcyB0aGUgc2NyaXB0IGNvbW1hbmQKLS5CUiBUQVJHRVQgLgotCi1Zb3UgbWF5IHdhbnQgdG8gdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgbGlua2luZyBmaWxlcyB3aXRoIGFuIHVudXN1YWwKLWJpbmFyeSBmb3JtYXQuICBZb3UgY2FuIGFsc28gdXNlIFxjCi0uQiBcLWJcYwotXCYgdG8gc3dpdGNoIGZvcm1hdHMgZXhwbGljaXRseSAod2hlbgotbGlua2luZyBvYmplY3QgZmlsZXMgb2YgZGlmZmVyZW50IGZvcm1hdHMpLCBieSBpbmNsdWRpbmcKLVxjCi0uQiBcLWIgXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlxjCi1cJiBiZWZvcmUgZWFjaCBncm91cCBvZiBvYmplY3QgZmlsZXMgaW4gYQotcGFydGljdWxhciBmb3JtYXQuICAKLQotVGhlIGRlZmF1bHQgZm9ybWF0IGlzIHRha2VuIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0uQiBHTlVUQVJHRVRcYwotXCYuICBZb3UgY2FuIGFsc28gZGVmaW5lIHRoZSBpbnB1dAotZm9ybWF0IGZyb20gYSBzY3JpcHQsIHVzaW5nIHRoZSBjb21tYW5kIFxjCi0uQiBUQVJHRVRcYwotXCYuCi0KLS5UUAotLkIgXC1Cc3RhdGljIAotRG8gbm90IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgb24KLXBsYXRmb3JtcyBmb3Igd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLgotCi0uVFAKLS5CIFwtQmR5bmFtaWMKLUxpbmsgYWdhaW5zdCBkeW5hbWljIGxpYnJhcmllcy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIG9uIHBsYXRmb3JtcwotZm9yIHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gIFRoaXMgb3B0aW9uIGlzIG5vcm1hbGx5IHRoZQotZGVmYXVsdCBvbiBzdWNoIHBsYXRmb3Jtcy4KLQotLlRQCi0uQiBcLUJzeW1ib2xpYwotV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBiaW5kIHJlZmVyZW5jZXMgdG8gZ2xvYmFsIHN5bWJvbHMgdG8KLXRoZSBkZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnksIGlmIGFueS4gIE5vcm1hbGx5LCBpdCBpcwotcG9zc2libGUgZm9yIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IHRvIG92ZXJyaWRlIHRoZQotZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsCi1vbiBFTEYgcGxhdGZvcm1zIHdoaWNoIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KLQotLlRQCi0uQkkgIlwtYyAiICJjb21tYW5kZmlsZSIKLURpcmVjdHMgXGMKLS5CIGxkXGMKLVwmIHRvIHJlYWQgbGluayBjb21tYW5kcyBmcm9tIHRoZSBmaWxlCi1cYwotLkkgY29tbWFuZGZpbGVcYwotXCYuICBUaGVzZSBjb21tYW5kcyB3aWxsIGNvbXBsZXRlbHkgb3ZlcnJpZGUgXGMKLS5CIGxkXGMKLVwmJ3MKLWRlZmF1bHQgbGluayBmb3JtYXQgKHJhdGhlciB0aGFuIGFkZGluZyB0byBpdCk7IFxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJiBtdXN0Ci1zcGVjaWZ5IGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGRlc2NyaWJlIHRoZSB0YXJnZXQgZm9ybWF0LgotCi0KLVlvdSBtYXkgYWxzbyBpbmNsdWRlIGEgc2NyaXB0IG9mIGxpbmsgY29tbWFuZHMgZGlyZWN0bHkgaW4gdGhlIGNvbW1hbmQKLWxpbmUgYnkgYnJhY2tldGluZyBpdCBiZXR3ZWVuIGBcfFxjCi0uQiB7XGMKLVx8JyBhbmQgYFx8XGMKLS5CIH1cYwotXHwnIGNoYXJhY3RlcnMuCi0KLS5UUAotLkIgXC1cLWNyZWYKLU91dHB1dCBhIGNyb3NzIHJlZmVyZW5jZSB0YWJsZS4gIElmIGEgbGlua2VyIG1hcCBmaWxlIGlzIGJlaW5nCi1nZW5lcmF0ZWQsIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUgaXMgcHJpbnRlZCB0byB0aGUgbWFwIGZpbGUuCi1PdGhlcndpc2UsIGl0IGlzIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KLQotLlRQCi0uQiBcLWQgCi0uVFAKLS5CIFwtZGMKLS5UUAotLkIgXC1kcAotVGhlc2UgdGhyZWUgb3B0aW9ucyBhcmUgZXF1aXZhbGVudDsgbXVsdGlwbGUgZm9ybXMgYXJlIHN1cHBvcnRlZCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLiAgVXNlIGFueSBvZiB0aGVtIHRvIG1ha2UgXGMKLS5CIGxkCi1hc3NpZ24gc3BhY2UgdG8gY29tbW9uIHN5bWJvbHMgZXZlbiBpZiBhIHJlbG9jYXRhYmxlIG91dHB1dCBmaWxlIGlzCi1zcGVjaWZpZWQgKFxjCi0uQiBcLXJcYwotXCYpLiAgVGhlIHNjcmlwdCBjb21tYW5kCi1cYwotLkIgRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT05cYwotXCYgaGFzIHRoZSBzYW1lIGVmZmVjdC4KLQotLlRQCi0uQkkgIi1kZWZzeW0gIiAic3ltYm9sIiAiXGZSID0gXGZQIiBleHByZXNzaW9uCi1DcmVhdGUgYSBnbG9iYWwgc3ltYm9sIGluIHRoZSBvdXRwdXQgZmlsZSwgY29udGFpbmluZyB0aGUgYWJzb2x1dGUKLWFkZHJlc3MgZ2l2ZW4gYnkgXGMKLS5JIGV4cHJlc3Npb25cYwotXCYuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbiBhcyBtYW55Ci10aW1lcyBhcyBuZWNlc3NhcnkgdG8gZGVmaW5lIG11bHRpcGxlIHN5bWJvbHMgaW4gdGhlIGNvbW1hbmQgbGluZS4gIEEKLWxpbWl0ZWQgZm9ybSBvZiBhcml0aG1ldGljIGlzIHN1cHBvcnRlZCBmb3IgdGhlIFxjCi0uSSBleHByZXNzaW9uXGMKLVwmIGluIHRoaXMKLWNvbnRleHQ6IHlvdSBtYXkgZ2l2ZSBhIGhleGFkZWNpbWFsIGNvbnN0YW50IG9yIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nCi1zeW1ib2wsIG9yIHVzZSBcYwotLkIgK1xjCi1cJiBhbmQgXGMKLS5CIFwtXGMKLVwmIHRvIGFkZCBvciBzdWJ0cmFjdCBoZXhhZGVjaW1hbAotY29uc3RhbnRzIG9yIHN5bWJvbHMuICBJZiB5b3UgbmVlZCBtb3JlIGVsYWJvcmF0ZSBleHByZXNzaW9ucywgY29uc2lkZXIKLXVzaW5nIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSBmcm9tIGEgc2NyaXB0LgotCi0uVFAKLS5CIFwtXC1kZW1hbmdsZQotLlRQCi0uQiBcLVwtbm9cLWRlbWFuZ2xlCi1UaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hldGhlciB0byBkZW1hbmdsZSBzeW1ib2wgbmFtZXMgaW4gZXJyb3IKLW1lc3NhZ2VzIGFuZCBvdGhlciBvdXRwdXQuICBXaGVuIHRoZSBsaW5rZXIgaXMgdG9sZCB0byBkZW1hbmdsZSwgaXQKLXRyaWVzIHRvIHByZXNlbnQgc3ltYm9sIG5hbWVzIGluIGEgcmVhZGFibGUgZmFzaGlvbjogaXQgc3RyaXBzIGxlYWRpbmcKLXVuZGVyc2NvcmVzIGlmIHRoZXkgYXJlIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgYW5kIGNvbnZlcnRzCi1DKysgbWFuZ2xlZCBzeW1ib2wgbmFtZXMgaW50byB1c2VyIHJlYWRhYmxlIG5hbWVzLiAgVGhlIGxpbmtlciB3aWxsCi1kZW1hbmdsZSBieSBkZWZhdWx0IHVubGVzcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIENPTExFQ1RfTk9fREVNQU5HTEUKLWlzIHNldC4gIFRoZXNlIG9wdGlvbnMgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCi0KLS5UUAotLkJJICItZSAiICJlbnRyeSJcYwotXCYgCi1Vc2UgXGMKLS5JIGVudHJ5XGMKLVwmIGFzIHRoZSBleHBsaWNpdCBzeW1ib2wgZm9yIGJlZ2lubmluZyBleGVjdXRpb24gb2YgeW91cgotcHJvZ3JhbSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgZW50cnkgcG9pbnQuICBTZWUgdGhlIGBcfFxjCi0uQiBsZFxjCi1cfCcgZW50cnkgaW4gYFx8XGMKLS5CIGluZm9cYwotXHwnIGZvciBhCi1kaXNjdXNzaW9uIG9mIGRlZmF1bHRzIGFuZCBvdGhlciB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlCi1lbnRyeSBwb2ludC4KLQotLlRQCi0uQiBcLWVtYmVkZGVkXC1yZWxvY3MKLVRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGxpbmtpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZSwKLWdlbmVyYXRlZCBieSB0aGUKLS5CIFwtbWVtYmVkZGVkXC1waWMKLW9wdGlvbiB0byB0aGUgR05VIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIuICBJdCBjYXVzZXMgdGhlIGxpbmtlciB0bwotY3JlYXRlIGEgdGFibGUgd2hpY2ggbWF5IGJlIHVzZWQgYXQgcnVudGltZSB0byByZWxvY2F0ZSBhbnkgZGF0YSB3aGljaAotd2FzIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgdG8gcG9pbnRlciB2YWx1ZXMuICBTZWUgdGhlIGNvZGUgaW4KLXRlc3RzdWl0ZS9sZC1lbXBpYyBmb3IgZGV0YWlscy4KLQotLlRQCi0uQiBcLUUKLS5UUAotLkIgXC1leHBvcnRcLWR5bmFtaWMKLVdoZW4gY3JlYXRpbmcgYW4gRUxGIGZpbGUsIGFkZCBhbGwgc3ltYm9scyB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi1Ob3JtYWxseSwgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGNvbnRhaW5zIG9ubHkgc3ltYm9scyB3aGljaCBhcmUgdXNlZAotYnkgYSBkeW5hbWljIG9iamVjdC4gIFRoaXMgb3B0aW9uIGlzIG5lZWRlZCBmb3Igc29tZSB1c2VzIG9mCi0uSSBkbG9wZW4uCi0KLS5UUAotLkJJICItZiAiICJuYW1lIgotLlRQCi0uQkkgIi0tYXV4aWxpYXJ5ICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX0FVWElMSUFSWSBmaWVsZAotdG8gdGhlIHNwZWNpZmllZCBuYW1lLiAgVGhpcyB0ZWxscyB0aGUgZHluYW1pYyBsaW5rZXIgdGhhdCB0aGUgc3ltYm9sCi10YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBzaG91bGQgYmUgdXNlZCBhcyBhbiBhdXhpbGlhcnkgZmlsdGVyIG9uIHRoZQotc3ltYm9sIHRhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0Ci0uSSBuYW1lLgotCi0uVFAKLS5CSSAiLUYgIiAibmFtZSIKLS5UUAotLkJJICItLWZpbHRlciAiICJuYW1lIgotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9GSUxURVIgZmllbGQgdG8KLXRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbCB0YWJsZQotb2YgdGhlIHNoYXJlZCBvYmplY3Qgc2hvdWxkIGJlIHVzZWQgYXMgYSBmaWx0ZXIgb24gdGhlIHN5bWJvbCB0YWJsZSBvZgotdGhlIHNoYXJlZCBvYmplY3QKLS5JIG5hbWUuCi0KLS5UUAotLkJJICJcLWZvcm1hdCAiICJpbnB1dFwtZm9ybWF0IgotU3lub255bSBmb3IgXGMKLS5CIFwtYlxjCi1cJiBcYwotLkkgaW5wdXRcLWZvcm1hdFxjCi1cJi4KLQotLlRQCi0uQiBcLWcKLUFjY2VwdGVkLCBidXQgaWdub3JlZDsgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciB0b29scy4KLQotLlRQCi0uQkkgIlwtRyAiICJzaXplIlxjCi1TZXQgdGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG9wdGltaXplZCB1c2luZyB0aGUgR1AgcmVnaXN0ZXIKLXRvCi0uSSBzaXplCi11bmRlciBNSVBTIEVDT0ZGLiAgSWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotLlRQCi0uQkkgIi1oICIgIm5hbWUiCi0uVFAKLS5CSSAiLXNvbmFtZSAiICJuYW1lIgotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9TT05BTUUgZmllbGQgdG8KLXRoZSBzcGVjaWZpZWQgbmFtZS4gIFdoZW4gYW4gZXhlY3V0YWJsZSBpcyBsaW5rZWQgd2l0aCBhIHNoYXJlZCBvYmplY3QKLXdoaWNoIGhhcyBhIERUX1NPTkFNRSBmaWVsZCwgdGhlbiB3aGVuIHRoZSBleGVjdXRhYmxlIGlzIHJ1biB0aGUgZHluYW1pYwotbGlua2VyIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBzaGFyZWQgb2JqZWN0IHNwZWNpZmllZCBieSB0aGUgRFRfU09OQU1FCi1maWVsZCByYXRoZXIgdGhhbiB0aGUgdXNpbmcgdGhlIGZpbGUgbmFtZSBnaXZlbiB0byB0aGUgbGlua2VyLgotCi0uVFAKLS5CIFwtXC1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi1UaGlzIG9wdGlvbiBhbmQKLS5CIFwtXC12ZXJzaW9uCi1iZWdpbiB3aXRoIHR3byBkYXNoZXMgaW5zdGVhZCBvZiBvbmUKLWZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgR05VIHByb2dyYW1zLiAgVGhlIG90aGVyIG9wdGlvbnMgc3RhcnQgd2l0aAotb25seSBvbmUgZGFzaCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMuCi0KLS5UUAotLkIgXC1pCi1QZXJmb3JtIGFuIGluY3JlbWVudGFsIGxpbmsgKHNhbWUgYXMgb3B0aW9uIFxjCi0uQiBcLXJcYwotXCYpLgotCi0uVFAKLS5CSSAiXC1sIiAiYXIiXGMKLVwmIAotQWRkIGFuIGFyY2hpdmUgZmlsZSBcYwotLkkgYXJcYwotXCYgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gbGluay4gIFRoaXMgCi1vcHRpb24gbWF5IGJlIHVzZWQgYW55IG51bWJlciBvZiB0aW1lcy4gIFxjCi0uQiBsZFxjCi1cJiB3aWxsIHNlYXJjaCBpdHMKLXBhdGgtbGlzdCBmb3Igb2NjdXJyZW5jZXMgb2YgXGMKLS5CIGxpYlxjCi0uSSBhclxjCi1cJi5hXGMKLVwmIGZvciBldmVyeSBcYwotLkkgYXIKLXNwZWNpZmllZC4KLQotLlRQCi0uQkkgIlwtTCIgInNlYXJjaGRpciIKLVRoaXMgY29tbWFuZCBhZGRzIHBhdGggXGMKLS5JIHNlYXJjaGRpclxjCi1cJiB0byB0aGUgbGlzdCBvZiBwYXRocyB0aGF0Ci1cYwotLkIgbGRcYwotXCYgd2lsbCBzZWFyY2ggZm9yIGFyY2hpdmUgbGlicmFyaWVzLiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24KLWFueSBudW1iZXIgb2YgdGltZXMuCi0KLVRoZSBkZWZhdWx0IHNldCBvZiBwYXRocyBzZWFyY2hlZCAod2l0aG91dCBiZWluZyBzcGVjaWZpZWQgd2l0aAotXGMKLS5CIFwtTFxjCi1cJikgZGVwZW5kcyBvbiB3aGF0IGVtdWxhdGlvbiBtb2RlIFxjCi0uQiBsZFxjCi1cJiBpcyB1c2luZywgYW5kIGluCi1zb21lIGNhc2VzIGFsc28gb24gaG93IGl0IHdhcyBjb25maWd1cmVkLiAgICBUaGUKLXBhdGhzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiBhIGxpbmsgc2NyaXB0IHdpdGggdGhlIFxjCi0uQiBTRUFSQ0hfRElSCi1jb21tYW5kLgotCi0uVFAKLS5CIFwtTSAKLVByaW50ICh0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGZpbGUpIGEgbGluayBtYXBcKGVtXCZkaWFnbm9zdGljIGluZm9ybWF0aW9uCi1hYm91dCB3aGVyZSBzeW1ib2xzIGFyZSBtYXBwZWQgYnkgXGMKLS5CIGxkXGMKLVwmLCBhbmQgaW5mb3JtYXRpb24gb24gZ2xvYmFsCi1jb21tb24gc3RvcmFnZSBhbGxvY2F0aW9uLgotCi0uVFAKLS5CSSAiXC1NYXAgIiAibWFwZmlsZSJcYwotUHJpbnQgdG8gdGhlIGZpbGUKLS5JIG1hcGZpbGUKLWEgbGluayBtYXBcKGVtXCZkaWFnbm9zdGljIGluZm9ybWF0aW9uCi1hYm91dCB3aGVyZSBzeW1ib2xzIGFyZSBtYXBwZWQgYnkgXGMKLS5CIGxkXGMKLVwmLCBhbmQgaW5mb3JtYXRpb24gb24gZ2xvYmFsCi1jb21tb24gc3RvcmFnZSBhbGxvY2F0aW9uLgotCi0uVFAKLS5CSSAiXC1tICIgImVtdWxhdGlvbiJcYwotRW11bGF0ZSB0aGUKLS5JIGVtdWxhdGlvbgotbGlua2VyLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUgZW11bGF0aW9ucyB3aXRoIHRoZQotLkkgXC1cLXZlcmJvc2UKLW9yCi0uSSBcLVYKLW9wdGlvbnMuICBUaGlzIG9wdGlvbiBvdmVycmlkZXMgdGhlIGNvbXBpbGVkLWluIGRlZmF1bHQsIHdoaWNoIGlzIHRoZQotc3lzdGVtIGZvciB3aGljaCB5b3UgY29uZmlndXJlZAotLkJSIGxkIC4KLQotLlRQCi0uQiBcLU4gCi1zcGVjaWZpZXMgcmVhZGFibGUgYW5kIHdyaXRhYmxlIFxjCi0uQiB0ZXh0XGMKLVwmIGFuZCBcYwotLkIgZGF0YVxjCi1cJiBzZWN0aW9ucy4gSWYKLXRoZSBvdXRwdXQgZm9ybWF0IHN1cHBvcnRzIFVuaXggc3R5bGUgbWFnaWMgbnVtYmVycywgdGhlIG91dHB1dCBpcwotbWFya2VkIGFzIFxjCi0uQiBPTUFHSUNcYwotXCYuCi0KLVdoZW4geW91IHVzZSB0aGUgYFx8XGMKLS5CIFwtTlxjCi1cJlx8JyBvcHRpb24sIHRoZSBsaW5rZXIgZG9lcyBub3QgcGFnZS1hbGlnbiB0aGUKLWRhdGEgc2VnbWVudC4KLQotLlRQCi0uQiBcLW4gCi1zZXRzIHRoZSB0ZXh0IHNlZ21lbnQgdG8gYmUgcmVhZCBvbmx5LCBhbmQgXGMKLS5CIE5NQUdJQ1xjCi1cJiBpcyB3cml0dGVuCi1pZiBwb3NzaWJsZS4KLQotLlRQCi0uQiBcLW5vaW5oaWJpdFwtZXhlYwotTm9ybWFsbHksIHRoZSBsaW5rZXIgd2lsbCBub3QgcHJvZHVjZSBhbiBvdXRwdXQgZmlsZSBpZiBpdCBlbmNvdW50ZXJzCi1lcnJvcnMgZHVyaW5nIHRoZSBsaW5rIHByb2Nlc3MuICBXaXRoIHRoaXMgZmxhZywgeW91IGNhbiBzcGVjaWZ5IHRoYXQKLXlvdSB3aXNoIHRoZSBvdXRwdXQgZmlsZSByZXRhaW5lZCBldmVuIGFmdGVyIG5vbi1mYXRhbCBlcnJvcnMuCi0KLS5UUAotLkIgXC1ub1wta2VlcFwtbWVtb3J5Ci1UaGUgbGlua2VyIG5vcm1hbGx5IG9wdGltaXplcyBmb3Igc3BlZWQgb3ZlciBtZW1vcnkgdXNhZ2UgYnkgY2FjaGluZwotdGhlIHN5bWJvbCB0YWJsZXMgb2YgaW5wdXQgZmlsZXMgaW4gbWVtb3J5LiAgVGhpcyBvcHRpb24gdGVsbHMgdGhlCi1saW5rZXIgdG8gaW5zdGVhZCBvcHRpbWl6ZSBmb3IgbWVtb3J5IHVzYWdlLCBieSByZXJlYWRpbmcgdGhlIHN5bWJvbAotdGFibGVzIGFzIG5lY2Vzc2FyeS4gIFRoaXMgbWF5IGJlIHJlcXVpcmVkIGlmIHRoZSBsaW5rZXIgcnVucyBvdXQgb2YKLW1lbW9yeSBzcGFjZSB3aGlsZSBsaW5raW5nIGEgbGFyZ2UgZXhlY3V0YWJsZS4KLQotLlRQCi0uQiBcLW5vXC13YXJuXC1taXNtYXRjaAotTm9ybWFsbHkgdGhlIGxpbmtlciB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBsaW5rIHRvZ2V0aGVyCi1pbnB1dCBmaWxlcyB0aGF0IGFyZSBtaXNtYXRjaGVkIGZvciBzb21lIHJlYXNvbiwgcGVyaGFwcyBiZWNhdXNlIHRoZXkKLWhhdmUgYmVlbiBjb21waWxlZCBmb3IgZGlmZmVyZW50IHByb2Nlc3NvcnMgb3IgZm9yIGRpZmZlcmVudAotZW5kaWFubmVzc2VzLiAgVGhpcyBvcHRpb24gdGVsbHMgdGhlIGxpbmtlciB0aGF0IGl0IHNob3VsZCBzaWxlbnRseQotcGVybWl0IHN1Y2ggcG9zc2libGUgZXJyb3JzLiAgVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoCi1jYXJlLCBpbiBjYXNlcyB3aGVuIHlvdSBoYXZlIHRha2VuIHNvbWUgc3BlY2lhbCBhY3Rpb24gdGhhdCBlbnN1cmVzCi10aGF0IHRoZSBsaW5rZXIgZXJyb3JzIGFyZSBpbmFwcHJvcHJpYXRlLgotCi0uVFAKLS5CSSAiXC1vICIgIm91dHB1dCIKLS5JIG91dHB1dFxjCi1cJiBpcyBhIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHByb2R1Y2VkIGJ5IFxjCi0uQiBsZFxjCi1cJjsgaWYgdGhpcwotb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIGBcfFxjCi0uQiBhLm91dFxjCi1cfCcgaXMgdXNlZCBieSBkZWZhdWx0LiAgVGhlCi1zY3JpcHQgY29tbWFuZCBcYwotLkIgT1VUUFVUXGMKLVwmIGNhbiBhbHNvIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIG5hbWUuCi0KLS5UUAotLkJJICJcLU8iICJsZXZlbCIKLUdlbmVyYXRlIG9wdGltaXplZCBvdXRwdXQgZmlsZXMuICBUaGlzIG1pZ2h0IHVzZSBzaWduaWZpY2FudGx5IG1vcmUKLXRpbWUgYW5kIHRoZXJlZm9yZSBwcm9iYWJseSBzaG91bGQgYmUgZW5hYmxlZCBvbmx5IGZvciBnZW5lcmF0aW5nIHRoZQotZmluYWwgYmluYXJ5LgotXGMKLS5JIGxldmVsXGMKLVwmIGlzIHN1cHBvc2VkIHRvIGJlIGEgbnVtZXJpYyB2YWx1ZS4gIEFueSB2YWx1ZSBncmVhdGVyIHRoYW4gemVybyBlbmFibGVzCi10aGUgb3B0aW1pemF0aW9ucy4KLQotLlRQCi0uQkkgIlwtb2Zvcm1hdCAiICJvdXRwdXRcLWZvcm1hdCIKLVNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUuCi1Zb3UgZG9uJ3QgdXN1YWxseSBuZWVkIHRvIHNwZWNpZnkgdGhpcywgYXMKLVxjCi0uQiBsZFxjCi1cJiBpcyBjb25maWd1cmVkIHRvIHByb2R1Y2UgYXMgYSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgdGhlIG1vc3QKLXVzdWFsIGZvcm1hdCBvbiBlYWNoIG1hY2hpbmUuICBcYwotLkkgb3V0cHV0LWZvcm1hdFxjCi1cJiBpcyBhIHRleHQgc3RyaW5nLCB0aGUKLW5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAKLVRoZSBzY3JpcHQgY29tbWFuZAotLkIgT1VUUFVUX0ZPUk1BVAotY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZvcm1hdCwgYnV0IHRoaXMgb3B0aW9uIG92ZXJyaWRlcyBpdC4KLQotLlRQCi0uQkkgIlwtUiAiICJmaWxlbmFtZSIKLVJlYWQgc3ltYm9sIG5hbWVzIGFuZCB0aGVpciBhZGRyZXNzZXMgZnJvbSBcYwotLkkgZmlsZW5hbWVcYwotXCYsIGJ1dCBkbyBub3QKLXJlbG9jYXRlIGl0IG9yIGluY2x1ZGUgaXQgaW4gdGhlIG91dHB1dC4gIFRoaXMgYWxsb3dzIHlvdXIgb3V0cHV0IGZpbGUKLXRvIHJlZmVyIHN5bWJvbGljYWxseSB0byBhYnNvbHV0ZSBsb2NhdGlvbnMgb2YgbWVtb3J5IGRlZmluZWQgaW4gb3RoZXIKLXByb2dyYW1zLgotCi0uVFAKLS5CIFwtcmVsYXgKLUFuIG9wdGlvbiB3aXRoIG1hY2hpbmUgZGVwZW5kZW50IGVmZmVjdHMuICBDdXJyZW50bHkgdGhpcyBvcHRpb24gaXMgb25seQotc3VwcG9ydGVkIG9uIHRoZSBIOC8zMDAuCi0KLU9uIHNvbWUgcGxhdGZvcm1zLCB1c2UgdGhpcyBvcHRpb24gdG8gcGVyZm9ybSBnbG9iYWwgb3B0aW1pemF0aW9ucyB0aGF0Ci1iZWNvbWUgcG9zc2libGUgd2hlbiB0aGUgbGlua2VyIHJlc29sdmVzIGFkZHJlc3NpbmcgaW4geW91ciBwcm9ncmFtLCBzdWNoCi1hcyByZWxheGluZyBhZGRyZXNzIG1vZGVzIGFuZCBzeW50aGVzaXppbmcgbmV3IGluc3RydWN0aW9ucyBpbiB0aGUKLW91dHB1dCBvYmplY3QgZmlsZS4gIAotCi1PbiBwbGF0Zm9ybXMgd2hlcmUgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLCBgXHxcYwotLkIgXC1yZWxheFxjCi1cJlx8JyBpcyBhY2NlcHRlZCwgYnV0IGhhcyBubyBlZmZlY3QuCi0KLS5UUAotLkIgXC1yIAotR2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dFwoZW1cJmkuZS4sIGdlbmVyYXRlIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCi10dXJuIHNlcnZlIGFzIGlucHV0IHRvIFxjCi0uQiBsZFxjCi1cJi4gIFRoaXMgaXMgb2Z0ZW4gY2FsbGVkIFxjCi0uSSBwYXJ0aWFsCi1saW5raW5nXGMKLVwmLiAgQXMgYSBzaWRlIGVmZmVjdCwgaW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBzdGFuZGFyZCBVbml4Ci1tYWdpYyBudW1iZXJzLCB0aGlzIG9wdGlvbiBhbHNvIHNldHMgdGhlIG91dHB1dCBmaWxlJ3MgbWFnaWMgbnVtYmVyIHRvCi1cYwotLkIgT01BR0lDXGMKLVwmLgotSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgYW4gYWJzb2x1dGUgZmlsZSBpcyBwcm9kdWNlZC4gIFdoZW4KLWxpbmtpbmcgQysrIHByb2dyYW1zLCB0aGlzIG9wdGlvbiBcYwotLkkgd2lsbCBub3RcYwotXCYgcmVzb2x2ZSByZWZlcmVuY2VzIHRvCi1jb25zdHJ1Y3RvcnM7IFxjCi0uQiBcLVVyXGMKLVwmIGlzIGFuIGFsdGVybmF0aXZlLiAKLQotVGhpcyBvcHRpb24gZG9lcyB0aGUgc2FtZSBhcyBcYwotLkIgXC1pXGMKLVwmLgotCi0uVFAKLS5CIFwtcnBhdGhcIFxmSWRpcmVjdG9yeQotQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGguICBUaGlzIGlzIHVzZWQgd2hlbgotbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSB3aXRoIHNoYXJlZCBvYmplY3RzLiAgQWxsIAotLkIgXC1ycGF0aAotYXJndW1lbnRzIGFyZSBjb25jYXRlbmF0ZWQgYW5kIHBhc3NlZCB0byB0aGUgcnVudGltZSBsaW5rZXIsIHdoaWNoIHVzZXMKLXRoZW0gdG8gbG9jYXRlIHNoYXJlZCBvYmplY3RzIGF0IHJ1bnRpbWUuICBUaGUKLS5CIFwtcnBhdGgKLW9wdGlvbiBpcyBhbHNvIHVzZWQgd2hlbiBsb2NhdGluZyBzaGFyZWQgb2JqZWN0cyB3aGljaCBhcmUgbmVlZGVkIGJ5Ci1zaGFyZWQgb2JqZWN0cyBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBsaW5rOyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mCi10aGUKLS5CIFwtcnBhdGhcLWxpbmsKLW9wdGlvbi4gIElmCi0uQiBcLXJwYXRoCi1pcyBub3QgdXNlZCB3aGVuIGxpbmtpbmcgYW4gRUxGIGV4ZWN1dGFibGUsIHRoZSBjb250ZW50cyBvZiB0aGUKLWVudmlyb25tZW50IHZhcmlhYmxlCi0uQiBMRF9SVU5fUEFUSAotd2lsbCBiZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQuCi0KLVRoZQotLkIgXC1ycGF0aAotb3B0aW9uIG1heSBhbHNvIGJlIHVzZWQgb24gU3VuT1MuICBCeSBkZWZhdWx0LCBvbiBTdW5PUywgdGhlIGxpbmtlcgotd2lsbCBmb3JtIGEgcnVudGltZSBzZWFyY2ggcGF0aCBvdXQgb2YgYWxsIHRoZQotLkIgXC1MCi1vcHRpb25zIGl0IGlzIGdpdmVuLiAgSWYgYQotLkIgXC1ycGF0aAotb3B0aW9uIGlzIHVzZWQsIHRoZSBydW50aW1lIHNlYXJjaCBwYXRoIHdpbGwgYmUgZm9ybWVkIGV4Y2x1c2l2ZWx5Ci11c2luZyB0aGUKLS5CIFwtcnBhdGgKLW9wdGlvbnMsIGlnbm9yaW5nCi10aGUKLS5CIFwtTAotb3B0aW9ucy4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHVzaW5nIGdjYywgd2hpY2ggYWRkcyBtYW55Ci0uQiBcLUwKLW9wdGlvbnMgd2hpY2ggbWF5IGJlIG9uIE5GUyBtb3VudGVkIGZpbGVzeXN0ZW1zLgotCi0uVFAKLS5CIFwtcnBhdGhcLWxpbmtcIFxmSWRpcmVjdG9yeQotV2hlbiB1c2luZyBFTEYgb3IgU3VuT1MsIG9uZSBzaGFyZWQgbGlicmFyeSBtYXkgcmVxdWlyZSBhbm90aGVyLiAgVGhpcwotaGFwcGVucyB3aGVuIGFuCi0uQiBsZFwgXC1zaGFyZWQKLWxpbmsgaW5jbHVkZXMgYSBzaGFyZWQgbGlicmFyeSBhcyBvbmUgb2YgdGhlIGlucHV0IGZpbGVzLgotCi1XaGVuIHRoZSBsaW5rZXIgZW5jb3VudGVycyBzdWNoIGEgZGVwZW5kZW5jeSB3aGVuIGRvaW5nIGEgbm9uLXNoYXJlZCwKLW5vbi1yZWxvY2F0ZWFibGUgbGluaywgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBsb2NhdGUgdGhlIHJlcXVpcmVkCi1zaGFyZWQgbGlicmFyeSBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbGluaywgaWYgaXQgaXMgbm90IGluY2x1ZGVkCi1leHBsaWNpdGx5LiAgSW4gc3VjaCBhIGNhc2UsIHRoZQotLkIgXC1ycGF0aFwtbGluawotb3B0aW9uIHNwZWNpZmllcyB0aGUgZmlyc3Qgc2V0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaC4gIFRoZQotLkIgXC1ycGF0aFwtbGluawotb3B0aW9uIG1heSBzcGVjaWZ5IGEgc2VxdWVuY2Ugb2YgZGlyZWN0b3J5IG5hbWVzIGVpdGhlciBieSBzcGVjaWZ5aW5nCi1hIGxpc3Qgb2YgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbG9ucywgb3IgYnkgYXBwZWFyaW5nIG11bHRpcGxlIHRpbWVzLgotCi1JZiB0aGUgcmVxdWlyZWQgc2hhcmVkIGxpYnJhcnkgaXMgbm90IGZvdW5kLCB0aGUgbGlua2VyIHdpbGwgaXNzdWUgYQotd2FybmluZyBhbmQgY29udGludWUgd2l0aCB0aGUgbGluay4KLQotLlRQCi0uQiBcLVMgCi1PbWl0cyBkZWJ1Z2dlciBzeW1ib2wgaW5mb3JtYXRpb24gKGJ1dCBub3QgYWxsIHN5bWJvbHMpIGZyb20gdGhlIG91dHB1dCBmaWxlLgotCi0uVFAKLS5CIFwtcyAKLU9taXRzIGFsbCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3V0cHV0IGZpbGUuCi0KLS5UUAotLkIgXC1zaGFyZWQKLUNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgb24gRUxGIGFuZAotU3VuT1MgcGxhdGZvcm1zIChvbiBTdW5PUyBpdCBpcyBub3QgcmVxdWlyZWQsIGFzIHRoZSBsaW5rZXIgd2lsbAotYXV0b21hdGljYWxseSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSB3aGVuIHRoZXJlIGFyZSB1bmRlZmluZWQgc3ltYm9scwotYW5kIHRoZQotLkIgXC1lCi1vcHRpb24gaXMgbm90IHVzZWQpLgotCi0uVFAKLS5CIFwtc29ydFwtY29tbW9uCi1Ob3JtYWxseSwgd2hlbgotLkIgbGQKLXBsYWNlcyB0aGUgZ2xvYmFsIGNvbW1vbiBzeW1ib2xzIGluIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgc2VjdGlvbnMsCi1pdCBzb3J0cyB0aGVtIGJ5IHNpemUuICBGaXJzdCBjb21lIGFsbCB0aGUgb25lIGJ5dGUgc3ltYm9scywgdGhlbiBhbGwKLXRoZSB0d28gYnl0ZXMsIHRoZW4gYWxsIHRoZSBmb3VyIGJ5dGVzLCBhbmQgdGhlbiBldmVyeXRoaW5nIGVsc2UuCi1UaGlzIGlzIHRvIHByZXZlbnQgZ2FwcyBiZXR3ZWVuIHN5bWJvbHMgZHVlIHRvCi1hbGlnbm1lbnQgY29uc3RyYWludHMuICBUaGlzIG9wdGlvbiBkaXNhYmxlcyB0aGF0IHNvcnRpbmcuCi0KLS5UUAotLkIgXC1zcGxpdFwtYnlcLXJlbG9jXCBcZkljb3VudAotVHJ5cyB0byBjcmVhdGVzIGV4dHJhIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQgZmlsZSBzbyB0aGF0IG5vIHNpbmdsZQotb3V0cHV0IHNlY3Rpb24gaW4gdGhlIGZpbGUgY29udGFpbnMgbW9yZSB0aGFuCi0uSSBjb3VudAotcmVsb2NhdGlvbnMuCi1UaGlzIGlzIHVzZWZ1bCB3aGVuIGdlbmVyYXRpbmcgaHVnZSByZWxvY2F0YWJsZSBmb3IgZG93bmxvYWRpbmcgaW50bwotY2VydGFpbiByZWFsIHRpbWUga2VybmVscyB3aXRoIHRoZSBDT0ZGIG9iamVjdCBmaWxlIGZvcm1hdDsgc2luY2UgQ09GRgotY2Fubm90IHJlcHJlc2VudCBtb3JlIHRoYW4gNjU1MzUgcmVsb2NhdGlvbnMgaW4gYSBzaW5nbGUgc2VjdGlvbi4KLU5vdGUgdGhhdCB0aGlzIHdpbGwgZmFpbCB0byB3b3JrIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3QKLXN1cHBvcnQgYXJiaXRyYXJ5IHNlY3Rpb25zLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzcGxpdCB1cCBpbmRpdmlkdWFsCi1pbnB1dCBzZWN0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24sIHNvIGlmIGEgc2luZ2xlIGlucHV0IHNlY3Rpb24KLWNvbnRhaW5zIG1vcmUgdGhhbgotLkkgY291bnQKLXJlbG9jYXRpb25zIG9uZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGNvbnRhaW4gdGhhdCBtYW55IHJlbG9jYXRpb25zLgotCi0uVFAKLS5CIFwtc3BsaXRcLWJ5XC1maWxlCi1TaW1pbGFyIHRvCi0uQiBcLXNwbGl0XC1ieVwtcmVsb2MKLWJ1dCBjcmVhdGVzIGEgbmV3IG91dHB1dCBzZWN0aW9uIGZvciBlYWNoIGlucHV0IGZpbGUuCi0KLS5UUAotLkJJICJcLVRic3MgIiAib3JnIlxjCi0uVFAKLS5CSSAiXC1UZGF0YSAiICJvcmciXGMKLS5UUAotLkJJICJcLVR0ZXh0ICIgIm9yZyJcYwotVXNlIFxjCi0uSSBvcmdcYwotXCYgYXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgZm9yXChlbVwmcmVzcGVjdGl2ZWx5XChlbVwmdGhlCi1cYwotLkIgYnNzXGMKLVwmLCBcYwotLkIgZGF0YVxjCi1cJiwgb3IgdGhlIFxjCi0uQiB0ZXh0XGMKLVwmIHNlZ21lbnQgb2YgdGhlIG91dHB1dCBmaWxlLgotXGMKLS5JIG9yZ1xjCi1cJiBtdXN0IGJlIGEgaGV4YWRlY2ltYWwgaW50ZWdlci4KLQotLlRQCi0uQkkgIlwtVCAiICJjb21tYW5kZmlsZSIKLUVxdWl2YWxlbnQgdG8gXGMKLS5CIFwtYyBcYwotLkkgY29tbWFuZGZpbGVcYwotXCZcYwotXCY7IHN1cHBvcnRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi1vdGhlciB0b29scy4gIAotCi0uVFAKLS5CIFwtdCAKLVByaW50cyBuYW1lcyBvZiBpbnB1dCBmaWxlcyBhcyBcYwotLkIgbGRcYwotXCYgcHJvY2Vzc2VzIHRoZW0uCi0KLS5UUAotLkJJICJcLXUgIiAic3ltIgotRm9yY2VzIFxjCi0uSSBzeW1cYwotXCYgdG8gYmUgZW50ZXJlZCBpbiB0aGUgb3V0cHV0IGZpbGUgYXMgYW4gdW5kZWZpbmVkIHN5bWJvbC4KLVRoaXMgbWF5LCBmb3IgZXhhbXBsZSwgdHJpZ2dlciBsaW5raW5nIG9mIGFkZGl0aW9uYWwgbW9kdWxlcyBmcm9tCi1zdGFuZGFyZCBsaWJyYXJpZXMuICBcYwotLkIgXC11XGMKLVwmIG1heSBiZSByZXBlYXRlZCB3aXRoIGRpZmZlcmVudCBvcHRpb24KLWFyZ3VtZW50cyB0byBlbnRlciBhZGRpdGlvbmFsIHVuZGVmaW5lZCBzeW1ib2xzLgotCi0uVFAKLS5CIFwtVXIgCi1Gb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLVxjCi0uQiBcLXJcYwotXCY6IGl0IGdlbmVyYXRlcyByZWxvY2F0YWJsZSBvdXRwdXRcKGVtXCZpLmUuLCBhbiBvdXRwdXQgZmlsZSB0aGF0IGNhbiBpbgotdHVybiBzZXJ2ZSBhcyBpbnB1dCB0byBcYwotLkIgbGRcYwotXCYuICBXaGVuIGxpbmtpbmcgQysrIHByb2dyYW1zLCBcYwotLkIgXC1VcgotLkkgd2lsbFxjCi1cJiByZXNvbHZlIHJlZmVyZW5jZXMgdG8gY29uc3RydWN0b3JzLCB1bmxpa2UgXGMKLS5CIFwtclxjCi1cJi4KLQotLlRQCi0uQiBcLVwtdmVyYm9zZQotRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIFxjCi0uQiBsZAotYW5kIGxpc3QgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotRGlzcGxheSB3aGljaCBpbnB1dCBmaWxlcyBjYW4gYW5kIGNhbiBub3QgYmUgb3BlbmVkLgotCi0uVFAKLS5CIFwtdiwgXC1WCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkXGMKLVwmLgotVGhlCi0uQiBcLVYKLW9wdGlvbiBhbHNvIGxpc3RzIHRoZSBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KLQotLlRQCi0uQiBcLVwtdmVyc2lvbgotRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIFxjCi0uQiBsZAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC13YXJuXC1jb21tb24KLVdhcm4gd2hlbiBhIGNvbW1vbiBzeW1ib2wgaXMgY29tYmluZWQgd2l0aCBhbm90aGVyIGNvbW1vbiBzeW1ib2wgb3Igd2l0aAotYSBzeW1ib2wgZGVmaW5pdGlvbi4gIFVuaXggbGlua2VycyBhbGxvdyB0aGlzIHNvbWV3aGF0IHNsb3BweSBwcmFjdGljZSwKLWJ1dCBsaW5rZXJzIG9uIHNvbWUgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgZG8gbm90LiAgVGhpcyBvcHRpb24gYWxsb3dzCi15b3UgdG8gZmluZCBwb3RlbnRpYWwgcHJvYmxlbXMgZnJvbSBjb21iaW5pbmcgZ2xvYmFsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC13YXJuXC1jb25zdHJ1Y3RvcnMKLVdhcm4gaWYgYW55IGdsb2JhbCBjb25zdHJ1Y3RvcnMgYXJlIHVzZWQuICBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciBhCi1mZXcgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIEZvciBmb3JtYXRzIGxpa2UgQ09GRiBvciBFTEYsIHRoZSBsaW5rZXIgY2FuCi1ub3QgZGV0ZWN0IHRoZSB1c2Ugb2YgZ2xvYmFsIGNvbnN0cnVjdG9ycy4KLQotLlRQCi0uQiBcLXdhcm5cLW11bHRpcGxlXC1ncAotV2FybiBpZiB0aGUgb3V0cHV0IGZpbGUgcmVxdWlyZXMgbXVsdGlwbGUgZ2xvYmFsLXBvaW50ZXIgdmFsdWVzLiAgVGhpcwotb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgY2VydGFpbiBwcm9jZXNzb3JzLCBzdWNoIGFzIHRoZSBBbHBoYS4KLQotLlRQCi0uQiBcLXdhcm5cLW9uY2UKLU9ubHkgd2FybiBvbmNlIGZvciBlYWNoIHVuZGVmaW5lZCBzeW1ib2wsIHJhdGhlciB0aGFuIG9uY2UgcGVyIG1vZHVsZQotd2hpY2ggcmVmZXJzIHRvIGl0LgotCi0uVFAKLS5CIFwtd2Fyblwtc2VjdGlvblwtYWxpZ24KLVdhcm4gaWYgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0IHNlY3Rpb24gaXMgY2hhbmdlZCBiZWNhdXNlIG9mCi1hbGlnbm1lbnQuICBUeXBpY2FsbHksIHRoZSBhbGlnbm1lbnQgd2lsbCBiZSBzZXQgYnkgYW4gaW5wdXQgc2VjdGlvbi4KLVRoZSBhZGRyZXNzIHdpbGwgb25seSBiZSBjaGFuZ2VkIGlmIGl0IG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZDsgdGhhdAotaXMsIGlmIHRoZSBTRUNUSU9OUyBjb21tYW5kIGRvZXMgbm90IHNwZWNpZnkgYSBzdGFydCBhZGRyZXNzIGZvciB0aGUKLXNlY3Rpb24uCi0KLS5UUAotLkIgXC1cLXdob2xlXC1hcmNoaXZlCi1Gb3IgZWFjaCBhcmNoaXZlIG1lbnRpb25lZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFmdGVyIHRoZQotLkIgXC1cLXdob2xlXC1hcmNoaXZlCi1vcHRpb24sIGluY2x1ZGUgZXZlcnkgb2JqZWN0IGZpbGUgaW4gdGhlIGFyY2hpdmUgaW4gdGhlIGxpbmssIHJhdGhlcgotdGhhbiBzZWFyY2hpbmcgdGhlIGFyY2hpdmUgZm9yIHRoZSByZXF1aXJlZCBvYmplY3QgZmlsZXMuICBUaGlzIGlzCi1ub3JtYWxseSB1c2VkIHRvIHR1cm4gYW4gYXJjaGl2ZSBmaWxlIGludG8gYSBzaGFyZWQgbGlicmFyeSwgZm9yY2luZwotZXZlcnkgb2JqZWN0IHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgc2hhcmVkIGxpYnJhcnkuCi0KLS5UUAotLkIgXC1cLW5vXC13aG9sZVwtYXJjaGl2ZQotVHVybiBvZmYgdGhlIGVmZmVjdCBvZiB0aGUKLS5CIFwtXC13aG9sZVwtYXJjaGl2ZQotb3B0aW9uIGZvciBhcmNoaXZlcyB3aGljaCBhcHBlYXIgbGF0ZXIgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotLlRQCi0uQkkgIi0td3JhcCAiICJzeW1ib2wiCi1Vc2UgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciAKLS5JIHN5bWJvbC4KLUFueSB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi0uSSBzeW1ib2wKLXdpbGwgYmUgcmVzb2x2ZWQgdG8KLS5CSSAiX193cmFwXyIgInN5bWJvbCIuCi1BbnkgdW5kZWZpbmVkIHJlZmVyZW5jZSB0bwotLkJJICJfX3JlYWxfIiAic3ltYm9sIgotd2lsbCBiZSByZXNvbHZlZCB0bwotLkkgc3ltYm9sLgotCi0uVFAKLS5CIFwtWCAKLURlbGV0ZSBhbGwgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMuICBGb3IgbW9zdCB0YXJnZXRzLCB0aGlzIGlzIGFsbCBsb2NhbAotc3ltYm9scyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIGBcfFxjCi0uQiBMXGMKLVx8Jy4KLQotLlRQCi0uQiBcLXgKLURlbGV0ZSBhbGwgbG9jYWwgc3ltYm9scy4KLQotLlBQCi0KLS5TSCBFTlZJUk9OTUVOVAotXGMKLVlvdSBjYW4gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgotLkIgbGRcYwotXCYgd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgXGMKLS5CIEdOVVRBUkdFVFxjCi1cJi4KLQotXGMKLS5CIEdOVVRBUkdFVFxjCi1cJiBkZXRlcm1pbmVzIHRoZSBpbnB1dC1maWxlIG9iamVjdCBmb3JtYXQgaWYgeW91IGRvbid0Ci11c2UgXGMKLS5CIFwtYlxjCi1cJiAob3IgaXRzIHN5bm9ueW0gXGMKLS5CIFwtZm9ybWF0XGMKLVwmKS4gIEl0cyB2YWx1ZSBzaG91bGQgYmUgb25lCi1vZiB0aGUgQkZEIG5hbWVzIGZvciBhbiBpbnB1dCBmb3JtYXQuICBJZiB0aGVyZSBpcyBubwotXGMKLS5CIEdOVVRBUkdFVFxjCi1cJiBpbiB0aGUgZW52aXJvbm1lbnQsIFxjCi0uQiBsZFxjCi1cJiB1c2VzIHRoZSBuYXR1cmFsIGZvcm1hdAotb2YgdGhlIGhvc3QuIElmIFxjCi0uQiBHTlVUQVJHRVRcYwotXCYgaXMgc2V0IHRvIFxjCi0uQiBkZWZhdWx0XGMKLVwmIHRoZW4gQkZEIGF0dGVtcHRzIHRvIGRpc2NvdmVyIHRoZQotaW5wdXQgZm9ybWF0IGJ5IGV4YW1pbmluZyBiaW5hcnkgaW5wdXQgZmlsZXM7IHRoaXMgbWV0aG9kIG9mdGVuCi1zdWNjZWVkcywgYnV0IHRoZXJlIGFyZSBwb3RlbnRpYWwgYW1iaWd1aXRpZXMsIHNpbmNlIHRoZXJlIGlzIG5vIG1ldGhvZAotb2YgZW5zdXJpbmcgdGhhdCB0aGUgbWFnaWMgbnVtYmVyIHVzZWQgdG8gZmxhZyBvYmplY3QtZmlsZSBmb3JtYXRzIGlzCi11bmlxdWUuICBIb3dldmVyLCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZWR1cmUgZm9yIEJGRCBvbiBlYWNoIHN5c3RlbQotcGxhY2VzIHRoZSBjb252ZW50aW9uYWwgZm9ybWF0IGZvciB0aGF0IHN5c3RlbSBmaXJzdCBpbiB0aGUgc2VhcmNoLWxpc3QsCi1zbyBhbWJpZ3VpdGllcyBhcmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY29udmVudGlvbi4KLQotLlBQCi0KLS5TSCAiU0VFIEFMU08iCi0KLS5CUiBvYmpkdW1wICggMSApCi0uYnIKLS5icgotLlJCICJgXHwiIGxkICJcfCcgYW5kIGBcfCIgYmludXRpbHMgIlx8JyIKLWVudHJpZXMgaW4KLS5CIGluZm9cYwotLmJyCi0uSSAKLWxkOiB0aGUgR05VIGxpbmtlclxjCi0sIFN0ZXZlIENoYW1iZXJsYWluIGFuZCBSb2xhbmQgUGVzY2g7Ci0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLSwgUm9sYW5kIEguIFBlc2NoLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9sZC9sZC5oIGIvbGQvbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1NjVhOC4uMDAwMDAwMAotLS0gYS9sZC9sZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qIGxkLmggLS0gZ2VuZXJhbCBsaW5rZXIgaGVhZGVyIGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERfSAotI2RlZmluZSBMRF9ICi0KLSNpZmRlZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLQotLyogTG9vayBpbiB0aGlzIGVudmlyb25tZW50IG5hbWUgZm9yIHRoZSBsaW5rZXIgdG8gcHJldGVuZCB0byBiZSAqLwotI2RlZmluZSBFTVVMQVRJT05fRU5WSVJPTiAiTERFTVVMQVRJT04iCi0vKiBJZiBpbiB0aGVyZSBsb29rIGZvciB0aGUgc3RyaW5nczogKi8KLQotLyogTG9vayBpbiB0aGlzIHZhcmlhYmxlIGZvciBhIHRhcmdldCBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0VUX0VOVklST04gIkdOVVRBUkdFVCIKLQotLyogSW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIHB1dCBpbiBhIHNlY3Rpb24gb2YgdGhpcyBuYW1lIGFyZSBhY3R1YWxseQotICAgZGlzY2FyZGVkLiAgKi8KLSNkZWZpbmUgRElTQ0FSRF9TRUNUSU9OX05BTUUgIi9ESVNDQVJELyIKLQotLyogQSB3aWxkY2FyZCBzcGVjaWZpY2F0aW9uLiAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gbGRncmFtLnksIGJ1dCBpdAotICAgd2luZHMgdXAgaW4gbGRncmFtLmgsIHNvIHdlIG5lZWQgdG8gZGVmaW5lIGl0IG91dHNpZGUuICAqLwotCi1zdHJ1Y3Qgd2lsZGNhcmRfc3BlYwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICpleGNsdWRlX25hbWU7Ci0gIGJvb2xlYW4gc29ydGVkOwotfTsKLQotLyogRXh0cmEgaW5mb3JtYXRpb24gd2UgaG9sZCBvbiBzZWN0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgIHVzZXJfc2VjdGlvbl9zdHJ1Y3QKLXsKLSAgLyogUG9pbnRlciB0byB0aGUgc2VjdGlvbiB3aGVyZSB0aGlzIGRhdGEgd2lsbCBnbyAqLwotICBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICpmaWxlOwotfSBzZWN0aW9uX3VzZXJkYXRhX3R5cGU7Ci0KLQotI2RlZmluZSBnZXRfdXNlcmRhdGEoeCkgKCh4KS0+dXNlcmRhdGEpCi0KLSNkZWZpbmUgQllURV9TSVpFCSgxKQotI2RlZmluZSBTSE9SVF9TSVpFCSgyKQotI2RlZmluZSBMT05HX1NJWkUJKDQpCi0jZGVmaW5lIFFVQURfU0laRQkoOCkKLQotLyogQUxJR04gbWFjcm8gY2hhbmdlZCB0byBBTElHTl9OIHRvIGF2b2lkCSovCi0vKiBjb25mbGljdCBpbiAvdXNyL2luY2x1ZGUvbWFjaGluZS9tYWNocGFyYW0uaCAqLwotLyogV0FSTklORzogSWYgVEhJUyBpcyBhIDY0IGJpdCBhZGRyZXNzIGFuZCBCT1VOREFSWSBpcyBhIDMyIGJpdCBpbnQsCi0gICB5b3UgbXVzdCBjb2VyY2UgYm91bmRhcnkgdG8gdGhlIHNhbWUgdHlwZSBhcyBUSElTLgotICAgPz8/IElzIHRoZXJlIGEgcG9ydGFibGUgd2F5IHRvIGF2b2lkIHRoaXMuICAqLwotI2RlZmluZSBBTElHTl9OKHRoaXMsIGJvdW5kYXJ5KSBcCi0gICgoKCAodGhpcykgKyAoKGJvdW5kYXJ5KSAtMSkpICYgKH4oKGJvdW5kYXJ5KS0xKSkpKQotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiAxID0+IGFzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGByZWxvY2F0YWJsZV9vdXRwdXQnLiAgKi8KLSAgYm9vbGVhbiBmb3JjZV9jb21tb25fZGVmaW5pdGlvbjsKLSAgYm9vbGVhbiByZWxheDsKLQotICAvKiBOYW1lIG9mIHJ1bnRpbWUgaW50ZXJwcmV0ZXIgdG8gaW52b2tlLiAgKi8KLSAgY2hhciAqaW50ZXJwcmV0ZXI7Ci0KLSAgLyogTmFtZSB0byBnaXZlIHJ1bnRpbWUgbGliYXJ5IGZyb20gdGhlIC1zb25hbWUgYXJndW1lbnQuICAqLwotICBjaGFyICpzb25hbWU7Ci0KLSAgLyogUnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGZyb20gdGhlIC1ycGF0aCBhcmd1bWVudC4gICovCi0gIGNoYXIgKnJwYXRoOwotCi0gIC8qIExpbmsgdGltZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGggZnJvbSB0aGUgLXJwYXRoLWxpbmsKLSAgICAgYXJndW1lbnQuICAqLwotICBjaGFyICpycGF0aF9saW5rOwotCi0gIC8qIEJpZyBvciBsaXR0bGUgZW5kaWFuIGFzIHNldCBvbiBjb21tYW5kIGxpbmUuICAqLwotICBlbnVtIHsgRU5ESUFOX1VOU0VUID0gMCwgRU5ESUFOX0JJRywgRU5ESUFOX0xJVFRMRSB9IGVuZGlhbjsKLQotICAvKiBJZiB0cnVlLCBleHBvcnQgYWxsIHN5bWJvbHMgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIGFuIEVMRgotICAgICBleGVjdXRhYmxlLiAgKi8KLSAgYm9vbGVhbiBleHBvcnRfZHluYW1pYzsKLQotICAvKiBJZiB0cnVlLCBidWlsZCBNSVBTIGVtYmVkZGVkIFBJQyByZWxvY2F0aW9uIHRhYmxlcyBpbiB0aGUgb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICBib29sZWFuIGVtYmVkZGVkX3JlbG9jczsKLQotICAvKiBJZiB0cnVlLCBmb3JjZSBnZW5lcmF0aW9uIG9mIGEgZmlsZSB3aXRoIGEgLmV4ZSBmaWxlLiAqLwotICBib29sZWFuIGZvcmNlX2V4ZV9zdWZmaXg7Ci0KLSAgLyogSWYgdHJ1ZSwgZ2VuZXJhdGUgYSBjcm9zcyByZWZlcmVuY2UgcmVwb3J0LiAgKi8KLSAgYm9vbGVhbiBjcmVmOwotCi0gIC8qIElmIHRydWUgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgd2FybiBhYm91dCBtaXNtYXRjaGVkIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgYm9vbGVhbiB3YXJuX21pc21hdGNoOwotCi0gIC8qIFJlbW92ZSB1bnJlZmVyZW5jZWQgc2VjdGlvbnM/ICAqLwotICBib29sZWFuIGdjX3NlY3Rpb25zOwotCi0gIC8qIE5hbWUgb2Ygc2hhcmVkIG9iamVjdCB3aG9zZSBzeW1ib2wgdGFibGUgc2hvdWxkIGJlIGZpbHRlcmVkIHdpdGgKLSAgICAgdGhpcyBzaGFyZWQgb2JqZWN0LiAgRnJvbSB0aGUgLS1maWx0ZXIgb3B0aW9uLiAgKi8KLSAgY2hhciAqZmlsdGVyX3NobGliOwotCi0gIC8qIE5hbWUgb2Ygc2hhcmVkIG9iamVjdCBmb3Igd2hvc2Ugc3ltYm9sIHRhYmxlIHRoaXMgc2hhcmVkIG9iamVjdAotICAgICBpcyBhbiBhdXhpbGlhcnkgZmlsdGVyLiAgRnJvbSB0aGUgLS1hdXhpbGlhcnkgb3B0aW9uLiAgKi8KLSAgY2hhciAqKmF1eGlsaWFyeV9maWx0ZXJzOwotCi0gIC8qIEEgdmVyc2lvbiBzeW1ib2wgdG8gYmUgYXBwbGllZCB0byB0aGUgc3ltYm9sIG5hbWVzIGZvdW5kIGluIHRoZQotICAgICAuZXhwb3J0cyBzZWN0aW9ucy4gICovCi0gIGNoYXIgKnZlcnNpb25fZXhwb3J0c19zZWN0aW9uOwotCi0gIC8qIElmIHRydWUgKHRoZSBkZWZhdWx0KSBjaGVjayBzZWN0aW9uIGFkZHJlc3Nlcywgb25jZSBjb21wdXRlLAotICAgICBmcG9yIG92ZXJsYXBzLiAgKi8KLSAgYm9vbGVhbiBjaGVja19zZWN0aW9uX2FkZHJlc3NlczsKLSAgCi19IGFyZ3NfdHlwZTsKLQotZXh0ZXJuIGFyZ3NfdHlwZSBjb21tYW5kX2xpbmU7Ci0KLXR5cGVkZWYgaW50IHRva2VuX2NvZGVfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGJmZF9zaXplX3R5cGUgc3BlY2lmaWVkX2RhdGFfc2l6ZTsKLSAgYm9vbGVhbiBtYWdpY19kZW1hbmRfcGFnZWQ7Ci0gIGJvb2xlYW4gbWFrZV9leGVjdXRhYmxlOwotCi0gIC8qIElmIHRydWUsIGRvaW5nIGEgZHluYW1pYyBsaW5rLiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX2xpbms7Ci0KLSAgLyogSWYgdHJ1ZSwgLXNoYXJlZCBpcyBzdXBwb3J0ZWQuICAqLwotICAvKiA/Pz8gQSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgaXMgcGVyaGFwcyB0byBkZWZpbmUgdGhpcyBpbiB0aGUKLSAgICAgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IHNpbmNlIHRoaXMgaXMgcmVhbGx5IGEgdGFyZ2V0IGRlcGVuZGVudAotICAgICBwYXJhbWV0ZXIuICAqLwotICBib29sZWFuIGhhc19zaGFyZWQ7Ci0KLSAgLyogSWYgdHJ1ZSwgYnVpbGQgY29uc3RydWN0b3JzLiAgKi8KLSAgYm9vbGVhbiBidWlsZF9jb25zdHJ1Y3RvcnM7Ci0KLSAgLyogSWYgdHJ1ZSwgd2FybiBhYm91dCBhbnkgY29uc3RydWN0b3JzLiAgKi8KLSAgYm9vbGVhbiB3YXJuX2NvbnN0cnVjdG9yczsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGFib3V0IG1lcmdpbmcgY29tbW9uIHN5bWJvbHMgd2l0aCBvdGhlcnMuICAqLwotICBib29sZWFuIHdhcm5fY29tbW9uOwotCi0gIC8qIElmIHRydWUsIG9ubHkgd2FybiBvbmNlIGFib3V0IGEgcGFydGljdWxhciB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiB3YXJuX29uY2U7Ci0KLSAgLyogSWYgdHJ1ZSwgd2FybiBpZiBtdWx0aXBsZSBnbG9iYWwtcG9pbnRlcnMgYXJlIG5lZWRlZCAoQWxwaGEKLSAgICAgb25seSkuICAqLwotICBib29sZWFuIHdhcm5fbXVsdGlwbGVfZ3A7Ci0KLSAgLyogSWYgdHJ1ZSwgd2FybiBpZiB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbgotICAgICBjaGFuZ2VzIGR1ZSB0byB0aGUgYWxpZ25tZW50IG9mIGFuIGlucHV0IHNlY3Rpb24uICAqLwotICBib29sZWFuIHdhcm5fc2VjdGlvbl9hbGlnbjsKLQotICBib29sZWFuIHNvcnRfY29tbW9uOwotCi0gIGJvb2xlYW4gdGV4dF9yZWFkX29ubHk7Ci0KLSAgY2hhciAqbWFwX2ZpbGVuYW1lOwotICBGSUxFICptYXBfZmlsZTsKLQotICBib29sZWFuIHN0YXRzOwotCi0gIGludCBzcGxpdF9ieV9yZWxvYzsKLSAgYm9vbGVhbiBzcGxpdF9ieV9maWxlOwotfSBsZF9jb25maWdfdHlwZTsKLQotZXh0ZXJuIGxkX2NvbmZpZ190eXBlIGNvbmZpZzsKLQotdHlwZWRlZiBlbnVtCi17Ci0gIGxhbmdfZmlyc3RfcGhhc2VfZW51bSwKLSAgbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0sCi0gIGxhbmdfZmluYWxfcGhhc2VfZW51bQotfSBsYW5nX3BoYXNlX3R5cGU7Ci0KLWV4dGVybiBib29sZWFuIGhhZF9zY3JpcHQ7Ci1leHRlcm4gYm9vbGVhbiBmb3JjZV9tYWtlX2V4ZWN1dGFibGU7Ci0KLS8qIE5vbi16ZXJvIGlmIHdlIGFyZSBwcm9jZXNzaW5nIGEgLS1kZWZzeW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLWV4dGVybiBpbnQgcGFyc2luZ19kZWZzeW07Ci0KLWV4dGVybiBpbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIGFkZF9jcmVmIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIG91dHB1dF9jcmVmIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIHZvaWQgY2hlY2tfbm9jcm9zc3JlZnMgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBsZF9hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSkKLSAgICAgQVRUUklCVVRFX05PUkVUVVJOOwotCi0vKiBJZiBnY2MsIHdlIGNhbiBnaXZlIGEgZnVuY3Rpb24gbmFtZSwgdG9vLiAgKi8KLSNpZiAhZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19NSU5PUl9fIDw9IDUKLSNkZWZpbmUgX19QUkVUVFlfRlVOQ1RJT05fXyAgKChjaGFyKikgTlVMTCkKLSNlbmRpZgotCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKSBsZF9hYm9ydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkLnRleGluZm8gYi9sZC9sZC50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk0MzcwLi4wMDAwMDAwCi0tLSBhL2xkL2xkLnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw0MzY2ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvCi1Ac2V0ZmlsZW5hbWUgbGQuaW5mbwotQHN5bmNvZGVpbmRleCBreSBjcAotQGluY2x1ZGUgY29uZmlnZG9jLnRleGkKLUBjIChjb25maWdkb2MudGV4aSBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1ha2VmaWxlKQotQGluY2x1ZGUgbGR2ZXIudGV4aQotCi1AYyBAc21hbGxib29rCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIExkOiAobGQpLiAgICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBsaW5rZXIuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBAc2N7Z251fSBsaW5rZXIgTEQgdmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCi0KLUNvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotQGVuZCBpZmluZm8KLUBpZnRleAotQGZpbmFsb3V0Ci1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1Ac2V0dGl0bGUgVXNpbmcgTEQsIHRoZSBHTlUgbGlua2VyCi1AdGl0bGVwYWdlCi1AdGl0bGUgVXNpbmcgbGQKLUBzdWJ0aXRsZSBUaGUgR05VIGxpbmtlcgotQHNwIDEKLUBzdWJ0aXRsZSBAY29kZXtsZH0gdmVyc2lvbiAyCi1Ac3VidGl0bGUgVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0KLUBhdXRob3IgU3RldmUgQ2hhbWJlcmxhaW4KLUBhdXRob3IgSWFuIExhbmNlIFRheWxvcgotQGF1dGhvciBDeWdudXMgU29sdXRpb25zCi1AcGFnZQotCi1AdGV4Ci17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFNvbHV0aW9uc1xwYXIKLVxoZmlsbCBpYW5cQGN5Z251cy5jb20sIGRvY1xAY3lnbnVzLmNvbVxwYXIKLVxoZmlsbCB7XGl0IFVzaW5nIExELCB0aGUgR05VIGxpbmtlcn1ccGFyCi1caGZpbGwgRWRpdGVkIGJ5IEplZmZyZXkgT3NpZXIgKGplZmZyZXlcQGN5Z251cy5jb20pXHBhcgotfQotXGdsb2JhbFxwYXJpbmRlbnQ9MHB0ICUgU3RldmUgbGlrZXMgaXQgdGhpcyB3YXkuCi1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi1AZW5kIGlmdGV4Ci1AYyBGSVhNRTogVGFsayBhYm91dCBpbXBvcnRhbmNlIG9mICpvcmRlciogb2YgYXJncywgY21kcyB0byBsaW5rZXIhCi0KLUBpZmluZm8KLUBub2RlIFRvcAotQHRvcCBVc2luZyBsZAotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgQHNje2dudX0gbGlua2VyIGxkIHZlcnNpb24gQHZhbHVle1ZFUlNJT059LgotCi1AbWVudQotKiBPdmVydmlldzo6ICAgICAgICAgICAgICAgICAgICBPdmVydmlldwotKiBJbnZvY2F0aW9uOjogICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uCi0qIFNjcmlwdHM6OiAgICAgICAgICAgICAgICAgICAgIExpbmtlciBTY3JpcHRzCi1AaWZzZXQgR0VORVJJQwotKiBNYWNoaW5lIERlcGVuZGVudDo6ICAgICAgICAgICBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4MzAwCi0qIEg4LzMwMDo6ICAgICAgICAgICAgICAgICAgICAgIGxkIGFuZCB0aGUgSDgvMzAwCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSGl0YWNoaQotKiBIaXRhY2hpOjogICAgICAgICAgICAgICAgICAgICBsZCBhbmQgb3RoZXIgSGl0YWNoaSBtaWNyb3MKLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi0qIGk5NjA6OiAgICAgICAgICAgICAgICAgICAgICAgIGxkIGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLSogQkZEOjogICAgICAgICAgICAgICAgICAgICAgICAgQkZECi1AZW5kIGlmY2xlYXIKLUBjIEZvbGxvd2luZyBibGFuayBsaW5lIHJlcXVpcmVkIGZvciByZW1haW5pbmcgYnVnIGluIG1ha2VpbmZvIGNvbmRzL21lbnVzCi0KLSogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKLSogTVJJOjogICAgICAgICAgICAgICAgICAgICAgICAgTVJJIENvbXBhdGlibGUgU2NyaXB0IEZpbGVzCi0qIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ci1AZW5kIG1lbnUKLUBlbmQgaWZpbmZvCi0KLUBub2RlIE92ZXJ2aWV3Ci1AY2hhcHRlciBPdmVydmlldwotCi1AY2luZGV4IEBzY3tnbnV9IGxpbmtlcgotQGNpbmRleCB3aGF0IGlzIHRoaXM/Ci1AY29kZXtsZH0gY29tYmluZXMgYSBudW1iZXIgb2Ygb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLCByZWxvY2F0ZXMKLXRoZWlyIGRhdGEgYW5kIHRpZXMgdXAgc3ltYm9sIHJlZmVyZW5jZXMuIFVzdWFsbHkgdGhlIGxhc3Qgc3RlcCBpbgotY29tcGlsaW5nIGEgcHJvZ3JhbSBpcyB0byBydW4gQGNvZGV7bGR9LgotCi1AY29kZXtsZH0gYWNjZXB0cyBMaW5rZXIgQ29tbWFuZCBMYW5ndWFnZSBmaWxlcyB3cml0dGVuIGluCi1hIHN1cGVyc2V0IG9mIEFUJlQncyBMaW5rIEVkaXRvciBDb21tYW5kIExhbmd1YWdlIHN5bnRheCwKLXRvIHByb3ZpZGUgZXhwbGljaXQgYW5kIHRvdGFsIGNvbnRyb2wgb3ZlciB0aGUgbGlua2luZyBwcm9jZXNzLgotCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLVRoaXMgdmVyc2lvbiBvZiBAY29kZXtsZH0gdXNlcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIEJGRCBsaWJyYXJpZXMKLXRvIG9wZXJhdGUgb24gb2JqZWN0IGZpbGVzLiBUaGlzIGFsbG93cyBAY29kZXtsZH0gdG8gcmVhZCwgY29tYmluZSwgYW5kCi13cml0ZSBvYmplY3QgZmlsZXMgaW4gbWFueSBkaWZmZXJlbnQgZm9ybWF0cy0tLWZvciBleGFtcGxlLCBDT0ZGIG9yCi1AY29kZXthLm91dH0uICBEaWZmZXJlbnQgZm9ybWF0cyBtYXkgYmUgbGlua2VkIHRvZ2V0aGVyIHRvIHByb2R1Y2UgYW55Ci1hdmFpbGFibGUga2luZCBvZiBvYmplY3QgZmlsZS4gIEB4cmVme0JGRH0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotQGVuZCBpZmNsZWFyCi0KLUFzaWRlIGZyb20gaXRzIGZsZXhpYmlsaXR5LCB0aGUgQHNje2dudX0gbGlua2VyIGlzIG1vcmUgaGVscGZ1bCB0aGFuIG90aGVyCi1saW5rZXJzIGluIHByb3ZpZGluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiAgTWFueSBsaW5rZXJzIGFiYW5kb24KLWV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvcjsgd2hlbmV2ZXIgcG9zc2libGUsCi1AY29kZXtsZH0gY29udGludWVzIGV4ZWN1dGluZywgYWxsb3dpbmcgeW91IHRvIGlkZW50aWZ5IG90aGVyIGVycm9ycwotKG9yLCBpbiBzb21lIGNhc2VzLCB0byBnZXQgYW4gb3V0cHV0IGZpbGUgaW4gc3BpdGUgb2YgdGhlIGVycm9yKS4KLQotQG5vZGUgSW52b2NhdGlvbgotQGNoYXB0ZXIgSW52b2NhdGlvbgotCi1UaGUgQHNje2dudX0gbGlua2VyIEBjb2Rle2xkfSBpcyBtZWFudCB0byBjb3ZlciBhIGJyb2FkIHJhbmdlIG9mIHNpdHVhdGlvbnMsCi1hbmQgdG8gYmUgYXMgY29tcGF0aWJsZSBhcyBwb3NzaWJsZSB3aXRoIG90aGVyIGxpbmtlcnMuICBBcyBhIHJlc3VsdCwKLXlvdSBoYXZlIG1hbnkgY2hvaWNlcyB0byBjb250cm9sIGl0cyBiZWhhdmlvci4KLQotQGlmc2V0IFVzZXNFbnZWYXJzCi1AbWVudQotKiBPcHRpb25zOjogICAgICAgICAgICAgICAgICAgICBDb21tYW5kIExpbmUgT3B0aW9ucwotKiBFbnZpcm9ubWVudDo6ICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudCBWYXJpYWJsZXMKLUBlbmQgbWVudQotCi1Abm9kZSBPcHRpb25zCi1Ac2VjdGlvbiBDb21tYW5kIExpbmUgT3B0aW9ucwotQGVuZCBpZnNldAotCi1AY2luZGV4IGNvbW1hbmQgbGluZQotQGNpbmRleCBvcHRpb25zCi1UaGUgbGlua2VyIHN1cHBvcnRzIGEgcGxldGhvcmEgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMsIGJ1dCBpbiBhY3R1YWwKLXByYWN0aWNlIGZldyBvZiB0aGVtIGFyZSB1c2VkIGluIGFueSBwYXJ0aWN1bGFyIGNvbnRleHQuCi1AY2luZGV4IHN0YW5kYXJkIFVuaXggc3lzdGVtCi1Gb3IgaW5zdGFuY2UsIGEgZnJlcXVlbnQgdXNlIG9mIEBjb2Rle2xkfSBpcyB0byBsaW5rIHN0YW5kYXJkIFVuaXgKLW9iamVjdCBmaWxlcyBvbiBhIHN0YW5kYXJkLCBzdXBwb3J0ZWQgVW5peCBzeXN0ZW0uICBPbiBzdWNoIGEgc3lzdGVtLCB0bwotbGluayBhIGZpbGUgQGNvZGV7aGVsbG8ub306Ci0KLUBzbWFsbGV4YW1wbGUKLWxkIC1vIEB2YXJ7b3V0cHV0fSAvbGliL2NydDAubyBoZWxsby5vIC1sYwotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyB0ZWxscyBAY29kZXtsZH0gdG8gcHJvZHVjZSBhIGZpbGUgY2FsbGVkIEB2YXJ7b3V0cHV0fSBhcyB0aGUKLXJlc3VsdCBvZiBsaW5raW5nIHRoZSBmaWxlIEBjb2Rley9saWIvY3J0MC5vfSB3aXRoIEBjb2Rle2hlbGxvLm99IGFuZAotdGhlIGxpYnJhcnkgQGNvZGV7bGliYy5hfSwgd2hpY2ggd2lsbCBjb21lIGZyb20gdGhlIHN0YW5kYXJkIHNlYXJjaAotZGlyZWN0b3JpZXMuICAoU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHRoZSBAc2FtcHstbH0gb3B0aW9uIGJlbG93LikKLQotU29tZSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gQGNvZGV7bGR9IG1heSBiZSBzcGVjaWZpZWQgYXQgYW55Ci1wb2ludCBpbiB0aGUgY29tbWFuZCBsaW5lLiAgSG93ZXZlciwgb3B0aW9ucyB3aGljaCByZWZlciB0byBmaWxlcywgc3VjaAotYXMgQHNhbXB7LWx9IG9yIEBzYW1wey1UfSwgY2F1c2UgdGhlIGZpbGUgdG8gYmUgcmVhZCBhdCB0aGUgcG9pbnQgYXQKLXdoaWNoIHRoZSBvcHRpb24gYXBwZWFycyBpbiB0aGUgY29tbWFuZCBsaW5lLCByZWxhdGl2ZSB0byB0aGUgb2JqZWN0Ci1maWxlcyBhbmQgb3RoZXIgZmlsZSBvcHRpb25zLiAgUmVwZWF0aW5nIG5vbi1maWxlIG9wdGlvbnMgd2l0aCBhCi1kaWZmZXJlbnQgYXJndW1lbnQgd2lsbCBlaXRoZXIgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdCwgb3Igb3ZlcnJpZGUgcHJpb3IKLW9jY3VycmVuY2VzICh0aG9zZSBmdXJ0aGVyIHRvIHRoZSBsZWZ0IG9uIHRoZSBjb21tYW5kIGxpbmUpIG9mIHRoYXQKLW9wdGlvbi4gIE9wdGlvbnMgd2hpY2ggbWF5IGJlIG1lYW5pbmdmdWxseSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UgYXJlCi1ub3RlZCBpbiB0aGUgZGVzY3JpcHRpb25zIGJlbG93LgotCi1AY2luZGV4IG9iamVjdCBmaWxlcwotTm9uLW9wdGlvbiBhcmd1bWVudHMgYXJlIG9iamVjdCBmaWxlcyBvciBhcmNoaXZlcyB3aGljaCBhcmUgdG8gYmUgbGlua2VkCi10b2dldGhlci4gIFRoZXkgbWF5IGZvbGxvdywgcHJlY2VkZSwgb3IgYmUgbWl4ZWQgaW4gd2l0aCBjb21tYW5kLWxpbmUKLW9wdGlvbnMsIGV4Y2VwdCB0aGF0IGFuIG9iamVjdCBmaWxlIGFyZ3VtZW50IG1heSBub3QgYmUgcGxhY2VkIGJldHdlZW4KLWFuIG9wdGlvbiBhbmQgaXRzIGFyZ3VtZW50LgotCi1Vc3VhbGx5IHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIGF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSwgYnV0IHlvdSBjYW4KLXNwZWNpZnkgb3RoZXIgZm9ybXMgb2YgYmluYXJ5IGlucHV0IGZpbGVzIHVzaW5nIEBzYW1wey1sfSwgQHNhbXB7LVJ9LAotYW5kIHRoZSBzY3JpcHQgY29tbWFuZCBsYW5ndWFnZS4gIElmIEBlbXBoe25vfSBiaW5hcnkgaW5wdXQgZmlsZXMgYXQgYWxsCi1hcmUgc3BlY2lmaWVkLCB0aGUgbGlua2VyIGRvZXMgbm90IHByb2R1Y2UgYW55IG91dHB1dCwgYW5kIGlzc3VlcyB0aGUKLW1lc3NhZ2UgQHNhbXB7Tm8gaW5wdXQgZmlsZXN9LgotCi1JZiB0aGUgbGlua2VyIGNhbiBub3QgcmVjb2duaXplIHRoZSBmb3JtYXQgb2YgYW4gb2JqZWN0IGZpbGUsIGl0IHdpbGwKLWFzc3VtZSB0aGF0IGl0IGlzIGEgbGlua2VyIHNjcmlwdC4gIEEgc2NyaXB0IHNwZWNpZmllZCBpbiB0aGlzIHdheQotYXVnbWVudHMgdGhlIG1haW4gbGlua2VyIHNjcmlwdCB1c2VkIGZvciB0aGUgbGluayAoZWl0aGVyIHRoZSBkZWZhdWx0Ci1saW5rZXIgc2NyaXB0IG9yIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHVzaW5nIEBzYW1wey1UfSkuICBUaGlzIGZlYXR1cmUKLXBlcm1pdHMgdGhlIGxpbmtlciB0byBsaW5rIGFnYWluc3QgYSBmaWxlIHdoaWNoIGFwcGVhcnMgdG8gYmUgYW4gb2JqZWN0Ci1vciBhbiBhcmNoaXZlLCBidXQgYWN0dWFsbHkgbWVyZWx5IGRlZmluZXMgc29tZSBzeW1ib2wgdmFsdWVzLCBvciB1c2VzCi1AY29kZXtJTlBVVH0gb3IgQGNvZGV7R1JPVVB9IHRvIGxvYWQgb3RoZXIgb2JqZWN0cy4gIE5vdGUgdGhhdAotc3BlY2lmeWluZyBhIHNjcmlwdCBpbiB0aGlzIHdheSBzaG91bGQgb25seSBiZSB1c2VkIHRvIGF1Z21lbnQgdGhlIG1haW4KLWxpbmtlciBzY3JpcHQ7IGlmIHlvdSB3YW50IHRvIHVzZSBzb21lIGNvbW1hbmQgdGhhdCBsb2dpY2FsbHkgY2FuIG9ubHkKLWFwcGVhciBvbmNlLCBzdWNoIGFzIHRoZSBAY29kZXtTRUNUSU9OU30gb3IgQGNvZGV7TUVNT1JZfSBjb21tYW5kLCB5b3UKLW11c3QgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IHVzaW5nIHRoZSBAc2FtcHstVH0gb3B0aW9uLgotQHhyZWZ7U2NyaXB0c30uCi0KLUZvciBvcHRpb25zIHdob3NlIG5hbWVzIGFyZSBhIHNpbmdsZSBsZXR0ZXIsCi1vcHRpb24gYXJndW1lbnRzIG11c3QgZWl0aGVyIGZvbGxvdyB0aGUgb3B0aW9uIGxldHRlciB3aXRob3V0IGludGVydmVuaW5nCi13aGl0ZXNwYWNlLCBvciBiZSBnaXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQotb3B0aW9uIHRoYXQgcmVxdWlyZXMgdGhlbS4KLQotRm9yIG9wdGlvbnMgd2hvc2UgbmFtZXMgYXJlIG11bHRpcGxlIGxldHRlcnMsIGVpdGhlciBvbmUgZGFzaCBvciB0d28gY2FuCi1wcmVjZWRlIHRoZSBvcHRpb24gbmFtZTsgZm9yIGV4YW1wbGUsIEBzYW1wey0tb2Zvcm1hdH0gYW5kCi1Ac2FtcHstLW9mb3JtYXR9IGFyZSBlcXVpdmFsZW50LiAgQXJndW1lbnRzIHRvIG11bHRpcGxlLWxldHRlciBvcHRpb25zCi1tdXN0IGVpdGhlciBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgb3B0aW9uIG5hbWUgYnkgYW4gZXF1YWxzIHNpZ24sIG9yIGJlCi1naXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBvcHRpb24gdGhhdAotcmVxdWlyZXMgdGhlbS4gIEZvciBleGFtcGxlLCBAc2FtcHstLW9mb3JtYXQgc3JlY30gYW5kCi1Ac2FtcHstLW9mb3JtYXQ9c3JlY30gYXJlIGVxdWl2YWxlbnQuICBVbmlxdWUgYWJicmV2aWF0aW9ucyBvZiB0aGUgbmFtZXMKLW9mIG11bHRpcGxlLWxldHRlciBvcHRpb25zIGFyZSBhY2NlcHRlZC4KLQotQHRhYmxlIEBjb2RlCi1Aa2luZGV4IC1hQHZhcntrZXl3b3JkfQotQGl0ZW0gLWFAdmFye2tleXdvcmR9Ci1UaGlzIG9wdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkuICBUaGUgQHZhcntrZXl3b3JkfQotYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHN0cmluZ3MgQHNhbXB7YXJjaGl2ZX0sIEBzYW1we3NoYXJlZH0sIG9yCi1Ac2FtcHtkZWZhdWx0fS4gIEBzYW1wey1hYXJjaGl2ZX0gaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8KLUBzYW1wey1Cc3RhdGljfSwgYW5kIHRoZSBvdGhlciB0d28ga2V5d29yZHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50Ci10byBAc2FtcHstQmR5bmFtaWN9LiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgYW55IG51bWJlciBvZiB0aW1lcy4KLQotQGlmc2V0IEk5NjAKLUBjaW5kZXggYXJjaGl0ZWN0dXJlcwotQGtpbmRleCAtQUB2YXJ7YXJjaH0KLUBpdGVtIC1BQHZhcnthcmNoaXRlY3R1cmV9Ci1Aa2luZGV4IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7YXJjaH0KLUBpdGVteCAtLWFyY2hpdGVjdHVyZT1AdmFye2FyY2hpdGVjdHVyZX0KLUluIHRoZSBjdXJyZW50IHJlbGVhc2Ugb2YgQGNvZGV7bGR9LCB0aGlzIG9wdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgdGhlCi1JbnRlbCA5NjAgZmFtaWx5IG9mIGFyY2hpdGVjdHVyZXMuICBJbiB0aGF0IEBjb2Rle2xkfSBjb25maWd1cmF0aW9uLCB0aGUKLUB2YXJ7YXJjaGl0ZWN0dXJlfSBhcmd1bWVudCBpZGVudGlmaWVzIHRoZSBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZSBpbgotdGhlIDk2MCBmYW1pbHksIGVuYWJsaW5nIHNvbWUgc2FmZWd1YXJkcyBhbmQgbW9kaWZ5aW5nIHRoZQotYXJjaGl2ZS1saWJyYXJ5IHNlYXJjaCBwYXRoLiAgQHhyZWZ7aTk2MCwsQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwCi1mYW1pbHl9LCBmb3IgZGV0YWlscy4KLQotRnV0dXJlIHJlbGVhc2VzIG9mIEBjb2Rle2xkfSBtYXkgc3VwcG9ydCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgZm9yCi1vdGhlciBhcmNoaXRlY3R1cmUgZmFtaWxpZXMuCi1AZW5kIGlmc2V0Ci0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQGNpbmRleCBiaW5hcnkgaW5wdXQgZm9ybWF0Ci1Aa2luZGV4IC1iIEB2YXJ7Zm9ybWF0fQotQGtpbmRleCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0KLUBjaW5kZXggaW5wdXQgZm9ybWF0Ci1AY2luZGV4IGlucHV0IGZvcm1hdAotQGl0ZW0gLWIgQHZhcntpbnB1dC1mb3JtYXR9Ci1AaXRlbXggLS1mb3JtYXQ9QHZhcntpbnB1dC1mb3JtYXR9Ci1AY29kZXtsZH0gbWF5IGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGtpbmQgb2Ygb2JqZWN0Ci1maWxlLiAgSWYgeW91ciBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0aGlzIHdheSwgeW91IGNhbiB1c2UgdGhlCi1Ac2FtcHstYn0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIGlucHV0IG9iamVjdCBmaWxlcwotdGhhdCBmb2xsb3cgdGhpcyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIEV2ZW4gd2hlbiBAY29kZXtsZH0gaXMKLWNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBhbHRlcm5hdGl2ZSBvYmplY3QgZm9ybWF0cywgeW91IGRvbid0IHVzdWFsbHkgbmVlZAotdG8gc3BlY2lmeSB0aGlzLCBhcyBAY29kZXtsZH0gc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gZXhwZWN0IGFzIGEKLWRlZmF1bHQgaW5wdXQgZm9ybWF0IHRoZSBtb3N0IHVzdWFsIGZvcm1hdCBvbiBlYWNoIG1hY2hpbmUuCi1AdmFye2lucHV0LWZvcm1hdH0gaXMgYSB0ZXh0IHN0cmluZywgdGhlIG5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdAotc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgKFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlIGJpbmFyeQotZm9ybWF0cyB3aXRoIEBzYW1we29iamR1bXAgLWl9LikKLUB4cmVme0JGRH0uCi0KLVlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSBsaW5raW5nIGZpbGVzIHdpdGggYW4gdW51c3VhbAotYmluYXJ5IGZvcm1hdC4gIFlvdSBjYW4gYWxzbyB1c2UgQHNhbXB7LWJ9IHRvIHN3aXRjaCBmb3JtYXRzIGV4cGxpY2l0bHkgKHdoZW4KLWxpbmtpbmcgb2JqZWN0IGZpbGVzIG9mIGRpZmZlcmVudCBmb3JtYXRzKSwgYnkgaW5jbHVkaW5nCi1Ac2FtcHstYiBAdmFye2lucHV0LWZvcm1hdH19IGJlZm9yZSBlYWNoIGdyb3VwIG9mIG9iamVjdCBmaWxlcyBpbiBhCi1wYXJ0aWN1bGFyIGZvcm1hdC4gIAotCi1UaGUgZGVmYXVsdCBmb3JtYXQgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0dOVVRBUkdFVH0uCi1AaWZzZXQgVXNlc0VudlZhcnMKLUB4cmVme0Vudmlyb25tZW50fS4KLUBlbmQgaWZzZXQKLVlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGlucHV0IGZvcm1hdCBmcm9tIGEgc2NyaXB0LCB1c2luZyB0aGUgY29tbWFuZAotQGNvZGV7VEFSR0VUfTsgc2VlIEByZWZ7Rm9ybWF0IENvbW1hbmRzfS4KLUBlbmQgaWZjbGVhcgotCi1Aa2luZGV4IC1jIEB2YXJ7TVJJLWNtZGZpbGV9Ci1Aa2luZGV4IC0tbXJpLXNjcmlwdD1AdmFye01SSS1jbWRmaWxlfQotQGNpbmRleCBjb21wYXRpYmlsaXR5LCBNUkkKLUBpdGVtIC1jIEB2YXJ7TVJJLWNvbW1hbmRmaWxlfQotQGl0ZW14IC0tbXJpLXNjcmlwdD1AdmFye01SSS1jb21tYW5kZmlsZX0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggbGlua2VycyBwcm9kdWNlZCBieSBNUkksIEBjb2Rle2xkfSBhY2NlcHRzIHNjcmlwdAotZmlsZXMgd3JpdHRlbiBpbiBhbiBhbHRlcm5hdGUsIHJlc3RyaWN0ZWQgY29tbWFuZCBsYW5ndWFnZSwgZGVzY3JpYmVkIGluCi1AcmVme01SSSwsTVJJIENvbXBhdGlibGUgU2NyaXB0IEZpbGVzfS4gIEludHJvZHVjZSBNUkkgc2NyaXB0IGZpbGVzIHdpdGgKLXRoZSBvcHRpb24gQHNhbXB7LWN9OyB1c2UgdGhlIEBzYW1wey1UfSBvcHRpb24gdG8gcnVuIGxpbmtlcgotc2NyaXB0cyB3cml0dGVuIGluIHRoZSBnZW5lcmFsLXB1cnBvc2UgQGNvZGV7bGR9IHNjcmlwdGluZyBsYW5ndWFnZS4KLUlmIEB2YXJ7TVJJLWNtZGZpbGV9IGRvZXMgbm90IGV4aXN0LCBAY29kZXtsZH0gbG9va3MgZm9yIGl0IGluIHRoZSBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGJ5IGFueSBAc2FtcHstTH0gb3B0aW9ucy4KLQotQGNpbmRleCBjb21tb24gYWxsb2NhdGlvbgotQGtpbmRleCAtZAotQGtpbmRleCAtZGMKLUBraW5kZXggLWRwCi1AaXRlbSAtZCAKLUBpdGVteCAtZGMKLUBpdGVteCAtZHAKLVRoZXNlIHRocmVlIG9wdGlvbnMgYXJlIGVxdWl2YWxlbnQ7IG11bHRpcGxlIGZvcm1zIGFyZSBzdXBwb3J0ZWQgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4gIFRoZXkgYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzCi1ldmVuIGlmIGEgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkICh3aXRoIEBzYW1wey1yfSkuICBUaGUKLXNjcmlwdCBjb21tYW5kIEBjb2Rle0ZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OfSBoYXMgdGhlIHNhbWUgZWZmZWN0LgotQHhyZWZ7TWlzY2VsbGFuZW91cyBDb21tYW5kc30uCi0KLUBjaW5kZXggZW50cnkgcG9pbnQsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC1lIEB2YXJ7ZW50cnl9Ci1Aa2luZGV4IC0tZW50cnk9QHZhcntlbnRyeX0KLUBpdGVtIC1lIEB2YXJ7ZW50cnl9IAotQGl0ZW14IC0tZW50cnk9QHZhcntlbnRyeX0KLVVzZSBAdmFye2VudHJ5fSBhcyB0aGUgZXhwbGljaXQgc3ltYm9sIGZvciBiZWdpbm5pbmcgZXhlY3V0aW9uIG9mIHlvdXIKLXByb2dyYW0sIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGVudHJ5IHBvaW50LiAgSWYgdGhlcmUgaXMgbm8gc3ltYm9sCi1uYW1lZCBAdmFye2VudHJ5fSwgdGhlIGxpbmtlciB3aWxsIHRyeSB0byBwYXJzZSBAdmFye2VudHJ5fSBhcyBhIG51bWJlciwKLWFuZCB1c2UgdGhhdCBhcyB0aGUgZW50cnkgYWRkcmVzcyAodGhlIG51bWJlciB3aWxsIGJlIGludGVycHJldGVkIGluCi1iYXNlIDEwOyB5b3UgbWF5IHVzZSBhIGxlYWRpbmcgQHNhbXB7MHh9IGZvciBiYXNlIDE2LCBvciBhIGxlYWRpbmcKLUBzYW1wezB9IGZvciBiYXNlIDgpLiAgQHhyZWZ7RW50cnkgUG9pbnR9LCBmb3IgYSBkaXNjdXNzaW9uIG9mIGRlZmF1bHRzCi1hbmQgb3RoZXIgd2F5cyBvZiBzcGVjaWZ5aW5nIHRoZSBlbnRyeSBwb2ludC4KLQotQGNpbmRleCBkeW5hbWljIHN5bWJvbCB0YWJsZQotQGtpbmRleCAtRQotQGtpbmRleCAtLWV4cG9ydC1keW5hbWljCi1AaXRlbSAtRQotQGl0ZW14IC0tZXhwb3J0LWR5bmFtaWMKLVdoZW4gY3JlYXRpbmcgYSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSwgYWRkIGFsbCBzeW1ib2xzIHRvIHRoZQotZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaXMgdGhlIHNldCBvZiBzeW1ib2xzCi13aGljaCBhcmUgdmlzaWJsZSBmcm9tIGR5bmFtaWMgb2JqZWN0cyBhdCBydW4gdGltZS4KLQotSWYgeW91IGRvIG5vdCB1c2UgdGhpcyBvcHRpb24sIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aWxsIG5vcm1hbGx5Ci1jb250YWluIG9ubHkgdGhvc2Ugc3ltYm9scyB3aGljaCBhcmUgcmVmZXJlbmNlZCBieSBzb21lIGR5bmFtaWMgb2JqZWN0Ci1tZW50aW9uZWQgaW4gdGhlIGxpbmsuCi0KLUlmIHlvdSB1c2UgQGNvZGV7ZGxvcGVufSB0byBsb2FkIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggbmVlZHMgdG8gcmVmZXIKLWJhY2sgdG8gdGhlIHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgcHJvZ3JhbSwgcmF0aGVyIHRoYW4gc29tZSBvdGhlcgotZHluYW1pYyBvYmplY3QsIHRoZW4geW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byB1c2UgdGhpcyBvcHRpb24gd2hlbgotbGlua2luZyB0aGUgcHJvZ3JhbSBpdHNlbGYuCi0KLUBjaW5kZXggYmlnLWVuZGlhbiBvYmplY3RzCi1AY2luZGV4IGVuZGlhbm5lc3MKLUBraW5kZXggLUVCCi1AaXRlbSAtRUIKLUxpbmsgYmlnLWVuZGlhbiBvYmplY3RzLiAgVGhpcyBhZmZlY3RzIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQuCi0KLUBjaW5kZXggbGl0dGxlLWVuZGlhbiBvYmplY3RzCi1Aa2luZGV4IC1FTAotQGl0ZW0gLUVMCi1MaW5rIGxpdHRsZS1lbmRpYW4gb2JqZWN0cy4gIFRoaXMgYWZmZWN0cyB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0LgotCi1Aa2luZGV4IC1mCi1Aa2luZGV4IC0tYXV4aWxpYXJ5Ci1AaXRlbSAtZgotQGl0ZW14IC0tYXV4aWxpYXJ5IEB2YXJ7bmFtZX0KLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfQVVYSUxJQVJZIGZpZWxkCi10byB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wKLXRhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGF1eGlsaWFyeSBmaWx0ZXIgb24gdGhlCi1zeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4KLQotSWYgeW91IGxhdGVyIGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgdGhpcyBmaWx0ZXIgb2JqZWN0LCB0aGVuLCB3aGVuIHlvdQotcnVuIHRoZSBwcm9ncmFtLCB0aGUgZHluYW1pYyBsaW5rZXIgd2lsbCBzZWUgdGhlIERUX0FVWElMSUFSWSBmaWVsZC4gIElmCi10aGUgZHluYW1pYyBsaW5rZXIgcmVzb2x2ZXMgYW55IHN5bWJvbHMgZnJvbSB0aGUgZmlsdGVyIG9iamVjdCwgaXQgd2lsbAotZmlyc3QgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGRlZmluaXRpb24gaW4gdGhlIHNoYXJlZCBvYmplY3QKLUB2YXJ7bmFtZX0uICBJZiB0aGVyZSBpcyBvbmUsIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZpbml0aW9uCi1pbiB0aGUgZmlsdGVyIG9iamVjdC4gIFRoZSBzaGFyZWQgb2JqZWN0IEB2YXJ7bmFtZX0gbmVlZCBub3QgZXhpc3QuCi1UaHVzIHRoZSBzaGFyZWQgb2JqZWN0IEB2YXJ7bmFtZX0gbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZQotaW1wbGVtZW50YXRpb24gb2YgY2VydGFpbiBmdW5jdGlvbnMsIHBlcmhhcHMgZm9yIGRlYnVnZ2luZyBvciBmb3IKLW1hY2hpbmUgc3BlY2lmaWMgcGVyZm9ybWFuY2UuCi0KLVRoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuICBUaGUgRFRfQVVYSUxJQVJZIGVudHJpZXMKLXdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotQGtpbmRleCAtRgotQGtpbmRleCAtLWZpbHRlcgotQGl0ZW0gLUYgQHZhcntuYW1lfQotQGl0ZW14IC0tZmlsdGVyIEB2YXJ7bmFtZX0KLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfRklMVEVSIGZpZWxkIHRvCi10aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wgdGFibGUKLW9mIHRoZSBzaGFyZWQgb2JqZWN0IHdoaWNoIGlzIGJlaW5nIGNyZWF0ZWQgc2hvdWxkIGJlIHVzZWQgYXMgYSBmaWx0ZXIKLW9uIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4KLQotSWYgeW91IGxhdGVyIGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgdGhpcyBmaWx0ZXIgb2JqZWN0LCB0aGVuLCB3aGVuIHlvdQotcnVuIHRoZSBwcm9ncmFtLCB0aGUgZHluYW1pYyBsaW5rZXIgd2lsbCBzZWUgdGhlIERUX0ZJTFRFUiBmaWVsZC4gIFRoZQotZHluYW1pYyBsaW5rZXIgd2lsbCByZXNvbHZlIHN5bWJvbHMgYWNjb3JkaW5nIHRvIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlCi1maWx0ZXIgb2JqZWN0IGFzIHVzdWFsLCBidXQgaXQgd2lsbCBhY3R1YWxseSBsaW5rIHRvIHRoZSBkZWZpbml0aW9ucwotZm91bmQgaW4gdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4gIFRodXMgdGhlIGZpbHRlciBvYmplY3QgY2FuIGJlCi11c2VkIHRvIHNlbGVjdCBhIHN1YnNldCBvZiB0aGUgc3ltYm9scyBwcm92aWRlZCBieSB0aGUgb2JqZWN0Ci1AdmFye25hbWV9LgotCi1Tb21lIG9sZGVyIGxpbmtlcnMgdXNlZCB0aGUgQGNvZGV7LUZ9IG9wdGlvbiB0aHJvdWdob3V0IGEgY29tcGlsYXRpb24KLXRvb2xjaGFpbiBmb3Igc3BlY2lmeWluZyBvYmplY3QtZmlsZSBmb3JtYXQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dAotb2JqZWN0IGZpbGVzLiAgVGhlIEBzY3tnbnV9IGxpbmtlciB1c2VzIG90aGVyIG1lY2hhbmlzbXMgZm9yIHRoaXMKLXB1cnBvc2U6IHRoZSBAY29kZXstYn0sIEBjb2Rley0tZm9ybWF0fSwgQGNvZGV7LS1vZm9ybWF0fSBvcHRpb25zLCB0aGUKLUBjb2Rle1RBUkdFVH0gY29tbWFuZCBpbiBsaW5rZXIgc2NyaXB0cywgYW5kIHRoZSBAY29kZXtHTlVUQVJHRVR9Ci1lbnZpcm9ubWVudCB2YXJpYWJsZS4gIFRoZSBAc2N7Z251fSBsaW5rZXIgd2lsbCBpZ25vcmUgdGhlIEBjb2Rley1GfQotb3B0aW9uIHdoZW4gbm90IGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LgotCi1AY2luZGV4IGZpbmFsaXphdGlvbiBmdW5jdGlvbgotQGtpbmRleCAtZmluaQotQGl0ZW0gLWZpbmkgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0LCBjYWxsIE5BTUUgd2hlbiB0aGUKLWV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcyB1bmxvYWRlZCwgYnkgc2V0dGluZyBEVF9GSU5JIHRvIHRoZQotYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uICBCeSBkZWZhdWx0LCB0aGUgbGlua2VyIHVzZXMgQGNvZGV7X2Zpbml9IGFzCi10aGUgZnVuY3Rpb24gdG8gY2FsbC4KLQotQGtpbmRleCAtZwotQGl0ZW0gLWcKLUlnbm9yZWQuICBQcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgotCi1Aa2luZGV4IC1HCi1Aa2luZGV4IC0tZ3BzaXplCi1AY2luZGV4IG9iamVjdCBzaXplCi1AaXRlbSAtR0B2YXJ7dmFsdWV9Ci1AaXRlbXggLS1ncHNpemU9QHZhcnt2YWx1ZX0KLVNldCB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUCByZWdpc3RlciB0bwotQHZhcntzaXplfS4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIHN1Y2ggYXMKLU1JUFMgRUNPRkYgd2hpY2ggc3VwcG9ydHMgcHV0dGluZyBsYXJnZSBhbmQgc21hbGwgb2JqZWN0cyBpbnRvIGRpZmZlcmVudAotc2VjdGlvbnMuICBUaGlzIGlzIGlnbm9yZWQgZm9yIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUBjaW5kZXggcnVudGltZSBsaWJyYXJ5IG5hbWUKLUBraW5kZXggLWhAdmFye25hbWV9Ci1Aa2luZGV4IC1zb25hbWU9QHZhcntuYW1lfQotQGl0ZW0gLWhAdmFye25hbWV9Ci1AaXRlbXggLXNvbmFtZT1AdmFye25hbWV9Ci1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX1NPTkFNRSBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgV2hlbiBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIGEgc2hhcmVkIG9iamVjdAotd2hpY2ggaGFzIGEgRFRfU09OQU1FIGZpZWxkLCB0aGVuIHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgcnVuIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHNoYXJlZCBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBEVF9TT05BTUUKLWZpZWxkIHJhdGhlciB0aGFuIHRoZSB1c2luZyB0aGUgZmlsZSBuYW1lIGdpdmVuIHRvIHRoZSBsaW5rZXIuCi0KLUBraW5kZXggLWkKLUBjaW5kZXggaW5jcmVtZW50YWwgbGluawotQGl0ZW0gLWkKLVBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbGluayAoc2FtZSBhcyBvcHRpb24gQHNhbXB7LXJ9KS4KLQotQGNpbmRleCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotQGtpbmRleCAtaW5pdAotQGl0ZW0gLWluaXQgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0LCBjYWxsIE5BTUUgd2hlbiB0aGUKLWV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcyBsb2FkZWQsIGJ5IHNldHRpbmcgRFRfSU5JVCB0byB0aGUgYWRkcmVzcwotb2YgdGhlIGZ1bmN0aW9uLiAgQnkgZGVmYXVsdCwgdGhlIGxpbmtlciB1c2VzIEBjb2Rle19pbml0fSBhcyB0aGUKLWZ1bmN0aW9uIHRvIGNhbGwuCi0KLUBjaW5kZXggYXJjaGl2ZSBmaWxlcywgZnJvbSBjbWQgbGluZQotQGtpbmRleCAtbEB2YXJ7YXJjaGl2ZX0KLUBraW5kZXggLS1saWJyYXJ5PUB2YXJ7YXJjaGl2ZX0KLUBpdGVtIC1sQHZhcnthcmNoaXZlfQotQGl0ZW14IC0tbGlicmFyeT1AdmFye2FyY2hpdmV9Ci1BZGQgYXJjaGl2ZSBmaWxlIEB2YXJ7YXJjaGl2ZX0gdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gbGluay4gIFRoaXMKLW9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgQGNvZGV7bGR9IHdpbGwgc2VhcmNoIGl0cwotcGF0aC1saXN0IGZvciBvY2N1cnJlbmNlcyBvZiBAY29kZXtsaWJAdmFye2FyY2hpdmV9LmF9IGZvciBldmVyeQotQHZhcnthcmNoaXZlfSBzcGVjaWZpZWQuCi0KLU9uIHN5c3RlbXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLCBAY29kZXtsZH0gbWF5IGFsc28gc2VhcmNoIGZvcgotbGlicmFyaWVzIHdpdGggZXh0ZW5zaW9ucyBvdGhlciB0aGFuIEBjb2Rley5hfS4gIFNwZWNpZmljYWxseSwgb24gRUxGCi1hbmQgU3VuT1Mgc3lzdGVtcywgQGNvZGV7bGR9IHdpbGwgc2VhcmNoIGEgZGlyZWN0b3J5IGZvciBhIGxpYnJhcnkgd2l0aAotYW4gZXh0ZW5zaW9uIG9mIEBjb2Rley5zb30gYmVmb3JlIHNlYXJjaGluZyBmb3Igb25lIHdpdGggYW4gZXh0ZW5zaW9uIG9mCi1AY29kZXsuYX0uICBCeSBjb252ZW50aW9uLCBhIEBjb2Rley5zb30gZXh0ZW5zaW9uIGluZGljYXRlcyBhIHNoYXJlZAotbGlicmFyeS4KLQotVGhlIGxpbmtlciB3aWxsIHNlYXJjaCBhbiBhcmNoaXZlIG9ubHkgb25jZSwgYXQgdGhlIGxvY2F0aW9uIHdoZXJlIGl0IGlzCi1zcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIHRoZSBhcmNoaXZlIGRlZmluZXMgYSBzeW1ib2wgd2hpY2gKLXdhcyB1bmRlZmluZWQgaW4gc29tZSBvYmplY3Qgd2hpY2ggYXBwZWFyZWQgYmVmb3JlIHRoZSBhcmNoaXZlIG9uIHRoZQotY29tbWFuZCBsaW5lLCB0aGUgbGlua2VyIHdpbGwgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgZmlsZShzKSBmcm9tIHRoZQotYXJjaGl2ZS4gIEhvd2V2ZXIsIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYW4gb2JqZWN0IGFwcGVhcmluZyBsYXRlciBvbgotdGhlIGNvbW1hbmQgbGluZSB3aWxsIG5vdCBjYXVzZSB0aGUgbGlua2VyIHRvIHNlYXJjaCB0aGUgYXJjaGl2ZSBhZ2Fpbi4KLQotU2VlIHRoZSBAY29kZXstKH0gb3B0aW9uIGZvciBhIHdheSB0byBmb3JjZSB0aGUgbGlua2VyIHRvIHNlYXJjaAotYXJjaGl2ZXMgbXVsdGlwbGUgdGltZXMuCi0KLVlvdSBtYXkgbGlzdCB0aGUgc2FtZSBhcmNoaXZlIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBpZnNldCBHRU5FUklDCi1UaGlzIHR5cGUgb2YgYXJjaGl2ZSBzZWFyY2hpbmcgaXMgc3RhbmRhcmQgZm9yIFVuaXggbGlua2Vycy4gIEhvd2V2ZXIsCi1pZiB5b3UgYXJlIHVzaW5nIEBjb2Rle2xkfSBvbiBBSVgsIG5vdGUgdGhhdCBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKLWJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBzZWFyY2ggZGlyZWN0b3J5LCBmcm9tIGNtZCBsaW5lCi1Aa2luZGV4IC1MQHZhcntkaXJ9Ci1Aa2luZGV4IC0tbGlicmFyeS1wYXRoPUB2YXJ7ZGlyfQotQGl0ZW0gLUxAdmFye3NlYXJjaGRpcn0gCi1AaXRlbXggLS1saWJyYXJ5LXBhdGg9QHZhcntzZWFyY2hkaXJ9Ci1BZGQgcGF0aCBAdmFye3NlYXJjaGRpcn0gdG8gdGhlIGxpc3Qgb2YgcGF0aHMgdGhhdCBAY29kZXtsZH0gd2lsbCBzZWFyY2gKLWZvciBhcmNoaXZlIGxpYnJhcmllcyBhbmQgQGNvZGV7bGR9IGNvbnRyb2wgc2NyaXB0cy4gIFlvdSBtYXkgdXNlIHRoaXMKLW9wdGlvbiBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgVGhlIGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCBpbiB0aGUgb3JkZXIKLWluIHdoaWNoIHRoZXkgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRGlyZWN0b3JpZXMgc3BlY2lmaWVkCi1vbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBzZWFyY2hlZCBiZWZvcmUgdGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMuICBBbGwKLUBjb2Rley1MfSBvcHRpb25zIGFwcGx5IHRvIGFsbCBAY29kZXstbH0gb3B0aW9ucywgcmVnYXJkbGVzcyBvZiB0aGUKLW9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zIGFwcGVhci4KLQotQGlmc2V0IFVzZXNFbnZWYXJzCi1UaGUgZGVmYXVsdCBzZXQgb2YgcGF0aHMgc2VhcmNoZWQgKHdpdGhvdXQgYmVpbmcgc3BlY2lmaWVkIHdpdGgKLUBzYW1wey1MfSkgZGVwZW5kcyBvbiB3aGljaCBlbXVsYXRpb24gbW9kZSBAY29kZXtsZH0gaXMgdXNpbmcsIGFuZCBpbgotc29tZSBjYXNlcyBhbHNvIG9uIGhvdyBpdCB3YXMgY29uZmlndXJlZC4gIEB4cmVme0Vudmlyb25tZW50fS4KLUBlbmQgaWZzZXQKLQotVGhlIHBhdGhzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiBhIGxpbmsgc2NyaXB0IHdpdGggdGhlCi1AY29kZXtTRUFSQ0hfRElSfSBjb21tYW5kLiAgRGlyZWN0b3JpZXMgc3BlY2lmaWVkIHRoaXMgd2F5IGFyZSBzZWFyY2hlZAotYXQgdGhlIHBvaW50IGluIHdoaWNoIHRoZSBsaW5rZXIgc2NyaXB0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KLQotQGNpbmRleCBlbXVsYXRpb24KLUBraW5kZXggLW0gQHZhcntlbXVsYXRpb259Ci1AaXRlbSAtbUB2YXJ7ZW11bGF0aW9ufQotRW11bGF0ZSB0aGUgQHZhcntlbXVsYXRpb259IGxpbmtlci4gIFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlCi1lbXVsYXRpb25zIHdpdGggdGhlIEBzYW1wey0tdmVyYm9zZX0gb3IgQHNhbXB7LVZ9IG9wdGlvbnMuCi0KLUlmIHRoZSBAc2FtcHstbX0gb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGUgZW11bGF0aW9uIGlzIHRha2VuIGZyb20gdGhlCi1AY29kZXtMREVNVUxBVElPTn0gZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHRoYXQgaXMgZGVmaW5lZC4KLQotT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBlbXVsYXRpb24gZGVwZW5kcyB1cG9uIGhvdyB0aGUgbGlua2VyIHdhcwotY29uZmlndXJlZC4KLQotQGNpbmRleCBsaW5rIG1hcAotQGtpbmRleCAtTQotQGtpbmRleCAtLXByaW50LW1hcAotQGl0ZW0gLU0KLUBpdGVteCAtLXByaW50LW1hcAotUHJpbnQgYSBsaW5rIG1hcCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgQSBsaW5rIG1hcCBwcm92aWRlcwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmssIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotV2hlcmUgb2JqZWN0IGZpbGVzIGFuZCBzeW1ib2xzIGFyZSBtYXBwZWQgaW50byBtZW1vcnkuCi1AaXRlbQotSG93IGNvbW1vbiBzeW1ib2xzIGFyZSBhbGxvY2F0ZWQuCi1AaXRlbQotQWxsIGFyY2hpdmUgbWVtYmVycyBpbmNsdWRlZCBpbiB0aGUgbGluaywgd2l0aCBhIG1lbnRpb24gb2YgdGhlIHN5bWJvbAotd2hpY2ggY2F1c2VkIHRoZSBhcmNoaXZlIG1lbWJlciB0byBiZSBicm91Z2h0IGluLgotQGVuZCBpdGVtaXplCi0KLUBraW5kZXggLW4KLUBjaW5kZXggcmVhZC1vbmx5IHRleHQKLUBjaW5kZXggTk1BR0lDCi1Aa2luZGV4IC0tbm1hZ2ljCi1AaXRlbSAtbgotQGl0ZW14IC0tbm1hZ2ljCi1TZXQgdGhlIHRleHQgc2VnbWVudCB0byBiZSByZWFkIG9ubHksIGFuZCBtYXJrIHRoZSBvdXRwdXQgYXMKLUBjb2Rle05NQUdJQ30gaWYgcG9zc2libGUuCi0KLUBraW5kZXggLU4KLUBraW5kZXggLS1vbWFnaWMKLUBjaW5kZXggcmVhZC93cml0ZSBmcm9tIGNtZCBsaW5lCi1AY2luZGV4IE9NQUdJQwotQGl0ZW0gLU4gCi1AaXRlbXggLS1vbWFnaWMKLVNldCB0aGUgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucyB0byBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuICBBbHNvLCBkbwotbm90IHBhZ2UtYWxpZ24gdGhlIGRhdGEgc2VnbWVudC4gIElmIHRoZSBvdXRwdXQgZm9ybWF0IHN1cHBvcnRzIFVuaXgKLXN0eWxlIG1hZ2ljIG51bWJlcnMsIG1hcmsgdGhlIG91dHB1dCBhcyBAY29kZXtPTUFHSUN9LgotCi1Aa2luZGV4IC1vIEB2YXJ7b3V0cHV0fQotQGtpbmRleCAtLW91dHB1dD1AdmFye291dHB1dH0KLUBjaW5kZXggbmFtaW5nIHRoZSBvdXRwdXQgZmlsZQotQGl0ZW0gLW8gQHZhcntvdXRwdXR9Ci1AaXRlbXggLS1vdXRwdXQ9QHZhcntvdXRwdXR9Ci1Vc2UgQHZhcntvdXRwdXR9IGFzIHRoZSBuYW1lIGZvciB0aGUgcHJvZ3JhbSBwcm9kdWNlZCBieSBAY29kZXtsZH07IGlmIHRoaXMKLW9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSBAZmlsZXthLm91dH0gaXMgdXNlZCBieSBkZWZhdWx0LiAgVGhlCi1zY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVR9IGNhbiBhbHNvIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIG5hbWUuCi0KLUBraW5kZXggLU8gQHZhcntsZXZlbH0KLUBjaW5kZXggZ2VuZXJhdGluZyBvcHRpbWl6ZWQgb3V0cHV0Ci1AaXRlbSAtTyBAdmFye2xldmVsfQotSWYgQHZhcntsZXZlbH0gaXMgYSBudW1lcmljIHZhbHVlcyBncmVhdGVyIHRoYW4gemVybyBAY29kZXtsZH0gb3B0aW1pemVzCi10aGUgb3V0cHV0LiAgVGhpcyBtaWdodCB0YWtlIHNpZ25pZmljYW50bHkgbG9uZ2VyIGFuZCB0aGVyZWZvcmUgcHJvYmFibHkKLXNob3VsZCBvbmx5IGJlIGVuYWJsZWQgZm9yIHRoZSBmaW5hbCBiaW5hcnkuCi0KLUBjaW5kZXggcGFydGlhbCBsaW5rCi1AY2luZGV4IHJlbG9jYXRhYmxlIG91dHB1dAotQGtpbmRleCAtcgotQGtpbmRleCAtLXJlbG9jYXRlYWJsZQotQGl0ZW0gLXIKLUBpdGVteCAtLXJlbG9jYXRlYWJsZQotR2VuZXJhdGUgcmVsb2NhdGFibGUgb3V0cHV0LS0taS5lLiwgZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KLXR1cm4gc2VydmUgYXMgaW5wdXQgdG8gQGNvZGV7bGR9LiAgVGhpcyBpcyBvZnRlbiBjYWxsZWQgQGRmbntwYXJ0aWFsCi1saW5raW5nfS4gIEFzIGEgc2lkZSBlZmZlY3QsIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgc3RhbmRhcmQgVW5peAotbWFnaWMgbnVtYmVycywgdGhpcyBvcHRpb24gYWxzbyBzZXRzIHRoZSBvdXRwdXQgZmlsZSdzIG1hZ2ljIG51bWJlciB0bwotQGNvZGV7T01BR0lDfS4KLUBjIDsgc2VlIEBjb2Rley1OfS4gCi1JZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhYnNvbHV0ZSBmaWxlIGlzIHByb2R1Y2VkLiAgV2hlbgotbGlua2luZyBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIEBlbXBoe3dpbGwgbm90fSByZXNvbHZlIHJlZmVyZW5jZXMgdG8KLWNvbnN0cnVjdG9yczsgdG8gZG8gdGhhdCwgdXNlIEBzYW1wey1Vcn0uCi0KLVRoaXMgb3B0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgQHNhbXB7LWl9LgotCi1Aa2luZGV4IC1SIEB2YXJ7ZmlsZX0KLUBraW5kZXggLS1qdXN0LXN5bWJvbHM9QHZhcntmaWxlfQotQGNpbmRleCBzeW1ib2wtb25seSBpbnB1dAotQGl0ZW0gLVIgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWp1c3Qtc3ltYm9scz1AdmFye2ZpbGVuYW1lfQotUmVhZCBzeW1ib2wgbmFtZXMgYW5kIHRoZWlyIGFkZHJlc3NlcyBmcm9tIEB2YXJ7ZmlsZW5hbWV9LCBidXQgZG8gbm90Ci1yZWxvY2F0ZSBpdCBvciBpbmNsdWRlIGl0IGluIHRoZSBvdXRwdXQuICBUaGlzIGFsbG93cyB5b3VyIG91dHB1dCBmaWxlCi10byByZWZlciBzeW1ib2xpY2FsbHkgdG8gYWJzb2x1dGUgbG9jYXRpb25zIG9mIG1lbW9yeSBkZWZpbmVkIGluIG90aGVyCi1wcm9ncmFtcy4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIG1vcmUgdGhhbiBvbmNlLgotCi1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIEVMRiBsaW5rZXJzLCBpZiB0aGUgQGNvZGV7LVJ9IG9wdGlvbiBpcwotZm9sbG93ZWQgYnkgYSBkaXJlY3RvcnkgbmFtZSwgcmF0aGVyIHRoYW4gYSBmaWxlIG5hbWUsIGl0IGlzIHRyZWF0ZWQgYXMKLXRoZSBAY29kZXstcnBhdGh9IG9wdGlvbi4KLQotQGtpbmRleCAtcwotQGtpbmRleCAtLXN0cmlwLWFsbAotQGNpbmRleCBzdHJpcCBhbGwgc3ltYm9scwotQGl0ZW0gLXMgCi1AaXRlbXggLS1zdHJpcC1hbGwKLU9taXQgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotQGtpbmRleCAtUwotQGtpbmRleCAtLXN0cmlwLWRlYnVnCi1AY2luZGV4IHN0cmlwIGRlYnVnZ2VyIHN5bWJvbHMKLUBpdGVtIC1TIAotQGl0ZW14IC0tc3RyaXAtZGVidWcKLU9taXQgZGVidWdnZXIgc3ltYm9sIGluZm9ybWF0aW9uIChidXQgbm90IGFsbCBzeW1ib2xzKSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotQGtpbmRleCAtdAotQGtpbmRleCAtLXRyYWNlCi1AY2luZGV4IGlucHV0IGZpbGVzLCBkaXNwbGF5aW5nCi1AaXRlbSAtdCAKLUBpdGVteCAtLXRyYWNlCi1QcmludCB0aGUgbmFtZXMgb2YgdGhlIGlucHV0IGZpbGVzIGFzIEBjb2Rle2xkfSBwcm9jZXNzZXMgdGhlbS4KLQotQGtpbmRleCAtVCBAdmFye3NjcmlwdH0KLUBraW5kZXggLS1zY3JpcHQ9QHZhcntzY3JpcHR9Ci1AY2luZGV4IHNjcmlwdCBmaWxlcwotQGl0ZW0gLVQgQHZhcntzY3JpcHRmaWxlfQotQGl0ZW14IC0tc2NyaXB0PUB2YXJ7c2NyaXB0ZmlsZX0KLVVzZSBAdmFye3NjcmlwdGZpbGV9IGFzIHRoZSBsaW5rZXIgc2NyaXB0LiAgVGhpcyBzY3JpcHQgcmVwbGFjZXMKLUBjb2Rle2xkfSdzIGRlZmF1bHQgbGlua2VyIHNjcmlwdCAocmF0aGVyIHRoYW4gYWRkaW5nIHRvIGl0KSwgc28KLUB2YXJ7Y29tbWFuZGZpbGV9IG11c3Qgc3BlY2lmeSBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBkZXNjcmliZSB0aGUKLW91dHB1dCBmaWxlLiAgWW91IG11c3QgdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBhIGNvbW1hbmQKLXdoaWNoIGNhbiBvbmx5IGFwcGVhciBvbmNlIGluIGEgbGlua2VyIHNjcmlwdCwgc3VjaCBhcyB0aGUKLUBjb2Rle1NFQ1RJT05TfSBvciBAY29kZXtNRU1PUll9IGNvbW1hbmQuICBAeHJlZntTY3JpcHRzfS4gIElmCi1AdmFye3NjcmlwdGZpbGV9IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgQGNvZGV7bGR9Ci1sb29rcyBmb3IgaXQgaW4gdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSBhbnkgcHJlY2VkaW5nIEBzYW1wey1MfQotb3B0aW9ucy4gIE11bHRpcGxlIEBzYW1wey1UfSBvcHRpb25zIGFjY3VtdWxhdGUuCi0KLUBraW5kZXggLXUgQHZhcntzeW1ib2x9Ci1Aa2luZGV4IC0tdW5kZWZpbmVkPUB2YXJ7c3ltYm9sfQotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9sCi1AaXRlbSAtdSBAdmFye3N5bWJvbH0KLUBpdGVteCAtLXVuZGVmaW5lZD1AdmFye3N5bWJvbH0KLUZvcmNlIEB2YXJ7c3ltYm9sfSB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQKLXN5bWJvbC4gIERvaW5nIHRoaXMgbWF5LCBmb3IgZXhhbXBsZSwgdHJpZ2dlciBsaW5raW5nIG9mIGFkZGl0aW9uYWwKLW1vZHVsZXMgZnJvbSBzdGFuZGFyZCBsaWJyYXJpZXMuICBAc2FtcHstdX0gbWF5IGJlIHJlcGVhdGVkIHdpdGgKLWRpZmZlcmVudCBvcHRpb24gYXJndW1lbnRzIHRvIGVudGVyIGFkZGl0aW9uYWwgdW5kZWZpbmVkIHN5bWJvbHMuICBUaGlzCi1vcHRpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgQGNvZGV7RVhURVJOfSBsaW5rZXIgc2NyaXB0IGNvbW1hbmQuCi0KLUBraW5kZXggLVVyCi1AY2luZGV4IGNvbnN0cnVjdG9ycwotQGl0ZW0gLVVyIAotRm9yIGFueXRoaW5nIG90aGVyIHRoYW4gQysrIHByb2dyYW1zLCB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHstcn06IGl0IGdlbmVyYXRlcyByZWxvY2F0YWJsZSBvdXRwdXQtLS1pLmUuLCBhbiBvdXRwdXQgZmlsZSB0aGF0IGNhbiBpbgotdHVybiBzZXJ2ZSBhcyBpbnB1dCB0byBAY29kZXtsZH0uICBXaGVuIGxpbmtpbmcgQysrIHByb2dyYW1zLCBAc2FtcHstVXJ9Ci1AZW1waHtkb2VzfSByZXNvbHZlIHJlZmVyZW5jZXMgdG8gY29uc3RydWN0b3JzLCB1bmxpa2UgQHNhbXB7LXJ9LgotSXQgZG9lcyBub3Qgd29yayB0byB1c2UgQHNhbXB7LVVyfSBvbiBmaWxlcyB0aGF0IHdlcmUgdGhlbXNlbHZlcyBsaW5rZWQKLXdpdGggQHNhbXB7LVVyfTsgb25jZSB0aGUgY29uc3RydWN0b3IgdGFibGUgaGFzIGJlZW4gYnVpbHQsIGl0IGNhbm5vdAotYmUgYWRkZWQgdG8uICBVc2UgQHNhbXB7LVVyfSBvbmx5IGZvciB0aGUgbGFzdCBwYXJ0aWFsIGxpbmssIGFuZAotQHNhbXB7LXJ9IGZvciB0aGUgb3RoZXJzLgotCi1Aa2luZGV4IC12Ci1Aa2luZGV4IC1WCi1Aa2luZGV4IC0tdmVyc2lvbgotQGNpbmRleCB2ZXJzaW9uCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyc2lvbgotQGl0ZW14IC1WCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7bGR9LiAgVGhlIEBjb2Rley1WfSBvcHRpb24gYWxzbwotbGlzdHMgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi1Aa2luZGV4IC14Ci1Aa2luZGV4IC0tZGlzY2FyZC1hbGwKLUBjaW5kZXggZGVsZXRpbmcgbG9jYWwgc3ltYm9scwotQGl0ZW0gLXgKLUBpdGVteCAtLWRpc2NhcmQtYWxsCi1EZWxldGUgYWxsIGxvY2FsIHN5bWJvbHMuCi0KLUBraW5kZXggLVgKLUBraW5kZXggLS1kaXNjYXJkLWxvY2FscwotQGNpbmRleCBsb2NhbCBzeW1ib2xzLCBkZWxldGluZwotQGNpbmRleCBMLCBkZWxldGluZyBzeW1ib2xzIGJlZ2lubmluZwotQGl0ZW0gLVggCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotRGVsZXRlIGFsbCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scy4gIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXMgYWxsIGxvY2FsCi1zeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggQHNhbXB7TH0uCi0KLUBraW5kZXggLXkgQHZhcntzeW1ib2x9Ci1Aa2luZGV4IC0tdHJhY2Utc3ltYm9sPUB2YXJ7c3ltYm9sfQotQGNpbmRleCBzeW1ib2wgdHJhY2luZwotQGl0ZW0gLXkgQHZhcntzeW1ib2x9Ci1AaXRlbXggLS10cmFjZS1zeW1ib2w9QHZhcntzeW1ib2x9Ci1QcmludCB0aGUgbmFtZSBvZiBlYWNoIGxpbmtlZCBmaWxlIGluIHdoaWNoIEB2YXJ7c3ltYm9sfSBhcHBlYXJzLiAgVGhpcwotb3B0aW9uIG1heSBiZSBnaXZlbiBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgT24gbWFueSBzeXN0ZW1zIGl0IGlzIG5lY2Vzc2FyeQotdG8gcHJlcGVuZCBhbiB1bmRlcnNjb3JlLgotCi1UaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIGluIHlvdXIgbGluayBidXQKLWRvbid0IGtub3cgd2hlcmUgdGhlIHJlZmVyZW5jZSBpcyBjb21pbmcgZnJvbS4KLQotQGtpbmRleCAtWSBAdmFye3BhdGh9Ci1AaXRlbSAtWSBAdmFye3BhdGh9Ci1BZGQgQHZhcntwYXRofSB0byB0aGUgZGVmYXVsdCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgVGhpcyBvcHRpb24gZXhpc3RzCi1mb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC16IEB2YXJ7a2V5d29yZH0KLUBpdGVtIC16IEB2YXJ7a2V5d29yZH0KLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotQGtpbmRleCAtKAotQGNpbmRleCBncm91cHMgb2YgYXJjaGl2ZXMKLUBpdGVtIC0oIEB2YXJ7YXJjaGl2ZXN9IC0pCi1AaXRlbXggLS1zdGFydC1ncm91cCBAdmFye2FyY2hpdmVzfSAtLWVuZC1ncm91cAotVGhlIEB2YXJ7YXJjaGl2ZXN9IHNob3VsZCBiZSBhIGxpc3Qgb2YgYXJjaGl2ZSBmaWxlcy4gIFRoZXkgbWF5IGJlCi1laXRoZXIgZXhwbGljaXQgZmlsZSBuYW1lcywgb3IgQHNhbXB7LWx9IG9wdGlvbnMuCi0KLVRoZSBzcGVjaWZpZWQgYXJjaGl2ZXMgYXJlIHNlYXJjaGVkIHJlcGVhdGVkbHkgdW50aWwgbm8gbmV3IHVuZGVmaW5lZAotcmVmZXJlbmNlcyBhcmUgY3JlYXRlZC4gIE5vcm1hbGx5LCBhbiBhcmNoaXZlIGlzIHNlYXJjaGVkIG9ubHkgb25jZSBpbgotdGhlIG9yZGVyIHRoYXQgaXQgaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBJZiBhIHN5bWJvbCBpbiB0aGF0Ci1hcmNoaXZlIGlzIG5lZWRlZCB0byByZXNvbHZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgYW4KLW9iamVjdCBpbiBhbiBhcmNoaXZlIHRoYXQgYXBwZWFycyBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgbGlua2VyCi13b3VsZCBub3QgYmUgYWJsZSB0byByZXNvbHZlIHRoYXQgcmVmZXJlbmNlLiAgQnkgZ3JvdXBpbmcgdGhlIGFyY2hpdmVzLAotdGhleSBhbGwgYmUgc2VhcmNoZWQgcmVwZWF0ZWRseSB1bnRpbCBhbGwgcG9zc2libGUgcmVmZXJlbmNlcyBhcmUKLXJlc29sdmVkLgotCi1Vc2luZyB0aGlzIG9wdGlvbiBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBjb3N0LiAgSXQgaXMgYmVzdCB0byB1c2UKLWl0IG9ubHkgd2hlbiB0aGVyZSBhcmUgdW5hdm9pZGFibGUgY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIHR3byBvcgotbW9yZSBhcmNoaXZlcy4KLQotQGtpbmRleCAtYXNzZXJ0IEB2YXJ7a2V5d29yZH0KLUBpdGVtIC1hc3NlcnQgQHZhcntrZXl3b3JkfQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eS4KLQotQGtpbmRleCAtQmR5bmFtaWMKLUBraW5kZXggLWR5Ci1Aa2luZGV4IC1jYWxsX3NoYXJlZAotQGl0ZW0gLUJkeW5hbWljCi1AaXRlbXggLWR5Ci1AaXRlbXggLWNhbGxfc2hhcmVkCi1MaW5rIGFnYWluc3QgZHluYW1pYyBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBwbGF0Zm9ybXMKLWZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuICBUaGlzIG9wdGlvbiBpcyBub3JtYWxseSB0aGUKLWRlZmF1bHQgb24gc3VjaCBwbGF0Zm9ybXMuICBUaGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoaXMgb3B0aW9uIGFyZQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIHN5c3RlbXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbgotbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZTogaXQgYWZmZWN0cyBsaWJyYXJ5IHNlYXJjaGluZyBmb3IKLUBjb2Rley1sfSBvcHRpb25zIHdoaWNoIGZvbGxvdyBpdC4KLQotQGtpbmRleCAtQnN0YXRpYwotQGtpbmRleCAtZG4KLUBraW5kZXggLW5vbl9zaGFyZWQKLUBraW5kZXggLXN0YXRpYwotQGl0ZW0gLUJzdGF0aWMgCi1AaXRlbXggLWRuCi1AaXRlbXggLW5vbl9zaGFyZWQKLUBpdGVteCAtc3RhdGljCi1EbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbgotcGxhdGZvcm1zIGZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuICBUaGUgZGlmZmVyZW50Ci12YXJpYW50cyBvZiB0aGlzIG9wdGlvbiBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIHN5c3RlbXMuICBZb3UKLW1heSB1c2UgdGhpcyBvcHRpb24gbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZTogaXQgYWZmZWN0cwotbGlicmFyeSBzZWFyY2hpbmcgZm9yIEBjb2Rley1sfSBvcHRpb25zIHdoaWNoIGZvbGxvdyBpdC4KLQotQGtpbmRleCAtQnN5bWJvbGljCi1AaXRlbSAtQnN5bWJvbGljCi1XaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGJpbmQgcmVmZXJlbmNlcyB0byBnbG9iYWwgc3ltYm9scyB0byB0aGUKLWRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgaWYgYW55LiAgTm9ybWFsbHksIGl0IGlzIHBvc3NpYmxlCi1mb3IgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmluaXRpb24KLXdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgb24gRUxGCi1wbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi1Aa2luZGV4IC0tY2hlY2stc2VjdGlvbnMKLUBraW5kZXggLS1uby1jaGVjay1zZWN0aW9ucwotQGl0ZW0gLS1jaGVjay1zZWN0aW9ucwotQGl0ZW14IC0tbm8tY2hlY2stc2VjdGlvbnMKLUFza3MgdGhlIGxpbmtlciBAZW1waHtub3R9IHRvIGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGFmdGVyIHRoZXkgaGF2ZQotYmVlbiBhc3NpZ25lZCB0byBzZWUgaWYgdGhlcmUgYW55IG92ZXJsYXBzLiAgTm9ybWFsbHkgdGhlIGxpbmtlciB3aWxsCi1wZXJmb3JtIHRoaXMgY2hlY2ssIGFuZCBpZiBpdCBmaW5kcyBhbnkgb3ZlcmxhcHMgaXQgd2lsbCBwcm9kdWNlCi1zdWl0YWJsZSBlcnJvciBtZXNzYWdlcy4gIFRoZSBsaW5rZXIgZG9lcyBrbm93IGFib3V0LCBhbmQgZG9lcyBtYWtlCi1hbGxvd2FuY2VzIGZvciBzZWN0aW9ucyBpbiBvdmVybGF5cy4gIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBjYW4gYmUKLXJlc3RvcmVkIGJ5IHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgc3dpdGNoIEBzYW1wey0tY2hlY2stc2VjdGlvbnN9LgotCi1AY2luZGV4IGNyb3NzIHJlZmVyZW5jZSB0YWJsZQotQGtpbmRleCAtLWNyZWYKLUBpdGVtIC0tY3JlZgotT3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgSWYgYSBsaW5rZXIgbWFwIGZpbGUgaXMgYmVpbmcKLWdlbmVyYXRlZCwgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpcyBwcmludGVkIHRvIHRoZSBtYXAgZmlsZS4KLU90aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi1UaGUgZm9ybWF0IG9mIHRoZSB0YWJsZSBpcyBpbnRlbnRpb25hbGx5IHNpbXBsZSwgc28gdGhhdCBpdCBtYXkgYmUKLWVhc2lseSBwcm9jZXNzZWQgYnkgYSBzY3JpcHQgaWYgbmVjZXNzYXJ5LiAgVGhlIHN5bWJvbHMgYXJlIHByaW50ZWQgb3V0LAotc29ydGVkIGJ5IG5hbWUuICBGb3IgZWFjaCBzeW1ib2wsIGEgbGlzdCBvZiBmaWxlIG5hbWVzIGlzIGdpdmVuLiAgSWYgdGhlCi1zeW1ib2wgaXMgZGVmaW5lZCwgdGhlIGZpcnN0IGZpbGUgbGlzdGVkIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUKLWRlZmluaXRpb24uICBUaGUgcmVtYWluaW5nIGZpbGVzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sLgotCi1AY2luZGV4IHN5bWJvbHMsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC0tZGVmc3ltIEB2YXJ7c3ltYm9sfT1AdmFye2V4cH0KLUBpdGVtIC0tZGVmc3ltIEB2YXJ7c3ltYm9sfT1AdmFye2V4cHJlc3Npb259Ci1DcmVhdGUgYSBnbG9iYWwgc3ltYm9sIGluIHRoZSBvdXRwdXQgZmlsZSwgY29udGFpbmluZyB0aGUgYWJzb2x1dGUKLWFkZHJlc3MgZ2l2ZW4gYnkgQHZhcntleHByZXNzaW9ufS4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIGFzIG1hbnkKLXRpbWVzIGFzIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgY29tbWFuZCBsaW5lLiAgQQotbGltaXRlZCBmb3JtIG9mIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkIGZvciB0aGUgQHZhcntleHByZXNzaW9ufSBpbiB0aGlzCi1jb250ZXh0OiB5b3UgbWF5IGdpdmUgYSBoZXhhZGVjaW1hbCBjb25zdGFudCBvciB0aGUgbmFtZSBvZiBhbiBleGlzdGluZwotc3ltYm9sLCBvciB1c2UgQGNvZGV7K30gYW5kIEBjb2Rley19IHRvIGFkZCBvciBzdWJ0cmFjdCBoZXhhZGVjaW1hbAotY29uc3RhbnRzIG9yIHN5bWJvbHMuICBJZiB5b3UgbmVlZCBtb3JlIGVsYWJvcmF0ZSBleHByZXNzaW9ucywgY29uc2lkZXIKLXVzaW5nIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSBmcm9tIGEgc2NyaXB0IChAcHhyZWZ7QXNzaWdubWVudHMsLAotQXNzaWdubWVudDogU3ltYm9sIERlZmluaXRpb25zfSkuICBAZW1waHtOb3RlOn0gdGhlcmUgc2hvdWxkIGJlIG5vIHdoaXRlCi1zcGFjZSBiZXR3ZWVuIEB2YXJ7c3ltYm9sfSwgdGhlIGVxdWFscyBzaWduIChgYEBrZXl7PX0nJyksIGFuZAotQHZhcntleHByZXNzaW9ufS4KLQotQGNpbmRleCBkZW1hbmdsaW5nLCBmcm9tIGNvbW1hbmQgbGluZQotQGtpbmRleCAtLWRlbWFuZ2xlCi1Aa2luZGV4IC0tbm8tZGVtYW5nbGUKLUBpdGVtIC0tZGVtYW5nbGUKLUBpdGVteCAtLW5vLWRlbWFuZ2xlCi1UaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hldGhlciB0byBkZW1hbmdsZSBzeW1ib2wgbmFtZXMgaW4gZXJyb3IgbWVzc2FnZXMKLWFuZCBvdGhlciBvdXRwdXQuICBXaGVuIHRoZSBsaW5rZXIgaXMgdG9sZCB0byBkZW1hbmdsZSwgaXQgdHJpZXMgdG8KLXByZXNlbnQgc3ltYm9sIG5hbWVzIGluIGEgcmVhZGFibGUgZmFzaGlvbjogaXQgc3RyaXBzIGxlYWRpbmcKLXVuZGVyc2NvcmVzIGlmIHRoZXkgYXJlIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgYW5kIGNvbnZlcnRzIEMrKwotbWFuZ2xlZCBzeW1ib2wgbmFtZXMgaW50byB1c2VyIHJlYWRhYmxlIG5hbWVzLiAgVGhlIGxpbmtlciB3aWxsIGRlbWFuZ2xlCi1ieSBkZWZhdWx0IHVubGVzcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQHNhbXB7Q09MTEVDVF9OT19ERU1BTkdMRX0gaXMKLXNldC4gIFRoZXNlIG9wdGlvbnMgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCi0KLUBjaW5kZXggZHluYW1pYyBsaW5rZXIsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC0tZHluYW1pYy1saW5rZXIgQHZhcntmaWxlfQotQGl0ZW0gLS1keW5hbWljLWxpbmtlciBAdmFye2ZpbGV9Ci1TZXQgdGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgbGlua2VyLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbgotZ2VuZXJhdGluZyBkeW5hbWljYWxseSBsaW5rZWQgRUxGIGV4ZWN1dGFibGVzLiAgVGhlIGRlZmF1bHQgZHluYW1pYwotbGlua2VyIGlzIG5vcm1hbGx5IGNvcnJlY3Q7IGRvbid0IHVzZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUKLWRvaW5nLgotCi1AY2luZGV4IE1JUFMgZW1iZWRkZWQgUElDIGNvZGUKLUBraW5kZXggLS1lbWJlZGRlZC1yZWxvY3MKLUBpdGVtIC0tZW1iZWRkZWQtcmVsb2NzCi1UaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBsaW5raW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsCi1nZW5lcmF0ZWQgYnkgdGhlIC1tZW1iZWRkZWQtcGljIG9wdGlvbiB0byB0aGUgQHNje2dudX0gY29tcGlsZXIgYW5kCi1hc3NlbWJsZXIuICBJdCBjYXVzZXMgdGhlIGxpbmtlciB0byBjcmVhdGUgYSB0YWJsZSB3aGljaCBtYXkgYmUgdXNlZCBhdAotcnVudGltZSB0byByZWxvY2F0ZSBhbnkgZGF0YSB3aGljaCB3YXMgc3RhdGljYWxseSBpbml0aWFsaXplZCB0byBwb2ludGVyCi12YWx1ZXMuICBTZWUgdGhlIGNvZGUgaW4gdGVzdHN1aXRlL2xkLWVtcGljIGZvciBkZXRhaWxzLgotCi1Aa2luZGV4IC0tZm9yY2UtZXhlLXN1ZmZpeAotQGl0ZW0gIC0tZm9yY2UtZXhlLXN1ZmZpeAotTWFrZSBzdXJlIHRoYXQgYW4gb3V0cHV0IGZpbGUgaGFzIGEgLmV4ZSBzdWZmaXguCi0KLUlmIGEgc3VjY2Vzc2Z1bGx5IGJ1aWx0IGZ1bGx5IGxpbmtlZCBvdXRwdXQgZmlsZSBkb2VzIG5vdCBoYXZlIGEKLUBjb2Rley5leGV9IG9yIEBjb2Rley5kbGx9IHN1ZmZpeCwgdGhpcyBvcHRpb24gZm9yY2VzIHRoZSBsaW5rZXIgdG8gY29weQotdGhlIG91dHB1dCBmaWxlIHRvIG9uZSBvZiB0aGUgc2FtZSBuYW1lIHdpdGggYSBAY29kZXsuZXhlfSBzdWZmaXguIFRoaXMKLW9wdGlvbiBpcyB1c2VmdWwgd2hlbiB1c2luZyB1bm1vZGlmaWVkIFVuaXggbWFrZWZpbGVzIG9uIGEgTWljcm9zb2Z0Ci1XaW5kb3dzIGhvc3QsIHNpbmNlIHNvbWUgdmVyc2lvbnMgb2YgV2luZG93cyB3b24ndCBydW4gYW4gaW1hZ2UgdW5sZXNzCi1pdCBlbmRzIGluIGEgQGNvZGV7LmV4ZX0gc3VmZml4LgotCi1Aa2luZGV4IC0tZ2Mtc2VjdGlvbnMKLUBraW5kZXggLS1uby1nYy1zZWN0aW9ucwotQGNpbmRleCBnYXJiYWdlIGNvbGxlY3Rpb24KLUBpdGVtIC0tbm8tZ2Mtc2VjdGlvbnMKLUBpdGVteCAtLWdjLXNlY3Rpb25zCi1FbmFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHVudXNlZCBpbnB1dCBzZWN0aW9ucy4gIEl0IGlzIGlnbm9yZWQgb24KLXRhcmdldHMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGlzIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGlzIG5vdCBjb21wYXRpYmxlCi13aXRoIEBzYW1wey1yfSwgbm9yIHNob3VsZCBpdCBiZSB1c2VkIHdpdGggZHluYW1pYyBsaW5raW5nLiAgVGhlIGRlZmF1bHQKLWJlaGF2aW91ciAob2Ygbm90IHBlcmZvcm1pbmcgdGhpcyBnYXJiYWdlIGNvbGxlY3Rpb24pIGNhbiBiZSByZXN0b3JlZCBieQotc3BlY2lmeWluZyBAc2FtcHstLW5vLWdjLXNlY3Rpb25zfSBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IGhlbHAKLUBjaW5kZXggdXNhZ2UKLUBraW5kZXggLS1oZWxwCi1AaXRlbSAtLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotQGtpbmRleCAtTWFwCi1AaXRlbSAtTWFwIEB2YXJ7bWFwZmlsZX0KLVByaW50IGEgbGluayBtYXAgdG8gdGhlIGZpbGUgQHZhcnttYXBmaWxlfS4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCi1Ac2FtcHstTX0gb3B0aW9uLCBhYm92ZS4KLQotQGNpbmRleCBtZW1vcnkgdXNhZ2UKLUBraW5kZXggLS1uby1rZWVwLW1lbW9yeQotQGl0ZW0gLS1uby1rZWVwLW1lbW9yeQotQGNvZGV7bGR9IG5vcm1hbGx5IG9wdGltaXplcyBmb3Igc3BlZWQgb3ZlciBtZW1vcnkgdXNhZ2UgYnkgY2FjaGluZyB0aGUKLXN5bWJvbCB0YWJsZXMgb2YgaW5wdXQgZmlsZXMgaW4gbWVtb3J5LiAgVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7bGR9IHRvCi1pbnN0ZWFkIG9wdGltaXplIGZvciBtZW1vcnkgdXNhZ2UsIGJ5IHJlcmVhZGluZyB0aGUgc3ltYm9sIHRhYmxlcyBhcwotbmVjZXNzYXJ5LiAgVGhpcyBtYXkgYmUgcmVxdWlyZWQgaWYgQGNvZGV7bGR9IHJ1bnMgb3V0IG9mIG1lbW9yeSBzcGFjZQotd2hpbGUgbGlua2luZyBhIGxhcmdlIGV4ZWN1dGFibGUuCi0KLUBraW5kZXggLS1uby11bmRlZmluZWQKLUBpdGVtIC0tbm8tdW5kZWZpbmVkCi1Ob3JtYWxseSB3aGVuIGNyZWF0aW5nIGEgbm9uLXN5bWJvbGljIHNoYXJlZCBsaWJyYXJ5LCB1bmRlZmluZWQgc3ltYm9scwotYXJlIGFsbG93ZWQgYW5kIGxlZnQgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIHJ1bnRpbWUgbG9hZGVyLiAgVGhpcyBvcHRpb24KLWRpc2FsbG93cyBzdWNoIHVuZGVmaW5lZCBzeW1ib2xzLgotCi1Aa2luZGV4IC0tbm8td2Fybi1taXNtYXRjaAotQGl0ZW0gLS1uby13YXJuLW1pc21hdGNoCi1Ob3JtYWxseSBAY29kZXtsZH0gd2lsbCBnaXZlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gbGluayB0b2dldGhlciBpbnB1dAotZmlsZXMgdGhhdCBhcmUgbWlzbWF0Y2hlZCBmb3Igc29tZSByZWFzb24sIHBlcmhhcHMgYmVjYXVzZSB0aGV5IGhhdmUKLWJlZW4gY29tcGlsZWQgZm9yIGRpZmZlcmVudCBwcm9jZXNzb3JzIG9yIGZvciBkaWZmZXJlbnQgZW5kaWFubmVzc2VzLgotVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7bGR9IHRoYXQgaXQgc2hvdWxkIHNpbGVudGx5IHBlcm1pdCBzdWNoIHBvc3NpYmxlCi1lcnJvcnMuICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggY2FyZSwgaW4gY2FzZXMgd2hlbiB5b3UKLWhhdmUgdGFrZW4gc29tZSBzcGVjaWFsIGFjdGlvbiB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgbGlua2VyIGVycm9ycyBhcmUKLWluYXBwcm9wcmlhdGUuCi0KLUBraW5kZXggLS1uby13aG9sZS1hcmNoaXZlCi1AaXRlbSAtLW5vLXdob2xlLWFyY2hpdmUKLVR1cm4gb2ZmIHRoZSBlZmZlY3Qgb2YgdGhlIEBjb2Rley0td2hvbGUtYXJjaGl2ZX0gb3B0aW9uIGZvciBzdWJzZXF1ZW50Ci1hcmNoaXZlIGZpbGVzLgotCi1AY2luZGV4IG91dHB1dCBmaWxlIGFmdGVyIGVycm9ycwotQGtpbmRleCAtLW5vaW5oaWJpdC1leGVjCi1AaXRlbSAtLW5vaW5oaWJpdC1leGVjCi1SZXRhaW4gdGhlIGV4ZWN1dGFibGUgb3V0cHV0IGZpbGUgd2hlbmV2ZXIgaXQgaXMgc3RpbGwgdXNhYmxlLgotTm9ybWFsbHksIHRoZSBsaW5rZXIgd2lsbCBub3QgcHJvZHVjZSBhbiBvdXRwdXQgZmlsZSBpZiBpdCBlbmNvdW50ZXJzCi1lcnJvcnMgZHVyaW5nIHRoZSBsaW5rIHByb2Nlc3M7IGl0IGV4aXRzIHdpdGhvdXQgd3JpdGluZyBhbiBvdXRwdXQgZmlsZQotd2hlbiBpdCBpc3N1ZXMgYW55IGVycm9yIHdoYXRzb2V2ZXIuCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQGtpbmRleCAtLW9mb3JtYXQKLUBpdGVtIC0tb2Zvcm1hdCBAdmFye291dHB1dC1mb3JtYXR9Ci1AY29kZXtsZH0gbWF5IGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGtpbmQgb2Ygb2JqZWN0Ci1maWxlLiAgSWYgeW91ciBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0aGlzIHdheSwgeW91IGNhbiB1c2UgdGhlCi1Ac2FtcHstLW9mb3JtYXR9IG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBiaW5hcnkgZm9ybWF0IGZvciB0aGUgb3V0cHV0Ci1vYmplY3QgZmlsZS4gIEV2ZW4gd2hlbiBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IGFsdGVybmF0aXZlCi1vYmplY3QgZm9ybWF0cywgeW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzIEBjb2Rle2xkfQotc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBhcyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMgYSB0ZXh0IHN0cmluZywgdGhlCi1uYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgKFlvdSBjYW4KLWxpc3QgdGhlIGF2YWlsYWJsZSBiaW5hcnkgZm9ybWF0cyB3aXRoIEBzYW1we29iamR1bXAgLWl9LikgIFRoZSBzY3JpcHQKLWNvbW1hbmQgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZvcm1hdCwgYnV0Ci10aGlzIG9wdGlvbiBvdmVycmlkZXMgaXQuICBAeHJlZntCRkR9LgotQGVuZCBpZmNsZWFyCi0KLUBraW5kZXggLXFtYWdpYwotQGl0ZW0gLXFtYWdpYwotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KLQotQGtpbmRleCAtUXkKLUBpdGVtIC1ReQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC0tcmVsYXgKLUBjaW5kZXggc3ludGhlc2l6aW5nIGxpbmtlcgotQGNpbmRleCByZWxheGluZyBhZGRyZXNzaW5nIG1vZGVzCi1AaXRlbSAtLXJlbGF4Ci1BbiBvcHRpb24gd2l0aCBtYWNoaW5lIGRlcGVuZGVudCBlZmZlY3RzLiAgCi1AaWZzZXQgR0VORVJJQwotVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgb24gYSBmZXcgdGFyZ2V0cy4KLUBlbmQgaWZzZXQKLUBpZnNldCBIODMwMAotQHhyZWZ7SDgvMzAwLCxAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDB9LgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUB4cmVme2k5NjAsLCBAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5fS4KLUBlbmQgaWZzZXQKLQotCi1PbiBzb21lIHBsYXRmb3JtcywgdGhlIEBzYW1wey0tcmVsYXh9IG9wdGlvbiBwZXJmb3JtcyBnbG9iYWwKLW9wdGltaXphdGlvbnMgdGhhdCBiZWNvbWUgcG9zc2libGUgd2hlbiB0aGUgbGlua2VyIHJlc29sdmVzIGFkZHJlc3NpbmcKLWluIHRoZSBwcm9ncmFtLCBzdWNoIGFzIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMgYW5kIHN5bnRoZXNpemluZyBuZXcKLWluc3RydWN0aW9ucyBpbiB0aGUgb3V0cHV0IG9iamVjdCBmaWxlLgotCi1PbiBzb21lIHBsYXRmb3JtcyB0aGVzZSBsaW5rIHRpbWUgZ2xvYmFsIG9wdGltaXphdGlvbnMgbWF5IG1ha2Ugc3ltYm9saWMKLWRlYnVnZ2luZyBvZiB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgaW1wb3NzaWJsZS4KLUBpZnNldCBHRU5FUklDCi1UaGlzIGlzIGtub3duIHRvIGJlCi10aGUgY2FzZSBmb3IgdGhlIE1hdHN1c2hpdGEgTU4xMDIwMCBhbmQgTU4xMDMwMCBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEdFTkVSSUMKLU9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIEBzYW1wey0tcmVsYXh9IGlzIGFjY2VwdGVkLAotYnV0IGlnbm9yZWQuCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggcmV0YWluaW5nIHNwZWNpZmllZCBzeW1ib2xzCi1AY2luZGV4IHN0cmlwcGluZyBhbGwgYnV0IHNvbWUgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCByZXRhaW5pbmcgc2VsZWN0aXZlbHkKLUBpdGVtIC0tcmV0YWluLXN5bWJvbHMtZmlsZSBAdmFye2ZpbGVuYW1lfQotUmV0YWluIEBlbXBoe29ubHl9IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfSwKLWRpc2NhcmRpbmcgYWxsIG90aGVycy4gIEB2YXJ7ZmlsZW5hbWV9IGlzIHNpbXBseSBhIGZsYXQgZmlsZSwgd2l0aCBvbmUKLXN5bWJvbCBuYW1lIHBlciBsaW5lLiAgVGhpcyBvcHRpb24gaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gZW52aXJvbm1lbnRzCi1AaWZzZXQgR0VORVJJQwotKHN1Y2ggYXMgVnhXb3JrcykKLUBlbmQgaWZzZXQKLXdoZXJlIGEgbGFyZ2UgZ2xvYmFsIHN5bWJvbCB0YWJsZSBpcyBhY2N1bXVsYXRlZCBncmFkdWFsbHksIHRvIGNvbnNlcnZlCi1ydW4tdGltZSBtZW1vcnkuCi0KLUBzYW1wey0tcmV0YWluLXN5bWJvbHMtZmlsZX0gZG9lcyBAZW1waHtub3R9IGRpc2NhcmQgdW5kZWZpbmVkIHN5bWJvbHMsCi1vciBzeW1ib2xzIG5lZWRlZCBmb3IgcmVsb2NhdGlvbnMuCi0KLVlvdSBtYXkgb25seSBzcGVjaWZ5IEBzYW1wey0tcmV0YWluLXN5bWJvbHMtZmlsZX0gb25jZSBpbiB0aGUgY29tbWFuZAotbGluZS4gIEl0IG92ZXJyaWRlcyBAc2FtcHstc30gYW5kIEBzYW1wey1TfS4KLQotQGlmc2V0IEdFTkVSSUMKLUBpdGVtIC1ycGF0aCBAdmFye2Rpcn0KLUBjaW5kZXggcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoCi1Aa2luZGV4IC1ycGF0aAotQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGguICBUaGlzIGlzIHVzZWQgd2hlbgotbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSB3aXRoIHNoYXJlZCBvYmplY3RzLiAgQWxsIEBjb2Rley1ycGF0aH0KLWFyZ3VtZW50cyBhcmUgY29uY2F0ZW5hdGVkIGFuZCBwYXNzZWQgdG8gdGhlIHJ1bnRpbWUgbGlua2VyLCB3aGljaCB1c2VzCi10aGVtIHRvIGxvY2F0ZSBzaGFyZWQgb2JqZWN0cyBhdCBydW50aW1lLiAgVGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uIGlzCi1hbHNvIHVzZWQgd2hlbiBsb2NhdGluZyBzaGFyZWQgb2JqZWN0cyB3aGljaCBhcmUgbmVlZGVkIGJ5IHNoYXJlZAotb2JqZWN0cyBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBsaW5rOyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQotQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbi4gIElmIEBjb2Rley1ycGF0aH0gaXMgbm90IHVzZWQgd2hlbiBsaW5raW5nIGFuCi1FTEYgZXhlY3V0YWJsZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQGNvZGV7TERfUlVOX1BBVEh9IHdpbGwgYmUgdXNlZCBpZiBpdCBpcyBkZWZpbmVkLgotCi1UaGUgQGNvZGV7LXJwYXRofSBvcHRpb24gbWF5IGFsc28gYmUgdXNlZCBvbiBTdW5PUy4gIEJ5IGRlZmF1bHQsIG9uCi1TdW5PUywgdGhlIGxpbmtlciB3aWxsIGZvcm0gYSBydW50aW1lIHNlYXJjaCBwYXRjaCBvdXQgb2YgYWxsIHRoZQotQGNvZGV7LUx9IG9wdGlvbnMgaXQgaXMgZ2l2ZW4uICBJZiBhIEBjb2Rley1ycGF0aH0gb3B0aW9uIGlzIHVzZWQsIHRoZQotcnVudGltZSBzZWFyY2ggcGF0aCB3aWxsIGJlIGZvcm1lZCBleGNsdXNpdmVseSB1c2luZyB0aGUgQGNvZGV7LXJwYXRofQotb3B0aW9ucywgaWdub3JpbmcgdGhlIEBjb2Rley1MfSBvcHRpb25zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcKLWdjYywgd2hpY2ggYWRkcyBtYW55IEBjb2Rley1MfSBvcHRpb25zIHdoaWNoIG1heSBiZSBvbiBORlMgbW91bnRlZAotZmlsZXN5c3RlbXMuCi0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgRUxGIGxpbmtlcnMsIGlmIHRoZSBAY29kZXstUn0gb3B0aW9uIGlzCi1mb2xsb3dlZCBieSBhIGRpcmVjdG9yeSBuYW1lLCByYXRoZXIgdGhhbiBhIGZpbGUgbmFtZSwgaXQgaXMgdHJlYXRlZCBhcwotdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uLgotQGVuZCBpZnNldAotCi1AaWZzZXQgR0VORVJJQwotQGNpbmRleCBsaW5rLXRpbWUgcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoCi1Aa2luZGV4IC1ycGF0aC1saW5rCi1AaXRlbSAtcnBhdGgtbGluayBAdmFye0RJUn0KLVdoZW4gdXNpbmcgRUxGIG9yIFN1bk9TLCBvbmUgc2hhcmVkIGxpYnJhcnkgbWF5IHJlcXVpcmUgYW5vdGhlci4gIFRoaXMKLWhhcHBlbnMgd2hlbiBhbiBAY29kZXtsZCAtc2hhcmVkfSBsaW5rIGluY2x1ZGVzIGEgc2hhcmVkIGxpYnJhcnkgYXMgb25lCi1vZiB0aGUgaW5wdXQgZmlsZXMuCi0KLVdoZW4gdGhlIGxpbmtlciBlbmNvdW50ZXJzIHN1Y2ggYSBkZXBlbmRlbmN5IHdoZW4gZG9pbmcgYSBub24tc2hhcmVkLAotbm9uLXJlbG9jYXRhYmxlIGxpbmssIGl0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gbG9jYXRlIHRoZSByZXF1aXJlZAotc2hhcmVkIGxpYnJhcnkgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIGxpbmssIGlmIGl0IGlzIG5vdCBpbmNsdWRlZAotZXhwbGljaXRseS4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbgotc3BlY2lmaWVzIHRoZSBmaXJzdCBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLiAgVGhlCi1AY29kZXstcnBhdGgtbGlua30gb3B0aW9uIG1heSBzcGVjaWZ5IGEgc2VxdWVuY2Ugb2YgZGlyZWN0b3J5IG5hbWVzCi1laXRoZXIgYnkgc3BlY2lmeWluZyBhIGxpc3Qgb2YgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbG9ucywgb3IgYnkKLWFwcGVhcmluZyBtdWx0aXBsZSB0aW1lcy4KLQotVGhlIGxpbmtlciB1c2VzIHRoZSBmb2xsb3dpbmcgc2VhcmNoIHBhdGhzIHRvIGxvY2F0ZSByZXF1aXJlZCBzaGFyZWQKLWxpYnJhcmllcy4KLUBlbnVtZXJhdGUKLUBpdGVtCi1BbnkgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IEBjb2Rley1ycGF0aC1saW5rfSBvcHRpb25zLgotQGl0ZW0KLUFueSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgQGNvZGV7LXJwYXRofSBvcHRpb25zLiAgVGhlIGRpZmZlcmVuY2UKLWJldHdlZW4gQGNvZGV7LXJwYXRofSBhbmQgQGNvZGV7LXJwYXRoLWxpbmt9IGlzIHRoYXQgZGlyZWN0b3JpZXMKLXNwZWNpZmllZCBieSBAY29kZXstcnBhdGh9IG9wdGlvbnMgYXJlIGluY2x1ZGVkIGluIHRoZSBleGVjdXRhYmxlIGFuZAotdXNlZCBhdCBydW50aW1lLCB3aGVyZWFzIHRoZSBAY29kZXstcnBhdGgtbGlua30gb3B0aW9uIGlzIG9ubHkgZWZmZWN0aXZlCi1hdCBsaW5rIHRpbWUuCi1AaXRlbQotT24gYW4gRUxGIHN5c3RlbSwgaWYgdGhlIEBjb2Rley1ycGF0aH0gYW5kIEBjb2Rle3JwYXRoLWxpbmt9IG9wdGlvbnMKLXdlcmUgbm90IHVzZWQsIHNlYXJjaCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1AY29kZXtMRF9SVU5fUEFUSH0uCi1AaXRlbQotT24gU3VuT1MsIGlmIHRoZSBAY29kZXstcnBhdGh9IG9wdGlvbiB3YXMgbm90IHVzZWQsIHNlYXJjaCBhbnkKLWRpcmVjdG9yaWVzIHNwZWNpZmllZCB1c2luZyBAY29kZXstTH0gb3B0aW9ucy4KLUBpdGVtCi1Gb3IgYSBuYXRpdmUgbGlua2VyLCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1AY29kZXtMRF9MSUJSQVJZX1BBVEh9LgotQGl0ZW0KLVRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzLCBub3JtYWxseSBAZmlsZXsvbGlifSBhbmQgQGZpbGV7L3Vzci9saWJ9LgotQGl0ZW0KLUZvciBhIG5hdGl2ZSBsaW5rZXIgb24gYW4gRUxGIHN5c3RlbSwgaWYgdGhlIGZpbGUgQGZpbGV7L2V0Yy9sZC5zby5jb25mfQotZXhpc3RzLCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBmb3VuZCBpbiB0aGF0IGZpbGUuCi1AZW5kIGVudW1lcmF0ZQotCi1JZiB0aGUgcmVxdWlyZWQgc2hhcmVkIGxpYnJhcnkgaXMgbm90IGZvdW5kLCB0aGUgbGlua2VyIHdpbGwgaXNzdWUgYQotd2FybmluZyBhbmQgY29udGludWUgd2l0aCB0aGUgbGluay4KLUBlbmQgaWZzZXQKLQotQGtpbmRleCAtc2hhcmVkCi1Aa2luZGV4IC1Cc2hhcmVhYmxlCi1AaXRlbSAtc2hhcmVkCi1AaXRlbXggLUJzaGFyZWFibGUKLUBjaW5kZXggc2hhcmVkIGxpYnJhcmllcwotQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBFTEYsIFhDT0ZGCi1hbmQgU3VuT1MgcGxhdGZvcm1zLiAgT24gU3VuT1MsIHRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhCi1zaGFyZWQgbGlicmFyeSBpZiB0aGUgQGNvZGV7LWV9IG9wdGlvbiBpcyBub3QgdXNlZCBhbmQgdGhlcmUgYXJlCi11bmRlZmluZWQgc3ltYm9scyBpbiB0aGUgbGluay4KLQotQGl0ZW0gLS1zb3J0LWNvbW1vbgotQGtpbmRleCAtLXNvcnQtY29tbW9uCi1UaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdG8gc29ydCB0aGUgY29tbW9uIHN5bWJvbHMgYnkgc2l6ZSB3aGVuIGl0Ci1wbGFjZXMgdGhlbSBpbiB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IHNlY3Rpb25zLiAgRmlyc3QgY29tZSBhbGwgdGhlIG9uZQotYnl0ZSBzeW1ib2xzLCB0aGVuIGFsbCB0aGUgdHdvIGJ5dGVzLCB0aGVuIGFsbCB0aGUgZm91ciBieXRlcywgYW5kIHRoZW4KLWV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgaXMgdG8gcHJldmVudCBnYXBzIGJldHdlZW4gc3ltYm9scyBkdWUgdG8KLWFsaWdubWVudCBjb25zdHJhaW50cy4KLQotQGtpbmRleCAtLXNwbGl0LWJ5LWZpbGUKLUBpdGVtIC0tc3BsaXQtYnktZmlsZQotU2ltaWxhciB0byBAY29kZXstLXNwbGl0LWJ5LXJlbG9jfSBidXQgY3JlYXRlcyBhIG5ldyBvdXRwdXQgc2VjdGlvbiBmb3IKLWVhY2ggaW5wdXQgZmlsZS4KLQotQGtpbmRleCAtLXNwbGl0LWJ5LXJlbG9jCi1AaXRlbSAtLXNwbGl0LWJ5LXJlbG9jIEB2YXJ7Y291bnR9Ci1UcnlzIHRvIGNyZWF0ZXMgZXh0cmEgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHNvIHRoYXQgbm8gc2luZ2xlCi1vdXRwdXQgc2VjdGlvbiBpbiB0aGUgZmlsZSBjb250YWlucyBtb3JlIHRoYW4gQHZhcntjb3VudH0gcmVsb2NhdGlvbnMuCi1UaGlzIGlzIHVzZWZ1bCB3aGVuIGdlbmVyYXRpbmcgaHVnZSByZWxvY2F0YWJsZSBmb3IgZG93bmxvYWRpbmcgaW50bwotY2VydGFpbiByZWFsIHRpbWUga2VybmVscyB3aXRoIHRoZSBDT0ZGIG9iamVjdCBmaWxlIGZvcm1hdDsgc2luY2UgQ09GRgotY2Fubm90IHJlcHJlc2VudCBtb3JlIHRoYW4gNjU1MzUgcmVsb2NhdGlvbnMgaW4gYSBzaW5nbGUgc2VjdGlvbi4gIE5vdGUKLXRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gd29yayB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMgd2hpY2ggZG8gbm90Ci1zdXBwb3J0IGFyYml0cmFyeSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgd2lsbCBub3Qgc3BsaXQgdXAgaW5kaXZpZHVhbAotaW5wdXQgc2VjdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uLCBzbyBpZiBhIHNpbmdsZSBpbnB1dCBzZWN0aW9uIGNvbnRhaW5zCi1tb3JlIHRoYW4gQHZhcntjb3VudH0gcmVsb2NhdGlvbnMgb25lIG91dHB1dCBzZWN0aW9uIHdpbGwgY29udGFpbiB0aGF0Ci1tYW55IHJlbG9jYXRpb25zLgotCi1Aa2luZGV4IC0tc3RhdHMKLUBpdGVtIC0tc3RhdHMKLUNvbXB1dGUgYW5kIGRpc3BsYXkgc3RhdGlzdGljcyBhYm91dCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBsaW5rZXIsIHN1Y2gKLWFzIGV4ZWN1dGlvbiB0aW1lIGFuZCBtZW1vcnkgdXNhZ2UuCi0KLUBraW5kZXggLS10cmFkaXRpb25hbC1mb3JtYXQKLUBjaW5kZXggdHJhZGl0aW9uYWwgZm9ybWF0Ci1AaXRlbSAtLXRyYWRpdGlvbmFsLWZvcm1hdAotRm9yIHNvbWUgdGFyZ2V0cywgdGhlIG91dHB1dCBvZiBAY29kZXtsZH0gaXMgZGlmZmVyZW50IGluIHNvbWUgd2F5cyBmcm9tCi10aGUgb3V0cHV0IG9mIHNvbWUgZXhpc3RpbmcgbGlua2VyLiAgVGhpcyBzd2l0Y2ggcmVxdWVzdHMgQGNvZGV7bGR9IHRvCi11c2UgdGhlIHRyYWRpdGlvbmFsIGZvcm1hdCBpbnN0ZWFkLgotCi1AY2luZGV4IGRieAotRm9yIGV4YW1wbGUsIG9uIFN1bk9TLCBAY29kZXtsZH0gY29tYmluZXMgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlCi1zeW1ib2wgc3RyaW5nIHRhYmxlLiAgVGhpcyBjYW4gcmVkdWNlIHRoZSBzaXplIG9mIGFuIG91dHB1dCBmaWxlIHdpdGgKLWZ1bGwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJ5IG92ZXIgMzAgcGVyY2VudC4gIFVuZm9ydHVuYXRlbHksIHRoZSBTdW5PUwotQGNvZGV7ZGJ4fSBwcm9ncmFtIGNhbiBub3QgcmVhZCB0aGUgcmVzdWx0aW5nIHByb2dyYW0gKEBjb2Rle2dkYn0gaGFzIG5vCi10cm91YmxlKS4gIFRoZSBAc2FtcHstLXRyYWRpdGlvbmFsLWZvcm1hdH0gc3dpdGNoIHRlbGxzIEBjb2Rle2xkfSB0byBub3QKLWNvbWJpbmUgZHVwbGljYXRlIGVudHJpZXMuCi0KLUBraW5kZXggLVRic3MgQHZhcntvcmd9Ci1Aa2luZGV4IC1UZGF0YSBAdmFye29yZ30KLUBraW5kZXggLVR0ZXh0IEB2YXJ7b3JnfQotQGNpbmRleCBzZWdtZW50IG9yaWdpbnMsIGNtZCBsaW5lCi1AaXRlbSAtVGJzcyBAdmFye29yZ30KLUBpdGVteCAtVGRhdGEgQHZhcntvcmd9Ci1AaXRlbXggLVR0ZXh0IEB2YXJ7b3JnfQotVXNlIEB2YXJ7b3JnfSBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3ItLS1yZXNwZWN0aXZlbHktLS10aGUKLUBjb2Rle2Jzc30sIEBjb2Rle2RhdGF9LCBvciB0aGUgQGNvZGV7dGV4dH0gc2VnbWVudCBvZiB0aGUgb3V0cHV0IGZpbGUuCi1AdmFye29yZ30gbXVzdCBiZSBhIHNpbmdsZSBoZXhhZGVjaW1hbCBpbnRlZ2VyOwotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLCB5b3UgbWF5IG9taXQgdGhlIGxlYWRpbmcKLUBzYW1wezB4fSB1c3VhbGx5IGFzc29jaWF0ZWQgd2l0aCBoZXhhZGVjaW1hbCB2YWx1ZXMuCi0KLUBraW5kZXggLS12ZXJib3NlCi1AY2luZGV4IHZlcmJvc2UKLUBpdGVtIC0tZGxsLXZlcmJvc2UKLUBpdGVteCAtLXZlcmJvc2UKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXtsZH0gYW5kIGxpc3QgdGhlIGxpbmtlciBlbXVsYXRpb25zCi1zdXBwb3J0ZWQuICBEaXNwbGF5IHdoaWNoIGlucHV0IGZpbGVzIGNhbiBhbmQgY2Fubm90IGJlIG9wZW5lZC4gIERpc3BsYXkKLXRoZSBsaW5rZXIgc2NyaXB0IGlmIHVzaW5nIGEgZGVmYXVsdCBidWlsdGluIHNjcmlwdC4KLQotQGtpbmRleCAtLXZlcnNpb24tc2NyaXB0PUB2YXJ7dmVyc2lvbi1zY3JpcHRmaWxlfQotQGNpbmRleCB2ZXJzaW9uIHNjcmlwdCwgc3ltYm9sIHZlcnNpb25zCi1AaXRlbXggLS12ZXJzaW9uLXNjcmlwdD1AdmFye3ZlcnNpb24tc2NyaXB0ZmlsZX0KLVNwZWNpZnkgdGhlIG5hbWUgb2YgYSB2ZXJzaW9uIHNjcmlwdCB0byB0aGUgbGlua2VyLiAgVGhpcyBpcyB0eXBpY2FsbHkKLXVzZWQgd2hlbiBjcmVhdGluZyBzaGFyZWQgbGlicmFyaWVzIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIHZlcnNpb24gaGVpcmFyY2h5IGZvciB0aGUgbGlicmFyeSBiZWluZyBjcmVhdGVkLiAgVGhpcyBvcHRpb24KLWlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBFTEYgcGxhdGZvcm1zIHdoaWNoIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KLUB4cmVme1ZFUlNJT059LgotCi1Aa2luZGV4IC0td2Fybi1jb21vbgotQGNpbmRleCB3YXJuaW5ncywgb24gY29tYmluaW5nIHN5bWJvbHMKLUBjaW5kZXggY29tYmluaW5nIHN5bWJvbHMsIHdhcm5pbmdzIG9uCi1AaXRlbSAtLXdhcm4tY29tbW9uCi1XYXJuIHdoZW4gYSBjb21tb24gc3ltYm9sIGlzIGNvbWJpbmVkIHdpdGggYW5vdGhlciBjb21tb24gc3ltYm9sIG9yIHdpdGgKLWEgc3ltYm9sIGRlZmluaXRpb24uICBVbml4IGxpbmtlcnMgYWxsb3cgdGhpcyBzb21ld2hhdCBzbG9wcHkgcHJhY3RpY2UsCi1idXQgbGlua2VycyBvbiBzb21lIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGRvIG5vdC4gIFRoaXMgb3B0aW9uIGFsbG93cwoteW91IHRvIGZpbmQgcG90ZW50aWFsIHByb2JsZW1zIGZyb20gY29tYmluaW5nIGdsb2JhbCBzeW1ib2xzLgotVW5mb3J0dW5hdGVseSwgc29tZSBDIGxpYnJhcmllcyB1c2UgdGhpcyBwcmFjdGljZSwgc28geW91IG1heSBnZXQgc29tZQotd2FybmluZ3MgYWJvdXQgc3ltYm9scyBpbiB0aGUgbGlicmFyaWVzIGFzIHdlbGwgYXMgaW4geW91ciBwcm9ncmFtcy4KLQotVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIGdsb2JhbCBzeW1ib2xzLCBpbGx1c3RyYXRlZCBoZXJlIGJ5IEMgZXhhbXBsZXM6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gaW50IGkgPSAxOwotQSBkZWZpbml0aW9uLCB3aGljaCBnb2VzIGluIHRoZSBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gb2YgdGhlIG91dHB1dAotZmlsZS4KLQotQGl0ZW0gZXh0ZXJuIGludCBpOwotQW4gdW5kZWZpbmVkIHJlZmVyZW5jZSwgd2hpY2ggZG9lcyBub3QgYWxsb2NhdGUgc3BhY2UuCi1UaGVyZSBtdXN0IGJlIGVpdGhlciBhIGRlZmluaXRpb24gb3IgYSBjb21tb24gc3ltYm9sIGZvciB0aGUKLXZhcmlhYmxlIHNvbWV3aGVyZS4KLQotQGl0ZW0gaW50IGk7Ci1BIGNvbW1vbiBzeW1ib2wuICBJZiB0aGVyZSBhcmUgb25seSAob25lIG9yIG1vcmUpIGNvbW1vbiBzeW1ib2xzIGZvciBhCi12YXJpYWJsZSwgaXQgZ29lcyBpbiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgb2YgdGhlIG91dHB1dCBmaWxlLgotVGhlIGxpbmtlciBtZXJnZXMgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlIGludG8gYQotc2luZ2xlIHN5bWJvbC4gIElmIHRoZXkgYXJlIG9mIGRpZmZlcmVudCBzaXplcywgaXQgcGlja3MgdGhlIGxhcmdlc3QKLXNpemUuICBUaGUgbGlua2VyIHR1cm5zIGEgY29tbW9uIHN5bWJvbCBpbnRvIGEgZGVjbGFyYXRpb24sIGlmIHRoZXJlIGlzCi1hIGRlZmluaXRpb24gb2YgdGhlIHNhbWUgdmFyaWFibGUuCi1AZW5kIHRhYmxlCi0KLVRoZSBAc2FtcHstLXdhcm4tY29tbW9ufSBvcHRpb24gY2FuIHByb2R1Y2UgZml2ZSBraW5kcyBvZiB3YXJuaW5ncy4KLUVhY2ggd2FybmluZyBjb25zaXN0cyBvZiBhIHBhaXIgb2YgbGluZXM6IHRoZSBmaXJzdCBkZXNjcmliZXMgdGhlIHN5bWJvbAotanVzdCBlbmNvdW50ZXJlZCwgYW5kIHRoZSBzZWNvbmQgZGVzY3JpYmVzIHRoZSBwcmV2aW91cyBzeW1ib2wKLWVuY291bnRlcmVkIHdpdGggdGhlIHNhbWUgbmFtZS4gIE9uZSBvciBib3RoIG9mIHRoZSB0d28gc3ltYm9scyB3aWxsIGJlCi1hIGNvbW1vbiBzeW1ib2wuCi0KLUBlbnVtZXJhdGUKLUBpdGVtCi1UdXJuaW5nIGEgY29tbW9uIHN5bWJvbCBpbnRvIGEgcmVmZXJlbmNlLCBiZWNhdXNlIHRoZXJlIGlzIGFscmVhZHkgYQotZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbC4KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGNvbW1vbiBvZiBgQHZhcntzeW1ib2x9JwotICAgb3ZlcnJpZGRlbiBieSBkZWZpbml0aW9uCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBkZWZpbmVkIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1UdXJuaW5nIGEgY29tbW9uIHN5bWJvbCBpbnRvIGEgcmVmZXJlbmNlLCBiZWNhdXNlIGEgbGF0ZXIgZGVmaW5pdGlvbiBmb3IKLXRoZSBzeW1ib2wgaXMgZW5jb3VudGVyZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBjYXNlLAotZXhjZXB0IHRoYXQgdGhlIHN5bWJvbHMgYXJlIGVuY291bnRlcmVkIGluIGEgZGlmZmVyZW50IG9yZGVyLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogZGVmaW5pdGlvbiBvZiBgQHZhcntzeW1ib2x9JwotICAgb3ZlcnJpZGluZyBjb21tb24KLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbQotTWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2l0aCBhIHByZXZpb3VzIHNhbWUtc2l6ZWQgY29tbW9uIHN5bWJvbC4KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IG11bHRpcGxlIGNvbW1vbgotICAgb2YgYEB2YXJ7c3ltYm9sfScKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IHByZXZpb3VzIGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbQotTWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2l0aCBhIHByZXZpb3VzIGxhcmdlciBjb21tb24gc3ltYm9sLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkZGVuIGJ5IGxhcmdlciBjb21tb24KLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGxhcmdlciBjb21tb24gaXMgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0KLU1lcmdpbmcgYSBjb21tb24gc3ltYm9sIHdpdGggYSBwcmV2aW91cyBzbWFsbGVyIGNvbW1vbiBzeW1ib2wuICBUaGlzIGlzCi10aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgY2FzZSwgZXhjZXB0IHRoYXQgdGhlIHN5bWJvbHMgYXJlCi1lbmNvdW50ZXJlZCBpbiBhIGRpZmZlcmVudCBvcmRlci4KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGNvbW1vbiBvZiBgQHZhcntzeW1ib2x9JwotICAgb3ZlcnJpZGluZyBzbWFsbGVyIGNvbW1vbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogc21hbGxlciBjb21tb24gaXMgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBraW5kZXggLS13YXJuLWNvbnN0cnVjdG9ycwotQGl0ZW0gLS13YXJuLWNvbnN0cnVjdG9ycwotV2FybiBpZiBhbnkgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhcmUgdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGEgZmV3Ci1vYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGZvcm1hdHMgbGlrZSBDT0ZGIG9yIEVMRiwgdGhlIGxpbmtlciBjYW4gbm90Ci1kZXRlY3QgdGhlIHVzZSBvZiBnbG9iYWwgY29uc3RydWN0b3JzLgotCi1Aa2luZGV4IC0td2Fybi1tdWx0aXBsZS1ncAotQGl0ZW0gLS13YXJuLW11bHRpcGxlLWdwCi1XYXJuIGlmIG11bHRpcGxlIGdsb2JhbCBwb2ludGVyIHZhbHVlcyBhcmUgcmVxdWlyZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGNlcnRhaW4gcHJvY2Vzc29ycywgc3VjaCBhcyB0aGUgQWxwaGEuCi1TcGVjaWZpY2FsbHksIHNvbWUgcHJvY2Vzc29ycyBwdXQgbGFyZ2UtdmFsdWVkIGNvbnN0YW50cyBpbiBhIHNwZWNpYWwKLXNlY3Rpb24uICBBIHNwZWNpYWwgcmVnaXN0ZXIgKHRoZSBnbG9iYWwgcG9pbnRlcikgcG9pbnRzIGludG8gdGhlIG1pZGRsZQotb2YgdGhpcyBzZWN0aW9uLCBzbyB0aGF0IGNvbnN0YW50cyBjYW4gYmUgbG9hZGVkIGVmZmljaWVudGx5IHZpYSBhCi1iYXNlLXJlZ2lzdGVyIHJlbGF0aXZlIGFkZHJlc3NpbmcgbW9kZS4gIFNpbmNlIHRoZSBvZmZzZXQgaW4KLWJhc2UtcmVnaXN0ZXIgcmVsYXRpdmUgbW9kZSBpcyBmaXhlZCBhbmQgcmVsYXRpdmVseSBzbWFsbCAoZS5nLiwgMTYKLWJpdHMpLCB0aGlzIGxpbWl0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb25zdGFudCBwb29sLiAgVGh1cywgaW4KLWxhcmdlIHByb2dyYW1zLCBpdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gdXNlIG11bHRpcGxlIGdsb2JhbCBwb2ludGVyCi12YWx1ZXMgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBhZGRyZXNzIGFsbCBwb3NzaWJsZSBjb25zdGFudHMuICBUaGlzCi1vcHRpb24gY2F1c2VzIGEgd2FybmluZyB0byBiZSBpc3N1ZWQgd2hlbmV2ZXIgdGhpcyBjYXNlIG9jY3Vycy4KLQotQGtpbmRleCAtLXdhcm4tb25jZQotQGNpbmRleCB3YXJuaW5ncywgb24gdW5kZWZpbmVkIHN5bWJvbHMKLUBjaW5kZXggdW5kZWZpbmVkIHN5bWJvbHMsIHdhcm5pbmdzIG9uCi1AaXRlbSAtLXdhcm4tb25jZQotT25seSB3YXJuIG9uY2UgZm9yIGVhY2ggdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgbW9kdWxlCi13aGljaCByZWZlcnMgdG8gaXQuCi0KLUBraW5kZXggLS13YXJuLXNlY3Rpb24tYWxpZ24KLUBjaW5kZXggd2FybmluZ3MsIG9uIHNlY3Rpb24gYWxpZ25tZW50Ci1AY2luZGV4IHNlY3Rpb24gYWxpZ25tZW50LCB3YXJuaW5ncyBvbgotQGl0ZW0gLS13YXJuLXNlY3Rpb24tYWxpZ24KLVdhcm4gaWYgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0IHNlY3Rpb24gaXMgY2hhbmdlZCBiZWNhdXNlIG9mCi1hbGlnbm1lbnQuICBUeXBpY2FsbHksIHRoZSBhbGlnbm1lbnQgd2lsbCBiZSBzZXQgYnkgYW4gaW5wdXQgc2VjdGlvbi4KLVRoZSBhZGRyZXNzIHdpbGwgb25seSBiZSBjaGFuZ2VkIGlmIGl0IG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZDsgdGhhdAotaXMsIGlmIHRoZSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCBkb2VzIG5vdCBzcGVjaWZ5IGEgc3RhcnQgYWRkcmVzcyBmb3IKLXRoZSBzZWN0aW9uIChAcHhyZWZ7U0VDVElPTlN9KS4KLQotQGtpbmRleCAtLXdob2xlLWFyY2hpdmUKLUBjaW5kZXggaW5jbHVkaW5nIGFuIGVudGlyZSBhcmNoaXZlCi1AaXRlbSAtLXdob2xlLWFyY2hpdmUKLUZvciBlYWNoIGFyY2hpdmUgbWVudGlvbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgdGhlCi1AY29kZXstLXdob2xlLWFyY2hpdmV9IG9wdGlvbiwgaW5jbHVkZSBldmVyeSBvYmplY3QgZmlsZSBpbiB0aGUgYXJjaGl2ZQotaW4gdGhlIGxpbmssIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBmb3IgdGhlIHJlcXVpcmVkIG9iamVjdAotZmlsZXMuICBUaGlzIGlzIG5vcm1hbGx5IHVzZWQgdG8gdHVybiBhbiBhcmNoaXZlIGZpbGUgaW50byBhIHNoYXJlZAotbGlicmFyeSwgZm9yY2luZyBldmVyeSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzaGFyZWQKLWxpYnJhcnkuICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZS4KLQotQGtpbmRleCAtLXdyYXAKLUBpdGVtIC0td3JhcCBAdmFye3N5bWJvbH0KLVVzZSBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIEB2YXJ7c3ltYm9sfS4gIEFueSB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi1AdmFye3N5bWJvbH0gd2lsbCBiZSByZXNvbHZlZCB0byBAY29kZXtfX3dyYXBfQHZhcntzeW1ib2x9fS4gIEFueQotdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBAY29kZXtfX3JlYWxfQHZhcntzeW1ib2x9fSB3aWxsIGJlIHJlc29sdmVkIHRvCi1AdmFye3N5bWJvbH0uCi0KLVRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHdyYXBwZXIgZm9yIGEgc3lzdGVtIGZ1bmN0aW9uLiAgVGhlCi13cmFwcGVyIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgQGNvZGV7X193cmFwX0B2YXJ7c3ltYm9sfX0uICBJZiBpdAotd2lzaGVzIHRvIGNhbGwgdGhlIHN5c3RlbSBmdW5jdGlvbiwgaXQgc2hvdWxkIGNhbGwKLUBjb2Rle19fcmVhbF9AdmFye3N5bWJvbH19LgotCi1IZXJlIGlzIGEgdHJpdmlhbCBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi12b2lkICoKLV9fd3JhcF9tYWxsb2MgKGludCBjKQotQHsKLSAgcHJpbnRmICgibWFsbG9jIGNhbGxlZCB3aXRoICVsZFxuIiwgYyk7Ci0gIHJldHVybiBfX3JlYWxfbWFsbG9jIChjKTsKLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhpcyBmaWxlIHVzaW5nIEBjb2Rley0td3JhcCBtYWxsb2N9LCB0aGVuCi1hbGwgY2FsbHMgdG8gQGNvZGV7bWFsbG9jfSB3aWxsIGNhbGwgdGhlIGZ1bmN0aW9uIEBjb2Rle19fd3JhcF9tYWxsb2N9Ci1pbnN0ZWFkLiAgVGhlIGNhbGwgdG8gQGNvZGV7X19yZWFsX21hbGxvY30gaW4gQGNvZGV7X193cmFwX21hbGxvY30gd2lsbAotY2FsbCB0aGUgcmVhbCBAY29kZXttYWxsb2N9IGZ1bmN0aW9uLgotCi1Zb3UgbWF5IHdpc2ggdG8gcHJvdmlkZSBhIEBjb2Rle19fcmVhbF9tYWxsb2N9IGZ1bmN0aW9uIGFzIHdlbGwsIHNvIHRoYXQKLWxpbmtzIHdpdGhvdXQgdGhlIEBjb2Rley0td3JhcH0gb3B0aW9uIHdpbGwgc3VjY2VlZC4gIElmIHlvdSBkbyB0aGlzLAoteW91IHNob3VsZCBub3QgcHV0IHRoZSBkZWZpbml0aW9uIG9mIEBjb2Rle19fcmVhbF9tYWxsb2N9IGluIHRoZSBzYW1lCi1maWxlIGFzIEBjb2Rle19fd3JhcF9tYWxsb2N9OyBpZiB5b3UgZG8sIHRoZSBhc3NlbWJsZXIgbWF5IHJlc29sdmUgdGhlCi1jYWxsIGJlZm9yZSB0aGUgbGlua2VyIGhhcyBhIGNoYW5jZSB0byB3cmFwIGl0IHRvIEBjb2Rle21hbGxvY30uCi0KLUBlbmQgdGFibGUKLQotQHN1YnNlY3Rpb24gT3B0aW9ucyBzcGVjaWZpYyB0byBpMzg2IFBFIHRhcmdldHMKLQotVGhlIGkzODYgUEUgbGlua2VyIHN1cHBvcnRzIHRoZSBAY29kZXstc2hhcmVkfSBvcHRpb24sIHdoaWNoIGNhdXNlcwotdGhlIG91dHB1dCB0byBiZSBhIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJ5IChETEwpIGluc3RlYWQgb2YgYQotbm9ybWFsIGV4ZWN1dGFibGUuICBZb3Ugc2hvdWxkIG5hbWUgdGhlIG91dHB1dCBAY29kZXsqLmRsbH0gd2hlbiB5b3UKLXVzZSB0aGlzIG9wdGlvbi4gIEluIGFkZGl0aW9uLCB0aGUgbGlua2VyIGZ1bGx5IHN1cHBvcnRzIHRoZSBzdGFuZGFyZAotQGNvZGV7Ki5kZWZ9IGZpbGVzLCB3aGljaCBtYXkgYmUgc3BlY2lmaWVkIG9uIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lCi1saWtlIGFuIG9iamVjdCBmaWxlIChpbiBmYWN0LCBpdCBzaG91bGQgcHJlY2VkZSBhcmNoaXZlcyBpdCBleHBvcnRzCi1zeW1ib2xzIGZyb20sIHRvIGVuc3VyZSB0aGF0IHRoZXkgZ2V0IGxpbmtlZCBpbiwganVzdCBsaWtlIGEgbm9ybWFsCi1vYmplY3QgZmlsZSkuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBvcHRpb25zIGNvbW1vbiB0byBhbGwgdGFyZ2V0cywgdGhlIGkzODYgUEUgbGlua2VyCi1zdXBwb3J0IGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIG9wdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIGkzODYKLVBFIHRhcmdldC4gIE9wdGlvbnMgdGhhdCB0YWtlIHZhbHVlcyBtYXkgYmUgc2VwYXJhdGVkIGZyb20gdGhlaXIKLXZhbHVlcyBieSBlaXRoZXIgYSBzcGFjZSBvciBhbiBlcXVhbHMgc2lnbi4KLQotQHRhYmxlIEBjb2RlCi0KLUBraW5kZXggLS1hZGQtc3RkY2FsbC1hbGlhcwotQGl0ZW0gLS1hZGQtc3RkY2FsbC1hbGlhcwotSWYgZ2l2ZW4sIHN5bWJvbHMgd2l0aCBhIHN0ZGNhbGwgc3VmZml4IChAQEB2YXJ7bm59KSB3aWxsIGJlIGV4cG9ydGVkCi1hcy1pcyBhbmQgYWxzbyB3aXRoIHRoZSBzdWZmaXggc3RyaXBwZWQuCi0KLUBraW5kZXggLS1iYXNlLWZpbGUKLUBpdGVtIC0tYmFzZS1maWxlIEB2YXJ7ZmlsZX0KLVVzZSBAdmFye2ZpbGV9IGFzIHRoZSBuYW1lIG9mIGEgZmlsZSBpbiB3aGljaCB0byBzYXZlIHRoZSBiYXNlCi1hZGRyZXNzZXMgb2YgYWxsIHRoZSByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIGdlbmVyYXRpbmcgRExMcyB3aXRoCi1AZmlsZXtkbGx0b29sfS4KLQotQGtpbmRleCAtLWRsbAotQGl0ZW0gLS1kbGwKLUNyZWF0ZSBhIERMTCBpbnN0ZWFkIG9mIGEgcmVndWxhciBleGVjdXRhYmxlLiAgWW91IG1heSBhbHNvIHVzZQotQGNvZGV7LXNoYXJlZH0gb3Igc3BlY2lmeSBhIEBjb2Rle0xJQlJBUll9IGluIGEgZ2l2ZW4gQGNvZGV7LmRlZn0KLWZpbGUuCi0KLUBraW5kZXggLS1lbmFibGUtc3RkY2FsbC1maXh1cAotQGtpbmRleCAtLWRpc2FibGUtc3RkY2FsbC1maXh1cAotQGl0ZW0gLS1lbmFibGUtc3RkY2FsbC1maXh1cAotQGl0ZW14IC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwCi1JZiB0aGUgbGluayBmaW5kcyBhIHN5bWJvbCB0aGF0IGl0IGNhbm5vdCByZXNvbHZlLCBpdCB3aWxsIGF0dGVtcHQgdG8KLWRvICJmdXp6eSBsaW5raW5nIiBieSBsb29raW5nIGZvciBhbm90aGVyIGRlZmluZWQgc3ltYm9sIHRoYXQgZGlmZmVycwotb25seSBpbiB0aGUgZm9ybWF0IG9mIHRoZSBzeW1ib2wgbmFtZSAoY2RlY2wgdnMgc3RkY2FsbCkgYW5kIHdpbGwKLXJlc29sdmUgdGhhdCBzeW1ib2wgYnkgbGlua2luZyB0byB0aGUgbWF0Y2guICBGb3IgZXhhbXBsZSwgdGhlCi11bmRlZmluZWQgc3ltYm9sIEBjb2Rle19mb299IG1pZ2h0IGJlIGxpbmtlZCB0byB0aGUgZnVuY3Rpb24KLUBjb2Rle19mb29AQDEyfSwgb3IgdGhlIHVuZGVmaW5lZCBzeW1ib2wgQGNvZGV7X2JhckBAMTZ9IG1pZ2h0IGJlIGxpbmtlZAotdG8gdGhlIGZ1bmN0aW9uIEBjb2Rle19iYXJ9LiAgV2hlbiB0aGUgbGlua2VyIGRvZXMgdGhpcywgaXQgcHJpbnRzIGEKLXdhcm5pbmcsIHNpbmNlIGl0IG5vcm1hbGx5IHNob3VsZCBoYXZlIGZhaWxlZCB0byBsaW5rLCBidXQgc29tZXRpbWVzCi1pbXBvcnQgbGlicmFyaWVzIGdlbmVyYXRlZCBmcm9tIHRoaXJkLXBhcnR5IGRsbHMgbWF5IG5lZWQgdGhpcyBmZWF0dXJlCi10byBiZSB1c2FibGUuICBJZiB5b3Ugc3BlY2lmeSBAY29kZXstLWVuYWJsZS1zdGRjYWxsLWZpeHVwfSwgdGhpcwotZmVhdHVyZSBpcyBmdWxseSBlbmFibGVkIGFuZCB3YXJuaW5ncyBhcmUgbm90IHByaW50ZWQuICBJZiB5b3Ugc3BlY2lmeQotQGNvZGV7LS1kaXNhYmxlLXN0ZGNhbGwtZml4dXB9LCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYW5kIHN1Y2gKLW1pc21hdGNoZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZXJyb3JzLgotCi1AY2luZGV4IERMTHMsIGNyZWF0aW5nCi1Aa2luZGV4IC0tZXhwb3J0LWFsbC1zeW1ib2xzCi1AaXRlbSAtLWV4cG9ydC1hbGwtc3ltYm9scwotSWYgZ2l2ZW4sIGFsbCBnbG9iYWwgc3ltYm9scyBpbiB0aGUgb2JqZWN0cyB1c2VkIHRvIGJ1aWxkIGEgRExMIHdpbGwKLWJlIGV4cG9ydGVkIGJ5IHRoZSBETEwuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgZGVmYXVsdCBpZiB0aGVyZQotb3RoZXJ3aXNlIHdvdWxkbid0IGJlIGFueSBleHBvcnRlZCBzeW1ib2xzLiAgV2hlbiBzeW1ib2xzIGFyZQotZXhwbGljaXRseSBleHBvcnRlZCB2aWEgREVGIGZpbGVzIG9yIGltcGxpY2l0bHkgZXhwb3J0ZWQgdmlhIGZ1bmN0aW9uCi1hdHRyaWJ1dGVzLCB0aGUgZGVmYXVsdCBpcyB0byBub3QgZXhwb3J0IGFueXRoaW5nIGVsc2UgdW5sZXNzIHRoaXMKLW9wdGlvbiBpcyBnaXZlbi4gIE5vdGUgdGhhdCB0aGUgc3ltYm9scyBAY29kZXtEbGxNYWluQEAxMn0sCi1AY29kZXtEbGxFbnRyeVBvaW50QEAwfSwgYW5kIEBjb2Rle2ltcHVyZV9wdHJ9IHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkKLWV4cG9ydGVkLgotCi1Aa2luZGV4IC0tZXhjbHVkZS1zeW1ib2xzCi1AaXRlbSAtLWV4Y2x1ZGUtc3ltYm9scyBAdmFye3N5bWJvbH0sQHZhcntzeW1ib2x9LC4uLgotU3BlY2lmaWVzIGEgbGlzdCBvZiBzeW1ib2xzIHdoaWNoIHNob3VsZCBub3QgYmUgYXV0b21hdGljYWxseQotZXhwb3J0ZWQuICBUaGUgc3ltYm9sIG5hbWVzIG1heSBiZSBkZWxpbWl0ZWQgYnkgY29tbWFzIG9yIGNvbG9ucy4KLQotQGtpbmRleCAtLWZpbGUtYWxpZ25tZW50Ci1AaXRlbSAtLWZpbGUtYWxpZ25tZW50Ci1TcGVjaWZ5IHRoZSBmaWxlIGFsaWdubWVudC4gIFNlY3Rpb25zIGluIHRoZSBmaWxlIHdpbGwgYWx3YXlzIGJlZ2luIGF0Ci1maWxlIG9mZnNldHMgd2hpY2ggYXJlIG11bHRpcGxlcyBvZiB0aGlzIG51bWJlci4gIFRoaXMgZGVmYXVsdHMgdG8KLTUxMi4KLQotQGNpbmRleCBoZWFwIHNpemUKLUBraW5kZXggLS1oZWFwCi1AaXRlbSAtLWhlYXAgQHZhcntyZXNlcnZlfQotQGl0ZW14IC0taGVhcCBAdmFye3Jlc2VydmV9LEB2YXJ7Y29tbWl0fQotU3BlY2lmeSB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlIChhbmQgb3B0aW9uYWxseSBjb21taXQpIHRvIGJlCi11c2VkIGFzIGhlYXAgZm9yIHRoaXMgcHJvZ3JhbS4gIFRoZSBkZWZhdWx0IGlzIDFNYiByZXNlcnZlZCwgNEsKLWNvbW1pdHRlZC4KLQotQGNpbmRleCBpbWFnZSBiYXNlCi1Aa2luZGV4IC0taW1hZ2UtYmFzZQotQGl0ZW0gLS1pbWFnZS1iYXNlIEB2YXJ7dmFsdWV9Ci1Vc2UgQHZhcnt2YWx1ZX0gYXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB5b3VyIHByb2dyYW0gb3IgZGxsLiAgVGhpcyBpcwotdGhlIGxvd2VzdCBtZW1vcnkgbG9jYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3VyIHByb2dyYW0gb3IgZGxsCi1pcyBsb2FkZWQuICBUbyByZWR1Y2UgdGhlIG5lZWQgdG8gcmVsb2NhdGUgYW5kIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YKLXlvdXIgZGxscywgZWFjaCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBiYXNlIGFkZHJlc3MgYW5kIG5vdCBvdmVybGFwIGFueQotb3RoZXIgZGxscy4gIFRoZSBkZWZhdWx0IGlzIDB4NDAwMDAwIGZvciBleGVjdXRhYmxlcywgYW5kIDB4MTAwMDAwMDAKLWZvciBkbGxzLgotCi1Aa2luZGV4IC0ta2lsbC1hdAotQGl0ZW0gLS1raWxsLWF0Ci1JZiBnaXZlbiwgdGhlIHN0ZGNhbGwgc3VmZml4ZXMgKEBAQHZhcntubn0pIHdpbGwgYmUgc3RyaXBwZWQgZnJvbQotc3ltYm9scyBiZWZvcmUgdGhleSBhcmUgZXhwb3J0ZWQuCi0KLUBraW5kZXggLS1tYWpvci1pbWFnZS12ZXJzaW9uCi1AaXRlbSAtLW1ham9yLWltYWdlLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgImltYWdlIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMS4KLQotQGtpbmRleCAtLW1ham9yLW9zLXZlcnNpb24KLUBpdGVtIC0tbWFqb3Itb3MtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAib3MgdmVyc2lvbiIuICBEZWZhdWx0cyB0byA0LgotCi1Aa2luZGV4IC0tbWFqb3Itc3Vic3lzdGVtLXZlcnNpb24KLUBpdGVtIC0tbWFqb3Itc3Vic3lzdGVtLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgInN1YnN5c3RlbSB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDQuCi0KLUBraW5kZXggLS1taW5vci1pbWFnZS12ZXJzaW9uCi1AaXRlbSAtLW1pbm9yLWltYWdlLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgImltYWdlIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMC4KLQotQGtpbmRleCAtLW1pbm9yLW9zLXZlcnNpb24KLUBpdGVtIC0tbWlub3Itb3MtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAib3MgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAwLgotCi1Aa2luZGV4IC0tbWlub3Itc3Vic3lzdGVtLXZlcnNpb24KLUBpdGVtIC0tbWlub3Itc3Vic3lzdGVtLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgInN1YnN5c3RlbSB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDAuCi0KLUBjaW5kZXggREVGIGZpbGVzLCBjcmVhdGluZwotQGNpbmRleCBETExzLCBjcmVhdGluZwotQGtpbmRleCAtLW91dHB1dC1kZWYKLUBpdGVtIC0tb3V0cHV0LWRlZiBAdmFye2ZpbGV9Ci1UaGUgbGlua2VyIHdpbGwgY3JlYXRlIHRoZSBmaWxlIEB2YXJ7ZmlsZX0gd2hpY2ggd2lsbCBjb250YWluIGEgREVGCi1maWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIERMTCB0aGUgbGlua2VyIGlzIGdlbmVyYXRpbmcuICBUaGlzIERFRiBmaWxlCi0od2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBAY29kZXsqLmRlZn0pIG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpbXBvcnQKLWxpYnJhcnkgd2l0aCBAY29kZXtkbGx0b29sfSBvciBtYXkgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSB0bwotYXV0b21hdGljYWxseSBvciBpbXBsaWNpdGx5IGV4cG9ydGVkIHN5bWJvbHMuCi0KLUBraW5kZXggLS1zZWN0aW9uLWFsaWdubWVudAotQGl0ZW0gLS1zZWN0aW9uLWFsaWdubWVudAotU2V0cyB0aGUgc2VjdGlvbiBhbGlnbm1lbnQuICBTZWN0aW9ucyBpbiBtZW1vcnkgd2lsbCBhbHdheXMgYmVnaW4gYXQKLWFkZHJlc3NlcyB3aGljaCBhcmUgYSBtdWx0aXBsZSBvZiB0aGlzIG51bWJlci4gIERlZmF1bHRzIHRvIDB4MTAwMC4KLQotQGNpbmRleCBzdGFjayBzaXplCi1Aa2luZGV4IC0tc3RhY2sKLUBpdGVtIC0tc3RhY2sgQHZhcntyZXNlcnZlfQotQGl0ZW14IC0tc3RhY2sgQHZhcntyZXNlcnZlfSxAdmFye2NvbW1pdH0KLVNwZWNpZnkgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVzZXJ2ZSAoYW5kIG9wdGlvbmFsbHkgY29tbWl0KSB0byBiZQotdXNlZCBhcyBzdGFjayBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIGRlZmF1bHQgaXMgMzJNYiByZXNlcnZlZCwgNEsKLWNvbW1pdHRlZC4KLQotQGtpbmRleCAtLXN1YnN5c3RlbQotQGl0ZW0gLS1zdWJzeXN0ZW0gQHZhcnt3aGljaH0KLUBpdGVteCAtLXN1YnN5c3RlbSBAdmFye3doaWNofTpAdmFye21ham9yfQotQGl0ZW14IC0tc3Vic3lzdGVtIEB2YXJ7d2hpY2h9OkB2YXJ7bWFqb3J9LkB2YXJ7bWlub3J9Ci1TcGVjaWZpZXMgdGhlIHN1YnN5c3RlbSB1bmRlciB3aGljaCB5b3VyIHByb2dyYW0gd2lsbCBleGVjdXRlLiAgVGhlCi1sZWdhbCB2YWx1ZXMgZm9yIEB2YXJ7d2hpY2h9IGFyZSBAY29kZXtuYXRpdmV9LCBAY29kZXt3aW5kb3dzfSwKLUBjb2Rle2NvbnNvbGV9LCBhbmQgQGNvZGV7cG9zaXh9LiAgWW91IG1heSBvcHRpb25hbGx5IHNldCB0aGUKLXN1YnN5c3RlbSB2ZXJzaW9uIGFsc28uCi0KLUBlbmQgdGFibGUKLQotQGlmc2V0IFVzZXNFbnZWYXJzCi1Abm9kZSBFbnZpcm9ubWVudAotQHNlY3Rpb24gRW52aXJvbm1lbnQgVmFyaWFibGVzCi0KLVlvdSBjYW4gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBAY29kZXtsZH0gd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCi1AY29kZXtHTlVUQVJHRVR9LCBAY29kZXtMREVNVUxBVElPTn0sIGFuZCBAY29kZXtDT0xMRUNUX05PX0RFTUFOR0xFfS4KLQotQGtpbmRleCBHTlVUQVJHRVQKLUBjaW5kZXggZGVmYXVsdCBpbnB1dCBmb3JtYXQKLUBjb2Rle0dOVVRBUkdFVH0gZGV0ZXJtaW5lcyB0aGUgaW5wdXQtZmlsZSBvYmplY3QgZm9ybWF0IGlmIHlvdSBkb24ndAotdXNlIEBzYW1wey1ifSAob3IgaXRzIHN5bm9ueW0gQHNhbXB7LS1mb3JtYXR9KS4gIEl0cyB2YWx1ZSBzaG91bGQgYmUgb25lCi1vZiB0aGUgQkZEIG5hbWVzIGZvciBhbiBpbnB1dCBmb3JtYXQgKEBweHJlZntCRkR9KS4gIElmIHRoZXJlIGlzIG5vCi1AY29kZXtHTlVUQVJHRVR9IGluIHRoZSBlbnZpcm9ubWVudCwgQGNvZGV7bGR9IHVzZXMgdGhlIG5hdHVyYWwgZm9ybWF0Ci1vZiB0aGUgdGFyZ2V0LiBJZiBAY29kZXtHTlVUQVJHRVR9IGlzIHNldCB0byBAY29kZXtkZWZhdWx0fSB0aGVuIEJGRAotYXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlIGlucHV0IGZvcm1hdCBieSBleGFtaW5pbmcgYmluYXJ5IGlucHV0IGZpbGVzOwotdGhpcyBtZXRob2Qgb2Z0ZW4gc3VjY2VlZHMsIGJ1dCB0aGVyZSBhcmUgcG90ZW50aWFsIGFtYmlndWl0aWVzLCBzaW5jZQotdGhlcmUgaXMgbm8gbWV0aG9kIG9mIGVuc3VyaW5nIHRoYXQgdGhlIG1hZ2ljIG51bWJlciB1c2VkIHRvIHNwZWNpZnkKLW9iamVjdC1maWxlIGZvcm1hdHMgaXMgdW5pcXVlLiAgSG93ZXZlciwgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlIGZvcgotQkZEIG9uIGVhY2ggc3lzdGVtIHBsYWNlcyB0aGUgY29udmVudGlvbmFsIGZvcm1hdCBmb3IgdGhhdCBzeXN0ZW0gZmlyc3QKLWluIHRoZSBzZWFyY2gtbGlzdCwgc28gYW1iaWd1aXRpZXMgYXJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvbnZlbnRpb24uCi0KLUBraW5kZXggTERFTVVMQVRJT04KLUBjaW5kZXggZGVmYXVsdCBlbXVsYXRpb24KLUBjaW5kZXggZW11bGF0aW9uLCBkZWZhdWx0Ci1AY29kZXtMREVNVUxBVElPTn0gZGV0ZXJtaW5lcyB0aGUgZGVmYXVsdCBlbXVsYXRpb24gaWYgeW91IGRvbid0IHVzZSB0aGUKLUBzYW1wey1tfSBvcHRpb24uICBUaGUgZW11bGF0aW9uIGNhbiBhZmZlY3QgdmFyaW91cyBhc3BlY3RzIG9mIGxpbmtlcgotYmVoYXZpb3VyLCBwYXJ0aWN1bGFybHkgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIFlvdSBjYW4gbGlzdCB0aGUKLWF2YWlsYWJsZSBlbXVsYXRpb25zIHdpdGggdGhlIEBzYW1wey0tdmVyYm9zZX0gb3IgQHNhbXB7LVZ9IG9wdGlvbnMuICBJZgotdGhlIEBzYW1wey1tfSBvcHRpb24gaXMgbm90IHVzZWQsIGFuZCB0aGUgQGNvZGV7TERFTVVMQVRJT059IGVudmlyb25tZW50Ci12YXJpYWJsZSBpcyBub3QgZGVmaW5lZCwgdGhlIGRlZmF1bHQgZW11bGF0aW9uIGRlcGVuZHMgdXBvbiBob3cgdGhlCi1saW5rZXIgd2FzIGNvbmZpZ3VyZWQuCi1AZW5kIGlmc2V0Ci0KLUBraW5kZXggQ09MTEVDVF9OT19ERU1BTkdMRQotQGNpbmRleCBkZW1hbmdsaW5nLCBkZWZhdWx0Ci1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIGRlZmF1bHQgdG8gZGVtYW5nbGluZyBzeW1ib2xzLiAgSG93ZXZlciwgaWYKLUBjb2Rle0NPTExFQ1RfTk9fREVNQU5HTEV9IGlzIHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIHRoZW4gaXQgd2lsbAotZGVmYXVsdCB0byBub3QgZGVtYW5nbGluZyBzeW1ib2xzLiAgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkIGluCi1hIHNpbWlsYXIgZmFzaGlvbiBieSB0aGUgQGNvZGV7Z2NjfSBsaW5rZXIgd3JhcHBlciBwcm9ncmFtLiAgVGhlIGRlZmF1bHQKLW1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBAc2FtcHstLWRlbWFuZ2xlfSBhbmQgQHNhbXB7LS1uby1kZW1hbmdsZX0KLW9wdGlvbnMuCi0KLUBub2RlIFNjcmlwdHMKLUBjaGFwdGVyIExpbmtlciBTY3JpcHRzCi0KLUBjaW5kZXggc2NyaXB0cwotQGNpbmRleCBsaW5rZXIgc2NyaXB0cwotQGNpbmRleCBjb21tYW5kIGZpbGVzCi1FdmVyeSBsaW5rIGlzIGNvbnRyb2xsZWQgYnkgYSBAZGZue2xpbmtlciBzY3JpcHR9LiAgVGhpcyBzY3JpcHQgaXMKLXdyaXR0ZW4gaW4gdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLgotCi1UaGUgbWFpbiBwdXJwb3NlIG9mIHRoZSBsaW5rZXIgc2NyaXB0IGlzIHRvIGRlc2NyaWJlIGhvdyB0aGUgc2VjdGlvbnMgaW4KLXRoZSBpbnB1dCBmaWxlcyBzaG91bGQgYmUgbWFwcGVkIGludG8gdGhlIG91dHB1dCBmaWxlLCBhbmQgdG8gY29udHJvbAotdGhlIG1lbW9yeSBsYXlvdXQgb2YgdGhlIG91dHB1dCBmaWxlLiAgTW9zdCBsaW5rZXIgc2NyaXB0cyBkbyBub3RoaW5nCi1tb3JlIHRoYW4gdGhpcy4gIEhvd2V2ZXIsIHdoZW4gbmVjZXNzYXJ5LCB0aGUgbGlua2VyIHNjcmlwdCBjYW4gYWxzbwotZGlyZWN0IHRoZSBsaW5rZXIgdG8gcGVyZm9ybSBtYW55IG90aGVyIG9wZXJhdGlvbnMsIHVzaW5nIHRoZSBjb21tYW5kcwotZGVzY3JpYmVkIGJlbG93LgotCi1UaGUgbGlua2VyIGFsd2F5cyB1c2VzIGEgbGlua2VyIHNjcmlwdC4gIElmIHlvdSBkbyBub3Qgc3VwcGx5IG9uZQoteW91cnNlbGYsIHRoZSBsaW5rZXIgd2lsbCB1c2UgYSBkZWZhdWx0IHNjcmlwdCB0aGF0IGlzIGNvbXBpbGVkIGludG8gdGhlCi1saW5rZXIgZXhlY3V0YWJsZS4gIFlvdSBjYW4gdXNlIHRoZSBAc2FtcHstLXZlcmJvc2V9IGNvbW1hbmQgbGluZSBvcHRpb24KLXRvIGRpc3BsYXkgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIENlcnRhaW4gY29tbWFuZCBsaW5lIG9wdGlvbnMsCi1zdWNoIGFzIEBzYW1wey1yfSBvciBAc2FtcHstTn0sIHdpbGwgYWZmZWN0IHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuCi0KLVlvdSBtYXkgc3VwcGx5IHlvdXIgb3duIGxpbmtlciBzY3JpcHQgYnkgdXNpbmcgdGhlIEBzYW1wey1UfSBjb21tYW5kCi1saW5lIG9wdGlvbi4gIFdoZW4geW91IGRvIHRoaXMsIHlvdXIgbGlua2VyIHNjcmlwdCB3aWxsIHJlcGxhY2UgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHQuCi0KLVlvdSBtYXkgYWxzbyB1c2UgbGlua2VyIHNjcmlwdHMgaW1wbGljaXRseSBieSBuYW1pbmcgdGhlbSBhcyBpbnB1dCBmaWxlcwotdG8gdGhlIGxpbmtlciwgYXMgdGhvdWdoIHRoZXkgd2VyZSBmaWxlcyB0byBiZSBsaW5rZWQuICBAeHJlZntJbXBsaWNpdAotTGlua2VyIFNjcmlwdHN9LgotCi1AbWVudQotKiBCYXNpYyBTY3JpcHQgQ29uY2VwdHM6OglCYXNpYyBMaW5rZXIgU2NyaXB0IENvbmNlcHRzCi0qIFNjcmlwdCBGb3JtYXQ6OgkJTGlua2VyIFNjcmlwdCBGb3JtYXQKLSogU2ltcGxlIEV4YW1wbGU6OgkJU2ltcGxlIExpbmtlciBTY3JpcHQgRXhhbXBsZQotKiBTaW1wbGUgQ29tbWFuZHM6OgkJU2ltcGxlIExpbmtlciBTY3JpcHQgQ29tbWFuZHMKLSogQXNzaWdubWVudHM6OgkJCUFzc2lnbmluZyBWYWx1ZXMgdG8gU3ltYm9scwotKiBTRUNUSU9OUzo6CQkJU0VDVElPTlMgQ29tbWFuZAotKiBNRU1PUlk6OgkJCU1FTU9SWSBDb21tYW5kCi0qIFBIRFJTOjoJCQlQSERSUyBDb21tYW5kCi0qIFZFUlNJT046OgkJCVZFUlNJT04gQ29tbWFuZAotKiBFeHByZXNzaW9uczo6CQkJRXhwcmVzc2lvbnMgaW4gTGlua2VyIFNjcmlwdHMKLSogSW1wbGljaXQgTGlua2VyIFNjcmlwdHM6OglJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cwotQGVuZCBtZW51Ci0KLUBub2RlIEJhc2ljIFNjcmlwdCBDb25jZXB0cwotQHNlY3Rpb24gQmFzaWMgTGlua2VyIFNjcmlwdCBDb25jZXB0cwotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGNvbmNlcHRzCi1XZSBuZWVkIHRvIGRlZmluZSBzb21lIGJhc2ljIGNvbmNlcHRzIGFuZCB2b2NhYnVsYXJ5IGluIG9yZGVyIHRvCi1kZXNjcmliZSB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotVGhlIGxpbmtlciBjb21iaW5lcyBpbnB1dCBmaWxlcyBpbnRvIGEgc2luZ2xlIG91dHB1dCBmaWxlLiAgVGhlIG91dHB1dAotZmlsZSBhbmQgZWFjaCBpbnB1dCBmaWxlIGFyZSBpbiBhIHNwZWNpYWwgZGF0YSBmb3JtYXQga25vd24gYXMgYW4KLUBkZm57b2JqZWN0IGZpbGUgZm9ybWF0fS4gIEVhY2ggZmlsZSBpcyBjYWxsZWQgYW4gQGRmbntvYmplY3QgZmlsZX0uCi1UaGUgb3V0cHV0IGZpbGUgaXMgb2Z0ZW4gY2FsbGVkIGFuIEBkZm57ZXhlY3V0YWJsZX0sIGJ1dCBmb3Igb3VyCi1wdXJwb3NlcyB3ZSB3aWxsIGFsc28gY2FsbCBpdCBhbiBvYmplY3QgZmlsZS4gIEVhY2ggb2JqZWN0IGZpbGUgaGFzLAotYW1vbmcgb3RoZXIgdGhpbmdzLCBhIGxpc3Qgb2YgQGRmbntzZWN0aW9uc30uICBXZSBzb21ldGltZXMgcmVmZXIgdG8gYQotc2VjdGlvbiBpbiBhbiBpbnB1dCBmaWxlIGFzIGFuIEBkZm57aW5wdXQgc2VjdGlvbn07IHNpbWlsYXJseSwgYSBzZWN0aW9uCi1pbiB0aGUgb3V0cHV0IGZpbGUgaXMgYW4gQGRmbntvdXRwdXQgc2VjdGlvbn0uCi0KLUVhY2ggc2VjdGlvbiBpbiBhbiBvYmplY3QgZmlsZSBoYXMgYSBuYW1lIGFuZCBhIHNpemUuICBNb3N0IHNlY3Rpb25zCi1hbHNvIGhhdmUgYW4gYXNzb2NpYXRlZCBibG9jayBvZiBkYXRhLCBrbm93biBhcyB0aGUgQGRmbntzZWN0aW9uCi1jb250ZW50c30uICBBIHNlY3Rpb24gbWF5IGJlIG1hcmtlZCBhcyBAZGZue2xvYWRhYmxlfSwgd2hpY2ggbWVhbiB0aGF0Ci10aGUgY29udGVudHMgc2hvdWxkIGJlIGxvYWRlZCBpbnRvIG1lbW9yeSB3aGVuIHRoZSBvdXRwdXQgZmlsZSBpcyBydW4uCi1BIHNlY3Rpb24gd2l0aCBubyBjb250ZW50cyBtYXkgYmUgQGRmbnthbGxvY2F0YWJsZX0sIHdoaWNoIG1lYW5zIHRoYXQgYW4KLWFyZWEgaW4gbWVtb3J5IHNob3VsZCBiZSBzZXQgYXNpZGUsIGJ1dCBub3RoaW5nIGluIHBhcnRpY3VsYXIgc2hvdWxkIGJlCi1sb2FkZWQgdGhlcmUgKGluIHNvbWUgY2FzZXMgdGhpcyBtZW1vcnkgbXVzdCBiZSB6ZXJvZWQgb3V0KS4gIEEgc2VjdGlvbgotd2hpY2ggaXMgbmVpdGhlciBsb2FkYWJsZSBub3IgYWxsb2NhdGFibGUgdHlwaWNhbGx5IGNvbnRhaW5zIHNvbWUgc29ydAotb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi1FdmVyeSBsb2FkYWJsZSBvciBhbGxvY2F0YWJsZSBvdXRwdXQgc2VjdGlvbiBoYXMgdHdvIGFkZHJlc3Nlcy4gIFRoZQotZmlyc3QgaXMgdGhlIEBkZm57Vk1BfSwgb3IgdmlydHVhbCBtZW1vcnkgYWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MKLXRoZSBzZWN0aW9uIHdpbGwgaGF2ZSB3aGVuIHRoZSBvdXRwdXQgZmlsZSBpcyBydW4uICBUaGUgc2Vjb25kIGlzIHRoZQotQGRmbntMTUF9LCBvciBsb2FkIG1lbW9yeSBhZGRyZXNzLiAgVGhpcyBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGUKLXNlY3Rpb24gd2lsbCBiZSBsb2FkZWQuICBJbiBtb3N0IGNhc2VzIHRoZSB0d28gYWRkcmVzc2VzIHdpbGwgYmUgdGhlCi1zYW1lLiAgQW4gZXhhbXBsZSBvZiB3aGVuIHRoZXkgbWlnaHQgYmUgZGlmZmVyZW50IGlzIHdoZW4gYSBkYXRhIHNlY3Rpb24KLWlzIGxvYWRlZCBpbnRvIFJPTSwgYW5kIHRoZW4gY29waWVkIGludG8gUkFNIHdoZW4gdGhlIHByb2dyYW0gc3RhcnRzIHVwCi0odGhpcyB0ZWNobmlxdWUgaXMgb2Z0ZW4gdXNlZCB0byBpbml0aWFsaXplIGdsb2JhbCB2YXJpYWJsZXMgaW4gYSBST00KLWJhc2VkIHN5c3RlbSkuICBJbiB0aGlzIGNhc2UgdGhlIFJPTSBhZGRyZXNzIHdvdWxkIGJlIHRoZSBMTUEsIGFuZCB0aGUKLVJBTSBhZGRyZXNzIHdvdWxkIGJlIHRoZSBWTUEuCi0KLVlvdSBjYW4gc2VlIHRoZSBzZWN0aW9ucyBpbiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0KLXByb2dyYW0gd2l0aCB0aGUgQHNhbXB7LWh9IG9wdGlvbi4KLQotRXZlcnkgb2JqZWN0IGZpbGUgYWxzbyBoYXMgYSBsaXN0IG9mIEBkZm57c3ltYm9sc30sIGtub3duIGFzIHRoZQotQGRmbntzeW1ib2wgdGFibGV9LiAgQSBzeW1ib2wgbWF5IGJlIGRlZmluZWQgb3IgdW5kZWZpbmVkLiAgRWFjaCBzeW1ib2wKLWhhcyBhIG5hbWUsIGFuZCBlYWNoIGRlZmluZWQgc3ltYm9sIGhhcyBhbiBhZGRyZXNzLCBhbW9uZyBvdGhlcgotaW5mb3JtYXRpb24uICBJZiB5b3UgY29tcGlsZSBhIEMgb3IgQysrIHByb2dyYW0gaW50byBhbiBvYmplY3QgZmlsZSwgeW91Ci13aWxsIGdldCBhIGRlZmluZWQgc3ltYm9sIGZvciBldmVyeSBkZWZpbmVkIGZ1bmN0aW9uIGFuZCBnbG9iYWwgb3IKLXN0YXRpYyB2YXJpYWJsZS4gIEV2ZXJ5IHVuZGVmaW5lZCBmdW5jdGlvbiBvciBnbG9iYWwgdmFyaWFibGUgd2hpY2ggaXMKLXJlZmVyZW5jZWQgaW4gdGhlIGlucHV0IGZpbGUgd2lsbCBiZWNvbWUgYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQotWW91IGNhbiBzZWUgdGhlIHN5bWJvbHMgaW4gYW4gb2JqZWN0IGZpbGUgYnkgdXNpbmcgdGhlIEBjb2Rle25tfQotcHJvZ3JhbSwgb3IgYnkgdXNpbmcgdGhlIEBjb2Rle29iamR1bXB9IHByb2dyYW0gd2l0aCB0aGUgQHNhbXB7LXR9Ci1vcHRpb24uCi0KLUBub2RlIFNjcmlwdCBGb3JtYXQKLUBzZWN0aW9uIExpbmtlciBTY3JpcHQgRm9ybWF0Ci1AY2luZGV4IGxpbmtlciBzY3JpcHQgZm9ybWF0Ci1MaW5rZXIgc2NyaXB0cyBhcmUgdGV4dCBmaWxlcy4KLQotWW91IHdyaXRlIGEgbGlua2VyIHNjcmlwdCBhcyBhIHNlcmllcyBvZiBjb21tYW5kcy4gIEVhY2ggY29tbWFuZCBpcwotZWl0aGVyIGEga2V5d29yZCwgcG9zc2libHkgZm9sbG93ZWQgYnkgYXJndW1lbnRzLCBvciBhbiBhc3NpZ25tZW50IHRvIGEKLXN5bWJvbC4gIFlvdSBtYXkgc2VwYXJhdGUgY29tbWFuZHMgdXNpbmcgc2VtaWNvbG9ucy4gIFdoaXRlc3BhY2UgaXMKLWdlbmVyYWxseSBpZ25vcmVkLgotCi1TdHJpbmdzIHN1Y2ggYXMgZmlsZSBvciBmb3JtYXQgbmFtZXMgY2FuIG5vcm1hbGx5IGJlIGVudGVyZWQgZGlyZWN0bHkuCi1JZiB0aGUgZmlsZSBuYW1lIGNvbnRhaW5zIGEgY2hhcmFjdGVyIHN1Y2ggYXMgYSBjb21tYSB3aGljaCB3b3VsZAotb3RoZXJ3aXNlIHNlcnZlIHRvIHNlcGFyYXRlIGZpbGUgbmFtZXMsIHlvdSBtYXkgcHV0IHRoZSBmaWxlIG5hbWUgaW4KLWRvdWJsZSBxdW90ZXMuICBUaGVyZSBpcyBubyB3YXkgdG8gdXNlIGEgZG91YmxlIHF1b3RlIGNoYXJhY3RlciBpbiBhCi1maWxlIG5hbWUuCi0KLVlvdSBtYXkgaW5jbHVkZSBjb21tZW50cyBpbiBsaW5rZXIgc2NyaXB0cyBqdXN0IGFzIGluIEMsIGRlbGltaXRlZCBieQotQHNhbXB7Lyp9IGFuZCBAc2FtcHsqL30uICBBcyBpbiBDLCBjb21tZW50cyBhcmUgc3ludGFjdGljYWxseSBlcXVpdmFsZW50Ci10byB3aGl0ZXNwYWNlLgotCi1Abm9kZSBTaW1wbGUgRXhhbXBsZQotQHNlY3Rpb24gU2ltcGxlIExpbmtlciBTY3JpcHQgRXhhbXBsZQotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGV4YW1wbGUKLUBjaW5kZXggZXhhbXBsZSBvZiBsaW5rZXIgc2NyaXB0Ci1NYW55IGxpbmtlciBzY3JpcHRzIGFyZSBmYWlybHkgc2ltcGxlLgotCi1UaGUgc2ltcGxlc3QgcG9zc2libGUgbGlua2VyIHNjcmlwdCBoYXMganVzdCBvbmUgY29tbWFuZDoKLUBzYW1we1NFQ1RJT05TfS4gIFlvdSB1c2UgdGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIHRvIGRlc2NyaWJlIHRoZQotbWVtb3J5IGxheW91dCBvZiB0aGUgb3V0cHV0IGZpbGUuCi0KLVRoZSBAc2FtcHtTRUNUSU9OU30gY29tbWFuZCBpcyBhIHBvd2VyZnVsIGNvbW1hbmQuICBIZXJlIHdlIHdpbGwKLWRlc2NyaWJlIGEgc2ltcGxlIHVzZSBvZiBpdC4gIExldCdzIGFzc3VtZSB5b3VyIHByb2dyYW0gY29uc2lzdHMgb25seSBvZgotY29kZSwgaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIHVuaW5pdGlhbGl6ZWQgZGF0YS4gIFRoZXNlIHdpbGwgYmUgaW4gdGhlCi1Ac2FtcHsudGV4dH0sIEBzYW1wey5kYXRhfSwgYW5kIEBzYW1wey5ic3N9IHNlY3Rpb25zLCByZXNwZWN0aXZlbHkuCi1MZXQncyBhc3N1bWUgZnVydGhlciB0aGF0IHRoZXNlIGFyZSB0aGUgb25seSBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4KLXlvdXIgaW5wdXQgZmlsZXMuCi0KLUZvciB0aGlzIGV4YW1wbGUsIGxldCdzIHNheSB0aGF0IHRoZSBjb2RlIHNob3VsZCBiZSBsb2FkZWQgYXQgYWRkcmVzcwotMHgxMDAwMCwgYW5kIHRoYXQgdGhlIGRhdGEgc2hvdWxkIHN0YXJ0IGF0IGFkZHJlc3MgMHg4MDAwMDAwLiAgSGVyZSBpcyBhCi1saW5rZXIgc2NyaXB0IHdoaWNoIHdpbGwgZG8gdGhhdDoKLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi1AewotICAuID0gMHgxMDAwMDsKLSAgLnRleHQgOiBAeyAqKC50ZXh0KSBAfQotICAuID0gMHg4MDAwMDAwOwotICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0gIC5ic3MgOiBAeyAqKC5ic3MpIEB9Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotWW91IHdyaXRlIHRoZSBAc2FtcHtTRUNUSU9OU30gY29tbWFuZCBhcyB0aGUga2V5d29yZCBAc2FtcHtTRUNUSU9OU30sCi1mb2xsb3dlZCBieSBhIHNlcmllcyBvZiBzeW1ib2wgYXNzaWdubWVudHMgYW5kIG91dHB1dCBzZWN0aW9uCi1kZXNjcmlwdGlvbnMgZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzLgotCi1UaGUgZmlyc3QgbGluZSBpbiB0aGUgYWJvdmUgZXhhbXBsZSBzZXRzIHRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSwKLXdoaWNoIGlzIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIGFuCi1vdXRwdXQgc2VjdGlvbiBpbiBzb21lIG90aGVyIHdheSAob3RoZXIgd2F5cyBhcmUgZGVzY3JpYmVkIGxhdGVyKSwgdGhlCi1hZGRyZXNzIGlzIHNldCBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgVGhlCi1sb2NhdGlvbiBjb3VudGVyIGlzIHRoZW4gaW5jcmVtZW50ZWQgYnkgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBzZWN0aW9uLgotCi1UaGUgZmlyc3QgbGluZSBpbnNpZGUgdGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIG9mIHRoZSBhYm92ZSBleGFtcGxlCi1zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lhbCBzeW1ib2wgQHNhbXB7Ln0sIHdoaWNoIGlzIHRoZSBsb2NhdGlvbgotY291bnRlci4gIElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpbiBzb21lCi1vdGhlciB3YXkgKG90aGVyIHdheXMgYXJlIGRlc2NyaWJlZCBsYXRlciksIHRoZSBhZGRyZXNzIGlzIHNldCBmcm9tIHRoZQotY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlci4gIFRoZSBsb2NhdGlvbiBjb3VudGVyIGlzIHRoZW4KLWluY3JlbWVudGVkIGJ5IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEF0IHRoZSBzdGFydCBvZiB0aGUKLUBzYW1we1NFQ1RJT05TfSBjb21tYW5kLCB0aGUgbG9jYXRpb24gY291bnRlciBoYXMgdGhlIHZhbHVlIEBzYW1wezB9LgotCi1UaGUgc2Vjb25kIGxpbmUgZGVmaW5lcyBhbiBvdXRwdXQgc2VjdGlvbiwgQHNhbXB7LnRleHR9LiAgVGhlIGNvbG9uIGlzCi1yZXF1aXJlZCBzeW50YXggd2hpY2ggbWF5IGJlIGlnbm9yZWQgZm9yIG5vdy4gIFdpdGhpbiB0aGUgY3VybHkgYnJhY2VzCi1hZnRlciB0aGUgb3V0cHV0IHNlY3Rpb24gbmFtZSwgeW91IGxpc3QgdGhlIG5hbWVzIG9mIHRoZSBpbnB1dCBzZWN0aW9ucwotd2hpY2ggc2hvdWxkIGJlIHBsYWNlZCBpbnRvIHRoaXMgb3V0cHV0IHNlY3Rpb24uICBUaGUgQHNhbXB7Kn0gaXMgYQotd2lsZGNhcmQgd2hpY2ggbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgVGhlIGV4cHJlc3Npb24gQHNhbXB7KigudGV4dCl9Ci1tZWFucyBhbGwgQHNhbXB7LnRleHR9IGlucHV0IHNlY3Rpb25zIGluIGFsbCBpbnB1dCBmaWxlcy4KLQotU2luY2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgQHNhbXB7MHgxMDAwMH0gd2hlbiB0aGUgb3V0cHV0IHNlY3Rpb24KLUBzYW1wey50ZXh0fSBpcyBkZWZpbmVkLCB0aGUgbGlua2VyIHdpbGwgc2V0IHRoZSBhZGRyZXNzIG9mIHRoZQotQHNhbXB7LnRleHR9IHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHRvIGJlIEBzYW1wezB4MTAwMDB9LgotCi1UaGUgcmVtYWluaW5nIGxpbmVzIGRlZmluZSB0aGUgQHNhbXB7LmRhdGF9IGFuZCBAc2FtcHsuYnNzfSBzZWN0aW9ucyBpbgotdGhlIG91dHB1dCBmaWxlLiAgVGhlIGxpbmtlciB3aWxsIHBsYWNlIHRoZSBAc2FtcHsuZGF0YX0gb3V0cHV0IHNlY3Rpb24KLWF0IGFkZHJlc3MgQHNhbXB7MHg4MDAwMDAwfS4gIEFmdGVyIHRoZSBsaW5rZXIgcGxhY2VzIHRoZSBAc2FtcHsuZGF0YX0KLW91dHB1dCBzZWN0aW9uLCB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgd2lsbCBiZQotQHNhbXB7MHg4MDAwMDAwfSBwbHVzIHRoZSBzaXplIG9mIHRoZSBAc2FtcHsuZGF0YX0gb3V0cHV0IHNlY3Rpb24uICBUaGUKLWVmZmVjdCBpcyB0aGF0IHRoZSBsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmJzc30gb3V0cHV0IHNlY3Rpb24KLWltbWVkaWF0ZWx5IGFmdGVyIHRoZSBAc2FtcHsuZGF0YX0gb3V0cHV0IHNlY3Rpb24gaW4gbWVtb3J5Ci0KLVRoZSBsaW5rZXIgd2lsbCBlbnN1cmUgdGhhdCBlYWNoIG91dHB1dCBzZWN0aW9uIGhhcyB0aGUgcmVxdWlyZWQKLWFsaWdubWVudCwgYnkgaW5jcmVhc2luZyB0aGUgbG9jYXRpb24gY291bnRlciBpZiBuZWNlc3NhcnkuICBJbiB0aGlzCi1leGFtcGxlLCB0aGUgc3BlY2lmaWVkIGFkZHJlc3NlcyBmb3IgdGhlIEBzYW1wey50ZXh0fSBhbmQgQHNhbXB7LmRhdGF9Ci1zZWN0aW9ucyB3aWxsIHByb2JhYmx5IHNhdGlzZnkgYW55IGFsaWdubWVudCBjb25zdHJhaW50cywgYnV0IHRoZSBsaW5rZXIKLW1heSBoYXZlIHRvIGNyZWF0ZSBhIHNtYWxsIGdhcCBiZXR3ZWVuIHRoZSBAc2FtcHsuZGF0YX0gYW5kIEBzYW1wey5ic3N9Ci1zZWN0aW9ucy4KLQotVGhhdCdzIGl0ISAgVGhhdCdzIGEgc2ltcGxlIGFuZCBjb21wbGV0ZSBsaW5rZXIgc2NyaXB0LgotCi1Abm9kZSBTaW1wbGUgQ29tbWFuZHMKLUBzZWN0aW9uIFNpbXBsZSBMaW5rZXIgU2NyaXB0IENvbW1hbmRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgc2ltcGxlIGNvbW1hbmRzCi1JbiB0aGlzIHNlY3Rpb24gd2UgZGVzY3JpYmUgdGhlIHNpbXBsZSBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzLgotCi1AbWVudQotKiBFbnRyeSBQb2ludDo6CQkJU2V0dGluZyB0aGUgZW50cnkgcG9pbnQKLSogRmlsZSBDb21tYW5kczo6CQlDb21tYW5kcyBkZWFsaW5nIHdpdGggZmlsZXMKLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotKiBGb3JtYXQgQ29tbWFuZHM6OgkJQ29tbWFuZHMgZGVhbGluZyB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMKLUBlbmQgaWZjbGVhcgotCi0qIE1pc2NlbGxhbmVvdXMgQ29tbWFuZHM6OglPdGhlciBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzCi1AZW5kIG1lbnUKLQotQG5vZGUgRW50cnkgUG9pbnQKLUBzdWJzZWN0aW9uIFNldHRpbmcgdGhlIGVudHJ5IHBvaW50Ci1Aa2luZGV4IEVOVFJZKEB2YXJ7c3ltYm9sfSkKLUBjaW5kZXggc3RhcnQgb2YgZXhlY3V0aW9uCi1AY2luZGV4IGZpcnN0IGluc3RydWN0aW9uCi1AY2luZGV4IGVudHJ5IHBvaW50Ci1UaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZSBpbiBhIHByb2dyYW0gaXMgY2FsbGVkIHRoZSBAZGZue2VudHJ5Ci1wb2ludH0uICBZb3UgY2FuIHVzZSB0aGUgQGNvZGV7RU5UUll9IGxpbmtlciBzY3JpcHQgY29tbWFuZCB0byBzZXQgdGhlCi1lbnRyeSBwb2ludC4gIFRoZSBhcmd1bWVudCBpcyBhIHN5bWJvbCBuYW1lOgotQHNtYWxsZXhhbXBsZQotRU5UUlkoQHZhcntzeW1ib2x9KQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBzZXQgdGhlIGVudHJ5IHBvaW50LiAgVGhlIGxpbmtlciB3aWxsIHNldCB0aGUKLWVudHJ5IHBvaW50IGJ5IHRyeWluZyBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbiBvcmRlciwgYW5kCi1zdG9wcGluZyB3aGVuIG9uZSBvZiB0aGVtIHN1Y2NlZWRzOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gCi10aGUgQHNhbXB7LWV9IEB2YXJ7ZW50cnl9IGNvbW1hbmQtbGluZSBvcHRpb247Ci1AaXRlbSAKLXRoZSBAY29kZXtFTlRSWShAdmFye3N5bWJvbH0pfSBjb21tYW5kIGluIGEgbGlua2VyIHNjcmlwdDsKLUBpdGVtIAotdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgQGNvZGV7c3RhcnR9LCBpZiBkZWZpbmVkOwotQGl0ZW0gCi10aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgQHNhbXB7LnRleHR9IHNlY3Rpb24sIGlmIHByZXNlbnQ7Ci1AaXRlbSAKLVRoZSBhZGRyZXNzIEBjb2RlezB9LgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEZpbGUgQ29tbWFuZHMKLUBzdWJzZWN0aW9uIENvbW1hbmRzIGRlYWxpbmcgd2l0aCBmaWxlcwotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGZpbGUgY29tbWFuZHMKLVNldmVyYWwgbGlua2VyIHNjcmlwdCBjb21tYW5kcyBkZWFsIHdpdGggZmlsZXMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gSU5DTFVERSBAdmFye2ZpbGVuYW1lfQotQGtpbmRleCBJTkNMVURFIEB2YXJ7ZmlsZW5hbWV9Ci1AY2luZGV4IGluY2x1ZGluZyBhIGxpbmtlciBzY3JpcHQKLUluY2x1ZGUgdGhlIGxpbmtlciBzY3JpcHQgQHZhcntmaWxlbmFtZX0gYXQgdGhpcyBwb2ludC4gIFRoZSBmaWxlIHdpbGwKLWJlIHNlYXJjaGVkIGZvciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCBpbiBhbnkgZGlyZWN0b3J5IHNwZWNpZmllZAotd2l0aCB0aGUgQGNvZGV7LUx9IG9wdGlvbi4gIFlvdSBjYW4gbmVzdCBjYWxscyB0byBAY29kZXtJTkNMVURFfSB1cCB0bwotMTAgbGV2ZWxzIGRlZXAuCi0KLUBpdGVtIElOUFVUKEB2YXJ7ZmlsZX0sIEB2YXJ7ZmlsZX0sIEBkb3Rze30pCi1AaXRlbXggSU5QVVQoQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30pCi1Aa2luZGV4IElOUFVUKEB2YXJ7ZmlsZXN9KQotQGNpbmRleCBpbnB1dCBmaWxlcyBpbiBsaW5rZXIgc2NyaXB0cwotQGNpbmRleCBpbnB1dCBvYmplY3QgZmlsZXMgaW4gbGlua2VyIHNjcmlwdHMKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBpbnB1dCBvYmplY3QgZmlsZXMKLVRoZSBAY29kZXtJTlBVVH0gY29tbWFuZCBkaXJlY3RzIHRoZSBsaW5rZXIgdG8gaW5jbHVkZSB0aGUgbmFtZWQgZmlsZXMKLWluIHRoZSBsaW5rLCBhcyB0aG91Z2ggdGhleSB3ZXJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgYWx3YXlzIHdhbnQgdG8gaW5jbHVkZSBAZmlsZXtzdWJyLm99IGFueSB0aW1lIHlvdSBkbwotYSBsaW5rLCBidXQgeW91IGNhbid0IGJlIGJvdGhlcmVkIHRvIHB1dCBpdCBvbiBldmVyeSBsaW5rIGNvbW1hbmQgbGluZSwKLXRoZW4geW91IGNhbiBwdXQgQHNhbXB7SU5QVVQgKHN1YnIubyl9IGluIHlvdXIgbGlua2VyIHNjcmlwdC4KLQotSW4gZmFjdCwgaWYgeW91IGxpa2UsIHlvdSBjYW4gbGlzdCBhbGwgb2YgeW91ciBpbnB1dCBmaWxlcyBpbiB0aGUgbGlua2VyCi1zY3JpcHQsIGFuZCB0aGVuIGludm9rZSB0aGUgbGlua2VyIHdpdGggbm90aGluZyBidXQgYSBAc2FtcHstVH0gb3B0aW9uLgotCi1UaGUgbGlua2VyIHdpbGwgZmlyc3QgdHJ5IHRvIG9wZW4gdGhlIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgSWYKLWl0IGlzIG5vdCBmb3VuZCwgdGhlIGxpbmtlciB3aWxsIHNlYXJjaCB0aHJvdWdoIHRoZSBhcmNoaXZlIGxpYnJhcnkKLXNlYXJjaCBwYXRoLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBAc2FtcHstTH0gaW4gQHJlZntPcHRpb25zLCxDb21tYW5kCi1MaW5lIE9wdGlvbnN9LgotCi1JZiB5b3UgdXNlIEBzYW1we0lOUFVUICgtbEB2YXJ7ZmlsZX0pfSwgQGNvZGV7bGR9IHdpbGwgdHJhbnNmb3JtIHRoZQotbmFtZSB0byBAY29kZXtsaWJAdmFye2ZpbGV9LmF9LCBhcyB3aXRoIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQKLUBzYW1wey1sfS4KLQotV2hlbiB5b3UgdXNlIHRoZSBAY29kZXtJTlBVVH0gY29tbWFuZCBpbiBhbiBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0LCB0aGUKLWZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsgYXQgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBsaW5rZXIKLXNjcmlwdCBmaWxlIGlzIGluY2x1ZGVkLiAgVGhpcyBjYW4gYWZmZWN0IGFyY2hpdmUgc2VhcmNoaW5nLgotCi1AaXRlbSBHUk9VUChAdmFye2ZpbGV9LCBAdmFye2ZpbGV9LCBAZG90c3t9KQotQGl0ZW14IEdST1VQKEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9KQotQGtpbmRleCBHUk9VUChAdmFye2ZpbGVzfSkKLUBjaW5kZXggZ3JvdXBpbmcgaW5wdXQgZmlsZXMKLVRoZSBAY29kZXtHUk9VUH0gY29tbWFuZCBpcyBsaWtlIEBjb2Rle0lOUFVUfSwgZXhjZXB0IHRoYXQgdGhlIG5hbWVkCi1maWxlcyBzaG91bGQgYWxsIGJlIGFyY2hpdmVzLCBhbmQgdGhleSBhcmUgc2VhcmNoZWQgcmVwZWF0ZWRseSB1bnRpbCBubwotbmV3IHVuZGVmaW5lZCByZWZlcmVuY2VzIGFyZSBjcmVhdGVkLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBAc2FtcHstKH0KLWluIEByZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9LgotCi1AaXRlbSBPVVRQVVQoQHZhcntmaWxlbmFtZX0pCi1Aa2luZGV4IE9VVFBVVChAdmFye2ZpbGVuYW1lfSkKLUBjaW5kZXggb3V0cHV0IGZpbGUgbmFtZSBpbiBsaW5rZXIgc2NyaXBvdAotVGhlIEBjb2Rle09VVFBVVH0gY29tbWFuZCBuYW1lcyB0aGUgb3V0cHV0IGZpbGUuICBVc2luZwotQGNvZGV7T1VUUFVUKEB2YXJ7ZmlsZW5hbWV9KX0gaW4gdGhlIGxpbmtlciBzY3JpcHQgaXMgZXhhY3RseSBsaWtlIHVzaW5nCi1Ac2FtcHstbyBAdmFye2ZpbGVuYW1lfX0gb24gdGhlIGNvbW1hbmQgbGluZSAoQHB4cmVme09wdGlvbnMsLENvbW1hbmQKLUxpbmUgT3B0aW9uc30pLiAgSWYgYm90aCBhcmUgdXNlZCwgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gdGFrZXMKLXByZWNlZGVuY2UuCi0KLVlvdSBjYW4gdXNlIHRoZSBAY29kZXtPVVRQVVR9IGNvbW1hbmQgdG8gZGVmaW5lIGEgZGVmYXVsdCBuYW1lIGZvciB0aGUKLW91dHB1dCBmaWxlIG90aGVyIHRoYW4gdGhlIHVzdWFsIGRlZmF1bHQgb2YgQGZpbGV7YS5vdXR9LgotCi1AaXRlbSBTRUFSQ0hfRElSKEB2YXJ7cGF0aH0pCi1Aa2luZGV4IFNFQVJDSF9ESVIoQHZhcntwYXRofSkKLUBjaW5kZXggbGlicmFyeSBzZWFyY2ggcGF0aCBpbiBsaW5rZXIgc2NyaXB0Ci1AY2luZGV4IGFyY2hpdmUgc2VhcmNoIHBhdGggaW4gbGlua2VyIHNjcmlwdAotQGNpbmRleCBzZWFyY2ggcGF0aCBpbiBsaW5rZXIgc2NyaXB0Ci1UaGUgQGNvZGV7U0VBUkNIX0RJUn0gY29tbWFuZCBhZGRzIEB2YXJ7cGF0aH0gdG8gdGhlIGxpc3Qgb2YgcGF0aHMgd2hlcmUKLUBjb2Rle2xkfSBsb29rcyBmb3IgYXJjaGl2ZSBsaWJyYXJpZXMuICBVc2luZwotQGNvZGV7U0VBUkNIX0RJUihAdmFye3BhdGh9KX0gaXMgZXhhY3RseSBsaWtlIHVzaW5nIEBzYW1wey1MIEB2YXJ7cGF0aH19Ci1vbiB0aGUgY29tbWFuZCBsaW5lIChAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIGJvdGgKLWFyZSB1c2VkLCB0aGVuIHRoZSBsaW5rZXIgd2lsbCBzZWFyY2ggYm90aCBwYXRocy4gIFBhdGhzIHNwZWNpZmllZCB1c2luZwotdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gYXJlIHNlYXJjaGVkIGZpcnN0LgotCi1AaXRlbSBTVEFSVFVQKEB2YXJ7ZmlsZW5hbWV9KQotQGtpbmRleCBTVEFSVFVQKEB2YXJ7ZmlsZW5hbWV9KQotQGNpbmRleCBmaXJzdCBpbnB1dCBmaWxlCi1UaGUgQGNvZGV7U1RBUlRVUH0gY29tbWFuZCBpcyBqdXN0IGxpa2UgdGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kLCBleGNlcHQKLXRoYXQgQHZhcntmaWxlbmFtZX0gd2lsbCBiZWNvbWUgdGhlIGZpcnN0IGlucHV0IGZpbGUgdG8gYmUgbGlua2VkLCBhcwotdGhvdWdoIGl0IHdlcmUgc3BlY2lmaWVkIGZpcnN0IG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGlzIG1heSBiZSB1c2VmdWwKLXdoZW4gdXNpbmcgYSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGVudHJ5IHBvaW50IGlzIGFsd2F5cyB0aGUgc3RhcnQgb2YgdGhlCi1maXJzdCBmaWxlLgotQGVuZCB0YWJsZQotCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLUBub2RlIEZvcm1hdCBDb21tYW5kcwotQHN1YnNlY3Rpb24gQ29tbWFuZHMgZGVhbGluZyB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMKLUEgY291cGxlIG9mIGxpbmtlciBzY3JpcHQgY29tbWFuZHMgZGVhbCB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gT1VUUFVUX0ZPUk1BVChAdmFye2JmZG5hbWV9KQotQGl0ZW14IE9VVFBVVF9GT1JNQVQoQHZhcntkZWZhdWx0fSwgQHZhcntiaWd9LCBAdmFye2xpdHRsZX0pCi1Aa2luZGV4IE9VVFBVVF9GT1JNQVQoQHZhcntiZmRuYW1lfSkKLUBjaW5kZXggb3V0cHV0IGZpbGUgZm9ybWF0IGluIGxpbmtlciBzY3JpcHQKLVRoZSBAY29kZXtPVVRQVVRfRk9STUFUfSBjb21tYW5kIG5hbWVzIHRoZSBCRkQgZm9ybWF0IHRvIHVzZSBmb3IgdGhlCi1vdXRwdXQgZmlsZSAoQHB4cmVme0JGRH0pLiAgVXNpbmcgQGNvZGV7T1VUUFVUX0ZPUk1BVChAdmFye2JmZG5hbWV9KX0gaXMKLWV4YWN0bHkgbGlrZSB1c2luZyBAc2FtcHstb2Zvcm1hdCBAdmFye2JmZG5hbWV9fSBvbiB0aGUgY29tbWFuZCBsaW5lCi0oQHB4cmVme09wdGlvbnMsLENvbW1hbmQgTGluZSBPcHRpb25zfSkuICBJZiBib3RoIGFyZSB1c2VkLCB0aGUgY29tbWFuZAotbGluZSBvcHRpb24gdGFrZXMgcHJlY2VkZW5jZS4KLQotWW91IGNhbiB1c2UgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gd2l0aCB0aHJlZSBhcmd1bWVudHMgdG8gdXNlIGRpZmZlcmVudAotZm9ybWF0cyBiYXNlZCBvbiB0aGUgQHNhbXB7LUVCfSBhbmQgQHNhbXB7LUVMfSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLVRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHNjcmlwdCB0byBzZXQgdGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gdGhlCi1kZXNpcmVkIGVuZGlhbm5lc3MuCi0KLUlmIG5laXRoZXIgQHNhbXB7LUVCfSBub3IgQHNhbXB7LUVMfSBhcmUgdXNlZCwgdGhlbiB0aGUgb3V0cHV0IGZvcm1hdAotd2lsbCBiZSB0aGUgZmlyc3QgYXJndW1lbnQsIEB2YXJ7ZGVmYXVsdH0uICBJZiBAc2FtcHstRUJ9IGlzIHVzZWQsIHRoZQotb3V0cHV0IGZvcm1hdCB3aWxsIGJlIHRoZSBzZWNvbmQgYXJndW1lbnQsIEB2YXJ7YmlnfS4gIElmIEBzYW1wey1FTH0gaXMKLXVzZWQsIHRoZSBvdXRwdXQgZm9ybWF0IHdpbGwgYmUgdGhlIHRoaXJkIGFyZ3VtZW50LCBAdmFye2xpdHRsZX0uCi0KLUZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IGZvciB0aGUgTUlQUyBFTEYgdGFyZ2V0IHVzZXMgdGhpcwotY29tbWFuZDoKLUBzbWFsbGV4YW1wbGUKLU9VVFBVVF9GT1JNQVQoZWxmMzItYmlnbWlwcywgZWxmMzItYmlnbWlwcywgZWxmMzItbGl0dGxlbWlwcykKLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIHNheXMgdGhhdCB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgZmlsZSBpcwotQHNhbXB7ZWxmMzItYmlnbWlwc30sIGJ1dCBpZiB0aGUgdXNlciB1c2VzIHRoZSBAc2FtcHstRUx9IGNvbW1hbmQgbGluZQotb3B0aW9uLCB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBAc2FtcHtlbGYzMi1saXR0bGVtaXBzfQotZm9ybWF0LgotCi1AaXRlbSBUQVJHRVQoQHZhcntiZmRuYW1lfSkKLUBraW5kZXggVEFSR0VUKEB2YXJ7YmZkbmFtZX0pCi1AY2luZGV4IGlucHV0IGZpbGUgZm9ybWF0IGluIGxpbmtlciBzY3JpcHQKLVRoZSBAY29kZXtUQVJHRVR9IGNvbW1hbmQgbmFtZXMgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIHdoZW4gcmVhZGluZyBpbnB1dAotZmlsZXMuICBJdCBhZmZlY3RzIHN1YnNlcXVlbnQgQGNvZGV7SU5QVVR9IGFuZCBAY29kZXtHUk9VUH0gY29tbWFuZHMuCi1UaGlzIGNvbW1hbmQgaXMgbGlrZSB1c2luZyBAc2FtcHstYiBAdmFye2JmZG5hbWV9fSBvbiB0aGUgY29tbWFuZCBsaW5lCi0oQHB4cmVme09wdGlvbnMsLENvbW1hbmQgTGluZSBPcHRpb25zfSkuICBJZiB0aGUgQGNvZGV7VEFSR0VUfSBjb21tYW5kCi1pcyB1c2VkIGJ1dCBAY29kZXtPVVRQVVRfRk9STUFUfSBpcyBub3QsIHRoZW4gdGhlIGxhc3QgQGNvZGV7VEFSR0VUfQotY29tbWFuZCBpcyBhbHNvIHVzZWQgdG8gc2V0IHRoZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgZmlsZS4gIEB4cmVme0JGRH0uCi1AZW5kIHRhYmxlCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgTWlzY2VsbGFuZW91cyBDb21tYW5kcwotQHN1YnNlY3Rpb24gT3RoZXIgbGlua2VyIHNjcmlwdCBjb21tYW5kcwotVGhlcmUgYXJlIGEgZmV3IG90aGVyIGxpbmtlciBzY3JpcHRzIGNvbW1hbmRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEFTU0VSVChAdmFye2V4cH0sIEB2YXJ7bWVzc2FnZX0pCi1Aa2luZGV4IEFTU0VSVAotQGNpbmRleCBhc3NlcnRpb24gaW4gbGlua2VyIHNjcmlwdAotRW5zdXJlIHRoYXQgQHZhcntleHB9IGlzIG5vbi16ZXJvLiAgSWYgaXQgaXMgemVybywgdGhlbiBleGl0IHRoZSBsaW5rZXIKLXdpdGggYW4gZXJyb3IgY29kZSwgYW5kIHByaW50IEB2YXJ7bWVzc2FnZX0uCi0KLUBpdGVtIEVYVEVSTihAdmFye3N5bWJvbH0gQHZhcntzeW1ib2x9IEBkb3Rze30pCi1Aa2luZGV4IEVYVEVSTgotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9sIGluIGxpbmtlciBzY3JpcHQKLUZvcmNlIEB2YXJ7c3ltYm9sfSB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQKLXN5bWJvbC4gIERvaW5nIHRoaXMgbWF5LCBmb3IgZXhhbXBsZSwgdHJpZ2dlciBsaW5raW5nIG9mIGFkZGl0aW9uYWwKLW1vZHVsZXMgZnJvbSBzdGFuZGFyZCBsaWJyYXJpZXMuICBZb3UgbWF5IGxpc3Qgc2V2ZXJhbCBAdmFye3N5bWJvbH1zIGZvcgotZWFjaCBAY29kZXtFWFRFUk59LCBhbmQgeW91IG1heSB1c2UgQGNvZGV7RVhURVJOfSBtdWx0aXBsZSB0aW1lcy4gIFRoaXMKLWNvbW1hbmQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgQHNhbXB7LXV9IGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLUBpdGVtIEZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OCi1Aa2luZGV4IEZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OCi1AY2luZGV4IGNvbW1vbiBhbGxvY2F0aW9uIGluIGxpbmtlciBzY3JpcHQKLVRoaXMgY29tbWFuZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBAc2FtcHstZH0gY29tbWFuZC1saW5lIG9wdGlvbjoKLXRvIG1ha2UgQGNvZGV7bGR9IGFzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGEgcmVsb2NhdGFibGUKLW91dHB1dCBmaWxlIGlzIHNwZWNpZmllZCAoQHNhbXB7LXJ9KS4KLQotQGl0ZW0gTk9DUk9TU1JFRlMoQHZhcntzZWN0aW9ufSBAdmFye3NlY3Rpb259IEBkb3Rze30pCi1Aa2luZGV4IE5PQ1JPU1NSRUZTKEB2YXJ7c2VjdGlvbnN9KQotQGNpbmRleCBjcm9zcyByZWZlcmVuY2VzCi1UaGlzIGNvbW1hbmQgbWF5IGJlIHVzZWQgdG8gdGVsbCBAY29kZXtsZH0gdG8gaXNzdWUgYW4gZXJyb3IgYWJvdXQgYW55Ci1yZWZlcmVuY2VzIGFtb25nIGNlcnRhaW4gb3V0cHV0IHNlY3Rpb25zLgotCi1JbiBjZXJ0YWluIHR5cGVzIG9mIHByb2dyYW1zLCBwYXJ0aWN1bGFybHkgb24gZW1iZWRkZWQgc3lzdGVtcyB3aGVuCi11c2luZyBvdmVybGF5cywgd2hlbiBvbmUgc2VjdGlvbiBpcyBsb2FkZWQgaW50byBtZW1vcnksIGFub3RoZXIgc2VjdGlvbgotd2lsbCBub3QgYmUuICBBbnkgZGlyZWN0IHJlZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHNlY3Rpb25zIHdvdWxkIGJlCi1lcnJvcnMuICBGb3IgZXhhbXBsZSwgaXQgd291bGQgYmUgYW4gZXJyb3IgaWYgY29kZSBpbiBvbmUgc2VjdGlvbiBjYWxsZWQKLWEgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUgb3RoZXIgc2VjdGlvbi4KLQotVGhlIEBjb2Rle05PQ1JPU1NSRUZTfSBjb21tYW5kIHRha2VzIGEgbGlzdCBvZiBvdXRwdXQgc2VjdGlvbiBuYW1lcy4gIElmCi1AY29kZXtsZH0gZGV0ZWN0cyBhbnkgY3Jvc3MgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzZWN0aW9ucywgaXQgcmVwb3J0cwotYW4gZXJyb3IgYW5kIHJldHVybnMgYSBub24temVybyBleGl0IHN0YXR1cy4gIE5vdGUgdGhhdCB0aGUKLUBjb2Rle05PQ1JPU1NSRUZTfSBjb21tYW5kIHVzZXMgb3V0cHV0IHNlY3Rpb24gbmFtZXMsIG5vdCBpbnB1dCBzZWN0aW9uCi1uYW1lcy4KLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1AaXRlbSBPVVRQVVRfQVJDSChAdmFye2JmZGFyY2h9KQotQGtpbmRleCBPVVRQVVRfQVJDSChAdmFye2JmZGFyY2h9KQotQGNpbmRleCBtYWNoaW5lIGFyY2hpdGVjdHVyZQotQGNpbmRleCBhcmNoaXRlY3R1cmUKLVNwZWNpZnkgYSBwYXJ0aWN1bGFyIG91dHB1dCBtYWNoaW5lIGFyY2hpdGVjdHVyZS4gIFRoZSBhcmd1bWVudCBpcyBvbmUKLW9mIHRoZSBuYW1lcyB1c2VkIGJ5IHRoZSBCRkQgbGlicmFyeSAoQHB4cmVme0JGRH0pLiAgWW91IGNhbiBzZWUgdGhlCi1hcmNoaXRlY3R1cmUgb2YgYW4gb2JqZWN0IGZpbGUgYnkgdXNpbmcgdGhlIEBjb2Rle29iamR1bXB9IHByb2dyYW0gd2l0aAotdGhlIEBzYW1wey1mfSBvcHRpb24uCi1AZW5kIGlmY2xlYXIKLUBlbmQgdGFibGUKLQotQG5vZGUgQXNzaWdubWVudHMKLUBzZWN0aW9uIEFzc2lnbmluZyBWYWx1ZXMgdG8gU3ltYm9scwotQGNpbmRleCBhc3NpZ25tZW50IGluIHNjcmlwdHMKLUBjaW5kZXggc3ltYm9sIGRlZmluaXRpb24sIHNjcmlwdHMKLUBjaW5kZXggdmFyaWFibGVzLCBkZWZpbmluZwotWW91IG1heSBhc3NpZ24gYSB2YWx1ZSB0byBhIHN5bWJvbCBpbiBhIGxpbmtlciBzY3JpcHQuICBUaGlzIHdpbGwgZGVmaW5lCi10aGUgc3ltYm9sIGFzIGEgZ2xvYmFsIHN5bWJvbC4KLQotQG1lbnUKLSogU2ltcGxlIEFzc2lnbm1lbnRzOjoJCVNpbXBsZSBBc3NpZ25tZW50cwotKiBQUk9WSURFOjoJCQlQUk9WSURFCi1AZW5kIG1lbnUKLQotQG5vZGUgU2ltcGxlIEFzc2lnbm1lbnRzCi1Ac3Vic2VjdGlvbiBTaW1wbGUgQXNzaWdubWVudHMKLQotWW91IG1heSBhc3NpZ24gdG8gYSBzeW1ib2wgdXNpbmcgYW55IG9mIHRoZSBDIGFzc2lnbm1lbnQgb3BlcmF0b3JzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7c3ltYm9sfSA9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSArPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gLT0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ICo9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSAvPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gPDw9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSA+Pj0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ICY9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSB8PSBAdmFye2V4cHJlc3Npb259IDsKLUBlbmQgdGFibGUKLQotVGhlIGZpcnN0IGNhc2Ugd2lsbCBkZWZpbmUgQHZhcntzeW1ib2x9IHRvIHRoZSB2YWx1ZSBvZgotQHZhcntleHByZXNzaW9ufS4gIEluIHRoZSBvdGhlciBjYXNlcywgQHZhcntzeW1ib2x9IG11c3QgYWxyZWFkeSBiZQotZGVmaW5lZCwgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIGFkanVzdGVkIGFjY29yZGluZ2x5LgotCi1UaGUgc3BlY2lhbCBzeW1ib2wgbmFtZSBAc2FtcHsufSBpbmRpY2F0ZXMgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBZb3UKLW1heSBvbmx5IHVzZSB0aGlzIHdpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLgotCi1UaGUgc2VtaWNvbG9uIGFmdGVyIEB2YXJ7ZXhwcmVzc2lvbn0gaXMgcmVxdWlyZWQuCi0KLUV4cHJlc3Npb25zIGFyZSBkZWZpbmVkIGJlbG93OyBzZWUgQHJlZntFeHByZXNzaW9uc30uCi0KLVlvdSBtYXkgd3JpdGUgc3ltYm9sIGFzc2lnbm1lbnRzIGFzIGNvbW1hbmRzIGluIHRoZWlyIG93biByaWdodCwgb3IgYXMKLXN0YXRlbWVudHMgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQsIG9yIGFzIHBhcnQgb2YgYW4gb3V0cHV0Ci1zZWN0aW9uIGRlc2NyaXB0aW9uIGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQuCi0KLVRoZSBzZWN0aW9uIG9mIHRoZSBzeW1ib2wgd2lsbCBiZSBzZXQgZnJvbSB0aGUgc2VjdGlvbiBvZiB0aGUKLWV4cHJlc3Npb247IGZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQHJlZntFeHByZXNzaW9uIFNlY3Rpb259LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgc2hvd2luZyB0aGUgdGhyZWUgZGlmZmVyZW50IHBsYWNlcyB0aGF0IHN5bWJvbAotYXNzaWdubWVudHMgbWF5IGJlIHVzZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLWZsb2F0aW5nX3BvaW50ID0gMDsKLVNFQ1RJT05TCi1AewotICAudGV4dCA6Ci0gICAgQHsKLSAgICAgICooLnRleHQpCi0gICAgICBfZXRleHQgPSAuOwotICAgIEB9Ci0gIF9iZGF0YSA9ICguICsgMykgJiB+IDQ7Ci0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1JbiB0aGlzIGV4YW1wbGUsIHRoZSBzeW1ib2wgQHNhbXB7ZmxvYXRpbmdfcG9pbnR9IHdpbGwgYmUgZGVmaW5lZCBhcwotemVyby4gIFRoZSBzeW1ib2wgQHNhbXB7X2V0ZXh0fSB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nCi10aGUgbGFzdCBAc2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbi4gIFRoZSBzeW1ib2wgQHNhbXB7X2JkYXRhfSB3aWxsIGJlCi1kZWZpbmVkIGFzIHRoZSBhZGRyZXNzIGZvbGxvd2luZyB0aGUgQHNhbXB7LnRleHR9IG91dHB1dCBzZWN0aW9uIGFsaWduZWQKLXVwd2FyZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4KLQotQG5vZGUgUFJPVklERQotQHN1YnNlY3Rpb24gUFJPVklERQotQGNpbmRleCBQUk9WSURFCi1JbiBzb21lIGNhc2VzLCBpdCBpcyBkZXNpcmFibGUgZm9yIGEgbGlua2VyIHNjcmlwdCB0byBkZWZpbmUgYSBzeW1ib2wKLW9ubHkgaWYgaXQgaXMgcmVmZXJlbmNlZCBhbmQgaXMgbm90IGRlZmluZWQgYnkgYW55IG9iamVjdCBpbmNsdWRlZCBpbgotdGhlIGxpbmsuICBGb3IgZXhhbXBsZSwgdHJhZGl0aW9uYWwgbGlua2VycyBkZWZpbmVkIHRoZSBzeW1ib2wKLUBzYW1we2V0ZXh0fS4gIEhvd2V2ZXIsIEFOU0kgQyByZXF1aXJlcyB0aGF0IHRoZSB1c2VyIGJlIGFibGUgdG8gdXNlCi1Ac2FtcHtldGV4dH0gYXMgYSBmdW5jdGlvbiBuYW1lIHdpdGhvdXQgZW5jb3VudGVyaW5nIGFuIGVycm9yLiAgVGhlCi1AY29kZXtQUk9WSURFfSBrZXl3b3JkIG1heSBiZSB1c2VkIHRvIGRlZmluZSBhIHN5bWJvbCwgc3VjaCBhcwotQHNhbXB7ZXRleHR9LCBvbmx5IGlmIGl0IGlzIHJlZmVyZW5jZWQgYnV0IG5vdCBkZWZpbmVkLiAgVGhlIHN5bnRheCBpcwotQGNvZGV7UFJPVklERShAdmFye3N5bWJvbH0gPSBAdmFye2V4cHJlc3Npb259KX0uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBAY29kZXtQUk9WSURFfSB0byBkZWZpbmUgQHNhbXB7ZXRleHR9OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gIC50ZXh0IDoKLSAgICBAewotICAgICAgKigudGV4dCkKLSAgICAgIF9ldGV4dCA9IC47Ci0gICAgICBQUk9WSURFKGV0ZXh0ID0gLik7Ci0gICAgQH0KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JbiB0aGlzIGV4YW1wbGUsIGlmIHRoZSBwcm9ncmFtIGRlZmluZXMgQHNhbXB7X2V0ZXh0fSAod2l0aCBhIGxlYWRpbmcKLXVuZGVyc2NvcmUpLCB0aGUgbGlua2VyIHdpbGwgZ2l2ZSBhIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IuICBJZiwgb24KLXRoZSBvdGhlciBoYW5kLCB0aGUgcHJvZ3JhbSBkZWZpbmVzIEBzYW1we2V0ZXh0fSAod2l0aCBubyBsZWFkaW5nCi11bmRlcnNjb3JlKSwgdGhlIGxpbmtlciB3aWxsIHNpbGVudGx5IHVzZSB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgcHJvZ3JhbS4KLUlmIHRoZSBwcm9ncmFtIHJlZmVyZW5jZXMgQHNhbXB7ZXRleHR9IGJ1dCBkb2VzIG5vdCBkZWZpbmUgaXQsIHRoZQotbGlua2VyIHdpbGwgdXNlIHRoZSBkZWZpbml0aW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1Abm9kZSBTRUNUSU9OUwotQHNlY3Rpb24gU0VDVElPTlMgY29tbWFuZAotQGtpbmRleCBTRUNUSU9OUwotVGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIHRlbGxzIHRoZSBsaW5rZXIgaG93IHRvIG1hcCBpbnB1dCBzZWN0aW9ucwotaW50byBvdXRwdXQgc2VjdGlvbnMsIGFuZCBob3cgdG8gcGxhY2UgdGhlIG91dHB1dCBzZWN0aW9ucyBpbiBtZW1vcnkuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGlzOgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gIEB2YXJ7c2VjdGlvbnMtY29tbWFuZH0KLSAgQHZhcntzZWN0aW9ucy1jb21tYW5kfQotICBAZG90c3t9Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotRWFjaCBAdmFye3NlY3Rpb25zLWNvbW1hbmR9IG1heSBvZiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLWFuIEBjb2Rle0VOVFJZfSBjb21tYW5kIChAcHhyZWZ7RW50cnkgUG9pbnQsLEVudHJ5IGNvbW1hbmR9KQotQGl0ZW0KLWEgc3ltYm9sIGFzc2lnbm1lbnQgKEBweHJlZntBc3NpZ25tZW50c30pCi1AaXRlbQotYW4gb3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLUBpdGVtCi1hbiBvdmVybGF5IGRlc2NyaXB0aW9uCi1AZW5kIGl0ZW1pemUKLQotVGhlIEBjb2Rle0VOVFJZfSBjb21tYW5kIGFuZCBzeW1ib2wgYXNzaWdubWVudHMgYXJlIHBlcm1pdHRlZCBpbnNpZGUgdGhlCi1AY29kZXtTRUNUSU9OU30gY29tbWFuZCBmb3IgY29udmVuaWVuY2UgaW4gdXNpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaW4KLXRob3NlIGNvbW1hbmRzLiAgVGhpcyBjYW4gYWxzbyBtYWtlIHRoZSBsaW5rZXIgc2NyaXB0IGVhc2llciB0bwotdW5kZXJzdGFuZCBiZWNhdXNlIHlvdSBjYW4gdXNlIHRob3NlIGNvbW1hbmRzIGF0IG1lYW5pbmdmdWwgcG9pbnRzIGluCi10aGUgbGF5b3V0IG9mIHRoZSBvdXRwdXQgZmlsZS4KLQotT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIGFuZCBvdmVybGF5IGRlc2NyaXB0aW9ucyBhcmUgZGVzY3JpYmVkCi1iZWxvdy4KLQotSWYgeW91IGRvIG5vdCB1c2UgYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCBpbiB5b3VyIGxpbmtlciBzY3JpcHQsIHRoZQotbGlua2VyIHdpbGwgcGxhY2UgZWFjaCBpbnB1dCBzZWN0aW9uIGludG8gYW4gaWRlbnRpY2FsbHkgbmFtZWQgb3V0cHV0Ci1zZWN0aW9uIGluIHRoZSBvcmRlciB0aGF0IHRoZSBzZWN0aW9ucyBhcmUgZmlyc3QgZW5jb3VudGVyZWQgaW4gdGhlCi1pbnB1dCBmaWxlcy4gIElmIGFsbCBpbnB1dCBzZWN0aW9ucyBhcmUgcHJlc2VudCBpbiB0aGUgZmlyc3QgZmlsZSwgZm9yCi1leGFtcGxlLCB0aGUgb3JkZXIgb2Ygc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHdpbGwgbWF0Y2ggdGhlIG9yZGVyCi1pbiB0aGUgZmlyc3QgaW5wdXQgZmlsZS4gIFRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgYXQgYWRkcmVzcyB6ZXJvLgotCi1AbWVudQotKiBPdXRwdXQgU2VjdGlvbiBEZXNjcmlwdGlvbjo6CU91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uCi0qIE91dHB1dCBTZWN0aW9uIE5hbWU6OgkJT3V0cHV0IHNlY3Rpb24gbmFtZQotKiBPdXRwdXQgU2VjdGlvbiBBZGRyZXNzOjoJT3V0cHV0IHNlY3Rpb24gYWRkcmVzcwotKiBJbnB1dCBTZWN0aW9uOjoJCUlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLSogT3V0cHV0IFNlY3Rpb24gRGF0YTo6CQlPdXRwdXQgc2VjdGlvbiBkYXRhCi0qIE91dHB1dCBTZWN0aW9uIEtleXdvcmRzOjoJT3V0cHV0IHNlY3Rpb24ga2V5d29yZHMKLSogT3V0cHV0IFNlY3Rpb24gRGlzY2FyZGluZzo6CU91dHB1dCBzZWN0aW9uIGRpc2NhcmRpbmcKLSogT3V0cHV0IFNlY3Rpb24gQXR0cmlidXRlczo6CU91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZXMKLSogT3ZlcmxheSBEZXNjcmlwdGlvbjo6CQlPdmVybGF5IGRlc2NyaXB0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uCi1UaGUgZnVsbCBkZXNjcmlwdGlvbiBvZiBhbiBvdXRwdXQgc2VjdGlvbiBsb29rcyBsaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAgCi1AdmFye3NlY3Rpb259IFtAdmFye2FkZHJlc3N9XSBbKEB2YXJ7dHlwZX0pXSA6IFtBVChAdmFye2xtYX0pXQotICBAewotICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgQGRvdHN7fQotICBAfSBbPkB2YXJ7cmVnaW9ufV0gWzpAdmFye3BoZHJ9IDpAdmFye3BoZHJ9IEBkb3Rze31dIFs9QHZhcntmaWxsZXhwfV0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLU1vc3Qgb3V0cHV0IHNlY3Rpb25zIGRvIG5vdCB1c2UgbW9zdCBvZiB0aGUgb3B0aW9uYWwgc2VjdGlvbiBhdHRyaWJ1dGVzLgotCi1UaGUgd2hpdGVzcGFjZSBhcm91bmQgQHZhcntzZWN0aW9ufSBpcyByZXF1aXJlZCwgc28gdGhhdCB0aGUgc2VjdGlvbgotbmFtZSBpcyB1bmFtYmlndW91cy4gIFRoZSBjb2xvbiBhbmQgdGhlIGN1cmx5IGJyYWNlcyBhcmUgYWxzbyByZXF1aXJlZC4KLVRoZSBsaW5lIGJyZWFrcyBhbmQgb3RoZXIgd2hpdGUgc3BhY2UgYXJlIG9wdGlvbmFsLgotCi1FYWNoIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotYSBzeW1ib2wgYXNzaWdubWVudCAoQHB4cmVme0Fzc2lnbm1lbnRzfSkKLUBpdGVtCi1hbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIChAcHhyZWZ7SW5wdXQgU2VjdGlvbn0pCi1AaXRlbQotZGF0YSB2YWx1ZXMgdG8gaW5jbHVkZSBkaXJlY3RseSAoQHB4cmVme091dHB1dCBTZWN0aW9uIERhdGF9KQotQGl0ZW0KLWEgc3BlY2lhbCBvdXRwdXQgc2VjdGlvbiBrZXl3b3JkIChAcHhyZWZ7T3V0cHV0IFNlY3Rpb24gS2V5d29yZHN9KQotQGVuZCBpdGVtaXplCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIE5hbWUKLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIG5hbWUKLUBjaW5kZXggbmFtZSwgc2VjdGlvbgotQGNpbmRleCBzZWN0aW9uIG5hbWUKLVRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBpcyBAdmFye3NlY3Rpb259LiAgQHZhcntzZWN0aW9ufSBtdXN0Ci1tZWV0IHRoZSBjb25zdHJhaW50cyBvZiB5b3VyIG91dHB1dCBmb3JtYXQuICBJbiBmb3JtYXRzIHdoaWNoIG9ubHkKLXN1cHBvcnQgYSBsaW1pdGVkIG51bWJlciBvZiBzZWN0aW9ucywgc3VjaCBhcyBAY29kZXthLm91dH0sIHRoZSBuYW1lCi1tdXN0IGJlIG9uZSBvZiB0aGUgbmFtZXMgc3VwcG9ydGVkIGJ5IHRoZSBmb3JtYXQgKEBjb2Rle2Eub3V0fSwgZm9yCi1leGFtcGxlLCBhbGxvd3Mgb25seSBAc2FtcHsudGV4dH0sIEBzYW1wey5kYXRhfSBvciBAc2FtcHsuYnNzfSkuIElmIHRoZQotb3V0cHV0IGZvcm1hdCBzdXBwb3J0cyBhbnkgbnVtYmVyIG9mIHNlY3Rpb25zLCBidXQgd2l0aCBudW1iZXJzIGFuZCBub3QKLW5hbWVzIChhcyBpcyB0aGUgY2FzZSBmb3IgT2FzeXMpLCB0aGUgbmFtZSBzaG91bGQgYmUgc3VwcGxpZWQgYXMgYQotcXVvdGVkIG51bWVyaWMgc3RyaW5nLiAgQSBzZWN0aW9uIG5hbWUgbWF5IGNvbnNpc3Qgb2YgYW55IHNlcXVlbmNlIG9mCi1jaGFyYWN0ZXJzLCBidXQgYSBuYW1lIHdoaWNoIGNvbnRhaW5zIGFueSB1bnVzdWFsIGNoYXJhY3RlcnMgc3VjaCBhcwotY29tbWFzIG11c3QgYmUgcXVvdGVkLgotCi1UaGUgb3V0cHV0IHNlY3Rpb24gbmFtZSBAc2FtcHsvRElTQ0FSRC99IGlzIHNwZWNpYWw7IEByZWZ7T3V0cHV0IFNlY3Rpb24KLURpc2NhcmRpbmd9LgotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBBZGRyZXNzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBhZGRyZXNzCi1AY2luZGV4IGFkZHJlc3MsIHNlY3Rpb24KLUBjaW5kZXggc2VjdGlvbiBhZGRyZXNzCi1UaGUgQHZhcnthZGRyZXNzfSBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgVk1BICh0aGUgdmlydHVhbCBtZW1vcnkKLWFkZHJlc3MpIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gIElmIHlvdSBkbyBub3QgcHJvdmlkZSBAdmFye2FkZHJlc3N9LAotdGhlIGxpbmtlciB3aWxsIHNldCBpdCBiYXNlZCBvbiBAdmFye3JlZ2lvbn0gaWYgcHJlc2VudCwgb3Igb3RoZXJ3aXNlCi1iYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlci4KLQotSWYgeW91IHByb3ZpZGUgQHZhcnthZGRyZXNzfSwgdGhlIGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBzZWN0aW9uIHdpbGwgYmUKLXNldCB0byBwcmVjaXNlbHkgdGhhdC4gIElmIHlvdSBwcm92aWRlIG5laXRoZXIgQHZhcnthZGRyZXNzfSBub3IKLUB2YXJ7cmVnaW9ufSwgdGhlbiB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gd2lsbCBiZSBzZXQgdG8gdGhlCi1jdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyIGFsaWduZWQgdG8gdGhlIGFsaWdubWVudAotcmVxdWlyZW1lbnRzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlCi1vdXRwdXQgc2VjdGlvbiBpcyB0aGUgc3RyaWN0ZXN0IGFsaWdubWVudCBvZiBhbnkgaW5wdXQgc2VjdGlvbiBjb250YWluZWQKLXdpdGhpbiB0aGUgb3V0cHV0IHNlY3Rpb24uCi0KLUZvciBleGFtcGxlLAotQHNtYWxsZXhhbXBsZQotLnRleHQgLiA6IEB7ICooLnRleHQpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1hbmQKLUBzbWFsbGV4YW1wbGUKLS50ZXh0IDogQHsgKigudGV4dCkgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLWFyZSBzdWJ0bHkgZGlmZmVyZW50LiAgVGhlIGZpcnN0IHdpbGwgc2V0IHRoZSBhZGRyZXNzIG9mIHRoZQotQHNhbXB7LnRleHR9IG91dHB1dCBzZWN0aW9uIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbgotY291bnRlci4gIFRoZSBzZWNvbmQgd2lsbCBzZXQgaXQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uCi1jb3VudGVyIGFsaWduZWQgdG8gdGhlIHN0cmljdGVzdCBhbGlnbm1lbnQgb2YgYSBAc2FtcHsudGV4dH0gaW5wdXQKLXNlY3Rpb24uCi0KLVRoZSBAdmFye2FkZHJlc3N9IG1heSBiZSBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbjsgQHJlZntFeHByZXNzaW9uc30uCi1Gb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYWxpZ24gdGhlIHNlY3Rpb24gb24gYSAweDEwIGJ5dGUgYm91bmRhcnksCi1zbyB0aGF0IHRoZSBsb3dlc3QgZm91ciBiaXRzIG9mIHRoZSBzZWN0aW9uIGFkZHJlc3MgYXJlIHplcm8sIHlvdSBjb3VsZAotZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLS50ZXh0IEFMSUdOKDB4MTApIDogQHsgKigudGV4dCkgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgd29ya3MgYmVjYXVzZSBAY29kZXtBTElHTn0gcmV0dXJucyB0aGUgY3VycmVudCBsb2NhdGlvbiBjb3VudGVyCi1hbGlnbmVkIHVwd2FyZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCi1TcGVjaWZ5aW5nIEB2YXJ7YWRkcmVzc30gZm9yIGEgc2VjdGlvbiB3aWxsIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlCi1sb2NhdGlvbiBjb3VudGVyLgotCi1Abm9kZSBJbnB1dCBTZWN0aW9uCi1Ac3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uCi1AY2luZGV4IGlucHV0IHNlY3Rpb25zCi1AY2luZGV4IG1hcHBpbmcgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zCi1UaGUgbW9zdCBjb21tb24gb3V0cHV0IHNlY3Rpb24gY29tbWFuZCBpcyBhbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCi1UaGUgaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBpcyB0aGUgbW9zdCBiYXNpYyBsaW5rZXIgc2NyaXB0IG9wZXJhdGlvbi4KLVlvdSB1c2Ugb3V0cHV0IHNlY3Rpb25zIHRvIHRlbGwgdGhlIGxpbmtlciBob3cgdG8gbGF5IG91dCB5b3VyIHByb2dyYW0KLWluIG1lbW9yeS4gIFlvdSB1c2UgaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbnMgdG8gdGVsbCB0aGUgbGlua2VyIGhvdyB0bwotbWFwIHRoZSBpbnB1dCBmaWxlcyBpbnRvIHlvdXIgbWVtb3J5IGxheW91dC4KLQotQG1lbnUKLSogSW5wdXQgU2VjdGlvbiBCYXNpY3M6OglJbnB1dCBzZWN0aW9uIGJhc2ljcwotKiBJbnB1dCBTZWN0aW9uIFdpbGRjYXJkczo6CUlucHV0IHNlY3Rpb24gd2lsZGNhcmQgcGF0dGVybnMKLSogSW5wdXQgU2VjdGlvbiBDb21tb246OglJbnB1dCBzZWN0aW9uIGZvciBjb21tb24gc3ltYm9scwotKiBJbnB1dCBTZWN0aW9uIEtlZXA6OgkJSW5wdXQgc2VjdGlvbiBhbmQgZ2FyYmFnZSBjb2xsZWN0aW9uCi0qIElucHV0IFNlY3Rpb24gRXhhbXBsZTo6CUlucHV0IHNlY3Rpb24gZXhhbXBsZQotQGVuZCBtZW51Ci0KLUBub2RlIElucHV0IFNlY3Rpb24gQmFzaWNzCi1Ac3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGJhc2ljcwotQGNpbmRleCBpbnB1dCBzZWN0aW9uIGJhc2ljcwotQW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBjb25zaXN0cyBvZiBhIGZpbGUgbmFtZSBvcHRpb25hbGx5IGZvbGxvd2VkCi1ieSBhIGxpc3Qgb2Ygc2VjdGlvbiBuYW1lcyBpbiBwYXJlbnRoZXNlcy4KLQotVGhlIGZpbGUgbmFtZSBhbmQgdGhlIHNlY3Rpb24gbmFtZSBtYXkgYmUgd2lsZGNhcmQgcGF0dGVybnMsIHdoaWNoIHdlCi1kZXNjcmliZSBmdXJ0aGVyIGJlbG93IChAcHhyZWZ7SW5wdXQgU2VjdGlvbiBXaWxkY2FyZHN9KS4KLQotVGhlIG1vc3QgY29tbW9uIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gaXMgdG8gaW5jbHVkZSBhbGwgaW5wdXQKLXNlY3Rpb25zIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgRm9yIGV4YW1wbGUsIHRvCi1pbmNsdWRlIGFsbCBpbnB1dCBAc2FtcHsudGV4dH0gc2VjdGlvbnMsIHlvdSB3b3VsZCB3cml0ZToKLUBzbWFsbGV4YW1wbGUKLSooLnRleHQpCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1IZXJlIHRoZSBAc2FtcHsqfSBpcyBhIHdpbGRjYXJkIHdoaWNoIG1hdGNoZXMgYW55IGZpbGUgbmFtZS4gIFRvIGV4Y2x1ZGUgYSBmaWxlCi1mcm9tIG1hdGNoaW5nIHRoZSBmaWxlIG5hbWUgd2lsZGNhcmQsIEVYQ0xVREVfRklMRSBtYXkgYmUgdXNlZCB0byBtYXRjaCBhbGwgZmlsZXMKLWV4Y2VwdCB0aGUgb25lIHNwZWNpZmllZCBieSBFWENMVURFX0ZJTEUuICBGb3IgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLSgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotQGVuZCBzbWFsbGV4YW1wbGUKLXdpbGwgY2F1c2UgYWxsIC5jdG9ycyBzZWN0aW9ucyBmcm9tIGFsbCBmaWxlcyBleGNlcHQgY3J0ZW5kLm8gdG8gYmUgaW5jbHVkZWQuCi0KLVRoZXJlIGFyZSB0d28gd2F5cyB0byBpbmNsdWRlIG1vcmUgdGhhbiBvbmUgc2VjdGlvbjoKLUBzbWFsbGV4YW1wbGUKLSooLnRleHQgLnJkYXRhKQotKigudGV4dCkgKigucmRhdGEpCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgQHNhbXB7LnRleHR9IGFuZAotQHNhbXB7LnJkYXRhfSBpbnB1dCBzZWN0aW9ucyB3aWxsIGFwcGVhciBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICBJbiB0aGUKLWZpcnN0IGV4YW1wbGUsIHRoZXkgd2lsbCBiZSBpbnRlcm1pbmdsZWQuICBJbiB0aGUgc2Vjb25kIGV4YW1wbGUsIGFsbAotQHNhbXB7LnRleHR9IGlucHV0IHNlY3Rpb25zIHdpbGwgYXBwZWFyIGZpcnN0LCBmb2xsb3dlZCBieSBhbGwKLUBzYW1wey5yZGF0YX0gaW5wdXQgc2VjdGlvbnMuCi0KLVlvdSBjYW4gc3BlY2lmeSBhIGZpbGUgbmFtZSB0byBpbmNsdWRlIHNlY3Rpb25zIGZyb20gYSBwYXJ0aWN1bGFyIGZpbGUuCi1Zb3Ugd291bGQgZG8gdGhpcyBpZiBvbmUgb3IgbW9yZSBvZiB5b3VyIGZpbGVzIGNvbnRhaW4gc3BlY2lhbCBkYXRhIHRoYXQKLW5lZWRzIHRvIGJlIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbiBpbiBtZW1vcnkuICBGb3IgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLWRhdGEubyguZGF0YSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHlvdSB1c2UgYSBmaWxlIG5hbWUgd2l0aG91dCBhIGxpc3Qgb2Ygc2VjdGlvbnMsIHRoZW4gYWxsIHNlY3Rpb25zIGluCi10aGUgaW5wdXQgZmlsZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIFRoaXMgaXMgbm90Ci1jb21tb25seSBkb25lLCBidXQgaXQgbWF5IGJ5IHVzZWZ1bCBvbiBvY2Nhc2lvbi4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotZGF0YS5vCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1XaGVuIHlvdSB1c2UgYSBmaWxlIG5hbWUgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhbnkgd2lsZCBjYXJkCi1jaGFyYWN0ZXJzLCB0aGUgbGlua2VyIHdpbGwgZmlyc3Qgc2VlIGlmIHlvdSBhbHNvIHNwZWNpZmllZCB0aGUgZmlsZQotbmFtZSBvbiB0aGUgbGlua2VyIGNvbW1hbmQgbGluZSBvciBpbiBhbiBAY29kZXtJTlBVVH0gY29tbWFuZC4gIElmIHlvdQotZGlkIG5vdCwgdGhlIGxpbmtlciB3aWxsIGF0dGVtcHQgdG8gb3BlbiB0aGUgZmlsZSBhcyBhbiBpbnB1dCBmaWxlLCBhcwotdGhvdWdoIGl0IGFwcGVhcmVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gYW4KLUBjb2Rle0lOUFVUfSBjb21tYW5kLCBiZWNhdXNlIHRoZSBsaW5rZXIgd2lsbCBub3Qgc2VhcmNoIGZvciB0aGUgZmlsZSBpbgotdGhlIGFyY2hpdmUgc2VhcmNoIHBhdGguCi0KLUBub2RlIElucHV0IFNlY3Rpb24gV2lsZGNhcmRzCi1Ac3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIHdpbGRjYXJkIHBhdHRlcm5zCi1AY2luZGV4IGlucHV0IHNlY3Rpb24gd2lsZGNhcmRzCi1AY2luZGV4IHdpbGRjYXJkIGZpbGUgbmFtZSBwYXR0ZXJucwotQGNpbmRleCBmaWxlIG5hbWUgd2lsZGNhcmQgcGF0dGVybnMKLUBjaW5kZXggc2VjdGlvbiBuYW1lIHdpbGRjYXJkIHBhdHRlcm5zCi1JbiBhbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uLCBlaXRoZXIgdGhlIGZpbGUgbmFtZSBvciB0aGUgc2VjdGlvbgotbmFtZSBvciBib3RoIG1heSBiZSB3aWxkY2FyZCBwYXR0ZXJucy4KLQotVGhlIGZpbGUgbmFtZSBvZiBAc2FtcHsqfSBzZWVuIGluIG1hbnkgZXhhbXBsZXMgaXMgYSBzaW1wbGUgd2lsZGNhcmQKLXBhdHRlcm4gZm9yIHRoZSBmaWxlIG5hbWUuCi0KLVRoZSB3aWxkY2FyZCBwYXR0ZXJucyBhcmUgbGlrZSB0aG9zZSB1c2VkIGJ5IHRoZSBVbml4IHNoZWxsLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtICoKLW1hdGNoZXMgYW55IG51bWJlciBvZiBjaGFyYWN0ZXJzCi1AaXRlbSA/Ci1tYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyCi1AaXRlbSBbQHZhcntjaGFyc31dCi1tYXRjaGVzIGEgc2luZ2xlIGluc3RhbmNlIG9mIGFueSBvZiB0aGUgQHZhcntjaGFyc307IHRoZSBAc2FtcHstfQotY2hhcmFjdGVyIG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgYSByYW5nZSBvZiBjaGFyYWN0ZXJzLCBhcyBpbgotQHNhbXB7W2Etel19IHRvIG1hdGNoIGFueSBsb3dlciBjYXNlIGxldHRlcgotQGl0ZW0gXAotcXVvdGVzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyCi1AZW5kIHRhYmxlCi0KLVdoZW4gYSBmaWxlIG5hbWUgaXMgbWF0Y2hlZCB3aXRoIGEgd2lsZGNhcmQsIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXJzCi13aWxsIG5vdCBtYXRjaCBhIEBzYW1wey99IGNoYXJhY3RlciAodXNlZCB0byBzZXBhcmF0ZSBkaXJlY3RvcnkgbmFtZXMgb24KLVVuaXgpLiAgQSBwYXR0ZXJuIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgQHNhbXB7Kn0gY2hhcmFjdGVyIGlzIGFuCi1leGNlcHRpb247IGl0IHdpbGwgYWx3YXlzIG1hdGNoIGFueSBmaWxlIG5hbWUsIHdoZXRoZXIgaXQgY29udGFpbnMgYQotQHNhbXB7L30gb3Igbm90LiAgSW4gYSBzZWN0aW9uIG5hbWUsIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXJzIHdpbGwgbWF0Y2gKLWEgQHNhbXB7L30gY2hhcmFjdGVyLgotCi1GaWxlIG5hbWUgd2lsZGNhcmQgcGF0dGVybnMgb25seSBtYXRjaCBmaWxlcyB3aGljaCBhcmUgZXhwbGljaXRseQotc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gYW4gQGNvZGV7SU5QVVR9IGNvbW1hbmQuICBUaGUgbGlua2VyCi1kb2VzIG5vdCBzZWFyY2ggZGlyZWN0b3JpZXMgdG8gZXhwYW5kIHdpbGRjYXJkcy4KLQotSWYgYSBmaWxlIG5hbWUgbWF0Y2hlcyBtb3JlIHRoYW4gb25lIHdpbGRjYXJkIHBhdHRlcm4sIG9yIGlmIGEgZmlsZSBuYW1lCi1hcHBlYXJzIGV4cGxpY2l0bHkgYW5kIGlzIGFsc28gbWF0Y2hlZCBieSBhIHdpbGRjYXJkIHBhdHRlcm4sIHRoZSBsaW5rZXIKLXdpbGwgdXNlIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gIEZvciBleGFtcGxlLCB0aGlzCi1zZXF1ZW5jZSBvZiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9ucyBpcyBwcm9iYWJseSBpbiBlcnJvciwgYmVjYXVzZSB0aGUKLUBmaWxle2RhdGEub30gcnVsZSB3aWxsIG5vdCBiZSB1c2VkOgotQHNtYWxsZXhhbXBsZQotLmRhdGEgOiBAeyAqKC5kYXRhKSBAfQotLmRhdGExIDogQHsgZGF0YS5vKC5kYXRhKSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBTT1JUCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIHBsYWNlIGZpbGVzIGFuZCBzZWN0aW9ucyBtYXRjaGVkIGJ5IHdpbGRjYXJkcwotaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHNlZW4gZHVyaW5nIHRoZSBsaW5rLiAgWW91IGNhbiBjaGFuZ2UKLXRoaXMgYnkgdXNpbmcgdGhlIEBjb2Rle1NPUlR9IGtleXdvcmQsIHdoaWNoIGFwcGVhcnMgYmVmb3JlIGEgd2lsZGNhcmQKLXBhdHRlcm4gaW4gcGFyZW50aGVzZXMgKGUuZy4sIEBjb2Rle1NPUlQoLnRleHQqKX0pLiAgV2hlbiB0aGUKLUBjb2Rle1NPUlR9IGtleXdvcmQgaXMgdXNlZCwgdGhlIGxpbmtlciB3aWxsIHNvcnQgdGhlIGZpbGVzIG9yIHNlY3Rpb25zCi1pbnRvIGFzY2VuZGluZyBvcmRlciBieSBuYW1lIGJlZm9yZSBwbGFjaW5nIHRoZW0gaW4gdGhlIG91dHB1dCBmaWxlLgotCi1JZiB5b3UgZXZlciBnZXQgY29uZnVzZWQgYWJvdXQgd2hlcmUgaW5wdXQgc2VjdGlvbnMgYXJlIGdvaW5nLCB1c2UgdGhlCi1Ac2FtcHstTX0gbGlua2VyIG9wdGlvbiB0byBnZW5lcmF0ZSBhIG1hcCBmaWxlLiAgVGhlIG1hcCBmaWxlIHNob3dzCi1wcmVjaXNlbHkgaG93IGlucHV0IHNlY3Rpb25zIGFyZSBtYXBwZWQgdG8gb3V0cHV0IHNlY3Rpb25zLgotCi1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHdpbGRjYXJkIHBhdHRlcm5zIG1pZ2h0IGJlIHVzZWQgdG8gcGFydGl0aW9uCi1maWxlcy4gIFRoaXMgbGlua2VyIHNjcmlwdCBkaXJlY3RzIHRoZSBsaW5rZXIgdG8gcGxhY2UgYWxsIEBzYW1wey50ZXh0fQotc2VjdGlvbnMgaW4gQHNhbXB7LnRleHR9IGFuZCBhbGwgQHNhbXB7LmJzc30gc2VjdGlvbnMgaW4gQHNhbXB7LmJzc30uCi1UaGUgbGlua2VyIHdpbGwgcGxhY2UgdGhlIEBzYW1wey5kYXRhfSBzZWN0aW9uIGZyb20gYWxsIGZpbGVzIGJlZ2lubmluZwotd2l0aCBhbiB1cHBlciBjYXNlIGNoYXJhY3RlciBpbiBAc2FtcHsuREFUQX07IGZvciBhbGwgb3RoZXIgZmlsZXMsIHRoZQotbGlua2VyIHdpbGwgcGxhY2UgdGhlIEBzYW1wey5kYXRhfSBzZWN0aW9uIGluIEBzYW1wey5kYXRhfS4KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsKLSAgLnRleHQgOiBAeyAqKC50ZXh0KSBAfQotICAuREFUQSA6IEB7IFtBLVpdKiguZGF0YSkgQH0KLSAgLmRhdGEgOiBAeyAqKC5kYXRhKSBAfQotICAuYnNzIDogQHsgKiguYnNzKSBAfQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIElucHV0IFNlY3Rpb24gQ29tbW9uCi1Ac3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGZvciBjb21tb24gc3ltYm9scwotQGNpbmRleCBjb21tb24gc3ltYm9sIHBsYWNlbWVudAotQGNpbmRleCB1bmluaXRpYWxpemVkIGRhdGEgcGxhY2VtZW50Ci1BIHNwZWNpYWwgbm90YXRpb24gaXMgbmVlZGVkIGZvciBjb21tb24gc3ltYm9scywgYmVjYXVzZSBpbiBtYW55IG9iamVjdAotZmlsZSBmb3JtYXRzIGNvbW1vbiBzeW1ib2xzIGRvIG5vdCBoYXZlIGEgcGFydGljdWxhciBpbnB1dCBzZWN0aW9uLiAgVGhlCi1saW5rZXIgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGFzIHRob3VnaCB0aGV5IGFyZSBpbiBhbiBpbnB1dCBzZWN0aW9uCi1uYW1lZCBAc2FtcHtDT01NT059LgotCi1Zb3UgbWF5IHVzZSBmaWxlIG5hbWVzIHdpdGggdGhlIEBzYW1we0NPTU1PTn0gc2VjdGlvbiBqdXN0IGFzIHdpdGggYW55Ci1vdGhlciBpbnB1dCBzZWN0aW9ucy4gIFlvdSBjYW4gdXNlIHRoaXMgdG8gcGxhY2UgY29tbW9uIHN5bWJvbHMgZnJvbSBhCi1wYXJ0aWN1bGFyIGlucHV0IGZpbGUgaW4gb25lIHNlY3Rpb24gd2hpbGUgY29tbW9uIHN5bWJvbHMgZnJvbSBvdGhlcgotaW5wdXQgZmlsZXMgYXJlIHBsYWNlZCBpbiBhbm90aGVyIHNlY3Rpb24uCi0KLUluIG1vc3QgY2FzZXMsIGNvbW1vbiBzeW1ib2xzIGluIGlucHV0IGZpbGVzIHdpbGwgYmUgcGxhY2VkIGluIHRoZQotQHNhbXB7LmJzc30gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuICBGb3IgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLS5ic3MgQHsgKiguYnNzKSAqKENPTU1PTikgQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggc2NvbW1vbiBzZWN0aW9uCi1AY2luZGV4IHNtYWxsIGNvbW1vbiBzeW1ib2xzCi1Tb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgaGF2ZSBtb3JlIHRoYW4gb25lIHR5cGUgb2YgY29tbW9uIHN5bWJvbC4gIEZvcgotZXhhbXBsZSwgdGhlIE1JUFMgRUxGIG9iamVjdCBmaWxlIGZvcm1hdCBkaXN0aW5ndWlzaGVzIHN0YW5kYXJkIGNvbW1vbgotc3ltYm9scyBhbmQgc21hbGwgY29tbW9uIHN5bWJvbHMuICBJbiB0aGlzIGNhc2UsIHRoZSBsaW5rZXIgd2lsbCB1c2UgYQotZGlmZmVyZW50IHNwZWNpYWwgc2VjdGlvbiBuYW1lIGZvciBvdGhlciB0eXBlcyBvZiBjb21tb24gc3ltYm9scy4gIEluCi10aGUgY2FzZSBvZiBNSVBTIEVMRiwgdGhlIGxpbmtlciB1c2VzIEBzYW1we0NPTU1PTn0gZm9yIHN0YW5kYXJkIGNvbW1vbgotc3ltYm9scyBhbmQgQHNhbXB7LnNjb21tb259IGZvciBzbWFsbCBjb21tb24gc3ltYm9scy4gIFRoaXMgcGVybWl0cyB5b3UKLXRvIG1hcCB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGNvbW1vbiBzeW1ib2xzIGludG8gbWVtb3J5IGF0IGRpZmZlcmVudAotbG9jYXRpb25zLgotCi1AY2luZGV4IFtDT01NT05dCi1Zb3Ugd2lsbCBzb21ldGltZXMgc2VlIEBzYW1we1tDT01NT05dfSBpbiBvbGQgbGlua2VyIHNjcmlwdHMuICBUaGlzCi1ub3RhdGlvbiBpcyBub3cgY29uc2lkZXJlZCBvYnNvbGV0ZS4gIEl0IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1weyooQ09NTU9OKX0uCi0KLUBub2RlIElucHV0IFNlY3Rpb24gS2VlcAotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBhbmQgZ2FyYmFnZSBjb2xsZWN0aW9uCi1AY2luZGV4IEtFRVAKLUBjaW5kZXggZ2FyYmFnZSBjb2xsZWN0aW9uCi1XaGVuIGxpbmstdGltZSBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgaW4gdXNlIChAc2FtcHstLWdjLXNlY3Rpb25zfSksCi1pdCBpcyBvZnRlbiB1c2VmdWwgdG8gbWFyayBzZWN0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgZWxpbWluYXRlZC4gCi1UaGlzIGlzIGFjY29tcGxpc2hlZCBieSBzdXJyb3VuZGluZyBhbiBpbnB1dCBzZWN0aW9uJ3Mgd2lsZGNhcmQgZW50cnkKLXdpdGggQGNvZGV7S0VFUCgpfSwgYXMgaW4gQGNvZGV7S0VFUCgqKC5pbml0KSl9IG9yCi1AY29kZXtLRUVQKFNPUlQoKikoLmN0b3JzKSl9LgotCi1Abm9kZSBJbnB1dCBTZWN0aW9uIEV4YW1wbGUKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZXhhbXBsZQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIGEgY29tcGxldGUgbGlua2VyIHNjcmlwdC4gIEl0IHRlbGxzIHRoZSBsaW5rZXIKLXRvIHJlYWQgYWxsIG9mIHRoZSBzZWN0aW9ucyBmcm9tIGZpbGUgQGZpbGV7YWxsLm99IGFuZCBwbGFjZSB0aGVtIGF0IHRoZQotc3RhcnQgb2Ygb3V0cHV0IHNlY3Rpb24gQHNhbXB7b3V0cHV0YX0gd2hpY2ggc3RhcnRzIGF0IGxvY2F0aW9uCi1Ac2FtcHsweDEwMDAwfS4gIEFsbCBvZiBzZWN0aW9uIEBzYW1wey5pbnB1dDF9IGZyb20gZmlsZSBAZmlsZXtmb28ub30KLWZvbGxvd3MgaW1tZWRpYXRlbHksIGluIHRoZSBzYW1lIG91dHB1dCBzZWN0aW9uLiAgQWxsIG9mIHNlY3Rpb24KLUBzYW1wey5pbnB1dDJ9IGZyb20gQGZpbGV7Zm9vLm99IGdvZXMgaW50byBvdXRwdXQgc2VjdGlvbgotQHNhbXB7b3V0cHV0Yn0sIGZvbGxvd2VkIGJ5IHNlY3Rpb24gQHNhbXB7LmlucHV0MX0gZnJvbSBAZmlsZXtmb28xLm99LgotQWxsIG9mIHRoZSByZW1haW5pbmcgQHNhbXB7LmlucHV0MX0gYW5kIEBzYW1wey5pbnB1dDJ9IHNlY3Rpb25zIGZyb20gYW55Ci1maWxlcyBhcmUgd3JpdHRlbiB0byBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXRjfS4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAewotICBvdXRwdXRhIDB4MTAwMDAgOgotICAgIEB7Ci0gICAgYWxsLm8KLSAgICBmb28ubyAoLmlucHV0MSkKLSAgICBAfQotICBvdXRwdXRiIDoKLSAgICBAewotICAgIGZvby5vICguaW5wdXQyKQotICAgIGZvbzEubyAoLmlucHV0MSkKLSAgICBAfQotICBvdXRwdXRjIDoKLSAgICBAewotICAgICooLmlucHV0MSkKLSAgICAqKC5pbnB1dDIpCi0gICAgQH0KLUB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZSAgICAgICAgCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIERhdGEKLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGRhdGEKLUBjaW5kZXggZGF0YQotQGNpbmRleCBzZWN0aW9uIGRhdGEKLUBjaW5kZXggb3V0cHV0IHNlY3Rpb24gZGF0YQotQGtpbmRleCBCWVRFKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Aa2luZGV4IFNIT1JUKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Aa2luZGV4IExPTkcoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggUVVBRChAdmFye2V4cHJlc3Npb259KQotQGtpbmRleCBTUVVBRChAdmFye2V4cHJlc3Npb259KQotWW91IGNhbiBpbmNsdWRlIGV4cGxpY2l0IGJ5dGVzIG9mIGRhdGEgaW4gYW4gb3V0cHV0IHNlY3Rpb24gYnkgdXNpbmcKLUBjb2Rle0JZVEV9LCBAY29kZXtTSE9SVH0sIEBjb2Rle0xPTkd9LCBAY29kZXtRVUFEfSwgb3IgQGNvZGV7U1FVQUR9IGFzCi1hbiBvdXRwdXQgc2VjdGlvbiBjb21tYW5kLiAgRWFjaCBrZXl3b3JkIGlzIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gaW4KLXBhcmVudGhlc2VzIHByb3ZpZGluZyB0aGUgdmFsdWUgdG8gc3RvcmUgKEBweHJlZntFeHByZXNzaW9uc30pLiAgVGhlCi12YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBzdG9yZWQgYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uCi1jb3VudGVyLgotCi1UaGUgQGNvZGV7QllURX0sIEBjb2Rle1NIT1JUfSwgQGNvZGV7TE9OR30sIGFuZCBAY29kZXtRVUFEfSBjb21tYW5kcwotc3RvcmUgb25lLCB0d28sIGZvdXIsIGFuZCBlaWdodCBieXRlcyAocmVzcGVjdGl2ZWx5KS4gIEFmdGVyIHN0b3JpbmcgdGhlCi1ieXRlcywgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcwotc3RvcmVkLgotCi1Gb3IgZXhhbXBsZSwgdGhpcyB3aWxsIHN0b3JlIHRoZSBieXRlIDEgZm9sbG93ZWQgYnkgdGhlIGZvdXIgYnl0ZSB2YWx1ZQotb2YgdGhlIHN5bWJvbCBAc2FtcHthZGRyfToKLUBzbWFsbGV4YW1wbGUKLUJZVEUoMSkKLUxPTkcoYWRkcikKLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4gdXNpbmcgYSA2NCBiaXQgaG9zdCBvciB0YXJnZXQsIEBjb2Rle1FVQUR9IGFuZCBAY29kZXtTUVVBRH0gYXJlIHRoZQotc2FtZTsgdGhleSBib3RoIHN0b3JlIGFuIDggYnl0ZSwgb3IgNjQgYml0LCB2YWx1ZS4gIFdoZW4gYm90aCBob3N0IGFuZAotdGFyZ2V0IGFyZSAzMiBiaXRzLCBhbiBleHByZXNzaW9uIGlzIGNvbXB1dGVkIGFzIDMyIGJpdHMuICBJbiB0aGlzIGNhc2UKLUBjb2Rle1FVQUR9IHN0b3JlcyBhIDMyIGJpdCB2YWx1ZSB6ZXJvIGV4dGVuZGVkIHRvIDY0IGJpdHMsIGFuZAotQGNvZGV7U1FVQUR9IHN0b3JlcyBhIDMyIGJpdCB2YWx1ZSBzaWduIGV4dGVuZGVkIHRvIDY0IGJpdHMuCi0KLUlmIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlIGhhcyBhbiBleHBsaWNpdCBlbmRpYW5uZXNzLAotd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlLCB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQgaW4gdGhhdCBlbmRpYW5uZXNzLgotV2hlbiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXQgZW5kaWFubmVzcywgYXMgaXMKLXRydWUgb2YsIGZvciBleGFtcGxlLCBTLXJlY29yZHMsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUKLWVuZGlhbm5lc3Mgb2YgdGhlIGZpcnN0IGlucHV0IG9iamVjdCBmaWxlLgotCi1Aa2luZGV4IEZJTEwoQHZhcntleHByZXNzaW9ufSkKLUBjaW5kZXggaG9sZXMsIGZpbGxpbmcKLUBjaW5kZXggdW5zcGVjaWZpZWQgbWVtb3J5Ci1Zb3UgbWF5IHVzZSB0aGUgQGNvZGV7RklMTH0gY29tbWFuZCB0byBzZXQgdGhlIGZpbGwgcGF0dGVybiBmb3IgdGhlCi1jdXJyZW50IHNlY3Rpb24uICBJdCBpcyBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uIGluIHBhcmVudGhlc2VzLiAgQW55Ci1vdGhlcndpc2UgdW5zcGVjaWZpZWQgcmVnaW9ucyBvZiBtZW1vcnkgd2l0aGluIHRoZSBzZWN0aW9uIChmb3IgZXhhbXBsZSwKLWdhcHMgbGVmdCBkdWUgdG8gdGhlIHJlcXVpcmVkIGFsaWdubWVudCBvZiBpbnB1dCBzZWN0aW9ucykgYXJlIGZpbGxlZAotd2l0aCB0aGUgdHdvIGxlYXN0IHNpZ25pZmljYW50IGJ5dGVzIG9mIHRoZSBleHByZXNzaW9uLCByZXBlYXRlZCBhcwotbmVjZXNzYXJ5LiAgQSBAY29kZXtGSUxMfSBzdGF0ZW1lbnQgY292ZXJzIG1lbW9yeSBsb2NhdGlvbnMgYWZ0ZXIgdGhlCi1wb2ludCBhdCB3aGljaCBpdCBvY2N1cnMgaW4gdGhlIHNlY3Rpb24gZGVmaW5pdGlvbjsgYnkgaW5jbHVkaW5nIG1vcmUKLXRoYW4gb25lIEBjb2Rle0ZJTEx9IHN0YXRlbWVudCwgeW91IGNhbiBoYXZlIGRpZmZlcmVudCBmaWxsIHBhdHRlcm5zIGluCi1kaWZmZXJlbnQgcGFydHMgb2YgYW4gb3V0cHV0IHNlY3Rpb24uCi0KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gZmlsbCB1bnNwZWNpZmllZCByZWdpb25zIG9mIG1lbW9yeSB3aXRoIHRoZQotdmFsdWUgQHNhbXB7MHg5MDkwfToKLUBzbWFsbGV4YW1wbGUKLUZJTEwoMHg5MDkwKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBjb2Rle0ZJTEx9IGNvbW1hbmQgaXMgc2ltaWxhciB0byB0aGUgQHNhbXB7PUB2YXJ7ZmlsbGV4cH19IG91dHB1dAotc2VjdGlvbiBhdHRyaWJ1dGUgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBGaWxsfSksIGJ1dCBpdCBvbmx5IGFmZmVjdHMgdGhlCi1wYXJ0IG9mIHRoZSBzZWN0aW9uIGZvbGxvd2luZyB0aGUgQGNvZGV7RklMTH0gY29tbWFuZCwgcmF0aGVyIHRoYW4gdGhlCi1lbnRpcmUgc2VjdGlvbi4gIElmIGJvdGggYXJlIHVzZWQsIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kIHRha2VzCi1wcmVjZWRlbmNlLgotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBLZXl3b3JkcwotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24ga2V5d29yZHMKLVRoZXJlIGFyZSBhIGNvdXBsZSBvZiBrZXl3b3JkcyB3aGljaCBjYW4gYXBwZWFyIGFzIG91dHB1dCBzZWN0aW9uCi1jb21tYW5kcy4KLQotQHRhYmxlIEBjb2RlCi1Aa2luZGV4IENSRUFURV9PQkpFQ1RfU1lNQk9MUwotQGNpbmRleCBpbnB1dCBmaWxlbmFtZSBzeW1ib2xzCi1AY2luZGV4IGZpbGVuYW1lIHN5bWJvbHMKLUBpdGVtIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotVGhlIGNvbW1hbmQgdGVsbHMgdGhlIGxpbmtlciB0byBjcmVhdGUgYSBzeW1ib2wgZm9yIGVhY2ggaW5wdXQgZmlsZS4KLVRoZSBuYW1lIG9mIGVhY2ggc3ltYm9sIHdpbGwgYmUgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQKLWZpbGUuICBUaGUgc2VjdGlvbiBvZiBlYWNoIHN5bWJvbCB3aWxsIGJlIHRoZSBvdXRwdXQgc2VjdGlvbiBpbiB3aGljaAotdGhlIEBjb2Rle0NSRUFURV9PQkpFQ1RfU1lNQk9MU30gY29tbWFuZCBhcHBlYXJzLgotCi1UaGlzIGlzIGNvbnZlbnRpb25hbCBmb3IgdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdC4gIEl0IGlzIG5vdAotbm9ybWFsbHkgdXNlZCBmb3IgYW55IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdC4KLQotQGtpbmRleCBDT05TVFJVQ1RPUlMKLUBjaW5kZXggQysrIGNvbnN0cnVjdG9ycywgYXJyYW5naW5nIGluIGxpbmsKLUBjaW5kZXggY29uc3RydWN0b3JzLCBhcnJhbmdpbmcgaW4gbGluawotQGl0ZW0gQ09OU1RSVUNUT1JTCi1XaGVuIGxpbmtpbmcgdXNpbmcgdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCwgdGhlIGxpbmtlciB1c2VzIGFuCi11bnVzdWFsIHNldCBjb25zdHJ1Y3QgdG8gc3VwcG9ydCBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQKLWRlc3RydWN0b3JzLiAgV2hlbiBsaW5raW5nIG9iamVjdCBmaWxlIGZvcm1hdHMgd2hpY2ggZG8gbm90IHN1cHBvcnQKLWFyYml0cmFyeSBzZWN0aW9ucywgc3VjaCBhcyBFQ09GRiBhbmQgWENPRkYsIHRoZSBsaW5rZXIgd2lsbAotYXV0b21hdGljYWxseSByZWNvZ25pemUgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGJ5IG5hbWUuCi1Gb3IgdGhlc2Ugb2JqZWN0IGZpbGUgZm9ybWF0cywgdGhlIEBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCB0ZWxscyB0aGUKLWxpbmtlciB0byBwbGFjZSBjb25zdHJ1Y3RvciBpbmZvcm1hdGlvbiBpbiB0aGUgb3V0cHV0IHNlY3Rpb24gd2hlcmUgdGhlCi1AY29kZXtDT05TVFJVQ1RPUlN9IGNvbW1hbmQgYXBwZWFycy4gIFRoZSBAY29kZXtDT05TVFJVQ1RPUlN9IGNvbW1hbmQgaXMKLWlnbm9yZWQgZm9yIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLVRoZSBzeW1ib2wgQHd7QGNvZGV7X19DVE9SX0xJU1RfX319IG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgZ2xvYmFsCi1jb25zdHJ1Y3RvcnMsIGFuZCB0aGUgc3ltYm9sIEB3e0Bjb2Rle19fRFRPUl9MSVNUfX0gbWFya3MgdGhlIGVuZC4gIFRoZQotZmlyc3Qgd29yZCBpbiB0aGUgbGlzdCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMsIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzCi1vZiBlYWNoIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IsIGZvbGxvd2VkIGJ5IGEgemVybyB3b3JkLiAgVGhlCi1jb21waWxlciBtdXN0IGFycmFuZ2UgdG8gYWN0dWFsbHkgcnVuIHRoZSBjb2RlLiAgRm9yIHRoZXNlIG9iamVjdCBmaWxlCi1mb3JtYXRzIEBzY3tnbnV9IEMrKyBub3JtYWxseSBjYWxscyBjb25zdHJ1Y3RvcnMgZnJvbSBhIHN1YnJvdXRpbmUKLUBjb2Rle19fbWFpbn07IGEgY2FsbCB0byBAY29kZXtfX21haW59IGlzIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW50bwotdGhlIHN0YXJ0dXAgY29kZSBmb3IgQGNvZGV7bWFpbn0uICBAc2N7Z251fSBDKysgbm9ybWFsbHkgcnVucwotZGVzdHJ1Y3RvcnMgZWl0aGVyIGJ5IHVzaW5nIEBjb2Rle2F0ZXhpdH0sIG9yIGRpcmVjdGx5IGZyb20gdGhlIGZ1bmN0aW9uCi1AY29kZXtleGl0fS4KLQotRm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgc3VjaCBhcyBAY29kZXtDT0ZGfSBvciBAY29kZXtFTEZ9IHdoaWNoIHN1cHBvcnQKLWFyYml0cmFyeSBzZWN0aW9uIG5hbWVzLCBAc2N7Z251fSBDKysgd2lsbCBub3JtYWxseSBhcnJhbmdlIHRvIHB1dCB0aGUKLWFkZHJlc3NlcyBvZiBnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBpbnRvIHRoZSBAY29kZXsuY3RvcnN9Ci1hbmQgQGNvZGV7LmR0b3JzfSBzZWN0aW9ucy4gIFBsYWNpbmcgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBpbnRvIHlvdXIKLWxpbmtlciBzY3JpcHQgd2lsbCBidWlsZCB0aGUgc29ydCBvZiB0YWJsZSB3aGljaCB0aGUgQHNje2dudX0gQysrCi1ydW50aW1lIGNvZGUgZXhwZWN0cyB0byBzZWUuCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgIF9fQ1RPUl9MSVNUX18gPSAuOwotICAgICAgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMikKLSAgICAgICooLmN0b3JzKQotICAgICAgTE9ORygwKQotICAgICAgX19DVE9SX0VORF9fID0gLjsKLSAgICAgIF9fRFRPUl9MSVNUX18gPSAuOwotICAgICAgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMikKLSAgICAgICooLmR0b3JzKQotICAgICAgTE9ORygwKQotICAgICAgX19EVE9SX0VORF9fID0gLjsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHlvdSBhcmUgdXNpbmcgdGhlIEBzY3tnbnV9IEMrKyBzdXBwb3J0IGZvciBpbml0aWFsaXphdGlvbiBwcmlvcml0eSwKLXdoaWNoIHByb3ZpZGVzIHNvbWUgY29udHJvbCBvdmVyIHRoZSBvcmRlciBpbiB3aGljaCBnbG9iYWwgY29uc3RydWN0b3JzCi1hcmUgcnVuLCB5b3UgbXVzdCBzb3J0IHRoZSBjb25zdHJ1Y3RvcnMgYXQgbGluayB0aW1lIHRvIGVuc3VyZSB0aGF0IHRoZXkKLWFyZSBleGVjdXRlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gIFdoZW4gdXNpbmcgdGhlIEBjb2Rle0NPTlNUUlVDVE9SU30KLWNvbW1hbmQsIHVzZSBAc2FtcHtTT1JUKENPTlNUUlVDVE9SUyl9IGluc3RlYWQuICBXaGVuIHVzaW5nIHRoZQotQGNvZGV7LmN0b3JzfSBhbmQgQGNvZGV7LmR0b3JzfSBzZWN0aW9ucywgdXNlIEBzYW1weyooU09SVCguY3RvcnMpKX0gYW5kCi1Ac2FtcHsqKFNPUlQoLmR0b3JzKSl9IGluc3RlYWQgb2YganVzdCBAc2FtcHsqKC5jdG9ycyl9IGFuZAotQHNhbXB7KiguZHRvcnMpfS4KLQotTm9ybWFsbHkgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIgd2lsbCBoYW5kbGUgdGhlc2UgaXNzdWVzIGF1dG9tYXRpY2FsbHksCi1hbmQgeW91IHdpbGwgbm90IG5lZWQgdG8gY29uY2VybiB5b3Vyc2VsZiB3aXRoIHRoZW0uICBIb3dldmVyLCB5b3UgbWF5Ci1uZWVkIHRvIGNvbnNpZGVyIHRoaXMgaWYgeW91IGFyZSB1c2luZyBDKysgYW5kIHdyaXRpbmcgeW91ciBvd24gbGlua2VyCi1zY3JpcHRzLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIERpc2NhcmRpbmcKLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGRpc2NhcmRpbmcKLUBjaW5kZXggZGlzY2FyZGluZyBzZWN0aW9ucwotQGNpbmRleCBzZWN0aW9ucywgZGlzY2FyZGluZwotQGNpbmRleCByZW1vdmluZyBzZWN0aW9ucwotVGhlIGxpbmtlciB3aWxsIG5vdCBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gd2hpY2ggZG8gbm90IGhhdmUgYW55Ci1jb250ZW50cy4gIFRoaXMgaXMgZm9yIGNvbnZlbmllbmNlIHdoZW4gcmVmZXJyaW5nIHRvIGlucHV0IHNlY3Rpb25zIHRoYXQKLW1heSBvciBtYXkgbm90IGJlIHByZXNlbnQgaW4gYW55IG9mIHRoZSBpbnB1dCBmaWxlcy4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotLmZvbyBAeyAqKC5mb28pIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aWxsIG9ubHkgY3JlYXRlIGEgQHNhbXB7LmZvb30gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgaWYgdGhlcmUgaXMgYQotQHNhbXB7LmZvb30gc2VjdGlvbiBpbiBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsZS4KLQotSWYgeW91IHVzZSBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gYXMgYW4gb3V0cHV0Ci1zZWN0aW9uIGNvbW1hbmQsIHN1Y2ggYXMgYSBzeW1ib2wgYXNzaWdubWVudCwgdGhlbiB0aGUgb3V0cHV0IHNlY3Rpb24KLXdpbGwgYWx3YXlzIGJlIGNyZWF0ZWQsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIG1hdGNoaW5nIGlucHV0IHNlY3Rpb25zLgotCi1AY2luZGV4IC9ESVNDQVJELwotVGhlIHNwZWNpYWwgb3V0cHV0IHNlY3Rpb24gbmFtZSBAc2FtcHsvRElTQ0FSRC99IG1heSBiZSB1c2VkIHRvIGRpc2NhcmQKLWlucHV0IHNlY3Rpb25zLiAgQW55IGlucHV0IHNlY3Rpb25zIHdoaWNoIGFyZSBhc3NpZ25lZCB0byBhbiBvdXRwdXQKLXNlY3Rpb24gbmFtZWQgQHNhbXB7L0RJU0NBUkQvfSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gQXR0cmlidXRlcwotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlcwotQGNpbmRleCBvdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGVzCi1XZSBzaG93ZWQgYWJvdmUgdGhhdCB0aGUgZnVsbCBkZXNjcmlwdGlvbiBvZiBhbiBvdXRwdXQgc2VjdGlvbiBsb29rZWQKLWxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cCAKLUB2YXJ7c2VjdGlvbn0gW0B2YXJ7YWRkcmVzc31dIFsoQHZhcnt0eXBlfSldIDogW0FUKEB2YXJ7bG1hfSldCi0gIEB7Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICBAZG90c3t9Ci0gIEB9IFs+QHZhcntyZWdpb259XSBbOkB2YXJ7cGhkcn0gOkB2YXJ7cGhkcn0gQGRvdHN7fV0gWz1AdmFye2ZpbGxleHB9XQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLVdlJ3ZlIGFscmVhZHkgZGVzY3JpYmVkIEB2YXJ7c2VjdGlvbn0sIEB2YXJ7YWRkcmVzc30sIGFuZAotQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfS4gIEluIHRoaXMgc2VjdGlvbiB3ZSB3aWxsIGRlc2NyaWJlIHRoZQotcmVtYWluaW5nIHNlY3Rpb24gYXR0cmlidXRlcy4KLQotQG1lbnUgCi0qIE91dHB1dCBTZWN0aW9uIFR5cGU6OgkJT3V0cHV0IHNlY3Rpb24gdHlwZQotKiBPdXRwdXQgU2VjdGlvbiBMTUE6OgkJT3V0cHV0IHNlY3Rpb24gTE1BCi0qIE91dHB1dCBTZWN0aW9uIFJlZ2lvbjo6CU91dHB1dCBzZWN0aW9uIHJlZ2lvbgotKiBPdXRwdXQgU2VjdGlvbiBQaGRyOjoJCU91dHB1dCBzZWN0aW9uIHBoZHIKLSogT3V0cHV0IFNlY3Rpb24gRmlsbDo6CQlPdXRwdXQgc2VjdGlvbiBmaWxsCi1AZW5kIG1lbnUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gVHlwZQotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gdHlwZQotRWFjaCBvdXRwdXQgc2VjdGlvbiBtYXkgaGF2ZSBhIHR5cGUuICBUaGUgdHlwZSBpcyBhIGtleXdvcmQgaW4KLXBhcmVudGhlc2VzLiAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgZGVmaW5lZDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBOT0xPQUQKLVRoZSBzZWN0aW9uIHNob3VsZCBiZSBtYXJrZWQgYXMgbm90IGxvYWRhYmxlLCBzbyB0aGF0IGl0IHdpbGwgbm90IGJlCi1sb2FkZWQgaW50byBtZW1vcnkgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4uCi1AaXRlbSBEU0VDVAotQGl0ZW14IENPUFkKLUBpdGVteCBJTkZPCi1AaXRlbXggT1ZFUkxBWQotVGhlc2UgdHlwZSBuYW1lcyBhcmUgc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBhbmQgYXJlCi1yYXJlbHkgdXNlZC4gIFRoZXkgYWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0OiB0aGUgc2VjdGlvbiBzaG91bGQgYmUKLW1hcmtlZCBhcyBub3QgYWxsb2NhdGFibGUsIHNvIHRoYXQgbm8gbWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IgdGhlCi1zZWN0aW9uIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLgotQGVuZCB0YWJsZQotCi1Aa2luZGV4IE5PTE9BRAotQGNpbmRleCBwcmV2ZW50IHVubmVjZXNzYXJ5IGxvYWRpbmcKLUBjaW5kZXggbG9hZGluZywgcHJldmVudGluZwotVGhlIGxpbmtlciBub3JtYWxseSBzZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG91dHB1dCBzZWN0aW9uIGJhc2VkIG9uCi10aGUgaW5wdXQgc2VjdGlvbnMgd2hpY2ggbWFwIGludG8gaXQuICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcKLXRoZSBzZWN0aW9uIHR5cGUuICBGb3IgZXhhbXBsZSwgaW4gdGhlIHNjcmlwdCBzYW1wbGUgYmVsb3csIHRoZQotQHNhbXB7Uk9NfSBzZWN0aW9uIGlzIGFkZHJlc3NlZCBhdCBtZW1vcnkgbG9jYXRpb24gQHNhbXB7MH0gYW5kIGRvZXMgbm90Ci1uZWVkIHRvIGJlIGxvYWRlZCB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bi4gIFRoZSBjb250ZW50cyBvZiB0aGUKLUBzYW1we1JPTX0gc2VjdGlvbiB3aWxsIGFwcGVhciBpbiB0aGUgbGlua2VyIG91dHB1dCBmaWxlIGFzIHVzdWFsLgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAewotICBST00gMCAoTk9MT0FEKSA6IEB7IEBkb3Rze30gQH0KLSAgQGRvdHN7fQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIExNQQotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gTE1BCi1Aa2luZGV4IEFUKEB2YXJ7bG1hfSkKLUBjaW5kZXggbG9hZCBhZGRyZXNzCi1AY2luZGV4IHNlY3Rpb24gbG9hZCBhZGRyZXNzCi1FdmVyeSBzZWN0aW9uIGhhcyBhIHZpcnR1YWwgYWRkcmVzcyAoVk1BKSBhbmQgYSBsb2FkIGFkZHJlc3MgKExNQSk7IHNlZQotQHJlZntCYXNpYyBTY3JpcHQgQ29uY2VwdHN9LiAgVGhlIGFkZHJlc3MgZXhwcmVzc2lvbiB3aGljaCBtYXkgYXBwZWFyIGluCi1hbiBvdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBzZXRzIHRoZSBWTUEgKEBweHJlZntPdXRwdXQgU2VjdGlvbgotQWRkcmVzc30pLgotCi1UaGUgbGlua2VyIHdpbGwgbm9ybWFsbHkgc2V0IHRoZSBMTUEgZXF1YWwgdG8gdGhlIFZNQS4gIFlvdSBjYW4gY2hhbmdlCi10aGF0IGJ5IHVzaW5nIHRoZSBAY29kZXtBVH0ga2V5d29yZC4gIFRoZSBleHByZXNzaW9uIEB2YXJ7bG1hfSB0aGF0Ci1mb2xsb3dzIHRoZSBAY29kZXtBVH0ga2V5d29yZCBzcGVjaWZpZXMgdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbi4KLQotQGNpbmRleCBST00gaW5pdGlhbGl6ZWQgZGF0YQotQGNpbmRleCBpbml0aWFsaXplZCBkYXRhIGluIFJPTQotVGhpcyBmZWF0dXJlIGlzIGRlc2lnbmVkIHRvIG1ha2UgaXQgZWFzeSB0byBidWlsZCBhIFJPTSBpbWFnZS4gIEZvcgotZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBsaW5rZXIgc2NyaXB0IGNyZWF0ZXMgdGhyZWUgb3V0cHV0IHNlY3Rpb25zOiBvbmUKLWNhbGxlZCBAc2FtcHsudGV4dH0sIHdoaWNoIHN0YXJ0cyBhdCBAY29kZXsweDEwMDB9LCBvbmUgY2FsbGVkCi1Ac2FtcHsubWRhdGF9LCB3aGljaCBpcyBsb2FkZWQgYXQgdGhlIGVuZCBvZiB0aGUgQHNhbXB7LnRleHR9IHNlY3Rpb24KLWV2ZW4gdGhvdWdoIGl0cyBWTUEgaXMgQGNvZGV7MHgyMDAwfSwgYW5kIG9uZSBjYWxsZWQgQHNhbXB7LmJzc30gdG8gaG9sZAotdW5pbml0aWFsaXplZCBkYXRhIGF0IGFkZHJlc3MgQGNvZGV7MHgzMDAwfS4gIFRoZSBzeW1ib2wgQGNvZGV7X2RhdGF9IGlzCi1kZWZpbmVkIHdpdGggdGhlIHZhbHVlIEBjb2RlezB4MjAwMH0sIHdoaWNoIHNob3dzIHRoYXQgdGhlIGxvY2F0aW9uCi1jb3VudGVyIGhvbGRzIHRoZSBWTUEgdmFsdWUsIG5vdCB0aGUgTE1BIHZhbHVlLgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TCi0gIEB7Ci0gIC50ZXh0IDB4MTAwMCA6IEB7ICooLnRleHQpIF9ldGV4dCA9IC4gOyBAfQotICAubWRhdGEgMHgyMDAwIDogCi0gICAgQVQgKCBBRERSICgudGV4dCkgKyBTSVpFT0YgKC50ZXh0KSApCi0gICAgQHsgX2RhdGEgPSAuIDsgKiguZGF0YSk7IF9lZGF0YSA9IC4gOyAgQH0KLSAgLmJzcyAweDMwMDAgOgotICAgIEB7IF9ic3RhcnQgPSAuIDsgICooLmJzcykgKihDT01NT04pIDsgX2JlbmQgPSAuIDtAfQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBydW4tdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvciB1c2Ugd2l0aCBhIHByb2dyYW0gZ2VuZXJhdGVkIHdpdGgKLXRoaXMgbGlua2VyIHNjcmlwdCB3b3VsZCBpbmNsdWRlIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcsIHRvIGNvcHkKLXRoZSBpbml0aWFsaXplZCBkYXRhIGZyb20gdGhlIFJPTSBpbWFnZSB0byBpdHMgcnVudGltZSBhZGRyZXNzLiAgTm90aWNlCi1ob3cgdGhpcyBjb2RlIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIKLXNjcmlwdC4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1leHRlcm4gY2hhciBfZXRleHQsIF9kYXRhLCBfZWRhdGEsIF9ic3RhcnQsIF9iZW5kOwotY2hhciAqc3JjID0gJl9ldGV4dDsKLWNoYXIgKmRzdCA9ICZfZGF0YTsKLQotLyogUk9NIGhhcyBkYXRhIGF0IGVuZCBvZiB0ZXh0OyBjb3B5IGl0LiAqLwotd2hpbGUgKGRzdCA8ICZfZWRhdGEpIEB7Ci0gICpkc3QrKyA9ICpzcmMrKzsKLUB9Ci0KLS8qIFplcm8gYnNzICovCi1mb3IgKGRzdCA9ICZfYnN0YXJ0OyBkc3Q8ICZfYmVuZDsgZHN0KyspCi0gICpkc3QgPSAwOwotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gUmVnaW9uCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiByZWdpb24KLUBraW5kZXggPkB2YXJ7cmVnaW9ufQotQGNpbmRleCBzZWN0aW9uLCBhc3NpZ25pbmcgdG8gbWVtb3J5IHJlZ2lvbgotQGNpbmRleCBtZW1vcnkgcmVnaW9ucyBhbmQgc2VjdGlvbnMKLVlvdSBjYW4gYXNzaWduIGEgc2VjdGlvbiB0byBhIHByZXZpb3VzbHkgZGVmaW5lZCByZWdpb24gb2YgbWVtb3J5IGJ5Ci11c2luZyBAc2FtcHs+QHZhcntyZWdpb259fS4gIEB4cmVme01FTU9SWX0uCi0KLUhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotTUVNT1JZIEB7IHJvbSA6IE9SSUdJTiA9IDB4MTAwMCwgTEVOR1RIID0gMHgxMDAwIEB9Ci1TRUNUSU9OUyBAeyBST00gOiBAeyAqKC50ZXh0KSBAfSA+cm9tIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBQaGRyCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBwaGRyCi1Aa2luZGV4IDpAdmFye3BoZHJ9Ci1AY2luZGV4IHNlY3Rpb24sIGFzc2lnbmluZyB0byBwcm9ncmFtIGhlYWRlcgotQGNpbmRleCBwcm9ncmFtIGhlYWRlcnMgYW5kIHNlY3Rpb25zCi1Zb3UgY2FuIGFzc2lnbiBhIHNlY3Rpb24gdG8gYSBwcmV2aW91c2x5IGRlZmluZWQgcHJvZ3JhbSBzZWdtZW50IGJ5Ci11c2luZyBAc2FtcHs6QHZhcntwaGRyfX0uICBAeHJlZntQSERSU30uICBJZiBhIHNlY3Rpb24gaXMgYXNzaWduZWQgdG8KLW9uZSBvciBtb3JlIHNlZ21lbnRzLCB0aGVuIGFsbCBzdWJzZXF1ZW50IGFsbG9jYXRlZCBzZWN0aW9ucyB3aWxsIGJlCi1hc3NpZ25lZCB0byB0aG9zZSBzZWdtZW50cyBhcyB3ZWxsLCB1bmxlc3MgdGhleSB1c2UgYW4gZXhwbGljaXRseQotQGNvZGV7OkB2YXJ7cGhkcn19IG1vZGlmaWVyLiAgWW91IGNhbiB1c2UgQGNvZGV7Ok5PTkV9IHRvIHRlbGwgdGhlCi1saW5rZXIgdG8gbm90IHB1dCB0aGUgc2VjdGlvbiBpbiBhbnkgc2VnbWVudCBhdCBhbGwuCi0KLUhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotUEhEUlMgQHsgdGV4dCBQVF9MT0FEIDsgQH0KLVNFQ1RJT05TIEB7IC50ZXh0IDogQHsgKigudGV4dCkgQH0gOnRleHQgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEZpbGwKLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGZpbGwKLUBraW5kZXggPUB2YXJ7ZmlsbGV4cH0KLUBjaW5kZXggc2VjdGlvbiBmaWxsIHBhdHRlcm4KLUBjaW5kZXggZmlsbCBwYXR0ZXJuLCBlbnRpcmUgc2VjdGlvbgotWW91IGNhbiBzZXQgdGhlIGZpbGwgcGF0dGVybiBmb3IgYW4gZW50aXJlIHNlY3Rpb24gYnkgdXNpbmcKLUBzYW1wez1AdmFye2ZpbGxleHB9fS4gIEB2YXJ7ZmlsbGV4cH0gaXMgYW4gZXhwcmVzc2lvbgotKEBweHJlZntFeHByZXNzaW9uc30pLiAgQW55IG90aGVyd2lzZSB1bnNwZWNpZmllZCByZWdpb25zIG9mIG1lbW9yeQotd2l0aGluIHRoZSBvdXRwdXQgc2VjdGlvbiAoZm9yIGV4YW1wbGUsIGdhcHMgbGVmdCBkdWUgdG8gdGhlIHJlcXVpcmVkCi1hbGlnbm1lbnQgb2YgaW5wdXQgc2VjdGlvbnMpIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3byBsZWFzdAotc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIHZhbHVlLCByZXBlYXRlZCBhcyBuZWNlc3NhcnkuCi0KLVlvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIGZpbGwgdmFsdWUgd2l0aCBhIEBjb2Rle0ZJTEx9IGNvbW1hbmQgaW4gdGhlCi1vdXRwdXQgc2VjdGlvbiBjb21tYW5kczsgc2VlIEByZWZ7T3V0cHV0IFNlY3Rpb24gRGF0YX0uCi0KLUhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA9MHg5MDkwIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBPdmVybGF5IERlc2NyaXB0aW9uCi1Ac3Vic2VjdGlvbiBPdmVybGF5IGRlc2NyaXB0aW9uCi1Aa2luZGV4IE9WRVJMQVkKLUBjaW5kZXggb3ZlcmxheXMKLUFuIG92ZXJsYXkgZGVzY3JpcHRpb24gcHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gZGVzY3JpYmUgc2VjdGlvbnMgd2hpY2gKLWFyZSB0byBiZSBsb2FkZWQgYXMgcGFydCBvZiBhIHNpbmdsZSBtZW1vcnkgaW1hZ2UgYnV0IGFyZSB0byBiZSBydW4gYXQKLXRoZSBzYW1lIG1lbW9yeSBhZGRyZXNzLiAgQXQgcnVuIHRpbWUsIHNvbWUgc29ydCBvZiBvdmVybGF5IG1hbmFnZXIgd2lsbAotY29weSB0aGUgb3ZlcmxhaWQgc2VjdGlvbnMgaW4gYW5kIG91dCBvZiB0aGUgcnVudGltZSBtZW1vcnkgYWRkcmVzcyBhcwotcmVxdWlyZWQsIHBlcmhhcHMgYnkgc2ltcGx5IG1hbmlwdWxhdGluZyBhZGRyZXNzaW5nIGJpdHMuICBUaGlzIGFwcHJvYWNoCi1jYW4gYmUgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiBhIGNlcnRhaW4gcmVnaW9uIG9mIG1lbW9yeSBpcyBmYXN0ZXIKLXRoYW4gYW5vdGhlci4KLQotT3ZlcmxheXMgYXJlIGRlc2NyaWJlZCB1c2luZyB0aGUgQGNvZGV7T1ZFUkxBWX0gY29tbWFuZC4gIFRoZQotQGNvZGV7T1ZFUkxBWX0gY29tbWFuZCBpcyB1c2VkIHdpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLCBsaWtlIGFuCi1vdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbi4gIFRoZSBmdWxsIHN5bnRheCBvZiB0aGUgQGNvZGV7T1ZFUkxBWX0KLWNvbW1hbmQgaXMgYXMgZm9sbG93czoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotT1ZFUkxBWSBbQHZhcntzdGFydH1dIDogW05PQ1JPU1NSRUZTXSBbQVQgKCBAdmFye2xkYWRkcn0gKV0KLSAgQHsKLSAgICBAdmFye3NlY25hbWUxfQotICAgICAgQHsKLSAgICAgICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEBkb3Rze30KLSAgICAgIEB9IFs6QHZhcntwaGRyfUBkb3Rze31dIFs9QHZhcntmaWxsfV0KLSAgICBAdmFye3NlY25hbWUyfQotICAgICAgQHsKLSAgICAgICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEBkb3Rze30KLSAgICAgIEB9IFs6QHZhcntwaGRyfUBkb3Rze31dIFs9QHZhcntmaWxsfV0KLSAgICBAZG90c3t9Ci0gIEB9IFs+QHZhcntyZWdpb259XSBbOkB2YXJ7cGhkcn1AZG90c3t9XSBbPUB2YXJ7ZmlsbH1dCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1FdmVyeXRoaW5nIGlzIG9wdGlvbmFsIGV4Y2VwdCBAY29kZXtPVkVSTEFZfSAoYSBrZXl3b3JkKSwgYW5kIGVhY2gKLXNlY3Rpb24gbXVzdCBoYXZlIGEgbmFtZSAoQHZhcntzZWNuYW1lMX0gYW5kIEB2YXJ7c2VjbmFtZTJ9IGFib3ZlKS4gIFRoZQotc2VjdGlvbiBkZWZpbml0aW9ucyB3aXRoaW4gdGhlIEBjb2Rle09WRVJMQVl9IGNvbnN0cnVjdCBhcmUgaWRlbnRpY2FsIHRvCi10aG9zZSB3aXRoaW4gdGhlIGdlbmVyYWwgQGNvZGV7U0VDVElPTlN9IGNvbnRydWN0IChAcHhyZWZ7U0VDVElPTlN9KSwKLWV4Y2VwdCB0aGF0IG5vIGFkZHJlc3NlcyBhbmQgbm8gbWVtb3J5IHJlZ2lvbnMgbWF5IGJlIGRlZmluZWQgZm9yCi1zZWN0aW9ucyB3aXRoaW4gYW4gQGNvZGV7T1ZFUkxBWX0uCi0KLVRoZSBzZWN0aW9ucyBhcmUgYWxsIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBzdGFydGluZyBhZGRyZXNzLiAgVGhlIGxvYWQKLWFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgYXJlIGFycmFuZ2VkIHN1Y2ggdGhhdCB0aGV5IGFyZSBjb25zZWN1dGl2ZSBpbgotbWVtb3J5IHN0YXJ0aW5nIGF0IHRoZSBsb2FkIGFkZHJlc3MgdXNlZCBmb3IgdGhlIEBjb2Rle09WRVJMQVl9IGFzIGEKLXdob2xlIChhcyB3aXRoIG5vcm1hbCBzZWN0aW9uIGRlZmluaXRpb25zLCB0aGUgbG9hZCBhZGRyZXNzIGlzIG9wdGlvbmFsLAotYW5kIGRlZmF1bHRzIHRvIHRoZSBzdGFydCBhZGRyZXNzOyB0aGUgc3RhcnQgYWRkcmVzcyBpcyBhbHNvIG9wdGlvbmFsLAotYW5kIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyKS4KLQotSWYgdGhlIEBjb2Rle05PQ1JPU1NSRUZTfSBrZXl3b3JkIGlzIHVzZWQsIGFuZCB0aGVyZSBhbnkgcmVmZXJlbmNlcwotYW1vbmcgdGhlIHNlY3Rpb25zLCB0aGUgbGlua2VyIHdpbGwgcmVwb3J0IGFuIGVycm9yLiAgU2luY2UgdGhlIHNlY3Rpb25zCi1hbGwgcnVuIGF0IHRoZSBzYW1lIGFkZHJlc3MsIGl0IG5vcm1hbGx5IGRvZXMgbm90IG1ha2Ugc2Vuc2UgZm9yIG9uZQotc2VjdGlvbiB0byByZWZlciBkaXJlY3RseSB0byBhbm90aGVyLiAgQHhyZWZ7TWlzY2VsbGFuZW91cyBDb21tYW5kcywKLU5PQ1JPU1NSRUZTfS4KLQotRm9yIGVhY2ggc2VjdGlvbiB3aXRoaW4gdGhlIEBjb2Rle09WRVJMQVl9LCB0aGUgbGlua2VyIGF1dG9tYXRpY2FsbHkKLWRlZmluZXMgdHdvIHN5bWJvbHMuICBUaGUgc3ltYm9sIEBjb2Rle19fbG9hZF9zdGFydF9AdmFye3NlY25hbWV9fSBpcwotZGVmaW5lZCBhcyB0aGUgc3RhcnRpbmcgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uLiAgVGhlIHN5bWJvbAotQGNvZGV7X19sb2FkX3N0b3BfQHZhcntzZWNuYW1lfX0gaXMgZGVmaW5lZCBhcyB0aGUgZmluYWwgbG9hZCBhZGRyZXNzIG9mCi10aGUgc2VjdGlvbi4gIEFueSBjaGFyYWN0ZXJzIHdpdGhpbiBAdmFye3NlY25hbWV9IHdoaWNoIGFyZSBub3QgbGVnYWwKLXdpdGhpbiBDIGlkZW50aWZpZXJzIGFyZSByZW1vdmVkLiAgQyAob3IgYXNzZW1ibGVyKSBjb2RlIG1heSB1c2UgdGhlc2UKLXN5bWJvbHMgdG8gbW92ZSB0aGUgb3ZlcmxhaWQgc2VjdGlvbnMgYXJvdW5kIGFzIG5lY2Vzc2FyeS4KLQotQXQgdGhlIGVuZCBvZiB0aGUgb3ZlcmxheSwgdGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlzIHNldCB0bwotdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG92ZXJsYXkgcGx1cyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBzZWN0aW9uLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUuICBSZW1lbWJlciB0aGF0IHRoaXMgd291bGQgYXBwZWFyIGluc2lkZSBhCi1AY29kZXtTRUNUSU9OU30gY29uc3RydWN0LgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi0gIE9WRVJMQVkgMHgxMDAwIDogQVQgKDB4NDAwMCkKLSAgIEB7Ci0gICAgIC50ZXh0MCBAeyBvMS8qLm8oLnRleHQpIEB9Ci0gICAgIC50ZXh0MSBAeyBvMi8qLm8oLnRleHQpIEB9Ci0gICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB3aWxsIGRlZmluZSBib3RoIEBzYW1wey50ZXh0MH0gYW5kIEBzYW1wey50ZXh0MX0gdG8gc3RhcnQgYXQKLWFkZHJlc3MgMHgxMDAwLiAgQHNhbXB7LnRleHQwfSB3aWxsIGJlIGxvYWRlZCBhdCBhZGRyZXNzIDB4NDAwMCwgYW5kCi1Ac2FtcHsudGV4dDF9IHdpbGwgYmUgbG9hZGVkIGltbWVkaWF0ZWx5IGFmdGVyIEBzYW1wey50ZXh0MH0uICBUaGUKLWZvbGxvd2luZyBzeW1ib2xzIHdpbGwgYmUgZGVmaW5lZDogQGNvZGV7X19sb2FkX3N0YXJ0X3RleHQwfSwKLUBjb2Rle19fbG9hZF9zdG9wX3RleHQwfSwgQGNvZGV7X19sb2FkX3N0YXJ0X3RleHQxfSwKLUBjb2Rle19fbG9hZF9zdG9wX3RleHQxfS4KLQotQyBjb2RlIHRvIGNvcHkgb3ZlcmxheSBAY29kZXsudGV4dDF9IGludG8gdGhlIG92ZXJsYXkgYXJlYSBtaWdodCBsb29rCi1saWtlIHRoZSBmb2xsb3dpbmcuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotICBleHRlcm4gY2hhciBfX2xvYWRfc3RhcnRfdGV4dDEsIF9fbG9hZF9zdG9wX3RleHQxOwotICBtZW1jcHkgKChjaGFyICopIDB4MTAwMCwgJl9fbG9hZF9zdGFydF90ZXh0MSwKLSAgICAgICAgICAmX19sb2FkX3N0b3BfdGV4dDEgLSAmX19sb2FkX3N0YXJ0X3RleHQxKTsKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLU5vdGUgdGhhdCB0aGUgQGNvZGV7T1ZFUkxBWX0gY29tbWFuZCBpcyBqdXN0IHN5bnRhY3RpYyBzdWdhciwgc2luY2UKLWV2ZXJ5dGhpbmcgaXQgZG9lcyBjYW4gYmUgZG9uZSB1c2luZyB0aGUgbW9yZSBiYXNpYyBjb21tYW5kcy4gIFRoZSBhYm92ZQotZXhhbXBsZSBjb3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBpZGVudGljYWxseSBhcyBmb2xsb3dzLgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLSAgLnRleHQwIDB4MTAwMCA6IEFUICgweDQwMDApIEB7IG8xLyoubygudGV4dCkgQH0KLSAgX19sb2FkX3N0YXJ0X3RleHQwID0gTE9BREFERFIgKC50ZXh0MCk7Ci0gIF9fbG9hZF9zdG9wX3RleHQwID0gTE9BREFERFIgKC50ZXh0MCkgKyBTSVpFT0YgKC50ZXh0MCk7Ci0gIC50ZXh0MSAweDEwMDAgOiBBVCAoMHg0MDAwICsgU0laRU9GICgudGV4dDApKSBAeyBvMi8qLm8oLnRleHQpIEB9Ci0gIF9fbG9hZF9zdGFydF90ZXh0MSA9IExPQURBRERSICgudGV4dDEpOwotICBfX2xvYWRfc3RvcF90ZXh0MSA9IExPQURBRERSICgudGV4dDEpICsgU0laRU9GICgudGV4dDEpOwotICAuID0gMHgxMDAwICsgTUFYIChTSVpFT0YgKC50ZXh0MCksIFNJWkVPRiAoLnRleHQxKSk7Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBNRU1PUlkKLUBzZWN0aW9uIE1FTU9SWSBjb21tYW5kCi1Aa2luZGV4IE1FTU9SWQotQGNpbmRleCBtZW1vcnkgcmVnaW9ucwotQGNpbmRleCByZWdpb25zIG9mIG1lbW9yeQotQGNpbmRleCBhbGxvY2F0aW5nIG1lbW9yeQotQGNpbmRleCBkaXNjb250aW51b3VzIG1lbW9yeQotVGhlIGxpbmtlcidzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwZXJtaXRzIGFsbG9jYXRpb24gb2YgYWxsIGF2YWlsYWJsZQotbWVtb3J5LiAgWW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5IHVzaW5nIHRoZSBAY29kZXtNRU1PUll9IGNvbW1hbmQuCi0KLVRoZSBAY29kZXtNRU1PUll9IGNvbW1hbmQgZGVzY3JpYmVzIHRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiBibG9ja3Mgb2YKLW1lbW9yeSBpbiB0aGUgdGFyZ2V0LiAgWW91IGNhbiB1c2UgaXQgdG8gZGVzY3JpYmUgd2hpY2ggbWVtb3J5IHJlZ2lvbnMKLW1heSBiZSB1c2VkIGJ5IHRoZSBsaW5rZXIsIGFuZCB3aGljaCBtZW1vcnkgcmVnaW9ucyBpdCBtdXN0IGF2b2lkLiAgWW91Ci1jYW4gdGhlbiBhc3NpZ24gc2VjdGlvbnMgdG8gcGFydGljdWxhciBtZW1vcnkgcmVnaW9ucy4gIFRoZSBsaW5rZXIgd2lsbAotc2V0IHNlY3Rpb24gYWRkcmVzc2VzIGJhc2VkIG9uIHRoZSBtZW1vcnkgcmVnaW9ucywgYW5kIHdpbGwgd2FybiBhYm91dAotcmVnaW9ucyB0aGF0IGJlY29tZSB0b28gZnVsbC4gIFRoZSBsaW5rZXIgd2lsbCBub3Qgc2h1ZmZsZSBzZWN0aW9ucwotYXJvdW5kIHRvIGZpdCBpbnRvIHRoZSBhdmFpbGFibGUgcmVnaW9ucy4KLQotQSBsaW5rZXIgc2NyaXB0IG1heSBjb250YWluIGF0IG1vc3Qgb25lIHVzZSBvZiB0aGUgQGNvZGV7TUVNT1JZfQotY29tbWFuZC4gIEhvd2V2ZXIsIHlvdSBjYW4gZGVmaW5lIGFzIG1hbnkgYmxvY2tzIG9mIG1lbW9yeSB3aXRoaW4gaXQgYXMKLXlvdSB3aXNoLiAgVGhlIHN5bnRheCBpczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotTUVNT1JZIAotICBAewotICAgIEB2YXJ7bmFtZX0gWyhAdmFye2F0dHJ9KV0gOiBPUklHSU4gPSBAdmFye29yaWdpbn0sIExFTkdUSCA9IEB2YXJ7bGVufQotICAgIEBkb3Rze30KLSAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAdmFye25hbWV9IGlzIGEgbmFtZSB1c2VkIGluIHRoZSBsaW5rZXIgc2NyaXB0IHRvIHJlZmVyIHRvIHRoZQotcmVnaW9uLiAgVGhlIHJlZ2lvbiBuYW1lIGhhcyBubyBtZWFuaW5nIG91dHNpZGUgb2YgdGhlIGxpbmtlciBzY3JpcHQuCi1SZWdpb24gbmFtZXMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG5hbWUgc3BhY2UsIGFuZCB3aWxsIG5vdCBjb25mbGljdAotd2l0aCBzeW1ib2wgbmFtZXMsIGZpbGUgbmFtZXMsIG9yIHNlY3Rpb24gbmFtZXMuICBFYWNoIG1lbW9yeSByZWdpb24KLW11c3QgaGF2ZSBhIGRpc3RpbmN0IG5hbWUuCi0KLUBjaW5kZXggbWVtb3J5IHJlZ2lvbiBhdHRyaWJ1dGVzCi1UaGUgQHZhcnthdHRyfSBzdHJpbmcgaXMgYW4gb3B0aW9uYWwgbGlzdCBvZiBhdHRyaWJ1dGVzIHRoYXQgc3BlY2lmeQotd2hldGhlciB0byB1c2UgYSBwYXJ0aWN1bGFyIG1lbW9yeSByZWdpb24gZm9yIGFuIGlucHV0IHNlY3Rpb24gd2hpY2ggaXMKLW5vdCBleHBsaWNpdGx5IG1hcHBlZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gIEFzIGRlc2NyaWJlZCBpbgotQHJlZntTRUNUSU9OU30sIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbiBvdXRwdXQgc2VjdGlvbiBmb3Igc29tZSBpbnB1dAotc2VjdGlvbiwgdGhlIGxpbmtlciB3aWxsIGNyZWF0ZSBhbiBvdXRwdXQgc2VjdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKLXRoZSBpbnB1dCBzZWN0aW9uLiAgSWYgeW91IGRlZmluZSByZWdpb24gYXR0cmlidXRlcywgdGhlIGxpbmtlciB3aWxsIHVzZQotdGhlbSB0byBzZWxlY3QgdGhlIG1lbW9yeSByZWdpb24gZm9yIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGF0IGl0IGNyZWF0ZXMuCi0KLVRoZSBAdmFye2F0dHJ9IHN0cmluZyBtdXN0IGNvbnNpc3Qgb25seSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6Ci1AdGFibGUgQHNhbXAKLUBpdGVtIFIKLVJlYWQtb25seSBzZWN0aW9uCi1AaXRlbSBXCi1SZWFkL3dyaXRlIHNlY3Rpb24KLUBpdGVtIFgKLUV4ZWN1dGFibGUgc2VjdGlvbgotQGl0ZW0gQQotQWxsb2NhdGFibGUgc2VjdGlvbgotQGl0ZW0gSQotSW5pdGlhbGl6ZWQgc2VjdGlvbgotQGl0ZW0gTAotU2FtZSBhcyBAc2FtcHtJfQotQGl0ZW0gIQotSW52ZXJ0IHRoZSBzZW5zZSBvZiBhbnkgb2YgdGhlIHByZWNlZGluZyBhdHRyaWJ1dGVzCi1AZW5kIHRhYmxlCi0KLUlmIGEgdW5tYXBwZWQgc2VjdGlvbiBtYXRjaGVzIGFueSBvZiB0aGUgbGlzdGVkIGF0dHJpYnV0ZXMgb3RoZXIgdGhhbgotQHNhbXB7IX0sIGl0IHdpbGwgYmUgcGxhY2VkIGluIHRoZSBtZW1vcnkgcmVnaW9uLiAgVGhlIEBzYW1weyF9Ci1hdHRyaWJ1dGUgcmV2ZXJzZXMgdGhpcyB0ZXN0LCBzbyB0aGF0IGFuIHVubWFwcGVkIHNlY3Rpb24gd2lsbCBiZSBwbGFjZWQKLWluIHRoZSBtZW1vcnkgcmVnaW9uIG9ubHkgaWYgaXQgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBsaXN0ZWQKLWF0dHJpYnV0ZXMuCi0KLUBraW5kZXggT1JJR0lOID0KLUBraW5kZXggbyA9Ci1Aa2luZGV4IG9yZyA9Ci1UaGUgQHZhcntvcmlnaW59IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKLXJlZ2lvbi4gIFRoZSBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gYSBjb25zdGFudCBiZWZvcmUgbWVtb3J5Ci1hbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCwgd2hpY2ggbWVhbnMgdGhhdCB5b3UgbWF5IG5vdCB1c2UgYW55IHNlY3Rpb24KLXJlbGF0aXZlIHN5bWJvbHMuICBUaGUga2V5d29yZCBAY29kZXtPUklHSU59IG1heSBiZSBhYmJyZXZpYXRlZCB0bwotQGNvZGV7b3JnfSBvciBAY29kZXtvfSAoYnV0IG5vdCwgZm9yIGV4YW1wbGUsIEBjb2Rle09SR30pLgotCi1Aa2luZGV4IExFTkdUSCA9Ci1Aa2luZGV4IGxlbiA9Ci1Aa2luZGV4IGwgPQotVGhlIEB2YXJ7bGVufSBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbWVtb3J5Ci1yZWdpb24uICBBcyB3aXRoIHRoZSBAdmFye29yaWdpbn0gZXhwcmVzc2lvbiwgdGhlIGV4cHJlc3Npb24gbXVzdAotZXZhbHVhdGUgdG8gYSBjb25zdGFudCBiZWZvcmUgbWVtb3J5IGFsbG9jYXRpb24gaXMgcGVyZm9ybWVkLiAgVGhlCi1rZXl3b3JkIEBjb2Rle0xFTkdUSH0gbWF5IGJlIGFiYnJldmlhdGVkIHRvIEBjb2Rle2xlbn0gb3IgQGNvZGV7bH0uCi0KLUluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2Ugc3BlY2lmeSB0aGF0IHRoZXJlIGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMKLWF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbjogb25lIHN0YXJ0aW5nIGF0IEBzYW1wezB9IGZvciAyNTYga2lsb2J5dGVzLAotYW5kIHRoZSBvdGhlciBzdGFydGluZyBhdCBAc2FtcHsweDQwMDAwMDAwfSBmb3IgZm91ciBtZWdhYnl0ZXMuICBUaGUKLWxpbmtlciB3aWxsIHBsYWNlIGludG8gdGhlIEBzYW1we3JvbX0gbWVtb3J5IHJlZ2lvbiBldmVyeSBzZWN0aW9uIHdoaWNoCi1pcyBub3QgZXhwbGljaXRseSBtYXBwZWQgaW50byBhIG1lbW9yeSByZWdpb24sIGFuZCBpcyBlaXRoZXIgcmVhZC1vbmx5Ci1vciBleGVjdXRhYmxlLiAgVGhlIGxpbmtlciB3aWxsIHBsYWNlIG90aGVyIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QKLWV4cGxpY2l0bHkgbWFwcGVkIGludG8gYSBtZW1vcnkgcmVnaW9uIGludG8gdGhlIEBzYW1we3JhbX0gbWVtb3J5Ci1yZWdpb24uCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotTUVNT1JZIAotICBAewotICAgIHJvbSAocngpICA6IE9SSUdJTiA9IDAsIExFTkdUSCA9IDI1NksKLSAgICByYW0gKCFyeCkgOiBvcmcgPSAweDQwMDAwMDAwLCBsID0gNE0KLSAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLU9uY2UgeW91IGRlZmluZSBhIG1lbW9yeSByZWdpb24sIHlvdSBjYW4gZGlyZWN0IHRoZSBsaW5rZXIgdG8gcGxhY2UKLXNwZWNpZmljIG91dHB1dCBzZWN0aW9ucyBpbnRvIHRoYXQgbWVtb3J5IHJlZ2lvbiBieSB1c2luZyB0aGUKLUBzYW1wez5AdmFye3JlZ2lvbn19IG91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQotYSBtZW1vcnkgcmVnaW9uIG5hbWVkIEBzYW1we21lbX0sIHlvdSB3b3VsZCB1c2UgQHNhbXB7Pm1lbX0gaW4gdGhlCi1vdXRwdXQgc2VjdGlvbiBkZWZpbml0aW9uLiAgQHhyZWZ7T3V0cHV0IFNlY3Rpb24gUmVnaW9ufS4gIElmIG5vIGFkZHJlc3MKLXdhcyBzcGVjaWZpZWQgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhlIGxpbmtlciB3aWxsIHNldCB0aGUgYWRkcmVzcyB0bwotdGhlIG5leHQgYXZhaWxhYmxlIGFkZHJlc3Mgd2l0aGluIHRoZSBtZW1vcnkgcmVnaW9uLiAgSWYgdGhlIGNvbWJpbmVkCi1vdXRwdXQgc2VjdGlvbnMgZGlyZWN0ZWQgdG8gYSBtZW1vcnkgcmVnaW9uIGFyZSB0b28gbGFyZ2UgZm9yIHRoZQotcmVnaW9uLCB0aGUgbGlua2VyIHdpbGwgaXNzdWUgYW4gZXJyb3IgbWVzc2FnZS4KLQotQG5vZGUgUEhEUlMKLUBzZWN0aW9uIFBIRFJTIENvbW1hbmQKLUBraW5kZXggUEhEUlMKLUBjaW5kZXggcHJvZ3JhbSBoZWFkZXJzCi1AY2luZGV4IEVMRiBwcm9ncmFtIGhlYWRlcnMKLUBjaW5kZXggcHJvZ3JhbSBzZWdtZW50cwotQGNpbmRleCBzZWdtZW50cywgRUxGCi1UaGUgRUxGIG9iamVjdCBmaWxlIGZvcm1hdCB1c2VzIEBkZm57cHJvZ3JhbSBoZWFkZXJzfSwgYWxzbyBrbm93cyBhcwotQGRmbntzZWdtZW50c30uICBUaGUgcHJvZ3JhbSBoZWFkZXJzIGRlc2NyaWJlIGhvdyB0aGUgcHJvZ3JhbSBzaG91bGQgYmUKLWxvYWRlZCBpbnRvIG1lbW9yeS4gIFlvdSBjYW4gcHJpbnQgdGhlbSBvdXQgYnkgdXNpbmcgdGhlIEBjb2Rle29iamR1bXB9Ci1wcm9ncmFtIHdpdGggdGhlIEBzYW1wey1wfSBvcHRpb24uCi0KLVdoZW4geW91IHJ1biBhbiBFTEYgcHJvZ3JhbSBvbiBhIG5hdGl2ZSBFTEYgc3lzdGVtLCB0aGUgc3lzdGVtIGxvYWRlcgotcmVhZHMgdGhlIHByb2dyYW0gaGVhZGVycyBpbiBvcmRlciB0byBmaWd1cmUgb3V0IGhvdyB0byBsb2FkIHRoZQotcHJvZ3JhbS4gIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIHByb2dyYW0gaGVhZGVycyBhcmUgc2V0IGNvcnJlY3RseS4KLVRoaXMgbWFudWFsIGRvZXMgbm90IGRlc2NyaWJlIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGUgc3lzdGVtIGxvYWRlcgotaW50ZXJwcmV0cyBwcm9ncmFtIGhlYWRlcnM7IGZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIEVMRiBBQkkuCi0KLVRoZSBsaW5rZXIgd2lsbCBjcmVhdGUgcmVhc29uYWJsZSBwcm9ncmFtIGhlYWRlcnMgYnkgZGVmYXVsdC4gIEhvd2V2ZXIsCi1pbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSB0aGUgcHJvZ3JhbSBoZWFkZXJzIG1vcmUKLXByZWNpc2VseS4gIFlvdSBtYXkgdXNlIHRoZSBAY29kZXtQSERSU30gY29tbWFuZCBmb3IgdGhpcyBwdXJwb3NlLiAgV2hlbgotdGhlIGxpbmtlciBzZWVzIHRoZSBAY29kZXtQSERSU30gY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdCwgaXQgd2lsbAotbm90IGNyZWF0ZSBhbnkgcHJvZ3JhbSBoZWFkZXJzIG90aGVyIHRoYW4gdGhlIG9uZXMgc3BlY2lmaWVkLgotCi1UaGUgbGlua2VyIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIHdoZW4KLWdlbmVyYXRpbmcgYW4gRUxGIG91dHB1dCBmaWxlLiAgSW4gb3RoZXIgY2FzZXMsIHRoZSBsaW5rZXIgd2lsbCBzaW1wbHkKLWlnbm9yZSBAY29kZXtQSERSU30uCi0KLVRoaXMgaXMgdGhlIHN5bnRheCBvZiB0aGUgQGNvZGV7UEhEUlN9IGNvbW1hbmQuICBUaGUgd29yZHMgQGNvZGV7UEhEUlN9LAotQGNvZGV7RklMRUhEUn0sIEBjb2Rle0FUfSwgYW5kIEBjb2Rle0ZMQUdTfSBhcmUga2V5d29yZHMuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotUEhEUlMKLUB7Ci0gIEB2YXJ7bmFtZX0gQHZhcnt0eXBlfSBbIEZJTEVIRFIgXSBbIFBIRFJTIF0gWyBBVCAoIEB2YXJ7YWRkcmVzc30gKSBdCi0gICAgICAgIFsgRkxBR1MgKCBAdmFye2ZsYWdzfSApIF0gOwotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAdmFye25hbWV9IGlzIHVzZWQgb25seSBmb3IgcmVmZXJlbmNlIGluIHRoZSBAY29kZXtTRUNUSU9OU30gY29tbWFuZAotb2YgdGhlIGxpbmtlciBzY3JpcHQuICBJdCBpcyBub3QgcHV0IGludG8gdGhlIG91dHB1dCBmaWxlLiAgUHJvZ3JhbQotaGVhZGVyIG5hbWVzIGFyZSBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBuYW1lIHNwYWNlLCBhbmQgd2lsbCBub3QgY29uZmxpY3QKLXdpdGggc3ltYm9sIG5hbWVzLCBmaWxlIG5hbWVzLCBvciBzZWN0aW9uIG5hbWVzLiAgRWFjaCBwcm9ncmFtIGhlYWRlcgotbXVzdCBoYXZlIGEgZGlzdGluY3QgbmFtZS4KLQotQ2VydGFpbiBwcm9ncmFtIGhlYWRlciB0eXBlcyBkZXNjcmliZSBzZWdtZW50cyBvZiBtZW1vcnkgd2hpY2ggdGhlCi1zeXN0ZW0gbG9hZGVyIHdpbGwgbG9hZCBmcm9tIHRoZSBmaWxlLiAgSW4gdGhlIGxpbmtlciBzY3JpcHQsIHlvdQotc3BlY2lmeSB0aGUgY29udGVudHMgb2YgdGhlc2Ugc2VnbWVudHMgYnkgcGxhY2luZyBhbGxvY2F0YWJsZSBvdXRwdXQKLXNlY3Rpb25zIGluIHRoZSBzZWdtZW50cy4gIFlvdSB1c2UgdGhlIEBzYW1wezpAdmFye3BoZHJ9fSBvdXRwdXQgc2VjdGlvbgotYXR0cmlidXRlIHRvIHBsYWNlIGEgc2VjdGlvbiBpbiBhIHBhcnRpY3VsYXIgc2VnbWVudC4gIEB4cmVme091dHB1dAotU2VjdGlvbiBQaGRyfS4KLQotSXQgaXMgbm9ybWFsIHRvIHB1dCBjZXJ0YWluIHNlY3Rpb25zIGluIG1vcmUgdGhhbiBvbmUgc2VnbWVudC4gIFRoaXMKLW1lcmVseSBpbXBsaWVzIHRoYXQgb25lIHNlZ21lbnQgb2YgbWVtb3J5IGNvbnRhaW5zIGFub3RoZXIuICBZb3UgbWF5Ci1yZXBlYXQgQHNhbXB7OkB2YXJ7cGhkcn19LCB1c2luZyBpdCBvbmNlIGZvciBlYWNoIHNlZ21lbnQgd2hpY2ggc2hvdWxkCi1jb250YWluIHRoZSBzZWN0aW9uLgotCi1JZiB5b3UgcGxhY2UgYSBzZWN0aW9uIGluIG9uZSBvciBtb3JlIHNlZ21lbnRzIHVzaW5nIEBzYW1wezpAdmFye3BoZHJ9fSwKLXRoZW4gdGhlIGxpbmtlciB3aWxsIHBsYWNlIGFsbCBzdWJzZXF1ZW50IGFsbG9jYXRhYmxlIHNlY3Rpb25zIHdoaWNoIGRvCi1ub3Qgc3BlY2lmeSBAc2FtcHs6QHZhcntwaGRyfX0gaW4gdGhlIHNhbWUgc2VnbWVudHMuICBUaGlzIGlzIGZvcgotY29udmVuaWVuY2UsIHNpbmNlIGdlbmVyYWxseSBhIHdob2xlIHNldCBvZiBjb250aWd1b3VzIHNlY3Rpb25zIHdpbGwgYmUKLXBsYWNlZCBpbiBhIHNpbmdsZSBzZWdtZW50LiAgWW91IGNhbiB1c2UgQGNvZGV7Ok5PTkV9IHRvIG92ZXJyaWRlIHRoZQotZGVmYXVsdCBzZWdtZW50IGFuZCB0ZWxsIHRoZSBsaW5rZXIgdG8gbm90IHB1dCB0aGUgc2VjdGlvbiBpbiBhbnkKLXNlZ21lbnQgYXQgYWxsLgotCi1Aa2luZGV4IEZJTEVIRFIKLUBraW5kZXggUEhEUlMKLVlvdSBtYXkgdXNlIHRoZSBAY29kZXtGSUxFSERSfSBhbmQgQGNvZGV7UEhEUlN9IGtleXdvcmRzIGFwcGVhciBhZnRlcgotdGhlIHByb2dyYW0gaGVhZGVyIHR5cGUgdG8gZnVydGhlciBkZXNjcmliZSB0aGUgY29udGVudHMgb2YgdGhlIHNlZ21lbnQuCi1UaGUgQGNvZGV7RklMRUhEUn0ga2V5d29yZCBtZWFucyB0aGF0IHRoZSBzZWdtZW50IHNob3VsZCBpbmNsdWRlIHRoZSBFTEYKLWZpbGUgaGVhZGVyLiAgVGhlIEBjb2Rle1BIRFJTfSBrZXl3b3JkIG1lYW5zIHRoYXQgdGhlIHNlZ21lbnQgc2hvdWxkCi1pbmNsdWRlIHRoZSBFTEYgcHJvZ3JhbSBoZWFkZXJzIHRoZW1zZWx2ZXMuCi0KLVRoZSBAdmFye3R5cGV9IG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZy4gIFRoZSBudW1iZXJzIGluZGljYXRlIHRoZQotdmFsdWUgb2YgdGhlIGtleXdvcmQuCi0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gQGNvZGV7UFRfTlVMTH0gKDApCi1JbmRpY2F0ZXMgYW4gdW51c2VkIHByb2dyYW0gaGVhZGVyLgotCi1AaXRlbSBAY29kZXtQVF9MT0FEfSAoMSkKLUluZGljYXRlcyB0aGF0IHRoaXMgcHJvZ3JhbSBoZWFkZXIgZGVzY3JpYmVzIGEgc2VnbWVudCB0byBiZSBsb2FkZWQgZnJvbQotdGhlIGZpbGUuCi0KLUBpdGVtIEBjb2Rle1BUX0RZTkFNSUN9ICgyKQotSW5kaWNhdGVzIGEgc2VnbWVudCB3aGVyZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kLgotCi1AaXRlbSBAY29kZXtQVF9JTlRFUlB9ICgzKQotSW5kaWNhdGVzIGEgc2VnbWVudCB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBpbnRlcnByZXRlciBtYXkgYmUKLWZvdW5kLgotCi1AaXRlbSBAY29kZXtQVF9OT1RFfSAoNCkKLUluZGljYXRlcyBhIHNlZ21lbnQgaG9sZGluZyBub3RlIGluZm9ybWF0aW9uLgotCi1AaXRlbSBAY29kZXtQVF9TSExJQn0gKDUpCi1BIHJlc2VydmVkIHByb2dyYW0gaGVhZGVyIHR5cGUsIGRlZmluZWQgYnV0IG5vdCBzcGVjaWZpZWQgYnkgdGhlIEVMRgotQUJJLgotCi1AaXRlbSBAY29kZXtQVF9QSERSfSAoNikKLUluZGljYXRlcyBhIHNlZ21lbnQgd2hlcmUgdGhlIHByb2dyYW0gaGVhZGVycyBtYXkgYmUgZm91bmQuCi0KLUBpdGVtIEB2YXJ7ZXhwcmVzc2lvbn0KLUFuIGV4cHJlc3Npb24gZ2l2aW5nIHRoZSBudW1lcmljIHR5cGUgb2YgdGhlIHByb2dyYW0gaGVhZGVyLiAgVGhpcyBtYXkKLWJlIHVzZWQgZm9yIHR5cGVzIG5vdCBkZWZpbmVkIGFib3ZlLgotQGVuZCB0YWJsZQotCi1Zb3UgY2FuIHNwZWNpZnkgdGhhdCBhIHNlZ21lbnQgc2hvdWxkIGJlIGxvYWRlZCBhdCBhIHBhcnRpY3VsYXIgYWRkcmVzcwotaW4gbWVtb3J5IGJ5IHVzaW5nIGFuIEBjb2Rle0FUfSBleHByZXNzaW9uLiAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlCi1AY29kZXtBVH0gY29tbWFuZCB1c2VkIGFzIGFuIG91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZSAoQHB4cmVme091dHB1dAotU2VjdGlvbiBMTUF9KS4gIFRoZSBAY29kZXtBVH0gY29tbWFuZCBmb3IgYSBwcm9ncmFtIGhlYWRlciBvdmVycmlkZXMgdGhlCi1vdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGUuCi0KLVRoZSBsaW5rZXIgd2lsbCBub3JtYWxseSBzZXQgdGhlIHNlZ21lbnQgZmxhZ3MgYmFzZWQgb24gdGhlIHNlY3Rpb25zCi13aGljaCBjb21wcmlzZSB0aGUgc2VnbWVudC4gIFlvdSBtYXkgdXNlIHRoZSBAY29kZXtGTEFHU30ga2V5d29yZCB0bwotZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBzZWdtZW50IGZsYWdzLiAgVGhlIHZhbHVlIG9mIEB2YXJ7ZmxhZ3N9IG11c3QgYmUKLWFuIGludGVnZXIuICBJdCBpcyB1c2VkIHRvIHNldCB0aGUgQGNvZGV7cF9mbGFnc30gZmllbGQgb2YgdGhlIHByb2dyYW0KLWhlYWRlci4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIEBjb2Rle1BIRFJTfS4gIFRoaXMgc2hvd3MgYSB0eXBpY2FsIHNldCBvZiBwcm9ncmFtCi1oZWFkZXJzIHVzZWQgb24gYSBuYXRpdmUgRUxGIHN5c3RlbS4KLQotQGV4YW1wbGUKLUBncm91cAotUEhEUlMKLUB7Ci0gIGhlYWRlcnMgUFRfUEhEUiBQSERSUyA7Ci0gIGludGVycCBQVF9JTlRFUlAgOwotICB0ZXh0IFBUX0xPQUQgRklMRUhEUiBQSERSUyA7Ci0gIGRhdGEgUFRfTE9BRCA7Ci0gIGR5bmFtaWMgUFRfRFlOQU1JQyA7Ci1AfQotCi1TRUNUSU9OUwotQHsKLSAgLiA9IFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogQHsgKiguaW50ZXJwKSBAfSA6dGV4dCA6aW50ZXJwCi0gIC50ZXh0IDogQHsgKigudGV4dCkgQH0gOnRleHQKLSAgLnJvZGF0YSA6IEB7ICooLnJvZGF0YSkgQH0gLyogZGVmYXVsdHMgdG8gOnRleHQgKi8KLSAgQGRvdHN7fQotICAuID0gLiArIDB4MTAwMDsgLyogbW92ZSB0byBhIG5ldyBwYWdlIGluIG1lbW9yeSAqLwotICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9IDpkYXRhCi0gIC5keW5hbWljIDogQHsgKiguZHluYW1pYykgQH0gOmRhdGEgOmR5bmFtaWMKLSAgQGRvdHN7fQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBWRVJTSU9OCi1Ac2VjdGlvbiBWRVJTSU9OIENvbW1hbmQKLUBraW5kZXggVkVSU0lPTiBAe3NjcmlwdCB0ZXh0QH0KLUBjaW5kZXggc3ltYm9sIHZlcnNpb25zCi1AY2luZGV4IHZlcnNpb24gc2NyaXB0Ci1AY2luZGV4IHZlcnNpb25zIG9mIHN5bWJvbHMKLVRoZSBsaW5rZXIgc3VwcG9ydHMgc3ltYm9sIHZlcnNpb25zIHdoZW4gdXNpbmcgRUxGLiAgU3ltYm9sIHZlcnNpb25zIGFyZQotb25seSB1c2VmdWwgd2hlbiB1c2luZyBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIGR5bmFtaWMgbGlua2VyIGNhbiB1c2UKLXN5bWJvbCB2ZXJzaW9ucyB0byBzZWxlY3QgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIGEgZnVuY3Rpb24gd2hlbiBpdCBydW5zCi1hIHByb2dyYW0gdGhhdCBtYXkgaGF2ZSBiZWVuIGxpbmtlZCBhZ2FpbnN0IGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUKLXNoYXJlZCBsaWJyYXJ5LgotCi1Zb3UgY2FuIGluY2x1ZGUgYSB2ZXJzaW9uIHNjcmlwdCBkaXJlY3RseSBpbiB0aGUgbWFpbiBsaW5rZXIgc2NyaXB0LCBvcgoteW91IGNhbiBzdXBwbHkgdGhlIHZlcnNpb24gc2NyaXB0IGFzIGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQuICBZb3UgY2FuCi1hbHNvIHVzZSB0aGUgQHNhbXB7LS12ZXJzaW9uLXNjcmlwdH0gbGlua2VyIG9wdGlvbi4KLQotVGhlIHN5bnRheCBvZiB0aGUgQGNvZGV7VkVSU0lPTn0gY29tbWFuZCBpcyBzaW1wbHkKLUBzbWFsbGV4YW1wbGUKLVZFUlNJT04gQHsgdmVyc2lvbi1zY3JpcHQtY29tbWFuZHMgQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBmb3JtYXQgb2YgdGhlIHZlcnNpb24gc2NyaXB0IGNvbW1hbmRzIGlzIGlkZW50aWNhbCB0byB0aGF0IHVzZWQgYnkKLVN1bidzIGxpbmtlciBpbiBTb2xhcmlzIDIuNS4gIFRoZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIGEgdHJlZSBvZgotdmVyc2lvbiBub2Rlcy4gIFlvdSBzcGVjaWZ5IHRoZSBub2RlIG5hbWVzIGFuZCBpbnRlcmRlcGVuZGVuY2llcyBpbiB0aGUKLXZlcnNpb24gc2NyaXB0LiAgWW91IGNhbiBzcGVjaWZ5IHdoaWNoIHN5bWJvbHMgYXJlIGJvdW5kIHRvIHdoaWNoCi12ZXJzaW9uIG5vZGVzLCBhbmQgeW91IGNhbiByZWR1Y2UgYSBzcGVjaWZpZWQgc2V0IG9mIHN5bWJvbHMgdG8gbG9jYWwKLXNjb3BlIHNvIHRoYXQgdGhleSBhcmUgbm90IGdsb2JhbGx5IHZpc2libGUgb3V0c2lkZSBvZiB0aGUgc2hhcmVkCi1saWJyYXJ5LgotCi1UaGUgZWFzaWVzdCB3YXkgdG8gZGVtb25zdHJhdGUgdGhlIHZlcnNpb24gc2NyaXB0IGxhbmd1YWdlIGlzIHdpdGggYSBmZXcKLWV4YW1wbGVzLgotCi1Ac21hbGxleGFtcGxlCi1WRVJTXzEuMSBAewotCSBnbG9iYWw6Ci0JCSBmb28xOwotCSBsb2NhbDoKLQkJIG9sZCo7IAotCQkgb3JpZ2luYWwqOyAKLQkJIG5ldyo7IAotQH07Ci0KLVZFUlNfMS4yIEB7Ci0JCSBmb28yOwotQH0gVkVSU18xLjE7Ci0KLVZFUlNfMi4wIEB7Ci0JCSBiYXIxOyBiYXIyOwotQH0gVkVSU18xLjI7Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIGV4YW1wbGUgdmVyc2lvbiBzY3JpcHQgZGVmaW5lcyB0aHJlZSB2ZXJzaW9uIG5vZGVzLiAgVGhlIGZpcnN0Ci12ZXJzaW9uIG5vZGUgZGVmaW5lZCBpcyBAc2FtcHtWRVJTXzEuMX07IGl0IGhhcyBubyBvdGhlciBkZXBlbmRlbmNpZXMuCi1UaGUgc2NyaXB0IGJpbmRzIHRoZSBzeW1ib2wgQHNhbXB7Zm9vMX0gdG8gQHNhbXB7VkVSU18xLjF9LiAgSXQgcmVkdWNlcwotYSBudW1iZXIgb2Ygc3ltYm9scyB0byBsb2NhbCBzY29wZSBzbyB0aGF0IHRoZXkgYXJlIG5vdCB2aXNpYmxlIG91dHNpZGUKLW9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLQotTmV4dCwgdGhlIHZlcnNpb24gc2NyaXB0IGRlZmluZXMgbm9kZSBAc2FtcHtWRVJTXzEuMn0uICBUaGlzIG5vZGUKLWRlcGVuZHMgdXBvbiBAc2FtcHtWRVJTXzEuMX0uICBUaGUgc2NyaXB0IGJpbmRzIHRoZSBzeW1ib2wgQHNhbXB7Zm9vMn0KLXRvIHRoZSB2ZXJzaW9uIG5vZGUgQHNhbXB7VkVSU18xLjJ9LgotCi1GaW5hbGx5LCB0aGUgdmVyc2lvbiBzY3JpcHQgZGVmaW5lcyBub2RlIEBzYW1we1ZFUlNfMi4wfS4gIFRoaXMgbm9kZQotZGVwZW5kcyB1cG9uIEBzYW1we1ZFUlNfMS4yfS4gIFRoZSBzY3JpcHRzIGJpbmRzIHRoZSBzeW1ib2xzIEBzYW1we2JhcjF9Ci1hbmQgQHNhbXB7YmFyMn0gYXJlIGJvdW5kIHRvIHRoZSB2ZXJzaW9uIG5vZGUgQHNhbXB7VkVSU18yLjB9LgotCi1XaGVuIHRoZSBsaW5rZXIgZmluZHMgYSBzeW1ib2wgZGVmaW5lZCBpbiBhIGxpYnJhcnkgd2hpY2ggaXMgbm90Ci1zcGVjaWZpY2FsbHkgYm91bmQgdG8gYSB2ZXJzaW9uIG5vZGUsIGl0IHdpbGwgZWZmZWN0aXZlbHkgYmluZCBpdCB0byBhbgotdW5zcGVjaWZpZWQgYmFzZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgWW91IGNhbiBiaW5kIGFsbCBvdGhlcndpc2UKLXVuc3BlY2lmaWVkIHN5bWJvbHMgdG8gYSBnaXZlbiB2ZXJzaW9uIG5vZGUgYnkgdXNpbmcgQHNhbXB7Z2xvYmFsOiAqfQotc29tZXdoZXJlIGluIHRoZSB2ZXJzaW9uIHNjcmlwdC4KLQotVGhlIG5hbWVzIG9mIHRoZSB2ZXJzaW9uIG5vZGVzIGhhdmUgbm8gc3BlY2lmaWMgbWVhbmluZyBvdGhlciB0aGFuIHdoYXQKLXRoZXkgbWlnaHQgc3VnZ2VzdCB0byB0aGUgcGVyc29uIHJlYWRpbmcgdGhlbS4gIFRoZSBAc2FtcHsyLjB9IHZlcnNpb24KLWNvdWxkIGp1c3QgYXMgd2VsbCBoYXZlIGFwcGVhcmVkIGluIGJldHdlZW4gQHNhbXB7MS4xfSBhbmQgQHNhbXB7MS4yfS4KLUhvd2V2ZXIsIHRoaXMgd291bGQgYmUgYSBjb25mdXNpbmcgd2F5IHRvIHdyaXRlIGEgdmVyc2lvbiBzY3JpcHQuCi0KLVdoZW4geW91IGxpbmsgYW4gYXBwbGljYXRpb24gYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IHRoYXQgaGFzIHZlcnNpb25lZAotc3ltYm9scywgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZiBrbm93cyB3aGljaCB2ZXJzaW9uIG9mIGVhY2ggc3ltYm9sIGl0Ci1yZXF1aXJlcywgYW5kIGl0IGFsc28ga25vd3Mgd2hpY2ggdmVyc2lvbiBub2RlcyBpdCBuZWVkcyBmcm9tIGVhY2gKLXNoYXJlZCBsaWJyYXJ5IGl0IGlzIGxpbmtlZCBhZ2FpbnN0LiAgVGh1cyBhdCBydW50aW1lLCB0aGUgZHluYW1pYwotbG9hZGVyIGNhbiBtYWtlIGEgcXVpY2sgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxpYnJhcmllcyB5b3UgaGF2ZQotbGlua2VkIGFnYWluc3QgZG8gaW4gZmFjdCBzdXBwbHkgYWxsIG9mIHRoZSB2ZXJzaW9uIG5vZGVzIHRoYXQgdGhlCi1hcHBsaWNhdGlvbiB3aWxsIG5lZWQgdG8gcmVzb2x2ZSBhbGwgb2YgdGhlIGR5bmFtaWMgc3ltYm9scy4gIEluIHRoaXMKLXdheSBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGR5bmFtaWMgbGlua2VyIHRvIGtub3cgd2l0aCBjZXJ0YWludHkgdGhhdAotYWxsIGV4dGVybmFsIHN5bWJvbHMgdGhhdCBpdCBuZWVkcyB3aWxsIGJlIHJlc29sdmFibGUgd2l0aG91dCBoYXZpbmcgdG8KLXNlYXJjaCBmb3IgZWFjaCBzeW1ib2wgcmVmZXJlbmNlLgotCi1UaGUgc3ltYm9sIHZlcnNpb25pbmcgaXMgaW4gZWZmZWN0IGEgbXVjaCBtb3JlIHNvcGhpc3RpY2F0ZWQgd2F5IG9mCi1kb2luZyBtaW5vciB2ZXJzaW9uIGNoZWNraW5nIHRoYXQgU3VuT1MgZG9lcy4gIFRoZSBmdW5kYW1lbnRhbCBwcm9ibGVtCi10aGF0IGlzIGJlaW5nIGFkZHJlc3NlZCBoZXJlIGlzIHRoYXQgdHlwaWNhbGx5IHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwKLWZ1bmN0aW9ucyBhcmUgYm91bmQgb24gYW4gYXMtbmVlZGVkIGJhc2lzLCBhbmQgYXJlIG5vdCBhbGwgYm91bmQgd2hlbgotdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyB1cC4gIElmIGEgc2hhcmVkIGxpYnJhcnkgaXMgb3V0IG9mIGRhdGUsIGEKLXJlcXVpcmVkIGludGVyZmFjZSBtYXkgYmUgbWlzc2luZzsgd2hlbiB0aGUgYXBwbGljYXRpb24gdHJpZXMgdG8gdXNlCi10aGF0IGludGVyZmFjZSwgaXQgbWF5IHN1ZGRlbmx5IGFuZCB1bmV4cGVjdGVkbHkgZmFpbC4gIFdpdGggc3ltYm9sCi12ZXJzaW9uaW5nLCB0aGUgdXNlciB3aWxsIGdldCBhIHdhcm5pbmcgd2hlbiB0aGV5IHN0YXJ0IHRoZWlyIHByb2dyYW0gaWYKLXRoZSBsaWJyYXJpZXMgYmVpbmcgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBhcmUgdG9vIG9sZC4KLQotVGhlcmUgYXJlIHNldmVyYWwgR05VIGV4dGVuc2lvbnMgdG8gU3VuJ3MgdmVyc2lvbmluZyBhcHByb2FjaC4gIFRoZQotZmlyc3Qgb2YgdGhlc2UgaXMgdGhlIGFiaWxpdHkgdG8gYmluZCBhIHN5bWJvbCB0byBhIHZlcnNpb24gbm9kZSBpbiB0aGUKLXNvdXJjZSBmaWxlIHdoZXJlIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbnN0ZWFkIG9mIGluIHRoZSB2ZXJzaW9uaW5nCi1zY3JpcHQuICBUaGlzIHdhcyBkb25lIG1haW5seSB0byByZWR1Y2UgdGhlIGJ1cmRlbiBvbiB0aGUgbGlicmFyeQotbWFpbnRhaW5lci4gIFlvdSBjYW4gZG8gdGhpcyBieSBwdXR0aW5nIHNvbWV0aGluZyBsaWtlOgotQHNtYWxsZXhhbXBsZQotX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQEBWRVJTXzEuMSIpOwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotaW4gdGhlIEMgc291cmNlIGZpbGUuICBUaGlzIHJlbmFtZXMgdGhlIGZ1bmN0aW9uIEBzYW1we29yaWdpbmFsX2Zvb30gdG8KLWJlIGFuIGFsaWFzIGZvciBAc2FtcHtmb299IGJvdW5kIHRvIHRoZSB2ZXJzaW9uIG5vZGUgQHNhbXB7VkVSU18xLjF9LgotVGhlIEBzYW1we2xvY2FsOn0gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgdGhlIHN5bWJvbAotQHNhbXB7b3JpZ2luYWxfZm9vfSBmcm9tIGJlaW5nIGV4cG9ydGVkLgotCi1UaGUgc2Vjb25kIEdOVSBleHRlbnNpb24gaXMgdG8gYWxsb3cgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLWZ1bmN0aW9uIHRvIGFwcGVhciBpbiBhIGdpdmVuIHNoYXJlZCBsaWJyYXJ5LiAgSW4gdGhpcyB3YXkgeW91IGNhbiBtYWtlCi1hbiBpbmNvbXBhdGlibGUgY2hhbmdlIHRvIGFuIGludGVyZmFjZSB3aXRob3V0IGluY3JlYXNpbmcgdGhlIG1ham9yCi12ZXJzaW9uIG51bWJlciBvZiB0aGUgc2hhcmVkIGxpYnJhcnksIHdoaWxlIHN0aWxsIGFsbG93aW5nIGFwcGxpY2F0aW9ucwotbGlua2VkIGFnYWluc3QgdGhlIG9sZCBpbnRlcmZhY2UgdG8gY29udGludWUgdG8gZnVuY3Rpb24uCi0KLVRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBtdWx0aXBsZSBAc2FtcHsuc3ltdmVyfSBkaXJlY3RpdmVzIGluIHRoZQotc291cmNlIGZpbGUuICBIZXJlIGlzIGFuIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0BAIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28sZm9vQEBWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBvbGRfZm9vMSxmb29AQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBAQFZFUlNfMi4wIik7Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JbiB0aGlzIGV4YW1wbGUsIEBzYW1we2Zvb0BAfSByZXByZXNlbnRzIHRoZSBzeW1ib2wgQHNhbXB7Zm9vfSBib3VuZCB0byB0aGUKLXVuc3BlY2lmaWVkIGJhc2UgdmVyc2lvbiBvZiB0aGUgc3ltYm9sLiAgVGhlIHNvdXJjZSBmaWxlIHRoYXQgY29udGFpbnMgdGhpcwotZXhhbXBsZSB3b3VsZCBkZWZpbmUgNCBDIGZ1bmN0aW9uczogQHNhbXB7b3JpZ2luYWxfZm9vfSwgQHNhbXB7b2xkX2Zvb30sCi1Ac2FtcHtvbGRfZm9vMX0sIGFuZCBAc2FtcHtuZXdfZm9vfS4KLQotV2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBhIGdpdmVuIHN5bWJvbCwgdGhlcmUgbmVlZHMgdG8gYmUKLXNvbWUgd2F5IHRvIHNwZWNpZnkgYSBkZWZhdWx0IHZlcnNpb24gdG8gd2hpY2ggZXh0ZXJuYWwgcmVmZXJlbmNlcyB0bwotdGhpcyBzeW1ib2wgd2lsbCBiZSBib3VuZC4gIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZQotQHNhbXB7Zm9vQEBAQFZFUlNfMi4wfSB0eXBlIG9mIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZS4gIFlvdSBjYW4gb25seQotZGVjbGFyZSBvbmUgdmVyc2lvbiBvZiBhIHN5bWJvbCBhcyB0aGUgZGVmYXVsdCBpbiB0aGlzIG1hbm5lcjsgb3RoZXJ3aXNlCi15b3Ugd291bGQgZWZmZWN0aXZlbHkgaGF2ZSBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBzeW1ib2wuCi0KLUlmIHlvdSB3aXNoIHRvIGJpbmQgYSByZWZlcmVuY2UgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wKLXdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnksIHlvdSBjYW4gdXNlIHRoZSBhbGlhc2VzIG9mIGNvbnZlbmllbmNlCi0oaS5lLiBAc2FtcHtvbGRfZm9vfSksIG9yIHlvdSBjYW4gdXNlIHRoZSBAc2FtcHsuc3ltdmVyfSBkaXJlY3RpdmUgdG8KLXNwZWNpZmljYWxseSBiaW5kIHRvIGFuIGV4dGVybmFsIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uLgotCi1Abm9kZSBFeHByZXNzaW9ucwotQHNlY3Rpb24gRXhwcmVzc2lvbnMgaW4gTGlua2VyIFNjcmlwdHMKLUBjaW5kZXggZXhwcmVzc2lvbnMKLUBjaW5kZXggYXJpdGhtZXRpYwotVGhlIHN5bnRheCBmb3IgZXhwcmVzc2lvbnMgaW4gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgaXMgaWRlbnRpY2FsIHRvCi10aGF0IG9mIEMgZXhwcmVzc2lvbnMuICBBbGwgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcyBpbnRlZ2Vycy4gIEFsbAotZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBpbiB0aGUgc2FtZSBzaXplLCB3aGljaCBpcyAzMiBiaXRzIGlmIGJvdGggdGhlCi1ob3N0IGFuZCB0YXJnZXQgYXJlIDMyIGJpdHMsIGFuZCBpcyBvdGhlcndpc2UgNjQgYml0cy4KLQotWW91IGNhbiB1c2UgYW5kIHNldCBzeW1ib2wgdmFsdWVzIGluIGV4cHJlc3Npb25zLgotCi1UaGUgbGlua2VyIGRlZmluZXMgc2V2ZXJhbCBzcGVjaWFsIHB1cnBvc2UgYnVpbHRpbiBmdW5jdGlvbnMgZm9yIHVzZSBpbgotZXhwcmVzc2lvbnMuCi0KLUBtZW51Ci0qIENvbnN0YW50czo6CQkJQ29uc3RhbnRzCi0qIFN5bWJvbHM6OgkJCVN5bWJvbCBOYW1lcwotKiBMb2NhdGlvbiBDb3VudGVyOjoJCVRoZSBMb2NhdGlvbiBDb3VudGVyCi0qIE9wZXJhdG9yczo6CQkJT3BlcmF0b3JzCi0qIEV2YWx1YXRpb246OgkJCUV2YWx1YXRpb24KLSogRXhwcmVzc2lvbiBTZWN0aW9uOjoJCVRoZSBTZWN0aW9uIG9mIGFuIEV4cHJlc3Npb24KLSogQnVpbHRpbiBGdW5jdGlvbnM6OgkJQnVpbHRpbiBGdW5jdGlvbnMKLUBlbmQgbWVudQotCi1Abm9kZSBDb25zdGFudHMKLUBzdWJzZWN0aW9uIENvbnN0YW50cwotQGNpbmRleCBpbnRlZ2VyIG5vdGF0aW9uCi1AY2luZGV4IGNvbnN0YW50cyBpbiBsaW5rZXIgc2NyaXB0cwotQWxsIGNvbnN0YW50cyBhcmUgaW50ZWdlcnMuCi0KLUFzIGluIEMsIHRoZSBsaW5rZXIgY29uc2lkZXJzIGFuIGludGVnZXIgYmVnaW5uaW5nIHdpdGggQHNhbXB7MH0gdG8gYmUKLW9jdGFsLCBhbmQgYW4gaW50ZWdlciBiZWdpbm5pbmcgd2l0aCBAc2FtcHsweH0gb3IgQHNhbXB7MFh9IHRvIGJlCi1oZXhhZGVjaW1hbC4gIFRoZSBsaW5rZXIgY29uc2lkZXJzIG90aGVyIGludGVnZXJzIHRvIGJlIGRlY2ltYWwuCi0KLUBjaW5kZXggc2NhbGVkIGludGVnZXJzCi1AY2luZGV4IEsgYW5kIE0gaW50ZWdlciBzdWZmaXhlcwotQGNpbmRleCBNIGFuZCBLIGludGVnZXIgc3VmZml4ZXMKLUBjaW5kZXggc3VmZml4ZXMgZm9yIGludGVnZXJzCi1AY2luZGV4IGludGVnZXIgc3VmZml4ZXMKLUluIGFkZGl0aW9uLCB5b3UgY2FuIHVzZSB0aGUgc3VmZml4ZXMgQGNvZGV7S30gYW5kIEBjb2Rle019IHRvIHNjYWxlIGEKLWNvbnN0YW50IGJ5Ci1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1AY29kZXsxMDI0fSBvciBAY29kZXsxMDI0KjEwMjR9Ci1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUB0ZXgKLSR7XHJtIDEwMjR9JCBvciAke1xybSAxMDI0fV4yJAotQGVuZCB0ZXgKLUBjIEVORCBURVhJMlJPRkYtS0lMTAotcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBhbGwgcmVmZXIgdG8gdGhlIHNhbWUgcXVhbnRpdHk6Ci1Ac21hbGxleGFtcGxlCi0gIF9mb3Vya18xID0gNEs7Ci0gIF9mb3Vya18yID0gNDA5NjsKLSAgX2ZvdXJrXzMgPSAweDEwMDA7Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgTmFtZXMKLUBjaW5kZXggc3ltYm9sIG5hbWVzCi1AY2luZGV4IG5hbWVzCi1AY2luZGV4IHF1b3RlZCBzeW1ib2wgbmFtZXMKLUBraW5kZXggIgotVW5sZXNzIHF1b3RlZCwgc3ltYm9sIG5hbWVzIHN0YXJ0IHdpdGggYSBsZXR0ZXIsIHVuZGVyc2NvcmUsIG9yIHBlcmlvZAotYW5kIG1heSBpbmNsdWRlIGxldHRlcnMsIGRpZ2l0cywgdW5kZXJzY29yZXMsIHBlcmlvZHMsIGFuZCBoeXBoZW5zLgotVW5xdW90ZWQgc3ltYm9sIG5hbWVzIG11c3Qgbm90IGNvbmZsaWN0IHdpdGggYW55IGtleXdvcmRzLiAgWW91IGNhbgotc3BlY2lmeSBhIHN5bWJvbCB3aGljaCBjb250YWlucyBvZGQgY2hhcmFjdGVycyBvciBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhCi1rZXl3b3JkIGJ5IHN1cnJvdW5kaW5nIHRoZSBzeW1ib2wgbmFtZSBpbiBkb3VibGUgcXVvdGVzOgotQHNtYWxsZXhhbXBsZQotICAiU0VDVElPTiIgPSA5OwotICAid2l0aCBhIHNwYWNlIiA9ICJhbHNvIHdpdGggYSBzcGFjZSIgKyAxMDsKLUBlbmQgc21hbGxleGFtcGxlCi0KLVNpbmNlIHN5bWJvbHMgY2FuIGNvbnRhaW4gbWFueSBub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzLCBpdCBpcyBzYWZlc3QKLXRvIGRlbGltaXQgc3ltYm9scyB3aXRoIHNwYWNlcy4gIEZvciBleGFtcGxlLCBAc2FtcHtBLUJ9IGlzIG9uZSBzeW1ib2wsCi13aGVyZWFzIEBzYW1we0EgLSBCfSBpcyBhbiBleHByZXNzaW9uIGludm9sdmluZyBzdWJ0cmFjdGlvbi4KLQotQG5vZGUgTG9jYXRpb24gQ291bnRlcgotQHN1YnNlY3Rpb24gVGhlIExvY2F0aW9uIENvdW50ZXIKLUBraW5kZXggLgotQGNpbmRleCBkb3QKLUBjaW5kZXggbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBjdXJyZW50IG91dHB1dCBsb2NhdGlvbgotVGhlIHNwZWNpYWwgbGlua2VyIHZhcmlhYmxlIEBkZm57ZG90fSBAc2FtcHsufSBhbHdheXMgY29udGFpbnMgdGhlCi1jdXJyZW50IG91dHB1dCBsb2NhdGlvbiBjb3VudGVyLiAgU2luY2UgdGhlIEBjb2Rley59IGFsd2F5cyByZWZlcnMgdG8gYQotbG9jYXRpb24gaW4gYW4gb3V0cHV0IHNlY3Rpb24sIGl0IG1heSBvbmx5IGFwcGVhciBpbiBhbiBleHByZXNzaW9uCi13aXRoaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZC4gIFRoZSBAY29kZXsufSBzeW1ib2wgbWF5IGFwcGVhcgotYW55d2hlcmUgdGhhdCBhbiBvcmRpbmFyeSBzeW1ib2wgaXMgYWxsb3dlZCBpbiBhbiBleHByZXNzaW9uLgotCi1AY2luZGV4IGhvbGVzCi1Bc3NpZ25pbmcgYSB2YWx1ZSB0byBAY29kZXsufSB3aWxsIGNhdXNlIHRoZSBsb2NhdGlvbiBjb3VudGVyIHRvIGJlCi1tb3ZlZC4gIFRoaXMgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGhvbGVzIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIFRoZQotbG9jYXRpb24gY291bnRlciBtYXkgbmV2ZXIgYmUgbW92ZWQgYmFja3dhcmRzLgotCi1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgb3V0cHV0IDoKLSAgICBAewotICAgICAgZmlsZTEoLnRleHQpCi0gICAgICAuID0gLiArIDEwMDA7Ci0gICAgICBmaWxlMigudGV4dCkKLSAgICAgIC4gKz0gMTAwMDsKLSAgICAgIGZpbGUzKC50ZXh0KQotICAgIEB9ID0gMHgxMjM0OwotQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLUluIHRoZSBwcmV2aW91cyBleGFtcGxlLCB0aGUgQHNhbXB7LnRleHR9IHNlY3Rpb24gZnJvbSBAZmlsZXtmaWxlMX0gaXMKLWxvY2F0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gQHNhbXB7b3V0cHV0fS4gIEl0IGlzCi1mb2xsb3dlZCBieSBhIDEwMDAgYnl0ZSBnYXAuICBUaGVuIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tCi1AZmlsZXtmaWxlMn0gYXBwZWFycywgYWxzbyB3aXRoIGEgMTAwMCBieXRlIGdhcCBmb2xsb3dpbmcgYmVmb3JlIHRoZQotQHNhbXB7LnRleHR9IHNlY3Rpb24gZnJvbSBAZmlsZXtmaWxlM30uICBUaGUgbm90YXRpb24gQHNhbXB7PSAweDEyMzR9Ci1zcGVjaWZpZXMgd2hhdCBkYXRhIHRvIHdyaXRlIGluIHRoZSBnYXBzIChAcHhyZWZ7T3V0cHV0IFNlY3Rpb24gRmlsbH0pLgotCi1AY2luZGV4IGRvdCBpbnNpZGUgc2VjdGlvbnMKLU5vdGU6IEBjb2Rley59IGFjdHVhbGx5IHJlZmVycyB0byB0aGUgYnl0ZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCi1jdXJyZW50IGNvbnRhaW5pbmcgb2JqZWN0LiAgTm9ybWFsbHkgdGhpcyBpcyB0aGUgQGNvZGV7U0VDVElPTlN9Ci1zdGF0ZW1lbnQsIHdob2VzIHN0YXJ0IGFkZHJlc3MgaXMgMCwgaGVuY2UgQGNvZGV7Ln0gY2FuIGJlIHVzZWQgYXMgYW4KLWFic29sdXRlIGFkZHJlc3MuICBJZiBAY29kZXsufSBpcyB1c2VkIGluc2lkZSBhIHNlY3Rpb24gZGVzY3JpcHRpb24KLWhvd2V2ZXIsIGl0IHJlZmVycyB0byB0aGUgYnl0ZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhhdCBzZWN0aW9uLAotbm90IGFuIGFic29sdXRlIGFkZHJlc3MuICBUaHVzIGluIGEgc2NyaXB0IGxpa2UgdGhpczoKLQotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gICAgLiA9IDB4MTAwCi0gICAgLnRleHQ6IEB7Ci0gICAgICAqKC50ZXh0KQotICAgICAgLiA9IDB4MjAwCi0gICAgQH0KLSAgICAuID0gMHg1MDAKLSAgICAuZGF0YTogQHsKLSAgICAgICooLmRhdGEpCi0gICAgICAuICs9IDB4NjAwCi0gICAgQH0KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQHNhbXB7LnRleHR9IHNlY3Rpb24gd2lsbCBiZSBhc3NpZ25lZCBhIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgMHgxMDAKLWFuZCBhIHNpemUgb2YgZXhhY3RseSAweDIwMCBieXRlcywgZXZlbiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEgaW4KLXRoZSBAc2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgdG8gZmlsbCB0aGlzIGFyZWEuICAoSWYgdGhlcmUgaXMgdG9vCi1tdWNoIGRhdGEsIGFuIGVycm9yIHdpbGwgYmUgcHJvZHVjZWQgYmVjYXVzZSB0aGlzIHdvdWxkIGJlIGFuIGF0dGVtcHQgdG8KLW1vdmUgQGNvZGV7Ln0gYmFja3dhcmRzKS4gIFRoZSBAc2FtcHsuZGF0YX0gc2VjdGlvbiB3aWxsIHN0YXJ0IGF0IDB4NTAwCi1hbmQgaXQgd2lsbCBoYXZlIGFuIGV4dHJhIDB4NjAwIGJ5dGVzIHdvcnRoIG9mIHNwYWNlIGFmdGVyIHRoZSBlbmQgb2YKLXRoZSB2YWx1ZXMgZnJvbSB0aGUgQHNhbXB7LmRhdGF9IGlucHV0IHNlY3Rpb25zIGFuZCBiZWZvcmUgdGhlIGVuZCBvZgotdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbiBpdHNlbGYuCi0KLUBuZWVkIDIwMDAKLUBub2RlIE9wZXJhdG9ycwotQHN1YnNlY3Rpb24gT3BlcmF0b3JzCi1AY2luZGV4IG9wZXJhdG9ycyBmb3IgYXJpdGhtZXRpYwotQGNpbmRleCBhcml0aG1ldGljIG9wZXJhdG9ycwotQGNpbmRleCBwcmVjZWRlbmNlIGluIGV4cHJlc3Npb25zCi1UaGUgbGlua2VyIHJlY29nbml6ZXMgdGhlIHN0YW5kYXJkIEMgc2V0IG9mIGFyaXRobWV0aWMgb3BlcmF0b3JzLCB3aXRoCi10aGUgc3RhbmRhcmQgYmluZGluZ3MgYW5kIHByZWNlZGVuY2UgbGV2ZWxzOgotQGMgVEVYSTJST0ZGLUtJTEwKLUBpZmluZm8KLUBjIEVORCBURVhJMlJPRkYtS0lMTAotQHNtYWxsZXhhbXBsZQotcHJlY2VkZW5jZSAgICAgIGFzc29jaWF0aXZpdHkgICBPcGVyYXRvcnMgICAgICAgICAgICAgICAgTm90ZXMKLShoaWdoZXN0KQotMSAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICAhICAtICB+ICAgICAgICAgICAgICAgICAgKDEpCi0yICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICogIC8gICUKLTMgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgKyAgLQotNCAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICA+PiAgPDwKLTUgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgPT0gICE9ICA+ICA8ICA8PSAgPj0KLTYgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgJgotNyAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICB8Ci04ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICYmCi05ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgIHx8Ci0xMCAgICAgICAgICAgICAgcmlnaHQgICAgICAgICAgID8gOgotMTEgICAgICAgICAgICAgIHJpZ2h0ICAgICAgICAgICAmPSAgKz0gIC09ICAqPSAgLz0gICAgICAgKDIpCi0obG93ZXN0KQotQGVuZCBzbWFsbGV4YW1wbGUKLU5vdGVzOgotKDEpIFByZWZpeCBvcGVyYXRvcnMgCi0oMikgQHhyZWZ7QXNzaWdubWVudHN9LgotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AdGV4Ci1cdnNraXAgXGJhc2VsaW5lc2tpcAotJSJsaXNwbmFycm93aW5nIiBpcyB0aGUgZXh0cmEgaW5kZW50IHVzZWQgZ2VuZXJhbGx5IGZvciBzbWFsbGV4YW1wbGUKLVxoc2tpcFxsaXNwbmFycm93aW5nXHZib3h7XG9mZmludGVybGluZXNraXAKLVxocnVsZQotXGhhbGlnbgote1x2cnVsZSMmXHN0cnV0XGhmaWxcICNcIFxoZmlsJlx2cnVsZSMmXHN0cnV0XGhmaWxcICNcIFxoZmlsJlx2cnVsZSMmXHN0cnV0XGhmaWxcIHtcdHQgI31cIFxoZmlsJlx2cnVsZSNcY3IKLWhlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgotJlByZWNlZGVuY2UmJiAgQXNzb2NpYXRpdml0eSAgJiZ7XHJtIE9wZXJhdG9yc30mXGNyCi1oZWlnaHQycHQmXG9taXQmJlxvbWl0JiZcb21pdCZcY3IKLVxub2FsaWdue1xocnVsZX0KLWhlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgotJmhpZ2hlc3QmJiYmJlxjcgotJSAnMTc2IGlzIHRpbGRlLCAnficgaW4gdHQgZm9udAotJjEmJmxlZnQmJlxxcXVhZC0gICAgICAgICAgXGNoYXInMTc2XCAgICAgICFccXF1YWRcZGFnJlxjciAKLSYyJiZsZWZ0JiYqICAgICAgICAgIC8gICAgICAgIFwlJlxjcgotJjMmJmxlZnQmJisgICAgICAgICAgLSZcY3IKLSY0JiZsZWZ0JiY+PiAgICAgICAgIDw8JlxjcgotJjUmJmxlZnQmJj09ICAgICAgICAgIT0gICAgICAgPiAgICAgIDwgICAgICA8PSAgICAgID49JlxjcgotJjYmJmxlZnQmJlwmJlxjcgotJjcmJmxlZnQmJnwmXGNyCi0mOCYmbGVmdCYme1wmXCZ9JlxjcgotJjkmJmxlZnQmJnx8JlxjcgotJjEwJiZyaWdodCYmPyAgICAgICAgOiZcY3IKLSYxMSYmcmlnaHQmJlxxcXVhZFwmPSAgICAgICs9ICAgICAgIC09ICAgICAqPSAgICAgLz1ccXF1YWRcZGRhZyZcY3IKLSZsb3dlc3QmJiYmJlxjcgotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyfQotXGhydWxlfQotQGVuZCB0ZXgKLUBpZnRleAotewotQG9iZXlsaW5lc0BwYXJza2lwPTBwdEBwYXJpbmRlbnQ9MHB0Ci1AZGFnQHF1YWQgUHJlZml4IG9wZXJhdG9ycy4KLUBkZGFnQHF1YWQgQHhyZWZ7QXNzaWdubWVudHN9LgotfQotQGVuZCBpZnRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi0KLUBub2RlIEV2YWx1YXRpb24KLUBzdWJzZWN0aW9uIEV2YWx1YXRpb24KLUBjaW5kZXggbGF6eSBldmFsdWF0aW9uCi1AY2luZGV4IGV4cHJlc3Npb24gZXZhbHVhdGlvbiBvcmRlcgotVGhlIGxpbmtlciBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgbGF6aWx5LiAgSXQgb25seSBjb21wdXRlcyB0aGUgdmFsdWUgb2YKLWFuIGV4cHJlc3Npb24gd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KLQotVGhlIGxpbmtlciBuZWVkcyBzb21lIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQKLWFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNlY3Rpb24sIGFuZCB0aGUgb3JpZ2lucyBhbmQgbGVuZ3RocyBvZiBtZW1vcnkKLXJlZ2lvbnMsIGluIG9yZGVyIHRvIGRvIGFueSBsaW5raW5nIGF0IGFsbC4gIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQKLWFzIHNvb24gYXMgcG9zc2libGUgd2hlbiB0aGUgbGlua2VyIHJlYWRzIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1Ib3dldmVyLCBvdGhlciB2YWx1ZXMgKHN1Y2ggYXMgc3ltYm9sIHZhbHVlcykgYXJlIG5vdCBrbm93biBvciBuZWVkZWQKLXVudGlsIGFmdGVyIHN0b3JhZ2UgYWxsb2NhdGlvbi4gIFN1Y2ggdmFsdWVzIGFyZSBldmFsdWF0ZWQgbGF0ZXIsIHdoZW4KLW90aGVyIGluZm9ybWF0aW9uIChzdWNoIGFzIHRoZSBzaXplcyBvZiBvdXRwdXQgc2VjdGlvbnMpIGlzIGF2YWlsYWJsZQotZm9yIHVzZSBpbiB0aGUgc3ltYm9sIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi4KLQotVGhlIHNpemVzIG9mIHNlY3Rpb25zIGNhbm5vdCBiZSBrbm93biB1bnRpbCBhZnRlciBhbGxvY2F0aW9uLCBzbwotYXNzaWdubWVudHMgZGVwZW5kZW50IHVwb24gdGhlc2UgYXJlIG5vdCBwZXJmb3JtZWQgdW50aWwgYWZ0ZXIKLWFsbG9jYXRpb24uCi0KLVNvbWUgZXhwcmVzc2lvbnMsIHN1Y2ggYXMgdGhvc2UgZGVwZW5kaW5nIHVwb24gdGhlIGxvY2F0aW9uIGNvdW50ZXIKLUBzYW1wey59LCBtdXN0IGJlIGV2YWx1YXRlZCBkdXJpbmcgc2VjdGlvbiBhbGxvY2F0aW9uLgotCi1JZiB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gaXMgcmVxdWlyZWQsIGJ1dCB0aGUgdmFsdWUgaXMgbm90Ci1hdmFpbGFibGUsIHRoZW4gYW4gZXJyb3IgcmVzdWx0cy4gIEZvciBleGFtcGxlLCBhIHNjcmlwdCBsaWtlIHRoZQotZm9sbG93aW5nCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TCi0gIEB7Ci0gICAgLnRleHQgOSt0aGlzX2lzbnRfY29uc3RhbnQgOiAKLSAgICAgIEB7ICooLnRleHQpIEB9Ci0gIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aWxsIGNhdXNlIHRoZSBlcnJvciBtZXNzYWdlIEBzYW1we25vbiBjb25zdGFudCBleHByZXNzaW9uIGZvciBpbml0aWFsCi1hZGRyZXNzfS4KLQotQG5vZGUgRXhwcmVzc2lvbiBTZWN0aW9uCi1Ac3Vic2VjdGlvbiBUaGUgU2VjdGlvbiBvZiBhbiBFeHByZXNzaW9uCi1AY2luZGV4IGV4cHJlc3Npb24gc2VjdGlvbnMKLUBjaW5kZXggYWJzb2x1dGUgZXhwcmVzc2lvbnMKLUBjaW5kZXggcmVsYXRpdmUgZXhwcmVzc2lvbnMKLUBjaW5kZXggYWJzb2x1dGUgYW5kIHJlbG9jYXRhYmxlIHN5bWJvbHMKLUBjaW5kZXggcmVsb2NhdGFibGUgYW5kIGFic29sdXRlIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgcmVsb2NhdGFibGUgYW5kIGFic29sdXRlCi1XaGVuIHRoZSBsaW5rZXIgZXZhbHVhdGVzIGFuIGV4cHJlc3Npb24sIHRoZSByZXN1bHQgaXMgZWl0aGVyIGFic29sdXRlCi1vciByZWxhdGl2ZSB0byBzb21lIHNlY3Rpb24uICBBIHJlbGF0aXZlIGV4cHJlc3Npb24gaXMgZXhwcmVzc2VkIGFzIGEKLWZpeGVkIG9mZnNldCBmcm9tIHRoZSBiYXNlIG9mIGEgc2VjdGlvbi4KLQotVGhlIHBvc2l0aW9uIG9mIHRoZSBleHByZXNzaW9uIHdpdGhpbiB0aGUgbGlua2VyIHNjcmlwdCBkZXRlcm1pbmVzCi13aGV0aGVyIGl0IGlzIGFic29sdXRlIG9yIHJlbGF0aXZlLiAgQW4gZXhwcmVzc2lvbiB3aGljaCBhcHBlYXJzIHdpdGhpbgotYW4gb3V0cHV0IHNlY3Rpb24gZGVmaW5pdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiB0aGUgb3V0cHV0Ci1zZWN0aW9uLiAgQW4gZXhwcmVzc2lvbiB3aGljaCBhcHBlYXJzIGVsc2V3aGVyZSB3aWxsIGJlIGFic29sdXRlLgotCi1BIHN5bWJvbCBzZXQgdG8gYSByZWxhdGl2ZSBleHByZXNzaW9uIHdpbGwgYmUgcmVsb2NhdGFibGUgaWYgeW91IHJlcXVlc3QKLXJlbG9jYXRhYmxlIG91dHB1dCB1c2luZyB0aGUgQHNhbXB7LXJ9IG9wdGlvbi4gIFRoYXQgbWVhbnMgdGhhdCBhCi1mdXJ0aGVyIGxpbmsgb3BlcmF0aW9uIG1heSBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBUaGUgc3ltYm9sJ3MKLXNlY3Rpb24gd2lsbCBiZSB0aGUgc2VjdGlvbiBvZiB0aGUgcmVsYXRpdmUgZXhwcmVzc2lvbi4KLQotQSBzeW1ib2wgc2V0IHRvIGFuIGFic29sdXRlIGV4cHJlc3Npb24gd2lsbCByZXRhaW4gdGhlIHNhbWUgdmFsdWUKLXRocm91Z2ggYW55IGZ1cnRoZXIgbGluayBvcGVyYXRpb24uICBUaGUgc3ltYm9sIHdpbGwgYmUgYWJzb2x1dGUsIGFuZAotd2lsbCBub3QgaGF2ZSBhbnkgcGFydGljdWxhciBhc3NvY2lhdGVkIHNlY3Rpb24uCi0KLVlvdSBjYW4gdXNlIHRoZSBidWlsdGluIGZ1bmN0aW9uIEBjb2Rle0FCU09MVVRFfSB0byBmb3JjZSBhbiBleHByZXNzaW9uCi10byBiZSBhYnNvbHV0ZSB3aGVuIGl0IHdvdWxkIG90aGVyd2lzZSBiZSByZWxhdGl2ZS4gIEZvciBleGFtcGxlLCB0bwotY3JlYXRlIGFuIGFic29sdXRlIHN5bWJvbCBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgb3V0cHV0Ci1zZWN0aW9uIEBzYW1wey5kYXRhfToKLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi0gIEB7Ci0gICAgLmRhdGEgOiBAeyAqKC5kYXRhKSBfZWRhdGEgPSBBQlNPTFVURSguKTsgQH0KLSAgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLUlmIEBzYW1we0FCU09MVVRFfSB3ZXJlIG5vdCB1c2VkLCBAc2FtcHtfZWRhdGF9IHdvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZQotQHNhbXB7LmRhdGF9IHNlY3Rpb24uCi0KLUBub2RlIEJ1aWx0aW4gRnVuY3Rpb25zCi1Ac3Vic2VjdGlvbiBCdWlsdGluIEZ1bmN0aW9ucwotQGNpbmRleCBmdW5jdGlvbnMgaW4gZXhwcmVzc2lvbnMKLVRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIGJ1aWx0aW4gZnVuY3Rpb25zIGZvcgotdXNlIGluIGxpbmtlciBzY3JpcHQgZXhwcmVzc2lvbnMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQUJTT0xVVEUoQHZhcntleHB9KQotQGtpbmRleCBBQlNPTFVURShAdmFye2V4cH0pCi1AY2luZGV4IGV4cHJlc3Npb24sIGFic29sdXRlCi1SZXR1cm4gdGhlIGFic29sdXRlIChub24tcmVsb2NhdGFibGUsIGFzIG9wcG9zZWQgdG8gbm9uLW5lZ2F0aXZlKSB2YWx1ZQotb2YgdGhlIGV4cHJlc3Npb24gQHZhcntleHB9LiAgUHJpbWFyaWx5IHVzZWZ1bCB0byBhc3NpZ24gYW4gYWJzb2x1dGUKLXZhbHVlIHRvIGEgc3ltYm9sIHdpdGhpbiBhIHNlY3Rpb24gZGVmaW5pdGlvbiwgd2hlcmUgc3ltYm9sIHZhbHVlcyBhcmUKLW5vcm1hbGx5IHNlY3Rpb24gcmVsYXRpdmUuICBAeHJlZntFeHByZXNzaW9uIFNlY3Rpb259LgotCi1AaXRlbSBBRERSKEB2YXJ7c2VjdGlvbn0pCi1Aa2luZGV4IEFERFIoQHZhcntzZWN0aW9ufSkKLUBjaW5kZXggc2VjdGlvbiBhZGRyZXNzIGluIGV4cHJlc3Npb24KLVJldHVybiB0aGUgYWJzb2x1dGUgYWRkcmVzcyAodGhlIFZNQSkgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBZb3VyCi1zY3JpcHQgbXVzdCBwcmV2aW91c2x5IGhhdmUgZGVmaW5lZCB0aGUgbG9jYXRpb24gb2YgdGhhdCBzZWN0aW9uLiAgSW4KLXRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgQGNvZGV7c3ltYm9sXzF9IGFuZCBAY29kZXtzeW1ib2xfMn0gYXJlIGFzc2lnbmVkCi1pZGVudGljYWwgdmFsdWVzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAeyBAZG90c3t9Ci0gIC5vdXRwdXQxIDoKLSAgICBAeyAKLSAgICBzdGFydF9vZl9vdXRwdXRfMSA9IEFCU09MVVRFKC4pOwotICAgIEBkb3Rze30KLSAgICBAfQotICAub3V0cHV0IDoKLSAgICBAewotICAgIHN5bWJvbF8xID0gQUREUigub3V0cHV0MSk7Ci0gICAgc3ltYm9sXzIgPSBzdGFydF9vZl9vdXRwdXRfMTsKLSAgICBAfQotQGRvdHN7fSBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gQUxJR04oQHZhcntleHB9KQotQGtpbmRleCBBTElHTihAdmFye2V4cH0pCi1AY2luZGV4IHJvdW5kIHVwIGxvY2F0aW9uIGNvdW50ZXIKLUBjaW5kZXggYWxpZ24gbG9jYXRpb24gY291bnRlcgotUmV0dXJuIHRoZSBsb2NhdGlvbiBjb3VudGVyIChAY29kZXsufSkgYWxpZ25lZCB0byB0aGUgbmV4dCBAdmFye2V4cH0KLWJvdW5kYXJ5LiAgQHZhcntleHB9IG11c3QgYmUgYW4gZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyBhIHBvd2VyIG9mCi10d28uICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLUBzbWFsbGV4YW1wbGUKLSguICsgQHZhcntleHB9IC0gMSkgJiB+KEB2YXJ7ZXhwfSAtIDEpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtBTElHTn0gZG9lc24ndCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLS0taXQganVzdAotZG9lcyBhcml0aG1ldGljIG9uIGl0LiAgSGVyZSBpcyBhbiBleGFtcGxlIHdoaWNoIGFsaWducyB0aGUgb3V0cHV0Ci1AY29kZXsuZGF0YX0gc2VjdGlvbiB0byB0aGUgbmV4dCBAY29kZXsweDIwMDB9IGJ5dGUgYm91bmRhcnkgYWZ0ZXIgdGhlCi1wcmVjZWRpbmcgc2VjdGlvbiBhbmQgc2V0cyBhIHZhcmlhYmxlIHdpdGhpbiB0aGUgc2VjdGlvbiB0byB0aGUgbmV4dAotQGNvZGV7MHg4MDAwfSBib3VuZGFyeSBhZnRlciB0aGUgaW5wdXQgc2VjdGlvbnM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7IEBkb3Rze30KLSAgLmRhdGEgQUxJR04oMHgyMDAwKTogQHsKLSAgICAqKC5kYXRhKQotICAgIHZhcmlhYmxlID0gQUxJR04oMHg4MDAwKTsKLSAgQH0KLUBkb3Rze30gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoZSBmaXJzdCB1c2Ugb2YgQGNvZGV7QUxJR059IGluIHRoaXMgZXhhbXBsZSBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mCi1hIHNlY3Rpb24gYmVjYXVzZSBpdCBpcyB1c2VkIGFzIHRoZSBvcHRpb25hbCBAdmFye2FkZHJlc3N9IGF0dHJpYnV0ZSBvZgotYSBzZWN0aW9uIGRlZmluaXRpb24gKEBweHJlZntPdXRwdXQgU2VjdGlvbiBBZGRyZXNzfSkuICBUaGUgc2Vjb25kIHVzZQotb2YgQGNvZGV7QUxJR059IGlzIHVzZWQgdG8gZGVmaW5lcyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuCi0KLVRoZSBidWlsdGluIGZ1bmN0aW9uIEBjb2Rle05FWFR9IGlzIGNsb3NlbHkgcmVsYXRlZCB0byBAY29kZXtBTElHTn0uCi0KLUBpdGVtIEJMT0NLKEB2YXJ7ZXhwfSkKLUBraW5kZXggQkxPQ0soQHZhcntleHB9KQotVGhpcyBpcyBhIHN5bm9ueW0gZm9yIEBjb2Rle0FMSUdOfSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBsaW5rZXIKLXNjcmlwdHMuICBJdCBpcyBtb3N0IG9mdGVuIHNlZW4gd2hlbiBzZXR0aW5nIHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dAotc2VjdGlvbi4KLQotQGl0ZW0gREVGSU5FRChAdmFye3N5bWJvbH0pCi1Aa2luZGV4IERFRklORUQoQHZhcntzeW1ib2x9KQotQGNpbmRleCBzeW1ib2wgZGVmYXVsdHMKLVJldHVybiAxIGlmIEB2YXJ7c3ltYm9sfSBpcyBpbiB0aGUgbGlua2VyIGdsb2JhbCBzeW1ib2wgdGFibGUgYW5kIGlzCi1kZWZpbmVkLCBvdGhlcndpc2UgcmV0dXJuIDAuICBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb3ZpZGUKLWRlZmF1bHQgdmFsdWVzIGZvciBzeW1ib2xzLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2NyaXB0IGZyYWdtZW50Ci1zaG93cyBob3cgdG8gc2V0IGEgZ2xvYmFsIHN5bWJvbCBAc2FtcHtiZWdpbn0gdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluCi10aGUgQHNhbXB7LnRleHR9IHNlY3Rpb24tLS1idXQgaWYgYSBzeW1ib2wgY2FsbGVkIEBzYW1we2JlZ2lufSBhbHJlYWR5Ci1leGlzdGVkLCBpdHMgdmFsdWUgaXMgcHJlc2VydmVkOgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7IEBkb3Rze30KLSAgLnRleHQgOiBAewotICAgIGJlZ2luID0gREVGSU5FRChiZWdpbikgPyBiZWdpbiA6IC4gOwotICAgIEBkb3Rze30KLSAgQH0KLSAgQGRvdHN7fQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIExPQURBRERSKEB2YXJ7c2VjdGlvbn0pCi1Aa2luZGV4IExPQURBRERSKEB2YXJ7c2VjdGlvbn0pCi1AY2luZGV4IHNlY3Rpb24gbG9hZCBhZGRyZXNzIGluIGV4cHJlc3Npb24KLVJldHVybiB0aGUgYWJzb2x1dGUgTE1BIG9mIHRoZSBuYW1lZCBAdmFye3NlY3Rpb259LiAgVGhpcyBpcyBub3JtYWxseQotdGhlIHNhbWUgYXMgQGNvZGV7QUREUn0sIGJ1dCBpdCBtYXkgYmUgZGlmZmVyZW50IGlmIHRoZSBAY29kZXtBVH0KLWF0dHJpYnV0ZSBpcyB1c2VkIGluIHRoZSBvdXRwdXQgc2VjdGlvbiBkZWZpbml0aW9uIChAcHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIExNQX0pLgotCi1Aa2luZGV4IE1BWAotQGl0ZW0gTUFYKEB2YXJ7ZXhwMX0sIEB2YXJ7ZXhwMn0pCi1SZXR1cm5zIHRoZSBtYXhpbXVtIG9mIEB2YXJ7ZXhwMX0gYW5kIEB2YXJ7ZXhwMn0uCi0KLUBraW5kZXggTUlOCi1AaXRlbSBNSU4oQHZhcntleHAxfSwgQHZhcntleHAyfSkKLVJldHVybnMgdGhlIG1pbmltdW0gb2YgQHZhcntleHAxfSBhbmQgQHZhcntleHAyfS4KLQotQGl0ZW0gTkVYVChAdmFye2V4cH0pCi1Aa2luZGV4IE5FWFQoQHZhcntleHB9KQotQGNpbmRleCB1bmFsbG9jYXRlZCBhZGRyZXNzLCBuZXh0Ci1SZXR1cm4gdGhlIG5leHQgdW5hbGxvY2F0ZWQgYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgQHZhcntleHB9LgotVGhpcyBmdW5jdGlvbiBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8gQGNvZGV7QUxJR04oQHZhcntleHB9KX07IHVubGVzcyB5b3UKLXVzZSB0aGUgQGNvZGV7TUVNT1JZfSBjb21tYW5kIHRvIGRlZmluZSBkaXNjb250aW51b3VzIG1lbW9yeSBmb3IgdGhlCi1vdXRwdXQgZmlsZSwgdGhlIHR3byBmdW5jdGlvbnMgYXJlIGVxdWl2YWxlbnQuCi0KLUBpdGVtIFNJWkVPRihAdmFye3NlY3Rpb259KQotQGtpbmRleCBTSVpFT0YoQHZhcntzZWN0aW9ufSkKLUBjaW5kZXggc2VjdGlvbiBzaXplCi1SZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0sIGlmIHRoYXQgc2VjdGlvbiBoYXMKLWJlZW4gYWxsb2NhdGVkLiAgSWYgdGhlIHNlY3Rpb24gaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCB3aGVuIHRoaXMgaXMKLWV2YWx1YXRlZCwgdGhlIGxpbmtlciB3aWxsIHJlcG9ydCBhbiBlcnJvci4gIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwKLUBjb2Rle3N5bWJvbF8xfSBhbmQgQGNvZGV7c3ltYm9sXzJ9IGFyZSBhc3NpZ25lZCBpZGVudGljYWwgdmFsdWVzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OU0B7IEBkb3Rze30KLSAgLm91dHB1dCBAewotICAgIC5zdGFydCA9IC4gOwotICAgIEBkb3Rze30KLSAgICAuZW5kID0gLiA7Ci0gICAgQH0KLSAgc3ltYm9sXzEgPSAuZW5kIC0gLnN0YXJ0IDsKLSAgc3ltYm9sXzIgPSBTSVpFT0YoLm91dHB1dCk7Ci1AZG90c3t9IEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBTSVpFT0ZfSEVBREVSUwotQGl0ZW14IHNpemVvZl9oZWFkZXJzCi1Aa2luZGV4IFNJWkVPRl9IRUFERVJTCi1AY2luZGV4IGhlYWRlciBzaXplCi1SZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG91dHB1dCBmaWxlJ3MgaGVhZGVycy4gIFRoaXMgaXMKLWluZm9ybWF0aW9uIHdoaWNoIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgZmlsZS4gIFlvdSBjYW4gdXNlCi10aGlzIG51bWJlciB3aGVuIHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNlY3Rpb24sIGlmIHlvdQotY2hvb3NlLCB0byBmYWNpbGl0YXRlIHBhZ2luZy4KLQotQGNpbmRleCBub3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycwotQGNpbmRleCBwcm9ncmFtIGhlYWRlcnMsIG5vdCBlbm91Z2ggcm9vbQotV2hlbiBwcm9kdWNpbmcgYW4gRUxGIG91dHB1dCBmaWxlLCBpZiB0aGUgbGlua2VyIHNjcmlwdCB1c2VzIHRoZQotQGNvZGV7U0laRU9GX0hFQURFUlN9IGJ1aWx0aW4gZnVuY3Rpb24sIHRoZSBsaW5rZXIgbXVzdCBjb21wdXRlIHRoZQotbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBiZWZvcmUgaXQgaGFzIGRldGVybWluZWQgYWxsIHRoZSBzZWN0aW9uCi1hZGRyZXNzZXMgYW5kIHNpemVzLiAgSWYgdGhlIGxpbmtlciBsYXRlciBkaXNjb3ZlcnMgdGhhdCBpdCBuZWVkcwotYWRkaXRpb25hbCBwcm9ncmFtIGhlYWRlcnMsIGl0IHdpbGwgcmVwb3J0IGFuIGVycm9yIEBzYW1we25vdCBlbm91Z2gKLXJvb20gZm9yIHByb2dyYW0gaGVhZGVyc30uICBUbyBhdm9pZCB0aGlzIGVycm9yLCB5b3UgbXVzdCBhdm9pZCB1c2luZwotdGhlIEBjb2Rle1NJWkVPRl9IRUFERVJTfSBmdW5jdGlvbiwgb3IgeW91IG11c3QgcmV3b3JrIHlvdXIgbGlua2VyCi1zY3JpcHQgdG8gYXZvaWQgZm9yY2luZyB0aGUgbGlua2VyIHRvIHVzZSBhZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycywgb3IKLXlvdSBtdXN0IGRlZmluZSB0aGUgcHJvZ3JhbSBoZWFkZXJzIHlvdXJzZWxmIHVzaW5nIHRoZSBAY29kZXtQSERSU30KLWNvbW1hbmQgKEBweHJlZntQSERSU30pLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cwotQHNlY3Rpb24gSW1wbGljaXQgTGlua2VyIFNjcmlwdHMKLUBjaW5kZXggaW1wbGljaXQgbGlua2VyIHNjcmlwdHMKLUlmIHlvdSBzcGVjaWZ5IGEgbGlua2VyIGlucHV0IGZpbGUgd2hpY2ggdGhlIGxpbmtlciBjYW4gbm90IHJlY29nbml6ZSBhcwotYW4gb2JqZWN0IGZpbGUgb3IgYW4gYXJjaGl2ZSBmaWxlLCBpdCB3aWxsIHRyeSB0byByZWFkIHRoZSBmaWxlIGFzIGEKLWxpbmtlciBzY3JpcHQuICBJZiB0aGUgZmlsZSBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIGxpbmtlciBzY3JpcHQsIHRoZQotbGlua2VyIHdpbGwgcmVwb3J0IGFuIGVycm9yLgotCi1BbiBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0IHdpbGwgbm90IHJlcGxhY2UgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4KLQotVHlwaWNhbGx5IGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd291bGQgY29udGFpbiBvbmx5IHN5bWJvbAotYXNzaWdubWVudHMsIG9yIHRoZSBAY29kZXtJTlBVVH0sIEBjb2Rle0dST1VQfSwgb3IgQGNvZGV7VkVSU0lPTn0KLWNvbW1hbmRzLgotCi1BbnkgaW5wdXQgZmlsZXMgcmVhZCBiZWNhdXNlIG9mIGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd2lsbCBiZSByZWFkCi1hdCB0aGUgcG9zaXRpb24gaW4gdGhlIGNvbW1hbmQgbGluZSB3aGVyZSB0aGUgaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3YXMKLXJlYWQuICBUaGlzIGNhbiBhZmZlY3QgYXJjaGl2ZSBzZWFyY2hpbmcuCi0KLUBpZnNldCBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVudAotQGNoYXB0ZXIgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBtYWNoaW5lIGRlcGVuZGVuY2llcwotQGNvZGV7bGR9IGhhcyBhZGRpdGlvbmFsIGZlYXR1cmVzIG9uIHNvbWUgcGxhdGZvcm1zOyB0aGUgZm9sbG93aW5nCi1zZWN0aW9ucyBkZXNjcmliZSB0aGVtLiAgTWFjaGluZXMgd2hlcmUgQGNvZGV7bGR9IGhhcyBubyBhZGRpdGlvbmFsCi1mdW5jdGlvbmFsaXR5IGFyZSBub3QgbGlzdGVkLgotCi1AbWVudQotKiBIOC8zMDA6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDAKLSogaTk2MDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQotKiBBUk06OgkJCQlAY29kZXtsZH0gYW5kIHRoZSBBUk0gZmFtaWx5Ci1AZW5kIG1lbnUKLUBlbmQgaWZzZXQKLQotQGMgRklYTUUhICBUaGlzIGNvdWxkIHVzZSBAcmFpc2VzZWN0aW9ucy9AbG93ZXJzZWN0aW9ucywgYnV0IHRoZXJlIHNlZW1zIHRvIGJlIGEgY29uZmxpY3QKLUBjICAgICAgICAgYmV0d2VlbiB0aG9zZSBhbmQgbm9kZS1kZWZhdWx0aW5nLgotQGlmc2V0IEg4MzAwCi1AaWZjbGVhciBHRU5FUklDCi1AcmFpc2VzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi0KLUBub2RlIEg4LzMwMAotQHNlY3Rpb24gQGNvZGV7bGR9IGFuZCB0aGUgSDgvMzAwCi0KLUBjaW5kZXggSDgvMzAwIHN1cHBvcnQKLUZvciB0aGUgSDgvMzAwLCBAY29kZXtsZH0gY2FuIHBlcmZvcm0gdGhlc2UgZ2xvYmFsIG9wdGltaXphdGlvbnMgd2hlbgoteW91IHNwZWNpZnkgdGhlIEBzYW1wey0tcmVsYXh9IGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLUB0YWJsZSBAZW1waAotQGNpbmRleCByZWxheGluZyBvbiBIOC8zMDAKLUBpdGVtIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMKLUBjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7anNyfSBhbmQgQGNvZGV7am1wfSBpbnN0cnVjdGlvbnMgd2hvc2UKLXRhcmdldHMgYXJlIHdpdGhpbiBlaWdodCBiaXRzLCBhbmQgdHVybnMgdGhlbSBpbnRvIGVpZ2h0LWJpdAotcHJvZ3JhbS1jb3VudGVyIHJlbGF0aXZlIEBjb2Rle2Jzcn0gYW5kIEBjb2Rle2JyYX0gaW5zdHJ1Y3Rpb25zLAotcmVzcGVjdGl2ZWx5LgotCi1AY2luZGV4IHN5bnRoZXNpemluZyBvbiBIOC8zMDAKLUBpdGVtIHN5bnRoZXNpemluZyBpbnN0cnVjdGlvbnMKLUBjIEZJWE1FOiBzcGVjaWZpY2FsbHkgbW92LmIsIG9yIGFueSBtb3YgaW5zdHJ1Y3Rpb25zIHJlYWxseT8KLUBjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7bW92LmJ9IGluc3RydWN0aW9ucyB3aGljaCB1c2UgdGhlCi1zaXh0ZWVuLWJpdCBhYnNvbHV0ZSBhZGRyZXNzIGZvcm0sIGJ1dCByZWZlciB0byB0aGUgdG9wCi1wYWdlIG9mIG1lbW9yeSwgYW5kIGNoYW5nZXMgdGhlbSB0byB1c2UgdGhlIGVpZ2h0LWJpdCBhZGRyZXNzIGZvcm0uCi0oVGhhdCBpczogdGhlIGxpbmtlciB0dXJucyBAc2FtcHttb3YuYiBAY29kZXtAQH1AdmFye2FhfToxNn0gaW50bwotQHNhbXB7bW92LmIgQGNvZGV7QEB9QHZhcnthYX06OH0gd2hlbmV2ZXIgdGhlIGFkZHJlc3MgQHZhcnthYX0gaXMgaW4gdGhlCi10b3AgcGFnZSBvZiBtZW1vcnkpLgotQGVuZCB0YWJsZQotCi1AaWZjbGVhciBHRU5FUklDCi1AbG93ZXJzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci0KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIaXRhY2hpCi1AYyBUaGlzIHN0dWZmIGlzIHBvaW50bGVzcyB0byBzYXkgdW5sZXNzIHlvdSdyZSBlc3BlY2lhbGx5IGNvbmNlcm5lZAotQGMgd2l0aCBIaXRhY2hpIGNoaXBzOyBkb24ndCBlbmFibGUgaXQgZm9yIGdlbmVyaWMgY2FzZSwgcGxlYXNlLgotQG5vZGUgSGl0YWNoaQotQGNoYXB0ZXIgQGNvZGV7bGR9IGFuZCBvdGhlciBIaXRhY2hpIGNoaXBzCi0KLUBjb2Rle2xkfSBhbHNvIHN1cHBvcnRzIHRoZSBIOC8zMDBILCB0aGUgSDgvNTAwLCBhbmQgdGhlIEhpdGFjaGkgU0guICBObwotc3BlY2lhbCBmZWF0dXJlcywgY29tbWFuZHMsIG9yIGNvbW1hbmQtbGluZSBvcHRpb25zIGFyZSByZXF1aXJlZCBmb3IKLXRoZXNlIGNoaXBzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBJOTYwCi1AaWZjbGVhciBHRU5FUklDCi1AcmFpc2VzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi0KLUBub2RlIGk5NjAKLUBzZWN0aW9uIEBjb2Rle2xkfSBhbmQgdGhlIEludGVsIDk2MCBmYW1pbHkKLQotQGNpbmRleCBpOTYwIHN1cHBvcnQKLQotWW91IGNhbiB1c2UgdGhlIEBzYW1wey1BQHZhcnthcmNoaXRlY3R1cmV9fSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvCi1zcGVjaWZ5IG9uZSBvZiB0aGUgdHdvLWxldHRlciBuYW1lcyBpZGVudGlmeWluZyBtZW1iZXJzIG9mIHRoZSA5NjAKLWZhbWlseTsgdGhlIG9wdGlvbiBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgb3V0cHV0IHRhcmdldCwgYW5kIHdhcm5zIG9mIGFueQotaW5jb21wYXRpYmxlIGluc3RydWN0aW9ucyBpbiB0aGUgaW5wdXQgZmlsZXMuICBJdCBhbHNvIG1vZGlmaWVzIHRoZQotbGlua2VyJ3Mgc2VhcmNoIHN0cmF0ZWd5IGZvciBhcmNoaXZlIGxpYnJhcmllcywgdG8gc3VwcG9ydCB0aGUgdXNlIG9mCi1saWJyYXJpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZSwgYnkgaW5jbHVkaW5nIGluIHRoZQotc2VhcmNoIGxvb3AgbmFtZXMgc3VmZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBhcmNoaXRlY3R1cmUuCi0KLUZvciBleGFtcGxlLCBpZiB5b3VyIEBjb2Rle2xkfSBjb21tYW5kIGxpbmUgaW5jbHVkZWQgQHd7QHNhbXB7LUFDQX19IGFzCi13ZWxsIGFzIEB3e0BzYW1wey1sdHJ5fX0sIHRoZSBsaW5rZXIgd291bGQgbG9vayAoaW4gaXRzIGJ1aWx0LWluIHNlYXJjaAotcGF0aHMsIGFuZCBpbiBhbnkgcGF0aHMgeW91IHNwZWNpZnkgd2l0aCBAc2FtcHstTH0pIGZvciBhIGxpYnJhcnkgd2l0aAotdGhlIG5hbWVzCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotdHJ5Ci1saWJ0cnkuYQotdHJ5Y2EKLWxpYnRyeWNhLmEKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhlIGZpcnN0IHR3byBwb3NzaWJpbGl0aWVzIHdvdWxkIGJlIGNvbnNpZGVyZWQgaW4gYW55IGV2ZW50OyB0aGUgbGFzdAotdHdvIGFyZSBkdWUgdG8gdGhlIHVzZSBvZiBAd3tAc2FtcHstQUNBfX0uCi0KLVlvdSBjYW4gbWVhbmluZ2Z1bGx5IHVzZSBAc2FtcHstQX0gbW9yZSB0aGFuIG9uY2Ugb24gYSBjb21tYW5kIGxpbmUsIHNpbmNlCi10aGUgOTYwIGFyY2hpdGVjdHVyZSBmYW1pbHkgYWxsb3dzIGNvbWJpbmF0aW9uIG9mIHRhcmdldCBhcmNoaXRlY3R1cmVzOyBlYWNoCi11c2Ugd2lsbCBhZGQgYW5vdGhlciBwYWlyIG9mIG5hbWUgdmFyaWFudHMgdG8gc2VhcmNoIGZvciB3aGVuIEB3e0BzYW1wey1sfX0KLXNwZWNpZmllcyBhIGxpYnJhcnkuCi0KLUBjaW5kZXggQGNvZGV7LS1yZWxheH0gb24gaTk2MAotQGNpbmRleCByZWxheGluZyBvbiBpOTYwCi1AY29kZXtsZH0gc3VwcG9ydHMgdGhlIEBzYW1wey0tcmVsYXh9IG9wdGlvbiBmb3IgdGhlIGk5NjAgZmFtaWx5LiAgSWYKLXlvdSBzcGVjaWZ5IEBzYW1wey0tcmVsYXh9LCBAY29kZXtsZH0gZmluZHMgYWxsIEBjb2Rle2JhbHh9IGFuZAotQGNvZGV7Y2FseH0gaW5zdHJ1Y3Rpb25zIHdob3NlIHRhcmdldHMgYXJlIHdpdGhpbiAyNCBiaXRzLCBhbmQgdHVybnMKLXRoZW0gaW50byAyNC1iaXQgcHJvZ3JhbS1jb3VudGVyIHJlbGF0aXZlIEBjb2Rle2JhbH0gYW5kIEBjb2Rle2NhbH0KLWluc3RydWN0aW9ucywgcmVzcGVjdGl2ZWx5LiAgQGNvZGV7bGR9IGFsc28gdHVybnMgQGNvZGV7Y2FsfQotaW5zdHJ1Y3Rpb25zIGludG8gQGNvZGV7YmFsfSBpbnN0cnVjdGlvbnMgd2hlbiBpdCBkZXRlcm1pbmVzIHRoYXQgdGhlCi10YXJnZXQgc3Vicm91dGluZSBpcyBhIGxlYWYgcm91dGluZSAodGhhdCBpcywgdGhlIHRhcmdldCBzdWJyb3V0aW5lIGRvZXMKLW5vdCBpdHNlbGYgY2FsbCBhbnkgc3Vicm91dGluZXMpLgotCi1AaWZjbGVhciBHRU5FUklDCi1AbG93ZXJzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci0KLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgQVJNCi1Ac2VjdGlvbiBAY29kZXtsZH0ncyBzdXBwb3J0IGZvciBpbnRlcndvcmtpbmcgYmV0d2VlbiBBUk0gYW5kIFRodW1iIGNvZGUKLQotQGNpbmRleCBBUk0gaW50ZXJ3b3JraW5nIHN1cHBvcnQKLUBraW5kZXggLS1zdXBwb3J0LW9sZC1jb2RlCi1Gb3IgdGhlIEFSTSwgQGNvZGV7bGR9IHdpbGwgZ2VuZXJhdGUgY29kZSBzdHVicyB0byBhbGxvdyBmdW5jdGlvbnMgY2FsbHMKLWJldHdlZW0gQVJNIGFuZCBUaHVtYiBjb2RlLiAgVGhlc2Ugc3R1YnMgb25seSB3b3JrIHdpdGggY29kZSB0aGF0IGhhcwotYmVlbiBjb21waWxlZCBhbmQgYXNzZW1ibGVkIHdpdGggdGhlIEBzYW1wey1tdGh1bWItaW50ZXJ3b3JrfSBjb21tYW5kCi1saW5lIG9wdGlvbi4gIElmIGl0IGlzIG5lY2Vzc2FyeSB0byBsaW5rIHdpdGggb2xkIEFSTSBvYmplY3QgZmlsZXMgb3IKLWxpYnJhcmllcywgd2hpY2ggaGF2ZSBub3QgYmVlbiBjb21waWxlZCB3aXRoIHRoZSAtbXRodW1iLWludGVyd29yawotb3B0aW9uIHRoZW4gdGhlIEBzYW1wey0tc3VwcG9ydC1vbGQtY29kZX0gY29tbWFuZCBsaW5lIHN3aXRjaCBzaG91bGQgYmUKLWdpdmVuIHRvIHRoZSBsaW5rZXIuICBUaGlzIHdpbGwgbWFrZSBpdCBnZW5lcmF0ZSBsYXJnZXIgc3R1YiBmdW5jdGlvbnMKLXdoaWNoIHdpbGwgd29yayB3aXRoIG5vbi1pbnRlcndvcmtpbmcgYXdhcmUgQVJNIGNvZGUuICBOb3RlLCBob3dldmVyLAotdGhlIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGdlbmVyYXRpbmcgc3R1YnMgZm9yIGZ1bmN0aW9uIGNhbGxzIHRvCi1ub24taW50ZXJ3b3JraW5nIGF3YXJlIFRodW1iIGNvZGUuCi0KLUBjaW5kZXggdGh1bWIgZW50cnkgcG9pbnQKLUBjaW5kZXggZW50cnkgcG9pbnQsIHRodW1iCi1Aa2luZGV4IC0tdGh1bWItZW50cnk9QHZhcntlbnRyeX0KLVRoZSBAc2FtcHstLXRodW1iLWVudHJ5fSBzd2l0Y2ggaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGdlbmVyaWMKLUBzYW1wey0tZW50cnl9IHN3aXRjaCwgaW4gdGhhdCBpdCBzZXRzIHRoZSBwcm9ncmFtJ3Mgc3RhcnRpbmcgYWRkcmVzcy4gIAotQnV0IGl0IGFsc28gc2V0cyB0aGUgYm90dG9tIGJpdCBvZiB0aGUgYWRkcmVzcywgc28gdGhhdCBpdCBjYW4gYmUKLWJyYW5jaGVkIHRvIHVzaW5nIGEgQlggaW5zdHJ1Y3Rpb24sIGFuZCB0aGUgcHJvZ3JhbSB3aWxsIHN0YXJ0Ci1leGVjdXRpbmcgaW4gVGh1bWIgbW9kZSBzdHJhaWdodCBhd2F5LgotCi1AaWZjbGVhciBHRU5FUklDCi1AbG93ZXJzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQG5vZGUgQkZECi1AY2hhcHRlciBCRkQKLQotQGNpbmRleCBiYWNrIGVuZAotQGNpbmRleCBvYmplY3QgZmlsZSBtYW5hZ2VtZW50Ci1AY2luZGV4IG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotQGtpbmRleCBvYmpkdW1wIC1pCi1UaGUgbGlua2VyIGFjY2Vzc2VzIG9iamVjdCBhbmQgYXJjaGl2ZSBmaWxlcyB1c2luZyB0aGUgQkZEIGxpYnJhcmllcy4KLVRoZXNlIGxpYnJhcmllcyBhbGxvdyB0aGUgbGlua2VyIHRvIHVzZSB0aGUgc2FtZSByb3V0aW5lcyB0byBvcGVyYXRlIG9uCi1vYmplY3QgZmlsZXMgd2hhdGV2ZXIgdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIEEgZGlmZmVyZW50IG9iamVjdCBmaWxlCi1mb3JtYXQgY2FuIGJlIHN1cHBvcnRlZCBzaW1wbHkgYnkgY3JlYXRpbmcgYSBuZXcgQkZEIGJhY2sgZW5kIGFuZCBhZGRpbmcKLWl0IHRvIHRoZSBsaWJyYXJ5LiAgVG8gY29uc2VydmUgcnVudGltZSBtZW1vcnksIGhvd2V2ZXIsIHRoZSBsaW5rZXIgYW5kCi1hc3NvY2lhdGVkIHRvb2xzIGFyZSB1c3VhbGx5IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBvbmx5IGEgc3Vic2V0IG9mIHRoZQotb2JqZWN0IGZpbGUgZm9ybWF0cyBhdmFpbGFibGUuICBZb3UgY2FuIHVzZSBAY29kZXtvYmpkdW1wIC1pfQotKEBweHJlZntvYmpkdW1wLCxvYmpkdW1wLGJpbnV0aWxzLmluZm8sVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzfSkgdG8KLWxpc3QgYWxsIHRoZSBmb3JtYXRzIGF2YWlsYWJsZSBmb3IgeW91ciBjb25maWd1cmF0aW9uLgotCi1AY2luZGV4IEJGRCByZXF1aXJlbWVudHMKLUBjaW5kZXggcmVxdWlyZW1lbnRzIGZvciBCRkQKLUFzIHdpdGggbW9zdCBpbXBsZW1lbnRhdGlvbnMsIEJGRCBpcyBhIGNvbXByb21pc2UgYmV0d2Vlbgotc2V2ZXJhbCBjb25mbGljdGluZyByZXF1aXJlbWVudHMuIFRoZSBtYWpvciBmYWN0b3IgaW5mbHVlbmNpbmcKLUJGRCBkZXNpZ24gd2FzIGVmZmljaWVuY3k6IGFueSB0aW1lIHVzZWQgY29udmVydGluZyBiZXR3ZWVuCi1mb3JtYXRzIGlzIHRpbWUgd2hpY2ggd291bGQgbm90IGhhdmUgYmVlbiBzcGVudCBoYWQgQkZEIG5vdAotYmVlbiBpbnZvbHZlZC4gVGhpcyBpcyBwYXJ0bHkgb2Zmc2V0IGJ5IGFic3RyYWN0aW9uIHBheWJhY2s7IHNpbmNlCi1CRkQgc2ltcGxpZmllcyBhcHBsaWNhdGlvbnMgYW5kIGJhY2sgZW5kcywgbW9yZSB0aW1lIGFuZCBjYXJlCi1tYXkgYmUgc3BlbnQgb3B0aW1pemluZyBhbGdvcml0aG1zIGZvciBhIGdyZWF0ZXIgc3BlZWQuCi0KLU9uZSBtaW5vciBhcnRpZmFjdCBvZiB0aGUgQkZEIHNvbHV0aW9uIHdoaWNoIHlvdSBzaG91bGQgYmVhciBpbgotbWluZCBpcyB0aGUgcG90ZW50aWFsIGZvciBpbmZvcm1hdGlvbiBsb3NzLiAgVGhlcmUgYXJlIHR3byBwbGFjZXMgd2hlcmUKLXVzZWZ1bCBpbmZvcm1hdGlvbiBjYW4gYmUgbG9zdCB1c2luZyB0aGUgQkZEIG1lY2hhbmlzbTogZHVyaW5nCi1jb252ZXJzaW9uIGFuZCBkdXJpbmcgb3V0cHV0LiBAeHJlZntCRkQgaW5mb3JtYXRpb24gbG9zc30uCi0KLUBtZW51Ci0qIEJGRCBvdXRsaW5lOjogICAgICAgICAgICAgICAgIEhvdyBpdCB3b3JrczogYW4gb3V0bGluZSBvZiBCRkQKLUBlbmQgbWVudQotCi1Abm9kZSBCRkQgb3V0bGluZQotQHNlY3Rpb24gSG93IGl0IHdvcmtzOiBhbiBvdXRsaW5lIG9mIEJGRAotQGNpbmRleCBvcGVuaW5nIG9iamVjdCBmaWxlcwotQGluY2x1ZGUgYmZkc3VtbS50ZXhpCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgUmVwb3J0aW5nIEJ1Z3MKLUBjaGFwdGVyIFJlcG9ydGluZyBCdWdzCi1AY2luZGV4IGJ1Z3MgaW4gQGNvZGV7bGR9Ci1AY2luZGV4IHJlcG9ydGluZyBidWdzIGluIEBjb2Rle2xkfQotCi1Zb3VyIGJ1ZyByZXBvcnRzIHBsYXkgYW4gZXNzZW50aWFsIHJvbGUgaW4gbWFraW5nIEBjb2Rle2xkfSByZWxpYWJsZS4KLQotUmVwb3J0aW5nIGEgYnVnIG1heSBoZWxwIHlvdSBieSBicmluZ2luZyBhIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbSwgb3IKLWl0IG1heSBub3QuICBCdXQgaW4gYW55IGNhc2UgdGhlIHByaW5jaXBhbCBmdW5jdGlvbiBvZiBhIGJ1ZyByZXBvcnQgaXMKLXRvIGhlbHAgdGhlIGVudGlyZSBjb21tdW5pdHkgYnkgbWFraW5nIHRoZSBuZXh0IHZlcnNpb24gb2YgQGNvZGV7bGR9Ci13b3JrIGJldHRlci4gIEJ1ZyByZXBvcnRzIGFyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byB0aGUgbWFpbnRlbmFuY2Ugb2YKLUBjb2Rle2xkfS4KLQotSW4gb3JkZXIgZm9yIGEgYnVnIHJlcG9ydCB0byBzZXJ2ZSBpdHMgcHVycG9zZSwgeW91IG11c3QgaW5jbHVkZSB0aGUKLWluZm9ybWF0aW9uIHRoYXQgZW5hYmxlcyB1cyB0byBmaXggdGhlIGJ1Zy4KLQotQG1lbnUKLSogQnVnIENyaXRlcmlhOjogICAgICAgICAgICAgICAgSGF2ZSB5b3UgZm91bmQgYSBidWc/Ci0qIEJ1ZyBSZXBvcnRpbmc6OiAgICAgICAgICAgICAgIEhvdyB0byByZXBvcnQgYnVncwotQGVuZCBtZW51Ci0KLUBub2RlIEJ1ZyBDcml0ZXJpYQotQHNlY3Rpb24gSGF2ZSB5b3UgZm91bmQgYSBidWc/Ci1AY2luZGV4IGJ1ZyBjcml0ZXJpYQotCi1JZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgeW91IGhhdmUgZm91bmQgYSBidWcsIGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGNpbmRleCBmYXRhbCBzaWduYWwKLUBjaW5kZXggbGlua2VyIGNyYXNoCi1AY2luZGV4IGNyYXNoIG9mIGxpbmtlcgotQGl0ZW0KLUlmIHRoZSBsaW5rZXIgZ2V0cyBhIGZhdGFsIHNpZ25hbCwgZm9yIGFueSBpbnB1dCB3aGF0ZXZlciwgdGhhdCBpcyBhCi1AY29kZXtsZH0gYnVnLiAgUmVsaWFibGUgbGlua2VycyBuZXZlciBjcmFzaC4KLQotQGNpbmRleCBlcnJvciBvbiB2YWxpZCBpbnB1dAotQGl0ZW0KLUlmIEBjb2Rle2xkfSBwcm9kdWNlcyBhbiBlcnJvciBtZXNzYWdlIGZvciB2YWxpZCBpbnB1dCwgdGhhdCBpcyBhIGJ1Zy4KLQotQGNpbmRleCBpbnZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7bGR9IGRvZXMgbm90IHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCBpbnB1dCwgdGhhdAotbWF5IGJlIGEgYnVnLiAgSW4gdGhlIGdlbmVyYWwgY2FzZSwgdGhlIGxpbmtlciBjYW4gbm90IHZlcmlmeSB0aGF0Ci1vYmplY3QgZmlsZXMgYXJlIGNvcnJlY3QuCi0KLUBpdGVtCi1JZiB5b3UgYXJlIGFuIGV4cGVyaWVuY2VkIHVzZXIgb2YgbGlua2VycywgeW91ciBzdWdnZXN0aW9ucyBmb3IKLWltcHJvdmVtZW50IG9mIEBjb2Rle2xkfSBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggQGNvZGV7bGR9IGJ1Z3MsIHJlcG9ydGluZwotCi1BIG51bWJlciBvZiBjb21wYW5pZXMgYW5kIGluZGl2aWR1YWxzIG9mZmVyIHN1cHBvcnQgZm9yIEBzY3tnbnV9Ci1wcm9kdWN0cy4gIElmIHlvdSBvYnRhaW5lZCBAY29kZXtsZH0gZnJvbSBhIHN1cHBvcnQgb3JnYW5pemF0aW9uLCB3ZQotcmVjb21tZW5kIHlvdSBjb250YWN0IHRoYXQgb3JnYW5pemF0aW9uIGZpcnN0LgotCi1Zb3UgY2FuIGZpbmQgY29udGFjdCBpbmZvcm1hdGlvbiBmb3IgbWFueSBzdXBwb3J0IGNvbXBhbmllcyBhbmQKLWluZGl2aWR1YWxzIGluIHRoZSBmaWxlIEBmaWxle2V0Yy9TRVJWSUNFfSBpbiB0aGUgQHNje2dudX0gRW1hY3MKLWRpc3RyaWJ1dGlvbi4KLQotT3RoZXJ3aXNlLCBzZW5kIGJ1ZyByZXBvcnRzIGZvciBAY29kZXtsZH0gdG8KLUBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgotCi1UaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6Ci1Ac3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCi1mYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCi0KLU9mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlCi1wcm9ibGVtIGFuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodAotYXNzdW1lIHRoYXQgdGhlIG5hbWUgb2YgYSBzeW1ib2wgeW91IHVzZSBpbiBhbiBleGFtcGxlIGRvZXMgbm90IG1hdHRlci4KLVdlbGwsIHByb2JhYmx5IGl0IGRvZXMgbm90LCBidXQgb25lIGNhbm5vdCBiZSBzdXJlLiAgUGVyaGFwcyB0aGUgYnVnIGlzCi1hIHN0cmF5IG1lbW9yeSByZWZlcmVuY2Ugd2hpY2ggaGFwcGVucyB0byBmZXRjaCBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZQotdGhhdCBuYW1lIGlzIHN0b3JlZCBpbiBtZW1vcnk7IHBlcmhhcHMsIGlmIHRoZSBuYW1lIHdlcmUgZGlmZmVyZW50LCB0aGUKLWNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbCB0aGUgbGlua2VyIGludG8gZG9pbmcgdGhlIHJpZ2h0Ci10aGluZyBkZXNwaXRlIHRoZSBidWcuICBQbGF5IGl0IHNhZmUgYW5kIGdpdmUgYSBzcGVjaWZpYywgY29tcGxldGUKLWV4YW1wbGUuICBUaGF0IGlzIHRoZSBlYXNpZXN0IHRoaW5nIGZvciB5b3UgdG8gZG8sIGFuZCB0aGUgbW9zdCBoZWxwZnVsLgotCi1LZWVwIGluIG1pbmQgdGhhdCB0aGUgcHVycG9zZSBvZiBhIGJ1ZyByZXBvcnQgaXMgdG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnIGlmCi1pdCBpcyBuZXcgdG8gdXMuICBUaGVyZWZvcmUsIGFsd2F5cyB3cml0ZSB5b3VyIGJ1ZyByZXBvcnRzIG9uIHRoZSBhc3N1bXB0aW9uCi10aGF0IHRoZSBidWcgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIHByZXZpb3VzbHkuCi0KLVNvbWV0aW1lcyBwZW9wbGUgZ2l2ZSBhIGZldyBza2V0Y2h5IGZhY3RzIGFuZCBhc2ssIGBgRG9lcyB0aGlzIHJpbmcgYQotYmVsbD8nJyAgVGhvc2UgYnVnIHJlcG9ydHMgYXJlIHVzZWxlc3MsIGFuZCB3ZSB1cmdlIGV2ZXJ5b25lIHRvCi1AZW1waHtyZWZ1c2UgdG8gcmVzcG9uZCB0byB0aGVtfSBleGNlcHQgdG8gY2hpZGUgdGhlIHNlbmRlciB0byByZXBvcnQKLWJ1Z3MgcHJvcGVybHkuCi0KLVRvIGVuYWJsZSB1cyB0byBmaXggdGhlIGJ1ZywgeW91IHNob3VsZCBpbmNsdWRlIGFsbCB0aGVzZSB0aGluZ3M6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgdmVyc2lvbiBvZiBAY29kZXtsZH0uICBAY29kZXtsZH0gYW5ub3VuY2VzIGl0IGlmIHlvdSBzdGFydCBpdCB3aXRoCi10aGUgQHNhbXB7LS12ZXJzaW9ufSBhcmd1bWVudC4KLQotV2l0aG91dCB0aGlzLCB3ZSB3aWxsIG5vdCBrbm93IHdoZXRoZXIgdGhlcmUgaXMgYW55IHBvaW50IGluIGxvb2tpbmcgZm9yCi10aGUgYnVnIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgQGNvZGV7bGR9LgotCi1AaXRlbQotQW55IHBhdGNoZXMgeW91IG1heSBoYXZlIGFwcGxpZWQgdG8gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIGluY2x1ZGluZyBhbnkKLXBhdGNoZXMgbWFkZSB0byB0aGUgQGNvZGV7QkZEfSBsaWJyYXJ5LgotCi1AaXRlbQotVGhlIHR5cGUgb2YgbWFjaGluZSB5b3UgYXJlIHVzaW5nLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmFtZSBhbmQKLXZlcnNpb24gbnVtYmVyLgotCi1AaXRlbQotV2hhdCBjb21waWxlciAoYW5kIGl0cyB2ZXJzaW9uKSB3YXMgdXNlZCB0byBjb21waWxlIEBjb2Rle2xkfS0tLWUuZy4KLWBgQGNvZGV7Z2NjLTIuN30nJy4KLQotQGl0ZW0KLVRoZSBjb21tYW5kIGFyZ3VtZW50cyB5b3UgZ2F2ZSB0aGUgbGlua2VyIHRvIGxpbmsgeW91ciBleGFtcGxlIGFuZAotb2JzZXJ2ZSB0aGUgYnVnLiAgVG8gZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsCi1saXN0IHRoZW0gYWxsLiAgQSBjb3B5IG9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzCi1zdWZmaWNpZW50LgotCi1JZiB3ZSB3ZXJlIHRvIHRyeSB0byBndWVzcyB0aGUgYXJndW1lbnRzLCB3ZSB3b3VsZCBwcm9iYWJseSBndWVzcyB3cm9uZwotYW5kIHRoZW4gd2UgbWlnaHQgbm90IGVuY291bnRlciB0aGUgYnVnLgotCi1AaXRlbQotQSBjb21wbGV0ZSBpbnB1dCBmaWxlLCBvciBzZXQgb2YgaW5wdXQgZmlsZXMsIHRoYXQgd2lsbCByZXByb2R1Y2UgdGhlCi1idWcuICBJdCBpcyBnZW5lcmFsbHkgbW9zdCBoZWxwZnVsIHRvIHNlbmQgdGhlIGFjdHVhbCBvYmplY3QgZmlsZXMsCi11dWVuY29kZWQgaWYgbmVjZXNzYXJ5IHRvIGdldCB0aGVtIHRocm91Z2ggdGhlIG1haWwgc3lzdGVtLiAgTWFraW5nIHRoZW0KLWF2YWlsYWJsZSBmb3IgYW5vbnltb3VzIEZUUCBpcyBub3QgYXMgZ29vZCwgYnV0IG1heSBiZSB0aGUgb25seQotcmVhc29uYWJsZSBjaG9pY2UgZm9yIGxhcmdlIG9iamVjdCBmaWxlcy4KLQotSWYgdGhlIHNvdXJjZSBmaWxlcyB3ZXJlIGFzc2VtYmxlZCB1c2luZyBAY29kZXtnYXN9IG9yIGNvbXBpbGVkIHVzaW5nCi1AY29kZXtnY2N9LCB0aGVuIGl0IG1heSBiZSBPSyB0byBzZW5kIHRoZSBzb3VyY2UgZmlsZXMgcmF0aGVyIHRoYW4gdGhlCi1vYmplY3QgZmlsZXMuICBJbiB0aGlzIGNhc2UsIGJlIHN1cmUgdG8gc2F5IGV4YWN0bHkgd2hhdCB2ZXJzaW9uIG9mCi1AY29kZXtnYXN9IG9yIEBjb2Rle2djY30gd2FzIHVzZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0IGZpbGVzLiAgQWxzbyBzYXkKLWhvdyBAY29kZXtnYXN9IG9yIEBjb2Rle2djY30gd2VyZSBjb25maWd1cmVkLgotCi1AaXRlbQotQSBkZXNjcmlwdGlvbiBvZiB3aGF0IGJlaGF2aW9yIHlvdSBvYnNlcnZlIHRoYXQgeW91IGJlbGlldmUgaXMKLWluY29ycmVjdC4gIEZvciBleGFtcGxlLCBgYEl0IGdldHMgYSBmYXRhbCBzaWduYWwuJycKLQotT2YgY291cnNlLCBpZiB0aGUgYnVnIGlzIHRoYXQgQGNvZGV7bGR9IGdldHMgYSBmYXRhbCBzaWduYWwsIHRoZW4gd2UKLXdpbGwgY2VydGFpbmx5IG5vdGljZSBpdC4gIEJ1dCBpZiB0aGUgYnVnIGlzIGluY29ycmVjdCBvdXRwdXQsIHdlIG1pZ2h0Ci1ub3Qgbm90aWNlIHVubGVzcyBpdCBpcyBnbGFyaW5nbHkgd3JvbmcuICBZb3UgbWlnaHQgYXMgd2VsbCBub3QgZ2l2ZSB1cwotYSBjaGFuY2UgdG8gbWFrZSBhIG1pc3Rha2UuCi0KLUV2ZW4gaWYgdGhlIHByb2JsZW0geW91IGV4cGVyaWVuY2UgaXMgYSBmYXRhbCBzaWduYWwsIHlvdSBzaG91bGQgc3RpbGwKLXNheSBzbyBleHBsaWNpdGx5LiAgU3VwcG9zZSBzb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbiwgc3VjaCBhcywgeW91cgotY29weSBvZiBAY29kZXtsZH0gaXMgb3V0IG9mIHN5bmNoLCBvciB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1ZyBpbiB0aGUKLUMgbGlicmFyeSBvbiB5b3VyIHN5c3RlbS4gIChUaGlzIGhhcyBoYXBwZW5lZCEpICBZb3VyIGNvcHkgbWlnaHQgY3Jhc2gKLWFuZCBvdXJzIHdvdWxkIG5vdC4gIElmIHlvdSB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdoZW4gb3VycwotZmFpbHMgdG8gY3Jhc2gsIHdlIHdvdWxkIGtub3cgdGhhdCB0aGUgYnVnIHdhcyBub3QgaGFwcGVuaW5nIGZvciB1cy4gIElmCi15b3UgaGFkIG5vdCB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGRyYXcKLWFueSBjb25jbHVzaW9uIGZyb20gb3VyIG9ic2VydmF0aW9ucy4KLQotQGl0ZW0KLUlmIHlvdSB3aXNoIHRvIHN1Z2dlc3QgY2hhbmdlcyB0byB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgc2VuZCB1cyBjb250ZXh0Ci1kaWZmcywgYXMgZ2VuZXJhdGVkIGJ5IEBjb2Rle2RpZmZ9IHdpdGggdGhlIEBzYW1wey11fSwgQHNhbXB7LWN9LCBvcgotQHNhbXB7LXB9IG9wdGlvbi4gIEFsd2F5cyBzZW5kIGRpZmZzIGZyb20gdGhlIG9sZCBmaWxlIHRvIHRoZSBuZXcgZmlsZS4KLUlmIHlvdSBldmVuIGRpc2N1c3Mgc29tZXRoaW5nIGluIHRoZSBAY29kZXtsZH0gc291cmNlLCByZWZlciB0byBpdCBieQotY29udGV4dCwgbm90IGJ5IGxpbmUgbnVtYmVyLgotCi1UaGUgbGluZSBudW1iZXJzIGluIG91ciBkZXZlbG9wbWVudCBzb3VyY2VzIHdpbGwgbm90IG1hdGNoIHRob3NlIGluIHlvdXIKLXNvdXJjZXMuICBZb3VyIGxpbmUgbnVtYmVycyB3b3VsZCBjb252ZXkgbm8gdXNlZnVsIGluZm9ybWF0aW9uIHRvIHVzLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgYXJlIG5vdCBuZWNlc3Nhcnk6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHRoZSBlbnZlbG9wZSBvZiB0aGUgYnVnLgotCi1PZnRlbiBwZW9wbGUgd2hvIGVuY291bnRlciBhIGJ1ZyBzcGVuZCBhIGxvdCBvZiB0aW1lIGludmVzdGlnYXRpbmcKLXdoaWNoIGNoYW5nZXMgdG8gdGhlIGlucHV0IGZpbGUgd2lsbCBtYWtlIHRoZSBidWcgZ28gYXdheSBhbmQgd2hpY2gKLWNoYW5nZXMgd2lsbCBub3QgYWZmZWN0IGl0LgotCi1UaGlzIGlzIG9mdGVuIHRpbWUgY29uc3VtaW5nIGFuZCBub3QgdmVyeSB1c2VmdWwsIGJlY2F1c2UgdGhlIHdheSB3ZQotd2lsbCBmaW5kIHRoZSBidWcgaXMgYnkgcnVubmluZyBhIHNpbmdsZSBleGFtcGxlIHVuZGVyIHRoZSBkZWJ1Z2dlcgotd2l0aCBicmVha3BvaW50cywgbm90IGJ5IHB1cmUgZGVkdWN0aW9uIGZyb20gYSBzZXJpZXMgb2YgZXhhbXBsZXMuCi1XZSByZWNvbW1lbmQgdGhhdCB5b3Ugc2F2ZSB5b3VyIHRpbWUgZm9yIHNvbWV0aGluZyBlbHNlLgotCi1PZiBjb3Vyc2UsIGlmIHlvdSBjYW4gZmluZCBhIHNpbXBsZXIgZXhhbXBsZSB0byByZXBvcnQgQGVtcGh7aW5zdGVhZH0KLW9mIHRoZSBvcmlnaW5hbCBvbmUsIHRoYXQgaXMgYSBjb252ZW5pZW5jZSBmb3IgdXMuICBFcnJvcnMgaW4gdGhlCi1vdXRwdXQgd2lsbCBiZSBlYXNpZXIgdG8gc3BvdCwgcnVubmluZyB1bmRlciB0aGUgZGVidWdnZXIgd2lsbCB0YWtlCi1sZXNzIHRpbWUsIGFuZCBzbyBvbi4KLQotSG93ZXZlciwgc2ltcGxpZmljYXRpb24gaXMgbm90IHZpdGFsOyBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcywKLXJlcG9ydCB0aGUgYnVnIGFueXdheSBhbmQgc2VuZCB1cyB0aGUgZW50aXJlIHRlc3QgY2FzZSB5b3UgdXNlZC4KLQotQGl0ZW0KLUEgcGF0Y2ggZm9yIHRoZSBidWcuCi0KLUEgcGF0Y2ggZm9yIHRoZSBidWcgZG9lcyBoZWxwIHVzIGlmIGl0IGlzIGEgZ29vZCBvbmUuICBCdXQgZG8gbm90IG9taXQKLXRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHRlc3QgY2FzZSwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAotYSBwYXRjaCBpcyBhbGwgd2UgbmVlZC4gIFdlIG1pZ2h0IHNlZSBwcm9ibGVtcyB3aXRoIHlvdXIgcGF0Y2ggYW5kIGRlY2lkZQotdG8gZml4IHRoZSBwcm9ibGVtIGFub3RoZXIgd2F5LCBvciB3ZSBtaWdodCBub3QgdW5kZXJzdGFuZCBpdCBhdCBhbGwuCi0KLVNvbWV0aW1lcyB3aXRoIGEgcHJvZ3JhbSBhcyBjb21wbGljYXRlZCBhcyBAY29kZXtsZH0gaXQgaXMgdmVyeSBoYXJkIHRvCi1jb25zdHJ1Y3QgYW4gZXhhbXBsZSB0aGF0IHdpbGwgbWFrZSB0aGUgcHJvZ3JhbSBmb2xsb3cgYSBjZXJ0YWluIHBhdGgKLXRocm91Z2ggdGhlIGNvZGUuICBJZiB5b3UgZG8gbm90IHNlbmQgdXMgdGhlIGV4YW1wbGUsIHdlIHdpbGwgbm90IGJlCi1hYmxlIHRvIGNvbnN0cnVjdCBvbmUsIHNvIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gdmVyaWZ5IHRoYXQgdGhlIGJ1ZyBpcwotZml4ZWQuCi0KLUFuZCBpZiB3ZSBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGJ1ZyB5b3UgYXJlIHRyeWluZyB0byBmaXgsIG9yIHdoeSB5b3VyCi1wYXRjaCBzaG91bGQgYmUgYW4gaW1wcm92ZW1lbnQsIHdlIHdpbGwgbm90IGluc3RhbGwgaXQuICBBIHRlc3QgY2FzZSB3aWxsCi1oZWxwIHVzIHRvIHVuZGVyc3RhbmQuCi0KLUBpdGVtCi1BIGd1ZXNzIGFib3V0IHdoYXQgdGhlIGJ1ZyBpcyBvciB3aGF0IGl0IGRlcGVuZHMgb24uCi0KLVN1Y2ggZ3Vlc3NlcyBhcmUgdXN1YWxseSB3cm9uZy4gIEV2ZW4gd2UgY2Fubm90IGd1ZXNzIHJpZ2h0IGFib3V0IHN1Y2gKLXRoaW5ncyB3aXRob3V0IGZpcnN0IHVzaW5nIHRoZSBkZWJ1Z2dlciB0byBmaW5kIHRoZSBmYWN0cy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBNUkkKLUBhcHBlbmRpeCBNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXMKLUBjaW5kZXggTVJJIGNvbXBhdGliaWxpdHkKLVRvIGFpZCB1c2VycyBtYWtpbmcgdGhlIHRyYW5zaXRpb24gdG8gQHNje2dudX0gQGNvZGV7bGR9IGZyb20gdGhlIE1SSQotbGlua2VyLCBAY29kZXtsZH0gY2FuIHVzZSBNUkkgY29tcGF0aWJsZSBsaW5rZXIgc2NyaXB0cyBhcyBhbgotYWx0ZXJuYXRpdmUgdG8gdGhlIG1vcmUgZ2VuZXJhbC1wdXJwb3NlIGxpbmtlciBzY3JpcHRpbmcgbGFuZ3VhZ2UKLWRlc2NyaWJlZCBpbiBAcmVme1NjcmlwdHN9LiAgTVJJIGNvbXBhdGlibGUgbGlua2VyIHNjcmlwdHMgaGF2ZSBhIG11Y2gKLXNpbXBsZXIgY29tbWFuZCBzZXQgdGhhbiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIG90aGVyd2lzZSB1c2VkIHdpdGgKLUBjb2Rle2xkfS4gIEBzY3tnbnV9IEBjb2Rle2xkfSBzdXBwb3J0cyB0aGUgbW9zdCBjb21tb25seSB1c2VkIE1SSQotbGlua2VyIGNvbW1hbmRzOyB0aGVzZSBjb21tYW5kcyBhcmUgZGVzY3JpYmVkIGhlcmUuCi0KLUluIGdlbmVyYWwsIE1SSSBzY3JpcHRzIGFyZW4ndCBvZiBtdWNoIHVzZSB3aXRoIHRoZSBAY29kZXthLm91dH0gb2JqZWN0Ci1maWxlIGZvcm1hdCwgc2luY2UgaXQgb25seSBoYXMgdGhyZWUgc2VjdGlvbnMgYW5kIE1SSSBzY3JpcHRzIGxhY2sgc29tZQotZmVhdHVyZXMgdG8gbWFrZSB1c2Ugb2YgdGhlbS4KLQotWW91IGNhbiBzcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGFuIE1SSS1jb21wYXRpYmxlIHNjcmlwdCB1c2luZyB0aGUKLUBzYW1wey1jfSBjb21tYW5kLWxpbmUgb3B0aW9uLgotCi1FYWNoIGNvbW1hbmQgaW4gYW4gTVJJLWNvbXBhdGlibGUgc2NyaXB0IG9jY3VwaWVzIGl0cyBvd24gbGluZTsgZWFjaAotY29tbWFuZCBsaW5lIHN0YXJ0cyB3aXRoIHRoZSBrZXl3b3JkIHRoYXQgaWRlbnRpZmllcyB0aGUgY29tbWFuZCAodGhvdWdoCi1ibGFuayBsaW5lcyBhcmUgYWxzbyBhbGxvd2VkIGZvciBwdW5jdHVhdGlvbikuICBJZiBhIGxpbmUgb2YgYW4KLU1SSS1jb21wYXRpYmxlIHNjcmlwdCBiZWdpbnMgd2l0aCBhbiB1bnJlY29nbml6ZWQga2V5d29yZCwgQGNvZGV7bGR9Ci1pc3N1ZXMgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBjb250aW51ZXMgcHJvY2Vzc2luZyB0aGUgc2NyaXB0LgotCi1MaW5lcyBiZWdpbm5pbmcgd2l0aCBAc2FtcHsqfSBhcmUgY29tbWVudHMuCi0KLVlvdSBjYW4gd3JpdGUgdGhlc2UgY29tbWFuZHMgdXNpbmcgYWxsIHVwcGVyLWNhc2UgbGV0dGVycywgb3IgYWxsCi1sb3dlciBjYXNlOyBmb3IgZXhhbXBsZSwgQHNhbXB7Y2hpcH0gaXMgdGhlIHNhbWUgYXMgQHNhbXB7Q0hJUH0uCi1UaGUgZm9sbG93aW5nIGxpc3Qgc2hvd3Mgb25seSB0aGUgdXBwZXItY2FzZSBmb3JtIG9mIGVhY2ggY29tbWFuZC4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle0FCU09MVVRFfSAoTVJJKQotQGl0ZW0gQUJTT0xVVEUgQHZhcntzZWNuYW1lfQotQGl0ZW14IEFCU09MVVRFIEB2YXJ7c2VjbmFtZX0sIEB2YXJ7c2VjbmFtZX0sIEBkb3Rze30gQHZhcntzZWNuYW1lfQotTm9ybWFsbHksIEBjb2Rle2xkfSBpbmNsdWRlcyBpbiB0aGUgb3V0cHV0IGZpbGUgYWxsIHNlY3Rpb25zIGZyb20gYWxsCi10aGUgaW5wdXQgZmlsZXMuICBIb3dldmVyLCBpbiBhbiBNUkktY29tcGF0aWJsZSBzY3JpcHQsIHlvdSBjYW4gdXNlIHRoZQotQGNvZGV7QUJTT0xVVEV9IGNvbW1hbmQgdG8gcmVzdHJpY3QgdGhlIHNlY3Rpb25zIHRoYXQgd2lsbCBiZSBwcmVzZW50IGluCi15b3VyIG91dHB1dCBwcm9ncmFtLiAgSWYgdGhlIEBjb2Rle0FCU09MVVRFfSBjb21tYW5kIGlzIHVzZWQgYXQgYWxsIGluIGEKLXNjcmlwdCwgdGhlbiBvbmx5IHRoZSBzZWN0aW9ucyBuYW1lZCBleHBsaWNpdGx5IGluIEBjb2Rle0FCU09MVVRFfQotY29tbWFuZHMgd2lsbCBhcHBlYXIgaW4gdGhlIGxpbmtlciBvdXRwdXQuICBZb3UgY2FuIHN0aWxsIHVzZSBvdGhlcgotaW5wdXQgc2VjdGlvbnMgKHdoYXRldmVyIHlvdSBzZWxlY3Qgb24gdGhlIGNvbW1hbmQgbGluZSwgb3IgdXNpbmcKLUBjb2Rle0xPQUR9KSB0byByZXNvbHZlIGFkZHJlc3NlcyBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBjaW5kZXggQGNvZGV7QUxJQVN9IChNUkkpCi1AaXRlbSBBTElBUyBAdmFye291dC1zZWNuYW1lfSwgQHZhcntpbi1zZWNuYW1lfQotVXNlIHRoaXMgY29tbWFuZCB0byBwbGFjZSB0aGUgZGF0YSBmcm9tIGlucHV0IHNlY3Rpb24gQHZhcntpbi1zZWNuYW1lfQotaW4gYSBzZWN0aW9uIGNhbGxlZCBAdmFye291dC1zZWNuYW1lfSBpbiB0aGUgbGlua2VyIG91dHB1dCBmaWxlLgotCi1AdmFye2luLXNlY25hbWV9IG1heSBiZSBhbiBpbnRlZ2VyLgotCi1AY2luZGV4IEBjb2Rle0FMSUdOfSAoTVJJKQotQGl0ZW0gQUxJR04gQHZhcntzZWNuYW1lfSA9IEB2YXJ7ZXhwcmVzc2lvbn0KLUFsaWduIHRoZSBzZWN0aW9uIGNhbGxlZCBAdmFye3NlY25hbWV9IHRvIEB2YXJ7ZXhwcmVzc2lvbn0uICBUaGUKLUB2YXJ7ZXhwcmVzc2lvbn0gc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvLgotCi1AY2luZGV4IEBjb2Rle0JBU0V9IChNUkkpCi1AaXRlbSBCQVNFIEB2YXJ7ZXhwcmVzc2lvbn0KLVVzZSB0aGUgdmFsdWUgb2YgQHZhcntleHByZXNzaW9ufSBhcyB0aGUgbG93ZXN0IGFkZHJlc3MgKG90aGVyIHRoYW4KLWFic29sdXRlIGFkZHJlc3NlcykgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1AY2luZGV4IEBjb2Rle0NISVB9IChNUkkpCi1AaXRlbSBDSElQIEB2YXJ7ZXhwcmVzc2lvbn0KLUBpdGVteCBDSElQIEB2YXJ7ZXhwcmVzc2lvbn0sIEB2YXJ7ZXhwcmVzc2lvbn0KLVRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmc7IGl0IGlzIGFjY2VwdGVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkuCi0KLUBjaW5kZXggQGNvZGV7RU5EfSAoTVJJKQotQGl0ZW0gRU5ECi1UaGlzIGNvbW1hbmQgZG9lcyBub3RoaW5nIHdoYXRldmVyOyBpdCdzIG9ubHkgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkuCi0KLUBjaW5kZXggQGNvZGV7Rk9STUFUfSAoTVJJKQotQGl0ZW0gRk9STUFUIEB2YXJ7b3V0cHV0LWZvcm1hdH0KLVNpbWlsYXIgdG8gdGhlIEBjb2Rle09VVFBVVF9GT1JNQVR9IGNvbW1hbmQgaW4gdGhlIG1vcmUgZ2VuZXJhbCBsaW5rZXIKLWxhbmd1YWdlLCBidXQgcmVzdHJpY3RlZCB0byBvbmUgb2YgdGhlc2Ugb3V0cHV0IGZvcm1hdHM6IAotCi1AZW51bWVyYXRlCi1AaXRlbSAKLVMtcmVjb3JkcywgaWYgQHZhcntvdXRwdXQtZm9ybWF0fSBpcyBAc2FtcHtTfQotCi1AaXRlbQotSUVFRSwgaWYgQHZhcntvdXRwdXQtZm9ybWF0fSBpcyBAc2FtcHtJRUVFfQotCi1AaXRlbQotQ09GRiAodGhlIEBzYW1we2NvZmYtbTY4a30gdmFyaWFudCBpbiBCRkQpLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzCi1Ac2FtcHtDT0ZGfQotQGVuZCBlbnVtZXJhdGUKLQotQGNpbmRleCBAY29kZXtMSVNUfSAoTVJJKQotQGl0ZW0gTElTVCBAdmFye2FueXRoaW5nfUBkb3Rze30KLVByaW50ICh0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGZpbGUpIGEgbGluayBtYXAsIGFzIHByb2R1Y2VkIGJ5IHRoZQotQGNvZGV7bGR9IGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19LgotCi1UaGUga2V5d29yZCBAY29kZXtMSVNUfSBtYXkgYmUgZm9sbG93ZWQgYnkgYW55dGhpbmcgb24gdGhlCi1zYW1lIGxpbmUsIHdpdGggbm8gY2hhbmdlIGluIGl0cyBlZmZlY3QuCi0KLUBjaW5kZXggQGNvZGV7TE9BRH0gKE1SSSkKLUBpdGVtIExPQUQgQHZhcntmaWxlbmFtZX0KLUBpdGVteCBMT0FEIEB2YXJ7ZmlsZW5hbWV9LCBAdmFye2ZpbGVuYW1lfSwgQGRvdHN7fSBAdmFye2ZpbGVuYW1lfQotSW5jbHVkZSBvbmUgb3IgbW9yZSBvYmplY3QgZmlsZSBAdmFye2ZpbGVuYW1lfSBpbiB0aGUgbGluazsgdGhpcyBoYXMgdGhlCi1zYW1lIGVmZmVjdCBhcyBzcGVjaWZ5aW5nIEB2YXJ7ZmlsZW5hbWV9IGRpcmVjdGx5IG9uIHRoZSBAY29kZXtsZH0KLWNvbW1hbmQgbGluZS4KLQotQGNpbmRleCBAY29kZXtOQU1FfSAoTVJJKQotQGl0ZW0gTkFNRSBAdmFye291dHB1dC1uYW1lfQotQHZhcntvdXRwdXQtbmFtZX0gaXMgdGhlIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHByb2R1Y2VkIGJ5IEBjb2Rle2xkfTsgdGhlCi1NUkktY29tcGF0aWJsZSBjb21tYW5kIEBjb2Rle05BTUV9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvbW1hbmQtbGluZQotb3B0aW9uIEBzYW1wey1vfSBvciB0aGUgZ2VuZXJhbCBzY3JpcHQgbGFuZ3VhZ2UgY29tbWFuZCBAY29kZXtPVVRQVVR9LgotCi1AY2luZGV4IEBjb2Rle09SREVSfSAoTVJJKQotQGl0ZW0gT1JERVIgQHZhcntzZWNuYW1lfSwgQHZhcntzZWNuYW1lfSwgQGRvdHN7fSBAdmFye3NlY25hbWV9Ci1AaXRlbXggT1JERVIgQHZhcntzZWNuYW1lfSBAdmFye3NlY25hbWV9IEB2YXJ7c2VjbmFtZX0KLU5vcm1hbGx5LCBAY29kZXtsZH0gb3JkZXJzIHRoZSBzZWN0aW9ucyBpbiBpdHMgb3V0cHV0IGZpbGUgaW4gdGhlCi1vcmRlciBpbiB3aGljaCB0aGV5IGZpcnN0IGFwcGVhciBpbiB0aGUgaW5wdXQgZmlsZXMuICBJbiBhbiBNUkktY29tcGF0aWJsZQotc2NyaXB0LCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgb3JkZXJpbmcgd2l0aCB0aGUgQGNvZGV7T1JERVJ9IGNvbW1hbmQuICBUaGUKLXNlY3Rpb25zIHlvdSBsaXN0IHdpdGggQGNvZGV7T1JERVJ9IHdpbGwgYXBwZWFyIGZpcnN0IGluIHlvdXIgb3V0cHV0Ci1maWxlLCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLgotCi1AY2luZGV4IEBjb2Rle1BVQkxJQ30gKE1SSSkKLUBpdGVtIFBVQkxJQyBAdmFye25hbWV9PUB2YXJ7ZXhwcmVzc2lvbn0KLUBpdGVteCBQVUJMSUMgQHZhcntuYW1lfSxAdmFye2V4cHJlc3Npb259Ci1AaXRlbXggUFVCTElDIEB2YXJ7bmFtZX0gQHZhcntleHByZXNzaW9ufQotU3VwcGx5IGEgdmFsdWUgKEB2YXJ7ZXhwcmVzc2lvbn0pIGZvciBleHRlcm5hbCBzeW1ib2wKLUB2YXJ7bmFtZX0gdXNlZCBpbiB0aGUgbGlua2VyIGlucHV0IGZpbGVzLgotCi1AY2luZGV4IEBjb2Rle1NFQ1R9IChNUkkpCi1AaXRlbSBTRUNUIEB2YXJ7c2VjbmFtZX0sIEB2YXJ7ZXhwcmVzc2lvbn0KLUBpdGVteCBTRUNUIEB2YXJ7c2VjbmFtZX09QHZhcntleHByZXNzaW9ufQotQGl0ZW14IFNFQ1QgQHZhcntzZWNuYW1lfSBAdmFye2V4cHJlc3Npb259Ci1Zb3UgY2FuIHVzZSBhbnkgb2YgdGhlc2UgdGhyZWUgZm9ybXMgb2YgdGhlIEBjb2Rle1NFQ1R9IGNvbW1hbmQgdG8KLXNwZWNpZnkgdGhlIHN0YXJ0IGFkZHJlc3MgKEB2YXJ7ZXhwcmVzc2lvbn0pIGZvciBzZWN0aW9uIEB2YXJ7c2VjbmFtZX0uCi1JZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIEBjb2Rle1NFQ1R9IHN0YXRlbWVudCBmb3IgdGhlIHNhbWUKLUB2YXJ7c2VjbmFtZX0sIG9ubHkgdGhlIEBlbXBoe2ZpcnN0fSBzZXRzIHRoZSBzdGFydCBhZGRyZXNzLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWQgSW5kZXgKLQotQHByaW50aW5kZXggY3AKLQotQHRleAotJSBJIHRoaW5rIHNvbWV0aGluZyBsaWtlIEBjb2xvcGhvbiBzaG91bGQgYmUgaW4gdGV4aW5mby4gIEluIHRoZQotJSBtZWFudGltZToKLVxsb25nXGRlZlxjb2xvcGhvbntcaGJveCB0bzBwdHt9XHZmaWxsCi1cY2VudGVybGluZXtUaGUgYm9keSBvZiB0aGlzIG1hbnVhbCBpcyBzZXQgaW59Ci1cY2VudGVybGluZXtcZm9udG5hbWVcdGVucm0sfQotXGNlbnRlcmxpbmV7d2l0aCBoZWFkaW5ncyBpbiB7XGJmXGZvbnRuYW1lXHRlbmJmfX0KLVxjZW50ZXJsaW5le2FuZCBleGFtcGxlcyBpbiB7XHR0XGZvbnRuYW1lXHRlbnR0fS59Ci1cY2VudGVybGluZXt7XGl0XGZvbnRuYW1lXHRlbml0XC99IGFuZH0KLVxjZW50ZXJsaW5le3tcc2xcZm9udG5hbWVcdGVuc2xcL319Ci1cY2VudGVybGluZXthcmUgdXNlZCBmb3IgZW1waGFzaXMufVx2ZmlsbH0KLVxwYWdlXGNvbG9waG9uCi0lIEJsYW1lOiBkb2NAY3lnbnVzLmNvbSwgMjhtYXI5MS4KLUBlbmQgdGV4Ci0KLQotQGNvbnRlbnRzCi1AYnllCi0KLQpkaWZmIC0tZ2l0IGEvbGQvbGRjcmVmLmMgYi9sZC9sZGNyZWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1YjhlNi4uMDAwMDAwMAotLS0gYS9sZC9sZGNyZWYuYworKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKiBsZGNyZWYuYyAtLSBvdXRwdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyByb3V0aW5lcyB0aGF0IG1hbmFnZSB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLgotICAgVGhlIHRhYmxlIGlzIHVzZWQgdG8gZ2VuZXJhdGUgY3Jvc3MgcmVmZXJlbmNlIHJlcG9ydHMuICBJdCBpcyBhbHNvCi0gICB1c2VkIHRvIGltcGxlbWVudCB0aGUgTk9DUk9TU1JFRlMgY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLS8qIFdlIGtlZXAgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgZm9yIGVhY2ggcmVmZXJlbmNlIHRvIGEKLSAgIHN5bWJvbCBmcm9tIGEgZ2l2ZW4gb2JqZWN0LiAgKi8KLQotc3RydWN0IGNyZWZfcmVmCi17Ci0gIC8qIFRoZSBuZXh0IHJlZmVyZW5jZS4gICovCi0gIHN0cnVjdCBjcmVmX3JlZiAqbmV4dDsKLSAgLyogVGhlIG9iamVjdC4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQuICAqLwotICB1bnNpZ25lZCBpbnQgZGVmIDogMTsKLSAgLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGNvbW1vbi4gICovCi0gIHVuc2lnbmVkIGludCBjb21tb24gOiAxOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHVuZGVmIDogMTsKLX07Ci0KLS8qIFdlIGtlZXAgYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMuICBFYWNoIGVudHJ5IGxvb2tzIGxpa2UgdGhpcy4gICovCi0KLXN0cnVjdCBjcmVmX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFRoZSBkZW1hbmdsZWQgbmFtZS4gICovCi0gIGNoYXIgKmRlbWFuZ2xlZDsKLSAgLyogUmVmZXJlbmNlcyB0byBhbmQgZGVmaW5pdGlvbnMgb2YgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgY3JlZl9yZWYgKnJlZnM7Ci19OwotCi0vKiBUaGlzIGlzIHdoYXQgdGhlIGhhc2ggdGFibGUgbG9va3MgbGlrZS4gICovCi0KLXN0cnVjdCBjcmVmX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpjcmVmX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gY3JlZl9maWxsX2FycmF5IFBBUkFNUyAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgaW50IGNyZWZfc29ydF9hcnJheSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgb3V0cHV0X29uZV9jcmVmIFBBUkFNUyAoKEZJTEUgKiwgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjaGVja19ub2Nyb3NzcmVmIFBBUkFNUyAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19yZWZzCi0gIFBBUkFNUyAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19yZWxvY19yZWZzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiB0aGUgY3JlZiBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjcmVmX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkJCVwKLSAgKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFRyYXZlcnNlIHRoZSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNyZWZfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQkJXAotICAoYmZkX2hhc2hfdHJhdmVyc2UJCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogVGhlIGNyZWYgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgY3JlZl9oYXNoX3RhYmxlIGNyZWZfdGFibGU7Ci0KLS8qIFdoZXRoZXIgdGhlIGNyZWYgaGFzaCB0YWJsZSBoYXMgYmVlbiBpbml0aWFsaXplZC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNyZWZfaW5pdGlhbGl6ZWQ7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBzZWVuIHNvIGZhci4gICovCi0KLXN0YXRpYyBzaXplX3QgY3JlZl9zeW1jb3VudDsKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgY3JlZiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1jcmVmX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmRlbWFuZ2xlZCA9IE5VTEw7Ci0gICAgICByZXQtPnJlZnMgPSBOVUxMOwotCi0gICAgICAvKiBLZWVwIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzIGNyZWF0ZWQgaW4gdGhlIGhhc2gKLSAgICAgICAgIHRhYmxlLiAgKi8KLSAgICAgICsrY3JlZl9zeW1jb3VudDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIGNyZWYgaGFzaCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBldmVyeQotICAgc3ltYm9sIHRoYXQgaXMgc2VlbiBkdXJpbmcgdGhlIGxpbmsuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLWFkZF9jcmVmIChuYW1lLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgY3JlZl9yZWYgKnI7Ci0KLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmY3JlZl90YWJsZS5yb290LCBjcmVmX2hhc2hfbmV3ZnVuYykpCi0JZWluZm8gKF8oIiVYJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgb2YgY3JlZiB0YWJsZSBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgICBjcmVmX2luaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaCA9IGNyZWZfaGFzaF9sb29rdXAgKCZjcmVmX3RhYmxlLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgZWluZm8gKF8oIiVYJVA6IGNyZWZfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCi0gIGZvciAociA9IGgtPnJlZnM7IHIgIT0gTlVMTDsgciA9IHItPm5leHQpCi0gICAgaWYgKHItPmFiZmQgPT0gYWJmZCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChyID09IE5VTEwpCi0gICAgewotICAgICAgciA9IChzdHJ1Y3QgY3JlZl9yZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKLSAgICAgIHItPm5leHQgPSBoLT5yZWZzOwotICAgICAgaC0+cmVmcyA9IHI7Ci0gICAgICByLT5hYmZkID0gYWJmZDsKLSAgICAgIHItPmRlZiA9IGZhbHNlOwotICAgICAgci0+Y29tbW9uID0gZmFsc2U7Ci0gICAgICByLT51bmRlZiA9IGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByLT51bmRlZiA9IHRydWU7Ci0gIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgci0+Y29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIHItPmRlZiA9IHRydWU7Ci19Ci0KLS8qIENvcHkgdGhlIGFkZHJlc3NlcyBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyaWVzIGludG8gYW4gYXJyYXkuICBUaGlzCi0gICBpcyBjYWxsZWQgdmlhIGNyZWZfaGFzaF90cmF2ZXJzZS4gIFdlIGFsc28gZmlsbCBpbiB0aGUgZGVtYW5nbGVkCi0gICBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNyZWZfZmlsbF9hcnJheSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKioqcHBoID0gKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKioqKSBkYXRhOwotCi0gIEFTU0VSVCAoaC0+ZGVtYW5nbGVkID09IE5VTEwpOwotICBoLT5kZW1hbmdsZWQgPSBkZW1hbmdsZSAoaC0+cm9vdC5zdHJpbmcpOwotCi0gICoqcHBoID0gaDsKLQotICArKypwcGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNvcnQgYW4gYXJyYXkgb2YgY3JlZiBoYXNoIHRhYmxlIGVudHJpZXMgYnkgbmFtZS4gICovCi0KLXN0YXRpYyBpbnQKLWNyZWZfc29ydF9hcnJheSAoYTEsIGEyKQotICAgICBjb25zdCBQVFIgYTE7Ci0gICAgIGNvbnN0IFBUUiBhMjsKLXsKLSAgY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKnAxID0gKGNvbnN0IHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKiopIGExOwotICBjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqcDIgPSAoY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikgYTI7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoKCpwMSktPmRlbWFuZ2xlZCwgKCpwMiktPmRlbWFuZ2xlZCk7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgY3JlZiB0YWJsZS4gICovCi0KLSNkZWZpbmUgRklMRUNPTCAoNTApCi0KLXZvaWQKLW91dHB1dF9jcmVmIChmcCkKLSAgICAgRklMRSAqZnA7Ci17Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKipjc3ltcywgKipjc3ltX2ZpbGwsICoqY3N5bSwgKipjc3ltX2VuZDsKLSAgY29uc3QgY2hhciAqbXNnOwotCi0gIGZwcmludGYgKGZwLCBfKCJcbkNyb3NzIFJlZmVyZW5jZSBUYWJsZVxuXG4iKSk7Ci0gIG1zZyA9IF8oIlN5bWJvbCIpOwotICBmcHJpbnRmIChmcCwgbXNnKTsKLSAgbGVuID0gc3RybGVuIChtc2cpOwotICB3aGlsZSAobGVuIDwgRklMRUNPTCkKLSAgICB7Ci0gICAgICBwdXRjICgnICcgLCBmcCk7Ci0gICAgICArK2xlbjsKLSAgICB9Ci0gIGZwcmludGYgKGZwLCBfKCJGaWxlXG4iKSk7Ci0KLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmcCwgXygiTm8gc3ltYm9sc1xuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjc3ltcyA9ICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikKLQkgICB4bWFsbG9jIChjcmVmX3N5bWNvdW50ICogc2l6ZW9mICgqY3N5bXMpKSk7Ci0KLSAgY3N5bV9maWxsID0gY3N5bXM7Ci0gIGNyZWZfaGFzaF90cmF2ZXJzZSAoJmNyZWZfdGFibGUsIGNyZWZfZmlsbF9hcnJheSwgJmNzeW1fZmlsbCk7Ci0gIEFTU0VSVCAoKHNpemVfdCkgKGNzeW1fZmlsbCAtIGNzeW1zKSA9PSBjcmVmX3N5bWNvdW50KTsKLQotICBxc29ydCAoY3N5bXMsIGNyZWZfc3ltY291bnQsIHNpemVvZiAoKmNzeW1zKSwgY3JlZl9zb3J0X2FycmF5KTsKLQotICBjc3ltX2VuZCA9IGNzeW1zICsgY3JlZl9zeW1jb3VudDsKLSAgZm9yIChjc3ltID0gY3N5bXM7IGNzeW0gPCBjc3ltX2VuZDsgY3N5bSsrKQotICAgIG91dHB1dF9vbmVfY3JlZiAoZnAsICpjc3ltKTsKLX0KLQotLyogT3V0cHV0IG9uZSBlbnRyeSBpbiB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLW91dHB1dF9vbmVfY3JlZiAoZnAsIGgpCi0gICAgIEZJTEUgKmZwOwotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotewotICBpbnQgbGVuOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGw7Ci0gIHN0cnVjdCBjcmVmX3JlZiAqcjsKLQotICBobCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgaC0+cm9vdC5zdHJpbmcsIGZhbHNlLAotCQkJICAgICBmYWxzZSwgdHJ1ZSk7Ci0gIGlmIChobCA9PSBOVUxMKQotICAgIGVpbmZvICgiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIsCi0JICAgaC0+cm9vdC5zdHJpbmcpOwotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGJ1dCBuZXZlcgotCSByZWZlcmVuY2VkIGJ5IGEgbm9ybWFsIG9iamVjdCwgdGhlbiBkb24ndCBwcmludCBpdC4gICovCi0gICAgICBpZiAoaGwtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCXsKLQkgIGlmIChobC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgcmV0dXJuOwotCSAgaWYgKGhsLT51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgICAgJiYgKGhsLT51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCSAgICB7Ci0JICAgICAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLQkJaWYgKChyLT5hYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgaWYgKHIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChmcCwgIiVzICIsIGgtPmRlbWFuZ2xlZCk7Ci0gIGxlbiA9IHN0cmxlbiAoaC0+ZGVtYW5nbGVkKSArIDE7Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoci0+ZGVmKQotCXsKLQkgIHdoaWxlIChsZW4gPCBGSUxFQ09MKQotCSAgICB7Ci0JICAgICAgcHV0YyAoJyAnLCBmcCk7Ci0JICAgICAgKytsZW47Ci0JICAgIH0KLQkgIGxmaW5mbyAoZnAsICIlQlxuIiwgci0+YWJmZCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICB9Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISByLT5kZWYpCi0JewotCSAgd2hpbGUgKGxlbiA8IEZJTEVDT0wpCi0JICAgIHsKLQkgICAgICBwdXRjICgnICcsIGZwKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCSAgbGZpbmZvIChmcCwgIiVCXG4iLCByLT5hYmZkKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgIH0KLQotICBBU1NFUlQgKGxlbiA9PSAwKTsKLX0KLQotLyogQ2hlY2sgZm9yIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlcy4gICovCi0KLXZvaWQKLWNoZWNrX25vY3Jvc3NyZWZzICgpCi17Ci0gIGlmICghIGNyZWZfaW5pdGlhbGl6ZWQpCi0gICAgcmV0dXJuOwotCi0gIGNyZWZfaGFzaF90cmF2ZXJzZSAoJmNyZWZfdGFibGUsIGNoZWNrX25vY3Jvc3NyZWYsIChQVFIpIE5VTEwpOwotfQotCi0vKiBDaGVjayBvbmUgc3ltYm9sIHRvIHNlZSBpZiBpdCBpcyBhIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY2hlY2tfbm9jcm9zc3JlZiAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKLSAgYXNlY3Rpb24gKmRlZnNlYzsKLSAgY29uc3QgY2hhciAqZGVmc2VjbmFtZTsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5jcnM7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5jcjsKLQotICBobCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgaC0+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+dmFsdWUpKTsKLQl9Ci0KLSAgICAgIGxhbmdfYWRkX2RhdGEgKHNpemUsIGV4cF9pbnRvcCAoMCkpOwotICAgIH0KLQotICBzdGF0X3B0ciA9IG9sZDsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkY3Rvci5oIGIvbGQvbGRjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NzNmNzcuLjAwMDAwMDAKLS0tIGEvbGQvbGRjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBsZGN0b3IuaCAtIGxpbmtlciBjb25zdHJ1Y3RvciBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERDVE9SX0gKLSNkZWZpbmUgTERDVE9SX0gKLQotLyogTGlzdCBvZiBzdGF0ZW1lbnRzIG5lZWRlZCB0byBoYW5kbGUgY29uc3RydWN0b3JzICovCi1leHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGNvbnN0cnVjdG9yX2xpc3Q7Ci0KLS8qIFdoZXRoZXIgdGhlIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgc29ydGVkLiAgTm90ZSB0aGF0IHRoaXMgaXMKLSAgIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBsaW5rOyB3ZSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlCi0gICBDT05TVFJVQ1RPUlMgY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi1leHRlcm4gYm9vbGVhbiBjb25zdHJ1Y3RvcnNfc29ydGVkOwotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGZvciBlYWNoIHNldCB3ZSBidWlsZC4gICovCi0KLXN0cnVjdCBzZXRfaW5mbwotewotICBzdHJ1Y3Qgc2V0X2luZm8gKm5leHQ7CQkvKiBOZXh0IHNldC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwkvKiBIYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwkvKiBSZWxvYyB0byB1c2UgZm9yIGFuIGVudHJ5LiAgKi8KLSAgc2l6ZV90IGNvdW50OwkJCQkvKiBOdW1iZXIgb2YgZWxlbWVudHMuICAqLwotICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmVsZW1lbnRzOwkJLyogRWxlbWVudHMgaW4gc2V0LiAgKi8KLX07Ci0KLXN0cnVjdCBzZXRfZWxlbWVudAotewotICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKm5leHQ7CQkvKiBOZXh0IGVsZW1lbnQuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwkJCS8qIE5hbWUgaW4gc2V0IChtYXkgYmUgTlVMTCkuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsJCQkvKiBTZWN0aW9uIG9mIHZhbHVlIGluIHNldC4gICovCi0gIGJmZF92bWEgdmFsdWU7CQkJLyogVmFsdWUgaW4gc2V0LiAgKi8KLX07Ci0KLS8qIFRoZSBzZXRzIHdlIGhhdmUgc2Vlbi4gICovCi0KLWV4dGVybiBzdHJ1Y3Qgc2V0X2luZm8gKnNldHM7Ci0KLWV4dGVybiB2b2lkIGxkY3Rvcl9hZGRfc2V0X2VudHJ5IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLAotCQkJCQkgIGNvbnN0IGNoYXIgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgbGRjdG9yX2J1aWxkX3NldHMgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkZW11bC5jIGIvbGQvbGRlbXVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTI4OTQuLjAwMDAwMDAKLS0tIGEvbGQvbGRlbXVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyogbGRlbXVsLmMgLS0gY2xlYXJpbmcgaG91c2UgZm9yIGxkIGVtdWxhdGlvbiBzdGF0ZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwtbGlzdC5oIgotCi1sZF9lbXVsYXRpb25feGZlcl90eXBlICpsZF9lbXVsYXRpb247Ci0KLXZvaWQKLWxkZW11bF9obGwobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbGRfZW11bGF0aW9uLT5obGwobmFtZSk7Ci19Ci0KLQotdm9pZCBsZGVtdWxfc3lzbGliKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGxkX2VtdWxhdGlvbi0+c3lzbGliKG5hbWUpOwotfQotCi12b2lkCi1sZGVtdWxfYWZ0ZXJfcGFyc2UoKQotewotICBsZF9lbXVsYXRpb24tPmFmdGVyX3BhcnNlKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9iZWZvcmVfcGFyc2UoKQotewotICBsZF9lbXVsYXRpb24tPmJlZm9yZV9wYXJzZSgpOwotfQotCi12b2lkCi1sZGVtdWxfYWZ0ZXJfb3BlbiAoKQotewotICBsZF9lbXVsYXRpb24tPmFmdGVyX29wZW4gKCk7Ci19Ci0KLXZvaWQgCi1sZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbigpCi17Ci0gIGxkX2VtdWxhdGlvbi0+YWZ0ZXJfYWxsb2NhdGlvbigpOwotfQotCi12b2lkIAotbGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9uKCkKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+YmVmb3JlX2FsbG9jYXRpb24pCi0gICAgbGRfZW11bGF0aW9uLT5iZWZvcmVfYWxsb2NhdGlvbigpOwotfQotCi0KLXZvaWQKLWxkZW11bF9zZXRfb3V0cHV0X2FyY2goKQotewotICBsZF9lbXVsYXRpb24tPnNldF9vdXRwdXRfYXJjaCgpOwotfQotCi12b2lkCi1sZGVtdWxfZmluaXNoKCkKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+ZmluaXNoKQotICAgIGxkX2VtdWxhdGlvbi0+ZmluaXNoKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9zZXRfc3ltYm9scygpCi17Ci0gIGlmIChsZF9lbXVsYXRpb24tPnNldF9zeW1ib2xzKQotICAgIGxkX2VtdWxhdGlvbi0+c2V0X3N5bWJvbHMoKTsKLX0KLQotdm9pZAotbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKCkKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+Y3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpCi0gICAgbGRfZW11bGF0aW9uLT5jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cygpOwotfQotCi1jaGFyICoKLWxkZW11bF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17Ci0gIHJldHVybiBsZF9lbXVsYXRpb24tPmdldF9zY3JpcHQoaXNmaWxlKTsKLX0KLQotYm9vbGVhbgotbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAobGRfZW11bGF0aW9uLT5vcGVuX2R5bmFtaWNfYXJjaGl2ZSkKLSAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPm9wZW5fZHluYW1pY19hcmNoaXZlKSAoYXJjaCwgc2VhcmNoLCBlbnRyeSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbGVhbgotbGRlbXVsX3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGlmIChsZF9lbXVsYXRpb24tPnBsYWNlX29ycGhhbikKLSAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPnBsYWNlX29ycGhhbikgKGZpbGUsIHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludAotbGRlbXVsX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgLyogVHJ5IGFuZCB1c2UgdGhlIGVtdWxhdGlvbiBwYXJzZXIgaWYgdGhlcmUgaXMgb25lLiAqLwotICBpZiAobGRfZW11bGF0aW9uLT5wYXJzZV9hcmdzKQotICAgIHsKLSAgICAgIHJldHVybiBsZF9lbXVsYXRpb24tPnBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIExldCB0aGUgZW11bGF0aW9uIGNvZGUgaGFuZGxlIGFuIHVucmVjb2duaXplZCBmaWxlLiAgKi8KLQotYm9vbGVhbgotbGRlbXVsX3VucmVjb2duaXplZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGlmIChsZF9lbXVsYXRpb24tPnVucmVjb2duaXplZF9maWxlKQotICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+dW5yZWNvZ25pemVkX2ZpbGUpIChlbnRyeSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTGV0IHRoZSBlbXVsYXRpb24gY29kZSBoYW5kbGUgYSByZWNvZ25pemVkIGZpbGUuICAqLwotCi1ib29sZWFuCi1sZGVtdWxfcmVjb2duaXplZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGlmIChsZF9lbXVsYXRpb24tPnJlY29nbml6ZWRfZmlsZSkKLSAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPnJlY29nbml6ZWRfZmlsZSkgKGVudHJ5KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1jaGFyICoKLWxkZW11bF9jaG9vc2VfdGFyZ2V0KCkKLXsKLSAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+Y2hvb3NlX3RhcmdldCgpOwotfQotCi0vKiBUaGUgZGVmYXVsdCBjaG9vc2VfdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KLQotY2hhciAqCi1sZGVtdWxfZGVmYXVsdF90YXJnZXQoKQotewotICBjaGFyICpmcm9tX291dHNpZGUgPSBnZXRlbnYgKFRBUkdFVF9FTlZJUk9OKTsKLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLSAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+dGFyZ2V0X25hbWU7Ci19Ci0KLXZvaWQgCi1hZnRlcl9wYXJzZV9kZWZhdWx0KCkKLXsKLQotfQotCi12b2lkCi1hZnRlcl9vcGVuX2RlZmF1bHQgKCkKLXsKLX0KLQotdm9pZAotYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0KCkKLXsKLQotfQotCi12b2lkCi1iZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0KCkKLXsKLQotfQotCi12b2lkCi1zZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLAotCSAgICAgICAgICAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBsZGZpbGVfb3V0cHV0X21hY2hpbmUpOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXN5c2xpYl9kZWZhdWx0KGlnbm9yZSkKLSAgICAgY2hhciAgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbmZvX21zZyAoXygiJVMgU1lTTElCIGlnbm9yZWRcbiIpKTsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1obGxfZGVmYXVsdChpZ25vcmUpCi0gICAgIGNoYXIgICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW5mb19tc2cgKF8oIiVTIEhMTCBpZ25vcmVkXG4iKSk7Ci19Ci0KLWxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKmxkX2VtdWxhdGlvbnNbXSA9IHsgRU1VTEFUSU9OX0xJU1QgfTsKLQotdm9pZAotbGRlbXVsX2Nob29zZV9tb2RlKHRhcmdldCkKLSAgICAgY2hhciAqdGFyZ2V0OwotewotICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiplcHRyID0gbGRfZW11bGF0aW9uczsKLSAgICAvKiBJZ25vcmUgImdsZCIgcHJlZml4LiAqLwotICAgIGlmICh0YXJnZXRbMF0gPT0gJ2cnICYmIHRhcmdldFsxXSA9PSAnbCcgJiYgdGFyZ2V0WzJdID09ICdkJykKLQl0YXJnZXQgKz0gMzsKLSAgICBmb3IgKDsgKmVwdHI7IGVwdHIrKykKLSAgICAgIHsKLQlpZiAoc3RyY21wKHRhcmdldCwgKCplcHRyKS0+ZW11bGF0aW9uX25hbWUpID09IDApCi0JICB7Ci0JICAgIGxkX2VtdWxhdGlvbiA9ICplcHRyOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgZWluZm8gKF8oIiVQOiB1bnJlY29nbmlzZWQgZW11bGF0aW9uIG1vZGU6ICVzXG4iKSwgdGFyZ2V0KTsKLSAgICBlaW5mbyAoXygiU3VwcG9ydGVkIGVtdWxhdGlvbnM6ICIpKTsKLSAgICBsZGVtdWxfbGlzdF9lbXVsYXRpb25zIChzdGRlcnIpOwotICAgIGVpbmZvICgiJUZcbiIpOwotfQotCi12b2lkCi1sZGVtdWxfbGlzdF9lbXVsYXRpb25zIChmKQotICAgICBGSUxFICpmOwotewotICBsZF9lbXVsYXRpb25feGZlcl90eXBlICoqZXB0ciA9IGxkX2VtdWxhdGlvbnM7Ci0gIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoOyAqZXB0cjsgZXB0cisrKQotICAgIHsKLSAgICAgIGlmIChmaXJzdCkKLQlmaXJzdCA9IGZhbHNlOwotICAgICAgZWxzZQotCWZwcmludGYgKGYsICIgIik7Ci0gICAgICBmcHJpbnRmIChmLCAiJXMiLCAoKmVwdHIpLT5lbXVsYXRpb25fbmFtZSk7Ci0gICAgfQotfQotCi12b2lkCi1sZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyAoZikKLSAgICAgRklMRSAqIGY7Ci17Ci0gIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiogZXB0cjsKLSAgaW50IG9wdGlvbnNfZm91bmQgPSAwOwotICAKLSAgZm9yIChlcHRyID0gbGRfZW11bGF0aW9uczsgKiBlcHRyOyBlcHRyICsrKQotICAgIHsKLSAgICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiBlbXVsID0gKiBlcHRyOwotICAgICAgCi0gICAgICBpZiAoZW11bC0+bGlzdF9vcHRpb25zKQotCXsKLQkgIGZwcmludGYgKGYsICIlczogXG4iLCBlbXVsLT5lbXVsYXRpb25fbmFtZSk7Ci0gICAgICAKLQkgIGVtdWwtPmxpc3Rfb3B0aW9ucyAoZik7Ci0KLQkgIG9wdGlvbnNfZm91bmQgPSAxOwotCX0KLSAgICB9Ci0gIAotICBpZiAoISBvcHRpb25zX2ZvdW5kKQotICAgIGZwcmludGYgKGYsIF8oIiAgbm8gZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnMuXG4iKSk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGVtdWwuaCBiL2xkL2xkZW11bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBkZTA2Li4wMDAwMDAwCi0tLSBhL2xkL2xkZW11bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qIGxkLWVtdWwuaCAtIExpbmtlciBlbXVsYXRpb24gaGVhZGVyIGZpbGUKLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KLQotI2lmbmRlZiBMREVNVUxfSAotI2RlZmluZSBMREVNVUxfSAotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0Owotc3RydWN0IHNlYXJjaF9kaXJzOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGxkZW11bF9obGwgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfc3lzbGliIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9zZXRfb3V0cHV0X2FyY2ggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKmxkZW11bF9jaG9vc2VfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9jaG9vc2VfbW9kZSBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyBQQVJBTVMgKChGSUxFICopKTsKLWV4dGVybiBjaGFyICpsZGVtdWxfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBib29sZWFuIGxkZW11bF9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gaW50IGxkZW11bF9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX3VucmVjb2duaXplZF9maWxlCi0gIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX3JlY29nbml6ZWRfZmlsZQotICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBib29sZWFuIGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBzZWFyY2hfZGlycyAqLAotCSAgIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGNoYXIgKmxkZW11bF9kZWZhdWx0X3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBhZnRlcl9wYXJzZV9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGFmdGVyX29wZW5fZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzeXNsaWJfZGVmYXVsdCBQQVJBTVMgKChjaGFyKikpOwotZXh0ZXJuIHZvaWQgaGxsX2RlZmF1bHQgUEFSQU1TICgoY2hhciopKTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0Ci17Ci0gIC8qIFJ1biBiZWZvcmUgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIGFuZCBzY3JpcHQgZmlsZS4KLSAgICAgU2V0IHRoZSBhcmNoaXRlY3R1cmUsIG1heWJlIG90aGVyIHRoaW5ncy4gICovCi0gIHZvaWQgICAoKmJlZm9yZV9wYXJzZSkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIEhhbmRsZSB0aGUgU1lTTElCIChsb3cgbGV2ZWwgbGlicmFyeSkgc2NyaXB0IGNvbW1hbmQuICAqLwotICB2b2lkICAgKCpzeXNsaWIpIFBBUkFNUyAoKGNoYXIgKikpOwotCi0gIC8qIEhhbmRsZSB0aGUgSExMIChoaWdoIGxldmVsIGxpYnJhcnkpIHNjcmlwdCBjb21tYW5kLiAgKi8KLSAgdm9pZCAgICgqaGxsKSBQQVJBTVMgKChjaGFyICopKTsKLQotICAvKiBSdW4gYWZ0ZXIgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIGFuZCBzY3JpcHQgZmlsZS4gICovCi0gIHZvaWQgICAoKmFmdGVyX3BhcnNlKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUnVuIGFmdGVyIG9wZW5pbmcgYWxsIGlucHV0IGZpbGVzLCBhbmQgbG9hZGluZyB0aGUgc3ltYm9scy4gICovCi0gIHZvaWQgICAoKmFmdGVyX29wZW4pIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gYWZ0ZXIgYWxsb2NhdGluZyBvdXRwdXQgc2VjdGlvbnMuICAqLwotICB2b2lkICAgKCphZnRlcl9hbGxvY2F0aW9uKSBQQVJBTVMgKCAodm9pZCkpOwotCi0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZS4gICovCi0gIHZvaWQgICAoKnNldF9vdXRwdXRfYXJjaCkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIERlY2lkZSB3aGljaCB0YXJnZXQgbmFtZSB0byB1c2UuICAqLwotICBjaGFyICogKCpjaG9vc2VfdGFyZ2V0KSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUnVuIGJlZm9yZSBhbGxvY2F0aW5nIG91dHB1dCBzZWN0aW9ucy4gICovCi0gIHZvaWQgICAoKmJlZm9yZV9hbGxvY2F0aW9uKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBsaW5rZXIgc2NyaXB0LiAgKi8KLSAgY2hhciAqICgqZ2V0X3NjcmlwdCkgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGlzIGVtdWxhdGlvbi4gICovCi0gIGNoYXIgKmVtdWxhdGlvbl9uYW1lOwotCi0gIC8qIFRoZSBvdXRwdXQgZm9ybWF0LiAgKi8KLSAgY2hhciAqdGFyZ2V0X25hbWU7Ci0KLSAgLyogUnVuIGFmdGVyIGFzc2lnbmluZyB2YWx1ZXMgZnJvbSB0aGUgc2NyaXB0LiAgKi8KLSAgdm9pZAkoKmZpbmlzaCkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIENyZWF0ZSBhbnkgb3V0cHV0IHNlY3Rpb25zIG5lZWRlZCBieSB0aGUgdGFyZ2V0LiAgKi8KLSAgdm9pZAkoKmNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGxpYnJhcnkuICBBUkNIIGlzIGFuIGFyY2hpdGVjdHVyZSBuYW1lLCBhbmQKLSAgICAgaXMgbm9ybWFsbHkgdGhlIGVtcHR5IHN0cmluZy4gIEVOVFJZIGlzIHRoZSBsYW5nX2lucHV0X3N0YXRlbWVudAotICAgICB0aGF0IHNob3VsZCBiZSBvcGVuZWQuICAqLwotICBib29sZWFuICgqb3Blbl9keW5hbWljX2FyY2hpdmUpCi0gICAgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaCwgc3RydWN0IHNlYXJjaF9kaXJzICosCi0JICAgICBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICplbnRyeSkpOwotCi0gIC8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgUmV0dXJuIHRydWUgaWYgaXQgd2FzIHBsYWNlZCwgZmFsc2UgaWYKLSAgICAgdGhlIGRlZmF1bHQgYWN0aW9uIHNob3VsZCBiZSB0YWtlbi4gIFRoaXMgZmllbGQgbWF5IGJlIE5VTEwsIGluCi0gICAgIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgYWN0aW9uIHdpbGwgYWx3YXlzIGJlIHRha2VuLiAgKi8KLSAgYm9vbGVhbiAoKnBsYWNlX29ycGhhbikKLSAgICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICosIGFzZWN0aW9uICopKTsKLQotICAvKiBSdW4gYWZ0ZXIgYXNzaWduaW5nIHBhcnNpbmcgd2l0aCB0aGUgYXJncywgYnV0IGJlZm9yZSAKLSAgICAgcmVhZGluZyB0aGUgc2NyaXB0LiAgVXNlZCB0byBpbml0aWFsaXplIHN5bWJvbHMgdXNlZCBpbiB0aGUgc2NyaXB0LiAqLwotICB2b2lkCSgqc2V0X3N5bWJvbHMpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gdG8gcGFyc2UgYXJncyB3aGljaCB0aGUgYmFzZSBsaW5rZXIgZG9lc24ndAotICAgICB1bmRlcnN0YW5kLiBSZXR1cm4gbm9uIHplcm8gb24gc3VjZXNzLiAqLwotICBpbnQgKCpwYXJzZV9hcmdzKSBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotICAvKiBSdW4gdG8gaGFuZGxlIGZpbGVzIHdoaWNoIGFyZSBub3QgcmVjb2duaXplZCBhcyBvYmplY3QgZmlsZXMgb3IKLSAgICAgYXJjaGl2ZXMuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgaGFuZGxlZC4gICovCi0gIGJvb2xlYW4gKCp1bnJlY29nbml6ZWRfZmlsZSkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLQotICAvKiBSdW4gdG8gbGlzdCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgd2hpY2ggcGFyc2VfYXJncyBoYW5kbGVzLiAgKi8KLSAgdm9pZCAoKiBsaXN0X29wdGlvbnMpIFBBUkFNUyAoKEZJTEUgKikpOwotCi0gIC8qIFJ1biB0byBzcGVjaWFsbHkgaGFuZGxlIGZpbGVzIHdoaWNoICphcmUqIHJlY29nbml6ZWQgYXMgb2JqZWN0Ci0gICAgIGZpbGVzIG9yIGFyY2hpdmVzLiAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIGhhbmRsZWQuICAqLwotICBib29sZWFuICgqcmVjb2duaXplZF9maWxlKQotICAgIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotCi19IGxkX2VtdWxhdGlvbl94ZmVyX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSAKLXsKLSAgaW50ZWxfaWM5NjBfbGRfbW9kZV9lbnVtLAotICBkZWZhdWx0X21vZGVfZW51bSAsCi0gIGludGVsX2dsZDk2MF9sZF9tb2RlX2VudW0KLX0gbGFuZ19lbXVsYXRpb25fbW9kZV9lbnVtX3R5cGU7Ci0KLWV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlICpsZF9lbXVsYXRpb25zW107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRleHAuYyBiL2xkL2xkZXhwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMWVkODguLjAwMDAwMDAKLS0tIGEvbGQvbGRleHAuYworKysgL2Rldi9udWxsCkBAIC0xLDk4NiArMCwwIEBACi0vKiBUaGlzIG1vZHVsZSBoYW5kbGVzIGV4cHJlc3Npb24gdHJlZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgKHNhY0BjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVRoaXMgbW9kdWxlIGlzIGluIGNoYXJnZSBvZiB3b3JraW5nIG91dCB0aGUgY29udGVudHMgb2YgZXhwcmVzc2lvbnMuCi0KLUl0IGhhcyB0byBrZWVwIHRyYWNrIG9mIHRoZSByZWxhdGl2ZS9hYnNuZXNzIG9mIGEgc3ltYm9sIGV0Yy4gVGhpcyBpcwotZG9uZSBieSBrZWVwaW5nIGFsbCB2YWx1ZXMgaW4gYSBzdHJ1Y3QgKGFuIGV0cmVlX3ZhbHVlX3R5cGUpIHdoaWNoCi1jb250YWlucyBhIHZhbHVlLCBhIHNlY3Rpb24gdG8gd2hpY2ggaXQgaXMgcmVsYXRpdmUgYW5kIGEgdmFsaWQgYml0LgotCi0qLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGV4cF9wcmludF90b2tlbiBQQVJBTVMgKCh0b2tlbl9jb2RlX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgbWFrZV9hYnMgUEFSQU1TICgoZXRyZWVfdmFsdWVfdHlwZSAqcHRyKSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBuZXdfYWJzIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUpKTsKLXN0YXRpYyB2b2lkIGNoZWNrIFBBUkFNUyAoKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zLAotCQkJICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqb3ApKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIG5ld19yZWwKLSAgUEFSQU1TICgoYmZkX3ZtYSB2YWx1ZSwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqc2VjdGlvbikpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgbmV3X3JlbF9mcm9tX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkX3ZtYSB2YWx1ZSwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqc2VjdGlvbikpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgZm9sZF9iaW5hcnkKLSAgUEFSQU1TICgoZXRyZWVfdHlwZSAqdHJlZSwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb24sCi0JICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZSwKLQkgICBiZmRfdm1hIGRvdCwgYmZkX3ZtYSAqZG90cCkpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgZm9sZF9uYW1lCi0gIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAotCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUsCi0JICAgYmZkX3ZtYSBkb3QpKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIGV4cF9mb2xkX3RyZWVfbm9fZG90Ci0gIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAotCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUpKTsKLQotc3RhdGljIHZvaWQKLWV4cF9wcmludF90b2tlbiAoY29kZSkKLSAgICAgdG9rZW5fY29kZV90eXBlIGNvZGU7Ci17Ci0gIHN0YXRpYyBDT05TVCBzdHJ1Y3QKLSAgICB7Ci0gICAgICB0b2tlbl9jb2RlX3R5cGUgY29kZTsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgfSB0YWJsZVtdID0KLSAgICAgIHsKLQl7IElOVCwJImludCIgfSwKLQl7IFJFTCwgInJlbG9jYXRlYWJsZSIgfSwKLQl7IE5BTUUsIk5BTUUiIH0sCi0JeyBQTFVTRVEsIis9IiB9LAotCXsgTUlOVVNFUSwiLT0iIH0sCi0JeyBNVUxURVEsIio9IiB9LAotCXsgRElWRVEsIi89IiB9LAotCXsgTFNISUZURVEsIjw8PSIgfSwKLQl7IFJTSElGVEVRLCI+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/PyIpOwotICAgIGJyZWFrOwotICBjYXNlIGV0cmVlX25hbWU6Ci0gICAgaWYgKHRyZWUtPnR5cGUubm9kZV9jb2RlID09IE5BTUUpIHsKLSAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIlcyIsIHRyZWUtPm5hbWUubmFtZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnR5cGUubm9kZV9jb2RlKTsKLSAgICAgIGlmICh0cmVlLT5uYW1lLm5hbWUpCi0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCVzKSIsIHRyZWUtPm5hbWUubmFtZSk7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEZBSUwoKTsKLSAgICBicmVhazsKLSAgfQotfQotCi1iZmRfdm1hCi1leHBfZ2V0X3ZtYSAodHJlZSwgZGVmLCBuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGJmZF92bWEgZGVmOwotICAgICBjaGFyICpuYW1lOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0KLSAgaWYgKHRyZWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QgKHRyZWUsIGFic19vdXRwdXRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lKTsKLSAgICAgIGlmICghIHIudmFsaWRfcCAmJiBuYW1lICE9IE5VTEwpCi0JZWluZm8gKF8oIiVGJVMgbm9uY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIpLCBuYW1lKTsKLSAgICAgIHJldHVybiByLnZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBkZWY7Ci19Ci0KLWludCAKLWV4cF9nZXRfdmFsdWVfaW50ICh0cmVlLGRlZixuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGludCBkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci17Ci0gIHJldHVybiAoaW50KWV4cF9nZXRfdm1hKHRyZWUsKGJmZF92bWEpZGVmLG5hbWUsIGFsbG9jYXRpb25fZG9uZSk7Ci19Ci0KLQotYmZkX3ZtYQotZXhwX2dldF9hYnNfaW50ICh0cmVlLCBkZWYsIG5hbWUsIGFsbG9jYXRpb25fZG9uZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgaW50IGRlZiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpuYW1lOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotICBldHJlZV92YWx1ZV90eXBlIHJlczsKLSAgcmVzID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QgKHRyZWUsIGFic19vdXRwdXRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lKTsKLQotICBpZiAocmVzLnZhbGlkX3ApCi0gICAgewotICAgICAgcmVzLnZhbHVlICs9IHJlcy5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hOwotICAgIH0KLSAgZWxzZSB7Ci0gICAgZWluZm8gKF8oIiVGJVMgbm9uIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yICVzXG4iKSxuYW1lKTsKLSAgfQotICByZXR1cm4gcmVzLnZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRleHAuaCBiL2xkL2xkZXhwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZThkZGYuLjAwMDAwMDAKLS0tIGEvbGQvbGRleHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBsZGV4cC5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMREVYUF9ICi0jZGVmaW5lIExERVhQX0gKLQotLyogVGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIHRyZWUgKi8KLXR5cGVkZWYgc3RydWN0IAotewotICBiZmRfdm1hIHZhbHVlOwotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfc3RydWN0ICpzZWN0aW9uOwotICBib29sZWFuIHZhbGlkX3A7Ci19IGV0cmVlX3ZhbHVlX3R5cGU7Ci0KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgaW50IG5vZGVfY29kZTsKLSAgZW51bSB7IGV0cmVlX2JpbmFyeSwKLQkgICBldHJlZV90cmluYXJ5LAotCSAgIGV0cmVlX3VuYXJ5LAotCSAgIGV0cmVlX25hbWUsCi0JICAgZXRyZWVfYXNzaWduLAotCSAgIGV0cmVlX3Byb3ZpZGUsCi0JICAgZXRyZWVfdW5kZWYsCi0JICAgZXRyZWVfdW5zcGVjLAotCSAgIGV0cmVlX3ZhbHVlLAotCSAgIGV0cmVlX2Fzc2VydCwKLQkgICBldHJlZV9yZWwgfSBub2RlX2NsYXNzOwotfSBub2RlX3R5cGU7Ci0KLQotCi10eXBlZGVmIHVuaW9uIGV0cmVlX3VuaW9uIAotewotICBub2RlX3R5cGUgdHlwZTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqbGhzOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpyaHM7Ci0gIH0gYmluYXJ5OwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpjb25kOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpsaHM7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKnJoczsKLSAgfSB0cmluYXJ5OwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIENPTlNUIGNoYXIgKmRzdDsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqc3JjOwotICB9IGFzc2lnbjsKLQotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIHVuaW9uICAgZXRyZWVfdW5pb24gKmNoaWxkOwotICB9IHVuYXJ5OwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgfSBuYW1lOwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIGJmZF92bWEgdmFsdWU7Ci0gIH0gdmFsdWU7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgYmZkX3ZtYSB2YWx1ZTsKLSAgfSByZWw7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmNoaWxkOwotICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci0gIH0gYXNzZXJ0X3M7Ci19IGV0cmVlX3R5cGU7Ci0KLQotZXRyZWVfdHlwZSAqZXhwX2ludG9wIFBBUkFNUyAoKGJmZF92bWEpKTsKLWV0cmVlX3R5cGUgKmV4cF9yZWxvcCBQQVJBTVMgKChhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1ldHJlZV92YWx1ZV90eXBlIGludmFsaWQgUEFSQU1TICgodm9pZCkpOwotZXRyZWVfdmFsdWVfdHlwZSBleHBfZm9sZF90cmVlIFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgc3RydWN0Ci0JCQkJCWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3N0cnVjdCAqLAotCQkJCQlsYW5nX3BoYXNlX3R5cGUsCi0JCQkJCWJmZF92bWEsIGJmZF92bWEgKikpOwotZXRyZWVfdHlwZSAqZXhwX2Jpbm9wIFBBUkFNUyAoKGludCwgZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF90cmlub3AgUEFSQU1TICgoaW50LGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF91bm9wIFBBUkFNUyAoKGludCwgZXRyZWVfdHlwZSAqKSk7Ci1ldHJlZV90eXBlICpleHBfbmFtZW9wIFBBUkFNUyAoKGludCwgQ09OU1QgY2hhciAqKSk7Ci1ldHJlZV90eXBlICpleHBfYXNzb3AgUEFSQU1TICgoaW50LCBDT05TVCBjaGFyICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX3Byb3ZpZGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF9hc3NlcnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBjb25zdCBjaGFyICopKTsKLXZvaWQgZXhwX3ByaW50X3RyZWUgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1iZmRfdm1hIGV4cF9nZXRfdm1hIFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgYmZkX3ZtYSwgY2hhciAqLCBsYW5nX3BoYXNlX3R5cGUpKTsKLWludCBleHBfZ2V0X3ZhbHVlX2ludCBQQVJBTVMgKChldHJlZV90eXBlICosIGludCwgY2hhciAqLGxhbmdfcGhhc2VfdHlwZSkpOwotYmZkX3ZtYSBleHBfZ2V0X2Fic19pbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBpbnQsIGNoYXIgKixsYW5nX3BoYXNlX3R5cGUpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGZpbGUuYyBiL2xkL2xkZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzAwY2FiLi4wMDAwMDAwCi0tLSBhL2xkL2xkZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotIGxkZmlsZS5jCi0KLSBsb29rIGFmdGVyIGFsbCB0aGUgZmlsZSBzdHVmZgotCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgKmxkZmlsZV9pbnB1dF9maWxlbmFtZTsKLWJvb2xlYW4gbGRmaWxlX2Fzc3VtZWRfc2NyaXB0ID0gZmFsc2U7Ci1jb25zdCBjaGFyICpsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9ICIiOwotdW5zaWduZWQgbG9uZyBsZGZpbGVfb3V0cHV0X21hY2hpbmU7Ci1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmU7Ci1zZWFyY2hfZGlyc190eXBlICpzZWFyY2hfaGVhZDsKLQotI2lmbmRlZiBNUFcKLSNpZmRlZiBWTVMKLWNoYXIgKnNsYXNoID0gIiI7Ci0jZWxzZQotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi1jaGFyICpzbGFzaCA9ICJcXCI7Ci0jZWxzZQotY2hhciAqc2xhc2ggPSAiLyI7Ci0jZW5kaWYKLSNlbmRpZgotI2Vsc2UgLyogTVBXICovCi0vKiBUaGUgTVBXIHBhdGggY2hhciBpcyBhIGNvbG9uLiAqLwotY2hhciAqc2xhc2ggPSAiOiI7Ci0jZW5kaWYgLyogTVBXICovCi0KLS8qIExPQ0FMICovCi0KLXN0YXRpYyBzZWFyY2hfZGlyc190eXBlICoqc2VhcmNoX3RhaWxfcHRyID0gJnNlYXJjaF9oZWFkOwotCi10eXBlZGVmIHN0cnVjdCBzZWFyY2hfYXJjaCAKLXsKLSAgY2hhciAqbmFtZTsgCi0gIHN0cnVjdCBzZWFyY2hfYXJjaCAqbmV4dDsKLX0gc2VhcmNoX2FyY2hfdHlwZTsKLQotc3RhdGljIHNlYXJjaF9hcmNoX3R5cGUgKnNlYXJjaF9hcmNoX2hlYWQ7Ci1zdGF0aWMgc2VhcmNoX2FyY2hfdHlwZSAqKnNlYXJjaF9hcmNoX3RhaWxfcHRyID0gJnNlYXJjaF9hcmNoX2hlYWQ7Ci0gCi1zdGF0aWMgYm9vbGVhbiBsZGZpbGVfb3Blbl9maWxlX3NlYXJjaAotICBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosCi0JICAgY29uc3QgY2hhciAqbGliLCBjb25zdCBjaGFyICpzdWZmaXgpKTsKLXN0YXRpYyBGSUxFICp0cnlfb3BlbiBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpleHRlbikpOwotCi12b2lkCi1sZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAobmFtZSwgY21kbGluZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBjbWRsaW5lOwotewotICBzZWFyY2hfZGlyc190eXBlICpuZXc7Ci0KLSAgbmV3ID0gKHNlYXJjaF9kaXJzX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzZWFyY2hfZGlyc190eXBlKSk7Ci0gIG5ldy0+bmV4dCA9IE5VTEw7Ci0gIG5ldy0+bmFtZSA9IG5hbWU7Ci0gIG5ldy0+Y21kbGluZSA9IGNtZGxpbmU7Ci0gICpzZWFyY2hfdGFpbF9wdHIgPSBuZXc7Ci0gIHNlYXJjaF90YWlsX3B0ciA9ICZuZXctPm5leHQ7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgQkZEIGZvciBhIGxhbmdfaW5wdXRfc3RhdGVtZW50LiAgKi8KLQotYm9vbGVhbgotbGRmaWxlX3RyeV9vcGVuX2JmZCAoYXR0ZW1wdCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmF0dGVtcHQ7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBlbnRyeS0+dGhlX2JmZCA9IGJmZF9vcGVuciAoYXR0ZW1wdCwgZW50cnktPnRhcmdldCk7Ci0KLSAgaWYgKHRyYWNlX2ZpbGVfdHJpZXMpCi0gICAgewotICAgICAgaWYgKGVudHJ5LT50aGVfYmZkID09IE5VTEwpCi0JaW5mb19tc2cgKF8oImF0dGVtcHQgdG8gb3BlbiAlcyBmYWlsZWRcbiIpLCBhdHRlbXB0KTsKLSAgICAgIGVsc2UKLQlpbmZvX21zZyAoXygiYXR0ZW1wdCB0byBvcGVuICVzIHN1Y2NlZWRlZFxuIiksIGF0dGVtcHQpOwotICAgIH0KLQotICBpZiAoZW50cnktPnRoZV9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpCi0JZWluZm8gKF8oIiVGJVA6IGludmFsaWQgQkZEIHRhcmdldCBgJXMnXG4iKSwgZW50cnktPnRhcmdldCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBzZWFyY2hpbmcgZm9yIHRoaXMgZmlsZSwgc2VlIGlmIHRoZSBhcmNoaXRlY3R1cmUgaXMKLSAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQgZmlsZS4gIElmIGl0IGlzbid0LCBrZWVwIHNlYXJjaGluZy4KLSAgICAgSWYgd2UgY2FuJ3Qgb3BlbiB0aGUgZmlsZSBhcyBhbiBvYmplY3QgZmlsZSwgc3RvcCB0aGUgc2VhcmNoCi0gICAgIGhlcmUuICAqLwotCi0gIGlmIChlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZykKLSAgICB7Ci0gICAgICBiZmQgKmNoZWNrOwotCi0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9hcmNoaXZlKSkKLQljaGVjayA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGVudHJ5LT50aGVfYmZkLCBOVUxMKTsKLSAgICAgIGVsc2UKLQljaGVjayA9IGVudHJ5LT50aGVfYmZkOwotCi0gICAgICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChjaGVjaywgYmZkX29iamVjdCkpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBpZiAoYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgKGNoZWNrLCBvdXRwdXRfYmZkKSA9PSBOVUxMKQotCXsKLQkgIGVpbmZvIChfKCIlUDogc2tpcHBpbmcgaW5jb21wYXRpYmxlICVzIHdoZW4gc2VhcmNoaW5nIGZvciAlcyIpLAotCQkgYXR0ZW1wdCwgZW50cnktPmxvY2FsX3N5bV9uYW1lKTsKLQkgIGJmZF9jbG9zZSAoZW50cnktPnRoZV9iZmQpOwotCSAgZW50cnktPnRoZV9iZmQgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYW5kIG9wZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IEVOVFJZLiAgSWYgaXQgaXMgYW4KLSAgIGFyY2hpdmUsIHVzZSBBUkNILCBMSUIgYW5kIFNVRkZJWCB0byBtb2RpZnkgdGhlIGZpbGUgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1sZGZpbGVfb3Blbl9maWxlX3NlYXJjaCAoYXJjaCwgZW50cnksIGxpYiwgc3VmZml4KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLSAgICAgY29uc3QgY2hhciAqbGliOwotICAgICBjb25zdCBjaGFyICpzdWZmaXg7Ci17Ci0gIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBhbiBhcmNoaXZlLCB0cnkgdG8gb3BlbiBpdCBpbiB0aGUgY3VycmVudAotICAgICBkaXJlY3RvcnkgZmlyc3QuICAqLwotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICB7Ci0gICAgICBpZiAobGRmaWxlX3RyeV9vcGVuX2JmZCAoZW50cnktPmZpbGVuYW1lLCBlbnRyeSkpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7Ci0gICAgICAgc2VhcmNoICE9IChzZWFyY2hfZGlyc190eXBlICopTlVMTDsKLSAgICAgICBzZWFyY2ggPSBzZWFyY2gtPm5leHQpIAotICAgIHsKLSAgICAgIGNoYXIgKnN0cmluZzsKLQotICAgICAgaWYgKGVudHJ5LT5keW5hbWljICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBpZiAobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KSkKLQkgICAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkKLQkJCQkgKyBzdHJsZW4gKHNsYXNoKQotCQkJCSArIHN0cmxlbiAobGliKQotCQkJCSArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKQotCQkJCSArIHN0cmxlbiAoYXJjaCkKLQkJCQkgKyBzdHJsZW4gKHN1ZmZpeCkKLQkJCQkgKyAxKTsKLQotICAgICAgaWYgKGVudHJ5LT5pc19hcmNoaXZlKQotCXNwcmludGYgKHN0cmluZywgIiVzJXMlcyVzJXMlcyIsIHNlYXJjaC0+bmFtZSwgc2xhc2gsCi0JCSBsaWIsIGVudHJ5LT5maWxlbmFtZSwgYXJjaCwgc3VmZml4KTsKLSAgICAgIGVsc2UgaWYgKGVudHJ5LT5maWxlbmFtZVswXSA9PSAnLycgfHwgZW50cnktPmZpbGVuYW1lWzBdID09ICcuJwotI2lmIGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX1dJTjMyKQotCSAgICAgICB8fCBlbnRyeS0+ZmlsZW5hbWVbMF0gPT0gJ1xcJyAKLQkgICAgICAgfHwgKGlzYWxwaGEgKGVudHJ5LT5maWxlbmFtZVswXSkgCi0JICAgICAgICAgICAmJiBlbnRyeS0+ZmlsZW5hbWVbMV0gPT0gJzonKQotI2VuZGlmCi0JICApCi0Jc3RyY3B5IChzdHJpbmcsIGVudHJ5LT5maWxlbmFtZSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoc3RyaW5nLCAiJXMlcyVzIiwgc2VhcmNoLT5uYW1lLCBzbGFzaCwgZW50cnktPmZpbGVuYW1lKTsKLQotICAgICAgaWYgKGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotCXsKLQkgIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgZnJlZSAoc3RyaW5nKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBPcGVuIHRoZSBpbnB1dCBmaWxlIHNwZWNpZmllZCBieSBFTlRSWS4gICovCi0KLXZvaWQKLWxkZmlsZV9vcGVuX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgaWYgKGVudHJ5LT50aGVfYmZkICE9IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmICghIGVudHJ5LT5zZWFyY2hfZGlyc19mbGFnKQotICAgIHsKLSAgICAgIGlmIChsZGZpbGVfdHJ5X29wZW5fYmZkIChlbnRyeS0+ZmlsZW5hbWUsIGVudHJ5KSkKLQlyZXR1cm47Ci0gICAgICBpZiAoc3RyY21wIChlbnRyeS0+ZmlsZW5hbWUsIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSkgIT0gMCkKLQllaW5mbyAoXygiJUYlUDogY2Fubm90IG9wZW4gJXMgZm9yICVzOiAlRVxuIiksCi0JICAgICAgIGVudHJ5LT5maWxlbmFtZSwgZW50cnktPmxvY2FsX3N5bV9uYW1lKTsKLSAgICAgIGVsc2UKLQllaW5mbyhfKCIlRiVQOiBjYW5ub3Qgb3BlbiAlczogJUVcbiIpLCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYXJjaF9hcmNoX3R5cGUgKmFyY2g7Ci0KLSAgICAgIC8qIFRyeSB0byBvcGVuIDxmaWxlbmFtZT48c3VmZml4PiBvciBsaWI8ZmlsZW5hbWU+PHN1ZmZpeD4uYSAqLwotICAgICAgZm9yIChhcmNoID0gc2VhcmNoX2FyY2hfaGVhZDsKLQkgICBhcmNoICE9IChzZWFyY2hfYXJjaF90eXBlICopIE5VTEw7Ci0JICAgYXJjaCA9IGFyY2gtPm5leHQpCi0JewotCSAgaWYgKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoIChhcmNoLT5uYW1lLCBlbnRyeSwgImxpYiIsICIuYSIpKQotCSAgICByZXR1cm47Ci0jaWZkZWYgVk1TCi0JICBpZiAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2ggKGFyY2gtPm5hbWUsIGVudHJ5LCAiOmxpYiIsICIuYSIpKQotCSAgICByZXR1cm47Ci0jZW5kaWYKLQl9Ci0gICAgICBlaW5mbyAoXygiJUYlUDogY2Fubm90IGZpbmQgJXNcbiIpLCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpOwotICAgIH0KLX0KLQotLyogVHJ5IHRvIG9wZW4gTkFNRTsgaWYgdGhhdCBmYWlscywgdHJ5IE5BTUUgd2l0aCBFWFRFTiBhcHBlbmRlZCB0byBpdC4gICovCi0KLXN0YXRpYyBGSUxFICoKLXRyeV9vcGVuIChuYW1lLCBleHRlbikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZXh0ZW47Ci17Ci0gIEZJTEUgKnJlc3VsdDsKLSAgY2hhciBidWZmWzEwMDBdOwotCi0gIHJlc3VsdCA9IGZvcGVuIChuYW1lLCAiciIpOwotICBpZiAodHJhY2VfZmlsZV90cmllcykKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0JaW5mb19tc2cgKF8oImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iKSwgbmFtZSk7Ci0gICAgICBlbHNlCi0JaW5mb19tc2cgKF8oIm9wZW5lZCBzY3JpcHQgZmlsZSAlc1xuIiksIG5hbWUpOwotICAgIH0KLQotICBpZiAocmVzdWx0ICE9IE5VTEwpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBpZiAoKmV4dGVuKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZmYsICIlcyVzIiwgbmFtZSwgZXh0ZW4pOwotICAgICAgcmVzdWx0ID0gZm9wZW4gKGJ1ZmYsICJyIik7Ci0gICAgICBpZiAodHJhY2VfZmlsZV90cmllcykKLQl7Ci0JICBpZiAocmVzdWx0ID09IE5VTEwpCi0JICAgIGluZm9fbXNnIChfKCJjYW5ub3QgZmluZCBzY3JpcHQgZmlsZSAlc1xuIiksIGJ1ZmYpOwotCSAgZWxzZQotCSAgICBpbmZvX21zZyAoXygib3BlbmVkIHNjcmlwdCBmaWxlICVzXG4iKSwgYnVmZik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBUcnkgdG8gb3BlbiBOQU1FOyBpZiB0aGF0IGZhaWxzLCBsb29rIGZvciBpdCBpbiBhbnkgZGlyZWN0b3JpZXMKLSAgIHNwZWNpZmllZCB3aXRoIC1MLCB3aXRob3V0IGFuZCB3aXRoIEVYVEVORCBhcHBwZW5kZWQuICAqLwotCi1GSUxFICoKLWxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZSAobmFtZSwgZXh0ZW5kKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpleHRlbmQ7Ci17Ci0gIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgRklMRSAqcmVzdWx0OwotICBjaGFyIGJ1ZmZlclsxMDAwXTsKLQotICAvKiBGaXJzdCB0cnkgcmF3IG5hbWUgKi8KLSAgcmVzdWx0ID0gdHJ5X29wZW4obmFtZSwiIik7Ci0gIGlmIChyZXN1bHQgPT0gKEZJTEUgKilOVUxMKSB7Ci0gICAgLyogVHJ5IG5vdyBwcmVmaXhlcyAqLwotICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7Ci0JIHNlYXJjaCAhPSAoc2VhcmNoX2RpcnNfdHlwZSAqKU5VTEw7Ci0JIHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkgewotICAgICAgc3ByaW50ZihidWZmZXIsIiVzJXMlcyIsIHNlYXJjaC0+bmFtZSwgc2xhc2gsIG5hbWUpOwotICAgICAgcmVzdWx0ID0gdHJ5X29wZW4oYnVmZmVyLCBleHRlbmQpOwotICAgICAgaWYgKHJlc3VsdClicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZAotbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBGSUxFICpsZGxleF9pbnB1dF9zdGFjazsKLSAgbGRsZXhfaW5wdXRfc3RhY2sgPSBsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUobmFtZSwgIiIpOwotCi0gIGlmIChsZGxleF9pbnB1dF9zdGFjayA9PSAoRklMRSAqKU5VTEwpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgIGVpbmZvKF8oIiVQJUY6IGNhbm5vdCBvcGVuIGxpbmtlciBzY3JpcHQgZmlsZSAlczogJUVcbiIpLG5hbWUpOwotICB9Ci0gIGxleF9wdXNoX2ZpbGUobGRsZXhfaW5wdXRfc3RhY2ssIG5hbWUpOwotICAKLSAgbGRmaWxlX2lucHV0X2ZpbGVuYW1lID0gbmFtZTsKLSAgbGluZW5vID0gMTsKLSAgaGFkX3NjcmlwdCA9IHRydWU7Ci19Ci0KLQotCi0KLQotI2lmZGVmIEdOVTk2MAotc3RhdGljCi1jaGFyICoKLWdudTk2MF9tYXBfYXJjaG5hbWUoIG5hbWUgKQotY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHRhYmVudHJ5IHsgY2hhciAqY21kX3N3aXRjaDsgY2hhciAqYXJjaDsgfTsKLSAgc3RhdGljIHN0cnVjdCB0YWJlbnRyeSBhcmNoX3RhYltdID0gewotCSIiLCAgICIiLAotCSJLQSIsICJrYSIsCi0JIktCIiwgImtiIiwKLQkiS0MiLCAibWMiLAkvKiBTeW5vbnltIGZvciBNQyAqLwotCSJNQyIsICJtYyIsCi0JIkNBIiwgImNhIiwKLQkiU0EiLCAia2EiLAkvKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBLQSAqLwotCSJTQiIsICJrYiIsCS8qIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEtCICovCi0JTlVMTCwgIiIKLSAgfTsKLSAgc3RydWN0IHRhYmVudHJ5ICp0cDsKLSAgCi0KLSAgZm9yICggdHAgPSBhcmNoX3RhYjsgdHAtPmNtZF9zd2l0Y2ggIT0gTlVMTDsgdHArKyApewotICAgIGlmICggIXN0cmNtcChuYW1lLHRwLT5jbWRfc3dpdGNoKSApewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCB0cC0+Y21kX3N3aXRjaCA9PSBOVUxMICl7Ci0gICAgZWluZm8oXygiJVAlRjogdW5rbm93biBhcmNoaXRlY3R1cmU6ICVzXG4iKSxuYW1lKTsKLSAgfQotICByZXR1cm4gdHAtPmFyY2g7Ci19Ci0KLQotCi12b2lkCi1sZGZpbGVfYWRkX2FyY2gobmFtZSkKLWNoYXIgKm5hbWU7Ci17Ci0gIHNlYXJjaF9hcmNoX3R5cGUgKm5ldyA9Ci0gICAgKHNlYXJjaF9hcmNoX3R5cGUgKil4bWFsbG9jKChiZmRfc2l6ZV90eXBlKShzaXplb2Yoc2VhcmNoX2FyY2hfdHlwZSkpKTsKLQotCi0gIGlmICgqbmFtZSAhPSAnXDAnKSB7Ci0gICAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lWzBdICE9ICdcMCcpIHsKLSAgICAgIGVpbmZvKF8oIiVQJUY6IHRhcmdldCBhcmNoaXRlY3R1cmUgcmVzcGVjaWZpZWRcbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgPSBuYW1lOwotICB9Ci0KLSAgbmV3LT5uZXh0ID0gKHNlYXJjaF9hcmNoX3R5cGUqKU5VTEw7Ci0gIG5ldy0+bmFtZSA9IGdudTk2MF9tYXBfYXJjaG5hbWUoIG5hbWUgKTsKLSAgKnNlYXJjaF9hcmNoX3RhaWxfcHRyID0gbmV3OwotICBzZWFyY2hfYXJjaF90YWlsX3B0ciA9ICZuZXctPm5leHQ7Ci0KLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi0KLXZvaWQKLWxkZmlsZV9hZGRfYXJjaCAoaW5fbmFtZSkKLSAgICAgQ09OU1QgY2hhciAqIGluX25hbWU7Ci17Ci0gIGNoYXIgKm5hbWUgPSBidXlzdHJpbmcoaW5fbmFtZSk7Ci0gIHNlYXJjaF9hcmNoX3R5cGUgKm5ldyA9Ci0gICAgKHNlYXJjaF9hcmNoX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzZWFyY2hfYXJjaF90eXBlKSk7Ci0KLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgPSBpbl9uYW1lOwotCi0gIG5ldy0+bmFtZSA9IG5hbWU7Ci0gIG5ldy0+bmV4dCA9IChzZWFyY2hfYXJjaF90eXBlKilOVUxMOwotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqbmFtZSkpCi0JKm5hbWUgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKm5hbWUpOwotICAgICAgbmFtZSsrOwotICAgIH0KLSAgKnNlYXJjaF9hcmNoX3RhaWxfcHRyID0gbmV3OwotICBzZWFyY2hfYXJjaF90YWlsX3B0ciA9ICZuZXctPm5leHQ7Ci0KLX0KLSNlbmRpZgotCi0vKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgKi8KLXZvaWQKLWxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKHN0cmluZykKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoKHN0cmluZyk7Ci0KLSAgaWYgKGFyY2gpIHsKLSAgICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGFyY2gtPmFyY2g7Ci0gICAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYXJjaC0+bWFjaDsKLSAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9IGFyY2gtPnByaW50YWJsZV9uYW1lOwotICB9Ci0gIGVsc2UgewotICAgIGVpbmZvKF8oIiVQJUY6IGNhbm5vdCByZXByZXNlbnQgbWFjaGluZSBgJXMnXG4iKSwgc3RyaW5nKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvbGRmaWxlLmggYi9sZC9sZGZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzYzljZS4uMDAwMDAwMAotLS0gYS9sZC9sZGZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIGxkZmlsZS5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpsZGZpbGVfaW5wdXRfZmlsZW5hbWU7Ci1leHRlcm4gYm9vbGVhbiBsZGZpbGVfYXNzdW1lZF9zY3JpcHQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBsZGZpbGVfb3V0cHV0X21hY2hpbmU7Ci1leHRlcm4gZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IKLSAgIGxpYnJhcmllcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNlYXJjaF9kaXJzIAotewotICAvKiBOZXh0IGRpcmVjdG9yeSBvbiBsaXN0LiAgKi8KLSAgc3RydWN0IHNlYXJjaF9kaXJzICpuZXh0OwotICAvKiBOYW1lIG9mIGRpcmVjdG9yeS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIHRydWUgaWYgdGhpcyBpcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICBib29sZWFuIGNtZGxpbmU7Ci19IHNlYXJjaF9kaXJzX3R5cGU7Ci0KLWV4dGVybiBzZWFyY2hfZGlyc190eXBlICpzZWFyY2hfaGVhZDsKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdDsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBsZGZpbGVfYWRkX2FyY2ggUEFSQU1TICgoQ09OU1QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4gY21kbGluZSkpOwotZXh0ZXJuIHZvaWQgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIGxkZmlsZV9vcGVuX2ZpbGUgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBsZGZpbGVfdHJ5X29wZW5fYmZkCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci1leHRlcm4gRklMRSAqbGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmV4dGVuZCkpOwotZXh0ZXJuIHZvaWQgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKZGlmZiAtLWdpdCBhL2xkL2xkZ3JhbS55IGIvbGQvbGRncmFtLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmI5ZmIuLjAwMDAwMDAKLS0tIGEvbGQvbGRncmFtLnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAzICswLDAgQEAKLS8qIEEgWUFDQyBncmFtbWVyIHRvIHBhcnNlIGEgc3VwZXJzZXQgb2YgdGhlIEFUJlQgbGlua2VyIHNjcmlwdGluZyBsYW5ndWF1ZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCAoc3RldmVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBsZC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotJXsKLS8qCi0KLSAqLwotCi0jZGVmaW5lIERPTlRERUNMQVJFX01BTExPQwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxkLmgiICAgIAotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGR2ZXIuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJtcmkuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotCi0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUgWVlERUJVRyAxCi0jZW5kaWYKLQotc3RhdGljIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGU7Ci0KLWxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpyZWdpb247Ci0KLXN0cnVjdCB3aWxkY2FyZF9zcGVjIGN1cnJlbnRfZmlsZTsKLWJvb2xlYW4gbGRncmFtX3dhbnRfZmlsZW5hbWUgPSB0cnVlOwotYm9vbGVhbiBoYWRfc2NyaXB0ID0gZmFsc2U7Ci1ib29sZWFuIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotCi1ib29sZWFuIGxkZ3JhbV9pbl9zY3JpcHQgPSBmYWxzZTsKLWJvb2xlYW4gbGRncmFtX2hhZF9lcXVhbHMgPSBmYWxzZTsKLWJvb2xlYW4gbGRncmFtX2hhZF9rZWVwID0gZmFsc2U7Ci1jaGFyICpsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcgPSBOVUxMOwotCi0jZGVmaW5lIEVSUk9SX05BTUVfTUFYIDIwCi1zdGF0aWMgY2hhciAqZXJyb3JfbmFtZXNbRVJST1JfTkFNRV9NQVhdOwotc3RhdGljIGludCBlcnJvcl9pbmRleDsKLSNkZWZpbmUgUFVTSF9FUlJPUih4KSBpZiAoZXJyb3JfaW5kZXggPCBFUlJPUl9OQU1FX01BWCkgZXJyb3JfbmFtZXNbZXJyb3JfaW5kZXhdID0geDsgZXJyb3JfaW5kZXgrKzsKLSNkZWZpbmUgUE9QX0VSUk9SKCkgICBlcnJvcl9pbmRleC0tOwotJX0KLSV1bmlvbiB7Ci0gIGJmZF92bWEgaW50ZWdlcjsKLSAgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqY25hbWU7Ci0gIHN0cnVjdCB3aWxkY2FyZF9zcGVjIHdpbGRjYXJkOwotICBpbnQgdG9rZW47Ci0gIHVuaW9uIGV0cmVlX3VuaW9uICpldHJlZTsKLSAgc3RydWN0IHBoZHJfaW5mbwotICAgIHsKLSAgICAgIGJvb2xlYW4gZmlsZWhkcjsKLSAgICAgIGJvb2xlYW4gcGhkcnM7Ci0gICAgICB1bmlvbiBldHJlZV91bmlvbiAqYXQ7Ci0gICAgICB1bmlvbiBldHJlZV91bmlvbiAqZmxhZ3M7Ci0gICAgfSBwaGRyOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpub2Nyb3NzcmVmOwotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnNlY3Rpb25fcGhkcjsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZWZsaXN0OwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKnZlcnN5bXM7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyc25vZGU7Ci19Ci0KLSV0eXBlIDxldHJlZT4gZXhwIG9wdF9leHBfd2l0aF90eXBlIG11c3RiZV9leHAgb3B0X2F0IHBoZHJfdHlwZSBwaGRyX3ZhbAotJXR5cGUgPGV0cmVlPiBvcHRfZXhwX3dpdGhvdXRfdHlwZQotJXR5cGUgPGludGVnZXI+IGZpbGxfb3B0Ci0ldHlwZSA8bmFtZT4gbWVtc3BlY19vcHQgY2FzZXN5bWxpc3QKLSV0eXBlIDxjbmFtZT4gd2lsZGNhcmRfbmFtZQotJXR5cGUgPHdpbGRjYXJkPiB3aWxkY2FyZF9zcGVjCi0ldG9rZW4gPGludGVnZXI+IElOVCAgCi0ldG9rZW4gPG5hbWU+IE5BTUUgTE5BTUUKLSV0eXBlIDxpbnRlZ2VyPiBsZW5ndGgKLSV0eXBlIDxwaGRyPiBwaGRyX3F1YWxpZmllcnMKLSV0eXBlIDxub2Nyb3NzcmVmPiBub2Nyb3NzcmVmX2xpc3QKLSV0eXBlIDxzZWN0aW9uX3BoZHI+IHBoZHJfb3B0Ci0ldHlwZSA8aW50ZWdlcj4gb3B0X25vY3Jvc3NyZWZzCi0KLSVyaWdodCA8dG9rZW4+IFBMVVNFUSBNSU5VU0VRIE1VTFRFUSBESVZFUSAgJz0nIExTSElGVEVRIFJTSElGVEVRICAgQU5ERVEgT1JFUSAKLSVyaWdodCA8dG9rZW4+ICc/JyAnOicKLSVsZWZ0IDx0b2tlbj4gT1JPUgotJWxlZnQgPHRva2VuPiAgQU5EQU5ECi0lbGVmdCA8dG9rZW4+ICd8JwotJWxlZnQgPHRva2VuPiAgJ14nCi0lbGVmdCAgPHRva2VuPiAnJicKLSVsZWZ0IDx0b2tlbj4gIEVRIE5FCi0lbGVmdCAgPHRva2VuPiAnPCcgJz4nIExFIEdFCi0lbGVmdCAgPHRva2VuPiBMU0hJRlQgUlNISUZUCi0KLSVsZWZ0ICA8dG9rZW4+ICcrJyAnLScKLSVsZWZ0ICA8dG9rZW4+ICcqJyAnLycgJyUnCi0KLSVyaWdodCBVTkFSWQotJXRva2VuIEVORCAKLSVsZWZ0IDx0b2tlbj4gJygnCi0ldG9rZW4gPHRva2VuPiBBTElHTl9LIEJMT0NLIEJJTkQgUVVBRCBTUVVBRCBMT05HIFNIT1JUIEJZVEUKLSV0b2tlbiBTRUNUSU9OUyBQSERSUyBTT1JUCi0ldG9rZW4gJ3snICd9JwotJXRva2VuIFNJWkVPRl9IRUFERVJTIE9VVFBVVF9GT1JNQVQgRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04gT1VUUFVUX0FSQ0gKLSV0b2tlbiBTSVpFT0ZfSEVBREVSUwotJXRva2VuIElOQ0xVREUKLSV0b2tlbiBNRU1PUlkgREVGU1lNRU5ECi0ldG9rZW4gTk9MT0FEIERTRUNUIENPUFkgSU5GTyBPVkVSTEFZCi0ldG9rZW4gTkFNRSBMTkFNRSBERUZJTkVEIFRBUkdFVF9LIFNFQVJDSF9ESVIgTUFQIEVOVFJZCi0ldG9rZW4gPGludGVnZXI+IE5FWFQKLSV0b2tlbiBTSVpFT0YgQUREUiBMT0FEQUREUiBNQVhfSyBNSU5fSwotJXRva2VuIFNUQVJUVVAgSExMIFNZU0xJQiBGTE9BVCBOT0ZMT0FUIE5PQ1JPU1NSRUZTCi0ldG9rZW4gT1JJR0lOIEZJTEwKLSV0b2tlbiBMRU5HVEggQ1JFQVRFX09CSkVDVF9TWU1CT0xTIElOUFVUIEdST1VQIE9VVFBVVCBDT05TVFJVQ1RPUlMKLSV0b2tlbiBBTElHTk1PRCBBVCBQUk9WSURFCi0ldHlwZSA8dG9rZW4+IGFzc2lnbl9vcCBhdHlwZSBhdHRyaWJ1dGVzX29wdAotJXR5cGUgPG5hbWU+ICBmaWxlbmFtZQotJXRva2VuIENISVAgTElTVCBTRUNUIEFCU09MVVRFICBMT0FEIE5FV0xJTkUgRU5EV09SRCBPUkRFUiBOQU1FV09SRCBBU1NFUlRfSwotJXRva2VuIEZPUk1BVCBQVUJMSUMgREVGU1lNRU5EIEJBU0UgQUxJQVMgVFJVTkNBVEUgUkVMCi0ldG9rZW4gSU5QVVRfU0NSSVBUIElOUFVUX01SSV9TQ1JJUFQgSU5QVVRfREVGU1lNIENBU0UgRVhURVJOIFNUQVJUCi0ldG9rZW4gPG5hbWU+IFZFUlNfVEFHIFZFUlNfSURFTlRJRklFUgotJXRva2VuIEdMT0JBTCBMT0NBTCBWRVJTSU9OSyBJTlBVVF9WRVJTSU9OX1NDUklQVAotJXRva2VuIEtFRVAKLSV0b2tlbiBFWENMVURFX0ZJTEUKLSV0eXBlIDx2ZXJzeW1zPiB2ZXJzX2RlZm5zCi0ldHlwZSA8dmVyc25vZGU+IHZlcnNfdGFnCi0ldHlwZSA8ZGVmbGlzdD4gdmVyZGVwCi0KLSUlCi0KLWZpbGU6CQotCQlJTlBVVF9TQ1JJUFQgc2NyaXB0X2ZpbGUKLQl8CUlOUFVUX01SSV9TQ1JJUFQgbXJpX3NjcmlwdF9maWxlCi0JfAlJTlBVVF9WRVJTSU9OX1NDUklQVCB2ZXJzaW9uX3NjcmlwdF9maWxlCi0JfAlJTlBVVF9ERUZTWU0gZGVmc3ltX2V4cHIKLQk7Ci0KLQotZmlsZW5hbWU6ICBOQU1FOwotCi0KLWRlZnN5bV9leHByOgotCQl7IGxkbGV4X2RlZnN5bSgpOyB9Ci0JCU5BTUUgJz0nIGV4cAotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUoKTsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50KGV4cF9hc3NvcCgkMywkMiwkNCkpOwotCQl9Ci0KLS8qIFNZTlRBWCBXSVRISU4gQU4gTVJJIFNDUklQVCBGSUxFICovICAKLW1yaV9zY3JpcHRfZmlsZToKLQkJewotCQkgIGxkbGV4X21yaV9zY3JpcHQgKCk7Ci0JCSAgUFVTSF9FUlJPUiAoXygiTVJJIHN0eWxlIHNjcmlwdCIpKTsKLQkJfQotCSAgICAgbXJpX3NjcmlwdF9saW5lcwotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCSAgbXJpX2RyYXdfdHJlZSAoKTsKLQkJICBQT1BfRVJST1IgKCk7Ci0JCX0KLQk7Ci0KLW1yaV9zY3JpcHRfbGluZXM6Ci0JCW1yaV9zY3JpcHRfbGluZXMgbXJpX3NjcmlwdF9jb21tYW5kIE5FV0xJTkUKLSAgICAgICAgICB8Ci0JOwotCi1tcmlfc2NyaXB0X2NvbW1hbmQ6Ci0JCUNISVAgIGV4cCAKLQl8CUNISVAgIGV4cCAnLCcgZXhwCi0JfAlOQU1FIAl7Ci0JCQllaW5mbyhfKCIlUCVGOiB1bnJlY29nbmlzZWQga2V5d29yZCBpbiBNUkkgc3R5bGUgc2NyaXB0ICclcydcbiIpLCQxKTsKLQkJCX0KLQl8CUxJU1QgIAl7Ci0JCQljb25maWcubWFwX2ZpbGVuYW1lID0gIi0iOwotCQkJfQotICAgICAgICB8ICAgICAgIE9SREVSIG9yZGVybmFtZWxpc3QKLQl8ICAgICAgIEVORFdPUkQgCi0gICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgJz0nIGV4cAotIAkJCXsgbXJpX3B1YmxpYygkMiwgJDQpOyB9Ci0gICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgJywnIGV4cAotIAkJCXsgbXJpX3B1YmxpYygkMiwgJDQpOyB9Ci0gICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgIGV4cCAKLSAJCQl7IG1yaV9wdWJsaWMoJDIsICQzKTsgfQotCXwgCUZPUk1BVCBOQU1FCi0JCQl7IG1yaV9mb3JtYXQoJDIpOyB9Ci0JfAlTRUNUIE5BTUUgJywnIGV4cAotCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQ0KTt9Ci0JfAlTRUNUIE5BTUUgIGV4cAotCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQzKTt9Ci0JfAlTRUNUIE5BTUUgJz0nIGV4cAotCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQ0KTt9Ci0JfAlBTElHTl9LIE5BTUUgJz0nIGV4cAotCQkJeyBtcmlfYWxpZ24oJDIsJDQpOyB9Ci0JfAlBTElHTl9LIE5BTUUgJywnIGV4cAotCQkJeyBtcmlfYWxpZ24oJDIsJDQpOyB9Ci0JfAlBTElHTk1PRCBOQU1FICc9JyBleHAKLQkJCXsgbXJpX2FsaWdubW9kKCQyLCQ0KTsgfQotCXwJQUxJR05NT0QgTkFNRSAnLCcgZXhwCi0JCQl7IG1yaV9hbGlnbm1vZCgkMiwkNCk7IH0KLQl8CUFCU09MVVRFIG1yaV9hYnNfbmFtZV9saXN0Ci0JfAlMT0FECSBtcmlfbG9hZF9uYW1lX2xpc3QKLQl8ICAgICAgIE5BTUVXT1JEIE5BTUUgCi0JCQl7IG1yaV9uYW1lKCQyKTsgfSAgIAotCXwJQUxJQVMgTkFNRSAnLCcgTkFNRQotCQkJeyBtcmlfYWxpYXMoJDIsJDQsMCk7fQotCXwJQUxJQVMgTkFNRSAnLCcgSU5UCi0JCQl7IG1yaV9hbGlhcygkMiwwLChpbnQpICQ0KTt9Ci0JfAlCQVNFICAgICBleHAKLQkJCXsgbXJpX2Jhc2UoJDIpOyB9Ci0gICAgICAgIHwgICAgICAgVFJVTkNBVEUgSU5UCi0JCXsgIG1yaV90cnVuY2F0ZSgodW5zaWduZWQgaW50KSAkMik7IH0KLQl8CUNBU0UgY2FzZXN5bWxpc3QKLQl8CUVYVEVSTiBleHRlcm5fbmFtZV9saXN0Ci0JfAlJTkNMVURFIGZpbGVuYW1lCi0JCXsgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlICgkMik7IH0gbXJpX3NjcmlwdF9saW5lcyBFTkQKLQl8CVNUQVJUIE5BTUUKLQkJeyBsYW5nX2FkZF9lbnRyeSAoJDIsIGZhbHNlKTsgfQotICAgICAgICB8Ci0JOwotCi1vcmRlcm5hbWVsaXN0OgotCSAgICAgIG9yZGVybmFtZWxpc3QgJywnIE5BTUUgICAgICAgICB7IG1yaV9vcmRlcigkMyk7IH0KLQl8ICAgICBvcmRlcm5hbWVsaXN0ICBOQU1FICAgICAgICAgeyBtcmlfb3JkZXIoJDIpOyB9Ci0gICAgICAJfAotCTsKLQotbXJpX2xvYWRfbmFtZV9saXN0OgotCQlOQU1FCi0JCQl7IG1yaV9sb2FkKCQxKTsgfQotCXwJbXJpX2xvYWRfbmFtZV9saXN0ICcsJyBOQU1FIHsgbXJpX2xvYWQoJDMpOyB9Ci0JOwotCi1tcmlfYWJzX25hbWVfbGlzdDoKLSAJCU5BTUUKLSAJCQl7IG1yaV9vbmx5X2xvYWQoJDEpOyB9Ci0JfAltcmlfYWJzX25hbWVfbGlzdCAnLCcgIE5BTUUKLSAJCQl7IG1yaV9vbmx5X2xvYWQoJDMpOyB9Ci0JOwotCi1jYXNlc3ltbGlzdDoKLQkgIC8qIGVtcHR5ICovIHsgJCQgPSBOVUxMOyB9Ci0JfCBOQU1FCi0JfCBjYXNlc3ltbGlzdCAnLCcgTkFNRQotCTsKLQotZXh0ZXJuX25hbWVfbGlzdDoKLQkgIE5BTUUKLQkJCXsgbGRsYW5nX2FkZF91bmRlZiAoJDEpOyB9Ci0JfCBleHRlcm5fbmFtZV9saXN0IE5BTUUKLQkJCXsgbGRsYW5nX2FkZF91bmRlZiAoJDIpOyB9Ci0JfCBleHRlcm5fbmFtZV9saXN0ICcsJyBOQU1FCi0JCQl7IGxkbGFuZ19hZGRfdW5kZWYgKCQzKTsgfQotCTsKLQotc2NyaXB0X2ZpbGU6Ci0JewotCSBsZGxleF9ib3RoKCk7Ci0JfQotICAgICAgIGlmaWxlX2xpc3QKLQl7Ci0JbGRsZXhfcG9wc3RhdGUoKTsKLQl9Ci0gICAgICAgIDsKLQotCi1pZmlsZV9saXN0OgotICAgICAgIGlmaWxlX2xpc3QgaWZpbGVfcDEKLSAgICAgICAgfAotCTsKLQotCi0KLWlmaWxlX3AxOgotCQltZW1vcnkKLQl8CXNlY3Rpb25zCi0JfAlwaGRycwotCXwJc3RhcnR1cAotCXwJaGlnaF9sZXZlbF9saWJyYXJ5Ci0JfAlsb3dfbGV2ZWxfbGlicmFyeQotCXwJZmxvYXRpbmdfcG9pbnRfc3VwcG9ydAotCXwJc3RhdGVtZW50X2FueXdoZXJlCi0JfAl2ZXJzaW9uCi0gICAgICAgIHwJICc7JwotCXwJVEFSR0VUX0sgJygnIE5BTUUgJyknCi0JCXsgbGFuZ19hZGRfdGFyZ2V0KCQzKTsgfQotCXwJU0VBUkNIX0RJUiAnKCcgZmlsZW5hbWUgJyknCi0JCXsgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKCQzLCBmYWxzZSk7IH0KLQl8CU9VVFBVVCAnKCcgZmlsZW5hbWUgJyknCi0JCXsgbGFuZ19hZGRfb3V0cHV0KCQzLCAxKTsgfQotICAgICAgICB8CU9VVFBVVF9GT1JNQVQgJygnIE5BTUUgJyknCi0JCSAgeyBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0ICgkMywgKGNoYXIgKikgTlVMTCwKLQkJCQkJICAgIChjaGFyICopIE5VTEwsIDEpOyB9Ci0JfAlPVVRQVVRfRk9STUFUICcoJyBOQU1FICcsJyBOQU1FICcsJyBOQU1FICcpJwotCQkgIHsgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCAoJDMsICQ1LCAkNywgMSk7IH0KLSAgICAgICAgfAlPVVRQVVRfQVJDSCAnKCcgTkFNRSAnKScKLQkJICB7IGxkZmlsZV9zZXRfb3V0cHV0X2FyY2goJDMpOyB9Ci0JfAlGT1JDRV9DT01NT05fQUxMT0NBVElPTgotCQl7IGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IHRydWUgOyB9Ci0JfAlJTlBVVCAnKCcgaW5wdXRfbGlzdCAnKScKLQl8CUdST1VQCi0JCSAgeyBsYW5nX2VudGVyX2dyb3VwICgpOyB9Ci0JCSAgICAnKCcgaW5wdXRfbGlzdCAnKScKLQkJICB7IGxhbmdfbGVhdmVfZ3JvdXAgKCk7IH0KLSAgICAgCXwJTUFQICcoJyBmaWxlbmFtZSAnKScKLQkJeyBsYW5nX2FkZF9tYXAoJDMpOyB9Ci0JfAlJTkNMVURFIGZpbGVuYW1lIAotCQl7IGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSgkMik7IH0gaWZpbGVfbGlzdCBFTkQKLQl8CU5PQ1JPU1NSRUZTICcoJyBub2Nyb3NzcmVmX2xpc3QgJyknCi0JCXsKLQkJICBsYW5nX2FkZF9ub2Nyb3NzcmVmICgkMyk7Ci0JCX0KLQl8CUVYVEVSTiAnKCcgZXh0ZXJuX25hbWVfbGlzdCAnKScKLQk7Ci0KLWlucHV0X2xpc3Q6Ci0JCU5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQxLGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlpbnB1dF9saXN0ICcsJyBOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMyxsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCXwJaW5wdXRfbGlzdCBOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMixsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCXwJTE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQxLGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQl8CWlucHV0X2xpc3QgJywnIExOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMyxsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlpbnB1dF9saXN0IExOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMixsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JOwotCi1zZWN0aW9uczoKLQkJU0VDVElPTlMgJ3snIHNlY19vcl9ncm91cF9wMSAnfScKLQk7Ci0KLXNlY19vcl9ncm91cF9wMToKLQkJc2VjX29yX2dyb3VwX3AxIHNlY3Rpb24KLQl8CXNlY19vcl9ncm91cF9wMSBzdGF0ZW1lbnRfYW55d2hlcmUKLQl8Ci0JOwotCi1zdGF0ZW1lbnRfYW55d2hlcmU6Ci0JCUVOVFJZICcoJyBOQU1FICcpJwotCQl7IGxhbmdfYWRkX2VudHJ5ICgkMywgZmFsc2UpOyB9Ci0JfAlhc3NpZ25tZW50IGVuZAotCTsKLQotLyogVGhlICcqJyBhbmQgJz8nIGNhc2VzIGFyZSB0aGVyZSBiZWNhdXNlIHRoZSBsZXhlciByZXR1cm5zIHRoZW0gYXMKLSAgIHNlcGFyYXRlIHRva2VucyByYXRoZXIgdGhhbiBhcyBOQU1FLiAgKi8KLXdpbGRjYXJkX25hbWU6Ci0JCU5BTUUKLQkJCXsKLQkJCSAgJCQgPSAkMTsKLQkJCX0KLQl8CScqJwotCQkJewotCQkJICAkJCA9ICIqIjsKLQkJCX0KLQl8CSc/JwotCQkJewotCQkJICAkJCA9ICI/IjsKLQkJCX0KLQk7Ci0KLXdpbGRjYXJkX3NwZWM6Ci0JCXdpbGRjYXJkX25hbWUKLQkJCXsKLQkJCSAgJCQubmFtZSA9ICQxOwotCQkJICAkJC5zb3J0ZWQgPSBmYWxzZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lID0gTlVMTDsKLQkJCX0KLQl8IAlFWENMVURFX0ZJTEUgJygnIHdpbGRjYXJkX25hbWUgJyknIHdpbGRjYXJkX25hbWUKLQkJCXsKLQkJCSAgJCQubmFtZSA9ICQ1OwotCQkJICAkJC5zb3J0ZWQgPSBmYWxzZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lID0gJDM7Ci0JCQl9Ci0JfAlTT1JUICcoJyB3aWxkY2FyZF9uYW1lICcpJwotCQkJewotCQkJICAkJC5uYW1lID0gJDM7Ci0JCQkgICQkLnNvcnRlZCA9IHRydWU7Ci0JCQkgICQkLmV4Y2x1ZGVfbmFtZSA9IE5VTEw7Ci0JCQl9Ci0JfAlTT1JUICcoJyBFWENMVURFX0ZJTEUgJygnIHdpbGRjYXJkX25hbWUgJyknIHdpbGRjYXJkX25hbWUgJyknCi0JCQl7Ci0JCQkgICQkLm5hbWUgPSAkNzsKLQkJCSAgJCQuc29ydGVkID0gdHJ1ZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lID0gJDU7Ci0JCQl9Ci0JOwotCi0KLWZpbGVfTkFNRV9saXN0OgotCQl3aWxkY2FyZF9zcGVjCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX3dpbGQgKCQxLm5hbWUsICQxLnNvcnRlZCwKLQkJCQkJIGN1cnJlbnRfZmlsZS5uYW1lLAotCQkJCQkgY3VycmVudF9maWxlLnNvcnRlZCwKLQkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgJDEuZXhjbHVkZV9uYW1lKTsKLQkJCX0KLQl8CWZpbGVfTkFNRV9saXN0IG9wdF9jb21tYSB3aWxkY2FyZF9zcGVjCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX3dpbGQgKCQzLm5hbWUsICQzLnNvcnRlZCwKLQkJCQkJIGN1cnJlbnRfZmlsZS5uYW1lLAotCQkJCQkgY3VycmVudF9maWxlLnNvcnRlZCwKLQkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgJDMuZXhjbHVkZV9uYW1lKTsKLQkJCX0KLQk7Ci0KLWlucHV0X3NlY3Rpb25fc3BlY19ub19rZWVwOgotCQlOQU1FCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX3dpbGQgKE5VTEwsIGZhbHNlLCAkMSwgZmFsc2UsCi0JCQkJCSBsZGdyYW1faGFkX2tlZXAsIE5VTEwpOwotCQkJfQotICAgICAgICB8CSdbJwotCQkJewotCQkJICBjdXJyZW50X2ZpbGUubmFtZSA9IE5VTEw7Ci0JCQkgIGN1cnJlbnRfZmlsZS5zb3J0ZWQgPSBmYWxzZTsKLQkJCX0KLQkJZmlsZV9OQU1FX2xpc3QgJ10nCi0JfAl3aWxkY2FyZF9zcGVjCi0JCQl7Ci0JCQkgIGN1cnJlbnRfZmlsZSA9ICQxOwotCQkJICAvKiAnKicgbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgKi8KLQkJCSAgaWYgKHN0cmNtcCAoY3VycmVudF9maWxlLm5hbWUsICIqIikgPT0gMCkKLQkJCSAgICBjdXJyZW50X2ZpbGUubmFtZSA9IE5VTEw7Ci0JCQl9Ci0JCScoJyBmaWxlX05BTUVfbGlzdCAnKScKLQk7Ci0KLWlucHV0X3NlY3Rpb25fc3BlYzoKLQkJaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXAKLQl8CUtFRVAgJygnCi0JCQl7IGxkZ3JhbV9oYWRfa2VlcCA9IHRydWU7IH0KLQkJaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXAgJyknCi0JCQl7IGxkZ3JhbV9oYWRfa2VlcCA9IGZhbHNlOyB9Ci0JOwotCi1zdGF0ZW1lbnQ6Ci0JICAJYXNzaWdubWVudCBlbmQKLQl8CUNSRUFURV9PQkpFQ1RfU1lNQk9MUwotCQl7Ci0gCQlsYW5nX2FkZF9hdHRyaWJ1dGUobGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bSk7IAotCSAgICAgIAl9Ci0gICAgICAgIHwJJzsnCi0gICAgICAgIHwJQ09OU1RSVUNUT1JTCi0JCXsKLSAJCQotCQkgIGxhbmdfYWRkX2F0dHJpYnV0ZShsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bSk7IAotCQl9Ci0JfCBTT1JUICcoJyBDT05TVFJVQ1RPUlMgJyknCi0JCXsKLQkJICBjb25zdHJ1Y3RvcnNfc29ydGVkID0gdHJ1ZTsKLQkJICBsYW5nX2FkZF9hdHRyaWJ1dGUgKGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtKTsKLQkJfQotCXwgaW5wdXRfc2VjdGlvbl9zcGVjCi0gICAgICAgIHwgbGVuZ3RoICcoJyBtdXN0YmVfZXhwICcpJwotICAgICAgICAJICAgICAgICB7Ci0JCQlsYW5nX2FkZF9kYXRhKChpbnQpICQxLCQzKTsKLQkJCX0KLSAgCi0JfCBGSUxMICcoJyBtdXN0YmVfZXhwICcpJwotCQkJewotCQkJICBsYW5nX2FkZF9maWxsCi0JCQkgICAgKGV4cF9nZXRfdmFsdWVfaW50KCQzLAotCQkJCQkgICAgICAgMCwKLQkJCQkJICAgICAgICJmaWxsIHZhbHVlIiwKLQkJCQkJICAgICAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSkpOwotCQkJfQotCTsKLQotc3RhdGVtZW50X2xpc3Q6Ci0JCXN0YXRlbWVudF9saXN0IHN0YXRlbWVudAotICAJfCAgCXN0YXRlbWVudAotCTsKLSAgCi1zdGF0ZW1lbnRfbGlzdF9vcHQ6Ci0JCS8qIGVtcHR5ICovCi0JfAlzdGF0ZW1lbnRfbGlzdAotCTsKLQotbGVuZ3RoOgotCQlRVUFECi0JCQl7ICQkID0gJDE7IH0KLQl8CVNRVUFECi0JCQl7ICQkID0gJDE7IH0KLQl8CUxPTkcKLQkJCXsgJCQgPSAkMTsgfQotCXwgCVNIT1JUCi0JCQl7ICQkID0gJDE7IH0KLQl8CUJZVEUKLQkJCXsgJCQgPSAkMTsgfQotCTsKLQotZmlsbF9vcHQ6Ci0gICAgICAgICAgJz0nIG11c3RiZV9leHAKLQkJewotCQkgICQkID0JIGV4cF9nZXRfdmFsdWVfaW50KCQyLAotCQkJCQkgICAwLAotCQkJCQkgICAiZmlsbCB2YWx1ZSIsCi0JCQkJCSAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0JCX0KLQl8IAl7ICQkID0gMDsgfQotCTsKLQotCQkKLQotYXNzaWduX29wOgotCQlQTFVTRVEKLQkJCXsgJCQgPSAnKyc7IH0KLQl8CU1JTlVTRVEKLQkJCXsgJCQgPSAnLSc7IH0KLQl8IAlNVUxURVEKLQkJCXsgJCQgPSAnKic7IH0KLQl8IAlESVZFUQotCQkJeyAkJCA9ICcvJzsgfQotCXwgCUxTSElGVEVRCi0JCQl7ICQkID0gTFNISUZUOyB9Ci0JfCAJUlNISUZURVEKLQkJCXsgJCQgPSBSU0hJRlQ7IH0KLQl8IAlBTkRFUQotCQkJeyAkJCA9ICcmJzsgfQotCXwgCU9SRVEKLQkJCXsgJCQgPSAnfCc7IH0KLQotCTsKLQotZW5kOgknOycgfCAnLCcKLQk7Ci0KLQotYXNzaWdubWVudDoKLQkJTkFNRSAnPScgbXVzdGJlX2V4cAotCQl7Ci0JCSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgkMiwgJDEsICQzKSk7Ci0JCX0KLQl8CU5BTUUgYXNzaWduX29wIG11c3RiZV9leHAKLQkJewotCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAkMSwKLQkJCQkJCSAgZXhwX2Jpbm9wICgkMiwKLQkJCQkJCQkgICAgIGV4cF9uYW1lb3AgKE5BTUUsCi0JCQkJCQkJCQkgJDEpLAotCQkJCQkJCSAgICAgJDMpKSk7Ci0JCX0KLQl8CVBST1ZJREUgJygnIE5BTUUgJz0nIG11c3RiZV9leHAgJyknCi0JCXsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfcHJvdmlkZSAoJDMsICQ1KSk7Ci0JCX0KLQk7Ci0KLQotb3B0X2NvbW1hOgotCQknLCcJfAk7Ci0KLQotbWVtb3J5OgotCQlNRU1PUlkgJ3snIG1lbW9yeV9zcGVjIG1lbW9yeV9zcGVjX2xpc3QgJ30nCi0JOwotCi1tZW1vcnlfc3BlY19saXN0OgotCQltZW1vcnlfc3BlY19saXN0IG1lbW9yeV9zcGVjCi0JfAltZW1vcnlfc3BlY19saXN0ICcsJyBtZW1vcnlfc3BlYwotCXwKLQk7Ci0KLQotbWVtb3J5X3NwZWM6IAkJTkFNRQotCQkJeyByZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKCQxKTsgfQotCQlhdHRyaWJ1dGVzX29wdCAnOicKLQkJb3JpZ2luX3NwZWMgb3B0X2NvbW1hIGxlbmd0aF9zcGVjCi0KLQk7IG9yaWdpbl9zcGVjOgotCU9SSUdJTiAnPScgbXVzdGJlX2V4cAotCQl7IHJlZ2lvbi0+Y3VycmVudCA9Ci0JCSByZWdpb24tPm9yaWdpbiA9Ci0JCSBleHBfZ2V0X3ZtYSgkMywgMEwsIm9yaWdpbiIsIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci19Ci0JOwotCi1sZW5ndGhfc3BlYzoKLSAgICAgICAgICAgICBMRU5HVEggJz0nIG11c3RiZV9leHAKLSAgICAgICAgICAgICAgIHsgcmVnaW9uLT5sZW5ndGggPSBleHBfZ2V0X3ZtYSgkMywKLQkJCQkJICAgICAgIH4oKGJmZF92bWEpMCksCi0JCQkJCSAgICAgICAibGVuZ3RoIiwKLQkJCQkJICAgICAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0JCX0KLQk7Ci0KLWF0dHJpYnV0ZXNfb3B0OgotCQkvKiBlbXB0eSAqLwotCQkgIHsgLyogZHVtbXkgYWN0aW9uIHRvIGF2b2lkIGJpc29uIDEuMjUgZXJyb3IgbWVzc2FnZSAqLyB9Ci0JfAknKCcgYXR0cmlidXRlc19saXN0ICcpJwotCTsKLQotYXR0cmlidXRlc19saXN0OgotCQlhdHRyaWJ1dGVzX3N0cmluZwotCXwJYXR0cmlidXRlc19saXN0IGF0dHJpYnV0ZXNfc3RyaW5nCi0JOwotCi1hdHRyaWJ1dGVzX3N0cmluZzoKLQkJTkFNRQotCQkgIHsgbGFuZ19zZXRfZmxhZ3MgKHJlZ2lvbiwgJDEsIDApOyB9Ci0JfAknIScgTkFNRQotCQkgIHsgbGFuZ19zZXRfZmxhZ3MgKHJlZ2lvbiwgJDIsIDEpOyB9Ci0JOwotCi1zdGFydHVwOgotCVNUQVJUVVAgJygnIGZpbGVuYW1lICcpJwotCQl7IGxhbmdfc3RhcnR1cCgkMyk7IH0KLQk7Ci0KLWhpZ2hfbGV2ZWxfbGlicmFyeToKLQkJSExMICcoJyBoaWdoX2xldmVsX2xpYnJhcnlfTkFNRV9saXN0ICcpJwotCXwJSExMICcoJyAnKScKLQkJCXsgbGRlbXVsX2hsbCgoY2hhciAqKU5VTEwpOyB9Ci0JOwotCi1oaWdoX2xldmVsX2xpYnJhcnlfTkFNRV9saXN0OgotCQloaWdoX2xldmVsX2xpYnJhcnlfTkFNRV9saXN0IG9wdF9jb21tYSBmaWxlbmFtZQotCQkJeyBsZGVtdWxfaGxsKCQzKTsgfQotCXwJZmlsZW5hbWUKLQkJCXsgbGRlbXVsX2hsbCgkMSk7IH0KLQotCTsKLQotbG93X2xldmVsX2xpYnJhcnk6Ci0JU1lTTElCICcoJyBsb3dfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3QgJyknCi0JOyBsb3dfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Q6Ci0JCWxvd19sZXZlbF9saWJyYXJ5X05BTUVfbGlzdCBvcHRfY29tbWEgZmlsZW5hbWUKLQkJCXsgbGRlbXVsX3N5c2xpYigkMyk7IH0KLQl8Ci0JOwotCi1mbG9hdGluZ19wb2ludF9zdXBwb3J0OgotCQlGTE9BVAotCQkJeyBsYW5nX2Zsb2F0KHRydWUpOyB9Ci0JfAlOT0ZMT0FUCi0JCQl7IGxhbmdfZmxvYXQoZmFsc2UpOyB9Ci0JOwotCQkKLW5vY3Jvc3NyZWZfbGlzdDoKLQkJLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gTlVMTDsKLQkJfQotCXwJTkFNRSBub2Nyb3NzcmVmX2xpc3QKLQkJewotCQkgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm47Ci0KLQkJICBuID0gKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLQkJICBuLT5uYW1lID0gJDE7Ci0JCSAgbi0+bmV4dCA9ICQyOwotCQkgICQkID0gbjsKLQkJfQotCXwJTkFNRSAnLCcgbm9jcm9zc3JlZl9saXN0Ci0JCXsKLQkJICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuOwotCi0JCSAgbiA9IChzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0JCSAgbi0+bmFtZSA9ICQxOwotCQkgIG4tPm5leHQgPSAkMzsKLQkJICAkJCA9IG47Ci0JCX0KLQk7Ci0KLW11c3RiZV9leHA6CQkgeyBsZGxleF9leHByZXNzaW9uKCk7IH0KLQkJZXhwCi0JCQkgeyBsZGxleF9wb3BzdGF0ZSgpOyAkJD0kMjt9Ci0JOwotCi1leHAJOgotCQknLScgZXhwICVwcmVjIFVOQVJZCi0JCQl7ICQkID0gZXhwX3Vub3AoJy0nLCAkMik7IH0KLQl8CScoJyBleHAgJyknCi0JCQl7ICQkID0gJDI7IH0KLQl8CU5FWFQgJygnIGV4cCAnKScgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSBleHBfdW5vcCgoaW50KSAkMSwkMyk7IH0KLQl8CSchJyBleHAgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSBleHBfdW5vcCgnIScsICQyKTsgfQotCXwJJysnIGV4cCAlcHJlYyBVTkFSWQotCQkJeyAkJCA9ICQyOyB9Ci0JfAknficgZXhwICVwcmVjIFVOQVJZCi0JCQl7ICQkID0gZXhwX3Vub3AoJ34nLCAkMik7fQotCi0JfAlleHAgJyonIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnKicsICQxLCAkMyk7IH0KLQl8CWV4cCAnLycgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCcvJywgJDEsICQzKTsgfQotCXwJZXhwICclJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJyUnLCAkMSwgJDMpOyB9Ci0JfAlleHAgJysnIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnKycsICQxLCAkMyk7IH0KLQl8CWV4cCAnLScgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCctJyAsICQxLCAkMyk7IH0KLQl8CWV4cCBMU0hJRlQgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKExTSElGVCAsICQxLCAkMyk7IH0KLQl8CWV4cCBSU0hJRlQgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKFJTSElGVCAsICQxLCAkMyk7IH0KLQl8CWV4cCBFUSBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoRVEgLCAkMSwgJDMpOyB9Ci0JfAlleHAgTkUgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKE5FICwgJDEsICQzKTsgfQotCXwJZXhwIExFIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChMRSAsICQxLCAkMyk7IH0KLSAgCXwJZXhwIEdFIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChHRSAsICQxLCAkMyk7IH0KLQl8CWV4cCAnPCcgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCc8JyAsICQxLCAkMyk7IH0KLQl8CWV4cCAnPicgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCc+JyAsICQxLCAkMyk7IH0KLQl8CWV4cCAnJicgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCcmJyAsICQxLCAkMyk7IH0KLQl8CWV4cCAnXicgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCdeJyAsICQxLCAkMyk7IH0KLQl8CWV4cCAnfCcgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCd8JyAsICQxLCAkMyk7IH0KLQl8CWV4cCAnPycgZXhwICc6JyBleHAKLQkJCXsgJCQgPSBleHBfdHJpbm9wKCc/JyAsICQxLCAkMywgJDUpOyB9Ci0JfAlleHAgQU5EQU5EIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChBTkRBTkQgLCAkMSwgJDMpOyB9Ci0JfAlleHAgT1JPUiBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoT1JPUiAsICQxLCAkMyk7IH0KLQl8CURFRklORUQgJygnIE5BTUUgJyknCi0JCQl7ICQkID0gZXhwX25hbWVvcChERUZJTkVELCAkMyk7IH0KLQl8CUlOVAotCQkJeyAkJCA9IGV4cF9pbnRvcCgkMSk7IH0KLSAgICAgICAgfAlTSVpFT0ZfSEVBREVSUwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoU0laRU9GX0hFQURFUlMsMCk7IH0KLQotCXwJU0laRU9GICcoJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoU0laRU9GLCQzKTsgfQotCXwJQUREUiAnKCcgTkFNRSAnKScKLQkJCXsgJCQgPSBleHBfbmFtZW9wKEFERFIsJDMpOyB9Ci0JfAlMT0FEQUREUiAnKCcgTkFNRSAnKScKLQkJCXsgJCQgPSBleHBfbmFtZW9wKExPQURBRERSLCQzKTsgfQotCXwJQUJTT0xVVEUgJygnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfdW5vcChBQlNPTFVURSwgJDMpOyB9Ci0JfAlBTElHTl9LICcoJyBleHAgJyknCi0JCQl7ICQkID0gZXhwX3Vub3AoQUxJR05fSywkMyk7IH0KLQl8CUJMT0NLICcoJyBleHAgJyknCi0JCQl7ICQkID0gZXhwX3Vub3AoQUxJR05fSywkMyk7IH0KLQl8CU5BTUUKLQkJCXsgJCQgPSBleHBfbmFtZW9wKE5BTUUsJDEpOyB9Ci0JfAlNQVhfSyAnKCcgZXhwICcsJyBleHAgJyknCi0JCQl7ICQkID0gZXhwX2Jpbm9wIChNQVhfSywgJDMsICQ1ICk7IH0KLQl8CU1JTl9LICcoJyBleHAgJywnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfYmlub3AgKE1JTl9LLCAkMywgJDUgKTsgfQotCXwJQVNTRVJUX0sgJygnIGV4cCAnLCcgTkFNRSAnKScKLQkJCXsgJCQgPSBleHBfYXNzZXJ0ICgkMywgJDUpOyB9Ci0JOwotCi0KLW9wdF9hdDoKLQkJQVQgJygnIGV4cCAnKScgeyAkJCA9ICQzOyB9Ci0JfAl7ICQkID0gMDsgfQotCTsKLQotc2VjdGlvbjoJTkFNRSAJCXsgbGRsZXhfZXhwcmVzc2lvbigpOyB9Ci0JCW9wdF9leHBfd2l0aF90eXBlIAotCQlvcHRfYXQgICAJeyBsZGxleF9wb3BzdGF0ZSAoKTsgbGRsZXhfc2NyaXB0ICgpOyB9Ci0JCSd7JwotCQkJewotCQkJICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCgkMSwgJDMsCi0JCQkJCQkJICAgICAgc2VjdHlwZSwKLQkJCQkJCQkgICAgICAwLCAwLCAwLCAkNCk7Ci0JCQl9Ci0JCXN0YXRlbWVudF9saXN0X29wdCAJCi0gCQknfScgeyBsZGxleF9wb3BzdGF0ZSAoKTsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQltZW1zcGVjX29wdCBwaGRyX29wdCBmaWxsX29wdAotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCSAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKCQxMywgJDExLCAkMTIpOwotCQl9Ci0JCW9wdF9jb21tYQotCXwJT1ZFUkxBWQotCQkJeyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCW9wdF9leHBfd2l0aG91dF90eXBlIG9wdF9ub2Nyb3NzcmVmcyBvcHRfYXQKLQkJCXsgbGRsZXhfcG9wc3RhdGUgKCk7IGxkbGV4X3NjcmlwdCAoKTsgfQotCQkneycgCi0JCQl7Ci0JCQkgIGxhbmdfZW50ZXJfb3ZlcmxheSAoJDMsICQ1LCAoaW50KSAkNCk7Ci0JCQl9Ci0JCW92ZXJsYXlfc2VjdGlvbgotCQknfScKLQkJCXsgbGRsZXhfcG9wc3RhdGUgKCk7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KLQkJbWVtc3BlY19vcHQgcGhkcl9vcHQgZmlsbF9vcHQKLQkJCXsKLQkJCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCQkgIGxhbmdfbGVhdmVfb3ZlcmxheSAoJDE0LCAkMTIsICQxMyk7Ci0JCQl9Ci0JCW9wdF9jb21tYQotCXwJLyogVGhlIEdST1VQIGNhc2UgaXMganVzdCBlbm91Z2ggdG8gc3VwcG9ydCB0aGUgZ2NjCi0JCSAgIHN2cjMuaWZpbGUgc2NyaXB0LiAgSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGZ1bGwKLQkJICAgc3VwcG9ydC4gIEknbSBub3QgZXZlbiBzdXJlIHdoYXQgR1JPVVAgaXMgc3VwcG9zZWQKLQkJICAgdG8gbWVhbi4gICovCi0JCUdST1VQIHsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQlvcHRfZXhwX3dpdGhfdHlwZQotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICIuIiwgJDMpKTsKLQkJfQotCQkneycgc2VjX29yX2dyb3VwX3AxICd9JwotCTsKLQotdHlwZToKLQkgICBOT0xPQUQgIHsgc2VjdHlwZSA9IG5vbG9hZF9zZWN0aW9uOyB9Ci0JfCAgRFNFQ1QgICB7IHNlY3R5cGUgPSBkc2VjdF9zZWN0aW9uOyB9Ci0JfCAgQ09QWSAgICB7IHNlY3R5cGUgPSBjb3B5X3NlY3Rpb247IH0KLQl8ICBJTkZPICAgIHsgc2VjdHlwZSA9IGluZm9fc2VjdGlvbjsgfQotCXwgIE9WRVJMQVkgeyBzZWN0eXBlID0gb3ZlcmxheV9zZWN0aW9uOyB9Ci0JOwotCi1hdHlwZToKLQkgCScoJyB0eXBlICcpJwotICAJfCAJLyogRU1QVFkgKi8geyBzZWN0eXBlID0gbm9ybWFsX3NlY3Rpb247IH0KLSAgCXwgCScoJyAnKScgeyBzZWN0eXBlID0gbm9ybWFsX3NlY3Rpb247IH0KLQk7Ci0KLW9wdF9leHBfd2l0aF90eXBlOgotCQlleHAgYXR5cGUgJzonCQl7ICQkID0gJDE7IH0KLQl8CWF0eXBlICc6JwkJeyAkJCA9IChldHJlZV90eXBlICopTlVMTDsgIH0KLQl8CS8qIFRoZSBCSU5EIGNhc2VzIGFyZSB0byBzdXBwb3J0IHRoZSBnY2Mgc3ZyMy5pZmlsZQotCQkgICBzY3JpcHQuICBUaGV5IGFyZW4ndCBpbnRlbmRlZCB0byBpbXBsZW1lbnQgZnVsbAotCQkgICBzdXBwb3J0IGZvciB0aGUgQklORCBrZXl3b3JkLiAgSSdtIG5vdCBldmVuIHN1cmUKLQkJICAgd2hhdCBCSU5EIGlzIHN1cHBvc2VkIHRvIG1lYW4uICAqLwotCQlCSU5EICcoJyBleHAgJyknIGF0eXBlICc6JyB7ICQkID0gJDM7IH0KLQl8CUJJTkQgJygnIGV4cCAnKScgQkxPQ0sgJygnIGV4cCAnKScgYXR5cGUgJzonCi0JCXsgJCQgPSAkMzsgfQotCTsKLQotb3B0X2V4cF93aXRob3V0X3R5cGU6Ci0JCWV4cCAnOicJCXsgJCQgPSAkMTsgfQotCXwJJzonCQl7ICQkID0gKGV0cmVlX3R5cGUgKikgTlVMTDsgIH0KLQk7Ci0KLW9wdF9ub2Nyb3NzcmVmczoKLQkJLyogZW1wdHkgKi8KLQkJCXsgJCQgPSAwOyB9Ci0JfAlOT0NST1NTUkVGUwotCQkJeyAkJCA9IDE7IH0KLQk7Ci0KLW1lbXNwZWNfb3B0OgotCQknPicgTkFNRQotCQl7ICQkID0gJDI7IH0KLQl8CXsgJCQgPSAiKmRlZmF1bHQqIjsgfQotCTsKLQotcGhkcl9vcHQ6Ci0JCS8qIGVtcHR5ICovCi0JCXsKLQkJICAkJCA9IE5VTEw7Ci0JCX0KLQl8CXBoZHJfb3B0ICc6JyBOQU1FCi0JCXsKLQkJICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKm47Ci0KLQkJICBuID0gKChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikKLQkJICAgICAgIHhtYWxsb2MgKHNpemVvZiAqbikpOwotCQkgIG4tPm5hbWUgPSAkMzsKLQkJICBuLT51c2VkID0gZmFsc2U7Ci0JCSAgbi0+bmV4dCA9ICQxOwotCQkgICQkID0gbjsKLQkJfQotCTsKLQotb3ZlcmxheV9zZWN0aW9uOgotCQkvKiBlbXB0eSAqLwotCXwJb3ZlcmxheV9zZWN0aW9uCi0JCU5BTUUKLQkJCXsKLQkJCSAgbGRsZXhfc2NyaXB0ICgpOwotCQkJICBsYW5nX2VudGVyX292ZXJsYXlfc2VjdGlvbiAoJDIpOwotCQkJfQotCQkneycgc3RhdGVtZW50X2xpc3Rfb3B0ICd9JwotCQkJeyBsZGxleF9wb3BzdGF0ZSAoKTsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQlwaGRyX29wdCBmaWxsX29wdAotCQkJewotCQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJCSAgbGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24gKCQ5LCAkOCk7Ci0JCQl9Ci0JCW9wdF9jb21tYQotCTsKLQotcGhkcnM6Ci0JCVBIRFJTICd7JyBwaGRyX2xpc3QgJ30nCi0JOwotCi1waGRyX2xpc3Q6Ci0JCS8qIGVtcHR5ICovCi0JfAlwaGRyX2xpc3QgcGhkcgotCTsKLQotcGhkcjoKLQkJTkFNRSB7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KLQkJICBwaGRyX3R5cGUgcGhkcl9xdWFsaWZpZXJzIHsgbGRsZXhfcG9wc3RhdGUgKCk7IH0KLQkJICAnOycKLQkJewotCQkgIGxhbmdfbmV3X3BoZHIgKCQxLCAkMywgJDQuZmlsZWhkciwgJDQucGhkcnMsICQ0LmF0LAotCQkJCSAkNC5mbGFncyk7Ci0JCX0KLQk7Ci0KLXBoZHJfdHlwZToKLQkJZXhwCi0JCXsKLQkJICAkJCA9ICQxOwotCi0JCSAgaWYgKCQxLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfbmFtZQotCQkgICAgICAmJiAkMS0+dHlwZS5ub2RlX2NvZGUgPT0gTkFNRSkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqczsKLQkJICAgICAgdW5zaWduZWQgaW50IGk7Ci0JCSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGhkcl90eXBlc1tdID0KLQkJCXsKLQkJCSAgIlBUX05VTEwiLCAiUFRfTE9BRCIsICJQVF9EWU5BTUlDIiwKLQkJCSAgIlBUX0lOVEVSUCIsICJQVF9OT1RFIiwgIlBUX1NITElCIiwKLQkJCSAgIlBUX1BIRFIiCi0JCQl9OwotCi0JCSAgICAgIHMgPSAkMS0+bmFtZS5uYW1lOwotCQkgICAgICBmb3IgKGkgPSAwOwotCQkJICAgaSA8IHNpemVvZiBwaGRyX3R5cGVzIC8gc2l6ZW9mIHBoZHJfdHlwZXNbMF07Ci0JCQkgICBpKyspCi0JCQlpZiAoc3RyY21wIChzLCBwaGRyX3R5cGVzW2ldKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgJCQgPSBleHBfaW50b3AgKGkpOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICB9Ci0JCX0KLQk7Ci0KLXBoZHJfcXVhbGlmaWVyczoKLQkJLyogZW1wdHkgKi8KLQkJewotCQkgIG1lbXNldCAoJiQkLCAwLCBzaXplb2YgKHN0cnVjdCBwaGRyX2luZm8pKTsKLQkJfQotCXwJTkFNRSBwaGRyX3ZhbCBwaGRyX3F1YWxpZmllcnMKLQkJewotCQkgICQkID0gJDM7Ci0JCSAgaWYgKHN0cmNtcCAoJDEsICJGSUxFSERSIikgPT0gMCAmJiAkMiA9PSBOVUxMKQotCQkgICAgJCQuZmlsZWhkciA9IHRydWU7Ci0JCSAgZWxzZSBpZiAoc3RyY21wICgkMSwgIlBIRFJTIikgPT0gMCAmJiAkMiA9PSBOVUxMKQotCQkgICAgJCQucGhkcnMgPSB0cnVlOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAoJDEsICJGTEFHUyIpID09IDAgJiYgJDIgIT0gTlVMTCkKLQkJICAgICQkLmZsYWdzID0gJDI7Ci0JCSAgZWxzZQotCQkgICAgZWluZm8gKF8oIiVYJVA6JVM6IFBIRFJTIHN5bnRheCBlcnJvciBhdCBgJXMnXG4iKSwgJDEpOwotCQl9Ci0JfAlBVCAnKCcgZXhwICcpJyBwaGRyX3F1YWxpZmllcnMKLQkJewotCQkgICQkID0gJDU7Ci0JCSAgJCQuYXQgPSAkMzsKLQkJfQotCTsKLQotcGhkcl92YWw6Ci0JCS8qIGVtcHR5ICovCi0JCXsKLQkJICAkJCA9IE5VTEw7Ci0JCX0KLQl8ICcoJyBleHAgJyknCi0JCXsKLQkJICAkJCA9ICQyOwotCQl9Ci0JOwotCi0vKiBUaGlzIHN5bnRheCBpcyB1c2VkIHdpdGhpbiBhbiBleHRlcm5hbCB2ZXJzaW9uIHNjcmlwdCBmaWxlLiAgKi8KLQotdmVyc2lvbl9zY3JpcHRfZmlsZToKLQkJewotCQkgIGxkbGV4X3ZlcnNpb25fZmlsZSAoKTsKLQkJICBQVVNIX0VSUk9SIChfKCJWRVJTSU9OIHNjcmlwdCIpKTsKLQkJfQotCQl2ZXJzX25vZGVzCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBQT1BfRVJST1IgKCk7Ci0JCX0KLQk7Ci0KLS8qIFRoaXMgaXMgdXNlZCB3aXRoaW4gYSBub3JtYWwgbGlua2VyIHNjcmlwdCBmaWxlLiAgKi8KLQotdmVyc2lvbjoKLQkJewotCQkgIGxkbGV4X3ZlcnNpb25fc2NyaXB0ICgpOwotCQl9Ci0JCVZFUlNJT05LICd7JyB2ZXJzX25vZGVzICd9JwotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCX0KLQk7Ci0KLXZlcnNfbm9kZXM6Ci0JCXZlcnNfbm9kZQotCXwJdmVyc19ub2RlcyB2ZXJzX25vZGUKLQk7Ci0KLXZlcnNfbm9kZToKLQkJVkVSU19UQUcgJ3snIHZlcnNfdGFnICd9JyAnOycKLQkJewotCQkgIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlICgkMSwgJDMsIE5VTEwpOwotCQl9Ci0JfAlWRVJTX1RBRyAneycgdmVyc190YWcgJ30nIHZlcmRlcCAnOycKLQkJewotCQkgIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlICgkMSwgJDMsICQ1KTsKLQkJfQotCTsKLQotdmVyZGVwOgotCQlWRVJTX1RBRwotCQl7Ci0JCSAgJCQgPSBsYW5nX2FkZF92ZXJzX2RlcGVuZCAoTlVMTCwgJDEpOwotCQl9Ci0JfAl2ZXJkZXAgVkVSU19UQUcKLQkJewotCQkgICQkID0gbGFuZ19hZGRfdmVyc19kZXBlbmQgKCQxLCAkMik7Ci0JCX0KLQk7Ci0KLXZlcnNfdGFnOgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKE5VTEwsIE5VTEwpOwotCQl9Ci0JfAl2ZXJzX2RlZm5zICc7JwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKCQxLCBOVUxMKTsKLQkJfQotCXwJR0xPQkFMICc6JyB2ZXJzX2RlZm5zICc7JwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKCQzLCBOVUxMKTsKLQkJfQotCXwJTE9DQUwgJzonIHZlcnNfZGVmbnMgJzsnCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoTlVMTCwgJDMpOwotCQl9Ci0JfAlHTE9CQUwgJzonIHZlcnNfZGVmbnMgJzsnIExPQ0FMICc6JyB2ZXJzX2RlZm5zICc7JwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKCQzLCAkNyk7Ci0JCX0KLQk7Ci0KLXZlcnNfZGVmbnM6Ci0JCVZFUlNfSURFTlRJRklFUgotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX3JlZ2V4IChOVUxMLCAkMSwgbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nKTsKLQkJfQotCXwJdmVyc19kZWZucyAnOycgVkVSU19JREVOVElGSUVSCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKCQxLCAkMywgbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nKTsKLQkJfQotCXwJRVhURVJOIE5BTUUgJ3snCi0JCQl7Ci0JCQkgICQ8bmFtZT4kID0gbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nOwotCQkJICBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcgPSAkMjsKLQkJCX0KLQkJdmVyc19kZWZucyAnfScKLQkJCXsKLQkJCSAgbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nID0gJDxuYW1lPjQ7Ci0JCQl9Ci0JOwotCi0lJQotdm9pZAoteXllcnJvcihhcmcpIAotICAgICBjb25zdCBjaGFyICphcmc7Ci17IAotICBpZiAobGRmaWxlX2Fzc3VtZWRfc2NyaXB0KQotICAgIGVpbmZvIChfKCIlUDolczogZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQ7IHRyZWF0aW5nIGFzIGxpbmtlciBzY3JpcHRcbiIpLAotCSAgIGxkZmlsZV9pbnB1dF9maWxlbmFtZSk7Ci0gIGlmIChlcnJvcl9pbmRleCA+IDAgJiYgZXJyb3JfaW5kZXggPCBFUlJPUl9OQU1FX01BWCkKLSAgICAgZWluZm8gKCIlUCVGOiVTOiAlcyBpbiAlc1xuIiwgYXJnLCBlcnJvcl9uYW1lc1tlcnJvcl9pbmRleC0xXSk7Ci0gIGVsc2UKLSAgICAgZWluZm8gKCIlUCVGOiVTOiAlc1xuIiwgYXJnKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkaW50LnRleGluZm8gYi9sZC9sZGludC50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGVhNzg4Li4wMDAwMDAwCi0tLSBhL2xkL2xkaW50LnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBsZGludC5pbmZvCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIExkLUludGVybmFsczogKGxkaW50KS4JVGhlIEdOVSBsaW5rZXIgaW50ZXJuYWxzLgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgbGlua2VyIGxkLgotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUNvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBvciBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCAoZm9yIHdoaWNoIHB1cnBvc2UgdGhpcyB0ZXh0IG1heSBiZQotcmVnYXJkZWQgYXMgYSBwcm9ncmFtIGluIHRoZSBsYW5ndWFnZSBUZVgpLgotQGVuZCBpZmluZm8KLQotQGlmdGV4Ci1AZmluYWxvdXQKLUBzZXRjaGFwdGVybmV3cGFnZSBvZmYKLUBzZXR0aXRsZSBHTlUgTGlua2VyIEludGVybmFscwotQHRpdGxlcGFnZQotQHRpdGxle0EgZ3VpZGUgdG8gdGhlIGludGVybmFscyBvZiB0aGUgR05VIGxpbmtlcn0KLUBhdXRob3IgUGVyIEJvdGhuZXIsIFN0ZXZlIENoYW1iZXJsYWluLCBJYW4gTGFuY2UgVGF5bG9yLCBESiBEZWxvcmllCi1AYXV0aG9yIEN5Z251cyBTdXBwb3J0Ci1AcGFnZQotCi1AdGV4Ci1cZGVmXCQjMSR7eyMxfX0gICUgS2x1Z2U6IGNvbGxlY3QgUkNTIHJldmlzaW9uIGluZm8gd2l0aG91dCAkLi4uJAotXHhkZWZcbWFudmVyc3tcJFJldmlzaW9uJH0gICUgRm9yIHVzZSBpbiBoZWFkZXJzLCBmb290ZXJzIHRvbwote1xwYXJza2lwPTBwdAotXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhcgotXGhmaWxsIFxtYW52ZXJzXHBhcgotXGhmaWxsIFxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhcgotfQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBlbmQgdGl0bGVwYWdlCi1AZW5kIGlmdGV4Ci0KLUBub2RlIFRvcAotQHRvcAotCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEdOVSBsaW5rZXIgQGNvZGV7bGR9LiAgSXQgaXMgYQotY29sbGVjdGlvbiBvZiBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uIHdpdGggbGl0dGxlIGZvcm0gYXQgdGhpcyBwb2ludC4KLU1vc3RseSwgaXQgaXMgYSByZXBvc2l0b3J5IGludG8gd2hpY2ggeW91IGNhbiBwdXQgaW5mb3JtYXRpb24gYWJvdXQKLUdOVSBAY29kZXtsZH0gYXMgeW91IGRpc2NvdmVyIGl0IChvciBhcyB5b3UgZGVzaWduIGNoYW5nZXMgdG8gQGNvZGV7bGR9KS4KLQotQG1lbnUKLSogUkVBRE1FOjoJCQlUaGUgUkVBRE1FIEZpbGUKLSogRW11bGF0aW9uczo6CQkJSG93IGxpbmtlciBlbXVsYXRpb25zIGFyZSBnZW5lcmF0ZWQKLSogRW11bGF0aW9uIFdhbGt0aHJvdWdoOjoJQSBXYWxrdGhyb3VnaCBvZiBhIFR5cGljYWwgRW11bGF0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgUkVBRE1FCi1AY2hhcHRlciBUaGUgQGZpbGV7UkVBRE1FfSBGaWxlCi0KLUNoZWNrIHRoZSBAZmlsZXtSRUFETUV9IGZpbGU7IGl0IG9mdGVuIGhhcyB1c2VmdWwgaW5mb3JtYXRpb24gdGhhdCBkb2VzIG5vdAotYXBwZWFyIGFueXdoZXJlIGVsc2UgaW4gdGhlIGRpcmVjdG9yeS4KLQotQG5vZGUgRW11bGF0aW9ucwotQGNoYXB0ZXIgSG93IGxpbmtlciBlbXVsYXRpb25zIGFyZSBnZW5lcmF0ZWQKLQotRWFjaCBsaW5rZXIgdGFyZ2V0IGhhcyBhbiBAZGZue2VtdWxhdGlvbn0uICBUaGUgZW11bGF0aW9uIGluY2x1ZGVzIHRoZQotZGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBhbmQgY2VydGFpbiBlbXVsYXRpb25zIGFsc28gbW9kaWZ5IGNlcnRhaW4gdHlwZXMKLW9mIGxpbmtlciBiZWhhdmlvdXIuCi0KLUVtdWxhdGlvbnMgYXJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIGJ5IHRoZSBzaGVsbCBzY3JpcHQKLUBmaWxle2dlbnNjcmlwdHMuc2h9LgotCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHN0YXJ0cyBieSByZWFkaW5nIGEgZmlsZSBpbiB0aGUKLUBmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeS4gIFRoaXMgaXMgYSBzaGVsbCBzY3JpcHQgd2hpY2ggc2V0cyB2YXJpb3VzCi1zaGVsbCB2YXJpYWJsZXMgdXNlZCBieSBAZmlsZXtnZW5zY3JpcHRzLnNofSBhbmQgdGhlIG90aGVyIHNoZWxsIHNjcmlwdHMKLWl0IGludm9rZXMuCi0KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBpbnZva2UgYSBzaGVsbCBzY3JpcHQgaW4gdGhlCi1AZmlsZXtzY3JpcHR0ZW1wbH0gZGlyZWN0b3J5IGluIG9yZGVyIHRvIGNyZWF0ZSBkZWZhdWx0IGxpbmtlciBzY3JpcHRzCi13cml0dGVuIGluIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0Ci13aWxsIGJlIGludm9rZWQgNSAob3IsIGluIHNvbWUgY2FzZXMsIDYpIHRpbWVzLCB3aXRoIGRpZmZlcmVudAotYXNzaWdubWVudHMgdG8gc2hlbGwgdmFyaWFibGVzLCB0byBjcmVhdGUgZGlmZmVyZW50IGRlZmF1bHQgc2NyaXB0cy4KLVRoZSBjaG9pY2Ugb2Ygc2NyaXB0IGlzIG1hZGUgYmFzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi1BZnRlciBjcmVhdGluZyB0aGUgc2NyaXB0cywgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCBpbnZva2UgeWV0IGFub3RoZXIKLXNoZWxsIHNjcmlwdCwgdGhpcyB0aW1lIGluIHRoZSBAZmlsZXtlbXVsdGVtcGx9IGRpcmVjdG9yeS4gIFRoYXQgc2hlbGwKLXNjcmlwdCB3aWxsIGNyZWF0ZSB0aGUgZW11bGF0aW9uIHNvdXJjZSBmaWxlLCB3aGljaCBjb250YWlucyBDIGNvZGUuCi1UaGlzIEMgY29kZSBwZXJtaXRzIHRoZSBsaW5rZXIgZW11bGF0aW9uIHRvIG92ZXJyaWRlIHZhcmlvdXMgbGlua2VyCi1iZWhhdmlvdXJzLiAgTW9zdCB0YXJnZXRzIHVzZSB0aGUgZ2VuZXJpYyBlbXVsYXRpb24gY29kZSwgd2hpY2ggaXMgaW4KLUBmaWxle2VtdWx0ZW1wbC9nZW5lcmljLmVtfS4KLQotVG8gc3VtbWFyaXplLCBAZmlsZXtnZW5zY3JpcHRzLnNofSByZWFkcyB0aHJlZSBzaGVsbCBzY3JpcHRzOiBhbgotZW11bGF0aW9uIHBhcmFtZXRlcnMgc2NyaXB0IGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBkaXJlY3RvcnksIGEgbGlua2VyCi1zY3JpcHQgZ2VuZXJhdGlvbiBzY3JpcHQgaW4gdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBkaXJlY3RvcnksIGFuZCBhbgotZW11bGF0aW9uIHNvdXJjZSBmaWxlIGdlbmVyYXRpb24gc2NyaXB0IGluIHRoZSBAZmlsZXtlbXVsdGVtcGx9Ci1kaXJlY3RvcnkuCi0KLUZvciBleGFtcGxlLCB0aGUgU3VuIDQgbGlua2VyIHNldHMgdXAgdmFyaWFibGVzIGluCi1AZmlsZXtlbXVscGFyYW1zL3N1bjQuc2h9LCBjcmVhdGVzIGxpbmtlciBzY3JpcHRzIHVzaW5nCi1AZmlsZXtzY3JpcHR0ZW1wbC9hb3V0LnNjfSwgYW5kIGNyZWF0ZXMgdGhlIGVtdWxhdGlvbiBjb2RlIHVzaW5nCi1AZmlsZXtlbXVsdGVtcGwvc3Vub3MuZW19LgotCi1Ob3RlIHRoYXQgdGhlIGxpbmtlciBjYW4gc3VwcG9ydCBzZXZlcmFsIGVtdWxhdGlvbnMgc2ltdWx0YW5lb3VzbHksCi1kZXBlbmRpbmcgdXBvbiBob3cgaXQgaXMgY29uZmlndXJlZC4gIEFuIGVtdWxhdGlvbiBjYW4gYmUgc2VsZWN0ZWQgd2l0aAotdGhlIEBjb2Rley1tfSBvcHRpb24uICBUaGUgQGNvZGV7LVZ9IG9wdGlvbiB3aWxsIGxpc3QgYWxsIHN1cHBvcnRlZAotZW11bGF0aW9ucy4KLQotQG1lbnUKLSogZW11bGF0aW9uIHBhcmFtZXRlcnM6OiAgICAgICAgQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0cwotKiBsaW5rZXIgc2NyaXB0czo6ICAgICAgICAgICAgICBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cwotKiBsaW5rZXIgZW11bGF0aW9uczo6ICAgICAgICAgICBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdHMKLUBlbmQgbWVudQotCi1Abm9kZSBlbXVsYXRpb24gcGFyYW1ldGVycwotQHNlY3Rpb24gQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0cwotCi1FYWNoIHRhcmdldCBzZWxlY3RzIGEgcGFydGljdWxhciBmaWxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBkaXJlY3RvcnkKLWJ5IHNldHRpbmcgdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle3RhcmdfZW11bH0gaW4gQGZpbGV7Y29uZmlndXJlLnRndH0uCi1UaGlzIHNoZWxsIHZhcmlhYmxlIGlzIHVzZWQgYnkgdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHRvIGNvbnRyb2wKLWJ1aWxkaW5nIGFuIGVtdWxhdGlvbiBzb3VyY2UgZmlsZS4KLQotQ2VydGFpbiBjb252ZW50aW9ucyBhcmUgZW5mb3JjZWQuICBTdXBwb3NlIHRoZSBAY29kZXt0YXJnX2VtdWx9IHZhcmlhYmxlCi1pcyBzZXQgdG8gQHZhcntlbXVsfSBpbiBAZmlsZXtjb25maWd1cmUudGd0fS4gIFRoZSBuYW1lIG9mIHRoZSBlbXVsYXRpb24KLXNoZWxsIHNjcmlwdCB3aWxsIGJlIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0uICBUaGUKLUBmaWxle01ha2VmaWxlfSBtdXN0IGhhdmUgYSB0YXJnZXQgbmFtZWQgQGZpbGV7ZUB2YXJ7ZW11bH0uY307IHRoaXMKLXRhcmdldCBtdXN0IGRlcGVuZCB1cG9uIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0sIGFzIHdlbGwgYXMgdGhlCi1hcHByb3ByaWF0ZSBzY3JpcHRzIGluIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gYW5kIEBmaWxle2VtdWx0ZW1wbH0KLWRpcmVjdG9yaWVzLiAgVGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXQgbXVzdCBpbnZva2UgQGNvZGV7R0VOU0NSSVBUU30KLXdpdGggdHdvIGFyZ3VtZW50czogQHZhcntlbXVsfSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbWFrZSB2YXJpYWJsZQotQGNvZGV7dGRpcl9AdmFye2VtdWx9fS4gIFRoZSB2YWx1ZSBvZiB0aGUgbGF0dGVyIHZhcmlhYmxlIHdpbGwgYmUgc2V0IGJ5Ci10aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQsIGFuZCBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCB0YXJnZXQKLWRpcmVjdG9yeSB0byBzZWFyY2guCi0KLUJ5IGNvbnZlbnRpb24sIHRoZSBAZmlsZXtlbXVscGFyYW1zL0B2YXJ7ZW11bH0uc2h9IHNoZWxsIHNjcmlwdCBzaG91bGQKLW9ubHkgc2V0IHNoZWxsIHZhcmlhYmxlcy4gIEl0IG1heSBzZXQgc2hlbGwgdmFyaWFibGVzIHdoaWNoIGFyZSB0byBiZQotaW50ZXJwcmV0ZWQgYnkgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBhbmQgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cy4KLUNlcnRhaW4gc2hlbGwgdmFyaWFibGVzIGFyZSBpbnRlcnByZXRlZCBkaXJlY3RseSBieSB0aGUKLUBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdC4KLQotSGVyZSBpcyBhIGxpc3Qgb2Ygc2hlbGwgdmFyaWFibGVzIGludGVycHJldGVkIGJ5IEBmaWxle2dlbnNjcmlwdHMuc2h9LAotYXMgd2VsbCBhcyBzb21lIGNvbnZlbnRpb25hbCBzaGVsbCB2YXJpYWJsZXMgaW50ZXJwcmV0ZWQgYnkgdGhlCi1AZmlsZXtzY3JpcHR0ZW1wbH0gYW5kIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBTQ1JJUFRfTkFNRQotVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB0byB1c2UuICBJZgotQGNvZGV7U0NSSVBUX05BTUV9IGlzIHNldCB0byBAdmFye3NjcmlwdH0sIEBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgdXNlCi10aGUgc2NyaXB0IEBmaWxle3NjcmlwdHRlbWwvQHZhcntzY3JpcHR9LnNjfS4KLQotQGl0ZW0gVEVNUExBVEVfTkFNRQotVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHRlbWxwfSBzY3JpcHQgdG8gdXNlLiAgSWYKLUBjb2Rle1RFTVBMQVRFX05BTUV9IGlzIHNldCB0byBAdmFye3RlbXBsYXRlfSwgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbAotdXNlIHRoZSBzY3JpcHQgQGZpbGV7ZW11bHRlbXBsL0B2YXJ7dGVtcGxhdGV9LmVtfS4gIElmIHRoaXMgdmFyaWFibGUgaXMKLW5vdCBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIEBzYW1we2dlbmVyaWN9LgotCi1AaXRlbSBHRU5FUkFURV9TSExJQl9TQ1JJUFQKLUlmIHRoaXMgaXMgc2V0IHRvIGEgbm9uZW1wdHkgc3RyaW5nLCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsIGludm9rZQotdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgYW4gZXh0cmEgdGltZSB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeQotc2NyaXB0LiAgQHJlZntsaW5rZXIgc2NyaXB0c30uCi0KLUBpdGVtIE9VVFBVVF9GT1JNQVQKLVRoaXMgaXMgbm9ybWFsbHkgc2V0IHRvIGluZGljYXRlIHRoZSBCRkQgb3V0cHV0IGZvcm1hdCB1c2UgKGUuZy4sCi1Ac2FtcHsiYS5vdXQtc3Vub3MtYmlnIn0uICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aWxsIG5vcm1hbGx5Ci11c2UgaXQgaW4gYW4gQGNvZGV7T1VUUFVUX0ZPUk1BVH0gZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLQotQGl0ZW0gQVJDSAotVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gaW5kaWNhdGUgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2UgKGUuZy4sCi1Ac2FtcHtzcGFyY30pLiAgVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgd2lsbCBub3JtYWxseSB1c2UgaXQgaW4gYW4KLUBjb2Rle09VVFBVVF9BUkNIfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1AaXRlbSBFTlRSWQotU29tZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cyB1c2UgdGhpcyB0byBzZXQgdGhlIGVudHJ5IGFkZHJlc3MsIGluIGFuCi1AY29kZXtFTlRSWX0gZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLQotQGl0ZW0gVEVYVF9TVEFSVF9BRERSCi1Tb21lIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzIHVzZSB0aGlzIHRvIHNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKLUBzYW1wey50ZXh0fSBzZWN0aW9uLgotCi1AaXRlbSBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIKLUlmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCBzZXRzCi1AY29kZXtURVhUX1NUQVJUX0FERFJ9IHRvIGl0cyB2YWx1ZSBiZWZvcmUgcnVubmluZyB0aGUKLUBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgZm9yIHRoZSBAY29kZXstbn0gYW5kIEBjb2Rley1OfSBvcHRpb25zCi0oQHB4cmVme2xpbmtlciBzY3JpcHRzfSkuCi0KLUBpdGVtIFNFR01FTlRfU0laRQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mCi1AY29kZXtEQVRBX0FMSUdOTUVOVH0gd2hlbiBydW5uaW5nIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0LgotCi1AaXRlbSBUQVJHRVRfUEFHRV9TSVpFCi1JZiBAY29kZXtTRUdNRU5UX1NJWkV9IGlzIG5vdCBkZWZpbmVkLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0Ci11c2VzIHRoaXMgdG8gZGVmaW5lIGl0LgotCi1AaXRlbSBBTElHTk1FTlQKLVNvbWUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMgc2V0IHRoaXMgdG8gYSBudW1iZXIgdG8gcGFzcyB0bwotQGNvZGV7QUxJR059IHRvIHNldCB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgQGNvZGV7ZW5kfSBzeW1ib2wuCi1AZW5kIHRhYmxlCi0KLUBub2RlIGxpbmtlciBzY3JpcHRzCi1Ac2VjdGlvbiBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cwotCi1FYWNoIGxpbmtlciB0YXJnZXQgdXNlcyBhIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgdG8gZ2VuZXJhdGUgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHRzLiAgVGhlIG5hbWUgb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMKLXNldCBieSB0aGUgQGNvZGV7U0NSSVBUX05BTUV9IHZhcmlhYmxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQuCi1JZiBAY29kZXtTQ1JJUFRfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7c2NyaXB0fSwgQGNvZGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbAotaW52b2tlIEBmaWxle3NjcmlwdHRlbXBsL0B2YXJ7c2NyaXB0fS5zY30uCi0KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBpbnZva2UgdGhlIEBmaWxle3NjcmlwdHRlbXBsfQotc2NyaXB0IDUgb3IgNiB0aW1lcy4gIEVhY2ggdGltZSBpdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBjb2Rle0xEX0ZMQUd9IHRvIGEgZGlmZmVyZW50IHZhbHVlLiAgV2hlbiB0aGUgbGlua2VyIGlzIHJ1biwgdGhlCi1vcHRpb25zIHVzZWQgd2lsbCBkaXJlY3QgaXQgdG8gc2VsZWN0IGEgcGFydGljdWxhciBzY3JpcHQuICAoU2NyaXB0Ci1zZWxlY3Rpb24gaXMgY29udHJvbGxlZCBieSB0aGUgQGNvZGV7Z2V0X3NjcmlwdH0gZW11bGF0aW9uIGVudHJ5IHBvaW50OwotdGhpcyBkZXNjcmliZXMgdGhlIGNvbnZlbnRpb25hbCBiZWhhdmlvdXIpLgotCi1UaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBzaG91bGQganVzdCB3cml0ZSBhIGxpbmtlciBzY3JpcHQsIHdyaXR0ZW4KLWluIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSwgdG8gc3RhbmRhcmQgb3V0cHV0LiAgSWYgdGhlIGVtdWxhdGlvbgotbmFtZS0tdGhlIG5hbWUgb2YgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUgd2l0aG91dCB0aGUgQGZpbGV7LnNjfQotZXh0ZW5zaW9uLS1pcyBAdmFye2VtdWx9LCB0aGVuIHRoZSBvdXRwdXQgd2lsbCBiZSBkaXJlY3RlZCB0bwotQGZpbGV7bGRzY3JpcHRzL0B2YXJ7ZW11bH0uQHZhcntleHRlbnNpb259fSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LAotd2hlcmUgQHZhcntleHRlbnNpb259IGNoYW5nZXMgZWFjaCB0aW1lIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzCi1pbnZva2VkLgotCi1IZXJlIGlzIHRoZSBsaXN0IG9mIHZhbHVlcyBhc3NpZ25lZCB0byBAY29kZXtMRF9GTEFHfS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAoZW1wdHkpCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIGJ5IGRlZmF1bHQgKHdoZW4gbm9uZSBvZiB0aGUgZm9sbG93aW5nCi1jYXNlcyBhcHBseSkuICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7Lnh9LgotQGl0ZW0gbgotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LW59IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueG59LgotQGl0ZW0gTgotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LU59IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueGJufS4KLUBpdGVtIHIKLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCB0aGUKLUBjb2Rley1yfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnhyfS4KLUBpdGVtIHUKLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCB0aGUKLUBjb2Rley1Vcn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54dX0uCi1AaXRlbSBzaGFyZWQKLVRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzIG9ubHkgaW52b2tlZCB3aXRoIEBjb2Rle0xEX0ZMQUd9IHNldCB0bwotdGhpcyB2YWx1ZSBpZiBAY29kZXtHRU5FUkFURV9TSExJQl9TQ1JJUFR9IGlzIGRlZmluZWQgaW4gdGhlCi1AZmlsZXtlbXVscGFyYW1zfSBmaWxlLiAgVGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IG11c3QgYXJyYW5nZSB0byB1c2UKLXRoaXMgc2NyaXB0IGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lLCBub3JtYWxseSB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZAotd2l0aCB0aGUgQGNvZGV7LXNoYXJlZH0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mCi1AZmlsZXsueHN9LgotQGVuZCB0YWJsZQotCi1CZXNpZGVzIHRoZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQsIGFuZCB0aGUKLUBjb2Rle0xEX0ZMQUd9IHZhcmlhYmxlLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgc2V0Ci1jZXJ0YWluIHZhcmlhYmxlcyBmb3IgZWFjaCBydW4gb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gUkVMT0NBVElORwotVGhpcyB3aWxsIGJlIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIGEgZmluYWwKLXJlbG9jYXRpb24gKGUuZy4sIGFsbCBzY3JpcHRzIG90aGVyIHRoYW4gQGNvZGV7LXJ9IGFuZCBAY29kZXstVXJ9KS4KLQotQGl0ZW0gQ09OU1RSVUNUSU5HCi1UaGlzIHdpbGwgYmUgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgYnVpbGRpbmcKLWdsb2JhbCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgKGUuZy4sIGFsbCBzY3JpcHRzIG90aGVyIHRoYW4KLUBjb2Rley1yfSkuCi0KLUBpdGVtIERBVEFfQUxJR05NRU5UCi1UaGlzIHdpbGwgYmUgc2V0IHRvIGFuIEBjb2Rle0FMSUdOfSBleHByZXNzaW9uIHdoZW4gdGhlIG91dHB1dCBzaG91bGQgYmUKLXBhZ2UgYWxpZ25lZCwgb3IgdG8gQHNhbXB7Ln0gd2hlbiBnZW5lcmF0aW5nIHRoZSBAY29kZXstTn0gc2NyaXB0LgotCi1AaXRlbSBDUkVBVEVfU0hMSUIKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gZ2VuZXJhdGluZyBhIEBjb2Rley1zaGFyZWR9Ci1zY3JpcHQuCi1AZW5kIHRhYmxlCi0KLVRoZSBjb252ZW50aW9uYWwgd2F5IHRvIHdyaXRlIGEgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBpcyB0byBmaXJzdAotc2V0IGEgZmV3IHNoZWxsIHZhcmlhYmxlcywgYW5kIHRoZW4gd3JpdGUgb3V0IGEgbGlua2VyIHNjcmlwdCB1c2luZwotQGNvZGV7Y2F0fSB3aXRoIGEgaGVyZSBkb2N1bWVudC4gIFRoZSBsaW5rZXIgc2NyaXB0IHdpbGwgdXNlIHZhcmlhYmxlCi1zdWJzdGl0dXRpb25zLCBiYXNlZCBvbiB0aGUgYWJvdmUgdmFyaWFibGVzIGFuZCB0aG9zZSBzZXQgaW4gdGhlCi1AZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQsIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW91ci4KLQotV2hlbiB0aGVyZSBhcmUgcGFydHMgb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgd2hpY2ggc2hvdWxkIG9ubHkKLWJlIHJ1biB3aGVuIGRvaW5nIGEgZmluYWwgcmVsb2NhdGlvbiwgdGhleSBzaG91bGQgYmUgZW5jbG9zZWQgd2l0aGluIGEKLXZhcmlhYmxlIHN1YnN0aXR1dGlvbiBiYXNlZCBvbiBAY29kZXtSRUxPQ0FUSU5HfS4gIEZvciBleGFtcGxlLCBvbiBtYW55Ci10YXJnZXRzIHNwZWNpYWwgc3ltYm9scyBzdWNoIGFzIEBjb2Rle19lbmR9IHNob3VsZCBiZSBkZWZpbmVkIHdoZW4gZG9pbmcKLWEgZmluYWwgbGluay4gIE5hdHVyYWxseSwgdGhvc2Ugc3ltYm9scyBzaG91bGQgbm90IGJlIGRlZmluZWQgd2hlbiBkb2luZwotYSByZWxvY2F0ZWFibGUgbGluayB1c2luZyBAY29kZXstcn0uICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdAotY291bGQgdXNlIGEgY29uc3RydWN0IGxpa2UgdGhpcyB0byBkZWZpbmUgdGhvc2Ugc3ltYm9sczoKLUBzbWFsbGV4YW1wbGUKLSAgJEB7UkVMT0NBVElORysgX2VuZCA9IC47QH0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIHdpbGwgZG8gdGhlIHN5bWJvbCBhc3NpZ25tZW50IG9ubHkgaWYgdGhlIEBjb2Rle1JFTE9DQVRJTkd9Ci12YXJpYWJsZSBpcyBkZWZpbmVkLgotCi1UaGUgYmFzaWMgam9iIG9mIHRoZSBsaW5rZXIgc2NyaXB0IGlzIHRvIHB1dCB0aGUgc2VjdGlvbnMgaW4gdGhlIGNvcnJlY3QKLW9yZGVyLCBhbmQgYXQgdGhlIGNvcnJlY3QgbWVtb3J5IGFkZHJlc3Nlcy4gIEZvciBzb21lIHRhcmdldHMsIHRoZQotbGlua2VyIHNjcmlwdCBtYXkgaGF2ZSB0byBkbyBzb21lIG90aGVyIG9wZXJhdGlvbnMuCi0KLUZvciBleGFtcGxlLCBvbiBtb3N0IE1JUFMgcGxhdGZvcm1zLCB0aGUgbGlua2VyIGlzIHJlc3BvbnNpYmxlIGZvcgotZGVmaW5pbmcgdGhlIHNwZWNpYWwgc3ltYm9sIEBjb2Rle19ncH0sIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUKLUBjb2RleyRncH0gcmVnaXN0ZXIuICBJdCBtdXN0IGJlIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIHNtYWxsIGRhdGEKLXNlY3Rpb24gcGx1cyBAY29kZXsweDgwMDB9LiAgTmF0dXJhbGx5LCBpdCBzaG91bGQgb25seSBiZSBkZWZpbmVkIHdoZW4KLWRvaW5nIGEgZmluYWwgcmVsb2NhdGlvbi4gIFRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgZG9uZSBsaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi0gICRAe1JFTE9DQVRJTkcrIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgbGluZSB3b3VsZCBhcHBlYXIganVzdCBiZWZvcmUgdGhlIHNlY3Rpb25zIHdoaWNoIGNvbXBvc2UgdGhlIHNtYWxsCi1kYXRhIHNlY3Rpb24gKEBzYW1wey5zZGF0YX0sIEBzYW1wey5zYnNzfSkuICBBbGwgdGhvc2Ugc2VjdGlvbnMgd291bGQgYmUKLWNvbnRpZ3VvdXMgaW4gbWVtb3J5LgotCi1NYW55IENPRkYgc3lzdGVtcyBidWlsZCBjb25zdHJ1Y3RvciB0YWJsZXMgaW4gdGhlIGxpbmtlciBzY3JpcHQuICBUaGUKLWNvbXBpbGVyIHdpbGwgYXJyYW5nZSB0byBvdXRwdXQgdGhlIGFkZHJlc3Mgb2YgZWFjaCBnbG9iYWwgY29uc3RydWN0b3IKLWluIGEgQHNhbXB7LmN0b3J9IHNlY3Rpb24sIGFuZCB0aGUgYWRkcmVzcyBvZiBlYWNoIGdsb2JhbCBkZXN0cnVjdG9yIGluCi1hIEBzYW1wey5kdG9yfSBzZWN0aW9uICh0aGlzIGlzIGRvbmUgYnkgZGVmaW5pbmcKLUBjb2Rle0FTTV9PVVRQVVRfQ09OU1RSVUNUT1J9IGFuZCBAY29kZXtBU01fT1VUUFVUX0RFU1RSVUNUT1J9IGluIHRoZQotQGNvZGV7Z2NjfSBjb25maWd1cmF0aW9uIGZpbGVzKS4gIFRoZSBAY29kZXtnY2N9IHJ1bnRpbWUgc3VwcG9ydAotcm91dGluZXMgZXhwZWN0IHRoZSBjb25zdHJ1Y3RvciB0YWJsZSB0byBiZSBuYW1lZCBAY29kZXtfX0NUT1JfTElTVF9ffS4KLVRoZXkgZXhwZWN0IGl0IHRvIGJlIGEgbGlzdCBvZiB3b3Jkcywgd2l0aCB0aGUgZmlyc3Qgd29yZCBiZWluZyB0aGUKLWNvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcy4gIFRoZXJlIHNob3VsZCBiZSBhIHRyYWlsaW5nIHplcm8gd29yZC4KLShBY3R1YWxseSwgdGhlIGNvdW50IG1heSBiZSAtMSBpZiB0aGUgdHJhaWxpbmcgd29yZCBpcyBwcmVzZW50LCBhbmQgdGhlCi10cmFpbGluZyB3b3JkIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb3VudCBpcyBjb3JyZWN0LCBidXQsIGFzIHRoZQotQGNvZGV7Z2NjfSBiZWhhdmlvdXIgaGFzIGNoYW5nZWQgc2xpZ2h0bHkgb3ZlciB0aGUgeWVhcnMsIGl0IGlzIHNhZmVzdAotdG8gcHJvdmlkZSBib3RoKS4gIEhlcmUgaXMgYSB0eXBpY2FsIHdheSB0aGF0IG1pZ2h0IGJlIGhhbmRsZWQgaW4gYQotQGZpbGV7c2NyaXB0dGVtcGx9IGZpbGUuCi1Ac21hbGxleGFtcGxlCi0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjtAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMilAfQotICAgICRAe0NPTlNUUlVDVElORysgKiguY3RvcnMpQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoMClAfQotICAgICRAe0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjtAfQotICAgICRAe0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47QH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBMT05HKDApQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47QH0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgdXNlIG9mIEBjb2Rle0NPTlNUUlVDVElOR30gZW5zdXJlcyB0aGF0IHRoZXNlIGxpbmtlciBzY3JpcHQgY29tbWFuZHMKLXdpbGwgb25seSBhcHBlYXIgd2hlbiB0aGUgbGlua2VyIGlzIHN1cHBvc2VkIHRvIGJlIGJ1aWxkaW5nIHRoZQotY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzLiAgVGhpcyBleGFtcGxlIGlzIHdyaXR0ZW4gZm9yIGEgdGFyZ2V0Ci13aGljaCB1c2VzIDQgYnl0ZSBwb2ludGVycy4KLQotRW1iZWRkZWQgc3lzdGVtcyBvZnRlbiBuZWVkIHRvIHNldCBhIHN0YWNrIGFkZHJlc3MuICBUaGlzIGlzIG5vcm1hbGx5Ci1iZXN0IGRvbmUgYnkgdXNpbmcgdGhlIEBjb2Rle1BST1ZJREV9IGNvbnN0cnVjdCB3aXRoIGEgZGVmYXVsdCBzdGFjawotYWRkcmVzcy4gIFRoaXMgcGVybWl0cyB0aGUgdXNlciB0byBlYXNpbHkgb3ZlcnJpZGUgdGhlIHN0YWNrIGFkZHJlc3MKLXVzaW5nIHRoZSBAY29kZXstLWRlZnN5bX0gb3B0aW9uLiAgSGVyZSBpcyBhbiBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotICAkQHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX3N0YWNrID0gMHg4MDAwMDAwMCk7QH0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBAY29kZXtfX3N0YWNrfSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gdGhlIHN0YXJ0dXAKLWNvZGUgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhY2sgcG9pbnRlci4KLQotQG5vZGUgbGlua2VyIGVtdWxhdGlvbnMKLUBzZWN0aW9uIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cwotCi1FYWNoIGxpbmtlciB0YXJnZXQgdXNlcyBhbiBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCB0byBnZW5lcmF0ZSB0aGUKLWVtdWxhdGlvbiBjb2RlLiAgVGhlIG5hbWUgb2YgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzIHNldCBieSB0aGUKLUBjb2Rle1RFTVBMQVRFX05BTUV9IHZhcmlhYmxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQuICBJZiB0aGUKLUBjb2Rle1RFTVBMQVRFX05BTUV9IHZhcmlhYmxlIGlzIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGlzCi1Ac2FtcHtnZW5lcmljfS4gIElmIHRoZSB2YWx1ZSBvZiBAY29kZXtURU1QTEFURV9OQU1FfSBpcyBAdmFye3RlbXBsYXRlfSwKLUBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgdXNlIEBmaWxle2VtdWx0ZW1wbC9AdmFye3RlbXBsYXRlfS5lbX0uCi0KLU1vc3QgdGFyZ2V0cyB1c2UgdGhlIGdlbmVyaWMgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQsCi1AZmlsZXtlbXVsdGVtcGwvZ2VuZXJpYy5lbX0uICBBIGRpZmZlcmVudCBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBpcwotb25seSBuZWVkZWQgaWYgdGhlIGxpbmtlciBtdXN0IHN1cHBvcnQgdW51c3VhbCBhY3Rpb25zLCBzdWNoIGFzIGxpbmtpbmcKLWFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4KLQotVGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzIG5vcm1hbGx5IHdyaXR0ZW4gYXMgYSBzaW1wbGUgaW52b2NhdGlvbgotb2YgQGNvZGV7Y2F0fSB3aXRoIGEgaGVyZSBkb2N1bWVudC4gIFRoZSBkb2N1bWVudCB3aWxsIHVzZSBhIGZldwotdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIFR5cGljYWxseSBlYWNoIGZ1bmN0aW9uIG5hbWVzIHVzZXMgYQotc3Vic3RpdHV0aW9uIGludm9sdmluZyBAY29kZXtFTVVMQVRJT05fTkFNRX0sIGZvciBlYXNlIG9mIGRlYnVnZ2luZyB3aGVuCi10aGUgbGlua2VyIHN1cHBvcnRzIG11bHRpcGxlIGVtdWxhdGlvbnMuCi0KLUV2ZXJ5IGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBpbiB0aGUgZW1pdHRlZCBmaWxlIHNob3VsZCBiZSBzdGF0aWMuICBUaGUKLW9ubHkgZ2xvYmFsbHkgdmlzaWJsZSBvYmplY3QgbXVzdCBiZSBuYW1lZAotQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufSwgd2hlcmUgQHZhcntFTVVMQVRJT05fTkFNRX0gaXMKLXRoZSBuYW1lIG9mIHRoZSBlbXVsYXRpb24gc2V0IGluIEBmaWxle2NvbmZpZ3VyZS50Z3R9ICh0aGlzIGlzIGFsc28gdGhlCi1uYW1lIG9mIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBmaWxlIHdpdGhvdXQgdGhlIEBmaWxley5zaH0gZXh0ZW5zaW9uKS4KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlCi1AY29kZXtFTVVMQVRJT05fTkFNRX0gYmVmb3JlIGludm9raW5nIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdC4KLQotVGhlIEBjb2Rle2xkX0B2YXJ7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbn0gdmFyaWFibGUgbXVzdCBiZSBhCi1AY29kZXtzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0fSwgYXMgZGVmaW5lZCBpbiBAZmlsZXtsZGVtdWwuaH0uCi1JdCBkZWZpbmVzIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZSBpbnZva2VkIGJ5IHRoZSBsaW5rZXIsCi1hcyB3ZWxsIGFzIHN0cmluZ3MgZm9yIHRoZSBlbXVsYXRpb24gbmFtZSAobm9ybWFsbHkgc2V0IGZyb20gdGhlIHNoZWxsCi12YXJpYWJsZSBAY29kZXtFTVVMQVRJT05fTkFNRX0gYW5kIHRoZSBkZWZhdWx0IEJGRCB0YXJnZXQgbmFtZSAobm9ybWFsbHkKLXNldCBmcm9tIHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtPVVRQVVRfRk9STUFUfSB3aGljaCBpcyBub3JtYWxseSBzZXQKLWJ5IHRoZSBAZmlsZXtlbXVscGFyYW1zfSBmaWxlKS4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBjb2Rle0NPTVBJTEVfSU59IHdoZW4gaXQgaW52b2tlcyB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgZm9yIHRoZQotZGVmYXVsdCBlbXVsYXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBzaG91bGQKLWluY2x1ZGUgdGhlIGxpbmtlciBzY3JpcHRzIGRpcmVjdGx5LCBhbmQgcmV0dXJuIHRoZW0gZnJvbSB0aGUKLUBjb2Rle2dldF9zY3JpcHRzfSBlbnRyeSBwb2ludC4gIFdoZW4gdGhlIGVtdWxhdGlvbiBpcyBub3QgdGhlIGRlZmF1bHQsCi10aGUgQGNvZGV7Z2V0X3NjcmlwdHN9IGVudHJ5IHBvaW50IHNob3VsZCBqdXN0IHJldHVybiBhIGZpbGUgbmFtZS4gIFNlZQotQGZpbGV7ZW11bHRlbXBsL2dlbmVyaWMuZW19IGZvciBhbiBleGFtcGxlIG9mIGhvdyB0aGlzIGlzIGRvbmUuCi0KLUF0IHNvbWUgcG9pbnQsIHRoZSBsaW5rZXIgZW11bGF0aW9uIGVudHJ5IHBvaW50cyBzaG91bGQgYmUgZG9jdW1lbnRlZC4KLQotQG5vZGUgRW11bGF0aW9uIFdhbGt0aHJvdWdoCi1AY2hhcHRlciBBIFdhbGt0aHJvdWdoIG9mIGEgVHlwaWNhbCBFbXVsYXRpb24KLQotVGhpcyBjaGFwdGVyIGlzIHRvIGhlbHAgcGVvcGxlIHdobyBhcmUgbmV3IHRvIHRoZSB3YXkgZW11bGF0aW9ucwotaW50ZXJhY3Qgd2l0aCB0aGUgbGlua2VyLCBvciB3aG8gYXJlIHN1ZGRlbmx5IHRocnVzdCBpbnRvIHRoZSBwb3NpdGlvbgotb2YgaGF2aW5nIHRvIHdvcmsgd2l0aCBleGlzdGluZyBlbXVsYXRpb25zLiAgSXQgd2lsbCBkaXNjdXNzIHRoZSBmaWxlcwoteW91IG5lZWQgdG8gYmUgYXdhcmUgb2YuICBJdCB3aWxsIHRlbGwgeW91IHdoZW4gdGhlIGdpdmVuICJob29rcyIgaW4KLXRoZSBlbXVsYXRpb24gd2lsbCBiZSBjYWxsZWQuICBJdCB3aWxsLCBob3BlZnVsbHksIGdpdmUgeW91IGVub3VnaAotaW5mb3JtYXRpb24gYWJvdXQgd2hlbiBhbmQgaG93IHRoaW5ncyBoYXBwZW4gdGhhdCB5b3UnbGwgYmUgYWJsZSB0bwotZ2V0IGJ5LiAgQXMgYWx3YXlzLCB0aGUgc291cmNlIGlzIHRoZSBkZWZpbml0aXZlIHJlZmVyZW5jZSB0byB0aGlzLgotCi1UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBsaW5rZXIgaXMgaW4gQGZpbGV7bGRtYWluLmN9IHdoZXJlCi1AY29kZXttYWlufSBpcyBkZWZpbmVkLiAgVGhlIGJ1bGsgb2YgdGhlIGNvZGUgdGhhdCdzIGVtdWxhdGlvbgotc3BlY2lmaWMgd2lsbCBpbml0aWFsbHkgYmUgaW4gQGNvZGV7ZW11bHRlbXBsL0B2YXJ7ZW11bGF0aW9ufS5lbX0gYnV0Ci13aWxsIGVuZCB1cCBpbiBAY29kZXtlQHZhcntlbXVsYXRpb259LmN9IHdoZW4gdGhlIGJ1aWxkIGlzIGRvbmUuCi1Nb3N0IG9mIHRoZSB3b3JrIHRvIHNlbGVjdCBhbmQgaW50ZXJmYWNlIHdpdGggZW11bGF0aW9ucyBpcyBpbgotQGNvZGV7bGRlbXVsLmh9IGFuZCBAY29kZXtsZGVtdWwuY30uICBTcGVjaWZpY2FsbHksIEBjb2Rle2xkZW11bC5ofQotZGVmaW5lcyB0aGUgQGNvZGV7bGRfZW11bGF0aW9uX3hmZXJfc3RydWN0fSBzdHJ1Y3R1cmUgeW91ciBlbXVsYXRpb24KLWV4cG9ydHMuCi0KLVlvdXIgZW11bGF0aW9uIGZpbGUgZXhwb3J0cyBhIHN5bWJvbAotQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufS4gIElmIHlvdXIgZW11bGF0aW9uIGlzCi1zZWxlY3RlZCAoaXQgdXN1YWxseSBpcywgc2luY2UgdXN1YWxseSB0aGVyZSdzIG9ubHkgb25lKSwKLUBjb2Rle2xkZW11bC5jfSBzZXRzIHRoZSB2YXJpYWJsZSBAdmFye2xkX2VtdWxhdGlvbn0gdG8gcG9pbnQgdG8gaXQuCi1AY29kZXtsZGVtdWwuY30gYWxzbyBkZWZpbmVzIGEgbnVtYmVyIG9mIEFQSSBmdW5jdGlvbnMgdGhhdCBpbnRlcmZhY2UKLXRvIHlvdXIgZW11bGF0aW9uLCBsaWtlIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0gd2hpY2ggc2ltcGx5IGNhbGxzCi15b3VyIEBjb2Rle2xkX0B2YXJ7RU1VTEFUSU9OfV9lbXVsYXRpb24uYWZ0ZXJfcGFyc2V9IGZ1bmN0aW9uLiAgRm9yCi10aGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24sIHRoZSBmdW5jdGlvbnMgd2lsbCBiZSBtZW50aW9uZWQsIGJ1dCB5b3UKLXNob3VsZCBhc3N1bWUgdGhlIGluZGlyZWN0IHJlZmVyZW5jZSB0byB5b3VyIGVtdWxhdGlvbiBhbHNvLgotCi1XZSB3aWxsIGFsc28gc2tpcCBvciBnbG9zcyBvdmVyIHBhcnRzIG9mIHRoZSBsaW5rIHByb2Nlc3MgdGhhdCBkb24ndAotcmVsYXRlIHRvIGVtdWxhdGlvbnMsIGxpa2Ugc2V0dGluZyB1cCBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLQotQWZ0ZXIgaW5pdGlhbGl6YXRpb24sIEBjb2Rle21haW59IHNlbGVjdHMgYW4gZW11bGF0aW9uIGJ5IHByZS1zY2FubmluZwotdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBJdCBjYWxscyBAY29kZXtsZGVtdWxfY2hvb3NlX3RhcmdldH0gdG8KLWNob29zZSBhIHRhcmdldC4gIElmIHlvdSBzZXQgQGNvZGV7Y2hvb3NlX3RhcmdldH0gdG8KLUBjb2Rle2xkZW11bF9kZWZhdWx0X3RhcmdldH0sIGl0IHBpY2tzIHlvdXIgQGNvZGV7dGFyZ2V0X25hbWV9IGJ5Ci1kZWZhdWx0LgotCi1AY29kZXttYWlufSBjYWxscyBAY29kZXtsZGVtdWxfYmVmb3JlX3BhcnNlfSwgdGhlbiBAY29kZXtwYXJzZV9hcmdzfS4KLUBjb2Rle3BhcnNlX2FyZ3N9IGNhbGxzIEBjb2Rle2xkZW11bF9wYXJzZV9hcmdzfSBmb3IgZWFjaCBhcmcsIHdoaWNoCi1tdXN0IHVwZGF0ZSB0aGUgQGNvZGV7Z2V0b3B0fSBnbG9iYWxzIGlmIGl0IHJlY29nbml6ZXMgdGhlIGFyZ3VtZW50LgotSWYgdGhlIGVtdWxhdGlvbiBkb2Vzbid0IHJlY29nbml6ZSBpdCwgdGhlbiBwYXJzZV9hcmdzIGNoZWNrcyB0byBzZWUKLWlmIGl0IHJlY29nbml6ZXMgaXQuCi0KLU5vdyB0aGF0IHRoZSBlbXVsYXRpb24gaGFzIGhhZCBhY2Nlc3MgdG8gYWxsIGl0cyBjb21tYW5kLWxpbmUgb3B0aW9ucywKLUBjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9zZXRfc3ltYm9sc30uICBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbnkKLWluaXRpYWxpemF0aW9uIHRoYXQgbWF5IGJlIGFmZmVjdGVkIGJ5IG9wdGlvbnMuICBJdCBpcyBhbHNvIHN1cHBvc2VkCi10byBzZXQgdXAgYW55IHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhlIGVtdWxhdGlvbiBzY3JpcHQuCi0KLUBjb2Rle21haW59IG5vdyBjYWxscyBAY29kZXtsZGVtdWxfZ2V0X3NjcmlwdH0gdG8gZ2V0IHRoZSBlbXVsYXRpb24KLXNjcmlwdCB0byB1c2UgKGJhc2VkIG9uIGFyZ3VtZW50cywgbm8gZG91YnQsIEBweHJlZntFbXVsYXRpb25zfSkgYW5kCi1ydW5zIGl0LiAgV2hpbGUgcGFyc2luZywgQGNvZGV7bGRncmFtLnl9IG1heSBjYWxsIEBjb2Rle2xkZW11bF9obGx9IG9yCi1AY29kZXtsZGVtdWxfc3lzbGlifSB0byBoYW5kbGUgdGhlIEBjb2Rle0hMTH0gb3IgQGNvZGV7U1lTTElCfQotY29tbWFuZHMuICBJdCBtYXkgY2FsbCBAY29kZXtsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGV9IGlmIHlvdSBhc2tlZAotdGhlIGxpbmtlciB0byBsaW5rIGEgZmlsZSBpdCBkb2Vzbid0IHJlY29nbml6ZS4gIEl0IHdpbGwgY2FsbAotQGNvZGV7bGRlbXVsX3JlY29nbml6ZWRfZmlsZX0gZm9yIGVhY2ggZmlsZSBpdCBkb2VzIHJlY29nbml6ZSwgaW4gY2FzZQotdGhlIGVtdWxhdGlvbiB3YW50cyB0byBoYW5kbGUgc29tZSBmaWxlcyBzcGVjaWFsbHkuICBBbGwgdGhlIHdoaWxlLAotaXQncyBsb2FkaW5nIHRoZSBmaWxlcyAocG9zc2libHkgY2FsbGluZwotQGNvZGV7bGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlfSkgYW5kIHN5bWJvbHMgYW5kIHN0dWZmLiAgQWZ0ZXIgaXQncwotZG9uZSByZWFkaW5nIHRoZSBzY3JpcHQsIEBjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0uCi1Vc2UgdGhlIGFmdGVyLXBhcnNlIGhvb2sgdG8gc2V0IHVwIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzdHVmZiB0aGUKLXNjcmlwdCBtaWdodCBoYXZlIHNldCB1cCwgbGlrZSB0aGUgZW50cnkgcG9pbnQuCi0KLUBjb2Rle21haW59IG5leHQgY2FsbHMgQGNvZGV7bGFuZ19wcm9jZXNzfSBpbiBAY29kZXtsZGxhbmcuY30uICBUaGlzCi1hcHBlYXJzIHRvIGJlIHRoZSBtYWluIGNvcmUgb2YgdGhlIGxpbmtpbmcgaXRzZWxmLCBhcyBmYXIgYXMgZW11bGF0aW9uCi1ob29rcyBhcmUgY29uY2VybmVkKCopLiAgSXQgZmlyc3Qgb3BlbnMgdGhlIG91dHB1dCBmaWxlJ3MgQkZELCBjYWxsaW5nCi1AY29kZXtsZGVtdWxfc2V0X291dHB1dF9hcmNofSwgYW5kIGNhbGxzCi1AY29kZXtsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHN9IGluIGNhc2UgeW91IG5lZWQgdG8gdXNlCi1vdGhlciBtZWFucyB0byBmaW5kIG9yIGNyZWF0ZSBvYmplY3QgZmlsZXMgKGkuZS4gc2hhcmVkIGxpYnJhcmllcwotZm91bmQgb24gYSBwYXRoLCBvciBmYWtlIHN0dWIgb2JqZWN0cykuICBEZXNwaXRlIHRoZSBuYW1lLCBub2JvZHkKLWNyZWF0ZXMgb3V0cHV0IHNlY3Rpb25zIGhlcmUuCi0KLSgqKSBJbiBtb3N0IGNhc2VzLCB0aGUgQkZEIGxpYnJhcnkgZG9lcyB0aGUgYnVsayBvZiB0aGUgYWN0dWFsCi1saW5raW5nLCBoYW5kbGluZyBzeW1ib2wgdGFibGVzLCBzeW1ib2wgcmVzb2x1dGlvbiwgcmVsb2NhdGlvbnMsIGFuZAotYnVpbGRpbmcgdGhlIGZpbmFsIG91dHB1dCBmaWxlLiAgU2VlIHRoZSBCRkQgcmVmZXJlbmNlIGZvciBhbGwgdGhlCi1kZXRhaWxzLiAgWW91ciBlbXVsYXRpb24gaXMgdXN1YWxseSBjb25jZXJuZWQgbW9yZSB3aXRoIG1hbmFnaW5nCi10aGluZ3MgYXQgdGhlIGZpbGUgYW5kIHNlY3Rpb24gbGV2ZWwsIGxpa2UgInB1dCB0aGlzIGhlcmUsIGFkZCB0aGlzCi1zZWN0aW9uIiwgZXRjLgotCi1OZXh0LCB0aGUgb2JqZWN0cyB0byBiZSBsaW5rZWQgYXJlIG9wZW5lZCBhbmQgQkZEcyBjcmVhdGVkIGZvciB0aGVtLAotYW5kIEBjb2Rle2xkZW11bF9hZnRlcl9vcGVufSBpcyBjYWxsZWQuICBBdCB0aGlzIHBvaW50LCB5b3UgaGF2ZSBhbGwKLXRoZSBvYmplY3RzIGFuZCBzeW1ib2xzIGxvYWRlZCwgYnV0IG5vbmUgb2YgdGhlIGRhdGEgaGFzIGJlZW4gcGxhY2VkCi15ZXQuCi0KLU5leHQgY29tZXMgdGhlIEJpZyBMaW5raW5nIFRoaW5neSAoZXhjZXB0IGZvciB0aGUgcGFydHMgQkZEIGRvZXMpLgotQWxsIGlucHV0IHNlY3Rpb25zIGFyZSBtYXBwZWQgdG8gb3V0cHV0IHNlY3Rpb25zIGFjY29yZGluZyB0byB0aGUKLXNjcmlwdC4gIElmIGEgc2VjdGlvbiBkb2Vzbid0IGdldCBtYXBwZWQgYnkgZGVmYXVsdCwKLUBjb2Rle2xkZW11bF9wbGFjZV9vcnBoYW59IHdpbGwgZ2V0IGNhbGxlZCB0byBmaWd1cmUgb3V0IHdoZXJlIGl0IGdvZXMuCi1OZXh0IGl0IGZpZ3VyZXMgb3V0IHRoZSBvZmZzZXRzIGZvciBlYWNoIHNlY3Rpb24sIGNhbGxpbmcKLUBjb2Rle2xkZW11bF9iZWZvcmVfYWxsb2NhdGlvbn0gYmVmb3JlIGFuZAotQGNvZGV7bGRlbXVsX2FmdGVyX2FsbG9jYXRpb259IGFmdGVyIGRlY2lkaW5nIHdoZXJlIGVhY2ggaW5wdXQgc2VjdGlvbgotZW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb25zLgotCi1UaGUgbGFzdCBwYXJ0IG9mIEBjb2Rle2xhbmdfcHJvY2Vzc30gaXMgdG8gZmlndXJlIG91dCBhbGwgdGhlIHN5bWJvbHMnCi12YWx1ZXMuICBBZnRlciBhc3NpZ25pbmcgZmluYWwgdmFsdWVzIHRvIHRoZSBzeW1ib2xzLAotQGNvZGV7bGRlbXVsX2ZpbmlzaH0gaXMgY2FsbGVkLCBhbmQgYWZ0ZXIgdGhhdCwgYW55IHVuZGVmaW5lZCBzeW1ib2xzCi1hcmUgdHVybmVkIGludG8gZmF0YWwgZXJyb3JzLgotCi1PSywgYmFjayB0byBAY29kZXttYWlufSwgd2hpY2ggY2FsbHMgQGNvZGV7bGR3cml0ZX0gaW4KLUBmaWxle2xkd3JpdGUuY30uICBAY29kZXtsZHdyaXRlfSBjYWxscyBCRkQncyBmaW5hbF9saW5rLCB3aGljaCBkb2VzCi1hbGwgdGhlIHJlbG9jYXRpb24gZml4dXBzIGFuZCB3cml0ZXMgdGhlIG91dHB1dCBiZmQgdG8gZGlzaywgYW5kIHdlJ3JlCi1kb25lLgotCi1JbiBzdW1tYXJ5LAotCi1AaXRlbWl6ZSBAYnVsbGV0Ci0KLUBpdGVtIEBjb2Rle21haW4oKX0gaW4gQGZpbGV7bGRtYWluLmN9Ci1AaXRlbSBAZmlsZXtlbXVsdGVtcGwvQHZhcntFTVVMQVRJT059LmVtfSBoYXMgeW91ciBjb2RlCi1AaXRlbSBAY29kZXtsZGVtdWxfY2hvb3NlX3RhcmdldH0gKGRlZmF1bHRzIHRvIHlvdXIgQGNvZGV7dGFyZ2V0X25hbWV9KQotQGl0ZW0gQGNvZGV7bGRlbXVsX2JlZm9yZV9wYXJzZX0KLUBpdGVtIFBhcnNlIGFyZ3YsIGNhbGxzIEBjb2Rle2xkZW11bF9wYXJzZV9hcmdzfSBmb3IgZWFjaAotQGl0ZW0gQGNvZGV7bGRlbXVsX3NldF9zeW1ib2xzfQotQGl0ZW0gQGNvZGV7bGRlbXVsX2dldF9zY3JpcHR9Ci1AaXRlbSBwYXJzZSBzY3JpcHQKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX2hsbH0gb3IgQGNvZGV7bGRlbXVsX3N5c2xpYn0KLUBpdGVtIG1heSBjYWxsIEBjb2Rle2xkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZX0KLUBlbmQgaXRlbWl6ZQotCi1AaXRlbSBAY29kZXtsZGVtdWxfYWZ0ZXJfcGFyc2V9Ci1AaXRlbSBAY29kZXtsYW5nX3Byb2Nlc3MoKX0gaW4gQGZpbGV7bGRsYW5nLmN9Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIGNyZWF0ZSBAY29kZXtvdXRwdXRfYmZkfQotQGl0ZW0gQGNvZGV7bGRlbXVsX3NldF9vdXRwdXRfYXJjaH0KLUBpdGVtIEBjb2Rle2xkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50c30KLUBpdGVtIHJlYWQgb2JqZWN0cywgY3JlYXRlIGlucHV0IGJmZHMgLSBhbGwgc3ltYm9scyBleGlzdCwgYnV0IGhhdmUgbm8gdmFsdWVzCi1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGV9Ci1AaXRlbSB3aWxsIGNhbGwgQGNvZGV7bGRlbXVsX3JlY29nbml6ZWRfZmlsZX0KLUBpdGVtIEBjb2Rle2xkZW11bF9hZnRlcl9vcGVufQotQGl0ZW0gbWFwIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucwotQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX3BsYWNlX29ycGhhbn0gZm9yIHJlbWFpbmluZyBzZWN0aW9ucwotQGl0ZW0gQGNvZGV7bGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9ufQotQGl0ZW0gZ2l2ZXMgaW5wdXQgc2VjdGlvbnMgb2Zmc2V0cyBpbnRvIG91dHB1dCBzZWN0aW9ucywgcGxhY2VzIG91dHB1dCBzZWN0aW9ucwotQGl0ZW0gQGNvZGV7bGRlbXVsX2FmdGVyX2FsbG9jYXRpb259IC0gc2VjdGlvbiBhZGRyZXNzZXMgdmFsaWQKLUBpdGVtIGFzc2lnbnMgdmFsdWVzIHRvIHN5bWJvbHMKLUBpdGVtIEBjb2Rle2xkZW11bF9maW5pc2h9IC0gc3ltYm9sIHZhbHVlcyB2YWxpZAotQGVuZCBpdGVtaXplCi0KLUBpdGVtIG91dHB1dCBiZmQgaXMgd3JpdHRlbiB0byBkaXNrCi0KLUBlbmQgaXRlbWl6ZQotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2xkL2xkbGFuZy5jIGIvbGQvbGRsYW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDNiNDcuLjAwMDAwMDAKLS0tIGEvbGQvbGRsYW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTI2ICswLDAgQEAKLS8qIExpbmtlciBjb21tYW5kIGxhbmd1YWdlIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJmbm1hdGNoLmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qIEZPUldBUkRTICovCi1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbmV3X3N0YXRlbWVudCBQQVJBTVMgKChlbnVtIHN0YXRlbWVudF9lbnVtLAotCQkJCQkJCSBzaXplX3QsCi0JCQkJCQkJIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSopKTsKLQotCi0vKiBMT0NBTFMgKi8KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBzdGF0X29ic3RhY2s7Ci0KLSNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCi1zdGF0aWMgQ09OU1QgY2hhciAqc3RhcnR1cF9maWxlOwotc3RhdGljIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBpbnB1dF9maWxlX2NoYWluOwotc3RhdGljIGJvb2xlYW4gcGxhY2VkX2NvbW1vbnMgPSBmYWxzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpkZWZhdWx0X2NvbW1vbl9zZWN0aW9uOwotc3RhdGljIGJvb2xlYW4gbWFwX29wdGlvbl9mOwotc3RhdGljIGJmZF92bWEgcHJpbnRfZG90Owotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpcnN0X2ZpbGU7Ci1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Owotc3RhdGljIENPTlNUIGNoYXIgKmN1cnJlbnRfdGFyZ2V0Owotc3RhdGljIENPTlNUIGNoYXIgKm91dHB1dF90YXJnZXQ7Ci1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIHN0YXRlbWVudF9saXN0Owotc3RhdGljIHN0cnVjdCBsYW5nX3BoZHIgKmxhbmdfcGhkcl9saXN0OwotCi1zdGF0aWMgdm9pZCBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIKLSAgUEFSQU1TICgodm9pZCAoKmZ1bmMpIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopLAotCSAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMpKTsKLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpuZXdfYWZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBmaWxlX3R5cGUsCi0JICAgY29uc3QgY2hhciAqdGFyZ2V0LCBib29sZWFuIGFkZF90b19saXN0KSk7Ci1zdGF0aWMgdm9pZCBpbml0X29zIFBBUkFNUyAoKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnMpKTsKLXN0YXRpYyB2b2lkIGV4cF9pbml0X29zIFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIHZvaWQgc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICphbHJlYWR5X2xpbmtlZF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLXN0YXRpYyB2b2lkIGFscmVhZHlfbGlua2VkX3RhYmxlX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgYWxyZWFkeV9saW5rZWRfdGFibGVfZnJlZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiB3aWxkY2FyZHAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqd2lsZF9zb3J0Ci0gIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosCi0JICAgYXNlY3Rpb24gKikpOwotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmxvb2t1cF9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLXN0YXRpYyB2b2lkIGxvYWRfc3ltYm9scyBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeSwKLQkJCQkgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCB3aWxkIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqcywKLQkJCSAgY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqZmlsZSwKLQkJCSAgY29uc3QgY2hhciAqdGFyZ2V0LAotCQkJICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXQpKTsKLXN0YXRpYyBiZmQgKm9wZW5fb3V0cHV0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLXN0YXRpYyB2b2lkIGxkbGFuZ19vcGVuX291dHB1dCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzdGF0ZW1lbnQpKTsKLXN0YXRpYyB2b2lkIG9wZW5faW5wdXRfYmZkcwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzdGF0ZW1lbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIGxhbmdfcmVhc29uYWJsZV9kZWZhdWx0cyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3BsYWNlX3VuZGVmaW5lZHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAotCSAgIGNvbnN0IGNoYXIgKnRhcmdldCwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotICBQQVJBTVMgKChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgobGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICphc3NpZ25tZW50LAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnB1dF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqc3RhdG0pKTsKLXN0YXRpYyBib29sZWFuIHByaW50X29uZV9zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnB1dF9zZWN0aW9uIFBBUkFNUyAoKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppbikpOwotc3RhdGljIHZvaWQgcHJpbnRfZmlsbF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19maWxsX3N0YXRlbWVudF90eXBlICpmaWxsKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9kYXRhX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2RhdGFfc3RhdGVtZW50X3R5cGUgKmRhdGEpKTsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHJlc3Nfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9yZWxvY19zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcmVsb2MpKTsKLXN0YXRpYyB2b2lkIHByaW50X3BhZGRpbmdfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZSAqcykpOwotc3RhdGljIHZvaWQgcHJpbnRfd2lsZF9zdGF0ZW1lbnQKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICp3LAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9ncm91cAotICBQQVJBTVMgKChsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlICosIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgcHJpbnRfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCi0JCQkJICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcykpOwotc3RhdGljIHZvaWQgcHJpbnRfc3RhdGVtZW50X2xpc3QgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcywKLQkJCQkJICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcykpOwotc3RhdGljIHZvaWQgcHJpbnRfc3RhdGVtZW50cyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkX3ZtYSBpbnNlcnRfcGFkIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKip0aGlzX3B0ciwKLQkJCQkgICBmaWxsX3R5cGUgZmlsbCwgdW5zaWduZWQgaW50IHBvd2VyLAotCQkJCSAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgYmZkX3ZtYSBkb3QpKTsKLXN0YXRpYyBiZmRfdm1hIHNpemVfaW5wdXRfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqdGhpc19wdHIsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCSAgIGZpbGxfdHlwZSBmaWxsLCBiZmRfdm1hIGRvdCwgYm9vbGVhbiByZWxheCkpOwotc3RhdGljIHZvaWQgbGFuZ19maW5pc2ggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgaWdub3JlX2JmZF9lcnJvcnMgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLXN0YXRpYyB2b2lkIGxhbmdfY2hlY2sgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19jb21tb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gbGFuZ19vbmVfY29tbW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgbGFuZ19wbGFjZV9vcnBoYW5zIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgdG9wb3dlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfc2V0X3N0YXJ0b2YgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcmVzZXRfbWVtb3J5X3JlZ2lvbnMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19yZWNvcmRfcGhkcnMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19nY193aWxkCi0gIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgbGFuZ19nY19zZWN0aW9uc18xIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgbGFuZ19nY19zZWN0aW9ucyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2RvX3ZlcnNpb25fZXhwb3J0c19zZWN0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgUEFSQU1TICgodm9pZCkpOwotCi10eXBlZGVmIHZvaWQgKCpjYWxsYmFja190KSBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwKLQkJCQkgICAgYXNlY3Rpb24gKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLAotCQkJCSAgICB2b2lkICopKTsKLXN0YXRpYyB2b2lkIHdhbGtfd2lsZF9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqLCBjb25zdCBjaGFyICosCi0JICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBjYWxsYmFja190LCB2b2lkICopKTsKLXN0YXRpYyB2b2lkIHdhbGtfd2lsZF9maWxlCi0gIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqLCBjb25zdCBjaGFyICosCi0JICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBjYWxsYmFja190LCB2b2lkICopKTsKLQotc3RhdGljIGludCAgICBnZXRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGJmZF90YXJnZXQgKiwgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCAgIHN0cmljcHkgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkICAgc3RyY3V0IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgaW50ICAgIG5hbWVfY29tcGFyZSBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOwotc3RhdGljIGludCAgICBjbG9zZXN0X3RhcmdldF9tYXRjaCBQQVJBTVMgKChjb25zdCBiZmRfdGFyZ2V0ICosIHZvaWQgKikpOwotc3RhdGljIGNoYXIgKiBnZXRfZmlyc3RfaW5wdXRfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLQkJCQkJCi0vKiBFWFBPUlRTICovCi1sYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICphYnNfb3V0cHV0X3NlY3Rpb247Ci1sYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnN0YXRfcHRyID0gJnN0YXRlbWVudF9saXN0OwotbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGZpbGVfY2hhaW4gPSB7IE5VTEwsIE5VTEwgfTsKLWNvbnN0IGNoYXIgKmVudHJ5X3N5bWJvbCA9IE5VTEw7Ci1ib29sZWFuIGVudHJ5X2Zyb21fY21kbGluZTsKLWJvb2xlYW4gbGFuZ19oYXNfaW5wdXRfZmlsZSA9IGZhbHNlOwotYm9vbGVhbiBoYWRfb3V0cHV0X2ZpbGVuYW1lID0gZmFsc2U7Ci1ib29sZWFuIGxhbmdfZmxvYXRfZmxhZyA9IGZhbHNlOwotYm9vbGVhbiBkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZSA9IGZhbHNlOwotc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5vY3Jvc3NyZWZfbGlzdDsKLQotZXRyZWVfdHlwZSAqYmFzZTsgLyogUmVsb2NhdGlvbiBiYXNlIC0gb3IgbnVsbCAqLwotCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBjYXQoYSxiKSBhIyNiCi0jZWxzZQotI2RlZmluZSBjYXQoYSxiKSBhLyoqL2IKLSNlbmRpZgotCi0jZGVmaW5lIG5ld19zdGF0KHgseSkgKGNhdCh4LF90eXBlKSopIG5ld19zdGF0ZW1lbnQoY2F0KHgsX2VudW0pLCBzaXplb2YoY2F0KHgsX3R5cGUpKSx5KQotCi0jZGVmaW5lIG91dHNpZGVfc2VjdGlvbl9hZGRyZXNzKHEpICggKHEpLT5vdXRwdXRfb2Zmc2V0ICsgKHEpLT5vdXRwdXRfc2VjdGlvbi0+dm1hKQotCi0jZGVmaW5lIG91dHNpZGVfc3ltYm9sX2FkZHJlc3MocSkgKChxKS0+dmFsdWUgKyAgIG91dHNpZGVfc2VjdGlvbl9hZGRyZXNzKHEtPnNlY3Rpb24pKQotCi0jZGVmaW5lIFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIICgxNikKLQotUFRSCi1zdGF0X2FsbG9jIChzaXplKQotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfYWxsb2MgKCZzdGF0X29ic3RhY2ssIHNpemUpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgR2VuZXJpYyB0cmF2ZXJzYWwgcm91dGluZXMgZm9yIGZpbmRpbmcgbWF0Y2hpbmcgc2VjdGlvbnMuCi0qLwotCi1zdGF0aWMgdm9pZAotd2Fsa193aWxkX3NlY3Rpb24gKHB0ciwgc2VjdGlvbiwgZmlsZSwgY2FsbGJhY2ssIGRhdGEpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqcHRyOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBjYWxsYmFja190IGNhbGxiYWNrOwotICAgICB2b2lkICpkYXRhOwotewotICAvKiBEb24ndCBwcm9jZXNzIHNlY3Rpb25zIGZyb20gZmlsZXMgd2hpY2ggd2VyZSBleGNsdWRlZC4gKi8KLSAgaWYgKHB0ci0+ZXhjbHVkZV9maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJvb2xlYW4gbWF0Y2g7Ci0KLSAgICAgIGlmICh3aWxkY2FyZHAgKHB0ci0+ZXhjbHVkZV9maWxlbmFtZSkpCi0gICAgICAgICBtYXRjaCA9IGZubWF0Y2ggKHB0ci0+ZXhjbHVkZV9maWxlbmFtZSwgZmlsZS0+ZmlsZW5hbWUsIDApID09IDAgPyB0cnVlIDogZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgICBtYXRjaCA9IHN0cmNtcCAocHRyLT5leGNsdWRlX2ZpbGVuYW1lLCBmaWxlLT5maWxlbmFtZSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLQotICAgICAgaWYgKG1hdGNoKQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChmaWxlLT5qdXN0X3N5bXNfZmxhZyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgICAgIGJvb2xlYW4gd2lsZGNhcmQ7Ci0KLSAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0Jd2lsZGNhcmQgPSBmYWxzZTsKLSAgICAgIGVsc2UKLQl3aWxkY2FyZCA9IHdpbGRjYXJkcCAoc2VjdGlvbik7Ci0KLSAgICAgIGZvciAocyA9IGZpbGUtPnRoZV9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGJvb2xlYW4gbWF0Y2g7Ci0KLQkgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JICAgIG1hdGNoID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGZpbGUtPnRoZV9iZmQsIHMpOwotCSAgICAgIGlmICh3aWxkY2FyZCkKLQkJbWF0Y2ggPSBmbm1hdGNoIChzZWN0aW9uLCBuYW1lLCAwKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotCSAgICAgIGVsc2UKLQkJbWF0Y2ggPSBzdHJjbXAgKHNlY3Rpb24sIG5hbWUpID09IDAgPyB0cnVlIDogZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKG1hdGNoKQotCSAgICAoKmNhbGxiYWNrKSAocHRyLCBzLCBmaWxlLCBkYXRhKTsKLQl9Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgYSB3aWxkIHN0YXRlbWVudCBmb3IgYSBzaW5nbGUgZmlsZSBGLiAgKi8KLQotc3RhdGljIHZvaWQKLXdhbGtfd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotICAgICBjYWxsYmFja190IGNhbGxiYWNrOwotICAgICB2b2lkICpkYXRhOwotewotICBpZiAoZi0+dGhlX2JmZCA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9jaGVja19mb3JtYXQgKGYtPnRoZV9iZmQsIGJmZF9hcmNoaXZlKSkKLSAgICB3YWxrX3dpbGRfc2VjdGlvbiAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotICBlbHNlCi0gICAgewotICAgICAgYmZkICptZW1iZXI7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYW4gYXJjaGl2ZSBmaWxlLiAgV2UgbXVzdCBtYXAgZWFjaCBtZW1iZXIgb2YgdGhlCi0JIGFyY2hpdmUgc2VwYXJhdGVseS4gICovCi0gICAgICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmLT50aGVfYmZkLCAoYmZkICopIE5VTEwpOwotICAgICAgd2hpbGUgKG1lbWJlciAhPSBOVUxMKQotCXsKLQkgIC8qIFdoZW4gbG9va3VwX25hbWUgaXMgY2FsbGVkLCBpdCB3aWxsIGNhbGwgdGhlIGFkZF9zeW1ib2xzCi0JICAgICBlbnRyeSBwb2ludCBmb3IgdGhlIGFyY2hpdmUuICBGb3IgZWFjaCBlbGVtZW50IG9mIHRoZQotCSAgICAgYXJjaGl2ZSB3aGljaCBpcyBpbmNsdWRlZCwgQkZEIHdpbGwgY2FsbCBsZGxhbmdfYWRkX2ZpbGUsCi0JICAgICB3aGljaCB3aWxsIHNldCB0aGUgdXNyZGF0YSBmaWVsZCBvZiB0aGUgbWVtYmVyIHRvIHRoZQotCSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnQuICAqLwotCSAgaWYgKG1lbWJlci0+dXNyZGF0YSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgd2Fsa193aWxkX3NlY3Rpb24gKHMsIHNlY3Rpb24sCi0JCQkJIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIG1lbWJlci0+dXNyZGF0YSwKLQkJCQkgY2FsbGJhY2ssIGRhdGEpOwotCSAgICB9Ci0KLQkgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYtPnRoZV9iZmQsIG1lbWJlcik7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdhbGtfd2lsZCAocywgc2VjdGlvbiwgZmlsZSwgY2FsbGJhY2ssIGRhdGEpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqczsKLSAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgY2FsbGJhY2tfdCBjYWxsYmFjazsKLSAgICAgdm9pZCAqZGF0YTsKLXsKLSAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQZXJmb3JtIHRoZSBpdGVyYXRpb24gb3ZlciBhbGwgZmlsZXMgaW4gdGhlIGxpc3QuICAqLwotICAgICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGYpCi0JewotCSAgd2Fsa193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICh3aWxkY2FyZHAgKGZpbGUpKQotICAgIHsKLSAgICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChmKQotCXsKLQkgIGlmIChmbm1hdGNoIChmaWxlLCBmLT5maWxlbmFtZSwgRk5NX0ZJTEVfTkFNRSkgPT0gMCkKLQkgICAgd2Fsa193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKLQotICAgICAgLyogUGVyZm9ybSB0aGUgaXRlcmF0aW9uIG92ZXIgYSBzaW5nbGUgZmlsZS4gICovCi0gICAgICBmID0gbG9va3VwX25hbWUgKGZpbGUpOwotICAgICAgd2Fsa193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKTsKLSAgICB9Ci19ICAKLSAgICAgCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgd2Fsa3MgdGhlIHBhcnNlIHRyZWUgYW5kIGNhbGxzIHRoZSBwcm92aWRlZAotICBmdW5jdGlvbiBmb3IgZWFjaCBub2RlCi0qLwotCi1zdGF0aWMgdm9pZAotbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyIChmdW5jLCBzKQotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGZ1bmMgKHMpOwotCi0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyIChmdW5jLCBjb25zdHJ1Y3Rvcl9saXN0LmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyCi0JICAgIChmdW5jLAotCSAgICAgcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIKLQkgICAgKGZ1bmMsCi0JICAgICBzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciAoZnVuYywKLQkJCQkJICBzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBGQUlMICgpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotdm9pZAotbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGZ1bmMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyIChmdW5jLAotCQkJCSAgc3RhdGVtZW50X2xpc3QuaGVhZCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkCi1sYW5nX2xpc3RfaW5pdCAobGlzdCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpsaXN0OwotewotICBsaXN0LT5oZWFkID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgbGlzdC0+dGFpbCA9ICZsaXN0LT5oZWFkOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBidWlsZCBhIG5ldyBzdGF0ZW1lbnQgbm9kZSBmb3IgdGhlIHBhcnNlIHRyZWUKLQotICovCi0KLXN0YXRpYwotbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqCi1uZXdfc3RhdGVtZW50ICh0eXBlLCBzaXplLCBsaXN0KQotICAgICBlbnVtIHN0YXRlbWVudF9lbnVtIHR5cGU7Ci0gICAgIHNpemVfdCBzaXplOwotICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKiBsaXN0OwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXcgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKQotICBzdGF0X2FsbG9jIChzaXplKTsKLQotICBuZXctPmhlYWRlci50eXBlID0gdHlwZTsKLSAgbmV3LT5oZWFkZXIubmV4dCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAobGlzdCwgbmV3LCAmbmV3LT5oZWFkZXIubmV4dCk7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qCi0gIEJ1aWxkIGEgbmV3IGlucHV0IGZpbGUgbm9kZSBmb3IgdGhlIGxhbmd1YWdlLiBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzCi0gIGluIHdoaWNoIHdlIHRyZWF0IGFuIGlucHV0IGZpbGUsIGVnLCB3ZSBvbmx5IGxvb2sgYXQgc3ltYm9scywgb3IKLSAgcHJlZml4IGl0IHdpdGggYSAtbCBldGMuCi0KLSAgV2UgY2FuIGJlIHN1cHBsaWVkIHdpdGggcmVxdWVzdHMgZm9yIGlucHV0IGZpbGVzIG1vcmUgdGhhbiBvbmNlOwotICB0aGV5IG1heSwgZm9yIGV4YW1wbGUgYmUgc3BsaXQgb3ZlciBzZXJ2ZXJhbCBsaW5lcyBsaWtlIGZvby5vKC50ZXh0KQotICBmb28ubyguZGF0YSkgZXRjLCBzbyB3aGVuIGFza2VkIGZvciBhIGZpbGUgd2UgY2hlY2sgdGhhdCB3ZSBoYXZuJ3QKLSAgZ290IGl0IGFscmVhZHkgc28gd2UgZG9uJ3QgZHVwbGljYXRlIHRoZSBiZmQuCi0KLSAqLwotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKgotbmV3X2FmaWxlIChuYW1lLCBmaWxlX3R5cGUsIHRhcmdldCwgYWRkX3RvX2xpc3QpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgZmlsZV90eXBlOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci0gICAgIGJvb2xlYW4gYWRkX3RvX2xpc3Q7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnA7Ci0KLSAgaWYgKGFkZF90b19saXN0KQotICAgIHAgPSBuZXdfc3RhdCAobGFuZ19pbnB1dF9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHAgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKLQkgICBzdGF0X2FsbG9jIChzaXplb2YgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpKSk7Ci0gICAgICBwLT5oZWFkZXIubmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSB0cnVlOwotICBwLT50YXJnZXQgPSB0YXJnZXQ7Ci0gIHN3aXRjaCAoZmlsZV90eXBlKQotICAgIHsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19zeW1ib2xzX29ubHlfZW51bToKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKLSAgICAgIHAtPnJlYWwgPSB0cnVlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSB0cnVlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IGZhbHNlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bToKLSAgICAgIHAtPmlzX2FyY2hpdmUgPSB0cnVlOwotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+cmVhbCA9IHRydWU7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IGNvbmNhdCAoIi1sIiwgbmFtZSwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bToKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKLSAgICAgIHAtPnJlYWwgPSBmYWxzZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gdHJ1ZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bToKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKLSAgICAgIHAtPnJlYWwgPSB0cnVlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBGQUlMICgpOwotICAgIH0KLSAgcC0+dGhlX2JmZCA9IChiZmQgKikgTlVMTDsKLSAgcC0+YXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgTlVMTDsKLSAgcC0+bmV4dF9yZWFsX2ZpbGUgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICBwLT5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgcC0+c3ltYm9sX2NvdW50ID0gMDsKLSAgcC0+ZHluYW1pYyA9IGNvbmZpZy5keW5hbWljX2xpbms7Ci0gIHAtPndob2xlX2FyY2hpdmUgPSB3aG9sZV9hcmNoaXZlOwotICBwLT5sb2FkZWQgPSBmYWxzZTsKLSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmaW5wdXRfZmlsZV9jaGFpbiwKLQkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBwLAotCQkJICZwLT5uZXh0X3JlYWxfZmlsZSk7Ci0gIHJldHVybiBwOwotfQotCi1sYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICoKLWxhbmdfYWRkX2lucHV0X2ZpbGUgKG5hbWUsIGZpbGVfdHlwZSwgdGFyZ2V0KQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotewotICBsYW5nX2hhc19pbnB1dF9maWxlID0gdHJ1ZTsKLSAgcmV0dXJuIG5ld19hZmlsZSAobmFtZSwgZmlsZV90eXBlLCB0YXJnZXQsIHRydWUpOwotfQotCi0vKiBCdWlsZCBlbm91Z2ggc3RhdGUgc28gdGhhdCB0aGUgcGFyc2VyIGNhbiBidWlsZCBpdHMgdHJlZSAqLwotdm9pZAotbGFuZ19pbml0ICgpCi17Ci0gIG9ic3RhY2tfYmVnaW4gKCZzdGF0X29ic3RhY2ssIDEwMDApOwotCi0gIHN0YXRfcHRyID0gJnN0YXRlbWVudF9saXN0OwotCi0gIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgbGFuZ19saXN0X2luaXQgKCZpbnB1dF9maWxlX2NoYWluKTsKLSAgbGFuZ19saXN0X2luaXQgKCZsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0gIGxhbmdfbGlzdF9pbml0ICgmZmlsZV9jaGFpbik7Ci0gIGZpcnN0X2ZpbGUgPSBsYW5nX2FkZF9pbnB1dF9maWxlICgoY2hhciAqKSBOVUxMLAotCQkJCSAgICBsYW5nX2lucHV0X2ZpbGVfaXNfbWFya2VyX2VudW0sCi0JCQkJICAgIChjaGFyICopIE5VTEwpOwotICBhYnNfb3V0cHV0X3NlY3Rpb24gPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKEJGRF9BQlNfU0VDVElPTl9OQU1FKTsKLQotICBhYnNfb3V0cHV0X3NlY3Rpb24tPmJmZF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBBIHJlZ2lvbiBpcyBhbiBhcmVhIG9mIG1lbW9yeSBkZWNsYXJlZCB3aXRoIHRoZQotIE1FTU9SWSB7ICBuYW1lOm9yZz1leHAsIGxlbj1leHAgLi4uIH0KLSBzeW50YXguCi0KLSBXZSBtYWludGFpbiBhIGxpc3Qgb2YgYWxsIHRoZSByZWdpb25zIGhlcmUKLQotIElmIG5vIHJlZ2lvbnMgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2NyaXB0LCB0aGVuIHRoZSBkZWZhdWx0IGlzIHVzZWQKLSB3aGljaCBpcyBjcmVhdGVkIHdoZW4gbG9va2VkIHVwIHRvIGJlIHRoZSBlbnRpcmUgZGF0YSBzcGFjZQotKi8KLQotc3RhdGljIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLXN0YXRpYyBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKmxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0X3RhaWwgPSAmbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0KLWxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICoKLWxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Ci17Ci0gIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpwOwotCi0gIGZvciAocCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotICAgICAgIHAgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICAgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocC0+bmFtZSwgbmFtZSkgPT0gMCkKLQl7Ci0JICByZXR1cm4gcDsKLQl9Ci0gICAgfQotCi0jaWYgMAotICAvKiBUaGlzIGNvZGUgdXNlZCB0byBhbHdheXMgdXNlIHRoZSBmaXJzdCByZWdpb24gaW4gdGhlIGxpc3QgYXMgdGhlCi0gICAgIGRlZmF1bHQgcmVnaW9uLiAgSSBjaGFuZ2VkIGl0IHRvIGluc3RlYWQgdXNlIGEgcmVnaW9uCi0gICAgIGVuY29tcGFzc2luZyBhbGwgb2YgbWVtb3J5IGFzIHRoZSBkZWZhdWx0IHJlZ2lvbi4gIFRoaXMgcGVybWl0cwotICAgICBOT0xPQUQgc2VjdGlvbnMgdG8gd29yayByZWFzb25hYmx5IHdpdGhvdXQgcmVxdWlyaW5nIGEgcmVnaW9uLgotICAgICBQZW9wbGUgc2hvdWxkIHNwZWNpZnkgd2hhdCByZWdpb24gdGhleSBtZWFuLCBpZiB0aGV5IHJlYWxseSB3YW50Ci0gICAgIGEgcmVnaW9uLiAgKi8KLSAgaWYgKHN0cmNtcCAobmFtZSwgIipkZWZhdWx0KiIpID09IDApCi0gICAgewotICAgICAgaWYgKGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0ICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMKQotCXsKLQkgIHJldHVybiBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgewotICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpuZXcgPQotICAgIChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlKSk7Ci0KLSAgICBuZXctPm5hbWUgPSBidXlzdHJpbmcgKG5hbWUpOwotICAgIG5ldy0+bmV4dCA9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotCi0gICAgKmxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0X3RhaWwgPSBuZXc7Ci0gICAgbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3RfdGFpbCA9ICZuZXctPm5leHQ7Ci0gICAgbmV3LT5vcmlnaW4gPSAwOwotICAgIG5ldy0+ZmxhZ3MgPSAwOwotICAgIG5ldy0+bm90X2ZsYWdzID0gMDsKLSAgICBuZXctPmxlbmd0aCA9IH4oYmZkX3NpemVfdHlwZSkwOwotICAgIG5ldy0+Y3VycmVudCA9IDA7Ci0gICAgbmV3LT5oYWRfZnVsbF9tZXNzYWdlID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gbmV3OwotICB9Ci19Ci0KLQotbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKgotbGFuZ19tZW1vcnlfZGVmYXVsdCAoc2VjdGlvbikKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpwOwotCi0gIGZsYWd3b3JkIHNlY19mbGFncyA9IHNlY3Rpb24tPmZsYWdzOwotCi0gIC8qIE92ZXJyaWRlIFNFQ19EQVRBIHRvIG1lYW4gYSB3cml0YWJsZSBzZWN0aW9uLiAgKi8KLSAgaWYgKChzZWNfZmxhZ3MgJiAoU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUpKSA9PSBTRUNfQUxMT0MpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19EQVRBOwotCi0gIGZvciAocCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotICAgICAgIHAgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICAgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKChwLT5mbGFncyAmIHNlY19mbGFncykgIT0gMAotCSAgJiYgKHAtPm5vdF9mbGFncyAmIHNlY19mbGFncykgPT0gMCkKLQl7Ci0JICByZXR1cm4gcDsKLQl9Ci0gICAgfQotICByZXR1cm4gbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAoIipkZWZhdWx0KiIpOwotfQotCi1sYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICoKLWxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqdTsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqbG9va3VwOwotCi0gIGZvciAodSA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmhlYWQ7Ci0gICAgICAgdSAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICAgICAgIHUgPSBsb29rdXAtPm5leHQpCi0gICAgewotICAgICAgbG9va3VwID0gJnUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGxvb2t1cC0+bmFtZSkgPT0gMCkKLQl7Ci0JICByZXR1cm4gbG9va3VwOwotCX0KLSAgICB9Ci0gIHJldHVybiAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOwotfQotCi1sYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICoKLWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqbG9va3VwOwotCi0gIGxvb2t1cCA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAobmFtZSk7Ci0gIGlmIChsb29rdXAgPT0gKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgTlVMTCkKLSAgICB7Ci0KLSAgICAgIGxvb2t1cCA9IChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopCi0JbmV3X3N0YXQgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0gICAgICBsb29rdXAtPnJlZ2lvbiA9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgbG9va3VwLT5maWxsID0gMDsKLSAgICAgIGxvb2t1cC0+YmxvY2tfdmFsdWUgPSAxOwotICAgICAgbG9va3VwLT5uYW1lID0gbmFtZTsKLQotICAgICAgbG9va3VwLT5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+YmZkX3NlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+cHJvY2Vzc2VkID0gZmFsc2U7Ci0gICAgICBsb29rdXAtPnNlY3R5cGUgPSBub3JtYWxfc2VjdGlvbjsKLSAgICAgIGxvb2t1cC0+YWRkcl90cmVlID0gKGV0cmVlX3R5cGUgKikgTlVMTDsKLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbG9va3VwLT5jaGlsZHJlbik7Ci0KLSAgICAgIGxvb2t1cC0+bWVtc3BlYyA9IChDT05TVCBjaGFyICopIE5VTEw7Ci0gICAgICBsb29rdXAtPmZsYWdzID0gMDsKLSAgICAgIGxvb2t1cC0+c3Vic2VjdGlvbl9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIGxvb2t1cC0+c2VjdGlvbl9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIGxvb2t1cC0+bG9hZF9iYXNlID0gKHVuaW9uIGV0cmVlX3VuaW9uICopIE5VTEw7Ci0gICAgICBsb29rdXAtPnBoZHJzID0gTlVMTDsKLQotICAgICAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkgICAgIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGxvb2t1cCwKLQkJCSAgICAgJmxvb2t1cC0+bmV4dCk7Ci0gICAgfQotICByZXR1cm4gbG9va3VwOwotfQotCi1zdGF0aWMgdm9pZAotbGFuZ19tYXBfZmxhZ3MgKGZsYWcpCi0gICAgIGZsYWd3b3JkIGZsYWc7Ci17Ci0gIGlmIChmbGFnICYgU0VDX0FMTE9DKQotICAgIG1pbmZvICgiYSIpOwotCi0gIGlmIChmbGFnICYgU0VDX0NPREUpCi0gICAgbWluZm8gKCJ4Iik7Ci0KLSAgaWYgKGZsYWcgJiBTRUNfUkVBRE9OTFkpCi0gICAgbWluZm8gKCJyIik7Ci0KLSAgaWYgKGZsYWcgJiBTRUNfREFUQSkKLSAgICBtaW5mbyAoInciKTsKLQotICBpZiAoZmxhZyAmIFNFQ19MT0FEKQotICAgIG1pbmZvICgibCIpOwotfQotCi12b2lkCi1sYW5nX21hcCAoKQotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqbTsKLQotICBtaW5mbyAoXygiXG5NZW1vcnkgQ29uZmlndXJhdGlvblxuXG4iKSk7Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiUtMTZzICUtMThzICUtMThzICVzXG4iLAotCSAgIF8oIk5hbWUiKSwgXygiT3JpZ2luIiksIF8oIkxlbmd0aCIpLCBfKCJBdHRyaWJ1dGVzIikpOwotCi0gIGZvciAobSA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotICAgICAgIG0gIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICAgbSA9IG0tPm5leHQpCi0gICAgewotICAgICAgY2hhciBidWZbMTAwXTsKLSAgICAgIGludCBsZW47Ci0KLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiUtMTZzICIsIG0tPm5hbWUpOwotCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBtLT5vcmlnaW4pOwotICAgICAgbWluZm8gKCIweCVzICIsIGJ1Zik7Ci0gICAgICBsZW4gPSBzdHJsZW4gKGJ1Zik7Ci0gICAgICB3aGlsZSAobGVuIDwgMTYpCi0JewotCSAgcHJpbnRfc3BhY2UgKCk7Ci0JICArK2xlbjsKLQl9Ci0KLSAgICAgIG1pbmZvICgiMHglViIsIG0tPmxlbmd0aCk7Ci0gICAgICBpZiAobS0+ZmxhZ3MgfHwgbS0+bm90X2ZsYWdzKQotCXsKLSNpZm5kZWYgQkZENjQKLQkgIG1pbmZvICgiICAgICAgICAiKTsKLSNlbmRpZgotCSAgaWYgKG0tPmZsYWdzKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0JICAgICAgbGFuZ19tYXBfZmxhZ3MgKG0tPmZsYWdzKTsKLQkgICAgfQotCi0JICBpZiAobS0+bm90X2ZsYWdzKQotCSAgICB7Ci0JICAgICAgbWluZm8gKCIgISIpOwotCSAgICAgIGxhbmdfbWFwX2ZsYWdzIChtLT5ub3RfZmxhZ3MpOwotCSAgICB9Ci0JfQotCi0gICAgICBwcmludF9ubCAoKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCBfKCJcbkxpbmtlciBzY3JpcHQgYW5kIG1lbW9yeSBtYXBcblxuIikpOwotCi0gIHByaW50X3N0YXRlbWVudHMgKCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gb3V0cHV0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF9vcyAocykKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgc2VjdGlvbl91c2VyZGF0YV90eXBlICpuZXc7Ci0KLSAgaWYgKHMtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdHJjbXAgKHMtPm5hbWUsIERJU0NBUkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIGVpbmZvIChfKCIlUCVGOiBJbGxlZ2FsIHVzZSBvZiBgJXMnIHNlY3Rpb24iKSwgRElTQ0FSRF9TRUNUSU9OX05BTUUpOwotCi0gIG5ldyA9ICgoc2VjdGlvbl91c2VyZGF0YV90eXBlICopCi0JIHN0YXRfYWxsb2MgKHNpemVvZiAoc2VjdGlvbl91c2VyZGF0YV90eXBlKSkpOwotCi0gIHMtPmJmZF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIHMtPm5hbWUpOwotICBpZiAocy0+YmZkX3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgcy0+YmZkX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBzLT5uYW1lKTsKLSAgaWYgKHMtPmJmZF9zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIpLAotCSAgICAgb3V0cHV0X2JmZC0+eHZlYy0+bmFtZSwgcy0+bmFtZSk7Ci0gICAgfQotICBzLT5iZmRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBzLT5iZmRfc2VjdGlvbjsKLQotICAvKiBXZSBpbml0aWFsaXplIGFuIG91dHB1dCBzZWN0aW9ucyBvdXRwdXQgb2Zmc2V0IHRvIG1pbnVzIGl0cyBvd24gKi8KLSAgLyogdm1hIHRvIGFsbG93IHVzIHRvIG91dHB1dCBhIHNlY3Rpb24gdGhyb3VnaCBpdHNlbGYgKi8KLSAgcy0+YmZkX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgPSAwOwotICBnZXRfdXNlcmRhdGEgKHMtPmJmZF9zZWN0aW9uKSA9IChQVFIpIG5ldzsKLQotICAvKiBJZiB0aGVyZSBpcyBhIGJhc2UgYWRkcmVzcywgbWFrZSBzdXJlIHRoYXQgYW55IHNlY3Rpb25zIGl0IG1pZ2h0Ci0gICAgIG1lbnRpb24gYXJlIGluaXRpYWxpemVkLiAgKi8KLSAgaWYgKHMtPmFkZHJfdHJlZSAhPSBOVUxMKQotICAgIGV4cF9pbml0X29zIChzLT5hZGRyX3RyZWUpOwotfQotCi0vKiBNYWtlIHN1cmUgdGhhdCBhbGwgb3V0cHV0IHNlY3Rpb25zIG1lbnRpb25lZCBpbiBhbiBleHByZXNzaW9uIGFyZQotICAgaW5pdGlhbGl6ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZXhwX2luaXRfb3MgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGV4cF9pbml0X29zIChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGV4cF9pbml0X29zIChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGV4cF9pbml0X29zIChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfbmFtZToKLSAgICAgIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY29kZSkKLQl7Ci0JY2FzZSBBRERSOgotCWNhc2UgTE9BREFERFI6Ci0JY2FzZSBTSVpFT0Y6Ci0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChleHAtPm5hbWUubmFtZSk7Ci0JICAgIGlmIChvcyAhPSBOVUxMICYmIG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIGluaXRfb3MgKG9zKTsKLQkgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBTZWN0aW9ucyBtYXJrZWQgd2l0aCB0aGUgU0VDX0xJTktfT05DRSBmbGFnIHNob3VsZCBvbmx5IGJlIGxpbmtlZAotICAgb25jZSBpbnRvIHRoZSBvdXRwdXQuICBUaGlzIHJvdXRpbmUgY2hlY2tzIGVhY2ggc2VjdGlvbiwgYW5kCi0gICBhcnJhbmdlIHRvIGRpc2NhcmQgaXQgaWYgYSBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkKLSAgIGJlZW4gbGlua2VkLiAgSWYgdGhlIHNlY3Rpb24gaGFzIENPTURBVCBpbmZvcm1hdGlvbiwgdGhlbiBpdCB1c2VzCi0gICB0aGF0IHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBpbmNsdWRlZC4gIFRoaXMgY29kZQotICAgYXNzdW1lcyB0aGF0IGFsbCByZWxldmFudCBzZWN0aW9ucyBoYXZlIHRoZSBTRUNfTElOS19PTkNFIGZsYWcgc2V0OwotICAgdGhhdCBpcywgaXQgZG9lcyBub3QgZGVwZW5kIHNvbGVseSB1cG9uIHRoZSBzZWN0aW9uIG5hbWUuCi0gICBzZWN0aW9uX2FscmVhZHlfbGlua2VkIGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotLyogVGhpcyBpcyB0aGUgc2hhcGUgb2YgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUgYWxyZWFkeV9saW5rZWQgaGFzaAotICAgdGFibGUuIEl0IG1hcHMgYSBuYW1lIG9udG8gYSBsaXN0IG9mIGFscmVhZHlfbGlua2VkIGVsZW1lbnRzIHdpdGgKLSAgIHRoZSBzYW1lIG5hbWUuICBJdCdzIHBvc3NpYmxlIHRvIGdldCBtb3JlIHRoYW4gb25lIGVsZW1lbnQgaW4gYQotICAgbGlzdCBpZiB0aGUgQ09NREFUIHNlY3Rpb25zIGhhdmUgZGlmZmVyZW50IG5hbWVzLiAgKi8KLQotc3RydWN0IGFscmVhZHlfbGlua2VkX2hhc2hfZW50cnkgCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICBzdHJ1Y3QgYWxyZWFkeV9saW5rZWQgKmVudHJ5OwotfTsKLQotc3RydWN0IGFscmVhZHlfbGlua2VkIAotewotICBzdHJ1Y3QgYWxyZWFkeV9saW5rZWQgKm5leHQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci19OwotCi0vKiBUaGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgYWxyZWFkeV9saW5rZWRfdGFibGU7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNlY3Rpb25fYWxyZWFkeV9saW5rZWQgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnkgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBkYXRhOwotICBmbGFnd29yZCBmbGFnczsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3RydWN0IGFscmVhZHlfbGlua2VkICpsOwotICBzdHJ1Y3QgYWxyZWFkeV9saW5rZWRfaGFzaF9lbnRyeSAqYWxyZWFkeV9saW5rZWRfbGlzdDsKLQotICAvKiBJZiB3ZSBhcmUgb25seSByZWFkaW5nIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCwgdGhlbiB3ZSB3YW50IHRvCi0gICAgIGRpc2NhcmQgYWxsIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGVudHJ5LT5qdXN0X3N5bXNfZmxhZykKLSAgICB7Ci0gICAgICBzZWMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIHNlYy0+b3V0cHV0X29mZnNldCA9IHNlYy0+dm1hOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLQotICBpZiAoKGZsYWdzICYgU0VDX0xJTktfT05DRSkgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogRklYTUU6IFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgbWF5IGhhdmUgdHJvdWJsZQotICAgICBjb3B5aW5nIHJlbG9jYXRpb25zIGluIG90aGVyIHNlY3Rpb25zIHRoYXQgcmVmZXIgdG8gbG9jYWwgc3ltYm9scwotICAgICBpbiB0aGUgc2VjdGlvbiBiZWluZyBkaXNjYXJkZWQuICBUaG9zZSByZWxvY2F0aW9ucyB3aWxsIGhhdmUgdG8KLSAgICAgYmUgY29udmVydGVkIHNvbWVob3c7IGFzIG9mIHRoaXMgd3JpdGluZyBJJ20gbm90IHN1cmUgdGhhdCBhbnkgb2YKLSAgICAgdGhlIGJhY2tlbmRzIGhhbmRsZSB0aGF0IGNvcnJlY3RseS4KLQotICAgICBJdCBpcyB0ZW1wdGluZyB0byBpbnN0ZWFkIG5vdCBkaXNjYXJkIGxpbmsgb25jZSBzZWN0aW9ucyB3aGVuCi0gICAgIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsgKHRlY2huaWNhbGx5LCB0aGV5IHNob3VsZCBiZSBkaXNjYXJkZWQKLSAgICAgd2hlbmV2ZXIgd2UgYXJlIGJ1aWxkaW5nIGNvbnN0cnVjdG9ycykuICBIb3dldmVyLCB0aGF0IGZhaWxzLAotICAgICBiZWNhdXNlIHRoZSBsaW5rZXIgd2luZHMgdXAgY29tYmluaW5nIGFsbCB0aGUgbGluayBvbmNlIHNlY3Rpb25zCi0gICAgIGludG8gYSBzaW5nbGUgbGFyZ2UgbGluayBvbmNlIHNlY3Rpb24sIHdoaWNoIGRlZmVhdHMgdGhlIHB1cnBvc2UKLSAgICAgb2YgaGF2aW5nIGxpbmsgb25jZSBzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGxhY2UuCi0KLSAgICAgQWxzbywgbm90IG1lcmdpbmcgbGluayBvbmNlIHNlY3Rpb25zIGluIGEgcmVsb2NhdGVhYmxlIGxpbmsKLSAgICAgY2F1c2VzIHRyb3VibGUgZm9yIE1JUFMgRUxGLCB3aGljaCByZWxpZXMgaW4gbGluayBvbmNlIHNlbWFudGljcwotICAgICB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIHNlY3Rpb24gY29ycmVjdGx5LiAgKi8KLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgYWxyZWFkeV9saW5rZWRfbGlzdCA9IAotICAgICgoc3RydWN0IGFscmVhZHlfbGlua2VkX2hhc2hfZW50cnkgKikKLSAgICAgYmZkX2hhc2hfbG9va3VwICgmYWxyZWFkeV9saW5rZWRfdGFibGUsIG5hbWUsIHRydWUsIGZhbHNlKSk7Ci0KLSAgZm9yIChsID0gYWxyZWFkeV9saW5rZWRfbGlzdC0+ZW50cnk7ICBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWMtPmNvbWRhdCA9PSBOVUxMCi0JICB8fCBsLT5zZWMtPmNvbWRhdCA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKHNlYy0+Y29tZGF0LT5uYW1lLCBsLT5zZWMtPmNvbWRhdC0+bmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBUaGUgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGxpbmtlZC4gIFNlZSBpZiB3ZSBzaG91bGQKLSAgICAgICAgICAgICBpc3N1ZSBhIHdhcm5pbmcuICAqLwotCSAgc3dpdGNoIChmbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk6Ci0JICAgICAgaWYgKHNlYy0+Y29tZGF0ID09IE5VTEwpCi0JCWVpbmZvIChfKCIlUDogJUI6IHdhcm5pbmc6IGlnbm9yaW5nIGR1cGxpY2F0ZSBzZWN0aW9uIGAlcydcbiIpLAotCQkgICAgICAgYWJmZCwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQllaW5mbyAoXygiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgYCVzJyBzZWN0aW9uIHN5bWJvbCBgJXMnXG4iKSwKLQkJICAgICAgIGFiZmQsIG5hbWUsIHNlYy0+Y29tZGF0LT5uYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSBkaWcgb3V0IHRoZSBjb250ZW50cyBvZiBib3RoCi0gICAgICAgICAgICAgICAgIHNlY3Rpb25zIGFuZCBtZW1jbXAgdGhlbS4gIFRoZSBDT0ZGL1BFIHNwZWMgc2F5cyB0aGF0Ci0gICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IGltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICAgICAgIGNvcnJlY3RseSwgc28gSSdtIG5vdCBnb2luZyB0byBib3RoZXIgZG9pbmcgaXQKLSAgICAgICAgICAgICAgICAgZWl0aGVyLiAgKi8KLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCSAgICAgIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgIT0gYmZkX3NlY3Rpb25fc2l6ZSAobC0+c2VjLT5vd25lciwgbC0+c2VjKSkKLQkJZWluZm8gKF8oIiVQOiAlQjogd2FybmluZzogZHVwbGljYXRlIHNlY3Rpb24gYCVzJyBoYXMgZGlmZmVyZW50IHNpemVcbiIpLAotCQkgICAgICAgYWJmZCwgbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU2V0IHRoZSBvdXRwdXRfc2VjdGlvbiBmaWVsZCBzbyB0aGF0IHdpbGRfZG9pdCBkb2VzIG5vdAotCSAgICAgY3JlYXRlIGEgbGFuZ19pbnB1dF9zZWN0aW9uIHN0cnVjdHVyZSBmb3IgdGhpcyBzZWN0aW9uLgotCSAgICAgU2luY2UgdGhlcmUgbWlnaHQgYmUgYSBzeW1ib2wgaW4gdGhlIHNlY3Rpb24gYmVpbmcKLQkgICAgIGRpc2NhcmRlZCwgd2UgbXVzdCByZXRhaW4gYSBwb2ludGVyIHRvIHRoZSBzZWN0aW9uIHdoaWNoCi0JICAgICB3ZSBhcmUgcmVhbGx5IGdvaW5nIHRvIHVzZS4gICovCi0JICBzZWMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGlmIChzZWMtPmNvbWRhdCAhPSBOVUxMKQotCSAgICBzZWMtPmNvbWRhdC0+c2VjID0gbC0+c2VjOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgUmVjb3JkIGl0LiAgQWxsb2NhdGUKLSAgICAgdGhlIG1lbW9yeSBmcm9tIHRoZSBzYW1lIG9ic3RhY2sgYXMgdGhlIGhhc2ggdGFibGUgaXMga2VwdCBpbi4gICovCi0KLSAgbCA9ICgoc3RydWN0IGFscmVhZHlfbGlua2VkICopIAotICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmYWxyZWFkeV9saW5rZWRfdGFibGUsIHNpemVvZiAqbCkpOwotCi0gIGwtPnNlYyA9IHNlYzsKLSAgbC0+bmV4dCA9IGFscmVhZHlfbGlua2VkX2xpc3QtPmVudHJ5OwotICBhbHJlYWR5X2xpbmtlZF9saXN0LT5lbnRyeSA9IGw7Ci19Ci0KLS8qIFN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBoYXNoIHRhYmxlIHVzZWQgYnkgc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCwKLSAgIGluaXRpYWxpemUgdGhlIHRhYmxlLCBmaWxsIGluIGFuIGVudHJ5IGFuZCByZW1vdmUgdGhlIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1hbHJlYWR5X2xpbmtlZF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGFscmVhZHlfbGlua2VkX2hhc2hfZW50cnkgKnJldCA9IAotICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYWxyZWFkeV9saW5rZWRfaGFzaF9lbnRyeSkpOwotCi0gIHJldC0+ZW50cnkgPSBOVUxMOwotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLWFscmVhZHlfbGlua2VkX3RhYmxlX2luaXQgKCkKLXsKLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYWxyZWFkeV9saW5rZWRfdGFibGUsCi0JCQkgICAgICAgYWxyZWFkeV9saW5rZWRfbmV3ZnVuYywKLQkJCSAgICAgICA0MikpCi0gICAgZWluZm8gKF8oIiVQJUY6IEZhaWxlZCB0byBjcmVhdGUgaGFzaCB0YWJsZVxuIikpOwotfQotCi1zdGF0aWMgdm9pZAotYWxyZWFkeV9saW5rZWRfdGFibGVfZnJlZSAoKQotewotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWxyZWFkeV9saW5rZWRfdGFibGUpOwotfQotDAotLyogVGhlIHdpbGQgcm91dGluZXMuCi0KLSAgIFRoZXNlIGV4cGFuZCBzdGF0ZW1lbnRzIGxpa2UgKigudGV4dCkgYW5kIGZvby5vIHRvIGEgbGlzdCBvZgotICAgZXhwbGljaXQgYWN0aW9ucywgbGlrZSBmb28ubygudGV4dCksIGJhci5vKC50ZXh0KSBhbmQKLSAgIGZvby5vKC50ZXh0LCAuZGF0YSkuICAqLwotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgUEFUVEVSTiBhcmd1bWVudCBpcyBhIHdpbGRjYXJkIHBhdHRlcm4uCi0gICBBbHRob3VnaCBiYWNrc2xhc2hlcyBhcmUgdHJlYXRlZCBzcGVjaWFsbHkgaWYgYSBwYXR0ZXJuIGNvbnRhaW5zCi0gICB3aWxkY2FyZHMsIHdlIGRvIG5vdCBjb25zaWRlciB0aGUgbWVyZSBwcmVzZW5jZSBvZiBhIGJhY2tzbGFzaCB0bwotICAgYmUgZW5vdWdoIHRvIGNhdXNlIHRoZSB0aGUgcGF0dGVybiB0byBiZSB0cmVhdGVkIGFzIGEgd2lsZGNhcmQuCi0gICBUaGF0IGxldHMgdXMgaGFuZGxlIERPUyBmaWxlbmFtZXMgbW9yZSBuYXR1cmFsbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotd2lsZGNhcmRwIChwYXR0ZXJuKQotICAgICBjb25zdCBjaGFyICpwYXR0ZXJuOwotewotICBjb25zdCBjaGFyICpzOwotCi0gIGZvciAocyA9IHBhdHRlcm47ICpzICE9ICdcMCc7ICsrcykKLSAgICBpZiAoKnMgPT0gJz8nCi0JfHwgKnMgPT0gJyonCi0JfHwgKnMgPT0gJ1snKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIFNFQ1RJT04gdG8gdGhlIG91dHB1dCBzZWN0aW9uIE9VVFBVVC4gIERvIHRoaXMgYnkgY3JlYXRpbmcgYQotICAgbGFuZ19pbnB1dF9zZWN0aW9uIHN0YXRlbWVudCB3aGljaCBpcyBwbGFjZWQgYXQgUFRSLiAgRklMRSBpcyB0aGUKLSAgIGlucHV0IGZpbGUgd2hpY2ggaG9sZHMgU0VDVElPTi4gICovCi0KLXZvaWQKLXdpbGRfZG9pdCAocHRyLCBzZWN0aW9uLCBvdXRwdXQsIGZpbGUpCi0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqcHRyOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0OwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgYm9vbGVhbiBkaXNjYXJkOwotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzZWN0aW9uLT5vd25lciwgc2VjdGlvbik7Ci0KLSAgZGlzY2FyZCA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmssIGRpc2NhcmQgc2VjdGlvbnMgbWFya2VkIHdpdGgKLSAgICAgU0VDX0VYQ0xVREUuICAqLwotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiAoZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkKLSAgICBkaXNjYXJkID0gdHJ1ZTsKLQotICAvKiBEaXNjYXJkIGlucHV0IHNlY3Rpb25zIHdoaWNoIGFyZSBhc3NpZ25lZCB0byBhIHNlY3Rpb24gbmFtZWQKLSAgICAgRElTQ0FSRF9TRUNUSU9OX05BTUUuICAqLwotICBpZiAoc3RyY21wIChvdXRwdXQtPm5hbWUsIERJU0NBUkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIGRpc2NhcmQgPSB0cnVlOwotCi0gIC8qIERpc2NhcmQgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHdlIGFyZSBzdHJpcHBpbmcgZGVidWdnaW5nCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfZGVidWdnZXIgfHwgbGlua19pbmZvLnN0cmlwID09IHN0cmlwX2FsbCkKLSAgICAgICYmIChmbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgZGlzY2FyZCA9IHRydWU7Ci0KLSAgaWYgKGRpc2NhcmQpCi0gICAgewotICAgICAgaWYgKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgLyogVGhpcyBwcmV2ZW50cyBmdXR1cmUgY2FsbHMgZnJvbSBhc3NpZ25pbmcgdGhpcyBzZWN0aW9uLiAgKi8KLQkgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZmlyc3Q7Ci0gICAgICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqbmV3OwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIGlmIChvdXRwdXQtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgaW5pdF9vcyAob3V0cHV0KTsKLQkgIGZpcnN0ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0JZmlyc3QgPSBmYWxzZTsKLQotICAgICAgLyogQWRkIGEgc2VjdGlvbiByZWZlcmVuY2UgdG8gdGhlIGxpc3QgKi8KLSAgICAgIG5ldyA9IG5ld19zdGF0IChsYW5nX2lucHV0X3NlY3Rpb24sIHB0cik7Ci0KLSAgICAgIG5ldy0+c2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBuZXctPmlmaWxlID0gZmlsZTsKLSAgICAgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gb3V0cHV0LT5iZmRfc2VjdGlvbjsKLQotICAgICAgZmxhZ3MgPSBzZWN0aW9uLT5mbGFnczsKLQotICAgICAgLyogV2UgZG9uJ3QgY29weSB0aGUgU0VDX05FVkVSX0xPQUQgZmxhZyBmcm9tIGFuIGlucHV0IHNlY3Rpb24KLQkgdG8gYW4gb3V0cHV0IHNlY3Rpb24sIGJlY2F1c2Ugd2Ugd2FudCB0byBiZSBhYmxlIHRvIGluY2x1ZGUgYQotCSBTRUNfTkVWRVJfTE9BRCBzZWN0aW9uIGluIHRoZSBtaWRkbGUgb2YgYW4gb3RoZXJ3aXNlIGxvYWRlZAotCSBzZWN0aW9uIChJIGRvbid0IGtub3cgd2h5IHdlIHdhbnQgdG8gZG8gdGhpcywgYnV0IHdlIGRvKS4KLQkgYnVpbGRfbGlua19vcmRlciBpbiBsZHdyaXRlLmMgaGFuZGxlcyB0aGlzIGNhc2UgYnkgdHVybmluZwotCSB0aGUgZW1iZWRkZWQgU0VDX05FVkVSX0xPQUQgc2VjdGlvbiBpbnRvIGEgZmlsbC4gICovCi0KLSAgICAgIGZsYWdzICY9IH4gU0VDX05FVkVSX0xPQUQ7Ci0KLSAgICAgIC8qIElmIGZpbmFsIGxpbmssIGRvbid0IGNvcHkgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZ3MsIHRoZXkndmUKLQkgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4gIE9uZSByZWFzb24gdG8gZG8gdGhpcyBpcyB0aGF0IG9uIHBlCi0JIGZvcm1hdCB0YXJnZXRzLCAudGV4dCRmb28gc2VjdGlvbnMgZ28gaW50byAudGV4dCBhbmQgaXQncyBvZGQKLQkgdG8gc2VlIC50ZXh0IHdpdGggU0VDX0xJTktfT05DRSBzZXQuICAqLwotCi0gICAgICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCWZsYWdzICY9IH4gKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGlucHV0IHNlY3Rpb24sIGFuZCB0aGUgU0VDX1JFQURPTkxZCi0gICAgICAgICBmbGFnIGlzIG5vdCBjdXJyZW50bHkgc2V0LCB0aGVuIGRvbid0IHNldCBpdCBqdXN0IGJlY2F1c2UgdGhlCi0gICAgICAgICBpbnB1dCBzZWN0aW9uIGhhcyBpdCBzZXQuICAqLwotCi0gICAgICBpZiAoISBmaXJzdCAmJiAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCWZsYWdzICY9IH4gU0VDX1JFQURPTkxZOwotCi0gICAgICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgICAgIC8qIElmIFNFQ19SRUFET05MWSBpcyBub3Qgc2V0IGluIHRoZSBpbnB1dCBzZWN0aW9uLCB0aGVuIGNsZWFyCi0gICAgICAgICBpdCBmcm9tIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmPSB+U0VDX1JFQURPTkxZOwotCi0gICAgICBzd2l0Y2ggKG91dHB1dC0+c2VjdHlwZSkKLQl7Ci0JY2FzZSBub3JtYWxfc2VjdGlvbjoKLQkgIGJyZWFrOwotCWNhc2UgZHNlY3Rfc2VjdGlvbjoKLQljYXNlIGNvcHlfc2VjdGlvbjoKLQljYXNlIGluZm9fc2VjdGlvbjoKLQljYXNlIG92ZXJsYXlfc2VjdGlvbjoKLQkgIG91dHB1dC0+YmZkX3NlY3Rpb24tPmZsYWdzICY9IH5TRUNfQUxMT0M7Ci0JICBicmVhazsKLQljYXNlIG5vbG9hZF9zZWN0aW9uOgotCSAgb3V0cHV0LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJj0gflNFQ19MT0FEOwotCSAgb3V0cHV0LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIENvcHkgb3ZlciBTRUNfU01BTExfREFUQS4gICovCi0gICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfU01BTExfREFUQSkKLQlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1NNQUxMX0RBVEE7Ci0KLSAgICAgIGlmIChzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPiBvdXRwdXQtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCi0Jb3V0cHV0LT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0gICAgICAvKiBJZiBzdXBwbGllZCBhbiBhbGlnbWVudCwgdGhlbiBmb3JjZSBpdC4gICovCi0gICAgICBpZiAob3V0cHV0LT5zZWN0aW9uX2FsaWdubWVudCAhPSAtMSkKLQlvdXRwdXQtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBvdXRwdXQtPnNlY3Rpb25fYWxpZ25tZW50OwotICAgIH0KLX0KLQotLyogSGFuZGxlIHdpbGRjYXJkIHNvcnRpbmcuICBUaGlzIHJldHVybnMgdGhlIGxhbmdfaW5wdXRfc2VjdGlvbiB3aGljaAotICAgc2hvdWxkIGZvbGxvdyB0aGUgb25lIHdlIGFyZSBnb2luZyB0byBjcmVhdGUgZm9yIFNFQ1RJT04gYW5kIEZJTEUsCi0gICBiYXNlZCBvbiB0aGUgc29ydGluZyByZXF1aXJlbWVudHMgb2YgV0lMRC4gIEl0IHJldHVybnMgTlVMTCBpZiB0aGUKLSAgIG5ldyBzZWN0aW9uIHNob3VsZCBqdXN0IGdvIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGlzdC4gICovCi0KLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoKLXdpbGRfc29ydCAod2lsZCwgZmlsZSwgc2VjdGlvbikKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICp3aWxkOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpsOwotCi0gIGlmICghIHdpbGQtPmZpbGVuYW1lc19zb3J0ZWQgJiYgISB3aWxkLT5zZWN0aW9uc19zb3J0ZWQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc2VjdGlvbl9uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGZpbGUtPnRoZV9iZmQsIHNlY3Rpb24pOwotICBmb3IgKGwgPSB3aWxkLT5jaGlsZHJlbi5oZWFkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICpsczsKLQotICAgICAgaWYgKGwtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCWNvbnRpbnVlOwotICAgICAgbHMgPSAmbC0+aW5wdXRfc2VjdGlvbjsKLQotICAgICAgLyogU29ydGluZyBieSBmaWxlbmFtZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgc29ydGluZyBieSBzZWN0aW9uCi0gICAgICAgICBuYW1lLiAgKi8KLQotICAgICAgaWYgKHdpbGQtPmZpbGVuYW1lc19zb3J0ZWQpCi0JewotCSAgY29uc3QgY2hhciAqZm4sICpsbjsKLQkgIGJvb2xlYW4gZmEsIGxhOwotCSAgaW50IGk7Ci0KLQkgIC8qIFRoZSBQRSBzdXBwb3J0IGZvciB0aGUgLmlkYXRhIHNlY3Rpb24gYXMgZ2VuZXJhdGVkIGJ5Ci0gICAgICAgICAgICAgZGxsdG9vbCBhc3N1bWVzIHRoYXQgZmlsZXMgd2lsbCBiZSBzb3J0ZWQgYnkgdGhlIG5hbWUgb2YKLSAgICAgICAgICAgICB0aGUgYXJjaGl2ZSBhbmQgdGhlbiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgYXJjaGl2ZS4gICovCi0KLQkgIGlmIChmaWxlLT50aGVfYmZkICE9IE5VTEwKLQkgICAgICAmJiBiZmRfbXlfYXJjaGl2ZSAoZmlsZS0+dGhlX2JmZCkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZuID0gYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGZpbGUtPnRoZV9iZmQpKTsKLQkgICAgICBmYSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZuID0gZmlsZS0+ZmlsZW5hbWU7Ci0JICAgICAgZmEgPSBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAobHMtPmlmaWxlLT50aGVfYmZkICE9IE5VTEwKLQkgICAgICAmJiBiZmRfbXlfYXJjaGl2ZSAobHMtPmlmaWxlLT50aGVfYmZkKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgbG4gPSBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAobHMtPmlmaWxlLT50aGVfYmZkKSk7Ci0JICAgICAgbGEgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsbiA9IGxzLT5pZmlsZS0+ZmlsZW5hbWU7Ci0JICAgICAgbGEgPSBmYWxzZTsKLQkgICAgfQotCi0JICBpID0gc3RyY21wIChmbiwgbG4pOwotCSAgaWYgKGkgPiAwKQotCSAgICBjb250aW51ZTsKLQkgIGVsc2UgaWYgKGkgPCAwKQotCSAgICBicmVhazsKLQotCSAgaWYgKGZhIHx8IGxhKQotCSAgICB7Ci0JICAgICAgaWYgKGZhKQotCQlmbiA9IGZpbGUtPmZpbGVuYW1lOwotCSAgICAgIGlmIChsYSkKLQkJbG4gPSBscy0+aWZpbGUtPmZpbGVuYW1lOwotCi0JICAgICAgaSA9IHN0cmNtcCAoZm4sIGxuKTsKLQkgICAgICBpZiAoaSA+IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIGVsc2UgaWYgKGkgPCAwKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSGVyZSBlaXRoZXIgdGhlIGZpbGVzIGFyZSBub3Qgc29ydGVkIGJ5IG5hbWUsIG9yIHdlIGFyZQotICAgICAgICAgbG9va2luZyBhdCB0aGUgc2VjdGlvbnMgZm9yIHRoaXMgZmlsZS4gICovCi0KLSAgICAgIGlmICh3aWxkLT5zZWN0aW9uc19zb3J0ZWQpCi0JewotCSAgaWYgKHN0cmNtcCAoc2VjdGlvbl9uYW1lLAotCQkgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobHMtPmlmaWxlLT50aGVfYmZkLAotCQkJCQkgICAgbHMtPnNlY3Rpb24pKQotCSAgICAgIDwgMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gbDsKLX0KLQotLyogRXhwYW5kIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgcGFydGljdWxhciBGSUxFLiAgU0VDVElPTiBtYXkgYmUKLSAgIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgaXMgYSB3aWxkIGNhcmQuICAqLwotCi1zdGF0aWMgdm9pZAotb3V0cHV0X3NlY3Rpb25fY2FsbGJhY2sgKHB0ciwgc2VjdGlvbiwgZmlsZSwgb3V0cHV0KQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnB0cjsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIHZvaWQgKm91dHB1dDsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqYmVmb3JlOwotICAKLSAgLyogSWYgdGhlIHdpbGQgcGF0dGVybiB3YXMgbWFya2VkIEtFRVAsIHRoZSBtZW1iZXIgc2VjdGlvbnMKLSAgICAgc2hvdWxkIGJlIGFzIHdlbGwuICAqLwotICBpZiAocHRyLT5rZWVwX3NlY3Rpb25zKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19LRUVQOwotICAKLSAgYmVmb3JlID0gd2lsZF9zb3J0IChwdHIsIGZpbGUsIHNlY3Rpb24pOwotICAKLSAgLyogSGVyZSBCRUZPUkUgcG9pbnRzIHRvIHRoZSBsYW5nX2lucHV0X3NlY3Rpb24gd2hpY2gKLSAgICAgc2hvdWxkIGZvbGxvdyB0aGUgb25lIHdlIGFyZSBhYm91dCB0byBhZGQuICBJZiBCRUZPUkUKLSAgICAgaXMgTlVMTCwgdGhlbiB0aGUgc2VjdGlvbiBzaG91bGQganVzdCBnbyBhdCB0aGUgZW5kCi0gICAgIG9mIHRoZSBjdXJyZW50IGxpc3QuICAqLwotICAKLSAgaWYgKGJlZm9yZSA9PSBOVUxMKQotICAgIHdpbGRfZG9pdCAoJnB0ci0+Y2hpbGRyZW4sIHNlY3Rpb24sIAotCSAgICAgICAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBvdXRwdXQsIAotCSAgICAgICBmaWxlKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBsaXN0OwotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnBwOwotICAgICAgCi0gICAgICBsYW5nX2xpc3RfaW5pdCAoJmxpc3QpOwotICAgICAgd2lsZF9kb2l0ICgmbGlzdCwgc2VjdGlvbiwgCi0JCSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBvdXRwdXQsIAotCQkgZmlsZSk7Ci0gICAgICAKLSAgICAgIC8qIElmIHdlIGFyZSBkaXNjYXJkaW5nIHRoZSBzZWN0aW9uLCBMSVNULkhFQUQgd2lsbAotCSBiZSBOVUxMLiAgKi8KLSAgICAgIGlmIChsaXN0LmhlYWQgIT0gTlVMTCkKLQl7Ci0JICBBU1NFUlQgKGxpc3QuaGVhZC0+bmV4dCA9PSBOVUxMKTsKLQkgIAotCSAgZm9yIChwcCA9ICZwdHItPmNoaWxkcmVuLmhlYWQ7Ci0JICAgICAgICpwcCAhPSBiZWZvcmU7Ci0JICAgICAgIHBwID0gJigqcHApLT5uZXh0KQotCSAgICBBU1NFUlQgKCpwcCAhPSBOVUxMKTsKLQkgIAotCSAgbGlzdC5oZWFkLT5uZXh0ID0gKnBwOwotCSAgKnBwID0gbGlzdC5oZWFkOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgcGFzc2VkIGEgZmlsZSBuYW1lIHdoaWNoIG11c3QgaGF2ZSBiZWVuIHNlZW4gYWxyZWFkeSBhbmQKLSAgIGFkZGVkIHRvIHRoZSBzdGF0ZW1lbnQgdHJlZS4gIFdlIHdpbGwgc2VlIGlmIGl0IGhhcyBiZWVuIG9wZW5lZAotICAgYWxyZWFkeSBhbmQgaGFkIGl0cyBzeW1ib2xzIHJlYWQuICBJZiBub3QgdGhlbiB3ZSdsbCByZWFkIGl0LiAgKi8KLQotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKgotbG9va3VwX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnNlYXJjaDsKLQotICBmb3IgKHNlYXJjaCA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGlucHV0X2ZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBzZWFyY2ggIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKLSAgICAgICBzZWFyY2ggPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBzZWFyY2gtPm5leHRfcmVhbF9maWxlKQotICAgIHsKLSAgICAgIGlmIChzZWFyY2gtPmZpbGVuYW1lID09IChjaGFyICopIE5VTEwgJiYgbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotCXJldHVybiBzZWFyY2g7Ci0gICAgICBpZiAoc2VhcmNoLT5maWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMCi0JICAmJiBuYW1lICE9IChjaGFyICopIE5VTEwKLQkgICYmIHN0cmNtcCAoc2VhcmNoLT5maWxlbmFtZSwgbmFtZSkgPT0gMCkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKHNlYXJjaCA9PSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMKQotICAgIHNlYXJjaCA9IG5ld19hZmlsZSAobmFtZSwgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSwgZGVmYXVsdF90YXJnZXQsCi0JCQlmYWxzZSk7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgZmlsZSwgb3IgdGhpcyBmaWxlIGlzIG5vdCByZWFsCi0gICAgIChGSVhNRTogY2FuIHRoYXQgZXZlciBhY3R1YWxseSBoYXBwZW4/KSBvciB0aGUgbmFtZSBpcyBOVUxMCi0gICAgIChGSVhNRTogY2FuIHRoYXQgZXZlciBhY3R1YWxseSBoYXBwZW4/KSBkb24ndCBhZGQgdGhpcyBmaWxlLiAgKi8KLSAgaWYgKHNlYXJjaC0+bG9hZGVkCi0gICAgICB8fCAhIHNlYXJjaC0+cmVhbAotICAgICAgfHwgc2VhcmNoLT5maWxlbmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBzZWFyY2g7Ci0KLSAgbG9hZF9zeW1ib2xzIChzZWFyY2gsIChsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKikgTlVMTCk7Ci0KLSAgcmV0dXJuIHNlYXJjaDsKLX0KLQotLyogR2V0IHRoZSBzeW1ib2xzIGZvciBhbiBpbnB1dCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWxvYWRfc3ltYm9scyAoZW50cnksIHBsYWNlKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpwbGFjZTsKLXsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGlmIChlbnRyeS0+bG9hZGVkKQotICAgIHJldHVybjsKLQotICBsZGZpbGVfb3Blbl9maWxlIChlbnRyeSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9hcmNoaXZlKQotICAgICAgJiYgISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9lcnJvcl90eXBlIGVycjsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqaG9sZDsKLQotICAgICAgZXJyID0gYmZkX2dldF9lcnJvciAoKTsKLSAgICAgIGlmIChlcnIgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBjaGFyICoqcDsKLQotCSAgZWluZm8gKF8oIiVCOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIiksIGVudHJ5LT50aGVfYmZkKTsKLQkgIGVpbmZvIChfKCIlQjogbWF0Y2hpbmcgZm9ybWF0czoiKSwgZW50cnktPnRoZV9iZmQpOwotCSAgZm9yIChwID0gbWF0Y2hpbmc7ICpwICE9IE5VTEw7IHArKykKLQkgICAgZWluZm8gKCIgJXMiLCAqcCk7Ci0JICBlaW5mbyAoIiVGXG4iKTsKLQl9Ci0gICAgICBlbHNlIGlmIChlcnIgIT0gYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQKLQkgICAgICAgfHwgcGxhY2UgPT0gTlVMTCkKLQllaW5mbyAoXygiJUYlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIpLCBlbnRyeS0+dGhlX2JmZCk7Ci0KLSAgICAgIGJmZF9jbG9zZSAoZW50cnktPnRoZV9iZmQpOwotICAgICAgZW50cnktPnRoZV9iZmQgPSBOVUxMOwotCi0gICAgICAvKiBTZWUgaWYgdGhlIGVtdWxhdGlvbiBoYXMgc29tZSBzcGVjaWFsIGtub3dsZWRnZS4gICovCi0KLSAgICAgIGlmIChsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KSkKLQlyZXR1cm47Ci0KLSAgICAgIC8qIFRyeSB0byBpbnRlcnByZXQgdGhlIGZpbGUgYXMgYSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChlbnRyeS0+ZmlsZW5hbWUpOwotCi0gICAgICBob2xkID0gc3RhdF9wdHI7Ci0gICAgICBzdGF0X3B0ciA9IHBsYWNlOwotCi0gICAgICBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSB0cnVlOwotICAgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2NyaXB0OwotICAgICAgeXlwYXJzZSAoKTsKLSAgICAgIGxkZmlsZV9hc3N1bWVkX3NjcmlwdCA9IGZhbHNlOwotCi0gICAgICBzdGF0X3B0ciA9IGhvbGQ7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGxkZW11bF9yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KSkKLSAgICByZXR1cm47Ci0KLSAgLyogV2UgZG9uJ3QgY2FsbCBsZGxhbmdfYWRkX2ZpbGUgZm9yIGFuIGFyY2hpdmUuICBJbnN0ZWFkLCB0aGUKLSAgICAgYWRkX3N5bWJvbHMgZW50cnkgcG9pbnQgd2lsbCBjYWxsIGxkbGFuZ19hZGRfZmlsZSwgdmlhIHRoZQotICAgICBhZGRfYXJjaGl2ZV9lbGVtZW50IGNhbGxiYWNrLCBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBhcmNoaXZlCi0gICAgIHdoaWNoIGlzIHVzZWQuICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIGxkbGFuZ19hZGRfZmlsZSAoZW50cnkpOwotICAgICAgaWYgKHRyYWNlX2ZpbGVzIHx8IHRyYWNlX2ZpbGVfdHJpZXMpCi0JaW5mb19tc2cgKCIlSVxuIiwgZW50cnkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgaWYgKGVudHJ5LT53aG9sZV9hcmNoaXZlKQotCXsKLQkgIGJmZCAqbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZW50cnktPnRoZV9iZmQsCi0JCQkJCQkgICAgICAoYmZkICopIE5VTEwpOwotCSAgd2hpbGUgKG1lbWJlciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAobWVtYmVyLCBiZmRfb2JqZWN0KSkKLQkJZWluZm8gKF8oIiVGJUI6IG9iamVjdCAlQiBpbiBhcmNoaXZlIGlzIG5vdCBvYmplY3RcbiIpLAotCQkgICAgICAgZW50cnktPnRoZV9iZmQsIG1lbWJlcik7Ci0JICAgICAgaWYgKCEgKCgqbGlua19pbmZvLmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkKLQkJICAgICAoJmxpbmtfaW5mbywgbWVtYmVyLCAiLS13aG9sZS1hcmNoaXZlIikpKQotCQlhYm9ydCAoKTsKLQkgICAgICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAobWVtYmVyLCAmbGlua19pbmZvKSkKLQkJZWluZm8gKF8oIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgbWVtYmVyKTsKLQkgICAgICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChlbnRyeS0+dGhlX2JmZCwKLQkJCQkJCSAgICAgbWVtYmVyKTsKLQkgICAgfQotCi0JICBlbnRyeS0+bG9hZGVkID0gdHJ1ZTsKLQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGVudHJ5LT50aGVfYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoXygiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBlbnRyeS0+dGhlX2JmZCk7Ci0KLSAgZW50cnktPmxvYWRlZCA9IHRydWU7Ci19Ci0KLSAgICAgCi0KLS8qIEhhbmRsZSBhIHdpbGQgc3RhdGVtZW50LiAgU0VDVElPTiBvciBGSUxFIG9yIGJvdGggbWF5IGJlIE5VTEwsCi0gICBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgYSB3aWxkY2FyZC4gIFNlcGFyYXRlIGxhbmdfaW5wdXRfc2VjdGlvbgotICAgc3RhdGVtZW50cyBhcmUgY3JlYXRlZCBmb3IgZWFjaCBwYXJ0IG9mIHRoZSBleHBhbnNpb247IHRoZXkgYXJlCi0gICBhZGRlZCBhZnRlciB0aGUgd2lsZCBzdGF0ZW1lbnQgUy4gIE9VVFBVVCBpcyB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotd2lsZCAocywgc2VjdGlvbiwgZmlsZSwgdGFyZ2V0LCBvdXRwdXQpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqczsKLSAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dDsKLXsKLSAgd2Fsa193aWxkIChzLCBzZWN0aW9uLCBmaWxlLCBvdXRwdXRfc2VjdGlvbl9jYWxsYmFjaywgKHZvaWQgKikgb3V0cHV0KTsKLQotICBpZiAoc2VjdGlvbiAhPSAoY2hhciAqKSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHNlY3Rpb24sICJDT01NT04iKSA9PSAwCi0gICAgICAmJiBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgLyogUmVtZW1iZXIgdGhlIHNlY3Rpb24gdGhhdCBjb21tb24gaXMgZ29pbmcgdG8gaW4gY2FzZSB3ZSBsYXRlcgotICAgICAgICAgZ2V0IHNvbWV0aGluZyB3aGljaCBkb2Vzbid0IGtub3cgd2hlcmUgdG8gcHV0IGl0LiAgKi8KLSAgICAgIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPSBvdXRwdXQ7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZmYgdGFyZ2V0IGlzIHRoZSBzb3VnaHQgdGFyZ2V0LiAgKi8KLXN0YXRpYyBpbnQKLWdldF90YXJnZXQgKHRhcmdldCwgZGF0YSkKLSAgICAgY29uc3QgYmZkX3RhcmdldCAqIHRhcmdldDsKLSAgICAgdm9pZCAqIGRhdGE7Ci17Ci0gIGNvbnN0IGNoYXIgKiBzb3VnaHQgPSAoY29uc3QgY2hhciAqKSBkYXRhOwotICAKLSAgcmV0dXJuIHN0cmNtcCAodGFyZ2V0LT5uYW1lLCBzb3VnaHQpID09IDA7Ci19Ci0KLS8qIExpa2Ugc3RyY3B5KCkgYnV0IGNvbnZlcnQgdG8gbG93ZXIgY2FzZSBhcyB3ZWxsLiAgKi8KLXN0YXRpYyB2b2lkCi1zdHJpY3B5IChkZXN0LCBzcmMpCi0gICAgIGNoYXIgKiBkZXN0OwotICAgICBjaGFyICogc3JjOwotewotICBjaGFyIGM7Ci0gIAotICB3aGlsZSAoKGMgPSAqIHNyYyArKykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCWMgPSB0b2xvd2VyIChjKTsKLQotICAgICAgKiBkZXN0ICsrID0gYzsKLSAgICB9Ci0KLSAgKiBkZXN0ID0gMDsKLX0KLQotLyogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgbmVlZGxlIChpZiBhbnkpIGluIGhheXN0YWNrCi0gICBmcm9tIGhheXN0YWNrLiAgKi8KLXN0YXRpYyB2b2lkCi1zdHJjdXQgKGhheXN0YWNrLCBuZWVkbGUpCi0gICAgIGNoYXIgKiBoYXlzdGFjazsKLSAgICAgY2hhciAqIG5lZWRsZTsKLXsKLSAgaGF5c3RhY2sgPSBzdHJzdHIgKGhheXN0YWNrLCBuZWVkbGUpOwotICAKLSAgaWYgKGhheXN0YWNrKQotICAgIHsKLSAgICAgIGNoYXIgKiBzcmM7Ci0KLSAgICAgIGZvciAoc3JjID0gaGF5c3RhY2sgKyBzdHJsZW4gKG5lZWRsZSk7ICogc3JjOykKLQkqIGhheXN0YWNrICsrID0gKiBzcmMgKys7Ci0gICAgICAKLSAgICAgICogaGF5c3RhY2sgPSAwOwotICAgIH0KLX0KLQotLyogQ29tcGFyZSB0d28gdGFyZ2V0IGZvcm1hdCBuYW1lIHN0cmluZ3MuCi0gICBSZXR1cm4gYSB2YWx1ZSBpbmRpY2F0aW5nIGhvdyAic2ltaWxhciIgdGhleSBhcmUuICAqLwotc3RhdGljIGludAotbmFtZV9jb21wYXJlIChmaXJzdCwgc2Vjb25kKQotICAgICBjaGFyICogZmlyc3Q7Ci0gICAgIGNoYXIgKiBzZWNvbmQ7Ci17Ci0gIGNoYXIgKiBjb3B5MTsKLSAgY2hhciAqIGNvcHkyOwotICBpbnQgICAgcmVzdWx0OwotICAKLSAgY29weTEgPSB4bWFsbG9jIChzdHJsZW4gKGZpcnN0KSArIDEpOwotICBjb3B5MiA9IHhtYWxsb2MgKHN0cmxlbiAoc2Vjb25kKSArIDEpOwotCi0gIC8qIENvbnZlcnQgdGhlIG5hbWVzIHRvIGxvd2VyIGNhc2UuICAqLwotICBzdHJpY3B5IChjb3B5MSwgZmlyc3QpOwotICBzdHJpY3B5IChjb3B5Miwgc2Vjb25kKTsKLQotICAvKiBSZW1vdmUgYW5kIGVuZGlhbiBzdHJpbmdzIGZyb20gdGhlIG5hbWUuICAqLwotICBzdHJjdXQgKGNvcHkxLCAiYmlnIik7Ci0gIHN0cmN1dCAoY29weTEsICJsaXR0bGUiKTsKLSAgc3RyY3V0IChjb3B5MiwgImJpZyIpOwotICBzdHJjdXQgKGNvcHkyLCAibGl0dGxlIik7Ci0KLSAgLyogUmV0dXJuIGEgdmFsdWUgYmFzZWQgb24gaG93IG1hbnkgY2hhcmFjdGVycyBtYXRjaCwKLSAgICAgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLiAgIElmIGJvdGggc3RyaW5ncyBhcmUKLSAgICAgdGhlIHNhbWUgdGhlbiByZXR1cm4gMTAgKiB0aGVpciBsZW5ndGguICAqLwotICBmb3IgKHJlc3VsdCA9IDA7IGNvcHkxIFtyZXN1bHRdID09IGNvcHkyIFtyZXN1bHRdOyByZXN1bHQgKyspCi0gICAgaWYgKGNvcHkxIFtyZXN1bHRdID09IDApCi0gICAgICB7Ci0JcmVzdWx0ICo9IDEwOwotCWJyZWFrOwotICAgICAgfQotICAKLSAgZnJlZSAoY29weTEpOwotICBmcmVlIChjb3B5Mik7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogU2V0IGJ5IGNsb3Nlc3RfdGFyZ2V0X21hdGNoKCkgYmVsb3cuICAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKiB3aW5uZXI7Ci0KLS8qIFNjYW4gYWxsIHRoZSB2YWxpZCBiZmQgdGFyZ2V0cyBsb29raW5nIGZvciBvbmUgdGhhdCBoYXMgdGhlIGVuZGlhbm5lc3MKLSAgIHJlcXVpcmVtZW50IHRoYXQgd2FzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgaXMgdGhlIG5lYXJlc3QKLSAgIG1hdGNoIHRvIHRoZSBvcmlnaW5hbCBvdXRwdXQgdGFyZ2V0LiAgKi8KLXN0YXRpYyBpbnQKLWNsb3Nlc3RfdGFyZ2V0X21hdGNoICh0YXJnZXQsIGRhdGEpCi0gICAgIGNvbnN0IGJmZF90YXJnZXQgKiB0YXJnZXQ7Ci0gICAgIHZvaWQgKiBkYXRhOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICogb3JpZ2luYWwgPSAoY29uc3QgYmZkX3RhcmdldCAqKSBkYXRhOwotICAKLSAgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0JJRyAmJiB0YXJnZXQtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX0JJRykKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9MSVRUTEUgJiYgdGFyZ2V0LT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogTXVzdCBiZSB0aGUgc2FtZSBmbGF2b3VyLiAgKi8KLSAgaWYgKHRhcmdldC0+Zmxhdm91ciAhPSBvcmlnaW5hbC0+Zmxhdm91cikKLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiB3ZSBoYXZlIG5vdCBmb3VuZCBhIHBvdGVudGlhbCB3aW5uZXIgeWV0LCB0aGVuIHJlY29yZCB0aGlzIG9uZS4gICovCi0gIGlmICh3aW5uZXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB3aW5uZXIgPSB0YXJnZXQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogT2ggZGVhciwgd2Ugbm93IGhhdmUgdHdvIHBvdGVudGlhbCBjYW5kaWRhdGVzIGZvciBhIHN1Y2Nlc3NmdWwgbWF0Y2guCi0gICAgIENvbXBhcmUgdGhlaXIgbmFtZXMgYW5kIGNob29zZSB0aGUgYmV0dGVyIG9uZS4gKi8KLSAgaWYgKG5hbWVfY29tcGFyZSAodGFyZ2V0LT5uYW1lLCBvcmlnaW5hbC0+bmFtZSkgPiBuYW1lX2NvbXBhcmUgKHdpbm5lci0+bmFtZSwgb3JpZ2luYWwtPm5hbWUpKQotICAgIHdpbm5lciA9IHRhcmdldDsKLQotICAvKiBLZWVwIG9uIHNlYXJjaGluZyB1bnRpbCB3cWUgaGF2ZSBjaGVja2VkIHRoZW0gYWxsLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB0aGUgQkZEIHRhcmdldCBmb3JtYXQgb2YgdGhlIGZpcnN0IGlucHV0IGZpbGUuICAqLwotc3RhdGljIGNoYXIgKgotZ2V0X2ZpcnN0X2lucHV0X3RhcmdldCAoKQotewotICBjaGFyICogdGFyZ2V0ID0gTlVMTDsKLQotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAocykKLSAgICB7Ci0gICAgICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bQotCSAgJiYgcy0+cmVhbCkKLQl7Ci0JICBsZGZpbGVfb3Blbl9maWxlIChzKTsKLQkgIAotCSAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmIGJmZF9jaGVja19mb3JtYXQgKHMtPnRoZV9iZmQsIGJmZF9vYmplY3QpKQotCSAgICB7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF90YXJnZXQgKHMtPnRoZV9iZmQpOwotCSAgCi0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBiZmQgKgotb3Blbl9vdXRwdXQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotewotICBiZmQgKiBvdXRwdXQ7Ci0KLSAgLyogSGFzIHRoZSB1c2VyIHRvbGQgdXMgd2hpY2ggb3V0cHV0IGZvcm1hdCB0byB1c2UgPyAgKi8KLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyAtIGhhcyB0aGUgY3VycmVudCB0YXJnZXQgYmVlbiBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgPyAgKi8KLSAgICAgIGlmIChjdXJyZW50X3RhcmdldCAhPSBkZWZhdWx0X3RhcmdldCkKLQlvdXRwdXRfdGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7Ci0KLSAgICAgIC8qIE5vIC0gY2FuIHdlIGRldGVybWluZSB0aGUgZm9ybWF0IG9mIHRoZSBmaXJzdCBpbnB1dCBmaWxlID8gKi8KLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRfdGFyZ2V0ID0gZ2V0X2ZpcnN0X2lucHV0X3RhcmdldCAoKTsKLQotCSAgLyogRmFpbGVkIC0gdXNlIHRoZSBkZWZhdWx0IG91dHB1dCB0YXJnZXQuICAqLwotCSAgaWYgKG91dHB1dF90YXJnZXQgPT0gTlVMTCkKLQkgICAgb3V0cHV0X3RhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotCX0KLSAgICB9Ci0gIAotICAvKiBIYXMgdGhlIHVzZXIgcmVxdWVzdGVkIGEgcGFydGljdWxhciBlbmRpYW5uZXNzIG9uIHRoZSBjb21tYW5kIGxpbmUgPyAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gIT0gRU5ESUFOX1VOU0VUKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF90YXJnZXQgKiB0YXJnZXQ7Ci0gICAgICBlbnVtIGJmZF9lbmRpYW4gZGVzaXJlZF9lbmRpYW47Ci0KLSAgICAgIC8qIEdldCB0aGUgY2hvc2VuIHRhcmdldC4gICovCi0gICAgICB0YXJnZXQgPSBiZmRfc2VhcmNoX2Zvcl90YXJnZXQgKGdldF90YXJnZXQsICh2b2lkICopIG91dHB1dF90YXJnZXQpOwotCi0gICAgICBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fQklHKQotCWRlc2lyZWRfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0gICAgICBlbHNlCi0JZGVzaXJlZF9lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLSAgICAgIAotICAgICAgLyogU2VlIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSB3cm9uZyBlbmRpYW5uZXNzLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbgotCSBpZiB0aGUgbGlua2VyIHNjcmlwdCBoYXMgcHJvdmlkZWQgYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGFsdGVybmF0aXZlcywKLQkgYnV0IHNvbWUgc2NyaXBzIGRvbid0IGRvIHRoaXMuICAqLwotICAgICAgaWYgKHRhcmdldC0+Ynl0ZW9yZGVyICE9IGRlc2lyZWRfZW5kaWFuKQotCXsKLQkgIC8qIElmIGl0IGRvZXMsIHRoZW4gc2VlIGlmIHRoZSB0YXJnZXQgcHJvdmlkZXMKLQkgICAgIGFuIGFsdGVybmF0aXZlIHdpdGggdGhlIGNvcnJlY3QgZW5kaWFubmVzcy4gICovCi0JICBpZiAodGFyZ2V0LT5hbHRlcm5hdGl2ZV90YXJnZXQgIT0gTlVMTAotCSAgICAgICYmICh0YXJnZXQtPmFsdGVybmF0aXZlX3RhcmdldC0+Ynl0ZW9yZGVyID09IGRlc2lyZWRfZW5kaWFuKSkKLQkgICAgb3V0cHV0X3RhcmdldCA9IHRhcmdldC0+YWx0ZXJuYXRpdmVfdGFyZ2V0LT5uYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVHJ5IHRvIGZpbmQgYSB0YXJnZXQgYXMgc2ltaWxhciBhcyBwb3NzaWJsZSB0byB0aGUgZGVmYXVsdAotCQkgdGFyZ2V0LCBidXQgd2hpY2ggaGFzIHRoZSBkZXNpcmVkIGVuZGlhbiBjaGFyYWN0ZXJpc3RpYy4gICovCi0JICAgICAgKHZvaWQpIGJmZF9zZWFyY2hfZm9yX3RhcmdldCAoY2xvc2VzdF90YXJnZXRfbWF0Y2gsICh2b2lkICopIHRhcmdldCk7Ci0JICAgICAgCi0JICAgICAgLyogT2ggZGVhciAtIHdlIGNvdWxkIG5vdCBmaW5kIGFueSB0YXJnZXRzIHRoYXQgc2F0aXNmeSBvdXIgcmVxdWlyZW1lbnRzLiAgKi8KLQkgICAgICBpZiAod2lubmVyID09IE5VTEwpCi0JCWVpbmZvIChfKCIlUDogd2FybmluZzogY291bGQgbm90IGZpbmQgYW55IHRhcmdldHMgdGhhdCBtYXRjaCBlbmRpYW5uZXNzIHJlcXVpcmVtZW50XG4iKSk7Ci0JICAgICAgZWxzZQotCQlvdXRwdXRfdGFyZ2V0ID0gd2lubmVyLT5uYW1lOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICAgIAotICBvdXRwdXQgPSBiZmRfb3BlbncgKG5hbWUsIG91dHB1dF90YXJnZXQpOwotCi0gIGlmIChvdXRwdXQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCkKLQllaW5mbyAoXygiJVAlRjogdGFyZ2V0ICVzIG5vdCBmb3VuZFxuIiksIG91dHB1dF90YXJnZXQpOwotCi0gICAgICBlaW5mbyAoXygiJVAlRjogY2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXM6ICVFXG4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlID0gdHJ1ZTsKLQotICAvKiAgb3V0cHV0LT5mbGFncyB8PSBEX1BBR0VEOyovCi0KLSAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKG91dHB1dCwgYmZkX29iamVjdCkpCi0gICAgZWluZm8gKF8oIiVQJUY6JXM6IGNhbiBub3QgbWFrZSBvYmplY3QgZmlsZTogJUVcbiIpLCBuYW1lKTsKLSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG91dHB1dCwKLQkJCSAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLAotCQkJICAgbGRmaWxlX291dHB1dF9tYWNoaW5lKSkKLSAgICBlaW5mbyAoXygiJVAlRjolczogY2FuIG5vdCBzZXQgYXJjaGl0ZWN0dXJlOiAlRVxuIiksIG5hbWUpOwotCi0gIGxpbmtfaW5mby5oYXNoID0gYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKG91dHB1dCk7Ci0gIGlmIChsaW5rX2luZm8uaGFzaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogY2FuIG5vdCBjcmVhdGUgbGluayBoYXNoIHRhYmxlOiAlRVxuIikpOwotCi0gIGJmZF9zZXRfZ3Bfc2l6ZSAob3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sZGxhbmdfb3Blbl9vdXRwdXQgKHN0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHN0YXRlbWVudDsKLXsKLSAgc3dpdGNoIChzdGF0ZW1lbnQtPmhlYWRlci50eXBlKQotICAgIHsKLSAgICBjYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgQVNTRVJUIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCk7Ci0gICAgICBvdXRwdXRfYmZkID0gb3Blbl9vdXRwdXQgKHN0YXRlbWVudC0+b3V0cHV0X3N0YXRlbWVudC5uYW1lKTsKLSAgICAgIGxkZW11bF9zZXRfb3V0cHV0X2FyY2ggKCk7Ci0gICAgICBpZiAoY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCAmJiAhbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5EX1BBR0VEOwotICAgICAgaWYgKGNvbmZpZy50ZXh0X3JlYWRfb25seSkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBXUF9URVhUOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5XUF9URVhUOwotICAgICAgaWYgKGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQpCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICAgIGVsc2UKLQlvdXRwdXRfYmZkLT5mbGFncyAmPSB+QkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIGN1cnJlbnRfdGFyZ2V0ID0gc3RhdGVtZW50LT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIE9wZW4gYWxsIHRoZSBpbnB1dCBmaWxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vcGVuX2lucHV0X2JmZHMgKHMsIGZvcmNlKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBib29sZWFuIGZvcmNlOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgb3Blbl9pbnB1dF9iZmRzIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIG9wZW5faW5wdXRfYmZkcyAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgLyogTWF5YmUgd2Ugc2hvdWxkIGxvYWQgdGhlIGZpbGUncyBzeW1ib2xzICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUKLQkgICAgICAmJiAhIHdpbGRjYXJkcCAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUpKQotCSAgICAodm9pZCkgbG9va3VwX25hbWUgKHMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lKTsKLQkgIG9wZW5faW5wdXRfYmZkcyAocy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgZm9yY2UpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzOwotCi0JICAgIC8qIFdlIG11c3QgY29udGludWFsbHkgc2VhcmNoIHRoZSBlbnRyaWVzIGluIHRoZSBncm91cAotICAgICAgICAgICAgICAgdW50aWwgbm8gbmV3IHN5bWJvbHMgYXJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgc3ltYm9scy4gICovCi0KLQkgICAgZG8KLQkgICAgICB7Ci0JCXVuZGVmcyA9IGxpbmtfaW5mby5oYXNoLT51bmRlZnNfdGFpbDsKLQkJb3Blbl9pbnB1dF9iZmRzIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgdHJ1ZSk7Ci0JICAgICAgfQotCSAgICB3aGlsZSAodW5kZWZzICE9IGxpbmtfaW5mby5oYXNoLT51bmRlZnNfdGFpbCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCSAgY3VycmVudF90YXJnZXQgPSBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGlmIChzLT5pbnB1dF9zdGF0ZW1lbnQucmVhbCkKLQkgICAgewotCSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0KLQkgICAgICBzLT5pbnB1dF9zdGF0ZW1lbnQudGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGEgZ3JvdXAsIGFuZCB0aGlzCi0gICAgICAgICAgICAgICAgIGlzIGFuIGFyY2hpdmUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBzZWFyY2hlZCwgdGhlbgotICAgICAgICAgICAgICAgICBmb3JjZSBpdCB0byBiZSByZXNlYXJjaGVkLiAgKi8KLQkgICAgICBpZiAoZm9yY2UKLQkJICAmJiBzLT5pbnB1dF9zdGF0ZW1lbnQubG9hZGVkCi0JCSAgJiYgYmZkX2NoZWNrX2Zvcm1hdCAocy0+aW5wdXRfc3RhdGVtZW50LnRoZV9iZmQsCi0JCQkJICAgICAgIGJmZF9hcmNoaXZlKSkKLQkJcy0+aW5wdXRfc3RhdGVtZW50LmxvYWRlZCA9IGZhbHNlOwotCi0JICAgICAgbGFuZ19saXN0X2luaXQgKCZhZGQpOwotCi0JICAgICAgbG9hZF9zeW1ib2xzICgmcy0+aW5wdXRfc3RhdGVtZW50LCAmYWRkKTsKLQotCSAgICAgIGlmIChhZGQuaGVhZCAhPSBOVUxMKQotCQl7Ci0JCSAgKmFkZC50YWlsID0gcy0+bmV4dDsKLQkJICBzLT5uZXh0ID0gYWRkLmhlYWQ7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIElmIHRoZXJlIGFyZSBbQ09NTU9OU10gc3RhdGVtZW50cywgcHV0IGEgd2lsZCBvbmUgaW50byB0aGUgYnNzIHNlY3Rpb24gKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfcmVhc29uYWJsZV9kZWZhdWx0cyAoKQotewotI2lmIDAKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLnRleHQiKTsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLmRhdGEiKTsKLQotICBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID0KLSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIuYnNzIik7Ci0KLQotICBpZiAocGxhY2VkX2NvbW1vbnMgPT0gZmFsc2UpCi0gICAgewotICAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPQotICAgICAgbmV3X3N0YXQgKGxhbmdfd2lsZF9zdGF0ZW1lbnQsCi0JCSZkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLT5jaGlsZHJlbik7Ci0KLSAgICAgIG5ldy0+c2VjdGlvbl9uYW1lID0gIkNPTU1PTiI7Ci0gICAgICBuZXctPmZpbGVuYW1lID0gKGNoYXIgKikgTlVMTDsKLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbmV3LT5jaGlsZHJlbik7Ci0gICAgfQotI2VuZGlmCi0KLX0KLQotLyoKLSBBZGQgdGhlIHN1cHBsaWVkIG5hbWUgdG8gdGhlIHN5bWJvbCB0YWJsZSBhcyBhbiB1bmRlZmluZWQgcmVmZXJlbmNlLgotIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBjaGFpbiBhcyB3ZSBvcGVuIGlucHV0IGJmZHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3QKLXsKLSAgc3RydWN0IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0ICpuZXh0OwotICBjaGFyICpuYW1lOwotfSAgICAgICAgICAgICAgICAgICAgICAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZTsKLQotc3RhdGljIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKmxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0KLXZvaWQKLWxkbGFuZ19hZGRfdW5kZWYgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Ci17Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKm5ldyA9Ci0gICAgKChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICopCi0gICAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSkpKTsKLQotICBuZXctPm5leHQgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOwotICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkID0gbmV3OwotCi0gIG5ldy0+bmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7Ci19Ci0KLS8qIFJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZHMgY3JlYXRlZCBhYm92ZSBhbmQgcGxhY2UgdGhlbQotICAgaW50byB0aGUgbGlua2VyIGhhc2ggdGFibGUgYXMgdW5kZWZpbmVkIHN5bWJvbHMgYmVsb25naW5nIHRvIHRoZQotICAgc2NyaXB0IGZpbGUuCi0qLwotc3RhdGljIHZvaWQKLWxhbmdfcGxhY2VfdW5kZWZpbmVkcyAoKQotewotICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICpwdHI7Ci0KLSAgZm9yIChwdHIgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOwotICAgICAgIHB0ciAhPSAobGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqKSBOVUxMOwotICAgICAgIHB0ciA9IHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgcHRyLT5uYW1lLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQllaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JewotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+dS51bmRlZi5hYmZkID0gTlVMTDsKLQkgIGJmZF9saW5rX2FkZF91bmRlZiAobGlua19pbmZvLmhhc2gsIGgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIE9wZW4gaW5wdXQgZmlsZXMgYW5kIGF0dGF0Y2ggdG8gb3V0cHV0IHNlY3Rpb25zICovCi1zdGF0aWMgdm9pZAotbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAocywgdGFyZ2V0LCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci17Ci0gIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCi0KLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIHdpbGQgKCZzLT53aWxkX3N0YXRlbWVudCwgcy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLAotCQlzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSwgdGFyZ2V0LAotCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCi0JICBicmVhazsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkJdGFyZ2V0LAotCQkJCQkmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCSAgdGFyZ2V0ID0gcy0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQ7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkJdGFyZ2V0LAotCQkJCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgIT0gTlVMTAotCSAgICAgICYmIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgaW5pdF9vcyAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAhPSBOVUxMCi0JICAgICAgJiYgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBpbml0X29zIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCi0JICAvKiBNYWtlIHN1cmUgdGhhdCBhbnkgc2VjdGlvbnMgbWVudGlvbmVkIGluIHRoZSBhc3NpZ25tZW50Ci0gICAgICAgICAgICAgYXJlIGluaXRpYWxpemVkLiAgKi8KLQkgIGV4cF9pbml0X29zIChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X2VudW06Ci0JICBGQUlMICgpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICAvKiBNYXJrIHRoZSBzcGVjaWZpZWQgc2VjdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBhZGRyZXNzICovCi0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0KLQkgICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAKLQkJKHMtPmFkZHJlc3Nfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSk7Ci0KLQkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIGluaXRfb3MgKG9zKTsKLQkgICAgb3MtPmFkZHJfdHJlZSA9IHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3M7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpCi0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLSAgaW50IGxlbjsKLQotICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICE9IGFic19vdXRwdXRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBtaW5mbyAoIlxuJXMiLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPm5hbWUpOwotCi0gICAgICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotCXsKLQkgIHByaW50X2RvdCA9IHNlY3Rpb24tPnZtYTsKLQotCSAgbGVuID0gc3RybGVuIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPm5hbWUpOwotCSAgaWYgKGxlbiA+PSBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCAtIDEpCi0JICAgIHsKLQkgICAgICBwcmludF9ubCAoKTsKLQkgICAgICBsZW4gPSAwOwotCSAgICB9Ci0JICB3aGlsZSAobGVuIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEgpCi0JICAgIHsKLQkgICAgICBwcmludF9zcGFjZSAoKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCi0JICBtaW5mbyAoIjB4JVYgJVciLCBzZWN0aW9uLT52bWEsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmxvYWRfYmFzZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBhZGRyOwotCi0JICAgICAgYWRkciA9IGV4cF9nZXRfYWJzX2ludCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5sb2FkX2Jhc2UsIDAsCi0JCQkJICAgICAgImxvYWQgYmFzZSIsIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0JICAgICAgbWluZm8gKF8oIiBsb2FkIGFkZHJlc3MgMHglViIpLCBhZGRyKTsKLQkgICAgfQotCX0KLQotICAgICAgcHJpbnRfbmwgKCk7Ci0gICAgfQotCi0gIHByaW50X3N0YXRlbWVudF9saXN0IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmNoaWxkcmVuLmhlYWQsCi0JCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXNzaWdubWVudCAoYXNzaWdubWVudCwgb3V0cHV0X3NlY3Rpb24pCi0gICAgIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqIGFzc2lnbm1lbnQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbjsKLXsKLSAgaW50IGk7Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKGFzc2lnbm1lbnQtPmV4cC0+YXNzaWduLnNyYywgb3V0cHV0X3NlY3Rpb24sCi0JCQkgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwgcHJpbnRfZG90LCAmcHJpbnRfZG90KTsKLSAgaWYgKHJlc3VsdC52YWxpZF9wKQotICAgIG1pbmZvICgiMHglViIsIHJlc3VsdC52YWx1ZSArIHJlc3VsdC5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG1pbmZvICgiKnVuZGVmKiAgICIpOwotI2lmZGVmIEJGRDY0Ci0gICAgICBtaW5mbyAoIiAgICAgICAgIik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgbWluZm8gKCIgICAgICAgICAgICAgICAgIik7Ci0KLSAgZXhwX3ByaW50X3RyZWUgKGFzc2lnbm1lbnQtPmV4cCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnB1dF9zdGF0ZW1lbnQgKHN0YXRtKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICogc3RhdG07Ci17Ci0gIGlmIChzdGF0bS0+ZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJMT0FEICVzXG4iLCBzdGF0bS0+ZmlsZW5hbWUpOwotICAgIH0KLX0KLQotLyogUHJpbnQgYWxsIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkCi0gICB2aWEgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuIAotcHJpbnRfb25lX3N5bWJvbCAoaGFzaF9lbnRyeSwgcHRyKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFzaF9lbnRyeTsKLSAgICAgUFRSIHB0cjsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IChhc2VjdGlvbiAqKSBwdHI7Ci0KLSAgaWYgKChoYXNoX2VudHJ5LT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgIHx8IGhhc2hfZW50cnktPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgc2VjID09IGhhc2hfZW50cnktPnUuZGVmLnNlY3Rpb24pCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotCXByaW50X3NwYWNlICgpOwotICAgICAgbWluZm8gKCIweCVWICAgIiwKLQkgICAgIChoYXNoX2VudHJ5LT51LmRlZi52YWx1ZQotCSAgICAgICsgaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCSAgICAgICsgaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkpOwotCi0gICAgICBtaW5mbyAoIiAgICAgICAgICAgICAlVFxuIiwgaGFzaF9lbnRyeS0+cm9vdC5zdHJpbmcpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW5wdXQgc2VjdGlvbiB0byB0aGUgbWFwIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5wdXRfc2VjdGlvbiAoaW4pCi0gICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICogaW47Ci17Ci0gIGFzZWN0aW9uICppID0gaW4tPnNlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGktPl9jb29rZWRfc2l6ZSAhPSAwID8gaS0+X2Nvb2tlZF9zaXplIDogaS0+X3Jhd19zaXplOwotCi0gIGlmIChzaXplICE9IDApCi0gICAgewotICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgICAgIG1pbmZvICgiJXMiLCBpLT5uYW1lKTsKLQotICAgICAgaWYgKGktPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgaW50IGxlbjsKLQotCSAgbGVuID0gMSArIHN0cmxlbiAoaS0+bmFtZSk7Ci0JICBpZiAobGVuID49IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIIC0gMSkKLQkgICAgewotCSAgICAgIHByaW50X25sICgpOwotCSAgICAgIGxlbiA9IDA7Ci0JICAgIH0KLQkgIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKLQkgICAgewotCSAgICAgIHByaW50X3NwYWNlICgpOwotCSAgICAgICsrbGVuOwotCSAgICB9Ci0KLQkgIG1pbmZvICgiMHglViAlVyAlQlxuIiwKLQkJIGktPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpLT5vdXRwdXRfb2Zmc2V0LCBzaXplLAotCQkgaS0+b3duZXIpOwotCi0JICBpZiAoaS0+X2Nvb2tlZF9zaXplICE9IDAgJiYgaS0+X2Nvb2tlZF9zaXplICE9IGktPl9yYXdfc2l6ZSkKLQkgICAgewotCSAgICAgIGxlbiA9IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIICsgMzsKLSNpZmRlZiBCRkQ2NAotCSAgICAgIGxlbiArPSAxNjsKLSNlbHNlCi0JICAgICAgbGVuICs9IDg7Ci0jZW5kaWYKLQkgICAgICB3aGlsZSAobGVuID4gMCkKLQkJewotCQkgIHByaW50X3NwYWNlICgpOwotCQkgIC0tbGVuOwotCQl9Ci0KLQkgICAgICBtaW5mbyAoXygiJVcgKHNpemUgYmVmb3JlIHJlbGF4aW5nKVxuIiksIGktPl9yYXdfc2l6ZSk7Ci0JICAgIH0KLQotCSAgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIHByaW50X29uZV9zeW1ib2wsIChQVFIpIGkpOwotCi0JICBwcmludF9kb3QgPSBpLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaS0+b3V0cHV0X29mZnNldCArIHNpemU7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2ZpbGxfc3RhdGVtZW50IChmaWxsKQotICAgICBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKiBmaWxsOwotewotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICIgRklMTCBtYXNrIDB4JXhcbiIsIGZpbGwtPmZpbGwpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGF0YV9zdGF0ZW1lbnQgKGRhdGEpCi0gICAgIGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZSAqIGRhdGE7Ci17Ci0gIGludCBpOwotICBiZmRfdm1hIGFkZHI7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEg7IGkrKykKLSAgICBwcmludF9zcGFjZSAoKTsKLQotICBhZGRyID0gZGF0YS0+b3V0cHV0X3ZtYTsKLSAgaWYgKGRhdGEtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgYWRkciArPSBkYXRhLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHN3aXRjaCAoZGF0YS0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgQllURToKLSAgICAgIHNpemUgPSBCWVRFX1NJWkU7Ci0gICAgICBuYW1lID0gIkJZVEUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSE9SVDoKLSAgICAgIHNpemUgPSBTSE9SVF9TSVpFOwotICAgICAgbmFtZSA9ICJTSE9SVCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExPTkc6Ci0gICAgICBzaXplID0gTE9OR19TSVpFOwotICAgICAgbmFtZSA9ICJMT05HIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUVVBRDoKLSAgICAgIHNpemUgPSBRVUFEX1NJWkU7Ci0gICAgICBuYW1lID0gIlFVQUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTUVVBRDoKLSAgICAgIHNpemUgPSBRVUFEX1NJWkU7Ci0gICAgICBuYW1lID0gIlNRVUFEIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBtaW5mbyAoIjB4JVYgJVcgJXMgMHgldiIsIGFkZHIsIHNpemUsIG5hbWUsIGRhdGEtPnZhbHVlKTsKLQotICBpZiAoZGF0YS0+ZXhwLT50eXBlLm5vZGVfY2xhc3MgIT0gZXRyZWVfdmFsdWUpCi0gICAgewotICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0gICAgICBleHBfcHJpbnRfdHJlZSAoZGF0YS0+ZXhwKTsKLSAgICB9Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHNpemU7Ci19Ci0KLS8qIFByaW50IGFuIGFkZHJlc3Mgc3RhdGVtZW50LiAgVGhlc2UgYXJlIGdlbmVyYXRlZCBieSBvcHRpb25zIGxpa2UKLSAgIC1UdGV4dC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyZXNzX3N0YXRlbWVudCAoYWRkcmVzcykKLSAgICAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICphZGRyZXNzOwotewotICBtaW5mbyAoXygiQWRkcmVzcyBvZiBzZWN0aW9uICVzIHNldCB0byAiKSwgYWRkcmVzcy0+c2VjdGlvbl9uYW1lKTsKLSAgZXhwX3ByaW50X3RyZWUgKGFkZHJlc3MtPmFkZHJlc3MpOwotICBwcmludF9ubCAoKTsKLX0KLQotLyogUHJpbnQgYSByZWxvYyBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVsb2Nfc3RhdGVtZW50IChyZWxvYykKLSAgICAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcmVsb2M7Ci17Ci0gIGludCBpOwotICBiZmRfdm1hIGFkZHI7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEg7IGkrKykKLSAgICBwcmludF9zcGFjZSAoKTsKLQotICBhZGRyID0gcmVsb2MtPm91dHB1dF92bWE7Ci0gIGlmIChyZWxvYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICBhZGRyICs9IHJlbG9jLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jLT5ob3d0byk7Ci0KLSAgbWluZm8gKCIweCVWICVXIFJFTE9DICVzICIsIGFkZHIsIHNpemUsIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0KLSAgaWYgKHJlbG9jLT5uYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCIlcysiLCByZWxvYy0+bmFtZSk7Ci0gIGVsc2UKLSAgICBtaW5mbyAoIiVzKyIsIHJlbG9jLT5zZWN0aW9uLT5uYW1lKTsKLQotICBleHBfcHJpbnRfdHJlZSAocmVsb2MtPmFkZGVuZF9leHApOwotCi0gIHByaW50X25sICgpOwotCi0gIHByaW50X2RvdCA9IGFkZHIgKyBzaXplOwotfSAgCi0KLXN0YXRpYyB2b2lkCi1wcmludF9wYWRkaW5nX3N0YXRlbWVudCAocykKLSAgICAgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlICpzOwotewotICBpbnQgbGVuOwotICBiZmRfdm1hIGFkZHI7Ci0KLSAgbWluZm8gKCIgKmZpbGwqIik7Ci0KLSAgbGVuID0gc2l6ZW9mICIgKmZpbGwqIiAtIDE7Ci0gIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLSAgICAgICsrbGVuOwotICAgIH0KLQotICBhZGRyID0gcy0+b3V0cHV0X29mZnNldDsKLSAgaWYgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgYWRkciArPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICBtaW5mbyAoIjB4JVYgJVciLCBhZGRyLCBzLT5zaXplKTsKLQotICBpZiAocy0+ZmlsbCAhPSAwKQotICAgIG1pbmZvICgiICV1Iiwgcy0+ZmlsbCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHMtPnNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF93aWxkX3N0YXRlbWVudCAodywgb3MpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqIHc7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvczsKLXsKLSAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgaWYgKHctPmZpbGVuYW1lc19zb3J0ZWQpCi0gICAgbWluZm8gKCJTT1JUKCIpOwotICBpZiAody0+ZXhjbHVkZV9maWxlbmFtZSAhPSBOVUxMKQotICAgIG1pbmZvICgiRVhDTFVERV9GSUxFICggJXMgKSIsIHctPmV4Y2x1ZGVfZmlsZW5hbWUpOwotICBpZiAody0+ZmlsZW5hbWUgIT0gTlVMTCkKLSAgICBtaW5mbyAoIiVzIiwgdy0+ZmlsZW5hbWUpOwotICBlbHNlCi0gICAgbWluZm8gKCIqIik7Ci0gIGlmICh3LT5maWxlbmFtZXNfc29ydGVkKQotICAgIG1pbmZvICgiKSIpOwotCi0gIG1pbmZvICgiKCIpOwotICBpZiAody0+c2VjdGlvbnNfc29ydGVkKQotICAgIG1pbmZvICgiU09SVCgiKTsKLSAgaWYgKHctPnNlY3Rpb25fbmFtZSAhPSBOVUxMKQotICAgIG1pbmZvICgiJXMiLCB3LT5zZWN0aW9uX25hbWUpOwotICBlbHNlCi0gICAgbWluZm8gKCIqIik7Ci0gIGlmICh3LT5zZWN0aW9uc19zb3J0ZWQpCi0gICAgbWluZm8gKCIpIik7Ci0gIG1pbmZvICgiKSIpOwotCi0gIHByaW50X25sICgpOwotCi0gIHByaW50X3N0YXRlbWVudF9saXN0ICh3LT5jaGlsZHJlbi5oZWFkLCBvcyk7Ci19Ci0KLS8qIFByaW50IGEgZ3JvdXAgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2dyb3VwIChzLCBvcykKLSAgICAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSAqczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlNUQVJUIEdST1VQXG4iKTsKLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMtPmNoaWxkcmVuLmhlYWQsIG9zKTsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiRU5EIEdST1VQXG4iKTsKLX0KLQotLyogUHJpbnQgdGhlIGxpc3Qgb2Ygc3RhdGVtZW50cyBpbiBTLgotICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZvciBhbnkgc3RhdGVtZW50IHR5cGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMsIG9zKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLXsKLSAgd2hpbGUgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludF9zdGF0ZW1lbnQgKHMsIG9zKTsKLSAgICAgIHMgPSBzLT5uZXh0OwotICAgIH0KLX0KLQotLyogUHJpbnQgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiBzdGF0ZW1lbnQgbGlzdCBTLgotICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZvciBhbnkgc3RhdGVtZW50IHR5cGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhdGVtZW50IChzLCBvcykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci17Ci0gIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsIF8oIkZhaWwgd2l0aCAlZFxuIiksIHMtPmhlYWRlci50eXBlKTsKLSAgICAgIEZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotICAgICAgaWYgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCAhPSBOVUxMKQotCXsKLQkgIGlmIChjb25zdHJ1Y3RvcnNfc29ydGVkKQotCSAgICBtaW5mbyAoIiBTT1JUIChDT05TVFJVQ1RPUlMpXG4iKTsKLQkgIGVsc2UKLQkgICAgbWluZm8gKCIgQ09OU1RSVUNUT1JTXG4iKTsKLQkgIHByaW50X3N0YXRlbWVudF9saXN0IChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsIG9zKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X3dpbGRfc3RhdGVtZW50ICgmcy0+d2lsZF9zdGF0ZW1lbnQsIG9zKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQgKCZzLT5hZGRyZXNzX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0gICAgICBtaW5mbyAoIiBDUkVBVEVfT0JKRUNUX1NZTUJPTFNcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9maWxsX3N0YXRlbWVudCAoJnMtPmZpbGxfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfZGF0YV9zdGF0ZW1lbnQgKCZzLT5kYXRhX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9yZWxvY19zdGF0ZW1lbnQgKCZzLT5yZWxvY19zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLSAgICAgIHByaW50X2lucHV0X3NlY3Rpb24gKCZzLT5pbnB1dF9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQgKCZzLT5wYWRkaW5nX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKCZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9hc3NpZ25tZW50ICgmcy0+YXNzaWdubWVudF9zdGF0ZW1lbnQsIG9zKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0gICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJUQVJHRVQoJXMpXG4iLCBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgbWluZm8gKCJPVVRQVVQoJXMiLCBzLT5vdXRwdXRfc3RhdGVtZW50Lm5hbWUpOwotICAgICAgaWYgKG91dHB1dF90YXJnZXQgIT0gTlVMTCkKLQltaW5mbyAoIiAlcyIsIG91dHB1dF90YXJnZXQpOwotICAgICAgbWluZm8gKCIpXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2lucHV0X3N0YXRlbWVudCAoJnMtPmlucHV0X3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9ncm91cCAoJnMtPmdyb3VwX3N0YXRlbWVudCwgb3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X2VudW06Ci0gICAgICBGQUlMICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhdGVtZW50cyAoKQotewotICBwcmludF9zdGF0ZW1lbnRfbGlzdCAoc3RhdGVtZW50X2xpc3QuaGVhZCwgYWJzX291dHB1dF9zZWN0aW9uKTsKLX0KLQotLyogUHJpbnQgdGhlIGZpcnN0IE4gc3RhdGVtZW50cyBpbiBzdGF0ZW1lbnQgbGlzdCBTIHRvIFNUREVSUi4KLSAgIElmIE4gPT0gMCwgbm90aGluZyBpcyBwcmludGVkLgotICAgSWYgTiA8IDAsIHRoZSBlbnRpcmUgbGlzdCBpcyBwcmludGVkLgotICAgSW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gR0RCLiAgKi8KLQotdm9pZAotZHByaW50X3N0YXRlbWVudCAocywgbikKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci0gICAgIGludCBuOwotewotICBGSUxFICptYXBfc2F2ZSA9IGNvbmZpZy5tYXBfZmlsZTsKLQotICBjb25maWcubWFwX2ZpbGUgPSBzdGRlcnI7Ci0KLSAgaWYgKG4gPCAwKQotICAgIHByaW50X3N0YXRlbWVudF9saXN0IChzLCBhYnNfb3V0cHV0X3NlY3Rpb24pOwotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKHMgJiYgLS1uID49IDApCi0JewotCSAgcHJpbnRfc3RhdGVtZW50IChzLCBhYnNfb3V0cHV0X3NlY3Rpb24pOwotCSAgcyA9IHMtPm5leHQ7Ci0JfQotICAgIH0KLQotICBjb25maWcubWFwX2ZpbGUgPSBtYXBfc2F2ZTsKLX0KLQotc3RhdGljIGJmZF92bWEKLWluc2VydF9wYWQgKHRoaXNfcHRyLCBmaWxsLCBwb3dlciwgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBkb3QpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiogdGhpc19wdHI7Ci0gICAgIGZpbGxfdHlwZSBmaWxsOwotICAgICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0gICAgIGFzZWN0aW9uICogb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICBiZmRfdm1hIGRvdDsKLXsKLSAgLyogQWxpZ24gdGhpcyBzZWN0aW9uIGZpcnN0IHRvIHRoZQotICAgICBpbnB1dCBzZWN0aW9ucyByZXF1aXJlbWVudCwgdGhlbgotICAgICB0byB0aGUgb3V0cHV0IHNlY3Rpb24ncyByZXF1aXJlbWVudC4KLSAgICAgSWYgdGhpcyBhbGlnbm1lbnQgaXMgPiB0aGFuIGFueSBzZWVuIGJlZm9yZSwKLSAgICAgdGhlbiByZWNvcmQgaXQgdG9vLiBQZXJmb3JtIHRoZSBhbGlnbm1lbnQgYnkKLSAgICAgaW5zZXJ0aW5nIGEgbWFnaWMgJ3BhZGRpbmcnIHN0YXRlbWVudC4KLSAgICAgKi8KLQotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X25lZWRlZCA9IGFsaWduX3Bvd2VyIChkb3QsIHBvd2VyKSAtIGRvdDsKLQotICBpZiAoYWxpZ25tZW50X25lZWRlZCAhPSAwKQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ldyA9Ci0JKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopCi0JIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlKSkpOwotCi0gICAgICAvKiBMaW5rIGludG8gZXhpc3RpbmcgY2hhaW4gKi8KLSAgICAgIG5ldy0+aGVhZGVyLm5leHQgPSAqdGhpc19wdHI7Ci0gICAgICAqdGhpc19wdHIgPSBuZXc7Ci0gICAgICBuZXctPmhlYWRlci50eXBlID0gbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldCA9Ci0JZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT52bWE7Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LmZpbGwgPSBmaWxsOwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplID0gYWxpZ25tZW50X25lZWRlZDsKLSAgICB9Ci0KLQotICAvKiBSZW1lbWJlciB0aGUgbW9zdCByZXN0cmljdGl2ZSBhbGlnbm1lbnQgKi8KLSAgaWYgKHBvd2VyID4gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgewotICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLSAgICB9Ci0gIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+X3Jhd19zaXplICs9IGFsaWdubWVudF9uZWVkZWQ7Ci0gIHJldHVybiBhbGlnbm1lbnRfbmVlZGVkICsgZG90OwotCi19Ci0KLS8qIFdvcmsgb3V0IGhvdyBtdWNoIHRoaXMgc2VjdGlvbiB3aWxsIG1vdmUgdGhlIGRvdCBwb2ludCAqLwotc3RhdGljIGJmZF92bWEKLXNpemVfaW5wdXRfc2VjdGlvbiAodGhpc19wdHIsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgZmlsbCwgZG90LCByZWxheCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiB0aGlzX3B0cjsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIGJmZF92bWEgZG90OwotICAgICBib29sZWFuIHJlbGF4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppcyA9ICYoKCp0aGlzX3B0ciktPmlucHV0X3NlY3Rpb24pOwotICBhc2VjdGlvbiAqaSA9IGlzLT5zZWN0aW9uOwotCi0gIGlmIChpcy0+aWZpbGUtPmp1c3Rfc3ltc19mbGFnID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPnN1YnNlY3Rpb25fYWxpZ25tZW50ICE9IC0xKQotICAgICAgIGktPmFsaWdubWVudF9wb3dlciA9Ci0Jb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5zdWJzZWN0aW9uX2FsaWdubWVudDsKLQotICAgICAgZG90ID0gaW5zZXJ0X3BhZCAodGhpc19wdHIsIGZpbGwsIGktPmFsaWdubWVudF9wb3dlciwKLQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24sIGRvdCk7Ci0KLSAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGlzIGlucHV0IHNlY3Rpb24gZ29lcyAqLwotCi0gICAgICBpLT5vdXRwdXRfb2Zmc2V0ID0gZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBNYXJrIGhvdyBiaWcgdGhlIG91dHB1dCBzZWN0aW9uIG11c3QgYmUgdG8gY29udGFpbiB0aGlzIG5vdwotCSAqLwotICAgICAgaWYgKGktPl9jb29rZWRfc2l6ZSAhPSAwKQotCWRvdCArPSBpLT5fY29va2VkX3NpemU7Ci0gICAgICBlbHNlCi0JZG90ICs9IGktPl9yYXdfc2l6ZTsKLSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSA9IGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpLT5vdXRwdXRfb2Zmc2V0ID0gaS0+dm1hIC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotICAgIH0KLQotICByZXR1cm4gZG90OwotfQotCi0jZGVmaW5lIElHTk9SRV9TRUNUSU9OKGJmZCwgcykgXAotICAoKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGJmZCwgcykgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSBcCi0gICB8fCBiZmRfc2VjdGlvbl9zaXplIChiZmQsIHMpID09IDApCi0KLS8qIENoZWNrIHRvIHNlZSBpZiBhbnkgYWxsb2NhdGVkIHNlY3Rpb25zIG92ZXJsYXAgd2l0aCBvdGhlciBhbGxvY2F0ZWQKLSAgIHNlY3Rpb25zLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGxpbmtlciBzY3JpcHQgc3BlY2lmaWNhbGx5IHNwZWNpZmllcwotICAgdGhlIG91dHB1dCBzZWN0aW9uIGFkZHJlc3NlcyBvZiB0aGUgdHdvIHNlY3Rpb25zLiAgKi8KLXN0YXRpYyB2b2lkCi1sYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzICgpCi17Ci0gIGFzZWN0aW9uICogczsKLQotICAvKiBTY2FuIGFsbCBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGxpc3QuICAqLwotICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIG9zOwotICAgICAgCi0gICAgICAvKiBJZ25vcmUgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBsb2FkZWQgb3Igd2hpY2ggaGF2ZSBubyBjb250ZW50cy4gICovCi0gICAgICBpZiAoSUdOT1JFX1NFQ1RJT04gKG91dHB1dF9iZmQsIHMpKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICAvKiBPbmNlIHdlIHJlYWNoIHNlY3Rpb24gJ3MnIHN0b3Agb3VyIHNlYWNoLiAgVGhpcyBwcmV2ZW50cyB0d28KLQkgd2FybmluZyBtZXNzYWdlcyBmcm9tIGJlaW5nIHByb2R1Y2VkLCBvbmUgZm9yICdzZWN0aW9uIEEgb3ZlcmxhcHMKLQkgc2VjdGlvbiBCJyBhbmQgb25lIGZvciAnc2VjdGlvbiBCIG92ZXJsYXBzIHNlY3Rpb24gQScuICAqLwotICAgICAgZm9yIChvcyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBvcyAhPSBzOyBvcyA9IG9zLT5uZXh0KQotCXsKLQkgIGJmZF92bWEgc19zdGFydDsKLQkgIGJmZF92bWEgc19lbmQ7Ci0JICBiZmRfdm1hIG9zX3N0YXJ0OwotCSAgYmZkX3ZtYSBvc19lbmQ7Ci0JICAKLQkgIC8qIE9ubHkgY29uc2lkZXIgbG9hZGFibGUgc2VjdGlvbnMgd2l0aCByZWFsIGNvbnRlbnRzLiAgKi8KLQkgIGlmIChJR05PUkVfU0VDVElPTiAob3V0cHV0X2JmZCwgb3MpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgbXVzdCBjaGVjayB0aGUgc2VjdGlvbnMnIExNQSBhZGRyZXNzZXMgbm90IHRoZWlyCi0JICAgICBWTUEgYWRkcmVzc2VzIGJlY2F1c2Ugb3ZlcmxheSBzZWN0aW9ucyBjYW4gaGF2ZQotCSAgICAgb3ZlcmxhcHBpbmcgVk1BcyBidXQgdGhleSBtdXN0IGhhdmUgZGlzdGluY3QgTE1Bcy4gICovCi0JICBzX3N0YXJ0ICA9IGJmZF9zZWN0aW9uX2xtYSAob3V0cHV0X2JmZCwgcyk7Ci0JICBvc19zdGFydCA9IGJmZF9zZWN0aW9uX2xtYSAob3V0cHV0X2JmZCwgb3MpOwotCSAgc19lbmQgICAgPSBzX3N0YXJ0ICArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHMpIC0gMTsKLQkgIG9zX2VuZCAgID0gb3Nfc3RhcnQgKyBiZmRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCBvcykgLSAxOwotCSAgCi0JICAvKiBMb29rIGZvciBhbiBvdmVybGFwLiAgKi8KLQkgIGlmICgoc19lbmQgPCBvc19zdGFydCkgfHwgKHNfc3RhcnQgPiBvc19lbmQpKQotCSAgICBjb250aW51ZTsKLQkgIAotCSAgZWluZm8gKAotXygiJVglUDogc2VjdGlvbiAlcyBbJVYgLT4gJVZdIG92ZXJsYXBzIHNlY3Rpb24gJXMgWyVWIC0+ICVWXVxuIiksCi0JCSBzLT5uYW1lLCBzX3N0YXJ0LCBzX2VuZCwgb3MtPm5hbWUsIG9zX3N0YXJ0LCBvc19lbmQpOwotCSAgCi0JICAvKiBPbmNlIHdlIGhhdmUgZm91bmQgb25lIG92ZXJsYXAgZm9yIHRoaXMgc2VjdGlvbiwKLQkgICAgIHN0b3AgbG9va2luZyBmb3Igb3RoZXJzLiAgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgYmZkX3JlbGF4X3NlY3Rpb24gc2hvdWxkIGJlIGNhbGxlZAotICAgYWdhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbiByZWxheF9hZ2FpbjsKLQotLyogU2V0IHRoZSBzaXplcyBmb3IgYWxsIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCi1iZmRfdm1hCi1sYW5nX3NpemVfc2VjdGlvbnMgKHMsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgcHJldiwgZmlsbCwgZG90LCByZWxheCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiogcHJldjsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIGJmZF92bWEgZG90OwotICAgICBib29sZWFuIHJlbGF4OwotewotICAvKiBTaXplIHVwIHRoZSBzZWN0aW9ucyBmcm9tIHRoZWlyIGNvbnN0aXR1ZW50IHBhcnRzLiAgKi8KLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIGFmdGVyOwotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLQkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIC8qIFRoaXMgc2VjdGlvbiB3YXMgbmV2ZXIgYWN0dWFsbHkgY3JlYXRlZC4gICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSWYgdGhpcyBpcyBhIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiwgdXNlIHRoZSBzaXplIGFuZAotCSAgICAgICBhZGRyZXNzIGZyb20gdGhlIGlucHV0IHNlY3Rpb24uICBGSVhNRTogVGhpcyBpcyBDT0ZGCi0JICAgICAgIHNwZWNpZmljOyBpdCB3b3VsZCBiZSBjbGVhbmVyIGlmIHRoZXJlIHdlcmUgc29tZSBvdGhlciB3YXkKLQkgICAgICAgdG8gZG8gdGhpcywgYnV0IG5vdGhpbmcgc2ltcGxlIGNvbWVzIHRvIG1pbmQuICAqLwotCSAgICBpZiAoKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkgIT0gMCkKLQkgICAgICB7Ci0JCWFzZWN0aW9uICogaW5wdXQ7Ci0KLQkJaWYgKG9zLT5jaGlsZHJlbi5oZWFkID09IE5VTEwKLQkJICAgIHx8IG9zLT5jaGlsZHJlbi5oZWFkLT5uZXh0ICE9IE5VTEwKLQkJICAgIHx8IG9zLT5jaGlsZHJlbi5oZWFkLT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkKLQkJICBlaW5mbyAoXygiJVAlWDogSW50ZXJuYWwgZXJyb3Igb24gQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uICVzXG4iKSwKLQkJCSBvcy0+bmFtZSk7Ci0KLQkJaW5wdXQgPSBvcy0+Y2hpbGRyZW4uaGVhZC0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOwotCQliZmRfc2V0X3NlY3Rpb25fdm1hIChvcy0+YmZkX3NlY3Rpb24tPm93bmVyLAotCQkJCSAgICAgb3MtPmJmZF9zZWN0aW9uLAotCQkJCSAgICAgYmZkX3NlY3Rpb25fdm1hIChpbnB1dC0+b3duZXIsIGlucHV0KSk7Ci0JCW9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplID0gaW5wdXQtPl9yYXdfc2l6ZTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKG9zLT5iZmRfc2VjdGlvbikpCi0JICAgICAgewotCQkvKiBObyBtYXR0ZXIgd2hhdCBoYXBwZW5zLCBhbiBhYnMgc2VjdGlvbiBzdGFydHMgYXQgemVyby4gICovCi0JCUFTU0VSVCAob3MtPmJmZF9zZWN0aW9uLT52bWEgPT0gMCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAob3MtPmFkZHJfdHJlZSA9PSAoZXRyZWVfdHlwZSAqKSBOVUxMKQotCQkgIHsKLQkJICAgIC8qIE5vIGFkZHJlc3Mgc3BlY2lmaWVkIGZvciB0aGlzIHNlY3Rpb24sIGdldCBvbmUKLQkJICAgICAgIGZyb20gdGhlIHJlZ2lvbiBzcGVjaWZpY2F0aW9uLiAgKi8KLQkJICAgIGlmIChvcy0+cmVnaW9uID09IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMCi0JCQl8fCAoKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikKLQkJCSAgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkgIT0gMCkKLQkJCSAgICAmJiBvcy0+cmVnaW9uLT5uYW1lWzBdID09ICcqJwotCQkJICAgICYmIHN0cmNtcCAob3MtPnJlZ2lvbi0+bmFtZSwgIipkZWZhdWx0KiIpID09IDApKQotCQkgICAgICB7Ci0JCQlvcy0+cmVnaW9uID0gbGFuZ19tZW1vcnlfZGVmYXVsdCAob3MtPmJmZF9zZWN0aW9uKTsKLQkJICAgICAgfQotCi0JCSAgICAvKiBJZiBhIGxvYWRhYmxlIHNlY3Rpb24gaXMgdXNpbmcgdGhlIGRlZmF1bHQgbWVtb3J5Ci0JCSAgICAgICByZWdpb24sIGFuZCBzb21lIG5vbiBkZWZhdWx0IG1lbW9yeSByZWdpb25zIHdlcmUKLQkJICAgICAgIGRlZmluZWQsIGlzc3VlIGEgd2FybmluZy4gICovCi0JCSAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkJICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkgIT0gMAotCQkJJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0JCQkmJiBzdHJjbXAgKG9zLT5yZWdpb24tPm5hbWUsICIqZGVmYXVsdCoiKSA9PSAwCi0JCQkmJiBsYW5nX21lbW9yeV9yZWdpb25fbGlzdCAhPSBOVUxMCi0JCQkmJiAoc3RyY21wIChsYW5nX21lbW9yeV9yZWdpb25fbGlzdC0+bmFtZSwgIipkZWZhdWx0KiIpICE9IDAKLQkJCSAgICB8fCBsYW5nX21lbW9yeV9yZWdpb25fbGlzdC0+bmV4dCAhPSBOVUxMKSkKLQkJICAgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBubyBtZW1vcnkgcmVnaW9uIHNwZWNpZmllZCBmb3Igc2VjdGlvbiBgJXMnXG4iKSwKLQkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikpOwotCi0JCSAgICBkb3QgPSBvcy0+cmVnaW9uLT5jdXJyZW50OwotIAotCQkgICAgaWYgKG9zLT5zZWN0aW9uX2FsaWdubWVudCA9PSAtMSkKLQkJICAgICAgewotCQkJYmZkX3ZtYSBvbGRkb3Q7Ci0KLQkJCW9sZGRvdCA9IGRvdDsKLQkJCWRvdCA9IGFsaWduX3Bvd2VyIChkb3QsIG9zLT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKLQotCQkJaWYgKGRvdCAhPSBvbGRkb3QgJiYgY29uZmlnLndhcm5fc2VjdGlvbl9hbGlnbikKLQkJCSAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjaGFuZ2luZyBzdGFydCBvZiBzZWN0aW9uICVzIGJ5ICV1IGJ5dGVzXG4iKSwKLQkJCQkgb3MtPm5hbWUsICh1bnNpZ25lZCBpbnQpIChkb3QgLSBvbGRkb3QpKTsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGV0cmVlX3ZhbHVlX3R5cGUgcjsKLQotCQkgICAgciA9IGV4cF9mb2xkX3RyZWUgKG9zLT5hZGRyX3RyZWUsCi0JCQkJICAgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICAgICAgbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0sCi0JCQkJICAgICAgIGRvdCwgJmRvdCk7Ci0JCSAgICBpZiAoci52YWxpZF9wID09IGZhbHNlKQotCQkgICAgICB7Ci0JCQllaW5mbyAoXygiJUYlUzogbm9uIGNvbnN0YW50IGFkZHJlc3MgZXhwcmVzc2lvbiBmb3Igc2VjdGlvbiAlc1xuIiksCi0JCQkgICAgICAgb3MtPm5hbWUpOwotCQkgICAgICB9Ci0JCSAgICBkb3QgPSByLnZhbHVlICsgci5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hOwotCQkgIH0KLQkJCi0JCS8qIFRoZSBzZWN0aW9uIHN0YXJ0cyBoZXJlLgotCQkgICBGaXJzdCwgYWxpZ24gdG8gd2hhdCB0aGUgc2VjdGlvbiBuZWVkcy4gICovCi0KLQkJaWYgKG9zLT5zZWN0aW9uX2FsaWdubWVudCAhPSAtMSkKLQkJICBkb3QgPSBhbGlnbl9wb3dlciAoZG90LCBvcy0+c2VjdGlvbl9hbGlnbm1lbnQpOwotCi0JCWJmZF9zZXRfc2VjdGlvbl92bWEgKDAsIG9zLT5iZmRfc2VjdGlvbiwgZG90KTsKLQkJCi0JCW9zLT5iZmRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IDA7Ci0JICAgICAgfQotCi0JICAgICh2b2lkKSBsYW5nX3NpemVfc2VjdGlvbnMgKG9zLT5jaGlsZHJlbi5oZWFkLCBvcywgJm9zLT5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICAgICBvcy0+ZmlsbCwgZG90LCByZWxheCk7Ci0JICAgIAotCSAgICAvKiBJZ25vcmUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb25zLCB1c2UgdGhlIHZtYSBhbmQgc2l6ZSB0bwotCSAgICAgICBhbGlnbiBhZ2FpbnN0LiAgKi8KLQotCSAgICBhZnRlciA9IEFMSUdOX04gKG9zLT5iZmRfc2VjdGlvbi0+dm1hICsKLQkJCSAgICAgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUsCi0JCQkgICAgIC8qIFRoZSBjb2VyY2lvbiBoZXJlIGlzIGltcG9ydGFudCwgc2VlIGxkLmguICAqLwotCQkJICAgICAoYmZkX3ZtYSkgb3MtPmJsb2NrX3ZhbHVlKTsKLQotCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChvcy0+YmZkX3NlY3Rpb24pKQotCSAgICAgIEFTU0VSVCAoYWZ0ZXIgPT0gb3MtPmJmZF9zZWN0aW9uLT52bWEpOwotCSAgICBlbHNlCi0JICAgICAgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBhZnRlciAtIG9zLT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgICBkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYSArIG9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICBvcy0+cHJvY2Vzc2VkID0gdHJ1ZTsKLQotCSAgICAvKiBVcGRhdGUgZG90IGluIHRoZSByZWdpb24gPwotCSAgICAgICBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgYWxsb2NhdGVkLAotCSAgICAgICBzaW5jZSB1bmFsbG9jYXRlZCBzZWN0aW9ucyBkbyBub3QgY29udHJpYnV0ZSB0byB0aGUgcmVnaW9uJ3MKLQkgICAgICAgb3ZlcmFsbCBzaXplIGluIG1lbW9yeS4gICovCi0JICAgIGlmIChvcy0+cmVnaW9uICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMCi0JCSYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikKLQkJICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkpCi0JICAgICAgewotCQlvcy0+cmVnaW9uLT5jdXJyZW50ID0gZG90OwotCQkKLQkJLyogTWFrZSBzdXJlIHRoZSBuZXcgYWRkcmVzcyBpcyB3aXRoaW4gdGhlIHJlZ2lvbi4gIFdlCi0gICAgICAgICAgICAgICAgICAgZXhwbGljaXRseSBwZXJtaXQgdGhlIGN1cnJlbnQgYWRkcmVzcyB0byBiZSBhdCB0aGUKLSAgICAgICAgICAgICAgICAgICBleGFjdCBlbmQgb2YgdGhlIHJlZ2lvbiB3aGVuIHRoZSBWTUEgaXMgbm9uLXplcm8sCi0gICAgICAgICAgICAgICAgICAgaW4gY2FzZSB0aGUgcmVnaW9uIGlzIGF0IHRoZSBlbmQgb2YgYWRkcmVzc2FibGUKLSAgICAgICAgICAgICAgICAgICBtZW1vcnkgYW5kIHRoZSBjYWxjdWxhdGlvbiB3cmFwcyBhcm91bmQuICAqLwotCQlpZiAoKG9zLT5yZWdpb24tPmN1cnJlbnQgPCBvcy0+cmVnaW9uLT5vcmlnaW4KLQkJICAgICB8fCAob3MtPnJlZ2lvbi0+Y3VycmVudCAtIG9zLT5yZWdpb24tPm9yaWdpbgotCQkJID4gb3MtPnJlZ2lvbi0+bGVuZ3RoKSkKLQkJICAgICYmICgob3MtPnJlZ2lvbi0+Y3VycmVudAotCQkJICE9IG9zLT5yZWdpb24tPm9yaWdpbiArIG9zLT5yZWdpb24tPmxlbmd0aCkKLQkJCXx8IG9zLT5iZmRfc2VjdGlvbi0+dm1hID09IDApKQotCi0JCSAgewotCQkgICAgaWYgKG9zLT5hZGRyX3RyZWUgIT0gKGV0cmVlX3R5cGUgKikgTlVMTCkKLQkJICAgICAgewotCQkJZWluZm8gKF8oIiVYJVA6IGFkZHJlc3MgMHgldiBvZiAlQiBzZWN0aW9uICVzIGlzIG5vdCB3aXRoaW4gcmVnaW9uICVzXG4iKSwKLQkJCSAgICAgICBvcy0+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+b3V0cHV0X3NlY3Rpb24pCi0JICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zdGFydF9hZGRyZXNzIChvdXRwdXRfYmZkLCB2YWwpKQotCWVpbmZvIChfKCIlUCVGOiVzOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIiksIGVudHJ5X3N5bWJvbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBDT05TVCBjaGFyICpzZW5kOwotCi0gICAgICAvKiBXZSBjb3VsZG4ndCBmaW5kIHRoZSBlbnRyeSBzeW1ib2wuICBUcnkgcGFyc2luZyBpdCBhcyBhCi0gICAgICAgICBudW1iZXIuICAqLwotICAgICAgdmFsID0gYmZkX3NjYW5fdm1hIChlbnRyeV9zeW1ib2wsICZzZW5kLCAwKTsKLSAgICAgIGlmICgqc2VuZCA9PSAnXDAnKQotCXsKLQkgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwgdmFsKSkKLQkgICAgZWluZm8gKF8oIiVQJUY6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzZWN0aW9uICp0czsKLQotCSAgLyogQ2FuJ3QgZmluZCB0aGUgZW50cnkgc3ltYm9sLCBhbmQgaXQncyBub3QgYSBudW1iZXIuICBVc2UKLQkgICAgIHRoZSBmaXJzdCBhZGRyZXNzIGluIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotCSAgdHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi50ZXh0Iik7Ci0JICBpZiAodHMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAod2FybikKLQkJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IGRlZmF1bHRpbmcgdG8gJVZcbiIpLAotCQkgICAgICAgZW50cnlfc3ltYm9sLCBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCB0cykpOwotCSAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwKLQkJCQkJICAgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkJCQkJdHMpKSkKLQkJZWluZm8gKF8oIiVQJUY6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICh3YXJuKQotCQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgbm90IHNldHRpbmcgc3RhcnQgYWRkcmVzc1xuIiksCi0JCSAgICAgICBlbnRyeV9zeW1ib2wpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyBpcyBhIHNtYWxsIGZ1bmN0aW9uIHVzZWQgd2hlbiB3ZSB3YW50IHRvIGlnbm9yZSBlcnJvcnMgZnJvbQotICAgQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLWlnbm9yZV9iZmRfZXJyb3JzIChjb25zdCBjaGFyICpzIEFUVFJJQlVURV9VTlVTRUQsIC4uLikKLSNlbHNlCi1pZ25vcmVfYmZkX2Vycm9ycyAocykKLSAgICAgY29uc3QgY2hhciAqcyBBVFRSSUJVVEVfVU5VU0VEOwotI2VuZGlmCi17Ci0gIC8qIERvbid0IGRvIGFueXRoaW5nLiAgKi8KLX0KLQotLyogQ2hlY2sgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIG9mIGFsbCB0aGUgaW5wdXQgZmlsZXMgaXMgY29tcGF0aWJsZQotICAgd2l0aCB0aGUgb3V0cHV0IGZpbGUuICBBbHNvIGNhbGwgdGhlIGJhY2tlbmQgdG8gbGV0IGl0IGRvIGFueQotICAgb3RoZXIgY2hlY2tpbmcgdGhhdCBpcyBuZWVkZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19jaGVjayAoKQotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpmaWxlOwotICBiZmQgKmlucHV0X2JmZDsKLSAgQ09OU1QgYmZkX2FyY2hfaW5mb190eXBlICpjb21wYXRpYmxlOwotCi0gIGZvciAoZmlsZSA9IGZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBmaWxlICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gICAgICAgZmlsZSA9IGZpbGUtPmlucHV0X3N0YXRlbWVudC5uZXh0KQotICAgIHsKLSAgICAgIGlucHV0X2JmZCA9IGZpbGUtPmlucHV0X3N0YXRlbWVudC50aGVfYmZkOwotICAgICAgY29tcGF0aWJsZSA9IGJmZF9hcmNoX2dldF9jb21wYXRpYmxlIChpbnB1dF9iZmQsCi0JCQkJCSAgICBvdXRwdXRfYmZkKTsKLSAgICAgIGlmIChjb21wYXRpYmxlID09IE5VTEwpCi0JewotCSAgaWYgKGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQotCSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICVzIGFyY2hpdGVjdHVyZSBvZiBpbnB1dCBmaWxlIGAlQicgaXMgaW5jb21wYXRpYmxlIHdpdGggJXMgb3V0cHV0XG4iKSwKLQkJICAgYmZkX3ByaW50YWJsZV9uYW1lIChpbnB1dF9iZmQpLCBpbnB1dF9iZmQsCi0JCSAgIGJmZF9wcmludGFibGVfbmFtZSAob3V0cHV0X2JmZCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBmbiA9IE5VTEw7Ci0KLQkgIC8qIElmIHdlIGFyZW4ndCBzdXBwb3NlZCB0byB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQKLSAgICAgICAgICAgICBmaWxlcywgdGVtcG9yYXJpbHkgc2V0IHRoZSBCRkQgZXJyb3IgaGFuZGxlciB0byBhCi0gICAgICAgICAgICAgZnVuY3Rpb24gd2hpY2ggd2lsbCBkbyBub3RoaW5nLiAgV2Ugc3RpbGwgd2FudCB0byBjYWxsCi0gICAgICAgICAgICAgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIHNpbmNlIGl0IG1heSBzZXQgdXAKLSAgICAgICAgICAgICBpbmZvcm1hdGlvbiB3aGljaCBpcyBuZWVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgIGlmICghIGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQotCSAgICBwZm4gPSBiZmRfc2V0X2Vycm9yX2hhbmRsZXIgKGlnbm9yZV9iZmRfZXJyb3JzKTsKLQkgIGlmICghIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpbnB1dF9iZmQsIG91dHB1dF9iZmQpKQotCSAgICB7Ci0JICAgICAgaWYgKGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQotCQllaW5mbyAoXygiJUUlWDogZmFpbGVkIHRvIG1lcmdlIHRhcmdldCBzcGVjaWZpYyBkYXRhIG9mIGZpbGUgJUJcbiIpLAotCQkgICAgICAgaW5wdXRfYmZkKTsKLQkgICAgfQotCSAgaWYgKCEgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JICAgIGJmZF9zZXRfZXJyb3JfaGFuZGxlciAocGZuKTsKLQl9Ci0gICAgfQotfQotCi0vKiBMb29rIHRocm91Z2ggYWxsIHRoZSBnbG9iYWwgY29tbW9uIHN5bWJvbHMgYW5kIGF0dGFjaCB0aGVtIHRvIHRoZQotICAgY29ycmVjdCBzZWN0aW9uLiAgVGhlIC1zb3J0LWNvbW1vbiBjb21tYW5kIGxpbmUgc3dpdGNoIG1heSBiZSB1c2VkCi0gICB0byByb3VnaGx5IHNvcnQgdGhlIGVudHJpZXMgYnkgc2l6ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2NvbW1vbiAoKQotewotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgISBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24pCi0gICAgcmV0dXJuOwotCi0gIGlmICghIGNvbmZpZy5zb3J0X2NvbW1vbikKLSAgICBiZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgbGFuZ19vbmVfY29tbW9uLCAoUFRSKSBOVUxMKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBwb3dlcjsKLQotICAgICAgZm9yIChwb3dlciA9IDQ7IHBvd2VyID49IDA7IHBvd2VyLS0pCi0JYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIGxhbmdfb25lX2NvbW1vbiwKLQkJCQkoUFRSKSAmcG93ZXIpOwotICAgIH0KLX0KLQotLyogUGxhY2Ugb25lIGNvbW1vbiBzeW1ib2wgaW4gdGhlIGNvcnJlY3Qgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1sYW5nX29uZV9jb21tb24gKGgsIGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLSAgYmZkX3ZtYSBzaXplOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzaXplID0gaC0+dS5jLnNpemU7Ci0gIHBvd2VyX29mX3R3byA9IGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgaWYgKGNvbmZpZy5zb3J0X2NvbW1vbgotICAgICAgJiYgcG93ZXJfb2ZfdHdvIDwgKHVuc2lnbmVkIGludCkgKihpbnQgKikgaW5mbykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0aW9uID0gaC0+dS5jLnAtPnNlY3Rpb247Ci0KLSAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBBTElHTl9OIChzZWN0aW9uLT5fY29va2VkX3NpemUsCi0JCQkJICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotCi0gIC8qIEFkanVzdCB0aGUgYWxpZ25tZW50IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChwb3dlcl9vZl90d28gPiBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXJfb2ZfdHdvOwotCi0gIC8qIENoYW5nZSB0aGUgc3ltYm9sIGZyb20gY29tbW9uIHRvIGRlZmluZWQuICAqLwotICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKLSAgaC0+dS5kZWYudmFsdWUgPSBzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0KLSAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgKz0gc2l6ZTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIHNlY3Rpb24gaXMgYWxsb2NhdGVkIGluIG1lbW9yeSwgYW5kIG1ha2Ugc3VyZSB0aGF0Ci0gICAgIGl0IGlzIG5vIGxvbmdlciBhIGNvbW1vbiBzZWN0aW9uLiAgKi8KLSAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotICBzZWN0aW9uLT5mbGFncyAmPSB+IFNFQ19JU19DT01NT047Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICAgICAgaW50IGxlbjsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGJ1Zls1MF07Ci0KLSAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQotCXsKLQkgIG1pbmZvIChfKCJcbkFsbG9jYXRpbmcgY29tbW9uIHN5bWJvbHNcbiIpKTsKLQkgIG1pbmZvIChfKCJDb21tb24gc3ltYm9sICAgICAgIHNpemUgICAgICAgICAgICAgIGZpbGVcblxuIikpOwotCSAgaGVhZGVyX3ByaW50ZWQgPSB0cnVlOwotCX0KLQotICAgICAgbmFtZSA9IGRlbWFuZ2xlIChoLT5yb290LnN0cmluZyk7Ci0gICAgICBtaW5mbyAoIiVzIiwgbmFtZSk7Ci0gICAgICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgZnJlZSAobmFtZSk7Ci0KLSAgICAgIGlmIChsZW4gPj0gMTkpCi0JewotCSAgcHJpbnRfbmwgKCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIHdoaWxlIChsZW4gPCAyMCkKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgbWluZm8gKCIweCIpOwotICAgICAgaWYgKHNpemUgPD0gMHhmZmZmZmZmZikKLQlzcHJpbnRmIChidWYsICIlbHgiLCAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50Zl92bWEgKGJ1Ziwgc2l6ZSk7Ci0gICAgICBtaW5mbyAoIiVzIiwgYnVmKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmKTsKLQotICAgICAgd2hpbGUgKGxlbiA8IDE2KQotCXsKLQkgIHByaW50X3NwYWNlICgpOwotCSAgKytsZW47Ci0JfQotCi0gICAgICBtaW5mbyAoIiVCXG4iLCBzZWN0aW9uLT5vd25lcik7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotcnVuIHRocm91Z2ggdGhlIGlucHV0IGZpbGVzIGFuZCBlbnN1cmUgdGhhdCBldmVyeSBpbnB1dAotc2VjdGlvbiBoYXMgc29tZXdoZXJlIHRvIGdvLiBJZiBvbmUgaXMgZm91bmQgd2l0aG91dAotYSBkZXN0aW5hdGlvbiB0aGVuIGNyZWF0ZSBhbiBpbnB1dCByZXF1ZXN0IGFuZCBwbGFjZSBpdAotaW50byB0aGUgc3RhdGVtZW50IHRyZWUuCi0qLwotCi1zdGF0aWMgdm9pZAotbGFuZ19wbGFjZV9vcnBoYW5zICgpCi17Ci0gIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChmaWxlKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBmaWxlLT50aGVfYmZkLT5zZWN0aW9uczsKLQkgICBzICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0KQotCXsKLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBub3QgYXR0YXRjaGVkLCByb290Ci0JICAgICAgICAgYXJvdW5kIGZvciBhIHNlbnNpYmxlIHBsYWNlIGZvciBpdCB0byBnbyAqLwotCi0JICAgICAgaWYgKGZpbGUtPmp1c3Rfc3ltc19mbGFnKQotCQl7Ci0JCSAgLyogV2UgYXJlIG9ubHkgcmV0cmlldmluZyBzeW1ib2wgdmFsdWVzIGZyb20gdGhpcwotICAgICAgICAgICAgICAgICAgICAgZmlsZS4gIFdlIHdhbnQgdGhlIHN5bWJvbHMgdG8gYWN0IGFzIHRob3VnaCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBpbiB0aGUgZmlsZSBhcmUgYWJzb2x1dGUuICAqLwotCQkgIHMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJICBzLT5vdXRwdXRfb2Zmc2V0ID0gcy0+dm1hOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChzLT5uYW1lLCAiQ09NTU9OIikgPT0gMCkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSBsb25lbHkgY29tbW9uIHNlY3Rpb24gd2hpY2ggbXVzdCBoYXZlCi0JCSAgICAgY29tZSBmcm9tIGFuIGFyY2hpdmUuICBXZSBhdHRhY2ggdG8gdGhlIHNlY3Rpb24KLQkJICAgICB3aXRoIHRoZSB3aWxkY2FyZC4gICovCi0JCSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotCQkgICAgICB8fCBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24pCi0JCSAgICB7Ci0JCSAgICAgIGlmIChkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCQl7Ci0jaWYgMAotCQkJICAvKiBUaGlzIG1lc3NhZ2UgaGFwcGVucyB3aGVuIHVzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdnIzLmlmaWxlIGxpbmtlciBzY3JpcHQsIHNvIEkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBpdC4gICovCi0JCQkgIGluZm9fbXNnIChfKCIlUDogbm8gW0NPTU1PTl0gY29tbWFuZCwgZGVmYXVsdGluZyB0byAuYnNzXG4iKSk7Ci0jZW5kaWYKLQkJCSAgZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9Ci0JCQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLmJzcyIpOwotCi0JCQl9Ci0JCSAgICAgIHdpbGRfZG9pdCAoJmRlZmF1bHRfY29tbW9uX3NlY3Rpb24tPmNoaWxkcmVuLCBzLAotCQkJCSBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLCBmaWxlKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxkZW11bF9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpKQotCQk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAocy0+bmFtZSk7Ci0KLQkJICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi12b2lkCi1sYW5nX3NldF9mbGFncyAocHRyLCBmbGFncywgaW52ZXJ0KQotICAgICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcHRyOwotICAgICBDT05TVCBjaGFyICpmbGFnczsKLSAgICAgaW50IGludmVydDsKLXsKLSAgZmxhZ3dvcmQgKnB0cl9mbGFnczsKLQotICBwdHJfZmxhZ3MgPSBpbnZlcnQgPyAmcHRyLT5ub3RfZmxhZ3MgOiAmcHRyLT5mbGFnczsKLSAgd2hpbGUgKCpmbGFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpmbGFncykKLQl7Ci0JY2FzZSAnQSc6IGNhc2UgJ2EnOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBicmVhazsKLQotCWNhc2UgJ1InOiBjYXNlICdyJzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCSAgYnJlYWs7Ci0KLQljYXNlICdXJzogY2FzZSAndyc6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19EQVRBOwotCSAgYnJlYWs7Ci0KLQljYXNlICdYJzogY2FzZSAneCc6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19DT0RFOwotCSAgYnJlYWs7Ci0KLQljYXNlICdMJzogY2FzZSAnbCc6Ci0JY2FzZSAnSSc6IGNhc2UgJ2knOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfTE9BRDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIHN5bnRheCBpbiBmbGFnc1xuIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZmxhZ3MrKzsKLSAgICB9Ci19Ci0KLS8qIENhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGlucHV0IGZpbGUuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCi0gICBvbiBhbiBhcmNoaXZlLCBidXQgbm90IG9uIHRoZSBlbGVtZW50cy4gICovCi0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGlucHV0X2ZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBmICE9IE5VTEw7Ci0gICAgICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHRfcmVhbF9maWxlKQotICAgIGZ1bmMgKGYpOwotfQotCi0vKiBDYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBmaWxlLiAgVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGFsbAotICAgdGhlIGVsZW1lbnRzIG9mIGFuIGFyY2hpdmUgd2hpY2ggYXJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLCBidXQgd2lsbAotICAgbm90IGJlIGNhbGxlZCBvbiB0aGUgYXJjaGl2ZSBmaWxlIGl0c2VsZi4gICovCi0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfZmlsZSAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotewotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoZikKLSAgICB7Ci0gICAgICBmdW5jIChmKTsKLSAgICB9Ci19Ci0KLSNpZiAwCi0KLS8qIE5vdCB1c2VkLiAgKi8KLQotdm9pZAotbGFuZ19mb3JfZWFjaF9pbnB1dF9zZWN0aW9uIChmdW5jKQotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgoYmZkICogYWIsIGFzZWN0aW9uICogYXMpKTsKLXsKLSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGYpCi0gICAgewotICAgICAgYXNlY3Rpb24gKiBzOwotCi0gICAgICBmb3IgKHMgPSBmLT50aGVfYmZkLT5zZWN0aW9uczsKLQkgICBzICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0KQotCXsKLQkgIGZ1bmMgKGYtPnRoZV9iZmQsIHMpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZgotCi12b2lkCi1sZGxhbmdfYWRkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICogZW50cnk7Ci17Ci0gIGJmZCAqKnBwOwotCi0gIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAoJmZpbGVfY2hhaW4sCi0JCQkgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgZW50cnksCi0JCQkgJmVudHJ5LT5uZXh0KTsKLQotICAvKiBUaGUgQkZEIGxpbmtlciBuZWVkcyB0byBoYXZlIGEgbGlzdCBvZiBhbGwgaW5wdXQgQkZEcyBpbnZvbHZlZCBpbgotICAgICBhIGxpbmsuICAqLwotICBBU1NFUlQgKGVudHJ5LT50aGVfYmZkLT5saW5rX25leHQgPT0gKGJmZCAqKSBOVUxMKTsKLSAgQVNTRVJUIChlbnRyeS0+dGhlX2JmZCAhPSBvdXRwdXRfYmZkKTsKLSAgZm9yIChwcCA9ICZsaW5rX2luZm8uaW5wdXRfYmZkczsKLSAgICAgICAqcHAgIT0gKGJmZCAqKSBOVUxMOwotICAgICAgIHBwID0gJigqcHApLT5saW5rX25leHQpCi0gICAgOwotICAqcHAgPSBlbnRyeS0+dGhlX2JmZDsKLSAgZW50cnktPnRoZV9iZmQtPnVzcmRhdGEgPSAoUFRSKSBlbnRyeTsKLSAgYmZkX3NldF9ncF9zaXplIChlbnRyeS0+dGhlX2JmZCwgZ19zd2l0Y2hfdmFsdWUpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNoZWNrIGZvciBhbnkgd2hpY2ggc2hvdWxkIG5vdCBiZQotICAgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFdlIG5lZWQgdG8gZG8gdGhpcyBub3csIHNvIHRoYXQgd2UgY2FuCi0gICAgIG5vdGljZSB3aGVuIHRoZSBiYWNrZW5kIGxpbmtlciB0cmllcyB0byByZXBvcnQgbXVsdGlwbGUKLSAgICAgZGVmaW5pdGlvbiBlcnJvcnMgZm9yIHN5bWJvbHMgd2hpY2ggYXJlIGluIHNlY3Rpb25zIHdlIGFyZW4ndAotICAgICBnb2luZyB0byBsaW5rLiAgRklYTUU6IEl0IG1pZ2h0IGJlIGJldHRlciB0byBlbnRpcmVseSBpZ25vcmUKLSAgICAgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBpbiBzZWN0aW9ucyB3aGljaCBhcmUgZ29pbmcgdG8gYmUKLSAgICAgZGlzY2FyZGVkLiAgVGhpcyB3b3VsZCByZXF1aXJlIG1vZGlmeWluZyB0aGUgYmFja2VuZCBsaW5rZXIgZm9yCi0gICAgIGVhY2ggYmFja2VuZCB3aGljaCBtaWdodCBzZXQgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZy4gIElmIHdlIGRvCi0gICAgIHRoaXMsIHdlIHNob3VsZCBwcm9iYWJseSBoYW5kbGUgU0VDX0VYQ0xVREUgaW4gdGhlIHNhbWUgd2F5LiAgKi8KLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGVudHJ5LT50aGVfYmZkLCBzZWN0aW9uX2FscmVhZHlfbGlua2VkLCAoUFRSKSBlbnRyeSk7Ci19Ci0KLXZvaWQKLWxhbmdfYWRkX291dHB1dCAobmFtZSwgZnJvbV9zY3JpcHQpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGludCBmcm9tX3NjcmlwdDsKLXsKLSAgLyogTWFrZSAtbyBvbiBjb21tYW5kIGxpbmUgb3ZlcnJpZGUgT1VUUFVUIGluIHNjcmlwdC4gICovCi0gIGlmIChoYWRfb3V0cHV0X2ZpbGVuYW1lID09IGZhbHNlIHx8ICFmcm9tX3NjcmlwdCkKLSAgICB7Ci0gICAgICBvdXRwdXRfZmlsZW5hbWUgPSBuYW1lOwotICAgICAgaGFkX291dHB1dF9maWxlbmFtZSA9IHRydWU7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0KLXN0YXRpYyBpbnQKLXRvcG93ZXIgKHgpCi0gICAgIGludCB4OwotewotICB1bnNpZ25lZCBpbnQgaSA9IDE7Ci0gIGludCBsOwotCi0gIGlmICh4IDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZm9yIChsID0gMDsgbCA8IDMyOyBsKyspIAotICAgIHsKLSAgICAgIGlmIChpID49ICh1bnNpZ25lZCBpbnQpIHgpCi0JcmV0dXJuIGw7Ci0gICAgICBpIDw8PSAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lLAotCQkJCSAgICAgYWRkcmVzc19leHAsIHNlY3R5cGUsIGJsb2NrX3ZhbHVlLAotCQkJCSAgICAgYWxpZ24sIHN1YmFsaWduLCBlYmFzZSkKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKiBhZGRyZXNzX2V4cDsKLSAgICAgZW51bSBzZWN0aW9uX3R5cGUgc2VjdHlwZTsKLSAgICAgYmZkX3ZtYSBibG9ja192YWx1ZTsKLSAgICAgZXRyZWVfdHlwZSAqYWxpZ247Ci0gICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduOwotICAgICBldHJlZV90eXBlICplYmFzZTsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgY3VycmVudF9zZWN0aW9uID0KLSAgIG9zID0KLSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lKTsKLQotCi0KLSAgLyogQWRkIHRoaXMgc3RhdGVtZW50IHRvIHRyZWUgKi8KLSAgLyogIGFkZF9zdGF0ZW1lbnQobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ki8KLSAgLyogTWFrZSBuZXh0IHRoaW5ncyBjaGFpbiBpbnRvIHN1YmNoYWluIG9mIHRoaXMgKi8KLQotICBpZiAob3MtPmFkZHJfdHJlZSA9PQotICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCkKLSAgewotICAgIG9zLT5hZGRyX3RyZWUgPQotICAgICBhZGRyZXNzX2V4cDsKLSAgfQotICBvcy0+c2VjdHlwZSA9IHNlY3R5cGU7Ci0gIGlmIChzZWN0eXBlICE9IG5vbG9hZF9zZWN0aW9uKQotICAgIG9zLT5mbGFncyA9IFNFQ19OT19GTEFHUzsKLSAgZWxzZQotICAgIG9zLT5mbGFncyA9IFNFQ19ORVZFUl9MT0FEOwotICBvcy0+YmxvY2tfdmFsdWUgPSBibG9ja192YWx1ZSA/IGJsb2NrX3ZhbHVlIDogMTsKLSAgc3RhdF9wdHIgPSAmb3MtPmNoaWxkcmVuOwotCi0gIG9zLT5zdWJzZWN0aW9uX2FsaWdubWVudCA9IHRvcG93ZXIoCi0gICBleHBfZ2V0X3ZhbHVlX2ludChzdWJhbGlnbiwgLTEsCi0JCSAgICAgInN1YnNlY3Rpb24gYWxpZ25tZW50IiwKLQkJICAgICAwKSk7Ci0gIG9zLT5zZWN0aW9uX2FsaWdubWVudCA9IHRvcG93ZXIoCi0gICBleHBfZ2V0X3ZhbHVlX2ludChhbGlnbiwgLTEsCi0JCSAgICAgInNlY3Rpb24gYWxpZ25tZW50IiwgMCkpOwotCi0gIG9zLT5sb2FkX2Jhc2UgPSBlYmFzZTsKLX0KLQotCi12b2lkCi1sYW5nX2ZpbmFsICgpCi17Ci0gIGxhbmdfb3V0cHV0X3N0YXRlbWVudF90eXBlICpuZXcgPQotICAgIG5ld19zdGF0IChsYW5nX291dHB1dF9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLQotICBuZXctPm5hbWUgPSBvdXRwdXRfZmlsZW5hbWU7Ci19Ci0KLS8qIFJlc2V0IHRoZSBjdXJyZW50IGNvdW50ZXJzIGluIHRoZSByZWdpb25zICovCi1zdGF0aWMgdm9pZAotcmVzZXRfbWVtb3J5X3JlZ2lvbnMgKCkKLXsKLSAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLQotICBmb3IgKHAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLSAgICAgICBwICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgIHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIHAtPm9sZF9sZW5ndGggPSAoYmZkX3NpemVfdHlwZSkgKHAtPmN1cnJlbnQgLSBwLT5vcmlnaW4pOwotICAgICAgcC0+Y3VycmVudCA9IHAtPm9yaWdpbjsKLSAgICB9Ci19Ci0KLS8qIEV4cGFuZCBhIHdpbGQgc3RhdGVtZW50IGZvciBhIHBhcnRpY3VsYXIgRklMRSwgbWFya2luZyBpdHMgc2VjdGlvbnMgS0VFUAotICAgYXMgbmVlZGVkLiAgU0VDVElPTiBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIHdpbGQgY2FyZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nY19zZWN0aW9uX2NhbGxiYWNrIChwdHIsIHNlY3Rpb24sIGZpbGUsIGRhdGEpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqcHRyOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB2b2lkICpkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIElmIHRoZSB3aWxkIHBhdHRlcm4gd2FzIG1hcmtlZCBLRUVQLCB0aGUgbWVtYmVyIHNlY3Rpb25zCi0gICAgIHNob3VsZCBiZSBhcyB3ZWxsLiAgKi8KLSAgaWYgKHB0ci0+a2VlcF9zZWN0aW9ucykKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLX0KLQotLyogSGFuZGxlIGEgd2lsZCBzdGF0ZW1lbnQsIG1hcmtpbmcgaXQgYWdhaW5zdCBHQy4gIFNFQ1RJT04gb3IgRklMRSBvciBib3RoCi0gICBtYXkgYmUgTlVMTCwgaW5kaWNhdGluZyB0aGF0IGl0IGlzIGEgd2lsZGNhcmQuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19nY193aWxkIChzLCBzZWN0aW9uLCBmaWxlKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIHdhbGtfd2lsZCAocywgc2VjdGlvbiwgZmlsZSwgZ2Nfc2VjdGlvbl9jYWxsYmFjaywgTlVMTCk7Ci19Ci0KLS8qIEl0ZXJhdGUgb3ZlciBzZWN0aW9ucyBtYXJraW5nIHRoZW0gYWdhaW5zdCBHQy4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2djX3NlY3Rpb25zXzEgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfd2lsZCAoJnMtPndpbGRfc3RhdGVtZW50LAotCQkJcy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLAotCQkJcy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfc2VjdGlvbnNfMSAoY29uc3RydWN0b3JfbGlzdC5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfc2VjdGlvbnNfMSAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19nY19zZWN0aW9uc18xIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWxhbmdfZ2Nfc2VjdGlvbnMgKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKnVsaXN0LCBmYWtlX2xpc3Rfc3RhcnQ7Ci0KLSAgLyogS2VlcCBhbGwgc2VjdGlvbnMgc28gbWFya2VkIGluIHRoZSBsaW5rIHNjcmlwdC4gICovCi0KLSAgbGFuZ19nY19zZWN0aW9uc18xIChzdGF0ZW1lbnRfbGlzdC5oZWFkKTsKLQotICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBjb250YWluaW5nIHN5bWJvbHMgdW5kZWZpbmVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCi0gICAgIEhhbmRsZSB0aGUgZW50cnkgc3ltYm9sIGF0IHRoZSBzYW1lIHRpbWUuICAqLwotICAKLSAgaWYgKGVudHJ5X3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZha2VfbGlzdF9zdGFydC5uZXh0ID0gbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfaGVhZDsKLSAgICAgIGZha2VfbGlzdF9zdGFydC5uYW1lID0gKGNoYXIgKikgZW50cnlfc3ltYm9sOwotICAgICAgdWxpc3QgPSAmZmFrZV9saXN0X3N0YXJ0OwotICAgIH0KLSAgZWxzZQotICAgIHVsaXN0ID0gbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfaGVhZDsKLQotICBmb3IgKDsgdWxpc3Q7IHVsaXN0ID0gdWxpc3QtPm5leHQpCi0gICAgewotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdWxpc3QtPm5hbWUsIAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotICAgICAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT51LmRlZi5zZWN0aW9uKSkKLQl7Ci0JICBoLT51LmRlZi5zZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLQl9Ci0gICAgfQotCi0gIGJmZF9nY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci19Ci0KLXZvaWQKLWxhbmdfcHJvY2VzcyAoKQotewotICBsYW5nX3JlYXNvbmFibGVfZGVmYXVsdHMgKCk7Ci0gIGN1cnJlbnRfdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGxkbGFuZ19vcGVuX291dHB1dCk7CS8qIE9wZW4gdGhlIG91dHB1dCBmaWxlICovCi0KLSAgbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpOwotCi0gIC8qIEFkZCB0byB0aGUgaGFzaCB0YWJsZSBhbGwgdW5kZWZpbmVkcyBvbiB0aGUgY29tbWFuZCBsaW5lICovCi0gIGxhbmdfcGxhY2VfdW5kZWZpbmVkcyAoKTsKLQotICBhbHJlYWR5X2xpbmtlZF90YWJsZV9pbml0ICgpOwotCi0gIC8qIENyZWF0ZSBhIGJmZCBmb3IgZWFjaCBpbnB1dCBmaWxlICovCi0gIGN1cnJlbnRfdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0gIG9wZW5faW5wdXRfYmZkcyAoc3RhdGVtZW50X2xpc3QuaGVhZCwgZmFsc2UpOwotCi0gIGxkZW11bF9hZnRlcl9vcGVuICgpOwotCi0gIGFscmVhZHlfbGlua2VkX3RhYmxlX2ZyZWUgKCk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgd2UncmUgbm90IG1peGluZyBhcmNoaXRlY3R1cmVzLiAgV2UgY2FsbCB0aGlzCi0gICAgIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZCwgYnV0IGJlZm9yZSB3ZSBkbyBhbnkKLSAgICAgb3RoZXIgcHJvY2Vzc2luZywgc28gdGhhdCBhbnkgb3BlcmF0aW9ucyBtZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gICAgIGRvZXMgb24gdGhlIG91dHB1dCBmaWxlIHdpbGwgYmUga25vd24gZHVyaW5nIHRoZSByZXN0IG9mIHRoZQotICAgICBsaW5rLiAgKi8KLSAgbGFuZ19jaGVjayAoKTsKLQotICAvKiBIYW5kbGUgLmV4cG9ydHMgaW5zdGVhZCBvZiBhIHZlcnNpb24gc2NyaXB0IGlmIHdlJ3JlIHRvbGQgdG8gZG8gc28uICAqLwotICBpZiAoY29tbWFuZF9saW5lLnZlcnNpb25fZXhwb3J0c19zZWN0aW9uKQotICAgIGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gKCk7Ci0KLSAgLyogQnVpbGQgYWxsIHNldHMgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgbGRjdG9yX2J1aWxkX3NldHMgKCk7Ci0KLSAgLyogUmVtb3ZlIHVucmVmZXJlbmNlZCBzZWN0aW9ucyBpZiBhc2tlZCB0by4gICovCi0gIGlmIChjb21tYW5kX2xpbmUuZ2Nfc2VjdGlvbnMpCi0gICAgbGFuZ19nY19zZWN0aW9ucyAoKTsKLQotICAvKiBTaXplIHVwIHRoZSBjb21tb24gZGF0YSAqLwotICBsYW5nX2NvbW1vbiAoKTsKLQotICAvKiBSdW4gdGhyb3VnaCB0aGUgY29udG91cnMgb2YgdGhlIHNjcmlwdCBhbmQgYXR0YWNoIGlucHV0IHNlY3Rpb25zCi0gICAgIHRvIHRoZSBjb3JyZWN0IG91dHB1dCBzZWN0aW9ucwotICAgICAqLwotICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLCAoY2hhciAqKSBOVUxMLAotCQkJCShsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIE5VTEwpOwotCi0KLSAgLyogRmluZCBhbnkgc2VjdGlvbnMgbm90IGF0dGFjaGVkIGV4cGxpY2l0bHkgYW5kIGhhbmRsZSB0aGVtICovCi0gIGxhbmdfcGxhY2Vfb3JwaGFucyAoKTsKLQotICBsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb24gKCk7Ci0KLSAgLyogV2UgbXVzdCByZWNvcmQgdGhlIHByb2dyYW0gaGVhZGVycyBiZWZvcmUgd2UgdHJ5IHRvIGZpeCB0aGUKLSAgICAgc2VjdGlvbiBwb3NpdGlvbnMsIHNpbmNlIHRoZXkgd2lsbCBhZmZlY3QgU0laRU9GX0hFQURFUlMuICAqLwotICBsYW5nX3JlY29yZF9waGRycyAoKTsKLQotICAvKiBOb3cgcnVuIGFyb3VuZCBhbmQgcmVsYXggaWYgd2UgY2FuICovCi0gIGlmIChjb21tYW5kX2xpbmUucmVsYXgpCi0gICAgewotICAgICAgLyogRmlyc3QgdGltZSByb3VuZCBpcyBhIHRyaWFsIHJ1biB0byBnZXQgdGhlICd3b3JzdCBjYXNlJwotCSBhZGRyZXNzZXMgb2YgdGhlIG9iamVjdHMgaWYgdGhlcmUgd2FzIG5vIHJlbGF4aW5nLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJCSAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmKHN0YXRlbWVudF9saXN0LmhlYWQpLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotCi0gICAgICAvKiBLZWVwIHJlbGF4aW5nIHVudGlsIGJmZF9yZWxheF9zZWN0aW9uIGdpdmVzIHVwLiAgKi8KLSAgICAgIGRvCi0JewotCSAgcmVzZXRfbWVtb3J5X3JlZ2lvbnMgKCk7Ci0KLQkgIHJlbGF4X2FnYWluID0gZmFsc2U7Ci0KLQkgIC8qIE5vdGU6IHBlLWRsbC5jIGRvZXMgc29tZXRoaW5nIGxpa2UgdGhpcyBhbHNvLiAgSWYgeW91IGZpbmQKLQkgICAgIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGlzIGNvZGUsIHlvdSBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZQotCSAgICAgcGUtZGxsLmMgYWxzby4gIERKICovCi0KLQkgIC8qIERvIGFsbCB0aGUgYXNzaWdubWVudHMgd2l0aCBvdXIgY3VycmVudCBndWVzc2VzIGFzIHRvCi0JICAgICBzZWN0aW9uIHNpemVzLiAgKi8KLQkgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgICAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLQotCSAgLyogUGVyZm9ybSBhbm90aGVyIHJlbGF4IHBhc3MgLSB0aGlzIHRpbWUgd2Uga25vdyB3aGVyZSB0aGUKLQkgICAgIGdsb2JhbHMgYXJlLCBzbyBjYW4gbWFrZSBiZXR0ZXIgZ3Vlc3MuICAqLwotCSAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkJICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgICAgJihzdGF0ZW1lbnRfbGlzdC5oZWFkKSwgMCwgKGJmZF92bWEpIDAsIHRydWUpOwotCX0KLSAgICAgIHdoaWxlIChyZWxheF9hZ2Fpbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2l6ZSB1cCB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkJICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICYoc3RhdGVtZW50X2xpc3QuaGVhZCksIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBhbnl0aGluZyBzcGVjaWFsIHNob3VsZCBiZSBkb25lIG5vdyB3ZSBrbm93IGhvdyBiaWcKLSAgICAgZXZlcnl0aGluZyBpcy4gICovCi0gIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uICgpOwotCi0gIC8qIEZpeCBhbnkgLnN0YXJ0b2YuIG9yIC5zaXplb2YuIHN5bWJvbHMuICAqLwotICBsYW5nX3NldF9zdGFydG9mICgpOwotCi0gIC8qIERvIGFsbCB0aGUgYXNzaWdubWVudHMsIG5vdyB0aGF0IHdlIGtub3cgdGhlIGZpbmFsIHJlc3RpbmdwbGFjZXMKLSAgICAgb2YgYWxsIHRoZSBzeW1ib2xzICovCi0KLSAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJICAgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJICAgICAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgbWFrZSBzZW5zZS4gICovCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcykKLSAgICBsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzICgpOwotICAKLSAgLyogRmluYWwgc3R1ZmZzICovCi0KLSAgbGRlbXVsX2ZpbmlzaCAoKTsKLSAgbGFuZ19maW5pc2ggKCk7Ci19Ci0KLS8qIEVYUE9SVEVEIFRPIFlBQ0MgKi8KLQotdm9pZAotbGFuZ19hZGRfd2lsZCAoc2VjdGlvbl9uYW1lLCBzZWN0aW9uc19zb3J0ZWQsIGZpbGVuYW1lLCBmaWxlbmFtZXNfc29ydGVkLAotCSAgICAgICBrZWVwX3NlY3Rpb25zLCBleGNsdWRlX2ZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpjb25zdCBzZWN0aW9uX25hbWU7Ci0gICAgIGJvb2xlYW4gc2VjdGlvbnNfc29ydGVkOwotICAgICBjb25zdCBjaGFyICpjb25zdCBmaWxlbmFtZTsKLSAgICAgYm9vbGVhbiBmaWxlbmFtZXNfc29ydGVkOwotICAgICBib29sZWFuIGtlZXBfc2VjdGlvbnM7Ci0gICAgIGNvbnN0IGNoYXIgKmV4Y2x1ZGVfZmlsZW5hbWU7Ci17Ci0gIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfd2lsZF9zdGF0ZW1lbnQsCi0JCQkJCSAgICBzdGF0X3B0cik7Ci0KLSAgaWYgKHNlY3Rpb25fbmFtZSAhPSAoY2hhciAqKSBOVUxMICYmIHN0cmNtcCAoc2VjdGlvbl9uYW1lLCAiQ09NTU9OIikgPT0gMCkKLSAgICB7Ci0gICAgICBwbGFjZWRfY29tbW9ucyA9IHRydWU7Ci0gICAgfQotICBpZiAoZmlsZW5hbWUgIT0gTlVMTCAmJiAhIHdpbGRjYXJkcCAoZmlsZW5hbWUpKQotICAgIHsKLSAgICAgIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSB0cnVlOwotICAgIH0KLSAgbmV3LT5zZWN0aW9uX25hbWUgPSBzZWN0aW9uX25hbWU7Ci0gIG5ldy0+c2VjdGlvbnNfc29ydGVkID0gc2VjdGlvbnNfc29ydGVkOwotICBuZXctPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIG5ldy0+ZmlsZW5hbWVzX3NvcnRlZCA9IGZpbGVuYW1lc19zb3J0ZWQ7Ci0gIG5ldy0+a2VlcF9zZWN0aW9ucyA9IGtlZXBfc2VjdGlvbnM7Ci0gIG5ldy0+ZXhjbHVkZV9maWxlbmFtZSA9IGV4Y2x1ZGVfZmlsZW5hbWU7Ci0gIGxhbmdfbGlzdF9pbml0ICgmbmV3LT5jaGlsZHJlbik7Ci19Ci0KLXZvaWQKLWxhbmdfc2VjdGlvbl9zdGFydCAobmFtZSwgYWRkcmVzcykKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqIGFkZHJlc3M7Ci17Ci0gIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfdHlwZSAqYWQgPSBuZXdfc3RhdCAobGFuZ19hZGRyZXNzX3N0YXRlbWVudCwgc3RhdF9wdHIpOwotCi0gIGFkLT5zZWN0aW9uX25hbWUgPSBuYW1lOwotICBhZC0+YWRkcmVzcyA9IGFkZHJlc3M7Ci19Ci0KLS8qIFNldCB0aGUgc3RhcnQgc3ltYm9sIHRvIE5BTUUuICBDTURMSU5FIGlzIG5vbnplcm8gaWYgdGhpcyBpcyBjYWxsZWQKLSAgIGJlY2F1c2Ugb2YgYSAtZSBhcmd1bWVudCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciB6ZXJvIGlmIHRoaXMgaXMKLSAgIGNhbGxlZCBieSBFTlRSWSBpbiBhIGxpbmtlciBzY3JpcHQuICBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRha2UKLSAgIHByZWNlZGVuY2UuICAqLwotCi12b2lkCi1sYW5nX2FkZF9lbnRyeSAobmFtZSwgY21kbGluZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBjbWRsaW5lOwotewotICBpZiAoZW50cnlfc3ltYm9sID09IE5VTEwKLSAgICAgIHx8IGNtZGxpbmUKLSAgICAgIHx8ICEgZW50cnlfZnJvbV9jbWRsaW5lKQotICAgIHsKLSAgICAgIGVudHJ5X3N5bWJvbCA9IG5hbWU7Ci0gICAgICBlbnRyeV9mcm9tX2NtZGxpbmUgPSBjbWRsaW5lOwotICAgIH0KLX0KLQotdm9pZAotbGFuZ19hZGRfdGFyZ2V0IChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfdGFyZ2V0X3N0YXRlbWVudCwKLQkJCQkJICAgICAgc3RhdF9wdHIpOwotCi0gIG5ldy0+dGFyZ2V0ID0gbmFtZTsKLQotfQotCi12b2lkCi1sYW5nX2FkZF9tYXAgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpuYW1lKQotCXsKLQkgIGNhc2UgJ0YnOgotCSAgbWFwX29wdGlvbl9mID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIG5hbWUrKzsKLSAgICB9Ci19Ci0KLXZvaWQKLWxhbmdfYWRkX2ZpbGwgKGV4cCkKLSAgICAgaW50IGV4cDsKLXsKLSAgbGFuZ19maWxsX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ19maWxsX3N0YXRlbWVudCwKLQkJCQkJICAgIHN0YXRfcHRyKTsKLQotICBuZXctPmZpbGwgPSBleHA7Ci19Ci0KLXZvaWQKLWxhbmdfYWRkX2RhdGEgKHR5cGUsIGV4cCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIHVuaW9uIGV0cmVlX3VuaW9uICpleHA7Ci17Ci0KLSAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ19kYXRhX3N0YXRlbWVudCwKLQkJCQkJICAgIHN0YXRfcHRyKTsKLQotICBuZXctPmV4cCA9IGV4cDsKLSAgbmV3LT50eXBlID0gdHlwZTsKLQotfQotCi0vKiBDcmVhdGUgYSBuZXcgcmVsb2Mgc3RhdGVtZW50LiAgUkVMT0MgaXMgdGhlIEJGRCByZWxvY2F0aW9uIHR5cGUgdG8KLSAgIGdlbmVyYXRlLiAgSE9XVE8gaXMgdGhlIGNvcnJlc3BvbmRpbmcgaG93dG8gc3RydWN0dXJlICh3ZSBjb3VsZAotICAgbG9vayB0aGlzIHVwLCBidXQgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBkb25lIHNvKS4gIFNFQ1RJT04gaXMgdGhlCi0gICBzZWN0aW9uIHRvIGdlbmVyYXRlIGEgcmVsb2MgYWdhaW5zdCwgb3IgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUKLSAgIHN5bWJvbCB0byBnZW5lcmF0ZSBhIHJlbG9jIGFnYWluc3QuICBFeGFjdGx5IG9uZSBvZiBTRUNUSU9OIGFuZAotICAgTkFNRSBtdXN0IGJlIE5VTEwuICBBRERFTkQgaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIGFkZGVuZC4gICovCi0KLXZvaWQKLWxhbmdfYWRkX3JlbG9jIChyZWxvYywgaG93dG8sIHNlY3Rpb24sIG5hbWUsIGFkZGVuZCkKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHVuaW9uIGV0cmVlX3VuaW9uICphZGRlbmQ7Ci17Ci0gIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnAgPSBuZXdfc3RhdCAobGFuZ19yZWxvY19zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLSAgCi0gIHAtPnJlbG9jID0gcmVsb2M7Ci0gIHAtPmhvd3RvID0gaG93dG87Ci0gIHAtPnNlY3Rpb24gPSBzZWN0aW9uOwotICBwLT5uYW1lID0gbmFtZTsKLSAgcC0+YWRkZW5kX2V4cCA9IGFkZGVuZDsKLQotICBwLT5hZGRlbmRfdmFsdWUgPSAwOwotICBwLT5vdXRwdXRfc2VjdGlvbiA9IE5VTEw7Ci0gIHAtPm91dHB1dF92bWEgPSAwOwotfQotCi1sYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKgotbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICogZXhwOwotewotICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50LAotCQkJCQkJICBzdGF0X3B0cik7Ci0KLSAgbmV3LT5leHAgPSBleHA7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXZvaWQKLWxhbmdfYWRkX2F0dHJpYnV0ZSAoYXR0cmlidXRlKQotICAgICBlbnVtIHN0YXRlbWVudF9lbnVtIGF0dHJpYnV0ZTsKLXsKLSAgbmV3X3N0YXRlbWVudCAoYXR0cmlidXRlLCBzaXplb2YgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUpLCBzdGF0X3B0cik7Ci19Ci0KLXZvaWQKLWxhbmdfc3RhcnR1cCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKHN0YXJ0dXBfZmlsZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlUCVGbXVsdGlwbGUgU1RBUlRVUCBmaWxlc1xuIikpOwotICAgIH0KLSAgZmlyc3RfZmlsZS0+ZmlsZW5hbWUgPSBuYW1lOwotICBmaXJzdF9maWxlLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gIGZpcnN0X2ZpbGUtPnJlYWwgPSB0cnVlOwotCi0gIHN0YXJ0dXBfZmlsZSA9IG5hbWU7Ci19Ci0KLXZvaWQKLWxhbmdfZmxvYXQgKG1heWJlKQotICAgICBib29sZWFuIG1heWJlOwotewotICBsYW5nX2Zsb2F0X2ZsYWcgPSBtYXliZTsKLX0KLQotdm9pZAotbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKGZpbGwsIG1lbXNwZWMsIHBoZHJzKQotICAgICBiZmRfdm1hIGZpbGw7Ci0gICAgIGNvbnN0IGNoYXIgKm1lbXNwZWM7Ci0gICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Ci17Ci0gIGN1cnJlbnRfc2VjdGlvbi0+ZmlsbCA9IGZpbGw7Ci0gIGN1cnJlbnRfc2VjdGlvbi0+cmVnaW9uID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAobWVtc3BlYyk7Ci0gIGN1cnJlbnRfc2VjdGlvbi0+cGhkcnMgPSBwaGRyczsKLSAgc3RhdF9wdHIgPSAmc3RhdGVtZW50X2xpc3Q7Ci19Ci0KLS8qCi0gQ3JlYXRlIGFuIGFic29sdXRlIHN5bWJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIHdpdGggdGhlIHZhbHVlIG9mIHRoZQotIGFkZHJlc3Mgb2YgZmlyc3QgYnl0ZSBvZiB0aGUgc2VjdGlvbiBuYW1lZC4KLQotIElmIHRoZSBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIHRoZW4gZG8gbm90aGluZy4KLSovCi12b2lkCi1sYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mIChzZWNuYW1lLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpzZWNuYW1lOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLQotICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldwotICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgc2VjbmFtZSk7Ci0gICAgICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCWgtPnUuZGVmLnZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQloLT51LmRlZi52YWx1ZSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIHNlYyk7Ci0KLSAgICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgIH0KLX0KLQotLyoKLSBDcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgd2l0aCB0aGUgdmFsdWUgb2YgdGhlCi0gYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIG5hbWVkLgotCi0gSWYgdGhlIHN5bWJvbCBhbHJlYWR5IGV4aXN0cywgdGhlbiBkbyBub3RoaW5nLgotKi8KLXZvaWQKLWxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YgKHNlY25hbWUsIG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIG5hbWUsIHRydWUsIHRydWUsIHRydWUpOwotICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCi0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3Ci0gICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBzZWNuYW1lKTsKLSAgICAgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JaC0+dS5kZWYudmFsdWUgPSAwOwotICAgICAgZWxzZQotCWgtPnUuZGVmLnZhbHVlID0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIHNlYykKLQkJCSAgKyBiZmRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCBzZWMpKTsKLQotICAgICAgaC0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotfQotCi12b2lkCi1sYW5nX3N0YXRlbWVudF9hcHBlbmQgKGxpc3QsIGVsZW1lbnQsIGZpZWxkKQotICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKiBsaXN0OwotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogZWxlbWVudDsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiBmaWVsZDsKLXsKLSAgKihsaXN0LT50YWlsKSA9IGVsZW1lbnQ7Ci0gIGxpc3QtPnRhaWwgPSBmaWVsZDsKLX0KLQotLyogU2V0IHRoZSBvdXRwdXQgZm9ybWF0IHR5cGUuICAtb2Zvcm1hdCBvdmVycmlkZXMgc2NyaXB0cy4gICovCi0KLXZvaWQKLWxhbmdfYWRkX291dHB1dF9mb3JtYXQgKGZvcm1hdCwgYmlnLCBsaXR0bGUsIGZyb21fc2NyaXB0KQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKmJpZzsKLSAgICAgY29uc3QgY2hhciAqbGl0dGxlOwotICAgICBpbnQgZnJvbV9zY3JpcHQ7Ci17Ci0gIGlmIChvdXRwdXRfdGFyZ2V0ID09IE5VTEwgfHwgIWZyb21fc2NyaXB0KQotICAgIHsKLSAgICAgIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9CSUcKLQkgICYmIGJpZyAhPSBOVUxMKQotCWZvcm1hdCA9IGJpZzsKLSAgICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0xJVFRMRQotCSAgICAgICAmJiBsaXR0bGUgIT0gTlVMTCkKLQlmb3JtYXQgPSBsaXR0bGU7Ci0KLSAgICAgIG91dHB1dF90YXJnZXQgPSBmb3JtYXQ7Ci0gICAgfQotfQotCi0vKiBFbnRlciBhIGdyb3VwLiAgVGhpcyBjcmVhdGVzIGEgbmV3IGxhbmdfZ3JvdXBfc3RhdGVtZW50LCBhbmQgc2V0cwotICAgc3RhdF9wdHIgdG8gYnVpbGQgbmV3IHN0YXRlbWVudHMgd2l0aGluIHRoZSBncm91cC4gICovCi0KLXZvaWQKLWxhbmdfZW50ZXJfZ3JvdXAgKCkKLXsKLSAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSAqZzsKLQotICBnID0gbmV3X3N0YXQgKGxhbmdfZ3JvdXBfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0gIGxhbmdfbGlzdF9pbml0ICgmZy0+Y2hpbGRyZW4pOwotICBzdGF0X3B0ciA9ICZnLT5jaGlsZHJlbjsKLX0KLQotLyogTGVhdmUgYSBncm91cC4gIFRoaXMganVzdCByZXNldHMgc3RhdF9wdHIgdG8gc3RhcnQgd3JpdGluZyB0byB0aGUKLSAgIHJlZ3VsYXIgbGlzdCBvZiBzdGF0ZW1lbnRzIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBub3Qgd29yayBpZgotICAgZ3JvdXBzIGNhbiBvY2N1ciBpbnNpZGUgYW55dGhpbmcgZWxzZSB3aGljaCBjYW4gYWRqdXN0IHN0YXRfcHRyLAotICAgYnV0IGN1cnJlbnRseSB0aGV5IGNhbid0LiAgKi8KLQotdm9pZAotbGFuZ19sZWF2ZV9ncm91cCAoKQotewotICBzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKLX0KLQotLyogQWRkIGEgbmV3IHByb2dyYW0gaGVhZGVyLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggZW50cnkgaW4gYSBQSERSUwotICAgY29tbWFuZCBpbiBhIGxpbmtlciBzY3JpcHQuICAqLwotCi12b2lkCi1sYW5nX25ld19waGRyIChuYW1lLCB0eXBlLCBmaWxlaGRyLCBwaGRycywgYXQsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICp0eXBlOwotICAgICBib29sZWFuIGZpbGVoZHI7Ci0gICAgIGJvb2xlYW4gcGhkcnM7Ci0gICAgIGV0cmVlX3R5cGUgKmF0OwotICAgICBldHJlZV90eXBlICpmbGFnczsKLXsKLSAgc3RydWN0IGxhbmdfcGhkciAqbiwgKipwcDsKLQotICBuID0gKHN0cnVjdCBsYW5nX3BoZHIgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGFuZ19waGRyKSk7Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5uYW1lID0gbmFtZTsKLSAgbi0+dHlwZSA9IGV4cF9nZXRfdmFsdWVfaW50ICh0eXBlLCAwLCAicHJvZ3JhbSBoZWFkZXIgdHlwZSIsCi0JCQkgICAgICAgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLSAgbi0+ZmlsZWhkciA9IGZpbGVoZHI7Ci0gIG4tPnBoZHJzID0gcGhkcnM7Ci0gIG4tPmF0ID0gYXQ7Ci0gIG4tPmZsYWdzID0gZmxhZ3M7Ci0KLSAgZm9yIChwcCA9ICZsYW5nX3BoZHJfbGlzdDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gbjsKLX0KLQotLyogUmVjb3JkIHRoZSBwcm9ncmFtIGhlYWRlciBpbmZvcm1hdGlvbiBpbiB0aGUgb3V0cHV0IEJGRC4gIEZJWE1FOiBXZQotICAgc2hvdWxkIG5vdCBiZSBjYWxsaW5nIGFuIEVMRiBzcGVjaWZpYyBmdW5jdGlvbiBoZXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfcmVjb3JkX3BoZHJzICgpCi17Ci0gIHVuc2lnbmVkIGludCBhbGM7Ci0gIGFzZWN0aW9uICoqc2VjczsKLSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpsYXN0OwotICBzdHJ1Y3QgbGFuZ19waGRyICpsOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp1OwotCi0gIGFsYyA9IDEwOwotICBzZWNzID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChhbGMgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgbGFzdCA9IE5VTEw7Ci0gIGZvciAobCA9IGxhbmdfcGhkcl9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBiZmRfdm1hIGF0OwotCi0gICAgICBjID0gMDsKLSAgICAgIGZvciAodSA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmhlYWQ7Ci0JICAgdSAhPSBOVUxMOwotCSAgIHUgPSB1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQubmV4dCkKLQl7Ci0JICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQkgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGw7Ci0KLQkgIG9zID0gJnUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotCSAgcGwgPSBvcy0+cGhkcnM7Ci0JICBpZiAocGwgIT0gTlVMTCkKLQkgICAgbGFzdCA9IHBsOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG9zLT5zZWN0eXBlID09IG5vbG9hZF9zZWN0aW9uCi0JCSAgfHwgb3MtPmJmZF9zZWN0aW9uID09IE5VTEwKLQkJICB8fCAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgcGwgPSBsYXN0OwotCSAgICB9Ci0KLQkgIGlmIChvcy0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGZvciAoOyBwbCAhPSBOVUxMOyBwbCA9IHBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAocGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JCXsKLQkJICBpZiAoYyA+PSBhbGMpCi0JCSAgICB7Ci0JCSAgICAgIGFsYyAqPSAyOwotCQkgICAgICBzZWNzID0gKChhc2VjdGlvbiAqKikKLQkJCSAgICAgIHhyZWFsbG9jIChzZWNzLCBhbGMgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0JCSAgICB9Ci0JCSAgc2Vjc1tjXSA9IG9zLT5iZmRfc2VjdGlvbjsKLQkJICArK2M7Ci0JCSAgcGwtPnVzZWQgPSB0cnVlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsLT5mbGFncyA9PSBOVUxMKQotCWZsYWdzID0gMDsKLSAgICAgIGVsc2UKLQlmbGFncyA9IGV4cF9nZXRfdm1hIChsLT5mbGFncywgMCwgInBoZHIgZmxhZ3MiLAotCQkJICAgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pOwotCi0gICAgICBpZiAobC0+YXQgPT0gTlVMTCkKLQlhdCA9IDA7Ci0gICAgICBlbHNlCi0JYXQgPSBleHBfZ2V0X3ZtYSAobC0+YXQsIDAsICJwaGRyIGxvYWQgYWRkcmVzcyIsCi0JCQkgIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0KLSAgICAgIGlmICghIGJmZF9yZWNvcmRfcGhkciAob3V0cHV0X2JmZCwgbC0+dHlwZSwKLQkJCSAgICAgbC0+ZmxhZ3MgPT0gTlVMTCA/IGZhbHNlIDogdHJ1ZSwKLQkJCSAgICAgZmxhZ3MsCi0JCQkgICAgIGwtPmF0ID09IE5VTEwgPyBmYWxzZSA6IHRydWUsCi0JCQkgICAgIGF0LCBsLT5maWxlaGRyLCBsLT5waGRycywgYywgc2VjcykpCi0JZWluZm8gKF8oIiVGJVA6IGJmZF9yZWNvcmRfcGhkciBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotCi0gIGZyZWUgKHNlY3MpOwotCi0gIC8qIE1ha2Ugc3VyZSBhbGwgdGhlIHBoZHIgYXNzaWdubWVudHMgc3VjY2VlZGVkLiAgKi8KLSAgZm9yICh1ID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuaGVhZDsKLSAgICAgICB1ICE9IE5VTEw7Ci0gICAgICAgdSA9IHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGw7Ci0KLSAgICAgIGlmICh1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuYmZkX3NlY3Rpb24gPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgZm9yIChwbCA9IHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5waGRyczsKLQkgICBwbCAhPSBOVUxMOwotCSAgIHBsID0gcGwtPm5leHQpCi0JaWYgKCEgcGwtPnVzZWQgJiYgc3RyY21wIChwbC0+bmFtZSwgIk5PTkUiKSAhPSAwKQotCSAgZWluZm8gKF8oIiVYJVA6IHNlY3Rpb24gYCVzJyBhc3NpZ25lZCB0byBub24tZXhpc3RlbnQgcGhkciBgJXMnXG4iKSwKLQkJIHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5uYW1lLCBwbC0+bmFtZSk7Ci0gICAgfQotfQotCi0vKiBSZWNvcmQgYSBsaXN0IG9mIHNlY3Rpb25zIHdoaWNoIG1heSBub3QgYmUgY3Jvc3MgcmVmZXJlbmNlZC4gICovCi0KLXZvaWQKLWxhbmdfYWRkX25vY3Jvc3NyZWYgKGwpCi0gICAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKmw7Ci17Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuOwotCi0gIG4gPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+bmV4dCA9IG5vY3Jvc3NyZWZfbGlzdDsKLSAgbi0+bGlzdCA9IGw7Ci0gIG5vY3Jvc3NyZWZfbGlzdCA9IG47Ci0KLSAgLyogU2V0IG5vdGljZV9hbGwgc28gdGhhdCB3ZSBnZXQgaW5mb3JtZWQgYWJvdXQgYWxsIHN5bWJvbHMuICAqLwotICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IHRydWU7Ci19Ci0MCi0vKiBPdmVybGF5IGhhbmRsaW5nLiAgV2UgaGFuZGxlIG92ZXJsYXlzIHdpdGggc29tZSBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLQotLyogVGhlIG92ZXJsYXkgdmlydHVhbCBhZGRyZXNzLiAgKi8KLXN0YXRpYyBldHJlZV90eXBlICpvdmVybGF5X3ZtYTsKLQotLyogVGhlIG92ZXJsYXkgbG9hZCBhZGRyZXNzLiAgKi8KLXN0YXRpYyBldHJlZV90eXBlICpvdmVybGF5X2xtYTsKLQotLyogV2hldGhlciBub2Nyb3NzcmVmcyBpcyBzZXQgZm9yIHRoaXMgb3ZlcmxheS4gICovCi1zdGF0aWMgaW50IG92ZXJsYXlfbm9jcm9zc3JlZnM7Ci0KLS8qIEFuIGV4cHJlc3Npb24gZm9yIHRoZSBtYXhpbXVtIHNlY3Rpb24gc2l6ZSBzZWVuIHNvIGZhci4gICovCi1zdGF0aWMgZXRyZWVfdHlwZSAqb3ZlcmxheV9tYXg7Ci0KLS8qIEEgbGlzdCBvZiBhbGwgdGhlIHNlY3Rpb25zIGluIHRoaXMgb3ZlcmxheS4gICovCi0KLXN0cnVjdCBvdmVybGF5X2xpc3QKLXsKLSAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbmV4dDsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci19OwotCi1zdGF0aWMgc3RydWN0IG92ZXJsYXlfbGlzdCAqb3ZlcmxheV9saXN0OwotCi0vKiBTdGFydCBoYW5kbGluZyBhbiBvdmVybGF5LiAgKi8KLQotdm9pZAotbGFuZ19lbnRlcl9vdmVybGF5ICh2bWFfZXhwciwgbG1hX2V4cHIsIG5vY3Jvc3NyZWZzKQotICAgICBldHJlZV90eXBlICp2bWFfZXhwcjsKLSAgICAgZXRyZWVfdHlwZSAqbG1hX2V4cHI7Ci0gICAgIGludCBub2Nyb3NzcmVmczsKLXsKLSAgLyogVGhlIGdyYW1tYXIgc2hvdWxkIHByZXZlbnQgbmVzdGVkIG92ZXJsYXlzIGZyb20gb2NjdXJyaW5nLiAgKi8KLSAgQVNTRVJUIChvdmVybGF5X3ZtYSA9PSBOVUxMCi0JICAmJiBvdmVybGF5X2xtYSA9PSBOVUxMCi0JICAmJiBvdmVybGF5X2xpc3QgPT0gTlVMTAotCSAgJiYgb3ZlcmxheV9tYXggPT0gTlVMTCk7Ci0KLSAgb3ZlcmxheV92bWEgPSB2bWFfZXhwcjsKLSAgb3ZlcmxheV9sbWEgPSBsbWFfZXhwcjsKLSAgb3ZlcmxheV9ub2Nyb3NzcmVmcyA9IG5vY3Jvc3NyZWZzOwotfQotCi0vKiBTdGFydCBhIHNlY3Rpb24gaW4gYW4gb3ZlcmxheS4gIFdlIGhhbmRsZSB0aGlzIGJ5IGNhbGxpbmcKLSAgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IHdpdGggdGhlIGNvcnJlY3QgVk1BIGFuZCBMTUEuICAqLwotCi12b2lkCi1sYW5nX2VudGVyX292ZXJsYXlfc2VjdGlvbiAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbjsKLSAgZXRyZWVfdHlwZSAqc2l6ZTsKLQotICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAobmFtZSwgb3ZlcmxheV92bWEsIG5vcm1hbF9zZWN0aW9uLAotCQkJCSAgICAgICAwLCAwLCAwLCBvdmVybGF5X2xtYSk7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2VjdGlvbiwgdGhlbiBiYXNlIHRoZSBWTUEgYW5kIExNQSBvZiBmdXR1cmUKLSAgICAgc2VjdGlvbnMgb24gdGhpcyBvbmUuICBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZXZlbiBpZiBgLicgaXMKLSAgICAgdXNlZCBpbiB0aGUgYWRkcmVzc2VzLiAgKi8KLSAgaWYgKG92ZXJsYXlfbGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIG92ZXJsYXlfdm1hID0gZXhwX25hbWVvcCAoQUREUiwgbmFtZSk7Ci0gICAgICBvdmVybGF5X2xtYSA9IGV4cF9uYW1lb3AgKExPQURBRERSLCBuYW1lKTsKLSAgICB9Ci0KLSAgLyogUmVtZW1iZXIgdGhlIHNlY3Rpb24uICAqLwotICBuID0gKHN0cnVjdCBvdmVybGF5X2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+b3MgPSBjdXJyZW50X3NlY3Rpb247Ci0gIG4tPm5leHQgPSBvdmVybGF5X2xpc3Q7Ci0gIG92ZXJsYXlfbGlzdCA9IG47Ci0KLSAgc2l6ZSA9IGV4cF9uYW1lb3AgKFNJWkVPRiwgbmFtZSk7Ci0KLSAgLyogQWRqdXN0IHRoZSBMTUEgZm9yIHRoZSBuZXh0IHNlY3Rpb24uICAqLwotICBvdmVybGF5X2xtYSA9IGV4cF9iaW5vcCAoJysnLCBvdmVybGF5X2xtYSwgc2l6ZSk7Ci0KLSAgLyogQXJyYW5nZSB0byB3b3JrIG91dCB0aGUgbWF4aW11bSBzZWN0aW9uIGVuZCBhZGRyZXNzLiAgKi8KLSAgaWYgKG92ZXJsYXlfbWF4ID09IE5VTEwpCi0gICAgb3ZlcmxheV9tYXggPSBzaXplOwotICBlbHNlCi0gICAgb3ZlcmxheV9tYXggPSBleHBfYmlub3AgKE1BWF9LLCBvdmVybGF5X21heCwgc2l6ZSk7Ci19Ci0KLS8qIEZpbmlzaCBhIHNlY3Rpb24gaW4gYW4gb3ZlcmxheS4gIFRoZXJlIGlzbid0IGFueSBzcGVjaWFsIHRvIGRvCi0gICBoZXJlLiAgKi8KLQotdm9pZAotbGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24gKGZpbGwsIHBoZHJzKQotICAgICBiZmRfdm1hIGZpbGw7Ci0gICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgKmNsZWFuLCAqczI7Ci0gIGNvbnN0IGNoYXIgKnMxOwotICBjaGFyICpidWY7Ci0KLSAgbmFtZSA9IGN1cnJlbnRfc2VjdGlvbi0+bmFtZTsKLQotICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoZmlsbCwgIipkZWZhdWx0KiIsIHBoZHJzKTsKLQotICAvKiBEZWZpbmUgdGhlIG1hZ2ljIHN5bWJvbHMuICAqLwotCi0gIGNsZWFuID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICBzMiA9IGNsZWFuOwotICBmb3IgKHMxID0gbmFtZTsgKnMxICE9ICdcMCc7IHMxKyspCi0gICAgaWYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqczEpIHx8ICpzMSA9PSAnXycpCi0gICAgICAqczIrKyA9ICpzMTsKLSAgKnMyID0gJ1wwJzsKLQotICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNsZWFuKSArIHNpemVvZiAiX19sb2FkX3N0YXJ0XyIpOwotICBzcHJpbnRmIChidWYsICJfX2xvYWRfc3RhcnRfJXMiLCBjbGVhbik7Ci0gIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBidWYsCi0JCQkJICBleHBfbmFtZW9wIChMT0FEQUREUiwgbmFtZSkpKTsKLQotICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNsZWFuKSArIHNpemVvZiAiX19sb2FkX3N0b3BfIik7Ci0gIHNwcmludGYgKGJ1ZiwgIl9fbG9hZF9zdG9wXyVzIiwgY2xlYW4pOwotICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgYnVmLAotCQkJCSAgZXhwX2Jpbm9wICgnKycsCi0JCQkJCSAgICAgZXhwX25hbWVvcCAoTE9BREFERFIsIG5hbWUpLAotCQkJCQkgICAgIGV4cF9uYW1lb3AgKFNJWkVPRiwgbmFtZSkpKSk7Ci0KLSAgZnJlZSAoY2xlYW4pOwotfQotCi0vKiBGaW5pc2ggYW4gb3ZlcmxheS4gIElmIHRoZXJlIGFyZSBhbnkgb3ZlcmxheSB3aWRlIHNldHRpbmdzLCB0aGlzCi0gICBsb29rcyB0aHJvdWdoIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhlIG92ZXJsYXkgYW5kIHNldHMgdGhlbS4gICovCi0KLXZvaWQKLWxhbmdfbGVhdmVfb3ZlcmxheSAoZmlsbCwgbWVtc3BlYywgcGhkcnMpCi0gICAgIGJmZF92bWEgZmlsbDsKLSAgICAgY29uc3QgY2hhciAqbWVtc3BlYzsKLSAgICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwaGRyczsKLXsKLSAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnJlZ2lvbjsKLSAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbDsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbm9jcm9zc3JlZjsKLQotICBpZiAobWVtc3BlYyA9PSBOVUxMKQotICAgIHJlZ2lvbiA9IE5VTEw7Ci0gIGVsc2UKLSAgICByZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChtZW1zcGVjKTsKLQotICBub2Nyb3NzcmVmID0gTlVMTDsKLQotICBsID0gb3ZlcmxheV9saXN0OwotICB3aGlsZSAobCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBvdmVybGF5X2xpc3QgKm5leHQ7Ci0KLSAgICAgIGlmIChmaWxsICE9IDAgJiYgbC0+b3MtPmZpbGwgPT0gMCkKLQlsLT5vcy0+ZmlsbCA9IGZpbGw7Ci0gICAgICBpZiAocmVnaW9uICE9IE5VTEwgJiYgbC0+b3MtPnJlZ2lvbiA9PSBOVUxMKQotCWwtPm9zLT5yZWdpb24gPSByZWdpb247Ci0gICAgICBpZiAocGhkcnMgIT0gTlVMTCAmJiBsLT5vcy0+cGhkcnMgPT0gTlVMTCkKLQlsLT5vcy0+cGhkcnMgPSBwaGRyczsKLQotICAgICAgaWYgKG92ZXJsYXlfbm9jcm9zc3JlZnMpCi0JewotCSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmM7Ci0KLQkgIG5jID0gKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuYyk7Ci0JICBuYy0+bmFtZSA9IGwtPm9zLT5uYW1lOwotCSAgbmMtPm5leHQgPSBub2Nyb3NzcmVmOwotCSAgbm9jcm9zc3JlZiA9IG5jOwotCX0KLQotICAgICAgbmV4dCA9IGwtPm5leHQ7Ci0gICAgICBmcmVlIChsKTsKLSAgICAgIGwgPSBuZXh0OwotICAgIH0KLQotICBpZiAobm9jcm9zc3JlZiAhPSBOVUxMKQotICAgIGxhbmdfYWRkX25vY3Jvc3NyZWYgKG5vY3Jvc3NyZWYpOwotCi0gIC8qIFVwZGF0ZSAuIGZvciB0aGUgZW5kIG9mIHRoZSBvdmVybGF5LiAgKi8KLSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICIuIiwKLQkJCQkgIGV4cF9iaW5vcCAoJysnLCBvdmVybGF5X3ZtYSwgb3ZlcmxheV9tYXgpKSk7Ci0KLSAgb3ZlcmxheV92bWEgPSBOVUxMOwotICBvdmVybGF5X2xtYSA9IE5VTEw7Ci0gIG92ZXJsYXlfbm9jcm9zc3JlZnMgPSAwOwotICBvdmVybGF5X2xpc3QgPSBOVUxMOwotICBvdmVybGF5X21heCA9IE5VTEw7Ci19Ci0MCi0vKiBWZXJzaW9uIGhhbmRsaW5nLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgRUxGLiAgKi8KLQotLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaG9sZHMgdGhlIHZlcnNpb24gdHJlZSB0aGF0IHdlIGJ1aWxkLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpsYW5nX2VsZl92ZXJzaW9uX2luZm87Ci0KLXN0YXRpYyBpbnQKLWxhbmdfdmVyc19tYXRjaF9sYW5nX2MgKGV4cHIsIHN5bSkKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpleHByOwotICAgICBjb25zdCBjaGFyICpzeW07Ci17Ci0gIGlmIChleHByLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBleHByLT5wYXR0ZXJuWzFdID09ICdcMCcpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBzeW0sIDApID09IDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWxhbmdfdmVyc19tYXRjaF9sYW5nX2NwbHVzcGx1cyAoZXhwciwgc3ltKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmV4cHI7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bTsKLXsKLSAgY2hhciAqYWx0X3N5bTsKLSAgaW50IHJlc3VsdDsKLQotICBpZiAoZXhwci0+cGF0dGVyblswXSA9PSAnKicgJiYgZXhwci0+cGF0dGVyblsxXSA9PSAnXDAnKQotICAgIHJldHVybiAxOwotCi0gIGFsdF9zeW0gPSBjcGx1c19kZW1hbmdsZShzeW0sIC8qIERNR0xfTk9fVFBBUkFNUyAqLyAwKTsKLSAgaWYgKCFhbHRfc3ltKQotICAgIHsKLSAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIChhbHNvKSByZXR1cm5zIE5VTEwgd2hlbiBpdCBpcyBub3QgYSBDKysgc3ltYm9sLgotCSBTaG91bGQgd2UgZWFybHkgb3V0IGZhbHNlIGluIHRoaXMgY2FzZT8gICovCi0gICAgICByZXN1bHQgPSBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBzeW0sIDApID09IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgYWx0X3N5bSwgMCkgPT0gMDsKLSAgICAgIGZyZWUgKGFsdF9zeW0pOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1sYW5nX3ZlcnNfbWF0Y2hfbGFuZ19qYXZhIChleHByLCBzeW0pCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZXhwcjsKLSAgICAgY29uc3QgY2hhciAqc3ltOwotewotICBjaGFyICphbHRfc3ltOwotICBpbnQgcmVzdWx0OwotCi0gIGlmIChleHByLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBleHByLT5wYXR0ZXJuWzFdID09ICdcMCcpCi0gICAgcmV0dXJuIDE7Ci0KLSAgYWx0X3N5bSA9IGNwbHVzX2RlbWFuZ2xlKHN5bSwgRE1HTF9KQVZBKTsKLSAgaWYgKCFhbHRfc3ltKQotICAgIHsKLSAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIChhbHNvKSByZXR1cm5zIE5VTEwgd2hlbiBpdCBpcyBub3QgYSBKYXZhIHN5bWJvbC4KLQkgU2hvdWxkIHdlIGVhcmx5IG91dCBmYWxzZSBpbiB0aGlzIGNhc2U/ICAqLwotICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgc3ltLCAwKSA9PSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIGFsdF9zeW0sIDApID09IDA7Ci0gICAgICBmcmVlIChhbHRfc3ltKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggdmFyaWFibGUgbmFtZSBvciBtYXRjaCBleHByZXNzaW9uLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICoKLWxhbmdfbmV3X3ZlcnNfcmVnZXggKG9yaWcsIG5ldywgbGFuZykKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpvcmlnOwotICAgICBjb25zdCBjaGFyICpuZXc7Ci0gICAgIGNvbnN0IGNoYXIgKmxhbmc7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICByZXQtPm5leHQgPSBvcmlnOwotICByZXQtPnBhdHRlcm4gPSBuZXc7Ci0KLSAgaWYgKGxhbmcgPT0gTlVMTCB8fCBzdHJjYXNlY21wIChsYW5nLCAiQyIpID09IDApCi0gICAgcmV0LT5tYXRjaCA9IGxhbmdfdmVyc19tYXRjaF9sYW5nX2M7Ci0gIGVsc2UgaWYgKHN0cmNhc2VjbXAgKGxhbmcsICJDKysiKSA9PSAwKQotICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jcGx1c3BsdXM7Ci0gIGVsc2UgaWYgKHN0cmNhc2VjbXAgKGxhbmcsICJKYXZhIikgPT0gMCkKLSAgICByZXQtPm1hdGNoID0gbGFuZ192ZXJzX21hdGNoX2xhbmdfamF2YTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlWCVQOiB1bmtub3duIGxhbmd1YWdlIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIiksCi0JICAgICBsYW5nKTsKLSAgICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCBzZXQgb2YgdmFyaWFibGUgbmFtZXMgYW5kIG1hdGNoCi0gICBleHByZXNzaW9ucy4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqCi1sYW5nX25ld192ZXJzX25vZGUgKGdsb2JhbHMsIGxvY2FscykKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpnbG9iYWxzOwotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmxvY2FsczsKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIHJldC0+bmV4dCA9IE5VTEw7Ci0gIHJldC0+bmFtZSA9IE5VTEw7Ci0gIHJldC0+dmVybnVtID0gMDsKLSAgcmV0LT5nbG9iYWxzID0gZ2xvYmFsczsKLSAgcmV0LT5sb2NhbHMgPSBsb2NhbHM7Ci0gIHJldC0+ZGVwcyA9IE5VTEw7Ci0gIHJldC0+bmFtZV9pbmR4ID0gKHVuc2lnbmVkIGludCkgLTE7Ci0gIHJldC0+dXNlZCA9IDA7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGtlZXBzIHRyYWNrIG9mIHZlcnNpb24gaW5kaWNlcy4gICovCi0KLXN0YXRpYyBpbnQgdmVyc2lvbl9pbmRleDsKLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBrbm93IHRoZSBuYW1lIGFuZCBkZXBlbmRlbmNpZXMgb2YgdGhlCi0gICB2ZXJzaW9uLiAgKi8KLQotdm9pZAotbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKG5hbWUsIHZlcnNpb24sIGRlcHMpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyc2lvbjsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZXBzOwotewotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQsICoqcHA7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZTE7Ci0KLSAgLyogTWFrZSBzdXJlIHRoaXMgbm9kZSBoYXMgYSB1bmlxdWUgbmFtZS4gICovCi0gIGZvciAodCA9IGxhbmdfZWxmX3ZlcnNpb25faW5mbzsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLSAgICBpZiAoc3RyY21wICh0LT5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgZWluZm8gKF8oIiVYJVA6IGR1cGxpY2F0ZSB2ZXJzaW9uIHRhZyBgJXMnXG4iKSwgbmFtZSk7Ci0KLSAgLyogQ2hlY2sgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbWF0Y2ggbmFtZXMsIGFuZCBtYWtlIHN1cmUgdGhlcmUKLSAgICAgYXJlbid0IGFueSBkdXBsaWNhdGVzLiAgKi8KLQotICBmb3IgKGUxID0gdmVyc2lvbi0+Z2xvYmFsczsgZTEgIT0gTlVMTDsgZTEgPSBlMS0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHQgPSBsYW5nX2VsZl92ZXJzaW9uX2luZm87IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICplMjsKLQotCSAgZm9yIChlMiA9IHQtPmxvY2FsczsgZTIgIT0gTlVMTDsgZTIgPSBlMi0+bmV4dCkKLQkgICAgaWYgKHN0cmNtcCAoZTEtPnBhdHRlcm4sIGUyLT5wYXR0ZXJuKSA9PSAwKQotCSAgICAgIGVpbmZvIChfKCIlWCVQOiBkdXBsaWNhdGUgZXhwcmVzc2lvbiBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIpLAotCQkgICAgIGUxLT5wYXR0ZXJuKTsKLQl9Ci0gICAgfQotCi0gIGZvciAoZTEgPSB2ZXJzaW9uLT5sb2NhbHM7IGUxICE9IE5VTEw7IGUxID0gZTEtPm5leHQpCi0gICAgewotICAgICAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCXsKLQkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZTI7Ci0KLQkgIGZvciAoZTIgPSB0LT5nbG9iYWxzOyBlMiAhPSBOVUxMOyBlMiA9IGUyLT5uZXh0KQotCSAgICBpZiAoc3RyY21wIChlMS0+cGF0dGVybiwgZTItPnBhdHRlcm4pID09IDApCi0JICAgICAgZWluZm8gKF8oIiVYJVA6IGR1cGxpY2F0ZSBleHByZXNzaW9uIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIiksCi0JCSAgICAgZTEtPnBhdHRlcm4pOwotCX0KLSAgICB9Ci0KLSAgdmVyc2lvbi0+ZGVwcyA9IGRlcHM7Ci0gIHZlcnNpb24tPm5hbWUgPSBuYW1lOwotICArK3ZlcnNpb25faW5kZXg7Ci0gIHZlcnNpb24tPnZlcm51bSA9IHZlcnNpb25faW5kZXg7Ci0KLSAgZm9yIChwcCA9ICZsYW5nX2VsZl92ZXJzaW9uX2luZm87ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZlcnNpb247Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Ugc2VlIGEgdmVyc2lvbiBkZXBlbmRlbmN5LiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICoKLWxhbmdfYWRkX3ZlcnNfZGVwZW5kIChsaXN0LCBuYW1lKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmxpc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqcmV0OwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIHJldC0+bmV4dCA9IGxpc3Q7Ci0KLSAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHQtPm5hbWUsIG5hbWUpID09IDApCi0JewotCSAgcmV0LT52ZXJzaW9uX25lZWRlZCA9IHQ7Ci0JICByZXR1cm4gcmV0OwotCX0KLSAgICB9Ci0KLSAgZWluZm8gKF8oIiVYJVA6IHVuYWJsZSB0byBmaW5kIHZlcnNpb24gZGVwZW5kZW5jeSBgJXMnXG4iKSwgbmFtZSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLWxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gKCkKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpncmVnID0gTlVMTCwgKmxyZWc7Ci0KLSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZXhwb3J0cyIpOwotICAgICAgY2hhciAqY29udGVudHMsICpwOwotICAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci0KLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGxlbiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzZWMpOwotICAgICAgY29udGVudHMgPSB4bWFsbG9jIChsZW4pOwotICAgICAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzZWMsIGNvbnRlbnRzLCAwLCBsZW4pKQotCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gcmVhZCAuZXhwb3J0cyBzZWN0aW9uIGNvbnRlbnRzIiksIHNlYyk7Ci0KLSAgICAgIHAgPSBjb250ZW50czsKLSAgICAgIHdoaWxlIChwIDwgY29udGVudHMrbGVuKQotCXsKLQkgIGdyZWcgPSBsYW5nX25ld192ZXJzX3JlZ2V4IChncmVnLCBwLCBOVUxMKTsKLQkgIHAgPSBzdHJjaHIgKHAsICdcMCcpICsgMTsKLQl9Ci0KLSAgICAgIC8qIERvIG5vdCBmcmVlIHRoZSBjb250ZW50cywgYXMgd2UgdXNlZCB0aGVtIGNyZWF0aW5nIHRoZSByZWdleC4gICovCi0KLSAgICAgIC8qIERvIG5vdCBpbmNsdWRlIHRoaXMgc2VjdGlvbiBpbiB0aGUgbGluay4gICovCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGlzLT50aGVfYmZkLCBzZWMsCi0JYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpcy0+dGhlX2JmZCwgc2VjKSB8IFNFQ19FWENMVURFKTsKLSAgICB9Ci0KLSAgbHJlZyA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKE5VTEwsICIqIiwgTlVMTCk7Ci0gIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlIChjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24sCi0JCQkgICBsYW5nX25ld192ZXJzX25vZGUgKGdyZWcsIGxyZWcpLCBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkbGFuZy5oIGIvbGQvbGRsYW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNjM5MzguLjAwMDAwMDAKLS0tIGEvbGQvbGRsYW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyogbGRsYW5nLmggLSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotICAgCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExETEFOR19ICi0jZGVmaW5lIExETEFOR19ICi0KLXR5cGVkZWYgZW51bQotewotICBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotICBsYW5nX2lucHV0X2ZpbGVfaXNfc3ltYm9sc19vbmx5X2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bSwKLSAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKLSAgbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0KLX0gbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZmlsbF90eXBlOwotdHlwZWRlZiBzdHJ1Y3Qgc3RhdGVtZW50X2xpc3QKLXsKLSAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKmhlYWQ7Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICoqdGFpbDsKLX0gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdCAqbmV4dDsKLSAgYmZkX3ZtYSBvcmlnaW47Ci0gIGJmZF9zaXplX3R5cGUgbGVuZ3RoOwotICBiZmRfdm1hIGN1cnJlbnQ7Ci0gIGJmZF9zaXplX3R5cGUgb2xkX2xlbmd0aDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGZsYWd3b3JkIG5vdF9mbGFnczsKLSAgYm9vbGVhbiBoYWRfZnVsbF9tZXNzYWdlOwotfSBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfc3RhdGVtZW50X2hlYWRlcl9zdHJ1Y3QgCi17Ci0gIHVuaW9uICBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHQ7Ci0gIGVudW0gc3RhdGVtZW50X2VudW0KLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtLAotICAgICAgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bSwKLQotICAgICAgbGFuZ19hZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW0KLSAgICB9IHR5cGU7Ci19IGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuaW9uIGV0cmVlX3VuaW9uICpleHA7Ci19IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgY29uc3QgY2hhciAqdGFyZ2V0OwotfSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBsYW5nX291dHB1dF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX0gbGFuZ19vdXRwdXRfc3RhdGVtZW50X3R5cGU7Ci0KLS8qIFNlY3Rpb24gdHlwZXMgc3BlY2lmaWVkIGluIGEgbGlua2VyIHNjcmlwdC4gICovCi0KLWVudW0gc2VjdGlvbl90eXBlCi17Ci0gIG5vcm1hbF9zZWN0aW9uLAotICBkc2VjdF9zZWN0aW9uLAotICBjb3B5X3NlY3Rpb24sCi0gIG5vbG9hZF9zZWN0aW9uLAotICBpbmZvX3NlY3Rpb24sCi0gIG92ZXJsYXlfc2VjdGlvbgotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYSBsaXN0IG9mIHByb2dyYW0gaGVhZGVycyBkZXNjcmliaW5nIHNlZ21lbnRzCi0gICBpbiB3aGljaCB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlIHBsYWNlZC4gICovCi0KLXN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdAotewotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJvb2xlYW4gdXNlZDsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3N0cnVjdCAKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bmlvbiBldHJlZV91bmlvbiAqYWRkcl90cmVlOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47Ci0gIGNvbnN0IGNoYXIgKm1lbXNwZWM7Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGJvb2xlYW4gcHJvY2Vzc2VkOwotICAgIAotICBhc2VjdGlvbiAqYmZkX3NlY3Rpb247Ci0gIGZsYWd3b3JkIGZsYWdzOwkJLyogT3IgdG9nZXRoZXIgb2YgYWxsIGlucHV0IHNlY3Rpb25zICovCi0gIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGU7Ci0gIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdCAqcmVnaW9uOwotICBzaXplX3QgYmxvY2tfdmFsdWU7Ci0gIGZpbGxfdHlwZSBmaWxsOwotCi0gIGludCBzdWJzZWN0aW9uX2FsaWdubWVudDsgIC8qIGFsaWdubWVudCBvZiBjb21wb25lbnRzICovCi0gIGludCBzZWN0aW9uX2FsaWdubWVudDsgIC8qIGFsaWdubWVudCBvZiBzdGFydCBvZiBzZWN0aW9uICovCi0KLSAgdW5pb24gZXRyZWVfdW5pb24gKmxvYWRfYmFzZTsKLQotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBoZHJzOwotfSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLX0gbGFuZ19jb21tb25fc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLX0gbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBmaWxsX3R5cGUgZmlsbDsKLSAgaW50IHNpemU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLX0gbGFuZ19maWxsX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuc2lnbmVkIGludCB0eXBlOwotICB1bmlvbiAgZXRyZWVfdW5pb24gKmV4cDsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICBiZmRfdm1hIG91dHB1dF92bWE7Ci19IGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZTsKLQotLyogR2VuZXJhdGUgYSByZWxvYyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0KLSAgLyogUmVsb2MgdG8gZ2VuZXJhdGUuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0KLSAgLyogUmVsb2MgaG93dG8gc3RydWN0dXJlLiAgKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogU2VjdGlvbiB0byBnZW5lcmF0ZSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2Ygc2VjdGlvbiBhbmQKLSAgICAgbmFtZSBtdXN0IGJlIE5VTEwuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAvKiBOYW1lIG9mIHN5bWJvbCB0byBnZW5lcmF0ZSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2Ygc2VjdGlvbgotICAgICBhbmQgbmFtZSBtdXN0IGJlIE5VTEwuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIEV4cHJlc3Npb24gZm9yIGFkZGVuZC4gICovCi0gIHVuaW9uIGV0cmVlX3VuaW9uICphZGRlbmRfZXhwOwotCi0gIC8qIFJlc29sdmVkIGFkZGVuZC4gICovCi0gIGJmZF92bWEgYWRkZW5kX3ZhbHVlOwotCi0gIC8qIE91dHB1dCBzZWN0aW9uIHdoZXJlIHJlbG9jIHNob3VsZCBiZSBwZXJmb3JtZWQuICAqLwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogVk1BIHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgb3V0cHV0X3ZtYTsKLX0gbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgLyogTmFtZSBvZiB0aGlzIGZpbGUuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogTmFtZSB0byB1c2UgZm9yIHRoZSBzeW1ib2wgZ2l2aW5nIGFkZHJlc3Mgb2YgdGV4dCBzdGFydCAqLwotICAvKiBVc3VhbGx5IHRoZSBzYW1lIGFzIGZpbGVuYW1lLCBidXQgZm9yIGEgZmlsZSBzcGVjJ2Qgd2l0aCAtbAotICAgICB0aGlzIGlzIHRoZSAtbCBzd2l0Y2ggaXRzZWxmIHJhdGhlciB0aGFuIHRoZSBmaWxlbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmxvY2FsX3N5bV9uYW1lOwotICAgIAotICBiZmQgKnRoZV9iZmQ7Ci0gICAgCi0gIGJvb2xlYW4gY2xvc2VkOwotICBmaWxlX3B0ciBwYXNzaXZlX3Bvc2l0aW9uOwotICAgIAotICAvKiBTeW1ib2wgdGFibGUgb2YgdGhlIGZpbGUuICAqLwotICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7Ci0gICAgCi0gIC8qIFBvaW50IHRvIHRoZSBuZXh0IGZpbGUgLSB3aGF0ZXZlciBpdCBpcywgd2FuZGVycyB1cCBhbmQgZG93bgotICAgICBhcmNoaXZlcyAqLwotICAgIAotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHQ7Ci0gIC8qIFBvaW50IHRvIHRoZSBuZXh0IGZpbGUsIGJ1dCBza2lwcyBhcmNoaXZlIGNvbnRlbnRzICovCi0gIHVuaW9uICBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHRfcmVhbF9maWxlOwotICAgIAotICBib29sZWFuIGlzX2FyY2hpdmU7Ci0gICAgCi0gIC8qIDEgbWVhbnMgc2VhcmNoIGEgc2V0IG9mIGRpcmVjdG9yaWVzIGZvciB0aGlzIGZpbGUuICAqLwotICBib29sZWFuIHNlYXJjaF9kaXJzX2ZsYWc7Ci0gICAgCi0gIC8qIDEgbWVhbnMgdGhpcyBpcyBiYXNlIGZpbGUgb2YgaW5jcmVtZW50YWwgbG9hZC4KLSAgICAgRG8gbm90IGxvYWQgdGhpcyBmaWxlJ3MgdGV4dCBvciBkYXRhLgotICAgICBBbHNvIGRlZmF1bHQgdGV4dF9zdGFydCB0byBhZnRlciB0aGlzIGZpbGUncyBic3MuICovCi0gICAgCi0gIGJvb2xlYW4ganVzdF9zeW1zX2ZsYWc7Ci0KLSAgLyogV2hldGhlciB0byBzZWFyY2ggZm9yIHRoaXMgZW50cnkgYXMgYSBkeW5hbWljIGFyY2hpdmUuICAqLwotICBib29sZWFuIGR5bmFtaWM7Ci0KLSAgLyogV2hldGhlciB0byBpbmNsdWRlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZS4gICovCi0gIGJvb2xlYW4gd2hvbGVfYXJjaGl2ZTsKLQotICBib29sZWFuIGxvYWRlZDsKLSAgICAKLSAgLyogICAgdW5zaWduZWQgaW50IGdsb2JhbHNfaW5fdGhpc19maWxlOyovCi0gIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgYm9vbGVhbiByZWFsOwotfSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppZmlsZTsKLSAgCi19IGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpmaWxlOwotfSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfd2lsZF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwotICBib29sZWFuIHNlY3Rpb25zX3NvcnRlZDsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGJvb2xlYW4gZmlsZW5hbWVzX3NvcnRlZDsKLSAgYm9vbGVhbiBrZWVwX3NlY3Rpb25zOwotICBjb25zdCBjaGFyICpleGNsdWRlX2ZpbGVuYW1lOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47Ci19IGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9zdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBjb25zdCAgY2hhciAqc2VjdGlvbl9uYW1lOwotICB1bmlvbiAgZXRyZWVfdW5pb24gKmFkZHJlc3M7Ci19IGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBiZmRfdm1hIG91dHB1dF9vZmZzZXQ7Ci0gIHNpemVfdCBzaXplOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gIGZpbGxfdHlwZSBmaWxsOwotfSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGU7Ci0KLS8qIEEgZ3JvdXAgc3RhdGVtZW50IGNvbGxlY3RzIGEgc2V0IG9mIGxpYnJhcmllcyB0b2dldGhlci4gIFRoZQotICAgbGlicmFyaWVzIGFyZSBzZWFyY2hlZCBtdWx0aXBsZSB0aW1lcywgdW50aWwgbm8gbmV3IHVuZGVmaW5lZAotICAgc3ltYm9scyBhcmUgZm91bmQuICBUaGUgZWZmZWN0IGlzIHRvIHNlYXJjaCBhIGdyb3VwIG9mIGxpYnJhcmllcyBhcwotICAgdGhvdWdoIHRoZXkgd2VyZSBhIHNpbmdsZSBsaWJyYXJ5LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47Ci19IGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gCi17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKm5leHQ7Ci0gIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSB3aWxkX3N0YXRlbWVudDsKLSAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlIGRhdGFfc3RhdGVtZW50OwotICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlIHJlbG9jX3N0YXRlbWVudDsKLSAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlIGFkZHJlc3Nfc3RhdGVtZW50OwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgbGFuZ19hZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudF90eXBlIGFmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50OwotICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgYXNzaWdubWVudF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgaW5wdXRfc3RhdGVtZW50OwotICBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfdHlwZSB0YXJnZXRfc3RhdGVtZW50OwotICBsYW5nX291dHB1dF9zdGF0ZW1lbnRfdHlwZSBvdXRwdXRfc3RhdGVtZW50OwotICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSBpbnB1dF9zZWN0aW9uOwotICBsYW5nX2NvbW1vbl9zdGF0ZW1lbnRfdHlwZSBjb21tb25fc3RhdGVtZW50OwotICBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF90eXBlIG9iamVjdF9zeW1ib2xzX3N0YXRlbWVudDsKLSAgbGFuZ19maWxsX3N0YXRlbWVudF90eXBlIGZpbGxfc3RhdGVtZW50OwotICBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUgcGFkZGluZ19zdGF0ZW1lbnQ7Ci0gIGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUgZ3JvdXBfc3RhdGVtZW50OwotfSBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2dyYW0gaGVhZGVyLCBmcm9tIHRoZQotICAgUEhEUlMgY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLXN0cnVjdCBsYW5nX3BoZHIKLXsKLSAgc3RydWN0IGxhbmdfcGhkciAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyB0eXBlOwotICBib29sZWFuIGZpbGVoZHI7Ci0gIGJvb2xlYW4gcGhkcnM7Ci0gIGV0cmVlX3R5cGUgKmF0OwotICBldHJlZV90eXBlICpmbGFnczsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIGxpc3Qgb2Ygc2VjdGlvbnMgd2hpY2ggbWF5IG5vdAotICAgY3Jvc3MgcmVmZXJlbmNlIGVhY2ggb3RoZXIuICAqLwotCi1zdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmCi17Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi0vKiBUaGUgbGlzdCBvZiBub2Nyb3NzcmVmIGxpc3RzLiAgKi8KLQotc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMKLXsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5leHQ7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKmxpc3Q7Ci19OwotCi1leHRlcm4gc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5vY3Jvc3NyZWZfbGlzdDsKLQotZXh0ZXJuIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmFic19vdXRwdXRfc2VjdGlvbjsKLWV4dGVybiBib29sZWFuIGxhbmdfaGFzX2lucHV0X2ZpbGU7Ci1leHRlcm4gZXRyZWVfdHlwZSAqYmFzZTsKLWV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnN0YXRfcHRyOwotZXh0ZXJuIGJvb2xlYW4gZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmU7Ci0KLWV4dGVybiBjb25zdCBjaGFyICplbnRyeV9zeW1ib2w7Ci1leHRlcm4gYm9vbGVhbiBlbnRyeV9mcm9tX2NtZGxpbmU7Ci0KLWV4dGVybiB2b2lkIGxhbmdfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvbnN0KSk7Ci1leHRlcm4gc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpsYW5nX21lbW9yeV9yZWdpb25fZGVmYXVsdAotICBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX21hcCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3NldF9mbGFncyBQQVJBTVMgKChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqLCBjb25zdCBjaGFyICosCi0JCQkJICAgIGludCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfb3V0cHV0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50IGZyb21fc2NyaXB0KSk7Ci1leHRlcm4gdm9pZCBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotICBQQVJBTVMgKChjb25zdCBjaGFyICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbmFtZSwKLQkgICBldHJlZV90eXBlICogYWRkcmVzc19leHAsCi0JICAgZW51bSBzZWN0aW9uX3R5cGUgc2VjdHlwZSwKLQkgICBiZmRfdm1hIGJsb2NrX3ZhbHVlLAotCSAgIGV0cmVlX3R5cGUgKmFsaWduLAotCSAgIGV0cmVlX3R5cGUgKnN1YmFsaWduLAotCSAgIGV0cmVlX3R5cGUgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19maW5hbCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3Byb2Nlc3MgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19zZWN0aW9uX3N0YXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5pb24gZXRyZWVfdW5pb24gKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfZW50cnkgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF90YXJnZXQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF93aWxkCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX21hcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX2ZpbGwgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICogbGFuZ19hZGRfYXNzaWdubWVudCBQQVJBTVMgKCh1bmlvbiBldHJlZV91bmlvbiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9hdHRyaWJ1dGUgUEFSQU1TICgoZW51bSBzdGF0ZW1lbnRfZW51bSkpOwotZXh0ZXJuIHZvaWQgbGFuZ19zdGFydHVwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19mbG9hdCBQQVJBTVMgKChlbnVtIGJmZF9ib29sZWFuKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotICBQQVJBTVMgKChiZmRfdm1hLCBjb25zdCBjaGFyICosIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3N0YXRlbWVudF9hcHBlbmQgUEFSQU1TICgoc3RydWN0IHN0YXRlbWVudF9saXN0ICosCi0JCQkJCSAgIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICosCi0JCQkJCSAgIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICoqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUKLSAgUEFSQU1TICgodm9pZCAoKmRvdGhpcykgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpKTsKLWV4dGVybiB2b2lkIGxhbmdfZm9yX2VhY2hfZmlsZQotICBQQVJBTVMgKCh2b2lkICgqZG90aGlzKSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSkpOwotZXh0ZXJuIGJmZF92bWEgbGFuZ19kb19hc3NpZ25tZW50cwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogcywKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JICAgZmlsbF90eXBlIGZpbGwsCi0JICAgYmZkX3ZtYSBkb3QpKTsKLQotI2RlZmluZSBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVChzdGF0ZW1lbnQpCQlcCi0gIGV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgZmlsZV9jaGFpbjsJCQlcCi0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnN0YXRlbWVudDsJCQkJXAotICBmb3IgKHN0YXRlbWVudCA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopZmlsZV9jaGFpbi5oZWFkO1wKLSAgICAgICBzdGF0ZW1lbnQgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKilOVUxMOwkJXAotICAgICAgIHN0YXRlbWVudCA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopc3RhdGVtZW50LT5uZXh0KVwKLSAgCi1leHRlcm4gdm9pZCBsYW5nX3Byb2Nlc3MgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsYW5nX2FkZF9maWxlIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotZXh0ZXJuIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZAotICBQQVJBTVMgKChjb25zdCBjaGFyICogY29uc3QpKTsKLWV4dGVybiBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpsYW5nX2FkZF9pbnB1dF9maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgZmlsZV90eXBlLAotCSAgIGNvbnN0IGNoYXIgKnRhcmdldCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfa2VlcHN5bXNfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKgotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgUEFSQU1TICgoY29uc3QgY2hhciAqIGNvbnN0IG5hbWUpKTsKLWV4dGVybiB2b2lkIGxkbGFuZ19hZGRfdW5kZWYgUEFSQU1TICgoY29uc3QgY2hhciAqY29uc3QgbmFtZSkpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKiwgaW50IGZyb21fc2NyaXB0KSk7Ci1leHRlcm4gdm9pZCBsYW5nX2xpc3RfaW5pdCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9kYXRhIFBBUkFNUyAoKGludCB0eXBlLCB1bmlvbiBldHJlZV91bmlvbiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9yZWxvYwotICBQQVJBTVMgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MsIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvLAotCSAgIGFzZWN0aW9uICpzZWN0aW9uLCBjb25zdCBjaGFyICpuYW1lLCB1bmlvbiBldHJlZV91bmlvbiAqYWRkZW5kKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudAotICBQQVJBTVMgKCh2b2lkICgqZnVuYykgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpKTsKLWV4dGVybiBQVFIgc3RhdF9hbGxvYyBQQVJBTVMgKChzaXplX3Qgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgZHByaW50X3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICosIGludCkpOwotZXh0ZXJuIGJmZF92bWEgbGFuZ19zaXplX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCSAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwcmV2LCBmaWxsX3R5cGUgZmlsbCwKLQkgICBiZmRfdm1hIGRvdCwgYm9vbGVhbiByZWxheCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9ncm91cCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2xlYXZlX2dyb3VwIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHdpbGRfZG9pdAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnB0ciwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0LAotCSAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGUpKTsKLWV4dGVybiB2b2lkIGxhbmdfbmV3X3BoZHIKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBldHJlZV90eXBlICosIGJvb2xlYW4sIGJvb2xlYW4sIGV0cmVlX3R5cGUgKiwKLQkgICBldHJlZV90eXBlICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX25vY3Jvc3NyZWYgUEFSQU1TICgoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2VudGVyX292ZXJsYXkgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICosIGludCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbgotICBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdmVybGF5Ci0gIFBBUkFNUyAoKGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopKTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqbGFuZ19lbGZfdmVyc2lvbl9pbmZvOwotCi1leHRlcm4gc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpsYW5nX25ld192ZXJzX3JlZ2V4Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqbGFuZ19uZXdfdmVyc19ub2RlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqLCBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbGFuZ19hZGRfdmVyc19kZXBlbmQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKiwKLQkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkbGV4LmggYi9sZC9sZGxleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ0NGNhLi4wMDAwMDAwCi0tLSBhL2xkL2xkbGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiBsZGxleC5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRExFWF9ICi0jZGVmaW5lIExETEVYX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFRoZSBpbml0aWFsIHBhcnNlciBzdGF0ZXMuICAqLwotdHlwZWRlZiBlbnVtIGlucHV0X2VudW0gewotICBpbnB1dF9zZWxlY3RlZCwJCS8qIFdlJ3ZlIHNldCB0aGUgaW5pdGlhbCBzdGF0ZS4gICovCi0gIGlucHV0X3NjcmlwdCwKLSAgaW5wdXRfbXJpX3NjcmlwdCwKLSAgaW5wdXRfdmVyc2lvbl9zY3JpcHQsCi0gIGlucHV0X2RlZnN5bQotfSBpbnB1dF90eXBlOwotCi1leHRlcm4gaW5wdXRfdHlwZSBwYXJzZXJfaW5wdXQ7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgbGluZW5vOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmxleF9zdHJpbmc7Ci0KLS8qIEluIGxkbGV4LmwuICAqLwotZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZXhfcHVzaF9maWxlIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZXhfcmVkaXJlY3QgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9zY3JpcHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfbXJpX3NjcmlwdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF92ZXJzaW9uX3NjcmlwdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF92ZXJzaW9uX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfZGVmc3ltIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X2V4cHJlc3Npb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfYm90aCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9jb21tYW5kIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X3BvcHN0YXRlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSW4gbGV4c3VwLmMuICAqLwotZXh0ZXJuIGludCBsZXhfaW5wdXQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGV4X3VucHV0IFBBUkFNUyAoKGludCkpOwotI2lmbmRlZiB5eXdyYXAKLWV4dGVybiBpbnQgeXl3cmFwIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGxleC5sIGIvbGQvbGRsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlZjgwZi4uMDAwMDAwMAotLS0gYS9sZC9sZGxleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNjYyICswLDAgQEAKLSV7Ci0KLS8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotVGhpcyB3YXMgd3JpdHRlbiBieSBzdGV2ZSBjaGFtYmVybGFpbgotICAgICAgICAgICAgICAgICAgICBzYWNAY3lnbnVzLmNvbQotKi8KLQotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBNUFcKLS8qIFByZXZlbnQgZW51bSByZWRlZmluaXRpb24gcHJvYmxlbXMuICovCi0jZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi0jZW5kaWYgLyogTVBXICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotLyogVGhlIHR5cGUgb2YgdG9wLWxldmVsIHBhcnNlciBpbnB1dC4KLSAgIHl5bGV4IGFuZCB5eXBhcnNlIChpbmRpcmVjdGx5KSBib3RoIGNoZWNrIHRoaXMuICAqLwotaW5wdXRfdHlwZSBwYXJzZXJfaW5wdXQ7Ci0KLS8qIExpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IGlucHV0IGZpbGUuCi0gICAoRklYTUUgQWN0dWFsbHksIGl0IGRvZXNuJ3QgYXBwZWFyIHRvIGdldCByZXNldCBmb3IgZWFjaCBmaWxlPykgICovCi11bnNpZ25lZCBpbnQgbGluZW5vID0gMTsKLQotLyogVGhlIHN0cmluZyB3ZSBhcmUgY3VycmVudGx5IGxleGluZywgb3IgTlVMTCBpZiB3ZSBhcmUgcmVhZGluZyBhCi0gICBmaWxlLiAgKi8KLWNvbnN0IGNoYXIgKmxleF9zdHJpbmcgPSBOVUxMOwotCi0vKiBTdXBwb3J0IGZvciBmbGV4IHJlYWRpbmcgZnJvbSBtb3JlIHRoYW4gb25lIGlucHV0IGZpbGUgKHN0cmVhbSkuCi0gICBgaW5jbHVkZV9zdGFjaycgaXMgZmxleCdzIGlucHV0IHN0YXRlIGZvciBlYWNoIG9wZW4gZmlsZTsKLSAgIGBmaWxlX25hbWVfc3RhY2snIGlzIHRoZSBmaWxlIG5hbWVzLiAgYGxpbmVub19zdGFjaycgaXMgdGhlIGN1cnJlbnQKLSAgIGxpbmUgbnVtYmVycy4KLQotICAgSWYgYGluY2x1ZGVfc3RhY2tfcHRyJyBpcyAwLCB3ZSBoYXZlbid0IHN0YXJ0ZWQgcmVhZGluZyBhbnl0aGluZyB5ZXQuCi0gICBPdGhlcndpc2UsIHN0YWNrIGVsZW1lbnRzIDAgdGhyb3VnaCBgaW5jbHVkZV9zdGFja19wdHIgLSAxJyBhcmUgdmFsaWQuICAqLwotCi0jdW5kZWYgWVlfSU5QVVQKLSNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgeXlfaW5wdXQoYnVmLCAmcmVzdWx0LCBtYXhfc2l6ZSkKLQotI2RlZmluZSBNQVhfSU5DTFVERV9ERVBUSCAxMAotc3RhdGljIFlZX0JVRkZFUl9TVEFURSBpbmNsdWRlX3N0YWNrW01BWF9JTkNMVURFX0RFUFRIXTsKLXN0YXRpYyBjb25zdCBjaGFyICpmaWxlX25hbWVfc3RhY2tbTUFYX0lOQ0xVREVfREVQVEhdOwotc3RhdGljIHVuc2lnbmVkIGludCBsaW5lbm9fc3RhY2tbTUFYX0lOQ0xVREVfREVQVEhdOwotc3RhdGljIHVuc2lnbmVkIGludCBpbmNsdWRlX3N0YWNrX3B0ciA9IDA7Ci1zdGF0aWMgaW50IHZlcnNfbm9kZV9uZXN0aW5nID0gMDsKLQotc3RhdGljIFlZX0JVRkZFUl9TVEFURSB5eV9jcmVhdGVfc3RyaW5nX2J1ZmZlciBQQVJBTVMgKChjb25zdCBjaGFyICpzdHJpbmcsCi0JCQkJCQkJc2l6ZV90IHNpemUpKTsKLXN0YXRpYyB2b2lkIHl5X2lucHV0IFBBUkFNUyAoKGNoYXIgKiwgaW50ICpyZXN1bHQsIGludCBtYXhfc2l6ZSkpOwotCi1zdGF0aWMgdm9pZCBjb21tZW50IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxleF93YXJuX2ludmFsaWQgUEFSQU1TICgoY2hhciAqd2hlcmUsIGNoYXIgKndoYXQpKTsKLQotLyogU1RBVEVTIAotCUVYUFJFU1NJT04JZGVmaW5pdGVseSBpbiBhbiBleHByZXNzaW9uCi0JU0NSSVBUCQlkZWZpbml0ZWx5IGluIGEgc2NyaXB0Ci0JQk9USAkJZWl0aGVyIEVYUFJFU1NJT04gb3IgU0NSSVBUCi0JREVGU1lNRVhQCWluIGFuIGFyZ3VtZW50IHRvIC1kZWZzeW0KLSAgICAgICAgTVJJICAgICAgICAgICAgIGluIGFuIE1SSSBzY3JpcHQKLQlWRVJTX1NUQVJUCXN0YXJ0aW5nIGEgU3VuIHN0eWxlIG1hcGZpbGUKLQlWRVJTX1NDUklQVAlhIFN1biBzdHlsZSBtYXBmaWxlCi0JVkVSU19OT0RFCWEgbm9kZSB3aXRoaW4gYSBTdW4gc3R5bGUgbWFwZmlsZQotKi8KLSNkZWZpbmUgUlRPS0VOKHgpICB7ICB5eWx2YWwudG9rZW4gPSB4OyByZXR1cm4geDsgfQotCi0vKiBTb21lIHZlcnNpb25zIG9mIGZsZXggd2FudCB0aGlzLiAgKi8KLSNpZm5kZWYgeXl3cmFwCi1pbnQgeXl3cmFwICgpIHsgcmV0dXJuIDE7IH0KLSNlbmRpZgotJX0KLQotJWEgNDAwMAotJW8gNTAwMAotCi1DTURGSUxFTkFNRUNIQVIgICBbX2EtekEtWjAtOVwvXC5cXF9cK1wkXDpcW1xdXFxcLFw9XCZcIVw8XD5cLVx+XQotQ01ERklMRU5BTUVDSEFSMSAgW19hLXpBLVowLTlcL1wuXFxfXCtcJFw6XFtcXVxcXCxcPVwmXCFcPFw+XH5dCi1GSUxFTkFNRUNIQVIxCVtfYS16QS1aXC9cLlxcXCRcX1x+XQotU1lNQk9MQ0hBUk4gICAgIFtfYS16QS1aXC9cLlxcXCRcX1x+MC05XQotRklMRU5BTUVDSEFSCVtfYS16QS1aMC05XC9cLlwtXF9cK1w9XCRcOlxbXF1cXFwsXH5dCi1XSUxEQ0hBUglbX2EtekEtWjAtOVwvXC5cLVxfXCtcPVwkXDpcW1xdXFxcLFx+XD9cKl0KLVdISVRFCQlbIFx0XG5ccl0rIAotCi1OT0NGSUxFTkFNRUNIQVIJW19hLXpBLVowLTlcL1wuXC1cX1wrXCRcOlxbXF1cXFx+XQotCi1WX1RBRyBbLiRfYS16QS1aXVsuX2EtekEtWjAtOV0qCi1WX0lERU5USUZJRVIgWyo/LiRfYS16QS1aXVsqPy4kX2EtekEtWjAtOV0qCi0KLSVzIFNDUklQVAotJXMgRVhQUkVTU0lPTgotJXMgQk9USAotJXMgREVGU1lNRVhQCi0lcyBNUkkKLSVzIFZFUlNfU1RBUlQKLSVzIFZFUlNfU0NSSVBUCi0lcyBWRVJTX05PREUKLSUlCi0KLSAgaWYgKHBhcnNlcl9pbnB1dCAhPSBpbnB1dF9zZWxlY3RlZCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZmlyc3QgdG9rZW4gb2YgdGhlIGlucHV0IGRldGVybWluZXMgdGhlIGluaXRpYWwgcGFyc2VyIHN0YXRlLiAgKi8KLSAgICAgIGlucHV0X3R5cGUgdCA9IHBhcnNlcl9pbnB1dDsKLSAgICAgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NlbGVjdGVkOwotICAgICAgc3dpdGNoICh0KQotCXsKLQljYXNlIGlucHV0X3NjcmlwdDogcmV0dXJuIElOUFVUX1NDUklQVDsgYnJlYWs7Ci0JY2FzZSBpbnB1dF9tcmlfc2NyaXB0OiByZXR1cm4gSU5QVVRfTVJJX1NDUklQVDsgYnJlYWs7Ci0JY2FzZSBpbnB1dF92ZXJzaW9uX3NjcmlwdDogcmV0dXJuIElOUFVUX1ZFUlNJT05fU0NSSVBUOyBicmVhazsKLQljYXNlIGlucHV0X2RlZnN5bTogcmV0dXJuIElOUFVUX0RFRlNZTTsgYnJlYWs7Ci0JZGVmYXVsdDogYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04+Ii8qIgl7IGNvbW1lbnQoKTsgfQotCi0KLTxERUZTWU1FWFA+Ii0iICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oJy0nKTt9Ci08REVGU1lNRVhQPiIrIiAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKCcrJyk7fQotPERFRlNZTUVYUD57RklMRU5BTUVDSEFSMX17U1lNQk9MQ0hBUk59KiAgIHsgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KTsgcmV0dXJuIE5BTUU7IH0KLTxERUZTWU1FWFA+Ij0iICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oJz0nKTsgfQotCi08TVJJLEVYUFJFU1NJT04+IiQiKFswLTlBLUZhLWZdKSsgewotICAJCQkJeXlsdmFsLmludGVnZXIgPSBiZmRfc2Nhbl92bWEgKHl5dGV4dCsxLCAwLDE2KTsKLQkJCQlyZXR1cm4gSU5UOwotCQkJfQotCi08TVJJLEVYUFJFU1NJT04+KFswLTlBLUZhLWZdKSsoSHxofFh8eHxCfGJ8T3xvfER8ZCkgewotCQkJCSAgIGludCBpYmFzZSA7Ci0JCQkJICAgc3dpdGNoICh5eXRleHRbeXlsZW5nLTFdKSB7Ci0JCQkJICAgIGNhc2UgJ1gnOiAKLQkJCQkgICAgY2FzZSAneCc6Ci0JCQkJICAgIGNhc2UgJ0gnOgotCQkJCSAgICBjYXNlICdoJzoKLQkJCQkgICAgIGliYXNlID0gMTY7Ci0JCQkJICAgICBicmVhazsKLQkJCQkgICAgY2FzZSAnTyc6Ci0JCQkJICAgIGNhc2UgJ28nOgotCQkJCSAgICAgaWJhc2UgPSA4OwotCQkJCSAgICAgYnJlYWs7Ci0JCQkJICAgIGNhc2UgJ0InOgotCQkJCSAgICBjYXNlICdiJzoKLQkJCQkgICAgIGliYXNlID0gMjsKLQkJCQkgICAgIGJyZWFrOwotCQkJCSAgICBkZWZhdWx0OgotCQkJCSAgICAgaWJhc2UgPSAxMDsKLQkJCQkgICB9Ci0JCQkJICAgeXlsdmFsLmludGVnZXIgPSBiZmRfc2Nhbl92bWEgKHl5dGV4dCwgMCwKLQkJCQkJCQkJICBpYmFzZSk7Ci0JCQkJICAgcmV0dXJuIElOVDsKLQkJCQkgfQotPFNDUklQVCxERUZTWU1FWFAsTVJJLEJPVEgsRVhQUkVTU0lPTj4oKCgiJCJ8IjB4IikoWzAtOUEtRmEtZl0pKyl8KChbMC05XSkrKSkoTXxLfG18ayk/IHsKLQkJCQkgIGNoYXIgKnMgPSB5eXRleHQ7Ci0KLQkJCQkgIGlmICgqcyA9PSAnJCcpCi0JCQkJICAgICsrczsKLQkJCQkgIHl5bHZhbC5pbnRlZ2VyID0gYmZkX3NjYW5fdm1hIChzLCAwLCAwKTsKLQkJCQkgIGlmICh5eXRleHRbeXlsZW5nLTFdID09ICdNJwotCQkJCSAgICAgIHx8IHl5dGV4dFt5eWxlbmctMV0gPT0gJ20nKQotCQkJCSAgICB5eWx2YWwuaW50ZWdlciAqPSAxMDI0ICogMTAyNDsKLQkJCQkgIGlmICh5eXRleHRbeXlsZW5nLTFdID09ICdLJyAKLQkJCQkgICAgICB8fCB5eXRleHRbeXlsZW5nLTFdPT0naycpCi0JCQkJICAgIHl5bHZhbC5pbnRlZ2VyICo9IDEwMjQ7Ci0JCQkJICByZXR1cm4gSU5UOwotCQkJCX0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iXSIJCXsgUlRPS0VOKCddJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJbIgkJeyBSVE9LRU4oJ1snKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ijw8PSIJeyBSVE9LRU4oTFNISUZURVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPj49Igl7IFJUT0tFTihSU0hJRlRFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ8fCIJeyBSVE9LRU4oT1JPUik7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI9PSIJeyBSVE9LRU4oRVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iIT0iCXsgUlRPS0VOKE5FKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij49Igl7IFJUT0tFTihHRSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8PSIJeyBSVE9LRU4oTEUpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPDwiCXsgUlRPS0VOKExTSElGVCk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+PiIJeyBSVE9LRU4oUlNISUZUKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Iis9Igl7IFJUT0tFTihQTFVTRVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iLT0iCXsgUlRPS0VOKE1JTlVTRVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKj0iCXsgUlRPS0VOKE1VTFRFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIvPSIJeyBSVE9LRU4oRElWRVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJj0iCXsgUlRPS0VOKEFOREVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Inw9Igl7IFJUT0tFTihPUkVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiYmIgl7IFJUT0tFTihBTkRBTkQpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPiIJCXsgUlRPS0VOKCc+Jyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIsIgkJeyBSVE9LRU4oJywnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiYiCQl7IFJUT0tFTignJicpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifCIJCXsgUlRPS0VOKCd8Jyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ+IgkJeyBSVE9LRU4oJ34nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiEiCQl7IFJUT0tFTignIScpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPyIJCXsgUlRPS0VOKCc/Jyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIqIgkJeyBSVE9LRU4oJyonKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IisiCQl7IFJUT0tFTignKycpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iLSIJCXsgUlRPS0VOKCctJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIvIgkJeyBSVE9LRU4oJy8nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiUiCQl7IFJUT0tFTignJScpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPCIJCXsgUlRPS0VOKCc8Jyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI9IiAgICAgICAgICB7IFJUT0tFTignPScpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifSIJCQl7IFJUT0tFTignfScpIDsgfQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ7IgkJCXsgUlRPS0VOKCd7Jyk7IH0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKSIJCQl7IFJUT0tFTignKScpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKCIJCQl7IFJUT0tFTignKCcpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iOiIJCXsgUlRPS0VOKCc6Jyk7IH0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iOyIJCXsgUlRPS0VOKCc7Jyk7fQotPEJPVEgsU0NSSVBUPiJNRU1PUlkiCQl7IFJUT0tFTihNRU1PUlkpO30KLTxCT1RILFNDUklQVD4iT1JJR0lOIgkJeyBSVE9LRU4oT1JJR0lOKTt9Ci08Qk9USCxTQ1JJUFQ+IlZFUlNJT04iCQl7IFJUT0tFTihWRVJTSU9OSyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkJMT0NLIgkJeyBSVE9LRU4oQkxPQ0spO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJCSU5EIgkJeyBSVE9LRU4oQklORCk7fQotPEJPVEgsU0NSSVBUPiJMRU5HVEgiCQl7IFJUT0tFTihMRU5HVEgpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJBTElHTiIJCQl7IFJUT0tFTihBTElHTl9LKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQUREUiIJCQl7IFJUT0tFTihBRERSKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iTE9BREFERFIiCQl7IFJUT0tFTihMT0FEQUREUik7fQotPEVYUFJFU1NJT04sQk9USD4iTUFYIgkJCXsgUlRPS0VOKE1BWF9LKTsgfQotPEVYUFJFU1NJT04sQk9USD4iTUlOIgkJCXsgUlRPS0VOKE1JTl9LKTsgfQotPEVYUFJFU1NJT04sQk9USD4iQVNTRVJUIgkJeyBSVE9LRU4oQVNTRVJUX0spOyB9Ci08Qk9USCxTQ1JJUFQ+IkVOVFJZIgkJCXsgUlRPS0VOKEVOVFJZKTt9Ci08Qk9USCxTQ1JJUFQsTVJJPiJFWFRFUk4iCQl7IFJUT0tFTihFWFRFUk4pO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJORVhUIgkJCXsgUlRPS0VOKE5FWFQpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJzaXplb2ZfaGVhZGVycyIJeyBSVE9LRU4oU0laRU9GX0hFQURFUlMpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJTSVpFT0ZfSEVBREVSUyIJeyBSVE9LRU4oU0laRU9GX0hFQURFUlMpO30KLTxCT1RILFNDUklQVD4iTUFQIgkJCXsgUlRPS0VOKE1BUCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IlNJWkVPRiIJCXsgUlRPS0VOKFNJWkVPRik7fQotPEJPVEgsU0NSSVBUPiJUQVJHRVQiCQl7IFJUT0tFTihUQVJHRVRfSyk7fQotPEJPVEgsU0NSSVBUPiJTRUFSQ0hfRElSIgkJeyBSVE9LRU4oU0VBUkNIX0RJUik7fQotPEJPVEgsU0NSSVBUPiJPVVRQVVQiCQl7IFJUT0tFTihPVVRQVVQpO30KLTxCT1RILFNDUklQVD4iSU5QVVQiCQkJeyBSVE9LRU4oSU5QVVQpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJHUk9VUCIJCXsgUlRPS0VOKEdST1VQKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iREVGSU5FRCIJCXsgUlRPS0VOKERFRklORUQpO30KLTxCT1RILFNDUklQVD4iQ1JFQVRFX09CSkVDVF9TWU1CT0xTIgl7IFJUT0tFTihDUkVBVEVfT0JKRUNUX1NZTUJPTFMpO30KLTxCT1RILFNDUklQVD4iQ09OU1RSVUNUT1JTIgkJeyBSVE9LRU4oIENPTlNUUlVDVE9SUyk7fQotPEJPVEgsU0NSSVBUPiJGT1JDRV9DT01NT05fQUxMT0NBVElPTiIgeyBSVE9LRU4oRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04pO30KLTxCT1RILFNDUklQVD4iU0VDVElPTlMiCQl7IFJUT0tFTihTRUNUSU9OUyk7fQotPEJPVEgsU0NSSVBUPiJGSUxMIgkJCXsgUlRPS0VOKEZJTEwpO30KLTxCT1RILFNDUklQVD4iU1RBUlRVUCIJCXsgUlRPS0VOKFNUQVJUVVApO30KLTxCT1RILFNDUklQVD4iT1VUUFVUX0ZPUk1BVCIJCXsgUlRPS0VOKE9VVFBVVF9GT1JNQVQpO30KLTxCT1RILFNDUklQVD4iT1VUUFVUX0FSQ0giCQl7IFJUT0tFTiggT1VUUFVUX0FSQ0gpO30KLTxCT1RILFNDUklQVD4iSExMIgkJCXsgUlRPS0VOKEhMTCk7fQotPEJPVEgsU0NSSVBUPiJTWVNMSUIiCQl7IFJUT0tFTihTWVNMSUIpO30KLTxCT1RILFNDUklQVD4iRkxPQVQiCQkJeyBSVE9LRU4oRkxPQVQpO30KLTxCT1RILFNDUklQVD4iUVVBRCIJCQl7IFJUT0tFTiggUVVBRCk7fQotPEJPVEgsU0NSSVBUPiJTUVVBRCIJCQl7IFJUT0tFTiggU1FVQUQpO30KLTxCT1RILFNDUklQVD4iTE9ORyIJCQl7IFJUT0tFTiggTE9ORyk7fQotPEJPVEgsU0NSSVBUPiJTSE9SVCIJCQl7IFJUT0tFTiggU0hPUlQpO30KLTxCT1RILFNDUklQVD4iQllURSIJCQl7IFJUT0tFTiggQllURSk7fQotPEJPVEgsU0NSSVBUPiJOT0ZMT0FUIgkJeyBSVE9LRU4oTk9GTE9BVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik5PQ1JPU1NSRUZTIgl7IFJUT0tFTihOT0NST1NTUkVGUyk7fQotPEJPVEgsU0NSSVBUPiJPVkVSTEFZIgkJCXsgUlRPS0VOKE9WRVJMQVkpOyB9Ci08Qk9USCxTQ1JJUFQ+IlNPUlQiCQkJeyBSVE9LRU4oU09SVCk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJOT0xPQUQiCXsgUlRPS0VOKE5PTE9BRCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkRTRUNUIgkJeyBSVE9LRU4oRFNFQ1QpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJDT1BZIgkJeyBSVE9LRU4oQ09QWSk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IklORk8iCQl7IFJUT0tFTihJTkZPKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iT1ZFUkxBWSIJeyBSVE9LRU4oT1ZFUkxBWSk7fQotPEJPVEgsU0NSSVBUPiJvIgkJCXsgUlRPS0VOKE9SSUdJTik7fQotPEJPVEgsU0NSSVBUPiJvcmciCQkJeyBSVE9LRU4oT1JJR0lOKTt9Ci08Qk9USCxTQ1JJUFQ+ImwiCQkJeyBSVE9LRU4oIExFTkdUSCk7fQotPEJPVEgsU0NSSVBUPiJsZW4iCQkJeyBSVE9LRU4oIExFTkdUSCk7fQotPEJPVEgsU0NSSVBUPiJJTkNMVURFIgkJCXsgUlRPS0VOKElOQ0xVREUpO30KLTxCT1RILFNDUklQVD4iUEhEUlMiCQkJeyBSVE9LRU4gKFBIRFJTKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkFUIgkJCXsgUlRPS0VOKEFUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iUFJPVklERSIJCXsgUlRPS0VOKFBST1ZJREUpOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iS0VFUCIJCXsgUlRPS0VOKEtFRVApOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iRVhDTFVERV9GSUxFIiAgICAgICAgeyBSVE9LRU4oRVhDTFVERV9GSUxFKTsgfQotPE1SST4iIyIuKlxuPwkJCXsgKysgbGluZW5vOyB9Ci08TVJJPiJcbiIJICAgICAgICAgICAgICAgIHsgKysgbGluZW5vOyAgUlRPS0VOKE5FV0xJTkUpOyB9Ci08TVJJPiIqIi4qCQkJeyAvKiBNcmkgY29tbWVudCBsaW5lICovIH0KLTxNUkk+IjsiLioJCQl7IC8qIE1yaSBjb21tZW50IGxpbmUgKi8gfQotPE1SST4iRU5EIiAgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihFTkRXT1JEKTsgfQotPE1SST4iQUxJR05NT0QiCQl7IFJUT0tFTihBTElHTk1PRCk7fQotPE1SST4iQUxJR04iCQl7IFJUT0tFTihBTElHTl9LKTt9Ci08TVJJPiJDSElQIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKENISVApOyB9Ci08TVJJPiJCQVNFIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEJBU0UpOyB9Ci08TVJJPiJBTElBUyIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihBTElBUyk7IH0KLTxNUkk+IlRSVU5DQVRFIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFRSVU5DQVRFKTsgfQotPE1SST4iTE9BRCIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihMT0FEKTsgfQotPE1SST4iUFVCTElDIiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihQVUJMSUMpOyB9Ci08TVJJPiJPUkRFUiIgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKE9SREVSKTsgfQotPE1SST4iTkFNRSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihOQU1FV09SRCk7IH0KLTxNUkk+IkZPUk1BVCIgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oRk9STUFUKTsgfQotPE1SST4iQ0FTRSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihDQVNFKTsgfQotPE1SST4iU1RBUlQiICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihTVEFSVCk7IH0KLTxNUkk+IkxJU1QiLiogICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTElTVCk7IC8qIExJU1QgYW5kIGlnbm9yZSB0byBlbmQgb2YgbGluZSAqLyB9Ci08TVJJPiJTRUNUIgkJCXsgUlRPS0VOKFNFQ1QpOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVCxNUkk+IkFCU09MVVRFIgkJCXsgUlRPS0VOKEFCU09MVVRFKTsgfQotPE1SST4iZW5kIiAgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihFTkRXT1JEKTsgfQotPE1SST4iYWxpZ25tb2QiCQl7IFJUT0tFTihBTElHTk1PRCk7fQotPE1SST4iYWxpZ24iCQl7IFJUT0tFTihBTElHTl9LKTt9Ci08TVJJPiJjaGlwIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKENISVApOyB9Ci08TVJJPiJiYXNlIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEJBU0UpOyB9Ci08TVJJPiJhbGlhcyIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihBTElBUyk7IH0KLTxNUkk+InRydW5jYXRlIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFRSVU5DQVRFKTsgfQotPE1SST4ibG9hZCIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihMT0FEKTsgfQotPE1SST4icHVibGljIiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihQVUJMSUMpOyB9Ci08TVJJPiJvcmRlciIgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKE9SREVSKTsgfQotPE1SST4ibmFtZSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihOQU1FV09SRCk7IH0KLTxNUkk+ImZvcm1hdCIgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oRk9STUFUKTsgfQotPE1SST4iY2FzZSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihDQVNFKTsgfQotPE1SST4iZXh0ZXJuIiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihFWFRFUk4pOyB9Ci08TVJJPiJzdGFydCIgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFNUQVJUKTsgfQotPE1SST4ibGlzdCIuKiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihMSVNUKTsgLyogTElTVCBhbmQgaWdub3JlIHRvIGVuZCBvZiBsaW5lICovIH0KLTxNUkk+InNlY3QiCQkJeyBSVE9LRU4oU0VDVCk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBULE1SST4iYWJzb2x1dGUiCQkJeyBSVE9LRU4oQUJTT0xVVEUpOyB9Ci0KLTxNUkk+e0ZJTEVOQU1FQ0hBUjF9e05PQ0ZJTEVOQU1FQ0hBUn0qCXsKLS8qIEZpbGVuYW1lIHdpdGhvdXQgY29tbWFzLCBuZWVkZWQgdG8gcGFyc2UgbXJpIHN0dWZmICovCi0JCQkJIHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nKHl5dGV4dCk7IAotCQkJCSAgcmV0dXJuIE5BTUU7Ci0JCQkJfQotCi0KLTxCT1RILEVYUFJFU1NJT04+e0ZJTEVOQU1FQ0hBUjF9e0ZJTEVOQU1FQ0hBUn0qCXsKLQkJCQkgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KTsgCi0JCQkJICByZXR1cm4gTkFNRTsKLQkJCQl9Ci08Qk9USCxFWFBSRVNTSU9OPiItbCJ7RklMRU5BTUVDSEFSfSsgewotCQkJCSAgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcgKHl5dGV4dCArIDIpOwotCQkJCSAgcmV0dXJuIExOQU1FOwotCQkJCX0KLTxTQ1JJUFQ+e1dJTERDSEFSfSogewotCQkvKiBBbm5veWluZ2x5LCB0aGlzIHBhdHRlcm4gY2FuIG1hdGNoIGNvbW1lbnRzLCBhbmQgd2UgaGF2ZQotCQkgICBsb25nZXN0IG1hdGNoIGlzc3VlcyB0byBjb25zaWRlci4gIFNvIGlmIHRoZSBmaXJzdCB0d28KLQkJICAgY2hhcmFjdGVycyBhcmUgYSBjb21tZW50IG9wZW5pbmcsIHB1dCB0aGUgaW5wdXQgYmFjayBhbmQKLQkJICAgdHJ5IGFnYWluLiAgKi8KLQkJaWYgKHl5dGV4dFswXSA9PSAnLycgJiYgeXl0ZXh0WzFdID09ICcqJykKLQkJICB7Ci0JCSAgICB5eWxlc3MoMik7Ci0JCSAgICBjb21tZW50ICgpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nKHl5dGV4dCk7Ci0JCSAgICByZXR1cm4gTkFNRTsKLQkJICB9Ci0JfQotCi08RVhQUkVTU0lPTixCT1RILFNDUklQVCxWRVJTX05PREU+IlwiIlteXCJdKiJcIiIgewotCQkJCQkvKiBObyBtYXR0ZXIgdGhlIHN0YXRlLCBxdW90ZXMKLQkJCQkJICAgZ2l2ZSB3aGF0J3MgaW5zaWRlICovCi0JCQkJCXl5bHZhbC5uYW1lID0gYnV5c3RyaW5nKHl5dGV4dCsxKTsKLQkJCQkJeXlsdmFsLm5hbWVbeXlsZW5nLTJdID0gMDsKLQkJCQkJcmV0dXJuIE5BTUU7Ci0JCQkJfQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04+IlxuIgkJeyBsaW5lbm8rKzt9Ci08TVJJLEJPVEgsU0NSSVBULEVYUFJFU1NJT04+WyBcdFxyXSsJeyB9Ci0KLTxWRVJTX05PREUsVkVSU19TQ1JJUFQ+WzosO10JeyByZXR1cm4gKnl5dGV4dDsgfQotCi08VkVSU19OT0RFPmdsb2JhbAkJeyBSVE9LRU4oR0xPQkFMKTsgfQotCi08VkVSU19OT0RFPmxvY2FsCQl7IFJUT0tFTihMT0NBTCk7IH0KLQotPFZFUlNfTk9ERT5leHRlcm4JCXsgUlRPS0VOKEVYVEVSTik7IH0KLQotPFZFUlNfTk9ERT57Vl9JREVOVElGSUVSfQl7IHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nICh5eXRleHQpOwotCQkJCSAgcmV0dXJuIFZFUlNfSURFTlRJRklFUjsgfQotCi08VkVSU19TQ1JJUFQ+e1ZfVEFHfQkJeyB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyAoeXl0ZXh0KTsKLQkJCQkgIHJldHVybiBWRVJTX1RBRzsgfQotCi08VkVSU19TVEFSVD4ieyIJCQl7IEJFR0lOKFZFUlNfU0NSSVBUKTsgcmV0dXJuICp5eXRleHQ7IH0KLQotPFZFUlNfU0NSSVBUPiJ7IgkJeyBCRUdJTihWRVJTX05PREUpOyAKLQkJCQkgIHZlcnNfbm9kZV9uZXN0aW5nID0gMDsKLQkJCQkgIHJldHVybiAqeXl0ZXh0OwotCQkJCX0KLTxWRVJTX1NDUklQVD4ifSIJCXsgcmV0dXJuICp5eXRleHQ7IH0KLTxWRVJTX05PREU+InsiCQkJeyB2ZXJzX25vZGVfbmVzdGluZysrOyByZXR1cm4gKnl5dGV4dDsgfQotPFZFUlNfTk9ERT4ifSIJCQl7IGlmICgtLXZlcnNfbm9kZV9uZXN0aW5nIDwgMCkKLQkJCQkgICAgQkVHSU4oVkVSU19TQ1JJUFQpOwotCQkJCSAgcmV0dXJuICp5eXRleHQ7Ci0JCQkJfQotCi08VkVSU19TVEFSVCxWRVJTX05PREUsVkVSU19TQ1JJUFQ+W1xuXQkJeyBsaW5lbm8rKzsgfQotCi08VkVSU19TVEFSVCxWRVJTX05PREUsVkVSU19TQ1JJUFQ+Iy4qCQl7IC8qIEVhdCB1cCBjb21tZW50cyAqLyB9Ci0KLTxWRVJTX1NUQVJULFZFUlNfTk9ERSxWRVJTX1NDUklQVD5bIFx0XHJdKyAgIAl7IC8qIEVhdCB1cCB3aGl0ZXNwYWNlICovIH0KLQotPDxFT0Y+PiB7Ci0gIGluY2x1ZGVfc3RhY2tfcHRyLS07Ci0gICAgCi0gIGlmIChpbmNsdWRlX3N0YWNrX3B0ciA9PSAwKSAKLSAgewotICAgIHl5dGVybWluYXRlKCk7Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIHl5X3N3aXRjaF90b19idWZmZXIoaW5jbHVkZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0pOwotCi0gIH0KLSAgQkVHSU4oU0NSSVBUKTsKLSAgbGRmaWxlX2lucHV0X2ZpbGVuYW1lID0gZmlsZV9uYW1lX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyIC0gMV07Ci0gIGxpbmVubyA9IGxpbmVub19zdGFja1tpbmNsdWRlX3N0YWNrX3B0ciAtIDFdOwotCi0gIHJldHVybiBFTkQ7Ci19Ci0KLTxTQ1JJUFQsTVJJLFZFUlNfU1RBUlQsVkVSU19TQ1JJUFQsVkVSU19OT0RFPi4JbGV4X3dhcm5faW52YWxpZCgiIGluIHNjcmlwdCIsIHl5dGV4dCk7Ci08RVhQUkVTU0lPTixERUZTWU1FWFAsQk9USD4uCWxleF93YXJuX2ludmFsaWQoIiBpbiBleHByZXNzaW9uIiwgeXl0ZXh0KTsKLSAgICAKLSUlCi0MCi0KLS8qIFN3aXRjaCBmbGV4IHRvIHJlYWRpbmcgc2NyaXB0IGZpbGUgTkFNRSwgb3BlbiBvbiBGSUxFLAotICAgc2F2aW5nIHRoZSBjdXJyZW50IGlucHV0IGluZm8gb24gdGhlIGluY2x1ZGUgc3RhY2suICAqLwotCi12b2lkCi1sZXhfcHVzaF9maWxlIChmaWxlLCBuYW1lKQotICAgICBGSUxFICpmaWxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoaW5jbHVkZV9zdGFja19wdHIgPj0gTUFYX0lOQ0xVREVfREVQVEgpIAotICAgIHsKLSAgICAgIGVpbmZvKCIlRjppbmNsdWRlcyBuZXN0ZWQgdG9vIGRlZXBseVxuIik7Ci0gICAgfQotICBmaWxlX25hbWVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gbmFtZTsKLSAgbGluZW5vX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IDE7Ci0gIGluY2x1ZGVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gWVlfQ1VSUkVOVF9CVUZGRVI7Ci0KLSAgaW5jbHVkZV9zdGFja19wdHIrKzsKLSAgeXlpbiA9IGZpbGU7Ci0gIHl5X3N3aXRjaF90b19idWZmZXIoeXlfY3JlYXRlX2J1ZmZlcih5eWluLCBZWV9CVUZfU0laRSkpOwotICBCRUdJTiAoU0NSSVBUKTsKLX0KLQotLyogUmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBmbGV4IGlucHV0IGJ1ZmZlciBjb250YWluaW5nIFNUUklORywKLSAgIHdoaWNoIGlzIFNJWkUgYnl0ZXMgbG9uZy4gICovCi0KLXN0YXRpYyBZWV9CVUZGRVJfU1RBVEUgCi15eV9jcmVhdGVfc3RyaW5nX2J1ZmZlciAoc3RyaW5nLCBzaXplKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBZWV9CVUZGRVJfU1RBVEUgYjsKLQotICAvKiBDYWxscyB0byBtLWFsbG9jIGdldCB0dXJuZWQgYnkgc2VkIGludG8geG0tYWxsb2MuICAqLwotICBiID0gKFlZX0JVRkZFUl9TVEFURSkgbWFsbG9jIChzaXplb2YgKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUpKTsKLSAgYi0+eXlfaW5wdXRfZmlsZSA9IDA7Ci0gIGItPnl5X2J1Zl9zaXplID0gc2l6ZTsKLQotICAvKiB5eV9jaF9idWYgaGFzIHRvIGJlIDIgY2hhcmFjdGVycyBsb25nZXIgdGhhbiB0aGUgc2l6ZSBnaXZlbiBiZWNhdXNlCi0gICAgIHdlIG5lZWQgdG8gcHV0IGluIDIgZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLiAgKi8KLSAgYi0+eXlfY2hfYnVmID0gKGNoYXIgKikgbWFsbG9jICgodW5zaWduZWQpIChiLT55eV9idWZfc2l6ZSArIDMpKTsKLQotICBiLT55eV9jaF9idWZbMF0gPSAnXG4nOwotICBzdHJjcHkgKGItPnl5X2NoX2J1ZisxLCBzdHJpbmcpOwotICBiLT55eV9jaF9idWZbc2l6ZSsxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKLSAgYi0+eXlfY2hfYnVmW3NpemUrMl0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7Ci0gIGItPnl5X25fY2hhcnMgPSBzaXplKzE7Ci0gIGItPnl5X2J1Zl9wb3MgPSAmYi0+eXlfY2hfYnVmWzFdOwotCi0gIC8qIGZsZXggMi40LjcgY2hhbmdlZCB0aGUgaW50ZXJmYWNlLiAgRklYTUU6IFdlIHNob3VsZCBub3QgYmUgdXNpbmcKLSAgICAgYSBmbGV4IGludGVybmFsIGludGVyZmFjZSBpbiB0aGUgZmlyc3QgcGxhY2UhICAqLwotI2lmZGVmIFlZX0JVRkZFUl9ORVcKLSAgYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7Ci0jZWxzZQotICBiLT55eV9lb2Zfc3RhdHVzID0gRU9GX05PVF9TRUVOOwotI2VuZGlmCi0KLSAgcmV0dXJuIGI7Ci19Ci0KLS8qIFN3aXRjaCBmbGV4IHRvIHJlYWRpbmcgZnJvbSBTVFJJTkcsIHNhdmluZyB0aGUgY3VycmVudCBpbnB1dCBpbmZvCi0gICBvbiB0aGUgaW5jbHVkZSBzdGFjay4gICovCi0KLXZvaWQKLWxleF9yZWRpcmVjdCAoc3RyaW5nKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci17Ci0gIFlZX0JVRkZFUl9TVEFURSB0bXA7Ci0KLSAgeXlfaW5pdCA9IDA7Ci0gIGlmIChpbmNsdWRlX3N0YWNrX3B0ciA+PSBNQVhfSU5DTFVERV9ERVBUSCkgCi0gICAgewotICAgICAgZWluZm8oIiVGOiBtYWNyb3MgbmVzdGVkIHRvbyBkZWVwbHlcbiIpOwotICAgIH0KLSAgZmlsZV9uYW1lX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9ICJyZWRpcmVjdCI7Ci0gIGxpbmVub19zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSAwOwotICBpbmNsdWRlX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IFlZX0NVUlJFTlRfQlVGRkVSOwotICBpbmNsdWRlX3N0YWNrX3B0cisrOwotICB0bXAgPSB5eV9jcmVhdGVfc3RyaW5nX2J1ZmZlciAoc3RyaW5nLCBzdHJsZW4gKHN0cmluZykpOwotICB5eV9zd2l0Y2hfdG9fYnVmZmVyICh0bXApOwotICBCRUdJTiAoU0NSSVBUKTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgZmxleCBzdGFydCBjb25kaXRpb24sCi0gICBzYXZpbmcgdGhlIGN1cnJlbnQgc3RhcnQgY29uZGl0aW9uIG9uIGBzdGF0ZV9zdGFjaycuICAqLwotCi1zdGF0aWMgaW50IHN0YXRlX3N0YWNrW01BWF9JTkNMVURFX0RFUFRIICogMl07Ci1zdGF0aWMgaW50ICpzdGF0ZV9zdGFja19wID0gc3RhdGVfc3RhY2s7Ci0KLXZvaWQKLWxkbGV4X3NjcmlwdCAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKFNDUklQVCk7Ci19Ci0KLXZvaWQKLWxkbGV4X21yaV9zY3JpcHQgKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChNUkkpOwotfQotCi12b2lkCi1sZGxleF92ZXJzaW9uX3NjcmlwdCAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKFZFUlNfU1RBUlQpOwotfQotCi12b2lkCi1sZGxleF92ZXJzaW9uX2ZpbGUgKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChWRVJTX1NDUklQVCk7Ci19Ci0KLXZvaWQKLWxkbGV4X2RlZnN5bSAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKERFRlNZTUVYUCk7Ci19Ci0JICAgCi12b2lkCi1sZGxleF9leHByZXNzaW9uICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoRVhQUkVTU0lPTik7Ci19Ci0KLXZvaWQKLWxkbGV4X2JvdGggKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChCT1RIKTsKLX0KLQotdm9pZAotbGRsZXhfcG9wc3RhdGUgKCkKLXsKLSAgeXlfc3RhcnQgPSAqKC0tc3RhdGVfc3RhY2tfcCk7Ci19Ci0MCi0KLS8qIFBsYWNlIHVwIHRvIE1BWF9TSVpFIGNoYXJhY3RlcnMgaW4gQlVGIGFuZCByZXR1cm4gaW4gKlJFU1VMVAotICAgZWl0aGVyIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAwIHRvIGluZGljYXRlIEVPRi4gICovCi0KLXN0YXRpYyB2b2lkCi15eV9pbnB1dCAoYnVmLCByZXN1bHQsIG1heF9zaXplKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCAqcmVzdWx0OwotICAgICBpbnQgbWF4X3NpemU7Ci17Ci0gICpyZXN1bHQgPSAwOyAKLSAgaWYgKHl5X2N1cnJlbnRfYnVmZmVyLT55eV9pbnB1dF9maWxlKQotICAgIHsKLSAgICAgIGlmICh5eWluKQotCXsKLQkgICpyZXN1bHQgPSByZWFkIChmaWxlbm8gKHl5aW4pLCAoY2hhciAqKSBidWYsIG1heF9zaXplKTsKLQkgIGlmICgqcmVzdWx0IDwgMCkgCi0JICAgIGVpbmZvICgiJUYlUDogcmVhZCBpbiBmbGV4IHNjYW5uZXIgZmFpbGVkXG4iKTsKLQl9Ci0gICAgfQotfQotCi0vKiBFYXQgdGhlIHJlc3Qgb2YgYSBDLXN0eWxlIGNvbW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotY29tbWVudCAoKQotewotICBpbnQgYzsKLQotICB3aGlsZSAoMSkKLSAgewotICAgIGMgPSBpbnB1dCgpOwotICAgIHdoaWxlIChjICE9ICcqJyAmJiBjICE9IEVPRikgCi0gICAgewotICAgICAgaWYgKGMgPT0gJ1xuJykKLQlsaW5lbm8rKzsKLSAgICAgIGMgPSBpbnB1dCgpOwotICAgIH0KLQotICAgIGlmIChjID09ICcqJykKLSAgICB7Ci0gICAgICBjID0gaW5wdXQoKTsKLSAgICAgIHdoaWxlIChjID09ICcqJykKLSAgICAgICBjID0gaW5wdXQoKTsKLSAgICAgIGlmIChjID09ICcvJykKLSAgICAgICBicmVhazsJCQkvKiBmb3VuZCB0aGUgZW5kICovCi0gICAgfQotCi0gICAgaWYgKGMgPT0gJ1xuJykKLSAgICAgIGxpbmVubysrOwotCi0gICAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGVpbmZvKCAiJUYlUDogRU9GIGluIGNvbW1lbnRcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8qIFdhcm4gdGhlIHVzZXIgYWJvdXQgYSBnYXJiYWdlIGNoYXJhY3RlciBXSEFUIGluIHRoZSBpbnB1dAotICAgaW4gY29udGV4dCBXSEVSRS4gICovCi0KLXN0YXRpYyB2b2lkCi1sZXhfd2Fybl9pbnZhbGlkICh3aGVyZSwgd2hhdCkKLSAgICAgY2hhciAqd2hlcmUsICp3aGF0OwotewotICBjaGFyIGJ1Zls1XTsKLQotICAvKiBJZiB3ZSBoYXZlIGZvdW5kIGFuIGlucHV0IGZpbGUgd2hvc2UgZm9ybWF0IHdlIGRvIG5vdCByZWNvZ25pemUsCi0gICAgIGFuZCB3ZSBhcmUgdGhlcmVmb3JlIHRyZWF0aW5nIGl0IGFzIGEgbGlua2VyIHNjcmlwdCwgYW5kIHdlIGZpbmQKLSAgICAgYW4gaW52YWxpZCBjaGFyYWN0ZXIsIHRoZW4gbW9zdCBsaWtlbHkgdGhpcyBpcyBhIHJlYWwgb2JqZWN0IGZpbGUKLSAgICAgb2Ygc29tZSBkaWZmZXJlbnQgZm9ybWF0LiAgVHJlYXQgaXQgYXMgc3VjaC4gICovCi0gIGlmIChsZGZpbGVfYXNzdW1lZF9zY3JpcHQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQpOwotICAgICAgZWluZm8gKCIlRiVzOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIiwgbGRmaWxlX2lucHV0X2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKCEgaXNwcmludCAoKHVuc2lnbmVkIGNoYXIpICp3aGF0KSkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChidWYsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSAqd2hhdCk7Ci0gICAgICB3aGF0ID0gYnVmOwotICAgIH0KLQotICBlaW5mbyAoIiVQOiVTOiBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlciBgJXMnJXNcbiIsIHdoYXQsIHdoZXJlKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkbWFpbi5jIGIvbGQvbGRtYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGJjMzIuLjAwMDAwMDAKLS0tIGEvbGQvbGRtYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA0ICswLDAgQEAKLS8qIE1haW4gcHJvZ3JhbSBvZiBHTlUgbGlua2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJwcm9ncmVzcy5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGR3cml0ZS5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLQotLyogU29tZXdoZXJlIGFib3ZlLCBzeXMvc3RhdC5oIGdvdCBpbmNsdWRlZCAuIC4gLiAuICovCi0jaWYgIWRlZmluZWQoU19JU0RJUikgJiYgZGVmaW5lZChTX0lGRElSKQotI2RlZmluZQlTX0lTRElSKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGRElSKQotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIEhBVkVfU0JSSwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotZXh0ZXJuIFBUUiBzYnJrICgpOwotI2VuZGlmCi0jZW5kaWYKLQotc3RhdGljIGNoYXIgKmdldF9lbXVsYXRpb24gUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBzZXRfc2NyaXB0c19kaXIgUEFSQU1TICgodm9pZCkpOwotCi0vKiBFWFBPUlRTICovCi0KLWNoYXIgKmRlZmF1bHRfdGFyZ2V0OwotY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lID0gImEub3V0IjsKLQotLyogTmFtZSB0aGlzIHByb2dyYW0gd2FzIGludm9rZWQgYnkuICAqLwotY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBUaGUgZmlsZSB0aGF0IHdlJ3JlIGNyZWF0aW5nICovCi1iZmQgKm91dHB1dF9iZmQgPSAwOwotCi0vKiBTZXQgYnkgLUcgYXJndW1lbnQsIGZvciBNSVBTIEVDT0ZGIHRhcmdldC4gICovCi1pbnQgZ19zd2l0Y2hfdmFsdWUgPSA4OwotCi0vKiBOb256ZXJvIG1lYW5zIHByaW50IG5hbWVzIG9mIGlucHV0IGZpbGVzIGFzIHByb2Nlc3NlZC4gICovCi1ib29sZWFuIHRyYWNlX2ZpbGVzOwotCi0vKiBOb256ZXJvIG1lYW5zIHNhbWUsIGJ1dCBub3RlIG9wZW4gZmFpbHVyZXMsIHRvby4gICovCi1ib29sZWFuIHRyYWNlX2ZpbGVfdHJpZXM7Ci0KLS8qIE5vbnplcm8gbWVhbnMgdmVyc2lvbiBudW1iZXIgd2FzIHByaW50ZWQsIHNvIGV4aXQgc3VjY2Vzc2Z1bGx5Ci0gICBpbnN0ZWFkIG9mIGNvbXBsYWluaW5nIGlmIG5vIGlucHV0IGZpbGVzIGFyZSBnaXZlbi4gICovCi1ib29sZWFuIHZlcnNpb25fcHJpbnRlZDsKLQotLyogTm9uemVybyBtZWFucyBsaW5rIGluIGV2ZXJ5IG1lbWJlciBvZiBhbiBhcmNoaXZlLiAgKi8KLWJvb2xlYW4gd2hvbGVfYXJjaGl2ZTsKLQotLyogVHJ1ZSBpZiB3ZSBzaG91bGQgZGVtYW5nbGUgc3ltYm9sIG5hbWVzLiAgKi8KLWJvb2xlYW4gZGVtYW5nbGluZzsKLQotYXJnc190eXBlIGNvbW1hbmRfbGluZTsKLQotbGRfY29uZmlnX3R5cGUgY29uZmlnOwotCi1zdGF0aWMgdm9pZCByZW1vdmVfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGNoZWNrX2Zvcl9zY3JpcHRzX2RpciBQQVJBTVMgKChjaGFyICpkaXIpKTsKLXN0YXRpYyBib29sZWFuIGFkZF9hcmNoaXZlX2VsZW1lbnQgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJCSAgICBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIG11bHRpcGxlX2RlZmluaXRpb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLAotCQkJCQkgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIG11bHRpcGxlX2NvbW1vbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQljb25zdCBjaGFyICosIGJmZCAqLAotCQkJCQllbnVtIGJmZF9saW5rX2hhc2hfdHlwZSwgYmZkX3ZtYSwKLQkJCQkJYmZkICosIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlLAotCQkJCQliZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBhZGRfdG9fc2V0IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsCi0JCQkJICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGNvbnN0cnVjdG9yX2NhbGxiYWNrIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgYm9vbGVhbiBjb25zdHJ1Y3RvciwKLQkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiB3YXJuaW5nX2NhbGxiYWNrIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYmZkICosCi0JCQkJCSBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdm9pZCB3YXJuaW5nX2ZpbmRfcmVsb2MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gdW5kZWZpbmVkX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgY29uc3QgY2hhciAqLCBiZmQgKiwKLQkJCQkJIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHJlbG9jX292ZXJmbG93IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqLCBiZmRfdm1hLAotCQkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcmVsb2NfZGFuZ2Vyb3VzIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHVuYXR0YWNoZWRfcmVsb2MgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBub3RpY2UgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCQkJICAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzIGxpbmtfY2FsbGJhY2tzID0KLXsKLSAgYWRkX2FyY2hpdmVfZWxlbWVudCwKLSAgbXVsdGlwbGVfZGVmaW5pdGlvbiwKLSAgbXVsdGlwbGVfY29tbW9uLAotICBhZGRfdG9fc2V0LAotICBjb25zdHJ1Y3Rvcl9jYWxsYmFjaywKLSAgd2FybmluZ19jYWxsYmFjaywKLSAgdW5kZWZpbmVkX3N5bWJvbCwKLSAgcmVsb2Nfb3ZlcmZsb3csCi0gIHJlbG9jX2Rhbmdlcm91cywKLSAgdW5hdHRhY2hlZF9yZWxvYywKLSAgbm90aWNlCi19OwotCi1zdHJ1Y3QgYmZkX2xpbmtfaW5mbyBsaW5rX2luZm87Ci0MCi1zdGF0aWMgdm9pZAotcmVtb3ZlX291dHB1dCAoKQotewotICBpZiAob3V0cHV0X2ZpbGVuYW1lKSAKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2JmZCAmJiBvdXRwdXRfYmZkLT5pb3N0cmVhbSkKLQlmY2xvc2UoKEZJTEUgKikob3V0cHV0X2JmZC0+aW9zdHJlYW0pKTsKLSAgICAgIGlmIChkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZSkKLQl1bmxpbmsgKG91dHB1dF9maWxlbmFtZSk7Ci0gICAgfQotfQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqZW11bGF0aW9uOwotICBsb25nIHN0YXJ0X3RpbWUgPSBnZXRfcnVuX3RpbWUgKCk7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSwgMCk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0KLSAgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgeGF0ZXhpdCAocmVtb3ZlX291dHB1dCk7Ci0KLSAgLyogU2V0IHRoZSBkZWZhdWx0IEJGRCB0YXJnZXQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0LiAgRG9pbmcKLSAgICAgdGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8gYmUgY29uZmlndXJlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCwKLSAgICAgYW5kIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIEJGRCBsaWJyYXJ5IHdoaWNoIHdhcyBjb25maWd1cmVkIGZvcgotICAgICBhIGRpZmZlcmVudCB0YXJnZXQuICBUaGUgbWFjcm8gVEFSR0VUIGlzIGRlZmluZWQgYnkgTWFrZWZpbGUuICAqLwotICBpZiAoISBiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0IChUQVJHRVQpKQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlWCVQOiBjYW4ndCBzZXQgQkZEIGRlZmF1bHQgdGFyZ2V0IHRvIGAlcyc6ICVFXG4iKSwgVEFSR0VUKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBhYm91dCBvcHRpb25zLiAgKi8KLSAgdHJhY2VfZmlsZXMgPSB0cmFjZV9maWxlX3RyaWVzID0gdmVyc2lvbl9wcmludGVkID0gZmFsc2U7Ci0gIHdob2xlX2FyY2hpdmUgPSBmYWxzZTsKLSAgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9IHRydWU7Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLSAgY29uZmlnLmhhc19zaGFyZWQgPSBmYWxzZTsKLSAgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uID0gZmFsc2U7Ci0gIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlciA9IE5VTEw7Ci0gIGNvbW1hbmRfbGluZS5ycGF0aCA9IE5VTEw7Ci0gIGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoID0gdHJ1ZTsKLSAgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzID0gdHJ1ZTsKLQotICAvKiBXZSBpbml0aWFsaXplIERFTUFOR0xJTkcgYmFzZWQgb24gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICAgIENPTExFQ1RfTk9fREVNQU5HTEUuICBUaGUgZ2NjIGNvbGxlY3QyIHByb2dyYW0gd2lsbCBkZW1hbmdsZSB0aGUKLSAgICAgb3V0cHV0IG9mIHRoZSBsaW5rZXIsIHVubGVzcyBDT0xMRUNUX05PX0RFTUFOR0xFIGlzIHNldCBpbiB0aGUKLSAgICAgZW52aXJvbm1lbnQuICBBY3RpbmcgdGhlIHNhbWUgd2F5IGhlcmUgbGV0cyB1cyBwcm92aWRlIHRoZSBzYW1lCi0gICAgIGludGVyZmFjZSBieSBkZWZhdWx0LiAgKi8KLSAgZGVtYW5nbGluZyA9IGdldGVudiAoIkNPTExFQ1RfTk9fREVNQU5HTEUiKSA9PSBOVUxMOwotCi0gIGxpbmtfaW5mby5jYWxsYmFja3MgPSAmbGlua19jYWxsYmFja3M7Ci0gIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgbGlua19pbmZvLnNoYXJlZCA9IGZhbHNlOwotICBsaW5rX2luZm8uc3ltYm9saWMgPSBmYWxzZTsKLSAgbGlua19pbmZvLnN0YXRpY19saW5rID0gZmFsc2U7Ci0gIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSBmYWxzZTsKLSAgbGlua19pbmZvLm9wdGltaXplID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5ub191bmRlZmluZWQgPSBmYWxzZTsKLSAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfbm9uZTsKLSAgbGlua19pbmZvLmRpc2NhcmQgPSBkaXNjYXJkX25vbmU7Ci0gIGxpbmtfaW5mby5rZWVwX21lbW9yeSA9IHRydWU7Ci0gIGxpbmtfaW5mby5pbnB1dF9iZmRzID0gTlVMTDsKLSAgbGlua19pbmZvLmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uID0gTlVMTDsKLSAgbGlua19pbmZvLmhhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ua2VlcF9oYXNoID0gTlVMTDsKLSAgbGlua19pbmZvLm5vdGljZV9hbGwgPSBmYWxzZTsKLSAgbGlua19pbmZvLm5vdGljZV9oYXNoID0gTlVMTDsKLSAgbGlua19pbmZvLndyYXBfaGFzaCA9IE5VTEw7Ci0gIGxpbmtfaW5mby5tcGM4NjBjMCA9IDA7Ci0gIC8qIFNWUjQgbGlua2VycyBzZWVtIHRvIHNldCBEVF9JTklUIGFuZCBEVF9GSU5JIGJhc2VkIG9uIG1hZ2ljIF9pbml0Ci0gICAgIGFuZCBfZmluaSBzeW1ib2xzLiAgV2UgYXJlIGNvbXBhdGlibGUuICAqLwotICBsaW5rX2luZm8uaW5pdF9mdW5jdGlvbiA9ICJfaW5pdCI7Ci0gIGxpbmtfaW5mby5maW5pX2Z1bmN0aW9uID0gIl9maW5pIjsKLQotICBsZGZpbGVfYWRkX2FyY2ggKCIiKTsKLQotICBjb25maWcubWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLSAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0gIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSB0cnVlOwotICBjb25maWcudGV4dF9yZWFkX29ubHkgPSB0cnVlOwotICBjb25maWcubWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLQotICBlbXVsYXRpb24gPSBnZXRfZW11bGF0aW9uIChhcmdjLCBhcmd2KTsKLSAgbGRlbXVsX2Nob29zZV9tb2RlIChlbXVsYXRpb24pOwotICBkZWZhdWx0X3RhcmdldCA9IGxkZW11bF9jaG9vc2VfdGFyZ2V0ICgpOwotICBsYW5nX2luaXQgKCk7Ci0gIGxkZW11bF9iZWZvcmVfcGFyc2UgKCk7Ci0gIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSBmYWxzZTsKLSAgcGFyc2VfYXJncyAoYXJnYywgYXJndik7Ci0KLSAgbGRlbXVsX3NldF9zeW1ib2xzICgpOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGlmIChjb21tYW5kX2xpbmUuZ2Nfc2VjdGlvbnMpCi0JZWluZm8gKCIlUCVGOiAtLWdjLXNlY3Rpb25zIGFuZCAtciBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpOwotICAgICAgaWYgKGxpbmtfaW5mby5tcGM4NjBjMCkKLQllaW5mbyAoXygiJVAlRjogLXIgYW5kIC0tbXBjODYwYzAgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKSk7Ci0gICAgICBlbHNlIGlmIChjb21tYW5kX2xpbmUucmVsYXgpCi0JZWluZm8gKF8oIiVQJUY6IC0tcmVsYXggYW5kIC1yIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIikpOwotICAgICAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0JZWluZm8gKF8oIiVQJUY6IC1yIGFuZCAtc2hhcmVkIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIikpOwotICAgIH0KLQotICAvKiBUcmVhdCBsZCAtciAtcyBhcyBsZCAtciAtUyAteCAoaS5lLiwgc3RyaXAgYWxsIGxvY2FsIHN5bWJvbHMpLiAgSQotICAgICBkb24ndCBzZWUgaG93IGVsc2UgdGhpcyBjYW4gYmUgaGFuZGxlZCwgc2luY2UgaW4gdGhpcyBjYXNlIHdlCi0gICAgIG11c3QgcHJlc2VydmUgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgJiYgbGlua19pbmZvLnN0cmlwID09IHN0cmlwX2FsbCkKLSAgICB7Ci0gICAgICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9kZWJ1Z2dlcjsKLSAgICAgIGlmIChsaW5rX2luZm8uZGlzY2FyZCA9PSBkaXNjYXJkX25vbmUpCi0JbGlua19pbmZvLmRpc2NhcmQgPSBkaXNjYXJkX2FsbDsKLSAgICB9Ci0KLSAgLyogVGhpcyBlc3NlbnRpYWxseSBhZGRzIGFub3RoZXIgLUwgZGlyZWN0b3J5IHNvIHRoaXMgbXVzdCBiZSBkb25lIGFmdGVyCi0gICAgIHRoZSAtTCdzIGluIGFyZ3YgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gICovCi0gIHNldF9zY3JpcHRzX2RpciAoKTsKLQotICBpZiAoaGFkX3NjcmlwdCA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBSZWFkIHRoZSBlbXVsYXRpb24ncyBhcHByb3ByaWF0ZSBkZWZhdWx0IHNjcmlwdC4gICovCi0gICAgICBpbnQgaXNmaWxlOwotICAgICAgY2hhciAqcyA9IGxkZW11bF9nZXRfc2NyaXB0ICgmaXNmaWxlKTsKLQotICAgICAgaWYgKGlzZmlsZSkKLQlsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKHMpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICh0cmFjZV9maWxlX3RyaWVzKQotCSAgICB7Ci0JICAgICAgaW5mb19tc2cgKF8oInVzaW5nIGludGVybmFsIGxpbmtlciBzY3JpcHQ6XG4iKSk7Ci0JICAgICAgaW5mb19tc2cgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0JICAgICAgaW5mb19tc2cgKHMpOwotCSAgICAgIGluZm9fbXNnICgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0JICAgIH0KLQkgIGxleF9zdHJpbmcgPSBzOwotCSAgbGV4X3JlZGlyZWN0IChzKTsKLQl9Ci0gICAgICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9zY3JpcHQ7Ci0gICAgICB5eXBhcnNlICgpOwotICAgICAgbGV4X3N0cmluZyA9IE5VTEw7Ci0gICAgfQotCi0gIGxhbmdfZmluYWwgKCk7Ci0KLSAgaWYgKGxhbmdfaGFzX2lucHV0X2ZpbGUgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKHZlcnNpb25fcHJpbnRlZCkKLQl4ZXhpdCAoMCk7Ci0gICAgICBlaW5mbyAoXygiJVAlRjogbm8gaW5wdXQgZmlsZXNcbiIpKTsKLSAgICB9Ci0KLSAgaWYgKHRyYWNlX2ZpbGVzKQotICAgIHsKLSAgICAgIGluZm9fbXNnIChfKCIlUDogbW9kZSAlc1xuIiksIGVtdWxhdGlvbik7Ci0gICAgfQotCi0gIGxkZW11bF9hZnRlcl9wYXJzZSAoKTsKLQotCi0gIGlmIChjb25maWcubWFwX2ZpbGVuYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGNvbmZpZy5tYXBfZmlsZW5hbWUsICItIikgPT0gMCkKLQl7Ci0JICBjb25maWcubWFwX2ZpbGUgPSBzdGRvdXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvbmZpZy5tYXBfZmlsZSA9IGZvcGVuIChjb25maWcubWFwX2ZpbGVuYW1lLCBGT1BFTl9XVCk7Ci0JICBpZiAoY29uZmlnLm1hcF9maWxlID09IChGSUxFICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCSAgICAgIGVpbmZvIChfKCIlUCVGOiBjYW5ub3Qgb3BlbiBtYXAgZmlsZSAlczogJUVcbiIpLAotCQkgICAgIGNvbmZpZy5tYXBfZmlsZW5hbWUpOwotCSAgICB9Ci0JfQotICAgIH0KLQotCi0gIGxhbmdfcHJvY2VzcyAoKTsKLQotICAvKiBQcmludCBlcnJvciBtZXNzYWdlcyBmb3IgYW55IG1pc3Npbmcgc3ltYm9scywgZm9yIGFueSB3YXJuaW5nCi0gICAgIHN5bWJvbHMsIGFuZCBwb3NzaWJseSBtdWx0aXBsZSBkZWZpbml0aW9ucyAqLwotCi0KLSAgaWYgKGNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICB7Ci0gICAgICAvKiBMb29rIGZvciBhIHRleHQgc2VjdGlvbiBhbmQgbWFyayB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGluIGl0ICovCi0gICAgICBhc2VjdGlvbiAqZm91bmQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi50ZXh0Iik7Ci0KLSAgICAgIGlmIChmb3VuZCAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQl7Ci0JICBmb3VuZC0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgb3V0cHV0X2JmZC0+ZmxhZ3MgJj0gfkVYRUNfUDsKLSAgZWxzZQotICAgIG91dHB1dF9iZmQtPmZsYWdzIHw9IEVYRUNfUDsKLQotICBsZHdyaXRlICgpOwotCi0gIGlmIChjb25maWcubWFwX2ZpbGUgIT0gTlVMTCkKLSAgICBsYW5nX21hcCAoKTsKLSAgaWYgKGNvbW1hbmRfbGluZS5jcmVmKQotICAgIG91dHB1dF9jcmVmIChjb25maWcubWFwX2ZpbGUgIT0gTlVMTCA/IGNvbmZpZy5tYXBfZmlsZSA6IHN0ZG91dCk7Ci0gIGlmIChub2Nyb3NzcmVmX2xpc3QgIT0gTlVMTCkKLSAgICBjaGVja19ub2Nyb3NzcmVmcyAoKTsKLQotICAvKiBFdmVuIGlmIHdlJ3JlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBzb21lIG5vbi1mYXRhbCBlcnJvcnMgc2hvdWxkCi0gICAgIGJlIHJlcG9ydGVkIGluIHRoZSBleGl0IHN0YXR1cy4gIChXaGF0IG5vbi1mYXRhbCBlcnJvcnMsIGlmIGFueSwgZG8gd2UKLSAgICAgd2FudCB0byBpZ25vcmUgZm9yIHJlbG9jYXRlYWJsZSBvdXRwdXQ/KSAgKi8KLQotICBpZiAoY29uZmlnLm1ha2VfZXhlY3V0YWJsZSA9PSBmYWxzZSAmJiBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKHRyYWNlX2ZpbGVzID09IHRydWUpCi0JewotCSAgZWluZm8gKF8oIiVQOiBsaW5rIGVycm9ycyBmb3VuZCwgZGVsZXRpbmcgZXhlY3V0YWJsZSBgJXMnXG4iKSwKLQkJIG91dHB1dF9maWxlbmFtZSk7Ci0JfQotCi0gICAgICAvKiBUaGUgZmlsZSB3aWxsIGJlIHJlbW92ZWQgYnkgcmVtb3ZlX291dHB1dC4gICovCi0KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY2xvc2UgKG91dHB1dF9iZmQpKQotCWVpbmZvIChfKCIlRiVCOiBmaW5hbCBjbG9zZSBmYWlsZWQ6ICVFXG4iKSwgb3V0cHV0X2JmZCk7Ci0KLSAgICAgIC8qIElmIHRoZSAtLWZvcmNlLWV4ZS1zdWZmaXggaXMgZW5hYmxlZCwgYW5kIHdlJ3JlIG1ha2luZyBhbgotCSBleGVjdXRhYmxlIGZpbGUgYW5kIGl0IGRvZXNuJ3QgZW5kIGluIC5leGUsIGNvcHkgaXQgdG8gb25lIHdoaWNoIGRvZXMuICovCi0KLSAgICAgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgJiYgY29tbWFuZF9saW5lLmZvcmNlX2V4ZV9zdWZmaXgpCi0JewotCSAgaW50IGxlbiA9IHN0cmxlbiAob3V0cHV0X2ZpbGVuYW1lKTsKLQkgIGlmIChsZW4gPCA0IAotCSAgICAgIHx8IChzdHJjYXNlY21wIChvdXRwdXRfZmlsZW5hbWUgKyBsZW4gLSA0LCAiLmV4ZSIpICE9IDAKLQkJICAmJiBzdHJjYXNlY21wIChvdXRwdXRfZmlsZW5hbWUgKyBsZW4gLSA0LCAiLmRsbCIpICE9IDApKQotCSAgICB7Ci0JICAgICAgRklMRSAqc3JjOwotCSAgICAgIEZJTEUgKmRzdDsKLQkgICAgICBjb25zdCBpbnQgYnNpemUgPSA0MDk2OwotCSAgICAgIGNoYXIgKmJ1ZiA9IHhtYWxsb2MgKGJzaXplKTsKLQkgICAgICBpbnQgbDsKLQkgICAgICBjaGFyICpkc3RfbmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotCSAgICAgIHN0cmNweSAoZHN0X25hbWUsIG91dHB1dF9maWxlbmFtZSk7Ci0JICAgICAgc3RyY2F0IChkc3RfbmFtZSwgIi5leGUiKTsKLQkgICAgICBzcmMgPSBmb3BlbiAob3V0cHV0X2ZpbGVuYW1lLCBGT1BFTl9SQik7Ci0JICAgICAgZHN0ID0gZm9wZW4gKGRzdF9uYW1lLCBGT1BFTl9XQik7Ci0KLQkgICAgICBpZiAoIXNyYykKLQkJZWluZm8gKF8oIiVYJVA6IHVuYWJsZSB0byBvcGVuIGZvciBzb3VyY2Ugb2YgY29weSBgJXMnXG4iKSwgb3V0cHV0X2ZpbGVuYW1lKTsKLQkgICAgICBpZiAoIWRzdCkKLQkJZWluZm8gKF8oIiVYJVA6IHVuYWJsZSB0byBvcGVuIGZvciBkZXN0aW5hdGlvbiBvZiBjb3B5IGAlcydcbiIpLCBkc3RfbmFtZSk7Ci0JICAgICAgd2hpbGUgKChsID0gZnJlYWQgKGJ1ZiwgMSwgYnNpemUsIHNyYykpID4gMCkKLQkJewotCQkgIGludCBkb25lID0gZndyaXRlIChidWYsIDEsIGwsIGRzdCk7Ci0JCSAgaWYgKGRvbmUgIT0gbCkKLQkJICAgIHsKLQkJICAgICAgZWluZm8gKF8oIiVQOiBFcnJvciB3cml0aW5nIGZpbGUgYCVzJ1xuIiksIGRzdF9uYW1lKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGZjbG9zZSAoc3JjKTsKLQkgICAgICBpZiAoZmNsb3NlIChkc3QpID09IEVPRikKLQkJewotCQkgIGVpbmZvIChfKCIlUDogRXJyb3IgY2xvc2luZyBmaWxlIGAlcydcbiIpLCBkc3RfbmFtZSk7Ci0JCX0KLQkgICAgICBmcmVlIChkc3RfbmFtZSk7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0gIGlmIChjb25maWcuc3RhdHMpCi0gICAgewotI2lmZGVmIEhBVkVfU0JSSwotICAgICAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7Ci0jZW5kaWYKLSAgICAgIGxvbmcgcnVuX3RpbWUgPSBnZXRfcnVuX3RpbWUgKCkgLSBzdGFydF90aW1lOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB0b3RhbCB0aW1lIGluIGxpbms6ICVsZC4lMDZsZFxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgcnVuX3RpbWUgLyAxMDAwMDAwLCBydW5fdGltZSAlIDEwMDAwMDApOwotI2lmZGVmIEhBVkVfU0JSSwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksIHByb2dyYW1fbmFtZSwKLQkgICAgICAgKGxvbmcpIChsaW0gLSAoY2hhciAqKSAmZW52aXJvbikpOwotI2VuZGlmCi0gICAgfQotCi0gIC8qIFByZXZlbnQgcmVtb3ZlX291dHB1dCBmcm9tIGRvaW5nIGFueXRoaW5nLCBhZnRlciBhIHN1Y2Nlc3NmdWwgbGluay4gICovCi0gIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0KLSAgeGV4aXQgKDApOwotICByZXR1cm4gMDsKLX0KLQotLyogV2UgbmVlZCB0byBmaW5kIGFueSBleHBsaWNpdGx5IGdpdmVuIGVtdWxhdGlvbiBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoZQotICAgc3RhdGUgdGhhdCdzIG5lZWRlZCBieSB0aGUgbGV4JnlhY2MgYXJndW1lbnQgcGFyc2VyIChwYXJzZV9hcmdzKS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9lbXVsYXRpb24gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqZW11bGF0aW9uOwotICBpbnQgaTsKLQotICBlbXVsYXRpb24gPSBnZXRlbnYgKEVNVUxBVElPTl9FTlZJUk9OKTsKLSAgaWYgKGVtdWxhdGlvbiA9PSBOVUxMKQotICAgIGVtdWxhdGlvbiA9IERFRkFVTFRfRU1VTEFUSU9OOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgewotICAgICAgaWYgKCFzdHJuY21wIChhcmd2W2ldLCAiLW0iLCAyKSkKLQl7Ci0JICBpZiAoYXJndltpXVsyXSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogLW0gRU1VTCAqLwotCSAgICAgIGlmIChpIDwgYXJnYyAtIDEpCi0JCXsKLQkJICBlbXVsYXRpb24gPSBhcmd2W2kgKyAxXTsKLQkJICBpKys7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBlaW5mbyhfKCIlUCVGOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC1tXG4iKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChhcmd2W2ldLCAiLW1pcHMxIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczIiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAoYXJndltpXSwgIi1taXBzMyIpID09IDAKLQkJICAgfHwgc3RyY21wIChhcmd2W2ldLCAiLW1pcHM0IikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBUaGUgYXJndW1lbnRzIC1taXBzMSwgLW1pcHMyIGFuZCAtbWlwczMgYXJlCi0JCSBwYXNzZWQgdG8gdGhlIGxpbmtlciBieSBzb21lIE1JUFMgY29tcGlsZXJzLiAgVGhleQotCQkgZ2VuZXJhbGx5IHRlbGwgdGhlIGxpbmtlciB0byB1c2UgYSBzbGlnaHRseSBkaWZmZXJlbnQKLQkJIGxpYnJhcnkgcGF0aC4gIFBlcmhhcHMgc29tZWRheSB0aGVzZSBzaG91bGQgYmUKLQkJIGltcGxlbWVudGVkIGFzIGVtdWxhdGlvbnM7IHVudGlsIHRoZW4sIHdlIGp1c3QgaWdub3JlCi0JCSB0aGUgYXJndW1lbnRzIGFuZCBob3BlIHRoYXQgbm9ib2R5IGV2ZXIgY3JlYXRlcwotCQkgZW11bGF0aW9ucyBuYW1lZCBpcHMxLCBpcHMyIG9yIGlwczMuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItbTQ4NiIpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogVGhlIGFyZ3VtZW50IC1tNDg2IGlzIHBhc3NlZCB0byB0aGUgbGlua2VyIG9uCi0JCSBzb21lIExpbnV4IHN5c3RlbXMuICBIb3BlIHRoYXQgbm9ib2R5IGNyZWF0ZXMgYW4KLQkJIGVtdWxhdGlvbiBuYW1lZCA0ODYuICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiAtbUVNVUwgKi8KLQkgICAgICBlbXVsYXRpb24gPSAmYXJndltpXVsyXTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGVtdWxhdGlvbjsKLX0KLQotLyogSWYgZGlyZWN0b3J5IERJUiBjb250YWlucyBhbiAibGRzY3JpcHRzIiBzdWJkaXJlY3RvcnksCi0gICBhZGQgRElSIHRvIHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGFuZCByZXR1cm4gdHJ1ZSwKLSAgIGVsc2UgcmV0dXJuIGZhbHNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNoZWNrX2Zvcl9zY3JpcHRzX2RpciAoZGlyKQotICAgICBjaGFyICpkaXI7Ci17Ci0gIHNpemVfdCBkaXJsZW47Ci0gIGNoYXIgKmJ1ZjsKLSAgc3RydWN0IHN0YXQgczsKLSAgYm9vbGVhbiByZXM7Ci0KLSAgZGlybGVuID0gc3RybGVuIChkaXIpOwotICAvKiBzaXplb2YgY291bnRzIHRoZSB0ZXJtaW5hdGluZyBOVUwuICAqLwotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChkaXJsZW4gKyBzaXplb2YoIi9sZHNjcmlwdHMiKSk7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzL2xkc2NyaXB0cyIsIGRpcik7Ci0KLSAgcmVzID0gc3RhdCAoYnVmLCAmcykgPT0gMCAmJiBTX0lTRElSIChzLnN0X21vZGUpOwotICBmcmVlIChidWYpOwotICBpZiAocmVzKQotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChkaXIsIGZhbHNlKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogU2V0IHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgZmluZGluZyBzY3JpcHQgZmlsZXMuCi0gICBMaWJyYXJpZXMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgaGVyZSB0b28sIGJ1dCB0aGF0J3Mgb2suCi0gICBXZSBsb29rIGZvciB0aGUgImxkc2NyaXB0cyIgZGlyZWN0b3J5IGluOgotCi0gICBTQ1JJUFRESVIgKHBhc3NlZCBmcm9tIE1ha2VmaWxlKQotICAgdGhlIGRpciB3aGVyZSB0aGlzIHByb2dyYW0gaXMgKGZvciB1c2luZyBpdCBmcm9tIHRoZSBidWlsZCB0cmVlKQotICAgdGhlIGRpciB3aGVyZSB0aGlzIHByb2dyYW0gaXMvLi4vbGliIChmb3IgaW5zdGFsbGluZyB0aGUgdG9vbCBzdWl0ZSBlbHNld2hlcmUpICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfc2NyaXB0c19kaXIgKCkKLXsKLSAgY2hhciAqZW5kLCAqZGlyOwotICBzaXplX3QgZGlybGVuOwotCi0gIGlmIChjaGVja19mb3Jfc2NyaXB0c19kaXIgKFNDUklQVERJUikpCi0gICAgcmV0dXJuOwkJCS8qIFdlJ3ZlIGJlZW4gaW5zdGFsbGVkIG5vcm1hbGx5LiAgKi8KLQotICAvKiBMb29rIGZvciAibGRzY3JpcHRzIiBpbiB0aGUgZGlyIHdoZXJlIG91ciBiaW5hcnkgaXMuICAqLwotICBlbmQgPSBzdHJyY2hyIChwcm9ncmFtX25hbWUsICcvJyk7Ci0KLSAgaWYgKGVuZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIERvbid0IGxvb2sgZm9yIGxkc2NyaXB0cyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBUaGVyZSBpcwotICAgICAgICAgdG9vIG11Y2ggcG90ZW50aWFsIGZvciBjb25mdXNpb24uICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkaXJsZW4gPSBlbmQgLSBwcm9ncmFtX25hbWU7Ci0gIC8qIE1ha2UgYSBjb3B5IG9mIHByb2dyYW1fbmFtZSBpbiBkaXIuCi0gICAgIExlYXZlIHJvb20gZm9yIGxhdGVyICIvLi4vbGliIi4gICovCi0gIGRpciA9IChjaGFyICopIHhtYWxsb2MgKGRpcmxlbiArIDgpOwotICBzdHJuY3B5IChkaXIsIHByb2dyYW1fbmFtZSwgZGlybGVuKTsKLSAgZGlyW2Rpcmxlbl0gPSAnXDAnOwotCi0gIGlmIChjaGVja19mb3Jfc2NyaXB0c19kaXIgKGRpcikpCi0gICAgcmV0dXJuOwkJCS8qIERvbid0IGZyZWUgZGlyLiAgKi8KLQotICAvKiBMb29rIGZvciAibGRzY3JpcHRzIiBpbiA8dGhlIGRpciB3aGVyZSBvdXIgYmluYXJ5IGlzPi8uLi9saWIuICAqLwotICBzdHJjcHkgKGRpciArIGRpcmxlbiwgIi8uLi9saWIiKTsKLSAgaWYgKGNoZWNrX2Zvcl9zY3JpcHRzX2RpciAoZGlyKSkKLSAgICByZXR1cm47Ci0KLSAgZnJlZSAoZGlyKTsJCQkvKiBXZWxsLCB3ZSB0cmllZC4gICovCi19Ci0KLXZvaWQKLWFkZF95c3ltIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobGlua19pbmZvLm5vdGljZV9oYXNoID09IChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBsaW5rX2luZm8ubm90aWNlX2hhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkJICAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICAgICAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uIChsaW5rX2luZm8ubm90aWNlX2hhc2gsCi0JCQkJICAgYmZkX2hhc2hfbmV3ZnVuYywKLQkJCQkgICA2MSkpCi0JZWluZm8gKF8oIiVQJUY6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIikpOwotICAgIH0gICAgICAKLQotICBpZiAoYmZkX2hhc2hfbG9va3VwIChsaW5rX2luZm8ubm90aWNlX2hhc2gsIG5hbWUsIHRydWUsIHRydWUpCi0gICAgICA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJUY6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci19Ci0KLS8qIFJlY29yZCBhIHN5bWJvbCB0byBiZSB3cmFwcGVkLCBmcm9tIHRoZSAtLXdyYXAgb3B0aW9uLiAgKi8KLQotdm9pZAotYWRkX3dyYXAgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChsaW5rX2luZm8ud3JhcF9oYXNoID09IE5VTEwpCi0gICAgewotICAgICAgbGlua19pbmZvLndyYXBfaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICAgICAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uIChsaW5rX2luZm8ud3JhcF9oYXNoLAotCQkJCSAgIGJmZF9oYXNoX25ld2Z1bmMsCi0JCQkJICAgNjEpKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci0gIGlmIChiZmRfaGFzaF9sb29rdXAgKGxpbmtfaW5mby53cmFwX2hhc2gsIG5hbWUsIHRydWUsIHRydWUpID09IE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJUY6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLXJldGFpbi1zeW1ib2xzLWZpbGUgb3B0aW9uLiAgKi8KLQotdm9pZAotYWRkX2tlZXBzeW1zX2ZpbGUgKGZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgRklMRSAqZmlsZTsKLSAgY2hhciAqYnVmOwotICBzaXplX3QgYnVmc2l6ZTsKLSAgaW50IGM7Ci0KLSAgaWYgKGxpbmtfaW5mby5zdHJpcCA9PSBzdHJpcF9zb21lKQotICAgIGVpbmZvIChfKCIlWCVQOiBlcnJvcjogZHVwbGljYXRlIHJldGFpbi1zeW1ib2xzLWZpbGVcbiIpKTsKLQotICBmaWxlID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotICBpZiAoZmlsZSA9PSAoRklMRSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlaW5mbyAoIiVYJVA6ICVzOiAlRVxuIiwgZmlsZW5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsaW5rX2luZm8ua2VlcF9oYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJCSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAobGlua19pbmZvLmtlZXBfaGFzaCwgYmZkX2hhc2hfbmV3ZnVuYykpCi0gICAgZWluZm8gKF8oIiVQJUY6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIikpOwotCi0gIGJ1ZnNpemUgPSAxMDA7Ci0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGJ1ZnNpemUpOwotCi0gIGMgPSBnZXRjIChmaWxlKTsKLSAgd2hpbGUgKGMgIT0gRU9GKQotICAgIHsKLSAgICAgIHdoaWxlIChpc3NwYWNlIChjKSkKLQljID0gZ2V0YyAoZmlsZSk7Ci0KLSAgICAgIGlmIChjICE9IEVPRikKLQl7Ci0JICBzaXplX3QgbGVuID0gMDsKLQotCSAgd2hpbGUgKCEgaXNzcGFjZSAoYykgJiYgYyAhPSBFT0YpCi0JICAgIHsKLQkgICAgICBidWZbbGVuXSA9IGM7Ci0JICAgICAgKytsZW47Ci0JICAgICAgaWYgKGxlbiA+PSBidWZzaXplKQotCQl7Ci0JCSAgYnVmc2l6ZSAqPSAyOwotCQkgIGJ1ZiA9IHhyZWFsbG9jIChidWYsIGJ1ZnNpemUpOwotCQl9Ci0JICAgICAgYyA9IGdldGMgKGZpbGUpOwotCSAgICB9Ci0KLQkgIGJ1ZltsZW5dID0gJ1wwJzsKLQotCSAgaWYgKGJmZF9oYXNoX2xvb2t1cCAobGlua19pbmZvLmtlZXBfaGFzaCwgYnVmLCB0cnVlLCB0cnVlKQotCSAgICAgID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgZWluZm8gKF8oIiVQJUY6IGJmZF9oYXNoX2xvb2t1cCBmb3IgaW5zZXJ0aW9uIGZhaWxlZDogJUVcbiIpKTsKLQl9Ci0gICAgfQotCi0gIGlmIChsaW5rX2luZm8uc3RyaXAgIT0gc3RyaXBfbm9uZSkKLSAgICBlaW5mbyAoXygiJVA6IGAtcmV0YWluLXN5bWJvbHMtZmlsZScgb3ZlcnJpZGVzIGAtcycgYW5kIGAtUydcbiIpKTsKLQotICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9zb21lOwotfQotDAotLyogQ2FsbGJhY2tzIGZyb20gdGhlIEJGRCBsaW5rZXIgcm91dGluZXMuICAqLwotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIEJGRCBoYXMgZGVjaWRlZCB0byBpbmNsdWRlIGFuIGFyY2hpdmUgbWVtYmVyIGluCi0gICBhIGxpbmsuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1hZGRfYXJjaGl2ZV9lbGVtZW50IChpbmZvLCBhYmZkLCBuYW1lKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlucHV0OwotCi0gIGlucHV0ID0gKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopCi0JICAgeG1hbGxvYyAoc2l6ZW9mIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKSkpOwotICBpbnB1dC0+ZmlsZW5hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgaW5wdXQtPmxvY2FsX3N5bV9uYW1lID0gYWJmZC0+ZmlsZW5hbWU7Ci0gIGlucHV0LT50aGVfYmZkID0gYWJmZDsKLSAgaW5wdXQtPmFzeW1ib2xzID0gTlVMTDsKLSAgaW5wdXQtPm5leHQgPSBOVUxMOwotICBpbnB1dC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgaW5wdXQtPmxvYWRlZCA9IGZhbHNlOwotICBpbnB1dC0+c2VhcmNoX2RpcnNfZmxhZyA9IGZhbHNlOwotCi0gIC8qIEZJWE1FOiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IHNldDogaGVhZGVyLm5leHQsCi0gICAgIGhlYWRlci50eXBlLCBjbG9zZWQsIHBhc3NpdmVfcG9zaXRpb24sIHN5bWJvbF9jb3VudCwKLSAgICAgbmV4dF9yZWFsX2ZpbGUsIGlzX2FyY2hpdmUsIHRhcmdldCwgcmVhbC4gIFRoaXMgYml0IG9mIGNvZGUgaXMKLSAgICAgZnJvbSB0aGUgb2xkIGRlY29kZV9saWJyYXJ5X3N1YmZpbGUgZnVuY3Rpb24uICBJIGRvbid0IGtub3cKLSAgICAgd2hldGhlciBhbnkgb2YgdGhvc2UgZmllbGRzIG1hdHRlcnMuICAqLwotCi0gIGxkbGFuZ19hZGRfZmlsZSAoaW5wdXQpOwotCi0gIGlmIChjb25maWcubWFwX2ZpbGUgIT0gKEZJTEUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzdGF0aWMgYm9vbGVhbiBoZWFkZXJfcHJpbnRlZDsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkICpmcm9tOwotICAgICAgaW50IGxlbjsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQlmcm9tID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGgtPnR5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcm9tID0gTlVMTDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgZnJvbSA9IGgtPnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0JICAgICAgZnJvbSA9IGgtPnUudW5kZWYuYWJmZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIGZyb20gPSBoLT51LmMucC0+c2VjdGlvbi0+b3duZXI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQotCXsKLQkgIGNoYXIgYnVmWzEwMF07Ci0KLQkgIHNwcmludGYgKGJ1ZiwgIiUtMjlzICVzXG5cbiIsIF8oIkFyY2hpdmUgbWVtYmVyIGluY2x1ZGVkIiksCi0JCSAgIF8oImJlY2F1c2Ugb2YgZmlsZSAoc3ltYm9sKSIpKTsKLQkgIG1pbmZvICgiJXMiLCBidWYpOwotCSAgaGVhZGVyX3ByaW50ZWQgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKGJmZF9teV9hcmNoaXZlIChhYmZkKSA9PSBOVUxMKQotCXsKLQkgIG1pbmZvICgiJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBsZW4gPSBzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWluZm8gKCIlcyglcykiLCBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgbGVuID0gKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSkKLQkJICsgc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkKLQkJICsgMik7Ci0JfQotCi0gICAgICBpZiAobGVuID49IDI5KQotCXsKLQkgIHByaW50X25sICgpOwotCSAgbGVuID0gMDsKLQl9Ci0gICAgICB3aGlsZSAobGVuIDwgMzApCi0JewotCSAgcHJpbnRfc3BhY2UgKCk7Ci0JICArK2xlbjsKLQl9Ci0KLSAgICAgIGlmIChmcm9tICE9IE5VTEwpCi0JbWluZm8gKCIlQiAiLCBmcm9tKTsKLSAgICAgIGlmIChoICE9IE5VTEwpCi0JbWluZm8gKCIoJVQpXG4iLCBoLT5yb290LnN0cmluZyk7Ci0gICAgICBlbHNlCi0JbWluZm8gKCIoJXMpXG4iLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKHRyYWNlX2ZpbGVzIHx8IHRyYWNlX2ZpbGVfdHJpZXMpCi0gICAgaW5mb19tc2cgKCIlSVxuIiwgaW5wdXQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIEJGRCBoYXMgZGlzY292ZXJlZCBhIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkCi0gICBtdWx0aXBsZSB0aW1lcy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW11bHRpcGxlX2RlZmluaXRpb24gKGluZm8sIG5hbWUsIG9iZmQsIG9zZWMsIG92YWwsIG5iZmQsIG5zZWMsIG52YWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci0gICAgIGJmZF92bWEgb3ZhbDsKLSAgICAgYmZkICpuYmZkOwotICAgICBhc2VjdGlvbiAqbnNlYzsKLSAgICAgYmZkX3ZtYSBudmFsOwotewotICAvKiBJZiBlaXRoZXIgc2VjdGlvbiBoYXMgdGhlIG91dHB1dF9zZWN0aW9uIGZpZWxkIHNldCB0bwotICAgICBiZmRfYWJzX3NlY3Rpb25fcHRyLCBpdCBtZWFucyB0aGF0IHRoZSBzZWN0aW9uIGlzIGJlaW5nCi0gICAgIGRpc2NhcmRlZCwgYW5kIHRoaXMgaXMgbm90IHJlYWxseSBhIG11bHRpcGxlIGRlZmluaXRpb24gYXQgYWxsLgotICAgICBGSVhNRTogSXQgd291bGQgYmUgY2xlYW5lciB0byBzb21laG93IGlnbm9yZSBzeW1ib2xzIGRlZmluZWQgaW4KLSAgICAgc2VjdGlvbnMgd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4gICovCi0gIGlmICgob3NlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChvc2VjKQotICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAob3NlYy0+b3V0cHV0X3NlY3Rpb24pKQotICAgICAgfHwgKG5zZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChuc2VjKQotCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChuc2VjLT5vdXRwdXRfc2VjdGlvbikpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVpbmZvIChfKCIlWCVDOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGAlVCdcbiIpLAotCSBuYmZkLCBuc2VjLCBudmFsLCBuYW1lKTsKLSAgaWYgKG9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlRDogZmlyc3QgZGVmaW5lZCBoZXJlXG4iKSwgb2JmZCwgb3NlYywgb3ZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wsIG9yCi0gICB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBmb3VuZCBmb3IgYSBzeW1ib2wgdGhhdCBpcyBhbHJlYWR5IGRlZmluZWQsCi0gICBvciB3aGVuIHR3byBjb21tb24gc3ltYm9scyBhcmUgZm91bmQuICBXZSBvbmx5IGRvIHNvbWV0aGluZyBpZgotICAgLXdhcm4tY29tbW9uIHdhcyB1c2VkLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbXVsdGlwbGVfY29tbW9uIChpbmZvLCBuYW1lLCBvYmZkLCBvdHlwZSwgb3NpemUsIG5iZmQsIG50eXBlLCBuc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICpvYmZkOwotICAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBvdHlwZTsKLSAgICAgYmZkX3ZtYSBvc2l6ZTsKLSAgICAgYmZkICpuYmZkOwotICAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBudHlwZTsKLSAgICAgYmZkX3ZtYSBuc2l6ZTsKLXsKLSAgaWYgKCEgY29uZmlnLndhcm5fY29tbW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgIHx8IG50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotICAgICAgfHwgbnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICB7Ci0gICAgICBBU1NFUlQgKG90eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLSAgICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogZGVmaW5pdGlvbiBvZiBgJVQnIG92ZXJyaWRpbmcgY29tbW9uXG4iKSwKLQkgICAgIG5iZmQsIG5hbWUpOwotICAgICAgaWYgKG9iZmQgIT0gTlVMTCkKLQllaW5mbyAoXygiJUI6IHdhcm5pbmc6IGNvbW1vbiBpcyBoZXJlXG4iKSwgb2JmZCk7Ci0gICAgfQotICBlbHNlIGlmIChvdHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBvdHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkgICB8fCBvdHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHsKLSAgICAgIEFTU0VSVCAobnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotICAgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkZGVuIGJ5IGRlZmluaXRpb25cbiIpLAotCSAgICAgbmJmZCwgbmFtZSk7Ci0gICAgICBpZiAob2JmZCAhPSBOVUxMKQotCWVpbmZvIChfKCIlQjogd2FybmluZzogZGVmaW5lZCBoZXJlXG4iKSwgb2JmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQVNTRVJUIChvdHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbiAmJiBudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0gICAgICBpZiAob3NpemUgPiBuc2l6ZSkKLQl7Ci0JICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRkZW4gYnkgbGFyZ2VyIGNvbW1vblxuIiksCi0JCSBuYmZkLCBuYW1lKTsKLQkgIGlmIChvYmZkICE9IE5VTEwpCi0JICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogbGFyZ2VyIGNvbW1vbiBpcyBoZXJlXG4iKSwgb2JmZCk7Ci0JfQotICAgICAgZWxzZSBpZiAobnNpemUgPiBvc2l6ZSkKLQl7Ci0JICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRpbmcgc21hbGxlciBjb21tb25cbiIpLAotCQkgbmJmZCwgbmFtZSk7Ci0JICBpZiAob2JmZCAhPSBOVUxMKQotCSAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IHNtYWxsZXIgY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBtdWx0aXBsZSBjb21tb24gb2YgYCVUJ1xuIiksIG5iZmQsIG5hbWUpOwotCSAgaWYgKG9iZmQgIT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBwcmV2aW91cyBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkaXNjb3ZlcmVkIGEgc2V0IGVsZW1lbnQuICBIIGlzIHRoZQotICAgZW50cnkgaW4gdGhlIGxpbmtlciBoYXNoIHRhYmxlIGZvciB0aGUgc2V0LiAgU0VDVElPTiBhbmQgVkFMVUUKLSAgIHJlcHJlc2VudCBhIHZhbHVlIHdoaWNoIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgc2V0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotYWRkX3RvX3NldCAoaW5mbywgaCwgcmVsb2MsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAoY29uZmlnLndhcm5fY29uc3RydWN0b3JzKQotICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogZ2xvYmFsIGNvbnN0cnVjdG9yICVzIHVzZWRcbiIpLAotCSAgIGgtPnJvb3Quc3RyaW5nKTsKLQotICBpZiAoISBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHJldHVybiB0cnVlOwotCi0gIGxkY3Rvcl9hZGRfc2V0X2VudHJ5IChoLCByZWxvYywgKGNvbnN0IGNoYXIgKikgTlVMTCwgc2VjdGlvbiwgdmFsdWUpOwotCi0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIHsKLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0gICAgICAvKiBXZSBkb24ndCBjYWxsIGJmZF9saW5rX2FkZF91bmRlZiB0byBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZgotCSB1bmRlZmluZWQgc3ltYm9scyBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZWZpbmUgaXQKLQkgb3Vyc2VsdmVzLiAgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkaXNjb3ZlcmVkIGEgY29uc3RydWN0b3IuICBUaGlzIGlzIG9ubHkKLSAgIGNhbGxlZCBmb3Igc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLS10aG9zZSB3aGljaCBkbyBub3QgaGFuZGxlCi0gICBjb25zdHJ1Y3RvcnMgaW4gc29tZSBtb3JlIGNsZXZlciBmYXNoaW9uLiAgVGhpcyBpcyBzaW1pbGFyIHRvCi0gICBhZGRpbmcgYW4gZWxlbWVudCB0byBhIHNldCwgYnV0IGxlc3MgZ2VuZXJhbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb25zdHJ1Y3Rvcl9jYWxsYmFjayAoaW5mbywgY29uc3RydWN0b3IsIG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBjb25zdHJ1Y3RvcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgY2hhciAqczsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGNoYXIgc2V0X25hbWVbMSArIHNpemVvZiAiX19DVE9SX0xJU1RfXyJdOwotCi0gIGlmIChjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMpCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBnbG9iYWwgY29uc3RydWN0b3IgJXMgdXNlZFxuIiksIG5hbWUpOwotCi0gIGlmICghIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRW5zdXJlIHRoYXQgQkZEX1JFTE9DX0NUT1IgZXhpc3RzIG5vdywgc28gdGhhdCB3ZSBjYW4gZ2l2ZSBhCi0gICAgIHVzZWZ1bCBlcnJvciBtZXNzYWdlLiAgKi8KLSAgaWYgKGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgQkZEX1JFTE9DX0NUT1IpID09IE5VTEwKLSAgICAgICYmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0JICB8fCBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ19DVE9SKSA9PSBOVUxMKSkKLSAgICBlaW5mbyAoXygiJVAlRjogQkZEIGJhY2tlbmQgZXJyb3I6IEJGRF9SRUxPQ19DVE9SIHVuc3VwcG9ydGVkXG4iKSk7Ci0KLSAgcyA9IHNldF9uYW1lOwotICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSAhPSAnXDAnKQotICAgICpzKysgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOwotICBpZiAoY29uc3RydWN0b3IpCi0gICAgc3RyY3B5IChzLCAiX19DVE9SX0xJU1RfXyIpOwotICBlbHNlCi0gICAgc3RyY3B5IChzLCAiX19EVE9SX0xJU1RfXyIpOwotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgc2V0X25hbWUsIHRydWUsIHRydWUsIHRydWUpOwotICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLSAgICB7Ci0gICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0gICAgICBoLT51LnVuZGVmLmFiZmQgPSBhYmZkOwotICAgICAgLyogV2UgZG9uJ3QgY2FsbCBiZmRfbGlua19hZGRfdW5kZWYgdG8gYWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2YKLQkgdW5kZWZpbmVkIHN5bWJvbHMgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gZGVmaW5lIGl0Ci0JIG91cnNlbHZlcy4gICovCi0gICAgfQotCi0gIGxkY3Rvcl9hZGRfc2V0X2VudHJ5IChoLCBCRkRfUkVMT0NfQ1RPUiwgbmFtZSwgc2VjdGlvbiwgdmFsdWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQSBzdHJ1Y3R1cmUgdXNlZCBieSB3YXJuaW5nX2NhbGxiYWNrIHRvIHBhc3MgaW5mb3JtYXRpb24gdGhyb3VnaAotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbwotewotICBib29sZWFuIGZvdW5kOwotICBjb25zdCBjaGFyICp3YXJuaW5nOwotICBjb25zdCBjaGFyICpzeW1ib2w7Ci0gIGFzeW1ib2wgKiphc3ltYm9sczsKLX07Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gYSB3YXJuaW5nIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXdhcm5pbmdfY2FsbGJhY2sgKGluZm8sIHdhcm5pbmcsIHN5bWJvbCwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqd2FybmluZzsKLSAgICAgY29uc3QgY2hhciAqc3ltYm9sOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIC8qIFRoaXMgaXMgYSBoYWNrIHRvIHN1cHBvcnQgd2Fybl9tdWx0aXBsZV9ncC4gIEZJWE1FOiBUaGlzIHNob3VsZAotICAgICBoYXZlIGEgY2xlYW5lciBpbnRlcmZhY2UsIGJ1dCB3aGF0PyAgKi8KLSAgaWYgKCEgY29uZmlnLndhcm5fbXVsdGlwbGVfZ3AKLSAgICAgICYmIHN0cmNtcCAod2FybmluZywgInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICBlaW5mbyAoIiVDOiAlc1xuIiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgd2FybmluZyk7Ci0gIGVsc2UgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICBlaW5mbyAoIiVQOiAlc1xuIiwgd2FybmluZyk7Ci0gIGVsc2UgaWYgKHN5bWJvbCA9PSBOVUxMKQotICAgIGVpbmZvICgiJUI6ICVzXG4iLCBhYmZkLCB3YXJuaW5nKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotICAgICAgYXN5bWJvbCAqKmFzeW1ib2xzOwotICAgICAgc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyBpbmZvOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyB0byBzZWUgaWYgd2UgY2FuIGZpbmQgYSBwbGF1c2libGUKLQkgYWRkcmVzcy4gICovCi0KLSAgICAgIGVudHJ5ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgYWJmZC0+dXNyZGF0YTsKLSAgICAgIGlmIChlbnRyeSAhPSBOVUxMICYmIGVudHJ5LT5hc3ltYm9scyAhPSBOVUxMKQotCWFzeW1ib2xzID0gZW50cnktPmFzeW1ib2xzOwotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQkgIGxvbmcgc3ltYm9sX2NvdW50OwotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotCSAgaWYgKHN5bXNpemUgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKLQkgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKLQkgIGlmIChzeW1ib2xfY291bnQgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKLQkgIGlmIChlbnRyeSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZW50cnktPmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0JICAgICAgZW50cnktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgaW5mby5mb3VuZCA9IGZhbHNlOwotICAgICAgaW5mby53YXJuaW5nID0gd2FybmluZzsKLSAgICAgIGluZm8uc3ltYm9sID0gc3ltYm9sOwotICAgICAgaW5mby5hc3ltYm9scyA9IGFzeW1ib2xzOwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCB3YXJuaW5nX2ZpbmRfcmVsb2MsIChQVFIpICZpbmZvKTsKLQotICAgICAgaWYgKCEgaW5mby5mb3VuZCkKLQllaW5mbyAoIiVCOiAlc1xuIiwgYWJmZCwgd2FybmluZyk7Ci0KLSAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQotCWZyZWUgKGFzeW1ib2xzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgZm9yIGVhY2ggc2VjdGlvbi4gIEl0IGNoZWNrcyB0aGUKLSAgIHJlbG9jcyBvZiB0aGUgc2VjdGlvbiB0byBzZWUgaWYgaXQgY2FuIGZpbmQgYSByZWZlcmVuY2UgdG8gdGhlCi0gICBzeW1ib2wgd2hpY2ggdHJpZ2dlcmVkIHRoZSB3YXJuaW5nLiAgSWYgaXQgY2FuLCBpdCB1c2VzIHRoZSByZWxvYwotICAgdG8gZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIHdpdGggYSBmaWxlIGFuZCBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi13YXJuaW5nX2ZpbmRfcmVsb2MgKGFiZmQsIHNlYywgaWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgaWFyZzsKLXsKLSAgc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyAqaW5mbyA9IChzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvICopIGlhcmc7Ci0gIGxvbmcgcmVsc2l6ZTsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotICBhcmVsZW50ICoqcCwgKipwZW5kOwotCi0gIGlmIChpbmZvLT5mb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOwotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbHBwLCBpbmZvLT5hc3ltYm9scyk7Ci0gIGlmIChyZWxjb3VudCA8IDApCi0gICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKLQotICBwID0gcmVscHA7Ci0gIHBlbmQgPSBwICsgcmVsY291bnQ7Ci0gIGZvciAoOyBwIDwgcGVuZCAmJiAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcSA9ICpwOwotCi0gICAgICBpZiAocS0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCSAgJiYgKnEtPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKSwgaW5mby0+c3ltYm9sKSA9PSAwKQotCXsKLQkgIC8qIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLQkgIGVpbmZvICgiJUM6ICVzXG4iLCBhYmZkLCBzZWMsIHEtPmFkZHJlc3MsIGluZm8tPndhcm5pbmcpOwotCSAgaW5mby0+Zm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmcmVlIChyZWxwcCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyBmb3VuZC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXVuZGVmaW5lZF9zeW1ib2wgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgc3RhdGljIGNoYXIgKmVycm9yX25hbWU7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXJyb3JfY291bnQ7Ci0KLSNkZWZpbmUgTUFYX0VSUk9SU19JTl9BX1JPVyA1Ci0KLSAgaWYgKGNvbmZpZy53YXJuX29uY2UpCi0gICAgewotICAgICAgc3RhdGljIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqaGFzaDsKLQotICAgICAgLyogT25seSB3YXJuIG9uY2UgYWJvdXQgYSBwYXJ0aWN1bGFyIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCi0gICAgICBpZiAoaGFzaCA9PSBOVUxMKQotCXsKLQkgIGhhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotCSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoaGFzaCwgYmZkX2hhc2hfbmV3ZnVuYykpCi0JICAgIGVpbmZvIChfKCIlRiVQOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkgIT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSkgPT0gTlVMTCkKLQllaW5mbyAoXygiJUYlUDogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci0KLSAgLyogV2UgbmV2ZXIgcHJpbnQgbW9yZSB0aGFuIGEgcmVhc29uYWJsZSBudW1iZXIgb2YgZXJyb3JzIGluIGEgcm93Ci0gICAgIGZvciBhIHNpbmdsZSBzeW1ib2wuICAqLwotICBpZiAoZXJyb3JfbmFtZSAhPSAoY2hhciAqKSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIGVycm9yX25hbWUpID09IDApCi0gICAgKytlcnJvcl9jb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yX2NvdW50ID0gMDsKLSAgICAgIGlmIChlcnJvcl9uYW1lICE9IChjaGFyICopIE5VTEwpCi0JZnJlZSAoZXJyb3JfbmFtZSk7Ci0gICAgICBlcnJvcl9uYW1lID0gYnV5c3RyaW5nIChuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfY291bnQgPCBNQVhfRVJST1JTX0lOX0FfUk9XKQotCWVpbmZvIChfKCIlWCVDOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIpLAotCSAgICAgICBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKGVycm9yX2NvdW50ID09IE1BWF9FUlJPUlNfSU5fQV9ST1cpCi0JZWluZm8gKF8oIiVEOiBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzIHRvIGAlVCcgZm9sbG93XG4iKSwKLQkgICAgICAgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGVycm9yX2NvdW50IDwgTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJVglQjogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iKSwKLQkgICAgICAgYWJmZCwgbmFtZSk7Ci0gICAgICBlbHNlIGlmIChlcnJvcl9jb3VudCA9PSBNQVhfRVJST1JTX0lOX0FfUk9XKQotCWVpbmZvIChfKCIlQjogbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBgJVQnIGZvbGxvd1xuIiksCi0JICAgICAgIGFiZmQsIG5hbWUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIG92ZXJmbG93cy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXJlbG9jX292ZXJmbG93IChpbmZvLCBuYW1lLCByZWxvY19uYW1lLCBhZGRlbmQsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnJlbG9jX25hbWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGlmIChhYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlWDogZ2VuZXJhdGVkIikpOwotICBlbHNlCi0gICAgZWluZm8gKCIlWCVDOiIsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpOwotICBlaW5mbyAoXygiIHJlbG9jYXRpb24gdHJ1bmNhdGVkIHRvIGZpdDogJXMgJVQiKSwgcmVsb2NfbmFtZSwgbmFtZSk7Ci0gIGlmIChhZGRlbmQgIT0gMCkKLSAgICBlaW5mbyAoIisldiIsIGFkZGVuZCk7Ci0gIGVpbmZvICgiXG4iKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBkYW5nZXJvdXMgcmVsb2NhdGlvbiBpcyBtYWRlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcmVsb2NfZGFuZ2Vyb3VzIChpbmZvLCBtZXNzYWdlLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICptZXNzYWdlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGlmIChhYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlWDogZ2VuZXJhdGVkIikpOwotICBlbHNlCi0gICAgZWluZm8gKCIlWCVDOiIsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpOwotICBlaW5mbyAoXygiZGFuZ2Vyb3VzIHJlbG9jYXRpb246ICVzXG4iKSwgbWVzc2FnZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2MgaXMgYmVpbmcgZ2VuZXJhdGVkIGF0dGFjaGVkIHRvIGEgc3ltYm9sCi0gICB0aGF0IGlzIG5vdCBiZWluZyBvdXRwdXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi11bmF0dGFjaGVkX3JlbG9jIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGlmIChhYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlWDogZ2VuZXJhdGVkIikpOwotICBlbHNlCi0gICAgZWluZm8gKCIlWCVDOiIsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpOwotICBlaW5mbyAoXygiIHJlbG9jIHJlZmVycyB0byBzeW1ib2wgYCVUJyB3aGljaCBpcyBub3QgYmVpbmcgb3V0cHV0XG4iKSwgbmFtZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBpZiBsaW5rX2luZm8ubm90aWNlX2FsbCBpcyBzZXQsIG9yIHdoZW4gYSBzeW1ib2wgaW4KLSAgIGxpbmtfaW5mby5ub3RpY2VfaGFzaCBpcyBmb3VuZC4gIFN5bWJvbHMgYXJlIHB1dCBpbiBub3RpY2VfaGFzaAotICAgdXNpbmcgdGhlIC15IG9wdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ub3RpY2UgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgaWYgKCEgaW5mby0+bm90aWNlX2FsbAotICAgICAgfHwgKGluZm8tPm5vdGljZV9oYXNoICE9IE5VTEwKLQkgICYmIGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+bm90aWNlX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkgIT0gTlVMTCkpCi0gICAgewotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0JZWluZm8gKCIlQjogcmVmZXJlbmNlIHRvICVzXG4iLCBhYmZkLCBuYW1lKTsKLSAgICAgIGVsc2UKLQllaW5mbyAoIiVCOiBkZWZpbml0aW9uIG9mICVzXG4iLCBhYmZkLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGNvbW1hbmRfbGluZS5jcmVmIHx8IG5vY3Jvc3NyZWZfbGlzdCAhPSBOVUxMKQotICAgIGFkZF9jcmVmIChuYW1lLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9sZC9sZG1haW4uaCBiL2xkL2xkbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFiZjNkLi4wMDAwMDAwCi0tLSBhL2xkL2xkbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogbGRtYWluLmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRE1BSU5fSAotI2RlZmluZSBMRE1BSU5fSAotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotZXh0ZXJuIGJmZCAqb3V0cHV0X2JmZDsKLWV4dGVybiBjaGFyICpkZWZhdWx0X3RhcmdldDsKLWV4dGVybiBib29sZWFuIHRyYWNlX2ZpbGVzOwotZXh0ZXJuIGJvb2xlYW4gdHJhY2VfZmlsZV90cmllczsKLWV4dGVybiBib29sZWFuIHZlcnNpb25fcHJpbnRlZDsKLWV4dGVybiBib29sZWFuIHdob2xlX2FyY2hpdmU7Ci1leHRlcm4gYm9vbGVhbiBkZW1hbmdsaW5nOwotZXh0ZXJuIGludCBnX3N3aXRjaF92YWx1ZTsKLWV4dGVybiBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2luZm8gbGlua19pbmZvOwotCi1leHRlcm4gdm9pZCBhZGRfeXN5bSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGFkZF93cmFwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgYWRkX2tlZXBzeW1zX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZG1pc2MuYyBiL2xkL2xkbWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjdkZmYxLi4wMDAwMDAwCi0tLSBhL2xkL2xkbWlzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qIGxkbWlzYy5jCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZGVmaW5lIFVTRV9TVERBUkcgMQotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZGVmaW5lIFVTRV9TVERBUkcgMAotI2VuZGlmCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLQotc3RhdGljIHZvaWQgdmZpbmZvIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSk7Ci0KLS8qCi0gJSUgbGl0ZXJhbCAlCi0gJUYgZXJyb3IgaXMgZmF0YWwKLSAlUCBwcmludCBwcm9ncmFtIG5hbWUKLSAlUyBwcmludCBzY3JpcHQgZmlsZSBhbmQgbGluZW51bWJlcgotICVFIGN1cnJlbnQgYmZkIGVycm9yIG9yIGVycm5vCi0gJUkgZmlsZW5hbWUgZnJvbSBhIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUKLSAlQiBmaWxlbmFtZSBmcm9tIGEgYmZkCi0gJVQgc3ltYm9sIG5hbWUKLSAlWCBubyBvYmplY3Qgb3V0cHV0LCBmYWlsIHJldHVybgotICVWIGhleCBiZmRfdm1hCi0gJXYgaGV4IGJmZF92bWEsIG5vIGxlYWRpbmcgemVyb3MKLSAlVyBoZXggYmZkX3ZtYSB3aXRoIDB4IHdpdGggbm8gbGVhZGluZyB6ZXJvcyB0YWtpbmcgdXAgOCBzcGFjZXMKLSAlQyBjbGV2ZXIgZmlsZW5hbWU6bGluZW51bWJlciB3aXRoIGZ1bmN0aW9uCi0gJUQgbGlrZSAlQywgYnV0IG5vIGZ1bmN0aW9uIG5hbWUKLSAlRyBsaWtlICVELCBidXQgb25seSBmdW5jdGlvbiBuYW1lCi0gJVIgaW5mbyBhYm91dCBhIHJlbGVudAotICVzIGFyYml0cmFyeSBzdHJpbmcsIGxpa2UgcHJpbnRmCi0gJWQgaW50ZWdlciwgbGlrZSBwcmludGYKLSAldSBpbnRlZ2VyLCBsaWtlIHByaW50ZgotKi8KLQotY2hhciAqCi1kZW1hbmdsZSAoc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNoYXIgKnJlczsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMCi0gICAgICAmJiBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG91dHB1dF9iZmQpID09IHN0cmluZ1swXSkKLSAgICArK3N0cmluZzsKLQotICAvKiBUaGlzIGlzIGEgaGFjayBmb3IgYmV0dGVyIGVycm9yIHJlcG9ydGluZyBvbiBYQ09GRiwgb3IgdGhlIE1TIFBFICAgKi8KLSAgLyogZm9ybWF0LiAgWGNvZmYgaGFzIGEgc2luZ2xlICcuJywgd2hpbGUgdGhlIE5UIFBFIGZvciBQUEMgaGFzICcuLicuICovCi0gIC8qIFNvIHdlIHJlbW92ZSBhbGwgb2YgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB3aGlsZShzdHJpbmdbMF0gPT0gJy4nKQotICAgICsrc3RyaW5nOwotCi0gIHJlcyA9IGNwbHVzX2RlbWFuZ2xlIChzdHJpbmcsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLSAgcmV0dXJuIHJlcyA/IHJlcyA6IHhzdHJkdXAgKHN0cmluZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi12ZmluZm8gKGZwLCBmbXQsIGFyZykKLSAgICAgRklMRSAqZnA7Ci0gICAgIGNvbnN0IGNoYXIgKmZtdDsKLSAgICAgdmFfbGlzdCBhcmc7Ci17Ci0gIGJvb2xlYW4gZmF0YWwgPSBmYWxzZTsKLQotICB3aGlsZSAoKmZtdCAhPSAnXDAnKQotICAgIHsKLSAgICAgIHdoaWxlICgqZm10ICE9ICclJyAmJiAqZm10ICE9ICdcMCcpIAotCXsKLQkgIHB1dGMgKCpmbXQsIGZwKTsKLQkgIGZtdCsrOwotCX0KLQotICAgICAgaWYgKCpmbXQgPT0gJyUnKSAKLQl7Ci0JICBmbXQgKys7Ci0JICBzd2l0Y2ggKCpmbXQrKykgCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmIChmcCwiJSUlYyIsIGZtdFstMV0pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJyUnOgotCSAgICAgIC8qIGxpdGVyYWwgJSAqLwotCSAgICAgIHB1dGMgKCclJywgZnApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1gnOgotCSAgICAgIC8qIG5vIG9iamVjdCBvdXRwdXQsIGZhaWwgcmV0dXJuICovCi0JICAgICAgY29uZmlnLm1ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1YnOgotCSAgICAgIC8qIGhleCBiZmRfdm1hICovCi0JICAgICAgewotCQliZmRfdm1hIHZhbHVlID0gdmFfYXJnIChhcmcsIGJmZF92bWEpOwotCQlmcHJpbnRmX3ZtYSAoZnAsIHZhbHVlKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAndic6Ci0JICAgICAgLyogaGV4IGJmZF92bWEsIG5vIGxlYWRpbmcgemVyb3MgKi8KLQkgICAgICB7Ci0JCWNoYXIgYnVmWzEwMF07Ci0JCWNoYXIgKnAgPSBidWY7Ci0JCWJmZF92bWEgdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7Ci0JCXNwcmludGZfdm1hIChwLCB2YWx1ZSk7Ci0JCXdoaWxlICgqcCA9PSAnMCcpCi0JCSAgcCsrOwotCQlpZiAoISpwKQotCQkgIHAtLTsKLQkJZnB1dHMgKHAsIGZwKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgLyogaGV4IGJmZF92bWEgd2l0aCAweCB3aXRoIG5vIGxlYWRpbmcgemVyb2VzIHRha2luZyB1cAotICAgICAgICAgICAgICAgICA4IHNwYWNlcy4gICovCi0JICAgICAgewotCQljaGFyIGJ1ZlsxMDBdOwotCQliZmRfdm1hIHZhbHVlOwotCQljaGFyICpwOwotCQlpbnQgbGVuOwotCi0JCXZhbHVlID0gdmFfYXJnIChhcmcsIGJmZF92bWEpOwotCQlzcHJpbnRmX3ZtYSAoYnVmLCB2YWx1ZSk7Ci0JCWZvciAocCA9IGJ1ZjsgKnAgPT0gJzAnOyArK3ApCi0JCSAgOwotCQlpZiAoKnAgPT0gJ1wwJykKLQkJICAtLXA7Ci0JCWxlbiA9IHN0cmxlbiAocCk7Ci0JCXdoaWxlIChsZW4gPCA4KQotCQkgIHsKLQkJICAgIHB1dGMgKCcgJywgZnApOwotCQkgICAgKytsZW47Ci0JCSAgfQotCQlmcHJpbnRmIChmcCwgIjB4JXMiLCBwKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVCc6Ci0JICAgICAgLyogU3ltYm9sIG5hbWUuICAqLwotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZSA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotCi0JCWlmIChuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwgfHwgKm5hbWUgPT0gMCkKLQkJICBmcHJpbnRmIChmcCwgXygibm8gc3ltYm9sIikpOwotCQllbHNlIGlmICghIGRlbWFuZ2xpbmcpCi0JCSAgZnByaW50ZiAoZnAsICIlcyIsIG5hbWUpOwotCQllbHNlCi0JCSAgewotCQkgICAgY2hhciAqZGVtYW5nbGVkOwotCi0JCSAgICBkZW1hbmdsZWQgPSBkZW1hbmdsZSAobmFtZSk7Ci0JCSAgICBmcHJpbnRmIChmcCwgIiVzIiwgZGVtYW5nbGVkKTsKLQkJICAgIGZyZWUgKGRlbWFuZ2xlZCk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdCJzoKLQkgICAgICAvKiBmaWxlbmFtZSBmcm9tIGEgYmZkICovCi0JICAgICAgeyAKLQkJYmZkICphYmZkID0gdmFfYXJnIChhcmcsIGJmZCAqKTsKLQkJaWYgKGFiZmQtPm15X2FyY2hpdmUpCi0JCSAgZnByaW50ZiAoZnAsICIlcyglcykiLCBhYmZkLT5teV9hcmNoaXZlLT5maWxlbmFtZSwKLQkJCSAgIGFiZmQtPmZpbGVuYW1lKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGZwLCAiJXMiLCBhYmZkLT5maWxlbmFtZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0YnOgotCSAgICAgIC8qIGVycm9yIGlzIGZhdGFsICovCi0JICAgICAgZmF0YWwgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1AnOgotCSAgICAgIC8qIHByaW50IHByb2dyYW0gbmFtZSAqLwotCSAgICAgIGZwcmludGYgKGZwLCAiJXMiLCBwcm9ncmFtX25hbWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0UnOgotCSAgICAgIC8qIGN1cnJlbnQgYmZkIGVycm9yIG9yIGVycm5vICovCi0JICAgICAgZnByaW50ZiAoZnAsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdJJzoKLQkgICAgICAvKiBmaWxlbmFtZSBmcm9tIGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLwotCSAgICAgIHsKLQkJbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaTsKLQotCQlpID0gdmFfYXJnIChhcmcsIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKik7Ci0JCWlmIChiZmRfbXlfYXJjaGl2ZSAoaS0+dGhlX2JmZCkgIT0gTlVMTCkKLQkJICBmcHJpbnRmIChmcCwgIiglcykiLAotCQkJICAgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGktPnRoZV9iZmQpKSk7Ci0JCWZwcmludGYgKGZwLCAiJXMiLCBpLT5sb2NhbF9zeW1fbmFtZSk7Ci0JCWlmIChiZmRfbXlfYXJjaGl2ZSAoaS0+dGhlX2JmZCkgPT0gTlVMTAotCQkgICAgJiYgc3RyY21wIChpLT5sb2NhbF9zeW1fbmFtZSwgaS0+ZmlsZW5hbWUpICE9IDApCi0JCSAgZnByaW50ZiAoZnAsICIgKCVzKSIsIGktPmZpbGVuYW1lKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgLyogcHJpbnQgc2NyaXB0IGZpbGUgYW5kIGxpbmVudW1iZXIgKi8KLQkgICAgICBpZiAocGFyc2luZ19kZWZzeW0pCi0JCWZwcmludGYgKGZwLCAiLS1kZWZzeW0gJXMiLCBsZXhfc3RyaW5nKTsKLQkgICAgICBlbHNlIGlmIChsZGZpbGVfaW5wdXRfZmlsZW5hbWUgIT0gTlVMTCkKLQkJZnByaW50ZiAoZnAsICIlczoldSIsIGxkZmlsZV9pbnB1dF9maWxlbmFtZSwgbGluZW5vKTsKLQkgICAgICBlbHNlCi0JCWZwcmludGYgKGZwLCBfKCJidWlsdCBpbiBsaW5rZXIgc2NyaXB0OiV1IiksIGxpbmVubyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUic6Ci0JICAgICAgLyogUHJpbnQgYWxsIHRoYXQncyBpbnRlcmVzdGluZyBhYm91dCBhIHJlbGVudCAqLwotCSAgICAgIHsKLQkJYXJlbGVudCAqcmVsZW50ID0gdmFfYXJnIChhcmcsIGFyZWxlbnQgKik7Ci0JCi0JCWxmaW5mbyAoZnAsICIlcysweCV2ICh0eXBlICVzKSIsCi0JCQkoKihyZWxlbnQtPnN5bV9wdHJfcHRyKSktPm5hbWUsCi0JCQlyZWxlbnQtPmFkZGVuZCwKLQkJCXJlbGVudC0+aG93dG8tPm5hbWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkKLQkgICAgY2FzZSAnQyc6Ci0JICAgIGNhc2UgJ0QnOgotCSAgICBjYXNlICdHJzoKLQkgICAgICAvKiBDbGV2ZXIgZmlsZW5hbWU6bGluZW51bWJlciB3aXRoIGZ1bmN0aW9uIG5hbWUgaWYgcG9zc2libGUsCi0JCSBvciBzZWN0aW9uIG5hbWUgYXMgYSBsYXN0IHJlc29ydC4gIFRoZSBhcmd1bWVudHMgYXJlIGEgQkZELAotCQkgYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0LiAgKi8KLQkgICAgICB7Ci0JCXN0YXRpYyBiZmQgKmxhc3RfYmZkOwotCQlzdGF0aWMgY2hhciAqbGFzdF9maWxlID0gTlVMTDsKLQkJc3RhdGljIGNoYXIgKmxhc3RfZnVuY3Rpb24gPSBOVUxMOwotCQliZmQgKmFiZmQ7Ci0JCWFzZWN0aW9uICpzZWN0aW9uOwotCQliZmRfdm1hIG9mZnNldDsKLQkJbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci0JCWFzeW1ib2wgKiphc3ltYm9sczsKLQkJY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JCWNvbnN0IGNoYXIgKmZ1bmN0aW9ubmFtZTsKLQkJdW5zaWduZWQgaW50IGxpbmVudW1iZXI7Ci0JCWJvb2xlYW4gZGlzY2FyZF9sYXN0OwotCi0JCWFiZmQgPSB2YV9hcmcgKGFyZywgYmZkICopOwotCQlzZWN0aW9uID0gdmFfYXJnIChhcmcsIGFzZWN0aW9uICopOwotCQlvZmZzZXQgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7Ci0KLQkJZW50cnkgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBhYmZkLT51c3JkYXRhOwotCQlpZiAoZW50cnkgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTAotCQkgICAgJiYgZW50cnktPmFzeW1ib2xzICE9IChhc3ltYm9sICoqKSBOVUxMKQotCQkgIGFzeW1ib2xzID0gZW50cnktPmFzeW1ib2xzOwotCQllbHNlCi0JCSAgewotCQkgICAgbG9uZyBzeW1zaXplOwotCQkgICAgbG9uZyBzeW1ib2xfY291bnQ7Ci0KLQkJICAgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0JCSAgICBpZiAoc3ltc2l6ZSA8IDApCi0JCSAgICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzXG4iKSwgYWJmZCk7Ci0JCSAgICBhc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkJICAgIHN5bWJvbF9jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBhc3ltYm9scyk7Ci0JCSAgICBpZiAoc3ltYm9sX2NvdW50IDwgMCkKLQkJICAgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHNcbiIpLCBhYmZkKTsKLQkJICAgIGlmIChlbnRyeSAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMKQotCQkgICAgICB7Ci0JCQllbnRyeS0+YXN5bWJvbHMgPSBhc3ltYm9sczsKLQkJCWVudHJ5LT5zeW1ib2xfY291bnQgPSBzeW1ib2xfY291bnQ7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJZGlzY2FyZF9sYXN0ID0gdHJ1ZTsKLQkJaWYgKGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgYXN5bWJvbHMsIG9mZnNldCwKLQkJCQkJICAgJmZpbGVuYW1lLCAmZnVuY3Rpb25uYW1lLAotCQkJCQkgICAmbGluZW51bWJlcikpCi0JCSAgewotCQkgICAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMICYmIGZtdFstMV0gPT0gJ0cnKQotCQkgICAgICB7Ci0JCQlsZmluZm8gKGZwLCAiJUI6IiwgYWJmZCk7Ci0JCQlpZiAoZmlsZW5hbWUgIT0gTlVMTAotCQkJICAgICYmIHN0cmNtcCAoZmlsZW5hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKSAhPSAwKQotCQkJICBmcHJpbnRmIChmcCwgIiVzOiIsIGZpbGVuYW1lKTsKLQkJCWxmaW5mbyAoZnAsICIlVCIsIGZ1bmN0aW9ubmFtZSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMICYmIGZtdFstMV0gPT0gJ0MnKQotCQkgICAgICB7Ci0JCQlpZiAoZmlsZW5hbWUgPT0gKGNoYXIgKikgTlVMTCkKLQkJCSAgZmlsZW5hbWUgPSBhYmZkLT5maWxlbmFtZTsKLQotCQkJaWYgKGxhc3RfYmZkID09IE5VTEwKLQkJCSAgICB8fCBsYXN0X2ZpbGUgPT0gTlVMTAotCQkJICAgIHx8IGxhc3RfZnVuY3Rpb24gPT0gTlVMTAotCQkJICAgIHx8IGxhc3RfYmZkICE9IGFiZmQKLQkJCSAgICB8fCBzdHJjbXAgKGxhc3RfZmlsZSwgZmlsZW5hbWUpICE9IDAKLQkJCSAgICB8fCBzdHJjbXAgKGxhc3RfZnVuY3Rpb24sIGZ1bmN0aW9ubmFtZSkgIT0gMCkKLQkJCSAgewotCQkJICAgIC8qIFdlIHVzZSBhYmZkLT5maWxlbmFtZSBpbiB0aGlzIGluaXRpYWwgbGluZSwKLQkJCSAgICAgICBpbiBjYXNlIGZpbGVuYW1lIGlzIGEgLmggZmlsZSBvciBzb21ldGhpbmcKLQkJCSAgICAgICBzaW1pbGFybHkgdW5oZWxwZnVsLiAgKi8KLQkJCSAgICBsZmluZm8gKGZwLCBfKCIlQjogSW4gZnVuY3Rpb24gYCVUJzpcbiIpLAotCQkJCSAgICBhYmZkLCBmdW5jdGlvbm5hbWUpOwotCi0JCQkgICAgbGFzdF9iZmQgPSBhYmZkOwotCQkJICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTCkKLQkJCSAgICAgIGZyZWUgKGxhc3RfZmlsZSk7Ci0JCQkgICAgbGFzdF9maWxlID0gYnV5c3RyaW5nIChmaWxlbmFtZSk7Ci0JCQkgICAgaWYgKGxhc3RfZnVuY3Rpb24gIT0gTlVMTCkKLQkJCSAgICAgIGZyZWUgKGxhc3RfZnVuY3Rpb24pOwotCQkJICAgIGxhc3RfZnVuY3Rpb24gPSBidXlzdHJpbmcgKGZ1bmN0aW9ubmFtZSk7Ci0JCQkgIH0KLQkJCWRpc2NhcmRfbGFzdCA9IGZhbHNlOwotCQkJaWYgKGxpbmVudW1iZXIgIT0gMCkKLQkJCSAgZnByaW50ZiAoZnAsICIlczoldSIsIGZpbGVuYW1lLCBsaW5lbnVtYmVyKTsKLQkJCWVsc2UKLQkJCSAgbGZpbmZvIChmcCwgIiVzKCVzKzB4JXYpIiwgZmlsZW5hbWUsIHNlY3Rpb24tPm5hbWUsCi0JCQkJICBvZmZzZXQpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChmaWxlbmFtZSA9PSBOVUxMCi0JCQkgICAgIHx8IHN0cmNtcCAoZmlsZW5hbWUsIGFiZmQtPmZpbGVuYW1lKSA9PSAwKQotCQkgICAgICB7Ci0JCQlsZmluZm8gKGZwLCAiJUIoJXMrMHgldikiLCBhYmZkLCBzZWN0aW9uLT5uYW1lLAotCQkJCW9mZnNldCk7Ci0JCQlpZiAobGluZW51bWJlciAhPSAwKQotCQkJICBsZmluZm8gKGZwLCAiOiV1IiwgbGluZW51bWJlcik7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGxpbmVudW1iZXIgIT0gMCkgCi0JCSAgICAgIGxmaW5mbyAoZnAsICIlQjolczoldSIsIGFiZmQsIGZpbGVuYW1lLCBsaW5lbnVtYmVyKTsKLQkJICAgIGVsc2UKLQkJICAgICAgbGZpbmZvIChmcCwgIiVCKCVzKzB4JXYpOiVzIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSwKLQkJCSAgICAgIG9mZnNldCwgZmlsZW5hbWUpOwotCQkgIH0KLQkJZWxzZQotCQkgIGxmaW5mbyAoZnAsICIlQiglcysweCV2KSIsIGFiZmQsIHNlY3Rpb24tPm5hbWUsIG9mZnNldCk7Ci0KLQkJaWYgKGRpc2NhcmRfbGFzdCkKLQkJICB7Ci0JCSAgICBsYXN0X2JmZCA9IE5VTEw7Ci0JCSAgICBpZiAobGFzdF9maWxlICE9IE5VTEwpCi0JCSAgICAgIHsKLQkJCWZyZWUgKGxhc3RfZmlsZSk7Ci0JCQlsYXN0X2ZpbGUgPSBOVUxMOwotCQkgICAgICB9Ci0JCSAgICBpZiAobGFzdF9mdW5jdGlvbiAhPSBOVUxMKQotCQkgICAgICB7Ci0JCQlmcmVlIChsYXN0X2Z1bmN0aW9uKTsKLQkJCWxhc3RfZnVuY3Rpb24gPSBOVUxMOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkJCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIC8qIGFyYml0cmFyeSBzdHJpbmcsIGxpa2UgcHJpbnRmICovCi0JICAgICAgZnByaW50ZiAoZnAsICIlcyIsIHZhX2FyZyAoYXJnLCBjaGFyICopKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdkJzoKLQkgICAgICAvKiBpbnRlZ2VyLCBsaWtlIHByaW50ZiAqLwotCSAgICAgIGZwcmludGYgKGZwLCAiJWQiLCB2YV9hcmcgKGFyZywgaW50KSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAndSc6Ci0JICAgICAgLyogdW5zaWduZWQgaW50ZWdlciwgbGlrZSBwcmludGYgKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiV1IiwgdmFfYXJnIChhcmcsIHVuc2lnbmVkIGludCkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZmF0YWwgPT0gdHJ1ZSkgCi0gICAgeGV4aXQoMSk7Ci19Ci0KLS8qIEZvcm1hdCBpbmZvIG1lc3NhZ2UgYW5kIHByaW50IG9uIHN0ZG91dC4gKi8KLQotLyogKFlvdSB3b3VsZCB0aGluayB0aGlzIHNob3VsZCBiZSBjYWxsZWQganVzdCAiaW5mbyIsIGJ1dCB0aGVuIHlvdQotICAgd291bGQgaG9zZWQgYnkgTHlueE9TLCB3aGljaCBkZWZpbmVzIHRoYXQgbmFtZSBpbiBpdHMgbGliYy4pICAqLwotCi12b2lkCi0jaWYgVVNFX1NUREFSRwotaW5mb19tc2cgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotI2Vsc2UKLWluZm9fbXNnICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmc7Ci0KLSNpZiAhIFVTRV9TVERBUkcKLSAgY29uc3QgY2hhciAqZm10OwotCi0gIHZhX3N0YXJ0IChhcmcpOwotICBmbXQgPSB2YV9hcmcgKGFyZywgY29uc3QgY2hhciAqKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmcsIGZtdCk7Ci0jZW5kaWYKLQotICB2ZmluZm8gKHN0ZG91dCwgZm10LCBhcmcpOwotICB2YV9lbmQgKGFyZyk7Ci19Ci0KLS8qICgnZScgZm9yIGVycm9yLikgRm9ybWF0IGluZm8gbWVzc2FnZSBhbmQgcHJpbnQgb24gc3RkZXJyLiAqLwotCi12b2lkCi0jaWYgVVNFX1NUREFSRwotZWluZm8gKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotI2Vsc2UKLWVpbmZvICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmc7Ci0KLSNpZiAhIFVTRV9TVERBUkcKLSAgY29uc3QgY2hhciAqZm10OwotCi0gIHZhX3N0YXJ0IChhcmcpOwotICBmbXQgPSB2YV9hcmcgKGFyZywgY29uc3QgY2hhciAqKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmcsIGZtdCk7Ci0jZW5kaWYKLQotICB2ZmluZm8gKHN0ZGVyciwgZm10LCBhcmcpOwotICB2YV9lbmQgKGFyZyk7Ci19Ci0KLXZvaWQgCi1pbmZvX2Fzc2VydCAoZmlsZSwgbGluZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci17Ci0gIGVpbmZvIChfKCIlRiVQOiBpbnRlcm5hbCBlcnJvciAlcyAlZFxuIiksIGZpbGUsIGxpbmUpOwotfQotCi1jaGFyICoKLWJ1eXN0cmluZyAoeCkKLSAgICAgQ09OU1QgY2hhciAqQ09OU1QgeDsKLXsKLSAgc2l6ZV90IGwgPSBzdHJsZW4oeCkrMTsKLSAgY2hhciAqciA9IHhtYWxsb2MobCk7Ci0gIG1lbWNweShyLCB4LGwpOwotICByZXR1cm4gcjsKLX0KLQotLyogKCdtJyBmb3IgbWFwKSBGb3JtYXQgaW5mbyBtZXNzYWdlIGFuZCBwcmludCBvbiBtYXAuICovCi0KLXZvaWQKLSNpZiBVU0VfU1REQVJHCi1taW5mbyAoY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotbWluZm8gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBjb25zdCBjaGFyICpmbXQ7Ci0gIHZhX3N0YXJ0IChhcmcpOwotICBmbXQgPSB2YV9hcmcgKGFyZywgY29uc3QgY2hhciAqKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmcsIGZtdCk7Ci0jZW5kaWYKLQotICB2ZmluZm8gKGNvbmZpZy5tYXBfZmlsZSwgZm10LCBhcmcpOwotICB2YV9lbmQgKGFyZyk7Ci19Ci0KLXZvaWQKLSNpZiBVU0VfU1REQVJHCi1sZmluZm8gKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotI2Vsc2UKLWxmaW5mbyAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnOwotCi0jaWYgISBVU0VfU1REQVJHCi0gIEZJTEUgKmZpbGU7Ci0gIGNvbnN0IGNoYXIgKmZtdDsKLQotICB2YV9zdGFydCAoYXJnKTsKLSAgZmlsZSA9IHZhX2FyZyAoYXJnLCBGSUxFICopOwotICBmbXQgPSB2YV9hcmcgKGFyZywgY29uc3QgY2hhciAqKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmcsIGZtdCk7Ci0jZW5kaWYKLQotICB2ZmluZm8gKGZpbGUsIGZtdCwgYXJnKTsKLSAgdmFfZW5kIChhcmcpOwotfQotDAotLyogRnVuY3Rpb25zIHRvIHByaW50IHRoZSBsaW5rIG1hcC4gICovCi0KLXZvaWQgCi1wcmludF9zcGFjZSAoKQotewotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICIgIik7Ci19Ci0KLXZvaWQgCi1wcmludF9ubCAoKQotewotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJcbiIpOwotfQotCi0vKiBBIG1vcmUgb3IgbGVzcyBmcmllbmRseSBhYm9ydCBtZXNzYWdlLiAgSW4gbGQuaCBhYm9ydCBpcyBkZWZpbmVkIHRvCi0gICBjYWxsIHRoaXMgZnVuY3Rpb24uICAqLwotCi12b2lkCi1sZF9hYm9ydCAoZmlsZSwgbGluZSwgZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGludCBsaW5lOwotICAgICBjb25zdCBjaGFyICpmbjsKLXsKLSAgaWYgKGZuICE9IE5VTEwpCi0gICAgZWluZm8gKF8oIiVQOiBpbnRlcm5hbCBlcnJvcjogYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIiksCi0JICAgZmlsZSwgbGluZSwgZm4pOwotICBlbHNlCi0gICAgZWluZm8gKF8oIiVQOiBpbnRlcm5hbCBlcnJvcjogYWJvcnRpbmcgYXQgJXMgbGluZSAlZFxuIiksCi0JICAgZmlsZSwgbGluZSk7Ci0gIGVpbmZvIChfKCIlUCVGOiBwbGVhc2UgcmVwb3J0IHRoaXMgYnVnXG4iKSk7Ci0gIHhleGl0ICgxKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkbWlzYy5oIGIvbGQvbGRtaXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjNiNGYuLjAwMDAwMDAKLS0tIGEvbGQvbGRtaXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBsZG1pc2MuaCAtCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERNSVNDX0gKLSNkZWZpbmUgTERNSVNDX0gKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotZXh0ZXJuIHZvaWQgZWluZm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLWV4dGVybiB2b2lkIG1pbmZvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1leHRlcm4gdm9pZCBpbmZvX21zZyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotZXh0ZXJuIHZvaWQgbGZpbmZvIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLSNlbHNlCi0vKiBWQVJBUkdTKi8KLWV4dGVybiB2b2lkIGVpbmZvICgpOwotLyogVkFSQVJHUyovCi1leHRlcm4gdm9pZCBtaW5mbyAoKTsKLS8qIFZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgaW5mb19tc2cgKCk7Ci0vKlZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgbGZpbmZvICgpOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGluZm9fYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KSk7Ci1leHRlcm4gdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIFBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIFBUUiB4cmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgeGV4aXQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gY2hhciAqYnV5c3RyaW5nIFBBUkFNUyAoKENPTlNUIGNoYXIgKkNPTlNUKSk7Ci0KLSNkZWZpbmUgQVNTRVJUKHgpIFwKLWRvIHsgaWYgKCEoeCkpIGluZm9fYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBGQUlMKCkgXAotZG8geyBpbmZvX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0gd2hpbGUgKDApCi0KLWV4dGVybiB2b2lkIHByaW50X3NwYWNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHByaW50X25sIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBjaGFyICpkZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZHZlci5jIGIvbGQvbGR2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2MDBhMi4uMDAwMDAwMAotLS0gYS9sZC9sZHZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogbGR2ZXIuYyAtLSBQcmludCBsaW5rZXIgdmVyc2lvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZHZlci5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi1jb25zdCBjaGFyICpsZF9wcm9ncmFtX3ZlcnNpb24gPSBWRVJTSU9OOwotCi12b2lkCi1sZHZlcnNpb24gKG5vaXN5KQotICAgICBpbnQgbm9pc3k7Ci17Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiR05VIGxkIHZlcnNpb24gJXMgKHdpdGggQkZEICVzKVxuIiksCi0JICAgbGRfcHJvZ3JhbV92ZXJzaW9uLCBCRkRfVkVSU0lPTik7Ci0KLSAgaWYgKG5vaXN5KSAKLSAgICB7Ci0gICAgICBsZF9lbXVsYXRpb25feGZlcl90eXBlICoqcHRyID0gbGRfZW11bGF0aW9uczsKLSAgICAKLSAgICAgIHByaW50ZiAoXygiICBTdXBwb3J0ZWQgZW11bGF0aW9uczpcbiIpKTsKLSAgICAgIHdoaWxlICgqcHRyKSAKLQl7Ci0JICBwcmludGYgKCIgICAlc1xuIiwgKCpwdHIpLT5lbXVsYXRpb25fbmFtZSk7Ci0JICBwdHIrKzsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvbGR2ZXIuaCBiL2xkL2xkdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2I2YmMuLjAwMDAwMDAKLS0tIGEvbGQvbGR2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIGxkdmVyLmggLS0gSGVhZGVyIGZpbGUgZm9yIGxkdmVyLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpsZF9wcm9ncmFtX3ZlcnNpb247Ci0KLXZvaWQgbGR2ZXJzaW9uIFBBUkFNUyAoKGludCkpOwpkaWZmIC0tZ2l0IGEvbGQvbGR3cml0ZS5jIGIvbGQvbGR3cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYxMTlhLi4wMDAwMDAwCi0tLSBhL2xkL2xkd3JpdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi0vKiBsZHdyaXRlLmMgLS0gd3JpdGUgb3V0IHRoZSBsaW5rZWQgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc2FjQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLXN0YXRpYyB2b2lkIGJ1aWxkX2xpbmtfb3JkZXIgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmNsb25lX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCBzcGxpdF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBCdWlsZCBsaW5rX29yZGVyIHN0cnVjdHVyZXMgZm9yIHRoZSBCRkQgbGlua2VyLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2xpbmtfb3JkZXIgKHN0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhdGVtZW50OwotewotICBzd2l0Y2ggKHN0YXRlbWVudC0+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+b2Zmc2V0OwotCQkgICAgfQotCQkgIGwgPSBsLT5uZXh0OwotCQl9Ci0JICAgICAgZHVtcCAoImFmdGVyIHNuaXAiLCBjdXJzb3IsIG4pOwotCSAgICAgIGN1cnNvciA9IG47Ci0JICAgICAgcmVsb2NzID0gdGhpc3JlbG9jczsKLQkgICAgICBsaW5lcyA9IHRoaXNsaW5lczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVsb2NzICs9IHRoaXNyZWxvY3M7Ci0JICAgICAgbGluZXMgKz0gdGhpc2xpbmVzOwotCSAgICB9Ci0KLQkgIGZpcnN0ID0gZmFsc2U7Ci0JfQotICAgIH0KLSAgc2FuaXR5X2NoZWNrIChhYmZkKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotbGR3cml0ZSAoKQotewotICAvKiBSZXNldCBlcnJvciBpbmRpY2F0b3IsIHdoaWNoIGNhbiB0eXBpY2FsbHkgc29tZXRoaW5nIGxpa2UgaW52YWxpZAotICAgICBmb3JtYXQgZnJvbSBvcGVubmluZyB1cCB0aGUgLm8gZmlsZXMgKi8KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGJ1aWxkX2xpbmtfb3JkZXIpOwotCi0gIGlmIChjb25maWcuc3BsaXRfYnlfcmVsb2MgfHwgY29uZmlnLnNwbGl0X2J5X2ZpbGUpCi0gICAgc3BsaXRfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBpZiAoIWJmZF9maW5hbF9saW5rIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVjb3JkZWQsIHByaW50IGl0IG91dC4gIE90aGVyd2lzZSBhc3N1bWUKLQkgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBsaWtlIHVua25vd24gc3ltYm9sIHdhcyBwcmludGVkCi0JIG91dC4gICovCi0KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19lcnJvcikKLQllaW5mbyAoXygiJUYlUDogZmluYWwgbGluayBmYWlsZWQ6ICVFXG4iKSwgb3V0cHV0X2JmZCk7Ci0gICAgICBlbHNlCi0JeGV4aXQoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvbGR3cml0ZS5oIGIvbGQvbGR3cml0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQ4YjUyLi4wMDAwMDAwCi0tLSBhL2xkL2xkd3JpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIGxkd3JpdGUuaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi12b2lkIGxkd3JpdGUgUEFSQU1TICgodm9pZCkpOwpkaWZmIC0tZ2l0IGEvbGQvbGV4c3VwLmMgYi9sZC9sZXhzdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhNjVlMS4uMDAwMDAwMAotLS0gYS9sZC9sZXhzdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDExNjcgKzAsMCBAQAotLyogUGFyc2Ugb3B0aW9ucyBmb3IgdGhlIEdOVSBsaW5rZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGR2ZXIuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLQotI2lmbmRlZiBQQVRIX1NFUEFSQVRPUgotI2lmIGRlZmluZWQgKF9fTVNET1NfXykgfHwgKGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pKQotI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAnOycKLSNlbHNlCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JwotI2VuZGlmCi0jZW5kaWYKLQotLyogU29tZXdoZXJlIGFib3ZlLCBzeXMvc3RhdC5oIGdvdCBpbmNsdWRlZCAuIC4gLiAuICovCi0jaWYgIWRlZmluZWQoU19JU0RJUikgJiYgZGVmaW5lZChTX0lGRElSKQotI2RlZmluZQlTX0lTRElSKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGRElSKQotI2VuZGlmCi0KLS8qIE9taXQgYXJncyB0byBhdm9pZCB0aGUgcG9zc2liaWxpdHkgb2YgY2xhc2hpbmcgd2l0aCBhIHN5c3RlbSBoZWFkZXIKLSAgIHRoYXQgbWlnaHQgZGlzYWdyZWUgYWJvdXQgY29uc3RzLiAgKi8KLXVuc2lnbmVkIGxvbmcgc3RydG91bCAoKTsKLQotc3RhdGljIGludCBpc19udW0gUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9kaXJsaXN0IFBBUkFNUyAoKGNoYXIgKmRpcmxpc3RfcHRyKSk7Ci1zdGF0aWMgdm9pZCBzZXRfc2VjdGlvbl9zdGFydCBQQVJBTVMgKChjaGFyICpzZWN0LCBjaGFyICp2YWxzdHIpKTsKLXN0YXRpYyB2b2lkIGhlbHAgUEFSQU1TICgodm9pZCkpOwotCi0vKiBOb24temVybyBpZiB3ZSBhcmUgcHJvY2Vzc2luZyBhIC0tZGVmc3ltIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi1pbnQgcGFyc2luZ19kZWZzeW0gPSAwOwotCi0vKiBDb2RlcyB1c2VkIGZvciB0aGUgbG9uZyBvcHRpb25zIHdpdGggbm8gc2hvcnQgc3lub255bXMuICAxNTAgaXNuJ3QKLSAgIHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9BU1NFUlQJCQkxNTAKLSNkZWZpbmUgT1BUSU9OX0NBTExfU0hBUkVECQkoT1BUSU9OX0FTU0VSVCArIDEpCi0jZGVmaW5lIE9QVElPTl9DUkVGCQkJKE9QVElPTl9DQUxMX1NIQVJFRCArIDEpCi0jZGVmaW5lIE9QVElPTl9ERUZTWU0JCQkoT1BUSU9OX0NSRUYgKyAxKQotI2RlZmluZSBPUFRJT05fREVNQU5HTEUJCQkoT1BUSU9OX0RFRlNZTSArIDEpCi0jZGVmaW5lIE9QVElPTl9EWU5BTUlDX0xJTktFUgkJKE9QVElPTl9ERU1BTkdMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9FQgkJCShPUFRJT05fRFlOQU1JQ19MSU5LRVIgKyAxKQotI2RlZmluZSBPUFRJT05fRUwJCQkoT1BUSU9OX0VCICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VNQkVEREVEX1JFTE9DUwkJKE9QVElPTl9FTCArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlRfRFlOQU1JQwkJKE9QVElPTl9FTUJFRERFRF9SRUxPQ1MgKyAxKQotI2RlZmluZSBPUFRJT05fSEVMUAkJCShPUFRJT05fRVhQT1JUX0RZTkFNSUMgKyAxKQotI2RlZmluZSBPUFRJT05fSUdOT1JFCQkJKE9QVElPTl9IRUxQICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BUAkJCShPUFRJT05fSUdOT1JFICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0RFTUFOR0xFCQkoT1BUSU9OX01BUCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19LRUVQX01FTU9SWQkJKE9QVElPTl9OT19ERU1BTkdMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19XQVJOX01JU01BVENICQkoT1BUSU9OX05PX0tFRVBfTUVNT1JZICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PSU5ISUJJVF9FWEVDCQkoT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0ggKyAxKQotI2RlZmluZSBPUFRJT05fTk9OX1NIQVJFRAkJKE9QVElPTl9OT0lOSElCSVRfRVhFQyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19XSE9MRV9BUkNISVZFCQkoT1BUSU9OX05PTl9TSEFSRUQgKyAxKQotI2RlZmluZSBPUFRJT05fT0ZPUk1BVAkJCShPUFRJT05fTk9fV0hPTEVfQVJDSElWRSArIDEpCi0jZGVmaW5lIE9QVElPTl9SRUxBWAkJCShPUFRJT05fT0ZPUk1BVCArIDEpCi0jZGVmaW5lIE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFCShPUFRJT05fUkVMQVggKyAxKQotI2RlZmluZSBPUFRJT05fUlBBVEgJCQkoT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEUgKyAxKQotI2RlZmluZSBPUFRJT05fUlBBVEhfTElOSwkJKE9QVElPTl9SUEFUSCArIDEpCi0jZGVmaW5lIE9QVElPTl9TSEFSRUQJCQkoT1BUSU9OX1JQQVRIX0xJTksgKyAxKQotI2RlZmluZSBPUFRJT05fU09OQU1FCQkJKE9QVElPTl9TSEFSRUQgKyAxKQotI2RlZmluZSBPUFRJT05fU09SVF9DT01NT04JCShPUFRJT05fU09OQU1FICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUQVRTCQkJKE9QVElPTl9TT1JUX0NPTU1PTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TWU1CT0xJQwkJCShPUFRJT05fU1RBVFMgKyAxKQotI2RlZmluZSBPUFRJT05fVEFTS19MSU5LCQkoT1BUSU9OX1NZTUJPTElDICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RCU1MJCQkoT1BUSU9OX1RBU0tfTElOSyArIDEpCi0jZGVmaW5lIE9QVElPTl9UREFUQQkJCShPUFRJT05fVEJTUyArIDEpCi0jZGVmaW5lIE9QVElPTl9UVEVYVAkJCShPUFRJT05fVERBVEEgKyAxKQotI2RlZmluZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUCShPUFRJT05fVFRFWFQgKyAxKQotI2RlZmluZSBPUFRJT05fVVIJCQkoT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVCArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJCT1NFCQkJKE9QVElPTl9VUiArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OCQkJKE9QVElPTl9WRVJCT1NFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT05fU0NSSVBUCQkoT1BUSU9OX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTl9FWFBPUlRTX1NFQ1RJT04JKE9QVElPTl9WRVJTSU9OX1NDUklQVCArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX0NPTU1PTgkJKE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SUwkoT1BUSU9OX1dBUk5fQ09NTU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fTVVMVElQTEVfR1AJCShPUFRJT05fV0FSTl9DT05TVFJVQ1RPUlMgKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9PTkNFCQkoT1BUSU9OX1dBUk5fTVVMVElQTEVfR1AgKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOCShPUFRJT05fV0FSTl9PTkNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NQTElUX0JZX1JFTE9DCQkoT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TUExJVF9CWV9GSUxFIAkgICAgCShPUFRJT05fU1BMSVRfQllfUkVMT0MgKyAxKQotI2RlZmluZSBPUFRJT05fV0hPTEVfQVJDSElWRQkJKE9QVElPTl9TUExJVF9CWV9GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dSQVAJCQkoT1BUSU9OX1dIT0xFX0FSQ0hJVkUgKyAxKQotI2RlZmluZSBPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWAkJKE9QVElPTl9XUkFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0dDX1NFQ1RJT05TCQkoT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVggKyAxKQotI2RlZmluZSBPUFRJT05fTk9fR0NfU0VDVElPTlMJCShPUFRJT05fR0NfU0VDVElPTlMgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hFQ0tfU0VDVElPTlMJCShPUFRJT05fTk9fR0NfU0VDVElPTlMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fQ0hFQ0tfU0VDVElPTlMJKE9QVElPTl9DSEVDS19TRUNUSU9OUyArIDEpCi0jZGVmaW5lIE9QVElPTl9NUEM4NjBDMCAgICAgICAgICAgICAgICAgKE9QVElPTl9OT19DSEVDS19TRUNUSU9OUyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19VTkRFRklORUQJCShPUFRJT05fTVBDODYwQzAgKyAxKQotI2RlZmluZSBPUFRJT05fSU5JVCAgICAgICAgICAgICAgICAgICAgIChPUFRJT05fTk9fVU5ERUZJTkVEICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZJTkkgICAgICAgICAgICAgICAgICAgICAoT1BUSU9OX0lOSVQgKyAxKQotCi0vKiBUaGUgbG9uZyBvcHRpb25zLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYm90aCB0aGUgb3B0aW9uCi0gICBwYXJzaW5nIGFuZCB0aGUgaGVscCB0ZXh0LiAgKi8KLQotc3RydWN0IGxkX29wdGlvbgotewotICAvKiBUaGUgbG9uZyBvcHRpb24gaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3Qgb3B0aW9uIG9wdDsKLSAgLyogVGhlIHNob3J0IG9wdGlvbiB3aXRoIHRoZSBzYW1lIG1lYW5pbmcgKCdcMCcgaWYgbm9uZSkuICAqLwotICBjaGFyIHNob3J0b3B0OwotICAvKiBUaGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgKE5VTEwgaWYgbm9uZSkuICAqLwotICBjb25zdCBjaGFyICphcmc7Ci0gIC8qIFRoZSBkb2N1bWVudGF0aW9uIHN0cmluZy4gIElmIHRoaXMgaXMgTlVMTCwgdGhpcyBpcyBhIHN5bm9ueW0gZm9yCi0gICAgIHRoZSBwcmV2aW91cyBvcHRpb24uICAqLwotICBjb25zdCBjaGFyICpkb2M7Ci0gIGVudW0KLSAgICB7Ci0gICAgICAvKiBVc2Ugb25lIGRhc2ggYmVmb3JlIGxvbmcgb3B0aW9uIG5hbWUuICAqLwotICAgICAgT05FX0RBU0gsCi0gICAgICAvKiBVc2UgdHdvIGRhc2hlcyBiZWZvcmUgbG9uZyBvcHRpb24gbmFtZS4gICovCi0gICAgICBUV09fREFTSEVTLAotICAgICAgLyogRG9uJ3QgbWVudGlvbiB0aGlzIG9wdGlvbiBpbiAtLWhlbHAgb3V0cHV0LiAgKi8KLSAgICAgIE5PX0hFTFAKLSAgICB9IGNvbnRyb2w7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGxkX29wdGlvbiBsZF9vcHRpb25zW10gPQotewotICB7IHtOVUxMLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnYScsIE5fKCJLRVlXT1JEIiksIE5fKCJTaGFyZWQgbGlicmFyeSBjb250cm9sIGZvciBIUC9VWCBjb21wYXRpYmlsaXR5IiksCi0gICAgICBPTkVfREFTSCB9LAotICB7IHsiYXJjaGl0ZWN0dXJlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdBJ30sCi0gICAgICAnQScsIE5fKCJBUkNIIiksIE5fKCJTZXQgYXJjaGl0ZWN0dXJlIikgLCBUV09fREFTSEVTIH0sCi0gIHsgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKLSAgICAgICdiJywgTl8oIlRBUkdFVCIpLCBOXygiU3BlY2lmeSB0YXJnZXQgZm9yIGZvbGxvd2luZyBpbnB1dCBmaWxlcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJtcmktc2NyaXB0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdjJ30sCi0gICAgICAnYycsIE5fKCJGSUxFIiksIE5fKCJSZWFkIE1SSSBmb3JtYXQgbGlua2VyIHNjcmlwdCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAotICAgICAgJ2QnLCBOVUxMLCBOXygiRm9yY2UgY29tbW9uIHN5bWJvbHMgdG8gYmUgZGVmaW5lZCIpLCBPTkVfREFTSCB9LAotICB7IHsiZHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2QnfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJlbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICAgICAgJ2UnLCBOXygiQUREUkVTUyIpLCBOXygiU2V0IHN0YXJ0IGFkZHJlc3MiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZXhwb3J0LWR5bmFtaWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9EWU5BTUlDfSwKLSAgICAgICdFJywgTlVMTCwgTl8oIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FQn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiTGluayBiaWctZW5kaWFuIG9iamVjdHMiKSwgT05FX0RBU0ggfSwKLSAgeyB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiTGluayBsaXR0bGUtZW5kaWFuIG9iamVjdHMiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImF1eGlsaWFyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICAgICAgJ2YnLCBOXygiU0hMSUIiKSwgTl8oIkF1eGlsaWFyeSBmaWx0ZXIgZm9yIHNoYXJlZCBvYmplY3Qgc3ltYm9sIHRhYmxlIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJmaWx0ZXIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0YnfSwKLSAgICAgICdGJywgTl8oIlNITElCIiksIE5fKCJGaWx0ZXIgZm9yIHNoYXJlZCBvYmplY3Qgc3ltYm9sIHRhYmxlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ2cnLCBOVUxMLCBOXygiSWdub3JlZCIpLCBPTkVfREFTSCB9LAotICB7IHsiZ3BzaXplIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdHJ30sCi0gICAgICAnRycsIE5fKCJTSVpFIiksIE5fKCJTbWFsbCBkYXRhIHNpemUgKGlmIG5vIHNpemUsIHNhbWUgYXMgLS1zaGFyZWQpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJzb25hbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPTkFNRX0sCi0gICAgICAnaCcsIE5fKCJGSUxFTkFNRSIpLCBOXygiU2V0IGludGVybmFsIG5hbWUgb2Ygc2hhcmVkIGxpYnJhcnkiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImxpYnJhcnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2wnfSwKLSAgICAgICdsJywgTl8oIkxJQk5BTUUiKSwgTl8oIlNlYXJjaCBmb3IgbGlicmFyeSBMSUJOQU1FIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImxpYnJhcnktcGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnTCd9LAotICAgICAgJ0wnLCBOXygiRElSRUNUT1JZIiksIE5fKCJBZGQgRElSRUNUT1JZIHRvIGxpYnJhcnkgc2VhcmNoIHBhdGgiKSwgVFdPX0RBU0hFUyB9LAotICB7IHtOVUxMLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnbScsIE5fKCJFTVVMQVRJT04iKSwgTl8oIlNldCBlbXVsYXRpb24iKSwgT05FX0RBU0ggfSwKLSAgeyB7InByaW50LW1hcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTSd9LAotICAgICAgJ00nLCBOVUxMLCBOXygiUHJpbnQgbWFwIGZpbGUgb24gc3RhbmRhcmQgb3V0cHV0IiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5tYWdpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbid9LAotICAgICAgJ24nLCBOVUxMLCBOXygiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJvbWFnaWMiLCBub19hcmd1bWVudCwgTlVMTCwgJ04nfSwKLSAgICAgICdOJywgTlVMTCwgTl8oIkRvIG5vdCBwYWdlIGFsaWduIGRhdGEsIGRvIG5vdCBtYWtlIHRleHQgcmVhZG9ubHkiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Im91dHB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbyd9LAotICAgICAgJ28nLCBOXygiRklMRSIpLCBOXygiU2V0IG91dHB1dCBmaWxlIG5hbWUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHtOVUxMLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnTycsIE5VTEwsIE5fKCJPcHRpbWl6ZSBvdXRwdXQgZmlsZSIpLCBPTkVfREFTSCB9LAotICB7IHsiUXkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiSWdub3JlZCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJyZWxvY2F0ZWFibGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ3InfSwKLSAgICAgICdyJywgTlVMTCwgTl8oIkdlbmVyYXRlIHJlbG9jYXRlYWJsZSBvdXRwdXQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnaScsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJqdXN0LXN5bWJvbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1InfSwKLSAgICAgICdSJywgTl8oIkZJTEUiKSwgTl8oIkp1c3QgbGluayBzeW1ib2xzIChpZiBkaXJlY3RvcnksIHNhbWUgYXMgLS1ycGF0aCkiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7InN0cmlwLWFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncyd9LAotICAgICAgJ3MnLCBOVUxMLCBOXygiU3RyaXAgYWxsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic3RyaXAtZGVidWciLCBub19hcmd1bWVudCwgTlVMTCwgJ1MnfSwKLSAgICAgICdTJywgTlVMTCwgTl8oIlN0cmlwIGRlYnVnZ2luZyBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InRyYWNlIiwgbm9fYXJndW1lbnQsIE5VTEwsICd0J30sCi0gICAgICAndCcsIE5VTEwsIE5fKCJUcmFjZSBmaWxlIG9wZW5zIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InNjcmlwdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnVCd9LAotICAgICAgJ1QnLCBOXygiRklMRSIpLCBOXygiUmVhZCBsaW5rZXIgc2NyaXB0IiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InVuZGVmaW5lZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAndSd9LAotICAgICAgJ3UnLCBOXygiU1lNQk9MIiksIE5fKCJTdGFydCB3aXRoIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gU1lNQk9MIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7IlVyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9VUn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiQnVpbGQgZ2xvYmFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdGFibGVzIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJTSU9OfSwKLSAgICAgICd2JywgTlVMTCwgTl8oIlByaW50IHZlcnNpb24gaW5mb3JtYXRpb24iKSwgVFdPX0RBU0hFUyB9LAotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnVicsIE5VTEwsIE5fKCJQcmludCB2ZXJzaW9uIGFuZCBlbXVsYXRpb24gaW5mb3JtYXRpb24iKSwgT05FX0RBU0ggfSwKLSAgeyB7ImRpc2NhcmQtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICd4J30sCi0gICAgICAneCcsIE5VTEwsIE5fKCJEaXNjYXJkIGFsbCBsb2NhbCBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRpc2NhcmQtbG9jYWxzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdYJ30sCi0gICAgICAnWCcsIE5VTEwsIE5fKCJEaXNjYXJkIHRlbXBvcmFyeSBsb2NhbCBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InRyYWNlLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAneSd9LAotICAgICAgJ3knLCBOXygiU1lNQk9MIiksIE5fKCJUcmFjZSBtZW50aW9ucyBvZiBTWU1CT0wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHtOVUxMLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnWScsIE5fKCJQQVRIIiksIE5fKCJEZWZhdWx0IHNlYXJjaCBwYXRoIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ3onLCBOXygiS0VZV09SRCIpLCBOXygiSWdub3JlZCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJzdGFydC1ncm91cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnKCd9LAotICAgICAgJygnLCBOVUxMLCBOXygiU3RhcnQgYSBncm91cCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJlbmQtZ3JvdXAiLCBub19hcmd1bWVudCwgTlVMTCwgJyknfSwKLSAgICAgICcpJywgTlVMTCwgTl8oIkVuZCBhIGdyb3VwIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImFzc2VydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVNTRVJUfSwKLSAgICAgICdcMCcsIE5fKCJLRVlXT1JEIiksIE5fKCJJZ25vcmVkIGZvciBTdW5PUyBjb21wYXRpYmlsaXR5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJCZHluYW1pYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0FMTF9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJkeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0FMTF9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7ImNhbGxfc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsiQnN0YXRpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9OX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJkbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9OX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsibm9uX3NoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9OX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsic3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJCc3ltYm9saWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NZTUJPTElDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJCaW5kIGdsb2JhbCByZWZlcmVuY2VzIGxvY2FsbHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImNoZWNrLXNlY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DSEVDS19TRUNUSU9OU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiQ2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG92ZXJsYXBzIChkZWZhdWx0KSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1jaGVjay1zZWN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fQ0hFQ0tfU0VDVElPTlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvIG5vdCBjaGVjayBzZWN0aW9uIGFkZHJlc3NlcyBmb3Igb3ZlcmxhcHMiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7ImNyZWYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NSRUZ9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIk91dHB1dCBjcm9zcyByZWZlcmVuY2UgdGFibGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZGVmc3ltIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUZTWU19LAotICAgICAgJ1wwJywgTl8oIlNZTUJPTD1FWFBSRVNTSU9OIiksIE5fKCJEZWZpbmUgYSBzeW1ib2wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFTUFOR0xFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEZW1hbmdsZSBzeW1ib2wgbmFtZXMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZHluYW1pYy1saW5rZXIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RZTkFNSUNfTElOS0VSfSwKLSAgICAgICdcMCcsIE5fKCJQUk9HUkFNIiksIE5fKCJTZXQgdGhlIGR5bmFtaWMgbGlua2VyIHRvIHVzZSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJlbWJlZGRlZC1yZWxvY3MiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VNQkVEREVEX1JFTE9DU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiR2VuZXJhdGUgZW1iZWRkZWQgcmVsb2NzIiksIFRXT19EQVNIRVN9LAotICB7IHsiZmluaSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRklOSX0sCi0gICAgICdcMCcsIE5fKCJTWU1CT0wiKSwgTl8oIkNhbGwgU1lNQk9MIGF0IHVubG9hZC10aW1lIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJmb3JjZS1leGUtc3VmZml4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJGb3JjZSBnZW5lcmF0aW9uIG9mIGZpbGUgd2l0aCAuZXhlIHN1ZmZpeCIpLCBUV09fREFTSEVTfSwKLSAgeyB7ImdjLXNlY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9HQ19TRUNUSU9OU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiUmVtb3ZlIHVudXNlZCBzZWN0aW9ucyAob24gc29tZSB0YXJnZXRzKSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsibm8tZ2Mtc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0dDX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zIChkZWZhdWx0KSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVMUH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiUHJpbnQgb3B0aW9uIGhlbHAiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiaW5pdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU5JVH0sCi0gICAgICdcMCcsIE5fKCJTWU1CT0wiKSwgTl8oIkNhbGwgU1lNQk9MIGF0IGxvYWQtdGltZSIpLCBPTkVfREFTSCB9LAotICB7IHsiTWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVB9LAotICAgICAgJ1wwJywgTl8oIkZJTEUiKSwgTl8oIldyaXRlIGEgbWFwIGZpbGUiKSwgT05FX0RBU0ggfSwKLSAgeyB7Im5vLWRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERU1BTkdMRSB9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvIG5vdCBkZW1hbmdsZSBzeW1ib2wgbmFtZXMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm8ta2VlcC1tZW1vcnkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0tFRVBfTUVNT1JZfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJVc2UgbGVzcyBtZW1vcnkgYW5kIG1vcmUgZGlzayBJL08iKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm8tdW5kZWZpbmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19VTkRFRklORUR9LAotICAgICAnXDAnLCBOVUxMLCBOXygiQWxsb3cgbm8gdW5kZWZpbmVkIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm8td2Fybi1taXNtYXRjaCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fV0FSTl9NSVNNQVRDSH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG9uJ3Qgd2FybiBhYm91dCBtaXNtYXRjaGVkIGlucHV0IGZpbGVzIiksIFRXT19EQVNIRVN9LAotICB7IHsibm8td2hvbGUtYXJjaGl2ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fV0hPTEVfQVJDSElWRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiVHVybiBvZmYgLS13aG9sZS1hcmNoaXZlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vaW5oaWJpdC1leGVjIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0lOSElCSVRfRVhFQ30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGV2ZW4gaWYgZXJyb3JzIG9jY3VyIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vaW5oaWJpdF9leGVjIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0lOSElCSVRfRVhFQ30sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBOT19IRUxQIH0sCi0gIHsgeyJvZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PRk9STUFUfSwKLSAgICAgICdcMCcsIE5fKCJUQVJHRVQiKSwgTl8oIlNwZWNpZnkgdGFyZ2V0IG9mIG91dHB1dCBmaWxlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InFtYWdpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJJZ25vcmVkIGZvciBMaW51eCBjb21wYXRpYmlsaXR5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVh9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlJlbGF4IGJyYW5jaGVzIG9uIGNlcnRhaW4gdGFyZ2V0cyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJyZXRhaW4tc3ltYm9scy1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsCi0gICAgICAgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEV9LAotICAgICAgJ1wwJywgTl8oIkZJTEUiKSwgTl8oIktlZXAgb25seSBzeW1ib2xzIGxpc3RlZCBpbiBGSUxFIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SUEFUSH0sCi0gICAgICAnXDAnLCBOXygiUEFUSCIpLCBOXygiU2V0IHJ1bnRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiKSwgT05FX0RBU0ggfSwKLSAgeyB7InJwYXRoLWxpbmsiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JQQVRIX0xJTkt9LAotICAgICAgJ1wwJywgTl8oIlBBVEgiKSwgTl8oIlNldCBsaW5rIHRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiKSwgT05FX0RBU0ggfSwKLSAgeyB7InNoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJDcmVhdGUgYSBzaGFyZWQgbGlicmFyeSIpLCBPTkVfREFTSCB9LAotICB7IHsiQnNoYXJlYWJsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0hBUkVEIH0sIC8qIEZyZWVCU0QuICAqLwotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7InNvcnQtY29tbW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TT1JUX0NPTU1PTn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiU29ydCBjb21tb24gc3ltYm9scyBieSBzaXplIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InNvcnRfY29tbW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TT1JUX0NPTU1PTn0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBOT19IRUxQIH0sCi0gIHsgeyJzcGxpdC1ieS1maWxlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUExJVF9CWV9GSUxFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJTcGxpdCBvdXRwdXQgc2VjdGlvbnMgZm9yIGVhY2ggZmlsZSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJzcGxpdC1ieS1yZWxvYyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1BMSVRfQllfUkVMT0N9LAotICAgICAgJ1wwJywgTl8oIkNPVU5UIiksIE5fKCJTcGxpdCBvdXRwdXQgc2VjdGlvbnMgZXZlcnkgQ09VTlQgcmVsb2NzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InN0YXRzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFUU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiUHJpbnQgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidGFzay1saW5rIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UQVNLX0xJTkt9LAotICAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiRG8gdGFzayBsZXZlbCBsaW5raW5nIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InRyYWRpdGlvbmFsLWZvcm1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJVc2Ugc2FtZSBmb3JtYXQgYXMgbmF0aXZlIGxpbmtlciIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJUYnNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UQlNTfSwKLSAgICAgICdcMCcsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgYWRkcmVzcyBvZiAuYnNzIHNlY3Rpb24iKSwgT05FX0RBU0ggfSwKLSAgeyB7IlRkYXRhIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UREFUQX0sCi0gICAgICAnXDAnLCBOXygiQUREUkVTUyIpLCBOXygiU2V0IGFkZHJlc3Mgb2YgLmRhdGEgc2VjdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsiVHRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RURVhUfSwKLSAgICAgICdcMCcsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgYWRkcmVzcyBvZiAudGV4dCBzZWN0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJCT1NFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJPdXRwdXQgbG90cyBvZiBpbmZvcm1hdGlvbiBkdXJpbmcgbGluayIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkbGwtdmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSQk9TRX0sIC8qIExpbnV4LiAgKi8KLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7InZlcnNpb24tc2NyaXB0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJTSU9OX1NDUklQVCB9LAotICAgICAgJ1wwJywgTl8oIkZJTEUiKSwgTl8oIlJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBzY3JpcHQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidmVyc2lvbi1leHBvcnRzLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwKLSAgICAgT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OIH0sCi0gICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiVGFrZSBleHBvcnQgc3ltYm9scyBsaXN0IGZyb20gLmV4cG9ydHMsIHVzaW5nXG5cdFx0XHRcdFNZTUJPTCBhcyB0aGUgdmVyc2lvbi4iKSwKLSAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJ3YXJuLWNvbW1vbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9DT01NT059LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gYWJvdXQgZHVwbGljYXRlIGNvbW1vbiBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tY29uc3RydWN0b3JzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBpZiBnbG9iYWwgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIGFyZSBzZWVuIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJ3YXJuLW11bHRpcGxlLWdwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX01VTFRJUExFX0dQfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGlmIHRoZSBtdWx0aXBsZSBHUCB2YWx1ZXMgYXJlIHVzZWQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1vbmNlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX09OQ0V9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gb25seSBvbmNlIHBlciB1bmRlZmluZWQgc3ltYm9sIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tc2VjdGlvbi1hbGlnbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGlmIHN0YXJ0IG9mIHNlY3Rpb24gY2hhbmdlcyBkdWUgdG8gYWxpZ25tZW50IiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJ3aG9sZS1hcmNoaXZlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XSE9MRV9BUkNISVZFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJJbmNsdWRlIGFsbCBvYmplY3RzIGZyb20gZm9sbG93aW5nIGFyY2hpdmVzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7IndyYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dSQVB9LAotICAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiVXNlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBTWU1CT0wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibXBjODYwYzAiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01QQzg2MEMwfSwKLSAgICAgICdcMCcsIE5fKCJbPVdPUkRTXSIpLCBOXygiTW9kaWZ5IHByb2JsZW1hdGljIGJyYW5jaGVzIGluIGxhc3QgV09SRFMgKDEtMTAsXG5cdFx0XHRcdGRlZmF1bHQgNSkgd29yZHMgb2YgYSBwYWdlIiksIFRXT19EQVNIRVMgfQotfTsKLQotI2RlZmluZSBPUFRJT05fQ09VTlQgKChpbnQpIChzaXplb2YgbGRfb3B0aW9ucyAvIHNpemVvZiBsZF9vcHRpb25zWzBdKSkKLQotLyogVGVzdCBTVFJJTkcgZm9yIGNvbnRhaW5pbmcgYSBzdHJpbmcgb2YgZGlnaXRzIHRoYXQgZm9ybSBhIG51bWJlcgotICAgYmV0d2VlbiBNSU4gYW5kIE1BWC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvciBFUlIuICAqLwotCi1zdGF0aWMgaW50Ci1pc19udW0gKHN0cmluZywgbWluLCBtYXgsIGVycikKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBpbnQgbWluOwotICAgICBpbnQgbWF4OwotICAgICBpbnQgZXJyOwotewotICBpbnQgcmVzdWx0ID0gMDsKLQotICBmb3IgKDsgKnN0cmluZzsgKytzdHJpbmcpCi0gICAgewotICAgICAgaWYgKCEgaXNkaWdpdCAoKnN0cmluZykpCi0JewotCSAgcmVzdWx0ID0gZXJyOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyAoKnN0cmluZyAtICcwJyk7Ci0gICAgfQotICBpZiAocmVzdWx0IDwgbWluIHx8IHJlc3VsdCA+IG1heCkKLSAgICByZXN1bHQgPSBlcnI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZAotcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgaSwgaXMsIGlsOwotICBpbnQgaW5ncm91cCA9IDA7Ci0gIGNoYXIgKmRlZmF1bHRfZGlybGlzdCA9IE5VTEw7Ci0gIGNoYXIgc2hvcnRvcHRzW09QVElPTl9DT1VOVCAqIDMgKyAyXTsKLSAgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tPUFRJT05fQ09VTlQgKyAxXTsKLSAgaW50IGxhc3Rfb3B0aW5kOwotCi0gIC8qIFN0YXJ0aW5nIHRoZSBzaG9ydCBvcHRpb24gc3RyaW5nIHdpdGggJy0nIGlzIGZvciBwcm9ncmFtcyB0aGF0Ci0gICAgIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0Ci0gICAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAotICAgICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLiAgKi8KLSAgc2hvcnRvcHRzWzBdID0gJy0nOwotICBpcyA9IDE7Ci0gIGlsID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE9QVElPTl9DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChsZF9vcHRpb25zW2ldLnNob3J0b3B0ICE9ICdcMCcpCi0JewotCSAgc2hvcnRvcHRzW2lzXSA9IGxkX29wdGlvbnNbaV0uc2hvcnRvcHQ7Ci0JICArK2lzOwotCSAgaWYgKGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gcmVxdWlyZWRfYXJndW1lbnQKLQkgICAgICB8fCBsZF9vcHRpb25zW2ldLm9wdC5oYXNfYXJnID09IG9wdGlvbmFsX2FyZ3VtZW50KQotCSAgICB7Ci0JICAgICAgc2hvcnRvcHRzW2lzXSA9ICc6JzsKLQkgICAgICArK2lzOwotCSAgICAgIGlmIChsZF9vcHRpb25zW2ldLm9wdC5oYXNfYXJnID09IG9wdGlvbmFsX2FyZ3VtZW50KQotCQl7Ci0JCSAgc2hvcnRvcHRzW2lzXSA9ICc6JzsKLQkJICArK2lzOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAobGRfb3B0aW9uc1tpXS5vcHQubmFtZSAhPSBOVUxMKQotCXsKLQkgIGxvbmdvcHRzW2lsXSA9IGxkX29wdGlvbnNbaV0ub3B0OwotCSAgKytpbDsKLQl9Ci0gICAgfQotICBzaG9ydG9wdHNbaXNdID0gJ1wwJzsKLSAgbG9uZ29wdHNbaWxdLm5hbWUgPSBOVUxMOwotCi0gIC8qIFRoZSAtRyBvcHRpb24gaXMgYW1iaWd1b3VzIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMuICBTb21ldGltZXMgaXQKLSAgICAgc3BlY2lmaWVzIHRoZSBsYXJnZXN0IGRhdGEgc2l6ZSB0byBwdXQgaW50byB0aGUgc21hbGwgZGF0YQotICAgICBzZWN0aW9uLiAgU29tZXRpbWVzIGl0IGlzIGVxdWl2YWxlbnQgdG8gLS1zaGFyZWQuICBVbmZvcnR1bmF0ZWx5LAotICAgICB0aGUgZmlyc3QgZm9ybSB0YWtlcyBhbiBhcmd1bWVudCwgd2hpbGUgdGhlIHNlY29uZCBkb2VzIG5vdC4KLQotICAgICBXZSBuZWVkIHRvIHBlcm1pdCB0aGUgLS1zaGFyZWQgZm9ybSBiZWNhdXNlIG9uIHNvbWUgcGxhdGZvcm1zLAotICAgICBzdWNoIGFzIFNvbGFyaXMsIGdjYyAtc2hhcmVkIHdpbGwgcGFzcyAtRyB0byB0aGUgbGlua2VyLgotCi0gICAgIFRvIHBlcm1pdCBlaXRoZXIgdXNhZ2UsIHdlIGxvb2sgdGhyb3VnaCB0aGUgYXJndW1lbnQgbGlzdC4gIElmIHdlCi0gICAgIGZpbmQgLUcgbm90IGZvbGxvd2VkIGJ5IGEgbnVtYmVyLCB3ZSBjaGFuZ2UgaXQgaW50byAtLXNoYXJlZC4KLSAgICAgVGhpcyB3aWxsIHdvcmsgZm9yIG1vc3Qgbm9ybWFsIGNhc2VzLiAgKi8KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICBpZiAoc3RyY21wIChhcmd2W2ldLCAiLUciKSA9PSAwCi0JJiYgKGkgKyAxID49IGFyZ2MKLQkgICAgfHwgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYXJndltpICsgMV1bMF0pKSkKLSAgICAgIGFyZ3ZbaV0gPSAoY2hhciAqKSAiLS1zaGFyZWQiOwotCi0gIC8qIEJlY2F1c2Ugd2UgcGVybWl0IGxvbmcgb3B0aW9ucyB0byBzdGFydCB3aXRoIGEgc2luZ2xlIGRhc2gsIGFuZAotICAgICB3ZSBoYXZlIGEgLS1saWJyYXJ5IG9wdGlvbiwgYW5kIHRoZSAtbCBvcHRpb24gaXMgY29udmVudGlvbmFsbHkKLSAgICAgdXNlZCB3aXRoIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhcmd1bWVudCwgd2UgY2FuIGhhdmUgYmFkCi0gICAgIHJlc3VsdHMgaWYgc29tZWJvZHkgdHJpZXMgdG8gdXNlIC1sIHdpdGggYSBsaWJyYXJ5IHdob3NlIG5hbWUKLSAgICAgaGFwcGVucyB0byBzdGFydCB3aXRoICJpYnJhcnkiLCBhcyBpbiAtbGkuICBXZSBhdm9pZCBwcm9ibGVtcyBieQotICAgICBzaW1wbHkgdHVybmluZyAtbCBpbnRvIC0tbGlicmFyeS4gIFRoaXMgbWVhbnMgdGhhdCB1c2VycyB3aWxsCi0gICAgIGhhdmUgdG8gdXNlIHR3byBkYXNoZXMgaW4gb3JkZXIgdG8gdXNlIC0tbGlicmFyeSwgd2hpY2ggaXMgT0sKLSAgICAgc2luY2UgdGhhdCdzIGhvdyBpdCBpcyBkb2N1bWVudGVkLgotCi0gICAgIEZJWE1FOiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBwcm9ibGVtIGNhbiBhcmlzZSBmb3Igb3RoZXIgc2hvcnQKLSAgICAgb3B0aW9ucyBhcyB3ZWxsLCBhbHRob3VnaCB0aGUgdXNlciBkb2VzIGFsd2F5cyBoYXZlIHRoZSByZWNvdXJzZQotICAgICBvZiBhZGRpbmcgYSBzcGFjZSBiZXR3ZWVuIHRoZSBvcHRpb24gYW5kIHRoZSBhcmd1bWVudC4gICovCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgewotICAgICAgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nCi0JICAmJiBhcmd2W2ldWzFdID09ICdsJwotCSAgJiYgYXJndltpXVsyXSAhPSAnXDAnKQotCXsKLQkgIGNoYXIgKm47Ci0KLQkgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGFyZ3ZbaV0pICsgMjApOwotCSAgc3ByaW50ZiAobiwgIi0tbGlicmFyeT0lcyIsIGFyZ3ZbaV0gKyAyKTsKLQkgIGFyZ3ZbaV0gPSBuOwotCX0KLSAgICB9Ci0KLSAgbGFzdF9vcHRpbmQgPSAtMTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IGxvbmdpbmQ7Ci0gICAgICBpbnQgb3B0YzsKLQotICAgICAgLyogVXNpbmcgbGFzdF9vcHRpbmQgbGV0cyB1cyBhdm9pZCBjYWxsaW5nIGxkZW11bF9wYXJzZV9hcmdzCi0JIG11bHRpcGxlIHRpbWVzIG9uIGEgc2luZ2xlIG9wdGlvbiwgd2hpY2ggd291bGQgbGVhZCB0bwotCSBjb25mdXNpb24gaW4gdGhlIGludGVybmFsIHN0YXRpYyB2YXJpYWJsZXMgbWFpbnRhaW5lZCBieQotCSBnZXRvcHQuICBUaGlzIGNvdWxkIG90aGVyd2lzZSBoYXBwZW4gZm9yIGFuIGFyZ3VtZW50IGxpa2UKLQkgLW54LCBpbiB3aGljaCB0aGUgLW4gaXMgcGFyc2VkIGFzIGEgc2luZ2xlIG9wdGlvbiwgYW5kIHdlCi0JIGxvb3AgYXJvdW5kIHRvIHBpY2sgdXAgdGhlIC14LiAgKi8KLSAgICAgIGlmIChvcHRpbmQgIT0gbGFzdF9vcHRpbmQpCi0JewotCSAgaWYgKGxkZW11bF9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KSkKLQkgICAgY29udGludWU7Ci0JICBsYXN0X29wdGluZCA9IG9wdGluZDsKLQl9Ci0KLSAgICAgIC8qIGdldG9wdF9sb25nX29ubHkgaXMgbGlrZSBnZXRvcHRfbG9uZywgYnV0ICctJyBhcyB3ZWxsIGFzICctLScKLQkgY2FuIGluZGljYXRlIGEgbG9uZyBvcHRpb24uICAqLwotICAgICAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsIHNob3J0b3B0cywgbG9uZ29wdHMsICZsb25naW5kKTsKLQotICAgICAgaWYgKG9wdGMgPT0gLTEpCi0JYnJlYWs7Ci0gICAgICBzd2l0Y2ggKG9wdGMpCi0JewotCWRlZmF1bHQ6Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgIF8oIiVzOiB1c2UgdGhlIC0taGVscCBvcHRpb24gZm9yIHVzYWdlIGluZm9ybWF0aW9uXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lKTsKLQkgIHhleGl0ICgxKTsKLQljYXNlIDE6CQkJLyogRmlsZSBuYW1lLiAgKi8KLQkgIGxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSUdOT1JFOgotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICAvKiBGb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gIEFjdHVhbGx5IC1hIHNoYXJlZCBzaG91bGQgbWVhbgotICAgICAgICAgICAgIGBgdXNlIG9ubHkgc2hhcmVkIGxpYnJhcmllcycnIGJ1dCwgdGhlbiwgd2UgZG9uJ3QKLSAgICAgICAgICAgICBjdXJyZW50bHkgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIEhQL1VYIGFueWhvdy4gICovCi0JICBpZiAoc3RyY21wIChvcHRhcmcsICJhcmNoaXZlIikgPT0gMCkKLQkgICAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJzaGFyZWQiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAob3B0YXJnLCAiZGVmYXVsdCIpID09IDApCi0JICAgIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogdW5yZWNvZ25pemVkIC1hIG9wdGlvbiBgJXMnXG4iKSwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0FTU0VSVDoKLQkgIC8qIEZJWE1FOiBXZSBqdXN0IGlnbm9yZSB0aGVzZSwgYnV0IHdlIHNob3VsZCBoYW5kbGUgdGhlbS4gICovCi0JICBpZiAoc3RyY21wIChvcHRhcmcsICJkZWZpbml0aW9ucyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibm9kZWZpbml0aW9ucyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibm9zeW1ib2xpYyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAicHVyZS10ZXh0IikgPT0gMCkKLQkgICAgOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogdW5yZWNvZ25pemVkIC1hc3NlcnQgb3B0aW9uIGAlcydcbiIpLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBsZGZpbGVfYWRkX2FyY2ggKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIGxhbmdfYWRkX3RhcmdldCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChvcHRhcmcpOwotCSAgcGFyc2VyX2lucHV0ID0gaW5wdXRfbXJpX3NjcmlwdDsKLQkgIHl5cGFyc2UgKCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DQUxMX1NIQVJFRDoKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9OX1NIQVJFRDoKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NSRUY6Ci0JICBjb21tYW5kX2xpbmUuY3JlZiA9IHRydWU7Ci0JICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERUZTWU06Ci0JICBsZXhfc3RyaW5nID0gb3B0YXJnOwotCSAgbGV4X3JlZGlyZWN0IChvcHRhcmcpOwotCSAgcGFyc2VyX2lucHV0ID0gaW5wdXRfZGVmc3ltOwotCSAgcGFyc2luZ19kZWZzeW0gPSAxOwotCSAgeXlwYXJzZSAoKTsKLQkgIHBhcnNpbmdfZGVmc3ltID0gMDsKLQkgIGxleF9zdHJpbmcgPSBOVUxMOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVNQU5HTEU6Ci0JICBkZW1hbmdsaW5nID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RZTkFNSUNfTElOS0VSOgotCSAgY29tbWFuZF9saW5lLmludGVycHJldGVyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRUI6Ci0JICBjb21tYW5kX2xpbmUuZW5kaWFuID0gRU5ESUFOX0JJRzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VMOgotCSAgY29tbWFuZF9saW5lLmVuZGlhbiA9IEVORElBTl9MSVRUTEU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FTUJFRERFRF9SRUxPQ1M6Ci0JICBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYUE9SVF9EWU5BTUlDOgotCWNhc2UgJ0UnOiAvKiBIUC9VWCBjb21wYXRpYmlsaXR5LiAgKi8KLQkgIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGxhbmdfYWRkX2VudHJ5IChvcHRhcmcsIHRydWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBpZiAoY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPQotCQkoY2hhciAqKikgeG1hbGxvYyAoMiAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzWzBdID0gb3B0YXJnOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyc1sxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBjOwotCSAgICAgIGNoYXIgKipwOwotCi0JICAgICAgYyA9IDA7Ci0JICAgICAgZm9yIChwID0gY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzOyAqcCAhPSBOVUxMOyBwKyspCi0JCSsrYzsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPQotCQkoY2hhciAqKikgeHJlYWxsb2MgKGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycywKLQkJCQkgICAgKGMgKyAyKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzW2NdID0gb3B0YXJnOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyc1tjICsgMV0gPSBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIGNvbW1hbmRfbGluZS5maWx0ZXJfc2hsaWIgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYOgotCSAgY29tbWFuZF9saW5lLmZvcmNlX2V4ZV9zdWZmaXggPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICB7Ci0JICAgIGNoYXIgKmVuZDsKLQkgICAgZ19zd2l0Y2hfdmFsdWUgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotCSAgICBpZiAoKmVuZCkKLQkgICAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBudW1iZXIgYCVzJ1xuIiksIG9wdGFyZyk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIC8qIElnbm9yZS4gICovCi0JICBicmVhazsKLQljYXNlIE9QVElPTl9HQ19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9IRUxQOgotCSAgaGVscCAoKTsKLQkgIHhleGl0ICgwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0wnOgotCSAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKG9wdGFyZywgdHJ1ZSk7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgY29uZmlnLm1hcF9maWxlbmFtZSA9ICItIjsKLQkgIGJyZWFrOwotCWNhc2UgJ20nOgotCSAgLyogSWdub3JlLiAgV2FzIGhhbmRsZWQgaW4gYSBwcmUtcGFyc2UuICAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX01BUDoKLQkgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IGZhbHNlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19ERU1BTkdMRToKLQkgIGRlbWFuZ2xpbmcgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0dDX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19LRUVQX01FTU9SWToKLQkgIGxpbmtfaW5mby5rZWVwX21lbW9yeSA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fVU5ERUZJTkVEOgotCSAgbGlua19pbmZvLm5vX3VuZGVmaW5lZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19XQVJOX01JU01BVENIOgotCSAgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2ggPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PSU5ISUJJVF9FWEVDOgotCSAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkU6Ci0JICB3aG9sZV9hcmNoaXZlID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIC8qIEZJWE1FICItTzxub24tZGlnaXRzPiA8dmFsdWU+IiB1c2VkIHRvIHNldCB0aGUgYWRkcmVzcyBvZgotCSAgICAgc2VjdGlvbiA8bm9uLWRpZ2l0cz4uICBXYXMgdGhpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi0JICAgICBzb21ldGhpbmcsIG9yIGNhbiB3ZSBjcmVhdGUgYSBuZXcgb3B0aW9uIHRvIGRvIHRoYXQKLQkgICAgICh3aXRoIGEgc3ludGF4IHNpbWlsYXIgdG8gLWRlZnN5bSk/Ci0JICAgICBnZXRvcHQgY2FuJ3QgaGFuZGxlIHR3byBhcmdzIHRvIGFuIG9wdGlvbiB3aXRob3V0IGtsdWRnZXMuICAqLwotCi0JICAvKiBFbmFibGUgb3B0aW1pemF0aW9ucyBvZiBvdXRwdXQgZmlsZXMuICAqLwotCSAgbGlua19pbmZvLm9wdGltaXplID0gc3RydG91bCAob3B0YXJnLCBOVUxMLCAwKSA/IHRydWUgOiBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgbGFuZ19hZGRfb3V0cHV0IChvcHRhcmcsIDApOyAKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX09GT1JNQVQ6Ci0JICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0IChvcHRhcmcsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JY2FzZSAncic6Ci0JICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLQkgIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSBmYWxzZTsKLQkgIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSBmYWxzZTsKLQkgIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IGZhbHNlOwotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0JICAvKiBUaGUgR05VIGxpbmtlciB0cmFkaXRpb25hbGx5IHVzZXMgLVIgdG8gbWVhbiB0byBpbmNsdWRlCi0JICAgICBvbmx5IHRoZSBzeW1ib2xzIGZyb20gYSBmaWxlLiAgVGhlIFNvbGFyaXMgbGlua2VyIHVzZXMgLVIKLQkgICAgIHRvIHNldCB0aGUgcGF0aCB1c2VkIGJ5IHRoZSBydW50aW1lIGxpbmtlciB0byBmaW5kCi0JICAgICBsaWJyYXJpZXMuICBUaGlzIGlzIHRoZSBHTlUgbGlua2VyIC1ycGF0aCBhcmd1bWVudC4gIFdlCi0JICAgICB0cnkgdG8gc3VwcG9ydCBib3RoIHNpbXVsdGFuZW91c2x5IGJ5IGNoZWNraW5nIHRoZSBmaWxlCi0JICAgICBuYW1lZC4gIElmIGl0IGlzIGEgZGlyZWN0b3J5LCByYXRoZXIgdGhhbiBhIHJlZ3VsYXIgZmlsZSwKLQkgICAgIHdlIGFzc3VtZSAtcnBhdGggd2FzIG1lYW50LiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IHN0YXQgczsKLQotCSAgICBpZiAoc3RhdCAob3B0YXJnLCAmcykgPj0gMAotCQkmJiAhIFNfSVNESVIgKHMuc3RfbW9kZSkpCi0JICAgICAgewotCQlsYW5nX2FkZF9pbnB1dF9maWxlIChvcHRhcmcsCi0JCQkJICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfc3ltYm9sc19vbmx5X2VudW0sCi0JCQkJICAgICAoY2hhciAqKSBOVUxMKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIE9QVElPTl9SUEFUSDoKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGggPT0gTlVMTCkKLQkgICAgY29tbWFuZF9saW5lLnJwYXRoID0gYnV5c3RyaW5nIChvcHRhcmcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2l6ZV90IHJwYXRoX2xlbiA9IHN0cmxlbiAoY29tbWFuZF9saW5lLnJwYXRoKTsKLQkgICAgICBzaXplX3Qgb3B0YXJnX2xlbiA9IHN0cmxlbiAob3B0YXJnKTsKLQkgICAgICBjaGFyICpidWY7Ci0JICAgICAgY2hhciAqY3AgPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0KLQkgICAgICAvKiBGaXJzdCBzZWUgd2hldGhlciBPUFRBUkcgaXMgYWxyZWFkeSBpbiB0aGUgcGF0aC4gICovCi0JICAgICAgZG8KLQkJewotCQkgIHNpemVfdCBpZHggPSAwOwotCQkgIHdoaWxlIChvcHRhcmdbaWR4XSAhPSAnXDAnICYmIG9wdGFyZ1tpZHhdID09IGNwW2lkeF0pCi0JCSAgICArK2lkeDsKLQkJICBpZiAob3B0YXJnW2lkeF0gPT0gJ1wwJwotCQkgICAgICAmJiAoY3BbaWR4XSA9PSAnXDAnIHx8IGNwW2lkeF0gPT0gJzonKSkKLQkJICAgIC8qIFdlIGZvdW5kIGl0LiAgKi8KLQkJICAgIGJyZWFrOwotCi0JCSAgLyogTm90IHlldCBmb3VuZC4gICovCi0JCSAgY3AgPSBzdHJjaHIgKGNwLCAnOicpOwotCQkgIGlmIChjcCAhPSBOVUxMKQotCQkgICAgKytjcDsKLQkJfQotCSAgICAgIHdoaWxlIChjcCAhPSBOVUxMKTsKLQotCSAgICAgIGlmIChjcCA9PSBOVUxMKQotCQl7Ci0JCSAgYnVmID0geG1hbGxvYyAocnBhdGhfbGVuICsgb3B0YXJnX2xlbiArIDIpOwotCQkgIHNwcmludGYgKGJ1ZiwgIiVzOiVzIiwgY29tbWFuZF9saW5lLnJwYXRoLCBvcHRhcmcpOwotCQkgIGZyZWUgKGNvbW1hbmRfbGluZS5ycGF0aCk7Ci0JCSAgY29tbWFuZF9saW5lLnJwYXRoID0gYnVmOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JQQVRIX0xJTks6Ci0JICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTCkKLQkgICAgY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPSBidXlzdHJpbmcgKG9wdGFyZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpidWY7Ci0KLQkgICAgICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rKQotCQkJICAgICArIHN0cmxlbiAob3B0YXJnKQotCQkJICAgICArIDIpOwotCSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzOiVzIiwgY29tbWFuZF9saW5lLnJwYXRoX2xpbmssIG9wdGFyZyk7Ci0JICAgICAgZnJlZSAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmspOwotCSAgICAgIGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID0gYnVmOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9SRUxBWDoKLQkgIGNvbW1hbmRfbGluZS5yZWxheCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFOgotCSAgYWRkX2tlZXBzeW1zX2ZpbGUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2RlYnVnZ2VyOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9hbGw7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TSEFSRUQ6Ci0JICBpZiAoY29uZmlnLmhhc19zaGFyZWQpCi0JICAgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogLXNoYXJlZCBub3Qgc3VwcG9ydGVkXG4iKSk7Ci0JICBicmVhazsKLQljYXNlICdoJzoJCS8qIFVzZWQgb24gU29sYXJpcy4gICovCi0JY2FzZSBPUFRJT05fU09OQU1FOgotCSAgY29tbWFuZF9saW5lLnNvbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NPUlRfQ09NTU9OOgotCSAgY29uZmlnLnNvcnRfY29tbW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NUQVRTOgotCSAgY29uZmlnLnN0YXRzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NZTUJPTElDOgotCSAgbGlua19pbmZvLnN5bWJvbGljID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgdHJhY2VfZmlsZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVCc6Ci0JICBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9zY3JpcHQ7Ci0JICB5eXBhcnNlICgpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEJTUzoKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLmJzcyIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UREFUQToKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVFRFWFQ6Ci0JICBzZXRfc2VjdGlvbl9zdGFydCAoIi50ZXh0Iiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVDoKLQkgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEFTS19MSU5LOgotCSAgbGlua19pbmZvLnRhc2tfbGluayA9IHRydWU7Ci0JICAvKiBGYWxsIHRocm91Z2ggLSBkbyBhbiBpbXBsaWVkIC1yIG9wdGlvbi4gICovCi0JY2FzZSBPUFRJT05fVVI6Ci0JICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLQkgIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSB0cnVlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIGxkbGFuZ19hZGRfdW5kZWYgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJCT1NFOgotCSAgbGR2ZXJzaW9uICgxKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICB0cmFjZV9maWxlX3RyaWVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgbGR2ZXJzaW9uICgwKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIGxkdmVyc2lvbiAoMSk7Ci0JICB2ZXJzaW9uX3ByaW50ZWQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKCJHTlUgbGQgJXNcbiIsIGxkX3Byb2dyYW1fdmVyc2lvbik7Ci0JICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOwotCSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICB7Ci0JICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKipwdHIgPSBsZF9lbXVsYXRpb25zOwotICAgIAotCSAgICBwcmludGYgKF8oIiAgU3VwcG9ydGVkIGVtdWxhdGlvbnM6XG4iKSk7Ci0JICAgIHdoaWxlICgqcHRyKSAKLQkgICAgICB7Ci0JCXByaW50ZiAoIiAgICVzXG4iLCAoKnB0ciktPmVtdWxhdGlvbl9uYW1lKTsKLQkJcHRyKys7Ci0JICAgICAgfQotCSAgfQotCSAgeGV4aXQgKDApOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTl9TQ1JJUFQ6Ci0JICAvKiBUaGlzIG9wdGlvbiBpbmRpY2F0ZXMgYSBzbWFsbCBzY3JpcHQgdGhhdCBvbmx5IHNwZWNpZmllcwotICAgICAgICAgICAgIHZlcnNpb24gaW5mb3JtYXRpb24uICBSZWFkIGl0LCBidXQgZG9uJ3QgYXNzdW1lIHRoYXQKLSAgICAgICAgICAgICB3ZSd2ZSBzZWVuIGEgbGlua2VyIHNjcmlwdC4gICovCi0JICB7Ci0JICAgIGJvb2xlYW4gaG9sZF9oYWRfc2NyaXB0OwotCi0JICAgIGhvbGRfaGFkX3NjcmlwdCA9IGhhZF9zY3JpcHQ7Ci0JICAgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAob3B0YXJnKTsKLQkgICAgaGFkX3NjcmlwdCA9IGhvbGRfaGFkX3NjcmlwdDsKLQkgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfdmVyc2lvbl9zY3JpcHQ7Ci0JICAgIHl5cGFyc2UgKCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTjoKLQkgIC8qIFRoaXMgb3B0aW9uIHJlY29yZHMgYSB2ZXJzaW9uIHN5bWJvbCB0byBiZSBhcHBsaWVkIHRvIHRoZQotCSAgICAgc3ltYm9scyBsaXN0ZWQgZm9yIGV4cG9ydCB0byBiZSBmb3VuZCBpbiB0aGUgb2JqZWN0IGZpbGVzCi0JICAgICAuZXhwb3J0cyBzZWN0aW9ucy4gICovCi0JICBjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX0NPTU1PTjoKLQkgIGNvbmZpZy53YXJuX2NvbW1vbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SUzoKLQkgIGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX01VTFRJUExFX0dQOgotCSAgY29uZmlnLndhcm5fbXVsdGlwbGVfZ3AgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV0FSTl9PTkNFOgotCSAgY29uZmlnLndhcm5fb25jZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR046Ci0JICBjb25maWcud2Fybl9zZWN0aW9uX2FsaWduID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dIT0xFX0FSQ0hJVkU6Ci0JICB3aG9sZV9hcmNoaXZlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dSQVA6Ci0JICBhZGRfd3JhcCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgbGlua19pbmZvLmRpc2NhcmQgPSBkaXNjYXJkX2w7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9hbGw7Ci0JICBicmVhazsKLQljYXNlICdZJzoKLQkgIGlmIChzdHJuY21wIChvcHRhcmcsICJQLCIsIDIpID09IDApCi0JICAgIG9wdGFyZyArPSAyOwotCSAgZGVmYXVsdF9kaXJsaXN0ID0geHN0cmR1cCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3knOgotCSAgYWRkX3lzeW0gKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICd6JzoKLQkgIC8qIFdlIGFjY2VwdCBhbmQgaWdub3JlIHRoaXMgb3B0aW9uIGZvciBTb2xhcmlzCi0gICAgICAgICAgICAgY29tcGF0aWJpbGl0eS4gIEFjdHVhbGx5LCBvbiBTb2xhcmlzLCBvcHRhcmcgaXMgbm90Ci0gICAgICAgICAgICAgaWdub3JlZC4gIFNvbWVkYXkgd2Ugc2hvdWxkIGhhbmRsZSBpdCBjb3JyZWN0bHkuICBGSVhNRS4gICovCi0JICBicmVhazsKLQljYXNlIE9QVElPTl9TUExJVF9CWV9SRUxPQzoKLQkgIGNvbmZpZy5zcGxpdF9ieV9yZWxvYyA9IHN0cnRvdWwgKG9wdGFyZywgTlVMTCwgMCk7Ci0JICBicmVhazsgCi0JY2FzZSBPUFRJT05fU1BMSVRfQllfRklMRToKLQkgIGNvbmZpZy5zcGxpdF9ieV9maWxlID0gdHJ1ZTsKLQkgIGJyZWFrOyAKLQljYXNlIE9QVElPTl9DSEVDS19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19DSEVDS19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnKCc6Ci0JICBpZiAoaW5ncm91cCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBtYXkgbm90IG5lc3QgZ3JvdXBzICgtLWhlbHAgZm9yIHVzYWdlKVxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCSAgbGFuZ19lbnRlcl9ncm91cCAoKTsKLQkgIGluZ3JvdXAgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnKSc6Ci0JICBpZiAoISBpbmdyb3VwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IGdyb3VwIGVuZGVkIGJlZm9yZSBpdCBiZWdhbiAoLS1oZWxwIGZvciB1c2FnZSlcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICB4ZXhpdCAoMSk7Ci0JICAgIH0KLQkgIGxhbmdfbGVhdmVfZ3JvdXAgKCk7Ci0JICBpbmdyb3VwID0gMDsKLQkgIGJyZWFrOwotICAgICAgY2FzZSBPUFRJT05fTVBDODYwQzA6Ci0gICAgICAgICAgbGlua19pbmZvLm1wYzg2MGMwID0gMjA7ICAgICAgLyogZGVmYXVsdCB2YWx1ZSAoaW4gYnl0ZXMpICovCi0gICAgICAgICAgaWYgKG9wdGFyZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgd29yZHM7Ci0KLSAgICAgICAgICAgICAgd29yZHMgPSBpc19udW0gKG9wdGFyZywgMSwgMTAsIDApOwotICAgICAgICAgICAgICBpZiAod29yZHMgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCQkgICBfKCIlczogSW52YWxpZCBhcmd1bWVudCB0byBvcHRpb24gXCJtcGM4NjBjMFwiXG4iKSwKLQkJCSAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICAgICAgICAgICAgICB4ZXhpdCAoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBsaW5rX2luZm8ubXBjODYwYzAgPSB3b3JkcyAqIDQ7ICAgLyogY29udmVydCB3b3JkcyB0byBieXRlcyAqLwotICAgICAgICAgICAgfQotICAgICAgICAgIGNvbW1hbmRfbGluZS5yZWxheCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JTklUOgotCSAgbGlua19pbmZvLmluaXRfZnVuY3Rpb24gPSBvcHRhcmc7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgT1BUSU9OX0ZJTkk6Ci0JICBsaW5rX2luZm8uZmluaV9mdW5jdGlvbiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZ3JvdXApCi0gICAgbGFuZ19sZWF2ZV9ncm91cCAoKTsKLQotICBpZiAoZGVmYXVsdF9kaXJsaXN0ICE9IE5VTEwpCi0gICAgc2V0X2RlZmF1bHRfZGlybGlzdCAoZGVmYXVsdF9kaXJsaXN0KTsKLQotfQotCi0vKiBBZGQgdGhlIChjb2xvbi1zZXBhcmF0ZWQpIGVsZW1lbnRzIG9mIERJUkxJU1RfUFRSIHRvIHRoZQotICAgbGlicmFyeSBzZWFyY2ggcGF0aC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZGVmYXVsdF9kaXJsaXN0IChkaXJsaXN0X3B0cikKLSAgICAgY2hhciAqZGlybGlzdF9wdHI7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgcCA9IHN0cmNociAoZGlybGlzdF9wdHIsIFBBVEhfU0VQQVJBVE9SKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSAnXDAnOwotICAgICAgaWYgKCpkaXJsaXN0X3B0ciAhPSAnXDAnKQotCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChkaXJsaXN0X3B0ciwgdHJ1ZSk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgZGlybGlzdF9wdHIgPSBwICsgMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfc2VjdGlvbl9zdGFydCAoc2VjdCwgdmFsc3RyKQotICAgICBjaGFyICpzZWN0LCAqdmFsc3RyOwotewotICBjaGFyICplbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsID0gc3RydG91bCAodmFsc3RyLCAmZW5kLCAxNik7Ci0gIGlmICgqZW5kKQotICAgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIGhleCBudW1iZXIgYCVzJ1xuIiksIHZhbHN0cik7Ci0gIGxhbmdfc2VjdGlvbl9zdGFydCAoc2VjdCwgZXhwX2ludG9wICh2YWwpKTsKLX0KLQwKLS8qIFByaW50IGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBvcHRpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWhlbHAgKCkKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKip0YXJnZXRzLCAqKnBwOwotCi0gIHByaW50ZiAoXygiVXNhZ2U6ICVzIFtvcHRpb25zXSBmaWxlLi4uXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLQotICBwcmludGYgKF8oIk9wdGlvbnM6XG4iKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBPUFRJT05fQ09VTlQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobGRfb3B0aW9uc1tpXS5kb2MgIT0gTlVMTCkKLQl7Ci0JICBib29sZWFuIGNvbW1hOwotCSAgaW50IGxlbjsKLQkgIGludCBqOwotCi0JICBwcmludGYgKCIgICIpOwotCi0JICBjb21tYSA9IGZhbHNlOwotCSAgbGVuID0gMjsKLQotCSAgaiA9IGk7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbal0uc2hvcnRvcHQgIT0gJ1wwJwotCQkgICYmIGxkX29wdGlvbnNbal0uY29udHJvbCAhPSBOT19IRUxQKQotCQl7Ci0JCSAgcHJpbnRmICgiJXMtJWMiLCBjb21tYSA/ICIsICIgOiAiIiwgbGRfb3B0aW9uc1tqXS5zaG9ydG9wdCk7Ci0JCSAgbGVuICs9IChjb21tYSA/IDIgOiAwKSArIDI7Ci0JCSAgaWYgKGxkX29wdGlvbnNbal0uYXJnICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChsZF9vcHRpb25zW2pdLm9wdC5oYXNfYXJnICE9IG9wdGlvbmFsX2FyZ3VtZW50KQotCQkJewotCQkJICBwcmludGYgKCIgIik7Ci0JCQkgICsrbGVuOwotCQkJfQotCQkgICAgICBwcmludGYgKCIlcyIsIF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgICAgbGVuICs9IHN0cmxlbiAoXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgfQotCQkgIGNvbW1hID0gdHJ1ZTsKLQkJfQotCSAgICAgICsrajsKLQkgICAgfQotCSAgd2hpbGUgKGogPCBPUFRJT05fQ09VTlQgJiYgbGRfb3B0aW9uc1tqXS5kb2MgPT0gTlVMTCk7Ci0KLQkgIGogPSBpOwotCSAgZG8KLQkgICAgewotCSAgICAgIGlmIChsZF9vcHRpb25zW2pdLm9wdC5uYW1lICE9IE5VTEwKLQkJICAmJiBsZF9vcHRpb25zW2pdLmNvbnRyb2wgIT0gTk9fSEVMUCkKLQkJewotCQkgIHByaW50ZiAoIiVzLSVzJXMiLAotCQkJICBjb21tYSA/ICIsICIgOiAiIiwKLQkJCSAgbGRfb3B0aW9uc1tqXS5jb250cm9sID09IFRXT19EQVNIRVMgPyAiLSIgOiAiIiwKLQkJCSAgbGRfb3B0aW9uc1tqXS5vcHQubmFtZSk7Ci0JCSAgbGVuICs9ICgoY29tbWEgPyAyIDogMCkKLQkJCSAgKyAxCi0JCQkgICsgKGxkX29wdGlvbnNbal0uY29udHJvbCA9PSBUV09fREFTSEVTID8gMSA6IDApCi0JCQkgICsgc3RybGVuIChsZF9vcHRpb25zW2pdLm9wdC5uYW1lKSk7Ci0JCSAgaWYgKGxkX29wdGlvbnNbal0uYXJnICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiAlcyIsIF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgICAgbGVuICs9IDEgKyBzdHJsZW4gKF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgIH0KLQkJICBjb21tYSA9IHRydWU7Ci0JCX0KLQkgICAgICArK2o7Ci0JICAgIH0KLQkgIHdoaWxlIChqIDwgT1BUSU9OX0NPVU5UICYmIGxkX29wdGlvbnNbal0uZG9jID09IE5VTEwpOwotCi0JICBpZiAobGVuID49IDMwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgICBsZW4gPSAwOwotCSAgICB9Ci0KLQkgIGZvciAoOyBsZW4gPCAzMDsgbGVuKyspCi0JICAgIHB1dGNoYXIgKCcgJyk7Ci0KLQkgIHByaW50ZiAoIiVzXG4iLCBfKGxkX29wdGlvbnNbaV0uZG9jKSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3RlOiBWYXJpb3VzIHRvb2xzIChzdWNoIGFzIGxpYnRvb2wpIGRlcGVuZCB1cG9uIHRoZQotICAgICBmb3JtYXQgb2YgdGhlIGxpc3RpbmdzIGJlbG93IC0gZG8gbm90IGNoYW5nZSB0aGVtLiAgKi8KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgcHJpbnRmIChfKCIlczogc3VwcG9ydGVkIHRhcmdldHM6IiksIHByb2dyYW1fbmFtZSk7Ci0gIHRhcmdldHMgPSBiZmRfdGFyZ2V0X2xpc3QgKCk7Ci0gIGZvciAocHAgPSB0YXJnZXRzOyAqcHAgIT0gTlVMTDsgcHArKykKLSAgICBwcmludGYgKCIgJXMiLCAqcHApOwotICBmcmVlICh0YXJnZXRzKTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKF8oIiVzOiBzdXBwb3J0ZWQgZW11bGF0aW9uczogIiksIHByb2dyYW1fbmFtZSk7Ci0gIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgKHN0ZG91dCk7Ci0gIHByaW50ZiAoIlxuIik7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgcHJpbnRmIChfKCIlczogZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnM6XG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMgKHN0ZG91dCk7Ci0gIHByaW50ZiAoIlxuIik7Ci0gIAotICBwcmludGYgKF8oIlxuUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci19CmRpZmYgLS1naXQgYS9sZC9tYWMtbGQuciBiL2xkL21hYy1sZC5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzE2ZmM1Li4wMDAwMDAwCi0tLSBhL2xkL21hYy1sZC5yCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogUmVzb3VyY2VzIGZvciBHTlUgTEQuICovCi0KLSNpbmNsdWRlICJTeXNUeXBlcy5yIgotCi0vKiBWZXJzaW9uIHJlc291cmNlcy4gKi8KLQotcmVzb3VyY2UgJ3ZlcnMnICgxKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JVkVSU0lPTl9TVFJJTkcgICIgKEMpIDE5ODYtOTUgRlNGLCBJbmMuIgotfTsKLQotcmVzb3VyY2UgJ3ZlcnMnICgyLCBwdXJnZWFibGUpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQkiR0xEICIgVkVSU0lPTl9TVFJJTkcgIiBmb3IgTVBXIgotfTsKLQotI2lmZGVmIFdBTlRfQ0ZSRwotCi0jaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKLQotcmVzb3VyY2UgJ2NmcmcnICgwKSB7Ci0JewotCQlrUG93ZXJQQywKLQkJa0Z1bGxMaWIsCi0JCWtOb1ZlcnNpb25OdW0sIGtOb1ZlcnNpb25OdW0sCi0JCTAsIDAsCi0JCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAotCQlQUk9HX05BTUUKLQl9Ci19OwotCi0jZW5kaWYgLyogV0FOVF9DRlJHICovCmRpZmYgLS1naXQgYS9sZC9tcHctY29uZmlnLmluIGIvbGQvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1NDJjYy4uMDAwMDAwMAotLS0gYS9sZC9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBMRC4KLQotSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL202OGstYXBwbGUtbWFjb3MvCi0JU2V0IGVtdWxuYW1lIG02OGtjb2ZmCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZW02OGtjb2ZmLmMgZW02OGtjb2ZmLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVtNjhrY29mZi5jLm8KLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvcG93ZXJwYy1hcHBsZS1tYWNvcy8KLQlTZXQgZW11bG5hbWUgcHBjbWFjb3MKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lcHBjbWFjLmMgZXBwY21hY29zLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVwcGNtYWNvcy5jLm8KLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvaTM4Ni1cT3B0aW9uLXgtZ28zMi8KLQlTZXQgZW11bG5hbWUgaTM4NmdvMzIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1laTM4NmdvMzIuYyBlaTM4NmdvMzIuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZWkzODZnbzMyLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1lY29mZi8KLQlTZXQgZW11bG5hbWUgbWlwc2lkdAotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWlkdG1pcHMuYyBlbWlwc2lkdC5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlbWlwc2lkdC5jLm8KLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtXE9wdGlvbi14LwotCVNldCBlbXVsbmFtZSBlbGYzMmVibWlwCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZWxmbWlwcy5jIGVlbGYzMmVibWlwLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVlbGYzMmVibWlwLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1cT3B0aW9uLXgtaG1zLwotCVNldCBlbXVsbmFtZSBzaAotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVzaC5jIGVzaC5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlc2guYy5vCi1FbmQgSWYKLQotRWNobyAnLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAgRE8gTk9UIEVESVQhICovJyA+ICJ7b30ibGRlbXVsLXRtcC5oCi1FY2hvICJleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSBsZF97ZW11bG5hbWV9X2VtdWxhdGlvbjsiID4+ICJ7b30ibGRlbXVsLXRtcC5oCi1FY2hvICcjZGVmaW5lIEVNVUxBVElPTl9MSVNUIFwnCQkJCT4+ICJ7b30ibGRlbXVsLXRtcC5oCi1FY2hvICIgICZsZF97ZW11bG5hbWV9X2VtdWxhdGlvbiwgXCIJCQk+PiAie299ImxkZW11bC10bXAuaAotRWNobyAnICAwJwkJCQkJCT4+ICJ7b30ibGRlbXVsLXRtcC5oCi0KLU1vdmVJZkNoYW5nZSAie299ImxkZW11bC10bXAuaCAie299ImxkZW11bC1saXN0LmgKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJFTVVMID0gIiB7ZW11bG5hbWV9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJFTVVMQVRJT05fT0ZJTEVTID0gIiB7ZW11bGF0aW9uX29maWxlc30JCT4+ICJ7b30ibWsudG1wCi1FY2hvICd2ZXJzaW9uID0gJyBgU2VhcmNoICdsZCB2ZXJzaW9uICcge3NyY2Rpcn1sZHZlci5jIHwgc2VkIC1lICdzLy4qbGQgdmVyc2lvbiBcKFteIF0qXCkuKi9cMS8nYCA+PiAie299Im1rLnRtcAotRWNobyAiVERFRklORVMgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCQk+PiAie299Im1rLnRtcAotCi1FY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldwotRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCQkJCT4+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL2xkL21wdy1lbGZtaXBzLmMgYi9sZC9tcHctZWxmbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFiMDU2Li4wMDAwMDAwCi0tLSBhL2xkL21wdy1lbGZtaXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDM5ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogMzIgYml0IEVMRiBlbXVsYXRpb24gY29kZSBmb3IgZWxmMzJlYm1pcAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBFTEYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfZWxmMzJlYm1pcAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfc3RhdF9uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX3NlYXJjaF9uZWVkZWQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkZWxmMzJlYm1pcF9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkZWxmMzJlYm1pcF9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfbWlwczsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCi0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkZWxmMzJlYm1pcF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0KLSAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkgICAgICsgc3RybGVuIChmaWxlbmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkgICAgICsgc2l6ZW9mICIvbGliLnNvIik7Ci0KLSAgc3ByaW50ZiAoc3RyaW5nLCAiJXMvbGliJXMlcy5zbyIsIHNlYXJjaC0+bmFtZSwgZmlsZW5hbWUsIGFyY2gpOwotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICAvKiBXZSBoYXZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBpbiB0aGUgbGluay4gIFRoZSBFTEYKLSAgICAgYmFja2VuZCBsaW5rZXIgd2lsbCBjcmVhdGUgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIC5keW5hbWljCi0gICAgIHNlY3Rpb24gbmFtaW5nIHRoaXMgZmlsZS4gIElmIHRoaXMgZmlsZSBpbmNsdWRlcyBhIERUX1NPTkFNRQotICAgICBlbnRyeSwgaXQgd2lsbCBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUgRUxGIGxpbmtlciB3aWxsIGp1c3QgdXNlCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIGFuIGFyY2hpdmUgZm91bmQgYnkgc2VhcmNoaW5nLCBsaWtlCi0gICAgIHRoaXMgb25lLCB0aGUgRFRfTkVFREVEIGVudHJ5IHNob3VsZCBjb25zaXN0IG9mIGp1c3QgdGhlIG5hbWUgb2YKLSAgICAgdGhlIGZpbGUsIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24gdXNlZCB0byBmaW5kIGl0LiAgTm90ZQotICAgICB0aGF0IHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGlmIHdlIGhhdmUgYSBkeW5hbWljIG9iamVjdDsgYW4KLSAgICAgYXJjaGl2ZSB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuCi0KLSAgICAgRklYTUU6IFRoaXMgYXBwcm9hY2gtLXVzaW5nIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLS1pcyBub3QKLSAgICAgdmVyeSBwcmV0dHkuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mIGFueXRoaW5nIHRoYXQgaXMKLSAgICAgcHJldHR5LCB0aG91Z2guICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9vYmplY3QpCi0gICAgICAmJiAoZW50cnktPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpuZWVkZWRfbmFtZTsKLQotICAgICAgQVNTRVJUIChlbnRyeS0+aXNfYXJjaGl2ZSAmJiBlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZyk7Ci0gICAgICBuZWVkZWRfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkJICAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkJICAgICAgKyBzaXplb2YgImxpYi5zbyIpOwotICAgICAgc3ByaW50ZiAobmVlZGVkX25hbWUsICJsaWIlcyVzLnNvIiwgZmlsZW5hbWUsIGFyY2gpOwotICAgICAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGVudHJ5LT50aGVfYmZkLCBuZWVkZWRfbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aAotICAgYmV0d2VlbiBhZnRlcl9vcGVuIGFuZCBjaGVja19uZWVkZWQgYW5kIHN0YXRfbmVlZGVkLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBzdHJ1Y3Qgc3RhdCBnbG9iYWxfc3RhdDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKmw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgd2hlbiBkb2luZyBhIGZpbmFsIGxpbmsuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSB8fCBsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybjsKLQotICAvKiBHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXBwZWFyIGluIERUX05FRURFRCBlbnRyaWVzIGluCi0gICAgIGR5bmFtaWMgb2JqZWN0cyBpbmNsdWRlZCBpbiB0aGUgbGluayAob2Z0ZW4gdGhlcmUgd2lsbCBiZSBub25lKS4KLSAgICAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdAotICAgICB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZQotICAgICBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcKLSAgICAgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbiBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUKLSAgICAgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcwotICAgICBsb29wLiAgKi8KLSAgbmVlZGVkID0gYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsbDsKLSAgICAgIGNvbnN0IGNoYXIgKmxpYl9wYXRoOwotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCi0gICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQotCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsLT5uYW1lKSA9PSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAobGwgIT0gbCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgZmlsZSB3YXMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgZXhwbGljaXRseS4gICovCi0gICAgICBnbG9iYWxfbmVlZGVkID0gbDsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IGZhbHNlOwotICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQotCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKLQkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAotCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuICAqLwotICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCi0JCQkJCSAgICAgIGwtPm5hbWUpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLCBsLT5uYW1lKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMCi0JICAmJiBjb21tYW5kX2xpbmUucnBhdGggPT0gTlVMTCkKLQl7Ci0JICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0JICBpZiAoZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSkpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGxlbiA9IHN0cmxlbiAobC0+bmFtZSk7Ci0gICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCXsKLQkgIGNoYXIgKmZpbGVuYW1lOwotCi0JICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCSAgICBjb250aW51ZTsKLQkgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpICsgbGVuICsgMik7Ci0JICBzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBsLT5uYW1lKTsKLQkgIGlmIChnbGRlbGYzMmVibWlwX3RyeV9uZWVkZWQgKGZpbGVuYW1lKSkKLQkgICAgYnJlYWs7Ci0JICBmcmVlIChmaWxlbmFtZSk7Ci0JfQotICAgICAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZFxuIiksCi0JICAgICBsLT5uYW1lLCBsLT5ieSk7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggZm9yIGEgbmVlZGVkIGZpbGUgaW4gYSBwYXRoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlbmFtZSwgKnNzZXQ7Ci0KLSAgICAgIHMgPSBzdHJjaHIgKHBhdGgsICc6Jyk7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXMgPSBwYXRoICsgc3RybGVuIChwYXRoKTsKLQotICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIGxlbiArIDIpOwotICAgICAgaWYgKHMgPT0gcGF0aCkKLQlzc2V0ID0gZmlsZW5hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChmaWxlbmFtZSwgcGF0aCwgcyAtIHBhdGgpOwotCSAgZmlsZW5hbWVbcyAtIHBhdGhdID0gJy8nOwotCSAgc3NldCA9IGZpbGVuYW1lICsgKHMgLSBwYXRoKSArIDE7Ci0JfQotICAgICAgc3RyY3B5IChzc2V0LCBuYW1lKTsKLQotICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCAoZmlsZW5hbWUpKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmcmVlIChmaWxlbmFtZSk7Ci0KLSAgICAgIGlmICgqcyA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgcGF0aCA9IHMgKyAxOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CSAgCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHBvc3NpYmxlIG5hbWUgZm9yIGEgZHluYW1pYyBvYmplY3QKLSAgIG5hbWVkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgYmZkICphYmZkOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgbWF0Y2hpbmcgdGhlIERUX05FRURFRCBlbnRyeS4gICovCi0KLSAgLyogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBvdGhlciBpbnB1dCBmaWxlIG9mIHRoZQotICAgICBzYW1lIG5hbWUuICBXZSBtdXN0IG5vdyBjaGVjayBhZ2FpbiB0aGF0IHdlIGFyZSBub3QgaW5jbHVkaW5nIHRoZQotICAgICBzYW1lIGZpbGUgdHdpY2UuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvbiBtYW55IHN5c3RlbXMKLSAgICAgbGliYy5zbyBpcyBhIHN5bWxpbmsgdG8sIGUuZy4sIGxpYmMuc28uMS4gIFRoZSBTT05BTUUgZW50cnkgd2lsbAotICAgICByZWZlcmVuY2UgbGliYy5zby4xLiAgSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGxpYmMuc28sIHdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBsaWJjLnNvLjEgaWYgdGhleSBhcmUgdGhlIHNhbWUgZmlsZSwgYW5kIHdlCi0gICAgIGNhbiBvbmx5IGNoZWNrIHRoYXQgdXNpbmcgc3RhdC4gICovCi0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmZ2xvYmFsX3N0YXQpICE9IDApCi0gICAgZWluZm8gKF8oIiVGJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIpLCBhYmZkKTsKLSAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkZWxmMzJlYm1pcF9zdGF0X25lZWRlZCk7Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgewotICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2gKLSAgICAgICAgIHdlIGFyZW4ndCBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUZWxsIHRoZSBFTEYgYmFja2VuZCB0aGF0IGRvbid0IHdhbnQgdGhlIG91dHB1dCBmaWxlIHRvIGhhdmUgYQotICAgICBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZmlsZS4gICovCi0gIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCAiIik7Ci0KLSAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKF8oIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgYWJmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAocy0+ZmlsZW5hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzb25hbWU7Ci0KLSAgICAgIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gICAgICBpZiAoc29uYW1lICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoc29uYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQkgIAotICBpZiAocy0+c2VhcmNoX2RpcnNfZmxhZwotICAgICAgJiYgcy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpID09IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZjsKLQotICAgICAgZiA9IHN0cnJjaHIgKHMtPmZpbGVuYW1lLCAnLycpOwotICAgICAgaWYgKGYgIT0gTlVMTAotCSAgJiYgc3RyY21wIChmICsgMSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgcnVubmluZyBzdGF0IG9uCi0gICB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX3N0YXRfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgY29uc3QgY2hhciAqc3VmZml4OwotICBjb25zdCBjaGFyICpzb25hbWU7Ci0gIGNvbnN0IGNoYXIgKmY7Ci0KLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfc3RhdCAocy0+dGhlX2JmZCwgJnN0KSAhPSAwKQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiksIHMtPnRoZV9iZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3Quc3RfZGV2ID09IGdsb2JhbF9zdGF0LnN0X2RldgotICAgICAgJiYgc3Quc3RfaW5vID09IGdsb2JhbF9zdGF0LnN0X2lubykKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQgbG9va3MgbGlrZSB3ZSBhcmUgaW5jbHVkaW5nIHR3bwotICAgICBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwKLSAgICAgdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSBpZiAtbGMgcGlja3MgdXAgbGliYy5zby42IGJ1dCBzb21lIG90aGVyCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGhhcyBhIERUX05FRURFRCBlbnRyeSBvZiBsaWJjLnNvLjUuICBUaGlzIGlzIGEKLSAgICAgaHVlcmlzdGljIHRlc3QsIGFuZCBpdCB3aWxsIG9ubHkgd29yayBpZiB0aGUgbmFtZSBsb29rcyBsaWtlCi0gICAgIE5BTUUuc28uVkVSU0lPTi4gIEZJWE1FOiBEZXBlbmRpbmcgb24gZmlsZSBuYW1lcyBpcyBlcnJvci1wcm9uZS4KLSAgICAgSWYgd2UgcmVhbGx5IHdhbnQgdG8gaXNzdWUgd2FybmluZ3MgYWJvdXQgbWl4aW5nIHZlcnNpb24gbnVtYmVycwotICAgICBvZiBzaGFyZWQgbGlicmFyaWVzLCB3ZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5LiAgKi8KLQotICBpZiAoc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpICE9IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggPSBzdHJzdHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICIuc28uIik7Ci0gIGlmIChzdWZmaXggPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gcy0+ZmlsZW5hbWU7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGlmIChzdHJuY21wIChmLCBnbG9iYWxfbmVlZGVkLT5uYW1lLCBzdWZmaXggLSBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbWF5IGNvbmZsaWN0IHdpdGggJXNcbiIpLAotCSAgIGdsb2JhbF9uZWVkZWQtPm5hbWUsIGdsb2JhbF9uZWVkZWQtPmJ5LCBmKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJwYXRoOwotICBhc2VjdGlvbiAqc2ludGVycDsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBFTEYgYmFja2VuZCBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIEVMRiBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQKLSAgICAgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgcnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0gIGlmIChycGF0aCA9PSBOVUxMKQotICAgIHJwYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLSAgaWYgKCEgYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwKLQkJCQkJCSBjb21tYW5kX2xpbmUuc29uYW1lLAotCQkJCQkJIHJwYXRoLAotCQkJCQkJIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYywKLQkJCQkJCSAmbGlua19pbmZvLAotCQkJCQkJICZzaW50ZXJwKSkKLSAgICBlaW5mbyAoXygiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKSk7Ci0KLSAgLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBkeW5hbWljIGxpbmtlciB3ZSBhcmUgdXNpbmcuICAqLwotICBpZiAoY29tbWFuZF9saW5lLmludGVycHJldGVyICE9IE5VTEwKLSAgICAgICYmIHNpbnRlcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW50ZXJwLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXI7Ci0gICAgICBzaW50ZXJwLT5fcmF3X3NpemUgPSBzdHJsZW4gKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcikgKyAxOwotICAgIH0KLQotICAvKiBMb29rIGZvciBhbnkgc2VjdGlvbnMgbmFtZWQgLmdudS53YXJuaW5nLiAgQXMgYSBHTlUgZXh0ZW5zaW9ucywKLSAgICAgd2UgdHJlYXQgc3VjaCBzZWN0aW9ucyBhcyBjb250YWluaW5nIHdhcm5pbmcgbWVzc2FnZXMuICBXZSBwcmludAotICAgICBvdXQgdGhlIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gemVybyBvdXQgdGhlIHNlY3Rpb24gc2l6ZSBzbwotICAgICB0aGF0IGl0IGRvZXMgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JYXNlY3Rpb24gKnM7Ci0JYmZkX3NpemVfdHlwZSBzejsKLQljaGFyICptc2c7Ci0JYm9vbGVhbiByZXQ7Ci0KLQlpZiAoaXMtPmp1c3Rfc3ltc19mbGFnKQotCSAgY29udGludWU7Ci0KLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlzLT50aGVfYmZkLCAiLmdudS53YXJuaW5nIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ogPSBiZmRfc2VjdGlvbl9zaXplIChpcy0+dGhlX2JmZCwgcyk7Ci0JbXNnID0geG1hbGxvYyAoKHNpemVfdCkgc3ogKyAxKTsKLQlpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQotCSAgZWluZm8gKF8oIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuZ251Lndhcm5pbmc6ICVFXG4iKSwKLQkJIGlzLT50aGVfYmZkKTsKLQltc2dbc3pdID0gJ1wwJzsKLQlyZXQgPSBsaW5rX2luZm8uY2FsbGJhY2tzLT53YXJuaW5nICgmbGlua19pbmZvLCBtc2csCi0JCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgICAgaXMtPnRoZV9iZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkgICAgKGJmZF92bWEpIDApOwotCUFTU0VSVCAocmV0KTsKLQlmcmVlIChtc2cpOwotCi0JLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplLCBzbyB0aGF0IHdlIGRvbid0IHdhc3RlIGNvcHlpbmcgdGhlCi0JICAgd2FybmluZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICAgIH0KLSAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBhbmQKLSAgIHRlbGxzIHRoZSBFTEYgYmFja2VuZCBhYm91dCB0aGVtLCBpbiBjYXNlIHRoZXkgYXJlIGFzc2lnbm1lbnRzIHRvCi0gICBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKLQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlIGNhbGwgcmVjb3JkX2xpbmtfYXNzaWdubWVudCBldmVuIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4KLQkgVGhpcyBpcyBiZWNhdXNlIGlmIGl0IGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgd2UKLQkgYWN0dWFsbHkgd2FudCB0byB1c2UgdGhlIHZhbHVlIGRlZmluZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsCi0JIG5vdCB0aGUgdmFsdWUgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgKGJlY2F1c2Ugd2UgYXJlIHNldHRpbmcKLQkgc3ltYm9scyBsaWtlIGV0ZXh0KS4gIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIKLQkgb2JqZWN0LCB0aGVuLCBhcyBpdCBoYXBwZW5zLCBjYWxsaW5nIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkgd2lsbCBkbyBubyBoYXJtLiAgKi8KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCQkgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGV4cC0+YXNzaWduLmRzdCwKLQkJICBleHAtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlID8gdHJ1ZSA6IGZhbHNlKSkpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iKSwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQwotICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yb2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfYnNzOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcmVsOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGRlbGYzMmVibWlwX3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOwotICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOwotICBldHJlZV90eXBlICphZGRyZXNzOwotICBjb25zdCBjaGFyICpzZWNuYW1lLCAqcHM7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLwotICBob2xkX3NlY3Rpb24gPSBzOwotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24pOwotCi0gIGlmIChob2xkX3VzZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBwbGFjZWQgYSBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdXNlLT5jaGlsZHJlbiwgcywgaG9sZF91c2UsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCB0aGVuIGFsd2F5cyBwdXQgLmdudS53YXJuaW5nLlNZTUJPTAotICAgICBzZWN0aW9ucyBpbnRvIHRoZSAudGV4dCBzZWN0aW9uIHRvIGdldCB0aGVtIG91dCBvZiB0aGUgd2F5LiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnNoYXJlZAotICAgICAgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSA9PSAwCi0gICAgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB3aWxkX2RvaXQgKCZob2xkX3RleHQtPmNoaWxkcmVuLCBzLCBob2xkX3RleHQsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIERlY2lkZSB3aGljaCBzZWdtZW50IHRoZSBzZWN0aW9uIHNob3VsZCBnbyBpbiBiYXNlZCBvbiB0aGUKLSAgICAgc2VjdGlvbiBuYW1lIGFuZCBzZWN0aW9uIGZsYWdzLiAgKi8KLSAgcGxhY2UgPSBOVUxMOwotICBpZiAoKHMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotICAgICAgJiYgaG9sZF9ic3MgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfYnNzOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKLQkgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfZGF0YTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoc2VjbmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JICAgJiYgaG9sZF9yZWwgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcmVsOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfcm9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JvZGF0YTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3RleHQ7Ci0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZSByaWdodAotICAgICBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sgbmVhdGVyLiAgKi8KLSAgc25ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIHNlY25hbWUpOwotICBpZiAoc25ldyA9PSBOVUxMKQotICAgICAgZWluZm8gKF8oIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiksCi0JICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBzZWNuYW1lKTsKLSAgaWYgKHBsYWNlLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocHBzID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOyAqcHBzICE9IHNuZXc7IHBwcyA9ICYoKnBwcyktPm5leHQpCi0JOwotICAgICAgKnBwcyA9IHNuZXctPm5leHQ7Ci0gICAgICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotICAgICAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLSAgICB9Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIG9sZCA9IHN0YXRfcHRyOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0gIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgLyogSWYgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaXMgcmVwcmVzZW50YWJsZSBpbiBDLCB0aGVuIGNyZWF0ZQotICAgICBzeW1ib2xzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgZm9yIChwcyA9IHNlY25hbWU7ICpwcyAhPSAnXDAnOyBwcysrKQotICAgIGlmICghIGlzYWxudW0gKCpwcykgJiYgKnBzICE9ICdfJykKLSAgICAgIGJyZWFrOwotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBzZWNuYW1lICsgc2l6ZW9mICJfX3N0YXJ0XyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RhcnRfJXMiLCBzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAotCQkJCQkJZXhwX2ludG9wICgoYmZkX3ZtYSkgMQotCQkJCQkJCSAgIDw8IHMtPmFsaWdubWVudF9wb3dlcikpKSk7Ci0gICAgfQotCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgYWRkcmVzcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBhZGRyZXNzID0gZXhwX2ludG9wICgoYmZkX3ZtYSkgMCk7Ci0KLSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJICAgICAgIChiZmRfdm1hKSAwLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoc2VjbmFtZSk7Ci0gIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCi0gIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIpOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0KLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gc2VjbmFtZSArIHNpemVvZiAiX19zdG9wXyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RvcF8lcyIsIHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlIG5ldyBzdGF0ZW1lbnQgbGlzdCByaWdodCBhZnRlciBQTEFDRS4gICovCi0gICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLSAgcGxhY2UtPmhlYWRlci5uZXh0ID0gYWRkLmhlYWQ7Ci0KLSAgc3RhdF9wdHIgPSBvbGQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24gKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmIChzLT5oZWFkZXIudHlwZSAhPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtKQotICAgIHJldHVybjsKLQotICBvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsIGhvbGRfc2VjdGlvbi0+bmFtZSkgPT0gMCkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJvZGF0YSIpID09IDApCi0gICAgaG9sZF9yb2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICBob2xkX2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5ic3MiKSA9PSAwKQotICAgIGhvbGRfYnNzID0gb3M7Ci0gIGVsc2UgaWYgKGhvbGRfcmVsID09IE5VTEwKLQkgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICYmIHN0cm5jbXAgKG9zLT5uYW1lLCAiLnJlbCIsIDQpID09IDApCi0gICAgaG9sZF9yZWwgPSBvczsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkZWxmMzJlYm1pcF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzXG5cCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nXG5cCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkXG5cCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuaW50ZXJwICAgMCA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgMCA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgMCA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgMCA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgMCA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgMCA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgIDAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgMCA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgMCA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAwIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAwIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgMCA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAwIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgMCA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAwIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgIDAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgIDAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgMCA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgMCA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgIDAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgMCA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgIDAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgMCA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgIDAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgMCA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgIDAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAwIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExIDAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgIDAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgLmZpbmkgICAgMCA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLmRhdGEgIDAgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAuZGF0YTEgMCA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgIDAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgIDAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgLmdvdCAgICAgICAgIDAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgIDAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5zYnNzICAgIDAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgMCA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCi1PVVRQVVRfQVJDSChtaXBzKVxuXAotRU5UUlkoX3N0YXJ0KVxuXAotIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlc1xuXAotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZ1xuXAotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZFxuXAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKLSAgLmludGVycCAgIDAgOiB7ICooLmludGVycCkgCX1cblwKLSAgLnJlZ2luZm8gICAgIDAgOiB7ICooLnJlZ2luZm8pIH1cblwKLSAgLmR5bmFtaWMgICAgIDAgOiB7ICooLmR5bmFtaWMpIH1cblwKLSAgLmR5bnN0ciAgICAgIDAgOiB7ICooLmR5bnN0cikJCX1cblwKLSAgLmR5bnN5bSAgICAgIDAgOiB7ICooLmR5bnN5bSkJCX1cblwKLSAgLmhhc2ggICAgICAgIDAgOiB7ICooLmhhc2gpCQl9XG5cCi0gIC5yZWwudGV4dCAgICAwIDogeyAqKC5yZWwudGV4dCkJCX1cblwKLSAgLnJlbGEudGV4dCAgIDAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKLSAgLnJlbC5kYXRhICAgIDAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAotICAucmVsYS5kYXRhICAgMCA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAotICAucmVsLnJvZGF0YSAgMCA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKLSAgLnJlbGEucm9kYXRhIDAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAotICAucmVsLmdvdCAgICAgMCA6IHsgKigucmVsLmdvdCkJCX1cblwKLSAgLnJlbGEuZ290ICAgIDAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAotICAucmVsLmN0b3JzICAgMCA6IHsgKigucmVsLmN0b3JzKQl9XG5cCi0gIC5yZWxhLmN0b3JzICAwIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCi0gIC5yZWwuZHRvcnMgICAwIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKLSAgLnJlbGEuZHRvcnMgIDAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKLSAgLnJlbC5pbml0ICAgIDAgOiB7ICooLnJlbC5pbml0KQl9XG5cCi0gIC5yZWxhLmluaXQgICAwIDogeyAqKC5yZWxhLmluaXQpCX1cblwKLSAgLnJlbC5maW5pICAgIDAgOiB7ICooLnJlbC5maW5pKQl9XG5cCi0gIC5yZWxhLmZpbmkgICAwIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKLSAgLnJlbC5ic3MgICAgIDAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCi0gIC5yZWxhLmJzcyAgICAwIDogeyAqKC5yZWxhLmJzcykJCX1cblwKLSAgLnJlbC5wbHQgICAgIDAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCi0gIC5yZWxhLnBsdCAgICAwIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKLSAgLnJvZGF0YSAgMCA6IHsgKigucm9kYXRhKSAgfVxuXAotICAucm9kYXRhMSAwIDogeyAqKC5yb2RhdGExKSB9XG5cCi0gIC5pbml0ICAgICAgICAwIDogeyAqKC5pbml0KQl9ID0wXG5cCi0gIC50ZXh0ICAgIDAgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHViKVxuXAotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAotICAgICooLmdudS53YXJuaW5nKVxuXAotICB9ID0wXG5cCi0gIC5maW5pICAgIDAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAotICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCi0gIC5kYXRhICAwIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH1cblwKLSAgLmRhdGExIDAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAwIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAwIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIC5nb3QgICAgICAgICAwIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAwIDogeyAqKC5zZGF0YSkgfVxuXAotICAuc2JzcyAgICAwIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgIDAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCi0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAotICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuID0gMHgwNDAwMDAwO1xuXAotICAuaW50ZXJwICAgICA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgICA6XG5cCi0gIHtcblwKLSAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgX2V0ZXh0ID0gLjtcblwKLSAgUFJPVklERSAoZXRleHQgPSAuKTtcblwKLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgICAgLiA9IC47XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLiArPSAuIC0gMHgwNDAwMDAwO1xuXAotICAuZGF0YSAgICA6XG5cCi0gIHtcblwKLSAgICBfZmRhdGEgPSAuIDtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCi0gIC5nb3QgICAgICAgICAgIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAotICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAotICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAotICBfZWRhdGEgID0gIC47XG5cCi0gIFBST1ZJREUgKGVkYXRhID0gLik7XG5cCi0gIF9fYnNzX3N0YXJ0ID0gLjtcblwKLSAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgICAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICBfZW5kID0gLiA7XG5cCi0gIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCi0gICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC4gPSAweDA0MDAwMDA7XG5cCi0gIC5pbnRlcnAgICAgIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAgIDpcblwKLSAge1xuXAotICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICBfZXRleHQgPSAuO1xuXAotICBQUk9WSURFIChldGV4dCA9IC4pO1xuXAotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgICAuID0gMHgxMDAwMDAwMDtcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuICs9IDB4MTAwMDAwMDAgLSAweDA0MDAwMDA7XG5cCi0gIC5kYXRhICAgIDpcblwKLSAge1xuXAotICAgIF9mZGF0YSA9IC4gO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKLSAgLmdvdCAgICAgICAgICAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCi0gIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCi0gIF9lZGF0YSAgPSAgLjtcblwKLSAgUFJPVklERSAoZWRhdGEgPSAuKTtcblwKLSAgX19ic3Nfc3RhcnQgPSAuO1xuXAotICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgICA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIF9lbmQgPSAuIDtcblwKLSAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCi0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAotICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuID0gMHg1ZmZlMDAwMCArIFNJWkVPRl9IRUFERVJTO1xuXAotICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgICA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgICAgLiA9IDB4MTAwMDAwMDA7XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLiArPSAweDEwMDAwO1xuXAotICAuZGF0YSAgICA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCi0gIC5nb3QgICAgICAgICAgIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAotICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAotICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgICAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCi0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAotICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuID0gMHgwNDAwMDAwO1xuXAotICAuaW50ZXJwICAgICA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgICA6XG5cCi0gIHtcblwKLSAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgX2V0ZXh0ID0gLjtcblwKLSAgUFJPVklERSAoZXRleHQgPSAuKTtcblwKLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgICAgLiA9IDB4MTAwMDAwMDA7XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLiArPSAweDEwMDAwMDAwIC0gMHgwNDAwMDAwO1xuXAotICAuZGF0YSAgICA6XG5cCi0gIHtcblwKLSAgICBfZmRhdGEgPSAuIDtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCi0gIC5nb3QgICAgICAgICAgIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAotICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAotICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAotICBfZWRhdGEgID0gIC47XG5cCi0gIFBST1ZJREUgKGVkYXRhID0gLik7XG5cCi0gIF9fYnNzX3N0YXJ0ID0gLjtcblwKLSAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgICAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICBfZW5kID0gLiA7XG5cCi0gIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2VsZjMyZWJtaXBfZW11bGF0aW9uID0gCi17Ci0gIGdsZGVsZjMyZWJtaXBfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGRlbGYzMmVibWlwX2dldF9zY3JpcHQsCi0gICJlbGYzMmVibWlwIiwKLSAgImVsZjMyLWJpZ21pcHMiLAotICBOVUxMLAotICBOVUxMLAotICBnbGRlbGYzMmVibWlwX29wZW5fZHluYW1pY19hcmNoaXZlLAotICBnbGRlbGYzMmVibWlwX3BsYWNlX29ycGhhbgotfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1lcHBjbWFjLmMgYi9sZC9tcHctZXBwY21hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA5YTQxLi4wMDAwMDAwCi0tLSBhL2xkL21wdy1lcHBjbWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogQUlYIGVtdWxhdGlvbiBjb2RlIGZvciBwcGNtYWNvcwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBBSVggc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfcHBjbWFjb3MKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0KLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdsZHBwY21hY29zX3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX3JlYWRfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2ZyZWUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19maW5kX3JlbG9jcwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkcHBjbWFjb3NfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi0vKiBUaGUgZmlsZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGVhY2ggc2VjdGlvbi4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotCi0vKiBUaGUgbWF4aW11bSBzaXplIHRoZSBzdGFjayBpcyBwZXJtaXR0ZWQgdG8gZ3Jvdy4gIFRoaXMgaXMgc3RvcmVkIGluCi0gICB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heHN0YWNrOwotCi0vKiBUaGUgbWF4aW11bSBkYXRhIHNpemUuICBUaGlzIGlzIHN0b3JlZCBpbiB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heGRhdGE7Ci0KLS8qIFdoZXRoZXIgdG8gcGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotc3RhdGljIGludCBnYyA9IDE7Ci0KLS8qIFRoZSBtb2R1bGUgdHlwZSB0byB1c2UuICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG1vZHR5cGUgPSAoJzEnIDw8IDgpIHwgJ0wnOwotCi0vKiBXaGV0aGVyIHRoZSAudGV4dCBzZWN0aW9uIG11c3QgYmUgcmVhZC1vbmx5IChpLmUuLCBubyByZWxvY3MKLSAgIHBlcm1pdHRlZCkuICAqLwotc3RhdGljIGludCB0ZXh0cm87Ci0KLS8qIFdoZXRoZXIgdG8gaW1wbGVtZW50IFVuaXggbGlrZSBsaW5rZXIgc2VtYW50aWNzLiAgKi8KLXN0YXRpYyBpbnQgdW5peF9sZDsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbXBvcnQgZmlsZSBsaXN0LiAgKi8KLQotc3RydWN0IGZpbGVsaXN0Ci17Ci0gIHN0cnVjdCBmaWxlbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLS8qIExpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmlsZWxpc3QgKmltcG9ydF9maWxlczsKLQotLyogTGlzdCBvZiBleHBvcnQgc3ltYm9scyByZWFkIGZyb20gdGhlIGV4cG9ydCBmaWxlcy4gICovCi0KLXN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QKLXsKLSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYm9vbGVhbiBzeXNjYWxsOwotfTsKLQotc3RhdGljIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKmV4cG9ydF9zeW1ib2xzOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGRvbmUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9wb3dlcnBjOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIEhhbmRsZSBBSVggc3BlY2lmaWMgb3B0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLWdsZHBwY21hY29zX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgaW5keDsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBsb25nIHZhbDsKLSAgY2hhciAqZW5kOwotCi0jZGVmaW5lIE9QVElPTl9JR05PUkUgKDMwMCkKLSNkZWZpbmUgT1BUSU9OX0FVVE9JTVAgKE9QVElPTl9JR05PUkUgKyAxKQotI2RlZmluZSBPUFRJT05fRVJOT1RPSyAoT1BUSU9OX0FVVE9JTVAgKyAxKQotI2RlZmluZSBPUFRJT05fRVJPSyAoT1BUSU9OX0VSTk9UT0sgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUIChPUFRJT05fRVJPSyArIDEpCi0jZGVmaW5lIE9QVElPTl9JTVBPUlQgKE9QVElPTl9FWFBPUlQgKyAxKQotI2RlZmluZSBPUFRJT05fTE9BRE1BUCAoT1BUSU9OX0lNUE9SVCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVhEQVRBIChPUFRJT05fTE9BRE1BUCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVhTVEFDSyAoT1BUSU9OX01BWERBVEEgKyAxKQotI2RlZmluZSBPUFRJT05fTU9EVFlQRSAoT1BUSU9OX01BWFNUQUNLICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PQVVUT0lNUCAoT1BUSU9OX01PRFRZUEUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9TVFJDTVBDVCAoT1BUSU9OX05PQVVUT0lNUCArIDEpCi0jZGVmaW5lIE9QVElPTl9QRCAoT1BUSU9OX05PU1RSQ01QQ1QgKyAxKQotI2RlZmluZSBPUFRJT05fUFQgKE9QVElPTl9QRCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVFJDTVBDVCAoT1BUSU9OX1BUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1VOSVggKE9QVElPTl9TVFJDTVBDVCArIDEpCi0KLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKLSAgICB7ImJhc2lzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmF1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAotICAgIHsiYmNvbXBybGQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiY3JsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJjcm9yMzEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiRCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCi0gICAgeyJiRSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUfSwKLSAgICB7ImJlcm5vdG9rIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk5PVE9LfSwKLSAgICB7ImJlcm9rIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk9LfSwKLSAgICB7ImJlcnJtc2ciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiZXhwb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAotICAgIHsiYmYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAotICAgIHsiYmdjIiwgbm9fYXJndW1lbnQsICZnYywgMX0sCi0gICAgeyJiaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJoYWx0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYkkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCi0gICAgeyJiaW1wb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBPUlR9LAotICAgIHsiYmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xPQURNQVB9LAotICAgIHsiYmxvYWRtYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xPQURNQVB9LAotICAgIHsiYm1heGRhdGEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWERBVEF9LAotICAgIHsiYm1heHN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCi0gICAgeyJiTSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9EVFlQRX0sCi0gICAgeyJibW9kdHlwZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9EVFlQRX0sCi0gICAgeyJibm9hdXRvaW1wIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsiYm5vZGVsY3NlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJibm9lbnRyeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJub2djIiwgbm9fYXJndW1lbnQsICZnYywgMH0sCi0gICAgeyJibnNvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsiYm5vc3RyY21wY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PU1RSQ01QQ1R9LAotICAgIHsiYm5vdGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAotICAgIHsiYm5ybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAwfSwKLSAgICB7ImJwRCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUER9LAotICAgIHsiYnBUIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QVH0sCi0gICAgeyJicm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMX0sCi0gICAgeyJiUyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYU1RBQ0t9LAotICAgIHsiYnNvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BVVRPSU1QfSwKLSAgICB7ImJzdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSQ01QQ1R9LAotICAgIHsiYnRleHRybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKLSAgICB7InN0YXRpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9BVVRPSU1QfSwKLSAgICB7InVuaXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1VOSVh9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLSAgfTsKLQotICAvKiBPcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgQUlYIGxpbmtlciB3aGljaCB3ZSBkbyBub3Qgc3VwcG9ydDogLWYsCi0gICAgIC1TLCAtdiwgLVosIC1iYmluZGNtZHMsIC1iYmluZGVyLCAtYmJpbmRvcHRzLCAtYmNhbGxzLCAtYmNhcHMsCi0gICAgIC1iY3JvcjE1LCAtYmRlYnVnb3B0LCAtYmRiZywgLWJkZWxjc2VjdCwgLWJleD8sIC1iZmlsZWxpc3QsIC1iZmwsCi0gICAgIC1iZ2NieXBhc3MsIC1iZ2xpbmssIC1iaW5zZXJ0LCAtYmksIC1ibG9hZG1hcCwgLWJsLCAtYm1hcCwgLWJubCwKLSAgICAgLWJub2JpbmQsIC1ibm9jb21wcmxkLCAtYm5vY3JsZCwgLWJub2Vycm1zZywgLWJub2dsaW5rLAotICAgICAtYm5vbG9hZG1hcCwgLWJubCwgLWJub29ianJlb3JkZXIsIC1ibm9xdWlldCwgLWJub3Jlb3JkZXIsCi0gICAgIC1ibm90eXBjaGssIC1ibm94LCAtYnF1aWV0LCAtYlIsIC1icmVuYW1lLCAtYnJlb3JkZXIsIC1idHlwY2hrLAotICAgICAtYngsIC1iWCwgLWJ4cmVmLiAgKi8KLQotICAvKiBJZiB0aGUgY3VycmVudCBvcHRpb24gc3RhcnRzIHdpdGggLWIsIGNoYW5nZSB0aGUgZmlyc3QgOiB0byBhbiA9LgotICAgICBUaGUgQUlYIGxpbmtlciB1c2VzIDogdG8gc2VwYXJhdGUgdGhlIG9wdGlvbiBmcm9tIHRoZSBhcmd1bWVudDsKLSAgICAgY2hhbmdpbmcgaXQgdG8gPSBsZXRzIHVzIHRyZWF0IGl0IGFzIGEgZ2V0b3B0IG9wdGlvbi4gICovCi0gIGluZHggPSBvcHRpbmQ7Ci0gIGlmIChpbmR4ID09IDApCi0gICAgaW5keCA9IDE7Ci0gIGlmIChpbmR4IDwgYXJnYyAmJiBzdHJuY21wIChhcmd2W2luZHhdLCAiLWIiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9IGFyZ3ZbaW5keF07ICpzICE9ICdcMCc7IHMrKykKLQl7Ci0JICBpZiAoKnMgPT0gJzonKQotCSAgICB7Ci0JICAgICAgKnMgPSAnPSc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIG9wdGVyciA9IDA7Ci0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLUQ6SDpLVDp6IiwgbG9uZ29wdHMsICZsb25naW5kKTsKLSAgb3B0ZXJyID0gcHJldm9wdGVycjsKLQotICBzd2l0Y2ggKG9wdGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBvcHRpbmQgPSBwcmV2b3B0aW5kOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIDA6Ci0gICAgICAvKiBMb25nIG9wdGlvbiB3aGljaCBqdXN0IHNldHMgYSBmbGFnLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRCc6Ci0gICAgICB2YWwgPSBzdHJ0b2wgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtRCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZSBpZiAodmFsICE9IC0xKQotCWxhbmdfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgZXhwX2ludG9wICh2YWwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSCc6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJwotCSAgfHwgKHZhbCAmICh2YWwgLSAxKSkgIT0gMCkKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLUggbnVtYmVyICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQlmaWxlX2FsaWduID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdLJzoKLSAgICBjYXNlICd6JzoKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgdGhlIHBhZ2Ugc2l6ZSBmb3IgdGhlIHRhcmdldCBzeXN0ZW0uICAqLwotICAgICAgZmlsZV9hbGlnbiA9IDQwOTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogT24gQUlYIHRoaXMgaXMgdGhlIHNhbWUgYXMgR05VIGxkIC1UdGV4dC4gIFdoZW4gd2Ugc2VlIC1UCi0gICAgICAgICBudW1iZXIsIHdlIGFzc3VtZSB0aGUgQUlYIG9wdGlvbiBpcyBpbnRlbmRlZC4gIE90aGVyd2lzZSwgd2UKLSAgICAgICAgIGFzc3VtZSB0aGUgdXN1YWwgR05VIGxkIC1UIG9wdGlvbiBpcyBpbnRlbmRlZC4gIFdlIGNhbid0IGp1c3QKLSAgICAgICAgIGlnbm9yZSB0aGUgQUlYIG9wdGlvbiwgYmVjYXVzZSBnY2MgcGFzc2VzIGl0IHRvIHRoZSBsaW5rZXIuICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JewotCSAgb3B0aW5kID0gcHJldm9wdGluZDsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi50ZXh0IiwgZXhwX2ludG9wICh2YWwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fSUdOT1JFOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9BVVRPSU1QOgotICAgICAgbGlua19pbmZvLnN0YXRpY19saW5rID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VSTk9UT0s6Ci0gICAgICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVJPSzoKLSAgICAgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VYUE9SVDoKLSAgICAgIGdsZHBwY21hY29zX3JlYWRfZmlsZSAob3B0YXJnLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0lNUE9SVDoKLSAgICAgIHsKLQlzdHJ1Y3QgZmlsZWxpc3QgKm47Ci0Jc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKLQotCW4gPSAoc3RydWN0IGZpbGVsaXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVsaXN0KSk7Ci0Jbi0+bmV4dCA9IE5VTEw7Ci0Jbi0+bmFtZSA9IG9wdGFyZzsKLQlmbHBwID0gJmltcG9ydF9maWxlczsKLQl3aGlsZSAoKmZscHAgIT0gTlVMTCkKLQkgIGZscHAgPSAmKCpmbHBwKS0+bmV4dDsKLQkqZmxwcCA9IG47Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0xPQURNQVA6Ci0gICAgICBjb25maWcubWFwX2ZpbGVuYW1lID0gb3B0YXJnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NQVhEQVRBOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1ibWF4ZGF0YSBudW1iZXIgJXNcbiIpLAotCSAgICAgICBvcHRhcmcpOwotICAgICAgZWxzZQotCW1heGRhdGEgPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01BWFNUQUNLOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1ibWF4c3RhY2sgbnVtYmVyICVzXG4iKSwKLQkgICAgICAgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltYXhzdGFjayA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTU9EVFlQRToKLSAgICAgIGlmICgqb3B0YXJnID09ICdTJykKLQl7Ci0JICBsaW5rX2luZm8uc2hhcmVkID0gdHJ1ZTsKLQkgICsrb3B0YXJnOwotCX0KLSAgICAgIGlmICgqb3B0YXJnID09ICdcMCcgfHwgb3B0YXJnWzFdID09ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIG1vZHVsZSB0eXBlICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltb2R0eXBlID0gKCpvcHRhcmcgPDwgOCkgfCBvcHRhcmdbMV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PQVVUT0lNUDoKLSAgICAgIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PU1RSQ01QQ1Q6Ci0gICAgICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUEQ6Ci0gICAgICAvKiBUaGlzIHNldHMgdGhlIHBhZ2UgdGhhdCB0aGUgLmRhdGEgc2VjdGlvbiBpcyBzdXBwb3NlZCB0bwotICAgICAgICAgc3RhcnQgb24uICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSBzaG91bGQgc3RpbGwgYmUgdGhlCi0gICAgICAgICBvZmZzZXQgd2l0aGluIHRoZSBmaWxlLCBzbyB3ZSBuZWVkIHRvIGJ1aWxkIGFuIGFwcHJvcHJpYXRlCi0gICAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcEQgbnVtYmVyICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBldHJlZV90eXBlICp0OwotCi0JICB0ID0gZXhwX2Jpbm9wICgnKycsCi0JCQkgZXhwX2ludG9wICh2YWwpLAotCQkJIGV4cF9iaW5vcCAoJyYnLAotCQkJCSAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpLAotCQkJCSAgICBleHBfaW50b3AgKDB4ZmZmKSkpOwotCSAgdCA9IGV4cF9iaW5vcCAoJyYnLAotCQkJIGV4cF9iaW5vcCAoJysnLCB0LCBleHBfaW50b3AgKDcpKSwKLQkJCSBleHBfaW50b3AgKH4gKGJmZF92bWEpIDcpKTsKLQkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgdCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QVDoKLSAgICAgIC8qIFRoaXMgc2V0IHRoZSBwYWdlIHRoYXQgdGhlIC50ZXh0IHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gc3RhcnQKLSAgICAgICAgIG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZSBvZmZzZXQKLSAgICAgICAgIHdpdGhpbiB0aGUgZmlsZS4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLXBUIG51bWJlciAlc1xuIiksIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JewotCSAgZXRyZWVfdHlwZSAqdDsKLQotCSAgdCA9IGV4cF9iaW5vcCAoJysnLAotCQkJIGV4cF9pbnRvcCAodmFsKSwKLQkJCSBleHBfbmFtZW9wIChTSVpFT0ZfSEVBREVSUywgTlVMTCkpOwotCSAgdCA9IGV4cF9iaW5vcCAoJyYnLAotCQkJIGV4cF9iaW5vcCAoJysnLCB0LCBleHBfaW50b3AgKDcpKSwKLQkJCSBleHBfaW50b3AgKH4gKGJmZF92bWEpIDcpKTsKLQkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi50ZXh0IiwgdCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TVFJDTVBDVDoKLSAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVU5JWDoKLSAgICAgIHVuaXhfbGQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGZpbGUgY2FuIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgQkZECi0gICBvYmplY3Qgb3IgYW4gYXJjaGl2ZS4gIElmIHRoZSBmaWxlIHN0YXJ0cyB3aXRoICMhLCB3ZSBtdXN0IHRyZWF0IGl0Ci0gICBhcyBhbiBpbXBvcnQgZmlsZS4gIFRoaXMgaXMgZm9yIEFJWCBjb21wYXRpYmlsaXR5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZHBwY21hY29zX3VucmVjb2duaXplZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIEZJTEUgKmU7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGUgPSBmb3BlbiAoZW50cnktPmZpbGVuYW1lLCBGT1BFTl9SVCk7Ci0gIGlmIChlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldCA9IGZhbHNlOwotCi0gIGlmIChnZXRjIChlKSA9PSAnIycgJiYgZ2V0YyAoZSkgPT0gJyEnKQotICAgIHsKLSAgICAgIHN0cnVjdCBmaWxlbGlzdCAqbjsKLSAgICAgIHN0cnVjdCBmaWxlbGlzdCAqKmZscHA7Ci0KLSAgICAgIG4gPSAoc3RydWN0IGZpbGVsaXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVsaXN0KSk7Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIG4tPm5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0gICAgICBmbHBwID0gJmltcG9ydF9maWxlczsKLSAgICAgIHdoaWxlICgqZmxwcCAhPSBOVUxMKQotCWZscHAgPSAmKCpmbHBwKS0+bmV4dDsKLSAgICAgICpmbHBwID0gbjsKLQotICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgIGVudHJ5LT5sb2FkZWQgPSB0cnVlOwotICAgIH0KLQotICBmY2xvc2UgKGUpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2FmdGVyX29wZW4gKCkKLXsKLSAgYm9vbGVhbiByOwotICBzdHJ1Y3Qgc2V0X2luZm8gKnA7Ci0KLSAgLyogQ2FsbCBsZGN0b3JfYnVpbGRfc2V0cywgYWZ0ZXIgcHJldGVuZGluZyB0aGF0IHRoaXMgaXMgYQotICAgICByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvIHRoaXMgYmVjYXVzZSBBSVggcmVxdWlyZXMgcmVsb2NhdGlvbgotICAgICBlbnRyaWVzIGZvciBhbGwgcmVmZXJlbmNlcyB0byBzeW1ib2xzLCBldmVuIGluIGEgZmluYWwKLSAgICAgZXhlY3V0YWJsZS4gIE9mIGNvdXJzZSwgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgaWYgd2UgYXJlCi0gICAgIHByb2R1Y2luZyBhbiBYQ09GRiBvdXRwdXQgZmlsZS4gICovCi0gIHIgPSBsaW5rX2luZm8ucmVsb2NhdGVhYmxlOwotICBpZiAoc3Ryc3RyIChiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCksICJ4Y29mZiIpICE9IE5VTEwpCi0gICAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gIGxkY3Rvcl9idWlsZF9zZXRzICgpOwotICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gcjsKLQotICAvKiBGb3IgZWFjaCBzZXQsIHJlY29yZCB0aGUgc2l6ZSwgc28gdGhhdCB0aGUgWENPRkYgYmFja2VuZCBjYW4KLSAgICAgb3V0cHV0IHRoZSBjb3JyZWN0IGNzZWN0IGxlbmd0aC4gICovCi0gIGZvciAocCA9IHNldHM7IHAgIT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgd2UgbWF5IGhhdmUgYmVlbiBpbnZva2VkIGZyb20KLQkgY29sbGVjdCwgYW5kIHRoZSBzZXRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCwgc28gd2UgZG8KLQkgbm90IGRvIGFueXRoaW5nLiAgKi8KLSAgICAgIGlmIChwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgcC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChwLT5yZWxvYyAhPSBCRkRfUkVMT0NfQ1RPUikKLQl7Ci0JICAvKiBIYW5kbGUgdGhpcyBpZiB3ZSBuZWVkIHRvLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgc2l6ZSA9IChwLT5jb3VudCArIDIpICogNDsKLSAgICAgIGlmICghIGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHAtPmgsIHNpemUpKQotCWVpbmZvIChfKCIlRiVQOiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0IGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgc3RydWN0IGZpbGVsaXN0ICpmbDsKLSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqZWw7Ci0gIGNoYXIgKmxpYnBhdGg7Ci0gIGFzZWN0aW9uICpzcGVjaWFsX3NlY3Rpb25zWzZdOwotICBpbnQgaTsKLQotICAvKiBIYW5kbGUgdGhlIGltcG9ydCBhbmQgZXhwb3J0IGZpbGVzLCBpZiBhbnkuICAqLwotICBmb3IgKGZsID0gaW1wb3J0X2ZpbGVzOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5uZXh0KQotICAgIGdsZHBwY21hY29zX3JlYWRfZmlsZSAoZmwtPm5hbWUsIHRydWUpOwotICBmb3IgKGVsID0gZXhwb3J0X3N5bWJvbHM7IGVsICE9IE5VTEw7IGVsID0gZWwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGVsLT5uYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JZWluZm8gKF8oIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIG9mIGV4cG9ydCBzeW1ib2wgZmFpbGVkOiAlRVxuIikpOwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGgsIGVsLT5zeXNjYWxsKSkKLQllaW5mbyAoXygiJVAlRjogYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLQotICAvKiBUcmFjayBkb3duIGFsbCByZWxvY2F0aW9ucyBjYWxsZWQgZm9yIGJ5IHRoZSBsaW5rZXIgc2NyaXB0ICh0aGVzZQotICAgICBhcmUgdHlwaWNhbGx5IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZW50cmllcyBjcmVhdGVkIGJ5Ci0gICAgIENPTlNUUlVDVE9SUykgYW5kIGxldCB0aGUgYmFja2VuZCBrbm93IGl0IHdpbGwgbmVlZCB0byBjcmVhdGUKLSAgICAgLmxvYWRlciByZWxvY3MgZm9yIHRoZW0uICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkcHBjbWFjb3NfZmluZF9yZWxvY3MpOwotCi0gIC8qIFdlIG5lZWQgdG8gYnVpbGQgTElCUEFUSCBmcm9tIHRoZSAtTCBhcmd1bWVudHMuICBJZiBhbnkgLXJwYXRoCi0gICAgIGFyZ3VtZW50cyB3ZXJlIHVzZWQsIHRob3VnaCwgd2UgdXNlIC1ycGF0aCBpbnN0ZWFkLCBhcyBhIEdOVQotICAgICBleHRlbnNpb24uICAqLwotICBpZiAoY29tbWFuZF9saW5lLnJwYXRoICE9IE5VTEwpCi0gICAgbGlicGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgZWxzZSBpZiAoc2VhcmNoX2hlYWQgPT0gTlVMTCkKLSAgICBsaWJwYXRoID0gKGNoYXIgKikgIiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKHNlYXJjaF9oZWFkLT5uYW1lKTsKLSAgICAgIGxpYnBhdGggPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cmNweSAobGlicGF0aCwgc2VhcmNoX2hlYWQtPm5hbWUpOwotICAgICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZC0+bmV4dDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQl7Ci0JICBzaXplX3QgbmxlbjsKLQotCSAgbmxlbiA9IHN0cmxlbiAoc2VhcmNoLT5uYW1lKTsKLQkgIGxpYnBhdGggPSB4cmVhbGxvYyAobGlicGF0aCwgbGVuICsgbmxlbiArIDIpOwotCSAgbGlicGF0aFtsZW5dID0gJzonOwotCSAgc3RyY3B5IChsaWJwYXRoICsgbGVuICsgMSwgc2VhcmNoLT5uYW1lKTsKLQkgIGxlbiArPSBubGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIExldCB0aGUgWENPRkYgYmFja2VuZCBzZXQgdXAgdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0gIGlmICghIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGxpYnBhdGgsCi0JCQkJCSBlbnRyeV9zeW1ib2wsIGZpbGVfYWxpZ24sCi0JCQkJCSBtYXhzdGFjaywgbWF4ZGF0YSwKLQkJCQkJIGdjICYmICEgdW5peF9sZCA/IHRydWUgOiBmYWxzZSwKLQkJCQkJIG1vZHR5cGUsCi0JCQkJCSB0ZXh0cm8gPyB0cnVlIDogZmFsc2UsCi0JCQkJCSB1bml4X2xkLAotCQkJCQkgc3BlY2lhbF9zZWN0aW9ucykpCi0gICAgZWluZm8gKF8oIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIikpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3BlY2lhbCBzZWN0aW9ucywgYW5kIHB1dCB0aGVtIGluIHRoZSByaWdodAotICAgICBwbGFjZSBpbiB0aGUgbGluayBvcmRlcmluZy4gIFRoaXMgaXMgZXNwZWNpYWxseSBtYWdpYy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnBsczsKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppczsKLSAgICAgIGNvbnN0IGNoYXIgKm9uYW1lOwotICAgICAgYm9vbGVhbiBzdGFydDsKLQotICAgICAgc2VjID0gc3BlY2lhbF9zZWN0aW9uc1tpXTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogUmVtb3ZlIHRoaXMgc2VjdGlvbiBmcm9tIHRoZSBsaXN0IG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4KLSAgICAgICAgIFRoaXMgYXNzdW1lcyB3ZSBrbm93IHdoYXQgdGhlIHNjcmlwdCBsb29rcyBsaWtlLiAgKi8KLSAgICAgIGlzID0gTlVMTDsKLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGlmIChvcyA9PSBOVUxMKQotCWVpbmZvIChfKCIlUCVGOiBjYW4ndCBmaW5kIG91dHB1dCBzZWN0aW9uICVzXG4iKSwKLQkgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBmb3IgKHBscyA9ICZvcy0+Y2hpbGRyZW4uaGVhZDsgKnBscyAhPSBOVUxMOyBwbHMgPSAmKCpwbHMpLT5uZXh0KQotCXsKLQkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JICAgICAgJiYgKCpwbHMpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24gPT0gc2VjKQotCSAgICB7Ci0JICAgICAgaXMgPSAobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKikgKnBsczsKLQkgICAgICAqcGxzID0gKCpwbHMpLT5uZXh0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoKCpwbHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW0pCi0JICAgIHsKLQkgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHdsczsKLQotCSAgICAgIGZvciAocHdscyA9ICYoKnBscyktPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQ7Ci0JCSAgICpwd2xzICE9IE5VTEw7Ci0JCSAgIHB3bHMgPSAmKCpwd2xzKS0+bmV4dCkKLQkJewotCQkgIGlmICgoKnB3bHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCQkgICAgICAmJiAoKnB3bHMpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24gPT0gc2VjKQotCQkgICAgewotCQkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcHdsczsKLQkJICAgICAgKnB3bHMgPSAoKnB3bHMpLT5uZXh0OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmIChpcyAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0JCi0KLSAgICAgIGlmIChpcyA9PSBOVUxMKQotCWVpbmZvIChfKCIlUCVGOiBjYW4ndCBmaW5kICVzIGluIG91dHB1dCBzZWN0aW9uXG4iKSwKLQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKHNlYy0+b3duZXIsIHNlYykpOwotCi0gICAgICAvKiBOb3cgZmlndXJlIG91dCB3aGVyZSB0aGUgc2VjdGlvbiBzaG91bGQgZ28uICAqLwotICAgICAgc3dpdGNoIChpKQotCXsKLQlkZWZhdWx0OiAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLwotCWNhc2UgMDoKLQkgIC8qIF90ZXh0ICovCi0JICBvbmFtZSA9ICIudGV4dCI7Ci0JICBzdGFydCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAvKiBfZXRleHQgKi8KLQkgIG9uYW1lID0gIi50ZXh0IjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICAvKiBfZGF0YSAqLwotCSAgb25hbWUgPSAiLmRhdGEiOwotCSAgc3RhcnQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgLyogX2VkYXRhICovCi0JICBvbmFtZSA9ICIuZGF0YSI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkgIC8qIF9lbmQgYW5kIGVuZCAqLwotCSAgb25hbWUgPSAiLmJzcyI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAob25hbWUpOwotCi0gICAgICBpZiAoc3RhcnQpCi0JewotCSAgaXMtPmhlYWRlci5uZXh0ID0gb3MtPmNoaWxkcmVuLmhlYWQ7Ci0JICBvcy0+Y2hpbGRyZW4uaGVhZCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpcy0+aGVhZGVyLm5leHQgPSBOVUxMOwotCSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmb3MtPmNoaWxkcmVuLAotCQkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBpcywKLQkJCQkgJmlzLT5oZWFkZXIubmV4dCk7Ci0JfQotICAgIH0KLX0KLQotLyogUmVhZCBhbiBpbXBvcnQgb3IgZXhwb3J0IGZpbGUuICBGb3IgYW4gaW1wb3J0IGZpbGUsIHRoaXMgaXMgY2FsbGVkCi0gICBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gZW11bGF0aW9uIHJvdXRpbmUuICBGb3IgYW4gZXhwb3J0IGZpbGUsCi0gICB0aGlzIGlzIGNhbGxlZCBieSB0aGUgcGFyc2VfYXJncyBlbXVsYXRpb24gcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19yZWFkX2ZpbGUgKGZpbGVuYW1lLCBpbXBvcnQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBib29sZWFuIGltcG9ydDsKLXsKLSAgc3RydWN0IG9ic3RhY2sgKm87Ci0gIEZJTEUgKmY7Ci0gIGludCBsaW5lbm87Ci0gIGludCBjOwotICBib29sZWFuIGtlZXA7Ci0gIGNvbnN0IGNoYXIgKmltcHBhdGg7Ci0gIGNvbnN0IGNoYXIgKmltcGZpbGU7Ci0gIGNvbnN0IGNoYXIgKmltcG1lbWJlcjsKLQotICBvID0gKHN0cnVjdCBvYnN0YWNrICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG9ic3RhY2spKTsKLSAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKG8sIDAsIDAsIHhtYWxsb2MsIGdsZHBwY21hY29zX2ZyZWUpOwotCi0gIGYgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1JUKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZWluZm8gKCIlRiVzOiAlRVxuIiwgZmlsZW5hbWUpOwotICAgIH0KLQotICBrZWVwID0gZmFsc2U7Ci0KLSAgaW1wcGF0aCA9IE5VTEw7Ci0gIGltcGZpbGUgPSBOVUxMOwotICBpbXBtZW1iZXIgPSBOVUxMOwotCi0gIGxpbmVubyA9IDA7Ci0gIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0gICAgICBib29sZWFuIHN5c2NhbGw7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaWYgKGMgIT0gJ1xuJykKLQl7Ci0JICBvYnN0YWNrXzFncm93IChvLCBjKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgb2JzdGFja18xZ3JvdyAobywgJ1wwJyk7Ci0gICAgICArK2xpbmVubzsKLQotICAgICAgcyA9IChjaGFyICopIG9ic3RhY2tfYmFzZSAobyk7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkrK3M7Ci0gICAgICBpZiAoKnMgPT0gJ1wwJwotCSAgfHwgKnMgPT0gJyonCi0JICB8fCAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyAnKQotCSAgfHwgKCEgaW1wb3J0ICYmICpzID09ICcjJyAmJiBzWzFdID09ICchJykpCi0JewotCSAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCpzID09ICcjJyAmJiBzWzFdID09ICchJykKLQl7Ci0JICBzICs9IDI7Ci0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgICAgKytzOwotCSAgaWYgKCpzID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpbXBwYXRoID0gTlVMTDsKLQkgICAgICBpbXBmaWxlID0gTlVMTDsKLQkgICAgICBpbXBtZW1iZXIgPSBOVUxMOwotCSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpzID09ICcoJykKLQkgICAgZWluZm8gKF8oIiVGJXMlZDogIyEgKFttZW1iZXJdKSBpcyBub3Qgc3VwcG9ydGVkIGluIGltcG9ydCBmaWxlc1xuIiksCi0JCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciBjczsKLQkgICAgICBjaGFyICpmaWxlOwotCi0JICAgICAgKHZvaWQpIG9ic3RhY2tfZmluaXNoIChvKTsKLQkgICAgICBrZWVwID0gdHJ1ZTsKLQkgICAgICBpbXBwYXRoID0gczsKLQkgICAgICBmaWxlID0gTlVMTDsKLQkgICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICcoJyAmJiAqcyAhPSAnXDAnKQotCQl7Ci0JCSAgaWYgKCpzID09ICcvJykKLQkJICAgIGZpbGUgPSBzICsgMTsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoZmlsZSAhPSBOVUxMKQotCQl7Ci0JCSAgZmlsZVstMV0gPSAnXDAnOwotCQkgIGltcGZpbGUgPSBmaWxlOwotCQkgIGlmIChpbXBwYXRoID09IGZpbGUgLSAxKQotCQkgICAgaW1wcGF0aCA9ICIvIjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGltcGZpbGUgPSBpbXBwYXRoOwotCQkgIGltcHBhdGggPSAiIjsKLQkJfQotCSAgICAgIGNzID0gKnM7Ci0JICAgICAgKnMgPSAnXDAnOwotCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3MpKQotCQl7Ci0JCSAgKytzOwotCQkgIGNzID0gKnM7Ci0JCX0KLQkgICAgICBpZiAoY3MgIT0gJygnKQotCQl7Ci0JCSAgaW1wbWVtYmVyID0gIiI7Ci0JCSAgaWYgKGNzICE9ICdcMCcpCi0JCSAgICBlaW5mbyAoXygiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQgZmlsZVxuIiksCi0JCQkgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICsrczsKLQkJICBpbXBtZW1iZXIgPSBzOwotCQkgIHdoaWxlICgqcyAhPSAnKScgJiYgKnMgIT0gJ1wwJykKLQkJICAgICsrczsKLQkJICBpZiAoKnMgPT0gJyknKQotCQkgICAgKnMgPSAnXDAnOwotCQkgIGVsc2UKLQkJICAgIGVpbmZvIChfKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iKSwKLQkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIHRvIGJlIGltcG9ydGVkIG9yIGV4cG9ydGVkLiAgKi8KLSAgICAgIHN5bW5hbWUgPSBzOwotICAgICAgc3lzY2FsbCA9IGZhbHNlOwotICAgICAgYWRkcmVzcyA9IChiZmRfdm1hKSAtMTsKLQotICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSAmJiAqcyAhPSAnXDAnKQotCSsrczsKLSAgICAgIGlmICgqcyAhPSAnXDAnKQotCXsKLQkgIGNoYXIgKnNlOwotCi0JICAqcysrID0gJ1wwJzsKLQotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JICAgICsrczsKLQotCSAgc2UgPSBzOwotCSAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkgJiYgKnNlICE9ICdcMCcpCi0JICAgICsrc2U7Ci0JICBpZiAoKnNlICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAqc2UrKyA9ICdcMCc7Ci0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqc2UpKQotCQkrK3NlOwotCSAgICAgIGlmICgqc2UgIT0gJ1wwJykKLQkJZWluZm8gKF8oIiVzJWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgIH0KLQotCSAgaWYgKHN0cmNhc2VjbXAgKHMsICJzdmMiKSA9PSAwCi0JICAgICAgfHwgc3RyY2FzZWNtcCAocywgInN5c2NhbGwiKSA9PSAwKQotCSAgICBzeXNjYWxsID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmVuZDsKLQotCSAgICAgIGFkZHJlc3MgPSBzdHJ0b3VsIChzLCAmZW5kLCAwKTsKLQkgICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCQllaW5mbyAoXygiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGltcG9ydCkKLQl7Ci0JICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpuOwotCi0JICBsZGxhbmdfYWRkX3VuZGVmIChzeW1uYW1lKTsKLQkgIG4gPSAoKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKikKLQkgICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0KSkpOwotCSAgbi0+bmV4dCA9IGV4cG9ydF9zeW1ib2xzOwotCSAgbi0+bmFtZSA9IGJ1eXN0cmluZyAoc3ltbmFtZSk7Ci0JICBuLT5zeXNjYWxsID0gc3lzY2FsbDsKLQkgIGV4cG9ydF9zeW1ib2xzID0gbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgc3ltbmFtZSwgZmFsc2UsIGZhbHNlLAotCQkJCSAgICB0cnVlKTsKLQkgIGlmIChoID09IE5VTEwgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiBqdXN0IGlnbm9yZSBhdHRlbXB0cyB0byBpbXBvcnQgYW4gdW5yZWZlcmVuY2VkCi0JCSBzeW1ib2wuICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwKLQkJCQkJICAgICBhZGRyZXNzLCBpbXBwYXRoLCBpbXBmaWxlLAotCQkJCQkgICAgIGltcG1lbWJlcikpCi0JCWVpbmZvIChfKCIlWCVzOiVkOiBmYWlsZWQgdG8gaW1wb3J0IHN5bWJvbCAlczogJUVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubywgc3ltbmFtZSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0gICAgfQotCi0gIGlmIChvYnN0YWNrX29iamVjdF9zaXplIChvKSA+IDApCi0gICAgewotICAgICAgZWluZm8gKF8oIiVzOiVkOiB3YXJuaW5nOiBpZ25vcmluZyB1bnRlcm1pbmF0ZWQgbGFzdCBsaW5lXG4iKSwKLQkgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwotICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLSAgICB9Ci0KLSAgaWYgKCEga2VlcCkKLSAgICB7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIE5VTEwpOwotICAgICAgZnJlZSAobyk7Ci0gICAgfQotfQotCi0vKiBUaGlzIHJvdXRpbmUgc2F2ZXMgdXMgZnJvbSB3b3JyeWluZyBhYm91dCBkZWNsYXJpbmcgZnJlZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19mcmVlIChwKQotICAgICBQVFIgcDsKLXsKLSAgZnJlZSAocCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb29rcyBmb3IgcmVsb2NhdGlvbnMgYW5kIGFzc2lnbm1lbnRzCi0gICB0byBzeW1ib2xzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2ZpbmRfcmVsb2NzIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bSkKLSAgICB7Ci0gICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyczsKLQotICAgICAgcnMgPSAmcy0+cmVsb2Nfc3RhdGVtZW50OwotICAgICAgaWYgKHJzLT5uYW1lID09IE5VTEwpCi0JZWluZm8gKF8oIiVGJVA6IG9ubHkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBwZXJtaXR0ZWRcbiIpKTsKLSAgICAgIGlmICghIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBycy0+bmFtZSkpCi0JZWluZm8gKF8oIiVGJVA6IGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci0KLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSkKLSAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKLQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCi0JCQkJCQkgIGV4cC0+YXNzaWduLmRzdCkpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iKSwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZHBwY21hY29zX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi1FTlRSWShfX3N0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKLSAgLnRleHQgMCA6IHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcInhjb2ZmLXBvd2VybWFjXCIpXG5cCi1PVVRQVVRfQVJDSChwb3dlcnBjKVxuXAotRU5UUlkoX19zdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCi0gIC50ZXh0IDAgOiB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgKigucncpXG5cCi0gICAgKiguc3YpXG5cCi0gICAgKigudWEpXG5cCi0gICAgLiA9IEFMSUdOKDQpO1xuXAotICAgICooLmRzKVxuXAotICAgICooLnRjMClcblwKLSAgICAqKC50YylcblwKLSAgICAqKC50ZClcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKC5icylcblwKLSAgICAqKC51YylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYXBwbGUtbWFjb3MvbGliKTtcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAgIDoge1xuXAotICAgIFBST1ZJREUgKF90ZXh0ID0gLik7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgICBQUk9WSURFIChfZXRleHQgPSAuKTtcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgIFBST1ZJREUgKF9kYXRhID0gLik7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICAgIFBST1ZJREUgKF9lZGF0YSA9IC4pO1xuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgIFBST1ZJREUgKF9lbmQgPSAuKTtcblwKLSAgICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcInhjb2ZmLXBvd2VybWFjXCIpXG5cCi1PVVRQVVRfQVJDSChwb3dlcnBjKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFwcGxlLW1hY29zL2xpYik7XG5cCi1FTlRSWShfX3N0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKLSAgLnRleHQgICA6IHtcblwKLSAgICBQUk9WSURFIChfdGV4dCA9IC4pO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucHIpXG5cCi0gICAgKigucm8pXG5cCi0gICAgKiguZGIpXG5cCi0gICAgKiguZ2wpXG5cCi0gICAgKigueG8pXG5cCi0gICAgKigudGkpXG5cCi0gICAgKigudGIpXG5cCi0gICAgUFJPVklERSAoX2V0ZXh0ID0gLik7XG5cCi0gIH1cblwKLSAgLmRhdGEgMCA6IHtcblwKLSAgICBQUk9WSURFIChfZGF0YSA9IC4pO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgKigucncpXG5cCi0gICAgKiguc3YpXG5cCi0gICAgKigudWEpXG5cCi0gICAgLiA9IEFMSUdOKDQpO1xuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICAgICooLmRzKVxuXAotICAgICooLnRjMClcblwKLSAgICAqKC50YylcblwKLSAgICAqKC50ZClcblwKLSAgICBQUk9WSURFIChfZWRhdGEgPSAuKTtcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKC5icylcblwKLSAgICAqKC51YylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICBQUk9WSURFIChfZW5kID0gLik7XG5cCi0gICAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIH1cblwKLSAgLmxvYWRlciAwIDoge1xuXAotICAgICooLmxvYWRlcilcblwKLSAgfVxuXAotICAuZGVidWcgMCA6IHtcblwKLSAgICAqKC5kZWJ1ZylcblwKLSAgfVxuXAotfVxuXG4iCi0gIDsgZWxzZSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYXBwbGUtbWFjb3MvbGliKTtcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAgIDoge1xuXAotICAgIFBST1ZJREUgKF90ZXh0ID0gLik7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgICBQUk9WSURFIChfZXRleHQgPSAuKTtcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgIFBST1ZJREUgKF9kYXRhID0gLik7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICAgIFBST1ZJREUgKF9lZGF0YSA9IC4pO1xuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgIFBST1ZJREUgKF9lbmQgPSAuKTtcblwKLSAgICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLTsgfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX3BwY21hY29zX2VtdWxhdGlvbiA9IAotewotICBnbGRwcGNtYWNvc19iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkcHBjbWFjb3NfYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGRwcGNtYWNvc19iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkcHBjbWFjb3NfZ2V0X3NjcmlwdCwKLSAgInBwY21hY29zIiwKLSAgInhjb2ZmLXBvd2VybWFjIiwKLSAgMCwJLyogZmluaXNoICovCi0gIDAsCS8qIGNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICovCi0gIDAsCS8qIG9wZW5fZHluYW1pY19hcmNoaXZlICovCi0gIDAsCS8qIHBsYWNlX29ycGhhbiAqLwotICAwLAkvKiBzZXRfc3ltYm9scyAqLwotICBnbGRwcGNtYWNvc19wYXJzZV9hcmdzLAotICBnbGRwcGNtYWNvc191bnJlY29nbml6ZWRfZmlsZQotfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1lc2guYyBiL2xkL21wdy1lc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiYzVmNS4uMDAwMDAwMAotLS0gYS9sZC9tcHctZXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiBzaAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX3NoCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGRzaF9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZHNoX2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZHNoX2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfc2g7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkc2hfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotY29uY2F0KAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLU1FTU9SWVxuXAote1xuXAotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAotfVxuXAotICIsIiBTRUNUSU9OU1xuXAote1xuXAotICIsIiAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICB9IFxuXAotICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gXG5cCi0gIiwiICAuZGF0YSA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICB9IFxuXAotICIsIiAuYnNzIDpcblwKLSAge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfSBcblwKLSAiLCIgLnN0YWNrICAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhY2spXG5cCi0gIH0gXG5cCi0gIiwiIC5zdGFiIDAgIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgLnN0YWJzdHIgMCAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLSAiLCIgTUVNT1JZXG5cCi17XG5cCi0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCi19XG5cCi0gIiwiIFNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gIH0gXG5cCi0gIiwiICAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9IFxuXAotICIsIiAgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH0gXG5cCi0gIiwiICAgLmJzcyA6XG5cCi0gIHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH0gXG5cCi0gIiwiICAgLnN0YWNrICAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhY2spXG5cCi0gIH0gXG5cCi0gIiwiICAgLnN0YWIgMCAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAgIC5zdGFic3RyIDAgIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKLU9VVFBVVF9BUkNIKHNoKVxuXAotTUVNT1JZXG5cCi17XG5cCi0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCi19XG5cCi1TRUNUSU9OU1xuXAote1xuXAotICIsIiAgIC50ZXh0IDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3RyaW5ncylcblwKLSAgICAgX2V0ZXh0ID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC50b3JzIDpcblwKLSAge1xuXAotICAgIF9fX2N0b3JzID0gLiA7XG5cCi0gICAgKiguY3RvcnMpXG5cCi0gICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCi0gICAgX19fZHRvcnMgPSAuIDtcblwKLSAgICAqKC5kdG9ycylcblwKLSAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuZGF0YSA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICBfZWRhdGEgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmJzcyA6XG5cCi0gIHtcblwKLSAgICAgX2Jzc19zdGFydCA9IC4gOyBcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgIF9lbmQgPSAuIDsgIFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFjayAgMHgzMDAwMCAgIDpcblwKLSAge1xuXAotICAgICBfc3RhY2sgPSAuIDsgXG5cCi0gICAgKiguc3RhY2spXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWIgMCAoTk9MT0FEKSA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFiKVxuXAotICB9XG5cCi0gIiwiICAgLnN0YWJzdHIgMCAoTk9MT0FEKSA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFic3RyKVxuXAotICB9XG5cCi19XG5cbiIsIE5VTEwpCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAotT1VUUFVUX0FSQ0goc2gpXG5cCi1NRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICAgICBfZXRleHQgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgIF9lZGF0YSA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuYnNzIDpcblwKLSAge1xuXAotICAgICBfYnNzX3N0YXJ0ID0gLiA7IFxuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICAgX2VuZCA9IC4gOyAgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWNrICAweDMwMDAwICAgOlxuXAotICB7XG5cCi0gICAgIF9zdGFjayA9IC4gOyBcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhYiAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgICAuc3RhYnN0ciAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAotT1VUUFVUX0FSQ0goc2gpXG5cCi1NRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICAgICBfZXRleHQgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgIF9lZGF0YSA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuYnNzIDpcblwKLSAge1xuXAotICAgICBfYnNzX3N0YXJ0ID0gLiA7IFxuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICAgX2VuZCA9IC4gOyAgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWNrICAweDMwMDAwICAgOlxuXAotICB7XG5cCi0gICAgIF9zdGFjayA9IC4gOyBcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhYiAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgICAuc3RhYnN0ciAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLTsgfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX3NoX2VtdWxhdGlvbiA9IAotewotICBnbGRzaF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZHNoX2dldF9zY3JpcHQsCi0gICJzaCIsCi0gICJjb2ZmLXNoIgotfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1pZHRtaXBzLmMgYi9sZC9tcHctaWR0bWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGRkYzcwLi4wMDAwMDAwCi0tLSBhL2xkL21wdy1pZHRtaXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBIYW5kbGUgZW1iZWRkZWQgcmVsb2NzIGZvciBNSVBTLgotICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiBiYXNlZCBvbiBnZW5lcmljLmVtLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19taXBzaWR0Ci0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGRtaXBzaWR0X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRtaXBzaWR0X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2hlY2tfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGRtaXBzaWR0X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZG1pcHNpZHRfYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9taXBzOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcnVuIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4KLSAgIFdlIGNyZWF0ZSBhIC5yZWwuc2RhdGEgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBmaWxlIHdpdGggYSBub24gemVybwotICAgLnNkYXRhIHNlY3Rpb24uICBUaGUgQkZEIGJhY2tlbmQgd2lsbCBmaWxsIGluIHRoZXNlIHNlY3Rpb25zIHdpdGgKLSAgIG1hZ2ljIG51bWJlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVsb2NhdGUgdGhlIGRhdGEgc2VjdGlvbiBhdCBydW4KLSAgIHRpbWUuICBUaGlzIHdpbGwgb25seSBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgYWxsIHRoZSBpbnB1dCBmaWxlcwotICAgaGF2ZSBiZWVuIGNvbXBpbGVkIHVzaW5nIC1tZW1iZWRkZWQtcGljLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZG1pcHNpZHRfYWZ0ZXJfb3BlbiAoKQotewotICBiZmQgKmFiZmQ7Ci0KLSAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcwotICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YXNlYzsKLQotICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVsb2NfY291bnQgZmllbGQgaGFzIGFscmVhZHkKLSAgICAgICAgIGJlZW4gc2V0IHVwLiAgV2UgY291bGQgY2FsbCBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBidXQKLSAgICAgICAgIHRoYXQgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG1lbW9yeSBidWZmZXIgcmF0aGVyIHRoYW4gYSByZWxvYwotICAgICAgICAgY291bnQuICBXZSBkbyBub3Qgd2FudCB0byBjYWxsIGJmZF9jYW5vbmljYWxpemVfcmVsb2MsCi0gICAgICAgICBiZWNhdXNlIGFsdGhvdWdoIGl0IHdvdWxkIGFsd2F5cyB3b3JrIGl0IHdvdWxkIGZvcmNlIHVzIHRvCi0gICAgICAgICByZWFkIGluIHRoZSByZWxvY3MgaW50byBCRkQgY2Fub25pY2FsIGZvcm0sIHdoaWNoIHdvdWxkIHdhc3RlCi0gICAgICAgICBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIGFuZCBtZW1vcnkuICAqLwotICAgICAgaWYgKGRhdGFzZWMgIT0gTlVMTCAmJiBkYXRhc2VjLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgYXNlY3Rpb24gKnJlbHNlYzsKLQotCSAgcmVsc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yZWwuc2RhdGEiKTsKLQkgIGlmIChyZWxzZWMgPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCByZWxzZWMsCi0JCQkJCSAgKFNFQ19BTExPQwotCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkpKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcmVsc2VjLCAyKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbHNlYywKLQkJCQkJIGRhdGFzZWMtPnJlbG9jX2NvdW50ICogNCkpCi0JICAgIGVpbmZvIChfKCIlRiVCOiBjYW4gbm90IGNyZWF0ZSAucmVsLnNkYXRhIHNlY3Rpb246ICVFXG4iKSk7Ci0JfQotCi0gICAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBhbGwgb3RoZXIgZGF0YSBzZWN0aW9ucyBhcmUgZW1wdHksIGFzIGlzCi0gICAgICAgICByZXF1aXJlZCBmb3IgZW1iZWRkZWQgUElDIGNvZGUuICAqLwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBjaGVja19zZWN0aW9ucywgKFBUUikgZGF0YXNlYyk7Ci0gICAgfQotfQotCi0vKiBDaGVjayB0aGF0IG9mIHRoZSBkYXRhIHNlY3Rpb25zLCBvbmx5IHRoZSAuc2RhdGEgc2VjdGlvbiBoYXMKLSAgIHJlbG9jcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfc2VjdGlvbnMgKGFiZmQsIHNlYywgc2RhdGFzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHNkYXRhc2VjOwotewotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKSA9PSAwCi0gICAgICAmJiBzZWMgIT0gKGFzZWN0aW9uICopIHNkYXRhc2VjCi0gICAgICAmJiBzZWMtPnJlbG9jX2NvdW50ICE9IDApCi0gICAgZWluZm8gKF8oIiVGJVg6IHNlY3Rpb24gJXMgaGFzIHJlbG9jczsgY2FuIG5vdCB1c2UgLS1lbWJlZGRlZC1yZWxvY3NcbiIpLAotCSAgIGFiZmQsIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIG9mZnNldHMgaGF2ZQotICAgYmVlbiBzZXQuICBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBlbWJlZGRlZCByZWxvY3MsIGl0IGNhbGxzIGEgc3BlY2lhbAotICAgQkZEIGJhY2tlbmQgcm91dGluZSB0byBkbyB0aGUgd29yay4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRtaXBzaWR0X2FmdGVyX2FsbG9jYXRpb24gKCkKLXsKLSAgYmZkICphYmZkOwotCi0gIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKLSAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFzZWMsICpyZWxzZWM7Ci0gICAgICBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOwotCi0gICAgICBpZiAoZGF0YXNlYyA9PSBOVUxMIHx8IGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHJlbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbC5zZGF0YSIpOwotICAgICAgQVNTRVJUIChyZWxzZWMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MgKGFiZmQsICZsaW5rX2luZm8sCi0JCQkJCQkgICBkYXRhc2VjLCByZWxzZWMsCi0JCQkJCQkgICAmZXJybXNnKSkKLQl7Ci0JICBpZiAoZXJybXNnID09IE5VTEwpCi0JICAgIGVpbmZvIChfKCIlQiVYOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlRVxuIiksCi0JCSAgIGFiZmQpOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVglQjogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJXNcbiIpLAotCQkgICBhYmZkLCBlcnJtc2cpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZG1pcHNpZHRfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotY29uY2F0KAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAudGV4dCA6IHtcblwKLSAgICA7XG5cCi0gICAgKiguaW5pdClcblwKLSAgICA7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5yZWwuc2RhdGEpXG5cCi0gICAgKiguZmluaSlcblwKLSAgICA7XG5cCi0gICAgO1xuXAotICB9XG5cCi0gIiwiICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICB9XG5cCi0gIC5saXQ0IDoge1xuXAotICAgICooLmxpdDQpXG5cCi0gIH1cblwKLSAiLCIgIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAudGV4dCA6IHtcblwKLSAgICA7XG5cCi0gICAgKiguaW5pdClcblwKLSAgICA7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5yZWwuc2RhdGEpXG5cCi0gICAgKiguZmluaSlcblwKLSAgICA7XG5cCi0gICAgO1xuXAotICB9XG5cCi0gIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICB9XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICAuc2RhdGEgOiB7XG5cCi0gICAgKiguc2RhdGEpXG5cCi0gIH1cblwKLSAgLnNic3MgOiB7XG5cCi0gICAgKiguc2JzcylcblwKLSAgICAqKC5zY29tbW9uKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4KLWNvbmNhdCgKLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLiA9IDB4YTAwMTIwMDA7XG5cCi0gIC50ZXh0IDoge1xuXAotICAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgICBlcHJvbCAgPSAgLjtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAotICAgICooLmZpbmkpXG5cCi0gICAgIGV0ZXh0ICA9ICAuO1xuXAotICAgICBfZXRleHQgID0gIC47XG5cCi0iLCIgIH1cblwKLSAgLiA9IC47XG5cCi0gIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAgX2ZkYXRhID0gQUxJR04oMTYpO1xuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gICBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICAuc2RhdGEgOiB7XG5cCi0gICAgKiguc2RhdGEpXG5cCi0gIH1cblwKLSIsIiAgIGVkYXRhICA9ICAuO1xuXAotICAgX2VkYXRhICA9ICAuO1xuXAotICAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgIGVuZCA9IC47XG5cCi0gICBfZW5kID0gLjtcblwKLX1cblxuIgotLCBOVUxMKQotICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC4gPSAweGEwMDEyMDAwO1xuXAotICAudGV4dCA6IHtcblwKLSAgICAgX2Z0ZXh0ID0gLiA7XG5cCi0gICAgKiguaW5pdClcblwKLSAgICAgZXByb2wgID0gIC47XG5cCi0gICAgKigudGV4dClcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgPSAuKTtcblwKLSAgICAqKC5yZWwuc2RhdGEpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0b3AgPSAuKTtcblwKLSAgICAqKC5maW5pKVxuXAotICAgICBldGV4dCAgPSAgLjtcblwKLSAgICAgX2V0ZXh0ICA9ICAuO1xuXAotICIsIiAgfVxuXAotICAuID0gLjtcblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gICBfZmRhdGEgPSBBTElHTigxNik7XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtcblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAiLCIgIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICAuc2RhdGEgOiB7XG5cCi0gICAgKiguc2RhdGEpXG5cCi0gIH1cblwKLSAgIGVkYXRhICA9ICAuO1xuXAotICAgX2VkYXRhICA9ICAuO1xuXAotICAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIiwiICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gICBlbmQgPSAuO1xuXAotICAgX2VuZCA9IC47XG5cCi19XG5cbiIKLSwgTlVMTCkKLSAgOyBlbHNlIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLiA9IDB4YTAwMTIwMDA7XG5cCi0gIC50ZXh0IDoge1xuXAotICAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgICBlcHJvbCAgPSAgLjtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAotICAgICooLmZpbmkpXG5cCi0gICAgIGV0ZXh0ICA9ICAuO1xuXAotICAgICBfZXRleHQgID0gIC47XG5cCi0gIiwiICB9XG5cCi0gIC4gPSAuO1xuXAotICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgIF9mZGF0YSA9IEFMSUdOKDE2KTtcblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO1xuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICB9XG5cCi0gIC5saXQ0IDoge1xuXAotICAgICooLmxpdDQpXG5cCi0gIiwiICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAgZWRhdGEgID0gIC47XG5cCi0gICBfZWRhdGEgID0gIC47XG5cCi0gICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAgZW5kID0gLjtcblwKLSAgIF9lbmQgPSAuO1xuXAotfVxuXG4iCi0sIE5VTEwpCi07IH0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9taXBzaWR0X2VtdWxhdGlvbiA9IAotewotICBnbGRtaXBzaWR0X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGRtaXBzaWR0X2FmdGVyX29wZW4sCi0gIGdsZG1pcHNpZHRfYWZ0ZXJfYWxsb2NhdGlvbiwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkbWlwc2lkdF9nZXRfc2NyaXB0LAotICAibWlwc2lkdCIsCi0gICJlY29mZi1iaWdtaXBzIgotfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1tYWtlLnNlZCBiL2xkL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxOTcwOC4uMDAwMDAwMAotLS0gYS9sZC9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIGxkIE1ha2VmaWxlLmluIGludG8gTVBXIHN5bnRheC4KLQotL0hERUZJTkVTL3MvQEhERUZJTkVTQC8vCi0KLS9edGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0Avcy9eLyMvCi0KLS9eRU1VTCA9IEBFTVVMQC9zL14vIy8KLQotL15FTVVMQVRJT05fT0ZJTEVTID0gQEVNVUxBVElPTl9PRklMRVNAL3MvXi8jLwotCi0jIEZpeGFkZCB0byB0aGUgaW5jbHVkZSBwYXRocy4KLS9eSU5DTFVERVMgPSAuKiQvcy8kLyAtaSAie0lOQ0RJUn0iOm1wdzogLWkgOjpleHRyYS1pbmNsdWRlOi8KLS9CRkRESVIvcy8taSB7QkZERElSfSAvLWkgIntCRkRESVJ9IjogLwotL0lOQ0RJUi9zLy1pIHtJTkNESVJ9IC8taSAie0lOQ0RJUn0iOiAvCi0KLSMgVXNlIGJ5YWNjIGluc3RlYWQgb2YgYmlzb24gKGZvciBub3cgYW55d2F5KS4KLS9CSVNPTi9zL15CSVNPTiA9LiokL0JJU09OID0gYnlhY2MvCi0jL0JJU09ORkxBR1Mvcy9eQklTT05GTEFHUyA9LiokL0JJU09ORkxBR1MgPSAvCi0KLSMgU3VwcHJlc3MgdGhlIHN1cHByZXNzaW9uIG9mIHNtYXJ0IG1ha2VzLgotL15cLnlcLmMvZAotCi0jIEhhY2sgdXAgbGRtYWluIGNvbXBpbGUuCi0vXiJ7b30ibGRtYWluLmMubyBcXE9wdGlvbi1mIC4qIGNvbmZpZy5zdGF0dXMkLywvXiQvY1wKLSJ7b30ibGRtYWluLmMubyBcXE9wdGlvbi1mICAie3N9ImxkbWFpbi5jXAotCXtDQ30gQERBU0hfQ19GTEFHQCAtZCBERUZBVUxUX0VNVUxBVElPTj17ZHF9e0VNVUx9e2RxfSAtZCBTQ1JJUFRESVI9e2RxfXtzY3JpcHRkaXJ9e2RxfSB7QUxMX0NGTEFHU30gIntzfSJsZG1haW4uYyAtbyAie299ImxkbWFpbi5jLm9cCi0KLQotIyBSZW1vdmUgbGRlbXVsLWxpc3QuaCBidWlsZCwgcmVseSBvbiBjb25maWd1cmUgdG8gbWFrZSBvbmUuCi0vXmxkZW11bC1saXN0LmggLywvUmVuYW1lIC15ICJ7c30ibGRlbXVsLXRtcC5oIC9kCi0KLSMgRml4IHBhdGhuYW1lcyB0byBnZW5lcmF0ZWQgZmlsZXMuCi0vY29uZmlnLmgvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS9jb25maWcuaC9zL15jb25maWdcLmgvIntvfSJjb25maWcuaC8KLQotL3kudGFiLmMvcy8ie3N9InlcLnRhYlwuYy8ie299InkudGFiLmMvZwotL3kudGFiLmMvcy9eeVwudGFiXC5jLyJ7b30ieS50YWIuYy8KLS95LnRhYi5oL3MvIntzfSJ5XC50YWJcLmgvIntvfSJ5LnRhYi5oL2cKLS95LnRhYi5oL3MvXnlcLnRhYlwuaC8ie299InkudGFiLmgvCi0KLS9sZGdyYW0uYy9zLyJ7c30ibGRncmFtXC5jLyJ7b30ibGRncmFtLmMvZwotL2xkZ3JhbS5jL3MvXmxkZ3JhbVwuYy8ie299ImxkZ3JhbS5jLwotCi0vbGRncmFtLmgvcy8ie3N9ImxkZ3JhbVwuaC8ie299ImxkZ3JhbS5oL2cKLS9sZGdyYW0uaC9zL15sZGdyYW1cLmgvIntvfSJsZGdyYW0uaC8KLQotL2xkbGV4LmMvcy8ie3N9ImxkbGV4XC5jLyJ7b30ibGRsZXguYy9nCi0vbGRsZXguYy9zL15sZGxleFwuYy8ie299ImxkbGV4LmMvCi0KLS9sZGxleC5jLm5ldy9zLyJ7c30ibGRsZXhcLmNcLm5ldy8ie299ImxkbGV4LmMubmV3L2cKLQotL2xleC55eS5jL3MvIntzfSJsZXhcLnl5XC5jLyJ7b30ibGV4Lnl5LmMvZwotCi0vbGRlbXVsLWxpc3QuaC9zLyJ7c30ibGRlbXVsLWxpc3RcLmgvIntvfSJsZGVtdWwtbGlzdC5oL2cKLS9sZGVtdWwtbGlzdC5oL3MvXmxkZW11bC1saXN0XC5oLyJ7b30ibGRlbXVsLWxpc3QuaC8KLQotIyBFZGl0IHBhdGhuYW1lcyB0byBlbXVsYXRpb24gZmlsZXMuCi0vIntzfSJlLipcLmMvcy8ie3N9ImVcKFstX2EtejAtOV0qXClcLmMvIntvfSJlXDEuYy9nCi0vXmUuKlwuYy9zL15lXChbLV9hLXowLTldKlwpXC5jLyJ7b30iZVwxLmMvCi0KLSMgV2UgY2FuJ3QgcnVuIGdlbnNjcmlwdHMsIHNvIGRvbid0IHRyeS4KLS97R0VOU0NSSVBUU30vcy97R0VOU0NSSVBUU30vbnVsbC1jb21tYW5kLwotCi0jIENvbW1lbnQgb3V0IHRoZSBURElSUyBiaXRzLgotL15URElSU0Avcy9eLyMvCi0KLSMgUG9pbnQgYXQgdGhlIEJGRCBsaWJyYXJ5IGRpcmVjdGx5LgotL0BCRkRMSUJAL3MvQEJGRExJQkAvOjpiZmQ6bGliYmZkLm8vCi0KLSMgRG9uJ3QgbmVlZCB0aGlzLgotL0BITERGTEFHU0Avcy9ASExERkxBR1NALy8KLQotIy9zZWQuKmZyZWUvLC8+ICJ7b30ibGRsZXguYy5uZXcvY1wKLSMJXAlDYXRlbmF0ZSAie299ImxleC55eS5jID4ie299ImxkbGV4LmMubmV3Ci0KLSMgVGhlIHJlc291cmNlIGZpbGUgaXMgY2FsbGVkIG1hYy1sZC5yLgotL3tMRF9QUk9HfS5yL3Mve0xEX1BST0d9XC5yL21hYy1sZC5yLwotCi0vXmluc3RhbGwgXFxPcHRpb24tZiAvLC9eJC9jXAotaW5zdGFsbCBcXE9wdGlvbi1mICBhbGwgaW5zdGFsbC1vbmx5XAotXAotaW5zdGFsbC1vbmx5IFxcT3B0aW9uLWZcCi0JTmV3Rm9sZGVyUmVjdXJzaXZlICJ7YmluZGlyfSJcCi0JRHVwbGljYXRlIC15IDpsZC5uZXcgIntiaW5kaXJ9ImxkXAotCi0KLSMgUmVtb3ZlIGRlcGVuZGVuY3kgcmVidWlsZGluZyBjcnVkLgotL14uZGVwIC8sLyMgLlBIT05ZIC9kCi0KLSMgUmVtb3ZlIHRoZSBsaW50bG9nIGFjdGlvbiwgcGlwZSBzeW1ib2xzIGluIGNvbHVtbiAxIGxvc2UuCi0vXmxpbnRsb2cgXFxPcHRpb24tZi8sL14kL2QKLQotL15NYWtlZmlsZSBcXE9wdGlvbi1mLywvXiQvZAotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvLC9eJC9kCi0vXmNvbmZpZy5zdGF0dXMgXFxPcHRpb24tZi8sL14kL2QKZGlmZiAtLWdpdCBhL2xkL21yaS5jIGIvbGQvbXJpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWFlYTIuLjAwMDAwMDAKLS0tIGEvbGQvbXJpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyogbXJpLmMgLS0gaGFuZGxlIE1SSSBzdHlsZSBsaW5rZXIgc2NyaXB0cwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBiaXQgZG9lcyB0aGUgdHJlZSBkZWNvcmF0aW9uIHdoZW4gTVJJIHN0eWxlIGxpbmsgc2NyaXB0cyBhcmUgcGFyc2VkICovCi0KLS8qCi0gIGNvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gIAkJIHNhY0BjeWdudXMuY29tCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIgCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgIm1yaS5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCB7Ci0gIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpuZXh0OwotICBDT05TVCBjaGFyICpuYW1lOwotICBDT05TVCBjaGFyICphbGlhczsKLSAgZXRyZWVfdHlwZSAqdm1hOwotICBldHJlZV90eXBlICphbGlnbjsKLSAgZXRyZWVfdHlwZSAqc3ViYWxpZ247Ci0gIGludCBva190b19sb2FkOwotfSA7Ci0KLXVuc2lnbmVkIGludCBzeW1ib2xfdHJ1bmNhdGUgPSAxMDAwMDsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpvcmRlcjsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpvbmx5X2xvYWQ7Ci1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWRkcmVzczsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphbGlhczsKLQotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFsaWdubWVudDsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpzdWJhbGlnbm1lbnQ7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxvb2t1cAotICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3QpKTsKLXN0YXRpYyB2b2lkIG1yaV9hZGRfdG9fbGlzdCBQQVJBTVMgKChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3QsCi0JCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICp2bWEsCi0JCQkJICAgICBjb25zdCBjaGFyICp6YWxpYXMsIGV0cmVlX3R5cGUgKmFsaWduLAotCQkJCSAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ24pKTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqCi1sb29rdXAgKG5hbWUsIGxpc3QpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdDsKLXsKLQotICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKnB0ciA9IGxpc3Q7Ci0gIHdoaWxlICgqcHRyKSAKLSAgewotICAgIGlmIChzdHJjbXAobmFtZSwgKCpwdHIpLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIGEgbWF0Y2gsIGRlbGV0ZSBpdCwgd2Ugb25seSBrZWVwIHRoZSBsYXN0IGluc3RhbmNlCi0JIG9mIGFueSBuYW1lICovCi0gICAgICAqcHRyID0gKCpwdHIpLT5uZXh0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHB0ciA9ICYoKCpwdHIpLT5uZXh0KTsKLSAgICB9Ci0gIH0KLQotICAqcHRyID0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopeG1hbGxvYyhzaXplb2Yoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QpKTsKLSAgcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIHZvaWQKLW1yaV9hZGRfdG9fbGlzdCAobGlzdCwgbmFtZSwgdm1hLCB6YWxpYXMsIGFsaWduLCBzdWJhbGlnbikKLSAgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0OwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICp2bWE7Ci0gICAgIENPTlNUIGNoYXIgKnphbGlhczsKLSAgICAgZXRyZWVfdHlwZSAqYWxpZ247Ci0gICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduOwotewotICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKnB0ciA9IGxvb2t1cChuYW1lLGxpc3QpOwotICAoKnB0ciktPm5hbWUgPSBuYW1lOwotICAoKnB0ciktPnZtYSA9IHZtYTsKLSAgKCpwdHIpLT5uZXh0ID0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTDsKLSAgKCpwdHIpLT5va190b19sb2FkID0gMDsKLSAgKCpwdHIpLT5hbGlhcyA9IHphbGlhczsKLSAgKCpwdHIpLT5hbGlnbiA9IGFsaWduOwotICAoKnB0ciktPnN1YmFsaWduID0gc3ViYWxpZ247Ci19Ci0KLQotdm9pZAotbXJpX291dHB1dF9zZWN0aW9uIChuYW1lLCB2bWEpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKnZtYTsKLXsKLSAgbXJpX2FkZF90b19saXN0KCZhZGRyZXNzLCBuYW1lLCB2bWEsIDAsMCwwKTsKLX0KLQotLyogaWYgYW55IEFCU09MVVRFIDxuYW1lPiBhcmUgaW4gdGhlIHNjcmlwdCwgb25seSBsb2FkIHRob3NlIGZpbGVzCi1tYXJrZWQgdGh1cyAqLwotCi12b2lkCi1tcmlfb25seV9sb2FkIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBtcmlfYWRkX3RvX2xpc3QoJm9ubHlfbG9hZCwgbmFtZSwgMCwgMCwwLDApOwotfQotCi0KLXZvaWQKLW1yaV9iYXNlIChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgYmFzZSA9IGV4cDsKLX0KLQotc3RhdGljIGludCBkb25lX3RyZWUgPSAwOwotCi12b2lkCi1tcmlfZHJhd190cmVlICgpCi17Ci0gIGlmIChkb25lX3RyZWUpIHJldHVybjsKLQotICAvKiBXZSBkb24ndCBib3RoZXIgd2l0aCBtZW1vcnkgcmVnaW9ucy4gICovCi0jaWYgMAotICAvKiBDcmVhdGUgdGhlIHJlZ2lvbnMgKi8KLSB7Ci0gICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcjsKLSAgIHIgPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKCJsb25nIik7Ci0gICByLT5jdXJyZW50ID0gci0+b3JpZ2luID0gZXhwX2dldF92bWEoYmFzZSwgKGJmZF92bWEpMCwgIm9yaWdpbiIsCi0JCQkJCWxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gICByLT5sZW5ndGggPSAoYmZkX3NpemVfdHlwZSkgZXhwX2dldF92bWEoMCwgKGJmZF92bWEpIH4oKGJmZF9zaXplX3R5cGUpMCksCi0JCQkJCSAgICJsZW5ndGgiLCBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOwotIH0KLSNlbmRpZgotICAKLSAgLyogTm93IGJ1aWxkIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgbGRsYW5nIG1hY2hpbmUgKi8KLQotCi0gIC8qIEF0dGF0Y2ggdGhlIGFkZHJlc3NlcyBvZiBhbnkgd2hpY2ggaGF2ZSBhZGRyZXNzZXMsIGFuZCBhZGQgdGhlCi0gICAgIG9uZXMgbm90IG1lbnRpb25lZCAqLwotICBpZiAoYWRkcmVzcyAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSB7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFsaXN0OwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpvbGlzdDsKLSAgICBpZiAob3JkZXIgPT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTCkgewotICAgICAgb3JkZXIgPSBhZGRyZXNzOwotICAgIH0KLQotICAgIGZvciAoYWxpc3QgPSBhZGRyZXNzOwotCSBhbGlzdCAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QqKU5VTEw7Ci0JIGFsaXN0ID0gYWxpc3QtPm5leHQpIAotICAgIHsKLSAgICAgIGludCBkb25lID0gMDsKLSAgICAgIGZvciAob2xpc3QgPSBvcmRlcjsKLQkgICBkb25lID09IDAgJiYKLQkgICBvbGlzdCAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMOwotCSAgIG9saXN0ID0gb2xpc3QtPm5leHQpIAotICAgICAgewotCWlmIChzdHJjbXAoYWxpc3QtPm5hbWUsIG9saXN0LT5uYW1lKSA9PSAwKSAKLQl7Ci0JICBvbGlzdC0+dm1hID0gYWxpc3QtPnZtYTsKLQkgIGRvbmUgPSAxOwotCX0KLSAgICAgIH0KLSAgICAgIGlmICghZG9uZSkgewotCS8qIGFkZCB0aGlzIG9udG8gZW5kIG9mIG9yZGVyIGxpc3QgKi8KLQltcmlfYWRkX3RvX2xpc3QoJm9yZGVyLCBhbGlzdC0+bmFtZSwgYWxpc3QtPnZtYSwgMCwwLDApOwotICAgICAgfQotCi0gICAgfQotCi0gIH0KLQotICAvKiBJZiB3ZSdyZSBvbmx5IHN1cHBvc2VkIHRvIGxvYWQgYSBzdWJzZXQgb2YgdGhlbSBpbiwgdGhlbiBwcnVuZQotICAgICB0aGUgbGlzdC4gICovCi0KLSAgaWYgKG9ubHlfbG9hZCAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSAKLSAgewotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwdHIxOwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwdHIyOwotICAgIGlmIChvcmRlciA9PSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QqKU5VTEwpCi0gICAgIG9yZGVyID0gb25seV9sb2FkOwotICAgIAotICAgIC8qIFNlZSBpZiB0aGlzIG5hbWUgaXMgaW4gdGhlIGxpc3QsIGlmIGl0IGlzIHRoZW4gd2UgY2FuIGxvYWQgaXQKLSAgICAgKi8KLSAgICBmb3IgKHB0cjEgPSBvbmx5X2xvYWQ7IHB0cjE7IHB0cjEgPSBwdHIxLT5uZXh0KSAKLSAgICB7Ci0gICAgICBmb3IgKHB0cjI9IG9yZGVyOyBwdHIyOyBwdHIyPXB0cjItPm5leHQpIAotICAgICAgewotCWlmIChzdHJjbXAocHRyMi0+bmFtZSwgcHRyMS0+bmFtZSk9PTApIHsKLQkgIHB0cjItPm9rX3RvX2xvYWQgPSAxOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIC8qIE5vIG9ubHkgbG9hZCBsaXN0LCBzbyBldmVyeXRoaW5nIGlzIG9rIHRvIGxvYWQgKi8KLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqcHRyOwotICAgIGZvciAocHRyID0gb3JkZXI7IHB0cjsgcHRyPXB0ci0+bmV4dCkgewotICAgICAgcHRyLT5va190b19sb2FkID0gMTsKLSAgICB9Ci0gIH0KLQotCi0KLSAgLyogQ3JlYXRlIHRoZSBvcmRlciBvZiBzZWN0aW9ucyB0byBsb2FkICovCi0gIGlmIChvcmRlciAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSAKLSAgewotICAgIC8qIEJlZW4gdG9sZCB0byBvdXRwdXQgdGhlIHNlY3Rpb25zIGluIGEgY2VydGFpbiBvcmRlciAqLwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwID0gb3JkZXI7Ci0gICAgd2hpbGUgKHApIAotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphcHRyOwotICAgICAgZXRyZWVfdHlwZSAqYWxpZ24gPSAwOwotICAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ24gPSAwOwotICAgICAgLyogU2VlIGlmIGFuIGFsaWdubWVudCBoYXMgYmVlbiBzcGVjaWZpZWQgKi8KLQotICAgICAgZm9yIChhcHRyID0gYWxpZ25tZW50OyBhcHRyOyBhcHRyPSBhcHRyLT5uZXh0KQotICAgICAgewotCWlmIChzdHJjbXAoYXB0ci0+bmFtZSwgcC0+bmFtZSk9PTApIHsKLQkgIGFsaWduID0gIGFwdHItPmFsaWduOwotCX0KLSAgICAgIH0KLQotICAgICAgZm9yIChhcHRyID0gc3ViYWxpZ25tZW50OyBhcHRyOyBhcHRyPSBhcHRyLT5uZXh0KQotICAgICAgewotCWlmIChzdHJjbXAoYXB0ci0+bmFtZSwgcC0+bmFtZSk9PTApIHsKLQkgIHN1YmFsaWduID0gIGFwdHItPnN1YmFsaWduOwotCX0KLSAgICAgIH0KLQotICAgICAgaWYgKGJhc2UgPT0gMCkgewotCWJhc2UgPSBwLT52bWEgPyBwLT52bWEgOmV4cF9uYW1lb3AoTkFNRSwgIi4iKTsKLSAgICAgIH0KLSAgICAgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChwLT5uYW1lLCBiYXNlLAotCQkJCQkgICBwLT5va190b19sb2FkID8gMCA6IG5vbG9hZF9zZWN0aW9uLAotCQkJCQkgICAxLCBhbGlnbiwgc3ViYWxpZ24sCi0JCQkJCSAgIChldHJlZV90eXBlICopIE5VTEwpOwotICAgICAgYmFzZSA9IDA7Ci0gICAgICBsYW5nX2FkZF93aWxkIChwLT5uYW1lLCBmYWxzZSwgKGNoYXIgKilOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpOwotICAgICAgLyogSWYgdGhlcmUgaXMgYW4gYWxpYXMgZm9yIHRoaXMgc2VjdGlvbiwgYWRkIGl0IHRvbyAqLwotICAgICAgZm9yIChhcHRyID0gYWxpYXM7IGFwdHI7IGFwdHIgPSBhcHRyLT5uZXh0KSB7Ci0KLQlpZiAoc3RyY21wKGFwdHItPmFsaWFzLCBwLT5uYW1lKT09IDApIHsKLQkgIGxhbmdfYWRkX3dpbGQgKGFwdHItPm5hbWUsIGZhbHNlLCAoY2hhciAqKU5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0JfQotICAgICAgfQotCi0gICAgICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotCSgwLCAiKmRlZmF1bHQqIiwgKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSBOVUxMKTsKLQotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotICB9Ci0KLQotICBkb25lX3RyZWUgPSAxOwotCi19Ci12b2lkCi1tcmlfbG9hZCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgYmFzZSA9IDA7Ci0gIGxhbmdfYWRkX2lucHV0X2ZpbGUobmFtZSwKLQkJICAgICAgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSwgKGNoYXIgKilOVUxMKTsKLSAgLyogIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KDAsIipkZWZhdWx0KiIpOyovCi19Ci0KLQotdm9pZAotbXJpX29yZGVyIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBtcmlfYWRkX3RvX2xpc3QoJm9yZGVyLCBuYW1lLCAwLCAwLDAsMCk7Ci19Ci0KLXZvaWQgCi1tcmlfYWxpYXMgKHdhbnQsIGlzLCBpc24pCi0gICAgIENPTlNUIGNoYXIgKndhbnQ7Ci0gICAgIENPTlNUIGNoYXIgKmlzOwotICAgICBpbnQgaXNuOwotewotICBpZiAoIWlzKSB7Ci0gICAgLyogU29tZSBzZWN0aW9ucyBhcmUgZGlnaXRzIC0gKi8KLSAgICBjaGFyIGJ1ZlsyMF07Ci0gICAgc3ByaW50ZihidWYsICIlZCIsIGlzbik7Ci0gICAgaXMgPSB4c3RyZHVwIChidWYpOwotICAgIGlmIChpcyA9PSBOVUxMKQotICAgICAgYWJvcnQgKCk7Ci0gIH0KLSAgbXJpX2FkZF90b19saXN0KCZhbGlhcywgaXMsIDAsIHdhbnQsMCwwKTsKLQotfQotCi0KLXZvaWQgCi1tcmlfbmFtZSAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgbGFuZ19hZGRfb3V0cHV0KG5hbWUsIDEpOwotCi19Ci0KLQotdm9pZAotbXJpX2Zvcm1hdCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKHN0cmNtcChuYW1lLCAiUyIpID09IDApCi0gIHsKLSAgICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KCJzcmVjIiwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMSk7Ci0gIH0KLSAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJJRUVFIikgPT0gMCkKLSAgewotICAgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQoImllZWUiLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAxKTsKLSAgfQotICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIkNPRkYiKSA9PSAwKQotICB7Ci0gICAgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCgiY29mZi1tNjhrIiwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZWluZm8oXygiJVAlRjogdW5rbm93biBmb3JtYXQgdHlwZSAlc1xuIiksIG5hbWUpOwotICB9Ci19Ci0KLQotdm9pZAotbXJpX3B1YmxpYyAobmFtZSwgZXhwKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIGxhbmdfYWRkX2Fzc2lnbm1lbnQoZXhwX2Fzc29wKCc9JywgbmFtZSwgZXhwKSk7Ci19Ci0KLXZvaWQgCi1tcmlfYWxpZ24gKG5hbWUsIGV4cCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBtcmlfYWRkX3RvX2xpc3QoJmFsaWdubWVudCwgbmFtZSwwLDAsZXhwLDApOwotfQotCi12b2lkIAotbXJpX2FsaWdubW9kIChuYW1lLCBleHApCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgbXJpX2FkZF90b19saXN0KCZzdWJhbGlnbm1lbnQsIG5hbWUsMCwwLDAsZXhwKTsKLX0KLQotCi12b2lkIAotbXJpX3RydW5jYXRlIChleHApCi0gICAgIHVuc2lnbmVkIGludCBleHA7Ci17Ci0gIHN5bWJvbF90cnVuY2F0ZSA9IGV4cDsKLX0KZGlmZiAtLWdpdCBhL2xkL21yaS5oIGIvbGQvbXJpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjM2YwZjMuLjAwMDAwMDAKLS0tIGEvbGQvbXJpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBtcmkuaCAtLSBoZWFkZXIgZmlsZSBmb3IgTVJJIHNjcmlwdGluZyBmdW5jdGlvbnMKLSAgIENvcHlyaWdodCAxOTkzLCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNUklfSAotI2RlZmluZSBNUklfSAotCi1leHRlcm4gdW5zaWduZWQgaW50IHN5bWJvbF90cnVuY2F0ZTsKLQotZXh0ZXJuIHZvaWQgbXJpX291dHB1dF9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKnZtYSkpOwotZXh0ZXJuIHZvaWQgbXJpX29ubHlfbG9hZCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfYmFzZSBQQVJBTVMgKChldHJlZV90eXBlICpleHApKTsKLWV4dGVybiB2b2lkIG1yaV9sb2FkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9vcmRlciBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfYWxpYXMgUEFSQU1TICgoY29uc3QgY2hhciAqd2FudCwgY29uc3QgY2hhciAqaXMsIGludCBpc24pKTsKLWV4dGVybiB2b2lkIG1yaV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9mb3JtYXQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX3B1YmxpYyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKLWV4dGVybiB2b2lkIG1yaV9hbGlnbiBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKLWV4dGVybiB2b2lkIG1yaV9hbGlnbm1vZCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKLWV4dGVybiB2b2lkIG1yaV90cnVuY2F0ZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgZXhwKSk7Ci1leHRlcm4gdm9pZCBtcmlfZHJhd190cmVlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9wZS1kbGwuYyBiL2xkL3BlLWRsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTdmNDFkLi4wMDAwMDAwCi0tLSBhL2xkL3BlLWRsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgzNiArMCwwIEBACi0vKiBSb3V0aW5lcyB0byBoZWxwIGJ1aWxkIFBFSS1mb3JtYXQgRExMcyAoV2luMzIgZXRjKQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBESiBEZWxvcmllIDxkakBjeWdudXMuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGR3cml0ZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotI2luY2x1ZGUgImRlZmZpbGUuaCIKLSNpbmNsdWRlICJwZS1kbGwuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gVGhpcyBmaWxlIHR1cm5zIGEgcmVndWxhciBXaW5kb3dzIFBFIGltYWdlIGludG8gYSBETEwuICBCZWNhdXNlIG9mCi0gdGhlIGNvbXBsZXhpdHkgb2YgdGhpcyBvcGVyYXRpb24sIGl0IGhhcyBiZWVuIGJyb2tlbiBkb3duIGludG8gYQotIG51bWJlciBvZiBzZXBhcmF0ZSBtb2R1bGVzIHdoaWNoIGFyZSBhbGwgY2FsbGVkIGJ5IHRoZSBtYWluIGZ1bmN0aW9uCi0gYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZS1lbnRyYW50IGFuZCBpcwotIG5vcm1hbGx5IG9ubHkgY2FsbGVkIG9uY2UsIHNvIHN0YXRpYyB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gcmVkdWNlCi0gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzIHJlcXVpcmVkLgotCi0gU2VlIGFsc286IGxkL2VtdWx0ZW1wbC9wZS5lbQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBmb3IgZW11bHRlbXBsL3BlLmVtICovCi0KLWRlZl9maWxlICpwZV9kZWZfZmlsZSA9IDA7Ci1pbnQgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nID0gMDsKLWludCBwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlcyA9IDE7Ci1pbnQgcGVfZGxsX2tpbGxfYXRzID0gMDsKLWludCBwZV9kbGxfc3RkY2FsbF9hbGlhc2VzID0gMDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gc3RhdGljIHZhcmlhYmxlcyBhbmQgdHlwZXMKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJmZF92bWEgaW1hZ2VfYmFzZTsKLQotc3RhdGljIGJmZCAqZmlsbGVyX2JmZDsKLXN0YXRpYyBzdHJ1Y3Qgc2VjICplZGF0YV9zLCAqcmVsb2NfczsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICplZGF0YV9kLCAqcmVsb2NfZDsKLXN0YXRpYyBzaXplX3QgZWRhdGFfc3osIHJlbG9jX3N6OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKnRhcmdldF9uYW1lOwotICBjaGFyICpvYmplY3RfdGFyZ2V0OwotICB1bnNpZ25lZCBpbnQgaW1hZ2ViYXNlX3JlbG9jOwotICBpbnQgcGVfYXJjaDsKLSAgaW50IGJmZF9hcmNoOwotICBpbnQgdW5kZXJzY29yZWQ7Ci19IHBlX2RldGFpbHNfdHlwZTsKLQotI2RlZmluZSBQRV9BUkNIX2kzODYJMQotCi1zdGF0aWMgcGVfZGV0YWlsc190eXBlIHBlX2RldGFpbF9saXN0W10gPSB7Ci0gIHsKLSAgICAicGVpLWkzODYiLAotICAgICJwZS1pMzg2IiwKLSAgICA3IC8qIFJfSU1BR0VCQVNFICovLAotICAgIFBFX0FSQ0hfaTM4NiwKLSAgICBiZmRfYXJjaF9pMzg2LAotICAgIDEKLSAgfSwKLSAgeyBOVUxMLCBOVUxMLCAwLCAwLCAwLCAwIH0KLX07Ci0KLXN0YXRpYyBwZV9kZXRhaWxzX3R5cGUgKnBlX2RldGFpbHM7Ci0KLSNkZWZpbmUgVShzdHIpIChwZV9kZXRhaWxzLT51bmRlcnNjb3JlZCA/ICJfIiBzdHIgOiBzdHIpCi0KLXZvaWQKLXBlX2RsbF9pZF90YXJnZXQgKHRhcmdldCkKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotewotICBpbnQgaTsKLSAgZm9yIChpPTA7IHBlX2RldGFpbF9saXN0W2ldLnRhcmdldF9uYW1lOyBpKyspCi0gICAgaWYgKHN0cmNtcCAocGVfZGV0YWlsX2xpc3RbaV0udGFyZ2V0X25hbWUsIHRhcmdldCkgPT0gMCkKLSAgICAgIHsKLQlwZV9kZXRhaWxzID0gcGVfZGV0YWlsX2xpc3QraTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gIGVpbmZvIChfKCIlWFVuc3VwcG9ydGVkIFBFSSBhcmNoaXRlY3R1cmU6ICVzXG4iKSwgdGFyZ2V0KTsKLSAgZXhpdCAoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEhlbHBlciBmdW5jdGlvbnMgZm9yIHFzb3J0LiAgUmVsb2NzIG11c3QgYmUgc29ydGVkIHNvIHRoYXQgd2UgY2FuIHdyaXRlCi0gdGhlbSBvdXQgYnkgcGFnZXMuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYmZkX3ZtYSB2bWE7Ci0gIGNoYXIgdHlwZTsKLSAgc2hvcnQgZXh0cmE7Ci19IHJlbG9jX2RhdGFfdHlwZTsKLQotc3RhdGljIGludAotcmVsb2Nfc29ydCAodmEsIHZiKQotICAgICBjb25zdCB2b2lkICp2YSwgKnZiOwotewotICBiZmRfdm1hIGEgPSAoKHJlbG9jX2RhdGFfdHlwZSAqKSB2YSktPnZtYTsKLSAgYmZkX3ZtYSBiID0gKChyZWxvY19kYXRhX3R5cGUgKikgdmIpLT52bWE7Ci0gIHJldHVybiAoYSA+IGIpID8gMSA6ICgoYSA8IGIpID8gLTEgOiAwKTsKLX0KLQotc3RhdGljIGludAotcGVfZXhwb3J0X3NvcnQgKHZhLCB2YikKLSAgICAgY29uc3Qgdm9pZCAqdmEsICp2YjsKLXsKLSAgZGVmX2ZpbGVfZXhwb3J0ICphID0gKGRlZl9maWxlX2V4cG9ydCAqKSB2YTsKLSAgZGVmX2ZpbGVfZXhwb3J0ICpiID0gKGRlZl9maWxlX2V4cG9ydCAqKSB2YjsKLSAgcmV0dXJuIHN0cmNtcCAoYS0+bmFtZSwgYi0+bmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIFJlYWQgYW5kIHByb2Nlc3MgdGhlIC5ERUYgZmlsZQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBlbnRyaWVzIGluIHBlX2RlZl9maWxlLT5leHBvcnRzW10uICBJIHVzZQotICAgZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldIHRvIHRhZyB3aGV0aGVyIG9yIG5vdCB0aGUgc3ltYm9sIHdhcwotICAgZGVmaW5lZCwgc2luY2Ugd2UgY2FuJ3QgZXhwb3J0IHN5bWJvbHMgd2UgZG9uJ3QgaGF2ZS4gKi8KLQotc3RhdGljIGJmZF92bWEgKmV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzOwotc3RhdGljIHN0cnVjdCBzZWMgKipleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnM7Ci0KLXN0YXRpYyBpbnQgZXhwb3J0X3RhYmxlX3NpemU7Ci1zdGF0aWMgaW50IGNvdW50X2V4cG9ydGVkOwotc3RhdGljIGludCBjb3VudF9leHBvcnRlZF9ieW5hbWU7Ci1zdGF0aWMgaW50IGNvdW50X3dpdGhfb3JkaW5hbHM7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGxsX25hbWU7Ci1zdGF0aWMgaW50IG1pbl9vcmRpbmFsLCBtYXhfb3JkaW5hbDsKLXN0YXRpYyBpbnQgKmV4cG9ydGVkX3N5bWJvbHM7Ci0KLXR5cGVkZWYgc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QKLSAgewotICAgIGNoYXIgKnN0cmluZzsKLSAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqbmV4dDsKLSAgfQotZXhjbHVkZV9saXN0X3N0cnVjdDsKLXN0YXRpYyBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqZXhjbHVkZXMgPSAwOwotCi12b2lkCi1wZV9kbGxfYWRkX2V4Y2x1ZGVzIChuZXdfZXhjbHVkZXMpCi0gICAgIGNvbnN0IGNoYXIgKm5ld19leGNsdWRlczsKLXsKLSAgY2hhciAqbG9jYWxfY29weTsKLSAgY2hhciAqZXhjbHVkZV9zdHJpbmc7Ci0KLSAgbG9jYWxfY29weSA9IHhzdHJkdXAgKG5ld19leGNsdWRlcyk7Ci0KLSAgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKGxvY2FsX2NvcHksICIsOiIpOwotICBmb3IgKDsgZXhjbHVkZV9zdHJpbmc7IGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChOVUxMLCAiLDoiKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqbmV3X2V4Y2x1ZGU7Ci0KLSAgICAgIG5ld19leGNsdWRlID0gKChzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqKQotCQkgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QpKSk7Ci0gICAgICBuZXdfZXhjbHVkZS0+c3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChleGNsdWRlX3N0cmluZykgKyAxKTsKLSAgICAgIHN0cmNweSAobmV3X2V4Y2x1ZGUtPnN0cmluZywgZXhjbHVkZV9zdHJpbmcpOwotICAgICAgbmV3X2V4Y2x1ZGUtPm5leHQgPSBleGNsdWRlczsKLSAgICAgIGV4Y2x1ZGVzID0gbmV3X2V4Y2x1ZGU7Ci0gICAgfQotCi0gIGZyZWUgKGxvY2FsX2NvcHkpOwotfQotCi1zdGF0aWMgaW50Ci1hdXRvX2V4cG9ydCAoZCwgbikKLSAgICAgZGVmX2ZpbGUgKmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm47Ci17Ci0gIGludCBpOwotICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqZXg7Ci0gIGZvciAoaSA9IDA7IGkgPCBkLT5udW1fZXhwb3J0czsgaSsrKQotICAgIGlmIChzdHJjbXAgKGQtPmV4cG9ydHNbaV0ubmFtZSwgbikgPT0gMCkKLSAgICAgIHJldHVybiAwOwotICBpZiAocGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXMpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobiwgIkRsbE1haW5AMTIiKSA9PSAwKQotCXJldHVybiAwOwotICAgICAgaWYgKHN0cmNtcCAobiwgIkRsbEVudHJ5UG9pbnRAMCIpID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBpZiAoc3RyY21wIChuLCAiaW1wdXJlX3B0ciIpID09IDApCi0JcmV0dXJuIDA7Ci0gICAgfQotICBmb3IgKGV4ID0gZXhjbHVkZXM7IGV4OyBleCA9IGV4LT5uZXh0KQotICAgIGlmIChzdHJjbXAgKG4sIGV4LT5zdHJpbmcpID09IDApCi0gICAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2RlZl9maWxlIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGludCBpLCBqOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmxoZTsKLSAgYmZkICpiOwotICBzdHJ1Y3Qgc2VjICpzOwotICBkZWZfZmlsZV9leHBvcnQgKmU9MDsKLQotICBpZiAoIXBlX2RlZl9maWxlKQotICAgIHBlX2RlZl9maWxlID0gZGVmX2ZpbGVfZW1wdHkgKCk7Ci0KLSAgLyogRmlyc3QsIHJ1biBhcm91bmQgdG8gYWxsIHRoZSBvYmplY3RzIGxvb2tpbmcgZm9yIHRoZSAuZHJlY3R2ZQotICAgICBzZWN0aW9ucywgYW5kIHB1c2ggdGhvc2UgaW50byB0aGUgZGVmIGZpbGUgdG9vICovCi0KLSAgZm9yIChiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYiA9IGItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGIsICIuZHJlY3R2ZSIpOwotICAgICAgaWYgKHMpCi0JewotCSAgaW50IHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHMpOwotCSAgY2hhciAqYnVmID0geG1hbGxvYyAoc2l6ZSk7Ci0JICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGIsIHMsIGJ1ZiwgMCwgc2l6ZSk7Ci0JICBkZWZfZmlsZV9hZGRfZGlyZWN0aXZlIChwZV9kZWZfZmlsZSwgYnVmLCBzaXplKTsKLQkgIGZyZWUgKGJ1Zik7Ci0JfQotICAgIH0KLQotICAvKiBOb3csIG1heWJlIGV4cG9ydCBldmVyeXRoaW5nIGVsc2UgdGhlIGRlZmF1bHQgd2F5ICovCi0KLSAgaWYgKHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZyB8fCBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHMgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiID0gYi0+bGlua19uZXh0KQotCXsKLQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCSAgaW50IG5zeW1zLCBzeW1zaXplOwotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGIpOwotCSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkgIG5zeW1zID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGIsIHN5bWJvbHMpOwotCi0JICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7IGorKykKLQkgICAgewotCSAgICAgIGlmICgoc3ltYm9sc1tqXS0+ZmxhZ3MgJiAoQlNGX0ZVTkNUSU9OIHwgQlNGX0dMT0JBTCkpCi0JCSAgPT0gKEJTRl9GVU5DVElPTiB8IEJTRl9HTE9CQUwpKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqc24gPSBzeW1ib2xzW2pdLT5uYW1lOwotCQkgIGlmICgqc24gPT0gJ18nKQotCQkgICAgc24rKzsKLQkJICBpZiAoYXV0b19leHBvcnQgKHBlX2RlZl9maWxlLCBzbikpCi0JCSAgICBkZWZfZmlsZV9hZGRfZXhwb3J0IChwZV9kZWZfZmlsZSwgc24sIDAsIC0xKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotI3VuZGVmIE5FCi0jZGVmaW5lIE5FIHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cwotCi0gIC8qIENhbm9uaWNhbGl6ZSB0aGUgZXhwb3J0IGxpc3QgKi8KLQotICBpZiAocGVfZGxsX2tpbGxfYXRzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotCXsKLQkgIGlmIChzdHJjaHIgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUsICdAJykpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHdpbGwgcHJlc2VydmUgaW50ZXJuYWxfbmFtZSwgd2hpY2ggbWF5IGhhdmUgYmVlbiBwb2ludGluZwotCSAgICAgICAgIHRvIHRoZSBzYW1lIG1lbW9yeSBhcyBuYW1lLCBvciBtaWdodCBub3QgaGF2ZSAqLwotCSAgICAgIGNoYXIgKnRtcCA9IHhzdHJkdXAgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUpOwotCSAgICAgICooc3RyY2hyICh0bXAsICdAJykpID0gMDsKLQkgICAgICBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lID0gdG1wOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocGVfZGxsX3N0ZGNhbGxfYWxpYXNlcykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKLQl7Ci0JICBpZiAoc3RyY2hyIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lLCAnQCcpKQotCSAgICB7Ci0JICAgICAgY2hhciAqdG1wID0geHN0cmR1cCAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSk7Ci0JICAgICAgKihzdHJjaHIgKHRtcCwgJ0AnKSkgPSAwOwotCSAgICAgIGlmIChhdXRvX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHRtcCkpCi0JCWRlZl9maWxlX2FkZF9leHBvcnQgKHBlX2RlZl9maWxlLCB0bXAsCi0JCQkJICAgICBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lLCAtMSk7Ci0JICAgICAgZWxzZQotCQlmcmVlICh0bXApOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBlID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHM7IC8qIGNvbnZlbmllbmNlLCBidXQgd2F0Y2ggb3V0IGZvciBpdCBjaGFuZ2luZyAqLwotCi0gIGV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzID0gKGJmZF92bWEgKikgeG1hbGxvYyAoTkUgKiBzaXplb2YgKGJmZF92bWEpKTsKLSAgZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zID0gKHN0cnVjdCBzZWMgKiopIHhtYWxsb2MgKE5FICogc2l6ZW9mIChzdHJ1Y3Qgc2VjICopKTsKLQotICBtZW1zZXQgKGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9ucywgMCwgTkUgKiBzaXplb2YgKHN0cnVjdCBzZWMgKikpOwotICBtYXhfb3JkaW5hbCA9IDA7Ci0gIG1pbl9vcmRpbmFsID0gNjU1MzY7Ci0gIGNvdW50X2V4cG9ydGVkID0gMDsKLSAgY291bnRfZXhwb3J0ZWRfYnluYW1lID0gMDsKLSAgY291bnRfd2l0aF9vcmRpbmFscyA9IDA7Ci0KLSAgcXNvcnQgKHBlX2RlZl9maWxlLT5leHBvcnRzLCBORSwgc2l6ZW9mIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1swXSksIHBlX2V4cG9ydF9zb3J0KTsKLSAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBORTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID4gMCAmJiBzdHJjbXAgKGVbaV0ubmFtZSwgZVtpIC0gMV0ubmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlICovCi0JICBpZiAoZVtqIC0gMV0ub3JkaW5hbCAhPSAtMQotCSAgICAgICYmIGVbaV0ub3JkaW5hbCAhPSAtMQotCSAgICAgICYmIGVbaiAtIDFdLm9yZGluYWwgIT0gZVtpXS5vcmRpbmFsKQotCSAgICB7Ci0JICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgICBlaW5mbyAoXygiJVhFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMgKCVkIHZzICVkKVxuIiksCi0JCSAgICAgZVtqIC0gMV0ubmFtZSwgZVtqIC0gMV0ub3JkaW5hbCwgZVtpXS5vcmRpbmFsKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgICBlaW5mbyAoXygiV2FybmluZywgZHVwbGljYXRlIEVYUE9SVDogJXNcbiIpLAotCQkgICAgIGVbaiAtIDFdLm5hbWUpOwotCSAgICB9Ci0JICBpZiAoZVtpXS5vcmRpbmFsKQotCSAgICBlW2ogLSAxXS5vcmRpbmFsID0gZVtpXS5vcmRpbmFsOwotCSAgZVtqIC0gMV0uZmxhZ19wcml2YXRlIHw9IGVbaV0uZmxhZ19wcml2YXRlOwotCSAgZVtqIC0gMV0uZmxhZ19jb25zdGFudCB8PSBlW2ldLmZsYWdfY29uc3RhbnQ7Ci0JICBlW2ogLSAxXS5mbGFnX25vbmFtZSB8PSBlW2ldLmZsYWdfbm9uYW1lOwotCSAgZVtqIC0gMV0uZmxhZ19kYXRhIHw9IGVbaV0uZmxhZ19kYXRhOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaSAhPSBqKQotCSAgICBlW2pdID0gZVtpXTsKLQkgIGorKzsKLQl9Ci0gICAgfQotICBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHMgPSBqOwkvKiA9PSBORSAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpICsgMik7Ci0gICAgICBpZiAocGVfZGV0YWlscy0+dW5kZXJzY29yZWQpCi0JewotCSAgKm5hbWUgPSAnXyc7Ci0JICBzdHJjcHkgKG5hbWUgKyAxLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3RyY3B5IChuYW1lLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQotICAgICAgYmxoZSA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLAotCQkJCSAgIG5hbWUsCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgaWYgKGJsaGUKLSAgICAgICAgICAmJiAoYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikpKQotCXsKLQkgIGNvdW50X2V4cG9ydGVkKys7Ci0JICBpZiAoIXBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmZsYWdfbm9uYW1lKQotCSAgICBjb3VudF9leHBvcnRlZF9ieW5hbWUrKzsKLQotCSAgLyogT25seSBmaWxsIGluIHRoZSBzZWN0aW9ucy4gVGhlIGFjdHVhbCBvZmZzZXRzIGFyZSBjb21wdXRlZAotCSAgICAgaW4gZmlsbF9leHBvcnRlZF9vZmZzZXRzKCkgYWZ0ZXIgY29tbW9uIHN5bWJvbHMgYXJlIGxhaWQKLQkgICAgIG91dC4gICovCi0gICAgICAgICAgaWYgKGJsaGUtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0gPSBibGhlLT51LmRlZi5zZWN0aW9uOwotCSAgZWxzZQotCSAgICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0gPSBibGhlLT51LmMucC0+c2VjdGlvbjsKLQotCSAgaWYgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgIT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAobWF4X29yZGluYWwgPCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsKQotCQltYXhfb3JkaW5hbCA9IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWw7Ci0JICAgICAgaWYgKG1pbl9vcmRpbmFsID4gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCkKLQkJbWluX29yZGluYWwgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsOwotCSAgICAgIGNvdW50X3dpdGhfb3JkaW5hbHMrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGJsaGUgJiYgYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIG5vdCBkZWZpbmVkXG4iKSwKLQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJsaGUpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGVpbmZvIChfKCIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCB3cm9uZyB0eXBlICglZCB2cyAlZClcbiIpLAotCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSwKLQkJIGJsaGUtPnR5cGUsIGJmZF9saW5rX2hhc2hfZGVmaW5lZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlaW5mbyAoXygiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGZvdW5kXG4iKSwKLQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGZyZWUgKG5hbWUpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gQnVpbGQgdGhlIGJmZCB0aGF0IHdpbGwgY29udGFpbiAuZWRhdGEgYW5kIC5yZWxvYyBzZWN0aW9ucwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfZmlsbGVyX2JmZCAoaW5jbHVkZV9lZGF0YSkKLSAgICAgaW50IGluY2x1ZGVfZWRhdGE7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGxlcl9maWxlOwotICBmaWxsZXJfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKCJkbGwgc3R1ZmYiLAotCQkJCSAgICAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKLQkJCQkgICAgIE5VTEwpOwotICBmaWxsZXJfZmlsZS0+dGhlX2JmZCA9IGZpbGxlcl9iZmQgPSBiZmRfY3JlYXRlICgiZGxsIHN0dWZmIiwgb3V0cHV0X2JmZCk7Ci0gIGlmIChmaWxsZXJfYmZkID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X2FyY2hfbWFjaCAoZmlsbGVyX2JmZCwKLQkJCSAgICAgYmZkX2dldF9hcmNoIChvdXRwdXRfYmZkKSwKLQkJCSAgICAgYmZkX2dldF9tYWNoIChvdXRwdXRfYmZkKSkpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSBCRkQgJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5jbHVkZV9lZGF0YSkKLSAgICB7Ci0gICAgICBlZGF0YV9zID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChmaWxsZXJfYmZkLCAiLmVkYXRhIik7Ci0gICAgICBpZiAoZWRhdGFfcyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChmaWxsZXJfYmZkLCBlZGF0YV9zLAotCQkJCSAgICAgKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICB8IFNFQ19BTExPQwotCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICB8IFNFQ19LRUVQCi0JCQkJICAgICAgfCBTRUNfSU5fTUVNT1JZKSkpCi0JewotCSAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSAuZWRhdGEgc2VjdGlvbjogJUVcbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCBlZGF0YV9zLCBlZGF0YV9zeik7Ci0gICAgfQotCi0gIHJlbG9jX3MgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGZpbGxlcl9iZmQsICIucmVsb2MiKTsKLSAgaWYgKHJlbG9jX3MgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZmlsbGVyX2JmZCwgcmVsb2NfcywKLQkJCQkgKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgIHwgU0VDX0FMTE9DCi0JCQkJICB8IFNFQ19MT0FECi0JCQkJICB8IFNFQ19LRUVQCi0JCQkJICB8IFNFQ19JTl9NRU1PUlkpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIC5yZWxvYyBzZWN0aW9uOiAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgcmVsb2NfcywgMCk7Ci0KLSAgbGRsYW5nX2FkZF9maWxlIChmaWxsZXJfZmlsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEdhdGhlciBhbGwgdGhlIGV4cG9ydGVkIHN5bWJvbHMgYW5kIGJ1aWxkIHRoZSAuZWRhdGEgc2VjdGlvbgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotZ2VuZXJhdGVfZWRhdGEgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGksIG5leHRfb3JkaW5hbDsKLSAgaW50IG5hbWVfdGFibGVfc2l6ZSA9IDA7Ci0gIGNvbnN0IGNoYXIgKmRsbnA7Ci0KLSAgLyogRmlyc3QsIHdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBleHBvcnRlZCBzeW1ib2xzIHRoZXJlIGFyZSwKLSAgICAgYW5kIHdoYXQgdGhlIHJhbmdlIG9mIG9yZGluYWxzIGlzLiAqLwotCi0gIGlmIChwZV9kZWZfZmlsZS0+bmFtZSkKLSAgICB7Ci0gICAgICBkbGxfbmFtZSA9IHBlX2RlZl9maWxlLT5uYW1lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRsbF9uYW1lID0gYWJmZC0+ZmlsZW5hbWU7Ci0gICAgICBmb3IgKGRsbnAgPSBkbGxfbmFtZTsgKmRsbnA7IGRsbnArKykKLQl7Ci0JICBpZiAoKmRsbnAgPT0gJ1xcJyB8fCAqZGxucCA9PSAnLycgfHwgKmRsbnAgPT0gJzonKQotCSAgICBkbGxfbmFtZSA9IGRsbnAgKyAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKGNvdW50X3dpdGhfb3JkaW5hbHMgJiYgbWF4X29yZGluYWwgPiBjb3VudF9leHBvcnRlZCkKLSAgICB7Ci0gICAgICBpZiAobWluX29yZGluYWwgPiBtYXhfb3JkaW5hbCAtIGNvdW50X2V4cG9ydGVkICsgMSkKLQltaW5fb3JkaW5hbCA9IG1heF9vcmRpbmFsIC0gY291bnRfZXhwb3J0ZWQgKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1pbl9vcmRpbmFsID0gMTsKLSAgICAgIG1heF9vcmRpbmFsID0gY291bnRfZXhwb3J0ZWQ7Ci0gICAgfQotICBleHBvcnRfdGFibGVfc2l6ZSA9IG1heF9vcmRpbmFsIC0gbWluX29yZGluYWwgKyAxOwotCi0gIGV4cG9ydGVkX3N5bWJvbHMgPSAoaW50ICopIHhtYWxsb2MgKGV4cG9ydF90YWJsZV9zaXplICogc2l6ZW9mIChpbnQpKTsKLSAgZm9yIChpID0gMDsgaSA8IGV4cG9ydF90YWJsZV9zaXplOyBpKyspCi0gICAgZXhwb3J0ZWRfc3ltYm9sc1tpXSA9IC0xOwotCi0gIC8qIE5vdyB3ZSBuZWVkIHRvIGFzc2lnbiBvcmRpbmFscyB0byB0aG9zZSB0aGF0IGRvbid0IGhhdmUgdGhlbSAqLwotICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldKQotCXsKLQkgIGlmIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsICE9IC0xKQotCSAgICB7Ci0JICAgICAgaW50IGVpID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCAtIG1pbl9vcmRpbmFsOwotCSAgICAgIGludCBwaSA9IGV4cG9ydGVkX3N5bWJvbHNbZWldOwotCSAgICAgIGlmIChwaSAhPSAtMSkKLQkJewotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgZWluZm8gKF8oIiVYRXJyb3IsIG9yaWRpbmFsIHVzZWQgdHdpY2U6ICVkICglcyB2cyAlcylcbiIpLAotCQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwsCi0JCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSwKLQkJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1twaV0ubmFtZSk7Ci0JCX0KLQkgICAgICBleHBvcnRlZF9zeW1ib2xzW2VpXSA9IGk7Ci0JICAgIH0KLQkgIG5hbWVfdGFibGVfc2l6ZSArPSBzdHJsZW4gKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUpICsgMTsKLQl9Ci0gICAgfQotCi0gIG5leHRfb3JkaW5hbCA9IG1pbl9vcmRpbmFsOwotICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKLSAgICBpZiAoZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldKQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgPT0gLTEpCi0JewotCSAgd2hpbGUgKGV4cG9ydGVkX3N5bWJvbHNbbmV4dF9vcmRpbmFsIC0gbWluX29yZGluYWxdICE9IC0xKQotCSAgICBuZXh0X29yZGluYWwrKzsKLQkgIGV4cG9ydGVkX3N5bWJvbHNbbmV4dF9vcmRpbmFsIC0gbWluX29yZGluYWxdID0gaTsKLQkgIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgPSBuZXh0X29yZGluYWw7Ci0JfQotCi0gIC8qIE9LLCBub3cgd2UgY2FuIGFsbG9jYXRlIHNvbWUgbWVtb3J5ICovCi0KLSAgZWRhdGFfc3ogPSAoNDAJCS8qIGRpcmVjdG9yeSAqLwotCSAgICAgICsgNCAqIGV4cG9ydF90YWJsZV9zaXplCS8qIGFkZHJlc3NlcyAqLwotCSAgICAgICsgNCAqIGNvdW50X2V4cG9ydGVkX2J5bmFtZQkvKiBuYW1lIHB0cnMgKi8KLQkgICAgICArIDIgKiBjb3VudF9leHBvcnRlZF9ieW5hbWUJLyogb3JkaW5hbHMgKi8KLQkgICAgICArIG5hbWVfdGFibGVfc2l6ZSArIHN0cmxlbiAoZGxsX25hbWUpICsgMSk7Ci19Ci0KLS8qIEZpbGwgdGhlIGV4cG9ydGVkIHN5bWJvbCBvZmZzZXRzLiBUaGUgcHJlbGltaW5hcnkgd29yayBoYXMgYWxyZWFkeQotICAgYmVlbiBkb25lIGluIHByb2Nlc3NfZGVmX2ZpbGUoKS4gICovCi0KLXN0YXRpYyB2b2lkCi1maWxsX2V4cG9ydGVkX29mZnNldHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGludCBpLCBqOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmxoZTsKLSAgYmZkICpiOwotICBzdHJ1Y3Qgc2VjICpzOwotICBkZWZfZmlsZV9leHBvcnQgKmU9MDsKLQotICBmb3IgKGkgPSAwOyBpIDwgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzOyBpKyspCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSkgKyAyKTsKLSAgICAgIGlmIChwZV9kZXRhaWxzLT51bmRlcnNjb3JlZCkKLQl7Ci0JICAqbmFtZSA9ICdfJzsKLQkgIHN0cmNweSAobmFtZSArIDEsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQlzdHJjcHkgKG5hbWUsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCi0gICAgICBibGhlID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsCi0JCQkJICAgbmFtZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoYmxoZSAmJiAoYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpKQotCXsKLQkgIGV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzW2ldID0gYmxoZS0+dS5kZWYudmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIGZyZWUgKG5hbWUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWZpbGxfZWRhdGEgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGksIGhpbnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKmVkaXJlY3Rvcnk7Ci0gIHVuc2lnbmVkIGxvbmcgKmVhZGRyZXNzZXM7Ci0gIHVuc2lnbmVkIGxvbmcgKmVuYW1lcHRyczsKLSAgdW5zaWduZWQgc2hvcnQgKmVvcmRpbmFsczsKLSAgdW5zaWduZWQgY2hhciAqZW5hbWVzdHI7Ci0gIHRpbWVfdCBub3c7Ci0KLSAgdGltZSAoJm5vdyk7Ci0KLSAgZWRhdGFfZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGVkYXRhX3N6KTsKLQotICAvKiBOb3RlIHVzZSBvZiBhcnJheSBwb2ludGVyIG1hdGggaGVyZSAqLwotICBlZGlyZWN0b3J5ID0gZWRhdGFfZDsKLSAgZWFkZHJlc3NlcyA9ICh1bnNpZ25lZCBsb25nICopIChlZGF0YV9kICsgNDApOwotICBlbmFtZXB0cnMgPSBlYWRkcmVzc2VzICsgZXhwb3J0X3RhYmxlX3NpemU7Ci0gIGVvcmRpbmFscyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoZW5hbWVwdHJzICsgY291bnRfZXhwb3J0ZWRfYnluYW1lKTsKLSAgZW5hbWVzdHIgPSAoY2hhciAqKSAoZW9yZGluYWxzICsgY291bnRfZXhwb3J0ZWRfYnluYW1lKTsKLQotI2RlZmluZSBFUlZBKHB0cikgKCgodW5zaWduZWQgY2hhciAqKShwdHIpIC0gZWRhdGFfZCkgKyBlZGF0YV9zLT5vdXRwdXRfc2VjdGlvbi0+dm1hIC0gaW1hZ2VfYmFzZSkKLQotICBtZW1zZXQgKGVkYXRhX2QsIDAsIDQwKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgbm93LCBlZGF0YV9kICsgNCk7Ci0gIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciwgZWRhdGFfZCArIDgpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3IsIGVkYXRhX2QgKyAxMCk7Ci0gICAgfQotICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlbmFtZXN0ciksIGVkYXRhX2QgKyAxMik7Ci0gIHN0cmNweSAoZW5hbWVzdHIsIGRsbF9uYW1lKTsKLSAgZW5hbWVzdHIgKz0gc3RybGVuIChlbmFtZXN0cikgKyAxOwotICBiZmRfcHV0XzMyIChhYmZkLCBtaW5fb3JkaW5hbCwgZWRhdGFfZCArIDE2KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgZXhwb3J0X3RhYmxlX3NpemUsIGVkYXRhX2QgKyAyMCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50X2V4cG9ydGVkX2J5bmFtZSwgZWRhdGFfZCArIDI0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZWFkZHJlc3NlcyksIGVkYXRhX2QgKyAyOCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVuYW1lcHRycyksIGVkYXRhX2QgKyAzMik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVvcmRpbmFscyksIGVkYXRhX2QgKyAzNik7Ci0KLSAgZmlsbF9leHBvcnRlZF9vZmZzZXRzIChhYmZkLCBpbmZvKTsKLQotICAvKiBPaywgbm93IGZvciB0aGUgZmlsbGluZyBpbiBwYXJ0ICovCi0gIGhpbnQgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0X3RhYmxlX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgcyA9IGV4cG9ydGVkX3N5bWJvbHNbaV07Ci0gICAgICBpZiAocyAhPSAtMSkKLQl7Ci0JICBzdHJ1Y3Qgc2VjICpzc2VjID0gZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW3NdOwotCSAgdW5zaWduZWQgbG9uZyBzcnZhID0gKGV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzW3NdCi0JCQkJKyBzc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgYmZkX3B1dF8zMiAoYWJmZCwgc3J2YSAtIGltYWdlX2Jhc2UsICh2b2lkICopIChlYWRkcmVzc2VzICsgaSkpOwotCSAgaWYgKCFwZV9kZWZfZmlsZS0+ZXhwb3J0c1tzXS5mbGFnX25vbmFtZSkKLQkgICAgewotCSAgICAgIGNoYXIgKmVuYW1lID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbc10ubmFtZTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlbmFtZXN0ciksICh2b2lkICopIGVuYW1lcHRycyk7Ci0JICAgICAgc3RyY3B5IChlbmFtZXN0ciwgZW5hbWUpOwotCSAgICAgIGVuYW1lc3RyICs9IHN0cmxlbiAoZW5hbWVzdHIpICsgMTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpLCAodm9pZCAqKSBlb3JkaW5hbHMpOwotCSAgICAgIGVuYW1lcHRycysrOwotCSAgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW3NdLmhpbnQgPSBoaW50Kys7Ci0JICAgIH0KLQkgIGVvcmRpbmFscysrOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEdhdGhlciBhbGwgdGhlIHJlbG9jYXRpb25zIGFuZCBidWlsZCB0aGUgLnJlbG9jIHNlY3Rpb24KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX3JlbG9jIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotCi0gIC8qIGZvciAucmVsb2Mgc3R1ZmYgKi8KLSAgcmVsb2NfZGF0YV90eXBlICpyZWxvY19kYXRhOwotICBpbnQgdG90YWxfcmVsb2NzID0gMDsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIGxvbmcgc2VjX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgKC0xKTsKLSAgdW5zaWduZWQgbG9uZyBwYWdlX3B0ciwgcGFnZV9jb3VudDsKLSAgaW50IGJpOwotICBiZmQgKmI7Ci0gIHN0cnVjdCBzZWMgKnM7Ci0KLSAgdG90YWxfcmVsb2NzID0gMDsKLSAgZm9yIChiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYiA9IGItPmxpbmtfbmV4dCkKLSAgICBmb3IgKHMgPSBiLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0gICAgICB0b3RhbF9yZWxvY3MgKz0gcy0+cmVsb2NfY291bnQ7Ci0KLSAgcmVsb2NfZGF0YSA9IChyZWxvY19kYXRhX3R5cGUgKikgeG1hbGxvYyAodG90YWxfcmVsb2NzICogc2l6ZW9mIChyZWxvY19kYXRhX3R5cGUpKTsKLQotICB0b3RhbF9yZWxvY3MgPSAwOwotICBiaSA9IDA7Ci0gIGZvciAoYmkgPSAwLCBiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYmkrKywgYiA9IGItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsb2NzOwotICAgICAgaW50IHJlbHNpemUsIG5yZWxvY3MsIGk7Ci0KLSAgICAgIGZvciAocyA9IGItPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHNlY192bWEgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldDsKLQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCSAgaW50IG5zeW1zLCBzeW1zaXplOwotCi0JICAvKiBpZiBpdCdzIG5vdCBsb2FkZWQsIHdlIGRvbid0IG5lZWQgdG8gcmVsb2NhdGUgaXQgdGhpcyB3YXkgKi8KLQkgIGlmICghKHMtPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhlcmUgd291bGQgYmUgYSByZWxvYyBmb3IgdGhlc2UsIGJ1dCBJJ3ZlCi0JICAgICBzZWVuIGl0IGhhcHBlbiAtIERKICovCi0JICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hID09IDApCi0JICAgIHsKLQkgICAgICAvKiBIdWg/ICBTaG91bGRuJ3QgaGFwcGVuLCBidXQgcHVudCBpZiBpdCBkb2VzICovCi0JICAgICAgZWluZm8gKCJESjogemVybyB2bWEgc2VjdGlvbiByZWxvYyBkZXRlY3RlZDogYCVzJyAjJWQgZj0lZFxuIiwKLQkJICAgICBzLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgcy0+b3V0cHV0X3NlY3Rpb24tPmluZGV4LAotCQkgICAgIHMtPm91dHB1dF9zZWN0aW9uLT5mbGFncyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChiKTsKLQkgIHN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICBuc3ltcyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChiLCBzeW1ib2xzKTsKLQotCSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGIsIHMpOwotCSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKChzaXplX3QpIHJlbHNpemUpOwotCSAgbnJlbG9jcyA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGIsIHMsIHJlbG9jcywgc3ltYm9scyk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBucmVsb2NzOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoIXJlbG9jc1tpXS0+aG93dG8tPnBjX3JlbGF0aXZlCi0JCSAgJiYgcmVsb2NzW2ldLT5ob3d0by0+dHlwZSAhPSBwZV9kZXRhaWxzLT5pbWFnZWJhc2VfcmVsb2MpCi0JCXsKLQkJICBiZmRfdm1hIHN5bV92bWE7Ci0JCSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltID0gKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHI7Ci0JCSAgc3ltX3ZtYSA9IChyZWxvY3NbaV0tPmFkZGVuZAotCQkJICAgICArIHN5bS0+dmFsdWUKLQkJCSAgICAgKyBzeW0tPnNlY3Rpb24tPnZtYQotCQkJICAgICArIHN5bS0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICArIHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgcmVsb2NfZGF0YVt0b3RhbF9yZWxvY3NdLnZtYSA9IHNlY192bWEgKyByZWxvY3NbaV0tPmFkZHJlc3M7Ci0JCSAgc3dpdGNoIChyZWxvY3NbaV0tPmhvd3RvLT5iaXRzaXplKjEwMDAKLQkJCSAgKyByZWxvY3NbaV0tPmhvd3RvLT5yaWdodHNoaWZ0KQotCQkgICAgewotCQkgICAgY2FzZSAzMjAwMDoKLQkJICAgICAgcmVsb2NfZGF0YVt0b3RhbF9yZWxvY3NdLnR5cGUgPSAzOwotCQkgICAgICB0b3RhbF9yZWxvY3MrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgICAgICBlaW5mbyAoXygiJVhFcnJvcjogJWQtYml0IHJlbG9jIGluIGRsbFxuIiksCi0JCQkgICAgIHJlbG9jc1tpXS0+aG93dG8tPmJpdHNpemUpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBmcmVlIChyZWxvY3MpOwotCSAgLyogV2FybmluZzogdGhlIGFsbG9jYXRlZCBzeW1ib2xzIGFyZSByZW1lbWJlcmVkIGluIEJGRCBhbmQgcmV1c2VkCi0JICAgICBsYXRlciwgc28gZG9uJ3QgZnJlZSB0aGVtISAqLwotCSAgLyogZnJlZSAoc3ltYm9scyk7ICovCi0JfQotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHRvdGFsX3JlbG9jcyByZWxvY2F0aW9uIGFkZHJlc3NlcyBpbgotICAgICByZWxvY19hZGRyZXNzZXMsIHdoaWNoIGFyZSBhbGwgc3VpdGFibGUgZm9yIHRoZSAucmVsb2Mgc2VjdGlvbi4KLSAgICAgV2UgbXVzdCBub3cgY3JlYXRlIHRoZSBuZXcgc2VjdGlvbnMuICovCi0KLSAgcXNvcnQgKHJlbG9jX2RhdGEsIHRvdGFsX3JlbG9jcywgc2l6ZW9mICgqcmVsb2NfZGF0YSksIHJlbG9jX3NvcnQpOwotCi0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9yZWxvY3M7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRoaXNfcGFnZSA9IChyZWxvY19kYXRhW2ldLnZtYSA+PiAxMik7Ci0gICAgICBpZiAodGhpc19wYWdlICE9IHNlY19wYWdlKQotCXsKLQkgIHJlbG9jX3N6ID0gKHJlbG9jX3N6ICsgMykgJiB+MzsJLyogNC1ieXRlIGFsaWduICovCi0JICByZWxvY19zeiArPSA4OwotCSAgc2VjX3BhZ2UgPSB0aGlzX3BhZ2U7Ci0JfQotICAgICAgcmVsb2Nfc3ogKz0gMjsKLSAgICB9Ci0gIHJlbG9jX3N6ID0gKHJlbG9jX3N6ICsgMykgJiB+MzsJLyogNC1ieXRlIGFsaWduICovCi0KLSAgcmVsb2NfZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKHJlbG9jX3N6KTsKLQotICBzZWNfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSAoLTEpOwotICByZWxvY19zeiA9IDA7Ci0gIHBhZ2VfcHRyID0gKHVuc2lnbmVkIGxvbmcpICgtMSk7Ci0gIHBhZ2VfY291bnQgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfcmVsb2NzOyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBydmEgPSByZWxvY19kYXRhW2ldLnZtYSAtIGltYWdlX2Jhc2U7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRoaXNfcGFnZSA9IChydmEgJiB+MHhmZmYpOwotICAgICAgaWYgKHRoaXNfcGFnZSAhPSBzZWNfcGFnZSkKLQl7Ci0JICB3aGlsZSAocmVsb2Nfc3ogJiAzKQotCSAgICByZWxvY19kW3JlbG9jX3N6KytdID0gMDsKLQkgIGlmIChwYWdlX3B0ciAhPSAodW5zaWduZWQgbG9uZykgKC0xKSkKLQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2Nfc3ogLSBwYWdlX3B0ciwgcmVsb2NfZCArIHBhZ2VfcHRyICsgNCk7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCB0aGlzX3BhZ2UsIHJlbG9jX2QgKyByZWxvY19zeik7Ci0JICBwYWdlX3B0ciA9IHJlbG9jX3N6OwotCSAgcmVsb2Nfc3ogKz0gODsKLQkgIHNlY19wYWdlID0gdGhpc19wYWdlOwotCSAgcGFnZV9jb3VudCA9IDA7Ci0JfQotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgKHJ2YSAmIDB4ZmZmKSArIChyZWxvY19kYXRhW2ldLnR5cGU8PDEyKSwKLQkJICByZWxvY19kICsgcmVsb2Nfc3opOwotICAgICAgcmVsb2Nfc3ogKz0gMjsKLSAgICAgIGlmIChyZWxvY19kYXRhW2ldLnR5cGUgPT0gNCkKLQl7Ci0JICBiZmRfcHV0XzE2IChhYmZkLCByZWxvY19kYXRhW2ldLmV4dHJhLCByZWxvY19kICsgcmVsb2Nfc3opOwotCSAgcmVsb2Nfc3ogKz0gMjsKLQl9Ci0gICAgICBwYWdlX2NvdW50Kys7Ci0gICAgfQotICB3aGlsZSAocmVsb2Nfc3ogJiAzKQotICAgIHJlbG9jX2RbcmVsb2Nfc3orK10gPSAwOwotICBpZiAocGFnZV9wdHIgIT0gKHVuc2lnbmVkIGxvbmcpICgtMSkpCi0gICAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2Nfc3ogLSBwYWdlX3B0ciwgcmVsb2NfZCArIHBhZ2VfcHRyICsgNCk7Ci0gIHdoaWxlIChyZWxvY19zeiA8IHJlbG9jX3MtPl9yYXdfc2l6ZSkKLSAgICByZWxvY19kW3JlbG9jX3N6KytdID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gR2l2ZW4gdGhlIGV4aXRpbmcgZGVmX2ZpbGUgc3RydWN0dXJlLCBwcmludCBvdXQgYSAuREVGIGZpbGUgdGhhdAotIGNvcnJlc3BvbmRzIHRvIGl0LgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotcXVvdGVwdXQgKHMsIGYsIG5lZWRzX3F1b3RlcykKLSAgICAgY2hhciAqczsKLSAgICAgRklMRSAqIGY7Ci0gICAgIGludCBuZWVkc19xdW90ZXM7Ci17Ci0gIGNoYXIgKmNwOwotICBmb3IgKGNwID0gczsgKmNwOyBjcCsrKQotICAgIGlmICgqY3AgPT0gJ1wnJwotCXx8ICpjcCA9PSAnIicKLQl8fCAqY3AgPT0gJ1xcJwotCXx8IGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqY3ApCi0JfHwgKmNwID09ICcsJwotCXx8ICpjcCA9PSAnOycpCi0gICAgICBuZWVkc19xdW90ZXMgPSAxOwotICBpZiAobmVlZHNfcXVvdGVzKQotICAgIHsKLSAgICAgIHB1dGMgKCciJywgZik7Ci0gICAgICB3aGlsZSAoKnMpCi0JewotCSAgaWYgKCpzID09ICciJyB8fCAqcyA9PSAnXFwnKQotCSAgICBwdXRjICgnXFwnLCBmKTsKLQkgIHB1dGMgKCpzLCBmKTsKLQkgIHMrKzsKLQl9Ci0gICAgICBwdXRjICgnIicsIGYpOwotICAgIH0KLSAgZWxzZQotICAgIGZwdXRzIChzLCBmKTsKLX0KLQotdm9pZAotcGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlIChwZV9vdXRfZGVmX2ZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpwZV9vdXRfZGVmX2ZpbGVuYW1lOwotewotICBpbnQgaTsKLSAgRklMRSAqb3V0ID0gZm9wZW4gKHBlX291dF9kZWZfZmlsZW5hbWUsICJ3Iik7Ci0gIGlmIChvdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZWluZm8gKF8oIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBkZWYgZmlsZSAlc1xuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIHBlX291dF9kZWZfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAocGVfZGVmX2ZpbGUpCi0gICAgewotICAgICAgaWYgKHBlX2RlZl9maWxlLT5uYW1lKQotCXsKLQkgIGlmIChwZV9kZWZfZmlsZS0+aXNfZGxsKQotCSAgICBmcHJpbnRmIChvdXQsICJMSUJSQVJZICIpOwotCSAgZWxzZQotCSAgICBmcHJpbnRmIChvdXQsICJOQU1FICIpOwotCSAgcXVvdGVwdXQgKHBlX2RlZl9maWxlLT5uYW1lLCBvdXQsIDEpOwotCSAgaWYgKHBlX2RhdGEgKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKQotCSAgICBmcHJpbnRmIChvdXQsICIgQkFTRT0weCVseCIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIHBlX2RhdGEgKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKTsKLQkgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JfQotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmRlc2NyaXB0aW9uKQotCXsKLQkgIGZwcmludGYgKG91dCwgIkRFU0NSSVBUSU9OICIpOwotCSAgcXVvdGVwdXQgKHBlX2RlZl9maWxlLT5kZXNjcmlwdGlvbiwgb3V0LCAxKTsKLQkgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JfQotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3IgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiVkVSU0lPTiAlZC4lZFxuIiwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IsCi0JCSBwZV9kZWZfZmlsZS0+dmVyc2lvbl9taW5vcik7Ci0gICAgICBlbHNlIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJWRVJTSU9OICVkXG4iLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvcik7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSAhPSAtMSB8fCBwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlICE9IC0xKQotCWZwcmludGYgKG91dCwgIlxuIik7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0ICE9IC0xKQotCWZwcmludGYgKG91dCwgIlNUQUNLU0laRSAweCV4LDB4JXhcbiIsCi0JCSBwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSwgcGVfZGVmX2ZpbGUtPnN0YWNrX2NvbW1pdCk7Ci0gICAgICBlbHNlIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJTVEFDS1NJWkUgMHgleFxuIiwgcGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUpOwotICAgICAgaWYgKHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdCAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJIRUFQU0laRSAweCV4LDB4JXhcbiIsCi0JCSBwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlLCBwZV9kZWZfZmlsZS0+aGVhcF9jb21taXQpOwotICAgICAgZWxzZSBpZiAocGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJIRUFQU0laRSAweCV4XG4iLCBwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlKTsKLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5udW1fc2VjdGlvbl9kZWZzID4gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXQsICJcblNFQ1RJT05TXG5cbiIpOwotCSAgZm9yIChpID0gMDsgaSA8IHBlX2RlZl9maWxlLT5udW1fc2VjdGlvbl9kZWZzOyBpKyspCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChvdXQsICIgICAgIik7Ci0JICAgICAgcXVvdGVwdXQgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSwgb3V0LCAwKTsKLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcykKLQkJewotCQkgIGZwcmludGYgKG91dCwgIiBDTEFTUyAiKTsKLQkJICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcywgb3V0LCAwKTsKLQkJfQotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfcmVhZCkKLQkJZnByaW50ZiAob3V0LCAiIFJFQUQiKTsKLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3dyaXRlKQotCQlmcHJpbnRmIChvdXQsICIgV1JJVEUiKTsKLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX2V4ZWN1dGUpCi0JCWZwcmludGYgKG91dCwgIiBFWEVDVVRFIik7Ci0JICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19zaGFyZWQpCi0JCWZwcmludGYgKG91dCwgIiBTSEFSRUQiKTsKLQkgICAgICBmcHJpbnRmIChvdXQsICJcbiIpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzID4gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXQsICJcbkVYUE9SVFNcblxuIik7Ci0JICBmb3IgKGkgPSAwOyBpIDwgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzOyBpKyspCi0JICAgIHsKLQkgICAgICBkZWZfZmlsZV9leHBvcnQgKmUgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0cyArIGk7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiICAgICIpOwotCSAgICAgIHF1b3RlcHV0IChlLT5uYW1lLCBvdXQsIDApOwotCSAgICAgIGlmIChlLT5pbnRlcm5hbF9uYW1lICYmIHN0cmNtcCAoZS0+aW50ZXJuYWxfbmFtZSwgZS0+bmFtZSkpCi0JCXsKLQkJICBmcHJpbnRmIChvdXQsICIgPSAiKTsKLQkJICBxdW90ZXB1dCAoZS0+aW50ZXJuYWxfbmFtZSwgb3V0LCAwKTsKLQkJfQotCSAgICAgIGlmIChlLT5vcmRpbmFsICE9IC0xKQotCQlmcHJpbnRmIChvdXQsICIgQCVkIiwgZS0+b3JkaW5hbCk7Ci0JICAgICAgaWYgKGUtPmZsYWdfcHJpdmF0ZSkKLQkJZnByaW50ZiAob3V0LCAiIFBSSVZBVEUiKTsKLQkgICAgICBpZiAoZS0+ZmxhZ19jb25zdGFudCkKLQkJZnByaW50ZiAob3V0LCAiIENPTlNUQU5UIik7Ci0JICAgICAgaWYgKGUtPmZsYWdfbm9uYW1lKQotCQlmcHJpbnRmIChvdXQsICIgTk9OQU1FIik7Ci0JICAgICAgaWYgKGUtPmZsYWdfZGF0YSkKLQkJZnByaW50ZiAob3V0LCAiIERBVEEiKTsKLQotCSAgICAgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+bnVtX2ltcG9ydHMgPiAwKQotCXsKLQkgIGZwcmludGYgKG91dCwgIlxuSU1QT1JUU1xuXG4iKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBwZV9kZWZfZmlsZS0+bnVtX2ltcG9ydHM7IGkrKykKLQkgICAgewotCSAgICAgIGRlZl9maWxlX2ltcG9ydCAqaW0gPSBwZV9kZWZfZmlsZS0+aW1wb3J0cyArIGk7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiICAgICIpOwotCSAgICAgIGlmIChpbS0+aW50ZXJuYWxfbmFtZQotCQkgICYmICghaW0tPm5hbWUgfHwgc3RyY21wIChpbS0+aW50ZXJuYWxfbmFtZSwgaW0tPm5hbWUpKSkKLQkJewotCQkgIHF1b3RlcHV0IChpbS0+aW50ZXJuYWxfbmFtZSwgb3V0LCAwKTsKLQkJICBmcHJpbnRmIChvdXQsICIgPSAiKTsKLQkJfQotCSAgICAgIHF1b3RlcHV0IChpbS0+bW9kdWxlLT5uYW1lLCBvdXQsIDApOwotCSAgICAgIGZwcmludGYgKG91dCwgIi4iKTsKLQkgICAgICBpZiAoaW0tPm5hbWUpCi0JCXF1b3RlcHV0IChpbS0+bmFtZSwgb3V0LCAwKTsKLQkgICAgICBlbHNlCi0JCWZwcmludGYgKG91dCwgIiVkIiwgaW0tPm9yZGluYWwpOwotCSAgICAgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgZnByaW50ZiAob3V0LCBfKCI7IG5vIGNvbnRlbnRzIGF2YWlsYWJsZVxuIikpOwotCi0gIGlmIChmY2xvc2UgKG91dCkgPT0gRU9GKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBlaW5mbyAoXygiJVA6IEVycm9yIGNsb3NpbmcgZmlsZSBgJXMnXG4iKSwgcGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBHZW5lcmF0ZSB0aGUgaW1wb3J0IGxpYnJhcnkKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFzeW1ib2wgKipzeW10YWI7Ci1zdGF0aWMgaW50IHN5bXB0cjsKLXN0YXRpYyBpbnQgdG1wX3NlcTsKLXN0YXRpYyBjb25zdCBjaGFyICpkbGxfZmlsZW5hbWU7Ci1zdGF0aWMgY2hhciAqZGxsX3N5bW5hbWU7Ci0KLSNkZWZpbmUgVU5EU0VDIChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9uCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1xdWlja19zZWN0aW9uKGFiZmQsIG5hbWUsIGZsYWdzLCBhbGlnbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZmxhZ3M7Ci0gICAgIGludCBhbGlnbjsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqc3ltOwotCi0gIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncwotCQkJCSAgfCBTRUNfQUxMT0MKLQkJCQkgIHwgU0VDX0xPQUQKLQkJCQkgIHwgU0VDX0tFRVAKLQkJCSApOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIGFsaWduKTsKLSAgLyogcmVtZW1iZXIgdG8gdW5kbyB0aGlzIGJlZm9yZSB0cnlpbmcgdG8gbGluayBpbnRlcm5hbGx5ISAqLwotICBzZWMtPm91dHB1dF9zZWN0aW9uID0gc2VjOwotCi0gIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIHN5bXRhYltzeW1wdHIrK10gPSBzeW07Ci0gIHN5bS0+bmFtZSA9IHNlYy0+bmFtZTsKLSAgc3ltLT5zZWN0aW9uID0gc2VjOwotICBzeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotICBzeW0tPnZhbHVlID0gMDsKLQotICByZXR1cm4gc2VjOwotfQotCi1zdGF0aWMgdm9pZAotcXVpY2tfc3ltYm9sIChhYmZkLCBuMSwgbjIsIG4zLCBzZWMsIGZsYWdzLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm4xOwotICAgICBjaGFyICpuMjsKLSAgICAgY2hhciAqbjM7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCBmbGFnczsKLSAgICAgaW50IGFkZHI7Ci17Ci0gIGFzeW1ib2wgKnN5bTsKLSAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobjEpICsgc3RybGVuIChuMikgKyBzdHJsZW4gKG4zKSArIDEpOwotICBzdHJjcHkgKG5hbWUsIG4xKTsKLSAgc3RyY2F0IChuYW1lLCBuMik7Ci0gIHN0cmNhdCAobmFtZSwgbjMpOwotICBzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBzeW0tPm5hbWUgPSBuYW1lOwotICBzeW0tPnNlY3Rpb24gPSBzZWM7Ci0gIHN5bS0+ZmxhZ3MgPSBmbGFnczsKLSAgc3ltLT52YWx1ZSA9IGFkZHI7Ci0gIHN5bXRhYltzeW1wdHIrK10gPSBzeW07Ci19Ci0KLXN0YXRpYyBhcmVsZW50ICpyZWx0YWIgPSAwOwotc3RhdGljIGludCByZWxjb3VudCA9IDAsIHJlbHNpemUgPSAwOwotCi1zdGF0aWMgdm9pZAotcXVpY2tfcmVsb2MgKGFiZmQsIGFkZHJlc3MsIHdoaWNoX2hvd3RvLCBzeW1pZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGFkZHJlc3M7Ci0gICAgIGludCB3aGljaF9ob3d0bzsKLSAgICAgaW50IHN5bWlkeDsKLXsKLSAgaWYgKHJlbGNvdW50ID49IChyZWxzaXplLTEpKQotICAgIHsKLSAgICAgIHJlbHNpemUgKz0gMTA7Ci0gICAgICBpZiAocmVsdGFiKQotCXJlbHRhYiA9IChhcmVsZW50ICopIHhyZWFsbG9jIChyZWx0YWIsIHJlbHNpemUgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgICAgIGVsc2UKLQlyZWx0YWIgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChyZWxzaXplICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgfQotICByZWx0YWJbcmVsY291bnRdLmFkZHJlc3MgPSBhZGRyZXNzOwotICByZWx0YWJbcmVsY291bnRdLmFkZGVuZCA9IDA7Ci0gIHJlbHRhYltyZWxjb3VudF0uaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIHdoaWNoX2hvd3RvKTsKLSAgcmVsdGFiW3JlbGNvdW50XS5zeW1fcHRyX3B0ciA9IHN5bXRhYiArIHN5bWlkeDsKLSAgcmVsY291bnQrKzsKLX0KLQotc3RhdGljIHZvaWQKLXNhdmVfcmVsb2NzIChhc2VjdGlvbiAqc2VjKQotewotICBpbnQgaTsKLSAgc2VjLT5yZWxvY2F0aW9uID0gcmVsdGFiOwotICBzZWMtPnJlbG9jX2NvdW50ID0gcmVsY291bnQ7Ci0gIHNlYy0+b3JlbG9jYXRpb24gPSAoYXJlbGVudCAqKikgeG1hbGxvYyAoKHJlbGNvdW50KzEpICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgZm9yIChpPTA7IGk8cmVsY291bnQ7IGkrKykKLSAgICBzZWMtPm9yZWxvY2F0aW9uW2ldID0gc2VjLT5yZWxvY2F0aW9uICsgaTsKLSAgc2VjLT5vcmVsb2NhdGlvbltyZWxjb3VudF0gPSAwOwotICBzZWMtPmZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgcmVsdGFiID0gMDsKLSAgcmVsY291bnQgPSByZWxzaXplID0gMDsKLX0KLQotLyoKLSAqCS5zZWN0aW9uCS5pZGF0YSQyCi0gKgkuZ2xvYmFsCQlfX2hlYWRfbXlfZGxsCi0gKiBfX2hlYWRfbXlfZGxsOgotICoJLnJ2YQkJaG5hbWUKLSAqCS5sb25nCQkwCi0gKgkubG9uZwkJMAotICoJLnJ2YQkJX19teV9kbGxfaW5hbWUKLSAqCS5ydmEJCWZ0aHVuawotICoKLSAqCS5zZWN0aW9uCS5pZGF0YSQ1Ci0gKgkubG9uZwkJMAotICogZnRodW5rOgotICoKLSAqCS5zZWN0aW9uCS5pZGF0YSQ0Ci0gKgkubG9uZwkJMAotICogaG5hbWU6Ci0gKi8KLQotc3RhdGljIGJmZCAqCi1tYWtlX2hlYWQgKHBhcmVudCkKLSAgICAgYmZkICpwYXJlbnQ7Ci17Ci0gIGFzZWN0aW9uICppZDIsICppZDUsICppZDQ7Ci0gIHVuc2lnbmVkIGNoYXIgKmQyLCAqZDUsICpkNDsKLSAgY2hhciAqb25hbWU7Ci0gIGJmZCAqYWJmZDsKLQotICBvbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgc3ByaW50ZiAob25hbWUsICJkJTA2ZC5vIiwgdG1wX3NlcSk7Ci0gIHRtcF9zZXErKzsKLQotICBhYmZkID0gYmZkX2NyZWF0ZSAob25hbWUsIHBhcmVudCk7Ci0gIGJmZF9maW5kX3RhcmdldCAocGVfZGV0YWlscy0+b2JqZWN0X3RhcmdldCwgYWJmZCk7Ci0gIGJmZF9tYWtlX3dyaXRhYmxlIChhYmZkKTsKLQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBwZV9kZXRhaWxzLT5iZmRfYXJjaCwgMCk7Ci0KLSAgc3ltcHRyID0gMDsKLSAgc3ltdGFiID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKDYgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZDIgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDIiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ1ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNCA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIl9oZWFkXyIpLCBkbGxfc3ltbmFtZSwgIiIsIGlkMiwgQlNGX0dMT0JBTCwgMCk7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiIiksIGRsbF9zeW1uYW1lLCAiX2luYW1lIiwgVU5EU0VDLCBCU0ZfR0xPQkFMLCAwKTsKLQotICAvKiBPSywgcGF5IGF0dGVudGlvbiBoZXJlLiAgSSBnb3QgY29uZnVzZWQgbXlzZWxmIGxvb2tpbmcgYmFjayBhdAotICAgICBpdC4gIFdlIGNyZWF0ZSBhIGZvdXItYnl0ZSBzZWN0aW9uIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgbGlzdCwgYW5kIHdlIGluY2x1ZGUgYW4gb2Zmc2V0IG9mIDQgaW4gdGhlIHNlY3Rpb24sIHNvIHRoYXQgdGhlCi0gICAgIHBvaW50ZXIgdG8gdGhlIGxpc3QgcG9pbnRzIHRvIHRoZSAqZW5kKiBvZiB0aGlzIHNlY3Rpb24sIHdoaWNoIGlzCi0gICAgIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBvZiBzZWN0aW9ucyBmcm9tIG90aGVyIG9iamVjdHMuICovCi0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkMiwgMjApOwotICBkMiA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgaWQyLT5jb250ZW50cyA9IGQyOwotICBtZW1zZXQgKGQyLCAwLCAyMCk7Ci0gIGQyWzBdID0gZDJbMTZdID0gNDsgLyogcmVsb2MgYWRkZW5kICovCi0gIHF1aWNrX3JlbG9jIChhYmZkLCAgMCwgQkZEX1JFTE9DX1JWQSwgMik7Ci0gIHF1aWNrX3JlbG9jIChhYmZkLCAxMiwgQkZEX1JFTE9DX1JWQSwgNCk7Ci0gIHF1aWNrX3JlbG9jIChhYmZkLCAxNiwgQkZEX1JFTE9DX1JWQSwgMSk7Ci0gIHNhdmVfcmVsb2NzIChpZDIpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDUsIDQpOwotICBkNSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDUtPmNvbnRlbnRzID0gZDU7Ci0gIG1lbXNldCAoZDUsIDAsIDQpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDQsIDQpOwotICBkNCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDQtPmNvbnRlbnRzID0gZDQ7Ci0gIG1lbXNldCAoZDQsIDAsIDQpOwotCi0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW10YWIsIHN5bXB0cik7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDIsIGQyLCAwLCAyMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ1LCBkNSwgMCwgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ0LCBkNCwgMCwgNCk7Ci0gIAotICBiZmRfbWFrZV9yZWFkYWJsZSAoYWJmZCk7Ci0gIHJldHVybiBhYmZkOwotfQotCi0vKgotICoJLnNlY3Rpb24JLmlkYXRhJDQKLSAqCS5sb25nCQkwCi0gKgkuc2VjdGlvbgkuaWRhdGEkNQotICoJLmxvbmcJCTAKLSAqCS5zZWN0aW9uCWlkYXRhJDcKLSAqCS5nbG9iYWwJCV9fbXlfZGxsX2luYW1lCi0gKl9fbXlfZGxsX2luYW1lOgotICoJLmFzY2l6CQkibXkuZGxsIgotICovCi0KLXN0YXRpYyBiZmQgKgotbWFrZV90YWlsIChwYXJlbnQpCi0gICAgIGJmZCAqcGFyZW50OwotewotICBhc2VjdGlvbiAqaWQ0LCAqaWQ1LCAqaWQ3OwotICB1bnNpZ25lZCBjaGFyICpkNCwgKmQ1LCAqZDc7Ci0gIGludCBsZW47Ci0gIGNoYXIgKm9uYW1lOwotICBiZmQgKmFiZmQ7Ci0KLSAgb25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIHNwcmludGYgKG9uYW1lLCAiZCUwNmQubyIsIHRtcF9zZXEpOwotICB0bXBfc2VxKys7Ci0KLSAgYWJmZCA9IGJmZF9jcmVhdGUgKG9uYW1lLCBwYXJlbnQpOwotICBiZmRfZmluZF90YXJnZXQgKHBlX2RldGFpbHMtPm9iamVjdF90YXJnZXQsIGFiZmQpOwotICBiZmRfbWFrZV93cml0YWJsZSAoYWJmZCk7Ci0KLSAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgcGVfZGV0YWlscy0+YmZkX2FyY2gsIDApOwotCi0gIHN5bXB0ciA9IDA7Ci0gIHN5bXRhYiA9IChhc3ltYm9sICoqKSB4bWFsbG9jICg1ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWQ0ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNSA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDcgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDciLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCIiKSwgZGxsX3N5bW5hbWUsICJfaW5hbWUiLCBpZDcsIEJTRl9HTE9CQUwsIDApOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDQsIDQpOwotICBkNCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDQtPmNvbnRlbnRzID0gZDQ7Ci0gIG1lbXNldCAoZDQsIDAsIDQpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDUsIDQpOwotICBkNSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDUtPmNvbnRlbnRzID0gZDU7Ci0gIG1lbXNldCAoZDUsIDAsIDQpOwotCi0gIGxlbiA9IHN0cmxlbiAoZGxsX2ZpbGVuYW1lKSsxOwotICBpZiAobGVuICYgMSkKLSAgICBsZW4gKys7Ci0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDcsIGxlbik7Ci0gIGQ3ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgaWQ3LT5jb250ZW50cyA9IGQ3OwotICBzdHJjcHkgKGQ3LCBkbGxfZmlsZW5hbWUpOwotCi0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW10YWIsIHN5bXB0cik7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDQsIGQ0LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDUsIGQ1LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDcsIGQ3LCAwLCBsZW4pOwotCi0gIGJmZF9tYWtlX3JlYWRhYmxlIChhYmZkKTsKLSAgcmV0dXJuIGFiZmQ7Ci19Ci0KLS8qCi0gKgkudGV4dAotICoJLmdsb2JhbAkJX2Z1bmN0aW9uCi0gKgkuZ2xvYmFsCQlfX19pbXBfZnVuY3Rpb24KLSAqCS5nbG9iYWwJCV9faW1wX19mdW5jdGlvbgotICpfZnVuY3Rpb246Ci0gKglqbXAJCSpfX2ltcF9fZnVuY3Rpb246Ci0gKgotICoJLnNlY3Rpb24JaWRhdGEkNwotICoJLmxvbmcJCV9faGVhZF9teV9kbGwKLSAqCi0gKgkuc2VjdGlvbgkuaWRhdGEkNQotICpfX19pbXBfZnVuY3Rpb246Ci0gKl9faW1wX19mdW5jdGlvbjoKLSAqaWF0PwotICoJLnNlY3Rpb24JLmlkYXRhJDQKLSAqaWF0PwotICoJLnNlY3Rpb24JLmlkYXRhJDYKLSAqSUQ8b3JkaW5hbD46Ci0gKgkuc2hvcnQJCTxoaW50PgotICoJLmFzY2l6CQkiZnVuY3Rpb24iIHhsYXRlPyAoYWRkIHVuZGVyc2NvcmUsIGtpbGwgYXQpCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgam1wX2l4ODZfYnl0ZXNbXSA9IHsKLSAgMHhmZiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MAotfTsKLQotCi1zdGF0aWMgYmZkICoKLW1ha2Vfb25lIChleHAsIHBhcmVudCkKLSAgICAgZGVmX2ZpbGVfZXhwb3J0ICpleHA7Ci0gICAgIGJmZCAqcGFyZW50OwotewotICBhc2VjdGlvbiAqdHgsICppZDcsICppZDUsICppZDQsICppZDY7Ci0gIHVuc2lnbmVkIGNoYXIgKnRkLCAqZDcsICpkNSwgKmQ0LCAqZDY7Ci0gIGludCBsZW47Ci0gIGNoYXIgKm9uYW1lOwotICBiZmQgKmFiZmQ7Ci0gIHVuc2lnbmVkIGNoYXIgKmptcF9ieXRlczsKLSAgaW50IGptcF9ieXRlX2NvdW50OwotCi0gIHN3aXRjaCAocGVfZGV0YWlscy0+cGVfYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBQRV9BUkNIX2kzODY6Ci0gICAgICBqbXBfYnl0ZXMgPSBqbXBfaXg4Nl9ieXRlczsKLSAgICAgIGptcF9ieXRlX2NvdW50ID0gc2l6ZW9mIChqbXBfaXg4Nl9ieXRlcyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgb25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIHNwcmludGYgKG9uYW1lLCAiZCUwNmQubyIsIHRtcF9zZXEpOwotICB0bXBfc2VxKys7Ci0KLSAgYWJmZCA9IGJmZF9jcmVhdGUgKG9uYW1lLCBwYXJlbnQpOwotICBiZmRfZmluZF90YXJnZXQgKHBlX2RldGFpbHMtPm9iamVjdF90YXJnZXQsIGFiZmQpOwotICBiZmRfbWFrZV93cml0YWJsZSAoYWJmZCk7Ci0KLSAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgcGVfZGV0YWlscy0+YmZkX2FyY2gsIDApOwotCi0gIHN5bXB0ciA9IDA7Ci0gIHN5bXRhYiA9IChhc3ltYm9sICoqKSB4bWFsbG9jICgxMCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIHR4ICA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIudGV4dCIsICAgIFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDcgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDciLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ1ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNCA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDYgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDYiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWYgKCEgZXhwLT5mbGFnX2RhdGEpCi0gICAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCIiKSwgZXhwLT5pbnRlcm5hbF9uYW1lLCAiIiwgdHgsIEJTRl9HTE9CQUwsIDApOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIl9oZWFkXyIpLCBkbGxfc3ltbmFtZSwgIiIsIFVORFNFQywgQlNGX0dMT0JBTCwgMCk7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiX19pbXBfIiksIGV4cC0+aW50ZXJuYWxfbmFtZSwgIiIsIGlkNSwgQlNGX0dMT0JBTCwgMCk7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiX2ltcF9fIiksIGV4cC0+aW50ZXJuYWxfbmFtZSwgIiIsIGlkNSwgQlNGX0dMT0JBTCwgMCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHR4LCBqbXBfYnl0ZV9jb3VudCk7Ci0gIHRkID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoam1wX2J5dGVfY291bnQpOwotICB0eC0+Y29udGVudHMgPSB0ZDsKLSAgbWVtY3B5ICh0ZCwgam1wX2J5dGVzLCBqbXBfYnl0ZV9jb3VudCk7Ci0gIHN3aXRjaCAocGVfZGV0YWlscy0+cGVfYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBQRV9BUkNIX2kzODY6Ci0gICAgICBxdWlja19yZWxvYyAoYWJmZCwgMiwgQkZEX1JFTE9DXzMyLCAyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgc2F2ZV9yZWxvY3MgKHR4KTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ3LCA0KTsKLSAgZDcgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ3LT5jb250ZW50cyA9IGQ3OwotICBtZW1zZXQgKGQ3LCAwLCA0KTsKLSAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19SVkEsIDYpOwotICBzYXZlX3JlbG9jcyAoaWQ3KTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ1LCA0KTsKLSAgZDUgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ1LT5jb250ZW50cyA9IGQ1OwotICBtZW1zZXQgKGQ1LCAwLCA0KTsKLSAgaWYgKGV4cC0+ZmxhZ19ub25hbWUpCi0gICAgewotICAgICAgZDVbMF0gPSBleHAtPm9yZGluYWw7Ci0gICAgICBkNVsxXSA9IGV4cC0+b3JkaW5hbCA+PiA4OwotICAgICAgZDVbM10gPSAweDgwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHF1aWNrX3JlbG9jIChhYmZkLCAwLCBCRkRfUkVMT0NfUlZBLCA0KTsKLSAgICAgIHNhdmVfcmVsb2NzIChpZDUpOwotICAgIH0KLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ0LCA0KTsKLSAgZDQgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ0LT5jb250ZW50cyA9IGQ0OwotICBtZW1zZXQgKGQ0LCAwLCA0KTsKLSAgaWYgKGV4cC0+ZmxhZ19ub25hbWUpCi0gICAgewotICAgICAgZDVbMF0gPSBleHAtPm9yZGluYWw7Ci0gICAgICBkNVsxXSA9IGV4cC0+b3JkaW5hbCA+PiA4OwotICAgICAgZDVbM10gPSAweDgwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHF1aWNrX3JlbG9jIChhYmZkLCAwLCBCRkRfUkVMT0NfUlZBLCA0KTsKLSAgICAgIHNhdmVfcmVsb2NzIChpZDQpOwotICAgIH0KLQotICBpZiAoZXhwLT5mbGFnX25vbmFtZSkKLSAgICB7Ci0gICAgICBsZW4gPSAwOwotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNiwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGVuID0gc3RybGVuIChleHAtPm5hbWUpICsgMzsKLSAgICAgIGlmIChsZW4gJiAxKQotCWxlbisrOwotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNiwgbGVuKTsKLSAgICAgIGQ2ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgICAgIGlkNi0+Y29udGVudHMgPSBkNjsKLSAgICAgIG1lbXNldCAoZDYsIDAsIGxlbik7Ci0gICAgICBkNlswXSA9IGV4cC0+aGludCAmIDB4ZmY7Ci0gICAgICBkNlsxXSA9IGV4cC0+aGludCA+PiA4OwotICAgICAgc3RyY3B5IChkNisyLCBleHAtPm5hbWUpOwotICAgIH0KLQotICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgc3ltdGFiLCBzeW1wdHIpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgdHgsIHRkLCAwLCBqbXBfYnl0ZV9jb3VudCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ3LCBkNywgMCwgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ1LCBkNSwgMCwgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ0LCBkNCwgMCwgNCk7Ci0gIGlmICghZXhwLT5mbGFnX25vbmFtZSkKLSAgICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNiwgZDYsIDAsIGxlbik7Ci0KLSAgYmZkX21ha2VfcmVhZGFibGUgKGFiZmQpOwotICByZXR1cm4gYWJmZDsKLX0KLQotdm9pZAotcGVfZGxsX2dlbmVyYXRlX2ltcGxpYiAoZGVmLCBpbXBmaWxlbmFtZSkKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLSAgICAgY29uc3QgY2hhciAqaW1wZmlsZW5hbWU7Ci17Ci0gIGludCBpOwotICBiZmQgKmFyX2hlYWQ7Ci0gIGJmZCAqYXJfdGFpbDsKLSAgYmZkICpvdXRhcmNoOwotICBiZmQgKmhlYWQgPSAwOwotCi0gIGRsbF9maWxlbmFtZSA9IGRlZi0+bmFtZTsKLSAgaWYgKGRsbF9maWxlbmFtZSA9PSAwKQotICAgIHsKLSAgICAgIGRsbF9maWxlbmFtZSA9IGRsbF9uYW1lOwotICAgICAgZm9yIChpPTA7IGltcGZpbGVuYW1lW2ldOyBpKyspCi0JaWYgKGltcGZpbGVuYW1lW2ldID09ICcvJyB8fCBpbXBmaWxlbmFtZVtpXSA9PSAnXFwnKQotCSAgZGxsX2ZpbGVuYW1lID0gaW1wZmlsZW5hbWUrMTsKLSAgICB9Ci0gIGRsbF9zeW1uYW1lID0geHN0cmR1cCAoZGxsX2ZpbGVuYW1lKTsKLSAgZm9yIChpPTA7IGRsbF9zeW1uYW1lW2ldOyBpKyspCi0gICAgaWYgKCFpc2FsbnVtICgodW5zaWduZWQgY2hhcikgZGxsX3N5bW5hbWVbaV0pKQotICAgICAgZGxsX3N5bW5hbWVbaV0gPSAnXyc7Ci0KLSAgdW5saW5rIChpbXBmaWxlbmFtZSk7Ci0KLSAgb3V0YXJjaCA9IGJmZF9vcGVudyAoaW1wZmlsZW5hbWUsIDApOwotCi0gIGlmICghb3V0YXJjaCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZWluZm8gKF8oIiVYQ2FuJ3Qgb3BlbiAubGliIGZpbGU6ICVzXG4iKSwgaW1wZmlsZW5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBlaW5mbyAoXygiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIiksIGltcGZpbGVuYW1lKTsKLSAgCi0gIGJmZF9zZXRfZm9ybWF0IChvdXRhcmNoLCBiZmRfYXJjaGl2ZSk7Ci0gIG91dGFyY2gtPmhhc19hcm1hcCA9IDE7Ci0KLSAgLyogV29yayBvdXQgYSByZWFzb25hYmxlIHNpemUgb2YgdGhpbmdzIHRvIHB1dCBvbnRvIG9uZSBsaW5lLiAqLwotCi0gIGFyX2hlYWQgPSBtYWtlX2hlYWQgKG91dGFyY2gpOwotCi0gIGZvciAoaSA9IDA7IGk8ZGVmLT5udW1fZXhwb3J0czsgaSsrKQotICAgIHsKLSAgICAgIC8qIFRoZSBpbXBvcnQgbGlicmFyeSBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIGludGVybmFsIG5hbWUgKi8KLSAgICAgIGNoYXIgKmludGVybmFsID0gZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWU7Ci0gICAgICBiZmQgKm47Ci0gICAgICBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSA9IGRlZi0+ZXhwb3J0c1tpXS5uYW1lOwotICAgICAgbiA9IG1ha2Vfb25lIChkZWYtPmV4cG9ydHMraSwgb3V0YXJjaCk7Ci0gICAgICBuLT5uZXh0ID0gaGVhZDsKLSAgICAgIGhlYWQgPSBuOwotICAgICAgZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUgPSBpbnRlcm5hbDsKLSAgICB9Ci0KLSAgYXJfdGFpbCA9IG1ha2VfdGFpbCAob3V0YXJjaCk7Ci0KLSAgaWYgKGFyX2hlYWQgPT0gTlVMTCB8fCBhcl90YWlsID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIE5vdyBzdGljayB0aGVtIGFsbCBpbnRvIHRoZSBhcmNoaXZlICovCi0KLSAgYXJfaGVhZC0+bmV4dCA9IGhlYWQ7Ci0gIGFyX3RhaWwtPm5leHQgPSBhcl9oZWFkOwotICBoZWFkID0gYXJfdGFpbDsKLQotICBpZiAoISBiZmRfc2V0X2FyY2hpdmVfaGVhZCAob3V0YXJjaCwgaGVhZCkpCi0gICAgZWluZm8gKCIlWGJmZF9zZXRfYXJjaGl2ZV9oZWFkOiAlc1xuIiwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAKLSAgaWYgKCEgYmZkX2Nsb3NlIChvdXRhcmNoKSkKLSAgICBlaW5mbyAoIiVYYmZkX2Nsb3NlICVzOiAlc1xuIiwgaW1wZmlsZW5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQotICB3aGlsZSAoaGVhZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZCAqbiA9IGhlYWQtPm5leHQ7Ci0gICAgICBiZmRfY2xvc2UgKGhlYWQpOwotICAgICAgaGVhZCA9IG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotYWRkX2JmZF90b19saW5rIChhYmZkLCBuYW1lLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmFrZV9maWxlOwotICBmYWtlX2ZpbGUgPSBsYW5nX2FkZF9pbnB1dF9maWxlIChuYW1lLAotCQkJCSAgIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW0sCi0JCQkJICAgTlVMTCk7Ci0gIGZha2VfZmlsZS0+dGhlX2JmZCA9IGFiZmQ7Ci0gIGxkbGFuZ19hZGRfZmlsZSAoZmFrZV9maWxlKTsKLSAgaWYgKCFiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgbGlua19pbmZvKSkKLSAgICBlaW5mbyAoIiVYYWRkc3ltICVzOiAlc1xuIiwgbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotfQotCi12b2lkCi1wZV9wcm9jZXNzX2ltcG9ydF9kZWZzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgZGVmX2ZpbGVfbW9kdWxlICptb2R1bGU7Ci0gIHBlX2RsbF9pZF90YXJnZXQoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLQotICBpZiAoIXBlX2RlZl9maWxlKQotICAgIHJldHVybjsKLQotICBmb3IgKG1vZHVsZSA9IHBlX2RlZl9maWxlLT5tb2R1bGVzOyBtb2R1bGU7IG1vZHVsZSA9IG1vZHVsZS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgaSwgZG9fdGhpc19kbGw7Ci0KLSAgICAgIGRsbF9maWxlbmFtZSA9IG1vZHVsZS0+bmFtZTsKLSAgICAgIGRsbF9zeW1uYW1lID0geHN0cmR1cCAobW9kdWxlLT5uYW1lKTsKLSAgICAgIGZvciAoaT0wOyBkbGxfc3ltbmFtZVtpXTsgaSsrKQotCWlmICghaXNhbG51bSAoZGxsX3N5bW5hbWVbaV0pKQotCSAgZGxsX3N5bW5hbWVbaV0gPSAnXyc7Ci0KLSAgICAgIGRvX3RoaXNfZGxsID0gMDsKLQotICAgICAgZm9yIChpPTA7IGk8cGVfZGVmX2ZpbGUtPm51bV9pbXBvcnRzOyBpKyspCi0JaWYgKHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLm1vZHVsZSA9PSBtb2R1bGUpCi0JICB7Ci0JICAgIGRlZl9maWxlX2V4cG9ydCBleHA7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpibGhlOwotCi0JICAgIC8qIHNlZSBpZiB3ZSBuZWVkIHRoaXMgaW1wb3J0ICovCi0JICAgIGNoYXIgKm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUpICsgMik7Ci0JICAgIHNwcmludGYgKG5hbWUsICIlcyVzIiwgVSgiIiksIHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCSAgICBibGhlID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby0+aGFzaCwgbmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCSAgICBmcmVlIChuYW1lKTsKLQkgICAgaWYgKGJsaGUgJiYgYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICAgICB7Ci0JCWJmZCAqb25lOwotCQkvKiB3ZSBkbyAqLwotCQlpZiAoIWRvX3RoaXNfZGxsKQotCQkgIHsKLQkJICAgIGJmZCAqYXJfaGVhZCA9IG1ha2VfaGVhZCAob3V0cHV0X2JmZCk7Ci0JCSAgICBhZGRfYmZkX3RvX2xpbmsgKGFyX2hlYWQsIGFyX2hlYWQtPmZpbGVuYW1lLCBsaW5rX2luZm8pOwotCQkgICAgZG9fdGhpc19kbGwgPSAxOwotCQkgIH0KLQkJZXhwLmludGVybmFsX25hbWUgPSBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lOwotCQlleHAubmFtZSA9IHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLm5hbWU7Ci0JCWV4cC5vcmRpbmFsID0gcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0ub3JkaW5hbDsKLQkJZXhwLmhpbnQgPSBleHAub3JkaW5hbCA+PSAwID8gZXhwLm9yZGluYWwgOiAwOwotCQlleHAuZmxhZ19wcml2YXRlID0gMDsKLQkJZXhwLmZsYWdfY29uc3RhbnQgPSAwOwotCQlleHAuZmxhZ19kYXRhID0gMDsKLQkJZXhwLmZsYWdfbm9uYW1lID0gZXhwLm5hbWUgPyAwIDogMTsKLQkJb25lID0gbWFrZV9vbmUgKCZleHAsIG91dHB1dF9iZmQpOwotCQlhZGRfYmZkX3RvX2xpbmsgKG9uZSwgb25lLT5maWxlbmFtZSwgbGlua19pbmZvKTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICBpZiAoZG9fdGhpc19kbGwpCi0JewotCSAgYmZkICphcl90YWlsID0gbWFrZV90YWlsIChvdXRwdXRfYmZkKTsKLQkgIGFkZF9iZmRfdG9fbGluayAoYXJfdGFpbCwgYXJfdGFpbC0+ZmlsZW5hbWUsIGxpbmtfaW5mbyk7Ci0JfQotCi0gICAgICBmcmVlIChkbGxfc3ltbmFtZSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBXZSB3ZXJlIGhhbmRlZCBhICouRExMIGZpbGUuICBQYXJzZSBpdCBhbmQgdHVybiBpdCBpbnRvIGEgc2V0IG9mCi0gSU1QT1JUUyBkaXJlY3RpdmVzIGluIHRoZSBkZWYgZmlsZS4gIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcwotIGhhbmRsZWQsIGZhbHNlIGlmIG5vdC4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGVfZ2V0MTYgKGFiZmQsIHdoZXJlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB3aGVyZTsKLXsKLSAgdW5zaWduZWQgY2hhciBiWzJdOwotICBiZmRfc2VlayAoYWJmZCwgd2hlcmUsIFNFRUtfU0VUKTsKLSAgYmZkX3JlYWQgKGIsIDEsIDIsIGFiZmQpOwotICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGVfZ2V0MzIgKGFiZmQsIHdoZXJlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB3aGVyZTsKLXsKLSAgdW5zaWduZWQgY2hhciBiWzRdOwotICBiZmRfc2VlayAoYWJmZCwgd2hlcmUsIFNFRUtfU0VUKTsKLSAgYmZkX3JlYWQgKGIsIDEsIDQsIGFiZmQpOwotICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotfQotCi0jaWYgMCAvKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBlX2FzMTYgKHB0cikKLSAgICAgdm9pZCAqcHRyOwotewotICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBlX2FzMzIgKHB0cikKLSAgICAgdm9pZCAqcHRyOwotewotICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotfQotCi1ib29sZWFuCi1wZV9pbXBsaWVkX2ltcG9ydF9kbGwgKGZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgYmZkICpkbGw7Ci0gIHVuc2lnbmVkIGxvbmcgcGVfaGVhZGVyX29mZnNldCwgb3B0aGRyX29mcywgbnVtX2VudHJpZXMsIGk7Ci0gIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7Ci0gIHVuc2lnbmVkIGNoYXIgKmV4cGRhdGEsICplcnZhOwotICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhcywgb3JkaW5hbHMsIG5leHAsIG9yZGJhc2U7Ci0gIGNvbnN0IGNoYXIgKmRsbF9uYW1lOwotCi0gIC8qIE5vLCBJIGNhbid0IHVzZSBiZmQgaGVyZS4gIGtlcm5lbDMyLmRsbCBwdXRzIGl0cyBleHBvcnQgdGFibGUgaW4KLSAgICAgdGhlIG1pZGRsZSBvZiB0aGUgLnJkYXRhIHNlY3Rpb24uICovCi0KLSAgZGxsID0gYmZkX29wZW5yIChmaWxlbmFtZSwgcGVfZGV0YWlscy0+dGFyZ2V0X25hbWUpOwotICBpZiAoIWRsbCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYb3BlbiAlczogJXNcbiIsIGZpbGVuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBQRUkgZGxscyBzZWVtIHRvIGJlIGJmZF9vYmplY3RzICovCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoZGxsLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJXM6IHRoaXMgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBETExcbiIsIGZpbGVuYW1lKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZGxsX25hbWUgPSBmaWxlbmFtZTsKLSAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCi0gICAgaWYgKGZpbGVuYW1lW2ldID09ICcvJyB8fCBmaWxlbmFtZVtpXSA9PSAnXFwnIHx8IGZpbGVuYW1lW2ldID09ICc6JykKLSAgICAgIGRsbF9uYW1lID0gZmlsZW5hbWUgKyBpICsgMTsKLQotICBwZV9oZWFkZXJfb2Zmc2V0ID0gcGVfZ2V0MzIgKGRsbCwgMHgzYyk7Ci0gIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOwotICBudW1fZW50cmllcyA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyA5Mik7Ci0gIGlmIChudW1fZW50cmllcyA8IDEpIC8qIG5vIGV4cG9ydHMgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci0gIGV4cG9ydF9ydmEgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTYpOwotICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOwotICBuc2VjdGlvbnMgPSBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIpOwotICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCi0JICAgIHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMTYpKTsKLSAgZXhwcHRyID0gMDsKLSAgZm9yIChpPTA7IGk8bnNlY3Rpb25zOyBpKyspCi0gICAgewotICAgICAgY2hhciBzbmFtZVs4XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTIpOwotICAgICAgdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7Ci0gICAgICB1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOwotICAgICAgYmZkX3NlZWsoZGxsLCBzZWNwdHIxLCBTRUVLX1NFVCk7Ci0gICAgICBiZmRfcmVhZChzbmFtZSwgMSwgOCwgZGxsKTsKLSAgICAgIGlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKLQl7Ci0JICBleHBwdHIgPSBmcHRyICsgKGV4cG9ydF9ydmEgLSB2YWRkcik7Ci0JICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKLQkgICAgZXhwb3J0X3NpemUgPSB2c2l6ZSAtIChleHBvcnRfcnZhIC0gdmFkZHIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoZXhwb3J0X3NpemUpOwotICBiZmRfc2VlayAoZGxsLCBleHBwdHIsIFNFRUtfU0VUKTsKLSAgYmZkX3JlYWQgKGV4cGRhdGEsIDEsIGV4cG9ydF9zaXplLCBkbGwpOwotICBlcnZhID0gZXhwZGF0YSAtIGV4cG9ydF9ydmE7Ci0KLSAgaWYgKHBlX2RlZl9maWxlID09IDApCi0gICAgcGVfZGVmX2ZpbGUgPSBkZWZfZmlsZV9lbXB0eSgpOwotCi0gIG5leHAgPSBwZV9hczMyIChleHBkYXRhKzI0KTsKLSAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7Ci0gIG9yZGluYWxzID0gcGVfYXMzMiAoZXhwZGF0YSszNik7Ci0gIG9yZGJhc2UgPSBwZV9hczMyIChleHBkYXRhKzE2KTsKLSAgZm9yIChpPTA7IGk8bmV4cDsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZV9ydmEgPSBwZV9hczMyIChlcnZhK25hbWVfcnZhcytpKjQpOwotICAgICAgZGVmX2ZpbGVfaW1wb3J0ICppbXA7Ci0gICAgICBpbXAgPSBkZWZfZmlsZV9hZGRfaW1wb3J0IChwZV9kZWZfZmlsZSwgZXJ2YStuYW1lX3J2YSwgZGxsX25hbWUsCi0JCQkJIGksIDApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gVGhlc2UgYXJlIHRoZSBtYWluIGZ1bmN0aW9ucywgY2FsbGVkIGZyb20gdGhlIGVtdWxhdGlvbi4gIFRoZSBmaXJzdAotIGlzIGNhbGxlZCBhZnRlciB0aGUgYmZkcyBhcmUgcmVhZCwgc28gd2UgY2FuIGd1ZXNzIGF0IGhvdyBtdWNoIHNwYWNlCi0gd2UgbmVlZC4gIFRoZSBzZWNvbmQgaXMgY2FsbGVkIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgcGxhY2VkLCBzbyB3ZQotIGNhbiBwdXQgdGhlIHJpZ2h0IHZhbHVlcyBpbiBwbGFjZS4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotcGVfZGxsX2J1aWxkX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBwZV9kbGxfaWRfdGFyZ2V0IChiZmRfZ2V0X3RhcmdldCAoYWJmZCkpOwotICBwcm9jZXNzX2RlZl9maWxlIChhYmZkLCBpbmZvKTsKLQotICBnZW5lcmF0ZV9lZGF0YSAoYWJmZCwgaW5mbyk7Ci0gIGJ1aWxkX2ZpbGxlcl9iZmQgKDEpOwotfQotCi12b2lkCi1wZV9leGVfYnVpbGRfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcGVfZGxsX2lkX3RhcmdldCAoYmZkX2dldF90YXJnZXQgKGFiZmQpKTsKLSAgYnVpbGRfZmlsbGVyX2JmZCAoMCk7Ci19Ci0KLXZvaWQKLXBlX2RsbF9maWxsX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBwZV9kbGxfaWRfdGFyZ2V0IChiZmRfZ2V0X3RhcmdldCAoYWJmZCkpOwotICBpbWFnZV9iYXNlID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0KLSAgZ2VuZXJhdGVfcmVsb2MgKGFiZmQsIGluZm8pOwotICBpZiAocmVsb2Nfc3ogPiAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCByZWxvY19zLCByZWxvY19zeik7Ci0KLSAgICAgIC8qIFJlc2l6ZSB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCwgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmc3RhdF9wdHItPmhlYWQsIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0KLSAgICAgIC8qIFJlZG8gc3BlY2lhbCBzdHVmZi4gICovCi0gICAgICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKLQotICAgICAgLyogRG8gdGhlIGFzc2lnbm1lbnRzIGFnYWluLiAgKi8KLSAgICAgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRfcHRyLT5oZWFkLAotCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotICAgIH0KLQotICBmaWxsX2VkYXRhIChhYmZkLCBpbmZvKTsKLQotICBwZV9kYXRhIChhYmZkKS0+ZGxsID0gMTsKLQotICBlZGF0YV9zLT5jb250ZW50cyA9IGVkYXRhX2Q7Ci0gIHJlbG9jX3MtPmNvbnRlbnRzID0gcmVsb2NfZDsKLX0KLQotdm9pZAotcGVfZXhlX2ZpbGxfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHBlX2RsbF9pZF90YXJnZXQgKGJmZF9nZXRfdGFyZ2V0IChhYmZkKSk7Ci0gIGltYWdlX2Jhc2UgPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotICBnZW5lcmF0ZV9yZWxvYyAoYWJmZCwgaW5mbyk7Ci0gIGlmIChyZWxvY19zeiA+IDApCi0gICAgewotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGZpbGxlcl9iZmQsIHJlbG9jX3MsIHJlbG9jX3N6KTsKLQotICAgICAgLyogUmVzaXplIHRoZSBzZWN0aW9ucy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRfcHRyLT5oZWFkLCBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICZzdGF0X3B0ci0+aGVhZCwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLQotICAgICAgLyogUmVkbyBzcGVjaWFsIHN0dWZmLiAgKi8KLSAgICAgIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uICgpOwotCi0gICAgICAvKiBEbyB0aGUgYXNzaWdubWVudHMgYWdhaW4uICAqLwotICAgICAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdF9wdHItPmhlYWQsCi0JCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAoZmlsbF90eXBlKSAwLCAoYmZkX3ZtYSkgMCk7Ci0gICAgfQotICByZWxvY19zLT5jb250ZW50cyA9IHJlbG9jX2Q7Ci19CmRpZmYgLS1naXQgYS9sZC9wZS1kbGwuaCBiL2xkL3BlLWRsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNhMzc4Li4wMDAwMDAwCi0tLSBhL2xkL3BlLWRsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogcGUtZGxsLmg6IEhlYWRlciBmaWxlIGZvciByb3V0aW5lcyB1c2VkIHRvIGJ1aWxkIFdpbmRvd3MgRExMcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBQRV9ETExfSAotI2RlZmluZSBQRV9ETExfSAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImRlZmZpbGUuaCIKLQotZXh0ZXJuIGRlZl9maWxlICpwZV9kZWZfZmlsZTsKLWV4dGVybiBpbnQgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nOwotZXh0ZXJuIGludCBwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlczsKLWV4dGVybiBpbnQgcGVfZGxsX2tpbGxfYXRzOwotZXh0ZXJuIGludCBwZV9kbGxfc3RkY2FsbF9hbGlhc2VzOwotCi1leHRlcm4gdm9pZCBwZV9kbGxfaWRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcGVfZGxsX2FkZF9leGNsdWRlcyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIgUEFSQU1TICgoZGVmX2ZpbGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBwZV9wcm9jZXNzX2ltcG9ydF9kZWZzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBwZV9pbXBsaWVkX2ltcG9ydF9kbGwgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBwZV9kbGxfYnVpbGRfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIHBlX2V4ZV9idWlsZF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHZvaWQgcGVfZGxsX2ZpbGxfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIHBlX2V4ZV9maWxsX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNlbmRpZiAvKiBQRV9ETExfSCAqLwpkaWZmIC0tZ2l0IGEvbGQvcG8vTWFrZS1pbiBiL2xkL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTEwOTAuLjAwMDAwMDAKLS0tIGEvbGQvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLUMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9sZC9wby9QT1RGSUxFUy5pbiBiL2xkL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWEwYzhlLi4wMDAwMDAwCi0tLSBhL2xkL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotZGVmZmlsZS5oCi1lbXVsdGVtcGwvYXJtY29mZi5lbQotZW11bHRlbXBsL3BlLmVtCi1sZC5oCi1sZGNyZWYuYwotbGRjdG9yLmMKLWxkY3Rvci5oCi1sZGVtdWwuYwotbGRlbXVsLmgKLWxkZXhwLmMKLWxkZXhwLmgKLWxkZmlsZS5jCi1sZGZpbGUuaAotbGRsYW5nLmMKLWxkbGFuZy5oCi1sZGxleC5oCi1sZG1haW4uYwotbGRtYWluLmgKLWxkbWlzYy5jCi1sZG1pc2MuaAotbGR2ZXIuYwotbGR2ZXIuaAotbGR3cml0ZS5jCi1sZHdyaXRlLmgKLWxleHN1cC5jCi1tcmkuYwotbXJpLmgKLXBlLWRsbC5jCmRpZmYgLS1naXQgYS9sZC9wby9sZC5wb3QgYi9sZC9wby9sZC5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDM0Y2UuLjAwMDAwMDAKLS0tIGEvbGQvcG8vbGQucG90CisrKyAvZGV2L251bGwKQEAgLTEsMTQyNSArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wNi0wMyAwMzoxMS0wNzAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogZW11bHRlbXBsL2FybWNvZmYuZW06NjUKLW1zZ2lkICIgIC0tc3VwcG9ydC1vbGQtY29kZSAgIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvYXJtY29mZi5lbToxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTk4Ci1tc2dpZCAiIgotIiAgLS1iYXNlX2ZpbGUgPGJhc2VmaWxlPiAgICAgICAgICAgICBHZW5lcmF0ZSBhIGJhc2UgZmlsZSBmb3IgcmVsb2NhdGFibGUgIgotIkRMTHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTk5Ci1tc2dpZCAiIgotIiAgLS1kbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgaW1hZ2UgYmFzZSB0byB0aGUgZGVmYXVsdCBmb3IgRExMc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDAKLW1zZ2lkICIgIC0tZmlsZS1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgICAgU2V0IGZpbGUgYWxpZ25tZW50XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwMQotbXNnaWQgIiAgLS1oZWFwIDxzaXplPiAgICAgICAgICAgICAgICAgICAgICBTZXQgaW5pdGlhbCBzaXplIG9mIHRoZSBoZWFwXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwMgotbXNnaWQgIiIKLSIgIC0taW1hZ2UtYmFzZSA8YWRkcmVzcz4gICAgICAgICAgICAgU2V0IHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjAzCi1tc2dpZCAiIgotIiAgLS1tYWpvci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA0Ci1tc2dpZCAiICAtLW1ham9yLW9zLXZlcnNpb24gPG51bWJlcj4gICAgICAgIFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA1Ci1tc2dpZCAiIgotIiAgLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gIgotInZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA2Ci1tc2dpZCAiIgotIiAgLS1taW5vci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwNwotbXNnaWQgIiAgLS1taW5vci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyByZXZpc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDgKLW1zZ2lkICIiCi0iICAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSAiCi0icmV2aXNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA5Ci1tc2dpZCAiICAtLXNlY3Rpb24tYWxpZ25tZW50IDxzaXplPiAgICAgICAgIFNldCBzZWN0aW9uIGFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTAKLW1zZ2lkICIgIC0tc3RhY2sgPHNpemU+ICAgICAgICAgICAgICAgICAgICAgU2V0IHNpemUgb2YgdGhlIGluaXRpYWwgc3RhY2tcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjExCi1tc2dpZCAiIgotIiAgLS1zdWJzeXN0ZW0gPG5hbWU+Wzo8dmVyc2lvbj5dICAgICBTZXQgcmVxdWlyZWQgT1Mgc3Vic3lzdGVtIFsmIHZlcnNpb25dXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxMgotbXNnaWQgIiIKLSIgIC0tc3VwcG9ydC1vbGQtY29kZSAgICAgICAgICAgICAgICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTQKLW1zZ2lkICIiCi0iICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgICAgICAgICAgICAgIEV4cG9ydCBzeW1ib2xzIHdpdGggYW5kIHdpdGhvdXQgQG5uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxNQotbXNnaWQgIiAgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgICAgICAgICAgICBEb24ndCBsaW5rIF9zeW0gdG8gX3N5bUBublxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTYKLW1zZ2lkICIiCi0iICAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgIExpbmsgX3N5bSB0byBfc3ltQG5uIHdpdGhvdXQgd2FybmluZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjE3Ci1tc2dpZCAiIgotIiAgLS1leGNsdWRlLXN5bWJvbHMgc3ltLHN5bSwuLi4gICAgICBFeGNsdWRlIHN5bWJvbHMgZnJvbSBhdXRvbWF0aWMgZXhwb3J0XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxOAotbXNnaWQgIiIKLSIgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgICAgICAgICAgICAgQXV0b21hdGljYWxseSBleHBvcnQgYWxsIGdsb2JhbHMgdG8gIgotIkRMTFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTkKLW1zZ2lkICIgIC0ta2lsbC1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIEBubiBmcm9tIGV4cG9ydGVkIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjIwCi1tc2dpZCAiICAtLW91dC1pbXBsaWIgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIyMQotbXNnaWQgIiIKLSIgIC0tb3V0cHV0LWRlZiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgYSAuREVGIGZpbGUgZm9yIHRoZSBidWlsdCBETExcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06Mjg0Ci1tc2dpZCAiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTozMDAKLW1zZ2lkICIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjMxNQotbXNnaWQgIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzMzCi1tc2dpZCAiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo1MDUKLW1zZ2lkICIlUDogd2FybmluZywgZmlsZSBhbGlnbm1lbnQgPiBzZWN0aW9uIGFsaWdubWVudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NTc1IGVtdWx0ZW1wbC9wZS5lbTo2MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NTgwIGVtdWx0ZW1wbC9wZS5lbTo2MDYKLW1zZ2lkICJVc2UgLS1lbmFibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIHdhcm5pbmdzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjU4MSBlbXVsdGVtcGwvcGUuZW06NjA3Ci1tc2dpZCAiVXNlIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2UgZml4dXBzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjYyMwotbXNnaWQgIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjcyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjc0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIGZvciBpbnRlcndvcmtpbmciCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjgwMiBsZGxhbmcuYzoxNjU3IGxkbGFuZy5jOjM5MzQgbGRsYW5nLmM6Mzk2OCBsZG1haW4uYzo5OTIKLW1zZ2lkICIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MTYyCi1tc2dpZCAiJVglUDogYmZkX2hhc2hfdGFibGVfaW5pdCBvZiBjcmVmIHRhYmxlIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoxNjgKLW1zZ2lkICIlWCVQOiBjcmVmX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyMzkKLW1zZ2lkICIiCi0iXG4iCi0iQ3Jvc3MgUmVmZXJlbmNlIFRhYmxlXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MjQwCi1tc2dpZCAiU3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjI0OAotbXNnaWQgIkZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyNTIKLW1zZ2lkICJObyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MzY5Ci1tc2dpZCAiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzo0NDEKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOyAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjQ0NSBsZG1haW4uYzoxMDYwIGxkbWFpbi5jOjEwNjQKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjUxNyBsZGNyZWYuYzo1MjQgbGRtYWluLmM6MTExMCBsZG1haW4uYzoxMTE3Ci1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIgotbXNnc3RyICIiCi0KLSMuIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wuICBUaGUgc3ltYm9sIGlzIGRlZmluZWQKLSMuIGluIE9VVFNFQ05BTUUuICBUaGlzIHJlbG9jIGlzIGZyb20gYSBzZWN0aW9uIHdoaWNoIGlzCi0jLiBtYXBwZWQgaW50byBhIHNlY3Rpb24gZnJvbSB3aGljaCByZWZlcmVuY2VzIHRvIE9VVFNFQ05BTUUKLSMuIGFyZSBwcm9oaWJpdGVkLiAgV2UgbXVzdCByZXBvcnQgYW4gZXJyb3IuCi0jOiBsZGNyZWYuYzo1NDIKLW1zZ2lkICIlWCVDOiBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tICVzIHRvIGAlVCcgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzo4OQotbXNnaWQgIiVQJVg6IERpZmZlcmVudCByZWxvY3MgdXNlZCBpbiBzZXQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzoxMDYKLW1zZ2lkICIlUCVYOiBEaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cyBjb21wb3Npbmcgc2V0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjdG9yLmM6Mjg4IGxkY3Rvci5jOjMwMgotbXNnaWQgIiVQJVg6ICVzIGRvZXMgbm90IHN1cHBvcnQgcmVsb2MgJXMgZm9yIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjMyMwotbXNnaWQgIiVQJVg6IFVuc3VwcG9ydGVkIHNpemUgJWQgZm9yIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjM0NAotbXNnaWQgIiIKLSJcbiIKLSJTZXQgICAgICAgICAgICAgICAgIFN5bWJvbFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjIyMwotbXNnaWQgIiVTIFNZU0xJQiBpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6MjMxCi1tc2dpZCAiJVMgSExMIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGVtdWwuYzoyNTIKLW1zZ2lkICIlUDogdW5yZWNvZ25pc2VkIGVtdWxhdGlvbiBtb2RlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjI1MwotbXNnaWQgIlN1cHBvcnRlZCBlbXVsYXRpb25zOiAiCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6Mjk3Ci1tc2dpZCAiICBubyBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9ucy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjE1NgotbXNnaWQgIiVGJVA6ICVzIHVzZXMgdW5kZWZpbmVkIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjE1OAotbXNnaWQgIiVGJVA6ICVzIGZvcndhcmQgcmVmZXJlbmNlIG9mIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjI3MAotbXNnaWQgIiVGJVMgJSUgYnkgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6Mjc3Ci1tc2dpZCAiJUYlUyAvIGJ5IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjQwMAotbXNnaWQgIiVYJVM6IHVucmVzb2x2YWJsZSBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjQxOQotbXNnaWQgIiVGJVM6IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYwMAotbXNnaWQgIiVGJVMgY2FuIG5vdCBQUk9WSURFIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjEwCi1tc2dpZCAiJUYlUyBpbnZhbGlkIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjE0Ci1tc2dpZCAiJUYlUyBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXIgaW52YWxpZCBvdXRzaWRlIG9mIFNFQ1RJT05cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYyNAotbXNnaWQgIiVGJVMgY2Fubm90IG1vdmUgbG9jYXRpb24gY291bnRlciBiYWNrd2FyZHMgKGZyb20gJVYgdG8gJVYpXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo2NTIKLW1zZ2lkICIlUCVGOiVzOiBoYXNoIGNyZWF0aW9uIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6OTQ5Ci1tc2dpZCAiJUYlUyBub25jb25zdGFudCBleHByZXNzaW9uIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6OTgyCi1tc2dpZCAiJUYlUyBub24gY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoxMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byBvcGVuICVzIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjExMQotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIG9wZW4gJXMgc3VjY2VlZGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MTE5Ci1tc2dpZCAiJUYlUDogaW52YWxpZCBCRkQgdGFyZ2V0IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyMDQKLW1zZ2lkICIlRiVQOiBjYW5ub3Qgb3BlbiAlcyBmb3IgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjA3Ci1tc2dpZCAiJUYlUDogY2Fubm90IG9wZW4gJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjI1Ci1tc2dpZCAiJUYlUDogY2Fubm90IGZpbmQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyNDMgbGRmaWxlLmM6MjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjQ1IGxkZmlsZS5jOjI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVuZWQgc2NyaXB0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzozMDMKLW1zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0IGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MzQ0Ci1tc2dpZCAiJVAlRjogdW5rbm93biBhcmNoaXRlY3R1cmU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MzYxCi1tc2dpZCAiJVAlRjogdGFyZ2V0IGFyY2hpdGVjdHVyZSByZXNwZWNpZmllZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjQxNAotbXNnaWQgIiVQJUY6IGNhbm5vdCByZXByZXNlbnQgbWFjaGluZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzIzCi1tc2dpZCAiIgotIlxuIgotIk1lbW9yeSBDb25maWd1cmF0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzI1Ci1tc2dpZCAiTmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3MjUKLW1zZ2lkICJPcmlnaW4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzI1Ci1tc2dpZCAiTGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjcyNQotbXNnaWQgIkF0dHJpYnV0ZXMiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzY3Ci1tc2dpZCAiIgotIlxuIgotIkxpbmtlciBzY3JpcHQgYW5kIG1lbW9yeSBtYXBcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3ODQKLW1zZ2lkICIlUCVGOiBJbGxlZ2FsIHVzZSBvZiBgJXMnIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Nzk0Ci1tc2dpZCAiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6OTE1Ci1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6OTI5Ci1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnIGhhcyBkaWZmZXJlbnQgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEzMjAKLW1zZ2lkICIlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxMzIxCi1tc2dpZCAiJUI6IG1hdGNoaW5nIGZvcm1hdHM6IgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEzMjgKLW1zZ2lkICIlRiVCOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEzODEKLW1zZ2lkICIlRiVCOiBvYmplY3QgJUIgaW4gYXJjaGl2ZSBpcyBub3Qgb2JqZWN0XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTM4NyBsZGxhbmcuYzoxMzk5Ci1tc2dpZCAiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDUyCi1tc2dpZCAiJVAlRjogdGFyZ2V0ICVzIG5vdCBmb3VuZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0NTQKLW1zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDYyCi1tc2dpZCAiJVAlRjolczogY2FuIG5vdCBtYWtlIG9iamVjdCBmaWxlOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0NjYKLW1zZ2lkICIlUCVGOiVzOiBjYW4gbm90IHNldCBhcmNoaXRlY3R1cmU6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTQ3MAotbXNnaWQgIiVQJUY6IGNhbiBub3QgY3JlYXRlIGxpbmsgaGFzaCB0YWJsZTogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNzgwCi1tc2dpZCAiIGxvYWQgYWRkcmVzcyAweCVWIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE5MDkKLW1zZ2lkICIlVyAoc2l6ZSBiZWZvcmUgcmVsYXhpbmcpXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTk4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJBZGRyZXNzIG9mIHNlY3Rpb24gJXMgc2V0IHRvICIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyMTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZhaWwgd2l0aCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjIzNTcKLW1zZ2lkICIlWCVQOiBzZWN0aW9uICVzIFslViAtPiAlVl0gb3ZlcmxhcHMgc2VjdGlvbiAlcyBbJVYgLT4gJVZdXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjQwOAotbXNnaWQgIiVQJVg6IEludGVybmFsIGVycm9yIG9uIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0NDkKLW1zZ2lkICIlUDogd2FybmluZzogbm8gbWVtb3J5IHJlZ2lvbiBzcGVjaWZpZWQgZm9yIHNlY3Rpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0NjIKLW1zZ2lkICIlUDogd2FybmluZzogY2hhbmdpbmcgc3RhcnQgb2Ygc2VjdGlvbiAlcyBieSAldSBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0NzYKLW1zZ2lkICIlRiVTOiBub24gY29uc3RhbnQgYWRkcmVzcyBleHByZXNzaW9uIGZvciBzZWN0aW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjUyOAotbXNnaWQgIiVYJVA6IGFkZHJlc3MgMHgldiBvZiAlQiBzZWN0aW9uICVzIGlzIG5vdCB3aXRoaW4gcmVnaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjUzNgotbXNnaWQgIiVYJVA6IHJlZ2lvbiAlcyBpcyBmdWxsICglQiBzZWN0aW9uICVzKVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI2MzgKLW1zZ2lkICIlUCVGOiBjYW4ndCByZWxheCBzZWN0aW9uOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI3OTkKLW1zZ2lkICIlRiVQOiBpbnZhbGlkIGRhdGEgc3RhdGVtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjgyOAotbXNnaWQgIiVGJVA6IGludmFsaWQgcmVsb2Mgc3RhdGVtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjk2MgotbXNnaWQgIiVQJUY6JXM6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjk3NSBsZGxhbmcuYzoyOTkyCi1tc2dpZCAiJVAlRjogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyOTg3Ci1tc2dpZCAiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgZGVmYXVsdGluZyB0byAlVlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI5OTcKLW1zZ2lkICIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBub3Qgc2V0dGluZyBzdGFydCBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzAzOQotbXNnaWQgIiIKLSIlUDogd2FybmluZzogJXMgYXJjaGl0ZWN0dXJlIG9mIGlucHV0IGZpbGUgYCVCJyBpcyBpbmNvbXBhdGlibGUgd2l0aCAlcyAiCi0ib3V0cHV0XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzA1NwotbXNnaWQgIiVFJVg6IGZhaWxlZCB0byBtZXJnZSB0YXJnZXQgc3BlY2lmaWMgZGF0YSBvZiBmaWxlICVCXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzE0MgotbXNnaWQgIiIKLSJcbiIKLSJBbGxvY2F0aW5nIGNvbW1vbiBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzE0MwotbXNnaWQgIiIKLSJDb21tb24gc3ltYm9sICAgICAgIHNpemUgICAgICAgICAgICAgIGZpbGVcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIG1lc3NhZ2UgaGFwcGVucyB3aGVuIHVzaW5nIHRoZQotIy4gc3ZyMy5pZmlsZSBsaW5rZXIgc2NyaXB0LCBzbyBJIGhhdmUKLSMuIGRpc2FibGVkIGl0LgotIzogbGRsYW5nLmM6MzIzMgotbXNnaWQgIiVQOiBubyBbQ09NTU9OXSBjb21tYW5kLCBkZWZhdWx0aW5nIHRvIC5ic3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMjk1Ci1tc2dpZCAiJVAlRjogaW52YWxpZCBzeW50YXggaW4gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozODkxCi1tc2dpZCAiJVAlRm11bHRpcGxlIFNUQVJUVVAgZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0MTUzCi1tc2dpZCAiJUYlUDogYmZkX3JlY29yZF9waGRyIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0MTcyCi1tc2dpZCAiJVglUDogc2VjdGlvbiBgJXMnIGFzc2lnbmVkIHRvIG5vbi1leGlzdGVudCBwaGRyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NDcxCi1tc2dpZCAiJVglUDogdW5rbm93biBsYW5ndWFnZSBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTIwCi1tc2dpZCAiJVglUDogZHVwbGljYXRlIHZlcnNpb24gdGFnIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTMzIGxkbGFuZy5jOjQ1NDYKLW1zZ2lkICIlWCVQOiBkdXBsaWNhdGUgZXhwcmVzc2lvbiBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTgzCi1tc2dpZCAiJVglUDogdW5hYmxlIHRvIGZpbmQgdmVyc2lvbiBkZXBlbmRlbmN5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NjA1Ci1tc2dpZCAiJVglUDogdW5hYmxlIHRvIHJlYWQgLmV4cG9ydHMgc2VjdGlvbiBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxOTIKLW1zZ2lkICIlWCVQOiBjYW4ndCBzZXQgQkZEIGRlZmF1bHQgdGFyZ2V0IHRvIGAlcyc6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjU4Ci1tc2dpZCAiJVAlRjogLXIgYW5kIC0tbXBjODYwYzAgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjYwCi1tc2dpZCAiJVAlRjogLS1yZWxheCBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjYyCi1tc2dpZCAiJVAlRjogLXIgYW5kIC1zaGFyZWQgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjkxCi1tc2dpZCAidXNpbmcgaW50ZXJuYWwgbGlua2VyIHNjcmlwdDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozMTAKLW1zZ2lkICIlUCVGOiBubyBpbnB1dCBmaWxlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjMxNQotbXNnaWQgIiVQOiBtb2RlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MzMzCi1tc2dpZCAiJVAlRjogY2Fubm90IG9wZW4gbWFwIGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6Mzc5Ci1tc2dpZCAiJVA6IGxpbmsgZXJyb3JzIGZvdW5kLCBkZWxldGluZyBleGVjdXRhYmxlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozOTAKLW1zZ2lkICIlRiVCOiBmaW5hbCBjbG9zZSBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDE0Ci1tc2dpZCAiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIHNvdXJjZSBvZiBjb3B5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0MTYKLW1zZ2lkICIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3IgZGVzdGluYXRpb24gb2YgY29weSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDIyCi1tc2dpZCAiJVA6IEVycm9yIHdyaXRpbmcgZmlsZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDI4IHBlLWRsbC5jOjk4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlUDogRXJyb3IgY2xvc2luZyBmaWxlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHRvdGFsIHRpbWUgaW4gbGluazogJWxkLiUwNmxkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDg5Ci1tc2dpZCAiJVAlRjogbWlzc2luZyBhcmd1bWVudCB0byAtbVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjYwMyBsZG1haW4uYzo2MjQgbGRtYWluLmM6NjU1Ci1tc2dpZCAiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjA4IGxkbWFpbi5jOjYyNwotbXNnaWQgIiVQJUY6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjQyCi1tc2dpZCAiJVglUDogZXJyb3I6IGR1cGxpY2F0ZSByZXRhaW4tc3ltYm9scy1maWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6Njg2Ci1tc2dpZCAiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZvciBpbnNlcnRpb24gZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjY5MQotbXNnaWQgIiVQOiBgLXJldGFpbi1zeW1ib2xzLWZpbGUnIG92ZXJyaWRlcyBgLXMnIGFuZCBgLVMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NzY4Ci1tc2dpZCAiQXJjaGl2ZSBtZW1iZXIgaW5jbHVkZWQiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NzY5Ci1tc2dpZCAiYmVjYXVzZSBvZiBmaWxlIChzeW1ib2wpIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg0MQotbXNnaWQgIiVYJUM6IG11bHRpcGxlIGRlZmluaXRpb24gb2YgYCVUJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg0NAotbXNnaWQgIiVEOiBmaXJzdCBkZWZpbmVkIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4NzMKLW1zZ2lkICIlQjogd2FybmluZzogZGVmaW5pdGlvbiBvZiBgJVQnIG92ZXJyaWRpbmcgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODc2Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBpcyBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODgzCi1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRkZW4gYnkgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg4NgotbXNnaWQgIiVCOiB3YXJuaW5nOiBkZWZpbmVkIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4OTMKLW1zZ2lkICIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBsYXJnZXIgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODk2Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IGxhcmdlciBjb21tb24gaXMgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkwMAotbXNnaWQgIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTAzCi1tc2dpZCAiJUI6IHdhcm5pbmc6IHNtYWxsZXIgY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MDcKLW1zZ2lkICIlQjogd2FybmluZzogbXVsdGlwbGUgY29tbW9uIG9mIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MDkKLW1zZ2lkICIlQjogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MzEgbGRtYWluLmM6OTcwCi1tc2dpZCAiJVA6IHdhcm5pbmc6IGdsb2JhbCBjb25zdHJ1Y3RvciAlcyB1c2VkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTgwCi1tc2dpZCAiJVAlRjogQkZEIGJhY2tlbmQgZXJyb3I6IEJGRF9SRUxPQ19DVE9SIHVuc3VwcG9ydGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE2NgotbXNnaWQgIiVGJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExNzMKLW1zZ2lkICIlRiVQOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExOTIKLW1zZ2lkICIlWCVDOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMTk1Ci1tc2dpZCAiJUQ6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjAxCi1tc2dpZCAiJVglQjogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIwNAotbXNnaWQgIiVCOiBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzIHRvIGAlVCcgZm9sbG93XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIyNSBsZG1haW4uYzoxMjQ3IGxkbWFpbi5jOjEyNjcKLW1zZ2lkICIlUCVYOiBnZW5lcmF0ZWQiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIyOAotbXNnaWQgIiByZWxvY2F0aW9uIHRydW5jYXRlZCB0byBmaXQ6ICVzICVUIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGFuZ2Vyb3VzIHJlbG9jYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTI3MAotbXNnaWQgIiByZWxvYyByZWZlcnMgdG8gc3ltYm9sIGAlVCcgd2hpY2ggaXMgbm90IGJlaW5nIG91dHB1dFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjE3OAotbXNnaWQgIm5vIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzoyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYnVpbHQgaW4gbGlua2VyIHNjcmlwdDoldSIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzoyOTIgbGRtaXNjLmM6Mjk2Ci1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSMuIFdlIHVzZSBhYmZkLT5maWxlbmFtZSBpbiB0aGlzIGluaXRpYWwgbGluZSwKLSMuIGluIGNhc2UgZmlsZW5hbWUgaXMgYSAuaCBmaWxlIG9yIHNvbWV0aGluZwotIy4gc2ltaWxhcmx5IHVuaGVscGZ1bC4KLSM6IGxkbWlzYy5jOjMzMgotbXNnaWQgIiVCOiBJbiBmdW5jdGlvbiBgJVQnOlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjQ2NAotbXNnaWQgIiVGJVA6IGludGVybmFsIGVycm9yICVzICVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGR2ZXIuYzozNQotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgbGQgdmVyc2lvbiAlcyAod2l0aCBCRkQgJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogbGR2ZXIuYzo0MiBsZXhzdXAuYzo4NzIKLW1zZ2lkICIgIFN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzo1OSBsZHdyaXRlLmM6MTk1Ci1tc2dpZCAiJVAlRjogYmZkX25ld19saW5rX29yZGVyIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzozNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTh4IHNvbWV0aGluZyBlbHNlXG4iCi1tc2dzdHIgIiIKLQotIzogbGR3cml0ZS5jOjUyNgotbXNnaWQgIiVGJVA6IGZpbmFsIGxpbmsgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1MiBsZXhzdXAuYzoyMzUgbGV4c3VwLmM6MjQxCi1tc2dpZCAiS0VZV09SRCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTIKLW1zZ2lkICJTaGFyZWQgbGlicmFyeSBjb250cm9sIGZvciBIUC9VWCBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1NQotbXNnaWQgIkFSQ0giCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU1Ci1tc2dpZCAiU2V0IGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTcgbGV4c3VwLmM6MzAwCi1tc2dpZCAiVEFSR0VUIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1NwotbXNnaWQgIlNwZWNpZnkgdGFyZ2V0IGZvciBmb2xsb3dpbmcgaW5wdXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU5IGxleHN1cC5jOjE5OCBsZXhzdXAuYzoyMDggbGV4c3VwLmM6MjE3IGxleHN1cC5jOjI4NAotIzogbGV4c3VwLmM6MzA3IGxleHN1cC5jOjM0MQotbXNnaWQgIkZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU5Ci1tc2dpZCAiUmVhZCBNUkkgZm9ybWF0IGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTYxCi1tc2dpZCAiRm9yY2UgY29tbW9uIHN5bWJvbHMgdG8gYmUgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjUgbGV4c3VwLmM6MzMxIGxleHN1cC5jOjMzMyBsZXhzdXAuYzozMzUKLW1zZ2lkICJBRERSRVNTIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2NQotbXNnaWQgIlNldCBzdGFydCBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2NwotbXNnaWQgIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2OQotbXNnaWQgIkxpbmsgYmlnLWVuZGlhbiBvYmplY3RzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3MQotbXNnaWQgIkxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3MyBsZXhzdXAuYzoxNzYKLW1zZ2lkICJTSExJQiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzMKLW1zZ2lkICJBdXhpbGlhcnkgZmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzYKLW1zZ2lkICJGaWx0ZXIgZm9yIHNoYXJlZCBvYmplY3Qgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3OAotbXNnaWQgIklnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTgwCi1tc2dpZCAiU0laRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODAKLW1zZ2lkICJTbWFsbCBkYXRhIHNpemUgKGlmIG5vIHNpemUsIHNhbWUgYXMgLS1zaGFyZWQpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MwotbXNnaWQgIkZJTEVOQU1FIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MwotbXNnaWQgIlNldCBpbnRlcm5hbCBuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4NQotbXNnaWQgIkxJQk5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg1Ci1tc2dpZCAiU2VhcmNoIGZvciBsaWJyYXJ5IExJQk5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg3Ci1tc2dpZCAiRElSRUNUT1JZIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4NwotbXNnaWQgIkFkZCBESVJFQ1RPUlkgdG8gbGlicmFyeSBzZWFyY2ggcGF0aCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODkKLW1zZ2lkICJFTVVMQVRJT04iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg5Ci1tc2dpZCAiU2V0IGVtdWxhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTEKLW1zZ2lkICJQcmludCBtYXAgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTkzCi1tc2dpZCAiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTUKLW1zZ2lkICJEbyBub3QgcGFnZSBhbGlnbiBkYXRhLCBkbyBub3QgbWFrZSB0ZXh0IHJlYWRvbmx5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5OAotbXNnaWQgIlNldCBvdXRwdXQgZmlsZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwMAotbXNnaWQgIk9wdGltaXplIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwMgotbXNnaWQgIklnbm9yZWQgZm9yIFNWUjQgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMDQKLW1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0ZWFibGUgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwOAotbXNnaWQgIkp1c3QgbGluayBzeW1ib2xzIChpZiBkaXJlY3RvcnksIHNhbWUgYXMgLS1ycGF0aCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjExCi1tc2dpZCAiU3RyaXAgYWxsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjEzCi1tc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE1Ci1tc2dpZCAiVHJhY2UgZmlsZSBvcGVucyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTcKLW1zZ2lkICJSZWFkIGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE5IGxleHN1cC5jOjIzMSBsZXhzdXAuYzozMjcgbGV4c3VwLmM6MzQ0IGxleHN1cC5jOjM2MQotbXNnaWQgIlNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTkKLW1zZ2lkICJTdGFydCB3aXRoIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyMQotbXNnaWQgIkJ1aWxkIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRhYmxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjMKLW1zZ2lkICJQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyNQotbXNnaWQgIlByaW50IHZlcnNpb24gYW5kIGVtdWxhdGlvbiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjcKLW1zZ2lkICJEaXNjYXJkIGFsbCBsb2NhbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyOQotbXNnaWQgIkRpc2NhcmQgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjMxCi1tc2dpZCAiVHJhY2UgbWVudGlvbnMgb2YgU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzMyBsZXhzdXAuYzozMDkgbGV4c3VwLmM6MzExCi1tc2dpZCAiUEFUSCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzMKLW1zZ2lkICJEZWZhdWx0IHNlYXJjaCBwYXRoIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM1Ci1tc2dpZCAiSWdub3JlZCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzNwotbXNnaWQgIlN0YXJ0IGEgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM5Ci1tc2dpZCAiRW5kIGEgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjQxCi1tc2dpZCAiSWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNDMKLW1zZ2lkICJMaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNDkKLW1zZ2lkICJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjU3Ci1tc2dpZCAiQmluZCBnbG9iYWwgcmVmZXJlbmNlcyBsb2NhbGx5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI1OQotbXNnaWQgIkNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyAoZGVmYXVsdCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjYxCi1tc2dpZCAiRG8gbm90IGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjQKLW1zZ2lkICJPdXRwdXQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2NgotbXNnaWQgIlNZTUJPTD1FWFBSRVNTSU9OIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2NgotbXNnaWQgIkRlZmluZSBhIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjgKLW1zZ2lkICJEZW1hbmdsZSBzeW1ib2wgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjcwCi1tc2dpZCAiUFJPR1JBTSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzAKLW1zZ2lkICJTZXQgdGhlIGR5bmFtaWMgbGlua2VyIHRvIHVzZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzIKLW1zZ2lkICJHZW5lcmF0ZSBlbWJlZGRlZCByZWxvY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjc0Ci1tc2dpZCAiRm9yY2UgZ2VuZXJhdGlvbiBvZiBmaWxlIHdpdGggLmV4ZSBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjc2Ci1tc2dpZCAiUmVtb3ZlIHVudXNlZCBzZWN0aW9ucyAob24gc29tZSB0YXJnZXRzKSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzkKLW1zZ2lkICJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zIChkZWZhdWx0KSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODIKLW1zZ2lkICJQcmludCBvcHRpb24gaGVscCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODQKLW1zZ2lkICJXcml0ZSBhIG1hcCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI4NgotbXNnaWQgIkRvIG5vdCBkZW1hbmdsZSBzeW1ib2wgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjg4Ci1tc2dpZCAiVXNlIGxlc3MgbWVtb3J5IGFuZCBtb3JlIGRpc2sgSS9PIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5MAotbXNnaWQgIkFsbG93IG5vIHVuZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5MgotbXNnaWQgIkRvbid0IHdhcm4gYWJvdXQgbWlzbWF0Y2hlZCBpbnB1dCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyOTQKLW1zZ2lkICJUdXJuIG9mZiAtLXdob2xlLWFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjk2Ci1tc2dpZCAiQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGV2ZW4gaWYgZXJyb3JzIG9jY3VyIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwMAotbXNnaWQgIlNwZWNpZnkgdGFyZ2V0IG9mIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwMgotbXNnaWQgIklnbm9yZWQgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzA0Ci1tc2dpZCAiUmVsYXggYnJhbmNoZXMgb24gY2VydGFpbiB0YXJnZXRzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwNwotbXNnaWQgIktlZXAgb25seSBzeW1ib2xzIGxpc3RlZCBpbiBGSUxFIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwOQotbXNnaWQgIlNldCBydW50aW1lIHNoYXJlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxMQotbXNnaWQgIlNldCBsaW5rIHRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzEzCi1tc2dpZCAiQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzE3Ci1tc2dpZCAiU29ydCBjb21tb24gc3ltYm9scyBieSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyMQotbXNnaWQgIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBmb3IgZWFjaCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyMwotbXNnaWQgIkNPVU5UIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyMwotbXNnaWQgIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBldmVyeSBDT1VOVCByZWxvY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzI1Ci1tc2dpZCAiUHJpbnQgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzI3Ci1tc2dpZCAiRG8gdGFzayBsZXZlbCBsaW5raW5nIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyOQotbXNnaWQgIlVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgbGlua2VyIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMzMQotbXNnaWQgIlNldCBhZGRyZXNzIG9mIC5ic3Mgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzMKLW1zZ2lkICJTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMzNQotbXNnaWQgIlNldCBhZGRyZXNzIG9mIC50ZXh0IHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzM3Ci1tc2dpZCAiT3V0cHV0IGxvdHMgb2YgaW5mb3JtYXRpb24gZHVyaW5nIGxpbmsiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzQxCi1tc2dpZCAiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHNjcmlwdCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNDQKLW1zZ2lkICIiCi0iVGFrZSBleHBvcnQgc3ltYm9scyBsaXN0IGZyb20gLmV4cG9ydHMsIHVzaW5nXG4iCi0iXHRcdFx0XHRTWU1CT0wgYXMgdGhlIHZlcnNpb24uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0NwotbXNnaWQgIldhcm4gYWJvdXQgZHVwbGljYXRlIGNvbW1vbiBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0OQotbXNnaWQgIldhcm4gaWYgZ2xvYmFsIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBhcmUgc2VlbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTIKLW1zZ2lkICJXYXJuIGlmIHRoZSBtdWx0aXBsZSBHUCB2YWx1ZXMgYXJlIHVzZWQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzU0Ci1tc2dpZCAiV2FybiBvbmx5IG9uY2UgcGVyIHVuZGVmaW5lZCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzU2Ci1tc2dpZCAiV2FybiBpZiBzdGFydCBvZiBzZWN0aW9uIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTkKLW1zZ2lkICJJbmNsdWRlIGFsbCBvYmplY3RzIGZyb20gZm9sbG93aW5nIGFyY2hpdmVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM2MQotbXNnaWQgIlVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM2MwotbXNnaWQgIls9V09SRFNdIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM2MwotbXNnaWQgIiIKLSJNb2RpZnkgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gbGFzdCBXT1JEUyAoMS0xMCxcbiIKLSJcdFx0XHRcdGRlZmF1bHQgNSkgd29yZHMgb2YgYSBwYWdlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjUyNQotbXNnaWQgIiVQJUY6IHVucmVjb2duaXplZCAtYSBvcHRpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjUzOAotbXNnaWQgIiVQJUY6IHVucmVjb2duaXplZCAtYXNzZXJ0IG9wdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6NjI5Ci1tc2dpZCAiJVAlRjogaW52YWxpZCBudW1iZXIgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjgwMQotbXNnaWQgIiVQJUY6IC1zaGFyZWQgbm90IHN1cHBvcnRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjg2NQotbXNnaWQgIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjg2NgotbXNnaWQgIiIKLSJUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG4iCi0idGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjk1NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbWF5IG5vdCBuZXN0IGdyb3VwcyAoLS1oZWxwIGZvciB1c2FnZSlcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo5NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGdyb3VwIGVuZGVkIGJlZm9yZSBpdCBiZWdhbiAoLS1oZWxwIGZvciB1c2FnZSlcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo5ODQKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IHRvIG9wdGlvbiBcIm1wYzg2MGMwXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDMxCi1tc2dpZCAiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbb3B0aW9uc10gZmlsZS4uLlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjEwNDUKLW1zZ2lkICJPcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjExMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czpcbiIKLSIgICIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogc3VwcG9ydGVkIGVtdWxhdGlvbnM6XG4iCi0iICAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTEzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTEzOQotbXNnaWQgIiIKLSJcbiIKLSJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBtcmkuYzozNDIKLW1zZ2lkICIlUCVGOiB1bmtub3duIGZvcm1hdCB0eXBlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6MTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYVW5zdXBwb3J0ZWQgUEVJIGFyY2hpdGVjdHVyZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzozNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMgKCVkIHZzICVkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjM1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nLCBkdXBsaWNhdGUgRVhQT1JUOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjQwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjQxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCB3cm9uZyB0eXBlICglZCB2cyAlZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo0MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGZvdW5kXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6NTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVYRXJyb3IsIG9yaWRpbmFsIHVzZWQgdHdpY2U6ICVkICglcyB2cyAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo3MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhFcnJvcjogJWQtYml0IHJlbG9jIGluIGRsbFxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjg1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZGVmIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo5NzYKLW1zZ2lkICI7IG5vIGNvbnRlbnRzIGF2YWlsYWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjE0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW4ndCBvcGVuIC5saWIgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzoxNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvUkVBRE1FIGIvbGQvc2NyaXB0dGVtcGwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmFkMmU5Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSBsaW5rZXIgc2NyaXB0IHRlbXBsYXRlcy4KLWdlbnNjcmlwdHMuc2ggc2V0cyBzb21lIHNoZWxsIHZhcmlhYmxlcywgdGhlbiBzb3VyY2VzCi1FTVVMQVRJT04uc2MsIHRvIGdlbmVyYXRlIEVNVUxBVElPTi57eCx4cix4dSx4bix4Ym59IC0tIHRoZSBzY3JpcHQKLWZpbGVzIGZvciBkZWZhdWx0LCAtciwgLVVyLCAtbiwgLU4uCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hMjlrLnNjIGIvbGQvc2NyaXB0dGVtcGwvYTI5ay5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyNWIxZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hMjlrLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1TRUNUSU9OUwotewotICAudGV4dCA6IHsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgX19ldGV4dCAgPSAgLn07Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKigubGl0KQotICAgICooLnNoZGF0YSkKLSAgfQotICAuc2hic3MgU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpIDoJewotICAgICooLnNoYnNzKQotICB9IAotICAuZGF0YSAgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9fZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgICBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSkgOgotICB7IAkJCQkJCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IEFMSUdOKDB4OCl9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FpeC5zYyBiL2xkL3NjcmlwdHRlbXBsL2FpeC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0YjYxNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9haXguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIEFJWCBsaW5rZXIgc2NyaXB0LgotIyBBSVggYWx3YXlzIHVzZXMgc2hhcmVkIGxpYnJhcmllcy4gIFRoZSBzZWN0aW9uIFZNQSBhcHBlYXJzIHRvIGJlCi0jIHVuaW1wb3J0YW50LiAgVGhlIG5hdGl2ZSBsaW5rZXIgYWxpZ25zIHRoZSBzZWN0aW9ucyBvbiBib3VuZGFyaWVzCi0jIHNwZWNpZmllZCBieSB0aGUgLUggb3B0aW9uLgotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotRU5UUlkoX19zdGFydCkKLVNFQ1RJT05TCi17Ci0gIC5wYWQgMCA6IHsgKigucGFkKSB9Ci0gIC50ZXh0ICR7UkVMT0NBVElORy0wfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX3RleHQgPSAuKTt9Ci0gICAgKigudGV4dCkKLSAgICAqKC5wcikKLSAgICAqKC5ybykKLSAgICAqKC5kYikKLSAgICAqKC5nbCkKLSAgICAqKC54bykKLSAgICAqKC50aSkKLSAgICAqKC50YikKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2V0ZXh0ID0gLik7fQotICB9Ci0gIC5kYXRhIDAgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9kYXRhID0gLik7fQotICAgICooLmRhdGEpCi0gICAgKigucncpCi0gICAgKiguc3YpCi0gICAgKigudWEpCi0gICAgLiA9IEFMSUdOKDQpOwotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAqKC5kcykKLSAgICAqKC50YzApCi0gICAgKigudGMpCi0gICAgKigudGQpCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9lZGF0YSA9IC4pO30KLSAgfQotICAuYnNzIDogewotICAgICooLnRvY2JzcykKLSAgICAqKC5ic3MpCi0gICAgKiguYnMpCi0gICAgKigudWMpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9lbmQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLSAgfQotICAubG9hZGVyIDAgOiB7Ci0gICAgKigubG9hZGVyKQotICB9Ci0gIC5kZWJ1ZyAwIDogewotICAgICooLmRlYnVnKQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FscGhhLnNjIGIvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTEwYzQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIEFscGhhIHN5c3RlbXMuCi0jIElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLSMgVGhlc2UgdmFyaWFibGVzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBlbXVsYXRpb24gZmlsZS4gIFRoZQotIyBkZWZhdWx0cyBhcmUgYXBwcm9wcmlhdGUgZm9yIGFuIEFscGhhIHJ1bm5pbmcgT1NGLzEuCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9fc3RhcnQKLXRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHgxMjAwMDAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKLWlmIHRlc3QgIngkTERfRkxBRyIgPSAieG4iIC1vICJ4JExEX0ZMQUciID0gInhOIjsgdGhlbgotICBEQVRBX0FERFI9LgotZWxzZQotICB0ZXN0IC16ICIkREFUQV9BRERSIiAmJiBEQVRBX0FERFI9MHgxNDAwMDAwMDAKLWZpCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDogewotICAgICR7UkVMT0NBVElORysgX2Z0ZXh0ID0gLiB9OwotICAgICR7UkVMT0NBVElORysgX19pc3RhcnQgPSAuIH07Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KSB9Ci0gICAgJHtSRUxPQ0FUSU5HKyBMT05HICgweDZiZmE4MDAxKX0KLSAgICAke1JFTE9DQVRJTkcrIGVwcm9sICA9ICAufTsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgX19mc3RhcnQgPSAuIH07Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAke1JFTE9DQVRJTkcrIExPTkcgKDB4NmJmYTgwMDEpfQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ICA9ICAufTsKLSAgfQotICAucmRhdGEgOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgLnJjb25zdCA6IHsKLSAgICAqKC5yY29uc3QpCi0gIH0KLSAgLnBkYXRhIDogewotICAgICR7UkVMT0NBVElORysgX2ZwZGF0YSA9IC47fQotICAgICooLnBkYXRhKQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9O30KLSAgLmRhdGEgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZmRhdGEgPSAuO30KLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAueGRhdGEgOiB7Ci0gICAgKigueGRhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZ3AgPSBBTElHTiAoMTYpICsgMHg4MDAwO30KLSAgLmxpdDggOiB7Ci0gICAgKigubGl0OCkKLSAgfQotICAubGl0YSA6IHsKLSAgICAqKC5saXRhKQotICB9Ci0gIC5zZGF0YSA6IHsKLSAgICAqKC5zZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIF9FREFUQSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORysgX0ZCU1MgPSAuO30KLSAgLnNic3MgOiB7Ci0gICAgKiguc2JzcykKLSAgICAqKC5zY29tbW9uKQotICB9Ci0gIC5ic3MgOiB7Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvYW91dC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkYmIzNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hb3V0LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0FMSUdOTUVOVH0iICYmIEFMSUdOTUVOVD0iNCIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotJHtTSExJQl9QQVRIKyR7UkVMT0NBVElORyske1NITElCX1BBVEh9fX0KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19zdGFjayA9IDApO30KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKLSAgICAgICBpcyBpbXBvcnRhbnQuICAqLwotICAgICooLmR5bnJlbCkKLSAgICAqKC5oYXNoKQotICAgICooLmR5bnN5bSkKLSAgICAqKC5keW5zdHIpCi0gICAgKigucnVsZXMpCi0gICAgKigubmVlZCkKLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgICAqKC5keW5hbWljKQotICAgICooLmdvdCkKLSAgICAqKC5wbHQpCi0gICAgKiguZGF0YSkKLSAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9Ci0gICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IC4gfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvYXJtYW91dC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyNzZhOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgJHtSRUxPQ0FUSU5HK19fc3RleHRfID0gLjt9Ci0gICAgKigudGV4dCkKLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORyske0RBVEFfQUxJR05NRU5UfX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fc2RhdGFfID0gLjt9Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiAoLmRhdGEpfSA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvYXJtY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5Y2Q3Yy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBBUk0gQ09GRi4KLSMgQmFzZWQgb24gaTM4NmNvZmYuc2MgYnkgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWlmIHRlc3QgLXogIiR7REFUQV9BRERSfSI7IHRoZW4KLSAgaWYgdGVzdCAiJExEX0ZMQUciID0gIk4iIHx8IHRlc3QgIiRMRF9GTEFHIiA9ICJuIjsgdGhlbgotICAgIERBVEFfQUREUj0uCi0gIGZpCi1maQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLyogV2Ugc3RhcnQgYXQgMHg4MDAwIGJlY2F1c2UgZ2RiIGFzc3VtZXMgaXQgKHNlZSBGUkFNRV9DSEFJTikuCi0gICAgIFRoaXMgaXMgYW4gYXJ0aWZhY3Qgb2YgdGhlIEFSTSBEZW1vbiBtb25pdG9yIHVzaW5nIHRoZSBib3R0b20gMzJrCi0gICAgIGFzIHdvcmtzcGFjZSAoc2hhcmVkIHdpdGggdGhlIEZQIGluc3RydWN0aW9uIGVtdWxhdG9yIGlmCi0gICAgIHByZXNlbnQpOiAqLwotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4ODAwMH0gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICooLmdsdWVfN3QpCi0gICAgKiguZ2x1ZV83KQotICAgICooLnJkYXRhKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrJHtEQVRBX0FERFItMHg0MDAwMCArICguICYgMHhmZmZjMGZmZil9fSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICBfX2RhdGFfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9fID0gLjt9Ci0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjIGIvbGQvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NjMwNS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWShfc3RhcnQpCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4MjAwMCArIFNJWkVPRl9IRUFERVJTfSA6Ci0gICAgewotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZXh0LnN0YXJ0ID0gLn07Ci0gICAgICAqKC50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLjt9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHQuZW5kID0gLn07Ci0gICAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQotICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KLSAgICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpICsgMHg0MDAwMDB9IDoKLSAgICB7Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmRhdGEuc3RhcnQgPSAufTsKLSAgICAgICooLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgICAgICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAufTsKLSAgICAgICR7UkVMT0NBVElORysgX18uZGF0YS5lbmQgPSAufTsKLSAgICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgICB7IAkJCQkJCi0gICAgICAke1JFTE9DQVRJTkcrIF9fLmJzcy5zdGFydCA9IC59OwotICAgICAgKiguYnNzKQotICAgICAgKihDT01NT04pCi0gICAgICAke1JFTE9DQVRJTkcrIF9fLmJzcy5lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgZW5kID0gQUxJR04oMHg4KX07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSBBTElHTigweDgpfTsKLSAgICB9Ci0gIC5jb21tZW50ICR7UkVMT0NBVElORysgMH0gOgotICAgIHsKLSAgICAgICooLmNvbW1lbnQpCi0gICAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYyBiL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA1MGVlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLUVOVFJZKHN0YXJ0KQotCi1TRUNUSU9OUyB7Ci0gIC50ZXh0ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDogCi0gICAgewotCSooLnRleHQpOwotCSR7UkVMT0NBVElORytfZXRleHQgPSAufTsKLSAgICB9Ci0gIGRhdGEgJHtSRUxPQ0FUSU5HKzB4ODAwMDIwMDB9IDoKLSAgICB7Ci0JKiguZGF0YSk7Ci0JKigubXN0YWNrKTsgCi0JKiguc2hic3MpOwotCSooLnJzdGFjayk7Ci0JKigubXN0YWNrKTsKLQkke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgfQotICAuYnNzICAuIDoKLSAgICB7IAotCSooQ09NTU9OKSAJCi0JKiguYnNzKTsKLQkke1JFTE9DQVRJTkcrX2VuZCA9IC59OwotICAgIH0gCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2VsZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkYzdiMC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TIC0gYXQgc3RhcnQgb2YgdGV4dCBzZWdtZW50Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1RFWFRfU0VDVElPTlMgLSB0aGVzZSBnZXQgcHV0IGluIC50ZXh0IHdoZW4gcmVsb2NhdGluZwotIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLmN0b3JzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfQlNTX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuYnNzIC5zYnNzIC4uLgotIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKLSMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KLSMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCi0jCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLnRleHQgc2VjdGlvbi4KLSMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuZGF0YSBzZWN0aW9uLgotIwlPVEhFUl9HT1RfU1lNQk9MUyAtIHN5bWJvbHMgZGVmaW5lZCBqdXN0IGJlZm9yZSAuZ290LgotIwlPVEhFUl9HT1RfU0VDVElPTlMgLSBzZWN0aW9ucyBqdXN0IGFmdGVyIC5nb3QgYW5kIC5zZGF0YS4KLSMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgotIwlEQVRBX1BMVCAtIC5wbHQgc2hvdWxkIGJlIGluIGRhdGEgc2VnbWVudCwgbm90IHRleHQgc2VnbWVudC4KLSMJVEVYVF9EWU5BTUlDIC0gLmR5bmFtaWMgaW4gdGV4dCBzZWdtZW50LCBub3QgZGF0YSBzZWdtZW50LgotIwlFTUJFRERFRCAtIHdoZXRoZXIgdGhpcyBpcyBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLiAKLSMJU0hMSUJfVEVYVF9TVEFSVF9BRERSIC0gaWYgc2V0LCBhZGQgdG8gU0laRU9GX0hFQURFUlMgdG8gc2V0Ci0jCQlzdGFydCBhZGRyZXNzIG9mIHNoYXJlZCBsaWJyYXJ5LgotIwlJTlBVVF9GSUxFUyAtIElOUFVUIGNvbW1hbmQgb2YgZmlsZXMgdG8gYWx3YXlzIGluY2x1ZGUKLSMJV1JJVEFCTEVfUk9EQVRBIC0gaWYgc2V0LCB0aGUgLnJvZGF0YSBzZWN0aW9uIHNob3VsZCBiZSB3cml0YWJsZQotIwlJTklUX1NUQVJULCBJTklUX0VORCAtICBzdGF0ZW1lbnRzIGp1c3QgYmVmb3JlIGFuZCBqdXN0IGFmdGVyCi0jIAljb21iaW5hdGlvbiBvZiAuaW5pdCBzZWN0aW9ucy4KLSMJRklOSV9TVEFSVCwgRklOSV9FTkQgLSBzdGF0ZW1lbnRzIGp1c3QgYmVmb3JlIGFuZCBqdXN0IGFmdGVyCi0jIAljb21iaW5hdGlvbiBvZiAuZmluaSBzZWN0aW9ucy4KLSMKLSMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAotIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCi0jCi0KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWlmIFsgLXogIiRNQUNISU5FIiBdOyB0aGVuIE9VVFBVVF9BUkNIPSR7QVJDSH07IGVsc2UgT1VUUFVUX0FSQ0g9JHtBUkNIfToke01BQ0hJTkV9OyBmaQotdGVzdCAteiAiJHtFTEZTSVpFfSIgJiYgRUxGU0laRT0zMgotdGVzdCAteiAiJHtBTElHTk1FTlR9IiAmJiBBTElHTk1FTlQ9IiR7RUxGU0laRX0gLyA4IgotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1JTlRFUlA9Ii5pbnRlcnAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmludGVycCkgCX0iCi1QTFQ9Ii5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpCX0iCi1EWU5BTUlDPSIuZHluYW1pYyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5hbWljKSB9IgotUk9EQVRBPSIucm9kYXRhICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfSAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnIqKX0gfSIKLUNUT1I9Ii5jdG9ycyAke0NPTlNUUlVDVElORy0wfSA6IAotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX1NUQVJUfX0KLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCi0gICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCi0gICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAotICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKLSAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubwotICAgICAgIGlzIGluLiAgKi8KLQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0KLSAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQotICAgICAgIGZyb20gdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KLSAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKLSAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KLQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9FTkR9fQotICB9IgotCi1EVE9SPSIgLmR0b3JzICAgICAgICR7Q09OU1RSVUNUSU5HLTB9IDoKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9TVEFSVH19Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfRU5EfX0KLSAgfSIKLQotIyBpZiB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0sIGRvbid0IGFkZCBTSVpFT0ZfSEVBREVSUy4KLWlmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgotICAgdGVzdCAteiAiJHtURVhUX0JBU0VfQUREUkVTU30iICYmIFRFWFRfQkFTRV9BRERSRVNTPSIke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUyIKLWVsc2UKLSAgIHRlc3QgLXogIiR7VEVYVF9CQVNFX0FERFJFU1N9IiAmJiBURVhUX0JBU0VfQUREUkVTUz0iJHtURVhUX1NUQVJUX0FERFJ9IgotZmkKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtPVVRQVVRfQVJDSH0pCi1FTlRSWSgke0VOVFJZfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORyske0lOUFVUX0ZJTEVTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci0KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9CQVNFX0FERFJFU1N9O319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gJHtTSExJQl9URVhUX1NUQVJUX0FERFI6LTB9ICsgU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQotICAke0lOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlN9Ci0gICR7VEVYVF9EWU5BTUlDKyR7RFlOQU1JQ319Ci0gIC5oYXNoICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQotICAuZ251LnZlcnNpb24gJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbikJfQotICAuZ251LnZlcnNpb25fZCAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX2QpCX0KLSAgLmdudS52ZXJzaW9uX3IgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9yKQl9Ci0KLSAgLnJlbC5pbml0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmluaXQpCX0KLSAgLnJlbGEuaW5pdCAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KQl9Ci0gIC5yZWwudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbC50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC50ZXh0LiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UudCopfQotICAgIH0KLSAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEudGV4dC4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS50Kil9Ci0gICAgfQotICAucmVsLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZmluaSkJfQotICAucmVsYS5maW5pICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwucm9kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UuciopfQotICAgIH0KLSAgLnJlbGEucm9kYXRhICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS5yb2RhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5yb2RhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuciopfQotICAgIH0KLSAgJHtPVEhFUl9SRUFET05MWV9SRUxPQ19TRUNUSU9OU30KLSAgLnJlbC5kYXRhICAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmRhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS5kKil9Ci0gICAgfQotICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLmQqKX0KLSAgICB9Ci0gIC5yZWwuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuZ290ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQkJfQotICAke09USEVSX0dPVF9SRUxPQ19TRUNUSU9OU30KLSAgLnJlbC5zZGF0YSAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLnNkYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5zZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZ251LmxpbmtvbmNlLnMqKX0KLSAgICB9Ci0gIC5yZWxhLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnNkYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuc2RhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UucyopfQotICAgIH0KLSAgLnJlbC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnNic3MpCQl9Ci0gIC5yZWxhLnNic3MgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzcykJfQotICAucmVsLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCQl9Ci0KLSAgLmluaXQgICAgICAgICR7UkVMT0NBVElORy0wfSA6IAotICB7IAotICAgICR7SU5JVF9TVEFSVH0KLSAgICBLRUVQICgqKC5pbml0KSkKLSAgICAke0lOSVRfRU5EfQotICB9ID0ke05PUC0wfQotCi0gICR7REFUQV9QTFQtJHtQTFR9fQotICAudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysqKC50ZXh0LiopfQotICAgICooLnN0dWIpCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS50Kil9Ci0gICAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfVEVYVF9TRUNUSU9OU319Ci0gIH0gPSR7Tk9QLTB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotICAuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtGSU5JX1NUQVJUfQotICAgIEtFRVAgKCooLmZpbmkpKQotICAgICR7RklOSV9FTkR9Ci0gIH0gPSR7Tk9QLTB9Ci0gICR7V1JJVEFCTEVfUk9EQVRBLSR7Uk9EQVRBfX0KLSAgLnJvZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KLQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bwotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoLiAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSAke1NITElCX0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoLiAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fX0KLQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YS4qKX0KLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLmQqKX0KLSAgICAke0NPTlNUUlVDVElORytTT1JUKENPTlNUUlVDVE9SUyl9Ci0gIH0KLSAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0KLSAgLmVoX2ZyYW1lIDogeyAqKC5laF9mcmFtZSkgfQotICAuZ2NjX2V4Y2VwdF90YWJsZSA6IHsgKiguZ2NjX2V4Y2VwdF90YWJsZSkgfQotICAke1dSSVRBQkxFX1JPREFUQSske1JPREFUQX19Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0gICR7UkVMT0NBVElORyske0NUT1J9fQotICAke1JFTE9DQVRJTkcrJHtEVE9SfX0KLSAgJHtEQVRBX1BMVCske1BMVH19Ci0gICR7UkVMT0NBVElORyske09USEVSX0dPVF9TWU1CT0xTfX0KLSAgLmdvdCAgICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gICR7VEVYVF9EWU5BTUlDLSR7RFlOQU1JQ319Ci0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtTREFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5zZGF0YSkgCi0gICAgJHtSRUxPQ0FUSU5HKyooLnNkYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2Uucy4qKX0KLSAgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9HT1RfU0VDVElPTlN9fQotICAke1JFTE9DQVRJTkcrX2VkYXRhID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICooLmR5bnNic3MpCi0gICAgKiguc2JzcykKLSAgICAke1JFTE9DQVRJTkcrKiguc2Jzcy4qKX0KLSAgICAqKC5zY29tbW9uKQotICB9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICR7UkVMT0NBVElORysqKC5ic3MuKil9Ci0gICAqKENPTU1PTikKLSAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bwotICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCi0gICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCi0gICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7QUxJR05NRU5UfSk7fQotICB9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TRUNUSU9OU319Ci0gICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19FTkRfU1lNQk9MU319Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotCi0gIC5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TfX0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyZWVmNC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLSMKLSMgVW51c3VhbCB2YXJpYWJsZXMgY2hlY2tlZCBieSB0aGlzIGNvZGU6Ci0jCU5PUCAtIHR3byBieXRlIG9wY29kZSBmb3Igbm8tb3AgKGRlZmF1bHRzIHRvIDApCi0jCURBVEFfQUREUiAtIGlmIGVuZC1vZi10ZXh0LXBsdXMtb25lLXBhZ2UgaXNuJ3QgcmlnaHQgZm9yIGRhdGEgc3RhcnQKLSMJT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgLSBvdGhlciB0aGFuIC50ZXh0IC5pbml0IC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5jdG9ycyAuc2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5nbG9iYWwpCi0jCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAotIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgotIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKLSMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkudGV4dCBzZWN0aW9uLgotIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5kYXRhIHNlY3Rpb24uCi0jCU9USEVSX0JTU19TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuYnNzIHNlY3Rpb24gYmVzaWRlcyBfX2Jzc19zdGFydC4KLSMJREFUQV9QTFQgLSAucGx0IHNob3VsZCBiZSBpbiBkYXRhIHNlZ21lbnQsIG5vdCB0ZXh0IHNlZ21lbnQuCi0jCUVNQkVEREVEIC0gd2hldGhlciB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uIAotIwotIyBXaGVuIGFkZGluZyBzZWN0aW9ucywgZG8gbm90ZSB0aGF0IHRoZSBuYW1lcyBvZiBzb21lIHNlY3Rpb25zIGFyZSB1c2VkCi0jIHdoZW4gc3BlY2lmeWluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dC4KLSMKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWlmIFsgLXogIiRNQUNISU5FIiBdOyB0aGVuIE9VVFBVVF9BUkNIPSR7QVJDSH07IGVsc2UgT1VUUFVUX0FSQ0g9JHtBUkNIfToke01BQ0hJTkV9OyBmaQotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1JTlRFUlA9Ii5pbnRlcnAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmludGVycCkgCX0iCi1QTFQ9Ii5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpCX0iCi0KLQotQ1RPUj0iLmN0b3JzICR7Q09OU1RSVUNUSU5HLTB9IDogCi0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfU1RBUlR9fQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX0VORH19Ci0gIH0iCi0KLURUT1I9IiAuZHRvcnMgICAgICAgJHtDT05TVFJVQ1RJTkctMH0gOgotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX1NUQVJUfX0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9FTkR9fQotICB9IgotCi0KLSMgaWYgdGhpcyBpcyBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLCBkb24ndCBhZGQgU0laRU9GX0hFQURFUlMuCi1pZiBbIC16ICIkRU1CRURERUQiIF07IHRoZW4KLSAgIHRlc3QgLXogIiR7UkVBRE9OTFlfQkFTRV9BRERSRVNTfSIgJiYgUkVBRE9OTFlfQkFTRV9BRERSRVNTPSIke1JFQURPTkxZX1NUQVJUX0FERFJ9ICsgU0laRU9GX0hFQURFUlMiCi1lbHNlCi0gICB0ZXN0IC16ICIke1JFQURPTkxZX0JBU0VfQUREUkVTU30iICYmIFJFQURPTkxZX0JBU0VfQUREUkVTUz0iJHtSRUFET05MWV9TVEFSVF9BRERSfSIKLWZpCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7T1VUUFVUX0FSQ0h9KQotRU5UUlkoJHtFTlRSWX0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1JFTE9DQVRJTkcrLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICR7U1RBQ0taRVJPKyR7U1RBQ0taRVJPfX0gJHtTSExJQl9QQVRIKyR7U0hMSUJfUEFUSH19ICAqL30KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkctIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcwotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZwotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovfQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtSRUFET05MWV9CQVNFX0FERFJFU1N9O319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQotICAuaGFzaCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmluaXQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuaW5pdCkJfQotICAucmVsYS5pbml0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbC5maW5pICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmZpbmkpCX0KLSAgLnJlbGEuZmluaSAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5maW5pKQl9Ci0gIC5yZWwuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgJHtEQVRBX1BMVC0ke1BMVH19Ci0gIC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSAqKC5nbnUubGlua29uY2UuciopIH0KLSAgLnJvZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KLQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLUFMSUdOKDQpO319Ci0KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YS4qKQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gIH0KLSAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TfX0KLSAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0gICR7UkVMT0NBVElORyske0RUT1J9fQotICAuZ290ICAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfQotICAke0RBVEFfUExUKyR7UExUfX0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IC47fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0ciAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXggMCA6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotCi0gICR7UkVMT0NBVElORyske09USEVSX1JFTE9DQVRJTkdfU0VDVElPTlN9fQotCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgJHtSRUxPQ0FUSU5HfS4gICovCi0gICR7T1RIRVJfU0VDVElPTlN9Ci0KLQotICAvKiBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotICAgICB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKGkuZS4gdG9wIG9mIDY0SyBkYXRhIHNwYWNlKS4gKi8KLSAgLnN0YWNrIDB4MDAwMDdGRkUgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9Ci0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICBLRUVQICgqKC5pbml0KSkKLSAgICBLRUVQICgqKC5maW5pKSkKLSAgICAqKC50ZXh0KQotICAgICooLnRleHQuKikKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gIH0gPSR7Tk9QLTB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmOTI4My4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLQotQ1RPUj0iLmN0b3JzICR7Q09OU1RSVUNUSU5HLTB9IDogCi0gIHsKLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47IH0KLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCi0gICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCi0gICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAotICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKLSAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubwotICAgICAgIGlzIGluLiAgKi8KLQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0KLSAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQotICAgICAgIGZyb20gdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KLSAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKLSAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KLQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fSIKLQotRFRPUj0iICAuZHRvcnMJJHtDT05TVFJVQ1RJTkctMH0gOgotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuOyB9Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjsgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0iCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi1NRU1PUlkKLXsKLSAgdGV4dCAke1RFWFRfREVGX1NFQ1RJT059IDogT1JJR0lOID0gJHtURVhUX1NUQVJUX0FERFJ9LCBMRU5HVEggPSAke1RFWFRfU0laRX0KLSAgZGF0YSAke0RBVEFfREVGX1NFQ1RJT059IDogT1JJR0lOID0gJHtEQVRBX1NUQVJUX0FERFJ9LCBMRU5HVEggPSAke0RBVEFfU0laRX0KLSAgZW1lbSAke0VNRU1fREVGX1NFQ1RJT059IDogT1JJR0lOID0gJHtFTUVNX1NUQVJUX0FERFJ9LCBMRU5HVEggPSAke0VNRU1fU0laRX0KLSAgZWl0CQkJICAgOiBPUklHSU4gPSAke0VJVF9TVEFSVF9BRERSfSwgIExFTkdUSCA9ICR7RUlUX1NJWkV9Ci19Ci0KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke1RFWFRfRFlOQU1JQyske0RZTkFNSUN9fQotICAuaGFzaAkJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkgfQotICAuZHluc3ltCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkgfQotICAuZHluc3RyCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikgfQotICAuZ251LnZlcnNpb24JCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb24pIH0KLSAgLmdudS52ZXJzaW9uX2QJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9kKSB9Ci0gIC5nbnUudmVyc2lvbl9yCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fcikgfQotCi0gIC5yZWxhLnRleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS50ZXh0KSAqKC5yZWxhLmdudS5saW5rb25jZS50KikgfQotICAucmVsYS5kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZGF0YSkgKigucmVsYS5nbnUubGlua29uY2UuZCopIH0KLSAgLnJlbGEucm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucm9kYXRhKSAqKC5yZWxhLmdudS5saW5rb25jZS5yKikgfQotICAucmVsYS5zdGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnN0ZXN0KSB9Ci0gIC5yZWxhLmV0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZXRlc3QpIH0KLSAgLnJlbGEuc2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zZGF0YSkgfQotICAucmVsYS5lZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmVkYXRhKSB9Ci0gIC5yZWxhLmVpdF92CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZWl0X3YpIH0KLSAgLnJlbGEuc2JzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MpIH0KLSAgLnJlbGEuZWJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmVic3MpIH0KLSAgLnJlbGEuc3JvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNyb2RhdGEpIH0KLSAgLnJlbGEuZXJvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmVyb2RhdGEpIH0KLSAgLnJlbGEuZ290CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KSB9Ci0gIC5yZWxhLmN0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpIH0KLSAgLnJlbGEuZHRvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykgfQotICAucmVsYS5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuaW5pdCkgfQotICAucmVsYS5maW5pCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkgfQotICAucmVsYS5ic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpIH0KLSAgLnJlbGEucGx0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KSB9Ci0KLSAgLnJlbC5kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kYXRhKSAqKC5yZWwuZ251LmxpbmtvbmNlLmQqKSB9Ci0gIC5yZWwucm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5yb2RhdGEpICooLnJlbC5nbnUubGlua29uY2UuciopIH0KLSAgLnJlbC5zdGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc3Rlc3QpIH0KLSAgLnJlbC5ldGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZXRlc3QpIH0KLSAgLnJlbC5zZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc2RhdGEpIH0KLSAgLnJlbC5lZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZWRhdGEpIH0KLSAgLnJlbC5zYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zYnNzKSB9Ci0gIC5yZWwuZWJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZWJzcykgfQotICAucmVsLmVpdF92CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5laXRfdikgfQotICAucmVsLnNyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnNyb2RhdGEpIH0KLSAgLnJlbC5lcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5lcm9kYXRhKSB9Ci0gIC5yZWwuZ290CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5nb3QpIH0KLSAgLnJlbC5jdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuY3RvcnMpIH0KLSAgLnJlbC5kdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZHRvcnMpIH0KLSAgLnJlbC5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5pbml0KSB9Ci0gIC5yZWwuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZmluaSkgfQotICAucmVsLmJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuYnNzKSB9Ci0gIC5yZWwucGx0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpIH0KLQotICAuaW5pdAkJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguaW5pdCkgfSA9JHtOT1AtMH0KLSAgJHtEQVRBX1BMVC0ke1BMVH19Ci0KLSAgLyogSW50ZXJuYWwgdGV4dCBzcGFjZSAqLwotICAuc3RleHQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zdGV4dCkgfQkJJHtSRUxPQ0FUSU5HKyA+IHRleHR9Ci0KLSAgLyogSW50ZXJuYWwgdGV4dCBzcGFjZSBvciBleHRlcm5hbCBtZW1vcnkgKi8KLSAgLnRleHQgOgotICB7Ci0gICAgKigudGV4dCkKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gICAgKiguaW5pdCkKLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtURVhUX01FTU9SWX19Ci0KLSAgLyogSW50ZXJuYWwgZGF0YSBzcGFjZSAqLwotICAuc3JvZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNyb2RhdGEpIH0JJHtSRUxPQ0FUSU5HKyA+IGRhdGF9Ci0gIC5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9CQkke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAvKiBJbnRlcm5hbCBkYXRhIHNwYWNlIG9yIGV4dGVybmFsIG1lbW9yeSAqLwotICAucm9kYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSB9CSR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAvKiBDKysgZXhjZXB0aW9uIHN1cHBvcnQuICAqLwotICAuZWhfZnJhbWUJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5laF9mcmFtZSkgfQkke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19Ci0KLSAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0gICR7UkVMT0NBVElORyske0RUT1J9fQotCi0gIC5kYXRhCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5nbnUubGlua29uY2UuZCopCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19Ci0KLSAgLyogRXh0ZXJuYWwgbWVtb3J5ICovCi0gIC5ldGV4dAkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2V0ZXh0X3N0YXJ0ID0gLikgOyB9Ci0gICAgKiguZXRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2V0ZXh0X2VuZCA9IC4pIDsgfQotICB9ICR7UkVMT0NBVElORysgPiBlbWVtfQotCi0gIC5lcm9kYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZXJvZGF0YSkgfQkke1JFTE9DQVRJTkcrID4gZW1lbX0KLSAgLmVkYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZWRhdGEpIH0JCSR7UkVMT0NBVElORysgPiBlbWVtfQotCi0gIC5zYnNzCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX3Nic3Nfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5zYnNzKQotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19zYnNzX2VuZCA9IC4pIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAuZWJzcwkJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19lYnNzX3N0YXJ0ID0gLikgOyB9Ci0gICAgKiguZWJzcykKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWJzc19lbmQgPSAuKSA7ICB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IGRhdGF9Ci0KLSAgLmJzcwkJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ic3Nfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Jzc19lbmQgPSAuKSA7IH0KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19Ci0KLSAgLmVpdF92CSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWl0X3N0YXJ0ID0gLikgOyB9Ci0gICAgKiguZWl0X3YpCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2VpdF9lbmQgPSAuKSA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZWl0fQotCi0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiCQkgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0cgkgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsCSAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0cgkgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4CSAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLQotICAuY29tbWVudAkgMCA6IHsgKiguY29tbWVudCkgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZwkgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUJCSAwIDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICBQUk9WSURFIChfX3N0YWNrID0gJHtTVEFDS19TVEFSVF9BRERSfSk7Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGFiOGY4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZnBwYy5zYworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuY3RvcnMgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKLSMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KLSMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCi0jCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLnRleHQgc2VjdGlvbi4KLSMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuZGF0YSBzZWN0aW9uLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1TQlNTMj0iLnNic3MyICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzczIpIH0iCi1TREFUQTI9Ii5zZGF0YTIgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YTIpIH0iCi1JTlRFUlA9Ii5pbnRlcnAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIH0iCi1QTFQ9Ii5wbHQgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpIH0iCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgotICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcwotICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKLSAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCi0gICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KLSAgICAgICBpcyBpbi4gICovCi0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KLSAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCi0gICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCi0gICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCi0KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KLSAgfSIKLQotRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19Ci0gIH0iCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWSgke0VOVFJZfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci0KLSR7UkVMT0NBVElORytQUk9WSURFIChfX3N0YWNrID0gMCk7fQotJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX3N0YWNrID0gMCk7fQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9ICsgU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gIC5oYXNoCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0JJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKSAgICAgIH0KLSAgLmdudS52ZXJzaW9uX2QgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9kKSAgfQotICAuZ251LnZlcnNpb25fciAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpICB9Ci0gIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEudGV4dCkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnRleHQuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UudCopfQotICAgIH0KLSAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS5kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5kKil9Ci0gICAgfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnJvZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsYS5nb3QJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsYS5nb3QxCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QxKQl9Ci0gIC5yZWxhLmdvdDIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdDIpCX0KLSAgLnJlbGEuY3RvcnMJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsYS5pbml0CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KQl9Ci0gIC5yZWxhLmZpbmkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbGEuYnNzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbGEucGx0CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCX0KLSAgLnJlbGEuc2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhKQl9Ci0gIC5yZWxhLnNic3MJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MpCX0KLSAgLnJlbGEuc2RhdGEyCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zZGF0YTIpCX0KLSAgLnJlbGEuc2JzczIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MyKQl9Ci0gIC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9Ci0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS50Kil9Ci0gIH0gPSR7Tk9QLTB9Ci0gIC5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7IEtFRVAgKCooLmluaXQpKQl9ID0ke05PUC0wfQotICAuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyBLRUVQICgqKC5maW5pKSkJfSA9JHtOT1AtMH0KLSAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuciopfQotICB9Ci0gIC5yb2RhdGExCSR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZXRleHQgPSAuKTt9Ci0gICR7Q1JFQVRFX1NITElCLSR7U0RBVEEyfX0KLSAgJHtDUkVBVEVfU0hMSUItJHtTQlNTMn19Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KLQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bwotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGQKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6Ci0gICAgICAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoQUxJR04oOCkgJiAoJHtNQVhQQUdFU0laRX0gLSAxKSl9O30KLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGEKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGUKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZQotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmcKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmUKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3QKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqLwotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLSBBTElHTig4KSArICR7TUFYUEFHRVNJWkV9fTt9Ci0KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGEuKil9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5kKil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0KLSAgLmdvdDEJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290MSkgfQotICAuZHluYW1pYwkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0KLQotICAvKiBQdXQgLmN0b3JzIGFuZCAuZHRvcnMgbmV4dCB0byB0aGUgLmdvdDIgc2VjdGlvbiwgc28gdGhhdCB0aGUgcG9pbnRlcnMKLSAgICAgZ2V0IHJlbG9jYXRlZCB3aXRoIC1tcmVsb2NhdGFibGUuIEFsc28gcHV0IGluIHRoZSAuZml4dXAgcG9pbnRlcnMuCi0gICAgIFRoZSBjdXJyZW50IGNvbXBpbGVyIG5vIGxvbmdlciBuZWVkcyB0aGlzLCBidXQga2VlcCBpdCBhcm91bmQgZm9yIDIuNy4yICAqLwotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UMl9TVEFSVF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVDJfU1RBUlRfID0gLik7fQotICAuZ290MgkJJHtSRUxPQ0FUSU5HLTB9IDogIHsgKiguZ290MikgfQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfTElTVF9fID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fQ1RPUl9MSVNUX18gPSAuKTt9Ci0gICAgICAgICAgICAgICAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfRU5EX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19DVE9SX0VORF9fID0gLik7fQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfTElTVF9fID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fRFRPUl9MSVNUX18gPSAuKTt9Ci0gICAgICAgICAgICAgICAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfRU5EX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19EVE9SX0VORF9fID0gLik7fQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfU1RBUlRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19GSVhVUF9TVEFSVF8gPSAuKTt9Ci0gIC5maXh1cAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmZpeHVwKSB9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRklYVVBfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1QyX0VORF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVDJfRU5EXyA9IC4pO30KLQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVF9TVEFSVF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVF9TVEFSVF8gPSAuKTt9Ci0gIC5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290KSB9Ci0gIC5nb3QucGx0CSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgfQotICAke0NSRUFURV9TSExJQiske1NEQVRBMn19Ci0gICR7Q1JFQVRFX1NITElCKyR7U0JTUzJ9fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVF9FTkRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19HT1RfRU5EXyA9IC4pO30KLQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChfX2VkYXRhID0gLik7fQotICAuc2JzcyAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc2Jzc19zdGFydCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc2Jzc19zdGFydCA9IC4pO30KLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gICAgKiguZHluc2JzcykKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19zYnNzX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc2Jzc19lbmQgPSAuKTt9Ci0gIH0KLSAgJHtQTFR9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgICR7UkVMT0NBVElORytQUk9WSURFIChfX2Jzc19zdGFydCA9IC4pO30KLSAgICR7UkVMT0NBVElORytQUk9WSURFIChfX19ic3Nfc3RhcnQgPSAuKTt9Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZW5kID0gLik7fQotCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbgotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lcG9jcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lcG9jcGUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTY2OTYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZXBvY3BlLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgUEUuCi0KLWlmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgotICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1maQotCi0jIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAotIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KLSMgU29ydGluZyBvZiB0aGUgLmZvbyQqIHNlY3Rpb25zIGlzIHJlcXVpcmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mCi0jIGdyb3VwZWQgc2VjdGlvbnMgaW4gUEUuCi0jIFNvcnRpbmcgb2YgdGhlIGZpbGUgbmFtZXMgaW4gUl9JREFUQSBpcyByZXF1aXJlZCBieSB0aGUKLSMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkbGx0b29sICh0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8KLSMgdXNlIGdyb3VwZWQgc2VjdGlvbnMgaW5zdGVhZCkuCi1pZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgotICBSX1RFWFQ9JyooU09SVCgudGV4dCQqKSknCi0gIFJfREFUQT0nKihTT1JUKC5kYXRhJCopKScKLSAgUl9SREFUQT0nKihTT1JUKC5yZGF0YSQqKSknCi0gIFJfSURBVEE9JwotICAgIFNPUlQoKikoLmlkYXRhJDIpCi0gICAgU09SVCgqKSguaWRhdGEkMykKLSAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCi0gICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOwotICAgIFNPUlQoKikoLmlkYXRhJDQpCi0gICAgU09SVCgqKSguaWRhdGEkNSkKLSAgICBTT1JUKCopKC5pZGF0YSQ2KQotICAgIFNPUlQoKikoLmlkYXRhJDcpJwotICBSX0NSVD0nKihTT1JUKC5DUlQkKikpJwotICBSX1JTUkM9JyooU09SVCgucnNyYyQqKSknCi1lbHNlCi0gIFJfVEVYVD0KLSAgUl9EQVRBPQotICBSX1JEQVRBPQotICBSX0lEQVRBPQotICBSX0NSVD0KLSAgUl9SU1JDPQotZmkKLQotY2F0IDw8RU9GCi0ke1JFTE9DQVRJTkcrT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KX0KLSR7UkVMT0NBVElORy1PVVRQVVRfRk9STUFUKCR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9KX0KLQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKF9tYWluQ1JUU3RhcnR1cCkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLQotICAgIC8qIEZvciBFUE9DIHRoZSByZWFkIG9ubHkgZGF0YSBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIC50ZXh0Ci0gICAgc2VjdGlvbiAqLwotICAgICooLnJkYXRhKQotICAgICR7Ul9SREFUQX0KLSAgICAqKC5laF9mcmFtZSkKLSAgfQotCi0gIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCi0gICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKLSAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKLSAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCi0gICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLwotCi0gIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTIpCi0gICAgJHtSX0RBVEF9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KLSAgfQotCi0gIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAuZWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLmVkYXRhKQotICB9Ci0KLSAgL0RJU0NBUkQvIDoKLSAgewotICAgICooLmRlYnVnXCRTKQotICAgICooLmRlYnVnXCRUKQotICAgICooLmRlYnVnXCRGKQotICAgICooLmRyZWN0dmUpCi0gIH0KLQotICAuaWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIFRoaXMgY2Fubm90IGN1cnJlbnRseSBiZSBoYW5kbGVkIHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4KLQlTZWUgcGUuZW06c29ydF9zZWN0aW9ucy4gICovCi0gICAgJHtSX0lEQVRBfQotICB9Ci0gIAotICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JfQ1JUfQotICB9Ci0KLSAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotICB9Ci0KLSAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yZWxvYykKLSAgfQotCi0gIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yc3JjKQotICAgICR7Ul9SU1JDfQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjg3NmUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKCJfc3RhcnQiKQotCi1NRU1PUlkKLXsKLQkvKiAweGM0IGlzIGEgbWFnaWMgZW50cnkuICBXZSBzaG91bGQgaGF2ZSB0aGUgbGlua2VyIGp1c3QKLQkgICBza2lwIG92ZXIgaXQgb25lIGRheS4uLiAqLwotCXZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotCW1hZ2ljdmVjdG9ycyA6IG8gPSAweGM0LCBsID0gMHgzYwotCXJhbSAgICA6IG8gPSAweDAxMDAsIGwgPSAweGZkZmMKLQkvKiBUaGUgc3RhY2sgc3RhcnRzIGF0IHRoZSB0b3Agb2YgbWFpbiByYW0uICAqLwotCXRvcHJhbSA6IG8gPSAweGZlZmMsIGwgPSAweDQKLQkvKiBBdCB0aGUgdmVyeSB0byBvZiB0aGUgYWRkcmVzcyBzcGFjZSBpcyB0aGUgOC1iaXQgYXJlYS4gICovCi0JZWlnaHQgOiBvID0gMHhmZjAwLCBsID0gMHgxMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgOiB7Ci0JLyogVXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gcGxhY2UgYSBzcGVjaWZpYyBmdW5jdGlvbidzIGFkZHJlc3MKLQkgICBpbnRvIHRoZSB2ZWN0b3IgdGFibGUuIAotCi0JU0hPUlQoQUJTT0xVVEUoX2Zvb2JhcikpICovCi0KLQkqKC52ZWN0b3JzKQotICAgICAgICB9ICR7UkVMT0NBVElORysgPiB2ZWN0b3JzfQotCi0udGV4dCA6CXsgCQkJCQkKLQkqKC5yb2RhdGEpIAkJCQkKLQkqKC50ZXh0KSAJCQkJCi0JKiguc3RyaW5ncykKLSAgIAkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLnRvcnMgOiB7Ci0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5kYXRhIDogewotCSooLmRhdGEpCi0JKigudGlueSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBoLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDBoLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNmZDg2Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwaC5zYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSChoODMwMGgpCi1FTlRSWSgiX3N0YXJ0IikKLQotLyogVGhlIG1lbW9yeSBzaXplIGlzIDI1NktCIHRvIGNvaW5jaWRlIHdpdGggdGhlIHNpbXVsYXRvci4KLSAgIERvbid0IGNoYW5nZSBlaXRoZXIgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3RoZXIuICAqLwotCi1NRU1PUlkKLXsKLSAgICAgICAgLyogMHhjNCBpcyBhIG1hZ2ljIGVudHJ5LiAgV2Ugc2hvdWxkIGhhdmUgdGhlIGxpbmtlciBqdXN0Ci0gICAgICAgICAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCi0gICAgICAgIHZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotICAgICAgICBtYWdpY3ZlY3RvcnMgOiBvID0gMHhjNCwgbCA9IDB4M2MKLQkvKiBXZSBzdGlsbCBvbmx5IHVzZSAyNTZrIGFzIHRoZSBtYWluIHJhbSBzaXplLiAgKi8KLQlyYW0gICAgOiBvID0gMHgwMTAwLCBsID0gMHgzZmVmYwotCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCi0JdG9wcmFtIDogbyA9IDB4M2ZmZmMsIGwgPSAweDQKLQkvKiBUaGlzIGhvbGRzIHZhcmlhYmxlcyBpbiB0aGUgInRpbnkiIHNlY3Rpb25zLiAgKi8KLQl0aW55ICAgOiBvID0gMHhmZjgwMDAsIGwgPSAweDdmMDAKLQkvKiBBdCB0aGUgdmVyeSB0b3Agb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIDgtYml0IGFyZWEuICAqLwotCWVpZ2h0ICA6IG8gPSAweGZmZmYwMCwgbCA9IDB4MTAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDogewotCS8qIFVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHBsYWNlIGEgc3BlY2lmaWMgZnVuY3Rpb24ncyBhZGRyZXNzCi0JICAgaW50byB0aGUgdmVjdG9yIHRhYmxlLgotCi0JTE9ORyhBQlNPTFVURShfZm9vYmFyKSkgKi8KLQotCSooLnZlY3RvcnMpCi0JfSAke1JFTE9DQVRJTkcrID4gdmVjdG9yc30KLS50ZXh0IDoJeyAJCQkJCQotCSooLnJvZGF0YSkgCQkJCQotCSooLnRleHQpIAkJCQkKLQkqKC5zdHJpbmdzKQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0udG9ycyA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmRhdGEgOiB7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0udGlueSA6IHsKLQkqKC50aW55KQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRpbnl9Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQ3NGZjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSChoODMwMHMpCi1FTlRSWSgiX3N0YXJ0IikKLQotLyogVGhlIG1lbW9yeSBzaXplIGlzIDI1NktCIHRvIGNvaW5jaWRlIHdpdGggdGhlIHNpbXVsYXRvci4KLSAgIERvbid0IGNoYW5nZSBlaXRoZXIgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3RoZXIuICAqLwotCi1NRU1PUlkKLXsKLSAgICAgICAgLyogMHhjNCBpcyBhIG1hZ2ljIGVudHJ5LiAgV2Ugc2hvdWxkIGhhdmUgdGhlIGxpbmtlciBqdXN0Ci0gICAgICAgICAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCi0gICAgICAgIHZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotICAgICAgICBtYWdpY3ZlY3RvcnMgOiBvID0gMHhjNCwgbCA9IDB4M2MKLQkvKiBXZSBzdGlsbCBvbmx5IHVzZSAyNTZrIGFzIHRoZSBtYWluIHJhbSBzaXplLiAgKi8KLQlyYW0gICAgOiBvID0gMHgwMTAwLCBsID0gMHgzZmVmYwotCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCi0JdG9wcmFtIDogbyA9IDB4M2ZmZmMsIGwgPSAweDQKLQkvKiBUaGlzIGhvbGRzIHZhcmlhYmxlcyBpbiB0aGUgInRpbnkiIHNlY3Rpb25zLiAgKi8KLQl0aW55ICAgOiBvID0gMHhmZjgwMDAsIGwgPSAweDdmMDAKLQkvKiBBdCB0aGUgdmVyeSB0b3Agb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIDgtYml0IGFyZWEuICAqLwotCWVpZ2h0ICA6IG8gPSAweGZmZmYwMCwgbCA9IDB4MTAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDogewotCS8qIFVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHBsYWNlIGEgc3BlY2lmaWMgZnVuY3Rpb24ncyBhZGRyZXNzCi0JICAgaW50byB0aGUgdmVjdG9yIHRhYmxlLgotCi0JTE9ORyhBQlNPTFVURShfZm9vYmFyKSkgKi8KLQotCSooLnZlY3RvcnMpCi0JfSAke1JFTE9DQVRJTkcrID4gdmVjdG9yc30KLS50ZXh0IDoJeyAJCQkJCQotCSooLnJvZGF0YSkgCQkJCQotCSooLnRleHQpIAkJCQkKLQkqKC5zdHJpbmdzKQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0udG9ycyA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmRhdGEgOiB7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0udGlueSA6IHsKLQkqKC50aW55KQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRpbnl9Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhMzllZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhIDY0ayB0b3RhbCAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MDAwMCB9IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0KLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0ucmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfQotCi0uc3RhY2sgICR7UkVMT0NBVElORysgMHhmZmYwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9IAotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGIuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMGIuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWZhMmMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBiLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvZGUgYW5kIGRhdGEsIGJvdGggbGFyZ2VyIHRoYW4gNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMH0gOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfQotCi0KLS5kYXRhICAke1JFTE9DQVRJTkcrIDB4MjAwMDB9IDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAKLQotLnJkYXRhICAke1JFTE9DQVRJTkcrIDB4MzAwMDB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAweDQwMDAwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9Ci0KLS5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweDUwMDAwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9IAotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODgwZTMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBjLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvbXBhY3QgbW9kZWwgLSBjb2RlIDwgNjRrLCBkYXRhID4gNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0IDB4MTAwMDAgOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0KLQotLmRhdGEgMHgyMDAwMCA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotLnJkYXRhIDB4MzAwMDAgIDogewotCSooLnJkYXRhKTsgCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAgJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotLmJzcyAgMHg0MDAwMCA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9ICR7UkVMT0NBVElORysgPnJhbX0KLS5zdGFjayAweDVmZmYwIDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBhNGE3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwbS5zYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhLCBib3RoIGxhcmdlciB0aGFuIDY0ayAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDB9IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9Ci0KLQotLmRhdGEgICR7UkVMT0NBVElORysgMHgyMDAwMH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0ucmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0gCi0KLS5ic3MgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4MmZmZjB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwcy5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2MTVkOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMHMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29kZSBhbmQgZGF0YSwgYm90aCA2NGsgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwIH0gOgotCXsgCQkJCQkKLQkqKC50ZXh0KSAJCQkJCi0gICAJJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotLnJkYXRhICAke1JFTE9DQVRJTkcrIDB4MjAwMDAgfSA6Ci0JewotCSooLnJkYXRhKTsgCi0JKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0uYnNzICAke1JFTE9DQVRJTkcrIC59IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4MmZmZjB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFjZTA4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1EQVRBX0FERFI9MHg0MDAwMDAwMAotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKCJcJFNUQVJUXCQiKQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDB4MTAwMCAke1JFTE9DQVRJTkcrKyR7VEVYVF9TVEFSVF9BRERSfX06Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX190ZXh0X3N0YXJ0ID0gLn07Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKiguUEFSSVNDLnN0dWJzKQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OwotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gLiArIDB4MTAwMCB9OwotICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnQgPSAufTsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrZWRhdGEgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhID0gLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn0gKyBTSVpFT0YoLmRhdGEpO30KLSAgLmJzcyA6Ci0gIHsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK2VuZCA9IC4gfTsKLSAgICR7UkVMT0NBVElORytfZW5kID0gLiB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZmZkZTEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBQRS4KLQotaWYgdGVzdCAteiAiJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0iOyB0aGVuCi0gIFJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWZpCi0KLSMgV2UgY2FuJ3QgZWFzaWx5IGFuZCBwb3J0YWJseSBnZXQgYW4gdW5xdW90ZWQgJCBpbiBhIHNoZWxsCi0jIHN1YnN0aXR1dGlvbiwgc28gd2UgZG8gdGhpcyBpbnN0ZWFkLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKC50ZXh0JCopJwotICBSX0RBVEE9JyooLmRhdGEkKiknCi0gIFJfUkRBVEE9JyooLnJkYXRhJCopJwotICBSX0lEQVRBPScKLSAgICAqKC5pZGF0YSQyKQotICAgICooLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICAqKC5pZGF0YSQ0KQotICAgICooLmlkYXRhJDUpCi0gICAgKiguaWRhdGEkNikKLSAgICAqKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooLkNSVCQqKScKLSAgUl9SU1JDPScqKC5yc3JjJCopJwotICBSX0VYQz0nKiguZXhjJCopJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLSAgUl9FWEM9Ci1maQotCi1jYXQgPDxFT0YKLSR7UkVMT0NBVElORytPVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pfQotJHtSRUxPQ0FUSU5HLU9VVFBVVF9GT1JNQVQoJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0pfQotCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoX19zdGFydCkKLSR7UkVMT0NBVElORytoZWFkZXIgPSAuO30KLSR7UkVMT0NBVElORytfX2ZsdHVzZWQgPSAuOyAvKiBzZXQgdXAgZmxvYXRpbmcgcHQgZm9yIE1TIC5vYmpcJ3MgKi99Ci0ke1JFTE9DQVRJTkcrX19sZHVzZWQgPSAuO30KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX3RleHRfc3RhcnRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX3RleHRfZW5kX18gPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLmJzcyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgIC8qIGxpbmsuZXhlIGFwcGFyZW50bHkgcHVsbHMgaW4gLm9iaidzIGJlY2F1c2Ugb2YgVU5ERUYgY29tbW9uCi0Jc3ltYm9scywgd2hpY2ggaXMgbm90IHRoZSBjb2ZmIHdheSwgYnV0IHRoYXQncyBNUyBmb3IgeW91LiAqLwotICAgICooLkNSVFwkWENBKQotICAgICooLkNSVFwkWENaKQotICAgICooLkNSVFwkWElBKQotICAgICooLkNSVFwkWElaKQotICAgICR7UkVMT0NBVElORytfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gIC5yZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKigucmRhdGEpCi0gICAgJHtSX1JEQVRBfQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0KLSAgLmVkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5lZGF0YSkKLSAgfQotCi0gIC9ESVNDQVJELyA6Ci0gIHsKLSAgICAqKC5kZWJ1Z1wkUykKLSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAqKC5kZWJ1Z1wkRikKLSAgICAqKC5kcmVjdHZlKQotICAgICooLmRlYnVnKikKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgJHtSX0NSVH0KLSAgfQotCi0gIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLSAgfQotCi0gIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucmVsb2MpCi0gIH0KLQotICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucnNyYykKLSAgICAke1JfUlNSQ30KLSAgfQotCi0gIC5leGMgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLmV4YykKLSAgICAke1JfRVhDfQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjFiNzkuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIDM4NiBDT0ZGLiAgVGhpcyB3b3JrcyBvbiBTVlIzLjIgYW5kIFNDTyBVbml4IDMuMi4yLgotIyBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HLSAke0lOSVR9fQotICAke1JFTE9DQVRJTkctICR7RklOSX19Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5N2ZkMy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgaTM4NiBnbzMyIChESkdQUCkKLQotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1zdGFydAotRVhFPSR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORystZXhlfX0KLQotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1DVE9SPScuY3RvciA6IHsgKiguY3RvcikgfScKLURUT1I9Jy5kdG9yIDogeyAqKC5kdG9yKSB9JwotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0ke0VYRX0iKQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAke1RBUkdFVF9QQUdFX1NJWkV9K1NJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UudCopfQotICAgICooLmNvbnN0KikKLSAgICAqKC5ybyopCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5yKil9Ci0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ICA9ICAuIDsgX2V0ZXh0ID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke1NFR01FTlRfU0laRX0pO30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrICR7REFUQV9BTElHTk1FTlR9fSA6IHsKLSAgICAke1JFTE9DQVRJTkcrZGpncHBfZmlyc3RfY3RvciA9IC4gOwotICAgICooLmN0b3IpCi0gICAgZGpncHBfbGFzdF9jdG9yID0gLiA7fQotICAgICR7UkVMT0NBVElORytkamdwcF9maXJzdF9kdG9yID0gLiA7Ci0gICAgKiguZHRvcikKLSAgICBkamdwcF9sYXN0X2R0b3IgPSAuIDt9Ci0gICAgKiguZGF0YSkKLQotICAgICR7UkVMT0NBVElORysqKC5nY2NfZXhjKil9Ci0gICAgJHtSRUxPQ0FUSU5HK19fX0VIX0ZSQU1FX0JFR0lOX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmVoX2ZyYW0qKX0KLSAgICAke1JFTE9DQVRJTkcrX19fRUhfRlJBTUVfRU5EX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HK0xPTkcoMCk7fQotCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5kKil9Ci0gICAgJHtSRUxPQ0FUSU5HK2VkYXRhICA9ICAuIDsgX2VkYXRhID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke1NFR01FTlRfU0laRX0pO30KLSAgfQotICAke0NPTlNUUlVDVElORyske1JFTE9DQVRJTkctJENUT1J9fQotICAke0NPTlNUUlVDVElORyske1JFTE9DQVRJTkctJERUT1J9fQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuIDsgX2VuZCA9IC59OwotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKCR7U0VHTUVOVF9TSVpFfSk7fQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZseW54LnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjcyYTQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzEyZTcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KLSAgfQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC59OwotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYyBiL2xkL3NjcmlwdHRlbXBsL2k5NjAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzM1NTUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLWNhdCA8PEVPRgotU0VDVElPTlMKLXsgCi0gICAgLnRleHQgOiAKLSAgICB7IAotCSR7R0xEX1NUWUxFKyBDUkVBVEVfT0JKRUNUX1NZTUJPTFN9Ci0JKigudGV4dCkgCi0JJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAufTsKLQkke0NPTlNUUlVDVElORyske0NPRkZfQ1RPUlN9fQotICAgIH0gIAotICAgIC5kYXRhIDoKLSAgICB7IAotIAkqKC5kYXRhKSAKLQkke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAufTsKLSAgICB9ICAKLSAgICAuYnNzIDoKLSAgICB7IAotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC59OwotCSooLmJzcykJIAotCSooQ09NTU9OKSAKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAufTsKLSAgICB9IAotfSAKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyBiL2xkL3NjcmlwdHRlbXBsL202OGthdXguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDI4MGUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgQS9VWC4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotQ1RPUlM9Jy5jdG9ycyA6IHsgKiguY3RvcnMpIH0nCi1EVE9SUz0nLmR0b3JzIDogeyAqKC5kdG9ycykgfScKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAkVEVYVF9TVEFSVF9BRERSfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTig0KTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLjt9Ci0gIH0gPTB4NEU3MTRFNzEKLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAkREFUQV9BTElHTk1FTlR9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLjt9Ci0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgfQotICAke1JFTE9DQVRJTkctICR7SU5JVH19Ci0gICR7UkVMT0NBVElORy0gJHtGSU5JfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0NUT1JTfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0RUT1JTfX0KLQotICAuY29tbWVudCAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLmNvbW1lbnQgXSBbIC5pZGVudCBdIH0KLSAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyBbIC5zdGFiIF0gfQotICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLnN0YWJzdHIgXSB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjhjNmYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci1QUk9WSURFIChfX3N0YWNrID0gMCk7IAotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwMDB9IDogewotICAgICooLnRleHQpCi0gICAgJHtDT05TVFJVQ1RJTkcrIC4gPSBBTElHTig0KTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gIH0KLSAgLmRhdGEgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzIDogeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgICR7UkVMT0NBVElORysgZW5kID0gQUxJR04oMHg4KX07Ci0gICAgICR7UkVMT0NBVElORysgX2VuZCA9IEFMSUdOKDB4OCl9OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMjI0NS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhIC5kYXRhMikKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJiMTRkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL204OGtiY3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKF9fc3RhcnQpCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0gIC50ZXh0ICR7UkVMT0NBVElORysgKDB4MjAwMDcgKyBTSVpFT0ZfSEVBREVSUykgJn4gN30gOgotICAgIHsKLSAgICAgICR7UkVMT0NBVElORysgX18udGV4dC5zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0LnN0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0LmVuZCA9IC59OwotICAgICAgKigudGV4dCkgCQkJCQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZGVzY19zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyAqKC50ZGVzYyl9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHRfZW5kID0gLn0JOwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0cC5zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0cC5lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgX18uZmluaV9zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKSB9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmZpbmlfZW5kID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07Ci0gICAgfSAgCQkJCQkKLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyBORVhUICgweDQwMDAwMCkgKyAoKFNJWkVPRigudGV4dCkgKyBBRERSKC50ZXh0KSkgJSAweDIwMDApfSA6Ci0gICAgeyAJCQkJCQotICAgICAgKiguZGF0YSkKLSAgICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC59OwotICAgIH0gIAkJCQkJCi0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgICB7IAkJCi0gICAgICAqKC5ic3MpCQotICAgICAgKihDT01NT04pIAkKLSAgICAgICR7UkVMT0NBVElORysgX2VuZCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IC59OwotICAgIH0KLSAgJHtSRUxPQ0FUSU5HLSAke0lOSVR9fQotICAke1JFTE9DQVRJTkctICR7RklOSX19Ci0gIC5jb21tZW50ICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgICooLmNvbW1lbnQpCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYyBiL2xkL3NjcmlwdHRlbXBsL21jb3JlcGUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOTI4YWEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIE1Db3JlIFBFLgotCi1pZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KLSAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotZmkKLQotIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKLSMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCi0jIFNvcnRpbmcgb2YgdGhlIC5mb28kKiBzZWN0aW9ucyBpcyByZXF1aXJlZCBieSB0aGUgZGVmaW5pdGlvbiBvZgotIyBncm91cGVkIHNlY3Rpb25zIGluIFBFLgotIyBTb3J0aW5nIG9mIHRoZSBmaWxlIG5hbWVzIGluIFJfSURBVEEgaXMgcmVxdWlyZWQgYnkgdGhlCi0jIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGxsdG9vbCAodGhpcyBjb3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvCi0jIHVzZSBncm91cGVkIHNlY3Rpb25zIGluc3RlYWQpLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKFNPUlQoLnRleHQkKikpJwotICBSX0RBVEE9JyooU09SVCguZGF0YSQqKSknCi0gIFJfUkRBVEE9JyooU09SVCgucmRhdGEkKikpJwotICBSX0lEQVRBPScKLSAgICBTT1JUKCopKC5pZGF0YSQyKQotICAgIFNPUlQoKikoLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICBTT1JUKCopKC5pZGF0YSQ0KQotICAgIFNPUlQoKikoLmlkYXRhJDUpCi0gICAgU09SVCgqKSguaWRhdGEkNikKLSAgICBTT1JUKCopKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooU09SVCguQ1JUJCopKScKLSAgUl9SU1JDPScqKFNPUlQoLnJzcmMkKikpJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLWZpCi0KLWlmIHRlc3QgIiRSRUxPQ0FUSU5HIjsgdGhlbgotICAjIENhbid0IHVzZSAke1JFTE9DQVRJTkcrYmxhaCAiYmxhaCIgYmxhaH0gZm9yIHRoaXMsCi0gICMgYmVjYXVzZSBiYXNoIDIueCB3aWxsIGxvc2UgdGhlIGRvdWJsZXF1b3Rlcy4KLSAgY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgIAkgICAgICAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1FT0YKLWZpCi0KLWNhdCA8PEVPRgotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKF9tYWluQ1JUU3RhcnR1cCkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLSAgfQotCi0gIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCi0gICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKLSAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKLSAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCi0gICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLwotCi0gIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTIpCi0gICAgJHtSX0RBVEF9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KLSAgfQotCi0gIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAucmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLnJkYXRhKQotICAgICR7Ul9SREFUQX0KLSAgICAqKC5laF9mcmFtZSkKLSAgfQotCi0gIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKiguZWRhdGEpCi0gIH0KLQotICAvRElTQ0FSRC8gOgotICB7Ci0gICAgKiguZGVidWdcJFMpCi0gICAgKiguZGVidWdcJFQpCi0gICAgKiguZGVidWdcJEYpCi0gICAgKiguZHJlY3R2ZSkKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgJHtSX0NSVH0KLSAgfQotCi0gIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLSAgfQotCi0gIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucmVsb2MpCi0gIH0KLQotICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucnNyYykKLSAgICAke1JfUlNSQ30KLSAgfQotCi0gIC5zdGFiICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0KLSAgLnN0YWJzdHIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLQotICAuc3RhY2sgMHg4MDAwMCA6Ci0gIHsKLSAgICBfc3RhY2sgPSAuOwotICAgICooLnN0YWNrKQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9taXBzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjBhZWVkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIE1JUFMgc3lzdGVtcy4KLSMgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotIyBUaGVzZSB2YXJpYWJsZXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGVtdWxhdGlvbiBmaWxlLiAgVGhlCi0jIGRlZmF1bHRzIGFyZSBhcHByb3ByaWF0ZSBmb3IgYSBERUNzdGF0aW9uIHJ1bm5pbmcgVWx0cml4LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fX3N0YXJ0Ci0KLWlmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgotICB0ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4NDAwMDAwICsgU0laRU9GX0hFQURFUlMiCi1lbHNlCi0gIHRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHg0MDAwMDAiCi1maQotaWYgdGVzdCAieCRMRF9GTEFHIiA9ICJ4biIgLW8gIngkTERfRkxBRyIgPSAieE4iOyB0aGVuCi0gIERBVEFfQUREUj0uCi1lbHNlCi0gIHRlc3QgLXogIiREQVRBX0FERFIiICYmIERBVEFfQUREUj0weDEwMDAwMDAwCi1maQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDogewotICAgICR7UkVMT0NBVElORysgX2Z0ZXh0ID0gLiB9OwotICAgICooLmluaXQpCi0gICAgJHtSRUxPQ0FUSU5HKyBlcHJvbCAgPSAgLn07Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7fQotICAgICooLnJlbC5zZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0b3AgPSAuKTt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn07fQotICAucmRhdGEgOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZmRhdGEgPSBBTElHTigxNik7fQotICAuZGF0YSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAke1JFTE9DQVRJTkcrIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDt9Ci0gIC5saXQ4IDogewotICAgICooLmxpdDgpCi0gIH0KLSAgLmxpdDQgOiB7Ci0gICAgKigubGl0NCkKLSAgfQotICAuc2RhdGEgOiB7Ci0gICAgKiguc2RhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZmJzcyA9IC47fQotICAuc2JzcyA6IHsKLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgYi9sZC9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjIyYjMzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzIDoKLSAgewotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrZW5kID0gLiB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL253LnNjIGIvbGQvc2NyaXB0dGVtcGwvbncuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTUyMmMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbncuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLmN0b3JzIC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCi0jCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCi0jCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQotIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS50ZXh0IHNlY3Rpb24uCi0jCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmRhdGEgc2VjdGlvbi4KLSMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgotIwlEQVRBX1BMVCAtIC5wbHQgc2hvdWxkIGJlIGluIGRhdGEgc2VnbWVudCwgbm90IHRleHQgc2VnbWVudC4KLSMKLSMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAotIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCi0jCi10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgotSU5URVJQPSIuaW50ZXJwICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIAl9IgotUExUPSIucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucGx0KQl9IgotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9IFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCLSR7SU5URVJQfX0KLSAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbml0KQl9ID0ke05PUC0wfQotICAke0RBVEFfUExULSR7UExUfX0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319Ci0gICAgKigudGV4dCkKLSAgICAke0NPTlNUUlVDVElORysJX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysJKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysJX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysJKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0RUT1JfRU5EX18gPSAuO30KLSAgfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5maW5pKSAgICB9ID0ke05PUC0wfQotICAuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kdG9ycykgICB9Ci0gIC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSAgfQotICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLSBBTElHTig4KSArICR7TUFYUEFHRVNJWkV9fTt9Ci0gIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQotICAuZ290ICAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfQotICAke0RBVEFfUExUKyR7UExUfX0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IC47fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4KLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KLSAgJHtPVEhFUl9TRUNUSU9OU30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9wZS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxYmFiZC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9wZS5zYworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFBFLgotCi1pZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KLSAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotZmkKLQotIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKLSMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCi0jIFNvcnRpbmcgb2YgdGhlIC5mb28kKiBzZWN0aW9ucyBpcyByZXF1aXJlZCBieSB0aGUgZGVmaW5pdGlvbiBvZgotIyBncm91cGVkIHNlY3Rpb25zIGluIFBFLgotIyBTb3J0aW5nIG9mIHRoZSBmaWxlIG5hbWVzIGluIFJfSURBVEEgaXMgcmVxdWlyZWQgYnkgdGhlCi0jIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGxsdG9vbCAodGhpcyBjb3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvCi0jIHVzZSBncm91cGVkIHNlY3Rpb25zIGluc3RlYWQpLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKFNPUlQoLnRleHQkKikpJwotICBSX0RBVEE9JyooU09SVCguZGF0YSQqKSknCi0gIFJfUkRBVEE9JyooU09SVCgucmRhdGEkKikpJwotICBSX0lEQVRBPScKLSAgICBTT1JUKCopKC5pZGF0YSQyKQotICAgIFNPUlQoKikoLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICBTT1JUKCopKC5pZGF0YSQ0KQotICAgIFNPUlQoKikoLmlkYXRhJDUpCi0gICAgU09SVCgqKSguaWRhdGEkNikKLSAgICBTT1JUKCopKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooU09SVCguQ1JUJCopKScKLSAgUl9SU1JDPScqKFNPUlQoLnJzcmMkKikpJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLWZpCi0KLWNhdCA8PEVPRgotJHtSRUxPQ0FUSU5HK09VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSl9Ci0ke1JFTE9DQVRJTkctT1VUUFVUX0ZPUk1BVCgke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSl9Ci0ke09VVFBVVF9BUkNIK09VVFBVVF9BUkNIKCR7T1VUUFVUX0FSQ0h9KX0KLQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JfVEVYVH0KLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KLSAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLnJkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5yZGF0YSkKLSAgICAke1JfUkRBVEF9Ci0gICAgKiguZWhfZnJhbWUpCi0gIH0KLQotICAuYnNzICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX2VuZF9fID0gLiA7fQotICB9Ci0KLSAgLmVkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5lZGF0YSkKLSAgfQotCi0gIC9ESVNDQVJELyA6Ci0gIHsKLSAgICAqKC5kZWJ1Z1wkUykKLSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAqKC5kZWJ1Z1wkRikKLSAgICAqKC5kcmVjdHZlKQotICB9Ci0KLSAgLmlkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBUaGlzIGNhbm5vdCBjdXJyZW50bHkgYmUgaGFuZGxlZCB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuCi0JU2VlIHBlLmVtOnNvcnRfc2VjdGlvbnMuICAqLwotICAgICR7Ul9JREFUQX0KLSAgfQotICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JfQ1JUfQotICB9Ci0KLSAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotICB9Ci0KLSAgLnJzcmMgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJzcmMpCi0gICAgJHtSX1JTUkN9Ci0gIH0KLQotICAucmVsb2MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJlbG9jKQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3BqLnNjIGIvbGQvc2NyaXB0dGVtcGwvcGouc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTgxYTUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvcGouc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1UT1JTPSIudG9ycyA6Ci0gIHsKLSAgICBfX19jdG9ycyA9IC4gOwotICAgICooLmN0b3JzKQotICAgIF9fX2N0b3JzX2VuZCA9IC4gOwotICAgIF9fX2R0b3JzID0gLiA7Ci0gICAgKiguZHRvcnMpCi0gICAgX19fZHRvcnNfZW5kID0gLiA7Ci0gIH0gPiByYW0iCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi1NRU1PUlkKLXsKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMk0KLX0KLQotU0VDVElPTlMKLXsKLSAgLnRleHQgOgotICB7Ci0gICAgKigudGV4dCkKLSAgICAqKC5zdHJpbmdzKQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAke0NPTlNUUlVDVElORyske1RPUlN9fQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuYnNzIDoKLSAgewotICAgICR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gOyB9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5zdGFjayAke1JFTE9DQVRJTkcrIDB4MzAwMDAgfSAgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotICAgICooLnN0YWNrKQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICAqKC5zdGFiKQotICB9Ci0gIC5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICAqKC5zdGFic3RyKQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3BwY3BlLnNjIGIvbGQvc2NyaXB0dGVtcGwvcHBjcGUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZmJlMzMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvcHBjcGUuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotIyBBIFBFIGxpbmtlciBzY3JpcHQgZm9yIFBvd2VyUEMuCi0jIExvb3NlbHkgYmFzZWQgb24gU3RldmUgQ2hhbWJlcmxhaW4ncyBwZS5zYy4KLSMgQWxsIG5ldyBtaXN0YWtlcyBzaG91bGQgYmUgY3JlZGl0ZWQgdG8gS2ltIEtudXR0aWxhIChrcmtAY3lnbnVzLmNvbSkKLSMKLSMgVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGluIGFzIHZhcmlhYmxlcyBpbiBvcmRlciB0byBnZXQgJ30nIGluIGEgc2hlbGwKLSMgY29uZGl0aW9uYWwgZXhwYW5zaW9uLgotSU5JVD0nLmluaXQgOiB7ICooLmluaXQpIH0nCi1GSU5JPScuZmluaSA6IHsgKiguZmluaSkgfScKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLS8qIE11Y2ggb2YgdGhpcyBsYXlvdXQgd2FzIGRldGVybWluZWQgYnkgZGVsdmluZyBpbnRvIC5leGUgZmlsZXMgZm9yCi0gICB0aGUgYm94IGdlbmVyYXRlZCBieSBvdGhlciBjb21waWxlcnMvbGlua2Vycy9ldGMuIFRoaXMgbWVhbnMgdGhhdAotICAgaWYgYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZGlkIG5vdCBoYXBwZW4gdG8gYXBwZWFyIGluIG9uZSBvZiB0aGUgCi0gICBzdWJqZWN0IGZpbGVzLCB0aGVuIGl0IG1heSBub3QgYmUgeWV0IHN1cHBvcnRlZC4KLSovCi0KLS8qIEl0J3MgIm1haW5DUlRTdGFydHVwIiwgbm90ICJfbWFpbkNSVFN0YXJ0dXAiLCBhbmQgaXQncyBsb2NhdGVkIGluCi0gICBvbmUgb2YgdGhlIHR3byAubGliIGZpbGVzIChsaWJjLmxpYiBhbmQga2VybmVsMzIubGliKSB0aGF0IGN1cnJlbnRseQotICAgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBsaW5rIGxpbmUuIFRoaXMgbWVhbnMgdGhhdCB5b3UgbXVzdCB1c2UgCi0gICAiLXUgbWFpbkNSVFN0YXJ0dXAiIHRvIG1ha2Ugc3VyZSBpdCBnZXRzIGluY2x1ZGVkIGluIHRoZSBsaW5rLgotKi8KLQotRU5UUlkobWFpbkNSVFN0YXJ0dXApCi0KLVNFQ1RJT05TCi17Ci0KLSAgLyogdGV4dCAtIHRoZSB1c3VhbCBtZWFuaW5nICovCi0gIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAotCXsKLQkgICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KTt9Ci0JICAgICooLnRleHQpCi0JICAgICooLmdjY19leGNlcHRfdGFibGUpCi0JICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCSAgICAgICAgTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICAgICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0JICAgICR7UkVMT0NBVElORysgKiguZmluaSk7fQotCSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLQl9Ci0KLSAgLyogcmRhdGEgLSBSZWFkIE9ubHkgUnVudGltZSBEYXRhCi0gICAgIENUUiBzZWN0aW9uczogQWxsIG9mIHRoZSBDUlQgKHJlYWQgb25seSBDIHJ1bnRpbWUgZGF0YSkgc2VjdGlvbnMgCi0JYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUgLnJkYXRhIChyZWFkIG9ubHkgcnVudGltZSBkYXRhKSAKLQlzZWN0aW9uLCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyLiBEb24ndCBrbm93IGlmIGl0IG1hdHRlcnMgb3Igbm90LgotCU5vdCBhbGwgc2VjdGlvbnMgYXJlIGFsd2F5cyBwcmVzZW50IGVpdGhlci4KLSAgICAgLnJkYXRhOiBjb21waWxlciBnZW5lcmF0ZWQgcmVhZCBvbmx5IGRhdGEKLSAgICAgLnhkYXRhOiBjb21waWxlciBnZW5lcmF0ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlLiAoTW9zdCBkb2NzCi0Jc2VlbSB0byBzdWdnZXN0IHRoYXQgdGhpcyBzZWN0aW9uIGlzIG5vdyBkZXByZWNhdGVkIGluZmF2b3IKLQlvZiB0aGUgeWRhdGEgc2VjdGlvbikKLSAgICAgLmVkYXRhOiBUaGUgZXhwb3J0ZWQgbmFtZXMgdGFibGUuCi0gICovCi0gIC5yZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7Ci0JICAgICooLkNSVFwkWENBKTsKLQkgICAgKiguQ1JUXCRYQ0MpOwotCSAgICAqKC5DUlRcJFhDWik7Ci0JICAgICooLkNSVFwkWElBKTsKLQkgICAgKiguQ1JUXCRYSUMpOwotCSAgICAqKC5DUlRcJFhJWik7Ci0JICAgICooLkNSVFwkWExBKTsKLQkgICAgKiguQ1JUXCRYTFopOwotCSAgICAqKC5DUlRcJFhQQSk7Ci0JICAgICooLkNSVFwkWFBYKTsKLQkgICAgKiguQ1JUXCRYUFopOwotCSAgICAqKC5DUlRcJFhUQSk7Ci0JICAgICooLkNSVFwkWFRaKTsKLQkgICAgKigucmRhdGEpOwotCSAgICAqKC54ZGF0YSk7Ci0JfQotCi0gIC5lZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7Ci0gICAgCSAgICAqKC5lZGF0YSk7Ci0JfQotCi0gIC8qIGRhdGEgLSBpbml0aWFsaXplZCBkYXRhCi0gICAgIC55ZGF0YTogZXhjZXB0aW9uIGhhbmRsaW5nIGluZm9ybWF0aW9uLgotICAgICAuZGF0YTogdGhlIHVzdWFsIG1lYW5pbmcuCi0gICAgIC5kYXRhMjogbW9yZSBvZiB0aGUgc2FtZS4KLSAgICAgLmJzczogRm9yIHNvbWUgcmVhc29uLCBic3MgYXBwZWFycyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YQotCXNlY3Rpb24sIGFzIG9wcG9zZWQgdG8gYmVpbmcgZ2l2ZW4gYSBzZWN0aW9uIG9mIGl0J3Mgb3duLgotICAgICBDT01NT046Ci0gICovCi0gIC5kYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOiAKLQl7Ci0JICAgIF9fZGF0YV9zdGFydF9fID0gLiA7IAotCSAgICAqKC55ZGF0YSk7Ci0JICAgICooLmRhdGEpOwotCSAgICAqKC5kYXRhMik7Ci0JICAgIF9fYnNzX3N0YXJ0X18gPSAuIDsKLQkgICAgKiguYnNzKSA7Ci0JICAgICooQ09NTU9OKTsKLQkgICAgX19ic3NfZW5kX18gPSAuIDsKLQkgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAgLn07Ci0gCSAgICBfX2RhdGFfZW5kX18gPSAuIDsgCi0JfQotCi0gIC8qIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgdGFibGUuIEEgc2VxdWVuY2Ugb2YgNSB3b3JkIGVudHJpZXMuIFNlY3Rpb24KLSAgICAgYWRkcmVzcyBhbmQgZXh0ZW50IGFyZSBwbGFjZWQgaW4gdGhlIERhdGFEaXJlY3RvcnkuCi0gICovCi0gIC5wZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgICooLnBkYXRhKQotIAkgICAgOwotCX0KLQotICAvKiBUaGUgaWRhdGEgc2VjdGlvbiBpcyBjaG9jayBmdWxsIG9mIG1hZ2ljIGJpdHMuIAotCTEuIEJvdW5kYXJpZXMgYXJvdW5kIHZhcmlvdXMgaWRhdGEgcGFydHMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZQotCSAgIHNvbWUgb2YgdGhlIGZpZWxkcyBvZiB0aGUgRGF0YURpcmVjdG9yeS4gSW4gcGFydGljdWxhciwgdGhlCi0JICAgbWFnaWMgZm9yIDIsIDQgYW5kIDUgYXJlIGtub3duIHRvIGJlIHVzZWQuIFNvbWUgY29tcGlsZXJzCi0JICAgYXBwZWFyIHRvIGdlbmVyYXRlIG1hZ2ljIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhpcyBwdXJwb3NlLgotCSAgIFdoZXJlIHdlIGNhbiwgd2UgY2F0Y2ggc3VjaCBzeW1ib2xzIGFuZCB1c2Ugb3VyIG93bi4gVGhpcyBvZgotCSAgIGNvdXJzZSBpcyBzb21ldGhpbmcgbGVzcyB0aGFuIGEgcGVyZmVjdCBzdHJhdGVneS4KLQkyLiBUaGUgdGFibGUgb2YgY29udGVudHMgaXMgcGxhY2VkIGltbWVkaWF0ZWx5IGFmdGVyIGlkYXRhNC4KLQkgICBUaGUgIi5wcml2YXRlLnRvYyIgc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgcHBjIGJmZC4gVGhlCi0JICAgLnRvYyB2YXJpYWJsZSBpcyBnZW5lcmF0ZWQgYnkgZ2FzLCBhbmQgcmVzb2x2ZWQgaGVyZS4gSXQgaXMKLQkgICB1c2VkIHRvIGluaXRpYWxpemVkIGZ1bmN0aW9uIGRlc2NyaXB0b3JzIChhbmQgYW55b25lIGVsc2Ugd2hvCi0JICAgbmVlZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1vZHVsZSdzIHRvYykuIFRoZSBvbmx5IHRoaW5nIAotCSAgIGludGVyZXN0aW5nIGFib3V0IGl0IGF0IGFsbD8gTW9zdCBwcGMgaW5zdHJ1Y3Rpb25zIHVzaW5nIGl0Ci0JICAgaGF2ZSBhIDE2Yml0IGRpc3BsYWNlbWVudCBmaWVsZC4gVGhlIGNvbnZlbnRpb24gZm9yIGFkZHJlc3NpbmcKLQkgICBpcyB0byBpbml0aWFsaXplIHRoZSAudG9jIHZhbHVlIHRvIDMySyBwYXN0IHRoZSBzdGFydCBvZiB0aGUKLQkgICBhY3R1YWwgdG9jLCBhbmQgc3VidHJhY3QgMzJLIGZyb20gYWxsIHJlZmVyZW5jZXMsIHRodXMgdXNpbmcKLQkgICB0aGUgZW50aXJlIDY0SyByYW5nZS4gTmF0dXJhbGx5LCB0aGUgcmVsb2MgY29kZSBtdXN0IGFncmVlCi0JICAgb24gdGhpcyBudW1iZXIgb3IgeW91IGdldCBwcmV0dHkgc3R1cGlkIHJlc3VsdHMuCi0gICovCi0gIC5pZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgIF9faWRhdGEyX21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkMik7Ci0JICAgIF9faWRhdGEzX21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkMyk7Ci0JICAgIF9faWRhdGE0X21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkNCk7Ci0JICAgIC4gPSBBTElHTig0KTsKLQkgICAgLnRvYyA9IC4gKyAzMjc2ODsKLQkgICAgKigucHJpdmF0ZS50b2MpOwotCSAgICBfX2lkYXRhNV9tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDUpOwotCSAgICBfX2lkYXRhNl9tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDYpOwotCSAgICBfX2lkYXRhN19tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDcpOwotCSAgICA7Ci0JfQotCi0gIC8qIHJlbGRhdGEgLS0gZGF0YSB0aGF0IHJlcXVpcmVzIHJlbG9jYXRpb24KLSAgKi8KLSAgLnJlbGRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICAqKC5yZWxkYXRhKQotIAkgICAgOwotCX0KLQotCi0gIC8qIFJlc291cmNlcyAqLwotICAucnNyYyBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgICooLnJzcmNcJDAxKQotCSAgICAqKC5yc3JjXCQwMikKLQkgICAgOwotCX0KLQotICAuc3RhYiBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pICAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotCi0gIC5zdGFic3RyIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotCi0gIC8qIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBjdXJyZW50bHkgZ2VuZXJhdGVkIGJ5IHRoZSBkbGx0b29sIGZyb20gU3RldmUgCi0gICAgIENoYW1iZXJsYWluIGluIGEgc2Vjb25kIHBhc3Mgb2YgbGlua2luZy4gU2VjdGlvbiBhZGRyZXNzIGFuZCBleHRlbnQKLSAgICAgYXJlIHBsYWNlZCBpbiB0aGUgRGF0YURpcmVjdG9yeS4KLSAgKi8KLSAgLnJlbG9jIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgKigucmVsb2MpCi0JICAgIDsKLQl9Ci0KLSAgLyogV2UgZG9uJ3QgZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggY29kZXZpZXcgZGVidWdnZXIgc3VwcG9ydCBvciB0aGUKLSAgICAgZGlyZWN0aXZlIHNlY3Rpb24gKHlldCkuIEhvcGVmdWxseSwgd2UganVuayB0aGVtIGNvcnJlY3RseS4gCi0gICovCi0gIC9ESVNDQVJELyBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDogCi0JewotICAgIAkgICAgKiguZGVidWdcJFMpCi0gICAgCSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAJICAgICooLmRlYnVnXCRGKQotICAgIAkgICAgKiguZHJlY3R2ZSkKLSAgICAJICAgIDsKLSAgIAl9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3Bzb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9wc29zLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjhjNmM3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3Bzb3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSkKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkc6LTB9ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDogewotICAgICR7UkVMT0NBVElORysgc3RhcnQgPSBERUZJTkVEKF9TVEFSVCkgPyBfU1RBUlQgOiBERUZJTkVEKF9zdGFydCkgPyBfc3RhcnQgOiAuO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX190ZXh0ID0gLik7fQotICAgICooLnRleHQpOwotICAgICooY29kZSk7Ci0gICAgKihjb25zdCk7Ci0gICAgKihzdHJpbmdzKTsKLSAgICAqKHBTT1MpOwotICAgICoocFJPQkUpOwotICAgICoocE5BKTsKLSAgICAqKHBISUxFKTsKLSAgICAqKHBSRVBDKTsKLSAgICAqKHBSUEMpOwotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCk7fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMik7fQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyk7fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2V0ZXh0ID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfZXRleHQgPSAuKTt9Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HOi0wfSA6ICR7UkVMT0NBVElORysgQVQoQUREUigudGV4dCkgKyBTSVpFT0YoLnRleHQpKX0gewotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2RhdGEgPSAuKTt9Ci0gICAgKiguZGF0YSk7Ci0gICAgKih2YXJzKTsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19lZGF0YSA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX2VkYXRhID0gLik7fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HOi0wfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19ic3MgPSAuKTt9Ci0gICAgKiguYnNzKTsKLSAgICAqKHplcm92YXJzKTsKLSAgICAqKENPTU1PTik7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZWJzcyA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19lbmQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9lbmQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9GcmVlTWVtU3RhcnQgPSAuKTt9Ci0gIH0KLSAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICAqKC5zdGFiKTsKLSAgfQotICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgKiguc3RhYnN0cik7Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcmlzY2l4LnNjIGIvbGQvc2NyaXB0dGVtcGwvcmlzY2l4LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODAxYTBjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3Jpc2NpeC5zYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HK19fRFlOQU1JQyAgPSAgMDt9Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLSR7U0hMSUJfUEFUSCske1JFTE9DQVRJTkcrJHtTSExJQl9QQVRIfX19Ci1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fToKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLnRleHQpCi0gICAgJHtQQURfVEVYVCske1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O319Ci0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgfQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HKyR7REFUQV9BTElHTk1FTlR9fSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSA9ICAuO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORytTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrX2VuZCA9IEFMSUdOKDQpIH07Ci0gICAke1JFTE9DQVRJTkcrX19lbmQgPSBBTElHTig0KSB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmYyNjdlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotRU5UUlkoc3RhcnQpCi0KLVNFQ1RJT05TIHsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiAKLSAgICB7Ci0JKigudGV4dCk7Ci0JKigudGV4dDEpOwotCSooLnRleHQyKTsKLQkke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07Ci0gICAgfQotICAubGl0IEFMSUdOKDQpIDoKLSAgIHsKLQkqKC5saXQpOwotCSR7UkVMT0NBVElORytfZWxpdCA9IC59OwotICAgfQotICAuZGF0YSBBTElHTig0KSA6Ci0gICAgewotCSooLmRhdGEpOwotCSooLmRhdGExKTsKLQkqKC5kYXRhMik7Ci0JJHtSRUxPQ0FUSU5HK19lZGF0YSA9IC59OwotCSR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLQkke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLQkke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLQkke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotCSR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotCSR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0JJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0JJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0JJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLQkke0NPTlNUUlVDVElORysgTE9ORygwKX0KLQkke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgIH0KLQotICAuYnNzICBBTElHTig0KSA6Ci0gICAgeyAKLQkqKENPTU1PTikgCQotCSooLmJzcykKLQkke1JFTE9DQVRJTkcrX2VuZCA9IC59OwotICAgIH0gCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NoLnNjIGIvbGQvc2NyaXB0dGVtcGwvc2guc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNmRkMjEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc2guc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1UT1JTPSIudG9ycyA6Ci0gIHsKLSAgICBfX19jdG9ycyA9IC4gOwotICAgICooLmN0b3JzKQotICAgIF9fX2N0b3JzX2VuZCA9IC4gOwotICAgIF9fX2R0b3JzID0gLiA7Ci0gICAgKiguZHRvcnMpCi0gICAgX19fZHRvcnNfZW5kID0gLiA7Ci0gIH0gPiByYW0iCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi1NRU1PUlkKLXsKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmsKLX0KLQotU0VDVElPTlMKLXsKLSAgLnRleHQgOgotICB7Ci0gICAgKigudGV4dCkKLSAgICAqKC5zdHJpbmdzKQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAke0NPTlNUUlVDVElORyske1RPUlN9fQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuYnNzIDoKLSAgewotICAgICR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gOyB9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5zdGFjayAke1JFTE9DQVRJTkcrIDB4MzAwMDAgfSAgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotICAgICooLnN0YWNrKQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICAqKC5zdGFiKQotICB9Ci0gIC5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICAqKC5zdGFic3RyKQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJiN2FkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgU3BhcmMgQ09GRi4KLSMgQmFzZWQgb24gaTM4NmNvZmYuc2MgYnkgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogewotICAgICooLmluaXQpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MgYi9sZC9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjFlMWQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBTcGFyYyBMeW54T1MuCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3N0MjAwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL3N0MjAwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlMTMyYS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCSAgKiguc3RyaW5ncykKLSAgIAkgIF9ldGV4dCA9IC47Ci0JKiguZGF0YSkKLQlfZWRhdGEgPSAuOwotCSooLmJzcykKLQkqKENPTU1PTikKLQkgX2VuZCA9IC47Ci0KLX0KLQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYyBiL2xkL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiYWVkMy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ci0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19zdGFjayA9IDApO30KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMmQ0ZjcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCIke09VVFBVVF9BUkNIfSIpCi0KLU1FTU9SWQotewotCXJvbSA6IE9SSUdJTiA9IDB4MDAwMDAzMDAsIExFTkdUSCA9IDE2awotCXJhbSA6IE9SSUdJTiA9IDB4MDAwMDAzMDAgKyAxNmssIExFTkdUSCA9IDE2awotCXJhbWJsazAgOiBPUklHSU4gPSAweDAyMDI2MDAwLCBMRU5HVEggPSAweDEwMDAKLQlyYW1ibGsxIDogT1JJR0lOID0gMHgwMjAyNzAwMCwgTEVOR1RIID0gMHgxMDAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDB4MDAwMDAwMDAgOgotewotCSoodmVjdG9ycykKLX0KLQotLnRleHQgOiAKLXsKLQkqKC50ZXh0KQotfSA+IHJvbQotCi0uY29uc3QgOgotewotCSooLmNvbnN0KQotCV9fZXRleHQgPSAuIDsKLX0gPiByb20KLQotLm1kYXRhIDogQVQoIEFERFIoLmNvbnN0KSArIFNJWkVPRiguY29uc3QpICkKLXsKLQlfX2RhdGEgPSAuIDsKLQkqKC5kYXRhKTsKLQlfX2VkYXRhID0gLiA7Ci19ID4gcmFtCi0KLS5ic3MgOgotewotCV9fYnNzID0gLiA7Ci0JKiguYnNzKTsKLQkqKENPTU1PTik7Ci0JX19lYnNzID0gLiA7Ci19ID4gcmFtCi0KLS5yYW0wIDoKLXsKLQkqKHJhbTApCi19ID4gcmFtYmxrMAotCi0ucmFtMSA6Ci17Ci0JKihyYW0xKQotfSA+IHJhbWJsazEKLQotfQotCi1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2ZjY1My4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFRJIFRNUzMyMEM4MCAodGljODApIENPRkYuCi0jCi0jIEJlc2lkZXMgdGhlIHNoZWxsIHZhcmlhYmxlcyBzZXQgYnkgdGhlIGVtdWxwYXJhbXMgc2NyaXB0LCBhbmQgdGhlIExEX0ZMQUcKLSMgdmFyaWFibGUsIHRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCB3aWxsIHNldCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBmb3IgZWFjaAotIyB0aW1lIHRoaXMgc2NyaXB0IGlzIHJ1biB0byBnZW5lcmF0ZSBvbmUgb2YgdGhlIGxpbmtlciBzY3JpcHRzIGZvciBsZHNjcmlwdHM6Ci0jCi0jIFJFTE9DQVRJTkc6IFNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGdvaW5nIHRvIGJlIGRvaW5nCi0jIGEgZmluYWwgcmVsb2NhdGlvbi4KLSMKLSMgQ09OU1RSVUNUSU5HOiBTZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGxpbmtlciBpcyBnb2luZyB0byBiZQotIyBidWlsZGluZyBnbG9iYWwgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzLgotIwotIyBEQVRBX0FMSUdOTUVOVDogU2V0IHRvIGFuIEFMSUdOIGV4cHJlc3Npb24gd2hlbiB0aGUgb3V0cHV0IHNob3VsZCBiZSBwYWdlCi0jIGFsaWduZWQsIG9yIHRvICIuIiB3aGVuIGdlbmVyYXRpbmcgdGhlIC1OIHNjcmlwdC4KLSMKLSMgQ1JFQVRFX1NITElCOiBTZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gZ2VuZXJhdGluZyBhIHNjcmlwdCBmb3IKLSMgdGhlIC1zaGFyZWQgbGlua2VyIGFyZy4KLQotdGVzdCAteiAiJFRFWFRfU1RBUlRfQUREUiIgJiYgVEVYVF9TVEFSVF9BRERSPSIweDgwMDAwICsgU0laRU9GX0hFQURFUlMiCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9fc3RhcnQKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAkVEVYVF9TVEFSVF9BRERSfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLmZpbmkpCi0gICAgKigudGV4dCkKLSAgfQotICAuY29uc3QgQUxJR04oNCkgOiB7Ci0gICAgKiguY29uc3QpCi0gIH0KLSAgLmN0b3JzIEFMSUdOKDQpIDogewotICAgICR7Q09OU1RSVUNUSU5HKyAuID0gQUxJR04oNCk7fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKC0xKX0KLSAgICAqKC5jdG9ycykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICB9Ci0gIC5kdG9ycyBBTElHTig0KSA6IHsKLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygtMSl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICB9Ci0gICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAuZGF0YSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX19lZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyA6IHsgCQkJCQkKLSAgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSBBTElHTigweDgpfTsKLSAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IEFMSUdOKDB4OCl9OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdjg1MC5zYyBiL2xkL3NjcmlwdHRlbXBsL3Y4NTAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjA5NTQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdjg1MC5zYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi1jYXQgPDwgRU9GCi1PVVRQVVRfRk9STUFUKCJlbGYzMi12ODUwIiwgImVsZjMyLXY4NTAiLAotCSAgICAgICJlbGYzMi12ODUwIikKLU9VVFBVVF9BUkNIKHY4NTApCi1FTlRSWShfc3RhcnQpCi1TRUFSQ0hfRElSKC4pOwotLyovY3JpdHRlcnMvc2x1Zy9ncm9zc21hbi9pbnN0YWxsL3N1bjQvdjg1MC1lbGYvbGliKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFRoaXMgc2F2ZXMgYSBsaXR0bGUgc3BhY2UgaW4gdGhlIEVMRiBmaWxlLCBzaW5jZSB0aGUgemRhIHN0YXJ0cwotICAgICBhdCBhIGhpZ2hlciBsb2NhdGlvbiB0aGF0IHRoZSBFTEYgaGVhZGVycyB0YWtlIHVwLiAgKi8KLQotICAuemRhdGEgJHtaREFUQV9TVEFSVF9BRERSfSA6IHsKLQkqKC56ZGF0YSkKLQkqKC56YnNzKQotCSoocmVzemRhdGEpCi0JKiguemNvbW1vbikKLSAgfQotCi0gIC8qIFRoaXMgaXMgdGhlIHJlYWQgb25seSBwYXJ0IG9mIHRoZSB6ZXJvIGRhdGEgYXJlYS4KLSAgICAgSGF2aW5nIGl0IGFzIGEgc2VwZXJhdGUgc2VjdGlvbiBwcmV2ZW50cyBpdHMKLSAgICAgYXR0cmlidXRlcyBmcm9tIGJlaW5nIGluaGVyaXRlZCBieSB0aGUgemRhdGEKLSAgICAgc2VjdGlvbi4gIFNwZWNpZmljYWxseSBpdCBwcmV2ZW50cyB0aGUgemRhdGEKLSAgICAgc2VjdGlvbiBmcm9tIGJlaW5nIG1hcmtlZCBSRUFET05MWS4gICovCi0KLSAgLnJvemRhdGEgJHtST1pEQVRBX1NUQVJUX0FERFJ9IDogewotCSooLnJvemRhdGEpCi0JKihyb216ZGF0YSkKLQkqKHJvbXpic3MpCi0gIH0KLQotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICR7VEVYVF9TVEFSVF9BRERSfTsKLSAgLmludGVycAk6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoCQk6IHsgKiguaGFzaCkgfQotICAuZHluc3ltCTogeyAqKC5keW5zeW0pIH0KLSAgLmR5bnN0cgk6IHsgKiguZHluc3RyKSB9Ci0gIC5yZWwudGV4dAk6IHsgKigucmVsLnRleHQpIH0KLSAgLnJlbGEudGV4dAk6IHsgKigucmVsYS50ZXh0KSB9Ci0gIC5yZWwuZGF0YQk6IHsgKigucmVsLmRhdGEpIH0KLSAgLnJlbGEuZGF0YQk6IHsgKigucmVsYS5kYXRhKSB9Ci0gIC5yZWwucm9kYXRhCTogeyAqKC5yZWwucm9kYXRhKSB9Ci0gIC5yZWxhLnJvZGF0YQk6IHsgKigucmVsYS5yb2RhdGEpIH0KLSAgLnJlbC5nb3QJOiB7ICooLnJlbC5nb3QpIH0KLSAgLnJlbGEuZ290CTogeyAqKC5yZWxhLmdvdCkgfQotICAucmVsLmN0b3JzCTogeyAqKC5yZWwuY3RvcnMpIH0KLSAgLnJlbGEuY3RvcnMJOiB7ICooLnJlbGEuY3RvcnMpIH0KLSAgLnJlbC5kdG9ycwk6IHsgKigucmVsLmR0b3JzKSB9Ci0gIC5yZWxhLmR0b3JzCTogeyAqKC5yZWxhLmR0b3JzKSB9Ci0gIC5yZWwuaW5pdAk6IHsgKigucmVsLmluaXQpIH0KLSAgLnJlbGEuaW5pdAk6IHsgKigucmVsYS5pbml0KSB9Ci0gIC5yZWwuZmluaQk6IHsgKigucmVsLmZpbmkpIH0KLSAgLnJlbGEuZmluaQk6IHsgKigucmVsYS5maW5pKSB9Ci0gIC5yZWwuYnNzCTogeyAqKC5yZWwuYnNzKSB9Ci0gIC5yZWxhLmJzcwk6IHsgKigucmVsYS5ic3MpIH0KLSAgLnJlbC5wbHQJOiB7ICooLnJlbC5wbHQpIH0KLSAgLnJlbGEucGx0CTogeyAqKC5yZWxhLnBsdCkgfQotICAuaW5pdAkJOiB7IEtFRVAgKCooLmluaXQpKSB9ID0wCi0gIC5wbHQJCTogeyAqKC5wbHQpIH0KLQotICAudGV4dAkJOiB7Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrKigudGV4dC4qKX0KLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gIH0gPTAKLQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLQotICAgLyogVGhpcyBpcyBzcGVjaWFsIGNvZGUgYXJlYSBhdCB0aGUgZW5kIG9mIHRoZSBub3JtYWwgdGV4dCBzZWN0aW9uLgotICAgICAgSXQgY29udGFpbnMgYSBzbWFsbCBsb29rdXAgdGFibGUgYXQgdGhlIHN0YXJ0IGZvbGxvd2VkIGJ5IHRoZQotICAgICAgY29kZSBwb2ludGVkIHRvIGJ5IGVudHJpZXMgaW4gdGhlIGxvb2t1cCB0YWJsZS4gICovCi0KLSAgLmNhbGxfdGFibGVfZGF0YSAke0NBTExfVEFCTEVfU1RBUlRfQUREUn0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUoX19jdGJwID0gLik7fQotICAgICooLmNhbGxfdGFibGVfZGF0YSkKLSAgfSA9IDB4ZmYgICAvKiBmaWxsIGdhcHMgd2l0aCAweGZmICovCi0gIC5jYWxsX3RhYmxlX3RleHQgOiB7Ci0gICAgKiguY2FsbF90YWJsZV90ZXh0KQotICB9Ci0KLSAgLmZpbmkJCTogeyBLRUVQICgqKC5maW5pKSkgICAgfSA9MAotICAucm9kYXRhCTogeyAqKC5yb2RhdGEpICR7UkVMT0NBVElORysqKC5yb2RhdGEuKil9ICooLmdudS5saW5rb25jZS5yKikgfQotICAucm9kYXRhMQk6IHsgKigucm9kYXRhMSkgfQotCi0gIC5kYXRhCQk6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysqKC5kYXRhLiopfQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICAuZGF0YTEJOiB7ICooLmRhdGExKSB9Ci0gIC5jdG9ycwk6IHsKLSAgICAke1JFTE9DQVRJTkcrX19fY3RvcnMgPSAuO30KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCpjcnRlbmQoLmN0b3JzKSkKLSAgICAke1JFTE9DQVRJTkcrX19fY3RvcnNfZW5kID0gLjt9Ci0gIH0KLQotICAuZHRvcnMJOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fX2R0b3JzID0gLjt9Ci0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqY3J0ZW5kLm8oLmR0b3JzKSkKLSAgICAke1JFTE9DQVRJTkcrX19fZHRvcnNfZW5kID0gLjt9Ci0gIH0KLQotICAuZ290CQk6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gIC5keW5hbWljCTogeyAqKC5keW5hbWljKSB9Ci0KLSAgLnRkYXRhICR7VERBVEFfU1RBUlRfQUREUn0gOiB7Ci0JJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZXAgPSAuKTt9Ci0JKigudGJ5dGUpCi0JKigudGNvbW1vbl9ieXRlKQotCSooLnRkYXRhKQotCSooLnRic3MpCi0JKigudGNvbW1vbikKLSAgfQotCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICR7U0RBVEFfU1RBUlRfQUREUn0gOiB7Ci0JJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZ3AgPSAuICsgMHg4MDAwKTt9Ci0JKiguc2RhdGEpCi0gICB9Ci0KLSAgLyogU2VlIGNvbW1lbnQgYWJvdXQgLnJvemRhdGEuICovCi0gIC5yb3NkYXRhICR7Uk9TREFUQV9TVEFSVF9BRERSfSA6IHsKLQkqKC5yb3NkYXRhKQotICB9Ci0KLSAgLyogV2UgcGxhY2UgdGhlIC5zYnNzIGRhdGEgc2VjdGlvbiBBRlRFUiB0aGUgLnJvc2RhdGEgc2VjdGlvbiwgc28gdGhhdAotICAgICBpdCBjYW4gZGlyZWN0bHkgcHJlY2VlZCB0aGUgLmJzcyBzZWN0aW9uLiAgVGhpcyBhbGxvd3MgcnVudGltZSBzdGFydHVwCi0gICAgIGNvZGUgdG8gaW5pdGlhbGlzZSBhbGwgdGhlIHplcm8tZGF0YSBzZWN0aW9ucyBieSBzaW1wbHkgdGFraW5nIHRoZQotICAgICB2YWx1ZSBvZiAnX2VkYXRhJyBhbmQgemVyb2luZyB1bnRpbCBpdCByZWFjaGVzICdfZW5kJyAgKi8KLSAgLnNic3MgOiB7Ci0JJHtSRUxPQ0FUSU5HK19fc2Jzc19zdGFydCA9IC47fQotCSooLnNic3MpCi0JKiguc2NvbW1vbikKLSAgfQotCi0gICR7UkVMT0NBVElORytfZWRhdGEgID0gREVGSU5FRCAoX19zYnNzX3N0YXJ0KSA/IF9fc2Jzc19zdGFydCA6IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVkYXRhID0gX2VkYXRhKTt9Ci0KLSAgLmJzcyAgICAgICA6Ci0gIHsKLQkke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnQgPSBERUZJTkVEIChfX3Nic3Nfc3RhcnQpID8gX19zYnNzX3N0YXJ0IDogLiA7fQotCSR7UkVMT0NBVElORytfX3JlYWxfYnNzX3N0YXJ0ID0gLiA7fQotCSooLmR5bmJzcykKLQkqKC5ic3MpCi0JKihDT01NT04pCi0gIH0KLQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAwCQk6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwCQk6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAJCTogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0ciAwCTogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXggMAkJOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMAk6IHsgKiguc3RhYi5pbmRleHN0cikgfQotICAuY29tbWVudCAwCQk6IHsgKiguY29tbWVudCkgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwCTogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMAk6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAJOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAJOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAJOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAJOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMAk6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMAk6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwCTogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwCTogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMAk6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwCTogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAJOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwCTogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwCTogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwCTogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwCTogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotCi0gIC8qIFVzZXIgc3RhY2sgKi8KLSAgLnN0YWNrIDB4MjAwMDAwCTogewotCSR7UkVMT0NBVElORytfX3N0YWNrID0gLjt9Ci0JKiguc3RhY2spCi0gIH0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi8KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYyBiL2xkL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTg0ODAuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgTm90aGluZyB0byBkby4KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3c2NS5zYyBiL2xkL3NjcmlwdHRlbXBsL3c2NS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwNDQ5NS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC93NjUuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotTUVNT1JZIHsKLQlyYW0gICA6IG8gPSAweDEwMDAsIGwgPSA1MTJrCi0JfQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCSAgKiguc3RyaW5ncykKLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotCi0udG9ycyAgIDogewotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLX0gICR7UkVMT0NBVElORysgPiByYW19Ci0KLS5kYXRhICA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5ic3MgIDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgJHtSRUxPQ0FUSU5HKyAweDMwMDAwIH0gIDogCi0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5zdGFiICAuIChOT0xPQUQpIDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgLiAoTk9MT0FEKSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3o4MDAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvejgwMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODc5MzAuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvejgwMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goIiR7T1VUUFVUX0FSQ0h9IikKLUVOVFJZKF9zdGFydCkKLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtCSUcrICR7UkVMT0NBVElORysgMHgwMDAwMDAwfX0gOiB7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0JICAqKC5zdHJpbmdzKQotCSAgKigucmRhdGEpCi0JfQotCi0uY3RvcnMgJHtCSUcrICR7UkVMT0NBVElORysgMHgyMDAwMDAwfX0gIDogCi0JewotCSAgJHtSRUxPQ0FUSU5HKyBfX19jdG9ycyA9IC4gOyAgfQotCSAgKiguY3RvcnMpOwotCSAgJHtSRUxPQ0FUSU5HKyBfX19jdG9yc19lbmQgPSAuIDsgfQotCSAgX19fZHRvcnMgPSAuIDsKLQkgICooLmR0b3JzKTsKLQkgICR7UkVMT0NBVElORysgX19fZHRvcnNfZW5kID0gLiA7IH0KLQl9IAotCi0uZGF0YSAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDMwMDAwMDB9fSA6IHsKLQkqKC5kYXRhKQotCX0KLQotLmJzcyAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMDB9fSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0gICAgKiguYnNzKTsKLSAgICAqKENPTU1PTik7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9ic3MgPSAuIDsgfQotICB9Ci0KLS5oZWFwICR7QklHKyAke1JFTE9DQVRJTkcrIDB4NTAwMDAwMH19IDogewotCSR7UkVMT0NBVElORysgX19zdGFydF9oZWFwID0gLiA7IH0KLQkke1JFTE9DQVRJTkcrIC4gPSAuICsgMjBrICA7IH0KLQkke1JFTE9DQVRJTkcrIF9fZW5kX2hlYXAgPSAuIDsgfQotCX0gCi0KLS5zdGFjayAke1JFTE9DQVRJTkcrIDB4ZjAwMCB9ICA6IAotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JJHtSRUxPQ0FUSU5HKyBfX3N0YWNrX3RvcCA9IC4gOyB9Ci0JfSAKLQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3N0YW1wLWguaW4gYi9sZC9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2xkL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2xkL3N5c2RlcC5oIGIvbGQvc3lzZGVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjY2MxMjIuLjAwMDAwMDAKLS0tIGEvbGQvc3lzZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBzeXNkZXAuaCAtLSBoYW5kbGUgaG9zdCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBHTlUgbGlua2VyCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExEX1NZU0RFUF9ICi0jZGVmaW5lIExEX1NZU0RFUF9ICi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLWV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci1leHRlcm4gY2hhciAqc3RycmNociAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX0JJTkFSWV9GT1BFTgotI2luY2x1ZGUgImZvcGVuLWJpbi5oIgotI2Vsc2UKLSNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLWV4dGVybiB2b2lkIGZyZWUgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi1leHRlcm4gY2hhciAqZ2V0ZW52ICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLSNlbmRpZgotCi0jZW5kaWYgLyogISBkZWZpbmVkIChMRF9TWVNERVBfSCkgKi8KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cgYi9sZC90ZXN0c3VpdGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc4ZTg0Yi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsODQ0ICswLDAgQEAKLTE5OTktMTEtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiBGaXggdGVzdCB0byBkaXNhYmxlIHRoZXNlIGNoZWNrcyBmb3IKLQlQRSBiYXNlZCB0YXJnZXRzLgotCi0xOTk5LTEwLTI5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6ICBSZW1vdmUgdGVzdDYuCi0JKiBsZC1zZWxlY3RpdmUvNS5jYzogRGVsZXRlLgotCi0xOTk5LTEwLTI4ICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogU2V0dXAgZXhwZWN0ZWQgZmFpbHVyZXMgZm9yCi0Jc3JlYyB0ZXN0cyBvbiBBUk0gTGludXguCi0KLTE5OTktMDktMTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IHhmYWlsIGxpbnV4KmxpYmMxIHNoYXJlZCAobm9uIFBJQywgbG9hZAotCW9mZnNldCkgdGVzdC4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogQWRkIC0taW1hZ2UtYmFzZSAwIGZvciBQRSB0YXJnZXRzLgotCi0xOTk5LTA4LTE3ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QtZm9vLmNjIChGb286OmluaXRfZm9vKTogVXNlICIlbGQiIGZvciBzaXplb2YuCi0KLTE5OTktMDgtMDkgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogUnVuIHRlc3RzIG9uIHNwYXJjKi0qLWxpbnV4Ki4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBMaWtld2lzZS4KLQotMTk5OS0wNy0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLWxpYi5leHAgKHByb2MgYmlnX29yX2xpdHRsZV9lbmRpYW4pOiBOZXcgcHJvYy4KLQlEZXRlcm1pbmUgaWYgYSBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4gb3V0cHV0IGZvcm1hdCBoYXNzCi0JYmVlbiBzZWxlY3RlZCBieSBhbnkgb2YgdGhlIG11bHRpbGliIG9wdGlvbnMsIGFuZCBpZiBzbyByZXR1cm4KLQlhIHN1aXRhYmxlIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHRoZSBsaW5rZXIvYXNzZW1ibGVyLgotCShwcm9jIGRlZmF1bHRfbGRfbGluayk6IEluY2x1ZGUgdGhlIHJlc3VsdCBvZiBwcm9jCi0JYmlnX29yX2xpdHRsZV9lbmRpYW4gb24gdGhlIGNvbW1hbmQgbGluZSB0byB0aGUgbGlua2VyLgotCShwcm9jIGxkX3NpbXBsZV9saW5rKTogSW5jbHVkZSB0aGUgcmVzdWx0IG9mIHByb2MKLQliaWdfb3JfbGl0dGxlX2VuZGlhbiBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIHRoZSBsaW5rZXIuCi0JKHByb2MgZGVmYXVsdF9sZF9jb21waWxlKTogQXBwZW5kIG11bHRpbGliIGZsYWdzIHRvIGNvbXBpbGVyCi0Jc3dpdGNoZXMuCi0JKHByb2MgZGVmYXVsdF9sZF9hc3NlbWJsZSk6IEluY2x1ZGUgdGhlIHJlc3VsdCBvZiBwcm9jCi0JYmlnX29yX2xpdHRsZV9lbmRpYW4gb24gdGhlIGNvbW1hbmQgbGluZSB0byB0aGUgbGlua2VyLgotCi0xOTk5LTA3LTIxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkLWVsZnZlcnMvdmVyczEuYzogQWRkIG1pc3NpbmcgcHJvdG90eXBlcyBhbmQgaW5jbHVkZQotCTxzdGRpby5oPiBpZiBuZWNlc3NhcnkuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxNS5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczE5LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzMi5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczMuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM0LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNi5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczcuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM5LmM6IExpa2V3aXNlLgotCSogbGQtc2hhcmVkL21haW4uYzogTGlrZXdpc2UuCi0JKiBsZC1zcmVjL3NyMy5jYyAoRm9vOjpGb28pOiBSZW1vdmUgYXJnIG5hbWUuCi0KLVRodSBKdWwgMTUgMTg6MDA6MzAgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IFhGQUlMIG9uIElSSVg2IGZvciB0aGUgdXN1YWwgYXMKLQl3aXRoIG90aGVyIERXQVJGMiB0YXJnZXRzLgotCi0xOTk5LTA3LTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogRG8gbm90IGV4cGVjdCBhcm0gdG9vbGNoYWlucyB0byBmYWlsCi0JdGhlIHVuZGVmaW5lZCBsaW5lIHRlc3QuCi0KLTE5OTktMDctMTAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBVc2UgLXJwYXRoIGluIG5ldyB2ZXJzMTkgdGVzdC4KLQotMTk5OS0wNy0wNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IEFkZCBuZXcgdGVzdHMgdmVyczE3IHRvIHZlcnMxOS4KLQkqIGxkL2VsZnZlcnMve3ZlcnMxNy4qLCB2ZXJzMTguKiwgdmVyczE5Lip9OiBOZXcgZmlsZXMuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC1jaGVja3MvYXNtLnM6IFVzZSBhIHN5bWJvbCBuYW1lIGZvciAubGNvbW0uCi0JKiBsZC1jaGVja3MvY2hlY2tzLmV4cDogVXNlIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHR3byB0ZXN0cy4KLQlEb24ndCBhZGQgZXh0cmEgdGV4dCB3aGVuIGludm9raW5nIGZhaWwuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC1zY3JpcHRzL3BoZHJzLmV4cDogQ2hhbmdlIHRhcmdldCBjaGVjayBmcm9tICIqLSotbGludXhhb3V0KiIKLQl0byAiKi0qLWxpbnV4KmFvdXQqIi4KLQkqIGxkLXNjcmlwdHMvd2Vhay5leHA6IExpa2V3aXNlLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLiAgU2ltcGxpZnkgY29uZGl0aW9uIGEgYml0LgotCi1XZWQgSnVuICA5IDEyOjAyOjMzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC1tYWluLmNjOiBBdm9pZCBgaW1wbGljaXQgaW50JyB3YXJuaW5nLgotCSogbGQtc2hhcmVkL3NoMS5jOiBGaXggdHlwby4KLQotMTk5OS0wNi0wNCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsaWIvbGQtbGliLmV4cCAoZGVmYXVsdF9sZF9ubSk6IENsZWFyIG5tX291dHB1dCBmaXJzdCBpZgotCW5lY2Vzc2FyeS4KLQotMTk5OS0wNS0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCB4ZmFpbCBmb3IgbWNvcmUtZWxmLgotCi0xOTk5LTA1LTExICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRG8gbm90IHJ1biB0ZXN0cyBmb3IgUEUgYmFzZWQgcG9ydHMuCi0KLTE5OTktMDMtMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiBEbyBub3QgcnVuIHRlc3RzIGZvciBDT0ZGIG9yIFBFCi0JYmFzZWQgcG9ydHMuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgZXhwZWN0ZWQgZmFpbHVyZXMgZm9yIFN0cm9uZ0FSTQotCXRhcmdldHMuCi0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlcyBmb3IgU3Ryb25nQVJNIHRhcmdldHMuCi0KLQkqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiBBZGQgZXhwZWN0ZWQgZmFpbHVyZSBmb3IgQVJNLUNPRkYKLQl0YXJnZXRzLiAKLQotMTk5OS0wMi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtY2hlY2tzL2FzbS5zOiBVc2UgLmxvbmcgaW5zdGVhZCBvZiAud29yZC4KLQlSZXBsYWNlIGN1c3RvbSBzZWN0aW9uIG5hbWVzIHdpdGggLnRleHQsIC5kYXRhIGFuZCAuYnNzLgotCSogbGQtY2hlY2tzL3NjcmlwdDogUmVwbGFjZSBjdXN0b20gc2VjdGlvbiBuYW1lcyB3aXRoIC50ZXh0LCAuZGF0YQotCWFuZCAuYnNzLiAKLQkqIGxkLWNoZWNrcy9jaGVja3MuZXhwOiBSZXBsYWNlIGN1c3RvbSBzZWN0aW9uIG5hbWVzIHdpdGggLnRleHQsCi0JLmRhdGEgYW5kIC5ic3MuIAotCi0xOTk5LTAyLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1jaGVja3M6IE5ldyBkaXJlY3Rvcnk6ICBUZXN0cyBmb3IgdGhlIGxpbmtlcidzCi0JLS1jaGVjay1zZWN0aW9ucyBvcHRpb24uCi0JKiBsZC1jaGVja3MvY2hlY2tzLmV4cDogTmV3IGZpbGUuCi0JKiBsZC1jaGVja3Mvc2NyaXB0OiBCb2d1cyBsaW5rZXIgc2NyaXB0LgotCSogbGQtY2hlY2tzL2FzbS5zOiBTaW1wbGUgdGVzdCBhc3NlbWJsZXIgZmlsZS4KLQotVHVlIEZlYiAgMiAxOToxNTowMiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiAgRGlzYWJsZSB0ZXN0IGZvciB1bnN1cHBvcnRlZAotICAgICAgICB0YXJnZXRzLiAgQ2hhbmdlIHRlc3RzIHRvIGNoZWNrIGZvciBhYnNlbmNlIG9mIHN5bWJvbHMgaW5zdGVhZAotICAgICAgICBvZiBhZGRyZXNzIHplcm8uCi0KLU1vbiBKYW4gMTggMDM6NDQ6NTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHAgKGdldF9saW5rX2ZpbGVzKTogUXVvdGUgdGFyZ2V0X3RyaXBsZXQgYW5kIENDCi0Jd2hlbiBpbnZva2luZyBzaGVsbC4KLQkoZ2V0X3RhcmdldF9lbXVsKTogTGlrZXdpc2UuCi0KLTE5OTktMDEtMDMgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHAgKGdldF9saW5rX2ZpbGVzLCBnZXRfdGFyZ2V0X2VtdWwpOiBOZXcgcHJvY3M7Ci0JcnVuIHNoZWxsIGNvbW1hbmRzIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBjb25maWd1cmUuaG9zdCBhbmQKLQljb25maWd1cmUudGd0IGluIHRoZSBzb3VyY2UgdHJlZS4KLQkodG9wIGxldmVsKTogVXNlIHRoZW0gdG8gZ2V0IGluZm9ybWF0aW9uIG5lZWRlZCB0byBydW4gdGVzdHMsIGlmCi0Jbm90IG90aGVyd2lzZSBwcm92aWRlZC4KLQotCSogbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQ6IE5ldyBmaWxlLiAgQnVpbGRzIGEgc2hhcmVkIGxpYnJhcnksIGJ1dAotCWdpdmVzIG5vbi16ZXJvIGFkZHJlc3NlcyBmb3IgbWVtb3J5IHJlZ2lvbi4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIG5vbi1QSUMgbm9uLUFJWCB0ZXN0IGFnYWluIHVzaW5nCi0JdGhlIG5ldyBsaW5rZXIgc2NyaXB0LgotCi1UdWUgRGVjICA4IDIyOjU2OjA1IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERlbGV0ZSB4ZmFpbHMgZm9yIFBQQyBMaW51eCB0YXJnZXRzLAotCW5ld2VyIGdsaWJjIGxldHMgbGluayBzdWNjZWVkLgotCi1TdW4gRGVjICA2IDEyOjU5OjM3IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogbGQtZWxmdmVycy92ZXJzMS5jOiBBZGQgbWlzc2luZyByZXR1cm4gdHlwZXMgYW5kIHZhbHVlcy4KLQkqIGxkLWVsZnZlcnMvdmVyczIuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMzLmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNC5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczUuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM2LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNy5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczkuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxNS5jOiBMaWtld2lzZS4KLQotRnJpIE9jdCAyMyAxNjoyODoyOSAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBsZC1zZWxlY3RpdmU6ICBOZXcgZGlyZWN0b3J5IHdpdGggbmV3IGZpbGVzIHRvIHRlc3QKLSAgICAgICBzZWxlY3RpdmUgbGlua2luZy4KLQotICAgICAgICogbGliL2xkLWxpYi5leHAgKGxkX25tKTogIFN0cmlwIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tICRuYW1lLgotICAgICAKLVN1biBPY3QgIDQgMjI6MTc6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxNi5kc3ltOiBXb3JrIGNvcnJlY3RseSBvbiBhIHN5c3RlbSB3aXRob3V0Ci0JdmVyc2lvbmVkIHN5c3RlbSBsaWJyYXJpZXMuCi0KLU1vbiBTZXAgMjggMjE6MzE6MTIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogUnVuIHRlc3RzIG9uIGFscGhhLWxpbnV4LgotCSogbGQtZWxmdmVycy8qLnN5bSwgbGQtZWxmdmVycy8qLmRzeW06IEFkanVzdCBwYXR0ZXJzIHRvIG1hdGNoCi0JQWxwaGEncyB1c2Ugb2Ygc3Rfb3RoZXIuCi0KLTE5OTgtMDktMjcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwICh2ZXJzMTYsIHZlcnMxNmEpOiBOZXcgdGVzdHMuCi0JKiBsZC1lbGZ2ZXJzL3t2ZXJzMTYuKiwgdmVyczE2YS4qfTogTmV3IGZpbGVzLgotCi1UaHUgU2VwIDE3IDE3OjE4OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBNYWtlIHVuZGVmaW5lZCBsaW5lIHRlc3QgYmUgYW4geGZhaWwKLQlmb3IgYXJtL3RodW5iIGVsZiB0b29sY2hhaW5zLgotCi1XZWQgU2VwICA5IDE0OjEwOjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBjaGFuZ2UgdGVzdCBmb3IgZWxmL2R3YXJmMiB0YXJnZXRzLgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBcm0tZWxmIG5vdyBwYXNzZXMgdGhpcyB0ZXN0LgotCi1XZWQgQXVnIDE5IDExOjU5OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBhcm0vdGh1bWItZWxmIGV4cGVjdGVkIGZhaWx1cmVzLgotCQotVGh1IEF1ZyAxMyAxMjo0MTo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBEb24ndCBydW4gdGhlIC0tc3RhdGljIGJvb3RzdHJhcAotCXRlc3QgaWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXRpYyBsaWJiZmQuYS4KLQotV2VkIEF1ZyAxMiAxNToxOTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCB4ZmFpbHMgZm9yIEFscGhhIEVMRiB0YXJnZXRzLgotCi1Nb24gQXVnIDEwIDE1OjQyOjIwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvd2Vhay50ICgudGV4dCwgLmRhdGEpOiBGb2N1cyBkYXRhIHRvIGJlIHVzZWQuCi0JKC9ESVNDQVJELyk6IEFsbCB0aGUgcmVzdC4KLQkqIGxkLXNjcmlwdHMvd2VhazEucywgbGQtc2NyaXB0cy93ZWFrMi5zOiBQdXQgc3R1ZmYgaW4gLmRhdGEuCi0KLUZyaSBKdWwgMjQgMTg6Mzc6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IENyZWF0ZSB0bXBkaXIvZ2FzIHN1YmRpcmVjdG9yeSwgYWRkIGEKLQlzeW1saW5rIHRvIGFzLW5ldywgYW5kIHNldCBnY2NfZ2FzX2ZsYWcgdmFyaWFibGUuCi0JKiBsaWIvbGQtbGliLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogSWYgdGhlIGNvbXBpbGVyIGFwcGVhcnMgdG8KLQliZSBnY2MsIHVzZSBnY2NfZ2FzX2ZsYWcgd2hlbiBjb21waWxpbmcuCi0KLVRodSBKdWwgMjMgMTI6MjM6MjkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBKdXN0IGNoZWNrIGZvciBpPzg2IHJhdGhlciB0aGFuIGNoZWNraW5nCi0JZm9yIGkzODYsIGk0ODYsIGFuZCBpNTg2LgotCShvYmpkdW1wX3ZlcnNpb25zdHVmZik6IElmIHdlIGNhbid0IGZpbmQgdGhlIGxpbmUsIGR1bXAgdGhlIGZpbGUuCi0KLUZyaSBKdWwgIDMgMDA6Mjc6NDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3BoZHJzLmV4cDogUnVuIHRlc3Qgb24gKi0qLWVhYmkqLgotCSogbGQtc2NyaXB0cy93ZWFrLmV4cDogTGlrZXdpc2UuCi0KLVdlZCBKdWwgIDEgMTA6NTE6NDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlsIGZvciB2ODUwLgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogYXJtIGFuZCB0aHVtYiBQRSB0b29sY2hhaW5zIG5vdyBwYXNzCi0JdGhlc2UgdGVzdHMuCi0KLUZyaSBKdW4gMTkgMTc6MTI6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3dlYWsuZXhwOiBOZXcgdGVzdC4KLQkqIGxkLXNjcmlwdHMvd2Vhay50OiBOZXcgZmlsZS4KLQkqIGxkLXNjcmlwdHMvd2VhazEuczogTmV3IGZpbGUuCi0JKiBsZC1zY3JpcHRzL3dlYWsyLnM6IE5ldyBmaWxlLgotCi1UdWUgSnVuIDE2IDEyOjQwOjM4IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IFJ1biB0ZXN0cyBvbiBwb3dlcnBjIEVMRiB0YXJnZXRzLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzMS5kc3ltOiBBbGxvdyBmb3IgLnNkYXRhLgotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgUG93ZXJQQyBMaW51eC4KLQotRnJpIE1heSAyOSAxNTowMjo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCB4ZmFpbHMgZm9yIHBvd2VycGMqLSotZWFiaS4KLSAJKHJ1bl9zcmVjX3Rlc3QpOiBPbiBtbjEwMjAwLCBkZWZpbmUgX190cnVuY3NpcHNpMl9kb19kMi4KLQkqIGxkLXNyZWMvc3IxLmMgKF9fbWFpbik6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLgotCSogbGQtc3JlYy9zcjMuY2MgKF9fbWFpbik6IExpa2V3aXNlLgotCShfX2J1aWx0aW5fZGVsZXRlLCBfX2J1aWx0aW5fbmV3KTogTGlrZXdpc2UuCi0JKF9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbik6IFJldHVybiAwLgotCShfX2dldF9laF9jb250ZXh0KTogTGlrZXdpc2UuCi0KLVRodSBNYXkgMjEgMTU6MjE6MzMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBzdXBwb3J0IGZvciB0aHVtYi1wZSB0YXJnZXQuCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc3VwcG9ydCBmb3IgYXJtLXBlIGFuZCB0aHVtYi1wZSB0YXJnZXRzLgotCi1Nb24gTWF5ICA0IDE3OjU0OjIwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUmVtb3ZlIHNldHVwX3hmYWlscyBmb3IgbTY4ay1saW51eC4KLQotTW9uIE1heSAgNCAxNzoxMjowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoYXJlZC9tYWluLmMgKHNobGliX292ZXJyaWRkZW5jYWxsMik6IE5ldyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgc2hsaWJfc2hsaWJjYWxsMi4KLQkqIGxkLXNoYXJlZC9zaDEuYyAoc2hsaWJfc2hsaWJjYWxsMik6IE5ldyBmdW5jdGlvbi4KLQkoc2hsaWJfb3ZlcnJpZGRlbmNhbGwyKTogTmV3IGZ1bmN0aW9uLgotCSogbGQtc2hhcmVkL3NoYXJlZC5kYXQ6IEFkZCBvdXRwdXQgbGluZSBmb3IgbmV3IHRlc3QuCi0JKiBsZC1zaGFyZWQvc3VuNC5kYXQ6IExpa2V3aXNlLgotCi0JKiBsZC1zcmVjL3NyMy5jYyAoX19nZXRfZWhfY29udGV4dCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIEFwciAgNyAxMjo1MDoxNyAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QtZm9vLmggKGNsYXNzIEZvbyk6IERlY2xhcmUgbGVuIHRvIGJlIHN0YXRpYyB0bwotCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCi0JKiBsZC1zcmVjL3NyMy5jYyAoY2xhc3MgRm9vKTogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMTAgMTY6NDI6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyMy5jYyAoX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluKTogTmV3IGZ1bmN0aW9uLgotCi1Nb24gRmViICAyIDE0OjE3OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9waGRycy5leHA6IEFkanVzdCBwaGRyc19yZWdleHAgZm9yIGEgNjQgYml0IHRhcmdldC4KLQotVGh1IERlYyAxOCAxMToxMzoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEdXBsaWNhdGVkIEFybSBwYXRjaCBmb3IgVGh1bWIgdGFyZ2V0cy4KLQotVHVlIERlYyAgMiAwOTo1MDoxOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBcHBsaWVkIHBhdGNoIGZyb20gVG9ueS5UaG9tcHNvbkBhcm0uY29tIHdoaWNoCi0JZml4ZXMgQVJNIHRlc3RzLgotCi1Nb24gRGVjICAxIDE2OjEyOjA1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlcyBvZiB0ZXN0cyAxIGFuZCAyIGZvciBBUk0KLQljb2ZmIHRhcmdldHMuCi0KLVdlZCBOb3YgMTIgMTQ6MTg6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LWZvby5oIChjbGFzcyBGb28pOiBEZWNsYXJlIGxlbiB0byBiZSBpbnQgdG8KLQlhdm9pZCBjb21waWxlciB3YXJuaW5nLgotCSogbGQtc3JlYy9zcjMuY2MgKGNsYXNzIEZvbyk6IExpa2V3aXNlLgotCi1Nb24gTm92IDEwIDE0OjI1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLWxpYi5leHAgKGRlZmF1bHRfbGRfc2ltcGxlX2xpbmspOiBQZXJtaXQgdGhlIGxpbmtlciB0bwotCWhhdmUgYW55IG5hbWUgd2hlbiBsb29raW5nIGZvciBlbnRyeSBzeW1ib2wgd2FybmluZ3MuCi0KLQkqIGxkLXNyZWMvc3IzLmNjIChfX2VoX3BjKTogRGVmaW5lLgotCi1Nb24gT2N0IDIwIDE0OjM2OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcjMuY2M6IEFkZCBkZWZpbml0aW9ucyBmb3IgdGVybWluYXRlLCBfX3Rlcm1pbmF0ZSwgYW5kCi0gCV9fdGhyb3csIHNpbmNlIHRoZSBjdXJyZW50IGcrKyBleHBlY3RzIHRoZW0gdG8gYmUgZGVmaW5lZC4KLQotRnJpIE9jdCAgMyAxMjoyNDowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHAgKG9iamR1bXBfZW1wdHl2ZXJzdHVmZik6IEFjY2VwdCB0aGUgb3V0cHV0Ci0JZmlsZSBpZiB0aGUgc3RyaW5nIGxpYmMgYXBwZWFycyBpbiBpdC4KLQkob2JqZHVtcF92ZXJzaW9uc3R1ZmYpOiBBY2NlcHQgdW5leHBlY3RlZCBsaW5lcyBpbiB0aGUgb3V0cHV0Ci0JZmlsZS4gIENvbXBhcmUgbGluZXMgdXNpbmcgc3RyaW5nIG1hdGNoLgotCSogbGQtZWxmdmVycy92ZXJzNi52ZXI6IFBlcm1pdCBhbnkgdmFsdWUgaW4gdGhlIHZuYV9vdGhlciBmaWVsZC4KLQotVHVlIEF1ZyAxMiAxNjowMToyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBDb3JyZWN0IHN0cmluZyBxdW90aW5nLgotCi1TYXQgQXVnICA5IDAwOjU2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBDaGFuZ2UgbGQsIGFzLCBubSBhbmQgc3RyaXAgZnJvbSAubmV3IHRvCi0JLW5ldy4gIExvYWQgbGQtbGliLmV4cCByYXRoZXIgdGhhbiBsZC5leHAuCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogVXNlIGxkLW5ldyByYXRoZXIgdGhhbiBsZC5uZXcuCi0JKiBsaWIvbGQtbGliLmV4cDogUmVuYW1lIGZyb20gbGliL2xkLmV4cCwgZm9yIHRoZSBiZW5lZml0IG9mCi0JRGVqYUdudSBjaGFuZ2VzLgotCi1UaHUgSnVuIDI2IDEyOjA3OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogVXNlIGVncmVwIHJhdGhlciB0aGFuIGdyZXAgd2hlbiBsb29raW5nIGZvcgotCWFuIGFsdGVybmF0aW9uLiAgRnJvbSBHcmVnIE1hcmdvIDxnbWFyZ29AZGwuY29tPi4KLQotV2VkIEp1biAyNSAxMjo0NzoyMiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgbTY4ay1saW51eCBvbiB0ZXN0cwotCXdpdGggbm9uIFBJQyBzaGFyZWQgbGlicmFyaWVzLgotCi1GcmkgSnVuICA2IDE3OjM1OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzNi52ZXI6IFVwZGF0ZSBmb3IgcmVjZW50IGVsZmxpbmsuaCBwYXRjaCB0bwotCXZlcnNpb24gaGFuZGxpbmcuCi0KLVdlZCBKdW4gIDQgMTI6MDY6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEZWZpbmUgX19fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiBhcyB3ZWxsLgotCi1GcmkgTWF5IDMwIDEyOjIxOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRGVmaW5lIF9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiB3aGVuCi0JbGlua2luZy4KLQotTW9uIE1heSAxMiAxMToxNzo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogVXNlICRiYXNlX2RpciByYXRoZXIgdGhhbiAkb2JqZGlyIHdoZW4KLQlzZXR0aW5nIGxkLiAgRnJvbSBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+LgotCi1GcmkgQXByIDI1IDA5OjA3OjAwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRGVmaW5lIHZhcmlvdXMgb3V0IG9mIGxpbmUgcHJvbG9ndWUvZXBpbG9ndWUKLQlmdW5jdGlvbnMgZm9yIHRoZSBtbjEwMjAwIHRvIGF2b2lkIG5lZWRpbmcgbGliZ2NjLmEuCi0KLVdlZCBNYXIgMjYgMTM6NTY6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEb24ndCBleHBlY3QgZmFpbHVyZXMgb24gbWlwcyotKi1lbGYqLgotCi1Nb24gTWFyIDE3IDE5OjI3OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogRG9uJ3QgcnVuIG9uIFN1bk9TIG9yIEFJWC4KLQotV2VkIE1hciAxMiAyMTo0NDoxOSAxOTk3ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwLCAqOiBOZXcgdGVzdHMgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgYXIgYW5kIHN0cmlwLgotCi1GcmkgRmViICA3IDE2OjQ3OjAyIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogVXNlIHBydW5lX3dhcm5pbmdzIGluc3RlYWQgb2YKLQlwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBEaXR0by4KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBEaXR0by4KLQkqIGxkLXNoL3NoLmV4cDogRGl0dG8uCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogRGl0dG8uCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEaXR0by4KLQkqIGxpYi9sZC5leHA6IERpdHRvLgotCi1XZWQgSmFuIDI5IDAwOjQ3OjI5IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LmV4cDogUHV0IGEgc2xhc2ggYmV0d2VlbiAkc3JjZGlyLyRzdWJkaXIuCi0JKiBsZC1zY3JpcHRzL3NjcmlwdC5leHA6IERpdHRvLgotCSogbGQtc2gvc2guZXhwOiBEaXR0by4KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBEaXR0by4KLQkqIGxkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cDogRGl0dG8uCi0JKiBsaWIvbGQuZXhwOiBEaXR0by4KLQotTW9uIERlYyAzMCAxNzowODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBGaXggcXVvdGluZyBmb3IgLS1kZWZzeW0gJGdsb2JhbCQuCi0KLVR1ZSBPY3QgIDEgMTU6NTI6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3ZlcnNpb24pOiBGaXggZm9yIGN1cnJlbnQgdmVyc2lvbgotCXByaW50aW5nLgotCi1GcmkgU2VwIDEzIDE1OjUxOjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IERlZmluZSAkZ2xvYmFsJCBmb3IgaHBwYS1lbGYuCi0KLVRodSBBdWcgIDggMTQ6Mjk6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzMi50OiBNYXAgWENPRkYgc2VjdGlvbnMgdG8gLnRleHQgb3IgLmRhdGEuCi0KLQkqIGxpYi9sZC5leHA6IFVzZSB2ZXJib3NlIC1sb2cgaW5zdGVhZCBvZiBjYWxsaW5nIGJvdGggdmVyYm9zZSBhbmQKLQlzZW5kX2xvZy4KLQotV2VkIEF1ZyAgNyAxODowMDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvcGhkcnMuZXhwOiBOZXcgdGVzdC4KLQkqIGxkLXNjcmlwdHMvcGhkcnMucywgbGQtc2NyaXB0cy9waGRycy50OiBOZXcgZmlsZXMuCi0KLVN1biBBdWcgIDQgMjE6NTg6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogT24gYTI5ayB0YXJnZXRzLCB1c2UgLS1kZWZzeW0gdG8gZGVmaW5lCi0JVl9TUElMTCBhbmQgVl9GSUxMLgotCi1UaHUgQXVnICAxIDE0OjEwOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IE5ldyB0ZXN0LgotCSogbGQtc2NyaXB0cy97Y3Jvc3MxLmMsIGNyb3NzMi5jLCBjcm9zczMuY306IE5ldyBmaWxlcy4KLQkqIGxkLXNjcmlwdHMve2Nyb3NzMS50LCBjcm9zczIudH06IE5ldyBmaWxlcy4KLQotU2F0IEp1biAyOSAxMzo0MDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoL3NoLmV4cDogRml4IGRlYnVnZ2luZyBtZXNzYWdlcy4KLQkqIGxkLXNoL3NoMS5zOiBVc2UgLmFsaWduIDQuCi0KLVdlZCBNYXkgIDEgMTY6NDU6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaC9zaC5leHA6IFVzZSAtTyB3aGVuIGNvbXBpbGluZyB3aXRoIC1tcmVsYXguCi0KLU1vbiBBcHIgMjkgMTA6MzM6MTAgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIHNoYXJlZCBsaWJyYXJ5IHRlc3RzIG9uCi0gCUxpbnV4L202OGsuCi0KLUZyaSBBcHIgIDUgMTY6MjA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRoZSBzaGFyZWQgbGlicmFyeSB0ZXN0cyBvbiBMaW51eC4KLQotTW9uIEZlYiAyNiAxMjo0NToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBEb24ndCB1c2UgLWZwaWMgb24gTUlQUyB0YXJnZXRzLgotCi1XZWQgSmFuIDMxIDE1OjA5OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlscyBmb3IgaHBwYSotKi0qZWxmKi4KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBMaWtld2lzZS4KLQotRnJpIEphbiAyNiAxODo0MzowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBFTEYgdGFyZ2V0cyBzaG91bGQgbm93IHBhc3MgdGhlCi0JdW5kZWZpbmVkIGxpbmUgdGVzdC4KLQotVGh1IEphbiAyNSAxNTozNjoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogVXBkYXRlIGZvciBjaGFuZ2UgdG8gTUlQUyBkaXNhc3NlbWJsZXIuCi0KLU1vbiBKYW4gMTUgMTU6MDU6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogRXhwZWN0IGZhaWx1cmUgZm9yIG1pcHMqLSotaXJpeDUqCi0Jd2hlbiBkb2luZyB0aGUgLS1zdGF0aWMgdGVzdC4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGVzdHMgb24gbWlwcyotKi1pcml4NSouCi0KLUZyaSBEZWMgMjkgMTI6MzM6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogT24gQUlYLCBkb24ndCBwYXNzIHRoZSAtYkkgb3B0aW9uCi0Jd2hlbiBjcmVhdGluZyBsZC1wYXJ0aWFsLm8uCi0KLVR1ZSBEZWMgMjYgMTc6Mzc6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBJZiBwb3dlcnBjKi0qLWVhYmkqLCB1c2UgLS1kZWZzeW0gdG8gZGVmaW5lCi0JX19lYWJpLgotCi1UdWUgRGVjIDE5IDE4OjAxOjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgWENPRkYgdGFyZ2V0cy4KLQotRnJpIERlYyAxNSAxNjozNjoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IE9uIGEyOWsgdGFyZ2V0cywgdXNlIC0tZGVmc3ltIHRvIGRlZmluZQotCVZfU1BJTEwgYW5kIFZfRklMTC4KLQkqIGxkLXNyZWMvc3IxLmMgKFZfU1BJTEwsIFZfRklMTCk6IFJlbW92ZSBkZWZpbml0aW9ucy4KLQkqIGxkLXNyZWMvc3IzLmNjOiBMaWtld2lzZS4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogUmVtb3ZlIGk5NjAgQ09GRiBzZXR1cF94ZmFpbC4KLQotU2F0IERlYyAgMiAwMToyMDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERvbid0IHVzZSBbXSBpbiBzZXR1cF94ZmFpbCBleHByZXNzaW9ucy4KLQotRnJpIERlYyAgMSAxMzoxODoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIE1JUFMgRUxGIHRhcmdldHMuCi0KLVdlZCBOb3YgMjkgMTM6MDE6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGk5NjAgQ09GRiB0YXJnZXRzLgotCi1Nb24gTm92IDI3IDE0OjM2OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlsIGNhbGxzIGZvciBpWzM0NV04Ni0qLWFvdXQqLgotCi0JKiBsZC1zcmVjL3NyMS5jIChWX1NQSUxMLCBWX0ZJTEwpOiBEZWZpbmUuCi0JKiBsZC1zcmVjL3NyMy5jYzogTGlrZXdpc2UuCi0KLVR1ZSBOb3YgMjEgMTY6MDU6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IFVwZGF0ZSBmb3IgY2hhbmdlcyBpbiBvYmpkdW1wIG91dHB1dC4KLQotV2VkIE5vdiAxNSAxNzo0Mjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IE5ldyB0ZXN0cy4KLQkqIGxkLXNyZWMvc3IxLmMsIGxkLXNyZWMvc3IyLmMsIGxkLXNyZWMvc3IzLmNjOiBOZXcgZmlsZXMuCi0JKiBsaWIvbGQuZXhwIChsZF9zaW1wbGVfbGluayk6IERpc2NhcmQgd2FybmluZ3MgYWJvdXQgbm90IGJlaW5nCi0JYWJsZSB0byBmaW5kIHRoZSBlbnRyeSBzeW1ib2wuCi0KLVR1ZSBOb3YgMTQgMjA6MDM6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaC9zaDIuYyAoX19tYWluKTogRGVmaW5lLgotCi1Nb24gTm92ICA2IDE0OjM5OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZW1waWMvZW1waWMuZXhwOiBBY2NlcHQgYSAuIGluIHRoZSBhZGRyZXNzIHN5bWJvbC4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0ZXN0cyBvbiByczYwMDAqLSotYWl4KiBhbmQKLQlwb3dlcnBjKi0qLWFpeCouICBBZGQgY29kZSB0byBjcmVhdGUgYXBwcm9wcmlhdGUgZXhwb3J0cyBmaWxlcywKLQlhbmQgcGFzcyBhcHByb3ByaWF0ZSBjb21waWxhdGlvbiBmbGFncywgYW5kIHRlc3QgYWdhaW5zdAotCWFwcHJvcHJpYXRlIGV4cGVjdGVkIG91dHB1dC4KLQkqIGxkLXNoYXJlZC94Y29mZi5kYXQ6IE5ldyBmaWxlLgotCSogbGQtc2hhcmVkL21haW4uYzogUHV0ICNpZm5kZWYgWENPRkZfVEVTVCBhcm91bmQgdGVzdHMgdGhhdCBjYW4KLQlub3QgYmUgbGlua2VkIHVzaW5nIFhDT0ZGLiAgVXNlIHNobGliX3NobGlidmFyMSBhcyBhIHNhbXBsZQotCWZ1bmN0aW9uIHBvaW50ZXIsIHJhdGhlciB0aGFuIHNobGliX21haW52YXIuCi0JKiBsZC1zaGFyZWQvc2gxLmM6IExpa2V3aXNlLgotCSogbGQtc2hhcmVkL3NoYXJlZC5kYXQ6IFVwZGF0ZSBmb3IgY2hhbmdlIGZyb20gdXNpbmcgc2hsaWJfbWFpbnZhcgotCXRvIHVzaW5nIHNobGliX3NobGlidmFyMS4KLQkqIGxkLXNoYXJlZC9zdW40LmRhdDogTGlrZXdpc2UuCi0KLVNhdCBPY3QgMjggMDE6NTQ6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3NjcmlwdC50OiBQdXQgLnByIGluIC50ZXh0LCBhbmQgLnJ3IGluIC5kYXRhLCBmb3IKLQljb252ZW5pZW5jZSB3aGVuIHRlc3RpbmcgWENPRkYuCi0KLVRodSBPY3QgMjYgMjI6NTM6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogT24gQUlYLCBwYXNzIC1iSS9saWIvc3lzY2FsbHMuZXhwCi0JYWxvbmcgd2l0aCAtLXN0YXRpYy4KLQotCSogbGQtc2NyaXB0cy9zY3JpcHQuczogTWFrZSBzeW1ib2xzIGdsb2JhbC4KLQotRnJpIE9jdCAyMCAxMjoyMjoxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBhcm0qLSotcGUqLgotCi1GcmkgU2VwIDI5IDExOjA2OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IFVzZSAtZSB3aGVuIGludm9raW5nIHRoZSBsaW5rZXIsIHRvCi0JcHJldmVudCB0aGUgU3VuT1MgbGlua2VyIGZyb20gdHJ5aW5nIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5LgotCi1UaHUgU2VwIDI4IDEyOjM3OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0aGUgdGVzdHMgb24gc3BhcmMqLSotc3Vub3M0Ki4gIEFkZAotCWFwcHJvcHJpYXRlIG1vZGlmaWNhdGlvbnMgYW5kIHNldHVwX3hmYWlscy4KLQkqIGxkLXNoYXJlZC9zdW40LmRhdDogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMTggMTQ6MTI6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3ZlcnNpb24pOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkLgotCShkZWZhdWx0X2xkX3JlbG9jYXRlLCBkZWZhdWx0X2xkX2xpbmspOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9sZF9zaW1wbGVfbGluaywgZGVmYXVsdF9sZF9jb21waWxlKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfbGRfYXNzZW1ibGUsIGRlZmF1bHRfbGRfbm0pOiBMaWtld2lzZS4KLQotRnJpIFNlcCAgOCAxNzoxNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBJZiB0aGUgY29tcGlsZXIgZG9lcyBub3QgZXhpc3QsIG1hcmsgdGhlCi0JdGVzdHMgYXMgdW50ZXN0ZWQgcmF0aGVyIHRoYW4gdW5yZXNvbHZlZC4KLQotV2VkIEF1ZyAyMyAxMDo0NjozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkLXNoL3NoLmV4cDogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiB0aGUgb3V0cHV0IG9mIGNtcC4KLQotVHVlIEF1ZyAxNSAxNzozNTozNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogU3BsaXQgc2NyaXB0IHZlcmlmaWNhdGlvbiBpbnRvIGEgcHJvYy4KLQlBZGQgc2ltcGxlIHRlc3Qgb2YgTVJJIHNjcmlwdC4KLQkqIGxkLXNjcmlwdHMvc2NyaXB0bS50OiBOZXcgZmlsZS4KLQotV2VkIEp1bCAyNiAxMTozODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoL3NoLmV4cDogTWFyayBgU0ggY29uZmlybSByZWxheGluZycgdGVzdCB1bnJlc29sdmVkIHdoZW4KLQlhcHByb3ByaWF0ZS4KLQotTW9uIEp1bCAyNCAxNTozNDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogRGVmaW5lIG9iamNvcHkgaWYgaXQgaXMgbm90IGRlZmluZWQuCi0JKiBsZC1zaC8qOiBOZXcgdGVzdHMgZm9yIFNIIHJlbGF4aW5nLgotCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IElmICRDQyBkb2VzIG5vdCBleGlzdCwgY2FsbCB1bnRlc3RlZCByYXRoZXIKLQl0aGFuIHVucmVzb2x2ZWQuCi0KLVRodSBKdWwgMjAgMTU6MDk6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogSWYgJENDIGRvZXMgbm90IGV4aXN0LCBtYXJrIHRoZQotCXRlc3RzIGFzIHVudGVzdGVkIHJhdGhlciB0aGFuIHVucmVzb2x2ZWQuICBDbGVhciBFTEYgeGZhaWxzIGZvcgotCW1pcHMqLCBub3QganVzdCBtaXBzLgotCi1UdWUgSnVsIDE4IDEyOjAwOjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2gtKi0qIGZvcgotCXVuZGVmaW5lZCBsaW5lIHRlc3QuCi0KLUZyaSBKdWwgMTQgMTM6MDc6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogTmV3IHRlc3QsIHRvIGNoZWNrIHJlcG9ydGluZyBvZgotCXVuZGVmaW5lZCBzeW1ib2xzLgotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jOiBOZXcgZmlsZS4KLQotTW9uIEp1bCAxMCAxMToxMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cDogSWYgYSB0ZXN0IGZhaWxzLCByZXBvcnQgaXQgY29ycmVjdGx5OgotCWRvbid0IHRyeSB0byBydW4gdGhlIG5leHQgdGVzdCwgYW5kIGRvbid0IHJlcG9ydCBhIHBhc3MgYXMgd2VsbCBhcwotCWEgZmFpbC4KLQotTW9uIEp1bCAgMyAxNDoyNjozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZC90ZXN0c3VpdGUvdmVyc2Fkb3MvKHQxLHQyKS5sZDogRW5kIGluIG5ld2xpbmVzLgotCi1Nb24gTWF5IDIyIDIwOjE5OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfY29tcGlsZSk6IElmIGNjIGFyZ3VtZW50IGlzIG11bHRpcGxlCi0Jd29yZHMsIHVzZSBvbmx5IHRoZSBmaXJzdCB3aGVuIHRyeWluZyB0byB2ZXJpZnkgdGhlIGF2YWlsYWJpbGl0eQotCW9mIHRoZSBjb21waWxlci4KLQotTW9uIEZlYiAgNiAxMTo0Njo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvZGVmaW5lZC50OiBNZW50aW9uIC5kYXRhIGFuZCAuYnNzIGV4cGxpY2l0bHkuCi0KLVR1ZSBKYW4gMjQgMTQ6NTE6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogSWYgbm90IGluIHRoZSBsZCBidWlsZCBkaXJlY3RvcnksCi0JY2FsbCB1bnRlc3RlZCBmb3IgZWFjaCB0ZXN0LCByYXRoZXIgdGhhbiBpZ25vcmluZyBpdC4gIElmIG9uZSB0ZXN0Ci0JZmFpbHMsIGdvIG9uIHRvIHRoZSBuZXh0IG9uZSBpbnN0ZWFkIG9mIHJldHVybmluZy4KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBJZiBjb21waWxhdGlvbnMgZmFpbCwgbWFyayB0ZXN0cyBhcwotCXVucmVzb2x2ZWQuCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IExpa2V3aXNlLiAgQWxzbywgYWx3YXlzIHBhc3MgdGhlIHNhbWUgdGVzdAotCW5hbWUgdG8gcGFzcyBvciBmYWlsLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLiAgQWxzbywgYWx3YXlzIHJ1biBhbGwgdGVzdHMuCi0JKiBsZC1zY3JpcHRzL2RlZmluZWQuZXhwOiBJZiBhcyBvciBubSBmYWlsLCBtYXJrIHRlc3QgYXMKLQl1bnJlc29sdmVkLiAgQWx3YXlzIHBhc3MgdGhlIHNhbWUgdGVzdCBuYW1lIHRvIHBhc3Mgb3IgZmFpbC4KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogTGlrZXdpc2UuCi0JKiBsZC1zY3JpcHRzL3NpemVvZi5leHA6IExpa2V3aXNlLgotCi1XZWQgSmFuIDExIDExOjQ4OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9zaXplb2YuZXhwOiBOZXcgdGVzdCwgYmFzZWQgb24gYnVnIHJlcG9ydCBmcm9tCi0JYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlLgotCSogbGQtc2NyaXB0cy9zaXplb2YuczogTmV3IGZpbGUuCi0JKiBsZC1zY3JpcHRzL3NpemVvZi50OiBOZXcgZmlsZS4KLQotV2VkIEphbiAgNCAxODo1NjoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHA6IFVzZSBbd2hpY2ggJGxkXSByYXRoZXIgdGhhbiBbZmlsZSBleGlzdHMgJGxkXSB0byBzZWUKLQlpZiB0aGUgbGlua2VyIGV4aXN0cy4KLQotV2VkIERlYyAxNCAxNjozOTowMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLAotCWluIGNhc2UgdGhlIHVzZXIgaXNuJ3QgdXNpbmcgdGhlIG5ld2VzdCBEZWphR251IHZlcnNpb24gdGhhdCB3ZQotCWhhdmVuJ3QgcmVsZWFzZWQgdG8gdGhlIG5ldCB5ZXQuCi0KLUZyaSBEZWMgIDIgMTQ6MTc6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBEZWZpbmUgb2JqZHVtcCBpZiBpdCBpcyBub3QgZGVmaW5lZC4KLQkqIGxkLWVtcGljLyo6IE5ldyB0ZXN0cyB0byB0ZXN0IC1tZW1iZWRkZWQtcGljIGNvZGUuCi0KLU1vbiBOb3YgMjggMTE6MjQ6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogUGFzcyBjbXAgb3V0cHV0IHRocm91Z2gKLQlwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBQYXNzIGRpZmYgb3V0cHV0IHRocm91Z2gKLQlwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBMaWtld2lzZS4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW1vdmUgdW51c2VkIGFuZCB1c2VsZXNzIHByb2MgbGRfbG9hZC4KLQotU3VuIE9jdCAzMCAxMzowMjozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfY29tcGlsZSk6IFJlbW92ZSB0aGUgb3V0cHV0IGZpbGUgYmVmb3JlCi0JY29tcGlsaW5nLgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTW92ZSBjb21tb24gdGVzdCBjb2RlIGludG8gYSBwcm9jZWR1cmUuCi0JQWRkIHRlc3RzIGZvciBjb21waWxpbmcgdGhlIG5vbiBzaGFyZWQgY29kZSBQSUMuCi0JKiBsZC1zaGFyZWQvbWFpbi5jIChtYWluKTogQ2FsbCBtYWluX2NhbGxlZCwgYW5kIHByaW50IHRoZSByZXN1bHQuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmRhdDogQWRqdXN0IGFjY29yZGluZ2x5LgotCi1UaHUgT2N0IDI3IDE3OjMwOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkOiBOZXcgZGlyZWN0b3J5LCB3aXRoIG5ldyBmaWxlcyB0byB0ZXN0IGdlbmVyYXRpbmcgRUxGCi0Jc2hhcmVkIGxpYnJhcmllcy4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogSWYgdGhlIGNvbXBpbGF0aW9uIHdvcmtlZCwgYnV0Ci0Jbm8gb2JqZWN0IGZpbGUgd2FzIGNyZWF0ZWQsIGNoZWNrIHRvIHNlZSBpZiB0aGUgY29tcGlsZXIgZm9vbGlzaGx5Ci0JaWdub3JlZCB0aGUgLW8gc3dpdGNoIHdoZW4gY29tcGlsaW5nLCBhbmQgbW92ZSB0aGUgcmVzdWx0aW5nCi0Jb2JqZWN0IGlmIGl0IGRpZC4KLQotVGh1IFNlcCAyOSAxMjozNjo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIFZNUyBkb2VzIG5vdCBwZXJtaXRzIGAuJyBpbiBkaXJlY3RvcnkgbmFtZXMuICBSZW5hbWVkCi0JbGQuYm9vdHN0cmFwIHRvIGxkLWJvb3RzdHJhcCwgbGQuY2R0ZXN0IHRvIGxkLWNkdGVzdCwgYW5kCi0JbGQuc2NyaXB0cyB0byBsZC1zY3JpcHRzLgotCi1XZWQgU2VwIDI4IDEyOjE4OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgdmFyaWFibGVzIGFzIGFuZCBubS4gIENyZWF0ZSB0bXBkaXIgaWYKLQlpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IERvbid0IGNyZWF0ZSB0bXBkaXIgaGVyZS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QuZXhwOiBMaWtld2lzZS4KLQkqIGxkLnNjcmlwdHMvZGVmaW5lZC5leHA6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3Qgc2V0IGFzIGFuZCBubQotCWhlcmUuICBDaGFuZ2UgcGVycm9yIGZvciBubyB2YXJpYWJsZXMgZm91bmQgdG8gZmFpbC4KLQkqIGxkLnNjcmlwdHMvc2NyaXB0LmV4cDogTmV3IHRlc3QuCi0JKiBsZC5zY3JpcHRzL3NjcmlwdC50LCBsZC5zY3JpcHRzL3NjcmlwdC5zOiBOZXcgZmlsZXMuCi0KLVR1ZSBTZXAgMjcgMTQ6NTk6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZC5zY3JpcHRzOiBOZXcgZGlyZWN0b3J5LgotCSogbGQuc2NyaXB0cy9kZWZpbmVkLmV4cCwgbGQuc2NyaXB0cy9kZWZpbmVkLnM6IE5ldyBmaWxlcy4KLQkqIGxkLnNjcmlwdHMvZGVmaW5lZC50OiBOZXcgZmlsZS4KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfc2ltcGxlX2xpbmspOiBOZXcgZnVuY3Rpb24uCi0JKGRlZmF1bHRfbGRfYXNzZW1ibGUsIGRlZmF1bHRfbGRfbm0pOiBOZXcgZnVuY3Rpb25zLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW5hbWUgZnJvbSB1bml4LWxkLmV4cC4KLQkobGRfc2ltcGxlX2xpbmssIGxkX2Fzc2VtYmxlLCBsZF9ubSk6IE5ldyBmdW5jdGlvbnMuCi0KLQkqIGNvbmZpZy91bml4LWxkLmV4cDogU2V0IGxkIHVzaW5nIGZpbmRmaWxlLgotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9yZWxvY2F0ZSk6IFJldHVybiBhIHZhbHVlLiAgQ2hhbmdlIGZvcm1hdAotCW9mIGxvZyBtZXNzYWdlcy4KLQkoZGVmYXVsdF9sZF9jb21waWxlKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfbGRfbGluayk6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3QgaW5jbHVkZSAkQkZETElCIGFuZAotCSRMSUJJQkVSVFkgaW4gbGluay4KLQkqIGxkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBSZXdyaXRlLgotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IFJld3JpdGUuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LWZvby5jYzogVXBkYXRlIGZyb20gdG9wIGxldmVsIGxkIGRpcmVjdG9yeS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QtZm9vLmg6IExpa2V3aXNlLgotCSogbGQuY2R0ZXN0L2NkdGVzdC1tYWluLmNjOiBMaWtld2lzZS4KLQotRnJpIE1heSAyNyAwOTozNTowNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IERvbid0IGxvb2sgZm9yICRyZXN1bHQgYmVmb3JlIGl0J3MKLQlkZWZpbmVkLgotCi1UdWUgTWF5IDE3IDE1OjA2OjQ5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAsIGxpYi9sZC5leHA6IFJlcGxhY2UgZXJyb3IgcHJvYwotCSAgY2FsbHMgd2l0aCBwZXJyb3IgY2FsbHMuCi0KLVdlZCBNYXkgMTEgMTY6NDc6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LWJhci5jYzogUmVuYW1lZCBmcm9tIGNkdGVzdC1mdW5jLmNjLgotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IEFkanVzdGVkLgotCi1GcmkgSmFuIDI4IDEzOjI1OjQxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpYi9sZC5leHAgKHNpbXBsZV9kaWZmKTogSW5kaWNhdGUgZmFpbHVyZSBpZiBmaWxlcyBoYXZlCi0JZGlmZmVyZW50IG51bWJlcnMgb2YgbGluZXMuICBEb24ndCBtdWNrIHdpdGggJGRpZmZlcmVuY2VzIHRvIGF2b2lkCi0JaW5kaWNhdGluZyBhIHBhc3MsIGp1c3QgcmV0dXJuLgotCi0JKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L3tjZHRlc3QtZm9vLmgsY2R0ZXN0LWZvby5jYyxjZHRlc3QtbWFpbi5jY306Ci0JRml4IHRlc3QgY2FzZSB0byBiZSB2YWxpZCBBTlNJIEMrKy4gIERvbid0IHJlcXVpcmUgdXNlIG9mIGhlYWRlcgotCWZpbGVzLCBzbyAiLi4vZ2NjL3hnY2MgLUIuLi9nY2MvIiBjYW4gYmUgdXNlZCBmb3IgQ1hYLgotCSogdGVzdHN1aXRlL2xkLmNkdGVzdC9jZHRlc3QuZXhwOiBDb21iaW5lICJybSIgbGluZXMuICBBZGQgc29tZQotCWNvbW1lbnRhcnkgb24gdGhpbmdzIHRoYXQgYXJlIHN0aWxsIGJyb2tlbiB3aXRoIHRoaXMgdGVzdCBjYXNlLgotCi1GcmkgU2VwIDEwIDA5OjU4OjIzIDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3QvY2R0ZXN0LmV4cDogQWRkZWQgQ1hYRkxBR1MgdG8gY29tcGlsZSBzdGFnZS4KLQotVGh1IEF1ZyAxMiAxNjowNTozNyAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiB0ZXN0c3VpdGUvbGliL2xkLmV4cDogYWRkIGNvbXBpbGVyIGFuZCBsaW5rZXIgc3VwcG9ydAotCSogdGVzdHN1aXRlL2NvbmZpZy91bml4LWxkLmV4cDogYWRkIGNvbXBpbGVyIGFuZCBsaW5rZXIgc3VwcG9ydAotCSogdGVzdHN1aXRlL2xkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBmaXhlZCB0byBkbyBwYXJ0aWFsIGxpbmtzCi0JKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L2NkdGVzdC5leHA6IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdGVzdHNjYXNlCi0KLVdlZCBBdWcgIDQgMjE6MDA6MTggMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogdGVzdHN1aXRlL2xpYi9sZC5leHA6IG5ldyBmaWxlCi0JKiB0ZXN0c3VpdGUvY29uZmlnL3VuaXgtbGQuZXhwOiBuZXcgZmlsZQotCSogdGVzdHN1aXRlL2xkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBuZXcgZmlsZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL2xkL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGZkZWEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0jIEJhc2ljIGV4cGVjdCBzY3JpcHQgZm9yIExEIFJlZ3Jlc3Npb24gVGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSmVmZnJleSBXaGVhdCAoY2Fzc2lkeUBjeWdudXMuY29tKQotIwotCi1pZiAhW2luZm8gZXhpc3RzIGxkXSB0aGVuIHsKLSAgICBzZXQgbGQgW2ZpbmRmaWxlICRiYXNlX2Rpci9sZC1uZXcgJGJhc2VfZGlyL2xkLW5ldyBbdHJhbnNmb3JtIGxkXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBhc10gdGhlbiB7Ci0gICAgc2V0IGFzIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vZ2FzL2FzLW5ldyAkYmFzZV9kaXIvLi4vZ2FzL2FzLW5ldyBbdHJhbnNmb3JtIGFzXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBubV0gdGhlbiB7Ci0gICAgc2V0IG5tIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvbm0tbmV3ICRiYXNlX2Rpci8uLi9iaW51dGlscy9ubS1uZXcgW3RyYW5zZm9ybSBubV1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgb2JqZHVtcF0gdGhlbiB7Ci0gICAgc2V0IG9iamR1bXAgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9vYmpkdW1wXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIG9iamNvcHldIHRoZW4gewotICAgIHNldCBvYmpjb3B5IFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvb2JqY29weV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBhcl0gdGhlbiB7Ci0gICAgc2V0IGFyIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvYXJdCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgc3RyaXBdIHRoZW4gewotICAgIHNldCBzdHJpcCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL3N0cmlwLW5ldyAkYmFzZV9kaXIvLi4vYmludXRpbHMvc3RyaXAtbmV3IFt0cmFuc2Zvcm0gc3RyaXBdXQotfQotCi1pZiB7IVtmaWxlIGlzZGlyZWN0b3J5IHRtcGRpcl19IHRoZW4gewotICAgIGNhdGNoICJleGVjIG1rZGlyIHRtcGRpciIgc3RhdHVzCi19Ci0KLSMgTWFrZSBhIHN5bWxpbmsgZnJvbSB0bXBkaXIvYXMgdG8gdGhlIGFzc2VtYmxlciBpbiB0aGUgYnVpbGQgdHJlZSwgc28KLSMgdGhhdCB3ZSBjYW4gdXNlIGEgLUIgb3B0aW9uIHRvIGdjYyB0byBmb3JjZSBpdCB0byB1c2UgdGhlIG5ld2x5Ci0jIGJ1aWx0IGFzc2VtYmxlci4KLWlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgdG1wZGlyL2dhc119IHRoZW4gewotICAgIGNhdGNoICJleGVjIG1rZGlyIHRtcGRpci9nYXMiIHN0YXR1cwotICAgIGNhdGNoICJleGVjIGxuIC1zIC4uLy4uLy4uL2dhcy9hcy1uZXcgdG1wZGlyL2dhcy9hcyIgc3RhdHVzCi19Ci1zZXQgZ2NjX2dhc19mbGFnICItQltwd2RdL3RtcGRpci9nYXMvIgotCi0jIGxvYWQgdGhlIHV0aWxpdHkgcHJvY2VkdXJlcwotbG9hZF9saWIgbGQtbGliLmV4cAotCi1wcm9jIGdldF9saW5rX2ZpbGVzIHt2YXJuYW1lfSB7Ci0gICAgZ2xvYmFsICR2YXJuYW1lCi0gICAgZ2xvYmFsIHRhcmdldF90cmlwbGV0Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBDQwotICAgIGlmICFbaW5mbyBleGlzdHMgJHZhcm5hbWVdIHsKLQlzZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyBzaCAtYyBcImhvc3Q9JyR0YXJnZXRfdHJpcGxldCcgJiYgQ0M9JyRDQycgJiYgLiAkc3JjZGlyLy4uL2NvbmZpZ3VyZS5ob3N0ICYmIGV2YWwgZWNobyBcXCQkdmFybmFtZVwiIiByZXN1bHRdCi0JaWYgJHN0YXR1cyB7IGVycm9yICJFcnJvciBnZXR0aW5nIG5hdGl2ZSBsaW5rIGZpbGVzOiAkcmVzdWx0IiB9Ci0Jc2V0ICR2YXJuYW1lICRyZXN1bHQKLSAgICB9Ci19Ci0KLXByb2MgZ2V0X3RhcmdldF9lbXVsIHt9IHsKLSAgICBnbG9iYWwgdGFyZ2V0X3RyaXBsZXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgc2V0IHN0YXR1cyBbY2F0Y2ggImV4ZWMgc2ggLWMgXCJ0YXJnPSckdGFyZ2V0X3RyaXBsZXQnICYmIC4gJHNyY2Rpci8uLi9jb25maWd1cmUudGd0ICYmIGVjaG8gXFxcJHRhcmdfZW11bFwiIiByZXN1bHRdCi0gICAgaWYgJHN0YXR1cyB7IGVycm9yICJFcnJvciBnZXR0aW5nIGVtdWxhdGlvbiBuYW1lOiAkcmVzdWx0IiB9Ci0gICAgcmV0dXJuICRyZXN1bHQKLX0KLQotaWYgW2lzbmF0aXZlXSB7Ci0gICAgZm9yZWFjaCB4IHtIT1NUSU5HX0NSVDAgSE9TVElOR19MSUJTfSB7Ci0JZ2V0X2xpbmtfZmlsZXMgJHgKLSAgICB9Ci19IGVsc2UgewotICAgIGZvcmVhY2ggeCB7SE9TVElOR19DUlQwIEhPU1RJTkdfTElCU30geyBzZXQgJHggIiIgfQotfQotaWYgIVtpbmZvIGV4aXN0cyBIT1NUSU5HX0VNVV0geyBzZXQgSE9TVElOR19FTVUgIi1tIFtnZXRfdGFyZ2V0X2VtdWxdIiB9Ci0KLSMKLSMgbGRfdmVyc2lvbiAtLSBleHRyYWN0IGFuZCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbGQgY29tcGlsZXIgKEdDQykKLSMKLXByb2MgbGRfdmVyc2lvbiB7fSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZGVmYXVsdF9sZF92ZXJzaW9uICRsZAotfQotCi0jCi0jIGxkX2V4aXQgLS0ganVzdCBhIHN0dWIgZm9yIGxkCi0jCi1wcm9jIGxkX2V4aXQge30gewotfQotCi0jCi0jIGxkX3N0YXJ0IAotIwlyZWxpbmsgdGhlIGxpbmtlcgotIwotcHJvYyBsZF9zdGFydCB7IGxkIHRhcmdldCB9IHsKLQkjCi19Ci0KLSMKLSMgbGRfcmVsb2NhdGUgCi0jCWxpbmsgYW4gb2JqZWN0IHVzaW5nIHJlbG9jYXRpb24KLSMKLXByb2MgbGRfcmVsb2NhdGUgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLQlkZWZhdWx0X2xkX3JlbG9jYXRlICRsZCAkdGFyZ2V0ICRvYmplY3RzCi19Ci0KLSMKLSMgbGRfbGluayAKLSMJbGluayBhIHByb2dyYW0gdXNpbmcgbGQKLSMKLXByb2MgbGRfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotCWRlZmF1bHRfbGRfbGluayAkbGQgJHRhcmdldCAkb2JqZWN0cwotfQotCi0jCi0jIGxkX3NpbXBsZV9saW5rIAotIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZCwgd2l0aG91dCBpbmNsdWRpbmcgYW55IGxpYnJhcmllcwotIwotcHJvYyBsZF9zaW1wbGVfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotCWRlZmF1bHRfbGRfc2ltcGxlX2xpbmsgJGxkICR0YXJnZXQgJG9iamVjdHMKLX0KLQotIwotIyBsZF9jb21waWxlIAotIwljb21waWxlIGFuIG9iamVjdCB1c2luZyAkY2MKLSMKLXByb2MgbGRfY29tcGlsZSB7IGNjIHNvdXJjZSBvYmplY3QgfSB7Ci0JZGVmYXVsdF9sZF9jb21waWxlICRjYyAkc291cmNlICRvYmplY3QgCi19Ci0KLSMKLSMgbGRfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGxkX2Fzc2VtYmxlIHsgYXMgc291cmNlIG9iamVjdCB9IHsKLQlkZWZhdWx0X2xkX2Fzc2VtYmxlICRhcyAkc291cmNlICRvYmplY3QgCi19Ci0KLSMKLSMgbGRfbm0KLSMJcnVuIG5tIG9uIGEgZmlsZQotIwotcHJvYyBsZF9ubSB7IG5tIG9iamVjdCB9IHsKLQlkZWZhdWx0X2xkX25tICRubSAkb2JqZWN0Ci19Ci0KLSMKLSMgbGRfZXhlYwotIwlleGVjdXRlIGl0aGUgdGFyZ2V0Ci0jCi1wcm9jIGxkX2V4ZWMgeyB0YXJnZXQgb3V0cHV0IH0gewotCWRlZmF1bHRfbGRfZXhlYyAkdGFyZ2V0ICRvdXRwdXQKLX0KLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTRiODIwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIExEIEJvb3RzdHJhcCBUZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IEplZmZyZXkgV2hlYXQgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLSMgUmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGxkIGNhbiBib290c3RyYXAgaXRzZWxmLgotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgbGQgZ2VuZXJhdGVzIG5hdGl2ZSBleGVjdXRhYmxlcy4KLWlmICFbaXNuYXRpdmVdIHsKLSAgICByZXR1cm4KLX0KLQotIyBCb290c3RyYXAgbGQuICBGaXJzdCBsaW5rIHRoZSBvYmplY3QgZmlsZXMgdG9nZXRoZXIgdXNpbmcgLXIsIGluCi0jIG9yZGVyIHRvIHRlc3QgLXIuICBUaGVuIGxpbmsgdGhlIHJlc3VsdCBpbnRvIGFuIGV4ZWN1dGFibGUsIGxkMSwgdG8KLSMgcmVhbGx5IHRlc3QgLXIuICBVc2UgbGQxIHRvIGxpbmsgYSBmcmVzaCBsZCwgbGQyLiAgVXNlIGxkMiB0byBsaW5rIGEKLSMgbmV3IGxkLCBsZDMuICBsZDIgYW5kIGxkMyBzaG91bGQgYmUgaWRlbnRpY2FsLgotCi1mb3JlYWNoIGZsYWdzIHsiIiAiLS1zdGF0aWMiICItLXRyYWRpdGlvbmFsLWZvcm1hdCIgIi0tbm8ta2VlcC1tZW1vcnkifSB7Ci0gICAgaWYgeyIkZmxhZ3MiICE9ICIifSB7IAotCXNldCB0ZXN0bmFtZSAiYm9vdHN0cmFwIHdpdGggJGZsYWdzIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHRlc3RuYW1lICJib290c3RyYXAiCi0gICAgfQotCi0gICAgIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIHdlIGhhdmUgdGhlIGxkIGJ1aWxkIGRpcmVjdG9yeSwKLSAgICAjIHNpbmNlIHdlIG5lZWQgdGhlIG9iamVjdCBmaWxlcy4KLSAgICBpZiB7JGxkICE9ICIkb2JqZGlyL2xkLW5ldyJ9IHsKLQl1bnRlc3RlZCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgICMgSWYgd2Ugb25seSBoYXZlIGEgc2hhcmVkIGxpYmJmZCwgd2UgcHJvYmFibHkgY2FuJ3QgcnVuIHRoZQotICAgICMgLS1zdGF0aWMgdGVzdC4KLSAgICBpZiB7ICRmbGFncyA9PSAiLS1zdGF0aWMiICYmICEgW3N0cmluZyBtYXRjaCAiKmxpYmJmZC5hKiIgJEJGRExJQl0gfSB0aGVuIHsKLQl1bnRlc3RlZCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgIGlmICFbbGRfcmVsb2NhdGUgJGxkIHRtcGRpci9sZC1wYXJ0aWFsLm8gIiRmbGFncyAkT0ZJTEVTIl0gewotCWZhaWwgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICAjIE9uIEFJWCwgeW91IG5lZWQgdG8gc3BlY2lmeSBhbiBpbXBvcnQgbGlzdCB3aGVuIHVzaW5nIC0tc3RhdGljLgotICAgICMgWW91IG9ubHkgd2FudCB0aGUgaW1wb3J0IGxpc3Qgd2hlbiBjcmVhdGluZyB0aGUgZmluYWwKLSAgICAjIGV4ZWN1dGFibGUuCi0gICAgaWYgW2lzdGFyZ2V0ICIqLSotYWl4KiJdIHsKLQlpZiB7IiRmbGFncyIgPT0gIi0tc3RhdGljIn0gewotCSAgICBzZXQgZmxhZ3MgIi0tc3RhdGljIC1iSTovbGliL3N5c2NhbGxzLmV4cCIKLQl9Ci0gICAgfQotCi0gICAgIyBPbiBJcml4IDUsIGxpbmtpbmcgd2l0aCAtLXN0YXRpYyBvbmx5IHdvcmtzIGlmIGFsbCB0aGUgZmlsZXMgYXJlCi0gICAgIyBjb21waWxlZCB1c2luZyAtbm9uX3NoYXJlZC4KLSAgICBpZiB7IiRmbGFncyIgPT0gIi0tc3RhdGljIn0gewotCXNldHVwX3hmYWlsICJtaXBzKi0qLWlyaXg1KiIKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2xpbmsgJGxkIHRtcGRpci9sZDEgIiRmbGFncyB0bXBkaXIvbGQtcGFydGlhbC5vICRCRkRMSUIgJExJQklCRVJUWSJdIHsKLQlmYWlsICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgaWYgIVtsZF9saW5rIHRtcGRpci9sZDEgdG1wZGlyL2xkMiAiJGZsYWdzICRPRklMRVMgJEJGRExJQiAkTElCSUJFUlRZIl0gewotCWZhaWwgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2xpbmsgdG1wZGlyL2xkMiB0bXBkaXIvbGQzICIkZmxhZ3MgJE9GSUxFUyAkQkZETElCICRMSUJJQkVSVFkiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgIHNlbmRfbG9nICJjbXAgdG1wZGlyL2xkMiB0bXBkaXIvbGQzXG4iCi0gICAgdmVyYm9zZSAiY21wIHRtcGRpci9sZDIgdG1wZGlyL2xkMyIKLSAgICBjYXRjaCAiZXhlYyBjbXAgdG1wZGlyL2xkMiB0bXBkaXIvbGQzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCi0KLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWJhci5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWJhci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMDBlMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1iYXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyB0ZXN0IHByb2dyYW0gZm9yIENsYXNzIEZvbwotCi0jaW5jbHVkZSAiY2R0ZXN0LWZvby5oIgotCi1zdGF0aWMgRm9vIHN0YXRpY19mb28oICJzdGF0aWNfZm9vIik7IAotCi1Gb28gZigpCi17Ci0gICAgRm9vIHg7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLXZvaWQgZygpCi17Ci0gICAgRm9vIG90aGVyX2ZvbzEgPSBGb28oICJvdGhlcl9mb28xIiksIG90aGVyX2ZvbzIgPSBGb28oICJvdGhlcl9mb28yIik7Ci0gICAgb3RoZXJfZm9vMiA9IG90aGVyX2ZvbzE7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDQxYTkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gQ2xhc3MgRm9vCi0jcHJhZ21hIGltcGxlbWVudGF0aW9uCi0KLQotLy8gV2UgZG9uJ3QgdXNlIGhlYWRlciBmaWxlcywgc2luY2Ugd2Ugb25seSB3YW50IHRvIHNlZSwgd2hldGhlciB0aGUKLS8vIGNvbXBpbGVyIGlzIGluc3RhbGxlZCBwcm9wZXJseS4KLS8vCi0jaWYgKF9fR05VR19fID09IDIpCi10eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKLSNlbmRpZgotCi1leHRlcm4gIkMiIHsKLSAgICBjaGFyICpzdHJuY3B5IChjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBkZXN0LCBzaXplX3QgbGVuKTsKLSAgICBpbnQgcHJpbnRmIChjb25zdCBjaGFyKiwgLi4uKTsKLX07Ci0KLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLWludCBGb286OmZvb3MgPSAwOwotCi12b2lkIEZvbzo6aW5pdF9mb28gKCkKLXsKLSAgICBwcmludGYgKCJCUk9LRU5MWSBjYWxsaW5nIEZvbzo6aW5pdF9mb28gZnJvbSBfX2luaXRfc3RhcnQ7IHNpemVfb2YoRm9vKSA9ICVsZFxuIiwgKGxvbmcpIHNpemVvZihGb28pKTsKLSAgICBmb29zID0gRk9PTElTSF9OVU1CRVI7Ci19Ci0KLQotRm9vOjpGb28gKCkKLXsKLSAgICBpID0gKytmb29zOwotICAgIHN0cm5jcHkgKG1lc3NhZ2UsICJkZWZhdWx0LWZvbyIsIGxlbik7Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICgiQ29uc3RydWN0aW5nIEZvbyglZCkgXCJkZWZhdWx0LWZvb1wiIGF0ICUwOHhcbiIsIGksIHRoaXMpOwotI2Vsc2UKLSAgICBwcmludGYgKCJDb25zdHJ1Y3RpbmcgRm9vKCVkKSBcImRlZmF1bHQtZm9vXCJcbiIsIGkpOwotI2VuZGlmCi19Ci0KLUZvbzo6Rm9vIChjaGFyKiBtc2cpCi17Ci0gICAgaSA9ICsrZm9vczsKLSAgICBzdHJuY3B5KCBtZXNzYWdlLCBtc2csIGxlbik7Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4XG4iLCBpLCBtZXNzYWdlLCB0aGlzKTsKLSNlbHNlCi0gICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIlxuIiwgaSwgbWVzc2FnZSk7Ci0jZW5kaWYKLX0KLQotCi1Gb286OkZvbyAoY29uc3QgRm9vJiBmb28pCi17Ci0gICAgaSA9ICsrZm9vczsKLSNpZmRlZiBXSVRIX0FERFIKLSAgICBwcmludGYgKCJJbml0aWFsaXppbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB3aXRoIEZvbyglZCkgJTA4eFxuIiwgCi0JICAgIGksIGZvby5tZXNzYWdlLCB0aGlzLCBmb28uaSwgJmZvbyk7Ci0jZWxzZQotICAgcHJpbnRmICgiSW5pdGlhbGl6aW5nIEZvbyglZCkgXCIlc1wiIHdpdGggRm9vKCVkKVxuIixpLCBmb28ubWVzc2FnZSwgZm9vLmkpOwotI2VuZGlmCi0gICAgZm9yICggaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotfQotCi0KLUZvbyYgRm9vOjpvcGVyYXRvcj0gKGNvbnN0IEZvbyYgZm9vKQotewotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB0byBGb28oJWQpICUwOHhcbiIsIAotCSAgICBmb28uaSwgZm9vLm1lc3NhZ2UsICZmb28sIGksIHRoaXMpOwotI2Vsc2UKLSAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgdG8gRm9vKCVkKVxuIiwgZm9vLmksIGZvby5tZXNzYWdlLCBpKTsKLSNlbmRpZgotICAgIGZvciAoIGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLQotRm9vOjp+Rm9vICgpCi17Ci0gICAgZm9vcy0tOwotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkRlc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIGF0ICUwOHggKHJlbWFpbmluZyBmb29zOiAlZClcbiIsCi0JICAgIGksIG1lc3NhZ2UsIHRoaXMsIGZvb3MpOwotI2Vsc2UKLSAgICBwcmludGYgKCJEZXN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiAocmVtYWluaW5nIGZvb3M6ICVkKVxuIiwKLQkgICAgaSwgbWVzc2FnZSwgZm9vcyk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5oIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmU1MmEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyBDbGFzcyBGb28KLQotI3ByYWdtYSBpbnRlcmZhY2UKLQotI2RlZmluZSBGT09MSVNIX05VTUJFUiAtNDcxMQotCi0jaWZuZGVmIEZPT19NU0dfTEVOCi0jZGVmaW5lIEZPT19NU0dfTEVOIDgwCi0jZW5kaWYKLSAKLWNsYXNzIEZvbyB7Ci0gICAgc3RhdGljIGludCBmb29zOwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuID0gRk9PX01TR19MRU47Ci0gICAgY2hhciBtZXNzYWdlW2xlbl07Ci1wdWJsaWM6IAotICAgIHN0YXRpYyB2b2lkIGluaXRfZm9vICgpOwotICAgIHN0YXRpYyBpbnQgbmJfZm9vcygpIHsgcmV0dXJuIGZvb3M7IH0KLSAgICBGb28oKTsKLSAgICBGb28oIGNoYXIqIG1lc3NhZ2UpOwotICAgIEZvbyhjb25zdCBGb28mKTsKLSAgICBGb28gJiBvcGVyYXRvcj0gKGNvbnN0IEZvbyYpOwotICAgIH5Gb28gKCk7Ci19OyAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzg4MWRhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBtYWluIHByb2dyYW0gZm9yIENsYXNzIEZvbwotCi1leHRlcm4gIkMiIHsKLS8vIFNvbWUgPGFzc2VydC5oPiBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gU1VOT1MgNC4xKSBhcmUgYnJva2VuLAotLy8gaW4gdGhhdCB0aGV5IHJlcXVpcmUgPHN0ZGlvLmg+LiAgQnV0LCBpZiBnY2MvZysrIGlzIGluc3RhbGxlZAotLy8gY29ycmVjdGx5LCB5b3Ugc2hvdWxkIGdldCBnY2MncyBhc3NlcnQuaC4KLS8vIElmIHRoZSBjb21waWxlIGZhaWxzLCBpdCBtZWFucyB0aGUgd3JvbmcgaW5jbHVkZSBmaWxlcyBhcmUgaW4gdXNlIQotI2luY2x1ZGUgPGFzc2VydC5oPgotfTsKLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLWV4dGVybiAiQyIgdm9pZCBfX2luaXRfc3RhcnQoKTsKLQotZXh0ZXJuIEZvbyBmKHZvaWQpOwotZXh0ZXJuIHZvaWQgZyh2b2lkKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgKm5vdCogYmUgY2FsbGVkIGJ5IHRoZSBlbnZpcm9ubWVudC4gIFRoZXJlIGlzCi0gICBubyB3YXkgaW4gQysrIHRvIGBgcnVuIHNvbWV0aGluZyBhZnRlciB0aGUgaW5pdGlhbGl6ZXJzIGJ1dCBiZWZvcmUgbWFpbigpJycuCi0gICBUaGUgbGlicmFyeSB0aGF0IGRlcGVuZHMgb24gdGhpcyAoTklIQ0wpIGlzIGJyb2tlbi4gIC0tIEpvaG4gR2lsbW9yZSAKLSAgIFdlIGxlYXZlIHRoaXMgaGVyZSB0byB0ZXN0IHRoYXQgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVyCi0gICBkbyBub3QgcmUtaW50cm9kdWNlIHRoaXMgbG9zaW5nIGBgZmVhdHVyZScnLiAgKi8KLXZvaWQgCi1fX2luaXRfc3RhcnQoKQotewotICAgIEZvbzo6aW5pdF9mb28oKTsKLX0KLQotc3RhdGljIEZvbyBzdGF0aWNfZm9vKCAic3RhdGljX2ZvbyIpOyAKLQotaW50IG1haW4oKSAKLXsgCi0gICAgYXNzZXJ0IChGb286Om5iX2Zvb3MoKSA9PSAyKTsKLSAgICBGb28gYXV0b21hdGljX2ZvbyggImF1dG9tYXRpY19mb28iKTsKLSAgICBGb28gYmxhX2ZvbyA9IGYoKTsKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOwotICAgIGcoKTsKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOwotICAgIC8vIGBhdXRvbWF0aWNfZm9vJyBhbmQgYGJsYV9mb28nIGFyZSBkZXN0cnVjdGVkIGhlcmUgCi19IAotIApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWJlMGRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUNvbnN0cnVjdGluZyBGb28oMSkgInN0YXRpY19mb28iCi1Db25zdHJ1Y3RpbmcgRm9vKDIpICJzdGF0aWNfZm9vIgotQ29uc3RydWN0aW5nIEZvbygzKSAiYXV0b21hdGljX2ZvbyIKLUNvbnN0cnVjdGluZyBGb28oNCkgImRlZmF1bHQtZm9vIgotSW5pdGlhbGl6aW5nIEZvbyg1KSAiZGVmYXVsdC1mb28iIHdpdGggRm9vKDQpCi1EZXN0cnVjdGluZyBGb28oNCkgImRlZmF1bHQtZm9vIiAocmVtYWluaW5nIGZvb3M6IDQpCi1Db25zdHJ1Y3RpbmcgRm9vKDUpICJvdGhlcl9mb28xIgotQ29uc3RydWN0aW5nIEZvbyg2KSAib3RoZXJfZm9vMiIKLUNvcHlpbmcgRm9vKDUpICJvdGhlcl9mb28xIiB0byBGb28oNikKLURlc3RydWN0aW5nIEZvbyg2KSAib3RoZXJfZm9vMSIgKHJlbWFpbmluZyBmb29zOiA1KQotRGVzdHJ1Y3RpbmcgRm9vKDUpICJvdGhlcl9mb28xIiAocmVtYWluaW5nIGZvb3M6IDQpCi1EZXN0cnVjdGluZyBGb28oNSkgImRlZmF1bHQtZm9vIiAocmVtYWluaW5nIGZvb3M6IDMpCi1EZXN0cnVjdGluZyBGb28oMykgImF1dG9tYXRpY19mb28iIChyZW1haW5pbmcgZm9vczogMikKLURlc3RydWN0aW5nIEZvbygyKSAic3RhdGljX2ZvbyIgKHJlbWFpbmluZyBmb29zOiAxKQotRGVzdHJ1Y3RpbmcgRm9vKDEpICJzdGF0aWNfZm9vIiAocmVtYWluaW5nIGZvb3M6IDApCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmUzNWUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgY2R0ZXN0IFRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTQsMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IEplZmZyZXkgV2hlYXQgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLSMgUmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGNvbnN0cnVjdG9ycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLXNldCB0ZXN0MSAiY2R0ZXN0Igotc2V0IHRlc3QyICJjZHRlc3Qgd2l0aCAtVXIiCi0KLSMgVGhpcyB0ZXN0IHJlcXVpcmVzIHJ1bm5pbmcgdGhlIGV4ZWN1dGFibGUgZ2VuZXJhdGVkIGJ5IGxkLgotaWYgIVtpc25hdGl2ZV0gewotICAgIHJldHVybgotfQotCi1pZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LWZvby5jYyB0bXBkaXIvY2R0ZXN0LWZvby5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC1iYXIuY2MgdG1wZGlyL2NkdGVzdC1iYXIub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9jZHRlc3QtbWFpbi5jYyB0bXBkaXIvY2R0ZXN0LW1haW4ub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX2xpbmsgJGxkIHRtcGRpci9jZHRlc3Qge3RtcGRpci9jZHRlc3QtZm9vLm8gdG1wZGlyL2NkdGVzdC1iYXIubyB0bXBkaXIvY2R0ZXN0LW1haW4ub31dIHsKLSAgICBmYWlsICR0ZXN0MQotfSBlbHNlIHsKLSAgICBzZW5kX2xvZyAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXRcbiIKLSAgICB2ZXJib3NlICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIKLSAgICBjYXRjaCAiZXhlYyB0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQlmYWlsICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXRcbiIKLQl2ZXJib3NlICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IgotCWNhdGNoICJleGVjIGRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiIGV4ZWNfb3V0cHV0Ci0Jc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3QxCi0JfSBlbHNlIHsKLQkgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkgICAgZmFpbCAkdGVzdDEKLQl9Ci0gICAgfQotfQotCi1pZiAhW2xkX3JlbG9jYXRlICRsZCB0bXBkaXIvY2R0ZXN0Lm8gey1VciB0bXBkaXIvY2R0ZXN0LWZvby5vIHRtcGRpci9jZHRlc3QtYmFyLm8gdG1wZGlyL2NkdGVzdC1tYWluLm99XSB7Ci0gICAgZmFpbCAkdGVzdDIKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9saW5rICRsZCB0bXBkaXIvY2R0ZXN0IHRtcGRpci9jZHRlc3Qub10gewotCWZhaWwgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXRcbiIKLQl2ZXJib3NlICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIKLQljYXRjaCAiZXhlYyB0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIgZXhlY19vdXRwdXQKLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCSAgICBmYWlsICR0ZXN0MgotCX0gZWxzZSB7Ci0JICAgIHNlbmRfbG9nICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0XG4iCi0JICAgIHZlcmJvc2UgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiCi0JICAgIGNhdGNoICJleGVjIGRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiIGV4ZWNfb3V0cHV0Ci0JICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQkJcGFzcyAkdGVzdDIKLQkgICAgfSBlbHNlIHsKLQkJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkJZmFpbCAkdGVzdDIKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9hc20ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZTE3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLnRleHQKLQkuZ2xvYmFsIGZvbwotZm9vOgotCS5sb25nIDB4MTIzNDU2NzgKLQotLmRhdGEKLQkuZ2xvYmFsIGJhcgotYmFyOgotCS5sb25nIDB4ODc2NTQzMjEKLQotCS5sY29tbSBkdW1teSwgMHgxMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZhZmUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvY2hlY2tzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgc2VjdGlvbiBjaGVja3MgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBOaWNrIENsaWZ0b24gKG5pY2tjQGN5Z251cy5jb20pCi0KLXByb2Mgc2VjdGlvbl9jaGVjayB7fSB7Ci0gICAgZ2xvYmFsIGxkX2ZsYWdzCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICAKLSAgICBzZXQgdGVzdCAiY2hlY2sgc2VjdGlvbnMgMSIKLSAgICAKLSAgICBzZXQgbGRmbGFncyAiLS1jaGVjay1zZWN0aW9ucyIKLQotICAgIGlmIHsgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2FzbS5zIHRtcGRpci9hc20ub119IHsKLQl1bnJlc29sdmVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL2FzbS54ICIkbGRmbGFncyB0bXBkaXIvYXNtLm8iXSB7Ci0JZmFpbCAkdGVzdAotICAgIH0gZWxzZSB7Ci0JcGFzcyAkdGVzdAotICAgIH0KLQotICAgIHNldCB0ZXN0ICJjaGVjayBzZWN0aW9ucyAyIgotCi0gICAgIyBDaGFuZ2UgdGhlIGxpbmtlciBmbGFncyBzbyB0aGF0IG91ciAiYnVnZ3kiIGxpbmtlcgotICAgICMgc2NyaXB0IGlzIHVzZWQuCi0gICAgc2V0IGxkZmxhZ3MgIi0tY2hlY2stc2VjdGlvbnMgLVQgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdCAtZSBmb28iCi0KLSAgICAjIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgaW52b2tpbmcgbGRfc2ltcGxlX2xpbmsKLSAgICAjIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWFzc2FnZSB0aGUgb3V0cHV0IGZ1dGhlci4KLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgLW8gdG1wZGlyL2FzbS54ICRsZGZsYWdzIHRtcGRpci9hc20ubyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgICMgTWFrZSBzdXJlIHRoYXQgd2UgZ290IHNvbWUgb3V0cHV0IGZyb20gdGhlIGxpbmtlcgotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICR0ZXN0Ci0gICAgfSAKLQotICAgICMgTm93IHJlbW92ZSBvdXIgZXhwZWN0ZWQgZXJyb3IgbWVzc2FnZQotICAgIHJlZ3N1YiAtYWxsICIuKjogc2VjdGlvbiAuZGF0YSAuKiBvdmVybGFwcyBzZWN0aW9uIC50ZXh0IC4qIiAkZXhlY19vdXRwdXQgIiIgZXhlY19vdXRwdXQKLQotICAgICMgQW5kIGNoZWNrIHRvIHNlZSBpZiBhbnl0aGluZyBlbHNlLCAodW5leHBlY3RlZCkgd2FzIGxlZnQKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICJVbmV4cGVjdGVkIGxpbmtlciBtZXNzYWdlKHMpOiAkZXhlY19vdXRwdXQiCi0JZmFpbCAkdGVzdAotICAgIH0KLX0KLQotc2VjdGlvbl9jaGVjawotCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3Mvc2NyaXB0IGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzZhMDguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNFQ1RJT05TIHsKLSAgICAgICAgLnRleHQgMHgxMDAgOiAgICAgICAgICAgICB7ICooLnRleHQpIH0KLQkuZGF0YSAweDEwMCA6IEFUICgweDEwMCkgIHsgKiguZGF0YSkgfQotCS5ic3MgIDB4MTAwIDogQVQgKDB4NDAwMCkgeyAqKC5ic3MpICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGRmZDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MTQgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzaW9uIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgRXJpYyBZb3VuZ2RhbGUgKGVyaWNAYW5kYW50ZS5qaWMuY29tKQotCi0jCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gdGhlbiB7cmV0dXJufQotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gb24gYSBjb3VwbGUgb2YgRUxGIHBsYXRmb3Jtcy4KLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotIyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRlc3QgdGhhdCBpcyB1c2VkIGluIGxkLXNoYXJlZCwgQlRXLgotaWYgeyAhW2lzdGFyZ2V0IGk/ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgYWxwaGEqLSotbGludXgqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgaT84Ni0qLWxpbnV4YW91dCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGk/ODYtKi1saW51eG9sZGxkKl0gXAotICAgICB8fCBbaXN0YXJnZXQgbTY4ay0qLWxpbnV4YW91dCpdIH0gewotICAgIHJldHVybgotfQotCi1pZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCBkaWZmIGRpZmYKLXNldCB0bXBkaXIgdG1wZGlyCi1zZXQgVk9CSkRVTVBfRkxBR1MgLS1wcml2YXRlLWhlYWRlcnMKLXNldCBET0JKRFVNUF9GTEFHUyAtLWR5bmFtaWMtc3ltcwotc2V0IFNPQkpEVU1QX0ZMQUdTIC0tc3ltcwotc2V0IHNoYXJlZCAtLXNoYXJlZAotc2V0IHNjcmlwdCAtLXZlcnNpb24tc2NyaXB0Ci0KLXByb2MgdGVzdF9hciB7IHRlc3QgbGliIG9iamVjdCBleHBlY3QgfSB7Ci0gICAgZ2xvYmFsIGFyCi0gICAgZ2xvYmFsIG5tCi0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGRpZmYKLQotICAgIHZlcmJvc2UgLWxvZyAiJGFyIC1jciAkdG1wZGlyLyRsaWIgJHRtcGRpci8kb2JqZWN0IgotICAgIGNhdGNoICJleGVjICRhciAtY3IgJHRtcGRpci8kbGliICR0bXBkaXIvJG9iamVjdCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbm0gLS1wcmludC1hcm1hcCAkdG1wZGlyLyRsaWIgfCBncmVwIFwiIGluIFwiIHwgZWdyZXAgXCJWRVJTXFx8YmFyXFx8Zm9vXCIgfCBzb3J0ID4gJHRtcGRpci9ubS5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkbm0gLS1wcmludC1hcm1hcCAkdG1wZGlyLyRsaWIgfCBncmVwIFxcXCBpblxcXCAgfCBlZ3JlcCBWRVJTXFxcfGJhclxcXHxmb28gfCBzb3J0ID4gJHRtcGRpci9ubS5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCWNhdGNoICJleGVjICRkaWZmIC1xICR0bXBkaXIvbm0ub3V0ICRzcmNkaXIvJHN1YmRpci8kZXhwZWN0IiBleGVjX291dHB1dAotCXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQkgICAgcGFzcyAkdGVzdAotCSAgICByZXR1cm4KLQl9IGVsc2UgewotCSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgIiR0ZXN0IgotICAgIH0KLX0KLQotIwotIyBvYmpkdW1wX2VtcHR5c3ltc3R1ZmYKLSMJQ2hlY2sgbm9uLWR5bmFtaWMgc3ltYm9scyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBub25lIHdpdGggJ0AnLgotIwotcHJvYyBvYmpkdW1wX2VtcHR5c3ltc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgU09CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBTT0JKRFVNUF9GTEFHU10geyBzZXQgU09CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkU09CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvXEAvcCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9cQC9wIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSMgV2Ugc2hvdWxkbid0IGdldCBhbnl0aGluZyBoZXJlLgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLSMgaXQgaXMgbm90IG5vcm1hbCB0byBjb21lIGhlcmUgLSB3ZSBoYXZlIG5vIG91dHB1dCB0byBjb21wYXJlLgotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eXN5bXN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKLQlyZXR1cm4gMAotICAgIH0KLQotfQotCi0jCi0jIG9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZgotIwlDaGVjayBkeW5hbWljIHN5bWJvbHMgYW5kIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSB3aXRoICdAJy4KLSMKLXByb2Mgb2JqZHVtcF9lbXB0eWR5bnN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIERPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLQotICAgIGlmICFbaW5mbyBleGlzdHMgVk9CSkRVTVBfRkxBR1NdIHsgc2V0IFZPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSMgV2Ugc2hvdWxkbid0IGdldCBhbnl0aGluZyBoZXJlLgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiKm9iamR1bXA6ICo6IG5vdCBhIGR5bmFtaWMgb2JqZWN0IiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLSMgaXQgaXMgbm90IG5vcm1hbCB0byBjb21lIGhlcmUgLSB3ZSBoYXZlIG5vIG91dHB1dCB0byBjb21wYXJlLgotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eWR5bnN5bXN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKLQlyZXR1cm4gMAotICAgIH0gfQotfQotCi0jCi0jIG9iamR1bXBfZW1wdHl2ZXJzdHVmZgotIwlNYWtlIHN1cmUgdGhlcmUgaXMgbm8gdmVyc2lvbiBpbmZvcm1hdGlvbgotIwotcHJvYyBvYmpkdW1wX2VtcHR5dmVyc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgVk9CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmIHtbd2hpY2ggJG9iamR1bXBdID09IDB9IHRoZW4gewotCXBlcnJvciAiJG9iamR1bXAgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFZPQkpEVU1QX0ZMQUdTXSB7IHNldCBWT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRWT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WZXJzaW9uLyxcXFwkcCA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotIyBpdCBpcyBub3JtYWwgdG8gZmFpbCBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7IGlmIHsgW3N0cmluZyBtYXRjaCAiKmxpYmMqIiAkZXhlY19vdXRwdXRdIH0gdGhlbiB7Ci0jIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGVyZSBpcyB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGxpYmMsIHNvIHdlCi0jIGNhbid0IHJlYWxseSBwZXJmb3JtIHRoaXMgdGVzdC4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JdmVyYm9zZSAtbG9nICJvYmpkdW1wX2VtcHR5dmVyc3R1ZmY6IGRpZCBub3QgZXhwZWN0IGFueSBvdXRwdXQgZnJvbSBvYmpkdW1wIgotCXJldHVybiAwCi0gICAgfSB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX3N5bXN0dWZmCi0jCUR1bXAgbm9uLWR5bmFtaWMgc3ltYm9sIHN0dWZmIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgotIwotcHJvYyBvYmpkdW1wX3N5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgZXhwZWN0ZmlsZSB9IHsKLSAgICBnbG9iYWwgU09CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmICFbaW5mbyBleGlzdHMgU09CSkRVTVBfRkxBR1NdIHsgc2V0IFNPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBncmVwIFxAIHwgc29ydCAgPiAkdG1wZGlyL29iamR1bXAub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBncmVwIFxAIHwgc29ydCAgPiAkdG1wZGlyL29iamR1bXAub3V0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotIyBOb3cgZG8gYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiB0byBlZmZlY3RpdmVseSBkaWZmIHRoZSBkYXJuZWQgdGhpbmdzCi0jIFRoZSBzdHVmZiBjb21pbmcgZnJvbSB0aGUgZXhwZWN0ZmlsZSBpcyBhY3R1YWxseSBhIHJlZ2V4LCBzbyB3ZSBjYW4KLSMgc2tpcCBvdmVyIHRoZSBhY3R1YWwgYWRkcmVzc2VzIGFuZCBzbyBmb3J0aC4gIFRoaXMgaXMgY3VycmVudGx5IHZlcnkKLSMgc2ltcGxlbWluZGVkIC0gaXQgZXhwZWN0cyBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgaW4gdGVybXMgb2YgbGluZQotIyBudW1iZXJzLgotCi0JaWYgW2ZpbGUgZXhpc3RzICRleHBlY3RmaWxlXSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYSBbb3BlbiAkZXhwZWN0ZmlsZSByXQotCX0gZWxzZSB7Ci0JICAgIHBlcnJvciAiJGV4cGVjdGZpbGUgZG9lc24ndCBleGlzdCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgW2ZpbGUgZXhpc3RzICR0bXBkaXIvb2JqZHVtcC5vdXRdIHRoZW4gewotCSAgICBzZXQgZmlsZV9iIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQl9IGVsc2UgewotCSAgICBwZXJyb3IgIiR0bXBkaXIvb2JqZHVtcC5vdXQgZG9lc24ndCBleGlzdCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0KLQl2ZXJib3NlICIjIERpZmYnaW5nOiAkZXhwZWN0ZmlsZSAkdG1wZGlyL29iamR1bXAub3V0IiAyCi0KLQlzZXQgZW9mIC0xCi0Jc2V0IGRpZmZlcmVuY2VzIDAKLQotCXdoaWxlIHsgW2dldHMgJGZpbGVfYSBsaW5lXSAhPSAkZW9mIH0gewotCSAgICBpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQlsYXBwZW5kIGxpc3RfYSAkbGluZQotCSAgICB9Ci0JfQotCWNsb3NlICRmaWxlX2EKLQotCXdoaWxlIHsgW2dldHMgJGZpbGVfYiBsaW5lXSAhPSAkZW9mIH0gewotCSAgICBpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQlsYXBwZW5kIGxpc3RfYiAkbGluZQotCSAgICB9Ci0JfQotCWNsb3NlICRmaWxlX2IKLQkKLQlmb3IgeyBzZXQgaSAwIH0geyAkaSA8IFtsbGVuZ3RoICRsaXN0X2FdIH0geyBpbmNyIGkgfSB7Ci0JICAgIHNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRpXQotCSAgICBzZXQgbGluZV9iIFtsaW5kZXggJGxpc3RfYiAkaV0KLQkgICAgCi0KLQkgICAgdmVyYm9zZSAiXHQkZXhwZWN0ZmlsZTogJGk6ICRsaW5lX2EiIDMKLQkgICAgdmVyYm9zZSAiXHQvdG1wL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIgMwotCSAgICBpZiBbcmVnZXhwICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCXZlcmJvc2UgLWxvZyAiXHQkZXhwZWN0ZmlsZTogJGk6ICRsaW5lX2EiCi0JCXZlcmJvc2UgLWxvZyAiXHQkdG1wZGlyL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIKLQkJCi0JCXJldHVybiAwCi0JICAgIH0KLQl9Ci0JCi0JaWYgeyBbbGxlbmd0aCAkbGlzdF9hXSAhPSBbbGxlbmd0aCAkbGlzdF9iXSB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICJMaW5lIGNvdW50IgotCSAgICByZXR1cm4gMAotCX0KLQkKLQlpZiAkZGlmZmVyZW5jZXM8MSB0aGVuIHsKLQkgICAgcmV0dXJuIDEKLQl9Ci0JCi0JcmV0dXJuIDAKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotCi19Ci0KLSMKLSMgb2JqZHVtcF9keW1zeW1zdHVmZgotIwlEdW1wIGR5bmFtaWMgc3ltYm9sIHN0dWZmIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgotIwotcHJvYyBvYmpkdW1wX2R5bnN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgZXhwZWN0ZmlsZSB9IHsKLSAgICBnbG9iYWwgRE9CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmICFbaW5mbyBleGlzdHMgRE9CSkRVTVBfRkxBR1NdIHsgc2V0IERPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIHwgc29ydCB8IHVuaXEgID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCB8IHNvcnQgfCB1bmlxICA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCi0jIE5vdyBkbyBhIGxpbmUtYnktbGluZSBjb21wYXJpc29uIHRvIGVmZmVjdGl2ZWx5IGRpZmYgdGhlIGRhcm5lZCB0aGluZ3MKLSMgVGhlIHN0dWZmIGNvbWluZyBmcm9tIHRoZSBleHBlY3RmaWxlIGlzIGFjdHVhbGx5IGEgcmVnZXgsIHNvIHdlIGNhbgotIyBza2lwIG92ZXIgdGhlIGFjdHVhbCBhZGRyZXNzZXMgYW5kIHNvIGZvcnRoLiAgVGhpcyBpcyBjdXJyZW50bHkgdmVyeQotIyBzaW1wbGVtaW5kZWQgLSBpdCBleHBlY3RzIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBpbiB0ZXJtcyBvZiBsaW5lCi0jIG51bWJlcnMuCi0KLQlpZiBbZmlsZSBleGlzdHMgJGV4cGVjdGZpbGVdIHRoZW4gewotCSAgICBzZXQgZmlsZV9hIFtvcGVuICRleHBlY3RmaWxlIHJdCi0JfSBlbHNlIHsKLQkgICAgd2FybmluZyAiJGV4cGVjdGZpbGUgZG9lc24ndCBleGlzdCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgW2ZpbGUgZXhpc3RzICR0bXBkaXIvb2JqZHVtcC5vdXRdIHRoZW4gewotCSAgICBzZXQgZmlsZV9iIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQl9IGVsc2UgewotCSAgICBmYWlsICIkdG1wZGlyL29iamR1bXAub3V0IGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCi0JdmVyYm9zZSAiIyBEaWZmJ2luZzogJGV4cGVjdGZpbGUgJHRtcGRpci9vYmpkdW1wLm91dCIgMgotCi0Jc2V0IGVvZiAtMQotCXNldCBkaWZmZXJlbmNlcyAwCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2EgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9hCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2IgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2IgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9iCi0JCi0JZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9iXSB9IHsgaW5jciBpIH0gewotCSAgICBzZXQgbGluZV9iIFtsaW5kZXggJGxpc3RfYiAkaV0KLQkgICAgCi0jIFRoZSB0ZXN0cyBhcmUgcmlnZ2VkIHNvIHRoYXQgd2Ugc2hvdWxkIG5ldmVyIGV4cG9ydCBhIHN5bWJvbCB3aXRoIHRoZQotIyB3b3JkICdoaWRlJyBpbiBpdC4gIFRodXMgd2UganVzdCBzZWFyY2ggZm9yIGl0LCBhbmQgYmFpbCBpZiB3ZSBmaW5kIGl0LgotCSAgICBpZiBbcmVnZXhwICJoaWRlIiAkbGluZV9iXSB0aGVuIHsKLQkJdmVyYm9zZSAtbG9nICJcdCR0bXBkaXIvb2JqZHVtcC5vdXQ6ICRpOiAkbGluZV9iIgotCQkKLQkJcmV0dXJuIDAKLQkgICAgfQotCi0JICAgIHZlcmJvc2UgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9iIiAzCi0KLQkgICAgIyBXZSBjYW4ndCBhc3N1bWUgdGhhdCB0aGUgc29ydCBpcyBjb25zaXN0ZW50IGFjcm9zcwotCSAgICAjIHN5c3RlbXMsIHNvIHdlIG11c3QgY2hlY2sgZWFjaCByZWdleHAuICBXaGVuIHdlIGZpbmQgYQotCSAgICAjIHJlZ2V4cCwgd2UgbnVsbCBpdCBvdXQsIHNvIHdlIGRvbid0IG1hdGNoIGl0IHR3aWNlLgotCSAgICBmb3IgeyBzZXQgaiAwIH0geyAkaiA8IFtsbGVuZ3RoICRsaXN0X2FdIH0geyBpbmNyIGogfSB7Ci0JCXNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRqXQotCi0JCWlmIFtyZWdleHAgJGxpbmVfYSAkbGluZV9iXSB0aGVuIHsKLQkJICAgIGxyZXBsYWNlICRsaXN0X2EgJGogJGogIkNBTiBOT1QgTUFUQ0giCi0JCSAgICBicmVhawotCQl9Ci0JICAgIH0KLQotCSAgICBpZiB7ICRqID49IFtsbGVuZ3RoICRsaXN0X2FdIH0gewotCQl2ZXJib3NlIC1sb2cgIlx0JHRtcGRpci9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiCi0JCQotCQlyZXR1cm4gMAotCSAgICB9Ci0JfQotCQotCWlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiTGluZSBjb3VudCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgJGRpZmZlcmVuY2VzPDEgdGhlbiB7Ci0JICAgIHJldHVybiAxCi0JfQotCQotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLQotfQotCi0jCi0jIG9iamR1bXBfdmVyc2lvbnN0dWZmCi0jCUR1bXAgdmVyc2lvbiBkZWZpbml0aW9ucy9yZWZlcmVuY2VzIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgotIwotcHJvYyBvYmpkdW1wX3ZlcnNpb25zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7Ci0gICAgZ2xvYmFsIFZPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRvYmpkdW1wIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBWT0JKRFVNUF9GTEFHU10geyBzZXQgVk9CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAgPiAkdG1wZGlyL29iamR1bXAub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwID4gJHRtcGRpci9vYmpkdW1wLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0KLQkjIEl0J3MgT0sgaWYgdGhlcmUgYXJlIGV4dHJhIGxpbmVzIGluIHRoZSBhY3R1YWwgb3V0cHV0OyB0aGV5Ci0JIyBtYXkgY29tZSBmcm9tIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gbGliYy4gIFdlIHJlcXVpcmUgdGhhdAotCSMgZXZlcnkgbGluZSBpbiBFWFBFQ1RGSUxFIGFwcGVhciBpbiB0aGUgb3V0cHV0IGluIG9yZGVyLgotCi0Jc2V0IGYxIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQlzZXQgZjIgW29wZW4gJGV4cGVjdGZpbGUgcl0KLQlnZXRzICRmMiBsMgotCXdoaWxlIHsgW2dldHMgJGYxIGwxXSAhPSAtMSB9IHsKLQkgICAgaWYgeyBbc3RyaW5nIG1hdGNoICRsMiAkbDFdIH0gdGhlbiB7Ci0JCWlmIHsgW2dldHMgJGYyIGwyXSA9PSAtMSB9IHRoZW4gewotCQkgICAgY2xvc2UgJGYxCi0JCSAgICBjbG9zZSAkZjIKLQkJICAgIHJldHVybiAxCi0JCX0KLQkgICAgfQotCX0KLQotCSMgV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgd2l0aG91dCBzZWVpbmcgdGhlIGxpbmUgd2UKLQkjIGV4cGVjdGVkLiAgVGhpcyBpcyBhIHRlc3QgZmFpbHVyZS4KLQotCWNsb3NlICRmMQotCWNsb3NlICRmMgotCi0JdmVyYm9zZSAtbG9nICJEaWQgbm90IGZpbmQgXCIkbDJcIiIKLQlzZXQgZjEgW29wZW4gJHRtcGRpci9vYmpkdW1wLm91dCByXQotCXdoaWxlIHsgW2dldHMgJGYxIGwxXSAhPSAtMSB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICRsMQotCX0KLQotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotcHJvYyBidWlsZF92ZXJzX2xpYiB7IHRlc3Qgc291cmNlIGxpYm5hbWUgb3RoZXIgbWFwZmlsZSB2ZXJleHAgdmVyc3ltZXhwIHN5bWV4cCB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0gICAgZ2xvYmFsIHNoYXJlZAotICAgIGdsb2JhbCBzY3JpcHQKLQotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGxpYm5hbWUuc10gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAhW2xkX2Fzc2VtYmxlICRhcyAkdG1wZGlyLyRsaWJuYW1lLnMgJHRtcGRpci8kbGlibmFtZS5vIF0gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRvdGhlcl0gdGhlbiB7Ci0Jc2V0IG90aGVyX2xpYiAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IG90aGVyX2xpYiAkdG1wZGlyLyRvdGhlcgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJG1hcGZpbGVdIHRoZW4gewotCXNldCBzY3JpcHRfYXJnICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgc2NyaXB0X2FyZyAiJHNjcmlwdCAkc3JjZGlyLyRzdWJkaXIvJG1hcGZpbGUiCi0gICAgfQotCi0gICAgaWYgeyFbbGRfc2ltcGxlX2xpbmsgJGxkICR0bXBkaXIvJGxpYm5hbWUuc28gIiRzaGFyZWQgJHRtcGRpci8kbGlibmFtZS5vICRvdGhlcl9saWIgJHNjcmlwdF9hcmciXX0gICAgIHsKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiB7IVtvYmpkdW1wX3ZlcnNpb25zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyc3ltZXhwIF19ICAgICB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkc3ltZXhwXSB0aGVuIHsKLQlpZiB7IVtvYmpkdW1wX2VtcHR5c3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5vIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiB7IVtvYmpkdW1wX3N5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUubyAkc3JjZGlyLyRzdWJkaXIvJHN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIHBhc3MgJHRlc3QKLSAgICAKLX0KLQotcHJvYyB0ZXN0X2xkZmFpbCB7IHRlc3QgZmxhZyBzb3VyY2UgZXhlY25hbWUgb3RoZXIgbWFwZmlsZSB3aHlmYWlsIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgb2JqZHVtcAotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBDRkxBR1MKLSAgICBnbG9iYWwgc2NyaXB0Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRvdGhlcl0gdGhlbiB7Ci0Jc2V0IG90aGVyX2xpYiAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IG90aGVyX2xpYiAkdG1wZGlyLyRvdGhlcgotICAgIH0KLQotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRmbGFnICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kZXhlY25hbWUucyAkdG1wZGlyLyRleGVjbmFtZS5vIF0gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIlRoaXMgbGluayBzaG91bGQgZmFpbCBiZWNhdXNlIG9mICR3aHlmYWlsIgotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkbWFwZmlsZV0gdGhlbiB7Ci0Jc2V0IHNjcmlwdF9hcmcgIiIKLSAgICB9IGVsc2UgewotCXNldCBzY3JpcHRfYXJnICIkc2NyaXB0ICRzcmNkaXIvJHN1YmRpci8kbWFwZmlsZSIKLSAgICB9Ci0KLSAgICBpZiB7IVtsZF9saW5rICRsZCAkdG1wZGlyLyRleGVjbmFtZSAiJHRtcGRpci8kZXhlY25hbWUubyAkb3RoZXJfbGliICRzY3JpcHRfYXJnIl19ICAgICB7Ci0JcGFzcyAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIGZhaWwgIiR0ZXN0IgotfQotCi1wcm9jIHRlc3RfYXNmYWlsIHsgdGVzdCBmbGFnIHNvdXJjZSBleGVjbmFtZSB3aHlmYWlsIH0gewotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBDRkxBR1MKLQotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRmbGFnICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICJUaGlzIGFzc2VtYmxlIHNob3VsZCBmYWlsIGJlY2F1c2Ugb2YgJHdoeWZhaWwiCi0gICAgY2F0Y2ggImV4ZWMgJGFzIC1vICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHRtcGRpci8kZXhlY25hbWUucyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotICAgIHBhc3MgIiR0ZXN0IgotfQotCi1wcm9jIHRlc3Rfc3RyaXBfdmVyc19saWIgeyB0ZXN0IHNyY2xpYiBsaWJuYW1lIHZlcmV4cCB2ZXJzeW1leHAgfSB7Ci0gICAgZ2xvYmFsIHN0cmlwCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBvYmpkdW1wCi0KLSAgICB2ZXJib3NlIC1sb2cgImNwICR0bXBkaXIvJHNyY2xpYiAkdG1wZGlyLyRsaWJuYW1lLnNvIgotICAgIGV4ZWMgY3AgJHRtcGRpci8kc3JjbGliICR0bXBkaXIvJGxpYm5hbWUuc28KLQotICAgIHZlcmJvc2UgLWxvZyAiJHN0cmlwICR0bXBkaXIvJGxpYm5hbWUuc28iCi0gICAgY2F0Y2ggImV4ZWMgJHN0cmlwICR0bXBkaXIvJGxpYm5hbWUuc28iIGV4ZWNfb3V0cHV0Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCi0jIElmIHN0cmlwIHdlbnQgT0ssIHRoZW4gcnVuIHRoZSB1c3VhbCB0ZXN0cyBvbiB0aGUgdGhpbmcgdG8gbWFrZSBzdXJlIHRoYXQKLSMgaXQgaXMgc2FuZS4KLQlpZiB7IVtvYmpkdW1wX3ZlcnNpb25zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0JCi0JaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyc3ltZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0JCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgcGFzcyAkdGVzdAotfQotCi0KLXByb2MgYnVpbGRfZXhlYyB7IHRlc3Qgc291cmNlIGV4ZWNuYW1lIGZsYWdzIHNvbGlibmFtZSB2ZXJleHAgdmVyc3ltZXhwIHN5bWV4cCB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0KLSAgICBzZXQgc2hhcmVkIC0tc2hhcmVkCi0gICAgc2V0IHNjcmlwdCAtLXZlcnNpb24tc2NyaXB0Ci0gICAgaWYgIVtsZF9jb21waWxlICIkQ0MgLVMgJENGTEFHUyIgJHNyY2Rpci8kc3ViZGlyLyRzb3VyY2UgJHRtcGRpci8kZXhlY25hbWUuc10gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAhW2xkX2Fzc2VtYmxlICRhcyAkdG1wZGlyLyRleGVjbmFtZS5zICR0bXBkaXIvJGV4ZWNuYW1lLm8gXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHNvbGlibmFtZV0gdGhlbiB7Ci0Jc2V0IHNvbGlibmFtZV9saWIgIiIKLSAgICB9IGVsc2UgewotCXNldCBzb2xpYm5hbWVfbGliICR0bXBkaXIvJHNvbGlibmFtZQotICAgIH0KLQotICAgIGlmIHshW2xkX2xpbmsgJGxkICR0bXBkaXIvJGV4ZWNuYW1lICIkZmxhZ3MgJHRtcGRpci8kZXhlY25hbWUubyAkc29saWJuYW1lX2xpYiJdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHZlcmV4cF0gdGhlbiB7Ci0jCi0jIE1ha2Ugc3VyZSB3ZSBnZXQgbm90aGluZyBiYWNrLgotIwotCWlmIHshW29iamR1bXBfZW1wdHl2ZXJzdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgJHNyY2Rpci8kc3ViZGlyLyR2ZXJleHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICR2ZXJzeW1leHBdIHRoZW4gewotCWlmIHshW29iamR1bXBfZW1wdHlkeW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHN5bWV4cF0gdGhlbiB7Ci0JaWYgeyFbb2JqZHVtcF9lbXB0eXN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lLm8gXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUubyAkc3JjZGlyLyRzdWJkaXIvJHN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIHBhc3MgJHRlc3QKLX0KLQotCi0jCi0jIEJhc2ljIHRlc3QgLSBidWlsZCBhIGxpYnJhcnkgd2l0aCB2ZXJzaW9uZWQgc3ltYm9scy4KLSMKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzMSIgdmVyczEuYyB2ZXJzMSAiIiB2ZXJzMS5tYXAgdmVyczEudmVyIHZlcnMxLmRzeW0gdmVyczEuc3ltCi0KLQotIwotIyBUZXN0ICMyIC0gYnVpbGQgYSBsaWJyYXJ5LCBhbmQgbGluayBpdCBhZ2FpbnN0IHRoZSBsaWJyYXJ5IHdlIGJ1aWx0IGluIHN0ZXAKLSMgMS4KLSMKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzMiIgdmVyczIuYyB2ZXJzMiB2ZXJzMS5zbyB2ZXJzMi5tYXAgdmVyczIudmVyIHZlcnMyLmRzeW0gIiIKLQotIwotIyBUZXN0ICMzIC0gYnVpbGQgYW4gZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgYWdhaW5zdCB2ZXJzMS5zby4KLSMKLWJ1aWxkX2V4ZWMgInZlcnMzIiB2ZXJzMy5jIHZlcnMzICIiIHZlcnMxLnNvIHZlcnMzLnZlciB2ZXJzMy5kc3ltICIiCi0KLSMKLSMgVGVzdCAjNCAtIE1ha2Ugc3VyZSBhIHZlcnNpb24gaW1wbGljaXRseSBkZWZpbmVkIGluIGFuIGV4ZWN1dGFibGUKLSMgY2F1c2VzIGEgdmVyc2lvbiBub2RlIHRvIGJlIGNyZWF0ZWQuICBWZXJpZnkgdGhpcyBib3RoIHdpdGggYW5kIHdpdGhvdXQKLSMgLS1leHBvcnQtZHluYW1pYy4KLSMKLQotIyBUaGlzIHRlc3QgZmFpbHMgb24gTUlQUy4gIE9uIHRoZSBNSVBTIHdlIG11c3QgcHV0IGZvbyBpbiB0aGUgZHluYW1pYwotIyBzeW1ib2wgdGFibGUsIHdoaWNoIHRoZSB0ZXN0IGRvZXMgbm90IGV4cGVjdC4KLXNldHVwX3hmYWlsICJtaXBzKi0qLSoiCi1idWlsZF9leGVjICJ2ZXJzNCIgdmVyczQuYyB2ZXJzNCAiIiAiIiAiIiAiIiB2ZXJzNC5zeW0KLQotYnVpbGRfZXhlYyAidmVyczRhIiB2ZXJzNC5jIHZlcnM0YSAiLWV4cG9ydC1keW5hbWljIiAiIiB2ZXJzNGEudmVyIHZlcnM0YS5kc3ltIHZlcnM0YS5zeW0KLQotCi0jCi0jIFRyeSBtdWx0aXBsZSBkZWZpbml0aW9ucyBmb29AQkFSIGFuZCBmb29AQEJBUiBhbmQgbWFrZSBzdXJlIHRoZSBsaW5rZXIKLSMgY29tcGxhaW5zLgotIwotdGVzdF9sZGZhaWwgInZlcnM1IiAiIiB2ZXJzNS5jIHZlcnM1ICIiICIiICJtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGZvb0BWRVJTXzEuMiIKLQotIwotIwotIyBOb3cgYnVpbGQgYSB0ZXN0IHRoYXQgc2hvdWxkIHJlZmVyZW5jZSBhIGJ1bmNoIG9mIHZlcnNpb25lZCBzeW1ib2xzLgotIyBBbGwgb2YgdGhlbSBzaG91bGQgYmUgY29ycmVjdGx5IHJlZmVyZW5jZWQuCi0jCi1idWlsZF9leGVjICJ2ZXJzNiIgdmVyczYuYyB2ZXJzNiAiIiB2ZXJzMS5zbyB2ZXJzNi52ZXIgdmVyczYuZHN5bSB2ZXJzNi5zeW0KLQotIwotIyBBbm90aGVyIHRlc3QgdG8gdmVyaWZ5IHRoYXQgc29tZXRoaW5nIG1hZGUgbG9jYWwgdmlhICdsb2NhbCcgaXMgdHJ1bHkgbm90Ci0jIGFjY2Vzc2libGUuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczdhIiB2ZXJzN2EuYyB2ZXJzN2EgIiIgdmVyczcubWFwIHZlcnM3YS52ZXIgdmVyczdhLmRzeW0gdmVyczdhLnN5bQotCi10ZXN0X2xkZmFpbCAidmVyczciICIiIHZlcnM3LmMgdmVyczcgdmVyczdhLnNvICIiICJ1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGhpZGVfYSIKLQotCi0jCi0jIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byB2ZXJpZnkgdGhhdCB3ZSBjYW4gcGFzcyBhIGxpbmtlciBzY3JpcHQgb24gdGhlCi0jIGNvbW1hbmQgbGluZSBhcyBpZiBpdCB3ZXJlIGEgbm9ybWFsIC5vIGZpbGUuCi0jCi1jYXRjaCAiZXhlYyBjcCAkc3JjZGlyLyRzdWJkaXIvdmVyczgubWFwICR0bXBkaXIvIiBpZ25vcmVfb3V0cHV0Ci1idWlsZF92ZXJzX2xpYiAidmVyczgiIHZlcnMxLmMgdmVyczggdmVyczgubWFwICIiIHZlcnM4LnZlciB2ZXJzMS5kc3ltIHZlcnMxLnN5bQotCi0jCi0jIFRoaXMgdGVzdCB0cmllcyB0byBtYWtlIHN1cmUgdGhhdCB2ZXJzaW9uIHJlZmVyZW5jZXMgdG8gdmVyc2lvbmVkIHN5bWJvbHMKLSMgZG9uJ3QgY29sbGlkZSB3aXRoIGRlZmF1bHQgZGVmaW5pdGlvbnMgd2l0aCB0aGUgc2FtZSBzeW1ib2wuCi0jCi1idWlsZF9leGVjICJ2ZXJzOSIgdmVyczkuYyB2ZXJzOSAiLWV4cG9ydC1keW5hbWljIiAiIiB2ZXJzOS52ZXIgdmVyczkuZHN5bSB2ZXJzOS5zeW0KLQotCi0jCi0jIFRyeSBhbmQgdXNlIGEgbm9uLWV4aXN0YW50IHZlcnNpb24gbm9kZS4gIFRoZSBsaW5rZXIgc2hvdWxkIGZhaWwgd2l0aAotIyBhbiBlcnJvciBtZXNzYWdlLgotIwotdGVzdF9sZGZhaWwgInZlcnMxMCIgIi1ERE9fVEVTVDEwIiB2ZXJzMS5jIHZlcnMxMCAiIiAidmVyczEubWFwIC0tc2hhcmVkIiAiaW52YWxpZCB2ZXJzaW9uIgotCi0jCi0jIFRyeSBhbmQgc29tZSB0aGluZ3MgdGhlIGFzc2VtYmxlciBzaG91bGQgY29tcGxhaW4gYWJvdXQuCi0jCi10ZXN0X2FzZmFpbCAidmVyczExIiAiLURET19URVNUMTEiIHZlcnMxLmMgdmVyczExICJubyBAIGluIHN5bXZlciIKLQotdGVzdF9hc2ZhaWwgInZlcnMxMiIgIi1ERE9fVEVTVDEyIiB2ZXJzMS5jIHZlcnMxMiAiZXh0ZXJuIHZlcnNpb24gZGVmaW5pdGlvbiIKLQotIwotIyBQdXQgYSBzaGFyZWQgbGlicmFyeSBpbiBhbiBhcmNoaXZlIGxpYnJhcnksIGFuZCBtYWtlIHN1cmUgdGhlIGdsb2JhbAotIyBhcmNoaXZlIHN5bWJvbCB0YWJsZSBpcyBzYW5lLgotIwotdGVzdF9hciAiYXIgd2l0aCB2ZXJzaW9uZWQgc29saWIiIHZlcnMxMy5hIHZlcnMxLnNvIHZlcnMxMy5hc3ltCi0KLSMKLSMgU3RyaXAgYSBzaGFyZWQgbGlicmFyeSwgYW5kIG1ha2Ugc3VyZSB3ZSBkaWRuJ3Qgc2NyZXcgc29tZXRoaW5nIHVwIGluIHRoZXJlLgotIwotdGVzdF9zdHJpcF92ZXJzX2xpYiAidmVyczE0IiB2ZXJzMS5zbyB2ZXJzMTQgdmVyczEudmVyIHZlcnMxLmRzeW0gCi0KLQotIwotIyBCdWlsZCBhbm90aGVyIHRlc3Qgd2l0aCBzb21lIHZlcnNpb25lZCBzeW1ib2xzLiAgSGVyZSB3ZSBhcmUgZ29pbmcgdG8gCi0jIHRyeSBhbmQgb3ZlcnJpZGUgc29tZXRoaW5nIGZyb20gdGhlIGxpYnJhcnksIGFuZCB3ZSBzaG91bGRuJ3QgZ2V0Ci0jIGFueSBlcnJvcnMuCi0jCi1idWlsZF9leGVjICJ2ZXJzMTUiIHZlcnMxNS5jIHZlcnMxNSAiIiB2ZXJzMS5zbyB2ZXJzMTUudmVyIHZlcnMxNS5kc3ltIHZlcnMxNS5zeW0KLQotIwotIyBUZXN0IHRoYXQgd2hlbiB3ZSBvdmVycmlkZSBhIHZlcnNpb25lZCBzeW1ib2wgZnJvbSB0aGUgbGlicmFyeSB0aGlzCi0jIHN5bWJvbCBhcHBlYXJzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiB0aGUgZXhlY3V0YWJsZS4KLSMKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzMTZhIiB2ZXJzMTZhLmMgdmVyczE2YSAiIiB2ZXJzMTYubWFwIHZlcnMxNmEudmVyIHZlcnMxNmEuZHN5bSAiIgotYnVpbGRfZXhlYyAidmVyczE2IiB2ZXJzMTYuYyB2ZXJzMTYgIiIgdmVyczE2YS5zbyAiIiB2ZXJzMTYuZHN5bSAiIgotCi0jIFRlc3QgYSB3ZWFrIHZlcnNpb25lZCBzeW1ib2wuCi1idWlsZF92ZXJzX2xpYiAidmVyczE3IiB2ZXJzMTcuYyB2ZXJzMTcgIiIgdmVyczE3Lm1hcCB2ZXJzMTcudmVyIHZlcnMxNy5kc3ltICIiCi1idWlsZF92ZXJzX2xpYiAidmVyczE4IiB2ZXJzMTguYyB2ZXJzMTggdmVyczE3LnNvIHZlcnMxOC5tYXAgdmVyczE4LnZlciB2ZXJzMTguZHN5bSB2ZXJzMTguc3ltCi1idWlsZF9leGVjICJ2ZXJzMTkiIHZlcnMxOS5jIHZlcnMxOSAiLXJwYXRoIC4iIHZlcnMxOC5zbyB2ZXJzMTkudmVyIHZlcnMxOS5kc3ltICIiCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3YmMzYi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBCYXNpYyB0ZXN0IG9mIHZlcnNpb25pbmcuICBUaGUgaWRlYSB3aXRoIHRoaXMgaXMgdGhhdCB3ZSBkZWZpbmUKLSAqIGEgYnVuY2ggb2YgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgc3ltYm9sLCBhbmQgd2UgY2FuIHRoZW9yZXRpY2FsbHkKLSAqIHRoZW4gbGluayBhcHBsaWNhdGlvbnMgYWdhaW5zdCB2YXJ5aW5nIHNldHMgb2YgdGhlc2UuCi0gKi8KLWNvbnN0IGNoYXIgKiBzaG93X2JhcjEgPSAiYXNkZiI7Ci1jb25zdCBjaGFyICogc2hvd19iYXIyID0gImFzZGYiOwotCi1leHRlcm4gaW50IG5ldzJfZm9vKCk7Ci1leHRlcm4gaW50IGJhcjMzKCk7Ci0KLWludAotYmFyKCkKLXsKLQlyZXR1cm4gMzsKLX0KLQotLyoKLSAqIFRoZSAnaGlkZScgcHJlZml4IGlzIHNvbWV0aGluZyBzbyB0aGF0IHdlIGNhbiBhdXRvbWF0aWNhbGx5IHNlYXJjaCB0aGUKLSAqIHN5bWJvbCB0YWJsZSBhbmQgdmVyaWZ5IHRoYXQgbm9uZSBvZiB0aGVzZSBzeW1ib2xzIHdlcmUgYWN0dWFsbHkgZXhwb3J0ZWQuCi0gKi8KLWludAotaGlkZV9vcmlnaW5hbF9mb28oKQotewotCXJldHVybiAxK2JhcigpOwotCi19Ci0KLWludAotaGlkZV9vbGRfZm9vKCkKLXsKLQlyZXR1cm4gMTArYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX29sZF9mb28xKCkKLXsKLQlyZXR1cm4gMTAwK2JhcigpOwotCi19Ci0KLWludAotaGlkZV9uZXdfZm9vKCkKLXsKLQlyZXR1cm4gMTAwMCtiYXIoKTsKLQotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb3JpZ2luYWxfZm9vLHNob3dfZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28sc2hvd19mb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vbGRfZm9vMSxzaG93X2Zvb0BWRVJTXzEuMiIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX25ld19mb28sc2hvd19mb29AQFZFUlNfMi4wIik7Ci0KLQotCi0jaWZkZWYgRE9fVEVTVDEwCi0vKiBJbiB0ZXN0IDEwLCB3ZSB0cnkgYW5kIGRlZmluZSBhIG5vbi1leGlzdGFudCB2ZXJzaW9uIG5vZGUuICBUaGUgbGlua2VyCi0gKiBzaG91bGQgY2F0Y2ggdGhpcyBhbmQgY29tcGxhaW4uICovCi1pbnQKLWhpZGVfbmV3X2JvZ3VzX2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9uZXdfYm9ndXNfZm9vLHNob3dfZm9vQFZFUlNfMi4yIik7Ci0jZW5kaWYKLQotCi0KLQotI2lmZGVmIERPX1RFU1QxMQotLyoKLSAqIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byBjYXRjaCBhIGNvdXBsZSBvZiBzeW50YWN0aWMgZXJyb3JzLiAgVGhlIGFzc2VtYmxlcgotICogc2hvdWxkIGNvbXBsYWluIGFib3V0IGJvdGggb2YgdGhlIGRpcmVjdGl2ZXMgYmVsb3cuCi0gKi8KLXZvaWQKLXh5enp6KCkKLXsKLSAgbmV3Ml9mb28oKTsKLSAgYmFyMzMoKTsKLX0KLQotX19hc21fXygiLnN5bXZlciBuZXcyX2Zvbyxmb29WRVJTXzIuMCIpOwotX19hc21fXygiLnN5bXZlciBiYXIzMyxiYXJAQFZFUlNfMi4wIik7Ci0jZW5kaWYKLQotI2lmZGVmIERPX1RFU1QxMgotLyoKLSAqIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byBjYXRjaCBhIGNvdXBsZSBvZiBzeW50YWN0aWMgZXJyb3JzLiAgVGhlIGFzc2VtYmxlcgotICogc2hvdWxkIGNvbXBsYWluIGFib3V0IGJvdGggb2YgdGhlIGRpcmVjdGl2ZXMgYmVsb3cuCi0gKi8KLXZvaWQKLXh5enp6KCkKLXsKLSAgbmV3Ml9mb28oKTsKLSAgYmFyMzMoKTsKLX0KLQotX19hc21fXygiLnN5bXZlciBiYXIzMyxiYXJAQFZFUlNfMi4wIik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ0MzRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18yLjAgICAgVkVSU18yLjAKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChCYXNlXCkgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4yXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgRE8gKC5zP2RhdGF8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICBzaG93X2JhcjEKLVswLTlhLWZdKiBnICAgIERPICgucz9kYXRhfFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgc2hvd19iYXIyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzM3YmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotVkVSU18xLjEgewotCSBnbG9iYWw6Ci0JCSBmb28xOwotCSBsb2NhbDoKLQkJIGhpZGVfb2xkKjsgCi0JCSBoaWRlX29yaWdpbmFsKjsgCi0JCSBoaWRlX25ldyo7IAotfTsKLQotVkVSU18xLjIgewotCQkgZm9vMjsKLX0gVkVSU18xLjE7Ci0KLVZFUlNfMi4wIHsKLQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotfSBWRVJTXzEuMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmZjg1NS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTczMTJiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBhMjY4ODFmIHRtcGRpci92ZXJzMS5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKLTMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0JVkVSU18xLjEgCi00IDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMAotCVZFUlNfMS4yIAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTMuYXN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ2MTQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotVkVSU18xLjEgaW4gdmVyczEuc28KLVZFUlNfMS4yIGluIHZlcnMxLnNvCi1WRVJTXzIuMCBpbiB2ZXJzMS5zbwotYmFyIGluIHZlcnMxLnNvCi1zaG93X2JhcjEgaW4gdmVyczEuc28KLXNob3dfYmFyMiBpbiB2ZXJzMS5zbwotc2hvd19mb29AIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BAVkVSU18yLjAgaW4gdmVyczEuc28KLXNob3dfZm9vQFZFUlNfMS4xIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BWRVJTXzEuMiBpbiB2ZXJzMS5zbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyMmNhYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byBtYWtlIHN1cmUgdGhhdCBpZiB3ZSBleHRlcm5hbGx5IHJlZmVyZW5jZSBhIHZlcnNpb25lZCBzeW1ib2wKLSAqIHRoYXQgd2UgYWx3YXlzIGdldCB0aGUgcmlnaHQgb25lLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1mb29fMSgpCi17Ci0gIHJldHVybiAxMDM0OwotfQotCi1pbnQKLWZvb18yKCkKLXsKLSAgcmV0dXJuIDEzNDM7Ci19Ci0KLWludAotZm9vXzMoKQotewotICByZXR1cm4gMTMzNDsKLX0KLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCJFeHBlY3QgNCwgICAgZ2V0ICVkXG4iLCBmb29fMSgpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTMsICAgZ2V0ICVkXG4iLCBmb29fMigpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTAzLCAgZ2V0ICVkXG4iLCBmb29fMygpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgZm9vXzEsc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18yLHNob3dfZm9vQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18zLHNob3dfZm9vQEBWRVJTXzEuMiIpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ZTE1Yy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjEgICAgVkVSU18xLjEKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4yICAgIFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoQmFzZVwpICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4xXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMS4yICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmFiNjIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0AKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjEKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AQFZFUlNfMS4yCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZWM1OC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUudmVyCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGQ4YTI2MDUgdG1wZGlyL3ZlcnMxNQotMiAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLTMgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjhiYzYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1pbnQgc2hvd19iYXIgKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci1leHRlcm4gaW50IHNob3dfZm9vICgpOwotCi1pbnQgbWFpbiAoKQotewotICByZXR1cm4gc2hvd19mb28gKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQyNGMzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMC05YS1mXSogZyAgICBERiAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiggIEJhc2UgICAgICAgKT8gKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfYmFyCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiggICAgICAgICAgICAgKT8gKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2MzMyZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1WRVJTXzEuMSB7Ci0gIGdsb2JhbDogc2hvd19iYXI7Ci19OwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTNiMWZkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotaW50IHNob3dfYmFyICgpCi17Ci0gIHJldHVybiAxOwotfQotaW50IHNob3dfZm9vICgpCi17Ci0gIHJldHVybiBzaG93X2JhciAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4ZGY0Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVswLTlhLWZdKiBnICAgIERPIChcLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzFcLjEgICAgVkVSU18xXC4xCi1bMC05YS1mXSogZyAgICBERiAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xXC4xICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2JhcgotWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIEJhc2UgICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjZjFkZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDA2MDFjZmJmIHRtcGRpci92ZXJzMTZhLnNvCi0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjZDY0Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW50Ci1zaG93X2ZvbyAoKQotewotICByZXR1cm4gOTk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGVjYzBhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3Lm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjOWNmNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1WRVJTXzIuMCB7Ci0JIGdsb2JhbDoKLQkJIHNob3dfZm9vOwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhkNTljLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwMjYwNWQzZiB0bXBkaXIvdmVyczE3LnNvCi0yIDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkY2MyNS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWludAotYmFyICgpCi17Ci0gIHJldHVybiAzOwotfQotCi0jcHJhZ21hIHdlYWsgaGlkZV9vcmlnaW5hbF9mb28KLQotaW50Ci1oaWRlX29yaWdpbmFsX2ZvbyAoKQotewotICByZXR1cm4gMSArIGJhciAoKTsKLX0KLQotI3ByYWdtYSB3ZWFrIGhpZGVfb2xkX2ZvbwotCi1pbnQKLWhpZGVfb2xkX2ZvbyAoKQotewotICByZXR1cm4gMTAgKyBiYXIoKTsKLX0KLQotI3ByYWdtYSB3ZWFrIGhpZGVfb2xkX2ZvbzEKLQotaW50Ci1oaWRlX29sZF9mb28xICgpCi17Ci0gIHJldHVybiAxMDAgKyBiYXIgKCk7Ci19Ci0KLSNwcmFnbWEgd2VhayBoaWRlX25ld19mb28KLQotaW50Ci1oaWRlX25ld19mb28gKCkKLXsKLSAgcmV0dXJuIDEwMDAgKyBiYXIgKCk7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vcmlnaW5hbF9mb28sc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb2xkX2ZvbyxzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28xLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfbmV3X2ZvbyxzaG93X2Zvb0BAVkVSU18yLjAiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjM2FkN2IuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVswLTlhLWZdKiAgdyAgIERGIChcKlVORFwqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjEgICAgVkVSU18xLjEKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4yICAgIFZFUlNfMS4yCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qICB3ICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKEJhc2VcKSAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiAgdyAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMVwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogIHcgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjJcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4Lm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzJiMGUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLVZFUlNfMS4xIHsKLQkgZ2xvYmFsOgotCQkgZm9vMTsKLQkgbG9jYWw6Ci0JCSBoaWRlX29sZCo7IAotCQkgaGlkZV9vcmlnaW5hbCo7IAotCQkgaGlkZV9uZXcqOyAKLX07Ci0KLVZFUlNfMS4yIHsKLQkJIGZvbzI7Ci19IFZFUlNfMS4xOwotCi1WRVJTXzIuMCB7Ci19IFZFUlNfMS4yOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Y2VmZGYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzAtOWEtZl0qICB3ICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0AKLVswLTlhLWZdKiAgdyAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjEKLVswLTlhLWZdKiAgdyAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjIKLVswLTlhLWZdKiAgdyAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTgudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1Mjk5Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTgudmVyCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDAyNjA4ZDNmIHRtcGRpci92ZXJzMTguc28KLTIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0zIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgotCVZFUlNfMS4xIAotNCAweDAyIDB4MGE3OTIyYjAgVkVSU18yLjAKLQlWRVJTXzEuMiAKLQotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMTcuc286Ci0gICAgMHgwYTc5MjJiMCAweDAwIDA1IFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYmYyN2EuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotZXh0ZXJuIGludCBzaG93X2ZvbyAoKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIHByaW50ZiAoIiVkXG4iLCBzaG93X2ZvbyAoKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljMjY0Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2JkYzg4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVZlcnNpb24gUmVmZXJlbmNlczoKLSAgcmVxdWlyZWQgZnJvbSAqdG1wZGlyL3ZlcnMxNy5zbzoKLSAgICAweDBhNzkyMmIwIDB4MDAgMDIgVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGE1NGNiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogVGVzdCBmdW5jdGlvbi4gIFRoaXMgaXMgYnVpbHQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgcmVmZXJlbmNlcyBhCi0gKiB2ZXJzaW9uZWQgc3ltYm9sIGZvbyB0aGF0IGlzIGluIHRlc3Quc28uCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gaW50IHNob3dfZm9vICgpOwotCi12b2lkCi1zaG93X3h5enp5KCkKLXsKLSAgcHJpbnRmKCIlZCIsIHNob3dfZm9vKCkpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTg1YzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU19YWFhfMS4xIFZFUlNfWFhYXzEuMQotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU19YWFhfMS4xICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X3h5enp5CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTdkN2UuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLVZFUlNfWFhYXzEuMSB7Ci0JCSBzaG93X3h5enp5OwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyNjM0My4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwYTI2MTgxZiB0bXBkaXIvdmVyczIuc28KLTIgMHgwMCAweDA4Nzg1YjUxIFZFUlNfWFhYXzEuMQotCi1WZXJzaW9uIFJlZmVyZW5jZXM6Ci0gIHJlcXVpcmVkIGZyb20gdG1wZGlyL3ZlcnMxLnNvOgotICAgIDB4MGE3OTIyYjAgMHgwMCAwMyBWRVJTXzIuMAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiNGRhZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyoKLSAqIE1haW4gcHJvZ3JhbSBmb3IgdGVzdDEsIHRlc3QyLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotZXh0ZXJuIGludCBzaG93X2ZvbyAoKTsKLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCIlZFxuIiwgc2hvd19mb28oKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YzI2NDIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyMzBlZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVZlcnNpb24gUmVmZXJlbmNlczoKLSAgcmVxdWlyZWQgZnJvbSB0bXBkaXIvdmVyczEuc286Ci0gICAgMHgwYTc5MjJiMCAweDAwIDAyIFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTNmMmViLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gbWFrZSBzdXJlIHRoYXQgYSB2ZXJzaW9uZWQgc3ltYm9sIGRlZmluaXRpb24gaW4gYW4KLSAqIGFwcGxpY2F0aW9uIGNvcnJlY3RseSBkZWZpbmVzIHRoZSB2ZXJzaW9uIG5vZGUsIGlmIGFuZCBvbmx5IGlmCi0gKiB0aGUgYWN0dWFsIHN5bWJvbCBpcyBleHBvcnRlZC4gIFRoaXMgaXMgYnVpbHQgYm90aCB3aXRoIGFuZCB3aXRob3V0Ci0gKiAtZXhwb3J0LWR5bmFtaWMuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gaW50IGZvbyAoKTsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQFZFUlNfMi4wIik7Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiJWRcbiIsIGZvbygpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDk0NDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y5ZmRhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDk0NDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NmNlZGMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBkOGEyNmUxIHRtcGRpci92ZXJzNGEKLTIgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzZlYTQwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgZm9vQEJBUiBhbmQgZm9vQEBCQVIgYXJlIGNvcnJlY3RseSBkZXRlY3RlZAotICogYXMgYSBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbC4KLSAqLwotY29uc3QgY2hhciAqIGJhcjEgPSAiYXNkZiI7Ci1jb25zdCBjaGFyICogYmFyMiA9ICJhc2RmIjsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW9yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vKCkKLXsKLQlyZXR1cm4gMTArYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vMSgpCi17Ci0JcmV0dXJuIDEwMCtiYXIoKTsKLQotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBWRVJTXzEuMiIpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0OGRmOS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIFRlc3RjYXNlIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIHdlIGV4dGVybmFsbHkgcmVmZXJlbmNlIGEgdmVyc2lvbmVkIHN5bWJvbAotICogdGhhdCB3ZSBhbHdheXMgZ2V0IHRoZSByaWdodCBvbmUuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gaW50IGZvb18xKCk7Ci1leHRlcm4gaW50IGZvb18yKCk7Ci1leHRlcm4gaW50IGZvb18zKCk7Ci1leHRlcm4gaW50IGZvb180KCk7Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiRXhwZWN0IDQsICAgIGdldCAlZFxuIiwgZm9vXzEoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEzLCAgIGdldCAlZFxuIiwgZm9vXzIoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEwMywgIGdldCAlZFxuIiwgZm9vXzMoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEwMDMsIGdldCAlZFxuIiwgZm9vXzQoKSk7Ci0gIHJldHVybiAwOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGZvb18xLHNob3dfZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBmb29fMixzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBmb29fMyxzaG93X2Zvb0BWRVJTXzEuMiIpOwotX19hc21fXygiLnN5bXZlciBmb29fNCxzaG93X2Zvb0BWRVJTXzIuMCIpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODUxZDQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogICAgICAgICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMS4yICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMS4xICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I1Y2M3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0AKLVswXSogKkY/ICpcKlVORFwqCVswXSogc2hvd19mb29AVkVSU18xLjEKLVswXSogKkY/ICpcKlVORFwqCVswXSogc2hvd19mb29AVkVSU18xLjIKLVswXSogKkY/ICpcKlVORFwqCVswXSogc2hvd19mb29AVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMmI0Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVZlcnNpb24gUmVmZXJlbmNlczoKLSAgcmVxdWlyZWQgZnJvbSB0bXBkaXIvdmVyczEuc286Ci0gICAgMHgwYTc5MjdiMSAweDAwID8/IFZFUlNfMS4xCi0gICAgMHgwYTc5MjdiMiAweDAwID8/IFZFUlNfMS4yCi0gICAgMHgwYTc5MjJiMCAweDAwID8/IFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDMxNmM5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogVGVzdCBwcm9ncmFtIHRoYXQgZ29lcyB3aXRoIHRlc3Q3LnNvCi0gKi8KLQotZXh0ZXJuIGludCBoaWRlX2EoKTsKLWV4dGVybiBpbnQgc2hvd19iKCk7Ci0KLWludAotbWFpbigpCi17Ci0gIHJldHVybiBoaWRlX2EoMSkgKyBzaG93X2IoMSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZkNTAxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVkVSU18xIHsKLQlnbG9iYWw6Ci0JCXNob3dfYiA7Ci0JbG9jYWw6Ci0JCWhpZGVfYTsKLX07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmVlOGM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIFRlc3Qgc3VwcGxpZWQgYnkgVWxyaWNoLiAgVmVyaWZ5IHRoYXQgd2UgY2FuIGNvcnJlY3RseSBmb3JjZSAnYScKLSAqIHRvIGxvY2FsIHNjb3BlLgotICovCi1pbnQKLV9fYV9pbnRlcm5hbCAoaW50IGUpCi17Ci0gIHJldHVybiBlICsgMTA7Ci19Ci0KLWludAotX19iX2ludGVybmFsIChpbnQgZSkKLXsKLSAgcmV0dXJuIGUgKyA0MjsKLX0KLQotYXNtICgiLnN5bXZlciBfX2FfaW50ZXJuYWwsaGlkZV9hQEBWRVJTXzEiKTsKLWFzbSAoIi5zeW12ZXIgX19iX2ludGVybmFsLHNob3dfYkBAVkVSU18xIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY5NmM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEgICAgICBWRVJTXzEKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMSAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2IKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2Euc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliZDYxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/aGlkZV9hQEBWRVJTXzEKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iQEBWRVJTXzEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VmOGE4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwMjY5ZmQzZiB0bXBkaXIvdmVyczdhLnNvCi0yIDB4MDAgMHgwNWFhNzkyMSBWRVJTXzEKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDU4NmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW50Ci1tYWluKCkKLXsKLSAgcmV0dXJuIGEoMSkgKyBiKDEpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjM1OTU1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLVZFUlNJT04gewotCVZFUlNfMS4xIHsKLQkJIGdsb2JhbDoKLQkJCSBmb28xOwotCQkgbG9jYWw6Ci0JCQkgaGlkZV9vbGQqOyAKLQkJCSBoaWRlX29yaWdpbmFsKjsgCi0JCQkgaGlkZV9uZXcqOyAKLQl9OwotCQotCVZFUlNfMS4yIHsKLQkJCSBmb28yOwotCX0gVkVSU18xLjE7Ci0JCi0JVkVSU18yLjAgewotCQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotCX0gVkVSU18xLjI7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTkwMjMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgudmVyCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGEyNmY4MWYgdG1wZGlyL3ZlcnM4LnNvCi0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotMyAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLQlWRVJTXzEuMSAKLTQgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0JVkVSU18xLjIgCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWYxNDAyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgcmVmZXJlbmNlIHRvIGZvb0BCQVIgYW5kIGEgZGVmaW5pdGlvbiBvZiBmb29AQEJBUgotICogYXJlIG5vdCB0cmVhdGVkIGFzIGEgbXVsdGlwbGUgZGVmLgotICovCi1jb25zdCBjaGFyICogYmFyMSA9ICJhc2RmIjsKLWNvbnN0IGNoYXIgKiBiYXIyID0gImFzZGYiOwotCi1leHRlcm4gaW50IG9sZF9mb28xKCk7Ci0KLWludAotYmFyKCkKLXsKLQlyZXR1cm4gMzsKLX0KLQotaW50Ci1vcmlnaW5hbF9mb28oKQotewotCXJldHVybiAxK2JhcigpOwotCi19Ci0KLWludAotb2xkX2ZvbygpCi17Ci0JcmV0dXJuIDEwK2JhcigpOwotCi19Ci0KLWludAotbmV3X2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLQotaW50Ci1tYWluKCkKLXsKLSAgb2xkX2ZvbzEoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBWRVJTXzEuMiIpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTMwMDIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjEgICAgVkVSU18xLjEKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4yICAgIFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMS4yICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzMTUxNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswXSogKkY/ICpcKlVORFwqCVswXSogZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0AKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0BAVkVSU18xLjIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczYmE3Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwNGQ4YTI2OSB0bXBkaXIvdmVyczkKLTIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0zIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL2VtcGljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1MjhiZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgbGQtZW1waWMgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIFRlc3QgdGhlIGhhbmRsaW5nIG9mIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUuICBUaGlzIHRlc3QgZXNzZW50aWFsbHkKLSMgdGVzdHMgdGhlIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgYXMgd2VsbCBhcyB0aGUgbGlua2VyLCBzaW5jZSBNSVBTCi0jIGVtYmVkZGVkIFBJQyBpcyBhIEdOVSBlbmhhbmNlbWVudCB0byBzdGFuZGFyZCBNSVBTIHRvb2xzLgotCi0jIEVtYmVkZGVkIFBJQyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgTUlQUyBFQ09GRiB0YXJnZXRzLgotaWYgIVtpc3RhcmdldCBtaXBzKi0qLWVjb2ZmKl0gewotICAgIHJldHVybgotfQotCi1zZXQgdGVzdG5hbWUgcmVsYXgKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi0jIFRlc3QgdGhhdCByZWxheGF0aW9uIHdvcmtzIGNvcnJlY3RseS4gIFRoaXMgdGVzdHN1aXRlIHdhcyBjb21wb3NlZAotIyAoYnkgZXhwZXJpbWVudGF0aW9uKSB0byBmb3JjZSB0aGUgbGlua2VyIHRvIHJlbGF4IHR3aWNlLS10aGF0IGlzLAotIyB0aGUgZmlyc3QgcmVsYXhhdGlvbiBwYXNzIHdpbGwgZm9yY2UgYW5vdGhlciBjYWxsIHRvIGJlIG91dCBvZgotIyByYW5nZSwgcmVxdWlyaW5nIGEgc2Vjb25kIHJlbGF4YXRpb24gcGFzcy4KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4MS5jIHRtcGRpci9yZWxheDEub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4Mi5jIHRtcGRpci9yZWxheDIub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4My5jIHRtcGRpci9yZWxheDMub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4NC5jIHRtcGRpci9yZWxheDQub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3JlbGF4ICItLXJlbGF4IC1UICRzcmNkaXIvJHN1YmRpci9yZWxheC50IHRtcGRpci9yZWxheDEubyB0bXBkaXIvcmVsYXgyLm8gdG1wZGlyL3JlbGF4My5vIHRtcGRpci9yZWxheDQubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICAjIENoZWNrIHRoYXQgdGhlIHJlbGF4YXRpb24gcHJvZHVjZWQgdGhlIGNvcnJlY3QgcmVzdWx0LiAgQ2hlY2sKLSAgICAjIGVhY2ggYmFsIGluc3RydWN0aW9uLiAgU29tZSB3aWxsIGdvIGRpcmVjdGx5IHRvIHRoZSBzdGFydCBvZiBhCi0gICAgIyBmdW5jdGlvbiwgd2hpY2ggaXMgT0suICBTb21lIHdpbGwgZm9ybSBwYXJ0IG9mIHRoZSBmaXZlCi0gICAgIyBpbnN0cnVjdGlvbiBleHBhbmRlZCBjYWxsIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIHdlIGNvbXB1dGUgdGhlCi0gICAgIyByZWFsIGRlc3RpbmF0aW9uIGFuZCBtYWtlIHN1cmUgaXQgaXMgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uCi0gICAgIyBTb21lIGJhbCBpbnN0cnVjdGlvbnMgYXJlIHVzZWQgdG8gbG9jYXRlIHRoZSBzdGFydCBvZiB0aGUKLSAgICAjIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGRvIHBvc2l0aW9uIGluZGVwZW5kZW50IGFkZHJlc3NpbmcgaW50byB0aGUKLSAgICAjIHRleHQgc2VjdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IGNoZWNrIHRoYXQgaXQgY29ycmVjdGx5Ci0gICAgIyBjb21wdXRlcyB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgotCi0gICAgIyBHZXQgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvcmVsYXhdIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgICMgR2V0IGEgZGlzYXNzZW1ibHkuCi0gICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1kIHRtcGRpci9yZWxheCA+dG1wZGlyL3JlbGF4LmRpc1xuIgotICAgIHZlcmJvc2UgIiRvYmpkdW1wIC1kIHRtcGRpci9yZWxheCA+dG1wZGlyL3JlbGF4LmRpcyIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXMiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgYmFsY250IDAKLSAgICBzZXQgZmlsZSBbb3BlbiB0bXBkaXIvcmVsYXguZGlzIHJdCi0gICAgd2hpbGUgeyBbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMSB9IHsKLQl2ZXJib3NlICIkbGluZSIgMgotCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIipiYWwqIiAkbGluZV0gewotCSAgICBjb250aW51ZQotCX0KLQotCXZlcmJvc2UgIiRsaW5lIgotCi0JaW5jciBiYWxjbnQKLQotCWlmICFbcmVnZXhwICJeKFxbMC05YS1mQS1GXF0rKSAoPFxbYS16KzAtOUEtWi5cXSs+KT8gYmFsIChcWzAtOWEtZkEtRlxdKykiICRsaW5lIHdob2xlIGFkZHIgbGFiZWwgZGVzdF0gewotCSAgICBwZXJyb3IgInVucmVjb2duaXplZCBmb3JtYXQgZm9yICRsaW5lIgotCSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0KLQlpZiAiMHgkYWRkciArIDggIT0gMHgkZGVzdCIgewotCSAgICAjIFRoaXMgaXMgYSBzdHJhaWdodCBmdW5jdGlvbiBjYWxsLiAgQWxsIGZ1bmN0aW9uIGNhbGxzIGluCi0JICAgICMgdGhpcyBleGFtcGxlIGFyZSB0byBlaXRoZXIgZm9vIG9yIGJhci4KLQkgICAgaWYgIjB4JGRlc3QgIT0gJG5tX291dHB1dChmb28pICYmIDB4JGRlc3QgIT0gJG5tX291dHB1dChiYXIpIiB7Ci0JCXNlbmRfbG9nICJmYWlsIDFcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgIyBQaWNrIHVwIHRoZSBuZXh0IGxpbmUuICBJZiBpdCBpcyBzbGwsIHRoaXMgaXMgYSBzd2l0Y2gKLQkgICAgIyBwcm9sb2d1ZSwgYW5kIHRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkbyB0byB0ZXN0IGl0LgotCSAgICAjIE90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIGx1aSwgYW5kIHRoZSBuZXh0IGluc3RydWN0aW9uCi0JICAgICMgc2hvdWxkIGJlIGFuIGFkZGl1LCBmb2xsb3dlZCBieSBhbiBhZGR1IHRvICQzMS4KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgMlxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAkbAotCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipzbGwqIiAkbF0gewotCQljb250aW51ZQotCSAgICB9Ci0JICAgIGlmICFbcmVnZXhwICJsdWkgKFxbXCRhLXowLTlcXSspLChcWzAtOWEtZkEtRnhcXSspIiAkbCB3aG9sZSByZWcgdXBwZXJdIHsKLQkJc2VuZF9sb2cgImZhaWwgM1xuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJc2VuZF9sb2cgIiRsXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgNFxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAiJGwiCi0JICAgIGlmICFbcmVnZXhwICJhZGRpdSBcXCRyZWcsXFwkcmVnLChcWy0wLTlcXSspIiAkbCB3aG9sZSBsb3dlcl0gewotCQlzZW5kX2xvZyAiZmFpbCA1XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlzZW5kX2xvZyAiJGxcbiIKLQkJc2VuZF9sb2cgImFkZGl1IFxcJHJlZyxcXCRyZWcsKFxbLTAtOVxdKylcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQotCSAgICBpZiB7IFtnZXRzICRmaWxlIGxdID09IC0xIH0gewotCQlzZW5kX2xvZyAiZmFpbCA2XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCSAgICB2ZXJib3NlICIkbCIKLQkgICAgaWYgIVtyZWdleHAgImFkZHUgXFwkcmVnLFxcJHJlZyxcXFwkcmEiICRsXSB7Ci0JCXNlbmRfbG9nICJmYWlsIDdcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCXNlbmRfbG9nICIkbFxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCi0JICAgICMgVGhlIG5leHQgbGluZSB3aWxsIGJlIGphbHIgaW4gdGhlIGNhc2Ugb2YgYW4gZXhwYW5kZWQKLQkgICAgIyBjYWxsLiAgT3RoZXJ3aXNlLCB0aGUgY29kZSBpcyBnZXR0aW5nIHRoZSBzdGFydCBvZiB0aGUKLQkgICAgIyBmdW5jdGlvbiwgYW5kIHRoZSBuZXh0IGxpbmUgY2FuIGJlIGFueXRoaW5nLgotCi0JICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7Ci0JCXNlbmRfbG9nICJmYWlsIDhcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JICAgIHZlcmJvc2UgIiRsIgkKLQkgICAgaWYgW3N0cmluZyBtYXRjaCAiKmphbHIqIiAkbF0gewotCQlzZXQgZGVzdCBbZXhwciAweCRhZGRyICsgOCArICgkdXBwZXIgPDwgMTYpICsgJGxvd2VyXQotCQlpZiB7ICRkZXN0ICE9ICRubV9vdXRwdXQoZm9vKSAmJiAkZGVzdCAhPSAkbm1fb3V0cHV0KGJhcikgfSB7Ci0JCSAgICBzZW5kX2xvZyAiZmFpbCA5XG4iCi0JCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCSAgICByZXR1cm4KLQkJfQotCSAgICB9IGVsc2UgewotCQlzZXQgZGVzdCBbZXhwciAoJHVwcGVyIDw8IDE2KSArICRsb3dlcl0KLQkJaWYgIVtyZWdleHAgIjwoXFsuYS16XF0rKVxcKyhcWzAtOWEtZkEtRlxdKyk+IiAkbGFiZWwgd2hvbGUgYmFzZSBvZmZzZXRdIHsKLQkJICAgIHNlbmRfbG9nICJmYWlsIDEwXG4iCi0JCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCSAgICByZXR1cm4KLQkJfQotCQlzZXQgb2Zmc2V0IDB4JG9mZnNldAotCQlpZiB7ICRiYXNlID09ICIuZm9vIiB9IHsKLQkJICAgIHNldCBvZmZzZXQgW2V4cHIgJG9mZnNldCAtICgkbm1fb3V0cHV0KGZvbykgLSAweDMwKV0KLQkJfQotCQlpZiB7ICRvZmZzZXQgKyA4ICE9IC0gJGRlc3QgfSB7Ci0JCSAgICBzZW5kX2xvZyAiZmFpbCAxMVxuIgotCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQkgICAgcmV0dXJuCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZQotCi0gICAgaWYgeyRiYWxjbnQgPCAxMH0gewotCXNlbmRfbG9nICJmYWlsIDEyXG4iCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgIiRiYWxjbnQgYmFsIGluc3RydWN0aW9ucyIKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0KLX0KLQotIyBXZSBub3cgdGVzdCBhY3R1YWxseSBydW5uaW5nIGVtYmVkZGVkIE1JUFMgUElDIGNvZGUuICBUaGlzIGNhbiBvbmx5Ci0jIGJlIGRvbmUgb24gYSBNSVBTIGhvc3Qgd2l0aCB0aGUgc2FtZSBlbmRpYW5uZXNzIGFzIG91ciB0YXJnZXQuCi1pZiBbaXN0YXJnZXQgbWlwc2VsLSotKl0gewotICAgIGlmICFbaXNob3N0IG1pcHMqLSotdWx0cml4Kl0gewotCXJldHVybgotICAgIH0KLX0gZWxzZSB7Ci0gICAgaWYgIVtpc2hvc3QgbWlwcyotKi1pcml4Kl0gewotCXJldHVybgotICAgIH0KLX0KLQotc2V0IHRlc3RuYW1lICJydW4gZW1iZWRkZWQgUElDIGNvZGUiCi0KLSMgQ29tcGlsZSB0aGUgcHJvZ3JhbSB3aGljaCB3aWxsIHJ1biB0aGUgdGVzdC4gIFRoaXMgY29kZSBtdXN0IGJlCi0jIGNvbXBpbGVkIGZvciB0aGUgaG9zdCwgbm90IHRoZSB0YXJnZXQuCi1zZW5kX2xvZyAiJENDX0ZPUl9IT1NUICRDRkxBR1NfRk9SX0hPU1QgLW8gdG1wZGlyL3J1biAkc3JjZGlyLyRzdWJkaXIvcnVuLmNcbiIKLXZlcmJvc2UgIiRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jIgotY2F0Y2ggImV4ZWMgJENDX0ZPUl9IT1NUICRDRkxBR1NfRk9SX0hPU1QgLW8gdG1wZGlyL3J1biAkc3JjZGlyLyRzdWJkaXIvcnVuLmMiIGV4ZWNfb3V0cHV0Ci1pZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0gICAgdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLSMgQ29tcGlsZSBhbmQgbGluayB0aGUgdGVzdC4KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3J1bnRlc3RpLnMgdG1wZGlyL3J1bnRlc3RpLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9ydW50ZXN0MS5jIHRtcGRpci9ydW50ZXN0MS5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcnVudGVzdDIuYyB0bXBkaXIvcnVudGVzdDIub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9ydW50ZXN0ICItLWVtYmVkZGVkLXJlbG9jcyB0bXBkaXIvcnVudGVzdGkubyB0bXBkaXIvcnVudGVzdDEubyB0bXBkaXIvcnVudGVzdDIubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICAjIE5vdyBydW4gdGhlIHRlc3QuCi0gICAgc2VuZF9sb2cgInRtcGRpci9ydW4gdG1wZGlyL3J1bnRlc3RcbiIKLSAgICB2ZXJib3NlICJ0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0IgotICAgIGNhdGNoICJleGVjIHRtcGRpci9ydW4gdG1wZGlyL3J1bnRlc3QiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiKnJhbiBhbmQgcmV0dXJuZWQgMCoiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgudCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheC50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzE4YjY5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheC50CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotT1VUUFVUX0ZPUk1BVCgiZWNvZmYtYmlnbWlwcyIpCi1TRUNUSU9OUwotewotICAuZm9vIDB4MzAgOiB7Ci0gICAgdG1wZGlyL3JlbGF4My5vKC50ZXh0KQotICAgIHRtcGRpci9yZWxheDEubygudGV4dCkKLSAgfQotICAudGV4dCAgMHgyMDAwMCA6IHsKLSAgICAgX2Z0ZXh0ID0gLiA7Ci0gICAgKiguaW5pdCkKLSAgICAgZXByb2wgID0gIC47Ci0gICAgdG1wZGlyL3JlbGF4NC5vKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZmluaSkKLSAgICAgZXRleHQgID0gIC47Ci0gICAgIF9ldGV4dCAgPSAgLjsKLSAgfQotICAucmRhdGEgIC4gOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgIF9mZGF0YSA9IC47Ci0gIC5kYXRhICAuIDogewotICAgICooLmRhdGEpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgIF9ncCA9IC4gKyAweDgwMDA7Ci0gIC5saXQ4ICAuIDogewotICAgICooLmxpdDgpCi0gIH0KLSAgLmxpdDQgIC4gOiB7Ci0gICAgKigubGl0NCkKLSAgfQotICAuc2RhdGEgIC4gOiB7Ci0gICAgKiguc2RhdGEpCi0gIH0KLSAgIGVkYXRhICA9ICAuOwotICAgX2VkYXRhICA9ICAuOwotICAgX2Zic3MgPSAuOwotICAuc2JzcyAgLiA6IHsKLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyAgLiA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gIH0KLSAgIGVuZCA9IC47Ci0gICBfZW5kID0gLjsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlYzM5ZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBGaXJzdCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1leHRlcm4gaW50IGJhciAoKTsKLXN0YXRpYyBpbnQgZm9vMiAoKTsKLQotaW50IGZvbyAoaW50IGkpCi17Ci0gIHN3aXRjaCAoaSkKLSAgICB7Ci0gICAgY2FzZSAwOiBiYXIgKDApOyBicmVhazsKLSAgICBjYXNlIDE6IGJhciAoMSk7IGJyZWFrOwotICAgIGNhc2UgMjogYmFyICgyKTsgYnJlYWs7Ci0gICAgY2FzZSAzOiBiYXIgKDMpOyBicmVhazsKLSAgICBjYXNlIDQ6IGJhciAoZm9vMik7IGJyZWFrOwotICAgIGNhc2UgNTogYmFyIChiYXIpOyBicmVhazsKLSAgICB9Ci0gIHdoaWxlICgxKQotICAgIGlmIChpKQotICAgICAgcmV0dXJuIGJhciAoKTsKLX0KLQotc3RhdGljIGludCBmb28yICgpIHsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODg1NGEwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDIuYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIFNlY29uZCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1pbnQgYmFyMiAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCi0gICAgZm9vICgpOwotICByZXR1cm4gZm9vICgpICsgZm9vICgpICsgZm9vICgpICsgZm9vICgpOwotfQotCi1pbnQgYmFyIChpbnQgaSkKLXsKLSAgd2hpbGUgKDEpCi0gICAgaWYgKGkpCi0gICAgICByZXR1cm4gZm9vICgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmb28gKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWE1MzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0vKiBUaGlyZCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1pbnQgcXV1eCAoKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2ZiMDUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0vKiBGb3VydGggc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotaW50IHh5enp5ICgpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW4uYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwMzc3ZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyogTG9hZCBhbmQgcnVuIGEgTUlQUyBwb3NpdGlvbiBpbmRlcGVuZGVudCBFQ09GRiBmaWxlLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLSAgIFB1YmxpYyBkb21haW4uICAqLwotCi0vKiBUaGlzIHByb2dyYW0gd2lsbCBsb2FkIGFuIEVDT0ZGIGZpbGUgaW50byBtZW1vcnkgYW5kIGV4ZWN1dGUgaXQuCi0gICBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiBjb21waWxlZCB1c2luZyB0aGUgR05VIC1tZW1iZWRkZWQtcGljCi0gICBzd2l0Y2ggdG8gcHJvZHVjZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgVGhpcyB3aWxsIG9ubHkgd29yawotICAgaWYgdGhpcyBwcm9ncmFtIGlzIHJ1biBvbiBhIE1JUFMgc3lzdGVtIHdpdGggdGhlIHNhbWUgZW5kaWFubmVzcyBhcwotICAgdGhlIEVDT0ZGIGZpbGUuICBUaGUgRUNPRkYgZmlsZSBtdXN0IGJlIGNvbXBsZXRlLiAgU3lzdGVtIGNhbGxzIG1heQotICAgbm90IHdvcmsgY29ycmVjdGx5LgotCi0gICBUaGVyZSBhcmUgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIGZpbGUgKHRoZXkgY291bGQgYmUgcmVtb3ZlZAotICAgYnkgZG9pbmcgc29tZSBhZGRpdGlvbmFsIHByb2dyYW1taW5nKS4gIFRoZSBmaWxlIG11c3QgYmUgYWxpZ25lZAotICAgc3VjaCB0aGF0IGl0IGRvZXMgbm90IHJlcXVpcmUgYW55IGdhcHMgaW50cm9kdWNlZCBpbiB0aGUgZGF0YQotICAgc2VnbWVudDsgdGhlIEdOVSBsaW5rZXIgcHJvZHVjZXMgc3VjaCBmaWxlcyBieSBkZWZhdWx0LiAgSG93ZXZlciwKLSAgIHRoZSBmaWxlIG11c3Qgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZXh0IG9yIGRhdGEgc2VnbWVudCBpcyBhbGlnbmVkCi0gICBvbiBhIHBhZ2UgYm91bmRhcnkuICBUaGUgc3RhcnQgYWRkcmVzcyBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUKLSAgIHRleHQgc2VnbWVudC4KLQotICAgVGhlIEVDT0ZGIGZpbGUgaXMgcnVuIGJ5IGNhbGxpbmcgaXQgYXMgdGhvdWdoIGl0IHdlcmUgYSBmdW5jdGlvbi4KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQgaXMgcGFzc2VkIGFzIHRoZSBvbmx5IGFyZ3VtZW50LgotICAgVGhlIGZpbGUgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGFuIGludGVnZXIgdmFsdWUsIHdoaWNoIHdpbGwgYmUKLSAgIHByaW50ZWQuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0vKiBTdHJ1Y3R1cmVzIHVzZWQgaW4gRUNPRkYgZmlsZXMuICBXZSBhc3N1bWUgdGhhdCBhIHNob3J0IGlzIHR3bwotICAgYnl0ZXMgYW5kIGFuIGludCBpcyBmb3VyIGJ5dGVzLiAgVGhpcyBpcyBub3QgbXVjaCBvZiBhbiBhc3N1bXB0aW9uLAotICAgc2luY2Ugd2UgYWxyZWFkeSBhc3N1bWUgdGhhdCB3ZSBhcmUgcnVubmluZyBvbiBhIE1JUFMgaG9zdCB3aXRoIHRoZQotICAgc2FtZSBlbmRpYW5uZXNzIGFzIHRoZSBmaWxlIHdlIGFyZSBleGFtaW5pbmcuICAqLwotCi1zdHJ1Y3QgZWNvZmZfZmlsZWhkciB7Ci0gIHVuc2lnbmVkIHNob3J0IGZfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciAgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsJLyogbnVtYmVyIG9mIHNlY3Rpb25zICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZl90aW1kYXQ7CS8qIHRpbWUgJiBkYXRlIHN0YW1wICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGZfc3ltcHRyOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiICAgICAgICovCi0gIHVuc2lnbmVkIGludCBmX25zeW1zOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzICAgICAqLwotICB1bnNpZ25lZCBzaG9ydCBmX29wdGhkcjsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikgICAgICAgICAqLwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwkvKiBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICovCi19OwotCi1zdHJ1Y3QgZWNvZmZfYW91dGhkcgotewotICB1bnNpZ25lZCBzaG9ydCBtYWdpYzsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICB1bnNpZ25lZCBzaG9ydCB2c3RhbXA7CS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICB1bnNpZ25lZCBpbnQgdHNpemU7CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgdW5zaWduZWQgaW50IGRzaXplOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICB1bnNpZ25lZCBpbnQgYnNpemU7CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIHVuc2lnbmVkIGludCBlbnRyeTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICB1bnNpZ25lZCBpbnQgdGV4dF9zdGFydDsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgZGF0YV9zdGFydDsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgYnNzX3N0YXJ0OwkvKiBiYXNlIG9mIGJzcyB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGdwcm1hc2s7CQkvKiA/PyAqLwotICB1bnNpZ25lZCBpbnQgY3BybWFza1s0XTsJLyogPz8gKi8KLSAgdW5zaWduZWQgaW50IGdwX3ZhbHVlOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX07Ci0KLSNkZWZpbmUgRUNPRkZfU0NOSERSX1NJWkUgKDQwKQotCi1zdGF0aWMgdm9pZAotZGllIChzKQotICAgICBjaGFyICpzOwotewotICBwZXJyb3IgKHMpOwotICBleGl0ICgxKTsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIEZJTEUgKmY7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKno7Ci0gIHN0cnVjdCBlY29mZl9maWxlaGRyICpmaDsKLSAgc3RydWN0IGVjb2ZmX2FvdXRoZHIgKmFoOwotICB1bnNpZ25lZCBpbnQgdG9mZjsKLSAgY2hhciAqdCwgKmQ7Ci0gIGludCAoKnBmbikgKCk7Ci0gIGludCByZXQ7Ci0KLSAgaWYgKGFyZ2MgIT0gMikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgZmlsZVxuIiwgYXJndlswXSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZiA9IGZvcGVuIChhcmd2WzFdLCAiciIpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIGRpZSAoYXJndlsxXSk7Ci0KLSAgaWYgKHN0YXQgKGFyZ3ZbMV0sICZzKSA8IDApCi0gICAgZGllICgic3RhdCIpOwotCi0gIHogPSAoY2hhciAqKSBtYWxsb2MgKHMuc3Rfc2l6ZSk7Ci0gIGlmICh6ID09IE5VTEwpCi0gICAgZGllICgibWFsbG9jIik7Ci0KLSAgaWYgKGZyZWFkICh6LCAxLCBzLnN0X3NpemUsIGYpICE9IHMuc3Rfc2l6ZSkKLSAgICBkaWUgKCJmcmVhZCIpOwotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgd2hpY2ggaXMgdGhlCi0gICAgIGxvY2F0aW9uIHdlIGFyZSBnb2luZyB0byBjYWxsLCBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsCi0gICAgIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwYXNzIGFzIGFuIGFyZ3VtZW50LiAgV2UgYWxzbyBuZWVkIHRoZSBzaXplCi0gICAgIGFuZCBzdGFydCBhZGRyZXNzIG9mIHRoZSBic3Mgc2VnbWVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxsIGluCi0gICAgIHRoZSBFQ09GRiBhLm91dCBoZWFkZXIuICAqLwotCi0gIGZoID0gKHN0cnVjdCBlY29mZl9maWxlaGRyICopIHo7Ci0gIGlmIChmaC0+Zl9vcHRoZHIgIT0gc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfYW91dGhkcikpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVuZXhwZWN0ZWQgb3B0aGRyIHNpemU6IGlzICV1LCB3YW50ICV1XG4iLAotCSAgICAgICBhcmd2WzFdLCAodW5zaWduZWQgaW50KSBmaC0+Zl9vcHRoZHIsCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBhaCA9IChzdHJ1Y3QgZWNvZmZfYW91dGhkciAqKSAoeiArIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZpbGVoZHIpKTsKLSAgaWYgKGFoLT5tYWdpYyAhPSAwNDEzKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBiYWQgYW91dGhkciBtYWdpYyBudW1iZXIgMCVvICh3YW50IDA0MTMpXG4iLAotCSAgICAgICBhcmd2WzFdLCAodW5zaWduZWQgaW50KSBhaC0+bWFnaWMpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFdlIHNob3VsZCBjbGVhciB0aGUgYnNzIHNlZ21lbnQgYXQgdGhpcyBwb2ludC4gIFRoaXMgaXMgdGhlCi0gICAgIGFoLT5ic2l6ZSBieXRlcyBzdGFydGluZyBhdCBhaC0+YnNzX3N0YXJ0LCBUbyBkbyB0aGlzIGNvcnJlY3RseSwKLSAgICAgd2Ugd291bGQgaGF2ZSB0byBtYWtlIHN1cmUgb3VyIG1lbW9yeSBibG9jayBpcyBsYXJnZSBlbm91Z2guICBJdAotICAgICBzbyBoYXBwZW5zIHRoYXQgb3VyIHRlc3QgY2FzZSBkb2VzIG5vdCBoYXZlIGFueSBhZGRpdGlvbmFsIHBhZ2VzCi0gICAgIGZvciB0aGUgYnNzIHNlZ21lbnQtLWl0IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGRhdGEgc2VnbWVudC4KLSAgICAgU28sIHdlIGRvbid0IGJvdGhlci4gICovCi0gIGlmIChhaC0+YnNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICIlczogYnNzIHNlZ21lbnQgaXMgJXUgYnl0ZXM7IG5vbi16ZXJvIHNpemVzIG5vdCBzdXBwb3J0ZWRcbiIsCi0JICAgICAgIGFyZ3ZbMV0sIGFoLT5ic2l6ZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogVGhlIHRleHQgc2VjdGlvbiBzdGFydHMganVzdCBhZnRlciBhbGwgdGhlIGhlYWRlcnMsIHJvdW5kZWQgdG8gYQotICAgICAxNiBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgdG9mZiA9IChzaXplb2YgKHN0cnVjdCBlY29mZl9maWxlaGRyKSArIHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpCi0JICArIGZoLT5mX25zY25zICogRUNPRkZfU0NOSERSX1NJWkUpOwotICB0b2ZmICs9IDE1OwotICB0b2ZmICY9fiAxNTsKLSAgdCA9IHogKyB0b2ZmOwotCi0gIC8qIFRoZSB0c2l6ZSBmaWVsZCBnaXZlcyB1cyB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudC4gICovCi0gIGQgPSB6ICsgYWgtPnRzaXplOwotCi0gIC8qIENhbGwgdGhlIGNvZGUgYXMgYSBmdW5jdGlvbi4gICovCi0gIHBmbiA9IChpbnQgKCopICgpKSB0OwotICByZXQgPSAoKnBmbikgKGQpOwotCi0gIHByaW50ZiAoIiVzIHJhbiBhbmQgcmV0dXJuZWQgJWRcbiIsIGFyZ3ZbMV0sIHJldCk7Ci0KLSAgZXhpdCAoMCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWFiNmViLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qIEZpcnN0IEMgc291cmNlIGZpbGUgZm9yIGFjdHVhbCBleGVjdXRpb24gdGVzdC4gICovCi0KLS8qIFRoZSBtYWluIHBvaW50IG9mIHRoaXMgdGVzdCBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBhbmQgZGF0YQotICAgYXJlIHRydWx5IHBvc2l0aW9uIGluZGVwZW5kZW50LiAgV2Ugc3RhdGljYWxseSBpbml0aWFsaXplIHNldmVyYWwKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHkgYWRqdXN0ZWQgYXQKLSAgIHJ1bnRpbWUuICAqLwotCi1pbnQgaSA9IDE7Ci1pbnQgaiA9IDA7Ci1leHRlcm4gaW50IGs7Ci1pbnQgbDsKLWNoYXIgc21hbGxfYnVmW10gPSAiYWFhYSI7Ci1jaGFyICpzbWFsbF9wb2ludGVyID0gc21hbGxfYnVmOwotY2hhciBiaWdfYnVmW10gPSAiYWFhYWFhYWFhYWFhYWFhYSI7Ci1jaGFyICpiaWdfcG9pbnRlciA9IGJpZ19idWY7Ci0KLWV4dGVybiBpbnQgYmFyICgpOwotaW50ICgqcGJhcikgKCkgPSBiYXI7Ci0KLXN0YXRpYyBpbnQKLWZvbzIgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgbCA9IGFyZzsKLSAgcmV0dXJuIGkgKyBqOwotfQotCi1pbnQgKCpwZm9vMikgKCkgPSBmb28yOwotCi1pbnQKLWNoa3N0ciAoeiwgYykKLSAgICAgY2hhciAqejsKLSAgICAgaW50IGM7Ci17Ci0gIC8qIFN3aXRjaCBzdGF0ZW1lbnRzIG5lZWQgZXh0cmEgZWZmb3J0IHRvIGJlIHBvc2l0aW9uIGluZGVwZW5kZW50LAotICAgICBzbyB3ZSBydW4gb25lIGhlcmUsIGV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlIGNhc2VzIHdpbGwgbmV2ZXIgYmUKLSAgICAgdGFrZW4uICAqLwotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIGkgLSAxOwotICAgIGNhc2UgNDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgIGNhc2UgODoKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gaSAqIGo7Ci0gICAgY2FzZSAxMDoKLSAgICBjYXNlIDExOgotICAgIGNhc2UgMTI6Ci0gICAgY2FzZSAxMzoKLSAgICBjYXNlIDE0OgotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gajsKLSAgICBjYXNlIDE2OgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICB3aGlsZSAoYy0tICE9IDApCi0gICAgaWYgKCp6KysgIT0gJ2EnKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuICp6ID09ICdcMCc7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgc3RhcnR1cCByb3V0aW5lLiAgSXQgdHJpZXMKLSAgIHRvIHRlc3QgdGhhdCBldmVyeXRoaW5nIHdhcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuICBJdCByZXR1cm5zIDAgb24KLSAgIHN1Y2Nlc3MsIHNvbWV0aGluZyBlbHNlIG9uIGZhaWx1cmUuICAqLwotCi1pbnQKLWZvbyAoKQotewotICBpZiAoaSAhPSAxKQotICAgIHJldHVybiAxOwotICBpZiAoaiAhPSAwKQotICAgIHJldHVybiAyOwotICBpZiAoISBjaGtzdHIgKHNtYWxsX2J1ZiwgNCkpCi0gICAgcmV0dXJuIDM7Ci0gIGlmICghIGNoa3N0ciAoc21hbGxfcG9pbnRlciwgNCkpCi0gICAgcmV0dXJuIDQ7Ci0gIGlmICghIGNoa3N0ciAoYmlnX2J1ZiwgMTYpKQotICAgIHJldHVybiA1OwotICBpZiAoISBjaGtzdHIgKGJpZ19wb2ludGVyLCAxNikpCi0gICAgcmV0dXJuIDY7Ci0KLSAgaWYgKGwgIT0gMCkKLSAgICByZXR1cm4gNzsKLSAgaWYgKGZvbzIgKDEpICE9IDEpCi0gICAgcmV0dXJuIDg7Ci0gIGlmIChsICE9IDEpCi0gICAgcmV0dXJuIDk7Ci0gIGlmICgoKnBmb28yKSAoMikgIT0gMSkKLSAgICByZXR1cm4gMTA7Ci0gIGlmIChsICE9IDIpCi0gICAgcmV0dXJuIDExOwotCi0gIGlmIChiYXIgKDEpICE9IDApCi0gICAgcmV0dXJuIDEyOwotICBpZiAoYmFyICgtMSkgIT0gMSkKLSAgICByZXR1cm4gMTM7Ci0gIGlmICgoKnBiYXIpICgweGE1YTVhNWE1KSAhPSAtMSkKLSAgICByZXR1cm4gMTQ7Ci0gIGlmIChrICE9IDB4YTVhNWE1YTUpCi0gICAgcmV0dXJuIDE1OwotICBpZiAoKCpwYmFyKSAoMCkgIT0gMHhhNWE1YTVhNSkKLSAgICByZXR1cm4gMTY7Ci0gIGlmIChrICE9IDApCi0gICAgcmV0dXJuIDE3OwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwNTI1Zi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIFNlY29uZCBDIHNvdXJjZSBmaWxlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHRlc3QuICAqLwotCi1pbnQgazsKLWV4dGVybiBpbnQgaTsKLWV4dGVybiBpbnQgajsKLWV4dGVybiBjaGFyIHNtYWxsX2J1ZltdOwotZXh0ZXJuIGNoYXIgKnNtYWxsX3BvaW50ZXI7Ci0KLWV4dGVybiBpbnQgY2hrc3RyICgpOwotCi1pbnQKLWJhciAobikKLSAgICAgaW50IG47Ci17Ci0gIGludCByOwotCi0gIGlmIChpICE9IDEKLSAgICAgIHx8IGogIT0gMAotICAgICAgfHwgISBjaGtzdHIgKHNtYWxsX2J1ZiwgNCkKLSAgICAgIHx8ICEgY2hrc3RyIChzbWFsbF9wb2ludGVyLCA0KSkKLSAgICByZXR1cm4gayArIDE7Ci0KLSAgciA9IGs7Ci0gIGsgPSBuOwotICByZXR1cm4gcjsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0aS5zIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTE5NTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIEFzc2VtYmxlciBpbml0aWFsaXphdGlvbiBjb2RlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHRlc3QuCi0JCi0jIFRoaXMgY29kZSBiZWNvbWVzIHRoZSBzdGFydCBvZiB0aGUgZXhlY3V0aW9uIHRlc3QgcHJvZ3JhbS4gIEl0IGlzCi0jIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgdGhlIHN0YXRpYyBkYXRhLCBpbnZva2luZyB0aGUgQyBjb2RlLAotIyBhbmQgcmV0dXJuaW5nIHRoZSByZXN1bHQuICBJdCBpcyBjYWxsZWQgYXMgdGhvdWdoIGl0IHdlcmUgYSBDCi0jIGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudC4KLQotIyBXZSBuZWVkIHRvIGtub3cgdGhlIHZhbHVlIG9mIF9mdGV4dCBhbmQgX2ZkYXRhIGF0IGxpbmsgdGltZSwgYnV0IHdlCi0jIGhhdmUgbm8gd2F5IHRvIGFjdHVhbGx5IGdldCB0aGF0IGF0IHJ1bnRpbWUuICBUaGlzIGlzIGJlY2F1c2Ugd2hlbgotIyB0aGlzIGNvZGUgaXMgY29tcGlsZWQgd2l0aCAtbWVtYmVkZGVkLXBpYywgdGhlIGxhIGluc3RydWN0aW9uIHdpbGwKLSMgYmUgdHVybmVkIGludG8gYW4gYWRkaXUgJGdwIGluc3RydWN0aW9uLiAgV2Ugd29yayBhcm91bmQgdGhpcyBieQotIyBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB3b3JkcyBpbiB0aGUgLmRhdGEgc2VjdGlvbi4gIFdlIHRoZW4gbG9hZAotIyB0aGUgdmFsdWVzIG9mIHRoZXNlIHdvcmRzICpiZWZvcmUqIGRvaW5nIHRoZSBydW50aW1lIHJlbG9jYXRpb24uCi0JLnNkYXRhCi10ZXh0X3N0YXJ0OgotCS53b3JkCV9mdGV4dAotZGF0YV9zdGFydDoKLQkud29yZAlfZmRhdGEKLQotCS5nbG9ibAlzdGFydAotCS50ZXh0Ci1zdGFydDoKLQkjIEdyYWIgc29tZSBzcGFjZSBvbiB0aGUgc3RhY2ssIGp1c3QgYXMgdGhvdWdoIHdlIHdlcmUgYSByZWFsCi0JIyBmdW5jdGlvbi4KLQlhZGRpdQkkc3AsJHNwLC04Ci0Jc3cJJDMxLDAoJHNwKQotCi0JIyBTYXZlIHRoZSAkZ3AgcmVnaXN0ZXIsIGFuZCBzZXQgaXQgdXAgZm9yIG91ciBkYXRhIHNlY3Rpb24uCi0Jc3cJJGdwLDQoJHNwKQotCi0JYWRkdQkkZ3AsJDQsMHg4MDAwCQkjIG1hY3JvCi0KLQkjIFRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50IGlzIGluICQ0LgotCi0JIyBHZXQgdGhlIGFkZHJlc3Mgb2Ygc3RhcnQgaW50byAkNSBpbiBhIHBvc2l0aW9uIGluZGVwZW5kZW50Ci0JIyBmYXNoaW9uLgotCS5zZXQJbm9yZW9yZGVyCi0JJExGMSA9IC4gKyA4Ci0JYmFsCSRMRjEKLQlsYQkkNSxzdGFydC0kTEYxCQkjIG1hY3JvCi0JLnNldAlyZW9yZGVyCi0JYWRkdQkkNSwkNSwkMzEKLQotCSMgTm93IGdldCB0aGUgYWRkcmVzcyBvZiBfZnRleHQgaW50byAkNi4KLQlsYQkkNixfZnRleHQtc3RhcnQJCSMgbWFjcm8KLQlhZGR1CSQ2LCQ2LCQ1Ci0KLQkjIEdldCB0aGUgdmFsdWUgb2YgX2Z0ZXh0IHVzZWQgdG8gbGluayBpbnRvICQ3LgotCWx3CSQ3LHRleHRfc3RhcnQJCSMgbWFjcm8KLQotCSMgR2V0IHRoZSB2YWx1ZSBvZiBfZmRhdGEgdXNlZCB0byBsaW5rIGludG8gJDguCi0JbHcJJDgsZGF0YV9zdGFydAkJIyBtYWNybwotCi0JIyBHZXQgdGhlIGFkZHJlc3Mgb2YgX19ydW50aW1lX3JlbG9jX3N0YXJ0IGludG8gJDkuCi0JbGEJJDksX19ydW50aW1lX3JlbG9jX3N0YXJ0LXN0YXJ0CSMgbWFjcm8KLQlhZGR1CSQ5LCQ5LCQ1Ci0KLQkjIEdldCB0aGUgYWRkcmVzcyBvZiBfX3J1bnRpbWVfcmVsb2Nfc3RvcCBpbnRvICQxMC4KLQlsYQkkMTAsX19ydW50aW1lX3JlbG9jX3N0b3Atc3RhcnQJIyBtYWNybwotCWFkZHUJJDEwLCQxMCwkNQotCi0JIyBUaGUgd29yZHMgYmV0d2VlbiAkOSBhbmQgJDEwIGFyZSB0aGUgcnVudGltZSBpbml0aWFsaXphdGlvbgotCSMgaW5zdHJ1Y3Rpb25zLiAgU3RlcCB0aHJvdWdoIGFuZCByZWxvY2F0ZSB0aGVtLiAgRmlyc3Qgc2V0Ci0JIyAkMTEgYW5kICQxMiB0byB0aGUgdmFsdWVzIHRvIGFkZCB0byB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLAotCSMgcmVzcGVjdGl2ZWx5LgotCXN1YnUJJDExLCQ2LCQ3Ci0Jc3VidQkkMTIsJDQsJDgKLQotMToJCi0JYmdlCSQ5LCQxMCwzZgkJIyBtYWNybwotCWx3CSQxMywwKCQ5KQotCWFuZAkkMTQsJDEzLDB4ZmZmZmZmZmUJIyBtYWNybwotCW1vdmUJJDE1LCQxMQotCWJlcQkkMTMsJDE0LDJmCi0JbW92ZQkkMTUsJDEyCi0yOgkKLQlhZGR1CSQxNCwkMTQsJDQKLQlsdwkkMjQsMCgkMTQpCi0JYWRkdQkkMjQsJDI0LCQxNQotCXN3CSQyNCwwKCQxNCkKLQlhZGRpdQkkOSwkOSw0Ci0JYgkxYgotMzoJCi0KLQkjIE5vdyB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBkYXRhIGhhcyBiZWVuIHJlbG9jYXRlZAotCSMgY29ycmVjdGx5LCBhbmQgd2UgY2FuIGNhbGwgdGhlIEMgY29kZSB3aGljaCBkb2VzIHRoZSBhY3R1YWwKLQkjIHRlc3RpbmcuCi0JYmFsCWZvbwotCi0JIyBXZSByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBDIGNvZGUuCi0JbHcJJDMxLDAoJHNwKQotCWx3CSRncCw0KCRzcCkKLQlhZGR1CSRzcCwkc3AsOAotCWoJJDMxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc4OTQ1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1leHRlcm4gaW50IGZvbyAoKTsKLWludAotZnVuYyAoKQotewotICByZXR1cm4gZm9vICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5NDhjOS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEudAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTk9DUk9TU1JFRlMgKCAudGV4dCAuZGF0YSApCi1TRUNUSU9OUwotewotICAudGV4dCA6IHsgdG1wZGlyL2Nyb3NzMS5vIH0KLSAgLmRhdGEgOiB7IHRtcGRpci9jcm9zczIubyB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQzMTc3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1pbnQKLWZvbyAoKQotewotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDQ2ZjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLnQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU5PQ1JPU1NSRUZTICggLnRleHQgLmRhdGEgKQotU0VDVElPTlMKLXsKLSAgLnRleHQgOiB7ICooLnRleHQpICooLnByKSB9Ci0gIC5kYXRhIDogeyAqKC5kYXRhKSAqKC5zZGF0YSkgKigucncpICooLnRjMCkgKigudGMpIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDhjMzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWludCBpID0gNDsKLQotaW50Ci1mb28gKCkKLXsKLSAgcmV0dXJuIGk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zc3JlZi5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zc3JlZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTk3NTkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotIyBUZXN0IE5PQ1JPU1NSRUZTIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLXNldCB0ZXN0MSAiTk9DUk9TU1JFRlMgMSIKLXNldCB0ZXN0MiAiTk9DUk9TU1JFRlMgMiIKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAkQ0MgIiRzcmNkaXIvJHN1YmRpci9jcm9zczEuYyIgdG1wZGlyL2Nyb3NzMS5vXSBcCi0gICAgIHx8ICFbbGRfY29tcGlsZSAkQ0MgIiRzcmNkaXIvJHN1YmRpci9jcm9zczIuYyIgdG1wZGlyL2Nyb3NzMi5vXSB9IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MQotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLXNldCBmbGFncyAiIgotCi0jIFRoZSBhMjlrIGNvbXBpbGVkIGNvZGUgY2FsbHMgVl9TUElMTCBhbmQgVl9GSUxMLiAgU2luY2Ugd2UgZG9uJ3QKLSMgbmVlZCB0byBydW4gdGhpcyBjb2RlLCBidXQgd2UgZG9uJ3QgaGF2ZSBkZWZpbml0aW9ucyBmb3IgdGhvc2UKLSMgZnVuY3Rpb25zLCB3ZSBqdXN0IGRlZmluZSB0aGVtIG91dC4KLWlmIFtpc3RhcmdldCBhMjlrKi0qLSpdIHsKLSAgICBzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBWX1NQSUxMPTAgLS1kZWZzeW0gVl9GSUxMPTAiCi19Ci0KLSMgaHBwYS1lbGYgbmVlZHMgYSBkZWZpbml0aW9uIGZvciAkZ2xvYmFsJC4KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHsKLSAgICBzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSAnXCRnbG9iYWxcJCc9MCIKLX0KLQotdmVyYm9zZSAtbG9nICIkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczEgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMS50IHRtcGRpci9jcm9zczEubyB0bXBkaXIvY3Jvc3MyLm8iCi0KLWNhdGNoICJleGVjICRsZCAkZmxhZ3MgLW8gdG1wZGlyL2Nyb3NzMSAtVCAkc3JjZGlyLyRzdWJkaXIvY3Jvc3MxLnQgdG1wZGlyL2Nyb3NzMS5vIHRtcGRpci9jcm9zczIubyIgZXhlY19vdXRwdXQKLQotc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLXJlZ3N1YiAtYWxsICIoXnxcbikoJGxkOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2xcW15cblxdKlxuPykiICRleGVjX291dHB1dCAiXFwxIiBleGVjX291dHB1dAotCi1pZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0gICAgZmFpbCAkdGVzdDEKLX0gZWxzZSB7Ci0gICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0gICAgaWYgW3JlZ2V4cCAicHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZnJvbSAuKiB0byBgZm9vJyBpbiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdDEKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3QxCi0gICAgfQotfQotCi0jIENoZWNrIGNyb3NzIHJlZmVyZW5jZXMgd2l0aGluIGEgc2luZ2xlIG9iamVjdC4KLQotaWYgeyAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MzLmMiIHRtcGRpci9jcm9zczMub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotdmVyYm9zZSAtbG9nICIkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczIgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMi50IHRtcGRpci9jcm9zczMubyIKLQotY2F0Y2ggImV4ZWMgJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MyIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczIudCB0bXBkaXIvY3Jvc3MzLm8iIGV4ZWNfb3V0cHV0Ci0KLXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi1yZWdzdWIgLWFsbCAiKF58XG4pKCRsZDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKLQotaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotICAgIGZhaWwgJHRlc3QyCi19IGVsc2UgewotICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotICAgIGlmIFtyZWdleHAgInByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gLiogdG8gYC4qJyBpbiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdDIKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3QyCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhMjZiYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMgVGVzdCBERUZJTkVEIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLXNldCB0ZXN0bmFtZSAiREVGSU5FRCIKLXNldCBwcm1zX2lkIDU2OTkKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2RlZmluZWQucyB0bXBkaXIvZGVmLm9dIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvZGVmICItVCAkc3JjZGlyLyRzdWJkaXIvZGVmaW5lZC50IHRtcGRpci9kZWYubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvZGVmXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh2YWx1ZTEpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh2YWx1ZTIpXX0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dCh2YWx1ZTEpICE9IDF9IHsKLQkJc2VuZF9sb2cgInZhbHVlMSA9PSAkbm1fb3V0cHV0KHZhbHVlMSlcbiIKLQkJdmVyYm9zZSAidmFsdWUxID09ICRubV9vdXRwdXQodmFsdWUxKSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsKLQkJaWYgeyRubV9vdXRwdXQodmFsdWUyKSAhPSAyfSB7Ci0JCSAgICBzZW5kX2xvZyAidmFsdWUyID09ICRubV9vdXRwdXQodmFsdWUyKVxuIgotCQkgICAgdmVyYm9zZSAidmFsdWUyID09ICRubV9vdXRwdXQodmFsdWUyKSIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICR0ZXN0bmFtZQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzY0YmJiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS5nbG9ibAlkZWZpbmVkCi0JZGVmaW5lZAk9CTEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlZjFiNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNFQ1RJT05TIHsKLQkudGV4dCA6IHsgKigudGV4dCkgfQotCS5kYXRhIDogeyAqKC5kYXRhKSB9Ci0JLmJzcyA6IHsgKiguYnNzKSAqKENPTU1PTikgfQotfQotdmFsdWUxID0gREVGSU5FRCAoZGVmaW5lZCkgPyAxIDogMjsKLXZhbHVlMiA9IERFRklORUQgKHVuZGVmaW5lZCkgPyAxIDogMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzN2ZhMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFRlc3QgUEhEUlMgaW4gYSBsaW5rZXIgc2NyaXB0LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotIyBQSERSUyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIEVMRi4KLWlmIHsgIVtpc3RhcmdldCAqLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXVuaXh3YXJlKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWVhYmkqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXNvbGFyaXMyKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLSMgVGhpcyBpcyBhIHZlcnkgc2ltcGxpc3RpYyB0ZXN0LgotCi1zZXQgdGVzdG5hbWUgIlBIRFJTIgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvcGhkcnMucyB0bXBkaXIvcGhkcnMub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXNldCBwaGRyc19yZWdleHAgXAotIi4qUHJvZ3JhbSBIZWFkZXI6LipQSERSICpvZmYgKjB4MDAqMzQgKnZhZGRyICoweDAwKjgwMDM0ICpwYWRkciAqMHgwMCo4MDAzNC4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qIGZsYWdzIHItLS4qTE9BRCAqb2ZmICoweDAwKiAqdmFkZHIgKjB4MDAqODAwMDAgKnBhZGRyICoweDAwKjgwMDAwLipmaWxlc3ogKjB4MDAqXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3Mgci14LipMT0FEICpvZmYgKjB4MFxbMC05YS1mXF0qICp2YWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKiAqcGFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSouKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3MgKnJ3LS4qIgotCi0jIE9uIGEgNjQgYml0IEVMRiBmb3JtYXQsIHdlIG5lZWQgZGlmZmVyZW50IG51bWJlcnMuCi1pZiB7IFtpc3RhcmdldCBhbHBoYSotKi0qXSB9IHRoZW4gewotICBzZXQgcGhkcnNfcmVnZXhwIFwKLSIuKlByb2dyYW0gSGVhZGVyOi4qUEhEUiAqb2ZmICoweDAwKjQwICp2YWRkciAqMHgwMCo4MDA0MCAqcGFkZHIgKjB4MDAqODAwNDAuKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiBmbGFncyByLS0uKkxPQUQgKm9mZiAqMHgwMCogKnZhZGRyICoweDAwKjgwMDAwICpwYWRkciAqMHgwMCo4MDAwMC4qZmlsZXN6ICoweDAwKlxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzIHIteC4qTE9BRCAqb2ZmICoweDBcWzAtOWEtZlxdKiAqdmFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSogKnBhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qLipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzICpydy0uKiIKLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3BoZHJzICItVCAkc3JjZGlyLyRzdWJkaXIvcGhkcnMudCB0bXBkaXIvcGhkcnMubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wIC0tcHJpdmF0ZSB0bXBkaXIvcGhkcnMiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLS1wcml2YXRlIHRtcGRpci9waGRycyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICB2ZXJib3NlIC1sb2cgJGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiBbcmVnZXhwICRwaGRyc19yZWdleHAgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMWYwZDEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0KLQkubG9uZwkxCi0KLQkuZGF0YQotCi0JLmxvbmcJMgotCQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzEwZTIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVBIRFJTCi17Ci0gIGhlYWRlciBQVF9QSERSIFBIRFJTIDsKLSAgdGV4dCBQVF9MT0FEIEZJTEVIRFIgUEhEUlMgOwotICBkYXRhIFBUX0xPQUQgOwotfQotCi1TRUNUSU9OUwotewotICAuID0gMHg4MDAwMCArIFNJWkVPRl9IRUFERVJTOwotICAudGV4dCA6IHsgKigudGV4dCkgfSA6dGV4dAotICAuZGF0YSA6IHsgKiguZGF0YSkgfSA6ZGF0YQotICAvRElTQ0FSRC8gOiB7ICooLnJlZ2luZm8pIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjY2MTc0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jIFRlc3QgYmFzaWMgbGlua2VyIHNjcmlwdCBmdW5jdGlvbmFsaXR5Ci0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLXNldCB0ZXN0bmFtZSAic2NyaXB0IgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvc2NyaXB0LnMgdG1wZGlyL3NjcmlwdC5vXSB7IAotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXByb2MgY2hlY2tfc2NyaXB0IHsgfSB7Ci0gICAgZ2xvYmFsIG5tCi0gICAgZ2xvYmFsIHRlc3RuYW1lCi0gICAgZ2xvYmFsIG5tX291dHB1dAotCi0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NjcmlwdF0gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiB7IVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodGV4dF9zdGFydCldIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfZW5kKV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9zdGFydCldIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRhdGFfZW5kKV19IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQodGV4dF9zdGFydCkgIT0gMHgxMDB9IHsKLQkJc2VuZF9sb2cgInRleHRfc3RhcnQgPT0gJG5tX291dHB1dCh0ZXh0X3N0YXJ0KVxuIgotCQl2ZXJib3NlICJ0ZXh0X3N0YXJ0ID09ICRubV9vdXRwdXQodGV4dF9zdGFydCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7IGlmIHskbm1fb3V0cHV0KHRleHRfZW5kKSA8IDB4MTA0IFwKLQkJCSAgfHwgJG5tX291dHB1dCh0ZXh0X2VuZCkgPiAweDExMH0gewotCQlzZW5kX2xvZyAidGV4dF9lbmQgPT0gJG5tX291dHB1dCh0ZXh0X2VuZClcbiIKLQkJdmVyYm9zZSAidGV4dF9lbmQgPT0gJG5tX291dHB1dCh0ZXh0X2VuZCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7IGlmIHskbm1fb3V0cHV0KGRhdGFfc3RhcnQpICE9IDB4MTAwMH0gewotCQlzZW5kX2xvZyAiZGF0YV9zdGFydCA9PSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpXG4iCi0JCXZlcmJvc2UgImRhdGFfc3RhcnQgPT0gJG5tX291dHB1dChkYXRhX3N0YXJ0KSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsgaWYgeyRubV9vdXRwdXQoZGF0YV9lbmQpIDwgMHgxMDA0IFwKLQkJCSB8fCAkbm1fb3V0cHV0KGRhdGFfZW5kKSA+IDB4MTAxMH0gewotCQlzZW5kX2xvZyAiZGF0YV9lbmQgPT0gJG5tX291dHB1dChkYXRhX2VuZClcbiIKLQkJdmVyYm9zZSAiZGF0YV9lbmQgPT0gJG5tX291dHB1dChkYXRhX2VuZCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgJHRlc3RuYW1lCi0JICAgIH0gfSB9IH0KLQl9Ci0gICAgfQotfQotCi0jIFBFIHRhcmdldHMgbmVlZCB0byBzZXQgdGhlIGltYWdlIGJhc2UgdG8gMCB0byBhdm9pZCBjb21wbGljYXRpb25zIGZyb20gbm0uCi1zZXQgZmxhZ3MgIiIKLWlmIHtbaXN0YXJnZXQgIiotKi1wZSoiXSBcCi0gICAgfHwgW2lzdGFyZ2V0ICIqLSotY3lnd2luKiJdIFwKLSAgICB8fCBbaXN0YXJnZXQgIiotKi1taW5ndzMyKiJdIFwKLSAgICB8fCBbaXN0YXJnZXQgIiotKi13aW5udCoiXSBcCi0gICAgfHwgW2lzdGFyZ2V0ICIqLSotbnQqIl0gXAotICAgIHx8IFtpc3RhcmdldCAiKi0qLWludGVyaXgqIl0gfSB0aGVuIHsKLSAgc2V0IGZsYWdzICItLWltYWdlLWJhc2UgMCIKLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NjcmlwdCAiJGZsYWdzIC1UICRzcmNkaXIvJHN1YmRpci9zY3JpcHQudCB0bXBkaXIvc2NyaXB0Lm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgY2hlY2tfc2NyaXB0Ci19Ci0KLXNldCB0ZXN0bmFtZSAiTVJJIHNjcmlwdCIKLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NjcmlwdCAiJGZsYWdzIC1jICRzcmNkaXIvJHN1YmRpci9zY3JpcHRtLnQiXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgY2hlY2tfc2NyaXB0Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I2NWIwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgdGV4dF9zeW1ib2wKLXRleHRfc3ltYm9sOgkKLQkubG9uZwkxCi0JLmRhdGEKLQkuZ2xvYmwgZGF0YV9zeW1ib2wKLWRhdGFfc3ltYm9sOgkKLQkubG9uZwkyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTdhNDhhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotU0VDVElPTlMKLXsKLSAgLnRleHQgMHgxMDAgOiB7IAotICAgIHRleHRfc3RhcnQgPSAuOwotICAgICooLnRleHQpCi0gICAgKigucHIpCi0gICAgdGV4dF9lbmQgPSAuOwotICB9Ci0gIC4gPSAweDEwMDA7Ci0gIC5kYXRhIDogewotICAgIGRhdGFfc3RhcnQgPSAuOwotICAgICooLmRhdGEpCi0gICAgKigucncpCi0gICAgZGF0YV9lbmQgPSAuOwotICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHRtLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHRtLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Y2NhZTEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0bS50CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotKiBNUkkgc2NyaXB0Ci1zZWN0IC50ZXh0ID0gJDEwMAk7IC50ZXh0IHN0YXJ0IGFkZHJlc3MKLXNlY3QgLmRhdGEgPSAxMDAwaAk7IC5kYXRhIHN0YXJ0IGFkZHJlc3MKLXB1YmxpYyB0ZXh0X3N0YXJ0ID0gJDEwMAotcHVibGljIHRleHRfZW5kID0gIyBjb250aW51YXRpb24gbGluZQotICB0ZXh0X3N0YXJ0ICsgNAotcHVibGljIGRhdGFfc3RhcnQgPSAxMDAwaAotcHVibGljIGRhdGFfZW5kID0gZGF0YV9zdGFydCArIDQKLQotbG9hZCB0bXBkaXIvc2NyaXB0Lm8KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmRlZmQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIFRlc3QgU0laRU9GIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLSMgQmFzZWQgb24gYSBidWcgcmVwb3J0IGZyb20gYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlLgotCi1zZXQgdGVzdG5hbWUgIlNJWkVPRiIKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3NpemVvZi5zIHRtcGRpci9zaXplb2Yub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaXplb2YgIi1UICRzcmNkaXIvJHN1YmRpci9zaXplb2YudCB0bXBkaXIvc2l6ZW9mLm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NpemVvZl0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X3N0YXJ0KV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X2VuZCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9zdGFydCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9lbmQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHNpemVvZl90ZXh0KV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChzaXplb2ZfZGF0YSldfSB7Ci0gICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dCh0ZXh0X2VuZCkgLSAkbm1fb3V0cHV0KHRleHRfc3RhcnQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX3RleHQpfSB7Ci0gICAgc2VuZF9sb2cgInRleHRfZW5kIC0gdGV4dF9zdGFydCAhPSBzaXplb2ZfdGV4dFxuIgotICAgIHZlcmJvc2UgInRleHRfZW5kIC0gdGV4dF9zdGFydCAhPSBzaXplb2ZfdGV4dCIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dChkYXRhX2VuZCkgLSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX2RhdGEpfSB7Ci0gICAgc2VuZF9sb2cgImRhdGFfZW5kIC0gZGF0YV9zdGFydCAhPSBzaXplb2ZfZGF0YVxuIgotICAgIHZlcmJvc2UgImRhdGFfZW5kIC0gZGF0YV9zdGFydCAhPSBzaXplb2ZfZGF0YSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dChzaXplb2ZfdGV4dCkgIT0gJG5tX291dHB1dChzaXplb2ZfZGF0YSl9IHsKLSAgICBzZW5kX2xvZyAic2l6ZW9mX3RleHQgIT0gc2l6ZW9mX2RhdGFcbiIKLSAgICB2ZXJib3NlICJzaXplb2ZfdGV4dCAhPSBzaXplb2ZfZGF0YSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1wYXNzICR0ZXN0bmFtZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyMWNhMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQkuc3BhY2UJMTYKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDRhMzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1TRUNUSU9OUyB7Ci0JLnRleHQgOgotCSAgewotCSAgICB0ZXh0X3N0YXJ0ID0gLjsKLQkgICAgdG1wZGlyL3NpemVvZi5vIAotCSAgICB0ZXh0X2VuZCA9IC47Ci0JICB9Ci0JLmRhdGEgOiAKLQkgIHsgCi0JICAgIGRhdGFfc3RhcnQgPSAuOwotCSAgICAuID0gLiArIFNJWkVPRigudGV4dCk7Ci0JICAgIGRhdGFfZW5kID0gLjsKLQkgIH0KLX0JCi0KLXNpemVvZl90ZXh0ID0gU0laRU9GKC50ZXh0KTsKLXNpemVvZl9kYXRhID0gU0laRU9GKC5kYXRhKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjU5NjcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFRlc3Qgd2VhayBzeW1ib2xzLgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgotCi1zZXQgdGVzdG5hbWUgIndlYWsgc3ltYm9scyIKLQotIyBUaGlzIHRlc3Qgb25seSB3b3JrcyBmb3IgRUxGIHRhcmdldHMuICBJdCBvdWdodCB0byB3b3JrIGZvciBzb21lCi0jIGEub3V0IHRhcmdldHMsIGJ1dCBpdCBkb2Vzbid0LgotCi1pZiB7ICFbaXN0YXJnZXQgKi0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi11bml4d2FyZSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lYWJpKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDUqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWlyaXg2Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1zb2xhcmlzMipdIH0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHshIFtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3dlYWsxLnMgdG1wZGlyL3dlYWsxLm9dCi0gICAgfHwgISBbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci93ZWFrMi5zIHRtcGRpci93ZWFrMi5vXX0gdGhlbiB7Ci0gICAgIyBJdCdzIE9LIGlmIC53ZWFrIGRvZXNuJ3Qgd29yayBvbiB0aGlzIHRhcmdldC4KLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1zZXQgd2Vha19yZWdleHBfYmlnIFwKLSIuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6LioxMDAwIDAwMDAxMDA4IDAwMDAyMDBjIDEyMTIxMjEyIDM0MzQzNDM0LipDb250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOi4qMjAwMCAwMDAwMTAwOCAwMDAwMjAwYyA1NjU2NTY1NiA3ODc4Nzg3OC4qIgotCi1zZXQgd2Vha19yZWdleHBfbGl0dGxlIFwKLSIuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6LioxMDAwIDA4MTAwMDAwIDBjMjAwMDAwIDEyMTIxMjEyIDM0MzQzNDM0LipDb250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOi4qMjAwMCAwODEwMDAwMCAwYzIwMDAwMCA1NjU2NTY1NiA3ODc4Nzg3OC4qIgotCi1pZiB7ISBbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci93ZWFrICItVCAkc3JjZGlyLyRzdWJkaXIvd2Vhay50IHRtcGRpci93ZWFrMS5vIHRtcGRpci93ZWFrMi5vIl0gfSB0aGVuIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgLXMgdG1wZGlyL3dlYWsiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLXMgdG1wZGlyL3dlYWsiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCi0gICAgaWYge1tyZWdleHAgJHdlYWtfcmVnZXhwX2JpZyAkZXhlY19vdXRwdXRdIFwKLQl8fCBbcmVnZXhwICR3ZWFrX3JlZ2V4cF9saXR0bGUgJGV4ZWNfb3V0cHV0XSB9IHRoZW4gewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMDEzZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1TRUNUSU9OUwotewotICAudGV4dCAweDEwMDAgOiB7Ci0gICAgdG1wZGlyL3dlYWsxLm8oLmRhdGEpCi0gIH0KLSAgLmRhdGEgMHgyMDAwIDogewotICAgIHRtcGRpci93ZWFrMi5vKC5kYXRhKQotICB9Ci0gIC9ESVNDQVJELyA6IHsKLSAgICAqKCopCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDZmYmUxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0uZGF0YQotCS5nbG9iYWwJZm9vMQotCS5nbG9iYWwJc3ltMQotCS53ZWFrCXN5bTIKLWZvbzE6Ci0JLmxvbmcJc3ltMQotCS5sb25nCXN5bTIKLXN5bTE6Ci0JLmxvbmcJMHgxMjEyMTIxMgotc3ltMjoKLQkubG9uZwkweDM0MzQzNDM0CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlZGZmNS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLmRhdGEKLQkuZ2xvYmFsCWZvbzIKLQkud2VhawlzeW0xCi0JLmdsb2JhbAlzeW0yCi1mb28yOgotCS5sb25nCXN5bTEKLQkubG9uZwlzeW0yCi1zeW0xOgotCS5sb25nCTB4NTY1NjU2NTYKLXN5bTI6Ci0JLmxvbmcJMHg3ODc4Nzg3OApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8xLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwMjM2Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIF9zdGFydCBzaG91bGQgYmUgdGhlIG9ubHkgdGhpbmcgbGVmdCBhZnRlciBHQy4gICovCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Ci12b2lkIF9zdGFydCgpCi17Ci19Ci0KLXZvaWQgZHJvcG1lMSgpCi17Ci19Ci0KLWludCBkcm9wbWUyWzEwMl0gPSB7IDAgfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTU4ODcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBOb3JtYWxseSB3ZSBzaG91bGQgbG9vc2UgZm9vIGFuZCBrZWVwIF9zdGFydCBhbmQgX2luaXQuIAotICAgV2l0aCAtdSBmb28sIHdlIHNob3VsZCBrZWVwIHRoYXQgYXMgd2VsbC4gICovCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Ci12b2lkIF9zdGFydCgpCi17Ci19Ci0KLXZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmluaXQiKSkpCi1faW5pdCgpCi17Ci19Ci0KLWludCBmb28oKSBfX2FzbV9fKCJmb28iKTsKLWludCBmb28oKQotewotICBzdGF0aWMgaW50IHggPSAxOwotICByZXR1cm4geCsrOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTJiYzVkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMy5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXN0cnVjdCBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLSAgdmlydHVhbCB2b2lkIGJhcigpOwotfTsKLQotdm9pZCBBOjpmb28oKSB7IH0JCQkvLyBrZWVwCi12b2lkIEE6OmJhcigpIHsgfQkJCS8vIGxvb3NlCi0KLXN0cnVjdCBCIDogcHVibGljIEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotfTsKLQotdm9pZCBCOjpmb28oKSB7IH0JCQkvLyBrZWVwCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKLQotQSBhOwkJCQkJLy8ga2VlcAotQiBiOwotQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpCi17Ci0gIGdldG1lKCktPmZvbygpOwotfQotCi0vLyBJbiBhZGRpdGlvbiwga2VlcCBBJ3MgdmlydHVhbCB0YWJsZS4KLQotLy8gV2UnbGwgd2luZCB1cCBrZWVwaW5nIGBiJyBhbmQgdGh1cyBCJ3MgdmlydHVhbCB0YWJsZSBiZWNhdXNlCi0vLyBgYScgYW5kIGBiJyBhcmUgYm90aCByZWZlcmVuY2VkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgotCi1leHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjI2YWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS80LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotc3RydWN0IEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotICB2aXJ0dWFsIHZvaWQgYmFyKCk7Ci19OwotCi12b2lkIEE6OmZvbygpIHsgfQkJCS8vIGxvb3NlCi12b2lkIEE6OmJhcigpIHsgfQkJCS8vIGtlZXAKLQotc3RydWN0IEIgOiBwdWJsaWMgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci19OwotCi12b2lkIEI6OmZvbygpIHsgfQkJCS8vIGxvb3NlCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKLQotQSBhOwkJCQkJLy8ga2VlcAotQiBiOwotQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpCi17Ci0gIGdldG1lKCktPmJhcigpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYjU4NzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgc2VsZWN0aXZlIGxpbmtpbmcgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBDYXRoZXJpbmUgTW9vcmUgKGNsbUBjeWdudXMuY29tKQotIyBNYWtlIHN1cmUgdGhhdCBjb25zdHJ1Y3RvcnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0KLSMgQ09GRiBiYXNlZCBwb3J0cyBkbyBub3Qgc3VwcG9ydCBzZWxlY3RpdmUgbGlua2luZwotaWYge1tpc3RhcmdldCAiKi0qLWNvZmYiXX0gewotICByZXR1cm4KLX0KLWlmIHtbaXN0YXJnZXQgIiotKi1wZSJdfSB7Ci0gIHJldHVybgotfQotCi1zZXQgdGVzdDEgInNlbGVjdGl2ZTEiCi1zZXQgdGVzdDIgInNlbGVjdGl2ZTIiCi1zZXQgdGVzdDMgInNlbGVjdGl2ZTMiCi1zZXQgdGVzdDQgInNlbGVjdGl2ZTQiCi1zZXQgdGVzdDUgInNlbGVjdGl2ZTUiCi0KLXNldCBjZmxhZ3MgIi13IC1PMiAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucyIgCi1zZXQgY3h4ZmxhZ3MgIi1mdnRhYmxlLWdjIC1mbm8tZXhjZXB0aW9ucyAtZm5vLXJ0dGkiCi1zZXQgbGRmbGFncyAiLS1nYy1zZWN0aW9ucyAtQnN0YXRpYyIKLQotaWYgeyBbd2hpY2ggJENYWF0gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDEKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICB1bnRlc3RlZCAkdGVzdDMKLSAgICB1bnRlc3RlZCAkdGVzdDQKLSAgICB1bnRlc3RlZCAkdGVzdDUKLSAgICByZXR1cm4KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvMS5jIHRtcGRpci8xLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzEueCAiJGxkZmxhZ3MgdG1wZGlyLzEubyJdIHsKLSAgICBmYWlsICR0ZXN0MQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMS54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRyb3BtZTEpXX0gewotCQlzZW5kX2xvZyAiZHJvcG1lMSA9PSAkbm1fb3V0cHV0KGRyb3BtZTEpXG4iCi0JCXZlcmJvc2UgImRyb3BtZTEgPT0gJG5tX291dHB1dChkcm9wbWUxKSIKLQkJZmFpbCAkdGVzdDEKLQkgICAgfSBlbHNlIHsKLQkJaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZHJvcG1lMildfSB7Ci0JCSAgICBzZW5kX2xvZyAiZHJvcG1lMiA9PSAkbm1fb3V0cHV0KGRyb3BtZTIpXG4iCi0JCSAgICB2ZXJib3NlICJkcm9wbWUyID09ICRubV9vdXRwdXQoZHJvcG1lMikiCi0JCSAgICBmYWlsICR0ZXN0MQotCQl9IGVsc2UgewotCQkgICAgcGFzcyAkdGVzdDEKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvMi5jIHRtcGRpci8yLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzIueCAiJGxkZmxhZ3MgdG1wZGlyLzIubyJdIHsKLSAgICBmYWlsICR0ZXN0MgotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMi54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDIKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImZvbz09ICRubV9vdXRwdXQoZm9vKSIKLSAgICAgICAgICAgIGZhaWwgJHRlc3QyCi0JfSBlbHNlIHsKLSAgICAgICAgICAgIHBhc3MgJHRlc3QyCi0JICAgIH0gCi0JIH0KLSAgICAgfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8yLmMgdG1wZGlyLzIub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MwotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMi54ICIkbGRmbGFncyAtdSBmb28gdG1wZGlyLzIubyJdIHsKLSAgICBmYWlsICR0ZXN0MwotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMi54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDMKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dChmb28pXSB9IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3QzCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQoZm9vKSA9PSAwfSB7Ci0JCXNlbmRfbG9nICJmb28gPT0gJG5tX291dHB1dChmb28pXG4iCi0JCXZlcmJvc2UgImZvbz09ICRubV9vdXRwdXQoZm9vKSIKLQkJZmFpbCAkdGVzdDMKLQkgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXNzICR0ZXN0MwotCQl9Ci0JIH0KLSAgICAgfQotfQotCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyAkY3h4ZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8zLmNjIHRtcGRpci8zLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDQKLSAgICByZXR1cm4KLX0KLQotc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMy54ICIkbGRmbGFncyB0bXBkaXIvMy5vIl0gewotICAgZmFpbCAkdGVzdDQKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyLzMueF0gewotICAgICAgIHVucmVzb2x2ZWQgJHRlc3Q0Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChmb29fXzFCKV19IHsKLSAgICAgICAgICBzZW5kX2xvZyAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpXG4iCi0gICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgotICAgICAgICAgIGZhaWwgJHRlc3Q0Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgaWYge1sgaW5mbyBleGlzdHMgbm1fb3V0cHV0KGJhcl9fMUEpXX0gewotICAgICAgICAgICAgICBzZW5kX2xvZyAiYmFyX18xQT09ICRubV9vdXRwdXQoX2Jhcl9fMUEpXG4iCi0gICAgICAgICAgICAgIHZlcmJvc2UgImJhcl9fMUEgPT0gJG5tX291dHB1dChfYmFyX18xQSkiCi0gICAgICAgICAgICAgIGZhaWwgJHRlc3Q0Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBwYXNzICR0ZXN0NAotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci19Ci0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyAkY3h4ZmxhZ3MiICRzcmNkaXIvJHN1YmRpci80LmNjIHRtcGRpci80Lm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzQueCAiJGxkZmxhZ3MgdG1wZGlyLzQubyJdIHsKLSAgICBmYWlsICR0ZXN0NQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvNC54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDUKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUIpXX0geyAKLSAgICAgICAgICAgIHNlbmRfbG9nICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQilcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKSIKLQkgICAgZmFpbCAkdGVzdDUKLQl9IGVsc2UgewotICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUEpXX0gewotCSAgICAgICAgc2VuZF9sb2cgImZvb19fMUE9PSAkbm1fb3V0cHV0KGZvb19fMUEpXG4iCi0JCXZlcmJvc2UgImZvb19fMUEgPT0gJG5tX291dHB1dChmb29fXzFBKSIKLQkJZmFpbCAkdGVzdDUKLSAgICAgICAgICB9IGVsc2UgewotCSAgICAgIHBhc3MgJHRlc3Q1Ci0gICAgICAgICAgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2guZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3NoLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0NmQyNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2guZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgbGQtc2ggdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKLSMKLQotIyBUZXN0IFNIIHJlbGF4aW5nLiAgVGhpcyB0ZXN0cyB0aGUgY29tcGlsZXIgYW5kIGFzc2VtYmxlciBhcyB3ZWxsIGFzCi0jIHRoZSBsaW5rZXIuCi0KLWlmICFbaXN0YXJnZXQgc2gqLSotKl0gewotICAgIHJldHVybgotfQotCi1zZXQgdGVzdHNpbXBsZSAiU0ggc2ltcGxlIHJlbGF4aW5nIgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAiLXJlbGF4ICRzcmNkaXIvJHN1YmRpci9zaDEucyIgdG1wZGlyL3NoMS5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdHNpbXBsZQotfSBlbHNlIHsgaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NoMSAiLXJlbGF4IHRtcGRpci9zaDEubyJdIHsKLSAgICBmYWlsICR0ZXN0c2ltcGxlCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci9zaDFdIHsKLQl1bnJlc29sdmVkICR0ZXN0c2ltcGxlCi0gICAgfSBlbHNlIHsKLQlpZiB7IVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoYmFyKV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vKV19IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3RzaW1wbGUKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dChiYXIpICE9ICRubV9vdXRwdXQoZm9vKSArIDR9IHsKLQkJc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKLQkJdmVyYm9zZSAiZm9vID09ICRubV9vdXRwdXQoZm9vKSIKLQkJc2VuZF9sb2cgImJhciA9PSAkbm1fb3V0cHV0KGJhcilcbiIKLQkJdmVyYm9zZSAiYmFyID09ICRubV9vdXRwdXQoYmFyKSIKLQkJZmFpbCAkdGVzdHNpbXBsZQotCSAgICB9IGVsc2UgewotCQlwYXNzICR0ZXN0c2ltcGxlCi0JICAgIH0KLQl9Ci0gICAgfQotfSB9Ci0KLXNldCB0ZXN0c3JlYyAiU0ggcmVsYXhpbmcgdG8gUy1yZWNvcmRzIgotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2gxLnMxICItcmVsYXggLW9mb3JtYXQgc3JlYyB0bXBkaXIvc2gxLm8iXSB7Ci0gICAgZmFpbCAkdGVzdHNyZWMKLX0gZWxzZSB7Ci0gICAgIyBUaGUgZmlsZSBuYW1lIGlzIGVtYmVkZGVkIGluIHRoZSBTLXJlY29yZHMsIHNvIGNyZWF0ZSBib3RoCi0gICAgIyBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLWYgdG1wZGlyL3NoMS5zMiIgZXhlY19vdXRwdXQKLSAgICBzZW5kX2xvZyAibXYgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyXG4iCi0gICAgdmVyYm9zZSAibXYgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIgotICAgIGNhdGNoICJleGVjIG12IHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCXVucmVzb2x2ZWQgJHRlc3RzcmVjCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc2gxIHRtcGRpci9zaDEuczEiCi0JdmVyYm9zZSAiJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc2gxIHRtcGRpci9zaDEuczEiCi0JY2F0Y2ggImV4ZWMgJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc2gxIHRtcGRpci9zaDEuczEiIGV4ZWNfb3V0cHV0Ci0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQkgICAgdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCSAgICB1bnJlc29sdmVkICR0ZXN0c3JlYwotCX0gZWxzZSB7Ci0JICAgIHNlbmRfbG9nICJjbXAgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyXG4iCi0JICAgIHZlcmJvc2UgImNtcCB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiCi0JICAgIGNhdGNoICJleGVjIGNtcCB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiIGV4ZWNfb3V0cHV0Ci0JICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQkJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JCWZhaWwgJHRlc3RzcmVjCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgJHRlc3RzcmVjCi0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zZXQgdGVzdGxpbmsgIlNIIHJlbGF4aW5nIgotc2V0IHRlc3Rqc3IgIlNIIGNvbmZpcm0gcmVsYXhpbmciCi1zZXQgdGVzdHJ1biAiU0ggcmVsYXhpbmcgZXhlY3V0aW9uIgotCi1pZiB7IFt3aGljaCAkQ0NdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3RsaW5rCi0gICAgdW50ZXN0ZWQgJHRlc3Rqc3IKLSAgICB1bnRlc3RlZCAkdGVzdHJ1bgotICAgIHJldHVybgotfQotCi1pZiB7IVtsZF9hc3NlbWJsZSAkYXMgIi1yZWxheCAkc3JjZGlyLyRzdWJkaXIvc3RhcnQucyIgdG1wZGlyL3N0YXJ0Lm9dIFwKLSAgICAgfHwgIVtsZF9jb21waWxlICRDQyAiLU8gLW1yZWxheCAkc3JjZGlyLyRzdWJkaXIvc2gyLmMiIHRtcGRpci9zaDIub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bGluawotICAgIHVucmVzb2x2ZWQgJHRlc3Rqc3IKLSAgICB1bnJlc29sdmVkICR0ZXN0cnVuCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaDIgIi1yZWxheCB0bXBkaXIvc3RhcnQubyB0bXBkaXIvc2gyLm8iXSB7Ci0gICAgZmFpbCAkdGVzdGxpbmsKLSAgICB1bnJlc29sdmVkICR0ZXN0anNyCi0gICAgdW5yZXNvbHZlZCAkdGVzdHJ1bgotICAgIHJldHVybgotfQotCi1wYXNzICR0ZXN0bGluawotCi1zZW5kX2xvZyAiJG9iamR1bXAgLWQgdG1wZGlyL3NoMlxuIgotdmVyYm9zZSAiJG9iamR1bXAgLWQgdG1wZGlyL3NoMiIKLWNhdGNoICJleGVjICRvYmpkdW1wIC1kIHRtcGRpci9zaDIiIGV4ZWNfb3V0cHV0Ci1pZiBbc3RyaW5nIG1hdGNoICIqanNyKiIgJGV4ZWNfb3V0cHV0XSB7Ci0gICAgZmFpbCAkdGVzdGpzcgotfSBlbHNlIHsKLSAgICBwYXNzICR0ZXN0anNyCi19Ci0KLWlmIHsgIVtpbmZvIGV4aXN0cyBTSU1dIHx8IFt3aGljaCAkU0lNXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0cnVuCi0gICAgcmV0dXJuCi19Ci0KLXNldCBzdGF0dXMgW2NhdGNoICJleGVjICRTSU0gdG1wZGlyL3NoMiIgZXhlY19vdXRwdXRdCi1pZiB7ICRzdGF0dXMgPT0gMCB9IHsKLSAgICBwYXNzICR0ZXN0cnVuCi19IGVsc2UgewotICAgIGZhaWwgJHRlc3RydW4KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDEucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4ZTQzOS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLWZvbzoKLUwxOgkKLQltb3YubAlMMixyMAotCS51c2VzCUwxCi0JanNyCUByMAotCXJ0cwotCS5hbGlnbgkyCi1MMjoKLQkubG9uZwliYXIKLWJhcjoKLQlydHMKLQkuYWxpZ24JNApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdmZTg4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi1pbnQgZ2xvYmFsOwotCi1leHRlcm4gdm9pZCB0cmFwIChpbnQsIGludCk7Ci1zdGF0aWMgdm9pZCBxdWl0IChpbnQpOwotc3RhdGljIGludCBmb28gKGludCk7Ci0KLWludAotbWFpbiAoKQotewotICBpZiAoZm9vICgwKSAhPSAwIHx8IGdsb2JhbCAhPSAwKQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICgxKSAhPSAxIHx8IGdsb2JhbCAhPSAxKQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICgyKSAhPSAyIHx8IGdsb2JhbCAhPSAyKQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICgzKSAhPSAzIHx8IGdsb2JhbCAhPSAzKQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg0KSAhPSA0IHx8IGdsb2JhbCAhPSA0KQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg1KSAhPSA1IHx8IGdsb2JhbCAhPSA1KQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg2KSAhPSA2IHx8IGdsb2JhbCAhPSA2KQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg3KSAhPSA3IHx8IGdsb2JhbCAhPSA3KQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg4KSAhPSA4IHx8IGdsb2JhbCAhPSA4KQotICAgIHF1aXQgKDEpOwotICBxdWl0ICgwKTsKLX0KLQotdm9pZAotX19tYWluICgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1xdWl0IChpbnQgc3RhdHVzKQotewotICB0cmFwICgxLCBzdGF0dXMpOwotfQotCi1pbnQKLWJhciAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IGk7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjAgKGludCBpKQotewotICBnbG9iYWwgPSAwOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXIxIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gMTsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyMiAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDI7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjMgKGludCBpKQotewotICBnbG9iYWwgPSAzOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXI0IChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gNDsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyNSAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDU7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjYgKGludCBpKQotewotICBnbG9iYWwgPSA2OwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXI3IChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gNzsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotZm9vIChpbnQgaSkKLXsKLSAgc3dpdGNoIChpKQotICAgIHsKLSAgICBjYXNlIDA6IGJhcjAgKDApOyByZXR1cm4gMDsKLSAgICBjYXNlIDE6IGJhcjEgKDEpOyByZXR1cm4gMTsKLSAgICBjYXNlIDI6IGJhcjIgKDIpOyByZXR1cm4gMjsKLSAgICBjYXNlIDM6IGJhcjMgKDMpOyByZXR1cm4gMzsKLSAgICBjYXNlIDQ6IGJhcjQgKDQpOyByZXR1cm4gNDsKLSAgICBjYXNlIDU6IGJhcjUgKDUpOyByZXR1cm4gNTsKLSAgICBjYXNlIDY6IGJhcjYgKDYpOyByZXR1cm4gNjsKLSAgICBjYXNlIDc6IGJhcjcgKDcpOyByZXR1cm4gNzsKLSAgICBkZWZhdWx0OiByZXR1cm4gYmFyIChpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc3RhcnQucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zdGFydC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY0Yzc5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zdGFydC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCS5zZWN0aW9uIC50ZXh0Ci0JLmdsb2JhbAlzdGFydAotc3RhcnQ6Ci0KLQltb3YubAlzdGFja19rLHIxNQotCi0JISBjYWxsIHRoZSBtYWlubGluZQkKLUwxOgkKLQltb3YubAltYWluX2sscjAKLQkudXNlcwlMMQotCWpzcglAcjAKLQlub3AKLQotCS5hbGlnbiAyCi1zdGFja19rOgotCS5sb25nCV9zdGFjawkKLW1haW5fazoKLQkubG9uZwlfbWFpbgotCi0JLmdsb2JhbCBfdHJhcAotX3RyYXA6CQotCXRyYXBhICMzCi0JcnRzCi0Jbm9wCi0KLQkuc2VjdGlvbiAuc3RhY2sKLV9zdGFjazoJLmxvbmcJMHhkZWFkZGVhZApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9lbGYtb2Zmc2V0LmxkIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9lbGYtb2Zmc2V0LmxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU0MjkzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvZWxmLW9mZnNldC5sZAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9IDB4MTAwMDAwOwotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLmdudS52ZXJzaW9uICAgOiB7ICooLmdudS52ZXJzaW9uKQl9Ci0gIC5nbnUudmVyc2lvbl9kICAgOiB7ICooLmdudS52ZXJzaW9uX2QpCX0KLSAgLmdudS52ZXJzaW9uX3IgICA6IHsgKiguZ251LnZlcnNpb25fcikJfQotICAucmVsLnRleHQgICAgICA6Ci0gICAgewotICAgICAgKigucmVsLnRleHQpCi0gICAgICAqKC5yZWwudGV4dC4qKQotICAgICAgKigucmVsLmdudS5saW5rb25jZS50KikKLSAgICB9Ci0gIC5yZWxhLnRleHQgICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnRleHQpCi0gICAgICAqKC5yZWxhLnRleHQuKikKLSAgICAgICooLnJlbGEuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLnJlbC5kYXRhICAgICAgOgotICAgIHsKLSAgICAgICooLnJlbC5kYXRhKQotICAgICAgKigucmVsLmRhdGEuKikKLSAgICAgICooLnJlbC5nbnUubGlua29uY2UuZCopCi0gICAgfQotICAucmVsYS5kYXRhICAgICA6Ci0gICAgewotICAgICAgKigucmVsYS5kYXRhKQotICAgICAgKigucmVsYS5kYXRhLiopCi0gICAgICAqKC5yZWxhLmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5yZWwucm9kYXRhICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWwucm9kYXRhKQotICAgICAgKigucmVsLnJvZGF0YS4qKQotICAgICAgKigucmVsLmdudS5saW5rb25jZS5yKikKLSAgICB9Ci0gIC5yZWxhLnJvZGF0YSAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICooLnJlbGEucm9kYXRhLiopCi0gICAgICAqKC5yZWxhLmdudS5saW5rb25jZS5yKikKLSAgICB9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX0KLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfQotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX0KLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgS0VFUCAoKiguaW5pdCkpCX0KLSAgLnBsdCAgICAgIDogeyAqKC5wbHQpCX0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICAqKC50ZXh0KQotICAgICooLnRleHQuKikKLSAgICAqKC5zdHViKQotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwotICAgICooLmdudS53YXJuaW5nKQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgfQotICBfZXRleHQgPSAuOwotICBQUk9WSURFIChldGV4dCA9IC4pOwotICAuZmluaSAgICAgIDogeyBLRUVQICgqKC5maW5pKSkJCX0gPTB4OTA5MAotICAucm9kYXRhICAgIDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGEuKikKLSAgICAqKC5nbnUubGlua29uY2UuciopCi0gIH0KLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bwotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KLSAgLiA9IEFMSUdOKDB4MTAwMCkgKyAoLiAmICgweDEwMDAgLSAxKSk7Ci0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YS4qKQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICBTT1JUKENPTlNUUlVDVE9SUykKLSAgfQotICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH0KLSAgLmN0b3JzICAgICAgICAgOgotICB7Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGUgY29uc3RydWN0b3JzLCBzbwotICAgICAgIHdlIG1ha2Ugc3VyZSBpdCBpcyBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90IGFjdHVhbGx5IGxpbmsgYWdhaW5zdAotICAgICAgIGNydGJlZ2luLm87IHRoZSBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2gKLSAgICAgICBkaXJlY3RvcnkgY3J0YmVnaW4ubyBpcyBpbi4gICovCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gIH0KLSAgLmR0b3JzICAgICAgICAgOgotICB7Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gIH0KLSAgLmdvdCAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSAqKC5zZGF0YS4qKSB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bwotICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCi0gICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCi0gICAuID0gQUxJR04oMzIgLyA4KTsKLSAgfQotICAuID0gQUxJR04oMzIgLyA4KTsKLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Ci0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTVjNzhhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogVGhpcyBpcyB0aGUgbWFpbiBwcm9ncmFtIGZvciB0aGUgc2hhcmVkIGxpYnJhcnkgdGVzdC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgbWFpbnZhciA9IDE7Ci1pbnQgb3ZlcnJpZGRlbnZhciA9IDI7Ci1leHRlcm4gaW50IHNobGlidmFyMTsKLQotZXh0ZXJuIGludCBzaGxpYl9tYWludmFyICgpOwotZXh0ZXJuIGludCBzaGxpYl9vdmVycmlkZGVudmFyICgpOwotZXh0ZXJuIGludCBzaGxpYl9zaGxpYnZhcjEgKCk7Ci1leHRlcm4gaW50IHNobGliX3NobGlidmFyMiAoKTsKLWV4dGVybiBpbnQgc2hsaWJfc2hsaWJjYWxsICgpOwotZXh0ZXJuIGludCBzaGxpYl9tYWluY2FsbCAoKTsKLWV4dGVybiBpbnQgc2hsaWJfY2hlY2tmdW5wdHIxICgpOwotZXh0ZXJuIGludCBzaGxpYl9jaGVja2Z1bnB0cjIgKCk7Ci1leHRlcm4gaW50ICgqc2hsaWJfZ2V0ZnVucHRyMSAoKSkgKCk7Ci1leHRlcm4gaW50ICgqc2hsaWJfZ2V0ZnVucHRyMiAoKSkgKCk7Ci1leHRlcm4gaW50IHNobGliX2NoZWNrICgpOwotZXh0ZXJuIGludCBzaGxpYl9zaGxpYmNhbGwyICgpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi1pbnQKLW1haW5fY2FsbGVkICgpCi17Ci0gIHJldHVybiA2OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyBhIGZ1bmN0aW9uIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLWludAotc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpCi17Ci0gIHJldHVybiA4OwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50ICgqcCkgKCk7Ci0KLSAgcHJpbnRmICgibWFpbnZhciA9PSAlZFxuIiwgbWFpbnZhcik7Ci0gIHByaW50ZiAoIm92ZXJyaWRkZW52YXIgPT0gJWRcbiIsIG92ZXJyaWRkZW52YXIpOwotICBwcmludGYgKCJzaGxpYnZhcjEgPT0gJWRcbiIsIHNobGlidmFyMSk7Ci0jaWZuZGVmIFhDT0ZGX1RFU1QKLSAgcHJpbnRmICgic2hsaWJfbWFpbnZhciAoKSA9PSAlZFxuIiwgc2hsaWJfbWFpbnZhciAoKSk7Ci0gIHByaW50ZiAoInNobGliX292ZXJyaWRkZW52YXIgKCkgPT0gJWRcbiIsIHNobGliX292ZXJyaWRkZW52YXIgKCkpOwotI2VuZGlmCi0gIHByaW50ZiAoInNobGliX3NobGlidmFyMSAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJ2YXIxICgpKTsKLSAgcHJpbnRmICgic2hsaWJfc2hsaWJ2YXIyICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYnZhcjIgKCkpOwotICBwcmludGYgKCJzaGxpYl9zaGxpYmNhbGwgKCkgPT0gJWRcbiIsIHNobGliX3NobGliY2FsbCAoKSk7Ci0jaWZuZGVmIFhDT0ZGX1RFU1QKLSAgcHJpbnRmICgic2hsaWJfc2hsaWJjYWxsMiAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJjYWxsMiAoKSk7Ci0gIHByaW50ZiAoInNobGliX21haW5jYWxsICgpID09ICVkXG4iLCBzaGxpYl9tYWluY2FsbCAoKSk7Ci0jZW5kaWYKLSAgcHJpbnRmICgibWFpbl9jYWxsZWQgKCkgPT0gJWRcbiIsIG1haW5fY2FsbGVkICgpKTsKLSAgcHJpbnRmICgic2hsaWJfY2hlY2tmdW5wdHIxIChzaGxpYl9zaGxpYnZhcjEpID09ICVkXG4iLAotCSAgc2hsaWJfY2hlY2tmdW5wdHIxIChzaGxpYl9zaGxpYnZhcjEpKTsKLSNpZm5kZWYgWENPRkZfVEVTVAotICBwcmludGYgKCJzaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSA9PSAlZFxuIiwKLQkgIHNobGliX2NoZWNrZnVucHRyMiAobWFpbl9jYWxsZWQpKTsKLSNlbmRpZgotICBwID0gc2hsaWJfZ2V0ZnVucHRyMSAoKTsKLSAgcHJpbnRmICgic2hsaWJfZ2V0ZnVucHRyMSAoKSAiKTsKLSAgaWYgKHAgPT0gc2hsaWJfc2hsaWJ2YXIxKQotICAgIHByaW50ZiAoIj09Iik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIhPSIpOwotICBwcmludGYgKCIgc2hsaWJfc2hsaWJ2YXIxXG4iKTsKLSNpZm5kZWYgWENPRkZfVEVTVAotICBwID0gc2hsaWJfZ2V0ZnVucHRyMiAoKTsKLSAgcHJpbnRmICgic2hsaWJfZ2V0ZnVucHRyMiAoKSAiKTsKLSAgaWYgKHAgPT0gbWFpbl9jYWxsZWQpCi0gICAgcHJpbnRmICgiPT0iKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiE9Iik7Ci0gIHByaW50ZiAoIiBtYWluX2NhbGxlZFxuIik7Ci0jZW5kaWYKLSAgcHJpbnRmICgic2hsaWJfY2hlY2sgKCkgPT0gJWRcbiIsIHNobGliX2NoZWNrICgpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMS5jIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmMTgzYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qIFRoaXMgaXMgcGFydCBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgbGQgdGVzdC4gIFRoaXMgZmlsZSBiZWNvbWVzIHBhcnQKLSAgIG9mIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHN1cHBsaWVkIGJ5IHRoZSBtYWluIHByb2dyYW0uICAqLwotI2lmbmRlZiBYQ09GRl9URVNUCi1leHRlcm4gaW50IG1haW52YXI7Ci0jZW5kaWYKLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeSwgYW5kIG92ZXJyaWRkZW4gYnkKLSAgIHRoZSBtYWluIHByb2dyYW0uICAqLwotI2lmbmRlZiBYQ09GRl9URVNUCi1pbnQgb3ZlcnJpZGRlbnZhciA9IC0xOwotI2VuZGlmCi0KLS8qIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotaW50IHNobGlidmFyMSA9IDM7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBieSBhbm90aGVyIG9iamVjdCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotZXh0ZXJuIGludCBzaGxpYnZhcjI7Ci0KLS8qIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHZhbHVlcyBvZiB0aGUgYWJvdmUgdmFyaWFibGVzIGFzIHNlZW4gaW4KLSAgIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50Ci1zaGxpYl9tYWludmFyICgpCi17Ci0gIHJldHVybiBtYWludmFyOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50Ci1zaGxpYl9vdmVycmlkZGVudmFyICgpCi17Ci0gIHJldHVybiBvdmVycmlkZGVudmFyOwotfQotI2VuZGlmCi0KLWludAotc2hsaWJfc2hsaWJ2YXIxICgpCi17Ci0gIHJldHVybiBzaGxpYnZhcjE7Ci19Ci0KLWludAotc2hsaWJfc2hsaWJ2YXIyICgpCi17Ci0gIHJldHVybiBzaGxpYnZhcjI7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGFub3RoZXIgb2JqZWN0IGluIHRoZQotICAgc2hhcmVkIGxpYnJhcnkuICAqLwotCi1leHRlcm4gaW50IHNobGliX3NobGliY2FsbGVkICgpOwotCi1pbnQKLXNobGliX3NobGliY2FsbCAoKQotewotICByZXR1cm4gc2hsaWJfc2hsaWJjYWxsZWQgKCk7Ci19Ci0KLSNpZm5kZWYgWENPRkZfVEVTVAotLyogVGhpcyBmdW5jdGlvbiBjYWxscyBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhpcyBvYmplY3QgaW4gdGhlIHNoYXJlZAotICAgbGlicmFyeS4gIFRoZSBtYWluIHByb2dyYW0gd2lsbCBvdmVycmlkZSB0aGUgY2FsbGVkIGZ1bmN0aW9uLiAgKi8KLQotZXh0ZXJuIGludCBzaGxpYl9vdmVycmlkZGVuY2FsbDIgKCk7Ci0KLWludAotc2hsaWJfc2hsaWJjYWxsMiAoKQotewotICByZXR1cm4gc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpOwotfQotCi1pbnQKLXNobGliX292ZXJyaWRkZW5jYWxsMiAoKQotewotICByZXR1cm4gNzsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KLQotI2lmbmRlZiBYQ09GRl9URVNUCi1leHRlcm4gaW50IG1haW5fY2FsbGVkICgpOwotCi1pbnQKLXNobGliX21haW5jYWxsICgpCi17Ci0gIHJldHVybiBtYWluX2NhbGxlZCAoKTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gc2hsaWJfbWFpbnZhci4gIEl0Ci0gICBjb25maXJtcyB0aGF0IHRoZSBwb2ludGVyIGNvbXBhcmVzIGVxdWFsbHkuICAqLwotCi1pbnQgCi1zaGxpYl9jaGVja2Z1bnB0cjEgKHApCi0gICAgIGludCAoKnApICgpOwotewotICByZXR1cm4gcCA9PSBzaGxpYl9zaGxpYnZhcjE7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIGEgZnVuY3Rpb24gcG9pbnRlciB0byBtYWluX2NhbGxlZC4gIEl0Ci0gICBjb25maXJtcyB0aGF0IHRoZSBwb2ludGVyIGNvbXBhcmVzIGVxdWFsbHkuICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotc2hsaWJfY2hlY2tmdW5wdHIyIChwKQotICAgICBpbnQgKCpwKSAoKTsKLXsKLSAgcmV0dXJuIHAgPT0gbWFpbl9jYWxsZWQ7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBzaGxpYl9tYWludmFyLiAgKi8KLQotaW50Ci0oKnNobGliX2dldGZ1bnB0cjEgKCkpICgpCi17Ci0gIHJldHVybiBzaGxpYl9zaGxpYnZhcjE7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gbWFpbl9jYWxsZWQuICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotKCpzaGxpYl9nZXRmdW5wdHIyICgpKSAoKQotewotICByZXR1cm4gbWFpbl9jYWxsZWQ7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgY29uc3RhbnQgZGF0YSBhbmQgbG9jYWwgZnVuY3Rpb25zCi0gICB3b3JrLiAgKi8KLQotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaSA9IDY7Ci1zdGF0aWMgY29uc3QgY2hhciAqc3RyID0gIkhlbGxvLCB3b3JsZFxuIjsKLQotaW50Ci1zaGxpYl9jaGVjayAoKQotewotICBjb25zdCBjaGFyICpzMSwgKnMyOwotCi0gIGlmIChpICE9IDYpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogVG8gaXNvbGF0ZSB0aGUgdGVzdCwgZG9uJ3QgcmVseSBvbiBhbnkgZXh0ZXJuYWwgZnVuY3Rpb25zLCBzdWNoCi0gICAgIGFzIHN0cmNtcC4gICovCi0gIHMxID0gIkhlbGxvLCB3b3JsZFxuIjsKLSAgczIgPSBzdHI7Ci0gIHdoaWxlICgqczEgIT0gJ1wwJykKLSAgICBpZiAoKnMxKysgIT0gKnMyKyspCi0gICAgICByZXR1cm4gMDsKLSAgaWYgKCpzMiAhPSAnXDAnKQotICAgIHJldHVybiAwOwotCi0gIGlmIChzaGxpYl9zaGxpYnZhcjEgKCkgIT0gMykKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTNhNGUwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKiBUaGlzIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGxkIHRlc3QuICBUaGlzIGZpbGUgYmVjb21lcyBwYXJ0Ci0gICBvZiBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGhlcmUsIGFuZCByZWZlcmVuY2VkIGJ5IGFub3RoZXIgZmlsZSBpbgotICAgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLWludCBzaGxpYnZhcjIgPSA0OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhbm90aGVyIGZpbGUgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotaW50Ci1zaGxpYl9zaGxpYmNhbGxlZCAoKQotewotICByZXR1cm4gNTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmRhdCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlZTM3Zi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX21haW52YXIgKCkgPT0gMQotc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAyCi1zaGxpYl9zaGxpYnZhcjEgKCkgPT0gMwotc2hsaWJfc2hsaWJ2YXIyICgpID09IDQKLXNobGliX3NobGliY2FsbCAoKSA9PSA1Ci1zaGxpYl9zaGxpYmNhbGwyICgpID09IDgKLXNobGliX21haW5jYWxsICgpID09IDYKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAxCi1zaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpID09IHNobGliX3NobGlidmFyMQotc2hsaWJfZ2V0ZnVucHRyMiAoKSA9PSBtYWluX2NhbGxlZAotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIwYThjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXNoYXJlZCB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGxkIGNhbiBnZW5lcmF0ZSBFTEYgc2hhcmVkIGxpYnJhcmllcy4KLSMgTm90ZSB0aGF0IGxpbmtpbmcgYWdhaW5zdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBpcyB0ZXN0ZWQgYnkgdGhlCi0jIGJvb3RzdHJhcCB0ZXN0LgotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgbGQgZ2VuZXJhdGVzIG5hdGl2ZSBleGVjdXRhYmxlcy4KLWlmICFbaXNuYXRpdmVdIHRoZW4ge3JldHVybn0KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIG9uIGEgY291cGxlIG9mIEVMRiBwbGF0Zm9ybXMuCi0jIFNxdWFyZSBicmFja2V0IGV4cHJlc3Npb25zIHNlZW0gdG8gY29uZnVzZSBpc3RhcmdldC4KLWlmIHsgIVtpc3RhcmdldCBpMzg2LSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNTg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk0ODYtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc3Vub3M0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHNwYXJjKi0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgKi0qLWxpbnV4KmFvdXQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotc2V0IHRtcGRpciB0bXBkaXIKLXNldCBTSENGTEFHICIiCi0KLWlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQotICAgICMgQUlYIHNoYXJlZCBsaWJyYXJpZXMgZG8gbm90IHNlZW0gdG8gc3VwcG9ydCB1c2VmdWwgZmVhdHVyZXMsCi0gICAgIyBsaWtlIG92ZXJyaWRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5IGZ1bmN0aW9uIG9yIGxldHRpbmcgdGhlCi0gICAgIyBzaGFyZWQgbGlicmFyeSByZWZlciB0byBvYmplY3RzIGRlZmluZWQgaW4gdGhlIG1haW4gcHJvZ3JhbS4gIFdlCi0gICAgIyBhdm9pZCB0ZXN0aW5nIHRob3NlIGZlYXR1cmVzLgotICAgIHNldCBTSENGTEFHICItRFhDT0ZGX1RFU1QiCi0KLSAgICAjIFRoZSBBSVggMy4yLjUgbG9hZGVyIGFwcGVhcnMgdG8gcmFuZG9tbHkgZmFpbCB3aGVuIGxvYWRpbmcKLSAgICAjIHNoYXJlZCBsaWJyYXJpZXMgZnJvbSBOU0YgbW91bnRlZCBwYXJ0aXRpb25zLCBzbyB3ZSBhdm9pZCBhbnkKLSAgICAjIHBvdGVudGlhbCBwcm9ibGVtcyBieSB1c2luZyBhIGxvY2FsIGRpcmVjdG9yeS4KLSAgICBjYXRjaCB7ZXhlYyAvYmluL3NoIC1jICJlY2hvICQkIn0gcGlkCi0gICAgc2V0IHRtcGRpciAvdXNyL3RtcC9sZC4kcGlkCi0gICAgY2F0Y2ggImV4ZWMgbWtkaXIgJHRtcGRpciIgZXhlY19zdGF0dXMKLQotICAgICMgT24gQUlYLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgZXhwb3J0IHRoZSBzeW1ib2xzIHRoZSBzaGFyZWQKLSAgICAjIGxpYnJhcnkgaXMgZ29pbmcgdG8gcHJvdmlkZSwgYW5kIG5lZWQuCi0gICAgc2V0IGZpbGUgW29wZW4gJHRtcGRpci94Y29mZi5leHAgd10KLSAgICBwdXRzICRmaWxlIHNobGlidmFyMQotICAgIHB1dHMgJGZpbGUgc2hsaWJ2YXIyCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYnZhcjEKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGlidmFyMgotICAgIHB1dHMgJGZpbGUgc2hsaWJfc2hsaWJjYWxsCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYmNhbGxlZAotICAgIHB1dHMgJGZpbGUgc2hsaWJfY2hlY2tmdW5wdHIxCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9nZXRmdW5wdHIxCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9jaGVjawotICAgIGNsb3NlICRmaWxlCi19Ci0KLSMgVGhlIHRlc3QgcHJvY2VkdXJlLgotcHJvYyBzaGFyZWRfdGVzdCB7IHByb2duYW1lIHRlc3RuYW1lIG1haW4gc2gxIHNoMiBkYXQgYXJncyB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiBbbGxlbmd0aCAkYXJnc10geyBzZXQgc2hsZGZsYWdzIFtsaW5kZXggJGFyZ3MgMF0gfSBlbHNlIHsgc2V0IHNobGRmbGFncyAiIiB9Ci0KLSAgICAjIEJ1aWxkIHRoZSBzaGFyZWQgbGlicmFyeS4KLSAgICAjIE9uIEFJWCwgd2UgbmVlZCB0byB1c2UgYW4gZXhwb3J0IGZpbGUuCi0gICAgc2V0IHNoYXJlZCAtc2hhcmVkCi0gICAgaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCXNldCBzaGFyZWQgIi1iTTpTUkUgLWJFOiR0bXBkaXIveGNvZmYuZXhwIgotICAgIH0KLSAgICBpZiB7IVtsZF9zaW1wbGVfbGluayAkbGQgJHRtcGRpci8kcHJvZ25hbWUuc28gIiRzaGFyZWQgJHNobGRmbGFncyAkdG1wZGlyLyRzaDEgJHRtcGRpci8kc2gyIl19IHsKLSAgICAgICAgZmFpbCAiJHRlc3RuYW1lIgotICAgIAlyZXR1cm4KLSAgICB9Ci0KLSAgICAjIExpbmsgYWdhaW5zdCB0aGUgc2hhcmVkIGxpYnJhcnkuICBVc2UgLXJwYXRoIHNvIHRoYXQgdGhlCi0gICAgIyBkeW5hbWljIGxpbmtlciBjYW4gbG9jYXRlIHRoZSBzaGFyZWQgbGlicmFyeSBhdCBydW50aW1lLgotICAgICMgT24gQUlYLCB3ZSBtdXN0IGluY2x1ZGUgL2xpYiBpbiAtcnBhdGgsIGFzIG90aGVyd2lzZSB0aGUgbG9hZGVyCi0gICAgIyBjYW4gbm90IGZpbmQgLWxjLgotICAgIHNldCBycGF0aCAkdG1wZGlyCi0gICAgaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCXNldCBycGF0aCAvbGliOiR0bXBkaXIKLSAgICB9Ci0gICAgaWYgIVtsZF9saW5rICRsZCAkdG1wZGlyLyRwcm9nbmFtZSAiLXJwYXRoICRycGF0aCAkdG1wZGlyLyRtYWluICR0bXBkaXIvJHByb2duYW1lLnNvIl0gewotICAgIAlmYWlsICIkdGVzdG5hbWUiCi0gICAgCXJldHVybgotICAgIH0KLQotICAgICMgUnVuIHRoZSByZXN1bHRpbmcgcHJvZ3JhbQotICAgIHNlbmRfbG9nICIkdG1wZGlyLyRwcm9nbmFtZSA+JHRtcGRpci8kcHJvZ25hbWUub3V0XG4iCi0gICAgdmVyYm9zZSAiJHRtcGRpci8kcHJvZ25hbWUgPiR0bXBkaXIvJHByb2duYW1lLm91dCIKLSAgICBjYXRjaCAiZXhlYyAkdG1wZGlyLyRwcm9nbmFtZSA+JHRtcGRpci8kcHJvZ25hbWUub3V0IiBleGVjX291dHB1dAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdG5hbWUiCi0gICAgCXJldHVybgotICAgIH0KLQotICAgIHNlbmRfbG9nICJkaWZmICR0bXBkaXIvJHByb2duYW1lLm91dCAkc3JjZGlyLyRzdWJkaXIvJGRhdC5kYXRcbiIKLSAgICB2ZXJib3NlICJkaWZmICR0bXBkaXIvJHByb2duYW1lLm91dCAkc3JjZGlyLyRzdWJkaXIvJGRhdC5kYXQiCi0gICAgY2F0Y2ggImV4ZWMgZGlmZiAkdG1wZGlyLyRwcm9nbmFtZS5vdXQgJHNyY2Rpci8kc3ViZGlyLyRkYXQuZGF0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JZmFpbCAiJHRlc3RuYW1lIgotICAgICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICIkdGVzdG5hbWUiCi19Ci0KLWlmIFtpc3RhcmdldCBtaXBzKi0qLSpdIHsKLSAgICBzZXQgcGljZmxhZyAiIgotfSBlbHNlIHsKLSAgICAjIFVuZm9ydHVuYXRlbHksIHRoZSBnY2MgYXJndW1lbnQgaXMgLWZwaWMgYW5kIHRoZSBjYyBhcmd1bWVudCBpcwotICAgICMgLUtQSUMuICBXZSBoYXZlIHRvIHRyeSBib3RoLgotICAgIHNldCBwaWNmbGFnICItZnBpYyIKLSAgICBzZW5kX2xvZyAiJENDICRwaWNmbGFnXG4iCi0gICAgdmVyYm9zZSAiJENDICRwaWNmbGFnIgotICAgIGNhdGNoICJleGVjICRDQyAkcGljZmxhZyIgZXhlY19vdXRwdXQKLSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0gICAgdmVyYm9zZSAiLS0iICIkZXhlY19vdXRwdXQiCi0gICAgaWYgeyBbc3RyaW5nIG1hdGNoICIqaWxsZWdhbCBvcHRpb24qIiAkZXhlY19vdXRwdXRdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKm9wdGlvbiBpZ25vcmVkKiIgJGV4ZWNfb3V0cHV0XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIip1bnJlY29nbml6ZWQgb3B0aW9uKiIgJGV4ZWNfb3V0cHV0XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipwYXNzZWQgdG8gbGQqIiAkZXhlY19vdXRwdXRdIH0gewotCWlmIFtpc3RhcmdldCAqLSotc3Vub3M0Kl0gewotCSAgICBzZXQgcGljZmxhZyAiLXBpYyIKLQl9IGVsc2UgewotCSAgICBzZXQgcGljZmxhZyAiLUtQSUMiCi0JfQotICAgIH0KLX0KLXZlcmJvc2UgIlVzaW5nICRwaWNmbGFnIHRvIGNvbXBpbGUgUElDIGNvZGUiCi0KLSMgQ29tcGlsZSB0aGUgbWFpbiBwcm9ncmFtLgotaWYgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL21haW4uYyAkdG1wZGlyL21haW5ucC5vXSB7Ci0gICAgdW5yZXNvbHZlZCAic2hhcmVkIChub24gUElDKSIKLSAgICB1bnJlc29sdmVkICJzaGFyZWQiCi19IGVsc2UgewotICAgICMgVGhlIHNoYXJlZCBsaWJyYXJ5IGlzIGNvbXBvc2VkIG9mIHR3byBmaWxlcy4gIEZpcnN0IGNvbXBpbGUgdGhlbQotICAgICMgd2l0aG91dCB1c2luZyAtZnBpYy4gIFRoYXQgc2hvdWxkIHdvcmsgb24gYW4gRUxGIHN5c3RlbSwKLSAgICAjIGFsdGhvdWdoIGl0IHdpbGwgYmUgbGVzcyBlZmZpY2llbnQgYmVjYXVzZSB0aGUgZHluYW1pYyBsaW5rZXIKLSAgICAjIHdpbGwgbmVlZCB0byBkbyBtb3JlIHJlbG9jYXRpb24gd29yay4gIEhvd2V2ZXIsIG5vdGUgdGhhdCBub3QKLSAgICAjIHVzaW5nIC1mcGljIHdpbGwgY2F1c2Ugc29tZSBvZiB0aGUgdGVzdHMgdG8gcmV0dXJuIGRpZmZlcmVudAotICAgICMgcmVzdWx0cy4KLSAgICBpZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUciICRzcmNkaXIvJHN1YmRpci9zaDEuYyAkdG1wZGlyL3NoMW5wLm9dCi0JIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUciICRzcmNkaXIvJHN1YmRpci9zaDIuYyAkdG1wZGlyL3NoMm5wLm9dIH0gewotCXVucmVzb2x2ZWQgInNoYXJlZCAobm9uIFBJQykiCi0gICAgfSBlbHNlIHsgaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCXNoYXJlZF90ZXN0IHNobnAgInNoYXJlZCAobm9uUElDKSIgbWFpbm5wLm8gc2gxbnAubyBzaDJucC5vIHhjb2ZmCi0gICAgfSBlbHNlIHsKLQkjIFN1bk9TIG5vbiBQSUMgc2hhcmVkIGxpYnJhcmllcyBkb24ndCBwZXJtaXQgc29tZSBjYXNlcyBvZgotCSMgb3ZlcnJpZGluZy4KLQlzZXR1cF94ZmFpbCAiKi0qLXN1bm9zNCoiCi0Jc2hhcmVkX3Rlc3Qgc2hucCAic2hhcmVkIChub24gUElDKSIgbWFpbm5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZAotCi0JIyBUZXN0IEVMRiBzaGFyZWQgbGlicmFyeSByZWxvY2F0aW9ucyB3aXRoIGEgbm9uLXplcm8gbG9hZAotCSMgYWRkcmVzcyBmb3IgdGhlIGxpYnJhcnkuICBOZWFyIGFzIEkgY2FuIHRlbGwsIHRoZSBSXypfUkVMQVRJVkUKLQkjIHJlbG9jYXRpb25zIGZvciB2YXJpb3VzIHRhcmdldHMgYXJlIGJyb2tlbiBpbiB0aGUgY2FzZSB3aGVyZQotCSMgdGhlIGxvYWQgYWRkcmVzcyBpcyBub3QgemVybyAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLgotCXNldHVwX3hmYWlsICIqLSotc3Vub3M0KiIKLQlzZXR1cF94ZmFpbCAiKi0qLWxpbnV4KmxpYmMxIgotCXNoYXJlZF90ZXN0IHNobnAgInNoYXJlZCAobm9uIFBJQywgbG9hZCBvZmZzZXQpIiBcCi0JCW1haW5ucC5vIHNoMW5wLm8gc2gybnAubyBzaGFyZWQgXAotCQkiLVQgJHNyY2Rpci8kc3ViZGlyL2VsZi1vZmZzZXQubGQiCi0gICAgfSB9Ci0KLSAgICAjIE5vdyBjb21waWxlIHRoZSBjb2RlIHVzaW5nIC1mcGljLgotCi0gICAgaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gxLmMgJHRtcGRpci9zaDFwLm9dIAotCSB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gyLmMgJHRtcGRpci9zaDJwLm9dIH0gewotCXVucmVzb2x2ZWQgInNoYXJlZCIKLSAgICB9IGVsc2UgewotCSMgU3VuT1MgY2FuIG5vdCBjb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXJzIGNvcnJlY3RseQotCWlmIFtpc3RhcmdldCAiKi0qLXN1bm9zNCoiXSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHN1bjQKLQl9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCi0JfSB9Ci0gICAgfQotfQotCi0jIE5vdyBkbyB0aGUgc2FtZSB0ZXN0cyBhZ2FpbiwgYnV0IHRoaXMgdGltZSBjb21waWxlIG1haW4uYyBQSUMuCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbnAub10gewotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4pIgotfSBlbHNlIHsKLSAgICBpZiB7IFtmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMW5wLm8gXSAmJiBbIGZpbGUgZXhpc3RzICR0bXBkaXIvc2gybnAubyBdIH0gewotICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgIyBTdW5PUyBub24gUElDIHNoYXJlZCBsaWJyYXJpZXMgZG9uJ3QgcGVybWl0IHNvbWUgY2FzZXMgb2YKLQkgICAgIyBvdmVycmlkaW5nLgotCSAgICBzZXR1cF94ZmFpbCAiKi0qLXN1bm9zNCoiCi0JICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZAotCX0KLSAgICB9IGVsc2UgewotCXVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgotICAgIH0KLQotICAgIGlmIHsgW2ZpbGUgZXhpc3RzICR0bXBkaXIvc2gxcC5vIF0gJiYgWyBmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMnAubyBdIH0gewotICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNobXBwICJzaGFyZWQgKFBJQyBtYWluKSIgbWFpbnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcHAgInNoYXJlZCAoUElDIG1haW4pIiBtYWlucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCi0JfQotICAgIH0gZWxzZSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbikiCi0gICAgfQotfQotCi1pZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0gICAgIyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLXJmICR0bXBkaXIiIGV4ZWNfc3RhdHVzCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zdW40LmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwZDg3ZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotbWFpbnZhciA9PSAxCi1vdmVycmlkZGVudmFyID09IDIKLXNobGlidmFyMSA9PSAzCi1zaGxpYl9tYWludmFyICgpID09IDEKLXNobGliX292ZXJyaWRkZW52YXIgKCkgPT0gMgotc2hsaWJfc2hsaWJ2YXIxICgpID09IDMKLXNobGliX3NobGlidmFyMiAoKSA9PSA0Ci1zaGxpYl9zaGxpYmNhbGwgKCkgPT0gNQotc2hsaWJfc2hsaWJjYWxsMiAoKSA9PSA4Ci1zaGxpYl9tYWluY2FsbCAoKSA9PSA2Ci1tYWluX2NhbGxlZCAoKSA9PSA2Ci1zaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gMAotc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkgPT0gMQotc2hsaWJfZ2V0ZnVucHRyMSAoKSAhPSBzaGxpYl9zaGxpYnZhcjEKLXNobGliX2dldGZ1bnB0cjIgKCkgPT0gbWFpbl9jYWxsZWQKLXNobGliX2NoZWNrICgpID09IDEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQveGNvZmYuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDlkOTYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX3NobGlidmFyMSAoKSA9PSAzCi1zaGxpYl9zaGxpYnZhcjIgKCkgPT0gNAotc2hsaWJfc2hsaWJjYWxsICgpID09IDUKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpID09IHNobGliX3NobGlidmFyMQotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkZTk3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkIGludG8gdGhlIFMtcmVjb3JkIGZvcm1hdC4gICovCi0KLWV4dGVybiBpbnQgZTE7Ci1leHRlcm4gaW50IGUyOwotaW50IGk7Ci1pbnQgaiA9IDE7Ci1zdGF0aWMgaW50IGs7Ci1zdGF0aWMgaW50IGwgPSAxOwotc3RhdGljIGNoYXIgYWJbXSA9ICJUaGlzIGlzIGEgc3RyaW5nIGNvbnN0YW50IjsKLQotZXh0ZXJuIGludCBmbjEgKCk7Ci1leHRlcm4gaW50IGZuMiAoKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIGZuMSAoYWIpOwotICBmbjIgKCJzdGF0aWMgc3RyaW5nIGNvbnN0YW50Iik7Ci0gIHJldHVybiBlMSArIGUyICsgaSArIGogKyBrICsgbDsKLX0KLQotdm9pZAotX19tYWluICgpCi17Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM2Y2ZhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LiAgKi8KLQotaW50IGUxOwotaW50IGUyID0gMTsKLQotaW50Ci1mbjEgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiBzW2UxXTsKLX0KLQotaW50Ci1mbjIgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiBzW2UyXTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlNWNjOC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8gVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LgotCi0jZGVmaW5lIEZPT19NU0dfTEVOIDgwCi0KLWNsYXNzIEZvbyB7Ci0gICAgc3RhdGljIGludCBmb29zOwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuID0gRk9PX01TR19MRU47Ci0gICAgY2hhciBtZXNzYWdlW2xlbl07Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5pdF9mb28gKCk7Ci0gICAgc3RhdGljIGludCBuYl9mb29zKCkgeyByZXR1cm4gZm9vczsgfQotICAgIEZvbygpOwotICAgIEZvbyggY2hhciogbWVzc2FnZSk7Ci0gICAgRm9vKGNvbnN0IEZvbyYpOwotICAgIEZvbyAmIG9wZXJhdG9yPSAoY29uc3QgRm9vJik7Ci0gICAgfkZvbyAoKTsKLX07Ci0KLXN0YXRpYyBGb28gc3RhdGljX2ZvbyggInN0YXRpY19mb28iKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIEZvbyBhdXRvbWF0aWNfZm9vKCAiYXV0b21hdGljX2ZvbyIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotdGVybWluYXRlKHZvaWQpCi17Ci0gIC8qIFRoaXMgcmVjdXJzaXZlIGNhbGwgcHJldmVudHMgYSBjb21waWxlciB3YXJuaW5nIHRoYXQgdGhlIG5vcmV0dXJuCi0gICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZSBhY3R1YWxseSBkb2VzIHJldHVybi4gICovCi0gIHRlcm1pbmF0ZSAoKTsKLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkCi1fX21haW4gKCkKLXsKLX0KLQotdm9pZAotX19idWlsdGluX2RlbGV0ZSAoKQotewotfQotCi12b2lkCi1fX2J1aWx0aW5fbmV3ICgpCi17Ci19Ci0KLXZvaWQKLV9fdGhyb3cgKCkKLXsKLX0KLQotdm9pZAotX190ZXJtaW5hdGUgKCkKLXsKLX0KLQotdm9pZCAqX19laF9wYzsKLQotdm9pZCAqKioKLV9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiAoKQotewotICByZXR1cm4gMDsKLX0KLQotdm9pZCAqCi1fX2dldF9laF9jb250ZXh0ICgpCi17Ci0gIHJldHVybiAwOwotfQotCi19Ci0KLWludCBGb286OmZvb3MgPSAwOwotCi12b2lkIEZvbzo6aW5pdF9mb28gKCkKLXsKLSAgZm9vcyA9IDgwOwotfQotCi1Gb286OkZvbyAoKQotewotICBpID0gKytmb29zOwotfQotCi1Gb286OkZvbyAoY2hhciopCi17Ci0gIGkgPSArK2Zvb3M7Ci19Ci0KLUZvbzo6Rm9vIChjb25zdCBGb28mIGZvbykKLXsKLSAgaSA9ICsrZm9vczsKLSAgZm9yIChpbnQgayA9IDA7IGsgPCBGT09fTVNHX0xFTjsgaysrKQotICAgIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKLX0KLQotRm9vJiBGb286Om9wZXJhdG9yPSAoY29uc3QgRm9vJiBmb28pCi17Ci0gIGZvciAoaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykKLSAgICBtZXNzYWdlW2tdID0gZm9vLm1lc3NhZ2Vba107Ci0gIHJldHVybiAqdGhpczsKLX0KLQotRm9vOjp+Rm9vICgpCi17Ci0gIGZvb3MtLTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyZWMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3JlYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzhhMDAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3JlYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotIyBUZXN0IGxpbmtpbmcgZGlyZWN0bHkgdG8gUy1yZWNvcmRzLgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLSMgUHVibGljIGRvbWFpbi4KLQotIyBHZXQgdGhlIG9mZnNldCBmcm9tIGFuIFMtcmVjb3JkIGxpbmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhLgotCi1wcm9jIHNyZWNfb2ZmIHsgbCB9IHsKLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTMSoiICRsXSB7Ci0JcmV0dXJuIDgKLSAgICB9IGVsc2UgeyBpZiBbc3RyaW5nIG1hdGNoICJTMioiICRsXSB7Ci0JcmV0dXJuIDEwCi0gICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiUzMqIiAkbF0gewotCXJldHVybiAxMgotICAgIH0gZWxzZSB7Ci0JcmV0dXJuIC0xCi0gICAgfSB9IH0KLX0KLQotIyBTZWUgaWYgYW4gUy1yZWNvcmQgbGluZSBjb250YWlucyBvbmx5IHplcm8gZGF0YS4KLQotcHJvYyBzcmVjX3plcm8geyBsIH0gewotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIlNcWzA3ODlcXSoiICRsXSB7Ci0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICAjIFN0cmlwIHRoZSBhZGRyZXNzIGFuZCBjaGVja3N1bS4KLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7Ci0Jc2V0IGwgW3N0cmluZyByYW5nZSAkbCBbc3JlY19vZmYgJGxdIFtleHByIFtzdHJpbmcgbGVuZ3RoICRsXSAtIDNdXQotICAgIH0gZWxzZSB7Ci0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICAjIFRoZSByZXN0IG11c3QgYmUgemVyby4KLSAgICByZXR1cm4gW3N0cmluZyBtYXRjaCAiIiBbc3RyaW5nIHRyaW0gJGwgIjAiXV0KLX0KLQotIyBHZXQgdGhlIGFkZHJlc3Mgb2YgYW4gUy1yZWNvcmQgbGluZS4KLQotcHJvYyBzcmVjX2FkZHIgeyBsIH0gewotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIlNcWzEyM1xdKiIgJGxdIHsKLQlzZXQgYWRkciBbc3RyaW5nIHJhbmdlICRsIDQgW2V4cHIgW3NyZWNfb2ZmICRsXSAtIDFdXQotICAgIH0gZWxzZSB7Ci0JcmV0dXJuIC0xCi0gICAgfQotCi0gICAgcmV0dXJuICIweCRhZGRyIgotfQotCi0jIEdldCB0aGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gYW4gUy1yZWNvcmQgbGluZS4KLQotcHJvYyBzcmVjX2xlbiB7IGwgfSB7Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIlNcWzEyM1xdKiIgJGxdIHsKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIHJldHVybiBbZXhwciAiMHhbc3RyaW5nIHJhbmdlICRsIDIgM10iIC0gKFtzcmVjX29mZiAkbF0gLSA0KSAvIDIgLSAxXQotfQotCi0jIEV4dHJhY3QgYnl0ZXMgZnJvbSBhbiBTLXJlY29yZCBsaW5lLgotCi1wcm9jIHNyZWNfZXh0cmFjdCB7IGwgc3RhcnQgbGVuIH0gewotICAgIHNldCBvZmYgW3NyZWNfb2ZmICRsXQotICAgIHNldCBybGVuIFtzcmVjX2xlbiAkbF0KLSAgICBzZXQgc3RvcCBbZXhwciAkc3RhcnQgKyAkbGVuXQotICAgIGlmIHsgJHN0b3AgPiAkcmxlbiB9IHsKLQlzZXQgc3RvcCBbZXhwciAkcmxlbl0KLSAgICB9Ci0gICAgc2V0IHN0YXJ0IFtleHByICRzdGFydCAqIDIgKyAkb2ZmXQotICAgIHNldCBzdG9wIFtleHByICRzdG9wICogMiArICRvZmYgLSAxXQotICAgIHJldHVybiBbc3RyaW5nIHJhbmdlICRsICRzdGFydCAkc3RvcF0KLX0KLQotIyBTZWUgaWYgYSByYW5nZSBvZiBieXRlcyBpbiBhbiBTLXJlY29yZCBsaW5lIGlzIGFsbCB6ZXJvZXMuCi0KLXByb2Mgc3JlY196ZXJvX3JhbmdlIHsgbCBzdGFydCBsZW4gfSB7Ci0gICAgcmV0dXJuIFtzdHJpbmcgbWF0Y2ggIiIgW3N0cmluZyB0cmltIFtzcmVjX2V4dHJhY3QgJGwgJHN0YXJ0ICRsZW5dICIwIl1dCi19Ci0KLSMgVHJpbSBhbiBTLXJlY29yZCBsaW5lIHN1Y2ggdGhhdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyByZW1haW4KLSMgYXQgdGhlIGVuZC4KLQotcHJvYyBzcmVjX3RyaW0geyBsIGxlYXZlIH0gewotICAgIHNldCBvZmYgW3NyZWNfb2ZmICRsXQotICAgIHNldCBhZGRyIFtzcmVjX2FkZHIgJGxdCi0gICAgc2V0IGxlbiBbc3JlY19sZW4gJGxdCi0KLSAgICBpZiB7ICRsZWF2ZSA+PSAkbGVuIH0gewotCXJldHVybiAkbAotICAgIH0KLQotICAgIHNldCBzMSBbc3RyaW5nIHJhbmdlICRsIDAgMV0KLSAgICBzZXQgczIgW2Zvcm1hdCAiJTAyeCIgW2V4cHIgKCRvZmYgLSA0KSAvIDIgKyAkbGVhdmUgKyAxXV0KLSAgICBzZXQgczMgW2Zvcm1hdCAiJTBbZXhwciAkb2ZmIC0gNF14IiBbZXhwciAkYWRkciArICRsZW4gLSAkbGVhdmVdXQotICAgIHNldCBzNCBbc3RyaW5nIHJhbmdlICRsIFtleHByIFtzdHJpbmcgbGVuZ3RoICRsXSAtICgkbGVhdmUgKiAyKSAtIDJdIGVuZF0KLSAgICBzZXQgcyAiJHtzMX0ke3MyfSR7czN9JHtzNH0iCi0KLSAgICB2ZXJib3NlICJzcmVjX3RyaW0geyAnJGwnICRsZWF2ZSB9IHJldHVybmluZyAnJHMnIiAyCi0KLSAgICByZXR1cm4gJHMKLX0KLQotIyBSZXBvcnQgZmFpbHVyZSB3aGVuIGNvbXBhcmluZyBTLXJlY29yZCBsaW5lcwotCi1wcm9jIHNyZWNfY29tcGFyZV9mYWlsIHsgd2hpY2ggbDEgbDIgfSB7Ci0gICAgc2VuZF9sb2cgImNvbXBhcmlzb24gZmFpbHVyZSAkd2hpY2g6XG4kbDFcbiRsMlxuIgotICAgIHZlcmJvc2UgImNvbXBhcmlzb24gZmFpbHVyZSAkd2hpY2g6XG4kbDFcbiRsMiIKLX0KLQotIyBDb21wYXJlIFMtcmVjb3JkIGZpbGVzLiAgV2UgZG9uJ3Qgd2FudCB0byBmdXNzIGFib3V0IHRoaW5ncyBsaWtlCi0jIGV4dHJhIHplcm9lcy4gIE5vdGUgdGhhdCBCRkQgYWx3YXlzIHNvcnRzIFMtcmVjb3JkcyBieSBhZGRyZXNzLgotCi1wcm9jIHNyZWNfY29tcGFyZSB7IGYxIGYyIH0gewotICAgIHNldCBlMSBbZ2V0cyAkZjEgbDFdCi0gICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KLQotICAgIHdoaWxlIHsgJGUxICE9IC0xIH0gewotCXNldCBsMSBbc3RyaW5nIHRyaW1yaWdodCAkbDEgIlxyXG4iXQotCXNldCBsMiBbc3RyaW5nIHRyaW1yaWdodCAkbDIgIlxyXG4iXQotCWlmIHsgJGUyID09IC0xIH0gewotCSAgICAjIElmIGwxIGNvbnRhaW5zIGRhdGEsIGl0IG11c3QgYmUgemVyby4KLQkgICAgaWYgIVtzcmVjX3plcm8gJGwxXSB7Ci0JCXNlbmRfbG9nICJkYXRhIGFmdGVyIEVPRjogJGwxXG4iCi0JCXZlcmJvc2UgImRhdGEgYWZ0ZXIgRU9GOiAkbDEiCi0JCXJldHVybiAwCi0JICAgIH0KLQl9IGVsc2UgeyBpZiB7IFtzdHJpbmcgY29tcGFyZSAkbDEgJGwyXSA9PSAwIH0gewotCSAgICBzZXQgZTEgW2dldHMgJGYxIGwxXQotCSAgICBzZXQgZTIgW2dldHMgJGYyIGwyXQotCX0gZWxzZSB7IGlmIHsgW3NyZWNfemVybyAkbDFdIH0gewotCSAgICBzZXQgZTEgW2dldHMgJGYxIGwxXQotCX0gZWxzZSB7IGlmIHsgW3NyZWNfemVybyAkbDJdIH0gewotCSAgICBzZXQgZTIgW2dldHMgJGYyIGwyXQotCX0gZWxzZSB7Ci0JICAgICMgVGhlIHN0cmluZ3MgYXJlIG5vdCB0aGUgc2FtZSwgYW5kIG5laXRoZXIgaXMgYWxsIHplcm9lcy4KLQkgICAgc2V0IGExIFtzcmVjX2FkZHIgJGwxXQotCSAgICBzZXQgbjEgW3NyZWNfbGVuICRsMV0KLQkgICAgc2V0IGEyIFtzcmVjX2FkZHIgJGwyXQotCSAgICBzZXQgbjIgW3NyZWNfbGVuICRsMl0KLQotCSAgICBpZiB7ICRhMSA8ICRhMiAmJiAhW3NyZWNfemVyb19yYW5nZSAkbDEgMCBbZXhwciAkYTIgLSAkYTFdXSB9IHsKLQkJdmVyYm9zZSAiJGExICRhMiBbc3JlY19leHRyYWN0ICRsMSAwIFtleHByICRhMiAtICRhMV1dIiAyCi0JCXNyZWNfY29tcGFyZV9mYWlsIDEgJGwxICRsMgotCQlyZXR1cm4gMAotCSAgICB9Ci0JICAgIGlmIHsgJGEyIDwgJGExICYmICFbc3JlY196ZXJvX3JhbmdlICRsMiAwIFtleHByICRhMSAtICRhMl1dIH0gewotCQlzcmVjX2NvbXBhcmVfZmFpbCAyICRsMSAkbDIKLQkJcmV0dXJuIDAKLQkgICAgfQotCi0JICAgICMgSGVyZSB3ZSBrbm93IHRoYXQgYW55IGluaXRpYWwgZGF0YSBpbiBib3RoIGxpbmVzIGlzCi0JICAgICMgemVyby4gIE5vdyBtYWtlIHN1cmUgdGhhdCBhbnkgb3ZlcmxhcHBpbmcgZGF0YSBtYXRjaGVzLgotCSAgICBpZiB7ICRhMSA8ICRhMiB9IHsKLQkJc2V0IG9zMSBbZXhwciAkYTIgLSAkYTFdCi0JCXNldCBvczIgMAotCSAgICB9IGVsc2UgewotCQlzZXQgb3MxIDAKLQkJc2V0IG9zMiBbZXhwciAkYTEgLSAkYTJdCi0JICAgIH0KLQkgICAgaWYgeyAkYTEgKyAkbjEgPCAkYTIgKyAkbjIgfSB7Ci0JCXNldCBvbCBbZXhwciAkbjEgLSAkb3MxXQotCSAgICB9IGVsc2UgewotCQlzZXQgb2wgW2V4cHIgJG4yIC0gJG9zMl0KLQkgICAgfQotCi0JICAgIHNldCB4MSBbc3JlY19leHRyYWN0ICRsMSAkb3MxICRvbF0KLQkgICAgc2V0IHgyIFtzcmVjX2V4dHJhY3QgJGwyICRvczIgJG9sXQotCSAgICBpZiB7IFtzdHJpbmcgY29tcGFyZSAkeDEgJHgyXSAhPSAwIH0gewotCQl2ZXJib3NlICIkb3MxICRvbCAkeDEiIDIKLQkJdmVyYm9zZSAiJG9zMiAkb2wgJHgyIiAyCi0JCXNyZWNfY29tcGFyZV9mYWlsIDMgJGwxICRsMgotCQlyZXR1cm4gMAotCSAgICB9Ci0KLQkgICAgIyBUaGVzZSBzdHJpbmdzIG1hdGNoLiAgVHJpbSB0aGUgZGF0YSBmcm9tIHRoZSBsYXJnZXIKLQkgICAgIyBzdHJpbmcsIHJlYWQgYSBuZXcgY29weSBvZiB0aGUgc21hbGxlciBzdHJpbmcsIGFuZAotCSAgICAjIGNvbnRpbnVlLgotCSAgICBpZiB7ICRhMSArICRuMSA8ICRhMiArICRuMiB9IHsKLQkJc2V0IGwyIFtzcmVjX3RyaW0gJGwyIFtleHByICgkYTIgKyAkbjIpIC0gKCRhMSArICRuMSldXQotCQlzZXQgZTEgW2dldHMgJGYxIGwxXQotCSAgICB9IGVsc2UgeyBpZiB7ICRhMSArICRuMSA+ICRhMiArICRuMiB9IHsKLQkJc2V0IGwxIFtzcmVjX3RyaW0gJGwxIFtleHByICgkYTEgKyAkbjEpIC0gKCRhMiArICRuMildXQotCQlzZXQgZTIgW2dldHMgJGYyIGwyXQotCSAgICB9IGVsc2UgewotCQlzZXQgZTEgW2dldHMgJGYxIGwxXQotCQlzZXQgZTIgW2dldHMgJGYyIGwyXQotCSAgICB9IH0KLQl9IH0gfSB9Ci0gICAgfQotCi0gICAgIyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGZpbGUuICBUaGUgcmVtYWluZGVyIG9mIHRoZQotICAgICMgc2Vjb25kIGZpbGUgbXVzdCBjb250YWluIG9ubHkgemVyb2VzLgotICAgIHdoaWxlIHsgJGUyICE9IC0xIH0gewotCXNldCBsMiBbc3RyaW5nIHRyaW1yaWdodCAkbDIgIlxyXG4iXQotCWlmICFbc3JlY196ZXJvICRsMl0gewotCSAgICBzZW5kX2xvZyAiZGF0YSBhZnRlciBFT0Y6ICRsMlxuIgotCSAgICB2ZXJib3NlICJkYXRhIGFmdGVyIEVPRjogJGwyIgotCSAgICByZXR1cm4gMAotCX0KLQlzZXQgZTIgW2dldHMgJGYyIGwyXQotICAgIH0KLQotICAgIHJldHVybiAxCi19Ci0KLSMgTGluayB0d2ljZSwgb2JqY29weSwgYW5kIGNvbXBhcmUKLQotcHJvYyBydW5fc3JlY190ZXN0IHsgdGVzdCBvYmpzIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBvYmpjb3B5Ci0gICAgZ2xvYmFsIHNpemVvZl9oZWFkZXJzCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgc2V0IGZsYWdzICIiCi0KLSAgICAjIElmIHRoZSBsaW5rZXIgc2NyaXB0IHVzZXMgU0laRU9GX0hFQURFUlMsIHVzZSBhIC1UdGV4dCBhcmd1bWVudAotICAgICMgdG8gZm9yY2UgYm90aCB0aGUgbm9ybWFsIGxpbmsgYW5kIHRoZSBTLXJlY29yZCBsaW5rIHRvIGJlIHB1dCBpbgotICAgICMgdGhlIHNhbWUgcGxhY2UuICBXZSBkb24ndCBhbHdheXMgdXNlIC1UdGV4dCBiZWNhdXNlIGl0IGludGVyYWN0cwotICAgICMgcG9vcmx5IHdpdGggYS5vdXQuCi0KLSAgICBpZiB7ICRzaXplb2ZfaGVhZGVycyB9IHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtVHRleHQgMHgxMDAwIgotICAgIH0KLQotICAgICMgVGhlIGEyOWsgY29tcGlsZWQgY29kZSBjYWxscyBWX1NQSUxMIGFuZCBWX0ZJTEwuICBTaW5jZSB3ZSBkb24ndAotICAgICMgbmVlZCB0byBydW4gdGhpcyBjb2RlLCBidXQgd2UgZG9uJ3QgaGF2ZSBkZWZpbml0aW9ucyBmb3IgdGhvc2UKLSAgICAjIGZ1bmN0aW9ucywgd2UganVzdCBkZWZpbmUgdGhlbSBvdXQuCi0gICAgaWYgW2lzdGFyZ2V0IGEyOWsqLSotKl0gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIFZfU1BJTEw9MCAtLWRlZnN5bSBWX0ZJTEw9MCIKLSAgICB9Ci0KLSAgICAjIEFSTSB0YXJnZXRzIGNhbGwgX19nY2NtYWluCi0gICAgaWYgW2lzdGFyZ2V0IGFybSotKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19fZ2NjbWFpbj0wIgotICAgIH0KLSAgICAKLSAgICBpZiBbaXN0YXJnZXQgc3Ryb25nYXJtKi0qLSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBfX2djY21haW49MCIKLSAgICB9Ci0gICAgCi0gICAgIyBUaHVtYiB0YXJnZXRzIGNhbGwgX19nY2NtYWluCi0gICAgaWYgW2lzdGFyZ2V0IHRodW1iLSotKl0gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fX2djY21haW49MCIKLSAgICB9Ci0KLSAgICAjIFBvd2VyUEMgRUFCSSBjb2RlIGNhbGxzIF9fZWFiaS4KLSAgICBpZiBbaXN0YXJnZXQgcG93ZXJwYyotKi1lYWJpKl0gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fZWFiaT0wIgotICAgIH0KLQotICAgICMgbW4xMDIwMCBjb2RlIGNhbGxzIF9fdHJ1bmNzaXBzaTJfZDBfZDIuCi0gICAgaWYge1tpc3RhcmdldCBtbjEwMjAwKi0qLSpdfSB0aGVuIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBfX3RydW5jc2lwc2kyX2QwX2QyPTAiCi0gICAgfQotCi0gICAgIyBWODUwIHRhcmdldHMgbmVlZCBsaWJnY2MuYQotICAgIGlmIFtpc3RhcmdldCB2ODUwKi0qLWVsZl0gewotCXNldCBvYmpzICIkb2JqcyAtTCAuLi9nY2MgLWxnY2MiCi0gICAgfQotICAgIAotICAgIGlmIHsgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NyMSAiJGZsYWdzICRvYmpzIl0gXAotCSB8fCAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc3IyLnNyICIkZmxhZ3MgLW9mb3JtYXQgc3JlYyAkb2JqcyJdIH0gewotCXNldHVwX3hmYWlsICJocHBhKi0qLSplbGYqIgotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc3IxIHRtcGRpci9zcjEuc3JcbiIKLSAgICB2ZXJib3NlICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zcjEgdG1wZGlyL3NyMS5zciIKLSAgICBjYXRjaCAiZXhlYyAkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zcjEgdG1wZGlyL3NyMS5zciIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCXVucmVzb2x2ZWQgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZjEgW29wZW4gdG1wZGlyL3NyMS5zciByXQotICAgIHNldCBmMiBbb3BlbiB0bXBkaXIvc3IyLnNyIHJdCi0gICAgaWYgW3NyZWNfY29tcGFyZSAkZjEgJGYyXSB7Ci0JcGFzcyAkdGVzdAotICAgIH0gZWxzZSB7Ci0JZmFpbCAkdGVzdAotICAgIH0KLSAgICBjbG9zZSAkZjEKLSAgICBjbG9zZSAkZjIKLX0KLQotc2V0IHRlc3QxICJTLXJlY29yZHMiCi1zZXQgdGVzdDIgIlMtcmVjb3JkcyB3aXRoIGNvbnN0cnVjdG9ycyIKLQotIyBTZWUgd2hldGhlciB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IHVzZXMgU0laRU9GX0hFQURFUlMuCi1jYXRjaCAiZXhlYyAkbGQgLS12ZXJib3NlIiBleGVjX291dHB1dAotc2V0IHNpemVvZl9oZWFkZXJzIFtzdHJpbmcgbWF0Y2ggIipTSVpFT0ZfSEVBREVSUyoiICRleGVjX291dHB1dF0KLQotIyBGaXJzdCB0ZXN0IGxpbmtpbmcgYSBDIHByb2dyYW0uICBXZSBkb24ndCByZXF1aXJlIGFueSBsaWJyYXJpZXMuICBXZQotIyBsaW5rIGl0IG5vcm1hbGx5LCBhbmQgb2JqY29weSB0byB0aGUgUy1yZWNvcmQgZm9ybWF0LCBhbmQgdGhlbiBsaW5rCi0jIGRpcmVjdGx5IHRvIHRoZSBTLXJlY29yZCBmb3JtYXQsIGFuZCByZXF1aXJlIHRoYXQgdGhlIHR3byBmaWxlcwotIyBjb250YWluIHRoZSBzYW1lIGRhdGEuCi0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDEKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgJENDICRzcmNkaXIvJHN1YmRpci9zcjEuYyB0bXBkaXIvc3IxLm9dIFwKLSAgICAgfHwgIVtsZF9jb21waWxlICRDQyAkc3JjZGlyLyRzdWJkaXIvc3IyLmMgdG1wZGlyL3NyMi5vXSB9IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MQotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLSMgVGhlIGkzODYtYW91dCB0YXJnZXQgaXMgY29uZnVzZWQ6IHRoZSBsaW5rZXIgZG9lcyBub3QgcHV0IHRoZQotIyBzZWN0aW9ucyB3aGVyZSBvYmpkdW1wIGZpbmRzIHRoZW0uICBJIGRvbid0IGtub3cgd2hpY2ggaXMgd3JvbmcuCi1zZXR1cF94ZmFpbCAiaSo4Ni0qLWFvdXQqIgotCi0jIFRoZXNlIHRlc3RzIGZhaWwgb24gdGhlIG5hdGl2ZSBNSVBTIEVMRiB0YXJnZXRzIGJlY2F1c2UgdGhlIEdQIHZhbHVlCi0jIGluIHRoZSAucmVnaW5mbyBzZWN0aW9uIGlzIG5vdCB1cGRhdGVkIHdoZW4gdGhlIFMtcmVjb3JkIHZlcnNpb24gaXMKLSMgd3JpdHRlbiBvdXQuICBUaGUgbWlwcy1lbGYgdGFyZ2V0IGl0c2VsZiBkb2VzIG5vdCB1c2UgYSAucmVnaW5mbyBzZWN0aW9uLgotc2V0dXBfeGZhaWwgIm1pcHMqLSotaXJpeDUqIiAibWlwcyotKi1pcml4NioiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGRvIHRoZSBtYWdpYyBUT0MgaGFuZGxpbmcgdGhhdCBYQ09GRgotIyBsaW5rZXJzIGRvLgotc2V0dXBfeGZhaWwgIiotKi1haXgqIiAiKi0qLXhjb2ZmKiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgYnVpbGQgQVJNL1RodW1iIHN0dWJzLgotc2V0dXBfeGZhaWwgImFybS0qLWNvZmYiCi1zZXR1cF94ZmFpbCAic3Ryb25nYXJtKi0qLSoiCi1zZXR1cF94ZmFpbCAiYXJtLSotcGUqIgotIyBzZXR1cF94ZmFpbCAiYXJtLSplbGYqIgotc2V0dXBfeGZhaWwgInRodW1iLSotY29mZioiCi1zZXR1cF94ZmFpbCAidGh1bWItKi1wZSoiCi1zZXR1cF94ZmFpbCAidGh1bWItKi1lbGYqIgotc2V0dXBfeGZhaWwgImFybSotKi1saW51eCoiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGJ1aWxkIHNwZWNpYWwgRUFCSSBzZWN0aW9ucy4KLXNldHVwX3hmYWlsICJwb3dlcnBjKi0qLWVhYmkqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBpbmNsdWRlIHRoZSAue3pkYX0gc2VjdGlvbnMuCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGhhbmRsZSBBbHBoYSBFbGYgcmVsYXhhdGlvbi4KLXNldHVwX3hmYWlsICJhbHBoYSotKi1lbGYqIiAiYWxwaGEqLSotbGludXgtZ251KiIgImFscGhhKi0qLWdudSoiCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotbmV0YnNkKiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgc3BlY2lhbCBQRSBoZWFkZXJzIC0gdGhlIFBFCi0jIGVtdWxhdGlvbiB0cmllcyB0byB3cml0ZSBwZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byB0aGUgUEUgaGVhZGVycwotIyBpbiB0aGUgb3V0cHV0IGJmZCwgYnV0IGl0J3Mgbm90IGEgUEUgYmZkIChpdCdzIGFuIHNyZWMgYmZkKQotc2V0dXBfeGZhaWwgIiotKi1jeWd3aW4qIiAiKi0qLW1pbmd3KiIgIiotKi1wZSoiICIqLSotd2lubnQqIgotCi1ydW5fc3JlY190ZXN0ICR0ZXN0MSAidG1wZGlyL3NyMS5vIHRtcGRpci9zcjIubyIKLQotIyBOb3cgdHJ5IGxpbmtpbmcgYSBDKysgcHJvZ3JhbSB3aXRoIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kCi0jIGRlc3RydWN0b3JzLiAgTm90ZSB0aGF0IHNpbmNlIHdlIGFyZSBub3QgbGlua2luZyBhZ2FpbnN0IGFueQotIyBsaWJyYXJpZXMsIHRoaXMgcHJvZ3JhbSB3b24ndCBhY3R1YWxseSB3b3JrIG9yIGFueXRoaW5nLgotCi1pZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL3NyMy5jYyB0bXBkaXIvc3IzLm9dIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi0jIFNlZSBhYm92ZS4KLXNldHVwX3hmYWlsICJpKjg2LSotYW91dCoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi1pcml4NSoiICJtaXBzKi0qLWlyaXg2KiIKLXNldHVwX3hmYWlsICIqLSotYWl4KiIgIiotKi14Y29mZioiCi1zZXR1cF94ZmFpbCAiYXJtKi0qLSoiCi1zZXR1cF94ZmFpbCAic3Ryb25nYXJtKi0qLSoiCi1zZXR1cF94ZmFpbCAidGh1bWItKi0qIgotc2V0dXBfeGZhaWwgInBvd2VycGMqLSotZWFiaSoiCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotZWxmKiIgImFscGhhKi0qLWxpbnV4LWdudSoiICJhbHBoYSotKi1nbnUqIgotc2V0dXBfeGZhaWwgImFscGhhKi0qLW5ldGJzZCoiCi1zZXR1cF94ZmFpbCAiKi0qLWN5Z3dpbioiICIqLSotbWluZ3cqIiAiKi0qLXBlKiIgIiotKi13aW5udCoiCi0KLXJ1bl9zcmVjX3Rlc3QgJHRlc3QyICJ0bXBkaXIvc3IzLm8iCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jIGIvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWVjNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gdGVzdCB0aGUgbGlua2VyJ3MgcmVwb3J0aW5nIG9mIHVuZGVmaW5lZAotICAgc3ltYm9scy4gICovCi0KLWV4dGVybiBpbnQgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCAoKTsKLQotaW50Ci1mdW5jdGlvbiAoKQotewotICByZXR1cm4gdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1NTE5Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyBUZXN0IHRoYXQgdGhlIGxpbmtlciByZXBvcnRzIHVuZGVmaW5lZCBzeW1ib2wgZXJyb3JzIGNvcnJlY3RseS4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLSMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotc2V0IHRlc3R1bmQgInVuZGVmaW5lZCIKLXNldCB0ZXN0Zm4gInVuZGVmaW5lZCBmdW5jdGlvbiIKLXNldCB0ZXN0bGluZSAidW5kZWZpbmVkIGxpbmUiCi0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB2ZXJib3NlICJDb3VsZCBub3QgZmluZCBDIGNvbXBpbGVyISIgMQotICAgIHVudGVzdGVkICR0ZXN0dW5kCi0gICAgdW50ZXN0ZWQgJHRlc3RmbgotICAgIHVudGVzdGVkICR0ZXN0bGluZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAtZyIgJHNyY2Rpci8kc3ViZGlyL3VuZGVmaW5lZC5jIHRtcGRpci91bmRlZmluZWQub10gewotICAgIHZlcmJvc2UgIlVuYWJsZSB0byBjb21waWxlIHRlc3QgZmlsZSEiIDEKLSAgICB1bnJlc29sdmVkICR0ZXN0dW5kCi0gICAgdW5yZXNvbHZlZCAkdGVzdGZuCi0gICAgdW5yZXNvbHZlZCAkdGVzdGxpbmUKLSAgICByZXR1cm4KLX0KLQotY2F0Y2ggImV4ZWMgcm0gLWYgdG1wZGlyL3VuZGVmaW5lZCIgZXhlY19vdXRwdXQKLQotIyBVc2luZyAtZSBzdGFydCBwcmV2ZW50cyB0aGUgU3VuT1MgbGlua2VyIGZyb20gdHJ5aW5nIHRvIGJ1aWxkIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1zZW5kX2xvZyAiJGxkIC1lIHN0YXJ0IC1vIHRtcGRpci91bmRlZmluZWQgdG1wZGlyL3VuZGVmaW5lZC5vXG4iCi12ZXJib3NlICIkbGQgLWUgc3RhcnQgLW8gdG1wZGlyL3VuZGVmaW5lZCB0bXBkaXIvdW5kZWZpbmVkLm8iCi0KLWNhdGNoICJleGVjICRsZCAtZSBzdGFydCAtbyB0bXBkaXIvdW5kZWZpbmVkIHRtcGRpci91bmRlZmluZWQubyIgZXhlY19vdXRwdXQKLXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQotcHJvYyBjaGVja3VuZCB7IHN0cmluZyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiokc3RyaW5nKiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQotCi1zZXQgbXUgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnIgotY2hlY2t1bmQgJG11ICR0ZXN0dW5kCi0KLSMgQVJNIFBFIGRlZmF1bHRzIHRvIHVzaW5nIHN0YWJzIGRlYnVnZ2luZywgd2hpY2ggd2UgY2FuJ3QgaGFuZGxlIGZvcgotIyBhIENPRkYgZmlsZS4KLSNzZXR1cF94ZmFpbCAiYXJtKi0qLXBlKiIKLSNzZXR1cF94ZmFpbCAidGh1bWIqLSotcGUqIgotCi0jIEp1c3QgZG9lc24ndCB3b3JrIGZvciBQQSBFTEYuICBObyBjbHVlIHdoeS4KLXNldHVwX3hmYWlsICJocHBhKi0qLSplbGYqIgotCi1zZXQgbWYgInRtcGRpci91bmRlZmluZWQubzogSW4gZnVuY3Rpb24gYGZ1bmN0aW9uJzoiCi1jaGVja3VuZCAkbWYgJHRlc3RmbgotCi0jIENPRkYgU0ggZ2V0cyB0aGlzIHRlc3Qgd3JvbmctLWl0IHJlcG9ydHMgbGluZSAxMCwgYmVjYXVzZSBhbHRob3VnaAotIyB0aGUganVtcCBpcyBhdCBsaW5lIDksIHRoZSBmdW5jdGlvbiBhZGRyZXNzLCBhbmQgdGhlIHJlbG9jLCBpcwotIyBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi1zZXR1cF94ZmFpbCAic2gtKi0qIgotCi0jIEFSTSBQRSBkZWZhdWx0cyB0byB1c2luZyBzdGFicyBkZWJ1Z2dpbmcsIHdoaWNoIHdlIGNhbid0IGhhbmRsZSBmb3IKLSMgYSBDT0ZGIGZpbGUuCi0jc2V0dXBfeGZhaWwgImFybSotKi1wZSoiCi0jc2V0dXBfeGZhaWwgInRodW1iKi0qLXBlKiIKLQotIyBKdXN0IGRvZXNuJ3Qgd29yayBmb3IgUEEgRUxGLiAgTm8gY2x1ZSB3aHkuCi1zZXR1cF94ZmFpbCAiaHBwYSotKi0qZWxmKiIKLQotc2V0IG1sICJ1bmRlZmluZWQuYzo5OiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkJyIKLSMgV2l0aCB0YXJnZXRzIHRoYXQgdXNlIGVsZi9kd2FyZjIsIHN1Y2ggYXMgdGhlIGFybS1lbGYgYW5kIHRodW1iLWVsZgotIyB0b29sY2hhaW5zLCB0aGUgY29kZSBpbiBiZmQvZWxmLmM6X2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUoKSBpcyBjYWxsZWQKLSMgaW4gb3JkZXIgdG8gbG9jYXRlIHRoZSBmaWxlIG5hbWUvbGluZSBudW1iZXIgd2hlcmUgdGhlIHVuZGVmaW5lZAotIyByZWZlcmVuY2Ugb2NjdXJzLiAgVW5mb3J0dW5hdGVseSB0aGlzIHRyaWVzIHRvIHVzZSB0aGUgZHdhcmYyIGRlYnVnCi0jIGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICBUaGlzIHNlY3Rpb24gY29udGFpbnMgYSBzZXJpZXMKLSMgb2YgY29tcF91bml0IHN0cnVjdHVyZXMsIGVhY2ggb2Ygd2hpY2ggaGFzIGEgbG93L2hpZ2ggYWRkcmVzcyByYW5nZQotIyByZXByZXNlbnRpbmcgdGhlIHNwYW4gb2YgbWVtb3J5IGxvY2F0aW9ucyBjb3ZlcmVkIGJ5IHRoYXQgc3RydWN0dXJlLiAgVGhlCi0jIHN0cnVjdHVyZXMgYWxzbyBpbmRleCBpbnRvIG90aGVyIHN0cnVjdHVyZXMgaGVsZCBpbiB0aGUgLmRlYnVnX2xpbmUgc2VjdGlvbgotIyBhbmQgdG9nZXRoZXIgdGhleSBjYW4gdHJhbnNsYXRlIG1lbW9yeSBsb2NhdGlvbnMgYmFjayBpbnRvIGZpbGUvZnVuY3Rpb24vbGluZQotIyBudW1iZXIgYWRkcmVzc2VzIGluIHRoZSBzb3VyY2UgY29kZS4gIFNpbmNlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5Ci0jIHJlZ2lvbiBjb3ZlcmVkIGJ5IGEgY29tcF91bml0IGlzIG9ubHkgZGV0ZXJtaW5lZCBhdCBsaW5rIHRpbWUsIHRoZSBsb3cvaGlnaAotIyBhZGRyZXNzZXMgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gYW5kIHRoZSBsaW5lIGFkZHJlc3NlcyBpbiB0aGUgLmRlYnVnX2xpbmUKLSMgc2VjdGlvbiBhcmUgY29tcHV0ZWQgYnkgZ2VuZXJhdGluZyByZWxvY3MgYWdhaW5zdCBrbm93biBzeW1ib2xzIGluIHRoZSBvYmplY3QKLSMgY29kZS4KLSMKLSMgV2hlbiB0aGUgdW5kZWZpbmVkIHJlZmVyZW5jZSBpcyBkZXRlY3RlZCwgdGhlIHJlbG9jcyBpbiB0aGUgZHdhcmYyCi0jIGRlYnVnIHNlY3Rpb25zIGhhdmUgbm90IHlldCBiZWVuIHJlc29sdmVkLCBzbyB0aGUgbG93L2hpZ2ggYWRkcmVzc2VzIGFuZCB0aGUKLSMgbGluZSBudW1iZXIgYWRkcmVzcyBhcmUgYWxsIHNldCBhdCB6ZXJvLiAgVGh1cyB3aGVuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKCkKLSMgY2FsbHMgX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUoKSBubyBjb21wX3VuaXQgY2FuIGJlIGZvdW5kIHdoaWNoCi0jIGFjdHVhbGx5IGNvdmVycyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgcmVmZXJlbmNlIG9jY3VyZWQsIGFuZCBzbwotIyBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSgpIGZhaWxzLgotIwotIyBUaGUgdXBzaG90IG9mIGFsbCBvZiB0aGlzLCBpcyB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHJlcG9ydGVkIGJ5IHRoZQotIyBsaW5rZXIsIGluc3RlYWQgb2YgaGF2aW5nIGEgc291cmNlIGZpbGUgbmFtZSAmIGxpbmUgbnVtYmVyIGFzIGluOgotIwotIyAgIHVuZGVmaW5lZC5jOjk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnCi0jCi0jIGhhcyBhbiBvYmplY3QgZmlsZSAmIHNlY3Rpb24gYWRkcmVzcyBpbnN0ZWFkOgotIwotIyAgIHVuZGVmaW5lZC4wKC50ZXh0KzB4Yyk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnCi0jCi0jIGhlbmNlIHRoZSB4ZmFpbHMgYmVsb3cuCi0KLSNzZXR1cF94ZmFpbCBhcm0tKi1lbGYKLSNzZXR1cF94ZmFpbCBzdHJvbmdhcm0tKi1lbGYKLSNzZXR1cF94ZmFpbCB0aHVtYi0qLWVsZgotc2V0dXBfeGZhaWwgbWNvcmUtKi1lbGYKLXNldHVwX3hmYWlsIG1pcHMtc2dpLWlyaXg2KgotCi1jaGVja3VuZCAkbWwgJHRlc3RsaW5lCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMS5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0xLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDcwZDgwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0xLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMi5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0ZGM1OS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMi5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5sZCBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5sZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1YzRlMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEubGQKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotT1VUUFVUX0ZPUk1BVCgic3JlYyIpCi1TRUNUSU9OUwotewotCi0KLS50ZXh0IDAgOiB7ICooIjkiKSAqKCIxMCIpICooIjExIikgKigiMTIiKSAqKCIxMyIpICooIjE0IikgKigiMTUiKQotCQkqKCI3IikgKigiOCIpICooIjAiKSAqKCIxIikgKigiMiIpICooIjMiKSAqKCI0IikgfQotLmJzcyAoTk9MT0FEKSAgOiB7ICAqKCI1IikgKigiNiIpIH0KLQotLlBBRkkgICAgPTB4MDAwMDAwNTAgOwotLlBDSElPICAgPTB4MDAwMDAwRDAgOwotLlBDTE8gICAgPTB4MDAwMDAwNTQgOwotLlBDVkJTViAgPTB4MDAwMDAwMEUgOwotLlBDVlRTVSAgPTB4MDAwMDAwMTIgOwotLlBDVlRTViAgPTB4MDAwMDAwMTYgOwotLlBDVlRTVkwgPTB4MDAwMDAwMUEgOwotLlBDVlRVUyAgPTB4MDAwMDAwMUUgOwotLlBESVMgICAgPTB4MDAwMDAwMjIgOwotLlBESVNMICAgPTB4MDAwMDAwMjYgOwotLlBEVkogICAgPTB4MDAwMDAwMkEgOwotLlBFSU8gICAgPTB4MDAwMDAwQ0MgOwotLlBFT0YgICAgPTB4MDAwMDAwNTggOwotLlBFT0wgICAgPTB4MDAwMDAwNUMgOwotLlBFUVVTICAgPTB4MDAwMDAwMkUgOwotLlBFUVVWICAgPTB4MDAwMDAwMzIgOwotLlBFUVVWTCAgPTB4MDAwMDAwMzYgOwotLlBFUVVXICAgPTB4MDAwMDAwREUgOwotLlBHQ00gICAgPTB4MDAwMDAwNjQgOwotLlBHRVFTICAgPTB4MDAwMDAwM0EgOwotLlBHRVFWICAgPTB4MDAwMDAwM0UgOwotLlBHRVFWTCAgPTB4MDAwMDAwNDIgOwotLlBHRVQgICAgPTB4MDAwMDAwNjAgOwotLlBHUlRTICAgPTB4MDAwMDAwNDYgOwotLlBHUlRWICAgPTB4MDAwMDAwNEEgOwotLlBHUlRWTCAgPTB4MDAwMDAwNEUgOwotLlBJQUNUICAgPTB4MDAwMDAwNkMgOwotLlBJRkQgICAgPTB4MDAwMDAwNjggOwotLlBJTkRTICAgPTB4MDAwMDAwNTIgOwotLlBJTkRWICAgPTB4MDAwMDAwNTYgOwotLlBJTkRWTCAgPTB4MDAwMDAwNUEgOwotLlBJTkRXICAgPTB4MDAwMDAwRDYgOwotLlBMRENTICAgPTB4MDAwMDAwNUUgOwotLlBMRENWICAgPTB4MDAwMDAwNjIgOwotLlBMRVFTICAgPTB4MDAwMDAwNjYgOwotLlBMRVFWICAgPTB4MDAwMDAwNkEgOwotLlBMRVFWTCAgPTB4MDAwMDAwNkUgOwotLlBMRVNTICAgPTB4MDAwMDAwNzIgOwotLlBMRVNWICAgPTB4MDAwMDAwNzYgOwotLlBMRVNWTCAgPTB4MDAwMDAwN0EgOwotLlBMT0RTICAgPTB4MDAwMDAwN0UgOwotLlBMT0RWICAgPTB4MDAwMDAwODIgOwotLlBMT0RWTCAgPTB4MDAwMDAwODYgOwotLlBNT0RKICAgPTB4MDAwMDAwOEEgOwotLlBNT1YgICAgPTB4MDAwMDAwRTIgOwotLlBNUEogICAgPTB4MDAwMDAwOEUgOwotLlBORVFTICAgPTB4MDAwMDAwOTIgOwotLlBORVFWICAgPTB4MDAwMDAwOTYgOwotLlBORVFWTCAgPTB4MDAwMDAwOUEgOwotLlBORVFXICAgPTB4MDAwMDAwREEgOwotLlBQQUdFICAgPTB4MDAwMDAwRDQgOwotLlBQRUUgICAgPTB4MDAwMDAwNzAgOwotLlBQVVQgICAgPTB4MDAwMDAwNzQgOwotLlBSREIgICAgPTB4MDAwMDAwNzggOwotLlBSREMgICAgPTB4MDAwMDAwN0MgOwotLlBSREggICAgPTB4MDAwMDAwODAgOwotLlBSREkgICAgPTB4MDAwMDAwODQgOwotLlBSREogICAgPTB4MDAwMDAwODggOwotLlBSRFJTICAgPTB4MDAwMDAwQzggOwotLlBSRFMgICAgPTB4MDAwMDAwOEMgOwotLlBSRFYgICAgPTB4MDAwMDAwOTAgOwotLlBSTE4gICAgPTB4MDAwMDAwOTQgOwotLlBSUkFOICAgPTB4MDAwMDAwOTggOwotLlBSU1QgICAgPTB4MDAwMDAwOUMgOwotLlBSV1QgICAgPTB4MDAwMDAwQTAgOwotLlBTQ09OICAgPTB4MDAwMDAwOUUgOwotLlBTQ09QICAgPTB4MDAwMDAwQTIgOwotLlBTREVMICAgPTB4MDAwMDAwQTYgOwotLlBTSU5TICAgPTB4MDAwMDAwQUEgOwotLlBTTEVOICAgPTB4MDAwMDAwQUUgOwotLlBTUE9TICAgPTB4MDAwMDAwQjIgOwotLlBTVENWICAgPTB4MDAwMDAwQjYgOwotLlBTVENWTCAgPTB4MDAwMDAwQkEgOwotLlBTVE9TICAgPTB4MDAwMDAwQkUgOwotLlBTVE9WICAgPTB4MDAwMDAwQzIgOwotLlBTVE9WTCAgPTB4MDAwMDAwQzYgOwotLlBTVFJTICAgPTB4MDAwMDAwQ0EgOwotLlBTVFJWICAgPTB4MDAwMDAwQ0UgOwotLlBTVFJWTCAgPTB4MDAwMDAwRDIgOwotLlBXTE4gICAgPTB4MDAwMDAwQTQgOwotLlBXUkFOICAgPTB4MDAwMDAwQTggOwotLlBXUkIgICAgPTB4MDAwMDAwQUMgOwotLlBXUkMgICAgPTB4MDAwMDAwQjAgOwotLlBXUkggICAgPTB4MDAwMDAwQjQgOwotLlBXUkkgICAgPTB4MDAwMDAwQjggOwotLlBXUkogICAgPTB4MDAwMDAwQkMgOwotLlBXUlMgICAgPTB4MDAwMDAwQzAgOwotLlBXUlYgICAgPTB4MDAwMDAwQzQgOwotCi0vKgotLlBBRkk9MHggICA9IDB4MDA7Ci0uUENISU8gICA9MHggMHgwMDAwMDA7Ci0uUENMTyAgICA9MHggNjQgOwotLlBDOwotLlBDVlRTVSAgPTB4IDB4MDAwMDAwOwotLlBDVlRTViAgPTB4IDB4MDAwMDAwOwotLlBDVlRTVkwgPTB4IDB4MDAwMDAwOwotLlBDVlRVUyAgPTB4IDE1OCA7Ci0uUDsKLS5QRElTTCAgID0weCAweDAwMDAwMDsKLS5QRFZKICAgID0weCAweDAwMDAwMDsKLS5QRUlPICAgID0weCAweDAwMDAwMDsKLS5QRU9GICAgID0weCAweDAwMDAwMDsKLS5QRU9MICAgID0weCAweDAwMDAwMDsKLS5QRVFVUyAgID0weCAweDAwMDAwMDsKLS5QRVFVViAgID0weCAweDAwMDAwMDsKLS5QRVFVVkwgID0weCAweDAwMDAwMDsKLS5QRVFVVyAgID0weCAweDAwMDAwMDsKLS5QR0NNICAgID0weCAweDAwMDAwMDsKLS5QR0VRUyAgID0weCAweDAwMDAwMDsKLS5QR0VRViAgID0weCAweDAwMDAwMDsKLS5QR0VRVkwgID0weCAweDAwMDAwMDsKLS5QR0VUICAgID0weCAweDAwMDAwMDsKLS5QR1JUUyAgID0weCAweDAwMDAwMDsKLS5QR1JUViAgID0weCAweDAwMDAwMDsKLS5QR1JUVkwgID0weCAweDAwMDAwMDsKLS5QSUFDVCAgID0weCAweDAwMDAwMDsKLS5QSUZEICAgID0weCAxMjYgOwotLlA7Ci0uUElORFYgICA9MHggMHgwMDAwMDA7Ci0uUElORFZMICA9MHggMHgwMDAwMDA7Ci0uUElORFcgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1MgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1YgICA9MHggMHgwMDAwMDA7Ci0uUExFUVMgICA9MHggMHgwMDAwMDA7Ci0uUExFUVYgICA9MHggMHgwMDAwMDA7Ci0uUExFUVZMICA9MHggMHgwMDAwMDA7Ci0uUExFU1MgICA9MHggMHgwMDAwMDA7Ci0uUExFU1YgICA9MHggMHgwMDAwMDA7Ci0uUExFU1ZMICA9MHggMHgwMDAwMDA7Ci0uUExPRFMgICA9MHggMHgwMDAwMDA7Ci0uUExPRFYgICA9MHggMHgwMDAwMDA7Ci0uUExPRFZMICA9MHggMHgwMDAwMDA7Ci0uUE1PREogICA9MHggMHgwMDAwMDA7Ci0uUE1PViAgICA9MHggMHgwMDAwMDA7Ci0uUE1QSiAgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVMgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVYgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVZMICA9MHggMHgwMDAwMDA7Ci0uUE5FUVcgICA9MHggMHgwMDAwMDA7Ci0uUFBBR0UgICA9MHggMHgwMDAwMDA7Ci0uUFBFRSAgICA9MHggMHgwMDAwMDA7Ci0uUFBVVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQyAgICA9MHggMHgwMDAwMDA7Ci0uUFJESCAgICA9MHggMHgwMDAwMDA7Ci0uUFJESSAgICA9MHggMHgwMDAwMDA7Ci0uUFJESiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEUlMgICA9MHggMHgwMDAwMDA7Ci0uUFJEUyAgICA9MHggMHgwMDAwMDA7Ci0uUFJEViAgICA9MHggMHgwMDAwMDA7Ci0uUFJMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFJSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFJTVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJXVCAgICA9MHggMHgwMDAwMDA7Ci0uUFNDT04gICA9MHggMHgwMDAwMDA7Ci0uUFNDT1AgICA9MHggMHgwMDAwMDA7Ci0uUFNERUwgICA9MHggMHgwMDAwMDA7Ci0uUFNJTlMgICA9MHggMHgwMDAwMDA7Ci0uUFNMRU4gICA9MHggMHgwMDAwMDA7Ci0uUFNQT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUUlMgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlYgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlZMICA9MHggMHgwMDAwMDA7Ci0uUFdMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFdSQiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSCAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSSAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSUyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSViAgICA9MHggMHgwMDAwMDA7Ci0KLSovCi0vKgotLlA9MHggICAgICA9IDA7Ci0uUENISU8gICA9MHggMHhmZWVkZmE7Ci0uUENMTyAgICA9MHggMHhmZWVkZmE7Ci0uUENWQlNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNVICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWTCA9MHggMHhmZWVkZmE7Ci0uUENWVFVTICA9MHggMHhmZWVkZmE7Ci0uUERJUyAgICA9MHggMHhmZWVkZmE7Ci0uUERJU0wgICA9MHggMHhmZWVkZmE7Ci0uUERWSiAgICA9MHggMHhmZWVkZmE7Ci0uUEVJTyAgICA9MHggMHhmZWVkZmE7Ci0uUEVPRiAgICA9MHggMHhmZWVkZmE7Ci0uUEVPTCAgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVMgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVYgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVZMICA9MHggMHhmZWVkZmE7Ci0uUEVRVVcgICA9MHggMHhmZWVkZmE7Ci0uUEdDTSAgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVMgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVYgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVZMICA9MHggMHhmZWVkZmE7Ci0uUEdFVCAgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFMgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFYgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFZMICA9MHggMHhmZWVkZmE7Ci0uUElBQ1QgICA9MHggMHhmZWVkZmE7Ci0uUElGRCAgICA9MHggMHhmZWVkZmE7Ci0uUElORFMgICA9MHggMHhmZWVkZmE7Ci0uUElORFYgICA9MHggMHhmZWVkZmE7Ci0uUElORFZMICA9MHggMHhmZWVkZmE7Ci0uUElORFcgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1MgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1YgICA9MHggMHhmZWVkZmE7Ci0uUExFUVMgICA9MHggMHhmZWVkZmE7Ci0uUExFUVYgICA9MHggMHhmZWVkZmE7Ci0uUExFUVZMICA9MHggMHhmZWVkZmE7Ci0uUExFU1MgICA9MHggMHhmZWVkZmE7Ci0uUExFU1YgICA9MHggMHhmZWVkZmE7Ci0uUExFU1ZMICA9MHggMHhmZWVkZmE7Ci0uUExPRFMgICA9MHggMHhmZWVkZmE7Ci0uUExPRFYgICA9MHggMHhmZWVkZmE7Ci0uUExPRFZMICA9MHggMHhmZWVkZmE7Ci0uUE1PREogICA9MHggMHhmZWVkZmE7Ci0uUE1PViAgICA9MHggMHhmZWVkZmE7Ci0uUE1QSiAgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVMgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVYgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVZMICAgID0gMHhmZWVkZmFjZTsKLS5QTkVRVyAgICAgPSAweGZlZWRmYWNlOwotLlBQQUdFICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBFRSAgICAgID0gMHhmZWVkZmFjZTsKLS5QUFVUICAgICAgPSAweGZlZWRmYWNlOwotLlBSREIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRIICAgICAgPSAweGZlZWRmYWNlOwotLlBSREkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRSUyAgICAgPSAweGZlZWRmYWNlOwotLlBSRFMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEViAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkxOICAgICAgPSAweGZlZWRmYWNlOwotLlBSUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJTVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUldUICAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09OICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNDT1AgICAgID0gMHhmZWVkZmFjZTsKLS5QU0RFTCAgICAgPSAweGZlZWRmYWNlOwotLlBTSU5TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNMRU4gICAgID0gMHhmZWVkZmFjZTsKLS5QU1BPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUQ1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlZMICAgID0gMHhmZWVkZmFjZTsKLS5QV0xOICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JDICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkggICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSSAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JKICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSViAgICAgID0gMHhmZWVkZmFjZTsKLSovCi0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5vb2sgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEub29rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTg0Yjk0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5vb2sKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotUzAwQzAwMDA3NDMxMkU2Rjc1NzQyRTZGNkJDMA0KLVMxMTgwMDAwMDAwMDBBMjA1MzQxNDY0NTUzNTQ0RjUyNDUyMDQxMjAyMDIwMjAyMDUyQkUNCi1TMTE4MDAxNTMxMzMyRTMzMjAyMDIwMjAyMDIwMjA1MjMxMzMyRTMyMjAyMDIwMjAyMDc3DQotUzExODAwMkEyMDIwMDBCNUU4NjYwMEI1RTlCMTFEQTE1Qjk5MDAwMDFGMDAwMDAwMEE1MA0KLVMxMTgwMDNGNjQwMDAwMDAzRTAwMDAwMDVDMDBBODAwQkEwMEYwMDAwNDAwMDEwMDAyNTENCi1TMTE4MDA1NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjAwNDAzMUNGNTI1NDRDNDk0MkQwDQotUzExODAwNjk0MzRGNEUwMDA0RTVFQzUyNTQ0QzQ5NDI0MzRGNEUwMDA0RTVFRDUyNTRGMA0KLVMxMTgwMDdFNEM0OTQyNDM0RjRFMDA0MDMxRDI1MjU0NEM0OTQyNDM0RjRFMDAwMDBBMDgNCi1TMTE4MDA5MzdENTI1NDRDNDk0MjUzNTQ1MjAwMTBBNEE4NTI1NDRDNDk0MjQ2NDk0Q0FEDQotUzExODAwQTgwMDAyMDBCNUU4NkQwMDAwMDE2MDAwQjVFODczMDAwMDAyNTQwMDAyMDA2QQ0KLVMxMTgwMEJEQjVFOTM3NTM0MTQ2NDU1MDUyNDk0RTU0MjAwMDAwMDYwMDAyMDAwODAwNzkNCi1TMTE4MDBEMjAwMDAwMzQyMDBCNUU4NkU0OTRFNDk1NDUzNDE0NjQ1NTM1NDAwMDAwMkM5DQotUzExODAwRTcxODAwMDAwRTAwMDAwMDA5MDIwMDMwMDAwMDAwMDA0RTU2RkZEOEJBOEZEQg0KLVMxMTgwMEZDNjMwNjJFNEU2MTAwMDAxNjQxRkEwMDMyNDNFRUZGRDg3MDI2MTJEODUxNDkNCi1TMTE4MDExMUM4RkZGQzRFNUU0RTc1MkI1N0ZGRjIyRjNDMDAwMDAwMEE2MDAwMDAwMjU5DQotUzExODAxMjYzQjZGMDAwMkZGRjYyRjJEMDAzODJGMkQwMDM0NEU0QzRFNEE0MzRGNTBFNw0KLVMxMTgwMTNCNTk1MjQ5NDc0ODU0MjA1NDY1NkM2NTY2NkY2RTIwNDE0MjIwNEMyMDRENkINCi1TMTE4MDE1MDIwNDU3MjY5NjM3MzczNkY2RTJDMjAzMTM5MzkzMzAwNEU1NkZGRkNCQUI1DQotUzExODAxNjU4RjYzMDQyRTRFNjFBQzIwMkUwMDBDMDY4MDAwMDAwMDBDNEU3NjU2ODA3Qw0KLVMxMTgwMTdBNEU3NjAyODBGRkZGRkZGQzRBRDU2NjA0NjEwMDAwQjAyRDQwRkZGQzIwMEINCi1TMTE4MDE4RjZDMDAzQTIyMDgyNDJDMDAzNjk0ODE0RTc2MDQ4MjAwMDAwMDBDNEU3NkQyDQotUzExODAxQTQ0QUQ1NjYwNDYxMDAwMDhFQjA4MjZFMEMwQ0FFMDAwMDAwMDEwMDBDNkNFQg0KLVMxMTgwMUI5MDAwMDBDMjA3QzAwMDAwMDAwNjEwMDAwNjAyMDZDMDAzQTIwMDg2NjA0NkMNCi1TMTE4MDFDRTYxMDAwMDc2MjIwOEQyQUVGRkZDNjgwNDYxMDAwMDVDMjA4MTIxNkUwMDQzDQotUzExODAxRTMxMDAwMDQyMTZFMDAwQzAwMDgyMjA4MDY4MTAwMDAwMDBDNjgwNDYxMDBDMg0KLVMxMTgwMUY4MDA0MDJENDEwMDE0Mjk1MDAwM0EyMDZDMDAzQTI0MDg2NjA0NjEwMDAwQkMNCi1TMTE4MDIwRDNBNDI5MDQyQTgwMDA0NDJBODAwMDg0RTVFMjI1RjI4NUY1MDhGNEVFOTIyDQotUzExODAyMjIwMDAyMkI1RkZGRjI0RTVFRDFERjI4NUYyRjA4MkI0OEZGRjJEMEQwNEVEQQ0KLVMxMTgwMjM3RDAyQjU3RkZGMjJGM0MwMDAwMDAwRTYwMDBGRUUyMkI1N0ZGRjIyRjNDRDQNCi1TMTE4MDI0QzAwMDAwMDEwNjAwMEZFRDQ0RTU2RkZGQ0JBOEY2MzA2MkU0RTYxMDBGRTJCDQotUzExODAyNjFCODJENkMwMDMyRkZGQzYwMDAwMDEyMkI1RkZGRjI0RkVFRkZGQzQyQUVGMQ0KLVMxMTgwMjc2RkZGQzYwMDAwMDgyNEFBRUZGRkM2NzAwMDA3QTIwNkVGRkZDMjAwODY2QTcNCi1TMTE4MDI4QjAwMDAwNDYxQjYyMjI4MDAwNEIyQUUwMDEwNjcwMDAwNjIyMjA4MDI4MTBCDQotUzExODAyQTAwMDAwMDAwMzRBODE2NjQwMjIwODIyNkMwMDNBMjQwOUIyODI2RTM0MjZCNg0KLVMxMTgwMkI1MTAyODA4MDY4NDAwMDAwMDBDNjgwNDYxMDBGRjc2QjY4NDZEMjAyNjEwMUINCi1TMTE4MDJDQTI4MDg5Njg0NEU3NjA0ODMwMDAwMDAwQzRFNzY0QUQ1NjYwNDYxMDBGRkNEDQotUzExODAyREY1QUI2QTgwMDA4NkMwMDAwMDQ2MTgyMjA2RUZGRkMyMDA4NjYwNDYxMDA3Nw0KLVMxMTgwMkY0RkY1MjJENTBGRkZDNjA4MDRBQUVGRkZDNjcwMDAwMkMyMDZFRkZGQzIwMTkNCi1TMTE4MDMwOTA4NjYwNDYxMDBGRjM4MjI2RTAwMEMyMkE4MDAwODIyMDgwNjgxMDAwMEIyDQotUzExODAzMUUwMDBDNjgwNDYxMDBGRjE0MkQ0MTAwMTQ2MDAwMDAwQzIwNkUwMDBDNDIxMA0KLVMxMTgwMzMzOTA0MkFFMDAxNDRFNUUyMDVGMjg1RjUwOEY0RUQwNEZFREZGMDA3MDdGNDQNCi1TMTE4MDM0ODIwNEY0MjU4NTFDOEZGRkM0ODZERkYwODFGM0MwMDA0M0YzQzAwMDE5RjQ5DQotUzExODAzNURGQzAwMDAwMDBDMjI0RjQ1RkEwNEZFMjJEQTIyREEyMkRBMjY2QzAwMjgxRg0KLVMxMTgwMzcyMkYwQzI4NkMwMDJDNEVBQjAwNjg0ODZERkZCODQ4NkRGRkI0MkYwQzIwRTcNCi1TMTE4MDM4NzZDMDAwMDI4NkMwMDA0NEU5MDlGRkMwMDAwMDA1MjJGMkRGRkM2MkYwQzMyDQotUzExODAzOUMyMDZDMDAwODI4NkMwMDBDNEU5MDcwNTIyNjZDMDAyMDRFQUIwMDFFNDE2QQ0KLVMxMTgwM0IxRkEwNEJFMjY2QzAwMjA0RUFCMDA3RTI2NkMwMDIwNEVBQjAwOUU0MUVERDcNCi1TMTE4MDNDNkZGQkEyNjZDMDAyMDRFQUIwMDdFMjY2QzAwMjA0RUFCMDA5RTFGM0MwMDk4DQotUzExODAzREIyODNGM0MwMDAxMjY2QzAwMjA0RUFCMDA5RTlGRkMwMDAwMDA1MjMwMkREMg0KLVMxMTgwM0YwRkZDQTQ4QzAyRjAwMkYwQzIwNkMwMDA4Mjg2QzAwMEM0RTkwNzA1MjI2QkYNCi1TMTE4MDQwNTZDMDAyMDRFQUIwMDFFMjY2QzAwMjA0RUFCMDA5RTQxRkEwNDVFMjY2Q0MzDQotUzExODA0MUEwMDIwNEVBQjAwN0UyNjZDMDAyMDRFQUIwMDlFNDFFREZGOUU3MDE2MjY3Mg0KLVMxMTgwNDJGNkMwMDIwNEVBQjAwQ0E2MDAwMDAxNjJCNUZGRkYyNEZFREZGMDAyQjdDOTINCi1TMTE4MDQ0NDAwMDAwMDAxRkZCNDYwMDAwM0U0NDg2REZGMDg5RkZDMDAwMDAwNTIyMERCDQotUzExODA0NTk0RjQzRURGRjlFMzAxOTcyNTA5MjQwNkYwMjQyNDFEMDQxMzBDMDZGMEEyMw0KLVMxMTgwNDZFNTM0MEUyNDAzMEQ5NTFDOEZGRkM5RkZDMDAwMDAwNTIyMjRGNDVGQTAzMDMNCi1TMTE4MDQ4M0Y2MzJEQTI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNTBGRkFBNDg2RDAyDQotUzExODA0OThGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBBMEZGOTY0MkFERkY3Mw0KLVMxMTgwNEFEMDAyQjZDMDAzMkZGMDQ0ODdBMDNDNDNGM0NGRkZGNDg2REZGMDgyNjZDMUENCi1TMTE4MDRDMjAwMjgyRjBDMjg2QzAwMkM0RUFCMDBDMEZGNzA0ODZERkYwODI2NkMwMDg4DQotUzExODA0RDcyODJGMEMyODZDMDAyQzRFQUIwMEE0RkY1QzYwMDAwMDc4MkI1RkZGRjI5RQ0KLVMxMTgwNEVDNEZFREZGMDA0ODdBMDNCQTNGM0NGRkZGNDg2REZGMDgyNjZDMDAyODJGMUYNCi1TMTE4MDUwMTBDMjg2QzAwMkM0RUFCMDBDMEZGMzQ5RkZDMDAwMDAwNTIyMDZERkYwNEFDDQotUzExODA1MTYyMDA4MkYwMDJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDJGMEYzRjNDRkY2MA0KLVMxMTgwNTJCRkY0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQzBGRjAwOEYNCi1TMTE4MDU0MERGRkMwMDAwMDA1MjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUI2DQotUzExODA1NTVBQjAwQTRGRUU2NjAwMDAxRjAyMDZERkYwNDIwMDg2NjAyNjE4MDRBOTAyRQ0KLVMxMTgwNTZBNjcwMDAxNkEyMjEwMDI4MTAwMDAwMDAzNEE4MTY2NEEyMjEwMjQyQzAwRjENCi1TMTE4MDU3RjM2MDQ4MjAwMDAwMDBDNjgwNDYxMDBGQ0FFQjI4MjZFMzQyMjEwMjQwOEYwDQotUzExODA1OTQwNjgyMDAwMDAwMEM2ODA0NjEwMEZDOUFCMjgyNkQyMDIyMTAyNDA4OTJBNg0KLVMxMTgwNUE5ODI0RTc2MDQ4MTAwMDAwMDBDNEU3NjRBRDU2NjA0NjEwMEZDN0VCMkE4RTANCi1TMTE4MDVCRTAwMDg2QzAwMDAwNjYxMDBGRjIyMjA2REZGMDQyMDA4NjYwNDYxMDBGRkE2DQotUzExODA1RDMxNjIyMjgwMDA4RDJBREZGMDA2ODA0NjEwMEZDNTgyQjQxRkYwMDlGRkMwMg0KLVMxMTgwNUU4MDAwMDAwNTIyNDA4MkYwMjJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDJGQkYNCi1TMTE4MDVGRDBGM0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQkU1DQotUzExODA2MTIwMEMwRkUyQURGRkMwMDAwMDA1MjIwNkRGRjA0MjAwODY2MDQ2MTAwRkUzOQ0KLVMxMTgwNjI3QzIyRjI4MDAwNDNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMEMyODZDRDENCi1TMTE4MDYzQzAwMkM0RUFCMDBCQ0ZERkMyMDZERkYwNDIwMDg2NjA0NjEwMEZFOUEyRjgxDQotUzExODA2NTEyODAwMDgzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM2OA0KLVMxMTgwNjY2NEVBQjAwQkNGREQ0OUZGQzAwMDAwMDUyMjA2REZGMDQyMDA4NjYwNDYxODUNCi1TMTE4MDY3QjAwRkU2QzIyMTAyRjAxMkYwQzIwNkMwMDEwMjg2QzAwMTQ0RTkwMkYwRkZGDQotUzExODA2OTAzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDA2MA0KLVMxMTgwNkE1QzBGRDk4REZGQzAwMDAwMDUyNDg2REZGMDgyNjZDMDAyODJGMEMyODZDNzUNCi1TMTE4MDZCQTAwMkM0RUFCMDBBNEZEN0UyMDZERkYwNDIwMDg2NjA0NjEwMEZFMUMyQjFCDQotUzExODA2Q0Y1MEZGMDQ2MDAwRkU4QTIwNkMwMDNBQjFFREZGMDQ2NzAwMDA2QzQ4N0FEQg0KLVMxMTgwNkU0MDFFODNGM0NGRkZGNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFREMNCi1TMTE4MDZGOUFCMDBDMEZENDI5RkZDMDAwMDAwNTIyMDZERkYwNDIwMDgyRjAwMkYwQzJGDQotUzExODA3MEUyMDZDMDAxMDI4NkMwMDE0NEU5MDJGMEYzRjNDRkZGRjQ4NkRGRjA4MjYxNw0KLVMxMTgwNzIzNkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQzBGRDBFREZGQzAwMDAwMDUyM0QNCi1TMTE4MDczODQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZDRjQ0ODYyDQotUzExODA3NEQ3QTAxOTgzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM5Ng0KLVMxMTgwNzYyNEVBQjAwQzBGQ0Q4NDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFMzINCi1TMTE4MDc3N0FCMDBBNEZDQzQ0ODdBMDE2QTNGM0NGRkZGNDg2REZGMDgyNjZDMDAyODNFDQotUzExODA3OEMyRjBDMjg2QzAwMkM0RUFCMDBDMEZDQTg0ODZERkYwODI2NkMwMDI4MkY1Nw0KLVMxMTgwN0ExMEMyODZDMDAyQzRFQUIwMEE0RkM5NDIwNkRGRjA0MjAwODA2ODAwMDAwMDgNCi1TMTE4MDdCNjAwMTg0RTc2MjIyQzAwMzY5MjgwNEU3NjAyODFGRkZGRkZGQzRBRDU2NkYzDQotUzExODA3Q0IwNDYxMDBGQTZBMkYwMTNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMENFNA0KLVMxMTgwN0UwMjg2QzAwMkM0RUFCMDBCQ0ZDNTYyRjJERkYwMDNGM0MwMDBDNDg2REZGQTMNCi1TMTE4MDdGNTA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBCQ0ZDM0E0ODZERkYwODg3DQotUzExODA4MEEyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEE0RkMyNjQ4NkRGRjA4MUY4Ng0KLVMxMTgwODFGM0MwMDAxMjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDA1NDQ4NkRGRkI4MTUNCi1TMTE4MDgzNDQ4NkRGRkI0MkYwQzIwNkMwMDE4Mjg2QzAwMUM0RTkwNDg2REZGMDg0MkQ4DQotUzExODA4NDkyNzI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNTQ0MkE3MkYyRDAwMzhGMA0KLVMxMTgwODVFMkYyRDAwMzQ0RTRBMDAwQTQ2MzEyMDIwMjAyMDIwMjAyMDIwMDAwMjNBOUMNCi1TMTE4MDg3MzNBMDAwMjI5M0EwMDAwMDAzMDIwMjAyMDIwMjA0MTY0NjQ3MjY1NzM3MzM3DQotUzExODA4ODgyMDIwMjAyMDQ5NjQ2NTZFNzQ2OTc0NzkyMDIwMjAyMDIwMjAyMDIwNTMzQQ0KLVMxMTgwODlENjk3QTY1MjAyMDIwMjAyMDIwMjAyMDRFNjU3ODc0MDAxRDQ5NkU3NjYxQjANCi1TMTE4MDhCMjZDNjk2NDIwNzM2NTY3NkQ2NTZFNzQyMDczNzQ2MTcyNzQ2OTZFNjcyMDM1DQotUzExODA4Qzc2MTc0M0EyMDIwMDAxODUzNjU2NzZENjU2RTc0MjA2QzY5NzM3NDIwNjM3Rg0KLVMxMTgwOERDNkY3MjcyNzU3MDc0NjU2NDNBMjAwMDAwMDAxODIwMjAyMDQxNzY2MTY5M0INCi1TMTE4MDhGMTZDNjE2MjZDNjUyMDIwMjAyMDIwMjAyMDIwNTU3MzY1NjQ0RkVERkZGMjMwDQotUzExODA5MDY5RkZDMDAwMDAwMEE2MTAwMDE1NjQxRUMwMDMwMjBERjIwREYzMERGMjBGMQ0KLVMxMTgwOTFCMkMwMDMyNTY4MDRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDBGOTBBNjMNCi1TMTE4MDkzMDI5NDAwMDMyMjk0MDAwM0E2MDAwMDAzRTJCNUZGRkYyNEZFREZGRjIyMDBBDQotUzExODA5NDUyQzAwMzI1NjgwNEU3NjAyODBGRkZGRkZGQzRBRDU2NjA0NjEwMEY4RTA2NA0KLVMxMTgwOTVBMjk0MDAwM0EyMDZDMDAzQTIyMDg2NjA0NjEwMEY4REU0MjkwNDJBODAwOTQNCi1TMTE4MDk2RjA0NDJBODAwMDg2MDAwMDA5RTRBMkMwMDMwNjcwMDAwMUEyMDZDMDAzQThFDQotUzExODA5ODQyMDA4NjYwMjYxQjI0MjkwNDJBODAwMDQ0MkE4MDAwODYwMDAwMDdFMjAwNw0KLVMxMTgwOTk5NkMwMDNBMjAwODY2MDI2MTlBNEE5MDY3MDAwMDZFMjIxMDAyODEwMDAwQjANCi1TMTE4MDlBRTAwMDM0QTgxNjY0QTIyMTAyNDJDMDAzNjA0ODIwMDAwMDAwQzY4MDQ2MTlCDQotUzExODA5QzMwMEY4NzRCMjgyNkUzNDIyMTAyNDA4MDY4MjAwMDAwMDBDNjgwNDYxMDAxQQ0KLVMxMTgwOUQ4Rjg2MEIyODI2RDIwMjIxMDI0MDg5MjgyNEU3NjA0ODEwMDAwMDAwQzRFRDgNCi1TMTE4MDlFRDc2NEFENTY2MDQ2MTAwRjg0NEIyQTgwMDA4NkMwMDAwMDY2MTAwRkYzQ0U1DQotUzExODBBMDIyMDZDMDAzQTIwMDg2NjA0NjEwMEZGMzAyOTUwMDAzQTYwODQ0MkE3MkY0NA0KLVMxMTgwQTE3MkQwMDM4MkYyRDAwMzQ0RTRBNEU1NjAwMDA1MThGNDJBNzFGM0MwMDBFNjMNCi1TMTE4MEEyQzQyNjc0ODdBMDAxMjQyNjc0MjI3MkYzQzAwQjVFODZFNEU0OTAwMEU1MEI3DQotUzExODBBNDE4RjRFNUUyMDVGMjg1RjRFRTgwMDAyMjA3QzAwMDAwMDAwNjAwNDJCNUY5OQ0KLVMxMTgwQTU2RkZGMjRFNUVEMURGMjg1RjJGMDhEMEQwNEVEMDQzRkEwMDA0RDNGQzAwQUUNCi1TMTE4MEE2QjAyNzA0RTJGNDkwMDBBNDNGQTAwMDREM0ZDMDAwMDAwNDAyRjQ5MDAwNjYyDQotUzExODBBODA0MUZBMDAwNEQxRkNGRkZGRjU3QTIwMjgwMDU2NjYwMDAwMjIyMjA5OTIwMQ0KLVMxMTgwQTk1ODgyMTQxMDA1NjQyODEyNDQ4RDI1QUI1Qzk2REZBNDQ0MUQzNjgwMDVBQUUNCi1TMTExMEFBQTFGN0MwMDAxMDAwNDRFNzU0MjJGMDAwNDRFNzU5Rg0KLVM5MDMwMDAwRkMNCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0xLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNhN2NjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0xLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMi5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0YTc5ZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMi5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0zLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTMucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTkzNDIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTMucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIubGQgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIubGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMWU0MTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLU9VVFBVVF9GT1JNQVQoInNyZWMiKQotU0VDVElPTlMKLXsKLQotCi0udGV4dCAwIDogeyAqKCI5IikgKigiMTAiKSAqKCIxMSIpICooIjEyIikgKigiMTMiKSAqKCIxNCIpICooIjE1IikKLQkJKigiNyIpICooIjgiKSAqKCIwIikgKigiMSIpICooIjIiKSAqKCIzIikgKigiNCIpIH0KLS5ic3MgICA6IHsgICooIjUiKSAqKCI2IikgfQotCi0uUEFGSSAgICA9MHgwMDAwMDA1MCA7Ci0uUENISU8gICA9MHgwMDAwMDBEMCA7Ci0uUENMTyAgICA9MHgwMDAwMDA1NCA7Ci0uUENWQlNWICA9MHgwMDAwMDAwRSA7Ci0uUENWVFNVICA9MHgwMDAwMDAxMiA7Ci0uUENWVFNWICA9MHgwMDAwMDAxNiA7Ci0uUENWVFNWTCA9MHgwMDAwMDAxQSA7Ci0uUENWVFVTICA9MHgwMDAwMDAxRSA7Ci0uUERJUyAgICA9MHgwMDAwMDAyMiA7Ci0uUERJU0wgICA9MHgwMDAwMDAyNiA7Ci0uUERWSiAgICA9MHgwMDAwMDAyQSA7Ci0uUEVJTyAgICA9MHgwMDAwMDBDQyA7Ci0uUEVPRiAgICA9MHgwMDAwMDA1OCA7Ci0uUEVPTCAgICA9MHgwMDAwMDA1QyA7Ci0uUEVRVVMgICA9MHgwMDAwMDAyRSA7Ci0uUEVRVVYgICA9MHgwMDAwMDAzMiA7Ci0uUEVRVVZMICA9MHgwMDAwMDAzNiA7Ci0uUEVRVVcgICA9MHgwMDAwMDBERSA7Ci0uUEdDTSAgICA9MHgwMDAwMDA2NCA7Ci0uUEdFUVMgICA9MHgwMDAwMDAzQSA7Ci0uUEdFUVYgICA9MHgwMDAwMDAzRSA7Ci0uUEdFUVZMICA9MHgwMDAwMDA0MiA7Ci0uUEdFVCAgICA9MHgwMDAwMDA2MCA7Ci0uUEdSVFMgICA9MHgwMDAwMDA0NiA7Ci0uUEdSVFYgICA9MHgwMDAwMDA0QSA7Ci0uUEdSVFZMICA9MHgwMDAwMDA0RSA7Ci0uUElBQ1QgICA9MHgwMDAwMDA2QyA7Ci0uUElGRCAgICA9MHgwMDAwMDA2OCA7Ci0uUElORFMgICA9MHgwMDAwMDA1MiA7Ci0uUElORFYgICA9MHgwMDAwMDA1NiA7Ci0uUElORFZMICA9MHgwMDAwMDA1QSA7Ci0uUElORFcgICA9MHgwMDAwMDBENiA7Ci0uUExEQ1MgICA9MHgwMDAwMDA1RSA7Ci0uUExEQ1YgICA9MHgwMDAwMDA2MiA7Ci0uUExFUVMgICA9MHgwMDAwMDA2NiA7Ci0uUExFUVYgICA9MHgwMDAwMDA2QSA7Ci0uUExFUVZMICA9MHgwMDAwMDA2RSA7Ci0uUExFU1MgICA9MHgwMDAwMDA3MiA7Ci0uUExFU1YgICA9MHgwMDAwMDA3NiA7Ci0uUExFU1ZMICA9MHgwMDAwMDA3QSA7Ci0uUExPRFMgICA9MHgwMDAwMDA3RSA7Ci0uUExPRFYgICA9MHgwMDAwMDA4MiA7Ci0uUExPRFZMICA9MHgwMDAwMDA4NiA7Ci0uUE1PREogICA9MHgwMDAwMDA4QSA7Ci0uUE1PViAgICA9MHgwMDAwMDBFMiA7Ci0uUE1QSiAgICA9MHgwMDAwMDA4RSA7Ci0uUE5FUVMgICA9MHgwMDAwMDA5MiA7Ci0uUE5FUVYgICA9MHgwMDAwMDA5NiA7Ci0uUE5FUVZMICA9MHgwMDAwMDA5QSA7Ci0uUE5FUVcgICA9MHgwMDAwMDBEQSA7Ci0uUFBBR0UgICA9MHgwMDAwMDBENCA7Ci0uUFBFRSAgICA9MHgwMDAwMDA3MCA7Ci0uUFBVVCAgICA9MHgwMDAwMDA3NCA7Ci0uUFJEQiAgICA9MHgwMDAwMDA3OCA7Ci0uUFJEQyAgICA9MHgwMDAwMDA3QyA7Ci0uUFJESCAgICA9MHgwMDAwMDA4MCA7Ci0uUFJESSAgICA9MHgwMDAwMDA4NCA7Ci0uUFJESiAgICA9MHgwMDAwMDA4OCA7Ci0uUFJEUlMgICA9MHgwMDAwMDBDOCA7Ci0uUFJEUyAgICA9MHgwMDAwMDA4QyA7Ci0uUFJEViAgICA9MHgwMDAwMDA5MCA7Ci0uUFJMTiAgICA9MHgwMDAwMDA5NCA7Ci0uUFJSQU4gICA9MHgwMDAwMDA5OCA7Ci0uUFJTVCAgICA9MHgwMDAwMDA5QyA7Ci0uUFJXVCAgICA9MHgwMDAwMDBBMCA7Ci0uUFNDT04gICA9MHgwMDAwMDA5RSA7Ci0uUFNDT1AgICA9MHgwMDAwMDBBMiA7Ci0uUFNERUwgICA9MHgwMDAwMDBBNiA7Ci0uUFNJTlMgICA9MHgwMDAwMDBBQSA7Ci0uUFNMRU4gICA9MHgwMDAwMDBBRSA7Ci0uUFNQT1MgICA9MHgwMDAwMDBCMiA7Ci0uUFNUQ1YgICA9MHgwMDAwMDBCNiA7Ci0uUFNUQ1ZMICA9MHgwMDAwMDBCQSA7Ci0uUFNUT1MgICA9MHgwMDAwMDBCRSA7Ci0uUFNUT1YgICA9MHgwMDAwMDBDMiA7Ci0uUFNUT1ZMICA9MHgwMDAwMDBDNiA7Ci0uUFNUUlMgICA9MHgwMDAwMDBDQSA7Ci0uUFNUUlYgICA9MHgwMDAwMDBDRSA7Ci0uUFNUUlZMICA9MHgwMDAwMDBEMiA7Ci0uUFdMTiAgICA9MHgwMDAwMDBBNCA7Ci0uUFdSQU4gICA9MHgwMDAwMDBBOCA7Ci0uUFdSQiAgICA9MHgwMDAwMDBBQyA7Ci0uUFdSQyAgICA9MHgwMDAwMDBCMCA7Ci0uUFdSSCAgICA9MHgwMDAwMDBCNCA7Ci0uUFdSSSAgICA9MHgwMDAwMDBCOCA7Ci0uUFdSSiAgICA9MHgwMDAwMDBCQyA7Ci0uUFdSUyAgICA9MHgwMDAwMDBDMCA7Ci0uUFdSViAgICA9MHgwMDAwMDBDNCA7Ci0KLS8qCi0uUEFGST0weCAgID0gMHgwMDsKLS5QQ0hJTyAgID0weCAweDAwMDAwMDsKLS5QQ0xPICAgID0weCA2NCA7Ci0uUEM7Ci0uUENWVFNVICA9MHggMHgwMDAwMDA7Ci0uUENWVFNWICA9MHggMHgwMDAwMDA7Ci0uUENWVFNWTCA9MHggMHgwMDAwMDA7Ci0uUENWVFVTICA9MHggMTU4IDsKLS5QOwotLlBESVNMICAgPTB4IDB4MDAwMDAwOwotLlBEVkogICAgPTB4IDB4MDAwMDAwOwotLlBFSU8gICAgPTB4IDB4MDAwMDAwOwotLlBFT0YgICAgPTB4IDB4MDAwMDAwOwotLlBFT0wgICAgPTB4IDB4MDAwMDAwOwotLlBFUVVTICAgPTB4IDB4MDAwMDAwOwotLlBFUVVWICAgPTB4IDB4MDAwMDAwOwotLlBFUVVWTCAgPTB4IDB4MDAwMDAwOwotLlBFUVVXICAgPTB4IDB4MDAwMDAwOwotLlBHQ00gICAgPTB4IDB4MDAwMDAwOwotLlBHRVFTICAgPTB4IDB4MDAwMDAwOwotLlBHRVFWICAgPTB4IDB4MDAwMDAwOwotLlBHRVFWTCAgPTB4IDB4MDAwMDAwOwotLlBHRVQgICAgPTB4IDB4MDAwMDAwOwotLlBHUlRTICAgPTB4IDB4MDAwMDAwOwotLlBHUlRWICAgPTB4IDB4MDAwMDAwOwotLlBHUlRWTCAgPTB4IDB4MDAwMDAwOwotLlBJQUNUICAgPTB4IDB4MDAwMDAwOwotLlBJRkQgICAgPTB4IDEyNiA7Ci0uUDsKLS5QSU5EViAgID0weCAweDAwMDAwMDsKLS5QSU5EVkwgID0weCAweDAwMDAwMDsKLS5QSU5EVyAgID0weCAweDAwMDAwMDsKLS5QTERDUyAgID0weCAweDAwMDAwMDsKLS5QTERDViAgID0weCAweDAwMDAwMDsKLS5QTEVRUyAgID0weCAweDAwMDAwMDsKLS5QTEVRViAgID0weCAweDAwMDAwMDsKLS5QTEVRVkwgID0weCAweDAwMDAwMDsKLS5QTEVTUyAgID0weCAweDAwMDAwMDsKLS5QTEVTViAgID0weCAweDAwMDAwMDsKLS5QTEVTVkwgID0weCAweDAwMDAwMDsKLS5QTE9EUyAgID0weCAweDAwMDAwMDsKLS5QTE9EViAgID0weCAweDAwMDAwMDsKLS5QTE9EVkwgID0weCAweDAwMDAwMDsKLS5QTU9ESiAgID0weCAweDAwMDAwMDsKLS5QTU9WICAgID0weCAweDAwMDAwMDsKLS5QTVBKICAgID0weCAweDAwMDAwMDsKLS5QTkVRUyAgID0weCAweDAwMDAwMDsKLS5QTkVRViAgID0weCAweDAwMDAwMDsKLS5QTkVRVkwgID0weCAweDAwMDAwMDsKLS5QTkVRVyAgID0weCAweDAwMDAwMDsKLS5QUEFHRSAgID0weCAweDAwMDAwMDsKLS5QUEVFICAgID0weCAweDAwMDAwMDsKLS5QUFVUICAgID0weCAweDAwMDAwMDsKLS5QUkRCICAgID0weCAweDAwMDAwMDsKLS5QUkRDICAgID0weCAweDAwMDAwMDsKLS5QUkRIICAgID0weCAweDAwMDAwMDsKLS5QUkRJICAgID0weCAweDAwMDAwMDsKLS5QUkRKICAgID0weCAweDAwMDAwMDsKLS5QUkRSUyAgID0weCAweDAwMDAwMDsKLS5QUkRTICAgID0weCAweDAwMDAwMDsKLS5QUkRWICAgID0weCAweDAwMDAwMDsKLS5QUkxOICAgID0weCAweDAwMDAwMDsKLS5QUlJBTiAgID0weCAweDAwMDAwMDsKLS5QUlNUICAgID0weCAweDAwMDAwMDsKLS5QUldUICAgID0weCAweDAwMDAwMDsKLS5QU0NPTiAgID0weCAweDAwMDAwMDsKLS5QU0NPUCAgID0weCAweDAwMDAwMDsKLS5QU0RFTCAgID0weCAweDAwMDAwMDsKLS5QU0lOUyAgID0weCAweDAwMDAwMDsKLS5QU0xFTiAgID0weCAweDAwMDAwMDsKLS5QU1BPUyAgID0weCAweDAwMDAwMDsKLS5QU1RDViAgID0weCAweDAwMDAwMDsKLS5QU1RDVkwgID0weCAweDAwMDAwMDsKLS5QU1RPUyAgID0weCAweDAwMDAwMDsKLS5QU1RPViAgID0weCAweDAwMDAwMDsKLS5QU1RPVkwgID0weCAweDAwMDAwMDsKLS5QU1RSUyAgID0weCAweDAwMDAwMDsKLS5QU1RSViAgID0weCAweDAwMDAwMDsKLS5QU1RSVkwgID0weCAweDAwMDAwMDsKLS5QV0xOICAgID0weCAweDAwMDAwMDsKLS5QV1JBTiAgID0weCAweDAwMDAwMDsKLS5QV1JCICAgID0weCAweDAwMDAwMDsKLS5QV1JDICAgID0weCAweDAwMDAwMDsKLS5QV1JIICAgID0weCAweDAwMDAwMDsKLS5QV1JJICAgID0weCAweDAwMDAwMDsKLS5QV1JKICAgID0weCAweDAwMDAwMDsKLS5QV1JTICAgID0weCAweDAwMDAwMDsKLS5QV1JWICAgID0weCAweDAwMDAwMDsKLQotKi8KLS8qCi0uUD0weCAgICAgID0gMDsKLS5QQ0hJTyAgID0weCAweGZlZWRmYTsKLS5QQ0xPICAgID0weCAweGZlZWRmYTsKLS5QQ1ZCU1YgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1UgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1YgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1ZMID0weCAweGZlZWRmYTsKLS5QQ1ZUVVMgID0weCAweGZlZWRmYTsKLS5QRElTICAgID0weCAweGZlZWRmYTsKLS5QRElTTCAgID0weCAweGZlZWRmYTsKLS5QRFZKICAgID0weCAweGZlZWRmYTsKLS5QRUlPICAgID0weCAweGZlZWRmYTsKLS5QRU9GICAgID0weCAweGZlZWRmYTsKLS5QRU9MICAgID0weCAweGZlZWRmYTsKLS5QRVFVUyAgID0weCAweGZlZWRmYTsKLS5QRVFVViAgID0weCAweGZlZWRmYTsKLS5QRVFVVkwgID0weCAweGZlZWRmYTsKLS5QRVFVVyAgID0weCAweGZlZWRmYTsKLS5QR0NNICAgID0weCAweGZlZWRmYTsKLS5QR0VRUyAgID0weCAweGZlZWRmYTsKLS5QR0VRViAgID0weCAweGZlZWRmYTsKLS5QR0VRVkwgID0weCAweGZlZWRmYTsKLS5QR0VUICAgID0weCAweGZlZWRmYTsKLS5QR1JUUyAgID0weCAweGZlZWRmYTsKLS5QR1JUViAgID0weCAweGZlZWRmYTsKLS5QR1JUVkwgID0weCAweGZlZWRmYTsKLS5QSUFDVCAgID0weCAweGZlZWRmYTsKLS5QSUZEICAgID0weCAweGZlZWRmYTsKLS5QSU5EUyAgID0weCAweGZlZWRmYTsKLS5QSU5EViAgID0weCAweGZlZWRmYTsKLS5QSU5EVkwgID0weCAweGZlZWRmYTsKLS5QSU5EVyAgID0weCAweGZlZWRmYTsKLS5QTERDUyAgID0weCAweGZlZWRmYTsKLS5QTERDViAgID0weCAweGZlZWRmYTsKLS5QTEVRUyAgID0weCAweGZlZWRmYTsKLS5QTEVRViAgID0weCAweGZlZWRmYTsKLS5QTEVRVkwgID0weCAweGZlZWRmYTsKLS5QTEVTUyAgID0weCAweGZlZWRmYTsKLS5QTEVTViAgID0weCAweGZlZWRmYTsKLS5QTEVTVkwgID0weCAweGZlZWRmYTsKLS5QTE9EUyAgID0weCAweGZlZWRmYTsKLS5QTE9EViAgID0weCAweGZlZWRmYTsKLS5QTE9EVkwgID0weCAweGZlZWRmYTsKLS5QTU9ESiAgID0weCAweGZlZWRmYTsKLS5QTU9WICAgID0weCAweGZlZWRmYTsKLS5QTVBKICAgID0weCAweGZlZWRmYTsKLS5QTkVRUyAgID0weCAweGZlZWRmYTsKLS5QTkVRViAgID0weCAweGZlZWRmYTsKLS5QTkVRVkwgICAgPSAweGZlZWRmYWNlOwotLlBORVFXICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBBR0UgICAgID0gMHhmZWVkZmFjZTsKLS5QUEVFICAgICAgPSAweGZlZWRmYWNlOwotLlBQVVQgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEQiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRDICAgICAgPSAweGZlZWRmYWNlOwotLlBSREggICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESSAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRKICAgICAgPSAweGZlZWRmYWNlOwotLlBSRFJTICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEUyAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRWICAgICAgPSAweGZlZWRmYWNlOwotLlBSTE4gICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJSQU4gICAgID0gMHhmZWVkZmFjZTsKLS5QUlNUICAgICAgPSAweGZlZWRmYWNlOwotLlBSV1QgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNDT04gICAgID0gMHhmZWVkZmFjZTsKLS5QU0NPUCAgICAgPSAweGZlZWRmYWNlOwotLlBTREVMICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNJTlMgICAgID0gMHhmZWVkZmFjZTsKLS5QU0xFTiAgICAgPSAweGZlZWRmYWNlOwotLlBTUE9TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUQ1YgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RDVkwgICAgPSAweGZlZWRmYWNlOwotLlBTVE9TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1YgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPVkwgICAgPSAweGZlZWRmYWNlOwotLlBTVFJTICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlYgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSVkwgICAgPSAweGZlZWRmYWNlOwotLlBXTE4gICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQU4gICAgID0gMHhmZWVkZmFjZTsKLS5QV1JCICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSCAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JJICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkogICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSUyAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JWICAgICAgPSAweGZlZWRmYWNlOwotKi8KLQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLm9vayBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjI0YTUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLm9vaworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLVMwMTIwMDAwNjk2RTY5NzQ3NDY1NzM3NDVGNjU3MDYzMkU3MzcyQ0YNCi1TMTE4MDAwMDAwMDAwMDAwNDk0RTQ5NTQ1NDQ1NTM1NDIwMjA1MDQxMzAzNTIwMjA1MkFCDQotUzExODAwMTUzMTMzMkUzMzIwMjAyMDIwMjAyMDIwNTIzMTMzMkUzMjIwMjAyMDIwMjA3Nw0KLVMxMTgwMDJBMjAyMDAwOTM0QjVCMDBCNUU2QzExQjA4OURENjAwMDA1NDAwMDAwMDA1RjkNCi1TMTE4MDAzRjVBMDAwMDAwNDgwMDVDMDBBNjAwMDAwMTBBMDEyNjAwMDQwMDAxMDAwMkNCDQotUzExODAwNTQwMDkwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDQwMjAyMDAwMDA0OTRGNUY4QQ0KLVMxMTgwMDY5NTI0NTUzNDU1MjU2NDE1MjU0NEM0OTQyNDM0RjRFMDA0MDQ4NDUwMTAwM0INCi1TMTE4MDA3RTUwNUY0MTRDNEMyMDIwMjAyMDIwNTI1NDRDNDk0MjQzNEY0RTAxMDAwMEUzDQotUzExODAwOTMwMDAwOUMwMTAwMDAwMDAwMDAwMDA4NTM0NTUwNDE1MjQxNTQ0NTAwMDg1Mg0KLVMxMTgwMEE4MDAwODAwNDAzMUNGNTI1NDRDNDk0MjQzNEY0RTAwMDRFNUVDNTI1NDRDRDMNCi1TMTE4MDBCRDQ5NDI0MzRGNEUwMEI1RTg2RDUzNDE0NjQ1NTM1NDRGNTIwMDAwNEYyOEQ3DQotUzExODAwRDI1MzU5NTM1NDQ1NEQ0OTREMDBCNUU4NzM1MzQxNDY0NTUzNTQ0RjUyMDAyMw0KLVMxMTgwMEU3NDAzMUQyNTI1NDRDNDk0MjQzNEY0RTAwMDAwQTdENTI1NDRDNDk0MjUzMDkNCi1TMTE4MDBGQzU0NTIwMDEwQTRBODUyNTQ0QzQ5NDI0NjQ5NEMwMDAxMDBCNUU2QzA0OUVDDQotUzExODAxMTE0RTQ5NTQ1NDQ1NTM1NDIwMjAwMDAwMDYxNjAyMDAwODAwMDAwMDAyMzIxMA0KLVMxMTgwMTI2MDA0ODAwMDAwMDAwNEU1NkZGRjBCQThGNjMwNjJFNEU2MTAwMDBCQzQxNTkNCi1TMTE4MDEzQkZBMDBGNDQzRUVGRkYwMzJEODJEN0MwMDAwMDAwMUZGRkMyMDZFMDAwODU4DQotUzExODAxNTAyMDA4NjYwNDYxMDAwMEJBMjIyRUZGRkM1MzgxNEE4MTZDMDQ2MTAwMDAyRQ0KLVMxMTgwMTY1OUUyMjQ4RDNFOUZGRkM0MUYwMTgwMEIzQzg2M0VFNEExMDY2MDAwMDA2RTcNCi1TMTE4MDE3QTYwMDAwMDYyNDFFRUZGRjAyNjZDMDAzODRFQUIwMDdFMjA2RTAwMDgyMDk1DQotUzExODAxOEYwODY2MDQ2MTAwMDA3QzIyMkVGRkZDNTM4MTRBODE2QzA0NjEwMDAwNjBFRA0KLVMxMTgwMUE0MjI0OEQzRTlGRkZDNDFGMDE4MDBCM0M4NjNFRTFGMTAzRjNDMDAwMTI2M0INCi1TMTE4MDFCOTZDMDAzODRFQUIwMDlFNDFFRUZGRjA3MDBDMjY2QzAwMzg0RUFCMDBDQUNCDQotUzExODAxQ0U1MkFFRkZGQzBDQUUwMDAwMDAwQUZGRkM2RjAwRkY3MDQxRUVGRkYwNDMxRg0KLVMxMTgwMUUzRUUwMDBDMjJEODIyRDgyMkQ4NEU1RTIwNUY1ODhGNEVEMDJCNTdGRkYyNzgNCi1TMTE4MDFGODJGM0MwMDAwMDAwQTYwMDAwMDFFMkI1N0ZGRjIyRjNDMDAwMDAwMEY2MEFFDQotUzExODAyMEQwMDAwMTAyQjU3RkZGMjJGM0MwMDAwMDAxMDYwMDAwMDAyM0I2RjAwMDJDQw0KLVMxMTgwMjIyRkZGNjJGMkQwMDM4MkYyRDAwMzQ0RTRDNEU0QTAwMDA0RkVERkVFQTIwMzQNCi1TMTE4MDIzNzNDMDAwMDAwOEEyMDRGNDI1ODUxQzhGRkZDNDg2REZFRUExRjNDMDAwNENGDQotUzExODAyNEMzRjNDMDAwMTlGRkMwMDAwMDAwQzIyNEY0NUZBMDJENDIyREEyMkRBMjJENg0KLVMxMTgwMjYxREEyNjZDMDA0MDJGMEMyODZDMDA0NDRFQUIwMDY4NDg2REZGQjg0ODZENDMNCi1TMTE4MDI3NkZGQjQyRjBDMjA2QzAwMDgyODZDMDAwQzRFOTA5RkZDMDAwMDAwNTIyRjUzDQotUzExODAyOEIyREZGQzYyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTA3MDUyMjY2QzAwMzg3Rg0KLVMxMTgwMkEwNEVBQjAwMUU0MUZBMDI5NDI2NkMwMDM4NEVBQjAwN0UyNjZDMDAzODRFMDQNCi1TMTE4MDJCNUFCMDA5RTQxRURGRkJBMjY2QzAwMzg0RUFCMDA3RTI2NkMwMDM4NEVBQkZDDQotUzExODAyQ0EwMDlFMUYzQzAwMjgzRjNDMDAwMTI2NkMwMDM4NEVBQjAwOUU5RkZDMDA4Mg0KLVMxMTgwMkRGMDAwMDUyMzAyREZGQ0E0OEMwMkYwMDJGMEMyMDZDMDAxMDI4NkMwMDE0RDgNCi1TMTE4MDJGNDRFOTA3MDUyMjY2QzAwMzg0RUFCMDAxRTI2NkMwMDM4NEVBQjAwOUU0MUNFDQotUzExODAzMDlGQTAyMzQyNjZDMDAzODRFQUIwMDdFMjY2QzAwMzg0RUFCMDA5RTQxRUREQg0KLVMxMTgwMzFFRkY4MDcwMTYyNjZDMDAzODRFQUIwMENBOUZGQzAwMDAwMDBFNjEwMDAyMjgNCi1TMTE4MDMzMzI4NDFFREZGOUUyMERGMjBERjIwREYzMERGNEEyREZGOUU2NzAwMDAzQUZEDQotUzExODAzNDg1OThGMkYyREZGQTAyRjJERkZBODJGMEMyMDZDMDAxODI4NkMwMDFDNEVEOQ0KLVMxMTgwMzVEOTAwMUI4MkI1RkZGOUEyRjJERkY5QTJGMkRGRkE0MkYyREZGQTgyRjBDRTkNCi1TMTE4MDM3MjIwNkMwMDIwMjg2QzAwMjQ0RTkwNjAwMDAwMzQ1OThGMkYyREZGQTA0ODcxDQotUzExODAzODc2REZGQTgyRjBDMjA2QzAwMjgyODZDMDAyQzRFOTAyQjVGRkY5NjJGMkQ0MQ0KLVMxMTgwMzlDRkZBNDJGMkRGRjk2MkYyREZGQTgyRjBDMjA2QzAwMjAyODZDMDAyNDRFQzQNCi1TMTE4MDNCMTkwNDg2REZFRUE5RkZDMDAwMDAwNTIyMDRGNDNFREZGODAzMDE5NzI1MEYwDQotUzExODAzQzY5MjQwNkYwMjQyNDFEMDQxMzBDMDZGMEE1MzQwRTI0MDMwRDk1MUM4RkYwOA0KLVMxMTgwM0RCRkM5RkZDMDAwMDAwNTIyMjRGNDVGQTAxNUMzMkRBMjY2QzAwNDAyRjBDRkENCi1TMTE4MDNGMDI4NkMwMDQ0NEVBQjAwNTAwMTJDNDg2REZFRUEyNjZDMDA0MDJGMEMyOEQ0DQotUzExODA0MDU2QzAwNDQ0RUFCMDBBMDAxMTg0ODdBMDEzNDNGM0NGRkZGNDg2REZFRUE2Rg0KLVMxMTgwNDFBMjY2QzAwNDAyRjBDMjg2QzAwNDQ0RUFCMDBDMDAwRkM0ODZERkVFQTI2NkMNCi1TMTE4MDQyRjZDMDA0MDJGMEMyODZDMDA0NDRFQUIwMEE0MDBFODQyQURGRkIwMkI3QzJCDQotUzExODA0NDQwMDAwMDAwMUZGQUM1OThGMkYyREZGQUM2MTAwMDE3RTJCNUZGRkIwMkJDMA0KLVMxMTgwNDU5NDBGRkIwMkYyREZGQUMzRjNDMDAwQTQ4NkRGRUVBMjY2QzAwNDAyRjBDNjUNCi1TMTE4MDQ2RTI4NkMwMDQ0NEVBQjAwQkMwMEFFOUZGQzAwMDAwMDBDMkYyREZGQjA2MTI3DQotUzExODA0ODMwMEZDQTgyRjBGM0YzQzAwMEE0ODZERkVFQTI2NkMwMDQwMkYwQzI4NkNCQg0KLVMxMTgwNDk4MDA0NDRFQUIwMEMwMDA4NkRGRkMwMDAwMDAwQzQ4NkRGRUVBMjY2QzAwQjINCi1TMTE4MDRBRDQwMkYwQzI4NkMwMDQ0NEVBQjAwQTQwMDZDNTJBREZGQUMwQ0FEMDAwMDc3DQotUzExODA0QzIwMDBBRkZBQzZGODI0ODZERkVFQTFGM0MwMDAxMjY2QzAwNDAyRjBDMjg0RA0KLVMxMTgwNEQ3NkMwMDQ0NEVBQjAwNTQ0ODZERkZCODQ4NkRGRkI0MkYwQzIwNkMwMDMwNDQNCi1TMTE4MDRFQzI4NkMwMDM0NEU5MDQ4NkRGRUVBNDIyNzI2NkMwMDQwMkYwQzI4NkMwMEFBDQotUzExODA1MDE0NDRFQUIwMDU0NDJBNzJGMkQwMDM4MkYyRDAwMzQ0RTRBMkI1N0ZGRjIzOA0KLVMxMTgwNTE2MkYzQzAwMDAwMDBDNjAwMEZEMDAyQjU3RkZGMjJGM0MwMDAwMDA2NDYwNTYNCi1TMTE4MDUyQjAwRkNGMjAwMEE0NjMxMjAyMDIwMjAyMDIwMjAyMDAwMDIzQTNBMDAwMkQwDQotUzExODA1NDAyOTNBMDAwMDAwMTQyMDIwMjAyMDIwMjA0MzYxNzM2NTIwMjAyMDIwNTIxRA0KLVMxMTgwNTU1NjU3Mzc1NkM3NDQxRkEwMDA0RDFGQ0ZGRkZGQUEwMjAyODAwM0M0M0ZBRkINCi1TMTE4MDU2QTAwMDREM0ZDMDAwMDAxRDY0NUZBMDAwNEQ1RkMwMDAwMDI1RTI2MEE1OEQyDQotUzExODA1N0Y4QUQwODg1NTgwMjIyODAwNTY2NjAwMDAyRTI0MDgyNjVBRDVCMEI4MDA4Rg0KLVMxMTgwNTk0QjVDMDZERjYyMjA5OTI4ODIxNDEwMDU2NDI4MTI2NDhEMjVCQjdDOTZEMkUNCi1TMTE4MDVBOUZBNDQ0MUQzNjgwMDVBMTIzQzAwMDE2MDAwMDAwNDQyNDExRjQxMDAwNDhCDQotUzExODA1QkUyRjY4MDAzNDAwMDYyRjQ5MDAwQTk2ODkyRjQzMDAwRTRFNzU0RTU2RkZDQw0KLVMxMTgwNUQzRjAyMDJFMDAwODQ3RkEwMDA0RDdGQzAwMDAwMUE2MjIwQjQxRkEwMDA0OUUNCi1TMTE4MDVFOEQxRkMwMDAwMDFCNjJENThGRkYwMkQ1OEZGRjQyRDU4RkZGODJENTBGRjkyDQotUzExODA1RkRGQzUzODA3NDA4QjQ4MDY1MDAwMTJDNDFGQTAwMDREMUZDMDAwMDAwMEVCQQ0KLVMxMTgwNjEyRDA4MDMwMzAwODAwNEVGQjAwMDIwMDEyMDAyMjAwMzIwMDQyMDA0ODAwREMNCi1TMTE4MDYyNzU4MDA2QzAwQTAwMERDNDFGQTAwMDREMUZDMDAwMDAxMTgyMDEwNjAwMEM1DQotUzExODA2M0MwMTAyNDdGQTAwMDREN0ZDMDAwMDAxMEMyMDBCNjAwMDAwRjI0MUZBMDBDNQ0KLVMxMTgwNjUxMDREMUZDMDAwMDAxMTAyMDEwNjAwMDAwRTIyMDAxNjAwMDAwREM0N0ZBOUUNCi1TMTE4MDY2NjAwMDREN0ZDMDAwMDAxMjAyMDBCNjAwMDAwQ0M0M0ZBMDAwNEQzRkMwMDFDDQotUzExODA2N0IwMDAwRkE0MUU5MDAwQzIwMTA2MDAwMDBCODI0MkVGRkY0NDdGQTAwMDQ2NA0KLVMxMTgwNjkwRDdGQzAwMDAwMEZFQjQ4QjY2MDAwMDEyNDdGQTAwMDREN0ZDMDAwMDAxQjANCi1TMTE4MDZBNTE0MjAwQjYwMDAwMDk0NDdGQTAwMDREN0ZDMDAwMDAxMEEyMDBCNjAwMDVCDQotUzExODA2QkEwMDg0NDFGQTAwMDREMUZDMDAwMDAwOEEyMDUwNDdGQTAwMDREN0ZDMDA4NQ0KLVMxMTgwNkNGMDAwMDgyQjFDQjY2MDAwMDEyNDdGQTAwMDREN0ZDMDAwMDAwRTAyMDBCNzkNCi1TMTE4MDZFNDYwMDAwMDU4NDdGQTAwMDREN0ZDMDAwMDAwRDIyMDBCNjAwMDAwNDg0MTQ3DQotUzExODA2RjlGQTAwMDREMUZDMDAwMDAwNEU0M0ZBMDAwNEQzRkMwMDAwMDAzRUIzRDBGRQ0KLVMxMTgwNzBFNjYwMDAwMTI0N0ZBMDAwNEQ3RkMwMDAwMDBBRTIwMEI2MDAwMDAxRTQ3QTQNCi1TMTE4MDcyM0ZBMDAwNEQ3RkMwMDAwMDBBNjIwMEI2MDAwMDAwRTQ3RkEwMDA0RDdGQzk1DQotUzExODA3MzgwMDAwMDA5ODIwMEI0RTVFNEU3NDAwMDQwMDAwNTM3NTZFNjUwMDAwMDBEOA0KLVMxMTgwNzREMDAwNzQ2NEY3NDc0NkYwMDAwMDAwMDAwMEEwMDAwMDAwQzUwNjU2QzZDRkQNCi1TMTE4MDc2MjY1MDAwMDAwMDc1RTUzNzQ2OTZFNjEwMDRCNjE3MjY5NkUwMDAwMDAwMEMwDQotUzExODA3NzcwNTAwMDAwNzY4MDAwMDAwMDMwMDAwMDc2RTUwNzU3NDc0NjUwMDRCNjFCRg0KLVMxMTgwNzhDNkM2QzY1MDA1Mzc0Njk2RTYxMzEwMDAwNEI2MTcyNjk2RTMxMDAwMDAwQzENCi1TMTE4MDdBMTAwMDAzMzAwMDAwNzkwMDAwMDAwMUYwMDAwMDc5ODc4Nzk3QTdBMDAwMEQyDQotUzExODA3QjY0RjZDNkM2NTAwMDAzNzAwMzgwMDUwNjU3NDY1NzIwMDUzNzY3NTZDNkMxOQ0KLVMxMTgwN0NCNkYwMDAwMzkwMDUzNkM3NTc0MDAwMDAwMDAwMDAwMDAwMDA3NEMwMDAwNzINCi1TMTE1MDdFMDA3NjQwMDAwMDc3ODAwMDAwNzgwMDAwMDA3QTQwMDAwMDdBQzM0DQotUzkwMzAwMDBGQw0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy92ZXJzYWRvcy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDJjMDY2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy92ZXJzYWRvcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXZlcnNhZG9zIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGxkIGNhbiByZWFkIHZlcnNhZG9zIGltYWdlcyBhbmQKLSMgZ2VuZXJhdGUgYmluYXJpZXMgd2hpY2ggYXJlIGlkZW50aWNhbCB0byB0aGUgY3VzdG9tZXIncwotIyBvbGQgbWV0aG9kLgotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgbGQgZ2VuZXJhdGVzIG5hdGl2ZSBleGVjdXRhYmxlcy4KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIG9uIDY4ayBjb2ZmIHRhcmdldHMKLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotaWYgeyAhW2lzdGFyZ2V0IG02OGstKi1jb2ZmKl0gfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotc2V0IHRlc3RuYW1lICJMRCBWRVJTQURPUyIKLQotCi1wcm9jIGluc3BlY3QgeyB3aGljaG9uZSB9IHsKLSAgICBnbG9iYWwgb2JqZHVtcAotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIHRlc3RuYW1lCi0KLSAgICBzZW5kX2xvZyAiJG9iamR1bXAgLXMgdG1wZGlyLyR3aGljaG9uZS5vdXQgPnRtcGRpci8kd2hpY2hvbmUuZHVtcFxuIgotICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC1zIHRtcGRpci8kd2hpY2hvbmUub3V0IHwgZ3JlcCAtdiBzcmVjID50bXBkaXIvJHdoaWNob25lLmR1bXAiIGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAkZXhlY19vdXRwdXQKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfQotCi0gICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1zICRzcmNkaXIvJHN1YmRpci8kd2hpY2hvbmUub29rID50bXBkaXIvJHdoaWNob25lLmRva1xuIgotICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC1zICRzcmNkaXIvJHN1YmRpci8kd2hpY2hvbmUub29rIHwgZ3JlcCAtdiBzcmVjID50bXBkaXIvJHdoaWNob25lLmRvayIgZXhlY19vdXRwdXQKLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICRleGVjX291dHB1dAotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICAjIGNvbXBhcmUgaXQgd2l0aCB0aGUgY29ycmVjdCBvdXRwdXQKLSAgICBjYXRjaCAiZXhlYyBkaWZmIHRtcGRpci8kd2hpY2hvbmUuZHVtcCB0bXBkaXIvJHdoaWNob25lLmRvayIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAkZXhlY19vdXRwdXQKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfQotCi0gICAgcmV0dXJuIDEKLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3QxLm91dCBcCi0JIiAtVCAkc3JjZGlyLyRzdWJkaXIvdDEubGQgJHNyY2Rpci8kc3ViZGlyL3QxLTEucm8gICRzcmNkaXIvJHN1YmRpci90MS0yLnJvIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19IGVsc2UgewotICAgICMgR2V0IGEgZHVtcCBvZiB3aGF0IHdlJ3ZlIGdvdCwgYW5kIHdoYXQgd2Ugc2hvdWxkIGhhdmUKLSAgICBpZiAhW2luc3BlY3QgdDFdIHsKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgIHRtcGRpci90Mi5vdXQgXAotCSIgLVQgJHNyY2Rpci8kc3ViZGlyL3QyLmxkICRzcmNkaXIvJHN1YmRpci90Mi0yLnJvIFwKLQkkc3JjZGlyLyRzdWJkaXIvdDItMS5ybyAgJHNyY2Rpci8kc3ViZGlyL3QyLTMucm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0gZWxzZSB7Ci0gICAgIyBHZXQgYSBkdW1wIG9mIHdoYXQgd2UndmUgZ290LCBhbmQgd2hhdCB3ZSBzaG91bGQgaGF2ZQotICAgIGlmICFbaW5zcGVjdCB0Ml0gewotCXJldHVybgotICAgIH0KLX0KLQotcGFzcyAkdGVzdG5hbWUKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9saWIvbGQtbGliLmV4cCBiL2xkL3Rlc3RzdWl0ZS9saWIvbGQtbGliLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTQ0Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotIwotIyBkZWZhdWx0X2xkX3ZlcnNpb24gCi0jCWV4dHJhY3QgYW5kIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsZAotIwotcHJvYyBkZWZhdWx0X2xkX3ZlcnNpb24geyBsZCB9IHsKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBpZiB7IFt3aGljaCAkbGRdID09IDAgfSB0aGVuIHsKLQlwZXJyb3IgIiRsZCBkb2VzIG5vdCBleGlzdCIKLQlleGl0IDEKLSAgICB9Ci0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkIC0tdmVyc2lvbiIgdG1wCi0gICAgc2V0IHRtcCBbcHJ1bmVfd2FybmluZ3MgJHRtcF0KLSAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgJHRtcCB2ZXJzaW9uIGN5ZyBudW1iZXIKLSAgICBpZiBbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKLQljbG9uZV9vdXRwdXQgIiRsZCAkbnVtYmVyXG4iCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfcmVsb2NhdGUgCi0jCWxpbmsgYW4gb2JqZWN0IHVzaW5nIHJlbG9jYXRpb24KLSMKLXByb2MgZGVmYXVsdF9sZF9yZWxvY2F0ZSB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotICAgIGdsb2JhbCBIT1NUSU5HX0VNVQotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICAKLSAgICBpZiB7IFt3aGljaCAkbGRdID09IDAgfSB0aGVuIHsKLQlwZXJyb3IgIiRsZCBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLSAgICAKLSAgICB2ZXJib3NlIC1sb2cgIiRsZCAkSE9TVElOR19FTVUgLW8gJHRhcmdldCAtciAkb2JqZWN0cyIKLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgJEhPU1RJTkdfRU1VIC1vICR0YXJnZXQgLXIgJG9iamVjdHMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotIyBMb29rIGZvciBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gc3dpdGNoZXMgaW4gdGhlIG11bHRsaWIKLSMgb3B0aW9ucyBhbmQgdHJhbnNsYXRlIHRoZXNlIGludG8gYSAtRUIgb3IgLUVMIHN3aXRjaC4gIE5vdGUKLSMgd2UgY2Fubm90IHJlbHkgdXBvbiBwcm9jIHByb2Nlc3NfbXVsdGlsaWJfb3B0aW9ucyB0byBkbyB0aGlzCi0jIGZvciB1cyBiZWNhdXNlIGZvciBzb21lIHRhcmdldHMgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQKLSMgLUVCLy1FTCBidXQgaXQgZG9lcyBzdXBwb3J0IC1tYmlnLWVuZGlhbi8tbWxpdHRsZS1lbmRpYW4sIGFuZAotIyB0aGUgc2l0ZS5leHAgZmlsZSB3aWxsIGluY2x1ZGUgdGhlIHN3aXRjaCAiLW1iaWctZW5kaWFuIgotIyAocmF0aGVyIHRoYW4gImJpZy1lbmRpYW4iKSB3aGljaCBpcyBub3QgZGV0ZWN0ZWQgYnkgcHJvYwotIyBwcm9jZXNzX211bHRpbGliX29wdGlvbnMuCi0KLXByb2MgYmlnX29yX2xpdHRsZV9lbmRpYW4ge30gewotICAgIAotICAgIGlmIFtib2FyZF9pbmZvIFt0YXJnZXRfaW5mbyBuYW1lXSBleGlzdHMgbXVsdGlsaWJfZmxhZ3NdIHsKLQlzZXQgdG1wX2ZsYWdzICIgW2JvYXJkX2luZm8gW3RhcmdldF9pbmZvIG5hbWVdIG11bHRpbGliX2ZsYWdzXSI7Ci0KLQlmb3JlYWNoIHggJHRtcF9mbGFncyB7Ci0JICAgIGNhc2UgJHggaW4gewotCQl7KmJpZyplbmRpYW4gZWIgRUJ9IHsKLQkJICAgIHNldCBmbGFncyAiIC1FQiIKLQkJICAgIHJldHVybiAkZmxhZ3MKLQkJfQotCQl7KmxpdHRsZSplbmRpYW4gZWwgRUx9IHsKLQkJICAgIHNldCBmbGFncyAiIC1FTCIKLQkJICAgIHJldHVybiAkZmxhZ3MKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHNldCBmbGFncyAiIgotICAgIHJldHVybiAkZmxhZ3MKLX0KLQotIwotIyBkZWZhdWx0X2xkX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkCi0jCi1wcm9jIGRlZmF1bHRfbGRfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotICAgIGdsb2JhbCBIT1NUSU5HX0VNVQotICAgIGdsb2JhbCBIT1NUSU5HX0NSVDAKLSAgICBnbG9iYWwgSE9TVElOR19MSUJTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIHNldCBvYmpzICIkSE9TVElOR19DUlQwICRvYmplY3RzIgotICAgIHNldCBsaWJzICIkSE9TVElOR19MSUJTIgotICAgIAotICAgIGlmIHsgW3doaWNoICRsZF0gPT0gMCB9IHRoZW4gewotCXBlcnJvciAiJGxkIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotICAgIAotICAgIHNldCBmbGFncyBbYmlnX29yX2xpdHRsZV9lbmRpYW5dCi0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgJEhPU1RJTkdfRU1VICRmbGFncyAtbyAkdGFyZ2V0ICRvYmpzICRsaWJzIgotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAkSE9TVElOR19FTVUgJGZsYWdzIC1vICR0YXJnZXQgJG9ianMgJGxpYnMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotIwotIyBkZWZhdWx0X2xkX3NpbXBsZV9saW5rIAotIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZCwgd2l0aG91dCBpbmNsdWRpbmcgYW55IGxpYnJhcmllcwotIwotcHJvYyBkZWZhdWx0X2xkX3NpbXBsZV9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIGlmIHsgW3doaWNoICRsZF0gPT0gMCB9IHRoZW4gewotCXBlcnJvciAiJGxkIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotICAgIAotICAgIHNldCBmbGFncyBbYmlnX29yX2xpdHRsZV9lbmRpYW5dCi0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgJGZsYWdzIC1vICR0YXJnZXQgJG9iamVjdHMiCi0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkICRmbGFncyAtbyAkdGFyZ2V0ICRvYmplY3RzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgIyBXZSBkb24ndCBjYXJlIGlmIHdlIGdldCBhIHdhcm5pbmcgYWJvdXQgYSBub24tZXhpc3RlbnQgc3RhcnQKLSAgICAjIHN5bWJvbCwgc2luY2UgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdCBtaWdodCB1c2UgRU5UUlkuCi0gICAgcmVnc3ViIC1hbGwgIihefFxuKShcW15cblxdKjogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9jb21waWxlIAotIwljb21waWxlIGFuIG9iamVjdCB1c2luZyBjYwotIwotcHJvYyBkZWZhdWx0X2xkX2NvbXBpbGUgeyBjYyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBDRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgZ2NjX2dhc19mbGFnCi0KLSAgICBzZXQgY2NfcHJvZyAkY2MKLSAgICBpZiB7W2xsZW5ndGggJGNjX3Byb2ddID4gMX0gdGhlbiB7Ci0Jc2V0IGNjX3Byb2cgW2xpbmRleCAkY2NfcHJvZyAwXQotICAgIH0KLSAgICBpZiB7W3doaWNoICRjY19wcm9nXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRjY19wcm9nIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG9iamVjdCIgZXhlY19vdXRwdXQKLQotICAgIHNldCBmbGFncyAiLUkkc3JjZGlyLyRzdWJkaXIgJENGTEFHUyIKLQotICAgICMgSWYgd2UgYXJlIGNvbXBpbGluZyB3aXRoIGdjYywgd2Ugd2FudCB0byBhZGQgZ2NjX2dhc19mbGFnIHRvCi0gICAgIyBmbGFncy4gIFJhdGhlciB0aGFuIGRldGVybWluZSB0aGlzIGluIHNvbWUgY29tcGxleCB3YXksIHdlIGd1ZXNzCi0gICAgIyBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIuCi0gICAgaWYge1tzdHJpbmcgbWF0Y2ggIipnY2MqIiAkY2NdIHx8IFtzdHJpbmcgbWF0Y2ggIiorKyoiICRjY119IHRoZW4gewotCXNldCBmbGFncyAiJGdjY19nYXNfZmxhZyAkZmxhZ3MiCi0gICAgfQotCi0gICAgaWYgW2JvYXJkX2luZm8gW3RhcmdldF9pbmZvIG5hbWVdIGV4aXN0cyBtdWx0aWxpYl9mbGFnc10gewotCWFwcGVuZCBmbGFncyAiIFtib2FyZF9pbmZvIFt0YXJnZXRfaW5mbyBuYW1lXSBtdWx0aWxpYl9mbGFnc10iOwotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJGNjICRmbGFncyAtYyAkc291cmNlIC1vICRvYmplY3QiCi0KLSAgICBjYXRjaCAiZXhlYyAkY2MgJGZsYWdzIC1jICRzb3VyY2UgLW8gJG9iamVjdCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JaWYgeyFbZmlsZSBleGlzdHMgJG9iamVjdF19IHRoZW4gewotCSAgICByZWdleHAgIi4qLyhcW14vXF0qKSQiICRzb3VyY2UgYWxsIGRvYmoKLQkgICAgcmVnc3ViICJcXC5jIiAkZG9iaiAiLm8iIHJlYWxvYmoKLQkgICAgdmVyYm9zZSAibG9va2luZyBmb3IgJHJlYWxvYmoiCi0JICAgIGlmIHtbZmlsZSBleGlzdHMgJHJlYWxvYmpdfSB0aGVuIHsKLQkJdmVyYm9zZSAtbG9nICJtdiAkcmVhbG9iaiAkb2JqZWN0IgotCQljYXRjaCAiZXhlYyBtdiAkcmVhbG9iaiAkb2JqZWN0IiBleGVjX291dHB1dAotCQlzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQkJaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCQkgICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JCSAgICBwZXJyb3IgImNvdWxkIG5vdCBtb3ZlICRyZWFsb2JqIHRvICRvYmplY3QiCi0JCSAgICByZXR1cm4gMAotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCXBlcnJvciAiJG9iamVjdCBub3QgZm91bmQgYWZ0ZXIgY29tcGlsYXRpb24iCi0JCXJldHVybiAwCi0JICAgIH0KLQl9Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXBlcnJvciAiJHNvdXJjZTogY29tcGlsYXRpb24gZmFpbGVkIgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGRlZmF1bHRfbGRfYXNzZW1ibGUgeyBhcyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIGlmIHtbd2hpY2ggJGFzXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRhcyBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgQVNGTEFHU10geyBzZXQgQVNGTEFHUyAiIiB9Ci0KLSAgICBzZXQgZmxhZ3MgW2JpZ19vcl9saXR0bGVfZW5kaWFuXQotCi0gICAgdmVyYm9zZSAtbG9nICIkYXMgJGZsYWdzICRBU0ZMQUdTIC1vICRvYmplY3QgJHNvdXJjZSIKLQotICAgIGNhdGNoICJleGVjICRhcyAkZmxhZ3MgJEFTRkxBR1MgLW8gJG9iamVjdCAkc291cmNlIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkc291cmNlOiBhc3NlbWJseSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9ubQotIwlydW4gbm0gb24gYSBmaWxlLCBwdXR0aW5nIHRoZSByZXN1bHQgaW4gdGhlIGFycmF5IG5tX291dHB1dAotIwotcHJvYyBkZWZhdWx0X2xkX25tIHsgbm0gb2JqZWN0IH0gewotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIG5tX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGlmIHtbd2hpY2ggJG5tXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRubSBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0XX0gewotICAgICAgdW5zZXQgbm1fb3V0cHV0Ci0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB7IHNldCBOTUZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG5tICROTUZMQUdTICRvYmplY3QgPnRtcGRpci9ubS5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkbm0gJE5NRkxBR1MgJG9iamVjdCA+dG1wZGlyL25tLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0Jc2V0IGZpbGUgW29wZW4gdG1wZGlyL25tLm91dCByXQotCXdoaWxlIHsgW2dldHMgJGZpbGUgbGluZV0gIT0gLTEgfSB7Ci0JICAgIHZlcmJvc2UgIiRsaW5lIiAyCi0JICAgIGlmIFtyZWdleHAgIl4oXFswLTlhLWZBLUZcXSspIFxbYS16QS1aMC05XF0gKC4rKSQiICRsaW5lIHdob2xlIHZhbHVlIG5hbWVdIHsKLSAgICAgICAgICAgICAgICBzZXQgbmFtZSBbc3RyaW5nIHRyaW1sZWZ0ICRuYW1lICJfIl0KLQkJdmVyYm9zZSAiU2V0dGluZyBubV9vdXRwdXQoJG5hbWUpIHRvIDB4JHZhbHVlIiAyCi0JCXNldCBubV9vdXRwdXQoJG5hbWUpIDB4JHZhbHVlCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGUKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkb2JqZWN0OiBubSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgc2ltcGxlX2RpZmYKLSMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQotIwlyZXR1cm5zIGRpZmZlcmVuY2VzIGlmIGV4aXN0Ci0jCXJldHVybnMgbnVsbCBpZiBmaWxlKHMpIGNhbm5vdCBiZSBvcGVuZWQKLSMKLXByb2Mgc2ltcGxlX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0gewotICAgIGdsb2JhbCB0YXJnZXQKLQkKLSAgICBzZXQgZW9mIC0xCi0gICAgc2V0IGRpZmZlcmVuY2VzIDAKLSAgICAKLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7Ci0Jc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCi0gICAgfSBlbHNlIHsKLQl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIAotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8yXSB0aGVuIHsKLQlzZXQgZmlsZV9iIFtvcGVuICRmaWxlXzIgcl0KLSAgICB9IGVsc2UgewotCWZhaWwgIiRmaWxlXzIgZG9lc24ndCBleGlzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAiIyBEaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yXG4iIDIKLSAgICAKLSAgICB3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKLQlpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCSAgICBjb250aW51ZQotCX0gZWxzZSB7Ci0JICAgIGxhcHBlbmQgbGlzdF9hICRsaW5lCi0JfQotICAgIH0KLSAgICBjbG9zZSAkZmlsZV9hCi0gICAgCi0gICAgd2hpbGUgeyBbZ2V0cyAkZmlsZV9iIGxpbmVdICE9ICRlb2YgfSB7Ci0JaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkgICAgY29udGludWUKLQl9IGVsc2UgewotCSAgICBsYXBwZW5kIGxpc3RfYiAkbGluZQotCX0KLSAgICB9Ci0gICAgY2xvc2UgJGZpbGVfYgotCi0gICAgZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBpIH0gewotCXNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRpXQotCXNldCBsaW5lX2IgW2xpbmRleCAkbGlzdF9iICRpXQotCi0JdmVyYm9zZSAiXHQkZmlsZV8xOiAkaTogJGxpbmVfYVxuIiAzCi0JdmVyYm9zZSAiXHQkZmlsZV8yOiAkaTogJGxpbmVfYlxuIiAzCi0JaWYgW3N0cmluZyBjb21wYXJlICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiXHQkZmlsZV8xOiAkaTogJGxpbmVfYVxuIgotCSAgICB2ZXJib3NlIC1sb2cgIlx0JGZpbGVfMjogJGk6ICRsaW5lX2JcbiIKLQotCSAgICBmYWlsICJUZXN0OiAkdGFyZ2V0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIAotICAgIGlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7Ci0JZmFpbCAiVGVzdDogJHRhcmdldCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAkZGlmZmVyZW5jZXM8MSB0aGVuIHsKLQlwYXNzICJUZXN0OiAkdGFyZ2V0IgotICAgIH0KLX0KLQotIyBUaGlzIGRlZmluaXRpb24gaXMgdGFrZW4gZnJvbSBhbiB1bnJlbGVhc2VkIHZlcnNpb24gb2YgRGVqYUdudS4gIE9uY2UKLSMgdGhhdCB2ZXJzaW9uIGdldHMgcmVsZWFzZWQsIGFuZCBoYXMgYmVlbiBvdXQgaW4gdGhlIHdvcmxkIGZvciBhIGZldwotIyBtb250aHMgYXQgbGVhc3QsIGl0IG1heSBiZSBzYWZlIHRvIGRlbGV0ZSB0aGlzIGNvcHkuCi1pZiAhW3N0cmluZyBsZW5ndGggW2luZm8gcHJvYyBwcnVuZV93YXJuaW5nc11dIHsKLSAgICAjCi0gICAgIyBwcnVuZV93YXJuaW5ncyAtLSBkZWxldGUgdmFyaW91cyBzeXN0ZW0gdmVyYm9zaXRpZXMgZnJvbSBURVhUCi0gICAgIwotICAgICMgQW4gZXhhbXBsZSBpczoKLSAgICAjIGxkLnNvOiB3YXJuaW5nOiAvdXNyL2xpYi9saWJjLnNvLjEuOC4xIGhhcyBvbGRlciByZXZpc2lvbiB0aGFuIGV4cGVjdGVkIDkKLSAgICAjCi0gICAgIyBTaXRlcyB3aXRoIHBhcnRpY3VsYXIgdmVyYm9zZSBvcydzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gc2l0ZS5leHAuCi0gICAgIwotICAgIHByb2MgcHJ1bmVfd2FybmluZ3MgeyB0ZXh0IH0gewotCSMgVGhpcyBpcyBmcm9tIHN1bjQncy4gIERvIGl0IGZvciBhbGwgbWFjaGluZXMgZm9yIG5vdy4KLQkjIFRoZSAiXFwxIiBpcyB0byB0cnkgdG8gcHJlc2VydmUgYSAiXG4iIGJ1dCBvbmx5IGlmIG5lY2Vzc2FyeS4KLQlyZWdzdWIgLWFsbCAiKF58XG4pKGxkLnNvOiB3YXJuaW5nOlxbXlxuXF0qXG4/KSsiICR0ZXh0ICJcXDEiIHRleHQKLQotCSMgSXQgbWlnaHQgYmUgdGVtcHRpbmcgdG8gZ2V0IGNhcnJpZWQgYXdheSBhbmQgZGVsZXRlIGJsYW5rIGxpbmVzLCBldGMuCi0JIyBKdXN0IGRlbGV0ZSAqZXhhY3RseSogd2hhdCB3ZSdyZSBhc2sgdG8sIGFuZCB0aGF0J3MgaXQuCi0JcmV0dXJuICR0ZXh0Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L0NPUFlJTkcuTElCIGIvbGliaWJlcnR5L0NPUFlJTkcuTElCCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFhM2QxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9DT1BZSU5HLkxJQgorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVtUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IEdQTC4gIEl0IGlzCi0gbnVtYmVyZWQgMiBiZWNhdXNlIGl0IGdvZXMgd2l0aCB2ZXJzaW9uIDIgb2YgdGhlIG9yZGluYXJ5IEdQTC5dCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCi1mcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCi0KLSAgVGhpcyBsaWNlbnNlLCB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKLXNwZWNpYWxseSBkZXNpZ25hdGVkIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSwgYW5kIHRvIGFueQotb3RoZXIgbGlicmFyaWVzIHdob3NlIGF1dGhvcnMgZGVjaWRlIHRvIHVzZSBpdC4gIFlvdSBjYW4gdXNlIGl0IGZvcgoteW91ciBsaWJyYXJpZXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZgoteW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCi1vciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCi15b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCi1jb2RlLiAgSWYgeW91IGxpbmsgYSBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKLWNvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cyBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCi13aXRoIHRoZSBsaWJyYXJ5LCBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKLWl0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgotCi0gIE91ciBtZXRob2Qgb2YgcHJvdGVjdGluZyB5b3VyIHJpZ2h0cyBoYXMgdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0Ci10aGUgbGlicmFyeSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAotcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCi0KLSAgQWxzbywgZm9yIGVhY2ggZGlzdHJpYnV0b3IncyBwcm90ZWN0aW9uLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLWxpYnJhcnkuICBJZiB0aGUgbGlicmFyeSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwKLXZlcnNpb24sIHNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24KLXRoZSBvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KLQwKLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCBjb21wYW5pZXMgZGlzdHJpYnV0aW5nIGZyZWUKLXNvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIHRodXMgaW4gZWZmZWN0Ci10cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gIFRvIHByZXZlbnQgdGhpcywKLXdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncwotZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gIFRoaXMKLWxpY2Vuc2UsIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4KLWRlc2lnbmF0ZWQgbGlicmFyaWVzLiAgVGhpcyBsaWNlbnNlIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeQotb25lOyBiZSBzdXJlIHRvIHJlYWQgaXQgaW4gZnVsbCwgYW5kIGRvbid0IGFzc3VtZSB0aGF0IGFueXRoaW5nIGluIGl0IGlzCi10aGUgc2FtZSBhcyBpbiB0aGUgb3JkaW5hcnkgbGljZW5zZS4KLQotICBUaGUgcmVhc29uIHdlIGhhdmUgYSBzZXBhcmF0ZSBwdWJsaWMgbGljZW5zZSBmb3Igc29tZSBsaWJyYXJpZXMgaXMgdGhhdAotdGhleSBibHVyIHRoZSBkaXN0aW5jdGlvbiB3ZSB1c3VhbGx5IG1ha2UgYmV0d2VlbiBtb2RpZnlpbmcgb3IgYWRkaW5nIHRvIGEKLXByb2dyYW0gYW5kIHNpbXBseSB1c2luZyBpdC4gIExpbmtpbmcgYSBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5LCB3aXRob3V0Ci1jaGFuZ2luZyB0aGUgbGlicmFyeSwgaXMgaW4gc29tZSBzZW5zZSBzaW1wbHkgdXNpbmcgdGhlIGxpYnJhcnksIGFuZCBpcwotYW5hbG9nb3VzIHRvIHJ1bm5pbmcgYSB1dGlsaXR5IHByb2dyYW0gb3IgYXBwbGljYXRpb24gcHJvZ3JhbS4gIEhvd2V2ZXIsIGluCi1hIHRleHR1YWwgYW5kIGxlZ2FsIHNlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhCi1kZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXRyZWF0cyBpdCBhcyBzdWNoLgotCi0gIEJlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUKLXNoYXJpbmcsIGJlY2F1c2UgbW9zdCBkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuICBXZQotY29uY2x1ZGVkIHRoYXQgd2Vha2VyIGNvbmRpdGlvbnMgbWlnaHQgcHJvbW90ZSBzaGFyaW5nIGJldHRlci4KLQotICBIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZQotdXNlcnMgb2YgdGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlCi1saWJyYXJpZXMgdGhlbXNlbHZlcy4gIFRoaXMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCi1wZXJtaXQgZGV2ZWxvcGVycyBvZiBub24tZnJlZSBwcm9ncmFtcyB0byB1c2UgZnJlZSBsaWJyYXJpZXMsIHdoaWxlCi1wcmVzZXJ2aW5nIHlvdXIgZnJlZWRvbSBhcyBhIHVzZXIgb2Ygc3VjaCBwcm9ncmFtcyB0byBjaGFuZ2UgdGhlIGZyZWUKLWxpYnJhcmllcyB0aGF0IGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlbS4gIChXZSBoYXZlIG5vdCBzZWVuIGhvdyB0byBhY2hpZXZlCi10aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSBoYXZlIGFjaGlldmVkIGl0IGFzIHJlZ2FyZHMKLWNoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlIExpYnJhcnkuKSAgVGhlIGhvcGUgaXMgdGhhdCB0aGlzCi13aWxsIGxlYWQgdG8gZmFzdGVyIGRldmVsb3BtZW50IG9mIGZyZWUgbGlicmFyaWVzLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKLSJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCi1mb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoaWxlIHRoZSBsYXR0ZXIgb25seQotd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgbGlicmFyeS4KLQotICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgbGlicmFyeSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByYXRoZXIgdGhhbiBieSB0aGlzIHNwZWNpYWwgb25lLgotDAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSB3aGljaAotY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yIG90aGVyIGF1dGhvcml6ZWQKLXBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGlicmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLiAgRWFjaCBsaWNlbnNlZSBpcwotYWRkcmVzc2VkIGFzICJ5b3UiLgotCi0gIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKLXByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwotKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KLQotICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawotd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKLWNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCi1wb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCi1zdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCi1pbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQotCi0gICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAotaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCi1hbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLSAgCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0MCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLQwKLSAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgotdGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKLXN1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCi0KLSAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCi10aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCi0KLSAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKLWRlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCi11bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKLWl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKLW11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgotCi0gIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci1mcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQotc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCi1kaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCi1MaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCi1saW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQotd29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAotdGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5Ci1jcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKLWNvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCi1saWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KLVNlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgotCi0gIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCi10aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKLWRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgotV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKLWxpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCi10aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgotCi0gIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCi1zdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKLWZ1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKLWZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKLXdvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCi1MaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQotCi0gIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5Ci1kaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KLUFueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAotd2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgotDAotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tcGlsZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGMpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZCkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5Ci1kaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotDAotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotDAotICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKLXBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKLWFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAotYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCi1zbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKLWV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCi13cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKLXZlcnNpb25zIG9mIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0MCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLSAgICAgQXBwZW5kaXg6IEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKLWV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZwotcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi1vcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KLQotICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCi1zYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCi0iY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCi0gICAgTUEgMDIxMTEtMTMwNywgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L0NoYW5nZUxvZyBiL2xpYmliZXJ0eS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzJmMWYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDMyNzggKzAsMCBAQAotMTk5OS0wOC0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGZsb2F0Zm9ybWF0LmM6IEFkZCBjYXN0cyB0byBhdm9pZCBzaWduZWQvdW5zaWduZWQgd2FybmluZ3MuCi0JKiBwZXhlY3V0ZS5jOiBBZGQgQVRUUklCVVRFX1VOVVNFRCBhcyBuZWVkZWQgb24gVW5peC4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxfdG9fbGliZGlyKTogQ2hhbmdlICQoVEFSR0VUTElCKS5uIHRvCi0JJChUQVJHRVRMSUIpbiBzbyBpdCB3b3JrcyBvbiBNU0RPUy4KLQkoaW5zdGFsbF90b190b29sZGlyKTogTGlrZXdpc2UuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBNYXJrIEVsYnJlY2h0OgotCSogbWFrZWZpbGUuZG9zOiBSZW1vdmU7IG9ic29sZXRlLgotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0xNCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXJndi5jOiBJbmNsdWRlIHN0ZGxpYi5oIGFuZCBzdHJpbmcuaCBpbnN0ZWFkIG9mCi0JcHJvdG90eXBpbmcgZGlyZWN0bHkuCi0JKiBjaG9vc2UtdGVtcC5jOiBDb25kaXRpb25hbGx5IGluY2x1ZGUgc3RyaW5nLmguCi0KLTE5OTktMDctMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfaW5zZXJ0KTogQWRkIGluaXRpYWxpemF0aW9uIHRvIGF2b2lkCi0Jd2FybmluZy4KLQotMTk5OS0wNS0xMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAobWFpbik6IFVzZSB0YWJsZSBsb29rdXAgdG8gZGlzdGluZ3Vpc2ggaWRlbnRpZmllcgotCWNoYXJhY3RlcnMgZnJvbSBub24taWRlbnRpZmllciBjaGFyYWN0ZXJzLgotCShzdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQsIGhwX3N5bWJvbF9hbHBoYWJldCk6IE5ldyBmdW5jdGlvbnMuCi0KLVRodSBNYXkgIDYgMjA6MzQ6NDIgMTk5OSAgRnJlZCBGaXNoICA8Zm5mQGJlLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzeXMvcmVzb3VyY2UuaCk6IEFkZCB0byBBQ19DSEVDS19IRUFERVJTIGxpc3QuCi0JKiBnZXRydW50aW1lLmM6IE9ubHkgYXR0ZW1wdCB0byBpbmNsdWRlIHN5cy9yZXNvdXJjZS5oIGFuZAotCXVzZSBnZXRydXNhZ2UgaWYgYm90aCBIQVZFX0dFVFJVU0FHRSBhbmQgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCWFyZSBkZWZpbmVkLgotCi0xOTk5LTA0LTIwICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQlGaXggZnJvbSBEYWxlIEhhd2tpbnM6Ci0JKiBjcGx1cy1kZW0uYyAobW9wX3VwKTogU2V0IHR5cGV2ZWNfc2l6ZSB0byB6ZXJvLCBzbyBpdCdsbCBiZSAKLQlyZWFsbG9jYXRlZCBwcm9wZXJseSBpZiB3ZSB1c2UgaXQgYWdhaW4uCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBDaGVjayBmb3IgYnVmZmVyIG92ZXJydW4uICBCZQotCXN0cmljdGVyIGFib3V0IHN5bnRheC4gIEFsd2F5cyBudWxsLXRlcm1pbmF0ZSBzdHJpbmcuCi0KLQlGaXggZnJvbSBNYXJjdXMgRGFuaWVsczoKLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBEb24ndCBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlCi0JaWRlbnRpZmllciBsb29raW5nIGZvciBhbm90aGVyIHVuZGVyc2NvcmUuCi0KLVRodSBBcHIgMTUgMjM6MDA6NTUgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY2hlY2tmdW5jcyk6IENoZWNrIGZvciBzYnJrLgotCSogY29uZmlnLmluOiBSZWJ1aWx0LgotCSogY29uZmlndXJlOiBMaWtld2lzZS4KLQkqIHhtYWxsb2MuYzogVXNlIEhBVkVfU0JSSyBpbnN0ZWFkIG9mIHRoZSBob3N0IHNwZWNpZmljIGRlZmluaXRpb25zLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbGxvY2EtY29uZi5oIChhbGxvY2EpIFtDX0FMTE9DQV06IERvbid0IHVzZSBHY2MgYnVpbHRpbgotCW9yIDxhbGxvY2EuaD4uCi0JKiBjbG9jay5jIChHTlVfSFopOiBOZXcgZGVmaW5pdGlvbi4KLQkoY2xvY2spOiBVc2UgaXQuCi0JKiBnZXRydW50aW1lLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcudGFibGU6IFVzZSBtaC1iZW9zLgotCSogY29uZmlnL21oLWJlb3M6IE5ldyBmaWxlLgotCi0xOTk5LTA0LTAxICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+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+Ci0JbWFjcm9zLCBub3QgPHZhcmFyZ3MuaD4gbWFjcm9zLgotCSogc3BhY2VzLmMgKHNwYWNlcyk6IE1ha2UgcmV0dXJuIHR5cGUgY29uc3QuICBEb24ndCBjcmFzaCBpZgotCW1hbGxvYyByZXR1cm5zIE5VTEwuCi0JKiBzdHJlcnJvci5jIChzdHJ1Y3QgZXJyb3JfaW5mbyk6IE1ha2UgbmFtZSBhbmQgbXNnIGZpZWxkcyBjb25zdC4KLQkoZXJyb3JfbmFtZXMpOiBNYWtlIGNvbnN0LgotCShzdHJlcnJubyk6IE1ha2UgY29uc3QuCi0JKHN0cnRvZXJybm8pOiBNYWtlIGFyZ3VtZW50IGNvbnN0LgotCSogc3Ryc2lnbmFsLmMgKHN0cnVjdCBzaWduYWxfaW5mbyk6IE1ha2UgbmFtZSBhbmQgbXNnIGZpZWxkcwotCWNvbnN0LgotCShzaWduYWxfbmFtZXMsIHN5c19zaWdsaXN0KTogTWFrZSBjb25zdC4KLQkoc3Ryc2lnbmFsLCBzdHJzaWdubyk6IE1ha2UgY29uc3QuCi0JKHN0cnRvc2lnbm8pOiBNYWtlIGFyZ3VtZW50IGNvbnN0LgotCSogeGF0ZXhpdC5jOiBEZWNsYXJlIHBhcmFtZXRlciB0eXBlcy4KLQkqIHhtYWxsb2MuYyAobmFtZSk6IE1ha2UgY29uc3QuCi0JKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IE1ha2UgYXJndW1lbnQgY29uc3QuCi0JKiBNYWtlZmlsZS5pbiAoSU5DRElSKTogRGVmaW5lLgotCSguYy5vKTogVXNlICQoSU5DRElSKS4KLQkoZHVtbXkubyk6IExpa2V3aXNlLgotCShhcmd2Lm8sIGJhc2VuYW1lLm8pOiBOZXcgdGFyZ2V0czsgZGVwZW5kIG9uIGxpYmliZXJ0eS5oLgotCShjb25jYXQubywgZmRtYXRjaC5vLCBnZXRydW50aW1lLm8sIHNwYWNlcy5vKTogTGlrZXdpc2UuCi0JKHN0cmVycm9yLm8sIHN0cnNpZ25hbC5vLCB4YXRleGl0Lm8sIHhleGl0Lm8pOiBMaWtld2lzZS4KLQkoeG1hbGxvYy5vKTogTGlrZXdpc2UuCi0JKGNwbHVzLWRlbS5vKTogTmV3IHRhcmdldDsgZGVwZW5kIG9uIGRlbWFuZ2xlLmguCi0JKGdldG9wdC5vLCBnZXRvcHQxLm8pOiBOZXcgdGFyZ2V0czsgZGVwZW5kIG9uIGdldG9wdC5oLgotCShpZWVlLWZsb2F0Lm8pOiBOZXcgdGFyZ2V0OyBkZXBlbmQgb24gaWVlZS1mbG9hdC5oLgotCShvYnN0YWNrLm8pOiBOZXcgdGFyZ2V0OyBkZXBlbmQgb24gb2JzdGFjay5oLgotCi1UdWUgRmViICA4IDA1OjI5OjA4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUhhbmRsZSBvYnN0YWNrX2NodW5rX2FsbG9jIHJldHVybmluZyBOVUxMLiAgVGhpcyBhbGxvd3MKLQlvYnN0YWNrcyB0byBiZSB1c2VkIGJ5IGxpYnJhcmllcywgd2l0aG91dCBmb3JjaW5nIHRoZW0KLQl0byBjYWxsIGV4aXQgb3IgbG9uZ2ptcC4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW4sIF9vYnN0YWNrX2JlZ2luXzEsIF9vYnN0YWNrX25ld2NodW5rKToKLQlJZiBDQUxMX0NIVU5LRlVOIHJldHVybnMgTlVMTCwgc2V0IGFsbG9jX2ZhaWxlZCwgZWxzZSBjbGVhciBpdC4KLQkoX29ic3RhY2tfYmVnaW4sIF9vYnN0YWNrX2JlZ2luXzEpOiBSZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCAwIGlmIG5vdC4KLQotVHVlIEZlYiAgOCAwMDozMjoyOCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmNhdC5jLCBpZWVlLWZsb2F0LmM6ICBJbmNsdWRlIDxzdHJpbmcuaD4uCi0KLVN1biBGZWIgIDYgMjE6Mjg6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoeG1hbGxvYywgeHJlYWxsb2MpOiBJbmNsdWRlIHRoZSBuYW1lIGluIHRoZSBlcnJvciBtZXNzYWdlLCBpZiBzZXQuCi0KLQkqIFJlcGxhY2UgYXRleGl0LmMgd2l0aCB4YXRleGl0LmMuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKSwgZnVuY3Rpb25zLmRlZjogQ2hhbmdlIHJlZmVyZW5jZXMuCi0KLVNhdCBGZWIgIDUgMTQ6MDI6MzIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBnZXRydW50aW1lLmMgKGdldF9ydW5fdGltZSk6IFVzZSBnZXRydXNhZ2Ugb3IgdGltZXMgaWYKLQlIQVZFX0dFVFJVU0FHRSBvciBIQVZFX1RJTUVTIGFyZSBkZWZpbmVkLgotCi1GcmkgRmViICA0IDE1OjQ5OjM4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXRleGl0LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyksIGZ1bmN0aW9ucy5kZWY6IEFkZCBpdC4KLQkqIHhleGl0LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUywgUkVRVUlSRURfT0ZJTEVTKTogQWRkIGl0LgotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IENhbGwgeGV4aXQgaW5zdGVhZCBvZiBleGl0LgotCUNoYW5nZSByZXF1ZXN0IGZvciAwIGJ5dGVzIGludG8gcmVxdWVzdCBmb3IgMSBieXRlLgotCi1XZWQgRmViICAyIDExOjM2OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IFByaW50IHNpemUgdXNpbmcgJWx1LCBhbmQgY2FzdCB0bwotCXVuc2lnbmVkIGxvbmcsIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1GcmkgSmFuIDI4IDE3OjQ5OjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGR1bW15LmM6IERvbid0IGluY2x1ZGUgdGltZS5oIGV2ZXI7IGFsd2F5cyBkZWZpbmUgY2xvY2tfdCBhcwotCSJ1bnNpZ25lZCBsb25nIi4gIFVudGlsIGdjYy9maXhpbmNsdWRlcyBlbnN1cmVzIHRoYXQgY2xvY2tfdAotCWV4aXN0cywgX19TVERDX18gaXNuJ3QgYSBzdWZmaWNpZW50IHRlc3QuICBBbmQgaWYgY2xvY2soKSBkb2Vzbid0Ci0JZXhpc3QsIGNsb2NrX3QgcHJvYmFibHkgZG9lc24ndCBlaXRoZXIuCi0KLU1vbiBKYW4gMjQgMTE6NTI6MzEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjbG9jay5jLCBnZXRydW50aW1lLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgdG8gZmlsZSBsaXN0cy4KLQkqIGZ1bmN0aW9ucy5kZWYgKGNsb2NrKTogQWRkIHRvIGxpc3QuCi0JKiBkdW1teS5jICh0aW1lLmgpOiBBZGQgaWYgX19TVERDX18uCi0JKGNsb2NrX3QpOiAjZGVmaW5lIGFzICJ1bnNpZ25lZCBsb25nIiBpZiBub3QgX19TVERDX18uCi0KLVR1ZSBKYW4gMTEgMTE6Mjc6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdHJ0b2QuYzogRGVjbGFyZSBhdG9mLiAgRnJvbSBlZGxlckBqYW4udWx0cmEubnl1LmVkdSAoSmFuCi0JRWRsZXIpLgotCi1UdWUgRGVjIDI4IDE0OjE3OjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVycm9ycyk6IFVzZSBDRkxBR1MgYXMgd2VsbCBhcyBMREZMQUdTIHdoZW4KLQlsaW5raW5nLgotCi1GcmkgRGVjIDE3IDEyOjI2OjA3IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IE5ldyBmdW5jdGlvbi4gIENvbW1vbiBjb2RlCi0JZm9yIEFSTSB0ZW1wbGF0ZSBkZW1hbmdsaW5nLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiBVc2UgZGVtYW5nbGVfYXJtX3B0LgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IExpa2V3aXNlLgotCi1UdWUgTm92IDMwIDE1OjQ3OjQ4IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQWRkIENPTlNUIHRvIHBsZWFzZSBnY2MuCi0KLVNhdCBOb3YgMjcgMTE6MDU6NTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gdG9tQGJhc2lsLmljY2UucnVnLm5sIChUb20gUi5IYWdlbWFuKQotCSogc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6ICBBcyBhIHNtYWxsIHNwYWNlIG9wdGltaXphdGlvbiwgZG9uJ3QKLQlpbmNsdWRlIG1lc3NhZ2VzIHdoZW4gdGhleSBhcmVuJ3QgYWN0dWFsbHkgdXNlZC4KLQotCU1lcmdlIGNoYW5nZXMgZnJvbSB0YWtlZml2ZS5jby5hdCFqb2UgKEpvc2VmIExlaGVyYmF1ZXIpCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4LCBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lLAotCWNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6ICBGaXhlcyBmb3Igc3lzdGVtcyB3aGVyZSBjcGx1c19tYXJrZXIKLQlpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiAnJCcuCi0KLUZyaSBOb3YgMjYgMTM6NTE6MTEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHdhaXRwaWQuYzogIFNpbXBsZS1taW5kZWQgYXBwcm9jaW1hdGlvbiB0byB3YWl0cGlkCi0JdXNpbmcgdmFuaWxsYSB3YWl0LgotCSogZnVuY3Rpb25zLmRlZiwgTWFrZWZpbGUuaW46ICBVcGRhdGUgYWNjb3JkaW5nbHksCi0KLVRodSBOb3YgMTggMTg6MDE6MTUgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyhkZW1hbmdsZV90ZW1wbGF0ZSk6IGZpeCBidWcgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgotCXdpdGggdmFsdWUgb2YgdXNlciBkZWZpbmVkIHR5cGUuCi0KLVdlZCBOb3YgMTcgMTg6MzA6MjEgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyhjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBhZGQgdGhlIHN1YmplY3QgbmV3IGZ1bmN0aW9uCi0JdG8gc3VwcG9ydCB1bmlmaWVkIHNlYXJjaCBvZiBvcGVyYXRvciBpbiBjbGFzcy4KLQotV2VkIE5vdiAxMCAwOTo0NzoyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogc3RydG91bC5jIChzdHJ0b3VsKTogdXNlICIoZGlnaXQgPSAqcykgIT0gJ1wwJyIgbm90IGp1c3QKLQkiZGlnaXQgPSAqcyIgYXMgY29uZGl0aW9uIGluIHdoaWxlIGxvb3AuCi0KLVR1ZSBOb3YgIDkgMTU6NTI6MjIgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgU0hFTEwgdG8gcmVjdXJzaXZlIG1ha2UKLQotVGh1IE5vdiAgNCAxMjowOToyNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogdmZwcmludGYuYywgdnByaW50Zi5jLCB2c3ByaW50Zi5jOiAgTWFrZSBmb3JtYXQgYXJnCi0JYmUgKGNvbnN0IGNoYXIqKSwgZm9yIEFOU0kgKGFuZCBnY2Mgdy9maXhwcm90bykgY29uc2lzdGVuY3kuCi0KLVRodSBOb3YgIDQgMDg6Mjk6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogTWFrZSAqLSotaGl1eCogdXNlIG1oLWhwdXguCi0KLUZyaSBPY3QgMjIgMDc6NTM6MTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVHVlIE9jdCAxOSAxNzoxMjowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBlbnN1cmUgdGhhdCBvYmplY3QgZmlsZSBuYW1lcyBhcmUKLQkgIG5vdCBkdXBsaWNhdGVkLCBhcyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgb2JqZWN0IGZpbGUgaW4KLQkgIGEgbGlicmFyeSBjYXVzZXMgcHJvYmxlbXMgb24gc29tZSBtYWNoaW5lcwotCi1Nb24gT2N0IDE4IDIxOjU5OjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdHJjYXNlY21wLmMsIHN0cm5jYXNlY21wLmM6IENoYW5nZSB1X2NoYXIgdG8gdW5zaWduZWQgY2hhci4KLQotRnJpIE9jdCAxNSAyMjoxNzoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0cm5jYXNlY21wLmM6IG5ldyBmaWxlLCBpbXBsZW1lbnRzIHN0cm5jYXNlY21wCi0JKiBzdHJjYXNlY21wLmM6IG5ldyBmaWxlLCBpbXBsZW1lbnQgc3RyY2FzZWNtcAotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogbGlzdCB0aGVzZSB0d28gbmV3IHNvdXJjZSBmaWxlcwotCi0JKiBmdW5jdGlvbnMuZGVmOiBhZGQgc3RyY2FzZWNtcCBhbmQgc3RybmNhc2VjbXAgZW50cmllcwotCi1GcmkgT2N0IDE1IDE0OjUzOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3RydG91bC5jIChzdHJ0b3VsKSwgc3RydG9sLmMgKHN0cnRvbCk6IEhhbmRsZSBvdmVyZmxvdwotCWFjY29yZGluZyB0byBBTlNJIEMuCi0KLVRodSBPY3QgMTQgMTY6MzQ6MTkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogYWRkIHN1cHBvcnQgb2YgQVJNIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yLAotCWFuZCAnRycgZm9yIHBhc3NpbmcgcmVjb3JkIG9yIHVuaW9uIGluIHBhcmFtZXRlci4KLQotV2VkIE9jdCAxMyAxMzozNjoxOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEZpeCBjb21tZW50IHRvIGNsYXJpZnkgdGhhdCBzdHVmZiBpbiBSRVFVSVJFRF9PRklMRVMKLQlzaG91bGQgbm90IGJlIGluIGZ1bmN0aW9ucy5kZWYuCi0KLVdlZCBPY3QgMTMgMTM6MTM6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBmdW5jdGlvbnMuZGVmOiBSZW1vdmVkIHhtYWxsb2MuICBTdHVmZiBpbiBSRVFVSVJFRF9PRklMRVMgc2hvdWxkCi0Jbm90IGJlIGluIGZ1bmN0aW9ucy5kZWYuCi0KLU1vbiBPY3QgIDQgMTg6MjY6MzkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogY2hhbmdlIGdsb2JsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdG8gcHJvcGVyIG5hbWUKLQotVHVlIFNlcCAyOCAxODoxMTowNyAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBmaXggYnVnIGluIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKLQotVHVlIFNlcCAyOCAxNjoyMDo0OSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBzdXBwb3J0IGJvdGggb2xkIGFuZCBuZXcgX3Z0JC4uLiB2dGJsIG1hbmdsZWQgbmFtZXMKLQotRnJpIFNlcCAyNCAxOTowNzoxNiAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IEZpeCBkZW1hbmdsZV90ZW1wbGF0ZSBwcm90b3R5cGUKLQotRnJpIFNlcCAyNCAxNzozMjo1NSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBmaXggdGVtcGxhdGUgZGVtYW5nbGluZwotCSogY3BsdXMtZGVtLmM6IGZpeCBjb25zdCB0eXBlIGRlbWFuZ2xpbmcKLQkqIGNwbHVzLWRlbS5jOiBmaXggY29uc3RydWN0b3IvZGVzdHJ1Y3RvciwgdmlydHVhbCB0YWJsZSwKLQlxdWFsaWZpZXIsIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGRlbWFuZ2xpbmcKLQotV2VkIFNlcCAgMSAyMzoxMzoxMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMsIHN0cmVycm9yLmM6IFVzZSBmdWxseS1icmFja2V0ZWQgaW5pdGlhbGl6ZXIgdG8KLQlrZWVwIGdjYyAtV2FsbCBoYXBweS4KLQotRnJpIEF1ZyAyNyAxMDozMDowOSAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBBZGQgQ09OU1RTIHRvIG1ha2UgZ2NjIGhhcHB5IHdpdGggbGFzdAotCXBhdGNoLgotCi1GcmkgQXVnIDI3IDExOjI0OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JUGF0Y2ggZnJvbSBQYXVsIEZsaW5kZXJzOgotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBEZWFsIHdpdGggYXJyYXlzLgotCi1UdWUgQXVnIDI0IDE0OjIzOjUwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkOiBEZWFsIHdpdGggR05VIGZvcm1hdCBmb3IgbW9yZQotCXRoYW4gOSBjbGFzc2VzLgotCi1XZWQgQXVnIDE4IDE5OjUwOjI5IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZHVtbXkubyk6IFJlZGlyZWN0IHRvIC9kZXYvbnVsbCB0byBhdm9pZCAidmFyaWFibGUKLQlub3QgaW5pdGlhbGl6ZWQiIHdhcm5pbmdzIHVuZGVyIEhQL1VYCi0KLVN1biBBdWcgMTUgMjA6NDI6NDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0cmVycm9yLmM6IE1vdmUgaW5jbHVkZSBvZiBzdGRpby5oIGFmdGVyIHN5c19lcnJsaXN0ICNkZWZpbmUuCi0JQWxzbyByZW1vdmUgTlVMTCBkZWZpbml0aW9uIChzdGRpby5oIGFsd2F5cyBkZWZpbmVzIE5VTEwsIHNvIGl0Ci0JbmV2ZXIgZGlkIGFueXRoaW5nIGJ1dCBjbHV0dGVyIHVwIHRoZSBjb2RlKS4KLQotU2F0IEF1ZyAxNCAxNDoyMTo0OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiBoYW5kbGUgeG1hbGxvYy5jCi0KLQkqIHhtYWxsb2MuYzogcHJvdmlkZSB4bWFsbG9jIGFuZCB4cmVhbGxvYyBmdW5jdGlvbnMKLQotVGh1IEF1ZyAxMiAxNzozODo1NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBGaXggYSBjb21tZW50LgotCi1TYXQgQXVnICA3IDEzOjU2OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0MS5jOiBEZWNsYXJlIGNvbnN0IHRoZSB3YXkgZ2V0b3B0LmMgZG9lcy4KLQotRnJpIEF1ZyAgNiAxNzowMzoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYywgYWxsb2NhLmM6IFVwZGF0ZSBmcm9tIEZTRi4KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmM6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9uLCB3aGljaAotCWRvZXNuJ3QgdXNlIGFsbG9jYS4KLQotVHVlIEp1bCAyNyAxNDowMzo1NyAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkZW1hbmdsZSk6IEFkZCB0aGUgdGFyZ2V0IHdpdGggYSBtZXNzYWdlIHNheWluZwotCXdoZXJlIGRlbWFuZ2xlIHdlbnQuCi0KLU1vbiBKdWwgMjYgMTU6NDk6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgb2Jzb2xldGUgYGRlbWFuZ2xlJyB0YXJnZXQuCi0KLVRodSBKdWwgMjIgMDg6MzE6MDEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChhcm1fc3BlY2lhbCk6ICBBcHBseSBwYXRjaCBmcm9tIGFyZ0BsdWNpZC5jb20gdG8KLQlhdm9pZCBpbmZpbml0ZSBsb29wIG9uIHZ0Ymwgc3ltYm9scyB3aXRoIGRpc2FtYmlndWF0aW5nICJqdW5rIgotCXRhY2tlZCBvbiB0aGUgZW5kLgotCi1Nb24gSnVsIDE5IDE0OjEwOjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmM6IHdvcmsgYXJvdW5kIHNvbWUgc3lzdGVtcyBsb3NpbmcgZGVmaW5pdGlvbnMgb2YKLQlzeXNfc2lnbGlzdAotCi0JKiBjb25maWcvbWgtbHlueG9zOiB0aGlzIHN5c3RlbSBoYXMgYSBsb3NpbmcgZGVmaW5pdGlvbiBvZgotCXN5c19zaWdsaXN0Ci0KLQkqIGNvbmZpZy50YWJsZTogdXNlIG1oLWx5bnhvcyBmb3IgKi0qLWx5bnhvcwotCi1Nb24gSnVsIDE5IDE3OjA4OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiBBZGQgc3VwcG9ydCBmb3IgSFBQQSBCU0QgaG9zdHMuCi0KLQkqIGNvbmZpZy9taC1ocGJzZDogTmV3IGZpbGUuCi0KLU1vbiBKdWwgMTIgMTg6MDA6NDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogbWFrZSB3b3JrIHdoZW4gc3JjZGlyICE9IG9iamRpci4KLQotU3VuIEp1biAyNyAxNTozNTozMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChtYWluKTogQWRkIGxvbmcgb3B0aW9ucywgaW5jbHVkaW5nIC0taGVscCBhbmQKLQktLXZlcnNpb24uCi0JKHVzYWdlKTogTmV3IGZ1bmN0aW9uIGZyb20gY29kZSBpbiBtYWluLgotCi1UdWUgSnVuIDIyIDExOjM3OjM4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6ICBOZXcgc2hlbGwgc2NpcHQsIHNvdXJjZWQgYnkgYm90aCAuL2NvbmZpZ3VyZSxpbgotCWFuZCAuLi94aWJlcnR5L2NvbmZpZ3VyZS5pbiwgdG8gYXZvaWQgbWFpbnRhaW5hbmNlIGxvc3NhZ2VzLgotCSogY29uZmlndXJlLmluIGFuZCAuLi94aWJlcnR5L2NvbmZpZ3VyZS5pbjogIFVzZSBjb25maWcudGFibGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIG1oLWFpeCBmb3IgQUlYIDMuMiwgb25seSBmb3IgMy4xLgotCSogY29uZmlndXJlLmluOiBNYXAgKi0qLWlyaXgqIChleGNlcHQgaXJpeDQpIHRvIG1oLXN5c3YuCi0JKiAuLi94aWJlcnR5L2NvbmZpZ3VyZS5pbjogIFVwZGF0ZSBmcm9tIC4vY29uZmlndXJlLmluLgotCi1UdWUgSnVuIDE1IDE3OjA1OjMxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydAotCi1XZWQgTWF5IDI2IDEyOjU5OjA5IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKHhyZWFsbG9jKTogIE1hdGNoIGRlZmluaXRpb24gd2l0aCBwcm90b3R5cGUuCi0KLVR1ZSBNYXkgMjUgMTQ6Mjc6NTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogIERlbWFuZ2xlIGNmcm9udAotCWxvY2FsIHZhcmlhYmxlcyBhcyBhbiBleHRlbnNpb24gdG8gQVJNIGRlbWFuZ2xpbmcuCi0KLUZyaSBNYXkgMjEgMDk6NTM6NTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuYzogRG9uJ3QgcmVxdWlyZSBwb2ludGVycyB0byBkb3VibGUgdG8gYmUgYWxpZ25lZC4KLQotVHVlIE1heSAxOCAxNzoxMjoxMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotICAgICAgICAobWVyZ2UgY2hhbmdlcyBmcm9tIGRsb25nQGNzZS51Y3NjLmVkdSkKLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogIFNpbXBsaWZ5LgotCSogY3BsdXMtZGVtLmMgKGFybV9wdCwgZGVtYW5nbGVfY2xhc3NfbmFtZSk6ICBOZXcgZnVuY3Rpb25zLgotCSogY3BsdXMtZGVtLmMgKHZhcmlvdXMpOiAgQ2FsbHMgdG8gYXJtX3B0LCBkZW1hbmdsZV9jbGFzc19uYW1lLgotCi0JKiBjcGx1cy1kZW0uYyAoeG1hbGxvYywgeHJlYWxsb2MsIHN0cnN0cik6ICBNYWtlIGV4dGVybiBkZWNscyBpbnRvCi0JZnVsbCBwcm90b3R5cGVzLgotCSogY3BsdXMtZGVtLmMgKGZyZWUpOiAgQWRkIHByb3RvdHlwZS4KLQkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogIEZ1bGx5IGJyYWNrZXRpemUgaW5pdGlhbGl6ZXIuCi0KLUZyaSBNYXkgMTQgMTc6MTM6MDUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgV2hldGhlciBpbml0aWFsIHVuZGVyc2NvcmVzIGFyZSBzdHJpcHBlZAotCWRlcGVuZHMgb24gdGhlIGV4dGVybmFsIHZhcmlhYmxlIHByZXBlbmRzX3VuZGVyc2NvcmUKLQkod2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IHRoZSBiaW51dGlscyBNYWtlZmlsZSkuCi0KLUZyaSBNYXkgMTQgMDc6MzI6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChtb3BfdXAsIGFybV9zcGVjaWFsKTogUmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KLQotVHVlIE1heSAgNCAyMDozMTo1OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGNvbnN1bWVfY291bnQpOiAgUmV0dXJuIHplcm8gaWYgYXJnIGRvZXMgbm90Ci0Jc3RhcnQgd2l0aCBkaWdpdCwgYW5kIGRvbid0IGNvbnN1bWUgYW55IGlucHV0LgotCi1UdWUgTWF5ICA0IDA4OjEwOjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBVc2UgJHtzcmNkaXJ9IG5vdCAkXi4KLQotCSogc3RydG9kLmM6IE5ldyBmaWxlLCBuZWVkZWQgYXQgbGVhc3QgZm9yIEJTRCA0LjMuCi0KLVN1biBNYXkgIDIgMTE6MzA6NDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jIChzeXNfc2lnbGlzdCk6ICBGb3IgQU5TSSBjb21waWxhdGlvbnMsIHR5cGUgaXMKLQkiY29uc3QgY2hhciAqY29uc3QiLiAgQWxzbyByZW1vdmUgY29uZGl0aW9uYWxpemF0aW9uIG9uIF9fU1REQ19fCi0Jc2luY2UgY29uc3QgaXMgZGVmaW5lZCBhd2F5IGZvciBub24tQU5TSS4KLQotV2VkIEFwciAyOCAxOToyOTo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgKi0qLWhwdXguCi0JKiBjb25maWcvbWgtaHB1eDogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMjcgMTU6MjI6MTkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHRtcG5hbS5jOiAgQWRkZWQgQU5TSSB0bXBuYW0oKSBmdW5jdGlvbi4KLQkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgVXBkYXRlIGFjY29yZGluZ2x5LgotCi1UdWUgQXByIDI3IDEzOjM4OjM4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUpOiBHZXQgdGhlIGRlbWFuZ2xpbmcgb2YKLQlzdG9wX18xQSByaWdodC4KLQotRnJpIEFwciAxNiAyMzo0ODoyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY2FsdmluKQotCi0JKiBjcGx1cy1kZW0uYzogRGVjbGFyZSBzdHJzdHIgcmV0dXJuIHR5cGUuCi0KLUZyaSBNYXIgMjYgMTI6MDE6MjYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jOiBBZGQgc29tZSBBSVggc2lnbmFscy4KLQotVGh1IE1hciAyNSAxNToxNzoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCi1XZWQgTWFyIDI0IDAxOjU5OjI1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayAmIGR2aSB0YXJnZXRzCi0KLVRodSBNYXIgMTggMTQ6MDU6NDQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0LmM6ICBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9nZGIgKHNpbmNlIGl0IGlzCi0JbmVlZGVkIGJ5IC4uL29wY29kZS9tNjhrLWRpcy5jKS4KLQotVHVlIE1hciAgMiAxNzo0NzozMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGNmcm9udCB3aXRoIEFSTS4KLQotRnJpIEZlYiAyNiAwMDoxNzowNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgRml4IG1haW4gcHJvZ3JhbSAod2hlbiBjb21waWxlZCB3aXRoIC1ETUFJTikKLQl0byBiZSBtb3JlIHVzZWZ1bCBhcyBhIGZpbHRlci4KLQotU2F0IEZlYiAyMCAyMTo0MTozOSAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsX3RvX2xpYmRpciwgaW5zdGFsbF90b190b29sZGlyKTogR28gaW50byB0aGUKLQlkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgJChSQU5MSUIpLCBpbiBjYXNlIHRoYXQKLQlwcm9ncmFtIHRyaWVzIHRvIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIHBhcnQgb2YKLQlpdHMgd29yay4KLQotVGh1IEZlYiAxOCAyMzowMDoxOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMgKHN5c19zaWdsaXN0KTogIFJlbW92ZSB5ZXQgYW5vdGhlciAqJV4mJSYkIyAiY29uc3QiCi0JYmVjYXVzZSBCU0QgNC40IGxhY2tzIG9uZS4gIElzbid0IHRoaXMgZnVuPwotCi1UaHUgRmViIDE4IDExOjI0OjI1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIFNldCBmdW5jX2RvbmUgYWZ0ZXIKLQlkZW1hbmdsaW5nIGEgdGVtcGxhdGUuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiAgRml4IHNldmVyYWwgc21hbGwgYnVncwotCWluIGRlbWFuZ2xpbmcgR05VIHN0eWxlIHRlbXBsYXRlcy4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiAgRml4IGZvciB0ZW1wbGF0ZXMgaW4gR05VCi0Jc3R5bGUgY29uc3RydWN0b3JzLgotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogIEZpeCBmb3IgdGVtcGxhdGVzIGluIEdOVSBzdHlsZQotCXN0YXRpYyBkYXRhIG1lbWJlcnMuCi0KLVR1ZSBGZWIgMTYgMTc6Mjg6MzUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiAgTW9kaWZ5IHRvIGluY2x1ZGUgdHlwZQotCW1vZGlmaWVycyBsaWtlIHN0YXRpYyBhbmQgY29uc3QgaW4gcmVtZW1iZXJlZCB0eXBlcy4KLQotVGh1IEZlYiAxMSAyMjoyMDo0NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlZF9xdWFsaWZpZWQpOiAgQWRkIG5ldyBwYXJhbWV0ZXIgdGhhdCB0ZWxscwotCXdoZXRoZXIgdG8gcHJlcGVuZCBvciBhcHBlbmQgdGhlIHF1YWxpZmllcnMuCi0JKiBjcGx1cy1kZW0uYyAoc3RyaW5nX3ByZXBlbmRzKTogIFVzZWQgbm93LCByZW1vdmUgI2lmIDAuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIENhbGwgZGVtYW5nbGVfcXVhbGlmaWVkCi0Jd2l0aCBwcmVwZW5kaW5nLgotCSogY3BsdXNfZGVtLmMgKGdudV9zcGVjaWFsKTogIFJlY29nbml6ZSBzdGF0aWMgZGF0YSBtZW1iZXJzIHRoYXQKLQl1c2UgcXVhbGlmaWVkIG5hbWVzLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6ICBBY2N1bXVsYXRlIHF1YWxpZmllcnMgaW4gYQotCXRlbXBvcmFyeSBidWZmZXIgYW5kIHRoZSBwcmVwZW5kIG9yIGFwcGVuZCB0aGVtIHRvIHRoZSByZXN1bHQsCi0JYXMgc3BlY2lmaWVkIGJ5IHRoZSBuZXcgImFwcGVuZCIgZmxhZy4KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogIENhbGwgZGVtYW5nbGVkX3F1YWxpZmllZCB3aXRoCi0JYXBwZW5kaW5nLgotCi1Nb24gRGVjIDI4IDEwOjQ3OjE5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYyAoc2lnbmFsX3RhYmxlKTogTm93IGNvbnN0LgotCShpbml0X3NpZ25hbF90YWJsZXMpOiBWYXJpYWJsZSBlaXAgbm93IHBvaW50cyB0byBjb25zdC4KLQotCSogc3RyZXJyb3IuYyAoZXJyb3JfdGFibGUpOiBOb3cgY29uc3QuCi0JKGluaXRfZXJyb3JfdGFibGVzKTogVmFyaWFibGUgZWlwIG5vdyBwb2ludHMgdG8gY29uc3QuCi0KLVR1ZSBEZWMgMTUgMTU6MzY6NTAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG1lbWNoci5jIChtZW1jaHIpOiAgTmV3IChBTlNJIHN0YW5kYXJkKSBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiAgQWRkZWQgbWVtY2hyLgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogVXNlIHJjIGluc3RhZCBvZiBub24tc3RhbmRhcmQgY3EuCi0KLVdlZCBEZWMgIDIgMjI6NDk6MTAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogcmVtb3ZlIHVzZSBvZiBVU0cgYXJvdW5kIDxhbGxvY2EuaD4sIHdoaWNoIG5ldmVyIG1lYW50Ci0JYW55dGhpbmcgYW55d2F5Ci0KLQkqIGNvbmZpZy9taC17YWl4LGFwb2xsbzY4LG5jcjMwMDAsc3lzdixzeXN2NH06IHJlbW92ZWQgZGVmaW5pdGlvbnMKLQlvZiBVU0cgYW5kIFVTR3I0Ci0KLVRodSBOb3YgMTkgMDM6MDk6MzMgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogUmVjb2duaXplIGB3JywgYSB3aWRlIGNoYXJhY3RlcjsKLQlpdCdzIG5vdyBhIHR5cGUgYWNjb3JkaW5nIHRvIHRoZSBBTlNJIFgzSjE2IHdvcmtpbmcgcGFwZXI7IG91dHB1dAotCSJ3Y2hhcl90IiBmb3IgaXQuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlKTogQWNjZXB0IGB3JyBhcyBhbiBpbnRlZ3JhbCB0eXBlLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IFVzZSBgY2hhciAqJywgbm90IGBQVFInLiAgQ2FzdCBjYWxscyB0byB0aGVpcgotCWNvdW50ZXJwYXJ0cyBtYWxsb2MgYW5kIHJlYWxsb2MgdG8gYGNoYXIgKicuCi0JKG1haW4pOiBFeGl0IHdpdGggYSAwIHN0YXR1cy4KLQkqIE1ha2VmaWxlLmluIChkZW1hbmdsZSk6IERvbid0IGV4cGVjdCB0aGUgdXNlciB0byBkZWZpbmUKLQlERU1BTkdMRSwgaW5zdGVhZCBmb3JjZSB0byBiZSBjcGx1cy1kZW0uYy4gIExvb2sgaW4gJChzcmNkaXIpLy4uL2luY2x1ZGUKLQlmb3IgZGVtYW5nbGUuaC4gIFBhc3MgaXQgYW55IEhERUZJTkVTIG9yIFhUUkFGTEFHUy4KLQotV2VkIE5vdiAxOCAxODo1NjoyMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogIEF2b2lkIHZlcmJvc2l0eS4KLQkqIGNvbmZpZy9taC1zeXN2NDogIFJlbW92ZSBBUl9GTEFHUyBvdmVycmlkZSwgdXNlIElOU1RBTEw9Y3AsCi0JcmVwbGFjZSBVU0dyNCB3aXRoIEhBVkVfU1lTQ09ORi4KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiAgUmVtb3ZlOyBtaC1zeXN2NCB3b3JrcyBub3cuCi0JKiBnZXRwYWdlc2l6ZS5jOiAgUmVwbGFjZSBVU0dyNCB3aXRoIEhBVkVfU1lTQ09ORi4KLQkqIGNvbmZpZ3VyZS5pbjogIFNpbXBsaWZ5IGhvc3QgbWF0Y2hpbmcgdGFibGUsIHJlbW92ZSBzZXBhcmF0ZQotCXNvbGFyaXMgY29uZmlnIGZpbGUuCi0KLVN1biBOb3YgMTUgMDk6MzU6MTYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNvbGFyaXMyKik6ICBBZGQsIHVzZSBtaC1zeXN2NC4KLQotVHVlIE5vdiAgMyAyMToyNzowMyAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBBZGQgZGVjbHMuCi0JKHJlbWVtYmVyX3R5cGUpOiBEb24ndCBjYXN0IHhtYWxsb2MuCi0JKHN0cmluZ19uZWVkKTogTGlrZXdpc2U7IGRvbid0IGNhc3QgeHJlYWxsb2MgZWl0aGVyLgotCi1GcmkgT2N0IDIzIDA4OjUyOjAxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWZzLCByZW5hbWUuYzogYWRkZWQgc2ltcGxlCi0JaW1wbGVtZW50YXRpb24gb2YgcmVuYW1lLCBzaW5jZSBzb21lIGJpbnV0aWxzIHByb2dyYW1zIHVzZSBpdC4KLQotVGh1IE9jdCAxNSAxNToxODoyMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmM6ICBBZGQgYXBwcm9wcmlhdGUgJ2NvbnN0JyB0byBzeXNfc2lnbGlzdAotCWV4dGVybiBkZWNsYXJhdGlvbiAoaWYgX19TVERDX18pLiAgKE5lZWRlZCBmb3IgTGludXguKQotCSogc3Ryc2lnbmFsLmMgKHN0cnNpZ25hbCk6IEFkZCBjYXN0IHRvIHJlbW92ZSBjb25zdC1uZXNzLgotCi1GcmkgT2N0ICA5IDAzOjIyOjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobmVlZGVkLmF3aywgbmVlZGVkMi5hd2spOiAgUmVtb3ZlIGVycm9uZW91cyBcJ3MKLQliZWZvcmUgIidzLCBkaWFnbm9zZWQgYnkgQlNEIDQuNCBhd2suCi0KLVRodSBPY3QgIDggMTU6MjU6MTIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY3JlYXRlIGNvbmZpZy5oIGFuZCBuZWVkZWQtbGlzdCB0aHJvdWdoICQoQ09ORklHX0gpCi0JYW5kICQoTkVFREVEX0xJU1QpLCB0byBnaXZlIHNvbWUgaG9va3MgZm9yIHhpYmVydHkuCi0KLVRodSBPY3QgIDEgMjM6MzE6NDIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBjcHUtdmVuZG9yLXRyaXBsZSBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcwotCi1XZWQgU2VwIDMwIDExOjI2OjU5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyZ3YuYywgYmFzZW5hbWUuYywgYmNtcC5jLCBiY29weS5jLCBiemVyby5jLAotCWNvbmNhdC5jLCBjcGx1cy1kZW0uYywgZmRtYXRjaC5jLCBnZXRjd2QuYywgZ2V0b3B0LmMsIGdldG9wdDEuYywKLQlnZXRwYWdlc2l6ZS5jLCBpbnNxdWUuYywgbWVtY21wLmMsIG1lbWNweS5jLCBtZW1tb3ZlLmMsIG1lbXNldC5jLAotCW9ic3RhY2suYywgc2lnc2V0bWFzay5jLCBzcGFjZXMuYywgc3RyY2hyLmMsIHN0cmVycm9yLmMsCi0Jc3RycmNoci5jLCBzdHJzaWduYWwuYywgc3Ryc3RyLmMsIHZmb3JrLmMsIHZzcHJpbnRmLmM6Ci0JQ29udmVydCBmcm9tIHVzaW5nIEdQTCB0byBMR1BMLgotCi1TYXQgU2VwIDI2IDA0OjAxOjMwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZXJyb3JzKTogIExlYXZlIGR1bW15Lm8gYW5kIGR1bW15IGFyb3VuZCBzbyB0aGF0Ci0Jd2UgY2FuIHNlZSBob3cgdGhlIG5lZWRlZCBsaXN0IHdhcyBnZW5lcmF0ZWQgKGl0J3Mgc29tZXRpbWVzIHdyb25nKS4KLQkobW9zdGx5Y2xlYW4pOiAgUmVtb3ZlIHRoZW0uCi0KLU1vbiBTZXAgMjEgMTQ6NTA6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBnZXRjd2QuYzogc3VwcGx5IGEgZGVmYXVsdCBpZiBNQVhQQVRITEVOIGlzIG5vdCBkZWZpbmVkLgotCi0JKiBjb25maWcvbWgtaXJpeDQ6IHNldCBFWFRSQV9PRklMRVMgdG8gYWxsb2NhLm8sIGZyb20gV1JTLgotCi1XZWQgU2VwICA5IDEyOjQxOjQ4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFVzZSBYVFJBRkxBR1Mgd2hlbiBjb21waWxpbmcsIHNvIHRoYXQgeGliZXJ0eSB3b3JrcwotCXdoZW4gY3Jvc3MtY29tcGlsaW5nLgotCi1UaHUgU2VwICAzIDEzOjI5OjM5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IChkZW1hbmdsZV9wcmVmaXgpOiByZWR1Y3Rpb24gaW4gc3RyZW5ndGggb2Ygc3Ryc3RyCi0JICBhcyBhIHRpbWUgb3B0aW1pemF0aW9uLgotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiByZW1vdmUgc3RycGJyayB0ZXN0LiAgQXBwZWFycyB0bwotCSAgYmUgbW9yZSBleHBlbnNpdmUgdGhhbiBzaW1wbHkgZGVtYW5nbGluZy4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX21hdGNoKTogbmV3IGZ1bmN0aW9uLgotCi1UdWUgU2VwICAxIDE1OjI0OjA0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICAjaW5jbHVkZSA8c3RkaW8uaD4sIHRvIGRlZmluZSBOVUxMLgotCURlZmluZSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUuCi0KLVN1biBBdWcgMzAgMTc6NTg6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIE5ldyBmaWxlLCBtb3ZlZCBmcm9tIC4uL2dkYi4KLQkqIGNwbHVzLWRlbS5jIChzZXRfY3BsdXNfbWFya2VyX2Zvcl9kZW1hbmdsaW5nKTogIE5ldyBleHBvcnRlZAotCWZ1bmN0aW9uLCB0byBhdm9pZCBjb21waWxpbmcgaW4gdGFyZ2V0LWRlcGVuZGVuY3kgZm9yIENQTFVTX01BUktFUi4KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZSk6ICBBbGxvdyBkZW1hbmdsaW5nIHN0eWxlIG9wdGlvbgotCXRvIGJlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciwgYnV0IHVzaW5nIHRoZSBnbG9iYWwgdmFyaWFibGUKLQljdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgYXMgYSBkZWZhdWx0LgotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZm9yIGNwbHVzLWRlbS5jCi0KLVNhdCBBdWcgMjkgMTA6NDQ6MDkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIE1lcmdlIGluIGNvbW1lbnQgY2hhbmdlcyBmcm9tIEZTRiB2ZXJzaW9uLiAgTm93Ci0JbWF0Y2hlcyB0aGUgRlNGIHZlcnNpb24gZXhhY3RseS4KLQotRnJpIEF1ZyAyOCAxODozOTowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChDQUxMX0ZSRUVGVU4pOiAgQ2FuJ3QgdXNlID86IHdpdGggdm9pZCB2YWx1ZXMgKGF0Ci0JbGVhc3Qgb24gbG9zaW5nIERFQ3N0YXRpb25zISk7IHVzZSBpZi10aGVuLWVsc2UgaW5zdGVhZC4KLQotV2VkIEF1ZyAxOSAxNDo0MDozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotTW9uIEF1ZyAxMCAxNzozMzo0MCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLSAgICAgICAqIE1ha2VmaWxlLmluOiBjbGVhbiB1cCBkZWZpbml0aW9uIG9mIENGSUxFUywgbW9yZSBjb21tZW50cwotCi1TYXQgQXVnICA4IDIzOjEwOjU5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYyAobXlfaW5kZXgpOiAgTWFrZSBmaXJzdCBhcmcgY29uc3QgdG8gbWF0Y2ggc3RyY2hyLAotCXdoaWNoIGl0IHNvbWV0aW1lcyBpcyByZW1hcHBlZCB0by4KLQotU2F0IEF1ZyAgMSAxMzo0ODo1MCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChERUZBVUxUX0FMSUdOTUVOVCk6ICBVcGRhdGUgdG8gbWF0Y2ggRlNGIHZlcnNpb24uCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luKTogIEluaXRpYWxpemUgdXNlX2V4dHJhX2FyZy4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW5fMSk6ICBOZXcsIGZyb20gRlNGIHZlcnNpb24uCi0KLU1vbiBKdWwgMjAgMjE6MDc6NTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoQ0FMTF9DSEVDS0ZVTiwgQ0FMTF9GUkVFRlVOKTogIFVzZSB1c2VfZXh0cmFfYXJnIGFuZAotCWV4dHJhX2FyZy4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW4pOiAgUmVtb3ZlIGFyZWFfaWQgYW5kIGZsYWdzIGFyZ3VtZW50cwotCShwcmV2aW91c2x5IGFkZGVkIGZvciBtbWFsbG9jIHN1cHBvcnQsIGludGVyZmFjZSBoYXMgY2hhbmdlZCkuCi0JQWxzbyBjb252ZXJ0IGZsYWdzIHVzYWdlIHRvIHVzZSB1c2VfZXh0cmFfYXJnIGFuZCBtYXliZV9lbXB0eV9vYmplY3QuCi0KLUZyaSBKdWwgMTAgMDA6NDE6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIE1vdmUgZXhwYW5kYXJndiBpbmxpbmUgYW5kIGVsaW1pbmF0ZSBzdGF0aWMgdmFyaWFibGVzLgotCVJld3JpdGUgdG8gYWx3YXlzIGFsbG9jYXRlIGluIHBvd2VycyBvZiB0d28uICBGaXggdG8gcmV0dXJuIGFuCi0JYXJndiB3aXRoIGEgc2luZ2xlIG51bGwgc3RyaW5nIGFyZyBpZiBwYXNzZWQgYSBudWxsIHN0cmluZy4KLQotRnJpIEp1bCAgMyAyMDoyNzoyOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogcmFuZG9tLmMsIHNpZ3NldG1hc2suYywgc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6ICBSZW1vdmUKLQkiKHZvaWQpIiBjYXN0cyBmcm9tIGZ1bmN0aW9uIGNhbGxzIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMKLQlpZ25vcmVkLCBpbiBhY2NvcmRhbmNlIHdpdGggR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLU1vbiBKdW4gMjkgMTA6NTQ6MTkgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGJjb3B5LmMsIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgTGludC4KLQotVGh1IEp1biAyNSAwOToxODo0MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiBtZXJnZSBjaGFuZ2VzIGZyb20gbWFrZS4KLQotVGh1IEp1biAyNSAwNDo0MzoyMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYWxsb2NhLmM6ICBJbmNvcnBvcmF0ZSBmaXhlcyBmcm9tIGdkYi9hbGxvY2EuYy4KLQlGSVhNRTogIEV2ZW50dWFsbHkgbW92ZSBnZGIncyBhbGxvY2EgY29uZmlndXJhdGlvbiBmaWxlcyBoZXJlLAotCWFuZCByZW1vdmUgZ2RiL2FsbG9jYS5jIGFuZCBpdHMgTWFrZWZpbGUuaW4gc3VwcG9ydC4KLQotVHVlIEp1biAyMyAyMTo1NjozMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHVtbXkuYzogIERlZmluZSBOT1RISU5HIHRvIC8qbm90aGluZyovLCBjaGFuZ2UgcmV0dXJuIHR5cGUKLQlvZiBtYWluIHRvIGludCBhbmQgcmV0dXJuIHplcm8uCi0JKiBmdW5jdGlvbnMuZGVmOiAgU3VwcGx5IE5PVEhJTkcgYXMgdGhlIGZvdXJ0aCBhcmcgdG8gbWFjcm9zCi0JdGhhdCBkb24ndCBoYXZlIGFuIGV4cGxpY2l0IGFyZywgdG8gc2F0aXNmeSBwaWNreSBwcmVwcm9jZXNzb3JzLgotCi1XZWQgSnVuIDE3IDE4OjEzOjU4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDbGVhbiB1cCAqY2xlYW4gcnVsZXMsIGFzIHBlciBzdGFuZGFyZHMudGV4aS4KLQotVHVlIEp1biAxNiAxNjoxMTo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmM6IG1lcmdlZCBsYXJnZWx5IGdyYXR1aXRvdXMsIG1vc3RseQotCSAgd2hpdGVzcGFjZSBkaWZmcyBmcm9tIG90aGVyIHByZXAgZGlzdHJpYnV0aW9ucy4KLQotTW9uIEp1biAxNSAxMjoyNTo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCi0KLU1vbiBKdW4gMTUgMDE6MDM6MjYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNpZ3NldG1hc2suYzogIFJld3JpdGUuICBPbGQgb25lIHdhcyB2ZXJ5IGNvbmZ1c2VkIGFib3V0IGl0cwotCWFyZ3VtZW50cyBhbmQgcmVzdWx0LiAgTmV3IG9uZSBjYW4ndCBkbyBtdWNoLCBidXQgYXQgbGVhc3Qga25vd3MKLQl3aGF0IGl0IGNhbid0IGRvLCBhbmQgaXQncyBnb29kIGVub3VnaCBmb3IgR0RCJ3MgdXNlLgotCi1TdW4gSnVuIDE0IDE1OjE3OjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGZ1bmN0aW9ucy5kZWY6ICBVc2UgcHJvcGVyIHByb3RvdHlwZSBmb3Igc3RydG91bC4KLQotRnJpIEp1biAxMiAxOToyMjo0MCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgcmFuZG9tLmMuCi0JKiBjb25maWcvbWgtKjogIFVzZSAidHJ1ZSIgcmF0aGVyIHRoYW4gImVjaG8gPi9kZXYvbnVsbCIgZm9yIHJhbmxpYi4KLQkqIGNvbmZpZ3VyZS5pbjogIHVwZGF0ZSBzb2xhcmlzMiBjb25maWcuCi0KLVdlZCBKdW4gMTAgMTY6MzE6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHJhbmRvbS5jOiAgQWRkIGZvciByYW5kb20oKSBhbmQgc3JhbmRvbSgpLgotCSogZnVuY3Rpb25zLmRlZjogIEFkZCByYW5kb20KLQotVHVlIEp1biAgOSAxNzoyNzoxOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3ttaC1uY3IzMDAwLCBtaC1zeXN2NH06ICBBZGQgZGVmaW5pdGlvbiBmb3IgSU5TVEFMTAotCXVzaW5nIC91c3IvdWNiL2luc3RhbGwuCi0KLU1vbiBKdW4gIDEgMTM6MjA6MTcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdHJlcnJvci5jOiAgS2x1ZGdlIHRvIGd1YXJkIGFnYWluc3QgYSBjb25mbGljdCB3aXRoCi0JcG9zc2libGUgZGVjbGFyYXRpb24gb2Ygc3lzX2Vycmxpc3QgaW4gZXJybm8uaC4KLQotU3VuIE1heSAzMSAxNTowNzo0NyAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1zb2xhcmlzOiBhZGQgc29sYXJpczIgY29uZmlnIHN1cHBvcnQuCi0KLUZyaSBNYXkgMjkgMTc6MjM6MjMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzaWdzZXRtYXNrLmM6ICAjaWZkZWYgb3V0IHNpZ3NldG1hc2sgaWYgU0lHX1NFVE1BU0sKLQlpcyBub3QgZGVmaW5lZCAoc2hvdWxkIGJlIGRlZmluZWQgaW4gc2lnbmFsLmgsIHNheXMgUG9zaXguKS4KLQotTW9uIE1heSAxOCAxNzozNTowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IG1lcmdlZCBjaGFuZ2VzIGZyb20gbWFrZS0zLjYyLjExLgotCi1GcmkgTWF5ICA4IDE0OjUzOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogbWVyZ2VkIGNoYW5nZXMgZnJvbSBiaXNvbi0xLjE4LgotCi1UdWUgTWF5ICA1IDExOjUxOjQwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBEb24ndCBoYXZlICQoRVhUUkFfT0ZJTEVTKSBkZXBlbmQgb24gY29uZmlnLmgsCi0Jc2luY2UgdGhhdCBpbnRyb2R1Y2VzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQkoJChFWFRSQV9PRklMRVMpIGFyZSB1c2VkIHRvIGJ1aWxkIGNvbmZpZy5oLikKLQotCSogc3RydG91bC5jOiAgRml4ZXMgdG8gaGFuZGxlIG5vbi1kZWNpbWFsIGJhc2VzIGJldHRlci4KLQotV2VkIEFwciAyMiAwOToyNzo1MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDA6ICBSZXBsYWNlIE1JTlVTX0cgd2l0aCBDRkxBR1MuCi0JKiBNYWtlZmlsZS5kb3M6ICBGaW5pc2ggTUlOVVNfRyBlcmFkaWNhdGlvbi4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIHN0cnNpZ25hbC5jLgotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6ICBBZGQgc3RyZXJyb3IubyBzdHJzaWduYWwubwotCSogTWFrZWZpbGUuaW4gKG5lZWRlZC1saXN0KTogIFNwbGl0IGNyZWF0aW9uIG9mIGVycm9ycyBmaWxlIHRvCi0Jc2VwYXJhdGUgbWFrZSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgsIG5lZWRlZDIuYXdrLCBlcnJvcnMpOiAgTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiAgU3BsaXQgdG8gbXVsdGlwbGUgbGluZXMsIGFkZCBuZWVkZWQyLmF3awotCWFuZCBjb25maWcuaC4KLQkqIGR1bW15LmMgKERFRkZVTkMsIERFRlZBUik6ICBBZGQgZGVmaW5lcyBhbmQgdW5kZWZzLgotCSogZnVuY3Rpb25zLmRlZiAoc3RyZXJyb3IpOiAgUmVtb3ZlIGZyb20gb3B0aW9uYWwgbGlzdC4KLQkqIGZ1bmN0aW9ucy5kZWYgKHN5c19uZXJyLCBzeXNfZXJybGlzdCwgc3lzX3NpZ2xpc3QpOiAgREVGVkFSJ3MKLQkqIGZ1bmN0aW9ucy5kZWYgKHN0cmVycm9yLCBwc2lnbmFsKTogIERFRkZVTkMncwotCSogc3RyZXJyb3IuYzogIFJld3JpdGUgZnJvbSBzY3JhdGNoIHRvIHVzZSBzeXNfZXJybGlzdCBvbmx5IGlmCi0JYXZhaWxhYmxlLCBhZGQgZXJybm9fbWF4KCksIGFkZCBzdHJlcnJubygpLCBhZGQgc3RydG9lcnJubygpLAotCWFkZCB0ZXN0IGRyaXZlci4KLQkqIHN0cnNpZ25hbC5jOiAgTmV3IGZpbGUsIHNpZ25hbCBlcXVpdmFsZW50IHRvIHN0cmVycm9yLmMuCi0JVXNlcyBzeXNfc2lnbGlzdCBpZiBhdmFpbGFibGUsIGRlZmluZXMgc2lnbm9fbWF4KCksIHN0cnNpZ25hbCgpLAotCXN0cnNpZ25vKCksIHN0cnRvc2lnbm8oKSwgcHNpZ25hbCgpLCBhbmQgdGVzdCBkcml2ZXIuCi0KLU1vbiBBcHIgMjAgMjA6NDk6MzIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkbyBub3QgcHJpbnQgcmVjdXJzaW9uIGxpbmUuCi0KLQkqIE1ha2VmaWxlLmluOiBhbGxvdyBDRkxBR1MgdG8gYmUgcGFzc2VkIGluIGZyb20gY29tbWFuZCBsaW5lLgotCSAgUmVtb3ZlZCBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0KLU1vbiBBcHIgMjAgMTI6NTc6NDYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYWl4OiAgTmV3LiAgRVhUUkFfT0ZJTEVTIGxpc3RzIGNvcHlzaWduLm8sCi0Jc28gbGliZysrIHVzZXJzIGRvbid0IGhhdmUgdG8gYmUgaW5jb252ZW5pZW5jZWQgYnkgYQotCWxpYmMuYSBidWcgKGxpYmMuYSBuZWVkcyBjb3B5c2lnbiwgYnV0IGRvZXNuJ3QgZGVmaW5lIGl0ISkuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgY29uZmlnL21oLWFpeC4KLQkqIHN0cnRvdWwuYzogIEhhbmRsZSAnLScgYXMgcmVxdWlyZWQgYnkgQU5TSS4KLQlDbGVhbiB1cCByYWRpeCBoYW5kbGluZy4KLQkqIHN0cnN0ci5jOiAgRml4IGJ1Z2d5IGFsZ29yaXRobS4KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIHNvIHRoYXQgJHtFWFRSQV9PRklMRVN9IGlzCi0JYXBwZW5kZWQgdG8gbmVlZGVkLWxpc3QgKHdoaWNoIGlzIHVzZWQgYnkgbGliZysrKS4KLQotRnJpIEFwciAxMCAyMjo1MTo0MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiAgTmV3IGNvbmZpZyBmaWxlLgotCi1XZWQgQXByICAxIDIzOjMxOjQzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhcmd2LmMsIGR1bW15LmM6ICBMaW50LgotCi1UdWUgTWFyIDMxIDE4OjQ2OjQ0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3lzdjQ6ICBOZXcgY29uZmlnIGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6ICBTZXQgdG8gY29uZmlnL21oLXN5c3Y0IGZvcgotCWhvc3Rfb3MgPT0gc3lzdjQuCi0JKiBnZXRwYWdlc2l6ZS5jOiAgRm9yIFNWUjQsIHVzZSBzeXNjb25mKF9TQ19QQUdFU0laRSkgdG8gZ2V0Ci0JcGFnZXNpemUuCi0KLVN1biBNYXIgMjkgMTI6MjY6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiAgTGludC4KLQotRnJpIE1hciAyNyAwODozMjo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZnVuY3Rpb25zLmRlZiAoYWxsb2NhKTogIEZpeCByZXR1cm4gdHlwZSBhbmQgYXJncyB0byBhdm9pZAotCXR5cGUgY2xhc2ggd2l0aCBnY2MncyBidWlsdGluIGFsbG9jYS4KLQotVHVlIE1hciAyNCAyMzozMzo0MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtaXJpeDQ6IGlyaXg0IHN1cHBvcnQuCi0KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmLCBhbGxvY2EuYzogYWRkZWQgYWxsb2NhLgotCi1UdWUgTWFyIDI0IDE3OjM0OjQ2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoQ0FMTF9GUkVFRlVOKTogIE1ha2UgaXQgY29tcGlsZSBvbiBERUNzdGF0aW9ucy4KLQotVGh1IE1hciAxOSAxMzo1Nzo0MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgRml4IHZhcmlvdXMgZXh0ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gYmUKLQljb3JyZWN0IGluIGFuIEFOU0kgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCi0KLVNhdCBNYXIgMTQgMTc6Mjg6MTcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIENoYW5nZXMgdG8gc3VwcG9ydCBjYWxsaW5nIG1tYWxsb2MgZnVuY3Rpb25zLAotCXdoaWNoIHRha2UgYW4gYWRkaXRpb25hbCBhcmd1bWVudCBvdmVyIG1hbGxvYyBmdW5jdGlvbnMuCi0KLUZyaSBNYXIgIDYgMjI6MDE6MTAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGFkZGVkIGNoZWNrIHRhcmdldC4KLQotVGh1IEZlYiAyNyAyMjoxOTozOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgI2luY2x1ZGUgYWxsb2NhLWNvbmYuaCAobmVlZGVkIGJ5IEFJWCkuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1TYXQgRmViIDIyIDAxOjA5OjIxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIENoZWNrIGluIEZyZWQncyB2ZXJzaW9uIHdoaWNoIGZpeGVzIHByb2JsZW1zIHdpdGgKLQlhbGxvY2EoKS4KLQotRnJpIEZlYiAgNyAyMTo0NjowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBtYWtlZmlsZS5kb3M6ICBSZW1vdmUgTlVMIHRvIGtlZXAgcGF0Y2ggZnJvbSBmYWlsaW5nLgotCi1UaHUgSmFuIDMwIDIyOjQ4OjQxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jIChfZ2V0b3B0X2ludGVybmFsKTogIEZpeCB1c2FnZSBvZiBlbnVtIGhhc19hcmcuCi0KLU1vbiBKYW4gMjAgMTg6NTM6MjMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotIAkqIGdldG9wdC5jLCBnZXRvcHQxLmMsIC4uL2luY2x1ZGUvZ2V0b3B0Lmg6ICBHZXQgbGF0ZXN0IHZlcnNpb25zLgotCi1TYXQgSmFuIDE4IDE2OjUzOjAxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICBOZXcgZmlsZSB0byBidWlsZCBhbmQgZGVzdHJveSBzdGFuZGFyZCBhcmd1bWVudAotCXZlY3RvcnMgZnJvbSBhIGNvbW1hbmQgc3RyaW5nLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBhcmd2LmMgYW5kIGFyZ3YubyB0byBhcHByb3ByaWF0ZSBtYWNyb3MuCi0KLUZyaSBEZWMgMjAgMTI6MTI6NTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZSBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLQkqIHJpbmRleC5jOiAgRGVjbGFyZSByZXR1cm4gdHlwZSBvZiBleHRlcm5hbGx5IHVzZWQgZnVuY3Rpb24KLQlzdHJyY2hyKCkuCi0KLVRodSBEZWMgMTkgMTg6MzU6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlICIqKioiIGluIG5vcm1hbCBvdXRwdXQsIHNpbmNlIE1ha2UgcHJvZHVjZXMKLQl0aGlzIG9uIGVycm9ycywgYW5kIGl0J3MgY29udmVuaWVudCB0byBzZWFyY2ggZm9yLgotCi1UdWUgRGVjIDE3IDIzOjIxOjMwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBtZW1jbXAuYywgbWVtY3B5LmMsIG1lbW1vdmUuYywgbWVtc2V0LmMsIHN0cmNoci5jLCBzdHJyY2hyLmM6Ci0JTmV3IEFOU0kgZnVuY3Rpb25zLiAgVGhlIG9sZCBub24tQU5TSSBmdW5jdGlvbnMgKHN1Y2ggYXMgYmNvcHkpCi0Jc2hvdWxkIGJlIGF2b2lkZWQuCi0JKiBiY29weS5jOiAgRml4IHRvIGNvcnJlY3RseSBoYW5kbGUgb3ZlcmxhcHBpbmcgcmVnaW9ucy4KLQkqIGluZGV4LmMsIHJpbmRleC5jOiAgUmUtd3JpdGUgaW4gdGVybXMgb2Ygc3RyY2hyKCkgYW5kIHN0cnJjaHIoKS4KLQkqIGZ1bmN0aW9ucy5kZWY6ICBBZGQgdGhlIG5ldyBmdW5jdGlvbnMuCi0JKiBmdW5jdGlvbnMuZGVmOiAgQWRkIDR0aCBwYXJhbWV0ZXIgdG8gREVGIG1hY3JvLAotCWFuIGFuc2lkZWNsLmgtc3R5bGUgcHJvdG90eXBlLgotCSogZHVtbXkuYzogIFVzZSBleHBhbmRlZCBERUYgbWFjcm8gdG8gY3JlYXRlIGEgZHVtbXkgZnVuY3Rpb24KLQljYWxsLCB3aXRoIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGVzLiAgKFRoaXMgYXZvaWRzIHNvbWUKLQljb21wbGFpbnRzIGZyb20gZ2NjIGFib3V0IHByZWRlZmluZWQgYnVpbHRpbnMuKQotCi0JTW92ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb25maWcvbWgtZGVmYXVsdCBpbnRvIE1ha2VmaWxlLmluLgotCVRoaXMgYXZvaWQgZHVwbGljYXRpb24sIGFuZCBzaW1wbGlmaWVzIHRoaW5ncyBzbGlnaHRseS4KLQkqIE1ha2VmaWxlLmluOiAgVHdlYWsgc28gd2UgZG9uJ3QgbmVlZCBjb25maWcvbWgtZGVmYXVsdC4KLQkqIFJFQURNRTogIFVwZGF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIGNvbmZpZy9taC1kZWZhdWx0LgotCSogY29uZmlnL21oLWRlZmF1bHQ6ICBEZWxldGVkLgotCSogY29uZmlnL21oLXN5c3Y6ICBSZW1vdmUgbGluZXMgY29waWVkIGZyb20gb2xkIG1oLWRlZmF1bHQuCi0KLVR1ZSBEZWMgMTcgMDU6NDY6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGZkbWF0Y2guYyAoZmRtYXRjaCk6ICBEb24ndCBjb21wYXJlIHN0X3JkZXYsIHdoaWNoIGlzIGZvcgotCSdta25vZCcgZGV2aWNlIG51bWJlcnMuCi0KLU1vbiBEZWMgMTYgMTI6MjU6MzQgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGZkbWF0Y2guYywgTWFrZWZpbGUuaW46ICBBZGQgbmV3IGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvCi0Jb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGFuZCByZXR1cm5zIG5vbnplcm8gaWYgdGhleSByZWZlciB0bwotCXRoZSBzYW1lIGZpbGUsIHplcm8gb3RoZXJ3aXNlLiAgKHVzZWQgaW4gZ2RiKQotCi1XZWQgRGVjIDExIDE3OjQwOjM5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCUZyb20gREo6Ci0JKiBtc2Rvcy5jOiBzdHViIGZ1bmN0aW9ucyBmb3IgZG9zLgotCSogbWFrZWZpbGUuZG9zLCBjb25maWdkai5iYXQ6IG5ldy4KLQkqIGdldG9wdC5jOiBEb24ndCBpbmNsdWRlIGFsbG9jYS1jb25mLmggaW4gYSBHTzMyIHdvcmxkLgotCi0KLVR1ZSBEZWMgMTAgMDQ6MTQ6NDkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLUZyaSBEZWMgIDYgMjM6MjY6NDUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHNwYWNlcyBmb2xsb3dpbmcgaHlwaGVucyBiZWNhdXNlIGJzZCBtYWtlCi0JICBjYW4ndCBjb3BlLiAgYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydC4gIGluc3RhbGwgdXNpbmcKLQkgIElOU1RBTExfREFUQS4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgY29tbW9udGFyZ2V0cyBhcyBpdCBpcyBubyBsb25nZXIgYQotCSAgcmVjb2duaXplZCBob29rLgotCi1UaHUgRGVjICA1IDIyOjQ2OjQ2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAxOToxNToyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBmaW5kLW5lZWRlZC5hd2sgZG9lcyBub3QgZml0IGluIDE0IGNoYXJzLgotCi0JKiBNYWtlZmlsZS5pbjogIFN1cHByZXNzIGVycm9yIGNoZWNraW5nIHdoZW4gY29tcGlsaW5nIHRoZSB0ZXN0Ci0JcHJvZ3JhbSwgYmVjYXVzZSBVbHRyaXggbWFrZS9zaCBhYm9ydHMgdGhlcmUgZHVlIHRvIGEgYnVnLgotCi1GcmkgTm92IDIyIDEyOjIzOjE3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlLWRpZCBob3cgRVhUUkFfT0ZJTEVTIGlzIHVzZWQgdG8gYmUgbW9yZSB1c2VmdWwuCi0JKiBSRUFETUU6ICBFeHBsYWluZWQgaG93IHRoZSBhdXRvLWNvbmZpZ3VyYXRpb24gd29ya3MsCi0JYW5kIGhvdyB0byBhZGQgbmV3IGZpbGVzIGFuZC9vciBjb25maWd1cmF0aW9ucy4KLQotRnJpIE5vdiAyMiAwOTo0NToyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RydG91bC5jOiAgQXZvaWQgZGVmaW5pbmcgVUxPTkdfTUFYIGlmIGFscmVhZHkgZGVmaW5lZDsKLQljYXN0IGEgY29uc3QgY2hhciAqIHRvIGNoYXIgKiBmb3IgcGVkYW50cy4KLQotCSogZ2V0b3B0LmM6ICBPbmx5IGRlZmluZSAiY29uc3QiIGFmdGVyIGxvY2FsIGluY2x1ZGUgZmlsZXMgZ2V0IHRvLAotCWFuZCBvbmx5IGlmIHRoZXkgaGF2ZW4ndCBkZWZpbmVkIGl0LgotCi1UaHUgTm92IDIxIDE2OjU4OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBnZXRjd2QuYyAocmVtb3ZlIGdldHdkLmMpOiBHTlUgY29kZSBzaG91bGQgY2FsbCBnZXRjd2QoKS4gIFdlCi0JZW11bGF0ZSBpdCB3aXRoIGdldHdkKCkgaWYgYXZhaWxhYmxlLiAgVGhpcyBhdm9pZHMgY2FsbGVycyBoYXZpbmcKLQl0byBmaW5kIGEgTUFYUEFUSExFTiBvciBQQVRIX01BWCB2YWx1ZSBmcm9tIHNvbWV3aGVyZS4KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiAgZ2V0d2QtPmdldGN3ZC4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBnZW5lcmljIGNhc2UgZm9yIGV2ZXJ5IHN5c3RlbS4KLQkqIGNvbmZpZy9taC17ZGVsdGE4OCxtYWNoLHJzNjAwMCxzdnI0fTogIFJlbW92ZS4KLQkqIGNvbmZpZy9taC1zeXN2OiAgVXNlIGRlZmF1bHQgaGFuZGxpbmcsIGp1c3QgYWRkIC1EVVNHLgotCi1UaHUgTm92IDE0IDEwOjU4OjA1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnL21oLWRlZmF1bHQ6IFJlLWRvIG1ha2UgbWFnaWMKLQlzbyB0aGF0IGZvciB0aGUgZGVmYXVsdCAoImF1dG9tYXRpYyIpIG1vZGUgd2Ugb25seQotCWNvbXBpbGUgdGhlIGZpbGVzIHdlIGFjdHVhbGx5IG5lZWQuICBEbyB0aGlzIHVzaW5nCi0JYSByZWN1cnNpdmUgbWFrZTogIFRoZSB0b3AtbGV2ZWwgZ2VuZXJhdGVzIHRoZSBsaXN0Ci0Jb2YgbmVlZGVkIGZpbGVzIChsb29zZWx5LCB0aGUgb25lcyBtaXNzaW5nIGluIGxpYmMpLAotCWFuZCB0aGVuIHBhc3NlcyB0aGF0IGxpc3QgdG8gdGhlIHJlY3Vyc2l2ZSBtYWtlLgotCSogY29uZmlnL21oLW1hY2g6ICBSZW1vdmUgb2Jzb2xldGUgU1RSRVJST1Ite0MsT30gbWFjcm9zLgotCi1UdWUgTm92IDEyIDE5OjEwOjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUlMvNjAwMCBob3N0IHN1cHBvcnQgKGdydW1ibGUpLgotCi0JKiBjb25maWd1cmUuaW46ICBCdWlsZCBhbGxvY2EtY29uZi5oIGZpbGUgZnJvbSBhbGxvY2Etbm9ybS5oCi0JKGV2ZXJ5dGhpbmcgZWxzZSkgb3IgYWxsb2NhLWJvdGNoLmggKHJzLzYwMDApLgotCSogTWFrZWZpbGUuaW46ICBJbmNsdWRlIC4gb24gdGhlIGluY2x1ZGUgcGF0aC4KLQkqIGdldG9wdC5jOiAgVXNlIGFsbG9jYS1jb25mLmguCi0JKiBhbGxvY2Etbm9ybS5oOiAgSG93IHRvIGRlY2xhcmUgYWxsb2NhIG9uIHJlYXNvbmFibGUgbWFjaGluZXMuCi0JKiBhbGxvY2EtYm90Y2guaDogSG93IHRvIGRlY2xhcmUgYWxsb2NhIG9uIGJyYWluZGVhZCBtYWNoaW5lcy4KLQotVHVlIE5vdiAxMiAwOToyMTo0OCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uY2F0LmMgOiAgTmV3IGZpbGUsIGxpa2UgY29uY2F0KCkgaW4gZ2RiIGJ1dCBjYW4gdGFrZSBhCi0JdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyByYXRoZXIgdGhhbiBmaXhlZCBhdCAzIGFyZ3MuICBGb3IKLQlub3csIGNsaWVudCBhcHBsaWNhdGlvbnMgbXVzdCBzdXBwbHkgYW4geG1hbGxvYygpLCB3aGljaCBpcyBhCi0JZnJvbnQgZW5kIGZ1bmN0aW9uIHRvIG1hbGxvYygpIHRoYXQgZGVhbHMgd2l0aCBvdXQtb2YtbWVtb3J5Ci0JY29uZGl0aW9ucy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgY29uY2F0LmMgYW5kIGNvbmNhdC5vIHRvIGFwcHJvcHJpYXRlIG1hY3Jvcy4KLQotU2F0IE5vdiAgOSAxMzoyOTo1OSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN2cjQ6ICBBZGQgc2lnc2V0bWFzayB0byBsaXN0IG9mIHJlcXVpcmVkIGZ1bmN0aW9ucy4KLQotU3VuIE5vdiAgMyAxMTo1Nzo1NiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogdnNwcmludGYuYzogIE5ldyBmaWxlLgotCSogZnVuY3Rpb25zLmRlZiwgTWFrZWZpbGUuaW46ICBBZGQgdnNwcmludGYuCi0KLVN1biBPY3QgMjcgMTY6MzE6MjIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLXJzNjAwMDogIEFkZCBycy82MDAwIGhvc3Qgc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluOiAgQ29tcGlsZSB3aXRoIGRlYnVnIGluZm8uCi0KLUZyaSBPY3QgMjUgMTc6MDE6MTIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIGFuZCBuZXcgZmlsZXM6IGR1bW15LmMsIGZ1bmN0aW9ucy5kZWYsCi0JY29uZmlnL21mLWRlZmF1bHQ6ICBBZGRlZCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtb2RlLAotCXdoaWNoIGluY2x1ZGVzIGludG8gbGliaWJlcnR5LmEgZnVuY3Rpb25zIHRoYXQgYXJlICJtaXNzaW5nIiBpbiBsaWJjLgotCSogc3RyZHVwLmMsIHZwcmludGYuYywgdmZwcmludGYuYzogTmV3IGZpbGVzLgotCi1UaHUgT2N0IDI0IDAyOjI5OjI2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaG1ha2Utc3ZyNDogTmV3IGZpbGUuCi0KLQkqIGNvbmZpZy9obWFrZS1zeXN2OiBBZGQgSE9TVF9DRklMRVMgYW5kIEhPU1RfT0ZJTEVTLgotCi0JKiBiYXNlbmFtZS5jLCBiY21wLmMsIGJjb3B5LmMsIGJ6ZXJvLmMsIGdldHBhZ2VzaXplLmMgZ2V0d2QuYywKLQlpbmRleC5jLCBpbnNxdWUuYywgcmluZGV4LmMsIHNwYWNlcy5jLCBzdHJzdHIuYywgdmZvcmsuYzogTmV3Ci0JZmlsZXMgY29udGFpbmluZyBlaXRoZXIgcG9ydGFibGUgQyB2ZXJzaW9ucyBvciBlbXVsYXRpb25zIHVzaW5nCi0JbmF0aXZlIGxpYnJhcnkgY2FsbHMuCi0KLQkqIHN0cmVycm9yLmM6ICBBZGQgY29weXJpZ2h0LCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLCBldGMuCi0KLQkqIHN0cnRvbC5jOiAgUmVwbGFjZSBoYXJkd2lyZWQgaGV4IGNvbnN0YW50cyB3aXRoIHNvbWUgbW9yZQotCXBvcnRhYmxlIG1hY3Jvcy4gIFJlbW92ZSBpbGxlZ2FsIChhY2NvcmRpbmcgdG8gZ2NjKSBjYXN0LgotCi0JKiBzdHJ0b3VsLmM6IFJlcGxhY2UgaGFyZHdpcmVkIGhleCBjb25zdGFudCB3aXRoIG1vcmUgcG9ydGFibGUKLQltYWNyby4KLQotCSogTWFrZWZpbGUuaW46IE1vdmUgVEFSR0VUTElCIGFuZCBDRkxBR1Mgd2hlcmUgbWFrZWZpbGUgZnJhZ21lbnRzCi0JY2FuIG92ZXJyaWRlIHRoZW0uICBBZGQgbmV3IHNvdXJjZSBhbmQgb2JqZWN0IGZpbGUgbmFtZXMgdG8gQ0ZJTEVTCi0JYW5kIE9GSUxFUyByZXNwZWN0aXZlbHkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFNWUjQgbWFrZWZpbGUgZnJhZ21lbnRzLgotCi1UdWUgT2N0IDIyIDE5OjAwOjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IE1vdmUgUkFOTElCLCBBUiBhbmQgQVJfRkxBR1MgdG8gd2hlcmUgdGhleSBjYW4gYmUKLQlvdmVyLXJpZGRlbiBieSBjb25maWcvaG1ha2UtKgotCSogY29uZmlndXJlLmluOiBhZGRlZCBtODhrY3ZzIHRvIHN5c3YgbGlzdAotCi1GcmkgT2N0ICA0IDAxOjI5OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1vc3QgaG9zdHMgbmVlZCBzdHJlcnJvciwgYnV0IG9uZSBvciB0d28gZG9uJ3QsCi0JYW5kIHRoZXkgb3ZlcnJpZGUgdGhlc2UgZGVmaW5pdGlvbnMgaW4gdGhlIGhvc3QtZGVwZW5kZW50IG1ha2VmaWxlCi0JZnJhZ21lbnQuCi0JKiBjb25maWcvaG1ha2UtbWFjaDogIFRoZSBvZGQgbWFuIG91dCBvbiBzdHJlcnJvciAtLSBpdCdzIHN1cHBsaWVkLgotCSogc3RyZXJyb3IuYzogIE5ldyBmaWxlLgotCi0JKiBzdHJ0b2wuYywgc3RydG91bC5jOiAgQWRkIHN0cnRvbCB0byBsaWJpYmVydHksIHNpbmNlIE1hY2ggbGFja3MKLQlpdCBhbmQgYmZkIHVzZXMgaXQuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBjb25maWcvaG1ha2UtbWFjaDogIE9ubHkgY29uZmlndXJlCi0Jc3RydG9sICYgc3Ryb3RvdWwgaW4gb24gTWFjaC4KLQotVHVlIFNlcCAgMyAwNjozNjoyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIE1lcmdlIHdpdGggbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9saWJpYmVydHkvTWFrZWZpbGUuaW4gYi9saWJpYmVydHkvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTgwZDAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLSMgTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSMgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBMaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSMgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkgPHJpY2hAY3lnbnVzLmNvbT4uCi0KLSMKLSMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSBkaXJlY3RvcnkKLSMKLQotc3JjZGlyID0gQHNyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLQotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1iaW5kaXIgPSBAYmluZGlyQAotbGliZGlyID0gQGxpYmRpckAKLQotU0hFTEwgPSBAU0hFTExACi0KLSMgTXVsdGlsaWIgc3VwcG9ydCB2YXJpYWJsZXMuCi1NVUxUSVNSQ1RPUCA9Ci1NVUxUSUJVSUxEVE9QID0KLU1VTFRJRElSUyA9Ci1NVUxUSVNVQkRJUiA9Ci1NVUxUSURPID0gdHJ1ZQotTVVMVElDTEVBTiA9IHRydWUKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi0KLUFSID0gQEFSQAotQVJfRkxBR1MgPSByYwotCi1DQyA9IEBDQ0AKLUNGTEFHUyA9IEBDRkxBR1NACi1MSUJDRkxBR1MgPSAkKENGTEFHUykKLVJBTkxJQiA9IEBSQU5MSUJACi0KLVBJQ0ZMQUcgPQotCi1NQUtFT1ZFUlJJREVTID0KLQotVEFSR0VUTElCID0gbGliaWJlcnR5LmEKLQotTElCT0JKUyA9IEBMSUJPQkpTQAotQUxMT0NBID0gQEFMTE9DQUAKLQotIyBBIGNvbmZpZ3VyYXRpb24gY2FuIHNwZWNpZnkgZXh0cmEgLm8gZmlsZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQsCi0jIGV2ZW4gaWYgdGhleSBhcmUgaW4gbGliYy4gKFBlcmhhcHMgdGhlIGxpYmMgdmVyc2lvbiBpcyBidWdneS4pCi1FWFRSQV9PRklMRVMgPSAKLQotIyBGbGFncyB0byBwYXNzIHRvIGEgcmVjdXJzaXZlIG1ha2UuCi1GTEFHU19UT19QQVNTID0gXAotCSJBUj0kKEFSKSIgXAotCSJBUl9GTEFHUz0kKEFSX0ZMQUdTKSIgXAotCSJDQz0kKENDKSIgXAotCSJDRkxBR1M9JChDRkxBR1MpIiBcCi0JIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKLQkiRVhUUkFfT0ZJTEVTPSQoRVhUUkFfT0ZJTEVTKSIgXAotCSJIREVGSU5FUz0kKEhERUZJTkVTKSIgXAotCSJJTlNUQUxMPSQoSU5TVEFMTCkiIFwKLQkiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAotCSJJTlNUQUxMX1BST0dSQU09JChJTlNUQUxMX1BST0dSQU0pIiBcCi0JIkxERkxBR1M9JChMREZMQUdTKSIgXAotCSJMT0FETElCRVM9JChMT0FETElCRVMpIiBcCi0JIlJBTkxJQj0kKFJBTkxJQikiIFwKLQkiU0hFTEw9JChTSEVMTCkiCi0KLWFsbDogc3RhbXAtcGljZGlyICQoVEFSR0VUTElCKSBuZWVkZWQtbGlzdCByZXF1aXJlZC1saXN0Ci0JQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1hbGwKLQotLlBIT05ZOiBjaGVjayBpbnN0YWxsY2hlY2sKLWNoZWNrIGluc3RhbGxjaGVjazoKLQotQGhvc3RfbWFrZWZpbGVfZnJhZ0AKLQotSU5DRElSPSQoc3JjZGlyKS8kKE1VTFRJU1JDVE9QKS4uL2luY2x1ZGUKLQotQ09NUElMRS5jID0gJChDQykgLWMgQERFRlNAICQoTElCQ0ZMQUdTKSAtSS4gLUkkKElOQ0RJUikgJChIREVGSU5FUykKLS5jLm86Ci0JdGVzdCB4IiQoZW5hYmxlX3NoYXJlZCkiICE9IHh5ZXMgfHwgXAotCSAgJChDT01QSUxFLmMpICQoUElDRkxBRykgJDwgLW8gcGljLyRACi0JJChDT01QSUxFLmMpICQ8Ci0KLWluZm8gaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8gZHZpOgotCi0jIEluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgaW4gdGhpcyBkaXJlY3RvcnkuCi1IRklMRVMgPSBhbGxvY2EtY29uZi5oCi0KLSMgTk9URTogSWYgeW91IGFkZCBuZXcgZmlsZXMgdG8gdGhlIGxpYnJhcnksIGFkZCB0aGVtIHRvIHRoaXMgbGlzdAotIyAoYWxwaGFiZXRpY2FsKSwgYW5kIGFkZCB0aGVtIHRvIFJFUVVJUkVEX09GSUxFUyBvciBmdW5jcyBpbgotIyBjb25maWd1cmUuaW4uCi1DRklMRVMgPSBhc3ByaW50Zi5jIGFsbG9jYS5jIGFyZ3YuYyBhdGV4aXQuYyBiYXNlbmFtZS5jIGJjbXAuYyBiY29weS5jIFwKLQliemVyby5jIGNob29zZS10ZW1wLmMgY2xvY2suYyBjb25jYXQuYyBjcGx1cy1kZW0uYyBmZG1hdGNoLmMgXAotCWZubWF0Y2guYyBnZXRjd2QuYyBnZXRvcHQuYyBnZXRvcHQxLmMgZ2V0cGFnZXNpemUuYyBcCi0JZ2V0cnVudGltZS5jIGZsb2F0Zm9ybWF0LmMgaGV4LmMgaW5kZXguYyBpbnNxdWUuYyBtZW1jaHIuYyBcCi0JbWVtY21wLmMgbWVtY3B5LmMgbWVtbW92ZS5jIG1lbXNldC5jIG1rc3RlbXBzLmMgb2JqYWxsb2MuYyBvYnN0YWNrLmMgXAotCXBleGVjdXRlLmMgcmFuZG9tLmMgcmVuYW1lLmMgcmluZGV4LmMgc2lnc2V0bWFzay5jIHNwYWNlcy5jIFwKLQlzcGxheS10cmVlLmMgc3RyY2FzZWNtcC5jIHN0cm5jYXNlY21wLmMgc3RyY2hyLmMgc3RyZHVwLmMgc3RyZXJyb3IuYyBcCi0Jc3RycmNoci5jIHN0cnNpZ25hbC5jIHN0cnN0ci5jIHN0cnRvZC5jIHN0cnRvbC5jIHN0cnRvdWwuYyBcCi0JdG1wbmFtLmMgdmFzcHJpbnRmLmMgdmZvcmsuYyB2ZnByaW50Zi5jIHZwcmludGYuYyB2c3ByaW50Zi5jIFwKLQl3YWl0cGlkLmMgeGF0ZXhpdC5jIHhleGl0LmMgeG1hbGxvYy5jIHhzdHJkdXAuYyB4c3RyZXJyb3IuYwotCi0jIFRoZXNlIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkuCi1SRVFVSVJFRF9PRklMRVMgPSBhcmd2Lm8gY2hvb3NlLXRlbXAubyBjb25jYXQubyBjcGx1cy1kZW0ubyBcCi0gIGZkbWF0Y2gubyBmbm1hdGNoLm8gZ2V0b3B0Lm8gZ2V0b3B0MS5vIGdldHJ1bnRpbWUubyBoZXgubyBcCi0gIGZsb2F0Zm9ybWF0Lm8gb2JqYWxsb2MubyBvYnN0YWNrLm8gcGV4ZWN1dGUubyBzcGFjZXMubyBcCi0gIHNwbGF5LXRyZWUubyBzdHJlcnJvci5vIHN0cnNpZ25hbC5vIHhhdGV4aXQubyB4ZXhpdC5vIHhtYWxsb2MubyBcCi0gIHhzdHJkdXAubyB4c3RyZXJyb3IubwotCi0kKFRBUkdFVExJQik6ICQoUkVRVUlSRURfT0ZJTEVTKSAkKEVYVFJBX09GSUxFUykgJChMSUJPQkpTKSAkKEFMTE9DQSkKLQlybSAtZiAkKFRBUkdFVExJQikKLQkkKEFSKSAkKEFSX0ZMQUdTKSAkKFRBUkdFVExJQikgXAotCSAgJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKQotCSQoUkFOTElCKSAkKFRBUkdFVExJQikKLQotSU5TVEFMTF9ERVNUID0gQElOU1RBTExfREVTVEAKLWluc3RhbGw6IGluc3RhbGxfdG9fJChJTlNUQUxMX0RFU1QpCi0KLWluc3RhbGxfdG9fbGliZGlyOiBhbGwKLQkkKElOU1RBTExfREFUQSkgJChUQVJHRVRMSUIpICQobGliZGlyKSQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKW4KLQkoIGNkICQobGliZGlyKSQoTVVMVElTVUJESVIpIDsgJChSQU5MSUIpICQoVEFSR0VUTElCKW4gKQotCW12IC1mICQobGliZGlyKSQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKW4gJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpCi0JQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1pbnN0YWxsCi0KLWluc3RhbGxfdG9fdG9vbGRpcjogYWxsCi0JJChJTlNUQUxMX0RBVEEpICQoVEFSR0VUTElCKSAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKW4KLQkoIGNkICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikgOyAkKFJBTkxJQikgJChUQVJHRVRMSUIpbiApCi0JbXYgLWYgJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQiluICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpCi0JQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1pbnN0YWxsCi0KLSMgbmVlZGVkLWxpc3QgaXMgdXNlZCBieSBsaWJzdGRjKysuCi1uZWVkZWQtbGlzdDogTWFrZWZpbGUKLQlmPSIkKExJQk9CSlMpICQoQUxMT0NBKSAkKEVYVFJBX09GSUxFUykiOyBcCi0JY2FzZSAkJGYgaW4gXAotCSAgKmFsbG9jYS5vKikgZj0iJCRmIHhtYWxsb2MubyB4ZXhpdC5vIiA7OyBcCi0JZXNhYzsgXAotCWVjaG8gJCRmID4gbmVlZGVkLWxpc3QKLQotIyByZXF1aXJlZC1saXN0IHdhcyB1c2VkIHdoZW4gYnVpbGRpbmcgYSBzaGFyZWQgYmZkL29wY29kZXMvbGliaWJlcnR5Ci0jIGxpYnJhcnkuICBJIGRvbid0IGtub3cgaWYgaXQgdXNlZCBieSBhbnl0aGluZyBjdXJyZW50bHkuCi1yZXF1aXJlZC1saXN0OiBNYWtlZmlsZQotCWVjaG8gJChSRVFVSVJFRF9PRklMRVMpID4gcmVxdWlyZWQtbGlzdAotCi1zdGFtcC1waWNkaXI6Ci0JaWYgWyB4IiQoZW5hYmxlX3NoYXJlZCkiID0geHllcyBdICYmIFsgISAtZCBwaWMgXTsgdGhlbiBcCi0JICBta2RpciBwaWM7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtcGljZGlyCi0KLS5QSE9OWTogYWxsIGV0YWdzIHRhZ3MgbHMgY2xlYW4gc3RhZ2UxIHN0YWdlMgotCi1ldGFncyB0YWdzOiBUQUdTCi0KLVRBR1M6ICQoQ0ZJTEVTKSAkKEhGSUxFUykKLQlldGFncyBgZm9yIGkgaW4gJChIRklMRVMpICQoQ0ZJTEVTKTsgZG8gZWNobyAkKHNyY2RpcikvJCRpIDsgZG9uZWAKLQotIyBUaGUgc3RhbmRhbG9uZSBkZW1hbmdsZXIgKGMrK2ZpbHQpIGhhcyBiZWVuIG1vdmVkIHRvIGJpbnV0aWxzLgotZGVtYW5nbGU6Ci0JQGVjaG8gIlRoZSBzdGFuZGFsb25lIGRlbWFuZ2xlciwgbm93IG5hbWVkIGMrK2ZpbHQsIGlzIG5vdyIKLQlAZWNobyAiYSBwYXJ0IG9mIGJpbnV0aWxzLiIKLQlAZmFsc2UKLQotbHM6Ci0JQGVjaG8gTWFrZWZpbGUgJChIRklMRVMpICQoQ0ZJTEVTKQotCi0jIE5lZWQgdG8gZGVhbCB3aXRoIHByb2ZpbGVkIGxpYnJhcmllcywgdG9vLgotCi1tb3N0bHljbGVhbjoKLQlybSAtcmYgKi5vIHBpYyBjb3JlIGVycnMgXCMqICouRSBhLm91dAotCXJtIC1mIG5lZWRlZC5hd2sgbmVlZGVkMi5hd2sgZXJyb3JzIGR1bW15IG5lZWRlZC1saXN0IGNvbmZpZy5oIHN0YW1wLSoKLQlybSAtZiAkKENPTkZJR19IKSAkKE5FRURFRF9MSVNUKSBzdGFtcC1waWNkaXIKLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1tb3N0bHljbGVhbgotY2xlYW46IG1vc3RseWNsZWFuCi0Jcm0gLWYgKi5hIHJlcXVpcmVkLWxpc3QgdG1wbXVsdGkub3V0Ci0JQCQoTVVMVElDTEVBTikgbXVsdGktY2xlYW4gRE89Y2xlYW4KLWRpc3RjbGVhbjogY2xlYW4KLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1kaXN0Y2xlYW4KLQlybSAtZiAqfiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIHhob3N0LW1rZnJhZyBUQUdTIG11bHRpbGliLm91dAotCXJtIC1mIGNvbmZpZy5sb2cKLW1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBkaXN0Y2xlYW4KLQotZm9yY2U6Ci0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz1NYWtlZmlsZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5oOiBzdGFtcC1oIDsgQHRydWUKLXN0YW1wLWg6IGNvbmZpZy5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy50YWJsZQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKTogc3RhbXAtcGljZGlyCi0KLWFsbG9jYS5vOiBjb25maWcuaAotYXRleGl0Lm86IGNvbmZpZy5oCi1hcmd2Lm86IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1iYXNlbmFtZS5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWNob29zZS10ZW1wLm86IGNvbmZpZy5oCi1jbG9jay5vOiBjb25maWcuaAotY29uY2F0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotY3BsdXMtZGVtLm86IGNvbmZpZy5oICQoSU5DRElSKS9kZW1hbmdsZS5oCi1mZG1hdGNoLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotZm5tYXRjaC5vOiBjb25maWcuaCAkKElOQ0RJUikvZm5tYXRjaC5oCi1nZXRjd2QubzogY29uZmlnLmgKLWdldG9wdC5vOiBjb25maWcuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLWdldG9wdDEubzogY29uZmlnLmggJChJTkNESVIpL2dldG9wdC5oCi1nZXRwYWdlc2l6ZS5vOiBjb25maWcuaAotZ2V0cnVudGltZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWhleC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWZsb2F0Zm9ybWF0Lm86ICQoSU5DRElSKS9mbG9hdGZvcm1hdC5oCi1ta3N0ZW1wcy5vOiBjb25maWcuaAotb2JqYWxsb2MubzogJChJTkNESVIpL29iamFsbG9jLmgKLW9ic3RhY2subzogY29uZmlnLmggJChJTkNESVIpL29ic3RhY2suaAotcGV4ZWN1dGUubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcGFjZXMubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcGxheS10cmVlLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvc3BsYXktdHJlZS5oICQoSU5DRElSKS9hbnNpZGVjbC5oCi1zdHJlcnJvci5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN0cnNpZ25hbC5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhhdGV4aXQubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi14ZXhpdC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhtYWxsb2MubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi14c3RyZHVwLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAoteHN0cmVycm9yLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L1JFQURNRSBiL2xpYmliZXJ0eS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTIyNmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSAtbGliZXJ0eSBsaWJyYXJ5IG9mIGZyZWUgc29mdHdhcmUuCi1JdCBpcyBhIGNvbGxlY3Rpb24gb2Ygc3Vicm91dGluZXMgdXNlZCBieSB2YXJpb3VzIEdOVSBwcm9ncmFtcy4KLUN1cnJlbnQgbWVtYmVycyBpbmNsdWRlOgotCi0JZ2V0b3B0IC0tIGdldCBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lCi0Jb2JzdGFjayAtLSBzdGFja3Mgb2YgYXJiaXRyYXJpbHktc2l6ZWQgb2JqZWN0cwotCXN0cmVycm9yIC0tIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncyBjb3JyZXNwb25kaW5nIHRvIGVycm5vCi0Jc3RydG9sIC0tIHN0cmluZy10by1sb25nIGNvbnZlcnNpb24KLQlzdHJ0b3VsIC0tIHN0cmluZy10by11bnNpZ25lZC1sb25nIGNvbnZlcnNpb24KLQotV2UgZXhwZWN0IG1hbnkgb2YgdGhlIEdOVSBzdWJyb3V0aW5lcyB0aGF0IGFyZSBmbG9hdGluZyBhcm91bmQgdG8KLWV2ZW50dWFsbHkgYXJyaXZlIGhlcmUuCi0KLVRoZSBsaWJyYXJ5IG11c3QgYmUgY29uZmlndXJlZCBmcm9tIHRoZSB0b3Agc291cmNlIGRpcmVjdG9yeS4gIERvbid0Ci10cnkgdG8gcnVuIGNvbmZpZ3VyZSBpbiB0aGlzIGRpcmVjdG9yeS4gIEZvbGxvdyB0aGUgY29uZmlndXJhdGlvbgotaW5zdHJ1Y3Rpb25zIGluIC4uL1JFQURNRS4KLQotUGxlYXNlIHJlcG9ydCBidWdzIGFuZCBmaXhlcyB0byAiYnVnLWdudS11dGlsc0BwcmVwLmFpLm1pdC5lZHUiLiAgVGhhbmsgeW91LgotCi1BRERJTkcgQSBORVcgRklMRQotPT09PT09PT09PT09PT09PT0KLQotVGhlcmUgYXJlIHR3byBzZXRzIG9mIGZpbGVzOiAgVGhvc2UgdGhhdCBhcmUgInJlcXVpcmVkIiB3aWxsIGJlCi1pbmNsdWRlZCBpbiB0aGUgbGlicmFyeSBmb3IgYWxsIGNvbmZpZ3VyYXRpb25zLCB3aGlsZSB0aG9zZQotdGhhdCBhcmUgIm9wdGlvbmFsIiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5IG9ubHkgaWYgIm5lZWRlZC4iCi0KLVRvIGFkZCBhIG5ldyByZXF1aXJlZCBmaWxlLCBlZGl0IE1ha2VmaWxlIHRvIGFkZCB0aGUgc291cmNlIGZpbGUKLW5hbWUgdG8gQ0ZJTEVTIGFuZCB0aGUgb2JqZWN0IGZpbGUgdG8gUkVRVUlSRURfT0ZJTEVTLgotCi1UbyBhZGQgYSBuZXcgb3B0aW9uYWwgZmlsZSwgaXQgbXVzdCBwcm92aWRlIGEgc2luZ2xlIGZ1bmN0aW9uLCBhbmQgdGhlCi1uYW1lIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotCi0gICAgKiBBZGQgdGhlIHNvdXJjZSBmaWxlIG5hbWUgdG8gQ0ZJTEVTLgotCi0gICAgKiBBZGQgdGhlIGZ1bmN0aW9uIHRvIG5hbWUgdG8gdGhlIGZ1bmNzIHNoZWxsIHZhcmlhYmxlIGluCi0gICAgICBjb25maWd1cmUuaW4uCi0KLSAgICAqIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIEFDX0NIRUNLX0ZVTkNTIGxpc3RzIGp1c3QgYWZ0ZXIgdGhlCi0gICAgICBzZXR0aW5nIG9mIHRoZSBmdW5jcyBzaGVsbCB2YXJpYWJsZS4gIFRoZXNlIEFDX0NIRUNLX0ZVTkNTIGNhbGxzCi0gICAgICBhcmUgbmV2ZXIgZXhlY3V0ZWQ7IHRoZXkgYXJlIHRoZXJlIHRvIG1ha2UgYXV0b2hlYWRlciB3b3JrCi0gICAgICBiZXR0ZXIuCi0KLSAgICAqIENvbnNpZGVyIHRoZSBzcGVjaWFsIGNhc2VzIG9mIGJ1aWxkaW5nIGxpYmliZXJ0eTsgYXMgb2YgdGhpcwotICAgICAgd3JpdGluZywgdGhlIHNwZWNpYWwgY2FzZXMgYXJlIG5ld2xpYiBhbmQgVnhXb3Jrcy4gIElmIGEKLSAgICAgIHBhcnRpY3VsYXIgc3BlY2lhbCBjYXNlIHByb3ZpZGVzIHRoZSBmdW5jdGlvbiwgeW91IGRvIG5vdCBuZWVkCi0gICAgICB0byBkbyBhbnl0aGluZy4gIElmIGl0IGRvZXMgbm90IHByb3ZpZGUgdGhlIGZ1bmN0aW9uLCBhZGQgdGhlCi0gICAgICBvYmplY3QgZmlsZSB0byBMSUJPQkpTLCBhbmQgYWRkIHRoZSBmdW5jdGlvbiBuYW1lIHRvIHRoZSBjYXNlCi0gICAgICBjb250cm9sbGluZyB3aGV0aGVyIHRvIGRlZmluZSBIQVZFX2Z1bmMuCi0KLVRoZSBvcHRpb25hbCBmaWxlIHlvdSd2ZSBhZGRlZCAoZS5nLiBnZXRjd2QuYykgc2hvdWxkIGNvbXBpbGUgYW5kIHdvcmsKLW9uIGFsbCBob3N0cyB3aGVyZSBpdCBpcyBuZWVkZWQuICBJdCBkb2VzIG5vdCBoYXZlIHRvIHdvcmsgb3IgZXZlbgotY29tcGlsZSBvbiBob3N0cyB3aGVyZSBpdCBpcyBub3QgbmVlZGVkLgotCi1BRERJTkcgQSBORVcgQ09ORklHVVJBVElPTgotPT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotT24gbW9zdCBob3N0cyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoZSBzY2hlbWUgZm9yIGF1dG9tYXRpY2FsbHkKLWZpZ3VyaW5nIG91dCB3aGljaCBmaWxlcyBhcmUgbmVlZGVkLiAgSW4gdGhhdCBjYXNlLCB5b3UgcHJvYmFibHkKLWRvbid0IG5lZWQgYSBzcGVjaWFsIE1ha2VmaWxlIHN0dWIgZm9yIHRoYXQgY29uZmlndXJhdGlvbi4KLQotSWYgdGhlIGZ1bGx5IGF1dG9tYXRpYyBzY2hlbWUgZG9lc24ndCB3b3JrLCB5b3UgbWF5IGJlIGFibGUgdG8gZ2V0Ci1ieSB3aXRoIGRlZmluaW5nIEVYVFJBX09GSUxFUyBpbiB5b3VyIE1ha2VmaWxlIHN0dWIuICBUaGlzIGlzCi1hIGxpc3Qgb2Ygb2JqZWN0IGZpbGUgbmFtZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyByZXF1aXJlZAotZm9yIHRoaXMgY29uZmlndXJhdGlvbiAtIHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiBsaWJpYmVydHkuYSwKLXJlZ2FyZGxlc3Mgb2Ygd2hhdGV2ZXIgbWlnaHQgYmUgaW4gdGhlIEMgbGlicmFyeS4KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hY2NvbmZpZy5oIGIvbGliaWJlcnR5L2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzU5OWQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19lcnJsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX25lcnIgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05FUlIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfc2lnbGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkVSUk9SCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYWxsb2NhLWNvbmYuaCBiL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzNlZWEzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ19BTExPQ0EpCi0jIGlmbmRlZiBhbGxvY2EKLSMgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBlbmRpZgotI2Vsc2UgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgaWYgZGVmaW5lZChIQVZFX0FMTE9DQV9IKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UgLyogISBkZWZpbmVkIChIQVZFX0FMTE9DQV9IKSAqLwotIyAgIGlmZGVmIF9fU1REQ19fCi1leHRlcm4gUFRSIGFsbG9jYSAoc2l6ZV90KTsKLSMgICBlbHNlIC8qICEgZGVmaW5lZCAoX19TVERDX18pICovCi1leHRlcm4gUFRSIGFsbG9jYSAoKTsKLSMgICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fU1REQ19fKSAqLwotIyAgZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX0FMTE9DQV9IKSAqLwotIyAgaWZkZWYgX1dJTjMyCi0jICAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBlbmRpZgotIyBlbmRpZiAvKiAhIGRlZmluZWQgKF9BSVgpICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hbGxvY2EuYyBiL2xpYmliZXJ0eS9hbGxvY2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4YTIxNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYWxsb2NhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyogYWxsb2NhLmMgLS0gYWxsb2NhdGUgYXV0b21hdGljYWxseSByZWNsYWltZWQgbWVtb3J5Ci0gICAoTW9zdGx5KSBwb3J0YWJsZSBwdWJsaWMtZG9tYWluIGltcGxlbWVudGF0aW9uIC0tIEQgQSBHd3luCi0KLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBXQiBsaWJyYXJ5IGFsbG9jYSBmdW5jdGlvbiwKLSAgIHdoaWNoIGlzIHVzZWQgdG8gYWxsb2NhdGUgc3BhY2Ugb2ZmIHRoZSBydW4tdGltZSBzdGFjayBzbwotICAgdGhhdCBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCB1cG9uIHByb2NlZHVyZSBleGl0LAotICAgd2FzIGluc3BpcmVkIGJ5IGRpc2N1c3Npb25zIHdpdGggSi4gUS4gSm9obnNvbiBvZiBDb3JuZWxsLgotICAgSi5PdHRvIFRlbm5hbnQgPGpvdEBjcmF5LmNvbT4gY29udHJpYnV0ZWQgdGhlIENyYXkgc3VwcG9ydC4KLQotICAgVGhlcmUgYXJlIHNvbWUgcHJlcHJvY2Vzc29yIGNvbnN0YW50cyB0aGF0IGNhbgotICAgYmUgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBmb3IgeW91ciBzcGVjaWZpYyBzeXN0ZW0sIGZvcgotICAgaW1wcm92ZWQgZWZmaWNpZW5jeTsgaG93ZXZlciwgdGhlIGRlZmF1bHRzIHNob3VsZCBiZSBva2F5LgotCi0gICBUaGUgZ2VuZXJhbCBjb25jZXB0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8ga2VlcAotICAgdHJhY2sgb2YgYWxsIGFsbG9jYS1hbGxvY2F0ZWQgYmxvY2tzLCBhbmQgcmVjbGFpbSBhbnkKLSAgIHRoYXQgYXJlIGZvdW5kIHRvIGJlIGRlZXBlciBpbiB0aGUgc3RhY2sgdGhhbiB0aGUgY3VycmVudAotICAgaW52b2NhdGlvbi4gIFRoaXMgaGV1cmlzdGljIGRvZXMgbm90IHJlY2xhaW0gc3RvcmFnZSBhcwotICAgc29vbiBhcyBpdCBiZWNvbWVzIGludmFsaWQsIGJ1dCBpdCB3aWxsIGRvIHNvIGV2ZW50dWFsbHkuCi0KLSAgIEFzIGEgc3BlY2lhbCBjYXNlLCBhbGxvY2EoMCkgcmVjbGFpbXMgc3RvcmFnZSB3aXRob3V0Ci0gICBhbGxvY2F0aW5nIGFueS4gIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZSBhbGxvY2EoMCkgaW4KLSAgIHlvdXIgbWFpbiBjb250cm9sIGxvb3AsIGV0Yy4gdG8gZm9yY2UgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBlbWFjcwotI2luY2x1ZGUgImJsb2NraW5wdXQuaCIKLSNlbmRpZgotCi0vKiBJZiBjb21waWxpbmcgd2l0aCBHQ0MgMiwgdGhpcyBmaWxlJ3Mgbm90IG5lZWRlZC4gIEV4Y2VwdCBvZiBjb3Vyc2UgaWYKLSAgIHRoZSBDIGFsbG9jYSBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCi0jaWYgZGVmaW5lZCAoVVNFX0NfQUxMT0NBKSB8fCAhZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMgotCi0vKiBJZiBzb21lb25lIGhhcyBkZWZpbmVkIGFsbG9jYSBhcyBhIG1hY3JvLAotICAgdGhlcmUgbXVzdCBiZSBzb21lIG90aGVyIHdheSBhbGxvY2EgaXMgc3VwcG9zZWQgdG8gd29yay4gICovCi0jaWZuZGVmIGFsbG9jYQotCi0jaWZkZWYgZW1hY3MKLSNpZmRlZiBzdGF0aWMKLS8qIGFjdHVhbGx5LCBvbmx5IHdhbnQgdGhpcyBpZiBzdGF0aWMgaXMgZGVmaW5lZCBhcyAiIgotICAgLS0gdGhpcyBpcyBmb3IgdXNnLCBpbiB3aGljaCBlbWFjcyBtdXN0IHVuZGVmaW5lIHN0YXRpYwotICAgaW4gb3JkZXIgdG8gbWFrZSB1bmV4ZWMgd29ya2FibGUKLSAgICovCi0jaWZuZGVmIFNUQUNLX0RJUkVDVElPTgoteW91Ci1sb3NlCi0tLSBtdXN0IGtub3cgU1RBQ0tfRElSRUNUSU9OIGF0IGNvbXBpbGUtdGltZQotI2VuZGlmIC8qIFNUQUNLX0RJUkVDVElPTiB1bmRlZmluZWQgKi8KLSNlbmRpZiAvKiBzdGF0aWMgKi8KLSNlbmRpZiAvKiBlbWFjcyAqLwotCi0vKiBJZiB5b3VyIHN0YWNrIGlzIGEgbGlua2VkIGxpc3Qgb2YgZnJhbWVzLCB5b3UgaGF2ZSB0bwotICAgcHJvdmlkZSBhbiAiYWRkcmVzcyBtZXRyaWMiIEFERFJFU1NfRlVOQ1RJT04gbWFjcm8uICAqLwotCi0jaWYgZGVmaW5lZCAoQ1JBWSkgJiYgZGVmaW5lZCAoQ1JBWV9TVEFDS1NFR19FTkQpCi1sb25nIGkwMGFmdW5jICgpOwotI2RlZmluZSBBRERSRVNTX0ZVTkNUSU9OKGFyZykgKGNoYXIgKikgaTAwYWZ1bmMgKCYoYXJnKSkKLSNlbHNlCi0jZGVmaW5lIEFERFJFU1NfRlVOQ1RJT04oYXJnKSAmKGFyZykKLSNlbmRpZgotCi0jaWYgX19TVERDX18KLXR5cGVkZWYgdm9pZCAqcG9pbnRlcjsKLSNlbHNlCi10eXBlZGVmIGNoYXIgKnBvaW50ZXI7Ci0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lCU5VTEwJMAotI2VuZGlmCi0KLS8qIERpZmZlcmVudCBwb3J0aW9ucyBvZiBFbWFjcyBuZWVkIHRvIGNhbGwgZGlmZmVyZW50IHZlcnNpb25zIG9mCi0gICBtYWxsb2MuICBUaGUgRW1hY3MgZXhlY3V0YWJsZSBuZWVkcyBhbGxvY2EgdG8gY2FsbCB4bWFsbG9jLCBiZWNhdXNlCi0gICBvcmRpbmFyeSBtYWxsb2MgaXNuJ3QgcHJvdGVjdGVkIGZyb20gaW5wdXQgc2lnbmFscy4gIE9uIHRoZSBvdGhlcgotICAgaGFuZCwgdGhlIHV0aWxpdGllcyBpbiBsaWItc3JjIG5lZWQgYWxsb2NhIHRvIGNhbGwgbWFsbG9jOyBzb21lIG9mCi0gICB0aGVtIGFyZSB2ZXJ5IHNpbXBsZSwgYW5kIGRvbid0IGhhdmUgYW4geG1hbGxvYyByb3V0aW5lLgotCi0gICBOb24tRW1hY3MgcHJvZ3JhbXMgZXhwZWN0IHRoaXMgdG8gY2FsbCB1c2UgeG1hbGxvYy4KLQotICAgQ2FsbGVycyBiZWxvdyBzaG91bGQgdXNlIG1hbGxvYy4gICovCi0KLSNpZm5kZWYgZW1hY3MKLSNkZWZpbmUgbWFsbG9jIHhtYWxsb2MKLSNlbmRpZgotZXh0ZXJuIHBvaW50ZXIgbWFsbG9jICgpOwotCi0vKiBEZWZpbmUgU1RBQ0tfRElSRUNUSU9OIGlmIHlvdSBrbm93IHRoZSBkaXJlY3Rpb24gb2Ygc3RhY2sKLSAgIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKLSAgIGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0KLSAgIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSAgIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotICAgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24gICovCi0KLSNpZm5kZWYgU1RBQ0tfRElSRUNUSU9OCi0jZGVmaW5lCVNUQUNLX0RJUkVDVElPTgkwCS8qIERpcmVjdGlvbiB1bmtub3duLiAgKi8KLSNlbmRpZgotCi0jaWYgU1RBQ0tfRElSRUNUSU9OICE9IDAKLQotI2RlZmluZQlTVEFDS19ESVIJU1RBQ0tfRElSRUNUSU9OCS8qIEtub3duIGF0IGNvbXBpbGUtdGltZS4gICovCi0KLSNlbHNlIC8qIFNUQUNLX0RJUkVDVElPTiA9PSAwOyBuZWVkIHJ1bi10aW1lIGNvZGUuICAqLwotCi1zdGF0aWMgaW50IHN0YWNrX2RpcjsJCS8qIDEgb3IgLTEgb25jZSBrbm93bi4gICovCi0jZGVmaW5lCVNUQUNLX0RJUglzdGFja19kaXIKLQotc3RhdGljIHZvaWQKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gTlVMTDsJLyogQWRkcmVzcyBvZiBmaXJzdCBgZHVtbXknLCBvbmNlIGtub3duLiAgKi8KLSAgYXV0byBjaGFyIGR1bW15OwkJLyogVG8gZ2V0IHN0YWNrIGFkZHJlc3MuICAqLwotCi0gIGlmIChhZGRyID09IE5VTEwpCi0gICAgewkJCQkvKiBJbml0aWFsIGVudHJ5LiAgKi8KLSAgICAgIGFkZHIgPSBBRERSRVNTX0ZVTkNUSU9OIChkdW1teSk7Ci0KLSAgICAgIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwkvKiBSZWN1cnNlIG9uY2UuICAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNlY29uZCBlbnRyeS4gICovCi0gICAgICBpZiAoQUREUkVTU19GVU5DVElPTiAoZHVtbXkpID4gYWRkcikKLQlzdGFja19kaXIgPSAxOwkJLyogU3RhY2sgZ3JldyB1cHdhcmQuICAqLwotICAgICAgZWxzZQotCXN0YWNrX2RpciA9IC0xOwkJLyogU3RhY2sgZ3JldyBkb3dud2FyZC4gICovCi0gICAgfQotfQotCi0jZW5kaWYgLyogU1RBQ0tfRElSRUNUSU9OID09IDAgKi8KLQotLyogQW4gImFsbG9jYSBoZWFkZXIiIGlzIHVzZWQgdG86Ci0gICAoYSkgY2hhaW4gdG9nZXRoZXIgYWxsIGFsbG9jYSdlZCBibG9ja3M7Ci0gICAoYikga2VlcCB0cmFjayBvZiBzdGFjayBkZXB0aC4KLQotICAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCBzaXplb2YoaGVhZGVyKSBhZ3JlZSB3aXRoIG1hbGxvYwotICAgYWxpZ25tZW50IGNodW5rIHNpemUuICBUaGUgZm9sbG93aW5nIGRlZmF1bHQgc2hvdWxkIHdvcmsgb2theS4gICovCi0KLSNpZm5kZWYJQUxJR05fU0laRQotI2RlZmluZQlBTElHTl9TSVpFCXNpemVvZihkb3VibGUpCi0jZW5kaWYKLQotdHlwZWRlZiB1bmlvbiBoZHIKLXsKLSAgY2hhciBhbGlnbltBTElHTl9TSVpFXTsJLyogVG8gZm9yY2Ugc2l6ZW9mKGhlYWRlcikuICAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bmlvbiBoZHIgKm5leHQ7CQkvKiBGb3IgY2hhaW5pbmcgaGVhZGVycy4gICovCi0gICAgICBjaGFyICpkZWVwOwkJLyogRm9yIHN0YWNrIGRlcHRoIG1lYXN1cmUuICAqLwotICAgIH0gaDsKLX0gaGVhZGVyOwotCi1zdGF0aWMgaGVhZGVyICpsYXN0X2FsbG9jYV9oZWFkZXIgPSBOVUxMOwkvKiAtPiBsYXN0IGFsbG9jYSBoZWFkZXIuICAqLwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGF0IGxlYXN0IFNJWkUgYnl0ZXMgb2Ygc3RvcmFnZSwKLSAgIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWNsYWltZWQgdXBvbiBleGl0IGZyb20KLSAgIHRoZSBwcm9jZWR1cmUgdGhhdCBjYWxsZWQgYWxsb2NhLiAgT3JpZ2luYWxseSwgdGhpcyBzcGFjZQotICAgd2FzIHN1cHBvc2VkIHRvIGJlIHRha2VuIGZyb20gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUgb2YgdGhlCi0gICBjYWxsZXIsIGJ1dCB0aGF0IG1ldGhvZCBjYW5ub3QgYmUgbWFkZSB0byB3b3JrIGZvciBzb21lCi0gICBpbXBsZW1lbnRhdGlvbnMgb2YgQywgZm9yIGV4YW1wbGUgdW5kZXIgR291bGQncyBVVFgvMzIuICAqLwotCi1wb2ludGVyCi1hbGxvY2EgKHNpemUpCi0gICAgIHVuc2lnbmVkIHNpemU7Ci17Ci0gIGF1dG8gY2hhciBwcm9iZTsJCS8qIFByb2JlcyBzdGFjayBkZXB0aDogKi8KLSAgcmVnaXN0ZXIgY2hhciAqZGVwdGggPSBBRERSRVNTX0ZVTkNUSU9OIChwcm9iZSk7Ci0KLSNpZiBTVEFDS19ESVJFQ1RJT04gPT0gMAotICBpZiAoU1RBQ0tfRElSID09IDApCQkvKiBVbmtub3duIGdyb3d0aCBkaXJlY3Rpb24uICAqLwotICAgIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotI2VuZGlmCi0KLSAgLyogUmVjbGFpbSBnYXJiYWdlLCBkZWZpbmVkIGFzIGFsbCBhbGxvY2EnZCBzdG9yYWdlIHRoYXQKLSAgICAgd2FzIGFsbG9jYXRlZCBmcm9tIGRlZXBlciBpbiB0aGUgc3RhY2sgdGhhbiBjdXJyZW50bHkuICAqLwotCi0gIHsKLSAgICByZWdpc3RlciBoZWFkZXIgKmhwOwkvKiBUcmF2ZXJzZXMgbGlua2VkIGxpc3QuICAqLwotCi0jaWZkZWYgZW1hY3MKLSAgICBCTE9DS19JTlBVVDsKLSNlbmRpZgotCi0gICAgZm9yIChocCA9IGxhc3RfYWxsb2NhX2hlYWRlcjsgaHAgIT0gTlVMTDspCi0gICAgICBpZiAoKFNUQUNLX0RJUiA+IDAgJiYgaHAtPmguZGVlcCA+IGRlcHRoKQotCSAgfHwgKFNUQUNLX0RJUiA8IDAgJiYgaHAtPmguZGVlcCA8IGRlcHRoKSkKLQl7Ci0JICByZWdpc3RlciBoZWFkZXIgKm5wID0gaHAtPmgubmV4dDsKLQotCSAgZnJlZSAoKHBvaW50ZXIpIGhwKTsJLyogQ29sbGVjdCBnYXJiYWdlLiAgKi8KLQotCSAgaHAgPSBucDsJCS8qIC0+IG5leHQgaGVhZGVyLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7CQkJLyogUmVzdCBhcmUgbm90IGRlZXBlci4gICovCi0KLSAgICBsYXN0X2FsbG9jYV9oZWFkZXIgPSBocDsJLyogLT4gbGFzdCB2YWxpZCBzdG9yYWdlLiAgKi8KLQotI2lmZGVmIGVtYWNzCi0gICAgVU5CTE9DS19JTlBVVDsKLSNlbmRpZgotICB9Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICByZXR1cm4gTlVMTDsJCS8qIE5vIGFsbG9jYXRpb24gcmVxdWlyZWQuICAqLwotCi0gIC8qIEFsbG9jYXRlIGNvbWJpbmVkIGhlYWRlciArIHVzZXIgZGF0YSBzdG9yYWdlLiAgKi8KLQotICB7Ci0gICAgcmVnaXN0ZXIgcG9pbnRlciBuZXcgPSBtYWxsb2MgKHNpemVvZiAoaGVhZGVyKSArIHNpemUpOwotICAgIC8qIEFkZHJlc3Mgb2YgaGVhZGVyLiAgKi8KLQotICAgIGlmIChuZXcgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICAoKGhlYWRlciAqKSBuZXcpLT5oLm5leHQgPSBsYXN0X2FsbG9jYV9oZWFkZXI7Ci0gICAgKChoZWFkZXIgKikgbmV3KS0+aC5kZWVwID0gZGVwdGg7Ci0KLSAgICBsYXN0X2FsbG9jYV9oZWFkZXIgPSAoaGVhZGVyICopIG5ldzsKLQotICAgIC8qIFVzZXIgc3RvcmFnZSBiZWdpbnMganVzdCBhZnRlciBoZWFkZXIuICAqLwotCi0gICAgcmV0dXJuIChwb2ludGVyKSAoKGNoYXIgKikgbmV3ICsgc2l6ZW9mIChoZWFkZXIpKTsKLSAgfQotfQotCi0jaWYgZGVmaW5lZCAoQ1JBWSkgJiYgZGVmaW5lZCAoQ1JBWV9TVEFDS1NFR19FTkQpCi0KLSNpZmRlZiBERUJVR19JMDBBRlVOQwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBDUkFZX1NUQUNLCi0jZGVmaW5lIENSQVlfU1RBQ0sKLSNpZm5kZWYgQ1JBWTIKLS8qIFN0YWNrIHN0cnVjdHVyZXMgZm9yIENSQVktMSwgQ1JBWSBYLU1QLCBhbmQgQ1JBWSBZLU1QICovCi1zdHJ1Y3Qgc3RhY2tfY29udHJvbF9oZWFkZXIKLSAgewotICAgIGxvbmcgc2hncm93OjMyOwkJLyogTnVtYmVyIG9mIHRpbWVzIHN0YWNrIGhhcyBncm93bi4gICovCi0gICAgbG9uZyBzaGFzZWc6MzI7CQkvKiBTaXplIG9mIGluY3JlbWVudHMgdG8gc3RhY2suICAqLwotICAgIGxvbmcgc2hod206MzI7CQkvKiBIaWdoIHdhdGVyIG1hcmsgb2Ygc3RhY2suICAqLwotICAgIGxvbmcgc2hzaXplOjMyOwkJLyogQ3VycmVudCBzaXplIG9mIHN0YWNrIChhbGwgc2VnbWVudHMpLiAgKi8KLSAgfTsKLQotLyogVGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sIGluZm9ybWF0aW9uIG9jY3VycyBhdAotICAgdGhlIGhpZ2gtYWRkcmVzcyBlbmQgb2YgYSBzdGFjayBzZWdtZW50LiAgKFRoZSBzdGFjawotICAgZ3Jvd3MgZnJvbSBsb3cgYWRkcmVzc2VzIHRvIGhpZ2ggYWRkcmVzc2VzLikgIFRoZSBpbml0aWFsCi0gICBwYXJ0IG9mIHRoZSBzdGFjayBzZWdtZW50IGxpbmthZ2UgY29udHJvbCBpbmZvcm1hdGlvbiBpcwotICAgMDIwMCAob2N0YWwpIHdvcmRzLiAgVGhpcyBwcm92aWRlcyBmb3IgcmVnaXN0ZXIgc3RvcmFnZQotICAgZm9yIHRoZSByb3V0aW5lIHdoaWNoIG92ZXJmbG93cyB0aGUgc3RhY2suICAqLwotCi1zdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlCi0gIHsKLSAgICBsb25nIHNzWzAyMDBdOwkJLyogMDIwMCBvdmVyZmxvdyB3b3Jkcy4gICovCi0gICAgbG9uZyBzc3NpemU6MzI7CQkvKiBOdW1iZXIgb2Ygd29yZHMgaW4gdGhpcyBzZWdtZW50LiAgKi8KLSAgICBsb25nIHNzYmFzZTozMjsJCS8qIE9mZnNldCB0byBzdGFjayBiYXNlLiAgKi8KLSAgICBsb25nOjMyOwotICAgIGxvbmcgc3Nwc2VnOjMyOwkJLyogT2Zmc2V0IHRvIGxpbmthZ2UgY29udHJvbCBvZiBwcmV2aW91cwotCQkJCSAgIHNlZ21lbnQgb2Ygc3RhY2suICAqLwotICAgIGxvbmc6MzI7Ci0gICAgbG9uZyBzc3RjcHQ6MzI7CQkvKiBQb2ludGVyIHRvIHRhc2sgY29tbW9uIGFkZHJlc3MgYmxvY2suICAqLwotICAgIGxvbmcgc3Njc25tOwkJLyogUHJpdmF0ZSBjb250cm9sIHN0cnVjdHVyZSBudW1iZXIgZm9yCi0JCQkJICAgbWljcm90YXNraW5nLiAgKi8KLSAgICBsb25nIHNzdXNyMTsJCS8qIFJlc2VydmVkIGZvciB1c2VyLiAgKi8KLSAgICBsb25nIHNzdXNyMjsJCS8qIFJlc2VydmVkIGZvciB1c2VyLiAgKi8KLSAgICBsb25nIHNzdHBpZDsJCS8qIFByb2Nlc3MgSUQgZm9yIHBpZCBiYXNlZCBtdWx0aS10YXNraW5nLiAgKi8KLSAgICBsb25nIHNzZ3Z1cDsJCS8qIFBvaW50ZXIgdG8gbXVsdGl0YXNraW5nIHRocmVhZCBnaXZldXAuICAqLwotICAgIGxvbmcgc3NjcmF5WzddOwkJLyogUmVzZXJ2ZWQgZm9yIENyYXkgUmVzZWFyY2guICAqLwotICAgIGxvbmcgc3NhMDsKLSAgICBsb25nIHNzYTE7Ci0gICAgbG9uZyBzc2EyOwotICAgIGxvbmcgc3NhMzsKLSAgICBsb25nIHNzYTQ7Ci0gICAgbG9uZyBzc2E1OwotICAgIGxvbmcgc3NhNjsKLSAgICBsb25nIHNzYTc7Ci0gICAgbG9uZyBzc3MwOwotICAgIGxvbmcgc3NzMTsKLSAgICBsb25nIHNzczI7Ci0gICAgbG9uZyBzc3MzOwotICAgIGxvbmcgc3NzNDsKLSAgICBsb25nIHNzczU7Ci0gICAgbG9uZyBzc3M2OwotICAgIGxvbmcgc3NzNzsKLSAgfTsKLQotI2Vsc2UgLyogQ1JBWTIgKi8KLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgdGhlIHZlY3RvciBvZiB3b3JkcwotICAgcmV0dXJuZWQgYnkgdGhlIFNUS1NUQVQgbGlicmFyeSByb3V0aW5lLiAgKi8KLXN0cnVjdCBzdGtfc3RhdAotICB7Ci0gICAgbG9uZyBub3c7CQkJLyogQ3VycmVudCB0b3RhbCBzdGFjayBzaXplLiAgKi8KLSAgICBsb25nIG1heGM7CQkJLyogQW1vdW50IG9mIGNvbnRpZ3VvdXMgc3BhY2Ugd2hpY2ggd291bGQKLQkJCQkgICBiZSByZXF1aXJlZCB0byBzYXRpc2Z5IHRoZSBtYXhpbXVtCi0JCQkJICAgc3RhY2sgZGVtYW5kIHRvIGRhdGUuICAqLwotICAgIGxvbmcgaGlnaF93YXRlcjsJCS8qIFN0YWNrIGhpZ2gtd2F0ZXIgbWFyay4gICovCi0gICAgbG9uZyBvdmVyZmxvd3M7CQkvKiBOdW1iZXIgb2Ygc3RhY2sgb3ZlcmZsb3cgKCRTVEtPRkVOKSBjYWxscy4gICovCi0gICAgbG9uZyBoaXRzOwkJCS8qIE51bWJlciBvZiBpbnRlcm5hbCBidWZmZXIgaGl0cy4gICovCi0gICAgbG9uZyBleHRlbmRzOwkJLyogTnVtYmVyIG9mIGJsb2NrIGV4dGVuc2lvbnMuICAqLwotICAgIGxvbmcgc3Rrb19tYWxsb2NzOwkJLyogQmxvY2sgYWxsb2NhdGlvbnMgYnkgJFNUS09GRU4uICAqLwotICAgIGxvbmcgdW5kZXJmbG93czsJCS8qIE51bWJlciBvZiBzdGFjayB1bmRlcmZsb3cgY2FsbHMgKCRTVEtSRVROKS4gICovCi0gICAgbG9uZyBzdGtvX2ZyZWU7CQkvKiBOdW1iZXIgb2YgZGVhbGxvY2F0aW9ucyBieSAkU1RLUkVUTi4gICovCi0gICAgbG9uZyBzdGttX2ZyZWU7CQkvKiBOdW1iZXIgb2YgZGVhbGxvY2F0aW9ucyBieSAkU1RLTVJFVC4gICovCi0gICAgbG9uZyBzZWdtZW50czsJCS8qIEN1cnJlbnQgbnVtYmVyIG9mIHN0YWNrIHNlZ21lbnRzLiAgKi8KLSAgICBsb25nIG1heHM7CQkJLyogTWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgc2VnbWVudHMgc28gZmFyLiAgKi8KLSAgICBsb25nIHBhZF9zaXplOwkJLyogU3RhY2sgcGFkIHNpemUuICAqLwotICAgIGxvbmcgY3VycmVudF9hZGRyZXNzOwkvKiBDdXJyZW50IHN0YWNrIHNlZ21lbnQgYWRkcmVzcy4gICovCi0gICAgbG9uZyBjdXJyZW50X3NpemU7CQkvKiBDdXJyZW50IHN0YWNrIHNlZ21lbnQgc2l6ZS4gIFRoaXMKLQkJCQkgICBudW1iZXIgaXMgYWN0dWFsbHkgY29ycnVwdGVkIGJ5IFNUS1NUQVQgdG8KLQkJCQkgICBpbmNsdWRlIHRoZSBmaWZ0ZWVuIHdvcmQgdHJhaWxlciBhcmVhLiAgKi8KLSAgICBsb25nIGluaXRpYWxfYWRkcmVzczsJLyogQWRkcmVzcyBvZiBpbml0aWFsIHNlZ21lbnQuICAqLwotICAgIGxvbmcgaW5pdGlhbF9zaXplOwkJLyogU2l6ZSBvZiBpbml0aWFsIHNlZ21lbnQuICAqLwotICB9OwotCi0vKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGRhdGEgc3RydWN0dXJlIHdoaWNoIHRyYWlscwotICAgYW55IHN0YWNrIHNlZ21lbnQuICBJIHRoaW5rIHRoYXQgdGhlIGRlc2NyaXB0aW9uIGluICdhc2RlZicgaXMKLSAgIG91dCBvZiBkYXRlLiAgSSBvbmx5IGRlc2NyaWJlIHRoZSBwYXJ0cyB0aGF0IEkgYW0gc3VyZSBhYm91dC4gICovCi0KLXN0cnVjdCBzdGtfdHJhaWxlcgotICB7Ci0gICAgbG9uZyB0aGlzX2FkZHJlc3M7CQkvKiBBZGRyZXNzIG9mIHRoaXMgYmxvY2suICAqLwotICAgIGxvbmcgdGhpc19zaXplOwkJLyogU2l6ZSBvZiB0aGlzIGJsb2NrIChkb2VzIG5vdCBpbmNsdWRlCi0JCQkJICAgdGhpcyB0cmFpbGVyKS4gICovCi0gICAgbG9uZyB1bmtub3duMjsKLSAgICBsb25nIHVua25vd24zOwotICAgIGxvbmcgbGluazsJCQkvKiBBZGRyZXNzIG9mIHRyYWlsZXIgYmxvY2sgb2YgcHJldmlvdXMKLQkJCQkgICBzZWdtZW50LiAgKi8KLSAgICBsb25nIHVua25vd241OwotICAgIGxvbmcgdW5rbm93bjY7Ci0gICAgbG9uZyB1bmtub3duNzsKLSAgICBsb25nIHVua25vd244OwotICAgIGxvbmcgdW5rbm93bjk7Ci0gICAgbG9uZyB1bmtub3duMTA7Ci0gICAgbG9uZyB1bmtub3duMTE7Ci0gICAgbG9uZyB1bmtub3duMTI7Ci0gICAgbG9uZyB1bmtub3duMTM7Ci0gICAgbG9uZyB1bmtub3duMTQ7Ci0gIH07Ci0KLSNlbmRpZiAvKiBDUkFZMiAqLwotI2VuZGlmIC8qIG5vdCBDUkFZX1NUQUNLICovCi0KLSNpZmRlZiBDUkFZMgotLyogRGV0ZXJtaW5lIGEgInN0YWNrIG1lYXN1cmUiIGZvciBhbiBhcmJpdHJhcnkgQUREUkVTUy4KLSAgIEkgZG91YnQgdGhhdCAibGludCIgd2lsbCBsaWtlIHRoaXMgbXVjaC4gICovCi0KLXN0YXRpYyBsb25nCi1pMDBhZnVuYyAobG9uZyAqYWRkcmVzcykKLXsKLSAgc3RydWN0IHN0a19zdGF0IHN0YXR1czsKLSAgc3RydWN0IHN0a190cmFpbGVyICp0cmFpbGVyOwotICBsb25nICpibG9jaywgc2l6ZTsKLSAgbG9uZyByZXN1bHQgPSAwOwotCi0gIC8qIFdlIHdhbnQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc2VnbWVudHMuICBUaGUgZmlyc3QKLSAgICAgc3RlcCBpcyB0byBnZXQgdGhlIHN0YWNrIHN0YXR1cyBzdHJ1Y3R1cmUuICBXZSBjb3VsZCBkbyB0aGlzCi0gICAgIG1vcmUgcXVpY2tseSBhbmQgbW9yZSBkaXJlY3RseSwgcGVyaGFwcywgYnkgcmVmZXJlbmNpbmcgdGhlCi0gICAgICRMTTAwIGNvbW1vbiBibG9jaywgYnV0IEkga25vdyB0aGF0IHRoaXMgd29ya3MuICAqLwotCi0gIFNUS1NUQVQgKCZzdGF0dXMpOwotCi0gIC8qIFNldCB1cCB0aGUgaXRlcmF0aW9uLiAgKi8KLQotICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSAoc3RhdHVzLmN1cnJlbnRfYWRkcmVzcwotCQkJCSAgICArIHN0YXR1cy5jdXJyZW50X3NpemUKLQkJCQkgICAgLSAxNSk7Ci0KLSAgLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgc3RhY2sgc2VnbWVudC4gIFRoZXJlZm9yZSBpdCBpcwotICAgICBhIGZhdGFsIGVycm9yIGlmICJ0cmFpbGVyIiBpcyBudWxsLiAgKi8KLQotICBpZiAodHJhaWxlciA9PSAwKQotICAgIGFib3J0ICgpOwotCi0gIC8qIERpc2NhcmQgc2VnbWVudHMgdGhhdCBkbyBub3QgY29udGFpbiBvdXIgYXJndW1lbnQgYWRkcmVzcy4gICovCi0KLSAgd2hpbGUgKHRyYWlsZXIgIT0gMCkKLSAgICB7Ci0gICAgICBibG9jayA9IChsb25nICopIHRyYWlsZXItPnRoaXNfYWRkcmVzczsKLSAgICAgIHNpemUgPSB0cmFpbGVyLT50aGlzX3NpemU7Ci0gICAgICBpZiAoYmxvY2sgPT0gMCB8fCBzaXplID09IDApCi0JYWJvcnQgKCk7Ci0gICAgICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSB0cmFpbGVyLT5saW5rOwotICAgICAgaWYgKChibG9jayA8PSBhZGRyZXNzKSAmJiAoYWRkcmVzcyA8IChibG9jayArIHNpemUpKSkKLQlicmVhazsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSByZXN1bHQgdG8gdGhlIG9mZnNldCBpbiB0aGlzIHNlZ21lbnQgYW5kIGFkZCB0aGUgc2l6ZXMKLSAgICAgb2YgYWxsIHByZWRlY2Vzc29yIHNlZ21lbnRzLiAgKi8KLQotICByZXN1bHQgPSBhZGRyZXNzIC0gYmxvY2s7Ci0KLSAgaWYgKHRyYWlsZXIgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGlmICh0cmFpbGVyLT50aGlzX3NpemUgPD0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJlc3VsdCArPSB0cmFpbGVyLT50aGlzX3NpemU7Ci0gICAgICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSB0cmFpbGVyLT5saW5rOwotICAgIH0KLSAgd2hpbGUgKHRyYWlsZXIgIT0gMCk7Ci0KLSAgLyogV2UgYXJlIGRvbmUuICBOb3RlIHRoYXQgaWYgeW91IHByZXNlbnQgYSBib2d1cyBhZGRyZXNzIChvbmUKLSAgICAgbm90IGluIGFueSBzZWdtZW50KSwgeW91IHdpbGwgZ2V0IGEgZGlmZmVyZW50IG51bWJlciBiYWNrLCBmb3JtZWQKLSAgICAgZnJvbSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYmxvY2suICBUaGlzIGlzIHByb2JhYmx5Ci0gICAgIG5vdCB3aGF0IHlvdSB3YW50LiAgKi8KLQotICByZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLSNlbHNlIC8qIG5vdCBDUkFZMiAqLwotLyogU3RhY2sgYWRkcmVzcyBmdW5jdGlvbiBmb3IgYSBDUkFZLTEsIENSQVkgWC1NUCwgb3IgQ1JBWSBZLU1QLgotICAgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhlIGNlbGwgd2l0aGluIHRoZSBzdGFjaywKLSAgIGdpdmVuIHRoZSBhZGRyZXNzIG9mIHRoZSBjZWxsLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcwotICAgcm91dGluZSBpcyB0byBsaW5lYXJpemUsIGluIHNvbWUgc2Vuc2UsIHN0YWNrIGFkZHJlc3NlcwotICAgZm9yIGFsbG9jYS4gICovCi0KLXN0YXRpYyBsb25nCi1pMDBhZnVuYyAobG9uZyBhZGRyZXNzKQotewotICBsb25nIHN0a2wgPSAwOwotCi0gIGxvbmcgc2l6ZSwgcHNlZywgdGhpc19zZWdtZW50LCBzdGFjazsKLSAgbG9uZyByZXN1bHQgPSAwOwotCi0gIHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKnNzcHRyOwotCi0gIC8qIFJlZ2lzdGVyIEI2NyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZQotICAgICBjdXJyZW50IHN0YWNrIHNlZ21lbnQuICBJZiB5b3UgKGFzIGEgc3VicHJvZ3JhbSkgc3RvcmUKLSAgICAgeW91ciByZWdpc3RlcnMgb24gdGhlIHN0YWNrIGFuZCBmaW5kIHRoYXQgeW91IGFyZSBwYXN0Ci0gICAgIHRoZSBjb250ZW50cyBvZiBCNjcsIHlvdSBoYXZlIG92ZXJmbG93ZWQgdGhlIHNlZ21lbnQuCi0KLSAgICAgQjY3IGFsc28gcG9pbnRzIHRvIHRoZSBzdGFjayBzZWdtZW50IGxpbmthZ2UgY29udHJvbAotICAgICBhcmVhLCB3aGljaCBpcyB3aGF0IHdlIGFyZSByZWFsbHkgaW50ZXJlc3RlZCBpbi4gICovCi0KLSAgc3RrbCA9IENSQVlfU1RBQ0tTRUdfRU5EICgpOwotICBzc3B0ciA9IChzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICopIHN0a2w7Ci0KLSAgLyogSWYgb25lIHN1YnRyYWN0cyAnc2l6ZScgZnJvbSB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LAotICAgICBvbmUgaGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzZWdtZW50LgotCi0gICAgIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBzZWdtZW50LCAncHNlZycgd2lsbCBiZQotICAgICBub256ZXJvLiAgKi8KLQotICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0KLSAgdGhpc19zZWdtZW50ID0gc3RrbCAtIHNpemU7Ci0KLSAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBjYWxsaW5nIHRoaXMgcm91dGluZSBpdHNlbGYgY2F1c2VkCi0gICAgIGEgc3RhY2sgb3ZlcmZsb3cuICBEaXNjYXJkIHN0YWNrIHNlZ21lbnRzIHdoaWNoIGRvIG5vdAotICAgICBjb250YWluIHRoZSB0YXJnZXQgYWRkcmVzcy4gICovCi0KLSAgd2hpbGUgKCEodGhpc19zZWdtZW50IDw9IGFkZHJlc3MgJiYgYWRkcmVzcyA8PSBzdGtsKSkKLSAgICB7Ci0jaWZkZWYgREVCVUdfSTAwQUZVTkMKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMTFvICUwMTFvICUwMTFvXG4iLCB0aGlzX3NlZ21lbnQsIGFkZHJlc3MsIHN0a2wpOwotI2VuZGlmCi0gICAgICBpZiAocHNlZyA9PSAwKQotCWJyZWFrOwotICAgICAgc3RrbCA9IHN0a2wgLSBwc2VnOwotICAgICAgc3NwdHIgPSAoc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqKSBzdGtsOwotICAgICAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0gICAgICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgICAgIHRoaXNfc2VnbWVudCA9IHN0a2wgLSBzaXplOwotICAgIH0KLQotICByZXN1bHQgPSBhZGRyZXNzIC0gdGhpc19zZWdtZW50OwotCi0gIC8qIElmIHlvdSBzdWJ0cmFjdCBwc2VnIGZyb20gdGhlIGN1cnJlbnQgZW5kIG9mIHRoZSBzdGFjaywKLSAgICAgeW91IGdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcHJldmlvdXMgc3RhY2sgc2VnbWVudCdzIGVuZC4KLSAgICAgVGhpcyBzZWVtcyBhIGxpdHRsZSBjb252b2x1dGVkIHRvIG1lLCBidXQgSSdsbCBiZXQgeW91IHNhdmUKLSAgICAgYSBjeWNsZSBzb21ld2hlcmUuICAqLwotCi0gIHdoaWxlIChwc2VnICE9IDApCi0gICAgewotI2lmZGVmIERFQlVHX0kwMEFGVU5DCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlMDExbyAlMDExb1xuIiwgcHNlZywgc2l6ZSk7Ci0jZW5kaWYKLSAgICAgIHN0a2wgPSBzdGtsIC0gcHNlZzsKLSAgICAgIHNzcHRyID0gKHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKikgc3RrbDsKLSAgICAgIHNpemUgPSBzc3B0ci0+c3NzaXplOwotICAgICAgcHNlZyA9IHNzcHRyLT5zc3BzZWc7Ci0gICAgICByZXN1bHQgKz0gc2l6ZTsKLSAgICB9Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotI2VuZGlmIC8qIG5vdCBDUkFZMiAqLwotI2VuZGlmIC8qIENSQVkgKi8KLQotI2VuZGlmIC8qIG5vIGFsbG9jYSAqLwotI2VuZGlmIC8qIG5vdCBHQ0MgdmVyc2lvbiAyICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXJndi5jIGIvbGliaWJlcnR5L2FyZ3YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5NmZmZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYXJndi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qIENyZWF0ZSBhbmQgZGVzdHJveSBhcmd1bWVudCB2ZWN0b3JzIChhcmd2J3MpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qICBDcmVhdGUgYW5kIGRlc3Ryb3kgYXJndW1lbnQgdmVjdG9ycy4gIEFuIGFyZ3VtZW50IHZlY3RvciBpcyBzaW1wbHkgYW4KLSAgICBhcnJheSBvZiBzdHJpbmcgcG9pbnRlcnMsIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIHBvaW50ZXIuICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgaXNzcGFjZQotI3VuZGVmIGlzc3BhY2UKLSNlbmRpZgotI2RlZmluZSBpc3NwYWNlKGNoKSAoKGNoKSA9PSAnICcgfHwgKGNoKSA9PSAnXHQnKQotCi0vKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLwotCi0jaWZkZWYgX19TVERDX18KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLQotI2lmICFkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fR05VQ19fCi1leHRlcm4gY2hhciAqbWVtY3B5ICgpOwkJLyogQ29weSBtZW1vcnkgcmVnaW9uICovCi1leHRlcm4gaW50IHN0cmxlbiAoKTsJCS8qIENvdW50IGxlbmd0aCBvZiBzdHJpbmcgKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqcmVhbGxvYyAoKTsJLyogU3RhbmRhcmQgbWVtb3J5IHJlYWxsb2NhdG9yICovCi1leHRlcm4gdm9pZCBmcmVlICgpOwkJLyogRnJlZSBtYWxsb2MnZCBtZW1vcnkgKi8KLWV4dGVybiBjaGFyICpzdHJkdXAgKCk7CQkvKiBEdXBsaWNhdGUgYSBzdHJpbmcgKi8KLSNlbmRpZgotCi0jZW5kaWYJLyogX19TVERDX18gKi8KLQotI2luY2x1ZGUgImFsbG9jYS1jb25mLmgiCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0jaWZuZGVmIEVPUwotI2RlZmluZSBFT1MgJ1wwJwotI2VuZGlmCi0KLSNkZWZpbmUgSU5JVElBTF9NQVhBUkdDIDgJLyogTnVtYmVyIG9mIGFyZ3MgKyBOVUxMIGluIGluaXRpYWwgYXJndiAqLwotCi0KLS8qCi0KLU5BTUUKLQotCWR1cGFyZ3YgLS0gZHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3RvcgotCi1TWU5PUFNJUwotCi0JY2hhciAqKmR1cGFyZ3YgKHZlY3RvcikKLQljaGFyICoqdmVjdG9yOwotCi1ERVNDUklQVElPTgotCi0JRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gIFNpbXBseSBzY2FucyB0aHJvdWdoIHRoZQotCXZlY3RvciwgZHVwbGljYXRpbmcgZWFjaCBhcmd1bWVudCB1bnRpbCB0aGUKLQl0ZXJtaW5hdGluZyBOVUxMIGlzIGZvdW5kLgotCi1SRVRVUk5TCi0KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgdmVjdG9yIGlmCi0Jc3VjY2Vzc2Z1bC4gUmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBtZW1vcnkgdG8KLQljb21wbGV0ZSBidWlsZGluZyB0aGUgYXJndW1lbnQgdmVjdG9yLgotCi0qLwotCi1jaGFyICoqCi1kdXBhcmd2IChhcmd2KQotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGFyZ2M7Ci0gIGNoYXIgKipjb3B5OwotICAKLSAgaWYgKGFyZ3YgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIHRoZSB2ZWN0b3IgKi8KLSAgZm9yIChhcmdjID0gMDsgYXJndlthcmdjXSAhPSBOVUxMOyBhcmdjKyspOwotICBjb3B5ID0gKGNoYXIgKiopIG1hbGxvYyAoKGFyZ2MgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0gIGlmIChjb3B5ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAvKiB0aGUgc3RyaW5ncyAqLwotICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKykKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChhcmd2W2FyZ2NdKTsKLSAgICAgIGNvcHlbYXJnY10gPSBtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIChsZW4gKyAxKSk7Ci0gICAgICBpZiAoY29weVthcmdjXSA9PSBOVUxMKQotCXsKLQkgIGZyZWVhcmd2IChjb3B5KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHN0cmNweSAoY29weVthcmdjXSwgYXJndlthcmdjXSk7Ci0gICAgfQotICBjb3B5W2FyZ2NdID0gTlVMTDsKLSAgcmV0dXJuIGNvcHk7Ci19Ci0KLS8qCi0KLU5BTUUKLQotCWZyZWVhcmd2IC0tIGZyZWUgYW4gYXJndW1lbnQgdmVjdG9yCi0KLVNZTk9QU0lTCi0KLQl2b2lkIGZyZWVhcmd2ICh2ZWN0b3IpCi0JY2hhciAqKnZlY3RvcjsKLQotREVTQ1JJUFRJT04KLQotCUZyZWUgYW4gYXJndW1lbnQgdmVjdG9yIHRoYXQgd2FzIGJ1aWx0IHVzaW5nIGJ1aWxkYXJndi4gIFNpbXBseSBzY2FucwotCXRocm91Z2ggdGhlIHZlY3RvciwgZnJlZWluZyB0aGUgbWVtb3J5IGZvciBlYWNoIGFyZ3VtZW50IHVudGlsIHRoZQotCXRlcm1pbmF0aW5nIE5VTEwgaXMgZm91bmQsIGFuZCB0aGVuIGZyZWVzIHRoZSB2ZWN0b3IgaXRzZWxmLgotCi1SRVRVUk5TCi0KLQlObyB2YWx1ZS4KLQotKi8KLQotdm9pZCBmcmVlYXJndiAodmVjdG9yKQotY2hhciAqKnZlY3RvcjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqKnNjYW47Ci0KLSAgaWYgKHZlY3RvciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoc2NhbiA9IHZlY3RvcjsgKnNjYW4gIT0gTlVMTDsgc2NhbisrKQotCXsKLQkgIGZyZWUgKCpzY2FuKTsKLQl9Ci0gICAgICBmcmVlICh2ZWN0b3IpOwotICAgIH0KLX0KLQotLyoKLQotTkFNRQotCi0JYnVpbGRhcmd2IC0tIGJ1aWxkIGFuIGFyZ3VtZW50IHZlY3RvciBmcm9tIGEgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljaGFyICoqYnVpbGRhcmd2IChzcCkKLQljaGFyICpzcDsKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIGEgcG9pbnRlciB0byBhIHN0cmluZywgcGFyc2UgdGhlIHN0cmluZyBleHRyYWN0aW5nIGZpZWxkcwotCXNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIGFuZCBvcHRpb25hbGx5IGVuY2xvc2VkIHdpdGhpbiBlaXRoZXIgc2luZ2xlCi0Jb3IgZG91YmxlIHF1b3RlcyAod2hpY2ggYXJlIHN0cmlwcGVkIG9mZiksIGFuZCBidWlsZCBhIHZlY3RvciBvZgotCXBvaW50ZXJzIHRvIGNvcGllcyBvZiB0aGUgc3RyaW5nIGZvciBlYWNoIGZpZWxkLiAgVGhlIGlucHV0IHN0cmluZwotCXJlbWFpbnMgdW5jaGFuZ2VkLgotCi0JQWxsIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSBwb2ludGVyIGFycmF5IGFuZCBjb3BpZXMgb2YgdGhlIHN0cmluZwotCWlzIG9idGFpbmVkIGZyb20gbWFsbG9jLiAgQWxsIG9mIHRoZSBtZW1vcnkgY2FuIGJlIHJldHVybmVkIHRvIHRoZQotCXN5c3RlbSB3aXRoIHRoZSBzaW5nbGUgZnVuY3Rpb24gY2FsbCBmcmVlYXJndiwgd2hpY2ggdGFrZXMgdGhlCi0JcmV0dXJuZWQgcmVzdWx0IG9mIGJ1aWxkYXJndiwgYXMgaXQncyBhcmd1bWVudC4KLQotCVRoZSBtZW1vcnkgZm9yIHRoZSBhcmd2IGFycmF5IGlzIGR5bmFtaWNhbGx5IGV4cGFuZGVkIGFzIG5lY2Vzc2FyeS4KLQotUkVUVVJOUwotCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IHZlY3RvciBpZiBzdWNjZXNzZnVsLiBSZXR1cm5zIE5VTEwKLQlpZiB0aGUgaW5wdXQgc3RyaW5nIHBvaW50ZXIgaXMgTlVMTCBvciBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQKLQltZW1vcnkgdG8gY29tcGxldGUgYnVpbGRpbmcgdGhlIGFyZ3VtZW50IHZlY3Rvci4KLQotTk9URVMKLQotCUluIG9yZGVyIHRvIHByb3ZpZGUgYSB3b3JraW5nIGJ1ZmZlciBmb3IgZXh0cmFjdGluZyBhcmd1bWVudHMgaW50bywKLQl3aXRoIGFwcHJvcHJpYXRlIHN0cmlwcGluZyBvZiBxdW90ZXMgYW5kIHRyYW5zbGF0aW9uIG9mIGJhY2tzbGFzaAotCXNlcXVlbmNlcywgd2UgYWxsb2NhdGUgYSB3b3JraW5nIGJ1ZmZlciBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBpbnB1dAotCXN0cmluZy4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBzcGFjZSBpbiB3aGljaCB0bwotCXdvcmssIHNpbmNlIHRoZSBleHRyYWN0ZWQgYXJnIGlzIG5ldmVyIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBzdHJpbmcuCi0KLQlJZiB0aGUgaW5wdXQgaXMgYSBudWxsIHN0cmluZyAoYXMgb3Bwb3NlZCB0byBhIE5VTEwgcG9pbnRlciksIHRoZW4KLQlidWlsZGFyZyByZXR1cm5zIGFuIGFyZ3YgdGhhdCBoYXMgb25lIGFyZywgYSBudWxsIHN0cmluZy4KLQotCUFyZ3YgaXMgYWx3YXlzIGtlcHQgdGVybWluYXRlZCB3aXRoIGEgTlVMTCBhcmcgcG9pbnRlciwgc28gaXQgY2FuCi0JYmUgcGFzc2VkIHRvIGZyZWVhcmd2IGF0IGFueSB0aW1lLCBvciByZXR1cm5lZCwgYXMgYXBwcm9wcmlhdGUuCi0qLwotCi1jaGFyICoqYnVpbGRhcmd2IChpbnB1dCkKLWNoYXIgKmlucHV0OwotewotICBjaGFyICphcmc7Ci0gIGNoYXIgKmNvcHlidWY7Ci0gIGludCBzcXVvdGUgPSAwOwotICBpbnQgZHF1b3RlID0gMDsKLSAgaW50IGJzcXVvdGUgPSAwOwotICBpbnQgYXJnYyA9IDA7Ci0gIGludCBtYXhhcmdjID0gMDsKLSAgY2hhciAqKmFyZ3YgPSBOVUxMOwotICBjaGFyICoqbmFyZ3Y7Ci0KLSAgaWYgKGlucHV0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29weWJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChpbnB1dCkgKyAxKTsKLSAgICAgIC8qIElzIGEgZG97fXdoaWxlIHRvIGFsd2F5cyBleGVjdXRlIHRoZSBsb29wIG9uY2UuICBBbHdheXMgcmV0dXJuIGFuCi0JIGFyZ3YsIGV2ZW4gZm9yIG51bGwgc3RyaW5ncy4gIFNlZSBOT1RFUyBhYm92ZSwgdGVzdCBjYXNlIGJlbG93LiAqLwotICAgICAgZG8KLQl7Ci0JICAvKiBQaWNrIG9mZiBhcmd2W2FyZ2NdICovCi0JICB3aGlsZSAoaXNzcGFjZSAoKmlucHV0KSkKLQkgICAgewotCSAgICAgIGlucHV0Kys7Ci0JICAgIH0KLQkgIGlmICgobWF4YXJnYyA9PSAwKSB8fCAoYXJnYyA+PSAobWF4YXJnYyAtIDEpKSkKLQkgICAgewotCSAgICAgIC8qIGFyZ3YgbmVlZHMgaW5pdGlhbGl6YXRpb24sIG9yIGV4cGFuc2lvbiAqLwotCSAgICAgIGlmIChhcmd2ID09IE5VTEwpCi0JCXsKLQkJICBtYXhhcmdjID0gSU5JVElBTF9NQVhBUkdDOwotCQkgIG5hcmd2ID0gKGNoYXIgKiopIG1hbGxvYyAobWF4YXJnYyAqIHNpemVvZiAoY2hhciAqKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBtYXhhcmdjICo9IDI7Ci0JCSAgbmFyZ3YgPSAoY2hhciAqKikgcmVhbGxvYyAoYXJndiwgbWF4YXJnYyAqIHNpemVvZiAoY2hhciAqKSk7Ci0JCX0KLQkgICAgICBpZiAobmFyZ3YgPT0gTlVMTCkKLQkJewotCQkgIGlmIChhcmd2ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLQkJICAgICAgYXJndiA9IE5VTEw7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBhcmd2ID0gbmFyZ3Y7Ci0JICAgICAgYXJndlthcmdjXSA9IE5VTEw7Ci0JICAgIH0KLQkgIC8qIEJlZ2luIHNjYW5uaW5nIGFyZyAqLwotCSAgYXJnID0gY29weWJ1ZjsKLQkgIHdoaWxlICgqaW5wdXQgIT0gRU9TKQotCSAgICB7Ci0JICAgICAgaWYgKGlzc3BhY2UgKCppbnB1dCkgJiYgIXNxdW90ZSAmJiAhZHF1b3RlICYmICFic3F1b3RlKQotCQl7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoYnNxdW90ZSkKLQkJICAgIHsKLQkJICAgICAgYnNxdW90ZSA9IDA7Ci0JCSAgICAgICphcmcrKyA9ICppbnB1dDsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqaW5wdXQgPT0gJ1xcJykKLQkJICAgIHsKLQkJICAgICAgYnNxdW90ZSA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3F1b3RlKQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICdcJycpCi0JCQl7Ci0JCQkgIHNxdW90ZSA9IDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKGRxdW90ZSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCppbnB1dCA9PSAnIicpCi0JCQl7Ci0JCQkgIGRxdW90ZSA9IDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCppbnB1dCA9PSAnXCcnKQotCQkJewotCQkJICBzcXVvdGUgPSAxOwotCQkJfQotCQkgICAgICBlbHNlIGlmICgqaW5wdXQgPT0gJyInKQotCQkJewotCQkJICBkcXVvdGUgPSAxOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgICphcmcrKyA9ICppbnB1dDsKLQkJCX0KLQkJICAgIH0KLQkJICBpbnB1dCsrOwotCQl9Ci0JICAgIH0KLQkgICphcmcgPSBFT1M7Ci0JICBhcmd2W2FyZ2NdID0gc3RyZHVwIChjb3B5YnVmKTsKLQkgIGlmIChhcmd2W2FyZ2NdID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlYXJndiAoYXJndik7Ci0JICAgICAgYXJndiA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGFyZ2MrKzsKLQkgIGFyZ3ZbYXJnY10gPSBOVUxMOwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKmlucHV0KSkKLQkgICAgewotCSAgICAgIGlucHV0Kys7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0ICE9IEVPUyk7Ci0gICAgfQotICByZXR1cm4gKGFyZ3YpOwotfQotCi0jaWZkZWYgTUFJTgotCi0vKiBTaW1wbGUgbGl0dGxlIHRlc3QgZHJpdmVyLiAqLwotCi1zdGF0aWMgY2hhciAqdGVzdHNbXSA9Ci17Ci0gICJhIHNpbXBsZSBjb21tYW5kIGxpbmUiLAotICAiYXJnICdmb28nIGlzIHNpbmdsZSBxdW90ZWQiLAotICAiYXJnIFwiYmFyXCIgaXMgZG91YmxlIHF1b3RlZCIsCi0gICJhcmcgXCJmb28gYmFyXCIgaGFzIGVtYmVkZGVkIHdoaXRlc3BhY2UiLAotICAiYXJnICdKYWNrIHNhaWQgXFwnaGlcXCcnIGhhcyBzaW5nbGUgcXVvdGVzIiwKLSAgImFyZyAnSmFjayBzYWlkIFxcXCJoaVxcXCInIGhhcyBkb3VibGUgcXVvdGVzIiwKLSAgImEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgeiAxIDIgMyA0IDUgNiA3IDggOSIsCi0gIAotICAvKiBUaGlzIHNob3VsZCBiZSBleHBhbmRlZCBpbnRvIG9ubHkgb25lIGFyZ3VtZW50LiAgKi8KLSAgInRyYWlsaW5nLXdoaXRlc3BhY2UgIiwKLQotICAiIiwKLSAgTlVMTAotfTsKLQotbWFpbiAoKQotewotICBjaGFyICoqYXJndjsKLSAgY2hhciAqKnRlc3Q7Ci0gIGNoYXIgKip0YXJnczsKLQotICBmb3IgKHRlc3QgPSB0ZXN0czsgKnRlc3QgIT0gTlVMTDsgdGVzdCsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoImJ1aWxkYXJndihcIiVzXCIpXG4iLCAqdGVzdCk7Ci0gICAgICBpZiAoKGFyZ3YgPSBidWlsZGFyZ3YgKCp0ZXN0KSkgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJmYWlsZWQhXG5cbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKHRhcmdzID0gYXJndjsgKnRhcmdzICE9IE5VTEw7IHRhcmdzKyspCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcdFwiJXNcIlxuIiwgKnRhcmdzKTsKLQkgICAgfQotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBmcmVlYXJndiAoYXJndik7Ci0gICAgfQotCi19Ci0KLSNlbmRpZgkvKiBNQUlOICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXNwcmludGYuYyBiL2xpYmliZXJ0eS9hc3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWFmMzIwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hc3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogTGlrZSBzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmIGRlZmluZWQgKEFOU0lfUFJPVE9UWVBFUykgfHwgZGVmaW5lZCAoQUxNT1NUX1NUREMpCi0jZGVmaW5lIFVTRV9TVERBUkcKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotLyogVkFSQVJHUyAqLwotI2lmZGVmIFVTRV9TVERBUkcKLWludAotYXNwcmludGYgKGNoYXIgKipidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotI2Vsc2UKLWludAotYXNwcmludGYgKGJ1ZiwgZm10LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICBpbnQgc3RhdHVzOwotICB2YV9saXN0IGFwOwotI2lmZGVmIFVTRV9TVERBUkcKLSAgdmFfc3RhcnQgKGFwLCBmbXQpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFwKTsKLSNlbmRpZgotICBzdGF0dXMgPSB2YXNwcmludGYgKGJ1ZiwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2F0ZXhpdC5jIGIvbGliaWJlcnR5L2F0ZXhpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdkOTg1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hdGV4aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIFdyYXBwZXIgdG8gaW1wbGVtZW50IEFOU0kgQydzIGF0ZXhpdCB1c2luZyBTdW5PUydzIG9uX2V4aXQuICovCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgLS1NaWtlIFN0dW1wLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX09OX0VYSVQKLQotaW50Ci1hdGV4aXQoZikKLSAgICAgdm9pZCAoKmYpKCk7Ci17Ci0gIC8qIElmIHRoZSBzeXN0ZW0gZG9lc24ndCBwcm92aWRlIGEgZGVmaW5pdGlvbiBmb3IgYXRleGl0LCB1c2Ugb25fZXhpdAotICAgICBpZiB0aGUgc3lzdGVtIHByb3ZpZGVzIHRoYXQuICAqLwotICBvbl9leGl0IChmLCAwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Jhc2VuYW1lLmMgYi9saWJpYmVydHkvYmFzZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0NGM4NS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYmFzZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIFJldHVybiB0aGUgYmFzZW5hbWUgb2YgYSBwYXRobmFtZS4KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQliYXNlbmFtZSAtLSByZXR1cm4gcG9pbnRlciB0byBsYXN0IGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lCi0KLVNZTk9QU0lTCi0JY2hhciAqYmFzZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCi0KLURFU0NSSVBUSU9OCi0JR2l2ZW4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB0eXBpY2FsIHBhdGhuYW1lCi0JKC91c3Ivc3JjL2NtZC9scy9scy5jIGZvciBleGFtcGxlKSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCi0JbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGhuYW1lICgibHMuYyIgaW4gdGhpcyBjYXNlKS4KLQotQlVHUwotCVByZXN1bWVzIGEgVU5JWCBzdHlsZSBwYXRoIHdpdGggVU5JWCBzdHlsZSBzZXBhcmF0b3JzLgotKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLWNoYXIgKgotYmFzZW5hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKmJhc2UgPSBuYW1lOwotCi0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUrKyA9PSAnLycpCi0JewotCSAgYmFzZSA9IG5hbWU7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChjaGFyICopIGJhc2U7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmNtcC5jIGIvbGliaWJlcnR5L2JjbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNDQxNy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYmNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogYmNtcAotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi0KLU5BTUUKLQotCWJjbXAgLS0gY29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMKLQotU1lOT1BTSVMKLQotCWludCBiY21wIChjaGFyICpmcm9tLCBjaGFyICp0bywgaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCi0JQ29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMgYW5kIHJldHVybiB6ZXJvIGlmIHRoZXkgYXJlIGlkZW50aWNhbCwKLQlub24temVybyBvdGhlcndpc2UuICBJZiBjb3VudCBpcyB6ZXJvLCByZXR1cm4gemVyby4KLQotTk9URVMKLQotCU5vIGd1YXJhbnRlZSBpcyBtYWRlIGFib3V0IHRoZSBub24temVybyByZXR1cm5lZCB2YWx1ZS4gIEluCi0JcGFydGljdWxhciwgdGhlIHJlc3VsdHMgbWF5IGJlIHNpZ25maWNhbnRseSBkaWZmZXJlbnQgdGhhbgotCXN0cmNtcCgpLCB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGVzcyB0aGFuLAotCWVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybywgYWNjb3JkaW5nIHRvIGxleGljb2dyYXBoaWNhbAotCXNvcnRpbmcgb2YgdGhlIGNvbXBhcmVkIHJlZ2lvbnMuCi0KLUJVR1MKLQotKi8KLQotCi1pbnQKLWJjbXAgKGZyb20sIHRvLCBjb3VudCkKLSAgY2hhciAqZnJvbSwgKnRvOwotICBpbnQgY291bnQ7Ci17Ci0gIGludCBydG52YWwgPSAwOwotCi0gIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKmZyb20rKyAhPSAqdG8rKykKLQl7Ci0JICBydG52YWwgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChydG52YWwpOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmNvcHkuYyBiL2xpYmliZXJ0eS9iY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjU1MzYzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iY29weS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogYmNvcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdGFyeSBsZW5ndGgKLQotTkFNRQotCWJjb3B5IC0tIGNvcHkgbWVtb3J5IHJlZ2lvbnMgb2YgYXJiaXRyYXJ5IGxlbmd0aAotCi1TWU5PUFNJUwotCXZvaWQgYmNvcHkgKGNoYXIgKmluLCBjaGFyICpvdXQsIGludCBsZW5ndGgpCi0KLURFU0NSSVBUSU9OCi0JQ29weSBMRU5HVEggYnl0ZXMgZnJvbSBtZW1vcnkgcmVnaW9uIHBvaW50ZWQgdG8gYnkgSU4gdG8gbWVtb3J5Ci0JcmVnaW9uIHBvaW50ZWQgdG8gYnkgT1VULgotCi1CVUdTCi0JU2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnRzIGNhbiBiZSBtYWRlIGluIHNvbWUgY2FzZXMgYnkKLQlpbXBsZW1lbnRpbmcgY29waWVzIG9mIG11bHRpcGxlIGJ5dGVzIHNpbXVsdGFuZW91c2x5LCBvciB1bnJvbGxpbmcKLQl0aGUgY29weSBsb29wLgotCi0qLwotCi12b2lkCi1iY29weSAoc3JjLCBkZXN0LCBsZW4pCi0gIHJlZ2lzdGVyIGNoYXIgKnNyYywgKmRlc3Q7Ci0gIGludCBsZW47Ci17Ci0gIGlmIChkZXN0IDwgc3JjKQotICAgIHdoaWxlIChsZW4tLSkKLSAgICAgICpkZXN0KysgPSAqc3JjKys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpsYXN0cyA9IHNyYyArIChsZW4tMSk7Ci0gICAgICBjaGFyICpsYXN0ZCA9IGRlc3QgKyAobGVuLTEpOwotICAgICAgd2hpbGUgKGxlbi0tKQotICAgICAgICAqKGNoYXIgKilsYXN0ZC0tID0gKihjaGFyICopbGFzdHMtLTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYnplcm8uYyBiL2xpYmliZXJ0eS9iemVyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDE2NDRiLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iemVyby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogUG9ydGFibGUgdmVyc2lvbiBvZiBiemVybyBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JYnplcm8gLS0gemVybyB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpZWQgbWVtb3J5IHJlZ2lvbgotCi1TWU5PUFNJUwotCXZvaWQgYnplcm8gKGNoYXIgKnRvLCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JWmVybyBDT1VOVCBieXRlcyBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBUTy4KLQotQlVHUwotCVNpZ25pZmljYW50IHNwZWVkIGVuaGFuY2VtZW50cyBtYXkgYmUgbWFkZSBpbiBzb21lIGVudmlyb25tZW50cwotCWJ5IHplcm9pbmcgbW9yZSB0aGFuIGEgc2luZ2xlIGJ5dGUgYXQgYSB0aW1lLCBvciBieSB1bnJvbGxpbmcgdGhlCi0JbG9vcC4KLQotKi8KLQotCi12b2lkCi1iemVybyAodG8sIGNvdW50KQotICBjaGFyICp0bzsKLSAgaW50IGNvdW50OwotewotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgewotICAgICAgKnRvKysgPSAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jYWxsb2MuYyBiL2xpYmliZXJ0eS9jYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMGE3OC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY2FsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSAKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGlzIG11c3QgYmUgZGVjbGFyZWQuICAqLwotUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotUFRSCi1jYWxsb2MgKG5lbGVtLCBlbHNpemUpCi0gIHNpemVfdCBuZWxlbSwgZWxzaXplOwotewotICByZWdpc3RlciBQVFIgcHRyOyAgCi0KLSAgaWYgKG5lbGVtID09IDAgfHwgZWxzaXplID09IDApCi0gICAgbmVsZW0gPSBlbHNpemUgPSAxOwotICAKLSAgcHRyID0gbWFsbG9jIChuZWxlbSAqIGVsc2l6ZSk7Ci0gIGlmIChwdHIpIGJ6ZXJvIChwdHIsIG5lbGVtICogZWxzaXplKTsKLSAgCi0gIHJldHVybiBwdHI7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY2hvb3NlLXRlbXAuYyBiL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWFlMzE4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qIFV0aWxpdHkgdG8gcGljayBhIHRlbXBvcmFyeSBmaWxlbmFtZSBwcmVmaXguCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZXhwb3J0cyB0d28gZnVuY3Rpb25zOiBjaG9vc2VfdGVtcF9iYXNlIGFuZCBtYWtlX3RlbXBfZmlsZS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBsaWJpYmVydHkgYW5kIGdjYy4KLSAgIERvbid0IGNoYW5nZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkvKiBNYXkgZ2V0IFBfdG1wZGlyLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPiAgIC8qIE1heSBnZXQgUl9PSywgZXRjLiBvbiBzb21lIHN5c3RlbXMuICAqLwotI2VuZGlmCi0KLSNpZm5kZWYgUl9PSwotI2RlZmluZSBSX09LIDQKLSNkZWZpbmUgV19PSyAyCi0jZGVmaW5lIFhfT0sgMQotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLWV4dGVybiBpbnQgbWtzdGVtcHMgKCk7Ci0KLSNpZm5kZWYgSU5fR0NDCi0jaWYgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfV0lOMzIpCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJ1xcJwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBESVJfU0VQQVJBVE9SCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCi0jZW5kaWYKLQotLyogT24gTVNET1MsIHdyaXRlIHRlbXAgZmlsZXMgaW4gY3VycmVudCBkaXIKLSAgIGJlY2F1c2UgdGhlcmUncyBubyBwbGFjZSBlbHNlIHdlIGNhbiBleHBlY3QgdG8gdXNlLiAgKi8KLS8qID8/PyBBbHRob3VnaCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgdHJpZWQgYXMgYSBsYXN0IHJlc29ydCwKLSAgIHRoaXMgaXMgbGVmdCBpbiBzbyB0aGF0IG9uIE1TRE9TIGl0IGlzIHByZWZlcnJlZCB0byAvdG1wIG9uIHRoZQotICAgb2ZmIGNoYW5jZSB0aGF0IHNvbWVvbmUgcmVxdWlyZXMgdGhpcywgc2luY2UgdGhhdCB3YXMgdGhlIHByZXZpb3VzCi0gICBiZWhhdmlvdXIuICAqLwotI2lmZGVmIF9fTVNET1NfXwotI2lmbmRlZiBQX3RtcGRpcgotI2RlZmluZSBQX3RtcGRpciAiLiIKLSNlbmRpZgotI2VuZGlmCi0KLS8qIE5hbWUgb2YgdGVtcG9yYXJ5IGZpbGUuCi0gICBta3RlbXAgcmVxdWlyZXMgNiB0cmFpbGluZyBYJ3MuICAqLwotI2RlZmluZSBURU1QX0ZJTEUgImNjWFhYWFhYIgotCi0vKiBTdWJyb3V0aW5lIG9mIGNob29zZV90ZW1wX2Jhc2UuCi0gICBJZiBCQVNFIGlzIG5vbi1OVUxMLCByZXR1cm4gaXQuCi0gICBPdGhlcndpc2UgaXQgY2hlY2tzIGlmIERJUiBpcyBhIHVzYWJsZSBkaXJlY3RvcnkuCi0gICBJZiBzdWNjZXNzLCBESVIgaXMgcmV0dXJuZWQuCi0gICBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4gICovCi0KLXN0YXRpYyBjaGFyICoKLXRyeSAoZGlyLCBiYXNlKQotICAgICBjaGFyICpkaXIsICpiYXNlOwotewotICBpZiAoYmFzZSAhPSAwKQotICAgIHJldHVybiBiYXNlOwotICBpZiAoZGlyICE9IDAKLSAgICAgICYmIGFjY2VzcyAoZGlyLCBSX09LIHwgV19PSyB8IFhfT0spID09IDApCi0gICAgcmV0dXJuIGRpcjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBhIHByZWZpeCBmb3IgdGVtcG9yYXJ5IGZpbGUgbmFtZXMgb3IgTlVMTCBpZiB1bmFibGUgdG8gZmluZCBvbmUuCi0gICBUaGUgY3VycmVudCBkaXJlY3RvcnkgaXMgY2hvc2VuIGlmIGFsbCBlbHNlIGZhaWxzIHNvIHRoZSBwcm9ncmFtIGlzCi0gICBleGl0ZWQgaWYgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGNhbid0IGJlIGZvdW5kIChta3RlbXAgZmFpbHMpLgotICAgVGhlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBpcyBvYnRhaW5lZCB3aXRoIHhtYWxsb2MuIAotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSBvbmx5LiAgSXQgdXNlCi0gICBpcyBub3QgcmVjb21tZW5kZWQuICAqLwotCi1jaGFyICoKLWNob29zZV90ZW1wX2Jhc2UgKCkKLXsKLSAgY2hhciAqYmFzZSA9IDA7Ci0gIGNoYXIgKnRlbXBfZmlsZW5hbWU7Ci0gIGludCBsZW47Ci0gIHN0YXRpYyBjaGFyIHRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07Ci0gIHN0YXRpYyBjaGFyIHVzcnRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndScsICdzJywgJ3InLCBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07Ci0KLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QRElSIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVAiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRFTVAiKSwgYmFzZSk7Ci0KLSNpZmRlZiBQX3RtcGRpcgotICBiYXNlID0gdHJ5IChQX3RtcGRpciwgYmFzZSk7Ci0jZW5kaWYKLQotICAvKiBUcnkgL3Vzci90bXAsIHRoZW4gL3RtcC4gICovCi0gIGJhc2UgPSB0cnkgKHVzcnRtcCwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKHRtcCwgYmFzZSk7Ci0gCi0gIC8qIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5ISAgKi8KLSAgaWYgKGJhc2UgPT0gMCkKLSAgICBiYXNlID0gIi4iOwotCi0gIGxlbiA9IHN0cmxlbiAoYmFzZSk7Ci0gIHRlbXBfZmlsZW5hbWUgPSB4bWFsbG9jIChsZW4gKyAxIC8qRElSX1NFUEFSQVRPUiovCi0JCQkgICArIHN0cmxlbiAoVEVNUF9GSUxFKSArIDEpOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUsIGJhc2UpOwotCi0gIGlmIChsZW4gIT0gMAotICAgICAgJiYgdGVtcF9maWxlbmFtZVtsZW4tMV0gIT0gJy8nCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2xlbi0xXSAhPSBESVJfU0VQQVJBVE9SKQotICAgIHRlbXBfZmlsZW5hbWVbbGVuKytdID0gRElSX1NFUEFSQVRPUjsKLSAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lICsgbGVuLCBURU1QX0ZJTEUpOwotCi0gIG1rdGVtcCAodGVtcF9maWxlbmFtZSk7Ci0gIGlmIChzdHJsZW4gKHRlbXBfZmlsZW5hbWUpID09IDApCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiB0ZW1wX2ZpbGVuYW1lOwotfQotLyogUmV0dXJuIGEgdGVtcG9yYXJ5IGZpbGUgbmFtZSAoYXMgYSBzdHJpbmcpIG9yIE5VTEwgaWYgdW5hYmxlIHRvIGNyZWF0ZQotICAgb25lLiAgKi8KLQotY2hhciAqCi1tYWtlX3RlbXBfZmlsZSAoc3VmZml4KQotICAgICBjaGFyICpzdWZmaXg7Ci17Ci0gIGNoYXIgKmJhc2UgPSAwOwotICBjaGFyICp0ZW1wX2ZpbGVuYW1lOwotICBpbnQgYmFzZV9sZW4sIHN1ZmZpeF9sZW47Ci0gIGludCBmZDsKLSAgc3RhdGljIGNoYXIgdG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLSAgc3RhdGljIGNoYXIgdXNydG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd1JywgJ3MnLCAncicsIERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLQotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVBESVIiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUCIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVEVNUCIpLCBiYXNlKTsKLQotI2lmZGVmIFBfdG1wZGlyCi0gIGJhc2UgPSB0cnkgKFBfdG1wZGlyLCBiYXNlKTsKLSNlbmRpZgotCi0gIC8qIFRyeSAvdXNyL3RtcCwgdGhlbiAvdG1wLiAgKi8KLSAgYmFzZSA9IHRyeSAodXNydG1wLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAodG1wLCBiYXNlKTsKLSAKLSAgLyogSWYgYWxsIGVsc2UgZmFpbHMsIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkhICAqLwotICBpZiAoYmFzZSA9PSAwKQotICAgIGJhc2UgPSAiLiI7Ci0KLSAgYmFzZV9sZW4gPSBzdHJsZW4gKGJhc2UpOwotCi0gIGlmIChzdWZmaXgpCi0gICAgc3VmZml4X2xlbiA9IHN0cmxlbiAoc3VmZml4KTsKLSAgZWxzZQotICAgIHN1ZmZpeF9sZW4gPSAwOwotCi0gIHRlbXBfZmlsZW5hbWUgPSB4bWFsbG9jIChiYXNlX2xlbiArIDEgLypESVJfU0VQQVJBVE9SKi8KLQkJCSAgICsgc3RybGVuIChURU1QX0ZJTEUpCi0JCQkgICArIHN1ZmZpeF9sZW4gKyAxKTsKLSAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lLCBiYXNlKTsKLQotICBpZiAoYmFzZV9sZW4gIT0gMAotICAgICAgJiYgdGVtcF9maWxlbmFtZVtiYXNlX2xlbi0xXSAhPSAnLycKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbYmFzZV9sZW4tMV0gIT0gRElSX1NFUEFSQVRPUikKLSAgICB0ZW1wX2ZpbGVuYW1lW2Jhc2VfbGVuKytdID0gRElSX1NFUEFSQVRPUjsKLSAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lICsgYmFzZV9sZW4sIFRFTVBfRklMRSk7Ci0KLSAgaWYgKHN1ZmZpeCkKLSAgICBzdHJjYXQgKHRlbXBfZmlsZW5hbWUsIHN1ZmZpeCk7Ci0KLSAgZmQgPSBta3N0ZW1wcyAodGVtcF9maWxlbmFtZSwgc3VmZml4X2xlbik7Ci0gIC8qIElmIG1rc3RlbXBzIGZhaWxlZCwgdGhlbiBzb21ldGhpbmcgYmFkIGlzIGhhcHBlbmluZy4gIE1heWJlIHdlIHNob3VsZAotICAgICBpc3N1ZSBhIG1lc3NhZ2UgYWJvdXQgYSBwb3NzaWJsZSBzZWN1cml0eSBhdHRhY2sgaW4gcHJvZ3Jlc3M/ICAqLwotICBpZiAoZmQgPT0gLTEpCi0gICAgYWJvcnQgKCk7Ci0gIC8qIFNpbWlsYXJseSBpZiB3ZSBjYW4gbm90IGNsb3NlIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGNsb3NlIChmZCkpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiB0ZW1wX2ZpbGVuYW1lOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Nsb2NrLmMgYi9saWJpYmVydHkvY2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyNTA5Yy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIEFOU0ktY29tcGF0aWJsZSBjbG9jayBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfR0VUUlVTQUdFCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9USU1FUwotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9TQ19DTEtfVENLCi0jZGVmaW5lIEdOVV9IWiAgc3lzY29uZihfU0NfQ0xLX1RDSykKLSNlbHNlCi0jaWZkZWYgSFoKLSNkZWZpbmUgR05VX0haICBIWgotI2Vsc2UKLSNpZmRlZiBDTE9DS1NfUEVSX1NFQwotI2RlZmluZSBHTlVfSFogIENMT0NLU19QRVJfU0VDCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qIEZJWE1FOiBzaG91bGQgYmUgYWJsZSB0byBkZWNsYXJlIGFzIGNsb2NrX3QuICovCi0KLWxvbmcKLWNsb2NrICgpCi17Ci0jaWZkZWYgSEFWRV9HRVRSVVNBR0UKLSAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7Ci0KLSAgZ2V0cnVzYWdlICgwLCAmcnVzYWdlKTsKLSAgcmV0dXJuIChydXNhZ2UucnVfdXRpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV91dGltZS50dl91c2VjCi0JICArIHJ1c2FnZS5ydV9zdGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMpOwotI2Vsc2UKLSNpZmRlZiBIQVZFX1RJTUVTCi0gIHN0cnVjdCB0bXMgdG1zOwotCi0gIHRpbWVzICgmdG1zKTsKLSAgcmV0dXJuICh0bXMudG1zX3V0aW1lICsgdG1zLnRtc19zdGltZSkgKiAoMTAwMDAwMCAvIEdOVV9IWik7Ci0jZWxzZQotI2lmZGVmIFZNUwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgcHJvY191c2VyX3RpbWU7Ci0gICAgICBpbnQgcHJvY19zeXN0ZW1fdGltZTsKLSAgICAgIGludCBjaGlsZF91c2VyX3RpbWU7Ci0gICAgICBpbnQgY2hpbGRfc3lzdGVtX3RpbWU7Ci0gICAgfSB2bXNfdGltZXM7Ci0KLSAgdGltZXMgKCZ2bXNfdGltZXMpOwotICByZXR1cm4gKHZtc190aW1lcy5wcm9jX3VzZXJfdGltZSArIHZtc190aW1lcy5wcm9jX3N5c3RlbV90aW1lKSAqIDEwMDAwOwotI2Vsc2UKLSAgLyogQSBmYWxsYmFjaywgaWYgbm90aGluZyBlbHNlIGF2YWlsYWJsZS4gKi8KLSAgcmV0dXJuIDA7Ci0jZW5kaWYgLyogVk1TICovCi0jZW5kaWYgLyogSEFWRV9USU1FUyAqLwotI2VuZGlmIC8qIEhBVkVfR0VUUlVTQUdFICovCi19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25jYXQuYyBiL2xpYmliZXJ0eS9jb25jYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxMzJjOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uY2F0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyogQ29uY2F0ZW5hdGUgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0KLU5BTUUKLQotCWNvbmNhdCAtLSBjb25jYXRlbmF0ZSBhIHZhcmlhYmxlIG51bWJlciBvZiBzdHJpbmdzCi0KLVNZTk9QU0lTCi0KLQkjaW5jbHVkZSA8dmFyYXJncy5oPgotCi0JY2hhciAqY29uY2F0IChzMSwgczIsIHMzLCAuLi4sIE5VTEwpCi0KLURFU0NSSVBUSU9OCi0KLQlDb25jYXRlbmF0ZSBhIHZhcmlhYmxlIG51bWJlciBvZiBzdHJpbmdzIGFuZCByZXR1cm4gdGhlIHJlc3VsdAotCWluIGZyZXNobHkgbWFsbG9jJ2QgbWVtb3J5LgotCi0JUmV0dXJucyBOVUxMIGlmIGluc3VmZmljaWVudCBtZW1vcnkgaXMgYXZhaWxhYmxlLiAgVGhlIGFyZ3VtZW50Ci0JbGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdCBOVUxMIHBvaW50ZXIgZW5jb3VudGVyZWQuICBQb2ludGVycwotCXRvIGVtcHR5IHN0cmluZ3MgYXJlIGlnbm9yZWQuCi0KLU5PVEVTCi0KLQlUaGlzIGZ1bmN0aW9uIHVzZXMgeG1hbGxvYygpIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIGEgZnJvbnQgZW5kCi0JZnVuY3Rpb24gdG8gbWFsbG9jKCkgdGhhdCBkZWFscyB3aXRoIGxvdyBtZW1vcnkgc2l0dWF0aW9ucy4gIEluCi0JdHlwaWNhbCB1c2UsIGlmIG1hbGxvYygpIHJldHVybnMgTlVMTCB0aGVuIHhtYWxsb2MoKSBkaXZlcnRzIHRvIGFuCi0JZXJyb3IgaGFuZGxlciByb3V0aW5lIHdoaWNoIG5ldmVyIHJldHVybnMsIGFuZCB0aHVzIHhtYWxsb2Mgd2lsbAotCW5ldmVyIHJldHVybiBhIE5VTEwgcG9pbnRlci4gIElmIHRoZSBjbGllbnQgYXBwbGljYXRpb24gd2lzaGVzIHRvCi0JZGVhbCB3aXRoIGxvdyBtZW1vcnkgc2l0dWF0aW9ucyBpdHNlbGYsIGl0IHNob3VsZCBzdXBwbHkgYW4geG1hbGxvYwotCXRoYXQganVzdCBkaXJlY3RseSBpbnZva2VzIG1hbGxvYyBhbmQgYmxpbmRseSByZXR1cm5zIHdoYXRldmVyCi0JbWFsbG9jIHJldHVybnMuCi0qLwotCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiBzaXplX3Qgc3RybGVuIChjb25zdCBjaGFyICpzKTsKLSNlbHNlCi1leHRlcm4gaW50IHN0cmxlbiAoKTsKLSNlbmRpZgotCi0jZGVmaW5lIE5VTExQIChjaGFyICopMAotCi0vKiBWQVJBUkdTICovCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1jaGFyICoKLWNvbmNhdCAoY29uc3QgY2hhciAqZmlyc3QsIC4uLikKLSNlbHNlCi1jaGFyICoKLWNvbmNhdCAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHJlZ2lzdGVyIGludCBsZW5ndGg7Ci0gIHJlZ2lzdGVyIGNoYXIgKm5ld3N0cjsKLSAgcmVnaXN0ZXIgY2hhciAqZW5kOwotICByZWdpc3RlciBjb25zdCBjaGFyICphcmc7Ci0gIHZhX2xpc3QgYXJnczsKLSNpZm5kZWYgQU5TSV9QUk9UT1RZUEVTCi0gIGNvbnN0IGNoYXIgKmZpcnN0OwotI2VuZGlmCi0KLSAgLyogRmlyc3QgY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0IGFuZCBnZXQgc3VmZmljaWVudCBtZW1vcnkuICovCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgdmFfc3RhcnQgKGFyZ3MsIGZpcnN0KTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZmlyc3QgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotICBpZiAoZmlyc3QgPT0gTlVMTFApCi0gICAgbGVuZ3RoID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoZmlyc3QpOwotICAgICAgd2hpbGUgKChhcmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKikpICE9IE5VTExQKQotCXsKLQkgIGxlbmd0aCArPSBzdHJsZW4gKGFyZyk7Ci0JfQotICAgIH0KLSAgbmV3c3RyID0gKGNoYXIgKikgeG1hbGxvYyAobGVuZ3RoICsgMSk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgLyogTm93IGNvcHkgdGhlIGluZGl2aWR1YWwgcGllY2VzIHRvIHRoZSByZXN1bHQgc3RyaW5nLiAqLwotCi0gIGlmIChuZXdzdHIgIT0gTlVMTFApCi0gICAgewotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZpcnN0KTsKLSNlbHNlCi0gICAgICB2YV9zdGFydCAoYXJncyk7Ci0gICAgICBmaXJzdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotICAgICAgZW5kID0gbmV3c3RyOwotICAgICAgaWYgKGZpcnN0ICE9IE5VTExQKQotCXsKLQkgIGFyZyA9IGZpcnN0OwotCSAgd2hpbGUgKCphcmcpCi0JICAgIHsKLQkgICAgICAqZW5kKysgPSAqYXJnKys7Ci0JICAgIH0KLQkgIHdoaWxlICgoYXJnID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopKSAhPSBOVUxMUCkKLQkgICAgewotCSAgICAgIHdoaWxlICgqYXJnKQotCQl7Ci0JCSAgKmVuZCsrID0gKmFyZysrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAqZW5kID0gJ1wwMDAnOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChuZXdzdHIpOwotfQotCi0jaWZkZWYgTUFJTgotCi0vKiBTaW1wbGUgbGl0dGxlIHRlc3QgZHJpdmVyLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluICgpCi17Ci0gIHByaW50ZiAoIlwiXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImEiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImEiLCAiYiIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJjXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImEiLCAiYiIsICJjIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNkXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImFiIiwgImNkIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNkZVwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhYiIsICJjIiwgImRlIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNkZWZcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiIiwgImEiLCAiIiwgImJjZCIsICJlZiIsIE5VTExQKSk7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcuaC12bXMgYi9saWJpYmVydHkvY29uZmlnLmgtdm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2FjNmEyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcuaC12bXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaWZuZGVmIE5FRURfc3RyZXJyb3IKLSNkZWZpbmUgTkVFRF9zdHJlcnJvcgotI2VuZGlmCi0jaWZuZGVmIE5FRURfYmFzZW5hbWUKLSNkZWZpbmUgTkVFRF9iYXNlbmFtZQotI2VuZGlmCi0jaWZuZGVmIE5FRURfcHNpZ25hbAotI2RlZmluZSBORUVEX3BzaWduYWwKLSNlbmRpZgotI2lmbmRlZiBORUVEX29uX2V4aXQKLSNkZWZpbmUgTkVFRF9vbl9leGl0Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy5pbiBiL2xpYmliZXJ0eS9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMjU2YzkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfV0FJVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8dmZvcmsuaD4uICAqLwotI3VuZGVmIEhBVkVfVkZPUktfSAotCi0vKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgcGlkX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB2Zm9yayBhcyBmb3JrIGlmIHZmb3JrIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIHZmb3JrCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX2Vycmxpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfbmVyciB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkVSUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19zaWdsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhc3ByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9BU1BSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGF0ZXhpdCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9BVEVYSVQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiYXNlbmFtZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CQVNFTkFNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQkNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJjb3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JDT1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYnplcm8gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQlpFUk8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjYWxsb2MgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQ0FMTE9DCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2xvY2sgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQ0xPQ0sKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaW5kZXggZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfSU5ERVgKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpbnNxdWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfSU5TUVVFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTUNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1DTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtbW92ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1NT1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtc2V0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTVNFVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1rc3RlbXBzIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01LU1RFTVBTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgb25fZXhpdCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9PTl9FWElUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHNpZ25hbCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QU0lHTkFMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmFuZG9tIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1JBTkRPTQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbmFtZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SRU5BTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByaW5kZXggZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUklOREVYCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnc2V0bWFzayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdTRVRNQVNLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmR1cCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJEVVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJlcnJvciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJFUlJPUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cm5jYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUk5DQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RycmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3Ryc2lnbmFsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlNJR05BTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnN0ciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJTVFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSVE9ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG9sIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlRPTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvdWwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSVE9VTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c2NvbmYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1lTQ09ORgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWVzIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdG1wbmFtIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RNUE5BTQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZhc3ByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WQVNQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2ZnByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WRlBSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVlBSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZTUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgd2FpdHBpZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9XQUlUUElECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLnRhYmxlIGIvbGliaWJlcnR5L2NvbmZpZy50YWJsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxM2IyMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnLnRhYmxlCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotY2FzZSAiJHtob3N0fSIgaW4KLSAgcnM2MDAwLWlibS1haXgzLjEgfCByczYwMDAtaWJtLWFpeCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYWc9bWgtYWl4IDs7Ci0gICotKi1jeHV4NyopCQlmcmFnPW1oLWN4dXg3IDs7Ci0gICotKi1mcmVlYnNkMi4xLiopCWZyYWc9bWgtZmJzZDIxIDs7Ci0gICotKi1mcmVlYnNkMi4yLlswMTJdKQlmcmFnPW1oLWZic2QyMSA7OwotICBpWzM0NV04Ni0qLXdpbmRvd3MqKQlmcmFnPW1oLXdpbmRvd3MgOzsKLSAgKi0qLWJlb3MqKQkJZnJhZz1taC1iZW9zIDs7Ci1lc2FjCi0KLWZyYWdzPSRmcmFnCi0KLSMgSWYgdGhleSBkaWRuJ3Qgc3BlY2lmeSAtLWVuYWJsZS1zaGFyZWQsIGRvbid0IGdlbmVyYXRlIHNoYXJlZCBsaWJzLgotY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLSAgeWVzKSBzaGFyZWQ9eWVzIDs7Ci0gIG5vKSBzaGFyZWQ9bm8gOzsKLSAgIiIpIHNoYXJlZD1ubyA7OwotICAqKSBzaGFyZWQ9eWVzIDs7Ci1lc2FjCi1pZiBbICIke3NoYXJlZH0iID0gInllcyIgXTsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICAgICotKi1jeWd3aW4qKQk7OwotICAgIGFscGhhKi0qLWxpbnV4KikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1lbGZhbHBoYXBpYyIgOzsKLSAgICBhcm0qLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtYXJtcGljIiA7OwotICAgIGhwcGEqLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtcGFwaWMiIDs7Ci0gICAgaVszNDU2XTg2LSotKikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC14ODZwaWMiIDs7Ci0gICAgcG93ZXJwYyotKi1haXgqKQk7OwotICAgIHBvd2VycGMqLSotKikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1wcGNwaWMiIDs7Ci0gICAgKi0qLSopCQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLSR7aG9zdF9jcHV9cGljIiA7OwotICBlc2FjCi1maQotCi1lY2hvICIjIFdhcm5pbmc6IHRoaXMgZnJhZ21lbnQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQiID4gdGVtcC1mcmFnCi0KLWZvciBmcmFnIGluICR7ZnJhZ3N9OyBkbwotICBjYXNlICR7ZnJhZ30gaW4KLSAgICAuLi8qICkKLSAgICAgIGlmIFsgJHtzcmNkaXJ9ID0gLiBdOyB0aGVuCi0JWyAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiBdICYmIGZyYWc9Li4vJHtmcmFnfQotCVsgLW4gIiR7d2l0aF9tdWx0aXNyY3RvcH0iIF0gJiYgZnJhZz0ke3dpdGhfbXVsdGlzcmN0b3B9JHtmcmFnfQotICAgICAgZmkKLSAgICAgIDs7Ci0gIGVzYWMKLSAgZnJhZz0ke3NyY2Rpcn0vJHt4c3JjZGlyfWNvbmZpZy8kZnJhZwotICBpZiBbIC1mICR7ZnJhZ30gXTsgdGhlbgotICAgIGVjaG8gIkFwcGVuZGluZyAke2ZyYWd9IHRvIHhob3N0LW1rZnJhZyIKLSAgICBlY2hvICIjIEZvbGxvd2luZyBmcmFnbWVudCBjb3BpZWQgZnJvbSAke2ZyYWd9IiA+PiB0ZW1wLWZyYWcKLSAgICBjYXQgJHtmcmFnfSA+PiB0ZW1wLWZyYWcKLSAgZmkKLWRvbmUKLQotIyByZWNvcmQgaWYgd2Ugd2FudCB0byBidWlsZCBzaGFyZWQgbGlicy4KLWlmIFsgIiR7c2hhcmVkfSIgPSAieWVzIiBdOyB0aGVuCi0gIGVjaG8gZW5hYmxlX3NoYXJlZCA9IHllcyA+PiB0ZW1wLWZyYWcKLWVsc2UKLSAgZWNobyBlbmFibGVfc2hhcmVkID0gbm8gPj4gdGVtcC1mcmFnCi1maQotCi1mcmFnPXhob3N0LW1rZnJhZwotJHtDT05GSUdfU0hFTEx9ICR7bGliaWJlcnR5X3RvcGRpcn0vbW92ZS1pZi1jaGFuZ2UgdGVtcC1mcmFnIHhob3N0LW1rZnJhZwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1haXggYi9saWJpYmVydHkvY29uZmlnL21oLWFpeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2NDUwNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWFpeAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgb25seSBuZWVkZWQgYnkgQUlYIDMuMS4KLUhERUZJTkVTID0gLURfX0lFRUVfQklHX0VORElBTgotCi0jIE1vc3QgcmVsZWFzZXMgb2YgQUlYIDMuMSBpbmNsdWRlIGFuIGluY29ycmVjdCBpbnRlcm5hbCB2ZXJzaW9uIG9mIGNvcHlzaWduCi0jIGluIGxpYmMuYSBmb3IgdXNlIGJ5IHNvbWUgbGliYyBwdWJsaWMgZnVuY3Rpb25zIGluY2x1ZGluZyBtb2RmLiAgVGhlIHB1YmxpYwotIyB2ZXJzaW9uIG9mIGNvcHlzaWduIGluIGxpYm0uYSBpcyB1c2FibGUuICBGb3IgdGhlIHNha2Ugb2YgbGliZysrICh3aGljaAotIyB1c2VzIG1vZGYpLCB3ZSBhZGQgY29weXNpZ24gaGVyZS4gIFN1cHBvc2VkbHksIHRoaXMgcHJvYmxlbSBpcyBmaXhlZCBpbiBBSVgKLSMgMy4xLjggYW5kIGFib3ZlLCBpbmNsdWRpbmcgYWxsIHJlbGVhc2VzIG9mIEFJWCAzLjIuCi1FWFRSQV9PRklMRVMgPSBjb3B5c2lnbi5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWJlb3MgYi9saWJpYmVydHkvY29uZmlnL21oLWJlb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzVlN2QuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1iZW9zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIEhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIEJlT1MKLQotIyBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgdGhlIHdpbXB5IGRlZmF1bHQgNjRrIHN0YWNrCi0jIGxpbWl0IGluIEJlT1MgaXMgZWl0aGVyIGluY3JlYXNlZCBvciBtYWRlIHVzZXIgc2V0dGFibGUgc29tZWhvdy4KLSMgVGhpcyBwcm9iYWJseSB3b24ndCBoYXBwZW4gdW50aWwgYWZ0ZXIgdGhlIERSOSByZWxlYXNlLgotCi1FWFRSQV9PRklMRVMgPSBhbGxvY2EubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NyBiL2xpYmliZXJ0eS9jb25maWcvbWgtY3h1eDcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjRiMDguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUhERUZJTkVTID0gLURIQVJSSVNfRkxPQVRfRk9STUFUCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWZic2QyMSBiL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzc1YTc4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRVhUUkFfT0ZJTEVTPXZhc3ByaW50Zi5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MgYi9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjVmNzkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC13aW5kb3dzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRVhUUkFfT0ZJTEVTPWFzcHJpbnRmLm8gc3RyY2FzZWNtcC5vIHN0cm5jYXNlY21wLm8gdmFzcHJpbnRmLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWd1cmUgYi9saWJpYmVydHkvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWI5YjY0Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTE2ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtdGFyZ2V0LXN1YmRpcj1TVUJESVIgICAgICBDb25maWd1cmluZyBpbiBhIHN1YmRpcmVjdG9yeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1jcm9zcy1ob3N0PUhPU1QgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggYSBjcm9zcyBjb21waWxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1uZXdsaWIgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggbmV3bGliIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1wZXhlY3V0ZS5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhcmdldC1zdWJkaXIgb3IgLS13aXRob3V0LXRhcmdldC1zdWJkaXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfdGFyZ2V0X3N1YmRpciIKLSAgOgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jcm9zcy1ob3N0IG9yIC0td2l0aG91dC1jcm9zcy1ob3N0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcm9zc19ob3N0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2Nyb3NzX2hvc3QiCi0gIDoKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbmV3bGliIG9yIC0td2l0aG91dC1uZXdsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX25ld2xpYitzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9uZXdsaWIiCi0gIDoKLWZpCi0KLQotaWYgdGVzdCAiJHtzcmNkaXJ9IiA9ICIuIjsgdGhlbgotICBpZiB0ZXN0IC16ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgotICBlbHNlCi0gICAgaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiI7IHRoZW4KLSAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4iCi0gICAgZWxzZQotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLiIKLSAgICBmaQotICBmaQotZWxzZQotICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi1maQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJGxpYmliZXJ0eV90b3BkaXIgJHNyY2Rpci8kbGliaWJlcnR5X3RvcGRpcjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRsaWJpYmVydHlfdG9wZGlyICRzcmNkaXIvJGxpYmliZXJ0eV90b3BkaXIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjAyOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyNTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjgzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIFJBTkxJQj0iOiIKLWZpCi1maQotCi0KLSMgRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlZmluZSBvdXIgb3duIHZlcnNpb24gb2YgQUNfUFJPR19DQy4gIFRoaXMgaXMKLSMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgbm90IGNhbGwgQUNfUFJPR19DQ19XT1JLUy4gIFdlCi0jIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci0jIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBpbiBhdXRvY29uZgotIyBpdHNlbGYuCi0KLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzYwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4Mzk6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjg0ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NjM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdDQz0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg5MjogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLQotCi0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkzMDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0uICR7c3JjZGlyfS9jb25maWcudGFibGUKLWhvc3RfbWFrZWZpbGVfZnJhZz0ke2ZyYWd9Ci0KLQotIyBJdCdzIE9LIHRvIGNoZWNrIGZvciBoZWFkZXIgZmlsZXMuICBBbHRob3VnaCB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZQotIyBhYmxlIHRvIGxpbmsgYW55dGhpbmcsIGl0IGhhZCBiZXR0ZXIgYmUgYWJsZSB0byBhdCBsZWFzdCBjb21waWxlCi0jIHNvbWV0aGluZy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5OTE6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAxMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAyOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA0NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1mb3IgYWNfaGRyIGluIHN5cy9maWxlLmggc3lzL3BhcmFtLmggc3RkbGliLmggc3RyaW5nLmggdW5pc3RkLmggc3RyaW5ncy5oIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDc0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTExOiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N5c193YWl0X2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCkoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWludCBzOwotd2FpdCAoJnMpOwotcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotRU9GCi0KLWZpCi0KLQotIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBsaWJpYmVydHkgd2lsbCBwcm92aWRlIGlmIHRoZXkKLSMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlIGhvc3QuCi0KLWZ1bmNzPSJhc3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgYXRleGl0IgotZnVuY3M9IiRmdW5jcyBiYXNlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgYmNtcCIKLWZ1bmNzPSIkZnVuY3MgYmNvcHkiCi1mdW5jcz0iJGZ1bmNzIGJ6ZXJvIgotZnVuY3M9IiRmdW5jcyBjYWxsb2MiCi1mdW5jcz0iJGZ1bmNzIGNsb2NrIgotZnVuY3M9IiRmdW5jcyBnZXRjd2QiCi1mdW5jcz0iJGZ1bmNzIGdldHBhZ2VzaXplIgotZnVuY3M9IiRmdW5jcyBpbmRleCIKLWZ1bmNzPSIkZnVuY3MgaW5zcXVlIgotZnVuY3M9IiRmdW5jcyBtZW1jaHIiCi1mdW5jcz0iJGZ1bmNzIG1lbWNtcCIKLWZ1bmNzPSIkZnVuY3MgbWVtY3B5IgotZnVuY3M9IiRmdW5jcyBtZW1tb3ZlIgotZnVuY3M9IiRmdW5jcyBtZW1zZXQiCi1mdW5jcz0iJGZ1bmNzIG1rc3RlbXBzIgotZnVuY3M9IiRmdW5jcyByYW5kb20iCi1mdW5jcz0iJGZ1bmNzIHJlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgcmluZGV4IgotZnVuY3M9IiRmdW5jcyBzaWdzZXRtYXNrIgotZnVuY3M9IiRmdW5jcyBzdHJjYXNlY21wIgotZnVuY3M9IiRmdW5jcyBzdHJjaHIiCi1mdW5jcz0iJGZ1bmNzIHN0cmR1cCIKLWZ1bmNzPSIkZnVuY3Mgc3RybmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cnJjaHIiCi1mdW5jcz0iJGZ1bmNzIHN0cnN0ciIKLWZ1bmNzPSIkZnVuY3Mgc3RydG9kIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2wiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvdWwiCi1mdW5jcz0iJGZ1bmNzIHRtcG5hbSIKLWZ1bmNzPSIkZnVuY3MgdmFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2ZnByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdnByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdnNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHdhaXRwaWQiCi0KLSMgQWxzbyBpbiB0aGUgb2xkIGZ1bmN0aW9uLmRlZiBmaWxlOiBhbGxvY2EsIHZmb3JrLCBnZXRvcHQuCi0KLXZhcnM9InN5c19lcnJsaXN0IHN5c19uZXJyIHN5c19zaWdsaXN0IgotCi1jaGVja2Z1bmNzPSJnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzIHNicmsiCi0KLSMgVGhlc2UgYXJlIG5laXRoZXIgZXhlY3V0ZWQgbm9yIHJlcXVpcmVkLCBidXQgdGhleSBoZWxwIGtlZXAKLSMgYXV0b2hlYWRlciBoYXBweSB3aXRob3V0IGFkZGluZyBhIGJ1bmNoIG9mIHRleHQgdG8gYWNjb25maWcuaC4KLWlmIHRlc3QgIngiID0gInkiOyB0aGVuCi0gIGZvciBhY19mdW5jIGluIGFzcHJpbnRmIGF0ZXhpdCBiYXNlbmFtZSBiY21wIGJjb3B5IGJ6ZXJvIGNhbGxvYyBjbG9jayBnZXRjd2QKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMDY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZSBpbmRleCBpbnNxdWUgbWtzdGVtcHMgbWVtY2hyIG1lbWNtcCBtZW1jcHkgbWVtbW92ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI2MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIG1lbXNldCByYW5kb20gcmVuYW1lIHJpbmRleCBzaWdzZXRtYXNrIHN0cmNhc2VjbXAKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMTY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBzdHJjaHIgc3RyZHVwIHN0cm5jYXNlY21wIHN0cnJjaHIgc3Ryc3RyIHN0cnRvZCBzdHJ0b2wKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNzE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzNzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBzdHJ0b3VsIHRtcG5hbSB2YXNwcmludGYgdmZwcmludGYgdnByaW50ZiB2c3ByaW50ZiB3YWl0cGlkCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDI2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX0VSUkxJU1QgMQotRU9GCi0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX05FUlIgMQotRU9GCi0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX1NJR0xJU1QgMQotRU9GCi0KLSAgZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ5MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIHNicmsKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NDg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZmkKLQotIyBGb3IgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMsIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgdGhlCi0jIGZ1bmN0aW9uIHdlIHdhbnQgdG8gcHV0IEZOLm8gaW4gTElCT0JKUywgYW5kIGlmIHRoZSBob3N0IGRvZXMKLSMgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIHdlIHdhbnQgdG8gZGVmaW5lIEhBVkVfRk4gaW4gY29uZmlnLmguICBBbHNvLAotIyBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIGFsbG9jYSwgd2Ugc2V0IEFMTE9DQSB0byBhbGxvY2EubwotCi1zZXRvYmpzPQotaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotCi0gICMgV2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgYXMgYSB0YXJnZXQgbGlicmFyeS4gIEFDX1JFUExBQ0VfRlVOQ1MKLSAgIyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkgbm90IGJlIGFibGUgdG8KLSAgIyBsaW5rIGV4ZWN1dGFibGVzLiAgTm90ZSB0aGF0IHdlIG1heSBzdGlsbCBiZSBiZWluZyBjb25maWd1cmVkCi0gICMgbmF0aXZlLgotCi0gICMgSWYgd2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgZm9yIG5ld2xpYiwgd2Uga25vdyB3aGljaCBmdW5jdGlvbnMKLSAgIyBuZXdsaWIgcHJvdmlkZSBhbmQgd2hpY2ggb25lcyB3ZSB3aWxsIGJlIGV4cGVjdGVkIHRvIHByb3ZpZGUuCi0KLSAgaWYgdGVzdCAieCR7d2l0aF9uZXdsaWJ9IiA9ICJ4eWVzIjsgdGhlbgotICAgIEFMTE9DQT0iYWxsb2NhLm8iCi0gICAgTElCT0JKUz0iYXNwcmludGYubyBiYXNlbmFtZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmR1cC5vIHZhc3ByaW50Zi5vIgotCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYXNwcmludGYgfCBiYXNlbmFtZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmR1cCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRuIDEKLUVPRgotCi0JICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgbmV3bGliIGRvZXNudCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9udCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KLQotICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgbmV3bGliIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUkVSUk9SIDEKLUVPRgotCi0KLSAgICBzZXRvYmpzPXllcwotCi0gIGZpCi1maQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi12eHdvcmtzKikKLSAgICAjIEhhbmRsZSBWeFdvcmtzIGNvbmZpZ3VyYXRpb24gc3BlY2lhbGx5LCBzaW5jZSBvbiBWeFdvcmtzIHRoZQotICAgICMgbGlicmFyaWVzIGFyZSBhY3R1YWxseSBvbiB0aGUgdGFyZ2V0IGJvYXJkLCBub3QgaW4gdGhlIGZpbGUKLSAgICAjIHN5c3RlbS4KLSAgICBMSUJPQkpTPSJiYXNlbmFtZS5vIGdldHBhZ2VzaXplLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyY2FzZWNtcC5vIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHN0cm5jYXNlY21wLm8gc3RyZHVwLm8gdmZvcmsubyB3YWl0cGlkLm8gdmFzcHJpbnRmLm8iCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYmFzZW5hbWUgfCBnZXRwYWdlc2l6ZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmNhc2VjbXApCi0JICA7OwotCXN0cm5jYXNlY21wIHwgc3RyZHVwIHwgdmZvcmsgfCB3YWl0cGlkIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBWeFdvcmtzIGRvZXNuJ3QgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBWeFdvcmtzIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUkVSUk9SIDEKLUVPRgotCi0KLSAgICBzZXRvYmpzPXllcwotICAgIDs7Ci0KLSAgZXNhYwotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLQotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi1jeWd3aW4qKQotICAgICMgVGhlIEN5Z3dpbiBsaWJyYXJ5IGFjdHVhbGx5IHVzZXMgYSBjb3VwbGUgb2YgZmlsZXMgZnJvbQotICAgICMgbGliaWJlcnR5IHdoZW4gaXQgaXMgYnVpbHQuICBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBuYXRpdmUKLSAgICAjIEN5Z3dpbiwgYW5kIHdlIHJ1biB0aGUgdGVzdHMsIHdlIHdpbGwgYXBwZWFyIHRvIGhhdmUgdGhlc2UKLSAgICAjIGZpbGVzLiAgSG93ZXZlciwgd2hlbiB3ZSBnbyBvbiB0byBidWlsZCB3aW5zdXAsIHdlIHdpbGwgd2luZCB1cAotICAgICMgd2l0aCBhIGxpYnJhcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgZmlsZXMsIHNpbmNlIHRoZXkgc2hvdWxkCi0gICAgIyBoYXZlIGNvbWUgZnJvbSBsaWJpYmVydHkuCi0KLSAgICAjIFdlIGhhbmRsZSB0aGlzIGJ5IHJlbW92aW5nIHRoZSBmdW5jdGlvbnMgdGhlIHdpbnN1cCBsaWJyYXJ5Ci0gICAgIyBwcm92aWRlcyBmcm9tIG91ciBzaGVsbCB2YXJpYWJsZXMsIHNvIHRoYXQgdGhleSBhcHBlYXIgdG8gYmUKLSAgICAjIG1pc3NpbmcuCi0KLSAgICBmdW5jcz0iYGVjaG8gJGZ1bmNzIHwgc2VkIC1lICdzL3JhbmRvbS8vJ2AiCi0gICAgTElCT0JKUz0iJExJQk9CSlMgcmFuZG9tLm8iCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX3NpZ2xpc3QvLydgIgotICAgIGNoZWNrZnVuY3M9ImBlY2hvICRjaGVja2Z1bmNzIHwgc2VkIC1lICdzL3N0cnNpZ25hbC8vJyAtZSAncy9wc2lnbmFsLy8nYCIKLSAgICA7OwotCi0gICotKi1taW5ndzMyKikKLSAgICAjIFVuZGVyIG1pbmd3MzIsIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCBleGlzdCwgYnV0IHRoZXkgYXJlCi0gICAgIyBtYWNyb3MsIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfbmVyci8vJyAtZSAncy9zeXNfZXJybGlzdC8vJ2AiCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX05FUlIgMQotRU9GCi0KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxCi1FT0YKLQotICAgIDs7Ci0KLSAgKi0qLXV3aW4qKQotICAgICMgVW5kZXIgc29tZSB2ZXJzaW9ucyBvZiB1d2luLCB2Zm9yayBpcyBub3RvcmlvdXNseSBidWdneSBhbmQgdGhlIHRlc3QgCi0gICAgIyBjYW4gaGFuZyBjb25maWd1cmU7IG9uIG90aGVyIHZlcnNpb25zLCB2Zm9yayBleGlzdHMganVzdCBhcyBhIHN0dWIuCi0gICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHZmb3JrIGluIHV3aW4ncyBydW50aW1lIGlzIGZpeGVkLgotICAgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLSAgICA7OwotCi0gIGVzYWMKLQotICAjIFdlIGhhdmVuJ3Qgc2V0IHRoZSBsaXN0IG9mIG9iamVjdHMgeWV0LiAgVXNlIHRoZSBzdGFuZGFyZCBhdXRvY29uZgotICAjIHRlc3RzLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgY29tcGlsZXIgd29ya3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTczODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTc0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotICBmb3IgYWNfZnVuYyBpbiAkZnVuY3MKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3ODc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3OTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotTElCT0JKUz0iJExJQk9CSlMgJHthY19mdW5jfS4ke2FjX29iamV4dH0iCi1maQotZG9uZQotCi0KLSAgIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg0NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4NDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Nzc6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0MjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTcyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTc3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAyNzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzY6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwODEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIwODk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTI0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwaWRfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE4MDogY2hlY2tpbmcgZm9yIHBpZF90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3BpZF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlwaWRfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfcGlkX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9waWRfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3BpZF90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3BpZF90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHBpZF90IGludAotRU9GCi0KLWZpCi0KLWFjX3NhZmU9YGVjaG8gInZmb3JrLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZmb3JrLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMTQ6IGNoZWNraW5nIGZvciB2Zm9yay5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDx2Zm9yay5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjI0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVkZPUktfSCAxCi1FT0YKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjQ5OiBjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY192Zm9ya193b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB2Zm9yayIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI1NTogY2hlY2tpbmcgZm9yIHZmb3JrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3Zmb3JrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciB2Zm9yaygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHZmb3JrKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfdmZvcmspIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3Zmb3JrKQotY2hva2UgbWUKLSNlbHNlCi12Zm9yaygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjgzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3Zmb3JrPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY192Zm9yaz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ3Zmb3JrYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1hY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogVGhhbmtzIHRvIFBhdWwgRWdnZXJ0IGZvciB0aGlzIHRlc3QuICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1ZGT1JLX0gKLSNpbmNsdWRlIDx2Zm9yay5oPgotI2VuZGlmCi0vKiBPbiBzb21lIHNwYXJjIHN5c3RlbXMsIGNoYW5nZXMgYnkgdGhlIGNoaWxkIHRvIGxvY2FsIGFuZCBpbmNvbWluZwotICAgYXJndW1lbnQgcmVnaXN0ZXJzIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudC4KLSAgIFRoZSBjb21waWxlciBpcyB0b2xkIGFib3V0IHRoaXMgd2l0aCAjaW5jbHVkZSA8dmZvcmsuaD4sCi0gICBidXQgc29tZSBjb21waWxlcnMgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4KLSAgIFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYSBzdGF0aWMgdmFyaWFibGUgd2hvc2UgYWRkcmVzcwotICAgaXMgcHV0IGludG8gYSByZWdpc3RlciB0aGF0IGlzIGNsb2JiZXJlZCBieSB0aGUgdmZvcmsuICAqLwotc3RhdGljCi0jaWZkZWYgX19jcGx1c3BsdXMKLXNwYXJjX2FkZHJlc3NfdGVzdCAoaW50IGFyZykKLSNlbHNlCi1zcGFyY19hZGRyZXNzX3Rlc3QgKGFyZykgaW50IGFyZzsKLSNlbmRpZgotewotICBzdGF0aWMgcGlkX3QgY2hpbGQ7Ci0gIGlmICghY2hpbGQpIHsKLSAgICBjaGlsZCA9IHZmb3JrICgpOwotICAgIGlmIChjaGlsZCA8IDApIHsKLSAgICAgIHBlcnJvciAoInZmb3JrIik7Ci0gICAgICBfZXhpdCgyKTsKLSAgICB9Ci0gICAgaWYgKCFjaGlsZCkgewotICAgICAgYXJnID0gZ2V0cGlkKCk7Ci0gICAgICB3cml0ZSgtMSwgIiIsIDApOwotICAgICAgX2V4aXQgKGFyZyk7Ci0gICAgfQotICB9Ci19Ci1tYWluKCkgewotICBwaWRfdCBwYXJlbnQgPSBnZXRwaWQgKCk7Ci0gIHBpZF90IGNoaWxkOwotCi0gIHNwYXJjX2FkZHJlc3NfdGVzdCAoKTsKLQotICBjaGlsZCA9IHZmb3JrICgpOwotCi0gIGlmIChjaGlsZCA9PSAwKSB7Ci0gICAgLyogSGVyZSBpcyBhbm90aGVyIHRlc3QgZm9yIHNwYXJjIHZmb3JrIHJlZ2lzdGVyIHByb2JsZW1zLgotICAgICAgIFRoaXMgdGVzdCB1c2VzIGxvdHMgb2YgbG9jYWwgdmFyaWFibGVzLCBhdCBsZWFzdAotICAgICAgIGFzIG1hbnkgbG9jYWwgdmFyaWFibGVzIGFzIG1haW4gaGFzIGFsbG9jYXRlZCBzbyBmYXIKLSAgICAgICBpbmNsdWRpbmcgY29tcGlsZXIgdGVtcG9yYXJpZXMuICA0IGxvY2FscyBhcmUgZW5vdWdoIGZvcgotICAgICAgIGdjYyAxLjQwLjMgb24gYSBTb2xhcmlzIDQuMS4zIHNwYXJjLCBidXQgd2UgdXNlIDggdG8gYmUgc2FmZS4KLSAgICAgICBBIGJ1Z2d5IGNvbXBpbGVyIHNob3VsZCByZXVzZSB0aGUgcmVnaXN0ZXIgb2YgcGFyZW50Ci0gICAgICAgZm9yIG9uZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLCBzaW5jZSBpdCB3aWxsIHRoaW5rIHRoYXQKLSAgICAgICBwYXJlbnQgY2FuJ3QgcG9zc2libHkgYmUgdXNlZCBhbnkgbW9yZSBpbiB0aGlzIHJvdXRpbmUuCi0gICAgICAgQXNzaWduaW5nIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB3aWxsIHRodXMgbXVuZ2UgcGFyZW50Ci0gICAgICAgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgKi8KLSAgICBwaWRfdAotICAgICAgcCA9IGdldHBpZCgpLCBwMSA9IGdldHBpZCgpLCBwMiA9IGdldHBpZCgpLCBwMyA9IGdldHBpZCgpLAotICAgICAgcDQgPSBnZXRwaWQoKSwgcDUgPSBnZXRwaWQoKSwgcDYgPSBnZXRwaWQoKSwgcDcgPSBnZXRwaWQoKTsKLSAgICAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhhdCBwLi5wNyBhcmUgbGl2ZTsgb3RoZXJ3aXNlLCBpdCBtaWdodAotICAgICAgIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSByZWdpc3RlciBmb3IgYWxsIDggbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgICBpZiAocCAhPSBwMSB8fCBwICE9IHAyIHx8IHAgIT0gcDMgfHwgcCAhPSBwNAotCXx8IHAgIT0gcDUgfHwgcCAhPSBwNiB8fCBwICE9IHA3KQotICAgICAgX2V4aXQoMSk7Ci0KLSAgICAvKiBPbiBzb21lIHN5c3RlbXMgKGUuZy4gSVJJWCAzLjMpLAotICAgICAgIHZmb3JrIGRvZXNuJ3Qgc2VwYXJhdGUgcGFyZW50IGZyb20gY2hpbGQgZmlsZSBkZXNjcmlwdG9ycy4KLSAgICAgICBJZiB0aGUgY2hpbGQgY2xvc2VzIGEgZGVzY3JpcHRvciBiZWZvcmUgaXQgZXhlY3Mgb3IgZXhpdHMsCi0gICAgICAgdGhpcyBtdW5nZXMgdGhlIHBhcmVudCdzIGRlc2NyaXB0b3IgYXMgd2VsbC4KLSAgICAgICBUZXN0IGZvciB0aGlzIGJ5IGNsb3Npbmcgc3Rkb3V0IGluIHRoZSBjaGlsZC4gICovCi0gICAgX2V4aXQoY2xvc2UoZmlsZW5vKHN0ZG91dCkpICE9IDApOwotICB9IGVsc2UgewotICAgIGludCBzdGF0dXM7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKLSAgICAgIDsKLSAgICBleGl0KAotCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLwotCSBjaGlsZCA8IDAKLQotCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCi0JIHx8IHN0YXR1cwotCi0JIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KLQkgfHwgcGFyZW50ICE9IGdldHBpZCgpCi0KLQkgLyogRGlkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYnVnIG9jY3VyPyAgKi8KLQkgfHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAotCSApOwotICB9Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHZmb3JrIGZvcmsKLUVPRgotCi1maQotCi0gIGlmIHRlc3QgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgPSBubzsgdGhlbgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHZmb3JrLm8iCi0gIGZpCi0gIGZvciB2IGluICR2YXJzOyBkbwotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkdiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyNzogY2hlY2tpbmcgZm9yICR2IiA+JjUKLSAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliaWJlcnR5X2N2X3Zhcl8kdicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotaW50ICpwOwotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50ICR2OyBwID0gJiR2OwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Mzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGxpYmliZXJ0eV9jdl92YXJfJyR2YFwiID0geWVzIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgICAgbj1IQVZFX2BlY2hvICR2IHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgICBmaQotICBkb25lCi0gIGZvciBhY19mdW5jIGluICRjaGVja2Z1bmNzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDY1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0OTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZpCi0KLSMgSW5zdGFsbCBhIGxpYnJhcnkgYnVpbHQgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIGluICQodG9vbGRpcikgcmF0aGVyCi0jIHRoYW4gJChsaWJkaXIpLgotaWYgdGVzdCAteiAiJHt3aXRoX2Nyb3NzX2hvc3R9IjsgdGhlbgotICBJTlNUQUxMX0RFU1Q9bGliZGlyCi1lbHNlCi0gIElOU1RBTExfREVTVD10b29sZGlyCi1maQotCi0KLSMgV2UgbmVlZCBtdWx0aWxpYiBzdXBwb3J0LCBidXQgb25seSBpZiBjb25maWd1cmluZyBmb3IgdGhlIHRhcmdldC4KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLS9AaG9zdF9tYWtlZmlsZV9mcmFnQC9yICRob3N0X21ha2VmaWxlX2ZyYWcKLXMlQGhvc3RfbWFrZWZpbGVfZnJhZ0AlJWcKLXMlQENQUEAlJENQUCVnCi1zJUBMSUJPQkpTQCUkTElCT0JKUyVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVASU5TVEFMTF9ERVNUQCUkSU5TVEFMTF9ERVNUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotc3JjZGlyPSR7c3JjZGlyfQotaG9zdD0ke2hvc3R9Ci10YXJnZXQ9JHt0YXJnZXR9Ci13aXRoX3RhcmdldF9zdWJkaXI9JHt3aXRoX3RhcmdldF9zdWJkaXJ9Ci13aXRoX211bHRpc3ViZGlyPSR7d2l0aF9tdWx0aXN1YmRpcn0KLWFjX2NvbmZpZ3VyZV9hcmdzPSItLWVuYWJsZS1tdWx0aWxpYiAke2FjX2NvbmZpZ3VyZV9hcmdzfSIKLUNPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotbGliaWJlcnR5X3RvcGRpcj0ke2xpYmliZXJ0eV90b3BkaXJ9Ci0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLWlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICAjIEZJWE1FOiBXZSBzaG91bGRuJ3QgbmVlZCB0byBzZXQgYWNfZmlsZQotICAgIGFjX2ZpbGU9TWFrZWZpbGUKLSAgICAuICR7bGliaWJlcnR5X3RvcGRpcn0vY29uZmlnLW1sLmluCi0gIGZpCi1maQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWd1cmUuaW4gYi9saWJpYmVydHkvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTAzMmE0Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKLQotQUNfUFJFUkVRKDIuMTIuMSkKLUFDX0lOSVQocGV4ZWN1dGUuYykKLQotZG5sIFdlIHVzZSB0aGVzZSBvcHRpb25zIHRvIGRlY2lkZSB3aGljaCBmdW5jdGlvbnMgdG8gaW5jbHVkZS4KLUFDX0FSR19XSVRIKHRhcmdldC1zdWJkaXIsCi1bICAtLXdpdGgtdGFyZ2V0LXN1YmRpcj1TVUJESVIgICAgICBDb25maWd1cmluZyBpbiBhIHN1YmRpcmVjdG9yeV0pCi1BQ19BUkdfV0lUSChjcm9zcy1ob3N0LAotWyAgLS13aXRoLWNyb3NzLWhvc3Q9SE9TVCAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyXSkKLUFDX0FSR19XSVRIKG5ld2xpYiwKLVsgIC0td2l0aC1uZXdsaWIgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggbmV3bGliXSkKLQotaWYgdGVzdCAiJHtzcmNkaXJ9IiA9ICIuIjsgdGhlbgotICBpZiB0ZXN0IC16ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgotICBlbHNlCi0gICAgaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiI7IHRoZW4KLSAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4iCi0gICAgZWxzZQotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLiIKLSAgICBmaQotICBmaQotZWxzZQotICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi1maQotQUNfQ09ORklHX0FVWF9ESVIoJGxpYmliZXJ0eV90b3BkaXIpCi0KLUFDX0NBTk9OSUNBTF9IT1NUCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UobGliaWJlcnR5LCAxLjApCi0KLWRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50Ci1kbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi0jIEZJWE1FOiBXZSB0ZW1wb3JhcmlseSBkZWZpbmUgb3VyIG93biB2ZXJzaW9uIG9mIEFDX1BST0dfQ0MuICBUaGlzIGlzCi0jIGNvcGllZCBmcm9tIGF1dG9jb25mIDIuMTIsIGJ1dCBkb2VzIG5vdCBjYWxsIEFDX1BST0dfQ0NfV09SS1MuICBXZQotIyBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlciwgd2hpY2ggd2lsbCBub3QgYmUgYWJsZSB0byBmdWxseQotIyBsaW5rIGFuIGV4ZWN1dGFibGUuICBUaGlzIHNob3VsZCByZWFsbHkgYmUgZml4ZWQgaW4gYXV0b2NvbmYKLSMgaXRzZWxmLgotCi1BQ19ERUZVTihMSUJfQUNfUFJPR19DQywKLVtBQ19CRUZPUkUoWyQwXSwgW0FDX1BST0dfQ1BQXSlkbmwKLUFDX1BST1ZJREUoW0FDX1BST0dfQ0NdKQotQUNfQ0hFQ0tfUFJPRyhDQywgZ2NjLCBnY2MpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIEFDX0NIRUNLX1BST0coQ0MsIGNjLCBjYywgLCAsIC91c3IvdWNiL2NjKQotICB0ZXN0IC16ICIkQ0MiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEhdKQotZmkKLQotQUNfUFJPR19DQ19HTlUKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZG5sIENoZWNrIHdoZXRoZXIgLWcgd29ya3MsIGV2ZW4gaWYgQ0ZMQUdTIGlzIHNldCwgaW4gY2FzZSB0aGUgcGFja2FnZQotZG5sIHBsYXlzIGFyb3VuZCB3aXRoIENGTEFHUyAoc3VjaCBhcyB0byBidWlsZCBib3RoIGRlYnVnZ2luZyBhbmQKLWRubCBub3JtYWwgdmVyc2lvbnMgb2YgYSBsaWJyYXJ5KSwgdGFzdGVsZXNzIGFzIHRoYXQgaWRlYSBpcy4KLSAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9Ci0gIEFDX1BST0dfQ0NfRwotICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0gIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR0NDPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLV0pCi0KLUxJQl9BQ19QUk9HX0NDCi0KLUFDX0lTQ19QT1NJWAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBsaWJ0b29sOgotZG5sIERlZmF1bHQgdG8gYSBub24gc2hhcmVkIGxpYnJhcnkuICBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZQotZG5sIGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtc2hhcmVkLgotZG5sIEFNX0RJU0FCTEVfU0hBUkVECi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGxpYnRvb2w6Ci1kbmwgQU1fUFJPR19MSUJUT09MCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotQUNfQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX01BSU5UQUlORVJfTU9ERQotZG5sIEFDX0VYRUVYVAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKLWRubCBBTV9QUk9HX0lOU1RBTEwKLUFDX1BST0dfSU5TVEFMTAotCi0uICR7c3JjZGlyfS9jb25maWcudGFibGUKLWhvc3RfbWFrZWZpbGVfZnJhZz0ke2ZyYWd9Ci1BQ19TVUJTVF9GSUxFKGhvc3RfbWFrZWZpbGVfZnJhZykKLQotIyBJdCdzIE9LIHRvIGNoZWNrIGZvciBoZWFkZXIgZmlsZXMuICBBbHRob3VnaCB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZQotIyBhYmxlIHRvIGxpbmsgYW55dGhpbmcsIGl0IGhhZCBiZXR0ZXIgYmUgYWJsZSB0byBhdCBsZWFzdCBjb21waWxlCi0jIHNvbWV0aGluZy4KLUFDX0NIRUNLX0hFQURFUlMoc3lzL2ZpbGUuaCBzeXMvcGFyYW0uaCBzdGRsaWIuaCBzdHJpbmcuaCB1bmlzdGQuaCBzdHJpbmdzLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaCkKLUFDX0hFQURFUl9TWVNfV0FJVAotCi0jIFRoaXMgaXMgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGxpYmliZXJ0eSB3aWxsIHByb3ZpZGUgaWYgdGhleQotIyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUgaG9zdC4KLQotZnVuY3M9ImFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyBhdGV4aXQiCi1mdW5jcz0iJGZ1bmNzIGJhc2VuYW1lIgotZnVuY3M9IiRmdW5jcyBiY21wIgotZnVuY3M9IiRmdW5jcyBiY29weSIKLWZ1bmNzPSIkZnVuY3MgYnplcm8iCi1mdW5jcz0iJGZ1bmNzIGNhbGxvYyIKLWZ1bmNzPSIkZnVuY3MgY2xvY2siCi1mdW5jcz0iJGZ1bmNzIGdldGN3ZCIKLWZ1bmNzPSIkZnVuY3MgZ2V0cGFnZXNpemUiCi1mdW5jcz0iJGZ1bmNzIGluZGV4IgotZnVuY3M9IiRmdW5jcyBpbnNxdWUiCi1mdW5jcz0iJGZ1bmNzIG1lbWNociIKLWZ1bmNzPSIkZnVuY3MgbWVtY21wIgotZnVuY3M9IiRmdW5jcyBtZW1jcHkiCi1mdW5jcz0iJGZ1bmNzIG1lbW1vdmUiCi1mdW5jcz0iJGZ1bmNzIG1lbXNldCIKLWZ1bmNzPSIkZnVuY3MgbWtzdGVtcHMiCi1mdW5jcz0iJGZ1bmNzIHJhbmRvbSIKLWZ1bmNzPSIkZnVuY3MgcmVuYW1lIgotZnVuY3M9IiRmdW5jcyByaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIHNpZ3NldG1hc2siCi1mdW5jcz0iJGZ1bmNzIHN0cmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cmNociIKLWZ1bmNzPSIkZnVuY3Mgc3RyZHVwIgotZnVuY3M9IiRmdW5jcyBzdHJuY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RycmNociIKLWZ1bmNzPSIkZnVuY3Mgc3Ryc3RyIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2QiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvbCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG91bCIKLWZ1bmNzPSIkZnVuY3MgdG1wbmFtIgotZnVuY3M9IiRmdW5jcyB2YXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZmcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2cHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2c3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3Mgd2FpdHBpZCIKLQotIyBBbHNvIGluIHRoZSBvbGQgZnVuY3Rpb24uZGVmIGZpbGU6IGFsbG9jYSwgdmZvcmssIGdldG9wdC4KLQotdmFycz0ic3lzX2Vycmxpc3Qgc3lzX25lcnIgc3lzX3NpZ2xpc3QiCi0KLWNoZWNrZnVuY3M9ImdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMgc2JyayIKLQotIyBUaGVzZSBhcmUgbmVpdGhlciBleGVjdXRlZCBub3IgcmVxdWlyZWQsIGJ1dCB0aGV5IGhlbHAga2VlcAotIyBhdXRvaGVhZGVyIGhhcHB5IHdpdGhvdXQgYWRkaW5nIGEgYnVuY2ggb2YgdGV4dCB0byBhY2NvbmZpZy5oLgotaWYgdGVzdCAieCIgPSAieSI7IHRoZW4KLSAgQUNfQ0hFQ0tfRlVOQ1MoYXNwcmludGYgYXRleGl0IGJhc2VuYW1lIGJjbXAgYmNvcHkgYnplcm8gY2FsbG9jIGNsb2NrIGdldGN3ZCkKLSAgQUNfQ0hFQ0tfRlVOQ1MoZ2V0cGFnZXNpemUgaW5kZXggaW5zcXVlIG1rc3RlbXBzIG1lbWNociBtZW1jbXAgbWVtY3B5IG1lbW1vdmUpCi0gIEFDX0NIRUNLX0ZVTkNTKG1lbXNldCByYW5kb20gcmVuYW1lIHJpbmRleCBzaWdzZXRtYXNrIHN0cmNhc2VjbXApCi0gIEFDX0NIRUNLX0ZVTkNTKHN0cmNociBzdHJkdXAgc3RybmNhc2VjbXAgc3RycmNociBzdHJzdHIgc3RydG9kIHN0cnRvbCkKLSAgQUNfQ0hFQ0tfRlVOQ1Moc3RydG91bCB0bXBuYW0gdmFzcHJpbnRmIHZmcHJpbnRmIHZwcmludGYgdnNwcmludGYgd2FpdHBpZCkKLSAgQUNfREVGSU5FKEhBVkVfU1lTX0VSUkxJU1QpCi0gIEFDX0RFRklORShIQVZFX1NZU19ORVJSKQotICBBQ19ERUZJTkUoSEFWRV9TWVNfU0lHTElTVCkKLSAgQUNfQ0hFQ0tfRlVOQ1MoZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcykKLSAgQUNfQ0hFQ0tfRlVOQ1Moc2JyaykKLWZpCi0KLSMgRm9yIGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zLCBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIHRoZQotIyBmdW5jdGlvbiB3ZSB3YW50IHRvIHB1dCBGTi5vIGluIExJQk9CSlMsIGFuZCBpZiB0aGUgaG9zdCBkb2VzCi0jIHByb3ZpZGUgdGhlIGZ1bmN0aW9uLCB3ZSB3YW50IHRvIGRlZmluZSBIQVZFX0ZOIGluIGNvbmZpZy5oLiAgQWxzbywKLSMgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSBhbGxvY2EsIHdlIHNldCBBTExPQ0EgdG8gYWxsb2NhLm8KLQotc2V0b2Jqcz0KLWlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLQotICAjIFdlIGFyZSBiZWluZyBjb25maWd1cmVkIGFzIGEgdGFyZ2V0IGxpYnJhcnkuICBBQ19SRVBMQUNFX0ZVTkNTCi0gICMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZSBhYmxlIHRvCi0gICMgbGluayBleGVjdXRhYmxlcy4gIE5vdGUgdGhhdCB3ZSBtYXkgc3RpbGwgYmUgYmVpbmcgY29uZmlndXJlZAotICAjIG5hdGl2ZS4KLQotICAjIElmIHdlIGFyZSBiZWluZyBjb25maWd1cmVkIGZvciBuZXdsaWIsIHdlIGtub3cgd2hpY2ggZnVuY3Rpb25zCi0gICMgbmV3bGliIHByb3ZpZGUgYW5kIHdoaWNoIG9uZXMgd2Ugd2lsbCBiZSBleHBlY3RlZCB0byBwcm92aWRlLgotCi0gIGlmIHRlc3QgIngke3dpdGhfbmV3bGlifSIgPSAieHllcyI7IHRoZW4KLSAgICBBTExPQ0E9ImFsbG9jYS5vIgotICAgIExJQk9CSlM9ImFzcHJpbnRmLm8gYmFzZW5hbWUubyBpbnNxdWUubyByYW5kb20ubyBzdHJkdXAubyB2YXNwcmludGYubyIKLQotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWFzcHJpbnRmIHwgYmFzZW5hbWUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJkdXAgfCB2YXNwcmludGYpCi0JICA7OwotCSopCi0JICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0JICBBQ19ERUZJTkVfVU5RVU9URUQoJG4pCi0JICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgbmV3bGliIGRvZXNudCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9udCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KLQotICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgbmV3bGliIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIEFDX0RFRklORShIQVZFX1NUUkVSUk9SKQotCi0gICAgc2V0b2Jqcz15ZXMKLQotICBmaQotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotdnh3b3JrcyopCi0gICAgIyBIYW5kbGUgVnhXb3JrcyBjb25maWd1cmF0aW9uIHNwZWNpYWxseSwgc2luY2Ugb24gVnhXb3JrcyB0aGUKLSAgICAjIGxpYnJhcmllcyBhcmUgYWN0dWFsbHkgb24gdGhlIHRhcmdldCBib2FyZCwgbm90IGluIHRoZSBmaWxlCi0gICAgIyBzeXN0ZW0uCi0gICAgTElCT0JKUz0iYmFzZW5hbWUubyBnZXRwYWdlc2l6ZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmNhc2VjbXAubyIKLSAgICBMSUJPQkpTPSIkTElCT0JKUyBzdHJuY2FzZWNtcC5vIHN0cmR1cC5vIHZmb3JrLm8gd2FpdHBpZC5vIHZhc3ByaW50Zi5vIgotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWJhc2VuYW1lIHwgZ2V0cGFnZXNpemUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJjYXNlY21wKQotCSAgOzsKLQlzdHJuY2FzZWNtcCB8IHN0cmR1cCB8IHZmb3JrIHwgd2FpdHBpZCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIEFDX0RFRklORV9VTlFVT1RFRCgkbikKLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBWeFdvcmtzIGRvZXNuJ3QgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBWeFdvcmtzIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIEFDX0RFRklORShIQVZFX1NUUkVSUk9SKQotCi0gICAgc2V0b2Jqcz15ZXMKLSAgICA7OwotCi0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotY3lnd2luKikKLSAgICAjIFRoZSBDeWd3aW4gbGlicmFyeSBhY3R1YWxseSB1c2VzIGEgY291cGxlIG9mIGZpbGVzIGZyb20KLSAgICAjIGxpYmliZXJ0eSB3aGVuIGl0IGlzIGJ1aWx0LiAgSWYgd2UgYXJlIGJ1aWxkaW5nIGEgbmF0aXZlCi0gICAgIyBDeWd3aW4sIGFuZCB3ZSBydW4gdGhlIHRlc3RzLCB3ZSB3aWxsIGFwcGVhciB0byBoYXZlIHRoZXNlCi0gICAgIyBmaWxlcy4gIEhvd2V2ZXIsIHdoZW4gd2UgZ28gb24gdG8gYnVpbGQgd2luc3VwLCB3ZSB3aWxsIHdpbmQgdXAKLSAgICAjIHdpdGggYSBsaWJyYXJ5IHdoaWNoIGRvZXMgbm90IGhhdmUgdGhlIGZpbGVzLCBzaW5jZSB0aGV5IHNob3VsZAotICAgICMgaGF2ZSBjb21lIGZyb20gbGliaWJlcnR5LgotCi0gICAgIyBXZSBoYW5kbGUgdGhpcyBieSByZW1vdmluZyB0aGUgZnVuY3Rpb25zIHRoZSB3aW5zdXAgbGlicmFyeQotICAgICMgcHJvdmlkZXMgZnJvbSBvdXIgc2hlbGwgdmFyaWFibGVzLCBzbyB0aGF0IHRoZXkgYXBwZWFyIHRvIGJlCi0gICAgIyBtaXNzaW5nLgotCi0gICAgZnVuY3M9ImBlY2hvICRmdW5jcyB8IHNlZCAtZSAncy9yYW5kb20vLydgIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHJhbmRvbS5vIgotICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19zaWdsaXN0Ly8nYCIKLSAgICBjaGVja2Z1bmNzPSJgZWNobyAkY2hlY2tmdW5jcyB8IHNlZCAtZSAncy9zdHJzaWduYWwvLycgLWUgJ3MvcHNpZ25hbC8vJ2AiCi0gICAgOzsKLQotICAqLSotbWluZ3czMiopCi0gICAgIyBVbmRlciBtaW5ndzMyLCBzeXNfbmVyciBhbmQgc3lzX2Vycmxpc3QgZXhpc3QsIGJ1dCB0aGV5IGFyZQotICAgICMgbWFjcm9zLCBzbyB0aGUgdGVzdCBiZWxvdyB3b24ndCBmaW5kIHRoZW0uCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX25lcnIvLycgLWUgJ3Mvc3lzX2Vycmxpc3QvLydgIgotICAgIEFDX0RFRklORShIQVZFX1NZU19ORVJSKQotICAgIEFDX0RFRklORShIQVZFX1NZU19FUlJMSVNUKQotICAgIDs7Ci0KLSAgKi0qLXV3aW4qKQotICAgICMgVW5kZXIgc29tZSB2ZXJzaW9ucyBvZiB1d2luLCB2Zm9yayBpcyBub3RvcmlvdXNseSBidWdneSBhbmQgdGhlIHRlc3QgCi0gICAgIyBjYW4gaGFuZyBjb25maWd1cmU7IG9uIG90aGVyIHZlcnNpb25zLCB2Zm9yayBleGlzdHMganVzdCBhcyBhIHN0dWIuCi0gICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHZmb3JrIGluIHV3aW4ncyBydW50aW1lIGlzIGZpeGVkLgotICAgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLSAgICA7OwotCi0gIGVzYWMKLQotICAjIFdlIGhhdmVuJ3Qgc2V0IHRoZSBsaXN0IG9mIG9iamVjdHMgeWV0LiAgVXNlIHRoZSBzdGFuZGFyZCBhdXRvY29uZgotICAjIHRlc3RzLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgY29tcGlsZXIgd29ya3MuCi0gIEFDX1BST0dfQ0NfV09SS1MKLSAgQUNfUkVQTEFDRV9GVU5DUygkZnVuY3MpCi0gIEFDX0ZVTkNfQUxMT0NBCi0gIEFDX0ZVTkNfVkZPUksKLSAgaWYgdGVzdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyA9IG5vOyB0aGVuCi0gICAgTElCT0JKUz0iJExJQk9CSlMgdmZvcmsubyIKLSAgZmkKLSAgZm9yIHYgaW4gJHZhcnM7IGRvCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgJHZdKQotICAgIEFDX0NBQ0hFX1ZBTChsaWJpYmVydHlfY3ZfdmFyXyR2LAotICAgICAgW0FDX1RSWV9MSU5LKFtpbnQgKnA7XSwgW2V4dGVybiBpbnQgJHY7IHAgPSAmJHY7XSwKLQkJICAgW2V2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9eWVzIl0sCi0JCSAgIFtldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PW5vIl0pXSkKLSAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRsaWJpYmVydHlfY3ZfdmFyXyckdmBcIiA9IHllcyI7IHRoZW4KLSAgICAgIEFDX01TR19SRVNVTFQoeWVzKQotICAgICAgbj1IQVZFX2BlY2hvICR2IHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQotICAgIGVsc2UKLSAgICAgIEFDX01TR19SRVNVTFQobm8pCi0gICAgZmkKLSAgZG9uZQotICBBQ19DSEVDS19GVU5DUygkY2hlY2tmdW5jcykKLWZpCi0KLSMgSW5zdGFsbCBhIGxpYnJhcnkgYnVpbHQgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIGluICQodG9vbGRpcikgcmF0aGVyCi0jIHRoYW4gJChsaWJkaXIpLgotaWYgdGVzdCAteiAiJHt3aXRoX2Nyb3NzX2hvc3R9IjsgdGhlbgotICBJTlNUQUxMX0RFU1Q9bGliZGlyCi1lbHNlCi0gIElOU1RBTExfREVTVD10b29sZGlyCi1maQotQUNfU1VCU1QoSU5TVEFMTF9ERVNUKQotCi0jIFdlIG5lZWQgbXVsdGlsaWIgc3VwcG9ydCwgYnV0IG9ubHkgaWYgY29uZmlndXJpbmcgZm9yIHRoZSB0YXJnZXQuCi1BQ19PVVRQVVQoTWFrZWZpbGUsCi1bdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLWlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICAjIEZJWE1FOiBXZSBzaG91bGRuJ3QgbmVlZCB0byBzZXQgYWNfZmlsZQotICAgIGFjX2ZpbGU9TWFrZWZpbGUKLSAgICAuICR7bGliaWJlcnR5X3RvcGRpcn0vY29uZmlnLW1sLmluCi0gIGZpCi1maV0sCi1zcmNkaXI9JHtzcmNkaXJ9Ci1ob3N0PSR7aG9zdH0KLXRhcmdldD0ke3RhcmdldH0KLXdpdGhfdGFyZ2V0X3N1YmRpcj0ke3dpdGhfdGFyZ2V0X3N1YmRpcn0KLXdpdGhfbXVsdGlzdWJkaXI9JHt3aXRoX211bHRpc3ViZGlyfQotYWNfY29uZmlndXJlX2FyZ3M9Ii0tZW5hYmxlLW11bHRpbGliICR7YWNfY29uZmlndXJlX2FyZ3N9IgotQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1saWJpYmVydHlfdG9wZGlyPSR7bGliaWJlcnR5X3RvcGRpcn0KLSkKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb3B5c2lnbi5jIGIvbGliaWJlcnR5L2NvcHlzaWduLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNWY4YzMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvcHlzaWduLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBfX0lFRUVfQklHX0VORElBTgotCi10eXBlZGVmIHVuaW9uIAotewotICBkb3VibGUgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDExOwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6NDsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMzoxNjsKLSAgICAKLSAgfSBudW1iZXI7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDExOwotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6MzsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMzoxNjsKLSAgfSBuYW47Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgbXN3OwotICAgIHVuc2lnbmVkIGxvbmcgbHN3OwotICB9IHBhcnRzOwotICAgIGxvbmcgYXNsb25nWzJdOwotfSBfX2llZWVfZG91YmxlX3NoYXBlX3R5cGU7Ci0KLSNlbmRpZgotCi0jaWZkZWYgX19JRUVFX0xJVFRMRV9FTkRJQU4KLQotdHlwZWRlZiB1bmlvbiAKLXsKLSAgZG91YmxlIHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSNpZmRlZiBfX1NNQUxMX0JJVEZJRUxEUwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjM6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6IDQ7Ci0jZWxzZQotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6MzI7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDoyMDsKLSNlbmRpZgotICAgIHVuc2lnbmVkIGludCBleHBvbmVudCA6MTE7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gICAgIDogMTsKLSAgfSBudW1iZXI7Ci0gIHN0cnVjdCAKLSAgewotI2lmZGVmIF9fU01BTExfQklURklFTERTCi0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMzoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDozOwotI2Vsc2UKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjMyOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6MTk7Ci0jZW5kaWYKLSAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDExOwotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgfSBuYW47Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgbHN3OwotICAgIHVuc2lnbmVkIGxvbmcgbXN3OwotICB9IHBhcnRzOwotCi0gIGxvbmcgYXNsb25nWzJdOwotCi19IF9faWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKLQotI2VuZGlmCi0KLSNpZmRlZiBfX0lFRUVfQklHX0VORElBTgotdHlwZWRlZiB1bmlvbgotewotICBmbG9hdCB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogODsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOiA3OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6IDE2OwotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ246MTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKLSAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgfSBuYW47Ci0gIGxvbmcgcDE7Ci0gIAotfSBfX2llZWVfZmxvYXRfc2hhcGVfdHlwZTsKLSNlbmRpZgotCi0jaWZkZWYgX19JRUVFX0xJVFRMRV9FTkRJQU4KLXR5cGVkZWYgdW5pb24KLXsKLSAgZmxvYXQgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMTogMTY7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiA4OwotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgfSBudW1iZXI7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDo2OwotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDo4OwotICAgIHVuc2lnbmVkIGludCBzaWduOjE7Ci0gIH0gbmFuOwotICBsb25nIHAxOwotICAKLX0gX19pZWVlX2Zsb2F0X3NoYXBlX3R5cGU7Ci0jZW5kaWYKLQotCi1kb3VibGUgREVGVU4oY29weXNpZ24sICh4LCB5KSwgZG91YmxlIHggQU5EIGRvdWJsZSB5KQotewotICBfX2llZWVfZG91YmxlX3NoYXBlX3R5cGUgYSxiOwotICBiLnZhbHVlID0geTsgIAotICBhLnZhbHVlID0geDsKLSAgYS5udW1iZXIuc2lnbiA9Yi5udW1iZXIuc2lnbjsKLSAgcmV0dXJuIGEudmFsdWU7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY3BsdXMtZGVtLmMgYi9saWJpYmVydHkvY3BsdXMtZGVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWY1NmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NwbHVzLWRlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYxMCArMCwwIEBACi0vKiBEZW1hbmdsZXIgZm9yIEdOVSBDKysKLSAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKYW1lcyBDbGFyayAoampjQGpjbGFyay51dWNwKQotICAgUmV3cml0dGVuIGJ5IEZyZWQgRmlzaCAoZm5mQGN5Z251cy5jb20pIGZvciBBUk0gYW5kIEx1Y2lkIGRlbWFuZ2xpbmcKLSAgIE1vZGlmaWVkIGJ5IFNhdGlzaCBQYWkgKHBhaUBhcG9sbG8uaHAuY29tKSBmb3IgSFAgZGVtYW5nbGluZwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGV4cG9ydHMgdHdvIGZ1bmN0aW9uczsgY3BsdXNfbWFuZ2xlX29wbmFtZSBhbmQgY3BsdXNfZGVtYW5nbGUuCi0KLSAgIFRoaXMgZmlsZSBpbXBvcnRzIHhtYWxsb2MgYW5kIHhyZWFsbG9jLCB3aGljaCBhcmUgbGlrZSBtYWxsb2MgYW5kCi0gICByZWFsbG9jIGV4Y2VwdCB0aGF0IHRoZXkgZ2VuZXJhdGUgYSBmYXRhbCBlcnJvciBpZiB0aGVyZSBpcyBubwotICAgYXZhaWxhYmxlIG1lbW9yeS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBib3RoIEdDQyBhbmQgbGliaWJlcnR5LiAgV2hlbiBtYWtpbmcgY2hhbmdlcywgcGxlYXNlCi0gICB0cnkgbm90IHRvIGJyZWFrIGVpdGhlci4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICogbWFsbG9jICgpOwotY2hhciAqIHJlYWxsb2MgKCk7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGRlbWFuZ2xlLmg+Ci0jdW5kZWYgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFCi0jZGVmaW5lIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSB3b3JrLT5vcHRpb25zCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKm15c3Ryc3RyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW15c3Ryc3RyIChzMSwgczIpCi0gICAgIGNvbnN0IGNoYXIgKnMxLCAqczI7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSBzMTsKLSAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAoczIpOwotCi0gIGZvciAoOyAocCA9IHN0cmNociAocCwgKnMyKSkgIT0gMDsgcCsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChwLCBzMiwgbGVuKSA9PSAwKQotCXsKLQkgIHJldHVybiAocCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogSW4gb3JkZXIgdG8gYWxsb3cgYSBzaW5nbGUgZGVtYW5nbGVyIGV4ZWN1dGFibGUgdG8gZGVtYW5nbGUgc3RyaW5ncwotICAgdXNpbmcgdmFyaW91cyBjb21tb24gdmFsdWVzIG9mIENQTFVTX01BUktFUiwgYXMgd2VsbCBhcyBhbnkgc3BlY2lmaWMKLSAgIG9uZSBzZXQgYXQgY29tcGlsZSB0aW1lLCB3ZSBtYWludGFpbiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUKLSAgIGNvbW1vbmx5IHVzZWQgb25lcywgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGUgbWFya2VyIHdlIGFyZSBsb29raW5nIGZvcgotICAgaXMgaW4gdGhhdCBzdHJpbmcuICBDUExVU19NQVJLRVIgaXMgdXN1YWxseSAnJCcgb24gc3lzdGVtcyB3aGVyZSB0aGUKLSAgIGFzc2VtYmxlciBjYW4gZGVhbCB3aXRoIHRoYXQuICBXaGVyZSB0aGUgYXNzZW1ibGVyIGNhbid0LCBpdCdzIHVzdWFsbHkKLSAgICcuJyAoYnV0IG9uIG1hbnkgc3lzdGVtcyAnLicgaXMgdXNlZCBmb3Igb3RoZXIgdGhpbmdzKS4gIFdlIHB1dCB0aGUKLSAgIGN1cnJlbnQgZGVmaW5lZCBDUExVU19NQVJLRVIgZmlyc3QgKHdoaWNoIGRlZmF1bHRzIHRvICckJyksIGZvbGxvd2VkCi0gICBieSB0aGUgbmV4dCBtb3N0IGNvbW1vbiB2YWx1ZSwgZm9sbG93ZWQgYnkgYW4gZXhwbGljaXQgJyQnIGluIGNhc2UKLSAgIHRoZSB2YWx1ZSBvZiBDUExVU19NQVJLRVIgaXMgbm90ICckJy4KLQotICAgV2UgY291bGQgYXZvaWQgdGhpcyBpZiB3ZSBjb3VsZCBqdXN0IGdldCBnKysgdG8gdGVsbCB1cyB3aGF0IHRoZSBhY3R1YWwKLSAgIGNwbHVzIG1hcmtlciBjaGFyYWN0ZXIgaXMgYXMgcGFydCBvZiB0aGUgZGVidWcgaW5mb3JtYXRpb24sIHBlcmhhcHMgYnkKLSAgIGVuc3VyaW5nIHRoYXQgaXQgaXMgdGhlIGNoYXJhY3RlciB0aGF0IHRlcm1pbmF0ZXMgdGhlIGdjYzxuPl9jb21waWxlZAotICAgbWFya2VyIHN5bWJvbCAoRklYTUUpLiAgKi8KLQotI2lmICFkZWZpbmVkIChDUExVU19NQVJLRVIpCi0jZGVmaW5lIENQTFVTX01BUktFUiAnJCcKLSNlbmRpZgotCi1lbnVtIGRlbWFuZ2xpbmdfc3R5bGVzIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGdudV9kZW1hbmdsaW5nOwotCi1zdGF0aWMgY2hhciBjcGx1c19tYXJrZXJzW10gPSB7IENQTFVTX01BUktFUiwgJy4nLCAnJCcsICdcMCcgfTsKLQotc3RhdGljIGNoYXIgY2hhcl9zdHJbMl0gPSB7ICdcMDAwJywgJ1wwMDAnIH07Ci0KLXZvaWQKLXNldF9jcGx1c19tYXJrZXJfZm9yX2RlbWFuZ2xpbmcgKGNoKQotICAgICBpbnQgY2g7Ci17Ci0gIGNwbHVzX21hcmtlcnNbMF0gPSBjaDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3Qgc3RyaW5nCQkvKiBCZXdhcmU6IHRoZXNlIGFyZW4ndCByZXF1aXJlZCB0byBiZSAqLwotewkJCQkvKiAgJ1wwJyB0ZXJtaW5hdGVkLiAgKi8KLSAgY2hhciAqYjsJCQkvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIHN0cmluZyAqLwotICBjaGFyICpwOwkJCS8qIHBvaW50ZXIgYWZ0ZXIgbGFzdCBjaGFyYWN0ZXIgKi8KLSAgY2hhciAqZTsJCQkvKiBwb2ludGVyIGFmdGVyIGVuZCBvZiBhbGxvY2F0ZWQgc3BhY2UgKi8KLX0gc3RyaW5nOwotCi0vKiBTdHVmZiB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHN1Yi1yb3V0aW5lcy4KLSAgIFVzaW5nIGEgc2hhcmVkIHN0cnVjdHVyZSBhbGxvd3MgY3BsdXNfZGVtYW5nbGUgdG8gYmUgcmVlbnRyYW50LiAgKi8KLQotc3RydWN0IHdvcmtfc3R1ZmYKLXsKLSAgaW50IG9wdGlvbnM7Ci0gIGNoYXIgKip0eXBldmVjOwotICBjaGFyICoqa3R5cGV2ZWM7Ci0gIGNoYXIgKipidHlwZXZlYzsKLSAgaW50IG51bWs7Ci0gIGludCBudW1iOwotICBpbnQga3NpemU7Ci0gIGludCBic2l6ZTsKLSAgaW50IG50eXBlczsKLSAgaW50IHR5cGV2ZWNfc2l6ZTsKLSAgaW50IGNvbnN0cnVjdG9yOwotICBpbnQgZGVzdHJ1Y3RvcjsKLSAgaW50IHN0YXRpY190eXBlOwkvKiBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gKi8KLSAgaW50IHRlbXBfc3RhcnQ7ICAgICAgIC8qIGluZGV4IGluIGRlbWFuZ2xlZCB0byBzdGFydCBvZiB0ZW1wbGF0ZSBhcmdzICovCi0gIGludCB0eXBlX3F1YWxzOyAgICAgICAvKiBUaGUgdHlwZSBxdWFsaWZpZXJzLiAgKi8KLSAgaW50IGRsbGltcG9ydGVkOwkvKiBTeW1ib2wgaW1wb3J0ZWQgZnJvbSBhIFBFIERMTCAqLwotICBjaGFyICoqdG1wbF9hcmd2ZWM7ICAgLyogVGVtcGxhdGUgZnVuY3Rpb24gYXJndW1lbnRzLiAqLwotICBpbnQgbnRtcGxfYXJnczsgICAgICAgLyogVGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBmdW5jdGlvbiBhcmd1bWVudHMuICovCi0gIGludCBmb3JnZXR0aW5nX3R5cGVzOyAvKiBOb256ZXJvIGlmIHdlIGFyZSBub3QgcmVtZW1iZXJpbmcgdGhlIHR5cGVzCi0JCQkgICB3ZSBzZWUuICAqLwotICBzdHJpbmcqIHByZXZpb3VzX2FyZ3VtZW50OyAvKiBUaGUgbGFzdCBmdW5jdGlvbiBhcmd1bWVudCBkZW1hbmdsZWQuICAqLwotICBpbnQgbnJlcGVhdHM7ICAgICAgICAgLyogVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHByZXZpb3VzCi0JCQkgICBhcmd1bWVudC4gICovCi19OwotCi0jZGVmaW5lIFBSSU5UX0FOU0lfUVVBTElGSUVSUyAod29yayAtPiBvcHRpb25zICYgRE1HTF9BTlNJKQotI2RlZmluZSBQUklOVF9BUkdfVFlQRVMgICAgICAgKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfUEFSQU1TKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdGFibGUKLXsKLSAgY29uc3QgY2hhciAqaW47Ci0gIGNvbnN0IGNoYXIgKm91dDsKLSAgaW50IGZsYWdzOwotfSBvcHRhYmxlW10gPSB7Ci0gIHsibnciLAkgICIgbmV3IiwJRE1HTF9BTlNJfSwJLyogbmV3ICgxLjkyLAkgYW5zaSkgKi8KLSAgeyJkbCIsCSAgIiBkZWxldGUiLAlETUdMX0FOU0l9LAkvKiBuZXcgKDEuOTIsCSBhbnNpKSAqLwotICB7Im5ldyIsCSAgIiBuZXciLAkwfSwJCS8qIG9sZCAoMS45MSwJIGFuZCAxLngpICovCi0gIHsiZGVsZXRlIiwJICAiIGRlbGV0ZSIsCTB9LAkJLyogb2xkICgxLjkxLAkgYW5kIDEueCkgKi8KLSAgeyJ2biIsCSAgIiBuZXcgW10iLAlETUdMX0FOU0l9LAkvKiBHTlUsIHBlbmRpbmcgYW5zaSAqLwotICB7InZkIiwJICAiIGRlbGV0ZSBbXSIsCURNR0xfQU5TSX0sCS8qIEdOVSwgcGVuZGluZyBhbnNpICovCi0gIHsiYXMiLAkgICI9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJuZSIsCSAgIiE9IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwgYW5zaSAqLwotICB7ImVxIiwJICAiPT0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsiZ2UiLAkgICI+PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJndCIsCSAgIj4iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsibGUiLAkgICI8PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJsdCIsCSAgIjwiLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsicGx1cyIsCSAgIisiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJwbCIsCSAgIisiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFwbCIsCSAgIis9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJtaW51cyIsCSAgIi0iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtaSIsCSAgIi0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFtaSIsCSAgIi09IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJtdWx0IiwJICAiKiIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1sIiwJICAiKiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW11IiwJICAiKj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAoQVJNL0x1Y2lkKSAqLwotICB7ImFtbCIsCSAgIio9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKEdOVS9nKyspICovCi0gIHsiY29udmVydCIsCSAgIisiLAkJMH0sCQkvKiBvbGQgKHVuYXJ5ICspICovCi0gIHsibmVnYXRlIiwJICAiLSIsCQkwfSwJCS8qIG9sZCAodW5hcnkgLSkgKi8KLSAgeyJ0cnVuY19tb2QiLAkgICIlIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWQiLAkgICIlIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbWQiLAkgICIlPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1bmNfZGl2IiwJICAiLyIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImR2IiwJICAiLyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWR2IiwJICAiLz0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydXRoX2FuZGlmIiwgIiYmIiwJCTB9LAkJLyogb2xkICovCi0gIHsiYWEiLAkgICImJiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1dGhfb3JpZiIsICAifHwiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJvbyIsCSAgInx8IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnV0aF9ub3QiLAkgICIhIiwJCTB9LAkJLyogb2xkICovCi0gIHsibnQiLAkgICIhIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJwb3N0aW5jcmVtZW50IiwiKysiLAkwfSwJCS8qIG9sZCAqLwotICB7InBwIiwJICAiKysiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InBvc3RkZWNyZW1lbnQiLCItLSIsCTB9LAkJLyogb2xkICovCi0gIHsibW0iLAkgICItLSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X2lvciIsCSAgInwiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJvciIsCSAgInwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFvciIsCSAgInw9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfeG9yIiwJICAiXiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImVyIiwJICAiXiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWVyIiwJICAiXj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF9hbmQiLAkgICImIiwJCTB9LAkJLyogb2xkICovCi0gIHsiYWQiLAkgICImIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhYWQiLAkgICImPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X25vdCIsCSAgIn4iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJjbyIsCSAgIn4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNhbGwiLAkgICIoKSIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNsIiwJICAiKCkiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFsc2hpZnQiLAkgICI8PCIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImxzIiwJICAiPDwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFscyIsCSAgIjw8PSIsCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhcnNoaWZ0IiwJICAiPj4iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJycyIsCSAgIj4+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhcnMiLAkgICI+Pj0iLAlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY29tcG9uZW50IiwJICAiLT4iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJwdCIsCSAgIi0+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2k7IEx1Y2lkIEMrKyBmb3JtICovCi0gIHsicmYiLAkgICItPiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpOyBBUk0vR05VIGZvcm0gKi8KLSAgeyJpbmRpcmVjdCIsCSAgIioiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtZXRob2RfY2FsbCIsICAiLT4oKSIsCTB9LAkJLyogb2xkICovCi0gIHsiYWRkciIsCSAgIiYiLAkJMH0sCQkvKiBvbGQgKHVuYXJ5ICYpICovCi0gIHsiYXJyYXkiLAkgICJbXSIsCQkwfSwJCS8qIG9sZCAqLwotICB7InZjIiwJICAiW10iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNvbXBvdW5kIiwJICAiLCAiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJjbSIsCSAgIiwgIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjb25kIiwJICAiPzoiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJjbiIsCSAgIj86IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCi0gIHsibWF4IiwJICAiPj8iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJteCIsCSAgIj4/IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCi0gIHsibWluIiwJICAiPD8iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtbiIsCSAgIjw/IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCi0gIHsibm9wIiwJICAiIiwJCTB9LAkJLyogb2xkIChmb3Igb3BlcmF0b3I9KSAqLwotICB7InJtIiwJICAiLT4qIiwJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InN6IiwgICAgICAgICAgInNpemVvZiAiLCAgICBETUdMX0FOU0l9ICAgICAgLyogcHNldWRvLWFuc2kgKi8KLX07Ci0KLS8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdmFyaW91cyB0eXBlIHZhcmlldGllcy4KLSAgIFRoZXkgYXJlIGFsbCBub24temVybyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYXMgYHN1Y2Nlc3MnCi0gICB2YWx1ZXMuICAqLwotdHlwZWRlZiBlbnVtIHR5cGVfa2luZF90Ci17Ci0gIHRrX25vbmUsCi0gIHRrX3BvaW50ZXIsCi0gIHRrX3JlZmVyZW5jZSwKLSAgdGtfaW50ZWdyYWwsCi0gIHRrX2Jvb2wsCi0gIHRrX2NoYXIsCi0gIHRrX3JlYWwKLX0gdHlwZV9raW5kX3Q7Ci0KLSNkZWZpbmUgU1RSSU5HX0VNUFRZKHN0cikJKChzdHIpIC0+IGIgPT0gKHN0cikgLT4gcCkKLSNkZWZpbmUgUFJFUEVORF9CTEFOSyhzdHIpCXtpZiAoIVNUUklOR19FTVBUWShzdHIpKSBcCi0gICAgc3RyaW5nX3ByZXBlbmQoc3RyLCAiICIpO30KLSNkZWZpbmUgQVBQRU5EX0JMQU5LKHN0cikJe2lmICghU1RSSU5HX0VNUFRZKHN0cikpIFwKLSAgICBzdHJpbmdfYXBwZW5kKHN0ciwgIiAiKTt9Ci0jZGVmaW5lIExFTl9TVFJJTkcoc3RyKSAgICAgICAgICggKFNUUklOR19FTVBUWShzdHIpKT8wOigoc3RyKS0+cCAtIChzdHIpLT5iKSkKLQotLyogVGhlIHNjb3BlIHNlcGFyYXRvciBhcHByb3ByaWF0ZSBmb3IgdGhlIGxhbmd1YWdlIGJlaW5nIGRlbWFuZ2xlZC4gICovCi0KLSNkZWZpbmUgU0NPUEVfU1RSSU5HKHdvcmspICgod29yay0+b3B0aW9ucyAmIERNR0xfSkFWQSkgPyAiLiIgOiAiOjoiKQotCi0jZGVmaW5lIEFSTV9WVEFCTEVfU1RSSU5HICJfX3Z0YmxfXyIJLyogTHVjaWQvQVJNIHZpcnR1YWwgdGFibGUgcHJlZml4ICovCi0jZGVmaW5lIEFSTV9WVEFCTEVfU1RSTEVOIDgJCS8qIHN0cmxlbiAoQVJNX1ZUQUJMRV9TVFJJTkcpICovCi0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgY2hhciAqCi1tb3BfdXAgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgc3RyaW5nICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotc3F1YW5nbGVfbW9wX3VwIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotI2lmIDAKLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX21ldGhvZF9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKgotaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm0gUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssCi0JCQkJCSBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCi0JCQkgICBzdHJpbmcgKiwgaW50LCBpbnQpKTsKLQotc3RhdGljIGludAotYXJtX3B0IFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICoqLAotCQljb25zdCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2NsYXNzX25hbWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfcXVhbGlmaWVkIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLAotCQkJICAgIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2NsYXNzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2Z1bmRfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9zaWduYXR1cmUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfcHJlZml4IFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWdudV9zcGVjaWFsIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWFybV9zcGVjaWFsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfbmVlZCBQQVJBTVMgKChzdHJpbmcgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfZGVsZXRlIFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfaW5pdCBQQVJBTVMgKChzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2NsZWFyIFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0KLSNpZiAwCi1zdGF0aWMgaW50Ci1zdHJpbmdfZW1wdHkgUEFSQU1TICgoc3RyaW5nICopKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZCBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kcyBQQVJBTVMgKChzdHJpbmcgKiwgc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRuIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmQgUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmRuIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgaW50Ci1nZXRfY291bnQgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgaW50ICopKTsKLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudCBQQVJBTVMgKChjb25zdCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyBQQVJBTVMgKChjb25zdCBjaGFyKiopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfYXJncyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9uZXN0ZWRfYXJncyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiosIGNvbnN0IGNoYXIqKiwgc3RyaW5nKikpOwotCi1zdGF0aWMgaW50Ci1kb190eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRvX2FyZyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKLQkJCQljb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0J0eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLQotc3RhdGljIGludAotcmVnaXN0ZXJfQnR5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfS3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWZvcmdldF90eXBlcyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1mb3JnZXRfQl9hbmRfS190eXBlcyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZHMgUEFSQU1TICgoc3RyaW5nICosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYqLCBjb25zdCBjaGFyKiosCi0JCQkJICAgICAgc3RyaW5nKiwgdHlwZV9raW5kX3QpKTsKLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1zbmFyZl9udW1lcmljX2xpdGVyYWwgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotLyogVGhlcmUgaXMgYSBUWVBFX1FVQUwgdmFsdWUgZm9yIGVhY2ggdHlwZSBxdWFsaWZpZXIuICBUaGV5IGNhbiBiZQotICAgY29tYmluZWQgYnkgYml0d2lzZS1vciB0byBmb3JtIHRoZSBjb21wbGV0ZSBzZXQgb2YgcXVhbGlmaWVycyBmb3IgYQotICAgdHlwZS4gICovCi0KLSNkZWZpbmUgVFlQRV9VTlFVQUxJRklFRCAgIDB4MAotI2RlZmluZSBUWVBFX1FVQUxfQ09OU1QgICAgMHgxCi0jZGVmaW5lIFRZUEVfUVVBTF9WT0xBVElMRSAweDIKLSNkZWZpbmUgVFlQRV9RVUFMX1JFU1RSSUNUIDB4NAotCi1zdGF0aWMgaW50Ci1jb2RlX2Zvcl9xdWFsaWZpZXIgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotcXVhbGlmaWVyX3N0cmluZyBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqCi1kZW1hbmdsZV9xdWFsaWZpZXIgUEFSQU1TICgoaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBjb3VudCB0byBpbnRlZ2VyLCBjb25zdW1pbmcgdG9rZW5zIGluIHRoZSBwcm9jZXNzLgotICAgQ29udmVyc2lvbiB0ZXJtaW5hdGVzIG9uIHRoZSBmaXJzdCBub24tZGlnaXQgY2hhcmFjdGVyLgotCi0gICBUcnlpbmcgdG8gY29uc3VtZSBzb21ldGhpbmcgdGhhdCBpc24ndCBhIGNvdW50IHJlc3VsdHMgaW4gbm8KLSAgIGNvbnN1bXB0aW9uIG9mIGlucHV0IGFuZCBhIHJldHVybiBvZiAtMS4KLQotICAgT3ZlcmZsb3cgY29uc3VtZXMgdGhlIHJlc3Qgb2YgdGhlIGRpZ2l0cywgYW5kIHJldHVybnMgLTEuICAqLwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50ICh0eXBlKQotICAgICBjb25zdCBjaGFyICoqdHlwZTsKLXsKLSAgaW50IGNvdW50ID0gMDsKLQotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLSAgICB7Ci0gICAgICBjb3VudCAqPSAxMDsKLQotICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LgotCSBXZSBhc3N1bWUgdGhhdCBjb3VudCBpcyByZXByZXNlbnRlZCB1c2luZyB0d28ncy1jb21wbGVtZW50OwotCSBubyBwb3dlciBvZiB0d28gaXMgZGl2aXNpYmxlIGJ5IHRlbiwgc28gaWYgYW4gb3ZlcmZsb3cgb2NjdXJzCi0JIHdoZW4gbXVsdGlwbHlpbmcgYnkgdGVuLCB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIGEgbXVsdGlwbGUgb2YKLQkgdGVuLiAgKi8KLSAgICAgIGlmICgoY291bnQgJSAxMCkgIT0gMCkKLQl7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqdHlwZSkpCi0JICAgICgqdHlwZSkrKzsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGNvdW50ICs9ICoqdHlwZSAtICcwJzsKLSAgICAgICgqdHlwZSkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIChjb3VudCk7Ci19Ci0KLQotLyogTGlrZSBjb25zdW1lX2NvdW50LCBidXQgZm9yIGNvdW50cyB0aGF0IGFyZSBwcmVjZWRlZCBhbmQgZm9sbG93ZWQKLSAgIGJ5ICdfJyBpZiB0aGV5IGFyZSBncmVhdGVyIHRoYW4gMTAuICBBbHNvLCAtMSBpcyByZXR1cm5lZCBmb3IKLSAgIGZhaWx1cmUsIHNpbmNlIDAgY2FuIGJlIGEgdmFsaWQgdmFsdWUuICAqLwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpCi0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotewotICBpbnQgaWR4OwotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotICAgIHsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlkeCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgaWYgKCoqbWFuZ2xlZCAhPSAnXycpCi0JLyogVGhlIHRyYWlsaW5nIHVuZGVyc2NvcmUgd2FzIG1pc3NpbmcuICovCi0JcmV0dXJuIC0xOwotCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCoqbWFuZ2xlZCA8ICcwJyB8fCAqKm1hbmdsZWQgPiAnOScpCi0JcmV0dXJuIC0xOwotCi0gICAgICBpZHggPSAqKm1hbmdsZWQgLSAnMCc7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgfQotCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIEMgaXMgdGhlIGNvZGUgZm9yIGEgdHlwZS1xdWFsaWZpZXIuICBSZXR1cm4gdGhlIFRZUEVfUVVBTAotICAgY29ycmVzcG9uZGluZyB0byB0aGlzIHF1YWxpZmllci4gICovCi0KLXN0YXRpYyBpbnQKLWNvZGVfZm9yX3F1YWxpZmllciAoYykKLSAgaW50IGM7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICByZXR1cm4gVFlQRV9RVUFMX0NPTlNUOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICByZXR1cm4gVFlQRV9RVUFMX1ZPTEFUSUxFOwotCi0gICAgY2FzZSAndSc6Ci0gICAgICByZXR1cm4gVFlQRV9RVUFMX1JFU1RSSUNUOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDIHdhcyBhbiBpbnZhbGlkIHF1YWxpZmllci4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBSZXR1cm4gdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBxdWFsaWZpZXJzIGdpdmVuIGJ5Ci0gICBUWVBFX1FVQUxTLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1xdWFsaWZpZXJfc3RyaW5nICh0eXBlX3F1YWxzKQotICAgICBpbnQgdHlwZV9xdWFsczsKLXsKLSAgc3dpdGNoICh0eXBlX3F1YWxzKQotICAgIHsKLSAgICBjYXNlIFRZUEVfVU5RVUFMSUZJRUQ6Ci0gICAgICByZXR1cm4gIiI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9DT05TVDoKLSAgICAgIHJldHVybiAiY29uc3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfVk9MQVRJTEU6Ci0gICAgICByZXR1cm4gInZvbGF0aWxlIjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJfX3Jlc3RyaWN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1ZPTEFUSUxFOgotICAgICAgcmV0dXJuICJjb25zdCB2b2xhdGlsZSI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9DT05TVCB8IFRZUEVfUVVBTF9SRVNUUklDVDoKLSAgICAgIHJldHVybiAiY29uc3QgX19yZXN0cmljdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9WT0xBVElMRSB8IFRZUEVfUVVBTF9SRVNUUklDVDoKLSAgICAgIHJldHVybiAidm9sYXRpbGUgX19yZXN0cmljdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9DT05TVCB8IFRZUEVfUVVBTF9WT0xBVElMRSB8IFRZUEVfUVVBTF9SRVNUUklDVDoKLSAgICAgIHJldHVybiAiY29uc3Qgdm9sYXRpbGUgX19yZXN0cmljdCI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFRZUEVfUVVBTFMgd2FzIGFuIGludmFsaWQgcXVhbGlmaWVyIHNldC4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBDIGlzIHRoZSBjb2RlIGZvciBhIHR5cGUtcXVhbGlmaWVyLiAgUmV0dXJuIHRoZSBzdHJpbmcKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBxdWFsaWZpZXIuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlCi0gICBjYWxsZWQgd2l0aCBhIHZhbGlkIHF1YWxpZmllciBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1kZW1hbmdsZV9xdWFsaWZpZXIgKGMpCi0gIGludCBjOwotewotICByZXR1cm4gcXVhbGlmaWVyX3N0cmluZyAoY29kZV9mb3JfcXVhbGlmaWVyIChjKSk7Ci19Ci0KLWludAotY3BsdXNfZGVtYW5nbGVfb3BuYW1lIChvcG5hbWUsIHJlc3VsdCwgb3B0aW9ucykKLSAgICAgY29uc3QgY2hhciAqb3BuYW1lOwotICAgICBjaGFyICpyZXN1bHQ7Ci0gICAgIGludCBvcHRpb25zOwotewotICBpbnQgbGVuLCBsZW4xLCByZXQ7Ci0gIHN0cmluZyB0eXBlOwotICBzdHJ1Y3Qgd29ya19zdHVmZiB3b3JrWzFdOwotICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgbGVuID0gc3RybGVuKG9wbmFtZSk7Ci0gIHJlc3VsdFswXSA9ICdcMCc7Ci0gIHJldCA9IDA7Ci0gIG1lbXNldCAoKGNoYXIgKikgd29yaywgMCwgc2l6ZW9mICh3b3JrKSk7Ci0gIHdvcmstPm9wdGlvbnMgPSBvcHRpb25zOwotCi0gIGlmIChvcG5hbWVbMF0gPT0gJ18nICYmIG9wbmFtZVsxXSA9PSAnXycKLSAgICAgICYmIG9wbmFtZVsyXSA9PSAnbycgJiYgb3BuYW1lWzNdID09ICdwJykKLSAgICB7Ci0gICAgICAvKiBBTlNJLiAgKi8KLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBvcG5hbWUgKyA0OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yICIpOwotCSAgc3RybmNhdCAocmVzdWx0LCB0eXBlLmIsIHR5cGUucCAtIHR5cGUuYik7Ci0JICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7Ci0JICByZXQgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKG9wbmFtZVswXSA9PSAnXycgJiYgb3BuYW1lWzFdID09ICdfJwotCSAgICYmIG9wbmFtZVsyXSA+PSAnYScgJiYgb3BuYW1lWzJdIDw9ICd6JwotCSAgICYmIG9wbmFtZVszXSA+PSAnYScgJiYgb3BuYW1lWzNdIDw9ICd6JykKLSAgICB7Ci0gICAgICBpZiAob3BuYW1lWzRdID09ICdcMCcpCi0JewotCSAgLyogT3BlcmF0b3IuICAqLwotCSAgc2l6ZV90IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDIKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDIsIDIpID09IDApCi0JCXsKLQkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICByZXQgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wbmFtZVsyXSA9PSAnYScgJiYgb3BuYW1lWzVdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiBBc3NpZ25tZW50LiAgKi8KLQkgICAgICBzaXplX3QgaTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkJewotCQkgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDMKLQkJICAgICAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAyLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7Ci0JCSAgICAgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgICAgIHJldCA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChsZW4gPj0gMwotCSAgICYmIG9wbmFtZVswXSA9PSAnbycKLQkgICAmJiBvcG5hbWVbMV0gPT0gJ3AnCi0JICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBvcG5hbWVbMl0pICE9IE5VTEwpCi0gICAgewotICAgICAgLyogc2VlIGlmIGl0J3MgYW4gYXNzaWdubWVudCBleHByZXNzaW9uICovCi0gICAgICBpZiAobGVuID49IDEwIC8qIG9wJGFzc2lnbl8gKi8KLQkgICYmIG1lbWNtcCAob3BuYW1lICsgMywgImFzc2lnbl8iLCA3KSA9PSAwKQotCXsKLQkgIHNpemVfdCBpOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBsZW4xID0gbGVuIC0gMTA7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuMQotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMTAsIGxlbjEpID09IDApCi0JCXsKLQkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgIj0iKTsKLQkJICByZXQgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2l6ZV90IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGxlbjEgPSBsZW4gLSAzOwotCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbjEKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDMsIGxlbjEpID09IDApCi0JCXsKLQkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICByZXQgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChsZW4gPj0gNSAmJiBtZW1jbXAgKG9wbmFtZSwgInR5cGUiLCA0KSA9PSAwCi0JICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBvcG5hbWVbNF0pICE9IE5VTEwpCi0gICAgewotICAgICAgLyogdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yICovCi0gICAgICB0ZW0gPSBvcG5hbWUgKyA1OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yICIpOwotCSAgc3RybmNhdCAocmVzdWx0LCB0eXBlLmIsIHR5cGUucCAtIHR5cGUuYik7Ci0JICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7Ci0JICByZXQgPSAxOwotCX0KLSAgICB9Ci0gIHNxdWFuZ2xlX21vcF91cCAod29yayk7Ci0gIHJldHVybiByZXQ7Ci0KLX0KLS8qIFRha2VzIG9wZXJhdG9yIG5hbWUgYXMgZS5nLiAiKysiIGFuZCByZXR1cm5zIG1hbmdsZWQKLSAgIG9wZXJhdG9yIG5hbWUgKGUuZy4gInBvc3RpbmNyZW1lbnRfZXhwciIpLCBvciBOVUxMIGlmIG5vdCBmb3VuZC4KLQotICAgSWYgT1BUSU9OUyAmIERNR0xfQU5TSSA9PSAxLCByZXR1cm4gdGhlIEFOU0kgbmFtZTsKLSAgIGlmIE9QVElPTlMgJiBETUdMX0FOU0kgPT0gMCwgcmV0dXJuIHRoZSBvbGQgR05VIG5hbWUuICAqLwotCi1jb25zdCBjaGFyICoKLWNwbHVzX21hbmdsZV9vcG5hbWUgKG9wbmFtZSwgb3B0aW9ucykKLSAgICAgY29uc3QgY2hhciAqb3BuYW1lOwotICAgICBpbnQgb3B0aW9uczsKLXsKLSAgc2l6ZV90IGk7Ci0gIGludCBsZW47Ci0KLSAgbGVuID0gc3RybGVuIChvcG5hbWUpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLm91dCkgPT0gbGVuCi0JICAmJiAob3B0aW9ucyAmIERNR0xfQU5TSSkgPT0gKG9wdGFibGVbaV0uZmxhZ3MgJiBETUdMX0FOU0kpCi0JICAmJiBtZW1jbXAgKG9wdGFibGVbaV0ub3V0LCBvcG5hbWUsIGxlbikgPT0gMCkKLQlyZXR1cm4gb3B0YWJsZVtpXS5pbjsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIGNoYXIgKmNwbHVzX2RlbWFuZ2xlIChjb25zdCBjaGFyICptYW5nbGVkLCBpbnQgb3B0aW9ucykKLQotICAgSWYgTUFOR0xFRCBpcyBhIG1hbmdsZWQgZnVuY3Rpb24gbmFtZSBwcm9kdWNlZCBieSBHTlUgQysrLCB0aGVuCi0gICBhIHBvaW50ZXIgdG8gYSBtYWxsb2NlZCBzdHJpbmcgZ2l2aW5nIGEgQysrIHJlcHJlc2VudGF0aW9uCi0gICBvZiB0aGUgbmFtZSB3aWxsIGJlIHJldHVybmVkOyBvdGhlcndpc2UgTlVMTCB3aWxsIGJlIHJldHVybmVkLgotICAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgdGhlIHN0cmluZyB3aGljaAotICAgaXMgcmV0dXJuZWQuCi0KLSAgIFRoZSBPUFRJT05TIGFyZyBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGJpdHM6Ci0KLSAgIAlETUdMX0FOU0kJQU5TSSBxdWFsaWZpZXJzIHN1Y2ggYXMgYGNvbnN0JyBhbmQgYHZvaWQnIGFyZQotCQkJaW5jbHVkZWQuCi0JRE1HTF9QQVJBTVMJRnVuY3Rpb24gcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuCi0KLSAgIEZvciBleGFtcGxlLAotCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFpIiwgRE1HTF9QQVJBTVMpCQk9PiAiQTo6Zm9vKGludCkiCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFpIiwgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpCT0+ICJBOjpmb28oaW50KSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCAwKQkJCT0+ICJBOjpmb28iCi0KLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgRE1HTF9QQVJBTVMpCQk9PiAiQTo6Zm9vKGZsb2F0LC4uLikiCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFmZSIsIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKT0+ICJBOjpmb28oZmxvYXQsLi4uKSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgMCkJCQk9PiAiQTo6Zm9vIgotCi0gICBOb3RlIHRoYXQgYW55IGxlYWRpbmcgdW5kZXJzY29yZXMsIG9yIG90aGVyIHN1Y2ggY2hhcmFjdGVycyBwcmVwZW5kZWQgYnkKLSAgIHRoZSBjb21waWxhdGlvbiBzeXN0ZW0sIGFyZSBwcmVzdW1lZCB0byBoYXZlIGFscmVhZHkgYmVlbiBzdHJpcHBlZCBmcm9tCi0gICBNQU5HTEVELiAgKi8KLQotY2hhciAqCi1jcGx1c19kZW1hbmdsZSAobWFuZ2xlZCwgb3B0aW9ucykKLSAgICAgY29uc3QgY2hhciAqbWFuZ2xlZDsKLSAgICAgaW50IG9wdGlvbnM7Ci17Ci0gIGNoYXIgKnJldDsKLSAgc3RydWN0IHdvcmtfc3R1ZmYgd29ya1sxXTsKLSAgbWVtc2V0ICgoY2hhciAqKSB3b3JrLCAwLCBzaXplb2YgKHdvcmspKTsKLSAgd29yayAtPiBvcHRpb25zID0gb3B0aW9uczsKLSAgaWYgKCh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX1NUWUxFX01BU0spID09IDApCi0gICAgd29yayAtPiBvcHRpb25zIHw9IChpbnQpIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSAmIERNR0xfU1RZTEVfTUFTSzsKLQotICByZXQgPSBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSAod29yaywgbWFuZ2xlZCk7Ci0gIHNxdWFuZ2xlX21vcF91cCAod29yayk7Ci0gIHJldHVybiAocmV0KTsKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG1vc3Qgb2Ygd2hhdCBjcGx1c19kZW1hbmdsZSB1c2UgdG8gZG8sIGJ1dAotICAgdG8gYmUgYWJsZSB0byBkZW1hbmdsZSBhIG5hbWUgd2l0aCBhIEIsIEsgb3IgbiBjb2RlLCB3ZSBuZWVkIHRvCi0gICBoYXZlIGEgbG9uZ2VyIHRlcm0gbWVtb3J5IG9mIHdoYXQgdHlwZXMgaGF2ZSBiZWVuIHNlZW4uIFRoZSBvcmlnaW5hbAotICAgbm93IGludGlhbGl6ZXMgYW5kIGNsZWFucyB1cCB0aGUgc3F1YW5nbGUgY29kZSBpbmZvLCB3aGlsZSBpbnRlcm5hbAotICAgY2FsbHMgZ28gZGlyZWN0bHkgdG8gdGhpcyByb3V0aW5lIHRvIGF2b2lkIHJlc2V0dGluZyB0aGF0IGluZm8uICovCi0KLXN0YXRpYyBjaGFyICoKLWludGVybmFsX2NwbHVzX2RlbWFuZ2xlICh3b3JrLCBtYW5nbGVkKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqbWFuZ2xlZDsKLXsKLQotICBzdHJpbmcgZGVjbDsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotICBjaGFyICpkZW1hbmdsZWQgPSBOVUxMOwotICBpbnQgczEsczIsczMsczQ7Ci0gIHMxID0gd29yay0+Y29uc3RydWN0b3I7Ci0gIHMyID0gd29yay0+ZGVzdHJ1Y3RvcjsKLSAgczMgPSB3b3JrLT5zdGF0aWNfdHlwZTsKLSAgczQgPSB3b3JrLT50eXBlX3F1YWxzOwotICB3b3JrLT5jb25zdHJ1Y3RvciA9IHdvcmstPmRlc3RydWN0b3IgPSAwOwotICB3b3JrLT50eXBlX3F1YWxzID0gVFlQRV9VTlFVQUxJRklFRDsKLSAgd29yay0+ZGxsaW1wb3J0ZWQgPSAwOwotCi0gIGlmICgobWFuZ2xlZCAhPSBOVUxMKSAmJiAoKm1hbmdsZWQgIT0gJ1wwJykpCi0gICAgewotICAgICAgc3RyaW5nX2luaXQgKCZkZWNsKTsKLQotICAgICAgLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGdudSBzdHlsZSBkZW1hbmdsaW5nIGlzIGFjdGl2ZSBhbmQgaWYgdGhlCi0JIHN0cmluZyB0byBiZSBkZW1hbmdsZWQgY29udGFpbnMgYSBDUExVU19NQVJLRVIuICBJZiBzbywgYXR0ZW1wdCB0bwotCSByZWNvZ25pemUgb25lIG9mIHRoZSBnbnUgc3BlY2lhbCBmb3JtcyByYXRoZXIgdGhhbiBsb29raW5nIGZvciBhCi0JIHN0YW5kYXJkIHByZWZpeC4gIEluIHBhcnRpY3VsYXIsIGRvbid0IHdvcnJ5IGFib3V0IHdoZXRoZXIgdGhlcmUKLQkgaXMgYSAiX18iIHN0cmluZyBpbiB0aGUgbWFuZ2xlZCBzdHJpbmcuICBDb25zaWRlciAiXyRfNV9fZm9vIiBmb3IKLQkgZXhhbXBsZS4gICovCi0KLSAgICAgIGlmICgoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKSkKLQl7Ci0JICBzdWNjZXNzID0gZ251X3NwZWNpYWwgKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7Ci0JfQotICAgICAgaWYgKCFzdWNjZXNzKQotCXsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9wcmVmaXggKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7Ci0JfQotICAgICAgaWYgKHN1Y2Nlc3MgJiYgKCptYW5nbGVkICE9ICdcMCcpKQotCXsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9zaWduYXR1cmUgKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7Ci0JfQotICAgICAgaWYgKHdvcmstPmNvbnN0cnVjdG9yID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJnbG9iYWwgY29uc3RydWN0b3JzIGtleWVkIHRvICIpOwotICAgICAgICAgIHdvcmstPmNvbnN0cnVjdG9yID0gMDsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAod29yay0+ZGVzdHJ1Y3RvciA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiZ2xvYmFsIGRlc3RydWN0b3JzIGtleWVkIHRvICIpOwotICAgICAgICAgIHdvcmstPmRlc3RydWN0b3IgPSAwOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmICh3b3JrLT5kbGxpbXBvcnRlZCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiaW1wb3J0IHN0dWIgZm9yICIpOwotICAgICAgICAgIHdvcmstPmRsbGltcG9ydGVkID0gMDsKLSAgICAgICAgfQotICAgICAgZGVtYW5nbGVkID0gbW9wX3VwICh3b3JrLCAmZGVjbCwgc3VjY2Vzcyk7Ci0gICAgfQotICB3b3JrLT5jb25zdHJ1Y3RvciA9IHMxOwotICB3b3JrLT5kZXN0cnVjdG9yID0gczI7Ci0gIHdvcmstPnN0YXRpY190eXBlID0gczM7Ci0gIHdvcmstPnR5cGVfcXVhbHMgPSBzNDsKLSAgcmV0dXJuIChkZW1hbmdsZWQpOwotfQotCi0KLS8qIENsZWFyIG91dCBhbmQgc3F1YW5nbGluZyByZWxhdGVkIHN0b3JhZ2UgKi8KLXN0YXRpYyB2b2lkCi1zcXVhbmdsZV9tb3BfdXAgKHdvcmspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotewotICAvKiBjbGVhbiB1cCB0aGUgQiBhbmQgSyB0eXBlIG1hbmdsaW5nIHR5cGVzLiAqLwotICBmb3JnZXRfQl9hbmRfS190eXBlcyAod29yayk7Ci0gIGlmICh3b3JrIC0+IGJ0eXBldmVjICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiBidHlwZXZlYyk7Ci0gICAgfQotICBpZiAod29yayAtPiBrdHlwZXZlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKChjaGFyICopIHdvcmsgLT4ga3R5cGV2ZWMpOwotICAgIH0KLX0KLQotLyogQ2xlYXIgb3V0IGFueSBtYW5nbGVkIHN0b3JhZ2UgKi8KLQotc3RhdGljIGNoYXIgKgotbW9wX3VwICh3b3JrLCBkZWNscCwgc3VjY2VzcykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci0gICAgIGludCBzdWNjZXNzOwotewotICBjaGFyICpkZW1hbmdsZWQgPSBOVUxMOwotCi0gIC8qIERpc2NhcmQgdGhlIHJlbWVtYmVyZWQgdHlwZXMsIGlmIGFueS4gICovCi0KLSAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKLSAgaWYgKHdvcmsgLT4gdHlwZXZlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKChjaGFyICopIHdvcmsgLT4gdHlwZXZlYyk7Ci0gICAgICB3b3JrIC0+IHR5cGV2ZWMgPSBOVUxMOwotICAgICAgd29yayAtPiB0eXBldmVjX3NpemUgPSAwOwotICAgIH0KLSAgaWYgKHdvcmstPnRtcGxfYXJndmVjKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgd29yay0+bnRtcGxfYXJnczsgaSsrKQotCWlmICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSkKLQkgIGZyZWUgKChjaGFyKikgd29yay0+dG1wbF9hcmd2ZWNbaV0pOwotCi0gICAgICBmcmVlICgoY2hhciopIHdvcmstPnRtcGxfYXJndmVjKTsKLSAgICAgIHdvcmstPnRtcGxfYXJndmVjID0gTlVMTDsKLSAgICB9Ci0gIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKLSAgICB7Ci0gICAgICBzdHJpbmdfZGVsZXRlICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgICBmcmVlICgoY2hhciopIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgICAgIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgZGVtYW5nbGluZyB3YXMgc3VjY2Vzc2Z1bCwgZW5zdXJlIHRoYXQgdGhlIGRlbWFuZ2xlZCBzdHJpbmcgaXMgbnVsbAotICAgICB0ZXJtaW5hdGVkIGFuZCByZXR1cm4gaXQuICBPdGhlcndpc2UsIGZyZWUgdGhlIGRlbWFuZ2xpbmcgZGVjbC4gICovCi0KLSAgaWYgKCFzdWNjZXNzKQotICAgIHsKLSAgICAgIHN0cmluZ19kZWxldGUgKGRlY2xwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICIiLCAxKTsKLSAgICAgIGRlbWFuZ2xlZCA9IGRlY2xwIC0+IGI7Ci0gICAgfQotICByZXR1cm4gKGRlbWFuZ2xlZCk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9zaWduYXR1cmUgLS0gZGVtYW5nbGUgdGhlIHNpZ25hdHVyZSBwYXJ0IG9mIGEgbWFuZ2xlZCBuYW1lCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZGVtYW5nbGVfc2lnbmF0dXJlIChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCQkgICAgc3RyaW5nICpkZWNscCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlDb25zdW1lIGFuZCBkZW1hbmdsZSB0aGUgc2lnbmF0dXJlIHBvcnRpb24gb2YgdGhlIG1hbmdsZWQgbmFtZS4KLQotCURFQ0xQIGlzIHRoZSBzdHJpbmcgd2hlcmUgZGVtYW5nbGVkIG91dHB1dCBpcyBiZWluZyBidWlsdC4gIEF0Ci0JZW50cnkgaXQgY29udGFpbnMgdGhlIGRlbWFuZ2xlZCByb290IG5hbWUgZnJvbSB0aGUgbWFuZ2xlZCBuYW1lCi0JcHJlZml4LiAgSS5FLiBlaXRoZXIgYSBkZW1hbmdsZWQgb3BlcmF0b3IgbmFtZSBvciB0aGUgcm9vdCBmdW5jdGlvbgotCW5hbWUuICBJbiBzb21lIHNwZWNpYWwgY2FzZXMsIGl0IG1heSBjb250YWluIG5vdGhpbmcuCi0KLQkqTUFOR0xFRCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgdW5jb25zdW1lZCBsb2NhdGlvbiBpbiB0aGUgbWFuZ2xlZAotCW5hbWUuICBBcyB0b2tlbnMgYXJlIGNvbnN1bWVkIGFuZCBkZW1hbmdsaW5nIGlzIHBlcmZvcm1lZCwgdGhlCi0JcG9pbnRlciBpcyB1cGRhdGVkIHRvIGNvbnRpbnVvdXNseSBwb2ludCBhdCB0aGUgbmV4dCB0b2tlbiB0bwotCWJlIGNvbnN1bWVkLgotCi0JRGVtYW5nbGluZyBHTlUgc3R5bGUgbWFuZ2xlZCBuYW1lcyBpcyBuYXN0eSBiZWNhdXNlIHRoZXJlIGlzIG5vCi0JZXhwbGljaXQgdG9rZW4gdGhhdCBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlIG91dGVybW9zdCBmdW5jdGlvbgotCWFyZ3VtZW50IGxpc3QuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9zaWduYXR1cmUgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgaW50IGZ1bmNfZG9uZSA9IDA7Ci0gIGludCBleHBlY3RfZnVuYyA9IDA7Ci0gIGludCBleHBlY3RfcmV0dXJuX3R5cGUgPSAwOwotICBjb25zdCBjaGFyICpvbGRtYW5nbGVkID0gTlVMTDsKLSAgc3RyaW5nIHRyYXduYW1lOwotICBzdHJpbmcgdG5hbWU7Ci0KLSAgd2hpbGUgKHN1Y2Nlc3MgJiYgKCoqbWFuZ2xlZCAhPSAnXDAnKSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0JY2FzZSAnUSc6Ci0JICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMSwgMCk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnSyc6Ci0JICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMSwgMCk7Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgICB9Ci0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6Ci0JICAvKiBTdGF0aWMgbWVtYmVyIGZ1bmN0aW9uICovCi0JICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgICB9Ci0JICAoKm1hbmdsZWQpKys7Ci0JICB3b3JrIC0+IHN0YXRpY190eXBlID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQyc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAndSc6Ci0JICB3b3JrLT50eXBlX3F1YWxzIHw9IGNvZGVfZm9yX3F1YWxpZmllciAoKiptYW5nbGVkKTsKLQotCSAgLyogYSBxdWFsaWZpZWQgbWVtYmVyIGZ1bmN0aW9uICovCi0JICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQotCSAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQotCWNhc2UgJ0wnOgotCSAgLyogTG9jYWwgY2xhc3MgbmFtZSBmb2xsb3dzIGFmdGVyICJMbm5uXyIgKi8KLQkgIGlmIChIUF9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAmJiAoKiptYW5nbGVkICE9ICdfJykpCi0JCSgqbWFuZ2xlZCkrKzsKLQkgICAgICBpZiAoISoqbWFuZ2xlZCkKLQkJc3VjY2VzcyA9IDA7Ci0JICAgICAgZWxzZQotCQkoKm1hbmdsZWQpKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc3VjY2VzcyA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgICB9Ci0gICAgICAgICAgd29yay0+dGVtcF9zdGFydCA9IC0xOyAvKiB1cHBlcm1vc3QgY2FsbCB0byBkZW1hbmdsZV9jbGFzcyAqLwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2NsYXNzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgewotCSAgICAgIHJlbWVtYmVyX3R5cGUgKHdvcmssIG9sZG1hbmdsZWQsICptYW5nbGVkIC0gb2xkbWFuZ2xlZCk7Ci0JICAgIH0KLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0JICAgIHsKLSAgICAgICAgICAgICAgLyogRURHIGFuZCBvdGhlcnMgd2lsbCBoYXZlIHRoZSAiRiIsIHNvIHdlIGxldCB0aGUgbG9vcCBjeWNsZQotICAgICAgICAgICAgICAgICBpZiB3ZSBhcmUgbG9va2luZyBhdCBvbmUuICovCi0gICAgICAgICAgICAgIGlmICgqKm1hbmdsZWQgIT0gJ0YnKQotICAgICAgICAgICAgICAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICAgIH0KLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdCJzoKLQkgIHsKLQkgICAgc3RyaW5nIHM7Ci0JICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmcyk7Ci0JICAgIGlmIChzdWNjZXNzKQotCSAgICAgIHsKLQkJc3RyaW5nX2FwcGVuZCAoJnMsIFNDT1BFX1NUUklORyAod29yaykpOwotCQlzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmcyk7Ci0JICAgICAgfQotCSAgICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIC8qIEZ1bmN0aW9uICovCi0JICAvKiBBUk0vSFAgc3R5bGUgZGVtYW5nbGluZyBpbmNsdWRlcyBhIHNwZWNpZmljICdGJyBjaGFyYWN0ZXIgYWZ0ZXIKLQkgICAgIHRoZSBjbGFzcyBuYW1lLiAgRm9yIEdOVSBzdHlsZSwgaXQgaXMganVzdCBpbXBsaWVkLiAgU28gd2UgY2FuCi0JICAgICBzYWZlbHkganVzdCBjb25zdW1lIGFueSAnRicgYXQgdGhpcyBwb2ludCBhbmQgYmUgY29tcGF0aWJsZQotCSAgICAgd2l0aCBlaXRoZXIgc3R5bGUuICAqLwotCi0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGZ1bmNfZG9uZSA9IDE7Ci0JICAoKm1hbmdsZWQpKys7Ci0KLQkgIC8qIEZvciBsdWNpZC9BUk0vSFAgc3R5bGUgd2UgaGF2ZSB0byBmb3JnZXQgYW55IHR5cGVzIHdlIG1pZ2h0Ci0JICAgICBoYXZlIHJlbWVtYmVyZWQgdXAgdG8gdGhpcyBwb2ludCwgc2luY2UgdGhleSB3ZXJlIG5vdCBhcmd1bWVudAotCSAgICAgdHlwZXMuICBHTlUgc3R5bGUgY29uc2lkZXJzIGFsbCB0eXBlcyBzZWVuIGFzIGF2YWlsYWJsZSBmb3IKLQkgICAgIGJhY2sgcmVmZXJlbmNlcy4gIFNlZSBjb21tZW50IGluIGRlbWFuZ2xlX2FyZ3MoKSAqLwotCi0JICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKLQkgICAgfQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgIC8qIEFmdGVyIHBpY2tpbmcgb2ZmIHRoZSBmdW5jdGlvbiBhcmdzLCB3ZSBleHBlY3QgdG8gZWl0aGVyCi0JICAgICBmaW5kIHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZSAocHJlY2VkZWQgYnkgYW4gJ18nKSBvciB0aGUKLQkgICAgIGVuZCBvZiB0aGUgc3RyaW5nLiAqLwotCSAgaWYgKHN1Y2Nlc3MgJiYgKEFVVE9fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgKiptYW5nbGVkID09ICdfJykKLQkgICAgewotCSAgICAgICsrKCptYW5nbGVkKTsKLSAgICAgICAgICAgICAgLyogQXQgdGhpcyBsZXZlbCwgd2UgZG8gbm90IGNhcmUgYWJvdXQgdGhlIHJldHVybiB0eXBlLiAqLwotICAgICAgICAgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnRuYW1lKTsKLSAgICAgICAgICAgICAgc3RyaW5nX2RlbGV0ZSAoJnRuYW1lKTsKLSAgICAgICAgICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlICd0JzoKLQkgIC8qIEcrKyBUZW1wbGF0ZSAqLwotCSAgc3RyaW5nX2luaXQoJnRyYXduYW1lKTsKLQkgIHN0cmluZ19pbml0KCZ0bmFtZSk7Ci0JICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgICB9Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsICZ0bmFtZSwKLQkJCQkgICAgICAgJnRyYXduYW1lLCAxLCAxKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKLQkgICAgfQotCSAgc3RyaW5nX2FwcGVuZCAoJnRuYW1lLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQotCSAgc3RyaW5nX3ByZXBlbmRzKGRlY2xwLCAmdG5hbWUpOwotCSAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoJnRyYXduYW1lLCAifiIpOwotCSAgICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnRyYXduYW1lKTsKLQkgICAgICB3b3JrLT5kZXN0cnVjdG9yIC09IDE7Ci0JICAgIH0KLQkgIGlmICgod29yay0+Y29uc3RydWN0b3IgJiAxKSB8fCAod29yay0+ZGVzdHJ1Y3RvciAmIDEpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHJhd25hbWUpOwotCSAgICAgIHdvcmstPmNvbnN0cnVjdG9yIC09IDE7Ci0JICAgIH0KLQkgIHN0cmluZ19kZWxldGUoJnRyYXduYW1lKTsKLQkgIHN0cmluZ19kZWxldGUoJnRuYW1lKTsKLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdfJzoKLQkgIGlmIChHTlVfREVNQU5HTElORyAmJiBleHBlY3RfcmV0dXJuX3R5cGUpCi0JICAgIHsKLQkgICAgICAvKiBSZWFkIHRoZSByZXR1cm4gdHlwZS4gKi8KLQkgICAgICBzdHJpbmcgcmV0dXJuX3R5cGU7Ci0JICAgICAgc3RyaW5nX2luaXQgKCZyZXR1cm5fdHlwZSk7Ci0KLQkgICAgICAoKm1hbmdsZWQpKys7Ci0JICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZyZXR1cm5fdHlwZSk7Ci0JICAgICAgQVBQRU5EX0JMQU5LICgmcmV0dXJuX3R5cGUpOwotCi0JICAgICAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJnJldHVybl90eXBlKTsKLQkgICAgICBzdHJpbmdfZGVsZXRlICgmcmV0dXJuX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIEF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwsIHdlIGNhbm5vdCBoYXZlIGEgcmV0dXJuIHR5cGUgc3BlY2lmaWVkLAotCSAgICAgICBzbyBpZiB3ZSBydW4gaW50byBhbm90aGVyICdfJyBhdCB0aGlzIHBvaW50IHdlIGFyZSBkZWFsaW5nIHdpdGgKLQkgICAgICAgYSBtYW5nbGVkIG5hbWUgdGhhdCBpcyBlaXRoZXIgYm9ndXMsIG9yIGhhcyBiZWVuIG1hbmdsZWQgYnkKLQkgICAgICAgc29tZSBhbGdvcml0aG0gd2UgZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoLiAgU28ganVzdAotCSAgICAgICByZWplY3QgdGhlIGVudGlyZSBkZW1hbmdsaW5nLiAgKi8KLSAgICAgICAgICAgIC8qIEhvd2V2ZXIsICJfbm5uIiBpcyBhbiBleHBlY3RlZCBzdWZmaXggZm9yIGFsdGVybmF0ZSBlbnRyeSBwb2ludAotICAgICAgICAgICAgICAgbnVtYmVyZWQgbm5uIGZvciBhIGZ1bmN0aW9uLCB3aXRoIEhQIGFDQywgc28gc2tpcCBvdmVyIHRoYXQKLSAgICAgICAgICAgICAgIHdpdGhvdXQgcmVwb3J0aW5nIGZhaWx1cmUuIHBhaS8xOTk3LTA5LTA0ICovCi0gICAgICAgICAgICBpZiAoSFBfREVNQU5HTElORykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKiptYW5nbGVkICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0gICAgICAgICAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSCc6Ci0JICBpZiAoR05VX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICAvKiBBIEcrKyB0ZW1wbGF0ZSBmdW5jdGlvbi4gIFJlYWQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cy4gKi8KLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAwLAotCQkJCQkgICAwKTsKLQkgICAgICBpZiAoISh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpKQotCQlleHBlY3RfcmV0dXJuX3R5cGUgPSAxOwotCSAgICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQkgICAgezt9Ci0KLQlkZWZhdWx0OgotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIC8qIEFzc3VtZSB3ZSBoYXZlIHN0dW1ibGVkIG9udG8gdGhlIGZpcnN0IG91dGVybW9zdCBmdW5jdGlvbgotCQkgYXJndW1lbnQgdG9rZW4sIGFuZCBzdGFydCBwcm9jZXNzaW5nIGFyZ3MuICAqLwotCSAgICAgIGZ1bmNfZG9uZSA9IDE7Ci0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm9uLUdOVSBkZW1hbmdsZXJzIHVzZSBhIHNwZWNpZmljIHRva2VuIHRvIG1hcmsgdGhlIHN0YXJ0Ci0JCSBvZiB0aGUgb3V0ZXJtb3N0IGZ1bmN0aW9uIGFyZ3VtZW50IHRva2Vucy4gIFR5cGljYWxseSAnRicsCi0JCSBmb3IgQVJNL0hQLWRlbWFuZ2xpbmcsIGZvciBleGFtcGxlLiAgU28gaWYgd2UgZmluZCBzb21ldGhpbmcKLQkJIHdlIGFyZSBub3QgcHJlcGFyZWQgZm9yLCBpdCBtdXN0IGJlIGFuIGVycm9yLiAgKi8KLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgLyoKLQlpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSovCi0gICAgICB7Ci0JaWYgKHN1Y2Nlc3MgJiYgZXhwZWN0X2Z1bmMpCi0JICB7Ci0JICAgIGZ1bmNfZG9uZSA9IDE7Ci0gICAgICAgICAgICAgIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZvcmdldF90eXBlcyAod29yayk7Ci0gICAgICAgICAgICAgICAgfQotCSAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgICAvKiBTaW5jZSB0ZW1wbGF0ZSBpbmNsdWRlIHRoZSBtYW5nbGluZyBvZiB0aGVpciByZXR1cm4gdHlwZXMsCi0JICAgICAgIHdlIG11c3Qgc2V0IGV4cGVjdF9mdW5jIHRvIDAgc28gdGhhdCB3ZSBkb24ndCB0cnkgZG8KLQkgICAgICAgZGVtYW5nbGUgbW9yZSBhcmd1bWVudHMgdGhlIG5leHQgdGltZSB3ZSBnZXQgaGVyZS4gICovCi0JICAgIGV4cGVjdF9mdW5jID0gMDsKLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gIGlmIChzdWNjZXNzICYmICFmdW5jX2RvbmUpCi0gICAgewotICAgICAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQl7Ci0JICAvKiBXaXRoIEdOVSBzdHlsZSBkZW1hbmdsaW5nLCBiYXJfXzNmb28gaXMgJ2Zvbzo6YmFyKHZvaWQpJywgYW5kCi0JICAgICBiYXJfXzNmb29pIGlzICdmb286OmJhcihpbnQpJy4gIFdlIGdldCBoZXJlIHdoZW4gd2UgZmluZCB0aGUKLQkgICAgIGZpcnN0IGNhc2UsIGFuZCBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSAnKHZvaWQpJyBnZXRzIGFkZGVkIHRvCi0JICAgICB0aGUgY3VycmVudCBkZWNscC4gIE5vdGUgdGhhdCB3aXRoIEFSTS9IUCwgdGhlIGZpcnN0IGNhc2UKLQkgICAgIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYSBzdGF0aWMgZGF0YSBtZW1iZXIgJ2Zvbzo6YmFyJywKLQkgICAgIHdoaWNoIGlzIGluIHRoZSBjdXJyZW50IGRlY2xwLCBzbyB3ZSBsZWF2ZSBpdCBhbG9uZS4gICovCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCX0KLSAgICB9Ci0gIGlmIChzdWNjZXNzICYmIFBSSU5UX0FSR19UWVBFUykKLSAgICB7Ci0gICAgICBpZiAod29yay0+c3RhdGljX3R5cGUpCi0Jc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIgc3RhdGljIik7Ci0gICAgICBpZiAod29yay0+dHlwZV9xdWFscyAhPSBUWVBFX1VOUVVBTElGSUVEKQotCXsKLQkgIEFQUEVORF9CTEFOSyAoZGVjbHApOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIHF1YWxpZmllcl9zdHJpbmcgKHdvcmstPnR5cGVfcXVhbHMpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLSNpZiAwCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX21ldGhvZF9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDA7Ci0KLSAgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkICsgMSk7Ci0gICAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0gICAgfQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICp0bmFtZTsKLXsKLSAgaW50IGk7Ci0gIGludCByOwotICBpbnQgbmVlZF9jb21tYSA9IDA7Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgc3RyaW5nIHRlbXA7Ci0KLSAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICJ0ZW1wbGF0ZSA8Iik7Ci0gIC8qIGdldCBzaXplIG9mIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0ICovCi0gIGlmIChnZXRfY291bnQgKG1hbmdsZWQsICZyKSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQotCXsKLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIsICIpOwotCSAgICB9Ci0KLQkgICAgLyogWiBmb3IgdHlwZSBwYXJhbWV0ZXJzICovCi0JICAgIGlmICgqKm1hbmdsZWQgPT0gJ1onKQotCSAgICAgIHsKLQkJKCptYW5nbGVkKSsrOwotCQlzdHJpbmdfYXBwZW5kICh0bmFtZSwgImNsYXNzIik7Ci0JICAgICAgfQotCSAgICAgIC8qIHogZm9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi8KLQkgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICd6JykKLQkgICAgICB7Ci0JCSgqbWFuZ2xlZCkrKzsKLQkJc3VjY2VzcyA9Ci0JCSAgZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpOwotCQlpZiAoIXN1Y2Nlc3MpCi0JCSAgewotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogdGVtcCBpcyBpbml0aWFsaXplZCBpbiBkb190eXBlICovCi0JCXN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7Ci0JCWlmIChzdWNjZXNzKQotCQkgIHsKLQkJICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgJnRlbXApOwotCQkgIH0KLQkJc3RyaW5nX2RlbGV0ZSgmdGVtcCk7Ci0JCWlmICghc3VjY2VzcykKLQkJICB7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgbmVlZF9jb21tYSA9IDE7Ci0JfQotCi0gICAgfQotICBpZiAodG5hbWUtPnBbLTFdID09ICc+JykKLSAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiAiKTsKLSAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI+IGNsYXNzIik7Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlICh3b3JrLCBtYW5nbGVkLCBzKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhcioqIG1hbmdsZWQ7Ci0gICAgIHN0cmluZyogczsKLXsKLSAgaW50IHN1Y2Nlc3M7Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnRScpCi0gICAgewotICAgICAgaW50IG5lZWRfb3BlcmF0b3IgPSAwOwotCi0gICAgICBzdWNjZXNzID0gMTsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiKCIsIDEpOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgd2hpbGUgKHN1Y2Nlc3MgJiYgKiptYW5nbGVkICE9ICdXJyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykKLQl7Ci0JICBpZiAobmVlZF9vcGVyYXRvcikKLQkgICAgewotCSAgICAgIHNpemVfdCBpOwotCSAgICAgIHNpemVfdCBsZW47Ci0KLQkgICAgICBzdWNjZXNzID0gMDsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoKm1hbmdsZWQpOwotCi0JICAgICAgZm9yIChpID0gMDsKLQkJICAgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGUgWzBdKTsKLQkJICAgKytpKQotCQl7Ci0JCSAgc2l6ZV90IGwgPSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pOwotCi0JCSAgaWYgKGwgPD0gbGVuCi0JCSAgICAgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgKm1hbmdsZWQsIGwpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiICIsIDEpOwotCQkgICAgICBzdHJpbmdfYXBwZW5kIChzLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiICIsIDEpOwotCQkgICAgICBzdWNjZXNzID0gMTsKLQkJICAgICAgKCptYW5nbGVkKSArPSBsOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKCFzdWNjZXNzKQotCQlicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICBuZWVkX29wZXJhdG9yID0gMTsKLQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsCi0JCQkJCQkgIHRrX2ludGVncmFsKTsKLQl9Ci0KLSAgICAgIGlmICgqKm1hbmdsZWQgIT0gJ1cnKQotCSAgc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICIpIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKiptYW5nbGVkID09ICdRJyB8fCAqKm1hbmdsZWQgPT0gJ0snKQotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHMsIDAsIDEpOwotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBzdWNjZXNzID0gMTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCBzLCB0aykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcqIHM7Ci0gICAgIHR5cGVfa2luZF90IHRrOwotewotICBpbnQgc3VjY2VzcyA9IDE7Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnWScpCi0gICAgewotICAgICAgLyogVGhlIG5leHQgYXJndW1lbnQgaXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICovCi0gICAgICBpbnQgaWR4OwotCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotICAgICAgaWYgKGlkeCA9PSAtMQotCSAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQotCSAgfHwgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKSA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0Jc3RyaW5nX2FwcGVuZCAocywgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBidWZbMTBdOwotCSAgc3ByaW50ZihidWYsICJUJWQiLCBpZHgpOwotCSAgc3RyaW5nX2FwcGVuZCAocywgYnVmKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19pbnRlZ3JhbCkKLSAgICBzdWNjZXNzID0gZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHMpOwotICBlbHNlIGlmICh0ayA9PSB0a19jaGFyKQotICAgIHsKLSAgICAgIGNoYXIgdG1wWzJdOwotICAgICAgaW50IHZhbDsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiJyIsIDEpOwotICAgICAgdmFsID0gY29uc3VtZV9jb3VudChtYW5nbGVkKTsKLSAgICAgIGlmICh2YWwgPD0gMCkKLQlzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICB0bXBbMF0gPSAoY2hhcil2YWw7Ci0JICB0bXBbMV0gPSAnXDAnOwotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICZ0bXBbMF0sIDEpOwotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICInIiwgMSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAodGsgPT0gdGtfYm9vbCkKLSAgICB7Ci0gICAgICBpbnQgdmFsID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAodmFsID09IDApCi0Jc3RyaW5nX2FwcGVuZG4gKHMsICJmYWxzZSIsIDUpOwotICAgICAgZWxzZSBpZiAodmFsID09IDEpCi0Jc3RyaW5nX2FwcGVuZG4gKHMsICJ0cnVlIiwgNCk7Ci0gICAgICBlbHNlCi0Jc3VjY2VzcyA9IDA7Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19yZWFsKQotICAgIHsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnLicpIC8qIGZyYWN0aW9uICovCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICIuIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnZScpIC8qIGV4cG9uZW50ICovCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICJlIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAodGsgPT0gdGtfcG9pbnRlciB8fCB0ayA9PSB0a19yZWZlcmVuY2UpCi0gICAgewotICAgICAgaW50IHN5bWJvbF9sZW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmIChzeW1ib2xfbGVuID09IC0xKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChzeW1ib2xfbGVuID09IDApCi0Jc3RyaW5nX2FwcGVuZG4gKHMsICIwIiwgMSk7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqcCA9IHhtYWxsb2MgKHN5bWJvbF9sZW4gKyAxKSwgKnE7Ci0JICBzdHJuY3B5IChwLCAqbWFuZ2xlZCwgc3ltYm9sX2xlbik7Ci0JICBwIFtzeW1ib2xfbGVuXSA9ICdcMCc7Ci0JICAvKiBXZSB1c2UgY3BsdXNfZGVtYW5nbGUgaGVyZSwgcmF0aGVyIHRoYW4KLQkgICAgIGludGVybmFsX2NwbHVzX2RlbWFuZ2xlLCBiZWNhdXNlIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkKLQkgICAgIG1hbmdsZWQgaGVyZSBkb2VzIG5vdCBtYWtlIHVzZSBvZiBhbnkgb2YgdGhlIHNxdWFuZ2xpbmcKLQkgICAgIG9yIHR5cGUtY29kZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGJ1aWx0IHVwIHRodXMgZmFyOyBpdCBpcwotCSAgICAgbWFuZ2xlZCBpbmRlcGVuZGVudGx5LiAgKi8KLQkgIHEgPSBjcGx1c19kZW1hbmdsZSAocCwgd29yay0+b3B0aW9ucyk7Ci0JICBpZiAodGsgPT0gdGtfcG9pbnRlcikKLQkgICAgc3RyaW5nX2FwcGVuZG4gKHMsICImIiwgMSk7Ci0JICAvKiBGSVhNRTogUG9pbnRlci10by1tZW1iZXIgY29uc3RhbnRzIHNob3VsZCBnZXQgYQotCSAgICAgICAgICAgIHF1YWxpZnlpbmcgY2xhc3MgbmFtZSBoZXJlLiAgKi8KLQkgIGlmIChxKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAocywgcSk7Ci0JICAgICAgZnJlZSAocSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc3RyaW5nX2FwcGVuZCAocywgcCk7Ci0JICBmcmVlIChwKTsKLQl9Ci0gICAgICAqbWFuZ2xlZCArPSBzeW1ib2xfbGVuOwotICAgIH0KLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQotLyogRGVtYW5nbGUgdGhlIHRlbXBsYXRlIG5hbWUgaW4gTUFOR0xFRC4gIFRoZSBmdWxsIG5hbWUgb2YgdGhlCi0gICB0ZW1wbGF0ZSAoZS5nLiwgUzxpbnQ+KSBpcyBwbGFjZWQgaW4gVE5BTUUuICBUaGUgbmFtZSB3aXRob3V0IHRoZQotICAgdGVtcGxhdGUgcGFyYW1ldGVycyAoZS5nLiBTKSBpcyBwbGFjZWQgaW4gVFJBV05BTUUgaWYgVFJBV05BTUUgaXMKLSAgIG5vbi1OVUxMLiAgSWYgSVNfVFlQRSBpcyBub256ZXJvLCB0aGlzIHRlbXBsYXRlIGlzIGEgdHlwZSB0ZW1wbGF0ZSwKLSAgIG5vdCBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgSWYgYm90aCBJU19UWVBFIGFuZCBSRU1FTUJFUiBhcmUgbm9uemVybywKLSAgIHRoZSB0bWVwbGF0ZSBpcyByZW1lbWJlcmVkIGluIHRoZSBsaXN0IG9mIGJhY2stcmVmZXJlbmNlYWJsZQotICAgdHlwZXMuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgdG5hbWUsIHRyYXduYW1lLCBpc190eXBlLCByZW1lbWJlcikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnRuYW1lOwotICAgICBzdHJpbmcgKnRyYXduYW1lOwotICAgICBpbnQgaXNfdHlwZTsKLSAgICAgaW50IHJlbWVtYmVyOwotewotICBpbnQgaTsKLSAgaW50IHI7Ci0gIGludCBuZWVkX2NvbW1hID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotICBjb25zdCBjaGFyICpzdGFydDsKLSAgaW50IGlzX2phdmFfYXJyYXkgPSAwOwotICBzdHJpbmcgdGVtcDsKLSAgaW50IGJpbmRleCA9IDA7Ci0KLSAgKCptYW5nbGVkKSsrOwotICBpZiAoaXNfdHlwZSkKLSAgICB7Ci0gICAgICBpZiAocmVtZW1iZXIpCi0JYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICAgICAgc3RhcnQgPSAqbWFuZ2xlZDsKLSAgICAgIC8qIGdldCB0ZW1wbGF0ZSBuYW1lICovCi0gICAgICBpZiAoKiptYW5nbGVkID09ICd6JykKLQl7Ci0JICBpbnQgaWR4OwotCSAgKCptYW5nbGVkKSsrOwotCSAgKCptYW5nbGVkKSsrOwotCi0JICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotCSAgaWYgKGlkeCA9PSAtMQotCSAgICAgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKLQkgICAgICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCSAgICByZXR1cm4gKDApOwotCi0JICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0JICAgICAgaWYgKHRyYXduYW1lKQotCQlzdHJpbmdfYXBwZW5kICh0cmF3bmFtZSwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzEwXTsKLQkgICAgICBzcHJpbnRmKGJ1ZiwgIlQlZCIsIGlkeCk7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsIGJ1Zik7Ci0JICAgICAgaWYgKHRyYXduYW1lKQotCQlzdHJpbmdfYXBwZW5kICh0cmF3bmFtZSwgYnVmKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKHIgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKSkgPD0gMAotCSAgICAgIHx8IChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpIDwgcikKLQkgICAgewotCSAgICAgIHJldHVybiAoMCk7Ci0JICAgIH0KLQkgIGlzX2phdmFfYXJyYXkgPSAod29yayAtPiBvcHRpb25zICYgRE1HTF9KQVZBKQotCSAgICAmJiBzdHJuY21wICgqbWFuZ2xlZCwgIkpBcnJheTFaIiwgOCkgPT0gMDsKLQkgIGlmICghIGlzX2phdmFfYXJyYXkpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kbiAodG5hbWUsICptYW5nbGVkLCByKTsKLQkgICAgfQotCSAgaWYgKHRyYXduYW1lKQotCSAgICBzdHJpbmdfYXBwZW5kbiAodHJhd25hbWUsICptYW5nbGVkLCByKTsKLQkgICptYW5nbGVkICs9IHI7Ci0JfQotICAgIH0KLSAgaWYgKCFpc19qYXZhX2FycmF5KQotICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPCIpOwotICAvKiBnZXQgc2l6ZSBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCAqLwotICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotICAgIHsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICBpZiAoIWlzX3R5cGUpCi0gICAgewotICAgICAgLyogQ3JlYXRlIGFuIGFycmF5IGZvciBzYXZpbmcgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IHZhbHVlcy4gKi8KLSAgICAgIHdvcmstPnRtcGxfYXJndmVjID0gKGNoYXIqKikgeG1hbGxvYyAociAqIHNpemVvZiAoY2hhciAqKSk7Ci0gICAgICB3b3JrLT5udG1wbF9hcmdzID0gcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0Jd29yay0+dG1wbF9hcmd2ZWNbaV0gPSAwOwotICAgIH0KLSAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmVlZF9jb21tYSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiwgIik7Ci0JfQotICAgICAgLyogWiBmb3IgdHlwZSBwYXJhbWV0ZXJzICovCi0gICAgICBpZiAoKiptYW5nbGVkID09ICdaJykKLQl7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICAvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgJnRlbXApOwotCi0JICAgICAgaWYgKCFpc190eXBlKQotCQl7Ci0JCSAgLyogU2F2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQuICovCi0JCSAgaW50IGxlbiA9IHRlbXAucCAtIHRlbXAuYjsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IHhtYWxsb2MgKGxlbiArIDEpOwotCQkgIG1lbWNweSAod29yay0+dG1wbF9hcmd2ZWNbaV0sIHRlbXAuYiwgbGVuKTsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQkJfQotCSAgICB9Ci0JICBzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgLyogeiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAqLwotICAgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICd6JykKLQl7Ci0JICBpbnQgcjI7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpOwotCi0JICBpZiAoc3VjY2VzcwotCSAgICAgICYmIChyMiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpKSA+IDAKLQkgICAgICAmJiAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA+PSByMikKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotCSAgICAgIHN0cmluZ19hcHBlbmRuICh0bmFtZSwgKm1hbmdsZWQsIHIyKTsKLQkgICAgICBpZiAoIWlzX3R5cGUpCi0JCXsKLQkJICAvKiBTYXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gKi8KLQkJICBpbnQgbGVuID0gcjI7Ci0JCSAgd29yay0+dG1wbF9hcmd2ZWNbaV0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkJICBtZW1jcHkgKHdvcmstPnRtcGxfYXJndmVjW2ldLCAqbWFuZ2xlZCwgbGVuKTsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQkJfQotCSAgICAgICptYW5nbGVkICs9IHIyOwotCSAgICB9Ci0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJpbmcgIHBhcmFtOwotCSAgc3RyaW5nKiBzOwotCi0JICAvKiBvdGhlcndpc2UsIHZhbHVlIHBhcmFtZXRlciAqLwotCi0JICAvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7Ci0JICBzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICghaXNfdHlwZSkKLQkgICAgewotCSAgICAgIHMgPSAmcGFyYW07Ci0JICAgICAgc3RyaW5nX2luaXQgKHMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHMgPSB0bmFtZTsKLQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsCi0JCQkJCQkgICh0eXBlX2tpbmRfdCkgc3VjY2Vzcyk7Ci0KLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGlmICghaXNfdHlwZSkKLQkJc3RyaW5nX2RlbGV0ZSAocyk7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKCFpc190eXBlKQotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IHMtPnAgLSBzLT5iOwotCSAgICAgIHdvcmstPnRtcGxfYXJndmVjW2ldID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICAgICAgbWVtY3B5ICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSwgcy0+YiwgbGVuKTsKLQkgICAgICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQotCSAgICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgcyk7Ci0JICAgICAgc3RyaW5nX2RlbGV0ZSAocyk7Ci0JICAgIH0KLQl9Ci0gICAgICBuZWVkX2NvbW1hID0gMTsKLSAgICB9Ci0gIGlmIChpc19qYXZhX2FycmF5KQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiW10iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodG5hbWUtPnBbLTFdID09ICc+JykKLQlzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiAiKTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPiIpOwotICAgIH0KLQotICBpZiAoaXNfdHlwZSAmJiByZW1lbWJlcikKLSAgICByZW1lbWJlcl9CdHlwZSAod29yaywgdG5hbWUtPmIsIExFTl9TVFJJTkcgKHRuYW1lKSwgYmluZGV4KTsKLQotICAvKgotICAgIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQotICAgIHsKLSAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQgKyAxKTsKLSAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLSAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIGludAotYXJtX3B0ICh3b3JrLCBtYW5nbGVkLCBuLCBhbmNob3IsIGFyZ3MpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotICAgICBpbnQgbjsKLSAgICAgY29uc3QgY2hhciAqKmFuY2hvciwgKiphcmdzOwotewotICAvKiBDaGVjayBpZiBBUk0gdGVtcGxhdGUgd2l0aCAiX19wdF9fIiBpbiBpdCAoInBhcmFtZXRlcml6ZWQgdHlwZSIpICovCi0gIC8qIEFsbG93IEhQIGFsc28gaGVyZSwgYmVjYXVzZSBIUCdzIGNmcm9udCBjb21waWxlciBmb2xsb3dzIEFSTSB0byBzb21lIGV4dGVudCAqLwotICBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcpICYmICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3B0X18iKSkpCi0gICAgewotICAgICAgaW50IGxlbjsKLSAgICAgICphcmdzID0gKmFuY2hvciArIDY7Ci0gICAgICBsZW4gPSBjb25zdW1lX2NvdW50IChhcmdzKTsKLSAgICAgIGlmIChsZW4gPT0gLTEpCi0JcmV0dXJuIDA7Ci0gICAgICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLQl7Ci0JICArKyphcmdzOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLSAgICB7Ci0gICAgICBpZiAoKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fdG1fXyIpKQotICAgICAgICAgIHx8ICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3BzX18iKSkKLSAgICAgICAgICB8fCAoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19wdF9fIikpKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGxlbjsKLSAgICAgICAgICAqYXJncyA9ICphbmNob3IgKyA2OwotICAgICAgICAgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotCSAgaWYgKGxlbiA9PSAtMSkKLQkgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICsrKmFyZ3M7Ci0gICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBlbHNlIGlmICgoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19TIikpKQotICAgICAgICB7Ci0gCSAgaW50IGxlbjsKLSAJICAqYXJncyA9ICphbmNob3IgKyAzOwotIAkgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotCSAgaWYgKGxlbiA9PSAtMSkKLQkgICAgcmV0dXJuIDA7Ci0gCSAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICsrKmFyZ3M7Ci0gCSAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBuLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBpbnQgbjsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY29uc3QgY2hhciAqZSA9ICptYW5nbGVkICsgbjsKLSAgc3RyaW5nIGFyZzsKLQotICAvKiBDaGVjayBmb3IgSFAgYUNDIHRlbXBsYXRlIHNwZWM6IGNsYXNzWHQxdDIgd2hlcmUgdDEsIHQyIGFyZQotICAgICB0ZW1wbGF0ZSBhcmdzICovCi0gIGlmIChIUF9ERU1BTkdMSU5HICYmICgoKm1hbmdsZWQpW25dID09ICdYJykpCi0gICAgewotICAgICAgY2hhciAqc3RhcnRfc3BlY19hcmdzID0gTlVMTDsKLQotICAgICAgLyogRmlyc3QgY2hlY2sgZm9yIGFuZCBvbWl0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHBzZXVkby1hcmd1bWVudHMsCi0gICAgICAgICBzdWNoIGFzIGluICJTcGVjPCMxLCMxLio+IiAqLwotICAgICAgc3RhcnRfc3BlY19hcmdzID0gc3RyY2hyICgqbWFuZ2xlZCwgJzwnKTsKLSAgICAgIGlmIChzdGFydF9zcGVjX2FyZ3MgJiYgKHN0YXJ0X3NwZWNfYXJncyAtICptYW5nbGVkIDwgbikpCi0gICAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIHN0YXJ0X3NwZWNfYXJncyAtICptYW5nbGVkKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0gICAgICAoKm1hbmdsZWQpICs9IG4gKyAxOwotICAgICAgc3RyaW5nX2luaXQgKCZhcmcpOwotICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpIC8qIG5vbi1yZWN1cnNpdmUgY2FsbCAqLwotICAgICAgICB3b3JrLT50ZW1wX3N0YXJ0ID0gZGVjbHAtPnAgLSBkZWNscC0+YjsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPCIpOwotICAgICAgd2hpbGUgKDEpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfY2xlYXIgKCZhcmcpOwotICAgICAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAvKiAnVCcgc2lnbmFscyBhIHR5cGUgcGFyYW1ldGVyICovCi0gICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgICAgICAgIGlmICghZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJmFyZykpCi0gICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICdVJzoKLSAgICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgLyogJ1UnIG9yICdTJyBzaWduYWxzIGFuIGludGVncmFsIHZhbHVlICovCi0gICAgICAgICAgICAgICAgaWYgKCFkb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSAod29yaywgbWFuZ2xlZCwgJmFyZykpCi0gICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICAgICAgICAvKiAnQScgc2lnbmFscyBhIG5hbWVkIGNvbnN0YW50IGV4cHJlc3Npb24gKGxpdGVyYWwpICovCi0gICAgICAgICAgICAgICAgaWYgKCFkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogVG9kYXksIDE5OTctMDktMDMsIHdlIGhhdmUgb25seSB0aGUgYWJvdmUgdHlwZXMKLSAgICAgICAgICAgICAgICAgICBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgLyogRklYTUU6IG1heWJlIHRoaXMgc2hvdWxkIGZhaWwgYW5kIHJldHVybiBudWxsICovCi0gICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLSAgICAgICAgIC8qIENoZWNrIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGVtcGxhdGUgYXJncy4KLSAgICAgICAgICAgICAwIGlmIGF0IGVuZCBvZiBzdGF0aWMgbWVtYmVyIG9mIHRlbXBsYXRlIGNsYXNzLAotICAgICAgICAgICAgIF8gaWYgZG9uZSB3aXRoIHRlbXBsYXRlIGFyZ3MgZm9yIGEgZnVuY3Rpb24gKi8KLSAgICAgICAgICBpZiAoKCoqbWFuZ2xlZCA9PSAnXDAwMCcpIHx8ICgqKm1hbmdsZWQgPT0gJ18nKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotICAgICAgICB9Ci0gICAgaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOgotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI+Iik7Ci0gICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBBUk0gdGVtcGxhdGU/IChBbHNvIGhhbmRsZXMgSFAgY2Zyb250IGV4dGVuc2lvbnMpICovCi0gIGVsc2UgaWYgKGFybV9wdCAod29yaywgKm1hbmdsZWQsIG4sICZwLCAmYXJncykpCi0gICAgewotICAgICAgc3RyaW5nIHR5cGVfc3RyOwotCi0gICAgICBzdHJpbmdfaW5pdCAoJmFyZyk7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBwIC0gKm1hbmdsZWQpOwotICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpICAvKiBub24tcmVjdXJzaXZlIGNhbGwgKi8KLQl3b3JrLT50ZW1wX3N0YXJ0ID0gZGVjbHAtPnAgLSBkZWNscC0+YjsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPCIpOwotICAgICAgLyogc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nIGhlcmUgKi8KLSAgICAgIHdoaWxlIChhcmdzIDwgZSkgewotCXN0cmluZ19jbGVhciAoJmFyZyk7Ci0KLQkvKiBDaGVjayBmb3IgdHlwZSBvciBsaXRlcmFsIGhlcmUgKi8KLQlzd2l0Y2ggKCphcmdzKQotCSAgewotCSAgICAvKiBIUCBjZnJvbnQgZXh0ZW5zaW9ucyB0byBBUk0gZm9yIHRlbXBsYXRlIGFyZ3MgKi8KLQkgICAgLyogc3BlYzogWHQxTHYxIHdoZXJlIHQxIGlzIGEgdHlwZSwgdjEgaXMgYSBsaXRlcmFsIHZhbHVlICovCi0JICAgIC8qIEZJWE1FOiBXZSBoYW5kbGUgb25seSBudW1lcmljIGxpdGVyYWxzIGZvciBIUCBjZnJvbnQgKi8KLSAgICAgICAgICBjYXNlICdYJzoKLSAgICAgICAgICAgIC8qIEEgdHlwZWQgY29uc3RhbnQgdmFsdWUgZm9sbG93cyAqLwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCAmYXJncywgJnR5cGVfc3RyKSkKLQkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmYXJnLCAiKCIpOwotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKCZhcmcsICZ0eXBlX3N0cik7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmYXJnLCAiKSIpOwotICAgICAgICAgICAgaWYgKCphcmdzICE9ICdMJykKLSAgICAgICAgICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgLyogTm93IHNuYXJmIGEgbGl0ZXJhbCB2YWx1ZSBmb2xsb3dpbmcgJ0wnICovCi0gICAgICAgICAgICBpZiAoIXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoJmFyZ3MsICZhcmcpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAvKiBTbmFyZiBhIGxpdGVyYWwgZm9sbG93aW5nICdMJyAqLwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgaWYgKCFzbmFyZl9udW1lcmljX2xpdGVyYWwgKCZhcmdzLCAmYXJnKSkKLQkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogTm90IGhhbmRsaW5nIG90aGVyIEhQIGNmcm9udCBzdHVmZiAqLwotICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCAmYXJncywgJmFyZykpCi0gICAgICAgICAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLQkgIH0KLQlzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOwotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotICAgICAgfQotICAgIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU6Ci0gICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLSAgICAgIGlmIChhcmdzID49IGUpCi0JLS1kZWNscC0+cDsgLyogcmVtb3ZlIGV4dHJhIGNvbW1hICovCi0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIj4iKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG4+MTAgJiYgc3RybmNtcCAoKm1hbmdsZWQsICJfR0xPQkFMXyIsIDgpID09IDAKLQkgICAmJiAoKm1hbmdsZWQpWzldID09ICdOJwotCSAgICYmICgqbWFuZ2xlZClbOF0gPT0gKCptYW5nbGVkKVsxMF0KLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbOF0pKQotICAgIHsKLSAgICAgIC8qIEEgbWVtYmVyIG9mIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiAgKi8KLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAie2Fub255bW91c30iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgLyogbm9uLXJlY3Vyc2l2ZSBjYWxsIG9ubHkgKi8KLQl3b3JrLT50ZW1wX3N0YXJ0ID0gMDsgICAgIC8qIGRpc2FibGUgaW4gcmVjdXJzaXZlIGNhbGxzICovCi0gICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLSAgICB9Ci0gICptYW5nbGVkICs9IG47Ci19Ci0KLS8qIEV4dHJhY3QgYSBjbGFzcyBuYW1lLCBwb3NzaWJseSBhIHRlbXBsYXRlIHdpdGggYXJndW1lbnRzLCBmcm9tIHRoZQotICAgbWFuZ2xlZCBzdHJpbmc7IHF1YWxpZmllcnMsIGxvY2FsIGNsYXNzIGluZGljYXRvcnMsIGV0Yy4gaGF2ZQotICAgYWxyZWFkeSBiZWVuIGRlYWx0IHdpdGggKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IG47Ci0gIGludCBzdWNjZXNzID0gMDsKLQotICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gIGlmIChuID09IC0xKQotICAgIHJldHVybiAwOwotICBpZiAoKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPj0gbikKLSAgICB7Ci0gICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIG4sIGRlY2xwKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZGVtYW5nbGVfY2xhc3MgLS0gZGVtYW5nbGUgYSBtYW5nbGVkIGNsYXNzIHNlcXVlbmNlCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZGVtYW5nbGVfY2xhc3MgKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCXN0cmludCAqZGVjbHApCi0KLURFU0NSSVBUSU9OCi0KLQlERUNMUCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRlbWFuZ2xpbmcgaXMgYmVpbmcgZG9uZS4KLQotCSpNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCB0b2tlbiB0byBiZSBkZW1hbmdsZWQuICBPbiBpbnB1dCwKLQlpdCBwb2ludHMgdG8gYSBtYW5nbGVkIGNsYXNzIChJLkUuICIzZm9vIiwgIjEzdmVyeWxvbmdjbGFzcyIsIGV0Yy4pCi0JT24gZXhpdCwgaXQgcG9pbnRzIHRvIHRoZSBuZXh0IHRva2VuIGFmdGVyIHRoZSBtYW5nbGVkIGNsYXNzIG9uCi0Jc3VjY2Vzcywgb3IgdGhlIGZpcnN0IHVuY29uc3VtZWQgdG9rZW4gb24gZmFpbHVyZS4KLQotCUlmIHRoZSBDT05TVFJVQ1RPUiBvciBERVNUUlVDVE9SIGZsYWdzIGFyZSBzZXQgaW4gV09SSywgdGhlbgotCXdlIGFyZSBkZW1hbmdsaW5nIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gIEluIHRoaXMgY2FzZQotCXdlIHByZXBlbmQgImNsYXNzOjpjbGFzcyIgb3IgImNsYXNzOjp+Y2xhc3MiIHRvIERFQ0xQLgotCi0JT3RoZXJ3aXNlLCB3ZSBwcmVwZW5kICJjbGFzczo6IiB0byB0aGUgY3VycmVudCBERUNMUC4KLQotCVJlc2V0IHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZsYWdzIG9uY2UgdGhleSBoYXZlIGJlZW4KLQkiY29uc3VtZWQiLiAgVGhpcyBhbGxvd3MgZGVtYW5nbGVfY2xhc3MgdG8gYmUgY2FsbGVkIGxhdGVyIGR1cmluZwotCXRoZSBzYW1lIGRlbWFuZ2xpbmcsIHRvIGRvIG5vcm1hbCBjbGFzcyBkZW1hbmdsaW5nLgotCi0JUmV0dXJucyAxIGlmIGRlbWFuZ2xpbmcgaXMgc3VjY2Vzc2Z1bCwgMCBvdGhlcndpc2UuCi0KLSovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2NsYXNzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGludCBidHlwZTsKLSAgc3RyaW5nIGNsYXNzX25hbWU7Ci0gIGNoYXIgKnNhdmVfY2xhc3NfbmFtZV9lbmQgPSAwOwotCi0gIHN0cmluZ19pbml0ICgmY2xhc3NfbmFtZSk7Ci0gIGJ0eXBlID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICBpZiAoZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgJmNsYXNzX25hbWUpKQotICAgIHsKLSAgICAgIHNhdmVfY2xhc3NfbmFtZV9lbmQgPSBjbGFzc19uYW1lLnA7Ci0gICAgICBpZiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkKLQl7Ci0gICAgICAgICAgLyogYWRqdXN0IHNvIHdlIGRvbid0IGluY2x1ZGUgdGVtcGxhdGUgYXJncyAqLwotICAgICAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ICYmICh3b3JrLT50ZW1wX3N0YXJ0ICE9IC0xKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2xhc3NfbmFtZS5wID0gY2xhc3NfbmFtZS5iICsgd29yay0+dGVtcF9zdGFydDsKLSAgICAgICAgICAgIH0KLQkgIHN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZjbGFzc19uYW1lKTsKLQkgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKGRlY2xwLCAifiIpOwotICAgICAgICAgICAgICB3b3JrIC0+IGRlc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd29yayAtPiBjb25zdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JfQotICAgICAgY2xhc3NfbmFtZS5wID0gc2F2ZV9jbGFzc19uYW1lX2VuZDsKLSAgICAgIHJlbWVtYmVyX0t0eXBlICh3b3JrLCBjbGFzc19uYW1lLmIsIExFTl9TVFJJTkcoJmNsYXNzX25hbWUpKTsKLSAgICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCBjbGFzc19uYW1lLmIsIExFTl9TVFJJTkcoJmNsYXNzX25hbWUpLCBidHlwZSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJmNsYXNzX25hbWUpOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotICBzdHJpbmdfZGVsZXRlICgmY2xhc3NfbmFtZSk7Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9wcmVmaXggLS0gY29uc3VtZSB0aGUgbWFuZ2xlZCBuYW1lIHByZWZpeCBhbmQgZmluZCBzaWduYXR1cmUKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9wcmVmaXggKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCSBzdHJpbmcgKmRlY2xwKTsKLQotREVTQ1JJUFRJT04KLQotCUNvbnN1bWUgYW5kIGRlbWFuZ2xlIHRoZSBwcmVmaXggb2YgdGhlIG1hbmdsZWQgbmFtZS4KLQotCURFQ0xQIHBvaW50cyB0byB0aGUgc3RyaW5nIGJ1ZmZlciBpbnRvIHdoaWNoIGRlbWFuZ2xlZCBvdXRwdXQgaXMKLQlwbGFjZWQuICBPbiBlbnRyeSwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4gIE9uIGV4aXQgaXQgY29udGFpbnMKLQl0aGUgcm9vdCBmdW5jdGlvbiBuYW1lLCB0aGUgZGVtYW5nbGVkIG9wZXJhdG9yIG5hbWUsIG9yIGluIHNvbWUKLQlzcGVjaWFsIGNhc2VzIGVpdGhlciBub3RoaW5nIG9yIHRoZSBjb21wbGV0ZWx5IGRlbWFuZ2xlZCByZXN1bHQuCi0KLQlNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCBwb2ludGVyIGludG8gdGhlIG1hbmdsZWQgbmFtZS4gIEFzIGVhY2gKLQl0b2tlbiBvZiB0aGUgbWFuZ2xlZCBuYW1lIGlzIGNvbnN1bWVkLCBpdCBpcyB1cGRhdGVkLiAgVXBvbiBlbnRyeQotCXRoZSBjdXJyZW50IG1hbmdsZWQgbmFtZSBwb2ludGVyIHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCi0JdGhlIG1hbmdsZWQgbmFtZS4gIFVwb24gZXhpdCwgaXQgc2hvdWxkIHBvaW50IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQlvZiB0aGUgc2lnbmF0dXJlIGlmIGRlbWFuZ2xpbmcgd2FzIHN1Y2Nlc3NmdWwsIG9yIHRvIHRoZSBmaXJzdAotCXVuY29uc3VtZWQgY2hhcmFjdGVyIGlmIGRlbWFuZ2xpbmcgb2YgdGhlIHByZWZpeCB3YXMgdW5zdWNjZXNzZnVsLgotCi0JUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLgotICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3ByZWZpeCAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpzY2FuOwotICBpbnQgaTsKLQotICBpZiAoc3RybGVuKCptYW5nbGVkKSA+IDYKLSAgICAgICYmIChzdHJuY21wKCptYW5nbGVkLCAiX2ltcF9fIiwgNikgPT0gMAotICAgICAgICAgIHx8IHN0cm5jbXAoKm1hbmdsZWQsICJfX2ltcF8iLCA2KSA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBpdCdzIGEgc3ltYm9sIGltcG9ydGVkIGZyb20gYSBQRSBkeW5hbWljIGxpYnJhcnkuIENoZWNrIGZvciBib3RoCi0gICAgICAgICBuZXcgc3R5bGUgcHJlZml4IF9pbXBfXyBhbmQgbGVnYWN5IF9faW1wXyB1c2VkIGJ5IG9sZGVyIHZlcnNpb25zCi0JIG9mIGRsbHRvb2wuICovCi0gICAgICAoKm1hbmdsZWQpICs9IDY7Ci0gICAgICB3b3JrLT5kbGxpbXBvcnRlZCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJsZW4oKm1hbmdsZWQpID49IDExICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfR0xPQkFMXyIsIDgpID09IDApCi0gICAgewotICAgICAgY2hhciAqbWFya2VyID0gc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzhdKTsKLSAgICAgIGlmIChtYXJrZXIgIT0gTlVMTCAmJiAqbWFya2VyID09ICgqbWFuZ2xlZClbMTBdKQotCXsKLQkgIGlmICgoKm1hbmdsZWQpWzldID09ICdEJykKLQkgICAgewotCSAgICAgIC8qIGl0J3MgYSBHTlUgZ2xvYmFsIGRlc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBleGl0ICovCi0JICAgICAgKCptYW5nbGVkKSArPSAxMTsKLQkgICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMjsKLQkgICAgICBpZiAoZ251X3NwZWNpYWwgKHdvcmssIG1hbmdsZWQsIGRlY2xwKSkKLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCgqbWFuZ2xlZClbOV0gPT0gJ0knKQotCSAgICB7Ci0JICAgICAgLyogaXQncyBhIEdOVSBnbG9iYWwgY29uc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBpbml0ICovCi0JICAgICAgKCptYW5nbGVkKSArPSAxMTsKLQkgICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDI7Ci0JICAgICAgaWYgKGdudV9zcGVjaWFsICh3b3JrLCBtYW5nbGVkLCBkZWNscCkpCi0JCXJldHVybiBzdWNjZXNzOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfX3N0ZF9fIiwgNykgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBpdCdzIGEgQVJNIGdsb2JhbCBkZXN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gZXhpdCAqLwotICAgICAgKCptYW5nbGVkKSArPSA3OwotICAgICAgd29yay0+ZGVzdHJ1Y3RvciA9IDI7Ci0gICAgfQotICBlbHNlIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9fc3RpX18iLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBBUk0gZ2xvYmFsIGNvbnN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gaW5pdGlhbCAqLwotICAgICAgKCptYW5nbGVkKSArPSA3OwotICAgICAgd29yay0+Y29uc3RydWN0b3IgPSAyOwotICAgIH0KLQotICAvKiAgVGhpcyBibG9jayBvZiBjb2RlIGlzIGEgcmVkdWN0aW9uIGluIHN0cmVuZ3RoIHRpbWUgb3B0aW1pemF0aW9uCi0gICAgICBvZjoKLSAgICAgIHNjYW4gPSBteXN0cnN0ciAoKm1hbmdsZWQsICJfXyIpOyAqLwotCi0gIHsKLSAgICBzY2FuID0gKm1hbmdsZWQ7Ci0KLSAgICBkbyB7Ci0gICAgICBzY2FuID0gc3RyY2hyIChzY2FuLCAnXycpOwotICAgIH0gd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiAqKytzY2FuICE9ICdfJyk7Ci0KLSAgICBpZiAoc2NhbiAhPSBOVUxMKSAtLXNjYW47Ci0gIH0KLQotICBpZiAoc2NhbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGZvdW5kIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUgJ18nLCBlbnN1cmUgdGhhdCB3ZSBzdGFydCBhdAotCSB0aGUgbGFzdCBwYWlyIGluIHRoZSBzZXF1ZW5jZS4gICovCi0gICAgICBpID0gc3Ryc3BuIChzY2FuLCAiXyIpOwotICAgICAgaWYgKGkgPiAyKQotCXsKLQkgIHNjYW4gKz0gKGkgLSAyKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzY2FuID09IE5VTEwpCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICBlbHNlIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQotICAgIHsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblswXSkgJiYgKHNjYW5bMF0gIT0gJ3QnKSkKLQl7Ci0JICBzdWNjZXNzID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmICgoc2NhbiA9PSAqbWFuZ2xlZCkKLQkgICAmJiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkgfHwgKHNjYW5bMl0gPT0gJ1EnKQotCSAgICAgICB8fCAoc2NhblsyXSA9PSAndCcpIHx8IChzY2FuWzJdID09ICdLJykgfHwgKHNjYW5bMl0gPT0gJ0gnKSkpCi0gICAgewotICAgICAgLyogVGhlIEFSTSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIG1hbmdsaW5nIG9mIGxvY2FsIHZhcmlhYmxlcy4KLQkgQnV0IGNmcm9udCBtYW5nbGVzIGxvY2FsIHZhcmlhYmxlcyBieSBwcmVwZW5kaW5nIF9fPG5lc3RpbmdfbGV2ZWw+Ci0JIHRvIHRoZW0uIEFzIGFuIGV4dGVuc2lvbiB0byBBUk0gZGVtYW5nbGluZyB3ZSBoYW5kbGUgdGhpcyBjYXNlLiAgKi8KLSAgICAgIGlmICgoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HKQotCSAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkpCi0JewotCSAgKm1hbmdsZWQgPSBzY2FuICsgMjsKLQkgIGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkKTsKLQkgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotCSAgc3VjY2VzcyA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgR05VIHN0eWxlIGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoIF9fWzAtOVF0XS4gIEJ1dCBjZnJvbnQgdXNlcwotCSAgICAgbmFtZXMgbGlrZSBfX1EyXzNmb28zYmFyIGZvciBuZXN0ZWQgdHlwZSBuYW1lcy4gIFNvIGRvbid0IGFjY2VwdAotCSAgICAgdGhpcyBzdHlsZSBvZiBjb25zdHJ1Y3RvciBmb3IgY2Zyb250IGRlbWFuZ2xpbmcuICBBIEdOVQotCSAgICAgc3R5bGUgbWVtYmVyLXRlbXBsYXRlIGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoICdIJy4gKi8KLQkgIGlmICghKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykpCi0JICAgIHdvcmsgLT4gY29uc3RydWN0b3IgKz0gMTsKLQkgICptYW5nbGVkID0gc2NhbiArIDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoQVJNX0RFTUFOR0xJTkcgJiYgc2NhblsyXSA9PSAncCcgJiYgc2NhblszXSA9PSAndCcpCi0gICAgewotICAgICAgLyogQ2Zyb250LXN0eWxlIHBhcmFtZXRlcml6ZWQgdHlwZS4gIEhhbmRsZWQgbGF0ZXIgYXMgYSBzaWduYXR1cmUuICovCi0gICAgICBzdWNjZXNzID0gMTsKLQotICAgICAgLyogQVJNIHRlbXBsYXRlPyAqLwotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBzdHJsZW4gKCptYW5nbGVkKSwgZGVjbHApOwotICAgIH0KLSAgZWxzZSBpZiAoRURHX0RFTUFOR0xJTkcgJiYgKChzY2FuWzJdID09ICd0JyAmJiBzY2FuWzNdID09ICdtJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICdzJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICd0JykpKQotICAgIHsKLSAgICAgIC8qIEVERy1zdHlsZSBwYXJhbWV0ZXJpemVkIHR5cGUuICBIYW5kbGVkIGxhdGVyIGFzIGEgc2lnbmF0dXJlLiAqLwotICAgICAgc3VjY2VzcyA9IDE7Ci0KLSAgICAgIC8qIEVERyB0ZW1wbGF0ZT8gKi8KLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgc3RybGVuICgqbWFuZ2xlZCksIGRlY2xwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzY2FuID09ICptYW5nbGVkKSAmJiAhaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkKLQkgICAmJiAoc2NhblsyXSAhPSAndCcpKQotICAgIHsKLSAgICAgIC8qIE1hbmdsZWQgbmFtZSBzdGFydHMgd2l0aCAiX18iLiAgU2tpcCBvdmVyIGFueSBsZWFkaW5nICdfJyBjaGFyYWN0ZXJzLAotCSB0aGVuIGZpbmQgdGhlIG5leHQgIl9fIiB0aGF0IHNlcGFyYXRlcyB0aGUgcHJlZml4IGZyb20gdGhlIHNpZ25hdHVyZS4KLQkgKi8KLSAgICAgIGlmICghKEFSTV9ERU1BTkdMSU5HIHx8IExVQ0lEX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgIHx8IChhcm1fc3BlY2lhbCAobWFuZ2xlZCwgZGVjbHApID09IDApKQotCXsKLQkgIHdoaWxlICgqc2NhbiA9PSAnXycpCi0JICAgIHsKLQkgICAgICBzY2FuKys7Ci0JICAgIH0KLQkgIGlmICgoc2NhbiA9IG15c3Ryc3RyIChzY2FuLCAiX18iKSkgPT0gTlVMTCB8fCAoKihzY2FuICsgMikgPT0gJ1wwJykpCi0JICAgIHsKLQkgICAgICAvKiBObyBzZXBhcmF0b3IgKEkuRS4gIl9fbm90X21hbmdsZWQiKSwgb3IgZW1wdHkgc2lnbmF0dXJlCi0JCSAoSS5FLiAiX19ub3RfbWFuZ2xlZF9laXRoZXJfXyIpICovCi0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKnRtcDsKLQotICAgICAgICAgICAgICAvKiBMb29rIGZvciB0aGUgTEFTVCBvY2N1cnJlbmNlIG9mIF9fLCBhbGxvd2luZyBuYW1lcyB0bwotICAgICAgICAgICAgICAgICBoYXZlIHRoZSAnX18nIHNlcXVlbmNlIGVtYmVkZGVkIGluIHRoZW0uICovCi0JICAgICAgaWYgKCEoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORykpCi0JCXsKLQkJICB3aGlsZSAoKHRtcCA9IG15c3Ryc3RyIChzY2FuICsgMiwgIl9fIikpICE9IE5VTEwpCi0JCSAgICBzY2FuID0gdG1wOwotCQl9Ci0JICAgICAgaWYgKCooc2NhbiArIDIpID09ICdcMCcpCi0JCXN1Y2Nlc3MgPSAwOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKihzY2FuICsgMikgIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBNYW5nbGVkIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCAiX18iIGJ1dCBkb2VzIGhhdmUgb25lIHNvbWV3aGVyZQotCSBpbiB0aGVyZSB3aXRoIG5vbiBlbXB0eSBzdHVmZiBhZnRlciBpdC4gIExvb2tzIGxpa2UgYSBnbG9iYWwKLQkgZnVuY3Rpb24gbmFtZS4gICovCi0gICAgICBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2Nhbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRG9lc24ndCBsb29rIGxpa2UgYSBtYW5nbGVkIG5hbWUgKi8KLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLQotICBpZiAoIXN1Y2Nlc3MgJiYgKHdvcmstPmNvbnN0cnVjdG9yID09IDIgfHwgd29yay0+ZGVzdHJ1Y3RvciA9PSAyKSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQpOwotICAgICAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlnbnVfc3BlY2lhbCAtLSBzcGVjaWFsIGhhbmRsaW5nIG9mIGdudSBtYW5nbGVkIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlnbnVfc3BlY2lhbCAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkgICAgIHN0cmluZyAqZGVjbHApOwotCi0KLURFU0NSSVBUSU9OCi0KLQlQcm9jZXNzIHNvbWUgc3BlY2lhbCBHTlUgc3R5bGUgbWFuZ2xpbmcgZm9ybXMgdGhhdCBkb24ndCBmaXQKLQl0aGUgbm9ybWFsIHBhdHRlcm4uICBGb3IgZXhhbXBsZToKLQotCQlfJF8zZm9vCQkoZGVzdHJ1Y3RvciBmb3IgY2xhc3MgZm9vKQotCQlfdnQkZm9vCQkoZm9vIHZpcnR1YWwgdGFibGUpCi0JCV92dCRmb28kYmFyCShmb286OmJhciB2aXJ0dWFsIHRhYmxlKQotCQlfX3Z0X2ZvbwkoZm9vIHZpcnR1YWwgdGFibGUsIG5ldyBzdHlsZSB3aXRoIHRodW5rcykKLQkJXzNmb28kdmFybmFtZQkoc3RhdGljIGRhdGEgbWVtYmVyKQotCQlfUTIycnMydHUkdncJKHN0YXRpYyBkYXRhIG1lbWJlcikKLQkJX190NnZlY3RvcjFaaWkJKGNvbnN0cnVjdG9yIHdpdGggdGVtcGxhdGUpCi0JCV9fdGh1bmtfNF9fJF83b3N0cmVhbSAodmlydHVhbCBmdW5jdGlvbiB0aHVuaykKLSAqLwotCi1zdGF0aWMgaW50Ci1nbnVfc3BlY2lhbCAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IG47Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY29uc3QgY2hhciAqcDsKLQotICBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycKLSAgICAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVsxXSkgIT0gTlVMTAotICAgICAgJiYgKCptYW5nbGVkKVsyXSA9PSAnXycpCi0gICAgewotICAgICAgLyogRm91bmQgYSBHTlUgc3R5bGUgZGVzdHJ1Y3RvciwgZ2V0IHBhc3QgIl88Q1BMVVNfTUFSS0VSPl8iICovCi0gICAgICAoKm1hbmdsZWQpICs9IDM7Ci0gICAgICB3b3JrIC0+IGRlc3RydWN0b3IgKz0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nCi0JICAgJiYgKCgoKm1hbmdsZWQpWzFdID09ICdfJwotCQkmJiAoKm1hbmdsZWQpWzJdID09ICd2JwotCQkmJiAoKm1hbmdsZWQpWzNdID09ICd0JwotCQkmJiAoKm1hbmdsZWQpWzRdID09ICdfJykKLQkgICAgICAgfHwgKCgqbWFuZ2xlZClbMV0gPT0gJ3YnCi0JCSAgICYmICgqbWFuZ2xlZClbMl0gPT0gJ3QnCi0JCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVszXSkgIT0gTlVMTCkpKQotICAgIHsKLSAgICAgIC8qIEZvdW5kIGEgR05VIHN0eWxlIHZpcnR1YWwgdGFibGUsIGdldCBwYXN0ICJfdnQ8Q1BMVVNfTUFSS0VSPiIKLSAgICAgICAgIGFuZCBjcmVhdGUgdGhlIGRlY2wuICBOb3RlIHRoYXQgd2UgY29uc3VtZSB0aGUgZW50aXJlIG1hbmdsZWQKLQkgaW5wdXQgc3RyaW5nLCB3aGljaCBtZWFucyB0aGF0IGRlbWFuZ2xlX3NpZ25hdHVyZSBoYXMgbm8gd29yawotCSB0byBkby4gICovCi0gICAgICBpZiAoKCptYW5nbGVkKVsyXSA9PSAndicpCi0JKCptYW5nbGVkKSArPSA1OyAvKiBOZXcgc3R5bGUsIHdpdGggdGh1bmtzOiAiX192dF8iICovCi0gICAgICBlbHNlCi0JKCptYW5nbGVkKSArPSA0OyAvKiBPbGQgc3R5bGUsIG5vIHRodW5rczogIl92dDxDUExVU19NQVJLRVI+IiAqLwotICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAhPSAnXDAnKQotCXsKLQkgIHN3aXRjaCAoKiptYW5nbGVkKQotCSAgICB7Ci0JICAgIGNhc2UgJ1EnOgotCSAgICBjYXNlICdLJzoKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3QnOgotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEsCi0JCQkJCSAgIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSptYW5nbGVkWzBdKSkKLQkJewotCQkgIG4gPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotCQkgIC8qIFdlIG1heSBiZSBzZWVpbmcgYSB0b28tbGFyZ2Ugc2l6ZSwgb3IgZWxzZSBhCi0JCSAgICAgIi48ZGlnaXRzPiIgaW5kaWNhdGluZyBhIHN0YXRpYyBsb2NhbCBzeW1ib2wuICBJbgotCQkgICAgIGFueSBjYXNlLCBkZWNsYXJlIHZpY3RvcnkgYW5kIG1vdmUgb247ICpkb24ndCogdHJ5Ci0JCSAgICAgdG8gdXNlIG4gdG8gYWxsb2NhdGUuICAqLwotCQkgIGlmIChuID4gKGludCkgc3RybGVuICgqbWFuZ2xlZCkpCi0JCSAgICB7Ci0JCSAgICAgIHN1Y2Nlc3MgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG4gPSBzdHJjc3BuICgqbWFuZ2xlZCwgY3BsdXNfbWFya2Vycyk7Ci0JCX0KLQkgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICAgICAoKm1hbmdsZWQpICs9IG47Ci0JICAgIH0KLQotCSAgcCA9IHN0cnBicmsgKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKTsKLQkgIGlmIChzdWNjZXNzICYmICgocCA9PSBOVUxMKSB8fCAocCA9PSAqbWFuZ2xlZCkpKQotCSAgICB7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkJICAoKm1hbmdsZWQpKys7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3VjY2VzcykKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgIiB2aXJ0dWFsIHRhYmxlIik7Ci0gICAgfQotICBlbHNlIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJwotCSAgICYmIChzdHJjaHIoIjAxMjM0NTY3ODlRdCIsICgqbWFuZ2xlZClbMV0pICE9IE5VTEwpCi0JICAgJiYgKHAgPSBzdHJwYnJrICgqbWFuZ2xlZCwgY3BsdXNfbWFya2VycykpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogc3RhdGljIGRhdGEgbWVtYmVyLCAiXzNmb28kdmFybmFtZSIgZm9yIGV4YW1wbGUgKi8KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQljYXNlICdLJzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwgMSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgaWYgKG4gPCAwIHx8IG4gPiBzdHJsZW4gKCptYW5nbGVkKSkKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICgqbWFuZ2xlZCkgKz0gbjsKLQl9Ci0gICAgICBpZiAoc3VjY2VzcyAmJiAocCA9PSAqbWFuZ2xlZCkpCi0JewotCSAgLyogQ29uc3VtZWQgZXZlcnl0aGluZyB1cCB0byB0aGUgY3BsdXNfbWFya2VyLCBhcHBlbmQgdGhlCi0JICAgICB2YXJpYWJsZSBuYW1lLiAgKi8KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkgIG4gPSBzdHJsZW4gKCptYW5nbGVkKTsKLQkgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgKCptYW5nbGVkKSArPSBuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdWNjZXNzID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgIl9fdGh1bmtfIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZGVsdGE7Ci0KLSAgICAgICgqbWFuZ2xlZCkgKz0gODsKLSAgICAgIGRlbHRhID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAoZGVsdGEgPT0gLTEpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqbWV0aG9kID0gaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssICsrKm1hbmdsZWQpOwotCi0JICBpZiAobWV0aG9kKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbNTBdOwotCSAgICAgIHNwcmludGYgKGJ1ZiwgInZpcnR1YWwgZnVuY3Rpb24gdGh1bmsgKGRlbHRhOiVkKSBmb3IgIiwgLWRlbHRhKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgYnVmKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgbWV0aG9kKTsKLQkgICAgICBmcmVlIChtZXRob2QpOwotCSAgICAgIG4gPSBzdHJsZW4gKCptYW5nbGVkKTsKLQkgICAgICAoKm1hbmdsZWQpICs9IG47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoKm1hbmdsZWQsICJfX3QiLCAzKSA9PSAwCi0JICAgJiYgKCgqbWFuZ2xlZClbM10gPT0gJ2knIHx8ICgqbWFuZ2xlZClbM10gPT0gJ2YnKSkKLSAgICB7Ci0gICAgICBwID0gKCptYW5nbGVkKVszXSA9PSAnaScgPyAiIHR5cGVfaW5mbyBub2RlIiA6ICIgdHlwZV9pbmZvIGZ1bmN0aW9uIjsKLSAgICAgICgqbWFuZ2xlZCkgKz0gNDsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQljYXNlICdLJzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwgMSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHN1Y2Nlc3MgJiYgKiptYW5nbGVkICE9ICdcMCcpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBpZiAoc3VjY2VzcykKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgdm9pZAotcmVjdXJzaXZlbHlfZGVtYW5nbGUod29yaywgbWFuZ2xlZCwgcmVzdWx0LCBuYW1lbGVuZ3RoKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotICAgICBpbnQgbmFtZWxlbmd0aDsKLXsKLSAgY2hhciAqIHJlY3Vyc2UgPSAoY2hhciAqKU5VTEw7Ci0gIGNoYXIgKiByZWN1cnNlX2RlbSA9IChjaGFyICopTlVMTDsKLQotICByZWN1cnNlID0gKGNoYXIgKikgeG1hbGxvYyAobmFtZWxlbmd0aCArIDEpOwotICBtZW1jcHkgKHJlY3Vyc2UsICptYW5nbGVkLCBuYW1lbGVuZ3RoKTsKLSAgcmVjdXJzZVtuYW1lbGVuZ3RoXSA9ICdcMDAwJzsKLQotICByZWN1cnNlX2RlbSA9IGNwbHVzX2RlbWFuZ2xlIChyZWN1cnNlLCB3b3JrLT5vcHRpb25zKTsKLQotICBpZiAocmVjdXJzZV9kZW0pCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCByZWN1cnNlX2RlbSk7Ci0gICAgICBmcmVlIChyZWN1cnNlX2RlbSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKHJlc3VsdCwgKm1hbmdsZWQsIG5hbWVsZW5ndGgpOwotICAgIH0KLSAgZnJlZSAocmVjdXJzZSk7Ci0gICptYW5nbGVkICs9IG5hbWVsZW5ndGg7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlhcm1fc3BlY2lhbCAtLSBzcGVjaWFsIGhhbmRsaW5nIG9mIEFSTS9sdWNpZCBtYW5nbGVkIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlhcm1fc3BlY2lhbCAoY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCSAgICAgc3RyaW5nICpkZWNscCk7Ci0KLQotREVTQ1JJUFRJT04KLQotCVByb2Nlc3Mgc29tZSBzcGVjaWFsIEFSTSBzdHlsZSBtYW5nbGluZyBmb3JtcyB0aGF0IGRvbid0IGZpdAotCXRoZSBub3JtYWwgcGF0dGVybi4gIEZvciBleGFtcGxlOgotCi0JCV9fdnRibF9fM2ZvbwkJKGZvbyB2aXJ0dWFsIHRhYmxlKQotCQlfX3Z0YmxfXzNmb29fXzNiYXIJKGJhcjo6Zm9vIHZpcnR1YWwgdGFibGUpCi0KLSAqLwotCi1zdGF0aWMgaW50Ci1hcm1fc3BlY2lhbCAobWFuZ2xlZCwgZGVjbHApCi0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpzY2FuOwotCi0gIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgQVJNX1ZUQUJMRV9TVFJJTkcsIEFSTV9WVEFCTEVfU1RSTEVOKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEZvdW5kIGEgQVJNIHN0eWxlIHZpcnR1YWwgdGFibGUsIGdldCBwYXN0IEFSTV9WVEFCTEVfU1RSSU5HCi0gICAgICAgICBhbmQgY3JlYXRlIHRoZSBkZWNsLiAgTm90ZSB0aGF0IHdlIGNvbnN1bWUgdGhlIGVudGlyZSBtYW5nbGVkCi0JIGlucHV0IHN0cmluZywgd2hpY2ggbWVhbnMgdGhhdCBkZW1hbmdsZV9zaWduYXR1cmUgaGFzIG5vIHdvcmsKLQkgdG8gZG8uICAqLwotICAgICAgc2NhbiA9ICptYW5nbGVkICsgQVJNX1ZUQUJMRV9TVFJMRU47Ci0gICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgICAgICAgIC8qIGZpcnN0IGNoZWNrIGl0IGNhbiBiZSBkZW1hbmdsZWQgKi8KLSAgICAgICAgewotICAgICAgICAgIG4gPSBjb25zdW1lX2NvdW50ICgmc2Nhbik7Ci0gICAgICAgICAgaWYgKG4gPT0gLTEpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKDApOyAgICAgICAgICAgLyogbm8gZ29vZCAqLwotCSAgICB9Ci0gICAgICAgICAgc2NhbiArPSBuOwotICAgICAgICAgIGlmIChzY2FuWzBdID09ICdfJyAmJiBzY2FuWzFdID09ICdfJykKLQkgICAgewotCSAgICAgIHNjYW4gKz0gMjsKLQkgICAgfQotICAgICAgICB9Ci0gICAgICAoKm1hbmdsZWQpICs9IEFSTV9WVEFCTEVfU1RSTEVOOwotICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAhPSAnXDAnKQotCXsKLQkgIG4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgICAgICBpZiAobiA9PSAtMQotCSAgICAgIHx8IG4gPiBzdHJsZW4gKCptYW5nbGVkKSkKLQkgICAgcmV0dXJuIDA7Ci0JICBzdHJpbmdfcHJlcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0JICAoKm1hbmdsZWQpICs9IG47Ci0JICBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycgJiYgKCptYW5nbGVkKVsxXSA9PSAnXycpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsICI6OiIpOwotCSAgICAgICgqbWFuZ2xlZCkgKz0gMjsKLQkgICAgfQotCX0KLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiIHZpcnR1YWwgdGFibGUiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9xdWFsaWZpZWQgLS0gZGVtYW5nbGUgJ1EnIHF1YWxpZmllZCBuYW1lIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9xdWFsaWZpZWQgKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKm1hbmdsZWQsCi0JCQkgICAgc3RyaW5nICpyZXN1bHQsIGludCBpc2Z1bmNuYW1lLCBpbnQgYXBwZW5kKTsKLQotREVTQ1JJUFRJT04KLQotCURlbWFuZ2xlIGEgcXVhbGlmaWVkIG5hbWUsIHN1Y2ggYXMgIlEyNU91dGVyNUlubmVyIiB3aGljaCBpcwotCXRoZSBtYW5nbGVkIGZvcm0gb2YgIk91dGVyOjpJbm5lciIuICBUaGUgZGVtYW5nbGVkIG91dHB1dCBpcwotCXByZXBlbmRlZCBvciBhcHBlbmRlZCB0byB0aGUgcmVzdWx0IHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlCi0Jc3RhdGUgb2YgdGhlIGFwcGVuZCBmbGFnLgotCi0JSWYgaXNmdW5jbmFtZSBpcyBub256ZXJvLCB0aGVuIHRoZSBxdWFsaWZpZWQgbmFtZSB3ZSBhcmUgYnVpbGRpbmcKLQlpcyBnb2luZyB0byBiZSB1c2VkIGFzIGEgbWVtYmVyIGZ1bmN0aW9uIG5hbWUsIHNvIGlmIGl0IGlzIGEKLQljb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGZ1bmN0aW9uLCBhcHBlbmQgYW4gYXBwcm9wcmlhdGUKLQljb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUuICBJLkUuIGZvciB0aGUgYWJvdmUgZXhhbXBsZSwKLQl0aGUgcmVzdWx0IGZvciB1c2UgYXMgYSBjb25zdHJ1Y3RvciBpcyAiT3V0ZXI6OklubmVyOjpJbm5lciIKLQlhbmQgdGhlIHJlc3VsdCBmb3IgdXNlIGFzIGEgZGVzdHJ1Y3RvciBpcyAiT3V0ZXI6OklubmVyOjp+SW5uZXIiLgotCi1CVUdTCi0KLQlOdW1lcmljIGNvbnZlcnNpb24gaXMgQVNDSUkgZGVwZW5kZW50IChGSVhNRSkuCi0KLSAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCwgaXNmdW5jbmFtZSwgYXBwZW5kKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotICAgICBpbnQgaXNmdW5jbmFtZTsKLSAgICAgaW50IGFwcGVuZDsKLXsKLSAgaW50IHF1YWxpZmllcnMgPSAwOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNoYXIgbnVtWzJdOwotICBzdHJpbmcgdGVtcDsKLSAgc3RyaW5nIGxhc3RfbmFtZTsKLSAgaW50IGJpbmRleCA9IHJlZ2lzdGVyX0J0eXBlICh3b3JrKTsKLQotICAvKiBXZSBvbmx5IG1ha2UgdXNlIG9mIElTRlVOQ05BTUUgaWYgdGhlIGVudGl0eSBpcyBhIGNvbnN0cnVjdG9yIG9yCi0gICAgIGRlc3RydWN0b3IuICAqLwotICBpc2Z1bmNuYW1lID0gKGlzZnVuY25hbWUKLQkJJiYgKCh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpIHx8ICh3b3JrLT5kZXN0cnVjdG9yICYgMSkpKTsKLQotICBzdHJpbmdfaW5pdCAoJnRlbXApOwotICBzdHJpbmdfaW5pdCAoJmxhc3RfbmFtZSk7Ci0KLSAgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ0snKQotICAgIHsKLSAgICAvKiBTcXVhbmdsaW5nIHF1YWxpZmllZCBuYW1lIHJldXNlICovCi0gICAgICBpbnQgaWR4OwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgIGlmIChpZHggPT0gLTEgfHwgaWR4ID49IHdvcmsgLT4gbnVtaykKLSAgICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0gICAgICAgIHN0cmluZ19hcHBlbmQgKCZ0ZW1wLCB3b3JrIC0+IGt0eXBldmVjW2lkeF0pOwotICAgIH0KLSAgZWxzZQotICAgIHN3aXRjaCAoKCptYW5nbGVkKVsxXSkKLSAgICB7Ci0gICAgY2FzZSAnXyc6Ci0gICAgICAvKiBHTlUgbWFuZ2xlZCBuYW1lIHdpdGggbW9yZSB0aGFuIDkgY2xhc3Nlcy4gIFRoZSBjb3VudCBpcyBwcmVjZWRlZAotCSBieSBhbiB1bmRlcnNjb3JlICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSA8PSA5IGNhc2UpIGFuZCBmb2xsb3dlZAotCSBieSBhbiB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIHAgPSAqbWFuZ2xlZCArIDI7Ci0gICAgICBxdWFsaWZpZXJzID0gYXRvaSAocCk7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSpwKSB8fCAqcCA9PSAnMCcpCi0Jc3VjY2VzcyA9IDA7Ci0KLSAgICAgIC8qIFNraXAgdGhlIGRpZ2l0cy4gICovCi0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKnApKQotCSsrcDsKLQotICAgICAgaWYgKCpwICE9ICdfJykKLQlzdWNjZXNzID0gMDsKLQotICAgICAgKm1hbmdsZWQgPSBwICsgMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICAvKiBUaGUgY291bnQgaXMgaW4gYSBzaW5nbGUgZGlnaXQuICAqLwotICAgICAgbnVtWzBdID0gKCptYW5nbGVkKVsxXTsKLSAgICAgIG51bVsxXSA9ICdcMCc7Ci0gICAgICBxdWFsaWZpZXJzID0gYXRvaSAobnVtKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgYW4gdW5kZXJzY29yZSBhZnRlciB0aGUgZGlnaXQsIHNraXAgaXQuICBUaGlzIGlzCi0JIHNhaWQgdG8gYmUgZm9yIEFSTS1xdWFsaWZpZWQgbmFtZXMsIGJ1dCB0aGUgQVJNIG1ha2VzIG5vCi0JIG1lbnRpb24gb2Ygc3VjaCBhbiB1bmRlcnNjb3JlLiAgUGVyaGFwcyBjZnJvbnQgdXNlcyBvbmUuICAqLwotICAgICAgaWYgKCgqbWFuZ2xlZClbMl0gPT0gJ18nKQotCXsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICAoKm1hbmdsZWQpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgIGRlZmF1bHQ6Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0KLSAgaWYgKCFzdWNjZXNzKQotICAgIHJldHVybiBzdWNjZXNzOwotCi0gIC8qIFBpY2sgb2ZmIHRoZSBuYW1lcyBhbmQgY29sbGVjdCB0aGVtIGluIHRoZSB0ZW1wIGJ1ZmZlciBpbiB0aGUgb3JkZXIKLSAgICAgaW4gd2hpY2ggdGhleSBhcmUgZm91bmQsIHNlcGFyYXRlZCBieSAnOjonLiAgKi8KLQotICB3aGlsZSAocXVhbGlmaWVycy0tID4gMCkKLSAgICB7Ci0gICAgICBpbnQgcmVtZW1iZXJfSyA9IDE7Ci0gICAgICBzdHJpbmdfY2xlYXIgKCZsYXN0X25hbWUpOwotCi0gICAgICBpZiAoKm1hbmdsZWRbMF0gPT0gJ18nKQotCSgqbWFuZ2xlZCkrKzsKLQotICAgICAgaWYgKCptYW5nbGVkWzBdID09ICd0JykKLQl7Ci0JICAvKiBIZXJlIHdlIGFsd2F5cyBhcHBlbmQgdG8gVEVNUCBzaW5jZSB3ZSB3aWxsIHdhbnQgdG8gdXNlCi0JICAgICB0aGUgdGVtcGxhdGUgbmFtZSB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFzIGEKLQkgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZS4gIFRoZSBhcHByb3ByaWF0ZQotCSAgICAgKHBhcmFtZXRlci1sZXNzKSB2YWx1ZSBpcyByZXR1cm5lZCBieSBkZW1hbmdsZV90ZW1wbGF0ZQotCSAgICAgaW4gTEFTVF9OQU1FLiAgV2UgZG8gbm90IHJlbWVtYmVyIHRoZSB0ZW1wbGF0ZSB0eXBlIGhlcmUsCi0JICAgICBpbiBvcmRlciB0byBtYXRjaCB0aGUgRysrIG1hbmdsaW5nIGFsZ29yaXRobS4gICovCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUod29yaywgbWFuZ2xlZCwgJnRlbXAsCi0JCQkJICAgICAgJmxhc3RfbmFtZSwgMSwgMCk7Ci0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKCptYW5nbGVkWzBdID09ICdLJykKLQl7Ci0gICAgICAgICAgaW50IGlkeDsKLSAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgICAgICBpZiAoaWR4ID09IC0xIHx8IGlkeCA+PSB3b3JrLT5udW1rKQotICAgICAgICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIHdvcmstPmt0eXBldmVjW2lkeF0pOwotICAgICAgICAgIHJlbWVtYmVyX0sgPSAwOwotCi0JICBpZiAoIXN1Y2Nlc3MpIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoRURHX0RFTUFOR0xJTkcpCi0gICAgICAgICAgICB7Ci0JICAgICAgaW50IG5hbWVsZW5ndGg7Ci0gCSAgICAgIC8qIE5vdyByZWN1cnNpdmVseSBkZW1hbmdsZSB0aGUgcXVhbGlmaWVyCi0gCSAgICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGRlYWwgd2l0aCB0ZW1wbGF0ZXMgaW4KLSAJICAgICAgICogbWFuZ2xpbmcgc3R5bGVzIGxpa2UgRURHICovCi0JICAgICAgbmFtZWxlbmd0aCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgICAgIGlmIChuYW1lbGVuZ3RoID09IC0xKQotCQl7Ci0JCSAgc3VjY2VzcyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCX0KLSAJICAgICAgcmVjdXJzaXZlbHlfZGVtYW5nbGUod29yaywgbWFuZ2xlZCwgJnRlbXAsIG5hbWVsZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZsYXN0X25hbWUpOwotICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRzICgmdGVtcCwgJmxhc3RfbmFtZSk7Ci0gICAgICAgICAgICB9Ci0JfQotCi0gICAgICBpZiAocmVtZW1iZXJfSykKLQlyZW1lbWJlcl9LdHlwZSAod29yaywgdGVtcC5iLCBMRU5fU1RSSU5HICgmdGVtcCkpOwotCi0gICAgICBpZiAocXVhbGlmaWVycyA+IDApCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgIH0KLQotICByZW1lbWJlcl9CdHlwZSAod29yaywgdGVtcC5iLCBMRU5fU1RSSU5HICgmdGVtcCksIGJpbmRleCk7Ci0KLSAgLyogSWYgd2UgYXJlIHVzaW5nIHRoZSByZXN1bHQgYXMgYSBmdW5jdGlvbiBuYW1lLCB3ZSBuZWVkIHRvIGFwcGVuZAotICAgICB0aGUgYXBwcm9wcmlhdGUgJzo6JyBzZXBhcmF0ZWQgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLgotICAgICBXZSBkbyB0aGlzIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBtb3N0IGNvbnZlbmllbnQgcGxhY2UsIHdoZXJlCi0gICAgIHdlIGFscmVhZHkgaGF2ZSBhIHBvaW50ZXIgdG8gdGhlIG5hbWUgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUuICAqLwotCi0gIGlmIChpc2Z1bmNuYW1lKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKCZ0ZW1wLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLSAgICAgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQotCXN0cmluZ19hcHBlbmQgKCZ0ZW1wLCAifiIpOwotICAgICAgc3RyaW5nX2FwcGVuZHMgKCZ0ZW1wLCAmbGFzdF9uYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IGVpdGhlciBwcmVwZW5kIHRoZSB0ZW1wIGJ1ZmZlciB0byB0aGUgcmVzdWx0LCBvciBhcHBlbmQgaXQsCi0gICAgIGRlcGVuZGluZyB1cG9uIHRoZSBzdGF0ZSBvZiB0aGUgYXBwZW5kIGZsYWcuICAqLwotCi0gIGlmIChhcHBlbmQpCi0gICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJnRlbXApOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKHJlc3VsdCkpCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgc3RyaW5nX3ByZXBlbmRzIChyZXN1bHQsICZ0ZW1wKTsKLSAgICB9Ci0KLSAgc3RyaW5nX2RlbGV0ZSAoJmxhc3RfbmFtZSk7Ci0gIHN0cmluZ19kZWxldGUgKCZ0ZW1wKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWdldF9jb3VudCAtLSBjb252ZXJ0IGFuIGFzY2lpIGNvdW50IHRvIGludGVnZXIsIGNvbnN1bWluZyB0b2tlbnMKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlnZXRfY291bnQgKGNvbnN0IGNoYXIgKip0eXBlLCBpbnQgKmNvdW50KQotCi1ERVNDUklQVElPTgotCi0JQXNzdW1lIHRoYXQgKnR5cGUgcG9pbnRzIGF0IGEgY291bnQgaW4gYSBtYW5nbGVkIG5hbWU7IHNldAotCSpjb3VudCB0byBpdHMgdmFsdWUsIGFuZCBzZXQgKnR5cGUgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyCi0JdGhlIGNvdW50LiAgVGhlcmUgYXJlIHNvbWUgd2VpcmQgcnVsZXMgaW4gZWZmZWN0IGhlcmUuCi0KLQlJZiAqdHlwZSBkb2VzIG5vdCBwb2ludCBhdCBhIHN0cmluZyBvZiBkaWdpdHMsIHJldHVybiB6ZXJvLgotCi0JSWYgKnR5cGUgcG9pbnRzIGF0IGEgc3RyaW5nIG9mIGRpZ2l0cyBmb2xsb3dlZCBieSBhbgotCXVuZGVyc2NvcmUsIHNldCAqY291bnQgdG8gdGhlaXIgdmFsdWUgYXMgYW4gaW50ZWdlciwgYWR2YW5jZQotCSp0eXBlIHRvIHBvaW50ICphZnRlciB0aGUgdW5kZXJzY29yZSwgYW5kIHJldHVybiAxLgotCi0JSWYgKnR5cGUgcG9pbnRzIGF0IGEgc3RyaW5nIG9mIGRpZ2l0cyBub3QgZm9sbG93ZWQgYnkgYW4KLQl1bmRlcnNjb3JlLCBjb25zdW1lIG9ubHkgdGhlIGZpcnN0IGRpZ2l0LiAgU2V0ICpjb3VudCB0byBpdHMKLQl2YWx1ZSBhcyBhbiBpbnRlZ2VyLCBsZWF2ZSAqdHlwZSBwb2ludGluZyBhZnRlciB0aGF0IGRpZ2l0LAotCWFuZCByZXR1cm4gMS4KLQotICAgICAgICBUaGUgZXhjdXNlIGZvciB0aGlzIG9kZCBiZWhhdmlvcjogaW4gdGhlIEFSTSBhbmQgSFAgZGVtYW5nbGluZwotICAgICAgICBzdHlsZXMsIGEgdHlwZSBjYW4gYmUgZm9sbG93ZWQgYnkgYSByZXBlYXQgY291bnQgb2YgdGhlIGZvcm0KLSAgICAgICAgYE54eScsIHdoZXJlOgotCi0gICAgICAgIGB4JyBpcyBhIHNpbmdsZSBkaWdpdCBzcGVjaWZ5aW5nIGhvdyBtYW55IGFkZGl0aW9uYWwgY29waWVzCi0gICAgICAgICAgICBvZiB0aGUgdHlwZSB0byBhcHBlbmQgdG8gdGhlIGFyZ3VtZW50IGxpc3QsIGFuZAotCi0gICAgICAgIGB5JyBpcyBvbmUgb3IgbW9yZSBkaWdpdHMsIHNwZWNpZnlpbmcgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YKLSAgICAgICAgICAgIHRoZSBmaXJzdCByZXBlYXRlZCBhcmd1bWVudCBpbiB0aGUgbGlzdC4gIFllcywgYXMgeW91J3JlCi0gICAgICAgICAgICB1bm1hbmdsaW5nIHRoZSBuYW1lIHlvdSBjYW4gZmlndXJlIHRoaXMgb3V0IHlvdXJzZWxmLCBidXQKLSAgICAgICAgICAgIGl0J3MgdGhlcmUgYW55d2F5LgotCi0gICAgICAgIFNvLCBmb3IgZXhhbXBsZSwgaW4gYGJhcl9fM2Zvb0ZQaU41MScsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gaW50ZWdlciAoYFBpJyksIGFuZCB0aGVuIHRoZSBuZXh0IGZpdmUgYXJndW1lbnRzCi0gICAgICAgIGFyZSB0aGUgc2FtZSAoYE41JyksIGFuZCB0aGUgZmlyc3QgcmVwZWF0IGlzIHRoZSBmdW5jdGlvbidzCi0gICAgICAgIHNlY29uZCBhcmd1bWVudCAoYDEnKS4KLSovCi0KLXN0YXRpYyBpbnQKLWdldF9jb3VudCAodHlwZSwgY291bnQpCi0gICAgIGNvbnN0IGNoYXIgKip0eXBlOwotICAgICBpbnQgKmNvdW50OwotewotICBjb25zdCBjaGFyICpwOwotICBpbnQgbjsKLQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0gICAgewotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqY291bnQgPSAqKnR5cGUgLSAnMCc7Ci0gICAgICAoKnR5cGUpKys7Ci0gICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLQl7Ci0JICBwID0gKnR5cGU7Ci0JICBuID0gKmNvdW50OwotCSAgZG8KLQkgICAgewotCSAgICAgIG4gKj0gMTA7Ci0JICAgICAgbiArPSAqcCAtICcwJzsKLQkgICAgICBwKys7Ci0JICAgIH0KLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqcCkpOwotCSAgaWYgKCpwID09ICdfJykKLQkgICAgewotCSAgICAgICp0eXBlID0gcCArIDE7Ci0JICAgICAgKmNvdW50ID0gbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAoMSk7Ci19Ci0KLS8qIFJFU1VMVCB3aWxsIGJlIGluaXRpYWxpc2VkIGhlcmU7IGl0IHdpbGwgYmUgZnJlZWQgb24gZmFpbHVyZS4gIFRoZQotICAgdmFsdWUgcmV0dXJuZWQgaXMgcmVhbGx5IGEgdHlwZV9raW5kX3QuICAqLwotCi1zdGF0aWMgaW50Ci1kb190eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIGludCBuOwotICBpbnQgZG9uZTsKLSAgaW50IHN1Y2Nlc3M7Ci0gIHN0cmluZyBkZWNsOwotICBjb25zdCBjaGFyICpyZW1lbWJlcmVkX3R5cGU7Ci0gIGludCB0eXBlX3F1YWxzOwotICBzdHJpbmcgYnR5cGU7Ci0gIHR5cGVfa2luZF90IHRrID0gdGtfbm9uZTsKLQotICBzdHJpbmdfaW5pdCAoJmJ0eXBlKTsKLSAgc3RyaW5nX2luaXQgKCZkZWNsKTsKLSAgc3RyaW5nX2luaXQgKHJlc3VsdCk7Ci0KLSAgZG9uZSA9IDA7Ci0gIHN1Y2Nlc3MgPSAxOwotICB3aGlsZSAoc3VjY2VzcyAmJiAhZG9uZSkKLSAgICB7Ci0gICAgICBpbnQgbWVtYmVyOwotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCi0JICAvKiBBIHBvaW50ZXIgdHlwZSAqLwotCWNhc2UgJ1AnOgotCWNhc2UgJ3AnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgaWYgKCEgKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfSkFWQSkpCi0JICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIioiKTsKLQkgIGlmICh0ayA9PSB0a19ub25lKQotCSAgICB0ayA9IHRrX3BvaW50ZXI7Ci0JICBicmVhazsKLQotCSAgLyogQSByZWZlcmVuY2UgdHlwZSAqLwotCWNhc2UgJ1InOgotCSAgKCptYW5nbGVkKSsrOwotCSAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiJiIpOwotCSAgaWYgKHRrID09IHRrX25vbmUpCi0JICAgIHRrID0gdGtfcmVmZXJlbmNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIEFuIGFycmF5ICovCi0JY2FzZSAnQSc6Ci0JICB7Ci0JICAgICsrKCptYW5nbGVkKTsKLQkgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKQotCQkmJiAoZGVjbC5iWzBdID09ICcqJyB8fCBkZWNsLmJbMF0gPT0gJyYnKSkKLQkgICAgICB7Ci0JCXN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKLQkJc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7Ci0JICAgICAgfQotCSAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIlsiKTsKLQkgICAgaWYgKCoqbWFuZ2xlZCAhPSAnXycpCi0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsICZkZWNsLAotCQkJCQkJICAgICAgdGtfaW50ZWdyYWwpOwotCSAgICBpZiAoKiptYW5nbGVkID09ICdfJykKLQkgICAgICArKygqbWFuZ2xlZCk7Ci0JICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiXSIpOwotCSAgICBicmVhazsKLQkgIH0KLQotCS8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IHNlZW4gdHlwZSAqLwotCWNhc2UgJ1QnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZuKSB8fCBuID49IHdvcmsgLT4gbnR5cGVzKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbWVtYmVyZWRfdHlwZSA9IHdvcmsgLT4gdHlwZXZlY1tuXTsKLQkgICAgICBtYW5nbGVkID0gJnJlbWVtYmVyZWRfdHlwZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkgIC8qIEEgZnVuY3Rpb24gKi8KLQljYXNlICdGJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKQotCQkmJiAoZGVjbC5iWzBdID09ICcqJyB8fCBkZWNsLmJbMF0gPT0gJyYnKSkKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKLQkgICAgfQotCSAgLyogQWZ0ZXIgcGlja2luZyBvZmYgdGhlIGZ1bmN0aW9uIGFyZ3MsIHdlIGV4cGVjdCB0byBlaXRoZXIgZmluZCB0aGUKLQkgICAgIGZ1bmN0aW9uIHJldHVybiB0eXBlIChwcmVjZWRlZCBieSBhbiAnXycpIG9yIHRoZSBlbmQgb2YgdGhlCi0JICAgICBzdHJpbmcuICAqLwotCSAgaWYgKCFkZW1hbmdsZV9uZXN0ZWRfYXJncyAod29yaywgbWFuZ2xlZCwgJmRlY2wpCi0JICAgICAgfHwgKCoqbWFuZ2xlZCAhPSAnXycgJiYgKiptYW5nbGVkICE9ICdcMCcpKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChzdWNjZXNzICYmICgqKm1hbmdsZWQgPT0gJ18nKSkKLQkgICAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0KLQljYXNlICdNJzoKLQljYXNlICdPJzoKLQkgIHsKLQkgICAgdHlwZV9xdWFscyA9IFRZUEVfVU5RVUFMSUZJRUQ7Ci0KLQkgICAgbWVtYmVyID0gKiptYW5nbGVkID09ICdNJzsKLQkgICAgKCptYW5nbGVkKSsrOwotCSAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkgJiYgKiptYW5nbGVkICE9ICd0JykKLQkgICAgICB7Ci0JCXN1Y2Nlc3MgPSAwOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7Ci0JICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0JICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCSAgICAgIHsKLQkJbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCQlpZiAobiA9PSAtMQotCQkgICAgfHwgKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPCBuKQotCQkgIHsKLQkJICAgIHN1Y2Nlc3MgPSAwOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQlzdHJpbmdfcHJlcGVuZG4gKCZkZWNsLCAqbWFuZ2xlZCwgbik7Ci0JCSptYW5nbGVkICs9IG47Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzdHJpbmcgdGVtcDsKLQkJc3RyaW5nX2luaXQgKCZ0ZW1wKTsKLQkJc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCwKLQkJCQkJICAgICBOVUxMLCAxLCAxKTsKLQkJaWYgKHN1Y2Nlc3MpCi0JCSAgewotCQkgICAgc3RyaW5nX3ByZXBlbmRuICgmZGVjbCwgdGVtcC5iLCB0ZW1wLnAgLSB0ZW1wLmIpOwotCQkgICAgc3RyaW5nX2NsZWFyICgmdGVtcCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIoIik7Ci0JICAgIGlmIChtZW1iZXIpCi0JICAgICAgewotCQlzd2l0Y2ggKCoqbWFuZ2xlZCkKLQkJICB7Ci0JCSAgY2FzZSAnQyc6Ci0JCSAgY2FzZSAnVic6Ci0JCSAgY2FzZSAndSc6Ci0JCSAgICB0eXBlX3F1YWxzIHw9IGNvZGVfZm9yX3F1YWxpZmllciAoKiptYW5nbGVkKTsKLQkJICAgICgqbWFuZ2xlZCkrKzsKLQkJICAgIGJyZWFrOwotCi0JCSAgZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQlpZiAoKigqbWFuZ2xlZCkrKyAhPSAnRicpCi0JCSAgewotCQkgICAgc3VjY2VzcyA9IDA7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoKG1lbWJlciAmJiAhZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsICZkZWNsKSkKLQkJfHwgKiptYW5nbGVkICE9ICdfJykKLQkgICAgICB7Ci0JCXN1Y2Nlc3MgPSAwOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgaWYgKCEgUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQotCSAgICAgIHsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAodHlwZV9xdWFscyAhPSBUWVBFX1VOUVVBTElGSUVEKQotCSAgICAgIHsKLQkJQVBQRU5EX0JMQU5LICgmZGVjbCk7Ci0JCXN0cmluZ19hcHBlbmQgKCZkZWNsLCBxdWFsaWZpZXJfc3RyaW5nICh0eXBlX3F1YWxzKSk7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIH0KLSAgICAgICAgY2FzZSAnRyc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ3UnOgotCSAgaWYgKFBSSU5UX0FOU0lfUVVBTElGSUVSUykKLQkgICAgewotCSAgICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkpCi0JCXN0cmluZ19wcmVwZW5kICgmZGVjbCwgIiAiKTsKLQotCSAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgZGVtYW5nbGVfcXVhbGlmaWVyICgqKm1hbmdsZWQpKTsKLQkgICAgfQotCSAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0JICAvKgotCSAgICB9Ci0JICAgICovCi0KLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JICBkb25lID0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKHN1Y2Nlc3MpIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICAgIC8qIEEgcXVhbGlmaWVkIG5hbWUsIHN1Y2ggYXMgIk91dGVyOjpJbm5lciIuICAqLwotICAgIGNhc2UgJ1EnOgotICAgIGNhc2UgJ0snOgotICAgICAgewotICAgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCByZXN1bHQsIDAsIDEpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIC8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IHNlZW4gc3F1YW5nbGVkIHR5cGUgKi8KLSAgICBjYXNlICdCJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmbikgfHwgbiA+PSB3b3JrIC0+IG51bWIpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0Jc3RyaW5nX2FwcGVuZCAocmVzdWx0LCB3b3JrLT5idHlwZXZlY1tuXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ1knOgotICAgICAgLyogQSB0ZW1wbGF0ZSBwYXJtLiAgV2Ugc3Vic3RpdHV0ZSB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudC4gKi8KLSAgICAgIHsKLQlpbnQgaWR4OwotCi0JKCptYW5nbGVkKSsrOwotCWlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0KLQlpZiAoaWR4ID09IC0xCi0JICAgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKLQkgICAgfHwgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKSA9PSAtMSkKLQkgIHsKLQkgICAgc3VjY2VzcyA9IDA7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JaWYgKHdvcmstPnRtcGxfYXJndmVjKQotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQllbHNlCi0JICB7Ci0JICAgIGNoYXIgYnVmWzEwXTsKLQkgICAgc3ByaW50ZihidWYsICJUJWQiLCBpZHgpOwotCSAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGJ1Zik7Ci0JICB9Ci0KLQlzdWNjZXNzID0gMTsKLSAgICAgIH0KLSAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzdWNjZXNzID0gZGVtYW5nbGVfZnVuZF90eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpOwotICAgICAgaWYgKHRrID09IHRrX25vbmUpCi0JdGsgPSAodHlwZV9raW5kX3QpIHN1Y2Nlc3M7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHN1Y2Nlc3MpCi0gICAgewotICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICIgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmZGVjbCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHN0cmluZ19kZWxldGUgKHJlc3VsdCk7Ci0gIHN0cmluZ19kZWxldGUgKCZkZWNsKTsKLQotICBpZiAoc3VjY2VzcykKLSAgICAvKiBBc3N1bWUgYW4gaW50ZWdyYWwgdHlwZSwgaWYgd2UncmUgbm90IHN1cmUuICAqLwotICAgIHJldHVybiAoaW50KSAoKHRrID09IHRrX25vbmUpID8gdGtfaW50ZWdyYWwgOiB0ayk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogR2l2ZW4gYSBwb2ludGVyIHRvIGEgdHlwZSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgZnVuZGFtZW50YWwgdHlwZQotICAgYXJndW1lbnQgKGludCwgbG9uZywgdW5zaWduZWQgaW50LCBldGMpIGluIFRZUEUsIGEgcG9pbnRlciB0byB0aGUKLSAgIHN0cmluZyBpbiB3aGljaCB0aGUgZGVtYW5nbGVkIG91dHB1dCBpcyBiZWluZyBidWlsdCBpbiBSRVNVTFQsIGFuZAotICAgdGhlIFdPUksgc3RydWN0dXJlLCBkZWNvZGUgdGhlIHR5cGVzIGFuZCBhZGQgdGhlbSB0byB0aGUgcmVzdWx0LgotCi0gICBGb3IgZXhhbXBsZToKLQotICAgCSJDaSIJPT4JImNvbnN0IGludCIKLQkiU2wiCT0+CSJzaWduZWQgbG9uZyIKLQkiQ1VzIgk9PgkiY29uc3QgdW5zaWduZWQgc2hvcnQiCi0KLSAgIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyByZWFsbHkgYSB0eXBlX2tpbmRfdC4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgZG9uZSA9IDA7Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY2hhciBidWZbMTBdOwotICBpbnQgZGVjID0gMDsKLSAgc3RyaW5nIGJ0eXBlOwotICB0eXBlX2tpbmRfdCB0ayA9IHRrX2ludGVncmFsOwotCi0gIHN0cmluZ19pbml0ICgmYnR5cGUpOwotCi0gIC8qIEZpcnN0IHBpY2sgb2ZmIGFueSB0eXBlIHF1YWxpZmllcnMuICBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZS4gICovCi0KLSAgd2hpbGUgKCFkb25lKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdDJzoKLQljYXNlICdWJzoKLQljYXNlICd1JzoKLQkgIGlmIChQUklOVF9BTlNJX1FVQUxJRklFUlMpCi0JICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKHJlc3VsdCwgIiAiKTsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAocmVzdWx0LCBkZW1hbmdsZV9xdWFsaWZpZXIgKCoqbWFuZ2xlZCkpOwotCSAgICB9Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQljYXNlICdVJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInVuc2lnbmVkIik7Ci0JICBicmVhazsKLQljYXNlICdTJzogLyogc2lnbmVkIGNoYXIgb25seSAqLwotCSAgKCptYW5nbGVkKSsrOwotCSAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAic2lnbmVkIik7Ci0JICBicmVhazsKLQljYXNlICdKJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIl9fY29tcGxleCIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRvbmUgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgcGljayBvZmYgdGhlIGZ1bmRhbWVudGFsIHR5cGUuICBUaGVyZSBjYW4gYmUgb25seSBvbmUuICAqLwotCi0gIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgY2FzZSAnXyc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd2JzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInZvaWQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3gnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAibG9uZyBsb25nIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdsJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiaW50Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInNob3J0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImJvb2wiKTsKLSAgICAgIHRrID0gdGtfYm9vbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiY2hhciIpOwotICAgICAgdGsgPSB0a19jaGFyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJ3Y2hhcl90Iik7Ci0gICAgICB0ayA9IHRrX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdyJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmcgZG91YmxlIik7Ci0gICAgICB0ayA9IHRrX3JlYWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImRvdWJsZSIpOwotICAgICAgdGsgPSB0a19yZWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJmbG9hdCIpOwotICAgICAgdGsgPSB0a19yZWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JewotCSAgc3VjY2VzcyA9IDA7Ci0JICBicmVhazsKLQl9Ci0gICAgY2FzZSAnSSc6Ci0gICAgICArKygqbWFuZ2xlZCk7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdfJykKLQl7Ci0JICBpbnQgaTsKLQkgICsrKCptYW5nbGVkKTsKLQkgIGZvciAoaSA9IDA7Ci0JICAgICAgIChpIDwgc2l6ZW9mIChidWYpIC0gMSAmJiAqKm1hbmdsZWQgJiYgKiptYW5nbGVkICE9ICdfJyk7Ci0JICAgICAgICsrKCptYW5nbGVkKSwgKytpKQotCSAgICBidWZbaV0gPSAqKm1hbmdsZWQ7Ci0JICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBidWZbaV0gPSAnXDAnOwotCSAgKysoKm1hbmdsZWQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJuY3B5IChidWYsICptYW5nbGVkLCAyKTsKLQkgIGJ1ZlsyXSA9ICdcMCc7Ci0JICAqbWFuZ2xlZCArPSAyOwotCX0KLSAgICAgIHNzY2FuZiAoYnVmLCAiJXgiLCAmZGVjKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgImludCVpX3QiLCBkZWMpOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCBidWYpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgLyogQW4gZXhwbGljaXQgdHlwZSwgc3VjaCBhcyAiNm15dHlwZSIgb3IgIjdpbnRlZ2VyIiAqLwotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgewotICAgICAgICBpbnQgYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICAgICAgICBzdHJpbmcgYnR5cGU7Ci0gICAgICAgIHN0cmluZ19pbml0ICgmYnR5cGUpOwotICAgICAgICBpZiAoZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgJmJ0eXBlKSkgewotICAgICAgICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCBidHlwZS5iLCBMRU5fU1RSSU5HICgmYnR5cGUpLCBiaW5kZXgpOwotICAgICAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmYnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgICAgc3RyaW5nX2RlbGV0ZSAoJmJ0eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSAndCc6Ci0gICAgICB7Ci0gICAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJmJ0eXBlLCAwLCAxLCAxKTsKLSAgICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJmJ0eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzID8gKChpbnQpIHRrKSA6IDA7Ci19Ci0KLQotLyogSGFuZGxlIGEgdGVtcGxhdGUncyB2YWx1ZSBwYXJhbWV0ZXIgZm9yIEhQIGFDQyAoZXh0ZW5zaW9uIGZyb20gQVJNKQotICAgKiptYW5nbGVkIHBvaW50cyB0byAnUycgb3IgJ1UnICovCi0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIGludCB1bnNpZ25lZF9jb25zdDsKLQotICBpZiAoKiptYW5nbGVkICE9ICdVJyAmJiAqKm1hbmdsZWQgIT0gJ1MnKQotICAgIHJldHVybiAwOwotCi0gIHVuc2lnbmVkX2NvbnN0ID0gKCoqbWFuZ2xlZCA9PSAnVScpOwotCi0gICgqbWFuZ2xlZCkrKzsKLQotICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLSAgICB7Ci0gICAgICBjYXNlICdOJzoKLSAgICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiLSIpOwotICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgJ1AnOgotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnTSc6Ci0gICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgLTJeMzEgKi8KLSAgICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiLTIxNDc0ODM2NDgiKTsKLSAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBXZSBoYXZlIHRvIGJlIGxvb2tpbmcgYXQgYW4gaW50ZWdlciBub3cgKi8KLSAgaWYgKCEoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV2Ugb25seSBkZWFsIHdpdGggaW50ZWdyYWwgdmFsdWVzIGZvciB0ZW1wbGF0ZQotICAgICBwYXJhbWV0ZXJzIC0tIHNvIGl0J3MgT0sgdG8gbG9vayBvbmx5IGZvciBkaWdpdHMgKi8KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAqKm1hbmdsZWQ7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGNoYXJfc3RyKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0KLSAgaWYgKHVuc2lnbmVkX2NvbnN0KQotICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIlUiKTsKLQotICAvKiBGSVhNRT8gU29tZSBkYXkgd2UgbWF5IGhhdmUgNjQtYml0IChvciBsYXJnZXIgOi0pICkgY29uc3RhbnRzCi0gICAgIHdpdGggTCBvciBMTCBzdWZmaXhlcy4gcGFpLzE5OTctMDktMDMgKi8KLQotICByZXR1cm4gMTsgLyogc3VjY2VzcyAqLwotfQotCi0vKiBIYW5kbGUgYSB0ZW1wbGF0ZSdzIGxpdGVyYWwgcGFyYW1ldGVyIGZvciBIUCBhQ0MgKGV4dGVuc2lvbiBmcm9tIEFSTSkKLSAgICoqbWFuZ2xlZCBpcyBwb2ludGluZyB0byB0aGUgJ0EnICovCi0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IGxpdGVyYWxfbGVuID0gMDsKLSAgY2hhciAqIHJlY3Vyc2U7Ci0gIGNoYXIgKiByZWN1cnNlX2RlbTsKLQotICBpZiAoKiptYW5nbGVkICE9ICdBJykKLSAgICByZXR1cm4gMDsKLQotICAoKm1hbmdsZWQpKys7Ci0KLSAgbGl0ZXJhbF9sZW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQotICBpZiAobGl0ZXJhbF9sZW4gPD0gMCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBMaXRlcmFsIHBhcmFtZXRlcnMgYXJlIG5hbWVzIG9mIGFycmF5cywgZnVuY3Rpb25zLCBldGMuICBhbmQgdGhlCi0gICAgIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzIHRoZSBhZGRyZXNzIG9wZXJhdG9yICovCi0gIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIiYiKTsKLQotICAvKiBOb3cgcmVjdXJzaXZlbHkgZGVtYW5nbGUgdGhlIGxpdGVyYWwgbmFtZSAqLwotICByZWN1cnNlID0gKGNoYXIgKikgeG1hbGxvYyAobGl0ZXJhbF9sZW4gKyAxKTsKLSAgbWVtY3B5IChyZWN1cnNlLCAqbWFuZ2xlZCwgbGl0ZXJhbF9sZW4pOwotICByZWN1cnNlW2xpdGVyYWxfbGVuXSA9ICdcMDAwJzsKLQotICByZWN1cnNlX2RlbSA9IGNwbHVzX2RlbWFuZ2xlIChyZWN1cnNlLCB3b3JrLT5vcHRpb25zKTsKLQotICBpZiAocmVjdXJzZV9kZW0pCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCByZWN1cnNlX2RlbSk7Ci0gICAgICBmcmVlIChyZWN1cnNlX2RlbSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKHJlc3VsdCwgKm1hbmdsZWQsIGxpdGVyYWxfbGVuKTsKLSAgICB9Ci0gICgqbWFuZ2xlZCkgKz0gbGl0ZXJhbF9sZW47Ci0gIGZyZWUgKHJlY3Vyc2UpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1zbmFyZl9udW1lcmljX2xpdGVyYWwgKGFyZ3MsIGFyZykKLSAgICAgY29uc3QgY2hhciAqKiBhcmdzOwotICAgICBzdHJpbmcgKiBhcmc7Ci17Ci0gIGlmICgqKmFyZ3MgPT0gJy0nKQotICAgIHsKLSAgICAgIGNoYXJfc3RyWzBdID0gJy0nOwotICAgICAgc3RyaW5nX2FwcGVuZCAoYXJnLCBjaGFyX3N0cik7Ci0gICAgICAoKmFyZ3MpKys7Ci0gICAgfQotICBlbHNlIGlmICgqKmFyZ3MgPT0gJysnKQotICAgICgqYXJncykrKzsKLQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqYXJncykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqYXJncykpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAqKmFyZ3M7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChhcmcsIGNoYXJfc3RyKTsKLSAgICAgICgqYXJncykrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSBuZXh0IGFyZ3VtZW50LCBnaXZlbiBieSBNQU5HTEVEIGludG8gUkVTVUxULCB3aGljaAotICAgKnNob3VsZCBiZSBhbiB1bmluaXRpYWxpemVkKiBzdHJpbmcuICBJdCB3aWxsIGJlIGluaXRpYWxpemVkIGhlcmUsCi0gICBhbmQgZnJlZSdkIHNob3VsZCBhbnl0aGluZyBnbyB3cm9uZy4gICovCi0KLXN0YXRpYyBpbnQKLWRvX2FyZyAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICAvKiBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkIHNvIHRoYXQgd2UgY2FuIHJlY29yZCB0aGUgdHlwZSwgZm9yCi0gICAgIG5vbi1zcXVhbmdsaW5nIHR5cGUgcmVtZW1iZXJpbmcuICAqLwotICBjb25zdCBjaGFyICpzdGFydCA9ICptYW5nbGVkOwotCi0gIHN0cmluZ19pbml0IChyZXN1bHQpOwotCi0gIGlmICh3b3JrLT5ucmVwZWF0cyA+IDApCi0gICAgewotICAgICAgLS13b3JrLT5ucmVwZWF0czsKLQotICAgICAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID09IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIFdlIHdhbnQgdG8gcmVpc3N1ZSB0aGUgcHJldmlvdXMgdHlwZSBpbiB0aGlzIGFyZ3VtZW50IGxpc3QuICAqLwotICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgd29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ24nKQotICAgIHsKLSAgICAgIC8qIEEgc3F1YW5nbGluZy1zdHlsZSByZXBlYXQuICAqLwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgd29yay0+bnJlcGVhdHMgPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotCi0gICAgICBpZiAod29yay0+bnJlcGVhdHMgPD0gMCkKLQkvKiBUaGlzIHdhcyBub3QgYSByZXBlYXQgY291bnQgYWZ0ZXIgYWxsLiAgKi8KLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKHdvcmstPm5yZXBlYXRzID4gOSkKLQl7Ci0JICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgLyogVGhlIHJlcGVhdCBjb3VudCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gJ18nIGluIHRoaXMKLQkgICAgICAgY2FzZS4gICovCi0JICAgIHJldHVybiAwOwotCSAgZWxzZQotCSAgICAoKm1hbmdsZWQpKys7Ci0JfQotCi0gICAgICAvKiBOb3csIHRoZSByZXBlYXQgaXMgYWxsIHNldCB1cC4gICovCi0gICAgICByZXR1cm4gZG9fYXJnICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpOwotICAgIH0KLQotICAvKiBTYXZlIHRoZSByZXN1bHQgaW4gV09SSy0+cHJldmlvdXNfYXJndW1lbnQgc28gdGhhdCB3ZSBjYW4gZmluZCBpdAotICAgICBpZiBpdCdzIHJlcGVhdGVkLiAgTm90ZSB0aGF0IHNhdmluZyBTVEFSVCBpcyBub3QgZ29vZCBlbm91Z2g6IHdlCi0gICAgIGRvIG5vdCB3YW50IHRvIGFkZCBhZGRpdGlvbmFsIHR5cGVzIHRvIHRoZSBiYWNrLXJlZmVyZW5jZWFibGUKLSAgICAgdHlwZSB2ZWN0b3Igd2hlbiBwcm9jZXNzaW5nIGEgcmVwZWF0ZWQgdHlwZS4gICovCi0gIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKLSAgICBzdHJpbmdfY2xlYXIgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gKHN0cmluZyopIHhtYWxsb2MgKHNpemVvZiAoc3RyaW5nKSk7Ci0gICAgICBzdHJpbmdfaW5pdCAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgIH0KLQotICBpZiAoIWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KSkKLSAgICByZXR1cm4gMDsKLQotICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0KLSAgcmVtZW1iZXJfdHlwZSAod29yaywgc3RhcnQsICptYW5nbGVkIC0gc3RhcnQpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX3R5cGUgKHdvcmssIHN0YXJ0LCBsZW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqdGVtOwotCi0gIGlmICh3b3JrLT5mb3JnZXR0aW5nX3R5cGVzKQotICAgIHJldHVybjsKLQotICBpZiAod29yayAtPiBudHlwZXMgPj0gd29yayAtPiB0eXBldmVjX3NpemUpCi0gICAgewotICAgICAgaWYgKHdvcmsgLT4gdHlwZXZlY19zaXplID09IDApCi0JewotCSAgd29yayAtPiB0eXBldmVjX3NpemUgPSAzOwotCSAgd29yayAtPiB0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gdHlwZXZlY19zaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiB0eXBldmVjX3NpemUgKj0gMjsKLQkgIHdvcmsgLT4gdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IHR5cGV2ZWMsCi0JCQkJICBzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSk7Ci0JfQotICAgIH0KLSAgdGVtID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAodGVtLCBzdGFydCwgbGVuKTsKLSAgdGVtW2xlbl0gPSAnXDAnOwotICB3b3JrIC0+IHR5cGV2ZWNbd29yayAtPiBudHlwZXMrK10gPSB0ZW07Ci19Ci0KLQotLyogUmVtZW1iZXIgYSBLIHR5cGUgY2xhc3MgcXVhbGlmaWVyLiAqLwotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0t0eXBlICh3b3JrLCBzdGFydCwgbGVuKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIGludCBsZW47Ci17Ci0gIGNoYXIgKnRlbTsKLQotICBpZiAod29yayAtPiBudW1rID49IHdvcmsgLT4ga3NpemUpCi0gICAgewotICAgICAgaWYgKHdvcmsgLT4ga3NpemUgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGtzaXplID0gNTsKLQkgIHdvcmsgLT4ga3R5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogd29yayAtPiBrc2l6ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmsgLT4ga3NpemUgKj0gMjsKLQkgIHdvcmsgLT4ga3R5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopd29yayAtPiBrdHlwZXZlYywKLQkJCQkgIHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4ga3NpemUpOwotCX0KLSAgICB9Ci0gIHRlbSA9IHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHRlbSwgc3RhcnQsIGxlbik7Ci0gIHRlbVtsZW5dID0gJ1wwJzsKLSAgd29yayAtPiBrdHlwZXZlY1t3b3JrIC0+IG51bWsrK10gPSB0ZW07Ci19Ci0KLS8qIFJlZ2lzdGVyIGEgQiBjb2RlLCBhbmQgZ2V0IGFuIGluZGV4IGZvciBpdC4gQiBjb2RlcyBhcmUgcmVnaXN0ZXJlZAotICAgYXMgdGhleSBhcmUgc2VlbiwgcmF0aGVyIHRoYW4gYXMgdGhleSBhcmUgY29tcGxldGVkLCBzbyBtYXA8dGVtcDxjaGFyPiA+Ci0gICByZWdpc3RlcnMgbWFwPHRlbXA8Y2hhcj4gPiBhcyBCMCwgYW5kIHRlbXA8Y2hhcj4gYXMgQjEgKi8KLQotc3RhdGljIGludAotcmVnaXN0ZXJfQnR5cGUgKHdvcmspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotewotICBpbnQgcmV0OwotCi0gIGlmICh3b3JrIC0+IG51bWIgPj0gd29yayAtPiBic2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiBic2l6ZSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gYnNpemUgPSA1OwotCSAgd29yayAtPiBidHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGJzaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiBic2l6ZSAqPSAyOwotCSAgd29yayAtPiBidHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IGJ0eXBldmVjLAotCQkJCSAgc2l6ZW9mIChjaGFyICopICogd29yayAtPiBic2l6ZSk7Ci0JfQotICAgIH0KLSAgcmV0ID0gd29yayAtPiBudW1iKys7Ci0gIHdvcmsgLT4gYnR5cGV2ZWNbcmV0XSA9IE5VTEw7Ci0gIHJldHVybihyZXQpOwotfQotCi0vKiBTdG9yZSBhIHZhbHVlIGludG8gYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgQiBjb2RlIHR5cGUuICovCi0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9CdHlwZSAod29yaywgc3RhcnQsIGxlbiwgaW5kZXgpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbiwgaW5kZXg7Ci17Ci0gIGNoYXIgKnRlbTsKLQotICB0ZW0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5ICh0ZW0sIHN0YXJ0LCBsZW4pOwotICB0ZW1bbGVuXSA9ICdcMCc7Ci0gIHdvcmsgLT4gYnR5cGV2ZWNbaW5kZXhdID0gdGVtOwotfQotCi0vKiBMb3NlIGFsbCB0aGUgaW5mbyByZWxhdGVkIHRvIEIgYW5kIEsgdHlwZSBjb2Rlcy4gKi8KLXN0YXRpYyB2b2lkCi1mb3JnZXRfQl9hbmRfS190eXBlcyAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCBpOwotCi0gIHdoaWxlICh3b3JrIC0+IG51bWsgPiAwKQotICAgIHsKLSAgICAgIGkgPSAtLSh3b3JrIC0+IG51bWspOwotICAgICAgaWYgKHdvcmsgLT4ga3R5cGV2ZWNbaV0gIT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3b3JrIC0+IGt0eXBldmVjW2ldKTsKLQkgIHdvcmsgLT4ga3R5cGV2ZWNbaV0gPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnVtYiA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnVtYik7Ci0gICAgICBpZiAod29yayAtPiBidHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4gYnR5cGV2ZWNbaV0pOwotCSAgd29yayAtPiBidHlwZXZlY1tpXSA9IE5VTEw7Ci0JfQotICAgIH0KLX0KLS8qIEZvcmdldCB0aGUgcmVtZW1iZXJlZCB0eXBlcywgYnV0IG5vdCB0aGUgdHlwZSB2ZWN0b3IgaXRzZWxmLiAgKi8KLQotc3RhdGljIHZvaWQKLWZvcmdldF90eXBlcyAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCBpOwotCi0gIHdoaWxlICh3b3JrIC0+IG50eXBlcyA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnR5cGVzKTsKLSAgICAgIGlmICh3b3JrIC0+IHR5cGV2ZWNbaV0gIT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3b3JrIC0+IHR5cGV2ZWNbaV0pOwotCSAgd29yayAtPiB0eXBldmVjW2ldID0gTlVMTDsKLQl9Ci0gICAgfQotfQotCi0vKiBQcm9jZXNzIHRoZSBhcmd1bWVudCBsaXN0IHBhcnQgb2YgdGhlIHNpZ25hdHVyZSwgYWZ0ZXIgYW55IGNsYXNzIHNwZWMKLSAgIGhhcyBiZWVuIGNvbnN1bWVkLCBhcyB3ZWxsIGFzIHRoZSBmaXJzdCAnRicgY2hhcmFjdGVyIChpZiBhbnkpLiAgRm9yCi0gICBleGFtcGxlOgotCi0gICAiX19hbHNfXzNmb29SVDAiCQk9Pglwcm9jZXNzICJSVDAiCi0gICAiY29tcGxleGZ1bmM1X19GUEZQY19QRmxfaSIJPT4JcHJvY2VzcyAiUEZQY19QRmxfaSIKLQotICAgREVDTFAgbXVzdCBiZSBhbHJlYWR5IGluaXRpYWxpc2VkLCB1c3VhbGx5IG5vbi1lbXB0eS4gIEl0IHdvbid0IGJlIGZyZWVkCi0gICBvbiBmYWlsdXJlLgotCi0gICBOb3RlIHRoYXQgZysrIGRpZmZlcnMgc2lnbmlmaWNhbnRseSBmcm9tIEFSTSBhbmQgbHVjaWQgc3R5bGUgbWFuZ2xpbmcKLSAgIHdpdGggcmVnYXJkcyB0byByZWZlcmVuY2VzIHRvIHByZXZpb3VzbHkgc2VlbiB0eXBlcy4gIEZvciBleGFtcGxlLCBnaXZlbgotICAgdGhlIHNvdXJjZSBmcmFnbWVudDoKLQotICAgICBjbGFzcyBmb28gewotICAgICAgIHB1YmxpYzoKLSAgICAgICBmb286OmZvbyAoaW50LCBmb28gJmlhLCBpbnQsIGZvbyAmaWIsIGludCwgZm9vICZpYyk7Ci0gICAgIH07Ci0KLSAgICAgZm9vOjpmb28gKGludCwgZm9vICZpYSwgaW50LCBmb28gJmliLCBpbnQsIGZvbyAmaWMpIHsgaWEgPSBpYiA9IGljOyB9Ci0gICAgIHZvaWQgZm9vIChpbnQsIGZvbyAmaWEsIGludCwgZm9vICZpYiwgaW50LCBmb28gJmljKSB7IGlhID0gaWIgPSBpYzsgfQotCi0gICBnKysgcHJvZHVjZXMgdGhlIG5hbWVzOgotCi0gICAgIF9fM2Zvb2lSVDBpVDJpVDIKLSAgICAgZm9vX19GaVIzZm9vaVQxaVQxCi0KLSAgIHdoaWxlIGxjYyAoYW5kIHByZXN1bWFibHkgb3RoZXIgQVJNIHN0eWxlIGNvbXBpbGVycyBhcyB3ZWxsKSBwcm9kdWNlczoKLQotICAgICBmb29fX0ZpUjNmb29UMVQyVDFUMgotICAgICBfX2N0X18zZm9vRmlSM2Zvb1QxVDJUMVQyCi0KLSAgIE5vdGUgdGhhdCBnKysgYmFzZXMgaXRzIHR5cGUgbnVtYmVycyBzdGFydGluZyBhdCB6ZXJvIGFuZCBjb3VudHMgYWxsCi0gICBwcmV2aW91c2x5IHNlZW4gdHlwZXMsIHdoaWxlIGx1Y2lkL0FSTSBiYXNlcyBpdHMgdHlwZSBudW1iZXJzIHN0YXJ0aW5nCi0gICBhdCBvbmUgYW5kIG9ubHkgY29uc2lkZXJzIHR5cGVzIGFmdGVyIGl0IGhhcyBzZWVuIHRoZSAnRicgY2hhcmFjdGVyCi0gICBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYXJncy4gIEZvciBsdWNpZC9BUk0gc3R5bGUsIHdlCi0gICBhY2NvdW50IGZvciB0aGlzIGRpZmZlcmVuY2UgYnkgZGlzY2FyZGluZyBhbnkgcHJldmlvdXNseSBzZWVuIHR5cGVzIHdoZW4KLSAgIHdlIHNlZSB0aGUgJ0YnIGNoYXJhY3RlciwgYW5kIHN1YnRyYWN0aW5nIG9uZSBmcm9tIHRoZSB0eXBlIG51bWJlcgotICAgcmVmZXJlbmNlLgotCi0gKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgc3RyaW5nIGFyZzsKLSAgaW50IG5lZWRfY29tbWEgPSAwOwotICBpbnQgcjsKLSAgaW50IHQ7Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLSAgY2hhciB0ZW1wdHlwZTsKLQotICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiKCIpOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXDAnKQotCXsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAidm9pZCIpOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKCgqKm1hbmdsZWQgIT0gJ18nICYmICoqbWFuZ2xlZCAhPSAnXDAnICYmICoqbWFuZ2xlZCAhPSAnZScpCi0JIHx8IHdvcmstPm5yZXBlYXRzID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKCoqbWFuZ2xlZCA9PSAnTicpIHx8ICgqKm1hbmdsZWQgPT0gJ1QnKSkKLQl7Ci0JICB0ZW1wdHlwZSA9ICooKm1hbmdsZWQpKys7Ci0KLQkgIGlmICh0ZW1wdHlwZSA9PSAnTicpCi0JICAgIHsKLQkgICAgICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotCQl7Ci0JCSAgcmV0dXJuICgwKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByID0gMTsKLQkgICAgfQotICAgICAgICAgIGlmICgoSFBfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgd29yayAtPiBudHlwZXMgPj0gMTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgMTAgb3IgbW9yZSB0eXBlcyB3ZSBtaWdodCBoYXZlIG1vcmUgdGhhbiBhIDEgZGlnaXQKLSAgICAgICAgICAgICAgICAgaW5kZXggc28gd2UnbGwgaGF2ZSB0byBjb25zdW1lIHRoZSB3aG9sZSBjb3VudCBoZXJlLiBUaGlzCi0gICAgICAgICAgICAgICAgIHdpbGwgbG9zZSBpZiB0aGUgbmV4dCB0aGluZyBpcyBhIHR5cGUgbmFtZSBwcmVjZWRlZCBieSBhCi0gICAgICAgICAgICAgICAgIGNvdW50IGJ1dCBpdCdzIGltcG9zc2libGUgdG8gZGVtYW5nbGUgdGhhdCBjYXNlIHByb3Blcmx5Ci0gICAgICAgICAgICAgICAgIGFueXdheS4gRWcgaWYgd2UgYWxyZWFkeSBoYXZlIDEyIHR5cGVzIGlzIFQxMlBjICIoLi4uLCB0eXBlMSwKLSAgICAgICAgICAgICAgICAgUGMsIC4uLikiICBvciAiKC4uLiwgdHlwZTEyLCBjaGFyICosIC4uLikiICovCi0gICAgICAgICAgICAgIGlmICgodCA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCkpIDw9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZ0KSkKLQkgICAgCXsKLQkgICAgICAgICAgcmV0dXJuICgwKTsKLQkgICAgCX0KLQkgICAgfQotCSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIHQtLTsKLQkgICAgfQotCSAgLyogVmFsaWRhdGUgdGhlIHR5cGUgaW5kZXguICBQcm90ZWN0IGFnYWluc3QgaWxsZWdhbCBpbmRpY2VzIGZyb20KLQkgICAgIG1hbGZvcm1lZCB0eXBlIHN0cmluZ3MuICAqLwotCSAgaWYgKCh0IDwgMCkgfHwgKHQgPj0gd29yayAtPiBudHlwZXMpKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgd2hpbGUgKHdvcmstPm5yZXBlYXRzID4gMCB8fCAtLXIgPj0gMCkKLQkgICAgewotCSAgICAgIHRlbSA9IHdvcmsgLT4gdHlwZXZlY1t0XTsKLQkgICAgICBpZiAobmVlZF9jb21tYSAmJiBQUklOVF9BUkdfVFlQRVMpCi0JCXsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiwgIik7Ci0JCX0KLQkgICAgICBpZiAoIWRvX2FyZyAod29yaywgJnRlbSwgJmFyZykpCi0JCXsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgICAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQkJewotCQkgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0JCX0KLQkgICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLQkgICAgICBuZWVkX2NvbW1hID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobmVlZF9jb21tYSAmJiBQUklOVF9BUkdfVFlQRVMpCi0JICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCAiKTsKLQkgIGlmICghZG9fYXJnICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLQkgICAgcmV0dXJuICgwKTsKLQkgIGlmIChQUklOVF9BUkdfVFlQRVMpCi0JICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0JICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLQkgIG5lZWRfY29tbWEgPSAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnZScpCi0gICAgewotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQl7Ci0JICBpZiAobmVlZF9jb21tYSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIi4uLiIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKFBSSU5UX0FSR19UWVBFUykKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIikiKTsKLSAgICB9Ci0gIHJldHVybiAoMSk7Ci19Ci0KLS8qIExpa2UgZGVtYW5nbGVfYXJncywgYnV0IGZvciBkZW1hbmdsaW5nIHRoZSBhcmd1bWVudCBsaXN0cyBvZiBmdW5jdGlvbgotICAgYW5kIG1ldGhvZCBwb2ludGVycyBvciByZWZlcmVuY2VzLCBub3QgdG9wLWxldmVsIGRlY2xhcmF0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX25lc3RlZF9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBzdHJpbmcqIHNhdmVkX3ByZXZpb3VzX2FyZ3VtZW50OwotICBpbnQgcmVzdWx0OwotICBpbnQgc2F2ZWRfbnJlcGVhdHM7Ci0KLSAgLyogVGhlIEcrKyBuYW1lLW1hbmdsaW5nIGFsZ29yaXRobSBkb2VzIG5vdCByZW1lbWJlciB0eXBlcyBvbiBuZXN0ZWQKLSAgICAgYXJndW1lbnQgbGlzdHMsIHVubGVzcyAtZnNxdWFuZ2xpbmcgaXMgdXNlZCwgYW5kIGluIHRoYXQgY2FzZSB0aGUKLSAgICAgdHlwZSB2ZWN0b3IgdXBkYXRlZCBieSByZW1lbWJlcl90eXBlIGlzIG5vdCB1c2VkLiAgU28sIHdlIHR1cm4KLSAgICAgb2ZmIHJlbWVtYmVyaW5nIG9mIHR5cGVzIGhlcmUuICAqLwotICArK3dvcmstPmZvcmdldHRpbmdfdHlwZXM7Ci0KLSAgLyogRm9yIHRoZSByZXBlYXQgY29kZXMgdXNlZCB3aXRoIC1mc3F1YW5nbGluZywgd2UgbXVzdCBrZWVwIHRyYWNrIG9mCi0gICAgIHRoZSBsYXN0IGFyZ3VtZW50LiAgKi8KLSAgc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQgPSB3b3JrLT5wcmV2aW91c19hcmd1bWVudDsKLSAgc2F2ZWRfbnJlcGVhdHMgPSB3b3JrLT5ucmVwZWF0czsKLSAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSAwOwotICB3b3JrLT5ucmVwZWF0cyA9IDA7Ci0KLSAgLyogQWN0dWFsbHkgZGVtYW5nbGUgdGhlIGFyZ3VtZW50cy4gICovCi0gIHJlc3VsdCA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQotICAvKiBSZXN0b3JlIHRoZSBwcmV2aW91c19hcmd1bWVudCBmaWVsZC4gICovCi0gIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKLSAgICBzdHJpbmdfZGVsZXRlICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQ7Ci0gIC0td29yay0+Zm9yZ2V0dGluZ190eXBlczsKLSAgd29yay0+bnJlcGVhdHMgPSBzYXZlZF9ucmVwZWF0czsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLSAgICAgY29uc3QgY2hhciAqc2NhbjsKLXsKLSAgc2l6ZV90IGk7Ci0gIHN0cmluZyB0eXBlOwotICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAoKm1hbmdsZWQpLCBzY2FuIC0gKCptYW5nbGVkKSk7Ci0gIHN0cmluZ19uZWVkIChkZWNscCwgMSk7Ci0gICooZGVjbHAgLT4gcCkgPSAnXDAnOwotCi0gIC8qIENvbnN1bWUgdGhlIGZ1bmN0aW9uIG5hbWUsIGluY2x1ZGluZyB0aGUgIl9fIiBzZXBhcmF0aW5nIHRoZSBuYW1lCi0gICAgIGZyb20gdGhlIHNpZ25hdHVyZS4gIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgU0NBTiBwb2ludHMgdG8gdGhlCi0gICAgIHNlcGFyYXRvci4gICovCi0KLSAgKCptYW5nbGVkKSA9IHNjYW4gKyAyOwotICAvKiBXZSBtYXkgYmUgbG9va2luZyBhdCBhbiBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgZnVuY3Rpb246Ci0gICAgIGZvb19fWHQxdDJfRnQzdDQsIHdoZXJlIHQxLCB0MiwgLi4uIGFyZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIGEKLSAgICAgZm9sbG93aW5nIF9GIG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgSGFuZGxlCi0gICAgIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgZmlyc3QuICovCi0KLSAgaWYgKEhQX0RFTUFOR0xJTkcgJiYgKCoqbWFuZ2xlZCA9PSAnWCcpKQotICAgIHsKLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgMCwgZGVjbHApOwotICAgICAgLyogVGhpcyBsZWF2ZXMgTUFOR0xFRCBwb2ludGluZyB0byB0aGUgJ0YnIG1hcmtpbmcgZnVuYyBhcmdzICovCi0gICAgfQotCi0gIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0gICAgewotCi0gICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBBUk0gc3R5bGUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBvcGVyYXRvci4KLQkgSWYgc28sIHRoZW4ganVzdCByZWNvcmQgaXQsIGNsZWFyIHRoZSBkZWNsLCBhbmQgcmV0dXJuLgotCSBXZSBjYW4ndCBidWlsZCB0aGUgYWN0dWFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZGVjbCB1bnRpbCBsYXRlciwKLQkgd2hlbiB3ZSByZWNvdmVyIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIHNpZ25hdHVyZS4gICovCi0KLSAgICAgIGlmIChzdHJjbXAgKGRlY2xwIC0+IGIsICJfX2N0IikgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGNvbnN0cnVjdG9yICs9IDE7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlY2xwIC0+IGIsICJfX2R0IikgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGRlc3RydWN0b3IgKz0gMTsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGRlY2xwLT5wIC0gZGVjbHAtPmIgPj0gMwotICAgICAgJiYgZGVjbHAtPmJbMF0gPT0gJ28nCi0gICAgICAmJiBkZWNscC0+YlsxXSA9PSAncCcKLSAgICAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgZGVjbHAtPmJbMl0pICE9IE5VTEwpCi0gICAgewotICAgICAgLyogc2VlIGlmIGl0J3MgYW4gYXNzaWdubWVudCBleHByZXNzaW9uICovCi0gICAgICBpZiAoZGVjbHAtPnAgLSBkZWNscC0+YiA+PSAxMCAvKiBvcCRhc3NpZ25fICovCi0JICAmJiBtZW1jbXAgKGRlY2xwLT5iICsgMywgImFzc2lnbl8iLCA3KSA9PSAwKQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IGRlY2xwLT5wIC0gZGVjbHAtPmIgLSAxMDsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4KLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMTAsIGxlbikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPSIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gZGVjbHAtPnAgLSBkZWNscC0+YiAtIDM7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDMsIGxlbikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+cCAtIGRlY2xwLT5iID49IDUgJiYgbWVtY21wIChkZWNscC0+YiwgInR5cGUiLCA0KSA9PSAwCi0JICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBkZWNscC0+Yls0XSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgKi8KLSAgICAgIHRlbSA9IGRlY2xwLT5iICsgNTsKLSAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCi0JewotCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yICIpOwotCSAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHlwZSk7Ci0JICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZGVjbHAtPmJbMF0gPT0gJ18nICYmIGRlY2xwLT5iWzFdID09ICdfJwotCSAgICYmIGRlY2xwLT5iWzJdID09ICdvJyAmJiBkZWNscC0+YlszXSA9PSAncCcpCi0gICAgewotICAgICAgLyogQU5TSS4gICovCi0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gZGVjbHAtPmIgKyA0OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0eXBlKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+YlswXSA9PSAnXycgJiYgZGVjbHAtPmJbMV0gPT0gJ18nCi0JICAgJiYgZGVjbHAtPmJbMl0gPj0gJ2EnICYmIGRlY2xwLT5iWzJdIDw9ICd6JwotCSAgICYmIGRlY2xwLT5iWzNdID49ICdhJyAmJiBkZWNscC0+YlszXSA8PSAneicpCi0gICAgewotICAgICAgaWYgKGRlY2xwLT5iWzRdID09ICdcMCcpCi0JewotCSAgLyogT3BlcmF0b3IuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAyCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDIsIDIpID09IDApCi0JCXsKLQkJICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChkZWNscC0+YlsyXSA9PSAnYScgJiYgZGVjbHAtPmJbNV0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIEFzc2lnbm1lbnQuICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCQl7Ci0JCSAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMwotCQkgICAgICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIGEgbWluaSBzdHJpbmctaGFuZGxpbmcgcGFja2FnZSAqLwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX25lZWQgKHMsIG4pCi0gICAgIHN0cmluZyAqczsKLSAgICAgaW50IG47Ci17Ci0gIGludCB0ZW07Ci0KLSAgaWYgKHMtPmIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA8IDMyKQotCXsKLQkgIG4gPSAzMjsKLQl9Ci0gICAgICBzLT5wID0gcy0+YiA9IHhtYWxsb2MgKG4pOwotICAgICAgcy0+ZSA9IHMtPmIgKyBuOwotICAgIH0KLSAgZWxzZSBpZiAocy0+ZSAtIHMtPnAgPCBuKQotICAgIHsKLSAgICAgIHRlbSA9IHMtPnAgLSBzLT5iOwotICAgICAgbiArPSB0ZW07Ci0gICAgICBuICo9IDI7Ci0gICAgICBzLT5iID0geHJlYWxsb2MgKHMtPmIsIG4pOwotICAgICAgcy0+cCA9IHMtPmIgKyB0ZW07Ci0gICAgICBzLT5lID0gcy0+YiArIG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2RlbGV0ZSAocykKLSAgICAgc3RyaW5nICpzOwotewotICBpZiAocy0+YiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHMtPmIpOwotICAgICAgcy0+YiA9IHMtPmUgPSBzLT5wID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfaW5pdCAocykKLSAgICAgc3RyaW5nICpzOwotewotICBzLT5iID0gcy0+cCA9IHMtPmUgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2NsZWFyIChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIHMtPnAgPSBzLT5iOwotfQotCi0jaWYgMAotCi1zdGF0aWMgaW50Ci1zdHJpbmdfZW1wdHkgKHMpCi0gICAgIHN0cmluZyAqczsKLXsKLSAgcmV0dXJuIChzLT5iID09IHMtPnApOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmQgKHAsIHMpCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaW50IG47Ci0gIGlmIChzID09IE5VTEwgfHwgKnMgPT0gJ1wwJykKLSAgICByZXR1cm47Ci0gIG4gPSBzdHJsZW4gKHMpOwotICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gIG1lbWNweSAocC0+cCwgcywgbik7Ci0gIHAtPnAgKz0gbjsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRzIChwLCBzKQotICAgICBzdHJpbmcgKnAsICpzOwotewotICBpbnQgbjsKLQotICBpZiAocy0+YiAhPSBzLT5wKQotICAgIHsKLSAgICAgIG4gPSBzLT5wIC0gcy0+YjsKLSAgICAgIHN0cmluZ19uZWVkIChwLCBuKTsKLSAgICAgIG1lbWNweSAocC0+cCwgcy0+Yiwgbik7Ci0gICAgICBwLT5wICs9IG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZG4gKHAsIHMsIG4pCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IG47Ci17Ci0gIGlmIChuICE9IDApCi0gICAgewotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgbWVtY3B5IChwLT5wLCBzLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZCAocCwgcykKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpZiAocyAhPSBOVUxMICYmICpzICE9ICdcMCcpCi0gICAgewotICAgICAgc3RyaW5nX3ByZXBlbmRuIChwLCBzLCBzdHJsZW4gKHMpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZHMgKHAsIHMpCi0gICAgIHN0cmluZyAqcCwgKnM7Ci17Ci0gIGlmIChzLT5iICE9IHMtPnApCi0gICAgewotICAgICAgc3RyaW5nX3ByZXBlbmRuIChwLCBzLT5iLCBzLT5wIC0gcy0+Yik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmRuIChwLCBzLCBuKQotICAgICBzdHJpbmcgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBuOwotewotICBjaGFyICpxOwotCi0gIGlmIChuICE9IDApCi0gICAgewotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgZm9yIChxID0gcC0+cCAtIDE7IHEgPj0gcC0+YjsgcS0tKQotCXsKLQkgIHFbbl0gPSBxWzBdOwotCX0KLSAgICAgIG1lbWNweSAocC0+Yiwgcywgbik7Ci0gICAgICBwLT5wICs9IG47Ci0gICAgfQotfQotCi0vKiBUbyBnZW5lcmF0ZSBhIHN0YW5kYWxvbmUgZGVtYW5nbGVyIHByb2dyYW0gZm9yIHRlc3RpbmcgcHVycG9zZXMsCi0gICBqdXN0IGNvbXBpbGUgYW5kIGxpbmsgdGhpcyBmaWxlIHdpdGggLURNQUlOIGFuZCBsaWJpYmVydHkuYS4gIFdoZW4KLSAgIHJ1biwgaXQgZGVtYW5nbGVzIGVhY2ggY29tbWFuZCBsaW5lIGFyZywgb3IgZWFjaCBzdGRpbiBzdHJpbmcsIGFuZAotICAgcHJpbnRzIHRoZSByZXN1bHQgb24gc3Rkb3V0LiAgKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgImdldG9wdC5oIgotCi1zdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOwotc3RhdGljIGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9IFZFUlNJT047Ci1zdGF0aWMgaW50IGZsYWdzID0gRE1HTF9QQVJBTVMgfCBETUdMX0FOU0k7Ci0KLXN0YXRpYyB2b2lkIGRlbWFuZ2xlX2l0IFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGZhdGFsIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfaXQgKG1hbmdsZWRfbmFtZSkKLSAgICAgY2hhciAqbWFuZ2xlZF9uYW1lOwotewotICBjaGFyICpyZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gY3BsdXNfZGVtYW5nbGUgKG1hbmdsZWRfbmFtZSwgZmxhZ3MpOwotICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiJXNcbiIsIG1hbmdsZWRfbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiJXNcbiIsIHJlc3VsdCk7Ci0gICAgICBmcmVlIChyZXN1bHQpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sICJcCi1Vc2FnZTogJXMgWy1fXSBbLW5dIFstcyB7Z251LGx1Y2lkLGFybSxocCxlZGd9XSBbLS1zdHJpcC11bmRlcnNjb3Jlc11cblwKLSAgICAgICBbLS1uby1zdHJpcC11bmRlcnNjb3Jlc10gWy0tZm9ybWF0PXtnbnUsbHVjaWQsYXJtLGhwLGVkZ31dXG5cCi0gICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXSBbYXJnLi4uXVxuIiwKLQkgICBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0jZGVmaW5lIE1CVUZfU0laRSAzMjc2NwotY2hhciBtYnVmZmVyW01CVUZfU0laRV07Ci0KLS8qIERlZmluZWQgaW4gdGhlIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIHVuZGVyc2NvcmUuYy4gICovCi1leHRlcm4gaW50IHByZXBlbmRzX3VuZGVyc2NvcmU7Ci0KLWludCBzdHJpcF91bmRlcnNjb3JlID0gMDsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7Ci0gIHsic3RyaXAtdW5kZXJzY29yZXMiLCBub19hcmd1bWVudCwgMCwgJ18nfSwKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsiamF2YSIsIG5vX2FyZ3VtZW50LCAwLCAnaid9LAotICB7Im5vLXN0cmlwLXVuZGVyc2NvcmVzIiwgbm9fYXJndW1lbnQsIDAsICduJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBNb3JlICdmcmllbmRseScgYWJvcnQgdGhhdCBwcmludHMgdGhlIGxpbmUgYW5kIGZpbGUuCi0gICBjb25maWcuaCBjYW4gI2RlZmluZSBhYm9ydCBmYW5jeV9hYm9ydCBpZiB5b3UgbGlrZSB0aGF0IHNvcnQgb2YgdGhpbmcuICAqLwotCi12b2lkCi1mYW5jeV9hYm9ydCAoKQotewotICBmYXRhbCAoIkludGVybmFsIGdjYyBhYm9ydC4iKTsKLX0KLQotCi0vKiBGaWxsIGluIFRBQkxFIHNvIHRoYXQgVEFCTEVbQ10gaXMgdHJ1ZSBpZmYgQyAoYXMgYW4gdW5zaWduZWQgY2hhcikKLSAgIGlzIGEgdmFsaWQgc3ltYm9sIGNvbXBvbmVudCwgaW4gdGhlIHN0YW5kYXJkIGFzc2VtYmxlciBzeW1ib2wKLSAgIHN5bnRheC4gICovCi12b2lkCi1zdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQgKGNoYXIgKnRhYmxlKQotewotICBpbnQgYzsKLQotICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCi0gICAgdGFibGVbY10gPSBpc2FsbnVtKGMpOwotCi0gIHRhYmxlWydfJ10gPSAxOwotICB0YWJsZVsnJCddID0gMTsKLSAgdGFibGVbJy4nXSA9IDE7Ci19Ci0KLQotLyogRmlsbCBpbiBUQUJMRSBzbyB0aGF0IFRBQkxFW0NdIGlzIHRydWUgaWZmIEMgKGFzIGFuIHVuc2lnbmVkIGNoYXIpCi0gICBpcyBhIHZhbGlkIHN5bWJvbCBuYW1lIGNvbXBvbmVudCBpbiBhbiBIUCBvYmplY3QgZmlsZS4KLQotICAgTm90ZSB0aGF0LCBzaW5jZSBIUCdzIGNvbXBpbGVyIGdlbmVyYXRlcyBvYmplY3QgY29kZSBzdHJhaWdodCBmcm9tCi0gICBDKysgc291cmNlLCB3aXRob3V0IGdvaW5nIHRocm91Z2ggYW4gYXNzZW1ibGVyLCBpdHMgbWFuZ2xlZAotICAgaWRlbnRpZmllcnMgY2FuIHVzZSBhbGwgc29ydHMgb2YgY2hhcmFjdGVycyB0aGF0IG5vIGFzc2VtYmxlciB3b3VsZAotICAgdG9sZXJhdGUsIHNvIHRoZSBhbHBoYWJldCB0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgaXMgYSBsaXR0bGUgb2RkLgotICAgSGVyZSBhcmUgc29tZSBzYW1wbGUgbWFuZ2xlZCBpZGVudGlmaWVycyBvZmZlcmVkIGJ5IEhQOgotCi0JdHlwZWlkKl9fWFQyNEFkZHJlc3NJbmRFeHBDbGFzc01lbWJlcl8KLQlbVmZ0cHRyXWtleTpfX2R0X18zMk9yZGluYXJ5Q29tcGFyZUluZEV4cENsYXNzTWVtYmVyRnYKLQlfX2N0X19RMl85RWxmNjRfRHluMTh7dW5uYW1lZC51bmlvbi4jMX1GdgotCi0gICBUaGlzIHN0aWxsIHNlZW1zIHJlYWxseSB3ZWlyZCB0byBtZSwgc2luY2Ugbm93aGVyZSBlbHNlIGluIHRoaXMKLSAgIGZpbGUgaXMgdGhlcmUgYW55dGhpbmcgdG8gcmVjb2duaXplIGN1cmx5IGJyYWNrZXRzLCBwYXJlbnMsIGV0Yy4KLSAgIEkndmUgdGFsa2VkIHdpdGggU3Jpa2FudGggPHNyaWthbnRoQGN1cC5ocC5jb20+LCBhbmQgaGUgYXNzdXJlcyBtZQotICAgdGhpcyBpcyByaWdodCwgYnV0IEkgc3RpbGwgc3Ryb25nbHkgc3VzcGVjdCB0aGF0IHRoZXJlJ3MgYQotICAgbWlzdW5kZXJzdGFuZGluZyBoZXJlLgotCi0gICBJZiB3ZSBkZWNpZGUgaXQncyBiZXR0ZXIgZm9yIGMrK2ZpbHQgdG8gdXNlIEhQJ3MgYXNzZW1ibGVyIHN5bnRheAotICAgdG8gc2NyYXBlIGlkZW50aWZpZXJzIG91dCBvZiBpdHMgaW5wdXQsIGhlcmUncyB0aGUgZGVmaW5pdGlvbiBvZgotICAgdGhlIHN5bWJvbCBuYW1lIHN5bnRheCBmcm9tIHRoZSBIUCBhc3NlbWJsZXIgbWFudWFsOgotCi0gICAgICAgU3ltYm9scyBhcmUgY29tcG9zZWQgb2YgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGVjaW1hbAotICAgICAgIGRpZ2l0cywgZG9sbGFyIHN5bWJvbCwgcGVyaW9kICguKSwgYW1wZXJzYW5kICgmKSwgcG91bmQgc2lnbigjKSBhbmQKLSAgICAgICB1bmRlcnNjb3JlIChfKS4gQSBzeW1ib2wgY2FuIGJlZ2luIHdpdGggYSBsZXR0ZXIsIGRpZ2l0IHVuZGVyc2NvcmUgb3IKLSAgICAgICBkb2xsYXIgc2lnbi4gSWYgYSBzeW1ib2wgYmVnaW5zIHdpdGggYSBkaWdpdCwgaXQgbXVzdCBjb250YWluIGEKLSAgICAgICBub24tZGlnaXQgY2hhcmFjdGVyLgotCi0gICBTbyBoYXZlIGZ1bi4gICovCi12b2lkCi1ocF9zeW1ib2xfYWxwaGFiZXQgKGNoYXIgKnRhYmxlKQotewotICBjaGFyICpjOwotCi0gIHN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCAodGFibGUpOwotCi0gIGZvciAoYyA9ICI8PiMsKiZbXTooKXt9IjsgKmM7IGMrKykKLSAgICB0YWJsZVsodW5zaWduZWQgY2hhcikgKmNdID0gMTsKLX0KLQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqcmVzdWx0OwotICBpbnQgYzsKLSAgY2hhciBzeW1ib2xfYWxwaGFiZXRbMjU2XTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotCi0gIHN0cmlwX3VuZGVyc2NvcmUgPSBwcmVwZW5kc191bmRlcnNjb3JlOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiX25zOmoiLCBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJz8nOgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCWNhc2UgJ24nOgotCSAgc3RyaXBfdW5kZXJzY29yZSA9IDA7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHByaW50ZiAoIkdOVSAlcyAoQysrIGRlbWFuZ2xlciksIHZlcnNpb24gJXNcbiIsIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKLQkgIGV4aXQgKDApOwotCWNhc2UgJ18nOgotCSAgc3RyaXBfdW5kZXJzY29yZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdqJzoKLQkgIGZsYWdzIHw9IERNR0xfSkFWQTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgaWYgKHN0cmNtcCAob3B0YXJnLCAiZ251IikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGdudV9kZW1hbmdsaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImx1Y2lkIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGx1Y2lkX2RlbWFuZ2xpbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiYXJtIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGFybV9kZW1hbmdsaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImhwIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGhwX2RlbWFuZ2xpbmc7Ci0JICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImVkZyIpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGVkZ19kZW1hbmdsaW5nOwotICAgICAgICAgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVua25vd24gZGVtYW5nbGluZyBzdHlsZSBgJXMnXG4iLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGZvciAoIDsgb3B0aW5kIDwgYXJnYzsgb3B0aW5kKyspCi0JewotCSAgZGVtYW5nbGVfaXQgKGFyZ3Zbb3B0aW5kXSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlKQotCXsKLQljYXNlIGdudV9kZW1hbmdsaW5nOgotCWNhc2UgbHVjaWRfZGVtYW5nbGluZzoKLQljYXNlIGFybV9kZW1hbmdsaW5nOgotCWNhc2UgZWRnX2RlbWFuZ2xpbmc6Ci0JICBzdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQgKHN5bWJvbF9hbHBoYWJldCk7Ci0JICBicmVhazsKLQljYXNlIGhwX2RlbWFuZ2xpbmc6Ci0JICBocF9zeW1ib2xfYWxwaGFiZXQgKHN5bWJvbF9hbHBoYWJldCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogRm9sa3Mgc2hvdWxkIGV4cGxpY2l0bHkgaW5kaWNhdGUgdGhlIGFwcHJvcHJpYXRlIGFscGhhYmV0IGZvcgotCSAgICAgZWFjaCBkZW1hbmdsaW5nLiAgUHJvdmlkaW5nIGEgZGVmYXVsdCB3b3VsZCBhbGxvdyB0aGUKLQkgICAgIHF1ZXN0aW9uIHRvIGdvIHVuY29uc2lkZXJlZC4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGZvciAoOzspCi0JewotCSAgaW50IGkgPSAwOwotCSAgYyA9IGdldGNoYXIgKCk7Ci0JICAvKiBUcnkgdG8gcmVhZCBhIGxhYmVsLiAgKi8KLQkgIHdoaWxlIChjICE9IEVPRiAmJiBzeW1ib2xfYWxwaGFiZXRbY10pCi0JICAgIHsKLQkgICAgICBpZiAoaSA+PSBNQlVGX1NJWkUtMSkKLQkJYnJlYWs7Ci0JICAgICAgbWJ1ZmZlcltpKytdID0gYzsKLQkgICAgICBjID0gZ2V0Y2hhciAoKTsKLQkgICAgfQotCSAgaWYgKGkgPiAwKQotCSAgICB7Ci0JICAgICAgaW50IHNraXBfZmlyc3QgPSAwOwotCi0JICAgICAgaWYgKG1idWZmZXJbMF0gPT0gJy4nKQotCQkrK3NraXBfZmlyc3Q7Ci0JICAgICAgaWYgKHN0cmlwX3VuZGVyc2NvcmUgJiYgbWJ1ZmZlcltza2lwX2ZpcnN0XSA9PSAnXycpCi0JCSsrc2tpcF9maXJzdDsKLQotCSAgICAgIGlmIChza2lwX2ZpcnN0ID4gaSkKLQkJc2tpcF9maXJzdCA9IGk7Ci0KLQkgICAgICBtYnVmZmVyW2ldID0gMDsKLQotCSAgICAgIHJlc3VsdCA9IGNwbHVzX2RlbWFuZ2xlIChtYnVmZmVyICsgc2tpcF9maXJzdCwgZmxhZ3MpOwotCSAgICAgIGlmIChyZXN1bHQpCi0JCXsKLQkJICBpZiAobWJ1ZmZlclswXSA9PSAnLicpCi0JCSAgICBwdXRjICgnLicsIHN0ZG91dCk7Ci0JCSAgZnB1dHMgKHJlc3VsdCwgc3Rkb3V0KTsKLQkJICBmcmVlIChyZXN1bHQpOwotCQl9Ci0JICAgICAgZWxzZQotCQlmcHV0cyAobWJ1ZmZlciwgc3Rkb3V0KTsKLQotCSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLQkgICAgfQotCSAgaWYgKGMgPT0gRU9GKQotCSAgICBicmVhazsKLQkgIHB1dGNoYXIgKGMpOwotCX0KLSAgICB9Ci0KLSAgZXhpdCAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mYXRhbCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHIpOwotICBleGl0ICgxKTsKLX0KLQotUFRSCi14bWFsbG9jIChzaXplKQotICBzaXplX3Qgc2l6ZTsKLXsKLSAgcmVnaXN0ZXIgUFRSIHZhbHVlID0gKFBUUikgbWFsbG9jIChzaXplKTsKLSAgaWYgKHZhbHVlID09IDApCi0gICAgZmF0YWwgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1QVFIKLXhyZWFsbG9jIChwdHIsIHNpemUpCi0gIFBUUiBwdHI7Ci0gIHNpemVfdCBzaXplOwotewotICByZWdpc3RlciBQVFIgdmFsdWUgPSAoUFRSKSByZWFsbG9jIChwdHIsIHNpemUpOwotICBpZiAodmFsdWUgPT0gMCkKLSAgICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0jZW5kaWYJLyogbWFpbiAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2ZkbWF0Y2guYyBiL2xpYmliZXJ0eS9mZG1hdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjAzOWYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2ZkbWF0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIENvbXBhcmUgdHdvIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyB0byBzZWUgaWYgdGhleSByZWZlciB0byB0aGUgc2FtZSBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKgotCi1OQU1FCi0KLQlmZG1hdGNoIC0tIHNlZSBpZiB0d28gZmlsZSBkZXNjcmlwdG9ycyByZWZlciB0byBzYW1lIGZpbGUKLQotU1lOT1BTSVMKLQotCWludCBmZG1hdGNoIChpbnQgZmQxLCBpbnQgZmQyKQotCi1ERVNDUklQVElPTgotCi0JQ2hlY2sgdG8gc2VlIGlmIHR3byBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4KLQlUaGlzIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4gd2UgaGF2ZSBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotCWZvciBhbiB1bm5hbWVkIGZpbGUsIGFuZCB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdCB3ZSBiZWxpZXZlIHRvIAotCWNvcnJlc3BvbmQgdG8gdGhhdCBmZC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFyZSBleGVjJ2Qgd2l0aAotCWFuIGFscmVhZHkgb3BlbiBmaWxlIChzdGRvdXQgZm9yIGV4YW1wbGUpIG9yIGZyb20gdGhlIFNWUjQgL3Byb2MKLQljYWxscyB0aGF0IHJldHVybiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgZm9yIG1hcHBlZCBhZGRyZXNzIHNwYWNlcy4KLQlBbGwgd2UgaGF2ZSB0byBkbyBpcyBvcGVuIHRoZSBmaWxlIGJ5IG5hbWUgYW5kIGNoZWNrIHRoZSB0d28gZmlsZQotCWRlc2NyaXB0b3JzIGZvciBhIG1hdGNoLCB3aGljaCBpcyBkb25lIGJ5IGNvbXBhcmluZyBtYWpvciZtaW5vcgotCWRldmljZSBudW1iZXJzIGFuZCBpbm9kZSBudW1iZXJzLgotCi1CVUdTCi0KLQkoRklYTUU6IGRvZXMgdGhpcyB3b3JrIGZvciBuZXR3b3Jrcz8pCi0JSXQgd29ya3MgZm9yIE5GUywgd2hpY2ggYXNzaWducyBhIGRldmljZSBudW1iZXIgdG8gZWFjaCBtb3VudC4KLQotKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotaW50IGZkbWF0Y2ggKGZkMSwgZmQyKQotCWludCBmZDE7Ci0JaW50IGZkMjsKLXsKLSAgc3RydWN0IHN0YXQgc2J1ZjE7Ci0gIHN0cnVjdCBzdGF0IHNidWYyOwotCi0gIGlmICgoZnN0YXQgKGZkMSwgJnNidWYxKSA9PSAwKSAmJgotICAgICAgKGZzdGF0IChmZDIsICZzYnVmMikgPT0gMCkgJiYKLSAgICAgIChzYnVmMS5zdF9kZXYgPT0gc2J1ZjIuc3RfZGV2KSAmJgotICAgICAgKHNidWYxLnN0X2lubyA9PSBzYnVmMi5zdF9pbm8pKQotICAgIHsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvZmxvYXRmb3JtYXQuYyBiL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDhmMTZkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qIElFRUUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCByb3V0aW5lcywgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKLSNpbmNsdWRlIDxtYXRoLmg+CQkvKiBsZGV4cCAqLwotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWVtY3B5ICh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKTsKLWV4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKm1lbWNweSAoKTsKLWV4dGVybiBjaGFyICptZW1zZXQgKCk7Ci0jZW5kaWYKLQotLyogVGhlIG9kZHMgdGhhdCBDSEFSX0JJVCB3aWxsIGJlIGFueXRoaW5nIGJ1dCA4IGFyZSBsb3cgZW5vdWdoIHRoYXQgSSdtIG5vdAotICAgZ29pbmcgdG8gYm90aGVyIHdpdGggdHJ5aW5nIHRvIG11Y2sgYXJvdW5kIHdpdGggd2hldGhlciBpdCBpcyBkZWZpbmVkIGluCi0gICBhIHN5c3RlbSBoZWFkZXIsIHdoYXQgd2UgZG8gaWYgbm90LCBldGMuICAqLwotI2RlZmluZSBGTE9BVEZPUk1BVF9DSEFSX0JJVCA4Ci0KLS8qIGZsb2F0Zm9ybWF0cyBmb3IgSUVFRSBzaW5nbGUgYW5kIGRvdWJsZSwgYmlnIGFuZCBsaXR0bGUgZW5kaWFuLiAgKi8KLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9iaWcgPQotewotICBmbG9hdGZvcm1hdF9iaWcsIDMyLCAwLCAxLCA4LCAxMjcsIDI1NSwgOSwgMjMsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGUgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGUsIDMyLCAwLCAxLCA4LCAxMjcsIDI1NSwgOSwgMjMsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcgPQotewotICBmbG9hdGZvcm1hdF9iaWcsIDY0LCAwLCAxLCAxMSwgMTAyMywgMjA0NywgMTIsIDUyLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlID0KLXsKLSAgZmxvYXRmb3JtYXRfbGl0dGxlLCA2NCwgMCwgMSwgMTEsIDEwMjMsIDIwNDcsIDEyLCA1MiwgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotCi0vKiBmbG9hdGZvcm1hdCBmb3IgSUVFRSBkb3VibGUsIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciwgd2l0aCBiaWcgZW5kaWFuIHdvcmQKLSAgIG9yZGVyaW5nLCBhcyBvbiB0aGUgQVJNLiAgKi8KLQotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZCA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZCwgNjQsIDAsIDEsIDExLCAxMDIzLCAyMDQ3LCAxMiwgNTIsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLQotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2kzODdfZXh0ID0KLXsKLSAgZmxvYXRmb3JtYXRfbGl0dGxlLCA4MCwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAxNiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTY4ODgxX2V4dCA9Ci17Ci0gIC8qIE5vdGUgdGhhdCB0aGUgYml0cyBmcm9tIDE2IHRvIDMxIGFyZSB1bnVzZWQuICAqLwotICBmbG9hdGZvcm1hdF9iaWcsIDk2LCAwLCAxLCAxNSwgMHgzZmZmLCAweDdmZmYsIDMyLCA2NCwgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pOTYwX2V4dCA9Ci17Ci0gIC8qIE5vdGUgdGhhdCB0aGUgYml0cyBmcm9tIDAgdG8gMTUgYXJlIHVudXNlZC4gICovCi0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgOTYsIDE2LCAxNywgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTg4MTEwX2V4dCA9Ci17Ci0jaWZkZWYgSEFSUklTX0ZMT0FUX0ZPUk1BVAotICAvKiBIYXJyaXMgdXNlcyByYXcgZm9ybWF0IDEyOCBieXRlcyBsb25nLCBidXQgdGhlIG51bWJlciBpcyBqdXN0IGFuIGllZWUKLSAgICAgZG91YmxlLCBhbmQgdGhlIGxhc3QgNjQgYml0cyBhcmUgd2FzdGVkLiAqLwotICBmbG9hdGZvcm1hdF9iaWcsMTI4LCAwLCAxLCAxMSwgIDB4M2ZmLCAgMHg3ZmYsIDEyLCA1MiwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X25vCi0jZWxzZQotICBmbG9hdGZvcm1hdF9iaWcsIDgwLCAwLCAxLCAxNSwgMHgzZmZmLCAweDdmZmYsIDE2LCA2NCwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotI2VuZGlmIC8qIEhBUlJJU19GTE9BVF9GT1JNQVQgKi8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfYXJtX2V4dCA9Ci17Ci0gIC8qIEJpdHMgMSB0byAxNiBhcmUgdW51c2VkLiAgKi8KLSAgZmxvYXRmb3JtYXRfYmlnLCA5NiwgMCwgMTcsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMzIsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi19OwotDAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2ZpZWxkIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwKLQkJCQkJZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzLAotCQkJCQl1bnNpZ25lZCBpbnQsCi0JCQkJCXVuc2lnbmVkIGludCwKLQkJCQkJdW5zaWduZWQgaW50KSk7Ci0KLS8qIEV4dHJhY3QgYSBmaWVsZCB3aGljaCBzdGFydHMgYXQgU1RBUlQgYW5kIGlzIExFTiBieXRlcyBsb25nLiAgREFUQSBhbmQKLSAgIFRPVEFMX0xFTiBhcmUgdGhlIHRoaW5nIHdlIGFyZSBleHRyYWN0aW5nIGl0IGZyb20sIGluIGJ5dGVvcmRlciBPUkRFUi4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X2ZpZWxkIChkYXRhLCBvcmRlciwgdG90YWxfbGVuLCBzdGFydCwgbGVuKQotICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMgb3JkZXI7Ci0gICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW47Ci0gICAgIHVuc2lnbmVkIGludCBzdGFydDsKLSAgICAgdW5zaWduZWQgaW50IGxlbjsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXN1bHQ7Ci0gIHVuc2lnbmVkIGludCBjdXJfYnl0ZTsKLSAgaW50IGN1cl9iaXRzaGlmdDsKLQotICAvKiBTdGFydCBhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLwotICBjdXJfYnl0ZSA9IChzdGFydCArIGxlbikgLyBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLSAgICBjdXJfYnl0ZSA9ICh0b3RhbF9sZW4gLyBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBjdXJfYnl0ZSAtIDE7Ci0gIGN1cl9iaXRzaGlmdCA9Ci0gICAgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgcmVzdWx0ID0gKihkYXRhICsgY3VyX2J5dGUpID4+ICgtY3VyX2JpdHNoaWZ0KTsKLSAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgICsrY3VyX2J5dGU7Ci0gIGVsc2UKLSAgICAtLWN1cl9ieXRlOwotCi0gIC8qIE1vdmUgdG93YXJkcyB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIHdoaWxlICgodW5zaWduZWQgaW50KSBjdXJfYml0c2hpZnQgPCBsZW4pCi0gICAgewotICAgICAgaWYgKGxlbiAtIGN1cl9iaXRzaGlmdCA8IEZMT0FURk9STUFUX0NIQVJfQklUKQotCS8qIFRoaXMgaXMgdGhlIGxhc3QgYnl0ZTsgemVybyBvdXQgdGhlIGJpdHMgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mCi0JICAgdGhpcyBmaWVsZC4gICovCi0JcmVzdWx0IHw9Ci0JICAoKihkYXRhICsgY3VyX2J5dGUpICYgKCgxIDw8IChsZW4gLSBjdXJfYml0c2hpZnQpKSAtIDEpKQotCSAgICA8PCBjdXJfYml0c2hpZnQ7Ci0gICAgICBlbHNlCi0JcmVzdWx0IHw9ICooZGF0YSArIGN1cl9ieXRlKSA8PCBjdXJfYml0c2hpZnQ7Ci0gICAgICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gICAgICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotCSsrY3VyX2J5dGU7Ci0gICAgICBlbHNlCi0JLS1jdXJfYnl0ZTsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0gIAotI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotLyogQ29udmVydCBmcm9tIEZNVCB0byBhIGRvdWJsZS4KLSAgIEZST00gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGV4dGVuZGVkIGZsb2F0LgotICAgU3RvcmUgdGhlIGRvdWJsZSBpbiAqVE8uICAqLwotCi12b2lkCi1mbG9hdGZvcm1hdF90b19kb3VibGUgKGZtdCwgZnJvbSwgdG8pCi0gICAgIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqZm10OwotICAgICBjaGFyICpmcm9tOwotICAgICBkb3VibGUgKnRvOwotewotICB1bnNpZ25lZCBjaGFyICp1ZnJvbSA9ICh1bnNpZ25lZCBjaGFyICopZnJvbTsKLSAgZG91YmxlIGR0bzsKLSAgbG9uZyBleHBvbmVudDsKLSAgdW5zaWduZWQgbG9uZyBtYW50OwotICB1bnNpZ25lZCBpbnQgbWFudF9iaXRzLCBtYW50X29mZjsKLSAgaW50IG1hbnRfYml0c19sZWZ0OwotICBpbnQgc3BlY2lhbF9leHBvbmVudDsJCS8qIEl0J3MgYSBOYU4sIGRlbm9ybSBvciB6ZXJvICovCi0KLSAgZXhwb25lbnQgPSBnZXRfZmllbGQgKHVmcm9tLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsCi0JCQlmbXQtPmV4cF9zdGFydCwgZm10LT5leHBfbGVuKTsKLSAgLyogTm90ZSB0aGF0IGlmIGV4cG9uZW50IGluZGljYXRlcyBhIE5hTiwgd2UgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIHVzZWZ1bAotICAgICAobm90IGtub3dpbmcgaWYgdGhlIGhvc3QgaGFzIE5hTidzLCBvciBob3cgdG8gYnVpbGQgb25lKS4gIFNvIGl0IHdpbGwKLSAgICAgZW5kIHVwIGFzIGFuIGluZmluaXR5IG9yIHNvbWV0aGluZyBjbG9zZTsgdGhhdCBpcyBPSy4gICovCi0KLSAgbWFudF9iaXRzX2xlZnQgPSBmbXQtPm1hbl9sZW47Ci0gIG1hbnRfb2ZmID0gZm10LT5tYW5fc3RhcnQ7Ci0gIGR0byA9IDAuMDsKLQotICBzcGVjaWFsX2V4cG9uZW50ID0gZXhwb25lbnQgPT0gMCB8fCAodW5zaWduZWQgbG9uZykgZXhwb25lbnQgPT0gZm10LT5leHBfbmFuOwotCi0gIC8qIERvbid0IGJpYXMgemVybydzLCBkZW5vcm1zIG9yIE5hTnMuICAqLwotICBpZiAoIXNwZWNpYWxfZXhwb25lbnQpCi0gICAgZXhwb25lbnQgLT0gZm10LT5leHBfYmlhczsKLQotICAvKiBCdWlsZCB0aGUgcmVzdWx0IGFsZ2VicmFpY2FsbHkuICBNaWdodCBnbyBpbmZpbml0ZSwgdW5kZXJmbG93LCBldGM7Ci0gICAgIHdobyBjYXJlcy4gKi8KLQotICAvKiBJZiB0aGlzIGZvcm1hdCB1c2VzIGEgaGlkZGVuIGJpdCwgZXhwbGljaXRseSBhZGQgaXQgaW4gbm93LiAgT3RoZXJ3aXNlLAotICAgICBpbmNyZW1lbnQgdGhlIGV4cG9uZW50IGJ5IG9uZSB0byBhY2NvdW50IGZvciB0aGUgaW50ZWdlciBiaXQuICAqLwotCi0gIGlmICghc3BlY2lhbF9leHBvbmVudCkKLSAgICB7Ci0gICAgICBpZiAoZm10LT5pbnRiaXQgPT0gZmxvYXRmb3JtYXRfaW50Yml0X25vKQotCWR0byA9IGxkZXhwICgxLjAsIGV4cG9uZW50KTsKLSAgICAgIGVsc2UKLQlleHBvbmVudCsrOwotICAgIH0KLQotICB3aGlsZSAobWFudF9iaXRzX2xlZnQgPiAwKQotICAgIHsKLSAgICAgIG1hbnRfYml0cyA9IG1pbiAobWFudF9iaXRzX2xlZnQsIDMyKTsKLQotICAgICAgbWFudCA9IGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKLQkJCSBtYW50X29mZiwgbWFudF9iaXRzKTsKLQotICAgICAgZHRvICs9IGxkZXhwICgoZG91YmxlKW1hbnQsIGV4cG9uZW50IC0gbWFudF9iaXRzKTsKLSAgICAgIGV4cG9uZW50IC09IG1hbnRfYml0czsKLSAgICAgIG1hbnRfb2ZmICs9IG1hbnRfYml0czsKLSAgICAgIG1hbnRfYml0c19sZWZ0IC09IG1hbnRfYml0czsKLSAgICB9Ci0KLSAgLyogTmVnYXRlIGl0IGlmIG5lZ2F0aXZlLiAgKi8KLSAgaWYgKGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5zaWduX3N0YXJ0LCAxKSkKLSAgICBkdG8gPSAtZHRvOwotICAqdG8gPSBkdG87Ci19Ci0MCi1zdGF0aWMgdm9pZCBwdXRfZmllbGQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMsCi0JCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJICAgICAgIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZykpOwotCi0vKiBTZXQgYSBmaWVsZCB3aGljaCBzdGFydHMgYXQgU1RBUlQgYW5kIGlzIExFTiBieXRlcyBsb25nLiAgREFUQSBhbmQKLSAgIFRPVEFMX0xFTiBhcmUgdGhlIHRoaW5nIHdlIGFyZSBleHRyYWN0aW5nIGl0IGZyb20sIGluIGJ5dGVvcmRlciBPUkRFUi4gICovCi1zdGF0aWMgdm9pZAotcHV0X2ZpZWxkIChkYXRhLCBvcmRlciwgdG90YWxfbGVuLCBzdGFydCwgbGVuLCBzdHVmZl90b19wdXQpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBvcmRlcjsKLSAgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbjsKLSAgICAgdW5zaWduZWQgaW50IHN0YXJ0OwotICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICB1bnNpZ25lZCBsb25nIHN0dWZmX3RvX3B1dDsKLXsKLSAgdW5zaWduZWQgaW50IGN1cl9ieXRlOwotICBpbnQgY3VyX2JpdHNoaWZ0OwotCi0gIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIGN1cl9ieXRlID0gKHN0YXJ0ICsgbGVuKSAvIEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgIGN1cl9ieXRlID0gKHRvdGFsX2xlbiAvIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIGN1cl9ieXRlIC0gMTsKLSAgY3VyX2JpdHNoaWZ0ID0KLSAgICAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIEZMT0FURk9STUFUX0NIQVJfQklUOwotICAqKGRhdGEgKyBjdXJfYnl0ZSkgJj0KLSAgICB+KCgoMSA8PCAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSkgLSAxKSA8PCAoLWN1cl9iaXRzaGlmdCkpOwotICAqKGRhdGEgKyBjdXJfYnl0ZSkgfD0KLSAgICAoc3R1ZmZfdG9fcHV0ICYgKCgxIDw8IEZMT0FURk9STUFUX0NIQVJfQklUKSAtIDEpKSA8PCAoLWN1cl9iaXRzaGlmdCk7Ci0gIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLSAgICArK2N1cl9ieXRlOwotICBlbHNlCi0gICAgLS1jdXJfYnl0ZTsKLQotICAvKiBNb3ZlIHRvd2FyZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLwotICB3aGlsZSAoKHVuc2lnbmVkIGludCkgY3VyX2JpdHNoaWZ0IDwgbGVuKQotICAgIHsKLSAgICAgIGlmIChsZW4gLSBjdXJfYml0c2hpZnQgPCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkKLQl7Ci0JICAvKiBUaGlzIGlzIHRoZSBsYXN0IGJ5dGUuICAqLwotCSAgKihkYXRhICsgY3VyX2J5dGUpICY9Ci0JICAgIH4oKDEgPDwgKGxlbiAtIGN1cl9iaXRzaGlmdCkpIC0gMSk7Ci0JICAqKGRhdGEgKyBjdXJfYnl0ZSkgfD0gKHN0dWZmX3RvX3B1dCA+PiBjdXJfYml0c2hpZnQpOwotCX0KLSAgICAgIGVsc2UKLQkqKGRhdGEgKyBjdXJfYnl0ZSkgPSAoKHN0dWZmX3RvX3B1dCA+PiBjdXJfYml0c2hpZnQpCi0JCQkgICAgICAmICgoMSA8PCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSAxKSk7Ci0gICAgICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gICAgICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotCSsrY3VyX2J5dGU7Ci0gICAgICBlbHNlCi0JLS1jdXJfYnl0ZTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBjb252ZXJzZTogY29udmVydCB0aGUgZG91YmxlICpGUk9NIHRvIGFuIGV4dGVuZGVkIGZsb2F0Ci0gICBhbmQgc3RvcmUgd2hlcmUgVE8gcG9pbnRzLiAgTmVpdGhlciBGUk9NIG5vciBUTyBoYXZlIGFueSBhbGlnbm1lbnQKLSAgIHJlc3RyaWN0aW9ucy4gICovCi0KLXZvaWQKLWZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlIChmbXQsIGZyb20sIHRvKQotICAgICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKmZtdDsKLSAgICAgZG91YmxlICpmcm9tOwotICAgICBjaGFyICp0bzsKLXsKLSAgZG91YmxlIGRmcm9tOwotICBpbnQgZXhwb25lbnQ7Ci0gIGRvdWJsZSBtYW50OwotICB1bnNpZ25lZCBpbnQgbWFudF9iaXRzLCBtYW50X29mZjsKLSAgaW50IG1hbnRfYml0c19sZWZ0OwotICB1bnNpZ25lZCBjaGFyICp1dG8gPSAodW5zaWduZWQgY2hhciAqKXRvOwotCi0gIG1lbWNweSAoJmRmcm9tLCBmcm9tLCBzaXplb2YgKGRmcm9tKSk7Ci0gIG1lbXNldCAodXRvLCAwLCBmbXQtPnRvdGFsc2l6ZSAvIEZMT0FURk9STUFUX0NIQVJfQklUKTsKLSAgaWYgKGRmcm9tID09IDApCi0gICAgcmV0dXJuOwkJCS8qIFJlc3VsdCBpcyB6ZXJvICovCi0gIGlmIChkZnJvbSAhPSBkZnJvbSkKLSAgICB7Ci0gICAgICAvKiBGcm9tIGlzIE5hTiAqLwotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5leHBfc3RhcnQsCi0JCSBmbXQtPmV4cF9sZW4sIGZtdC0+ZXhwX25hbik7Ci0gICAgICAvKiBCZSBzdXJlIGl0J3Mgbm90IGluZmluaXR5LCBidXQgTmFOIHZhbHVlIGlzIGlycmVsICovCi0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPm1hbl9zdGFydCwKLQkJIDMyLCAxKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSWYgbmVnYXRpdmUsIHNldCB0aGUgc2lnbiBiaXQuICAqLwotICBpZiAoZGZyb20gPCAwKQotICAgIHsKLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+c2lnbl9zdGFydCwgMSwgMSk7Ci0gICAgICBkZnJvbSA9IC1kZnJvbTsKLSAgICB9Ci0KLSAgLyogSG93IHRvIHRlbGwgYW4gaW5maW5pdHkgZnJvbSBhbiBvcmRpbmFyeSBudW1iZXI/ICBGSVhNRS1zb21lZGF5ICovCi0KLSAgbWFudCA9IGZyZXhwIChkZnJvbSwgJmV4cG9uZW50KTsKLSAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5leHBfc3RhcnQsIGZtdC0+ZXhwX2xlbiwKLQkgICAgIGV4cG9uZW50ICsgZm10LT5leHBfYmlhcyAtIDEpOwotCi0gIG1hbnRfYml0c19sZWZ0ID0gZm10LT5tYW5fbGVuOwotICBtYW50X29mZiA9IGZtdC0+bWFuX3N0YXJ0OwotICB3aGlsZSAobWFudF9iaXRzX2xlZnQgPiAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbWFudF9sb25nOwotICAgICAgbWFudF9iaXRzID0gbWFudF9iaXRzX2xlZnQgPCAzMiA/IG1hbnRfYml0c19sZWZ0IDogMzI7Ci0KLSAgICAgIG1hbnQgKj0gNDI5NDk2NzI5Ni4wOwotICAgICAgbWFudF9sb25nID0gKHVuc2lnbmVkIGxvbmcpbWFudDsKLSAgICAgIG1hbnQgLT0gbWFudF9sb25nOwotCi0gICAgICAvKiBJZiB0aGUgaW50ZWdlciBiaXQgaXMgaW1wbGljaXQsIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGl0LgotCSBJZiB3ZSBhcmUgZGlzY2FyZGluZyBhIHplcm8sIHdlIHNob3VsZCBiZSAoYnV0IGFyZSBub3QpIGNyZWF0aW5nCi0JIGEgZGVub3JtYWxpemVkCW51bWJlciB3aGljaCBtZWFucyBhZGp1c3RpbmcgdGhlIGV4cG9uZW50Ci0JIChJIHRoaW5rKS4gICovCi0gICAgICBpZiAoKHVuc2lnbmVkIGludCkgbWFudF9iaXRzX2xlZnQgPT0gZm10LT5tYW5fbGVuCi0JICAmJiBmbXQtPmludGJpdCA9PSBmbG9hdGZvcm1hdF9pbnRiaXRfbm8pCi0JewotCSAgbWFudF9sb25nICY9IDB4N2ZmZmZmZmY7Ci0JICBtYW50X2JpdHMgLT0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChtYW50X2JpdHMgPCAzMikKLQl7Ci0JICAvKiBUaGUgYml0cyB3ZSB3YW50IGFyZSBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBNQU5UX0JJVFMgYml0cyBvZgotCSAgICAgbWFudF9sb25nLiAgTW92ZSB0aGVtIHRvIHRoZSBsZWFzdCBzaWduaWZpY2FudC4gICovCi0JICBtYW50X2xvbmcgPj49IDMyIC0gbWFudF9iaXRzOwotCX0KLQotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+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+IHFfZm9ydyA9IGVsZW0gLT4gcV9mb3J3OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21ha2VmaWxlLnZtcyBiL2xpYmliZXJ0eS9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWI1MTIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSB1bmRlciBvcGVuVk1TL0FscGhhCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQotIwotIwotCi1PQkpTPWJjb3B5Lm9iaixiY21wLm9iaixnZXRvcHQub2JqLG9ic3RhY2sub2JqLHhleGl0Lm9iaix4bWFsbG9jLm9iaixoZXgub2JqLFwKLSAgIGdldG9wdDEub2JqLGNwbHVzLWRlbS5vYmosc3RybmNhc2VjbXAub2JqLHN0cmNhc2VjbXAub2JqLHN0cmR1cC5vYmosXAotICAgY29uY2F0Lm9iaixnZXRydW50aW1lLm9iaixnZXRwYWdlc2l6ZS5vYmosYWxsb2NhLm9iaix4c3RyZXJyb3Iub2JqLFwKLSAgIHhzdHJkdXAub2JqLHhhdGV4aXQub2JqLGNob29zZS10ZW1wLm9iaixmbm1hdGNoLm9iaixvYmphbGxvYy5vYmoKLQotaWZlcSAoJChDQyksZ2NjKQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkKLWVsc2UKLSMgYXNzdW1lIGRlYyBjCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKS9kZWZpbmU9KCJjb25zdD0iKS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYykKLWVuZGlmCi0KLWxpYmliZXJ0eS5vbGI6IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJpYmVydHkgKi5vYmoKLQotY29uZmlnLmg6IGNvbmZpZy5oLXZtcwotCSQoQ1ApICQ8ICRACi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgY29uZmlnLmg7Ci0JJChSTSkgKi5vYmo7Ci0JJChSTSkgbGliaWJlcnR5Lm9sYjsKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jaHIuYyBiL2xpYmliZXJ0eS9tZW1jaHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlMzAwMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtY2hyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotRlVOQ1RJT04KLQk8PG1lbWNocj4+LS0tZmluZCBjaGFyYWN0ZXIgaW4gbWVtb3J5Ci0KLUlOREVYCi0JbWVtY2hyCi0KLUFOU0lfU1lOT1BTSVMKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0Jdm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKjxbc3JjXT4sIGludCA8W2NdPiwgc2l6ZV90IDxbbGVuZ3RoXT4pOwotCi1UUkFEX1NZTk9QU0lTCi0JI2luY2x1ZGUgPHN0cmluZy5oPgotCXZvaWQgKm1lbWNocig8W3NyY10+LCA8W2NdPiwgPFtsZW5ndGhdPikKLQl2b2lkICo8W3NyY10+OwotCXZvaWQgKjxbY10+OwotCXNpemVfdCA8W2xlbmd0aF0+OwotCi1ERVNDUklQVElPTgotCVRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgbWVtb3J5IHN0YXJ0aW5nIGF0IDw8Kjxbc3JjXT4+PiBmb3IgdGhlCi0JY2hhcmFjdGVyIDxbY10+LiAgVGhlIHNlYXJjaCBvbmx5IGVuZHMgd2l0aCB0aGUgZmlyc3QKLQlvY2N1cnJlbmNlIG9mIDxbY10+LCBvciBhZnRlciA8W2xlbmd0aF0+IGNoYXJhY3RlcnM7IGluCi0JcGFydGljdWxhciwgPDxOVUxMPj4gZG9lcyBub3QgdGVybWluYXRlIHRoZSBzZWFyY2guCi0KLVJFVFVSTlMKLQlJZiB0aGUgY2hhcmFjdGVyIDxbY10+IGlzIGZvdW5kIHdpdGhpbiA8W2xlbmd0aF0+IGNoYXJhY3RlcnMKLQlvZiA8PCo8W3NyY10+Pj4sIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGlzIHJldHVybmVkLiBJZgotCTxbY10+IGlzIG5vdCBmb3VuZCwgdGhlbiA8PE5VTEw+PiBpcyByZXR1cm5lZC4gCQotCi1QT1JUQUJJTElUWQotPDxtZW1jaHI+PiAgcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KLQotUVVJQ0tSRUYKLQltZW1jaHIgYW5zaSBwdXJlCi0KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotbWVtY2hyIChzcmNfdm9pZCwgYywgbGVuZ3RoKQotICAgICByZWdpc3RlciBjb25zdCBQVFIgc3JjX3ZvaWQ7Ci0gICAgIGludCBjOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyY192b2lkOwotICAKLSAgd2hpbGUgKC0tbGVuZ3RoID49IDApCi0gIHsKLSAgICBpZiAoKnNyYyA9PSBjKQotICAgICByZXR1cm4gKFBUUilzcmM7Ci0gICAgc3JjKys7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtY21wLmMgYi9saWJpYmVydHkvbWVtY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2FlMGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogbWVtY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JbWVtY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zCi0KLVNZTk9QU0lTCi0JaW50IG1lbWNtcCAoY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8sIHNpemVfdCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQlDb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucyBhbmQgcmV0dXJuIGxlc3MgdGhhbiwKLQllcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8sIGFjY29yZGluZyB0byBsZXhpY29ncmFwaGljYWwKLQlvcmRlcmluZyBvZiB0aGUgY29tcGFyZWQgcmVnaW9ucy4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLWludAotREVGVU4obWVtY21wLCAoc3RyMSwgc3RyMiwgY291bnQpLAotICAgICAgY29uc3QgUFRSIHN0cjEgQU5EIGNvbnN0IFBUUiBzdHIyIEFORCBzaXplX3QgY291bnQpCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMxID0gKHVuc2lnbmVkIGNoYXIqKXN0cjE7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMyID0gKHVuc2lnbmVkIGNoYXIqKXN0cjI7Ci0KLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgqczErKyAhPSAqczIrKykKLQkgIHJldHVybiBzMVstMV0gPCBzMlstMV0gPyAtMSA6IDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbWNweS5jIGIvbGliaWJlcnR5L21lbWNweS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDdhOWY1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1jcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIG1lbWNweSAodGhlIHN0YW5kYXJkIEMgZnVuY3Rpb24pCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQltZW1jcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdGFyeSBsZW5ndGgKLQotU1lOT1BTSVMKLQl2b2lkKiBtZW1jcHkgKHZvaWQgKm91dCwgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBuKTsKLQotREVTQ1JJUFRJT04KLQlDb3B5IExFTkdUSCBieXRlcyBmcm9tIG1lbW9yeSByZWdpb24gcG9pbnRlZCB0byBieSBJTiB0byBtZW1vcnkKLQlyZWdpb24gcG9pbnRlZCB0byBieSBPVVQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLURFRlVOKG1lbWNweSwgKG91dCwgaW4sIGxlbmd0aCksIFBUUiBvdXQgQU5EIGNvbnN0IFBUUiBpbiBBTkQgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBiY29weShpbiwgb3V0LCBsZW5ndGgpOwotICAgIHJldHVybiBvdXQ7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtbW92ZS5jIGIvbGliaWJlcnR5L21lbW1vdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YzMyNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtbW92ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogV3JhcHBlciB0byBpbXBsZW1lbnQgQU5TSSBDJ3MgbWVtbW92ZSB1c2luZyBCU0QncyBiY29weS4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLVBlciBCb3RobmVyLiAqLwotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotUFRSCi1tZW1tb3ZlIChzMSwgczIsIG4pCi0gICAgIFBUUiBzMTsKLSAgICAgY29uc3QgUFRSIHMyOwotICAgICBzaXplX3QgbjsKLXsKLSAgYmNvcHkgKHMyLCBzMSwgbik7Ci0gIHJldHVybiBzMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1zZXQuYyBiL2xpYmliZXJ0eS9tZW1zZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1NDgzMS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBtZW1zZXQKLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLURFRlVOKG1lbXNldCwgKGRlc3QsIHZhbCwgbGVuKSwKLSAgICAgIFBUUiBkZXN0IEFORCByZWdpc3RlciBpbnQgdmFsIEFORCByZWdpc3RlciBzaXplX3QgbGVuKQotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciopZGVzdDsKLSAgd2hpbGUgKGxlbi0tID4gMCkKLSAgICAqcHRyKysgPSB2YWw7Ci0gIHJldHVybiBkZXN0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21rc3RlbXBzLmMgYi9saWJpYmVydHkvbWtzdGVtcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMTZhMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWtzdGVtcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIG1rc3RlbXAuYyBmcm9tIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFdlIG5lZWQgdG8gcHJvdmlkZSBhIHR5cGUgZm9yIGdjY191aW50NjRfdC4gICovCi0jaWZkZWYgX19HTlVDX18KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGdjY191aW50NjRfdDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZ2NjX3VpbnQ2NF90OwotI2VuZGlmCi0KLSNpZm5kZWYgVE1QX01BWAotI2RlZmluZSBUTVBfTUFYIDE2Mzg0Ci0jZW5kaWYKLQotLyogR2VuZXJhdGUgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmcm9tIFRFTVBMQVRFLgotCi0gICBURU1QTEFURSBoYXMgdGhlIGZvcm06Ci0KLSAgIDxwYXRoPi9jY1hYWFhYWDxzdWZmaXg+Ci0KLSAgIFNVRkZJWF9MRU4gdGVsbHMgdXMgaG93IGxvbmcgPHN1ZmZpeD4gaXMgKGl0IGNhbiBiZSB6ZXJvIGxlbmd0aCkuCi0KLSAgIFRoZSBsYXN0IHNpeCBjaGFyYWN0ZXJzIG9mIFRFTVBMQVRFIGJlZm9yZSA8c3VmZml4PiBtdXN0IGJlICJYWFhYWFgiOwotICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBmaWxlbmFtZSB1bmlxdWUuCi0KLSAgIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb3BlbiBvbiB0aGUgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gICovCi1pbnQKLW1rc3RlbXBzICh0ZW1wbGF0ZSwgc3VmZml4X2xlbikKLSAgICAgY2hhciAqdGVtcGxhdGU7Ci0gICAgIGludCBzdWZmaXhfbGVuOwotewotICBzdGF0aWMgY29uc3QgY2hhciBsZXR0ZXJzW10KLSAgICA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSI7Ci0gIHN0YXRpYyBnY2NfdWludDY0X3QgdmFsdWU7Ci0jaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgc3RydWN0IHRpbWV2YWwgdHY7Ci0jZW5kaWYKLSAgY2hhciAqWFhYWFhYOwotICBzaXplX3QgbGVuOwotICBpbnQgY291bnQ7Ci0KLSAgbGVuID0gc3RybGVuICh0ZW1wbGF0ZSk7Ci0KLSAgaWYgKChpbnQpIGxlbiA8IDYgKyBzdWZmaXhfbGVuCi0gICAgICB8fCBzdHJuY21wICgmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dLCAiWFhYWFhYIiwgNikpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBYWFhYWFggPSAmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dOwotCi0jaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgLyogR2V0IHNvbWUgbW9yZSBvciBsZXNzIHJhbmRvbSBkYXRhLiAgKi8KLSAgZ2V0dGltZW9mZGF5ICgmdHYsIE5VTEwpOwotICB2YWx1ZSArPSAoKGdjY191aW50NjRfdCkgdHYudHZfdXNlYyA8PCAxNikgXiB0di50dl9zZWMgXiBnZXRwaWQgKCk7Ci0jZWxzZQotICB2YWx1ZSArPSBnZXRwaWQgKCk7Ci0jZW5kaWYKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBUTVBfTUFYOyArK2NvdW50KQotICAgIHsKLSAgICAgIGdjY191aW50NjRfdCB2ID0gdmFsdWU7Ci0gICAgICBpbnQgZmQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIHJhbmRvbSBiaXRzLiAgKi8KLSAgICAgIFhYWFhYWFswXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbMV0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzJdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFszXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbNF0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzVdID0gbGV0dGVyc1t2ICUgNjJdOwotCi0gICAgICBmZCA9IG9wZW4gKHRlbXBsYXRlLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA2MDApOwotICAgICAgaWYgKGZkID49IDApCi0JLyogVGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuICAqLwotCXJldHVybiBmZDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJhbmRvbSB2YWx1ZS4gIEl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdGhlIG5leHQKLQkgVE1QX01BWCB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGFkZGluZyA3Nzc3IHRvIFZBTFVFIGFyZSBkaWZmZXJlbnQKLQkgd2l0aCAobW9kdWxlIDJeMzIpLiAgKi8KLSAgICAgIHZhbHVlICs9IDc3Nzc7Ci0gICAgfQotCi0gIC8qIFdlIHJldHVybiB0aGUgbnVsbCBzdHJpbmcgaWYgd2UgY2FuJ3QgZmluZCBhIHVuaXF1ZSBmaWxlIG5hbWUuICAqLwotICB0ZW1wbGF0ZVswXSA9ICdcMCc7Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tcHctY29uZmlnLmluIGIvbGliaWJlcnR5L21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjE4MDIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTVBXIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIGxpYmliZXJ0eS4KLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCi0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21wdy1tYWtlLnNlZCBiL2xpYmliZXJ0eS9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmE1ZTcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyBsaWJpYmVydHkncyBVbml4IG1ha2VmaWxlIHRvIE1QVyBzeW50YXguCi0KLSMgQ29tbWVudCBvdXQgYSB1c2VsZXNzIHRoaW5nLgotL15cLmFsd2F5c1wuL3MvXi8jLwotCi0jIFJlcGxhY2UgdGhlIGF1dG8tZ2VuZXJhdGVkIGxpc3Qgd2l0aCB0aGUgbGlzdCBvZiB3aGF0IHdlIGtub3cgd2UgbmVlZC4KLXMvYGNhdCBuZWVkZWQtbGlzdGAvIntvfSJhbGxvY2EuYy5vICJ7b30iYmNvcHkuYy5vICJ7b30iZ2V0cGFnZXNpemUuYy5vICJ7b30iaW5zcXVlLmMubyAie299Im1wdy5jLm8gIntvfSJzdHJjYXNlY21wLmMubyAie299InN0cmR1cC5jLm8gIntvfSJzdHJuY2FzZWNtcC5jLm8vCi0KLSMgUGFzdGUgaW4gc29tZSBkZXNpcmFibGUgZGVmaW5pdGlvbnMuCi0jIFRoZSBkZWZhdWx0IHJ1bGUgaGVyZSBjb21wbGV0ZWx5IHJlcGxhY2VzIHRoZSB0cmlja3kgc3R1ZmYgaW4gdGhlIFVuaXgKLSMgTWFrZWZpbGUuaW4uCi0vXiMjIyQvYVwKLVwKLUhERUZJTkVTID0gLWQgTkVFRF9zeXNfc2lnbGlzdCAtZCBORUVEX3N5c19lcnJsaXN0IC1kIE5FRURfYmFzZW5hbWUgLWQgTkVFRF9zdHJjYXNlY21wIC1kIE5FRURfc3RybmNhc2VjbXBcCi1JTkNMVURFUyA9IC1pIDogLWkge0lOQ0RJUn06IC1pIHtJTkNESVJ9Om1wdzogLWkgOjpleHRyYS1pbmNsdWRlOiAtaSAie3N9IlwKLVwKLS5jLm8gXFxPcHRpb24tZiAuY1wKLQl7Q0N9IEBEQVNIX0NfRkxBR0Age0RlcERpcn17RGVmYXVsdH0uYyB7TElCQ0ZMQUdTfSB7SU5DTFVERVN9IHtIREVGSU5FU30gQFNFR01FTlRfRkxBRyh7RGVmYXVsdH0pQCAtbyB7VGFyZ0Rpcn17RGVmYXVsdH0uYy5vXAotCi0jIFJlbW92ZSBkZXBlbmRlbmN5IG9uIG5lZWRlZC1saXN0LCB3aGljaCB3ZSBkb24ndCB1c2UuCi0vRE9fQUxTTyA9L3MvbmVlZGVkLWxpc3QvLwotCi0vSU5DRElSPS9zLyJ7c3JjZGlyfSJ7TVVMVElTUkNUT1B9OjovInt0b3BzcmNkaXJ9Ii8KLQotIyBXaGFjayBvdXQgdGhlIENPTVBJTEUuYyB0cmlja2luZXNzLgotL15DT01QSUxFLmMgLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgbXVsdGlkbyB0cmlja2luZXNzIGZyb20gdGhlICJhbGwiIHRhcmdldC4KLS9eYWxsIFxcT3B0aW9uLWYvLC9eJC9jXAotYWxsIFxcT3B0aW9uLWYge1RBUkdFVExJQn1cCi0KLQotIyBSZW1vdmUgdGhlIFJVTEUxL1JVTEUyIGNydWQuCi0vaWYgXFsvLC9maS9kCi0vXlJVTEUxID0vLC9SVUxFMiA9L2QKLS9SVUxFMi9zL1JVTEUyL1RBUkdFVExJQi8KLQotIyBEb24ndCB3YW50IGZkbWF0Y2ggZXZlci4KLXMvICJ7b30iZmRtYXRjaC5jLm8vLwotCi0jIEZpeCBwYXRocyB0byBnZW5lcmF0ZWQgZmlsZXMuCi0vY29uZmlnLmgvcy8ie3N9ImNvbmZpZy5oLyJ7b30iY29uZmlnLmgvCi0KLSMgV2hhY2sgb3V0IGNvbmZpZyByZWJ1aWxkIHJ1bGVzLgotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvLC9eJC9kCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXB3LmMgYi9saWJpYmVydHkvbXB3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2FlNDEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKiBNUFctVW5peCBjb21wYXRpYmlsaXR5IGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgdW5kZXIgTVBXLiAqLwotCi0jaW5jbHVkZSAibXB3LmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPFR5cGVzLmg+Ci0jaW5jbHVkZSA8RmlsZXMuaD4KLQotI2luY2x1ZGUgPFRpbWVyLmg+Ci0KLS8qIEluaXRpYWxpemUgdG8gMCBhdCBmaXJzdCwgdGhlbiBzZXQgdG8gZXJybm9fbWF4KCkgbGF0ZXIuICAqLwotCi1pbnQgc3lzX25lcnIgPSAwOwotCi0vKiBEZWJ1ZyBmbGFnIGZvciBwYXRobmFtZSBoYWNraW5nLiAgU2V0IHRoaXMgdG8gb25lIGFuZCByZWJ1aWxkLiAqLwotCi1pbnQgRGVidWdQSSA9IC0xOwotCi12b2lkCi1tcHdpZnlfZmlsZW5hbWUoY2hhciAqdW5peG5hbWUsIGNoYXIgKm1hY25hbWUpCi17Ci0gIGludCBpLCBqOwotCi0gIC8qIChzaG91bGQgdHJ1bmNhdGUgMjU1IGNoYXJzIGZyb20gZW5kIG9mIG5hbWUsIG5vdCBiZWdpbm5pbmcpICovCi0gIGlmIChzdHJsZW4gKHVuaXhuYW1lKSA+IDI1NSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQYXRobmFtZSBcIiVzXCIgaXMgdG9vIGxvbmcgZm9yIE1hY3MsIHRydW5jYXRpbmdcbiIsCi0JICAgICAgIHVuaXhuYW1lKTsKLSAgICB9Ci0gIGogPSAwOwotICAvKiBJZiB5b3UncmUgZ29pbmcgdG8gZW5kIHVwIHdpdGggb25lIG9yIG1vcmUgY29sb25zIGluIHRoZSBtaWRkbGUgb2YgYQotICAgICBwYXRoIGFmdGVyIGFuIGFsbC1Vbml4IHJlbGF0aXZlIHBhdGggaXMgdHJhbnNsYXRlZCwgeW91IG11c3QgYWRkIGEKLSAgICAgY29sb24gb24gdGhlIGZyb250LCBzbyB0aGF0IHRoZSBmaXJzdCBjb21wb25lbnQgaXMgbm90IHRob3VnaHQgdG8gYmUKLSAgICAgYSBkaXNrIG5hbWUuICAqLwotICBpZiAodW5peG5hbWVbMF0gIT0gJy8nICYmICEgc3RyY2hyICh1bml4bmFtZSwgJzonKSAmJiBzdHJjaHIgKHVuaXhuYW1lLCAnLycpKQotICAgIHsKLSAgICAgIG1hY25hbWVbaisrXSA9ICc6JzsKLSAgICB9Ci0gIGZvciAoaSA9IDA7IHVuaXhuYW1lW2ldICE9ICdcMCcgJiYgaSA8IDI1NTsgKytpKQotICAgIHsKLSAgICAgIGlmIChpID09IDAgJiYgdW5peG5hbWVbaV0gPT0gJy8nKQotCXsKLQkgIGlmIChzdHJuY21wICh1bml4bmFtZSwgIi90bXAvIiwgNSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEEgdGVtcG9yYXJ5IG5hbWUsIG1ha2UgYSBtb3JlIE1hYy1mbGF2b3JlZCB0bXBuYW1lLiAqLwotCSAgICAgIC8qIEEgYmV0dGVyIGNob2ljZSB3b3VsZCBiZSB7Qm9vdH1UcmFzaDpmb28sIGJ1dAotCQkgdGhhdCB3b3VsZCByZXF1aXJlIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgdGhlCi0JCSBib290IGRpc2sncyBhbmQgdHJhc2hjYW4ncyBuYW1lLiAgQW5vdGhlciBvcHRpb24KLQkJIHdvdWxkIGJlIHRvIGhhdmUgYW4gZW52IHZhciwgc28gdXNlciBjYW4gcG9pbnQgaXQKLQkJIGF0IGEgcmFtZGlzay4gKi8KLQkgICAgICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ3QnOwotCSAgICAgIG1hY25hbWVbaisrXSA9ICdtJzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAncCc7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ18nOwotCSAgICAgIGkgKz0gNDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRG9uJ3QgY29weSB0aGUgbGVhZGluZyBzbGFzaC4gKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICc6JyAmJiB1bml4bmFtZVtpKzFdID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBpICs9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJy4nICYmIHVuaXhuYW1lW2krMV0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgIGkgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnLicgJiYgdW5peG5hbWVbaSsxXSA9PSAnLicgJiYgdW5peG5hbWVbaSsyXSA9PSAnLycpCi0JewotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgaSArPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1hY25hbWVbaisrXSA9IHVuaXhuYW1lW2ldOwotCX0KLSAgICB9Ci0gIG1hY25hbWVbal0gPSAnXDAnOwotICAvKiBBbGxvdyBmb3IgZ2V0dGluZyB0aGUgZGVidWcgZmxhZyBmcm9tIGFuIGVudiB2YXI7IHF1aXRlIHVzZWZ1bC4gKi8KLSAgaWYgKERlYnVnUEkgPCAwKQotICAgIERlYnVnUEkgPSAoKihnZXRlbnYgKCJERUJVR19QQVRITkFNRVMiKSkgPT0gJzEnID8gMSA6IDApOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIE1hZGUgXCIlc1wiXG4iLCB1bml4bmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIGludG8gXCIlc1wiXG4iLCBtYWNuYW1lKTsKLSAgICB9Ci19Ci0KLS8qIE1QVy1mbGF2b3JlZCBiYXNlbmFtZSBmaW5kZXIuICovCi0KLWNoYXIgKgotbXB3X2Jhc2VuYW1lIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lKysgPT0gJzonKQotCXsKLQkgIGJhc2UgPSBuYW1lOwotCX0KLSAgICB9Ci0gIHJldHVybiBiYXNlOwotfQotCi0vKiBNaXhlZCBNUFcvVW5peCBiYXNlbmFtZSBmaW5kZXIuICBUaGlzIGNhbiBiZSBsZWQgYXN0cmF5IGJ5Ci0gICBmaWxlbmFtZXMgd2l0aCBzbGFzaGVzIGluIHRoZW0gYW5kIGNvbWUgdXAgd2l0aCBhIGJhc2VuYW1lIHRoYXQKLSAgIGVpdGhlciBjb3JyZXNwb25kcyB0byBubyBmaWxlIG9yICh3b3JzZSkgdG8gc29tZSBvdGhlciBmaWxlLCBzbwotICAgc2hvdWxkIG9ubHkgYmUgdHJpZWQgaWYgb3RoZXIgbWV0aG9kcyBvZiBmaW5kaW5nIGEgZmlsZSB2aWEgYQotICAgYmFzZW5hbWUgaGF2ZSBmYWlsZWQuICAqLwotCi1jaGFyICoKLW1wd19taXhlZF9iYXNlbmFtZSAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqYmFzZSA9IG5hbWU7Ci0KLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSA9PSAnLycgfHwgKm5hbWUgPT0gJzonKQotCXsKLQkgIGJhc2UgPSBuYW1lICsgMTsKLQl9Ci0gICAgICArK25hbWU7Ci0gICAgfQotICByZXR1cm4gYmFzZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBmb3BlbigpIG1vZGlmaWVkIHRvIGNyZWF0ZSBmaWxlcyB0aGF0IGFyZSB0eXBlIFRFWFQKLSAgIG9yICdCSU4gJywgYW5kIGFsd2F5cyBvZiB0eXBlICdNUFMgJy4gICovCi0KLUZJTEUgKgotbXB3X2ZvcGVuIChjaGFyICpuYW1lLCBjaGFyICptb2RlKQotewotI3VuZGVmIGZvcGVuCi0gIGludCBlcnJudW07Ci0gIEZJTEUgKmZwOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKG5hbWUsIHRtcG5hbWUpOwotICBQUk9HUkVTUyAoMSk7Ci0gIGZwID0gZm9wZW4gKHRtcG5hbWUsIG1vZGUpOwotICBlcnJudW0gPSBlcnJubzsKLQotICAvKiBJZiB3cml0aW5nLCBuZWVkIHRvIHNldCB0eXBlIGFuZCBjcmVhdG9yIHVzZWZ1bGx5LiAqLwotICBpZiAoc3RyY2hyIChtb2RlLCAndycpKQotICAgIHsKLSAgICAgIGNoYXIgKnBuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRtcG5hbWUpICsgMik7Ci0gICAgICBPU0VyciBlOwotICAgICAgc3RydWN0IEZJbmZvIGZpOwotCi0gICAgICBwbmFtZVswXSA9IHN0cmxlbiAodG1wbmFtZSk7Ci0gICAgICBzdHJjcHkgKHBuYW1lKzEsIHRtcG5hbWUpOwotCQotICAgICAgZSA9IEdldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7Ci0gICAgICAvKiBzaG91bGQgZG8gc3BpZmZpZXIgZXJyb3IgaGFuZGxpbmcgKi8KLSAgICAgIGlmIChlICE9IDApCi0JZnByaW50ZihzdGRlcnIsICJHZXRGSW5mbyByZXR1cm5zICVkXG4iLCBlKTsKLSAgICAgIGlmIChzdHJjaHIgKG1vZGUsICdiJykpCi0JewotCSAgZmkuZmRUeXBlID0gKE9TVHlwZSkgJ0JJTiAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaS5mZFR5cGUgPSAoT1NUeXBlKSAnVEVYVCc7Ci0JfQotICAgICAgZmkuZmRDcmVhdG9yID0gKE9TVHlwZSkgJ01QUyAnOwotICAgICAgZSA9IFNldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7Ci0gICAgICBpZiAoZSAhPSAwKQotCWZwcmludGYoc3RkZXJyLCAiU2V0RkluZm8gcmV0dXJucyAlZFxuIiwgZSk7Ci0gICAgICBmcmVlIChwbmFtZSk7Ci0gICAgfQotICBpZiAoZnAgPT0gTlVMTCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIGZwOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBmc2VlaygpIG1vZGlmaWVkIHRvIGZpbGwgdGhlIGZpbGUgd2l0aCB6ZXJvcwotICAgaWYgc2Vla2luZyBwYXN0IHRoZSBlbmQgb2YgaXQuICAqLwotCi0jZGVmaW5lIFpFUk9CTEtTSVpFIDQwOTYKLQotY2hhciB6ZXJvc1taRVJPQkxLU0laRV07Ci0KLWludAotbXB3X2ZzZWVrIChGSUxFICpmcCwgaW50IG9mZnNldCwgaW50IHdoZW5jZSkKLXsKLSN1bmRlZiBmc2VlawotICBpbnQgY3Vyc2l6ZSwgbnVtbGVmdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIGlmICh3aGVuY2UgPT0gU0VFS19TRVQpCi0gICAgewotICAgICAgZnNlZWsgKGZwLCAwLCBTRUVLX0VORCk7Ci0gICAgICBjdXJzaXplID0gZnRlbGwgKGZwKTsKLSAgICAgIGlmIChvZmZzZXQgPiBjdXJzaXplKQotCXsKLQkgIG51bWxlZnQgPSBvZmZzZXQgLSBjdXJzaXplOwotCSAgd2hpbGUgKG51bWxlZnQgPiBaRVJPQkxLU0laRSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbWlnaHQgZmFpbCwgc2hvdWxkIGNoZWNrIGZvciB0aGF0LiAqLwotCSAgICAgIFBST0dSRVNTICgxKTsKLQkgICAgICBmd3JpdGUgKHplcm9zLCAxLCBaRVJPQkxLU0laRSwgZnApOwotCSAgICAgIG51bWxlZnQgLT0gWkVST0JMS1NJWkU7Ci0JICAgIH0KLQkgIFBST0dSRVNTICgxKTsKLQkgIGZ3cml0ZSAoemVyb3MsIDEsIG51bWxlZnQsIGZwKTsKLQkgIGZmbHVzaCAoZnApOwotCX0KLSAgICB9Ci0gIHJldHVybiBmc2VlayAoZnAsIG9mZnNldCwgd2hlbmNlKTsKLX0KLQotaW50Ci1tcHdfZnJlYWQgKGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBuaXRlbXMsIEZJTEUgKnN0cmVhbSkKLXsKLSN1bmRlZiBmcmVhZAotICBpbnQgcnNsdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBmcmVhZCAocHRyLCBzaXplLCBuaXRlbXMsIHN0cmVhbSk7Ci0gIFBST0dSRVNTICgxKTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLWludAotbXB3X2Z3cml0ZSAoY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG5pdGVtcywgRklMRSAqc3RyZWFtKQotewotI3VuZGVmIGZ3cml0ZQotICBpbnQgcnNsdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBmd3JpdGUgKHB0ciwgc2l6ZSwgbml0ZW1zLCBzdHJlYW0pOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLWxpbmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAibGluayBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLX0KLQotaW50Ci1mb3JrICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci19Ci0KLWludAotdmZvcmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAidmZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi1pbnQKLXBpcGUgKGludCAqZmQpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgInBpcGUgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWV4ZWN2cCAoY2hhciAqZmlsZSwgY2hhciAqKmFyZ3YpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4ZWN2cCBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWludAotZXhlY3YgKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2KQotewotICBmcHJpbnRmIChzdGRlcnIsICJleGVjdiBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0jZW5kaWYKLQotaW50Ci1raWxsIChpbnQgcGlkLCBpbnQgc2lnKQotewotICBmcHJpbnRmIChzdGRlcnIsICJraWxsIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLQotaW50Ci13YWl0IChpbnQgKnN0YXR1cykKLXsKLSAgKnN0YXR1cyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLXNsZWVwIChpbnQgc2Vjb25kcykKLXsKLSAgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCBub3c7Ci0KLSAgdGltZSAoJnN0YXJ0X3RpbWUpOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIHRpbWUgKCZub3cpOwotICAgICAgaWYgKG5vdyA+IHN0YXJ0X3RpbWUgKyBzZWNvbmRzKQotCXJldHVybiAwOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkCi1wdXRlbnYgKGNoYXIgKnN0cikKLXsKLSAgLyogVGhlIEdDQyBkcml2ZXIgY2FsbHMgdGhpcyB0byBkbyB0aGluZ3MgZm9yIGNvbGxlY3QyLCBidXQgd2UKLSAgICAgZG9uJ3QgY2FyZSBhYm91dCBjb2xsZWN0Mi4gKi8KLX0KLQotaW50Ci1jaG1vZCAoY2hhciAqcGF0aCwgaW50IG1vZGUpCi17Ci0gIC8qIFByZXRlbmQgaXQgd2FzIGFsbCBPSy4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotZ2V0dWlkICgpCi17Ci0gIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotZ2V0Z2lkICgpCi17Ci0gIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogSW5zdGVhZCBvZiBjb3JlZHVtcGluZywgd2hpY2ggaXMgbm90IGEgbm9ybWFsIE1hYyBmYWNpbGl0eSwgd2UKLSAgIGRyb3AgaW50byBNYWNzYnVnLiAgSWYgd2UgdGhlbiAiZyIgZnJvbSBNYWNzYnVnLCB0aGUgcHJvZ3JhbSB3aWxsCi0gICBleGl0IGNsZWFubHkuICovCi0KLXZvaWQKLW1wd19hYm9ydCAoKQotewotICAvKiBNYWtlIHN1cmUgbm8gb3V0cHV0IHN0aWxsIGJ1ZmZlcmVkIHVwLCB0aGVuIHphcCBpbnRvIE1hY3NCdWcuICovCi0gIGZmbHVzaChzdGRvdXQpOwotICBmZmx1c2goc3RkZXJyKTsKLSAgcHJpbnRmKCIjIyBBYm9ydCEgIyNcbiIpOwotI2lmZGVmIE1QV19TQURFCi0gIFN5c0Vycm9yKDgwMDUpOwotI2Vsc2UgCi0gIERlYnVnZ2VyKCk7Ci0jZW5kaWYKLSAgLyogImciIGluIE1hY3NCdWcgd2lsbCB0aGVuIGNhdXNlIGEgcmVndWxhciBlcnJvciBleGl0LiAqLwotICBleGl0ICgxKTsKLX0KLQotLyogSW1pdGF0aW9uIGdldHJ1c2FnZSBiYXNlZCBvbiB0aGUgQU5TSSBjbG9jaygpIGZ1bmN0aW9uLiAqLwotCi1pbnQKLWdldHJ1c2FnZSAoaW50IHdobywgc3RydWN0IHJ1c2FnZSAqcnVzYWdlKQotewotICBpbnQgY2xrID0gY2xvY2sgKCk7Ci0KLSNpZiAwCi0gIHJ1c2FnZS0+cnVfdXRpbWUudHZfc2VjID0gY2xrIC8gQ0xPQ0tTX1BFUl9TRUM7Ci0gIHJ1c2FnZS0+cnVfdXRpbWUudHZfdXNlYyA9ICgoY2xrICogMTAwMCkgLyBDTE9DS1NfUEVSX1NFQykgKiAxMDAwOwotICBydXNhZ2UtPnJ1X3N0aW1lLnR2X3NlYyA9IDA7Ci0gIHJ1c2FnZS0+cnVfc3RpbWUudHZfdXNlYyA9IDA7Ci0jZW5kaWYKLX0KLQotaW50Ci1zYnJrICgpCi17Ci0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWlzYXR0eSAoaW50IGZkKQotewotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSBUaW1vdGh5IE11cnJheSdzIFBvc2l4IGxpYnJhcnkuICovCi0KLSNpbmNsdWRlICJ1dGltZS5oIgotCi1pbnQKLXV0aW1lIChjaGFyICpmaWxlbmFtZSwgc3RydWN0IHV0aW1idWYgKnRpbWVzKQotewotICBDSW5mb1BCUmVjIGNpcGJyOwotICBIRmlsZUluZm8gKmZwYiA9IChIRmlsZUluZm8gKikgJmNpcGJyOwotICBEaXJJbmZvICpkcGIgPSAoRGlySW5mbyAqKSAmY2lwYnI7Ci0gIHVuc2lnbmVkIGNoYXIgcG5hbWVbMjU2XTsKLSAgc2hvcnQgZXJyOwotICAKLSAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgZmlsZW5hbWUpOwotICBjMnBzdHIgKHBuYW1lKTsKLQotICBkcGItPmlvRHJEaXJJRCA9IDBMOwotICBmcGItPmlvTmFtZVB0ciA9IHBuYW1lOwotICBmcGItPmlvVlJlZk51bSA9IDA7Ci0gIGZwYi0+aW9GRGlySW5kZXggPSAwOwotICBmcGItPmlvRlZlcnNOdW0gPSAwOwotICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBlcnJubyA9IEVOT0VOVDsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgZHBiLT5pb0RyRGlySUQgPSAwTDsKLSAgZnBiLT5pb0ZsTWREYXQgPSB0aW1lcy0+bW9kdGltZTsKLSAgZnBiLT5pb0ZsQ3JEYXQgPSB0aW1lcy0+YWN0aW1lOwotICBlcnIgPSBQQlNldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBlcnJubyA9IEVBQ0NFUzsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotbWtkaXIgKGNoYXIgKnBhdGgsIGludCBtb2RlKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuIC0xOwotfQotCi1pbnQKLXJtZGlyICgpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gLTE7Ci19Ci0jZW5kaWYKLQotY2hvd24gKCkKLXsKLSAgZXJybm8gPSBFTk9TWVM7Ci0gIHJldHVybiAtMTsKLX0KLQotY2hhciAqbXllbnZpcm9uW10gPSB7TlVMTH07Ci0KLWNoYXIgKiplbnZpcm9uID0gbXllbnZpcm9uOwotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi0KLS8qIE1pbmltYWwgJ3N0YXQnIGVtdWxhdGlvbjogdGVsbHMgZGlyZWN0b3JpZXMgZnJvbSBmaWxlcyBhbmQKLSAgIGdpdmVzIGxlbmd0aCBhbmQgbXRpbWUuCi0KLSAgIERlcml2ZWQgZnJvbSBjb2RlIHdyaXR0ZW4gYnkgR3VpZG8gdmFuIFJvc3N1bSwgQ1dJLCBBbXN0ZXJkYW0KLSAgIGFuZCBwbGFjZWQgYnkgaGltIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotZXh0ZXJuIGludCBfX3VpZCwgX19naWQ7Ci0KLWludCBfX3VpZCA9IDA7Ci1pbnQgX19naWQgPSAwOwotCi0vKiBCaXRzIGluIGlvRmxBdHRyaWI6ICovCi0jZGVmaW5lIExPQ0tCSVQJKDE8PDApCQkvKiBGaWxlIGxvY2tlZCAqLwotI2RlZmluZSBESVJCSVQJKDE8PDQpCQkvKiBJdCdzIGEgZGlyZWN0b3J5ICovCi0KLS8qIE1hY2lmaWVkICJzdGF0IiBpbiB3aGljaCBmaWxlbmFtZSBpcyBnaXZlbiByZWxhdGl2ZSB0byBhIGRpcmVjdG9yeSwKLSAgIHNwZWNpZmllZCBieSBsb25nIERpcklELiAgKi8KLQotc3RhdGljIGludAotX3N0YXQgKGNoYXIgKm5hbWUsIGxvbmcgZGlyaWQsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIENJbmZvUEJSZWMgY2lwYnI7Ci0gIEhGaWxlSW5mbyAqZnBiID0gKEhGaWxlSW5mbyopICZjaXBicjsKLSAgRGlySW5mbyAqZHBiID0gKERpckluZm8qKSAmY2lwYnI7Ci0gIFN0cjI1NSBwbmFtZTsKLSAgc2hvcnQgZXJyOwotCi0gIC8qIE1ha2UgYSB0ZW1wIGNvcHkgb2YgdGhlIG5hbWUgYW5kIHBhc2NhbGl6ZS4gKi8KLSAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgbmFtZSk7Ci0gIGMycHN0ciAocG5hbWUpOwotICAKLSAgY2lwYnIuZGlySW5mby5pb0RyRGlySUQgPSBkaXJpZDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvTmFtZVB0ciA9IHBuYW1lOwotICBjaXBici5oRmlsZUluZm8uaW9WUmVmTnVtID0gMDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvRkRpckluZGV4ID0gMDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvRlZlcnNOdW0gPSAwOwotICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpCi0gICAgewotICAgICAgZXJybm8gPSBFTk9FTlQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAvKiBNYWMgZmlsZXMgYXJlIHJlYWRhYmxlIGlmIHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGF0IGFsbC4gKi8KLSAgYnVmLT5zdF9tb2RlID0gMDQ0NDsKLSAgLyogTWFyayB1bmxvY2tlZCBmaWxlcyBhcyB3cml0ZWFibGUuICovCi0gIGlmICghKGZwYi0+aW9GbEF0dHJpYiAmIExPQ0tCSVQpKQotICAgIGJ1Zi0+c3RfbW9kZSB8PSAwMjIyOwotICBpZiAoZnBiLT5pb0ZsQXR0cmliICYgRElSQklUKQotICAgIHsKLSAgICAgIC8qIE1hcmsgZGlyZWN0b3JpZXMgYXMgImV4ZWN1dGFibGUiLiAqLwotICAgICAgYnVmLT5zdF9tb2RlIHw9IDAxMTEgfCBTX0lGRElSOwotICAgICAgYnVmLT5zdF9zaXplID0gZHBiLT5pb0RyTm1GbHM7Ci0gICAgICBidWYtPnN0X3JzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYtPnN0X21vZGUgfD0gU19JRlJFRzsKLSAgICAgIC8qIE1hcmsgYXBwcyBhcyAiZXhlY3V0YWJsZSIuICovCi0gICAgICBpZiAoZnBiLT5pb0ZsRm5kckluZm8uZmRUeXBlID09ICdBUFBMJykKLQlidWYtPnN0X21vZGUgfD0gMDExMTsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIHNpemVzIG9mIGRhdGEgYW5kIHJlc291cmNlIGZvcmtzLiAqLwotICAgICAgYnVmLT5zdF9zaXplID0gZnBiLT5pb0ZsTGdMZW47Ci0gICAgICBidWYtPnN0X3JzaXplID0gZnBiLT5pb0ZsUkxnTGVuOwotICAgIH0KLSAgLyogRmlsbCBpbiB2YXJpb3VzIHRpbWVzLiAqLwotICBidWYtPnN0X2F0aW1lID0gZnBiLT5pb0ZsQ3JEYXQ7Ci0gIGJ1Zi0+c3RfbXRpbWUgPSBmcGItPmlvRmxNZERhdDsKLSAgYnVmLT5zdF9jdGltZSA9IGZwYi0+aW9GbENyRGF0OwotICAvKiBTZXQgdXAgYW4gaW1pdGF0aW9uIGlub2RlIG51bWJlci4gKi8KLSAgYnVmLT5zdF9pbm8gPSAodW5zaWduZWQgc2hvcnQpIGZwYi0+aW9EaXJJRDsKLSAgLyogU2V0IHVwIGFuIGltaXRhdGlvbiBkZXZpY2UuICovCi0gIEdldFZSZWZOdW0gKGJ1Zi0+c3RfaW5vLCAmYnVmLT5zdF9kZXYpOwotICBidWYtPnN0X3VpZCA9IF9fdWlkOwotICBidWYtPnN0X2dpZCA9IF9fZ2lkOwotLyogIGJ1Zi0+c3RfRmxGbmRySW5mbyA9IGZwYi0+aW9GbEZuZHJJbmZvOyAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHN0YXQoKSBzZXRzIHVwIGFuIGVtcHR5IGRpcmlkLiAqLwotCi1pbnQKLXN0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIGxvbmcgcnNsdCwgZXJybnVtOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKHBhdGgsIHRtcG5hbWUpOwotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIjIHN0YXQgKCVzLCAleCkiLCB0bXBuYW1lLCBidWYpOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBfc3RhdCAodG1wbmFtZSwgMEwsIGJ1Zik7Ci0gIGVycm51bSA9IGVycm5vOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLWZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIEZDQlBCUmVjIGZjYjsKLSAgRklMRSAqZnA7Ci0gIFN0cjI1NSBwYXRobmFtZTsKLSAgbG9uZyBkaXJpZCA9IDBMLCB0ZW1wOwotICBsb25nIHJzbHQsIGVycm51bTsKLSAgc2hvcnQgZXJyOwotCi0gIGlmIChEZWJ1Z1BJIDwgMCkKLSAgICBEZWJ1Z1BJID0gKCooZ2V0ZW52ICgiREVCVUdfUEFUSE5BTUVTIikpID09ICcxJyA/IDEgOiAwKTsKLSAgaWYgKERlYnVnUEkpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyBmc3RhdCAoJWQsICV4KSIsIGZkLCBidWYpOwotICBQUk9HUkVTUyAoMSk7Ci0gIHBhdGhuYW1lWzBdID0gMDsKLSNpZmRlZiBGSU9GTkFNRQotICAvKiBVc2UgYW4gTVBXLXNwZWNpZmljIGlvY3RsIHRvIGdldCB0aGUgcGF0aG5hbWUgYXNzb2NpYXRlZCB3aXRoCi0gICAgIHRoZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotICBpb2N0bCAoZmQsIEZJT0ZOQU1FLCAobG9uZyAqKSBwYXRobmFtZSk7IAotI2Vsc2UKLSAgeW91IGxvc2UKLSNlbmRpZgotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgKG5hbWUgaXMgJXMpIiwgcGF0aG5hbWUpOwotICBkaXJpZCA9IDBMIC8qIGZjYi5pb0ZDQlBhcklEICovIDsKLSAgcnNsdCA9IF9zdGF0ICgoY2hhciAqKSBwYXRobmFtZSwgZGlyaWQsIGJ1Zik7Ci0gIGVycm51bSA9IGVycm5vOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi0jZW5kaWYgLyogbiBVU0VfTVdfSEVBREVSUyAqLwotCi1jaGRpciAoKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWNoYXIgKgotZ2V0Y3dkIChjaGFyICpidWYsIGludCBzaXplKQotewotICBpZiAoYnVmID09IE5VTEwpCi0gICAgYnVmID0gKGNoYXIgKikgbWFsbG9jIChzaXplKTsKLSAgc3RyY3B5KGJ1ZiwgIjoiKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgbW9yZSBlbGFib3JhdGUgZm9yIE1QVy4gKi8KLQotY2hhciAqCi1nZXRwd2QgKCkKLXsKLSAgcmV0dXJuICI6IjsKLX0KLQotaW50Ci1tcHdfb3BlbiAoY2hhciAqZmlsZW5hbWUsIGludCBhcmcyLCBpbnQgYXJnMykKLXsKLSN1bmRlZiBvcGVuCi0gIGludCBmZCwgZXJybnVtID0gMDsKLSAgY2hhciB0bXBuYW1lWzI1Nl07Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChmaWxlbmFtZSwgdG1wbmFtZSk7Ci0gIGZkID0gb3BlbiAodG1wbmFtZSwgYXJnMik7Ci0gIGVycm51bSA9IGVycm5vOwotCi0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgb3BlbiAoJXMsICVkLCAlZCkiLCB0bXBuYW1lLCBhcmcyLCBhcmczKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIGZkKTsKLSAgICAgIGlmIChmZCA9PSAtMSkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSAgaWYgKGZkID09IC0xKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gZmQ7Ci19Ci0KLWludAotbXB3X2FjY2VzcyAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGludCBjbWQpCi17Ci0jdW5kZWYgYWNjZXNzCi0KLSAgaW50IHJzbHQsIGVycm51bSA9IDA7Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKGZpbGVuYW1lLCB0bXBuYW1lKTsKLSAgaWYgKGNtZCAmIFJfT0sgfHwgY21kICYgWF9PSykKLSAgICB7Ci0gICAgICByc2x0ID0gc3RhdCAodG1wbmFtZSwgJnN0KTsKLSAgICAgIGVycm51bSA9IGVycm5vOwotICAgICAgaWYgKHJzbHQgPj0gMCkKLQl7Ci0JICBpZiAoKCgoc3Quc3RfbW9kZSAmIDAwNCkgPT0gMCkgJiYgKGNtZCAmIFJfT0spKQotCSAgICAgIHx8ICgoKHN0LnN0X21vZGUgJiAwMDIpID09IDApICYmIChjbWQgJiBXX09LKSkKLQkgICAgICB8fCAoKChzdC5zdF9tb2RlICYgMDAxKSA9PSAwKSAmJiAoY21kICYgWF9PSykpKQotCSAgICB7Ci0JICAgICAgcnNsdCA9IC0xOwotCSAgICAgIGVycm51bSA9IEVBQ0NFUzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgbXB3X2FjY2VzcyAoJXMsICVkKSIsIHRtcG5hbWUsIGNtZCk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi0vKiBUaGUgTVBXIGxpYnJhcnkgY3JlYXQoKSBoYXMgbm8gbW9kZSBhcmd1bWVudC4gKi8KLQotaW50Ci1tcHdfY3JlYXQgKGNoYXIgKnBhdGgsIC8qIG1vZGVfdCAqLyBpbnQgbW9kZSkKLXsKLSN1bmRlZiBjcmVhdAotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLSAgcmV0dXJuIGNyZWF0IChwYXRoLCBtb2RlKTsKLSNlbHNlCi0gIHJldHVybiBjcmVhdCAocGF0aCk7Ci0jZW5kaWYKLX0KLQotLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGNvbnRyb2wgaW4gYW4gTVBXIHRvb2wgYmVmb3JlIGl0IGNyYXNoZXMgdGhlCi0gICBtYWNoaW5lLiAgKi8KLQotbXB3X3NwZWNpYWxfaW5pdCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKHN0cnN0ciAobmFtZSwgIkRFQlVHIikpCi0gICAgRGVidWdTdHIoIlxwYXQgYmVnaW5uaW5nIG9mIHByb2dyYW0iKTsKLX0KLQotc3RhdGljIGludCBjdXJyZW50X3VtYXNrOwotCi1pbnQKLXVtYXNrKGludCBtYXNrKQotewotICBpbnQgb2xkbWFzayA9IGN1cnJlbnRfdW1hc2s7Ci0KLSAgY3VycmVudF91bWFzayA9IG1hc2s7Ci0gIHJldHVybiBvbGRtYXNrOwotfQotCi0vKiBDdXJzb3Itc3Bpbm5pbmcgc3R1ZmYgdGhhdCBpbmNsdWRlcyBtZXRlcmluZyBvZiBzcGluIHJhdGUgYW5kIGRlbGF5cy4gICovCi0KLS8qIE5vbnplcm8gd2hlbiBjdXJzb3Igc3Bpbm5pbmcgaGFzIGJlZW4gc2V0IHVwIHByb3Blcmx5LiAgKi8KLQotaW50IGN1cnNvcl9pbml0ZWQ7Ci0KLS8qIE5vbnplcm8gaWYgc3BpbiBzaG91bGQgYmUgbWVhc3VyZWQgYW5kIGV4Y2Vzc2l2ZSBkZWxheXMgcmVwb3J0ZWQuICAqLwotCi1pbnQgbWVhc3VyZV9zcGluOwotCi0vKiBOb256ZXJvIGlmIHNwaW4gaGlzdG9ncmFtIGFuZCByYXRlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0LiAgKi8KLQotaW50IGR1bXBfc3Bpbl9kYXRhOwotCi1sb25nIHdhcm5pbmdfdGhyZXNob2xkID0gNDAwMDAwOwotCi1sb25nIGJ1Y2tldF9zaXplID0gMTAyNDsKLQotbG9uZyBidWNrZXRfcG93ZXIgPSAxMDsKLQotbG9uZyBudW1idWNrZXRzID0gMzAwOwotCi1pbnQgKmRlbGF5X2NvdW50czsKLQotaW50IG92ZXJmbG93X2NvdW50OwotCi1jaGFyICpjdXJyZW50X3Byb2dyZXNzOwotCi1zdGF0aWMgVW5zaWduZWRXaWRlIGxhc3RfbWljcm9zZWNvbmRzOwotCi1zdGF0aWMgY2hhciAqbGFzdF9zcGluX2ZpbGUgPSAiIjsKLQotc3RhdGljIGludCBsYXN0X3NwaW5fbGluZTsKLQotdm9pZAotd2Fybl9pZl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgbG9uZyBkaWZmLCBpeDsKLSAgVW5zaWduZWRXaWRlIG5vdzsKLQotICBNaWNyb3NlY29uZHMoJm5vdyk7Ci0KLSAgZGlmZiA9IG5vdy5sbyAtIGxhc3RfbWljcm9zZWNvbmRzLmxvOwotCi0gIGlmIChkaWZmID4gd2FybmluZ190aHJlc2hvbGQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyAlczogJWxkLiUwNmxkIHNlYyBkZWxheSBnZXR0aW5nIGZyb20gJXM6JWQgdG8gJXM6JWRcbiIsCi0JICAgICAoY3VycmVudF9wcm9ncmVzcyA/IGN1cnJlbnRfcHJvZ3Jlc3MgOiAiIiksCi0JICAgICBkaWZmIC8gMTAwMDAwMCwgZGlmZiAlIDEwMDAwMDAsCi0JICAgICBsYXN0X3NwaW5fZmlsZSwgbGFzdF9zcGluX2xpbmUsIGZpbGUsIGxpbmUpOwotICBpZiAoZHVtcF9zcGluX2RhdGEpCi0gICAgewotICAgICAgaWYgKGRpZmYgPj0gMCkKLQl7Ci0JICBpeCA9IGRpZmYgPj4gYnVja2V0X3Bvd2VyOwotCSAgaWYgKGl4ID49IDAgJiYgaXggPCBudW1idWNrZXRzICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQotCSAgICArK2RlbGF5X2NvdW50c1tpeF07Ci0JICBlbHNlCi0JICAgICsrb3ZlcmZsb3dfY291bnQ7Ci0JfQotICAgICAgZWxzZQotCWZwcmludGYgKHN0ZGVyciwgInJhdyBkaWZmIGlzICVsZCAoPylcbiIsIGRpZmYpOwotICAgIH0KLX0KLQotdm9pZAotcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgTWljcm9zZWNvbmRzICgmbGFzdF9taWNyb3NlY29uZHMpOwotICBsYXN0X3NwaW5fZmlsZSA9IGZpbGU7Ci0gIGxhc3Rfc3Bpbl9saW5lID0gbGluZTsKLX0KLQotdm9pZAotbXB3X3N0YXJ0X3Byb2dyZXNzIChjaGFyICpzdHIsIGludCBuLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKm1lYXN1cmUsICp0aHJlc2hvbGQ7Ci0KLSAgaWYgKCFjdXJzb3JfaW5pdGVkKQotICAgIHsKLSAgICAgIEluaXRDdXJzb3JDdGwgKG5pbCk7Ci0gICAgICBjdXJzb3JfaW5pdGVkID0gMTsKLSAgICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci0gICAgICBtZWFzdXJlID0gZ2V0ZW52ICgiTUVBU1VSRV9TUElOIik7Ci0gICAgICBpZiAobWVhc3VyZSAhPSBOVUxMICYmIG1lYXN1cmVbMF0gIT0gJ1wwJykKLQl7Ci0JICBtZWFzdXJlX3NwaW4gPSAxOwotCSAgaWYgKHN0cmNtcCAobWVhc3VyZSwgImFsbCIpID09IDApCi0JICAgIGR1bXBfc3Bpbl9kYXRhID0gMTsKLQl9Ci0gICAgICB0aHJlc2hvbGQgPSBnZXRlbnYgKCJTUElOX1dBUk5fVEhSRVNIT0xEIik7Ci0gICAgICBpZiAodGhyZXNob2xkICE9IE5VTEwgJiYgdGhyZXNob2xkWzBdICE9ICdcMCcpCi0Jd2FybmluZ190aHJlc2hvbGQgPSBhdG9sICh0aHJlc2hvbGQpOwotICAgICAgaWYgKGR1bXBfc3Bpbl9kYXRhKQotCXsKLQkgIGlmIChkZWxheV9jb3VudHMgPT0gTlVMTCkKLQkgICAgZGVsYXlfY291bnRzID0gKGludCAqKSBtYWxsb2MgKG51bWJ1Y2tldHMgKiBzaXplb2YgKGludCkpOwotCSAgZm9yIChpID0gMDsgaSA8IG51bWJ1Y2tldHM7ICsraSkKLQkgICAgZGVsYXlfY291bnRzW2ldID0gMDsKLQkgIG92ZXJmbG93X2NvdW50ID0gMDsKLQl9Ci0gICAgfQotICBjdXJyZW50X3Byb2dyZXNzID0gc3RyOwotCi0gIHN5c19uZXJyID0gZXJybm9fbWF4ICgpOwotCi0gIG1wd19zcGVjaWFsX2luaXQgKHN0cik7Ci19Ci0KLXZvaWQKLW1wd19wcm9ncmVzcyAoaW50IG4pCi17Ci0gIFNwaW5DdXJzb3IgKDMyKTsKLX0KLQotdm9pZAotbXB3X3Byb2dyZXNzX21lYXN1cmVkIChpbnQgbiwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLSAgU3BpbkN1cnNvciAoMzIpOwotICBpZiAobWVhc3VyZV9zcGluKQotICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci19Ci0KLXZvaWQKLW1wd19lbmRfcHJvZ3Jlc3MgKGNoYXIgKnN0ciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGxvbmcgaSwgZGVsYXksIGNvdW50ID0gMCwgc3VtID0gMCwgYXZnZGVsYXksIHNwaW5yYXRlOwotICBsb25nIGN1cnBvd2VyID0gMCwgY3VyZ3JvdXAgPSAwOwotCi0gIC8qIFdhcm4gaWYgaXQncyBiZWVuIGEgd2hpbGUgc2luY2UgdGhlIGxhc3Qgc3Bpbi4gICovCi0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLQotICAvKiBEdW1wIGFsbCB0aGUgbm9uemVybyBkZWxheSBjb3VudHMgYW5kIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGRlbGF5LiAgKi8KLSAgaWYgKGR1bXBfc3Bpbl9kYXRhICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1idWNrZXRzOyArK2kpCi0JewotCSAgZGVsYXkgPSAoaSArIDEpICogYnVja2V0X3NpemU7Ci0JICBzdW0gKz0gZGVsYXlfY291bnRzW2ldICogKGkgKyAxKTsKLQkgIGNvdW50ICs9IGRlbGF5X2NvdW50c1tpXTsKLQkgIGlmIChkZWxheSA8PSAoMSA8PCBjdXJwb3dlcikpCi0JICAgIHsKLQkgICAgICBjdXJncm91cCArPSBkZWxheV9jb3VudHNbaV07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChjdXJncm91cCA+IDApCi0JCWZwcmludGYgKHN0ZGVyciwKLQkJCSAiIyAlczogJWQgZGVsYXlzIGJldHdlZW4gJWxkLiUwNmxkIGFuZCAlbGQuJTA2bGQgc2VjXG4iLAotCQkJIChzdHIgPyBzdHIgOiAiIiksCi0JCQkgY3VyZ3JvdXAsCi0JCQkgKDEgPDwgY3VycG93ZXIpIC8gMTAwMDAwMCwKLQkJCSAoMSA8PCBjdXJwb3dlcikgJSAxMDAwMDAwLAotCQkJICgxIDw8IChjdXJwb3dlciArIDEpKSAvIDEwMDAwMDAsCi0JCQkgKDEgPDwgKGN1cnBvd2VyICsgMSkpICUgMTAwMDAwMCk7Ci0JICAgICAgKytjdXJwb3dlcjsKLQkgICAgICBjdXJncm91cCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY291bnQgPiAwKQotCXsKLQkgIGF2Z2RlbGF5ID0gKHN1bSAqIGJ1Y2tldF9zaXplKSAvIGNvdW50OwotCSAgc3BpbnJhdGUgPSAxMDAwMDAwIC8gYXZnZGVsYXk7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIjICVzOiBBdmVyYWdlIHNwaW4gcmF0ZSBpcyAlZCB0aW1lcy9zZWNcbiIsCi0JCSAgIChzdHIgPyBzdHIgOiAiIiksIHNwaW5yYXRlKTsKLQl9Ci0gICAgfQotfQotCi0jaWZkZWYgUFJPR1JFU1NfVEVTVAotCi0vKiBUZXN0IHByb2dyYW0uICAqLwotCi1tYWluICgpCi17Ci0gIGludCBpLCBqOwotICBkb3VibGUgeCA9IDEuMCwgeSA9IDIuNDsKLSAgbG9uZyBzdGFydCA9IE1pY3Jvc2Vjb25kcyAoKSwgdG07ICBGSVhNRQotCi0gIFNUQVJUX1BST0dSRVNTICgiaGkiLCAwKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IChpICogMTAwKTsgKytqKQotCXsKLQkgIHggKz0gKHggKiB5KSAvIGo7Ci0JfQotICAgIH0KLSAgCi0gIEVORF9QUk9HUkVTUyAoImhpIik7Ci0gIAotICB0bSA9IE1pY3Jvc2Vjb25kcyAoKSAtIHN0YXJ0OwotCi0gIHByaW50ZiAoIlRvdGFsIHRpbWUgaXMgJWQuJWQgc2Vjc1xuIiwgdG0gLyAxMDAwMDAwLCB0bSAlIDEwMDAwMDApOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9NV19IRUFERVJTCi0vKiBFbXB0eSBkZWZpbml0aW9ucyBmb3IgTWV0cm93ZXJrcycgU0lPVVggY29uc29sZSBsaWJyYXJ5LiAqLwotCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jaW5jbHVkZSA8Y29uc29sZS5oPgotI2VuZGlmCi0KLXNob3J0Ci1JbnN0YWxsQ29uc29sZShzaG9ydCBmZCkKLXsKLSNwcmFnbWEgdW51c2VkIChmZCkKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotUmVtb3ZlQ29uc29sZSh2b2lkKQotewotfQotCi1sb25nCi1Xcml0ZUNoYXJzVG9Db25zb2xlKGNoYXIgKmJ1ZiwgbG9uZyBuKQotewotI3ByYWdtYSB1bnVzZWQgKGJ1ZiwgbikKLQlyZXR1cm4gMDsKLX0KLQotbG9uZyBSZWFkQ2hhcnNGcm9tQ29uc29sZShjaGFyICpidWYsIGxvbmcgbikKLXsKLSNwcmFnbWEgdW51c2VkIChidWYsIG4pCi0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBjaGFyICoKLV9fdHR5bmFtZShsb25nIGZkKQotewotCXN0YXRpYyBjaGFyICpfX2RldmljZW5hbWUgPSAibnVsbCBkZXZpY2UiOwotCi0JaWYgKGZkID49IDAgJiYgZmQgPD0gMikKLQkgIHJldHVybiAoX19kZXZpY2VuYW1lKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXNkb3MuYyBiL2xpYmliZXJ0eS9tc2Rvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlNjRkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tc2Rvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotY2hhciBtc2dbXSA9ICJObyB2Zm9yayBhdmFpbGFibGUgLSBhYm9ydGluZ1xuIjsKLXZmb3JrKCkKLXsKLSAgd3JpdGUoMSwgbXNnLCBzaXplb2YobXNnKSk7Ci19Ci0KLXNpZ3NldG1hc2soKQotewotICAvKiBubyBzaWduYWxzIHN1cHBvcnQgaW4gZ28zMiAoeWV0KSAqLwotfQotCi13YWl0cGlkKCkKLXsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L29iamFsbG9jLmMgYi9saWJpYmVydHkvb2JqYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTRhOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvb2JqYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKiBvYmphbGxvYy5jIC0tIHJvdXRpbmVzIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2JqZWN0cwotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvYmphbGxvYy5oIgotCi0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciBOVUxMLiAgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotLyogR2V0IGEgZGVmaW5pdGlvbiBmb3Igc2l6ZV90LiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1leHRlcm4gUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiB2b2lkIGZyZWUgUEFSQU1TICgoUFRSKSk7Ci0jZW5kaWYKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgc3BhY2UgZm9yIGFuIG9iamVjdC4gIEZyZWVpbmcgYWxsb2NhdGVkCi0gICBzcGFjZSBtYXkgb3IgbWF5IG5vdCBmcmVlIGFsbCBtb3JlIHJlY2VudGx5IGFsbG9jYXRlZCBzcGFjZS4KLQotICAgV2UgaGFuZGxlIGxhcmdlIGFuZCBzbWFsbCBhbGxvY2F0aW9uIHJlcXVlc3RzIGRpZmZlcmVudGx5LiAgSWYgd2UKLSAgIGRvbid0IGhhdmUgZW5vdWdoIHNwYWNlIGluIHRoZSBjdXJyZW50IGJsb2NrLCBhbmQgdGhlIGFsbG9jYXRpb24KLSAgIHJlcXVlc3QgaXMgZm9yIG1vcmUgdGhhbiA1MTIgYnl0ZXMsIHdlIHNpbXBseSBwYXNzIGl0IHRocm91Z2ggdG8KLSAgIG1hbGxvYy4gICovCi0KLS8qIFRoZSBvYmphbGxvYyBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBvYmphbGxvYy5oLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuay4gICovCi0KLXN0cnVjdCBvYmphbGxvY19jaHVuawotewotICAvKiBOZXh0IGNodW5rLiAgKi8KLSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotICAvKiBJZiB0aGlzIGNodW5rIGNvbnRhaW5zIGxhcmdlIG9iamVjdHMsIHRoaXMgaXMgdGhlIHZhbHVlIG9mCi0gICAgIGN1cnJlbnRfcHRyIHdoZW4gdGhpcyBjaHVuayB3YXMgYWxsb2NhdGVkLiAgSWYgdGhpcyBjaHVuawotICAgICBjb250YWlucyBzbWFsbCBvYmplY3RzLCB0aGlzIGlzIE5VTEwuICAqLwotICBjaGFyICpjdXJyZW50X3B0cjsKLX07Ci0KLS8qIFRoZSBhbGlnbmVkIHNpemUgb2Ygb2JqYWxsb2NfY2h1bmsuICAqLwotCi0jZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFCQkJCQlcCi0gICgoc2l6ZW9mIChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmspICsgT0JKQUxMT0NfQUxJR04gLSAxKQlcCi0gICAmfiAoT0JKQUxMT0NfQUxJR04gLSAxKSkKLQotLyogV2UgYXNrIGZvciB0aGlzIG11Y2ggbWVtb3J5IGVhY2ggdGltZSB3ZSBjcmVhdGUgYSBjaHVuayB3aGljaCBpcyB0bwotICAgaG9sZCBzbWFsbCBvYmplY3RzLiAgKi8KLQotI2RlZmluZSBDSFVOS19TSVpFICg0MDk2IC0gMzIpCi0KLS8qIEEgcmVxdWVzdCBmb3IgdGhpcyBhbW91bnQgb3IgbW9yZSBpcyBqdXN0IHBhc3NlZCB0aHJvdWdoIHRvIG1hbGxvYy4gICovCi0KLSNkZWZpbmUgQklHX1JFUVVFU1QgKDUxMikKLQotLyogQ3JlYXRlIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBvYmphbGxvYyAqCi1vYmphbGxvY19jcmVhdGUgKCkKLXsKLSAgc3RydWN0IG9iamFsbG9jICpyZXQ7Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqY2h1bms7Ci0KLSAgcmV0ID0gKHN0cnVjdCBvYmphbGxvYyAqKSBtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldC0+Y2h1bmtzID0gKFBUUikgbWFsbG9jIChDSFVOS19TSVpFKTsKLSAgaWYgKHJldC0+Y2h1bmtzID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgcmV0LT5jaHVua3M7Ci0gIGNodW5rLT5uZXh0ID0gTlVMTDsKLSAgY2h1bmstPmN1cnJlbnRfcHRyID0gTlVMTDsKLQotICByZXQtPmN1cnJlbnRfcHRyID0gKGNoYXIgKikgY2h1bmsgKyBDSFVOS19IRUFERVJfU0laRTsKLSAgcmV0LT5jdXJyZW50X3NwYWNlID0gQ0hVTktfU0laRSAtIENIVU5LX0hFQURFUl9TSVpFOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZyb20gYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotUFRSCi1fb2JqYWxsb2NfYWxsb2MgKG8sIGxlbikKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotICAgICB1bnNpZ25lZCBsb25nIGxlbjsKLXsKLSAgLyogV2UgYXZvaWQgY29uZnVzaW9uIGZyb20gemVybyBzaXplZCBvYmplY3RzIGJ5IGFsd2F5cyBhbGxvY2F0aW5nCi0gICAgIGF0IGxlYXN0IDEgYnl0ZS4gICovCi0gIGlmIChsZW4gPT0gMCkKLSAgICBsZW4gPSAxOwotCi0gIGxlbiA9IChsZW4gKyBPQkpBTExPQ19BTElHTiAtIDEpICZ+IChPQkpBTExPQ19BTElHTiAtIDEpOwotCi0gIGlmIChsZW4gPD0gby0+Y3VycmVudF9zcGFjZSkKLSAgICB7Ci0gICAgICBvLT5jdXJyZW50X3B0ciArPSBsZW47Ci0gICAgICBvLT5jdXJyZW50X3NwYWNlIC09IGxlbjsKLSAgICAgIHJldHVybiAoUFRSKSAoby0+Y3VycmVudF9wdHIgLSBsZW4pOwotICAgIH0KLQotICBpZiAobGVuID49IEJJR19SRVFVRVNUKQotICAgIHsKLSAgICAgIGNoYXIgKnJldDsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqY2h1bms7Ci0KLSAgICAgIHJldCA9IChjaGFyICopIG1hbGxvYyAoQ0hVTktfSEVBREVSX1NJWkUgKyBsZW4pOwotICAgICAgaWYgKHJldCA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgcmV0OwotICAgICAgY2h1bmstPm5leHQgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIGNodW5rLT5jdXJyZW50X3B0ciA9IG8tPmN1cnJlbnRfcHRyOwotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBjaHVuazsKLQotICAgICAgcmV0dXJuIChQVFIpIChyZXQgKyBDSFVOS19IRUFERVJfU0laRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICAgICAgY2h1bmsgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG1hbGxvYyAoQ0hVTktfU0laRSk7Ci0gICAgICBpZiAoY2h1bmsgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGNodW5rLT5uZXh0ID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gICAgICBjaHVuay0+Y3VycmVudF9wdHIgPSBOVUxMOwotCi0gICAgICBvLT5jdXJyZW50X3B0ciA9IChjaGFyICopIGNodW5rICsgQ0hVTktfSEVBREVSX1NJWkU7Ci0gICAgICBvLT5jdXJyZW50X3NwYWNlID0gQ0hVTktfU0laRSAtIENIVU5LX0hFQURFUl9TSVpFOwotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBjaHVuazsKLQotICAgICAgcmV0dXJuIG9iamFsbG9jX2FsbG9jIChvLCBsZW4pOwotICAgIH0KLX0KLQotLyogRnJlZSBhbiBlbnRpcmUgb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotb2JqYWxsb2NfZnJlZSAobykKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotewotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmw7Ci0KLSAgbCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICB3aGlsZSAobCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKLQotICAgICAgbmV4dCA9IGwtPm5leHQ7Ci0gICAgICBmcmVlIChsKTsKLSAgICAgIGwgPSBuZXh0OwotICAgIH0KLQotICBmcmVlIChvKTsKLX0KLQotLyogRnJlZSBhIGJsb2NrIGZyb20gYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgVGhpcyBhbHNvIGZyZWVzIGFsbCBtb3JlCi0gICByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2tzLiAgKi8KLQotdm9pZAotb2JqYWxsb2NfZnJlZV9ibG9jayAobywgYmxvY2spCi0gICAgIHN0cnVjdCBvYmphbGxvYyAqbzsKLSAgICAgUFRSIGJsb2NrOwotewotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnAsICpzbWFsbDsKLSAgY2hhciAqYiA9IChjaGFyICopIGJsb2NrOwotCi0gIC8qIEZpcnN0IHNldCBQIHRvIHRoZSBjaHVuayB3aGljaCBjb250YWlucyB0aGUgYmxvY2sgd2UgYXJlIGZyZWVpbmcsCi0gICAgIGFuZCBzZXQgUSB0byB0aGUgbGFzdCBzbWFsbCBvYmplY3QgY2h1bmsgd2Ugc2VlIGJlZm9yZSBQLiAgKi8KLSAgc21hbGwgPSBOVUxMOwotICBmb3IgKHAgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAocC0+Y3VycmVudF9wdHIgPT0gTlVMTCkKLQl7Ci0JICBpZiAoYiA+IChjaGFyICopIHAgJiYgYiA8IChjaGFyICopIHAgKyBDSFVOS19TSVpFKQotCSAgICBicmVhazsKLQkgIHNtYWxsID0gcDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGIgPT0gKGNoYXIgKikgcCArIENIVU5LX0hFQURFUl9TSVpFKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGNhbid0IGZpbmQgdGhlIGNodW5rLCB0aGUgY2FsbGVyIGhhcyBtYWRlIGEgbWlzdGFrZS4gICovCi0gIGlmIChwID09IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHAtPmN1cnJlbnRfcHRyID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpxOwotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpmaXJzdDsKLQotICAgICAgLyogVGhlIGJsb2NrIGlzIGluIGEgY2h1bmsgY29udGFpbmluZyBzbWFsbCBvYmplY3RzLiAgV2UgY2FuCi0JIGZyZWUgZXZlcnkgY2h1bmsgdGhyb3VnaCBTTUFMTCwgYmVjYXVzZSB0aGV5IGhhdmUgY2VydGFpbmx5Ci0JIGJlZW4gYWxsb2NhdGVkIG1vcmUgcmVjZW50bHkuICBBZnRlciBTTUFMTCwgd2Ugd2lsbCBub3Qgc2VlCi0JIGFueSBjaHVua3MgY29udGFpbmluZyBzbWFsbCBvYmplY3RzOyB3ZSBjYW4gZnJlZSBhbnkgYmlnCi0JIGNodW5rIGlmIHRoZSBjdXJyZW50X3B0ciBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQi4gIFdlCi0JIGNhbiB0aGVuIHJlc2V0IHRoZSBuZXcgY3VycmVudF9wdHIgdG8gQi4gICovCi0KLSAgICAgIGZpcnN0ID0gTlVMTDsKLSAgICAgIHEgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIHdoaWxlIChxICE9IHApCi0JewotCSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0JICBuZXh0ID0gcS0+bmV4dDsKLQkgIGlmIChzbWFsbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHNtYWxsID09IHEpCi0JCXNtYWxsID0gTlVMTDsKLQkgICAgICBmcmVlIChxKTsKLQkgICAgfQotCSAgZWxzZSBpZiAocS0+Y3VycmVudF9wdHIgPiBiKQotCSAgICBmcmVlIChxKTsKLQkgIGVsc2UgaWYgKGZpcnN0ID09IE5VTEwpCi0JICAgIGZpcnN0ID0gcTsKLQotCSAgcSA9IG5leHQ7Ci0JfQotCi0gICAgICBpZiAoZmlyc3QgPT0gTlVMTCkKLQlmaXJzdCA9IHA7Ci0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBmaXJzdDsKLQotICAgICAgLyogTm93IHN0YXJ0IGFsbG9jYXRpbmcgZnJvbSB0aGlzIHNtYWxsIGJsb2NrIGFnYWluLiAgKi8KLSAgICAgIG8tPmN1cnJlbnRfcHRyID0gYjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSAoKGNoYXIgKikgcCArIENIVU5LX1NJWkUpIC0gYjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnE7Ci0gICAgICBjaGFyICpjdXJyZW50X3B0cjsKLQotICAgICAgLyogVGhpcyBibG9jayBpcyBpbiBhIGxhcmdlIGNodW5rIGJ5IGl0c2VsZi4gIFdlIGNhbiBmcmVlCi0gICAgICAgICBldmVyeXRoaW5nIG9uIHRoZSBsaXN0IHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBibG9jay4gIFdlCi0gICAgICAgICB0aGVuIHN0YXJ0IGFsbG9jYXRpbmcgZnJvbSB0aGUgbmV4dCBjaHVuayBjb250YWluaW5nIHNtYWxsCi0gICAgICAgICBvYmplY3RzLCBzZXR0aW5nIGN1cnJlbnRfcHRyIGZyb20gdGhlIHZhbHVlIHN0b3JlZCB3aXRoIHRoZQotICAgICAgICAgbGFyZ2UgY2h1bmsgd2UgYXJlIGZyZWVpbmcuICAqLwotCi0gICAgICBjdXJyZW50X3B0ciA9IHAtPmN1cnJlbnRfcHRyOwotICAgICAgcCA9IHAtPm5leHQ7Ci0KLSAgICAgIHEgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIHdoaWxlIChxICE9IHApCi0JewotCSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0JICBuZXh0ID0gcS0+bmV4dDsKLQkgIGZyZWUgKHEpOwotCSAgcSA9IG5leHQ7Ci0JfQotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBwOwotCi0gICAgICB3aGlsZSAocC0+Y3VycmVudF9wdHIgIT0gTlVMTCkKLQlwID0gcC0+bmV4dDsKLQotICAgICAgby0+Y3VycmVudF9wdHIgPSBjdXJyZW50X3B0cjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSAoKGNoYXIgKikgcCArIENIVU5LX1NJWkUpIC0gY3VycmVudF9wdHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L29ic3RhY2suYyBiL2xpYmliZXJ0eS9vYnN0YWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzE4YjMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L29ic3RhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKiBvYnN0YWNrLmMgLSBzdWJyb3V0aW5lcyB1c2VkIGltcGxpY2l0bHkgYnkgb2JqZWN0IHN0YWNrIG1hY3JvcwotICAgQ29weXJpZ2h0IChDKSAxOTg4LDg5LDkwLDkxLDkyLDkzLDk0LDk2LDk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogTk9URSBCRUZPUkUgTU9ESUZZSU5HIFRISVMgRklMRTogVGhpcyB2ZXJzaW9uIG51bWJlciBtdXN0IGJlCi0gICBpbmNyZW1lbnRlZCB3aGVuZXZlciBjYWxsZXJzIGNvbXBpbGVkIHVzaW5nIGFuIG9sZCBvYnN0YWNrLmggY2FuIG5vCi0gICBsb25nZXIgcHJvcGVybHkgY2FsbCB0aGUgZnVuY3Rpb25zIGluIHRoaXMgb2JzdGFjay5jLiAgKi8KLSNkZWZpbmUgT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiAxCi0KLS8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAotICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgYW5kIHRoZSBpbnN0YWxsZWQgbGlicmFyeQotICAgc3VwcG9ydHMgdGhlIHNhbWUgbGlicmFyeSBpbnRlcmZhY2Ugd2UgZG8uICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VCi0gICBDIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0Ci0gICBmaWxlcywgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4JCS8qIFJhbmRvbSB0aGluZyB0byBnZXQgX19HTlVfTElCUkFSWV9fLiAgKi8KLSNpZiAhZGVmaW5lZCAoX0xJQkMpICYmIGRlZmluZWQgKF9fR05VX0xJQlJBUllfXykgJiYgX19HTlVfTElCUkFSWV9fID4gMQotI2luY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgotI2lmIF9HTlVfT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiA9PSBPQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OCi0jZGVmaW5lIEVMSURFX0NPREUKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmbmRlZiBFTElERV9DT0RFCi0KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2RlZmluZSBQT0lOVEVSIHZvaWQgKgotI2Vsc2UKLSNkZWZpbmUgUE9JTlRFUiBjaGFyICoKLSNlbmRpZgotCi0vKiBEZXRlcm1pbmUgZGVmYXVsdCBhbGlnbm1lbnQuICAqLwotc3RydWN0IGZvb2FsaWduIHtjaGFyIHg7IGRvdWJsZSBkO307Ci0jZGVmaW5lIERFRkFVTFRfQUxJR05NRU5UICBcCi0gICgoUFRSX0lOVF9UWVBFKSAoKGNoYXIgKikgJigoc3RydWN0IGZvb2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCi0vKiBJZiBtYWxsb2Mgd2VyZSByZWFsbHkgc21hcnQsIGl0IHdvdWxkIHJvdW5kIGFkZHJlc3NlcyB0byBERUZBVUxUX0FMSUdOTUVOVC4KLSAgIEJ1dCBpbiBmYWN0IGl0IG1pZ2h0IGJlIGxlc3Mgc21hcnQgYW5kIHJvdW5kIGFkZHJlc3NlcyB0byBhcyBtdWNoIGFzCi0gICBERUZBVUxUX1JPVU5ESU5HLiAgU28gd2UgcHJlcGFyZSBmb3IgaXQgdG8gZG8gdGhhdC4gICovCi11bmlvbiBmb29yb3VuZCB7bG9uZyB4OyBkb3VibGUgZDt9OwotI2RlZmluZSBERUZBVUxUX1JPVU5ESU5HIChzaXplb2YgKHVuaW9uIGZvb3JvdW5kKSkKLQotLyogV2hlbiB3ZSBjb3B5IGEgbG9uZyBibG9jayBvZiBkYXRhLCB0aGlzIGlzIHRoZSB1bml0IHRvIGRvIGl0IHdpdGguCi0gICBPbiBzb21lIG1hY2hpbmVzLCBjb3B5aW5nIHN1Y2Nlc3NpdmUgaW50cyBkb2VzIG5vdCB3b3JrOwotICAgaW4gc3VjaCBhIGNhc2UsIHJlZGVmaW5lIENPUFlJTkdfVU5JVCB0byBgbG9uZycgKGlmIHRoYXQgd29ya3MpCi0gICBvciBgY2hhcicgYXMgYSBsYXN0IHJlc29ydC4gICovCi0jaWZuZGVmIENPUFlJTkdfVU5JVAotI2RlZmluZSBDT1BZSU5HX1VOSVQgaW50Ci0jZW5kaWYKLQotCi0vKiBUaGUgZnVuY3Rpb25zIGFsbG9jYXRpbmcgbW9yZSByb29tIGJ5IGNhbGxpbmcgYG9ic3RhY2tfY2h1bmtfYWxsb2MnCi0gICBqdW1wIHRvIHRoZSBoYW5kbGVyIHBvaW50ZWQgdG8gYnkgYG9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXInLgotICAgVGhpcyB2YXJpYWJsZSBieSBkZWZhdWx0IHBvaW50cyB0byB0aGUgaW50ZXJuYWwgZnVuY3Rpb24KLSAgIGBwcmludF9hbmRfYWJvcnQnLiAgKi8KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLXN0YXRpYyB2b2lkIHByaW50X2FuZF9hYm9ydCAodm9pZCk7Ci12b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKHZvaWQpID0gcHJpbnRfYW5kX2Fib3J0OwotI2Vsc2UKLXN0YXRpYyB2b2lkIHByaW50X2FuZF9hYm9ydCAoKTsKLXZvaWQgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKSA9IHByaW50X2FuZF9hYm9ydDsKLSNlbmRpZgotCi0vKiBFeGl0IHZhbHVlIHVzZWQgd2hlbiBgcHJpbnRfYW5kX2Fib3J0JyBpcyB1c2VkLiAgKi8KLSNpZiBkZWZpbmVkIF9fR05VX0xJQlJBUllfXyB8fCBkZWZpbmVkIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmbmRlZiBFWElUX0ZBSUxVUkUKLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKLSNlbmRpZgotaW50IG9ic3RhY2tfZXhpdF9mYWlsdXJlID0gRVhJVF9GQUlMVVJFOwotCi0vKiBUaGUgbm9uLUdOVS1DIG1hY3JvcyBjb3B5IHRoZSBvYnN0YWNrIGludG8gdGhpcyBnbG9iYWwgdmFyaWFibGUKLSAgIHRvIGF2b2lkIG11bHRpcGxlIGV2YWx1YXRpb24uICAqLwotCi1zdHJ1Y3Qgb2JzdGFjayAqX29ic3RhY2s7Ci0KLS8qIERlZmluZSBhIG1hY3JvIHRoYXQgZWl0aGVyIGNhbGxzIGZ1bmN0aW9ucyB3aXRoIHRoZSB0cmFkaXRpb25hbCBtYWxsb2MvZnJlZQotICAgY2FsbGluZyBpbnRlcmZhY2UsIG9yIGNhbGxzIGZ1bmN0aW9ucyB3aXRoIHRoZSBtbWFsbG9jL21mcmVlIGludGVyZmFjZQotICAgKHRoYXQgYWRkcyBhbiBleHRyYSBmaXJzdCBhcmd1bWVudCksIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB1c2VfZXh0cmFfYXJnLgotICAgRm9yIGZyZWUsIGRvIG5vdCB1c2UgPzosIHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIHRoZSBNSVBTIGNvbXBpbGVycywKLSAgIGRvIG5vdCBhbGxvdyAoZXhwcikgPyB2b2lkIDogdm9pZC4gICovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSNkZWZpbmUgQ0FMTF9DSFVOS0ZVTihoLCBzaXplKSBcCi0gICgoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgID8gKCooaCktPmNodW5rZnVuKSAoKGgpLT5leHRyYV9hcmcsIChzaXplKSkgXAotICAgOiAoKihzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSAobG9uZykpIChoKS0+Y2h1bmtmdW4pICgoc2l6ZSkpKQotCi0jZGVmaW5lIENBTExfRlJFRUZVTihoLCBvbGRfY2h1bmspIFwKLSAgZG8geyBcCi0gICAgaWYgKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICAgICAoKihoKS0+ZnJlZWZ1bikgKChoKS0+ZXh0cmFfYXJnLCAob2xkX2NodW5rKSk7IFwKLSAgICBlbHNlIFwKLSAgICAgICgqKHZvaWQgKCopICh2b2lkICopKSAoaCktPmZyZWVmdW4pICgob2xkX2NodW5rKSk7IFwKLSAgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIENBTExfQ0hVTktGVU4oaCwgc2l6ZSkgXAotICAoKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICA/ICgqKGgpLT5jaHVua2Z1bikgKChoKS0+ZXh0cmFfYXJnLCAoc2l6ZSkpIFwKLSAgIDogKCooc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikgKCkpIChoKS0+Y2h1bmtmdW4pICgoc2l6ZSkpKQotCi0jZGVmaW5lIENBTExfRlJFRUZVTihoLCBvbGRfY2h1bmspIFwKLSAgZG8geyBcCi0gICAgaWYgKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICAgICAoKihoKS0+ZnJlZWZ1bikgKChoKS0+ZXh0cmFfYXJnLCAob2xkX2NodW5rKSk7IFwKLSAgICBlbHNlIFwKLSAgICAgICgqKHZvaWQgKCopICgpKSAoaCktPmZyZWVmdW4pICgob2xkX2NodW5rKSk7IFwKLSAgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0MCi0vKiBJbml0aWFsaXplIGFuIG9ic3RhY2sgSCBmb3IgdXNlLiAgU3BlY2lmeSBjaHVuayBzaXplIFNJWkUgKDAgbWVhbnMgZGVmYXVsdCkuCi0gICBPYmplY3RzIHN0YXJ0IG9uIG11bHRpcGxlcyBvZiBBTElHTk1FTlQgKDAgbWVhbnMgdXNlIGRlZmF1bHQpLgotICAgQ0hVTktGVU4gaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBhbGxvY2F0ZSBjaHVua3MsCi0gICBhbmQgRlJFRUZVTiB0aGUgZnVuY3Rpb24gdG8gZnJlZSB0aGVtLgotCi0gICBSZXR1cm4gbm9uemVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIG91dCBvZiBtZW1vcnkuCi0gICBUbyByZWNvdmVyIGZyb20gYW4gb3V0IG9mIG1lbW9yeSBlcnJvciwKLSAgIGZyZWUgdXAgc29tZSBtZW1vcnksIHRoZW4gY2FsbCB0aGlzIGFnYWluLiAgKi8KLQotaW50Ci1fb2JzdGFja19iZWdpbiAoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1bikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgYWxpZ25tZW50OwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pIChsb25nKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICh2b2lkICopOwotI2Vsc2UKLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICgpOwotI2VuZGlmCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7IC8qIHBvaW50cyB0byBuZXcgY2h1bmsgKi8KLQotICBpZiAoYWxpZ25tZW50ID09IDApCi0gICAgYWxpZ25tZW50ID0gKGludCkgREVGQVVMVF9BTElHTk1FTlQ7Ci0gIGlmIChzaXplID09IDApCi0gICAgLyogRGVmYXVsdCBzaXplIGlzIHdoYXQgR05VIG1hbGxvYyBjYW4gZml0IGluIGEgNDA5Ni1ieXRlIGJsb2NrLiAgKi8KLSAgICB7Ci0gICAgICAvKiAxMiBpcyBzaXplb2YgKG1oZWFkKSBhbmQgNCBpcyBFWFRSQSBmcm9tIEdOVSBtYWxsb2MuCi0JIFVzZSB0aGUgdmFsdWVzIGZvciByYW5nZSBjaGVja2luZywgYmVjYXVzZSBpZiByYW5nZSBjaGVja2luZyBpcyBvZmYsCi0JIHRoZSBleHRyYSBieXRlcyB3b24ndCBiZSBtaXNzZWQgdGVycmlibHksIGJ1dCBpZiByYW5nZSBjaGVja2luZyBpcyBvbgotCSBhbmQgd2UgdXNlZCBhIGxhcmdlciByZXF1ZXN0LCBhIHdob2xlIGV4dHJhIDQwOTYgYnl0ZXMgd291bGQgYmUKLQkgYWxsb2NhdGVkLgotCi0JIFRoZXNlIG51bWJlciBhcmUgaXJyZWxldmFudCB0byB0aGUgbmV3IEdOVSBtYWxsb2MuICBJIHN1c3BlY3QgaXQgaXMKLQkgbGVzcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QuICAqLwotICAgICAgaW50IGV4dHJhID0gKCgoKDEyICsgREVGQVVMVF9ST1VORElORyAtIDEpICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpCi0JCSAgICArIDQgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkKLQkJICAgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSk7Ci0gICAgICBzaXplID0gNDA5NiAtIGV4dHJhOwotICAgIH0KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikodm9pZCAqLCBsb25nKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSAodm9pZCAoKikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopKSBmcmVlZnVuOwotI2Vsc2UKLSAgaC0+Y2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICogKCopKCkpIGNodW5rZnVuOwotICBoLT5mcmVlZnVuID0gZnJlZWZ1bjsKLSNlbmRpZgotICBoLT5jaHVua19zaXplID0gc2l6ZTsKLSAgaC0+YWxpZ25tZW50X21hc2sgPSBhbGlnbm1lbnQgLSAxOwotICBoLT51c2VfZXh0cmFfYXJnID0gMDsKLQotICBjaHVuayA9IGgtPmNodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgaCAtPiBjaHVua19zaXplKTsKLSAgaWYgKCFjaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSA9IGNodW5rLT5jb250ZW50czsKLSAgaC0+Y2h1bmtfbGltaXQgPSBjaHVuay0+bGltaXQKLSAgICA9IChjaGFyICopIGNodW5rICsgaC0+Y2h1bmtfc2l6ZTsKLSAgY2h1bmstPnByZXYgPSAwOwotICAvKiBUaGUgaW5pdGlhbCBjaHVuayBub3cgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLSAgaC0+YWxsb2NfZmFpbGVkID0gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotX29ic3RhY2tfYmVnaW5fMSAoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKFBPSU5URVIsIGxvbmcpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKFBPSU5URVIsIFBPSU5URVIpOwotI2Vsc2UKLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICgpOwotI2VuZGlmCi0gICAgIFBPSU5URVIgYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOyAvKiBwb2ludHMgdG8gbmV3IGNodW5rICovCi0KLSAgaWYgKGFsaWdubWVudCA9PSAwKQotICAgIGFsaWdubWVudCA9IChpbnQpIERFRkFVTFRfQUxJR05NRU5UOwotICBpZiAoc2l6ZSA9PSAwKQotICAgIC8qIERlZmF1bHQgc2l6ZSBpcyB3aGF0IEdOVSBtYWxsb2MgY2FuIGZpdCBpbiBhIDQwOTYtYnl0ZSBibG9jay4gICovCi0gICAgewotICAgICAgLyogMTIgaXMgc2l6ZW9mIChtaGVhZCkgYW5kIDQgaXMgRVhUUkEgZnJvbSBHTlUgbWFsbG9jLgotCSBVc2UgdGhlIHZhbHVlcyBmb3IgcmFuZ2UgY2hlY2tpbmcsIGJlY2F1c2UgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb2ZmLAotCSB0aGUgZXh0cmEgYnl0ZXMgd29uJ3QgYmUgbWlzc2VkIHRlcnJpYmx5LCBidXQgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb24KLQkgYW5kIHdlIHVzZWQgYSBsYXJnZXIgcmVxdWVzdCwgYSB3aG9sZSBleHRyYSA0MDk2IGJ5dGVzIHdvdWxkIGJlCi0JIGFsbG9jYXRlZC4KLQotCSBUaGVzZSBudW1iZXIgYXJlIGlycmVsZXZhbnQgdG8gdGhlIG5ldyBHTlUgbWFsbG9jLiAgSSBzdXNwZWN0IGl0IGlzCi0JIGxlc3Mgc2Vuc2l0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0LiAgKi8KLSAgICAgIGludCBleHRyYSA9ICgoKCgxMiArIERFRkFVTFRfUk9VTkRJTkcgLSAxKSAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKQotCQkgICAgKyA0ICsgREVGQVVMVF9ST1VORElORyAtIDEpCi0JCSAgICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpOwotICAgICAgc2l6ZSA9IDQwOTYgLSBleHRyYTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSAmJiBfX1NURENfXwotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikodm9pZCAqLGxvbmcpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9ICh2b2lkICgqKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIGZyZWVmdW47Ci0jZWxzZQotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikoKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSBmcmVlZnVuOwotI2VuZGlmCi0gIGgtPmNodW5rX3NpemUgPSBzaXplOwotICBoLT5hbGlnbm1lbnRfbWFzayA9IGFsaWdubWVudCAtIDE7Ci0gIGgtPmV4dHJhX2FyZyA9IGFyZzsKLSAgaC0+dXNlX2V4dHJhX2FyZyA9IDE7Ci0KLSAgY2h1bmsgPSBoLT5jaHVuayA9IENBTExfQ0hVTktGVU4gKGgsIGggLT4gY2h1bmtfc2l6ZSk7Ci0gIGlmICghY2h1bmspCi0gICAgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKTsKLSAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgPSBjaHVuay0+Y29udGVudHM7Ci0gIGgtPmNodW5rX2xpbWl0ID0gY2h1bmstPmxpbWl0Ci0gICAgPSAoY2hhciAqKSBjaHVuayArIGgtPmNodW5rX3NpemU7Ci0gIGNodW5rLT5wcmV2ID0gMDsKLSAgLyogVGhlIGluaXRpYWwgY2h1bmsgbm93IGNvbnRhaW5zIG5vIGVtcHR5IG9iamVjdC4gICovCi0gIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7Ci0gIGgtPmFsbG9jX2ZhaWxlZCA9IDA7Ci0gIHJldHVybiAxOwotfQotCi0vKiBBbGxvY2F0ZSBhIG5ldyBjdXJyZW50IGNodW5rIGZvciB0aGUgb2JzdGFjayAqSAotICAgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBMRU5HVEggYnl0ZXMgbmVlZCB0byBiZSBhZGRlZAotICAgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LCBvciBhIG5ldyBvYmplY3Qgb2YgbGVuZ3RoIExFTkdUSCBhbGxvY2F0ZWQuCi0gICBDb3BpZXMgYW55IHBhcnRpYWwgb2JqZWN0IGZyb20gdGhlIGVuZCBvZiB0aGUgb2xkIGNodW5rCi0gICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgb25lLiAgKi8KLQotdm9pZAotX29ic3RhY2tfbmV3Y2h1bmsgKGgsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqb2xkX2NodW5rID0gaC0+Y2h1bms7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbmV3X2NodW5rOwotICByZWdpc3RlciBsb25nCW5ld19zaXplOwotICByZWdpc3RlciBsb25nIG9ial9zaXplID0gaC0+bmV4dF9mcmVlIC0gaC0+b2JqZWN0X2Jhc2U7Ci0gIHJlZ2lzdGVyIGxvbmcgaTsKLSAgbG9uZyBhbHJlYWR5OwotCi0gIC8qIENvbXB1dGUgc2l6ZSBmb3IgbmV3IGNodW5rLiAgKi8KLSAgbmV3X3NpemUgPSAob2JqX3NpemUgKyBsZW5ndGgpICsgKG9ial9zaXplID4+IDMpICsgMTAwOwotICBpZiAobmV3X3NpemUgPCBoLT5jaHVua19zaXplKQotICAgIG5ld19zaXplID0gaC0+Y2h1bmtfc2l6ZTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbmV3IGNodW5rLiAgKi8KLSAgbmV3X2NodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgbmV3X3NpemUpOwotICBpZiAoIW5ld19jaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5jaHVuayA9IG5ld19jaHVuazsKLSAgbmV3X2NodW5rLT5wcmV2ID0gb2xkX2NodW5rOwotICBuZXdfY2h1bmstPmxpbWl0ID0gaC0+Y2h1bmtfbGltaXQgPSAoY2hhciAqKSBuZXdfY2h1bmsgKyBuZXdfc2l6ZTsKLQotICAvKiBNb3ZlIHRoZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIG5ldyBjaHVuay4KLSAgICAgV29yZCBhdCBhIHRpbWUgaXMgZmFzdCBhbmQgaXMgc2FmZSBpZiB0aGUgb2JqZWN0Ci0gICAgIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLiAgKi8KLSAgaWYgKGgtPmFsaWdubWVudF9tYXNrICsgMSA+PSBERUZBVUxUX0FMSUdOTUVOVCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBvYmpfc2l6ZSAvIHNpemVvZiAoQ09QWUlOR19VTklUKSAtIDE7Ci0JICAgaSA+PSAwOyBpLS0pCi0JKChDT1BZSU5HX1VOSVQgKiluZXdfY2h1bmstPmNvbnRlbnRzKVtpXQotCSAgPSAoKENPUFlJTkdfVU5JVCAqKWgtPm9iamVjdF9iYXNlKVtpXTsKLSAgICAgIC8qIFdlIHVzZWQgdG8gY29weSB0aGUgb2RkIGZldyByZW1haW5pbmcgYnl0ZXMgYXMgb25lIGV4dHJhIENPUFlJTkdfVU5JVCwKLQkgYnV0IHRoYXQgY2FuIGNyb3NzIGEgcGFnZSBib3VuZGFyeSBvbiBhIG1hY2hpbmUKLQkgd2hpY2ggZG9lcyBub3QgZG8gc3RyaWN0IGFsaWdubWVudCBmb3IgQ09QWUlOR19VTklUUy4gICovCi0gICAgICBhbHJlYWR5ID0gb2JqX3NpemUgLyBzaXplb2YgKENPUFlJTkdfVU5JVCkgKiBzaXplb2YgKENPUFlJTkdfVU5JVCk7Ci0gICAgfQotICBlbHNlCi0gICAgYWxyZWFkeSA9IDA7Ci0gIC8qIENvcHkgcmVtYWluaW5nIGJ5dGVzIG9uZSBieSBvbmUuICAqLwotICBmb3IgKGkgPSBhbHJlYWR5OyBpIDwgb2JqX3NpemU7IGkrKykKLSAgICBuZXdfY2h1bmstPmNvbnRlbnRzW2ldID0gaC0+b2JqZWN0X2Jhc2VbaV07Ci0KLSAgLyogSWYgdGhlIG9iamVjdCBqdXN0IGNvcGllZCB3YXMgdGhlIG9ubHkgZGF0YSBpbiBPTERfQ0hVTkssCi0gICAgIGZyZWUgdGhhdCBjaHVuayBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGNoYWluLgotICAgICBCdXQgbm90IGlmIHRoYXQgY2h1bmsgbWlnaHQgY29udGFpbiBhbiBlbXB0eSBvYmplY3QuICAqLwotICBpZiAoaC0+b2JqZWN0X2Jhc2UgPT0gb2xkX2NodW5rLT5jb250ZW50cyAmJiAhIGgtPm1heWJlX2VtcHR5X29iamVjdCkKLSAgICB7Ci0gICAgICBuZXdfY2h1bmstPnByZXYgPSBvbGRfY2h1bmstPnByZXY7Ci0gICAgICBDQUxMX0ZSRUVGVU4gKGgsIG9sZF9jaHVuayk7Ci0gICAgfQotCi0gIGgtPm9iamVjdF9iYXNlID0gbmV3X2NodW5rLT5jb250ZW50czsKLSAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgKyBvYmpfc2l6ZTsKLSAgLyogVGhlIG5ldyBjaHVuayBjZXJ0YWlubHkgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0IHlldC4gICovCi0gIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7Ci19Ci0KLS8qIFJldHVybiBub256ZXJvIGlmIG9iamVjdCBPQkogaGFzIGJlZW4gYWxsb2NhdGVkIGZyb20gb2JzdGFjayBILgotICAgVGhpcyBpcyBoZXJlIGZvciBkZWJ1Z2dpbmcuCi0gICBJZiB5b3UgdXNlIGl0IGluIGEgcHJvZ3JhbSwgeW91IGFyZSBwcm9iYWJseSBsb3NpbmcuICAqLwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0vKiBTdXBwcmVzcyAtV21pc3NpbmctcHJvdG90eXBlcyB3YXJuaW5nLiAgV2UgZG9uJ3Qgd2FudCB0byBkZWNsYXJlIHRoaXMgaW4KLSAgIG9ic3RhY2suaCBiZWNhdXNlIGl0IGlzIGp1c3QgZm9yIGRlYnVnZ2luZy4gICovCi1pbnQgX29ic3RhY2tfYWxsb2NhdGVkX3AgKHN0cnVjdCBvYnN0YWNrICpoLCBQT0lOVEVSIG9iaik7Ci0jZW5kaWYKLQotaW50Ci1fb2JzdGFja19hbGxvY2F0ZWRfcCAoaCwgb2JqKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgUE9JTlRFUiBvYmo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbHA7CS8qIGJlbG93IGFkZHIgb2YgYW55IG9iamVjdHMgaW4gdGhpcyBjaHVuayAqLwotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnBscDsJLyogcG9pbnQgdG8gcHJldmlvdXMgY2h1bmsgaWYgYW55ICovCi0KLSAgbHAgPSAoaCktPmNodW5rOwotICAvKiBXZSB1c2UgPj0gcmF0aGVyIHRoYW4gPiBzaW5jZSB0aGUgb2JqZWN0IGNhbm5vdCBiZSBleGFjdGx5IGF0Ci0gICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNodW5rIGJ1dCBtaWdodCBiZSBhbiBlbXB0eSBvYmplY3QgZXhhY3RseQotICAgICBhdCB0aGUgZW5kIG9mIGFuIGFkamFjZW50IGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIGxwID0gcGxwOwotICAgIH0KLSAgcmV0dXJuIGxwICE9IDA7Ci19Ci0MCi0vKiBGcmVlIG9iamVjdHMgaW4gb2JzdGFjayBILCBpbmNsdWRpbmcgT0JKIGFuZCBldmVyeXRoaW5nIGFsbG9jYXRlCi0gICBtb3JlIHJlY2VudGx5IHRoYW4gT0JKLiAgSWYgT0JKIGlzIHplcm8sIGZyZWUgZXZlcnl0aGluZyBpbiBILiAgKi8KLQotI3VuZGVmIG9ic3RhY2tfZnJlZQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhcyB0d28gbmFtZXMgd2l0aCBpZGVudGljYWwgZGVmaW5pdGlvbnMuCi0gICBUaGlzIGlzIHRoZSBmaXJzdCBvbmUsIGNhbGxlZCBmcm9tIG5vbi1BTlNJIGNvZGUuICAqLwotCi12b2lkCi1fb2JzdGFja19mcmVlIChoLCBvYmopCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBQT0lOVEVSIG9iajsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpscDsJLyogYmVsb3cgYWRkciBvZiBhbnkgb2JqZWN0cyBpbiB0aGlzIGNodW5rICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcGxwOwkvKiBwb2ludCB0byBwcmV2aW91cyBjaHVuayBpZiBhbnkgKi8KLQotICBscCA9IGgtPmNodW5rOwotICAvKiBXZSB1c2UgPj0gYmVjYXVzZSB0aGVyZSBjYW5ub3QgYmUgYW4gb2JqZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjaHVuay4KLSAgICAgQnV0IHRoZXJlIGNhbiBiZSBhbiBlbXB0eSBvYmplY3QgYXQgdGhhdCBhZGRyZXNzCi0gICAgIGF0IHRoZSBlbmQgb2YgYW5vdGhlciBjaHVuay4gICovCi0gIHdoaWxlIChscCAhPSAwICYmICgoUE9JTlRFUikgbHAgPj0gb2JqIHx8IChQT0lOVEVSKSAobHApLT5saW1pdCA8IG9iaikpCi0gICAgewotICAgICAgcGxwID0gbHAtPnByZXY7Ci0gICAgICBDQUxMX0ZSRUVGVU4gKGgsIGxwKTsKLSAgICAgIGxwID0gcGxwOwotICAgICAgLyogSWYgd2Ugc3dpdGNoIGNodW5rcywgd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHRoZSBuZXcgY3VycmVudAotCSBjaHVuayBjb250YWlucyBhbiBlbXB0eSBvYmplY3QsIHNvIGFzc3VtZSB0aGF0IGl0IG1heS4gICovCi0gICAgICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxOwotICAgIH0KLSAgaWYgKGxwKQotICAgIHsKLSAgICAgIGgtPm9iamVjdF9iYXNlID0gaC0+bmV4dF9mcmVlID0gKGNoYXIgKikgKG9iaik7Ci0gICAgICBoLT5jaHVua19saW1pdCA9IGxwLT5saW1pdDsKLSAgICAgIGgtPmNodW5rID0gbHA7Ci0gICAgfQotICBlbHNlIGlmIChvYmogIT0gMCkKLSAgICAvKiBvYmogaXMgbm90IGluIGFueSBvZiB0aGUgY2h1bmtzISAqLwotICAgIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZnJvbSBBTlNJIGNvZGUuICAqLwotCi12b2lkCi1vYnN0YWNrX2ZyZWUgKGgsIG9iaikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIFBPSU5URVIgb2JqOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmxwOwkvKiBiZWxvdyBhZGRyIG9mIGFueSBvYmplY3RzIGluIHRoaXMgY2h1bmsgKi8KLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwbHA7CS8qIHBvaW50IHRvIHByZXZpb3VzIGNodW5rIGlmIGFueSAqLwotCi0gIGxwID0gaC0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSBiZWNhdXNlIHRoZXJlIGNhbm5vdCBiZSBhbiBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNodW5rLgotICAgICBCdXQgdGhlcmUgY2FuIGJlIGFuIGVtcHR5IG9iamVjdCBhdCB0aGF0IGFkZHJlc3MKLSAgICAgYXQgdGhlIGVuZCBvZiBhbm90aGVyIGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgbHApOwotICAgICAgbHAgPSBwbHA7Ci0gICAgICAvKiBJZiB3ZSBzd2l0Y2ggY2h1bmtzLCB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBjdXJyZW50Ci0JIGNodW5rIGNvbnRhaW5zIGFuIGVtcHR5IG9iamVjdCwgc28gYXNzdW1lIHRoYXQgaXQgbWF5LiAgKi8KLSAgICAgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7Ci0gICAgfQotICBpZiAobHApCi0gICAgewotICAgICAgaC0+b2JqZWN0X2Jhc2UgPSBoLT5uZXh0X2ZyZWUgPSAoY2hhciAqKSAob2JqKTsKLSAgICAgIGgtPmNodW5rX2xpbWl0ID0gbHAtPmxpbWl0OwotICAgICAgaC0+Y2h1bmsgPSBscDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9iaiAhPSAwKQotICAgIC8qIG9iaiBpcyBub3QgaW4gYW55IG9mIHRoZSBjaHVua3MhICovCi0gICAgYWJvcnQgKCk7Ci19Ci0MCi1pbnQKLV9vYnN0YWNrX21lbW9yeV91c2VkIChoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rKiBscDsKLSAgcmVnaXN0ZXIgaW50IG5ieXRlcyA9IDA7Ci0KLSAgZm9yIChscCA9IGgtPmNodW5rOyBscCAhPSAwOyBscCA9IGxwLT5wcmV2KQotICAgIHsKLSAgICAgIG5ieXRlcyArPSBscC0+bGltaXQgLSAoY2hhciAqKSBscDsKLSAgICB9Ci0gIHJldHVybiBuYnl0ZXM7Ci19Ci0MCi0vKiBEZWZpbmUgdGhlIGVycm9yIGhhbmRsZXIuICAqLwotI2lmbmRlZiBfCi0jIGlmZGVmIEhBVkVfTElCSU5UTF9ICi0jICBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jICBpZm5kZWYgXwotIyAgIGRlZmluZSBfKFN0cikgZ2V0dGV4dCAoU3RyKQotIyAgZW5kaWYKLSMgZWxzZQotIyAgZGVmaW5lIF8oU3RyKSAoU3RyKQotIyBlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hbmRfYWJvcnQgKCkKLXsKLSAgZnB1dHMgKF8oIm1lbW9yeSBleGhhdXN0ZWRcbiIpLCBzdGRlcnIpOwotICBleGl0IChvYnN0YWNrX2V4aXRfZmFpbHVyZSk7Ci19Ci0MCi0jaWYgMAotLyogVGhlc2UgYXJlIG5vdyB0dXJuZWQgb2ZmIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlIGl0Ci0gICBhbmQgaXQgdXNlcyBiY29weSB2aWEgb2JzdGFja19ncm93LCB3aGljaCBjYXVzZXMgdHJvdWJsZSBvbiBzeXNWLiAgKi8KLQotLyogTm93IGRlZmluZSB0aGUgZnVuY3Rpb25hbCB2ZXJzaW9ucyBvZiB0aGUgb2JzdGFjayBtYWNyb3MuCi0gICBEZWZpbmUgdGhlbSB0byBzaW1wbHkgdXNlIHRoZSBjb3JyZXNwb25kaW5nIG1hY3JvcyB0byBkbyB0aGUgam9iLiAgKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotLyogVGhlc2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZG8gbm90IHdvcmsgd2l0aCBub24tQU5TSSBwcmVwcm9jZXNzb3JzOwotICAgdGhleSB3b24ndCBwYXNzIHRocm91Z2ggdGhlIG1hY3JvIG5hbWVzIGluIHBhcmVudGhlc2VzLiAgKi8KLQotLyogVGhlIGZ1bmN0aW9uIG5hbWVzIGFwcGVhciBpbiBwYXJlbnRoZXNlcyBpbiBvcmRlciB0byBwcmV2ZW50Ci0gICB0aGUgbWFjcm8tZGVmaW5pdGlvbnMgb2YgdGhlIG5hbWVzIGZyb20gYmVpbmcgZXhwYW5kZWQgdGhlcmUuICAqLwotCi1QT0lOVEVSIChvYnN0YWNrX2Jhc2UpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfYmFzZSAob2JzdGFjayk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfbmV4dF9mcmVlKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX25leHRfZnJlZSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19vYmplY3Rfc2l6ZSkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19vYmplY3Rfc2l6ZSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19yb29tKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX3Jvb20gKG9ic3RhY2spOwotfQotCi1pbnQgKG9ic3RhY2tfbWFrZV9yb29tKSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfbWFrZV9yb29tIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrX2dyb3cpIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfZ3JvdyAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotdm9pZCAob2JzdGFja19ncm93MCkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ncm93MCAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotdm9pZCAob2JzdGFja18xZ3JvdykgKG9ic3RhY2ssIGNoYXJhY3RlcikKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBjaGFyYWN0ZXI7Ci17Ci0gIG9ic3RhY2tfMWdyb3cgKG9ic3RhY2ssIGNoYXJhY3Rlcik7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfYmxhbmspIChvYnN0YWNrLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgbGVuZ3RoOwotewotICBvYnN0YWNrX2JsYW5rIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrXzFncm93X2Zhc3QpIChvYnN0YWNrLCBjaGFyYWN0ZXIpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgY2hhcmFjdGVyOwotewotICBvYnN0YWNrXzFncm93X2Zhc3QgKG9ic3RhY2ssIGNoYXJhY3Rlcik7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfYmxhbmtfZmFzdCkgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfYmxhbmtfZmFzdCAob2JzdGFjaywgbGVuZ3RoKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19maW5pc2gpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfZmluaXNoIChvYnN0YWNrKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19hbGxvYykgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2FsbG9jIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2NvcHkpIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2NvcHkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfY29weTApIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2NvcHkwIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi0jZW5kaWYgLyogX19TVERDX18gKi8KLQotI2VuZGlmIC8qIDAgKi8KLQotI2VuZGlmCS8qICFFTElERV9DT0RFICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcGV4ZWN1dGUuYyBiL2xpYmliZXJ0eS9wZXhlY3V0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ0Yzk4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9wZXhlY3V0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM4ICswLDAgQEAKLS8qIFV0aWxpdGllcyB0byBleGVjdXRlIGEgcHJvZ3JhbSBpbiBhIHN1YnByb2Nlc3MgKHBvc3NpYmx5IGxpbmtlZCBieSBwaXBlcwotICAgd2l0aCBvdGhlciBzdWJwcm9jZXNzZXMpLCBhbmQgd2FpdCBmb3IgaXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZXhwb3J0cyB0d28gZnVuY3Rpb25zOiBwZXhlY3V0ZSBhbmQgcHdhaXQuICAqLwotCi0vKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYXQgbGVhc3QgdHdvIHBsYWNlczogbGliaWJlcnR5IGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2RlZmluZSBJU1NQQUNFICh4KSBpc3NwYWNlKHgpCi0jaWZkZWYgSEFWRV9TWVNfV0FJVF9ICi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNlbmRpZgotCi0jaWZkZWYgdmZvcmsgLyogQXV0b2NvbmYgbWF5IGRlZmluZSB0aGlzIHRvIGZvcmsgZm9yIHVzLiAqLwotIyBkZWZpbmUgVkZPUktfU1RSSU5HICJmb3JrIgotI2Vsc2UKLSMgZGVmaW5lIFZGT1JLX1NUUklORyAidmZvcmsiCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1ZGT1JLX0gKLSNpbmNsdWRlIDx2Zm9yay5oPgotI2VuZGlmCi0jaWZkZWYgVk1TCi0jZGVmaW5lIHZmb3JrKCkgKGRlY2MkJGFsbG9jX3Zmb3JrX2Jsb2NrcygpID49IDAgPyBcCi0gICAgICAgICAgICAgICBsaWIkZ2V0X2N1cnJlbnRfaW52b19jb250ZXh0KGRlY2MkJGdldF92Zm9ya19qbXBidWYoKSkgOiAtMSkKLSNlbmRpZiAvKiBWTVMgKi8KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWYgIWRlZmluZWQgKF9fQ1lHV0lOX18pICYmIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSNkZWZpbmUgX19DWUdXSU5fXyAxCi0jZW5kaWYKLQotLyogc3RkaW4gZmlsZSBudW1iZXIuICAqLwotI2RlZmluZSBTVERJTl9GSUxFX05PIDAKLQotLyogc3Rkb3V0IGZpbGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU1RET1VUX0ZJTEVfTk8gMQotCi0vKiB2YWx1ZSBvZiBgcGlwZSc6IHBvcnQgaW5kZXggZm9yIHJlYWRpbmcuICAqLwotI2RlZmluZSBSRUFEX1BPUlQgMAotCi0vKiB2YWx1ZSBvZiBgcGlwZSc6IHBvcnQgaW5kZXggZm9yIHdyaXRpbmcuICAqLwotI2RlZmluZSBXUklURV9QT1JUIDEKLQotc3RhdGljIGNoYXIgKmluc3RhbGxfZXJyb3JfbXNnID0gImluc3RhbGxhdGlvbiBwcm9ibGVtLCBjYW5ub3QgZXhlYyBgJXMnIjsKLQotLyogcGV4ZWN1dGU6IGV4ZWN1dGUgYSBwcm9ncmFtLgotCi0gICBQUk9HUkFNIGFuZCBBUkdWIGFyZSB0aGUgYXJndW1lbnRzIHRvIGV4ZWN2L2V4ZWN2cC4KLQotICAgVEhJU19QTkFNRSBpcyBuYW1lIG9mIHRoZSBjYWxsaW5nIHByb2dyYW0gKGkuZS4gYXJndlswXSkuCi0KLSAgIFRFTVBfQkFTRSBpcyB0aGUgcGF0aCBuYW1lLCBzYW5zIHN1ZmZpeCwgb2YgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLSAgIGlmIG5lZWRlZC4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBNU0RPUyBwb3J0cyB0aGF0IGRvbid0IHVzZQotICAgR08zMiAoZG8gYW55IHN0aWxsIGV4aXN0PykuICBQb3J0cyB0aGF0IGRvbid0IG5lZWQgaXQgY2FuIHBhc3MgTlVMTC4KLQotICAgKEZMQUdTICYgUEVYRUNVVEVfU0VBUkNIKSBpcyBub24temVybyBpZiAkUEFUSCBzaG91bGQgYmUgc2VhcmNoZWQKLSAgICg/Pz8gSXQncyBub3QgY2xlYXIgdGhhdCBHQ0MgcGFzc2VzIHRoaXMgZmxhZyBjb3JyZWN0bHkpLgotICAgKEZMQUdTICYgUEVYRUNVVEVfRklSU1QpIGlzIG5vbnplcm8gZm9yIHRoZSBmaXJzdCBwcm9jZXNzIGluIGNoYWluLgotICAgKEZMQUdTICYgUEVYRUNVVEVfRklSU1QpIGlzIG5vbnplcm8gZm9yIHRoZSBsYXN0IHByb2Nlc3MgaW4gY2hhaW4uCi0gICBGSVJTVF9MQVNUIGNvdWxkIGJlIHNpbXBsaWZpZWQgdG8gb25seSBtYXJrIHRoZSBsYXN0IG9mIGEgY2hhaW4gb2YgcHJvY2Vzc2VzCi0gICBidXQgdGhhdCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGFsd2F5cyBtYXJrIHRoZSBsYXN0IG9uZSAoYW5kIG5vdCBnaXZlIHVwCi0gICBlYXJseSBpZiBzb21lIGVycm9yIG9jY3VycykuICBJdCdzIG1vcmUgcm9idXN0IHRvIHJlcXVpcmUgdGhlIGNhbGxlciB0bwotICAgbWFyayBib3RoIGVuZHMgb2YgdGhlIGNoYWluLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBwaWQgb24gc3lzdGVtcyBsaWtlIFVuaXggd2hlcmUgd2UgZm9yay9leGVjIGFuZCBvbiBzeXN0ZW1zCi0gICBsaWtlIFdJTjMyIGFuZCBPUzIgd2hlcmUgd2UgdXNlIHNwYXduLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byB3YWl0IGZvcgotICAgdGhlIGNoaWxkLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBXRVhJVFNUQVRVUyBvbiBzeXN0ZW1zIGxpa2UgTVNET1Mgd2hlcmUgd2Ugc3Bhd24gYW5kIHdhaXQKLSAgIGZvciB0aGUgY2hpbGQgaGVyZS4KLQotICAgVXBvbiBmYWlsdXJlLCBFUlJNU0dfRk1UIGFuZCBFUlJNU0dfQVJHIGFyZSBzZXQgdG8gdGhlIHRleHQgb2YgdGhlIGVycm9yCi0gICBtZXNzYWdlIHdpdGggYW4gb3B0aW9uYWwgYXJndW1lbnQgKGlmIG5vdCBuZWVkZWQsIEVSUk1TR19BUkcgaXMgc2V0IHRvCi0gICBOVUxMKSwgYW5kIC0xIGlzIHJldHVybmVkLiAgYGVycm5vJyBpcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byB1c2UuCi0KLSAgIHB3YWl0OiBjb3ZlciBmdW5jdGlvbiBmb3Igd2FpdC4KLQotICAgUElEIGlzIHRoZSBwcm9jZXNzIGlkIG9mIHRoZSB0YXNrIHRvIHdhaXQgZm9yLgotICAgU1RBVFVTIGlzIHRoZSBgc3RhdHVzJyBhcmd1bWVudCB0byB3YWl0LgotICAgRkxBR1MgaXMgY3VycmVudGx5IHVudXNlZCAoYWxsb3dzIGZ1dHVyZSBlbmhhbmNlbWVudCB3aXRob3V0IGJyZWFraW5nCi0gICB1cHdhcmQgY29tcGF0aWJpbGl0eSkuICBQYXNzIDAgZm9yIG5vdy4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgcGlkIG9mIHRoZSBjaGlsZCByZWFwZWQsCi0gICBvciAtMSBmb3IgZmFpbHVyZSAoZXJybm8gc2F5cyB3aHkpLgotCi0gICBPbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB3YWl0aW5nIGZvciBhIHBhcnRpY3VsYXIgY2hpbGQsIFBJRCBpcwotICAgaWdub3JlZC4gIE9uIHN5c3RlbXMgbGlrZSBNU0RPUyB0aGF0IGRvbid0IHJlYWxseSBtdWx0aXRhc2sgcHdhaXQKLSAgIGlzIGp1c3QgYSBtZWNoYW5pc20gdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIGZvciB0aGUgY2FsbGVyLgotCi0gICBwZmluaXNoOiBmaW5pc2ggZ2VuZXJhdGlvbiBvZiBzY3JpcHQKLQotICAgcGZpbmlzaCBpcyBuZWNlc3NhcnkgZm9yIHN5c3RlbXMgbGlrZSBNUFcgd2hlcmUgYSBzY3JpcHQgaXMgZ2VuZXJhdGVkIHRoYXQKLSAgIHJ1bnMgdGhlIHJlcXVlc3RlZCBwcm9ncmFtcy4KLSovCi0KLSNpZmRlZiBfX01TRE9TX18KLQotLyogTVNET1MgZG9lc24ndCBtdWx0aXRhc2ssIGJ1dCBmb3IgdGhlIHNha2Ugb2YgYSBjb25zaXN0ZW50IGludGVyZmFjZQotICAgdGhlIGNvZGUgYmVoYXZlcyBsaWtlIGl0IGRvZXMuICBwZXhlY3V0ZSBydW5zIHRoZSBwcm9ncmFtLCB0dWNrcyB0aGUKLSAgIGV4aXQgY29kZSBhd2F5LCBhbmQgcmV0dXJucyBhICJwaWQiLiAgcHdhaXQgbXVzdCBiZSBjYWxsZWQgdG8gZmV0Y2ggdGhlCi0gICBleGl0IGNvZGUuICAqLwotCi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotCi0vKiBGb3IgY29tbXVuaWNhdGluZyBpbmZvcm1hdGlvbiBmcm9tIHBleGVjdXRlIHRvIHB3YWl0LiAgKi8KLXN0YXRpYyBpbnQgbGFzdF9waWQgPSAwOwotc3RhdGljIGludCBsYXN0X3N0YXR1cyA9IDA7Ci1zdGF0aWMgaW50IGxhc3RfcmVhcGVkID0gMDsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50IHJjOwotCi0gIGxhc3RfcGlkKys7Ci0gIGlmIChsYXN0X3BpZCA8IDApCi0gICAgbGFzdF9waWQgPSAxOwotCi0gIGlmICgoZmxhZ3MgJiBQRVhFQ1VURV9PTkUpICE9IFBFWEVDVVRFX09ORSkKLSAgICBhYm9ydCAoKTsKLQotI2lmZGVmIF9fR08zMl9fCi0gIC8qID8/PyBXaGF0IGFyZSB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmcm9tIHNwYXdudj8gICovCi0gIHJjID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gc3Bhd252cCA6IHNwYXdudikgKDEsIHByb2dyYW0sIGFyZ3YpOwotI2Vsc2UKLSAgY2hhciAqc2NtZCwgKnJmOwotICBGSUxFICphcmdmaWxlOwotICBpbnQgaSwgZWwgPSBmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IDQgOiAwOwotCi0gIHNjbWQgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHByb2dyYW0pICsgc3RybGVuICh0ZW1wX2Jhc2UpICsgNiArIGVsKTsKLSAgcmYgPSBzY21kICsgc3RybGVuKHByb2dyYW0pICsgMiArIGVsOwotICBzcHJpbnRmIChzY21kLCAiJXMlcyBAJXMuZ3AiLCBwcm9ncmFtLAotCSAgIChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/ICIuZXhlIiA6ICIiKSwgdGVtcF9iYXNlKTsKLSAgYXJnZmlsZSA9IGZvcGVuIChyZiwgInciKTsKLSAgaWYgKGFyZ2ZpbGUgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZXJybm9fc2F2ZSA9IGVycm5vOwotICAgICAgZnJlZSAoc2NtZCk7Ci0gICAgICBlcnJubyA9IGVycm5vX3NhdmU7Ci0gICAgICAqZXJybXNnX2ZtdCA9ICJjYW5ub3Qgb3BlbiBgJXMuZ3AnIjsKLSAgICAgICplcnJtc2dfYXJnID0gdGVtcF9iYXNlOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBmb3IgKGk9MTsgYXJndltpXTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgKmNwOwotICAgICAgZm9yIChjcCA9IGFyZ3ZbaV07ICpjcDsgY3ArKykKLQl7Ci0JICBpZiAoKmNwID09ICciJyB8fCAqY3AgPT0gJ1wnJyB8fCAqY3AgPT0gJ1xcJyB8fCBJU1NQQUNFICgqY3ApKQotCSAgICBmcHV0YyAoJ1xcJywgYXJnZmlsZSk7Ci0JICBmcHV0YyAoKmNwLCBhcmdmaWxlKTsKLQl9Ci0gICAgICBmcHV0YyAoJ1xuJywgYXJnZmlsZSk7Ci0gICAgfQotICBmY2xvc2UgKGFyZ2ZpbGUpOwotCi0gIHJjID0gc3lzdGVtIChzY21kKTsKLQotICB7Ci0gICAgaW50IGVycm5vX3NhdmUgPSBlcnJubzsKLSAgICByZW1vdmUgKHJmKTsKLSAgICBmcmVlIChzY21kKTsKLSAgICBlcnJubyA9IGVycm5vX3NhdmU7Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChyYyA9PSAtMSkKLSAgICB7Ci0gICAgICAqZXJybXNnX2ZtdCA9IGluc3RhbGxfZXJyb3JfbXNnOwotICAgICAgKmVycm1zZ19hcmcgPSBwcm9ncmFtOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBUdWNrIHRoZSBzdGF0dXMgYXdheSBmb3IgcHdhaXQsIGFuZCByZXR1cm4gYSAicGlkIi4gICovCi0gIGxhc3Rfc3RhdHVzID0gcmMgPDwgODsKLSAgcmV0dXJuIGxhc3RfcGlkOwotfQotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIC8qIE9uIE1TRE9TIGVhY2ggcGV4ZWN1dGUgbXVzdCBiZSBmb2xsb3dlZCBieSBpdCdzIGFzc29jaWF0ZWQgcHdhaXQuICAqLwotICBpZiAocGlkICE9IGxhc3RfcGlkCi0gICAgICAvKiBDYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGNoaWxkPyAgKi8KLSAgICAgIHx8IHBpZCA9PSBsYXN0X3JlYXBlZCkKLSAgICB7Ci0gICAgICAvKiA/Pz8gRUNISUxEIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZS4gIENhbiB3ZSB1c2UgaXQgaGVyZT8gICovCi0gICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgotICAgICBOZWVkZWQ/ICAqLwotICAqc3RhdHVzID0gbGFzdF9zdGF0dXM7Ci0gIGxhc3RfcmVhcGVkID0gbGFzdF9waWQ7Ci0gIHJldHVybiBsYXN0X3BpZDsKLX0KLQotI2VuZGlmIC8qIE1TRE9TICovCi0KLSNpZiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19VV0lOX18pCi0KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0KLSNpZmRlZiBfX0NZR1dJTl9fCi0KLSNkZWZpbmUgZml4X2FyZ3YoYXJndmVjKSAoYXJndmVjKQotCi1leHRlcm4gaW50IF9zcGF3bnYgKCk7Ci1leHRlcm4gaW50IF9zcGF3bnZwICgpOwotCi0jZWxzZSAvKiAhIF9fQ1lHV0lOX18gKi8KLQotLyogVGhpcyBpcyBhIGtsdWRnZSB0byBnZXQgYXJvdW5kIHRoZSBNaWNyb3NvZnQgQyBzcGF3biBmdW5jdGlvbnMnIHByb3BlbnNpdHkKLSAgIHRvIHJlbW92ZSB0aGUgb3V0ZXJtb3N0IHNldCBvZiBkb3VibGUgcXVvdGVzIGZyb20gYWxsIGFyZ3VtZW50cy4gICovCi0KLWNvbnN0IGNoYXIgKiBjb25zdCAqCi1maXhfYXJndiAoYXJndmVjKQotICAgICBjaGFyICoqYXJndmVjOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAxOyBhcmd2ZWNbaV0gIT0gMDsgaSsrKQotICAgIHsKLSAgICAgIGludCBsZW4sIGo7Ci0gICAgICBjaGFyICp0ZW1wLCAqbmV3dGVtcDsKLQotICAgICAgdGVtcCA9IGFyZ3ZlY1tpXTsKLSAgICAgIGxlbiA9IHN0cmxlbiAodGVtcCk7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGVtcFtqXSA9PSAnIicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgPSB4bWFsbG9jIChsZW4gKyAyKTsKLSAgICAgICAgICAgICAgc3RybmNweSAobmV3dGVtcCwgdGVtcCwgaik7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgW2pdID0gJ1xcJzsKLSAgICAgICAgICAgICAgc3RybmNweSAoJm5ld3RlbXAgW2orMV0sICZ0ZW1wIFtqXSwgbGVuLWopOwotICAgICAgICAgICAgICBuZXd0ZW1wIFtsZW4rMV0gPSAwOwotICAgICAgICAgICAgICB0ZW1wID0gbmV3dGVtcDsKLSAgICAgICAgICAgICAgbGVuKys7Ci0gICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFyZ3ZlY1tpXSA9IHRlbXA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICogY29uc3QgKikgYXJndmVjOwotfQotI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLQotI2luY2x1ZGUgPGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogbWluZ3czMiBoZWFkZXJzIG1heSBub3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcuICAqLwotCi0jaWZuZGVmIF9QX1dBSVQKLSMgIGRlZmluZSBfUF9XQUlUCTAKLSMgIGRlZmluZSBfUF9OT1dBSVQJMQotIyAgZGVmaW5lIF9QX09WRVJMQVkJMgotIyAgZGVmaW5lIF9QX05PV0FJVE8JMwotIyAgZGVmaW5lIF9QX0RFVEFDSAk0Ci0KLSMgIGRlZmluZSBXQUlUX0NISUxECTAKLSMgIGRlZmluZSBXQUlUX0dSQU5EQ0hJTEQJMQotI2VuZGlmCi0KLS8qIFdpbjMyIHN1cHBvcnRzIHBpcGVzICovCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgcGlkOwotICBpbnQgcGRlc1syXSwgb3JnX3N0ZGluLCBvcmdfc3Rkb3V0OwotICBpbnQgaW5wdXRfZGVzYywgb3V0cHV0X2Rlc2M7Ci0gIGludCByZXRyaWVzLCBzbGVlcF9pbnRlcnZhbDsKLQotICAvKiBQaXBlIHdhaXRpbmcgZnJvbSBsYXN0IHByb2Nlc3MsIHRvIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRoZSBuZXh0IG9uZS4KLSAgICAgVmFsdWUgaXMgU1RESU5fRklMRV9OTyBpZiBubyBwaXBlIGlzIHdhaXRpbmcKLSAgICAgKGkuZS4gdGhlIG5leHQgY29tbWFuZCBpcyB0aGUgZmlyc3Qgb2YgYSBncm91cCkuICAqLwotICBzdGF0aWMgaW50IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwcm9jZXNzLCBpbml0aWFsaXplLiAgKi8KLSAgaWYgKGZsYWdzICYgUEVYRUNVVEVfRklSU1QpCi0gICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLQotICBpbnB1dF9kZXNjID0gbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXNuJ3QgdGhlIGxhc3QgcHJvY2VzcywgbWFrZSBhIHBpcGUgZm9yIGl0cyBvdXRwdXQsCi0gICAgIGFuZCByZWNvcmQgaXQgYXMgd2FpdGluZyB0byBiZSB0aGUgaW5wdXQgdG8gdGhlIG5leHQgcHJvY2Vzcy4gICovCi0gIGlmICghIChmbGFncyAmIFBFWEVDVVRFX0xBU1QpKQotICAgIHsKLSAgICAgIGlmIChfcGlwZSAocGRlcywgMjU2LCBPX0JJTkFSWSkgPCAwKQotCXsKLQkgICplcnJtc2dfZm10ID0gInBpcGUiOwotCSAgKmVycm1zZ19hcmcgPSBOVUxMOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIG91dHB1dF9kZXNjID0gcGRlc1tXUklURV9QT1JUXTsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IHBkZXNbUkVBRF9QT1JUXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMYXN0IHByb2Nlc3MuICAqLwotICAgICAgb3V0cHV0X2Rlc2MgPSBTVERPVVRfRklMRV9OTzsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0gICAgfQotCi0gIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0gICAgewotICAgICAgb3JnX3N0ZGluID0gZHVwIChTVERJTl9GSUxFX05PKTsKLSAgICAgIGR1cDIgKGlucHV0X2Rlc2MsIFNURElOX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKGlucHV0X2Rlc2MpOyAKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotICAgIHsKLSAgICAgIG9yZ19zdGRvdXQgPSBkdXAgKFNURE9VVF9GSUxFX05PKTsKLSAgICAgIGR1cDIgKG91dHB1dF9kZXNjLCBTVERPVVRfRklMRV9OTyk7Ci0gICAgICBjbG9zZSAob3V0cHV0X2Rlc2MpOwotICAgIH0KLQotICBwaWQgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBfc3Bhd252cCA6IF9zcGF3bnYpCi0gICAgKF9QX05PV0FJVCwgcHJvZ3JhbSwgZml4X2FyZ3YoYXJndikpOwotCi0gIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0gICAgewotICAgICAgZHVwMiAob3JnX3N0ZGluLCBTVERJTl9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChvcmdfc3RkaW4pOwotICAgIH0KLQotICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0gICAgewotICAgICAgZHVwMiAob3JnX3N0ZG91dCwgU1RET1VUX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKG9yZ19zdGRvdXQpOwotICAgIH0KLQotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7Ci0gICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwaWQ7Ci19Ci0KLS8qIE1TIENSVERMTCBkb2Vzbid0IHJldHVybiBlbm91Z2ggaW5mb3JtYXRpb24gaW4gc3RhdHVzIHRvIGRlY2lkZSBpZiB0aGUKLSAgIGNoaWxkIGV4aXRlZCBkdWUgdG8gYSBzaWduYWwgb3Igbm90LCByYXRoZXIgaXQgc2ltcGx5IHJldHVybnMgYW4KLSAgIGludGVnZXIgd2l0aCB0aGUgZXhpdCBjb2RlIG9mIHRoZSBjaGlsZDsgZWcuLCBpZiB0aGUgY2hpbGQgZXhpdGVkIHdpdGggCi0gICBhbiBhYm9ydCgpIGNhbGwgYW5kIGRpZG4ndCBoYXZlIGEgaGFuZGxlciBmb3IgU0lHQUJSVCwgaXQgc2ltcGx5IHJldHVybnMKLSAgIHdpdGggc3RhdHVzID0gMy4gV2UgZml4IHRoZSBzdGF0dXMgY29kZSB0byBjb25mb3JtIHRvIHRoZSB1c3VhbCBXSUYqCi0gICBtYWNyb3MuIE5vdGUgdGhhdCBXSUZTSUdOQUxFRCB3aWxsIG5ldmVyIGJlIHRydWUgdW5kZXIgQ1JURExMLiAqLwotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0jaWZkZWYgX19DWUdXSU5fXwotICByZXR1cm4gd2FpdCAoc3RhdHVzKTsKLSNlbHNlCi0gIGludCB0ZXJtc3RhdDsKLQotICBwaWQgPSBfY3dhaXQgKCZ0ZXJtc3RhdCwgcGlkLCBXQUlUX0NISUxEKTsKLQotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLQotICAvKiBjd2FpdCByZXR1cm5zIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXQgY29kZSBpbiB0ZXJtc3RhdC4KLSAgICAgQSB2YWx1ZSBvZiAzIGluZGljYXRlcyB0aGF0IHRoZSBjaGlsZCBjYXVnaHQgYSBzaWduYWwsIGJ1dCBub3QKLSAgICAgd2hpY2ggb25lLiAgU2luY2Ugb25seSBTSUdBQlJULCBTSUdGUEUgYW5kIFNJR0lOVCBkbyBhbnl0aGluZywgd2UKLSAgICAgcmVwb3J0IFNJR0FCUlQuICAqLwotICBpZiAodGVybXN0YXQgPT0gMykKLSAgICAqc3RhdHVzID0gU0lHQUJSVDsKLSAgZWxzZQotICAgICpzdGF0dXMgPSAoKCh0ZXJtc3RhdCkgJiAweGZmKSA8PCA4KTsKLQotICByZXR1cm4gcGlkOwotI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLX0KLQotI2VuZGlmIC8qIF9XSU4zMiAmJiAhIF9fVVdJTl9fICovCi0KLSNpZmRlZiBPUzIKLQotLyogPz8/IERvZXMgT1MyIGhhdmUgcHJvY2Vzcy5oPyAgKi8KLWV4dGVybiBpbnQgc3Bhd252ICgpOwotZXh0ZXJuIGludCBzcGF3bnZwICgpOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgcGlkOwotCi0gIGlmICgoZmxhZ3MgJiBQRVhFQ1VURV9PTkUpICE9IFBFWEVDVVRFX09ORSkKLSAgICBhYm9ydCAoKTsKLSAgLyogPz8/IFByZXN1bWFibHkgMSA9PSBfUF9OT1dBSVQuICAqLwotICBwaWQgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBzcGF3bnZwIDogc3Bhd252KSAoMSwgcHJvZ3JhbSwgYXJndik7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgKmVycm1zZ19mbXQgPSBpbnN0YWxsX2Vycm9yX21zZzsKLSAgICAgICplcnJtc2dfYXJnID0gcHJvZ3JhbTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiBwaWQ7Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0gIGludCBwaWQgPSB3YWl0IChzdGF0dXMpOwotICByZXR1cm4gcGlkOwotfQotCi0jZW5kaWYgLyogT1MyICovCi0KLSNpZmRlZiBNUFcKLQotLyogTVBXIHBleGVjdXRlIGRvZXNuJ3QgYWN0dWFsbHkgcnVuIGFueXRoaW5nOyBpbnN0ZWFkLCBpdCB3cml0ZXMgb3V0Ci0gICBzY3JpcHQgY29tbWFuZHMgdGhhdCwgd2hlbiBydW4sIHdpbGwgZG8gdGhlIGFjdHVhbCBleGVjdXRpbmcuCi0KLSAgIEZvciBleGFtcGxlLCBpbiBHQ0MncyBjYXNlLCBHQ0Mgd2lsbCB3cml0ZSBvdXQgc2V2ZXJhbCBzY3JpcHQgY29tbWFuZHM6Ci0KLSAgIGNwcCAuLi4KLSAgIGNjMSAuLi4KLSAgIGFzIC4uLgotICAgbGQgLi4uCi0KLSAgIGFuZCB0aGVuIGV4aXQuICBOb25lIG9mIHRoZSBhYm92ZSBwcm9ncmFtcyB3aWxsIGhhdmUgcnVuIHlldC4gIFRoZSB0YXNrCi0gICB0aGF0IGNhbGxlZCBHQ0Mgd2lsbCB0aGVuIGV4ZWN1dGUgdGhlIHNjcmlwdCBhbmQgY2F1c2UgY3BwLGV0Yy4gdG8gcnVuLgotICAgVGhlIGNhbGxlciBtdXN0IGludm9rZSBwZmluaXNoIGJlZm9yZSBjYWxsaW5nIGV4aXQuICBUaGlzIGFkZHMKLSAgIHRoZSBmaW5pc2hpbmcgdG91Y2hlcyB0byB0aGUgZ2VuZXJhdGVkIHNjcmlwdC4gICovCi0KLXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGNoYXIgdG1wcHJvZ3JhbVsyNTVdOwotICBjaGFyICpjcCwgKnRtcG5hbWU7Ci0gIGludCBpOwotCi0gIG1wd2lmeV9maWxlbmFtZSAocHJvZ3JhbSwgdG1wcHJvZ3JhbSk7Ci0gIGlmIChmaXJzdF90aW1lKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlNldCBGYWlsZWQgMFxuIik7Ci0gICAgICBmaXJzdF90aW1lID0gMDsKLSAgICB9Ci0KLSAgZnB1dHMgKCJJZiB7RmFpbGVkfSA9PSAwXG4iLCBzdGRvdXQpOwotICAvKiBJZiBiZWluZyB2ZXJib3NlLCBvdXRwdXQgYSBjb3B5IG9mIHRoZSBjb21tYW5kLiAgSXQgc2hvdWxkIGJlCi0gICAgIGFjY3VyYXRlIGVub3VnaCBhbmQgZXNjYXBlZCBlbm91Z2ggdG8gYmUgImNsaWNrYWJsZSIuICAqLwotICBpZiAoZmxhZ3MgJiBQRVhFQ1VURV9WRVJCT1NFKQotICAgIHsKLSAgICAgIGZwdXRzICgiXHRFY2hvICIsIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZwdXRzICh0bXBwcm9ncmFtLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotICAgICAgZm9yIChpPTE7IGFyZ3ZbaV07IGkrKykKLQl7Ci0JICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLQkgIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIGFyZ3VtZW50IHRoYXQgbmVlZHMgZml4aW5nLiAgKi8KLQkgIGlmIChzdHJjaHIoYXJndltpXSwgJy8nKSkKLQkgICAgewotCSAgICAgIHRtcG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyNTYpOwotCSAgICAgIG1wd2lmeV9maWxlbmFtZSAoYXJndltpXSwgdG1wbmFtZSk7Ci0JICAgICAgYXJndltpXSA9IHRtcG5hbWU7Ci0JICAgIH0KLQkgIGZvciAoY3AgPSBhcmd2W2ldOyAqY3A7IGNwKyspCi0JICAgIHsKLQkgICAgICAvKiBXcml0ZSBhbiBPcHRpb24tZCBlc2NhcGUgY2hhciBpbiBmcm9udCBvZiBzcGVjaWFsIGNoYXJzLiAgKi8KLQkgICAgICBpZiAoc3RyY2hyKCInKyIsICpjcCkpCi0JCWZwdXRjICgnXDI2NicsIHN0ZG91dCk7Ci0JICAgICAgZnB1dGMgKCpjcCwgc3Rkb3V0KTsKLQkgICAgfQotCSAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0JICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotCX0KLSAgICAgIGZwdXRzICgiXG4iLCBzdGRvdXQpOwotICAgIH0KLSAgZnB1dHMgKCJcdCIsIHN0ZG91dCk7Ci0gIGZwdXRzICh0bXBwcm9ncmFtLCBzdGRvdXQpOwotICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotCi0gIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCi0gICAgewotICAgICAgLyogU2VlIGlmIHdlIGhhdmUgYW4gYXJndW1lbnQgdGhhdCBuZWVkcyBmaXhpbmcuICAqLwotICAgICAgaWYgKHN0cmNocihhcmd2W2ldLCAnLycpKQotCXsKLQkgIHRtcG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyNTYpOwotCSAgbXB3aWZ5X2ZpbGVuYW1lIChhcmd2W2ldLCB0bXBuYW1lKTsKLQkgIGFyZ3ZbaV0gPSB0bXBuYW1lOwotCX0KLSAgICAgIGlmIChzdHJjaHIgKGFyZ3ZbaV0sICcgJykpCi0JZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQotCXsKLQkgIC8qIFdyaXRlIGFuIE9wdGlvbi1kIGVzY2FwZSBjaGFyIGluIGZyb250IG9mIHNwZWNpYWwgY2hhcnMuICAqLwotCSAgaWYgKHN0cmNocigiJysiLCAqY3ApKQotCSAgICBmcHV0YyAoJ1wyNjYnLCBzdGRvdXQpOwotCSAgZnB1dGMgKCpjcCwgc3Rkb3V0KTsKLQl9Ci0gICAgICBpZiAoc3RyY2hyIChhcmd2W2ldLCAnICcpKQotCWZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLSAgICB9Ci0KLSAgZnB1dHMgKCJcbiIsIHN0ZG91dCk7Ci0KLSAgLyogT3V0cHV0IGNvbW1hbmRzIHRoYXQgYXJyYW5nZSB0byBjbGVhbiB1cCBhbmQgZXhpdCBpZiBhIGZhaWx1cmUgb2NjdXJzLgotICAgICBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gY29sbGVjdCB0aGUgc3RhdHVzIGZyb20gdGhlIHByb2dyYW0gdGhhdCB3YXMKLSAgICAgcnVuLCByYXRoZXIgdGhhbiBzb21lIG90aGVyIHNjcmlwdCBjb21tYW5kLiAgQWxzbywgd2UgZG9uJ3QgZXhpdAotICAgICBpbW1lZGlhdGVseSwgc2luY2UgbmVjZXNzYXJ5IGNsZWFudXBzIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzY3JpcHQuICAqLwotICBmcHV0cyAoIlx0U2V0IFRtcFN0YXR1cyB7U3RhdHVzfVxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJcdElmIHtUbXBTdGF0dXN9ICE9IDBcbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiXHRcdFNldCBGYWlsZWQge1RtcFN0YXR1c31cbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiXHRFbmRcbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiRW5kXG4iLCBzdGRvdXQpOwotCi0gIC8qIFdlJ3JlIGp1c3QgY29tcG9zaW5nIGEgc2NyaXB0LCBjYW4ndCBmYWlsIGhlcmUuICAqLwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotICAqc3RhdHVzID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdyaXRlIG91dCBjb21tYW5kcyB0aGF0IHdpbGwgZXhpdCB3aXRoIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUKLSAgIGlmIHNvbWV0aGluZyBpbiB0aGUgc2NyaXB0IGZhaWxlZC4gICovCi0KLXZvaWQKLXBmaW5pc2ggKCkKLXsKLSAgcHJpbnRmICgiXHRFeGl0IFwie0ZhaWxlZH1cIlxuIik7Ci19Ci0KLSNlbmRpZiAvKiBNUFcgKi8KLQotLyogaW5jbHVkZSBmb3IgVW5peC1saWtlIGVudmlyb25tZW50cyBidXQgbm90IGZvciBEb3MtbGlrZSBlbnZpcm9ubWVudHMgKi8KLSNpZiAhIGRlZmluZWQgKF9fTVNET1NfXykgJiYgISBkZWZpbmVkIChPUzIpICYmICEgZGVmaW5lZCAoTVBXKSBcCi0gICAgJiYgISAoZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fVVdJTl9fKSkKLQotZXh0ZXJuIGludCBleGVjdiAoKTsKLWV4dGVybiBpbnQgZXhlY3ZwICgpOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCAoKmZ1bmMpKCkgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBleGVjdnAgOiBleGVjdik7Ci0gIGludCBwaWQ7Ci0gIGludCBwZGVzWzJdOwotICBpbnQgaW5wdXRfZGVzYywgb3V0cHV0X2Rlc2M7Ci0gIGludCByZXRyaWVzLCBzbGVlcF9pbnRlcnZhbDsKLSAgLyogUGlwZSB3YWl0aW5nIGZyb20gbGFzdCBwcm9jZXNzLCB0byBiZSB1c2VkIGFzIGlucHV0IGZvciB0aGUgbmV4dCBvbmUuCi0gICAgIFZhbHVlIGlzIFNURElOX0ZJTEVfTk8gaWYgbm8gcGlwZSBpcyB3YWl0aW5nCi0gICAgIChpLmUuIHRoZSBuZXh0IGNvbW1hbmQgaXMgdGhlIGZpcnN0IG9mIGEgZ3JvdXApLiAgKi8KLSAgc3RhdGljIGludCBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcHJvY2VzcywgaW5pdGlhbGl6ZS4gICovCi0gIGlmIChmbGFncyAmIFBFWEVDVVRFX0ZJUlNUKQotICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0KLSAgaW5wdXRfZGVzYyA9IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzbid0IHRoZSBsYXN0IHByb2Nlc3MsIG1ha2UgYSBwaXBlIGZvciBpdHMgb3V0cHV0LAotICAgICBhbmQgcmVjb3JkIGl0IGFzIHdhaXRpbmcgdG8gYmUgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHByb2Nlc3MuICAqLwotICBpZiAoISAoZmxhZ3MgJiBQRVhFQ1VURV9MQVNUKSkKLSAgICB7Ci0gICAgICBpZiAocGlwZSAocGRlcykgPCAwKQotCXsKLQkgICplcnJtc2dfZm10ID0gInBpcGUiOwotCSAgKmVycm1zZ19hcmcgPSBOVUxMOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIG91dHB1dF9kZXNjID0gcGRlc1tXUklURV9QT1JUXTsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IHBkZXNbUkVBRF9QT1JUXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMYXN0IHByb2Nlc3MuICAqLwotICAgICAgb3V0cHV0X2Rlc2MgPSBTVERPVVRfRklMRV9OTzsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0gICAgfQotCi0gIC8qIEZvcmsgYSBzdWJwcm9jZXNzOyB3YWl0IGFuZCByZXRyeSBpZiBpdCBmYWlscy4gICovCi0gIHNsZWVwX2ludGVydmFsID0gMTsKLSAgZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDQ7IHJldHJpZXMrKykKLSAgICB7Ci0gICAgICBwaWQgPSB2Zm9yayAoKTsKLSAgICAgIGlmIChwaWQgPj0gMCkKLQlicmVhazsKLSAgICAgIHNsZWVwIChzbGVlcF9pbnRlcnZhbCk7Ci0gICAgICBzbGVlcF9pbnRlcnZhbCAqPSAyOwotICAgIH0KLQotICBzd2l0Y2ggKHBpZCkKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHsKLQkqZXJybXNnX2ZtdCA9IFZGT1JLX1NUUklORzsKLQkqZXJybXNnX2FyZyA9IE5VTEw7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgY2FzZSAwOiAvKiBjaGlsZCAqLwotICAgICAgLyogTW92ZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBwaXBlcyBpbnRvIHBsYWNlLCBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLQl7Ci0JICBjbG9zZSAoU1RESU5fRklMRV9OTyk7Ci0JICBkdXAgKGlucHV0X2Rlc2MpOwotCSAgY2xvc2UgKGlucHV0X2Rlc2MpOwotCX0KLSAgICAgIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLQl7Ci0JICBjbG9zZSAoU1RET1VUX0ZJTEVfTk8pOwotCSAgZHVwIChvdXRwdXRfZGVzYyk7Ci0JICBjbG9zZSAob3V0cHV0X2Rlc2MpOwotCX0KLQotICAgICAgLyogQ2xvc2UgdGhlIHBhcmVudCdzIGRlc2NzIHRoYXQgYXJlbid0IHdhbnRlZCBoZXJlLiAgKi8KLSAgICAgIGlmIChsYXN0X3BpcGVfaW5wdXQgIT0gU1RESU5fRklMRV9OTykKLQljbG9zZSAobGFzdF9waXBlX2lucHV0KTsKLQotICAgICAgLyogRXhlYyB0aGUgcHJvZ3JhbS4gICovCi0gICAgICAoKmZ1bmMpIChwcm9ncmFtLCBhcmd2KTsKLQotICAgICAgLyogTm90ZTogQ2FsbGluZyBmcHJpbnRmIGFuZCBleGl0IGhlcmUgZG9lc24ndCBzZWVtIHJpZ2h0IGZvciB2Zm9yay4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgdGhpc19wbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIGluc3RhbGxfZXJyb3JfbXNnLCBwcm9ncmFtKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogJXNcbiIsIHhzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIEluIHRoZSBwYXJlbnQsIGFmdGVyIGZvcmtpbmcuCi0JIENsb3NlIHRoZSBkZXNjcmlwdG9ycyB0aGF0IHdlIG1hZGUgZm9yIHRoaXMgY2hpbGQuICAqLwotICAgICAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLQljbG9zZSAoaW5wdXRfZGVzYyk7Ci0gICAgICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0JY2xvc2UgKG91dHB1dF9kZXNjKTsKLQotICAgICAgLyogUmV0dXJuIGNoaWxkJ3MgcHJvY2VzcyBudW1iZXIuICAqLwotICAgICAgcmV0dXJuIHBpZDsKLSAgICB9Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLSNpZmRlZiBWTVMKLSAgcGlkID0gd2FpdHBpZCAoLTEsIHN0YXR1cywgMCk7Ci0jZWxzZQotICBwaWQgPSB3YWl0IChzdGF0dXMpOwotI2VuZGlmCi0gIHJldHVybiBwaWQ7Ci19Ci0KLSNlbmRpZiAvKiAhIF9fTVNET1NfXyAmJiAhIE9TMiAmJiAhIE1QVyAmJiAhIChfV0lOMzIgJiYgISBfX1VXSU5fXykgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yYW5kb20uYyBiL2xpYmliZXJ0eS9yYW5kb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5NTA3MC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmFuZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCi0gKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAotICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAotICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKLSAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0vKgotICogVGhpcyBpcyBkZXJpdmVkIGZyb20gdGhlIEJlcmtlbGV5IHNvdXJjZToKLSAqCUAoIylyYW5kb20uYwk1LjUgKEJlcmtlbGV5KSA3LzYvODgKLSAqIEl0IHdhcyByZXdvcmtlZCBmb3IgdGhlIEdOVSBDIExpYnJhcnkgYnkgUm9sYW5kIE1jR3JhdGguCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZiAwCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZWxzZQotCi0jZGVmaW5lCVVMT05HX01BWCAgKCh1bnNpZ25lZCBsb25nKSh+MEwpKSAgICAgLyogMHhGRkZGRkZGRiBmb3IgMzItYml0cyAqLwotI2RlZmluZQlMT05HX01BWCAgICgobG9uZykoVUxPTkdfTUFYID4+IDEpKSAgIC8qIDB4N0ZGRkZGRkYgZm9yIDMyLWJpdHMqLwotCi0jaWZkZWYgX19TVERDX18KLSMgIGRlZmluZSBQVFIgdm9pZCAqCi0jICBpZm5kZWYgTlVMTAotIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBQVFIgY2hhciAqCi0jICBpZm5kZWYgTlVMTAotIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCi0jICBlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgotCi1sb25nIGludCByYW5kb20gKCk7Ci0KLS8qIEFuIGltcHJvdmVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBwYWNrYWdlLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCi0gICByYW5kKCkvc3JhbmQoKSBsaWtlIGludGVyZmFjZSwgdGhpcyBwYWNrYWdlIGFsc28gaGFzIGEgc3BlY2lhbCBzdGF0ZSBpbmZvCi0gICBpbnRlcmZhY2UuICBUaGUgaW5pdHN0YXRlKCkgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBhIHNlZWQsIGFuIGFycmF5IG9mCi0gICBieXRlcywgYW5kIGEgY291bnQgb2YgaG93IG1hbnkgYnl0ZXMgYXJlIGJlaW5nIHBhc3NlZCBpbjsgdGhpcyBhcnJheSBpcwotICAgdGhlbiBpbml0aWFsaXplZCB0byBjb250YWluIGluZm9ybWF0aW9uIGZvciByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gd2l0aAotICAgdGhhdCBtdWNoIHN0YXRlIGluZm9ybWF0aW9uLiAgR29vZCBzaXplcyBmb3IgdGhlIGFtb3VudCBvZiBzdGF0ZQotICAgaW5mb3JtYXRpb24gYXJlIDMyLCA2NCwgMTI4LCBhbmQgMjU2IGJ5dGVzLiAgVGhlIHN0YXRlIGNhbiBiZSBzd2l0Y2hlZCBieQotICAgY2FsbGluZyB0aGUgc2V0c3RhdGUoKSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGFycmF5IGFzIHdhcyBpbml0aWFsbGl6ZWQKLSAgIHdpdGggaW5pdHN0YXRlKCkuICBCeSBkZWZhdWx0LCB0aGUgcGFja2FnZSBydW5zIHdpdGggMTI4IGJ5dGVzIG9mIHN0YXRlCi0gICBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhdGVzIGZhciBiZXR0ZXIgcmFuZG9tIG51bWJlcnMgdGhhbiBhIGxpbmVhcgotICAgY29uZ3J1ZW50aWFsIGdlbmVyYXRvci4gIElmIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gaXMgbGVzcyB0aGFuCi0gICAzMiBieXRlcywgYSBzaW1wbGUgbGluZWFyIGNvbmdydWVudGlhbCBSLk4uRy4gaXMgdXNlZC4gIEludGVybmFsbHksIHRoZQotICAgc3RhdGUgaW5mb3JtYXRpb24gaXMgdHJlYXRlZCBhcyBhbiBhcnJheSBvZiBsb25nczsgdGhlIHplcm9ldGggZWxlbWVudCBvZgotICAgdGhlIGFycmF5IGlzIHRoZSB0eXBlIG9mIFIuTi5HLiBiZWluZyB1c2VkIChzbWFsbCBpbnRlZ2VyKTsgdGhlIHJlbWFpbmRlcgotICAgb2YgdGhlIGFycmF5IGlzIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFIuTi5HLiAgVGh1cywgMzIgYnl0ZXMgb2YKLSAgIHN0YXRlIGluZm9ybWF0aW9uIHdpbGwgZ2l2ZSA3IGxvbmdzIHdvcnRoIG9mIHN0YXRlIGluZm9ybWF0aW9uLCB3aGljaCB3aWxsCi0gICBhbGxvdyBhIGRlZ3JlZSBzZXZlbiBwb2x5bm9taWFsLiAgKE5vdGU6IFRoZSB6ZXJvZXRoIHdvcmQgb2Ygc3RhdGUKLSAgIGluZm9ybWF0aW9uIGFsc28gaGFzIHNvbWUgb3RoZXIgaW5mb3JtYXRpb24gc3RvcmVkIGluIGl0OyBzZWUgc2V0c3RhdGUKLSAgIGZvciBkZXRhaWxzKS4gIFRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gdGVjaG5pcXVlIGlzIGEgbGluZWFyIGZlZWRiYWNrCi0gICBzaGlmdCByZWdpc3RlciBhcHByb2FjaCwgZW1wbG95aW5nIHRyaW5vbWlhbHMgKHNpbmNlIHRoZXJlIGFyZSBmZXdlciB0ZXJtcwotICAgdG8gc3VtIHVwIHRoYXQgd2F5KS4gIEluIHRoaXMgYXBwcm9hY2gsIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgYWxsCi0gICB0aGUgbnVtYmVycyBpbiB0aGUgc3RhdGUgdGFibGUgd2lsbCBhY3QgYXMgYSBsaW5lYXIgZmVlZGJhY2sgc2hpZnQgcmVnaXN0ZXIsCi0gICBhbmQgd2lsbCBoYXZlIHBlcmlvZCAyXmRlZyAtIDEgKHdoZXJlIGRlZyBpcyB0aGUgZGVncmVlIG9mIHRoZSBwb2x5bm9taWFsCi0gICBiZWluZyB1c2VkLCBhc3N1bWluZyB0aGF0IHRoZSBwb2x5bm9taWFsIGlzIGlycmVkdWNpYmxlIGFuZCBwcmltaXRpdmUpLgotICAgVGhlIGhpZ2hlciBvcmRlciBiaXRzIHdpbGwgaGF2ZSBsb25nZXIgcGVyaW9kcywgc2luY2UgdGhlaXIgdmFsdWVzIGFyZQotICAgYWxzbyBpbmZsdWVuY2VkIGJ5IHBzZXVkby1yYW5kb20gY2FycmllcyBvdXQgb2YgdGhlIGxvd2VyIGJpdHMuICBUaGUKLSAgIHRvdGFsIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yIGlzIGFwcHJveGltYXRlbHkgZGVnKigyKipkZWcgLSAxKTsgdGh1cwotICAgZG91YmxpbmcgdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiBoYXMgYSB2YXN0IGluZmx1ZW5jZSBvbiB0aGUKLSAgIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yLiAgTm90ZTogVGhlIGRlZyooMioqZGVnIC0gMSkgaXMgYW4gYXBwcm94aW1hdGlvbgotICAgb25seSBnb29kIGZvciBsYXJnZSBkZWcsIHdoZW4gdGhlIHBlcmlvZCBvZiB0aGUgc2hpZnQgcmVnaXN0ZXIgaXMgdGhlCi0gICBkb21pbmFudCBmYWN0b3IuICBXaXRoIGRlZyBlcXVhbCB0byBzZXZlbiwgdGhlIHBlcmlvZCBpcyBhY3R1YWxseSBtdWNoCi0gICBsb25nZXIgdGhhbiB0aGUgNyooMioqNyAtIDEpIHByZWRpY3RlZCBieSB0aGlzIGZvcm11bGEuICAqLwotCi0KLQotLyogRm9yIGVhY2ggb2YgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLCB3ZSBoYXZlIGEKLSAgIGJyZWFrIHZhbHVlIG9uIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gKHlvdSBuZWVkIGF0IGxlYXN0IHRoaQotICAgYnl0ZXMgb2Ygc3RhdGUgaW5mbyB0byBzdXBwb3J0IHRoaXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IpLCBhIGRlZ3JlZSBmb3IKLSAgIHRoZSBwb2x5bm9taWFsIChhY3R1YWxseSBhIHRyaW5vbWlhbCkgdGhhdCB0aGUgUi5OLkcuIGlzIGJhc2VkIG9uLCBhbmQKLSAgIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIGxvd2VyIG9yZGVyIGNvZWZmaWNpZW50cyBvZiB0aGUgdHJpbm9taWFsLiAgKi8KLQotLyogTGluZWFyIGNvbmdydWVudGlhbC4gICovCi0jZGVmaW5lCVRZUEVfMAkJMAotI2RlZmluZQlCUkVBS18wCQk4Ci0jZGVmaW5lCURFR18wCQkwCi0jZGVmaW5lCVNFUF8wCQkwCi0KLS8qIHgqKjcgKyB4KiozICsgMS4gICovCi0jZGVmaW5lCVRZUEVfMQkJMQotI2RlZmluZQlCUkVBS18xCQkzMgotI2RlZmluZQlERUdfMQkJNwotI2RlZmluZQlTRVBfMQkJMwotCi0vKiB4KioxNSArIHggKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8yCQkyCi0jZGVmaW5lCUJSRUFLXzIJCTY0Ci0jZGVmaW5lCURFR18yCQkxNQotI2RlZmluZQlTRVBfMgkJMQotCi0vKiB4KiozMSArIHgqKjMgKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8zCQkzCi0jZGVmaW5lCUJSRUFLXzMJCTEyOAotI2RlZmluZQlERUdfMwkJMzEKLSNkZWZpbmUJU0VQXzMJCTMKLQotLyogeCoqNjMgKyB4ICsgMS4gICovCi0jZGVmaW5lCVRZUEVfNAkJNAotI2RlZmluZQlCUkVBS180CQkyNTYKLSNkZWZpbmUJREVHXzQJCTYzCi0jZGVmaW5lCVNFUF80CQkxCi0KLQotLyogQXJyYXkgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIGluZm9ybWF0aW9uIHRvIG1ha2UgY29kZSBydW4gZmFzdGVyLgotICAgUmVsaWVzIG9uIGZhY3QgdGhhdCBUWVBFX2kgPT0gaS4gICovCi0KLSNkZWZpbmUJTUFYX1RZUEVTCTUJLyogTWF4IG51bWJlciBvZiB0eXBlcyBhYm92ZS4gICovCi0KLXN0YXRpYyBpbnQgZGVncmVlc1tNQVhfVFlQRVNdID0geyBERUdfMCwgREVHXzEsIERFR18yLCBERUdfMywgREVHXzQgfTsKLXN0YXRpYyBpbnQgc2Vwc1tNQVhfVFlQRVNdID0geyBTRVBfMCwgU0VQXzEsIFNFUF8yLCBTRVBfMywgU0VQXzQgfTsKLQotCi0KLS8qIEluaXRpYWxseSwgZXZlcnl0aGluZyBpcyBzZXQgdXAgYXMgaWYgZnJvbToKLQlpbml0c3RhdGUoMSwgcmFuZHRibCwgMTI4KTsKLSAgIE5vdGUgdGhhdCB0aGlzIGluaXRpYWxpemF0aW9uIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHNyYW5kb20KLSAgIGFkdmFuY2VzIHRoZSBmcm9udCBhbmQgcmVhciBwb2ludGVycyAxMCpyYW5kX2RlZyB0aW1lcywgYW5kIGhlbmNlIHRoZQotICAgcmVhciBwb2ludGVyIHdoaWNoIHN0YXJ0cyBhdCAwIHdpbGwgYWxzbyBlbmQgdXAgYXQgemVybzsgdGh1cyB0aGUgemVyb2V0aAotICAgZWxlbWVudCBvZiB0aGUgc3RhdGUgaW5mb3JtYXRpb24sIHdoaWNoIGNvbnRhaW5zIGluZm8gYWJvdXQgdGhlIGN1cnJlbnQKLSAgIHBvc2l0aW9uIG9mIHRoZSByZWFyIHBvaW50ZXIgaXMganVzdAotCShNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyBUWVBFXzMgPT0gVFlQRV8zLiAgKi8KLQotc3RhdGljIGxvbmcgaW50IHJhbmR0YmxbREVHXzMgKyAxXSA9Ci0gIHsgVFlQRV8zLAotICAgICAgMHg5YTMxOTAzOSwgMHgzMmQ5YzAyNCwgMHg5YjY2MzE4MiwgMHg1ZGExZjM0MiwgCi0gICAgICAweGRlM2I4MWUwLCAweGRmMGE2ZmI1LCAweGYxMDNiYzAyLCAweDQ4ZjM0MGZiLCAKLSAgICAgIDB4NzQ0OWU1NmIsIDB4YmViMWRiYjAsIDB4YWI1YzU5MTgsIDB4OTQ2NTU0ZmQsIAotICAgICAgMHg4YzJlNjgwZiwgMHhlYjNkNzk5ZiwgMHhiMTFlZTBiNywgMHgyZDQzNmI4NiwgCi0gICAgICAweGRhNjcyZTJhLCAweDE1ODhjYTg4LCAweGUzNjk3MzVkLCAweDkwNGYzNWY3LCAKLSAgICAgIDB4ZDcxNThmZDYsIDB4NmZhNmYwNTEsIDB4NjE2ZTZiOTYsIDB4YWM5NGVmZGMsIAotICAgICAgMHgzNjQxM2Y5MywgMHhjNjIyYzI5OCwgMHhmNWE0MmFiOCwgMHg4YTg4ZDc3YiwgCi0gICAgICAweGY1YWQ5ZDBlLCAweDg5OTkyMjBiLCAweDI3ZmI0N2I5Ci0gICAgfTsKLQotLyogRlBUUiBhbmQgUlBUUiBhcmUgdHdvIHBvaW50ZXJzIGludG8gdGhlIHN0YXRlIGluZm8sIGEgZnJvbnQgYW5kIGEgcmVhcgotICAgcG9pbnRlci4gIFRoZXNlIHR3byBwb2ludGVycyBhcmUgYWx3YXlzIHJhbmRfc2VwIHBsYWNlcyBhcGFydHMsIGFzIHRoZXkKLSAgIGN5Y2xlIHRocm91Z2ggdGhlIHN0YXRlIGluZm9ybWF0aW9uLiAgKFllcywgdGhpcyBkb2VzIG1lYW4gd2UgY291bGQgZ2V0Ci0gICBhd2F5IHdpdGgganVzdCBvbmUgcG9pbnRlciwgYnV0IHRoZSBjb2RlIGZvciByYW5kb20gaXMgbW9yZSBlZmZpY2llbnQKLSAgIHRoaXMgd2F5KS4gIFRoZSBwb2ludGVycyBhcmUgbGVmdCBwb3NpdGlvbmVkIGFzIHRoZXkgd291bGQgYmUgZnJvbSB0aGUgY2FsbDoKLQlpbml0c3RhdGUoMSwgcmFuZHRibCwgMTI4KTsKLSAgIChUaGUgcG9zaXRpb24gb2YgdGhlIHJlYXIgcG9pbnRlciwgcnB0ciwgaXMgcmVhbGx5IDAgKGFzIGV4cGxhaW5lZCBhYm92ZQotICAgaW4gdGhlIGluaXRpYWxpemF0aW9uIG9mIHJhbmR0YmwpIGJlY2F1c2UgdGhlIHN0YXRlIHRhYmxlIHBvaW50ZXIgaXMgc2V0Ci0gICB0byBwb2ludCB0byByYW5kdGJsWzFdIChhcyBleHBsYWluZWQgYmVsb3cpLikgICovCi0KLXN0YXRpYyBsb25nIGludCAqZnB0ciA9ICZyYW5kdGJsW1NFUF8zICsgMV07Ci1zdGF0aWMgbG9uZyBpbnQgKnJwdHIgPSAmcmFuZHRibFsxXTsKLQotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSB0aGUgcG9pbnRlciB0byB0aGUgc3RhdGUgaW5mb3JtYXRpb24gdGFibGUsCi0gICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBnZW5lcmF0b3IsIHRoZSBkZWdyZWUgb2YgdGhlIGN1cnJlbnQgcG9seW5vbWlhbAotICAgYmVpbmcgdXNlZCwgYW5kIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIHR3byBwb2ludGVycy4KLSAgIE5vdGUgdGhhdCBmb3IgZWZmaWNpZW5jeSBvZiByYW5kb20sIHdlIHJlbWVtYmVyIHRoZSBmaXJzdCBsb2NhdGlvbiBvZgotICAgdGhlIHN0YXRlIGluZm9ybWF0aW9uLCBub3QgdGhlIHplcm9ldGguICBIZW5jZSBpdCBpcyB2YWxpZCB0byBhY2Nlc3MKLSAgIHN0YXRlWy0xXSwgd2hpY2ggaXMgdXNlZCB0byBzdG9yZSB0aGUgdHlwZSBvZiB0aGUgUi5OLkcuCi0gICBBbHNvLCB3ZSByZW1lbWJlciB0aGUgbGFzdCBsb2NhdGlvbiwgc2luY2UgdGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuCi0gICBpbmRleGluZyBldmVyeSB0aW1lIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgZWxlbWVudCB0byBzZWUgaWYKLSAgIHRoZSBmcm9udCBhbmQgcmVhciBwb2ludGVycyBoYXZlIHdyYXBwZWQuICAqLwotCi1zdGF0aWMgbG9uZyBpbnQgKnN0YXRlID0gJnJhbmR0YmxbMV07Ci0KLXN0YXRpYyBpbnQgcmFuZF90eXBlID0gVFlQRV8zOwotc3RhdGljIGludCByYW5kX2RlZyA9IERFR18zOwotc3RhdGljIGludCByYW5kX3NlcCA9IFNFUF8zOwotCi1zdGF0aWMgbG9uZyBpbnQgKmVuZF9wdHIgPSAmcmFuZHRibFtzaXplb2YocmFuZHRibCkgLyBzaXplb2YocmFuZHRibFswXSldOwotDAotLyogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYmFzZWQgb24gdGhlIGdpdmVuIHNlZWQuICBJZiB0aGUKLSAgIHR5cGUgaXMgdGhlIHRyaXZpYWwgbm8tc3RhdGUtaW5mb3JtYXRpb24gdHlwZSwganVzdCByZW1lbWJlciB0aGUgc2VlZC4KLSAgIE90aGVyd2lzZSwgaW5pdGlhbGl6ZXMgc3RhdGVbXSBiYXNlZCBvbiB0aGUgZ2l2ZW4gInNlZWQiIHZpYSBhIGxpbmVhcgotICAgY29uZ3J1ZW50aWFsIGdlbmVyYXRvci4gIFRoZW4sIHRoZSBwb2ludGVycyBhcmUgc2V0IHRvIGtub3duIGxvY2F0aW9ucwotICAgdGhhdCBhcmUgZXhhY3RseSByYW5kX3NlcCBwbGFjZXMgYXBhcnQuICBMYXN0bHksIGl0IGN5Y2xlcyB0aGUgc3RhdGUKLSAgIGluZm9ybWF0aW9uIGEgZ2l2ZW4gbnVtYmVyIG9mIHRpbWVzIHRvIGdldCByaWQgb2YgYW55IGluaXRpYWwgZGVwZW5kZW5jaWVzCi0gICBpbnRyb2R1Y2VkIGJ5IHRoZSBMLkMuUi5OLkcuICBOb3RlIHRoYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHJhbmR0YmxbXQotICAgZm9yIGRlZmF1bHQgdXNhZ2UgcmVsaWVzIG9uIHZhbHVlcyBwcm9kdWNlZCBieSB0aGlzIHJvdXRpbmUuICAqLwotdm9pZAotc3JhbmRvbSAoeCkKLSAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIHN0YXRlWzBdID0geDsKLSAgaWYgKHJhbmRfdHlwZSAhPSBUWVBFXzApCi0gICAgewotICAgICAgcmVnaXN0ZXIgbG9uZyBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCByYW5kX2RlZzsgKytpKQotCXN0YXRlW2ldID0gKDExMDM1MTUxNDUgKiBzdGF0ZVtpIC0gMV0pICsgMTIzNDU7Ci0gICAgICBmcHRyID0gJnN0YXRlW3JhbmRfc2VwXTsKLSAgICAgIHJwdHIgPSAmc3RhdGVbMF07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTAgKiByYW5kX2RlZzsgKytpKQotCXJhbmRvbSgpOwotICAgIH0KLX0KLQwKLS8qIEluaXRpYWxpemUgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGluIHRoZSBnaXZlbiBhcnJheSBvZiBOIGJ5dGVzIGZvcgotICAgZnV0dXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbi4gIEJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UKLSAgIGFyZSBnaXZlbiwgYW5kIHRoZSBicmVhayB2YWx1ZXMgZm9yIHRoZSBkaWZmZXJlbnQgUi5OLkcuJ3MsIHdlIGNob29zZQotICAgdGhlIGJlc3QgKGxhcmdlc3QpIG9uZSB3ZSBjYW4gYW5kIHNldCB0aGluZ3MgdXAgZm9yIGl0LiAgc3JhbmRvbSBpcwotICAgdGhlbiBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24uICBOb3RlIHRoYXQgb24gcmV0dXJuCi0gICBmcm9tIHNyYW5kb20sIHdlIHNldCBzdGF0ZVstMV0gdG8gYmUgdGhlIHR5cGUgbXVsdGlwbGV4ZWQgd2l0aCB0aGUgY3VycmVudAotICAgdmFsdWUgb2YgdGhlIHJlYXIgcG9pbnRlcjsgdGhpcyBpcyBzbyBzdWNjZXNzaXZlIGNhbGxzIHRvIGluaXRzdGF0ZSB3b24ndAotICAgbG9zZSB0aGlzIGluZm9ybWF0aW9uIGFuZCB3aWxsIGJlIGFibGUgdG8gcmVzdGFydCB3aXRoIHNldHN0YXRlLgotICAgTm90ZTogVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGlzIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUsIGlmIGFueSwganVzdCBsaWtlCi0gICBzZXRzdGF0ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbWF0dGVyIHdoZW4gaW5pdHN0YXRlIGlzIGNhbGxlZC4KLSAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvbGQgc3RhdGUuICAqLwotUFRSCi1pbml0c3RhdGUgKHNlZWQsIGFyZ19zdGF0ZSwgbikKLSAgdW5zaWduZWQgaW50IHNlZWQ7Ci0gIFBUUiBhcmdfc3RhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgbjsKLXsKLSAgUFRSIG9zdGF0ZSA9IChQVFIpICZzdGF0ZVstMV07Ci0KLSAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCi0gICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOwotICBlbHNlCi0gICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKLSAgaWYgKG4gPCBCUkVBS18xKQotICAgIHsKLSAgICAgIGlmIChuIDwgQlJFQUtfMCkKLQl7Ci0JICBlcnJubyA9IEVJTlZBTDsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMDsKLSAgICAgIHJhbmRfZGVnID0gREVHXzA7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8wOwotICAgIH0KLSAgZWxzZSBpZiAobiA8IEJSRUFLXzIpCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV8xOwotICAgICAgcmFuZF9kZWcgPSBERUdfMTsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzE7Ci0gICAgfQotICBlbHNlIGlmIChuIDwgQlJFQUtfMykKLSAgICB7Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzI7Ci0gICAgICByYW5kX2RlZyA9IERFR18yOwotICAgICAgcmFuZF9zZXAgPSBTRVBfMjsKLSAgICB9Ci0gIGVsc2UgaWYgKG4gPCBCUkVBS180KQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMzsKLSAgICAgIHJhbmRfZGVnID0gREVHXzM7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8zOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfNDsKLSAgICAgIHJhbmRfZGVnID0gREVHXzQ7Ci0gICAgICByYW5kX3NlcCA9IFNFUF80OwotICAgIH0KLQotICBzdGF0ZSA9ICYoKGxvbmcgaW50ICopIGFyZ19zdGF0ZSlbMV07CS8qIEZpcnN0IGxvY2F0aW9uLiAgKi8KLSAgLyogTXVzdCBzZXQgRU5EX1BUUiBiZWZvcmUgc3JhbmRvbS4gICovCi0gIGVuZF9wdHIgPSAmc3RhdGVbcmFuZF9kZWddOwotICBzcmFuZG9tKHNlZWQpOwotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotCi0gIHJldHVybiBvc3RhdGU7Ci19Ci0MCi0vKiBSZXN0b3JlIHRoZSBzdGF0ZSBmcm9tIHRoZSBnaXZlbiBzdGF0ZSBhcnJheS4KLSAgIE5vdGU6IEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIGFsc28gcmVtZW1iZXIgdGhlIGxvY2F0aW9ucyBvZiB0aGUgcG9pbnRlcnMKLSAgIGluIHRoZSBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uLCBhbmQgcmVzdG9yZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBwb2ludGVycwotICAgZnJvbSB0aGUgb2xkIHN0YXRlIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IG11bHRpcGxleGluZyB0aGUgcG9pbnRlcgotICAgbG9jYXRpb24gaW50byB0aGUgemVyb2V0aCB3b3JkIG9mIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGR1ZQotICAgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoaW5ncyBhcmUgZG9uZSwgaXQgaXMgT0sgdG8gY2FsbCBzZXRzdGF0ZSB3aXRoIHRoZQotICAgc2FtZSBzdGF0ZSBhcyB0aGUgY3VycmVudCBzdGF0ZQotICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9sZCBzdGF0ZSBpbmZvcm1hdGlvbi4gICovCi0KLVBUUgotc2V0c3RhdGUgKGFyZ19zdGF0ZSkKLSAgUFRSIGFyZ19zdGF0ZTsKLXsKLSAgcmVnaXN0ZXIgbG9uZyBpbnQgKm5ld19zdGF0ZSA9IChsb25nIGludCAqKSBhcmdfc3RhdGU7Ci0gIHJlZ2lzdGVyIGludCB0eXBlID0gbmV3X3N0YXRlWzBdICUgTUFYX1RZUEVTOwotICByZWdpc3RlciBpbnQgcmVhciA9IG5ld19zdGF0ZVswXSAvIE1BWF9UWVBFUzsKLSAgUFRSIG9zdGF0ZSA9IChQVFIpICZzdGF0ZVstMV07Ci0KLSAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCi0gICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOwotICBlbHNlCi0gICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgVFlQRV8wOgotICAgIGNhc2UgVFlQRV8xOgotICAgIGNhc2UgVFlQRV8yOgotICAgIGNhc2UgVFlQRV8zOgotICAgIGNhc2UgVFlQRV80OgotICAgICAgcmFuZF90eXBlID0gdHlwZTsKLSAgICAgIHJhbmRfZGVnID0gZGVncmVlc1t0eXBlXTsKLSAgICAgIHJhbmRfc2VwID0gc2Vwc1t0eXBlXTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBTdGF0ZSBpbmZvIG11bmdlZC4gICovCi0gICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdGF0ZSA9ICZuZXdfc3RhdGVbMV07Ci0gIGlmIChyYW5kX3R5cGUgIT0gVFlQRV8wKQotICAgIHsKLSAgICAgIHJwdHIgPSAmc3RhdGVbcmVhcl07Ci0gICAgICBmcHRyID0gJnN0YXRlWyhyZWFyICsgcmFuZF9zZXApICUgcmFuZF9kZWddOwotICAgIH0KLSAgLyogU2V0IGVuZF9wdHIgdG9vLiAgKi8KLSAgZW5kX3B0ciA9ICZzdGF0ZVtyYW5kX2RlZ107Ci0KLSAgcmV0dXJuIG9zdGF0ZTsKLX0KLQwKLS8qIElmIHdlIGFyZSB1c2luZyB0aGUgdHJpdmlhbCBUWVBFXzAgUi5OLkcuLCBqdXN0IGRvIHRoZSBvbGQgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgYml0LiAgT3RoZXJ3aXNlLCB3ZSBkbyBvdXIgZmFuY3kgdHJpbm9taWFsIHN0dWZmLCB3aGljaCBpcyB0aGUKLSAgIHNhbWUgaW4gYWxsIHRoZXIgb3RoZXIgY2FzZXMgZHVlIHRvIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGhhdmUgYmVlbgotICAgc2V0IHVwLiAgVGhlIGJhc2ljIG9wZXJhdGlvbiBpcyB0byBhZGQgdGhlIG51bWJlciBhdCB0aGUgcmVhciBwb2ludGVyIGludG8KLSAgIHRoZSBvbmUgYXQgdGhlIGZyb250IHBvaW50ZXIuICBUaGVuIGJvdGggcG9pbnRlcnMgYXJlIGFkdmFuY2VkIHRvIHRoZSBuZXh0Ci0gICBsb2NhdGlvbiBjeWNsaWNhbGx5IGluIHRoZSB0YWJsZS4gIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgc3VtIGdlbmVyYXRlZCwKLSAgIHJlZHVjZWQgdG8gMzEgYml0cyBieSB0aHJvd2luZyBhd2F5IHRoZSAibGVhc3QgcmFuZG9tIiBsb3cgYml0LgotICAgTm90ZTogVGhlIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgZnJvbnQgYW5kCi0gICByZWFyIHBvaW50ZXJzIGNhbid0IHdyYXAgb24gdGhlIHNhbWUgY2FsbCBieSBub3QgdGVzdGluZyB0aGUgcmVhcgotICAgcG9pbnRlciBpZiB0aGUgZnJvbnQgb25lIGhhcyB3cmFwcGVkLiAgUmV0dXJucyBhIDMxLWJpdCByYW5kb20gbnVtYmVyLiAgKi8KLQotbG9uZyBpbnQKLXJhbmRvbSAoKQotewotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICB7Ci0gICAgICBzdGF0ZVswXSA9ICgoc3RhdGVbMF0gKiAxMTAzNTE1MjQ1KSArIDEyMzQ1KSAmIExPTkdfTUFYOwotICAgICAgcmV0dXJuIHN0YXRlWzBdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW50IGk7Ci0gICAgICAqZnB0ciArPSAqcnB0cjsKLSAgICAgIC8qIENodWNraW5nIGxlYXN0IHJhbmRvbSBiaXQuICAqLwotICAgICAgaSA9ICgqZnB0ciA+PiAxKSAmIExPTkdfTUFYOwotICAgICAgKytmcHRyOwotICAgICAgaWYgKGZwdHIgPj0gZW5kX3B0cikKLQl7Ci0JICBmcHRyID0gc3RhdGU7Ci0JICArK3JwdHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICsrcnB0cjsKLQkgIGlmIChycHRyID49IGVuZF9wdHIpCi0JICAgIHJwdHIgPSBzdGF0ZTsKLQl9Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvcmVuYW1lLmMgYi9saWJpYmVydHkvcmVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjZlMmQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3JlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogcmVuYW1lIC0tIHJlbmFtZSBhIGZpbGUKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICovCi0KLS8qIFJlbmFtZSBhIGZpbGUuICAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotaW50Ci1yZW5hbWUgKHpmcm9tLCB6dG8pCi0gICAgIGNoYXIgKnpmcm9tOwotICAgICBjaGFyICp6dG87Ci17Ci0gIGlmIChsaW5rICh6ZnJvbSwgenRvKSA8IDApCi0gICAgewotICAgICAgaWYgKGVycm5vICE9IEVFWElTVCkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAodW5saW5rICh6dG8pIDwgMAotCSAgfHwgbGluayAoemZyb20sIHp0bykgPCAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiB1bmxpbmsgKHpmcm9tKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yaW5kZXguYyBiL2xpYmliZXJ0eS9yaW5kZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxZDEyNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmluZGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIChvYnNvbGV0ZSkgcmluZGV4KCkuICovCi0KLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotCi1jaGFyICoKLXJpbmRleCAocywgYykKLSAgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBzdHJyY2hyIChzLCBjKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zaWdzZXRtYXNrLmMgYi9saWJpYmVydHkvc2lnc2V0bWFzay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTA5ZTZhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zaWdzZXRtYXNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBWZXJzaW9uIG9mIHNpZ3NldG1hc2suYwotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb2FtaW4uICovCi0KLS8qIFNldCB0aGUgY3VycmVudCBzaWduYWwgbWFzayB0byB0aGUgc2V0IHByb3ZpZGVkLCBhbmQgcmV0dXJuIHRoZSAKLSAgIHByZXZpb3VzIHZhbHVlICovCi0KLSNkZWZpbmUgX1BPU0lYX1NPVVJDRQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0vKiBJbmNsdWRpbmcgPHN5cy90eXBlcy5oPiBzZWVtcyB0byBiZSBuZWVkZWQgYnkgSVNDLiAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaWZkZWYgU0lHX1NFVE1BU0sKLWludAotREVGVU4oc2lnc2V0bWFzaywoc2V0KSwKLSAgICAgIGludCBzZXQpCi17Ci0gICAgc2lnc2V0X3QgbmV3OwotICAgIHNpZ3NldF90IG9sZDsKLSAgICAKLSAgICBzaWdlbXB0eXNldCAoJm5ldyk7Ci0gICAgaWYgKHNldCAhPSAwKSB7Ci0gICAgICBhYm9ydCgpOwkvKiBGSVhNRSwgd2UgZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNsYXRlIG9sZCBtYXNrIHRvIG5ldyAqLwotICAgIH0KLSAgICBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm5ldywgJm9sZCk7Ci0gICAgcmV0dXJuIDE7CS8qIEZJWE1FLCB3ZSBhbHdheXMgcmV0dXJuIDEgYXMgb2xkIHZhbHVlLiAgKi8KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NwYWNlcy5jIGIvbGliaWJlcnR5L3NwYWNlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTkyNTcxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zcGFjZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIEFsbG9jYXRlIG1lbW9yeSByZWdpb24gZmlsbGVkIHdpdGggc3BhY2VzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLQotTkFNRQotCi0Jc3BhY2VzIC0tIHJldHVybiBhIHBvaW50ZXIgdG8gYSBidWZmZXIgZnVsbCBvZiBzcGFjZXMKLQotU1lOT1BTSVMKLQotCWNoYXIgKnNwYWNlcyAoaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBtZW1vcnkgcmVnaW9uIGZpbGxlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQludW1iZXIgb2Ygc3BhY2VzIGFuZCBudWxsIHRlcm1pbmF0ZWQuICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcwotCXZhbGlkIHVudGlsIGF0IGxlYXN0IHRoZSBuZXh0IGNhbGwuCi0JCi1CVUdTCi0KLSovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhlc2UgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1leHRlcm4gUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiB2b2lkIGZyZWUgUEFSQU1TICgoUFRSKSk7Ci0jZW5kaWYKLQotY29uc3QgY2hhciAqCi1zcGFjZXMgKGNvdW50KQotICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnQ7Ci0gIHN0YXRpYyBjaGFyICpidWY7Ci0gIHN0YXRpYyBpbnQgbWF4c2l6ZTsKLQotICBpZiAoY291bnQgPiBtYXhzaXplKQotICAgIHsKLSAgICAgIGlmIChidWYpCi0JewotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgICBidWYgPSBtYWxsb2MgKGNvdW50ICsgMSk7Ci0gICAgICBpZiAoYnVmID09IChjaGFyICopIDApCi0JcmV0dXJuIDA7Ci0gICAgICBmb3IgKHQgPSBidWYgKyBjb3VudCA7IHQgIT0gYnVmIDsgKQotCXsKLQkgICotLXQgPSAnICc7Ci0JfQotICAgICAgbWF4c2l6ZSA9IGNvdW50OwotICAgICAgYnVmW2NvdW50XSA9ICdcMCc7Ci0gICAgfQotICByZXR1cm4gKGNvbnN0IGNoYXIgKikgKGJ1ZiArIG1heHNpemUgLSBjb3VudCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zcGxheS10cmVlLmMgYi9saWJpYmVydHkvc3BsYXktdHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2I2YmQ5Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zcGxheS10cmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyogQSBzcGxheS10cmVlIGRhdGF0eXBlLiAgCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZvciBhbiBlYXNpbHkgcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygc3BsYXktdHJlZXMsIHNlZToKLQotICAgICBMZXdpcywgSGFycnkgUi4gYW5kIERlbmVuYmVyZywgTGFycnkuICBEYXRhIFN0cnVjdHVyZXMgYW5kIFRoZWlyCi0gICAgIEFsZ29yaXRobXMuICBIYXJwZXItQ29sbGlucywgSW5jLiAgMTk5MS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic3BsYXktdHJlZS5oIgotCi1zdGF0aWMgdm9pZCBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgICAgUEFSQU1TKChzcGxheV90cmVlLCAKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSkpOwotc3RhdGljIHZvaWQgc3BsYXlfdHJlZV9zcGxheSAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci1zdGF0aWMgc3BsYXlfdHJlZV9ub2RlIHNwbGF5X3RyZWVfc3BsYXlfaGVscGVyICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCQlzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSosCi0JCQkJCQlzcGxheV90cmVlX25vZGUqLAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKikpOwotc3RhdGljIGludCBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX25vZGUsCi0JCQkJCQlzcGxheV90cmVlX2ZvcmVhY2hfZm4sCi0JCQkJCQl2b2lkKikpOwotCi0vKiBEZWFsbG9jYXRlIE5PREUgKGEgbWVtYmVyIG9mIFNQKSwgYW5kIGFsbCBpdHMgc3ViLXRyZWVzLiAgKi8KLQotc3RhdGljIHZvaWQgCi1zcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBub2RlKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKLXsKLSAgaWYgKCFub2RlKQotICAgIHJldHVybjsKLQotICBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBub2RlLT5sZWZ0KTsKLSAgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZS0+cmlnaHQpOwotCi0gIGlmIChzcC0+ZGVsZXRlX2tleSkKLSAgICAoKnNwLT5kZWxldGVfa2V5KShub2RlLT5rZXkpOwotICBpZiAoc3AtPmRlbGV0ZV92YWx1ZSkKLSAgICAoKnNwLT5kZWxldGVfdmFsdWUpKG5vZGUtPnZhbHVlKTsKLQotICBmcmVlICgoY2hhciopIG5vZGUpOwotfQotCi0vKiBIZWxwIHNwbGF5IFNQIGFyb3VuZCBLRVkuICBQQVJFTlQgYW5kIEdSQU5EUEFSRU5UIGFyZSB0aGUgcGFyZW50Ci0gICBhbmQgZ3JhbmRwYXJlbnQsIHJlc3BlY3RpdmVseSwgb2YgTk9ERS4gICovCi0KLXN0YXRpYyBzcGxheV90cmVlX25vZGUKLXNwbGF5X3RyZWVfc3BsYXlfaGVscGVyIChzcCwga2V5LCBub2RlLCBwYXJlbnQsIGdyYW5kcGFyZW50KQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSAqbm9kZTsKLSAgICAgc3BsYXlfdHJlZV9ub2RlICpwYXJlbnQ7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSAqZ3JhbmRwYXJlbnQ7Ci17Ci0gIHNwbGF5X3RyZWVfbm9kZSAqbmV4dDsKLSAgc3BsYXlfdHJlZV9ub2RlIG47Ci0gIGludCBjb21wYXJpc29uOwotICAKLSAgbiA9ICpub2RlOwotCi0gIGlmICghbikKLSAgICByZXR1cm4gKnBhcmVudDsKLQotICBjb21wYXJpc29uID0gKCpzcC0+Y29tcCkgKGtleSwgbi0+a2V5KTsKLQotICBpZiAoY29tcGFyaXNvbiA9PSAwKQotICAgIC8qIFdlJ3ZlIGZvdW5kIHRoZSB0YXJnZXQuICAqLwotICAgIG5leHQgPSAwOwotICBlbHNlIGlmIChjb21wYXJpc29uIDwgMCkKLSAgICAvKiBUaGUgdGFyZ2V0IGlzIHRvIHRoZSBsZWZ0LiAgKi8KLSAgICBuZXh0ID0gJm4tPmxlZnQ7Ci0gIGVsc2UgCi0gICAgLyogVGhlIHRhcmdldCBpcyB0byB0aGUgcmlnaHQuICAqLwotICAgIG5leHQgPSAmbi0+cmlnaHQ7Ci0KLSAgaWYgKG5leHQpCi0gICAgewotICAgICAgLyogQ29udGludWUgZG93biB0aGUgdHJlZS4gICovCi0gICAgICBuID0gc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgKHNwLCBrZXksIG5leHQsIG5vZGUsIHBhcmVudCk7Ci0KLSAgICAgIC8qIFRoZSByZWN1cnNpdmUgY2FsbCB3aWxsIGNoYW5nZSB0aGUgcGxhY2UgdG8gd2hpY2ggTk9ERQotCSBwb2ludHMuICAqLwotICAgICAgaWYgKCpub2RlICE9IG4pCi0JcmV0dXJuIG47Ci0gICAgfQotCi0gIGlmICghcGFyZW50KQotICAgIC8qIE5PREUgaXMgdGhlIHJvb3QuICBXZSBhcmUgZG9uZS4gICovCi0gICAgcmV0dXJuIG47Ci0KLSAgLyogRmlyc3QsIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBncmFuZHBhcmVudCAoaS5lLiwKLSAgICAgKlBBUkVOVCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4pICAqLwotICBpZiAoIWdyYW5kcGFyZW50KSAKLSAgICB7Ci0gICAgICBpZiAobiA9PSAoKnBhcmVudCktPmxlZnQpCi0JewotCSAgKm5vZGUgPSBuLT5yaWdodDsKLQkgIG4tPnJpZ2h0ID0gKnBhcmVudDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKm5vZGUgPSBuLT5sZWZ0OwotCSAgbi0+bGVmdCA9ICpwYXJlbnQ7Ci0JfQotICAgICAgKnBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgLyogTmV4dCBoYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGJvdGggTiBhbmQgKlBBUkVOVCBhcmUgbGVmdCBjaGlsZHJlbiwKLSAgICAgb3Igd2hlcmUgYm90aCBhcmUgcmlnaHQgY2hpbGRyZW4uICAqLwotICBpZiAobiA9PSAoKnBhcmVudCktPmxlZnQgJiYgKnBhcmVudCA9PSAoKmdyYW5kcGFyZW50KS0+bGVmdCkKLSAgICB7Ci0gICAgICBzcGxheV90cmVlX25vZGUgcCA9ICpwYXJlbnQ7Ci0KLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5sZWZ0ID0gcC0+cmlnaHQ7Ci0gICAgICBwLT5yaWdodCA9ICpncmFuZHBhcmVudDsKLSAgICAgIHAtPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gcDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsgCi0gICAgfQotICBlbHNlIGlmICAobiA9PSAoKnBhcmVudCktPnJpZ2h0ICYmICpwYXJlbnQgPT0gKCpncmFuZHBhcmVudCktPnJpZ2h0KQotICAgIHsKLSAgICAgIHNwbGF5X3RyZWVfbm9kZSBwID0gKnBhcmVudDsKLQotICAgICAgKCpncmFuZHBhcmVudCktPnJpZ2h0ID0gcC0+bGVmdDsKLSAgICAgIHAtPmxlZnQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICBwLT5yaWdodCA9IG4tPmxlZnQ7Ci0gICAgICBuLT5sZWZ0ID0gcDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgLyogRmluYWxseSwgZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIE4gaXMgYSBsZWZ0IGNoaWxkLCBidXQgKlBBUkVOVAotICAgICBpcyBhIHJpZ2h0IGNoaWxkLCBvciB2aWNlIHZlcnNhLiAgKi8KLSAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0KSAKLSAgICB7Ci0gICAgICAoKnBhcmVudCktPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gKnBhcmVudDsKLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5yaWdodCA9IG4tPmxlZnQ7Ci0gICAgICBuLT5sZWZ0ID0gKmdyYW5kcGFyZW50OwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0gCi0gIGVsc2UKLSAgICB7Ci0gICAgICAoKnBhcmVudCktPnJpZ2h0ID0gbi0+bGVmdDsKLSAgICAgIG4tPmxlZnQgPSAqcGFyZW50OwotICAgICAgKCpncmFuZHBhcmVudCktPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gKmdyYW5kcGFyZW50OwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLX0KLQotLyogU3BsYXkgU1AgYXJvdW5kIEtFWS4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGxheV90cmVlX3NwbGF5IChzcCwga2V5KQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci17Ci0gIGlmIChzcC0+cm9vdCA9PSAwKQotICAgIHJldHVybjsKLQotICBzcGxheV90cmVlX3NwbGF5X2hlbHBlciAoc3AsIGtleSwgJnNwLT5yb290LCAKLQkJCSAgIC8qZ3JhbmRwYXJlbnQ9Ki8wLCAvKnBhcmVudD0qLzApOyAKLX0KLQotLyogQ2FsbCBGTiwgcGFzc2luZyBpdCB0aGUgREFUQSwgZm9yIGV2ZXJ5IG5vZGUgYmVsb3cgTk9ERSwgYWxsIG9mCi0gICB3aGljaCBhcmUgZnJvbSBTUCwgZm9sbG93aW5nIGFuIGluLW9yZGVyIHRyYXZlcnNhbC4gIElmIEZOIGV2ZXJ5Ci0gICByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBpdGVyYXRpb24gY2Vhc2VzIGltbWVkaWF0ZWx5LCBhbmQgdGhlCi0gICB2YWx1ZSBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAuICAqLwotCi1zdGF0aWMgaW50Ci1zcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZSwgZm4sIGRhdGEpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSBub2RlOwotICAgICBzcGxheV90cmVlX2ZvcmVhY2hfZm4gZm47Ci0gICAgIHZvaWQqIGRhdGE7Ci17Ci0gIGludCB2YWw7Ci0KLSAgaWYgKCFub2RlKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgKHNwLCBub2RlLT5sZWZ0LCBmbiwgZGF0YSk7Ci0gIGlmICh2YWwpCi0gICAgcmV0dXJuIHZhbDsKLQotICB2YWwgPSAoKmZuKShub2RlLCBkYXRhKTsKLSAgaWYgKHZhbCkKLSAgICByZXR1cm4gdmFsOwotCi0gIHJldHVybiBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZS0+cmlnaHQsIGZuLCBkYXRhKTsKLX0KLQotLyogQWxsb2NhdGUgYSBuZXcgc3BsYXkgdHJlZSwgdXNpbmcgQ09NUEFSRV9GTiB0byBjb21wYXJlIG5vZGVzLAotICAgREVMRVRFX0tFWV9GTiB0byBkZWFsbG9jYXRlIGtleXMsIGFuZCBERUxFVEVfVkFMVUVfRk4gdG8gZGVhbGxvY2F0ZQotICAgdmFsdWVzLiAgKi8KLQotc3BsYXlfdHJlZSAKLXNwbGF5X3RyZWVfbmV3IChjb21wYXJlX2ZuLCBkZWxldGVfa2V5X2ZuLCBkZWxldGVfdmFsdWVfZm4pCi0gICAgIHNwbGF5X3RyZWVfY29tcGFyZV9mbiBjb21wYXJlX2ZuOwotICAgICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4gZGVsZXRlX2tleV9mbjsKLSAgICAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4gZGVsZXRlX3ZhbHVlX2ZuOwotewotICBzcGxheV90cmVlIHNwID0gKHNwbGF5X3RyZWUpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNwbGF5X3RyZWUpKTsKLSAgc3AtPnJvb3QgPSAwOwotICBzcC0+Y29tcCA9IGNvbXBhcmVfZm47Ci0gIHNwLT5kZWxldGVfa2V5ID0gZGVsZXRlX2tleV9mbjsKLSAgc3AtPmRlbGV0ZV92YWx1ZSA9IGRlbGV0ZV92YWx1ZV9mbjsKLQotICByZXR1cm4gc3A7Ci19Ci0KLS8qIERlYWxsb2NhdGUgU1AuICAqLwotCi12b2lkIAotc3BsYXlfdHJlZV9kZWxldGUgKHNwKQotICAgICBzcGxheV90cmVlIHNwOwotewotICBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBzcC0+cm9vdCk7Ci0gIGZyZWUgKChjaGFyKikgc3ApOwotfQotCi0vKiBJbnNlcnQgYSBuZXcgbm9kZSAoYXNzb2NpYXRpbmcgS0VZIHdpdGggREFUQSkgaW50byBTUC4gIElmIGEKLSAgIHByZXZpb3VzIG5vZGUgd2l0aCB0aGUgaW5kaWNhdGVkIEtFWSBleGlzdHMsIGl0cyBkYXRhIGlzIHJlcGxhY2VkCi0gICB3aXRoIHRoZSBuZXcgdmFsdWUuICAqLwotCi12b2lkIAotc3BsYXlfdHJlZV9pbnNlcnQgKHNwLCBrZXksIHZhbHVlKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci0gICAgIHNwbGF5X3RyZWVfdmFsdWUgdmFsdWU7Ci17Ci0gIGludCBjb21wYXJpc29uID0gMDsKLQotICBzcGxheV90cmVlX3NwbGF5IChzcCwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QpCi0gICAgY29tcGFyaXNvbiA9ICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSk7Ci0KLSAgaWYgKHNwLT5yb290ICYmIGNvbXBhcmlzb24gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgcm9vdCBvZiB0aGUgdHJlZSBhbHJlYWR5IGhhcyB0aGUgaW5kaWNhdGVkIEtFWSwganVzdAotCSByZXBsYWNlIHRoZSB2YWx1ZSB3aXRoIFZBTFVFLiAgKi8KLSAgICAgIGlmIChzcC0+ZGVsZXRlX3ZhbHVlKQotCSgqc3AtPmRlbGV0ZV92YWx1ZSkoc3AtPnJvb3QtPnZhbHVlKTsKLSAgICAgIHNwLT5yb290LT52YWx1ZSA9IHZhbHVlOwotICAgIH0gCi0gIGVsc2UgCi0gICAgewotICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUsIGFuZCBpbnNlcnQgaXQgYXQgdGhlIHJvb3QuICAqLwotICAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7Ci0gICAgICAKLSAgICAgIG5vZGUgPSAoc3BsYXlfdHJlZV9ub2RlKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzcGxheV90cmVlX25vZGUpKTsKLSAgICAgIG5vZGUtPmtleSA9IGtleTsKLSAgICAgIG5vZGUtPnZhbHVlID0gdmFsdWU7Ci0gICAgICAKLSAgICAgIGlmICghc3AtPnJvb3QpCi0Jbm9kZS0+bGVmdCA9IG5vZGUtPnJpZ2h0ID0gMDsKLSAgICAgIGVsc2UgaWYgKGNvbXBhcmlzb24gPCAwKQotCXsKLQkgIG5vZGUtPmxlZnQgPSBzcC0+cm9vdDsKLQkgIG5vZGUtPnJpZ2h0ID0gbm9kZS0+bGVmdC0+cmlnaHQ7Ci0JICBub2RlLT5sZWZ0LT5yaWdodCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5vZGUtPnJpZ2h0ID0gc3AtPnJvb3Q7Ci0JICBub2RlLT5sZWZ0ID0gbm9kZS0+cmlnaHQtPmxlZnQ7Ci0JICBub2RlLT5yaWdodC0+bGVmdCA9IDA7Ci0JfQotCi0gICAgc3AtPnJvb3QgPSBub2RlOwotICB9Ci19Ci0KLS8qIExvb2t1cCBLRVkgaW4gU1AsIHJldHVybmluZyBWQUxVRSBpZiBwcmVzZW50LCBhbmQgTlVMTCAKLSAgIG90aGVyd2lzZS4gICovCi0KLXNwbGF5X3RyZWVfbm9kZQotc3BsYXlfdHJlZV9sb29rdXAgKHNwLCBrZXkpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLXsKLSAgc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSk7Ci0KLSAgaWYgKHNwLT5yb290ICYmICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSkgPT0gMCkKLSAgICByZXR1cm4gc3AtPnJvb3Q7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ2FsbCBGTiwgcGFzc2luZyBpdCB0aGUgREFUQSwgZm9yIGV2ZXJ5IG5vZGUgaW4gU1AsIGZvbGxvd2luZyBhbgotICAgaW4tb3JkZXIgdHJhdmVyc2FsLiAgSWYgRk4gZXZlcnkgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGUKLSAgIGl0ZXJhdGlvbiBjZWFzZXMgaW1tZWRpYXRlbHksIGFuZCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiAgKi8KLQotaW50Ci1zcGxheV90cmVlX2ZvcmVhY2ggKHNwLCBmbiwgZGF0YSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuIGZuOwotICAgICB2b2lkICpkYXRhOwotewotICByZXR1cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIHNwLT5yb290LCBmbiwgZGF0YSk7Ci19Ci0KLS8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgaW50cy4gICovCi0KLWludAotc3BsYXlfdHJlZV9jb21wYXJlX2ludHMgKGsxLCBrMikKLSAgICAgc3BsYXlfdHJlZV9rZXkgazE7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGsyOwotewotICBpZiAoKGludCkgazEgPCAoaW50KSBrMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKChpbnQpIGsxID4gKGludCkgazIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgcG9pbnRlcnMuICAqLwotCi1pbnQKLXNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyAoazEsIGsyKQotICAgICBzcGxheV90cmVlX2tleSBrMTsKLSAgICAgc3BsYXlfdHJlZV9rZXkgazI7Ci17Ci0gIGlmICgoY2hhciopIGsxIDwgKGNoYXIqKSBrMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKChjaGFyKikgazEgPiAoY2hhciopIGsyKQotICAgIHJldHVybiAxOwotICBlbHNlIAotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYyBiL2xpYmliZXJ0eS9zdHJjYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTkzMGIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkIGFuZCB0aGF0IGR1ZSBjcmVkaXQgaXMgZ2l2ZW4KLSAqIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkuIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5Ci0gKiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGhpcyBzb2Z0d2FyZQotICogaXMgcHJvdmlkZWQgYGBhcyBpcycnIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICovCi0KLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylzdHJjYXNlY21wLmMJNS41IChCZXJrZWxleSkgMTEvMjQvODciOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyoKLSAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCi0gKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCi0gKiBiYXNlZCB1cG9uIGFzY2lpIGNoYXJhY3RlciBzZXF1ZW5jZXMuCi0gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1YzsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJtYXBbXSA9IHsKLQkodWMpJ1wwMDAnLCh1YyknXDAwMScsKHVjKSdcMDAyJywodWMpJ1wwMDMnLCh1YyknXDAwNCcsKHVjKSdcMDA1JywodWMpJ1wwMDYnLCh1YyknXDAwNycsCi0JKHVjKSdcMDEwJywodWMpJ1wwMTEnLCh1YyknXDAxMicsKHVjKSdcMDEzJywodWMpJ1wwMTQnLCh1YyknXDAxNScsKHVjKSdcMDE2JywodWMpJ1wwMTcnLAotCSh1YyknXDAyMCcsKHVjKSdcMDIxJywodWMpJ1wwMjInLCh1YyknXDAyMycsKHVjKSdcMDI0JywodWMpJ1wwMjUnLCh1YyknXDAyNicsKHVjKSdcMDI3JywKLQkodWMpJ1wwMzAnLCh1YyknXDAzMScsKHVjKSdcMDMyJywodWMpJ1wwMzMnLCh1YyknXDAzNCcsKHVjKSdcMDM1JywodWMpJ1wwMzYnLCh1YyknXDAzNycsCi0JKHVjKSdcMDQwJywodWMpJ1wwNDEnLCh1YyknXDA0MicsKHVjKSdcMDQzJywodWMpJ1wwNDQnLCh1YyknXDA0NScsKHVjKSdcMDQ2JywodWMpJ1wwNDcnLAotCSh1YyknXDA1MCcsKHVjKSdcMDUxJywodWMpJ1wwNTInLCh1YyknXDA1MycsKHVjKSdcMDU0JywodWMpJ1wwNTUnLCh1YyknXDA1NicsKHVjKSdcMDU3JywKLQkodWMpJ1wwNjAnLCh1YyknXDA2MScsKHVjKSdcMDYyJywodWMpJ1wwNjMnLCh1YyknXDA2NCcsKHVjKSdcMDY1JywodWMpJ1wwNjYnLCh1YyknXDA2NycsCi0JKHVjKSdcMDcwJywodWMpJ1wwNzEnLCh1YyknXDA3MicsKHVjKSdcMDczJywodWMpJ1wwNzQnLCh1YyknXDA3NScsKHVjKSdcMDc2JywodWMpJ1wwNzcnLAotCSh1YyknXDEwMCcsKHVjKSdcMTQxJywodWMpJ1wxNDInLCh1YyknXDE0MycsKHVjKSdcMTQ0JywodWMpJ1wxNDUnLCh1YyknXDE0NicsKHVjKSdcMTQ3JywKLQkodWMpJ1wxNTAnLCh1YyknXDE1MScsKHVjKSdcMTUyJywodWMpJ1wxNTMnLCh1YyknXDE1NCcsKHVjKSdcMTU1JywodWMpJ1wxNTYnLCh1YyknXDE1NycsCi0JKHVjKSdcMTYwJywodWMpJ1wxNjEnLCh1YyknXDE2MicsKHVjKSdcMTYzJywodWMpJ1wxNjQnLCh1YyknXDE2NScsKHVjKSdcMTY2JywodWMpJ1wxNjcnLAotCSh1YyknXDE3MCcsKHVjKSdcMTcxJywodWMpJ1wxNzInLCh1YyknXDEzMycsKHVjKSdcMTM0JywodWMpJ1wxMzUnLCh1YyknXDEzNicsKHVjKSdcMTM3JywKLQkodWMpJ1wxNDAnLCh1YyknXDE0MScsKHVjKSdcMTQyJywodWMpJ1wxNDMnLCh1YyknXDE0NCcsKHVjKSdcMTQ1JywodWMpJ1wxNDYnLCh1YyknXDE0NycsCi0JKHVjKSdcMTUwJywodWMpJ1wxNTEnLCh1YyknXDE1MicsKHVjKSdcMTUzJywodWMpJ1wxNTQnLCh1YyknXDE1NScsKHVjKSdcMTU2JywodWMpJ1wxNTcnLAotCSh1YyknXDE2MCcsKHVjKSdcMTYxJywodWMpJ1wxNjInLCh1YyknXDE2MycsKHVjKSdcMTY0JywodWMpJ1wxNjUnLCh1YyknXDE2NicsKHVjKSdcMTY3JywKLQkodWMpJ1wxNzAnLCh1YyknXDE3MScsKHVjKSdcMTcyJywodWMpJ1wxNzMnLCh1YyknXDE3NCcsKHVjKSdcMTc1JywodWMpJ1wxNzYnLCh1YyknXDE3NycsCi0JKHVjKSdcMjAwJywodWMpJ1wyMDEnLCh1YyknXDIwMicsKHVjKSdcMjAzJywodWMpJ1wyMDQnLCh1YyknXDIwNScsKHVjKSdcMjA2JywodWMpJ1wyMDcnLAotCSh1YyknXDIxMCcsKHVjKSdcMjExJywodWMpJ1wyMTInLCh1YyknXDIxMycsKHVjKSdcMjE0JywodWMpJ1wyMTUnLCh1YyknXDIxNicsKHVjKSdcMjE3JywKLQkodWMpJ1wyMjAnLCh1YyknXDIyMScsKHVjKSdcMjIyJywodWMpJ1wyMjMnLCh1YyknXDIyNCcsKHVjKSdcMjI1JywodWMpJ1wyMjYnLCh1YyknXDIyNycsCi0JKHVjKSdcMjMwJywodWMpJ1wyMzEnLCh1YyknXDIzMicsKHVjKSdcMjMzJywodWMpJ1wyMzQnLCh1YyknXDIzNScsKHVjKSdcMjM2JywodWMpJ1wyMzcnLAotCSh1YyknXDI0MCcsKHVjKSdcMjQxJywodWMpJ1wyNDInLCh1YyknXDI0MycsKHVjKSdcMjQ0JywodWMpJ1wyNDUnLCh1YyknXDI0NicsKHVjKSdcMjQ3JywKLQkodWMpJ1wyNTAnLCh1YyknXDI1MScsKHVjKSdcMjUyJywodWMpJ1wyNTMnLCh1YyknXDI1NCcsKHVjKSdcMjU1JywodWMpJ1wyNTYnLCh1YyknXDI1NycsCi0JKHVjKSdcMjYwJywodWMpJ1wyNjEnLCh1YyknXDI2MicsKHVjKSdcMjYzJywodWMpJ1wyNjQnLCh1YyknXDI2NScsKHVjKSdcMjY2JywodWMpJ1wyNjcnLAotCSh1YyknXDI3MCcsKHVjKSdcMjcxJywodWMpJ1wyNzInLCh1YyknXDI3MycsKHVjKSdcMjc0JywodWMpJ1wyNzUnLCh1YyknXDI3NicsKHVjKSdcMjc3JywKLQkodWMpJ1wzMDAnLCh1YyknXDM0MScsKHVjKSdcMzQyJywodWMpJ1wzNDMnLCh1YyknXDM0NCcsKHVjKSdcMzQ1JywodWMpJ1wzNDYnLCh1YyknXDM0NycsCi0JKHVjKSdcMzUwJywodWMpJ1wzNTEnLCh1YyknXDM1MicsKHVjKSdcMzUzJywodWMpJ1wzNTQnLCh1YyknXDM1NScsKHVjKSdcMzU2JywodWMpJ1wzNTcnLAotCSh1YyknXDM2MCcsKHVjKSdcMzYxJywodWMpJ1wzNjInLCh1YyknXDM2MycsKHVjKSdcMzY0JywodWMpJ1wzNjUnLCh1YyknXDM2NicsKHVjKSdcMzY3JywKLQkodWMpJ1wzNzAnLCh1YyknXDM3MScsKHVjKSdcMzcyJywodWMpJ1wzMzMnLCh1YyknXDMzNCcsKHVjKSdcMzM1JywodWMpJ1wzMzYnLCh1YyknXDMzNycsCi0JKHVjKSdcMzQwJywodWMpJ1wzNDEnLCh1YyknXDM0MicsKHVjKSdcMzQzJywodWMpJ1wzNDQnLCh1YyknXDM0NScsKHVjKSdcMzQ2JywodWMpJ1wzNDcnLAotCSh1YyknXDM1MCcsKHVjKSdcMzUxJywodWMpJ1wzNTInLCh1YyknXDM1MycsKHVjKSdcMzU0JywodWMpJ1wzNTUnLCh1YyknXDM1NicsKHVjKSdcMzU3JywKLQkodWMpJ1wzNjAnLCh1YyknXDM2MScsKHVjKSdcMzYyJywodWMpJ1wzNjMnLCh1YyknXDM2NCcsKHVjKSdcMzY1JywodWMpJ1wzNjYnLCh1YyknXDM2NycsCi0JKHVjKSdcMzcwJywodWMpJ1wzNzEnLCh1YyknXDM3MicsKHVjKSdcMzczJywodWMpJ1wzNzQnLCh1YyknXDM3NScsKHVjKSdcMzc2JywodWMpJ1wzNzcnLAotfTsKLQotaW50Ci1zdHJjYXNlY21wKHMxLCBzMikKLSAgICBjb25zdCBjaGFyICpzMSwgKnMyOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdTEsIHUyOwotCi0gICAgZm9yICg7OykgewotCXUxID0gKHVuc2lnbmVkIGNoYXIpICpzMSsrOwotCXUyID0gKHVuc2lnbmVkIGNoYXIpICpzMisrOwotCWlmIChjaGFybWFwW3UxXSAhPSBjaGFybWFwW3UyXSkgewotCSAgICByZXR1cm4gY2hhcm1hcFt1MV0gLSBjaGFybWFwW3UyXTsKLQl9Ci0JaWYgKHUxID09ICdcMCcpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNoci5jIGIvbGliaWJlcnR5L3N0cmNoci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTA0ODBmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJjaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RyY2hyKCkKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCXN0cmNociAtLSByZXR1cm4gcG9pbnRlciB0byBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBjaGFyYWN0ZXIKLQotU1lOT1BTSVMKLQljaGFyICpzdHJjaHIgKGNvbnN0IGNoYXIgKnMsIGludCBjKQotCi1ERVNDUklQVElPTgotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgY2hhcmFjdGVyIEMgaW4KLQlzdHJpbmcgUywgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm8gb2NjdXJhbmNlIGlzIGZvdW5kLgotCQotQlVHUwotCUJlaGF2aW9yIHdoZW4gY2hhcmFjdGVyIGlzIHRoZSBudWxsIGNoYXJhY3RlciBpcyBpbXBsZW1lbnRhdGlvbgotCWRlcGVuZGVudC4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi1jaGFyICoKLXN0cmNociAocywgYykKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIGRvIHsKLSAgICBpZiAoKnMgPT0gYykKLSAgICAgIHsKLQlyZXR1cm4gKGNoYXIqKXM7Ci0gICAgICB9Ci0gIH0gd2hpbGUgKCpzKyspOwotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmR1cC5jIGIvbGliaWJlcnR5L3N0cmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzg1YjM0Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWNoYXIgKgotc3RyZHVwKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gICAgY2hhciAqcmVzdWx0ID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocykgKyAxKTsKLSAgICBpZiAocmVzdWx0ID09IChjaGFyKikwKQotCXJldHVybiAoY2hhciopMDsKLSAgICBzdHJjcHkocmVzdWx0LCBzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmVycm9yLmMgYi9saWJpYmVydHkvc3RyZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0Y2M3NS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDgzMSArMCwwIEBACi0vKiBFeHRlbmRlZCBzdXBwb3J0IGZvciB1c2luZyBlcnJubyB2YWx1ZXMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaC4gIGZuZkBjeWdudXMuY29tCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLVBlciBCb3RobmVyLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1lTX0VSUkxJU1QKLS8qIE5vdGUgdGhhdCBlcnJuby5oIChub3Qgc3VyZSB3aGF0IE9TKSBvciBzdGRpby5oIChCU0QgNC40LCBhdCBsZWFzdCkKLSAgIG1pZ2h0IGRlY2xhcmUgc3lzX2Vycmxpc3QgaW4gYSB3YXkgdGhhdCB0aGUgY29tcGlsZXIgbWlnaHQgY29uc2lkZXIKLSAgIGluY29tcGF0aWJsZSB3aXRoIG91ciBsYXRlciBkZWNsYXJhdGlvbiwgcGVyaGFwcyBieSB1c2luZyBjb25zdAotICAgYXR0cmlidXRlcy4gIFNvIHdlIGhpZGUgdGhlIGRlY2xhcmF0aW9uIGluIGVycm5vLmggKGlmIGFueSkgdXNpbmcgYQotICAgbWFjcm8uICovCi0jZGVmaW5lIHN5c19lcnJsaXN0IHN5c19lcnJsaXN0X18KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgSEFWRV9TWVNfRVJSTElTVAotI3VuZGVmIHN5c19lcnJsaXN0Ci0jZW5kaWYKLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3Qgc2l6ZSk7CQkJCS8qIDQuMTAuMy4zICovCi1leHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOwkJCS8qIDQuMTEuNi4xICovCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqbWVtc2V0ICgpOwotI2VuZGlmCS8qIF9fU1REQ19fICovCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpbml0X2Vycm9yX3RhYmxlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGZvciBlcnJubyB2YWx1ZXMuICBTZWUgaW50cm8oMikgaW4gbW9zdCBVTklYIHN5c3RlbXMKLSAgIFByb2dyYW1tZXJzIFJlZmVyZW5jZSBNYW51YWxzLgotCi0gICBOb3RlIHRoYXQgdGhpcyB0YWJsZSBpcyBnZW5lcmFsbHkgb25seSBhY2Nlc3NlZCB3aGVuIGl0IGlzIHVzZWQgYXQgcnVudGltZQotICAgdG8gaW5pdGlhbGl6ZSBlcnJubyBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcyB0aGF0IGFyZSBpbmRleGVkIGJ5IGVycm5vCi0gICB2YWx1ZS4KLQotICAgTm90IGFsbCBvZiB0aGVzZSBlcnJub3Mgd2lsbCBleGlzdCBvbiBhbGwgc3lzdGVtcy4gIFRoaXMgdGFibGUgaXMgdGhlIG9ubHkKLSAgIHRoaW5nIHRoYXQgc2hvdWxkIGhhdmUgdG8gYmUgdXBkYXRlZCBhcyBuZXcgZXJyb3IgbnVtYmVycyBhcmUgaW50cm9kdWNlZC4KLSAgIEl0J3Mgc29ydCBvZiB1Z2x5LCBidXQgYXQgbGVhc3QgaXRzIHBvcnRhYmxlLiAqLwotCi1zdHJ1Y3QgZXJyb3JfaW5mbwotewotICBpbnQgdmFsdWU7CQkvKiBUaGUgbnVtZXJpYyB2YWx1ZSBmcm9tIDxlcnJuby5oPiAqLwotICBjb25zdCBjaGFyICpuYW1lOwkvKiBUaGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZSAqLwotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0gIGNvbnN0IGNoYXIgKm1zZzsJLyogU2hvcnQgbWVzc2FnZSBhYm91dCB0aGlzIHZhbHVlICovCi0jZW5kaWYKLX07Ci0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWUsIG1zZ30KLSNlbHNlCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVycm9yX2luZm8gZXJyb3JfdGFibGVbXSA9Ci17Ci0jaWYgZGVmaW5lZCAoRVBFUk0pCi0gIEVOVFJZKEVQRVJNLCAiRVBFUk0iLCAiTm90IG93bmVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9FTlQpCi0gIEVOVFJZKEVOT0VOVCwgIkVOT0VOVCIsICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1JDSCkKLSAgRU5UUlkoRVNSQ0gsICJFU1JDSCIsICJObyBzdWNoIHByb2Nlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlRSKQotICBFTlRSWShFSU5UUiwgIkVJTlRSIiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSU8pCi0gIEVOVFJZKEVJTywgIkVJTyIsICJJL08gZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOWElPKQotICBFTlRSWShFTlhJTywgIkVOWElPIiwgIk5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEUyQklHKQotICBFTlRSWShFMkJJRywgIkUyQklHIiwgIkFyZyBsaXN0IHRvbyBsb25nIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9FWEVDKQotICBFTlRSWShFTk9FWEVDLCAiRU5PRVhFQyIsICJFeGVjIGZvcm1hdCBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBREYpCi0gIEVOVFJZKEVCQURGLCAiRUJBREYiLCAiQmFkIGZpbGUgbnVtYmVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ0hJTEQpCi0gIEVOVFJZKEVDSElMRCwgIkVDSElMRCIsICJObyBjaGlsZCBwcm9jZXNzZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVXT1VMREJMT0NLKQkvKiBQdXQgYmVmb3JlIEVBR0FJTiwgc29tZXRpbWVzIGFsaWFzZWQgKi8KLSAgRU5UUlkoRVdPVUxEQkxPQ0ssICJFV09VTERCTE9DSyIsICJPcGVyYXRpb24gd291bGQgYmxvY2siKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBR0FJTikKLSAgRU5UUlkoRUFHQUlOLCAiRUFHQUlOIiwgIk5vIG1vcmUgcHJvY2Vzc2VzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9NRU0pCi0gIEVOVFJZKEVOT01FTSwgIkVOT01FTSIsICJOb3QgZW5vdWdoIHNwYWNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUNDRVMpCi0gIEVOVFJZKEVBQ0NFUywgIkVBQ0NFUyIsICJQZXJtaXNzaW9uIGRlbmllZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUZBVUxUKQotICBFTlRSWShFRkFVTFQsICJFRkFVTFQiLCAiQmFkIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RCTEspCi0gIEVOVFJZKEVOT1RCTEssICJFTk9UQkxLIiwgIkJsb2NrIGRldmljZSByZXF1aXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJVU1kpCi0gIEVOVFJZKEVCVVNZLCAiRUJVU1kiLCAiRGV2aWNlIGJ1c3kiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVFWElTVCkKLSAgRU5UUlkoRUVYSVNULCAiRUVYSVNUIiwgIkZpbGUgZXhpc3RzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFWERFVikKLSAgRU5UUlkoRVhERVYsICJFWERFViIsICJDcm9zcy1kZXZpY2UgbGluayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PREVWKQotICBFTlRSWShFTk9ERVYsICJFTk9ERVYiLCAiTm8gc3VjaCBkZXZpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RESVIpCi0gIEVOVFJZKEVOT1RESVIsICJFTk9URElSIiwgIk5vdCBhIGRpcmVjdG9yeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlTRElSKQotICBFTlRSWShFSVNESVIsICJFSVNESVIiLCAiSXMgYSBkaXJlY3RvcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlZBTCkKLSAgRU5UUlkoRUlOVkFMLCAiRUlOVkFMIiwgIkludmFsaWQgYXJndW1lbnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORklMRSkKLSAgRU5UUlkoRU5GSUxFLCAiRU5GSUxFIiwgIkZpbGUgdGFibGUgb3ZlcmZsb3ciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNRklMRSkKLSAgRU5UUlkoRU1GSUxFLCAiRU1GSUxFIiwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RUWSkKLSAgRU5UUlkoRU5PVFRZLCAiRU5PVFRZIiwgIk5vdCBhIHR5cGV3cml0ZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVUWFRCU1kpCi0gIEVOVFJZKEVUWFRCU1ksICJFVFhUQlNZIiwgIlRleHQgZmlsZSBidXN5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRkJJRykKLSAgRU5UUlkoRUZCSUcsICJFRkJJRyIsICJGaWxlIHRvbyBsYXJnZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PU1BDKQotICBFTlRSWShFTk9TUEMsICJFTk9TUEMiLCAiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTUElQRSkKLSAgRU5UUlkoRVNQSVBFLCAiRVNQSVBFIiwgIklsbGVnYWwgc2VlayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJPRlMpCi0gIEVOVFJZKEVST0ZTLCAiRVJPRlMiLCAiUmVhZC1vbmx5IGZpbGUgc3lzdGVtIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTUxJTkspCi0gIEVOVFJZKEVNTElOSywgIkVNTElOSyIsICJUb28gbWFueSBsaW5rcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBJUEUpCi0gIEVOVFJZKEVQSVBFLCAiRVBJUEUiLCAiQnJva2VuIHBpcGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVET00pCi0gIEVOVFJZKEVET00sICJFRE9NIiwgIk1hdGggYXJndW1lbnQgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkFOR0UpCi0gIEVOVFJZKEVSQU5HRSwgIkVSQU5HRSIsICJNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTVNHKQotICBFTlRSWShFTk9NU0csICJFTk9NU0ciLCAiTm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJRFJNKQotICBFTlRSWShFSURSTSwgIkVJRFJNIiwgIklkZW50aWZpZXIgcmVtb3ZlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNIUk5HKQotICBFTlRSWShFQ0hSTkcsICJFQ0hSTkciLCAiQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDJOU1lOQykKLSAgRU5UUlkoRUwyTlNZTkMsICJFTDJOU1lOQyIsICJMZXZlbCAyIG5vdCBzeW5jaHJvbml6ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMM0hMVCkKLSAgRU5UUlkoRUwzSExULCAiRUwzSExUIiwgIkxldmVsIDMgaGFsdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDNSU1QpCi0gIEVOVFJZKEVMM1JTVCwgIkVMM1JTVCIsICJMZXZlbCAzIHJlc2V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTE5STkcpCi0gIEVOVFJZKEVMTlJORywgIkVMTlJORyIsICJMaW5rIG51bWJlciBvdXQgb2YgcmFuZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVTkFUQ0gpCi0gIEVOVFJZKEVVTkFUQ0gsICJFVU5BVENIIiwgIlByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0NTSSkKLSAgRU5UUlkoRU5PQ1NJLCAiRU5PQ1NJIiwgIk5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDJITFQpCi0gIEVOVFJZKEVMMkhMVCwgIkVMMkhMVCIsICJMZXZlbCAyIGhhbHRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURFQURMSykKLSAgRU5UUlkoRURFQURMSywgIkVERUFETEsiLCAiRGVhZGxvY2sgY29uZGl0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9MQ0spCi0gIEVOVFJZKEVOT0xDSywgIkVOT0xDSyIsICJObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERSkKLSAgRU5UUlkoRUJBREUsICJFQkFERSIsICJJbnZhbGlkIGV4Y2hhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEUikKLSAgRU5UUlkoRUJBRFIsICJFQkFEUiIsICJJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVhGVUxMKQotICBFTlRSWShFWEZVTEwsICJFWEZVTEwiLCAiRXhjaGFuZ2UgZnVsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PQU5PKQotICBFTlRSWShFTk9BTk8sICJFTk9BTk8iLCAiTm8gYW5vZGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURSUUMpCi0gIEVOVFJZKEVCQURSUUMsICJFQkFEUlFDIiwgIkludmFsaWQgcmVxdWVzdCBjb2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEU0xUKQotICBFTlRSWShFQkFEU0xULCAiRUJBRFNMVCIsICJJbnZhbGlkIHNsb3QiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERUFETE9DSykKLSAgRU5UUlkoRURFQURMT0NLLCAiRURFQURMT0NLIiwgIkZpbGUgbG9ja2luZyBkZWFkbG9jayBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJGT05UKQotICBFTlRSWShFQkZPTlQsICJFQkZPTlQiLCAiQmFkIGZvbnQgZmlsZSBmb3JtYXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NUUikKLSAgRU5UUlkoRU5PU1RSLCAiRU5PU1RSIiwgIkRldmljZSBub3QgYSBzdHJlYW0iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0RBVEEpCi0gIEVOVFJZKEVOT0RBVEEsICJFTk9EQVRBIiwgIk5vIGRhdGEgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVElNRSkKLSAgRU5UUlkoRVRJTUUsICJFVElNRSIsICJUaW1lciBleHBpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TUikKLSAgRU5UUlkoRU5PU1IsICJFTk9TUiIsICJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT05FVCkKLSAgRU5UUlkoRU5PTkVULCAiRU5PTkVUIiwgIk1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9QS0cpCi0gIEVOVFJZKEVOT1BLRywgIkVOT1BLRyIsICJQYWNrYWdlIG5vdCBpbnN0YWxsZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRU1PVEUpCi0gIEVOVFJZKEVSRU1PVEUsICJFUkVNT1RFIiwgIk9iamVjdCBpcyByZW1vdGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0xJTkspCi0gIEVOVFJZKEVOT0xJTkssICJFTk9MSU5LIiwgIkxpbmsgaGFzIGJlZW4gc2V2ZXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFEVikKLSAgRU5UUlkoRUFEViwgIkVBRFYiLCAiQWR2ZXJ0aXNlIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1JNTlQpCi0gIEVOVFJZKEVTUk1OVCwgIkVTUk1OVCIsICJTcm1vdW50IGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09NTSkKLSAgRU5UUlkoRUNPTU0sICJFQ09NTSIsICJDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UTykKLSAgRU5UUlkoRVBST1RPLCAiRVBST1RPIiwgIlByb3RvY29sIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTVVMVElIT1ApCi0gIEVOVFJZKEVNVUxUSUhPUCwgIkVNVUxUSUhPUCIsICJNdWx0aWhvcCBhdHRlbXB0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVET1RET1QpCi0gIEVOVFJZKEVET1RET1QsICJFRE9URE9UIiwgIlJGUyBzcGVjaWZpYyBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBRE1TRykKLSAgRU5UUlkoRUJBRE1TRywgIkVCQURNU0ciLCAiTm90IGEgZGF0YSBtZXNzYWdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkFNRVRPT0xPTkcpCi0gIEVOVFJZKEVOQU1FVE9PTE9ORywgIkVOQU1FVE9PTE9ORyIsICJGaWxlIG5hbWUgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVPVkVSRkxPVykKLSAgRU5UUlkoRU9WRVJGTE9XLCAiRU9WRVJGTE9XIiwgIlZhbHVlIHRvbyBsYXJnZSBmb3IgZGVmaW5lZCBkYXRhIHR5cGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RVTklRKQotICBFTlRSWShFTk9UVU5JUSwgIkVOT1RVTklRIiwgIk5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERkQpCi0gIEVOVFJZKEVCQURGRCwgIkVCQURGRCIsICJGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNQ0hHKQotICBFTlRSWShFUkVNQ0hHLCAiRVJFTUNIRyIsICJSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCQUNDKQotICBFTlRSWShFTElCQUNDLCAiRUxJQkFDQyIsICJDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkJBRCkKLSAgRU5UUlkoRUxJQkJBRCwgIkVMSUJCQUQiLCAiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCU0NOKQotICBFTlRSWShFTElCU0NOLCAiRUxJQlNDTiIsICIubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCTUFYKQotICBFTlRSWShFTElCTUFYLCAiRUxJQk1BWCIsICJBdHRlbXB0aW5nIHRvIGxpbmsgaW4gdG9vIG1hbnkgc2hhcmVkIGxpYnJhcmllcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkVYRUMpCi0gIEVOVFJZKEVMSUJFWEVDLCAiRUxJQkVYRUMiLCAiQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlMU0VRKQotICBFTlRSWShFSUxTRVEsICJFSUxTRVEiLCAiSWxsZWdhbCBieXRlIHNlcXVlbmNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TWVMpCi0gIEVOVFJZKEVOT1NZUywgIkVOT1NZUyIsICJPcGVyYXRpb24gbm90IGFwcGxpY2FibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMT09QKQotICBFTlRSWShFTE9PUCwgIkVMT09QIiwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVTVEFSVCkKLSAgRU5UUlkoRVJFU1RBUlQsICJFUkVTVEFSVCIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1RSUElQRSkKLSAgRU5UUlkoRVNUUlBJUEUsICJFU1RSUElQRSIsICJTdHJlYW1zIHBpcGUgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RFTVBUWSkKLSAgRU5UUlkoRU5PVEVNUFRZLCAiRU5PVEVNUFRZIiwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVU0VSUykKLSAgRU5UUlkoRVVTRVJTLCAiRVVTRVJTIiwgIlRvbyBtYW55IHVzZXJzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UU09DSykKLSAgRU5UUlkoRU5PVFNPQ0ssICJFTk9UU09DSyIsICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERVNUQUREUlJFUSkKLSAgRU5UUlkoRURFU1RBRERSUkVRLCAiRURFU1RBRERSUkVRIiwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNU0dTSVpFKQotICBFTlRSWShFTVNHU0laRSwgIkVNU0dTSVpFIiwgIk1lc3NhZ2UgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UT1RZUEUpCi0gIEVOVFJZKEVQUk9UT1RZUEUsICJFUFJPVE9UWVBFIiwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PUFJPVE9PUFQpCi0gIEVOVFJZKEVOT1BST1RPT1BULCAiRU5PUFJPVE9PUFQiLCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBST1RPTk9TVVBQT1JUKQotICBFTlRSWShFUFJPVE9OT1NVUFBPUlQsICJFUFJPVE9OT1NVUFBPUlQiLCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNPQ0tUTk9TVVBQT1JUKQotICBFTlRSWShFU09DS1ROT1NVUFBPUlQsICJFU09DS1ROT1NVUFBPUlQiLCAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU9QTk9UU1VQUCkKLSAgRU5UUlkoRU9QTk9UU1VQUCwgIkVPUE5PVFNVUFAiLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUEZOT1NVUFBPUlQpCi0gIEVOVFJZKEVQRk5PU1VQUE9SVCwgIkVQRk5PU1VQUE9SVCIsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFGTk9TVVBQT1JUKQotICBFTlRSWShFQUZOT1NVUFBPUlQsICJFQUZOT1NVUFBPUlQiLCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFERFJJTlVTRSkKLSAgRU5UUlkoRUFERFJJTlVTRSwgIkVBRERSSU5VU0UiLCAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFERFJOT1RBVkFJTCkKLSAgRU5UUlkoRUFERFJOT1RBVkFJTCwgIkVBRERSTk9UQVZBSUwiLCJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkVURE9XTikKLSAgRU5UUlkoRU5FVERPV04sICJFTkVURE9XTiIsICJOZXR3b3JrIGlzIGRvd24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRVTlJFQUNIKQotICBFTlRSWShFTkVUVU5SRUFDSCwgIkVORVRVTlJFQUNIIiwgIk5ldHdvcmsgaXMgdW5yZWFjaGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRSRVNFVCkKLSAgRU5UUlkoRU5FVFJFU0VULCAiRU5FVFJFU0VUIiwgIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OQUJPUlRFRCkKLSAgRU5UUlkoRUNPTk5BQk9SVEVELCAiRUNPTk5BQk9SVEVEIiwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09OTlJFU0VUKQotICBFTlRSWShFQ09OTlJFU0VULCAiRUNPTk5SRVNFVCIsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0JVRlMpCi0gIEVOVFJZKEVOT0JVRlMsICJFTk9CVUZTIiwgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU0NPTk4pCi0gIEVOVFJZKEVJU0NPTk4sICJFSVNDT05OIiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVENPTk4pCi0gIEVOVFJZKEVOT1RDT05OLCAiRU5PVENPTk4iLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTSFVURE9XTikKLSAgRU5UUlkoRVNIVVRET1dOLCAiRVNIVVRET1dOIiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRPT01BTllSRUZTKQotICBFTlRSWShFVE9PTUFOWVJFRlMsICJFVE9PTUFOWVJFRlMiLCAiVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRJTUVET1VUKQotICBFTlRSWShFVElNRURPVVQsICJFVElNRURPVVQiLCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OUkVGVVNFRCkKLSAgRU5UUlkoRUNPTk5SRUZVU0VELCAiRUNPTk5SRUZVU0VEIiwgIkNvbm5lY3Rpb24gcmVmdXNlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUhPU1RET1dOKQotICBFTlRSWShFSE9TVERPV04sICJFSE9TVERPV04iLCAiSG9zdCBpcyBkb3duIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSE9TVFVOUkVBQ0gpCi0gIEVOVFJZKEVIT1NUVU5SRUFDSCwgIkVIT1NUVU5SRUFDSCIsICJObyByb3V0ZSB0byBob3N0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUxSRUFEWSkKLSAgRU5UUlkoRUFMUkVBRFksICJFQUxSRUFEWSIsICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlOUFJPR1JFU1MpCi0gIEVOVFJZKEVJTlBST0dSRVNTLCAiRUlOUFJPR1JFU1MiLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNUQUxFKQotICBFTlRSWShFU1RBTEUsICJFU1RBTEUiLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVUNMRUFOKQotICBFTlRSWShFVUNMRUFOLCAiRVVDTEVBTiIsICJTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1ROQU0pCi0gIEVOVFJZKEVOT1ROQU0sICJFTk9UTkFNIiwgIk5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5BVkFJTCkKLSAgRU5UUlkoRU5BVkFJTCwgIkVOQVZBSUwiLCAiTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU05BTSkKLSAgRU5UUlkoRUlTTkFNLCAiRUlTTkFNIiwgIklzIGEgbmFtZWQgdHlwZSBmaWxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNT1RFSU8pCi0gIEVOVFJZKEVSRU1PVEVJTywgIkVSRU1PVEVJTyIsICJSZW1vdGUgSS9PIGVycm9yIiksCi0jZW5kaWYKLSAgRU5UUlkoMCwgTlVMTCwgTlVMTCkKLX07Ci0KLSNpZmRlZiBFVk1TRVJSCi0vKiBUaGlzIGlzIG5vdCBpbiB0aGUgdGFibGUsIGJlY2F1c2UgdGhlIG51bWVyaWMgdmFsdWUgb2YgRVZNU0VSUiAoMzI3NjcpCi0gICBsaWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHN5c19lcnJsaXN0W10uICAqLwotc3RhdGljIHN0cnVjdCB7IGludCB2YWx1ZTsgY29uc3QgY2hhciAqbmFtZSwgKm1zZzsgfQotICBldm1zZXJyID0geyBFVk1TRVJSLCAiRVZNU0VSUiIsICJWTVMtc3BlY2lmaWMgZXJyb3IiIH07Ci0jZW5kaWYKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLiAgSW5kZXhlZCBieSB0aGUKLSAgIGVycm5vIHZhbHVlIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoqZXJyb3JfbmFtZXM7Ci1zdGF0aWMgaW50IG51bV9lcnJvcl9uYW1lcyA9IDA7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZSwgaWYgaXQgZG9lcyBub3QKLSAgIGFscmVhZHkgZXhpc3QgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuICBJbmRleGVkIGJ5IHRoZSBlcnJubyB2YWx1ZSB0byBmaW5kCi0gICB0aGUgZGVzY3JpcHRpdmUgc3RyaW5nLgotCi0gICBXZSBkb24ndCBleHBvcnQgaXQgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaGFzIHRoZQotICAgc2FtZSBuYW1lLCBpdCBkaWZmZXJzIGZyb20gb3RoZXIgaW1wbGVtZW50YXRpb25zIGluIHRoYXQgaXQgaXMgZHluYW1pY2FsbHkKLSAgIGluaXRpYWxpemVkIHJhdGhlciB0aGFuIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi1zdGF0aWMgaW50IHN5c19uZXJyOwotc3RhdGljIGNvbnN0IGNoYXIgKipzeXNfZXJybGlzdDsKLQotI2Vsc2UKLQotZXh0ZXJuIGludCBzeXNfbmVycjsKLWV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOwotCi0jZW5kaWYKLQotCi0vKgotCi1OQU1FCi0KLQlpbml0X2Vycm9yX3RhYmxlcyAtLSBpbml0aWFsaXplIHRoZSBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIHZvaWQgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlVc2luZyB0aGUgZXJyb3JfdGFibGUsIHdoaWNoIGlzIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZSwgZ2VuZXJhdGUKLQl0aGUgZXJyb3JfbmFtZXMgYW5kIHRoZSBzeXNfZXJybGlzdCAoaWYgbmVlZGVkKSB0YWJsZXMsIHdoaWNoIGFyZQotCWluZGV4ZWQgYXQgcnVudGltZSBieSBhIHNwZWNpZmljIGVycm5vIHZhbHVlLgotCi1CVUdTCi0KLQlUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlcyBtYXkgZmFpbCB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsCi0JaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgdXNlZnVsLCBidXQgd2UgZG9uJ3QKLQlib21iIGVpdGhlci4gIFdobyBrbm93cywgaXQgbWlnaHQgc3VjY2VlZCBhdCBhIGxhdGVyIHBvaW50IGlmIHdlIGZyZWUKLQlzb21lIG1lbW9yeSBpbiB0aGUgbWVhbnRpbWUuICBJbiBhbnkgY2FzZSwgdGhlIG90aGVyIHJvdXRpbmVzIGtub3cKLQlob3cgdG8gZGVhbCB3aXRoIGxhY2sgb2YgYSB0YWJsZSBhZnRlciB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoaXMKLQltYXkgb3IgbWF5IG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYnVnLCB0aGF0IHdlIGRvbid0IHNwZWNpZmljYWxseQotCXdhcm4gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGZhaWx1cmUgbW9kZS4KLQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfZXJyb3JfdGFibGVzICgpCi17Ci0gIGNvbnN0IHN0cnVjdCBlcnJvcl9pbmZvICplaXA7Ci0gIGludCBuYnl0ZXM7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHNjYW5uZWQgdGhlIGVycm9yX3RhYmxlIG9uY2UgdG8gZmluZCB0aGUgbWF4aW11bQotICAgICBlcnJubyB2YWx1ZSwgdGhlbiBnbyBmaW5kIGl0IG5vdy4gKi8KLQotICBpZiAobnVtX2Vycm9yX25hbWVzID09IDApCi0gICAgewotICAgICAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JewotCSAgaWYgKGVpcCAtPiB2YWx1ZSA+PSBudW1fZXJyb3JfbmFtZXMpCi0JICAgIHsKLQkgICAgICBudW1fZXJyb3JfbmFtZXMgPSBlaXAgLT4gdmFsdWUgKyAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgZXJyb3JfbmFtZXMgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZXJyb3JfdGFibGUuICovCi0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX2Vycm9yX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChlcnJvcl9uYW1lcyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChlcnJvcl9uYW1lcywgMCwgbmJ5dGVzKTsKLQkgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgZXJyb3JfbmFtZXNbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBuYW1lOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHN5c19lcnJsaXN0IHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KLSAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGVycm9yX3RhYmxlLiAqLwotCi0gIGlmIChzeXNfZXJybGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5ieXRlcyA9IG51bV9lcnJvcl9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc3lzX2Vycmxpc3QgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc3lzX2Vycmxpc3QsIDAsIG5ieXRlcyk7Ci0JICBzeXNfbmVyciA9IG51bV9lcnJvcl9uYW1lczsKLQkgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc3lzX2Vycmxpc3RbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBtc2c7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jZW5kaWYKLQotfQotCi0vKgotCi1OQU1FCi0KLQllcnJub19tYXggLS0gcmV0dXJuIHRoZSBtYXggZXJybm8gdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBlcnJub19tYXggKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIHRoZSBtYXhpbXVtIGVycm5vIHZhbHVlIGZvciB3aGljaCBhIGNvcnJlc3BvbmRpbmcgc3ltYm9saWMKLQluYW1lIG9yIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IGluIHRoZSBjYXNlIHdoZXJlCi0Jd2UgdXNlIHRoZSBzeXNfZXJybGlzdCBzdXBwbGllZCBieSB0aGUgc3lzdGVtLCBpdCBpcyBwb3NzaWJsZSBmb3IKLQl0aGVyZSB0byBiZSBtb3JlIHN5bWJvbGljIG5hbWVzIHRoYW4gbWVzc2FnZXMsIG9yIHZpY2UgdmVyc2EuCi0JSW4gZmFjdCwgdGhlIG1hbnVhbCBwYWdlIGZvciBwZXJyb3IoM0MpIGV4cGxpY2l0bHkgd2FybnMgdGhhdCBvbmUKLQlzaG91bGQgY2hlY2sgdGhlIHNpemUgb2YgdGhlIHRhYmxlIChzeXNfbmVycikgYmVmb3JlIGluZGV4aW5nIGl0LAotCXNpbmNlIG5ldyBlcnJvciBjb2RlcyBtYXkgYmUgYWRkZWQgdG8gdGhlIHN5c3RlbSBiZWZvcmUgdGhleSBhcmUKLQlhZGRlZCB0byB0aGUgdGFibGUuICBUaHVzIHN5c19uZXJyIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB2YWx1ZQotCWltcGxpZWQgYnkgdGhlIGxhcmdlc3QgZXJybm8gdmFsdWUgZGVmaW5lZCBpbiA8ZXJybm8uaD4uCi0KLQlXZSByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYSBtZWFuaW5nZnVsCi0Jc3ltYm9saWMgbmFtZSBvciBtZXNzYWdlLgotCi0qLwotCi1pbnQKLWVycm5vX21heCAoKQotewotICBpbnQgbWF4c2l6ZTsKLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLSAgICB9Ci0gIG1heHNpemUgPSBNQVggKHN5c19uZXJyLCBudW1fZXJyb3JfbmFtZXMpOwotICByZXR1cm4gKG1heHNpemUgLSAxKTsKLX0KLQotI2lmbmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qCi0KLU5BTUUKLQotCXN0cmVycm9yIC0tIG1hcCBhbiBlcnJvciBudW1iZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNoYXIgKnN0cmVycm9yIChpbnQgZXJybm92YWwpCi0KLURFU0NSSVBUSU9OCi0KLQlNYXBzIGFuIGVycm5vIG51bWJlciB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhlIGNvbnRlbnRzIG9mCi0Jd2hpY2ggYXJlIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICBPbiBzeXN0ZW1zIHdoaWNoIGhhdmUgdGhlIGV4dGVybmFsCi0JdmFyaWFibGVzIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCwgdGhlc2Ugc3RyaW5ncyB3aWxsIGJlIHRoZSBzYW1lCi0JYXMgdGhlIG9uZXMgdXNlZCBieSBwZXJyb3IoKS4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHRoZSBzeXNfZXJybGlzdCwgYnV0IG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCWVycm9yIG51bWJlciwgdGhlbiByZXR1cm5zIHRoZSBzdHJpbmcgIkVycm9yIE5VTSIsIHdoZXJlIE5VTSBpcyB0aGUKLQllcnJvciBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgZXJyb3IgbnVtYmVyIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gc3lzX2Vycmxpc3QsCi0JcmV0dXJucyBOVUxMLgotCi0JVGhlIHJldHVybmVkIHN0cmluZyBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgb25seSB1bnRpbCB0aGUKLQluZXh0IGNhbGwgdG8gc3RyZXJyb3IuCi0KLSovCi0KLWNoYXIgKgotc3RyZXJyb3IgKGVycm5vdmFsKQotICBpbnQgZXJybm92YWw7Ci17Ci0gIGNoYXIgKm1zZzsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0gICAgfQotCi0jZW5kaWYKLQotICBpZiAoKGVycm5vdmFsIDwgMCkgfHwgKGVycm5vdmFsID49IHN5c19uZXJyKSkKLSAgICB7Ci0jaWZkZWYgRVZNU0VSUgotICAgICAgaWYgKGVycm5vdmFsID09IGV2bXNlcnIudmFsdWUpCi0JbXNnID0gZXZtc2Vyci5tc2c7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeXNfZXJybGlzdCA9PSBOVUxMKSB8fCAoc3lzX2Vycmxpc3RbZXJybm92YWxdID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc3lzX2Vycmxpc3Qgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIkVycm9yICVkIiwgZXJybm92YWwpOwotICAgICAgbXNnID0gYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBtZXNzYWdlLiAgSnVzdCByZXR1cm4gdGhlIG1lc3NhZ2UuICovCi0gICAgICBtc2cgPSAoY2hhciAqKSBzeXNfZXJybGlzdFtlcnJub3ZhbF07Ci0gICAgfQotICAKLSAgcmV0dXJuIChtc2cpOwotfQotCi0jZW5kaWYJLyogISBIQVZFX1NUUkVSUk9SICovCi0KLQotLyoKLQotTkFNRQotCi0Jc3RyZXJybm8gLS0gbWFwIGFuIGVycm9yIG51bWJlciB0byBhIHN5bWJvbGljIG5hbWUgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJlcnJubyAoaW50IGVycm5vdmFsKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYW4gZXJyb3IgbnVtYmVyIHJldHVybmVkIGZyb20gYSBzeXN0ZW0gY2FsbCAodHlwaWNhbGx5Ci0JcmV0dXJuZWQgaW4gZXJybm8pLCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZQotCXN5bWJvbGljIG5hbWUgb2YgdGhhdCBlcnJvciBudW1iZXIsIGFzIGZvdW5kIGluIDxlcnJuby5oPi4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHN5bWJvbGljIG5hbWVzLCBidXQgbm8gbmFtZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCi0JZXJyb3IgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiRXJyb3IgTlVNIiwgd2hlcmUgTlVNIGlzCi0JdGhlIGVycm9yIG51bWJlci4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdmFsaWQKLQlpbmRpY2VzLCB0aGVuIHJldHVybnMgTlVMTC4KLQotQlVHUwotCi0JVGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKLQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHN0cmVycm5vLgotCi0qLwotCi1jb25zdCBjaGFyICoKLXN0cmVycm5vIChlcnJub3ZhbCkKLSAgaW50IGVycm5vdmFsOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfZXJyb3JfdGFibGVzICgpOwotICAgIH0KLQotICBpZiAoKGVycm5vdmFsIDwgMCkgfHwgKGVycm5vdmFsID49IG51bV9lcnJvcl9uYW1lcykpCi0gICAgewotI2lmZGVmIEVWTVNFUlIKLSAgICAgIGlmIChlcnJub3ZhbCA9PSBldm1zZXJyLnZhbHVlKQotCW5hbWUgPSBldm1zZXJyLm5hbWU7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoZXJyb3JfbmFtZXMgPT0gTlVMTCkgfHwgKGVycm9yX25hbWVzW2Vycm5vdmFsXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIGVycm9yX25hbWVzIG9yIG5vIGVudHJ5IGF0IHRoaXMgaW5kZXguICovCi0gICAgICBzcHJpbnRmIChidWYsICJFcnJvciAlZCIsIGVycm5vdmFsKTsKLSAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG5hbWUuICBKdXN0IHJldHVybiB0aGUgbmFtZS4gKi8KLSAgICAgIG5hbWUgPSBlcnJvcl9uYW1lc1tlcnJub3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiAobmFtZSk7Ci19Ci0KLS8qCi0KLU5BTUUKLQotCXN0cnRvZXJybm8gLS0gbWFwIGEgc3ltYm9saWMgZXJybm8gbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBzdHJ0b2Vycm5vIChjaGFyICpuYW1lKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gdGhlIHN5bWJvbGljIG5hbWUgb2YgYSBlcnJvciBudW1iZXIsIG1hcCBpdCB0byBhbiBlcnJubyB2YWx1ZS4KLQlJZiBubyB0cmFuc2xhdGlvbiBpcyBmb3VuZCwgcmV0dXJucyAwLgotCi0qLwotCi1pbnQKLXN0cnRvZXJybm8gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBlcnJub3ZhbCA9IDA7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLQl9Ci0gICAgICBmb3IgKGVycm5vdmFsID0gMDsgZXJybm92YWwgPCBudW1fZXJyb3JfbmFtZXM7IGVycm5vdmFsKyspCi0JewotCSAgaWYgKChlcnJvcl9uYW1lc1tlcnJub3ZhbF0gIT0gTlVMTCkgJiYKLQkgICAgICAoc3RyY21wIChuYW1lLCBlcnJvcl9uYW1lc1tlcnJub3ZhbF0pID09IDApKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZXJybm92YWwgPT0gbnVtX2Vycm9yX25hbWVzKQotCXsKLSNpZmRlZiBFVk1TRVJSCi0JICBpZiAoc3RyY21wIChuYW1lLCBldm1zZXJyLm5hbWUpID09IDApCi0JICAgIGVycm5vdmFsID0gZXZtc2Vyci52YWx1ZTsKLQkgIGVsc2UKLSNlbmRpZgotCSAgZXJybm92YWwgPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAoZXJybm92YWwpOwotfQotCi0KLS8qIEEgc2ltcGxlIGxpdHRsZSBtYWluIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCBwcmludCBhbGwgdGhlIGVycm5vIHRyYW5zbGF0aW9ucwotICAgaWYgTUFJTiBpcyBkZWZpbmVkIGFuZCB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZC4gKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgZXJybjsKLSAgaW50IGVycm5tYXg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgKm1zZzsKLSAgY2hhciAqc3RyZXJyb3IgKCk7Ci0KLSAgZXJybm1heCA9IGVycm5vX21heCAoKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBuYW1lcyB0YWJsZS5cbiIsIG51bV9lcnJvcl9uYW1lcyk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbWVzc2FnZXMgdGFibGUuXG4iLCBzeXNfbmVycik7Ci0gIHByaW50ZiAoIiVkIGlzIG1heCB1c2VmdWwgaW5kZXguXG4iLCBlcnJubWF4KTsKLQotICAvKiBLZWVwIHByaW50aW5nIHZhbHVlcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBvZiAqYm90aCogdGFibGVzLCBub3QKLSAgICAgKmVpdGhlciogdGFibGUuICBOb3RlIHRoYXQga25vd2luZyB0aGUgbWF4aW11bSB1c2VmdWwgaW5kZXggZG9lcyAqbm90KgotICAgICByZWxpZXZlIHVzIG9mIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0ZXN0aW5nIHRoZSByZXR1cm4gcG9pbnRlciBmb3IKLSAgICAgTlVMTC4gKi8KLQotICBmb3IgKGVycm4gPSAwOyBlcnJuIDw9IGVycm5tYXg7IGVycm4rKykKLSAgICB7Ci0gICAgICBuYW1lID0gc3RyZXJybm8gKGVycm4pOwotICAgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxOVUxMPiIgOiBuYW1lOwotICAgICAgbXNnID0gc3RyZXJyb3IgKGVycm4pOwotICAgICAgbXNnID0gKG1zZyA9PSBOVUxMKSA/ICI8TlVMTD4iIDogbXNnOwotICAgICAgcHJpbnRmICgiJS00ZCUtMThzJXNcbiIsIGVycm4sIG5hbWUsIG1zZyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJuY2FzZWNtcC5jIGIvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODVjYWMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg3IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBhbmQgdGhhdCBkdWUgY3JlZGl0IGlzIGdpdmVuCi0gKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LiBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQotICogbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRoaXMgc29mdHdhcmUKLSAqIGlzIHByb3ZpZGVkIGBgYXMgaXMnJyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqLwotCi0jaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCi1zdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpc3RyY2FzZWNtcC5jCTUuNSAoQmVya2VsZXkpIDExLzI0Lzg3IjsKLSNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGFycmF5IGlzIGRlc2lnbmVkIGZvciBtYXBwaW5nIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcgotICogdG9nZXRoZXIgZm9yIGEgY2FzZSBpbmRlcGVuZGVudCBjb21wYXJpc29uLiAgVGhlIG1hcHBpbmdzIGFyZQotICogYmFzZWQgdXBvbiBhc2NpaSBjaGFyYWN0ZXIgc2VxdWVuY2VzLgotICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBjaGFybWFwW10gPSB7Ci0JJ1wwMDAnLCAnXDAwMScsICdcMDAyJywgJ1wwMDMnLCAnXDAwNCcsICdcMDA1JywgJ1wwMDYnLCAnXDAwNycsCi0JJ1wwMTAnLCAnXDAxMScsICdcMDEyJywgJ1wwMTMnLCAnXDAxNCcsICdcMDE1JywgJ1wwMTYnLCAnXDAxNycsCi0JJ1wwMjAnLCAnXDAyMScsICdcMDIyJywgJ1wwMjMnLCAnXDAyNCcsICdcMDI1JywgJ1wwMjYnLCAnXDAyNycsCi0JJ1wwMzAnLCAnXDAzMScsICdcMDMyJywgJ1wwMzMnLCAnXDAzNCcsICdcMDM1JywgJ1wwMzYnLCAnXDAzNycsCi0JJ1wwNDAnLCAnXDA0MScsICdcMDQyJywgJ1wwNDMnLCAnXDA0NCcsICdcMDQ1JywgJ1wwNDYnLCAnXDA0NycsCi0JJ1wwNTAnLCAnXDA1MScsICdcMDUyJywgJ1wwNTMnLCAnXDA1NCcsICdcMDU1JywgJ1wwNTYnLCAnXDA1NycsCi0JJ1wwNjAnLCAnXDA2MScsICdcMDYyJywgJ1wwNjMnLCAnXDA2NCcsICdcMDY1JywgJ1wwNjYnLCAnXDA2NycsCi0JJ1wwNzAnLCAnXDA3MScsICdcMDcyJywgJ1wwNzMnLCAnXDA3NCcsICdcMDc1JywgJ1wwNzYnLCAnXDA3NycsCi0JJ1wxMDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxMzMnLCAnXDEzNCcsICdcMTM1JywgJ1wxMzYnLCAnXDEzNycsCi0JJ1wxNDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxNzMnLCAnXDE3NCcsICdcMTc1JywgJ1wxNzYnLCAnXDE3NycsCi0JJ1wyMDAnLCAnXDIwMScsICdcMjAyJywgJ1wyMDMnLCAnXDIwNCcsICdcMjA1JywgJ1wyMDYnLCAnXDIwNycsCi0JJ1wyMTAnLCAnXDIxMScsICdcMjEyJywgJ1wyMTMnLCAnXDIxNCcsICdcMjE1JywgJ1wyMTYnLCAnXDIxNycsCi0JJ1wyMjAnLCAnXDIyMScsICdcMjIyJywgJ1wyMjMnLCAnXDIyNCcsICdcMjI1JywgJ1wyMjYnLCAnXDIyNycsCi0JJ1wyMzAnLCAnXDIzMScsICdcMjMyJywgJ1wyMzMnLCAnXDIzNCcsICdcMjM1JywgJ1wyMzYnLCAnXDIzNycsCi0JJ1wyNDAnLCAnXDI0MScsICdcMjQyJywgJ1wyNDMnLCAnXDI0NCcsICdcMjQ1JywgJ1wyNDYnLCAnXDI0NycsCi0JJ1wyNTAnLCAnXDI1MScsICdcMjUyJywgJ1wyNTMnLCAnXDI1NCcsICdcMjU1JywgJ1wyNTYnLCAnXDI1NycsCi0JJ1wyNjAnLCAnXDI2MScsICdcMjYyJywgJ1wyNjMnLCAnXDI2NCcsICdcMjY1JywgJ1wyNjYnLCAnXDI2NycsCi0JJ1wyNzAnLCAnXDI3MScsICdcMjcyJywgJ1wyNzMnLCAnXDI3NCcsICdcMjc1JywgJ1wyNzYnLCAnXDI3NycsCi0JJ1wzMDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzMzMnLCAnXDMzNCcsICdcMzM1JywgJ1wzMzYnLCAnXDMzNycsCi0JJ1wzNDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzNzMnLCAnXDM3NCcsICdcMzc1JywgJ1wzNzYnLCAnXDM3NycsCi19OwotCi1pbnQKLXN0cm5jYXNlY21wKHMxLCBzMiwgbikKLQljb25zdCBjaGFyICpzMSwgKnMyOwotCXJlZ2lzdGVyIHNpemVfdCBuOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdTEsIHUyOwotCi0gICAgZm9yICg7IG4gIT0gMDsgLS1uKSB7Ci0JdTEgPSAodW5zaWduZWQgY2hhcikgKnMxKys7Ci0JdTIgPSAodW5zaWduZWQgY2hhcikgKnMyKys7Ci0JaWYgKGNoYXJtYXBbdTFdICE9IGNoYXJtYXBbdTJdKSB7Ci0JICAgIHJldHVybiBjaGFybWFwW3UxXSAtIGNoYXJtYXBbdTJdOwotCX0KLQlpZiAodTEgPT0gJ1wwJykgewotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnJjaHIuYyBiL2xpYmliZXJ0eS9zdHJyY2hyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDViY2IuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnJjaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RycmNocigpLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQlzdHJyY2hyIC0tIHJldHVybiBwb2ludGVyIHRvIGxhc3Qgb2NjdXJhbmNlIG9mIGEgY2hhcmFjdGVyCi0KLVNZTk9QU0lTCi0JY2hhciAqc3RycmNociAoY29uc3QgY2hhciAqcywgaW50IGMpCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIGNoYXJhY3RlciBDIGluCi0Jc3RyaW5nIFMsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vIG9jY3VyYW5jZSBpcyBmb3VuZC4KLQkKLUJVR1MKLQlCZWhhdmlvciB3aGVuIGNoYXJhY3RlciBpcyB0aGUgbnVsbCBjaGFyYWN0ZXIgaXMgaW1wbGVtZW50YXRpb24KLQlkZXBlbmRlbnQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotY2hhciAqCi1zdHJyY2hyIChzLCBjKQotICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgY2hhciAqcnRudmFsID0gMDsKLQotICBkbyB7Ci0gICAgaWYgKCpzID09IGMpCi0gICAgICBydG52YWwgPSAoY2hhciopIHM7Ci0gIH0gd2hpbGUgKCpzKyspOwotICByZXR1cm4gKHJ0bnZhbCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3Ryc2lnbmFsLmMgYi9saWJpYmVydHkvc3Ryc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmIxMGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnNpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qIEV4dGVuZGVkIHN1cHBvcnQgZm9yIHVzaW5nIHNpZ25hbCB2YWx1ZXMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaC4gIGZuZkBjeWdudXMuY29tCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBXZSBuZWVkIHRvIGRlY2xhcmUgc3lzX3NpZ2xpc3QsIGJlY2F1c2UgZXZlbiBpZiB0aGUgc3lzdGVtIHByb3ZpZGVzCi0gICBpdCB3ZSBjYW4ndCBhc3N1bWUgdGhhdCBpdCBpcyBkZWNsYXJlZCBpbiA8c2lnbmFsLmg+IChmb3IgZXhhbXBsZSwKLSAgIFN1bk9TIHByb3ZpZGVzIHN5c19zaWdsaXN0LCBidXQgaXQgZG9lcyBub3QgZGVjbGFyZSBpdCBpbiBhbnkKLSAgIGhlYWRlciBmaWxlKS4gIGZIb3dldmVyLCB3ZSBjYW4ndCBkZWNsYXJlIHN5c19zaWdsaXN0IHBvcnRhYmx5LAotICAgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgaXMgZGVjbGFyZWQgd2l0aCBjb25zdCBhbmQgb24gc29tZQotICAgc3lzdGVtcyBpdCBpcyBkZWNsYXJlZCB3aXRob3V0IGNvbnN0LiAgSWYgd2Ugd2VyZSB1c2luZyBhdXRvY29uZiwKLSAgIHdlIGNvdWxkIHdvcmsgb3V0IHRoZSByaWdodCBkZWNsYXJhdGlvbi4gIFVudGlsLCB0aGVuIHdlIGp1c3QKLSAgIGlnbm9yZSBhbnkgZGVjbGFyYXRpb24gaW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMsIGFuZCBhbHdheXMKLSAgIGRlY2xhcmUgaXQgb3Vyc2VsdmVzLiAgV2l0aCBsdWNrLCB0aGlzIHdpbGwgYWx3YXlzIHdvcmsuICAqLwotI2RlZmluZSBzeXNfc2lnbGlzdCBub19zdWNoX3N5bWJvbAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3Qgc2l6ZSk7CQkJCS8qIDQuMTAuMy4zICovCi1leHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOwkJCS8qIDQuMTEuNi4xICovCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqbWVtc2V0ICgpOwotI2VuZGlmCS8qIF9fU1REQ19fICovCi0KLS8qIFVuZGVmaW5lIHRoZSBtYWNybyB3ZSB1c2VkIHRvIGhpZGUgdGhlIGRlZmluaXRpb24gb2Ygc3lzX3NpZ2xpc3QKLSAgIGZvdW5kIGluIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBzeXNfc2lnbGlzdAotCi0jaWZuZGVmIE5VTEwKLSMgIGlmZGVmIF9fU1REQ19fCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE5VTEwgMAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgZGVmaW5lIE1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW5pdF9zaWduYWxfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIHNpZ25hbCB2YWx1ZXMuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIHRhYmxlIGlzIGdlbmVyYWxseSBvbmx5IGFjY2Vzc2VkIHdoZW4gaXQgaXMgdXNlZCBhdCBydW50aW1lCi0gICB0byBpbml0aWFsaXplIHNpZ25hbCBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcyB0aGF0IGFyZSBpbmRleGVkIGJ5IHNpZ25hbAotICAgdmFsdWUuCi0KLSAgIE5vdCBhbGwgb2YgdGhlc2Ugc2lnbmFscyB3aWxsIGV4aXN0IG9uIGFsbCBzeXN0ZW1zLiAgVGhpcyB0YWJsZSBpcyB0aGUgb25seQotICAgdGhpbmcgdGhhdCBzaG91bGQgaGF2ZSB0byBiZSB1cGRhdGVkIGFzIG5ldyBzaWduYWwgbnVtYmVycyBhcmUgaW50cm9kdWNlZC4KLSAgIEl0J3Mgc29ydCBvZiB1Z2x5LCBidXQgYXQgbGVhc3QgaXRzIHBvcnRhYmxlLiAqLwotCi1zdHJ1Y3Qgc2lnbmFsX2luZm8KLXsKLSAgaW50IHZhbHVlOwkJLyogVGhlIG51bWVyaWMgdmFsdWUgZnJvbSA8c2lnbmFsLmg+ICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7CS8qIFRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlICovCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLSAgY29uc3QgY2hhciAqbXNnOwkvKiBTaG9ydCBtZXNzYWdlIGFib3V0IHRoaXMgdmFsdWUgKi8KLSNlbmRpZgotfTsKLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZSwgbXNnfQotI2Vsc2UKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lnbmFsX2luZm8gc2lnbmFsX3RhYmxlW10gPQotewotI2lmIGRlZmluZWQgKFNJR0hVUCkKLSAgRU5UUlkoU0lHSFVQLCAiU0lHSFVQIiwgIkhhbmd1cCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHSU5UKQotICBFTlRSWShTSUdJTlQsICJTSUdJTlQiLCAiSW50ZXJydXB0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdRVUlUKQotICBFTlRSWShTSUdRVUlULCAiU0lHUVVJVCIsICJRdWl0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdJTEwpCi0gIEVOVFJZKFNJR0lMTCwgIlNJR0lMTCIsICJJbGxlZ2FsIGluc3RydWN0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUUkFQKQotICBFTlRSWShTSUdUUkFQLCAiU0lHVFJBUCIsICJUcmFjZS9icmVha3BvaW50IHRyYXAiKSwKLSNlbmRpZgotLyogUHV0IFNJR0lPVCBiZWZvcmUgU0lHQUJSVCwgc28gdGhhdCBpZiBTSUdJT1Q9PVNJR0FCUlQgdGhlbiBTSUdBQlJUCi0gICBvdmVycmlkZXMgU0lHSU9ULiAgU0lHQUJSVCBpcyBpbiBBTlNJIGFuZCBQT1NJWC4xLCBhbmQgU0lHSU9UIGlzbid0LiAqLwotI2lmIGRlZmluZWQgKFNJR0lPVCkKLSAgRU5UUlkoU0lHSU9ULCAiU0lHSU9UIiwgIklPVCB0cmFwIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdBQlJUKQotICBFTlRSWShTSUdBQlJULCAiU0lHQUJSVCIsICJBYm9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdFTVQpCi0gIEVOVFJZKFNJR0VNVCwgIlNJR0VNVCIsICJFbXVsYXRpb24gdHJhcCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHRlBFKQotICBFTlRSWShTSUdGUEUsICJTSUdGUEUiLCAiQXJpdGhtZXRpYyBleGNlcHRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0tJTEwpCi0gIEVOVFJZKFNJR0tJTEwsICJTSUdLSUxMIiwgIktpbGxlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQlVTKQotICBFTlRSWShTSUdCVVMsICJTSUdCVVMiLCAiQnVzIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTRUdWKQotICBFTlRSWShTSUdTRUdWLCAiU0lHU0VHViIsICJTZWdtZW50YXRpb24gZmF1bHQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NZUykKLSAgRU5UUlkoU0lHU1lTLCAiU0lHU1lTIiwgIkJhZCBzeXN0ZW0gY2FsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUElQRSkKLSAgRU5UUlkoU0lHUElQRSwgIlNJR1BJUEUiLCAiQnJva2VuIHBpcGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0FMUk0pCi0gIEVOVFJZKFNJR0FMUk0sICJTSUdBTFJNIiwgIkFsYXJtIGNsb2NrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdURVJNKQotICBFTlRSWShTSUdURVJNLCAiU0lHVEVSTSIsICJUZXJtaW5hdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdVU1IxKQotICBFTlRSWShTSUdVU1IxLCAiU0lHVVNSMSIsICJVc2VyIGRlZmluZWQgc2lnbmFsIDEiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1VTUjIpCi0gIEVOVFJZKFNJR1VTUjIsICJTSUdVU1IyIiwgIlVzZXIgZGVmaW5lZCBzaWduYWwgMiIpLAotI2VuZGlmCi0vKiBQdXQgU0lHQ0xEIGJlZm9yZSBTSUdDSExELCBzbyB0aGF0IGlmIFNJR0NMRD09U0lHQ0hMRCB0aGVuIFNJR0NITEQKLSAgIG92ZXJyaWRlcyBTSUdDTEQuICBTSUdDSExEIGlzIGluIFBPWElYLjEgKi8KLSNpZiBkZWZpbmVkIChTSUdDTEQpCi0gIEVOVFJZKFNJR0NMRCwgIlNJR0NMRCIsICJDaGlsZCBzdGF0dXMgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQ0hMRCkKLSAgRU5UUlkoU0lHQ0hMRCwgIlNJR0NITEQiLCAiQ2hpbGQgc3RhdHVzIGNoYW5nZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BXUikKLSAgRU5UUlkoU0lHUFdSLCAiU0lHUFdSIiwgIlBvd2VyIGZhaWwvcmVzdGFydCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHV0lOQ0gpCi0gIEVOVFJZKFNJR1dJTkNILCAiU0lHV0lOQ0giLCAiV2luZG93IHNpemUgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVVJHKQotICBFTlRSWShTSUdVUkcsICJTSUdVUkciLCAiVXJnZW50IEkvTyBjb25kaXRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0lPKQotICAvKiAiSS9PIHBlbmRpbmciIGhhcyBhbHNvIGJlZW4gc3VnZ2VzdGVkLCBidXQgaXMgbWlzbGVhZGluZyBzaW5jZSB0aGUKLSAgICAgc2lnbmFsIG9ubHkgaGFwcGVucyB3aGVuIHRoZSBwcm9jZXNzIGhhcyBhc2tlZCBmb3IgaXQsIG5vdCBldmVyeXRpbWUKLSAgICAgSS9PIGlzIHBlbmRpbmcuICovCi0gIEVOVFJZKFNJR0lPLCAiU0lHSU8iLCAiSS9PIHBvc3NpYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQT0xMKQotICBFTlRSWShTSUdQT0xMLCAiU0lHUE9MTCIsICJQb2xsYWJsZSBldmVudCBvY2N1cnJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU1RPUCkKLSAgRU5UUlkoU0lHU1RPUCwgIlNJR1NUT1AiLCAiU3RvcHBlZCAoc2lnbmFsKSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFNUUCkKLSAgRU5UUlkoU0lHVFNUUCwgIlNJR1RTVFAiLCAiU3RvcHBlZCAodXNlcikiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0NPTlQpCi0gIEVOVFJZKFNJR0NPTlQsICJTSUdDT05UIiwgIkNvbnRpbnVlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFRJTikKLSAgRU5UUlkoU0lHVFRJTiwgIlNJR1RUSU4iLCAiU3RvcHBlZCAodHR5IGlucHV0KSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFRPVSkKLSAgRU5UUlkoU0lHVFRPVSwgIlNJR1RUT1UiLCAiU3RvcHBlZCAodHR5IG91dHB1dCkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1ZUQUxSTSkKLSAgRU5UUlkoU0lHVlRBTFJNLCAiU0lHVlRBTFJNIiwgIlZpcnR1YWwgdGltZXIgZXhwaXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUFJPRikKLSAgRU5UUlkoU0lHUFJPRiwgIlNJR1BST0YiLCAiUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1hDUFUpCi0gIEVOVFJZKFNJR1hDUFUsICJTSUdYQ1BVIiwgIkNQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdYRlNaKQotICBFTlRSWShTSUdYRlNaLCAiU0lHWEZTWiIsICJGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1dJTkQpCi0gIEVOVFJZKFNJR1dJTkQsICJTSUdXSU5EIiwgIlNJR1dJTkQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BIT05FKQotICBFTlRSWShTSUdQSE9ORSwgIlNJR1BIT05FIiwgIlNJR1BIT05FIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdMT1NUKQotICBFTlRSWShTSUdMT1NULCAiU0lHTE9TVCIsICJSZXNvdXJjZSBsb3N0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdXQUlUSU5HKQotICBFTlRSWShTSUdXQUlUSU5HLCAiU0lHV0FJVElORyIsICJQcm9jZXNzJ3MgTFdQcyBhcmUgYmxvY2tlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHTFdQKQotICBFTlRSWShTSUdMV1AsICJTSUdMV1AiLCAiU2lnbmFsIExXUCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHREFOR0VSKQotICBFTlRSWShTSUdEQU5HRVIsICJTSUdEQU5HRVIiLCAiU3dhcCBzcGFjZSBkYW5nZXJvdXNseSBsb3ciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0dSQU5UKQotICBFTlRSWShTSUdHUkFOVCwgIlNJR0dSQU5UIiwgIk1vbml0b3IgbW9kZSBncmFudGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdSRVRSQUNUKQotICBFTlRSWShTSUdSRVRSQUNULCAiU0lHUkVUUkFDVCIsICJOZWVkIHRvIHJlbGluZ3Vpc2ggbW9uaXRvciBtb2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdNU0cpCi0gIEVOVFJZKFNJR01TRywgIlNJR01TRyIsICJNb25pdG9yIG1vZGUgZGF0YSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NPVU5EKQotICBFTlRSWShTSUdTT1VORCwgIlNJR1NPVU5EIiwgIlNvdW5kIGNvbXBsZXRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU0FLKQotICBFTlRSWShTSUdTQUssICJTSUdTQUsiLCAiU2VjdXJlIGF0dGVudGlvbiIpLAotI2VuZGlmCi0gIEVOVFJZKDAsIE5VTEwsIE5VTEwpCi19OwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUuICBJbmRleGVkIGJ5IHRoZQotICAgc2lnbmFsIHZhbHVlIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoqc2lnbmFsX25hbWVzOwotc3RhdGljIGludCBudW1fc2lnbmFsX25hbWVzID0gMDsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLCBpZiBpdCBkb2VzIG5vdAotICAgYWxyZWFkeSBleGlzdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4gIEluZGV4ZWQgYnkgdGhlIHNpZ25hbCB2YWx1ZSB0byBmaW5kCi0gICB0aGUgZGVzY3JpcHRpdmUgc3RyaW5nLgotCi0gICBXZSBkb24ndCBleHBvcnQgaXQgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaGFzIHRoZQotICAgc2FtZSBuYW1lLCBpdCBkaWZmZXJzIGZyb20gb3RoZXIgaW1wbGVtZW50YXRpb25zIGluIHRoYXQgaXQgaXMgZHluYW1pY2FsbHkKLSAgIGluaXRpYWxpemVkIHJhdGhlciB0aGFuIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi1zdGF0aWMgaW50IHN5c19uc2lnOwotc3RhdGljIGNvbnN0IGNoYXIgKipzeXNfc2lnbGlzdDsKLQotI2Vsc2UKLQotI2lmZGVmIE5TSUcKLXN0YXRpYyBpbnQgc3lzX25zaWcgPSBOU0lHOwotI2Vsc2UKLSNpZmRlZiBfTlNJRwotc3RhdGljIGludCBzeXNfbnNpZyA9IF9OU0lHOwotI2VuZGlmCi0jZW5kaWYKLWV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgc3lzX3NpZ2xpc3RbXTsKLQotI2VuZGlmCi0KLQotLyoKLQotTkFNRQotCi0JaW5pdF9zaWduYWxfdGFibGVzIC0tIGluaXRpYWxpemUgdGhlIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgdm9pZCBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlVc2luZyB0aGUgc2lnbmFsX3RhYmxlLCB3aGljaCBpcyBpbml0aWFsaXplZCBhdCBjb21waWxlIHRpbWUsIGdlbmVyYXRlCi0JdGhlIHNpZ25hbF9uYW1lcyBhbmQgdGhlIHN5c19zaWdsaXN0IChpZiBuZWVkZWQpIHRhYmxlcywgd2hpY2ggYXJlCi0JaW5kZXhlZCBhdCBydW50aW1lIGJ5IGEgc3BlY2lmaWMgc2lnbmFsIHZhbHVlLgotCi1CVUdTCi0KLQlUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlcyBtYXkgZmFpbCB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsCi0JaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgdXNlZnVsLCBidXQgd2UgZG9uJ3QKLQlib21iIGVpdGhlci4gIFdobyBrbm93cywgaXQgbWlnaHQgc3VjY2VlZCBhdCBhIGxhdGVyIHBvaW50IGlmIHdlIGZyZWUKLQlzb21lIG1lbW9yeSBpbiB0aGUgbWVhbnRpbWUuICBJbiBhbnkgY2FzZSwgdGhlIG90aGVyIHJvdXRpbmVzIGtub3cKLQlob3cgdG8gZGVhbCB3aXRoIGxhY2sgb2YgYSB0YWJsZSBhZnRlciB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoaXMKLQltYXkgb3IgbWF5IG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYnVnLCB0aGF0IHdlIGRvbid0IHNwZWNpZmljYWxseQotCXdhcm4gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGZhaWx1cmUgbW9kZS4KLQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfc2lnbmFsX3RhYmxlcyAoKQotewotICBjb25zdCBzdHJ1Y3Qgc2lnbmFsX2luZm8gKmVpcDsKLSAgaW50IG5ieXRlczsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgc2Nhbm5lZCB0aGUgc2lnbmFsX3RhYmxlIG9uY2UgdG8gZmluZCB0aGUgbWF4aW11bQotICAgICBzaWduYWwgdmFsdWUsIHRoZW4gZ28gZmluZCBpdCBub3cuICovCi0KLSAgaWYgKG51bV9zaWduYWxfbmFtZXMgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JewotCSAgaWYgKGVpcCAtPiB2YWx1ZSA+PSBudW1fc2lnbmFsX25hbWVzKQotCSAgICB7Ci0JICAgICAgbnVtX3NpZ25hbF9uYW1lcyA9IGVpcCAtPiB2YWx1ZSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzaWduYWxfbmFtZXMgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgc2lnbmFsX3RhYmxlLiAqLwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fc2lnbmFsX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChzaWduYWxfbmFtZXMgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc2lnbmFsX25hbWVzLCAwLCBuYnl0ZXMpOwotCSAgZm9yIChlaXAgPSBzaWduYWxfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc2lnbmFsX25hbWVzW2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbmFtZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzeXNfc2lnbGlzdCB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBzaWduYWxfdGFibGUuICovCi0KLSAgaWYgKHN5c19zaWdsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX3NpZ25hbF9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc3lzX3NpZ2xpc3QgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc3lzX3NpZ2xpc3QsIDAsIG5ieXRlcyk7Ci0JICBzeXNfbnNpZyA9IG51bV9zaWduYWxfbmFtZXM7Ci0JICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBzeXNfc2lnbGlzdFtlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG1zZzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotCi19Ci0KLQotLyoKLQotTkFNRQotCi0Jc2lnbm9fbWF4IC0tIHJldHVybiB0aGUgbWF4IHNpZ25vIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc2lnbm9fbWF4ICgpOwotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyB0aGUgbWF4aW11bSBzaWdubyB2YWx1ZSBmb3Igd2hpY2ggYSBjb3JyZXNwb25kaW5nIHN5bWJvbGljCi0JbmFtZSBvciBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSB3aGVyZQotCXdlIHVzZSB0aGUgc3lzX3NpZ2xpc3Qgc3VwcGxpZWQgYnkgdGhlIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgZm9yCi0JdGhlcmUgdG8gYmUgbW9yZSBzeW1ib2xpYyBuYW1lcyB0aGFuIG1lc3NhZ2VzLCBvciB2aWNlIHZlcnNhLgotCUluIGZhY3QsIHRoZSBtYW51YWwgcGFnZSBmb3IgcHNpZ25hbCgzYikgZXhwbGljaXRseSB3YXJucyB0aGF0IG9uZQotCXNob3VsZCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgKE5TSUcpIGJlZm9yZSBpbmRleGluZyBpdCwKLQlzaW5jZSBuZXcgc2lnbmFsIGNvZGVzIG1heSBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIGJlZm9yZSB0aGV5IGFyZQotCWFkZGVkIHRvIHRoZSB0YWJsZS4gIFRodXMgTlNJRyBtaWdodCBiZSBzbWFsbGVyIHRoYW4gdmFsdWUKLQlpbXBsaWVkIGJ5IHRoZSBsYXJnZXN0IHNpZ25vIHZhbHVlIGRlZmluZWQgaW4gPHNpZ25hbC5oPi4KLQotCVdlIHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhIG1lYW5pbmdmdWwKLQlzeW1ib2xpYyBuYW1lIG9yIG1lc3NhZ2UuCi0KLSovCi0KLWludAotc2lnbm9fbWF4ICgpCi17Ci0gIGludCBtYXhzaXplOwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotICBtYXhzaXplID0gTUFYIChzeXNfbnNpZywgbnVtX3NpZ25hbF9uYW1lcyk7Ci0gIHJldHVybiAobWF4c2l6ZSAtIDEpOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXN0cnNpZ25hbCAtLSBtYXAgYSBzaWduYWwgbnVtYmVyIHRvIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJzaWduYWwgKGludCBzaWdubykKLQotREVTQ1JJUFRJT04KLQotCU1hcHMgYW4gc2lnbmFsIG51bWJlciB0byBhbiBzaWduYWwgbWVzc2FnZSBzdHJpbmcsIHRoZSBjb250ZW50cyBvZgotCXdoaWNoIGFyZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgT24gc3lzdGVtcyB3aGljaCBoYXZlIHRoZSBleHRlcm5hbAotCXZhcmlhYmxlIHN5c19zaWdsaXN0LCB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIG9uZXMgdXNlZAotCWJ5IHBzaWduYWwoKS4KLQotCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcwotCWZvciB0aGUgc3lzX3NpZ2xpc3QsIGJ1dCBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQlzaWduYWwgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiU2lnbmFsIE5VTSIsIHdoZXJlIE5VTSBpcyB0aGUKLQlzaWduYWwgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byBzeXNfc2lnbGlzdCwKLQlyZXR1cm5zIE5VTEwuCi0KLQlUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBvbmx5IHVudGlsIHRoZQotCW5leHQgY2FsbCB0byBzdHJzaWduYWwuCi0KLSovCi0KLSNpZm5kZWYgSEFWRV9TVFJTSUdOQUwKLQotY29uc3QgY2hhciAqCi1zdHJzaWduYWwgKHNpZ25vKQotICBpbnQgc2lnbm87Ci17Ci0gIGNvbnN0IGNoYXIgKm1zZzsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmICgoc2lnbm8gPCAwKSB8fCAoc2lnbm8gPj0gc3lzX25zaWcpKQotICAgIHsKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeXNfc2lnbGlzdCA9PSBOVUxMKSB8fCAoc3lzX3NpZ2xpc3Rbc2lnbm9dID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc3lzX3NpZ2xpc3Qgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZ25vKTsKLSAgICAgIG1zZyA9IChjb25zdCBjaGFyICopIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbWVzc2FnZS4gIEp1c3QgcmV0dXJuIHRoZSBtZXNzYWdlLiAqLwotICAgICAgbXNnID0gKGNvbnN0IGNoYXIgKikgc3lzX3NpZ2xpc3Rbc2lnbm9dOwotICAgIH0KLSAgCi0gIHJldHVybiAobXNnKTsKLX0KLQotI2VuZGlmIC8qICEgSEFWRV9TVFJTSUdOQUwgKi8KLQotLyoKLQotTkFNRQotCi0Jc3Ryc2lnbm8gLS0gbWFwIGFuIHNpZ25hbCBudW1iZXIgdG8gYSBzeW1ib2xpYyBuYW1lIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY29uc3QgY2hhciAqc3Ryc2lnbm8gKGludCBzaWdubykKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIGFuIHNpZ25hbCBudW1iZXIsIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcKLQl0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGF0IHNpZ25hbCBudW1iZXIsIGFzIGZvdW5kIGluIDxzaWduYWwuaD4uCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3Igc3ltYm9saWMgbmFtZXMsIGJ1dCBubyBuYW1lIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQlzaWduYWwgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiU2lnbmFsIE5VTSIsIHdoZXJlIE5VTSBpcwotCXRoZSBzaWduYWwgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdmFsaWQKLQlpbmRpY2VzLCB0aGVuIHJldHVybnMgTlVMTC4KLQotQlVHUwotCi0JVGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKLQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHN0cnNpZ25vLgotCi0qLwotCi1jb25zdCBjaGFyICoKLXN0cnNpZ25vIChzaWdubykKLSAgaW50IHNpZ25vOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotCi0gIGlmICgoc2lnbm8gPCAwKSB8fCAoc2lnbm8gPj0gbnVtX3NpZ25hbF9uYW1lcykpCi0gICAgewotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBuYW1lID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzaWduYWxfbmFtZXMgPT0gTlVMTCkgfHwgKHNpZ25hbF9uYW1lc1tzaWdub10gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzaWduYWxfbmFtZXMgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZ25vKTsKLSAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG5hbWUuICBKdXN0IHJldHVybiB0aGUgbmFtZS4gKi8KLSAgICAgIG5hbWUgPSBzaWduYWxfbmFtZXNbc2lnbm9dOwotICAgIH0KLQotICByZXR1cm4gKG5hbWUpOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXN0cnRvc2lnbm8gLS0gbWFwIGEgc3ltYm9saWMgc2lnbmFsIG5hbWUgdG8gYSBudW1lcmljIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc3RydG9zaWdubyAoY2hhciAqbmFtZSkKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIHRoZSBzeW1ib2xpYyBuYW1lIG9mIGEgc2lnbmFsLCBtYXAgaXQgdG8gYSBzaWduYWwgbnVtYmVyLgotCUlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCByZXR1cm5zIDAuCi0KLSovCi0KLWludAotc3RydG9zaWdubyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IHNpZ25vID0gMDsKLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0JfQotICAgICAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDwgbnVtX3NpZ25hbF9uYW1lczsgc2lnbm8rKykKLQl7Ci0JICBpZiAoKHNpZ25hbF9uYW1lc1tzaWdub10gIT0gTlVMTCkgJiYKLQkgICAgICAoc3RyY21wIChuYW1lLCBzaWduYWxfbmFtZXNbc2lnbm9dKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNpZ25vID09IG51bV9zaWduYWxfbmFtZXMpCi0JewotCSAgc2lnbm8gPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAoc2lnbm8pOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXBzaWduYWwgLS0gcHJpbnQgbWVzc2FnZSBhYm91dCBzaWduYWwgdG8gc3RkZXJyCi0KLVNZTk9QU0lTCi0KLQl2b2lkIHBzaWduYWwgKHVuc2lnbmVkIHNpZ25vLCBjaGFyICptZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciB0aGUgbWVzc2FnZSwgZm9sbG93ZWQgYnkgYSBjb2xvbiwKLQlmb2xsb3dlZCBieSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNpZ25hbCBzcGVjaWZpZWQgYnkgc2lnbm8sCi0JZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgotKi8KLQotI2lmbmRlZiBIQVZFX1BTSUdOQUwKLQotdm9pZAotcHNpZ25hbCAoc2lnbm8sIG1lc3NhZ2UpCi0gIHVuc2lnbmVkIHNpZ25vOwotICBjaGFyICptZXNzYWdlOwotewotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotICAgIH0KLSAgaWYgKChzaWdubyA8PSAwKSB8fCAoc2lnbm8gPj0gc3lzX25zaWcpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmtub3duIHNpZ25hbFxuIiwgbWVzc2FnZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBzeXNfc2lnbGlzdFtzaWdub10pOwotICAgIH0KLX0KLQotI2VuZGlmCS8qICEgSEFWRV9QU0lHTkFMICovCi0KLQotLyogQSBzaW1wbGUgbGl0dGxlIG1haW4gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHByaW50IGFsbCB0aGUgc2lnbmFsIHRyYW5zbGF0aW9ucwotICAgaWYgTUFJTiBpcyBkZWZpbmVkIGFuZCB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZC4gKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgc2lnbm87Ci0gIGludCBtYXhzaWdubzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqbXNnOwotCi0gIG1heHNpZ25vID0gc2lnbm9fbWF4ICgpOwotICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG5hbWVzIHRhYmxlLlxuIiwgbnVtX3NpZ25hbF9uYW1lcyk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbWVzc2FnZXMgdGFibGUuXG4iLCBzeXNfbnNpZyk7Ci0gIHByaW50ZiAoIiVkIGlzIG1heCB1c2VmdWwgaW5kZXguXG4iLCBtYXhzaWdubyk7Ci0KLSAgLyogS2VlcCBwcmludGluZyB2YWx1ZXMgdW50aWwgd2UgZ2V0IHRvIHRoZSBlbmQgb2YgKmJvdGgqIHRhYmxlcywgbm90Ci0gICAgICplaXRoZXIqIHRhYmxlLiAgTm90ZSB0aGF0IGtub3dpbmcgdGhlIG1heGltdW0gdXNlZnVsIGluZGV4IGRvZXMgKm5vdCoKLSAgICAgcmVsaWV2ZSB1cyBvZiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGVzdGluZyB0aGUgcmV0dXJuIHBvaW50ZXIgZm9yCi0gICAgIE5VTEwuICovCi0KLSAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDw9IG1heHNpZ25vOyBzaWdubysrKQotICAgIHsKLSAgICAgIG5hbWUgPSBzdHJzaWdubyAoc2lnbm8pOwotICAgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxOVUxMPiIgOiBuYW1lOwotICAgICAgbXNnID0gc3Ryc2lnbmFsIChzaWdubyk7Ci0gICAgICBtc2cgPSAobXNnID09IE5VTEwpID8gIjxOVUxMPiIgOiBtc2c7Ci0gICAgICBwcmludGYgKCIlLTRkJS0xOHMlc1xuIiwgc2lnbm8sIG5hbWUsIG1zZyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJzdHIuYyBiL2xpYmliZXJ0eS9zdHJzdHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiMzZlMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3Ryc3RyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Ygc3Ryc3RyIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLQotTkFNRQotCi0Jc3Ryc3RyIC0tIGxvY2F0ZSBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBzdWJzdHJpbmcKLQotU1lOT1BTSVMKLQotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCWNoYXIgKnN0cnN0ciAoY2hhciAqczEsIGNoYXIgKnMyKQotCi1ERVNDUklQVElPTgotCi0JTG9jYXRlcyB0aGUgZmlyc3Qgb2NjdXJhbmNlIGluIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTMSBvZgotCXRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTMi4gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdWJzdHJpbmcKLQlmb3VuZCwgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm90IGZvdW5kLiAgSWYgUzIgcG9pbnRzIHRvIGEgc3RyaW5nCi0Jd2l0aCB6ZXJvIGxlbmd0aCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgUzEuCi0JCi1CVUdTCi0KLSovCi0KLQotLyogRklYTUU6ICBUaGUgYWJvdmUgZGVzY3JpcHRpb24gaXMgQU5TSSBjb21waWxpYW50LiAgVGhpcyByb3V0aW5lIGhhcyBub3QKLSAgIGJlZW4gdmFsaWRhdGVkIHRvIGNvbXBseSB3aXRoIGl0LiAgLWZuZiAqLwotCi1jaGFyICoKLXN0cnN0ciAoczEsIHMyKQotICBjaGFyICpzMSwgKnMyOwotewotICByZWdpc3RlciBjaGFyICpwID0gczE7Ci0gIGV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci0gIGV4dGVybiBpbnQgc3RybmNtcCAoKTsKLSNpZiBfX0dOVUNfXz09MgotICBleHRlcm4gX19TSVpFX1RZUEVfXyBzdHJsZW4gKCk7Ci0jZW5kaWYKLSAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAoczIpOwotCi0gIGZvciAoOyAocCA9IHN0cmNociAocCwgKnMyKSkgIT0gMDsgcCsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChwLCBzMiwgbGVuKSA9PSAwKQotCXsKLQkgIHJldHVybiAocCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJ0b2QuYyBiL2xpYmliZXJ0eS9zdHJ0b2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2YzczZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RydG9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2Ygc3RydG9kIGZvciBzeXN0ZW1zIHdpdGggYXRvZi4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1leHRlcm4gZG91YmxlIGF0b2YgKCk7Ci0KLS8qIERpc2NsYWltZXI6IHRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCBieSBDSElMTCBpbiBHREIgYW5kIHRoZXJlZm9yZQotICAgaGFzIG5vdCBiZWVuIHRlc3RlZCB3ZWxsLiAgSXQgbWF5IGhhdmUgYmVlbiB0ZXN0ZWQgZm9yIG5vdGhpbmcgZXhjZXB0Ci0gICB0aGF0IGl0IGNvbXBpbGVzLiAgKi8KLQotZG91YmxlCi1zdHJ0b2QgKHN0ciwgcHRyKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGNoYXIgKipwdHI7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKHB0ciA9PSAoY2hhciAqKikwKQotICAgIHJldHVybiBhdG9mIChzdHIpOwotICAKLSAgcCA9IHN0cjsKLSAgCi0gIHdoaWxlIChpc3NwYWNlICgqcCkpCi0gICAgKytwOwotICAKLSAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCi0gICAgKytwOwotCi0gIC8qIElORiBvciBJTkZJTklUWS4gICovCi0gIGlmICgocFswXSA9PSAnaScgfHwgcFswXSA9PSAnSScpCi0gICAgICAmJiAocFsxXSA9PSAnbicgfHwgcFsxXSA9PSAnTicpCi0gICAgICAmJiAocFsyXSA9PSAnZicgfHwgcFsyXSA9PSAnRicpKQotICAgIHsKLSAgICAgIGlmICgocFszXSA9PSAnaScgfHwgcFszXSA9PSAnSScpCi0JICAmJiAocFs0XSA9PSAnbicgfHwgcFs0XSA9PSAnTicpCi0JICAmJiAocFs1XSA9PSAnaScgfHwgcFs1XSA9PSAnSScpCi0JICAmJiAocFs2XSA9PSAndCcgfHwgcFs2XSA9PSAnVCcpCi0JICAmJiAocFs3XSA9PSAneScgfHwgcFs3XSA9PSAnWScpKQotCXsKLQkgICpwdHIgPSBwICsgNzsKLQkgIHJldHVybiBhdG9mIChzdHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcHRyID0gcCArIDM7Ci0JICByZXR1cm4gYXRvZiAoc3RyKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5BTiBvciBOQU4oZm9vKS4gICovCi0gIGlmICgocFswXSA9PSAnbicgfHwgcFswXSA9PSAnTicpCi0gICAgICAmJiAocFsxXSA9PSAnYScgfHwgcFsxXSA9PSAnQScpCi0gICAgICAmJiAocFsyXSA9PSAnbicgfHwgcFsyXSA9PSAnTicpKQotICAgIHsKLSAgICAgIHAgKz0gMzsKLSAgICAgIGlmICgqcCA9PSAnKCcpCi0JewotCSAgKytwOwotCSAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJyknKQotCSAgICArK3A7Ci0JICBpZiAoKnAgPT0gJyknKQotCSAgICArK3A7Ci0JfQotICAgICAgKnB0ciA9IHA7Ci0gICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLSAgICB9Ci0KLSAgLyogZGlnaXRzLCB3aXRoIDAgb3IgMSBwZXJpb2RzIGluIGl0LiAgKi8KLSAgaWYgKGlzZGlnaXQgKCpwKSB8fCAqcCA9PSAnLicpCi0gICAgewotICAgICAgaW50IGdvdF9kb3QgPSAwOwotICAgICAgd2hpbGUgKGlzZGlnaXQgKCpwKSB8fCAoIWdvdF9kb3QgJiYgKnAgPT0gJy4nKSkKLQl7Ci0JICBpZiAoKnAgPT0gJy4nKQotCSAgICBnb3RfZG90ID0gMTsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIC8qIEV4cG9uZW50LiAgKi8KLSAgICAgIGlmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKQotCXsKLQkgIGludCBpOwotCSAgaSA9IDE7Ci0JICBpZiAocFtpXSA9PSAnKycgfHwgcFtpXSA9PSAnLScpCi0JICAgICsraTsKLQkgIGlmIChpc2RpZ2l0IChwW2ldKSkKLQkgICAgewotCSAgICAgIHdoaWxlIChpc2RpZ2l0IChwW2ldKSkKLQkJKytpOwotCSAgICAgICpwdHIgPSBwICsgaTsKLQkgICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLQkgICAgfQotCX0KLSAgICAgICpwdHIgPSBwOwotICAgICAgcmV0dXJuIGF0b2YgKHN0cik7Ci0gICAgfQotICAvKiBEaWRuJ3QgZmluZCBhbnkgZGlnaXRzLiAgRG9lc24ndCBsb29rIGxpa2UgYSBudW1iZXIuICAqLwotICAqcHRyID0gc3RyOwotICByZXR1cm4gMC4wOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvbC5jIGIvbGliaWJlcnR5L3N0cnRvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2QxNzA2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJ0b2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgMAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogRklYTUU6IEl0J2QgYmUgbmljZSB0byBjb25maWd1cmUgYXJvdW5kIHRoZXNlLCBidXQgdGhlIGluY2x1ZGUgZmlsZXMgYXJlIHRvbwotICAgcGFpbmZ1bC4gIFRoZXNlIG1hY3JvcyBzaG91bGQgYXQgbGVhc3QgYmUgbW9yZSBwb3J0YWJsZSB0aGFuIGhhcmR3aXJlZCBoZXgKLSAgIGNvbnN0YW50cy4gKi8KLQotI2lmbmRlZiBVTE9OR19NQVgKLSNkZWZpbmUJVUxPTkdfTUFYCSgodW5zaWduZWQgbG9uZykofjBMKSkJCS8qIDB4RkZGRkZGRkYgKi8KLSNlbmRpZgotCi0jaWZuZGVmIExPTkdfTUFYCi0jZGVmaW5lCUxPTkdfTUFYCSgobG9uZykoVUxPTkdfTUFYID4+IDEpKQkvKiAweDdGRkZGRkZGICovCi0jZW5kaWYKLQotI2lmbmRlZiBMT05HX01JTgotI2RlZmluZQlMT05HX01JTgkoKGxvbmcpKH5MT05HX01BWCkpCQkvKiAweDgwMDAwMDAwICovCi0jZW5kaWYKLQotLyoKLSAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGludGVnZXIuCi0gKgotICogSWdub3JlcyBgbG9jYWxlJyBzdHVmZi4gIEFzc3VtZXMgdGhhdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UKLSAqIGFscGhhYmV0cyBhbmQgZGlnaXRzIGFyZSBlYWNoIGNvbnRpZ3VvdXMuCi0gKi8KLWxvbmcKLXN0cnRvbChucHRyLCBlbmRwdHIsIGJhc2UpCi0JY29uc3QgY2hhciAqbnB0cjsKLQljaGFyICoqZW5kcHRyOwotCXJlZ2lzdGVyIGludCBiYXNlOwotewotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBucHRyOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYWNjOwotCXJlZ2lzdGVyIGludCBjOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY3V0b2ZmOwotCXJlZ2lzdGVyIGludCBuZWcgPSAwLCBhbnksIGN1dGxpbTsKLQotCS8qCi0JICogU2tpcCB3aGl0ZSBzcGFjZSBhbmQgcGljayB1cCBsZWFkaW5nICsvLSBzaWduIGlmIGFueS4KLQkgKiBJZiBiYXNlIGlzIDAsIGFsbG93IDB4IGZvciBoZXggYW5kIDAgZm9yIG9jdGFsLCBlbHNlCi0JICogYXNzdW1lIGRlY2ltYWw7IGlmIGJhc2UgaXMgYWxyZWFkeSAxNiwgYWxsb3cgMHguCi0JICovCi0JZG8gewotCQljID0gKnMrKzsKLQl9IHdoaWxlIChpc3NwYWNlKGMpKTsKLQlpZiAoYyA9PSAnLScpIHsKLQkJbmVnID0gMTsKLQkJYyA9ICpzKys7Ci0JfSBlbHNlIGlmIChjID09ICcrJykKLQkJYyA9ICpzKys7Ci0JaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKLQkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpKSB7Ci0JCWMgPSBzWzFdOwotCQlzICs9IDI7Ci0JCWJhc2UgPSAxNjsKLQl9Ci0JaWYgKGJhc2UgPT0gMCkKLQkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOwotCi0JLyoKLQkgKiBDb21wdXRlIHRoZSBjdXRvZmYgdmFsdWUgYmV0d2VlbiBsZWdhbCBudW1iZXJzIGFuZCBpbGxlZ2FsCi0JICogbnVtYmVycy4gIFRoYXQgaXMgdGhlIGxhcmdlc3QgbGVnYWwgdmFsdWUsIGRpdmlkZWQgYnkgdGhlCi0JICogYmFzZS4gIEFuIGlucHV0IG51bWJlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlLCBpZgotCSAqIGZvbGxvd2VkIGJ5IGEgbGVnYWwgaW5wdXQgY2hhcmFjdGVyLCBpcyB0b28gYmlnLiAgT25lIHRoYXQKLQkgKiBpcyBlcXVhbCB0byB0aGlzIHZhbHVlIG1heSBiZSB2YWxpZCBvciBub3Q7IHRoZSBsaW1pdAotCSAqIGJldHdlZW4gdmFsaWQgYW5kIGludmFsaWQgbnVtYmVycyBpcyB0aGVuIGJhc2VkIG9uIHRoZSBsYXN0Ci0JICogZGlnaXQuICBGb3IgaW5zdGFuY2UsIGlmIHRoZSByYW5nZSBmb3IgbG9uZ3MgaXMKLQkgKiBbLTIxNDc0ODM2NDguLjIxNDc0ODM2NDddIGFuZCB0aGUgaW5wdXQgYmFzZSBpcyAxMCwKLQkgKiBjdXRvZmYgd2lsbCBiZSBzZXQgdG8gMjE0NzQ4MzY0IGFuZCBjdXRsaW0gdG8gZWl0aGVyCi0JICogNyAobmVnPT0wKSBvciA4IChuZWc9PTEpLCBtZWFuaW5nIHRoYXQgaWYgd2UgaGF2ZSBhY2N1bXVsYXRlZAotCSAqIGEgdmFsdWUgPiAyMTQ3NDgzNjQsIG9yIGVxdWFsIGJ1dCB0aGUgbmV4dCBkaWdpdCBpcyA+IDcgKG9yIDgpLAotCSAqIHRoZSBudW1iZXIgaXMgdG9vIGJpZywgYW5kIHdlIHdpbGwgcmV0dXJuIGEgcmFuZ2UgZXJyb3IuCi0JICoKLQkgKiBTZXQgYW55IGlmIGFueSBgZGlnaXRzJyBjb25zdW1lZDsgbWFrZSBpdCBuZWdhdGl2ZSB0byBpbmRpY2F0ZQotCSAqIG92ZXJmbG93LgotCSAqLwotCWN1dG9mZiA9IG5lZyA/IC0odW5zaWduZWQgbG9uZylMT05HX01JTiA6IExPTkdfTUFYOwotCWN1dGxpbSA9IGN1dG9mZiAlICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JY3V0b2ZmIC89ICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JZm9yIChhY2MgPSAwLCBhbnkgPSAwOzsgYyA9ICpzKyspIHsKLQkJaWYgKGlzZGlnaXQoYykpCi0JCQljIC09ICcwJzsKLQkJZWxzZSBpZiAoaXNhbHBoYShjKSkKLQkJCWMgLT0gaXN1cHBlcihjKSA/ICdBJyAtIDEwIDogJ2EnIC0gMTA7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCQlpZiAoYyA+PSBiYXNlKQotCQkJYnJlYWs7Ci0JCWlmIChhbnkgPCAwIHx8IGFjYyA+IGN1dG9mZiB8fCBhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pCi0JCQlhbnkgPSAtMTsKLQkJZWxzZSB7Ci0JCQlhbnkgPSAxOwotCQkJYWNjICo9IGJhc2U7Ci0JCQlhY2MgKz0gYzsKLQkJfQotCX0KLQlpZiAoYW55IDwgMCkgewotCQlhY2MgPSBuZWcgPyBMT05HX01JTiA6IExPTkdfTUFYOwotCQllcnJubyA9IEVSQU5HRTsKLQl9IGVsc2UgaWYgKG5lZykKLQkJYWNjID0gLWFjYzsKLQlpZiAoZW5kcHRyICE9IDApCi0JCSplbmRwdHIgPSAoY2hhciAqKSAoYW55ID8gcyAtIDEgOiBucHRyKTsKLQlyZXR1cm4gKGFjYyk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RydG91bC5jIGIvbGliaWJlcnR5L3N0cnRvdWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2ZjJkNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RydG91bC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgMAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2lmbmRlZiBVTE9OR19NQVgKLSNkZWZpbmUJVUxPTkdfTUFYCSgodW5zaWduZWQgbG9uZykofjBMKSkJCS8qIDB4RkZGRkZGRkYgKi8KLSNlbmRpZgotCi0vKgotICogQ29udmVydCBhIHN0cmluZyB0byBhbiB1bnNpZ25lZCBsb25nIGludGVnZXIuCi0gKgotICogSWdub3JlcyBgbG9jYWxlJyBzdHVmZi4gIEFzc3VtZXMgdGhhdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UKLSAqIGFscGhhYmV0cyBhbmQgZGlnaXRzIGFyZSBlYWNoIGNvbnRpZ3VvdXMuCi0gKi8KLXVuc2lnbmVkIGxvbmcKLXN0cnRvdWwobnB0ciwgZW5kcHRyLCBiYXNlKQotCWNvbnN0IGNoYXIgKm5wdHI7Ci0JY2hhciAqKmVuZHB0cjsKLQlyZWdpc3RlciBpbnQgYmFzZTsKLXsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpzID0gbnB0cjsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGFjYzsKLQlyZWdpc3RlciBpbnQgYzsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGN1dG9mZjsKLQlyZWdpc3RlciBpbnQgbmVnID0gMCwgYW55LCBjdXRsaW07Ci0KLQkvKgotCSAqIFNlZSBzdHJ0b2wgZm9yIGNvbW1lbnRzIGFzIHRvIHRoZSBsb2dpYyB1c2VkLgotCSAqLwotCWRvIHsKLQkJYyA9ICpzKys7Ci0JfSB3aGlsZSAoaXNzcGFjZShjKSk7Ci0JaWYgKGMgPT0gJy0nKSB7Ci0JCW5lZyA9IDE7Ci0JCWMgPSAqcysrOwotCX0gZWxzZSBpZiAoYyA9PSAnKycpCi0JCWMgPSAqcysrOwotCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCi0JICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSkgewotCQljID0gc1sxXTsKLQkJcyArPSAyOwotCQliYXNlID0gMTY7Ci0JfQotCWlmIChiYXNlID09IDApCi0JCWJhc2UgPSBjID09ICcwJyA/IDggOiAxMDsKLQljdXRvZmYgPSAodW5zaWduZWQgbG9uZylVTE9OR19NQVggLyAodW5zaWduZWQgbG9uZyliYXNlOwotCWN1dGxpbSA9ICh1bnNpZ25lZCBsb25nKVVMT05HX01BWCAlICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JZm9yIChhY2MgPSAwLCBhbnkgPSAwOzsgYyA9ICpzKyspIHsKLQkJaWYgKGlzZGlnaXQoYykpCi0JCQljIC09ICcwJzsKLQkJZWxzZSBpZiAoaXNhbHBoYShjKSkKLQkJCWMgLT0gaXN1cHBlcihjKSA/ICdBJyAtIDEwIDogJ2EnIC0gMTA7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCQlpZiAoYyA+PSBiYXNlKQotCQkJYnJlYWs7Ci0JCWlmIChhbnkgPCAwIHx8IGFjYyA+IGN1dG9mZiB8fCBhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pCi0JCQlhbnkgPSAtMTsKLQkJZWxzZSB7Ci0JCQlhbnkgPSAxOwotCQkJYWNjICo9IGJhc2U7Ci0JCQlhY2MgKz0gYzsKLQkJfQotCX0KLQlpZiAoYW55IDwgMCkgewotCQlhY2MgPSBVTE9OR19NQVg7Ci0JCWVycm5vID0gRVJBTkdFOwotCX0gZWxzZSBpZiAobmVnKQotCQlhY2MgPSAtYWNjOwotCWlmIChlbmRwdHIgIT0gMCkKLQkJKmVuZHB0ciA9IChjaGFyICopIChhbnkgPyBzIC0gMSA6IG5wdHIpOwotCXJldHVybiAoYWNjKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS90bXBuYW0uYyBiL2xpYmliZXJ0eS90bXBuYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2MTQ2Ny4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdG1wbmFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmbmRlZiBMX3RtcG5hbQotI2RlZmluZSBMX3RtcG5hbWUgMTAwCi0jZW5kaWYKLSNpZm5kZWYgUF90bXBkaXIKLSNkZWZpbmUgUF90bXBkaXIgIi91c3IvdG1wIgotI2VuZGlmCi0KLXN0YXRpYyBjaGFyIHRtcG5hbV9idWZmZXJbTF90bXBuYW1dOwotc3RhdGljIGludCB0bXBuYW1fY291bnRlcjsKLQotZXh0ZXJuIGludCBnZXRwaWQgKCk7Ci0KLWNoYXIgKgotdG1wbmFtIChzKQotICAgICBjaGFyICpzOwotewotICBpbnQgcGlkID0gZ2V0cGlkICgpOwotCi0gIGlmIChzID09IE5VTEwpCi0gICAgcyA9IHRtcG5hbV9idWZmZXI7Ci0KLSAgLyogIEdlbmVyYXRlIHRoZSBmaWxlbmFtZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3Qgb25lIGNhbGxlZAotICAgICAgaXQgYWxyZWFkeS4gICovCi0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgRklMRSAqZjsKLSAgICAgIHNwcmludGYgKHMsICIlcy8lcyV4LiV4IiwgUF90bXBkaXIsICJ0IiwgcGlkLCB0bXBuYW1fY291bnRlcik7Ci0gICAgICBmID0gZm9wZW4gKHMsICJyIik7Ci0gICAgICBpZiAoZiA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgdG1wbmFtX2NvdW50ZXIrKzsKLSAgICAgIGZjbG9zZSAoZik7Ci0gICAgfQotCi0gIHJldHVybiBzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Zhc3ByaW50Zi5jIGIvbGliaWJlcnR5L3Zhc3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWI4MGU2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92YXNwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKiBMaWtlIHZzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBURVNUCi1pbnQgZ2xvYmFsX3RvdGFsX3dpZHRoOwotI2VuZGlmCi0KLXVuc2lnbmVkIGxvbmcgc3RydG91bCAoKTsKLWNoYXIgKm1hbGxvYyAoKTsKLQotc3RhdGljIGludAotaW50X3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsIGFyZ3MpCi0gICAgIGNoYXIgKipyZXN1bHQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCAqYXJnczsKLXsKLSAgY29uc3QgY2hhciAqcCA9IGZvcm1hdDsKLSAgLyogQWRkIG9uZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBuZXZlciB6ZXJvLCB3aGljaCBtaWdodCBjYXVzZSBtYWxsb2MKLSAgICAgdG8gcmV0dXJuIE5VTEwuICAqLwotICBpbnQgdG90YWxfd2lkdGggPSBzdHJsZW4gKGZvcm1hdCkgKyAxOwotICB2YV9saXN0IGFwOwotCi0gIG1lbWNweSAoKFBUUikgJmFwLCAoUFRSKSBhcmdzLCBzaXplb2YgKHZhX2xpc3QpKTsKLQotICB3aGlsZSAoKnAgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoKnArKyA9PSAnJScpCi0JewotCSAgd2hpbGUgKHN0cmNociAoIi0rICMwIiwgKnApKQotCSAgICArK3A7Ci0JICBpZiAoKnAgPT0gJyonKQotCSAgICB7Ci0JICAgICAgKytwOwotCSAgICAgIHRvdGFsX3dpZHRoICs9IGFicyAodmFfYXJnIChhcCwgaW50KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgdG90YWxfd2lkdGggKz0gc3RydG91bCAocCwgJnAsIDEwKTsKLQkgIGlmICgqcCA9PSAnLicpCi0JICAgIHsKLQkgICAgICArK3A7Ci0JICAgICAgaWYgKCpwID09ICcqJykKLQkJewotCQkgICsrcDsKLQkJICB0b3RhbF93aWR0aCArPSBhYnMgKHZhX2FyZyAoYXAsIGludCkpOwotCQl9Ci0JICAgICAgZWxzZQotCSAgICAgIHRvdGFsX3dpZHRoICs9IHN0cnRvdWwgKHAsICZwLCAxMCk7Ci0JICAgIH0KLQkgIHdoaWxlIChzdHJjaHIgKCJobEwiLCAqcCkpCi0JICAgICsrcDsKLQkgIC8qIFNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciBhbnkgZm9ybWF0IHNwZWNpZmllciBleGNlcHQgJXMgYW5kIGZsb2F0cy4gICovCi0JICB0b3RhbF93aWR0aCArPSAzMDsKLQkgIHN3aXRjaCAoKnApCi0JICAgIHsKLQkgICAgY2FzZSAnZCc6Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdvJzoKLQkgICAgY2FzZSAndSc6Ci0JICAgIGNhc2UgJ3gnOgotCSAgICBjYXNlICdYJzoKLQkgICAgY2FzZSAnYyc6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGludCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICdlJzoKLQkgICAgY2FzZSAnRSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdHJzoKLQkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgZG91YmxlKTsKLQkgICAgICAvKiBTaW5jZSBhbiBpZWVlIGRvdWJsZSBjYW4gaGF2ZSBhbiBleHBvbmVudCBvZiAzMDcsIHdlJ2xsCi0JCSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gY292ZXIgdGhlIGdyb3NzIGNhc2UuICovCi0JICAgICAgdG90YWxfd2lkdGggKz0gMzA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdzJzoKLQkgICAgICB0b3RhbF93aWR0aCArPSBzdHJsZW4gKHZhX2FyZyAoYXAsIGNoYXIgKikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdwJzoKLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGNoYXIgKik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2lmZGVmIFRFU1QKLSAgZ2xvYmFsX3RvdGFsX3dpZHRoID0gdG90YWxfd2lkdGg7Ci0jZW5kaWYKLSAgKnJlc3VsdCA9IG1hbGxvYyAodG90YWxfd2lkdGgpOwotICBpZiAoKnJlc3VsdCAhPSBOVUxMKQotICAgIHJldHVybiB2c3ByaW50ZiAoKnJlc3VsdCwgZm9ybWF0LCAqYXJncyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci12YXNwcmludGYgKHJlc3VsdCwgZm9ybWF0LCBhcmdzKQotICAgICBjaGFyICoqcmVzdWx0OwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0jaWYgZGVmaW5lZCAoX0JTRF9WQV9MSVNUXykgJiYgZGVmaW5lZCAoX19GcmVlQlNEX18pCi0gICAgIF9CU0RfVkFfTElTVF8gYXJnczsKLSNlbHNlCi0gICAgIHZhX2xpc3QgYXJnczsKLSNlbmRpZgotewotICByZXR1cm4gaW50X3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsICZhcmdzKTsKLX0KLQotI2lmZGVmIFRFU1QKLXZvaWQKLWNoZWNraXQKLSNpZmRlZiBfX1NURENfXwotICAgICAoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pCi0jZWxzZQotICAgICAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciAqcmVzdWx0OwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0jZWxzZQotICBjaGFyICpmb3JtYXQ7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotI2VuZGlmCi0gIHZhc3ByaW50ZiAoJnJlc3VsdCwgZm9ybWF0LCBhcmdzKTsKLSAgaWYgKHN0cmxlbiAocmVzdWx0KSA8IGdsb2JhbF90b3RhbF93aWR0aCkKLSAgICBwcmludGYgKCJQQVNTOiAiKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIkZBSUw6ICIpOwotICBwcmludGYgKCIlZCAlc1xuIiwgZ2xvYmFsX3RvdGFsX3dpZHRoLCByZXN1bHQpOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgY2hlY2tpdCAoIiVkIiwgMHgxMjM0NTY3OCk7Ci0gIGNoZWNraXQgKCIlMjAwZCIsIDUpOwotICBjaGVja2l0ICgiJS4zMDBkIiwgNik7Ci0gIGNoZWNraXQgKCIlMTAwLjE1MGQiLCA3KTsKLSAgY2hlY2tpdCAoIiVzIiwgImpqampqampqamlpaWlpaWlpaWlpaWlpaW9vb29vb29vb29vb29vb29vcHBwcHBwcHBwcHBwYWFcblwKLTc3Nzc3Nzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzM2NjY2NjY2NjY2NjYyMjIyMjIyMjIyMjc3Nzc3Nzc3Nzc3NzczMzMzMyIpOwotICBjaGVja2l0ICgiJWYlcyVkJXMiLCAxLjAsICJmb28iLCA3NywgImFzZGpmZmZmZmZmZmZmZmZmZmlpaWlpaWlpaWlpeHh4eHgiKTsKLX0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmZvcmsuYyBiL2xpYmliZXJ0eS92Zm9yay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmM0NTkxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92Zm9yay5jCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBFbXVsYXRlIHZmb3JrIHVzaW5nIGp1c3QgcGxhaW4gZm9yaywgZm9yIHN5c3RlbXMgd2l0aG91dCBhIHJlYWwgdmZvcmsuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi1pbnQKLXZmb3JrICgpCi17Ci0gIHJldHVybiAoZm9yayAoKSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmZwcmludGYuYyBiL2xpYmliZXJ0eS92ZnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdiMmZmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92ZnByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogUHJvdmlkZSBhIHZlcnNpb24gdmZwcmludGYgaW4gdGVybXMgb2YgX2RvcHJudC4KLSAgIEJ5IEthdmVoIEdoYXppICAoZ2hhemlAY2FpcC5ydXRnZXJzLmVkdSkgIDMvMjkvOTgKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSN1bmRlZiB2ZnByaW50ZgotCi1pbnQKLXZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXApCi0gIEZJTEUgKiBzdHJlYW07Ci0gIGNvbnN0IGNoYXIgKiBmb3JtYXQ7Ci0gIHZhX2xpc3QgYXA7Ci17Ci0gIHJldHVybiBfZG9wcm50IChmb3JtYXQsIGFwLCBzdHJlYW0pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbSBiL2xpYmliZXJ0eS92bXNidWlsZC5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZWRlMzguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0kISBsaWJpYmVydHkvdm1zYnVpbGQuY29tIC0tIGJ1aWxkIGxpYmVydHkub2xiIGZvciBWTVMgaG9zdCwgVk1TIHRhcmdldAotJCEKLSQgQ0MJPSAiZ2NjIC9ub1ZlcmJvc2UvRGVidWcvSW5jbD0oW10sWy0uaW5jbHVkZV0pIgotJCBMSUJSCT0gImxpYnJhcnkgL09iaiIKLSQgTElOSwk9ICJsaW5rIgotJCBERUxFVEU9ICJkZWxldGUgL25vQ29uZmlybSIKLSQgU0VBUkNIPSAic2VhcmNoIC9FeGFjdCIKLSQgRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgotJCBBQk9SVAk9ICJleGl0ICV4MDAyQyIKLSQhCi0kIExJQl9OQU1FID0gImxpYmVydHkub2xiIgkhdGhpcyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIGNvbnN0cnVjdAotJCBXT1JLX0xJQiA9ICJuZXctbGliLm9sYiIJIXVzZWQgdG8gZ3VhcmQgYWdhaW5zdCBhbiBpbmNvbXBsZXRlIGJ1aWxkCi0kCi0kISBtYW51YWxseSBjb3BpZWQgZnJvbSBNYWtlZmlsZS5pbgotJCBSRVFVSVJFRF9PRklMRVMgPSAiYXJndi5vIGJhc2VuYW1lLm8gY2hvb3NlLXRlbXAubyBjb25jYXQubyBjcGx1cy1kZW0ubyAiLQotCSsgImZkbWF0Y2gubyBmbm1hdGNoLm8gZ2V0b3B0Lm8gZ2V0b3B0MS5vIGdldHJ1bnRpbWUubyBoZXgubyAiLQotCSsgImZsb2F0Zm9ybWF0Lm8gb2JqYWxsb2MubyBvYnN0YWNrLm8gc3BhY2VzLm8gc3RyZXJyb3IubyBzdHJzaWduYWwubyAiLQotCSsgInhhdGV4aXQubyB4ZXhpdC5vIHhtYWxsb2MubyB4c3RyZHVwLm8geHN0cmVycm9yLm8iCi0kISBhbnl0aGluZyBub3QgY2F1Z2h0IGJ5IGxpbmsrc2VhcmNoIG9mIGR1bW15Liogc2hvdWxkIGJlIGFkZGVkIGhlcmUKLSQgRVhUUkFfT0ZJTEVTID0gIiIKLSQhCi0kISBtb3ZlIHRvIHRoZSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhpcyBjb21tYW5kIHByb2NlZHVyZQotJCBvbGRfZGlyID0gZiRlbnZpcm9uKCJERUZBVUxUIikKLSQgbmV3X2RpciA9IGYkcGFyc2UoIl8uXzsiLGYkZW52aXJvbigiUFJPQ0VEVVJFIikpIC0gIl8uXzsiCi0kIHNldCBkZWZhdWx0ICduZXdfZGlyJwotJAotJCBFQ0hPICJTdGFydGluZyBsaWJpYmVydHkgYnVpbGQuLi4iCi0kIGNyZWF0ZSBjb25maWcuaAotLyogbGliaWJlcnR5IGNvbmZpZy5oIGZvciBWTVMgKi8KLSNkZWZpbmUgTkVFRF9zeXNfc2lnbGlzdAotI2RlZmluZSBORUVEX3N0cnNpZ25hbAotI2RlZmluZSBORUVEX3BzaWduYWwKLSNkZWZpbmUgTkVFRF9iYXNlbmFtZQotJCBMSUJSICdXT1JLX0xJQicgL0NyZWF0ZQotJAotJCEgZmlyc3QgcGFzczogY29tcGlsZSAicmVxdWlyZWQiIG1vZHVsZXMKLSQgb2ZpbGVzID0gUkVRVUlSRURfT0ZJTEVTICsgIiAiICsgRVhUUkFfT0ZJTEVTCi0kIHBhc3MgPSAxCi0kIGdvc3ViIGRvX29maWxlcwotJAotJCEgc2Vjb25kIHBhc3M6IHByb2Nlc3MgZHVtbXkuYywgdXNpbmcgdGhlIGZpcnN0IHBhc3MnIHJlc3VsdHMKLSQgRUNITyAiIG5vdyBjaGVja2luZyBydW4tdGltZSBsaWJyYXJ5IGZvciBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkiCi0kIGlmIGYkc2VhcmNoKCJkdW1teS5vYmoiKS5uZXMuIiIgdGhlbiAgREVMRVRFIGR1bW15Lm9iajsqCi0kIGRlZmluZS9ub0xvZyBzeXMkZXJyb3IgX05MOgkhY2FuJ3QgdXNlIC9Vc2VyX01vZGUgaGVyZSBkdWUgdG8gZ2NjCi0kIGRlZmluZS9ub0xvZyBzeXMkb3V0cHV0IF9OTDoJISBkcml2ZXIncyB1c2Ugb2YgbXVsdGlwbGUgaW1hZ2UgYWN0aXZhdGlvbgotJCBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCi0kICdDQycgZHVtbXkuYwotJCBkZWFzc2lnbiBzeXMkZXJyb3IgICAhcmVzdG9yZSwgbW9yZSBvciBsZXNzCi0kIGRlYXNzaWduIHN5cyRvdXRwdXQKLSQgaWYgZiRzZWFyY2goImR1bW15Lm9iaiIpLmVxcy4iIiB0aGVuICBnb3RvIHBhc3MyX2ZhaWx1cmUxCi0kISBsaW5rIGR1bW15Lm9iaiwgY2FwdHVyaW5nIGZ1bGwgbGlua2VyIGZlZWRiYWNrIGluIGR1bW15Lm1hcAotJCBvbGRtc2cgPSBmJGVudmlyb24oIk1FU1NBR0UiKQotJCBzZXQgbWVzc2FnZSAvRmFjaWxpdHkvU2V2ZXJpdHkvSWRlbnRpZmljYXRpb24vVGV4dAotJCBkZWZpbmUvVXNlciBzeXMkb3V0cHV0IF9OTDoKLSQgZGVmaW5lL1VzZXIgc3lzJGVycm9yIF9OTDoKLSQgTElOSy9NYXA9ZHVtbXkubWFwL25vRXhlIGR1bW15Lm9iaiwnV09SS19MSUInL0xpYnIsLQotCWdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvTGlicixzeXMkbGlicmFyeTp2YXhjcnRsLm9sYi9MaWJyCi0kIHNldCBtZXNzYWdlICdvbGRtc2cnCi0kIGlmIGYkc2VhcmNoKCJkdW1teS5tYXAiKS5lcXMuIiIgdGhlbiAgZ290byBwYXNzMl9mYWlsdXJlMgotJCBERUxFVEUgZHVtbXkub2JqOyoKLSQgU0VBUkNIIGR1bW15Lm1hcCAiJUxJTkstSS1VREZTWU0iIC9PdXRwdXQ9ZHVtbXkubGlzdAotJCBERUxFVEUgZHVtbXkubWFwOyoKLSQgRUNITyAiIGNoZWNrIGNvbXBsZXRlZCIKLSQhIHdlIG5vdyBoYXZlIGEgZmlsZSB3aXRoIG9uZSBlbnRyeSBwZXIgbGluZSBvZiB1bnJlc29sdmFibGUgc3ltYm9scwotJCBvZmlsZXMgPSAiIgotJCBpZiBmJHRybmxubSgiSUZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGlmaWxlJAotJAlvcGVuL1JlYWQgaWZpbGUkIGR1bW15Lmxpc3QKLSRpbG9vcDogcmVhZC9FbmQ9aWRvbmUgaWZpbGUkIGlsaW5lCi0kCWlsaW5lID0gZiRlZGl0KGlsaW5lLCJDT01QUkVTUyxUUklNLExPV0VSQ0FTRSIpCi0kCW9maWxlcyA9IG9maWxlcyArICIgIiArIGYkZWxlbWVudCgxLCIgIixpbGluZSkgKyAiLm8iCi0kCWdvdG8gaWxvb3AKLSRpZG9uZTogY2xvc2UgaWZpbGUkCi0kIERFTEVURSBkdW1teS5saXN0OyoKLSQgb24gZXJyb3IgdGhlbiBBQk9SVAotJAotJCEgdGhpcmQgcGFzczogY29tcGlsZSAibWlzc2luZyIgbW9kdWxlcyBjb2xsZWN0ZWQgaW4gcGFzcyAyCi0kIHBhc3MgPSAzCi0kIGdvc3ViIGRvX29maWxlcwotJAotJCEgZmluaXNoIHVwCi0kIExJQlIgJ1dPUktfTElCJyAvQ29tcHJlc3MgL091dHB1dD0nTElCX05BTUUnCSFuZXctbGliLm9sYiAtPiBsaWJlcnR5Lm9sYgotJCBERUxFVEUgJ1dPUktfTElCJzsqCi0kCi0kISBhbGwgZG9uZQotJCBFQ0hPICJDb21wbGV0ZWQgbGliaWJlcnR5IGJ1aWxkLiIKLSQgdHlwZSBzeXMkaW5wdXQ6Ci0KLSAgWW91IG1hbnkgd2lzaCB0byBkbwotICAkIENPUFkgTElCRVJUWS5PTEIgR05VX0NDOlswMDAwMDBdCi0gIHNvIHRoYXQgdGhpcyBydW4tdGltZSBsaWJyYXJ5IHJlc2lkZXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgZ2NjJ3MKLSAgc3VwcG9ydCBsaWJyYXJ5LiAgV2hlbiBidWlsZGluZyBnYXMsIGJlIHN1cmUgdG8gbGVhdmUgdGhlIG9yaWdpbmFsCi0gIGNvcHkgb2YgbGliZXJ0eS5vbGIgaGVyZSBzbyB0aGF0IGdhcydzIGJ1aWxkIHByb2NlZHVyZSBjYW4gZmluZCBpdC4KLQotJCBzZXQgZGVmYXVsdCAnb2xkX2RpcicKLSQgZXhpdAotJAotJCEKLSQhIGNvbXBpbGUgZWFjaCBlbGVtZW50IG9mIHRoZSBzcGFjZS1kZWxpbWl0ZWQgbGlzdCAnb2ZpbGVzJwotJCEKLSRkb19vZmlsZXM6Ci0kIG9maWxlcyA9IGYkZWRpdChvZmlsZXMsIkNPTVBSRVNTLFRSSU0iKQotJCBpID0gMAotJG9sb29wOgotJCBmID0gZiRlbGVtZW50KGksIiAiLG9maWxlcykKLSQgaWYgZi5lcXMuIiAiIHRoZW4gIGdvdG8gb2RvbmUKLSQgZiA9IGYgLSAiLm8iCSFzdHJpcCBkdW1teSBzdWZmaXgKLSQgRUNITyAiICAnJ2YnIgotJCBza2lwX2YgPSAwCi0kIGlmIHBhc3MuZXEuMyAuYW5kLiBmJHNlYXJjaCgiJydmJy5jIikuZXFzLiIiIHRoZW4gIGdvc3ViIGNoa19kZWZmdW5jCi0kIGlmIC5ub3Quc2tpcF9mCi0kIHRoZW4KLSQgICAnQ0MnICdmJy5jCi0kICAgTElCUiAnV09SS19MSUInICdmJy5vYmogL0luc2VydAotJCAgIERFTEVURSAnZicub2JqOyoKLSQgZW5kaWYKLSQgaSA9IGkgKyAxCi0kIGdvdG8gb2xvb3AKLSRvZG9uZToKLSQgcmV0dXJuCi0kCi0kIQotJCEgY2hlY2sgZnVuY3Rpb25zLmRlZiBmb3IgYSBERUZGVU5DKCkgZW50cnkgY29ycmVzcG9uZGluZyB0byBtaXNzaW5nIGZpbGUgJ2YnLmMKLSQhCi0kY2hrX2RlZmZ1bmM6Ci0kIGRlZmluZS9Vc2VyIHN5cyRvdXRwdXQgX05MOgotJCBkZWZpbmUvVXNlciBzeXMkZXJyb3IgX05MOgotJCBTRUFSQ0ggZnVuY3Rpb25zLmRlZiAiREVGRlVOQyIsIicnZiciIC9NYXRjaD1BTkQKLSQgaWYgKCgkc3RhdHVzLmFuZC4leDdGRkZGRkZGKSAuZXEuIDEpCi0kIHRoZW4KLSQgICBza2lwX2YgPSAxCi0kICAgb3Blbi9BcHBlbmQgY29uZmlnX2ggY29uZmlnLmgKLSQgICB3cml0ZSBjb25maWdfaCAiI2RlZmluZSBORUVEXycnZiciCi0kICAgY2xvc2UgY29uZmlnX2gKLSQgZW5kaWYKLSQgcmV0dXJuCi0kCi0kIQotJHBhc3MyX2ZhaWx1cmUxOgotJCEgaWYgd2UgcmVhY2ggaGVyZSwgZHVtbXkuYyBmYWlsZWQgdG8gY29tcGlsZSBhbmQgd2UncmUgcmVhbGx5IHN0dWNrCi0kIHR5cGUgc3lzJGlucHV0OgotCi0gIENhbm5vdCBjb21waWxlIHRoZSBsaWJyYXJ5IGNvbnRlbnRzIGNoZWNrZXIgKGR1bW15LmMgKyBmdW5jdGlvbnMuZGVmKSwKLSAgc28gY2Fubm90IGNvbnRpbnVlIQotCi0kISBhdHRlbXB0IHRoZSBjb21waWxlIGFnYWluLCB3aXRob3V0IHN1cHByZXNzaW5nIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhpcyB0aW1lCi0kIG9uIGVycm9yIHRoZW4gQUJPUlQgKzAqZiR2ZXJpZnkodikKLSQgdiA9IGYkdmVyaWZ5KDEpCi0kICdDQycgZHVtbXkuYwotJCBBQk9SVCArMCpmJHZlcmlmeSh2KQkhJ2YkdmVyaWZ5KDApJwotJCEKLSRwYXNzMl9mYWlsdXJlMjoKLSQhIHNob3VsZCBuZXZlciByZWFjaCBoZXJlLi4KLSQgdHlwZSBzeXMkaW5wdXQ6Ci0KLSAgQ2Fubm90IGxpbmsgdGhlIGxpYnJhcnkgY29udGVudHMgY2hlY2tlciAoZHVtbXkub2JqKSwgc28gY2Fubm90IGNvbnRpbnVlIQotCi0kISBhdHRlbXB0IHRoZSBsaW5rIGFnYWluLCB3aXRob3V0IHN1cHByZXNzaW5nIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhpcyB0aW1lCi0kIG9uIGVycm9yIHRoZW4gQUJPUlQgKzAqZiR2ZXJpZnkodikKLSQgdiA9IGYkdmVyaWZ5KDEpCi0kIExJTksvTWFwPWR1bW15Lm1hcC9ub0V4ZSBkdW1teS5vYmosJ1dPUktfTElCJy9MaWJyLC0KLQlnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL0xpYnIsc3lzJGxpYnJhcnk6dmF4Y3J0bC5vbGIvTGlicgotJCBBQk9SVCArMCpmJHZlcmlmeSh2KQkhJ2YkdmVyaWZ5KDApJwotJAotJCEgbm90IHJlYWNoZWQKLSQgZXhpdApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3ZwcmludGYuYyBiL2xpYmliZXJ0eS92cHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjQyNWEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3ZwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jdW5kZWYgdnByaW50ZgotaW50Ci12cHJpbnRmIChmb3JtYXQsIGFwKQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2xpc3QgYXA7Ci17Ci0gIHJldHVybiB2ZnByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFwKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92c3ByaW50Zi5jIGIvbGliaWJlcnR5L3ZzcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDc2MGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3ZzcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdnNwcmludGYgZm9yIHN5c3RlbXMgd2l0aG91dCBpdC4KLSAgIEhpZ2hseSBzeXN0ZW0tZGVwZW5kZW50LCBidXQgc2hvdWxkIHdvcmsgb24gbW9zdCAidHJhZGl0aW9uYWwiCi0gICBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RkaW87IG5ld2VyIG9uZXMgc2hvdWxkIGFscmVhZHkgaGF2ZSB2c3ByaW50Zi4KLSAgIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgb2YgQ3lnbnVzIFN1cHBvcnQuCi0gICBCYXNlZCBvbiBsaWJnKysncyAiZm9ybSIgKHdyaXR0ZW4gYnkgRG91ZyBMZWE7IGRsQHJvY2t5Lm9zd2Vnby5lZHUpLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQotc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCi1jb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQotdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gKi8KLQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jdW5kZWYgdnNwcmludGYKLQotaW50Ci12c3ByaW50ZiAoYnVmLCBmb3JtYXQsIGFwKQotICAgICBjaGFyICpidWY7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCBhcDsKLXsKLSAgRklMRSBiOwotICBpbnQgcmV0OwotI2lmZGVmIFZNUwotICBiLT5fZmxhZyA9IF9JT1dSVHxfSU9TVFJHOwotICBiLT5fcHRyID0gYnVmOwotICBiLT5fY250ID0gMTIwMDA7Ci0jZWxzZQotICBiLl9mbGFnID0gX0lPV1JUfF9JT1NUUkc7Ci0gIGIuX3B0ciA9IGJ1ZjsKLSAgYi5fY250ID0gMTIwMDA7Ci0jZW5kaWYKLSAgcmV0ID0gX2RvcHJudChmb3JtYXQsIGFwLCAmYik7Ci0gIHB1dGMoJ1wwJywgJmIpOwotICByZXR1cm4gcmV0OwotCi19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvd2FpdHBpZC5jIGIvbGliaWJlcnR5L3dhaXRwaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkYjBiOS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvd2FpdHBpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotaW50Ci13YWl0cGlkIChwaWQsIHN0YXRfbG9jLCBvcHRpb25zKQotCWludCBwaWQsICpzdGF0X2xvYywgb3B0aW9uczsKLXsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpbnQgd3BpZCA9IHdhaXQoc3RhdF9sb2MpOwotICAgICAgaWYgKHdwaWQgPT0gcGlkIHx8IHdwaWQgPT0gLTEpCi0JcmV0dXJuIHdwaWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hhdGV4aXQuYyBiL2xpYmliZXJ0eS94YXRleGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDc2YzIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hhdGV4aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiAlc2Njcy5pbmNsdWRlLnJlZGlzdC5jJQotICovCi0KLS8qIEFkYXB0ZWQgZnJvbSBuZXdsaWIvbGliYy9zdGRsaWIveyxhdH1leGl0LltjaF0uCi0gICBJZiB5b3UgdXNlIHhhdGV4aXQsIHlvdSBtdXN0IGNhbGwgeGV4aXQgaW5zdGVhZCBvZiBleGl0LiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGlzIG11c3QgYmUgZGVjbGFyZWQuICAqLwotUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotc3RhdGljIHZvaWQgeGF0ZXhpdF9jbGVhbnVwIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUG9pbnRlciB0byBmdW5jdGlvbiBydW4gYnkgeGV4aXQuICAqLwotZXh0ZXJuIHZvaWQgKCpfeGV4aXRfY2xlYW51cCkgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lCVhBVEVYSVRfU0laRSAzMgotCi1zdHJ1Y3QgeGF0ZXhpdCB7Ci0Jc3RydWN0CXhhdGV4aXQgKm5leHQ7CQkvKiBuZXh0IGluIGxpc3QgKi8KLQlpbnQJaW5kOwkJCS8qIG5leHQgaW5kZXggaW4gdGhpcyB0YWJsZSAqLwotCXZvaWQJKCpmbnNbWEFURVhJVF9TSVpFXSkgUEFSQU1TICgodm9pZCkpOwkvKiB0aGUgdGFibGUgaXRzZWxmICovCi19OwotCi0vKiBBbGxvY2F0ZSBvbmUgc3RydWN0IHN0YXRpY2FsbHkgdG8gZ3VhcmFudGVlIHRoYXQgd2UgY2FuIHJlZ2lzdGVyCi0gICBhdCBsZWFzdCBhIGZldyBoYW5kbGVycy4gICovCi1zdGF0aWMgc3RydWN0IHhhdGV4aXQgeGF0ZXhpdF9maXJzdDsKLQotLyogUG9pbnRzIHRvIGhlYWQgb2YgTElGTyBzdGFjay4gICovCi1zdGF0aWMgc3RydWN0IHhhdGV4aXQgKnhhdGV4aXRfaGVhZCA9ICZ4YXRleGl0X2ZpcnN0OwotCi0vKiBSZWdpc3RlciBmdW5jdGlvbiBGTiB0byBiZSBydW4gYnkgeGV4aXQuCi0gICBSZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QuICAqLwotCi1pbnQKLXhhdGV4aXQgKGZuKQotICAgICB2b2lkICgqZm4pIFBBUkFNUyAoKHZvaWQpKTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHhhdGV4aXQgKnA7Ci0KLSAgLyogVGVsbCB4ZXhpdCB0byBjYWxsIHhhdGV4aXRfY2xlYW51cC4gICovCi0gIGlmICghX3hleGl0X2NsZWFudXApCi0gICAgX3hleGl0X2NsZWFudXAgPSB4YXRleGl0X2NsZWFudXA7Ci0KLSAgcCA9IHhhdGV4aXRfaGVhZDsKLSAgaWYgKHAtPmluZCA+PSBYQVRFWElUX1NJWkUpCi0gICAgewotICAgICAgaWYgKChwID0gKHN0cnVjdCB4YXRleGl0ICopIG1hbGxvYyAoc2l6ZW9mICpwKSkgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgICBwLT5pbmQgPSAwOwotICAgICAgcC0+bmV4dCA9IHhhdGV4aXRfaGVhZDsKLSAgICAgIHhhdGV4aXRfaGVhZCA9IHA7Ci0gICAgfQotICBwLT5mbnNbcC0+aW5kKytdID0gZm47Ci0gIHJldHVybiAwOwotfQotCi0vKiBDYWxsIGFueSBjbGVhbnVwIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi14YXRleGl0X2NsZWFudXAgKCkKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHhhdGV4aXQgKnA7Ci0gIHJlZ2lzdGVyIGludCBuOwotCi0gIGZvciAocCA9IHhhdGV4aXRfaGVhZDsgcDsgcCA9IHAtPm5leHQpCi0gICAgZm9yIChuID0gcC0+aW5kOyAtLW4gPj0gMDspCi0gICAgICAoKnAtPmZuc1tuXSkgKCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveGV4aXQuYyBiL2xpYmliZXJ0eS94ZXhpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFiYmUwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94ZXhpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogeGV4aXQuYyAtLSBSdW4gYW55IGV4aXQgaGFuZGxlcnMsIHRoZW4gZXhpdC4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZQotdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IGJ5IHhhdGV4aXQgaWYgaXQgaXMgY2FsbGVkLiAgVGhpcyB3YXksIHhtYWxsb2MKLSAgIGRvZXNuJ3QgZHJhZyB4YXRleGl0IGludG8gdGhlIGxpbmsuICAqLwotdm9pZCAoKl94ZXhpdF9jbGVhbnVwKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLXhleGl0IChjb2RlKQotICAgICBpbnQgY29kZTsKLXsKLSAgaWYgKF94ZXhpdF9jbGVhbnVwICE9IE5VTEwpCi0gICAgKCpfeGV4aXRfY2xlYW51cCkgKCk7Ci0gIGV4aXQgKGNvZGUpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3htYWxsb2MuYyBiL2xpYmliZXJ0eS94bWFsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjVjNWEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3htYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKiBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB3aXRoIGVycm9yIGNoZWNraW5nLgotICAgQ29weXJpZ2h0IDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2RlZmluZSBwdHJkaWZmX3QgbG9uZwotI2VuZGlmCi0KLSNpZiBWTVMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jZWxzZQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGVzZSBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLVBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1QVFIgcmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotUFRSIGNhbGxvYyBQQVJBTVMgKChzaXplX3QsIHNpemVfdCkpOwotUFRSIHNicmsgUEFSQU1TICgocHRyZGlmZl90KSk7Ci0jZW5kaWYKLQotLyogVGhlIHByb2dyYW0gbmFtZSBpZiBzZXQuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKLQotI2lmZGVmIEhBVkVfU0JSSwotLyogVGhlIGluaXRpYWwgc2Jyaywgc2V0IHdoZW4gdGhlIHByb2dyYW0gbmFtZSBpcyBzZXQuIE5vdCB1c2VkIGZvciB3aW4zMgotICAgcG9ydHMgb3RoZXIgdGhhbiBjeWd3aW4zMi4gICovCi1zdGF0aWMgY2hhciAqZmlyc3RfYnJlYWsgPSBOVUxMOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotCi12b2lkCi14bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIG5hbWUgPSBzOwotI2lmZGVmIEhBVkVfU0JSSwotICAvKiBXaW4zMiBwb3J0cyBvdGhlciB0aGFuIGN5Z3dpbjMyIGRvbid0IGhhdmUgYnJrKCkgKi8KLSAgaWYgKGZpcnN0X2JyZWFrID09IE5VTEwpCi0gICAgZmlyc3RfYnJlYWsgPSAoY2hhciAqKSBzYnJrICgwKTsKLSNlbmRpZiAvKiBIQVZFX1NCUksgKi8KLX0KLQotUFRSCi14bWFsbG9jIChzaXplKQotICAgIHNpemVfdCBzaXplOwotewotICBQVFIgbmV3bWVtOwotCi0gIGlmIChzaXplID09IDApCi0gICAgc2l6ZSA9IDE7Ci0gIG5ld21lbSA9IG1hbGxvYyAoc2l6ZSk7Ci0gIGlmICghbmV3bWVtKQotICAgIHsKLSNpZmRlZiBIQVZFX1NCUksKLSAgICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKLSAgICAgIHNpemVfdCBhbGxvY2F0ZWQ7Ci0KLSAgICAgIGlmIChmaXJzdF9icmVhayAhPSBOVUxMKQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gZmlyc3RfYnJlYWs7Ci0gICAgICBlbHNlCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSAoY2hhciAqKSAmZW52aXJvbjsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgIlxuJXMlc0NhbiBub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUsICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UgLyogSEFWRV9TQlJLICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlc1xuIiwKLSAgICAgICAgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSNlbmRpZiAvKiBIQVZFX1NCUksgKi8KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybiAobmV3bWVtKTsKLX0KLQotUFRSCi14Y2FsbG9jIChuZWxlbSwgZWxzaXplKQotICBzaXplX3QgbmVsZW0sIGVsc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAobmVsZW0gPT0gMCB8fCBlbHNpemUgPT0gMCkKLSAgICBuZWxlbSA9IGVsc2l6ZSA9IDE7Ci0KLSAgbmV3bWVtID0gY2FsbG9jIChuZWxlbSwgZWxzaXplKTsKLSAgaWYgKCFuZXdtZW0pCi0gICAgewotI2lmZGVmIEhBVkVfU0JSSwotICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKLQotICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKLSAgICAgIGVsc2UKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXG4lcyVzQ2FuIG5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXMgYWZ0ZXIgYWxsb2NhdGluZyAlbHUgYnl0ZXNcbiIsCi0JICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgKG5lbGVtICogZWxzaXplKSwgKHVuc2lnbmVkIGxvbmcpIGFsbG9jYXRlZCk7Ci0jZWxzZSAvKiBIQVZFX1NCUksgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgICAgIlxuJXMlc0NhbiBub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChuZWxlbSAqIGVsc2l6ZSkpOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQotCi1QVFIKLXhyZWFsbG9jIChvbGRtZW0sIHNpemUpCi0gICAgUFRSIG9sZG1lbTsKLSAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHNpemUgPSAxOwotICBpZiAoIW9sZG1lbSkKLSAgICBuZXdtZW0gPSBtYWxsb2MgKHNpemUpOwotICBlbHNlCi0gICAgbmV3bWVtID0gcmVhbGxvYyAob2xkbWVtLCBzaXplKTsKLSAgaWYgKCFuZXdtZW0pCi0gICAgewotI2lmZGVmIEhBVkVfU0JSSwotICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKLQotICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKLSAgICAgIGVsc2UKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXG4lcyVzQ2FuIG5vdCByZWFsbG9jYXRlICVsdSBieXRlcyBhZnRlciBhbGxvY2F0aW5nICVsdSBieXRlc1xuIiwKLQkgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplLCAodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkKTsKLSNlbHNlIC8qIEhBVkVfU0JSSyAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotICAgICAgICAgICAgICAiXG4lcyVzQ2FuIG5vdCByZWFsbG9jYXRlICVsdSBieXRlc1xuIiwKLSAgICAgICAgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSNlbmRpZiAvKiBIQVZFX1NCUksgKi8KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybiAobmV3bWVtKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94c3RyZHVwLmMgYi9saWJpYmVydHkveHN0cmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZhYmEwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94c3RyZHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiB4c3RyZHVwLmMgLS0gRHVwbGljYXRlIGEgc3RyaW5nIGluIG1lbW9yeSwgdXNpbmcgeG1hbGxvYy4KLSAgIFRoaXMgdHJpdmlhbCBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBEZWNlbWJlciAxOTk1LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLWNoYXIgKgoteHN0cmR1cCAocykKLSAgY29uc3QgY2hhciAqczsKLXsKLSAgcmVnaXN0ZXIgc2l6ZV90IGxlbiA9IHN0cmxlbiAocykgKyAxOwotICByZWdpc3RlciBjaGFyICpyZXQgPSB4bWFsbG9jIChsZW4pOwotICBtZW1jcHkgKHJldCwgcywgbGVuKTsKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94c3RyZXJyb3IuYyBiL2xpYmliZXJ0eS94c3RyZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwYjY1My4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveHN0cmVycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiB4c3RyZXJyb3IuYyAtLSBqYWNrZXQgcm91dGluZSBmb3IgbW9yZSByb2J1c3Qgc3RyZXJyb3IoKSB1c2FnZS4KLSAgIEZyaSBKdW4gMTYgMTg6MzA6MDAgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0gICBUaGlzIGNvZGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgVk1TCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAhZGVmaW5lZCAoX19TVFJJQ1RfQU5TSV9fKSAmJiAhZGVmaW5lZCAoX19ISURFX0ZPUkJJRERFTl9OQU1FUykKLWV4dGVybiBjaGFyICpzdHJlcnJvciBQQVJBTVMgKChpbnQsLi4uKSk7Ci0jZGVmaW5lIERPTlRfREVDTEFSRV9TVFJFUlJPUgotI2VuZGlmCi0jZW5kaWYJLyogVk1TICovCi0KLSNpZm5kZWYgRE9OVF9ERUNMQVJFX1NUUkVSUk9SCi1leHRlcm4gY2hhciAqc3RyZXJyb3IgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotLyogSWYgc3RyZXJyb3IgcmV0dXJucyBOVUxMLCB3ZSdsbCBmb3JtYXQgdGhlIG51bWJlciBpbnRvIGEgc3RhdGljIGJ1ZmZlci4gICovCi0KLSNkZWZpbmUgRVJSU1RSX0ZNVCAidW5kb2N1bWVudGVkIGVycm9yICMlZCIKLXN0YXRpYyBjaGFyIHhzdHJlcnJvcl9idWZbc2l6ZW9mIEVSUlNUUl9GTVQgKyAyMF07Ci0KLS8qIExpa2Ugc3RyZXJyb3IsIGJ1dCByZXN1bHQgaXMgbmV2ZXIgYSBudWxsIHBvaW50ZXIuICAqLwotCi1jaGFyICoKLXhzdHJlcnJvciAoZXJybnVtKQotICAgICBpbnQgZXJybnVtOwotewotICBjaGFyICplcnJzdHI7Ci0jaWZkZWYgVk1TCi0gIGNoYXIgKigqdm1zbGliX3N0cmVycm9yKSBQQVJBTVMgKChpbnQsLi4uKSk7Ci0KLSAgLyogT3ZlcnJpZGUgYW55IHBvc3NpYmx5LWNvbmZsaWN0aW5nIGRlY2xhcmF0aW9uIGZyb20gc3lzdGVtIGhlYWRlci4gICovCi0gIHZtc2xpYl9zdHJlcnJvciA9IChjaGFyICooKikgUEFSQU1TICgoaW50LC4uLikpKSBzdHJlcnJvcjsKLSAgLyogU2Vjb25kIGFyZ3VtZW50IG1hdHRlcnMgaWZmIGZpcnN0IGlzIEVWTVNFUlIsIGJ1dCBpdCdzIHNpbXBsZXIgdG8KLSAgICAgcGFzcyBpdCB1bmNvbmRpdGlvbmFsbHkuICBgdmF4YyRlcnJubycgaXMgZGVjbGFyZWQgaW4gPGVycm5vLmg+Ci0gICAgIGFuZCBtYWludGFpbmVkIGJ5IHRoZSBydW4tdGltZSBsaWJyYXJ5IGluIHBhcmFsbGVsIHRvIGBlcnJubycuCi0gICAgIFdlIGFzc3VtZSB0aGF0IGBlcnJudW0nIGNvcnJlc3BvbmRzIHRvIHRoZSBsYXN0IHZhbHVlIGFzc2lnbmVkIHRvCi0gICAgIGVycm5vIGJ5IHRoZSBydW4tdGltZSBsaWJyYXJ5LCBoZW5jZSB2YXhjJGVycm5vIHdpbGwgYmUgcmVsZXZhbnQuICAqLwotICBlcnJzdHIgPSAoKnZtc2xpYl9zdHJlcnJvcikgKGVycm51bSwgdmF4YyRlcnJubyk7Ci0jZWxzZQotICBlcnJzdHIgPSBzdHJlcnJvciAoZXJybnVtKTsKLSNlbmRpZgotCi0gIC8qIElmIGBlcnJudW0nIGlzIG91dCBvZiByYW5nZSwgcmVzdWx0IG1pZ2h0IGJlIE5VTEwuICBXZSdsbCBmaXggdGhhdC4gICovCi0gIGlmICghZXJyc3RyKQotICAgIHsKLSAgICAgIHNwcmludGYgKHhzdHJlcnJvcl9idWYsIEVSUlNUUl9GTVQsIGVycm51bSk7Ci0gICAgICBlcnJzdHIgPSB4c3RyZXJyb3JfYnVmOwotICAgIH0KLSAgcmV0dXJuIGVycnN0cjsKLX0KZGlmZiAtLWdpdCBhL2x0Y29uZmlnIGIvbHRjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMzA0ZmQuLjAwMDAwMDAKLS0tIGEvbHRjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyODIyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBsdGNvbmZpZyAtIENyZWF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBBIGxvdCBvZiB0aGlzIHNjcmlwdCBpcyB0YWtlbiBmcm9tIGF1dG9jb25mLTIuMTAuCi0KLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1lY2hvPWVjaG8KLWlmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0IDAKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgIiRTSEVMTCIgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLSMgRmluZCB0aGUgY29ycmVjdCBQQVRIIHNlcGFyYXRvci4gIFVzdWFsbHkgdGhpcyBpcyBgOicsIGJ1dAotIyBESkdQUCB1c2VzIGA7JyBsaWtlIERPUy4KLWlmIHRlc3QgIlgke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9ICJYc2V0IjsgdGhlbgotICBVTkFNRT0ke1VOQU1FLWB1bmFtZSAyPi9kZXYvbnVsbGB9Ci0gIGNhc2UgWCRVTkFNRSBpbgotICAgICotRE9TKSBQQVRIX1NFUEFSQVRPUj0nOycgOzsKLSAgICAqKSAgICAgUEFUSF9TRVBBUkFUT1I9JzonIDs7Ci0gIGVzYWMKLWZpCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICIke0NEUEFUSCtzZXR9IiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQotCi1pZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9ICJYc2V0IjsgdGhlbgotICAjIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKLSAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDJxICIkMCInICdlY2hvIHRlc3QnOyBkbwotICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCi0gICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIikgMj4vZGV2L251bGwgJiYKLSAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIgJiYKLSAgICAgICAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1pZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiICE9ICdYXHQnIHx8Ci0gICB0ZXN0ICJYYCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiICE9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQotICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCi0gICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCi0gICMKLSAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgotCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbwotICAgIGlmIHRlc3QgLWYgJGRpci9lY2hvICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgIGVjaG89IiRkaXIvZWNobyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KLSAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KLSAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICB0ZXN0ICJYYChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCi0gICAgICBlY2hvPSdwcmludCAtcicKLSAgICBlbGlmIHRlc3QgLWYgL2Jpbi9rc2ggJiYgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgotICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgbHRjb25maWcgYWdhaW4gd2l0aCBpdC4KLSAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0iJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0iCi0gICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0gICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKLSAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci0gICAgZWxzZQotICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgotICAgICAgZWNobz0ncHJpbnRmICIlc1xuIicKLSAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSB0ZXN0ICJYYCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkjIENvb2wsIHByaW50ZiB3b3JrcwotCToKLSAgICAgIGVsaWYgdGVzdCAiWGAoIiRPUklHSU5BTF9DT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSAgIHRlc3QgIlhgKCIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQlDT05GSUdfU0hFTEw9IiRPUklHSU5BTF9DT05GSUdfU0hFTEwiCi0JZXhwb3J0IENPTkZJR19TSEVMTAotCVNIRUxMPSIkQ09ORklHX1NIRUxMIgotCWV4cG9ydCBTSEVMTAotCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxpZiB0ZXN0ICJYYCgiJENPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JICAgdGVzdCAiWGAoIiRDT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxzZQotCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCi0JcHJldj06Ci0KLQlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCA1MHEgIiQwIic7IGRvCi0JICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbDsgdGhlbgotCSAgICBicmVhawotCSAgZmkKLQkgIHByZXY9IiRjbWQiCi0JZG9uZQotCi0JaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICIkMCInOyB0aGVuCi0JICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAotCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKLQkgIGV4ZWMgIiR7T1JJR0lOQUxfQ09ORklHX1NIRUxMfSIgIiQwIiAkezErIiRAIn0KLQllbHNlCi0JICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgotCSAgZWNobz1lY2hvCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWZpCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYCRcXFxcXVwpL1xcXDEvZycKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1kb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCi0jIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCi1kZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJwotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KLXByb2duYW1lPWAkZWNobyAiWCQwIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSMgQ29uc3RhbnRzOgotUFJPR1JBTT1sdGNvbmZpZwotUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTEuMmYKLVRJTUVTVEFNUD0iICgxLjM4NSAxOTk5LzAzLzE1IDE3OjI0OjU0KSIKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LmMgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LmMgJExJQlMgMT4mNScKLXJtPSJybSAtZiIKLQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1kZWZhdWx0X29maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi1lbmFibGVfc2hhcmVkPXllcwotIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZy4KLWVuYWJsZV9zdGF0aWM9eWVzCi1lbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZW5hYmxlX2Rsb3Blbj11bmtub3duCi1sdG1haW49Ci1zaWxlbnQ9Ci1zcmNkaXI9Ci1hY19jb25maWdfZ3Vlc3M9Ci1hY19jb25maWdfc3ViPQotaG9zdD0KLW5vbm9wdD0KLW9maWxlPSIkZGVmYXVsdF9vZmlsZSIKLXZlcmlmeV9ob3N0PXllcwotd2l0aF9nY2M9bm8KLXdpdGhfZ251X2xkPW5vCi1uZWVkX2xvY2tzPXllcwotYWNfZXh0PWMKLW9iamV4dD1vCi1saWJleHQ9YQotY2FjaGVfZmlsZT0KLQotb2xkX0FSPSIkQVIiCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi1vbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLW9sZF9MRD0iJExEIgotb2xkX0xOX1M9IiRMTl9TIgotb2xkX05NPSIkTk0iCi1vbGRfUkFOTElCPSIkUkFOTElCIgotb2xkX0RMTFRPT0w9IiRETExUT09MIgotb2xkX0FTPSIkQVMiCi0KLSMgUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotYXJncz0KLXByZXY9Ci1mb3Igb3B0aW9uCi1kbwotICBjYXNlICIkb3B0aW9uIiBpbgotICAtKj0qKSBvcHRhcmc9YGVjaG8gIiRvcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGV2YWwgIiRwcmV2PVwkb3B0aW9uIgotICAgIHByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkb3B0aW9uIiBpbgotICAtLWhlbHApIGNhdCA8PEVPTQotVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiBbSE9TVCBbTFRNQUlOXV0KLQotR2VuZXJhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbCBzY3JpcHQuCi0KLSAgICAtLWRlYnVnICAgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLSAgICAtLWRpc2FibGUtc2hhcmVkICAgICAgIGRvIG5vdCBidWlsZCBzaGFyZWQgbGlicmFyaWVzCi0gICAgLS1kaXNhYmxlLXN0YXRpYyAgICAgICBkbyBub3QgYnVpbGQgc3RhdGljIGxpYnJhcmllcwotICAgIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgZG8gbm90IG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbgotICAgIC0tZW5hYmxlLWRsb3BlbiAgICAgICAgZW5hYmxlIGRsb3BlbiBzdXBwb3J0Ci0gICAgLS1lbmFibGUtZGxvcGVuLXNlbGYgICBlbmFibGUgc3VwcG9ydCBmb3IgZGxvcGVuaW5nIHByb2dyYW1zCi0gICAgLS1oZWxwICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAgIC0tbm8tdmVyaWZ5ICAgICAgICAgICAgZG8gbm90IHZlcmlmeSB0aGF0IEhPU1QgaXMgYSB2YWxpZCBob3N0IHR5cGUKLS1vLCAtLW91dHB1dD1GSUxFICAgICAgICAgIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIFtkZWZhdWx0PSRkZWZhdWx0X29maWxlXQotICAgIC0tcXVpZXQgICAgICAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JwotICAgIC0tc2lsZW50ICAgICAgICAgICAgICAgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSAgICAtLXNyY2Rpcj1ESVIgICAgICAgICAgIGZpbmQgXGBjb25maWcuZ3Vlc3MnIGluIERJUgotICAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgICAtLXdpdGgtZ2NjICAgICAgICAgICAgIGFzc3VtZSB0aGF0IHRoZSBHTlUgQyBjb21waWxlciB3aWxsIGJlIHVzZWQKLSAgICAtLXdpdGgtZ251LWxkICAgICAgICAgIGFzc3VtZSB0aGF0IHRoZSBDIGNvbXBpbGVyIHVzZXMgdGhlIEdOVSBsaW5rZXIKLSAgICAtLWRpc2FibGUtbG9jayAgICAgICAgIGRpc2FibGUgZmlsZSBsb2NraW5nCi0gICAgLS1jYWNoZS1maWxlPUZJTEUgICAgICBjb25maWd1cmUgY2FjaGUgZmlsZQotCi1MVE1BSU4gaXMgdGhlIFxgbHRtYWluLnNoJyBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgb3IgXGBsdG1haW4uYycgcHJvZ3JhbQotdGhhdCBwcm92aWRlcyBiYXNpYyBsaWJ0b29sIGZ1bmN0aW9uYWxpdHkuCi0KLUhPU1QgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHN5c3RlbSBuYW1lIFtkZWZhdWx0PWd1ZXNzZWRdLgotRU9NCi0gIGV4aXQgMAotICA7OwotCi0gIC0tZGVidWcpCi0gICAgZWNobyAiJHByb2duYW1lOiBlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgotICAgIHNldCAteAotICAgIDs7Ci0KLSAgLS1kaXNhYmxlLXNoYXJlZCkgZW5hYmxlX3NoYXJlZD1ubyA7OwotCi0gIC0tZGlzYWJsZS1zdGF0aWMpIGVuYWJsZV9zdGF0aWM9bm8gOzsKLQotICAtLWRpc2FibGUtZmFzdC1pbnN0YWxsKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0KLSAgLS1lbmFibGUtZGxvcGVuKSBlbmFibGVfZGxvcGVuPXllcyA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkgc2lsZW50PXllcyA7OwotCi0gIC0tc3JjZGlyKSBwcmV2PXNyY2RpciA7OwotICAtLXNyY2Rpcj0qKSBzcmNkaXI9IiRvcHRhcmciIDs7Ci0KLSAgLS1uby12ZXJpZnkpIHZlcmlmeV9ob3N0PW5vIDs7Ci0KLSAgLS1vdXRwdXQgfCAtbykgcHJldj1vZmlsZSA7OwotICAtLW91dHB1dD0qKSBvZmlsZT0iJG9wdGFyZyIgOzsKLQotICAtLXZlcnNpb24pIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCI7IGV4aXQgMCA7OwotCi0gIC0td2l0aC1nY2MpIHdpdGhfZ2NjPXllcyA7OwotICAtLXdpdGgtZ251LWxkKSB3aXRoX2dudV9sZD15ZXMgOzsKLQotICAtLWRpc2FibGUtbG9jaykgbmVlZF9sb2Nrcz1ubyA7OwotCi0gIC0tY2FjaGUtZmlsZT0qKSBjYWNoZV9maWxlPSIkb3B0YXJnIiA7OwotCi0gIC0qKQotICAgIGVjaG8gIiRwcm9nbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHRpb24nIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KLSAgICAgIGx0bWFpbj0iJG9wdGlvbiIKLSAgICBlbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgotIyBUaGlzIGdlbmVyYXRlcyBhbiB1bm5lY2Vzc2FyeSB3YXJuaW5nIGZvciBzcGFyYy1zdW4tc29sYXJpczQuMS4zX1UxCi0jICAgICAgaWYgdGVzdCAtbiAiYGVjaG8gJG9wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSMgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZyBcYCRvcHRpb24nIGlzIG5vdCBhIHZhbGlkIGhvc3QgdHlwZSIgMT4mMgotIyAgICAgIGZpCi0gICAgICBob3N0PSIkb3B0aW9uIgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogdG9vIG1hbnkgYXJndW1lbnRzIiAxPiYyCi0gICAgICBlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBMVE1BSU4gZmlsZSIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgISAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiBcYCRsdG1haW4nIGRvZXMgbm90IGV4aXN0IiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBRdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotbHRjb25maWdfYXJncz0KLWZvciBhcmcKLWRvCi0gIGNhc2UgIiRhcmciIGluCi0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICckYXJnJyIgOzsKLSAgKikgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJGFyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIEEgcmVsZXZhbnQgc3Vic2V0IG9mIEFDX0lOSVQuCi0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCi0jIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAotIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLQotaWYgdGVzdCAtbiAiJGNhY2hlX2ZpbGUiICYmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIHdpdGhpbiBsdGNvbmZpZyIKLSAgLiAkY2FjaGVfZmlsZQotZmkKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgIyBBc3N1bWUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgb25lIGFzIHRoZSBwYXRoIHRvIExUTUFJTi4KLSAgc3JjZGlyPWAkZWNobyAiWCRsdG1haW4iIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgdGVzdCAiJHNyY2RpciIgPSAiJGx0bWFpbiIgJiYgc3JjZGlyPS4KLWZpCi0KLXRyYXAgIiRybSBjb25mdGVzdCo7IGV4aXQgMSIgMSAyIDE1Ci1pZiB0ZXN0ICIkdmVyaWZ5X2hvc3QiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgZm9yIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1Yi4KLSAgYWNfYXV4X2Rpcj0KLSAgZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvY29uZmlnLmd1ZXNzOyB0aGVuCi0gICAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBmaW5kIGNvbmZpZy5ndWVzcyBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0gIGFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLSAgYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi0KLSAgIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkU0hFTEwgJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLQotICBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLQotICBob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRob3N0X2FsaWFzIiBpbgotICAiIikKLSAgICBpZiBob3N0X2FsaWFzPWAkU0hFTEwgJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi0gIGhvc3Q9YCRTSEVMTCAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLSAgZWNobyAiJGFjX3QkaG9zdCIgMT4mNgotCi0gICMgTWFrZSBzdXJlIHRoZSBob3N0IHZlcmlmaWVkLgotICB0ZXN0IC16ICIkaG9zdCIgJiYgZXhpdCAxCi0KLWVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGhvc3QgdHlwZSBpZiB5b3UgdXNlIFxgLS1uby12ZXJpZnknIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZWxzZQotICBob3N0X2FsaWFzPSRob3N0Ci1maQotCi0jIFRyYW5zZm9ybSBsaW51eCogdG8gKi0qLWxpbnV4LWdudSosIHRvIHN1cHBvcnQgb2xkIGNvbmZpZ3VyZSBzY3JpcHRzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1saW51eC1nbnUqKSA7OwotbGludXgqKSBob3N0PWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qLS4qLWxpbnV4XClcKC4qXCkkL1wxLWdudVwyLydgCi1lc2FjCi0KLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0gICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLSAgaWYgdGVzdCAiJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IHNldDsgdGhlbgotICAgIENPTExFQ1RfTkFNRVM9Ci0gICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCi1vbGRfYXJjaGl2ZV9jbWRzPSckQVIgY3J1ICRvbGRsaWIkb2xkb2JqcycKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9Ci0KLSMgU2V0IGEgc2FuZSBkZWZhdWx0IGZvciBgQVInLgotdGVzdCAteiAiJEFSIiAmJiBBUj1hcgotCi0jIElmIFJBTkxJQiBpcyBub3Qgc2V0LCB0aGVuIHJ1biB0aGUgdGVzdC4KLWlmIHRlc3QgIiR7UkFOTElCK3NldH0iICE9ICJzZXQiOyB0aGVuCi0gIHJlc3VsdD1ubwotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByYW5saWIuLi4gJGFjX2MiIDE+JjYKLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvcmFubGliOyB0aGVuCi0gICAgICBSQU5MSUI9InJhbmxpYiIKLSAgICAgIHJlc3VsdD0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGVjaG8gIiRhY190JHJlc3VsdCIgMT4mNgotZmkKLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi0gIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSJcJFJBTkxJQiBcJG9sZGxpYn4kb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCi1maQotCi0jIFNldCBzYW5lIGRlZmF1bHRzIGZvciBgRExMVE9PTCcgYW5kIGBBUycsIHVzZWQgb24gY3lnd2luLgotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgdXNpbmcgR0NDLgotaWYgdGVzdCAiJHdpdGhfZ2NjIiAhPSB5ZXMgfHwgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIElmIENDIGlzIG5vdCBzZXQsIHRoZW4gdHJ5IHRvIGZpbmQgR0NDIG9yIGEgdXNhYmxlIENDLgotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdjYy4uLiAkYWNfYyIgMT4mNgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0JQ0M9ImdjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICBmaQotICBmaQotCi0gICMgTm90ICJnY2MiLCBzbyB0cnkgImNjIiwgcmVqZWN0aW5nICIvdXNyL3VjYi9jYyIuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2MuLi4gJGFjX2MiIDE+JjYKLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBjY19yZWplY3RlZD1ubwotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2NjOyB0aGVuCi0JaWYgdGVzdCAiJGRpci9jYyIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0JICBjY19yZWplY3RlZD15ZXMKLQkgIGNvbnRpbnVlCi0JZmkKLQlDQz0iY2MiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGlmIHRlc3QgJGNjX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICAgICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gICAgICBzZXQgZHVtbXkgJENDCi0gICAgICBzaGlmdAotICAgICAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotCSMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotCSMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIG5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotCSMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIG5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0Jc2hpZnQKLQlzZXQgZHVtbXkgIiRkaXIvY2MiICIkQCIKLQlzaGlmdAotCUNDPSIkQCIKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190JENDIiAxPiY2Ci0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZmkKLQotICAjIE5vdyBzZWUgaWYgdGhlIGNvbXBpbGVyIGlzIHJlYWxseSBHQ0MuCi0gIHdpdGhfZ2NjPW5vCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDLi4uICRhY19jIiAxPiY2Ci0gIGVjaG8gIiRwcm9nbmFtZTo1NjQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLQotICAkcm0gY29uZnRlc3QuYwotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLSAgaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gJHByb2duYW1lOjU3MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgd2l0aF9nY2M9eWVzCi0gIGZpCi0gICRybSBjb25mdGVzdC5jCi0gIGVjaG8gIiRhY190JHdpdGhfZ2NjIiAxPiY2Ci1maQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotc2V0IGR1bW15ICRDQwotY29tcGlsZXI9IiQyIgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeC4uLiAkYWNfYyIgMT4mNgotJHJtIGNvbmZ0ZXN0KgotZWNobyAnaW50IGkgPSAxOycgPiBjb25mdGVzdC5jCi1lY2hvICIkcHJvZ25hbWU6NTg2OiBjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeCIgPiYgNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1ODc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9OyB0aGVuCi0gICMgQXBwZW5kIGFueSB3YXJuaW5ncyB0byB0aGUgY29uZmlnLmxvZy4KLSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0KLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICBjYXNlICRhY19maWxlIGluCi0gICAgKi5jKSA7OwotICAgICopIG9iamV4dD1gZWNobyAkYWNfZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Li8vYCA7OwotICAgIGVzYWMKLSAgZG9uZQotZWxzZQotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotJHJtIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3Qkb2JqZXh0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRhY19jIiAxPiY2Ci1waWNfZmxhZz0KLXNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0KLXdsPQotbGlua19zdGF0aWNfZmxhZz0KLW5vX2J1aWx0aW5fZmxhZz0KLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICB3bD0nLVdsLCcKLSAgbGlua19zdGF0aWNfZmxhZz0nLXN0YXRpYycKLQotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBvc2YzKiB8IG9zZjQqKQotICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgIDs7Ci0gIGFpeCopCi0gICAgIyBCZWxvdyB0aGVyZSBpcyBhIGRpcnR5IGhhY2sgdG8gZm9yY2Ugbm9ybWFsIHN0YXRpYyBsaW5raW5nIHdpdGggLWxkbAotICAgICMgVGhlIHByb2JsZW0gaXMgYmVjYXVzZSBsaWJkbCBkeW5hbWljYWxseSBsaW5rZWQgd2l0aCBib3RoIGxpYmMgYW5kCi0gICAgIyBsaWJDIChBSVggQysrIGxpYnJhcnkpLCB3aGljaCBvYnZpb3VzbHkgZG9lc24ndCBpbmNsdWRlZCBpbiBsaWJyYXJpZXMKLSAgICAjIGxpc3QgYnkgZ2NjLiBUaGlzIGNhdXNlIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggLXN0YXRpYyBmbGFncy4KLSAgICAjIFRoaXMgaGFjayBhbGxvd3MgQyBwcm9ncmFtcyB0byBiZSBsaW5rZWQgd2l0aCAiLXN0YXRpYyAtbGRsIiwgYnV0Ci0gICAgIyB3ZSBub3Qgc3VyZSBhYm91dCBDKysgcHJvZ3JhbXMuCi0gICAgbGlua19zdGF0aWNfZmxhZz0iJGxpbmtfc3RhdGljX2ZsYWcgJHt3bH0tbEMiCi0gICAgOzsKLSAgY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCi0gICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCi0gICAgOzsKLSAgYW1pZ2FvcyopCi0gICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgcGljX2ZsYWc9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICA7OwotICAqKQotICAgIHBpY19mbGFnPSctZlBJQycKLSAgICA7OwotICBlc2FjCi1lbHNlCi0gICMgUE9SVE1FIENoZWNrIGZvciBQSUMgZmxhZ3MgZm9yIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKiB8IGFpeDQqKQotICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICBsaW5rX3N0YXRpY19mbGFnPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgOzsKLQotICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGxpbmtfc3RhdGljX2ZsYWcgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9IiR7d2x9LWEgJHt3bH1hcmNoaXZlIgotICAgIHBpY19mbGFnPScrWicKLSAgICA7OwotCi0gIGlyaXg1KiB8IGlyaXg2KikKLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKLSAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqIHwgb3MyKikKLSAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KLSAgICA7OwotCi0gIG9zZjMqIHwgb3NmNCopCi0gICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgcGljX2ZsYWc9Jy1LcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1kbicKLSAgICBzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Jy1iZWxmJwotICAgIDs7Ci0KLSAgc29sYXJpcyopCi0gICAgcGljX2ZsYWc9Jy1LUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctV2wsJwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBwaWNfZmxhZz0nLVBJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVFvcHRpb24gbGQgJwotICAgIDs7Ci0KLSAgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKLSAgICBwaWNfZmxhZz0nLUtQSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1XbCwnCi0gICAgOzsKLQotICB1dHM0KikKLSAgICBwaWNfZmxhZz0nLXBpYycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICA7OwotCi0gICopCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KLSAgZWNobyAiJGFjX3QkcGljX2ZsYWciIDE+JjYKLQotICAjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcGljX2ZsYWcgYWN0dWFsbHkgd29ya3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAkcGljX2ZsYWcgLURQSUMiCi0gIGVjaG8gIiRwcm9nbmFtZTo3MTc6IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MiID4mNQotICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjcxODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kb2JqZXh0OyB0aGVuCi0gICAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIAotICAgIGNhc2UgIiRob3N0X29zIiBpbgotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgIyBPbiBIUC1VWCwgYm90aCBDQyBhbmQgR0NDIG9ubHkgd2FybiB0aGF0IFBJQyBpcyBzdXBwb3J0ZWQuLi4gdGhlbiB0aGV5Ci0gICAgICAjIGNyZWF0ZSBub24tUElDIG9iamVjdHMuICBTbywgaWYgdGhlcmUgd2VyZSBhbnkgd2FybmluZ3MsIHdlIGFzc3VtZSB0aGF0Ci0gICAgICAjIFBJQyBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLQllY2hvICIkYWNfdCJubyAxPiY2Ci0JY2FuX2J1aWxkX3NoYXJlZD1ubwotCXBpY19mbGFnPQotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JcGljX2ZsYWc9IiAkcGljX2ZsYWciCi0gICAgICBmaQotICAgICAgOzsKLSAgICAqKQotICAgICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgICAgIHBpY19mbGFnPSIgJHBpY19mbGFnIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICBwaWNfZmxhZz0KLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAkcm0gY29uZnRlc3QqCi1lbHNlCi0gIGVjaG8gIiRhY190Im5vbmUgMT4mNgotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtbyBhbmQgLWMgYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlcgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuby4uLiAkYWNfYyIgMT4mNgotJHJtIGNvbmZ0ZXN0KgotZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJENGTEFHUyAtYyAtbyBjb25mdGVzdDIubyIKLWVjaG8gIiRwcm9nbmFtZTo3NjA6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLm8iID4mNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo3NjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QyLm87IHRoZW4KLQotICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgICAgY29tcGlsZXJfY19vPW5vCi0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgICAgIGNvbXBpbGVyX2Nfbz15ZXMKLSAgICBmaQotZWxzZQotICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgY29tcGlsZXJfY19vPW5vCi0gIGVjaG8gIiRhY190Im5vIDE+JjYKLWZpCi1DRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSRybSBjb25mdGVzdCoKLQotaWYgdGVzdCB4IiRjb21waWxlcl9jX28iID0geCJ5ZXMiOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB3cml0ZSB0byBhIC5sbwotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sby4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0LmxvIgotICBlY2hvICIkcHJvZ25hbWU6Nzg4OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sbyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjc4OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5sbzsgdGhlbgotCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNvbXBpbGVyX29fbG89bm8KLSAgICAgIGVsc2UKLQllY2hvICIkYWNfdCJ5ZXMgMT4mNgotCWNvbXBpbGVyX29fbG89eWVzCi0gICAgICBmaQotICBlbHNlCi0gICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBjb21waWxlcl9vX2xvPW5vCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotZWxzZQotICBjb21waWxlcl9vX2xvPW5vCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICRhY19jIiAxPiY2Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIGVjaG8gIiRhY190JGhhcmRfbGlua3MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIGVjaG8gIioqKiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjIKLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBjb21waWxlcgotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC1jIGNvbmZ0ZXN0LmMiCi0gIGVjaG8gIiRwcm9nbmFtZTo4NDA6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo4NDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubwotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICAgZmkKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotCi0gIGlmIHRlc3QgIiRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0gInllcyI7IHRoZW4KLSAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4gLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucycKLSAgZWxzZQotICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKLSAgZmkKLSAgCi1maQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBzaGFyZWQgbGlicmFyeSBjb21waWxhdGlvbiBmbGFncy4KLWlmIHRlc3QgLW4gIiRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZzogXGAkQ0MnIHJlcXVpcmVzIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBlZ3JlcCAtZSAiWyAJXSRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3NbIAldIiA+L2Rldi9udWxsOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogYWRkIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlIiAxPiYyCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdtYWluKCl7cmV0dXJuKDApO30nID4gY29uZnRlc3QuYwotc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLUxERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotZWNobyAiJHByb2duYW1lOjg4NDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6ODg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgZWNobyAiJGFjX3QkbGlua19zdGF0aWNfZmxhZyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCJub25lIDE+JjYKLSAgbGlua19zdGF0aWNfZmxhZz0KLWZpCi1MREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotJHJtIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0IC16ICIkTE5fUyI7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSBsbiAtcywgb3Igd2UgbmVlZCBoYXJkIGxpbmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdGRhdGEKLSAgaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGw7IHRoZW4KLSAgICAkcm0gY29uZnRlc3RkYXRhCi0gICAgTE5fUz0ibG4gLXMiCi0gIGVsc2UKLSAgICBMTl9TPWxuCi0gIGZpCi0gIGlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICBlbHNlCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotZmkKLQotIyBNYWtlIHN1cmUgTEQgaXMgYW4gYWJzb2x1dGUgcGF0aC4KLWlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgYWNfcHJvZz1sZAotICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjkxNzogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gICAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgICAiIikKLSAgICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmUgbm90IHVzaW5nIEdDQy4KLSAgICAgIGFjX3Byb2c9bGQKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjk0MTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci0gIGVsc2UKLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjk0NDogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0JTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotCSMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLQkjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLQlpZiAiJExEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotCWVsc2UKLQkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0JZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGFjX3NhdmVfaWZzIgotICBmaQotCi0gIGlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgICBlY2hvICIkYWNfdCRMRCIgMT4mNgotICBlbHNlCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgaXQgcmVhbGx5IGlzIG9yIGlzIG5vdCBHTlUgbGQuCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgotIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotZWNobyAiJGFjX3Qkd2l0aF9nbnVfbGQiIDE+JjYKLQotIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKLQotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci1ub191bmRlZmluZWRfZmxhZz0KLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1uZWVkX3ZlcnNpb249dW5rbm93bgotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLWFyY2hpdmVfY21kcz0KLWFyY2hpdmVfZXhwc3ltX2NtZHM9Ci1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPQotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci10aHJlYWRfc2FmZV9mbGFnX3NwZWM9Ci1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KLWhhcmRjb2RlX2RpcmVjdD1ubwotaGFyZGNvZGVfbWludXNfTD1ubwotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAotcnVucGF0aF92YXI9Ci1hbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0jIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0jIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotaW5jbHVkZV9leHBzeW1zPQotIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGVncmVwIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKLSMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotZXhjbHVkZV9leHBzeW1zPQotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWN5Z3dpbiogfCBtaW5ndyopCi0gICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKLSAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgaWYgdGVzdCAiJHdpdGhfZ2NjIiAhPSB5ZXM7IHRoZW4KLSAgICB3aXRoX2dudV9sZD1ubwotICBmaQotICA7OwotCi1mcmVlYnNkMiogfCBzdW5vczQqKQotICBleGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgOzsKLQotZXNhYwotCi1sZF9zaGxpYnM9eWVzCi1pZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gIHdsYXJjPScke3dsfScKLQotICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCopCi0gICAgIyBPbiBBSVgsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSIGNydSAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG9iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICB3bGFyYz0KLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBiZW9zKikKLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0KLSAgICAjIEV4dHJhY3QgdGhlIHN5bWJvbCBleHBvcnQgbGlzdCBmcm9tIGFuIGAtLWV4cG9ydC1hbGwnIGRlZiBmaWxlLAotICAgICMgdGhlbiByZWdlbmVyYXRlIHRoZSBkZWYgZmlsZSBmcm9tIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QsIHNvIHRoYXQKLSAgICAjIHRoZSBjb21waWxlZCBkbGwgb25seSBleHBvcnRzIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QuCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcz0ncm0gLWYgJG9iamRpci8kc29uYW1lLWx0ZGxsLmN+Ci0gICAgICBzZWQgLWUgIi9eIyBcL1wqIGx0ZGxsLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogbHRkbGwuYyBlbmRzIGhlcmUgXCpcLy8geyBzL14jIC8vOyBwOyB9IiAtZSBkIDwgJDAgPiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuY34KLSAgICAgIChjZCAkb2JqZGlyICYmICRDQyAtYyAkc29uYW1lLWx0ZGxsLmMpfgotICAgICAgJERMTFRPT0wgLS1leHBvcnQtYWxsIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tb3V0cHV0LWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmICAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2Jqc34KLSAgICAgIHNlZCAtZSAiMSwvRVhQT1JUUy9kIiAtZSAicy8gQCBbMC05XSogOyAqLy8iIDwgJG9iamRpci8kc29uYW1lLWRlZiA+ICRleHBvcnRfc3ltYm9scycKLQotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gRVhQT1JUUyA+ICRvYmpkaXIvJHNvbmFtZS1kZWZ+Ci0gICAgICBfbHRfaGludD0xOwotICAgICAgZm9yIHN5bWJvbCBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvCi0gICAgICAgIGVjaG8gIglcJHN5bWJvbCBAIFwkX2x0X2hpbnQgOyAiID4+ICRvYmpkaXIvJHNvbmFtZS1kZWY7Ci0JX2x0X2hpbnQ9YGV4cHIgMSArIFwkX2x0X2hpbnRgOwotICAgICAgZG9uZX4KLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG9iamRpci8kc29uYW1lLWJhc2UgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG9iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvYmpkaXIvJHNvbmFtZS1leHB+Ci0gICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvYmpkaXIvJHNvbmFtZS1iYXNlICRvYmpkaXIvJHNvbmFtZS1leHAgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG9iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvYmpkaXIvJHNvbmFtZS1leHB+Ci0gICAgICAkQ0MgJG9iamRpci8kc29uYW1lLWV4cCAtV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyAtV2wsLWUsX19jeWd3aW5fZGxsX2VudHJ5QDEyIC1vICRsaWIgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotCi0gICAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSckRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tb3V0cHV0LWxpYiAkb2JqZGlyLyRsaWJuYW1lLmEnCi0gICAgOzsKLQotICAqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IHllczsgdGhlbgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgZmkKLWVsc2UKLSAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyopCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJExEIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiBjcnUgJGxpYiAkb2JqZGlyLyRzb25hbWUnCi0gICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKLSAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotICAgICAgIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCi0gICAgICAjIGJyb2tlbiBjb2xsZWN0Mi4KLSAgICAgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAgIGZpCi0gICAgOzsKLQotICBhaXg0KikKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz0KLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBpZiBzdHJpbmdzIGAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYCB8IFwKLQkgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLSAgICAgIHRoZW4KLQkjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLQloYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBlbHNlCi0JIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tYm5vZW50cnkgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBlbHNlCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYk06U1JFICR7d2x9LWJub2VudHJ5JwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGZpCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAjIFRob3VnaCBMSUJQQVRIIHZhcmlhYmxlIGhhcmRjb2RlcyBzaGxpYnBhdGggaW50byBleGVjdXRhYmxlLAotICAgICMgaXQgZG9lc24ndCBhZmZlY3Qgc2VhcmNoaW5nIGZvciAtbCogbGlicmFyaWVzOyB0aGlzIGNvbmZ1c2VzCi0gICAgIyB0ZXN0cyBpbiBtZGVtby4KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgY3J1ICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICBsaWJleHQ9bGliCi0gICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgIGFyY2hpdmVfY21kcz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGxpbmtvcHRzIGBlY2hvICIkZGVwbGlicyIgfCBzZWQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J3RydWUnCi0gICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzPSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMnCi0gICAgZml4X3NyY2ZpbGVfcGF0aD0nYGN5Z3BhdGggLXcgJHNyY2ZpbGVgJwotICAgIDs7Ci0KLSAgZnJlZWJzZDEqKQotICAgIGxkX3NobGlicz1ubwotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICMgZXh0cmEgc3BhY2UpLgotICBmcmVlYnNkMi4yKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAvdXNyL2xpYi9jKytydDAubycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8gIyB2ZXJpZmllZCBvbiAyLjIuNgotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgZnJlZWJzZDIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgZnJlZWJzZCopCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBocHV4OSopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci8kc29uYW1lfiRMRCAtYiArcyArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c350ZXN0ICRvYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG9iamRpci8kc29uYW1lICRsaWInCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArcyArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLW8gJGxpYicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIG5ldGJzZCopCi0gICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnICAjIGEub3V0Ci0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycgICAgICAjIEVMRgotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9wZW5ic2QqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3MyKikKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJG9iamRpci8kbGlibmFtZS5kZWYnCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvYmpkaXIvJGxpYm5hbWUuYSAkb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICA7OwotCi0gIG9zZjMqIHwgb3NmNCopCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtbyAkbGliJwotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIDs7Ci0KLSAgc2NvMy4ydjUqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICA7OwotCi0gIHNvbGFyaXMqKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKLSAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKLSAgICAjIG9iamVjdCBmaWxlcyBhbmQgYSBzdGF0aWMgbGlic3RkYysrLCBiZXR0ZXIgYXZvaWQgaXQgYnkgbm93Ci0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+JHJtICRsaWIuZXhwJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgICMgV2h5IGRvIHdlIG5lZWQgLUJzdGF0aWM/ICBUbyBhdm9pZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcywgbWF5YmUuLi4KLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICAjIFVzZSAtZlBJQyBoZXJlIGJlY2F1c2UgbGliZ2NjIGlzIG11bHRpbGliYmVkCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LUJzdGF0aWMgLWZQSUMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgc3lzdjQuMyopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCi0gICAgOzsKLQotICB1dHM0KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgZGd1eCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PW5vCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0gIGVzYWMKLWZpCi1lY2hvICIkYWNfdCRsZF9zaGxpYnMiIDE+JjYKLQotaWYgdGVzdCAteiAiJE5NIjsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0uLi4gJGFjX2MiIDE+JjYKLSAgY2FzZSAiJE5NIiBpbgotICAvKiB8IFtBLVphLXpdOlsvXFxdKikgOzsgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICopCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL3VjYiAvdXNyL2Njcy9iaW4gL2JpbjsgZG8KLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLQkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLQlpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQkgIE5NPSIkYWNfZGlyL25tIC1CIgotCSAgYnJlYWsKLQllbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCSAgTk09IiRhY19kaXIvbm0gLXAiCi0JICBicmVhawotCWVsc2UKLQkgIE5NPSR7Tk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQkgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0JZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGFjX3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiROTSIgJiYgTk09bm0KLSAgICA7OwotICBlc2FjCi0gIGVjaG8gIiRhY190JE5NIiAxPiY2Ci1maQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0Li4uICRhY19jIiAxPiY2Ci0KLSMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIHN5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIHN5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKLSAgZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBzeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gICMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KLSAgZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJHN5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRzeW1wYXQkLyRzeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBwaXBlX3dvcmtzPW5vCi0gICRybSBjb25mdGVzdCoKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLW1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KLUVPRgotCi0gIGVjaG8gIiRwcm9nbmFtZToxNDQ3OiBjaGVja2luZyBpZiBnbG9iYWxfc3ltYm9sX3BpcGUgd29ya3MiID4mNQotICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjE0NDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kb2JqZXh0OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiB7IGVjaG8gIiRwcm9nbmFtZToxNDUxOiBldmFsIFwiJE5NIGNvbmZ0ZXN0LiRvYmpleHQgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4gJG5saXN0XCIiID4mNTsgZXZhbCAiJE5NIGNvbmZ0ZXN0LiRvYmpleHQgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4gJG5saXN0IDI+JjUiOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0JICBzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRvYmpleHQgY29uZnRlc3RtLiRvYmpleHQKLQkgIHNhdmVfTElCUz0iJExJQlMiCi0JICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTUwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIHBpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRzYXZlX0xJQlMiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRnbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICAkcm0gY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBicmVhawotICBlbHNlCi0gICAgZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotZWNobyAiJGFjX3QkcGlwZV93b3JrcyIgMT4mNgotCi1pZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQotZmkKLQotIyBDaGVjayBoYXJkY29kaW5nIGF0dHJpYnV0ZXMuCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRhY19jIiAxPiY2Ci1oYXJkY29kZV9hY3Rpb249Ci1pZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYgXAotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm8gJiYgXAotICAgICB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgIT0gbm87IHRoZW4KLQotICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCi0gICAgaGFyZGNvZGVfYWN0aW9uPXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb249aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbj11bnN1cHBvcnRlZAotZmkKLWVjaG8gIiRhY190JGhhcmRjb2RlX2FjdGlvbiIgMT4mNgotCi0KLXJlbG9hZF9mbGFnPQotcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAkYWNfYyIgMT4mNgotIyBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgotcmVsb2FkX2ZsYWc9Jy1yJwotZWNobyAiJGFjX3QkcmVsb2FkX2ZsYWciIDE+JjYKLXRlc3QgLW4gIiRyZWxvYWRfZmxhZyIgJiYgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciCi0KLSMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXBvc3RpbnN0YWxsX2NtZHM9Ci1wb3N0dW5pbnN0YWxsX2NtZHM9Ci1maW5pc2hfY21kcz0KLWZpbmlzaF9ldmFsPQotc2hsaWJwYXRoX3Zhcj0KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCi12ZXJzaW9uX3R5cGU9bm9uZQotZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi1maWxlX21hZ2ljX2NtZD0KLWZpbGVfbWFnaWNfdGVzdF9maWxlPQotZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCi0jIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKLSMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KLSMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgotIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCi0jICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCi0jICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCi0jICdmaWxlX21hZ2ljIFtyZWdleF0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAotIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBlZ3JlcCByZWdleC4KLSMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQotIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkYWNfYyIgMT4mNgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgOzsKLQotYWl4NCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhvdWdoIEFJWDQuMgotICAjIGFuZCBsYXRlciBsaW5rZXIgc3VwcG9ydHMgLnNvCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICBkZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1hbWlnYW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICIoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkiOyAoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LnNvJwotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi0gIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICi0gIDs7Ci0KLWJzZGk0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5zbyRtYWpvciAke2xpYm5hbWV9LnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfS5zbycKLSAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgMzItYml0IExTQiBzaGFyZWQgb2JqZWN0JwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCAkbGlibmFtZS5hJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmxpYicKLSAgZmkKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2LiphcmNoaXRlY3R1cmU6IGkzODYnCi0gIGZpbGVfbWFnaWNfY21kPSdvYmpkdW1wIC1mJwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0gIAotZnJlZWJzZCopCi0gIG9iamZvcm1hdD1gdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQgJiYgL3Vzci9iaW4vb2JqZm9ybWF0IHx8IGVjaG8gYW91dGAKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICIkdmVyc2lvbl90eXBlIiBpbgotICAgIGZyZWVic2QtZWxmKikKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIHNoYXJlZCBvYmplY3QnCi0gICAgICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gICAgICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgZnJlZWJzZC0qKQotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuc28kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIE9CSkZPUk1BVD0iJyIkb2JqZm9ybWF0IiciIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJG1ham9yICRsaWJuYW1lLnNsJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3InCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaXJpeDUqKQotICB2ZXJzaW9uX3R5cGU9aXJpeAotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgMzItYml0IE1TQiBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIiAjIG9yIHNob3VsZCBpdCBiZSBwYXNzX2FsbD8KLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliL2xpYmMuc28qYAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgOzsKLQotaXJpeDYqKQotICB2ZXJzaW9uX3R5cGU9aXJpeAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gIGNhc2UgIiRMRCIgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAqLTMyfCoiLTMyICIpIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgKi1uMzJ8KiItbjMyICIpIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAqLTY0fCoiLTY0ICIpIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIGV2ZW4gdGhvdWdoIC91c3IvbG9jYWwvbGliIGlzIGFsd2F5cyBzZWFyY2hlZCwgdGhlIG1hbi1wYWdlIHNheXMKLSAgIyBzaGFyZWQgbGlicmFyaWVzIHNob3VsZCBub3QgYmUgaW5zdGFsbGVkIHRoZXJlIGlmIHRoZXkgdXNlIGFuIEFCSQotICAjIGRpZmZlcmVudCBmcm9tIC0zMiwgc28gd2UnZCBiZXR0ZXIgbm90IHNlYXJjaCBmb3Igc2hhcmVkIGxpYnJhcmllcwotICAjIHRoZXJlIGVpdGhlcgotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIke2xpYnN1ZmZ9IC91c3IvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliJHtsaWJzdWZmfSAvdXNyL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgJHtsaWJtYWdpY30gTVNCIG1pcHMtWzEyMzRdIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiICMgb3Igc2hvdWxkIGl0IGJlIHBhc3NfYWxsPwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIke2xpYnN1ZmZ9L2xpYmMuc28qYAotICA7OwotCi0jIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCi1saW51eC1nbnVvbGRsZCogfCBsaW51eC1nbnVhb3V0KiB8IGxpbnV4LWdudWNvZmYqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eC1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIvbGliYy5zbyogL2xpYi9saWJjLSouc29gCi0KLSAgaWYgdGVzdCAtZiAvbGliL2xkLnNvLjE7IHRoZW4KLSAgICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICBlbHNlCi0gICAgIyBPbmx5IHRoZSBHTlUgbGQuc28gc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyBvbiBNa0xpbnV4LgotICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KLSAgICBwb3dlcnBjKikgZHluYW1pY19saW5rZXI9bm8gOzsKLSAgICAqKSBkeW5hbWljX2xpbmtlcj0nTGludXggbGQuc28nIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotCi1uZXRic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAke2xpYm5hbWV9LnNvJwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKLSAgZmkKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotb3BlbmJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgbmVlZF92ZXJzaW9uPW5vCi0gIGZpCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwgJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAjIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKLSAgIyBBbHRob3VnaCBwYXNzX2FsbCBhcHBlYXJzIHRvIHdvcmssIGl0IGNvcGllcyBzeW1ib2xzIGZyb20gc3RhdGljIGxpYnJhcmllcwotICAjIGludG8gc2hhcmVkIG9uZXMgYW5kIGV4cG9ydHMgdGhlbS4gIFNvLCB3aGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0d28KLSAgIyBvciBtb3JlIGxpYnJhcmllcyB0aGF0IGhhdmUgZ290IGNvcGllcyBvZiB0aGUgc2FtZSBzeW1ib2xzLCBsaW5rIGZhaWxzCi0gICMgVGhpcyB3YXMgb25seSB0ZXN0ZWQgb24gb3NmNDoKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgQ09GRiBmb3JtYXQgYWxwaGEgc2hhcmVkIGxpYnJhcnknCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNjbzMuMnY1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zb2xhcmlzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XS1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbwotICA7OwotCi1zdW5vczQqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICIkaG9zdF92ZW5kb3IiIGluCi0gICAgbmNyKQotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9J3Bhc3NfYWxsJwotICAgICAgOzsKLSAgZXNhYwotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwotZWNobyAiJGFjX3QkZHluYW1pY19saW5rZXIiIDE+JjYKLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMgUmVwb3J0IHRoZSBmaW5hbCBjb25zZXF1ZW5jZXMuCi1lY2hvICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGNhbl9idWlsZF9zaGFyZWQiIDE+JjYKLQotaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIiAmJiB0ZXN0IC1uICIkZmlsZV9tYWdpY19jbWQiOyB0aGVuCi0gIGNhc2UgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgaW4KLSAgImZpbGVfbWFnaWMgIiopCi0gICAgZmlsZV9tYWdpY19yZWdleD0iYGV4cHIgXCIkZGVwbGlic19jaGVja19tZXRob2RcIiA6IFwiZmlsZV9tYWdpYyBcKC4qXClcImAiCi0gICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAotICAgICAgIGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIDoKLSAgICBlbHNlCi0gICAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0gICAgZmkgOzsKLSAgZXNhYwotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICRhY19jIiAxPiY2Ci10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCi0gIGZpCi0gIDs7Ci0KLWFpeDQqKQotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICA7OwotZXNhYwotCi1lY2hvICIkYWNfdCRlbmFibGVfc2hhcmVkIiAxPiY2Ci0KLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi0KLWVjaG8gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAkZW5hYmxlX3N0YXRpYyIgMT4mNgotCi1pZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9iamRpci4uLiAkYWNfYyIgMT4mNgotcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKLW1rZGlyIC5saWJzIDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC5saWJzOyB0aGVuCi0gIG9iamRpcj0ubGlicwotZWxzZQotICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgotICBvYmpkaXI9X2xpYnMKLWZpCi1ybWRpciAubGlicyAyPi9kZXYvbnVsbAotZWNobyAiJGFjX3Qkb2JqZGlyIiAxPiY2Ci0KLWlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgotICBlbmFibGVfZGxvcGVuPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi1lbHNlCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfZGxvcGVuJytzZXR9J2BcIiAhPSBzZXQiOyB0aGVuCi0gIGx0X2N2X2Rsb3Blbj1ubyBsdF9jdl9kbG9wZW5fbGlicz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbG9wZW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjE5Nzc6IGNoZWNraW5nIGZvciBkbG9wZW4iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfZGxvcGVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk4MiAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBkbG9wZW4oKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBkbG9wZW4oKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9kbG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2Rsb3BlbikKLWNob2tlIG1lCi0jZWxzZQotZGxvcGVuKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIwMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfZGxvcGVuPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19kbG9wZW49bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydkbG9wZW5gXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMDIyOiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkbCdfJ2Rsb3BlbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDMwICJsdGNvbmZpZyIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZGxvcGVuKCk7Ci0KLWludCBtYWluKCkgewotZGxvcGVuKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMDQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMDU5OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkbGQnXydkbGRfbGluayB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkbGQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA2NyAibHRjb25maWciCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGRsZF9saW5rKCk7Ci0KLWludCBtYWluKCkgewotZGxkX2xpbmsoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIwNzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIwOTY6IGNoZWNraW5nIGZvciBzaGxfbG9hZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19zaGxfbG9hZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMDEgImx0Y29uZmlnIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgc2hsX2xvYWQoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBzaGxfbG9hZCgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX3NobF9sb2FkKSB8fCBkZWZpbmVkIChfX3N0dWJfX19zaGxfbG9hZCkKLWNob2tlIG1lCi0jZWxzZQotc2hsX2xvYWQoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjEyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19zaGxfbG9hZD15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfc2hsX2xvYWQ9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydzaGxfbG9hZGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMb2FkTGlicmFyeSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjE0MTogY2hlY2tpbmcgZm9yIExvYWRMaWJyYXJ5IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX0xvYWRMaWJyYXJ5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE0NiAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBMb2FkTGlicmFyeSgpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIExvYWRMaWJyYXJ5KCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfTG9hZExpYnJhcnkpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX0xvYWRMaWJyYXJ5KQotY2hva2UgbWUKLSNlbHNlCi1Mb2FkTGlicmFyeSgpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX0xvYWRMaWJyYXJ5PXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19Mb2FkTGlicmFyeT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ0xvYWRMaWJyYXJ5YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgCi1maQotCi0gICAgCi1maQotCi0gIAotZmkKLQotCi1maQotCi1maQotCi0gIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KLSAgICBlbmFibGVfZGxvcGVuPXllcwotICBmaQotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW4iIGluCi0gIGRsb3BlbikKLWZvciBhY19oZHIgaW4gZGxmY24uaDsgZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIyMTA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjE1ICJsdGNvbmZpZyIKLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IGZub3JkID0gMDsKLUVPRgotYWNfdHJ5PSIkYWNfY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gJHByb2duYW1lOjIyMjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgICBpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXM7IHRoZW4KLSAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCi0gICAgZmkKLSAgICBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0gICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMjQ4OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1Ci1pZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKLSAgZWxzZQotICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNsaW5lIDIyNTYgImx0Y29uZmlnIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jIGRlZmluZSBMVERMX0dMT0JBTAlSVExEX0dMT0JBTAotI2Vsc2UKLSMgaWZkZWYgRExfR0xPQkFMCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJRExfR0xPQkFMCi0jIGVsc2UKLSMgIGRlZmluZSBMVERMX0dMT0JBTAkwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExURExfTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVERMX0xBWllfT1JfTk9XCi0jIGlmZGVmIFJUTERfTEFaWQotIyAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9MQVpZCi0jIGVsc2UKLSMgIGlmZGVmIERMX0xBWlkKLSMgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9MQVpZCi0jICBlbHNlCi0jICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICBlbHNlCi0jICAgIGlmZGVmIERMX05PVwotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgIGVsc2UKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCTAKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1mbm9yZCgpIHsgaW50IGk9NDI7fQotbWFpbigpIHsgdm9pZCAqc2VsZiwgKnB0cjEsICpwdHIyOyBzZWxmPWRsb3BlbigwLExURExfR0xPQkFMfExURExfTEFaWV9PUl9OT1cpOwotICAgIGlmKHNlbGYpIHsgcHRyMT1kbHN5bShzZWxmLCJmbm9yZCIpOyBwdHIyPWRsc3ltKHNlbGYsIl9mbm9yZCIpOwotCSAgICAgICBpZihwdHIxIHx8IHB0cjIpIGV4aXQoMCk7IH0gZXhpdCgxKTsgfSAKLQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIzMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9kbG9wZW5fc2VsZiIgMT4mNgotCi0gIGlmIHRlc3QgIiRsdF9jdl9kbG9wZW5fc2VsZiIgPSB5ZXM7IHRoZW4KLSAgICBMREZMQUdTPSIkTERGTEFHUyAkbGlua19zdGF0aWNfZmxhZyIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIzMjE6IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCi0gIGVsc2UKLSAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jbGluZSAyMzI5ICJsdGNvbmZpZyIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyBkZWZpbmUgTFRETF9HTE9CQUwJUlRMRF9HTE9CQUwKLSNlbHNlCi0jIGlmZGVmIERMX0dMT0JBTAotIyAgZGVmaW5lIExURExfR0xPQkFMCURMX0dMT0JBTAotIyBlbHNlCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVERMX0xBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRETF9MQVpZX09SX05PVwotIyBpZmRlZiBSVExEX0xBWlkKLSMgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTEFaWQotIyBlbHNlCi0jICBpZmRlZiBETF9MQVpZCi0jICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTEFaWQotIyAgZWxzZQotIyAgIGlmZGVmIFJUTERfTk9XCi0jICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgZWxzZQotIyAgICBpZmRlZiBETF9OT1cKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX05PVwotIyAgICBlbHNlCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwkwCi0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotZm5vcmQoKSB7IGludCBpPTQyO30KLW1haW4oKSB7IHZvaWQgKnNlbGYsICpwdHIxLCAqcHRyMjsgc2VsZj1kbG9wZW4oMCxMVERMX0dMT0JBTHxMVERMX0xBWllfT1JfTk9XKTsKLSAgICBpZihzZWxmKSB7IHB0cjE9ZGxzeW0oc2VsZiwiZm5vcmQiKTsgcHRyMj1kbHN5bShzZWxmLCJfZm5vcmQiKTsKLSAgICBpZihwdHIxIHx8IHB0cjIpIGV4aXQoMCk7IH0gZXhpdCgxKTsgfSAKLQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIzNzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcwotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgMT4mNgotZmkKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGx0X2N2X2Rsb3Blbl9zZWxmIiBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OwotICBlc2FjCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsLCBiZWNhdXNlIGl0IGlzCi0jIHVzZWQgbGF0ZXIuCi1sdGVjaG89IiRlY2hvIgotaWYgdGVzdCAiWCRsdGVjaG8iID0gIlgkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLSAgIGx0ZWNobz0iJENPTkZJR19TSEVMTCBcJDAgLS1mYWxsYmFjay1lY2hvIgotZmkKLUxUU0hFTEw9IiRTSEVMTCIKLQotTFRDT05GSUdfVkVSU0lPTj0iJFZFUlNJT04iCi0KLSMgT25seSBxdW90ZSB2YXJpYWJsZXMgaWYgd2UncmUgdXNpbmcgbHRtYWluLnNoLgotY2FzZSAiJGx0bWFpbiIgaW4KLSouc2gpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMuCi0gIGZvciB2YXIgaW4gbHRlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBvbGRfTEQgb2xkX05NIG9sZF9SQU5MSUIgXAotICAgIG9sZF9MTl9TIG9sZF9ETExUT09MIG9sZF9BUyBBUiBDQyBMRCBMTl9TIE5NIExUU0hFTEwgTFRDT05GSUdfVkVSU0lPTiBcCi0gICAgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgXAotICAgIHBpY19mbGFnIGxpbmtfc3RhdGljX2ZsYWcgbm9fYnVpbHRpbl9mbGFnIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGxpYm5hbWVfc3BlYyBcCi0gICAgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFwKLSAgICBSQU5MSUIgb2xkX2FyY2hpdmVfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIG9sZF9wb3N0aW5zdGFsbF9jbWRzIFwKLSAgICBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIGFyY2hpdmVfY21kcyBhcmNoaXZlX2V4cHN5bV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBmaWxlX21hZ2ljX2NtZCBleHBvcnRfc3ltYm9sc19jbWRzIGRlcGxpYnNfY2hlY2tfbWV0aG9kIGFsbG93X3VuZGVmaW5lZF9mbGFnIG5vX3VuZGVmaW5lZF9mbGFnIFwKLSAgICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yICBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBjb21waWxlcl9jX28gY29tcGlsZXJfb19sbyBuZWVkX2xvY2tzIGV4Y2x1ZGVfZXhwc3ltcyBpbmNsdWRlX2V4cHN5bXM7IGRvCi0KLSAgICBjYXNlICIkdmFyIiBpbgotICAgIHJlbG9hZF9jbWRzIHwgb2xkX2FyY2hpdmVfY21kcyB8IG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgfCBhcmNoaXZlX2NtZHMgfCBhcmNoaXZlX2V4cHN5bV9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZmluaXNoX2NtZHMgfCBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgIiR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICIkdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgIiRsdGVjaG8iIGluCi0gIConXCQwIC0tZmFsbGJhY2stZWNobyInKQotICAgIGx0ZWNobz1gJGVjaG8gIlgkbHRlY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi0gIHRyYXAgIiRybSBcIiRvZmlsZVwiOyBleGl0IDEiIDEgMiAxNQotICBlY2hvICJjcmVhdGluZyAkb2ZpbGUiCi0gICRybSAiJG9maWxlIgotICBjYXQgPDxFT0YgPiAiJG9maWxlIgotIyEgJFNIRUxMCi0KLSMgYCRlY2hvICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdGNvbmZpZyBvciBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgotWHNlZD0ic2VkIC1lIHMvXlgvLyIKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgIlwke0NEUEFUSCtzZXR9IiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQotCi0jIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKLUVPRgotICBjZmdmaWxlPSIkb2ZpbGUiCi0gIDs7Ci0KLSopCi0gICMgRG91YmxlLXF1b3RlIHRoZSB2YXJpYWJsZXMgdGhhdCBuZWVkIGl0IChmb3IgYWVzdGhldGljcykuCi0gIGZvciB2YXIgaW4gb2xkX0NDIG9sZF9DRkxBR1Mgb2xkX0NQUEZMQUdTIG9sZF9MRCBvbGRfTk0gb2xkX1JBTkxJQiBcCi0gICAgb2xkX0xOX1Mgb2xkX0RMTFRPT0wgb2xkX0FTOyBkbwotICAgIGV2YWwgIiR2YXI9XFxcIlwkdmFyXFxcIiIKLSAgZG9uZQotCi0gICMgSnVzdCBjcmVhdGUgYSBjb25maWcgZmlsZS4KLSAgY2ZnZmlsZT0iJG9maWxlLmNmZyIKLSAgdHJhcCAiJHJtIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKLSAgZWNobyAiY3JlYXRpbmcgJGNmZ2ZpbGUiCi0gICRybSAiJGNmZ2ZpbGUiCi0gIGNhdCA8PEVPRiA+ICIkY2ZnZmlsZSIKLSMgYCRlY2hvICIkY2ZnZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBMaWJ0b29sIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi1FT0YKLSAgOzsKLWVzYWMKLQotY2F0IDw8RU9GID4+ICIkY2ZnZmlsZSIKLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgQ0M9JG9sZF9DQyBDRkxBR1M9JG9sZF9DRkxBR1MgQ1BQRkxBR1M9JG9sZF9DUFBGTEFHUyBcXAotIyBMRD0kb2xkX0xEIE5NPSRvbGRfTk0gUkFOTElCPSRvbGRfUkFOTElCIExOX1M9JG9sZF9MTl9TIFxcCi0jIERMTFRPT0w9IiRvbGRfRExMVE9PTCIgQVM9IiRvbGRfQVMiIFxcCi0jICAgJDAkbHRjb25maWdfYXJncwotIwotIyBDb21waWxlciBhbmQgb3RoZXIgdGVzdCBvdXRwdXQgcHJvZHVjZWQgYnkgJHByb2duYW1lLCB1c2VmdWwgZm9yCi0jIGRlYnVnZ2luZyAkcHJvZ25hbWUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLSMgVGhlIHZlcnNpb24gb2YgJHByb2duYW1lIHRoYXQgZ2VuZXJhdGVkIHRoaXMgc2NyaXB0LgotTFRDT05GSUdfVkVSU0lPTj0kTFRDT05GSUdfVkVSU0lPTgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kTFRTSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRlY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JEFSCi0KLSMgVGhlIGRlZmF1bHQgQyBjb21waWxlci4KLUNDPSRDQwotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kTEQKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSROTQotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRyZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JHJlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSR3bAotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJG9iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9JHBpY19mbGFnCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zCi1jb21waWxlcl9jX289JGNvbXBpbGVyX2NfbwotCi0jIENhbiB3ZSB3cml0ZSBkaXJlY3RseSB0byBhIC5sbyA/Ci1jb21waWxlcl9vX2xvPSRjb21waWxlcl9vX2xvCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24gPwotbmVlZF9sb2Nrcz0kbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbj0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbGlua19zdGF0aWNfZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JG5vX2J1aWx0aW5fZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kdGhyZWFkX3NhZmVfZmxhZ19zcGVjCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsaWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsaWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRzb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JFJBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kb2xkX2FyY2hpdmVfY21kcwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JG9sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGFyY2hpdmVfY21kcwotYXJjaGl2ZV9leHBzeW1fY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcwotcG9zdGluc3RhbGxfY21kcz0kcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRwb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRkZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYwotZmlsZV9tYWdpY19jbWQ9JGZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JG5vX3VuZGVmaW5lZF9mbGFnCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRmaW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGdsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGgiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZAotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKLQotIyBUaGUgY29tbWFuZCB0byBleHRyYWN0IGV4cG9ydGVkIHN5bWJvbHMKLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzCi1leGNsdWRlX2V4cHN5bXM9JGV4Y2x1ZGVfZXhwc3ltcwotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZAotaW5jbHVkZV9leHBzeW1zPSRpbmNsdWRlX2V4cHN5bXMKLQotRU9GCi0KLWNhc2UgIiRsdG1haW4iIGluCi0qLnNoKQotICBlY2hvICcjIyMgRU5EIExJQlRPT0wgQ09ORklHJyA+PiAiJG9maWxlIgotICBlY2hvID4+ICIkb2ZpbGUiCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcRU9GID4+ICIkb2ZpbGUiCi0KLSMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0jIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi1pZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCi0gIENPTExFQ1RfTkFNRVM9Ci0gIGV4cG9ydCBDT0xMRUNUX05BTUVTCi1maQotRU9GCi0gICAgOzsKLSAgZXNhYwotCi0gICMgQXBwZW5kIHRoZSBsdG1haW4uc2ggc2NyaXB0LgotICBjYXQgIiRsdG1haW4iID4+ICIkb2ZpbGUiIHx8IChybSAtZiAiJG9maWxlIjsgZXhpdCAxKQotCi0gIGNobW9kICt4ICIkb2ZpbGUiCi0gIDs7Ci0KLSopCi0gICMgQ29tcGlsZSB0aGUgbGlidG9vbCBwcm9ncmFtLgotICBlY2hvICJGSVhNRTogd291bGQgY29tcGlsZSAkbHRtYWluIgotICA7OwotZXNhYwotCi10ZXN0IC1uICIkY2FjaGVfZmlsZSIgfHwgZXhpdCAwCi0KLSMgQUNfQ0FDSEVfU0FWRQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9sdG1haW4uc2ggYi9sdG1haW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODc4N2EuLjAwMDAwMDAKLS0tIGEvbHRtYWluLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzc4MiArMCwwIEBACi0jIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBsdGNvbmZpZy4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkZWNoby4KLWlmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0IDAKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlICRlY2hvIHdpbGwgd29yay4KLSAgZXhlYyAkU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgotcHJvZ25hbWU9YCRlY2hvICIkMCIgfCBzZWQgJ3MlXi4qLyUlJ2AKLW1vZGVuYW1lPSIkcHJvZ25hbWUiCi0KLSMgQ29uc3RhbnRzLgotUFJPR1JBTT1sdG1haW4uc2gKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjJmCi1USU1FU1RBTVA9IiAoMS4zMyAxOTk5LzA0LzI2IDE2OjI4OjUzKSIKLQotZGVmYXVsdF9tb2RlPQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgotbWtkaXI9Im1rZGlyIgotbXY9Im12IC1mIgotcm09InJtIC1mIgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJwotU1AyTkw9J3RyIFwwNDAgXDAxMicKLU5MMlNQPSd0ciBcMDEyIFwwNDAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCi0jIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAotIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBXZSBzYXZlIHRoZSBvbGQgdmFsdWVzIHRvIHJlc3RvcmUgZHVyaW5nIGV4ZWN1dGUgbW9kZS4KLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuCi0gIHNhdmVfTENfQUxMPSIkTENfQUxMIjsgTENfQUxMPUM7IGV4cG9ydCBMQ19BTEwKLWZpCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQU5HPSIkTEFORyI7IExBTkc9QzsgZXhwb3J0IExBTkcKLWZpCi0KLWlmIHRlc3QgIiRMVENPTkZJR19WRVJTSU9OIiAhPSAiJFZFUlNJT04iOyB0aGVuCi0gIGVjaG8gIiRtb2RlbmFtZTogbHRjb25maWcgdmVyc2lvbiBcYCRMVENPTkZJR19WRVJTSU9OJyBkb2VzIG5vdCBtYXRjaCAkUFJPR1JBTSB2ZXJzaW9uIFxgJFZFUlNJT04nIiAxPiYyCi0gIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCi0gIGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgotICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgR2xvYmFsIHZhcmlhYmxlcy4KLW1vZGU9JGRlZmF1bHRfbW9kZQotbm9ub3B0PQotcHJldj0KLXByZXZvcHQ9Ci1ydW49Ci1zaG93PSIkZWNobyIKLXNob3dfaGVscD0KLWV4ZWN1dGVfZGxmaWxlcz0KLWxvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKLQotIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KLXdoaWxlIHRlc3QgJCMgLWd0IDAKLWRvCi0gIGFyZz0iJDEiCi0gIHNoaWZ0Ci0KLSAgY2FzZSAiJGFyZyIgaW4KLSAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBvcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgY2FzZSAiJHByZXYiIGluCi0gICAgZXhlY3V0ZV9kbGZpbGVzKQotICAgICAgZXZhbCAiJHByZXY9XCJcJCRwcmV2IFwkYXJnXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICIkcHJldj1cJGFyZyIKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgcHJldj0KLSAgICBwcmV2b3B0PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgIyBIYXZlIHdlIHNlZW4gYSBub24tb3B0aW9uYWwgYXJndW1lbnQgeWV0PwotICBjYXNlICIkYXJnIiBpbgotICAtLWhlbHApCi0gICAgc2hvd19oZWxwPXllcwotICAgIDs7Ci0KLSAgLS12ZXJzaW9uKQotICAgIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCIKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tY29uZmlnKQotICAgIHNlZCAtZSAnMSwvXiMjIyBCRUdJTiBMSUJUT09MIENPTkZJRy9kJyAtZSAnL14jIyMgRU5EIExJQlRPT0wgQ09ORklHLywkZCcgJDAKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tZGVidWcpCi0gICAgZWNobyAiJHByb2duYW1lOiBlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgotICAgIHNldCAteAotICAgIDs7Ci0KLSAgLS1kcnktcnVuIHwgLW4pCi0gICAgcnVuPToKLSAgICA7OwotCi0gIC0tZmVhdHVyZXMpCi0gICAgZWNobyAiaG9zdDogJGhvc3QiCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKLQotICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7Ci0gIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkKLSAgICBzaG93PToKLSAgICA7OwotCi0gIC1kbG9wZW4pCi0gICAgcHJldm9wdD0iLWRsb3BlbiIKLSAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcwotICAgIDs7Ci0KLSAgLSopCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICAqKQotICAgIG5vbm9wdD0iJGFyZyIKLSAgICBicmVhawotICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgotCi0gICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgotICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLSAgICBjYXNlICIkbm9ub3B0IiBpbgotICAgICpjYyB8ICorKyB8IGdjYyogfCAqLWdjYyopCi0gICAgICBtb2RlPWxpbmsKLSAgICAgIGZvciBhcmcKLSAgICAgIGRvCi0JY2FzZSAiJGFyZyIgaW4KLQktYykKLQkgICBtb2RlPWNvbXBpbGUKLQkgICBicmVhawotCSAgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICAqZGIgfCAqZGJ4IHwgKnN0cmFjZSB8ICp0cnVzcykKLSAgICAgIG1vZGU9ZXhlY3V0ZQotICAgICAgOzsKLSAgICAqaW5zdGFsbCp8Y3B8bXYpCi0gICAgICBtb2RlPWluc3RhbGwKLSAgICAgIDs7Ci0gICAgKnJtKQotICAgICAgbW9kZT11bmluc3RhbGwKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgSWYgd2UgaGF2ZSBubyBtb2RlLCBidXQgZGxmaWxlcyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBkbyBleGVjdXRlIG1vZGUuCi0gICAgICB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiBtb2RlPWV4ZWN1dGUKLQotICAgICAgIyBKdXN0IHVzZSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gbW9kZS4KLSAgICAgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRub25vcHQiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgZnJvbSBcYCRub25vcHQnIiAxPiYyCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIHdpdGhvdXQgTU9ERS1BUkdTIiAxPiYyCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQotICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgotICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgotICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIgMT4mMgotICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotCi0gICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KLSAgZ2VuZXJpY19oZWxwPSIkaGVscCIKLSAgaGVscD0iVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotICAjIFRoZXNlIG1vZGVzIGFyZSBpbiBvcmRlciBvZiBleGVjdXRpb24gZnJlcXVlbmN5IHNvIHRoYXQgdGhleSBydW4gcXVpY2tseS4KLSAgY2FzZSAiJG1vZGUiIGluCi0gICMgbGlidG9vbCBjb21waWxlIG1vZGUKLSAgY29tcGlsZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgotICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCi0gICAgYmFzZV9jb21waWxlPQotICAgIGxhc3Rhcmc9Ci0gICAgc3JjZmlsZT0iJG5vbm9wdCIKLSAgICBzdXBwcmVzc19vdXRwdXQ9Ci0KLSAgICB1c2VyX3RhcmdldD1ubwotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1vKQotCWlmIHRlc3QgIiR1c2VyX3RhcmdldCIgIT0gIm5vIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCXVzZXJfdGFyZ2V0PW5leHQKLQk7OwotCi0gICAgICAtc3RhdGljKQotCWJ1aWxkX29sZF9saWJzPXllcwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgY2FzZSAiJHVzZXJfdGFyZ2V0IiBpbgotICAgICAgbmV4dCkKLQkjIFRoZSBuZXh0IG9uZSBpcyB0aGUgLW8gdGFyZ2V0IG5hbWUKLQl1c2VyX3RhcmdldD15ZXMKLQljb250aW51ZQotCTs7Ci0gICAgICB5ZXMpCi0JIyBXZSBnb3QgdGhlIG91dHB1dCBmaWxlCi0JdXNlcl90YXJnZXQ9c2V0Ci0JbGlib2JqPSIkYXJnIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgotICAgICAgbGFzdGFyZz0iJHNyY2ZpbGUiCi0gICAgICBzcmNmaWxlPSIkYXJnIgotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotCi0gICAgICAjIEJhY2tzbGFzaGlmeSBhbnkgYmFja3NsYXNoZXMsIGRvdWJsZSBxdW90ZXMsIGFuZCBkb2xsYXIgc2lnbnMuCi0gICAgICAjIFRoZXNlIGFyZSB0aGUgb25seSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIHNwZWNpYWxseQotICAgICAgIyBpbnRlcnByZXRlZCBpbnNpZGUgb2YgZG91YmxlLXF1b3RlZCBzY3JpbmdzLgotICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0KLSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLSAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5IGluIHNjYW4KLSAgICAgICMgc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgotICAgICAgY2FzZSAiJGxhc3RhcmciIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQlsYXN0YXJnPSJcIiRsYXN0YXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBZGQgdGhlIHByZXZpb3VzIGFyZ3VtZW50IHRvIGJhc2VfY29tcGlsZS4KLSAgICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0JYmFzZV9jb21waWxlPSIkbGFzdGFyZyIKLSAgICAgIGVsc2UKLQliYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgIGNhc2UgIiR1c2VyX3RhcmdldCIgaW4KLSAgICBzZXQpCi0gICAgICA7OwotICAgIG5vKQotICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgotICAgICAgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgotICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCi0gICAgeGZvcm09J1tjQ0ZTZm1zb10nCi0gICAgY2FzZSAiJGxpYm9iaiIgaW4KLSAgICAqLmFkYSkgeGZvcm09YWRhIDs7Ci0gICAgKi5hZGIpIHhmb3JtPWFkYiA7OwotICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKLSAgICAqLmFzbSkgeGZvcm09YXNtIDs7Ci0gICAgKi5jKyspIHhmb3JtPWMrKyA7OwotICAgICouY2MpIHhmb3JtPWNjIDs7Ci0gICAgKi5jcHApIHhmb3JtPWNwcCA7OwotICAgICouY3h4KSB4Zm9ybT1jeHggOzsKLSAgICAqLmY5MCkgeGZvcm09ZjkwIDs7Ci0gICAgKi5mb3IpIHhmb3JtPWZvciA7OwotICAgIGVzYWMKLQotICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKLQotICAgIGNhc2UgIiRsaWJvYmoiIGluCi0gICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAgOzsKLSAgICAqKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICByZW1vdmVsaXN0PSIkb2JqICRsaWJvYmoiCi0gICAgZWxzZQotICAgICAgcmVtb3ZlbGlzdD0iJGxpYm9iaiIKLSAgICBmaQotCi0gICAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLSAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAxIiAxIDIgMTUKLQotICAgICMgQ2FsY3VsYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IG9iamVjdCBpZiBjb21waWxlciBkb2VzCi0gICAgIyBub3Qgc3VwcG9ydCAtbyB3aXRoIC1jCi0gICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubzsgdGhlbgotICAgICAgb3V0cHV0X29iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzJVwuLiokJSUnYC4ke29iamV4dH0KLSAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgotICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJG91dHB1dF9vYmogJGxvY2tmaWxlIgotICAgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgMSIgMSAyIDE1Ci0gICAgZWxzZQotICAgICAgbmVlZF9sb2Nrcz1ubwotICAgICAgbG9ja2ZpbGU9Ci0gICAgZmkKLQotICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCi0gICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgotICAgICAgdW50aWwgbG4gIiQwIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KLQkkc2hvdyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCi0Jc2xlZXAgMgotICAgICAgZG9uZQotICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgotICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotICAgICAgZWNobyAkc3JjZmlsZSA+ICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgotICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KLSAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQotCi0gICAgICAjIEFsbCBwbGF0Zm9ybXMgdXNlIC1EUElDLCB0byBub3RpZnkgcHJlcHJvY2Vzc2VkIGFzc2VtYmxlciBjb2RlLgotICAgICAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcGljX2ZsYWcgLURQSUMgJHNyY2ZpbGUiCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JbG9fbGlib2JqPSIkbGlib2JqIgotCWRpcj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JaWYgdGVzdCAiWCRkaXIiID0gIlgkbGlib2JqIjsgdGhlbgotCSAgZGlyPSIkb2JqZGlyIgotCWVsc2UKLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWZpCi0JbGlib2JqPSIkZGlyLyJgJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLQlpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgotCSAgJHNob3cgIiRybSAkbGlib2JqIgotCSAgJHJ1biAkcm0gJGxpYm9iagotCWVsc2UKLQkgICRzaG93ICIkbWtkaXIgJGRpciIKLQkgICRydW4gJG1rZGlyICRkaXIKLQkgIHN0YXR1cz0kPwotCSAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkZGlyOyB0aGVuCi0JICAgIGV4aXQgJHN0YXR1cwotCSAgZmkKLQlmaQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9vX2xvIiA9IHllczsgdGhlbgotCW91dHB1dF9vYmo9IiRsaWJvYmoiCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG91dHB1dF9vYmoiCi0gICAgICBlbGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCi0Jb3V0cHV0X29iaj0iJG9iaiIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKLSAgICAgIGZpCi0KLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQl0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KLQllY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCi0gICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJGxpYm9iaiI7IHRoZW4KLQkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRsaWJvYmoiCi0JaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJGxpYm9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gY29weSB0aGUgb2JqZWN0IGludG8gcGxhY2UgYW5kIGZpbmlzaC4KLSAgICAgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSMgUmVuYW1lIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyIHRvIG9iagotCWlmIHRlc3QgLWYgJG9iajsgdGhlbgotCSAgJHNob3cgJHJtICRvYmoKLQkgICRydW4gJHJtICRvYmoKLQlmaQotCi0JJHNob3cgIiRtdiAkbGlib2JqICRvYmoiCi0JaWYgJHJ1biAkbXYgJGxpYm9iaiAkb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLQotCSMgTm93IGFycmFuZ2UgdGhhdCBvYmogYW5kIGxvX2xpYm9iaiBiZWNvbWUgdGhlIHNhbWUgZmlsZQotCSRzaG93ICIkTE5fUyAkb2JqICRsb19saWJvYmoiCi0JaWYgJHJ1biAkTE5fUyAkb2JqICRsb19saWJvYmo7IHRoZW4KLQkgIGV4aXQgMAotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgotICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJwotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSIKLSAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKLQlvdXRwdXRfb2JqPSIkb2JqIgotICAgICAgZmkKLQotICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCi0gICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCi0gICAgICAkc2hvdyAiJGNvbW1hbmQiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KLQllY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCi0gICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJG9iaiI7IHRoZW4KLQkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRvYmoiCi0JaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJG9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkbyBub3QKLSAgICAgICMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQkkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotCSRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiBcJGxpYm9iaiIgfHwgZXhpdCAkPwotICAgICAgZWxzZQotCSMgTW92ZSB0aGUgLmxvIGZyb20gd2l0aGluIG9iamRpcgotCSRzaG93ICIkbXYgJGxpYm9iaiAkbG9fbGlib2JqIgotCWlmICRydW4gJG12ICRsaWJvYmogJGxvX2xpYm9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICAgICAkcm0gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgbGluayBtb2RlCi0gIGxpbmspCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogbGluayIKLSAgICBDX2NvbXBpbGVyPSIkQ0MiICMgc2F2ZSBpdCwgdG8gY29tcGlsZSBnZW5lcmF0ZWQgQyBzb3VyY2VzCi0gICAgIyBDWUdOVVMgTE9DQUw6IHRyb21leS9qYXZhCi0gICAgIyBBbHdheXMgcmVzcGVjdCB0aGUgQ0MgY29uZmlndXJlZCBpbiBieSBsdGNvbmZpZy4KLSAgICAjIENDPSIkbm9ub3B0IgotICAgICMgRU5EIENZR05VUyBMT0NBTAotICAgIGNhc2UgIiRob3N0IiBpbgotICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAotICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAotICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQotICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9rYXRpb24uCi0gICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubwotCi0gICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKLSAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90Ci0gICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQotICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCi0gICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotCi0gICAgICAjIFRoaXMgaXMgYSBzb3VyY2UgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGRsbHMgb24gV2luZG93cwotICAgICAgIyBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKLSMgLyogbHRkbGwuYyBzdGFydHMgaGVyZSAqLwotIyAjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSMgI3VuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jCi0jIEJPT0wgQVBJRU5UUlkgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCk7Ci0jCi0jICNpbmNsdWRlIDxjeWd3aW4vY3lnd2luX2RsbC5oPgotIyBERUNMQVJFX0NZR1dJTl9ETEwoIERsbE1haW4gKTsKLSMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7Ci0jCi0jIEJPT0wgQVBJRU5UUlkKLSMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKLSMgewotIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKLSMgICByZXR1cm4gVFJVRTsKLSMgfQotIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLwotICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBpbXBvcnQgbGlicmFyaWVzCi0gICAgICAjIG9uIFdpbmRvd3MgZm9yIGRsbHMgd2hpY2ggbGFjayB0aGVtLiBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUKLSAgICAgICMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKLSMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KLSMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIAotIyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGxpYnRvb2wuCi0jIAotIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMgICovCi0jIAotIyAgI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmKCkgKi8KLSMgICNpbmNsdWRlIDx1bmlzdGQuaD4JCS8qIGZvciBvcGVuKCksIGxzZWVrKCksIHJlYWQoKSAqLwotIyAgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCi0jICAjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmb3Igc3RyZHVwKCkgKi8KLSMgCi0jICBzdGF0aWMgdW5zaWduZWQgaW50Ci0jICBwZV9nZXQxNiAoZmQsIG9mZnNldCkKLSMgICAgICAgaW50IGZkOwotIyAgICAgICBpbnQgb2Zmc2V0OwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyIGJbMl07Ci0jICAgIGxzZWVrIChmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0jICAgIHJlYWQgKGZkLCBiLCAyKTsKLSMgICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci0jICB9Ci0jIAotIyAgc3RhdGljIHVuc2lnbmVkIGludAotIyAgcGVfZ2V0MzIgKGZkLCBvZmZzZXQpCi0jICAgICAgaW50IGZkOwotIyAgICAgIGludCBvZmZzZXQ7Ci0jICB7Ci0jICAgIHVuc2lnbmVkIGNoYXIgYls0XTsKLSMgICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSMgICAgcmVhZCAoZmQsIGIsIDQpOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyAgfQotIyAKLSMgIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgIHBlX2FzMzIgKHB0cikKLSMgICAgICAgdm9pZCAqcHRyOwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyAgfQotIyAKLSMgIGludAotIyAgbWFpbiAoYXJnYywgYXJndikKLSMgICAgICBpbnQgYXJnYzsKLSMgICAgICBjaGFyICphcmd2W107Ci0jICB7Ci0jICAgICAgaW50IGRsbDsKLSMgICAgICB1bnNpZ25lZCBsb25nIHBlX2hlYWRlcl9vZmZzZXQsIG9wdGhkcl9vZnMsIG51bV9lbnRyaWVzLCBpOwotIyAgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7Ci0jICAgICAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG5leHA7Ci0jICAgICAgdW5zaWduZWQgY2hhciAqZXhwZGF0YSwgKmVydmE7Ci0jICAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKLSMgCi0jICAgICAgZmlsZW5hbWUgPSBhcmd2WzFdOwotIyAKLSMgICAgICBkbGwgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7Ci0jICAgICAgaWYgKCFkbGwpCi0jICAJcmV0dXJuIDE7Ci0jIAotIyAgICAgIGRsbF9uYW1lID0gZmlsZW5hbWU7Ci0jICAgIAotIyAgICAgIGZvciAoaT0wOyBmaWxlbmFtZVtpXTsgaSsrKQotIyAgCWlmIChmaWxlbmFtZVtpXSA9PSAnLycgfHwgZmlsZW5hbWVbaV0gPT0gJ1xcJyAgfHwgZmlsZW5hbWVbaV0gPT0gJzonKQotIyAgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKLSMgCi0jICAgICAgcGVfaGVhZGVyX29mZnNldCA9IHBlX2dldDMyIChkbGwsIDB4M2MpOwotIyAgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOwotIyAgICAgIG51bV9lbnRyaWVzID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDkyKTsKLSMgCi0jICAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLwotIyAgCXJldHVybiAxOwotIyAKLSMgICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKLSMgICAgICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOwotIyAgICAgIG5zZWN0aW9ucyA9IHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsyKTsKLSMgICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCi0jICAJICAgICAgcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAxNikpOwotIyAKLSMgICAgICBleHBwdHIgPSAwOwotIyAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdGlvbnM7IGkrKykKLSMgICAgICB7Ci0jICAJY2hhciBzbmFtZVs4XTsKLSMgIAl1bnNpZ25lZCBsb25nIHNlY3B0cjEgPSBzZWNwdHIgKyA0MCAqIGk7Ci0jICAJdW5zaWduZWQgbG9uZyB2YWRkciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxMik7Ci0jICAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7Ci0jICAJdW5zaWduZWQgbG9uZyBmcHRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDIwKTsKLSMgIAlsc2VlayhkbGwsIHNlY3B0cjEsIFNFRUtfU0VUKTsKLSMgIAlyZWFkKGRsbCwgc25hbWUsIDgpOwotIyAgCWlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKLSMgIAl7Ci0jICAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgIAkgICAgaWYgKGV4cG9ydF9ydmEgKyBleHBvcnRfc2l6ZSA+IHZhZGRyICsgdnNpemUpCi0jICAJCWV4cG9ydF9zaXplID0gdnNpemUgLSAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgIAkgICAgYnJlYWs7Ci0jICAJfQotIyAgICAgIH0KLSMgCi0jICAgICAgZXhwZGF0YSA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoZXhwb3J0X3NpemUpOwotIyAgICAgIGxzZWVrIChkbGwsIGV4cHB0ciwgU0VFS19TRVQpOwotIyAgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOwotIyAgICAgIGVydmEgPSBleHBkYXRhIC0gZXhwb3J0X3J2YTsKLSMgCi0jICAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOwotIyAgICAgIG5hbWVfcnZhcyA9IHBlX2FzMzIgKGV4cGRhdGErMzIpOwotIyAKLSMgICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKLSMgICAgICBmb3IgKGkgPSAwOyBpPG5leHA7IGkrKykKLSMgICAgICB7Ci0jICAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7Ci0jICAJcHJpbnRmICgiXHQlcyBAICVsZCA7XG4iLCBlcnZhK25hbWVfcnZhLCAxKyBpKTsKLSMgICAgICB9Ci0jIAotIyAgICAgIHJldHVybiAwOwotIyAgfQotIyAvKiBpbXBnZW4uYyBlbmRzIGhlcmUgKi8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGNvbXBpbGVfY29tbWFuZD0iJENDIgotICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRDQyIKLQotICAgIGNvbXBpbGVfcnBhdGg9Ci0gICAgZmluYWxpemVfcnBhdGg9Ci0gICAgY29tcGlsZV9zaGxpYnBhdGg9Ci0gICAgZmluYWxpemVfc2hsaWJwYXRoPQotICAgIGNvbnZlbmllbmNlPQotICAgIG9sZF9jb252ZW5pZW5jZT0KLSAgICBkZXBsaWJzPQotICAgIGxpbmtvcHRzPQotCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCi0gICAgICBldmFsIGxpYl9zZWFyY2hfcGF0aD1cYFwkZWNobyBcIlggXCR7JHNobGlicGF0aF92YXJ9XCIgXHwgXCRYc2VkIC1lIFwncy86LyAvZ1wnXGAKLSAgICBlbHNlCi0gICAgICBsaWJfc2VhcmNoX3BhdGg9Ci0gICAgZmkKLSAgICAjIG5vdyBwcmVwZW5kIHRoZSBzeXN0ZW0tc3BlY2lmaWMgb25lcwotICAgIGV2YWwgbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wkbGliX3NlYXJjaF9wYXRoXCIKLSAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCi0gICAgCi0gICAgYXZvaWRfdmVyc2lvbj1ubwotICAgIGRsZmlsZXM9Ci0gICAgZGxwcmVmaWxlcz0KLSAgICBkbHNlbGY9bm8KLSAgICBleHBvcnRfZHluYW1pYz1ubwotICAgIGV4cG9ydF9zeW1ib2xzPQotICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQotICAgIGdlbmVyYXRlZD0KLSAgICBsaWJvYmpzPQotICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9Ci0gICAgbHRsaWJzPQotICAgIG1vZHVsZT1ubwotICAgIG9ianM9Ci0gICAgcHJlbG9hZD1ubwotICAgIHByZXY9Ci0gICAgcHJldmFyZz0KLSAgICByZWxlYXNlPQotICAgIHJwYXRoPQotICAgIHhycGF0aD0KLSAgICBwZXJtX3JwYXRoPQotICAgIHRlbXBfcnBhdGg9Ci0gICAgdGhyZWFkX3NhZmU9bm8KLSAgICB2aW5mbz0KLQotICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMpCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtYWxsLXN0YXRpYyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCi0JZmkKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQlidWlsZF9vbGRfbGlicz15ZXMKLQlicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgotICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKLQotICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgotICAgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICIkcHJldiIgaW4KLQlvdXRwdXQpCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJHByZXYiIGluCi0JZGxmaWxlc3xkbHByZWZpbGVzKQotCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KLQkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBwcmVsb2FkPXllcwotCSAgZmkKLQkgIGNhc2UgIiRhcmciIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgc2VsZikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCi0JICAgICAgZGxzZWxmPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKLQkgICAgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgICBwcmV2PQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICAgIGV4aXQgMQotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlleHBzeW1zX3JlZ2V4KQotCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcmVsZWFzZSkKLQkgIHJlbGVhc2U9Ii0kYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJwYXRoKQotCSAgcnBhdGg9IiRycGF0aCAkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXhycGF0aCkKLQkgIHhycGF0aD0iJHhycGF0aCAkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCSopCi0JICBldmFsICIkcHJldj1cIlwkYXJnXCIiCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgcHJldmFyZz0iJGFyZyIKLQotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYXZvaWQtdmVyc2lvbikKLQlhdm9pZF92ZXJzaW9uPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLQlwcmV2PWRsZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0JcHJldj1kbHByZWZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0JaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiAhPSB5ZXM7IHRoZW4KLQkgIGV4cG9ydF9keW5hbWljPXllcwotCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLQkgIGVsc2UKLQkgICAgYXJnPQotCSAgZmkKLQlmaQotCTs7Ci0KLSAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMiCi0JICBleGl0IDEKLQlmaQotCWlmIHRlc3QgIiRhcmciID0gIi1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtTCopCi0JZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi1MXCguKlwpJCVcMSUnYAotCWNhc2UgIiRkaXIiIGluCi0JLyogfCBbQS1aYS16XTpbL1xcXSopCi0JICAjIEFkZCB0aGUgY29ycmVzcG9uZGluZyBoYXJkY29kZV9saWJkaXJfZmxhZywgaWYgaXQgaXMgbm90IGlkZW50aWNhbC4KLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgLUwkZGlyJyBjYW5ub3Qgc3BlY2lmeSBhIHJlbGF0aXZlIGRpcmVjdG9yeSIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQljYXNlICIgJGRlcGxpYnMgIiBpbgotCSoiICRhcmcgIiopIDs7Ci0JKikgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyI7OwotCWVzYWMKLQljYXNlICIgJGxpYl9zZWFyY2hfcGF0aCAiIGluCi0JKiIgJGRpciAiKikgOzsKLQkqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciI7OwotCWVzYWMKLQljYXNlICIkaG9zdCIgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKLQkgIGRsbHNlYXJjaGRpcj1gY2QgIiRkaXIiICYmIHB3ZCB8fCBlY2hvICIkZGlyImAKLQkgIGNhc2UgIjokZGxsc2VhcmNocGF0aDoiIGluCi0JICA6OikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaGRpciI7OwotCSAgKiI6JGRsbHNlYXJjaGRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkbGxzZWFyY2hkaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIC1sKikKLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCTs7Ci0KLSAgICAgIC1tb2R1bGUpCi0JaWYgdGVzdCAiJG1vZHVsZSIgIT0geWVzOyB0aGVuCi0JICBtb2R1bGU9eWVzCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCSAgZWxzZQotCSAgICBhcmc9Ci0JICBmaQotCWZpCi0JOzsKLQkKLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0JcHJldj1ycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIpCi0JcHJldj14cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKikKLQl4cnBhdGg9IiR4cnBhdGggImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXN0YXRpYykKLQkjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gdGhpcyBpcyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYy4KLQlpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC10aHJlYWQtc2FmZSkKLQl0aHJlYWRfc2FmZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLWluZm8pCi0JcHJldj12aW5mbwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCi0gICAgICAtKiB8ICsqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgIiRhcmciIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLQotICAgICAgKi5vIHwgKi5vYmogfCAqLmEgfCAqLmxpYikKLQkjIEEgc3RhbmRhcmQgb2JqZWN0LgotCW9ianM9IiRvYmpzICRhcmciCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEEgbGlicmFyeSBvYmplY3QuCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW4iID0geWVzOyB0aGVuCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICBlbHNlCi0JICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgIHByZXY9ZGxwcmVmaWxlcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIHByZXY9Ci0JZmkKLQlsaWJvYmpzPSIkbGlib2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0JZGxuYW1lPQotCWxpYmRpcj0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGFyZyB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAotCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGUgaW5zdGFsbGVkLgotCWluc3RhbGxlZD15ZXMKLQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgIiRhcmciIGluCi0JKi8qIHwgKlxcKikgLiAkYXJnIDs7Ci0JKikgLiAuLyRhcmcgOzsKLQllc2FjCi0KLQkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCi0JbGlua2xpYj0KLQlmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCi0JICBsaW5rbGliPSIkbCIKLQlkb25lCi0KLQlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCi0JbmFtZT1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLQotCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KLQkgIGRpcj0iJGxpYmRpciIKLQllbHNlCi0JICBkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgaWYgdGVzdCAiWCRkaXIiID0gIlgkYXJnIjsgdGhlbgotCSAgICBkaXI9IiRvYmpkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGRpci8kb2JqZGlyIgotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyI7IHRoZW4KLQkgICMgRXh0cmFjdCAtUiBmcm9tIGRlcGVuZGVuY3lfbGlicwotCSAgdGVtcF9kZXBsaWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBjYXNlICIkZGVwbGliIiBpbgotCSAgICAtUiopIHRlbXBfeHJwYXRoPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCQkgY2FzZSAiICRycGF0aCAkeHJwYXRoICIgaW4KLQkJICoiICR0ZW1wX3hycGF0aCAiKikgOzsKLQkJICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKLQkJIGVzYWM7OwotCSAgICAtTCopIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgJHRlbXBfZGVwbGlicyAiIGluCi0JCSAqIiAkZGVwbGliICIqKSA7OwotCQkgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRkZXBsaWIiOzsKLQkJIGVzYWM7OwotCSAgICAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX2RlcGxpYnMiCi0JZmkKLQotCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCi0JICBjb252ZW5pZW5jZT0iJGNvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgZGVwbGlicz0iJGRlcGxpYnMkZGVwZW5kZW5jeV9saWJzIgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgotCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fCB0ZXN0ICIkZGxvcGVuIiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAotCSAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgcHJldj1kbHByZWZpbGVzCi0JICBlbHNlCi0JICAgICMgV2Ugc2hvdWxkIG5vdCBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbGlicmFyeSwgYnV0IHdlCi0JICAgICMgbWF5IG5lZWQgYW55IGxpYnJhcmllcyBpdCByZXF1aXJlcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgZmkKLQlmaQotCi0JIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKLQkgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgIGVsc2UKLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLQkgIGZpCi0JICBwcmV2PQotCWZpCi0KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KLQkgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9IiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzICRhcmciCi0JICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRkaXIiIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0KLQkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCSAgY2FzZSAiJGRpciIgaW4KLQkgIC8qIHwgW0EtWmEtel06Wy9cXF0qKSBhYnNkaXI9IiRkaXIiIDs7Ci0JICAqKQotCSAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JICAgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsaWJkaXInIiAxPiYyCi0JICAgICAgZXhpdCAxCi0JICAgIGZpCi0JICAgIDs7Ci0JICBlc2FjCi0JICAKLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLQkgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKLQkgICMgc2VhcmNoIHBhdGgsIHVubGVzcyB0aGV5IGhhdmUgYmVlbiByZXF1ZXN0ZWQgd2l0aCAtUi4KLQkgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLSAJICAqIiAkYWJzZGlyICIqKSA7OwotCSAgKikKLQkgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIiAKLQkgICAgZXNhYwotCSAgICA7OwotIAkgIGVzYWMKLQotCSAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotIAkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKQotCSAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCi0JICAgIGVzYWMKLQkgICAgOzsKLSAJICBlc2FjCi0KLQkgIGxpYl9saW5rZWQ9eWVzCi0JICBjYXNlICIkaGFyZGNvZGVfYWN0aW9uIiBpbgotCSAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkZGlyLyRsaW5rbGliIgotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCQlkbGxzZWFyY2hkaXI9YGNkICIkZGlyIiAmJiBwd2QgfHwgZWNobyAiJGRpciJgCi0JCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCQkgIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkbGxzZWFyY2hkaXIiCi0JCWVsc2UKLQkJICBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNoZGlyIgotCQlmaQotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICotKi1zdW5vcyopCi0JCWNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIC1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLQkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KLQkgICAgICAqIjokZGlyOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgbGliX2xpbmtlZD1ubwotCSAgICBmaQotCSAgICA7OwotCi0JICByZWxpbmspCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhYnNkaXIvJGxpbmtsaWIiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgJGFic2Rpci8kbGlua2xpYiIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgICAqIiAtTCRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGFic2RpciI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtTCRhYnNkaXIgLWwkbmFtZSIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KLQkgICAgICAqIjokYWJzZGlyOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWJzZGlyOiI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgbGliX2xpbmtlZD1ubwotCSAgICBmaQotCSAgICA7OwotCi0JICAqKQotCSAgICBsaWJfbGlua2VkPW5vCi0JICAgIDs7Ci0JICBlc2FjCi0KLQkgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKLQkgICAgZXhpdCAxCi0JICBmaQotCi0JICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpYmRpci8kbGlua2xpYiIKLQkgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkbGliZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgY2FzZSAiOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IiBpbgotCSAgICAqIjokbGliZGlyOiIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBlbHNlCi0JICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZmkKLQllbHNlCi0JICAjIFRyYW5zZm9ybSBkaXJlY3RseSB0byBvbGQgYXJjaGl2ZXMgaWYgd2UgZG9uJ3QgYnVpbGQgbmV3IGxpYnJhcmllcy4KLQkgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgJiYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBzdGF0aWMgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgZWxzZQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIjs7Ci0JICAgIGVzYWMKLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZmkKLQlmaQotCi0JIyBBZGQgaW4gYW55IGxpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBvbGRsaWJzPQotICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKLSAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgotCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAiIikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotCi0gICAgKi5hIHwgKi5saWIpCi0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgbGlidG9vbCBsaWJyYXJpZXMgaW50byBhcmNoaXZlcyIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBvbGRsaWJzPSIkb3V0cHV0IgotICAgICAgOzsKLQotICAgICoubGEpCi0gICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCi0gICAgICBjYXNlICIkb3V0cHV0bmFtZSIgaW4KLSAgICAgIGxpYiopCi0JbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotCWV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRtb2R1bGUiID0gbm87IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgotCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAotCSAgbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCWVsc2UKLQkgIGxpYm5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCi0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIlgkb3V0cHV0X29iamRpciIgPSAiWCRvdXRwdXQiOyB0aGVuCi0Jb3V0cHV0X29iamRpcj0iJG9iamRpciIKLSAgICAgIGVsc2UKLQlvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgotICAgICAgZmkKLQotICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgotICAgICAgbGlicmFyeV9uYW1lcz0KLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgZGxuYW1lPQotCi0gICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzOiRvYmpzIiAyPiYxCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEhvdyB0aGUgaGVjayBhcmUgd2Ugc3VwcG9zZWQgdG8gd3JpdGUgYSB3cmFwcGVyIGZvciBhIHNoYXJlZCBsaWJyYXJ5PwotICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBzaGFyZWQgbGlicmFyaWVzIGludG8gbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLQkgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIHNldCBkdW1teSAkcnBhdGgKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgotICAgICAgZmkKLSAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKLQotICAgICAgb2xkbGlicz0KLSAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KLQkgIGxpYmV4dD1hbAotCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQotCSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JZmkKLQlkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWJzIgotCi0JaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotICAgICAgZWxzZQotCi0JIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLQlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotCXNldCBkdW1teSAkdmluZm8gMCAwIDAKLQlJRlM9IiRzYXZlX2lmcyIKLQotCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQljdXJyZW50PSIkMiIKLQlyZXZpc2lvbj0iJDMiCi0JYWdlPSIkNCIKLQotCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0JY2FzZSAiJGN1cnJlbnQiIGluCi0JMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJHJldmlzaW9uIiBpbgotCTAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJGFnZSIgaW4KLQkwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAkYWdlIC1ndCAkY3VycmVudDsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KLQltYWpvcj0KLQl2ZXJzdWZmaXg9Ci0JdmVyc3RyaW5nPQotCWNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0Jbm9uZSkgOzsKLQotCWlyaXgpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgotCSAgdmVyc3RyaW5nPSJzZ2kkbWFqb3IuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kcmV2aXNpb24KLQkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJHJldmlzaW9uIC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9InNnaSRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKLQkgIGRvbmUKLQkgIDs7Ci0KLQlsaW51eCkKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlvc2YpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRhZ2UKLQkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotCSAgZG9uZQotCi0JICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotCSAgOzsKLQotCXN1bm9zKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlmcmVlYnNkLWFvdXQpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKLQkgIDs7Ci0KLQlmcmVlYnNkLWVsZikKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudCI7Ci0JICA7OwotCi0Jd2luZG93cykKLQkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seQotCSAgIyB3YW50IG9uZSBleHRlbnNpb24gb24gV2luZG93cyA5NS4KLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLSRtYWpvci0kYWdlLSRyZXZpc2lvbiIKLQkgIDs7Ci0KLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCi0JICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCi0JaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3RyaW5nPSIwLjAiCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQkKLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCi0JaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgIGZpCi0JZWxzZQotCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCi0JZmkKLQotCWRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0JICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCi0JICA7OwotCSopCi0JICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMuCi0JICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBvciByZW1vdmUgb3VyIG91dHB1dHMgaWYgd2UgbmVlZCB0by4KLSAgICAgIGlmIHRlc3QgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KLQkkc2hvdyAiJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKiIKLQkkcnVuICR7cm19ciAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioKLSAgICAgIGVsc2UKLQkkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotCSRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KLQlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCi0JIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgotCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KLQluYW1lX3NhdmU9JG5hbWUKLQlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKLQlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKLQl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4Ci0JbWFqb3Jfc2F2ZT0kbWFqb3IKLQkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluawotCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bwotCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PwotCXJlbGVhc2U9IiIKLQl2ZXJzdWZmaXg9IiIKLQltYWpvcj0iIgotCW5ld2RlcGxpYnM9Ci0JZHJvcHBlZGRlcHM9bm8KLQljYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCi0JcGFzc19hbGwpCi0JICBuZXdkZXBsaWJzPSRkZXBsaWJzCi0JCSAgICA7OyAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KLQkJICAgICAgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKLQkJICAgICAgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KLQkJICAgICAgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAotCQkgICAgICAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3VyLgotCXRlc3RfY29tcGlsZSkKLQkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCi0JICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAotCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKLQkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgotCSAgJHJtIGNvbmZ0ZXN0LmMKLQkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLQkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQotRU9GCi0JICAkcm0gY29uZnRlc3QKLQkgICRDX2NvbXBpbGVyIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnMKLQkgIGlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCi0JICAgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgbmFtZT0iYGV4cHIgJGkgOiAnLWxcKC4qXCknYCIKLQkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcwotCQlkZXBsaWJfbWF0Y2g9JDIKLQkJaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQllbHNlCi0JCSAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgZWNobwotCQkgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRpLiIKLQkJICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGVsc2UKLQkgICAgIyBFcnJvciBvY2N1cmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UgdGhlIHNpdHVhdGlvbjoKLQkgICAgIyBDb21waWxlIGEgc2VwZXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgotCSAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiIDsgdGhlbgotCQkkcm0gY29uZnRlc3QKLQkJJENfY29tcGlsZXIgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQotCQkjIERpZCBpdCB3b3JrPwotCQlpZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgotCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkJICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCi0JCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCSAgICBkZXBsaWJfbWF0Y2g9JDIKLQkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICBlbHNlCi0JCSAgICAgIGRyb3BwZWRkZXBzPXllcwotCQkgICAgICBlY2hvCi0JCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRpLiIKLQkJICAgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICAgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkJICAgIGZpCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICBlY2hvCi0JCSAgZWNobyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgotCQkgIGVjaG8gIioqKiAgbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCi0JCSAgZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKLQkJICBlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQkgIGRlcGxpYnM9JG5ld2RlcGxpYnMKLQkgIDs7Ci0JZmlsZV9tYWdpYyopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0JICBmaWxlX21hZ2ljX3JlZ2V4PSJgZXhwciBcIiRkZXBsaWJzX2NoZWNrX21ldGhvZFwiIDogXCIkMiBcKC4qXClcImAiCi0JICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICAgIG5hbWU9ImBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgIgotCSAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiIDsgdGhlbgotCSAgICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkgICAgICBmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoOyBkbwotCQkgICAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCi0JCSAgICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCi0JCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCi0JCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RsaWIiIDI+L2Rldi9udWxsIFwKLQkJCSB8IGdyZXAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KLQkJCWNvbnRpbnVlIAotCQkgICAgICBmaQotCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KLQkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgotCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCi0JCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKLQkJICAgICAgIyBidXQgc28gd2hhdD8KLQkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKLQkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCi0JCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8IHNlZCAncy8uKiAtPiAvLydgCi0JCQljYXNlICIkcG90bGlibGluayIgaW4KLQkJCS8qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7Ci0JCQkqKSBwb3RsaWI9YCRlY2hvICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7Ci0JCQllc2FjCi0JCSAgICAgIGRvbmUKLQkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIFwKLQkJCSB8IHNlZCAxMHEgXAotCQkJIHwgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkJYV9kZXBsaWI9IiIKLQkJCWJyZWFrIDIKLQkJICAgICAgZmkKLQkJICAgIGRvbmUKLQkgICAgICBkb25lCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJZHJvcHBlZGRlcHM9eWVzCi0JCWVjaG8KLQkJZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGFfZGVwbGliLiIKLQkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KLQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JICAgIGZpCi0JICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgotCSAgOzsKLQlub25lIHwgdW5rbm93biB8ICopIG5ld2RlcGxpYnM9IiIKLQkgIGlmICRlY2hvICJYICRkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMkLy8nIFwKLQkgICAgICAgLWUgJ3MvIC1bTFJdW14gXSovL2cnIC1lICdzL1sgCV0vL2cnIHwKLQkgICAgIGdyZXAgLiA+L2Rldi9udWxsOyB0aGVuCi0JICAgIGVjaG8KLQkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCi0JICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcGxhdGZvcm0uIgotCSAgICBlbHNlCi0JICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKLQkgICAgZmkKLQkgICAgZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCi0JICAgIGRyb3BwZWRkZXBzPXllcwotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKLQltYWpvcj0kbWFqb3Jfc2F2ZQotCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQotCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQotCW5hbWU9JG5hbWVfc2F2ZQotCi0JaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgZWNobwotCSAgICBlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKLQkgICAgZWNobyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCi0JICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgotCSAgICBlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCi0JICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICAgICAgZWNobwotCSAgICAgIGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgotCSAgICAgIGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JICAgICAgZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCSAgICAgIGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgZWxzZQotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBmaQotCSAgICBkbG5hbWU9Ci0JICAgIGxpYnJhcnlfbmFtZXM9Ci0JICBlbHNlCi0JICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCi0JICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCi0JICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgdGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JZGVwbGlicz0kbmV3ZGVwbGlicwotCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQotIAotCSMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgotCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCXJlYWxuYW1lPSIkMiIKLQlzaGlmdDsgc2hpZnQKLQotCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKLQllbHNlCi0JICBzb25hbWU9IiRyZWFsbmFtZSIKLQlmaQotCi0JbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCi0JZm9yIGxpbmsKLQlkbwotCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgotCWRvbmUKLQotCSMgRW5zdXJlIHRoYXQgd2UgaGF2ZSAubyBvYmplY3RzIGZvciBsaW5rZXJzIHdoaWNoIGRpc2xpa2UgLmxvCi0JIyAoZS5nLiBhaXgpIGluY2FzZSB3ZSBhcmUgcnVubmluZyAtLWRpc2FibGUtc3RhdGljCi0JZm9yIG9iaiBpbiAkbGlib2JqczsgZG8KLQkgIG9sZG9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICB0ZXN0IC1mICRvbGRvYmogfHwgJHtMTl9TfSAkb2JqICRvbGRvYmoKLQlkb25lCi0KLQkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYwotCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0JaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIGZpCi0JZWxzZQotCSAgZm9yIHhsaWIgaW4gJGNvbnZlbmllbmNlOyBkbwotCSAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0JICAgIHhkaXI9IiR4bGliIngKLQkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICR4ZGlyIgotCSAgICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLQkgICAgJHNob3cgIiR7cm19ciAkeGRpciIKLQkgICAgJHJ1biAke3JtfXIgIiR4ZGlyIgotCSAgICAkc2hvdyAibWtkaXIgJHhkaXIiCi0JICAgICRydW4gbWtkaXIgIiR4ZGlyIgotCSAgICBzdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICAgICAgZXhpdCAkc3RhdHVzCi0JICAgIGZpCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggLi4vJHhsaWIpIgotCSAgICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggLi4vXCR4bGliKSIgfHwgZXhpdCAkPwotCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICJgZmluZCAkeGRpciAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCi0JICBkb25lCi0JZmkKLQotCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgotCi0JICBsaW5rb3B0cz0iJGxpbmtvcHRzICRmbGFnIgotCWZpCi0KLQkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICBleHBvcnRfc3ltYm9scz0iJG9iamRpci8kbGlibmFtZS5leHAiCi0JICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICBldmFsIGNtZHM9XCIkZXhwb3J0X3N5bWJvbHNfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkc2hvdyAiZWdyZXAgLWUgXCIkZXhwb3J0X3N5bWJvbHNfcmVnZXhcIiBcIiRleHBvcnRfc3ltYm9sc1wiID4gXCIke2V4cG9ydF9zeW1ib2xzfVRcIiIKLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCi0JICAgICAgJHNob3cgIiRtdiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIiCi0JICAgICAgJHJ1biBldmFsICckbXYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGZpCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAkcnVuIGV2YWwgJyRlY2hvICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiRleHBvcnRfc3ltYm9scyInCi0JZmkKLQotCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgotCWVsc2UKLQkgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2NtZHNcIgotCWZpCi0JSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICAkc2hvdyAiJGNtZCIKLQkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQotCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCi0JZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCi0JICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLQkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgotCSAgZGxuYW1lPSIkc29uYW1lIgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgICoubG8gfCAqLm8gfCAqLm9iaikKLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIG9iamVjdHMiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICAgKi5sbykKLQlpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQlsaWJvYmo9IiRvdXRwdXQiCi0Jb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQk7OwotICAgICAgKikKLQlsaWJvYmo9Ci0Jb2JqPSIkb3V0cHV0IgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0gICAgICBvdXRwdXQ9IiRvYmoiCi0gICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCi0gICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiBleGl0IDAKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKLQkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgotCSRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0JJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KLQlleGl0IDAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KLQkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgotCXJlbG9hZF9vYmpzPSIkbGlib2JqcyIKLQlvdXRwdXQ9IiRsaWJvYmoiCi0JZXZhbCBjbWRzPVwiJHJlbG9hZF9jbWRzXCIKLQlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCWZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgICRzaG93ICIkY21kIgotCSAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotICAgICAgZWxzZQotCSMgSnVzdCBjcmVhdGUgYSBzeW1saW5rLgotCSRzaG93ICRybSAkbGlib2JqCi0JJHJ1biAkcm0gJGxpYm9iagotCSRzaG93ICIkTE5fUyAkb2JqICRsaWJvYmoiCi0JJHJ1biAkTE5fUyAkb2JqICRsaWJvYmogfHwgZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgZXhpdCAwCi0gICAgICA7OwotCi0gICAgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCi0gICAgKikKLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJHByZWxvYWQiID0geWVzOyB0aGVuCi0JaWYgdGVzdCAiJGRsb3BlbiIgPSB1bmtub3duICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duICYmCi0JICAgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYEFDX0xJQlRPT0xfRExPUEVOJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgotCWZpIAotICAgICAgZmkKLSAgICAKLSAgICAgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzICYmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBcYC1kbG9wZW4gc2VsZicgcmVxdWlyZXMgXGAtZXhwb3J0LWR5bmFtaWMnIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgotCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KLQlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbwotCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgotCSAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBjb21waWxlX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgotCW91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCi0gICAgICBlbHNlCi0Jb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotICAgICAgZmkKLQotICAgICAgZGxzeW1zPQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JY2FzZSAiJGRsc3ltcyIgaW4KLQkiIikgOzsKLQkqLmMpCi0JICAjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgotCSAgbmxpc3Q9IiRvYmpkaXIvJHtvdXRwdXR9Lm5tIgotCi0JICBpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4KLQkgICAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKLQkgIGVsc2UKLQkgICAgJHNob3cgIiRta2RpciAkb2JqZGlyIgotCSAgICAkcnVuICRta2RpciAkb2JqZGlyCi0JICAgIHN0YXR1cz0kPwotCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvYmpkaXI7IHRoZW4KLQkgICAgICBleGl0ICRzdGF0dXMKLQkgICAgZmkKLQkgIGZpCi0KLQkgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCi0JICAkc2hvdyAiY3JlYXRpbmcgJG9iamRpci8kZGxzeW1zIgotCi0JICAkZWNobyA+ICIkb2JqZGlyLyRkbHN5bXMiICJcCi0vKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KLS8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gXCJDXCIgewotI2VuZGlmCi0KLS8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCi0jZGVmaW5lIGx0X3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCi0iCi0KLQkgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgotCi0JICAgIGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgotCi0JICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KLQkgICAgcHJvZ2ZpbGVzPWAkZWNobyAiWCRvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JICAgIGZvciBhcmcgaW4gJHByb2dmaWxlczsgZG8KLQkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKLQkgICAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgICAgZG9uZQotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICdlZ3JlcCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgICAgCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQotCSAgICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCSAgICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvYmpkaXIvJG91dHB1dC5leHAiCi0JICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgICAgJHJ1biBldmFsICJzZWQgLW4gLWUgJy9eOiBAUFJPR1JBTUAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICBlbHNlCi0JICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgICAgJHJ1biBldmFsICJzZWQgLWUgJ3MvXChbXVsuKl4kXVwpL1xcXDEvZycgLWUgJ3MvXi8gLycgLWUgJ3MvJC8kLyciJyA8ICIkZXhwb3J0X3N5bWJvbHMiID4gIiRvYmpkaXIvJG91dHB1dC5leHAiJwotCSAgICAgICRydW4gZXZhbCAnZ3JlcCAtZiAiJG9iamRpci8kb3V0cHV0LmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICBuYW1lPWBlY2hvICIkYXJnIiB8IHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAkcnVuIGV2YWwgJ2VjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KLQkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgIGVncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKLQkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCi0JICAgIGZpCi0KLQkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwgc29ydCArMiB8IHVuaXEgPiAiJG5saXN0IlM7IHRoZW4KLQkgICAgICA6Ci0JICAgIGVsc2UKLQkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJwotCSAgICBlbHNlCi0JICAgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0KLSN1bmRlZiBsdF9wcmVsb2FkZWRfc3ltYm9scwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotIgotCi0JICAgIHNlZCAtbiAtZSAncy9eOiBcKFteIF0qXCkgJC8gIHtcIlwxXCIsIChsdF9wdHJfdCkgMH0sL3AnIFwKLQkJLWUgJ3MvXi4gXChbXiBdKlwpIFwoW14gXSpcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvcCcgXAotCQkgIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0vKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KLSNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKLXN0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7Ci0gIHJldHVybiBsdF9wcmVsb2FkZWRfc3ltYm9sczsKLX0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZlwKLSIKLQkgIGZpCi0KLQkgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0KLSAgICAgICAgICBjYXNlICIkaG9zdCIgaW4KLQkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAotCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCi0JICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCi0JICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KLQkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCi0JICAqLSotZnJlZWJzZDIqfCotKi1mcmVlYnNkMy4wKikKLQkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICoiIC1zdGF0aWMgIiopIDs7Ci0JICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtRFBJQyAtREZSRUVCU0RfV09SS0FST1VORCI7OwotCSAgICBlc2FjCi0JICBlc2FjCi0KLQkgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCi0JICAkc2hvdyAiKGNkICRvYmpkaXIgJiYgJENfY29tcGlsZXIgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCi0JICAkcnVuIGV2YWwgJyhjZCAkb2JqZGlyICYmICRDX2NvbXBpbGVyIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPwotCi0JICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgotCSAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy4ke29iamV4dH0lImAKLQkgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy4ke29iamV4dH0lImAKLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gc3VmZml4IGZvciBcYCRkbHN5bXMnIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCSMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCi0JIyBsdF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQotCSMgcmVhbGx5IHdhcyByZXF1aXJlZC4KLQotCSMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCi0JIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCi0JJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0JJHJ1biBldmFsICIkbGlua19jb21tYW5kIgotCWV4aXQgJD8KLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgotCXJwYXRoPQotCWZvciBkaXIgaW4gJHRlbXBfcnBhdGg7IGRvCi0JICBjYXNlICIkZGlyIiBpbgotCSAgLyogfCBbQS1aYS16XTpbL1xcXSopCi0JICAgICMgQWJzb2x1dGUgcGF0aC4KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICA7OwotCSAgKikKLQkgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgotCSAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQl0ZW1wX3JwYXRoPSIkcnBhdGgiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBjb21waWxlX3Zhcj0KLSAgICAgIGZpbmFsaXplX3Zhcj0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLQkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCQotCSMgQUdIISBGbGFtZSB0aGUgQUlYIGFuZCBIUC1VWCBwZW9wbGUgZm9yIG1lLCB3aWxsIHlhPwotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iIDE+JjIKLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgotCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCVcJHByb2dkaXIvXCRmaWxlJWcnYAotCSAgZWxzZQotCSAgICAjIGZhc3RfaW5zdGFsbCBpcyBzZXQgdG8gbmVlZGxlc3MKLQkgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICBmaQotCWVsc2UKLQkgIGxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSAgcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAotICAgICAgCi0gICAgICAjIENyZWF0ZSB0aGUgYmluYXJ5IGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LCB0aGVuIHdyYXAgaXQuCi0gICAgICBpZiB0ZXN0ICEgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KLQkkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotCSRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb2JqZGlyOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KLSAgICAgICRydW4gJHJtICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKLQotICAgICAgJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0gICAgICAkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQotICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGZpCi0KLSAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAiWCRlY2hvIiA9ICJYJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLQljYXNlICIkMCIgaW4KLQkvKiB8IFtBLVphLXpdOlsvXFxdKikgcWVjaG89IiRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOzsKLQkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyQwIC0tZmFsbGJhY2stZWNobyI7OwotCWVzYWMKLQlxZWNobz1gJGVjaG8gIlgkcWVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZWxzZQotCXFlY2hvPWAkZWNobyAiWCRlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGZpCi0KLSAgICAgICMgT25seSBhY3R1YWxseSBkbyB0aGluZ3MgaWYgb3VyIHJ1biBjb21tYW5kIGlzIG5vbi1udWxsLgotICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKLQkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgotCWNhc2UgJG91dHB1dCBpbgotCSAgKi5leGUpIG91dHB1dD1gZWNobyAkb3V0cHV0fHNlZCAncywuZXhlJCwsJ2AgOzsKLQllc2FjCi0JJHJtICRvdXRwdXQKLQl0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAxIiAxIDIgMTUKLQotCSRlY2hvID4gJG91dHB1dCAiXAotIyEgJFNIRUxMCi0KLSMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0jCi0jIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgXCJcJHtDRFBBVEgrc2V0fVwiID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLXJlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKLQotIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgotaWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCi0gICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6Ci0gIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9JyRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzJwotZWxzZQotICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCi0gIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICBlY2hvPVwiJHFlY2hvXCIKLSAgICBmaWxlPVwiXCQwXCIKLSAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgotICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICAgICAgc2hpZnQKLSAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCi0gICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQotICAgICAgOgotICAgIGVsc2UKLSAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KLSAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQotICAgIGZpCi0gIGZpXAotIgotCSRlY2hvID4+ICRvdXRwdXQgIlwKLQotICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgotICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAotICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCi0KLSAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCi0gIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAotICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCi0gICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCi0KLSAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCi0gICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgotICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCi0gICAgICAvKiB8IFtBLVphLXpdOlsvXFxdKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7Ci0gICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLQotICAgIGZpbGU9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCi0gICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAotICBkb25lCi0KLSAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KLSAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAotICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgotIgotCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgIGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZScKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSAgCi0gIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fCBcXAotICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgc2VkIDFxXGA7IFxcCi0gICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KLQotICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCi0KLSAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgotICAgICAgJG1rZGlyIFwiXCRwcm9nZGlyXCIKLSAgICBlbHNlCi0gICAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgICBmaSIKLQotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQotICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KLSAgICAgIGlmIChjZCBcIlwkdGhpc2RpclwiICYmIGV2YWwgXCRyZWxpbmtfY29tbWFuZCk7IHRoZW4gOgotICAgICAgZWxzZQotCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotCWV4aXQgMQotICAgICAgZmkKLSAgICBmaQotCi0gICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8Ci0gICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7Ci0gICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KLSAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgZmkiCi0JZWxzZQotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09JyRvdXRwdXRuYW1lJwotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotIgotCWZpCi0KLQllY2hvID4+ICRvdXRwdXQgIlwKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0JIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCi0JaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgotCi0gICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCi0gICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKLSAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAotCi0gICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCi0iCi0JZmkKLQotCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCi0JaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKLSAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAotIgotCWZpCi0KLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KLSIKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cgfCAqLSotb3MyKikKLQkgICMgd2luMzIgc3lzdGVtcyBuZWVkIHRvIHVzZSB0aGUgcHJvZyBwYXRoIGZvciBkbGwKLQkgICMgbG9va3VwIHRvIHdvcmsKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIGV4ZWMgXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCSopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICAjIEV4cG9ydCB0aGUgcGF0aCB0byB0aGUgcHJvZ3JhbS4KLSAgICAgIFBBVEg9XCJcJHByb2dkaXI6XCRQQVRIXCIKLSAgICAgIGV4cG9ydCBQQVRICi0KLSAgICAgIGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0JZXNhYwotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZWxzZQotICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KLSAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcJHByb2dkaXIvXCRwcm9ncmFtIGRvZXMgbm90IGV4aXN0XCIgMT4mMgotICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgotICAgIGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmlcCi0iCi0JY2htb2QgK3ggJG91dHB1dAotICAgICAgZmkKLSAgICAgIGV4aXQgMAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KLSAgICBmb3Igb2xkbGliIGluICRvbGRsaWJzOyBkbwotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IGNvbnZlbmllbmNlOyB0aGVuCi0Jb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQlhZGRsaWJzPSIkY29udmVuaWVuY2UiCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBtb2R1bGU7IHRoZW4KLQkgIG9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQllbHNlCi0JICBvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianNfc2F2ZSIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmkKLQlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgotICAgICAgZmkKLQotICAgICAgIyBBZGQgaW4gbWVtYmVycyBmcm9tIGNvbnZlbmllbmNlIGFyY2hpdmVzLgotICAgICAgZm9yIHhsaWIgaW4gJGFkZGxpYnM7IGRvCi0JIyBFeHRyYWN0IHRoZSBvYmplY3RzLgotCXhkaXI9IiR4bGliIngKLQlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJHhkaXIiCi0JeGxpYj1gJGVjaG8gIlgkeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0JJHNob3cgIiR7cm19ciAkeGRpciIKLQkkcnVuICR7cm19ciAiJHhkaXIiCi0JJHNob3cgIm1rZGlyICR4ZGlyIgotCSRydW4gbWtkaXIgIiR4ZGlyIgotCXN0YXR1cz0kPwotCWlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR4ZGlyIjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLQkkc2hvdyAiKGNkICR4ZGlyICYmICRBUiB4IC4uLyR4bGliKSIKLQkkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggLi4vXCR4bGliKSIgfHwgZXhpdCAkPwotCi0Jb2xkb2Jqcz0iJG9sZG9ianMgImBmaW5kICR4ZGlyIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKLSAgICAgIGRvbmUKLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc1wiCi0gICAgICBlbHNlCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotICAgICAgZmkKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KLSAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgotICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCi0gICAgZmkKLQotICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgotICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgKi5sYSkKLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCXRlbXBfeHJwYXRoPQotCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KLQkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgotCWRvbmUKLQlkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSRlY2hvID4gJG91dHB1dCAiXAotIyAkb3V0cHV0IC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0KLSMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgotZGxuYW1lPSckZGxuYW1lJwotCi0jIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KLWxpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJwotCi0jIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KLW9sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCi0KLSMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgotZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJwotCi0jIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgotY3VycmVudD0kY3VycmVudAotYWdlPSRhZ2UKLXJldmlzaW9uPSRyZXZpc2lvbgotCi0jIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KLWluc3RhbGxlZD1ubwotCi0jIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46Ci1saWJkaXI9JyRpbnN0YWxsX2xpYmRpcidcCi0iCi0KLQkkcm0gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKLQlzZWQgJ3MvXmluc3RhbGxlZD1ubyQvaW5zdGFsbGVkPXllcy8nIFwKLQkgIDwgIiRvdXRwdXQiID4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkgfHwgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCi0gICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgotICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgotICAgICAgJHJ1biBldmFsICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIgfHwgZXhpdCAkPwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCi0gIGluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKLQotICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KLSAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaDsgdGhlbgotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgotICAgICAgYXJnPWAkZWNobyAiWCRub25vcHQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICBlbHNlCi0gICAgICBpbnN0YWxsX3Byb2c9Ci0gICAgICBhcmc9IiRub25vcHQiCi0gICAgZmkKLQotICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KLSAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgIiRhcmciIGluCi0gICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0gICAgICBhcmc9IlwiJGFyZ1wiIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKLQotICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KLSAgICBkZXN0PQotICAgIGZpbGVzPQotICAgIG9wdHM9Ci0gICAgcHJldj0KLSAgICBpbnN0YWxsX3R5cGU9Ci0gICAgaXNkaXI9bm8KLSAgICBzdHJpcG1lPQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0JZmlsZXM9IiRmaWxlcyAkZGVzdCIKLQlkZXN0PSIkYXJnIgotCWNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLWQpIGlzZGlyPXllcyA7OwotICAgICAgLWYpIHByZXY9Ii1mIiA7OwotICAgICAgLWcpIHByZXY9Ii1nIiA7OwotICAgICAgLW0pIHByZXY9Ii1tIiA7OwotICAgICAgLW8pIHByZXY9Ii1vIiA7OwotICAgICAgLXMpCi0Jc3RyaXBtZT0iIC1zIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC0qKSA7OwotCi0gICAgICAqKQotCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KLQlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQkgIHByZXY9Ci0JZWxzZQotCSAgZGVzdD0iJGFyZyIKLQkgIGNvbnRpbnVlCi0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgotICAgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgotICAgICAgZWxzZQotCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgotICAgICAgZmkKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCi0KLSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KLSAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCi0gICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgotICAgICAgZGVzdGRpcj0iJGRlc3QiCi0gICAgICBkZXN0bmFtZT0KLSAgICBlbHNlCi0gICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCi0gICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCi0gICAgICBzZXQgZHVtbXkgJGZpbGVzCi0gICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotICAgIGZpCi0gICAgY2FzZSAiJGRlc3RkaXIiIGluCi0gICAgLyogfCBbQS1aYS16XTpbL1xcXSopIDs7Ci0gICAgKikKLSAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQljYXNlICIkZmlsZSIgaW4KLQkqLmxvKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgc3RhdGljbGlicz0KLSAgICBmdXR1cmVfbGliZGlycz0KLSAgICBjdXJyZW50X2xpYmRpcnM9Ci0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCi0gICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmEgfCAqLmxpYikKLQkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgotCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkZmlsZSIgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgotCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCi0JICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQllbHNlCi0JICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCi0JICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCi0JZGlyPSJgJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8iCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KLQlkaXI9IiRkaXIkb2JqZGlyIgotCi0JIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KLQkgIHJlYWxuYW1lPSIkMiIKLQkgIHNoaWZ0Ci0JICBzaGlmdAotCi0JICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0JICB0ZXN0ICJYJGRsbmFtZSIgPSAiWCRyZWFsbmFtZSIgJiYgZGxuYW1lPQotCi0JICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCi0JICAgIGZvciBsaW5rbmFtZQotCSAgICBkbwotCSAgICAgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJGxpbmtuYW1lIiAmJiBkbG5hbWU9Ci0JICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgotCQkkc2hvdyAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0JCSRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KLQkgICAgIyBJbnN0YWxsIHRoZSBkeW5hbWljYWxseS1sb2FkYWJsZSBsaWJyYXJ5LgotCSAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIKLQkgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIiB8fCBleGl0ICQ/Ci0JICBmaQotCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0JICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgIGV2YWwgY21kcz1cIiRwb3N0aW5zdGFsbF9jbWRzXCIKLQkgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQotCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgotCW5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCi0JaWYgdGVzdCAhIC1mICIkaW5zdG5hbWUiOyB0aGVuCi0JICAjIEp1c3QgaW4gY2FzZSBpdCB3YXMgcmVtb3ZlZC4uLgotCSAgJHNob3cgIkNyZWF0aW5nICRpbnN0bmFtZSIKLQkgICRybSAiJGluc3RuYW1lIgotCSAgc2VkICdzL15pbnN0YWxsZWQ9bm8kL2luc3RhbGxlZD15ZXMvJyAiJGZpbGUiID4gIiRpbnN0bmFtZSIKLQlmaQotCSRzaG93ICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIKLQkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/Ci0KLQkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCi0JdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgotCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JY2FzZSAiJGRlc3RmaWxlIiBpbgotCSoubG8pCi0JICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgOzsKLQkqLm8gfCAqLm9iaikKLQkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKLQkgIGRlc3RmaWxlPQotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgotCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPwotCWZpCi0JZXhpdCAwCi0JOzsKLQotICAgICAgKikKLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KLQkgIHJlbGlua19jb21tYW5kPQotCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgIiRmaWxlIiBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgotCSAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCRmaWxlJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgIGZpbmFsaXplPXllcwotCSAgZm9yIGxpYiBpbiAkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGliczsgZG8KLQkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgotCSAgICBsaWJkaXI9Ci0JICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICAgICAgY2FzZSAiJGxpYiIgaW4KLQkgICAgICAqLyogfCAqXFwqKSAuICRsaWIgOzsKLQkgICAgICAqKSAuIC4vJGxpYiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgbGliZmlsZT0iJGxpYmRpci9gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCIKLQkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgotCSAgICAgIGZpbmFsaXplPW5vCi0JICAgIGZpCi0JICBkb25lCi0KLQkgIG91dHB1dG5hbWU9Ci0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgotCSAgICAgIG91dHB1dG5hbWU9Ii90bXAvJCQtJGZpbGUiCi0JICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCi0KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZWxpbmtpbmcgXGAkZmlsZScgb24gYmVoYWxmIG9mIHlvdXIgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgotCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCi0JICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgICAgICBlbHNlCi0JCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotCQljb250aW51ZQotCSAgICAgIGZpCi0JICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIG9uIGJlaGFsZiBvZiB5b3VyIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgotCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAotCSAgZmkKLQlmaQotCi0JJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdGZpbGUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JdGVzdCAtbiAiJG91dHB1dG5hbWUiICYmICRybSAkb3V0cHV0bmFtZQotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KLSAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCi0KLSAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRvbGRsaWIiCi0gICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiB8fCBleGl0ICQ/Ci0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLSAgICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdGluc3RhbGxfY21kc1wiCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciIDE+JjIKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KLSAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCi0gICAgICB0ZXN0IC1uICIkcnVuIiAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCi0gICAgICBleGVjICRTSEVMTCAkMCAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBmaW5pc2ggbW9kZQotICBmaW5pc2gpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZmluaXNoIgotICAgIGxpYmRpcnM9IiRub25vcHQiCi0gICAgYWRtaW5jbWRzPQotCi0gICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KLSAgICAgIGZvciBkaXIKLSAgICAgIGRvCi0JbGliZGlycz0iJGxpYmRpcnMgJGRpciIKLSAgICAgIGRvbmUKLQotICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLQlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9jbWRzXCIKLQkgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZCIKLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgotCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKLQkgICRydW4gZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWRzIgotCWZpCi0gICAgICBkb25lCi0gICAgZmkKLQotICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgotICAgIHRlc3QgIiRzaG93IiA9IDogJiYgZXhpdCAwCi0KLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKLSAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotICAgICAgZWNobyAiICAgJGxpYmRpciIKLSAgICBkb25lCi0gICAgZWNobwotICAgIGVjaG8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgotICAgIGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgotICAgIGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSBcYC1MTElCRElSJyIKLSAgICBlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICBlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBsaWJkaXI9TElCRElSCi0gICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLSAgICAgIGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKLSAgICBmaQotICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKLSAgICBmaQotICAgIGVjaG8KLSAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKLSAgICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGV4ZWN1dGUgbW9kZQotICBleGVjdXRlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGV4ZWN1dGUiCi0KLSAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgotICAgIGNtZD0iJG5vbm9wdCIKLSAgICBpZiB0ZXN0IC16ICIkY21kIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgotICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCi0gICAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGRpcj0KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgotCWRsbmFtZT0KLQlsaWJyYXJ5X25hbWVzPQotCi0JIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JY2FzZSAiJGZpbGUiIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCi0JICBjb250aW51ZQotCWZpCi0KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCi0JaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCi0JICBkaXI9IiRkaXIvJG9iamRpciIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0JOzsKLQotICAgICAgKikKLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCi0gICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCi0KLSAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCi0gICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKLSAgICAgIGVsc2UKLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCi0gICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgotCi0gICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgotICAgIGFyZ3M9Ci0gICAgZm9yIGZpbGUKLSAgICBkbwotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAtKikgOzsKLSAgICAgICopCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICIkZmlsZSIgaW4KLQkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkgICopIC4gLi8kZmlsZSA7OwotCSAgZXNhYwotCi0JICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgotCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KLSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0gICAgICAjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KLSAgICAgIGV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLQotICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb21lbnQgdmFyaWFibGVzCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTENfQUxMK3NldH0iID0gc2V0OyB0aGVuCi0JTENfQUxMPSIkc2F2ZV9MQ19BTEwiOyBleHBvcnQgTENfQUxMCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQU5HPSIkc2F2ZV9MQU5HIjsgZXhwb3J0IExBTkcKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCi0gICAgICBldmFsICJleGVjIFwkY21kJGFyZ3MiCi0KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBleGVjIFwkY21kJGFyZ3MiCi0gICAgICBleGl0IDEKLSAgICBlbHNlCi0gICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgotICAgICAgZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgICRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICAkZWNobyAiJGNtZCRhcmdzIgotICAgICAgZXhpdCAwCi0gICAgZmkKLSAgICA7OwotCi0gICMgbGlidG9vbCB1bmluc3RhbGwgbW9kZQotICB1bmluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogdW5pbnN0YWxsIgotICAgIHJtPSIkbm9ub3B0IgotICAgIGZpbGVzPQotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLSAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgcm1maWxlcz0iJGZpbGUiCi0KLSAgICAgIGNhc2UgIiRuYW1lIiBpbgotICAgICAgKi5sYSkKLQkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCi0JaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAuICRkaXIvJG5hbWUKLQotCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KLQkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRuIgotCSAgICB0ZXN0ICJYJG4iID0gIlgkZGxuYW1lIiAmJiBkbG5hbWU9Ci0JICBkb25lCi0JICB0ZXN0IC1uICIkZGxuYW1lIiAmJiBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRkbG5hbWUiCi0JICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCi0JICAkc2hvdyAiJHJtICRybWZpbGVzIgotCSAgJHJ1biAkcm0gJHJtZmlsZXMKLQotCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0JICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICBldmFsIGNtZHM9XCIkcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHNcIgotCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgICRzaG93ICIkY21kIgotCSAgICAgICRydW4gZXZhbCAiJGNtZCIKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgIGZpCi0KLQkgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICBvbGRvYmo9YCRlY2hvICJYJG5hbWUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZG9iaiIKLQlmaQotCSRzaG93ICIkcm0gJHJtZmlsZXMiCi0JJHJ1biAkcm0gJHJtZmlsZXMKLQk7OwotCi0gICAgICAqKQotCSRzaG93ICIkcm0gJHJtZmlsZXMiCi0JJHJ1biAkcm0gJHJtZmlsZXMKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICIiKQotICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCi0gICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotICBlc2FjCi0KLSAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICBleGl0IDEKLWZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKLQotIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCi1jYXNlICIkbW9kZSIgaW4KLSIiKSAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCi0KLVByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotCi0gICAgLS1jb25maWcgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKLSAgICAtLWRlYnVnICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCi0tbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKLSAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCi0gICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JwotICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0KLU1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKLSAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQotICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcwotICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQotICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5Ci0KLU1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgotYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuIgotICBleGl0IDAKLSAgOzsKLQotY29tcGlsZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKLQotQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKLSAgLXN0YXRpYyAgICAgICAgICAgYWx3YXlzIGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKLQotQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKLWZyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCi0KLVRoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQotU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCi1saWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCi0gIDs7Ci0KLWV4ZWN1dGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCi0KLUF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAotCi1UaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCi1mbGFncy4KLQotSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAotaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5Ci1kaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KLQotVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCi0gIDs7Ci0KLWZpbmlzaCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgotCi1Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgotCi1FYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgotCi1UaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKLXRoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgotICA7OwotCi1pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KLQotSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCi0KLUlOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQotZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCi0KLVRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5Ci1CU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKLSAgOzsKLQotbGluaykKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCi0KLUxpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KLWNyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCi0KLUxJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQotYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0KLVRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgotCi0gIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAotICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKLSAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCi0gIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0gIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCi0gIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCi0JCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKLSAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcwotICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQotICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKLSAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCi0gIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgotICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCi0gIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCi0gIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCi0JCSAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCi0KLUFsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCi0KLUV2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCi10cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQotb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKLW9ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKLXJlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAotdXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCi1pcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgotICA7OwotCi11bmluc3RhbGwpCi0gICRlY2hvCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgotT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi0qKQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLSAgOzsKLWVzYWMKLQotZWNobwotJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKLQotZXhpdCAwCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKZGlmZiAtLWdpdCBhL21ha2VmaWxlLnZtcyBiL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMzYzNC4uMDAwMDAwMAotLS0gYS9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jCi0jIG1ha2VmaWxlIGZvciBiZmQsIGJpbnV0aWxzIGFuZCBnYXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotIwotIyBZb3UgbXVzdCB1c2UgVmVyc2lvbiAzLjc2IG9mIEdOVSBNYWtlCi0jCi0jCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1DQyA9IGdjYwotR0FTQ0MgPSAkKENDKQotZWxzZQotQ0MgPSBjYwotR0FTQ0MgPSBnY2MKLWVuZGlmCi0KLWlmZXEgKCQoQ0MpLGNjKQotICBDSEVDSy1DT01QSUxFUiA9IGNoZWNrX2NvbXBpbGVyCi1lbHNlCi0gIENIRUNLLUNPTVBJTEVSID0KLWVuZGlmCi0KLWFsbDoJY2hlY2tfY2MgJChDSEVDSy1DT01QSUxFUikgWy5iaW51dGlsc11tYWtlZmlsZS52bXMKLQkkKENEKSBbLmJmZF0KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLm9wY29kZXNdCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5saWJpYmVydHldCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmdhc10KLQlAZ21ha2UgIkNDPSQoR0FTQ0MpIgotCSQoQ0QpIFstXQotCi1jaGVja19jYzoKLWlmZXEgKCRDQywpCi0JQCQoRUNITykgIlBsZWFzZSBlZGl0IE1BS0VGSUxFLlZNUyBhbmQgc2VsZWN0IGEgQyBDb21waWxlci4iCi0Jc3RvcAotZW5kaWYKLQotY2hlY2tfY29tcGlsZXI6Ci0JQCQoRUNITykgIlBlcmZvcm0gYSAnJCQgQHNldHVwJyBiZWZvcmUgc3RhcnRpbmcgbWFrZSIKLQotWy5iaW51dGlsc11tYWtlZmlsZS52bXM6Ci0JJChDRCkgWy5iaW51dGlsc10KLQkkJCBAY29uZmlndXJlCi0JJChDRCkgWy1dCi0KLWluc3RhbGw6IGFsbAotCSQoQ0QpIFsuYmludXRpbHNdCi0JQGdtYWtlICJDQz0kKENDKSIgaW5zdGFsbAotCSQoQ0QpIFstXQotCSQoQ0QpIFsuZ2FzXQotCUBnbWFrZSAiQ0M9JChHQVNDQykiIGluc3RhbGwKLQkkKENEKSBbLV0KLQotY2xlYW46Ci0JJChDRCkgWy5iZmRdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0ub3Bjb2Rlc10KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5saWJpYmVydHldCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0uYmludXRpbHNdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0uZ2FzXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstXQotCmRpZmYgLS1naXQgYS9taXNzaW5nIGIvbWlzc2luZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc4OTY1Mi4uMDAwMDAwMAotLS0gYS9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRnJhbmMsb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1jYXNlICIkMSIgaW4KLQotICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCi0gICAgZWNobyAiXAotJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCi0KLUhhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KLWVycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KLQotT3B0aW9uczoKLSAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotCi1TdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6Ci0gIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKLSAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCi0gIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCi0gIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKLSAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQotICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0iCi0gICAgOzsKLQotICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCi0gICAgZWNobyAibWlzc2luZyAtIEdOVSBsaWJpdCAwLjAiCi0gICAgOzsKLQotICAtKikKLSAgICBlY2hvIDE+JjIgIiQwOiBVbmtub3duIFxgJDEnIG9wdGlvbiIKLSAgICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICBhY2xvY2FsKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2luY2x1ZGUubTQnIG9yIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tCi0gICAgICAgICBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggYWNsb2NhbC5tNAotICAgIDs7Ci0KLSAgYXV0b2NvbmYpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGNvbmZpZ3VyZS5pbicuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQotICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggY29uZmlndXJlCi0gICAgOzsKLQotICBhdXRvaGVhZGVyKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYGNvbmZpZ3VyZS5pbicuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQotICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnIGNvbmZpZ3VyZS5pbmAKLSAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKLSAgICB0b3VjaF9maWxlcz0KLSAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLSAgICAgICo6KikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAiYGVjaG8gIiRmIiB8Ci0JCQkJICAgICAgIHNlZCAtZSAncy9eW146XSo6Ly8nIC1lICdzLzouKi8vJ2A7OwotICAgICAgKikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAkZi5pbiI7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgICB0b3VjaCAkdG91Y2hfZmlsZXMKLSAgICA7OwotCi0gIGF1dG9tYWtlKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYGNvbmZpZ3VyZS5pbicuCi0gICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KLSAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAotCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8Ci0JICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCi0gICAgOzsKLQotICBiaXNvbnx5YWNjKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi55KQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYwotCSAgICBmaQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCi0JZWNobyA+eS50YWIuaAotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYwotICAgIGZpCi0gICAgOzsKLQotICBsZXh8ZmxleCkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIGxleC55eS5jCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYwotICAgIGZpCi0gICAgOzsKLQotICBtYWtlaW5mbykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKLSAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cwotICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKLSAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgotICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KLSAgICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKLSAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkZmlsZWAKLSAgICBmaQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICAqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBhbmQgeW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgaXQgaGFuZHkgb24geW91cgotICAgICAgICAgc3lzdGVtLiAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAotICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlyZW1lbnRzIGZvciBpbnN0YWxsaW5nCi0gICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQotICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvbWtkZXAgYi9ta2RlcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2M1YjUwOC4uMDAwMDAwMAotLS0gYS9ta2RlcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMhL2Jpbi9zaCAtCi0jCi0jIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotIyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKLSMgZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKLSMgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotIyBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCi0jIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCi0jIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0jIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotIwotIwlAKCMpbWtkZXAuc2gJNS4xMiAoQmVya2VsZXkpIDYvMzAvODgKLSMKLQotTUFLRT1NYWtlZmlsZQkJCSMgZGVmYXVsdCBtYWtlZmlsZSBuYW1lIGlzICJNYWtlZmlsZSIKLQotd2hpbGUgOgotCWRvIGNhc2UgIiQxIiBpbgotCQkjIC1mIGFsbG93cyB5b3UgdG8gc2VsZWN0IGEgbWFrZWZpbGUgbmFtZQotCQktZikKLQkJCU1BS0U9JDIKLQkJCXNoaWZ0OyBzaGlmdCA7OwotCi0JCSMgdGhlIC1wIGZsYWcgcHJvZHVjZXMgInByb2dyYW06IHByb2dyYW0uYyIgc3R5bGUgZGVwZW5kZW5jaWVzCi0JCSMgc28gLm8ncyBkb24ndCBnZXQgcHJvZHVjZWQKLQkJLXApCi0JCQlTRUQ9J3M7XC5vOzsnCi0JCQlzaGlmdCA7OwotCQkqKQotCQkJYnJlYWsgOzsKLQllc2FjCi1kb25lCi0KLWlmIFsgJCMgPSAwIF0gOyB0aGVuCi0JZWNobyAndXNhZ2U6IG1rZGVwIFstcF0gWy1mIG1ha2VmaWxlXSBbZmxhZ3NdIGZpbGUgLi4uJwotCWV4aXQgMQotZmkKLQotaWYgWyAhIC13ICRNQUtFIF07IHRoZW4KLQllY2hvICJta2RlcDogbm8gd3JpdGVhYmxlIGZpbGUgXCIkTUFLRVwiIgotCWV4aXQgMQotZmkKLQotVE1QPS90bXAvbWtkZXAkJAotCi10cmFwICdybSAtZiAkVE1QIDsgZXhpdCAxJyAxIDIgMyAxMyAxNQotCi1jcCAkTUFLRSAke01BS0V9LmJhawotCi1zZWQgLWUgJy9ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJGQnIDwgJE1BS0UgPiAkVE1QCi0KLWNhdCA8PCBfRU9GXyA+PiAkVE1QCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLV9FT0ZfCi0KLSMgSWYgeW91ciBjb21waWxlciBkb2Vzbid0IGhhdmUgLU0sIGFkZCBpdC4gIElmIHlvdSBjYW4ndCwgdGhlIG5leHQgdHdvCi0jIGxpbmVzIHdpbGwgdHJ5IGFuZCByZXBsYWNlIHRoZSAiY2MgLU0iLiAgVGhlIHJlYWwgcHJvYmxlbSBpcyB0aGF0IHRoaXMKLSMgaGFjayBjYW4ndCBkZWFsIHdpdGggYW55dGhpbmcgdGhhdCByZXF1aXJlcyBhIHNlYXJjaCBwYXRoLCBhbmQgZG9lc24ndAotIyBldmVuIHRyeSBmb3IgYW55dGhpbmcgdXNpbmcgYnJhY2tldCAoPD4pIHN5bnRheC4KLSMKLSMgZWdyZXAgJ14jaW5jbHVkZVsgCV0qIi4qIicgL2Rldi9udWxsICQqIHwKLSMgc2VkIC1lICdzLzpbXiJdKiJcKFteIl0qXCkiLiovOiBcMS8nIC1lICdzL1wuYy8uby8nIHwKLQotZ2NjIC1NTSAkKiB8Ci1zZWQgIgotCXM7IFwuLzsgO2cKLQkkU0VEIiA+PiAkVE1QCi0KLWNhdCA8PCBfRU9GXyA+PiAkVE1QCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotX0VPRl8KLQotIyBjb3B5IHRvIHByZXNlcnZlIHBlcm1pc3Npb25zCi1jcCAkVE1QICRNQUtFCi1ybSAtZiAke01BS0V9LmJhayAkVE1QCi1leGl0IDAKLQotCmRpZmYgLS1naXQgYS9ta2luc3RhbGxkaXJzIGIvbWtpbnN0YWxsZGlycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4NzgzZS4uMDAwMDAwMAotLS0gYS9ta2luc3RhbGxkaXJzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKLSMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+Ci0jIENyZWF0ZWQ6IDE5OTMtMDUtMTYKLSMgTGFzdCBtb2RpZmllZDogMTk5NC0wMy0yNQotIyBQdWJsaWMgZG9tYWluCi0KLWVycnN0YXR1cz0wCi0KLWZvciBmaWxlIGluICR7MSsiJEAifSA7IGRvIAotICAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKLSAgIHNoaWZ0Ci0KLSAgIHBhdGhjb21wPQotICAgZm9yIGQgaW4gJHsxKyIkQCJ9IDsgZG8KLSAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgotICAgICBjYXNlICIkcGF0aGNvbXAiIGluCi0gICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OwotICAgICBlc2FjCi0KLSAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0gICAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIgMT4mMgotICAgICAgICBta2RpciAiJHBhdGhjb21wIiA+IC9kZXYvbnVsbCAyPiYxIHx8IGxhc3RlcnI9JD8KLSAgICAgZmkKLQotICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLQllcnJzdGF0dXM9JGxhc3RlcnIKLSAgICAgZmkKLQotICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKLSAgIGRvbmUKLWRvbmUKLQotZXhpdCAkZXJyc3RhdHVzCi0KLSMgbWtpbnN0YWxsZGlycyBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL21vdmUtaWYtY2hhbmdlIGIvbW92ZS1pZi1jaGFuZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMWIzNDguLjAwMDAwMDAKLS0tIGEvbW92ZS1pZi1jaGFuZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLWlmCi10ZXN0IC1yICQyCi10aGVuCi1pZgotY21wICQxICQyID4gL2Rldi9udWxsCi10aGVuCi1lY2hvICQyIGlzIHVuY2hhbmdlZAotcm0gLWYgJDEKLWVsc2UKLW12IC1mICQxICQyCi1maQotZWxzZQotbXYgLWYgJDEgJDIKLWZpCmRpZmYgLS1naXQgYS9tcHctUkVBRE1FIGIvbXB3LVJFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MTQwYi4uMDAwMDAwMAotLS0gYS9tcHctUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLVRoaXMgaXMgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1hY2ludG9zaCh0bSkgTVBXKHRtKSBwb3J0IG9mIHRoZQotR05VIHRvb2xzLiAgVGhlIGluZm9ybWF0aW9uIGJlbG93IGFwcGxpZXMgdG8gYm90aCBuYXRpdmUgYW5kIGNyb3NzCi1jb21waWxlcnMuCi0KLShQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhpcyBmaWxlOyAibXB3LVJFQURNRSIKLWlzIHRoZSBzb3VyY2UgZm9ybSwgYW5kICJSZWFkIE1lIGZvciBNUFciIGlzIHRoZSBkaXN0cmlidXRpb24gZm9ybS4KLSJSZWFkIE1lIGZvciBNUFciIGhhcyA4LWJpdCBjaGFycyBzdWNoIGFzIFxPcHRpb24tZCBlbWJlZGRlZCBpbiBpdC4pCi0KLUlOU1RBTExJTkcgR05VIFRPT0xTCi0KLSogU3lzdGVtIFJlcXVpcmVtZW50cwotCi1UbyB1c2UgdGhlc2UgdG9vbHMsIHlvdSB3aWxsIG5lZWQgYSBNYWMgd2l0aCBhIDY4MDIwIG9yIGJldHRlciBvciBlbHNlCi1hbnkgUG93ZXJNYWMsIFN5c3RlbSA3LjEgb3IgbGF0ZXIsIGFuZCBNUFcgMy4zIG9yIDMuNC4gIFlvdSB3aWxsICpub3QqCi1uZWVkIGFueSBvdGhlciBNUFcgY29tcGlsZXIgdW5sZXNzIHlvdSB3YW50IHRvIHJlYnVpbGQgZnJvbSBzb3VyY2VzLAotbm9yIGV2ZW4gYW55IGluY2x1ZGUgZmlsZXMsIHVubGVzcyB5b3UgYXJlIGJ1aWxkaW5nIGFjdHVhbCBNYWMKLWFwcGxpY2F0aW9ucy4gIEZvciBQb3dlck1hYyBuYXRpdmUgeW91IHdpbGwgbmVlZCBQUENMaW5rLCBob3dldmVyOwotYWxzbyB0aGUgZXhlY3V0YWJsZXMgYXJlIFBvd2VyUEMtb25seS4KLQotKiBBdXRvbWF0ZWQgSW5zdGFsbGF0aW9uCi0KLVRoZSBzaW1wbGVzdCB3YXkgdG8gaW5zdGFsbCBHTlUgdG9vbHMgaXMgdG8gcnVuIHRoZSBJbnN0YWxsIHNjcmlwdC4KLVRoZSBzY3JpcHQgd2lsbCBjb3B5IHRoaW5ncyB0byB3aGVyZSB5b3Ugd2FudCB0byBrZWVwIHRoZW0sIHdpbGwgYnVpbGQKLWEgVXNlclN0YXJ0dXAgZmlsZSB3aXRoIHNldHRpbmdzIGNvcnJlc3BvbmRpbmcgdG8gd2hlcmUgdGhpbmdzIHdlcmUKLWNvcGllZCwgYW5kIG9mZmVyIHRvIHB1dCB0aGF0IFVzZXJTdGFydHVwIGZpbGUgaW4geW91ciBNUFcgZm9sZGVyLgotCi1UaGUgSW5zdGFsbCBzY3JpcHQgZG9lcyBub3QgYWx0ZXIgYW55dGhpbmcgaW4gdGhlIFN5c3RlbSBGb2xkZXIsIGFuZAotaXQgZG9lcyBub3QgdGFrZSBhbnkgYWN0aW9uIHdpdGhvdXQgY29uZmlybWF0aW9uLgotCi1UaGUgSW5zdGFsbCBzY3JpcHQgd2lsbCBiZSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBiaW5hcnkKLWRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgb2JqZWN0IGRpcmVjdG9yeSBpZgotcmVidWlsZGluZyBmcm9tIHNvdXJjZS4gIChUaGUgc291cmNlcyBpbmNsdWRlIGEgZmlsZSBjYWxsZWQKLSJtcHctaW5zdGFsbCIgYXQgdGhlIHRvcCBsZXZlbCwgYnV0IGl0IGlzIHRoZSBzb3VyY2UgdG8gdGhlIEluc3RhbGwKLXNjcmlwdCBhbmQgY2Fubm90IGJlIHJ1biBkaXJlY3RseS4pCi0KLSogTWFudWFsIEluc3RhbGxhdGlvbgotCi1JZiB5b3UgZG9uJ3Qgd2FudCB0byBydW4gdGhlIEluc3RhbGwgc2NyaXB0LCB5b3UgY2FuIGRvIGluc3RhbGxhdGlvbgotbWFudWFsbHk7IHRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHN0ZXBzIGludm9sdmVkLgotCi1UaGUgR05VIHRvb2xzIGNhbiBnbyBpbiBhbnkgZGlyZWN0b3J5IHRoYXQgaXMgaW4geW91ciB7Q29tbWFuZHN9IGxpc3QuCi1XZSBnZW5lcmFsbHkgcHV0IGFsbCB0aGUgdG9vbHMgc29tZXdoZXJlIGxpa2Uge0Jvb3R9Q3lnbnVzOmxhdGVzdDpiaW4sCi1hbmQgdGhlbiBhZGQgdG8gYSBVc2VyU3RhcnR1cCBmaWxlOgotCi0Jc2V0IENvbW1hbmRzICJ7Qm9vdH1DeWdudXM6bGF0ZXN0OmJpbjose0NvbW1hbmRzfSIKLQotSG93ZXZlciwgdGhlIGNwcCBhbmQgY2MxIHByb2dyYW1zIG9mIEdDQyBhcmUgbm90IG5vcm1hbGx5IHN0b3JlZCBoZXJlLgotSW5zdGVhZCwgdGhleSB3aWxsIGJlIGluIGEgImxpYiIgZGlyZWN0b3J5IHRoYXQgaXMgYWxvbmdzaWRlICJiaW4iLAotYW5kIG9yZ2FuaXplZCBieSB0YXJnZXQgYW5kIHZlcnNpb24gdW5kZXJuZWF0aCwgd2l0aCBuYW1lcyBsaWtlCi0KLQk6bGliOmdjYy1saWI6PHRhcmdldD46Y3lnbnVzLTx2ZXJzaW9uPjoKLQotSWYgeW91IGJ1aWxkIGFuZCBpbnN0YWxsIGV2ZXJ5dGhpbmcgeW91cnNlbGYgYWNjb3JkaW5nIHRvIHRoZSBidWlsZAotaW5zdHJ1Y3Rpb25zIGJlbG93LCB0aGVuIHlvdSB3aWxsIG5vdCBoYXZlIGFueSBwcm9ibGVtcy4gIEhvd2V2ZXIsIHlvdQotbWF5IGRpc2NvdmVyIHRoYXQgR0NDIHNlZW1zIHVuYWJsZSB0byBmaW5kIHRoZSByaWdodCBjcHAgYW5kIGNjMTsKLXVzdWFsbHkgdGhpcyB3aWxsIGJlIGJlY2F1c2UgZGlyZWN0b3J5IG5hbWVzIGhhdmUgY2hhbmdlZC4gIChFdmVuCi1yZW5hbWluZyB5b3VyIGhhcmQgZGlzayB3aWxsIG1ha2UgdGhpcyBoYXBwZW4uKSAgSW4gc3VjaCBjYXNlcywgeW91Ci1oYXZlIHNldmVyYWwgY2hvaWNlcy4gIE9uZSBpcyBqdXN0IHRvIGFkZCB0aGlzIGRpcmVjdG9yeSB0bwote0NvbW1hbmRzfSwgYnV0IHRoZW4geW91IHdpbGwgbm90IGJlIGFibGUgdG8gZ2V0IGFueSBvdGhlciBjcHAgb3IgY2MxLAotc3VjaCBhcyB0aG9zZSB1c2VkIGJ5IGEgZGlmZmVyZW50IHRhcmdldCBvciB2ZXJzaW9uLiAgQW5vdGhlciB3YXkgaXMKLXRvIHJlbmFtZSB5b3VyIGRpc2sgYW5kIGRpcmVjdG9yaWVzIHRvIG1hdGNoIHRoZSBwcmVmaXggdXNlZCB3aGVuIHRoZQotdG9vbHMgd2VyZSBjb21waWxlZC4gIEZpbmFsbHksIHlvdSBjYW4gc2V0IHRoZSB2YXJpYWJsZQotR0NDX0VYRUNfUFJFRklYIHRvIHBvaW50IHRvIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeToKLQotCXNldCBHQ0NfRVhFQ19QUkVGSVggTXlEaXNrOlN0dWZmOmxpYjpnY2MtbGliOgotCWV4cG9ydCBHQ0NfRVhFQ19QUkVGSVgKLQotWW91IG1heSBhbHNvIHdhbnQgdG8gZWRpdCBNUFcncyBIRVhBIDEyOCByZXNvdXJjZS4gIFdoZW4gR0NDIGlzIGJ1aWx0Ci11c2luZyBhIG5hdGl2ZSBHQ0MsIGl0IGlzIGNvbXBpbGVkIHRvIHVzZSBhIHNwZWNpYWwgc3RhY2sgYWxsb2NhdG9yCi1mdW5jdGlvbiBhbGxvY2EoKS4gIFdoaWxlIHRoaXMgaXMgdmVyeSBlZmZpY2llbnQsIGl0IG1lYW5zIHRoYXQgR0NDCi13aWxsIG5lZWQgY29uc2lkZXJhYmxlIHN0YWNrIHNwYWNlIHRvIHJ1biwgZXNwZWNpYWxseSB3aGVuIGNvbXBpbGluZwotbGFyZ2UgcHJvZ3JhbXMgd2l0aCBvcHRpbWl6YXRpb24gdHVybmVkIG9uLiAgWW91IGdpdmUgTVBXIG1vcmUgc3RhY2sKLWJ5IGVkaXRpbmcgdGhlIEhFWEEgMTI4IHJlc291cmNlIG9mIHRoZSBNUFcgU2hlbGwuICBBIHZhbHVlIG9mICIwMDA4Ci0wMDAwIiBnaXZlcyA1MTJLIG9mIHN0YWNrIHNpemUsIHdoaWNoIGlzIHVzdWFsbHkgc3VmZmljaWVudC4KLQotVVNJTkcgR05VIFRPT0xTCi0KLSogVXNpbmcgTmF0aXZlIFBvd2VyTWFjIEdDQwotCi1Vc2luZyBhIG5hdGl2ZSBQb3dlck1hYyBHQ0MgdG8gcHJvZHVjZSBNUFcgdG9vbHMgb3IgTWFjT1MgYXBwbGljYXRpb25zCi1pcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4ganVzdCAiZ0MgZm9vLmMiLCBhbHRob3VnaCBubyBtb3JlIGNvbXBsaWNhdGVkCi10aGFuIHdpdGggb3RoZXIgTWFjIGNvbXBpbGVycy4KLQotVG8gYnVpbGQgYSBuYXRpdmUgUG93ZXJNYWMgTVBXIHRvb2wsIHVzZSB0aGlzIHNlcXVlbmNlLCB3aGVyZSBoZWxsby5jCi1pcyB0aGUgdXN1YWwgImhlbGxvIHdvcmxkIiBwcm9ncmFtLCBhbmQgZ2VuZXJpY2NmcmcuciBpcyB0aGUgUmV6IGZpbGUKLXdpdGggdGhlIGNvZGUgZnJhZ21lbnQgcmVzb3VyY2U6Ci0KLWdDIC1Je0NJbmNsdWRlc30gLWZuby1idWlsdGluIC1EcGFzY2FsPSAtYyAtZyBoZWxsby5jCi1QUENMaW5rIGhlbGxvLm8gLW8gaGVsbG8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlN0ZENSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IkludGVyZmFjZUxpYiBcT3B0aW9uLWQKLQkie1NoYXJlZExpYnJhcmllc30iU3RkQ0xpYiBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDVG9vbExpYnMubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie0dDQ1BQQ0xpYnJhcmllc30ibGliZ2NjLnhjb2ZmCi1yZXogLWQgQVBQTkFNRT0nIidoZWxsbyciJyBHZW5lcmljQ0ZSRy5yIC1vIGhlbGxvCi1zZXRmaWxlIC10ICdNUFNUJyAtYyAnTVBTICcgaGVsbG8KLQotVGhlIHNhbWUgc2VxdWVuY2Ugd29ya3MgdG8gYnVpbGQgYSBNYWNPUyBhcHBsaWNhdGlvbiwgYnV0IHlvdSBzZXQgdGhlIGZpbGUKLXR5cGUgdG8gJ0FQUEwnIGFuZCBkb24ndCBsaW5rIGluIFBQQ1Rvb2xMaWJzLm8uICBGb3IgZnVydGhlciBkZXRhaWxzIG9uCi11c2luZyBNUFcgdG8gYnVpbGQgTWFjIGFwcGxpY2F0aW9ucywgc2VlIHRoZSBnZW5lcmFsIE1QVyBkb2N1bWVudGF0aW9uLgotCi1SZWNlbnQgdmVyc2lvbnMgb2YgUFBDTGluayBoYXZlIGFuIG9wdGlvbiB0byBnZW5lcmF0ZSB0aGUgY29kZQotZnJhZ21lbnQgcmVzb3VyY2UgYW5kIGF1dG9tYXRpY2FsbHkgc2V0IGNyZWF0b3IgYW5kIGZpbGUgdHlwZTsKLWhlcmUgaXMgd2hhdCBHZW5lcmljQ0ZSRy5yIHNob3VsZCBsb29rIGxpa2UgaWYgeW91IGhhdmUgYW4gb2xkZXIKLVBQQ0xpbmsgb3IgYXJlIHVzaW5nIEdOVSBsZDoKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAga1Bvd2VyUEMsCi0gICAgICAgICAgICAgICAga0Z1bGxMaWIsCi0gICAgICAgICAgICAgICAga05vVmVyc2lvbk51bSxrTm9WZXJzaW9uTnVtLAotICAgICAgICAgICAgICAgIDAsMCwKLSAgICAgICAgICAgICAgICBrSXNBcHAsa09uRGlza0ZsYXQsa1plcm9PZmZzZXQsa1dob2xlRm9yaywKLSAgICAgICAgICAgICAgICBBUFBOQU1FIC8vIG11c3QgYmUgZGVmaW5lZCBvbiBSZXogY29tbWFuZCBsaW5lIHdpdGggLWQgb3B0aW9uCi0gICAgICAgIH0KLX07Ci0KLUluIGdlbmVyYWwgdGhpcyBwb3J0IG9mIEdDQyBzdXBwb3J0cyB0aGUgc2FtZSBvcHRpb24gc3ludGF4IGFuZAotYmVoYXZpb3IgYXMgaXRzIFVuaXggY291bnRlcnBhcnQuICBJdCBhbHNvIGhhcyBzaW1pbGFyIGNvbXBpbGF0aW9uCi1ydWxlcywgc28gaXQgd2lsbCBydW4gdGhlIGFzc2VtYmxlciBvbiAucyBmaWxlcyBhbmQgc28gZm9ydGguCi0KLVRoZSBHQ0MgbWFudWFsIGluY2x1ZGVzIGZ1bGwgaW5mb3JtYXRpb24gb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zLgotT25lIG9wdGlvbiB0aGF0IG1heSBiZSBlc3BlY2lhbGx5IHVzZWZ1bCBpcyAiLXYiLCB3aGljaCBzaG93cyB5b3Ugd2hhdAotdG9vbHMgYW5kIG9wdGlvbnMgYXJlIGJlaW5nIHVzZWQ7IHVubGlrZSBtb3N0IE1hYyBDIGNvbXBpbGVycywgR0NDCi1kaXJlY3RzIGFzc2VtYmx5IGFuZCBsaW5raW5nIGluIGFkZGl0aW9uIHRvIGNvbXBpbGF0aW9uLgotCi1NUFcgR0NDIGRvZXMgZmVhdHVyZSB0d28gZXh0ZW5zaW9ucyB0byB0aGUgb3B0aW9uIHN5bnRheDsgJy1kIG1hY3JvPW5hbWUnCi13b3JrcyBqdXN0IGFzICctRG1hY3JvPW5hbWUnIGRvZXMgaW4gVW5peCwgYW5kICctaSBkaXJlY3RvcnknIHdvcmtzIHRoZQotc2FtZSBhcyAnLUlkaXJlY3RvcnknLgotCi1NUFcgR0NDIHN1cHBvcnRzIHRoZSB1c3VhbCBQYXNjYWwtc3R5bGUgc3RyaW5ncyBhbmQgYWxpZ25tZW50IHByYWdtYXMuCi0KLVRvIGZpbmQgc3RhbmRhcmQgaW5jbHVkZSBmaWxlcyB5b3UgY2FuIHNldCB0aGUgdmFyaWFibGUgR0NDSW5jbHVkZXM6Ci0KLQlzZXQgR0NDSW5jbHVkZXMgTXlEaXNrOk15SW5jbHVkZXM6Ci0JZXhwb3J0IEdDQ0luY2x1ZGVzCi0KLUdDQ0luY2x1ZGVzIGlzIHNpbWlsYXIgdG8gTVBXJ3MgQ0luY2x1ZGVzIG9yIENXJ3MgTVdDSW5jbHVkZXMuICBJbgotb3JkZXIgdG8gdXNlIE1QVydzIHVzdWFsIGluY2x1ZGUgZmlsZXMsIGp1c3Qgc2F5OgotCi0Jc2V0IEdDQ0luY2x1ZGVzICJ7Q0luY2x1ZGVzfSIKLQlleHBvcnQgR0NDSW5jbHVkZXMKLQotKiBVc2luZyBHQ0MgYXMgYSBDcm9zcy1Db21waWxlcgotCi1JZiB5b3UgaGF2ZSBhIGNyb3NzLWNvbXBpbGVyLCBhbmQgeW91IGhhdmUgYWxsIG9mIHRoZSBjb3JyZWN0Ci10YXJnZXQtc2lkZSBjcnQwIGFuZCBsaWJyYXJpZXMgYXZhaWxhYmxlLCB0aGVuIHRvIGNvbXBpbGUgYW5kIGxpbmsgYQotZmlsZSAiZm9vLmMiLCB5b3UgY2FuIHNheSBqdXN0Ci0KLQlnQyBmb28uYwotCi1UaGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBhbiBNUFcgYmluYXJ5IGZpbGUgbmFtZWQgImEub3V0IjsgdGhlIGZvcm1hdAotb2YgdGhlIGNvbnRlbnRzIHdpbGwgZGVwZW5kIG9uIHdoaWNoIHRhcmdldCBpcyBpbiB1c2UsIHNvIGZvciBpbnN0YW5jZQotYSBNSVBTLXRhcmdldGluZyBHQ0Mgd2lsbCBwcm9kdWNlIEVDT0ZGIG9yIEVMRiBleGVjdXRhYmxlcy4KLQotTm90ZSB0aGF0IHVzaW5nIE1QVyBpbmNsdWRlIGZpbGVzIHdpdGggYSBjcm9zcy1jb21waWxlciBpcyBzb21ld2hhdAotZGFuZ2Vyb3VzLgotCi0qIFVzaW5nIHRoZSBBc3NlbWJsZXIgYW5kIEZyaWVuZHMKLQotVGhlIGFzc2VtYmxlciAoImFzIikgYW5kIGxpbmtlciAoImxkIikgYXJlIGZhaXRoZnVsIHBvcnRzIG9mIHRoZWlyCi1Vbml4IGNvdW50ZXJwYXJ0cy4gIFNpbWlsYXJseSwgdGhlIGJpbnV0aWxzICJhciIsICJjcGx1c2ZpbHQiLCAibm0iLAotIm9iamNvcHkiLCAib2JqZHVtcCIsICJyYW5saWIiLCAic2l6ZSIsICJzdHJpbmdzIiwgYW5kICJzdHJpcCIgYXJlIGFsbAotbGlrZSB0aGV5IGFyZSB1bmRlciBVbml4LiAgKE5vdGUgdGhhdCAiY3BsdXNmaWx0IiBpcyB1c3VhbGx5IGNhbGxlZAotImMrK2ZpbHQiIHVuZGVyIFVuaXguKQotCi0qIFVzaW5nIEdEQgotCi1UaGVyZSBhcmUgdHdvIGZsYXZvcnMgb2YgR0RCLiAgImdkYiIgaXMgYW4gTVBXIHRvb2wgdGhhdCB3b3JrcyB2ZXJ5Ci1tdWNoIGxpa2UgaXQgZG9lcyBpbiBVbml4OyBwdXQgYSBjb21tYW5kIGludG8gdGhlIE1QVyB3b3Jrc2hlZXQgYW5kCi10eXBlIHRoZSA8ZW50ZXI+IGtleSB0byBzZW5kIGl0IHRvIEdEQi4gIFdoaWxlICJnZGIiIGlzIHJ1bm5pbmcsIHlvdQotY2Fubm90IGRvIGFueXRoaW5nIGVsc2UgaW4gTVBXLCBhbHRob3VnaCB5b3UgY2FuIHN3aXRjaCB0byBvdGhlcgotTWFjIGFwcGxpY2F0aW9ucyBhbmQgdXNlIHRoZW0uCi0KLSJTaW93R0RCIiBpcyBhbHNvIGEgTWFjIGFwcGxpY2F0aW9uLCBidXQgaXQgaXMgR0RCIHVzaW5nIHRoZSBTSU9XCi1wYWNrYWdlIHRvIHByb3ZpZGUgY29uc29sZSBlbXVsYXRpb24uICBDb21tYW5kcyBhcmUgZXhhY3RseSBhcyBmb3IgdGhlCi1NUFcgdG9vbCwgYnV0IHNpbmNlIHRoaXMgaXMgaXRzIG93biBhcHBsaWNhdGlvbiwgeW91IGNhbiBzd2l0Y2gKLWJldHdlZW4gaXQgYW5kIE1QVy4KLQotQlVJTERJTkcgR05VIFRPT0xTCi0KLVRoaXMgcG9ydCBvZiB0aGUgR05VIHRvb2xzIHVzZXMgYSBjb25maWd1cmUgc2NyaXB0IHNpbWlsYXIgdG8KLXRoYXQgdXNlZCBmb3IgR05VIHRvb2xzIHVuZGVyIFVuaXgsIGJ1dCByZXdyaXR0ZW4gZm9yIE1QVy4gIEFzIHdpdGgKLVVuaXggY29uZmlndXJhdGlvbiwgdGhlcmUgaXMgYW4gIm9iamVjdCIgZGlyZWN0b3J5IHRoYXQgbWF5IGJlCi1kaWZmZXJlbnQgZnJvbSB0aGUgInNvdXJjZSIgZGlyZWN0b3J5LiAgSW4gdGhlIGV4YW1wbGUgY29tbWFuZHMgYmVsb3csCi13ZSB3aWxsIGFzc3VtZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIGFuZCB0aGF0Ci10aGUgc291cmNlIGRpcmVjdG9yeSBpcyAie0Jvb3R9Q3lnbnVzOnNyYzoiLgotCi0qIFJlcXVpcmVtZW50cyBmb3IgQnVpbGRpbmcKLQotSW4gYWRkaXRpb24gdG8gdGhlIHNvdXJjZXMsIHlvdSB3aWxsIG5lZWQgYSBzZXQgb2YgdG9vbHMgdGhhdCB0aGUKLWNvbmZpZ3VyZSBhbmQgYnVpbGQgc2NyaXB0cyBhc3N1bWUgdG8gYmUgYXZhaWxhYmxlLiAgVGhlc2UgdG9vbHMKLShhbmQgdGhlaXIgdmVyc2lvbnMsIGlmIHJlbGV2YW50KSBhcmUgYXMgZm9sbG93czoKLQotCWJ5YWNjIHRvb2wKLQlmbGV4ICgyLjMuNykgdG9vbCAoYW5kIEZsZXguc2tlbCBmaWxlKQotCWZvcndhcmQtaW5jbHVkZSBzY3JpcHQKLQlNb3ZlSWZDaGFuZ2Ugc2NyaXB0Ci0JbXB3LXRvdWNoIHNjcmlwdAotCW1wdy10cnVlIHNjcmlwdAotCU5ld0ZvbGRlclJlY3Vyc2l2ZSBzY3JpcHQKLQludWxsLWNvbW1hbmQgc2NyaXB0Ci0Jb3Blbi1icmFjZSBzY3JpcHQKLQlzZWQgKDEuMTMpIHRvb2wKLQl0ci03dG84IHNjcmlwdAotCXRydWUgc2NyaXB0Ci0KLVRoZSBzY3JpcHRzIGFyZSBpbiB0aGUgc291cmNlcywgdW5kZXIgdXRpbHM6bXB3Oi4gWW91IG11c3QgYXJyYW5nZSB0bwotZ2V0IHRoZSBvdGhlciB0b29scyB5b3Vyc2VsZiAodGhleSBhcmUgcmVhZGlseSBhdmFpbGFibGUgZnJvbSB0aGUKLSJ1c3VhbCIgbmV0IHNpdGVzLCBhbmQgYXJlIGFsc28gb24gbWFueSBDRFJPTVMpLiAgSW4gYWRkaXRpb24sIHRoZXJlCi13aWxsIHVzdWFsbHkgYmUgYSBzZXQgb2YgdGhlc2UgYXZhaWxhYmxlIGF0IGZ0cC5jeWdudXMuY29tLCBpbiBwdWIvbWFjLgotCi1Zb3UgbWF5IHB1dCB0aGUgYnVpbGQgdG9vbHMgaW4geW91ciB1c3VhbCBUb29scyBvciBTY3JpcHRzCi1kaXJlY3Rvcmllcywgb3Iga2VlcCB0aGVtIGluIGEgc2VwYXJhdGUgZGlyZWN0b3JpZXMuICBXZSBwcmVmZXIgdG8KLW1ha2UgYSBkaXJlY3RvcnkgY2FsbGVkICJidWlsZHRvb2xzIiBhbmQgd2UgcHV0IHRoaXMgaW4gb25lIG9mIG91cgotVXNlclN0YXJ0dXAgZmlsZXM6Ci0KLQlzZXQgQ29tbWFuZHMgIntCb290fUN5Z251czpidWlsZHRvb2xzOix7Q29tbWFuZHN9IgotCi1GbGV4IHVzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgRkxFWF9TS0VMRVRPTiB0byBsb2NhdGUgaXRzIHNrZWxldG9uCi1maWxlLCBzbyB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzLCBwcmVmZXJhYmx5IGluIGEgVXNlclN0YXJ0dXA6Ci0KLQlTZXQgRkxFWF9TS0VMRVRPTiAie0Jvb3R9IkN5Z251czpidWlsZHRvb2xzOkZsZXguc2tlbAotCUV4cG9ydCBGTEVYX1NLRUxFVE9OCi0KLSogQ29uZmlndXJpbmcKLQotQmVmb3JlIHlvdSBjYW4gYnVpbGQgYW55dGhpbmcsIHlvdSBtdXN0IGNvbmZpZ3VyZS4gIFlvdSBkbyB0aGlzIGJ5Ci1jcmVhdGluZyBhbiBkaXJlY3Rvcnkgd2hlcmUgb2JqZWN0IGZpbGVzIHdpbGwgYmUgc3RvcmVkLCBzZXRkaXJlY3RvcnkKLXRvIHRoYXQgZGlyZWN0b3J5IGFuZCBkbyBhIGNvbmZpZ3VyZSBjb21tYW5kOgotCi0Je0Jvb3R9Q3lnbnVzOnNyYzptcHctY29uZmlndXJlIC0tdGFyZ2V0IDxuYW1lPiAtLWNjIDxjb21waWxlcj4gLS1zcmNkaXIge0Jvb3R9Q3lnbnVzOnNyYzogLS1wcmVmaXggPHdoYXRldmVyPgotCi1JZiB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyBub3QgaW4geW91ciB7Q29tbWFuZHN9IGxpc3QsIHRoZW4geW91IG11c3QKLXN1cHBseSBhIGZ1bGwgcGF0aG5hbWUgdG8gbXB3LWNvbmZpZ3VyZSwgc2luY2UgbXB3LWNvbmZpZ3VyZSBpbnZva2VzCi1pdHNlbGYgYWZ0ZXIgc3dpdGNoaW5nIGludG8gZWFjaCBzdWJkaXJlY3RvcnkuICBVc2luZyBhIHJlbGF0aXZlCi1wYXRobmFtZSwgZXZlbiBzb21ldGhpbmcgbGlrZSAnOm1wdy1jb25maWd1cmUnLCB3aWxsIHRoZXJlZm9yZSBub3Qgd29yay4KLQotPG5hbWU+IG11c3QgYmUgYSBrbm93biB0YXJnZXQuICBWYWxpZCBvbmVzIGluY2x1ZGUgIm02OGstYXBwbGUtbWFjb3MiLAotInBvd2VycGMtYXBwbGUtbWFjb3MiLCAiaTM4Ni11bmtub3duLWdvMzIiLCAibWlwcy1pZHQtZWNvZmYiLCBhbmQKLSJzaC1oaXRhY2hpLWhtcyIuICBOb3QgYWxsIHRhcmdldCB0eXBlcyBhcmUgYWNjZXB0ZWQgZm9yIGFsbCBvZiB0aGUKLXRvb2xzIHlldC4KLQotPGNvbXBpbGVyPiBtdXN0IGJlIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byB1c2UuICBJdCBkZWZhdWx0cyB0byAibXB3YyIuCi0KLQkobTY4aykKLQltcHdjCU1QVyBDCi0Jc2M2OGsJU3ltYW50ZWMgQwotCW13YzY4awlNZXRyb3dlcmtzIEMgKENvZGV3YXJyaW9yKQotCWdjYzY4awlHQ0MKLQotCShwb3dlcnBjKQotCXBwY2MJUFBDQwotCW1yYwlNYWNpbnRvc2ggb24gUmlzQyAoTWlzdGVyIEMsIGFrYSg/KSBGcmFua2Vuc3RlaW4pCi0Jc2NwcGMJU3ltYW50ZWMgQwotCW13Y3BwYwlNZXRyb3dlcmtzIEMgKENvZGV3YXJyaW9yKQotCWdjY3BwYwlHQ0MKLQotTm90IGFsbCBjb21waWxlcnMgd2lsbCBjb21waWxlIGFsbCB0b29scyBlcXVhbGx5IHdlbGwhICBGb3IgbTY4ayBNYWNzLAotTVBXIEMgaGFzIHRoZSBiZXN0IHJlY29yZCBzbyBmYXIgKGl0IGhhcyBwcm9ibGVtcywgYnV0IHRoZXkgY2FuIGJlCi13b3JrZWQgYXJvdW5kKSwgd2hpbGUgZm9yIFBvd2VyTWFjcywgQ29kZVdhcnJpb3IgaXMgdGhlIG9ubHkgY29tcGlsZXIKLXRoYXQgaGFzIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBldmVyeXRoaW5nIGludG8gcnVubmluZyBjb2RlLgotCi08cHJlZml4PiBpcyB0aGUgcGF0aCB0aGF0ICJnY2MiIHdpbGwgcHJlcGVuZCB3aGVuIGxvb2tpbmcgZm9yIHRvb2xzCi10byBleGVjdXRlLiAgR0NDX0VYRUNfUFJFRklYIG92ZXJyaWRlcyB0aGlzIHZhbHVlLCBzbyB5b3UgbmVlZCBub3QKLWluY2x1ZGUgaXQgaWYgeW91IHBsYW4gdG8gdXNlIEdDQ19FWEVDX1BSRUZJWC4KLQotQXMgYW4gZXhhbXBsZSwgaGVyZSBpcyB0aGUgY29uZmlndXJlIGxpbmUgdGhhdCB5b3UgY291bGQgdXNlIHRvIGJ1aWxkCi1uYXRpdmUgUG93ZXJNYWMgR0NDOgotCi0ie0Jvb3R9IkN5Z251czpzcmM6bXB3LWNvbmZpZ3VyZSAtLWNjIG13Y3BwYyAtLXRhcmdldCBwb3dlcnBjLWFwcGxlLW1hY29zIC0tc3JjZGlyICJ7Qm9vdH0iQ3lnbnVzOnNyYzogLS1wcmVmaXggIntCb290fSJHTlVUb29sczoKLQotKiBCdWlsZGluZwotCi1JZiB5b3UgdXNlIENvZGVXYXJyaW9yLCB5b3UgKm11c3QqIGZpcnN0IHNldCBNV0NJbmNsdWRlcyB0bwote0NJbmNsdWRlc30uICBUaGlzIGlzIGJlY2F1c2UgeW91IHdpbGwgYmUgYnVpbGRpbmcgTVBXIHRvb2xzLCBhbmQKLXRoZWlyIHN0YW5kYXJkIEkvTyB3b3JrcyBieSBtYWtpbmcgcmVmZXJlbmNlcyB0byBkYXRhIHRoYXQgaXMgcGFydCBvZgotdGhlIE1QVyBTaGVsbCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBtdXN0IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQKLXdpdGggbWFjcm9zIHRoYXQgcmVmZXIgdG8gdGhhdCBkYXRhLCBhbmQgdGhvc2UgbWFjcm9zIGFyZSBpbgote0NJbmNsdWRlc30sIG5vdCB0aGUgZGVmYXVsdCB7TVdDSW5jbHVkZXN9LiAgV2l0aG91dCB0aGlzIGNoYW5nZSwgeW91Ci13aWxsIGVuY291bnRlciBwcm9ibGVtcyBjb21waWxpbmcgbGliaWJlcnR5L21wdy5jLCBidXQgdHdlYWtpbmcgdGhhdAotZmlsZSBvbmx5IG1hc2tzIHRoZSByZWFsIHByb2JsZW0sIGFuZCBkb2VzIG5vdCBmaXggaXQuCi0KLVRoZSBjb21tYW5kCi0KLQltcHctYnVpbGQKLQotd2lsbCBidWlsZCBldmVyeXRoaW5nLiBCdWlsZGluZyB3aWxsIHRha2Ugb3ZlciBhbiBob3VyIG9uIGEgUXVhZHJhIDgwMAotb3IgUG93ZXJNYWMgODEwMC8xMTAsIGxvbmdlciBpZiB0aGUgc291cmNlcyBhcmUgb24gYSBzaGFyZWQgdm9sdW1lLgotCi1Zb3UgbWF5IHNlZSBzb21lIHdhcm5pbmdzOyB0aGVzZSBhcmUgbW9zdGx5IGxpa2VseSBiZW5pZ24sIHR5cGljYWxseQotZGlzYWdyZWVtZW50cyBhYm91dCBkZWNsYXJhdGlvbnMgb2YgbGlicmFyeSBhbmQgc3lzdGVtIGZ1bmN0aW9ucy4KLQotKiBJbnN0YWxsaW5nCi0KLVRvIGluc3RhbGwgdGhlIGp1c3QtYnVpbHQgdG9vbHMsIHVzZSB0aGUgY29tbWFuZAotCi0JbXB3LWJ1aWxkIGluc3RhbGwKLQotVGhpcyBwYXJ0IG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGp1c3QgY29waWVzIGZpbGVzIHRvIHRoZQotbG9jYXRpb24gc3BlY2lmaWVkIGF0IGNvbmZpZ3VyZSB0aW1lIGJ5IDxwcmVmaXg+LCBhbmQsIGluIHNvbWUgY2FzZXMsCi1yZW5hbWVzIHRoZW0gZnJvbSB0ZW1wb3JhcnkgaW50ZXJuYWwgbmFtZXMgdG8gdGhlaXIgdXN1YWwgbmFtZXMuIFRoaXMKLWluc3RhbGwgcHJvY2VzcyBpcyAqbm90KiB0aGUgc2FtZSBhcyB3aGF0IHRoZSBJbnN0YWxsIHNjcmlwdCBkb2VzOwotSW5zdGFsbCBjYW4gY29weSB0b29scyBmcm9tIHRoZSBpbnN0YWxsYXRpb24gbG9jYXRpb24gY2hvc2VuIGF0Ci1jb25maWd1cmF0aW9uIHRpbWUgdG8gYSB1c2VyLWNob3NlbiBwbGFjZSwgYW5kIHNldHMgdXAgYSBVc2VyU3RhcnR1cAotZmlsZS4gIE5vdGUgdGhhdCB3aGlsZSB0aGUgSW5zdGFsbCBzY3JpcHQgaXMgb3B0aW9uYWwsIHRoZSBpbnN0YWxsCi1idWlsZCBhY3Rpb24gcGVyZm9ybXMgc29tZSB0YXNrcyB3b3VsZCBiZSB2ZXJ5IGhhcmQgdG8gcmVwbGljYXRlCi1tYW51YWxseSwgc28geW91IHNob3VsZCBhbHdheXMgZG8gaXQgYmVmb3JlIHVzaW5nIHRoZSB0b29scy4KLQotKiBLbm93biBQcm9ibGVtcyBXaXRoIFVzaW5nIFZhcmlvdXMgQ29tcGlsZXJzIHRvIEJ1aWxkCi0KLU1vc3QgdmVyc2lvbnMgb2YgTVBXIEMgaGF2ZSBwcm9ibGVtcyB3aXRoIGNvbXBpbGluZyBHTlUgc29mdHdhcmUuCi0KLU1QVyBDIDMuMi54IGhhcyBwcmVwcm9jZXNzaW5nIGJ1Z3MgdGhhdCByZW5kZXIgaXQgaW5jYXBhYmxlIG9mCi1jb21waWxpbmcgdGhlIEJGRCBsaWJyYXJ5LCBzbyBpdCBjYW4ndCBiZSB1c2VkIGF0IGFsbCBmb3IgYnVpbGRpbmcgQkZELgotCi1NUFcgQyAzLjMsIDMuMy4xLCBhbmQgMy4zLjIgd2lsbCBzcG9udGFuZW91c2x5IGNsYWltIHRvIGhhdmUgZm91bmQKLWVycm9ycyBpbiB0aGUgc291cmNlIGNvZGUsIGJ1dCBpbiBmYWN0IHRoZSBjb2RlIGlzIHBlcmZlY3RseSBmaW5lLiAgSWYKLXRoaXMgaGFwcGVucywganVzdCBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJhY2sgdG8gdGhlIHRvcC1sZXZlbAotb2JqZGlyICh3aGVyZSB0aGUgY29uZmlndXJlIGNvbW1hbmQgYWJvdmUgd2FzIHBlcmZvcm1lZCksIGFuZCB0eXBlCi0ibXB3LWJ1aWxkIGFsbCIgYWdhaW4uICBJZiBpdCBnb2VzIG9uIHRocm91Z2ggdGhlIHN1cHBvc2VkIGVycm9yLCB0aGVuCi15b3UgZ290IG9uZSBvZiB0aGUgc3B1cmlvdXMgZXJyb3JzLiAgQSBmdWxsIGJ1aWxkIG1heSByZXF1aXJlIGEgbnVtYmVyCi1vZiB0aGVzZSByZXN0YXJ0cy4KLQotTVBXIEMgMy4zLjMgc2VlbXMgdG8gd29yayBPSywgYXQgbGVhc3Qgd2l0aCB0aGUgYWlkIG9mIGEgbnVtYmVyIG9mCi13b3JrYXJvdW5kcyB0aGF0IGFyZSBpbiB0aGUgc291cmNlcyAobG9vayBmb3IgI2lmZGVmIE1QV19DKS4KLQotVmVyc2lvbnMgb2YgTVBXIE1ha2UgZWFybGllciB0aGFuIDQuMGQyIGhhdmUgZXhoaWJpdGVkIGJpemFycmUgYmVoYXZpb3IsCi1mYWlsdXJlIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzIGFuZCB0aGUgbGlrZS4KLQotTWV0cm93ZXJrcyBDVzYgUFBDIGxpbmtlciAoTVdMaW5rUFBDKSBzZWVtcyB0byBkbyBiYWQgdGhpbmdzIHdpdGggbWVtb3J5Ci1pZiB0aGUgIk1vZGVybiBNZW1vcnkgTWFuYWdlciIgaXMgdHVybmVkIG9uIChpbiB0aGUgTWVtb3J5IGNvbnRyb2wgcGFuZWwpLAotYnV0IHdvcmtzIE9LIGlmIGl0IGlzIHR1cm5lZCBvZmYuCi0KLU1ldHJvd2Vya3MgQ1c2IGxvc2VzIGJpZ3RpbWUgY29tcGlsaW5nIG9wY29kZXM6cHBjLW9wYy5jLCB3aGljaCBoYXMKLXNvbWUgZGVlcGx5IG5lc3RlZCBtYWNyb3MuICAoQ1c3IGlzIE9LLikgIFRoZXJlIGlzIGEgd2F5IHRvIHBhdGNoIHRoZQotZmlsZSwgYnkgc3Vic3RpdHV0aW5nIGNvbnN0YW50IHZhbHVlcy4gIElmIHlvdSBuZWVkIHRvIGRvIHRoaXMsCi1jb250YWN0IHNoZWJzQGN5Z251cy5jb20gZm9yIGRldGFpbHMuCi0KLTxHZXN0YWx0Lmg+IGlzIG1pc3NpbmcgZnJvbSB7Q0luY2x1ZGVzfSBpbiB0aGUgTVBXIHZlcnNpb24gdGhhdCBjb21lcwotd2l0aCBDVzcuICBZb3UgY2FuIGp1c3QgY29weSB0aGUgb25lIGluIENXNydzIHtNV0NJbmNsdWRlc30uCi0KLUNXOCBhbmQgbGF0ZXIgaGF2ZSBjaGFuZ2VzIHRvIGhlYWRlcnMgYW5kIHN1Y2ggdGhhdCB3aWxsIHJlcXVpcmUgY2hhbmdlcwotdG8gdGhlIHNvdXJjZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIHRvIHJlYnVpbGQuCi0KLUtOT1dOIEJVR1MKLQotVGhlIGRlY2xhcmF0aW9ucyBmb3IgbWVtY3B5IGFuZCBtZW1jbXAgaW4gc29tZSB2ZXJzaW9ucyBvZiBoZWFkZXIgZmlsZXMKLW1heSBjb25mbGljdCB3aXRoIEdDQydzIGJ1aWx0aW4gZGVmaW5pdGlvbi4gIEVpdGhlciB1c2UgLWZuby1idWlsdGluCi1vciBpZ25vcmUgdGhlIHdhcm5pbmdzLgotCi1UaGlzIGlzIG5vdCBhIGJ1ZywgYnV0IC0gd2F0Y2ggb3V0IGZvciBjci9ubCB0cmFuc2xhdGlvbiEgIEZvciBpbnN0YW5jZSwKLWlmIGNvbmZpZy9tcHctbWgtbXB3IGlzIG5vdCBwcm9wZXJseSB0cmFuc2xhdGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4KLWNvcGllZCBvciB1cGRhdGVkIHNlcGFyYXRlbHksIHRoZW4gZXZlcnl0aGluZyB3aWxsIGFsbW9zdCBidWlsZCwgYnV0Ci15b3Ugd2lsbCBnZXQgcHV6emxpbmcgZXJyb3IgbWVzc2FnZXMgZnJvbSBtYWtlIG9yIHRoZSBjb21waWxlci4KLQotJy8nIG9yICcgJyBlbWJlZGRlZCBpbiBhbnkgZGV2aWNlLCBkaXJlY3RvcnksIG9yIGZpbGUgbmFtZSBtYXkgb3IgbWF5Ci1ub3Qgd29yay4KLQotb2JqY29weSAtTyBzcmVjIGZvby5vIG1ha2VzIHJhbmRvbSBvdXRwdXQgZmlsZW5hbWVzLgotCi1NYWMteC1taXBzIHJlcXVpcmVzIC1tZ2FzIGJ1dCBVbml4IGhvc3RzIGRvbid0LgotCi1HREIgd2lsbCBmcmVxdWVudGx5IHJlcXVpcmUgYSAnLycgb24gdGhlIGZyb250IG9mIGEgZGV2aWNlIG5hbWUgaW4gb3JkZXIKLXRvIHJlY29nbml6ZSBpdCBhcyBhbiBhYnNvbHV0ZSByYXRoZXIgdGhhbiBhIHJlbGF0aXZlIHBhdGhuYW1lLgotCi1HREIgZG9lc24ndCBzZWVtIHRvIHVzZSB0aGUgcHJpbnRlciBwb3J0IGNvcnJlY3RseSwgYWx0aG91Z2ggaXQgdHJpZXMuCi0KLVRoZSBjdXJzb3IgZG9lc24ndCBhbHdheXMgc3BpbiBhcyBtdWNoIGFzIGl0IHNob3VsZC4gIFRvIGdldCBlbGFib3JhdGUKLXN0YXRpc3RpY3MgYW5kIHdhcm5pbmdzIGFib3V0IHNwaW4gcmF0ZXMsIGFkZCB0aGlzIHRvIFVzZXJTdGFydHVwOgotCi0Jc2V0IE1FQVNVUkVfU1BJTiBhbGwKLQlleHBvcnQgTUVBU1VSRV9TUElOCmRpZmYgLS1naXQgYS9tcHctYnVpbGQuaW4gYi9tcHctYnVpbGQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZDk1MzAuLjAwMDAwMDAKLS0tIGEvbXB3LWJ1aWxkLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLSMgVG9wLWxldmVsIHNjcmlwdCBmcmFnbWVudCB0byBidWlsZCBldmVyeXRoaW5nIGZvciBNUFcuCi0KLVNldCBzYXZlZGlyICJgRGlyZWN0b3J5YCIKLQotI1NldCBFY2hvIDEKLQotU2V0IFRoaXNTY3JpcHQgInswfSIKLQotU2V0IG9iamRpciAiOiIKLQotU2V0IHZlcmlmeSAwCi0KLVNldCBCdWlsZFRhcmdldCAibm9uZSIKLQotIyBQYXJzZSBhcmd1bWVudHMuCi0KLUxvb3AKLQlCcmVhayBJZiB7I30gPT0gMAotCQlJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL25vbmUvCi0JCQlTZXQgQnVpbGRUYXJnZXQgInsxfSIKLQkJRWxzZQotCQkJRWNobyBPbmx5IG9uZSBidWlsZCB0YXJnZXQgYWxsb3dlZCwgaWdub3JpbmcgInsxfSIKLQkJRW5kIElmCi0JU2hpZnQgMQotRW5kIExvb3AKLQotSWYgIntCdWlsZFRhcmdldH0iID1+IC9ub25lLwotCVNldCBCdWlsZFRhcmdldCAiYWxsIgotRW5kIElmCi0KLUlmIHt2ZXJpZnl9ID09IDEKLQlFY2hvICIjIiBEb2luZyAie1RoaXNTY3JpcHR9IiAie0J1aWxkVGFyZ2V0fSIgaW4gImBEaXJlY3RvcnlgIiAuLi4gCi1FbmQgSWYKLQotU2V0IHJhbm1ha2UgMAotCi1JZiAiYEV4aXN0cyBNYWtlZmlsZWAiICE9ICIiCi0JRWNobyAiU2V0IEVjaG8gMSIgPntCdWlsZFRhcmdldH0ubWFrZW91dAotCU1ha2UgLWYgTWFrZWZpbGUge0J1aWxkVGFyZ2V0fSA+PntCdWlsZFRhcmdldH0ubWFrZW91dAotCXtCdWlsZFRhcmdldH0ubWFrZW91dAotCURlbGV0ZSB7QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQlTZXQgcmFubWFrZSAxCi1FbmQgSWYKLQotSWYgImBFeGlzdHMgTWFrZWZpbGUuUFBDYCIgIT0gIiIKLQlFY2hvICJTZXQgRWNobyAxIiA+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCU1ha2UgLWYgTWFrZWZpbGUuUFBDIHtCdWlsZFRhcmdldH0gPj57QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0Je0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCURlbGV0ZSB7QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0JU2V0IHJhbm1ha2UgMQotRW5kIElmCi0KLUlmIHtyYW5tYWtlfSA9PSAxCi0JRXhpdAotRW5kIElmCi0KLSMgRGlzcGF0Y2ggb24gdmFyaW91cyBwc2V1ZG8tdGFyZ2V0cy4KLQotSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwvCi0JRWNobyBTdGFydGVkIGBEYXRlYAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1nY2MKLQkie1RoaXNTY3JpcHR9IiBhbGwtZ2RiCi0JRWNobyBGaW5pc2hlZCBgRGF0ZWAKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtbGliaWJlcnR5LwotCSJ7VGhpc1NjcmlwdH0iIGRvLWxpYmliZXJ0eQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1iZmQvCi0JIntUaGlzU2NyaXB0fSIgZG8tYmZkCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLW9wY29kZXMvCi0JIntUaGlzU2NyaXB0fSIgZG8tb3Bjb2RlcwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1ieWFjYy8KLQkie1RoaXNTY3JpcHR9IiBkby1ieWFjYwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1mbGV4LwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBkby1mbGV4Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJpbnV0aWxzLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1iaW51dGlscwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nYXMvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWdhcwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nY2MvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1nYXMKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmludXRpbHMKLQkie1RoaXNTY3JpcHR9IiBhbGwtbGQKLQkie1RoaXNTY3JpcHR9IiBkby1nY2MKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ2RiLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1nZGIKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ3Jlei8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGRvLWdyZXoKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtbGQvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWxkCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tYnlhY2MvCi0JU2V0RGlyZWN0b3J5IDpieWFjYzoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1mbGV4LwotCVNldERpcmVjdG9yeSA6ZmxleDoKLQk6Om1wdy1idWlsZCBfYm9vdHN0cmFwCi0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tYmZkLwotCVNldERpcmVjdG9yeSA6YmZkOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWxpYmliZXJ0eS8KLQlTZXREaXJlY3RvcnkgOmxpYmliZXJ0eToKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1vcGNvZGVzLwotCVNldERpcmVjdG9yeSA6b3Bjb2RlczoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1iaW51dGlscy8KLQlTZXREaXJlY3RvcnkgOmJpbnV0aWxzOgotCTo6bXB3LWJ1aWxkIHN0YW1wcwotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdhcy8KLQlTZXREaXJlY3RvcnkgOmdhczoKLQk6Om1wdy1idWlsZCBzdGFtcHMKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1nY2MvCi0JU2V0RGlyZWN0b3J5IDpnY2M6Ci0JOm1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1nZGIvCi0JU2V0RGlyZWN0b3J5IDpnZGI6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ3Jlei8KLQlTZXREaXJlY3RvcnkgOmdyZXo6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tbGQvCi0JU2V0RGlyZWN0b3J5IDpsZDoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1uZXdsaWIvCi0JU2V0RGlyZWN0b3J5IDpuZXdsaWI6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC8KLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktdG9wCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1iaW51dGlscwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtZ2FzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nY2MKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWxkCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nZGIKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWJpbnV0aWxzLwotCVNldERpcmVjdG9yeSA6YmludXRpbHM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2FzLwotCVNldERpcmVjdG9yeSA6Z2FzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdjYy8KLQlTZXREaXJlY3RvcnkgOmdjYzoKLQk6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdkYi8KLQlTZXREaXJlY3RvcnkgOmdkYjoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1ncmV6LwotCVNldERpcmVjdG9yeSA6Z3JlejoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1sZC8KLQlTZXREaXJlY3RvcnkgOmxkOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHkvCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LXRvcAotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1iaW51dGlscwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1nYXMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktZ2NjCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWdkYgotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1sZAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1iaW51dGlscy8KLQlTZXREaXJlY3RvcnkgOmJpbnV0aWxzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1nYXMvCi0JU2V0RGlyZWN0b3J5IDpnYXM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdjYy8KLQlTZXREaXJlY3RvcnkgOmdjYzoKLQk6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1nZGIvCi0JU2V0RGlyZWN0b3J5IDpnZGI6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdyZXovCi0JU2V0RGlyZWN0b3J5IDpncmV6OgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1sZC8KLQlTZXREaXJlY3RvcnkgOmxkOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS10b3AvCi0JTmV3Rm9sZGVyUmVjdXJzaXZlICJ7cHJlZml4fSIKLQlJZiAie3ByZWZpeH0iICE9ICJgRGlyZWN0b3J5YCIKLQkJRHVwbGljYXRlIC15ICdSZWFkIE1lIGZvciBNUFcnICJ7cHJlZml4fSInUmVhZCBNZSBmb3IgTVBXJwotCQlEdXBsaWNhdGUgLXkgSW5zdGFsbCAie3ByZWZpeH0iSW5zdGFsbAotCUVuZCBJZgotRWxzZQotCUVjaG8ge0J1aWxkVGFyZ2V0fSBub3QgdW5kZXJzdG9vZCwgaWdub3JpbmcKLUVuZCBJZgotCi1TZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKZGlmZiAtLWdpdCBhL21wdy1jb25maWcuaW4gYi9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI4NzM3Li4wMDAwMDAwCi0tLSBhL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBDeWdudXMgc291cmNlIHRyZWUuCi0KLSMgQ2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhbGwgdGhlIHNwZWNpYWwgdG9vbHMgdGhhdCB3ZSB3aWxsIG5lZWQuCi0jIFRoZSB0ZXN0IGZvciBzZWQgaXMgc2VtaS1wb2ludGxlc3MsIGJlY2F1c2UgaXQncyBhbHJlYWR5IGJlZW4gaW52b2tlZAotIyBieSB0aGUgY2FsY3VsYXRpb24gb2YgdGFyZ2V0X2NwdSBpbiB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0LCBidXQKLSMgdGhlIHRlc3Qgd2lsbCBhbHNvIHNob3cgd2hpY2ggb25lIGlzIGJlaW5nIHVzZWQuCi0KLVNldCBFeGl0IDAKLUVjaG8gYnlhY2MgaXMgYFdoaWNoIGJ5YWNjYAotRWNobyBmbGV4IGlzIGBXaGljaCBmbGV4YAotRWNobyBmb3J3YXJkLWluY2x1ZGUgaXMgYFdoaWNoIGZvcndhcmQtaW5jbHVkZWAKLUVjaG8gTW92ZUlmQ2hhbmdlIGlzIGBXaGljaCBNb3ZlSWZDaGFuZ2VgCi1FY2hvIG1wdy10b3VjaCBpcyBgV2hpY2ggbXB3LXRvdWNoYAotRWNobyBtcHctdHJ1ZSBpcyBgV2hpY2ggbXB3LXRydWVgCi1FY2hvIE5ld0ZvbGRlclJlY3Vyc2l2ZSBpcyBgV2hpY2ggTmV3Rm9sZGVyUmVjdXJzaXZlYAotRWNobyBudWxsLWNvbW1hbmQgaXMgYFdoaWNoIG51bGwtY29tbWFuZGAKLUVjaG8gb3Blbi1icmFjZSBpcyBgV2hpY2ggb3Blbi1icmFjZWAKLUVjaG8gc2VkIGlzIGBXaGljaCBzZWRgCi1FY2hvICd0ci03dG84JyBpcyBgV2hpY2ggdHItN3RvOGAKLUVjaG8gdHJ1ZSBpcyBgV2hpY2ggdHJ1ZWAKLVNldCBFeGl0IDEKLQotU2V0IGhvc3RfbGlicyAibW1hbGxvYyBsaWJpYmVydHkgb3Bjb2RlcyBiZmQgcmVhZGxpbmUgZ2FzaCB0Y2wgdGsgdGNsWCIKLQotU2V0IGhvc3RfdG9vbHMgInRleGluZm8gYnlhY2MgZmxleCBiaXNvbiBiaW51dGlscyBsZCBnYXMgZ2NjIGdkYiBtYWtlIHBhdGNoIFxPcHRpb24tZAotCSAgICBwcm1zIHNlbmQtcHIgZ3Byb2YgZ2RidGVzdCB0Z2FzIGV0YyBleHBlY3QgZGVqYWdudSBzaW0gYmFzaCBcT3B0aW9uLWQKLQkgICAgbTQgYXV0b2NvbmYgaXNwZWxsIGdyZXAgZGlmZiByY3MgY3ZzIGZpbGV1dGlscyBzaGVsbHV0aWxzIHRpbWUgXE9wdGlvbi1kCi0JICAgIHRleHR1dGlscyB3ZGlmZiBmaW5kIGVtYWNzIGVtYWNzMTkgdXVkZWNvZGUgaGVsbG8gdGFyIGd6aXAgaW5kZW50IFxPcHRpb24tZAotCSAgICByZWNvZGUgcmVsZWFzZSBzZWQgdXRpbHMgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBnYXdrIgotCi1TZXQgdGFyZ2V0X2xpYnMgIm5ld2xpYiIKLQotU2V0IHRhcmdldF90b29scyAiZXhhbXBsZXMiCi0KLSMgQ29uZmlndXJlIHRoZSByZXNvdXJjZSBjb21waWxlciBpZiB0YXJnZXRpbmcgTWFjcy4KLUlmIHt0YXJnZXRfb3N9ID1+IC9tYWNvcy8gfHwge3RhcmdldF9vc30gPX4gL21wdy8KLQlTZXQgaG9zdF90b29scyAie2hvc3RfdG9vbHN9IGdyZXoiCi1FbmQgSWYKLQkKLVNldCBjb25maWdkaXJzICJ7aG9zdF9saWJzfSB7aG9zdF90b29sc30ge3RhcmdldF9saWJzfSB7dGFyZ2V0X3Rvb2xzfSIKLUV4cG9ydCBjb25maWdkaXJzCi0KLSMgTWFrZSB1cCBhIHNwZWNpYWwgaW5jbHVkZSBkaXJlY3RvcnkgdGhhdCB0b29scyB3aWxsIHNoYXJlLgotCi1JZiAiYEV4aXN0cyAie29iamRpcn0iZXh0cmEtaW5jbHVkZWAiID09ICIiCi0JTmV3Rm9sZGVyICJ7b2JqZGlyfSJleHRyYS1pbmNsdWRlCi1FbmQgSWYKLQotU2V0IGVkaXIgIntvYmpkaXJ9ZXh0cmEtaW5jbHVkZToiCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOmZpbGUuaCAie2VkaXJ9IidzeXMvZmlsZS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6aW9jdGwuaCAie2VkaXJ9IidzeXMvaW9jdGwuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnBhcmFtLmggIntlZGlyfSInc3lzL3BhcmFtLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpyZXNvdXJjZS5oICJ7ZWRpcn0iJ3N5cy9yZXNvdXJjZS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6c3RhdC5oICJ7ZWRpcn0iJ3N5cy9zdGF0LmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czp0aW1lLmggIntlZGlyfSInc3lzL3RpbWUuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnR5cGVzLmggIntlZGlyfSInc3lzL3R5cGVzLmgnCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDphb3V0NjQuaCAie2VkaXJ9Iidhb3V0L2FvdXQ2NC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OmFyLmggIntlZGlyfSInYW91dC9hci5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnJhbmxpYi5oICJ7ZWRpcn0iJ2FvdXQvcmFubGliLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6cmVsb2MuaCAie2VkaXJ9Iidhb3V0L3JlbG9jLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6c3RhYi5kZWYgIntlZGlyfSInYW91dC9zdGFiLmRlZicKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpzdGFiX2dudS5oICJ7ZWRpcn0iJ2FvdXQvc3RhYl9nbnUuaCcKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInYW91dC8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOmVjb2ZmLmggIntlZGlyfSInY29mZi9lY29mZi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOmludGVybmFsLmggIntlZGlyfSInY29mZi9pbnRlcm5hbC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnN5bS5oICJ7ZWRpcn0iJ2NvZmYvc3ltLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6c3ltY29uc3QuaCAie2VkaXJ9Iidjb2ZmL3N5bWNvbnN0LmgnCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2NvZmYvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi1JZiAie3RhcmdldF9jcHV9IiA9fiAvcG93ZXJwYy8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6cnM2MDAwLmggIntlZGlyfSInY29mZi9yczYwMDAuaCcKLUVuZCBJZgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpjb21tb24uaCAie2VkaXJ9IidlbGYvY29tbW9uLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpkd2FyZi5oICJ7ZWRpcn0iJ2VsZi9kd2FyZi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZHdhcmYyLmggIntlZGlyfSInZWxmL2R3YXJmMi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZXh0ZXJuYWwuaCAie2VkaXJ9IidlbGYvZXh0ZXJuYWwuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmludGVybmFsLmggIntlZGlyfSInZWxmL2ludGVybmFsLmgnCi0KLSMgQmVsaWV2ZSBpdCBvciBub3QsIEdEQiBuZWVkcyB0aGlzIGZvciBhbGwgdGFyZ2V0cy4KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOm1pcHMuaCAie2VkaXJ9IidlbGYvbWlwcy5oJwotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInZWxmLycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6cHBjLmggIntlZGlyfSInZWxmL3BwYy5oJwotRW5kIElmCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9IidvcGNvZGUvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi1JZiAie3RhcmdldF9jcHV9IiA9fiAvcG93ZXJwYy8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOm9wY29kZTpwcGMuaCAie2VkaXJ9IidvcGNvZGUvcHBjLmgnCi1FbmQgSWYKLQotIyBBZGQgc29tZSBiZmQgaW5jbHVkZXMgdGhhdCBnZXQgbWVudGlvbmVkIG91dHNpZGUgdGhlIGJmZCBkaXIuCi0JCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJiZmQ6bGliY29mZi5oICJ7ZWRpcn0iJ2JmZC9saWJjb2ZmLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJiZmQ6bGliZWNvZmYuaCAie2VkaXJ9IidiZmQvbGliZWNvZmYuaCcKLQotIyBUcmFuc2xhdGUgcmFuZG9tIGZpbGVzIGludG8gTVBXLW9ubHkgY2hhcmFjdGVyIHNldC4KLQotdHItN3RvOCAie3NyY2Rpcn0ibXB3LVJFQURNRSA+ICJ7b2JqZGlyfVJlYWQgTWUgZm9yIE1QVyIKLXRyLTd0bzggIntzcmNkaXJ9Im1wdy1pbnN0YWxsID4gIntvYmpkaXJ9Ikluc3RhbGwKZGlmZiAtLWdpdCBhL21wdy1jb25maWd1cmUgYi9tcHctY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ1MTQ4Li4wMDAwMDAwCi0tLSBhL21wdy1jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIHNjcmlwdAotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyMgV0FSTklORwotIyMjIFRoaXMgc2NyaXB0IG11c3QgTk9UIHVzZSBhbnkgOC1iaXQgY2hhcnMhCi0jIyMgV0FSTklORwotCi0jIFRoaXMgaXMgYW4gTVBXIFNoZWxsIHNjcmlwdCB0aGF0IHNldHMgZXZlcnl0aGluZyB1cCBmb3IgY29tcGlsYXRpb24sCi0jIG1haW5seSBjcmVhdGluZyBkaXJlY3RvcmllcywgYW5kIGVkaXRpbmcgY29waWVzIG9mIGZpbGVzLgotCi1TZXQgc2F2ZWRpciAiYERpcmVjdG9yeWAiCi0KLSNTZXQgRWNobyAxCi0KLVNldCBUaGlzU2NyaXB0ICJ7MH0iCi0KLVNldCBzcmNyb290ICItLS0tLS0tLSIKLQotU2V0IHNyY2RpciAiOiIKLQotU2V0IG9iamRpciAiOiIKLQotU2V0IHByZWZpeCAie01QV30iOkdOVVRvb2xzOgotCi1TZXQgZXhlY19wcmVmaXggIiIKLQotU2V0IGJpbmRpciAiIgotCi1TZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0KLVNldCB0YXJnZXRfYWxpYXMge2hvc3RfYWxpYXN9Ci0KLVNldCBob3N0X2NjICJtcHdjIgotCi1TZXQgd2l0aF9nbnVfbGQgMAotCi1TZXQgaGVscG91dHB1dCAwCi0KLVNldCByZWN1cnNlIDEKLQotU2V0IHZlcmlmeSAwCi1TZXQgdmVyaWZ5c3RyICIiCi0KLVNldCBlbmFibGVfb3B0aW9ucyAiIgotU2V0IGRpc2FibGVfb3B0aW9ucyAiIgotCi0jIFBhcnNlIGFyZ3VtZW50cy4KLQotTG9vcAotCUJyZWFrIElmIHsjfSA9PSAwCi0JSWYgInsxfSIgPX4gLy0tY2MvCi0JCVNldCBob3N0X2NjICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWJpbmRpci8KLQkJU2V0IGJpbmRpciAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1kaXNhYmxlLT8rLwotCQlTZXQgYEVjaG8gezF9IHwgc2VkIC1lICdzLy0tZGlzYWJsZS0vZW5hYmxlXy8nYCBubwotCQlTZXQgZGlzYWJsZV9vcHRpb25zICJ7ZGlzYWJsZV9vcHRpb25zfSAnezF9JyIKLQlFbHNlIElmICJ7MX0iID1+IC8tLWVuYWJsZS0/Ky8KLQkJU2V0IGBFY2hvIHsxfSB8IHNlZCAtZSAncy8tLWVuYWJsZS0vZW5hYmxlXy8nYCB5ZXMKLQkJU2V0IGVuYWJsZV9vcHRpb25zICJ7ZW5hYmxlX29wdGlvbnN9ICd7MX0nIgotCUVsc2UgSWYgInsxfSIgPX4gLy0tZXhlYy1wcmVmaXgvCi0JCVNldCBleGVjX3ByZWZpeCAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1oZWxwLwotCQlTZXQgaGVscG91dHB1dCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1ob3N0LwotCQlTZXQgaG9zdF9hbGlhcyAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1ub3JlY3Vyc2lvbi8KLQkJU2V0IHJlY3Vyc2UgMAotCUVsc2UgSWYgInsxfSIgPX4gLy0tcHJlZml4LwotCQlTZXQgcHJlZml4ICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLXNyY2Rpci8KLQkJU2V0IHNyY2RpciAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1zcmNyb290LwotCQlTZXQgc3Jjcm9vdCAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS10YXJnZXQvCi0JCVNldCB0YXJnZXRfYWxpYXMgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy12LwotCQlTZXQgdmVyaWZ5IDEKLQkJU2V0IHZlcmlmeXN0ciAiLXYiCi0JRWxzZSBJZiAiezF9IiA9fiAvLS13aXRoLWdudS1sZC8KLQkJU2V0IHdpdGhfZ251X2xkIDEKLQlFbHNlCi0JCUVjaG8gLW4gJ21wdy1jb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246ICInCi0JCUVjaG8gLW4gInsxfSIKLQkJRWNobyAnIjsgdXNlIC0taGVscCBmb3IgdXNhZ2UuJwotCQlFeGl0IDEKLQlFbmQgSWYKLQlTaGlmdCAxCi1FbmQgTG9vcAotCi1JZiB7aGVscG91dHB1dH0gPT0gMQotCUVjaG8gIlVzYWdlOiBtcHctY29uZmlndXJlIFtPUFRJT05TXSIKLQlFY2hvICIiCi0JRWNobyAiT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzXSIKLQlFY2hvICItLWJpbmRpciBESVIgICAgICBkaXJlY3RvcnkgZm9yIGJpbmFyaWVzIFtdIgotCUVjaG8gIi0tY2MgQ0MgICAgICAgICAgIHVzZSBDIGNvbXBpbGVyIENDIFttcHdjXSIKLQlFY2hvICItLWRpc2FibGUtRk9PICAgICBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTyIKLQlFY2hvICItLWVuYWJsZS1GT08gICAgICBpbmNsdWRlIGZlYXR1cmUgRk9PIgotCUVjaG8gIi0tZXhlYy1wcmVmaXggRElSIGluc3RhbGwgaG9zdC1kZXBlbmRlbnQgZmlsZXMgaW50byBESVIgW10iCi0JRWNobyAiLS1oZWxwICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgotCUVjaG8gIi0taG9zdCBIT1NUICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbbTY4ay1hcHBsZS1tcHddIgotCUVjaG8gIi0tbm9yZWN1cnNpb24gICAgIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXSIKLQlFY2hvICItLXByZWZpeCBESVIgICAgICBpbnN0YWxsIGludG8gRElSIFt7TVBXfTpHTlVUb29sczpdIgotCUVjaG8gIi0tc3JjZGlyIERJUiAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFs6XSIKLQlFY2hvICItLXNyY3Jvb3QgRElSICAgICBmaW5kIHRoZSB0b3BsZXZlbCBzb3VyY2VzIGluIERJUiBbOl0iCi0JRWNobyAiLS10YXJnZXQgVEFSR0VUICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXSIKLQlFY2hvICItdiAgICAgICAgICAgICAgICB2ZXJib3NlIgotCUVjaG8gIi0td2l0aC1nbnUtbGQgICAgIGxpbmsgdXNpbmcgR05VIGxkIFtub10iCi0JRXhpdCAwCi1FbmQgSWYKLQotU2V0IEV4aXQgMAotCi0jIERlZmF1bHQgZXhlY19wcmVmaXggZnJvbSBwcmVmaXguCi0KLUlmICJ7ZXhlY19wcmVmaXh9IiA9PSAiIgotCVNldCBleGVjX3ByZWZpeCAie3ByZWZpeH0iCi1FbmQgSWYKLQotSWYgIntiaW5kaXJ9IiA9PSAiIgotCVNldCBiaW5kaXIgIntwcmVmaXh9ImJpbjoKLUVuZCBJZgotCi0jIFBvaW50IHRvIHRoZSBjb3JyZWN0IHNldCBvZiB0b29scyB0byB1c2Ugd2l0aCB0aGUgY2hvc2VuIGNvbXBpbGVyLgotCi1JZiAie2hvc3RfY2N9IiA9fiAvbXB3Yy8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NUFdfQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfTElCfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9MSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX0N9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvc2M2OGsvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfU0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSX0xJQn0nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19DfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL213YzY4ay8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NV0M2OEt9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSX01XTElOSzY4S30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTVdMSU5LNjhLfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX01XQzY4S30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9nY2M2OGsvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfNjhLX0dDQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfNjhLX0FSfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfUkFOTElCfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDXzY4S19HQ0N9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9wcGNjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1BQQ0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9tcmMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVJDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvc2NwcGMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfU0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9td2NwcGMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVdDUFBDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9NV0xJTktQUEN9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX01XTElOS1BQQ30nCi0JIyBNaXNsZWFkaW5nLCBidXQgd2UgZG9uJ3QgbmVlZCBhIFBFRiBzdGVwLgotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfTVdDUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djY3BwYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19QUENfR0NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlJZiB7d2l0aF9nbnVfbGR9ID09IDEKLQkJU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX1JBTkxJQn0nCi0JCVNldCBjY19sZF9uYW1lICd7Q0NfTERfR0xEfScKLQlFbHNlCi0JCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQkJU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlFbmQgSWYKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZQotCUVjaG8gIntob3N0X2NjfSIgaXMgbm90IGEga25vd24gTVBXIGNvbXBpbGVyIHR5cGUKLUVuZCBJZgotCi1TZXQgZGFzaF9jX2ZsYWcgJycKLUlmICJ7aG9zdF9jY30iID1+IC9nY2M2OGsvCi0JU2V0IGRhc2hfY19mbGFnICctYycKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djY3BwYy8KLQlTZXQgZGFzaF9jX2ZsYWcgJy1jJwotRW5kIElmCi0KLSMgKHNob3VsZCBpbnRlcnByZXQgYWxpYXNlcyBpZiBub3QgaW4gY2Fub25pY2FsIGZvcm0pCi0KLVNldCBob3N0X2Nhbm9uaWNhbCAie2hvc3RfYWxpYXN9IgotCi1TZXQgdGFyZ2V0X2Nhbm9uaWNhbCAie3RhcmdldF9hbGlhc30iCi0KLVNldCBjb25maWdkaXJzICIiCi0KLUlmICJ7c3Jjcm9vdH0iID1+IC8tLS0tLS0tLS8KLQlTZXQgc3Jjcm9vdCAie3NyY2Rpcn0iCi1FbmQgSWYKLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJgIiA9PSAiIgotCUVjaG8gU291cmNlIGRpcmVjdG9yeSB7c3JjZGlyfSBkb2VzIG5vdCBleGlzdCEKLQlFeGl0IDEKLUVuZCBJZgotSWYgImBFeGlzdHMgIntzcmNyb290fSJgIiA9PSAiIgotCUVjaG8gVG9wLWxldmVsIHNvdXJjZSBkaXJlY3Rvcnkge3NyY3Jvb3R9IGRvZXMgbm90IGV4aXN0IQotCUV4aXQgMQotRW5kIElmCi0KLVNldCB0YXJnZXRfY3B1ICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMS8nYCIKLVNldCB0YXJnZXRfdmVuZG9yICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMi8nYCIKLVNldCB0YXJnZXRfb3MgImBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wzLydgIgotCi0jIENyZWF0ZSBhIGZpbGUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9sZGVyIHRoYW4gYW55IG90aGVyIGhlcmUuCi0KLUlmICJgRXhpc3RzICJ7b2JqZGlyfSJfb2xkZXN0YCIgPT0gIiIKLQltcHctdG91Y2ggX29sZGVzdAotRW5kIElmCi0KLSMgUmVjb3JkIHRoaXMgYmVmb3JlIGNyZWF0aW5nIGFueSBmaWxlcywgbWFrZWZpbGVzIHNvbWV0aW1lcyBtZW50aW9uCi0jIGRlcGVuZGVuY2llcyBvbiBjb25maWcuc3RhdHVzLgotCi1FY2hvICIjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6IiA+Y29uZmlnLm5ldwotRWNobyAie1RoaXNTY3JpcHR9IC0taG9zdCB7aG9zdF9hbGlhc30gLS10YXJnZXQge3RhcmdldF9hbGlhc30gLS1zcmNkaXIge3NyY2Rpcn0gIC0tc3Jjcm9vdCB7c3Jjcm9vdH0gIC0tcHJlZml4IHtwcmVmaXh9IC0tY2Mge2hvc3RfY2N9IHt2ZXJpZnlzdHJ9IHtlbmFibGVfb3B0aW9uc30ge2Rpc2FibGVfb3B0aW9uc30gLS1ub3JlY3Vyc2lvbiIgPj5jb25maWcubmV3Ci1Nb3ZlSWZDaGFuZ2UgY29uZmlnLm5ldyBjb25maWcuc3RhdHVzCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctY29uZmlnLmluYCIgIT0gIiIKLQl0ci03dG84ICJ7c3JjZGlyfSJtcHctY29uZmlnLmluID4ie29iamRpcn0ibXB3LWNvbmZpZy5pbgotCUV4ZWN1dGUgIntvYmpkaXJ9Im1wdy1jb25maWcuaW4KLUVuZCBJZgotCi0jIFN0YXJ0IE1ha2VmaWxlIGNvbnN0cnVjdGlvbiBieSBkZWZpbmluZyBhbGwgdGhlIHZhcmlhYmxlcyBjaG9zZW4gYnkKLSMgY29uZmlndXJhdGlvbi4KLQotRWNobyAiIyBUaGlzIE1ha2VmaWxlIHByb2R1Y2VkIGJ5IG1wdy1jb25maWd1cmUuICBDaGFuZ2VzIG1heSBnZXQgbG9zdCEiID4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAic3Jjcm9vdCA9ICIge3NyY3Jvb3R9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidG9wc3JjZGlyID0gIiB7c3Jjcm9vdH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJzcmNkaXIgPSAiIHtzcmNkaXJ9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAibXB3X3ByZWZpeCA9ICIge3ByZWZpeH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJtcHdfZXhlY19wcmVmaXggPSAiIHtleGVjX3ByZWZpeH0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIm1wd19iaW5kaXIgPSAiIHtiaW5kaXJ9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiaG9zdF9hbGlhcyA9ICIge2hvc3RfYWxpYXN9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfYWxpYXMgPSAiIHt0YXJnZXRfYWxpYXN9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfY3B1ID0gIiB7dGFyZ2V0X2NwdX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF92ZW5kb3IgPSAiIHt0YXJnZXRfdmVuZG9yfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X29zID0gIiB7dGFyZ2V0X29zfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9jYW5vbmljYWwgPSAiIHt0YXJnZXRfY2Fub25pY2FsfQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJob3N0X21ha2VmaWxlX2ZyYWcgPSAiCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAiCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiQ0MgPSAiIHtjY19uYW1lfQkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJBUiA9ICIge2FyX25hbWV9CQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIlJBTkxJQiA9ICIge3JhbmxpYl9uYW1lfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkNDX0xEID0gIiB7Y2NfbGRfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJQUk9HX0VYVCA9ICIge3Byb2dfZXh0X25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJFWFRSQUxJQlMgPSAiIHtleHRyYWxpYnNfbmFtZX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIk1BS0VQRUYgPSAiIHttYWtlcGVmX25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJSRVogPSAiIHtyZXpfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0KLUlmIHtob3N0X2NjfSA9fiAvZ2NjcHBjLwotCUVjaG8gLW4gImRxID1cT3B0aW9uLWRcT3B0aW9uLWRcT3B0aW9uLWQiID4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAKLQlFY2hvICciJyAJCQkJID4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0wCi0JdHItN3RvOCAgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAJPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbHNlCi0JRWNobyAtbiAiZHEgPSciIAkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFY2hvIC1uICciJyAJCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVjaG8gICAgIiciIAkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbmQgSWYKLQotIyBBcHBlbmQgdGhlIG1hc3RlciBzZXQgb2YgZGVmaW5pdGlvbnMgZm9yIHRoZSB2YXJpb3VzIGNvbXBpbGVycy4KLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9ImNvbmZpZzptcHctbWgtbXB3YCIgIT0gIiIKLQl0ci03dG84ICJ7c3JjZGlyfSJjb25maWc6bXB3LW1oLW1wdyA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVsc2UgSWYgImBFeGlzdHMgIntzcmNyb290fSJjb25maWc6bXB3LW1oLW1wd2AiICE9ICIiCi0JdHItN3RvOCAie3NyY3Jvb3R9ImNvbmZpZzptcHctbWgtbXB3ID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWxzZQotCUVjaG8gImNhbid0IGZpbmQgYSBob3N0IGNvbmZpZyBmaWxlISIKLQlFeGl0IDAKLUVuZCBJZgotCi0jIEFwcGVuZCBhbnl0aGluZyBwcm9kdWNlZCBieSB0aGUgZGlyZWN0b3J5J3MgbXB3LWNvbmZpZy5pbi4KLQotSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnRtcGAiICE9ICIiCi0JQ2F0ZW5hdGUgIntvYmpkaXJ9Im1rLnRtcCA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQkjIEFuIG1wdy1jb25maWcuaW4gbWlnaHQgY2hhbmdlIHNvIGFzIG5vdCB0byBjcmVhdGUgdGhpcwotCSMgYW55bW9yZSwgc28gZ2V0IHJpZCBvZiBpdCBub3cgdG8gYmUgc2FmZS4KLQlEZWxldGUgLWkgLXkgIntvYmpkaXJ9Im1rLnRtcAotRW5kIElmCi0KLSMgSWYgdGhlcmUgYXJlIHNlZCBzY3JpcHRzIHRvIGVkaXQgdGhlIFVuaXggTWFrZWZpbGUuaW4sIHVzZSB0aGVtOyBvdGhlcndpc2UKLSMgdXNlIGFuIG1wdy1tYWtlLmluIGlmIHByZXNlbnQuCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctbWFrZS5zZWRgIiAhPSAiIgotCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJoYWNrZWRfTWFrZWZpbGUuaW5gIiAhPSAiIgotCQlTZXQgTWFrZWZpbGVJbiAie29iamRpcn0iaGFja2VkX01ha2VmaWxlLmluCi0JRWxzZQotCQlTZXQgTWFrZWZpbGVJbiAie3NyY2Rpcn0iTWFrZWZpbGUuaW4KLQlFbmQgSWYKLQkjIEZpbmQgdGhlIGdlbmVyaWMgbWFrZWZpbGUgZWRpdGluZyBzY3JpcHQuCi0JSWYgImBFeGlzdHMgIntzcmNyb290fSJjb25maWc6bXB3OmctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3Jjcm9vdH0iY29uZmlnOm1wdzpnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbHNlIElmICJgRXhpc3RzICJ7c3Jjcm9vdH0idXRpbHM6bXB3OmctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3Jjcm9vdH0idXRpbHM6bXB3OmctbXB3LW1ha2Uuc2VkICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVsc2UgSWYgImBFeGlzdHMgIntzcmNkaXJ9ImctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3JjZGlyfSJnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbHNlCi0JCUVjaG8gV2FybmluZzogZy1tcHctbWFrZS5zZWQgbm90IGZvdW5kLCBjb3B5aW5nICJ7TWFrZWZpbGVJbn0iIHZlcmJhdGltLi4uCi0JCUNhdGVuYXRlICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVuZCBJZgotCXNlZCAtZiAie3NyY2Rpcn0ibXB3LW1ha2Uuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCXNlZCAtZSAncy9ecHJlZml4ID0gLiokL3ByZWZpeCA9IHttcHdfcHJlZml4fS9nJyAtZSAncy9eZXhlY19wcmVmaXggPSAuKiQvZXhlY19wcmVmaXggPSB7bXB3X2V4ZWNfcHJlZml4fS9nJyAtZSAncy9eYmluZGlyID0gQGJpbmRpckAvYmluZGlyID0ge21wd19iaW5kaXJ9L2cnICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yID4ie29iamRpcn0iTWFrZWZpbGUudGVtMwotCXNlZCAtZSAicy9AREFTSF9DX0ZMQUdAL3tkYXNoX2NfZmxhZ30vIiAtZSAicy9AU0VHTUVOVF9GTEFHKFwoW14pXSpcKSlAL3tzZWdtZW50X2ZsYWd9XDEvIiAie29iamRpcn0iTWFrZWZpbGUudGVtMyA+IntvYmpkaXJ9Im1wdy1tYWtlLmluCi0JdHItN3RvOCAie29iamRpcn0ibXB3LW1ha2UuaW4gPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi0JSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie29iamRpcn0ibWsuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0JCVJlbmFtZSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtMiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRW5kIElmCi0JTW92ZUlmQ2hhbmdlICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gIntvYmpkaXJ9Ik1ha2VmaWxlCi0JRGVsZXRlIC1pIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW1bMTJdCi0JSWYge3ZlcmlmeX0gPT0gMQotCQlFY2hvIENyZWF0ZWQgTWFrZWZpbGUgaW4gImBEaXJlY3RvcnlgIgotCUVuZCBJZgotRWxzZSBJZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LW1ha2UuaW5gIiAhPSAiIgotCXNlZCAtZSAncy9ecHJlZml4ID0gLiokL3ByZWZpeCA9IHttcHdfcHJlZml4fS9nJyAie3NyY2Rpcn0ibXB3LW1ha2UuaW4gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0Jc2VkIC1lICJzL0BEQVNIX0NfRkxBR0Ave2Rhc2hfY19mbGFnfS8iIC1lICJzL0BTRUdNRU5UX0ZMQUcoXChbXildKlwpKUAve3NlZ21lbnRfZmxhZ319XDEvIiAie29iamRpcn0iTWFrZWZpbGUudGVtMSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQl0ci03dG84ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJtay5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntvYmpkaXJ9Im1rLnNlZCAie29iamRpcn0iTWFrZWZpbGUudGVtID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCQlSZW5hbWUgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVuZCBJZgotCU1vdmVJZkNoYW5nZSAie29iamRpcn0iTWFrZWZpbGUudGVtICJ7b2JqZGlyfSJNYWtlZmlsZQotCURlbGV0ZSAtaSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtWzEyXQotCUlmIHt2ZXJpZnl9ID09IDEKLQkJRWNobyBDcmVhdGVkIE1ha2VmaWxlIGluICJgRGlyZWN0b3J5YCIKLQlFbmQgSWYKLUVuZCBJZgotCi0jIFByb2R1Y2UgYSBidWlsZCBzY3JpcHQgaWYgdGhlIHNvdXJjZSBpcyBkZWZpbmVkLgotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LWJ1aWxkLmluYCIgIT0gIiIKLQlFY2hvICJTZXQgc3Jjcm9vdCAiIHtzcmNyb290fSA+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JRWNobyAiU2V0IHNyY2RpciAiIHtzcmNkaXJ9ID4+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JRWNobyAiU2V0IHRhcmdldF9jYW5vbmljYWwgIiB7dGFyZ2V0X2Nhbm9uaWNhbH0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlFY2hvICJTZXQgcHJlZml4ICIge3ByZWZpeH0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQl0ci03dG84ICJ7c3JjZGlyfSJtcHctYnVpbGQuaW4gPj4ie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCU1vdmVJZkNoYW5nZSAie29iamRpcn0ibXB3LWJ1aWxkLnRlbSAie29iamRpcn0ibXB3LWJ1aWxkCi0JSWYge3ZlcmlmeX0gPT0gMQotCQlFY2hvIENyZWF0ZWQgbXB3LWJ1aWxkIGluICJgRGlyZWN0b3J5YCIKLQlFbmQgSWYKLUVuZCBJZgotCi0jIEFwcGx5IG91cnNlbHZlcyByZWN1cnNpdmVseSB0byB0aGUgbGlzdCBvZiBzdWJkaXJlY3RvcmllcyB0byBjb25maWd1cmUuCi0KLUlmIHtyZWN1cnNlfSA9PSAxCi0JRm9yIHN1YmRpciBJbiB7Y29uZmlnZGlyc30KLQkJU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgotCQlJZiAiYEV4aXN0cyAie3NyY2Rpcn17c3ViZGlyfToiYCIgPT0gIiIKLQkJCUlmIHt2ZXJpZnl9ID09IDEKLQkJCQlFY2hvIE5vICJ7c3JjZGlyfXtzdWJkaXJ9OiIgZm91bmQsIHNraXBwaW5nCi0JCQlFbmQgSWYKLQkJCUNvbnRpbnVlCi0JCUVuZCBJZgotCQlJZiB7dmVyaWZ5fSA9PSAxCi0JCQlFY2hvIENvbmZpZ3VyaW5nIHtzdWJkaXJ9Li4uCi0JCUVuZCBJZgotCQlJZiAiYEV4aXN0cyAie29iamRpcn17c3ViZGlyfToiYCIgPT0gIiIKLQkJCU5ld0ZvbGRlciAie29iamRpcn17c3ViZGlyfSIKLQkJRW5kIElmCi0JCVNldERpcmVjdG9yeSAie29iamRpcn17c3ViZGlyfToiCi0JCSJ7VGhpc1NjcmlwdH0iIC0tdGFyZ2V0ICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iIC0tc3JjZGlyICJ7c3JjZGlyfXtzdWJkaXJ9OiIgLS1zcmNyb290ICJ7c3Jjcm9vdH0iIC0tcHJlZml4ICJ7cHJlZml4fSIgLS1jYyAie2hvc3RfY2N9IiB7dmVyaWZ5c3RyfSB7ZW5hYmxlX29wdGlvbnN9IHtkaXNhYmxlX29wdGlvbnN9Ci0JCVNldERpcmVjdG9yeSAie3NhdmVkaXJ9IgotCUVuZCBGb3IKLUVuZCBJZgotCi1TZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKZGlmZiAtLWdpdCBhL21wdy1pbnN0YWxsIGIvbXB3LWluc3RhbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzVhYWMuLjAwMDAwMDAKLS0tIGEvbXB3LWluc3RhbGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotIyBHTlUgSW5zdGFsbCBzY3JpcHQgZm9yIE1QVy4KLQotU2V0IE9sZEV4aXQgIntFeGl0fSIKLVNldCBFeGl0IDAKLQotU2V0IFRlbXBVc2VyU3RhcnR1cCAie1RlbXBGb2xkZXJ9Il9fdGVtcF9fVXNlclN0YXJ0dXAKLQotRWNobyAnIyBVc2VyU3RhcnR1cCBnZW5lcmF0ZWQgYnkgR05VIEluc3RhbGwgc2NyaXB0JyA+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgKHNob3VsZCkgQ2hlY2sgdGhhdCBkaXNrIHNwYWNlIGlzIHN1ZmZpY2llbnQgZm9yIGluc3RhbGxhdGlvbi4KLQotIyBBc3N1bWUgdGhhdCB0aGUgaW5zdGFsbCBzY3JpcHQgaXMgd2hlcmUgZXZlcnl0aGluZyBlbHNlIGlzLgotCi1TZXQgdGhpc2RpciAiYERpcmVjdG9yeWAiCi0KLSMgQ29weSB0aGUgYmluYXJpZXMgdG8gdGhlIGRlc2lyZWQgcGxhY2UuCi0KLUNvbmZpcm0gLXQgIkNvcHkgdGhlIGJpbmFyaWVzIHRvIHNvbWV3aGVyZSBlbHNlPyIKLVNldCBUbXBTdGF0dXMge1N0YXR1c30KLUlmIHtUbXBTdGF0dXN9ID09IDAKLQlTZXQgYmluZGVzdCAiYEdldEZpbGVOYW1lIC1kIC1tICJXaGVyZSB0byBpbnN0YWxsIHRoZSBiaW5hcmllcz8iYCIKLQlJZiB7U3RhdHVzfSA9PSAwCi0JCUlmICJgRXhpc3RzICJ7dGhpc2Rpcn1iaW4iYCIgIT0gIiIKLQkJCUZvciBhZmlsZSBJbiAie3RoaXNkaXJ9ImJpbjpcT3B0aW9uLXgKLQkJCQlEdXBsaWNhdGUgLXkgInthZmlsZX0iICJ7YmluZGVzdH0iCi0JCQlFbmQgRm9yCi0JCUVsc2UKLQkJCUVjaG8gImJpbiBkaXJlY3Rvcnkgbm90IGZvdW5kLCBleGl0aW5nIgotCQkJRXhpdCAxCi0JCUVuZCBJZgotCUVsc2UKLQkJRWNobyAiTm8gZGVzdGluYXRpb24gc3VwcGxpZWQsIGV4aXRpbmciCi0JCUV4aXQgMQotCUVuZCBJZgotRWxzZSBJZiB7VG1wU3RhdHVzfSA9PSA0Ci0JIyBVc2UgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQlTZXQgYmluZGVzdCAie3RoaXNkaXJ9YmluOiIKLUVsc2UKLQkjIENhbmNlbGxlZCBmcm9tIGNvbmZpcm1hdGlvbiwgZXNjYXBlIGFsdG9nZXRoZXIuCi0JRXhpdCAxCi1FbmQgSWYKLQotIyBDb3B5IHRoZSBsaWJyYXJpZXMgdG8gdGhlIGRlc2lyZWQgcGxhY2UuCi0KLUNvbmZpcm0gLXQgIkNvcHkgdGhlIGxpYnJhcmllcyB0byBzb21ld2hlcmUgZWxzZT8iCi1TZXQgVG1wU3RhdHVzIHtTdGF0dXN9Ci1JZiB7VG1wU3RhdHVzfSA9PSAwCi0JU2V0IGxpYmRlc3QgImBHZXRGaWxlTmFtZSAtZCAtbSAiV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFyaWVzPyJgIgotCUlmIHtTdGF0dXN9ID09IDAKLQkJSWYgImBFeGlzdHMgInt0aGlzZGlyfWxpYjoiYCIgIT0gIiIKLQkJCUZvciBhZmlsZSBJbiAie3RoaXNkaXJ9ImxpYjpcT3B0aW9uLXgKLQkJCQlEdXBsaWNhdGUgLXkgInthZmlsZX0iICJ7bGliZGVzdH0iCi0JCQlFbmQgRm9yCi0JCUVsc2UKLQkJCUVjaG8gImxpYiBkaXJlY3Rvcnkgbm90IGZvdW5kLCBleGl0aW5nIgotCQkJRXhpdCAxCi0JCUVuZCBJZgotCUVsc2UKLQkJRWNobyAiTm8gZGVzdGluYXRpb24gc3VwcGxpZWQsIGV4aXRpbmciCi0JCUV4aXQgMQotCUVuZCBJZgotRWxzZSBJZiB7VG1wU3RhdHVzfSA9PSA0Ci0JIyBVc2UgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQlTZXQgbGliZGVzdCAie3RoaXNkaXJ9bGliOiIKLUVsc2UKLQkjIENhbmNlbGxlZCBmcm9tIGNvbmZpcm1hdGlvbiwgZXNjYXBlIGFsdG9nZXRoZXIuCi0JRXhpdCAxCi1FbmQgSWYKLQotCi0jIEFkZCB0aGUgbG9jYXRpb24gb2YgdGhlIGJpbmFyaWVzIHRvIHRoZSBjb21tYW5kIHBhdGguCi0KLUVjaG8gLW4gJ1NldCBDb21tYW5kcyAiJwkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gLW4gIntiaW5kZXN0fSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAgICAnLHtDb21tYW5kc30iJwkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIFNldCB1cCBHQ0MgZXhlYyBwcmVmaXguCi0KLVNldCBnY2NsaWJkaXIgIntsaWJkZXN0fSJnY2MtbGliOgotCi1FY2hvIC1uICdTZXQgR0NDX0VYRUNfUFJFRklYICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAtbiAie2djY2xpYmRpcn0iCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gICAgJyInCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICJFeHBvcnQgR0NDX0VYRUNfUFJFRklYIgkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgU2V0IHVwIHBhdGggdG8gbGliZ2NjLnhjb2ZmIGV0Yy4KLQotRWNobyAtbiAnU2V0IEdDQ1BQQ0xpYnJhcmllcyAiJwkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gLW4gIntsaWJkZXN0fSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAgICAnIicJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gIkV4cG9ydCBHQ0NQUENMaWJyYXJpZXMiCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyBEaXNwbGF5IGNvbnRlbnRzIG9mIFVzZXJTdGFydHVwLCBjb25maXJtIGluc3RhbGxhdGlvbi4KLQotU2V0IFVzZXJTdGFydHVwTmFtZSAiVXNlclN0YXJ0dXBcT3B0aW9uLThHTlUiCi0KLUVjaG8gIkNvbnRlbnRzIG9mIiB7VXNlclN0YXJ0dXBOYW1lfSAid2lsbCBiZToiCi1DYXRlbmF0ZSAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLUNvbmZpcm0gIkluc3RhbGwge1VzZXJTdGFydHVwTmFtZX0gaW50byB0aGUgTVBXIGZvbGRlciB7TVBXfSA/IgotSWYge1N0YXR1c30gPT0gMAotCUR1cGxpY2F0ZSAie1RlbXBVc2VyU3RhcnR1cH0iICJ7TVBXfXtVc2VyU3RhcnR1cE5hbWV9IgotCURlbGV0ZSAteSAie1RlbXBVc2VyU3RhcnR1cH0iCi1FbHNlCi0JRWNobyAie1VzZXJTdGFydHVwTmFtZX0gZmlsZSBub3QgaW5zdGFsbGVkIgotRW5kIElmCi0KLSMgKHNob3VsZCkgQ2hlY2sgSEVYQSByZXNvdXJjZSwgd2FybiBpZiBsb3cuCi0KLSMgKHNob3VsZCkgQ2hlY2sgZm9yIHNwYWNlcyBpbiBwYXRobmFtZXMsIHdhcm4gaWYgZm91bmQuCi0KLUVjaG8gIkluc3RhbGxhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4iCi1FY2hvICIiCi1FY2hvICJCZSBzdXJlIHRvIHJldmlldyB0aGUgdXNhZ2Ugbm90ZXMgaW4gJ1JlYWQgTWUgZm9yIE1QVycgYmVmb3JlIHByb2NlZWRpbmchIgotCi0jIFJlc3RvcmUgcHJldmlvdXMgc2V0dGluZ3MuCi0KLVNldCBFeGl0ICJ7T2xkRXhpdH0iCmRpZmYgLS1naXQgYS9vcGNvZGVzL0NoYW5nZUxvZyBiL29wY29kZXMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjIyMmQwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1MCArMCwwIEBACi1XZWQgRGVjICAxIDAzOjM0OjUzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jLCBtMTAzMDAtZGlzLmM6IEFkZCBhbTMzIHN1cHBvcnQuCi0KLVdlZCBOb3YgMjQgMjA6Mjk6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jICh1bml0X2NvbmRfbmFtZXMpOiBBZGQgUEEyLjAgdW5pdCBjb25kaXRpb24gbmFtZXMuCi0JKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnQicgb3BlcmFuZC4KLQotMTk5OS0xMS0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYzogRml4IHBhdHRlcm4gZm9yICJjcGZnLGZ7MHwxfSxjIiBpbnN0cnVjdGlvbi4KLQotMTk5OS0xMS0xOCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKEk1KTogTmV3LgotCShhYnMucHMsYWRkLnBzLGFsbnYucHMsYy5DT05ELnBzLGN2dC5zLnBsLGN2dC5zLnB1LGN2dC5wcy5zCi0JbWFkZC5wcyxtb3ZmLnBzLG1vdnQucHMsbXVsLnBzLG5ldC5wcyxubWFkZC5wcyxubXN1Yi5wcywKLQlwbGwucHMscGx1LnBzLHB1bC5wcyxwdXUucHMsc3ViLnBzLHN1eGMxLGx1eGMxKTogTmV3LgotCi1Nb24gTm92IDE1IDE5OjM0OjU4IDE5OTkgIERvbmFsZCBMaW5kc2F5ICA8ZGxpbmRzYXlAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IEFkZGVkIGdlbmVyYWwgcHVycG9zZSAnWCcgZm9ybWF0LgotCSogYXJtLW9wYy5oIChwcmludF9pbnNuX2FybSk6IEFkZGVkIGNvbW1lbnQgZG9jdW1lbnRpbmcKLQl0aGUgJ1gnIGZvcm1hdCBqdXN0IGFkZGVkIHRvIGFybS1kaXMuYy4KLQotMTk5OS0xMS0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKGxhKTogQ3JlYXRlIGEgdmVyc2lvbiB0aGF0IGp1c3QgdXNlcyBhZGRpdSBkaXJlY3RseS4KLQkoZGxhKTogRXhwYW5kIHRvIGRhZGRpdSBpZiBwb3NzaWJsZS4KLQotMTk5OS0xMS0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIHNzbm9wIHBhdHRlcm4uCi0KLTE5OTktMTEtMDEgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogVXNlIE9QQ09ERV9JU19NRU1CRVIuCi0KLTE5OTktMTAtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKG12dGFjYyk6IFVzZSBmb3JtYXQgU0hPUlRfQVIgbm90IFNIT1JUX0FBCi0JKGQzMHZfZm9ybWF0X3RhYik6IERlZmluZSB0aGUgU0hPUlRfQVIgZm9ybWF0LgotCi0xOTk5LTEwLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS1kaXMuYzogUmVtb3ZlIHNwdXJpb3VzIGNvZGUgaW50cm9kdWNlZCBpbiBwcmV2aW91cyBkZWx0YS4gCi0KLTE5OTktMTAtMjcgIFNjb3R0IEJhbWJyb3VnaCAgPHNjb3R0YkBuZXR3aW5kZXIub3JnPgotCi0JKiBhcm0tZGlzLmM6IEluY2x1ZGUgc3lzZGVwLmggdG8gcHJldmVudCBjb21waWxlIHRpbWUgd2FybmluZ3MuCi0KLTE5OTktMTAtMTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYyAoYWxwaGFfb3BlcmFuZHMpOiBGaWxsIGluIG1pc3NpbmcgaW5pdGlhbGl6ZXIuCi0JKGFscGhhX251bV9vcGVyYW5kcyk6IENvbnZlcnQgdG8gdW5zaWduZWQuCi0JKGFscGhhX251bV9vcGNvZGVzKTogRGl0dG8uCi0JKGluc2VydF9yYmEpOiBEZWNsYXJlIHVudXNlZCBhcmd1bWVudHMgQVRUUklCVVRFX1VOVVNFRC4KLQkoaW5zZXJ0X3JjYSk6IERpdHRvLgotCShpbnNlcnRfemEpOiBEaXR0by4KLQkoaW5zZXJ0X3piKTogRGl0dG8uCi0JKGluc2VydF96Yyk6IERpdHRvLgotCShleHRyYWN0X2JkaXNwKTogRGl0dG8uCi0JKGV4dHJhY3RfamhpbnQpOiBEaXR0by4KLQkoZXh0cmFjdF9ldjZod2poaW50KTogRGl0dG8uCi0KLVN1biBPY3QgMTAgMDE6NDg6MDEgMTk5OSAgSmVycnkgUXVpbm4gPGplcnJ5LnF1aW5uLmFkdjkxQGFsdW0uZGFydG1vdXRoLm9yZz4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogIEFkZCBuZXcgY29kZXMgJ2NjJywgJ2NkJywgJ2NDJywKLQknY28nLCAnQCcuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFJlbW92ZWQgdW51c2VkIGFyZ3MuICBGaXggJz9XJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogIEltcGxlbWVudCBjb2RlcyAiP04iLCAiP1EiLgotCi1UaHUgT2N0ICA3IDAwOjEyOjQzIE1EVCAxOTk5CURpZWdvIE5vdmlsbG8gPGRub3ZpbGxvQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3BlcmFuZHMpOiBBZGQgUkVTVFJJQ1RFRF9OVU0zIGZsYWcgZm9yCi0JcmFjL3JhY2hpIGluc3RydWN0aW9ucy4KLQkoZDEwdl9vcGNvZGVzKTogQWRkZWQgc2V2ZW4gbmV3IGluc3RydWN0aW9ucyBsZCwgbGQydywgc2FjLCBzYWNoaSwKLQlzbGFlLCBzdCBhbmQgc3Qydy4KLQotMTk5OS0xMC0wNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGVzYy5oOiBSZWJ1aWxkLgotCSogbTMyci1hc20uYyxtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaDogUmVidWlsZC4gIEFkZCBtMzJyeCBzdXBwb3J0LgotCSogbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmgsbTMyci1vcGluc3QuYzogRGl0dG8uCi0KLTE5OTktMDktMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBGaXggYml0IHBhdHRlcm5zIGZvciBzZXZlcmFsIGxvYWQgYW5kIHN0b3JlCi0JaW5zdHJ1Y3Rpb25zLiAgCi0KLVRodSBTZXAgMjMgMDg6Mjc6MjAgMTk5OSAgSmVycnkgUXVpbm4gPGplcnJ5LnF1aW5uLmFkdjkxQGFsdW0uZGFydG1vdXRoLm9yZwotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBSZXBsYWNlICdCJywgJ00nLCAnZycgYW5kICdsJyB3aXRoCi0JY2xlYW5lciBjb2RlIHVzaW5nIGNvbXBsZXRlciBwcmVmaXhlcy4gIEFkZCAnWScuCi0KLVN1biBTZXAgMTkgMTA6NDE6MjcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiAocHJpbnRfaW5zbl9ocHBhKTogQ29ycmVjdCAnY0onLCAnY2MnLgotCi0JKiBocHBhLWRpcy5jIChleHRyYWN0XzIyKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ0onLCAnSycsIGFuZCAnY2MnLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ2ZlJyBhbmQgJ2NKJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICcjJywgJ2QnLCBhbmQgJ2NxJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdtJywgJ2gnLCAnPScuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnWCcgb3BlcmFuZC4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdCJyBvcGVyYW5kLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ00nIGFuZCAnTCcgb3BlcmFuZHMuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnbCcgb3BlcmFuZC4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdnJyBvcGVyYW5kLgotCi1TYXQgU2VwIDE4IDExOjM2OjEyIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogT3V0cHV0IGEgc3BhY2UgYWZ0ZXIgJ1gnIGNvbXBsZXRlci4KLQotCSogaHBwYS1kaXMuYzogKHByaW50X2luc25faHBwYSk6IERvIG91dHB1dCBhIHNwYWNlIGJlZm9yZSBhICd2JwotCW9wZXJhbmQuCi0KLQkqIGhwcGEtZGlzLmM6IChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ2ZYJy4KLQotCSogaHBwYS1kaXMuYzogKHByaW50X2luc25faHBwYSk6IEFkZCBtaXNzaW5nIGJyZWFrIGFmdGVyCi0JRlAgcmVnaXN0ZXIgY2FzZS4KLQotCSogaHBwYS1kaXMuYzogRmluaXNoIGNvbnN0aWZ5aW5nIHZhcmlvdXMgY29tcGxldGVycywgcmVnaXN0ZXIKLQluYW1lcywgZXRjIGV0Yy4KLQotMTk5OS0wOS0xNCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQ2Fub25pY2FsaXphdGlvbiBvZiB0YXJnZXQgbmFtZXMpOiBSZW1vdmUgYWRkaW5nCi0JJHtDT05GSUdfU0hFTEx9IGluIGZyb250IG9mICRhY19jb25maWdfc3ViLCBzaW5jZSBhdXRvY29uZmlnIDIuMTQKLQlnZW5lcmF0ZXMgJGFjX2NvbmZpZ19zdWIgd2l0aCBhICR7Q09ORklHX1NIRUxMfSBhbHJlYWR5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UdWUgU2VwICA3IDEzOjUwOjMyIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogRXNjYXBlICclJyBpbiBvdXRwdXQgc3RyaW5ncy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdaJyBhcmd1bWVudC4KLQotMTk5OS0wOS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmg6IEFkZCBtdWx1LncgYW5kIG11bHMudyBwYXR0ZXJucy4gIFRoZXNlIGFyZSB0aGUgY29ycmVjdAotCW5hbWVzIGZvciB0aGUgbXVsdSBhbmQgbXVscyBwYXR0ZXJucy4KLQotMTk5OS0wOS0wNCAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcG9ib3guY29tPgotCi0JKiBwai1vcGMuYzogTmV3IGZpbGUuCi0JKiBwai1kaXMuYzogTmV3IGZpbGUuCi0JKiBkaXNhc3NlbWJsZS5jCShkaXNhc3NlbWJsZXIpOiBIYW5kbGUgYmZkX2FyY2hfcGouCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBiZmRfcGpfYXJjaC4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHBqLWRpcy5jIGFuZCBwai1vcGMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIHBqLWRpcy5sbyBhbmQgcGotb3BjLmxvLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOS0wNCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2kzODYpOiBTZXQgYnl0ZXNfcGVyX2xpbmUgdG8gNy4KLQotTW9uIEF1ZyAzMCAxODo1NjoxNCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYyAoZmV0Y2gsIGZldGNoX20sIGVjYiwgd2g2NCk6IFJBIG11c3QgYmUgUjMxLgotCi0xOTk5LTA4LTA0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1hc20uYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jLG0zMnItb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgotCi1TYXQgQXVnIDI4IDAwOjI3OjI0IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0gICAgICAgICogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogUmVwbGFjZSAnZicgYnkgJ3YnLiAgUHJlZml4IGZsb2F0Ci0JcmVnaXN0ZXIgYXJncyBieSAnZicuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEFkZCBhcmdzIHEsICUsICEsIGFuZCB8LgotCi0JKiBocHBhLWRpcy5jIChNQVNLXzEwLCByZWFkX3dyaXRlX25hbWVzLCBhZGRfY29tcGxfbmFtZXMsCi0JZXh0cmFjdF8xMFVfc3RvcmUpOiAgTmV3LgotCShwcmludF9pbnNuX2hwcGEpOiAgQWRkIG5ldyBjb21wbGV0ZXJzLgotCi0JKiBocHBhLWRpcy5jIChzaWduZWRfdW5zaWduZWRfbmFtZXMsbWl4X2hhbGZfbmFtZXMsCi0Jc2F0dXJhdGlvbl9uYW1lcyk6ICBOZXcuCi0JKHByaW50X2luc25faHBwYSk6IEFkZCBjb21wbGV0ZXIgY29kZXMgJ2EnLCAnY2gnLCAnY0gnLCAnY1MnLCBhbmQgJ2MqJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogUGxhY2UgY29tcGxldGVycyBiZWhpbmQgcHJlZml4ICdjJy4gCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEFkZCBjYXNlcyBmb3IgJy4nLCAnficuICckJy4gYW5kICchJwotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiAgTG9vayBhdCBuZXh0IGFyZyBpbnN0ZWFkIG9mIGJpdHMKLQl0byBkZWNpZGUgdG8gcHJpbnQgYSBzcGFjZS4KLQotMTk5OS0wOC0yMSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jOiBBZGQgQU1EIGF0aGxvbiBpbnN0cnVjdGlvbiBzdXBwb3J0LgotCi0xOTk5LTA4LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gV2FsbHkgSWltdXJhIDxpaW11cmFAbWljcm91bml0eS5jb20+OgotCSogZGlzLWJ1Zi5jIChidWZmZXJfcmVhZF9tZW1vcnkpOiBSZXdyaXRlIGV4cHJlc3Npb24gdG8gYXZvaWQKLQlvdmVyZmxvdyBhdCBlbmQgb2YgYWRkcmVzcyBzcGFjZS4KLQkoZ2VuZXJpY19wcmludF9hZGRyZXNzKTogVXNlIHNwcmludGZfdm1hLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbmFtZSAuZGVwKiBmaWxlcyB0byBERVAqLiAgQ2hhbmdlIERFUCB2YXJpYWJsZSB0bwotCU1LREVQLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgNiAwOTo0NjozNSAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS1kaXMuYyAoY29tcGFyZV9jb25kXzY0X25hbWVzLCBjbXBpYl9jb25kXzY0X25hbWVzLAotCWFkZF9jb25kXzY0X25hbWVzLCB3aWRlX2FkZF9jb25kX25hbWVzLCBsb2dpY2FsX2NvbmRfNjRfbmFtZXMsCi0JdW5pdF9jb25kXzY0X25hbWVzLCBzaGlmdF9jb25kXzY0X25hbWVzLCBiYl9jb25kXzY0X25hbWVzKTogTmV3LgotCShwcmludF9pbnNuX2hwcGEpOiBBZGQgNjQgYml0IGNvbmRpdGlvbiBjb21wbGV0ZXJzLgotCi1UaHUgQXVnICA1IDE2OjU5OjU4IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBDaGFuZ2UgY29uZGl0aW9uIGFyZ3MgdG8gdXNlCi0JJz8nIHByZWZpeC4KLQotV2VkIEp1bCAyOCAwNDozMzo1OCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogUmVtb3ZlIHVubmVjZXNzYXJ5IHRlc3QgaW4gJ0UnCi0JY29kZS4KLQotMTk5OS0wNy0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIE1hcmsgRWxicmVjaHQ6Ci0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZGlzLWJ1Zi5jOiBBZGQgQVRUUklCVVRFX1VOVVNFRCBhcyBhcHByb3ByaWF0ZS4KLQkoZ2VuZXJpY19zdHJjYXRfYWRkcmVzcyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKiBpMzg2LWRpcy5jOiBJbml0aWFsaXplIGFsbCBzdHJ1Y3R1cmUgZmllbGRzIHRvIGF2b2lkIHdhcm5pbmdzLgotCUFkZCBBVFRSSUJVVEVfVU5VU0VEIGFzIGFwcHJvcHJpYXRlLgotCi0xOTk5LTA3LTA4ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogRGlmZmVyZW50aWF0ZSBiZXR3ZWVuCi0JYWRkaXRpb24gYW5kIG9yaW5nIHdoZW4gZ3Vlc3Npbmcgc3ltYm9sIGZvciBjb21tZW50LgotCi0xOTk5LTA3LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogRGlzcGxheSBoZXggZXF1aXZhbGVudCBvZiByb3RhdGVkCi0JY29uc3RhbnQuIAotCi0xOTk5LTA2LTIzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmM6IE1lbnRpb24gaW50ZWwgbW9kZSBzcGVjaWFscyBpbiBtYWNybyBjaGFyIGNvbW1lbnQuCi0KLTE5OTktMDYtMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhbHBoYS1kaXMuYzogRG9uJ3QgaW5jbHVkZSA8c3RkbGliLmg+LgotCSogYXJtLWRpcy5jOiBJbmNsdWRlICJzeXNkZXAuaCIuCi0JKiB0aWMzMC1kaXMuYzogRG9uJ3QgaW5jbHVkZSA8c3RkbGliLmg+IG9yIDxzdHJpbmcuaD4uICBJbmNsdWRlCi0JInN5c2RlcC5oIi4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogQWRkIGRldGVjdGlvbiBvZiBJTUIgYW5kIElNQlJhbmdlCi0JU1dJcy4gCi0KLTE5OTktMDYtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+ICYgRHJldyBNb3NsZXkgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAoYXJtX3JlZ25hbWVzKTogVHVybiBpbnRvIGEgcG9pbnRlciB0byBhIHJlZ2lzdGVyCi0JbmFtZSBzZXQuCi0JKGFybV9yZWduYW1lc19zdGFuZGFyZCk6IE5ldyB2YXJpYWJsZTogQXJyYXkgb2YgQVJNIHJlZ2lzdGVyCi0JbmFtZXMgYWNjb3JkaW5nIHRvIEFSTSBpbnN0cnVjdGlvbiBzZXQgbm9tZW5jbGF0dXJlLiAKLQkoYXJtX3JlZ25hbWVzX2FwY3MpOiBOZXcgdmFyaWFibGU6IEFycmF5IG9mIEFSTSByZWdpc3RlciBuYW1lcwotCWFjY29yZGluZyB0byBBUk0gUHJvY2VkdXJlIENhbGwgU3RhbmRhcmQuCi0JKGFybV9yZWduYW1lc19yYXcpOiBOZXcgdmFyaWFibGU6IEFycmF5IG9mIEFSTSByZWdpc3RlciBuYW1lcwotCXVzaW5nIGp1c3QgJ3InIGFuZCB0aGUgcmVnaXN0ZXIgbnVtYmVyLgotCShhcm1fdG9nZ2xlX3JlZ25hbWVzKTogTmV3IGZ1bmN0aW9uOiBUb2dnbGUgdGhlIGNob3NlbiByZWdpc3RlciBzZXQKLQluYW1pbmcgc2NoZW1lLgotCShwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyk6IE5ldyBmdW5jdGlvbjogUGFyc2UgYW55IHRhcmdldAotCWRpc2Fzc2VtYmxlciBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkocHJpbnRfaW5zbl9iaWdfYXJtKTogQ2FsbCBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyBpZiBhbnkKLQlhcmUgZGVmaW5lZC4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogQ2FsbCBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyBpZiBhbnkKLQlhcmUgZGVmaW5lZC4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKEZXQUlUX09QQ09ERSk6IERlZmluZS4KLQkodXNlZF9wcmVmaXhlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGZldGNoX2RhdGEpOiBEb24ndCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGhhdmUgYWxyZWFkeQotCWZldGNoZWQgc29tZSBieXRlcyBzdWNjZXNzZnVsbHkuCi0JKGNrcHJlZml4KTogQ2xlYXIgdXNlZF9wcmVmaXhlcy4gIFVzZSBGV0FJVF9PUENPREUsIG5vdCAweDliLgotCShwcmVmaXhfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByaW50X2luc25faTM4Nik6IElmIHNldGptcCBmYWlscywgaW5kaWNhdGluZyBhIGRhdGEgZXJyb3IsIGJ1dAotCXdlIGhhdmUgbWFuYWdlZCB0byBmZXRjaCBzb21lIGJ5dGVzLCBwcmludCB0aGUgZmlyc3Qgb25lIGFzIGEKLQlwcmVmaXggb3IgYSAuYnl0ZSBwc2V1ZG8tb3AuICBJZiBmd2FpdCBpcyBmb2xsb3dlZCBieSBhIG5vbgotCWZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uLCBwcmludCB0aGUgZmlyc3QgcHJlZml4LiAgU2V0Ci0JdXNlZF9wcmVmaXhlcyB3aGVuIHByZWZpeGVzIGFyZSB1c2VkLiAgSWYgYW55IHByZWZpeGVzIHdlcmUgbm90Ci0JdXNlZCBhZnRlciBkaXNhc3NlbWJsaW5nIHRoZSBpbnN0cnVjdGlvbiwgcHJpbnQgdGhlIGZpcnN0IHByZWZpeAotCWluc3RlYWQgb2YgcHJpbnRpbmcgdGhlIGluc3RydWN0aW9uLgotCShwdXRvcCk6IFNldCB1c2VkX3ByZWZpeGVzIHdoZW4gcHJlZml4ZXMgYXJlIHVzZWQuCi0JKGFwcGVuZF9zZWcsIE9QX0UsIE9QX0csIE9QX1JFRywgT1BfSSwgT1Bfc0ksIE9QX0opOiBMaWtld2lzZS4KLQkoT1BfRElSLCBPUF9TSU1EX1N1ZmZpeCk6IExpa2V3aXNlLgotCi0xOTk5LTA2LTA3ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHNwYXJjLW9wYy5jOiBGaXggdXAgc2V0LCBzZXRzdywgc2V0dXcgb3BlcmFuZCBraW5kcy4KLQlTdXBwb3J0IHNpZ254ICVyZWcsIGNscnV3ICVyZWcuCi0KLTE5OTktMDYtMDcgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMtb3BjLmM6IEFkZCBhbGlhc2VzIFNvbGFyaXMgYXMgc3VwcG9ydHMuCi0KLU1vbiBKdW4gIDcgMTI6MDQ6NTIgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkIGFyYy17ZGlzLG9wY30uYyBhbmQgdjg1MC17ZGlzLG9wY30uYy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotMTk5OS0wNi0wMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IE1ha2UgTERSSC9MRFJCIGNvbnNpc3RlbnQgd2l0aCBMRFIKLQl3aGVuIHRhcmdldCBpcyBQQy1yZWxhdGl2ZS4KLQotMTk5OS0wNS0yOCAgTGludXMgTm9yZGJlcmcgIDxsaW51cy5ub3JkYmVyZ0BjYW5pdC5zZT4KLQotCSogbTY4ay1vcGMuYzogUmVuYW1lIE1BQ0wvTVNBQ0wgdG8gTUFDL01TQUMuICBBZGQgTUFDTS9NU0FDTS4gIEFkZAotCU1PVkUgTUFDU1IsQ0NSLgotCi0JKiBtNjhrLWRpcy5jIChmZXRjaF9hcmcpOiBBZGQgcGxhY2VzIGBuJywgYG8nLgotCi0JKiBtNjhrLW9wYy5jOiBBZGQgTVNBQywgTUFDTCwgTU9WRSB0by9mcm9tIEFDQywgTUFDU1IsIE1BU0suCi0JQWRkIG1jZjUyMDZlIHRvIGFwcHJvcHJpYXRlIGluc3RydWN0aW9ucy4KLQlBZGQgYWxpYXMgZm9yIE1BQywgTVNBQy4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBBZGQgZm9ybWF0cyBgRScsIGBHJywgYEgnIGFuZCBwbGFjZQotCWBOJy4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkIGRpdnN3LCBkaXZzbCwgZGl2dXcsIGRpdnVsLCBtYWNsLAotCW1hY3csIHJlbXNsLCByZW11bCBmb3IgbWNmNTMwNy4gIENoYW5nZSBtY2Y1MjAwIC0tPiBtY2YuCi0KLQkqIG02OGstZGlzLmM6IEFkZCBmb3JtYXQgYHUnIGFuZCBwbGFjZXMgYGgnLCBgbScsIGBNJy4KLQotMTk5OS0wNS0xOCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChFZCk6IERlZmluZS4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0LCBkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IFVzZSBFZCBmb3IgbW92ZC4KLQkoUncpOiBSZW1vdmUuCi0JKE9QX3JtKTogUmVuYW1lIHRvIE9QX1JkLgotCShPTkUpOiBSZW1vdmUuCi0JKE9QX09ORSk6IFJlbW92ZS4KLQkocHV0b3ApOiBBZGQgY29uc3QgdG8gdGVtcGxhdGUgYW5kIHAuCi0JKHByaW50X2luc25feDg2KTogRGVsZXRlLgotCShwcmludF9pbnNuX2kzODYpOiBNZXJnZSBvbGQgZnVuY3Rpb24gcHJpbnRfaW5zbl94ODYuICBBZGQgY29uc3QKLQl0byBkcC4KLQkoc3RydWN0IGRpczM4Nik6IEFkZCBjb25zdCB0byBuYW1lLgotCShkaXMzODZfYXR0LCBkaXMzODZfaW50ZWwpOiBBZGQgY29uc3QuCi0JKGRpczM4Nl90d29ieXRlX2F0dCwgZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBBZGQgY29uc3QuCi0JKG5hbWVzMzIsIG5hbWVzMTYsIG5hbWVzOCwgbmFtZXNfc2VnLCBpbmRleDE2KTogQWRkIGNvbnN0LgotCShncnBzLCBwcmVmaXhfdXNlcl90YWJsZSwgZmxvYXRfcmVnKTogQWRkIGNvbnN0LgotCShmbG9hdF9tZW1fYXR0LCBmbG9hdF9tZW1faW50ZWwpOiBBZGQgY29uc3QuCi0JKG9hcHBlbmQpOiBBZGQgY29uc3QgdG8gcy4KLQkoT1BfUkVHKTogQWRkIGNvbnN0IHRvIHMuCi0JKHB0cl9yZWcpOiBBZGQgY29uc3QgdG8gcy4KLQkoZG9mbG9hdCk6IEFkZCBjb25zdCB0byBkcC4KLQkoT1BfQyk6IERvbid0IHNraXAgbW9kcm0sIGl0J3Mgbm93IGRvbmUgaW4gT1BfUmQuCi0JKE9QX0QpOiBEaXR0by4KLQkoT1BfVCk6IERpdHRvLgotCShPUF9SZCk6IENoZWNrIGZvciB2YWxpZCBtb2QuICBDYWxsIE9wX0UgdG8gcHJpbnQuCi0JKE9QX0UpOiBIYW5kbGUgZF9tb2RlIGFyZy4gIENoZWNrIGZvciBiYWQgc2ZlbmNlLGxlYSxsZHMgZXRjLgotCShPUF9NUyk6IENoZWNrIGZvciB2YWxpZCBtb2QuICBDYWxsIE9wX0VNIHRvIHByaW50LgotCShPUF8zRE5vd1N1ZmZpeCk6IFNldCBvYnVmcCBhbmQgdXNlIG9hcHBlbmQgcmF0aGVyIHRoYW4KLQlzdHJjYXQuICBDYWxsIEJhZE9wKCkgZm9yIGVycm9ycy4KLQkoT1BfU0lNRF9TdWZmaXgpOiBMaWtld2lzZS4KLQkoQmFkT3ApOiBOZXcgZnVuY3Rpb24uCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X2ludGVsKTogUmVtb3ZlIG1hY3JvIGNoYXJzLCBleGNlcHQgZm9yCi0JakVjeHouICBDaGFuZ2UgY1d0UiBhbmQgY1J0ZCB0byBjVyBhbmQgY1IuCi0JKGRpczM4Nl90d29ieXRlX2ludGVsKTogUmVtb3ZlIG1hY3JvIGNoYXJzIGhlcmUgdG9vLgotCShwdXRvcCk6IEhhbmRsZSBSIGFuZCBXIG1hY3JvcyBmb3IgaW50ZWwgbW9kZS4KLQotCSogaTM4Ni1kaXMuYyAoU0lNRF9GaXh1cCk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0KTogVXNlIGl0IG9uIG1vdmxwcyBhbmQgbW92aHBzLCBhbmQgY2hhbmdlCi0JRXYgdG8gRVggb24gdGhlc2UgaW5zbnMuICBDaGFuZ2UgbW92bXNrcHMgRXYsIFhNIHRvIEd2LCBFWC4KLQkoZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBTYW1lIGhlcmUuCi0KLQkqIGkzODYtZGlzLmMgKEF2KTogUmVtb3ZlLgotCShBcCk6IHJlbW92ZSBscHRyLgotCShscHRyKTogUmVtb3ZlLgotCShPUFNJTUQpOiBEZWZpbmUuCi0JKE9QX1NJTURfU3VmZml4KTogTmV3IGZ1bmN0aW9uLgotCShPUF9ESVIpOiBSZW1vdmUgZGVhZCBjb2RlLgotCShlQVhfcmVnLi5lRElfcmVnKTogUmVudW1iZXIuCi0JKG9uZWJ5dGVfaGFzX21vZHJtKTogVGFibGUgbnVtYmVyaW5nIGNvbW1lbnRzLgotCShJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOiBNb3ZlIHRvIGJlZm9yZSBwcmludF9pbnNuX3g4Ni4KLQkocHJpbnRfaW5zbl94ODYpOiBNb3ZlIGFsbCBwcmVmaXggb2FwcGVuZHMgdG8gYWZ0ZXIgdXNlc19mM19wcmVmaXgKLQljaGVja3MuICBQcmludCBlcnJvciBvbiBpbnZhbGlkIGRwLT5ieXRlbW9kZTIuICBSZW1vdmUgc2ltZF9jbXAsCi0JYW5kIGhhbmRsZSBTSU1EIGNtcCBpbnNucyBpbiBPUF9TSU1EX1N1ZmZpeC4KLQkoaW5mby0+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+LgotCSogaHBwYS1kaXMuYzogU3VwcG9ydCAnSScsICdKJywgYW5kICdLJyBpbiBvdXRwdXQKLQl0ZW1wbGF0ZXMgZm9yIDEuMSBGUCBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9ucy4KLQotVHVlIE1heSAyNSAxMzowNTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jIChwcmludF9pbnNuX2g4NTAwKTogQWRkcmVzcyBhcmd1bWVudCBpcyB0eXBlCi0JYmZkX3ZtYS4KLQkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96OGssIHByaW50X2luc25fejgwMDEsIHByaW50X2luc25fejgwMDIpOgotCURpdHRvLgotCi0JKiBoODUwMC1vcGMuaCAoYWRkcl9jbGFzc190eXBlKTogTm8gY29tbWEgYXQgZW5kIG9mIGVudW1lcmF0b3IuCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUsIHNoX2FyZ190eXBlKTogRGl0dG8uCi0KLQkqIHNwYXJjLWRpcy5jIChjb21wYXJlX29wY29kZXMpOiBNb3ZlIHN0YXRpYyBkZWNsYXJhdGlvbiB0bwotCXRvcC1sZXZlbC4KLQotRnJpIE1heSAyMSAxNDoxNzozNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSW1wbGVtZW50ICduJyBhcmd1bWVudCBmb3IgdW5pbXAKLQlpbnN0cnVjdGlvbiwgcmVtb3ZlIHVuaW1wIGhhY2sgZnJvbSAnbCcgYXJndW1lbnQuCi0KLVdlZCBNYXkgMTkgMTU6MzU6NTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jIChmZXRjaF9kYXRhKTogIFVzZSB1bnNpZ25lZCBjaGFyIHRvIG1ha2UgYW5jaWVudCBnY2MncwotCWhhcHB5LgotCi1GcmkgTWF5IDE0IDE1OjIyOjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQmFzZWQgb24gcGF0Y2hlcyBmcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6Ci0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSAnQycgZm9yIGdlbmVyYWwgY29wcm9jZXNzb3IKLQlpbnN0cnVjdGlvbnMuCi0KLUZyaSBNYXkgMTQgMDA6MDk6MTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBJbmNsdWRlIGRpcy1hc20uaCBiZWZvcmUgc3lzZGVwLmguICBDaGFuZ2VkIHNvbWUKLQlhcnJheXMgb2Ygc3RyaW5nIHBvaW50ZXJzIHRvIDItZCBhcnJheXMgb2YgY2hhcnMsIHRvIHNhdmUKLQlzcGFjZS4KLQotVGh1IE1heSAgNiAyMDo1MToxNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYywgYWxwaGEtZGlzLmMsIGk5NjAtZGlzLmMsIHNwYXJjLWRpcy5jLCB6OGstZGlzLmM6Ci0JQ2FzdCBzZWNvbmQgYXJnIHRvIHJlYWRfbWVtb3J5X2Z1bmMgdG8gImJmZF9ieXRlICoiLCBhcyBuZWNlc3NhcnkuCi0KLVR1ZSBNYXkgIDQgMjA6MzE6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBOZXcgZmlsZSBmcm9tIFV0YWgsIGFkYXB0ZWQgdG8gbmV3IGRpc2Fzc2VtYmxlcgotCWNhbGxpbmcgaW50ZXJmYWNlLgotCSogTWFrZWZpbGUuaW46IEluY2x1ZGUgaXQuCi0KLU1vbiBBcHIgMjYgMTg6MTc6NDIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNoLWRpcy5jLCBzaC1vcGMuaDogTmV3IGZpbGVzLgotCi1GcmkgQXByIDIzIDE4OjUxOjIyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS1kaXMuYywgYWxwaGEtb3BjLmg6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAgNiAxMjo1NDowOCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG1pcHMtZGlzLmM6IFNpZ24gZXh0ZW5kICdqJyBhbmQgJ2InIGFyZ3VtZW50cywgZGVsdGEgaXMgYSBzaWduZWQKLQl2YWx1ZS4KLQotTW9uIEFwciAgNSAxNzozNzozNyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IE1ha2UgInRhIiB0aGUgZGVmYXVsdCB0cmFwIGluc3RydWN0aW9uLCAidCIgdGhlIGFsaWFzLgotCi1GcmkgQXByICAyIDA3OjI0OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYywgc3BhcmMtZGlzLmMsIHNwYXJjLW9wYy5jOiBVc2UgQ09OU1QgcmF0aGVyIHRoYW4KLQljb25zdC4KLQotVGh1IEFwciAgMSAxMToyMDo0MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IFVzZSBmcHJpbnRmX2Z1bmMgYSBmZXcgcGxhY2VzIHdoZXJlIEkgZm9yZ290LAotCWFuZCBkb3VibGUgcGVyY2VudCBzaWducyBhIGZldyBwbGFjZXMuCi0KLQkqIGEyOWstZGlzLmMsIGk5NjAtZGlzLmM6IE5ldywgbWVyZ2VkIGZyb20gZ2RiIGFuZCBiaW51dGlscy4KLQotCSogaTM4Ni1kaXMuYywgbTY4ay1kaXMuYywgbWlwcy1kaXMuYywgc3BhcmMtZGlzLmM6Ci0JVXNlIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyBub3QgcHJpbnRfYWRkcmVzcy4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3ByaW50X2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBNYXIgMzEgMTA6MDc6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc3BhcmMtZGlzLmMuCi0Jc3BhcmMtZGlzLmM6IE5ldyBmaWxlLCBtZXJnZXMgYmludXRpbHMgYW5kIGdkYiB2ZXJzaW9ucyBhcyBmb2xsb3dzOgotCUZyb20gR0RCOgotCSAgICBBZGQgYGFkZCcgaW5zdHJ1Y3Rpb24gdG8gdGhlIHNldCB0aGF0IGdldCBjaGVja2VkCi0JICAgIGZvciBhIHByZWNlZGluZyBgc2V0aGknIGluIG9yZGVyIHRvIHByaW50IGFuIGFic29sdXRlIGFkZHJlc3MuCi0JICAgICogKHByaW50X2luc24pOiAgRGlzYXNzZW1ibHkgcHJlZmVycyByZWFsIGluc3RydWN0aW9ucy4KLQkgICAgKGlzX2RlbGF5ZWRfYnJhbmNoKTogIFNwZWVkIHVwLgotCSAgICAqIHNwYXJjLW9wY29kZS5oOiBBZGQgQUxJQVMgYml0IHRvIGFsaWFzZXMuICBGaXggdXAgb3Bjb2RlIHRhYmxlcy4KLQkgICAgU3RpbGwgbWlzc2luZyBzb21lIGZsb2F0IG9wcywgYW5kIG5lZWRzIHRlc3RpbmcuCi0JICAgICogc3BhcmMtcGluc24uYyAocHJpbnRfaW5zbik6IEVsaW1pbmF0ZSAnc2V0JyB0ZXN0LCBzdWJzdW1lZCBieQotCSAgICBGX0FMSUFTLiAgVXNlIHByaW50Ziwgbm90IGZwcmludGYsIHdoZW4gbm90IHBhc3NpbmcgYSBmaWxlCi0JICAgIHBvaW50ZXIuLi4KLQkgICAgKGNvbXBhcmVfb3Bjb2Rlcyk6IENoZWNrIHRoYXQgaWRlbnRpY2FsIGluc3RydWN0aW9ucyBoYXZlCi0JICAgIGlkZW50aWNhbCBvcGNvZGVzLCBjb21wbGFpbiBvdGhlcndpc2UuCi0JRnJvbSBiaW51dGlsczoKLQkgICAgKiBOZXcgJ20nIGFyZy4KLQkgICAgKiBJbmNsdWRlIHJlZ19uYW1lcy4KLQlGcm9tIG5laXRoZXI6Ci0JICAgIFVzZSBkaXMtYXNtLmgvcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UuCi0KLVdlZCBNYXIgMzEgMjA6NDk6MDYgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYywgaTM4Ni1kaXMuYywgbTY4ay1kaXMuYywgejhrLWRpcy5jIChmZXRjaF9kYXRhKToKLQkgIGRlbGliZXJhdGVseSByZXR1cm4gbm9uLXplcm8gdG8gc2V0am1wIGZyb20gbG9uZ2ptcC4gIE90aGVyd2lzZQotCSAgdGhpcyBjb2RlIGZhaWxzIHRvIGNvbXBpbGUuCi0KLVdlZCBNYXIgMzEgMTc6MDQ6MzEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYzogIEZpeCBwcm90b3R5cGUgZm9yIGZldGNoX2FyZygpLgotCi1XZWQgTWFyIDMxIDEwOjA3OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYnVmLmM6IE5ldyBmaWxlLCBmb3IgbmV3IHJlYWRfbWVtb3J5X2Z1bmMgaW50ZXJmYWNlLgotCU1ha2VmaWxlLmluIChPRklMRVMpOiBJbmNsdWRlIGl0LgotCW02OGstZGlzLmMsIGkzODYtZGlzLmMsIGg4NTAwLWRpcy5jLCBtaXBzLWRpcy5jLCB6OGstZGlzLmM6Ci0JVXNlIG5ldyByZWFkX21lbW9yeV9mdW5jIGludGVyZmFjZS4KLQotTW9uIE1hciAyOSAxNDowMjoxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMgKHByaW50X2luc25faDg1MDApOiBHZXQgc2lnbiBvZiBmcCBvZmZzZXRzIHJpZ2h0LgotCSogaDg1MDAtb3BjLmg6IEZpeCBjb3VwbGUgb2Ygb3Bjb2Rlcy4KLQotV2VkIE1hciAyNCAwMjowMzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBkdmkgJiBpbnN0YWxsY2hlY2sgdGFyZ2V0cwotCi1Nb24gTWFyIDIyIDE4OjU1OjA0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBmb3IgaDg1MDAtZGlzLmMuCi0KLUZyaSBNYXIgMTkgMTQ6Mjc6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jLCBoODUwMC1vcGMuaDogTmV3IGZpbGVzCi0KLVRodSBNYXIgMTggMTQ6MTI6MzcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jLCB6OGstZGlzLmM6ICBDb252ZXJ0ZWQgdG8gdXNlIGludGVyZmFjZSBkZWZpbmVkIGluCi0JLi4vaW5jbHVkZS9kaXMtYXNtLmguCi0JKiBtNjhrLWRpcy5jOiAgTmV3IGZpbGUgKG1lcmdlIG9mIC4uL2JpbnV0aWxzL202OGstcGluc24uYwotCWFuZCAuLi9nZGIvbTY4ay1waW5zbi5jKS4KLQkqIGkzODYtZGlzLmM6ICBOZXcgZmlsZSAobWVyZ2Ugb2YgLi4vYmludXRpbHMvaTM4Ni1waW5zbi5jCi0JYW5kIC4uL2dkYi9pMzg2LXBpbnNuLmMpLgotCSogbTY4ODgxLWV4dC5jOiAgTmV3IGZpbGUuICBNb3ZlZCBkZWZpbml0aW9uIG9mCi0JZXh0X2Zvcm1hdCBleHRfZm9ybWF0XzY4ODgxIGZyb20gLi4vZ2RiL202OGstdGRlcC5jLgotCSogTWFrZWZpbGUuaW46ICBBZGp1c3QgZm9yIG5ldyBmaWxlcy4KLQkqIGkzODYtZGlzLmM6ICBQYXRjaGVzIGZyb20gSm9obiBIYXNzZXkgKGhhc3NleUBkZy1ydHAuZGcuY29tKS4KLQkqIG02OGstZGlzLmM6ICBSZWNvZ25pemUgJzknIHBsYWNlbWVudCBjb2RlLCBzbyAoc2F5KSBwZmx1c2gKLQljYW4gYmUgZGlzLWFzc2VtYmxlZC4KLQotV2VkIEZlYiAxNyAwOToxOTo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogTm93IHJldHVybnMgdm9pZC4KLQotTW9uIEphbiAxMSAxNjowOToxNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAoYW5zaWRlY2wuaCk6ICBJbmNsdWRlIGZvciBiZW5lZml0IG9mIHN5c2RlcC5oCi0JZmlsZXMgdGhhdCB1c2UgdGhlIG1hY3Jvcy4KLQotVGh1IEphbiAgNyAxMzoxNToxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmM6IE5ldyBmaWxlLCBmcm9tIGdkYi9taXBzLXBpbnNuLmMuCi0JKiBNYWtlZmlsZS5pbiAoRElTX0xJQlMpOiBBZGRlZCBtaXBzLWRpcy5vLgotCShDRklMRVMpOiBBZGRlZCBtaXBzLWRpcy5jLgotCi1UaHUgSmFuICA3IDA3OjM2OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgCSogejhrLWRpcy5jIChwcmludF9pbnNuX3o4MDAxLCBwcmludF9pbnNuX3o4MDAyKTogbmV3IHJvdXRpbmVzCi0JKiB6OGtnZW4uYywgejhrLW9wYy5oOiBmaXggc2l6ZXMgb2Ygc29tZSBzaGlmdHMuCi0KLVR1ZSBEZWMgMjIgMTU6NDI6NDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEltcHJvdmUgKmNsZWFuIHJ1bGVzLgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgYSBkZWZhdWx0IGhvc3QuCi0KLVR1ZSBOb3YgMTcgMTk6NTM6NTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWxzbyB1c2UgLUkkKHNyY2RpcikvLi4vYmZkLCBzaW5jZSBzb21lIHN5c2RlcAotCWZpbGVzIGluY2x1ZGUgb3RoZXIgc3lzZGVwIGZpbGVzCi0KLVRodSBOb3YgMTIgMTY6MTA6MzcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyB6OGstb3BjLmggejhrZ2VuLmM6IGNoZWNrcG9pbnQKLQotRnJpIE9jdCAgOSAwNDo1NjowNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgRm9yIGhvc3Qgc3VwcG9ydCwgdXNlIC4uL2JmZC9jb25maWd1cmUuaG9zdAotCXNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgLi4vYmZkL2hvc3RzIGRhdGFiYXNlLgotCi1UaHUgT2N0ICAxIDIzOjM4OjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKLQotV2VkIFNlcCAzMCAxNjowOToyMCAxOTkyICBNaWNoYWVsIFdlcm5lciAgKG10d0BjeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKHVucGFyc2VfaW5zdHIpOiBmaXggYnVnIHdoZXJlIG9wY29kZSByZXR1cm5lZCB3YXMKLQkqYWx3YXlzKiB0aGUgd3Jvbmcgb25lLgotCi1XZWQgU2VwIDMwIDA3OjQyOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGtnZW4uYzogYWRkZWQgY29weXJpZ2h0IGluZm8KLQotVHVlIFNlcCAyOSAxMjoyMDoyMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jICh1bnBhcnNlX2luc3RyKTogcHJldHRpZXIgdGFicwotCSogejhrZ2VuLmMgLT4gejhrLW9wYy5oOiBidWcgZml4ZXMgaW4gdGFibGVzCi0KLUZyaSBTZXAgMjUgMTI6NTA6MzIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIG5jciogY29uZmlndXJhdGlvbi4KLQkqIHo4ay1kaXMuYyAoc3RydWN0IGluc3RyX2RhdGFfcyk6ICBNYWtlIGluc3RyX2FzbXNyYyBjaGFyIHRvIG1ha2UKLQlwaWNheXVuZSBBTlNJIGNvbXBpbGVycyBoYXBweS4KLQotU2VwIDIwIDA4OjUwOjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYpOiAgTWFrZSBpMzg2IGFuZCBpNDg2IHN5bm9ueW1vdXMgZm9yIG5vdy4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXN5c3Y0KTogIEFkZCBteV9ob3N0IGRlZmluaXRpb24uCi0KLUZyaSBTZXAgMTggMTc6MDE6MjMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEZpeCB0eXBvLgotCi1GcmkgU2VwIDE4IDAyOjA0OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZSk6ICBSZW1vdmUgb2Jzb2xldGUgY3J1ZC4KLQkoc3BhcmMtb3BjLm8pOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVnLgotCi1UdWUgU2VwICA4IDE3OjI5OjI3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHNpbmNlIHRoZXJlIGFyZSBubyBTVUJESVJTLCByZW1vdmUgcnVsZSBhbmQKLQlyZWZlcmVuY2VzIG9mIHN1YmRpcl9kby4KLQotVHVlIFNlcCAgOCAxNzowMjo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogR2V0IHRoZSBsaWJyYXJ5IG5hbWUgcmlnaHQgaGVyZSB0b28uCi0JRG9uJ3QgaW5zdGFsbCBiZmQuaCwgc2luY2UgaXQncyB1bnJlbGF0ZWQgdG8gdGhpcyBsaWJyYXJ5LiAgTm8KLQlzdWJkaXJzIHRvIHJlY3Vyc2UgaW50bywgZWl0aGVyLgotCShDRklMRVMpOiBUaGUgc291cmNlIGZpbGUgaGFzIGEgLmMgc3VmZml4LCBub3QgLm8uCi0KLQkqIHNwYXJjLW9wYy5jOiBOZXcgZmlsZSwgbW92ZWQgZnJvbSBCRkQuCi0JKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogQnVpbGQgaXQuCi0KLVRodSBTZXAgIDMgMTY6NTk6MjAgMTk5MiAgTWljaGFlbCBXZXJuZXIgIChtdHdAY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jOiBmaXhlZCBmb3J3YXJkIHJlZmZlcmVuY2VzIG9mIHNvbWUgZGVjbGFyYXRpb25zLgotCi1Nb24gQXVnIDMxIDE2OjA5OjQ1IDE5OTIgIE1pY2hhZWwgV2VybmVyICAobXR3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBnZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgcmlnaHQKLQotTW9uIEF1ZyAzMSAxMzo0NzozNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jOiBrbm93cyBob3cgdG8gZGlzYXNzZW1ibGUgejhrIHN0dWZmCi0JKiB6OGstb3BjLmg6IG5ldyBmaWxlIGZ1bGwgb2YgejgwMDAgb3Bjb2RlcwotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9vcGNvZGVzL01ha2VmaWxlLmFtIGIvb3Bjb2Rlcy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkMTdmNi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUJESVJTID0gcG8KLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUJGRERJUiA9ICQoc3JjZGlyKS8uLi9iZmQKLU1LREVQID0gbWtkZXAKLQotbGliX0xUTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5sYQotCi0jIFRoaXMgaXMgd2hlcmUgYmZkLmggbGl2ZXMuCi1CRkRfSCA9IC4uL2JmZC9iZmQuaAotCi0jIEhlYWRlciBmaWxlcy4KLUhGSUxFUyA9IFwKLQlhcm0tb3BjLmggXAotCWZyMzAtZGVzYy5oIGZyMzAtb3BjLmggXAotCWg4NTAwLW9wYy5oIFwKLQltMzJyLWRlc2MuaCBtMzJyLW9wYy5oIFwKLQltY29yZS1vcGMuaCBcCi0Jc2gtb3BjLmggXAotCXN5c2RlcC5oIFwKLQl3NjUtb3BjLmggXAotCXo4ay1vcGMuaAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCWEyOWstZGlzLmMgXAotCWFscGhhLWRpcy5jIFwKLQlhbHBoYS1vcGMuYyBcCi0JYXJjLWRpcy5jIFwKLQlhcmMtb3BjLmMgXAotCWFybS1kaXMuYyBcCi0JY2dlbi1hc20uYyBcCi0JY2dlbi1kaXMuYyBcCi0JY2dlbi1vcGMuYyBcCi0JZDEwdi1kaXMuYyBcCi0JZDEwdi1vcGMuYyBcCi0JZDMwdi1kaXMuYyBcCi0JZDMwdi1vcGMuYyBcCi0JZGlzLWJ1Zi5jIFwKLQlkaXNhc3NlbWJsZS5jIFwKLQlmcjMwLWFzbS5jIFwKLQlmcjMwLWRlc2MuYyBcCi0JZnIzMC1kaXMuYyBcCi0JZnIzMC1pYmxkLmMgXAotCWZyMzAtb3BjLmMgXAotCWg4MzAwLWRpcy5jIFwKLQloODUwMC1kaXMuYyBcCi0JaHBwYS1kaXMuYyBcCi0JaTM4Ni1kaXMuYyBcCi0JaTk2MC1kaXMuYyBcCi0JbTMyci1hc20uYyBcCi0JbTMyci1kZXNjLmMgXAotCW0zMnItZGlzLmMgXAotCW0zMnItaWJsZC5jIFwKLQltMzJyLW9wYy5jIFwKLQltMzJyLW9waW5zdC5jIFwKLQltNjhrLWRpcy5jIFwKLQltNjhrLW9wYy5jIFwKLQltODhrLWRpcy5jIFwKLQltY29yZS1kaXMuYyBcCi0JbWlwcy1kaXMuYyBcCi0JbWlwcy1vcGMuYyBcCi0JbWlwczE2LW9wYy5jIFwKLQltMTAyMDAtZGlzLmMgXAotCW0xMDIwMC1vcGMuYyBcCi0JbTEwMzAwLWRpcy5jIFwKLQltMTAzMDAtb3BjLmMgXAotCW5zMzJrLWRpcy5jIFwKLQlwai1kaXMuYyBcCi0JcGotb3BjLmMgXAotCXBwYy1kaXMuYyBcCi0JcHBjLW9wYy5jIFwKLQlzaC1kaXMuYyBcCi0Jc3BhcmMtZGlzLmMgXAotCXNwYXJjLW9wYy5jIFwKLQl0aWMzMC1kaXMuYyBcCi0JdGljODAtZGlzLmMgXAotCXRpYzgwLW9wYy5jIFwKLQl2ODUwLWRpcy5jIFwKLQl2ODUwLW9wYy5jIFwKLQl2YXgtZGlzLmMgXAotCXc2NS1kaXMuYyBcCi0JejhrLWRpcy5jIFwKLQl6OGtnZW4uYwotCi1BTExfTUFDSElORVMgPSBcCi0JYTI5ay1kaXMubG8gXAotCWFscGhhLWRpcy5sbyBcCi0JYWxwaGEtb3BjLmxvIFwKLQlhcmMtZGlzLmxvIFwKLQlhcmMtb3BjLmxvIFwKLQlhcm0tZGlzLmxvIFwKLQljZ2VuLWFzbS5sbyBcCi0JY2dlbi1kaXMubG8gXAotCWNnZW4tb3BjLmxvIFwKLQlkMTB2LWRpcy5sbyBcCi0JZDEwdi1vcGMubG8gXAotCWQzMHYtZGlzLmxvIFwKLQlkMzB2LW9wYy5sbyBcCi0JZnIzMC1hc20ubG8gXAotCWZyMzAtZGVzYy5sbyBcCi0JZnIzMC1kaXMubG8gXAotCWZyMzAtaWJsZC5sbyBcCi0JZnIzMC1vcGMubG8gXAotCWg4MzAwLWRpcy5sbyBcCi0JaDg1MDAtZGlzLmxvIFwKLQlocHBhLWRpcy5sbyBcCi0JaTM4Ni1kaXMubG8gXAotCWk5NjAtZGlzLmxvIFwKLQltMzJyLWFzbS5sbyBcCi0JbTMyci1kZXNjLmxvIFwKLQltMzJyLWRpcy5sbyBcCi0JbTMyci1pYmxkLmxvIFwKLQltMzJyLW9wYy5sbyBcCi0JbTMyci1vcGluc3QubG8gXAotCW02OGstZGlzLmxvIFwKLQltNjhrLW9wYy5sbyBcCi0JbTg4ay1kaXMubG8gXAotCW0xMDIwMC1kaXMubG8gXAotCW0xMDIwMC1vcGMubG8gXAotCW0xMDMwMC1kaXMubG8gXAotCW0xMDMwMC1vcGMubG8gXAotCW1jb3JlLWRpcy5sbyBcCi0JbWlwcy1kaXMubG8gXAotCW1pcHMtb3BjLmxvIFwKLQltaXBzMTYtb3BjLmxvIFwKLQlwai1kaXMubG8gXAotCXBqLW9wYy5sbyBcCi0JcHBjLWRpcy5sbyBcCi0JcHBjLW9wYy5sbyBcCi0JbnMzMmstZGlzLmxvIFwKLQlzaC1kaXMubG8gXAotCXNwYXJjLWRpcy5sbyBcCi0Jc3BhcmMtb3BjLmxvIFwKLQl0aWMzMC1kaXMubG8gXAotCXRpYzgwLWRpcy5sbyBcCi0JdGljODAtb3BjLmxvIFwKLQl2ODUwLWRpcy5sbyBcCi0Jdjg1MC1vcGMubG8gXAotCXZheC1kaXMubG8gXAotCXc2NS1kaXMubG8gXAotCXo4ay1kaXMubG8KLQotT0ZJTEVTID0gQEJGRF9NQUNISU5FU0AKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoSU5DRElSKSAtSSQoQkZERElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCi0KLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9kaXMtYXNtLmgKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgQGFyY2hkZWZzQCAkKHNyY2RpcikvZGlzYXNzZW1ibGUuYwotCi1saWJvcGNvZGVzX2xhX1NPVVJDRVMgPSAgZGlzLWJ1Zi5jIGRpc2Fzc2VtYmxlLmMKLWxpYm9wY29kZXNfbGFfREVQRU5ERU5DSUVTID0gJChPRklMRVMpCi1saWJvcGNvZGVzX2xhX0xJQkFERCA9ICQoT0ZJTEVTKSBAV0lOMzJMSUJBRERACi1saWJvcGNvZGVzX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYm9wY29kZXMuYS4gIFdlIGNyZWF0ZSBsaWJvcGNvZGVzLmEgaW4KLSMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29udmVydCBhbGwgdGhlCi0jIHByb2dyYW1zIHRoYXQgdXNlIGxpYm9wY29kZXMuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoCi0jIHNob3VsZCBiZSByZW1vdmVkIGlmIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5hCi0KLXN0YW1wLWxpYjogbGlib3Bjb2Rlcy5sYQotCWlmIFsgLWYgLmxpYnMvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLVBPVEZJTEVTID0gJChIRklMRVMpICQoQ0ZJTEVTKQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotIyBXZSBzaG91bGQgcmVjb25maWd1cmUgd2hlbmV2ZXIgYmZkL2NvbmZpZ3VyZS5pbiBjaGFuZ2VzLCBiZWNhdXNlCi0jIHRoYXQncyB3aGVyZSB0aGUgdmVyc2lvbiBudW1iZXIgY29tZXMgZnJvbS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpLy4uL2JmZC9jb25maWd1cmUuaW4KLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLUNMRUFORklMRVMgPSBcCi0JbGlib3Bjb2Rlcy5hIHN0YW1wLWxpYiBkZXAuc2VkIERFUCBERVAxCi0KLQotCi0jIFRoZSBzdGFydCBtYXJrZXIgaXMgd3JpdHRlbiB0aGlzIHdheSB0byBwYXNzIHRocm91Z2ggYXV0b21ha2UgdW5zY2F0aGVkLgotCi0KLQotCi0jIFRoaXMgZGVwZW5kZW5jeSBzdHVmZiBpcyBjb3BpZWQgZnJvbSBCRkQuCi0KLURFUDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgREVQMQotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgREVQMQotCXNlZCAtZiBkZXAuc2VkIDwgREVQMSA+IERFUAotCi1ERVAxOiAkKENGSUxFUykKLQlybSAtZiBERVAyIERFUDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JZWNobyA+IERFUDJhCi0JJChNS0RFUCkgLWYgREVQMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/Ci0Jc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IERFUDJhID4+IERFUDIKLQlybSAtZiBERVAyYQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotYTI5ay1kaXMubG86IGEyOWstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi1hbHBoYS1kaXMubG86IGFscGhhLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmgKLWFscGhhLW9wYy5sbzogYWxwaGEtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChCRkRfSCkgb3BpbnRsLmgKLWFyYy1kaXMubG86IGFyYy1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBvcGludGwuaAotYXJjLW9wYy5sbzogYXJjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICBvcGludGwuaAotYXJtLWRpcy5sbzogYXJtLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCBhcm0tb3BjLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1jZ2VuLWFzbS5sbzogY2dlbi1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBvcGludGwuaAotY2dlbi1kaXMubG86IGNnZW4tZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1jZ2VuLW9wYy5sbzogY2dlbi1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmgKLWQxMHYtZGlzLmxvOiBkMTB2LWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotZDEwdi1vcGMubG86IGQxMHYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMTB2LmgKLWQzMHYtZGlzLmxvOiBkMzB2LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotZDMwdi1vcGMubG86IGQzMHYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLWRpcy1idWYubG86IGRpcy1idWYuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgb3BpbnRsLmgKLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotZnIzMC1hc20ubG86IGZyMzAtYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWRlc2MubG86IGZyMzAtZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kaXMubG86IGZyMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtaWJsZC5sbzogZnIzMC1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtb3BjLmxvOiBmcjMwLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaAotaDgzMDAtZGlzLmxvOiBoODMwMC1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1oODUwMC1kaXMubG86IGg4NTAwLWRpcy5jIGg4NTAwLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotaHBwYS1kaXMubG86IGhwcGEtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLWkzODYtZGlzLmxvOiBpMzg2LWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBjb25maWcuaCBvcGludGwuaAotaTk2MC1kaXMubG86IGk5NjAtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oCi1tMzJyLWFzbS5sbzogbTMyci1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGVzYy5sbzogbTMyci1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRpcy5sbzogbTMyci1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1pYmxkLmxvOiBtMzJyLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1vcGMubG86IG0zMnItb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5sbzogbTMyci1vcGluc3QuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW02OGstZGlzLmxvOiBtNjhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvZmxvYXRmb3JtYXQuaCBvcGludGwuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tNjhrLW9wYy5sbzogbTY4ay1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAotbTg4ay1kaXMubG86IG04OGstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbTg4ay5oIG9waW50bC5oCi1tY29yZS1kaXMubG86IG1jb3JlLWRpcy5jIG1jb3JlLW9wYy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotbWlwcy1kaXMubG86IG1pcHMtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLW1pcHMtb3BjLmxvOiBtaXBzLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1taXBzMTYtb3BjLmxvOiBtaXBzMTYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9taXBzLmgKLW0xMDIwMC1kaXMubG86IG0xMDIwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLW0xMDIwMC1vcGMubG86IG0xMDIwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotbTEwMzAwLWRpcy5sbzogbTEwMzAwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotbTEwMzAwLW9wYy5sbzogbTEwMzAwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1uczMyay1kaXMubG86IG5zMzJrLWRpcy5jICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICBvcGludGwuaAotcGotZGlzLmxvOiBwai1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL3BqLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi1wai1vcGMubG86IHBqLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvcGouaAotcHBjLWRpcy5sbzogcHBjLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi1wcGMtb3BjLmxvOiBwcGMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9wcGMuaCBcCi0gIG9waW50bC5oCi1zaC1kaXMubG86IHNoLWRpcy5jIHNoLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaAotc3BhcmMtZGlzLmxvOiBzcGFyYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2xpYmliZXJ0eS5oIG9waW50bC5oCi1zcGFyYy1vcGMubG86IHNwYXJjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotdGljMzAtZGlzLmxvOiB0aWMzMC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL29wY29kZS90aWMzMC5oCi10aWM4MC1kaXMubG86IHRpYzgwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLXRpYzgwLW9wYy5sbzogdGljODAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi12ODUwLWRpcy5sbzogdjg1MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLXY4NTAtb3BjLmxvOiB2ODUwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oIFwKLSAgb3BpbnRsLmgKLXZheC1kaXMubG86IHZheC1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotdzY1LWRpcy5sbzogdzY1LWRpcy5jIHc2NS1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXo4ay1kaXMubG86IHo4ay1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgejhrLW9wYy5oCi16OGtnZW4ubG86IHo4a2dlbi5jIHN5c2RlcC5oIGNvbmZpZy5oCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL29wY29kZXMvTWFrZWZpbGUuaW4gYi9vcGNvZGVzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTgzYWM3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4NzMgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9NQUNISU5FUyA9IEBCRkRfTUFDSElORVNACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUhERUZJTkVTID0gQEhERUZJTkVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKLVdJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAotYXJjaGRlZnMgPSBAYXJjaGRlZnNACi1sID0gQGxACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VCRElSUyA9IHBvCi0KLUlOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCi1CRkRESVIgPSAkKHNyY2RpcikvLi4vYmZkCi1NS0RFUCA9IG1rZGVwCi0KLWxpYl9MVExJQlJBUklFUyA9IGxpYm9wY29kZXMubGEKLQotIyBUaGlzIGlzIHdoZXJlIGJmZC5oIGxpdmVzLgotQkZEX0ggPSAuLi9iZmQvYmZkLmgKLQotIyBIZWFkZXIgZmlsZXMuCi1IRklMRVMgPSBcCi0JYXJtLW9wYy5oIFwKLQlmcjMwLWRlc2MuaCBmcjMwLW9wYy5oIFwKLQloODUwMC1vcGMuaCBcCi0JbTMyci1kZXNjLmggbTMyci1vcGMuaCBcCi0JbWNvcmUtb3BjLmggXAotCXNoLW9wYy5oIFwKLQlzeXNkZXAuaCBcCi0JdzY1LW9wYy5oIFwKLQl6OGstb3BjLmgKLQotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCWEyOWstZGlzLmMgXAotCWFscGhhLWRpcy5jIFwKLQlhbHBoYS1vcGMuYyBcCi0JYXJjLWRpcy5jIFwKLQlhcmMtb3BjLmMgXAotCWFybS1kaXMuYyBcCi0JY2dlbi1hc20uYyBcCi0JY2dlbi1kaXMuYyBcCi0JY2dlbi1vcGMuYyBcCi0JZDEwdi1kaXMuYyBcCi0JZDEwdi1vcGMuYyBcCi0JZDMwdi1kaXMuYyBcCi0JZDMwdi1vcGMuYyBcCi0JZGlzLWJ1Zi5jIFwKLQlkaXNhc3NlbWJsZS5jIFwKLQlmcjMwLWFzbS5jIFwKLQlmcjMwLWRlc2MuYyBcCi0JZnIzMC1kaXMuYyBcCi0JZnIzMC1pYmxkLmMgXAotCWZyMzAtb3BjLmMgXAotCWg4MzAwLWRpcy5jIFwKLQloODUwMC1kaXMuYyBcCi0JaHBwYS1kaXMuYyBcCi0JaTM4Ni1kaXMuYyBcCi0JaTk2MC1kaXMuYyBcCi0JbTMyci1hc20uYyBcCi0JbTMyci1kZXNjLmMgXAotCW0zMnItZGlzLmMgXAotCW0zMnItaWJsZC5jIFwKLQltMzJyLW9wYy5jIFwKLQltMzJyLW9waW5zdC5jIFwKLQltNjhrLWRpcy5jIFwKLQltNjhrLW9wYy5jIFwKLQltODhrLWRpcy5jIFwKLQltY29yZS1kaXMuYyBcCi0JbWlwcy1kaXMuYyBcCi0JbWlwcy1vcGMuYyBcCi0JbWlwczE2LW9wYy5jIFwKLQltMTAyMDAtZGlzLmMgXAotCW0xMDIwMC1vcGMuYyBcCi0JbTEwMzAwLWRpcy5jIFwKLQltMTAzMDAtb3BjLmMgXAotCW5zMzJrLWRpcy5jIFwKLQlwai1kaXMuYyBcCi0JcGotb3BjLmMgXAotCXBwYy1kaXMuYyBcCi0JcHBjLW9wYy5jIFwKLQlzaC1kaXMuYyBcCi0Jc3BhcmMtZGlzLmMgXAotCXNwYXJjLW9wYy5jIFwKLQl0aWMzMC1kaXMuYyBcCi0JdGljODAtZGlzLmMgXAotCXRpYzgwLW9wYy5jIFwKLQl2ODUwLWRpcy5jIFwKLQl2ODUwLW9wYy5jIFwKLQl2YXgtZGlzLmMgXAotCXc2NS1kaXMuYyBcCi0JejhrLWRpcy5jIFwKLQl6OGtnZW4uYwotCi0KLUFMTF9NQUNISU5FUyA9IFwKLQlhMjlrLWRpcy5sbyBcCi0JYWxwaGEtZGlzLmxvIFwKLQlhbHBoYS1vcGMubG8gXAotCWFyYy1kaXMubG8gXAotCWFyYy1vcGMubG8gXAotCWFybS1kaXMubG8gXAotCWNnZW4tYXNtLmxvIFwKLQljZ2VuLWRpcy5sbyBcCi0JY2dlbi1vcGMubG8gXAotCWQxMHYtZGlzLmxvIFwKLQlkMTB2LW9wYy5sbyBcCi0JZDMwdi1kaXMubG8gXAotCWQzMHYtb3BjLmxvIFwKLQlmcjMwLWFzbS5sbyBcCi0JZnIzMC1kZXNjLmxvIFwKLQlmcjMwLWRpcy5sbyBcCi0JZnIzMC1pYmxkLmxvIFwKLQlmcjMwLW9wYy5sbyBcCi0JaDgzMDAtZGlzLmxvIFwKLQloODUwMC1kaXMubG8gXAotCWhwcGEtZGlzLmxvIFwKLQlpMzg2LWRpcy5sbyBcCi0JaTk2MC1kaXMubG8gXAotCW0zMnItYXNtLmxvIFwKLQltMzJyLWRlc2MubG8gXAotCW0zMnItZGlzLmxvIFwKLQltMzJyLWlibGQubG8gXAotCW0zMnItb3BjLmxvIFwKLQltMzJyLW9waW5zdC5sbyBcCi0JbTY4ay1kaXMubG8gXAotCW02OGstb3BjLmxvIFwKLQltODhrLWRpcy5sbyBcCi0JbTEwMjAwLWRpcy5sbyBcCi0JbTEwMjAwLW9wYy5sbyBcCi0JbTEwMzAwLWRpcy5sbyBcCi0JbTEwMzAwLW9wYy5sbyBcCi0JbWNvcmUtZGlzLmxvIFwKLQltaXBzLWRpcy5sbyBcCi0JbWlwcy1vcGMubG8gXAotCW1pcHMxNi1vcGMubG8gXAotCXBqLWRpcy5sbyBcCi0JcGotb3BjLmxvIFwKLQlwcGMtZGlzLmxvIFwKLQlwcGMtb3BjLmxvIFwKLQluczMyay1kaXMubG8gXAotCXNoLWRpcy5sbyBcCi0Jc3BhcmMtZGlzLmxvIFwKLQlzcGFyYy1vcGMubG8gXAotCXRpYzMwLWRpcy5sbyBcCi0JdGljODAtZGlzLmxvIFwKLQl0aWM4MC1vcGMubG8gXAotCXY4NTAtZGlzLmxvIFwKLQl2ODUwLW9wYy5sbyBcCi0JdmF4LWRpcy5sbyBcCi0JdzY1LWRpcy5sbyBcCi0JejhrLWRpcy5sbwotCi0KLU9GSUxFUyA9IEBCRkRfTUFDSElORVNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKElOQ0RJUikgLUkkKEJGRERJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi1saWJvcGNvZGVzX2xhX1NPVVJDRVMgPSBkaXMtYnVmLmMgZGlzYXNzZW1ibGUuYwotbGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykKLWxpYm9wY29kZXNfbGFfTElCQUREID0gJChPRklMRVMpIEBXSU4zMkxJQkFEREAKLWxpYm9wY29kZXNfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikgQFdJTjMyTERGTEFHU0AKLQotIyBsaWJ0b29sIHdpbGwgYnVpbGQgLmxpYnMvbGlib3Bjb2Rlcy5hLiAgV2UgY3JlYXRlIGxpYm9wY29kZXMuYSBpbgotIyB0aGUgYnVpbGQgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUKLSMgcHJvZ3JhbXMgdGhhdCB1c2UgbGlib3Bjb2Rlcy5hIHNpbXVsdGFuZW91c2x5LiAgVGhpcyBpcyBhIGhhY2sgd2hpY2gKLSMgc2hvdWxkIGJlIHJlbW92ZWQgaWYgZXZlcnl0aGluZyBlbHNlIHN0YXJ0cyB1c2luZyBsaWJ0b29sLiAgRklYTUUuCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmEKLQotUE9URklMRVMgPSAkKEhGSUxFUykgJChDRklMRVMpCi0KLUNMRUFORklMRVMgPSBcCi0JbGlib3Bjb2Rlcy5hIHN0YW1wLWxpYiBkZXAuc2VkIERFUCBERVAxCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1MSUJSQVJJRVMgPSAgJChub2luc3RfTElCUkFSSUVTKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1saWJvcGNvZGVzX2FfTElCQUREID0gCi1saWJvcGNvZGVzX2FfU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jCi1saWJvcGNvZGVzX2FfT0JKRUNUUyA9ICBsaWJvcGNvZGVzLmEubwotTFRMSUJSQVJJRVMgPSAgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWxpYm9wY29kZXNfbGFfT0JKRUNUUyA9ICBkaXMtYnVmLmxvIGRpc2Fzc2VtYmxlLmxvCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLURJU1RfQ09NTU9OID0gIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jICQobGlib3Bjb2Rlc19sYV9TT1VSQ0VTKQotT0JKRUNUUyA9IGxpYm9wY29kZXMuYS5vICQobGlib3Bjb2Rlc19sYV9PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubG8gLm8gLnMKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1tb3N0bHljbGVhbi1saWJMVExJQlJBUklFUzoKLQotY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUzoKLQotaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgJChMSUJUT09MKSAgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCWRvbmUKLQotbGlib3Bjb2Rlcy5sYTogJChsaWJvcGNvZGVzX2xhX09CSkVDVFMpICQobGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGlib3Bjb2Rlc19sYV9MREZMQUdTKSAkKGxpYm9wY29kZXNfbGFfT0JKRUNUUykgJChsaWJvcGNvZGVzX2xhX0xJQkFERCkgJChMSUJTKQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1pbmZvLWFtOgotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbToKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKSAkKExUTElCUkFSSUVTKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChsaWJkaXIpCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBcCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAotaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgXAotYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi1kaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCi1tb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9kaXMtYXNtLmgKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgQGFyY2hkZWZzQCAkKHNyY2RpcikvZGlzYXNzZW1ibGUuYwotCi1zdGFtcC1saWI6IGxpYm9wY29kZXMubGEKLQlpZiBbIC1mIC5saWJzL2xpYm9wY29kZXMuYSBdOyB0aGVuIFwKLQkgIGNwIC5saWJzL2xpYm9wY29kZXMuYSBsaWJvcGNvZGVzLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYm9wY29kZXMudG1wIGxpYm9wY29kZXMuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGlib3Bjb2Rlcy5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotIyBXZSBzaG91bGQgcmVjb25maWd1cmUgd2hlbmV2ZXIgYmZkL2NvbmZpZ3VyZS5pbiBjaGFuZ2VzLCBiZWNhdXNlCi0jIHRoYXQncyB3aGVyZSB0aGUgdmVyc2lvbiBudW1iZXIgY29tZXMgZnJvbS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpLy4uL2JmZC9jb25maWd1cmUuaW4KLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSMgVGhlIHN0YXJ0IG1hcmtlciBpcyB3cml0dGVuIHRoaXMgd2F5IHRvIHBhc3MgdGhyb3VnaCBhdXRvbWFrZSB1bnNjYXRoZWQuCi0KLSMgVGhpcyBkZXBlbmRlbmN5IHN0dWZmIGlzIGNvcGllZCBmcm9tIEJGRC4KLQotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgY29uZmlnLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVAxID4gREVQCi0KLURFUDE6ICQoQ0ZJTEVTKQotCXJtIC1mIERFUDIgREVQMmEKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQllY2hvID4gREVQMmEKLQkkKE1LREVQKSAtZiBERVAyYSAkKElOQ0xVREVTKSAkKENGTEFHUykgJD8KLQlzZWQgLWUgJy9ETyBOT1QgREVMRVRFL2QnIC1lICcvXiQkL2QnIDwgREVQMmEgPj4gREVQMgotCXJtIC1mIERFUDJhCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUDIgREVQMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAQkZERElSQCEkKEJGRERJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi1hMjlrLWRpcy5sbzogYTI5ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLWFscGhhLWRpcy5sbzogYWxwaGEtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaAotYWxwaGEtb3BjLmxvOiBhbHBoYS1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKEJGRF9IKSBvcGludGwuaAotYXJjLWRpcy5sbzogYXJjLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIG9waW50bC5oCi1hcmMtb3BjLmxvOiBhcmMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hcmMuaCBcCi0gIG9waW50bC5oCi1hcm0tZGlzLmxvOiBhcm0tZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIGFybS1vcGMuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLWNnZW4tYXNtLmxvOiBjZ2VuLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG9waW50bC5oCi1jZ2VuLWRpcy5sbzogY2dlbi1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmgKLWNnZW4tb3BjLmxvOiBjZ2VuLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotZDEwdi1kaXMubG86IGQxMHYtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1kMTB2LW9wYy5sbzogZDEwdi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaAotZDMwdi1kaXMubG86IGQzMHYtZGlzLmMgJChJTkNESVIpL29wY29kZS9kMzB2LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1kMzB2LW9wYy5sbzogZDMwdi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotZGlzLWJ1Zi5sbzogZGlzLWJ1Zi5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSBvcGludGwuaAotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1mcjMwLWFzbS5sbzogZnIzMC1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGVzYy5sbzogZnIzMC1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWRpcy5sbzogZnIzMC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1pYmxkLmxvOiBmcjMwLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1vcGMubG86IGZyMzAtb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oCi1oODMwMC1kaXMubG86IGg4MzAwLWRpcy5jICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWg4NTAwLWRpcy5sbzogaDg1MDAtZGlzLmMgaDg1MDAtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1ocHBhLWRpcy5sbzogaHBwYS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotaTM4Ni1kaXMubG86IGkzODYtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIGNvbmZpZy5oIG9waW50bC5oCi1pOTYwLWRpcy5sbzogaTk2MC1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLW0zMnItYXNtLmxvOiBtMzJyLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kZXNjLmxvOiBtMzJyLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGlzLmxvOiBtMzJyLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWlibGQubG86IG0zMnItaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLW9wYy5sbzogbTMyci1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW0zMnItb3BpbnN0LmxvOiBtMzJyLW9waW5zdC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTY4ay1kaXMubG86IG02OGstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9mbG9hdGZvcm1hdC5oIG9waW50bC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW02OGstb3BjLmxvOiBtNjhrLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tODhrLWRpcy5sbzogbTg4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tODhrLmggb3BpbnRsLmgKLW1jb3JlLWRpcy5sbzogbWNvcmUtZGlzLmMgbWNvcmUtb3BjLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1taXBzLWRpcy5sbzogbWlwcy1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9taXBzLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotbWlwcy1vcGMubG86IG1pcHMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9taXBzLmgKLW1pcHMxNi1vcGMubG86IG1pcHMxNi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbTEwMjAwLWRpcy5sbzogbTEwMjAwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotbTEwMjAwLW9wYy5sbzogbTEwMjAwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1tMTAzMDAtZGlzLmxvOiBtMTAzMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAzMDAtb3BjLmxvOiBtMTAzMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLW5zMzJrLWRpcy5sbzogbnMzMmstZGlzLmMgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gIG9waW50bC5oCi1wai1kaXMubG86IHBqLWRpcy5jICQoSU5DRElSKS9vcGNvZGUvcGouaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXBqLW9wYy5sbzogcGotb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9wai5oCi1wcGMtZGlzLmxvOiBwcGMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLXBwYy1vcGMubG86IHBwYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oIFwKLSAgb3BpbnRsLmgKLXNoLWRpcy5sbzogc2gtZGlzLmMgc2gtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oCi1zcGFyYy1kaXMubG86IHNwYXJjLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvbGliaWJlcnR5Lmggb3BpbnRsLmgKLXNwYXJjLW9wYy5sbzogc3BhcmMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi10aWMzMC1kaXMubG86IHRpYzMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLXRpYzgwLWRpcy5sbzogdGljODAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotdGljODAtb3BjLmxvOiB0aWM4MC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLXY4NTAtZGlzLmxvOiB2ODUwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotdjg1MC1vcGMubG86IHY4NTAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS92ODUwLmggXAotICBvcGludGwuaAotdmF4LWRpcy5sbzogdmF4LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvdmF4LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi13NjUtZGlzLmxvOiB3NjUtZGlzLmMgdzY1LW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotejhrLWRpcy5sbzogejhrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSB6OGstb3BjLmgKLXo4a2dlbi5sbzogejhrZ2VuLmMgc3lzZGVwLmggY29uZmlnLmgKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9vcGNvZGVzL2EyOWstZGlzLmMgYi9vcGNvZGVzL2EyOWstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTU5YzkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hMjlrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qIEluc3RydWN0aW9uIHByaW50aW5nIGNvZGUgZm9yIHRoZSBBTUQgMjkwMDAKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiAgV3JpdHRlbiBieSBKaW0gS2luZ2Rvbi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9hMjlrLmgiCi0KLS8qIFByaW50IGEgc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2YgYSBnZW5lcmFsLXB1cnBvc2UKLSAgIHJlZ2lzdGVyIG51bWJlciBOVU0gb24gU1RSRUFNLgotICAgTlVNIGlzIGEgbnVtYmVyIGFzIGZvdW5kIGluIHRoZSBpbnN0cnVjdGlvbiwgbm90IGFzIGZvdW5kIGluCi0gICBkZWJ1Z2dpbmcgc3ltYm9sczsgaXQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMC0yNTUuICAqLwotc3RhdGljIHZvaWQKLXByaW50X2dlbmVyYWwgKG51bSwgaW5mbykKLSAgICAgaW50IG51bTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmIChudW0gPCAxMjgpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJnciVkIiwgbnVtKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibHIlZCIsIG51bSAtIDEyOCk7Ci19Ci0KLS8qIExpa2UgcHJpbnRfZ2VuZXJhbCBidXQgYSBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIuCi0gICAKLSAgIFRoZSBtbmVtb25pY3MgdXNlZCBieSB0aGUgQU1EIGFzc2VtYmxlciBhcmUgbm90IHF1aXRlIHRoZSBzYW1lCi0gICBhcyB0aGUgb25lcyBpbiB0aGUgVXNlcidzIE1hbnVhbC4gIFdlIHVzZSB0aGUgb25lcyB0aGF0IHRoZQotICAgYXNzZW1ibGVyIHVzZXMuICAqLwotc3RhdGljIHZvaWQKLXByaW50X3NwZWNpYWwgKG51bSwgaW5mbykKLSAgICAgdW5zaWduZWQgaW50IG51bTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIC8qIFJlZ2lzdGVyIG5hbWVzIG9mIHJlZ2lzdGVycyAwLVNQRUMwX05VTS0xLiAgKi8KLSAgc3RhdGljIGNoYXIgKnNwZWMwX25hbWVzW10gPSB7Ci0gICAgInZhYiIsICJvcHMiLCAiY3BzIiwgImNmZyIsICJjaGEiLCAiY2hkIiwgImNoYyIsICJyYnAiLCAidG1jIiwgInRtciIsCi0gICAgInBjMCIsICJwYzEiLCAicGMyIiwgIm1tdSIsICJscnUiLCAicnNuIiwgInJtYTAiLCAicm1jMCIsICJybWExIiwgInJtYzEiLAotICAgICJzcGMwIiwgInNwYzEiLCAic3BjMiIsICJpYmEwIiwgImliYzAiLCAiaWJhMSIsICJpYmMxIiwgImRiYSIsICJkYmMiLAotICAgICJjaXIiLCAiY2RyIgotICAgIH07Ci0jZGVmaW5lIFNQRUMwX05VTSAoKHNpemVvZiBzcGVjMF9uYW1lcykgLyAoc2l6ZW9mIHNwZWMwX25hbWVzWzBdKSkKLQotICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMTI4LTEyOCtTUEVDMTI4X05VTS0xLiAgKi8KLSAgc3RhdGljIGNoYXIgKnNwZWMxMjhfbmFtZXNbXSA9IHsKLSAgICAiaXBjIiwgImlwYSIsICJpcGIiLCAicSIsICJhbHUiLCAiYnAiLCAiZmMiLCAiY3IiCi0gICAgfTsKLSNkZWZpbmUgU1BFQzEyOF9OVU0gKChzaXplb2Ygc3BlYzEyOF9uYW1lcykgLyAoc2l6ZW9mIHNwZWMxMjhfbmFtZXNbMF0pKQotCi0gIC8qIFJlZ2lzdGVyIG5hbWVzIG9mIHJlZ2lzdGVycyAxNjAtMTYwK1NQRUMxNjBfTlVNLTEuICAqLwotICBzdGF0aWMgY2hhciAqc3BlYzE2MF9uYW1lc1tdID0gewotICAgICJmcGUiLCAiaW50ZSIsICJmcHMiLCAic3IxNjMiLCAiZXhvcCIKLSAgICB9OwotI2RlZmluZSBTUEVDMTYwX05VTSAoKHNpemVvZiBzcGVjMTYwX25hbWVzKSAvIChzaXplb2Ygc3BlYzE2MF9uYW1lc1swXSkpCi0KLSAgaWYgKG51bSA8IFNQRUMwX05VTSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc3BlYzBfbmFtZXNbbnVtXSk7Ci0gIGVsc2UgaWYgKG51bSA+PSAxMjggJiYgbnVtIDwgMTI4ICsgU1BFQzEyOF9OVU0pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNwZWMxMjhfbmFtZXNbbnVtLTEyOF0pOwotICBlbHNlIGlmIChudW0gPj0gMTYwICYmIG51bSA8IDE2MCArIFNQRUMxNjBfTlVNKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzcGVjMTYwX25hbWVzW251bS0xNjBdKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3IlZCIsIG51bSk7Ci19Ci0KLS8qIElzIGFuIGluc3RydWN0aW9uIHdpdGggT1BDT0RFIGEgZGVsYXllZCBicmFuY2g/ICAqLwotc3RhdGljIGludAotaXNfZGVsYXllZF9icmFuY2ggKG9wY29kZSkKLSAgICAgaW50IG9wY29kZTsKLXsKLSAgcmV0dXJuIChvcGNvZGUgPT0gMHhhOCB8fCBvcGNvZGUgPT0gMHhhOSB8fCBvcGNvZGUgPT0gMHhhMCB8fCBvcGNvZGUgPT0gMHhhMQotCSAgfHwgb3Bjb2RlID09IDB4YTQgfHwgb3Bjb2RlID09IDB4YTUKLQkgIHx8IG9wY29kZSA9PSAweGI0IHx8IG9wY29kZSA9PSAweGI1Ci0JICB8fCBvcGNvZGUgPT0gMHhjNCB8fCBvcGNvZGUgPT0gMHhjMAotCSAgfHwgb3Bjb2RlID09IDB4YWMgfHwgb3Bjb2RlID09IDB4YWQKLQkgIHx8IG9wY29kZSA9PSAweGNjKTsKLX0KLQotLyogTm93IGZpbmQgdGhlIGZvdXIgYnl0ZXMgb2YgSU5TTiBhbmQgcHV0IHRoZW0gaW4gKklOU057MCw4LDE2LDI0fS4gICovCi1zdGF0aWMgdm9pZAotZmluZF9ieXRlc19iaWcgKGluc24sIGluc24wLCBpbnNuOCwgaW5zbjE2LCBpbnNuMjQpCi0gICAgIGNoYXIgKmluc247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24wOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuODsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjE2OwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMjQ7Ci17Ci0gICppbnNuMjQgPSBpbnNuWzBdOwotICAqaW5zbjE2ID0gaW5zblsxXTsKLSAgKmluc244ICA9IGluc25bMl07Ci0gICppbnNuMCAgPSBpbnNuWzNdOwotfQotCi1zdGF0aWMgdm9pZAotZmluZF9ieXRlc19saXR0bGUgKGluc24sIGluc24wLCBpbnNuOCwgaW5zbjE2LCBpbnNuMjQpCi0gICAgIGNoYXIgKmluc247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24wOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuODsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjE2OwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMjQ7Ci17Ci0gICppbnNuMjQgPSBpbnNuWzNdOwotICAqaW5zbjE2ID0gaW5zblsyXTsKLSAgKmluc244ID0gaW5zblsxXTsKLSAgKmluc24wID0gaW5zblswXTsKLX0KLQotdHlwZWRlZiB2b2lkICgqZmluZF9ieXRlX2Z1bmNfdHlwZSkKLSAgICAgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwKLQkgICAgICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKikpOwotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBNRU1BRERSIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGFsd2F5cyA0IG9uIGEyOWspLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgLyogVGhlIHJhdyBpbnN0cnVjdGlvbi4gICovCi0gIGNoYXIgaW5zbls0XTsKLQotICAvKiBUaGUgZm91ciBieXRlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIGluc24yNCwgaW5zbjE2LCBpbnNuOCwgaW5zbjA7Ci0KLSAgZmluZF9ieXRlX2Z1bmNfdHlwZSBmaW5kX2J5dGVfZnVuYyA9IChmaW5kX2J5dGVfZnVuY190eXBlKWluZm8tPnByaXZhdGVfZGF0YTsKLQotICBzdHJ1Y3QgYTI5a19vcGNvZGUgQ09OU1QgKiBvcGNvZGU7Ci0KLSAgewotICAgIGludCBzdGF0dXMgPQotICAgICAgKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgKGJmZF9ieXRlICopICZpbnNuWzBdLCA0LCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgKCpmaW5kX2J5dGVfZnVuYykgKGluc24sICZpbnNuMCwgJmluc244LCAmaW5zbjE2LCAmaW5zbjI0KTsKLQotICBwcmludGYgKCIlMDJ4JTAyeCUwMnglMDJ4ICIsIGluc24yNCwgaW5zbjE2LCBpbnNuOCwgaW5zbjApOwotCi0gIC8qIEhhbmRsZSB0aGUgbm9wIChhc2VxIDB4NDAsZ3IxLGdyMSkgc3BlY2lhbGx5ICovCi0gIGlmICgoaW5zbjI0PT0weDcwKSAmJiAoaW5zbjE2PT0weDQwKSAmJiAoaW5zbjg9PTB4MDEpICYmIChpbnNuMD09MHgwMSkpIHsKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwibm9wIik7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0KLQotICAvKiBUaGUgb3Bjb2RlIGlzIGFsd2F5cyBpbiBpbnNuMjQuICAqLwotICBmb3IgKG9wY29kZSA9ICZhMjlrX29wY29kZXNbMF07Ci0gICAgICAgb3Bjb2RlIDwgJmEyOWtfb3Bjb2Rlc1tudW1fb3Bjb2Rlc107Ci0gICAgICAgKytvcGNvZGUpCi0gICAgewotICAgICAgaWYgKCgodW5zaWduZWQgbG9uZykgaW5zbjI0IDw8IDI0KSA9PSBvcGNvZGUtPm9wY29kZSkKLQl7Ci0JICBjaGFyICpzOwotCSAgCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsIG9wY29kZS0+bmFtZSk7Ci0JICBmb3IgKHMgPSBvcGNvZGUtPmFyZ3M7ICpzICE9ICdcMCc7ICsrcykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKnMpCi0JCXsKLQkJY2FzZSAnYSc6Ci0JCSAgcHJpbnRfZ2VuZXJhbCAoaW5zbjgsIGluZm8pOwotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICdiJzoKLQkJICBwcmludF9nZW5lcmFsIChpbnNuMCwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnYyc6Ci0JCSAgcHJpbnRfZ2VuZXJhbCAoaW5zbjE2LCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdpJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3gnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIChpbnNuMTYgPDwgOCkgKyBpbnNuMCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnaCc6Ci0JCSAgLyogVGhpcyB1c2VkIHRvIGJlICV4IGZvciBiaW51dGlscy4gICovCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCQkgICAgKGluc24xNiA8PCAyNCkgKyAoaW5zbjAgPDwgMTYpKTsKLQkJICBicmVhazsKLQotCQljYXNlICdYJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgKChpbnNuMTYgPDwgOCkgKyBpbnNuMCkgfCAweGZmZmYwMDAwKTsKLQkJICBicmVhazsKLQotCQljYXNlICdQJzoKLQkJICAvKiBUaGlzIG91dHB1dCBsb29rcyBqdXN0IGxpa2UgYWJzb2x1dGUgYWRkcmVzc2luZywgYnV0Ci0JCSAgICAgbWF5YmUgdGhhdCdzIE9LIChpdCdzIHdoYXQgdGhlIEdEQiBtNjhrIGFuZCBFQk1PTgotCQkgICAgIGEyOWsgZGlzYXNzZW1ibGVycyBkbykuICAqLwotCQkgIC8qIEFsbCB0aGUgc2hpZnRpbmcgaXMgdG8gc2lnbi1leHRlbmQgaXQuICBwKi8KLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJICAgIChtZW1hZGRyICsKLQkJICAgICAoKChpbnQpKChpbnNuMTYgPDwgMTApICsgKGluc24wIDw8IDIpKSA8PCAxNCkgPj4gMTQpLAotCQkgICAgIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0EnOgotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkgICAgKChpbnNuMTYgPDwgMTApICsgKGluc24wIDw8IDIpLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdlJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjE2ID4+IDcpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ24nOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGluc24xNiAmIDB4N2YpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGluc24xNik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncyc6Ci0JCSAgcHJpbnRfc3BlY2lhbCAoaW5zbjgsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3UnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMCA+PiA3KTsKLQkJICBicmVhazsKLQotCQljYXNlICdyJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKGluc24wID4+IDQpICYgNyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnSSc6Ci0JCSAgaWYgKChpbnNuMTYgJiAzKSAhPSAwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2QnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCAoaW5zbjAgPj4gMikgJiAzKTsKLQkJICBicmVhazsKLQotCQljYXNlICdmJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjAgJiAzKTsKLQkJICBicmVhazsKLQotCQljYXNlICdGJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKGluc24xNiA+PiAyKSAmIDE1KTsKLQkJICBicmVhazsKLQotCQljYXNlICdDJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjE2ICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKnMpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogTm93IHdlIGxvb2sgZm9yIGEgY29uc3QsY29uc3RoIHBhaXIgb2YgaW5zdHJ1Y3Rpb25zLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSB0cnkgdG8gcHJpbnQgdGhlIHN5bWJvbGljIGFkZHJlc3MuICAqLwotCSAgaWYgKGluc24yNCA9PSAyKSAgLyogY29uc3RoICovCi0JICAgIHsKLQkgICAgICBpbnQgZXJyY29kZTsKLQkgICAgICBjaGFyIHByZXZfaW5zbls0XTsKLQkgICAgICB1bnNpZ25lZCBjaGFyIHByZXZfaW5zbjAsIHByZXZfaW5zbjgsIHByZXZfaW5zbjE2LCBwcmV2X2luc24yNDsKLQkgICAgICAKLQkgICAgICBlcnJjb2RlID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciAtIDQsCi0JCQkJCQkgICAoYmZkX2J5dGUgKikgJnByZXZfaW5zblswXSwKLQkJCQkJCSAgIDQsCi0JCQkJCQkgICBpbmZvKTsKLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSWYgaXQgaXMgYSBkZWxheWVkIGJyYW5jaCwgd2UgbmVlZCB0byBsb29rIGF0IHRoZQotCQkgICAgIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgZGVsYXllZCBicmFjaCB0byBoYW5kbGUKLQkJICAgICB0aGluZ3MgbGlrZQotCQkgICAgIAotCQkgICAgIGNvbnN0IF9mb28KLQkJICAgICBjYWxsIF9wcmludGYKLQkJICAgICBjb25zdGggX2ZvbwotCQkgICAgICovCi0JCSAgKCpmaW5kX2J5dGVfZnVuYykgKHByZXZfaW5zbiwgJnByZXZfaW5zbjAsICZwcmV2X2luc244LAotCQkJCSAgICAgJnByZXZfaW5zbjE2LCAmcHJldl9pbnNuMjQpOwotCQkgIGlmIChpc19kZWxheWVkX2JyYW5jaCAocHJldl9pbnNuMjQpKQotCQkgICAgewotCQkgICAgICBlcnJjb2RlID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCQkJKG1lbWFkZHIgLSA4LCAoYmZkX2J5dGUgKikgJnByZXZfaW5zblswXSwgNCwgaW5mbyk7Ci0JCSAgICAgICgqZmluZF9ieXRlX2Z1bmMpIChwcmV2X2luc24sICZwcmV2X2luc24wLCAmcHJldl9pbnNuOCwKLQkJCQkJICZwcmV2X2luc24xNiwgJnByZXZfaW5zbjI0KTsKLQkJICAgIH0KLQkJfQotCQkgIAotCSAgICAgIC8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gcmVhZGluZyBtZW1vcnksIHRoZW4gYXNzdW1lCi0JCSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIG5vdCBjb25zdC4gICovCi0JICAgICAgaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkgIC8qIElzIGl0IGNvbnN0IHRvIHRoZSBzYW1lIHJlZ2lzdGVyPyAgKi8KLQkJICBpZiAocHJldl9pbnNuMjQgPT0gMwotCQkgICAgICAmJiBwcmV2X2luc244ID09IGluc244KQotCQkgICAgewotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0OyAiKTsKLQkJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCQkoKChpbnNuMTYgPDwgMjQpICsgKGluc24wIDw8IDE2KQotCQkJICArIChwcmV2X2luc24xNiA8PCA4KSArIChwcmV2X2luc24wKSksCi0JCQkgaW5mbyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICByZXR1cm4gNDsKLQl9Ci0gICAgfQotICAvKiBUaGlzIHVzZWQgdG8gYmUgJTh4IGZvciBiaW51dGlscy4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKQotICAgIChpbmZvLT5zdHJlYW0sICIud29yZCAweCUwOHgiLAotICAgICAoaW5zbjI0IDw8IDI0KSArIChpbnNuMTYgPDwgMTYpICsgKGluc244IDw8IDgpICsgaW5zbjApOwotICByZXR1cm4gNDsKLX0KLQotLyogRGlzYXNzZW1ibGUgYW4gYmlnLWVuZGlhbiBhMjlrIGluc3RydWN0aW9uLiAgKi8KLWludAotcHJpbnRfaW5zbl9iaWdfYTI5ayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgZmluZF9ieXRlc19iaWc7Ci0gIHJldHVybiBwcmludF9pbnNuIChtZW1hZGRyLCBpbmZvKTsKLX0KLQotLyogRGlzYXNzZW1ibGUgYSBsaXR0bGUtZW5kaWFuIGEyOWsgaW5zdHJ1Y3Rpb24uICAqLwotaW50Ci1wcmludF9pbnNuX2xpdHRsZV9hMjlrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSBmaW5kX2J5dGVzX2xpdHRsZTsKLSAgcmV0dXJuIHByaW50X2luc24gKG1lbWFkZHIsIGluZm8pOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hY2luY2x1ZGUubTQgYi9vcGNvZGVzL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiMDliOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCmRpZmYgLS1naXQgYS9vcGNvZGVzL2FjbG9jYWwubTQgYi9vcGNvZGVzL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODcxMWQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTExMSArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCi0jIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KLSMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgc2VyaWFsIDEKLQotZG5sIFVzYWdlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKLQotQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotUEFDS0FHRT1bJDFdCi1BQ19TVUJTVChQQUNLQUdFKQotVkVSU0lPTj1bJDJdCi1BQ19TVUJTVChWRVJTSU9OKQotZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLWlmZWxzZShbJDNdLCwKLUFDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLUFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKLWRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KLSMKLQotQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCi1kbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgotQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAotW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICQxPSQyCi0gICBBQ19NU0dfUkVTVUxUKGZvdW5kKQotZWxzZQotICAgJDE9IiQzL21pc3NpbmcgJDIiCi0gICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCi1maQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIHNlcmlhbCAzNSBBQ19QUk9HX0xJQlRPT0wKLUFDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKLVtBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1BQ19DQUNIRV9TQVZFCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCi0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICBBQ19TWVNfTElCVE9PTF9DWUdXSU4KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCi1bICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmddLAotbmVlZF9sb2Nrcz0kZW5hYmxldmFsLAotbmVlZF9sb2Nrcz15ZXMpCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGNoZWNrIGZvciBkbG9wZW4gc3VwcG9ydAotQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtsdF9kbG9wZW49eWVzXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELAotW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELAotW0FDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLAotW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHN0YXRpYywKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLAotW0FDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsCi1bZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKLUFDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLAotW0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKEFDX1BST0dfTEQsCi1bQUNfQVJHX1dJVEgoZ251LWxkLAotWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCi10ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotY2hhbmdlcXVvdGUoLClkbmwKLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfU1VCU1QoTEQpCi1BQ19QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFDX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1BQ19NU0dfUkVTVUxUKFskTk1dKQotQUNfU1VCU1QoTk0pCi1dKQotCi0jIEFDX1NZU19OTV9QQVJTRSAtIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZAotIyBieSBDIHN5bWJvbCBuYW1lIGZyb20gbm0uCi1BQ19ERUZVTihBQ19TWVNfTk1fUEFSU0UsCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUsCi1bIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi1jaGFuZ2VxdW90ZSgsKWRubAotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJGFjX3N5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1jaGFuZ2VxdW90ZSgsKWRubAotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotCSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotXSkKLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1BQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCi1dKQotCi0jIEFDX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgotQUNfREVGVU4oQUNfU1lTX0xJQlRPT0xfQ1lHV0lOLAotW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi1BQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi1dKQotCi0jIEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSAtIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIHVuZGVyc2NvcmU/Ci1BQ19ERUZVTihBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAotW2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi1maQotcm0gLXJmIGNvbmZ0ZXN0KgotXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSkKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLUFDX1NVQlNUKFVTRV9TWU1CT0xfVU5ERVJTQ09SRSlkbmwKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sIFsKLUFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wpCi1BQ19DSEVDS19MSUIobSwgY29zKQotXSkKLQotIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi1BQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLV0pCi0KLSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCi1BQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLCBMSUJMVERMPSItbGx0ZGwiLCBbCi0gICAgY2FzZSAiJGVuYWJsZV9sdGRsX2luc3RhbGwiIGluCi0gICAgbm8pIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKSA7OwotICAgICIiKSBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIgOzsKLSAgICBlc2FjCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geCJubyI7IHRoZW4KLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotQUNfREVGVU4oQU1fU1lTX05NX1BBUlNFLCBbaW5kaXIoW0FDX1NZU19OTV9QQVJTRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwgW2luZGlyKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sIFtpbmRpcihbQUNfU1lTX0xJQlRPT0xfQ1lHV0lOXSldKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2FscGhhLWRpcy5jIGIvb3Bjb2Rlcy9hbHBoYS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyZDhmYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FscGhhLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qIGFscGhhLWRpcy5jIC0tIERpc2Fzc2VtYmxlIEFscGhhIEFYUCBpbnN0cnVjdGlvbnMKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4sCi0gICBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIFBQQyBvcGNvZGUgaGFuZGxpbmcgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FscGhhLmgiCi0KLS8qIE9TRiByZWdpc3RlciBuYW1lcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3NmX3JlZ25hbWVzWzY0XSA9Ci17Ci0gICJ2MCIsICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsICJ0NCIsICJ0NSIsICJ0NiIsCi0gICJ0NyIsICJzMCIsICJzMSIsICJzMiIsICJzMyIsICJzNCIsICJzNSIsICJmcCIsCi0gICJhMCIsICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJ0OCIsICJ0OSIsCi0gICJ0MTAiLCAidDExIiwgInJhIiwgInQxMiIsICJhdCIsICJncCIsICJzcCIsICJ6ZXJvIiwKLSAgIiRmMCIsICIkZjEiLCAiJGYyIiwgIiRmMyIsICIkZjQiLCAiJGY1IiwgIiRmNiIsICIkZjciLAotICAiJGY4IiwgIiRmOSIsICIkZjEwIiwgIiRmMTEiLCAiJGYxMiIsICIkZjEzIiwgIiRmMTQiLCAiJGYxNSIsCi0gICIkZjE2IiwgIiRmMTciLCAiJGYxOCIsICIkZjE5IiwgIiRmMjAiLCAiJGYyMSIsICIkZjIyIiwgIiRmMjMiLAotICAiJGYyNCIsICIkZjI1IiwgIiRmMjYiLCAiJGYyNyIsICIkZjI4IiwgIiRmMjkiLCAiJGYzMCIsICIkZjMxIgotfTsKLQotLyogVk1TIHJlZ2lzdGVyIG5hbWVzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXNfcmVnbmFtZXNbNjRdID0KLXsKLSAgIlIwIiwgIlIxIiwgIlIyIiwgIlIzIiwgIlI0IiwgIlI1IiwgIlI2IiwgIlI3IiwKLSAgIlI4IiwgIlI5IiwgIlIxMCIsICJSMTEiLCAiUjEyIiwgIlIxMyIsICJSMTQiLCAiUjE1IiwKLSAgIlIxNiIsICJSMTciLCAiUjE4IiwgIlIxOSIsICJSMjAiLCAiUjIxIiwgIlIyMiIsICJSMjMiLAotICAiUjI0IiwgIkFJIiwgIlJBIiwgIlBWIiwgIkFUIiwgIkZQIiwgIlNQIiwgIlJaIiwKLSAgIkYwIiwgIkYxIiwgIkYyIiwgIkYzIiwgIkY0IiwgIkY1IiwgIkY2IiwgIkY3IiwKLSAgIkY4IiwgIkY5IiwgIkYxMCIsICJGMTEiLCAiRjEyIiwgIkYxMyIsICJGMTQiLCAiRjE1IiwKLSAgIkYxNiIsICJGMTciLCAiRjE4IiwgIkYxOSIsICJGMjAiLCAiRjIxIiwgIkYyMiIsICJGMjMiLAotICAiRjI0IiwgIkYyNSIsICJGMjYiLCAiRjI3IiwgIkYyOCIsICJGMjkiLCAiRjMwIiwgIkZaIgotfTsKLQotLyogRGlzYXNzZW1ibGUgQWxwaGEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2FscGhhIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlX2luZGV4W0FYUF9OT1BTKzFdOwotICBjb25zdCBjaGFyICogY29uc3QgKiByZWduYW1lczsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlLCAqb3Bjb2RlX2VuZDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgdW5zaWduZWQgaW5zbiwgb3AsIGlzYV9tYXNrOwotICBpbnQgbmVlZF9jb21tYTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtYWpvcm9wIHRhYmxlIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgaWYgKCFvcGNvZGVfaW5kZXhbMF0pCi0gICAgewotICAgICAgb3Bjb2RlID0gYWxwaGFfb3Bjb2RlczsKLSAgICAgIG9wY29kZV9lbmQgPSBvcGNvZGUgKyBhbHBoYV9udW1fb3Bjb2RlczsKLQotICAgICAgZm9yIChvcCA9IDA7IG9wIDwgQVhQX05PUFM7ICsrb3ApCi0gICAgICAgIHsKLSAgICAgICAgICBvcGNvZGVfaW5kZXhbb3BdID0gb3Bjb2RlOwotICAgICAgICAgIHdoaWxlIChvcGNvZGUgPCBvcGNvZGVfZW5kICYmIG9wID09IEFYUF9PUCAob3Bjb2RlLT5vcGNvZGUpKQotCSAgICArK29wY29kZTsKLSAgICAgICAgfQotICAgICAgb3Bjb2RlX2luZGV4W29wXSA9IG9wY29kZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIpCi0gICAgcmVnbmFtZXMgPSB2bXNfcmVnbmFtZXM7Ci0gIGVsc2UKLSAgICByZWduYW1lcyA9IG9zZl9yZWduYW1lczsKLQotICBpc2FfbWFzayA9IEFYUF9PUENPREVfTk9QQUw7Ci0gIHN3aXRjaCAoaW5mby0+bWFjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9hbHBoYV9ldjQ6Ci0gICAgICBpc2FfbWFzayB8PSBBWFBfT1BDT0RFX0VWNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfYWxwaGFfZXY1OgotICAgICAgaXNhX21hc2sgfD0gQVhQX09QQ09ERV9FVjU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX2FscGhhX2V2NjoKLSAgICAgIGlzYV9tYXNrIHw9IEFYUF9PUENPREVfRVY2OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGluc24gaW50byBhIGhvc3Qgd29yZCAqLwotICB7Ci0gICAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICAgIGludCBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICBpbnNuID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLSAgfQotCi0gIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9wID0gQVhQX09QIChpbnNuKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgb3Bjb2RlX2VuZCA9IG9wY29kZV9pbmRleFtvcCsxXTsKLSAgZm9yIChvcGNvZGUgPSBvcGNvZGVfaW5kZXhbb3BdOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyArK29wY29kZSkKLSAgICB7Ci0gICAgICBpZiAoKGluc24gJiBvcGNvZGUtPm1hc2spICE9IG9wY29kZS0+b3Bjb2RlKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoIShvcGNvZGUtPmZsYWdzICYgaXNhX21hc2spKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIHsKLSAgICAgICAgaW50IGludmFsaWQgPSAwOwotICAgICAgICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0JICB7Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9IGFscGhhX29wZXJhbmRzICsgKm9waW5kZXg7Ci0JICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sICZpbnZhbGlkKTsKLQkgIH0KLSAgICAgICAgaWYgKGludmFsaWQpCi0JICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGdvdG8gZm91bmQ7Ci0gICAgfQotCi0gIC8qIE5vIGluc3RydWN0aW9uIGZvdW5kICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmcgJSMwOHgiLCBpbnNuKTsKLSAgICAKLSAgcmV0dXJuIDQ7Ci0KLWZvdW5kOgotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3Bjb2RlLT5uYW1lKTsKLSAgaWYgKG9wY29kZS0+b3BlcmFuZHNbMF0gIT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0gIG5lZWRfY29tbWEgPSAwOwotICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSBhbHBoYV9vcGVyYW5kcyArICpvcGluZGV4OwotICAgICAgaW50IHZhbHVlOwotCi0gICAgICAvKiBPcGVyYW5kcyB0aGF0IGFyZSBtYXJrZWQgRkFLRSBhcmUgc2ltcGx5IGlnbm9yZWQuICBXZQotCSBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKLQkgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZhbGlkLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQl2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBzaWduYml0ID0gMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpOwotCSAgICAgIHZhbHVlID0gKHZhbHVlIF4gc2lnbmJpdCkgLSBzaWduYml0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobmVlZF9jb21tYSAmJgotCSAgKChvcGVyYW5kLT5mbGFncyAmIChBWFBfT1BFUkFORF9QQVJFTlN8QVhQX09QRVJBTkRfQ09NTUEpKQotCSAgICE9IEFYUF9PUEVSQU5EX1BBUkVOUykpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JfQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUEFSRU5TKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCi0gICAgICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfSVIpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWVzW3ZhbHVlXSk7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZQUikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZXNbdmFsdWUrMzJdKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUkVMQVRJVkUpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgNCArIHZhbHVlLCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlI3giLCB2YWx1ZSk7Ci0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1BBUkVOUykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLSAgICAgIG5lZWRfY29tbWEgPSAxOwotICAgIH0KLQotICByZXR1cm4gNDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWxwaGEtb3BjLmMgYi9vcGNvZGVzL2FscGhhLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YThjYTU5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWxwaGEtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ2ICswLDAgQEAKLS8qIGFscGhhLW9wYy5jIC0tIEFscGhhIEFYUCBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEBjeWdudXMuY29tPiwKLSAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSBoYW5kbGluZyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9hbHBoYS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIEFscGhhIEFYUCBvcGNvZGUgdGFibGUuICBUaGUgb3Bjb2RlIHRhYmxlIGluY2x1ZGVzCi0gICBhbG1vc3QgYWxsIG9mIHRoZSBleHRlbmRlZCBpbnN0cnVjdGlvbiBtbmVtb25pY3MuICBUaGlzIHBlcm1pdHMgdGhlCi0gICBkaXNhc3NlbWJsZXIgdG8gdXNlIHRoZW0sIGFuZCBzaW1wbGlmaWVzIHRoZSBhc3NlbWJsZXIgbG9naWMsIGF0IHRoZQotICAgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSB0YWJsZSBzaXplLiAgVGhlIHRhYmxlIGlzIHN0cmljdGx5IGNvbnN0YW50Ci0gICBkYXRhLCBzbyB0aGUgY29tcGlsZXIgc2hvdWxkIGJlIGFibGUgdG8gcHV0IGl0IGluIHRoZSAudGV4dCBzZWN0aW9uLgotCi0gICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQgaW5zZXJ0aW5nCi0gICBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMgZmlsZS4KLQotICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYmFzZSBpbnN0cnVjdGlvbiBzZXQgd2FzIGNvbXBpbGVkIGZyb20gdGhlCi0gICBfQWxwaGEgQXJjaGl0ZWN0dXJlIEhhbmRib29rXywgRGlnaXRhbCBPcmRlciBOdW1iZXIgRUMtUUQyS0ItVEUsCi0gICB2ZXJzaW9uIDIuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBvc3QtZXY1IGFyY2hpdGVjdHVyZSBleHRlbnNpb25zIEJXWCwgQ0lYIGFuZAotICAgTUFYIGNhbWUgZnJvbSB2ZXJzaW9uIDMgb2YgdGhpcyBzYW1lIGRvY3VtZW50LCB3aGljaCBpcyBhbHNvIGF2YWlsYWJsZQotICAgb24tbGluZSBhdCBodHRwOi8vZnRwLmRpZ2l0YWwuY29tL3B1Yi9EaWdpdGFsL2luZm8vc2VtaWNvbmR1Y3RvcgotICAgL2xpdGVyYXR1cmUvYWxwaGFoYjIucGRmCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEVWNCBQQUxjb2RlIGluc3RydWN0aW9ucyB3YXMgY29tcGlsZWQgZnJvbQotICAgX0RFQ2NoaXAgMjEwNjQgYW5kIERFQ2NoaXAgMjEwNjRBIEFscGhhIEFYUCBNaWNyb3Byb2Nlc3NvcnMgSGFyZHdhcmUKLSAgIFJlZmVyZW5jZSBNYW51YWxfLCBEaWdpdGFsIE9yZGVyIE51bWJlciBFQy1ROVpVQS1URSwgcHJlbGltaW5hcnkKLSAgIHJldmlzaW9uIGRhdGVkIEp1bmUgMTk5NC4KLQotICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgRVY1IFBBTGNvZGUgaW5zdHJ1Y3Rpb25zIHdhcyBjb21waWxlZCBmcm9tCi0gICBfQWxwaGEgMjExNjQgTWljcm9wcm9jZXNzb3IgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbF8sIERpZ2l0YWwKLSAgIE9yZGVyIE51bWJlciBFQy1RQUVRQi1URSwgcHJlbGltaW5hcnkgcmV2aXNpb24gZGF0ZWQgQXByaWwgMTk5NS4gICovCi0MCi0vKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfcmJhIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9yY2EgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3phIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF96YiBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfemMgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X2JkaXNwIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9qaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfZXY2aHdqaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludCBleHRyYWN0X3JiYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3JjYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3phIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfemIgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF96YyBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X2JkaXNwIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfamhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9ldjZod2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSAgKi8KLQotY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgYWxwaGFfb3BlcmFuZHNbXSA9Ci17Ci0gIC8qIFRoZSBmaWVsZHMgYXJlIGJpdHMsIHNoaWZ0LCBpbnNlcnQsIGV4dHJhY3QsIGZsYWdzICovCi0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgZW5kLW9mLWxpc3QgKi8KLSNkZWZpbmUgVU5VU0VECQkwCi0gIHsgMCwgMCwgMCwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBwbGFpbiBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkcyAqLwotI2RlZmluZSBSQQkJKFVOVVNFRCArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0lSLCAwLCAwIH0sCi0jZGVmaW5lIFJCCQkoUkEgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotI2RlZmluZSBSQwkJKFJCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotCi0gIC8qIFRoZSBwbGFpbiBmcCByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgRkEJCShSQyArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotI2RlZmluZSBGQgkJKEZBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRlBSLCAwLCAwIH0sCi0jZGVmaW5lIEZDCQkoRkIgKyAxKQotICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotCi0gIC8qIFRoZSBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVuIHRoZXkgYXJlIFpFUk8gKi8KLSNkZWZpbmUgWkEJCShGQyArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YSwgZXh0cmFjdF96YSB9LAotI2RlZmluZSBaQgkJKFpBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3piLCBleHRyYWN0X3piIH0sCi0jZGVmaW5lIFpDCQkoWkIgKyAxKQotICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YywgZXh0cmFjdF96YyB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG5lZWRzIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIFBSQgkJKFpDICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TLCAwLCAwIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbmVlZHMgcGFyZW50aGVzZXMgX2FuZF8gYSBwcmVjZWRpbmcgY29tbWEgKi8KLSNkZWZpbmUgQ1BSQgkJKFBSQiArIDEpCi0gIHsgNSwgMTYsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BLCAwLCAwIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgUkEgZmllbGQgKi8KLSNkZWZpbmUgUkJBCQkoQ1BSQiArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF9yYmEsIGV4dHJhY3RfcmJhIH0sCi0KLSAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgUkIgZmllbGQgKi8KLSNkZWZpbmUgUkNBCQkoUkJBICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfcmNhLCBleHRyYWN0X3JjYSB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkEgKi8KLSNkZWZpbmUgRFJDMQkJKFJDQSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNULCAwLCAwIH0sCi0KLSAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQiAqLwotI2RlZmluZSBEUkMyCQkoRFJDMSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkEgKi8KLSNkZWZpbmUgREZDMQkJKERSQzIgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfRlBSfEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QsIDAsIDAgfSwKLQotICAvKiBUaGUgRkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJCICovCi0jZGVmaW5lIERGQzIJCShERkMxICsgMSkKLSAgeyA1LCAwLCAwLAotICAgIEFYUF9PUEVSQU5EX0ZQUnxBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCwgMCwgMCB9LAotCi0gIC8qIFRoZSB1bnNpZ25lZCA4LWJpdCBsaXRlcmFsIG9mIE9wZXJhdGUgZm9ybWF0IGluc25zICovCi0jZGVmaW5lIExJVAkJKERGQzIgKyAxKQotICB7IDgsIDEzLCAtTElULCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSBzaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBvZiBNZW1vcnkgZm9ybWF0IGluc25zLiAgRnJvbSBoZXJlCi0gICAgIHdlIGNhbid0IHRlbGwgd2hhdCByZWxvY2F0aW9uIHNob3VsZCBiZSB1c2VkLCBzbyBkb24ndCB1c2UgYSBkZWZhdWx0LiAqLwotI2RlZmluZSBNRElTUAkJKExJVCArIDEpCi0gIHsgMTYsIDAsIC1NRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIHNpZ25lZCAiMjMtYml0IiBhbGlnbmVkIGRpc3BsYWNlbWVudCBvZiBCcmFuY2ggZm9ybWF0IGluc25zICovCi0jZGVmaW5lIEJESVNQCQkoTURJU1AgKyAxKQotICB7IDIxLCAwLCBCRkRfUkVMT0NfMjNfUENSRUxfUzIsIAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFLCBpbnNlcnRfYmRpc3AsIGV4dHJhY3RfYmRpc3AgfSwKLQotICAvKiBUaGUgMjYtYml0IFBBTGNvZGUgZnVuY3Rpb24gKi8KLSNkZWZpbmUgUEFMRk4JCShCRElTUCArIDEpCi0gIHsgMjYsIDAsIC1QQUxGTiwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgb3B0aW9uYWwgc2lnbmVkICIxNi1iaXQiIGFsaWduZWQgZGlzcGxhY2VtZW50IG9mIHRoZSBKTVAvSlNSIGhpbnQgKi8KLSNkZWZpbmUgSk1QSElOVAkJKFBBTEZOICsgMSkKLSAgeyAxNCwgMCwgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCi0gICAgQVhQX09QRVJBTkRfUkVMQVRJVkV8QVhQX09QRVJBTkRfREVGQVVMVF9aRVJPfEFYUF9PUEVSQU5EX05PT1ZFUkZMT1csCi0gICAgaW5zZXJ0X2poaW50LCBleHRyYWN0X2poaW50IH0sCi0KLSAgLyogVGhlIG9wdGlvbmFsIGhpbnQgdG8gUkVUL0pTUl9DT1JPVVRJTkUgKi8KLSNkZWZpbmUgUkVUSElOVAkJKEpNUEhJTlQgKyAxKQotICB7IDE0LCAwLCAtUkVUSElOVCwKLSAgICBBWFBfT1BFUkFORF9VTlNJR05FRHxBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk8sIDAsIDAgfSwKLQotICAvKiBUaGUgMTItYml0IGRpc3BsYWNlbWVudCBmb3IgdGhlIGV2WzQ2XSBod197bGQsc3R9IChwYWwxYi9wYWwxZikgaW5zbnMgKi8KLSNkZWZpbmUgRVY0SFdESVNQCShSRVRISU5UICsgMSkKLSNkZWZpbmUgRVY2SFdESVNQCShFVjRIV0RJU1ApCi0gIHsgMTIsIDAsIC1FVjRIV0RJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSA1LWJpdCBpbmRleCBmb3IgdGhlIGV2NCBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KLSNkZWZpbmUgRVY0SFdJTkRFWAkoRVY0SFdESVNQICsgMSkKLSAgeyA1LCAwLCAtRVY0SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgOC1iaXQgaW5kZXggZm9yIHRoZSBvZGRseSB1bnF1YWxpZmllZCBod19tW3RmXXByIGluc25zCi0gICAgIHRoYXQgb2NjdXIgaW4gREVDIFBBTGNvZGUuICAqLwotI2RlZmluZSBFVjRFWFRIV0lOREVYCShFVjRIV0lOREVYICsgMSkKLSAgeyA4LCAwLCAtRVY0RVhUSFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgMTAtYml0IGRpc3BsYWNlbWVudCBmb3IgdGhlIGV2NSBod197bGQsc3R9IChwYWwxYi9wYWwxZikgaW5zbnMgKi8KLSNkZWZpbmUgRVY1SFdESVNQCShFVjRFWFRIV0lOREVYICsgMSkKLSAgeyAxMCwgMCwgLUVWNUhXRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDE2LWJpdCBpbmRleCBmb3IgdGhlIGV2NSBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KLSNkZWZpbmUgRVY1SFdJTkRFWAkoRVY1SFdESVNQICsgMSkKLSAgeyAxNiwgMCwgLUVWNUhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDE2LWJpdCBjb21iaW5lZCBpbmRleC9zY29yZWJvYXJkIG1hc2sgZm9yIHRoZSBldjYKLSAgICAgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNkhXSU5ERVgJKEVWNUhXSU5ERVggKyAxKQotICB7IDE2LCAwLCAtRVY2SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgMTMtYml0IGJyYW5jaCBoaW50IGZvciB0aGUgZXY2IGh3X2ptcC9qc3IgKHBhbDFlKSBpbnNuICovCi0jZGVmaW5lIEVWNkhXSk1QSElOVAkoRVY2SFdJTkRFWCsgMSkKLSAgeyA4LCAwLCAtRVY2SFdKTVBISU5ULAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFfEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVST3xBWFBfT1BFUkFORF9OT09WRVJGTE9XLAotICAgIGluc2VydF9ldjZod2poaW50LCBleHRyYWN0X2V2Nmh3amhpbnQgfQotfTsKLQotY29uc3QgdW5zaWduZWQgYWxwaGFfbnVtX29wZXJhbmRzID0gc2l6ZW9mKGFscGhhX29wZXJhbmRzKS9zaXplb2YoKmFscGhhX29wZXJhbmRzKTsKLQotLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgaXMgdGhlIHNhbWUgYXMgdGhlIFJBIGZpZWxkIGluIHRoZSBzYW1lIGluc24uCi0gICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIGZha2UuICBUaGUgaW5zZXJ0aW9uIGZ1bmN0aW9uIGp1c3QgY29waWVzCi0gICB0aGUgUkEgZmllbGQgaW50byB0aGUgUkIgZmllbGQsIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0Ci0gICBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUgc2FtZS4gKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9yYmEoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF9yYmEoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoKGluc24gPj4gMTYpICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgc2FtZSBmb3IgdGhlIFJDIGZpZWxkICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfcmNhKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgKChpbnNuID4+IDIxKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3JjYShpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9IChpbnNuICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBGYWtlIGFyZ3VtZW50cyBpbiB3aGljaCB0aGUgcmVnaXN0ZXJzIG11c3QgYmUgc2V0IHRvIFpFUk8gKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgzMSA8PCAyMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfemEoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9IDMxKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfemIoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoMzEgPDwgMTYpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3piKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMICYmICgoaW5zbiA+PiAxNikgJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3pjKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgMzE7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfemMoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwgJiYgKGluc24gJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoZSBkaXNwbGFjZW1lbnQgZmllbGQgb2YgYSBCcmFuY2ggZm9ybWF0IGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9iZGlzcChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygiYnJhbmNoIG9wZXJhbmQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgxRkZGRkYpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfYmRpc3AoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4MUZGRkZGKSBeIDB4MTAwMDAwKSAtIDB4MTAwMDAwKTsKLX0KLQotCi0vKiBUaGUgaGludCBmaWVsZCBvZiBhIEpNUC9KU1IgaW5zbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X2poaW50KGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQotICAgICplcnJtc2cgPSBfKCJqdW1wIGhpbnQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgzRkZGKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1leHRyYWN0X2poaW50KGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gNCAqICgoKGluc24gJiAweDNGRkYpIF4gMHgyMDAwKSAtIDB4MjAwMCk7Ci19Ci0KLS8qIFRoZSBoaW50IGZpZWxkIG9mIGFuIEVWNiBIV19KTVAvSlNSIGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9ldjZod2poaW50KGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQotICAgICplcnJtc2cgPSBfKCJqdW1wIGhpbnQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgxRkZGKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1leHRyYWN0X2V2Nmh3amhpbnQoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4MUZGRikgXiAweDEwMDApIC0gMHgxMDAwKTsKLX0KLQotDAotLyogTWFjcm9zIHVzZWQgdG8gZm9ybSBvcGNvZGVzICovCi0KLS8qIFRoZSBtYWluIG9wY29kZSAqLwotI2RlZmluZSBPUCh4KQkJKCgoeCkgJiAweDNGKSA8PCAyNikKLSNkZWZpbmUgT1BfTUFTSwkJMHhGQzAwMDAwMAotCi0vKiBCcmFuY2ggZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBCUkFfKG9vKQlPUChvbykKLSNkZWZpbmUgQlJBX01BU0sJT1BfTUFTSwotI2RlZmluZSBCUkEob28pCQlCUkFfKG9vKSwgQlJBX01BU0sKLQotLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBGUF8ob28sZmZmKQkoT1Aob28pIHwgKCgoZmZmKSAmIDB4N0ZGKSA8PCA1KSkKLSNkZWZpbmUgRlBfTUFTSwkJKE9QX01BU0sgfCAweEZGRTApCi0jZGVmaW5lIEZQKG9vLGZmZikJRlBfKG9vLGZmZiksIEZQX01BU0sKLQotLyogTWVtb3J5IGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUVNXyhvbykJT1Aob28pCi0jZGVmaW5lIE1FTV9NQVNLCU9QX01BU0sKLSNkZWZpbmUgTUVNKG9vKQkJTUVNXyhvbyksIE1FTV9NQVNLCi0KLS8qIE1lbW9yeS9GdW5jIENvZGUgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNRkNfKG9vLGZmZmYpCShPUChvbykgfCAoKGZmZmYpICYgMHhGRkZGKSkKLSNkZWZpbmUgTUZDX01BU0sJKE9QX01BU0sgfCAweEZGRkYpCi0jZGVmaW5lIE1GQyhvbyxmZmZmKQlNRkNfKG9vLGZmZmYpLCBNRkNfTUFTSwotCi0vKiBNZW1vcnkvQnJhbmNoIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUJSXyhvbyxoKQkoT1Aob28pIHwgKCgoaCkgJiAzKSA8PCAxNCkpCi0jZGVmaW5lIE1CUl9NQVNLCShPUF9NQVNLIHwgMHhDMDAwKQotI2RlZmluZSBNQlIob28saCkJTUJSXyhvbyxoKSwgTUJSX01BU0sKLQotLyogT3BlcmF0ZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zLiAgVGhlIE9QUkwgdmFyaWFudCBzcGVjaWZpZXMgYQotICAgbGl0ZXJhbCBzZWNvbmQgYXJndW1lbnQuICovCi0jZGVmaW5lIE9QUl8ob28sZmYpCShPUChvbykgfCAoKChmZikgJiAweDdGKSA8PCA1KSkKLSNkZWZpbmUgT1BSTF8ob28sZmYpCShPUFJfKChvbyksKGZmKSkgfCAweDEwMDApCi0jZGVmaW5lIE9QUl9NQVNLCShPUF9NQVNLIHwgMHgxRkUwKQotI2RlZmluZSBPUFIob28sZmYpCU9QUl8ob28sZmYpLCBPUFJfTUFTSwotI2RlZmluZSBPUFJMKG9vLGZmKQlPUFJMXyhvbyxmZiksIE9QUl9NQVNLCi0KLS8qIEdlbmVyaWMgUEFMY29kZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFBDRF8ob28pCU9QKG9vKQotI2RlZmluZSBQQ0RfTUFTSwlPUF9NQVNLCi0jZGVmaW5lIFBDRChvbykJCVBDRF8ob28pLCBQQ0RfTUFTSwotCi0vKiBTcGVjaWZpYyBQQUxjb2RlIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTUENEXyhvbyxmZmZmKQkoT1Aob28pIHwgKChmZmZmKSAmIDB4M0ZGRkZGRikpCi0jZGVmaW5lIFNQQ0RfTUFTSwkweEZGRkZGRkZGCi0jZGVmaW5lIFNQQ0Qob28sZmZmZikJU1BDRF8ob28sZmZmZiksIFNQQ0RfTUFTSwotCi0vKiBIYXJkd2FyZSBtZW1vcnkgKGh3X3tsZCxzdH0pIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBFVjRIV01FTV8ob28sZikJKE9QKG9vKSB8ICgoKGYpICYgMHhGKSA8PCAxMikpCi0jZGVmaW5lIEVWNEhXTUVNX01BU0sJKE9QX01BU0sgfCAweEYwMDApCi0jZGVmaW5lIEVWNEhXTUVNKG9vLGYpCUVWNEhXTUVNXyhvbyxmKSwgRVY0SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNUhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweDNGKSA8PCAxMCkpCi0jZGVmaW5lIEVWNUhXTUVNX01BU0sJKE9QX01BU0sgfCAweEY4MDApCi0jZGVmaW5lIEVWNUhXTUVNKG9vLGYpCUVWNUhXTUVNXyhvbyxmKSwgRVY1SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNkhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweEYpIDw8IDEyKSkKLSNkZWZpbmUgRVY2SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjAwMCkKLSNkZWZpbmUgRVY2SFdNRU0ob28sZikJRVY2SFdNRU1fKG9vLGYpLCBFVjZIV01FTV9NQVNLCi0KLSNkZWZpbmUgRVY2SFdNQlJfKG9vLGgpCShPUChvbykgfCAoKChoKSAmIDcpIDw8IDEzKSkKLSNkZWZpbmUgRVY2SFdNQlJfTUFTSwkoT1BfTUFTSyB8IDB4RTAwMCkKLSNkZWZpbmUgRVY2SFdNQlIob28saCkJRVY2SFdNQlJfKG9vLGgpLCBFVjZIV01CUl9NQVNLCi0KLS8qIEFiYnJldmlhdGlvbnMgZm9yIGluc3RydWN0aW9uIHN1YnNldHMuICAqLwotI2RlZmluZSBCQVNFCQkJQVhQX09QQ09ERV9CQVNFCi0jZGVmaW5lIEVWNAkJCUFYUF9PUENPREVfRVY0Ci0jZGVmaW5lIEVWNQkJCUFYUF9PUENPREVfRVY1Ci0jZGVmaW5lIEVWNgkJCUFYUF9PUENPREVfRVY2Ci0jZGVmaW5lIEJXWAkJCUFYUF9PUENPREVfQldYCi0jZGVmaW5lIENJWAkJCUFYUF9PUENPREVfQ0lYCi0jZGVmaW5lIE1BWAkJCUFYUF9PUENPREVfTUFYCi0KLS8qIENvbW1vbiBjb21iaW5hdGlvbnMgb2YgYXJndW1lbnRzICovCi0jZGVmaW5lIEFSR19OT05FCQl7IDAgfQotI2RlZmluZSBBUkdfQlJBCQkJeyBSQSwgQkRJU1AgfQotI2RlZmluZSBBUkdfRkJSQQkJeyBGQSwgQkRJU1AgfQotI2RlZmluZSBBUkdfRlAJCQl7IEZBLCBGQiwgREZDMSB9Ci0jZGVmaW5lIEFSR19GUFoxCQl7IFpBLCBGQiwgREZDMSB9Ci0jZGVmaW5lIEFSR19NRU0JCQl7IFJBLCBNRElTUCwgUFJCIH0KLSNkZWZpbmUgQVJHX0ZNRU0JCXsgRkEsIE1ESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfT1BSCQkJeyBSQSwgUkIsIERSQzEgfQotI2RlZmluZSBBUkdfT1BSTAkJeyBSQSwgTElULCBEUkMxIH0KLSNkZWZpbmUgQVJHX09QUloxCQl7IFpBLCBSQiwgRFJDMSB9Ci0jZGVmaW5lIEFSR19PUFJMWjEJCXsgWkEsIExJVCwgUkMgfQotI2RlZmluZSBBUkdfUENECQkJeyBQQUxGTiB9Ci0jZGVmaW5lIEFSR19FVjRIV01FTQkJeyBSQSwgRVY0SFdESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRVY0SFdNUFIJCXsgUkEsIFJCQSwgRVY0SFdJTkRFWCB9Ci0jZGVmaW5lIEFSR19FVjVIV01FTQkJeyBSQSwgRVY1SFdESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRVY2SFdNRU0JCXsgUkEsIEVWNkhXRElTUCwgUFJCIH0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRSBPUENPREUgTUFTSyB7IE9QRVJBTkRTIH0KLQotICAgTkFNRQkJaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotCi0gICBPUENPREUJaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLQotICAgTUFTSwkJaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgICAgICAgICAJd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLQotICAgT1BFUkFORFMJaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBwcmVjZWRpbmcgbWFjcm9zIG1lcmdlIHRoZSB0ZXh0IG9mIHRoZSBPUENPREUgYW5kIE1BU0sgZmllbGRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4KLQotICAgT3RoZXJ3aXNlLCBpdCBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIGFuZCBtaW5vciBmdW5jdGlvbiBjb2RlLgotCi0gICBUaGVyZSBhcmUgdGhyZWUgY2xhc3NlcyBvZiBub3QtcmVhbGx5LWluc3RydWN0aW9ucyBpbiB0aGlzIHRhYmxlOgotCi0gICBBTElBUwlpcyBhbm90aGVyIG5hbWUgZm9yIGFub3RoZXIgaW5zdHJ1Y3Rpb24uICBTb21lIG9mCi0JCXRoZXNlIGNvbWUgZnJvbSB0aGUgQXJjaGl0ZWN0dXJlIEhhbmRib29rLCBzb21lCi0JCWNvbWUgZnJvbSB0aGUgb3JpZ2luYWwgZ2FzIG9wY29kZSB0YWJsZXMuICBJbiBhbGwKLQkJY2FzZXMsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBvcGNvZGUgaXMgdW5jaGFuZ2VkLgotCi0gICBQU0VVRE8JYSBzdHlsaXplZCBjb2RlIGZvcm0gZW5kb3JzZWQgYnkgQ2hhcHRlciBBLjQgb2YgdGhlCi0JCUFyY2hpdGVjdHVyZSBIYW5kYm9vay4KLQotICAgRVhUUkEJYSBzdHlsaXplZCBjb2RlIGZvcm0gZm91bmQgaW4gdGhlIG9yaWdpbmFsIGdhcyB0YWJsZXMuCi0KLSAgIEFuZCB0d28gYW5ub3RhdGlvbnM6Ci0KLSAgIEVWNTYgQlVUCW9wY29kZXMgdGhhdCBhcmUgb2ZmaWNpYWxseSBpbnRyb2R1Y2VkIGFzIG9mIHRoZSBldjU2LAotICAgCQlidXQgd2l0aCBkZWZpbmVkIHJlc3VsdHMgb24gcHJldmlvdXMgaW1wbGVtZW50YXRpb25zLgotCi0gICBFVjU2IFVOQQlvcGNvZGVzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGFzIG9mIHRoZSBldjU2IHdpdGgKLSAgIAkJcHJlc3VtYWJseSB1bmRlZmluZWQgcmVzdWx0cyBvbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMKLQkJdGhhdCB3ZXJlIG5vdCBhc3NpZ25lZCB0byBhIHBhcnRpY3VsYXIgZXh0ZW5zaW9uLgotKi8KLQotY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSBhbHBoYV9vcGNvZGVzW10gPSB7Ci0gIHsgImhhbHQiLAkJU1BDRCgweDAwLDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImRyYWluYSIsCQlTUENEKDB4MDAsMHgwMDAyKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiYnB0IiwJCVNQQ0QoMHgwMCwweDAwODApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjYWxsc3lzIiwJCVNQQ0QoMHgwMCwweDAwODMpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjaG1rIiwgCQlTUENEKDB4MDAsMHgwMDgzKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiaW1iIiwJCVNQQ0QoMHgwMCwweDAwODYpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjYWxsX3BhbCIsCQlQQ0QoMHgwMCksIEJBU0UsIEFSR19QQ0QgfSwKLSAgeyAicGFsIiwJCVBDRCgweDAwKSwgQkFTRSwgQVJHX1BDRCB9LAkJLyogYWxpYXMgKi8KLQotICB7ICJsZGEiLAkJTUVNKDB4MDgpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkYWgiLAkJTUVNKDB4MDkpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkYnUiLAkJTUVNKDB4MEEpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAidW5vcCIsCQlNRU0oMHgwQiksIEJBU0UsIHsgWkEgfSB9LAkJLyogcHNldWRvICovCi0gIHsgImxkcV91IiwJCU1FTSgweDBCKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZHd1IiwJCU1FTSgweDBDKSwgQldYLCBBUkdfTUVNIH0sCi0gIHsgInN0dyIsCQlNRU0oMHgwRCksIEJXWCwgQVJHX01FTSB9LAotICB7ICJzdGIiLAkJTUVNKDB4MEUpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAic3RxX3UiLAkJTUVNKDB4MEYpLCBCQVNFLCBBUkdfTUVNIH0sCi0KLSAgeyAic2V4dGwiLAkJT1BSKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic2V4dGwiLAkJT1BSTCgweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJhZGRsIiwJCU9QUigweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZGwiLAkJT1BSTCgweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNGFkZGwiLAkJT1BSKDB4MTAsMHgwMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRhZGRsIiwJCU9QUkwoMHgxMCwweDAyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVnbCIsCQlPUFIoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdsIiwJCU9QUkwoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VibCIsCQlPUFIoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJsIiwJCU9QUkwoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczRzdWJsIiwJCU9QUigweDEwLDB4MEIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM0c3VibCIsCQlPUFJMKDB4MTAsMHgwQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGJnZSIsCQlPUFIoMHgxMCwweDBGKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBiZ2UiLAkJT1BSTCgweDEwLDB4MEYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOGFkZGwiLAkJT1BSKDB4MTAsMHgxMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhhZGRsIiwJCU9QUkwoMHgxMCwweDEyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhzdWJsIiwJCU9QUigweDEwLDB4MUIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4c3VibCIsCQlPUFJMKDB4MTAsMHgxQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcHVsdCIsCQlPUFIoMHgxMCwweDFEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXB1bHQiLAkJT1BSTCgweDEwLDB4MUQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRxIiwJCU9QUigweDEwLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZHEiLAkJT1BSTCgweDEwLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNGFkZHEiLAkJT1BSKDB4MTAsMHgyMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRhZGRxIiwJCU9QUkwoMHgxMCwweDIyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVncSIsIAkJT1BSKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVncSIsIAkJT1BSTCgweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJxIiwJCU9QUigweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YnEiLAkJT1BSTCgweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNHN1YnEiLAkJT1BSKDB4MTAsMHgyQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRzdWJxIiwJCU9QUkwoMHgxMCwweDJCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wZXEiLAkJT1BSKDB4MTAsMHgyRCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wZXEiLAkJT1BSTCgweDEwLDB4MkQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOGFkZHEiLAkJT1BSKDB4MTAsMHgzMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhhZGRxIiwJCU9QUkwoMHgxMCwweDMyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhzdWJxIiwJCU9QUigweDEwLDB4M0IpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4c3VicSIsCQlPUFJMKDB4MTAsMHgzQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcHVsZSIsCQlPUFIoMHgxMCwweDNEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXB1bGUiLAkJT1BSTCgweDEwLDB4M0QpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRsL3YiLAkJT1BSKDB4MTAsMHg0MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkbC92IiwJCU9QUkwoMHgxMCwweDQwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVnbC92IiwJCU9QUigweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5lZ2wvdiIsCQlPUFJMKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmwvdiIsCQlPUFIoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJsL3YiLAkJT1BSTCgweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXBsdCIsCQlPUFIoMHgxMCwweDREKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBsdCIsCQlPUFJMKDB4MTAsMHg0RCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFkZHEvdiIsCQlPUFIoMHgxMCwweDYwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhZGRxL3YiLAkJT1BSTCgweDEwLDB4NjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdxL3YiLAkJT1BSKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVncS92IiwJCU9QUkwoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicS92IiwJCU9QUigweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YnEvdiIsCQlPUFJMKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGxlIiwJCU9QUigweDEwLDB4NkQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGxlIiwJCU9QUkwoMHgxMCwweDZEKSwgQkFTRSwgQVJHX09QUkwgfSwKLQotICB7ICJhbmQiLAkJT1BSKDB4MTEsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYW5kIiwJCU9QUkwoMHgxMSwweDAwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiYW5kbm90IiwJCU9QUigweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSIH0sCS8qIGFsaWFzICovCi0gIHsgImFuZG5vdCIsCQlPUFJMKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImJpYyIsCQlPUFIoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJiaWMiLAkJT1BSTCgweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bGJzIiwJCU9QUigweDExLDB4MTQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsYnMiLAkJT1BSTCgweDExLDB4MTQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bGJjIiwJCU9QUigweDExLDB4MTYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsYmMiLAkJT1BSTCgweDExLDB4MTYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJub3AiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFpCLCBaQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJjbHIiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFpCLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFJCLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgUkEsIFJCQSwgUkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAibW92IiwJCU9QUkwoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgTElULCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJvciIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAkvKiBhbGlhcyAqLwotICB7ICJvciIsCQlPUFJMKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImJpcyIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJiaXMiLAkJT1BSTCgweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92ZXEiLAkJT1BSKDB4MTEsMHgyNCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmVxIiwJCU9QUkwoMHgxMSwweDI0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdm5lIiwJCU9QUigweDExLDB4MjYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZuZSIsCQlPUFJMKDB4MTEsMHgyNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5vdCIsCQlPUFIoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJub3QiLAkJT1BSTCgweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJvcm5vdCIsCQlPUFIoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJvcm5vdCIsCQlPUFJMKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInhvciIsCQlPUFIoMHgxMSwweDQwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ4b3IiLAkJT1BSTCgweDExLDB4NDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bHQiLAkJT1BSKDB4MTEsMHg0NCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmx0IiwJCU9QUkwoMHgxMSwweDQ0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmdlIiwJCU9QUigweDExLDB4NDYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZnZSIsCQlPUFJMKDB4MTEsMHg0NiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImVxdiIsCQlPUFIoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJlcXYiLAkJT1BSTCgweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ4b3Jub3QiLAkJT1BSKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFIgfSwJLyogYWxpYXMgKi8KLSAgeyAieG9ybm90IiwJCU9QUkwoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KLSAgeyAiYW1hc2siLAkJT1BSKDB4MTEsMHg2MSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBldjU2IGJ1dCAqLwotICB7ICJhbWFzayIsCQlPUFJMKDB4MTEsMHg2MSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogZXY1NiBidXQgKi8KLSAgeyAiY21vdmxlIiwJCU9QUigweDExLDB4NjQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsZSIsCQlPUFJMKDB4MTEsMHg2NCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZndCIsCQlPUFIoMHgxMSwweDY2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92Z3QiLAkJT1BSTCgweDExLDB4NjYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbXBsdmVyIiwJCU9QUkxfKDB4MTEsMHg2Qyl8KDMxPDwyMSl8KDE8PDEzKSwKLSAgICAJCQkweEZGRkZGRkUwLCBCQVNFLCB7IFJDIH0gfSwJCS8qIGV2NTYgYnV0ICovCi0KLSAgeyAibXNrYmwiLAkJT1BSKDB4MTIsMHgwMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrYmwiLAkJT1BSTCgweDEyLDB4MDIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRibCIsCQlPUFIoMHgxMiwweDA2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRibCIsCQlPUFJMKDB4MTIsMHgwNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2JsIiwJCU9QUigweDEyLDB4MEIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2JsIiwJCU9QUkwoMHgxMiwweDBCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrd2wiLAkJT1BSKDB4MTIsMHgxMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrd2wiLAkJT1BSTCgweDEyLDB4MTIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHR3bCIsCQlPUFIoMHgxMiwweDE2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHR3bCIsCQlPUFJMKDB4MTIsMHgxNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3dsIiwJCU9QUigweDEyLDB4MUIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3dsIiwJCU9QUkwoMHgxMiwweDFCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrbGwiLAkJT1BSKDB4MTIsMHgyMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrbGwiLAkJT1BSTCgweDEyLDB4MjIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRsbCIsCQlPUFIoMHgxMiwweDI2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRsbCIsCQlPUFJMKDB4MTIsMHgyNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2xsIiwJCU9QUigweDEyLDB4MkIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2xsIiwJCU9QUkwoMHgxMiwweDJCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiemFwIiwJCU9QUigweDEyLDB4MzApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInphcCIsCQlPUFJMKDB4MTIsMHgzMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInphcG5vdCIsCQlPUFIoMHgxMiwweDMxKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ6YXBub3QiLAkJT1BSTCgweDEyLDB4MzEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2txbCIsCQlPUFIoMHgxMiwweDMyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2txbCIsCQlPUFJMKDB4MTIsMHgzMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNybCIsCQlPUFIoMHgxMiwweDM0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzcmwiLAkJT1BSTCgweDEyLDB4MzQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRxbCIsCQlPUFIoMHgxMiwweDM2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRxbCIsCQlPUFJMKDB4MTIsMHgzNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNsbCIsCQlPUFIoMHgxMiwweDM5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzbGwiLAkJT1BSTCgweDEyLDB4MzkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnNxbCIsCQlPUFIoMHgxMiwweDNCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnNxbCIsCQlPUFJMKDB4MTIsMHgzQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNyYSIsCQlPUFIoMHgxMiwweDNDKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzcmEiLAkJT1BSTCgweDEyLDB4M0MpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2t3aCIsCQlPUFIoMHgxMiwweDUyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2t3aCIsCQlPUFJMKDB4MTIsMHg1MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3doIiwJCU9QUigweDEyLDB4NTcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3doIiwJCU9QUkwoMHgxMiwweDU3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0d2giLAkJT1BSKDB4MTIsMHg1QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0d2giLAkJT1BSTCgweDEyLDB4NUEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2tsaCIsCQlPUFIoMHgxMiwweDYyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2tsaCIsCQlPUFJMKDB4MTIsMHg2MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2xoIiwJCU9QUigweDEyLDB4NjcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2xoIiwJCU9QUkwoMHgxMiwweDY3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0bGgiLAkJT1BSKDB4MTIsMHg2QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0bGgiLAkJT1BSTCgweDEyLDB4NkEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2txaCIsCQlPUFIoMHgxMiwweDcyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2txaCIsCQlPUFJMKDB4MTIsMHg3MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3FoIiwJCU9QUigweDEyLDB4NzcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3FoIiwJCU9QUkwoMHgxMiwweDc3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0cWgiLAkJT1BSKDB4MTIsMHg3QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0cWgiLAkJT1BSTCgweDEyLDB4N0EpLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgIm11bGwiLAkJT1BSKDB4MTMsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVsbCIsCQlPUFJMKDB4MTMsMHgwMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bHEiLAkJT1BSKDB4MTMsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVscSIsCQlPUFJMKDB4MTMsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInVtdWxoIiwJCU9QUigweDEzLDB4MzApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInVtdWxoIiwJCU9QUkwoMHgxMywweDMwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXVsbC92IiwJCU9QUigweDEzLDB4NDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm11bGwvdiIsCQlPUFJMKDB4MTMsMHg0MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bHEvdiIsCQlPUFIoMHgxMywweDYwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxxL3YiLAkJT1BSTCgweDEzLDB4NjApLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgIml0b2ZzIiwJCUZQKDB4MTQsMHgwMDQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCi0gIHsgInNxcnRmL2MiLAkJRlAoMHgxNCwweDAwQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvYyIsCQlGUCgweDE0LDB4MDBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJpdG9mZiIsCQlGUCgweDE0LDB4MDE0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJpdG9mdCIsCQlGUCgweDE0LDB4MDI0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJzcXJ0Zy9jIiwJCUZQKDB4MTQsMHgwMkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L2MiLAkJRlAoMHgxNCwweDAyQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvbSIsCQlGUCgweDE0LDB4MDRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9tIiwJCUZQKDB4MTQsMHgwNkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmIiwJCUZQKDB4MTQsMHgwOEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzIiwJCUZQKDB4MTQsMHgwOEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnIiwJCUZQKDB4MTQsMHgwQUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0IiwJCUZQKDB4MTQsMHgwQUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL2QiLAkJRlAoMHgxNCwweDBDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvZCIsCQlGUCgweDE0LDB4MEVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi91YyIsCQlGUCgweDE0LDB4MTBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91YyIsCQlGUCgweDE0LDB4MTBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy91YyIsCQlGUCgweDE0LDB4MTJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91YyIsCQlGUCgweDE0LDB4MTJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91bSIsCQlGUCgweDE0LDB4MTRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91bSIsCQlGUCgweDE0LDB4MTZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi91IiwJCUZQKDB4MTQsMHgxOEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3UiLAkJRlAoMHgxNCwweDE4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvdSIsCQlGUCgweDE0LDB4MUFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91IiwJCUZQKDB4MTQsMHgxQUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3VkIiwJCUZQKDB4MTQsMHgxQ0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3VkIiwJCUZQKDB4MTQsMHgxRUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3NjIiwJCUZQKDB4MTQsMHg0MEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3NjIiwJCUZQKDB4MTQsMHg0MkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3MiLAkJRlAoMHgxNCwweDQ4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvcyIsCQlGUCgweDE0LDB4NEFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zdWMiLAlGUCgweDE0LDB4NTBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWMiLAlGUCgweDE0LDB4NTBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zdWMiLAlGUCgweDE0LDB4NTJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWMiLAlGUCgweDE0LDB4NTJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdW0iLAlGUCgweDE0LDB4NTRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdW0iLAlGUCgweDE0LDB4NTZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zdSIsCQlGUCgweDE0LDB4NThBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdSIsCQlGUCgweDE0LDB4NThCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zdSIsCQlGUCgweDE0LDB4NUFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdSIsCQlGUCgweDE0LDB4NUFCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWQiLAlGUCgweDE0LDB4NUNCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWQiLAlGUCgweDE0LDB4NUVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWljIiwJRlAoMHgxNCwweDcwQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpYyIsCUZQKDB4MTQsMHg3MkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1aW0iLAlGUCgweDE0LDB4NzRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWltIiwJRlAoMHgxNCwweDc2QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpIiwJRlAoMHgxNCwweDc4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpIiwJRlAoMHgxNCwweDdBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpZCIsCUZQKDB4MTQsMHg3Q0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1aWQiLAlGUCgweDE0LDB4N0VCKSwgQ0lYLCBBUkdfRlBaMSB9LAotCi0gIHsgImFkZGYvYyIsCQlGUCgweDE1LDB4MDAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvYyIsCQlGUCgweDE1LDB4MDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvYyIsCQlGUCgweDE1LDB4MDAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvYyIsCQlGUCgweDE1LDB4MDAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL2MiLAkJRlAoMHgxNSwweDAxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvYyIsCQlGUCgweDE1LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmcvYyIsCQlGUCgweDE1LDB4MDIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvYyIsCQlGUCgweDE1LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvYyIsCQlGUCgweDE1LDB4MDIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL2MiLAkJRlAoMHgxNSwweDAyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL2MiLAkJRlAoMHgxNSwweDAyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL2MiLAkJRlAoMHgxNSwweDAyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFmL2MiLAkJRlAoMHgxNSwweDAzQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFnL2MiLAkJRlAoMHgxNSwweDAzRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYiLAkJRlAoMHgxNSwweDA4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdmIiwJCUZQKDB4MTUsMHgwODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZiIsCQlGUCgweDE1LDB4MDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYiLAkJRlAoMHgxNSwweDA4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmIiwJCUZQKDB4MTUsMHgwODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGciLAkJRlAoMHgxNSwweDA5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGciLAkJRlAoMHgxNSwweDBBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdnIiwJCUZQKDB4MTUsMHgwQTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZyIsCQlGUCgweDE1LDB4MEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGciLAkJRlAoMHgxNSwweDBBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnIiwJCUZQKDB4MTUsMHgwQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2VxIiwJCUZQKDB4MTUsMHgwQTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2x0IiwJCUZQKDB4MTUsMHgwQTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2xlIiwJCUZQKDB4MTUsMHgwQTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YiLAkJRlAoMHgxNSwweDBBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkIiwJCUZQKDB4MTUsMHgwQUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncSIsCQlGUCgweDE1LDB4MEFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWYiLAkJRlAoMHgxNSwweDBCQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFnIiwJCUZQKDB4MTUsMHgwQkUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3VjIiwJCUZQKDB4MTUsMHgxMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi91YyIsCQlGUCgweDE1LDB4MTAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvdWMiLAkJRlAoMHgxNSwweDEwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3VjIiwJCUZQKDB4MTUsMHgxMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvdWMiLAkJRlAoMHgxNSwweDExRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvdWMiLAkJRlAoMHgxNSwweDEyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3VjIiwJCUZQKDB4MTUsMHgxMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy91YyIsCQlGUCgweDE1LDB4MTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvdWMiLAkJRlAoMHgxNSwweDEyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi91YyIsCQlGUCgweDE1LDB4MTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QvdWMiLAkJRlAoMHgxNSwweDEyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3ZjIiwJCUZQKDB4MTUsMHgxMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3UiLAkJRlAoMHgxNSwweDE4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3UiLAkJRlAoMHgxNSwweDE4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3UiLAkJRlAoMHgxNSwweDE4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3UiLAkJRlAoMHgxNSwweDE4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy91IiwJCUZQKDB4MTUsMHgxOUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3UiLAkJRlAoMHgxNSwweDFBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3UiLAkJRlAoMHgxNSwweDFBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3UiLAkJRlAoMHgxNSwweDFBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3UiLAkJRlAoMHgxNSwweDFBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi91IiwJCUZQKDB4MTUsMHgxQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC91IiwJCUZQKDB4MTUsMHgxQUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS92IiwJCUZQKDB4MTUsMHgxQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3NjIiwJCUZQKDB4MTUsMHg0MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9zYyIsCQlGUCgweDE1LDB4NDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvc2MiLAkJRlAoMHgxNSwweDQwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3NjIiwJCUZQKDB4MTUsMHg0MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvc2MiLAkJRlAoMHgxNSwweDQxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvc2MiLAkJRlAoMHgxNSwweDQyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3NjIiwJCUZQKDB4MTUsMHg0MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zYyIsCQlGUCgweDE1LDB4NDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvc2MiLAkJRlAoMHgxNSwweDQyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zYyIsCQlGUCgweDE1LDB4NDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2Qvc2MiLAkJRlAoMHgxNSwweDQyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3NjIiwJCUZQKDB4MTUsMHg0MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3MiLAkJRlAoMHgxNSwweDQ4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdmL3MiLAkJRlAoMHgxNSwweDQ4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJmL3MiLAkJRlAoMHgxNSwweDQ4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3MiLAkJRlAoMHgxNSwweDQ4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3MiLAkJRlAoMHgxNSwweDQ4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zIiwJCUZQKDB4MTUsMHg0OUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3MiLAkJRlAoMHgxNSwweDRBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdnL3MiLAkJRlAoMHgxNSwweDRBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJnL3MiLAkJRlAoMHgxNSwweDRBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3MiLAkJRlAoMHgxNSwweDRBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3MiLAkJRlAoMHgxNSwweDRBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnZXEvcyIsCQlGUCgweDE1LDB4NEE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdsdC9zIiwJCUZQKDB4MTUsMHg0QTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2xlL3MiLAkJRlAoMHgxNSwweDRBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zIiwJCUZQKDB4MTUsMHg0QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zIiwJCUZQKDB4MTUsMHg0QUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zIiwJCUZQKDB4MTUsMHg0QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3N1YyIsCQlGUCgweDE1LDB4NTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvc3VjIiwJCUZQKDB4MTUsMHg1MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zdWMiLAkJRlAoMHgxNSwweDUwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3N1YyIsCQlGUCgweDE1LDB4NTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3N1YyIsCUZQKDB4MTUsMHg1MUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3N1YyIsCQlGUCgweDE1LDB4NTIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc3VjIiwJCUZQKDB4MTUsMHg1MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zdWMiLAkJRlAoMHgxNSwweDUyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3N1YyIsCQlGUCgweDE1LDB4NTIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3N1YyIsCUZQKDB4MTUsMHg1MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zdWMiLAlGUCgweDE1LDB4NTJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc3ZjIiwJRlAoMHgxNSwweDUyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvc3UiLAkJRlAoMHgxNSwweDU4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3N1IiwJCUZQKDB4MTUsMHg1ODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zdSIsCQlGUCgweDE1LDB4NTgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvc3UiLAkJRlAoMHgxNSwweDU4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zdSIsCQlGUCgweDE1LDB4NTlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9zdSIsCQlGUCgweDE1LDB4NUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc3UiLAkJRlAoMHgxNSwweDVBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3N1IiwJCUZQKDB4MTUsMHg1QTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9zdSIsCQlGUCgweDE1LDB4NUEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3N1IiwJCUZQKDB4MTUsMHg1QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zdSIsCQlGUCgweDE1LDB4NUFEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc3YiLAkJRlAoMHgxNSwweDVBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAiYWRkcy9jIiwJCUZQKDB4MTYsMHgwMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9jIiwJCUZQKDB4MTYsMHgwMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9jIiwJCUZQKDB4MTYsMHgwMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9jIiwJCUZQKDB4MTYsMHgwMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9jIiwJCUZQKDB4MTYsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9jIiwJCUZQKDB4MTYsMHgwMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9jIiwJCUZQKDB4MTYsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9jIiwJCUZQKDB4MTYsMHgwMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvYyIsCQlGUCgweDE2LDB4MDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvYyIsCQlGUCgweDE2LDB4MDJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvYyIsCQlGUCgweDE2LDB4MDNDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvYyIsCQlGUCgweDE2LDB4MDNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9tIiwJCUZQKDB4MTYsMHgwNDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9tIiwJCUZQKDB4MTYsMHgwNDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9tIiwJCUZQKDB4MTYsMHgwNDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9tIiwJCUZQKDB4MTYsMHgwNDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9tIiwJCUZQKDB4MTYsMHgwNjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9tIiwJCUZQKDB4MTYsMHgwNjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9tIiwJCUZQKDB4MTYsMHgwNjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9tIiwJCUZQKDB4MTYsMHgwNjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvbSIsCQlGUCgweDE2LDB4MDZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvbSIsCQlGUCgweDE2LDB4MDZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvbSIsCQlGUCgweDE2LDB4MDdDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvbSIsCQlGUCgweDE2LDB4MDdFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcyIsCQlGUCgweDE2LDB4MDgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3MiLCAJCUZQKDB4MTYsMHgwODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicyIsCQlGUCgweDE2LDB4MDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMiLAkJRlAoMHgxNiwweDA4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzIiwJCUZQKDB4MTYsMHgwODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdCIsCQlGUCgweDE2LDB4MEEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3QiLCAJCUZQKDB4MTYsMHgwQTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidCIsCQlGUCgweDE2LDB4MEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQiLAkJRlAoMHgxNiwweDBBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0IiwJCUZQKDB4MTYsMHgwQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdHVuIiwJCUZQKDB4MTYsMHgwQTQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGVxIiwJCUZQKDB4MTYsMHgwQTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGx0IiwJCUZQKDB4MTYsMHgwQTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGxlIiwJCUZQKDB4MTYsMHgwQTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMiLAkJRlAoMHgxNiwweDBBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxIiwJCUZQKDB4MTYsMHgwQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcyIsCQlGUCgweDE2LDB4MEJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQiLAkJRlAoMHgxNiwweDBCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvZCIsCQlGUCgweDE2LDB4MEMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvZCIsCQlGUCgweDE2LDB4MEMxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvZCIsCQlGUCgweDE2LDB4MEMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvZCIsCQlGUCgweDE2LDB4MEMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvZCIsCQlGUCgweDE2LDB4MEUwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvZCIsCQlGUCgweDE2LDB4MEUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvZCIsCQlGUCgweDE2LDB4MEUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvZCIsCQlGUCgweDE2LDB4MEUzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL2QiLAkJRlAoMHgxNiwweDBFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL2QiLAkJRlAoMHgxNiwweDBFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL2QiLAkJRlAoMHgxNiwweDBGQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L2QiLAkJRlAoMHgxNiwweDBGRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvdWMiLAkJRlAoMHgxNiwweDEwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3VjIiwJCUZQKDB4MTYsMHgxMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91YyIsCQlGUCgweDE2LDB4MTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvdWMiLAkJRlAoMHgxNiwweDEwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3VjIiwJCUZQKDB4MTYsMHgxMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91YyIsCQlGUCgweDE2LDB4MTIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvdWMiLAkJRlAoMHgxNiwweDEyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3VjIiwJCUZQKDB4MTYsMHgxMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdWMiLAkJRlAoMHgxNiwweDEyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3ZjIiwJCUZQKDB4MTYsMHgxMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3VtIiwJCUZQKDB4MTYsMHgxNDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91bSIsCQlGUCgweDE2LDB4MTQxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvdW0iLAkJRlAoMHgxNiwweDE0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3VtIiwJCUZQKDB4MTYsMHgxNDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91bSIsCQlGUCgweDE2LDB4MTYwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvdW0iLAkJRlAoMHgxNiwweDE2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3VtIiwJCUZQKDB4MTYsMHgxNjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91bSIsCQlGUCgweDE2LDB4MTYzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3VtIiwJCUZQKDB4MTYsMHgxNkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92bSIsCQlGUCgweDE2LDB4MTZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91IiwJCUZQKDB4MTYsMHgxODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91IiwJCUZQKDB4MTYsMHgxODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91IiwJCUZQKDB4MTYsMHgxODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91IiwJCUZQKDB4MTYsMHgxODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91IiwJCUZQKDB4MTYsMHgxQTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91IiwJCUZQKDB4MTYsMHgxQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91IiwJCUZQKDB4MTYsMHgxQTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91IiwJCUZQKDB4MTYsMHgxQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdSIsCQlGUCgweDE2LDB4MUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdiIsCQlGUCgweDE2LDB4MUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91ZCIsCQlGUCgweDE2LDB4MUMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvdWQiLAkJRlAoMHgxNiwweDFDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3VkIiwJCUZQKDB4MTYsMHgxQzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91ZCIsCQlGUCgweDE2LDB4MUMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvdWQiLAkJRlAoMHgxNiwweDFFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3VkIiwJCUZQKDB4MTYsMHgxRTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91ZCIsCQlGUCgweDE2LDB4MUUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvdWQiLAkJRlAoMHgxNiwweDFFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91ZCIsCQlGUCgweDE2LDB4MUVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdmQiLAkJRlAoMHgxNiwweDFFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHN0IiwJCUZQKDB4MTYsMHgyQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1YyIsCQlGUCgweDE2LDB4NTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VjIiwJCUZQKDB4MTYsMHg1MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWMiLAkJRlAoMHgxNiwweDUwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1YyIsCQlGUCgweDE2LDB4NTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VjIiwJCUZQKDB4MTYsMHg1MjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdWMiLAkJRlAoMHgxNiwweDUyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1YyIsCQlGUCgweDE2LDB4NTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VjIiwJCUZQKDB4MTYsMHg1MjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VjIiwJRlAoMHgxNiwweDUyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2YyIsCUZQKDB4MTYsMHg1MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1bSIsCQlGUCgweDE2LDB4NTQwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VtIiwJCUZQKDB4MTYsMHg1NDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdW0iLAkJRlAoMHgxNiwweDU0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1bSIsCQlGUCgweDE2LDB4NTQzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VtIiwJCUZQKDB4MTYsMHg1NjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdW0iLAkJRlAoMHgxNiwweDU2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1bSIsCQlGUCgweDE2LDB4NTYyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VtIiwJCUZQKDB4MTYsMHg1NjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VtIiwJRlAoMHgxNiwweDU2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2bSIsCUZQKDB4MTYsMHg1NkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1IiwJCUZQKDB4MTYsMHg1ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncy9zdSIsCQlGUCgweDE2LDB4NTgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnMvc3UiLAkJRlAoMHgxNiwweDU4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1IiwJCUZQKDB4MTYsMHg1ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdSIsCQlGUCgweDE2LDB4NTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3UiLAkJRlAoMHgxNiwweDVBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWd0L3N1IiwJCUZQKDB4MTYsMHg1QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidC9zdSIsCQlGUCgweDE2LDB4NUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3UiLAkJRlAoMHgxNiwweDVBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1IiwJCUZQKDB4MTYsMHg1QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdHVuL3N1IiwJRlAoMHgxNiwweDVBNCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0ZXEvc3UiLAlGUCgweDE2LDB4NUE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRsdC9zdSIsCUZQKDB4MTYsMHg1QTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGxlL3N1IiwJRlAoMHgxNiwweDVBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdSIsCQlGUCgweDE2LDB4NUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3YiLAkJRlAoMHgxNiwweDVBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VkIiwJCUZQKDB4MTYsMHg1QzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWQiLAkJRlAoMHgxNiwweDVDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1ZCIsCQlGUCgweDE2LDB4NUMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VkIiwJCUZQKDB4MTYsMHg1QzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWQiLAkJRlAoMHgxNiwweDVFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1ZCIsCQlGUCgweDE2LDB4NUUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VkIiwJCUZQKDB4MTYsMHg1RTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWQiLAkJRlAoMHgxNiwweDVFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWQiLAlGUCgweDE2LDB4NUVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZkIiwJRlAoMHgxNiwweDVFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHN0L3MiLAkJRlAoMHgxNiwweDZBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpYyIsCUZQKDB4MTYsMHg3MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWljIiwJRlAoMHgxNiwweDcwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aWMiLAlGUCgweDE2LDB4NzAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpYyIsCUZQKDB4MTYsMHg3MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWljIiwJRlAoMHgxNiwweDcyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aWMiLAlGUCgweDE2LDB4NzIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpYyIsCUZQKDB4MTYsMHg3MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWljIiwJRlAoMHgxNiwweDcyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWljIiwJRlAoMHgxNiwweDcyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aWMiLAlGUCgweDE2LDB4NzJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpYyIsCUZQKDB4MTYsMHg3M0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWljIiwJRlAoMHgxNiwweDczRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpbSIsCUZQKDB4MTYsMHg3NDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWltIiwJRlAoMHgxNiwweDc0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aW0iLAlGUCgweDE2LDB4NzQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpbSIsCUZQKDB4MTYsMHg3NDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWltIiwJRlAoMHgxNiwweDc2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aW0iLAlGUCgweDE2LDB4NzYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpbSIsCUZQKDB4MTYsMHg3NjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWltIiwJRlAoMHgxNiwweDc2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWltIiwJRlAoMHgxNiwweDc2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aW0iLAlGUCgweDE2LDB4NzZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpbSIsCUZQKDB4MTYsMHg3N0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWltIiwJRlAoMHgxNiwweDc3RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpIiwJCUZQKDB4MTYsMHg3ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncy9zdWkiLCAJRlAoMHgxNiwweDc4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJzL3N1aSIsCQlGUCgweDE2LDB4NzgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpIiwJCUZQKDB4MTYsMHg3ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWkiLAkJRlAoMHgxNiwweDc4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aSIsCQlGUCgweDE2LDB4N0EwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3Qvc3VpIiwgCUZQKDB4MTYsMHg3QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidC9zdWkiLAkJRlAoMHgxNiwweDdBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1aSIsCQlGUCgweDE2LDB4N0EyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VpIiwJCUZQKDB4MTYsMHg3QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VpIiwJRlAoMHgxNiwweDdBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aSIsCUZQKDB4MTYsMHg3QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWkiLAlGUCgweDE2LDB4N0JDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvc3VpIiwJRlAoMHgxNiwweDdCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpZCIsCUZQKDB4MTYsMHg3QzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWlkIiwJRlAoMHgxNiwweDdDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aWQiLAlGUCgweDE2LDB4N0MyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpZCIsCUZQKDB4MTYsMHg3QzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWlkIiwJRlAoMHgxNiwweDdFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aWQiLAlGUCgweDE2LDB4N0UxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpZCIsCUZQKDB4MTYsMHg3RTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWlkIiwJRlAoMHgxNiwweDdFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWlkIiwJRlAoMHgxNiwweDdFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aWQiLAlGUCgweDE2LDB4N0VGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpZCIsCUZQKDB4MTYsMHg3RkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWlkIiwJRlAoMHgxNiwweDdGRSksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAiY3Z0bHEiLAkJRlAoMHgxNywweDAxMCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImZub3AiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgWkEsIFpCLCBaQyB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJmY2xyIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCB7IFpBLCBaQiwgRkMgfSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiZmFicyIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgImZtb3YiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgRkEsIFJCQSwgRkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY3B5cyIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZuZWciLAkJRlAoMHgxNywweDAyMSksIEJBU0UsIHsgRkEsIFJCQSwgRkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY3B5c24iLAkJRlAoMHgxNywweDAyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjcHlzZSIsCQlGUCgweDE3LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm10X2ZwY3IiLAkJRlAoMHgxNywweDAyNCksIEJBU0UsIHsgRkEsIFJCQSwgUkNBIH0gfSwKLSAgeyAibWZfZnBjciIsCQlGUCgweDE3LDB4MDI1KSwgQkFTRSwgeyBGQSwgUkJBLCBSQ0EgfSB9LAotICB7ICJmY21vdmVxIiwJCUZQKDB4MTcsMHgwMkEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZuZSIsCQlGUCgweDE3LDB4MDJCKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92bHQiLAkJRlAoMHgxNywweDAyQyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdmdlIiwJCUZQKDB4MTcsMHgwMkQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZsZSIsCQlGUCgweDE3LDB4MDJFKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92Z3QiLAkJRlAoMHgxNywweDAyRiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRxbCIsCQlGUCgweDE3LDB4MDMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWwvdiIsCQlGUCgweDE3LDB4MTMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWwvc3YiLAkJRlAoMHgxNywweDUzMCksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAidHJhcGIiLAkJTUZDKDB4MTgsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiZHJhaW50IiwJCU1GQygweDE4LDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCS8qIGFsaWFzICovCi0gIHsgImV4Y2IiLAkJTUZDKDB4MTgsMHgwNDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAibWIiLAkJTUZDKDB4MTgsMHg0MDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAid21iIiwJCU1GQygweDE4LDB4NDQwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImZldGNoIiwJCU1GQygweDE4LDB4ODAwMCksIEJBU0UsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImZldGNoX20iLAkJTUZDKDB4MTgsMHhBMDAwKSwgQkFTRSwgeyBaQSwgUFJCIH0gfSwKLSAgeyAicnBjYyIsCQlNRkMoMHgxOCwweEMwMDApLCBCQVNFLCB7IFJBIH0gfSwKLSAgeyAicmMiLAkJTUZDKDB4MTgsMHhFMDAwKSwgQkFTRSwgeyBSQSB9IH0sCi0gIHsgImVjYiIsCQlNRkMoMHgxOCwweEU4MDApLCBCQVNFLCB7IFpBLCBQUkIgfSB9LAkvKiBldjU2IHVuYSAqLwotICB7ICJycyIsCQlNRkMoMHgxOCwweEYwMDApLCBCQVNFLCB7IFJBIH0gfSwKLSAgeyAid2g2NCIsCQlNRkMoMHgxOCwweEY4MDApLCBCQVNFLCB7IFpBLCBQUkIgfSB9LAkvKiBldjU2IHVuYSAqLwotCi0gIHsgImh3X21mcHIiLAkJT1BSKDB4MTksMHgwMCksIEVWNCwgeyBSQSwgUkJBLCBFVjRFWFRIV0lOREVYIH0gfSwKLSAgeyAiaHdfbWZwciIsCQlPUCgweDE5KSwgT1BfTUFTSywgRVY1LCB7IFJBLCBSQkEsIEVWNUhXSU5ERVggfSB9LAotICB7ICJod19tZnByIiwJCU9QKDB4MTkpLCBPUF9NQVNLLCBFVjYsIHsgUkEsIFpCLCBFVjZIV0lOREVYIH0gfSwKLSAgeyAiaHdfbWZwci9pIiwJT1BSKDB4MTksMHgwMSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvYSIsCU9QUigweDE5LDB4MDIpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL2FpIiwJT1BSKDB4MTksMHgwMyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcCIsCU9QUigweDE5LDB4MDQpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3BpIiwJT1BSKDB4MTksMHgwNSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcGEiLAlPUFIoMHgxOSwweDA2KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9wYWkiLAlPUFIoMHgxOSwweDA3KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAicGFsMTkiLAkJUENEKDB4MTkpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAiam1wIiwJCU1CUigweDFBLDApLCBCQVNFLCB7IFJBLCBDUFJCLCBKTVBISU5UIH0gfSwKLSAgeyAianNyIiwJCU1CUigweDFBLDEpLCBCQVNFLCB7IFJBLCBDUFJCLCBKTVBISU5UIH0gfSwKLSAgeyAicmV0IiwJCU1CUigweDFBLDIpLCBCQVNFLCB7IFJBLCBDUFJCLCBSRVRISU5UIH0gfSwKLSAgeyAiamNyIiwJCU1CUigweDFBLDMpLCBCQVNFLCB7IFJBLCBDUFJCLCBSRVRISU5UIH0gfSwgLyogYWxpYXMgKi8KLSAgeyAianNyX2Nvcm91dGluZSIsCU1CUigweDFBLDMpLCBCQVNFLCB7IFJBLCBDUFJCLCBSRVRISU5UIH0gfSwKLQotICB7ICJod19sZGwiLAkJRVY0SFdNRU0oMHgxQiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwiLAkJRVY1SFdNRU0oMHgxQiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsIiwJCUVWNkhXTUVNKDB4MUIsMHg4KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2EiLAkJRVY0SFdNRU0oMHgxQiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvYSIsCQlFVjVIV01FTSgweDFCLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYSIsCQlFVjZIV01FTSgweDFCLDB4QyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC9hbCIsCUVWNUhXTUVNKDB4MUIsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hciIsCUVWNEhXTUVNKDB4MUIsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F2IiwJRVY1SFdNRU0oMHgxQiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hd2wiLAlFVjVIV01FTSgweDFCLDB4MTkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3dmwiLAlFVjVIV01FTSgweDFCLDB4MWIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvbCIsCQlFVjVIV01FTSgweDFCLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcCIsCQlFVjRIV01FTSgweDFCLDB4OCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wIiwJCUVWNUhXTUVNKDB4MUIsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wIiwJCUVWNkhXTUVNKDB4MUIsMHgwKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhIiwJRVY0SFdNRU0oMHgxQiwweEMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcGEiLAlFVjVIV01FTSgweDFCLDB4MzApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGFsIiwJRVY1SFdNRU0oMHgxQiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhciIsCUVWNEhXTUVNKDB4MUIsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXZsIiwJRVY1SFdNRU0oMHgxQiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXdsIiwJRVY1SFdNRU0oMHgxQiwweDM5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2EpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3dmwiLAlFVjVIV01FTSgweDFCLDB4M2IpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGwiLAlFVjVIV01FTSgweDFCLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHIiLAlFVjRIV01FTSgweDFCLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wdmwiLAlFVjVIV01FTSgweDFCLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHciLAlFVjVIV01FTSgweDFCLDB4MjgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHdsIiwJRVY1SFdNRU0oMHgxQiwweDI5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDJiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3IiLAkJRVY0SFdNRU0oMHgxQiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvdiIsCQlFVjVIV01FTSgweDFCLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvdiIsCQlFVjZIV01FTSgweDFCLDB4NCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC92bCIsCUVWNUhXTUVNKDB4MUIsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93IiwJCUVWNUhXTUVNKDB4MUIsMHgwOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93IiwJCUVWNkhXTUVNKDB4MUIsMHhBKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3dhIiwJRVY2SFdNRU0oMHgxQiwweEUpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvd2wiLAlFVjVIV01FTSgweDFCLDB4MDkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvd3YiLAlFVjVIV01FTSgweDFCLDB4MGEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDBiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wiLAkJRVY1SFdNRU0oMHgxQiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYSIsCUVWNUhXTUVNKDB4MUIsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2F2IiwJRVY1SFdNRU0oMHgxQiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYXciLAlFVjVIV01FTSgweDFCLDB4MTkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wIiwJRVY1SFdNRU0oMHgxQiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcCIsCUVWNkhXTUVNKDB4MUIsMHgyKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcGEiLAlFVjVIV01FTSgweDFCLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wYXciLAlFVjVIV01FTSgweDFCLDB4MzkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcHYiLAlFVjVIV01FTSgweDFCLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3YiLAlFVjVIV01FTSgweDFCLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC93IiwJRVY1SFdNRU0oMHgxQiwweDA5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvd3YiLAlFVjVIV01FTSgweDFCLDB4MGIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEiLAkJRVY0SFdNRU0oMHgxQiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEiLAkJRVY1SFdNRU0oMHgxQiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxIiwJCUVWNkhXTUVNKDB4MUIsMHg5KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2EiLAkJRVY0SFdNRU0oMHgxQiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvYSIsCQlFVjVIV01FTSgweDFCLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYSIsCQlFVjZIV01FTSgweDFCLDB4RCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS9hbCIsCUVWNUhXTUVNKDB4MUIsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hciIsCUVWNEhXTUVNKDB4MUIsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F2IiwJRVY1SFdNRU0oMHgxQiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hd2wiLAlFVjVIV01FTSgweDFCLDB4MWQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3dmwiLAlFVjVIV01FTSgweDFCLDB4MWYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvbCIsCQlFVjVIV01FTSgweDFCLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcCIsCQlFVjRIV01FTSgweDFCLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wIiwJCUVWNUhXTUVNKDB4MUIsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wIiwJCUVWNkhXTUVNKDB4MUIsMHgxKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhIiwJRVY0SFdNRU0oMHgxQiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcGEiLAlFVjVIV01FTSgweDFCLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGFsIiwJRVY1SFdNRU0oMHgxQiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhciIsCUVWNEhXTUVNKDB4MUIsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXZsIiwJRVY1SFdNRU0oMHgxQiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXdsIiwJRVY1SFdNRU0oMHgxQiwweDNkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2UpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3dmwiLAlFVjVIV01FTSgweDFCLDB4M2YpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGwiLAlFVjVIV01FTSgweDFCLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHIiLAlFVjRIV01FTSgweDFCLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wdmwiLAlFVjVIV01FTSgweDFCLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHciLAlFVjVIV01FTSgweDFCLDB4MmMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHdsIiwJRVY1SFdNRU0oMHgxQiwweDJkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDJmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3IiLAkJRVY0SFdNRU0oMHgxQiwweDMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvdiIsCQlFVjVIV01FTSgweDFCLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvdiIsCQlFVjZIV01FTSgweDFCLDB4NSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS92bCIsCUVWNUhXTUVNKDB4MUIsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93IiwJCUVWNUhXTUVNKDB4MUIsMHgwYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93IiwJCUVWNkhXTUVNKDB4MUIsMHhCKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3dhIiwJRVY2SFdNRU0oMHgxQiwweEYpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvd2wiLAlFVjVIV01FTSgweDFCLDB4MGQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvd3YiLAlFVjVIV01FTSgweDFCLDB4MGUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDBmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wiLAkJRVY1SFdNRU0oMHgxQiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYSIsCUVWNUhXTUVNKDB4MUIsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2F2IiwJRVY1SFdNRU0oMHgxQiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYXciLAlFVjVIV01FTSgweDFCLDB4MWQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wIiwJRVY1SFdNRU0oMHgxQiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcCIsCUVWNkhXTUVNKDB4MUIsMHgzKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcGEiLAlFVjVIV01FTSgweDFCLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wYXciLAlFVjVIV01FTSgweDFCLDB4M2QpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcHYiLAlFVjVIV01FTSgweDFCLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3YiLAlFVjVIV01FTSgweDFCLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC93IiwJRVY1SFdNRU0oMHgxQiwweDBkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvd3YiLAlFVjVIV01FTSgweDFCLDB4MGYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZCIsCQlFVjRIV01FTSgweDFCLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkIiwJCUVWNUhXTUVNKDB4MUIsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2EiLAkJRVY0SFdNRU0oMHgxQiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hIiwJCUVWNUhXTUVNKDB4MUIsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FsIiwJCUVWNUhXTUVNKDB4MUIsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FxIiwJCUVWNEhXTUVNKDB4MUIsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXEiLAkJRVY1SFdNRU0oMHgxQiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXFsIiwJRVY1SFdNRU0oMHgxQiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXF2IiwJRVY1SFdNRU0oMHgxQiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXF2bCIsCUVWNUhXTUVNKDB4MUIsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FyIiwJCUVWNEhXTUVNKDB4MUIsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXJxIiwJRVY0SFdNRU0oMHgxQiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hdiIsCQlFVjVIV01FTSgweDFCLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hdmwiLAlFVjVIV01FTSgweDFCLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hdyIsCQlFVjVIV01FTSgweDFCLDB4MTgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd2wiLAlFVjVIV01FTSgweDFCLDB4MTkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3EiLAlFVjVIV01FTSgweDFCLDB4MWMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3FsIiwJRVY1SFdNRU0oMHgxQiwweDFkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxdiIsCUVWNUhXTUVNKDB4MUIsMHgxZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cXZsIiwJRVY1SFdNRU0oMHgxQiwweDFmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgxYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2wiLAkJRVY1SFdNRU0oMHgxQiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcCIsCQlFVjRIV01FTSgweDFCLDB4OCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3AiLAkJRVY1SFdNRU0oMHgxQiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGEiLAkJRVY0SFdNRU0oMHgxQiwweEMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wYSIsCQlFVjVIV01FTSgweDFCLDB4MzApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYWwiLAlFVjVIV01FTSgweDFCLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXEiLAlFVjRIV01FTSgweDFCLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcSIsCUVWNUhXTUVNKDB4MUIsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcWwiLAlFVjVIV01FTSgweDFCLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXF2IiwJRVY1SFdNRU0oMHgxQiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxdmwiLAlFVjVIV01FTSgweDFCLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXIiLAlFVjRIV01FTSgweDFCLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcnEiLAlFVjRIV01FTSgweDFCLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhdmwiLAlFVjVIV01FTSgweDFCLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXciLAlFVjVIV01FTSgweDFCLDB4MzgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdsIiwJRVY1SFdNRU0oMHgxQiwweDM5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cSIsCUVWNUhXTUVNKDB4MUIsMHgzYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3FsIiwJRVY1SFdNRU0oMHgxQiwweDNkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cXYiLAlFVjVIV01FTSgweDFCLDB4M2UpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxdmwiLAlFVjVIV01FTSgweDFCLDB4M2YpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3dmwiLAlFVjVIV01FTSgweDFCLDB4M2IpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wbCIsCQlFVjVIV01FTSgweDFCLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wcSIsCQlFVjRIV01FTSgweDFCLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BxIiwJCUVWNUhXTUVNKDB4MUIsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxbCIsCUVWNUhXTUVNKDB4MUIsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxdiIsCUVWNUhXTUVNKDB4MUIsMHgyNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxdmwiLAlFVjVIV01FTSgweDFCLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wciIsCQlFVjRIV01FTSgweDFCLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BycSIsCUVWNEhXTUVNKDB4MUIsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHYiLAkJRVY1SFdNRU0oMHgxQiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHZsIiwJRVY1SFdNRU0oMHgxQiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHciLAkJRVY1SFdNRU0oMHgxQiwweDI4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdsIiwJRVY1SFdNRU0oMHgxQiwweDI5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxIiwJRVY1SFdNRU0oMHgxQiwweDJjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxbCIsCUVWNUhXTUVNKDB4MUIsMHgyZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cXYiLAlFVjVIV01FTSgweDFCLDB4MmUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgyZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3dmwiLAlFVjVIV01FTSgweDFCLDB4MmIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9xIiwJCUVWNEhXTUVNKDB4MUIsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcSIsCQlFVjVIV01FTSgweDFCLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9xbCIsCQlFVjVIV01FTSgweDFCLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9xdiIsCQlFVjVIV01FTSgweDFCLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9xdmwiLAlFVjVIV01FTSgweDFCLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9yIiwJCUVWNEhXTUVNKDB4MUIsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcnEiLAkJRVY0SFdNRU0oMHgxQiwweDMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC92IiwJCUVWNUhXTUVNKDB4MUIsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3ZsIiwJCUVWNUhXTUVNKDB4MUIsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3ciLAkJRVY1SFdNRU0oMHgxQiwweDA4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd2wiLAkJRVY1SFdNRU0oMHgxQiwweDA5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3EiLAkJRVY1SFdNRU0oMHgxQiwweDBjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3FsIiwJRVY1SFdNRU0oMHgxQiwweDBkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3F2IiwJRVY1SFdNRU0oMHgxQiwweDBlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgwZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3d2IiwJCUVWNUhXTUVNKDB4MUIsMHgwYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3d2bCIsCUVWNUhXTUVNKDB4MUIsMHgwYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgInBhbDFiIiwJCVBDRCgweDFCKSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgInNleHRiIiwJCU9QUigweDFDLCAweDAwKSwgQldYLCBBUkdfT1BSWjEgfSwKLSAgeyAic2V4dHciLAkJT1BSKDB4MUMsIDB4MDEpLCBCV1gsIEFSR19PUFJaMSB9LAotICB7ICJjdHBvcCIsCQlPUFIoMHgxQywgMHgzMCksIENJWCwgQVJHX09QUloxIH0sCi0gIHsgInBlcnIiLAkJT1BSKDB4MUMsIDB4MzEpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAiY3RseiIsCQlPUFIoMHgxQywgMHgzMiksIENJWCwgQVJHX09QUloxIH0sCi0gIHsgImN0dHoiLAkJT1BSKDB4MUMsIDB4MzMpLCBDSVgsIEFSR19PUFJaMSB9LAotICB7ICJ1bnBrYnciLAkJT1BSKDB4MUMsIDB4MzQpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJ1bnBrYmwiLAkJT1BSKDB4MUMsIDB4MzUpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJwa3diIiwJCU9QUigweDFDLCAweDM2KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAicGtsYiIsCQlPUFIoMHgxQywgMHgzNyksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgIm1pbnNiOCIsIAkJT1BSKDB4MUMsIDB4MzgpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWluc2I4IiwgCQlPUFJMKDB4MUMsIDB4MzgpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1pbnN3NCIsIAkJT1BSKDB4MUMsIDB4MzkpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWluc3c0IiwgCQlPUFJMKDB4MUMsIDB4MzkpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1pbnViOCIsIAkJT1BSKDB4MUMsIDB4M0EpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWludWI4IiwgCQlPUFJMKDB4MUMsIDB4M0EpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1pbnV3NCIsIAkJT1BSKDB4MUMsIDB4M0IpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWludXc0IiwgCQlPUFJMKDB4MUMsIDB4M0IpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHViOCIsCQlPUFIoMHgxQywgMHgzQyksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXh1YjgiLAkJT1BSTCgweDFDLCAweDNDKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXh1dzQiLAkJT1BSKDB4MUMsIDB4M0QpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4dXc0IiwJCU9QUkwoMHgxQywgMHgzRCksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4c2I4IiwJCU9QUigweDFDLCAweDNFKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHNiOCIsCQlPUFJMKDB4MUMsIDB4M0UpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHN3NCIsCQlPUFIoMHgxQywgMHgzRiksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXhzdzQiLAkJT1BSTCgweDFDLCAweDNGKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJmdG9pdCIsCQlGUCgweDFDLCAweDcwKSwgQ0lYLCB7IEZBLCBaQiwgUkMgfSB9LAotICB7ICJmdG9pcyIsCQlGUCgweDFDLCAweDc4KSwgQ0lYLCB7IEZBLCBaQiwgUkMgfSB9LAotCi0gIHsgImh3X210cHIiLAkJT1BSKDB4MUQsMHgwMCksIEVWNCwgeyBSQSwgUkJBLCBFVjRFWFRIV0lOREVYIH0gfSwKLSAgeyAiaHdfbXRwciIsCQlPUCgweDFEKSwgT1BfTUFTSywgRVY1LCB7IFJBLCBSQkEsIEVWNUhXSU5ERVggfSB9LAotICB7ICJod19tdHByIiwJCU9QKDB4MUQpLCBPUF9NQVNLLCBFVjYsIHsgWkEsIFJCLCBFVjZIV0lOREVYIH0gfSwKLSAgeyAiaHdfbXRwci9pIiwgCU9QUigweDFELDB4MDEpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL2EiLCAJT1BSKDB4MUQsMHgwMiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvYWkiLAlPUFIoMHgxRCwweDAzKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9wIiwgCU9QUigweDFELDB4MDQpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3BpIiwJT1BSKDB4MUQsMHgwNSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcGEiLAlPUFIoMHgxRCwweDA2KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9wYWkiLAlPUFIoMHgxRCwweDA3KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAicGFsMWQiLAkJUENEKDB4MUQpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAiaHdfcmVpIiwJCVNQQ0QoMHgxRSwweDNGRjgwMDApLCBFVjR8RVY1LCBBUkdfTk9ORSB9LAotICB7ICJod19yZWlfc3RhbGwiLAlTUENEKDB4MUUsMHgzRkZDMDAwKSwgRVY1LCBBUkdfTk9ORSB9LAotICB7ICJod19qbXAiLCAJCUVWNkhXTUJSKDB4MUUsMHgwKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X2pzciIsIAkJRVY2SFdNQlIoMHgxRSwweDIpLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfcmV0IiwgCQlFVjZIV01CUigweDFFLDB4NCksIEVWNiwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiaHdfamNyIiwgCQlFVjZIV01CUigweDFFLDB4NiksIEVWNiwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiaHdfY29yb3V0aW5lIiwJRVY2SFdNQlIoMHgxRSwweDYpLCBFVjYsIHsgWkEsIFBSQiB9IH0sIC8qIGFsaWFzICovCi0gIHsgImh3X2ptcC9zdGFsbCIsCUVWNkhXTUJSKDB4MUUsMHgxKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X2pzci9zdGFsbCIsIAlFVjZIV01CUigweDFFLDB4MyksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19yZXQvc3RhbGwiLAlFVjZIV01CUigweDFFLDB4NSksIEVWNiwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiaHdfamNyL3N0YWxsIiwgCUVWNkhXTUJSKDB4MUUsMHg3KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19jb3JvdXRpbmUvc3RhbGwiLCBFVjZIV01CUigweDFFLDB4NyksIEVWNiwgeyBaQSwgUFJCIH0gfSwgLyogYWxpYXMgKi8KLSAgeyAicGFsMWUiLAkJUENEKDB4MUUpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAiaHdfc3RsIiwJCUVWNEhXTUVNKDB4MUYsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsIiwJCUVWNUhXTUVNKDB4MUYsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bCIsCQlFVjZIV01FTSgweDFGLDB4NCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sIC8qID8/PyA4ICovCi0gIHsgImh3X3N0bC9hIiwJCUVWNEhXTUVNKDB4MUYsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2EiLAkJRVY1SFdNRU0oMHgxRiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2EiLAkJRVY2SFdNRU0oMHgxRiwweEMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdGwvYWMiLAlFVjVIV01FTSgweDFGLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYXIiLAlFVjRIV01FTSgweDFGLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9hdmMiLAlFVjVIV01FTSgweDFGLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYyIsCQlFVjVIV01FTSgweDFGLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcCIsCQlFVjRIV01FTSgweDFGLDB4OCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9wIiwJCUVWNUhXTUVNKDB4MUYsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wIiwJCUVWNkhXTUVNKDB4MUYsMHgwKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhIiwJRVY0SFdNRU0oMHgxRiwweEMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvcGEiLAlFVjVIV01FTSgweDFGLDB4MzApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGFjIiwJRVY1SFdNRU0oMHgxRiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYXZjIiwJRVY1SFdNRU0oMHgxRiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BjIiwJRVY1SFdNRU0oMHgxRiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3ByIiwJRVY0SFdNRU0oMHgxRiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvcHYiLAlFVjVIV01FTSgweDFGLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcHZjIiwJRVY1SFdNRU0oMHgxRiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3IiLAkJRVY0SFdNRU0oMHgxRiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvdiIsCQlFVjVIV01FTSgweDFGLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvdmMiLAlFVjVIV01FTSgweDFGLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYyIsCQlFVjVIV01FTSgweDFGLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9hIiwJRVY1SFdNRU0oMHgxRiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvYXYiLAlFVjVIV01FTSgweDFGLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wIiwJRVY1SFdNRU0oMHgxRiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcCIsCUVWNkhXTUVNKDB4MUYsMHgyKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcGEiLAlFVjVIV01FTSgweDFGLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3YiLAlFVjVIV01FTSgweDFGLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEiLAkJRVY0SFdNRU0oMHgxRiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEiLAkJRVY1SFdNRU0oMHgxRiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxIiwJCUVWNkhXTUVNKDB4MUYsMHg1KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwgLyogPz8/IDkgKi8KLSAgeyAiaHdfc3RxL2EiLAkJRVY0SFdNRU0oMHgxRiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvYSIsCQlFVjVIV01FTSgweDFGLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYSIsCQlFVjZIV01FTSgweDFGLDB4RCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0cS9hYyIsCUVWNUhXTUVNKDB4MUYsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9hciIsCUVWNEhXTUVNKDB4MUYsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2F2IiwJRVY1SFdNRU0oMHgxRiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2F2YyIsCUVWNUhXTUVNKDB4MUYsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wIiwJCUVWNEhXTUVNKDB4MUYsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3AiLAkJRVY1SFdNRU0oMHgxRiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3AiLAkJRVY2SFdNRU0oMHgxRiwweDEpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdHEvcGEiLAlFVjRIV01FTSgweDFGLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYWMiLAlFVjVIV01FTSgweDFGLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGFyIiwJRVY0SFdNRU0oMHgxRiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcGFyIiwJRVY0SFdNRU0oMHgxRiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhdmMiLAlFVjVIV01FTSgweDFGLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGMiLAlFVjVIV01FTSgweDFGLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcHIiLAlFVjRIV01FTSgweDFGLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wdmMiLAlFVjVIV01FTSgweDFGLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvciIsCQlFVjRIV01FTSgweDFGLDB4MyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS92IiwJCUVWNUhXTUVNKDB4MUYsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS92YyIsCUVWNUhXTUVNKDB4MUYsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL2EiLAlFVjVIV01FTSgweDFGLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3AiLAlFVjVIV01FTSgweDFGLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9wIiwJRVY2SFdNRU0oMHgxRiwweDMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdHFfYy9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3B2IiwJRVY1SFdNRU0oMHgxRiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvdiIsCUVWNUhXTUVNKDB4MUYsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0IiwJCUVWNEhXTUVNKDB4MUYsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QiLAkJRVY1SFdNRU0oMHgxRiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYSIsCQlFVjRIV01FTSgweDFGLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2EiLAkJRVY1SFdNRU0oMHgxRiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYWMiLAkJRVY1SFdNRU0oMHgxRiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXEiLAkJRVY0SFdNRU0oMHgxRiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9hcSIsCQlFVjVIV01FTSgweDFGLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcWMiLAlFVjVIV01FTSgweDFGLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcXYiLAlFVjVIV01FTSgweDFGLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcXZjIiwJRVY1SFdNRU0oMHgxRiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXIiLAkJRVY0SFdNRU0oMHgxRiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9hcnEiLAlFVjRIV01FTSgweDFGLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2F2IiwJCUVWNUhXTUVNKDB4MUYsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2F2YyIsCUVWNUhXTUVNKDB4MUYsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2MiLAkJRVY1SFdNRU0oMHgxRiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcCIsCQlFVjRIV01FTSgweDFGLDB4OCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3AiLAkJRVY1SFdNRU0oMHgxRiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGEiLAkJRVY0SFdNRU0oMHgxRiwweEMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wYSIsCQlFVjVIV01FTSgweDFGLDB4MzApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYWMiLAlFVjVIV01FTSgweDFGLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXEiLAlFVjRIV01FTSgweDFGLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcSIsCUVWNUhXTUVNKDB4MUYsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcWMiLAlFVjVIV01FTSgweDFGLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXF2IiwJRVY1SFdNRU0oMHgxRiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxdmMiLAlFVjVIV01FTSgweDFGLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXIiLAlFVjRIV01FTSgweDFGLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcnEiLAlFVjRIV01FTSgweDFGLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhdmMiLAlFVjVIV01FTSgweDFGLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYyIsCQlFVjVIV01FTSgweDFGLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wcSIsCQlFVjRIV01FTSgweDFGLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BxIiwJCUVWNUhXTUVNKDB4MUYsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxYyIsCUVWNUhXTUVNKDB4MUYsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxdiIsCUVWNUhXTUVNKDB4MUYsMHgyNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxdmMiLAlFVjVIV01FTSgweDFGLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wciIsCQlFVjRIV01FTSgweDFGLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BycSIsCUVWNEhXTUVNKDB4MUYsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHYiLAkJRVY1SFdNRU0oMHgxRiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHZjIiwJRVY1SFdNRU0oMHgxRiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcSIsCQlFVjRIV01FTSgweDFGLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3EiLAkJRVY1SFdNRU0oMHgxRiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcWMiLAkJRVY1SFdNRU0oMHgxRiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcXYiLAkJRVY1SFdNRU0oMHgxRiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcXZjIiwJRVY1SFdNRU0oMHgxRiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvciIsCQlFVjRIV01FTSgweDFGLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3YiLAkJRVY1SFdNRU0oMHgxRiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvdmMiLAkJRVY1SFdNRU0oMHgxRiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAicGFsMWYiLAkJUENEKDB4MUYpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAibGRmIiwJCU1FTSgweDIwKSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAibGRnIiwJCU1FTSgweDIxKSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAibGRzIiwJCU1FTSgweDIyKSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAibGR0IiwJCU1FTSgweDIzKSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAic3RmIiwJCU1FTSgweDI0KSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAic3RnIiwJCU1FTSgweDI1KSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAic3RzIiwJCU1FTSgweDI2KSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAic3R0IiwJCU1FTSgweDI3KSwgQkFTRSwgQVJHX0ZNRU0gfSwKLQotICB7ICJsZGwiLAkJTUVNKDB4MjgpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkcSIsCQlNRU0oMHgyOSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRsX2wiLAkJTUVNKDB4MkEpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkcV9sIiwJCU1FTSgweDJCKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdGwiLAkJTUVNKDB4MkMpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0cSIsCQlNRU0oMHgyRCksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RsX2MiLAkJTUVNKDB4MkUpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0cV9jIiwJCU1FTSgweDJGKSwgQkFTRSwgQVJHX01FTSB9LAotCi0gIHsgImJyIiwJCUJSQSgweDMwKSwgQkFTRSwgeyBaQSwgQkRJU1AgfSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiYnIiLAkJQlJBKDB4MzApLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImZiZXEiLAkJQlJBKDB4MzEpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmx0IiwJCUJSQSgweDMyKSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJsZSIsCQlCUkEoMHgzMyksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImJzciIsCQlCUkEoMHgzNCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiZmJuZSIsCQlCUkEoMHgzNSksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZiZ2UiLAkJQlJBKDB4MzYpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmd0IiwJCUJSQSgweDM3KSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiYmxiYyIsCQlCUkEoMHgzOCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmVxIiwJCUJSQSgweDM5KSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibHQiLAkJQlJBKDB4M0EpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJsZSIsCQlCUkEoMHgzQiksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmxicyIsCQlCUkEoMHgzQyksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYm5lIiwJCUJSQSgweDNEKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJiZ2UiLAkJQlJBKDB4M0UpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJndCIsCQlCUkEoMHgzRiksIEJBU0UsIEFSR19CUkEgfSwKLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGFscGhhX251bV9vcGNvZGVzID0gc2l6ZW9mKGFscGhhX29wY29kZXMpL3NpemVvZigqYWxwaGFfb3Bjb2Rlcyk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FyYy1kaXMuYyBiL29wY29kZXMvYXJjLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDJiMDdiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYXJjLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIHByaW50aW5nIGNvZGUgZm9yIHRoZSBBUkMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2FyYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgaW50IHByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIGludCBwcmludF9pbnNuX2FyY19iYXNlX2JpZyBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKiwgaW50LCBpbnQpKTsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoNCBvciA4IGZvciB0aGUgQVJDKS4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAocGMsIGluZm8sIG1hY2gsIGJpZ19wKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgbWFjaDsKLSAgICAgaW50IGJpZ19wOwotewotICBjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICBpbnQgc3RhdHVzOwotICAvKiBGaXJzdCBlbGVtZW50IGlzIGluc24sIHNlY29uZCBlbGVtZW50IGlzIGxpbW0gKGlmIHByZXNlbnQpLiAgKi8KLSAgYXJjX2luc24gaW5zblsyXTsKLSAgaW50IGdvdF9saW1tX3AgPSAwOwotICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLSAgc3RhdGljIGludCBjdXJyZW50X21hY2ggPSAwOwotCi0gIGlmICghaW5pdGlhbGl6ZWQgfHwgbWFjaCAhPSBjdXJyZW50X21hY2gpCi0gICAgewotICAgICAgaW5pdGlhbGl6ZWQgPSAxOwotICAgICAgY3VycmVudF9tYWNoID0gYXJjX2dldF9vcGNvZGVfbWFjaCAobWFjaCwgYmlnX3ApOwotICAgICAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoY3VycmVudF9tYWNoKTsKLSAgICB9Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoYmlnX3ApCi0gICAgaW5zblswXSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gIGVsc2UKLSAgICBpbnNuWzBdID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotICAoKmZ1bmMpIChzdHJlYW0sICIlMDhseFx0IiwgaW5zblswXSk7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGxpc3RzIGhhc2hlZCBieSB0aGUgaW5zbiBjb2RlCi0gICAgICh0aG91Z2ggd2UgbmVlZG4ndCBjYXJlIGhvdyB0aGV5J3JlIGhhc2hlZCkuICAqLwotCi0gIG9wY29kZSA9IGFyY19vcGNvZGVfbG9va3VwX2RpcyAoaW5zblswXSk7Ci0gIGZvciAoIDsgb3Bjb2RlICE9IE5VTEw7IG9wY29kZSA9IEFSQ19PUENPREVfTkVYVF9ESVMgKG9wY29kZSkpCi0gICAgewotICAgICAgY2hhciAqc3luOwotICAgICAgaW50IG1vZHMsaW52YWxpZDsKLSAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKm9wdmFsOwotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgaWYgKChpbnNuWzBdICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPnZhbHVlKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLwotICAgICAgaWYgKCEgYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE1ha2UgdHdvIHBhc3NlcyBvdmVyIHRoZSBvcGVyYW5kcy4gIEZpcnN0IHNlZSBpZiBhbnkgb2YgdGhlbQotCSBoYXZlIGV4dHJhY3Rpb24gZnVuY3Rpb25zLCBhbmQsIGlmIHRoZXkgZG8sIG1ha2Ugc3VyZSB0aGUKLQkgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotCi0gICAgICBhcmNfb3Bjb2RlX2luaXRfZXh0cmFjdCAoKTsKLSAgICAgIGludmFsaWQgPSAwOwotCi0gICAgICAvKiA/Pz8gR3JhbnRlZCwgdGhpcyBpcyBzbG93ZXIgdGhhbiB0aGUgYHBwYycgd2F5LiAgTWF5YmUgd2hlbiB0aGlzIGlzCi0JIGRvbmUgaXQnbGwgYmUgY2xlYXIgd2hhdCB0aGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMgaXMuICAqLwotICAgICAgLyogSW5zdHJ1Y3Rpb25zIGxpa2UgImFkZC5mIHIwLHIxLDEiIGFyZSB0cmlja3kgYmVjYXVzZSB0aGUgIi5mIiBnZXRzCi0JIHByaW50ZWQgZmlyc3QsIGJ1dCB3ZSBkb24ndCBrbm93IGhvdyB0byBwcmludCBpdCB1bnRpbCB3ZSd2ZSBwcm9jZXNzZWQKLQkgdGhlIHJlZ3MuICBTaW5jZSB3ZSdyZSBzY2FubmluZyBhbGwgdGhlIGFyZ3MgYmVmb3JlIHByaW50aW5nIHRoZSBpbnNuCi0JIGFueXdheXMsIGl0J3MgYWN0dWFsbHkgcXVpdGUgZWFzeS4gICovCi0KLSAgICAgIGZvciAoc3luID0gb3Bjb2RlLT5zeW50YXg7ICpzeW47ICsrc3luKQotCXsKLQkgIGludCBjOwotCi0JICBpZiAoKnN5biAhPSAnJScgfHwgKisrc3luID09ICclJykKLQkgICAgY29udGludWU7Ci0JICBtb2RzID0gMDsKLQkgIGMgPSAqc3luOwotCSAgd2hpbGUgKEFSQ19NT0RfUCAoYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MpKQotCSAgICB7Ci0JICAgICAgbW9kcyB8PSBhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncyAmIEFSQ19NT0RfQklUUzsKLQkgICAgICArK3N5bjsKLQkgICAgICBjID0gKnN5bjsKLQkgICAgfQotCSAgb3BlcmFuZCA9IGFyY19vcGVyYW5kcyArIGFyY19vcGVyYW5kX21hcFtjXTsKLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCBvcGVyYW5kLCBtb2RzLAotCQkJCSAoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqKSBOVUxMLAotCQkJCSAmaW52YWxpZCk7Ci0JfQotICAgICAgaWYgKGludmFsaWQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0KLSAgICAgIC8qIElmIHdlIGhhdmUgYW4gaW5zbiB3aXRoIGEgbGltbSwgZmV0Y2ggaXQgbm93LiAgU2Nhbm5pbmcgdGhlIGluc25zCi0JIHR3aWNlIGxldHMgdXMgZG8gdGhpcy4gICovCi0gICAgICBpZiAoYXJjX29wY29kZV9saW1tX3AgKE5VTEwpKQotCXsKLQkgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjICsgNCwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgIGlmIChzdGF0dXMgIT0gMCkKLQkgICAgewotCSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGlmIChiaWdfcCkKLQkgICAgaW5zblsxXSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0JICBlbHNlCi0JICAgIGluc25bMV0gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCSAgZ290X2xpbW1fcCA9IDE7Ci0JfQotCi0gICAgICBmb3IgKHN5biA9IG9wY29kZS0+c3ludGF4OyAqc3luOyArK3N5bikKLQl7Ci0JICBpbnQgYzsKLQotCSAgaWYgKCpzeW4gIT0gJyUnIHx8ICorK3N5biA9PSAnJScpCi0JICAgIHsKLQkgICAgICAoKmZ1bmMpIChzdHJlYW0sICIlYyIsICpzeW4pOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZC4gIEZldGNoIGFueSBzcGVjaWFsIG1vZGlmaWVycy4gICovCi0JICBtb2RzID0gMDsKLQkgIGMgPSAqc3luOwotCSAgd2hpbGUgKEFSQ19NT0RfUCAoYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MpKQotCSAgICB7Ci0JICAgICAgbW9kcyB8PSBhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncyAmIEFSQ19NT0RfQklUUzsKLQkgICAgICArK3N5bjsKLQkgICAgICBjID0gKnN5bjsKLQkgICAgfQotCSAgb3BlcmFuZCA9IGFyY19vcGVyYW5kcyArIGFyY19vcGVyYW5kX21hcFtjXTsKLQotCSAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgb3B2YWwgPSBOVUxMOwotCSAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIG9wZXJhbmQsIG1vZHMsCi0JCQkJCSAgICZvcHZhbCwgKGludCAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAoaW5zblswXSA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCQkgICYmICh2YWx1ZSAmICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKSkKLQkJdmFsdWUgLT0gMSA8PCBvcGVyYW5kLT5iaXRzOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHN1ZmZpeCBvcGVyYW5kLCBzZXQgYG9wdmFsJy4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKQotCQlvcHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgdmFsdWUpOwotCSAgICB9Ci0KLQkgIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBmbGFncy4gICovCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9GQUtFKQotCSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKD8/PyBhdCBsZWFzdCBub3QgeWV0KSAqLwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TVUZGSVgpCi0JICAgIHsKLQkgICAgICAvKiBEZWZhdWx0IHN1ZmZpeGVzIGFyZW4ndCBwcmludGVkLiAgRm9ydHVuYXRlbHksIHRoZXkgYWxsIGhhdmUKLQkJIHplcm8gdmFsdWVzLiAgQWxzbywgemVybyB2YWx1ZXMgZm9yIGJvb2xlYW4gc3VmZml4ZXMgYXJlCi0JCSByZXByZXNlbnRlZCBieSB0aGUgYWJzZW5jZSBvZiB0ZXh0LiAgKi8KLQotCSAgICAgIGlmICh2YWx1ZSAhPSAwKQotCQl7Ci0JCSAgLyogPz8/IE9QVkFMIHNob3VsZCBoYXZlIGEgdmFsdWUuICBJZiBpdCBkb2Vzbid0IGp1c3QgY29wZQotCQkgICAgIGFzIHdlIHdhbnQgZGlzYXNzZW1ibHkgdG8gYmUgcmVhc29uYWJseSByb2J1c3QuCi0JCSAgICAgQWxzbyByZW1lbWJlciB0aGF0IHNldmVyYWwgY29uZGl0aW9uIGNvZGUgdmFsdWVzICgxNi0zMSkKLQkJICAgICBhcmVuJ3QgZGVmaW5lZCB5ZXQuICBGb3IgdGhlc2UgY2FzZXMganVzdCBwcmludCB0aGUKLQkJICAgICBudW1iZXIgc3VpdGFibHkgZGVjb3JhdGVkLiAgKi8KLQkJICBpZiAob3B2YWwpCi0JCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlcyVzIiwKLQkJCSAgICAgbW9kcyAmIEFSQ19NT0RfRE9UID8gIi4iIDogIiIsCi0JCQkgICAgIG9wdmFsLT5uYW1lKTsKLQkJICBlbHNlCi0JCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlcyVjJWQiLAotCQkJICAgICBtb2RzICYgQVJDX01PRF9ET1QgPyAiLiIgOiAiIiwKLQkJCSAgICAgb3BlcmFuZC0+Zm10LCB2YWx1ZSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0gpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAocGMgKyA0ICsgdmFsdWUsIGluZm8pOwotCSAgLyogPz8/IE5vdCBhbGwgY2FzZXMgb2YgdGhpcyBhcmUgY3VycmVudGx5IGNhdWdodC4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgdmFsdWUgJiAweGZmZmZmZmZmLCBpbmZvKTsKLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfQUREUkVTUykKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgdmFsdWUgJiAweGZmZmZmZmZmLCBpbmZvKTsKLQkgIGVsc2UgaWYgKG9wdmFsKQotCSAgICAvKiBOb3RlIHRoYXQgdGhpcyBjYXNlIGNhdGNoZXMgYm90aCBub3JtYWwgYW5kIGF1eGlsaWFyeSByZWdzLiAgKi8KLQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJXMiLCBvcHZhbC0+bmFtZSk7Ci0JICBlbHNlCi0JICAgICgqZnVuYykgKHN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5kIHByaW50ZWQgYW4gaW5zdHJ1Y3Rpb247IHJldHVybi4gICovCi0gICAgICByZXR1cm4gZ290X2xpbW1fcCA/IDggOiA0OwotICAgIH0KLQotICAoKmZ1bmMpIChzdHJlYW0sIF8oIip1bmtub3duKiIpKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIEdpdmVuIE1BQ0gsIG9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LCByZXR1cm4gdGhlIHByaW50X2luc24gZnVuY3Rpb24gdG8gdXNlLgotICAgVGhpcyBkb2VzIHRoaW5ncyBhIG5vbi1zdGFuZGFyZCB3YXkgKHRoZSAic3RhbmRhcmQiIHdheSB3b3VsZCBiZSB0byBjb3B5Ci0gICB0aGlzIGNvZGUgaW50byBkaXNhc3NlbWJsZS5jKS4gIFNpbmNlIHRoZXJlIGFyZSBtb3JlIHRoYW4gYSBjb3VwbGUgb2YKLSAgIHZhcmlhbnRzLCBoaWRpbmcgYWxsIHRoaXMgY3J1ZCBoZXJlIHNlZW1zIGNsZWFuZXIuICAqLwotCi1kaXNhc3NlbWJsZXJfZnR5cGUKLWFyY19nZXRfZGlzYXNzZW1ibGVyIChtYWNoLCBiaWdfcCkKLSAgICAgaW50IG1hY2g7Ci0gICAgIGludCBiaWdfcDsKLXsKLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX2FyY19iYXNlOgotICAgICAgcmV0dXJuIGJpZ19wID8gcHJpbnRfaW5zbl9hcmNfYmFzZV9iaWcgOiBwcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZTsKLSAgICB9Ci0gIHJldHVybiBwcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGUgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbiAocGMsIGluZm8sIGJmZF9tYWNoX2FyY19iYXNlLCAwKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmNfYmFzZV9iaWcgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbiAocGMsIGluZm8sIGJmZF9tYWNoX2FyY19iYXNlLCAxKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJjLW9wYy5jIGIvb3Bjb2Rlcy9hcmMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGY2ODkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcmMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMxICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvYXJjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0jZGVmaW5lIElOU0VSVF9GTihmbikgXAotc3RhdGljIGFyY19pbnNuIGZuIFBBUkFNUyAoKGFyY19pbnNuLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgXAotCQkJICAgIGludCwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICosIGxvbmcsIFwKLQkJCSAgICBjb25zdCBjaGFyICoqKSkKLSNkZWZpbmUgRVhUUkFDVF9GTihmbikgXAotc3RhdGljIGxvbmcgZm4gUEFSQU1TICgoYXJjX2luc24gKiwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICosIFwKLQkJCWludCwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqLCBpbnQgKikpCi0KLUlOU0VSVF9GTiAoaW5zZXJ0X3JlZyk7Ci1JTlNFUlRfRk4gKGluc2VydF9zaGltbWZpbmlzaCk7Ci1JTlNFUlRfRk4gKGluc2VydF9saW1tZmluaXNoKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1tb2Zmc2V0KTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1temVybyk7Ci1JTlNFUlRfRk4gKGluc2VydF9mbGFnKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZsYWdmaW5pc2gpOwotSU5TRVJUX0ZOIChpbnNlcnRfY29uZCk7Ci1JTlNFUlRfRk4gKGluc2VydF9mb3JjZWxpbW0pOwotSU5TRVJUX0ZOIChpbnNlcnRfcmVsYWRkcik7Ci1JTlNFUlRfRk4gKGluc2VydF9hYnNhZGRyKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3Vub3BtYWNybyk7Ci0KLUVYVFJBQ1RfRk4gKGV4dHJhY3RfcmVnKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfZmxhZyk7Ci1FWFRSQUNUX0ZOIChleHRyYWN0X2NvbmQpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF9yZWxhZGRyKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfdW5vcG1hY3JvKTsKLQotLyogVmFyaW91cyB0eXBlcyBvZiBBUkMgb3BlcmFuZHMsIGluY2x1ZGluZyBpbnNuIHN1ZmZpeGVzLiAgKi8KLQotLyogSW5zbiBmb3JtYXQgdmFsdWVzOgotCi0gICAnYScJUkVHQQkJcmVnaXN0ZXIgQSBmaWVsZAotICAgJ2InCVJFR0IJCXJlZ2lzdGVyIEIgZmllbGQKLSAgICdjJwlSRUdDCQlyZWdpc3RlciBDIGZpZWxkCi0gICAnUycJU0hJTU1GSU5JU0gJZmluaXNoIGluc2VydGluZyBhIHNoaW1tIHZhbHVlCi0gICAnTCcJTElNTUZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIGEgbGltbSB2YWx1ZQotICAgJ2QnCVNISU1NT0ZGU0VUCXNoaW1tIG9mZnNldCBpbiBsZCxzdCBpbnNucwotICAgJzAnCVNISU1NWkVSTwkwIHNoaW1tIHZhbHVlIGluIGxkLHN0IGluc25zCi0gICAnZicJRkxBRwkJRiBmbGFnCi0gICAnRicJRkxBR0ZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIHRoZSBGIGZsYWcKLSAgICdHJwlGTEFHSU5TTglpbnNlcnQgRiBmbGFnIGluICJmbGFnIiBpbnNuCi0gICAnbicJREVMQVkJCU4gZmllbGQgKG51bGxpZnkgZmllbGQpCi0gICAncScJQ09ORAkJY29uZGl0aW9uIGNvZGUgZmllbGQKLSAgICdRJwlGT1JDRUxJTU0Jc2V0IGBjb25kX3AnIHRvIDEgdG8gZW5zdXJlIGEgY29uc3RhbnQgaXMgYSBsaW1tCi0gICAnQicJQlJBTkNICQlicmFuY2ggYWRkcmVzcyAoMjIgYml0IHBjIHJlbGF0aXZlKQotICAgJ0onCUpVTVAJCWp1bXAgYWRkcmVzcyAoMjYgYml0IGFic29sdXRlKQotICAgJ3onCVNJWkUxCQlzaXplIGZpZWxkIGluIGxkIGEsW2IsY10KLSAgICdaJwlTSVpFMTAJCXNpemUgZmllbGQgaW4gbGQgYSxbYixzaGltbV0KLSAgICd5JwlTSVpFMjIJCXNpemUgZmllbGQgaW4gc3QgYyxbYixzaGltbV0KLSAgICd4JwlTSUdOMAkJc2lnbiBleHRlbmQgZmllbGQgbGQgYSxbYixjXQotICAgJ1gnCVNJR045CQlzaWduIGV4dGVuZCBmaWVsZCBsZCBhLFtiLHNoaW1tXQotICAgJ3cnCUFERFJFU1MzCXdyaXRlLWJhY2sgZmllbGQgaW4gbGQgYSxbYixjXQotICAgJ1cnCUFERFJFU1MxMgl3cml0ZS1iYWNrIGZpZWxkIGluIGxkIGEsW2Isc2hpbW1dCi0gICAndicJQUREUkVTUzI0CXdyaXRlLWJhY2sgZmllbGQgaW4gc3QgYyxbYixzaGltbV0KLSAgICdlJwlDQUNIRUJZUEFTUzUJY2FjaGUgYnlwYXNzIGluIGxkIGEsW2IsY10KLSAgICdFJwlDQUNIRUJZUEFTUzE0CWNhY2hlIGJ5cGFzcyBpbiBsZCBhLFtiLHNoaW1tXQotICAgJ0QnCUNBQ0hFQllQQVNTMjYJY2FjaGUgYnlwYXNzIGluIHN0IGMsW2Isc2hpbW1dCi0gICAnVScJVU5PUE1BQ1JPCWZha2Ugb3BlcmFuZCB0byBjb3B5IFJFR0IgdG8gUkVHQyBmb3IgdW5vcCBtYWNyb3MKLQotICAgVGhlIGZvbGxvd2luZyBtb2RpZmllcnMgbWF5IGFwcGVhciBiZXR3ZWVuIHRoZSAlIGFuZCBjaGFyIChlZzogJS5mKToKLQotICAgJy4nCU1PRERPVAkJJy4nIHByZWZpeCBtdXN0IGJlIHByZXNlbnQKLSAgICdyJwlSRUcJCWdlbmVyaWMgcmVnaXN0ZXIgdmFsdWUsIGZvciByZWdpc3RlciB0YWJsZQotICAgJ0EnCUFVWFJFRwkJYXV4aWxpYXJ5IHJlZ2lzdGVyIGluIGxyIGEsW2JdLCBzciBjLFtiXQotCi0gICBGaWVsZHMgYXJlOgotCi0gICBDSEFSIEJJVFMgU0hJRlQgRkxBR1MgSU5TRVJUX0ZOIEVYVFJBQ1RfRk4KLSovCi0KLWNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCBhcmNfb3BlcmFuZHNbXSA9Ci17Ci0vKiBwbGFjZSBob2xkZXIgKD8/PyBub3Qgc3VyZSBpZiBuZWVkZWQpICovCi0jZGVmaW5lIFVOVVNFRCAwCi0gIHsgMCB9LAotCi0vKiByZWdpc3RlciBBIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0EgKFVOVVNFRCArIDEpCi0gIHsgJ2EnLCA2LCBBUkNfU0hJRlRfUkVHQSwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVnLCBleHRyYWN0X3JlZyB9LAotCi0vKiByZWdpc3RlciBCIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0IgKFJFR0EgKyAxKQotICB7ICdiJywgNiwgQVJDX1NISUZUX1JFR0IsIEFSQ19PUEVSQU5EX1NJR05FRCwgaW5zZXJ0X3JlZywgZXh0cmFjdF9yZWcgfSwKLQotLyogcmVnaXN0ZXIgQyBvciBzaGltbS9saW1tIGluZGljYXRvciAqLwotI2RlZmluZSBSRUdDIChSRUdCICsgMSkKLSAgeyAnYycsIDYsIEFSQ19TSElGVF9SRUdDLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWcsIGV4dHJhY3RfcmVnIH0sCi0KLS8qIGZha2Ugb3BlcmFuZCB1c2VkIHRvIGluc2VydCBzaGltbSB2YWx1ZSBpbnRvIG1vc3QgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFNISU1NRklOSVNIIChSRUdDICsgMSkKLSAgeyAnUycsIDksIDAsIEFSQ19PUEVSQU5EX1NJR05FRCArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9zaGltbWZpbmlzaCwgMCB9LAotCi0vKiBmYWtlIG9wZXJhbmQgdXNlZCB0byBpbnNlcnQgbGltbSB2YWx1ZSBpbnRvIG1vc3QgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTElNTUZJTklTSCAoU0hJTU1GSU5JU0ggKyAxKQotICB7ICdMJywgMzIsIDMyLCBBUkNfT1BFUkFORF9BRERSRVNTICsgQVJDX09QRVJBTkRfTElNTSArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9saW1tZmluaXNoLCAwIH0sCi0KLS8qIHNoaW1tIG9wZXJhbmQgd2hlbiB0aGVyZSBpcyBubyByZWcgaW5kaWNhdG9yIChsZCxzdCkgKi8KLSNkZWZpbmUgU0hJTU1PRkZTRVQgKExJTU1GSU5JU0ggKyAxKQotICB7ICdkJywgOSwgMCwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfc2hpbW1vZmZzZXQsIDAgfSwKLQotLyogMCBzaGltbSBvcGVyYW5kIGZvciBsZCxzdCBpbnNucyAqLwotI2RlZmluZSBTSElNTVpFUk8gKFNISU1NT0ZGU0VUICsgMSkKLSAgeyAnMCcsIDksIDAsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9zaGltbXplcm8sIDAgfSwKLQotLyogZmxhZyB1cGRhdGUgYml0IChpbnNlcnRpb24gaXMgZGVmZXJlZCB1bnRpbCB3ZSBrbm93IGhvdykgKi8KLSNkZWZpbmUgRkxBRyAoU0hJTU1aRVJPICsgMSkKLSAgeyAnZicsIDEsIDgsIEFSQ19PUEVSQU5EX1NVRkZJWCwgaW5zZXJ0X2ZsYWcsIGV4dHJhY3RfZmxhZyB9LAotCi0vKiBmYWtlIHV0aWxpdHkgb3BlcmFuZCB0byBmaW5pc2ggJ2YnIHN1ZmZpeCBoYW5kbGluZyAqLwotI2RlZmluZSBGTEFHRklOSVNIIChGTEFHICsgMSkKLSAgeyAnRicsIDEsIDgsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9mbGFnZmluaXNoLCAwIH0sCi0KLS8qIGZha2UgdXRpbGl0eSBvcGVyYW5kIHRvIHNldCB0aGUgJ2YnIGZsYWcgZm9yIHRoZSAiZmxhZyIgaW5zbiAqLwotI2RlZmluZSBGTEFHSU5TTiAoRkxBR0ZJTklTSCArIDEpCi0gIHsgJ0cnLCAxLCA4LCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfZmxhZywgMCB9LAotCi0vKiBicmFuY2ggZGVsYXkgdHlwZXMgKi8KLSNkZWZpbmUgREVMQVkgKEZMQUdJTlNOICsgMSkKLSAgeyAnbicsIDIsIDUsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjb25kaXRpb25zICovCi0jZGVmaW5lIENPTkQgKERFTEFZICsgMSkKLSAgeyAncScsIDUsIDAsIEFSQ19PUEVSQU5EX1NVRkZJWCwgaW5zZXJ0X2NvbmQsIGV4dHJhY3RfY29uZCB9LAotCi0vKiBzZXQgYGNvbmRfcCcgdG8gMSB0byBlbnN1cmUgYSBjb25zdGFudCBpcyB0cmVhdGVkIGFzIGEgbGltbSAqLwotI2RlZmluZSBGT1JDRUxJTU0gKENPTkQgKyAxKQotICB7ICdRJywgMCwgMCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2ZvcmNlbGltbSB9LAotCi0vKiBicmFuY2ggYWRkcmVzczsgYiwgYmwsIGFuZCBscCBpbnNucyAqLwotI2RlZmluZSBCUkFOQ0ggKEZPUkNFTElNTSArIDEpCi0gIHsgJ0InLCAyMCwgNywgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIICsgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVsYWRkciwgZXh0cmFjdF9yZWxhZGRyIH0sCi0KLS8qIGp1bXAgYWRkcmVzczsgaiBpbnNuICh0aGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyAnTCcgZXhjZXB0IHRoYXQgdGhlCi0gICB2YWx1ZSBpcyByaWdodCBzaGlmdGVkIGJ5IDIpICovCi0jZGVmaW5lIEpVTVAgKEJSQU5DSCArIDEpCi0gIHsgJ0onLCAyNCwgMzIsIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCArIEFSQ19PUEVSQU5EX0xJTU0gKyBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfYWJzYWRkciB9LAotCi0vKiBzaXplIGZpZWxkLCBzdG9yZWQgaW4gYml0IDEsMiAqLwotI2RlZmluZSBTSVpFMSAoSlVNUCArIDEpCi0gIHsgJ3onLCAyLCAxLCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogc2l6ZSBmaWVsZCwgc3RvcmVkIGluIGJpdCAxMCwxMSAqLwotI2RlZmluZSBTSVpFMTAgKFNJWkUxICsgMSkKLSAgeyAnWicsIDIsIDEwLCBBUkNfT1BFUkFORF9TVUZGSVgsIH0sCi0KLS8qIHNpemUgZmllbGQsIHN0b3JlZCBpbiBiaXQgMjIsMjMgKi8KLSNkZWZpbmUgU0laRTIyIChTSVpFMTAgKyAxKQotICB7ICd5JywgMiwgMjIsIEFSQ19PUEVSQU5EX1NVRkZJWCwgfSwKLQotLyogc2lnbiBleHRlbmQgZmllbGQsIHN0b3JlZCBpbiBiaXQgMCAqLwotI2RlZmluZSBTSUdOMCAoU0laRTIyICsgMSkKLSAgeyAneCcsIDEsIDAsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBzaWduIGV4dGVuZCBmaWVsZCwgc3RvcmVkIGluIGJpdCA5ICovCi0jZGVmaW5lIFNJR045IChTSUdOMCArIDEpCi0gIHsgJ1gnLCAxLCA5LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogYWRkcmVzcyB3cml0ZSBiYWNrLCBzdG9yZWQgaW4gYml0IDMgKi8KLSNkZWZpbmUgQUREUkVTUzMgKFNJR045ICsgMSkKLSAgeyAndycsIDEsIDMsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBhZGRyZXNzIHdyaXRlIGJhY2ssIHN0b3JlZCBpbiBiaXQgMTIgKi8KLSNkZWZpbmUgQUREUkVTUzEyIChBRERSRVNTMyArIDEpCi0gIHsgJ1cnLCAxLCAxMiwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGFkZHJlc3Mgd3JpdGUgYmFjaywgc3RvcmVkIGluIGJpdCAyNCAqLwotI2RlZmluZSBBRERSRVNTMjQgKEFERFJFU1MxMiArIDEpCi0gIHsgJ3YnLCAxLCAyNCwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNhY2hlIGJ5cGFzcywgc3RvcmVkIGluIGJpdCA1ICovCi0jZGVmaW5lIENBQ0hFQllQQVNTNSAoQUREUkVTUzI0ICsgMSkKLSAgeyAnZScsIDEsIDUsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjYWNoZSBieXBhc3MsIHN0b3JlZCBpbiBiaXQgMTQgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1MxNCAoQ0FDSEVCWVBBU1M1ICsgMSkKLSAgeyAnRScsIDEsIDE0LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogY2FjaGUgYnlwYXNzLCBzdG9yZWQgaW4gYml0IDI2ICovCi0jZGVmaW5lIENBQ0hFQllQQVNTMjYgKENBQ0hFQllQQVNTMTQgKyAxKQotICB7ICdEJywgMSwgMjYsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiB1bm9wIG1hY3JvLCB1c2VkIHRvIGNvcHkgUkVHQiB0byBSRUdDICovCi0jZGVmaW5lIFVOT1BNQUNSTyAoQ0FDSEVCWVBBU1MyNiArIDEpCi0gIHsgJ1UnLCA2LCBBUkNfU0hJRlRfUkVHQywgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3Vub3BtYWNybywgZXh0cmFjdF91bm9wbWFjcm8gfSwKLQotLyogJy4nIG1vZGlmaWVyICgnLicgcmVxdWlyZWQpLiAgKi8KLSNkZWZpbmUgTU9ERE9UIChVTk9QTUFDUk8gKyAxKQotICB7ICcuJywgMSwgMCwgQVJDX01PRF9ET1QgfSwKLQotLyogRHVtbXkgJ3InIG1vZGlmaWVyIGZvciB0aGUgcmVnaXN0ZXIgdGFibGUuCi0gICBJdCdzIGNhbGxlZCBhICJkdW1teSIgYmVjYXVzZSB0aGVyZSdzIG5vIHBvaW50IGluIGluc2VydGluZyBhbiAncicgaW50byBhbGwKLSAgIHRoZSAlYS8lYi8lYyBvY2N1cnJlbmNlcyBpbiB0aGUgaW5zbiB0YWJsZS4gICovCi0jZGVmaW5lIFJFRyAoTU9ERE9UICsgMSkKLSAgeyAncicsIDYsIDAsIEFSQ19NT0RfUkVHIH0sCi0KLS8qIEtub3duIGF1eGlsaWFyeSByZWdpc3RlciBtb2RpZmllciAoc3RvcmVkIGluIHNoaW1tIGZpZWxkKS4gICovCi0jZGVmaW5lIEFVWFJFRyAoUkVHICsgMSkKLSAgeyAnQScsIDksIDAsIEFSQ19NT0RfQVVYUkVHIH0sCi0KLS8qIGVuZCBvZiBsaXN0IHBsYWNlIGhvbGRlciAqLwotICB7IDAgfQotfTsKLQwKLS8qIEdpdmVuIGEgZm9ybWF0IGxldHRlciwgeWllbGRzIHRoZSBpbmRleCBpbnRvIGBhcmNfb3BlcmFuZHMnLgotICAgZWc6IGFyY19vcGVyYW5kX21hcFsnYSddID0gUkVHQS4gICovCi11bnNpZ25lZCBjaGFyIGFyY19vcGVyYW5kX21hcFsyNTZdOwotCi0jZGVmaW5lIEkoeCkgKCgoeCkgJiAzMSkgPDwgMjcpCi0jZGVmaW5lIEEoeCkgKCgoeCkgJiBBUkNfTUFTS19SRUcpIDw8IEFSQ19TSElGVF9SRUdBKQotI2RlZmluZSBCKHgpICgoKHgpICYgQVJDX01BU0tfUkVHKSA8PCBBUkNfU0hJRlRfUkVHQikKLSNkZWZpbmUgQyh4KSAoKCh4KSAmIEFSQ19NQVNLX1JFRykgPDwgQVJDX1NISUZUX1JFR0MpCi0jZGVmaW5lIFIoeCxiLG0pICgoKHgpICYgKG0pKSA8PCAoYikpCS8qIHZhbHVlIFgsIG1hc2sgTSwgYXQgYml0IEIgKi8KLQotLyogQVJDIGluc3RydWN0aW9ucy4KLQotICAgTG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIG11c3QgYXBwZWFyIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGlmIGdhcyBzZWVzCi0gICAibHNyIHIyLHIzLDEiIHdoZW4gaXQncyBwYXJzaW5nICJsc3IgJWEsJWIiIGl0IHdpbGwgdGhpbmsgdGhlICIsMSIgaXMKLSAgIGp1bmspLiAgVGhpcyBpc24ndCBuZWNlc3NhcnkgZm9yIGBsZCcgYmVjYXVzZSBvZiB0aGUgdHJhaWxpbmcgJ10nLgotCi0gICBJbnN0cnVjdGlvbnMgdGhhdCBhcmUgcmVhbGx5IG1hY3JvcyBiYXNlZCBvbiBvdGhlciBpbnNucyBtdXN0IGFwcGVhcgotICAgYmVmb3JlIHRoZSByZWFsIGluc24gc28gdGhleSdyZSBjaG9zZW4gd2hlbiBkaXNhc3NlbWJsaW5nLiAgRWc6IFRoZSBgbW92JwotICAgaW5zbiBpcyByZWFsbHkgdGhlIGBhbmQnIGluc24uCi0KLSAgIFRoaXMgdGFibGUgaXMgYmVzdCB2aWV3ZWQgb24gYSB3aWRlIHNjcmVlbiAoMTYxIGNvbHVtbnMpLiAgSSdkIHByZWZlciB0bwotICAga2VlcCBpdCB0aGlzIHdheS4gIFRoZSByZXN0IG9mIHRoZSBmaWxlLCBob3dldmVyLCBzaG91bGQgYmUgdmlld2FibGUgb24gYW4KLSAgIDgwIGNvbHVtbiB0ZXJtaW5hbC4gICovCi0KLS8qID8/PyBUaGlzIHRhYmxlIGFsc28gaW5jbHVkZXMgbWFjcm9zOiBhc2wsIGxzbCwgYW5kIG1vdi4gIFRoZSBwcGMgcG9ydCBoYXMKLSAgIGEgbW9yZSBnZW5lcmFsIGZhY2lsaXR5IGZvciBkZWFsaW5nIHdpdGggbWFjcm9zIHdoaWNoIGNvdWxkIGJlIHVzZWQgaWYKLSAgIHdlIG5lZWQgdG8uICAqLwotCi0vKiBUaGlzIHRhYmxlIGNhbid0IGJlIGBjb25zdCcgYmVjYXVzZSBtZW1iZXJzIGBuZXh0X2FzbScgYW5kIGBuZXh0X2RpcycgYXJlCi0gICBjb21wdXRlZCBhdCBydW4tdGltZS4gIFdlIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28sIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbQotICAgd29ydGggaXQuICAqLwotCi1zdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdID0gewotCi0gIC8qIE1hY3JvcyBhcHBlYXIgZmlyc3QuICAqLwotICAvKiAibW92IiBpcyByZWFsbHkgYW4gImFuZCIuICAqLwotICB7ICJtb3YlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoMTIpIH0sCi0gIC8qICJhc2wiIGlzIHJlYWxseSBhbiAiYWRkIi4gICovCi0gIHsgImFzbCUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg4KSB9LAotICAvKiAibHNsIiBpcyByZWFsbHkgYW4gImFkZCIuICAqLwotICB7ICJsc2wlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoOCkgfSwKLSAgLyogIm5vcCIgaXMgcmVhbGx5IGFuICJ4b3IiLiAgKi8KLSAgeyAibm9wIiwJCQkJMHhmZmZmZmZmZiwJMHg3ZmZmZmZmZiB9LAotICAvKiAicmxjIiBpcyByZWFsbHkgYW4gImFkYyIuICAqLwotICB7ICJybGMlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoOSkgfSwKLQotICAvKiBUaGUgcmVzdCBvZiB0aGVzZSBuZWVkbid0IGJlIHNvcnRlZCwgYnV0IGl0IGhlbHBzIHRvIGZpbmQgdGhlbSBpZiB0aGV5IGFyZS4gICovCi0gIHsgImFkYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoOSkgfSwKLSAgeyAiYWRkJS5xJS5mICVhLCViLCVjJUYlUyVMIiwJCUkoLTEpLAkJSSg4KSB9LAotICB7ICJhbmQlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEyKSB9LAotICB7ICJhc3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygxKSB9LAotICB7ICJiaWMlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDE0KSB9LAotICB7ICJiJXElLm4gJUIiLAkJCUkoLTEpLAkJSSg0KSwJCUFSQ19PUENPREVfQ09ORF9CUkFOQ0ggfSwKLSAgeyAiYmwlcSUubiAlQiIsCQkJSSgtMSksCQlJKDUpLAkJQVJDX09QQ09ERV9DT05EX0JSQU5DSCB9LAotICB7ICJleHRiJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNykgfSwKLSAgeyAiZXh0dyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDgpIH0sCi0gIHsgImZsYWclLnEgJWIlRyVTJUwiLAkJCUkoLTEpK0EoLTEpK0MoLTEpLAkJSSgzKStBKEFSQ19SRUdfU0hJTU1fVVBEQVRFKStDKDApIH0sCi0gIC8qICVROiBmb3JjZSBjb25kX3A9MSAtLT4gbm8gc2hpbW0gdmFsdWVzICovCi0gIC8qID8/PyBUaGlzIGluc24gYWxsb3dzIGFuIG9wdGlvbmFsIGZsYWdzIHNwZWMuICAqLwotICB7ICJqJXElUSUubiUuZiAlYiVKIiwJCQlJKC0xKStBKC0xKStDKC0xKStSKC0xLDcsMSksCUkoNykrQSgwKStDKDApK1IoMCw3LDEpIH0sCi0gIC8qIFB1dCBvcGNvZGUgMSBsZCBpbnNucyBmaXJzdCBzbyBzaGltbSBnZXRzIHByZWZlcmVkIG92ZXIgbGltbS4gICovCi0gIC8qICJbJWJdIiBpcyBiZWZvcmUgIlslYiwlZF0iIHNvIDAgb2Zmc2V0cyBkb24ndCBnZXQgcHJpbnRlZC4gICovCi0gIHsgImxkJVolLlglLlclLkUgJTAlYSxbJWJdJUwiLAlJKC0xKStSKC0xLDEzLDEpK1IoLTEsMCw1MTEpLAlJKDEpK1IoMCwxMywxKStSKDAsMCw1MTEpIH0sCi0gIHsgImxkJVolLlglLlclLkUgJWEsWyViLCVkXSVTJUwiLAlJKC0xKStSKC0xLDEzLDEpLAkJSSgxKStSKDAsMTMsMSkgfSwKLSAgeyAibGQleiUueCUudyUuZSVRICVhLFslYiwlY10lTCIsCUkoLTEpK1IoLTEsNCwxKStSKC0xLDYsNyksCUkoMCkrUigwLDQsMSkrUigwLDYsNykgfSwKLSAgeyAibHAlcSUubiAlQiIsCQkJSSgtMSksCQlJKDYpLCB9LAotICB7ICJsciAlYSxbJUFiXSVTJUwiLAkJCUkoLTEpK0MoLTEpLAlJKDEpK0MoMHgxMCkgfSwKLSAgeyAibHNyJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoMikgfSwKLSAgeyAib3IlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEzKSB9LAotICB7ICJyb3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygzKSB9LAotICB7ICJycmMlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg0KSB9LAotICB7ICJzYmMlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDExKSB9LAotICB7ICJzZXhiJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNSkgfSwKLSAgeyAic2V4dyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDYpIH0sCi0gIHsgInNyICVjLFslQWJdJVMlTCIsCQkJSSgtMSkrQSgtMSksCUkoMikrQSgweDEwKSB9LAotICAvKiAiWyViXSIgaXMgYmVmb3JlICJbJWIsJWRdIiBzbyAwIG9mZnNldHMgZG9uJ3QgZ2V0IHByaW50ZWQuICAqLwotICB7ICJzdCV5JS52JS5EJVEgJTAlYyxbJWJdJUwiLAkJSSgtMSkrUigtMSwyNSwxKStSKC0xLDIxLDEpK1IoLTEsMCw1MTEpLAlJKDIpK1IoMCwyNSwxKStSKDAsMjEsMSkrUigwLDAsNTExKSB9LAotICB7ICJzdCV5JS52JS5EICVjLFslYiwlZF0lUyVMIiwJSSgtMSkrUigtMSwyNSwxKStSKC0xLDIxLDEpLAkJCUkoMikrUigwLDI1LDEpK1IoMCwyMSwxKSB9LAotICB7ICJzdWIlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEwKSB9LAotICB7ICJ4b3IlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDE1KSB9Ci19OwotY29uc3QgaW50IGFyY19vcGNvZGVzX2NvdW50ID0gc2l6ZW9mIChhcmNfb3Bjb2RlcykgLyBzaXplb2YgKGFyY19vcGNvZGVzWzBdKTsKLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIGFyY19yZWdfbmFtZXNbXSA9Ci17Ci0gIC8qIFNvcnQgdGhpcyBzbyB0aGF0IHRoZSBmaXJzdCA2MSBlbnRyaWVzIGFyZSBzZXF1ZW50aWFsLgotICAgICBJRTogRm9yIGVhY2ggaSAoaTw2MSksIGFyY19yZWdfbmFtZXNbaV0udmFsdWUgPT0gaS4gICovCi0KLSAgeyAicjAiLCAwLCBSRUcgfSwgeyAicjEiLCAxLCBSRUcgfSwgeyAicjIiLCAyLCBSRUcgfSwgeyAicjMiLCAzLCBSRUcgfSwKLSAgeyAicjQiLCA0LCBSRUcgfSwgeyAicjUiLCA1LCBSRUcgfSwgeyAicjYiLCA2LCBSRUcgfSwgeyAicjciLCA3LCBSRUcgfSwKLSAgeyAicjgiLCA4LCBSRUcgfSwgeyAicjkiLCA5LCBSRUcgfSwgeyAicjEwIiwgMTAsIFJFRyB9LCB7ICJyMTEiLCAxMSwgUkVHIH0sCi0gIHsgInIxMiIsIDEyLCBSRUcgfSwgeyAicjEzIiwgMTMsIFJFRyB9LCB7ICJyMTQiLCAxNCwgUkVHIH0sIHsgInIxNSIsIDE1LCBSRUcgfSwKLSAgeyAicjE2IiwgMTYsIFJFRyB9LCB7ICJyMTciLCAxNywgUkVHIH0sIHsgInIxOCIsIDE4LCBSRUcgfSwgeyAicjE5IiwgMTksIFJFRyB9LAotICB7ICJyMjAiLCAyMCwgUkVHIH0sIHsgInIyMSIsIDIxLCBSRUcgfSwgeyAicjIyIiwgMjIsIFJFRyB9LCB7ICJyMjMiLCAyMywgUkVHIH0sCi0gIHsgInIyNCIsIDI0LCBSRUcgfSwgeyAicjI1IiwgMjUsIFJFRyB9LCB7ICJyMjYiLCAyNiwgUkVHIH0sIHsgImZwIiwgMjcsIFJFRyB9LAotICB7ICJzcCIsIDI4LCBSRUcgfSwgeyAiaWxpbmsxIiwgMjksIFJFRyB9LCB7ICJpbGluazIiLCAzMCwgUkVHIH0sIHsgImJsaW5rIiwgMzEsIFJFRyB9LAotICB7ICJyMzIiLCAzMiwgUkVHIH0sIHsgInIzMyIsIDMzLCBSRUcgfSwgeyAicjM0IiwgMzQsIFJFRyB9LCB7ICJyMzUiLCAzNSwgUkVHIH0sCi0gIHsgInIzNiIsIDM2LCBSRUcgfSwgeyAicjM3IiwgMzcsIFJFRyB9LCB7ICJyMzgiLCAzOCwgUkVHIH0sIHsgInIzOSIsIDM5LCBSRUcgfSwKLSAgeyAicjQwIiwgNDAsIFJFRyB9LCB7ICJyNDEiLCA0MSwgUkVHIH0sIHsgInI0MiIsIDQyLCBSRUcgfSwgeyAicjQzIiwgNDMsIFJFRyB9LAotICB7ICJyNDQiLCA0NCwgUkVHIH0sIHsgInI0NSIsIDQ1LCBSRUcgfSwgeyAicjQ2IiwgNDYsIFJFRyB9LCB7ICJyNDciLCA0NywgUkVHIH0sCi0gIHsgInI0OCIsIDQ4LCBSRUcgfSwgeyAicjQ5IiwgNDksIFJFRyB9LCB7ICJyNTAiLCA1MCwgUkVHIH0sIHsgInI1MSIsIDUxLCBSRUcgfSwKLSAgeyAicjUyIiwgNTIsIFJFRyB9LCB7ICJyNTMiLCA1MywgUkVHIH0sIHsgInI1NCIsIDU0LCBSRUcgfSwgeyAicjU1IiwgNTUsIFJFRyB9LAotICB7ICJyNTYiLCA1NiwgUkVHIH0sIHsgInI1NyIsIDU3LCBSRUcgfSwgeyAicjU4IiwgNTgsIFJFRyB9LCB7ICJyNTkiLCA1OSwgUkVHIH0sCi0gIHsgImxwX2NvdW50IiwgNjAsIFJFRyB9LAotCi0gIC8qIEknZCBwcmVmZXIgdG8gb3V0cHV0IHRoZXNlIGFzICJmcCIgYW5kICJzcCIgYnkgZGVmYXVsdCwgYnV0IHdlIHN0aWxsIG5lZWQKLSAgICAgdG8gcmVjb2duaXplIHRoZSBjYW5vbmljYWwgdmFsdWVzLiAgKi8KLSAgeyAicjI3IiwgMjcsIFJFRyB9LCB7ICJyMjgiLCAyOCwgUkVHIH0sCi0KLSAgLyogU29tZW9uZSBtYXkgd2lzaCB0byByZWZlciB0byB0aGVzZSBpbiB0aGlzIHdheSwgYW5kIGl0J3MgcHJvYmFibHkgYQotICAgICBnb29kIGlkZWEgdG8gcmVzZXJ2ZSB0aGVtIGFzIHN1Y2ggYW55d2F5LiAgKi8KLSAgeyAicjI5IiwgMjksIFJFRyB9LCB7ICJyMzAiLCAzMCwgUkVHIH0sIHsgInIzMSIsIDMxLCBSRUcgfSwgeyAicjYwIiwgNjAsIFJFRyB9LAotCi0gIC8qIFN0YW5kYXJkIGF1eGlsaWFyeSByZWdpc3RlcnMuICAqLwotICB7ICJzdGF0dXMiLAkwLCBBVVhSRUcgfSwKLSAgeyAic2VtYXBob3JlIiwgMSwgQVVYUkVHIH0sCi0gIHsgImxwX3N0YXJ0IiwJMiwgQVVYUkVHIH0sCi0gIHsgImxwX2VuZCIsCTMsIEFVWFJFRyB9LAotICB7ICJpZGVudGl0eSIsCTQsIEFVWFJFRyB9LAotICB7ICJkZWJ1ZyIsCTUsIEFVWFJFRyB9LAotfTsKLWNvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50ID0gc2l6ZW9mIChhcmNfcmVnX25hbWVzKSAvIHNpemVvZiAoYXJjX3JlZ19uYW1lc1swXSk7Ci0KLS8qIFRoZSBzdWZmaXggdGFibGUuCi0gICBPcGVyYW5kcyB3aXRoIHRoZSBzYW1lIG5hbWUgbXVzdCBiZSBzdG9yZWQgdG9nZXRoZXIuICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW10gPQotewotICAvKiBFbnRyeSAwIGlzIHNwZWNpYWwsIGRlZmF1bHQgdmFsdWVzIGFyZW4ndCBwcmludGVkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICAqLwotICB7ICIiLCAwLCAtMSB9LAotICB7ICJhbCIsIDAsIENPTkQgfSwKLSAgeyAicmEiLCAwLCBDT05EIH0sCi0gIHsgImVxIiwgMSwgQ09ORCB9LAotICB7ICJ6IiwgMSwgQ09ORCB9LAotICB7ICJuZSIsIDIsIENPTkQgfSwKLSAgeyAibnoiLCAyLCBDT05EIH0sCi0gIHsgInAiLCAzLCBDT05EIH0sCi0gIHsgInBsIiwgMywgQ09ORCB9LAotICB7ICJuIiwgNCwgQ09ORCB9LAotICB7ICJtaSIsIDQsIENPTkQgfSwKLSAgeyAiYyIsIDUsIENPTkQgfSwKLSAgeyAiY3MiLCA1LCBDT05EIH0sCi0gIHsgImxvIiwgNSwgQ09ORCB9LAotICB7ICJuYyIsIDYsIENPTkQgfSwKLSAgeyAiY2MiLCA2LCBDT05EIH0sCi0gIHsgImhzIiwgNiwgQ09ORCB9LAotICB7ICJ2IiwgNywgQ09ORCB9LAotICB7ICJ2cyIsIDcsIENPTkQgfSwKLSAgeyAibnYiLCA4LCBDT05EIH0sCi0gIHsgInZjIiwgOCwgQ09ORCB9LAotICB7ICJndCIsIDksIENPTkQgfSwKLSAgeyAiZ2UiLCAxMCwgQ09ORCB9LAotICB7ICJsdCIsIDExLCBDT05EIH0sCi0gIHsgImxlIiwgMTIsIENPTkQgfSwKLSAgeyAiaGkiLCAxMywgQ09ORCB9LAotICB7ICJscyIsIDE0LCBDT05EIH0sCi0gIHsgInBueiIsIDE1LCBDT05EIH0sCi0gIHsgImYiLCAxLCBGTEFHIH0sCi0gIHsgIm5kIiwgQVJDX0RFTEFZX05PTkUsIERFTEFZIH0sCi0gIHsgImQiLCBBUkNfREVMQVlfTk9STUFMLCBERUxBWSB9LAotICB7ICJqZCIsIEFSQ19ERUxBWV9KVU1QLCBERUxBWSB9LAotLyp7ICJiIiwgNywgU0laRUVYVCB9LCovCi0vKnsgImIiLCA1LCBTSVpFU0VYIH0sKi8KLSAgeyAiYiIsIDEsIFNJWkUxIH0sCi0gIHsgImIiLCAxLCBTSVpFMTAgfSwKLSAgeyAiYiIsIDEsIFNJWkUyMiB9LAotLyp7ICJ3IiwgOCwgU0laRUVYVCB9LCovCi0vKnsgInciLCA2LCBTSVpFU0VYIH0sKi8KLSAgeyAidyIsIDIsIFNJWkUxIH0sCi0gIHsgInciLCAyLCBTSVpFMTAgfSwKLSAgeyAidyIsIDIsIFNJWkUyMiB9LAotICB7ICJ4IiwgMSwgU0lHTjAgfSwKLSAgeyAieCIsIDEsIFNJR045IH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMyB9LAotICB7ICJhIiwgMSwgQUREUkVTUzEyIH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMjQgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzUgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzE0IH0sCi0gIHsgImRpIiwgMSwgQ0FDSEVCWVBBU1MyNiB9LAotfTsKLWNvbnN0IGludCBhcmNfc3VmZml4ZXNfY291bnQgPSBzaXplb2YgKGFyY19zdWZmaXhlcykgLyBzaXplb2YgKGFyY19zdWZmaXhlc1swXSk7Ci0KLS8qIEluZGV4ZWQgYnkgZmlyc3QgbGV0dGVyIG9mIG9wY29kZS4gIFBvaW50cyB0byBjaGFpbiBvZiBvcGNvZGVzIHdpdGggc2FtZQotICAgZmlyc3QgbGV0dGVyLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlX21hcFsyNiArIDFdOwotCi0vKiBJbmRleGVkIGJ5IGluc24gY29kZS4gIFBvaW50cyB0byBjaGFpbiBvZiBvcGNvZGVzIHdpdGggc2FtZSBpbnNuIGNvZGUuICAqLwotc3RhdGljIHN0cnVjdCBhcmNfb3Bjb2RlICppY29kZV9tYXBbMzJdOwotDAotLyogQ29uZmlndXJhdGlvbiBmbGFncy4gICovCi0KLS8qIFZhcmlvdXMgQVJDX0hBVkVfWFhYIGJpdHMuICAqLwotc3RhdGljIGludCBjcHVfdHlwZTsKLQotLyogVHJhbnNsYXRlIGEgYmZkX21hY2hfYXJjX3h4eCB2YWx1ZSB0byBhIEFSQ19NQUNIX1hYWCB2YWx1ZS4gICovCi0KLWludAotYXJjX2dldF9vcGNvZGVfbWFjaCAoYmZkX21hY2gsIGJpZ19wKQotICAgICBpbnQgYmZkX21hY2gsIGJpZ19wOwotewotICBzdGF0aWMgaW50IG1hY2hfdHlwZV9tYXBbXSA9Ci0gICAgewotICAgICAgQVJDX01BQ0hfQkFTRQotICAgIH07Ci0KLSAgcmV0dXJuIG1hY2hfdHlwZV9tYXBbYmZkX21hY2hdIHwgKGJpZ19wID8gQVJDX01BQ0hfQklHIDogMCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW55IHRhYmxlcyB0aGF0IG5lZWQgaXQuCi0gICBNdXN0IGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0IHVwIChvciB3aGVuIGZpcnN0IG5lZWRlZCkuCi0KLSAgIEZMQUdTIGlzIGEgc2V0IG9mIGJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIHRoZSBjcHUgd2UgaGF2ZSwKLSAgIGFuZCBpbiBwYXJ0aWN1bGFyIGF0IGxlYXN0IChvbmUgb2YpIEFSQ19NQUNIX1hYWC4gICovCi0KLXZvaWQKLWFyY19vcGNvZGVfaW5pdF90YWJsZXMgKGZsYWdzKQotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIHN0YXRpYyBpbnQgaW5pdF9wID0gMDsKLQotICBjcHVfdHlwZSA9IGZsYWdzOwotCi0gIC8qIFdlIG1heSBiZSBpbnRlbnRpb25hbGx5IGNhbGxlZCBtb3JlIHRoYW4gb25jZSAoZm9yIGV4YW1wbGUgZ2RiIHdpbGwgY2FsbAotICAgICB1cyBlYWNoIHRpbWUgdGhlIHVzZXIgc3dpdGNoZXMgY3B1KS4gIFRoZXNlIHRhYmxlcyBvbmx5IG5lZWQgdG8gYmUgaW5pdCdkCi0gICAgIG9uY2UgdGhvdWdoLiAgKi8KLSAgLyogPz8/IFdlIGNhbiByZW1vdmUgdGhlIG5lZWQgZm9yIGFyY19vcGNvZGVfc3VwcG9ydGVkIGJ5IHRha2luZyBpdCBpbnRvCi0gICAgIGFjY291bnQgaGVyZSwgYnV0IEknbSBub3Qgc3VyZSBJIHdhbnQgdG8gZG8gdGhhdCB5ZXQgKGlmIGV2ZXIpLiAgKi8KLSAgaWYgKCFpbml0X3ApCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGksbjsKLQotICAgICAgbWVtc2V0IChhcmNfb3BlcmFuZF9tYXAsIDAsIHNpemVvZiAoYXJjX29wZXJhbmRfbWFwKSk7Ci0gICAgICBuID0gc2l6ZW9mIChhcmNfb3BlcmFuZHMpIC8gc2l6ZW9mIChhcmNfb3BlcmFuZHNbMF0pOwotICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKLQlhcmNfb3BlcmFuZF9tYXBbYXJjX29wZXJhbmRzW2ldLmZtdF0gPSBpOwotCi0gICAgICBtZW1zZXQgKG9wY29kZV9tYXAsIDAsIHNpemVvZiAob3Bjb2RlX21hcCkpOwotICAgICAgbWVtc2V0IChpY29kZV9tYXAsIDAsIHNpemVvZiAoaWNvZGVfbWFwKSk7Ci0gICAgICAvKiBTY2FuIHRoZSB0YWJsZSBiYWNrd2FyZHMgc28gbWFjcm9zIGFwcGVhciBhdCB0aGUgZnJvbnQuICAqLwotICAgICAgZm9yIChpID0gYXJjX29wY29kZXNfY291bnQgLSAxOyBpID49IDA7IC0taSkKLQl7Ci0JICBpbnQgb3Bjb2RlX2hhc2ggPSBBUkNfSEFTSF9PUENPREUgKGFyY19vcGNvZGVzW2ldLnN5bnRheCk7Ci0JICBpbnQgaWNvZGVfaGFzaCA9IEFSQ19IQVNIX0lDT0RFIChhcmNfb3Bjb2Rlc1tpXS52YWx1ZSk7Ci0KLQkgIGFyY19vcGNvZGVzW2ldLm5leHRfYXNtID0gb3Bjb2RlX21hcFtvcGNvZGVfaGFzaF07Ci0JICBvcGNvZGVfbWFwW29wY29kZV9oYXNoXSA9ICZhcmNfb3Bjb2Rlc1tpXTsKLQotCSAgYXJjX29wY29kZXNbaV0ubmV4dF9kaXMgPSBpY29kZV9tYXBbaWNvZGVfaGFzaF07Ci0JICBpY29kZV9tYXBbaWNvZGVfaGFzaF0gPSAmYXJjX29wY29kZXNbaV07Ci0JfQotCi0gICAgICBpbml0X3AgPSAxOwotICAgIH0KLX0KLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIE9QQ09ERSBpcyBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmllZCBjcHUuCi0gICBDcHUgc2VsZWN0aW9uIGlzIG1hZGUgd2hlbiBjYWxsaW5nIGBhcmNfb3Bjb2RlX2luaXRfdGFibGVzJy4gICovCi0KLWludAotYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKm9wY29kZTsKLXsKLSAgaWYgKEFSQ19PUENPREVfQ1BVIChvcGNvZGUtPmZsYWdzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoQVJDX09QQ09ERV9DUFUgKG9wY29kZS0+ZmxhZ3MpICYgQVJDX0hBVkVfQ1BVIChjcHVfdHlwZSkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgT1BWQUwgaXMgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpZWQgY3B1LgotICAgQ3B1IHNlbGVjdGlvbiBpcyBtYWRlIHdoZW4gY2FsbGluZyBgYXJjX29wY29kZV9pbml0X3RhYmxlcycuICAqLwotCi1pbnQKLWFyY19vcHZhbF9zdXBwb3J0ZWQgKG9wdmFsKQotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKm9wdmFsOwotewotICBpZiAoQVJDX09QVkFMX0NQVSAob3B2YWwtPmZsYWdzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoQVJDX09QVkFMX0NQVSAob3B2YWwtPmZsYWdzKSAmIEFSQ19IQVZFX0NQVSAoY3B1X3R5cGUpKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBpbnNuIGluIHRoZSBjaGFpbiBmb3IgYXNzZW1ibGluZyBJTlNOLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKgotYXJjX29wY29kZV9sb29rdXBfYXNtIChpbnNuKQotICAgICBjb25zdCBjaGFyICppbnNuOwotewotICByZXR1cm4gb3Bjb2RlX21hcFtBUkNfSEFTSF9PUENPREUgKGluc24pXTsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBpbnNuIGluIHRoZSBjaGFpbiBmb3IgZGlzYXNzZW1ibGluZyBJTlNOLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKgotYXJjX29wY29kZV9sb29rdXBfZGlzIChpbnNuKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLXsKLSAgcmV0dXJuIGljb2RlX21hcFtBUkNfSEFTSF9JQ09ERSAoaW5zbildOwotfQotDAotLyogTm9uemVybyBpZiB3ZSd2ZSBzZWVuIGFuICdmJyBzdWZmaXggKGluIGNlcnRhaW4gaW5zbnMpLiAgKi8KLXN0YXRpYyBpbnQgZmxhZ19wOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlICdmJyBzdWZmaXguICAqLwotc3RhdGljIGludCBmbGFnc2hpbW1faGFuZGxlZF9wOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIHNlZW4gYSAncScgc3VmZml4IChjb25kaXRpb24gY29kZSkuICAqLwotc3RhdGljIGludCBjb25kX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgaW5zZXJ0ZWQgYSBzaGltbS4gICovCi1zdGF0aWMgaW50IHNoaW1tX3A7Ci0KLS8qIFRoZSB2YWx1ZSBvZiB0aGUgc2hpbW0gd2UgaW5zZXJ0ZWQgKGVhY2ggaW5zbiBvbmx5IGdldHMgb25lIGJ1dCBpdCBjYW4KLSAgIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gICovCi1zdGF0aWMgaW50IHNoaW1tOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIGluc2VydGVkIGEgbGltbSAoZHVyaW5nIGFzc2VtYmx5KSBvciBzZWVuIGEgbGltbQotICAgKGR1cmluZyBkaXNhc3NlbWJseSkuICAqLwotc3RhdGljIGludCBsaW1tX3A7Ci0KLS8qIFRoZSB2YWx1ZSBvZiB0aGUgbGltbSB3ZSBpbnNlcnRlZC4gIEVhY2ggaW5zbiBvbmx5IGdldHMgb25lIGJ1dCBpdCBjYW4KLSAgIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gICovCi1zdGF0aWMgbG9uZyBsaW1tOwotDAotLyogSW5zZXJ0aW9uIGZ1bmN0aW9ucy4gICovCi0KLS8qIENhbGxlZCBieSB0aGUgYXNzZW1ibGVyIGJlZm9yZSBwYXJzaW5nIGFuIGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotYXJjX29wY29kZV9pbml0X2luc2VydCAoKQotewotICBmbGFnX3AgPSAwOwotICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMDsKLSAgY29uZF9wID0gMDsKLSAgc2hpbW1fcCA9IDA7Ci0gIGxpbW1fcCA9IDA7Ci19Ci0KLS8qIENhbGxlZCBieSB0aGUgYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGUgaW5zbiBoYXMgYSBsaW1tIG9wZXJhbmQuCi0gICBBbHNvIGNhbGxlZCBieSB0aGUgZGlzYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGUgaW5zbiBjb250YWlucyBhIGxpbW0uICAqLwotCi1pbnQKLWFyY19vcGNvZGVfbGltbV9wIChsaW1tcCkKLSAgICAgbG9uZyAqbGltbXA7Ci17Ci0gIGlmIChsaW1tcCkKLSAgICAqbGltbXAgPSBsaW1tOwotICByZXR1cm4gbGltbV9wOwotfQotCi0vKiBJbnNlcnQgYSB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXIgZmllbGQuCi0gICBJZiBSRUcgaXMgTlVMTCwgdGhlbiB0aGlzIGlzIGFjdHVhbGx5IGEgY29uc3RhbnQuCi0KLSAgIFdlIG11c3QgYWxzbyBoYW5kbGUgYXV4aWxpYXJ5IHJlZ2lzdGVycyBmb3IgbHIvc3IgaW5zbnMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9yZWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOwotCi0gIGlmIChyZWcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgY29uc3RhbnQgdGhhdCBhbHNvIHJlcXVpcmVzIGEgdmFsdWUgc3RvcmVkIGluIGEgcmVnaXN0ZXIKLQkgZmllbGQuICBIYW5kbGUgdGhlc2UgYnkgdXBkYXRpbmcgdGhlIHJlZ2lzdGVyIGZpZWxkIGFuZCBzYXZpbmcgdGhlCi0JIHZhbHVlIGZvciBsYXRlciBoYW5kbGluZyBieSBlaXRoZXIgJVMgKHNoaW1tKSBvciAlTCAobGltbSkuICAqLwotCi0gICAgICAvKiBUcnkgdG8gdXNlIGEgc2hpbW0gdmFsdWUgYmVmb3JlIGEgbGltbSBvbmUuICAqLwotICAgICAgaWYgKEFSQ19TSElNTV9DT05TVF9QICh2YWx1ZSkKLQkgIC8qIElmIHdlJ3ZlIHNlZW4gYSBjb25kaXRpb25hbCBzdWZmaXggd2UgaGF2ZSB0byB1c2UgYSBsaW1tLiAgKi8KLQkgICYmICFjb25kX3AKLQkgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBhIHNoaW1tIHZhbHVlIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4gb3VycwotCSAgICAgd2UgaGF2ZSB0byB1c2UgYSBsaW1tLiAgKi8KLQkgICYmICghc2hpbW1fcCB8fCBzaGltbSA9PSB2YWx1ZSkpCi0JewotCSAgaW50IG1hcmtlciA9IGZsYWdfcCA/IEFSQ19SRUdfU0hJTU1fVVBEQVRFIDogQVJDX1JFR19TSElNTTsKLQkgIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAxOwotCSAgc2hpbW1fcCA9IDE7Ci0JICBzaGltbSA9IHZhbHVlOwotCSAgaW5zbiB8PSBtYXJrZXIgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0JICAvKiBpbnNuIHw9IHZhbHVlICYgNTExOyAtIGRvbmUgbGF0ZXIgKi8KLQl9Ci0gICAgICAvKiBXZSBoYXZlIHRvIHVzZSBhIGxpbW0uICBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb25lIHRoZXkgbXVzdCBtYXRjaC4gICovCi0gICAgICBlbHNlIGlmICghbGltbV9wIHx8IGxpbW0gPT0gdmFsdWUpCi0JewotCSAgbGltbV9wID0gMTsKLQkgIGxpbW0gPSB2YWx1ZTsKLQkgIGluc24gfD0gQVJDX1JFR19MSU1NIDw8IG9wZXJhbmQtPnNoaWZ0OwotCSAgLyogVGhlIGNvbnN0YW50IGlzIHN0b3JlZCBsYXRlci4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgICplcnJtc2cgPSBfKCJ1bmFibGUgdG8gZml0IGRpZmZlcmVudCB2YWx1ZWQgY29uc3RhbnRzIGludG8gaW5zdHJ1Y3Rpb24iKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBoYW5kbGUgYm90aCBub3JtYWwgYW5kIGF1eGlsaWFyeSByZWdpc3RlcnMuICAqLwotCi0gICAgICBpZiAocmVnLT50eXBlID09IEFVWFJFRykKLQl7Ci0JICBpZiAoIShtb2RzICYgQVJDX01PRF9BVVhSRUcpKQotCSAgICAqZXJybXNnID0gXygiYXV4aWxpYXJ5IHJlZ2lzdGVyIG5vdCBhbGxvd2VkIGhlcmUiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc24gfD0gQVJDX1JFR19TSElNTSA8PCBvcGVyYW5kLT5zaGlmdDsKLQkgICAgICBpbnNuIHw9IHJlZy0+dmFsdWUgPDwgYXJjX29wZXJhbmRzW3JlZy0+dHlwZV0uc2hpZnQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBhbiBpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciBoZXJlLiAgKi8KLQkgIGlmICgodW5zaWduZWQgaW50KSByZWctPnZhbHVlID4gNjApCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIHNwcmludGYgKGJ1ZiwgXygiaW52YWxpZCByZWdpc3RlciBudW1iZXIgYCVkJyIpLCByZWctPnZhbHVlKTsKLQkgICAgICAqZXJybXNnID0gYnVmOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGluc24gfD0gcmVnLT52YWx1ZSA8PCBvcGVyYW5kLT5zaGlmdDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgd2hlbiB3ZSBzZWUgYW4gJ2YnIGZsYWcuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9mbGFnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICAvKiBXZSBjYW4ndCBzdG9yZSBhbnl0aGluZyBpbiB0aGUgaW5zbiB1bnRpbCB3ZSd2ZSBwYXJzZWQgdGhlIHJlZ2lzdGVycy4KLSAgICAgSnVzdCByZWNvcmQgdGhlIGZhY3QgdGhhdCB3ZSd2ZSBnb3QgdGhpcyBmbGFnLiAgYGluc2VydF9yZWcnIHdpbGwgdXNlIGl0Ci0gICAgIHRvIHN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlIChBUkNfUkVHX1NISU1NX1VQREFURSBvciBiaXQgMHgxMDApLiAgKi8KLSAgZmxhZ19wID0gMTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGFmdGVyIGNvbXBsZXRlbHkgYnVpbGRpbmcgYW4gaW5zbiB0byBlbnN1cmUgdGhlICdmJyBmbGFnIGdldHMgc2V0Ci0gICBwcm9wZXJseS4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gc2V0IHRoaXMgZmxhZyB1bnRpbAotICAgd2UndmUgcGFyc2VkIHRoZSByZWdpc3RlcnMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9mbGFnZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZmxhZ19wICYmICFmbGFnc2hpbW1faGFuZGxlZF9wKQotICAgIHsKLSAgICAgIGlmIChzaGltbV9wKQotCWFib3J0ICgpOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgICBpbnNuIHw9ICgxIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgd2hlbiB3ZSBzZWUgYSBjb25kaXRpb25hbCBmbGFnIChlZzogLmVxKS4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2NvbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGNvbmRfcCA9IDE7Ci0gIGluc24gfD0gKHZhbHVlICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogVXNlZCBpbiB0aGUgImoiIGluc3RydWN0aW9uIHRvIHByZXZlbnQgY29uc3RhbnRzIGZyb20gYmVpbmcgaW50ZXJwcmV0ZWQgYXMKLSAgIHNoaW1tIHZhbHVlcyAod2hpY2ggdGhlIGp1bXAgaW5zbiBkb2Vzbid0IGFjY2VwdCkuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWQKLSAgIHRvIGZvcmNlIHRoZSB1c2Ugb2YgbGltbSB2YWx1ZXMgaW4gb3RoZXIgc2l0dWF0aW9ucyAoZWc6IGxkIHIwLFtmb29dIHVzZXMKLSAgIHRoaXMpLgotICAgPz8/IFRoZSBtZWNoYW5pc20gaXMgc291bmQuICBBY2Nlc3MgdG8gaXQgaXMgYSBiaXQga2x1bmt5IHJpZ2h0IG5vdy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZvcmNlbGltbSAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uZF9wID0gMTsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIFVzZWQgaW4gbGQvc3QgaW5zbnMgdG8gaGFuZGxlIHRoZSBzaGltbSBvZmZzZXQgZmllbGQuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9zaGltbW9mZnNldCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgbG9uZyBtaW52YWwsIG1heHZhbDsKLSAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgaWYgKHJlZyAhPSBOVUxMKQotICAgIHsKLSAgICAgICplcnJtc2cgPSAicmVnaXN0ZXIgYXBwZWFycyB3aGVyZSBzaGltbSB2YWx1ZSBleHBlY3RlZCI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyAqd2F5KiBtb3JlIGdlbmVyYWwgdGhhbiBuZWNlc3NhcnksIGJ1dCBtYXliZSBzb21lIGRheSBpdCdsbAotCSBiZSB1c2VmdWwuICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCXsKLQkgIG1pbnZhbCA9IC0oMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQkgIG1heHZhbCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWludmFsID0gMDsKLQkgIG1heHZhbCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQl9Ci0gICAgICBpZiAodmFsdWUgPCBtaW52YWwgfHwgdmFsdWUgPiBtYXh2YWwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIHNwcmludGYgKGJ1ZiwgXygidmFsdWUgd29uJ3QgZml0IGluIHJhbmdlICVsZCAtICVsZCIpLAotCQkgICBtaW52YWwsIG1heHZhbCk7Ci0JICAqZXJybXNnID0gYnVmOwotCX0KLSAgICAgIGVsc2UKLQlpbnNuIHw9ICh2YWx1ZSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBVc2VkIGluIGxkL3N0IGluc25zIHdoZW4gdGhlIHNoaW1tIG9mZnNldCBpcyAwLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfc2hpbW16ZXJvIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBzaGltbV9wID0gMTsKLSAgc2hpbW0gPSAwOwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBub3JtYWwgaW5zbnMgKGVnOiBhZGQpIHRvIGluc2VydCBhIHNoaW1tCi0gICB2YWx1ZSAoaWYgcHJlc2VudCkgaW50byB0aGUgaW5zbi4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3NoaW1tZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoc2hpbW1fcCkKLSAgICBpbnNuIHw9IChzaGltbSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIHByb2Nlc3Npbmcgbm9ybWFsIGluc25zIChlZzogYWRkKSB0byBpbnNlcnQgYSBsaW1tCi0gICB2YWx1ZSAoaWYgcHJlc2VudCkgaW50byB0aGUgaW5zbi4KLQotICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCB0byBoYW5kbGUgaW5zdHJ1Y3Rpb25zICh3aXRoIDQgYnl0ZQotICAgaW1tZWRpYXRlIG9wZXJhbmRzKS4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBoYW5kbGUgZGF0YS4gICovCi0KLS8qID8/PyBBY3R1YWxseSwgdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byBkbyBhcyB3ZSBjYW4ndCBjYWxsIGZyYWdfbW9yZSwgdGhlCi0gICBjYWxsZXIgbXVzdCBkbyB0aGF0LiAgVGhlIGV4dHJhY3QgZm5zIHRha2UgYSBwb2ludGVyIHRvIHR3byB3b3Jkcy4gIFRoZQotICAgaW5zZXJ0IGZucyBjb3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHRoZW4gd2UgY291bGQgZG8gc29tZXRoaW5nIHVzZWZ1bCwgYnV0Ci0gICB0aGVuIHRoZSByZWxvYyBoYW5kbGVycyB3b3VsZCBoYXZlIHRvIGtub3cgdG8gd29yayBvbiB0aGUgc2Vjb25kIHdvcmQgb2YKLSAgIGEgMiB3b3JkIHF1YW50aXR5LiAgVGhhdCdzIHRvbyBtdWNoIHNvIHdlIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfbGltbWZpbmlzaCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGxpbW1fcCkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8sIGdhcyBkb2VzIGl0ICovCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB1bmFyeSBvcGVyYW5kIG1hY3JvcyB0byBjb3B5IHRoZSBCIGZpZWxkIHRvIEMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF91bm9wbWFjcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGluc24gfD0gKChpbnNuID4+IEFSQ19TSElGVF9SRUdCKSAmIEFSQ19NQVNLX1JFRykgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBJbnNlcnQgYSByZWxhdGl2ZSBhZGRyZXNzIGZvciBhIGJyYW5jaCBpbnNuIChiLCBibCwgb3IgbHApLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfcmVsYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlICYgMykKLSAgICAqZXJybXNnID0gXygiYnJhbmNoIGFkZHJlc3Mgbm90IG9uIDQgYnl0ZSBib3VuZGFyeSIpOwotICBpbnNuIHw9ICgodmFsdWUgPj4gMikgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBJbnNlcnQgYSBsaW1tIHZhbHVlIGFzIGEgMjYgYml0IGFkZHJlc3MgcmlnaHQgc2hpZnRlZCAyIGludG8gdGhlIGluc24uCi0KLSAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW50ZW5kZWQgdG8gaGFuZGxlIGluc3RydWN0aW9ucyAod2l0aCA0IGJ5dGUKLSAgIGltbWVkaWF0ZSBvcGVyYW5kcykuICBJdCBpcyBub3QgaW50ZW5kZWQgdG8gaGFuZGxlIGRhdGEuICAqLwotCi0vKiA/Pz8gQWN0dWFsbHksIHRoZXJlJ3Mgbm90aGluZyBmb3IgdXMgdG8gZG8gYXMgd2UgY2FuJ3QgY2FsbCBmcmFnX21vcmUsIHRoZQotICAgY2FsbGVyIG11c3QgZG8gdGhhdC4gIFRoZSBleHRyYWN0IGZucyB0YWtlIGEgcG9pbnRlciB0byB0d28gd29yZHMuICBUaGUKLSAgIGluc2VydCBmbnMgY291bGQgYmUgY29udmVydGVkIGFuZCB0aGVuIHdlIGNvdWxkIGRvIHNvbWV0aGluZyB1c2VmdWwsIGJ1dAotICAgdGhlbiB0aGUgcmVsb2MgaGFuZGxlcnMgd291bGQgaGF2ZSB0byBrbm93IHRvIHdvcmsgb24gdGhlIHNlY29uZCB3b3JkIG9mCi0gICBhIDIgd29yZCBxdWFudGl0eS4gIFRoYXQncyB0b28gbXVjaCBzbyB3ZSBkb24ndCBoYW5kbGUgdGhlbS4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2Fic2FkZHIgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChsaW1tX3ApCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIHJldHVybiBpbnNuOwotfQotDAotLyogRXh0cmFjdGlvbiBmdW5jdGlvbnMuCi0KLSAgIFRoZSBzdWZmaXggZXh0cmFjdGlvbiBmdW5jdGlvbnMnIHJldHVybiB2YWx1ZSBpcyByZWR1bmRhbnQgc2luY2UgaXQgY2FuIGJlCi0gICBvYnRhaW5lZCBmcm9tICgqT1BWQUwpLT52YWx1ZS4gIEhvd2V2ZXIsIHRoZSBib29sZWFuIHN1ZmZpeGVzIGRvbid0IGhhdmUKLSAgIGEgc3VmZml4IHRhYmxlIGVudHJ5IGZvciB0aGUgImZhbHNlIiBjYXNlLCBzbyB2YWx1ZXMgb2YgemVybyBtdXN0IGJlCi0gICBvYnRhaW5lZCBmcm9tIHRoZSByZXR1cm4gdmFsdWUgKCpPUFZBTCA9PSBOVUxMKS4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmxvb2t1cF9yZWdpc3RlciAoaW50IHR5cGUsIGxvbmcgcmVnbm8pOwotCi0vKiBDYWxsZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBiZWZvcmUgcHJpbnRpbmcgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi12b2lkCi1hcmNfb3Bjb2RlX2luaXRfZXh0cmFjdCAoKQotewotICBmbGFnX3AgPSAwOwotICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMDsKLSAgc2hpbW1fcCA9IDA7Ci0gIGxpbW1fcCA9IDA7Ci19Ci0KLS8qIEFzIHdlJ3JlIGV4dHJhY3RpbmcgcmVnaXN0ZXJzLCBrZWVwIGFuIGV5ZSBvdXQgZm9yIHRoZSAnZicgaW5kaWNhdG9yCi0gICAoQVJDX1JFR19TSElNTV9VUERBVEUpLiAgSWYgd2UgZmluZCBhIHJlZ2lzdGVyIChub3QgYSBjb25zdGFudCBtYXJrZXIsCi0gICBsaWtlIEFSQ19SRUdfU0hJTU0pLCBzZXQgT1BWQUwgc28gb3VyIGNhbGxlciB3aWxsIGtub3cgdGhpcyBpcyBhIHJlZ2lzdGVyLgotCi0gICBXZSBtdXN0IGFsc28gaGFuZGxlIGF1eGlsaWFyeSByZWdpc3RlcnMgZm9yIGxyL3NyIGluc25zLiAgVGhleSBhcmUganVzdAotICAgY29uc3RhbnRzIHdpdGggc3BlY2lhbCBuYW1lcy4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X3JlZyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgb3B2YWwsIGludmFsaWQpCi0gICAgIGFyY19pbnNuICppbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbDsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpbnQgcmVnbm87Ci0gIGxvbmcgdmFsdWU7Ci0KLSAgLyogR2V0IHRoZSByZWdpc3RlciBudW1iZXIuICAqLwotICByZWdubyA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCi0gIC8qIElzIGl0IGEgY29uc3RhbnQgbWFya2VyPyAgKi8KLSAgaWYgKHJlZ25vID09IEFSQ19SRUdfU0hJTU0pCi0gICAgewotICAgICAgdmFsdWUgPSBpbnNuWzBdICYgNTExOwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkKLQkgICYmICh2YWx1ZSAmIDI1NikpCi0JdmFsdWUgLT0gNTEyOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA9PSBBUkNfUkVHX1NISU1NX1VQREFURSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMF0gJiA1MTE7Ci0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgMjU2KSkKLQl2YWx1ZSAtPSA1MTI7Ci0gICAgICBmbGFnX3AgPSAxOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA9PSBBUkNfUkVHX0xJTU0pCi0gICAgewotICAgICAgdmFsdWUgPSBpbnNuWzFdOwotICAgICAgbGltbV9wID0gMTsKLSAgICB9Ci0gIC8qIEl0J3MgYSByZWdpc3Rlciwgc2V0IE9QVkFMICh0aGF0J3MgdGhlIG9ubHkgd2F5IHdlIGRpc3Rpbmd1aXNoIHJlZ2lzdGVycwotICAgICBmcm9tIGNvbnN0YW50cyBoZXJlKS4gICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IGxvb2t1cF9yZWdpc3RlciAoUkVHLCByZWdubyk7Ci0KLSAgICAgIGlmIChyZWcgPT0gTlVMTCkKLQlhYm9ydCAoKTsKLSAgICAgIGlmIChvcHZhbCAhPSBOVUxMKQotCSpvcHZhbCA9IHJlZzsKLSAgICAgIHZhbHVlID0gcmVnbm87Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgZmllbGQgdGFrZXMgYW4gYXV4aWxpYXJ5IHJlZ2lzdGVyLCBzZWUgaWYgaXQncyBhIGtub3duIG9uZS4gICovCi0gIGlmICgobW9kcyAmIEFSQ19NT0RfQVVYUkVHKQotICAgICAgJiYgQVJDX1JFR19DT05TVEFOVF9QIChyZWdubykpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcgPSBsb29rdXBfcmVnaXN0ZXIgKEFVWFJFRywgdmFsdWUpOwotCi0gICAgICAvKiBUaGlzIGlzIHJlYWxseSBhIGNvbnN0YW50LCBidXQgdGVsbCB0aGUgY2FsbGVyIGl0IGhhcyBhIHNwZWNpYWwKLQkgbmFtZS4gICovCi0gICAgICBpZiAocmVnICE9IE5VTEwgJiYgb3B2YWwgIT0gTlVMTCkKLQkqb3B2YWwgPSByZWc7Ci0gICAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgImZsYWcgdXBkYXRlIiBmaWVsZCBmb3Igc2hpbW0gaW5zbnMuCi0gICBUaGlzIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgZmllbGQuICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9mbGFnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGludCBmOwotICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnZhbDsKLQotICBpZiAoZmxhZ3NoaW1tX2hhbmRsZWRfcCkKLSAgICBmID0gZmxhZ19wICE9IDA7Ci0gIGVsc2UKLSAgICBmID0gKGluc25bMF0gJiAoMSA8PCBvcGVyYW5kLT5zaGlmdCkpICE9IDA7Ci0KLSAgLyogVGhlcmUgaXMgbm8gdGV4dCBmb3IgemVybyB2YWx1ZXMuICAqLwotICBpZiAoZiA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgMSk7Ci0gIGlmIChvcHZhbCAhPSBOVUxMICYmIHZhbCAhPSBOVUxMKQotICAgICpvcHZhbCA9IHZhbDsKLSAgcmV0dXJuIHZhbC0+dmFsdWU7Ci19Ci0KLS8qIEV4dHJhY3QgdGhlIGNvbmRpdGlvbiBjb2RlIChpZiBpdCBleGlzdHMpLgotICAgSWYgd2UndmUgc2VlbiBhIHNoaW1tIHZhbHVlIGluIHRoaXMgaW5zbiAobWVhbmluZyB0aGF0IHRoZSBpbnNuIGNhbid0IGhhdmUKLSAgIGEgY29uZGl0aW9uIGNvZGUgZmllbGQpLCB0aGVuIHdlIGRvbid0IHN0b3JlIGFueXRoaW5nIGluIE9QVkFMIGFuZCByZXR1cm4KLSAgIHplcm8uICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9jb25kIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgY29uZDsKLSAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICp2YWw7Ci0KLSAgaWYgKGZsYWdzaGltbV9oYW5kbGVkX3ApCi0gICAgcmV0dXJuIDA7Ci0KLSAgY29uZCA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICB2YWwgPSBhcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggKG9wZXJhbmQsIGNvbmQpOwotCi0gIC8qIElnbm9yZSBOVUxMIHZhbHVlcyBvZiBgdmFsJy4gIFNldmVyYWwgY29uZGl0aW9uIGNvZGUgdmFsdWVzIGFyZQotICAgICByZXNlcnZlZCBmb3IgZXh0ZW5zaW9ucy4gICovCi0gIGlmIChvcHZhbCAhPSBOVUxMICYmIHZhbCAhPSBOVUxMKQotICAgICpvcHZhbCA9IHZhbDsKLSAgcmV0dXJuIGNvbmQ7Ci19Ci0KLS8qIEV4dHJhY3QgYSBicmFuY2ggYWRkcmVzcy4KLSAgIFdlIHJldHVybiB0aGUgdmFsdWUgYXMgYSByZWFsIGFkZHJlc3MgKG5vdCByaWdodCBzaGlmdGVkIGJ5IDIpLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmVsYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgb3B2YWwsIGludmFsaWQpCi0gICAgIGFyY19pbnNuICppbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbDsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIGFkZHI7Ci0KLSAgYWRkciA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotICAgICAgJiYgKGFkZHIgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkpCi0gICAgYWRkciAtPSAxIDw8IG9wZXJhbmQtPmJpdHM7Ci0KLSAgcmV0dXJuIGFkZHIgPDwgMjsKLX0KLQotLyogVGhlIG9ubHkgdGhpbmcgdGhpcyBkb2VzIGlzIHNldCB0aGUgYGludmFsaWQnIGZsYWcgaWYgQiAhPSBDLgotICAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgIm1vdiIgbWFjcm8gYXBwZWFycyBiZWZvcmUgaXQncyByZWFsIGluc24gImFuZCIKLSAgIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBkaXNhc3NlbWJsZXIgdG8gY29uZnVzZSB0aGVtLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfdW5vcG1hY3JvIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIC8qIFRoaXMgbWlzc2VzIHRoZSBjYXNlIHdoZXJlIEIgPT0gQVJDX1JFR19TSElNTV9VUERBVEUgJiYKLSAgICAgQyA9PSBBUkNfUkVHX1NISU1NIChvciB2aWNlIHZlcnNhKS4gIE5vIGJpZyBkZWFsLiAgVGhvc2UgaW5zbnMgd2lsbCBnZXQKLSAgICAgcHJpbnRlZCBhcyAiYW5kInMuICAqLwotICBpZiAoKChpbnNuWzBdID4+IEFSQ19TSElGVF9SRUdCKSAmIEFSQ19NQVNLX1JFRykKLSAgICAgICE9ICgoaW5zblswXSA+PiBBUkNfU0hJRlRfUkVHQykgJiBBUkNfTUFTS19SRUcpKQotICAgIGlmIChpbnZhbGlkICE9IE5VTEwpCi0gICAgICAqaW52YWxpZCA9IDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFV0aWxpdHkgZm9yIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9ucyB0byByZXR1cm4gdGhlIGluZGV4IGludG8KLSAgIGBhcmNfc3VmZml4ZXMnLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoKLWFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAodHlwZSwgdmFsdWUpCi0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqdHlwZTsKLSAgICAgaW50IHZhbHVlOwotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnYsKmVuZDsKLQotICAvKiA/Pz8gVGhpcyBpcyBhIGxpdHRsZSBzbG93IGFuZCBjYW4gYmUgc3BlZWRlZCB1cC4gICovCi0KLSAgZm9yICh2ID0gYXJjX3N1ZmZpeGVzLCBlbmQgPSBhcmNfc3VmZml4ZXMgKyBhcmNfc3VmZml4ZXNfY291bnQ7IHYgPCBlbmQ7ICsrdikKLSAgICBpZiAodHlwZSA9PSAmYXJjX29wZXJhbmRzW3YtPnR5cGVdCi0JJiYgdmFsdWUgPT0gdi0+dmFsdWUpCi0gICAgICByZXR1cm4gdjsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKgotbG9va3VwX3JlZ2lzdGVyICh0eXBlLCByZWdubykKLSAgICAgaW50IHR5cGU7Ci0gICAgIGxvbmcgcmVnbm87Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqciwqZW5kOwotCi0gIGlmICh0eXBlID09IFJFRykKLSAgICByZXR1cm4gJmFyY19yZWdfbmFtZXNbcmVnbm9dOwotCi0gIC8qID8/PyBUaGlzIGlzIGEgbGl0dGxlIHNsb3cgYW5kIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLQotICBmb3IgKHIgPSBhcmNfcmVnX25hbWVzLCBlbmQgPSBhcmNfcmVnX25hbWVzICsgYXJjX3JlZ19uYW1lc19jb3VudDsKLSAgICAgICByIDwgZW5kOyArK3IpCi0gICAgaWYgKHR5cGUgPT0gci0+dHlwZQkmJiByZWdubyA9PSByLT52YWx1ZSkKLSAgICAgIHJldHVybiByOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJtLWRpcy5jIGIvb3Bjb2Rlcy9hcm0tZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDRiZjguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcm0tZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjkgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gcHJpbnRpbmcgY29kZSBmb3IgdGhlIEFSTQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotICAgTW9kaWZpY2F0aW9uIGJ5IEphbWVzIEcuIFNtaXRoIChqc21pdGhAY3lnbnVzLmNvLnVrKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBsaWJvcGNvZGVzLiAKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLXRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4gCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi1tb3JlIGRldGFpbHMuIAotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlICJhcm0tb3BjLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkbid0IGJlIGRvbmUgaGVyZSAqLwotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvYXJtLmgiCi0KLXN0YXRpYyBjaGFyICogYXJtX2NvbmRpdGlvbmFsW10gPQoteyJlcSIsICJuZSIsICJjcyIsICJjYyIsICJtaSIsICJwbCIsICJ2cyIsICJ2YyIsCi0gImhpIiwgImxzIiwgImdlIiwgImx0IiwgImd0IiwgImxlIiwgIiIsICJudiJ9OwotCi1zdGF0aWMgY2hhciAqIGFybV9yZWduYW1lc19yYXdbXSA9Ci17InIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUifTsKLQotc3RhdGljIGNoYXIgKiBhcm1fcmVnbmFtZXNfc3RhbmRhcmRbXSA9Ci17InIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAic3AiLCAibHIiLCAicGMifTsKLQotc3RhdGljIGNoYXIgKiBhcm1fcmVnbmFtZXNfYXBjc1tdID0KLXsiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAidjEiLCAidjIiLCAidjMiLCAidjQiLAotICJ2NSIsICJ2NiIsICJzbCIsICJmcCIsICJpcCIsICJzcCIsICJsciIsICJwYyJ9OwotCi0vKiBDaG9vc2Ugd2hpY2ggcmVnaXN0ZXIgbmFtZSBzZXQgdG8gdXNlLiAgKi8KLXN0YXRpYyBjaGFyICoqIGFybV9yZWduYW1lcyA9IGFybV9yZWduYW1lc19zdGFuZGFyZDsKLQotc3RhdGljIGNoYXIgKiBhcm1fZnBfY29uc3RbXSA9Ci17IjAuMCIsICIxLjAiLCAiMi4wIiwgIjMuMCIsICI0LjAiLCAiNS4wIiwgIjAuNSIsICIxMC4wIn07Ci0KLXN0YXRpYyBjaGFyICogYXJtX3NoaWZ0W10gPSAKLXsibHNsIiwgImxzciIsICJhc3IiLCAicm9yIn07Ci0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcm0KLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotCi1zdGF0aWMgdm9pZAotYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSkKLSAgICAgbG9uZyBnaXZlbjsKLSAgICAgZnByaW50Zl9mdHlwZSBmdW5jOwotICAgICB2b2lkICogc3RyZWFtOwotewotICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOwotICAKLSAgaWYgKChnaXZlbiAmIDB4ZmYwKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiAweDEwKSA9PSAwKQotCXsKLQkgIGludCBhbW91bnQgPSAoZ2l2ZW4gJiAweGY4MCkgPj4gNzsKLQkgIGludCBzaGlmdCA9IChnaXZlbiAmIDB4NjApID4+IDU7Ci0JICAKLQkgIGlmIChhbW91bnQgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzaGlmdCA9PSAzKQotCQl7Ci0JCSAgZnVuYyAoc3RyZWFtLCAiLCBycngiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICAKLQkgICAgICBhbW91bnQgPSAzMjsKLQkgICAgfQotCSAgCi0JICBmdW5jIChzdHJlYW0sICIsICVzICMlZCIsIGFybV9zaGlmdFtzaGlmdF0sIGFtb3VudCk7Ci0JfQotICAgICAgZWxzZQotCWZ1bmMgKHN0cmVhbSwgIiwgJXMgJXMiLCBhcm1fc2hpZnRbKGdpdmVuICYgMHg2MCkgPj4gNV0sCi0JICAgICAgYXJtX3JlZ25hbWVzWyhnaXZlbiAmIDB4ZjAwKSA+PiA4XSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChhbHdheXMgNCBvbiBBUk0pLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKQotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgIHBjOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci0gICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW47Ci17Ci0gIHN0cnVjdCBhcm1fb3Bjb2RlICogIGluc247Ci0gIHZvaWQgKiAgICAgICAgICAgICAgIHN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSAgICAgICAgZnVuYyAgID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGZvciAoaW5zbiA9IGFybV9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKLSAgICB7Ci0gICAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCi0JewotCSAgY2hhciAqIGM7Ci0JICAKLQkgIGZvciAoYyA9IGluc24tPmFzc2VtYmxlcjsgKmM7IGMrKykKLQkgICAgewotCSAgICAgIGlmICgqYyA9PSAnJScpCi0JCXsKLQkJICBzd2l0Y2ggKCorK2MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICclJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJSUiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ2EnOgotCQkgICAgICBpZiAoKChnaXZlbiAmIDB4MDAwZjAwMDApID09IDB4MDAwZjAwMDApCi0JCQkgICYmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKSkKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZmY7Ci0JCQkgIAotCQkJICBmdW5jIChzdHJlYW0sICJbcGMiKTsKLSAKLQkJCSAgaWYgKGdpdmVuICYgMHgwMTAwMDAwMCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQlvZmZzZXQgPSAtIG9mZnNldDsKLQkJCSAgCi0JCQkgICAgICAvKiBwcmUtaW5kZXhlZCAqLwotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiLCAjJXhdIiwgb2Zmc2V0KTsKLQotCQkJICAgICAgb2Zmc2V0ICs9IHBjICsgODsKLQotCQkJICAgICAgLyogQ29wZSB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiB3cml0ZS1iYWNrIGJlaW5nIHVzZWQuCi0JCQkJIFByb2JhYmx5IGEgdmVyeSBkYW5nZXJvdXMgdGhpbmcgZm9yIHRoZSBwcm9ncmFtbWVyCi0JCQkJIHRvIGRvLCBidXQgd2hvIGFyZSB3ZSB0byBhcmd1ZSA/ICAqLwotCQkJICAgICAgaWYgKGdpdmVuICYgMHgwMDIwMDAwMCkKLQkJCQlmdW5jIChzdHJlYW0sICIhIik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgLyogcG9zdCBpbmRleGVkICovCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdLCAjJXgiLCBvZmZzZXQpOwotCi0JCQkgICAgICBvZmZzZXQgPSBwYyArIDg7ICAvKiBpZSBpZ25vcmUgdGhlIG9mZnNldCAqLwotCQkJICAgIH0KLQkJCSAgCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIlx0OyAiKTsKLQkJCSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChvZmZzZXQsIGluZm8pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIAotCQkJCWFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKQotCQkJCXsKLQkJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZCIsCi0JCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpKTsKLQkJCQkgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkJCX0KLQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSVzIiwgCi0JCQkJICAgICgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwKSA/ICIhIiA6ICIiKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgPT0gMCkKLQkJCQl7Ci0JCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCSAgZWxzZSAKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBmdW5jIChzdHJlYW0sICJdLCAlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkgCi0JCQkJCSA/ICItIiA6ICIiKSk7Ci0JCQkJICBhcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmIDB4MDA0ZjAwMDApID09IDB4MDA0ZjAwMDApCi0JCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIHJlbGF0aXZlIHdpdGggaW1tZWRpYXRlIG9mZnNldCAqLwotCQkJICBpbnQgb2Zmc2V0ID0gKChnaXZlbiAmIDB4ZjAwKSA+PiA0KSB8IChnaXZlbiAmIDB4Zik7Ci0JCQkgIAotCQkJICBpZiAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCSAgICBvZmZzZXQgPSAtb2Zmc2V0OwotCQkJICAKLQkJCSAgZnVuYyAoc3RyZWFtLCAiW3BjLCAjJXhdXHQ7ICIsIG9mZnNldCk7Ci0JCQkgIAotCQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJCSAgICAob2Zmc2V0ICsgcGMgKyA4LCBpbmZvKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBmdW5jIChzdHJlYW0sICJbJXMiLCAKLQkJCQlhcm1fcmVnbmFtZXNbKGdpdmVuID4+IDE2KSAmIDB4Zl0pOwotCQkJICBpZiAoKGdpdmVuICYgMHgwMTAwMDAwMCkgIT0gMCkKLQkJCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUtaW5kZXhlZCAqLwotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDA0MDAwMDApID09IDB4MDA0MDAwMDApCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciAqLwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgPyAiLSIgOiAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7Ci0JCQkJfQotCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdJXMiLCAKLQkJCQkgICAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDApID8gIiEiIDogIiIpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3QtaW5kZXhlZCAqLwotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDA0MDAwMDApID09IDB4MDA0MDAwMDApCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCSAgZWxzZSAKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgKi8KLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIl0sICVzJXMiLAotCQkJCQkoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSA/ICItIiA6ICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fcmVnbmFtZXNbZ2l2ZW4gJiAweGZdKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBicmVhazsKLQkJCSAgCi0JCSAgICBjYXNlICdiJzoKLQkJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCQkoQkRJU1AgKGdpdmVuKSAqIDQgKyBwYyArIDgsIGluZm8pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnYyc6Ci0JCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwKLQkJCSAgICBhcm1fY29uZGl0aW9uYWwgWyhnaXZlbiA+PiAyOCkgJiAweGZdKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ20nOgotCQkgICAgICB7Ci0JCQlpbnQgc3RhcnRlZCA9IDA7Ci0JCQlpbnQgcmVnOwotCi0JCQlmdW5jIChzdHJlYW0sICJ7Iik7Ci0JCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDE2OyByZWcrKykKLQkJCSAgaWYgKChnaXZlbiAmICgxIDw8IHJlZykpICE9IDApCi0JCQkgICAgewotCQkJICAgICAgaWYgKHN0YXJ0ZWQpCi0JCQkJZnVuYyAoc3RyZWFtLCAiLCAiKTsKLQkJCSAgICAgIHN0YXJ0ZWQgPSAxOwotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0JCQkgICAgfQotCQkJZnVuYyAoc3RyZWFtLCAifSIpOwotCQkgICAgICB9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdvJzoKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDIwMDAwMDApICE9IDApCi0JCQl7Ci0JCQkgIGludCByb3RhdGUgPSAoZ2l2ZW4gJiAweGYwMCkgPj4gNzsKLQkJCSAgaW50IGltbWVkID0gKGdpdmVuICYgMHhmZik7Ci0JCQkgIGltbWVkID0gKCgoaW1tZWQgPDwgKDMyIC0gcm90YXRlKSkKLQkJCQkgICAgfCAoaW1tZWQgPj4gcm90YXRlKSkgJiAweGZmZmZmZmZmKTsKLQkJCSAgZnVuYyAoc3RyZWFtLCAiIyVkXHQ7IDB4JXgiLCBpbW1lZCwgaW1tZWQpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlhcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3AnOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDAwZjAwMCkgPT0gMHgwMDAwZjAwMCkKLQkJCWZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3QnOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMTIwMDAwMCkgPT0gMHgwMDIwMDAwMCkKLQkJCWZ1bmMgKHN0cmVhbSwgInQiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ2gnOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDAwMDAyMCkgPT0gMHgwMDAwMDAyMCkKLQkJCWZ1bmMgKHN0cmVhbSwgImgiKTsKLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJiIik7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdBJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgYXJtX3JlZ25hbWVzIFsoZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJewotCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmOwotCQkJICBpZiAob2Zmc2V0KQotCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiwgJXMjJWRdJXMiLAotCQkJCSAgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDAgPyAiLSIgOiAiIiksCi0JCQkJICBvZmZzZXQgKiA0LAotCQkJCSAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDAgPyAiISIgOiAiIikpOwotCQkJICBlbHNlCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmY7Ci0JCQkgIGlmIChvZmZzZXQpCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCSAgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDAgPyAiLSIgOiAiIiksCi0JCQkJICBvZmZzZXQgKiA0KTsKLQkJCSAgZWxzZQotCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0iKTsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0MnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDA5MDAwMCkKLQkJCXsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl8/Pz8iKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4OTAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl9hbGwiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4MTAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl9jdGwiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl9mbGciKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdGJzoKLQkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDA0MDgwMDApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIjQiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMSIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDQwMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMiIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIjMiKTsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCQkKLQkJICAgIGNhc2UgJ1AnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDA4MDA4MCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAicyIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDA4MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgXygiPGlsbGVnYWwgcHJlY2lzaW9uPiIpKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUSc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwNDA4MDAwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBmdW5jIChzdHJlYW0sICJzIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDgwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgImQiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4MDA0MDAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgImUiKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBmdW5jIChzdHJlYW0sICJwIik7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1InOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHg2MCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4MjA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4NDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIm0iKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBmdW5jIChzdHJlYW0sICJ6Iik7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiAKLQkJICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkJICAgICAgewotCQkJaW50IGJpdHN0YXJ0ID0gKmMrKyAtICcwJzsKLQkJCWludCBiaXRlbmQgPSAwOwotCQkJd2hpbGUgKCpjID49ICcwJyAmJiAqYyA8PSAnOScpCi0JCQkgIGJpdHN0YXJ0ID0gKGJpdHN0YXJ0ICogMTApICsgKmMrKyAtICcwJzsKLQotCQkJc3dpdGNoICgqYykKLQkJCSAgewotCQkJICBjYXNlICctJzoKLQkJCSAgICBjKys7Ci0JCQkgICAgd2hpbGUgKCpjID49ICcwJyAmJiAqYyA8PSAnOScpCi0JCQkgICAgICBiaXRlbmQgPSAoYml0ZW5kICogMTApICsgKmMrKyAtICcwJzsKLQkJCSAgICBpZiAoIWJpdGVuZCkKLQkJCSAgICAgIGFib3J0ICgpOwotCQkJICAgIHN3aXRjaCAoKmMpCi0JCQkgICAgICB7Ci0JCQkgICAgICBjYXNlICdyJzoKLQkJCQl7Ci0JCQkJICBsb25nIHJlZzsKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ2QnOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ3gnOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiMHglMDh4IiwgcmVnKTsKLQkJCQkgIAotCQkJCSAgLyogU29tZSBTV0kgaW5zdHJ1Y3Rpb25zIGhhdmUgc3BlY2lhbCBtZWFuaW5ncy4gICovCi0JCQkJICBpZiAoKGdpdmVuICYgMHgwZmZmZmZmZikgPT0gMHgwRkYwMDAwMCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQiIpOwotCQkJCSAgZWxzZSBpZiAoKGdpdmVuICYgMHgwZmZmZmZmZikgPT0gMHgwRkYwMDAwMSkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQlJhbmdlIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnWCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIlMDF4IiwgcmVnICYgMHhmKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICdmJzoKLQkJCQl7Ci0JCQkJICBsb25nIHJlZzsKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIGlmIChyZWcgPiA3KQotCQkJCSAgICBmdW5jIChzdHJlYW0sICIjJXMiLAotCQkJCQkgIGFybV9mcF9jb25zdFtyZWcgJiA3XSk7Ci0JCQkJICBlbHNlCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgImYlZCIsIHJlZyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgZGVmYXVsdDoKLQkJCQlhYm9ydCAoKTsKLQkJCSAgICAgIH0KLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAnYCc6Ci0JCQkgICAgYysrOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpID09IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAnXCcnOgotCQkJICAgIGMrKzsKLQkJCSAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgJz8nOgotCQkJICAgICsrYzsKLQkJCSAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYysrKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICorK2MpOwotCQkJICAgIGJyZWFrOwotCQkJICBkZWZhdWx0OgotCQkJICAgIGFib3J0ICgpOwotCQkJICB9Ci0JCQlicmVhazsKLQotCQkgICAgICBkZWZhdWx0OgotCQkJYWJvcnQgKCk7Ci0JCSAgICAgIH0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7Ci0JICAgIH0KLQkgIHJldHVybiA0OwotCX0KLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3RodW1iIChwYywgaW5mbywgZ2l2ZW4pCi0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLSAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBnaXZlbjsKLXsKLSAgc3RydWN0IHRodW1iX29wY29kZSAqIGluc247Ci0gIHZvaWQgKiAgICAgICAgICAgICAgICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgICAgICAgICBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGZvciAoaW5zbiA9IHRodW1iX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiBpbnNuLT5tYXNrKSA9PSBpbnNuLT52YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKiBjID0gaW5zbi0+YXNzZW1ibGVyOwotCi0gICAgICAgICAgLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBUaHVtYiAyIGluc3RydWN0aW9uIEJMIHNlcXVlbmNlOiAqLwotICAgICAgICAgIGlmICghKmMpIC8qIGNoZWNrIGZvciBlbXB0eSAobm90IE5VTEwpIGFzc2VtYmxlciBzdHJpbmcgKi8KLSAgICAgICAgICAgIHsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lICA9IDQ7Ci0JICAgICAgCi0gICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiUwNHhcdGJsXHQiLCBnaXZlbiAmIDB4ZmZmZik7Ci0gICAgICAgICAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotICAgICAgICAgICAgICAgIChCRElTUDIzIChnaXZlbikgKiAyICsgcGMgKyA0LCBpbmZvKTsKLSAgICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgID0gNDsKLQkgIAkgICAgICAKLSAgICAgICAgICAgICAgZ2l2ZW4gJj0gMHhmZmZmOwotICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlMDR4XHQiLCBnaXZlbik7Ci0JICAgICAgCi0gICAgICAgICAgICAgIGZvciAoOyAqYzsgYysrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICgqYyA9PSAnJScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9tYXNrcGMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgIGludCBkb21hc2tsciA9IDA7Ci0JCSAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKisrYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlJSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoZ2l2ZW4gPj4gMykgJiAweDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgNikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlZzsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBnaXZlbiAmIDB4NzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2l2ZW4gJiAoMSA8PCA3KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICs9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9jb25kaXRpb25hbCBbKGdpdmVuID4+IDgpICYgMHhmXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgOCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYXNrbHIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ08nOgotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJ08nICYmIChnaXZlbiAmICgxIDw8IDgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21hc2twYyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZzsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBzcG90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLCBhbmQgZ2VuZXJhdGUgdGhlIHJTLXJFIGZvcm1hdDogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJlZyA9IDA7IChyZWcgPCA4KTsgcmVnKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgcmVnKSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbWFza2xyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAibHIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb21hc2twYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAicGMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHN0YXJ0ID0gKmMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0ZW5kID0gMDsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0YXJ0ID0gKGJpdHN0YXJ0ICogMTApICsgKmMrKyAtICcwJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOwotCQkJCSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ZW5kID0gKGJpdGVuZCAqIDEwKSArICpjKysgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiaXRlbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6Ci0JCQkJICAgICAgLyogUEMtcmVsYXRpdmUgYWRkcmVzcyAtLSB0aGUgYm90dG9tIHR3bwotCQkJCQkgYml0cyBvZiB0aGUgYWRkcmVzcyBhcmUgZHJvcHBlZCBiZWZvcmUKLQkJCQkJIHRoZSBjYWxjdWxhdGlvbi4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYwotCQkJCQkoKChwYyArIDQpICYgfjMpICsgKHJlZyA8PCAyKSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiMHglMDR4IiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWcgKiAyICsgcGMgKyA0LCBpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYysrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgfQotICAgIH0KLQotICAvKiBubyBtYXRjaCAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogU2VsZWN0IGEgZGlmZmVyZW50IHJlZ2lzdGVyIG5hbWUgc2V0LgotICAgUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIHNldCBzZWxlY3RlZCBpcyB0aGUgQVBDUyBuYW1lIHNldC4gICovCi1pbnQKLWFybV90b2dnbGVfcmVnbmFtZXMgKCkKLXsKLSAgaWYgKGFybV9yZWduYW1lcyA9PSBhcm1fcmVnbmFtZXNfc3RhbmRhcmQpCi0gICAgYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX2FwY3M7Ci0gIGVsc2UKLSAgICBhcm1fcmVnbmFtZXMgPSBhcm1fcmVnbmFtZXNfc3RhbmRhcmQ7Ci0KLSAgcmV0dXJuIGFybV9yZWduYW1lcyA9PSBhcm1fcmVnbmFtZXNfYXBjczsKLX0KLQotc3RhdGljIHZvaWQKLXBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIChvcHRpb25zKQotICAgICBjaGFyICogb3B0aW9uczsKLXsKLSAgaWYgKG9wdGlvbnMgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gICAgICAKLSAgaWYgKHN0cm5jbXAgKG9wdGlvbnMsICJyZWctbmFtZXMtIiwgMTApID09IDApCi0gICAgewotICAgICAgb3B0aW9ucyArPSAxMDsKLSAgICAgIAotICAgICAgaWYgKHN0cmNtcCAob3B0aW9ucywgInN0ZCIpID09IDApCi0JYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX3N0YW5kYXJkOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChvcHRpb25zLCAiYXBjcyIpID09IDApCi0JYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX2FwY3M7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGlvbnMsICJyYXciKSA9PSAwKQotCWFybV9yZWduYW1lcyA9IGFybV9yZWduYW1lc19yYXc7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLCAiVW5yZWNvZ25pc2VkIHJlZ2lzdGVyIG5hbWUgc2V0OiAlc1xuIiwgb3B0aW9ucyk7Ci0gICAgfQotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiVW5yZWNvZ25pc2VkIGRpc2Fzc2VtYmxlciBvcHRpb246ICVzXG4iLCBvcHRpb25zKTsKLSAgCi0gIHJldHVybjsKLX0KLQotLyogTk9URTogVGhlcmUgYXJlIG5vIGNoZWNrcyBpbiB0aGVzZSByb3V0aW5lcyB0aGF0IHRoZSByZWxldmFudCBudW1iZXIgb2YgZGF0YSBieXRlcyBleGlzdCAqLwotCi1pbnQKLXByaW50X2luc25fYmlnX2FybSAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciAgICAgIGJbNF07Ci0gIGxvbmcgICAgICAgICAgICAgICBnaXZlbjsKLSAgaW50ICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgY29mZl9zeW1ib2xfdHlwZSAqIGNzOwotICBlbGZfc3ltYm9sX3R5cGUgKiAgZXM7Ci0gIGludCAgICAgICAgICAgICAgICBpc190aHVtYjsKLSAgCi0gIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucykKLSAgICB7Ci0gICAgICBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpOwotICAgICAgCi0gICAgICAvKiBUbyBhdm9pZCByZXBlYXRlZCBwYXJzaW5nIG9mIHRoaXMgb3B0aW9uLCB3ZSByZW1vdmUgaXQgaGVyZS4gICovCi0gICAgICBpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucyA9IE5VTEw7Ci0gICAgfQotICAKLSAgaXNfdGh1bWIgPSBmYWxzZTsKLSAgaWYgKGluZm8tPnN5bWJvbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotCXsKLQkgIGNzID0gY29mZnN5bWJvbCAoKmluZm8tPnN5bWJvbHMpOwotCSAgaXNfdGh1bWIgPSAoICAgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkVYVAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CTEFCRUwKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkVYVEZVTkMKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DKTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltYm9scykgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBlcyA9ICooZWxmX3N5bWJvbF90eXBlICoqKShpbmZvLT5zeW1ib2xzKTsKLQkgIGlzX3RodW1iID0gRUxGX1NUX1RZUEUgKGVzLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pID09Ci0JICAgIFNUVF9BUk1fVEZVTkM7Ci0JfQotICAgIH0KLQotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotCi0gIC8qIEFsd2F5cyBmZXRjaCB3b3JkIGFsaWduZWQgdmFsdWVzLiAgKi8KLSAgCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjICYgfiAweDMsIChiZmRfYnl0ZSAqKSAmYlswXSwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChpc190aHVtYikKLSAgICB7Ci0gICAgICBpZiAocGMgJiAweDIpCi0JewotCSAgZ2l2ZW4gPSAoYlsyXSA8PCA4KSB8IGJbM107Ci0KLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKChwYyArIDQpICYgfiAweDMsIChiZmRfYnl0ZSAqKSBiLCA0LCBpbmZvKTsKLQkgIGlmIChzdGF0dXMgIT0gMCkKLQkgICAgewotCSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIHBjICsgNCwgaW5mbyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICAKLQkgIGdpdmVuIHw9IChiWzBdIDw8IDI0KSB8IChiWzFdIDw8IDE2KTsKLQl9Ci0gICAgICBlbHNlCi0JZ2l2ZW4gPSAoYlswXSA8PCA4KSB8IGJbMV0gfCAoYlsyXSA8PCAyNCkgfCAoYlszXSA8PCAxNik7Ci0gICAgfQotICBlbHNlCi0gICAgZ2l2ZW4gPSAoYlswXSA8PCAyNCkgfCAoYlsxXSA8PCAxNikgfCAoYlsyXSA8PCA4KSB8IChiWzNdKTsKLQotICBpZiAoaXNfdGh1bWIpCi0gICAgc3RhdHVzID0gcHJpbnRfaW5zbl90aHVtYiAocGMsIGluZm8sIGdpdmVuKTsKLSAgZWxzZQotICAgIHN0YXR1cyA9IHByaW50X2luc25fYXJtIChwYywgaW5mbywgZ2l2ZW4pOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9saXR0bGVfYXJtIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICB1bnNpZ25lZCBjaGFyICAgICAgYls0XTsKLSAgbG9uZyAgICAgICAgICAgICAgIGdpdmVuOwotICBpbnQgICAgICAgICAgICAgICAgc3RhdHVzOwotICBjb2ZmX3N5bWJvbF90eXBlICogY3M7Ci0gIGVsZl9zeW1ib2xfdHlwZSAqICBlczsKLSAgaW50ICAgICAgICAgICAgICAgIGlzX3RodW1iOwotCi0gIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucykKLSAgICB7Ci0gICAgICBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpOwotICAgICAgCi0gICAgICAvKiBUbyBhdm9pZCByZXBlYXRlZCBwYXJzaW5nIG9mIHRoaXMgb3B0aW9uLCB3ZSByZW1vdmUgaXQgaGVyZS4gICovCi0gICAgICBpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucyA9IE5VTEw7Ci0gICAgfQotICAKLSAgaXNfdGh1bWIgPSBmYWxzZTsKLSAgCi0gIGlmIChpbmZvLT5zeW1ib2xzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLQl7Ci0JICBjcyA9IGNvZmZzeW1ib2wgKCppbmZvLT5zeW1ib2xzKTsKLQkgIGlzX3RodW1iID0gKCAgIGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFQKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVQKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkxBQkVMCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFRGVU5DCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFURlVOQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgZXMgPSAqKGVsZl9zeW1ib2xfdHlwZSAqKikoaW5mby0+c3ltYm9scyk7Ci0JICBpc190aHVtYiA9IEVMRl9TVF9UWVBFIChlcy0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSA9PQotCSAgICBTVFRfQVJNX1RGVU5DOwotCX0KLSAgICB9Ci0gIAotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCAoYmZkX2J5dGUgKikgJmJbMF0sIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDAgJiYgaXNfdGh1bWIpCi0gICAgewotICAgICAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLQotICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAocGMsIChiZmRfYnl0ZSAqKSBiLCAyLCBpbmZvKTsKLSAgICAgIGJbM10gPSBiWzJdID0gMDsKLSAgICB9Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGdpdmVuID0gKGJbMF0pIHwgKGJbMV0gPDwgOCkgfCAoYlsyXSA8PCAxNikgfCAoYlszXSA8PCAyNCk7Ci0KLSAgaWYgKGlzX3RodW1iKQotICAgIHN0YXR1cyA9IHByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbik7Ci0gIGVsc2UKLSAgICBzdGF0dXMgPSBwcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcm0tb3BjLmggYi9vcGNvZGVzL2FybS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhM2UxMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FybS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBUk0uCi0KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLXN0cnVjdCBhcm1fb3Bjb2RlIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtYXNrOwkvKiByZWNvZ25pc2UgaW5zdHJ1Y3Rpb24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLwotICAgIGNoYXIgKmFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi1zdHJ1Y3QgdGh1bWJfb3Bjb2RlCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqIGFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi0vKiBmb3JtYXQgb2YgdGhlIGFzc2VtYmxlciBzdHJpbmcgOgotICAgCi0gICAlJQkJCSUKLSAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+eAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGhleAotICAgJTxiaXRmaWVsZD5YCQlwcmludCB0aGUgYml0ZmllbGQgYXMgMSBoZXggZGlnaXQgd2l0aG91dCBsZWFkaW5nICIweCIKLSAgICU8Yml0ZmllbGQ+cgkJcHJpbnQgYXMgYW4gQVJNIHJlZ2lzdGVyCi0gICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhCi0JCQlmbG9hdGluZyBwb2ludCByZWdpc3RlcgotICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEpCi0gICAlUAkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KLSAgICVRCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGxkZi9zdGYgaW5zbgotICAgJVIJCQlwcmludCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2RlCi0gICAlPGJpdG51bT4nYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyBvbmUKLSAgICU8Yml0bnVtPmBjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KLSAgICU8Yml0bnVtPj9hYgkJcHJpbnQgYSBpZiBiaXQgaXMgb25lIGVsc2UgcHJpbnQgYgotICAgJXAJCQlwcmludCAncCcgaWZmIGJpdHMgMTItMTUgYXJlIDE1Ci0gICAldAkJCXByaW50ICd0JyBpZmYgYml0IDIxIHNldCBhbmQgYml0IDI0IGNsZWFyCi0gICAlaCAgICAgICAgICAgICAgICAgICBwcmludCAnaCcgaWZmIGJpdCA1IHNldCwgZWxzZSBwcmludCAnYicKLSAgICVvCQkJcHJpbnQgb3BlcmFuZDIgKGltbWVkaWF0ZSBvciByZWdpc3RlciArIHNoaWZ0KQotICAgJWEJCQlwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGluc3RydWN0aW9uCi0gICAlcyAgICAgICAgICAgICAgICAgICBwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGhhbGZ3b3JkL3NpZ25leHRlbmQgaW5zdHJ1Y3Rpb24KLSAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCi0gICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgotICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0gICAlQwkJCXByaW50IHRoZSBQU1Igc3ViIHR5cGUuCi0gICAlRgkJCXByaW50IHRoZSBDT1VOVCBmaWVsZCBvZiBhIExGTS9TRk0gaW5zdHJ1Y3Rpb24uCi1UaHVtYiBzcGVjaWZpYyBmb3JtYXQgb3B0aW9uczoKLSAgICVEICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIChiaXRzIDAuLjIgYXMgaGlnaCBudW1iZXIgaWYgYml0IDcgc2V0KQotICAgJVMgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMy4uNSBhcyBoaWdoIG51bWJlciBpZiBiaXQgNiBzZXQpCi0gICAlPGJpdGZpZWxkPkkgICAgICAgICBwcmludCBiaXRmaWVsZCBhcyBhIHNpZ25lZCBkZWNpbWFsCi0gICAJCQkJKHRvcCBiaXQgb2YgcmFuZ2UgYmVpbmcgdGhlIHNpZ24gYml0KQotICAgJU0gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzawotICAgJU4gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBMUikKLSAgICVPICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIG1hc2sgKHdpdGggUEMpCi0gICAlVCAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgOC0xMSkKLSAgICU8Yml0ZmllbGQ+QiAgICAgICAgIHByaW50IFRodW1iIGJyYW5jaCBkZXN0aW5hdGlvbiAoc2lnbmVkIGRpc3BsYWNlbWVudCkKLSAgICU8Yml0ZmllbGQ+VyAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgZGVjaW1hbAotICAgJTxiaXRmaWVsZD5IICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogMikgYXMgYSBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPmEgICAgICAgICBwcmludCAoYml0ZmllbGQgKiA0KSBhcyBhIHBjLXJlbCBvZmZzZXQgKyBkZWNvZGVkIHN5bWJvbAotKi8KLQotLyogTm90ZTogVGhlcmUgaXMgYSBwYXJ0aWFsIG9yZGVyaW5nIGluIHRoaXMgdGFibGUgLSBpdCBtdXN0IGJlIHNlYXJjaGVkIGZyb20KLSAgIHRoZSB0b3AgdG8gb2J0YWluIGEgY29ycmVjdCBtYXRjaC4gKi8KLQotc3RhdGljIHN0cnVjdCBhcm1fb3Bjb2RlIGFybV9vcGNvZGVzW10gPSB7Ci0gICAgLyogQVJNIGluc3RydWN0aW9ucyAqLwotICAgIHsweGUxYTAwMDAwLCAweGZmZmZmZmZmLCAibm9wXHRcdFx0KG1vdiByMCxyMCkifSwKLSAgICB7MHgwMTJGRkYxMCwgMHgwZmZmZmZmMCwgImJ4JWNcdCUwLTNyIn0sCi0gICAgezB4MDAwMDAwOTAsIDB4MGZlMDAwZjAsICJtdWwlYyUyMCdzXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCi0gICAgezB4MDAyMDAwOTAsIDB4MGZlMDAwZjAsICJtbGElYyUyMCdzXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyLCAlMTItMTVyIn0sCi0gICAgezB4MDEwMDAwOTAsIDB4MGZiMDBmZjAsICJzd3AlYyUyMidiXHQlMTItMTVyLCAlMC0zciwgWyUxNi0xOXJdIn0sCi0gICAgezB4MDA4MDAwOTAsIDB4MGZhMDAwZjAsICIlMjI/c3VtdWxsJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAotICAgIHsweDAwYTAwMDkwLCAweDBmYTAwMGYwLCAiJTIyP3N1bWxhbCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKLSAgICB7MHgwMDAwMDA5MCwgMHgwZTEwMDA5MCwgInN0ciVjJTYncyVoXHQlMTItMTVyLCAlcyJ9LAotICAgIHsweDAwMTAwMDkwLCAweDBlMTAwMDkwLCAibGRyJWMlNidzJWhcdCUxMi0xNXIsICVzIn0sCi0gICAgezB4MDAwMDAwMDAsIDB4MGRlMDAwMDAsICJhbmQlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwMjAwMDAwLCAweDBkZTAwMDAwLCAiZW9yJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDQwMDAwMCwgMHgwZGUwMDAwMCwgInN1YiVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDA2MDAwMDAsIDB4MGRlMDAwMDAsICJyc2IlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwODAwMDAwLCAweDBkZTAwMDAwLCAiYWRkJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMGEwMDAwMCwgMHgwZGUwMDAwMCwgImFkYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDBjMDAwMDAsIDB4MGRlMDAwMDAsICJzYmMlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwZTAwMDAwLCAweDBkZTAwMDAwLCAicnNjJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTIwZjAwMCwgMHgwZGI2ZjAwMCwgIm1zciVjXHQlMjI/c2Nwc3IlQywgJW8ifSwKLSAgICB7MHgwMTBmMDAwMCwgMHgwZmJmMGZmZiwgIm1ycyVjXHQlMTItMTVyLCAlMjI/c2Nwc3IifSwKLSAgICB7MHgwMTAwMDAwMCwgMHgwZGUwMDAwMCwgInRzdCVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDEyMDAwMDAsIDB4MGRlMDAwMDAsICJ0ZXElYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxNDAwMDAwLCAweDBkZTAwMDAwLCAiY21wJWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTYwMDAwMCwgMHgwZGUwMDAwMCwgImNtbiVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDE4MDAwMDAsIDB4MGRlMDAwMDAsICJvcnIlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxYTAwMDAwLCAweDBkZTAwMDAwLCAibW92JWMlMjAnc1x0JTEyLTE1ciwgJW8ifSwKLSAgICB7MHgwMWMwMDAwMCwgMHgwZGUwMDAwMCwgImJpYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDFlMDAwMDAsIDB4MGRlMDAwMDAsICJtdm4lYyUyMCdzXHQlMTItMTVyLCAlbyJ9LAotICAgIHsweDA0MDAwMDAwLCAweDBlMTAwMDAwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAotICAgIHsweDA2MDAwMDAwLCAweDBlMTAwZmYwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAotICAgIHsweDA0MDAwMDAwLCAweDBjMTAwMDEwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAotICAgIHsweDA2MDAwMDEwLCAweDBlMDAwMDEwLCAidW5kZWZpbmVkIn0sCi0gICAgezB4MDQxMDAwMDAsIDB4MGMxMDAwMDAsICJsZHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDgwMDAwMDAsIDB4MGUxMDAwMDAsICJzdG0lYyUyMz9pZCUyND9iYVx0JTE2LTE5ciUyMSchLCAlbSUyMideIn0sCi0gICAgezB4MDgxMDAwMDAsIDB4MGUxMDAwMDAsICJsZG0lYyUyMz9pZCUyND9iYVx0JTE2LTE5ciUyMSchLCAlbSUyMideIn0sCi0gICAgezB4MGEwMDAwMDAsIDB4MGUwMDAwMDAsICJiJTI0J2wlY1x0JWIifSwKLSAgICB7MHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgInN3aSVjXHQlMC0yM3gifSwKLQotICAgIC8qIEZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIHsweDBlMDAwMTAwLCAweDBmZjA4ZjEwLCAiYWRmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlMTAwMTAwLCAweDBmZjA4ZjEwLCAibXVmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlMjAwMTAwLCAweDBmZjA4ZjEwLCAic3VmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlMzAwMTAwLCAweDBmZjA4ZjEwLCAicnNmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlNDAwMTAwLCAweDBmZjA4ZjEwLCAiZHZmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlNTAwMTAwLCAweDBmZjA4ZjEwLCAicmRmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlNjAwMTAwLCAweDBmZjA4ZjEwLCAicG93JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlNzAwMTAwLCAweDBmZjA4ZjEwLCAicnB3JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlODAwMTAwLCAweDBmZjA4ZjEwLCAicm1mJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlOTAwMTAwLCAweDBmZjA4ZjEwLCAiZm1sJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlYTAwMTAwLCAweDBmZjA4ZjEwLCAiZmR2JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlYjAwMTAwLCAweDBmZjA4ZjEwLCAiZnJkJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlYzAwMTAwLCAweDBmZjA4ZjEwLCAicG9sJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlMDA4MTAwLCAweDBmZjA4ZjEwLCAibXZmJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlMTA4MTAwLCAweDBmZjA4ZjEwLCAibW5mJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlMjA4MTAwLCAweDBmZjA4ZjEwLCAiYWJzJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlMzA4MTAwLCAweDBmZjA4ZjEwLCAicm5kJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlNDA4MTAwLCAweDBmZjA4ZjEwLCAic3F0JWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlNTA4MTAwLCAweDBmZjA4ZjEwLCAibG9nJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlNjA4MTAwLCAweDBmZjA4ZjEwLCAibGduJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlNzA4MTAwLCAweDBmZjA4ZjEwLCAiZXhwJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlODA4MTAwLCAweDBmZjA4ZjEwLCAic2luJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlOTA4MTAwLCAweDBmZjA4ZjEwLCAiY29zJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlYTA4MTAwLCAweDBmZjA4ZjEwLCAidGFuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlYjA4MTAwLCAweDBmZjA4ZjEwLCAiYXNuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlYzA4MTAwLCAweDBmZjA4ZjEwLCAiYWNzJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlZDA4MTAwLCAweDBmZjA4ZjEwLCAiYXRuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlZTA4MTAwLCAweDBmZjA4ZjEwLCAidXJkJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlZjA4MTAwLCAweDBmZjA4ZjEwLCAibnJtJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlMDAwMTEwLCAweDBmZjAwZjFmLCAiZmx0JWMlUCVSXHQlMTYtMThmLCAlMTItMTVyIn0sCi0gICAgezB4MGUxMDAxMTAsIDB4MGZmZjBmOTgsICJmaXglYyVSXHQlMTItMTVyLCAlMC0yZiJ9LAotICAgIHsweDBlMjAwMTEwLCAweDBmZmYwZmZmLCAid2ZzJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTMwMDExMCwgMHgwZmZmMGZmZiwgInJmcyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGU0MDAxMTAsIDB4MGZmZjBmZmYsICJ3ZmMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlNTAwMTEwLCAweDBmZmYwZmZmLCAicmZjJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTkwZjExMCwgMHgwZmY4ZmZmMCwgImNtZiVjXHQlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlYjBmMTEwLCAweDBmZjhmZmYwLCAiY25mJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVkMGYxMTAsIDB4MGZmOGZmZjAsICJjbWZlJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVmMGYxMTAsIDB4MGZmOGZmZjAsICJjbmZlJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGMwMDAxMDAsIDB4MGUxMDBmMDAsICJzdGYlYyVRXHQlMTItMTRmLCAlQSJ9LAotICAgIHsweDBjMTAwMTAwLCAweDBlMTAwZjAwLCAibGRmJWMlUVx0JTEyLTE0ZiwgJUEifSwKLSAgICB7MHgwYzAwMDIwMCwgMHgwZTEwMGYwMCwgInNmbSVjXHQlMTItMTRmLCAlRiwgJUEifSwKLSAgICB7MHgwYzEwMDIwMCwgMHgwZTEwMGYwMCwgImxmbSVjXHQlMTItMTRmLCAlRiwgJUEifSwKLQotICAgIC8qIEdlbmVyaWMgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgezB4MGUwMDAwMDAsIDB4MGYwMDAwMTAsICJjZHAlY1x0JTgtMTFkLCAlMjAtMjNkLCBjciUxMi0xNWQsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAotICAgIHsweDBlMTAwMDEwLCAweDBmMTAwMDEwLCAibXJjJWNcdCU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCi0gICAgezB4MGUwMDAwMTAsIDB4MGYxMDAwMTAsICJtY3IlY1x0JTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKLSAgICB7MHgwYzAwMDAwMCwgMHgwZTEwMDAwMCwgInN0YyVjJTIyJ2xcdCU4LTExZCwgY3IlMTItMTVkLCAlQSJ9LAotICAgIHsweDBjMTAwMDAwLCAweDBlMTAwMDAwLCAibGRjJWMlMjInbFx0JTgtMTFkLCBjciUxMi0xNWQsICVBIn0sCi0gICAgLyogdGhlIHJlc3QgKi8KLSAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgifSwKLSAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0KLX07Ci0KLSNkZWZpbmUgQkRJU1AoeCkgKCgoKHgpICYgMHhmZmZmZmYpIF4gMHg4MDAwMDApIC0gMHg4MDAwMDApIC8qIDI2IGJpdCAqLwotCi1zdGF0aWMgc3RydWN0IHRodW1iX29wY29kZSB0aHVtYl9vcGNvZGVzW10gPQotewotICAvKiBUaHVtYiBpbnN0cnVjdGlvbnMgKi8KLSAgezB4NDZDMCwgMHhGRkZGLCAibm9wXHRcdFx0KG1vdiByOCxyOCkifSwgLyogZm9ybWF0IDUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCB1cGRhdGUgdGhlIFBTUiAqLwotICB7MHgxQzAwLCAweEZGQzAsICJtb3ZcdCUwLTJyLCAlMy01clx0XHQoYWRkICUwLTJyLCAlMy01ciwgIyU2LThkKSJ9LAotICAvKiBmb3JtYXQgNCAqLwotICB7MHg0MDAwLCAweEZGQzAsICJhbmRcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MDQwLCAweEZGQzAsICJlb3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MDgwLCAweEZGQzAsICJsc2xcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MEMwLCAweEZGQzAsICJsc3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTAwLCAweEZGQzAsICJhc3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTQwLCAweEZGQzAsICJhZGNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTgwLCAweEZGQzAsICJzYmNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MUMwLCAweEZGQzAsICJyb3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjAwLCAweEZGQzAsICJ0c3RcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjQwLCAweEZGQzAsICJuZWdcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjgwLCAweEZGQzAsICJjbXBcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MkMwLCAweEZGQzAsICJjbW5cdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzAwLCAweEZGQzAsICJvcnJcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzQwLCAweEZGQzAsICJtdWxcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzgwLCAweEZGQzAsICJiaWNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0M0MwLCAweEZGQzAsICJtdm5cdCUwLTJyLCAlMy01ciJ9LAotICAvKiBmb3JtYXQgMTMgKi8KLSAgezB4QjAwMCwgMHhGRjgwLCAiYWRkXHRzcCwgIyUwLTZXIn0sCi0gIHsweEIwODAsIDB4RkY4MCwgInN1Ylx0c3AsICMlMC02VyJ9LAotICAvKiBmb3JtYXQgNSAqLwotICB7MHg0NzAwLCAweEZGODAsICJieFx0JVMifSwKLSAgezB4NDQwMCwgMHhGRjAwLCAiYWRkXHQlRCwgJVMifSwKLSAgezB4NDUwMCwgMHhGRjAwLCAiY21wXHQlRCwgJVMifSwKLSAgezB4NDYwMCwgMHhGRjAwLCAibW92XHQlRCwgJVMifSwKLSAgLyogZm9ybWF0IDE0ICovCi0gIHsweEI0MDAsIDB4RkUwMCwgInB1c2hcdCVOIn0sCi0gIHsweEJDMDAsIDB4RkUwMCwgInBvcFx0JU8ifSwKLSAgLyogZm9ybWF0IDIgKi8KLSAgezB4MTgwMCwgMHhGRTAwLCAiYWRkXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCi0gIHsweDFBMDAsIDB4RkUwMCwgInN1Ylx0JTAtMnIsICUzLTVyLCAlNi04ciJ9LAotICB7MHgxQzAwLCAweEZFMDAsICJhZGRcdCUwLTJyLCAlMy01ciwgIyU2LThkIn0sCi0gIHsweDFFMDAsIDB4RkUwMCwgInN1Ylx0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKLSAgLyogZm9ybWF0IDggKi8KLSAgezB4NTIwMCwgMHhGRTAwLCAic3RyaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDVBMDAsIDB4RkUwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICB7MHg1NjAwLCAweEY2MDAsICJsZHMlMTE/aGJcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAvKiBmb3JtYXQgNyAqLwotICB7MHg1MDAwLCAweEZBMDAsICJzdHIlMTAnYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDU4MDAsIDB4RkEwMCwgImxkciUxMCdiXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgLyogZm9ybWF0IDEgKi8KLSAgezB4MDAwMCwgMHhGODAwLCAibHNsXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgezB4MDgwMCwgMHhGODAwLCAibHNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgezB4MTAwMCwgMHhGODAwLCAiYXNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgLyogZm9ybWF0IDMgKi8KLSAgezB4MjAwMCwgMHhGODAwLCAibW92XHQlOC0xMHIsICMlMC03ZCJ9LAotICB7MHgyODAwLCAweEY4MDAsICJjbXBcdCU4LTEwciwgIyUwLTdkIn0sCi0gIHsweDMwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCAjJTAtN2QifSwKLSAgezB4MzgwMCwgMHhGODAwLCAic3ViXHQlOC0xMHIsICMlMC03ZCJ9LAotICAvKiBmb3JtYXQgNiAqLwotICB7MHg0ODAwLCAweEY4MDAsICJsZHJcdCU4LTEwciwgW3BjLCAjJTAtN1ddXHQoJTAtN2EpIn0sICAvKiBUT0RPOiBEaXNhc3NlbWJsZSBQQyByZWxhdGl2ZSAiTERSIHJELD08c3ltYm9saWM+IiAqLwotICAvKiBmb3JtYXQgOSAqLwotICB7MHg2MDAwLCAweEY4MDAsICJzdHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDY4MDAsIDB4RjgwMCwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NzAwMCwgMHhGODAwLCAic3RyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgezB4NzgwMCwgMHhGODAwLCAibGRyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgLyogZm9ybWF0IDEwICovCi0gIHsweDgwMDAsIDB4RjgwMCwgInN0cmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCi0gIHsweDg4MDAsIDB4RjgwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCi0gIC8qIGZvcm1hdCAxMSAqLwotICB7MHg5MDAwLCAweEY4MDAsICJzdHJcdCU4LTEwciwgW3NwLCAjJTAtN1ddIn0sCi0gIHsweDk4MDAsIDB4RjgwMCwgImxkclx0JTgtMTByLCBbc3AsICMlMC03V10ifSwKLSAgLyogZm9ybWF0IDEyICovCi0gIHsweEEwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCBwYywgIyUwLTdXXHQoYWRyICU4LTEwciwlMC03YSkifSwKLSAgezB4QTgwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsIHNwLCAjJTAtN1cifSwKLSAgLyogZm9ybWF0IDE1ICovCi0gIHsweEMwMDAsIDB4RjgwMCwgInN0bWlhXHQlOC0xMHIhLCVNIn0sCi0gIHsweEM4MDAsIDB4RjgwMCwgImxkbWlhXHQlOC0xMHIhLCVNIn0sCi0gIC8qIGZvcm1hdCAxOCAqLwotICB7MHhFMDAwLCAweEY4MDAsICJiXHQlMC0xMEIifSwKLSAgezB4RTgwMCwgMHhGODAwLCAidW5kZWZpbmVkIn0sCi0gIC8qIGZvcm1hdCAxOSAqLwotICB7MHhGMDAwLCAweEY4MDAsICIifSwgLyogc3BlY2lhbCBwcm9jZXNzaW5nIHJlcXVpcmVkIGluIGRpc2Fzc2VtYmxlciAqLwotICB7MHhGODAwLCAweEY4MDAsICJzZWNvbmQgaGFsZiBvZiBCTCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgLyogZm9ybWF0IDE2ICovCi0gIHsweEQwMDAsIDB4RkYwMCwgImJlcVx0JTAtN0IifSwKLSAgezB4RDEwMCwgMHhGRjAwLCAiYm5lXHQlMC03QiJ9LAotICB7MHhEMjAwLCAweEZGMDAsICJiY3NcdCUwLTdCIn0sCi0gIHsweEQzMDAsIDB4RkYwMCwgImJjY1x0JTAtN0IifSwKLSAgezB4RDQwMCwgMHhGRjAwLCAiYm1pXHQlMC03QiJ9LAotICB7MHhENTAwLCAweEZGMDAsICJicGxcdCUwLTdCIn0sCi0gIHsweEQ2MDAsIDB4RkYwMCwgImJ2c1x0JTAtN0IifSwKLSAgezB4RDcwMCwgMHhGRjAwLCAiYnZjXHQlMC03QiJ9LAotICB7MHhEODAwLCAweEZGMDAsICJiaGlcdCUwLTdCIn0sCi0gIHsweEQ5MDAsIDB4RkYwMCwgImJsc1x0JTAtN0IifSwKLSAgezB4REEwMCwgMHhGRjAwLCAiYmdlXHQlMC03QiJ9LAotICB7MHhEQjAwLCAweEZGMDAsICJibHRcdCUwLTdCIn0sCi0gIHsweERDMDAsIDB4RkYwMCwgImJndFx0JTAtN0IifSwKLSAgezB4REQwMCwgMHhGRjAwLCAiYmxlXHQlMC03QiJ9LAotICAvKiBmb3JtYXQgMTcgKi8KLSAgezB4REUwMCwgMHhGRjAwLCAidW5kZWZpbmVkIn0sCi0gIHsweERGMDAsIDB4RkYwMCwgInN3aVx0JTAtN2QifSwKLSAgLyogZm9ybWF0IDkgKi8KLSAgezB4NjAwMCwgMHhGODAwLCAic3RyXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBXXSJ9LAotICB7MHg2ODAwLCAweEY4MDAsICJsZHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDcwMDAsIDB4RjgwMCwgInN0cmJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMGRdIn0sCi0gIHsweDc4MDAsIDB4RjgwMCwgImxkcmJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMGRdIn0sCi0gIC8qIHRoZSByZXN0ICovCi0gIHsweDAwMDAsIDB4MDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgezB4MDAwMCwgMHgwMDAwLCAwfQotfTsKLQotI2RlZmluZSBCRElTUDIzKHgpICgoKCgoKHgpICYgMHgwN2ZmKSA8PCAxMSkgfCAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDE2KSkgXAotICAgICAgICAgICAgICAgICAgICAgXiAweDIwMDAwMCkgLSAweDIwMDAwMCkgLyogMjNiaXQgKi8KLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLWFzbS5jIGIvb3Bjb2Rlcy9jZ2VuLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ2OTM2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgYXNzZW1ibGVyIHN1cHBvcnQgY29kZS4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBTZXQgdGhlIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiBjYWxsYmFjay4gICovCi0KLXZvaWQKLWNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4gKGNkLCBmbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGZuOwotewotICBjZC0+cGFyc2Vfb3BlcmFuZF9mbiA9IGZuOwotfQotCi0vKiBDYWxsZWQgd2hlbmV2ZXIgc3RhcnRpbmcgdG8gcGFyc2UgYW4gaW5zbi4gICovCi0KLXZvaWQKLWNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgLyogVGhpcyB0ZWxscyB0aGUgY2FsbGJhY2sgdG8gcmUtaW5pdGlhbGl6ZS4gICovCi0gICh2b2lkKSAoKiBjZC0+cGFyc2Vfb3BlcmFuZF9mbikKLSAgICAoY2QsIENHRU5fUEFSU0VfT1BFUkFORF9JTklULCBOVUxMLCAwLCAwLCBOVUxMLCBOVUxMKTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9hc21faGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gSU5TTlMuCi0gICBFTlRTSVpFIGlzIHNpemVvZiAoQ0dFTl9JQkFTRSkgZm9yIHRoZSB0YXJnZXQuCi0gICA/Pz8gTm8gbG9uZ2VyIHVzZWQgYnV0IGxlYXZlIGluIGZvciBub3cuCi0gICBIVEFCTEUgcG9pbnRzIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgSEVOVEJVRiBpcyBhIHBvaW50ZXIgdG8gc3VmZmljaWVudGx5IGxhcmdlIGJ1ZmZlciBvZiBoYXNoIGVudHJpZXMuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBlbnRyeSB0byB1c2UuCi0KLSAgIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyBhZGRpdGlvbnMgYXJlIG1hZGUgdG8gdGhlIGZyb250IG9mIHRoZQotICAgbGlzdCBhbmQgd2Ugd2FudCBlYXJsaWVyIG9uZXMgdG8gYmUgcHJlZmVyZWQuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2FycmF5IChjZCwgaW5zbnMsIGNvdW50LCBlbnRzaXplLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbnM7Ci0gICAgIGludCBjb3VudDsKLSAgICAgaW50IGVudHNpemU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gY291bnQgLSAxOyBpID49IDA7IC0taSwgKytoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gJmluc25zW2ldOwotCi0gICAgICBpZiAoISAoKiBjZC0+YXNtX2hhc2hfcCkgKGluc24pKQotCWNvbnRpbnVlOwotICAgICAgaGFzaCA9ICgqIGNkLT5hc21faGFzaCkgKENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfYXNtX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaGFzaF9pbnNuX2FycmF5IGV4Y2VwdCB0aGUgaW5zbnMgYXJlCi0gICBpbiBhIGxpc3QuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNucywgaHRhYmxlLCBoZW50YnVmKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbnM7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OwotCi0gIGZvciAoaWxpc3QgPSBpbnNuczsgaWxpc3QgIT0gTlVMTDsgaWxpc3QgPSBpbGlzdC0+bmV4dCwgKysgaGVudGJ1ZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICAgICAgaWYgKCEgKCogY2QtPmFzbV9oYXNoX3ApIChpbGlzdC0+aW5zbikpCi0JY29udGludWU7Ci0gICAgICBoYXNoID0gKCogY2QtPmFzbV9oYXNoKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbGlzdC0+aW5zbikpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbGlzdC0+aW5zbjsKLSAgICAgIGh0YWJsZVtoYXNoXSA9IGhlbnRidWY7Ci0gICAgfQotCi0gIHJldHVybiBoZW50YnVmOwotfQotCi0vKiBCdWlsZCB0aGUgYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfYXNtX2hhc2hfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgY291bnQgPSBjZ2VuX2luc25fY291bnQgKGNkKSArIGNnZW5fbWFjcm9faW5zbl9jb3VudCAoY2QpOwotICBDR0VOX0lOU05fVEFCTEUgKmluc25fdGFibGUgPSAmY2QtPmluc25fdGFibGU7Ci0gIENHRU5fSU5TTl9UQUJMRSAqbWFjcm9faW5zbl90YWJsZSA9ICZjZC0+bWFjcm9faW5zbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IGhhc2hfc2l6ZSA9IGNkLT5hc21faGFzaF9zaXplOwotICBDR0VOX0lOU05fTElTVCAqaGFzaF9lbnRyeV9idWY7Ci0gIENHRU5fSU5TTl9MSVNUICoqYXNtX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICphc21faGFzaF90YWJsZV9lbnRyaWVzOwotCi0gIC8qIFRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLSAgICAgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBoYXNoIGxpc3RzLiAgKi8KLQotICBhc21faGFzaF90YWJsZSA9IChDR0VOX0lOU05fTElTVCAqKikKLSAgICB4bWFsbG9jIChoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgbWVtc2V0IChhc21faGFzaF90YWJsZSwgMCwgaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIGFzbV9oYXNoX3RhYmxlX2VudHJpZXMgPSBoYXNoX2VudHJ5X2J1ZiA9IChDR0VOX0lOU05fTElTVCAqKQotICAgIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCkpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBpbnNucy4KLSAgICAgRG9uJ3QgaW5jbHVkZSB0aGUgZmlyc3Qgb25lIGFzIGl0IGlzIGEgcmVzZXJ2ZWQgZW50cnkuICAqLwotICAvKiA/Pz8gSXQgd2FzIHRoZSBlbmQgb2YgYWxsIGhhc2ggY2hhaW5zLCBhbmQgYWxzbyB0aGUgc3BlY2lhbAotICAgICAiaW52YWxpZCBpbnNuIiBtYXJrZXIuICBNYXkgYmUgYWJsZSB0byBkbyBpdCBkaWZmZXJlbnRseSBub3cuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwKLQkJCQkgICAgaW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzICsgMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcyAtIDEsCi0JCQkJICAgIGluc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGFzbV9oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsIG1hY3JvX2luc25fdGFibGUtPmluaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBpbnNucy4KLSAgICAgTGF0ZXIgYWRkZWQgaW5zbnMgd2lsbCBiZSBwcmVmZXJlZCBvdmVyIGVhcmxpZXIgb25lcy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fbGlzdCAoY2QsIGluc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkJCSAgIGFzbV9oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfaW5zbl9saXN0IChjZCwgbWFjcm9faW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCSAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICBjZC0+YXNtX2hhc2hfdGFibGUgPSBhc21faGFzaF90YWJsZTsKLSAgY2QtPmFzbV9oYXNoX3RhYmxlX2VudHJpZXMgPSBhc21faGFzaF90YWJsZV9lbnRyaWVzOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBoYXNoIGxpc3QgZm9yIElOU04uICAqLwotCi1DR0VOX0lOU05fTElTVCAqCi1jZ2VuX2FzbV9sb29rdXBfaW5zbiAoY2QsIGluc24pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKmluc247Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChjZC0+YXNtX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9hc21faGFzaF90YWJsZSAoY2QpOwotCi0gIGhhc2ggPSAoKiBjZC0+YXNtX2hhc2gpIChpbnNuKTsKLSAgcmV0dXJuIGNkLT5hc21faGFzaF90YWJsZVtoYXNoXTsKLX0KLQwKLS8qIEtleXdvcmQgcGFyc2VyLgotICAgVGhlIHJlc3VsdCBpcyBOVUxMIHVwb24gc3VjY2VzcyBvciBhbiBlcnJvciBtZXNzYWdlLgotICAgSWYgc3VjY2Vzc2Z1bCwgKlNUUlAgaXMgdXBkYXRlZCB0byBwb2ludCBwYXNzZWQgdGhlIGtleXdvcmQuCi0KLSAgID8/PyBBdCBwcmVzZW50IHdlIGhhdmUgYSBzdGF0aWMgbm90aW9uIG9mIGhvdyB0byBwaWNrIG91dCBhIGtleXdvcmQuCi0gICBMYXRlciB3ZSBjYW4gYWxsb3cgYSB0YXJnZXQgdG8gY3VzdG9taXplIHRoaXMgaWYgbmVjZXNzYXJ5IFtzYXkgYnkKLSAgIHJlY29yZGluZyBzb21ldGhpbmcgaW4gdGhlIGtleXdvcmQgdGFibGVdLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLSAgY2hhciBidWZbMjU2XTsKLSAgY29uc3QgY2hhciAqcCwqc3RhcnQ7Ci0KLSAgcCA9IHN0YXJ0ID0gKnN0cnA7Ci0KLSAgLyogQWxsb3cgYW55IGZpcnN0IGNoYXJhY3Rlci4KLSAgICAgTm90ZSB0aGF0IHRoaXMgYWxsb3dzIHJlY29nbml6aW5nICIsYSIgZm9yIHRoZSBhbm51bCBmbGFnIGluIHNwYXJjCi0gICAgIGV2ZW4gdGhvdWdoICIsIiBpcyBzdWJzZXF1ZW50bHkgbm90IGEgdmFsaWQga2V5d29yZCBjaGFyLiAgKi8KLSAgaWYgKCpwKQotICAgICsrcDsKLQotICAvKiBOb3cgYWxsb3cgbGV0dGVycywgZGlnaXRzLCBhbmQgXy4gICovCi0gIHdoaWxlICgoKHAgLSBzdGFydCkgPCAoaW50KSBzaXplb2YgKGJ1ZikpCi0JICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnApIHx8ICpwID09ICdfJykpCi0gICAgKytwOwotCi0gIGlmIChwIC0gc3RhcnQgPj0gKGludCkgc2l6ZW9mIChidWYpKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIik7Ci0KLSAgbWVtY3B5IChidWYsIHN0YXJ0LCBwIC0gc3RhcnQpOwotICBidWZbcCAtIHN0YXJ0XSA9IDA7Ci0KLSAga2UgPSBjZ2VuX2tleXdvcmRfbG9va3VwX25hbWUgKGtleXdvcmRfdGFibGUsIGJ1Zik7Ci0KLSAgaWYgKGtlICE9IE5VTEwpCi0gICAgewotICAgICAgKnZhbHVlcCA9IGtlLT52YWx1ZTsKLSAgICAgIC8qIERvbid0IGFkdmFuY2UgcG9pbnRlciBpZiB3ZSByZWNvZ25pemVkIHRoZSBudWxsIGtleXdvcmQuICAqLwotICAgICAgaWYgKGtlLT5uYW1lWzBdICE9IDApCi0JKnN0cnAgPSBwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAidW5yZWNvZ25pemVkIGtleXdvcmQvcmVnaXN0ZXIgbmFtZSI7Ci19Ci0KLS8qIFBhcnNlIGEgc21hbGwgc2lnbmVkIGludGVnZXIgcGFyc2VyLgotICAgPz8/IFZBTFVFUCBpcyBub3QgYSBiZmRfdm1hICogb24gcHVycG9zZSwgdGhvdWdoIHRoaXMgaXMgY29uZnVzaW5nLgotICAgTm90ZSB0aGF0IGlmIHRoZSBjYWxsZXIgZXhwZWN0cyBhIGJmZF92bWEgcmVzdWx0LCBpdCBzaG91bGQgY2FsbAotICAgY2dlbl9wYXJzZV9hZGRyZXNzLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOVEVHRVIsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19OT05FLAotICAgICAmcmVzdWx0LCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogUGFyc2UgYSBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHBhcnNlci4KLSAgID8/PyBWQUxVRVAgaXMgbm90IGEgYmZkX3ZtYSAqIG9uIHB1cnBvc2UsIHRob3VnaCB0aGlzIGlzIGNvbmZ1c2luZy4KLSAgIE5vdGUgdGhhdCBpZiB0aGUgY2FsbGVyIGV4cGVjdHMgYSBiZmRfdm1hIHJlc3VsdCwgaXQgc2hvdWxkIGNhbGwKLSAgIGNnZW5fcGFyc2VfYWRkcmVzcy4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOVEVHRVIsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19OT05FLAotICAgICAmcmVzdWx0LCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogQWRkcmVzcyBwYXJzZXIuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIG9waW5mbywgcmVzdWx0cCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGludCBvcGluZm87Ci0gICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqcmVzdWx0cDsKLSAgICAgYmZkX3ZtYSAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICBlcnJtc2cgPSAoKiBjZC0+cGFyc2Vfb3BlcmFuZF9mbikKLSAgICAoY2QsIENHRU5fUEFSU0VfT1BFUkFORF9BRERSRVNTLCBzdHJwLCBvcGluZGV4LCBvcGluZm8sCi0gICAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgLyogRklYTUU6IEV4YW1pbmUgYHJlc3VsdCcuICAqLwotICBpZiAoIWVycm1zZykKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0cCAhPSBOVUxMKQotCSpyZXN1bHRwID0gcmVzdWx0X3R5cGU7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgfQotICByZXR1cm4gZXJybXNnOwotfQotDAotLyogU2lnbmVkIGludGVnZXIgdmFsaWRhdGlvbiByb3V0aW5lLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3ZhbGlkYXRlX3NpZ25lZF9pbnRlZ2VyICh2YWx1ZSwgbWluLCBtYXgpCi0gICAgIGxvbmcgdmFsdWUsIG1pbiwgbWF4OwotewotICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIiksCi0JCSAgICAgIHZhbHVlLCBtaW4sIG1heCk7Ci0gICAgICByZXR1cm4gYnVmOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVW5zaWduZWQgaW50ZWdlciB2YWxpZGF0aW9uIHJvdXRpbmUuCi0gICBTdXBwbHlpbmcgYG1pbicgaGVyZSBtYXkgc2VlbSB1bm5lY2Vzc2FyeSwgYnV0IHdlIGFsc28gd2FudCB0byBoYW5kbGUKLSAgIGNhc2VzIHdoZXJlIG1pbiAhPSAwIChhbmQgbWF4ID4gTE9OR19NQVgpLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3ZhbGlkYXRlX3Vuc2lnbmVkX2ludGVnZXIgKHZhbHVlLCBtaW4sIG1heCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWluLCBtYXg7Ci17Ci0gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAlbHUgYW5kICVsdSkiKSwKLQkgICAgICAgdmFsdWUsIG1pbiwgbWF4KTsKLSAgICAgIHJldHVybiBidWY7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLWRpcy5jIGIvb3Bjb2Rlcy9jZ2VuLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGIxY2Q5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgZGlzYXNzZW1ibGVyIHN1cHBvcnQgY29kZS4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9kaXNfaGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gSU5TTlMuCi0gICBFTlRTSVpFIGlzIHNpemVvZiAoQ0dFTl9JQkFTRSkgZm9yIHRoZSB0YXJnZXQuCi0gICA/Pz8gTm8gbG9uZ2VyIHVzZWQgYnV0IGxlYXZlIGluIGZvciBub3cuCi0gICBIVEFCTEUgcG9pbnRzIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgSEVOVEJVRiBpcyBhIHBvaW50ZXIgdG8gc3VmZmljaWVudGx5IGxhcmdlIGJ1ZmZlciBvZiBoYXNoIGVudHJpZXMuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBlbnRyeSB0byB1c2UuCi0KLSAgIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyBhZGRpdGlvbnMgYXJlIG1hZGUgdG8gdGhlIGZyb250IG9mIHRoZQotICAgbGlzdCBhbmQgd2Ugd2FudCBlYXJsaWVyIG9uZXMgdG8gYmUgcHJlZmVyZWQuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2FycmF5IChjZCwgaW5zbnMsIGNvdW50LCBlbnRzaXplLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqIGluc25zOwotICAgICBpbnQgY291bnQ7Ci0gICAgIGludCBlbnRzaXplOwotICAgICBDR0VOX0lOU05fTElTVCAqKiBodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICogaGVudGJ1ZjsKLXsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgLS1pLCArK2hlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjaGFyIGJ1ZiBbNF07Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gJmluc25zW2ldOwotCi0gICAgICBpZiAoISAoKiBjZC0+ZGlzX2hhc2hfcCkgKGluc24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHRhcmdldCB1c2VzIHRoZSBidWZmZXIgb3IgdGhlIGJhc2UgaW5zbgotCSB0byBoYXNoIG9uLCBzbyBzZXQgYm90aCB1cC4gICovCi0KLSAgICAgIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pOwotICAgICAgc3dpdGNoIChDR0VOX0lOU05fTUFTS19CSVRTSVpFIChpbnNuKSkKLQl7Ci0JY2FzZSA4OgotCSAgYnVmWzBdID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDE2OgotCSAgaWYgKGJpZ19wKQotCSAgICBiZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGJyZWFrOwotCWNhc2UgMzI6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaGFzaCA9ICgqIGNkLT5kaXNfaGFzaCkgKGJ1ZiwgdmFsdWUpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfZGlzX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaGFzaF9pbnNuX2FycmF5IGV4Y2VwdCB0aGUgaW5zbnMgYXJlCi0gICBpbiBhIGxpc3QuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNucywgaHRhYmxlLCBoZW50YnVmKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbnM7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgZm9yIChpbGlzdCA9IGluc25zOyBpbGlzdCAhPSBOVUxMOyBpbGlzdCA9IGlsaXN0LT5uZXh0LCArKyBoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICAgY2hhciBidWZbNF07Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0gICAgICBpZiAoISAoKiBjZC0+ZGlzX2hhc2hfcCkgKGlsaXN0LT5pbnNuKSkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSB0YXJnZXQgdXNlcyB0aGUgYnVmZmVyIG9yIHRoZSBiYXNlIGluc24KLQkgdG8gaGFzaCBvbiwgc28gc2V0IGJvdGggdXAuICAqLwotCi0gICAgICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbGlzdC0+aW5zbik7Ci0gICAgICBzd2l0Y2ggKENHRU5fSU5TTl9NQVNLX0JJVFNJWkUgKGlsaXN0LT5pbnNuKSkKLQl7Ci0JY2FzZSA4OgotCSAgYnVmWzBdID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDE2OgotCSAgaWYgKGJpZ19wKQotCSAgICBiZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGJyZWFrOwotCWNhc2UgMzI6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaGFzaCA9ICgqIGNkLT5kaXNfaGFzaCkgKGJ1ZiwgdmFsdWUpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZSBbaGFzaF07Ci0gICAgICBoZW50YnVmLT5pbnNuID0gaWxpc3QtPmluc247Ci0gICAgICBodGFibGUgW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBkaXNhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9kaXNfaGFzaF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNnZW5faW5zbl9jb3VudCAoY2QpICsgY2dlbl9tYWNyb19pbnNuX2NvdW50IChjZCk7Ci0gIENHRU5fSU5TTl9UQUJMRSAqaW5zbl90YWJsZSA9ICYgY2QtPmluc25fdGFibGU7Ci0gIENHRU5fSU5TTl9UQUJMRSAqbWFjcm9faW5zbl90YWJsZSA9ICYgY2QtPm1hY3JvX2luc25fdGFibGU7Ci0gIHVuc2lnbmVkIGludCBoYXNoX3NpemUgPSBjZC0+ZGlzX2hhc2hfc2l6ZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmhhc2hfZW50cnlfYnVmOwotICBDR0VOX0lOU05fTElTVCAqKmRpc19oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqZGlzX2hhc2hfdGFibGVfZW50cmllczsKLQotICAvKiBUaGUgc3BhY2UgYWxsb2NhdGVkIGZvciB0aGUgaGFzaCB0YWJsZSBjb25zaXN0cyBvZiB0d28gcGFydHM6Ci0gICAgIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgaGFzaCBsaXN0cy4gICovCi0KLSAgZGlzX2hhc2hfdGFibGUgPSAoQ0dFTl9JTlNOX0xJU1QgKiopCi0gICAgeG1hbGxvYyAoaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIG1lbXNldCAoZGlzX2hhc2hfdGFibGUsIDAsIGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOwotICBkaXNfaGFzaF90YWJsZV9lbnRyaWVzID0gaGFzaF9lbnRyeV9idWYgPSAoQ0dFTl9JTlNOX0xJU1QgKikKLSAgICB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QpKTsKLQotICAvKiBBZGQgY29tcGlsZWQgaW4gaW5zbnMuCi0gICAgIERvbid0IGluY2x1ZGUgdGhlIGZpcnN0IG9uZSBhcyBpdCBpcyBhIHJlc2VydmVkIGVudHJ5LiAgKi8KLSAgLyogPz8/IEl0IHdhcyB0aGUgZW5kIG9mIGFsbCBoYXNoIGNoYWlucywgYW5kIGFsc28gdGhlIHNwZWNpYWwKLSAgICAgImludmFsaWQgaW5zbiIgbWFya2VyLiAgTWF5IGJlIGFibGUgdG8gZG8gaXQgZGlmZmVyZW50bHkgbm93LiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsCi0JCQkJICAgIGluc25fdGFibGUtPmluaXRfZW50cmllcyArIDEsCi0JCQkJICAgIGluc25fdGFibGUtPm51bV9pbml0X2VudHJpZXMgLSAxLAotCQkJCSAgICBpbnNuX3RhYmxlLT5lbnRyeV9zaXplLAotCQkJCSAgICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBtYWNyby1pbnNucy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5pbml0X2VudHJpZXMsCi0JCQkJICAgIG1hY3JvX2luc25fdGFibGUtPm51bV9pbml0X2VudHJpZXMsCi0JCQkJICAgIG1hY3JvX2luc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgaW5zbnMuCi0gICAgIExhdGVyIGFkZGVkIGluc25zIHdpbGwgYmUgcHJlZmVyZWQgb3ZlciBlYXJsaWVyIG9uZXMuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNuX3RhYmxlLT5uZXdfZW50cmllcywKLQkJCQkgICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBydW50aW1lIGFkZGVkIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2luc25fbGlzdCAoY2QsIG1hY3JvX2luc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgY2QtPmRpc19oYXNoX3RhYmxlID0gZGlzX2hhc2hfdGFibGU7Ci0gIGNkLT5kaXNfaGFzaF90YWJsZV9lbnRyaWVzID0gZGlzX2hhc2hfdGFibGVfZW50cmllczsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgaGFzaCBsaXN0IGZvciBJTlNOLiAgKi8KLQotQ0dFTl9JTlNOX0xJU1QgKgotY2dlbl9kaXNfbG9va3VwX2luc24gKGNkLCBidWYsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoY2QtPmRpc19oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfZGlzX2hhc2hfdGFibGUgKGNkKTsKLQotICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0KLSAgcmV0dXJuIGNkLT5kaXNfaGFzaF90YWJsZVtoYXNoXTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY2dlbi1vcGMuYyBiL29wY29kZXMvY2dlbi1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4NDBhNi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2NnZW4tb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTcgKzAsMCBAQAotLyogQ0dFTiBnZW5lcmljIG9wY29kZSBzdXBwb3J0LgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9rZXl3b3JkX25hbWUKLSAgUEFSQU1TICgoY29uc3QgQ0dFTl9LRVlXT1JEICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfa2V5d29yZF92YWx1ZQotICBQQVJBTVMgKChjb25zdCBDR0VOX0tFWVdPUkQgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzCi0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqKSk7Ci0KLS8qIFJldHVybiBudW1iZXIgb2YgaGFzaCB0YWJsZSBlbnRyaWVzIHRvIHVzZSBmb3IgTiBlbGVtZW50cy4gICovCi0jZGVmaW5lIEtFWVdPUkRfSEFTSF9TSVpFKG4pICgobikgPD0gMzEgPyAxNyA6IDMxKQotCi0vKiBMb29rIHVwICpOQU1FUCBpbiB0aGUga2V5d29yZCB0YWJsZSBLVC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGtleXdvcmQgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lIChrdCwgbmFtZSkKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLSAgY29uc3QgY2hhciAqcCwqbjsKLQotICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKLQotICBrZSA9IGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBuYW1lLCAwKV07Ci0KLSAgLyogV2UgZG8gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29ucy4KLSAgICAgSWYgdGhhdCBldmVyIGJlY29tZXMgYSBwcm9ibGVtLCBhZGQgYW4gYXR0cmlidXRlIHRoYXQgZGVub3RlcwotICAgICAiZG8gY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbnMiLiAgKi8KLQotICB3aGlsZSAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBuID0gbmFtZTsKLSAgICAgIHAgPSBrZS0+bmFtZTsKLQotICAgICAgd2hpbGUgKCpwCi0JICAgICAmJiAoKnAgPT0gKm4KLQkJIHx8IChpc2FscGhhICgodW5zaWduZWQgY2hhcikgKnApCi0JCSAgICAgJiYgKHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcCkKLQkJCSA9PSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKm4pKSkpKQotCSsrbiwgKytwOwotCi0gICAgICBpZiAoISpwICYmICEqbikKLQlyZXR1cm4ga2U7Ci0KLSAgICAgIGtlID0ga2UtPm5leHRfbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGt0LT5udWxsX2VudHJ5KQotICAgIHJldHVybiBrdC0+bnVsbF9lbnRyeTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2sgdXAgVkFMVUUgaW4gdGhlIGtleXdvcmQgdGFibGUgS1QuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBrZXl3b3JkIGVudHJ5IG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoKLWNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGt0LCB2YWx1ZSkKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgaW50IHZhbHVlOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGtlID0ga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwgdmFsdWUpXTsKLQotICB3aGlsZSAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgPT0ga2UtPnZhbHVlKQotCXJldHVybiBrZTsKLSAgICAgIGtlID0ga2UtPm5leHRfdmFsdWU7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBBZGQgYW4gZW50cnkgdG8gYSBrZXl3b3JkIHRhYmxlLiAgKi8KLQotdm9pZAotY2dlbl9rZXl3b3JkX2FkZCAoa3QsIGtlKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKLQotICBoYXNoID0gaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBrZS0+bmFtZSwgMCk7Ci0gIGtlLT5uZXh0X25hbWUgPSBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hdOwotICBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hdID0ga2U7Ci0KLSAgaGFzaCA9IGhhc2hfa2V5d29yZF92YWx1ZSAoa3QsIGtlLT52YWx1ZSk7Ci0gIGtlLT5uZXh0X3ZhbHVlID0ga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF07Ci0gIGt0LT52YWx1ZV9oYXNoX3RhYmxlW2hhc2hdID0ga2U7Ci0KLSAgaWYgKGtlLT5uYW1lWzBdID09IDApCi0gICAga3QtPm51bGxfZW50cnkgPSBrZTsKLX0KLQotLyogRklYTUU6IE5lZWQgZnVuY3Rpb24gdG8gcmV0dXJuIGNvdW50IG9mIGtleXdvcmRzLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhIGtleXdvcmQgdGFibGUgc2VhcmNoLgotICAgU1BFQyBpcyBhIHNwZWNpZmljYXRpb24gb2Ygd2hhdCB0byBzZWFyY2ggZm9yLgotICAgQSB2YWx1ZSBvZiBOVUxMIG1lYW5zIHRvIGZpbmQgZXZlcnkga2V5d29yZC4KLSAgIEN1cnJlbnRseSBOVUxMIGlzIHRoZSBvbmx5IGFjY2VwdGFibGUgdmFsdWUgW2Z1cnRoZXIgc3BlY2lmaWNhdGlvbgotICAgZGVmZXJyZWRdLgotICAgVGhlIHJlc3VsdCBpcyBhbiBvcGFxdWUgZGF0YSBpdGVtIHVzZWQgdG8gcmVjb3JkIHRoZSBzZWFyY2ggc3RhdHVzLgotICAgSXQgaXMgcGFzc2VkIHRvIGVhY2ggY2FsbCB0byBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQuICAqLwotCi1DR0VOX0tFWVdPUkRfU0VBUkNICi1jZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKGt0LCBzcGVjKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpzcGVjOwotewotICBDR0VOX0tFWVdPUkRfU0VBUkNIIHNlYXJjaDsKLQotICAvKiBGSVhNRTogTmVlZCB0byBzcGVjaWZ5IGZvcm1hdCBvZiBQQVJBTVMuICAqLwotICBpZiAoc3BlYyAhPSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIHNlYXJjaC50YWJsZSA9IGt0OwotICBzZWFyY2guc3BlYyA9IHNwZWM7Ci0gIHNlYXJjaC5jdXJyZW50X2hhc2ggPSAwOwotICBzZWFyY2guY3VycmVudF9lbnRyeSA9IE5VTEw7Ci0gIHJldHVybiBzZWFyY2g7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmV4dCBrZXl3b3JkIHNwZWNpZmllZCBieSBTRUFSQ0guCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBuZXh0IGVudHJ5IG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vIG1vcmUuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0IChzZWFyY2gpCi0gICAgIENHRU5fS0VZV09SRF9TRUFSQ0ggKnNlYXJjaDsKLXsKLSAgLyogSGFzIHNlYXJjaCBmaW5pc2hlZD8gICovCi0gIGlmIChzZWFyY2gtPmN1cnJlbnRfaGFzaCA9PSBzZWFyY2gtPnRhYmxlLT5oYXNoX3RhYmxlX3NpemUpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2VhcmNoIGluIHByb2dyZXNzPyAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMCi0gICAgICAvKiBBbnl0aGluZyBsZWZ0IG9uIHRoaXMgaGFzaCBjaGFpbj8gICovCi0gICAgICAmJiBzZWFyY2gtPmN1cnJlbnRfZW50cnktPm5leHRfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNlYXJjaC0+Y3VycmVudF9lbnRyeSA9IHNlYXJjaC0+Y3VycmVudF9lbnRyeS0+bmV4dF9uYW1lOwotICAgICAgcmV0dXJuIHNlYXJjaC0+Y3VycmVudF9lbnRyeTsKLSAgICB9Ci0KLSAgLyogTW92ZSB0byBuZXh0IGhhc2ggY2hhaW4gW3VubGVzcyB3ZSBoYXZlbid0IHN0YXJ0ZWQgeWV0XS4gICovCi0gIGlmIChzZWFyY2gtPmN1cnJlbnRfZW50cnkgIT0gTlVMTCkKLSAgICArK3NlYXJjaC0+Y3VycmVudF9oYXNoOwotCi0gIHdoaWxlIChzZWFyY2gtPmN1cnJlbnRfaGFzaCA8IHNlYXJjaC0+dGFibGUtPmhhc2hfdGFibGVfc2l6ZSkKLSAgICB7Ci0gICAgICBzZWFyY2gtPmN1cnJlbnRfZW50cnkgPSBzZWFyY2gtPnRhYmxlLT5uYW1lX2hhc2hfdGFibGVbc2VhcmNoLT5jdXJyZW50X2hhc2hdOwotICAgICAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMKQotCXJldHVybiBzZWFyY2gtPmN1cnJlbnRfZW50cnk7Ci0gICAgICArK3NlYXJjaC0+Y3VycmVudF9oYXNoOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIGZpcnN0IGVudHJ5IGluIGhhc2ggY2hhaW4gZm9yIE5BTUUuCi0gICBJZiBDQVNFX1NFTlNJVElWRV9QIGlzIG5vbi16ZXJvLCByZXR1cm4gYSBjYXNlIHNlbnNpdGl2ZSBoYXNoLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBuYW1lLCBjYXNlX3NlbnNpdGl2ZV9wKQotICAgICBjb25zdCBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgY2FzZV9zZW5zaXRpdmVfcDsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgaWYgKGNhc2Vfc2Vuc2l0aXZlX3ApCi0gICAgZm9yIChoYXNoID0gMDsgKm5hbWU7ICsrbmFtZSkKLSAgICAgIGhhc2ggPSAoaGFzaCAqIDk3KSArICh1bnNpZ25lZCBjaGFyKSAqbmFtZTsKLSAgZWxzZQotICAgIGZvciAoaGFzaCA9IDA7ICpuYW1lOyArK25hbWUpCi0gICAgICBoYXNoID0gKGhhc2ggKiA5NykgKyAodW5zaWduZWQgY2hhcikgdG9sb3dlciAoKm5hbWUpOwotICByZXR1cm4gaGFzaCAlIGt0LT5oYXNoX3RhYmxlX3NpemU7Ci19Ci0KLS8qIFJldHVybiBmaXJzdCBlbnRyeSBpbiBoYXNoIGNoYWluIGZvciBWQUxVRS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWhhc2hfa2V5d29yZF92YWx1ZSAoa3QsIHZhbHVlKQotICAgICBjb25zdCBDR0VOX0tFWVdPUkQgKmt0OwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiB2YWx1ZSAlIGt0LT5oYXNoX3RhYmxlX3NpemU7Ci19Ci0KLS8qIEJ1aWxkIGEga2V5d29yZCB0YWJsZSdzIGhhc2ggdGFibGVzLgotICAgV2UgcHJvYmFibHkgbmVlZG4ndCBidWlsZCB0aGUgdmFsdWUgaGFzaCB0YWJsZSBmb3IgdGhlIGFzc2VtYmxlciB3aGVuCi0gICB3ZSdyZSB1c2luZyB0aGUgZGlzYXNzZW1ibGVyLCBidXQgd2Uga2VlcCB0aGluZ3Mgc2ltcGxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotewotICBpbnQgaTsKLSAgLyogVXNlIHRoZSBudW1iZXIgb2YgY29tcGlsZWQgaW4gZW50cmllcyBhcyBhbiBlc3RpbWF0ZSBmb3IgdGhlCi0gICAgIHR5cGljYWwgc2l6ZWQgdGFibGUgW25vdCB0b28gbWFueSBhZGRlZCBhdCBydW50aW1lXS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplID0gS0VZV09SRF9IQVNIX1NJWkUgKGt0LT5udW1faW5pdF9lbnRyaWVzKTsKLQotICBrdC0+aGFzaF90YWJsZV9zaXplID0gc2l6ZTsKLSAga3QtPm5hbWVfaGFzaF90YWJsZSA9IChDR0VOX0tFWVdPUkRfRU5UUlkgKiopCi0gICAgeG1hbGxvYyAoc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLSAgbWVtc2V0IChrdC0+bmFtZV9oYXNoX3RhYmxlLCAwLCBzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBrdC0+dmFsdWVfaGFzaF90YWJsZSA9IChDR0VOX0tFWVdPUkRfRU5UUlkgKiopCi0gICAgeG1hbGxvYyAoc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLSAgbWVtc2V0IChrdC0+dmFsdWVfaGFzaF90YWJsZSwgMCwgc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLQotICAvKiBUaGUgdGFibGUgaXMgc2Nhbm5lZCBiYWNrd2FyZHMgYXMgd2Ugd2FudCBrZXl3b3JkcyBhcHBlYXJpbmcgZWFybGllciB0bwotICAgICBiZSBwcmVmZXJlZCBvdmVyIGxhdGVyIG9uZXMuICAqLwotICBmb3IgKGkgPSBrdC0+bnVtX2luaXRfZW50cmllcyAtIDE7IGkgPj0gMDsgLS1pKQotICAgIGNnZW5fa2V5d29yZF9hZGQgKGt0LCAma3QtPmluaXRfZW50cmllc1tpXSk7Ci19Ci0MCi0vKiBIYXJkd2FyZSBzdXBwb3J0LiAgKi8KLQotLyogTG9va3VwIGEgaGFyZHdhcmUgZWxlbWVudCBieSBpdHMgbmFtZS4KLSAgIFJldHVybnMgTlVMTCBpZiBOQU1FIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgbWFjaC9pc2EuICAqLwotCi1jb25zdCBDR0VOX0hXX0VOVFJZICoKLWNnZW5faHdfbG9va3VwX2J5X25hbWUgKGNkLCBuYW1lKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmh3ID0gY2QtPmh3X3RhYmxlLmVudHJpZXM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5od190YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChod1tpXSAmJiBzdHJjbXAgKG5hbWUsIGh3W2ldLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIGh3W2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBMb29rdXAgYSBoYXJkd2FyZSBlbGVtZW50IGJ5IGl0cyBudW1iZXIuCi0gICBIYXJkd2FyZSBlbGVtZW50cyBhcmUgZW51bWVyYXRlZCwgaG93ZXZlciBpdCBtYXkgYmUgcG9zc2libGUgdG8gYWRkIHNvbWUKLSAgIGF0IHJ1bnRpbWUsIHRodXMgSFdOVU0gaXMgbm90IGFuIGVudW0gdHlwZSBidXQgcmF0aGVyIGFuIGludC4KLSAgIFJldHVybnMgTlVMTCBpZiBIV05VTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFjaC4gICovCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgKgotY2dlbl9od19sb29rdXBfYnlfbnVtIChjZCwgaHdudW0pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBod251bTsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipodyA9IGNkLT5od190YWJsZS5lbnRyaWVzOwotCi0gIC8qID8/PyBUaGlzIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5od190YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChod1tpXSAmJiBod251bSA9PSBod1tpXS0+dHlwZSkKLSAgICAgIHJldHVybiBod1tpXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgc3VwcG9ydC4gICovCi0KLS8qIExvb2t1cCBhbiBvcGVyYW5kIGJ5IGl0cyBuYW1lLgotICAgUmV0dXJucyBOVUxMIGlmIE5BTUUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fT1BFUkFORCAqCi1jZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUgKGNkLCBuYW1lKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9PUEVSQU5EICoqb3AgPSBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjZC0+b3BlcmFuZF90YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChvcFtpXSAmJiBzdHJjbXAgKG5hbWUsIG9wW2ldLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIG9wW2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBMb29rdXAgYW4gb3BlcmFuZCBieSBpdHMgbnVtYmVyLgotICAgT3BlcmFuZHMgYXJlIGVudW1lcmF0ZWQsIGhvd2V2ZXIgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGFkZCBzb21lCi0gICBhdCBydW50aW1lLCB0aHVzIE9QTlVNIGlzIG5vdCBhbiBlbnVtIHR5cGUgYnV0IHJhdGhlciBhbiBpbnQuCi0gICBSZXR1cm5zIE5VTEwgaWYgT1BOVU0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fT1BFUkFORCAqCi1jZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoY2QsIG9wbnVtKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BudW07Ci17Ci0gIHJldHVybiBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzW29wbnVtXTsKLX0KLQwKLS8qIEluc3RydWN0aW9uIHN1cHBvcnQuICAqLwotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotCi1pbnQKLWNnZW5faW5zbl9jb3VudCAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpydF9pbnNucyA9IGNkLT5pbnNuX3RhYmxlLm5ld19lbnRyaWVzOwotCi0gIGZvciAoIDsgcnRfaW5zbnMgIT0gTlVMTDsgcnRfaW5zbnMgPSBydF9pbnNucy0+bmV4dCkKLSAgICArK2NvdW50OwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogUmV0dXJuIG51bWJlciBvZiBtYWNyby1pbnN0cnVjdGlvbnMuCi0gICBUaGlzIGluY2x1ZGVzIGFueSBhZGRlZCBhdCBydW50aW1lLiAgKi8KLQotaW50Ci1jZ2VuX21hY3JvX2luc25fY291bnQgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgY291bnQgPSBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzOwotICBDR0VOX0lOU05fTElTVCAqcnRfaW5zbnMgPSBjZC0+bWFjcm9faW5zbl90YWJsZS5uZXdfZW50cmllczsKLQotICBmb3IgKCA7IHJ0X2luc25zICE9IE5VTEw7IHJ0X2luc25zID0gcnRfaW5zbnMtPm5leHQpCi0gICAgKytjb3VudDsKLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIHJlYWQgYW5kIHByb3Blcmx5IGJ5dGVzd2FwIGFuIGluc24gdmFsdWUuICAqLwotCi1DR0VOX0lOU05fSU5UCi1jZ2VuX2dldF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLQotICBzd2l0Y2ggKGxlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgdmFsdWUgPSAqYnVmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChjZC0+aW5zbl9lbmRpYW4gPT0gQ0dFTl9FTkRJQU5fQklHKQotCXZhbHVlID0gYmZkX2dldGIxNiAoYnVmKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JdmFsdWUgPSBiZmRfZ2V0YjMyIChidWYpOwotICAgICAgZWxzZQotCXZhbHVlID0gYmZkX2dldGwzMiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byBzdG9yZSBhbiBpbnNuIHZhbHVlIHByb3Blcmx5IGJ5dGVzd2FwcGVkLiAgKi8KLQotdm9pZAotY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICBzd2l0Y2ggKGxlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgYnVmWzBdID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JYmZkX3B1dGIxNiAodmFsdWUsIGJ1Zik7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwxNiAodmFsdWUsIGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JYmZkX3B1dGIzMiAodmFsdWUsIGJ1Zik7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAodmFsdWUsIGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotDAotLyogTG9vayB1cCBpbnN0cnVjdGlvbiBJTlNOXypfVkFMVUUgYW5kIGV4dHJhY3QgaXRzIGZpZWxkcy4KLSAgIElOU05fSU5UX1ZBTFVFIGlzIHVzZWQgaWYgQ0dFTl9JTlRfSU5TTl9QLgotICAgT3RoZXJ3aXNlIElOU05fQllURVNfVkFMVUUgaXMgdXNlZC4KLSAgIElOU04sIGlmIG5vbi1udWxsLCBpcyB0aGUgaW5zbiB0YWJsZSBlbnRyeS4KLSAgIE90aGVyd2lzZSBJTlNOXypfVkFMVUUgaXMgZXhhbWluZWQgdG8gY29tcHV0ZSBpdC4KLSAgIExFTkdUSCBpcyB0aGUgYml0IGxlbmd0aCBvZiBJTlNOXypfVkFMVUUgaWYga25vd24sIG90aGVyd2lzZSAwLgotICAgMCBpcyBvbmx5IHZhbGlkIGlmIGBpbnNuID09IE5VTEwgJiYgISBDR0VOX0lOVF9JTlNOX1AnLgotICAgSWYgSU5TTiAhPSBOVUxMLCBMRU5HVEggbXVzdCBiZSB2YWxpZC4KLSAgIEFMSUFTX1AgaXMgbm9uLXplcm8gaWYgYWxpYXMgaW5zbnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2guCi0KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuIHRhYmxlIGVudHJ5LCBvciBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbgotICAgd2Fzbid0IHJlY29nbml6ZWQuICAqLwotCi0vKiA/Pz8gV2lsbCBuZWVkIHRvIGJlIHJldmlzaXRlZCBmb3IgVkxJVyBhcmNoaXRlY3R1cmVzLiAgKi8KLQotY29uc3QgQ0dFTl9JTlNOICoKLWNnZW5fbG9va3VwX2luc24gKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwgbGVuZ3RoLCBmaWVsZHMsCi0JCSAgYWxpYXNfcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0lOU05fSU5UIGluc25faW50X3ZhbHVlOwotICAgICAvKiA/Pz8gQ0dFTl9JTlNOX0JZVEVTIHdvdWxkIGJlIGEgbmljZSB0eXBlIG5hbWUgdG8gdXNlIGhlcmUuICAqLwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzX3ZhbHVlOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBpbnQgYWxpYXNfcDsKLXsKLSAgdW5zaWduZWQgY2hhciAqYnVmOwotICBDR0VOX0lOU05fSU5UIGJhc2VfaW5zbjsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gKmluZm87Ci0KLSAgaWYgKGNkLT5pbnRfaW5zbl9wKQotICAgIHsKLSAgICAgIGluZm8gPSBOVUxMOwotICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgYWxsb2NhIChjZC0+bWF4X2luc25fYml0c2l6ZSAvIDgpOwotICAgICAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoLCBpbnNuX2ludF92YWx1ZSk7Ci0gICAgICBiYXNlX2luc24gPSBpbnNuX2ludF92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmZvID0gJmV4X2luZm87Ci0gICAgICBleF9pbmZvLmRpc19pbmZvID0gTlVMTDsKLSAgICAgIGV4X2luZm8uaW5zbl9ieXRlcyA9IGluc25fYnl0ZXNfdmFsdWU7Ci0gICAgICBleF9pbmZvLnZhbGlkID0gLTE7Ci0gICAgICBidWYgPSBpbnNuX2J5dGVzX3ZhbHVlOwotICAgICAgYmFzZV9pbnNuID0gY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgaWYgKCFpbnNuKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotCSBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgICAgIGluc25fbGlzdCA9IGNnZW5fZGlzX2xvb2t1cF9pbnNuIChjZCwgYnVmLCBiYXNlX2luc24pOwotICAgICAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQotCXsKLQkgIGluc24gPSBpbnNuX2xpc3QtPmluc247Ci0KLQkgIGlmIChhbGlhc19wCi0JICAgICAgLyogRklYTUU6IEVuc3VyZSBBTElBUyBhdHRyaWJ1dGUgYWx3YXlzIGhhcyBzYW1lIGluZGV4LiAgKi8KLQkgICAgICB8fCAhIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fQUxJQVMpKQotCSAgICB7Ci0JICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLQkgICAgICAvKiA/Pz8gTWF5IHdpc2ggdG8gYWxsb3cgdGFyZ2V0IHRvIGRlZmVyIHRoaXMgY2hlY2sgdW50aWwgdGhlCi0JCSBleHRyYWN0IGhhbmRsZXIuICAqLwotCSAgICAgIGlmICgoYmFzZV9pbnNuICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQotCQl7Ci0JCSAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JCSAgaW50IGVsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCQkgICAgKGNkLCBpbnNuLCBpbmZvLCBiYXNlX2luc24sIGZpZWxkcywgKGJmZF92bWEpIDApOwotCQkgIGlmIChlbGVuZ3RoID4gMCkKLQkJICAgIHsKLQkJICAgICAgLyogc2FuaXR5IGNoZWNrICovCi0JCSAgICAgIGlmIChsZW5ndGggIT0gMCAmJiBsZW5ndGggIT0gZWxlbmd0aCkKLQkJCWFib3J0ICgpOwotCQkgICAgICByZXR1cm4gaW5zbjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGluc25fbGlzdCA9IGluc25fbGlzdC0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2FuaXR5IGNoZWNrOiBjYW4ndCBwYXNzIGFuIGFsaWFzIGluc24gaWYgISBhbGlhc19wLiAgKi8KLSAgICAgIGlmICghIGFsaWFzX3AKLQkgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fQUxJQVMpKQotCWFib3J0ICgpOwotICAgICAgLyogU2FuaXR5IGNoZWNrOiBsZW5ndGggbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIGlmIChsZW5ndGggIT0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pKQotCWFib3J0ICgpOwotCi0gICAgICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLSAgICAgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JKGNkLCBpbnNuLCBpbmZvLCBiYXNlX2luc24sIGZpZWxkcywgKGJmZF92bWEpIDApOwotICAgICAgLyogU2FuaXR5IGNoZWNrOiBtdXN0IHN1Y2NlZWQuCi0JIENvdWxkIHJlbGF4IHRoaXMgbGF0ZXIgaWYgaXQgZXZlciBwcm92ZXMgdXNlZnVsLiAgKi8KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJldHVybiBpbnNuOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRmlsbCBpbiB0aGUgb3BlcmFuZCBpbnN0YW5jZXMgdXNlZCBieSBJTlNOIHdob3NlIG9wZXJhbmRzIGFyZSBGSUVMRFMuCi0gICBJTkRJQ0VTIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBvZiBNQVhfT1BFUkFORF9JTlNUQU5DRVMgaW50cyB0byBiZSBmaWxsZWQKLSAgIGluLiAgKi8KLQotdm9pZAotY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyAoY2QsIGluc24sIGZpZWxkcywgaW5kaWNlcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBpbnQgKmluZGljZXM7Ci17Ci0gIGNvbnN0IENHRU5fT1BJTlNUICpvcGluc3Q7Ci0gIGludCBpOwotCi0gIGlmIChpbnNuLT5vcGluc3QgPT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLSAgZm9yIChpID0gMCwgb3BpbnN0ID0gaW5zbi0+b3BpbnN0OyBvcGluc3QtPnR5cGUgIT0gQ0dFTl9PUElOU1RfRU5EOyArK2ksICsrb3BpbnN0KQotICAgIHsKLSAgICAgIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgb3BfdHlwZSA9IG9waW5zdC0+b3BfdHlwZTsKLSAgICAgIGlmIChvcF90eXBlID09IENHRU5fT1BFUkFORF9OSUwpCi0JaW5kaWNlc1tpXSA9IG9waW5zdC0+aW5kZXg7Ci0gICAgICBlbHNlCi0JaW5kaWNlc1tpXSA9ICgqY2QtPmdldF9pbnRfb3BlcmFuZCkgKGNkLCBvcF90eXBlLCBmaWVsZHMpOwotICAgIH0KLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyB3aGVuIGVpdGhlciBJTlNOIG9yIEZJRUxEUwotICAgaXNuJ3Qga25vd24uCi0gICBUaGUgSU5TTiwgSU5TTl8qX1ZBTFVFLCBhbmQgTEVOR1RIIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvCi0gICBjZ2VuX2xvb2t1cF9pbnNuIHVuY2hhbmdlZC4KLSAgIElOU05fSU5UX1ZBTFVFIGlzIHVzZWQgaWYgQ0dFTl9JTlRfSU5TTl9QLgotICAgT3RoZXJ3aXNlIElOU05fQllURVNfVkFMVUUgaXMgdXNlZC4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgaW5zbiB0YWJsZSBlbnRyeSBvciBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbiB3YXNuJ3QKLSAgIHJlY29nbml6ZWQuICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMgKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwKLQkJCSAgICAgICBsZW5ndGgsIGluZGljZXMsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0lOU05fSU5UIGluc25faW50X3ZhbHVlOwotICAgICAvKiA/Pz8gQ0dFTl9JTlNOX0JZVEVTIHdvdWxkIGJlIGEgbmljZSB0eXBlIG5hbWUgdG8gdXNlIGhlcmUuICAqLwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzX3ZhbHVlOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBpbnQgKmluZGljZXM7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci17Ci0gIC8qIFBhc3Mgbm9uLXplcm8gZm9yIEFMSUFTX1Agb25seSBpZiBJTlNOICE9IE5VTEwuCi0gICAgIElmIElOU04gPT0gTlVMTCwgd2Ugd2FudCBhIHJlYWwgaW5zbi4gICovCi0gIGluc24gPSBjZ2VuX2xvb2t1cF9pbnNuIChjZCwgaW5zbiwgaW5zbl9pbnRfdmFsdWUsIGluc25fYnl0ZXNfdmFsdWUsCi0JCQkgICBsZW5ndGgsIGZpZWxkcywgaW5zbiAhPSBOVUxMKTsKLSAgaWYgKCEgaW5zbikKLSAgICByZXR1cm4gTlVMTDsKLQotICBjZ2VuX2dldF9pbnNuX29wZXJhbmRzIChjZCwgaW5zbiwgZmllbGRzLCBpbmRpY2VzKTsKLSAgcmV0dXJuIGluc247Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZy5pbiBiL29wY29kZXMvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjBhMzIxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZ3VyZSBiL29wY29kZXMvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmU1MDI5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDc2MCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPXo4ay1kaXMuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDU6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI2OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDQ6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njk5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzUwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDc5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4Mjk6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjgzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NTc6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4ODk6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotCi0jIFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBuYW1lIG9mIGFueSBzaGFyZWQKLSMgbGlicmFyeS4gIEZvciB1c2VyIGNvbnZlbmllbmNlLCB3ZSBhbHdheXMgdXNlIHRoZSBzYW1lIHZlcnNpb24KLSMgbnVtYmVyIHRoYXQgQkZEIGlzIHVzaW5nLgotQkZEX1ZFUlNJT049YGdyZXAgSU5JVF9BVVRPTUFLRSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5pbiB8IHNlZCAtbiAtZSAncy9bIAldLy9nJyAtZSAncy9eLiosXCguKlwpKS4qJC9cMS9wJ2AKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5Mjc6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTgwOiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMzc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPW9wY29kZXMKLQotVkVSU0lPTj0ke0JGRF9WRVJTSU9OfQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA5NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTA5OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyMjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTM1OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzY3OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzOTE6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5NDogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MzA6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDY6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDg0OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQ3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTUxOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDk6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY2MTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjg3OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTcyMyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcyNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3ODA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODEyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIG9wY29kZXMgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi0KLQotCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA1ODogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODE6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwOTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMTQ6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjExOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMjY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE0NTogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE1NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjYyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjk0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMzA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzM2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM0MTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM1MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY5OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MDM6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQyNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ0MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ1MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ4MzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTEzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU1MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTYzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1ODc6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjQxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NjI6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzAyOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MzU6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc3MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc4MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4MDM6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjgwOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODM2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg2ODogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODk4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk1MzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDA1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAxMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDQ0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwOTc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyNDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjczOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI3OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI4MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMTM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM3MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM3NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzk4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MzI6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDY1OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0ODU6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUwNDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTE0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUzMTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTQzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NTk6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTY3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU5NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzYwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2Njg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2NzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcyMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzc5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc5OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODY1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkwMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk5MTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAxOTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAyNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDI5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotLiAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTA2OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLWZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE2MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxNjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQxNzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotdXNpbmdfY2dlbj1ubwotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9iZmQgLWxiZmQgLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiIKLSAgZmkKLSAgOzsKLWVzYWMKLQotCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1zZWxhcmNocz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIiA7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvLi4vYmZkL2NvbmZpZy5iZmQKLQlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgotICAgIGZpCi1kb25lCQotCi0jIFV0aWxpdHkgdmFyLCBkb2N1bWVudHMgZ2VuZXJpYyBjZ2VuIHN1cHBvcnQgZmlsZXMuCi0KLWNnZW5fZmlsZXM9ImNnZW4tb3BjLmxvIGNnZW4tYXNtLmxvIGNnZW4tZGlzLmxvIgotCi0jIFdlIGRvbid0IGRvIGFueSBsaW5rcyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHN5c3RlbSwganVzdCBtYWtlZmlsZSBjb25maWcuCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geGZhbHNlIDsgdGhlbgotCi0gICAgIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotICAgIHRhPQotCi0gICAgZm9yIGFyY2ggaW4gJHNlbGFyY2hzCi0gICAgZG8KLQlhZD1gZWNobyAkYXJjaCB8IHNlZCAtZSBzL2JmZF8vL2cgLWUgcy9fYXJjaC8vZ2AKLQlhcmNoZGVmcz0iJGFyY2hkZWZzIC1EQVJDSF8kYWQiCi0JY2FzZSAiJGFyY2giIGluCi0JYmZkX2EyOWtfYXJjaCkJCXRhPSIkdGEgYTI5ay1kaXMubG8iIDs7Ci0JYmZkX2FsbGlhbnRfYXJjaCkJOzsKLQliZmRfYWxwaGFfYXJjaCkJCXRhPSIkdGEgYWxwaGEtZGlzLmxvIGFscGhhLW9wYy5sbyIgOzsKLQliZmRfYXJjX2FyY2gpCQl0YT0iJHRhIGFyYy1kaXMubG8gYXJjLW9wYy5sbyIgOzsKLQliZmRfYXJtX2FyY2gpCQl0YT0iJHRhIGFybS1kaXMubG8iIDs7Ci0JYmZkX2NvbnZleF9hcmNoKQk7OwotCWJmZF9kMTB2X2FyY2gpCQl0YT0iJHRhIGQxMHYtZGlzLmxvIGQxMHYtb3BjLmxvIiA7OwotCWJmZF9kMzB2X2FyY2gpCQl0YT0iJHRhIGQzMHYtZGlzLmxvIGQzMHYtb3BjLmxvIiA7OwotCWJmZF9mcjMwX2FyY2gpICAgICAgICAgIHRhPSIkdGEgZnIzMC1hc20ubG8gZnIzMC1kZXNjLmxvIGZyMzAtZGlzLmxvIGZyMzAtaWJsZC5sbyBmcjMwLW9wYy5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfaDgzMDBfYXJjaCkJCXRhPSIkdGEgaDgzMDAtZGlzLmxvIiA7OwotCWJmZF9oODUwMF9hcmNoKQkJdGE9IiR0YSBoODUwMC1kaXMubG8iIDs7Ci0JYmZkX2hwcGFfYXJjaCkJCXRhPSIkdGEgaHBwYS1kaXMubG8iIDs7Ci0JYmZkX2kzODZfYXJjaCkJCXRhPSIkdGEgaTM4Ni1kaXMubG8iIDs7Ci0JYmZkX2k4NjBfYXJjaCkJCTs7Ci0JYmZkX2k5NjBfYXJjaCkJCXRhPSIkdGEgaTk2MC1kaXMubG8iIDs7Ci0JYmZkX20zMnJfYXJjaCkJCXRhPSIkdGEgbTMyci1hc20ubG8gbTMyci1kZXNjLmxvIG0zMnItZGlzLmxvIG0zMnItaWJsZC5sbyBtMzJyLW9wYy5sbyBtMzJyLW9waW5zdC5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfbTY4a19hcmNoKQkJdGE9IiR0YSBtNjhrLWRpcy5sbyBtNjhrLW9wYy5sbyIgOzsKLQliZmRfbTg4a19hcmNoKQkJdGE9IiR0YSBtODhrLWRpcy5sbyIgOzsKLQliZmRfbWNvcmVfYXJjaCkJCXRhPSIkdGEgbWNvcmUtZGlzLmxvIiA7OwotCWJmZF9taXBzX2FyY2gpCQl0YT0iJHRhIG1pcHMtZGlzLmxvIG1pcHMtb3BjLmxvIG1pcHMxNi1vcGMubG8iIDs7Ci0JYmZkX21uMTAyMDBfYXJjaCkJdGE9IiR0YSBtMTAyMDAtZGlzLmxvIG0xMDIwMC1vcGMubG8iIDs7Ci0JYmZkX21uMTAzMDBfYXJjaCkJdGE9IiR0YSBtMTAzMDAtZGlzLmxvIG0xMDMwMC1vcGMubG8iIDs7Ci0JYmZkX25zMzJrX2FyY2gpCQl0YT0iJHRhIG5zMzJrLWRpcy5sbyIgOzsKLQliZmRfcGpfYXJjaCkJICAgICAgICB0YT0iJHRhIHBqLWRpcy5sbyBwai1vcGMubG8iIDs7Ci0JYmZkX3Bvd2VycGNfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3B5cmFtaWRfYXJjaCkJOzsKLQliZmRfcm9tcF9hcmNoKQkJOzsKLQliZmRfcnM2MDAwX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9zaF9hcmNoKQkJdGE9IiR0YSBzaC1kaXMubG8iIDs7Ci0JYmZkX3NwYXJjX2FyY2gpCQl0YT0iJHRhIHNwYXJjLWRpcy5sbyBzcGFyYy1vcGMubG8iIDs7Ci0JYmZkX3RhaG9lX2FyY2gpCQk7OwotCWJmZF90aWMzMF9hcmNoKQkJdGE9IiR0YSB0aWMzMC1kaXMubG8iIDs7Ci0JYmZkX3RpYzgwX2FyY2gpCQl0YT0iJHRhIHRpYzgwLWRpcy5sbyB0aWM4MC1vcGMubG8iIDs7Ci0JYmZkX3Y4NTBfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZWFfYXJjaCkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdmF4X2FyY2gpCQl0YT0iJHRhIHZheC1kaXMubG8iIDs7Ci0JYmZkX3c2NV9hcmNoKQkJdGE9IiR0YSB3NjUtZGlzLmxvIiA7OwotCWJmZF93ZTMya19hcmNoKQkJOzsKLQliZmRfejhrX2FyY2gpCQl0YT0iJHRhIHo4ay1kaXMubG8iIDs7Ci0KLQkiIikJCQk7OwotCSopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICoqKiB1bmtub3duIHRhcmdldCBhcmNoaXRlY3R1cmUgJGFyY2giIDE+JjI7IGV4aXQgMTsgfSA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCXRhPSIkdGEgJGNnZW5fZmlsZXMiCi0gICAgZmkKLQotICAgICMgV2VlZCBvdXQgZHVwbGljYXRlIC5vIGZpbGVzLgotICAgIGY9IiIKLSAgICBmb3IgaSBpbiAkdGEgOyBkbwotCWNhc2UgIiAkZiAiIGluCi0JKiIgJGkgIiopIDs7Ci0JKikgZj0iJGYgJGkiIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgICB0YT0iJGYiCi0KLSAgICAjIEFuZCBkdXBsaWNhdGUgLUQgZmxhZ3MuCi0gICAgZj0iIgotICAgIGZvciBpIGluICRhcmNoZGVmcyA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIGFyY2hkZWZzPSIkZiIKLQotICAgIEJGRF9NQUNISU5FUz0iJHRhIgotCi1lbHNlCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotICAgIGFyY2hkZWZzPS1EQVJDSF9hbGwKLSAgICBCRkRfTUFDSElORVM9JyQoQUxMX01BQ0hJTkVTKScKLWZpCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAV0lOMzJMREZMQUdTQCUkV0lOMzJMREZMQUdTJWcKLXMlQFdJTjMyTElCQUREQCUkV0lOMzJMSUJBREQlZwotcyVAYXJjaGRlZnNAJSRhcmNoZGVmcyVnCi1zJUBCRkRfTUFDSElORVNAJSRCRkRfTUFDSElORVMlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZ3VyZS5pbiBiL29wY29kZXMvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM5NGIyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVCh6OGstZGlzLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLUFDX0lTQ19QT1NJWAotCi0jIFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBuYW1lIG9mIGFueSBzaGFyZWQKLSMgbGlicmFyeS4gIEZvciB1c2VyIGNvbnZlbmllbmNlLCB3ZSBhbHdheXMgdXNlIHRoZSBzYW1lIHZlcnNpb24KLSMgbnVtYmVyIHRoYXQgQkZEIGlzIHVzaW5nLgotY2hhbmdlcXVvdGUoLClkbmwKLUJGRF9WRVJTSU9OPWBncmVwIElOSVRfQVVUT01BS0UgJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaW4gfCBzZWQgLW4gLWUgJ3MvWyAJXS8vZycgLWUgJ3MvXi4qLFwoLipcKSkuKiQvXDEvcCdgCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLUFNX0lOSVRfQVVUT01BS0Uob3Bjb2RlcywgJHtCRkRfVkVSU0lPTn0pCi0KLWRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50Ci1kbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi1kbmwgRGVmYXVsdCB0byBhIG5vbiBzaGFyZWQgbGlicmFyeS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlCi1kbmwgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1zaGFyZWQuCi1BTV9ESVNBQkxFX1NIQVJFRAotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3Igb3Bjb2RlcyBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1BQ19BUkdfUFJPR1JBTQotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUFDX1BST0dfQ0MKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BQ19QUk9HX0lOU1RBTEwKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmgpCi0KLQotdXNpbmdfY2dlbj1ubwotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9iZmQgLWxiZmQgLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiIKLSAgZmkKLSAgOzsKLWVzYWMKLUFDX1NVQlNUKFdJTjMyTERGTEFHUykKLUFDX1NVQlNUKFdJTjMyTElCQUREKQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotc2VsYXJjaHM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCIgOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLSAgICBlbHNlCi0JLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLSAgICBmaQotZG9uZQkKLQotIyBVdGlsaXR5IHZhciwgZG9jdW1lbnRzIGdlbmVyaWMgY2dlbiBzdXBwb3J0IGZpbGVzLgotCi1jZ2VuX2ZpbGVzPSJjZ2VuLW9wYy5sbyBjZ2VuLWFzbS5sbyBjZ2VuLWRpcy5sbyIKLQotIyBXZSBkb24ndCBkbyBhbnkgbGlua3MgYmFzZWQgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGp1c3QgbWFrZWZpbGUgY29uZmlnLgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHhmYWxzZSA7IHRoZW4KLQotICAgICMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KLSAgICB0YT0KLQotICAgIGZvciBhcmNoIGluICRzZWxhcmNocwotICAgIGRvCi0JYWQ9YGVjaG8gJGFyY2ggfCBzZWQgLWUgcy9iZmRfLy9nIC1lIHMvX2FyY2gvL2dgCi0JYXJjaGRlZnM9IiRhcmNoZGVmcyAtREFSQ0hfJGFkIgotCWNhc2UgIiRhcmNoIiBpbgotCWJmZF9hMjlrX2FyY2gpCQl0YT0iJHRhIGEyOWstZGlzLmxvIiA7OwotCWJmZF9hbGxpYW50X2FyY2gpCTs7Ci0JYmZkX2FscGhhX2FyY2gpCQl0YT0iJHRhIGFscGhhLWRpcy5sbyBhbHBoYS1vcGMubG8iIDs7Ci0JYmZkX2FyY19hcmNoKQkJdGE9IiR0YSBhcmMtZGlzLmxvIGFyYy1vcGMubG8iIDs7Ci0JYmZkX2FybV9hcmNoKQkJdGE9IiR0YSBhcm0tZGlzLmxvIiA7OwotCWJmZF9jb252ZXhfYXJjaCkJOzsKLQliZmRfZDEwdl9hcmNoKQkJdGE9IiR0YSBkMTB2LWRpcy5sbyBkMTB2LW9wYy5sbyIgOzsKLQliZmRfZDMwdl9hcmNoKQkJdGE9IiR0YSBkMzB2LWRpcy5sbyBkMzB2LW9wYy5sbyIgOzsKLQliZmRfZnIzMF9hcmNoKSAgICAgICAgICB0YT0iJHRhIGZyMzAtYXNtLmxvIGZyMzAtZGVzYy5sbyBmcjMwLWRpcy5sbyBmcjMwLWlibGQubG8gZnIzMC1vcGMubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX2g4MzAwX2FyY2gpCQl0YT0iJHRhIGg4MzAwLWRpcy5sbyIgOzsKLQliZmRfaDg1MDBfYXJjaCkJCXRhPSIkdGEgaDg1MDAtZGlzLmxvIiA7OwotCWJmZF9ocHBhX2FyY2gpCQl0YT0iJHRhIGhwcGEtZGlzLmxvIiA7OwotCWJmZF9pMzg2X2FyY2gpCQl0YT0iJHRhIGkzODYtZGlzLmxvIiA7OwotCWJmZF9pODYwX2FyY2gpCQk7OwotCWJmZF9pOTYwX2FyY2gpCQl0YT0iJHRhIGk5NjAtZGlzLmxvIiA7OwotCWJmZF9tMzJyX2FyY2gpCQl0YT0iJHRhIG0zMnItYXNtLmxvIG0zMnItZGVzYy5sbyBtMzJyLWRpcy5sbyBtMzJyLWlibGQubG8gbTMyci1vcGMubG8gbTMyci1vcGluc3QubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX202OGtfYXJjaCkJCXRhPSIkdGEgbTY4ay1kaXMubG8gbTY4ay1vcGMubG8iIDs7Ci0JYmZkX204OGtfYXJjaCkJCXRhPSIkdGEgbTg4ay1kaXMubG8iIDs7Ci0JYmZkX21jb3JlX2FyY2gpCQl0YT0iJHRhIG1jb3JlLWRpcy5sbyIgOzsKLQliZmRfbWlwc19hcmNoKQkJdGE9IiR0YSBtaXBzLWRpcy5sbyBtaXBzLW9wYy5sbyBtaXBzMTYtb3BjLmxvIiA7OwotCWJmZF9tbjEwMjAwX2FyY2gpCXRhPSIkdGEgbTEwMjAwLWRpcy5sbyBtMTAyMDAtb3BjLmxvIiA7OwotCWJmZF9tbjEwMzAwX2FyY2gpCXRhPSIkdGEgbTEwMzAwLWRpcy5sbyBtMTAzMDAtb3BjLmxvIiA7OwotCWJmZF9uczMya19hcmNoKQkJdGE9IiR0YSBuczMyay1kaXMubG8iIDs7Ci0JYmZkX3BqX2FyY2gpCSAgICAgICAgdGE9IiR0YSBwai1kaXMubG8gcGotb3BjLmxvIiA7OwotCWJmZF9wb3dlcnBjX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9weXJhbWlkX2FyY2gpCTs7Ci0JYmZkX3JvbXBfYXJjaCkJCTs7Ci0JYmZkX3JzNjAwMF9hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfc2hfYXJjaCkJCXRhPSIkdGEgc2gtZGlzLmxvIiA7OwotCWJmZF9zcGFyY19hcmNoKQkJdGE9IiR0YSBzcGFyYy1kaXMubG8gc3BhcmMtb3BjLmxvIiA7OwotCWJmZF90YWhvZV9hcmNoKQkJOzsKLQliZmRfdGljMzBfYXJjaCkJCXRhPSIkdGEgdGljMzAtZGlzLmxvIiA7OwotCWJmZF90aWM4MF9hcmNoKQkJdGE9IiR0YSB0aWM4MC1kaXMubG8gdGljODAtb3BjLmxvIiA7OwotCWJmZF92ODUwX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZV9hcmNoKQkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdjg1MGVhX2FyY2gpCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3ZheF9hcmNoKQkJdGE9IiR0YSB2YXgtZGlzLmxvIiA7OwotCWJmZF93NjVfYXJjaCkJCXRhPSIkdGEgdzY1LWRpcy5sbyIgOzsKLQliZmRfd2UzMmtfYXJjaCkJCTs7Ci0JYmZkX3o4a19hcmNoKQkJdGE9IiR0YSB6OGstZGlzLmxvIiA7OwotCi0JIiIpCQkJOzsKLQkqKQkJQUNfTVNHX0VSUk9SKCoqKiB1bmtub3duIHRhcmdldCBhcmNoaXRlY3R1cmUgJGFyY2gpIDs7Ci0JZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JdGE9IiR0YSAkY2dlbl9maWxlcyIKLSAgICBmaQotCi0gICAgIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi0gICAgZj0iIgotICAgIGZvciBpIGluICR0YSA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIHRhPSIkZiIKLQotICAgICMgQW5kIGR1cGxpY2F0ZSAtRCBmbGFncy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJGFyY2hkZWZzIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgYXJjaGRlZnM9IiRmIgotCi0gICAgQkZEX01BQ0hJTkVTPSIkdGEiCi0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICAgYXJjaGRlZnM9LURBUkNIX2FsbAotICAgIEJGRF9NQUNISU5FUz0nJChBTExfTUFDSElORVMpJwotZmkKLQotQUNfU1VCU1QoYXJjaGRlZnMpCi1BQ19TVUJTVChCRkRfTUFDSElORVMpCi0KLUFDX09VVFBVVChNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9vcGNvZGVzL2QxMHYtZGlzLmMgYi9vcGNvZGVzL2QxMHYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMWE3ZDMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMTB2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIEQxMFYgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLS8qIHRoZSBQQyB3cmFwcyBhdCAxOCBiaXRzLCBleGNlcHQgZm9yIHRoZSBzZWdtZW50IG51bWJlciAqLwotLyogc28gdXNlIHRoaXMgbWFzayB0byBrZWVwIHRoZSBwYXJ0cyB3ZSB3YW50ICovCi0jZGVmaW5lIFBDX01BU0sJMHgwMzAzRkZGRgotCi1zdGF0aWMgdm9pZCBkaXNfMl9zaG9ydCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc24sIGJmZF92bWEgbWVtYWRkciwgCi0JCQkJIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBpbnQgb3JkZXIpKTsKLXN0YXRpYyB2b2lkIGRpc19sb25nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgYmZkX3ZtYSBtZW1hZGRyLCAKLQkJCSAgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLWludCAKLXByaW50X2luc25fZDEwdiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0KLSAgc3RhdHVzID0gaW5zbiAmIEZNMTE7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gIGNhc2UgMDoKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0wMToKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0xMDoKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0xMToKLSAgICBkaXNfbG9uZyAoaW5zbiwgbWVtYWRkciwgaW5mbyk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChvcGVyLCBpbnNuLCBvcCwgbWVtYWRkciwgaW5mbykKLSAgICAgc3RydWN0IGQxMHZfb3BlcmFuZCAqb3BlcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgbnVtLCBzaGlmdDsKLQotICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVE1JTlVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQC0iKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX01JTlVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfUExVUykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUU0lHTikKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUUEFSKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2hpZnQgPSBvcGVyLT5zaGlmdDsKLQotICAvKiB0aGUgTE9OR19MIGZvcm1hdCBzaGlmdHMgcmVnaXN0ZXJzIG92ZXIgYnkgMTUgKi8KLSAgaWYgKG9wLT5mb3JtYXQgPT0gTE9OR19MICYmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKSkKLSAgICBzaGlmdCArPSAxNTsKLQotICBudW0gPSAoaW5zbiA+PiBzaGlmdCkgJiAoMHg3RkZGRkZGRiA+PiAoMzEgLSBvcGVyLT5iaXRzKSk7Ci0KLSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgbWF0Y2g9MDsKLSAgICAgIG51bSArPSAob3Blci0+ZmxhZ3MKLQkgICAgICAmIChPUEVSQU5EX0dQUnxPUEVSQU5EX0ZGTEFHfE9QRVJBTkRfQ0ZMQUd8T1BFUkFORF9DT05UUk9MKSk7Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiAoT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMSkpCi0JbnVtICs9IG51bSA/IE9QRVJBTkRfQUNDMSA6IE9QRVJBTkRfQUNDMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkMTB2X3JlZ19uYW1lX2NudCgpOyBpKyspCi0JewotCSAgaWYgKG51bSA9PSBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLnZhbHVlKQotCSAgICB7Ci0JICAgICAgaWYgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5uYW1lKTsKLQkgICAgICBtYXRjaD0xOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKG1hdGNoID09IDApCi0JewotCSAgLyogdGhpcyB3b3VsZCBvbmx5IGdldCBleGVjdXRlZCBpZiBhIHJlZ2lzdGVyIHdhcyBub3QgaW4gdGhlIAotCSAgICAgcmVnaXN0ZXIgdGFibGUgKi8KLQkgIGlmIChvcGVyLT5mbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhIik7Ci0JICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJjciIpOwotCSAgZWxzZSBpZihvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIiKTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLG51bSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGFkZHJlc3NlcyBhcmUgcmlnaHQtc2hpZnRlZCBieSAyICovCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JewotCSAgbG9uZyBtYXg7Ci0JICBpbnQgbmVnPTA7Ci0JICBtYXggPSAoMSA8PCAob3Blci0+Yml0cyAtIDEpKTsKLQkgIGlmIChudW0gJiBtYXgpCi0JICAgIHsKLQkgICAgICBudW0gPSAtbnVtICYgKCgxIDw8IG9wZXItPmJpdHMpLTEpOwotCSAgICAgIG5lZyA9IDE7Ci0JICAgIH0KLQkgIG51bSA9IG51bTw8MjsKLQkgIGlmIChpbmZvLT5mbGFncyAmIElOU05fSEFTX1JFTE9DKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG51bSAmIFBDX01BU0ssIGluZm8pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG5lZykKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciAtIG51bSkgJiBQQ19NQVNLLCBpbmZvKTsKLQkgICAgICBlbHNlCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyBudW0pICYgUENfTUFTSywgaW5mbyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0JICAgIHsKLQkgICAgICBpbnQgbWF4ID0gKDEgPDwgKG9wZXItPmJpdHMgLSAxKSk7Ci0JICAgICAgaWYgKG51bSAmIG1heCkKLQkJewotCQkgIG51bSA9IC1udW0gJiAoKDEgPDwgb3Blci0+Yml0cyktMSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7Ci0JCX0KLQkgICAgfQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IixudW0pOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRpc19sb25nIChpbnNuLCBtZW1hZGRyLCBpbmZvKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBpOwotICBjaGFyIGJ1ZlszMl07Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqb3AgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOwotICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgbmVlZF9wYXJlbiA9IDA7Ci0gIGludCBtYXRjaCA9IDA7Ci0KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmICgob3AtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSAmJiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZSkpCi0JewotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOyAgIAotCSAgZm9yICggaT0wOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQkgICAgewotCSAgICAgIG9wZXIgPSAoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV07Ci0JICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JCW5lZWRfcGFyZW4gPSAxOwotCSAgICAgIHByaW50X29wZXJhbmQgKG9wZXIsIGluc24sIG9wLCBtZW1hZGRyLCBpbmZvKTsKLQkgICAgICBpZiAob3AtPm9wZXJhbmRzW2krMV0gJiYgb3Blci0+Yml0cyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfUExVUyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCAiKTsgICAKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLGluc24pOyAgIAotCi0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOyAgIAotfQotCi1zdGF0aWMgdm9pZAotZGlzXzJfc2hvcnQgKGluc24sIG1lbWFkZHIsIGluZm8sIG9yZGVyKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBvcmRlcjsKLXsKLSAgaW50IGksajsKLSAgY2hhciBhc3RyWzJdWzMyXTsKLSAgdW5zaWduZWQgaW50IGluc1syXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKLSAgY2hhciBidWZbMzJdOwotICBpbnQgbWF0Y2gsIG51bV9tYXRjaD0wOwotICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgbmVlZF9wYXJlbiA9IDA7Ci0KLSAgaW5zWzBdID0gKGluc24gJiAweDNGRkZGRkZGKSA+PiAxNTsKLSAgaW5zWzFdID0gaW5zbiAmIDB4MDAwMDdGRkY7Ci0KLSAgZm9yKGo9MDtqPDI7aisrKQotICAgIHsKLSAgICAgIG9wID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWQxMHZfb3Bjb2RlczsKLSAgICAgIG1hdGNoPTA7Ci0gICAgICB3aGlsZSAob3AtPm5hbWUpCi0JewotCSAgaWYgKChvcC0+Zm9ybWF0ICYgU0hPUlRfT1BDT0RFKSAmJiAoKG9wLT5tYXNrICYgaW5zW2pdKSA9PSBvcC0+b3Bjb2RlKSkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsb3AtPm5hbWUpOyAgIAotCSAgICAgIGZvciAoaT0wOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQkJewotCQkgIG9wZXIgPSAoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV07Ci0JCSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JCSAgICBuZWVkX3BhcmVuID0gMTsKLQkJICBwcmludF9vcGVyYW5kIChvcGVyLCBpbnNbal0sIG9wLCBtZW1hZGRyLCBpbmZvKTsKLQkJICBpZiAob3AtPm9wZXJhbmRzW2krMV0gJiYgb3Blci0+Yml0cyAmJiAKLQkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX1BMVVMgJiYKLQkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX01JTlVTKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOyAgIAotCQl9Ci0JICAgICAgbWF0Y2ggPSAxOwotCSAgICAgIG51bV9tYXRjaCsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvcCsrOwotCX0KLSAgICAgIGlmICghbWF0Y2gpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ1bmtub3duIik7ICAgCi0KLSAgICAgIHN3aXRjaCAob3JkZXIpCi0JewotCWNhc2UgMDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQtPlx0Iik7ICAgCi0JICBvcmRlciA9IC0xOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDwtXHQiKTsgICAKLQkgIG9yZGVyID0gLTE7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0fHxcdCIpOyAgIAotCSAgb3JkZXIgPSAtMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChudW1fbWF0Y2ggPT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLGluc24pOyAgIAotCi0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOyAgIAotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMTB2LW9wYy5jIGIvb3Bjb2Rlcy9kMTB2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJiMDk4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDEwdi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKiBkMTB2LW9wYy5jIC0tIEQxMFYgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIgotCi0KLS8qICAgVGhlIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1jb25zdCBzdHJ1Y3QgcGRfcmVnIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgTlVMTCwgT1BFUkFORF9BQ0MwKzAgfSwKLSAgeyAiYTEiLCBOVUxMLCBPUEVSQU5EX0FDQzErMSB9LAotICB7ICJicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiYyIsIE5VTEwsIE9QRVJBTkRfQ0ZMQUcrMyB9LAotICB7ICJjcjAiLCAicHN3IiwgT1BFUkFORF9DT05UUk9MIH0sCi0gIHsgImNyMSIsICJicHN3IiwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiY3IxMCIsICJtb2RfcyIsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJjcjExIiwgIm1vZF9lIiwgT1BFUkFORF9DT05UUk9MKzExIH0sCi0gIHsgImNyMTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTIgfSwKLSAgeyAiY3IxMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMyB9LAotICB7ICJjcjE0IiwgImliYSIsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAotICB7ICJjcjE1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE1IH0sCi0gIHsgImNyMiIsICJwYyIsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgImNyMyIsICJicGMiLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJjcjQiLCAiZHBzdyIsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImNyNSIsICJkcGMiLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJjcjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNiB9LAotICB7ICJjcjciLCAicnB0X2MiLCBPUEVSQU5EX0NPTlRST0wrNyB9LAotICB7ICJjcjgiLCAicnB0X3MiLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJjcjkiLCAicnB0X2UiLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJkcGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJkcHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiZjAiLCBOVUxMLCBPUEVSQU5EX0ZGTEFHKzAgfSwKLSAgeyAiZjEiLCBOVUxMLCBPUEVSQU5EX0ZGTEFHKzEgfSwKLSAgeyAiaWJhIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImxpbmsiLCAicjEzIiwgT1BFUkFORF9HUFIrMTMgfSwKLSAgeyAibW9kX2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAibW9kX3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMCB9LAotICB7ICJyMCIsIE5VTEwsIE9QRVJBTkRfR1BSKzAgfSwKLSAgeyAicjAtcjEiLCBOVUxMLCBPUEVSQU5EX0dQUiswfSwKLSAgeyAicjEiLCBOVUxMLCBPUEVSQU5EX0dQUisxIH0sCi0gIHsgInIxIiwgTlVMTCwgT1BFUkFORF9HUFIrMSB9LAotICB7ICJyMTAiLCBOVUxMLCBPUEVSQU5EX0dQUisxMCB9LAotICB7ICJyMTAtcjExIiwgTlVMTCwgT1BFUkFORF9HUFIrMTAgfSwKLSAgeyAicjExIiwgTlVMTCwgT1BFUkFORF9HUFIrMTEgfSwKLSAgeyAicjEyIiwgTlVMTCwgT1BFUkFORF9HUFIrMTIgfSwKLSAgeyAicjEyLXIxMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzEyIH0sCi0gIHsgInIxMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzEzIH0sCi0gIHsgInIxNCIsIE5VTEwsIE9QRVJBTkRfR1BSKzE0IH0sCi0gIHsgInIxNC1yMTUiLCBOVUxMLCBPUEVSQU5EX0dQUisxNCB9LAotICB7ICJyMTUiLCAic3AiLCBPUEVSQU5EX0dQUisxNSB9LAotICB7ICJyMiIsIE5VTEwsIE9QRVJBTkRfR1BSKzIgfSwKLSAgeyAicjItcjMiLCBOVUxMLCBPUEVSQU5EX0dQUisyIH0sCi0gIHsgInIzIiwgTlVMTCwgT1BFUkFORF9HUFIrMyB9LAotICB7ICJyNCIsIE5VTEwsIE9QRVJBTkRfR1BSKzQgfSwKLSAgeyAicjQtcjUiLCBOVUxMLCBPUEVSQU5EX0dQUis0IH0sCi0gIHsgInI1IiwgTlVMTCwgT1BFUkFORF9HUFIrNSB9LAotICB7ICJyNiIsIE5VTEwsIE9QRVJBTkRfR1BSKzYgfSwKLSAgeyAicjYtcjciLCBOVUxMLCBPUEVSQU5EX0dQUis2IH0sCi0gIHsgInI3IiwgTlVMTCwgT1BFUkFORF9HUFIrNyB9LAotICB7ICJyOCIsIE5VTEwsIE9QRVJBTkRfR1BSKzggfSwKLSAgeyAicjgtcjkiLCBOVUxMLCBPUEVSQU5EX0dQUis4IH0sCi0gIHsgInI5IiwgTlVMTCwgT1BFUkFORF9HUFIrOSB9LAotICB7ICJycHRfYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgInJwdF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAicnB0X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJzcCIsIE5VTEwsIE9QRVJBTkRfR1BSKzE1IH0sCi19OwotCi1pbnQgCi1kMTB2X3JlZ19uYW1lX2NudCgpCi17Ci0gIHJldHVybiAoc2l6ZW9mKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKTsKLX0KLQotY29uc3Qgc3RydWN0IGQxMHZfb3BlcmFuZCBkMTB2X29wZXJhbmRzW10gPQotewotI2RlZmluZSBVTlVTRUQJKDApCi0gIHsgMCwgMCwgMCB9LAotI2RlZmluZSBSU1JDCShVTlVTRUQgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJEU1QJKFJTUkMgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfREVTVHxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBU1JDCShSRFNUICsgMSkKLSAgeyAxLCA0LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFTUkMwT05MWSAoQVNSQyArIDEpCi0gIHsgMSwgNCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFEU1QJKEFTUkMwT05MWSArIDEpCi0gIHsgMSwgOCwgT1BFUkFORF9ERVNUfE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUlNSQ0UJKEFEU1QgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfRVZFTnxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSRFNURQkoUlNSQ0UgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfRVZFTnxPUEVSQU5EX0RFU1R8T1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgTlVNMTYJKFJEU1RFICsgMSkKLSAgeyAxNiwgMCwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgTlVNMwkoTlVNMTYgKyAxKQkJCS8qIHJhYywgcmFjaGkgKi8KLSAgeyAzLCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRHxSRVNUUklDVEVEX05VTTMgfSwKLSNkZWZpbmUgTlVNNAkoTlVNMyArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgVU5VTTQJKE5VTTQgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIFVOVU00UwkoVU5VTTQgKyAxKQkJCS8qIGFkZGksIHNsbGksIHNyYWksIHNybGksIHN1YmkgKi8KLSAgeyA0LCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIFVOVU04CShVTlVNNFMgKyAxKQkJCS8qIHJlcGkgKi8KLSAgeyA4LCAxNiwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgVU5VTTE2CShVTlVNOCArIDEpCQkJLyogY21wdWkgKi8KLSAgeyAxNiwgMCwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgQU5VTTE2CShVTlVNMTYgKyAxKQotICB7IDE2LCAwLCBPUEVSQU5EX0FERFJ8T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgQU5VTTgJKEFOVU0xNiArIDEpCi0gIHsgOCwgMCwgT1BFUkFORF9BRERSfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIEFTUkMyCShBTlVNOCArIDEpCi0gIHsgMSwgOCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSU1JDMgkoQVNSQzIgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJTUkMyRQkoUlNSQzIgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHfE9QRVJBTkRfRVZFTiB9LAotI2RlZmluZSBBU1JDMAkoUlNSQzJFICsgMSkKLSAgeyAxLCAwLCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFEU1QwCShBU1JDMCArIDEpCi0gIHsgMSwgMCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1QgfSwKLSNkZWZpbmUgRkZTUkMJKEFEU1QwICsgMSkKLSAgeyAyLCAxLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkZMQUcgfSwKLSNkZWZpbmUgQ0ZTUkMJKEZGU1JDICsgMSkKLSAgeyAyLCAxLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfQ0ZMQUcgfSwKLSNkZWZpbmUgRkRTVAkoQ0ZTUkMgKyAxKQotICB7IDEsIDUsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GRkxBRyB8IE9QRVJBTkRfREVTVH0sCi0jZGVmaW5lIEFUU0lHTgkoRkRTVCArIDEpCi0gIHsgMCwgMCwgT1BFUkFORF9BVFNJR059LAotI2RlZmluZSBBVFBBUgkoQVRTSUdOICsgMSkJLyogIkAoIiAqLwotICB7IDAsIDAsIE9QRVJBTkRfQVRQQVJ9LAotI2RlZmluZSBQTFVTCShBVFBBUiArIDEpCS8qIHBvc3RpbmNyZW1lbnQgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX1BMVVN9LAotI2RlZmluZSBNSU5VUwkoUExVUyArIDEpCS8qIHBvc3RkZWNyZW1lbnQgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX01JTlVTfSwKLSNkZWZpbmUgQVRNSU5VUwkoTUlOVVMgKyAxKQkvKiBwcmVkZWNyZW1lbnQgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX0FUTUlOVVN9LAotI2RlZmluZSBDU1JDCShBVE1JTlVTICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDQsIDEsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTH0sCi0jZGVmaW5lIENEU1QJKENTUkMgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNCwgNSwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfE9QRVJBTkRfREVTVH0sCi19OwotCi1jb25zdCBzdHJ1Y3QgZDEwdl9vcGNvZGUgZDEwdl9vcGNvZGVzW10gPSB7Ci0gIHsgImFicyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0NjA3LCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgImFicyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDU2MDcsIDB4N2VmZiwgeyBBRFNUIH0gfSwKLSAgeyAiYWRkIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0NBUiwgMHgwMjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgImFkZCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTIwMSwgMHg3ZWUzLCB7IEFEU1QsIFJTUkNFIH0gfSwKLSAgeyAiYWRkIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMjAzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgImFkZDJ3IiwgU0hPUlRfMiwgMiwgSVUsIFBBUnxXQ0FSLCAweDEyMDAsIDB4N2UyMywgeyBSRFNURSwgUlNSQ0UgfSB9LAotICB7ICJhZGQzIiwgTE9OR19MLCAxLCBNVSwgU0VRfFdDQVIsIDB4MTAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBSU1JDLCBOVU0xNiB9IH0sCi0gIHsgImFkZGFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDIwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAiYWRkYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMjAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgImFkZGFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEyMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgImFkZGFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEyMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAiYWRkaSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdDQVIsICAweDIwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00UyB9IH0sCi0gIHsgImFuZCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweGMwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJhbmQzIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDYwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7ICJiY2xyaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4YzAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJibCIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYmwucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0hfTElOS3xQQVIsIDB4NDkwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKLSAgeyAiYmwubCIsIExPTkdfQiwgMywgTVUsIEJSQU5DSF9MSU5LfFNFUSwgMHgyNDgwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJibm90aSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4YTAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJicmEiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJyYS5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSHxQQVIsIDB4NDgwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKLSAgeyAiYnJhLmwiLCBMT05HX0IsIDMsIE1VLCBCUkFOQ0h8U0VRLCAweDI0MDAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJyZjBmIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJicmYwZi5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSHxQQVJ8UkYwLCAweDRhMDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJyZjBmLmwiLCBMT05HX0IsIDMsIE1VLCBTRVEsIDB4MjUwMDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYnJmMHQiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJyZjB0LnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIfFBBUnxSRjAsIDB4NGIwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKLSAgeyAiYnJmMHQubCIsIExPTkdfQiwgMywgTVUsIFNFUSwgMHgyNTgwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJic2V0aSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4ODAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJidHN0aSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweGUwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiY2xyYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU2MDEsIDB4N2VmZiwgeyBBRFNUIH0gfSwKLSAgeyAiY21wIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDYwMCwgMHg3ZTAxLCB7IFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAiY21wIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MTYwMywgMHg3ZWVmLCB7IEFTUkMyLCBBU1JDIH0gfSwKLSAgeyAiY21wZXEiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDAwLCAweDdlMDEsIHsgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJjbXBlcSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDE0MDMsIDB4N2VlZiwgeyBBU1JDMiwgQVNSQyB9IH0sCi0gIHsgImNtcGVxaSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKLSAgeyAiY21wZXFpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDAxLCAweDdlMDEsIHsgUlNSQzIsIE5VTTQgfSB9LAotICB7ICJjbXBlcWkubCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgyMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCi0gIHsgImNtcGkiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAxLCA0LCAxNiwgMCB9IH0sCi0gIHsgImNtcGkucyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg2MDEsIDB4N2UwMSwgeyBSU1JDMiwgTlVNNCB9IH0sCi0gIHsgImNtcGkubCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCi0gIHsgImNtcHUiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDYwMCwgMHg3ZTAxLCB7IFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAiY21wdWkiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MjMwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIFVOVU0xNiB9IH0sCi0gIHsgImNwZmciLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDRlMGYsIDB4N2ZkZiwgeyBGRFNULCBDRlNSQyB9IH0sCi0gIHsgImNwZmciLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDRlMDksIDB4N2ZkOSwgeyBGRFNULCBGRlNSQyB9IH0sCi0gIHsgImRidCIsIFNIT1JUXzIsIDUsIE1VLCBQQVIsIDB4NWYyMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJkaXZzIiwgTE9OR19MLCAxLCBCT1RILCBTRVEsIDB4MTQwMDI4MDAsIDB4M2YxMGZlMjEsIHsgUkRTVEUsIFJTUkMgfSB9LAotICB7ICJleGVmMGYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUwNCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmMHQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUyNCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmMWYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGU0MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmMXQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGU0MiwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmYWYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUwMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmYXQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUwMiwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGV0YWYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUyMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGV0YXQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUyMiwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleHAiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTUwMDJhMDAsIDB4M2ZmZmZlMDMsIHsgUkRTVCwgUlNSQ0UgfSB9LAotICB7ICJleHAiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTUwMDJhMDIsIDB4M2ZmZmZlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgImpsIiwgU0hPUlRfMiwgMywgTVUsIEJSQU5DSF9MSU5LfFBBUiwgMHg0ZDAwLCAweDdmZTEsIHsgUlNSQyB9IH0sCi0gIHsgImptcCIsIFNIT1JUXzIsIDMsIE1VLCBCUkFOQ0h8UEFSLCAweDRjMDAsIDB4N2ZlMSwgeyBSU1JDIH0gfSwKLSAgeyAibGQiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzAwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAibGQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjQwMSwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJsZCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MDAxLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKLSAgeyAibGQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjAwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgImxkIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMyMDEwMDAwLCAweDNmMGYwMDAwLCB7IFJEU1QsIEFUU0lHTiwgTlVNMTYgfSB9LAotICB7ICJsZDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMxMDAwMDAwLCAweDNmMTAwMDAwLCB7IFJEU1RFLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDY2MDEsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgImxkMnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjIwMSwgMHg3ZTIxLCB7IFJEU1RFLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYyMDAsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGQydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMzAxMDAwMCwgMHgzZjFmMDAwMCwgeyBSRFNURSwgQVRTSUdOLCBOVU0xNiB9IH0sCi0gIHsgImxkYiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzODAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZGIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NzAwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgImxkaSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKLSAgeyAibGRpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSTUVNLCAweDQwMDEsIDB4N2UwMSAsIHsgUkRTVCwgTlVNNCB9IH0sCi0gIHsgImxkaS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIwMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJEU1QsIE5VTTE2IH0gfSwKLSAgeyAibGR1YiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzOTAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZHViIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDcyMDAsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJtYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtYWNzdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWEwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1hY3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtYXgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgyNjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDAsIDB4N2VlMywgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDIsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MjYwMSwgMHg3ZTAxICwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMSwgMHg3ZWUzICwgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgIm1pbiIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibXNiIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXNic3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDE4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtc2J1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyZTAwLCAweDdlMDEgLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdWx4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVseHN1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVseHUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDQwMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXYydyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTAwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCi0gIHsgIm12MndmYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDAsIDB4N2UyZiwgeyBSRFNURSwgQVNSQyB9IH0sCi0gIHsgIm12Mnd0YWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDEsIDB4N2VlMywgeyBSU1JDRSwgQURTVCB9IH0sCi0gIHsgIm12YWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibXZiIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NDAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm12ZjBmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8UkYwLCAweDQ0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXZmMHQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSRjAsIDB4NDQwMSwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdmZhY2ciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDQsIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAibXZmYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwMCwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJtdmZhY2xvIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTAyLCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgIm12ZmMiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDUyMDAsIDB4N2UwMSwgeyBSRFNULCBDU1JDIH0gfSwKLSAgeyAibXZ0YWNnIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTQxLCAweDdlZTEsIHsgUlNSQywgQURTVCB9IH0sCi0gIHsgIm12dGFjaGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDEsIDB4N2VlMSwgeyBSU1JDLCBBRFNUIH0gfSwKLSAgeyAibXZ0YWNsbyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUyMSwgMHg3ZWUxLCB7IFJTUkMsIEFEU1QgfSB9LAotICB7ICJtdnRjIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1NjAwLCAweDdlMDEsIHsgUlNSQywgQ0RTVCB9IH0sCi0gIHsgIm12dWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU0MDEsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibmVnIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NDYwNSwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJuZWciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU2MDUsIDB4N2VmZiwgeyBBRFNUIH0gfSwKLSAgeyAibm9wIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NWUwMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJub3QiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg0NjAzLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgIm9yIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4ODAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm9yMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg0MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgLyogU3BlY2lhbCBjYXNlLiBzYWMmc2FjaGkgbXVzdCBvY2N1ciBiZWZvcmUgcmFjJnJhY2hpIGJlY2F1c2UgdGhleSBoYXZlCi0gICAgIGludGVyc2VjdGluZyBtYXNrcyEgVGhlIG1hc2tzIGZvciByYWMmcmFjaGkgd2lsbCBtYXRjaCBzYWMmc2FjaGkgYnV0Ci0gICAgIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLSAgICovCi0gIHsgInNhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8UkYwfFdGMCwgMHg1MjA5LCAweDdlMmYsIHsgUkRTVEUsIEFTUkMgfSB9LAotICB7ICJzYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8UkYwfFdGMCwgMHg0MjA5LCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgInJhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDUyMDEsIDB4N2UyMSwgeyBSRFNURSwgQVNSQzBPTkxZLCBOVU0zIH0gfSwKLSAgeyAicmFjaGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHg0MjAxLCAweDdlMDEsIHsgUkRTVCwgQVNSQywgTlVNMyB9IH0sCi0gIHsgInJlcCIsIExPTkdfTCwgMiwgTVUsIFNFUSwgMHgyNzAwMDAwMCwgMHgzZmYwMDAwMCwgeyBSU1JDLCBBTlVNMTYgfSB9LAotICB7ICJyZXBpIiwgTE9OR19MLCAyLCBNVSwgU0VRLCAweDJmMDAwMDAwLCAweDNmMDAwMDAwLCB7IFVOVU04LCBBTlVNMTYgfSB9LAotICB7ICJydGQiLCBTSE9SVF8yLCAzLCBNVSwgUEFSLCAweDVmNjAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAicnRlIiwgU0hPUlRfMiwgMywgTVUsIFBBUiwgMHg1ZjQwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInNhZGQiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEyMjMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAic2V0ZjBmIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSRjAsIDB4NDYxMSwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzZXRmMHQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJGMCwgMHg0NjEzLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInNsYWUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMyMjAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic2xlZXAiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmYzAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAic2xsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInNsbCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzIwMCwgMHg3ZWUxLCB7IEFEU1QsIFJTUkMgfSB9LAotICB7ICJzbGxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMjAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJzbGxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMjAxLCAweDdlZTEsIHsgQURTVCwgVU5VTTRTIH0gfSwKLSAgeyAic2x4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxSRjAsIDB4NDYwYiwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzcmEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3JhIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzNDAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNyYWkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI0MDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNyYWkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM0MDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzcmwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIwMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3JsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMDAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNybGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIwMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNybGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMwMDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzcngiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMCwgMHg0NjA5LCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInN0IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM0MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJTUkMyLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ODAwLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZjMWYsIDB4N2UxZiwgeyBSU1JDMiwgQVRNSU5VUywgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDY4MDEsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmMwMSwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKLSAgeyAic3QiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzYwMTAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIEFUU0lHTiwgTlVNMTYgfSB9LAotICB7ICJzdDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM1MDAwMDAwLCAweDNmMTAwMDAwLCB7IFJTUkMyRSwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YTAwLCAweDdlMjEsIHsgUlNSQzJFLCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZlMWYsIDB4N2UzZiwgeyBSU1JDMkUsIEFUTUlOVVMsIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZhMDEsIDB4N2UyMSwgeyBSU1JDMkUsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmUwMSwgMHg3ZTIxLCB7IFJTUkMyRSwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgInN0MnciLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzcwMTAwMDAsIDB4M2YxZjAwMDAsIHsgUlNSQzJFLCBBVFNJR04sIE5VTTE2IH0gfSwKLSAgeyAic3RiIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDNjMDAwMDAwLCAweDNmMDAwMDAwLCB7IFJTUkMyLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJzdGIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NzgwMCwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJzdG9wIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1ZmUwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInN1YiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdDQVIsIDB4MCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzdWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEwMDEsIDB4N2VlMywgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic3ViIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMDAzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgInN1YjJ3IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXQ0FSLCAweDEwMDAsIDB4N2UyMywgeyBSRFNURSwgUlNSQ0UgfSB9LAotICB7ICJzdWJhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAwMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgInN1YmFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDAwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJzdWJhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMDAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJzdWJhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMDAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgInN1YmkiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHgxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTRTIH0gfSwKLSAgeyAidHJhcCIsIFNIT1JUXzIsIDUsIE1VLCBCUkFOQ0hfTElOS3xQQVIsIDB4NWYwMCwgMHg3ZmUxLCB7IFVOVU00IH0gfSwKLSAgeyAidHN0MGkiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4NzAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJ0c3QxaSIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHhmMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCi0gIHsgIndhaXQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmODAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAieG9yIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4YTAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInhvcjMiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4NTAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBSU1JDLCBOVU0xNiB9IH0sCi0gIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgeyAwIH0gfSwKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMzB2LWRpcy5jIGIvb3Bjb2Rlcy9kMzB2LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzU4Yjc1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDMwdi1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBEMzBWIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAib3Bjb2RlL2QzMHYuaCIgCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jZGVmaW5lIFBDX01BU0sgMHhGRkZGRkZGRgotCi1zdGF0aWMgaW50IGxvb2t1cF9vcGNvZGUgUEFSQU1TICgoIHN0cnVjdCBkMzB2X2luc24gKmluc24sIGxvbmcgbnVtLCBpbnQgaXNfbG9uZyApKTsKLXN0YXRpYyB2b2lkIHByaW50X2luc24gUEFSQU1TICgoIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBiZmRfdm1hIG1lbWFkZHIsIGxvbmcgbG9uZyBudW0sIAotCQkJCSBzdHJ1Y3QgZDMwdl9pbnNuICppbnNuLCBpbnQgaXNfbG9uZywgaW50IHNob3dfZXh0ICkpOwotc3RhdGljIGludCBleHRyYWN0X3ZhbHVlIFBBUkFNUyAoKCBsb25nIGxvbmcgbnVtLCBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcGVyLCBpbnQgaXNfbG9uZyApKTsKLQotaW50IAotcHJpbnRfaW5zbl9kMzB2IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzLCByZXN1bHQ7Ci0gIGJmZF9ieXRlIGJ1ZmZlclsxMl07Ci0gIHVuc2lnbmVkIGxvbmcgaW4xLGluMjsKLSAgc3RydWN0IGQzMHZfaW5zbiBpbnNuOwotICBsb25nIGxvbmcgbnVtOwotCi0gIGluc24uZm9ybSA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKilOVUxMOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gODsKLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbjEgPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIrNCwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gODsKLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMSwgMCkpKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgiLGluMSk7Ci0gICAgICBlbHNlCi0JcHJpbnRfaW5zbihpbmZvLCBtZW1hZGRyLCAobG9uZyBsb25nKSBpbjEsICZpbnNuLCAwLCByZXN1bHQpOwotICAgICAgcmV0dXJuIDQ7ICAgICAgCi0gICAgfQotICBpbjIgPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAKLSAgaWYgKGluMSAmIGluMiAmIEZNMDEpCi0gICAgewotICAgICAgLyogTE9ORyBpbnN0cnVjdGlvbiAqLwotICAgICAgaWYgKCEocmVzdWx0ID0gbG9va3VwX29wY29kZSgmaW5zbiwgaW4xLCAxKSkpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHgleCwweCV4IixpbjEsaW4yKTsKLQkgIHJldHVybiA4OwotCX0KLSAgICAgIG51bSA9IChsb25nIGxvbmcpaW4xIDw8IDMyIHwgaW4yOwotICAgICAgcHJpbnRfaW5zbihpbmZvLCBtZW1hZGRyLCBudW0sICZpbnNuLCAxLCByZXN1bHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG51bSA9IGluMTsKLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMSwgMCkpKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgiLGluMSk7Ci0gICAgICBlbHNlCi0JcHJpbnRfaW5zbihpbmZvLCBtZW1hZGRyLCBudW0sICZpbnNuLCAwLCByZXN1bHQpOwotICAgICAgCi0gICAgICBzd2l0Y2ggKCAoKGluMT4+MzEpPDwxKSB8IChpbjI+PjMxKSApCi0JewotCWNhc2UgMDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHR8fFx0Iik7ICAgCi0JICBicmVhazsKLQljYXNlIDE6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0LT5cdCIpOyAgIAotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDwtXHQiKTsgICAKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICBpbnNuLmZvcm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopTlVMTDsKLSAgICAgIG51bSA9IGluMjsKLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMiwgMCkpKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgiLGluMik7Ci0gICAgICBlbHNlCi0JcHJpbnRfaW5zbihpbmZvLCBtZW1hZGRyLCBudW0sICZpbnNuLCAwLCByZXN1bHQpOwotCi0gICAgfQotICByZXR1cm4gODsKLX0KLQotCi0vKiByZXR1cm5zIDAgaWYgbG9va3VwIGZhaWxzICovCi0vKiAxIGlmIGZvdW5kIGFuZCBvbmx5IG9uZSBmb3JtICovCi0vKiAyIGlmIGZvdW5kIGFuZCB0aGVyZSBhcmUgc2hvcnQgYW5kIGxvbmcgZm9ybXMgKi8KLXN0YXRpYyBpbnQKLWxvb2t1cF9vcGNvZGUgKGluc24sIG51bSwgaXNfbG9uZykKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqaW5zbjsKLSAgICAgbG9uZyBudW07Ci0gICAgIGludCBpc19sb25nOwotewotICBpbnQgaT0wLCBpbmRleDsKLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmOwotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wID0gKHN0cnVjdCBkMzB2X29wY29kZSAqKWQzMHZfb3Bjb2RlX3RhYmxlOwotICBpbnQgb3AxID0gKG51bSA+PiAyNSkgJiAweDc7Ci0gIGludCBvcDIgPSAobnVtID4+IDIwKSAmIDB4MWY7Ci0gIGludCBtb2QgPSAobnVtID4+IDE4KSAmIDB4MzsKLQotICAvKiBmaW5kIHRoZSBvcGNvZGUgKi8KLSAgZG8gewotICAgIGlmICgob3AtPm9wMSA9PSBvcDEpICYmIChvcC0+b3AyID09IG9wMikpCi0gICAgICBicmVhazsKLSAgICBvcCsrOwotICB9IHdoaWxlIChvcC0+bmFtZSk7Ci0KLSAgaWYgKCFvcCB8fCAhb3AtPm5hbWUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgd2hpbGUgKG9wLT5vcDEgPT0gb3AxICYmIG9wLT5vcDIgPT0gb3AyKQotICAgIHsKLSAgICAgIC8qIHNjYW4gdGhyb3VnaCBhbGwgdGhlIGZvcm1hdHMgZm9yIHRoZSBvcGNvZGUgICovCi0gICAgICBpbmRleCA9IG9wLT5mb3JtYXRbaSsrXTsKLSAgICAgIGRvIAotCXsKLQkgIGYgPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopJmQzMHZfZm9ybWF0X3RhYmxlW2luZGV4XTsKLQkgIHdoaWxlIChmLT5mb3JtID09IGluZGV4KQotCSAgICB7Ci0JICAgICAgaWYgKCghaXNfbG9uZyB8fCBmLT5mb3JtID49IExPTkcpICYmIChmLT5tb2RpZmllciA9PSBtb2QpKQotCQl7Ci0JCSAgaW5zbi0+Zm9ybSA9IGY7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBmKys7Ci0JICAgIH0KLQkgIGlmIChpbnNuLT5mb3JtKQotCSAgICBicmVhazsKLQl9IHdoaWxlICgoaW5kZXggPSBvcC0+Zm9ybWF0W2krK10pICE9IDApOwotICAgICAgaWYgKGluc24tPmZvcm0pCi0JYnJlYWs7Ci0gICAgICBvcCsrOwotICAgICAgaT0wOwotICAgIH0KLSAgaWYgKGluc24tPmZvcm0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpbnNuLT5vcCA9IG9wOwotICBpbnNuLT5lY2MgPSAobnVtID4+IDI4KSAmIDB4NzsKLSAgaWYgKG9wLT5mb3JtYXRbMV0pCi0gICAgcmV0dXJuIDI7Ci0gIGVsc2UKLSAgICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdm9pZCAKLXByaW50X2luc24gKCBpbmZvLCBtZW1hZGRyLCBudW0sIGluc24sIGlzX2xvbmcsIHNob3dfZXh0ICkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgbG9uZyBsb25nIG51bTsKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqaW5zbjsKLSAgICAgaW50IGlzX2xvbmc7Ci0gICAgIGludCBzaG93X2V4dDsKLXsKLSAgaW50IHZhbCwgb3BudW0sIG5lZWRfY29tbWE9MDsKLSAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlcjsKLSAgaW50IGksIG1hdGNoLCBvcGluZD0wLCBuZWVkX3BhcmVuPTAsIGZvdW5kX2NvbnRyb2w9MDsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIixpbnNuLT5vcC0+bmFtZSk7Ci0KLSAgLyogY2hlY2sgZm9yIENNUCBvciBDTVBVICovCi0gIGlmIChkMzB2X29wZXJhbmRfdGFibGVbaW5zbi0+Zm9ybS0+b3BlcmFuZHNbMF1dLmZsYWdzICYgT1BFUkFORF9OQU1FKQotICAgIHsKLSAgICAgIG9waW5kKys7Ci0gICAgICB2YWwgPSBleHRyYWN0X3ZhbHVlKG51bSwoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbaW5zbi0+Zm9ybS0+b3BlcmFuZHNbMF1dLGlzX2xvbmcpOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDMwdl9jY19uYW1lc1t2YWxdKTsKLSAgICB9Ci0KLSAgLyogYWRkIGluICIucyIgb3IgIi5sIiAqLwotICBpZiAoc2hvd19leHQgPT0gMikKLSAgICB7Ci0gICAgICBpZiAoaXNfbG9uZykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sIik7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIucyIpOwotICAgIH0KLQotICBpZiAoaW5zbi0+ZWNjKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLyVzIixkMzB2X2VjY19uYW1lc1tpbnNuLT5lY2NdKTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgd2hpbGUgKChvcG51bSA9IGluc24tPmZvcm0tPm9wZXJhbmRzW29waW5kKytdKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBiaXRzOwotICAgICAgb3BlciA9IChzdHJ1Y3QgZDMwdl9vcGVyYW5kICopJmQzMHZfb3BlcmFuZF90YWJsZVtvcG51bV07Ci0gICAgICBiaXRzID0gb3Blci0+Yml0czsKLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0JYml0cyArPSAzOwotCi0gICAgICBpZiAobmVlZF9jb21tYSAmJiBvcGVyLT5mbGFncyAhPSBPUEVSQU5EX1BMVVMgJiYgb3Blci0+ZmxhZ3MgIT0gT1BFUkFORF9NSU5VUykKLQl7Ci0JICBuZWVkX2NvbW1hPTA7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwgIik7Ci0JfQotCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVE1JTlVTKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQC0iKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX01JTlVTKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOyAgIAotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfUExVUykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsgICAKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUU0lHTikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAiKTsgICAKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUUEFSKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsgICAKLQkgIG5lZWRfcGFyZW4gPSAxOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9TUEVDSUFMKQotCWNvbnRpbnVlOwotCi0gICAgICB2YWwgPSBleHRyYWN0X3ZhbHVlKG51bSwgb3BlciwgaXNfbG9uZyk7Ci0gICAgICAKLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKQotCXsKLQkgIG1hdGNoID0gMDsKLQkgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXIzID0gCi0JCShzdHJ1Y3QgZDMwdl9vcGVyYW5kICopJmQzMHZfb3BlcmFuZF90YWJsZVtpbnNuLT5mb3JtLT5vcGVyYW5kc1syXV07CSAgICAgIAotCSAgICAgIGludCBpZCA9IGV4dHJhY3RfdmFsdWUgKG51bSwgb3BlcjMsIGlzX2xvbmcgKTsKLQkgICAgICBmb3VuZF9jb250cm9sID0gMTsKLQkgICAgICBzd2l0Y2ggKCBpZCApCi0JCXsKLQkJY2FzZSAwOgotCQkgIHZhbCB8PSBPUEVSQU5EX0NPTlRST0w7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkgIHZhbCA9IE9QRVJBTkRfQ09OVFJPTCArIE1BWF9DT05UUk9MX1JFRyArIGlkOwotCQkgIGJyZWFrOwotCQljYXNlIDM6Ci0JCSAgdmFsIHw9IE9QRVJBTkRfRkxBRzsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBmcHJpbnRmKHN0ZGVyciwiaWxsZWdhbCBpZCAoJWQpXG4iLGlkKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQUNDKQotCSAgICB2YWwgfD0gT1BFUkFORF9BQ0M7Ci0JICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfRkxBRykKLQkgICAgdmFsIHw9IE9QRVJBTkRfRkxBRzsKLQkgIGZvciAoaT0wO2k8cmVnX25hbWVfY250KCk7aSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHZhbCA9PSBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbaV0udmFsdWUpCi0JCXsKLQkJICBpZiAocHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLnBuYW1lKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAgIChpbmZvLT5zdHJlYW0sICIlcyIscHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLnBuYW1lKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJICAgICAgKGluZm8tPnN0cmVhbSwgIiVzIixwcmVfZGVmaW5lZF9yZWdpc3RlcnNbaV0ubmFtZSk7Ci0JCSAgbWF0Y2g9MTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBpZiAobWF0Y2g9PTApCi0JICAgIHsKLQkgICAgICAvKiB0aGlzIHdvdWxkIG9ubHkgZ2V0IGV4ZWN1dGVkIGlmIGEgcmVnaXN0ZXIgd2FzIG5vdCBpbiB0aGUgCi0JCSByZWdpc3RlciB0YWJsZSAqLwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkoaW5mby0+c3RyZWFtLCBfKCI8dW5rbm93biByZWdpc3RlciAlZD4iKSwgdmFsICYgMHgzRik7CSAgICAgIAotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi0+b3AtPnJlbG9jX2ZsYWcgPT0gUkVMT0NfUENSRUwgfHwgCi0JICAgICAgIChvcGluZCA9PSAxICYmIChpbnNuLT5mb3JtLT5mb3JtID09IFNIT1JUX0QyIHx8IGluc24tPmZvcm0tPmZvcm0gPT0gTE9OR19EKSkpCi0JewotCSAgbG9uZyBtYXg7Ci0JICBpbnQgbmVnPTA7Ci0JICBtYXggPSAoMSA8PCAoYml0cyAtIDEpKTsKLQkgIGlmICh2YWwgJiBtYXgpCi0JICAgIHsKLQkgICAgICBpZiAoYml0cyA9PSAzMikKLQkJdmFsID0gLXZhbDsKLQkgICAgICBlbHNlCi0JCXZhbCA9IC12YWwgJiAoKDEgPDwgYml0cyktMSk7Ci0JICAgICAgbmVnID0gMTsKLQkgICAgfQotCSAgaWYgKG9waW5kID09IDEgJiYgKGluc24tPmZvcm0tPmZvcm0gPT0gU0hPUlRfRDIgfHwgaW5zbi0+Zm9ybS0+Zm9ybSA9PSBMT05HX0QpKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIleCIsdmFsKTsKLQkgICAgfQotCSAgZWxzZSB7Ci0JICAgIGlmIChuZWcpCi0JICAgICAgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0leFx0KCIsdmFsKTsKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciAtIHZhbCkgJiBQQ19NQVNLLCBpbmZvKTsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4XHQoIix2YWwpOwotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyICsgdmFsKSAmIFBDX01BU0ssIGluZm8pOwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkgICAgICB9Ci0JICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi0+b3AtPnJlbG9jX2ZsYWcgPT0gUkVMT0NfQUJTKQotCXsKLQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsLCBpbmZvKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0JICAgIHsKLQkgICAgICBpbnQgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JICAgICAgaWYgKHZhbCAmIG1heCkKLQkJewotCQkgIHZhbCA9IC12YWw7Ci0JCSAgaWYgKGJpdHMgPCAzMikKLQkJICAgIHZhbCAmPSAoKDEgPDwgYml0cykgLSAxKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsKLQkJfQotCSAgICB9Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLHZhbCk7Ci0JfQotICAgICAgLyogaWYgdGhlcmUgaXMgYW5vdGhlciBvcGVyYW5kLCB0aGVuIHdyaXRlIGEgY29tbWEgYW5kIHNwYWNlICovCi0gICAgICBpZiAoaW5zbi0+Zm9ybS0+b3BlcmFuZHNbb3BpbmRdICYmICEoZm91bmRfY29udHJvbCAmJiBvcGluZCA9PSAyKSkKLQluZWVkX2NvbW1hID0gMTsKLSAgICB9Ci0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotfQotCi0KLQotc3RhdGljIGludAotZXh0cmFjdF92YWx1ZSAobnVtLCBvcGVyLCBpc19sb25nKQotICAgICBsb25nIGxvbmcgbnVtOwotICAgICBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcGVyOwotICAgICBpbnQgaXNfbG9uZzsKLXsKLSAgaW50IHZhbDsKLSAgaW50IHNoaWZ0ID0gMTIgLSBvcGVyLT5wb3NpdGlvbjsKLSAgaW50IG1hc2sgPSAoMHhGRkZGRkZGRiA+PiAoMzIgLSBvcGVyLT5iaXRzKSk7Ci0KLSAgaWYgKGlzX2xvbmcpCi0gICAgewotICAgICAgaWYgKG9wZXItPmJpdHMgPT0gMzIpIAotCXsKLQkgIC8qIHBpZWNlIHRvZ2V0aGVyIDMyLWJpdCBjb25zdGFudCAqLwotCSAgdmFsID0gKChudW0gJiAweDNGRkZGKQotCQkgfCAoKG51bSAmIDB4RkYwMDAwMCkgPj4gMikKLQkJIHwgKChudW0gJiAweDNGMDAwMDAwMDBMTCkgPj4gNikpOwotCX0KLSAgICAgIGVsc2UJCi0JdmFsID0gKG51bSA+PiAoMzIgKyBzaGlmdCkpICYgbWFzazsJCi0gICAgfQotICBlbHNlCi0gICAgdmFsID0gKG51bSA+PiBzaGlmdCkgJiBtYXNrOwotCi0gIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0gICAgdmFsIDw8PSAzOwotCi0gIHJldHVybiB2YWw7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2QzMHYtb3BjLmMgYi9vcGNvZGVzL2QzMHYtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOGZjYzAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMzB2LW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qIGQzMHYtb3BjLmMgLS0gRDMwViBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiCi0KLQotLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuICovCi0vKiBJZiB5b3UgYWRkIGFueXRoaW5nLCBpdCBNVVNUIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlciAqLwotLyogVGhlIGZpcnN0IGZpZWxkIGlzIHRoZSBuYW1lIHRoZSBhc3NlbWJsZXIgdXNlcyB3aGVuIGxvb2tpbmcgKi8KLS8qIHVwIG9yY29kZXMuICBUaGUgc2Vjb25kIGZpZWxkIGlzIHRoZSBuYW1lIHRoZSBkaXNhc3NlbWJsZXIgd2lsbCB1c2UuICovCi0vKiBUaGlzIGFsbG93cyB0aGUgYXNzZW1ibGVyIHRvIGFzc2VtYmxlIHJlZmVyZW5jZXMgdG8gcjYzIChmb3IgZXhhbXBsZSkgKi8KLS8qIG9yICJzcCIuICBUaGUgZGlzYXNzZW1ibGVyIHdpbGwgYWx3YXlzIHVzZSB0aGUgcHJlZmVycmVkIGZvcm0gKHNwKSAqLwotY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgTlVMTCwgT1BFUkFORF9BQ0MrMCB9LAotICB7ICJhMSIsIE5VTEwsIE9QRVJBTkRfQUNDKzEgfSwKLSAgeyAiYnBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMgfSwKLSAgeyAiYnBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxIH0sCi0gIHsgImMiLCAiYyIsIE9QRVJBTkRfRkxBRys3IH0sCi0gIHsgImNyMCIsICJwc3ciLCBPUEVSQU5EX0NPTlRST0wgfSwKLSAgeyAiY3IxIiwgImJwc3ciLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjcjEwIiwgIm1vZF9zIiwgT1BFUkFORF9DT05UUk9MKzEwIH0sCi0gIHsgImNyMTEiLCAibW9kX2UiLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAiY3IxMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMiB9LAotICB7ICJjcjEzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEzIH0sCi0gIHsgImNyMTQiLCAiaWJhIiwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImNyMTUiLCAiZWl0X3ZiIiwgT1BFUkFORF9DT05UUk9MKzE1IH0sCi0gIHsgImNyMTYiLCAiaW50X3MiLCBPUEVSQU5EX0NPTlRST0wrMTYgfSwKLSAgeyAiY3IxNyIsICJpbnRfbSIsIE9QRVJBTkRfQ09OVFJPTCsxNyB9LAotICB7ICJjcjE4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE4IH0sCi0gIHsgImNyMTkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTkgfSwKLSAgeyAiY3IyIiwgInBjIiwgT1BFUkFORF9DT05UUk9MKzIgfSwKLSAgeyAiY3IyMCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMCB9LAotICB7ICJjcjIxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIxIH0sCi0gIHsgImNyMjIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjIgfSwKLSAgeyAiY3IyMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMyB9LAotICB7ICJjcjI0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI0IH0sCi0gIHsgImNyMjUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjUgfSwKLSAgeyAiY3IyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNiB9LAotICB7ICJjcjI3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI3IH0sCi0gIHsgImNyMjgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjggfSwKLSAgeyAiY3IyOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyOSB9LAotICB7ICJjcjMiLCAiYnBjIiwgT1BFUkFORF9DT05UUk9MKzMgfSwKLSAgeyAiY3IzMCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMCB9LAotICB7ICJjcjMxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMxIH0sCi0gIHsgImNyMzIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzIgfSwKLSAgeyAiY3IzMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMyB9LAotICB7ICJjcjM0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM0IH0sCi0gIHsgImNyMzUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzUgfSwKLSAgeyAiY3IzNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNiB9LAotICB7ICJjcjM3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM3IH0sCi0gIHsgImNyMzgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzggfSwKLSAgeyAiY3IzOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszOSB9LAotICB7ICJjcjQiLCAiZHBzdyIsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImNyNDAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDAgfSwKLSAgeyAiY3I0MSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MSB9LAotICB7ICJjcjQyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQyIH0sCi0gIHsgImNyNDMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDMgfSwKLSAgeyAiY3I0NCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NCB9LAotICB7ICJjcjQ1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ1IH0sCi0gIHsgImNyNDYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDYgfSwKLSAgeyAiY3I0NyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NyB9LAotICB7ICJjcjQ4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ4IH0sCi0gIHsgImNyNDkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDkgfSwKLSAgeyAiY3I1IiwiZHBjIiwgT1BFUkFORF9DT05UUk9MKzUgfSwKLSAgeyAiY3I1MCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MCB9LAotICB7ICJjcjUxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUxIH0sCi0gIHsgImNyNTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTIgfSwKLSAgeyAiY3I1MyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MyB9LAotICB7ICJjcjU0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU0IH0sCi0gIHsgImNyNTUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTUgfSwKLSAgeyAiY3I1NiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NiB9LAotICB7ICJjcjU3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU3IH0sCi0gIHsgImNyNTgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTggfSwKLSAgeyAiY3I1OSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1OSB9LAotICB7ICJjcjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNiB9LAotICB7ICJjcjYwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYwIH0sCi0gIHsgImNyNjEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjEgfSwKLSAgeyAiY3I2MiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MiB9LAotICB7ICJjcjYzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYzIH0sCi0gIHsgImNyNyIsICJycHRfYyIsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgImNyOCIsICJycHRfcyIsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgImNyOSIsICJycHRfZSIsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCi0gIHsgImRwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImRwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNCB9LAotICB7ICJlaXRfdmIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKLSAgeyAiZjAiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMCB9LAotICB7ICJmMSIsIE5VTEwsIE9QRVJBTkRfRkxBRysxIH0sCi0gIHsgImYyIiwgTlVMTCwgT1BFUkFORF9GTEFHKzIgfSwKLSAgeyAiZjMiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMyB9LAotICB7ICJmNCIsICJzIiwgT1BFUkFORF9GTEFHKzQgfSwKLSAgeyAiZjUiLCAidiIsIE9QRVJBTkRfRkxBRys1IH0sCi0gIHsgImY2IiwgInZhIiwgT1BFUkFORF9GTEFHKzYgfSwKLSAgeyAiZjciLCAiYyIsIE9QRVJBTkRfRkxBRys3IH0sCi0gIHsgImliYSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAotICB7ICJpbnRfbSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNyB9LAotICB7ICJpbnRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNiB9LAotICB7ICJsaW5rIiwgInI2MiIsIDYyIH0sCi0gIHsgIm1vZF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzExIH0sCi0gIHsgIm1vZF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEwIH0sCi0gIHsgInBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIgfSwKLSAgeyAicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MIH0sCi0gIHsgInBzd2giLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzIgfSwKLSAgeyAicHN3bCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMSB9LAotICB7ICJyMCIsIE5VTEwsIDAgfSwKLSAgeyAicjEiLCBOVUxMLCAxIH0sCi0gIHsgInIxMCIsIE5VTEwsIDEwIH0sCi0gIHsgInIxMSIsIE5VTEwsIDExIH0sCi0gIHsgInIxMiIsIE5VTEwsIDEyIH0sCi0gIHsgInIxMyIsIE5VTEwsIDEzIH0sCi0gIHsgInIxNCIsIE5VTEwsIDE0IH0sCi0gIHsgInIxNSIsIE5VTEwsIDE1IH0sCi0gIHsgInIxNiIsIE5VTEwsIDE2IH0sCi0gIHsgInIxNyIsIE5VTEwsIDE3IH0sCi0gIHsgInIxOCIsIE5VTEwsIDE4IH0sCi0gIHsgInIxOSIsIE5VTEwsIDE5IH0sCi0gIHsgInIyIiwgTlVMTCwgMiB9LAotICB7ICJyMjAiLCBOVUxMLCAyMCB9LAotICB7ICJyMjEiLCBOVUxMLCAyMSB9LAotICB7ICJyMjIiLCBOVUxMLCAyMiB9LAotICB7ICJyMjMiLCBOVUxMLCAyMyB9LAotICB7ICJyMjQiLCBOVUxMLCAyNCB9LAotICB7ICJyMjUiLCBOVUxMLCAyNSB9LAotICB7ICJyMjYiLCBOVUxMLCAyNiB9LAotICB7ICJyMjciLCBOVUxMLCAyNyB9LAotICB7ICJyMjgiLCBOVUxMLCAyOCB9LAotICB7ICJyMjkiLCBOVUxMLCAyOSB9LAotICB7ICJyMyIsIE5VTEwsIDMgfSwKLSAgeyAicjMwIiwgTlVMTCwgMzAgfSwKLSAgeyAicjMxIiwgTlVMTCwgMzEgfSwKLSAgeyAicjMyIiwgTlVMTCwgMzIgfSwKLSAgeyAicjMzIiwgTlVMTCwgMzMgfSwKLSAgeyAicjM0IiwgTlVMTCwgMzQgfSwKLSAgeyAicjM1IiwgTlVMTCwgMzUgfSwKLSAgeyAicjM2IiwgTlVMTCwgMzYgfSwKLSAgeyAicjM3IiwgTlVMTCwgMzcgfSwKLSAgeyAicjM4IiwgTlVMTCwgMzggfSwKLSAgeyAicjM5IiwgTlVMTCwgMzkgfSwKLSAgeyAicjQiLCBOVUxMLCA0IH0sCi0gIHsgInI0MCIsIE5VTEwsIDQwIH0sCi0gIHsgInI0MSIsIE5VTEwsIDQxIH0sCi0gIHsgInI0MiIsIE5VTEwsIDQyIH0sCi0gIHsgInI0MyIsIE5VTEwsIDQzIH0sCi0gIHsgInI0NCIsIE5VTEwsIDQ0IH0sCi0gIHsgInI0NSIsIE5VTEwsIDQ1IH0sCi0gIHsgInI0NiIsIE5VTEwsIDQ2IH0sCi0gIHsgInI0NyIsIE5VTEwsIDQ3IH0sCi0gIHsgInI0OCIsIE5VTEwsIDQ4IH0sCi0gIHsgInI0OSIsIE5VTEwsIDQ5IH0sCi0gIHsgInI1IiwgTlVMTCwgNSB9LAotICB7ICJyNTAiLCBOVUxMLCA1MCB9LAotICB7ICJyNTEiLCBOVUxMLCA1MSB9LAotICB7ICJyNTIiLCBOVUxMLCA1MiB9LAotICB7ICJyNTMiLCBOVUxMLCA1MyB9LAotICB7ICJyNTQiLCBOVUxMLCA1NCB9LAotICB7ICJyNTUiLCBOVUxMLCA1NSB9LAotICB7ICJyNTYiLCBOVUxMLCA1NiB9LAotICB7ICJyNTciLCBOVUxMLCA1NyB9LAotICB7ICJyNTgiLCBOVUxMLCA1OCB9LAotICB7ICJyNTkiLCBOVUxMLCA1OSB9LAotICB7ICJyNiIsIE5VTEwsIDYgfSwKLSAgeyAicjYwIiwgTlVMTCwgNjAgfSwKLSAgeyAicjYxIiwgTlVMTCwgNjEgfSwKLSAgeyAicjYyIiwgImxpbmsiLCA2MiB9LAotICB7ICJyNjMiLCAic3AiLCA2MyB9LAotICB7ICJyNyIsIE5VTEwsIDcgfSwKLSAgeyAicjgiLCBOVUxMLCA4IH0sCi0gIHsgInI5IiwgTlVMTCwgOSB9LAotICB7ICJycHRfYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgInJwdF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAicnB0X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJzIiwgTlVMTCwgT1BFUkFORF9GTEFHKzQgfSwKLSAgeyAic3AiLCBOVUxMLCA2MyB9LAotICB7ICJ2IiwgTlVMTCwgT1BFUkFORF9GTEFHKzUgfSwKLSAgeyAidmEiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNiB9LAotfTsKLQotaW50IAotcmVnX25hbWVfY250KCkKLXsKLSAgcmV0dXJuIChzaXplb2YocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSk7Ci19Ci0KLS8qIE9QQ09ERSBUQUJMRSAqLwotLyogVGhlIGZvcm1hdCBvZiB0aGlzIHRhYmxlIGlzIGRlZmluZWQgaW4gb3Bjb2RlL2QzMHYuaCAqLwotY29uc3Qgc3RydWN0IGQzMHZfb3Bjb2RlIGQzMHZfb3Bjb2RlX3RhYmxlW10gPSB7Ci0gIHsgImFicyIsIElBTFUxLCAweDgsIHsgU0hPUlRfVSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYWRkIiwgSUFMVTEsIDB4MCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkMmgiLCBJQUxVMSwgMHgxLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYWRkYyIsIElBTFUxLCAweDQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQywgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsbGwiLCBJQUxVMSwgMHgxMCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGxoIiwgSUFMVTEsIDB4MTEsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxobCIsIElBTFUxLCAweDEyLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsaGgiLCBJQUxVMSwgMHgxMywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGxsIiwgSUFMVTEsIDB4MTQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhsaCIsIElBTFUxLCAweDE1LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhoaGwiLCBJQUxVMSwgMHgxNiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGhoIiwgSUFMVTEsIDB4MTcsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkcyIsIElBTFUxLCAweDYsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRzMmgiLCBJQUxVMSwgMHg3LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImFuZCIsIExPR0lDLCAweDE4LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImFuZGZnIiwgTE9HSUMsIDB4OCwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhdmciLCBJQUxVMSwgMHhhLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYXZnMmgiLCBJQUxVMSwgMHhiLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYmNsciIsIExPR0lDLCAweDMsIHsgU0hPUlRfQSB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAotICB7ICJibm90IiwgTE9HSUMsIDB4MSwgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImJyYSIsIEJSQSwgMCwgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJyYXRueiIsIEJSQSwgMHg0LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJyYXR6ciIsIEJSQSwgMHg0LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJic2V0IiwgTE9HSUMsIDB4MiwgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImJzciIsIEJSQSwgMHgyLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnNydG56IiwgQlJBLCAweDYsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnNydHpyIiwgQlJBLCAweDYsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJ0c3QiLCBMT0dJQywgMCwgeyBTSE9SVF9BRiB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAotICB7ICJjbXAiLCBMT0dJQywgMHhDLCB7IFNIT1JUX0NNUCwgTE9OR19DTVAgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImNtcHUiLCBMT0dJQywgMHhELCB7IFNIT1JUX0NNUFUsIExPTkdfQ01QIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJkYnJhIiwgQlJBLCAweDEwLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJyYWkiLCBCUkEsIDB4MTQsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnNyIiwgQlJBLCAweDEyLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJzcmkiLCBCUkEsIDB4MTYsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnQiLCBCUkEsIDB4YiwgeyBTSE9SVF9OT05FIH0sIE1VLCBGTEFHX0pTUiwgRkxBR19MS1IsIDAgfSwKLSAgeyAiZGptcCIsIEJSQSwgMHgxMSwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAotICB7ICJkam1waSIsIEJSQSwgMHgxNSwgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAotICB7ICJkanNyIiwgQlJBLCAweDEzLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCi0gIHsgImRqc3JpIiwgQlJBLCAweDE3LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCi0gIHsgImptcCIsIEJSQSwgMHgxLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImptcHRueiIsIEJSQSwgMHg1LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqbXB0enIiLCBCUkEsIDB4NSwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImpvaW5sbCIsIElBTFUxLCAweEMsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiam9pbmxoIiwgSUFMVTEsIDB4RCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqb2luaGwiLCBJQUxVMSwgMHhFLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpvaW5oaCIsIElBTFUxLCAweEYsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAianNyIiwgQlJBLCAweDMsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAianNydG56IiwgQlJBLCAweDcsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImpzcnR6ciIsIEJSQSwgMHg3LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAibGQyaCIsIElNRU0sIDB4MywgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGQydyIsIElNRU0sIDB4NiwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0gfCBGTEFHXzJXT1JELCAwLCAwIH0sCi0gIHsgImxkNGJoIiwgSU1FTSwgMHg1LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSB8IEZMQUdfMldPUkQsIDAsIDAgfSwKLSAgeyAibGQ0Ymh1IiwgSU1FTSwgMHhkLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGIiLCBJTUVNLCAwLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRidSIsIElNRU0sIDB4OSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkaCIsIElNRU0sIDB4MiwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkaGgiLCBJTUVNLCAweDEsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGh1IiwgSU1FTSwgMHhhLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGR3IiwgSU1FTSwgMHg0LCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibWFjMCIsIElBTFUyLCAweDE0LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibWFjMSIsIElBTFUyLCAweDE0LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1hY3MwIiwgSUFMVTIsIDB4MTUsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtYWNzMSIsIElBTFUyLCAweDE1LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1vZGRlYyIsIElNRU0sIDB4NywgeyBTSE9SVF9NT0RERUMgfSwgTVUsIDAsIDAsIDAgfSwKLSAgeyAibW9kaW5jIiwgSU1FTSwgMHg3LCB7IFNIT1JUX01PRElOQyB9LCBNVSwgMCwgMCwgMCB9LAotICB7ICJtc3ViMCIsIElBTFUyLCAweDE2LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXN1YjEiLCBJQUxVMiwgMHgxNiwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtc3ViczAiLCBJQUxVMiwgMHgxNywgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1zdWJzMSIsIElBTFUyLCAweDE3LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm11bCIsIElBTFUyLCAweDEwLCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXVsMmgiLCBJQUxVMiwgMCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4bGwiLCBJQUxVMiwgMHg0LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhsaCIsIElBTFUyLCAweDUsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGhsIiwgSUFMVTIsIDB4NiwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4aGgiLCBJQUxVMiwgMHg3LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVseCIsIElBTFUyLCAweDE4LCB7IFNIT1JUX0FBIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm11bHgyaCIsIElBTFUyLCAweDEsIHsgU0hPUlRfQTIgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVseHMiLCBJQUxVMiwgMHgxOSwgeyBTSE9SVF9BQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdmZhY2MiLCBJQUxVMiwgMHgxZiwgeyBTSE9SVF9SQSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJtdmZzeXMiLCBCUkEsIDB4MWUsIHsgU0hPUlRfQzEgfSwgTVUsIEZMQUdfQUxMLCBGTEFHX0FMTCwgMCB9LAotICB7ICJtdnRhY2MiLCBJQUxVMiwgMHhmLCB7IFNIT1JUX0FSIH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgIm12dHN5cyIsIEJSQSwgMHhlLCB7IFNIT1JUX0MyIH0sIE1VLCBGTEFHX0FMTCwgRkxBR19BTEwsIDAgfSwKLSAgeyAibm9wIiwgQlJBLCAweEYsIHsgU0hPUlRfTk9ORSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAibm90IiwgTE9HSUMsIDB4MTksIHsgU0hPUlRfVSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAibm90ZmciLCBMT0dJQywgMHg5LCB7IFNIT1JUX1VGIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJvciIsIExPR0lDLCAweDFhLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm9yZmciLCBMT0dJQywgMHhhLCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInJlaXQiLCBCUkEsIDB4OCwgeyBTSE9SVF9OT05FIH0sIE1VLCBGTEFHX1NNIHwgRkxBR19KTVAsIEZMQUdfU00gfCBGTEFHX0xLUiwgMCB9LAotICB7ICJyZXBlYXQiLCBCUkEsIDB4MTgsIHsgU0hPUlRfRDEsIExPTkdfMiB9LCBNVSwgRkxBR19SUCwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAicmVwZWF0aSIsIEJSQSwgMHgxYSwgeyBTSE9SVF9EMkIsIExPTkdfRGIgfSwgTVUsIEZMQUdfUlAsIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgInJvdCIsIExPR0lDLCAweDE0LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInJvdDJoIiwgTE9HSUMsIDB4MTUsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAicnRkIiwgQlJBLCAweGEsIHsgU0hPUlRfTk9ORSB9LCBNVSwgRkxBR19KTVAsIEZMQUdfTEtSLCAwIH0sCi0gIHsgInNhdCIsIElBTFUyLCAweDgsIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAic2F0MmgiLCBJQUxVMiwgMHg5LCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgInNhdGhsIiwgSUFMVTIsIDB4MWMsIHsgU0hPUlRfQTUgfSwgSVUsIEZMQUdfQUREU1VCcHBwLCAwLCAwIH0sCi0gIHsgInNhdGhoIiwgSUFMVTIsIDB4MWQsIHsgU0hPUlRfQTUgfSwgSVUsIEZMQUdfQUREU1VCcHBwLCAwLCAwIH0sCi0gIHsgInNhdHoiLCBJQUxVMiwgMHhhLCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgInNhdHoyaCIsIElBTFUyLCAweGIsIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAic3JhIiwgTE9HSUMsIDB4MTAsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JhMmgiLCBMT0dJQywgMHgxMSwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmFoaCIsIExPR0lDLCAweDUsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JhaGwiLCBMT0dJQywgMHg0LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYyIsIExPR0lDLCAweDE2LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgMCwgMCB9LAotICB7ICJzcmwiLCBMT0dJQywgMHgxMiwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmwyaCIsIExPR0lDLCAweDEzLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNybGhoIiwgTE9HSUMsIDB4NywgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmxobCIsIExPR0lDLCAweDYsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3QyaCIsIElNRU0sIDB4MTMsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCi0gIHsgInN0MnciLCBJTUVNLCAweDE2LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCAwLCBGTEFHX01FTSB8IEZMQUdfMldPUkQsIDAgfSwKLSAgeyAic3Q0aGIiLCBJTUVNLCAweDE1LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCAwLCBGTEFHX01FTSB8IEZMQUdfMldPUkQsIDAgfSwKLSAgeyAic3RiIiwgSU1FTSwgMHgxMCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCi0gIHsgInN0aCIsIElNRU0sIDB4MTIsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAotICB7ICJzdGhoIiwgSU1FTSwgMHgxMSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCi0gIHsgInN0dyIsIElNRU0sIDB4MTQsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAotICB7ICJzdWIiLCBJQUxVMSwgMHgyLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWIyaCIsIElBTFUxLCAweDMsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzdWJiIiwgSUFMVTEsIDB4NSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0MsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWJobGxsIiwgSUFMVTEsIDB4MTgsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWJobGxoIiwgSUFMVTEsIDB4MTksIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWJobGhsIiwgSUFMVTEsIDB4MWEsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWJobGhoIiwgSUFMVTEsIDB4MWIsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWJoaGxsIiwgSUFMVTEsIDB4MWMsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWJoaGxoIiwgSUFMVTEsIDB4MWQsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWJoaGhsIiwgSUFMVTEsIDB4MWUsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJzdWJoaGhoIiwgSUFMVTEsIDB4MWYsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJ0cmFwIiwgQlJBLCAweDksIHsgU0hPUlRfQjEsIFNIT1JUX1R9LCBNVSwgRkxBR19KU1IsIEZMQUdfU00gfCBGTEFHX0xLUiwgMCB9LAotICB7ICJ4b3IiLCBMT0dJQywgMHgxYiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJ4b3JmZyIsIExPR0lDLCAweGIsIHsgU0hPUlRfRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyBOVUxMLCAwLCAwLCB7IDAgfSwgMCwgMCwgMCwgMCB9LAotfTsKLQotCi0vKiBub3cgZGVmaW5lIHRoZSBvcGVyYW5kIHR5cGVzICovCi0vKiBmb3JtYXQgaXMgbGVuZ3RoLCBiaXRzLCBwb3NpdGlvbiwgZmxhZ3MgKi8KLWNvbnN0IHN0cnVjdCBkMzB2X29wZXJhbmQgZDMwdl9vcGVyYW5kX3RhYmxlW10gPQotewotI2RlZmluZSBVTlVTRUQJKDApCi0gIHsgMCwgMCwgMCwgMCB9LAotI2RlZmluZSBSYQkoVU5VU0VEICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1QgfSwKLSNkZWZpbmUgUmEyCShSYSArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9ERVNUfE9QRVJBTkRfMlJFRyB9LAotI2RlZmluZSBSYTMJKFJhMiArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUmIJKFJhMyArIDEpCi0gIHsgNiwgNiwgNiwgT1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUmMJKFJiICsgMSkKLSAgeyA2LCA2LCAxMiwgT1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQWEJKFJjICsgMSkKLSAgeyA2LCAxLCAwLCBPUEVSQU5EX0FDQ3xPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1QgfSwKLSNkZWZpbmUgQWIJKEFhICsgMSkKLSAgeyA2LCAxLCA2LCBPUEVSQU5EX0FDQ3xPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBJTU01CShBYiArIDEpCi0gIHsgNiwgNSwgMTIsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIElNTTVVCShJTU01ICsgMSkKLSAgeyA2LCA1LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgSU1NNVMzCShJTU01VSArIDEpCi0gIHsgNiwgNSwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIElNTTYJKElNTTVTMyArIDEpCi0gIHsgNiwgNiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIElNTTZVCShJTU02ICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBJTU02VTIJKElNTTZVICsgMSkKLSAgeyA2LCA2LCAxMiwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgSU1NNlMzCShJTU02VTIgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgSU1NMTJTMwkoSU1NNlMzICsgMSkKLSAgeyAxMiwgMTIsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRHxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIElNTTEyUzNVIChJTU0xMlMzICsgMSkKLSAgeyAxMiwgMTIsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIElNTTE4UzMJKElNTTEyUzNVICsgMSkKLSAgeyAxOCwgMTgsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRHxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIElNTTMyCShJTU0xOFMzICsgMSkKLSAgeyAzMiwgMzIsIDAsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIEZhCShJTU0zMiArIDEpCi0gIHsgNiwgMywgMCwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZMQUcgfCBPUEVSQU5EX0RFU1QgfSwKLSNkZWZpbmUgRmIJKEZhICsgMSkKLSAgeyA2LCAzLCA2LCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB9LAotI2RlZmluZSBGYwkoRmIgKyAxKQotICB7IDYsIDMsIDEyLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB9LAotI2RlZmluZSBBVFNJR04JKEZjICsgMSkKLSAgeyAwLCAwLCAwLCBPUEVSQU5EX0FUU0lHTn0sCi0jZGVmaW5lIEFUUEFSCShBVFNJR04gKyAxKQkvKiAiQCgiICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9BVFBBUn0sCi0jZGVmaW5lIFBMVVMJKEFUUEFSICsgMSkJLyogcG9zdGluY3JlbWVudCAqLwotICB7IDAsIDAsIDAsIE9QRVJBTkRfUExVU30sCi0jZGVmaW5lIE1JTlVTCShQTFVTICsgMSkJLyogcG9zdGRlY3JlbWVudCAqLwotICB7IDAsIDAsIDAsIE9QRVJBTkRfTUlOVVN9LAotI2RlZmluZSBBVE1JTlVTCShNSU5VUyArIDEpCS8qIHByZWRlY3JlbWVudCAqLwotICB7IDAsIDAsIDAsIE9QRVJBTkRfQVRNSU5VU30sCi0jZGVmaW5lIENhCShBVE1JTlVTICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTHxPUEVSQU5EX0RFU1R9LAotI2RlZmluZSBDYgkoQ2EgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNiwgNiwgNiwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfSwKLSNkZWZpbmUgQ0MJKENiICsgMSkJLyogY29uZGl0aW9uIGNvZGUgKENNUGNjIGFuZCBDTVBVY2MpICovCi0gIHsgMywgMywgLTMsIE9QRVJBTkRfTkFNRX0sCi0jZGVmaW5lIEZhMgkoQ0MgKyAxKQkvKiBmbGFnIHJlZ2lzdGVyIChDTVBjYyBhbmQgQ01QVWNjKSAqLwotICB7IDMsIDMsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfRkxBR3xPUEVSQU5EX0RFU1R9LAotI2RlZmluZSBGYWtlCShGYTIgKyAxKQkvKiBwbGFjZSBob2xkZXIgZm9yICJpZCIgZmllbGQgaW4gbXZmc3lzIGFuZCBtdnRzeXMgKi8KLSAgeyA2LCAyLCAxMiwgT1BFUkFORF9TUEVDSUFMfSwKLX07Ci0KLS8qIG5vdyB3ZSBuZWVkIHRvIGRlZmluZSB0aGUgaW5zdHJ1Y3Rpb24gZm9ybWF0cyAqLwotY29uc3Qgc3RydWN0IGQzMHZfZm9ybWF0IGQzMHZfZm9ybWF0X3RhYmxlW10gPQotewotICB7IDAsIDAsIHsgMCB9IH0sCi0gIHsgU0hPUlRfTSwgMCwgeyBSYSwgQVRQQVIsIFJiLCBSYyB9IH0sCS8qIFJhLEAoUmIsUmMpICovCi0gIHsgU0hPUlRfTSwgMSwgeyBSYSwgQVRQQVIsIFJiLCBQTFVTLCBSYyB9IH0sCS8qIFJhLEAoUmIrLFJjKSAqLwotICB7IFNIT1JUX00sIDIsIHsgUmEsIEFUUEFSLCBSYiwgSU1NNiB9IH0sCS8qIFJhLEAoUmIsaW1tNikgKi8KLSAgeyBTSE9SVF9NLCAzLCB7IFJhLCBBVFBBUiwgUmIsIE1JTlVTLCBSYyB9IH0sCS8qIFJhLEAoUmItLFJjKSAqLwotICB7IFNIT1JUX00yLCAwLCB7IFJhMiwgQVRQQVIsIFJiLCBSYyB9IH0sCS8qIFJhLEAoUmIsUmMpICovCi0gIHsgU0hPUlRfTTIsIDEsIHsgUmEyLCBBVFBBUiwgUmIsIFBMVVMsIFJjIH0gfSwJLyogUmEsQChSYissUmMpICovCi0gIHsgU0hPUlRfTTIsIDIsIHsgUmEyLCBBVFBBUiwgUmIsIElNTTYgfSB9LAkvKiBSYSxAKFJiLGltbTYpICovCi0gIHsgU0hPUlRfTTIsIDMsIHsgUmEyLCBBVFBBUiwgUmIsIE1JTlVTLCBSYyB9IH0sCS8qIFJhLEAoUmItLFJjKSAqLwotICB7IFNIT1JUX0EsIDAsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyAqLwotICB7IFNIT1JUX0EsIDIsIHsgUmEsIFJiLCBJTU02IH0gfSwJCS8qIFJhLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9CMSwgMCwgeyBSYyB9IH0sCQkJLyogUmMgKi8KLSAgeyBTSE9SVF9CMiwgMiwgeyBJTU0xOFMzIH0gfSwJCQkvKiBpbW0xOCAqLwotICB7IFNIT1JUX0IzLCAwLCB7IFJhMywgUmMgfSB9LAkJCS8qIFJhLFJjICovCi0gIHsgU0hPUlRfQjMsIDIsIHsgUmEzLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyICovCi0gIHsgU0hPUlRfQjNiLCAxLCB7IFJhMywgUmMgfSB9LAkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9CM2IsIDMsIHsgUmEzLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyICovCi0gIHsgU0hPUlRfRDEsIDAsIHsgUmEsIFJjIH0gfSwJCQkvKiBSYSxSYyAqLwotICB7IFNIT1JUX0QxLCAyLCB7IFJhLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyczMgKi8KLSAgeyBTSE9SVF9EMiwgMCwgeyBJTU02UzMsIFJjIH0gfSwJCS8qIGltbTZzMyxSYyAqLwotICB7IFNIT1JUX0QyLCAyLCB7IElNTTZTMywgSU1NMTJTMyB9IH0sCQkvKiBpbW02czMsaW1tMTJzMyAqLwotICB7IFNIT1JUX0QyQiwgMCwgeyBJTU02VSwgUmMgfSB9LAkJLyogaW1tNnUsUmMgKi8KLSAgeyBTSE9SVF9EMkIsIDIsIHsgSU1NNlUsIElNTTEyUzNVIH0gfSwJLyogaW1tNnUsaW1tMTJzM3UgKi8KLSAgeyBTSE9SVF9VLCAwLCB7IFJhLCBSYiB9IH0sCQkJLyogUmEsUmIgKi8KLSAgeyBTSE9SVF9VLCAyLCB7IFJhLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyIChyZXBlYXQpICovCi0gIHsgU0hPUlRfRiwgMCwgeyBGYSwgRmIsIEZjIH0gfSwJCS8qIEZhLEZiLEZjICAob3JmZywgeG9yZmcpICovCi0gIHsgU0hPUlRfRiwgMiwgeyBGYSwgRmIsIElNTTYgfSB9LAkJLyogRmEsRmIsaW1tNiAqLwotICB7IFNIT1JUX0FGLCAwLCB7IEZhLCBSYiwgUmMgfSB9LAkJLyogRmEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BRiwgMiwgeyBGYSwgUmIsIElNTTYgfSB9LAkJLyogRmEsUmIsaW1tNiAqLwotICB7IFNIT1JUX1QsIDIsIHsgSU1NNSB9IH0sCQkJLyogaW1tNXMzICAgKHRyYXApICovCi0gIHsgU0hPUlRfQTUsIDAsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyAqLwotICB7IFNIT1JUX0E1LCAyLCB7IFJhLCBSYiwgSU1NNSB9IH0sCQkvKiBSYSxSYixpbW01ICAgIChzYXQqKSAqLwotICB7IFNIT1JUX0NNUCwgMCwgeyBDQywgRmEyLCBSYiwgUmN9IH0sCQkvKiBDQyAgRmEyLFJiLFJjICovCi0gIHsgU0hPUlRfQ01QLCAyLCB7IENDLCBGYTIsIFJiLCBJTU02fSB9LAkvKiBDQyAgRmEyLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9DTVBVLCAwLCB7IENDLCBGYTIsIFJiLCBSY30gfSwJLyogQ0MgIEZhMixSYixSYyAqLwotICB7IFNIT1JUX0NNUFUsIDIsIHsgQ0MsIEZhMiwgUmIsIElNTTZVMn0gfSwJLyogQ0MgIEZhMixSYixpbW02ICovCi0gIHsgU0hPUlRfQTEsIDEsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyBmb3IgTUFDIHdoZXJlIGE9MSAqLwotICB7IFNIT1JUX0ExLCAzLCB7IFJhLCBSYiwgSU1NNiB9IH0sCQkvKiBSYSxSYixpbW02IGZvciBNQUMgd2hlcmUgYT0xICovCi0gIHsgU0hPUlRfQUEsIDAsIHsgQWEsIFJiLCBSYyB9IH0sCQkvKiBBYSxSYixSYyAqLwotICB7IFNIT1JUX0FBLCAyLCB7IEFhLCBSYiwgSU1NNiB9IH0sCQkvKiBBYSxSYixpbW02ICovCi0gIHsgU0hPUlRfUkEsIDAsIHsgUmEsIEFiLCBSYyB9IH0sCQkvKiBSYSxBYixSYyAqLwotICB7IFNIT1JUX1JBLCAyLCB7IFJhLCBBYiwgSU1NNlUyIH0gfSwJCS8qIFJhLEFiLGltbTZ1ICovCi0gIHsgU0hPUlRfTU9ESU5DLCAxLCB7IFJiLCBJTU01IH0gfSwJCS8qIFJiLGltbTUgKG1vZGluYykgKi8KLSAgeyBTSE9SVF9NT0RERUMsIDMsIHsgUmIsIElNTTUgfSB9LAkJLyogUmIsaW1tNSAobW9kZGVjKSAqLwotICB7IFNIT1JUX0MxLCAwLCB7IFJhLCBDYiwgRmFrZSB9IH0sCQkvKiBSYSxDYiAobXZmc3lzKSAqLwotICB7IFNIT1JUX0MyLCAwLCB7IENhLCBSYiwgRmFrZSB9IH0sCQkvKiBDYSxSYiAobXZ0c3lzKSAqLwotICB7IFNIT1JUX1VGLCAwLCB7IEZhLCBGYiB9IH0sCQkJLyogRmEsRmIgIChub3RmZykgKi8KLSAgeyBTSE9SVF9BMiwgMCwgeyBSYTIsIFJiLCBSYyB9IH0sCQkvKiBSYTIsUmIsUmMgKi8KLSAgeyBTSE9SVF9BMiwgMiwgeyBSYTIsIFJiLCBJTU02IH0gfSwJCS8qIFJhMixSYixpbW02ICovCi0gIHsgU0hPUlRfQTVTLCAwLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BNVMsIDIsIHsgUmEsIFJiLCBJTU01VSB9IH0sCQkvKiBSYSxSYixpbW01dSAgIChzaGlmdHMpICovCi0gIHsgU0hPUlRfTk9ORSwgMCwgeyAwIH0gfSwJCQkvKiBubyBvcGVyYW5kcyAobm9wLCByZWl0KSAqLwotICB7IExPTkcsIDIsIHsgUmEsIFJiLCBJTU0zMiB9IH0sCQkvKiBSYSxSYixpbW0zMiAqLwotICB7IExPTkdfVSwgMiwgeyBJTU0zMiB9IH0sCQkJLyogaW1tMzIgKi8KLSAgeyBMT05HX0FGLCAyLCB7IEZhLCBSYiwgSU1NMzIgfSB9LAkJLyogRmEsUmIsaW1tMzIgKi8KLSAgeyBMT05HX0NNUCwgMiwgeyBDQywgRmEyLCBSYiwgSU1NMzJ9IH0sCS8qIENDICBGYTIsUmIsaW1tMzIgKi8KLSAgeyBMT05HX00sIDIsIHsgUmEsIEFUUEFSLCBSYiwgSU1NMzIgfSB9LAkvKiBSYSxAKFJiLGltbTMyKSAqLwotICB7IExPTkdfTTIsIDIsIHsgUmEyLCBBVFBBUiwgUmIsIElNTTMyIH0gfSwJLyogUmEsQChSYixpbW0zMikgKi8KLSAgeyBMT05HXzIsIDIsIHsgUmEzLCBJTU0zMiB9IH0sCQkvKiBSYSxpbW0zMiAqLwotICB7IExPTkdfMmIsIDMsIHsgUmEzLCBJTU0zMiB9IH0sCQkvKiBSYSxpbW0zMiAqLwotICB7IExPTkdfRCwgMiwgeyBJTU02UzMsIElNTTMyIH0gfSwJCS8qIGltbTZzMyxpbW0zMiAqLwotICB7IExPTkdfRGIsIDIsIHsgSU1NNlUsIElNTTMyIH0gfSwJCS8qIGltbTYsaW1tMzIgKi8KLSAgeyBTSE9SVF9BUiwgMCwgeyBBYSwgUmIsIFJjIH0gfSwJCS8qIEFhLFJiLFJjICovCi0gIHsgMCwgMCwgeyAwIH0gfSwKLX07Ci0KLWNvbnN0IGNoYXIgKmQzMHZfZWNjX25hbWVzW10gPQotewotICAiYWwiLAotICAidHgiLAotICAiZngiLAotICAieHQiLAotICAieGYiLAotICAidHQiLAotICAidGYiLAotICAicmVzIgotfTsKLQotY29uc3QgY2hhciAqZDMwdl9jY19uYW1lc1tdID0KLXsKLSAgImVxIiwKLSAgIm5lIiwKLSAgImd0IiwKLSAgImdlIiwKLSAgImx0IiwKLSAgImxlIiwKLSAgInBzIiwKLSAgIm5nIiwKLSAgTlVMTAotfTsKZGlmZiAtLWdpdCBhL29wY29kZXMvZGVwLWluLnNlZCBiL29wY29kZXMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwZGVlNTYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotcy9cXFxuICovIC9nCi10IGxvb3AKLQotcyFcLm86IS5sbzohCi1zISBAQkZEX0hAISAkKEJGRF9IKSFnCi1zIUBJTkNESVJAISQoSU5DRElSKSFnCi1zIUBCRkRESVJAISQoQkZERElSKSFnCi1zIUBTUkNESVJALyEhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi1zLyAqOi86L2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9vcGNvZGVzL2Rpcy1idWYuYyBiL29wY29kZXMvZGlzLWJ1Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjNmZTcyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZGlzLWJ1Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGZyb20gYSBidWZmZXIsIGZvciBHTlUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogR2V0IExFTkdUSCBieXRlcyBmcm9tIGluZm8ncyBidWZmZXIsIGF0IHRhcmdldCBhZGRyZXNzIG1lbWFkZHIuCi0gICBUcmFuc2ZlciB0aGVtIHRvIG15YWRkci4gICovCi1pbnQKLWJ1ZmZlcl9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW5ndGgsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgYmZkX2J5dGUgKm15YWRkcjsKLSAgICAgaW50IGxlbmd0aDsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmIChtZW1hZGRyIDwgaW5mby0+YnVmZmVyX3ZtYQotICAgICAgfHwgbWVtYWRkciAtIGluZm8tPmJ1ZmZlcl92bWEgKyBsZW5ndGggPiBpbmZvLT5idWZmZXJfbGVuZ3RoKQotICAgIC8qIE91dCBvZiBib3VuZHMuICBVc2UgRUlPIGJlY2F1c2UgR0RCIHVzZXMgaXQuICAqLwotICAgIHJldHVybiBFSU87Ci0gIG1lbWNweSAobXlhZGRyLCBpbmZvLT5idWZmZXIgKyAobWVtYWRkciAtIGluZm8tPmJ1ZmZlcl92bWEpLCBsZW5ndGgpOwotICByZXR1cm4gMDsKLX0KLQotLyogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvCi0gICBhbiBlcnJvciByZXR1cm4gZnJvbSBidWZmZXJfcmVhZF9tZW1vcnkuICAqLwotdm9pZAotcGVycm9yX21lbW9yeSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKQotICAgICBpbnQgc3RhdHVzOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAoc3RhdHVzICE9IEVJTykKLSAgICAvKiBDYW4ndCBoYXBwZW4uICAqLwotICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCBfKCJVbmtub3duIGVycm9yICVkXG4iKSwgc3RhdHVzKTsKLSAgZWxzZQotICAgIC8qIEFjdHVhbGx5LCBhZGRyZXNzIGJldHdlZW4gbWVtYWRkciBhbmQgbWVtYWRkciArIGxlbiB3YXMKLSAgICAgICBvdXQgb2YgYm91bmRzLiAgKi8KLSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwKLQkJCV8oIkFkZHJlc3MgMHgleCBpcyBvdXQgb2YgYm91bmRzLlxuIiksIG1lbWFkZHIpOwotfQotCi0vKiBUaGlzIGNvdWxkIGJlIGluIGEgc2VwYXJhdGUgZmlsZSwgdG8gc2F2ZSBtaW5pc2N1bGUgYW1vdW50cyBvZiBzcGFjZQotICAgaW4gc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuICAqLwotCi0vKiBKdXN0IHByaW50IHRoZSBhZGRyZXNzIGlzIGhleC4gIFRoaXMgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBldmVuCi0gICB0aG91Z2ggYm90aCBHREIgYW5kIG9iamR1bXAgcHJvdmlkZSB0aGVpciBvd24gKHRvIHByaW50IHN5bWJvbGljCi0gICBhZGRyZXNzZXMpLiAgKi8KLQotdm9pZAotZ2VuZXJpY19wcmludF9hZGRyZXNzIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZlszMF07Ci0KLSAgc3ByaW50Zl92bWEgKGJ1ZiwgYWRkcik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglcyIsIGJ1Zik7Ci19Ci0KLS8qIEp1c3QgY29uY2F0ZW5hdGUgdGhlIGFkZHJlc3MgYXMgaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IKLSAgIGNvbXBsZXRlbmVzcyBldmVuIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8KLSAgIHByaW50IHN5bWJvbGljIGFkZHJlc3NlcykuICAqLwotCi12b2lkCi1nZW5lcmljX3N0cmNhdF9hZGRyZXNzIChhZGRyLCBidWYsIGxlbikKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBsZW47Ci17Ci0gIGlmIChidWYgIT0gKGNoYXIgKilOVUxMICYmIGxlbiA+IDApCi0gICAgewotICAgICAgY2hhciB0bXBCdWZbMzBdOwotCi0gICAgICBzcHJpbnRmX3ZtYSAodG1wQnVmLCBhZGRyKTsKLSAgICAgIGlmICgoc3RybGVuIChidWYpICsgc3RybGVuICh0bXBCdWYpKSA8PSAodW5zaWduZWQgaW50KSBsZW4pCi0Jc3RyY2F0IChidWYsIHRtcEJ1Zik7Ci0gICAgICBlbHNlCi0Jc3RybmNhdCAoYnVmLCB0bXBCdWYsIChsZW4gLSBzdHJsZW4oYnVmKSkpOwotICAgIH0KLSAgcmV0dXJuOwotfQotCi0vKiBKdXN0IHJldHVybiB0aGUgZ2l2ZW4gYWRkcmVzcy4gICovCi0KLWludAotZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcyAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jIGIvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk0N2YwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZGlzYXNzZW1ibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKiBTZWxlY3QgZGlzYXNzZW1ibHkgcm91dGluZSBmb3Igc3BlY2lmaWVkIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0jaWZkZWYgQVJDSF9hbGwKLSNkZWZpbmUgQVJDSF9hMjlrCi0jZGVmaW5lIEFSQ0hfYWxwaGEKLSNkZWZpbmUgQVJDSF9hcmMKLSNkZWZpbmUgQVJDSF9hcm0KLSNkZWZpbmUgQVJDSF9kMTB2Ci0jZGVmaW5lIEFSQ0hfZDMwdgotI2RlZmluZSBBUkNIX2g4MzAwCi0jZGVmaW5lIEFSQ0hfaDg1MDAKLSNkZWZpbmUgQVJDSF9ocHBhCi0jZGVmaW5lIEFSQ0hfaTM4NgotI2RlZmluZSBBUkNIX2k5NjAKLSNkZWZpbmUgQVJDSF9mcjMwCi0jZGVmaW5lIEFSQ0hfbTMycgotI2RlZmluZSBBUkNIX202OGsKLSNkZWZpbmUgQVJDSF9tODhrCi0jZGVmaW5lIEFSQ0hfbWNvcmUKLSNkZWZpbmUgQVJDSF9taXBzCi0jZGVmaW5lIEFSQ0hfbW4xMDIwMAotI2RlZmluZSBBUkNIX21uMTAzMDAKLSNkZWZpbmUgQVJDSF9uczMyawotI2RlZmluZSBBUkNIX3BqCi0jZGVmaW5lIEFSQ0hfcG93ZXJwYwotI2RlZmluZSBBUkNIX3JzNjAwMAotI2RlZmluZSBBUkNIX3NoCi0jZGVmaW5lIEFSQ0hfc3BhcmMKLSNkZWZpbmUgQVJDSF90aWMzMAotI2RlZmluZSBBUkNIX3RpYzgwCi0jZGVmaW5lIEFSQ0hfdjg1MAotI2RlZmluZSBBUkNIX3ZheAotI2RlZmluZSBBUkNIX3c2NQotI2RlZmluZSBBUkNIX3o4awotI2VuZGlmCi0KLQotZGlzYXNzZW1ibGVyX2Z0eXBlCi1kaXNhc3NlbWJsZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGEgPSBiZmRfZ2V0X2FyY2ggKGFiZmQpOwotICBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGU7Ci0KLSAgc3dpdGNoIChhKQotICAgIHsKLSAgICAgIC8qIElmIHlvdSBhZGQgYSBjYXNlIHRvIHRoaXMgdGFibGUsIGFsc28gYWRkIGl0IHRvIHRoZQotCSBBUkNIX2FsbCBkZWZpbml0aW9uIHJpZ2h0IGFib3ZlIHRoaXMgZnVuY3Rpb24uICAqLwotI2lmZGVmIEFSQ0hfYTI5awotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIC8qIEFzIGZhciBhcyBJIGtub3cgd2Ugb25seSBoYW5kbGUgYmlnLWVuZGlhbiAyOWsgb2JqZWN0cy4gICovCi0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX2EyOWs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfYWxwaGEKLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2FscGhhOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2FyYwotICAgIGNhc2UgYmZkX2FyY2hfYXJjOgotICAgICAgewotCWRpc2Fzc2VtYmxlID0gYXJjX2dldF9kaXNhc3NlbWJsZXIgKGJmZF9nZXRfbWFjaCAoYWJmZCksCi0JCQkJCSAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkpOwotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0jaWZkZWYgQVJDSF9hcm0KLSAgICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19hcm07Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9hcm07Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZDEwdgotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9kMTB2OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2QzMHYKLSAgICBjYXNlIGJmZF9hcmNoX2QzMHY6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fZDMwdjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9oODMwMAotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaCkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDBoOwotICAgICAgZWxzZSBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDBzOwotICAgICAgZWxzZSAKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaDg1MDAKLSAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4NTAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2hwcGEKLSAgICBjYXNlIGJmZF9hcmNoX2hwcGE6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faHBwYTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9pMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCkKLSAgICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2kzODZfaW50ZWw7Ci0gICAgICBlbHNlCi0gICAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9pMzg2X2F0dDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9pOTYwCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2k5NjA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZnIzMAotICAgIGNhc2UgYmZkX2FyY2hfZnIzMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9mcjMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX20zMnIKLSAgICBjYXNlIGJmZF9hcmNoX20zMnI6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbTMycjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tNjhrCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX202OGs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbTg4awotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tODhrOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX25zMzJrCi0gICAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9uczMyazsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tY29yZQotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbWNvcmU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbWlwcwotICAgIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19taXBzOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9saXR0bGVfbWlwczsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tbjEwMjAwCi0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX21uMTAyMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbW4xMDMwMAotICAgIGNhc2UgYmZkX2FyY2hfbW4xMDMwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tbjEwMzAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3BqCi0gICAgY2FzZSBiZmRfYXJjaF9wajoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9wajsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9wb3dlcnBjCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX3Bvd2VycGM7Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3JzNjAwMAotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3JzNjAwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9zaAotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9zaDsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fc2hsOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3NwYXJjCi0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9zcGFyYzsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF90aWMzMAotICAgIGNhc2UgYmZkX2FyY2hfdGljMzA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdGljMzA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdGljODAKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzgwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3RpYzgwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3Y4NTAKLSAgICBjYXNlIGJmZF9hcmNoX3Y4NTA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdjg1MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF93NjUKLSAgICBjYXNlIGJmZF9hcmNoX3c2NToKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl93NjU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfejhrCi0gICAgY2FzZSBiZmRfYXJjaF96OGs6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX3o4MDAxKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl96ODAwMTsKLSAgICAgIGVsc2UgCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3o4MDAyOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3ZheAotICAgIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3ZheDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIGRpc2Fzc2VtYmxlOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWFzbS5jIGIvb3Bjb2Rlcy9mcjMwLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM4ZGJiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tYXNtLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwYXJzZV9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgY29uc3QgY2hhciAqKiwgQ0dFTl9GSUVMRFMgKikpOwotDAotLyogLS0gYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gYXNtLmMgKi8KLS8qIEhhbmRsZSByZWdpc3RlciBsaXN0cyBmb3IgTERNeCBhbmQgU1RNeCAgKi8KLQotc3RhdGljIGludAotcGFyc2VfcmVnaXN0ZXJfbnVtYmVyIChzdHJwKQotICAgICBjb25zdCBjaGFyICoqc3RycDsKLXsKLSAgaW50IHJlZ25vOwotICBpZiAoKipzdHJwIDwgJzAnIHx8ICoqc3RycCA+ICc5JykKLSAgICByZXR1cm4gLTE7IC8qIGVycm9yICovCi0gIHJlZ25vID0gKipzdHJwIC0gJzAnOwotICArKypzdHJwOwotCi0gIGlmICgqKnN0cnAgPj0gJzAnICYmICoqc3RycCA8PSAnOScpCi0gICAgewotICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgKCoqc3RycCAtICcwJyk7Ci0gICAgICArKypzdHJwOwotICAgIH0KLQotICByZXR1cm4gcmVnbm87Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIGhpZ2hfbG93LCBsb2FkX3N0b3JlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLSAgICAgaW50IGhpZ2hfbG93OyAgIC8qIDAgPT0gaGlnaCwgMSA9PSBsb3cgKi8KLSAgICAgaW50IGxvYWRfc3RvcmU7IC8qIDAgPT0gbG9hZCwgMSA9PSBzdG9yZSAqLwotewotICBpbnQgcmVnbm87Ci0gICp2YWx1ZXAgPSAwOwotICB3aGlsZSAoKipzdHJwICYmICoqc3RycCAhPSAnKScpCi0gICAgewotICAgICAgaWYgKCoqc3RycCAhPSAnUicgJiYgKipzdHJwICE9ICdyJykKLQlicmVhazsKLSAgICAgICsrKnN0cnA7Ci0KLSAgICAgIHJlZ25vID0gcGFyc2VfcmVnaXN0ZXJfbnVtYmVyIChzdHJwKTsKLSAgICAgIGlmIChyZWdubyA9PSAtMSkKLQlyZXR1cm4gIlJlZ2lzdGVyIG51bWJlciBpcyBub3QgdmFsaWQiOwotICAgICAgaWYgKHJlZ25vID4gNyAmJiAhaGlnaF9sb3cpCi0JcmV0dXJuICJSZWdpc3RlciBtdXN0IGJlIGJldHdlZW4gcjAgYW5kIHI3IjsKLSAgICAgIGlmIChyZWdubyA8IDggJiYgaGlnaF9sb3cpCi0JcmV0dXJuICJSZWdpc3RlciBtdXN0IGJlIGJldHdlZW4gcjggYW5kIHIxNSI7Ci0KLSAgICAgIGlmIChoaWdoX2xvdykKLQlyZWdubyAtPSA4OwotCi0gICAgICBpZiAobG9hZF9zdG9yZSkgLyogbWFzayBpcyByZXZlcnNlZCBmb3Igc3RvcmUgKi8KLQkqdmFsdWVwIHw9IDB4ODAgPj4gcmVnbm87Ci0gICAgICBlbHNlCi0JKnZhbHVlcCB8PSAxIDw8IHJlZ25vOwotCi0gICAgICBpZiAoKipzdHJwID09ICcsJykKLQl7Ci0JICBpZiAoKigqc3RycCArIDEpID09ICcpJykKLQkgICAgYnJlYWs7Ci0JICArKypzdHJwOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEqc3RycCB8fCAqKnN0cnAgIT0gJyknKQotICAgIHJldHVybiAiUmVnaXN0ZXIgbGlzdCBpcyBub3QgdmFsaWQiOwotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAwLypsb3cqLywgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxLypoaWdoKi8sIDAvKmxvYWQqLyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDAvKmxvdyovLCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxLypoaWdoKi8sIDEvKnN0b3JlKi8pOwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIHBhcnNpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWNvbnN0IGNoYXIgKgotZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBvcGluZGV4LCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBjaGFyICoqIHN0cnA7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgLyogVXNlZCBieSBzY2FsYXIgb3BlcmFuZHMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHBhcnNlZC4gICovCi0gIGxvbmcganVuazsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfQ1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfQ1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SamMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCAmIGZpZWxkcy0+Zl9SczEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCAmIGZpZWxkcy0+Zl9SczIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0NDLCAmZmllbGRzLT5mX2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfQ0NDLCAmZmllbGRzLT5mX2NjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSMTAsICZmaWVsZHMtPmZfZGlyMTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSOCwgJmZpZWxkcy0+Zl9kaXI4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJUjksICZmaWVsZHMtPmZfZGlyOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQMTAsICZmaWVsZHMtPmZfZGlzcDEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElTUDgsICZmaWVsZHMtPmZfZGlzcDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQOSwgJmZpZWxkcy0+Zl9kaXNwOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0kyMCwgJmZpZWxkcy0+Zl9pMjApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JMzIsICZmaWVsZHMtPmZfaTMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JOCwgJmZpZWxkcy0+Zl9pOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0xBQkVMMTIsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfTEFCRUw5LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX000LCAmZmllbGRzLT5mX200KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcHMsICYganVuayk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZXJybXNnID0gcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NULCAmZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZXJybXNnID0gcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQsICZmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZXJybXNnID0gcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QsICZmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUzEwLCAmZmllbGRzLT5mX3MxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1UxMCwgJmZpZWxkcy0+Zl91MTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1U0LCAmZmllbGRzLT5mX3U0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTRDLCAmZmllbGRzLT5mX3U0Yyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTgsICZmaWVsZHMtPmZfdTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VRElTUDYsICZmaWVsZHMtPmZfdWRpc3A2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcGFyc2luZy5cbiIpLCBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotY2dlbl9wYXJzZV9mbiAqIGNvbnN0IGZyMzBfY2dlbl9wYXJzZV9oYW5kbGVyc1tdID0gCi17Ci0gIHBhcnNlX2luc25fbm9ybWFsLAotfTsKLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfYXNtIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgZnIzMF9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCk7Ci0gIGZyMzBfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKTsKLSAgY2QtPnBhcnNlX2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fcGFyc2VfaGFuZGxlcnNbMF07Ci0gIGNkLT5wYXJzZV9vcGVyYW5kID0gZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQ7Ci19Ci0KLQwKLS8qIERlZmF1bHQgaW5zbiBwYXJzZXIuCi0KLSAgIFRoZSBzeW50YXggc3RyaW5nIGlzIHNjYW5uZWQgYW5kIG9wZXJhbmRzIGFyZSBwYXJzZWQgYW5kIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBSZWxvY3MgYXJlIHF1ZXVlZCBhcyB3ZSBnbyB2aWEgb3RoZXIgY2FsbGJhY2tzLgotCi0gICA/Pz8gTm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IGFuIGFsbC1vci1ub3RoaW5nIHBhcnNlci4gIElmIHdlIGZhaWwgdG8KLSAgIHBhcnNlIHRoZSBpbnN0cnVjdGlvbiwgd2UgcmV0dXJuIDAgYW5kIHRoZSBjYWxsZXIgd2lsbCBzdGFydCBvdmVyIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcuICBCYWNrdHJhY2tpbmcgd2lsbCBiZSBuZWNlc3NhcnkgaW4gcGFyc2luZyBzdWJleHByZXNzaW9ucywKLSAgIGJ1dCB0aGF0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLiAgTm90IGhhbmRsaW5nIGJhY2t0cmFja2luZyBoZXJlIG1heSBnZXQKLSAgIGV4cGVuc2l2ZSBpbiB0aGUgY2FzZSBvZiB0aGUgbTY4ay4gIERlYWwgd2l0aCBsYXRlci4KLQotICAgUmV0dXJucyBOVUxMIGZvciBzdWNjZXNzLCBhbiBlcnJvciBtZXNzYWdlIGZvciBmYWlsdXJlLgotKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci17Ci0gIC8qID8/PyBSdW50aW1lIGFkZGVkIGluc25zIG5vdCBoYW5kbGVkIHlldC4gICovCi0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgY2hhciAqc3RyID0gKnN0cnA7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIC8qIEZJWE1FOiB3aXAgKi8KLSAgaW50IHBhc3Rfb3Bjb2RlX3A7Ci0jZW5kaWYKLQotICAvKiBGb3Igbm93IHdlIGFzc3VtZSB0aGUgbW5lbW9uaWMgaXMgZmlyc3QgKHRoZXJlIGFyZSBubyBsZWFkaW5nIG9wZXJhbmRzKS4KLSAgICAgV2UgY2FuIHBhcnNlIGl0IHdpdGhvdXQgbmVlZGluZyB0byBzZXQgdXAgb3BlcmFuZCBwYXJzaW5nLgotICAgICBHQVMncyBpbnB1dCBzY3J1YmJlciB3aWxsIGVuc3VyZSBtbmVtb25pY3MgYXJlIGxvd2VyY2FzZSwgYnV0IHdlIG1heQotICAgICBub3QgYmUgY2FsbGVkIGZyb20gR0FTLiAgKi8KLSAgcCA9IENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbik7Ci0gIHdoaWxlICgqcCAmJiB0b2xvd2VyICgqcCkgPT0gdG9sb3dlciAoKnN0cikpCi0gICAgKytwLCArK3N0cjsKLQotICBpZiAoKiBwKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLQotI2lmbmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIGlmICgqIHN0ciAmJiAhaXNzcGFjZSAoKiBzdHIpKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLSNlbmRpZgotCi0gIENHRU5fSU5JVF9QQVJTRSAoY2QpOwotICBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0jZW5kaWYKLQotICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLSAgICAgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOwotCi0gIC8qIE1uZW1vbmljcyBjb21lIGZpcnN0IGZvciBub3csIGVuc3VyZSB2YWxpZCBzdHJpbmcuICAqLwotICBpZiAoISBDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqIHN5bikpCi0gICAgYWJvcnQgKCk7Ci0KLSAgKytzeW47Ci0KLSAgd2hpbGUgKCogc3luICE9IDApCi0gICAgewotICAgICAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQl7Ci0JICAvKiBGSVhNRTogV2hpbGUgd2UgYWxsb3cgZm9yIG5vbi1HQVMgY2FsbGVycyBhYm92ZSwgd2UgYXNzdW1lIHRoZQotCSAgICAgZmlyc3QgY2hhciBhZnRlciB0aGUgbW5lbW9uaWMgcGFydCBpcyBhIHNwYWNlLiAgKi8KLQkgIC8qIEZJWE1FOiBXZSBhbHNvIHRha2UgaW5hcHByb3ByaWF0ZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdAotCSAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCByZW1vdmUgZXh0cmFuZW91cyBibGFua3MuICAqLwotCSAgaWYgKCpzdHIgPT0gQ0dFTl9TWU5UQVhfQ0hBUiAoKiBzeW4pKQotCSAgICB7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotCSAgICAgIGlmICgqIHN5biA9PSAnICcpCi0JCXBhc3Rfb3Bjb2RlX3AgPSAxOwotI2VuZGlmCi0JICAgICAgKysgc3luOwotCSAgICAgICsrIHN0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU3ludGF4IGNoYXIgZGlkbid0IG1hdGNoLiAgQ2FuJ3QgYmUgdGhpcyBpbnNuLiAgKi8KLQkgICAgICAvKiBGSVhNRTogd291bGQgbGlrZSB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UKLQkJICJleHBlY3RlZCBjaGFyIGBjJyIgKi8KLQkgICAgICByZXR1cm4gXygic3ludGF4IGVycm9yIik7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kIG9mIHNvbWUgc29ydC4gICovCi0gICAgICBlcnJtc2cgPSBmcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkJICAmc3RyLCBmaWVsZHMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotCi0gICAgICAvKiBEb25lIHdpdGggdGhpcyBvcGVyYW5kLCBjb250aW51ZSB3aXRoIG5leHQgb25lLiAgKi8KLSAgICAgICsrIHN5bjsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGF4IHN0cmluZywgd2UncmUgZG9uZS4gICovCi0gIGlmICgqIHN5biA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBGb3IgdGhlIG1vbWVudCB3ZSBhc3N1bWUgYSB2YWxpZCBgc3RyJyBjYW4gb25seSBjb250YWluCi0JIGJsYW5rcyBub3cuICBJRTogV2UgbmVlZG4ndCB0cnkgYWdhaW4gd2l0aCBhIGxvbmdlciB2ZXJzaW9uIG9mCi0JIHRoZSBpbnNuIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgbG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIGFwcGVhcgotCSBiZWZvcmUgc2hvcnRlciBvbmVzIChlZzogbHNyIHIyLHIzLDEgdnMgbHNyIHIyLHIzKS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotCSsrIHN0cjsKLQotICAgICAgaWYgKCogc3RyICE9ICdcMCcpCi0JcmV0dXJuIF8oImp1bmsgYXQgZW5kIG9mIGxpbmUiKTsgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBgc3RyJyAqLwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgY291bGRuJ3QgcGFyc2UgaXQuICAqLwotICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci19Ci0MCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuCi0gICBTVFIgcG9pbnRzIHRvIHRoZSBpbnNuIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFdlIGFzc3VtZSBhbGwgbmVjZXNzYXJ5IHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBUaGUgYXNzZW1ibGVkIGluc3RydWN0aW9uLCBsZXNzIGFueSBmaXh1cHMsIGlzIHN0b3JlZCBpbiBCVUYuCi0gICBSZW1lbWJlciB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCB0aGVuIEJVRiBpcyBhbiBpbnQgYW5kIHRodXMgdGhlIHZhbHVlCi0gICBzdGlsbCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUYgaXMgYW4gYXJyYXkKLSAgIG9mIGJ5dGVzIGluIHRhcmdldCBieXRlIG9yZGVyLgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGluc24ncyBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlLAotICAgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cmVkIChhbiBlcnJvciBtZXNzYWdlIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgIHByaW50ZWQpLgotCi0gICBOb3RlIHRoYXQgd2hlbiBwcm9jZXNzaW5nIChub24tYWxpYXMpIG1hY3JvLWluc25zLAotICAgdGhpcyBmdW5jdGlvbiByZWN1cnNlcy4KLQotICAgPz8/IEl0J3MgcG9zc2libGUgdG8gbWFrZSB0aGlzIGNwdS1pbmRlcGVuZGVudC4KLSAgIE9uZSB3b3VsZCBoYXZlIHRvIGRlYWwgd2l0aCBhIGZldyBtaW5vciB0aGluZ3MuCi0gICBBdCB0aGlzIHBvaW50IGluIHRpbWUgZG9pbmcgc28gd291bGQgYmUgbW9yZSBvZiBhIGN1cmlvc2l0eSB0aGFuIHVzZWZ1bAotICAgW2ZvciBleGFtcGxlIHRoaXMgZmlsZSBpc24ndCBfdGhhdF8gYmlnXSwgYnV0IGtlZXBpbmcgdGhlIHBvc3NpYmlsaXR5IGluCi0gICBtaW5kIGhlbHBzIGtlZXAgdGhlIGRlc2lnbiBjbGVhbi4gICovCi0KLWNvbnN0IENHRU5fSU5TTiAqCi1mcjMwX2NnZW5fYXNzZW1ibGVfaW5zbiAoY2QsIHN0ciwgZmllbGRzLCBidWYsIGVycm1zZykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZjsKLSAgICAgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gIENHRU5fSU5TTl9MSVNUICppbGlzdDsKLQotICAvKiBTa2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotICAgICsrIHN0cjsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaGVkIGxpc3RzLgotICAgICBHZXQgdGhlIGZpcnN0IGluIHRoZSBsaXN0LiAgKi8KLSAgaWxpc3QgPSBDR0VOX0FTTV9MT09LVVBfSU5TTiAoY2QsIHN0cik7Ci0KLSAgLyogS2VlcCBsb29raW5nIHVudGlsIHdlIGZpbmQgYSBtYXRjaC4gICovCi0KLSAgc3RhcnQgPSBzdHI7Ci0gIGZvciAoIDsgaWxpc3QgIT0gTlVMTCA7IGlsaXN0ID0gQ0dFTl9BU01fTkVYVF9JTlNOIChpbGlzdCkpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaWxpc3QtPmluc247Ci0KLSNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgdW5zdXBwb3J0ZWQgb3Bjb2RlcyBzaG91bGRuJ3QgYmUgaW4gdGhlIGhhc2ggbGlzdHMgKi8KLSAgICAgIC8qIElzIHRoaXMgaW5zbiBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGNwdT8gICovCi0gICAgICBpZiAoISBmcjMwX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBJZiB0aGUgUkVMQVggYXR0cmlidXRlIGlzIHNldCwgdGhpcyBpcyBhbiBpbnNuIHRoYXQgc2hvdWxkbid0IGJlCi0JIGNob3NlbiBpbW1lZGlhdGVseS4gIEluc3RlYWQsIGl0IGlzIHVzZWQgZHVyaW5nIGFzc2VtYmxlci9saW5rZXIKLQkgcmVsYXhhdGlvbiBpZiBwb3NzaWJsZS4gICovCi0gICAgICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3RyID0gc3RhcnQ7Ci0KLSAgICAgIC8qIEFsbG93IHBhcnNlL2luc2VydCBoYW5kbGVycyB0byBvYnRhaW4gbGVuZ3RoIG9mIGluc24uICAqLwotICAgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICAgICAgaWYgKCEgQ0dFTl9QQVJTRV9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgJiBzdHIsIGZpZWxkcykpCi0JewotCSAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JICBpZiAoQ0dFTl9JTlNFUlRfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sIGZpZWxkcywgYnVmLCAoYmZkX3ZtYSkgMCkKLQkgICAgICAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQkgIC8qIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gYWN0dWFsbHkgb3V0cHV0IHRoZSBpbnNuIGFuZCBhbnkKLQkgICAgIHF1ZXVlZCByZWxvY3MuICAqLwotCSAgcmV0dXJuIGluc247Ci0JfQotCi0gICAgICAvKiBUcnkgdGhlIG5leHQgZW50cnkuICAqLwotICAgIH0KLQotICAvKiBGSVhNRTogV2UgY2FuIHJldHVybiBhIGJldHRlciBlcnJvciBtZXNzYWdlIHRoYW4gdGhpcy4KLSAgICAgTmVlZCB0byB0cmFjayB3aHkgaXQgZmFpbGVkIGFuZCBwaWNrIHRoZSByaWdodCBvbmUuICAqLwotICB7Ci0gICAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gICAgaWYgKHN0cmxlbiAoc3RhcnQpID4gNTApCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzLi4uJyIpLCBzdGFydCk7Ci0gICAgZWxzZSAKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMnIiksIHN0YXJ0KTsKLSAgICAgIAotICAgICplcnJtc2cgPSBlcnJidWY7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQwKLSNpZiAwIC8qIFRoaXMgY2FsbHMgYmFjayB0byBHQVMgd2hpY2ggd2UgY2FuJ3QgZG8gd2l0aG91dCBjYXJlLiAgKi8KLQotLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgotICAgVGhpcyBsZXRzIEdBUyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLgotICAgPz8/IEludGVyZXN0aW5nIGlkZWEgYnV0IG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLS8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KLSAgIEZJWE1FOiBOb3QgY3VycmVudGx5IHVzZWQuICAqLwotCi12b2lkCi1mcjMwX2NnZW5fYXNtX2hhc2hfa2V5d29yZHMgKGNkLCBvcHZhbHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fS0VZV09SRCAqb3B2YWxzOwotewotICBDR0VOX0tFWVdPUkRfU0VBUkNIIHNlYXJjaCA9IGNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdCAob3B2YWxzLCBOVUxMKTsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoga2U7Ci0KLSAgd2hpbGUgKChrZSA9IGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dCAoJiBzZWFyY2gpKSAhPSBOVUxMKQotICAgIHsKLSNpZiAwIC8qIFVubmVjZXNzYXJ5LCBzaG91bGQgYmUgZG9uZSBpbiB0aGUgc2VhcmNoIHJvdXRpbmUuICAqLwotICAgICAgaWYgKCEgZnIzMF9jZ2VuX29wdmFsX3N1cHBvcnRlZCAoa2UpKQotCWNvbnRpbnVlOwotI2VuZGlmCi0gICAgICBjZ2VuX2FzbV9yZWNvcmRfcmVnaXN0ZXIgKGNkLCBrZS0+bmFtZSwga2UtPnZhbHVlKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGVzYy5jIGIvb3Bjb2Rlcy9mcjMwLWRlc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwZjA0Yi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtZGVzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0MyArMCwwIEBACi0vKiBDUFUgZGF0YSBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIGJvb2xfYXR0cltdID0KLXsKLSAgeyAiI2YiLCAwIH0sCi0gIHsgIiN0IiwgMSB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBNQUNIX2F0dHJbXSA9Ci17Ci0gIHsgImJhc2UiLCBNQUNIX0JBU0UgfSwKLSAgeyAiZnIzMCIsIE1BQ0hfRlIzMCB9LAotICB7ICJtYXgiLCBNQUNIX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBJU0FfYXR0cltdID0KLXsKLSAgeyAiZnIzMCIsIElTQV9GUjMwIH0sCi0gIHsgIm1heCIsIElTQV9NQVggfSwKLSAgeyAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVTRVJWRUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDQUNIRS1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUFJPRklMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5FR0FUSVZFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0VNLU9OTFkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkhBU0gtUFJFRklYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTk9ULUlOLURFTEFZLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi0vKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JU0EgZnIzMF9jZ2VuX2lzYV90YWJsZVtdID0gewotICB7ICJmcjMwIiwgMTYsIDE2LCAxNiwgNDgsICB9LAotICB7IDAgfQotfTsKLQotLyogTWFjaGluZSB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggZnIzMF9jZ2VuX21hY2hfdGFibGVbXSA9IHsKLSAgeyAiZnIzMCIsICJmcjMwIiwgTUFDSF9GUjMwIH0sCi0gIHsgMCB9Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJyMCIsIDAgfSwKLSAgeyAicjEiLCAxIH0sCi0gIHsgInIyIiwgMiB9LAotICB7ICJyMyIsIDMgfSwKLSAgeyAicjQiLCA0IH0sCi0gIHsgInI1IiwgNSB9LAotICB7ICJyNiIsIDYgfSwKLSAgeyAicjciLCA3IH0sCi0gIHsgInI4IiwgOCB9LAotICB7ICJyOSIsIDkgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAiYWMiLCAxMyB9LAotICB7ICJmcCIsIDE0IH0sCi0gIHsgInNwIiwgMTUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcyA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbMF0sCi0gIDE5Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLSAgeyAiY3I4IiwgOCB9LAotICB7ICJjcjkiLCA5IH0sCi0gIHsgImNyMTAiLCAxMCB9LAotICB7ICJjcjExIiwgMTEgfSwKLSAgeyAiY3IxMiIsIDEyIH0sCi0gIHsgImNyMTMiLCAxMyB9LAotICB7ICJjcjE0IiwgMTQgfSwKLSAgeyAiY3IxNSIsIDE1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzWzBdLAotICAxNgotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAidGJyIiwgMCB9LAotICB7ICJycCIsIDEgfSwKLSAgeyAic3NwIiwgMiB9LAotICB7ICJ1c3AiLCAzIH0sCi0gIHsgIm1kaCIsIDQgfSwKLSAgeyAibWRsIiwgNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXNfZW50cmllc1swXSwKLSAgNgotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfaF9wc19lbnRyaWVzW10gPQotewotICB7ICJwcyIsIDAgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3BzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfaF9wc19lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxM19lbnRyaWVzW10gPQotewotICB7ICJyMTMiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxM19lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxNF9lbnRyaWVzW10gPQotewotICB7ICJyMTQiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTQgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNF9lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxNV9lbnRyaWVzW10gPQotewotICB7ICJyMTUiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTUgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNV9lbnRyaWVzWzBdLAotICAxCi19OwotCi0KLQotLyogVGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSFdfLGEpKQotCi1jb25zdCBDR0VOX0hXX0VOVFJZIGZyMzBfY2dlbl9od190YWJsZVtdID0KLXsKLSAgeyAiaC1tZW1vcnkiLCBIV19IX01FTU9SWSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNpbnQiLCBIV19IX1NJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC11aW50IiwgSFdfSF9VSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWRkciIsIEhXX0hfQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWlhZGRyIiwgSFdfSF9JQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBjIiwgSFdfSF9QQywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwfEEoUFJPRklMRSl8QShQQyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZ3IiLCBIV19IX0dSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jciIsIEhXX0hfQ1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZHIiLCBIV19IX0RSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBzIiwgSFdfSF9QUywgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxMyIsIEhXX0hfUjEzLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxNCIsIEhXX0hfUjE0LCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxNSIsIEhXX0hfUjE1LCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLW5iaXQiLCBIV19IX05CSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC16Yml0IiwgSFdfSF9aQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdmJpdCIsIEhXX0hfVkJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWNiaXQiLCBIV19IX0NCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1pYml0IiwgSFdfSF9JQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2JpdCIsIEhXX0hfU0JJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXRiaXQiLCBIV19IX1RCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1kMGJpdCIsIEhXX0hfRDBCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1kMWJpdCIsIEhXX0hfRDFCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jY3IiLCBIV19IX0NDUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNjciIsIEhXX0hfU0NSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaWxtIiwgSFdfSF9JTE0sIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lGTERfLGEpKQotCi1jb25zdCBDR0VOX0lGTEQgZnIzMF9jZ2VuX2lmbGRfdGFibGVbXSA9Ci17Ci0gIHsgRlIzMF9GX05JTCwgImYtbmlsIiwgMCwgMCwgMCwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AxLCAiZi1vcDEiLCAwLCAxNiwgMCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AyLCAiZi1vcDIiLCAwLCAxNiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AzLCAiZi1vcDMiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1A0LCAiZi1vcDQiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX09QNSwgImYtb3A1IiwgMCwgMTYsIDQsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0NDLCAiZi1jYyIsIDAsIDE2LCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9DQ0MsICJmLWNjYyIsIDE2LCAxNiwgMCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkosICJmLVJqIiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JJLCAiZi1SaSIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUlMxLCAiZi1SczEiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUlMyLCAiZi1SczIiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JKQywgImYtUmpjIiwgMTYsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SSUMsICJmLVJpYyIsIDE2LCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0NSSiwgImYtQ1JqIiwgMTYsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9DUkksICJmLUNSaSIsIDE2LCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1U0LCAiZi11NCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VNEMsICJmLXU0YyIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTQsICJmLWk0IiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX000LCAiZi1tNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VOCwgImYtdTgiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTgsICJmLWk4IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0kyMF80LCAiZi1pMjAtNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9JMjBfMTYsICJmLWkyMC0xNiIsIDE2LCAxNiwgMCwgMTYsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0kzMiwgImYtaTMyIiwgMTYsIDMyLCAwLCAzMiwgeyAwfEEoU0lHTl9PUFQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfVURJU1A2LCAiZi11ZGlzcDYiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElTUDgsICJmLWRpc3A4IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJU1A5LCAiZi1kaXNwOSIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVNQMTAsICJmLWRpc3AxMCIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9TMTAsICJmLXMxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VMTAsICJmLXUxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUw5LCAiZi1yZWw5IiwgMCwgMTYsIDgsIDgsIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElSOCwgImYtZGlyOCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVI5LCAiZi1kaXI5IiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJUjEwLCAiZi1kaXIxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUwxMiwgImYtcmVsMTIiLCAwLCAxNiwgNSwgMTEsIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVHTElTVF9ISV9TVCwgImYtcmVnbGlzdF9oaV9zdCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUdMSVNUX0xPV19TVCwgImYtcmVnbGlzdF9sb3dfc3QiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVHTElTVF9ISV9MRCwgImYtcmVnbGlzdF9oaV9sZCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUdMSVNUX0xPV19MRCwgImYtcmVnbGlzdF9sb3dfbGQiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fT1BFUkFORF8sYSkpCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCi0KLWNvbnN0IENHRU5fT1BFUkFORCBmcjMwX2NnZW5fb3BlcmFuZF90YWJsZVtdID0KLXsKLS8qIHBjOiBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgeyAicGMiLCBGUjMwX09QRVJBTkRfUEMsIEhXX0hfUEMsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJpOiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotICB7ICJSaSIsIEZSMzBfT1BFUkFORF9SSSwgSFdfSF9HUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJqOiBzb3VyY2UgcmVnaXN0ZXIgKi8KLSAgeyAiUmoiLCBGUjMwX09QRVJBTkRfUkosIEhXX0hfR1IsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJpYzogdGFyZ2V0IHJlZ2lzdGVyIGNvcHJvYyBpbnNuICovCi0gIHsgIlJpYyIsIEZSMzBfT1BFUkFORF9SSUMsIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSamM6IHNvdXJjZSByZWdpc3RlciBjb3Byb2MgaW5zbiAqLwotICB7ICJSamMiLCBGUjMwX09QRVJBTkRfUkpDLCBIV19IX0dSLCA4LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBDUmk6IGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0gIHsgIkNSaSIsIEZSMzBfT1BFUkFORF9DUkksIEhXX0hfQ1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBDUmo6IGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0gIHsgIkNSaiIsIEZSMzBfT1BFUkFORF9DUkosIEhXX0hfQ1IsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJzMTogZGVkaWNhdGVkIHJlZ2lzdGVyICovCi0gIHsgIlJzMSIsIEZSMzBfT1BFUkFORF9SUzEsIEhXX0hfRFIsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJzMjogZGVkaWNhdGVkIHJlZ2lzdGVyICovCi0gIHsgIlJzMiIsIEZSMzBfT1BFUkFORF9SUzIsIEhXX0hfRFIsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSMTM6IEdlbmVyYWwgUmVnaXN0ZXIgMTMgKi8KLSAgeyAiUjEzIiwgRlIzMF9PUEVSQU5EX1IxMywgSFdfSF9SMTMsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFIxNDogR2VuZXJhbCBSZWdpc3RlciAxNCAqLwotICB7ICJSMTQiLCBGUjMwX09QRVJBTkRfUjE0LCBIV19IX1IxNCwgMCwgMCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUjE1OiBHZW5lcmFsIFJlZ2lzdGVyIDE1ICovCi0gIHsgIlIxNSIsIEZSMzBfT1BFUkFORF9SMTUsIEhXX0hfUjE1LCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBwczogUHJvZ3JhbSBTdGF0dXMgcmVnaXN0ZXIgKi8KLSAgeyAicHMiLCBGUjMwX09QRVJBTkRfUFMsIEhXX0hfUFMsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHU0OiA0ICBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInU0IiwgRlIzMF9PUEVSQU5EX1U0LCBIV19IX1VJTlQsIDgsIDQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHU0YzogNCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1NGMiLCBGUjMwX09QRVJBTkRfVTRDLCBIV19IX1VJTlQsIDEyLCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1ODogOCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1OCIsIEZSMzBfT1BFUkFORF9VOCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpODogOCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJpOCIsIEZSMzBfT1BFUkFORF9JOCwgSFdfSF9VSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1ZGlzcDY6IDYgIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidWRpc3A2IiwgRlIzMF9PUEVSQU5EX1VESVNQNiwgSFdfSF9VSU5ULCA4LCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwODogOCAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLwotICB7ICJkaXNwOCIsIEZSMzBfT1BFUkFORF9ESVNQOCwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwOTogOSAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLwotICB7ICJkaXNwOSIsIEZSMzBfT1BFUkFORF9ESVNQOSwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMTA6IDEwIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KLSAgeyAiZGlzcDEwIiwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzMTA6IDEwIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KLSAgeyAiczEwIiwgRlIzMF9PUEVSQU5EX1MxMCwgSFdfSF9TSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1MTA6IDEwIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidTEwIiwgRlIzMF9PUEVSQU5EX1UxMCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpMzI6IDMyIGJpdCBpbW1lZGlhdGUgKi8KLSAgeyAiaTMyIiwgRlIzMF9PUEVSQU5EX0kzMiwgSFdfSF9VSU5ULCAwLCAzMiwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCl8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogbTQ6IDQgIGJpdCBuZWdhdGl2ZSBpbW1lZGlhdGUgKi8KLSAgeyAibTQiLCBGUjMwX09QRVJBTkRfTTQsIEhXX0hfU0lOVCwgOCwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaTIwOiAyMCBiaXQgaW1tZWRpYXRlICovCi0gIHsgImkyMCIsIEZSMzBfT1BFUkFORF9JMjAsIEhXX0hfVUlOVCwgMCwgMjAsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoVklSVFVBTCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlyODogOCAgYml0IGRpcmVjdCBhZGRyZXNzICovCi0gIHsgImRpcjgiLCBGUjMwX09QRVJBTkRfRElSOCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXI5OiA5ICBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KLSAgeyAiZGlyOSIsIEZSMzBfT1BFUkFORF9ESVI5LCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpcjEwOiAxMCBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KLSAgeyAiZGlyMTAiLCBGUjMwX09QRVJBTkRfRElSMTAsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogbGFiZWw5OiA5ICBiaXQgcGMgcmVsYXRpdmUgYWRkcmVzcyAqLwotICB7ICJsYWJlbDkiLCBGUjMwX09QRVJBTkRfTEFCRUw5LCBIV19IX0lBRERSLCA4LCA4LAotICAgIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGxhYmVsMTI6IDEyIGJpdCBwYyByZWxhdGl2ZSBhZGRyZXNzICovCi0gIHsgImxhYmVsMTIiLCBGUjMwX09QRVJBTkRfTEFCRUwxMiwgSFdfSF9JQUREUiwgNSwgMTEsCi0gICAgeyAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcmVnbGlzdF9sb3dfbGQ6IDggYml0IGxvdyByZWdpc3RlciBtYXNrIGZvciBsZG0gKi8KLSAgeyAicmVnbGlzdF9sb3dfbGQiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcmVnbGlzdF9oaV9sZDogOCBiaXQgaGlnaCByZWdpc3RlciBtYXNrIGZvciBsZG0gKi8KLSAgeyAicmVnbGlzdF9oaV9sZCIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHJlZ2xpc3RfbG93X3N0OiA4IGJpdCBsb3cgcmVnaXN0ZXIgbWFzayBmb3Igc3RtICovCi0gIHsgInJlZ2xpc3RfbG93X3N0IiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NULCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHJlZ2xpc3RfaGlfc3Q6IDggYml0IGhpZ2ggcmVnaXN0ZXIgbWFzayBmb3Igc3RtICovCi0gIHsgInJlZ2xpc3RfaGlfc3QiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBjYzogY29uZGl0aW9uIGNvZGVzICovCi0gIHsgImNjIiwgRlIzMF9PUEVSQU5EX0NDLCBIV19IX1VJTlQsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNjYzogY29wcm9jZXNzb3IgY2FsYyAqLwotICB7ICJjY2MiLCBGUjMwX09QRVJBTkRfQ0NDLCBIV19IX1VJTlQsIDAsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIG5iaXQ6IG5lZ2F0aXZlICAgYml0ICovCi0gIHsgIm5iaXQiLCBGUjMwX09QRVJBTkRfTkJJVCwgSFdfSF9OQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB2Yml0OiBvdmVyZmxvdyAgIGJpdCAqLwotICB7ICJ2Yml0IiwgRlIzMF9PUEVSQU5EX1ZCSVQsIEhXX0hfVkJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogemJpdDogemVybyAgICAgICBiaXQgKi8KLSAgeyAiemJpdCIsIEZSMzBfT1BFUkFORF9aQklULCBIV19IX1pCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNiaXQ6IGNhcnJ5ICAgICAgYml0ICovCi0gIHsgImNiaXQiLCBGUjMwX09QRVJBTkRfQ0JJVCwgSFdfSF9DQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpYml0OiBpbnRlcnJ1cHQgIGJpdCAqLwotICB7ICJpYml0IiwgRlIzMF9PUEVSQU5EX0lCSVQsIEhXX0hfSUJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2JpdDogc3RhY2sgICAgICBiaXQgKi8KLSAgeyAic2JpdCIsIEZSMzBfT1BFUkFORF9TQklULCBIV19IX1NCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHRiaXQ6IHRyYWNlIHRyYXAgYml0ICovCi0gIHsgInRiaXQiLCBGUjMwX09QRVJBTkRfVEJJVCwgSFdfSF9UQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkMGJpdDogZGl2aXNpb24gMCBiaXQgKi8KLSAgeyAiZDBiaXQiLCBGUjMwX09QRVJBTkRfRDBCSVQsIEhXX0hfRDBCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGQxYml0OiBkaXZpc2lvbiAxIGJpdCAqLwotICB7ICJkMWJpdCIsIEZSMzBfT1BFUkFORF9EMUJJVCwgSFdfSF9EMUJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY2NyOiBjb25kaXRpb24gY29kZSBiaXRzICovCi0gIHsgImNjciIsIEZSMzBfT1BFUkFORF9DQ1IsIEhXX0hfQ0NSLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzY3I6IHN5c3RlbSBjb25kaXRpb24gYml0cyAqLwotICB7ICJzY3IiLCBGUjMwX09QRVJBTkRfU0NSLCBIV19IX1NDUiwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaWxtOiBpbnRlcnJ1cHQgbGV2ZWwgbWFzayAqLwotICB7ICJpbG0iLCBGUjMwX09QRVJBTkRfSUxNLCBIV19IX0lMTSwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lCQVNFIGZyMzBfY2dlbl9pbnNuX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgMCwgMCwgMCB9LAotLyogYWRkICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREQsICJhZGQiLCAiYWRkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BRERJLCAiYWRkaSIsICJhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGQyICRtNCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREQyLCAiYWRkMiIsICJhZGQyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkYyAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQUREQywgImFkZGMiLCAiYWRkYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZG4gJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERE4sICJhZGRuIiwgImFkZG4iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRuICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREROSSwgImFkZG5pIiwgImFkZG4iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRuMiAkbTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQURETjIsICJhZGRuMiIsICJhZGRuMiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1YiAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1VCLCAic3ViIiwgInN1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1YmMgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NVQkMsICJzdWJjIiwgInN1YmMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWJuICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVUJOLCAic3VibiIsICJzdWJuIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVAsICJjbXAiLCAiY21wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVBJLCAiY21waSIsICJjbXAiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXAyICRtNCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVAyLCAiY21wMiIsICJjbXAyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkQsICJhbmQiLCAiYW5kIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09SLCAib3IiLCAib3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBlb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUiwgImVvciIsICJlb3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmQgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkRNLCAiYW5kbSIsICJhbmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRoICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5ESCwgImFuZGgiLCAiYW5kaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZGIgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkRCLCAiYW5kYiIsICJhbmRiIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3IgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUk0sICJvcm0iLCAib3IiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUkgsICJvcmgiLCAib3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3JiICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fT1JCLCAib3JiIiwgIm9yYiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVvciAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUk0sICJlb3JtIiwgImVvciIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FT1JILCAiZW9yaCIsICJlb3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW9yYiAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUkIsICJlb3JiIiwgImVvcmIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYW5kbCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JBTkRMLCAiYmFuZGwiLCAiYmFuZGwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBib3JsICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk9STCwgImJvcmwiLCAiYm9ybCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlb3JsICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVPUkwsICJiZW9ybCIsICJiZW9ybCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJhbmRoICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkFOREgsICJiYW5kaCIsICJiYW5kaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CT1JILCAiYm9yaCIsICJib3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmVvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CRU9SSCwgImJlb3JoIiwgImJlb3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnRzdGwgJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVFNUTCwgImJ0c3RsIiwgImJ0c3RsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnRzdGggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVFNUSCwgImJ0c3RoIiwgImJ0c3RoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NVUwsICJtdWwiLCAibXVsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsdSAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTVVMVSwgIm11bHUiLCAibXVsdSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG11bGggJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01VTEgsICJtdWxoIiwgIm11bGgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWx1aCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTVVMVUgsICJtdWx1aCIsICJtdWx1aCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdjBzICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjBTLCAiZGl2MHMiLCAiZGl2MHMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXYwdSAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYwVSwgImRpdjB1IiwgImRpdjB1IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MSAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYxLCAiZGl2MSIsICJkaXYxIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MiAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYyLCAiZGl2MiIsICJkaXYyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjMsICJkaXYzIiwgImRpdjMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXY0cyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjRTLCAiZGl2NHMiLCAiZGl2NHMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc2wgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTCwgImxzbCIsICJsc2wiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc2wgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTEksICJsc2xpIiwgImxzbCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzbDIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTDIsICJsc2wyIiwgImxzbDIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUiwgImxzciIsICJsc3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUkksICJsc3JpIiwgImxzciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUjIsICJsc3IyIiwgImxzcjIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUiwgImFzciIsICJhc3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUkksICJhc3JpIiwgImFzciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUjIsICJhc3IyIiwgImFzcjIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk6OCAkaTgsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERJOCwgImxkaTgiLCAibGRpOjgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk6MjAgJGkyMCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MREkyMCwgImxkaTIwIiwgImxkaToyMCIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTozMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xESTMyLCAibGRpMzIiLCAibGRpOjMyIiwgNDgsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRCwgImxkIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1aCBAJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEVUgsICJsZHVoIiwgImxkdWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViIEAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERVQiwgImxkdWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzLCAibGRyMTMiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzVUgsICJsZHIxM3VoIiwgImxkdWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzVUIsICJsZHIxM3ViIiwgImxkdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAKCRSMTQsJGRpc3AxMCksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTQsICJsZHIxNCIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTRVSCwgImxkcjE0dWgiLCAibGR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTRVQiwgImxkcjE0dWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAoJFIxNSwkdWRpc3A2KSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNSwgImxkcjE1IiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSMTUrLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE1R1IsICJsZHIxNWdyIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSMTUrLCRSczIgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNURSLCAibGRyMTVkciIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkcHMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNVBTLCAibGRyMTVwcyIsICJsZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxAJFJqICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1QsICJzdCIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCRSaiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUSCwgInN0aCIsICJzdGgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAkUmogKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVEIsICJzdGIiLCAic3RiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTMsICJzdHIxMyIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxM0gsICJzdHIxM2giLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjEzQiwgInN0cjEzYiIsICJzdGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTQsICJzdHIxNCIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjE0LCRkaXNwOSkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNEgsICJzdHIxNGgiLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRSaSxAKCRSMTQsJGRpc3A4KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE0QiwgInN0cjE0YiIsICJzdGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE1LCR1ZGlzcDYpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTUsICJzdHIxNSIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxALSRSMTUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNUdSLCAic3RyMTVnciIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSczIsQC0kUjE1ICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTVEUiwgInN0cjE1ZHIiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkcHMsQC0kUjE1ICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTVQUywgInN0cjE1cHMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01PViwgIm1vdiIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJzMSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1ZEUiwgIm1vdmRyIiwgIm1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdiAkcHMsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTU9WUFMsICJtb3ZwcyIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJpLCRSczEgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1YyRFIsICJtb3YyZHIiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92ICRSaSwkcHMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1YyUFMsICJtb3YycHMiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogam1wIEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9KTVAsICJqbXAiLCAiam1wIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBqbXA6ZCBAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fSk1QRCwgImptcGQiLCAiam1wOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbCBAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ0FMTFIsICJjYWxsciIsICJjYWxsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjYWxsOmQgQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTExSRCwgImNhbGxyZCIsICJjYWxsOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbCAkbGFiZWwxMiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTEwsICJjYWxsIiwgImNhbGwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNhbGw6ZCAkbGFiZWwxMiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTExELCAiY2FsbGQiLCAiY2FsbDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1JFVCwgInJldCIsICJyZXQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldDpkICovCi0gIHsKLSAgICBGUjMwX0lOU05fUkVUX0QsICJyZXQ6ZCIsICJyZXQ6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBpbnQgJHU4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fSU5ULCAiaW50IiwgImludCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogaW50ZSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0lOVEUsICJpbnRlIiwgImludGUiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldGkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9SRVRJLCAicmV0aSIsICJyZXRpIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JSQUQsICJicmFkIiwgImJyYTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlJBLCAiYnJhIiwgImJyYSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5vOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOT0QsICJibm9kIiwgImJubzpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibm8gJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOTywgImJubyIsICJibm8iLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZXE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVRRCwgImJlcWQiLCAiYmVxOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlcSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVRLCAiYmVxIiwgImJlcSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuZTpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkVELCAiYm5lZCIsICJibmU6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5lICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkNELCAiYmNkIiwgImJjOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJjICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CQywgImJjIiwgImJjIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOQ0QsICJibmNkIiwgImJuYzpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmMgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOQywgImJuYyIsICJibmMiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibjpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkQsICJibmQiLCAiYm46ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm4gJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOLCAiYm4iLCAiYm4iLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBicDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CUEQsICJicGQiLCAiYnA6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnAgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JQLCAiYnAiLCAiYnAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBidjpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVkQsICJidmQiLCAiYnY6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnYgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JWLCAiYnYiLCAiYnYiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5WRCwgImJudmQiLCAiYm52OmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJudiAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5WLCAiYm52IiwgImJudiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsdDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTFRELCAiYmx0ZCIsICJibHQ6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmx0ICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTFQsICJibHQiLCAiYmx0IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmdlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JHRUQsICJiZ2VkIiwgImJnZTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZ2UgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JHRSwgImJnZSIsICJiZ2UiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibGU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxFRCwgImJsZWQiLCAiYmxlOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsZSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxFLCAiYmxlIiwgImJsZSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJndDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CR1RELCAiYmd0ZCIsICJiZ3Q6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmd0ICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CR1QsICJiZ3QiLCAiYmd0IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmxzOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMU0QsICJibHNkIiwgImJsczpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibHMgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMUywgImJscyIsICJibHMiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiaGk6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkhJRCwgImJoaWQiLCAiYmhpOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJoaSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkhJLCAiYmhpIiwgImJoaSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgJFIxMyxAJGRpcjEwICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxMywgImRtb3ZyMTMiLCAiZG1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZoICRSMTMsQCRkaXI5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM0gsICJkbW92cjEzaCIsICJkbW92aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZiICRSMTMsQCRkaXI4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM0IsICJkbW92cjEzYiIsICJkbW92YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUEksICJkbW92cjEzcGkiLCAiZG1vdiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZoIEAkUjEzKyxAJGRpcjkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUElILCAiZG1vdnIxM3BpaCIsICJkbW92aCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUElCLCAiZG1vdnIxM3BpYiIsICJkbW92YiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRSMTUrLEAkZGlyMTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjE1UEksICJkbW92cjE1cGkiLCAiZG1vdiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCwkUjEzICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTMsICJkbW92MnIxMyIsICJkbW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmggQCRkaXI5LCRSMTMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM0gsICJkbW92MnIxM2giLCAiZG1vdmgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsJFIxMyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzQiwgImRtb3YycjEzYiIsICJkbW92YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCxAJFIxMysgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM1BJLCAiZG1vdjJyMTNwaSIsICJkbW92IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmggQCRkaXI5LEAkUjEzKyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzUElILCAiZG1vdjJyMTNwaWgiLCAiZG1vdmgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsQCRSMTMrICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTNQSUIsICJkbW92MnIxM3BpYiIsICJkbW92YiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCxALSRSMTUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxNVBELCAiZG1vdjJyMTVwZCIsICJkbW92IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRyZXMgQCRSaSssJHU0ICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSRVMsICJsZHJlcyIsICJsZHJlcyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0cmVzICR1NCxAJFJpKyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUkVTLCAic3RyZXMiLCAic3RyZXMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ09QT1AsICJjb3BvcCIsICJjb3BvcCIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNvcGxkICR1NGMsJGNjYywkUmpjLCRDUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DT1BMRCwgImNvcGxkIiwgImNvcGxkIiwgMzIsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY29wc3QgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NPUFNULCAiY29wc3QiLCAiY29wc3QiLCAzMiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ09QU1YsICJjb3BzdiIsICJjb3BzdiIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vcCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX05PUCwgIm5vcCIsICJub3AiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRjY3IgJHU4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5EQ0NSLCAiYW5kY2NyIiwgImFuZGNjciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yY2NyICR1OCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09SQ0NSLCAib3JjY3IiLCAib3JjY3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGlsbSAkdTggKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVElMTSwgInN0aWxtIiwgInN0aWxtIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkc3AgJHMxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERFNQLCAiYWRkc3AiLCAiYWRkc3AiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBleHRzYiAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FWFRTQiwgImV4dHNiIiwgImV4dHNiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZXh0dWIgJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRVhUVUIsICJleHR1YiIsICJleHR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGV4dHNoICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VYVFNILCAiZXh0c2giLCAiZXh0c2giLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBleHR1aCAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FWFRVSCwgImV4dHVoIiwgImV4dHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xETTAsICJsZG0wIiwgImxkbTAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZG0xICgkcmVnbGlzdF9oaV9sZCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRE0xLCAibGRtMSIsICJsZG0xIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RtMCAoJHJlZ2xpc3RfbG93X3N0KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUTTAsICJzdG0wIiwgInN0bTAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG0xICgkcmVnbGlzdF9oaV9zdCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVE0xLCAic3RtMSIsICJzdG0xIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW50ZXIgJHUxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VOVEVSLCAiZW50ZXIiLCAiZW50ZXIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZWF2ZSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xFQVZFLCAibGVhdmUiLCAibGVhdmUiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4Y2hiIEAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fWENIQiwgInhjaGIiLCAieGNoYiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QCi0KLS8qIEluaXRpYWxpemUgYW55dGhpbmcgbmVlZGVkIHRvIGJlIGRvbmUgb25jZSwgYmVmb3JlIGFueSBjcHVfb3BlbiBjYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfdGFibGVzICgpCi17Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGxvb2sgdXAgYSBtYWNoIHZpYSBpdHMgYmZkIG5hbWUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIICoKLWxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAodGFibGUsIG5hbWUpCi0gICAgIGNvbnN0IENHRU5fTUFDSCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHdoaWxlICh0YWJsZS0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCB0YWJsZS0+YmZkX25hbWUpID09IDApCi0JcmV0dXJuIHRhYmxlOwotICAgICAgKyt0YWJsZTsKLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaHdfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXQgPSAmIGZyMzBfY2dlbl9od190YWJsZVswXTsKLSAgLyogTUFYX0hXIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fSFdfRU5UUlkgKiopIHhtYWxsb2MgKE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7Ci0KLSAgY2QtPmh3X3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5od190YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0hXX0VOVFJZKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaHMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCi0gICAgaWYgKENHRU5fSFdfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fSFdfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+aHdfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOwotICBjZC0+aHdfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfSFc7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pZmllbGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGNkLT5pZmxkX3RhYmxlID0gJiBmcjMwX2NnZW5faWZsZF90YWJsZVswXTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdCA9ICYgZnIzMF9jZ2VuX29wZXJhbmRfdGFibGVbMF07Ci0gIC8qIE1BWF9PUEVSQU5EUyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KLSAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgotICAgICB0aGUgdGFibGUuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fT1BFUkFORCAqKikgeG1hbGxvYyAoTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotCi0gIGNkLT5vcGVyYW5kX3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fT1BFUkFORCk7Ci0gIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaCB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX09QRVJBTkRfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX09QRVJBTkRTOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuCi0gICA/Pz8gVGhpcyBjb3VsZCBsZWF2ZSBvdXQgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIG1hY2gvaXNhLAotICAgYnV0IHRoYXQgd291bGQgY2F1c2UgZXJyb3JzIGxpa2UgImZvbyBvbmx5IHN1cHBvcnRlZCBieSBiYXIiIHRvIGJlY29tZQotICAgInVua25vd24gaW5zbiIsIHNvIGZvciBub3cgd2UgaW5jbHVkZSBhbGwgaW5zbnMgYW5kIHJlcXVpcmUgdGhlIGFwcCB0bwotICAgZG8gdGhlIGNoZWNraW5nIGxhdGVyLgotICAgPz8/IE9uIHRoZSBvdGhlciBoYW5kLCBwYXJzaW5nIG9mIHN1Y2ggaW5zbnMgbWF5IHJlcXVpcmUgdGhlaXIgaGFyZHdhcmUgb3IKLSAgIG9wZXJhbmQgZWxlbWVudHMgdG8gYmUgaW4gdGhlIHRhYmxlIFt3aGljaCB0aGV5IG1pZ2h0bid0IGJlXS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIGZyMzBfY2dlbl9pbnNuX3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOwotCi0gIG1lbXNldCAoaW5zbnMsIDAsIE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPmluc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBNQVhfSU5TTlM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIHJlYnVpbGQgdGhlIHRhYmxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1mcjMwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpLG5faXNhcyxuX21hY2hzOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IGNkLT5pc2FzOwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0KLSAgY2QtPmludF9pbnNuX3AgPSBDR0VOX0lOVF9JTlNOX1A7Ci0KLSAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIGlzYSBzcGVjLiAgKi8KLSNkZWZpbmUgVU5TRVQgKENHRU5fU0laRV9VTktOT1dOICsgMSkKLSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IFVOU0VUOwotICBjZC0+bWluX2luc25fYml0c2l6ZSA9IDY1NTM1OyAvKiBzb21lIHJpZGljdWxvdXNseSBiaWcgbnVtYmVyICovCi0gIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JU0FTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIGlzYXMpICE9IDApCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JU0EgKmlzYSA9ICYgZnIzMF9jZ2VuX2lzYV90YWJsZVtpXTsKLQotCS8qIERlZmF1bHQgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBCYXNlIGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKLQkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KLQlpZiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplID09IFVOU0VUKQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gaXNhLT5iYXNlX2luc25fYml0c2l6ZTsKLQllbHNlIGlmIChpc2EtPmJhc2VfaW5zbl9iaXRzaXplID09IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLQkgIDsgLyogdGhpcyBpcyBvayAqLwotCWVsc2UKLQkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOwotCi0JLyogU2V0IG1pbixtYXggaW5zbiBzaXplcy4gICovCi0JaWYgKGlzYS0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5taW5faW5zbl9iaXRzaXplKQotCSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSBpc2EtPm1pbl9pbnNuX2JpdHNpemU7Ci0JaWYgKGlzYS0+bWF4X2luc25fYml0c2l6ZSA+IGNkLT5tYXhfaW5zbl9iaXRzaXplKQotCSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSBpc2EtPm1heF9pbnNuX2JpdHNpemU7Ci0KLQkrK25faXNhczsKLSAgICAgIH0KLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgbWFjaCBzcGVjLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9NQUNIUzsgKytpKQotICAgIGlmICgoKDEgPDwgaSkgJiBtYWNocykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX01BQ0ggKm1hY2ggPSAmIGZyMzBfY2dlbl9tYWNoX3RhYmxlW2ldOwotCi0JKytuX21hY2hzOwotICAgICAgfQotCi0gIC8qIERldGVybWluZSB3aGljaCBodyBlbGVtZW50cyBhcmUgdXNlZCBieSBNQUNILiAgKi8KLSAgYnVpbGRfaHdfdGFibGUgKGNkKTsKLQotICAvKiBCdWlsZCB0aGUgaWZpZWxkIHRhYmxlLiAgKi8KLSAgYnVpbGRfaWZpZWxkX3RhYmxlIChjZCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmRzIGFyZSB1c2VkIGJ5IE1BQ0gvSVNBLiAgKi8KLSAgYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0gIGJ1aWxkX2luc25fdGFibGUgKGNkKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIGNwdSB0YWJsZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvci4KLSAgIEl0J3MgbXVjaCBsaWtlIG9wZW5pbmcgYSBmaWxlLCBhbmQgbXVzdCBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkLgotICAgVGhlIGFyZ3VtZW50cyBhcmUgYSBzZXQgb2YgKHR5cGUvdmFsdWUpIHBhaXJzLCB0ZXJtaW5hdGVkIHdpdGgKLSAgIENHRU5fQ1BVX09QRU5fRU5ELgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlczoKLSAgIENHRU5fQ1BVX09QRU5fSVNBUzogICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIGlzYV9hdHRyCi0gICBDR0VOX0NQVV9PUEVOX01BQ0hTOiAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBtYWNoX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fQkZETUFDSDogc3BlY2lmeSAxIG1hY2ggdXNpbmcgYmZkIG5hbWUKLSAgIENHRU5fQ1BVX09QRU5fRU5ESUFOOiAgc3BlY2lmeSBlbmRpYW4gY2hvaWNlCi0gICBDR0VOX0NQVV9PUEVOX0VORDogICAgIHRlcm1pbmF0ZXMgYXJndW1lbnRzCi0KLSAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICBwcmVjbHVkZWQuCi0KLSAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgotICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQotICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLWZyMzBfY2dlbl9jcHVfb3BlbiAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyBhcmdfdHlwZSwgLi4uKQotewotICBDR0VOX0NQVV9UQUJMRSAqY2QgPSAoQ0dFTl9DUFVfVEFCTEUgKikgeG1hbGxvYyAoc2l6ZW9mIChDR0VOX0NQVV9UQUJMRSkpOwotICBzdGF0aWMgaW50IGluaXRfcDsKLSAgdW5zaWduZWQgaW50IGlzYXMgPSAwOyAgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgdW5zaWduZWQgaW50IG1hY2hzID0gMDsgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW4gPSBDR0VOX0VORElBTl9VTktOT1dOOwotICB2YV9saXN0IGFwOwotCi0gIGlmICghIGluaXRfcCkKLSAgICB7Ci0gICAgICBpbml0X3RhYmxlcyAoKTsKLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotCi0gIG1lbXNldCAoY2QsIDAsIHNpemVvZiAoKmNkKSk7Ci0KLSAgdmFfc3RhcnQgKGFwLCBhcmdfdHlwZSk7Ci0gIHdoaWxlIChhcmdfdHlwZSAhPSBDR0VOX0NQVV9PUEVOX0VORCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ190eXBlKQotCXsKLQljYXNlIENHRU5fQ1BVX09QRU5fSVNBUyA6Ci0JICBpc2FzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9NQUNIUyA6Ci0JICBtYWNocyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7Ci0JICBicmVhazsKLQljYXNlIENHRU5fQ1BVX09QRU5fQkZETUFDSCA6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOwotCSAgICBjb25zdCBDR0VOX01BQ0ggKm1hY2ggPQotCSAgICAgIGxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAoZnIzMF9jZ2VuX21hY2hfdGFibGUsIG5hbWUpOwotCi0JICAgIG1hY2hzIHw9IG1hY2gtPm51bSA8PCAxOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIENHRU5fQ1BVX09QRU5fRU5ESUFOIDoKLQkgIGVuZGlhbiA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9lbmRpYW4pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JICBmcHJpbnRmIChzdGRlcnIsICJmcjMwX2NnZW5fY3B1X29wZW46IHVuc3VwcG9ydGVkIGFyZ3VtZW50IGAlZCdcbiIsCi0JCSAgIGFyZ190eXBlKTsKLQkgIGFib3J0ICgpOyAvKiA/Pz8gcmV0dXJuIE5VTEw/ICovCi0JfQotICAgICAgYXJnX3R5cGUgPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTsKLSAgICB9Ci0gIHZhX2VuZCAoYXApOwotCi0gIC8qIG1hY2ggdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKG1hY2hzID09IDApCi0gICAgbWFjaHMgPSAoMSA8PCBNQVhfTUFDSFMpIC0gMTsKLSAgLyogYmFzZSBtYWNoIGlzIGFsd2F5cyBzZWxlY3RlZCAqLwotICBtYWNocyB8PSAxOwotICAvKiBpc2EgdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKGlzYXMgPT0gMCkKLSAgICBpc2FzID0gKDEgPDwgTUFYX0lTQVMpIC0gMTsKLSAgaWYgKGVuZGlhbiA9PSBDR0VOX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIC8qID8/PyBJZiB0YXJnZXQgaGFzIG9ubHkgb25lLCBjb3VsZCBoYXZlIGEgZGVmYXVsdC4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJmcjMwX2NnZW5fY3B1X29wZW46IG5vIGVuZGlhbm5lc3Mgc3BlY2lmaWVkXG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBjZC0+aXNhcyA9IGlzYXM7Ci0gIGNkLT5tYWNocyA9IG1hY2hzOwotICBjZC0+ZW5kaWFuID0gZW5kaWFuOwotICAvKiBGSVhNRTogZm9yIHRoZSBzcGFyYyBjYXNlIHdlIGNhbiBkZXRlcm1pbmUgaW5zbi1lbmRpYW5uZXNzIHN0YXRpY2FsbHkuCi0gICAgIFRoZSB3b3JyeSBoZXJlIGlzIHdoZXJlIGJvdGggZGF0YSBhbmQgaW5zbiBlbmRpYW4gY2FuIGJlIGluZGVwZW5kZW50bHkKLSAgICAgY2hvc2VuLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIGFub3RoZXIgYXJndW1lbnQuCi0gICAgIEFjdHVhbGx5LCB3aWxsIHdhbnQgdG8gYWxsb3cgZm9yIG1vcmUgYXJndW1lbnRzIGluIHRoZSBmdXR1cmUgYW55d2F5LiAgKi8KLSAgY2QtPmluc25fZW5kaWFuID0gZW5kaWFuOwotCi0gIC8qIFRhYmxlIChyZSlidWlsZGVyLiAgKi8KLSAgY2QtPnJlYnVpbGRfdGFibGVzID0gZnIzMF9jZ2VuX3JlYnVpbGRfdGFibGVzOwotICBmcjMwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKTsKLQotICByZXR1cm4gKENHRU5fQ1BVX0RFU0MpIGNkOwotfQotCi0vKiBDb3ZlciBmbiB0byBmcjMwX2NnZW5fY3B1X29wZW4gdG8gaGFuZGxlIHRoZSBzaW1wbGUgY2FzZSBvZiAxIGlzYSwgMSBtYWNoLgotICAgTUFDSF9OQU1FIGlzIHRoZSBiZmQgbmFtZSBvZiB0aGUgbWFjaC4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLWZyMzBfY2dlbl9jcHVfb3Blbl8xIChtYWNoX25hbWUsIGVuZGlhbikKLSAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotICAgICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbjsKLXsKLSAgcmV0dXJuIGZyMzBfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9CRkRNQUNILCBtYWNoX25hbWUsCi0JCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIGVuZGlhbiwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORCk7Ci19Ci0KLS8qIENsb3NlIGEgY3B1IHRhYmxlLgotICAgPz8/IFRoaXMgY2FuIGxpdmUgaW4gYSBtYWNoaW5lIGluZGVwZW5kZW50IGZpbGUsIGJ1dCB0aGVyZSdzIGN1cnJlbnRseQotICAgbm8gcGxhY2UgdG8gcHV0IHRoaXMgZmlsZSAodGhlcmUncyBubyBsaWJjZ2VuKS4gIGxpYm9wY29kZXMgaXMgdGhlIHdyb25nCi0gICBwbGFjZSBhcyBzb21lIHNpbXVsYXRvciBwb3J0cyB1c2UgdGhpcyBidXQgdGhleSBkb24ndCB1c2UgbGlib3Bjb2Rlcy4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9jcHVfY2xvc2UgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpZiAoY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKTsKLSAgaWYgKGNkLT5od190YWJsZS5lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0hXX0VOVFJZICopIGNkLT5od190YWJsZS5lbnRyaWVzKTsKLSAgZnJlZSAoY2QpOwotfQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGVzYy5oIGIvb3Bjb2Rlcy9mcjMwLWRlc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlMjljZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtZGVzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIENQVSBkYXRhIGhlYWRlciBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBGUjMwX0NQVV9ICi0jZGVmaW5lIEZSMzBfQ1BVX0gKLQotI2RlZmluZSBDR0VOX0FSQ0ggZnIzMAotCi0vKiBHaXZlbiBzeW1ib2wgUywgcmV0dXJuIGZyMzBfY2dlbl88Uz4uICAqLwotI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzIChmcjMwLF9jZ2VuXyxzKQotCi0vKiBTZWxlY3RlZCBjcHUgZmFtaWxpZXMuICAqLwotI2RlZmluZSBIQVZFX0NQVV9GUjMwQkYKLQotI2RlZmluZSBDR0VOX0lOU05fTFNCMF9QIDAKLQotLyogTWluaW11bSBzaXplIG9mIGFueSBpbnNuIChpbiBieXRlcykuICAqLwotI2RlZmluZSBDR0VOX01JTl9JTlNOX1NJWkUgMgotCi0vKiBNYXhpbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fU0laRSA2Ci0KLSNkZWZpbmUgQ0dFTl9JTlRfSU5TTl9QIDAKLQotLyogRklYTUU6IE5lZWQgdG8gY29tcHV0ZSBDR0VOX01BWF9TWU5UQVhfQllURVMuICAqLwotCi0vKiBDR0VOX01ORU1PTklDX09QRVJBTkRTIGlzIGRlZmluZWQgaWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMuCi0gICBlLmcuIEluICJiLGEgZm9vIiB0aGUgIixhIiBpcyBhbiBvcGVyYW5kLiAgSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMKLSAgIHdlIGNhbid0IGhhc2ggb24gZXZlcnl0aGluZyB1cCB0byB0aGUgc3BhY2UuICAqLwotI2RlZmluZSBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGFueSBpbnNuIG9yIG1hY3JvLWluc24gaGFzLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9PUEVSQU5EUyAxNgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBmaWVsZHMgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIDcKLQotLyogRW51bXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wMSBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDEgewotICBPUDFfMCwgT1AxXzEsIE9QMV8yLCBPUDFfMwotICwgT1AxXzQsIE9QMV81LCBPUDFfNiwgT1AxXzcKLSAsIE9QMV84LCBPUDFfOSwgT1AxX0EsIE9QMV9CCi0gLCBPUDFfQywgT1AxX0QsIE9QMV9FLCBPUDFfRgotfSBJTlNOX09QMTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDIgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AyIHsKLSAgT1AyXzAsIE9QMl8xLCBPUDJfMiwgT1AyXzMKLSAsIE9QMl80LCBPUDJfNSwgT1AyXzYsIE9QMl83Ci0gLCBPUDJfOCwgT1AyXzksIE9QMl9BLCBPUDJfQgotICwgT1AyX0MsIE9QMl9ELCBPUDJfRSwgT1AyX0YKLX0gSU5TTl9PUDI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3AzIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMyB7Ci0gIE9QM18wLCBPUDNfMSwgT1AzXzIsIE9QM18zCi0gLCBPUDNfNCwgT1AzXzUsIE9QM182LCBPUDNfNwotICwgT1AzXzgsIE9QM185LCBPUDNfQSwgT1AzX0IKLSAsIE9QM19DLCBPUDNfRCwgT1AzX0UsIE9QM19GCi19IElOU05fT1AzOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wNCBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDQgewotICBPUDRfMAotfSBJTlNOX09QNDsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDUgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3A1IHsKLSAgT1A1XzAsIE9QNV8xCi19IElOU05fT1A1OwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGNjIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX2NjIHsKLSAgQ0NfUkEsIENDX05PLCBDQ19FUSwgQ0NfTkUKLSAsIENDX0MsIENDX05DLCBDQ19OLCBDQ19QCi0gLCBDQ19WLCBDQ19OViwgQ0NfTFQsIENDX0dFCi0gLCBDQ19MRSwgQ0NfR1QsIENDX0xTLCBDQ19ISQotfSBJTlNOX0NDOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGdyX25hbWVzIHsKLSAgSF9HUl9SMCA9IDAsIEhfR1JfUjEgPSAxLCBIX0dSX1IyID0gMiwgSF9HUl9SMyA9IDMKLSAsIEhfR1JfUjQgPSA0LCBIX0dSX1I1ID0gNSwgSF9HUl9SNiA9IDYsIEhfR1JfUjcgPSA3Ci0gLCBIX0dSX1I4ID0gOCwgSF9HUl9SOSA9IDksIEhfR1JfUjEwID0gMTAsIEhfR1JfUjExID0gMTEKLSAsIEhfR1JfUjEyID0gMTIsIEhfR1JfUjEzID0gMTMsIEhfR1JfUjE0ID0gMTQsIEhfR1JfUjE1ID0gMTUKLSAsIEhfR1JfQUMgPSAxMywgSF9HUl9GUCA9IDE0LCBIX0dSX1NQID0gMTUKLX0gR1JfTkFNRVM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gY3JfbmFtZXMgewotICBIX0NSX0NSMCwgSF9DUl9DUjEsIEhfQ1JfQ1IyLCBIX0NSX0NSMwotICwgSF9DUl9DUjQsIEhfQ1JfQ1I1LCBIX0NSX0NSNiwgSF9DUl9DUjcKLSAsIEhfQ1JfQ1I4LCBIX0NSX0NSOSwgSF9DUl9DUjEwLCBIX0NSX0NSMTEKLSAsIEhfQ1JfQ1IxMiwgSF9DUl9DUjEzLCBIX0NSX0NSMTQsIEhfQ1JfQ1IxNQotfSBDUl9OQU1FUzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBkcl9uYW1lcyB7Ci0gIEhfRFJfVEJSLCBIX0RSX1JQLCBIX0RSX1NTUCwgSF9EUl9VU1AKLSAsIEhfRFJfTURILCBIX0RSX01ETAotfSBEUl9OQU1FUzsKLQotLyogQXR0cmlidXRlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1hY2hpbmUgdHlwZSBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIG1hY2hfYXR0ciB7Ci0gIE1BQ0hfQkFTRSwgTUFDSF9GUjMwLCBNQUNIX01BWAotfSBNQUNIX0FUVFI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc3RydWN0aW9uIHNldCBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIGlzYV9hdHRyIHsKLSAgSVNBX0ZSMzAsIElTQV9NQVgKLX0gSVNBX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBhcmNoaXRlY3R1cmUgdmFyaWFudHMuICAqLwotI2RlZmluZSBNQVhfSVNBUyAgMQotI2RlZmluZSBNQVhfTUFDSFMgKChpbnQpIE1BQ0hfTUFYKQotCi0vKiBJZmllbGQgc3VwcG9ydC4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgY2dlbl9pZmxkIGZyMzBfY2dlbl9pZmxkX3RhYmxlW107Ci0KLS8qIElmaWVsZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faWZsZCBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pZmxkX2F0dHIgewotICBDR0VOX0lGTERfVklSVFVBTCwgQ0dFTl9JRkxEX1BDUkVMX0FERFIsIENHRU5fSUZMRF9BQlNfQUREUiwgQ0dFTl9JRkxEX1JFU0VSVkVECi0gLCBDR0VOX0lGTERfU0lHTl9PUFQsIENHRU5fSUZMRF9TSUdORUQsIENHRU5fSUZMRF9FTkRfQk9PTFMsIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgPSAzMQotICwgQ0dFTl9JRkxEX01BQ0gsIENHRU5fSUZMRF9FTkRfTkJPT0xTCi19IENHRU5fSUZMRF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pZmxkX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lGTERfTkJPT0xfQVRUUlMgKENHRU5fSUZMRF9FTkRfTkJPT0xTIC0gQ0dFTl9JRkxEX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaWZpZWxkIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBpZmllbGRfdHlwZSB7Ci0gIEZSMzBfRl9OSUwsIEZSMzBfRl9PUDEsIEZSMzBfRl9PUDIsIEZSMzBfRl9PUDMKLSAsIEZSMzBfRl9PUDQsIEZSMzBfRl9PUDUsIEZSMzBfRl9DQywgRlIzMF9GX0NDQwotICwgRlIzMF9GX1JKLCBGUjMwX0ZfUkksIEZSMzBfRl9SUzEsIEZSMzBfRl9SUzIKLSAsIEZSMzBfRl9SSkMsIEZSMzBfRl9SSUMsIEZSMzBfRl9DUkosIEZSMzBfRl9DUkkKLSAsIEZSMzBfRl9VNCwgRlIzMF9GX1U0QywgRlIzMF9GX0k0LCBGUjMwX0ZfTTQKLSAsIEZSMzBfRl9VOCwgRlIzMF9GX0k4LCBGUjMwX0ZfSTIwXzQsIEZSMzBfRl9JMjBfMTYKLSAsIEZSMzBfRl9JMjAsIEZSMzBfRl9JMzIsIEZSMzBfRl9VRElTUDYsIEZSMzBfRl9ESVNQOAotICwgRlIzMF9GX0RJU1A5LCBGUjMwX0ZfRElTUDEwLCBGUjMwX0ZfUzEwLCBGUjMwX0ZfVTEwCi0gLCBGUjMwX0ZfUkVMOSwgRlIzMF9GX0RJUjgsIEZSMzBfRl9ESVI5LCBGUjMwX0ZfRElSMTAKLSAsIEZSMzBfRl9SRUwxMiwgRlIzMF9GX1JFR0xJU1RfSElfU1QsIEZSMzBfRl9SRUdMSVNUX0xPV19TVCwgRlIzMF9GX1JFR0xJU1RfSElfTEQKLSAsIEZSMzBfRl9SRUdMSVNUX0xPV19MRCwgRlIzMF9GX01BWAotfSBJRklFTERfVFlQRTsKLQotI2RlZmluZSBNQVhfSUZMRCAoKGludCkgRlIzMF9GX01BWCkKLQotLyogSGFyZHdhcmUgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2h3IGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X2F0dHIgewotICBDR0VOX0hXX1ZJUlRVQUwsIENHRU5fSFdfQ0FDSEVfQUREUiwgQ0dFTl9IV19QQywgQ0dFTl9IV19QUk9GSUxFCi0gLCBDR0VOX0hXX0VORF9CT09MUywgQ0dFTl9IV19TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9IV19NQUNILCBDR0VOX0hXX0VORF9OQk9PTFMKLX0gQ0dFTl9IV19BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9od19hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9IV19OQk9PTF9BVFRSUyAoQ0dFTl9IV19FTkRfTkJPT0xTIC0gQ0dFTl9IV19TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIGhhcmR3YXJlIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X3R5cGUgewotICBIV19IX01FTU9SWSwgSFdfSF9TSU5ULCBIV19IX1VJTlQsIEhXX0hfQUREUgotICwgSFdfSF9JQUREUiwgSFdfSF9QQywgSFdfSF9HUiwgSFdfSF9DUgotICwgSFdfSF9EUiwgSFdfSF9QUywgSFdfSF9SMTMsIEhXX0hfUjE0Ci0gLCBIV19IX1IxNSwgSFdfSF9OQklULCBIV19IX1pCSVQsIEhXX0hfVkJJVAotICwgSFdfSF9DQklULCBIV19IX0lCSVQsIEhXX0hfU0JJVCwgSFdfSF9UQklUCi0gLCBIV19IX0QwQklULCBIV19IX0QxQklULCBIV19IX0NDUiwgSFdfSF9TQ1IKLSAsIEhXX0hfSUxNLCBIV19NQVgKLX0gQ0dFTl9IV19UWVBFOwotCi0jZGVmaW5lIE1BWF9IVyAoKGludCkgSFdfTUFYKQotCi0vKiBPcGVyYW5kIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9vcGVyYW5kIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfYXR0ciB7Ci0gIENHRU5fT1BFUkFORF9WSVJUVUFMLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUiwgQ0dFTl9PUEVSQU5EX0FCU19BRERSLCBDR0VOX09QRVJBTkRfU0lHTl9PUFQKLSAsIENHRU5fT1BFUkFORF9TSUdORUQsIENHRU5fT1BFUkFORF9ORUdBVElWRSwgQ0dFTl9PUEVSQU5EX1JFTEFYLCBDR0VOX09QRVJBTkRfU0VNX09OTFkKLSAsIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCwgQ0dFTl9PUEVSQU5EX0VORF9CT09MUywgQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX09QRVJBTkRfTUFDSAotICwgQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMKLX0gQ0dFTl9PUEVSQU5EX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX29wZXJhbmRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAoQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMgLSBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBvcGVyYW5kIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7Ci0gIEZSMzBfT1BFUkFORF9QQywgRlIzMF9PUEVSQU5EX1JJLCBGUjMwX09QRVJBTkRfUkosIEZSMzBfT1BFUkFORF9SSUMKLSAsIEZSMzBfT1BFUkFORF9SSkMsIEZSMzBfT1BFUkFORF9DUkksIEZSMzBfT1BFUkFORF9DUkosIEZSMzBfT1BFUkFORF9SUzEKLSAsIEZSMzBfT1BFUkFORF9SUzIsIEZSMzBfT1BFUkFORF9SMTMsIEZSMzBfT1BFUkFORF9SMTQsIEZSMzBfT1BFUkFORF9SMTUKLSAsIEZSMzBfT1BFUkFORF9QUywgRlIzMF9PUEVSQU5EX1U0LCBGUjMwX09QRVJBTkRfVTRDLCBGUjMwX09QRVJBTkRfVTgKLSAsIEZSMzBfT1BFUkFORF9JOCwgRlIzMF9PUEVSQU5EX1VESVNQNiwgRlIzMF9PUEVSQU5EX0RJU1A4LCBGUjMwX09QRVJBTkRfRElTUDkKLSAsIEZSMzBfT1BFUkFORF9ESVNQMTAsIEZSMzBfT1BFUkFORF9TMTAsIEZSMzBfT1BFUkFORF9VMTAsIEZSMzBfT1BFUkFORF9JMzIKLSAsIEZSMzBfT1BFUkFORF9NNCwgRlIzMF9PUEVSQU5EX0kyMCwgRlIzMF9PUEVSQU5EX0RJUjgsIEZSMzBfT1BFUkFORF9ESVI5Ci0gLCBGUjMwX09QRVJBTkRfRElSMTAsIEZSMzBfT1BFUkFORF9MQUJFTDksIEZSMzBfT1BFUkFORF9MQUJFTDEyLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQKLSAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NULCBGUjMwX09QRVJBTkRfQ0MKLSAsIEZSMzBfT1BFUkFORF9DQ0MsIEZSMzBfT1BFUkFORF9OQklULCBGUjMwX09QRVJBTkRfVkJJVCwgRlIzMF9PUEVSQU5EX1pCSVQKLSAsIEZSMzBfT1BFUkFORF9DQklULCBGUjMwX09QRVJBTkRfSUJJVCwgRlIzMF9PUEVSQU5EX1NCSVQsIEZSMzBfT1BFUkFORF9UQklUCi0gLCBGUjMwX09QRVJBTkRfRDBCSVQsIEZSMzBfT1BFUkFORF9EMUJJVCwgRlIzMF9PUEVSQU5EX0NDUiwgRlIzMF9PUEVSQU5EX1NDUgotICwgRlIzMF9PUEVSQU5EX0lMTSwgRlIzMF9PUEVSQU5EX01BWAotfSBDR0VOX09QRVJBTkRfVFlQRTsKLQotLyogTnVtYmVyIG9mIG9wZXJhbmRzIHR5cGVzLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRTICgoaW50KSBGUjMwX09QRVJBTkRfTUFYKQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyByZWZlcmVuY2VkIGJ5IGFueSBpbnNuLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRfSU5TVEFOQ0VTIDgKLQotLyogSW5zbiBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faW5zbiBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMsIENHRU5fSU5TTl9WSVJUVUFMLCBDR0VOX0lOU05fVU5DT05EX0NUSSwgQ0dFTl9JTlNOX0NPTkRfQ1RJCi0gLCBDR0VOX0lOU05fU0tJUF9DVEksIENHRU5fSU5TTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fUkVMQVhBQkxFLCBDR0VOX0lOU05fUkVMQVgKLSAsIENHRU5fSU5TTl9OT19ESVMsIENHRU5fSU5TTl9QQkIsIENHRU5fSU5TTl9OT1RfSU5fREVMQVlfU0xPVCwgQ0dFTl9JTlNOX0VORF9CT09MUwotICwgQ0dFTl9JTlNOX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0lOU05fTUFDSCwgQ0dFTl9JTlNOX0VORF9OQk9PTFMKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2luc25fYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAoQ0dFTl9JTlNOX0VORF9OQk9PTFMgLSBDR0VOX0lOU05fU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogY2dlbi5oIHVzZXMgdGhpbmdzIHdlIGp1c3QgZGVmaW5lZC4gICovCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogQXR0cmlidXRlcy4gICovCi1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXTsKLQotLyogSGFyZHdhcmUgZGVjbHMuICAqLwotCi1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3BzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxNDsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjE1OwotCi0KLQotCi0jZW5kaWYgLyogRlIzMF9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWRpcy5jIGIvb3Bjb2Rlcy9mcjMwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDI5MTViLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tZGlzLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRGVmYXVsdCB0ZXh0IHRvIHByaW50IGlmIGFuIGluc3RydWN0aW9uIGlzbid0IHJlY29nbml6ZWQuICAqLwotI2RlZmluZSBVTktOT1dOX0lOU05fTVNHIF8oIip1bmtub3duKiIpCi0KLXN0YXRpYyB2b2lkIHByaW50X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyZXNzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2tleXdvcmQKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBDR0VOX0tFWVdPUkQgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0ZJRUxEUyAqLAotCSAgICAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsCi0JCQkgICAgICAgZGlzYXNzZW1ibGVfaW5mbyAqLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBkZWZhdWx0X3ByaW50X2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0MCi0vKiAtLSBkaXNhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLwotCi0vKiAtLSBkaXMuYyAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCBvZmZzZXQsIGxvYWRfc3RvcmUpCi0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGludCBsb2FkX3N0b3JlOyAvKiAwID09IGxvYWQsIDEgPT0gc3RvcmUgKi8KLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IGRpc19pbmZvOwotICBpbnQgbWFzazsKLSAgaW50IGluZGV4ID0gMDsKLSAgY2hhciogY29tbWEgPSAiIjsKLQotICBpZiAobG9hZF9zdG9yZSkKLSAgICBtYXNrID0gMHg4MDsKLSAgZWxzZQotICAgIG1hc2sgPSAxOwotCi0gIGlmICh2YWx1ZSAmIG1hc2spCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWkiLCBpbmRleCArIG9mZnNldCk7Ci0gICAgICBjb21tYSA9ICIsIjsKLSAgICB9Ci0gICAgCi0gIGZvciAoaW5kZXggPSAxOyBpbmRleCA8PSA3OyArK2luZGV4KQotICAgIHsKLSAgICAgIGlmIChsb2FkX3N0b3JlKQotCW1hc2sgPj49IDE7Ci0gICAgICBlbHNlCi0JbWFzayA8PD0gMTsKLQotICAgICAgaWYgKHZhbHVlICYgbWFzaykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzciVpIiwgY29tbWEsIGluZGV4ICsgb2Zmc2V0KTsKLQkgIGNvbW1hID0gIiwiOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgOCwgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgMCwgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCA4LCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgMCwgMS8qc3RvcmUqLyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9tNCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotfQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3IgcHJpbnRpbmcgb3BlcmFuZHMuCi0gICBYSU5GTyBpcyBhIGB2b2lkIConIGFuZCBub3QgYSBgZGlzYXNzZW1ibGVfaW5mbyAqJyB0byBub3QgcHV0IGEgcmVxdWlyZW1lbnQKLSAgIG9mIGRpcy1hc20uaCBvbiBjZ2VuLmguCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLXZvaWQKLWZyMzBfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgeGluZm8sIGZpZWxkcywgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBQVFIgeGluZm87Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIHZvaWQgY29uc3QgKmF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSB4aW5mbzsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9DUmksIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX0NSaiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcjEzLCAwLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTQsIDAsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgMCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SaSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmljLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JqLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SamMsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgZmllbGRzLT5mX1JzMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCBmaWVsZHMtPmZfUnMyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9jYywgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2NjYywgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyMTAsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyOCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXI5LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDEwLCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDgsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOSwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pMjAsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9WSVJUVUFMKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2kzMiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1NJR05fT1BUKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaTgsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX3JlbDEyLCAwfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVsOSwgMHwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHByaW50X200IChjZCwgaW5mbywgZmllbGRzLT5mX200LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgMCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHByaW50X2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHByaW50X2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBwcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBwcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3MxMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91MTAsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3U0LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTRjLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91OCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VkaXNwNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotY2dlbl9wcmludF9mbiAqIGNvbnN0IGZyMzBfY2dlbl9wcmludF9oYW5kbGVyc1tdID0gCi17Ci0gIHByaW50X2luc25fbm9ybWFsLAotfTsKLQotCi12b2lkCi1mcjMwX2NnZW5faW5pdF9kaXMgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBmcjMwX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cHJpbnRfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9wcmludF9oYW5kbGVyc1swXTsKLSAgY2QtPnByaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fcHJpbnRfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBwcmludCBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X25vcm1hbCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0KLSNpZmRlZiBDR0VOX1BSSU5UX05PUk1BTAotICBDR0VOX1BSSU5UX05PUk1BTCAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgdmFsdWUpOwotfQotCi0vKiBEZWZhdWx0IGFkZHJlc3MgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyZXNzIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfQUREUkVTUwotICBDR0VOX1BSSU5UX0FERFJFU1MgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLwotICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQotICAgIDsgLyogbm90aGluZyB0byBkbyAqLwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSkKLSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfQUJTX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgKGxvbmcpIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCAobG9uZykgdmFsdWUpOwotfQotCi0vKiBLZXl3b3JkIHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfa2V5d29yZCAoY2QsIGRpc19pbmZvLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZSwgYXR0cnMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgQ0dFTl9LRVlXT1JEICprZXl3b3JkX3RhYmxlOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLQotICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGtleXdvcmRfdGFibGUsIHZhbHVlKTsKLSAgaWYgKGtlICE9IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGtlLT5uYW1lKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPz8/Iik7Ci19Ci0MCi0vKiBEZWZhdWx0IGluc24gcHJpbnRlci4KLQotICAgRElTX0lORk8gaXMgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGUgZGlzYXNzZW1ibGVyIG5lZWRuJ3Qga25vdyBhbnl0aGluZwotICAgYWJvdXQgZGlzYXNzZW1ibGVfaW5mby4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuX25vcm1hbCAoY2QsIGRpc19pbmZvLCBpbnNuLCBmaWVsZHMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fSU5JVF9QUklOVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIENHRU5fU1lOVEFYX0NIQVIgKCpzeW4pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgKi8KLSAgICAgIGZyMzBfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLCBpbmZvLAotCQkJCSBmaWVsZHMsIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIHBjLCBsZW5ndGgpOwotICAgIH0KLX0KLQwKLS8qIFV0aWxpdHkgdG8gcHJpbnQgYW4gaW5zbi4KLSAgIEJVRiBpcyB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLCB0YXJnZXQgYnl0ZSBvcmRlciwgQlVGTEVOIGJ5dGVzIGxvbmcuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGJ1ZmxlbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgYnVmbGVuOwotewotICB1bnNpZ25lZCBsb25nIGluc25fdmFsdWU7Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7Ci0gIENHRU5fRVhUUkFDVF9JTkZPIGV4X2luZm87Ci0KLSAgZXhfaW5mby5kaXNfaW5mbyA9IGluZm87Ci0gIGV4X2luZm8udmFsaWQgPSAoMSA8PCAoY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCkpIC0gMTsKLSAgZXhfaW5mby5pbnNuX2J5dGVzID0gYnVmOwotCi0gIHN3aXRjaCAoYnVmbGVuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbnNuX3ZhbHVlID0gYnVmWzBdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMTYgKGJ1ZikgOiBiZmRfZ2V0bDE2IChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMzIgKGJ1ZikgOiBiZmRfZ2V0bDMyIChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaCBsaXN0cy4KLSAgICAgUGljayB0aGUgZmlyc3Qgb25lIGFuZCBrZWVwIHRyeWluZyB1bnRpbCB3ZSBmaW5kIHRoZSByaWdodCBvbmUuICAqLwotCi0gIGluc25fbGlzdCA9IENHRU5fRElTX0xPT0tVUF9JTlNOIChjZCwgYnVmLCBpbnNuX3ZhbHVlKTsKLSAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKLSAgICAgIENHRU5fRklFTERTIGZpZWxkczsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgaW5zbiBzaG91bGRuJ3QgYmUgaW4gaGFzaCBsaXN0cyBpZiBub3Qgc3VwcG9ydGVkICovCi0gICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLwotICAgICAgaWYgKCEgZnIzMF9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUgZXh0cmFjdAotCSBoYW5kbGVyLiAgKi8KLSAgICAgIGlmICgoaW5zbl92YWx1ZSAmIENHRU5fSU5TTl9CQVNFX01BU0sgKGluc24pKQotCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQotCXsKLQkgIC8qIFByaW50aW5nIGlzIGhhbmRsZWQgaW4gdHdvIHBhc3Nlcy4gIFRoZSBmaXJzdCBwYXNzIHBhcnNlcyB0aGUKLQkgICAgIG1hY2hpbmUgaW5zbiBhbmQgZXh0cmFjdHMgdGhlIGZpZWxkcy4gIFRoZSBzZWNvbmQgcGFzcyBwcmludHMKLQkgICAgIHRoZW0uICAqLwotCi0JICBsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCSAgICAoY2QsIGluc24sICZleF9pbmZvLCBpbnNuX3ZhbHVlLCAmZmllbGRzLCBwYyk7Ci0JICAvKiBsZW5ndGggPCAwIC0+IGVycm9yICovCi0JICBpZiAobGVuZ3RoIDwgMCkKLQkgICAgcmV0dXJuIGxlbmd0aDsKLQkgIGlmIChsZW5ndGggPiAwKQotCSAgICB7Ci0JICAgICAgQ0dFTl9QUklOVF9GTiAoY2QsIGluc24pIChjZCwgaW5mbywgaW5zbiwgJmZpZWxkcywgcGMsIGxlbmd0aCk7Ci0JICAgICAgLyogbGVuZ3RoIGlzIGluIGJpdHMsIHJlc3VsdCBpcyBpbiBieXRlcyAqLwotCSAgICAgIHJldHVybiBsZW5ndGggLyA4OwotCSAgICB9Ci0JfQotCi0gICAgICBpbnNuX2xpc3QgPSBDR0VOX0RJU19ORVhUX0lOU04gKGluc25fbGlzdCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBEZWZhdWx0IHZhbHVlIGZvciBDR0VOX1BSSU5UX0lOU04uCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJlZCBmZXRjaGluZyBieXRlcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9QUklOVF9JTlNOCi0jZGVmaW5lIENHRU5fUFJJTlRfSU5TTiBkZWZhdWx0X3ByaW50X2luc24KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X3ByaW50X2luc24gKGNkLCBwYywgaW5mbykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY2hhciBidWZbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBSZWFkIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24uICAqLwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoaW4gYnl0ZXMpLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2ZyMzAgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgQ0dFTl9DUFVfREVTQyBjZCA9IDA7Ci0gIHN0YXRpYyBwcmV2X2lzYSxwcmV2X21hY2gscHJldl9lbmRpYW47Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpc2EsbWFjaDsKLSAgaW50IGVuZGlhbiA9IChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJPyBDR0VOX0VORElBTl9CSUcKLQkJOiBDR0VOX0VORElBTl9MSVRUTEUpOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiA/Pz8gZ2RiIHdpbGwgc2V0IG1hY2ggYnV0IGxlYXZlIHRoZSBhcmNoaXRlY3R1cmUgYXMgInVua25vd24iICovCi0jaWZuZGVmIENHRU5fQkZEX0FSQ0gKLSNkZWZpbmUgQ0dFTl9CRkRfQVJDSCBiZmRfYXJjaF9mcjMwCi0jZW5kaWYKLSAgYXJjaCA9IGluZm8tPmFyY2g7Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYXJjaCA9IENHRU5fQkZEX0FSQ0g7Ci0gICAgICAKLSAgLyogVGhlcmUncyBubyBzdGFuZGFyZCB3YXkgdG8gY29tcHV0ZSB0aGUgaXNhIG51bWJlciAoZS5nLiBmb3IgYXJtIHRodW1iKQotICAgICBzbyB3ZSBsZWF2ZSBpdCB0byB0aGUgdGFyZ2V0LiAgKi8KLSNpZmRlZiBDR0VOX0NPTVBVVEVfSVNBCi0gIGlzYSA9IENHRU5fQ09NUFVURV9JU0EgKGluZm8pOwotI2Vsc2UKLSAgaXNhID0gMDsKLSNlbmRpZgotCi0gIG1hY2ggPSBpbmZvLT5tYWNoOwotCi0gIC8qIElmIHdlJ3ZlIHN3aXRjaGVkIGNwdSdzLCBjbG9zZSB0aGUgY3VycmVudCB0YWJsZSBhbmQgb3BlbiBhIG5ldyBvbmUuICAqLwotICBpZiAoY2QKLSAgICAgICYmIChpc2EgIT0gcHJldl9pc2EKLQkgIHx8IG1hY2ggIT0gcHJldl9tYWNoCi0JICB8fCBlbmRpYW4gIT0gcHJldl9lbmRpYW4pKQotICAgIHsKLSAgICAgIGZyMzBfY2dlbl9jcHVfY2xvc2UgKGNkKTsKLSAgICAgIGNkID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB5ZXQsIGluaXRpYWxpemUgdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIGlmICghIGNkKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaF90eXBlID0gYmZkX2xvb2t1cF9hcmNoIChhcmNoLCBtYWNoKTsKLSAgICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKLQotICAgICAgaWYgKCFhcmNoX3R5cGUpCi0JYWJvcnQgKCk7Ci0gICAgICBtYWNoX25hbWUgPSBhcmNoX3R5cGUtPnByaW50YWJsZV9uYW1lOwotCi0gICAgICBwcmV2X2lzYSA9IGlzYTsKLSAgICAgIHByZXZfbWFjaCA9IG1hY2g7Ci0gICAgICBwcmV2X2VuZGlhbiA9IGVuZGlhbjsKLSAgICAgIGNkID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0lTQVMsIHByZXZfaXNhLAotCQkJCSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIHByZXZfZW5kaWFuLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gICAgICBpZiAoIWNkKQotCWFib3J0ICgpOwotICAgICAgZnIzMF9jZ2VuX2luaXRfZGlzIChjZCk7Ci0gICAgfQotCi0gIC8qIFdlIHRyeSB0byBoYXZlIGFzIG11Y2ggY29tbW9uIGNvZGUgYXMgcG9zc2libGUuCi0gICAgIEJ1dCBhdCB0aGlzIHBvaW50IHNvbWUgdGFyZ2V0cyBuZWVkIHRvIHRha2Ugb3Zlci4gICovCi0gIC8qID8/PyBTb21lIHRhcmdldHMgbWF5IG5lZWQgYSBob29rIGVsc2V3aGVyZS4gIFRyeSB0byBhdm9pZCB0aGlzLAotICAgICBidXQgaWYgbm90IHBvc3NpYmxlIHRyeSB0byBtb3ZlIHRoaXMgaG9vayBlbHNld2hlcmUgcmF0aGVyIHRoYW4KLSAgICAgaGF2ZSB0d28gaG9va3MuICAqLwotICBsZW5ndGggPSBDR0VOX1BSSU5UX0lOU04gKGNkLCBwYywgaW5mbyk7Ci0gIGlmIChsZW5ndGggPiAwKQotICAgIHJldHVybiBsZW5ndGg7Ci0gIGlmIChsZW5ndGggPCAwKQotICAgIHJldHVybiAtMTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0gIHJldHVybiBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgLyA4OwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWlibGQuYyBiL29wY29kZXMvZnIzMC1pYmxkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTQ0NTguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWlibGQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OTMgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gYnVpbGRpbmcvZXh0cmFjdGlvbiBzdXBwb3J0IGZvciBmcjMwLiAtKi0gQyAtKi0KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWlibGQuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotLyogVXNlZCBieSB0aGUgaWZpZWxkIHJ0eCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEZMRChmKSAoZmllbGRzLT5mKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgbG9uZywgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBDR0VOX0lOU05fQllURVNfUFRSKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwKLQkgICAgICBDR0VOX0ZJRUxEUyAqLCBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBpbnQgZXh0cmFjdF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGxvbmcgKikpOwotc3RhdGljIGludCBleHRyYWN0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLAotCSAgICAgIENHRU5fSU5TTl9JTlQsIENHRU5fRklFTERTICosIGJmZF92bWEpKTsKLQwKLS8qIE9wZXJhbmQgaW5zZXJ0aW9uLiAgKi8KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLS8qIFN1YnJvdXRpbmUgb2YgaW5zZXJ0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSB2b2lkCi1pbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKLXsKLSAgdW5zaWduZWQgbG9uZyB4LG1hc2s7Ci0gIGludCBzaGlmdDsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgeCA9ICpidWZwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIxNiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIzMiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0gIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICB4ID0gKHggJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgKmJ1ZnAgPSB4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQliZmRfcHV0YjE2ICh4LCBidWZwKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDE2ICh4LCBidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl7Ci0JICBidWZwWzBdID0geCA+PiAxNjsKLQkgIGJmZF9wdXRiMTYgKHgsIGJ1ZnAgKyAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dGwxNiAoeCwgYnVmcCk7Ci0JICBidWZwWzJdID0geCA+PiAxNjsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMzIgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGluc2VydGlvbiByb3V0aW5lLgotCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotLyogPz8/IFRoaXMgZHVwbGljYXRlcyBmdW5jdGlvbmFsaXR5IHdpdGggYmZkJ3MgaG93dG8gdGFibGUgYW5kCi0gICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwKLQkgICAgICAgdG90YWxfbGVuZ3RoLCBidWZmZXIpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLXsKLSAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChDR0VOX0lOVF9JTlNOX1AKLSAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGJhc2UtaW5zbi1iaXRzaXplLAotICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCi0gIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAotCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0Jd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0gICAgfQotCi0gIC8qIEVuc3VyZSBWQUxVRSB3aWxsIGZpdC4gICovCi0gIGlmICghIENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBtYXh2YWwgPSBtYXNrOwotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgc3ByaW50ZiAoZXJyYnVmLAotCQkgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuIDAgYW5kICVsdSkiKSwKLQkJICAgdmFsdWUsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIG1pbnZhbCA9IC0gKDFMIDw8IChsZW5ndGggLSAxKSk7Ci0gICAgICBsb25nIG1heHZhbCA9ICgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMTsKLSAgICAgIGlmICh2YWx1ZSA8IG1pbnZhbCB8fCB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICBzcHJpbnRmCi0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIChlcnJidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIiksCi0JICAgICB2YWx1ZSwgbWludmFsLCBtYXh2YWwpOwotCSAgcmV0dXJuIGVycmJ1ZjsKLQl9Ci0gICAgfQotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgewotICAgIGludCBzaGlmdDsKLQotICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgICBlbHNlCi0gICAgICBzaGlmdCA9IHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKTsKLSAgICAqYnVmZmVyID0gKCpidWZmZXIgJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0gIH0KLQotI2Vsc2UgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlciArIHdvcmRfb2Zmc2V0IC8gODsKLQotICAgIGluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKTsKLSAgfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGJ1aWxkZXIgKGluc2VydCBoYW5kbGVyKS4KLSAgIFRoZSBpbnN0cnVjdGlvbiBpcyByZWNvcmRlZCBpbiBDR0VOX0lOVF9JTlNOX1AgYnl0ZSBvcmRlcgotICAgKG1lYW5pbmcgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgQlVGRkVSIGlzIGFuIGludCAqIGFuZCB0aHVzIHRoZSB2YWx1ZSBpcwotICAgcmVjb3JkZWQgaW4gaG9zdCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGRkVSIGlzIGFuIGFycmF5IG9mIGJ5dGVzIGFuZCB0aGUKLSAgIHZhbHVlIGlzIHJlY29yZGVkIGluIHRhcmdldCBieXRlIG9yZGVyKS4KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbnNlcnRfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotCi0gIENHRU5fSU5JVF9JTlNFUlQgKGNkKTsKLSAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbik7Ci0KLSAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKLSAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbGF0ZXIuICAqLwotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgKmJ1ZmZlciA9IHZhbHVlOwotCi0jZWxzZQotCi0gIGNnZW5fcHV0X2luc25fdmFsdWUgKGNkLCBidWZmZXIsIG1pbiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplLAotCQkJCQlDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpKSwKLQkJICAgICAgIHZhbHVlKTsKLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgLyogPz8/IEl0IHdvdWxkIGJlIGJldHRlciB0byBzY2FuIHRoZSBmb3JtYXQncyBmaWVsZHMuCi0gICAgIFN0aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBpbnNlcnQgYSB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCB0aG91Z2g7Ci0gICAgIGUuZy4gc3RvcmluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgdGhhdCBnb3QgcmVzb2x2ZWQgbGF0ZXIuCi0gICAgIE5lZWRzIG1vcmUgdGhvdWdodCBmaXJzdC4gICovCi0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICogc3luICE9ICdcMCc7ICsrIHN5bikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQljb250aW51ZTsKLQotICAgICAgZXJybXNnID0gKCogY2QtPmluc2VydF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkgICAgICAgZmllbGRzLCBidWZmZXIsIHBjKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0vKiBPcGVyYW5kIGV4dHJhY3Rpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4KLSAgIEVuc3VyZSBzdWZmaWNpZW50IGJ5dGVzIGFyZSBjYWNoZWQgaW4gRVhfSU5GTy4KLSAgIE9GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIEJZVEVTIGlzIHRoZSBsZW5ndGggb2YgdGhlIG5lZWRlZCB2YWx1ZS4KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBpbnQKLWZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCBvZmZzZXQsIGJ5dGVzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBvZmZzZXQsIGJ5dGVzOwotICAgICBiZmRfdm1hIHBjOwotewotICAvKiBJdCdzIGRvdWJ0ZnVsIHRoYXQgdGhlIG1pZGRsZSBwYXJ0IGhhcyBhbHJlYWR5IGJlZW4gZmV0Y2hlZCBzbwotICAgICB3ZSBkb24ndCBvcHRpbWl6ZSB0aGF0IGNhc2UuICBraXNzLiAgKi8KLSAgaW50IG1hc2s7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBleF9pbmZvLT5kaXNfaW5mbzsKLQotICAvKiBGaXJzdCBkbyBhIHF1aWNrIGNoZWNrLiAgKi8KLSAgbWFzayA9ICgxIDw8IGJ5dGVzKSAtIDE7Ci0gIGlmICgoKGV4X2luZm8tPnZhbGlkID4+IG9mZnNldCkgJiBtYXNrKSA9PSBtYXNrKQotICAgIHJldHVybiAxOwotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGJ5dGUgd2UgbmVlZCB0byByZWFkLiAgKi8KLSAgZm9yIChtYXNrID0gMSA8PCBvZmZzZXQ7IGJ5dGVzID4gMDsgLS1ieXRlcywgKytvZmZzZXQsIG1hc2sgPDw9IDEpCi0gICAgaWYgKCEgKG1hc2sgJiBleF9pbmZvLT52YWxpZCkpCi0gICAgICBicmVhazsKLQotICBpZiAoYnl0ZXMpCi0gICAgewotICAgICAgaW50IHN0YXR1czsKLQotICAgICAgcGMgKz0gb2Zmc2V0OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShwYywgZXhfaW5mby0+aW5zbl9ieXRlcyArIG9mZnNldCwgYnl0ZXMsIGluZm8pOwotCi0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBleF9pbmZvLT52YWxpZCB8PSAoKDEgPDwgYnl0ZXMpIC0gMSkgPDwgb2Zmc2V0OwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBsb25nCi1leHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotICAgICBiZmRfdm1hIHBjOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHJldHVybiAoeCA+PiBzaGlmdCkgJiBtYXNrOwotfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotLyogRGVmYXVsdCBleHRyYWN0aW9uIHJvdXRpbmUuCi0KLSAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgb2YgdGhlIGluc24gaW4gaG9zdCBvcmRlciwKLSAgIG9yIHNvbWV0aW1lcyBsZXNzIGZvciBjYXNlcyBsaWtlIHRoZSBtMzJyIHdoZXJlIHRoZSBiYXNlIGluc24gc2l6ZSBpcyAzMgotICAgYnV0IHNvbWUgaW5zbnMgYXJlIDE2IGJpdHMuCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4gIFdlIG9ubHkgbmVlZCBgU0lHTkVEJywKLSAgIGJ1dCBmb3IgZ2VuZXJhbGl0eSB3ZSB0YWtlIGEgYml0bWFzayBvZiBhbGwgb2YgdGhlbS4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi0vKiA/Pz8gVGhlIHJldHVybiBjb2RlIGlzbid0IHByb3Blcmx5IHVzZWQuICB3aXAuICAqLwotCi0vKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwKLQkJd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aCwgcGMsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUKLSAgICAgc28gZ2l2ZSBpdCBhIHN0YW5kYXJkIHZhbHVlIG9mIHplcm8uICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgewotICAgICAgKnZhbHVlcCA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgaW5zbi1iYXNlLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRG9lcyB0aGUgdmFsdWUgcmVzaWRlIGluIElOU05fVkFMVUU/ICAqLwotCi0gIGlmICh3b3JkX29mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gICAgICBDR0VOX0lOU05fSU5UIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0gICAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKChzdGFydCArIDEpIC0gbGVuZ3RoKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gICAgICB2YWx1ZSAmPSBtYXNrOwotICAgICAgLyogc2lnbiBleHRlbmQ/ICovCi0gICAgICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgKDFMIDw8IChsZW5ndGggLSAxKSkpKQotCXZhbHVlIHw9IH5tYXNrOwotICAgIH0KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSBleF9pbmZvLT5pbnNuX2J5dGVzICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgICBpZiAod29yZF9sZW5ndGggPiAzMikKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKGZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCB3b3JkX29mZnNldCAvIDgsIHdvcmRfbGVuZ3RoIC8gOCwgcGMpID09IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAgIHZhbHVlID0gZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gICp2YWx1ZXAgPSB2YWx1ZTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGV4dHJhY3Rvci4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cywgdHJhbnNsYXRlZCB0byBob3N0IG9yZGVyLgotICAgVGhlIGV4dHJhY3RlZCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBFWF9JTkZPIGlzIHVzZWQgdG8gaGFuZGxlIHJlYWRpbmcgdmFyaWFibGUgbGVuZ3RoIGluc25zLgotICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cywgb3IgMCBpZiBubyBtYXRjaCwKLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycyBmZXRjaGluZyBkYXRhIChtZW1vcnlfZXJyb3JfZnVuYyB3aWxsIGhhdmUKLSAgIGJlZW4gY2FsbGVkKS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci0KLSAgQ0dFTl9JTklUX0VYVFJBQ1QgKGNkKTsKLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKnN5bjsgKytzeW4pCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JY29udGludWU7Ci0KLSAgICAgIGxlbmd0aCA9ICgqIGNkLT5leHRyYWN0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQlleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKTsKLSAgICAgIGlmIChsZW5ndGggPD0gMCkKLQlyZXR1cm4gbGVuZ3RoOwotICAgIH0KLQotICAvKiBXZSByZWNvZ25pemVkIGFuZCBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkIHRoaXMgaW5zbi4gICovCi0gIHJldHVybiBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci19Ci0MCi0vKiBtYWNoaW5lIGdlbmVyYXRlZCBjb2RlIGFkZGVkIGhlcmUgKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBpbnNlcnRpb24uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4gIEl0J3MgYWxzbyBuZWVkZWQgYnkgR0FTIHRvIGluc2VydCBvcGVyYW5kcyB0aGF0IGNvdWxkbid0IGJlCi0gICByZXNvbHZlZCBkdXJpbmcgcGFyc2luZy4KLSovCi0KLWNvbnN0IGNoYXIgKgotZnIzMF9jZ2VuX2luc2VydF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCBidWZmZXIsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9DUmksIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX0NSaiwgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JpLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JpYywgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SaiwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JqYywgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SczEsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SczIsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9jYywgMCwgMCwgNCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2NjYywgMCwgMTYsIDAsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlyMTA7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2RpcjgsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgICB2YWx1ZSA9ICgodW5zaWduZWQgaW50KSAodmFsdWUpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDEwOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2Rpc3A4LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwOTsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKHZhbHVlKSA+PiAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHsKLXsKLSAgRkxEIChmX2kyMF80KSA9ICgodW5zaWduZWQgaW50KSAoRkxEIChmX2kyMCkpID4+ICgxNikpOwotICBGTEQgKGZfaTIwXzE2KSA9ICgoRkxEIChmX2kyMCkpICYgKDY1NTM1KSk7Ci19Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTIwXzQsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICAgIGlmIChlcnJtc2cpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTIwXzE2LCAwLCAxNiwgMCwgMTYsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICAgIGlmIChlcnJtc2cpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMzIsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDE2LCAwLCAzMiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTgsIDAsIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKCgocGMpICsgKDIpKSkpKSA+PiAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDUsIDExLCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgKyAoMikpKSkpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9tNDsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSAmICgxNSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91NCwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U0YywgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U4LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGV4dHJhY3Rpb24uCi0gICBUaGUgcmVzdWx0IGlzIDw9IDAgZm9yIGVycm9yLCA+MCBmb3Igc3VjY2Vzcy4KLSAgID8/PyBBY3R1YWwgdmFsdWVzIGFyZW4ndCB3ZWxsIGRlZmluZWQgcmlnaHQgbm93LgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1pbnQKLWZyMzBfY2dlbl9leHRyYWN0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEFzc3VtZSBzdWNjZXNzIChmb3IgdGhvc2Ugb3BlcmFuZHMgdGhhdCBhcmUgbm9wcykuICAqLwotICBpbnQgbGVuZ3RoID0gMTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9DUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9DUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9Saik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JqYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUnMxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUnMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAwLCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfY2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX2RpcjEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2RpcjgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgxKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXI5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2Rpc3A4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgxKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTIwXzQpOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAwLCAxNiwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2kyMF8xNik7Ci17Ci0gIEZMRCAoZl9pMjApID0gKCgoKEZMRCAoZl9pMjBfNCkpIDw8ICgxNikpKSB8IChGTEQgKGZfaTIwXzE2KSkpOwotfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMTYsIDAsIDMyLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2k4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDUsIDExLCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMSkpKSArICgoKHBjKSArICgyKSkpKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOwotICAgICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSB8ICgoKC0xKSA8PCAoNCkpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3MxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91NGMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLWNnZW5faW5zZXJ0X2ZuICogY29uc3QgZnIzMF9jZ2VuX2luc2VydF9oYW5kbGVyc1tdID0gCi17Ci0gIGluc2VydF9pbnNuX25vcm1hbCwKLX07Ci0KLWNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0IGZyMzBfY2dlbl9leHRyYWN0X2hhbmRsZXJzW10gPSAKLXsKLSAgZXh0cmFjdF9pbnNuX25vcm1hbCwKLX07Ci0KLS8qIEdldHRpbmcgdmFsdWVzIGZyb20gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSByZXR1cm4uCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIHJlc3VsdCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi1pbnQKLWZyMzBfY2dlbl9nZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgaW50IHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaWM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SamM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2k4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NGM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWJmZF92bWEKLWZyMzBfY2dlbl9nZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JqOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmljOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmpjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9jYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9jY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXIxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kyMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVsMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVsOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX200OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTRjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWRpc3A2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBTdHVmZmluZyB2YWx1ZXMgaW4gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSBhY2NlcHQuCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIGFyZ3VtZW50IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9zZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgZmllbGRzLT5mX0NSaSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGZpZWxkcy0+Zl9DUmogPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGZpZWxkcy0+Zl9SaSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGZpZWxkcy0+Zl9SaWMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGZpZWxkcy0+Zl9SaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGZpZWxkcy0+Zl9SamMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBmaWVsZHMtPmZfUnMxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZmllbGRzLT5mX1JzMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZmllbGRzLT5mX2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgZmllbGRzLT5mX2NjYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgZmllbGRzLT5mX2RpcjEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXI4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXI5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgZmllbGRzLT5mX2Rpc3AxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICBmaWVsZHMtPmZfaTIwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZmllbGRzLT5mX2kzMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZmllbGRzLT5mX2k4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWwxMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBmaWVsZHMtPmZfbTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgZmllbGRzLT5mX3MxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIGZpZWxkcy0+Zl91MTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIGZpZWxkcy0+Zl91NCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGZpZWxkcy0+Zl91NGMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGZpZWxkcy0+Zl91OCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIGZpZWxkcy0+Zl91ZGlzcDYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi12b2lkCi1mcjMwX2NnZW5fc2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBmaWVsZHMtPmZfQ1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgZmllbGRzLT5mX0NSaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZmllbGRzLT5mX1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZmllbGRzLT5mX1JpYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZmllbGRzLT5mX1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZmllbGRzLT5mX1JqYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGZpZWxkcy0+Zl9SczEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBmaWVsZHMtPmZfUnMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBmaWVsZHMtPmZfY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBmaWVsZHMtPmZfY2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgZmllbGRzLT5mX2RpcjggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIGZpZWxkcy0+Zl9pMjAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBmaWVsZHMtPmZfaTMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBmaWVsZHMtPmZfaTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZmllbGRzLT5mX3U0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgZmllbGRzLT5mX3U0YyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgZmllbGRzLT5mX3U4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBpbnN0cnVjdGlvbiBidWlsZGVyIHRhYmxlcy4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBjZC0+aW5zZXJ0X2hhbmRsZXJzID0gJiBmcjMwX2NnZW5faW5zZXJ0X2hhbmRsZXJzWzBdOwotICBjZC0+ZXh0cmFjdF9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbMF07Ci0KLSAgY2QtPmluc2VydF9vcGVyYW5kID0gZnIzMF9jZ2VuX2luc2VydF9vcGVyYW5kOwotICBjZC0+ZXh0cmFjdF9vcGVyYW5kID0gZnIzMF9jZ2VuX2V4dHJhY3Rfb3BlcmFuZDsKLQotICBjZC0+Z2V0X2ludF9vcGVyYW5kID0gZnIzMF9jZ2VuX2dldF9pbnRfb3BlcmFuZDsKLSAgY2QtPnNldF9pbnRfb3BlcmFuZCA9IGZyMzBfY2dlbl9zZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5nZXRfdm1hX29wZXJhbmQgPSBmcjMwX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kOwotICBjZC0+c2V0X3ZtYV9vcGVyYW5kID0gZnIzMF9jZ2VuX3NldF92bWFfb3BlcmFuZDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1vcGMuYyBiL29wY29kZXMvZnIzMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhN2UwYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY4ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIG9wY29kZSB0YWJsZSBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLQotLyogVGhlIGhhc2ggZnVuY3Rpb25zIGFyZSByZWNvcmRlZCBoZXJlIHRvIGhlbHAga2VlcCBhc3NlbWJsZXIgY29kZSBvdXQgb2YKLSAgIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHZpY2UgdmVyc2EuICAqLwotCi1zdGF0aWMgaW50IGFzbV9oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBhc21faGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBkaXNfaGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGlzX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotLyogSW5zdHJ1Y3Rpb24gZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgRihmKSAmIGZyMzBfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKEZSMzBfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZW1wdHkgPSB7Ci0gIDAsIDAsIDB4MCwgeyAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JKKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZGkgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1U0KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZDIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX000KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2RpdjBzID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZGl2MyA9IHsKLSAgMTYsIDE2LCAweGZmZmYsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9PUDQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4ID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfSTgpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMjAgPSB7Ci0gIDE2LCAzMiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JMjApLCBGIChGX09QMiksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkzMiA9IHsKLSAgMTYsIDQ4LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0kzMiksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTQgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9ESVNQMTApLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTR1aCA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1A5KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE0dWIgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9ESVNQOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNSA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVURJU1A2KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE1ZHIgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUlMyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbW92ZHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JTMSksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jYWxsID0gewotICAxNiwgMTYsIDB4ZjgwMCwgeyBGIChGX09QMSksIEYgKEZfT1A1KSwgRiAoRl9SRUwxMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2ludCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmFkID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfQ0MpLCBGIChGX1JFTDkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kbW92cjEzID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9ESVIxMCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2Rtb3ZyMTNoID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9ESVI5KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZG1vdnIxM2IgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BvcCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX0NSSiksIEYgKEZfVTRDKSwgRiAoRl9DUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BsZCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JKQyksIEYgKEZfVTRDKSwgRiAoRl9DUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BzdCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX0NSSiksIEYgKEZfVTRDKSwgRiAoRl9SSUMpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGRzcCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUzEwKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRtMCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9MT1dfTEQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZG0xID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0hJX0xEKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RtMCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9MT1dfU1QpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdG0xID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0hJX1NUKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZW50ZXIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1UxMCksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChGUjMwX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgZnIzMF9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgeyAwIH0gfSwKLS8qIGFkZCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhNjAwIH0KLSAgfSwKLS8qIGFkZCAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTQwMCB9Ci0gIH0sCi0vKiBhZGQyICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhNTAwIH0KLSAgfSwKLS8qIGFkZGMgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTcwMCB9Ci0gIH0sCi0vKiBhZGRuICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGEyMDAgfQotICB9LAotLyogYWRkbiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTAwMCB9Ci0gIH0sCi0vKiBhZGRuMiAkbTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQyLCB7IDB4YTEwMCB9Ci0gIH0sCi0vKiBzdWIgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWMwMCB9Ci0gIH0sCi0vKiBzdWJjICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFkMDAgfQotICB9LAotLyogc3VibiAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhZTAwIH0KLSAgfSwKLS8qIGNtcCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYTAwIH0KLSAgfSwKLS8qIGNtcCAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTgwMCB9Ci0gIH0sCi0vKiBjbXAyICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhOTAwIH0KLSAgfSwKLS8qIGFuZCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4MjAwIH0KLSAgfSwKLS8qIG9yICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDkyMDAgfQotICB9LAotLyogZW9yICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDlhMDAgfQotICB9LAotLyogYW5kICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDg0MDAgfQotICB9LAotLyogYW5kaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4NTAwIH0KLSAgfSwKLS8qIGFuZGIgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODYwMCB9Ci0gIH0sCi0vKiBvciAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NDAwIH0KLSAgfSwKLS8qIG9yaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NTAwIH0KLSAgfSwKLS8qIG9yYiAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NjAwIH0KLSAgfSwKLS8qIGVvciAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5YzAwIH0KLSAgfSwKLS8qIGVvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWQwMCB9Ci0gIH0sCi0vKiBlb3JiICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDllMDAgfQotICB9LAotLyogYmFuZGwgJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDgwMDAgfQotICB9LAotLyogYm9ybCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4OTAwMCB9Ci0gIH0sCi0vKiBiZW9ybCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4OTgwMCB9Ci0gIH0sCi0vKiBiYW5kaCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4ODEwMCB9Ci0gIH0sCi0vKiBib3JoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5MTAwIH0KLSAgfSwKLS8qIGJlb3JoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5OTAwIH0KLSAgfSwKLS8qIGJ0c3RsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4ODAwIH0KLSAgfSwKLS8qIGJ0c3RoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4OTAwIH0KLSAgfSwKLS8qIG11bCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhZjAwIH0KLSAgfSwKLS8qIG11bHUgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWIwMCB9Ci0gIH0sCi0vKiBtdWxoICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGJmMDAgfQotICB9LAotLyogbXVsdWggJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmIwMCB9Ci0gIH0sCi0vKiBkaXYwcyAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NDAgfQotICB9LAotLyogZGl2MHUgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzUwIH0KLSAgfSwKLS8qIGRpdjEgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzYwIH0KLSAgfSwKLS8qIGRpdjIgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzcwIH0KLSAgfSwKLS8qIGRpdjMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmNjAgfQotICB9LAotLyogZGl2NHMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmNzAgfQotICB9LAotLyogbHNsICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGI2MDAgfQotICB9LAotLyogbHNsICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiNDAwIH0KLSAgfSwKLS8qIGxzbDIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI1MDAgfQotICB9LAotLyogbHNyICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGIyMDAgfQotICB9LAotLyogbHNyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiMDAwIH0KLSAgfSwKLS8qIGxzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGIxMDAgfQotICB9LAotLyogYXNyICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGJhMDAgfQotICB9LAotLyogYXNyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiODAwIH0KLSAgfSwKLS8qIGFzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI5MDAgfQotICB9LAotLyogbGRpOjggJGk4LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEk4KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpOCwgeyAweGMwMDAgfQotICB9LAotLyogbGRpOjIwICRpMjAsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTIwKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMjAsIHsgMHg5YjAwIH0KLSAgfSwKLS8qIGxkaTozMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEkzMiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTMyLCB7IDB4OWY4MCB9Ci0gIH0sCi0vKiBsZCBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg0MDAgfQotICB9LAotLyogbGR1aCBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg1MDAgfQotICB9LAotLyogbGR1YiBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg2MDAgfQotICB9LAotLyogbGQgQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgwIH0KLSAgfSwKLS8qIGxkdWggQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAgfQotICB9LAotLyogbGR1YiBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTQsJGRpc3AxMCksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1AxMCksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTQsIHsgMHgyMDAwIH0KLSAgfSwKLS8qIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A5KSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNHVoLCB7IDB4NDAwMCB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOCksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1YiwgeyAweDYwMDAgfQotICB9LAotLyogbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTUpLCAnLCcsIE9QIChVRElTUDYpLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1LCB7IDB4MzAwIH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg3MDAgfQotICB9LAotLyogbGQgQCRSMTUrLCRSczIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCBPUCAoUlMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1ZHIsIHsgMHg3ODAgfQotICB9LAotLyogbGQgQCRSMTUrLCRwcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChQUyksIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4NzkwIH0KLSAgfSwKLS8qIHN0ICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE0MDAgfQotICB9LAotLyogc3RoICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE1MDAgfQotICB9LAotLyogc3RiICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE2MDAgfQotICB9LAotLyogc3QgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAwIH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDExMDAgfQotICB9LAotLyogc3RiICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTIwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDEwKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTQsIHsgMHgzMDAwIH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjE0LCRkaXNwOSkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOSksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWgsIHsgMHg1MDAwIH0KLSAgfSwKLS8qIHN0YiAkUmksQCgkUjE0LCRkaXNwOCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWIsIHsgMHg3MDAwIH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTUsJHVkaXNwNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTUpLCAnLCcsIE9QIChVRElTUDYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNSwgeyAweDEzMDAgfQotICB9LAotLyogc3QgJFJpLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDE3MDAgfQotICB9LAotLyogc3QgJFJzMixALSRSMTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSUzIpLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1ZHIsIHsgMHgxNzgwIH0KLSAgfSwKLS8qIHN0ICRwcyxALSRSMTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChQUyksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDE3OTAgfQotICB9LAotLyogbW92ICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDhiMDAgfQotICB9LAotLyogbW92ICRSczEsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUlMxKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbW92ZHIsIHsgMHhiNzAwIH0KLSAgfSwKLS8qIG1vdiAkcHMsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUFMpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDE3MTAgfQotICB9LAotLyogbW92ICRSaSwkUnMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsIE9QIChSUzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbW92ZHIsIHsgMHhiMzAwIH0KLSAgfSwKLS8qIG1vdiAkUmksJHBzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsIE9QIChQUyksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDcxMCB9Ci0gIH0sCi0vKiBqbXAgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzAwIH0KLSAgfSwKLS8qIGptcDpkIEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OWYwMCB9Ci0gIH0sCi0vKiBjYWxsIEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTcxMCB9Ci0gIH0sCi0vKiBjYWxsOmQgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5ZjEwIH0KLSAgfSwKLS8qIGNhbGwgJGxhYmVsMTIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDEyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NhbGwsIHsgMHhkMDAwIH0KLSAgfSwKLS8qIGNhbGw6ZCAkbGFiZWwxMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMMTIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY2FsbCwgeyAweGQ4MDAgfQotICB9LAotLyogcmV0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5NzIwIH0KLSAgfSwKLS8qIHJldDpkICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZjIwIH0KLSAgfSwKLS8qIGludCAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHgxZjAwIH0KLSAgfSwKLS8qIGludGUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmMzAgfQotICB9LAotLyogcmV0aSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OTczMCB9Ci0gIH0sCi0vKiBicmE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMDAwIH0KLSAgfSwKLS8qIGJyYSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMDAwIH0KLSAgfSwKLS8qIGJubzpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYxMDAgfQotICB9LAotLyogYm5vICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUxMDAgfQotICB9LAotLyogYmVxOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjIwMCB9Ci0gIH0sCi0vKiBiZXEgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTIwMCB9Ci0gIH0sCi0vKiBibmU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMzAwIH0KLSAgfSwKLS8qIGJuZSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMzAwIH0KLSAgfSwKLS8qIGJjOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjQwMCB9Ci0gIH0sCi0vKiBiYyAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlNDAwIH0KLSAgfSwKLS8qIGJuYzpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY1MDAgfQotICB9LAotLyogYm5jICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU1MDAgfQotICB9LAotLyogYm46ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNjAwIH0KLSAgfSwKLS8qIGJuICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU2MDAgfQotICB9LAotLyogYnA6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNzAwIH0KLSAgfSwKLS8qIGJwICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU3MDAgfQotICB9LAotLyogYnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmODAwIH0KLSAgfSwKLS8qIGJ2ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU4MDAgfQotICB9LAotLyogYm52OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjkwMCB9Ci0gIH0sCi0vKiBibnYgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTkwMCB9Ci0gIH0sCi0vKiBibHQ6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmYTAwIH0KLSAgfSwKLS8qIGJsdCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlYTAwIH0KLSAgfSwKLS8qIGJnZTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZiMDAgfQotICB9LAotLyogYmdlICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGViMDAgfQotICB9LAotLyogYmxlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmMwMCB9Ci0gIH0sCi0vKiBibGUgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWMwMCB9Ci0gIH0sCi0vKiBiZ3Q6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmZDAwIH0KLSAgfSwKLS8qIGJndCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlZDAwIH0KLSAgfSwKLS8qIGJsczpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZlMDAgfQotICB9LAotLyogYmxzICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVlMDAgfQotICB9LAotLyogYmhpOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmYwMCB9Ci0gIH0sCi0vKiBiaGkgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWYwMCB9Ci0gIH0sCi0vKiBkbW92ICRSMTMsQCRkaXIxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFIxMyksICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDE4MDAgfQotICB9LAotLyogZG1vdmggJFIxMyxAJGRpcjkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSMTMpLCAnLCcsICdAJywgT1AgKERJUjkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHgxOTAwIH0KLSAgfSwKLS8qIGRtb3ZiICRSMTMsQCRkaXI4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUjEzKSwgJywnLCAnQCcsIE9QIChESVI4KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4MWEwMCB9Ci0gIH0sCi0vKiBkbW92IEAkUjEzKyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTMpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDFjMDAgfQotICB9LAotLyogZG1vdmggQCRSMTMrLEAkZGlyOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAnLCcsICdAJywgT1AgKERJUjkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHgxZDAwIH0KLSAgfSwKLS8qIGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxMyksICcrJywgJywnLCAnQCcsIE9QIChESVI4KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4MWUwMCB9Ci0gIH0sCi0vKiBkbW92IEAkUjE1KyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDFiMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjEwKSwgJywnLCBPUCAoUjEzKSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHg4MDAgfQotICB9LAotLyogZG1vdmggQCRkaXI5LCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjkpLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHg5MDAgfQotICB9LAotLyogZG1vdmIgQCRkaXI4LCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjgpLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHhhMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsICdAJywgT1AgKFIxMyksICcrJywgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHhjMDAgfQotICB9LAotLyogZG1vdmggQCRkaXI5LEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOSksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHhkMDAgfQotICB9LAotLyogZG1vdmIgQCRkaXI4LEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOCksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHhlMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHhiMDAgfQotICB9LAotLyogbGRyZXMgQCRSaSssJHU0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksICcrJywgJywnLCBPUCAoVTQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGJjMDAgfQotICB9LAotLyogc3RyZXMgJHU0LEAkUmkrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGJkMDAgfQotICB9LAotLyogY29wb3AgJHU0YywkY2NjLCRDUmosJENSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKENSSSksIDAgfSB9LAotICAgICYgaWZtdF9jb3BvcCwgeyAweDlmYzAgfQotICB9LAotLyogY29wbGQgJHU0YywkY2NjLCRSamMsJENSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKFJKQyksICcsJywgT1AgKENSSSksIDAgfSB9LAotICAgICYgaWZtdF9jb3BsZCwgeyAweDlmZDAgfQotICB9LAotLyogY29wc3QgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKFJJQyksIDAgfSB9LAotICAgICYgaWZtdF9jb3BzdCwgeyAweDlmZTAgfQotICB9LAotLyogY29wc3YgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKFJJQyksIDAgfSB9LAotICAgICYgaWZtdF9jb3BzdCwgeyAweDlmZjAgfQotICB9LAotLyogbm9wICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZmEwIH0KLSAgfSwKLS8qIGFuZGNjciAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHg4MzAwIH0KLSAgfSwKLS8qIG9yY2NyICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDkzMDAgfQotICB9LAotLyogc3RpbG0gJHU4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfaW50LCB7IDB4ODcwMCB9Ci0gIH0sCi0vKiBhZGRzcCAkczEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUzEwKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHNwLCB7IDB4YTMwMCB9Ci0gIH0sCi0vKiBleHRzYiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3ODAgfQotICB9LAotLyogZXh0dWIgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzkwIH0KLSAgfSwKLS8qIGV4dHNoICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTdhMCB9Ci0gIH0sCi0vKiBleHR1aCAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3YjAgfQotICB9LAotLyogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9MT1dfTEQpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZG0wLCB7IDB4OGMwMCB9Ci0gIH0sCi0vKiBsZG0xICgkcmVnbGlzdF9oaV9sZCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfSElfTEQpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZG0xLCB7IDB4OGQwMCB9Ci0gIH0sCi0vKiBzdG0wICgkcmVnbGlzdF9sb3dfc3QpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0xPV19TVCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0bTAsIHsgMHg4ZTAwIH0KLSAgfSwKLS8qIHN0bTEgKCRyZWdsaXN0X2hpX3N0KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9ISV9TVCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0bTEsIHsgMHg4ZjAwIH0KLSAgfSwKLS8qIGVudGVyICR1MTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZW50ZXIsIHsgMHhmMDAgfQotICB9LAotLyogbGVhdmUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmOTAgfQotICB9LAotLyogeGNoYiBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4YTAwIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0vKiBGb3JtYXRzIGZvciBBTElBUyBtYWNyby1pbnNucy4gICovCi0KLSNkZWZpbmUgRihmKSAmIGZyMzBfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKEZSMzBfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpOG0gPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkyMG0gPSB7Ci0gIDE2LCAzMiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JJKSwgRiAoRl9JMjApLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkzMm0gPSB7Ci0gIDE2LCA0OCwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCBGIChGX0kzMiksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotLyogRWFjaCBub24tc2ltcGxlIG1hY3JvIGVudHJ5IHBvaW50cyB0byBhbiBhcnJheSBvZiBleHBhbnNpb24gcG9zc2liaWxpdGllcy4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoRlIzMF9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGVbXSA9Ci17Ci0vKiBsZGk4ICRpOCwkUmkgKi8KLSAgewotICAgIC0xLCAibGRpOG0iLCAibGRpOCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkyMCAkaTIwLCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGkyMG0iLCAibGRpMjAiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpMzIgJGkzMiwkUmkgKi8KLSAgewotICAgIC0xLCAibGRpMzJtIiwgImxkaTMyIiwgNDgsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLX07Ci0KLS8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgZnIzMF9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlW10gPQotewotLyogbGRpOCAkaTgsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTgpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGk4bSwgeyAweGMwMDAgfQotICB9LAotLyogbGRpMjAgJGkyMCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMjApLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkyMG0sIHsgMHg5YjAwIH0KLSAgfSwKLS8qIGxkaTMyICRpMzIsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTMyKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMzJtLCB7IDB4OWY4MCB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNIX1AKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9QKGluc24pIDEKLSNlbmRpZgotCi0jaWZuZGVmIENHRU5fRElTX0hBU0hfUAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLS8qIFJldHVybiBub24temVybyBpZiBJTlNOIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIX1AgaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyBpbnQKLWFzbV9oYXNoX2luc25fcCAoaW5zbikKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSF9QIChpbnNuKTsKLX0KLQotc3RhdGljIGludAotZGlzX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIC8qIElmIGJ1aWxkaW5nIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgTk8tRElTIGF0dHJpYnV0ZSBpcyBwcmVzZW50LAotICAgICBpZ25vcmUuICAqLwotICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9OT19ESVMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gQ0dFTl9ESVNfSEFTSF9QIChpbnNuKTsKLX0KLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNICi0jZGVmaW5lIENHRU5fQVNNX0hBU0hfU0laRSAxMjcKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpCi0jZWxzZQotI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKSAvKkZJWE1FKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIEl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGhlcmUsCi0gICBidXQgd2hpbGUgdGhpcyBpcyB1bmRlciBkZXZlbG9wbWVudCB3ZSBkby4KLSAgIEJVRkZFUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmLCB2YWx1ZSkgKCoodW5zaWduZWQgY2hhciAqKSAoYnVmKSkKLSNlbmRpZgotCi0vKiBUaGUgcmVzdWx0IGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIIGluIHRoZSAub3BjIGZpbGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1hc21faGFzaF9pbnNuIChtbmVtKQotICAgICBjb25zdCBjaGFyICogbW5lbTsKLXsKLSAgcmV0dXJuIENHRU5fQVNNX0hBU0ggKG1uZW0pOwotfQotCi0vKiBCVUYgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgotICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kaXNfaGFzaF9pbnNuIChidWYsIHZhbHVlKQotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICByZXR1cm4gQ0dFTl9ESVNfSEFTSCAoYnVmLCB2YWx1ZSk7Ci19Ci0KLS8qIFNldCB0aGUgcmVjb3JkZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIHRoZSBDR0VOX0ZJRUxEUyBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2ZpZWxkc19iaXRzaXplIChmaWVsZHMsIHNpemUpCi0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBzaXplOwotewotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gc2l6ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuCi0gICBUaGlzIHBsdWdzIHRoZSBvcGNvZGUgZW50cmllcyBhbmQgbWFjcm8gaW5zdHJ1Y3Rpb25zIGludG8gdGhlIGNwdSB0YWJsZS4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbnVtX21hY3JvcyA9IChzaXplb2YgKGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlKSAvCi0JCSAgICBzaXplb2YgKGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdKSk7Ci0gIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXTsKLSAgY29uc3QgQ0dFTl9PUENPREUgKm9jID0gJiBmcjMwX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBtZW1zZXQgKGluc25zLCAwLCBudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9tYWNyb3M7ICsraSkKLSAgICB7Ci0gICAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICAgICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotICAgIH0KLSAgY2QtPm1hY3JvX2luc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOwotICBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gbnVtX21hY3JvczsKLQotICBvYyA9ICYgZnIzMF9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlWzBdOwotICBpbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotCi0gIGNkLT5zaXplb2ZfZmllbGRzID0gc2l6ZW9mIChDR0VOX0ZJRUxEUyk7Ci0gIGNkLT5zZXRfZmllbGRzX2JpdHNpemUgPSBzZXRfZmllbGRzX2JpdHNpemU7Ci0KLSAgY2QtPmFzbV9oYXNoX3AgPSBhc21faGFzaF9pbnNuX3A7Ci0gIGNkLT5hc21faGFzaCA9IGFzbV9oYXNoX2luc247Ci0gIGNkLT5hc21faGFzaF9zaXplID0gQ0dFTl9BU01fSEFTSF9TSVpFOwotCi0gIGNkLT5kaXNfaGFzaF9wID0gZGlzX2hhc2hfaW5zbl9wOwotICBjZC0+ZGlzX2hhc2ggPSBkaXNfaGFzaF9pbnNuOwotICBjZC0+ZGlzX2hhc2hfc2l6ZSA9IENHRU5fRElTX0hBU0hfU0laRTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1vcGMuaCBiL29wY29kZXMvZnIzMC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4N2VkNS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBGUjMwX09QQ19ICi0jZGVmaW5lIEZSMzBfT1BDX0gKLQotLyogLS0gb3BjLmggKi8KLQotLyogPz8/IFRoaXMgY2FuIGJlIGltcHJvdmVkIHVwb24uICAqLwotI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMTYKLSN1bmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmZmVyLCB2YWx1ZSkgKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMF0gPj4gNCkKLQotLyogLS0gKi8KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaW5zdHJ1Y3Rpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl90eXBlIHsKLSAgRlIzMF9JTlNOX0lOVkFMSUQsIEZSMzBfSU5TTl9BREQsIEZSMzBfSU5TTl9BRERJLCBGUjMwX0lOU05fQUREMgotICwgRlIzMF9JTlNOX0FEREMsIEZSMzBfSU5TTl9BREROLCBGUjMwX0lOU05fQURETkksIEZSMzBfSU5TTl9BREROMgotICwgRlIzMF9JTlNOX1NVQiwgRlIzMF9JTlNOX1NVQkMsIEZSMzBfSU5TTl9TVUJOLCBGUjMwX0lOU05fQ01QCi0gLCBGUjMwX0lOU05fQ01QSSwgRlIzMF9JTlNOX0NNUDIsIEZSMzBfSU5TTl9BTkQsIEZSMzBfSU5TTl9PUgotICwgRlIzMF9JTlNOX0VPUiwgRlIzMF9JTlNOX0FORE0sIEZSMzBfSU5TTl9BTkRILCBGUjMwX0lOU05fQU5EQgotICwgRlIzMF9JTlNOX09STSwgRlIzMF9JTlNOX09SSCwgRlIzMF9JTlNOX09SQiwgRlIzMF9JTlNOX0VPUk0KLSAsIEZSMzBfSU5TTl9FT1JILCBGUjMwX0lOU05fRU9SQiwgRlIzMF9JTlNOX0JBTkRMLCBGUjMwX0lOU05fQk9STAotICwgRlIzMF9JTlNOX0JFT1JMLCBGUjMwX0lOU05fQkFOREgsIEZSMzBfSU5TTl9CT1JILCBGUjMwX0lOU05fQkVPUkgKLSAsIEZSMzBfSU5TTl9CVFNUTCwgRlIzMF9JTlNOX0JUU1RILCBGUjMwX0lOU05fTVVMLCBGUjMwX0lOU05fTVVMVQotICwgRlIzMF9JTlNOX01VTEgsIEZSMzBfSU5TTl9NVUxVSCwgRlIzMF9JTlNOX0RJVjBTLCBGUjMwX0lOU05fRElWMFUKLSAsIEZSMzBfSU5TTl9ESVYxLCBGUjMwX0lOU05fRElWMiwgRlIzMF9JTlNOX0RJVjMsIEZSMzBfSU5TTl9ESVY0UwotICwgRlIzMF9JTlNOX0xTTCwgRlIzMF9JTlNOX0xTTEksIEZSMzBfSU5TTl9MU0wyLCBGUjMwX0lOU05fTFNSCi0gLCBGUjMwX0lOU05fTFNSSSwgRlIzMF9JTlNOX0xTUjIsIEZSMzBfSU5TTl9BU1IsIEZSMzBfSU5TTl9BU1JJCi0gLCBGUjMwX0lOU05fQVNSMiwgRlIzMF9JTlNOX0xESTgsIEZSMzBfSU5TTl9MREkyMCwgRlIzMF9JTlNOX0xESTMyCi0gLCBGUjMwX0lOU05fTEQsIEZSMzBfSU5TTl9MRFVILCBGUjMwX0lOU05fTERVQiwgRlIzMF9JTlNOX0xEUjEzCi0gLCBGUjMwX0lOU05fTERSMTNVSCwgRlIzMF9JTlNOX0xEUjEzVUIsIEZSMzBfSU5TTl9MRFIxNCwgRlIzMF9JTlNOX0xEUjE0VUgKLSAsIEZSMzBfSU5TTl9MRFIxNFVCLCBGUjMwX0lOU05fTERSMTUsIEZSMzBfSU5TTl9MRFIxNUdSLCBGUjMwX0lOU05fTERSMTVEUgotICwgRlIzMF9JTlNOX0xEUjE1UFMsIEZSMzBfSU5TTl9TVCwgRlIzMF9JTlNOX1NUSCwgRlIzMF9JTlNOX1NUQgotICwgRlIzMF9JTlNOX1NUUjEzLCBGUjMwX0lOU05fU1RSMTNILCBGUjMwX0lOU05fU1RSMTNCLCBGUjMwX0lOU05fU1RSMTQKLSAsIEZSMzBfSU5TTl9TVFIxNEgsIEZSMzBfSU5TTl9TVFIxNEIsIEZSMzBfSU5TTl9TVFIxNSwgRlIzMF9JTlNOX1NUUjE1R1IKLSAsIEZSMzBfSU5TTl9TVFIxNURSLCBGUjMwX0lOU05fU1RSMTVQUywgRlIzMF9JTlNOX01PViwgRlIzMF9JTlNOX01PVkRSCi0gLCBGUjMwX0lOU05fTU9WUFMsIEZSMzBfSU5TTl9NT1YyRFIsIEZSMzBfSU5TTl9NT1YyUFMsIEZSMzBfSU5TTl9KTVAKLSAsIEZSMzBfSU5TTl9KTVBELCBGUjMwX0lOU05fQ0FMTFIsIEZSMzBfSU5TTl9DQUxMUkQsIEZSMzBfSU5TTl9DQUxMCi0gLCBGUjMwX0lOU05fQ0FMTEQsIEZSMzBfSU5TTl9SRVQsIEZSMzBfSU5TTl9SRVRfRCwgRlIzMF9JTlNOX0lOVAotICwgRlIzMF9JTlNOX0lOVEUsIEZSMzBfSU5TTl9SRVRJLCBGUjMwX0lOU05fQlJBRCwgRlIzMF9JTlNOX0JSQQotICwgRlIzMF9JTlNOX0JOT0QsIEZSMzBfSU5TTl9CTk8sIEZSMzBfSU5TTl9CRVFELCBGUjMwX0lOU05fQkVRCi0gLCBGUjMwX0lOU05fQk5FRCwgRlIzMF9JTlNOX0JORSwgRlIzMF9JTlNOX0JDRCwgRlIzMF9JTlNOX0JDCi0gLCBGUjMwX0lOU05fQk5DRCwgRlIzMF9JTlNOX0JOQywgRlIzMF9JTlNOX0JORCwgRlIzMF9JTlNOX0JOCi0gLCBGUjMwX0lOU05fQlBELCBGUjMwX0lOU05fQlAsIEZSMzBfSU5TTl9CVkQsIEZSMzBfSU5TTl9CVgotICwgRlIzMF9JTlNOX0JOVkQsIEZSMzBfSU5TTl9CTlYsIEZSMzBfSU5TTl9CTFRELCBGUjMwX0lOU05fQkxUCi0gLCBGUjMwX0lOU05fQkdFRCwgRlIzMF9JTlNOX0JHRSwgRlIzMF9JTlNOX0JMRUQsIEZSMzBfSU5TTl9CTEUKLSAsIEZSMzBfSU5TTl9CR1RELCBGUjMwX0lOU05fQkdULCBGUjMwX0lOU05fQkxTRCwgRlIzMF9JTlNOX0JMUwotICwgRlIzMF9JTlNOX0JISUQsIEZSMzBfSU5TTl9CSEksIEZSMzBfSU5TTl9ETU9WUjEzLCBGUjMwX0lOU05fRE1PVlIxM0gKLSAsIEZSMzBfSU5TTl9ETU9WUjEzQiwgRlIzMF9JTlNOX0RNT1ZSMTNQSSwgRlIzMF9JTlNOX0RNT1ZSMTNQSUgsIEZSMzBfSU5TTl9ETU9WUjEzUElCCi0gLCBGUjMwX0lOU05fRE1PVlIxNVBJLCBGUjMwX0lOU05fRE1PVjJSMTMsIEZSMzBfSU5TTl9ETU9WMlIxM0gsIEZSMzBfSU5TTl9ETU9WMlIxM0IKLSAsIEZSMzBfSU5TTl9ETU9WMlIxM1BJLCBGUjMwX0lOU05fRE1PVjJSMTNQSUgsIEZSMzBfSU5TTl9ETU9WMlIxM1BJQiwgRlIzMF9JTlNOX0RNT1YyUjE1UEQKLSAsIEZSMzBfSU5TTl9MRFJFUywgRlIzMF9JTlNOX1NUUkVTLCBGUjMwX0lOU05fQ09QT1AsIEZSMzBfSU5TTl9DT1BMRAotICwgRlIzMF9JTlNOX0NPUFNULCBGUjMwX0lOU05fQ09QU1YsIEZSMzBfSU5TTl9OT1AsIEZSMzBfSU5TTl9BTkRDQ1IKLSAsIEZSMzBfSU5TTl9PUkNDUiwgRlIzMF9JTlNOX1NUSUxNLCBGUjMwX0lOU05fQUREU1AsIEZSMzBfSU5TTl9FWFRTQgotICwgRlIzMF9JTlNOX0VYVFVCLCBGUjMwX0lOU05fRVhUU0gsIEZSMzBfSU5TTl9FWFRVSCwgRlIzMF9JTlNOX0xETTAKLSAsIEZSMzBfSU5TTl9MRE0xLCBGUjMwX0lOU05fU1RNMCwgRlIzMF9JTlNOX1NUTTEsIEZSMzBfSU5TTl9FTlRFUgotICwgRlIzMF9JTlNOX0xFQVZFLCBGUjMwX0lOU05fWENIQiwgRlIzMF9JTlNOX01BWAotfSBDR0VOX0lOU05fVFlQRTsKLQotLyogSW5kZXggb2YgYGludmFsaWQnIGluc24gcGxhY2UgaG9sZGVyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSUQgRlIzMF9JTlNOX0lOVkFMSUQKLQotLyogVG90YWwgbnVtYmVyIG9mIGluc25zIGluIHRhYmxlLiAgKi8KLSNkZWZpbmUgTUFYX0lOU05TICgoaW50KSBGUjMwX0lOU05fTUFYKQotCi0vKiBUaGlzIHN0cnVjdCByZWNvcmRzIGRhdGEgcHJpb3IgdG8gaW5zZXJ0aW9uIG9yIGFmdGVyIGV4dHJhY3Rpb24uICAqLwotc3RydWN0IGNnZW5fZmllbGRzCi17Ci0gIGludCBsZW5ndGg7Ci0gIGxvbmcgZl9uaWw7Ci0gIGxvbmcgZl9vcDE7Ci0gIGxvbmcgZl9vcDI7Ci0gIGxvbmcgZl9vcDM7Ci0gIGxvbmcgZl9vcDQ7Ci0gIGxvbmcgZl9vcDU7Ci0gIGxvbmcgZl9jYzsKLSAgbG9uZyBmX2NjYzsKLSAgbG9uZyBmX1JqOwotICBsb25nIGZfUmk7Ci0gIGxvbmcgZl9SczE7Ci0gIGxvbmcgZl9SczI7Ci0gIGxvbmcgZl9SamM7Ci0gIGxvbmcgZl9SaWM7Ci0gIGxvbmcgZl9DUmo7Ci0gIGxvbmcgZl9DUmk7Ci0gIGxvbmcgZl91NDsKLSAgbG9uZyBmX3U0YzsKLSAgbG9uZyBmX2k0OwotICBsb25nIGZfbTQ7Ci0gIGxvbmcgZl91ODsKLSAgbG9uZyBmX2k4OwotICBsb25nIGZfaTIwXzQ7Ci0gIGxvbmcgZl9pMjBfMTY7Ci0gIGxvbmcgZl9pMjA7Ci0gIGxvbmcgZl9pMzI7Ci0gIGxvbmcgZl91ZGlzcDY7Ci0gIGxvbmcgZl9kaXNwODsKLSAgbG9uZyBmX2Rpc3A5OwotICBsb25nIGZfZGlzcDEwOwotICBsb25nIGZfczEwOwotICBsb25nIGZfdTEwOwotICBsb25nIGZfcmVsOTsKLSAgbG9uZyBmX2Rpcjg7Ci0gIGxvbmcgZl9kaXI5OwotICBsb25nIGZfZGlyMTA7Ci0gIGxvbmcgZl9yZWwxMjsKLSAgbG9uZyBmX3JlZ2xpc3RfaGlfc3Q7Ci0gIGxvbmcgZl9yZWdsaXN0X2xvd19zdDsKLSAgbG9uZyBmX3JlZ2xpc3RfaGlfbGQ7Ci0gIGxvbmcgZl9yZWdsaXN0X2xvd19sZDsKLX07Ci0KLSNkZWZpbmUgQ0dFTl9JTklUX1BBUlNFKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfSU5TRVJUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfRVhUUkFDVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX1BSSU5UKG9kKSBcCi17XAotfQotCi0KLSNlbmRpZiAvKiBGUjMwX09QQ19IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4MzAwLWRpcy5jIGIvb3Bjb2Rlcy9oODMwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTNhOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4MzAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGg4MzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2RlZmluZSBoOF9vcGNvZGVzIGg4b3BzCi0jaW5jbHVkZSAib3Bjb2RlL2g4MzAwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0KLS8qIFJ1biB0aHJvdWdoIHRoZSBvcGNvZGVzIGFuZCBzb3J0IHRoZW0gaW50byBvcmRlciB0byBtYWtlIHRoZW0gZWFzeQotICAgdG8gZGlzYXNzZW1ibGUKLSAqLwotc3RhdGljIHZvaWQKLWJmZF9oOF9kaXNhc3NlbWJsZV9pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0KLSAgc3RydWN0IGg4X29wY29kZSAqcDsKLQotICBmb3IgKHAgPSBoOF9vcGNvZGVzOyBwLT5uYW1lOyBwKyspCi0gICAgewotICAgICAgaW50IG4xID0gMDsKLSAgICAgIGludCBuMiA9IDA7Ci0KLSAgICAgIGlmICgoaW50KSBwLT5kYXRhLm5pYlswXSA8IDE2KQotCXsKLQkgIG4xID0gKGludCkgcC0+ZGF0YS5uaWJbMF07Ci0JfQotICAgICAgZWxzZQotCW4xID0gMDsKLSAgICAgIGlmICgoaW50KSBwLT5kYXRhLm5pYlsxXSA8IDE2KQotCXsKLQkgIG4yID0gKGludCkgcC0+ZGF0YS5uaWJbMV07Ci0JfQotICAgICAgZWxzZQotCW4yID0gMDsKLQotICAgICAgLyogSnVzdCBtYWtlIHN1cmUgdGhlcmUgYXJlIGFuIGV2ZW4gbnVtYmVyIG9mIG5pYmJsZXMgaW4gaXQsIGFuZAotCSB0aGF0IHRoZSBjb3VudCBpcyB0aGUgc2FtZSBzIHRoZSBsZW5ndGggKi8KLSAgICAgIGZvciAoaSA9IDA7IHAtPmRhdGEubmliW2ldICE9IEU7IGkrKykKLQkvKkVNUFRZKi8gOwotICAgICAgaWYgKGkgJiAxKQotCWFib3J0ICgpOwotICAgICAgcC0+bGVuZ3RoID0gaSAvIDI7Ci0gICAgfQotCi19Ci0KLQotdW5zaWduZWQgaW50Ci1iZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8sIG1vZGUpCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG1vZGU7Ci17Ci0gIC8qIEZpbmQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZSBmb3IgdGhpcyBvcGNvZGUgKi8KLSAgc3RhdGljIENPTlNUIGNoYXIgKnJlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJyMGgiLCAicjFoIiwgInIyaCIsICJyM2giLCAicjRoIiwgInI1aCIsICJyNmgiLCAicjdoIiwKLSAgICAgICJyMGwiLCAicjFsIiwgInIybCIsICJyM2wiLCAicjRsIiwgInI1bCIsICJyNmwiLCAicjdsIn07Ci0gIAotICBzdGF0aWMgQ09OU1QgY2hhciAqd3JlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCi0gICAgICAiZTAiLCAiZTEiLCAiZTIiLCAiZTMiLCAiZTQiLCAiZTUiLCAiZTYiLCAiZTciCi0gICAgICB9OwotICAKLSAgc3RhdGljIENPTlNUIGNoYXIgKmxyZWduYW1lc1tdID0KLSAgICB7Ci0gICAgICAiZXIwIiwgImVyMSIsICJlcjIiLCAiZXIzIiwgImVyNCIsICJlcjUiLCAiZXI2IiwgImVyNyIsCi0gICAgICAiZXIwIiwgImVyMSIsICJlcjIiLCAiZXIzIiwgImVyNCIsICJlcjUiLCAiZXI2IiwgImVyNyIKLSAgICAgIH0KLSAgOwotCi0gIGludCBycyA9IDA7Ci0gIGludCByZCA9IDA7Ci0gIGludCByZGlzcCA9IDA7Ci0gIGludCBhYnMgPSAwOwotICBpbnQgYml0ID0gMDsKLSAgaW50IHBsZW4gPSAwOwotICBzdGF0aWMgYm9vbGVhbiBpbml0ID0gMDsKLSAgc3RydWN0IGg4X29wY29kZSAqcSA9IGg4X29wY29kZXM7Ci0gIGNoYXIgQ09OU1QgKipwcmVnbmFtZXMgPSBtb2RlICE9IDAgPyBscmVnbmFtZXMgOiB3cmVnbmFtZXM7Ci0gIGludCBzdGF0dXM7Ci0gIGludCBsOwotICAKLSAgdW5zaWduZWQgY2hhciBkYXRhWzIwXTsgIAotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgZnByaW50ZiA9IGluZm8tPmZwcmludGZfZnVuYzsKLQotICBpZiAoIWluaXQpCi0gICAgewotICAgICAgYmZkX2g4X2Rpc2Fzc2VtYmxlX2luaXQgKCk7Ci0gICAgICBpbml0ID0gMTsKLSAgICB9Ci0KLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhhZGRyLCBkYXRhLCAyLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSAKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyhzdGF0dXMsIGFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgZm9yIChsID0gMjsgc3RhdHVzID09IDAgJiYgbCA8IDEwOyBsKz0yKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMoYWRkcitsLCBkYXRhK2wsIDIsIGluZm8pOwotICAgIH0KLSAgCi0gIAotCi0gIC8qIEZpbmQgdGhlIGV4YWN0IG9wY29kZS9hcmcgY29tYm8gKi8KLSAgd2hpbGUgKHEtPm5hbWUpCi0gICAgewotICAgICAgb3BfdHlwZSAqbmliOwotICAgICAgdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0KLSAgICAgIG5pYiA9IHEtPmRhdGEubmliOwotICAgICAgCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBvcF90eXBlIGxvb2tpbmdfZm9yID0gKm5pYjsKLQkgIGludCB0aGlzbmliID0gZGF0YVtsZW4gPj4gMV07Ci0JICAKLQkgIHRoaXNuaWIgPSAobGVuICYgMSkgPyAodGhpc25pYiAmIDB4ZikgOiAoKHRoaXNuaWIgPj4gNCkgJiAweGYpOwotCSAgCi0JICBpZiAobG9va2luZ19mb3IgPCAxNiAmJiBsb29raW5nX2ZvciA+PTApIAotCSAgICB7Ci0JICAgICAgCi0JICAgICAgaWYgKGxvb2tpbmdfZm9yICE9IHRoaXNuaWIpIAotCQlnb3RvIGZhaWw7Ci0JICAgIH0KLQkgIAotCSAgZWxzZSAKLQkgICAgewotCSAgICAgIAotCSAgICAgIGlmICgoaW50KSBsb29raW5nX2ZvciAmIChpbnQpIEIzMSkKLQkJewotCQkgIGlmICghICgoKGludCkgdGhpc25pYiAmIDB4OCkgIT0gMCkpIAotCQkgICAgZ290byBmYWlsOwotCQkgIGxvb2tpbmdfZm9yID0gKG9wX3R5cGUpICgoaW50KSBsb29raW5nX2ZvciAmIH4oaW50KSBCMzEpOwotCQl9Ci0JICAgICAgaWYgKChpbnQpIGxvb2tpbmdfZm9yICYgKGludCkgQjMwKQotCQl7Ci0JCSAgaWYgKCEoKChpbnQpIHRoaXNuaWIgJiAweDgpID09IDApKSAKLQkJICAgIGdvdG8gZmFpbDsKLQkJICBsb29raW5nX2ZvciA9IChvcF90eXBlKSAoKGludCkgbG9va2luZ19mb3IgJiB+KGludCkgQjMwKTsKLQkJfQotCi0JICAgICAgaWYgKGxvb2tpbmdfZm9yICYgREJJVCkKLQkJewotCQkgIGlmICgobG9va2luZ19mb3IgJiA1KSAhPSAodGhpc25pYiAmNSkpIGdvdG8gZmFpbDsKLQkJICBhYnMgPSAodGhpc25pYiAmIDB4OCkgPyAyIDogMTsKLQkJfQkJICAKLQkgICAgICAKLQkgICAgICBlbHNlICBpZiAobG9va2luZ19mb3IgJiAoUkVHIHwgSU5EfElOQ3xERUMpKQotCQl7Ci0JCSAgaWYgKGxvb2tpbmdfZm9yICYgU1JDKQotCQkgICAgewotCQkgICAgICBycyA9IHRoaXNuaWI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICByZCA9IHRoaXNuaWI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMTYpCi0JCXsKLQkJICBhYnMgPSAoZGF0YVtsZW4gPj4gMV0pICogMjU2ICsgZGF0YVsobGVuICsgMikgPj4gMV07Ci0JCSAgcGxlbiA9IDE2OwotCSAgICAgIAotCQl9Ci0JICAgICAgZWxzZSBpZihsb29raW5nX2ZvciAmIEFCU0pNUCkKLQkJewotCQkgIGFicyA9Ci0JCSAgICAoZGF0YVsxXSA8PCAxNikKLQkJICAgICAgfCAoZGF0YVsyXSA8PCA4KQotCQkJfCAoZGF0YVszXSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmKGxvb2tpbmdfZm9yICYgTUVNSU5EKQotCQl7Ci0JCSAgYWJzID0gZGF0YVsxXTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8zMikKLQkJewotCQkgIGludCBpID0gbGVuID4+IDE7Ci0JCSAgYWJzID0gKGRhdGFbaV0gPDwgMjQpCi0JCSAgICB8IChkYXRhW2kgKyAxXSA8PCAxNikKLQkJICAgICAgfCAoZGF0YVtpICsgMl0gPDwgOCkKLQkJCXwgKGRhdGFbaSsgM10pOwotCi0JCSAgcGxlbiA9MzI7Ci0JICAgICAgCi0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMjQpCi0JCXsKLQkJICBpbnQgaSA9IGxlbiA+PiAxOwotCQkgIGFicyA9IChkYXRhW2ldIDw8IDE2KSB8IChkYXRhW2kgKyAxXSA8PCA4KXwgIChkYXRhW2krMl0pOwotCQkgIHBsZW4gPTI0OwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBJR05PUkUpCi0JCXsKLQkJICAKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgRElTUFJFRykKLQkJewotCQkgIHJkaXNwID0gdGhpc25pYjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgS0JJVCkKLQkJewotCQkgIHN3aXRjaCAodGhpc25pYikgCi0JCSAgICB7Ci0JCSAgICBjYXNlIDk6Ci0JCSAgICAgIGFicyA9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA4OgotCQkgICAgICBhYnMgPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgYWJzID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBnb3RvIGZhaWw7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfOCkKLQkJewotCQkgIHBsZW4gPSA4OwkJICAKLQkJICBhYnMgPSBkYXRhW2xlbiA+PiAxXTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8zKQotCQl7Ci0JCSAgYml0ID0gdGhpc25pYiAmIDB4NzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8yKQotCQl7Ci0JCSAgcGxlbiA9IDI7Ci0JCSAgYWJzID0gdGhpc25pYiAmIDB4MzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTUFDUkVHKQotCQl7Ci0JCSAgYWJzID0gKHRoaXNuaWIgPT0gMyk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciA9PSBFKQotCQl7Ci0KLQkJICB7Ci0JCSAgICBpbnQgaTsKLQotCQkgICAgZm9yIChpID0gMDsgaSA8IHEtPmxlbmd0aDsgaSsrKQotCQkgICAgICB7Ci0JCQlmcHJpbnRmIChzdHJlYW0sICIlMDJ4ICIsIGRhdGFbaV0pOwotCQkgICAgICB9Ci0JCSAgICBmb3IgKDsgaSA8IDY7IGkrKykKLQkJICAgICAgewotCQkJZnByaW50ZiAoc3RyZWFtLCAiICAgIik7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCSAgZnByaW50ZiAoc3RyZWFtLCAiJXNcdCIsIHEtPm5hbWUpOwotCi0JCSAgLyogR3Jvc3MuICBEaXNndXN0aW5nLiAgKi8KLQkJICBpZiAoc3RyY21wIChxLT5uYW1lLCAibGRtLmwiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBpbnQgY291bnQsIGhpZ2g7Ci0KLQkJICAgICAgY291bnQgPSAoZGF0YVsxXSA+PiA0KSAmIDB4MzsKLQkJICAgICAgaGlnaCA9IGRhdGFbM10gJiAweDc7Ci0KLQkJICAgICAgZnByaW50ZiAoc3RyZWFtLCAiQHNwKyxlciVkLWVyJWQiLCBoaWdoIC0gY291bnQsIGhpZ2gpOwotCQkgICAgICByZXR1cm4gcS0+bGVuZ3RoOwotCQkgICAgfQotCi0JCSAgaWYgKHN0cmNtcCAocS0+bmFtZSwgInN0bS5sIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaW50IGNvdW50LCBsb3c7Ci0KLQkJICAgICAgY291bnQgPSAoZGF0YVsxXSA+PiA0KSAmIDB4MzsKLQkJICAgICAgbG93ID0gZGF0YVszXSAmIDB4NzsKLQotCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJlciVkLWVyJWQsQC1zcCIsIGxvdywgbG93ICsgY291bnQpOwotCQkgICAgICByZXR1cm4gcS0+bGVuZ3RoOwotCQkgICAgfQotCi0JCSAgLyogRmlsbCBpbiB0aGUgYXJncyAqLwotCQkgIHsKLQkJICAgIG9wX3R5cGUgKmFyZ3MgPSBxLT5hcmdzLm5pYjsKLQkJICAgIGludCBoYWRvbmUgPSAwOwotCi0KLQkJICAgIHdoaWxlICgqYXJncyAhPSBFKQotCQkgICAgICB7Ci0JCQlpbnQgeCA9ICphcmdzOwotCQkJaWYgKGhhZG9uZSkKLQkJCSAgZnByaW50ZiAoc3RyZWFtLCAiLCIpOwotCi0KLQkJCWlmICh4ICYgTF8zKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiIzB4JXgiLCAodW5zaWduZWQpIGJpdCk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiAoSU1NfEtCSVR8REJJVCkpCi0JCQkgIHsKLQkJCSAgICAvKiBCbGV0Y2guICBGb3Igc2hhbCAjMixlcjAgYW5kIGZyaWVuZHMuICAqLwotCQkJICAgIGlmICgqKGFyZ3MrMSkgJiBTUkNfSU5fRFNUKQotCQkJICAgICAgYWJzID0gMjsKLQotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIiMweCV4IiwgKHVuc2lnbmVkKSBhYnMpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgUkVHKQotCQkJICB7Ci0JCQkgICAgaW50IHJuID0gKHggJiBEU1QpID8gcmQgOiByczsKLQkJCSAgICBzd2l0Y2ggKHggJiBTSVpFKQotCQkJICAgICAgewotCQkJICAgICAgY2FzZSBMXzg6Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiJXMiLCByZWduYW1lc1tybl0pOwotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSBMXzE2OgotCQkJCWZwcmludGYgKHN0cmVhbSwgIiVzIiwgd3JlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlIExfUDoKLQkJCSAgICAgIGNhc2UgTF8zMjoKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIlcyIsIGxyZWduYW1lc1tybl0pOwotCQkJCWJyZWFrOwotCQkgICAgCi0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBNQUNSRUcpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJtYWMlYyIsIGFicyA/ICdsJyA6ICdoJyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBJTkMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAJXMrIiwgcHJlZ25hbWVzW3JzXSk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBERUMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJALSVzIiwgcHJlZ25hbWVzW3JkXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIElORCkKLQkJCSAgewotCQkJICAgIGludCBybiA9ICh4ICYgRFNUKSA/IHJkIDogcnM7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQCVzIiwgcHJlZ25hbWVzW3JuXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIEFCUzhNRU0pCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAMHgleDo4IiwgKHVuc2lnbmVkKSBhYnMpOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiAoQUJTfEFCU0pNUCkpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAMHgleDolZCIsICh1bnNpZ25lZCkgYWJzLCBwbGVuKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgTUVNSU5EKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQEAlZCAoJXgpIiwgYWJzLCBhYnMpOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiBQQ1JFTCkKLQkJCSAgewotCQkJICAgIGlmICh4ICYgTF8xNikgCi0JCQkgICAgICB7Ci0JCQkJYWJzICArPTI7Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiLiVzJWQgKCV4KSIsIChzaG9ydCkgYWJzID4gMCA/ICIrIiA6ICIiLCAoc2hvcnQpIGFicywKLQkJCQkJIGFkZHIgKyAoc2hvcnQpIGFicyArIDIpOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UgewotCQkJICAgICAgZnByaW50ZiAoc3RyZWFtLCAiLiVzJWQgKCV4KSIsIChjaGFyKSBhYnMgPiAwID8gIisiIDogIiIsIChjaGFyKSBhYnMsCi0JCQkJICAgICAgIGFkZHIgKyAoY2hhcikgYWJzICsgMik7Ci0JCQkgICAgfQotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgRElTUCkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAoMHgleDolZCwlcykiLCBhYnMscGxlbiwgcHJlZ25hbWVzW3JkaXNwXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIENDUikKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgImNjciIpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgRVhSKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiZXhyIik7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCSAgZnByaW50ZiAoc3RyZWFtLCBfKCJIbW1tbSAleCIpLCB4KTsKLQkJCWhhZG9uZSA9IDE7Ci0JCQlhcmdzKys7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCSAgcmV0dXJuIHEtPmxlbmd0aDsKLQkJfQotCi0gICAgICAKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIGZwcmludGYgKHN0cmVhbSwgXygiRG9uJ3QgdW5kZXJzdGFuZCAleCBcbiIpLCBsb29raW5nX2Zvcik7Ci0JCX0KLQkgICAgfQotCSAgCi0JICBsZW4rKzsKLQkgIG5pYisrOwotCX0KLSAgICAgIAotICAgIGZhaWw6Ci0gICAgICBxKys7Ci0gICAgfQotCi0gIC8qIEZlbGwgb2YgdGhlIGVuZCAqLwotICBmcHJpbnRmIChzdHJlYW0sICIlMDJ4ICUwMnggICAgICAgIC53b3JkXHRIJyV4LEgnJXgiLAotCSAgIGRhdGFbMF0sIGRhdGFbMV0sCi0JICAgZGF0YVswXSwgZGF0YVsxXSk7Ci0gIHJldHVybiAyOwotfQotCi1pbnQgCi1wcmludF9pbnNuX2g4MzAwIChhZGRyLCBpbmZvKQotYmZkX3ZtYSBhZGRyOyAKLWRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBiZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8gLCAwKTsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9oODMwMGggKGFkZHIsIGluZm8pCi1iZmRfdm1hIGFkZHI7Ci1kaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gYmZkX2g4X2Rpc2Fzc2VtYmxlIChhZGRyLCBpbmZvICwgMSk7Ci19Ci0KLWludCAKLXByaW50X2luc25faDgzMDBzIChhZGRyLCBpbmZvKQotYmZkX3ZtYSBhZGRyOwotZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbyAsIDIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9oODUwMC1kaXMuYyBiL29wY29kZXMvaDg1MDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODU4YzkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9oODUwMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBoODUwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgRElTQVNTRU1CTEVSX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAiaDg1MDAtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1BWExFTiA4Ci0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopIGluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqY3JuYW1lW10gPQoteyJzciIsICJjY3IiLCAiKiIsICJiciIsICJlcCIsICJkcCIsICIqIiwgInRwIn07Ci0KLWludAotcHJpbnRfaW5zbl9oODUwMCAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgZnVuYyA9IGluZm8tPmZwcmludGZfZnVuYzsKLQotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICYgcHJpdjsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gYWRkcjsKLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgcmV0dXJuIC0xOwotCi1pZiAoMCkgIHsKLSAgICBzdGF0aWMgICAgaW50IG9uZTsKLSAgICBpZiAoIW9uZSApIAotICAgICAgewotCW9uZSA9IDE7Ci0JZm9yIChvcGNvZGUgPSBoODUwMF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLQkgIHsKLQkgICAgaWYgKChvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzICYgMHg4KSA9PSAwKQotCSAgICAgIHByaW50ZigiJXNcbiIsIG9wY29kZS0+bmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotCi0gIC8qIFJ1biBkb3duIHRoZSB0YWJsZSB0byBmaW5kIHRoZSBvbmUgd2hpY2ggbWF0Y2hlcyAqLwotICBmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGludCBieXRlOwotICAgICAgaW50IHJuID0gMDsKLSAgICAgIGludCByZCA9IDA7Ci0gICAgICBpbnQgcnMgPSAwOwotICAgICAgaW50IGRpc3AgPSAwOwotICAgICAgaW50IGFicyA9IDA7Ci0gICAgICBpbnQgaW1tID0gMDsKLSAgICAgIGludCBwY3JlbCA9IDA7Ci0gICAgICBpbnQgcWltID0gMDsKLSAgICAgIGludCBpOwotICAgICAgaW50IGNyID0gMDsKLSAgICAgIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBvcGNvZGUtPmxlbmd0aDsgYnl0ZSsrKQotCXsKLQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAxKTsKLQkgIGlmICgoYnVmZmVyW2J5dGVdICYgb3Bjb2RlLT5ieXRlc1tieXRlXS5tYXNrKQotCSAgICAgICE9IChvcGNvZGUtPmJ5dGVzW2J5dGVdLmNvbnRlbnRzKSkKLQkgICAgewotCSAgICAgIGdvdG8gbmV4dDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogZXh0cmFjdCBhbnkgaW5mbyBwYXJ0cyAqLwotCSAgICAgIHN3aXRjaCAob3Bjb2RlLT5ieXRlc1tieXRlXS5pbnNlcnQpCi0JCXsKLQkJY2FzZSAwOgotCQljYXNlIEZQOgotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgZnVuYyAoc3RyZWFtLCBfKCJjYW4ndCBjb3BlIHdpdGggaW5zZXJ0ICVkXG4iKSwKLQkJCW9wY29kZS0+Ynl0ZXNbYnl0ZV0uaW5zZXJ0KTsKLQkJICBicmVhazsKLQkJY2FzZSBSTjoKLQkJICBybiA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBicmVhazsKLQkJY2FzZSBSUzoKLQkJICBycyA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBicmVhazsKLQkJY2FzZSBDUkI6Ci0JCSAgY3IgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgaWYgKGNyID09IDApCi0JCSAgICBnb3RvIG5leHQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ1JXOgotCQkgIGNyID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGlmIChjciAhPSAwKQotCQkgICAgZ290byBuZXh0OwotCQkgIGJyZWFrOwotCQljYXNlIERJU1AxNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgZGlzcCA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRlBJTkRfRDg6Ci0JCWNhc2UgRElTUDg6Ci0JCSAgZGlzcCA9ICgoY2hhcikgKGJ1ZmZlcltieXRlXSkpOwotCQkgIGJyZWFrOwotCQljYXNlIFJEOgotCQljYXNlIFJESU5EOgotCQkgIHJkID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzI0OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAzKTsKLQkJICBhYnMgPQotCQkgICAgKGJ1ZmZlcltieXRlXSA8PCAxNikKLQkJICAgIHwgKGJ1ZmZlcltieXRlICsgMV0gPDwgOCkKLQkJICAgIHwgKGJ1ZmZlcltieXRlICsgMl0pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzE2OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKLQkJICBhYnMgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzg6Ci0JCSAgYWJzID0gKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgSU1NMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgSU1NNDoKLQkJICBpbW0gPSAoYnVmZmVyW2J5dGVdKSAmIDB4ZjsKLQkJICBicmVhazsKLQkJY2FzZSBJTU04OgotCQljYXNlIFJMSVNUOgotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIHBjcmVsID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBQQ1JFTDg6Ci0JCSAgcGNyZWwgPSAoYnVmZmVyW2J5dGVdKTsKLQkJICBicmVhazsKLQkJY2FzZSBRSU06Ci0JCSAgc3dpdGNoIChidWZmZXJbYnl0ZV0gJiAweDcpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIHFpbSA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAxOgotCQkgICAgICBxaW0gPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgNDoKLQkJICAgICAgcWltID0gLTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA1OgotCQkgICAgICBxaW0gPSAtMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgLyogV2UgZ2V0IGhlcmUgd2hlbiBhbGwgdGhlIG1hc2tzIGhhdmUgcGFzc2VkIHNvIHdlIGNhbiBvdXRwdXQgdGhlCi0JIG9wZXJhbmRzKi8KLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIG9wY29kZS0+bGVuZ3RoKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBvcGNvZGUtPmxlbmd0aDsgaSsrKQotCXsKLQkgIChmdW5jKSAoc3RyZWFtLCAiJTAyeCAiLCBidWZmZXJbaV0pOwotCX0KLSAgICAgIGZvciAoOyBpIDwgNjsgaSsrKQotCXsKLQkgIChmdW5jKSAoc3RyZWFtLCAiICAgIik7Ci0JfQotICAgICAgKGZ1bmMpIChzdHJlYW0sICIlc1x0Iiwgb3Bjb2RlLT5uYW1lKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBvcGNvZGUtPm5hcmdzOyBpKyspCi0JewotCSAgaWYgKGkpCi0JICAgIChmdW5jKSAoc3RyZWFtLCAiLCIpOwotCSAgc3dpdGNoIChvcGNvZGUtPmFyZ190eXBlW2ldKQotCSAgICB7Ci0JICAgIGNhc2UgRlA6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiZnAiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORF9EMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjE2LHIlZCkiLCBkaXNwLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSxyJWQpIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjE2LHIlZCkiLCBkaXNwLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSwgciVkKSIsIGRpc3AgJiAweGZmLCBkaXNwLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRlBJTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSwgZnApIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUkI6Ci0JICAgIGNhc2UgQ1JXOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgY3JuYW1lW2NyXSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk46Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJEOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgInIlZCIsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSUzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJyJWQiLCBycyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5ERUM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQC1yJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHIlZCsiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkIiwgcmQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQSU5DOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkBzcCsiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUERFQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJALXNwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMjQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQDB4JTB4OjI0IiwgYWJzKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6MTYiLCBhYnMgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQDB4JTB4OjgiLCBhYnMgJiAweGZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU0xNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6MTYiLCBpbW0gJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJMSVNUOgotCSAgICAgIHsKLQkJaW50IGk7Ci0JCWludCBuYyA9IDA7Ci0JCWZ1bmMgKHN0cmVhbSwgIigiKTsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJICB7Ci0JCSAgICBpZiAoaW1tICYgKDEgPDwgaSkpCi0JCSAgICAgIHsKLQkJCWZ1bmMgKHN0cmVhbSwgInIlZCIsIGkpOwotCQkJaWYgKG5jKQotCQkJICBmdW5jIChzdHJlYW0sICIsIik7Ci0JCQluYyA9IDE7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWZ1bmMgKHN0cmVhbSwgIikiKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NODoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6OCIsIGltbSAmIDB4ZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiMHglMHg6MTYiLCAocGNyZWwgKyBhZGRyICsgb3Bjb2RlLT5sZW5ndGgpICYgMHhmZmZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiIzB4JTB4OjgiLAotCQkgICAgKChjaGFyKSBwY3JlbCArIGFkZHIgKyBvcGNvZGUtPmxlbmd0aCkgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFFJTToKLQkgICAgICBmdW5jIChzdHJlYW0sICIjJWQ6cSIsIHFpbSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NNDoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjJWQ6NCIsIGltbSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gb3Bjb2RlLT5sZW5ndGg7Ci0gICAgbmV4dDo7Ci0gICAgfQotCi0gIC8qIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcgKi8KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnVuYyAoc3RyZWFtLCBfKCIlMDJ4XHRcdCp1bmtub3duKiIpLCBidWZmZXJbMF0pOwotICByZXR1cm4gMTsKLQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9oODUwMC1vcGMuaCBiL29wY29kZXMvaDg1MDAtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTQ5YWYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9oODUwMC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4MzYgKzAsMCBAQAotdHlwZWRlZiBlbnVtCi17Ci0gIEdSMCxHUjEsR1IyLEdSMyxHUjQsR1I1LEdSNixHUjcsCi0gIEdQUjAsIEdQUjEsIEdQUjIsIEdQUjMsIEdQUjQsIEdQUjUsIEdQUjYsIEdQUjcsCi0gIEdDQ1IsIEdQQywgCi0gIEdTRUdDLCBHU0VHRCwgR1NFR0UsIEdTRUdULEdMQVNUCi19IGdkYnJlZ190eXBlOwotI2RlZmluZSBPX1hPUkMgMQotI2RlZmluZSBPX1hPUiAyCi0jZGVmaW5lIE9fWENIIDMKLSNkZWZpbmUgT19VTkxLIDQKLSNkZWZpbmUgT19UU1QgNQotI2RlZmluZSBPX1RSQVBBIDYKLSNkZWZpbmUgT19UUkFQX1ZTIDcKLSNkZWZpbmUgT19UQVMgOAotI2RlZmluZSBPX1NXQVAgOQotI2RlZmluZSBPX1NVQlggMTAKLSNkZWZpbmUgT19TVUJTIDExCi0jZGVmaW5lIE9fU1VCIDEyCi0jZGVmaW5lIE9fU1RNIDEzCi0jZGVmaW5lIE9fU1RDIDE0Ci0jZGVmaW5lIE9fU0xFRVAgMTUKLSNkZWZpbmUgT19TSExSIDE2Ci0jZGVmaW5lIE9fU0hMTCAxNwotI2RlZmluZSBPX1NIQVIgMTgKLSNkZWZpbmUgT19TSEFMIDE5Ci0jZGVmaW5lIE9fU0NCX05FIDIwCi0jZGVmaW5lIE9fU0NCX0YgMjEKLSNkZWZpbmUgT19TQ0JfRVEgMjIKLSNkZWZpbmUgT19SVFMgMjMKLSNkZWZpbmUgT19SVEQgMjQKLSNkZWZpbmUgT19ST1RYUiAyNQotI2RlZmluZSBPX1JPVFhMIDI2Ci0jZGVmaW5lIE9fUk9UUiAyNwotI2RlZmluZSBPX1JPVEwgMjgKLSNkZWZpbmUgT19QUlRTIDI5Ci0jZGVmaW5lIE9fUFJURCAzMAotI2RlZmluZSBPX1BKU1IgMzEKLSNkZWZpbmUgT19QSk1QIDMyCi0jZGVmaW5lIE9fT1JDIDMzCi0jZGVmaW5lIE9fT1IgMzQKLSNkZWZpbmUgT19OT1QgMzUKLSNkZWZpbmUgT19OT1AgMzYKLSNkZWZpbmUgT19ORUcgMzcKLSNkZWZpbmUgT19NVUxYVSAzOAotI2RlZmluZSBPX01PVlRQRSAzOQotI2RlZmluZSBPX01PVkZQRSA0MAotI2RlZmluZSBPX01PViA0MQotI2RlZmluZSBPX0xJTksgNDIKLSNkZWZpbmUgT19MRE0gNDMKLSNkZWZpbmUgT19MREMgNDQKLSNkZWZpbmUgT19KU1IgNDUKLSNkZWZpbmUgT19KTVAgNDYKLSNkZWZpbmUgT19FWFRVIDQ3Ci0jZGVmaW5lIE9fRVhUUyA0OAotI2RlZmluZSBPX0RTVUIgNDkKLSNkZWZpbmUgT19ESVZYVSA1MAotI2RlZmluZSBPX0RBREQgNTEKLSNkZWZpbmUgT19DTVAgNTIKLSNkZWZpbmUgT19DTFIgNTMKLSNkZWZpbmUgT19CVlMgNTQKLSNkZWZpbmUgT19CVkMgNTUKLSNkZWZpbmUgT19CVFNUIDU2Ci0jZGVmaW5lIE9fQlQgNTcKLSNkZWZpbmUgT19CU1IgNTgKLSNkZWZpbmUgT19CU0VUIDU5Ci0jZGVmaW5lIE9fQlJOIDYwCi0jZGVmaW5lIE9fQlJBIDYxCi0jZGVmaW5lIE9fQlBUIDYyCi0jZGVmaW5lIE9fQlBMIDYzCi0jZGVmaW5lIE9fQk5PVCA2NAotI2RlZmluZSBPX0JORSA2NQotI2RlZmluZSBPX0JNSSA2NgotI2RlZmluZSBPX0JMVCA2NwotI2RlZmluZSBPX0JMUyA2OAotI2RlZmluZSBPX0JMTyA2OQotI2RlZmluZSBPX0JMRSA3MAotI2RlZmluZSBPX0JIUyA3MQotI2RlZmluZSBPX0JISSA3MgotI2RlZmluZSBPX0JHVCA3MwotI2RlZmluZSBPX0JHRSA3NAotI2RlZmluZSBPX0JGIDc1Ci0jZGVmaW5lIE9fQkVRIDc2Ci0jZGVmaW5lIE9fQkNTIDc3Ci0jZGVmaW5lIE9fQkNMUiA3OAotI2RlZmluZSBPX0JDQyA3OQotI2RlZmluZSBPX0FOREMgODAKLSNkZWZpbmUgT19BTkQgODEKLSNkZWZpbmUgT19BRERYIDgyCi0jZGVmaW5lIE9fQUREUyA4MwotI2RlZmluZSBPX0FERCA4NAotI2RlZmluZSBPX0JZVEUgMTI4Ci0jZGVmaW5lIE9fV09SRCAweDAwMAotI2RlZmluZSBPX1VOU1ogMHgwMDAKLSNkZWZpbmUgRlBJTkRfRDgJMTAKLSNkZWZpbmUgUkRJTkRfRDE2CTExCi0jZGVmaW5lIFJESU5EX0Q4CTEyCi0jZGVmaW5lIFNQREVDCTEzCi0jZGVmaW5lIFJESU5ECTE0Ci0jZGVmaW5lIFJOCTE1Ci0jZGVmaW5lIFJOSU5EX0Q4CTE2Ci0jZGVmaW5lIFJOSU5EX0QxNgkxNwotI2RlZmluZSBSTkRFQwkxOAotI2RlZmluZSBSTklOQwkxOQotI2RlZmluZSBSTklORAkyMAotI2RlZmluZSBTUElOQwkyMQotI2RlZmluZSBBQlMxNgkyMgotI2RlZmluZSBBQlMyNAkyMwotI2RlZmluZSBQQ1JFTDE2CTI0Ci0jZGVmaW5lIFBDUkVMOAkyNQotI2RlZmluZSBBQlM4CTI2Ci0jZGVmaW5lIENSQgkyNwotI2RlZmluZSBDUgkyOAotI2RlZmluZSBDUlcJMjkKLSNkZWZpbmUgRElTUDE2CTMwCi0jZGVmaW5lIERJU1A4CTMxCi0jZGVmaW5lIEZQCTMyCi0jZGVmaW5lIElNTTE2CTMzCi0jZGVmaW5lIElNTTQJMzQKLSNkZWZpbmUgSU1NOAkzNQotI2RlZmluZSBSTElTVAkzNgotI2RlZmluZSBRSU0JMzcKLSNkZWZpbmUgUkQJMzgKLSNkZWZpbmUgUlMJMzkKLSNkZWZpbmUgU1AJNDAKLXR5cGVkZWYgZW51bSB7IEFDX0JBRCwgQUNfRUksIEFDX1JJLCBBQ19ELCBBQ18sQUNfRVJSLCBBQ19YLEFDX0IsIEFDX0VFLEFDX1JSLEFDX0lFLAotIEFDX1JFLEFDX0UsIEFDX0ksIEFDX0VSLEFDX0lSUiwgQUNfSVIsIEFDX1JFUiwgQUNfRVJFLEFDX0VJRSB9IGFkZHJfY2xhc3NfdHlwZTsgCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc2hvcnQgaW50IGlkeDsKLQljaGFyIGZsYWdzLHNyYzEsc3JjMixkc3Q7Ci0JdW5zaWduZWQgY2hhciBmbGF2b3I7Ci0JY2hhciAqbmFtZTsKLQlpbnQgbmFyZ3M7Ci0JaW50IGFyZ190eXBlWzJdOwotCWludCBsZW5ndGg7Ci0Jc3RydWN0IHsgdW5zaWduZWQgY2hhciBjb250ZW50czt1bnNpZ25lZCBjaGFyIG1hc2s7IGNoYXIgaW5zZXJ0OyB9IGJ5dGVzWzZdOwotfSBoODUwMF9vcGNvZGVfaW5mbzsKLWg4NTAwX29wY29kZV9pbmZvIGg4NTAwX3RhYmxlW10KLSNpZmRlZiBBU1NFTUJMRVJfVEFCTEUKLSNpZmRlZiBERUZJTkVfVEFCTEUKLT17Ci0vKgotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LAotCQkJCQkJCQkgICB7MHgwMCwweDAwLEFCUzE2IH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsIH0sCi0JCQkJCQkJCSAgIHsweDA3LDB4ZmYsIH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sKi8KLQotezEsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX1dPUkQsInhvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LENSVyB9fX0sCi17MiwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fQllURSwieG9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NiwnLScsJ1gnLCchJywnIScsT19YQ0h8T19XT1JELCJ4Y2gudyIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17NywnLScsJ1gnLCchJywnIScsT19YQ0h8T19VTlNaLCJ4Y2giLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAotezgsJy0nLCdCJywnIScsJyEnLE9fVU5MS3xPX1VOU1osInVubGsiLDEse0ZQLDB9LDEsCXt7MHgwZiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMiwnLScsJ0knLCchJywnIScsT19UUkFQQXxPX1VOU1osInRyYXBhIiwxLHtJTU00LDB9LDIsCXt7MHgwOCwweGZmLCB9LHsweDEwLDB4ZjAsSU1NNCB9fX0sCi17MTMsJy0nLCdCJywnIScsJyEnLE9fVFJBUF9WU3xPX1VOU1osInRyYXAvdnMiLDAsezAsMH0sMSwJe3sweDA5LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezE2LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19CWVRFLCJzd2FwLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE3LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19VTlNaLCJzd2FwIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNywnLScsJ0knLCchJywnRScsT19TVE18T19VTlNaLCJzdG0iLDIse1JMSVNULFNQREVDfSwyLAl7ezB4MTIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk59LDIsCQl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzEsJy0nLCchJywnIScsJyEnLE9fU0xFRVB8T19VTlNaLCJzbGVlcCIsMCx7MCwwfSwxLAl7ezB4MWEsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDQsJy0nLCdCJywnUycsJ1MnLE9fU0NCX05FfE9fVU5TWiwic2NiL25lIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNiwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDUsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0Z8T19VTlNaLCJzY2IvZiIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDEsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ2LCctJywnQicsJ1MnLCdTJyxPX1NDQl9FUXxPX1VOU1osInNjYi9lcSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDcsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ3LCctJywnQicsJyEnLCchJyxPX1JUU3xPX1VOU1osInJ0cyIsMCx7MCwwfSwxLAl7ezB4MTksMHhmZiwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NOCwwfSwyLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NMTYsMH0sMywJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYxLCctJywnQicsJyEnLCchJyxPX1BSVFN8T19VTlNaLCJwcnRzIiwwLHswLDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweDFjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzgsMHhmOCxSRElORCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse0FCUzI0LDB9LDQsCXt7MHgwMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzAsMHhmOCxSRElORCB9fX0sCi17NjQsJy0nLCdKJywnIScsJyEnLE9fUEpNUHxPX1VOU1osInBqbXAiLDEse0FCUzI0LDB9LDQsCXt7MHgxMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2NSwncycsJ0knLCdDJywnQycsT19PUkN8T19XT1JELCJvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCi17NjYsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fQllURSwib3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NjcsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fVU5TWiwib3JjIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAotezY3LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1VOU1osIm9yYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezc0LCctJywnIScsJyEnLCchJyxPX05PUHxPX1VOU1osIm5vcCIsMCx7MCwwfSwxLAl7ezB4MDAsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOLFJEfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5ELFJEfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOREVDLFJEfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0Q4LFJEfSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDE2LFJEfSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklORCxSRH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtBQlM4LFJEfSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5EX0QxNixSRH0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6cy53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OnMuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpzIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODgsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmwudyIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg5LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpsLmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs5MCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6bCIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezkxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTIsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmkiLCAgMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUse3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk4LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpmIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTksJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMCwnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZSIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi0vKnsxMDMsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJEfSwyLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sKi8KLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORH0sMywJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklOQ30sMywJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NOH0sMiwJe3sweDE3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTE2fSwzLAl7ezB4MWYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNSwnLScsJ0UnLCchJywnQycsT19MRE18T19VTlNaLCJsZG0iLDIse1NQSU5DLFJMSVNUfSwyLAl7ezB4MDIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOLENSV30sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkQsQ1JXfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5DLENSV30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTkRFQyxDUld9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7QUJTOCxDUld9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5EX0Q4LENSV30sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtBQlMxNixDUld9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5EX0QxNixDUld9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOLENSQn0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5DLENSQn0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORCxDUkJ9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzgsQ1JCfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzE2LENSQn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOLENSV30sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk4sQ1JCfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklOQyxDUld9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5ELENSQn0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5ERUMsQ1JXfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORCxDUld9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkMsQ1JCfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlM4LENSV30sMywJCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlM4LENSQn0sMywJCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtJTU04LENSQn0sMywJCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EOCxDUld9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlMxNixDUkJ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlMxNixDUld9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EMTYsQ1JXfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQ4LDB4ZjgsUkQgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse0FCUzE2LDB9LDMsCXt7MHgxOCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTgsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjgsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhkMCwweGY4LFJEIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTAsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGUwLDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweGYwLDB4ZjgsUkRJTkRfRDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17MTExLCdzJywnRCcsJyEnLCdEJyxPX0VYVFV8T19CWVRFLCJleHR1LmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTIsMHhmZiwgfX19LAotezExMiwncycsJ0QnLCchJywnRCcsT19FWFRVfE9fVU5TWiwiZXh0dSIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTEzLCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19CWVRFLCJleHRzLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTEsMHhmZiwgfX19LAotezExNCwncycsJ0QnLCchJywnRCcsT19FWFRTfE9fVU5TWiwiZXh0cyIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMSwweGZmLCB9fX0sCi17MTE1LCdzJywnRCcsJyEnLCchJyxPX0RTVUJ8T19VTlNaLCJkc3ViIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE5LCdzJywnRCcsJyEnLCchJyxPX0RBRER8T19VTlNaLCJkYWRkIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezEyMCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6aSIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LHt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI1LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjYsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmUiLDIse0lNTTgsUkR9LDIsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTixSRH0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTgsUkR9LDIsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtBQlM4LFJEfSwzLAkJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk59LDQsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMywnLScsJ0InLCchJywnIScsT19CVlN8T19XT1JELCJidnMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTM0LCctJywnQicsJyEnLCchJyxPX0JWU3xPX0JZVEUsImJ2cy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzNSwnLScsJ0InLCchJywnIScsT19CVlN8T19VTlNaLCJidnMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM1LCctJywnQicsJyEnLCchJyxPX0JWU3xPX1VOU1osImJ2cyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTM2LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1dPUkQsImJ2Yy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzcsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fQllURSwiYnZjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM4LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1VOU1osImJ2YyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzgsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fVU5TWiwiYnZjIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQyLCctJywnQicsJyEnLCchJyxPX0JUfE9fV09SRCwiYnQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQzLCctJywnQicsJyEnLCchJyxPX0JUfE9fQllURSwiYnQuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDQsJy0nLCdCJywnIScsJyEnLE9fQlR8T19VTlNaLCJidCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDQsJy0nLCdCJywnIScsJyEnLE9fQlR8T19VTlNaLCJidCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQ1LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1dPUkQsImJzci53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDYsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fQllURSwiYnNyLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MGUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ3LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1VOU1osImJzciIsMSx7UENSRUw4LDB9LDIsCXt7MHgwZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDcsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fVU5TWiwiYnNyIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUxLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1dPUkQsImJybi53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTIsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fQllURSwiYnJuLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTUzLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1VOU1osImJybiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTMsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fVU5TWiwiYnJuIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTQsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fV09SRCwiYnJhLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NSwnLScsJ0InLCchJywnIScsT19CUkF8T19CWVRFLCJicmEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTYsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fVU5TWiwiYnJhIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1NiwnLScsJ0InLCchJywnIScsT19CUkF8T19VTlNaLCJicmEiLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NywnLScsJyEnLCchJywnIScsT19CUFR8T19VTlNaLCJicHQiLDAsezAsMH0sMSwJe3sweDBiLDB4ZmYsIH19fSwKLXsxNTgsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fV09SRCwiYnBsLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1OSwnLScsJ0InLCchJywnIScsT19CUEx8T19CWVRFLCJicGwuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjAsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fVU5TWiwiYnBsIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2MCwnLScsJ0InLCchJywnIScsT19CUEx8T19VTlNaLCJicGwiLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjQsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fV09SRCwiYm5lLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2NSwnLScsJ0InLCchJywnIScsT19CTkV8T19CWVRFLCJibmUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjYsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fVU5TWiwiYm5lIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NiwnLScsJ0InLCchJywnIScsT19CTkV8T19VTlNaLCJibmUiLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2NywnLScsJ0InLCchJywnIScsT19CTUl8T19XT1JELCJibWkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY4LCctJywnQicsJyEnLCchJyxPX0JNSXxPX0JZVEUsImJtaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2OSwnLScsJ0InLCchJywnIScsT19CTUl8T19VTlNaLCJibWkiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY5LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1VOU1osImJtaSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTcwLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1dPUkQsImJsdC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzEsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fQllURSwiYmx0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTcyLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1VOU1osImJsdCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzIsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fVU5TWiwiYmx0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzMsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fV09SRCwiYmxzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3NCwnLScsJ0InLCchJywnIScsT19CTFN8T19CWVRFLCJibHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzUsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fVU5TWiwiYmxzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NSwnLScsJ0InLCchJywnIScsT19CTFN8T19VTlNaLCJibHMiLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3NiwnLScsJ0InLCchJywnIScsT19CTE98T19XT1JELCJibG8udyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc3LCctJywnQicsJyEnLCchJyxPX0JMT3xPX0JZVEUsImJsby5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3OCwnLScsJ0InLCchJywnIScsT19CTE98T19VTlNaLCJibG8iLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc4LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1VOU1osImJsbyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc5LCctJywnQicsJyEnLCchJyxPX0JMRXxPX1dPUkQsImJsZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODAsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fQllURSwiYmxlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTgxLCctJywnQicsJyEnLCchJyxPX0JMRXxPX1VOU1osImJsZSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODEsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fVU5TWiwiYmxlIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODIsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fV09SRCwiYmhzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MywnLScsJ0InLCchJywnIScsT19CSFN8T19CWVRFLCJiaHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODQsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fVU5TWiwiYmhzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NCwnLScsJ0InLCchJywnIScsT19CSFN8T19VTlNaLCJiaHMiLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4NSwnLScsJ0InLCchJywnIScsT19CSEl8T19XT1JELCJiaGkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg2LCctJywnQicsJyEnLCchJyxPX0JISXxPX0JZVEUsImJoaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NywnLScsJ0InLCchJywnIScsT19CSEl8T19VTlNaLCJiaGkiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg3LCctJywnQicsJyEnLCchJyxPX0JISXxPX1VOU1osImJoaSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg4LCctJywnQicsJyEnLCchJyxPX0JHVHxPX1dPUkQsImJndC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODksJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fQllURSwiYmd0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkwLCctJywnQicsJyEnLCchJyxPX0JHVHxPX1VOU1osImJndCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTAsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fVU5TWiwiYmd0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTEsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fV09SRCwiYmdlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MiwnLScsJ0InLCchJywnIScsT19CR0V8T19CWVRFLCJiZ2UuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTMsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fVU5TWiwiYmdlIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MywnLScsJ0InLCchJywnIScsT19CR0V8T19VTlNaLCJiZ2UiLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NCwnLScsJ0InLCchJywnIScsT19CRnxPX1dPUkQsImJmLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NSwnLScsJ0InLCchJywnIScsT19CRnxPX0JZVEUsImJmLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk2LCctJywnQicsJyEnLCchJyxPX0JGfE9fVU5TWiwiYmYiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk2LCctJywnQicsJyEnLCchJyxPX0JGfE9fVU5TWiwiYmYiLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NywnLScsJ0InLCchJywnIScsT19CRVF8T19XT1JELCJiZXEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk4LCctJywnQicsJyEnLCchJyxPX0JFUXxPX0JZVEUsImJlcS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5OSwnLScsJ0InLCchJywnIScsT19CRVF8T19VTlNaLCJiZXEiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk5LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1VOU1osImJlcSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjAwLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1dPUkQsImJjcy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDEsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fQllURSwiYmNzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjAyLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1VOU1osImJjcyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDIsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fVU5TWiwiYmNzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA2LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1dPUkQsImJjYy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDcsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fQllURSwiYmNjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjA4LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1VOU1osImJjYyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDgsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fVU5TWiwiYmNjIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDksJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1dPUkQsImFuZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjEwLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19CWVRFLCJhbmRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1OCwweGY4LENSQiB9fX0sCi17MjExLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19VTlNaLCJhbmRjIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTgsMHhmOCxDUkIgfX19LAotezIxMSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fVU5TWiwiYW5kYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLTAsMCwwfQotI2VuZGlmCi07Ci0jZW5kaWYKLSNpZmRlZiBESVNBU1NFTUJMRVJfVEFCTEUKLSNpZmRlZiBERUZJTkVfVEFCTEUKLT17Ci17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzMCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezYsJy0nLCdYJywnIScsJyEnLE9fWENIfE9fV09SRCwieGNoLnciLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxNiwnbScsJ0QnLCchJywnRCcsT19TV0FQfE9fV09SRCwic3dhcC5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezIsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX0JZVEUsInhvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDY4LDB4ZjgsQ1JCIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNiwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAotezEyLCctJywnSScsJyEnLCchJyxPX1RSQVBBfE9fVU5TWiwidHJhcGEiLDEse0lNTTQsMH0sMiwJe3sweDA4LDB4ZmYsIH0sezB4MTAsMHhmMCxJTU00IH19fSwKLXsxMywnLScsJ0InLCchJywnIScsT19UUkFQX1ZTfE9fVU5TWiwidHJhcC92cyIsMCx7MCwwfSwxLAl7ezB4MDksMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsxLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19XT1JELCJ4b3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxDUlcgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezgsJy0nLCdCJywnIScsJyEnLE9fVU5MS3xPX1VOU1osInVubGsiLDEse0ZQLDB9LDEsCXt7MHgwZiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyNywnLScsJ0knLCchJywnRScsT19TVE18T19VTlNaLCJzdG0iLDIse1JMSVNULFNQREVDfSwyLAl7ezB4MTIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMSwnLScsJyEnLCchJywnIScsT19TTEVFUHxPX1VOU1osInNsZWVwIiwwLHswLDB9LDEsCXt7MHgxYSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOCwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0NSwnLScsJ0InLCdTJywnUycsT19TQ0JfRnxPX1VOU1osInNjYi9mIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwMSwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0NCwnLScsJ0InLCdTJywnUycsT19TQ0JfTkV8T19VTlNaLCJzY2IvbmUiLDIse1JTLFBDUkVMOH0sMywJe3sweDA2LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0NiwnLScsJ0InLCdTJywnUycsT19TQ0JfRVF8T19VTlNaLCJzY2IvZXEiLDIse1JTLFBDUkVMOH0sMywJe3sweDA3LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NMTYsMH0sMywJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs0OCwnLScsJ0InLCchJywnIScsT19SVER8T19VTlNaLCJydGQiLDEse0lNTTgsMH0sMiwJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDcsJy0nLCdCJywnIScsJyEnLE9fUlRTfE9fVU5TWiwicnRzIiwwLHswLDB9LDEsCXt7MHgxOSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezk5LCdtJywnSScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDgwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NywnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDkwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezg5LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpsLmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6bC53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OnMuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpzLnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse0FCUzI0LDB9LDQsCXt7MHgwMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY2LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX0JZVEUsIm9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNSwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezc0LCctJywnIScsJyEnLCchJyxPX05PUHxPX1VOU1osIm5vcCIsMCx7MCwwfSwxLAl7ezB4MDAsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY1LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1dPUkQsIm9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzAsMHhmOCxSRElORCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGM4LDB4ZjgsUkRJTkQgfX19LAotezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU04LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs2MSwnLScsJ0InLCchJywnIScsT19QUlRTfE9fVU5TWiwicHJ0cyIsMCx7MCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHgxOSwweGZmLCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweDFjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7QUJTMjQsMH0sNCwJe3sweDEzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkQsUkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EMTYsUkR9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLQotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTMTYsUkR9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17MTI1LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk4sQ1JCfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMjAsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTksJ3MnLCdEJywnIScsJyEnLE9fREFERHxPX1VOU1osImRhZGQiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTE1LCdzJywnRCcsJyEnLCchJyxPX0RTVUJ8T19VTlNaLCJkc3ViIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezExMywncycsJ0QnLCchJywnRCcsT19FWFRTfE9fQllURSwiZXh0cy5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDExLDB4ZmYsIH19fSwKLXsxMTEsJ3MnLCdEJywnIScsJ0QnLE9fRVhUVXxPX0JZVEUsImV4dHUuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0QxNixDUkJ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTAsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQwLDB4ZjgsUkQgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQ4LDB4ZjgsUkQgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGUwLDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTgsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjAsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjgsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTgsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTMTYsQ1JCfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklOQyxDUkJ9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkQsQ1JCfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlM4LENSQn0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTA1LCctJywnRScsJyEnLCdDJyxPX0xETXxPX1VOU1osImxkbSIsMix7U1BJTkMsUkxJU1R9LDIsCXt7MHgwMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTE2fSwzLAl7ezB4MWYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NOH0sMiwJe3sweDE3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzcsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fQllURSwiYnZjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM0LCctJywnQicsJyEnLCchJyxPX0JWU3xPX0JZVEUsImJ2cy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzNiwnLScsJ0InLCchJywnIScsT19CVkN8T19XT1JELCJidmMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTMzLCctJywnQicsJyEnLCchJyxPX0JWU3xPX1dPUkQsImJ2cy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ2LCctJywnQicsJyEnLCchJyxPX0JTUnxPX0JZVEUsImJzci5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDBlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDUsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fV09SRCwiYnNyLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTAsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX0JZVEUsImFuZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDU4LDB4ZjgsQ1JCIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA5LCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19XT1JELCJhbmRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxDUlcgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezE1NywnLScsJyEnLCchJywnIScsT19CUFR8T19VTlNaLCJicHQiLDAsezAsMH0sMSwJe3sweDBiLDB4ZmYsIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNTUsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fQllURSwiYnJhLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNTIsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fQllURSwiYnJuLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg2LCctJywnQicsJyEnLCchJyxPX0JISXxPX0JZVEUsImJoaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NCwnLScsJ0InLCchJywnIScsT19CTFN8T19CWVRFLCJibHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDcsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fQllURSwiYmNjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjAxLCctJywnQicsJyEnLCchJyxPX0JDU3xPX0JZVEUsImJjcy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NSwnLScsJ0InLCchJywnIScsT19CTkV8T19CWVRFLCJibmUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTgsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fQllURSwiYmVxLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU5LCctJywnQicsJyEnLCchJyxPX0JQTHxPX0JZVEUsImJwbC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2OCwnLScsJ0InLCchJywnIScsT19CTUl8T19CWVRFLCJibWkuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTIsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fQllURSwiYmdlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTcxLCctJywnQicsJyEnLCchJyxPX0JMVHxPX0JZVEUsImJsdC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4OSwnLScsJ0InLCchJywnIScsT19CR1R8T19CWVRFLCJiZ3QuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODAsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fQllURSwiYmxlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU0LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1dPUkQsImJyYS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTEsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fV09SRCwiYnJuLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4NSwnLScsJ0InLCchJywnIScsT19CSEl8T19XT1JELCJiaGkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTczLCctJywnQicsJyEnLCchJyxPX0JMU3xPX1dPUkQsImJscy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDYsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fV09SRCwiYmNjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMCwnLScsJ0InLCchJywnIScsT19CQ1N8T19XT1JELCJiY3MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY0LCctJywnQicsJyEnLCchJyxPX0JORXxPX1dPUkQsImJuZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTcsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fV09SRCwiYmVxLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1OCwnLScsJ0InLCchJywnIScsT19CUEx8T19XT1JELCJicGwudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY3LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1dPUkQsImJtaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTEsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fV09SRCwiYmdlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MCwnLScsJ0InLCchJywnIScsT19CTFR8T19XT1JELCJibHQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2QsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg4LCctJywnQicsJyEnLCchJyxPX0JHVHxPX1dPUkQsImJndC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzksJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fV09SRCwiYmxlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotLyogCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk4gICdzJywnQycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOREVDICAncycsJ0MnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkQgICdzJywnQycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUlMsUkQgICctJywnWCcsJyEnLCchJwotUk4sMCAgJ2EnLCdFJywnIScsJyEnCi1SUyxSRCAgJy0nLCdYJywnIScsJyEnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQywwICAnYScsJ0UnLCchJywnIScKLVJOSU5DLDAgICdhJywnRScsJyEnLCchJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOREVDLDAgICdhJywnRScsJyEnLCchJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1SRCwwICAnbScsJ0QnLCchJywnRCcKLUFCUzE2LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCchJwotUk4sMCAgJ3MnLCdFJywnIScsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQywwICAncycsJ0UnLCchJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdzJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAncycsJ0UnLCchJywnRScKLVJOLDAgICdzJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklOQywwICAncycsJ0UnLCchJywnRScKLVJOREVDLDAgICdzJywnRScsJyEnLCdFJwotSU1NOCwwICAncycsJ0UnLCchJywnRScKLUFCUzgsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAncycsJ0UnLCchJywnRScKLUFCUzE2LDAgICdzJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdzJywnRScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotUkQsMCAgJ20nLCdEJywnIScsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LDAgICdzJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICctJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdFJywnQycsJ0MnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsMCAgJ2EnLCdFJywnIScsJyEnCi1JTU04LDAgICdzJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLEFCUzggICdzJywnQycsJyEnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotQUJTOCwwICAncycsJ0UnLCchJywnRScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTQsMCAgJy0nLCdJJywnIScsJyEnCi0wLDAgICctJywnQicsJyEnLCchJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0UnLCdDJywnQycKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LDAgICdhJywnRScsJyEnLCchJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotRlAsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsQUJTMTYgICdzJywnQycsJyEnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUkxJU1QsU1BERUMgICctJywnSScsJyEnLCdFJwotQ1JXLFJOICAncycsJ0MnLCchJywnRScKLUNSVyxSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSVyxBQlM4ICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsQUJTMTYgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnIScKLUFCUzE2LDAgICdzJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1DUlcsUk4gICdzJywnQycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsUk5ERUMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSVyxSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5ERUMgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSQixSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotQ1JCLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLUNSVyxBQlM4ICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EMTYgICdzJywnQycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsQUJTMTYgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQ1JXLEFCUzE2ICAncycsJ0MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsUk4gICdzJywnQycsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi0wLDAgICctJywnIScsJyEnLCchJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1SUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICctJywnQicsJyEnLCchJwotSU1NOCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STixSRCAgJy0nLCdFJywnIScsJ0QnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTiAgJy0nLCdTJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdwJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STiwwICAnbScsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdwJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STiwwICAnbScsJ0UnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOREVDICAnLScsJ1MnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ20nLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQywwICAnbScsJ0UnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdhJywnRScsJyEnLCdFJwotSU1NOCxDUkIgICdzJywnSScsJ0MnLCdDJwotSU1NMTYsQ1JXICAncycsJ0knLCdDJywnQycKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzI0LDAgICctJywnSicsJyEnLCchJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnQycsJ0MnCi1JTU04LDAgICdhJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLTAsMCAgJy0nLCchJywnIScsJyEnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0knLCdDJywnQycKLUlNTTE2LDAgICdhJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCwwICAnYScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUkRJTkQsMCAgJy0nLCdKJywnIScsJyEnCi1SRElORCwwICAnLScsJ0onLCchJywnIScKLUlNTTgsMCAgJy0nLCdCJywnIScsJyEnCi0wLDAgICctJywnQicsJyEnLCchJwotSU1NMTYsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMyNCwwICAnLScsJ0onLCchJywnIScKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOLDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOREVDLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1BQlMxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1SUyxSTklOQyAgJy0nLCdTJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOSU5EICAnLScsJ1MnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkRfRDggICctJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJy0nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnLScsJ1MnLCchJywnRScKLVJTLFJOICAnLScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnLScsJ1MnLCchJywnRScKLVJTLFJOSU5EICAnLScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnLScsJ1MnLCchJywnRScKLVJTLEFCUzggICctJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICctJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnLScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnLScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICctJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1STixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnLScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICctJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJyEnLCdEJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklOQyxSRCAgJy0nLCdFJywnIScsJ0QnCi1JTU04LFJOREVDICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOREVDICAnbScsJ0knLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICctJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICctJywnUycsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotQUJTMTYsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk4gICdhJywnRScsJ0knLCchJwotUk4sQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5ELENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5ERUMsQ1JXICAncycsJ0UnLCchJywnQycKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1JTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STixDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUlcgICdzJywnRScsJyEnLCdDJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUlMsUkQgICdzJywnRCcsJyEnLCchJwotUlMsUkQgICdzJywnRCcsJyEnLCchJwotUkQsMCAgJ3MnLCdEJywnIScsJ0QnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJOLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STixDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkMsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5ELENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JXICAncycsJ0UnLCchJywnQycKLVJOREVDLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUlcgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDgsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0Q4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNixDUkIgICdzJywnRScsJyEnLCdDJwotQUJTMTYsQ1JXICAncycsJ0UnLCchJywnQycKLUlNTTE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0QxNixDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNiwwICAnLScsJ0InLCchJywnIScKLVJESU5ELDAgICctJywnQicsJyEnLCchJwotUkRJTkQsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EOCwwICAnLScsJ0InLCchJywnIScKLVJESU5EX0Q4LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDE2LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDE2LDAgICctJywnQicsJyEnLCchJwotQUJTMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLUFCUzE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJOLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklOQyxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncycsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKLVJOLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAncycsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsQ1JCICAncycsJ0UnLCchJywnQycKLUlNTTgsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotU1BJTkMsUkxJU1QgICctJywnRScsJyEnLCdDJwotSU1NOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotRlAsSU1NMTYgICctJywnUycsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotRlAsSU1NOCAgJy0nLCdTJywnSScsJyEnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk5JTkMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTiAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTgsUk5JTkMgICdhJywnRScsJ0knLCchJwotSU1NOCxSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlM4ICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NOCxSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUk4sMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUk5ERUMsMCAgJ2MnLCchJywnIScsJ0UnCi1STklOQywwICAnYycsJyEnLCchJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDgsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJwotSU1NOCwwICAnYycsJyEnLCchJywnRScKLUFCUzgsMCAgJ2MnLCchJywnIScsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotUk5JTkMsMCAgJ2MnLCchJywnIScsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLUFCUzgsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EOCwwICAnYycsJyEnLCchJywnRScKLUlNTTE2LDAgICdjJywnIScsJyEnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0Q4LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTE2LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUFCUzE2LDAgICdjJywnIScsJyEnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJOSU5DLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnSScsJ1MnLCdTJwotSU1NMTYsQ1JXICAncycsJ0knLCdTJywnUycKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICctJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnUycsJ1MnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0knLCdTJywnUycKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotMCwwICAnLScsJyEnLCchJywnIScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi0qLyAKLXswLDAsMH19Ci0jZW5kaWYKLTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9ocHBhLWRpcy5jIGIvb3Bjb2Rlcy9ocHBhLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTM0ZmRjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaHBwYS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMTIgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGZvciB0aGUgUEEtUklTQy4gU29tZXdoYXQgZGVyaXZlZCBmcm9tIHNwYXJjLXBpbnNuLmMuCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MCwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaHBwYS5oIgotI2luY2x1ZGUgIm9wY29kZS9ocHBhLmgiCi0KLS8qIEludGVnZXIgcmVnaXN0ZXIgbmFtZXMsIGluZGV4ZWQgYnkgdGhlIG51bWJlcnMgd2hpY2ggYXBwZWFyIGluIHRoZQotICAgb3Bjb2Rlcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmVnX25hbWVzW10gPSAKLSB7ImZsYWdzIiwgInIxIiwgInJwIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiwKLSAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgInIxNiIsICJyMTciLCAicjE4IiwgInIxOSIsCi0gICJyMjAiLCAicjIxIiwgInIyMiIsICJyMjMiLCAicjI0IiwgInIyNSIsICJyMjYiLCAiZHAiLCAicmV0MCIsICJyZXQxIiwKLSAgInNwIiwgInIzMSJ9OwotCi0vKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciBuYW1lcywgaW5kZXhlZCBieSB0aGUgbnVtYmVycyB3aGljaCBhcHBlYXIgaW4gdGhlCi0gICBvcGNvZGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmcF9yZWdfbmFtZXNbXSA9IAotIHsiZnBzciIsICJmcGUyIiwgImZwZTQiLCAiZnBlNiIsIAotICAiZnI0IiwgImZyNSIsICJmcjYiLCAiZnI3IiwgImZyOCIsIAotICAiZnI5IiwgImZyMTAiLCAiZnIxMSIsICJmcjEyIiwgImZyMTMiLCAiZnIxNCIsICJmcjE1IiwgCi0gICJmcjE2IiwgImZyMTciLCAiZnIxOCIsICJmcjE5IiwgImZyMjAiLCAiZnIyMSIsICJmcjIyIiwgImZyMjMiLAotICAiZnIyNCIsICJmcjI1IiwgImZyMjYiLCAiZnIyNyIsICJmcjI4IiwgImZyMjkiLCAiZnIzMCIsICJmcjMxIn07Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50IENPUkVfQUREUjsKLQotLyogR2V0IGF0IHZhcmlvdXMgcmVsZXZlbnQgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uIHdvcmQuICovCi0KLSNkZWZpbmUgTUFTS181IDB4MWYKLSNkZWZpbmUgTUFTS18xMCAweDNmZgotI2RlZmluZSBNQVNLXzExIDB4N2ZmCi0jZGVmaW5lIE1BU0tfMTQgMHgzZmZmCi0jZGVmaW5lIE1BU0tfMjEgMHgxZmZmZmYKLQotLyogVGhpcyBtYWNybyBnZXRzIGJpdCBmaWVsZHMgdXNpbmcgSFAncyBudW1iZXJpbmcgKE1TQiA9IDApICovCi0KLSNkZWZpbmUgR0VUX0ZJRUxEKFgsIEZST00sIFRPKSBcCi0gICgoWCkgPj4gKDMxIC0gKFRPKSkgJiAoKDEgPDwgKChUTykgLSAoRlJPTSkgKyAxKSkgLSAxKSkKLQotLyogU29tZSBvZiB0aGVzZSBoYXZlIGJlZW4gY29udmVydGVkIHRvIDItZCBhcnJheXMgYmVjYXVzZSB0aGV5Ci0gICBjb25zdW1lIGxlc3Mgc3RvcmFnZSB0aGlzIHdheS4gIElmIHRoZSBtYWludGVuYW5jZSBiZWNvbWVzIGEKLSAgIHByb2JsZW0sIGNvbnZlcnQgdGhlbSBiYWNrIHRvIGNvbnN0IDEtZCBwb2ludGVyIGFycmF5cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29udHJvbF9yZWdbXSA9IHsKLSAgInJjdHIiLCAiY3IxIiwgImNyMiIsICJjcjMiLCAiY3I0IiwgImNyNSIsICJjcjYiLCAiY3I3IiwKLSAgInBpZHIxIiwgInBpZHIyIiwgImNjciIsICJzYXIiLCAicGlkcjMiLCAicGlkcjQiLAotICAiaXZhIiwgImVpZW0iLCAiaXRtciIsICJwY3NxIiwgInBjb3EiLCAiaWlyIiwgImlzciIsCi0gICJpb3IiLCAiaXBzdyIsICJlaXJyIiwgInRyMCIsICJ0cjEiLCAidHIyIiwgInRyMyIsCi0gICJ0cjQiLCAidHI1IiwgInRyNiIsICJ0cjciCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29tcGFyZV9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgIiw8PCIsICIsPDw9IiwgIixzdiIsICIsb2QiLAotICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLD4+PSIsICIsPj4iLCAiLG5zdiIsICIsZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbXBhcmVfY29uZF82NF9uYW1lc1tdID0gewotICAiIiwgIiwqPSIsICIsKjwiLCAiLCo8PSIsICIsKjw8IiwgIiwqPDw9IiwgIiwqc3YiLCAiLCpvZCIsCi0gICIsKnRyIiwgIiwqPD4iLCAiLCo+PSIsICIsKj4iLCAiLCo+Pj0iLCAiLCo+PiIsICIsKm5zdiIsICIsKmV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjbXBpYl9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIsKjw8IiwgIiwqPSIsICIsKjwiLCAiLCo8PSIsICIsKj4+PSIsICIsKjw+IiwgIiwqPj0iLCAiLCo+IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZGRfY29uZF9uYW1lc1tdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsICIsbnV2IiwgIix6bnYiLCAiLHN2IiwgIixvZCIsCi0gICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsPiIsICIsdXYiLCAiLHZueiIsICIsbnN2IiwgIixldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWRkX2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiIsICIsKj0iLCAiLCo8IiwgIiwqPD0iLCAiLCpudXYiLCAiLCp6bnYiLCAiLCpzdiIsICIsKm9kIiwKLSAgIiwqdHIiLCAiLCo8PiIsICIsKj49IiwgIiwqPiIsICIsKnV2IiwgIiwqdm56IiwgIiwqbnN2IiwgIiwqZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHdpZGVfYWRkX2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAiLG51diIsICIsKj0iLCAiLCo8IiwgIiwqPD0iLAotICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLHV2IiwgIiwqPD4iLCAiLCo+PSIsICIsKj4iCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxvZ2ljYWxfY29uZF9uYW1lc1tdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsIDAsIDAsIDAsICIsb2QiLAotICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAwLCAwLCAwLCAiLGV2In07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbG9naWNhbF9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIiLCAiLCo9IiwgIiwqPCIsICIsKjw9IiwgMCwgMCwgMCwgIiwqb2QiLAotICAiLCp0ciIsICIsKjw+IiwgIiwqPj0iLCAiLCo+IiwgMCwgMCwgMCwgIiwqZXYifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1bml0X2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsc3d6IiwgIixzYnoiLCAiLHNoeiIsICIsc2RjIiwgIixzd2MiLCAiLHNiYyIsICIsc2hjIiwKLSAgIix0ciIsICIsbnd6IiwgIixuYnoiLCAiLG5oeiIsICIsbmRjIiwgIixud2MiLCAiLG5iYyIsICIsbmhjIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1bml0X2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiIsICIsKnN3eiIsICIsKnNieiIsICIsKnNoeiIsICIsKnNkYyIsICIsKnN3YyIsICIsKnNiYyIsICIsKnNoYyIsCi0gICIsKnRyIiwgIiwqbnd6IiwgIiwqbmJ6IiwgIiwqbmh6IiwgIiwqbmRjIiwgIiwqbndjIiwgIiwqbmJjIiwgIiwqbmhjIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaGlmdF9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLG9kIiwgIix0ciIsICIsPD4iLCAiLD49IiwgIixldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2hpZnRfY29uZF82NF9uYW1lc1tdID0gewotICAiIiwgIiwqPSIsICIsKjwiLCAiLCpvZCIsICIsKnRyIiwgIiwqPD4iLCAiLCo+PSIsICIsKmV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBiYl9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIsKjwiLCAiLCo+PSIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaW5kZXhfY29tcGxfbmFtZXNbXSA9IHsiIiwgIixtIiwgIixzIiwgIixzbSJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNob3J0X2xkc3RfY29tcGxfbmFtZXNbXSA9IHsiIiwgIixtYSIsICIiLCAiLG1iIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2hvcnRfYnl0ZXNfY29tcGxfbmFtZXNbXSA9IHsKLSAgIiIsICIsYixtIiwgIixlIiwgIixlLG0iCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZsb2F0X2Zvcm1hdF9uYW1lc1tdID0geyIsc2dsIiwgIixkYmwiLCAiIiwgIixxdWFkIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZmxvYXRfY29tcF9uYW1lc1tdID0KLXsKLSAgIixmYWxzZT8iLCAiLGZhbHNlIiwgIiw/IiwgIiwhPD0+IiwgIiw9IiwgIiw9dCIsICIsPz0iLCAiLCE8PiIsCi0gICIsIT8+PSIsICIsPCIsICIsPzwiLCAiLCE+PSIsICIsIT8+IiwgIiw8PSIsICIsPzw9IiwgIiwhPiIsCi0gICIsIT88PSIsICIsPiIsICIsPz4iLCAiLCE8PSIsICIsIT88IiwgIiw+PSIsICIsPz49IiwgIiwhPCIsCi0gICIsIT89IiwgIiw8PiIsICIsIT0iLCAiLCE9dCIsICIsIT8iLCAiLDw9PiIsICIsdHJ1ZT8iLCAiLHRydWUiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNpZ25lZF91bnNpZ25lZF9uYW1lc1tdID0geyIsdSIsICIscyJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1peF9oYWxmX25hbWVzW10gPSB7IixsIiwgIixyIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2F0dXJhdGlvbl9uYW1lc1tdID0geyIsdXMiLCAiLHNzIiwgMCwgIiJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlYWRfd3JpdGVfbmFtZXNbXSA9IHsiLHIiLCAiLHcifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZGRfY29tcGxfbmFtZXNbXSA9IHsgMCwgIiIsICIsbCIsICIsdHN2IiB9OwotCi0vKiBGb3IgYSBidW5jaCBvZiBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zIGZvcm0gYW4gaW5kZXggaW50byBhIAotICAgY29tcGxldGVyIG5hbWUgdGFibGUuICovCi0jZGVmaW5lIEdFVF9DT01QTChpbnNuKSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIHwgXAotCQkJIEdFVF9GSUVMRCAoaW5zbiwgMTgsIDE4KSA8PCAxKQotCi0jZGVmaW5lIEdFVF9DT05EKGluc24pIChHRVRfRklFTEQgKChpbnNuKSwgMTYsIDE4KSArIFwKLQkJCShHRVRfRklFTEQgKChpbnNuKSwgMTksIDE5KSA/IDggOiAwKSkKLQotLyogVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCByZWdpc3RlcnMuICBQdXQgdGhlc2UgZmlyc3QsIHNvIGdjYydzIGZ1bmN0aW9uCi0gICBpbmxpbmluZyBjYW4gZG8gaXRzIHN0dWZmLiAgKi8KLQotI2RlZmluZSBmcHV0c19maWx0ZXJlZChTVFIsRikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIFNUUikKLQotc3RhdGljIHZvaWQKLWZwdXRfcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHJlZyA/IHJlZ19uYW1lc1tyZWddIDogInIwIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcHV0X2ZwX3JlZyAocmVnLCBpbmZvKQotICAgICB1bnNpZ25lZCByZWc7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCByZWcgPyBmcF9yZWdfbmFtZXNbcmVnXSA6ICJmcjAiKTsKLX0KLQotc3RhdGljIHZvaWQKLWZwdXRfZnBfcmVnX3IgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAvKiBTcGVjaWFsIGNhc2UgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIHJlZ2lzdGVycy4gICovCi0gIGlmIChyZWcgPCA0KQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZnBlJWQiLCByZWcgKiAyICsgMSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzUiIsIHJlZyA/IGZwX3JlZ19uYW1lc1tyZWddIAotCQkJCQkJICAgIDogImZyMCIpOwotfQotCi1zdGF0aWMgdm9pZAotZnB1dF9jcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIGNvbnRyb2xfcmVnW3JlZ10pOwotfQotCi0vKiBwcmludCBjb25zdGFudHMgd2l0aCBzaWduICovCi0KLXN0YXRpYyB2b2lkCi1mcHV0X2NvbnN0IChudW0sIGluZm8pCi0gICAgIHVuc2lnbmVkIG51bTsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKChpbnQpbnVtIDwgMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0leCIsIC0oaW50KW51bSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4IiwgbnVtKTsKLX0KLQotLyogUm91dGluZXMgdG8gZXh0cmFjdCB2YXJpb3VzIHNpemVkIGNvbnN0YW50cyBvdXQgb2YgaHBwYQotICAgaW5zdHJ1Y3Rpb25zLiAqLwotCi0vKiBleHRyYWN0IGEgMy1iaXQgc3BhY2UgcmVnaXN0ZXIgbnVtYmVyIGZyb20gYSBiZSwgYmxlLCBtdHNwIG9yIG1mc3AgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMyAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIEdFVF9GSUVMRCAod29yZCwgMTgsIDE4KSA8PCAyIHwgR0VUX0ZJRUxEICh3b3JkLCAxNiwgMTcpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzVfbG9hZCAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCA+PiAxNiAmIE1BU0tfNSwgNSk7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgc3R7Ymh3fXMgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfNV9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfNSwgNSk7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgYnJlYWsgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF81cl9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuICh3b3JkICYgTUFTS181KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSB7c3J9c20gaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF81Ul9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuICh3b3JkID4+IDE2ICYgTUFTS181KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgMTAgYml0IGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEge3NyfXNtIGluc3RydWN0aW9uICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfMTBVX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgPj4gMTYgJiBNQVNLXzEwKTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBiYiBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0XzVRX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgPj4gMjEgJiBNQVNLXzUpOwotfQotCi0vKiBleHRyYWN0IGFuIDExIGJpdCBpbW1lZGlhdGUgZmllbGQgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTEgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgJiBNQVNLXzExLCAxMSk7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxNCBiaXQgaW1tZWRpYXRlIGZpZWxkICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzE0ICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS18xNCwgMTQpOwotfQotCi0vKiBleHRyYWN0IGEgMjEgYml0IGNvbnN0YW50ICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMjEgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIGludCB2YWw7Ci0KLSAgd29yZCAmPSBNQVNLXzIxOwotICB3b3JkIDw8PSAxMTsKLSAgdmFsID0gR0VUX0ZJRUxEICh3b3JkLCAyMCwgMjApOwotICB2YWwgPDw9IDExOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA5LCAxOSk7Ci0gIHZhbCA8PD0gMjsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgNSwgNik7Ci0gIHZhbCA8PD0gNTsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgMCwgNCk7Ci0gIHZhbCA8PD0gMjsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgNywgOCk7Ci0gIHJldHVybiBzaWduX2V4dGVuZCAodmFsLCAyMSkgPDwgMTE7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxMiBiaXQgY29uc3RhbnQgZnJvbSBicmFuY2ggaW5zdHJ1Y3Rpb25zICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTIgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBzaWduX2V4dGVuZCAoR0VUX0ZJRUxEICh3b3JkLCAxOSwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAgICh3b3JkICYgMHgxKSA8PCAxMSwgMTIpIDw8IDI7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxNyBiaXQgY29uc3RhbnQgZnJvbSBicmFuY2ggaW5zdHJ1Y3Rpb25zLCByZXR1cm5pbmcgdGhlCi0gICAxOSBiaXQgc2lnbmVkIHZhbHVlLiAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzE3ICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gc2lnbl9leHRlbmQgKEdFVF9GSUVMRCAod29yZCwgMTksIDI4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAyOSwgMjkpIDw8IDEwIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDExLCAxNSkgPDwgMTEgfAotICAgICAgICAgICAgICAgICAgICAgICh3b3JkICYgMHgxKSA8PCAxNiwgMTcpIDw8IDI7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMjIgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBzaWduX2V4dGVuZCAoR0VUX0ZJRUxEICh3b3JkLCAxOSwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMTEsIDE1KSA8PCAxMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCA2LCAxMCkgPDwgMTYgfAotICAgICAgICAgICAgICAgICAgICAgICh3b3JkICYgMHgxKSA8PCAyMSwgMjIpIDw8IDI7Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbi4gICovCi1pbnQKLXByaW50X2luc25faHBwYSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGludCBpbnNuLCBpOwotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTU9QQ09ERVM7ICsraSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcGFfb3Bjb2RlICpvcGNvZGUgPSAmcGFfb3Bjb2Rlc1tpXTsKLSAgICAgIGlmICgoaW5zbiAmIG9wY29kZS0+bWFzaykgPT0gb3Bjb2RlLT5tYXRjaCkKLQl7Ci0JICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotCSAgCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3Bjb2RlLT5uYW1lKTsKLQotCSAgaWYgKCFzdHJjaHIgKCJjZkNZPy0rbkhOWkZJdXYiLCBvcGNvZGUtPmFyZ3NbMF0pKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqcykKLQkJewotCQljYXNlICd4JzoKLQkJICBmcHV0X3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnYSc6Ci0JCWNhc2UgJ2InOgotCQkgIGZwdXRfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ14nOgotCQkgIGZwdXRfY3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd0JzoKLQkJICBmcHV0X3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQkvKiBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLiAgKi8KLQkJY2FzZSAnZic6Ci0JCSAgc3dpdGNoICgqKytzKQotCQkgICAgewotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1QnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkJZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCQlmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgICAgIGVsc2UKLQkJCWZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICAvKiAnZkEnIHdpbGwgbm90IGdlbmVyYXRlIGEgc3BhY2UgYmVmb3JlIHRoZSByZWdzaXRlcgotCQkJbmFtZS4gIE5vcm1hbGx5IHRoYXQgaXMgZmluZS4gIEV4Y2VwdCB0aGF0IGl0Ci0JCQljYXVzZXMgcHJvYmxlbXMgd2l0aCB4bXB5dSB3aGljaCBoYXMgbm8gRlAgZm9ybWF0Ci0JCQljb21wbGV0ZXIuICAqLwotCQkgICAgY2FzZSAnWCc6Ci0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGluZm8pOwotCi0JCSAgICAvKiBGQUxMVEhSVSAqLwotCi0JCSAgICBjYXNlICdBJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjQsIDI0KSkKLQkJCWZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICAgICAgCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCQlmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgICAgICBlbHNlCi0JCQlmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdCJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMTksIDE5KSkKLQkJCWZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgICAgIGVsc2UKLQkJCWZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ0MnOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjIpOwotCQkJcmVnIHw9IEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KSA8PCAyOwotCQkJaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjMsIDIzKSAhPSAwKQotCQkJICBmcHV0X2ZwX3JlZ19yIChyZWcsIGluZm8pOwotCQkJZWxzZQotCQkJICBmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBjYXNlICdpJzoKLQkJICAgICAgewotCQkJaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2onOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2snOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2wnOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjUpOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ20nOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMjApOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2UnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkJZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnNSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81X2xvYWQgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAncyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCi0JCQkJCSAic3IlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE3KSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzciVkIiwgZXh0cmFjdF8zIChpbnNuKSk7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogSGFuZGxlIGNvbXBsZXRlcnMuICAqLwotCQljYXNlICdjJzoKLQkJICBzd2l0Y2ggKCorK3MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICd4JzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgIGluZGV4X2NvbXBsX25hbWVzW0dFVF9DT01QTCAoaW5zbildKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdtJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgIHNob3J0X2xkc3RfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgc2hvcnRfYnl0ZXNfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgY2FzZSAnQyc6Ci0JCSAgICAgIHN3aXRjaCAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjEpKQotCQkJewotCQkJY2FzZSAxOgotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixiYyAiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHNsICIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgICBzd2l0Y2ggKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIxKSkKLQkJCXsKLQkJCWNhc2UgMToKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsY28gIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbyc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG8iKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdnJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsZ2F0ZSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3AnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixsLHB1c2giKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdQJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIscG9wIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbCc6Ci0JCSAgICBjYXNlICdMJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbCIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3cnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgcmVhZF93cml0ZV9uYW1lc1tHRVRfRklFTEQgKGluc24sIDI1LCAyNSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdXJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3InOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMywgMjYpID09IDUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixyIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnWic6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixtICIpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdpJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLGkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd6JzoKLQkJICAgICAgaWYgKCFHRVRfRklFTEQgKGluc24sIDIxLCAyMSkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix6Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJKGluZm8tPnN0cmVhbSwgIiVzIiwgYWRkX2NvbXBsX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAoaW5zbiwgMjAsIDIxKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1knOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCShpbmZvLT5zdHJlYW0sICIsZGMlcyIsIGFkZF9jb21wbF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAgKGluc24sIDIwLCAyMSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd5JzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkoaW5mby0+c3RyZWFtLCAiLGMlcyIsIGFkZF9jb21wbF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAoaW5zbiwgMjAsIDIxKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3YnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdHN2Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRjIik7Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIwLCAyMCkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix0c3YiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdCJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsZGIiKTsKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIwKSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRzdiIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixiIik7Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIwLCAyMCkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix0c3YiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdUJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRjIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUyc6Ci0JCSAgICAgIC8qIEVYVFJEL1cgaGFzIGEgZm9sbG93aW5nIGNvbmRpdGlvbi4gICovCi0JCSAgICAgIGlmICgqKHMgKyAxKSA9PSAnPycpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCSAgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2lnbmVkX3Vuc2lnbmVkX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCQkgICAgKGluc24sIDIxLCAyMSldKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyAiLCBzaWduZWRfdW5zaWduZWRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJCSAgICAgKGluc24sIDIxLCAyMSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdoJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsIG1peF9oYWxmX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgKGluc24sIDE3LCAxNyldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdIJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsIHNhdHVyYXRpb25fbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgIChpbnNuLCAyNCwgMjUpXSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnKic6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJICAoaW5mby0+c3RyZWFtLCAiLCVkJWQlZCVkICIsCi0JCQkgICBHRVRfRklFTEQgKGluc24sIDE3LCAxOCksIEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIxKSwKLQkJCSAgIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDIzKSwgR0VUX0ZJRUxEIChpbnNuLCAyNCwgMjUpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3EnOgotCQkgICAgICB7Ci0JCQlpbnQgbSwgYTsKLQotCQkJbSA9IEdFVF9GSUVMRCAoaW5zbiwgMjgsIDI4KTsKLQkJCWEgPSBHRVRfRklFTEQgKGluc24sIDI5LCAyOSk7Ci0KLQkJCWlmIChtICYmICFhKQotCQkJICBmcHV0c19maWx0ZXJlZCAoIixtYSAiLCBpbmZvKTsKLQkJCWVsc2UgaWYgKG0gJiYgYSkKLQkJCSAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQllbHNlCi0JCQkgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgY2FzZSAnSic6Ci0JCSAgICAgIHsKLQkJCWludCBvcGNvZGUgPSBHRVRfRklFTEQgKGluc24sIDAsIDUpOwotCi0JCQlpZiAob3Bjb2RlID09IDB4MTYgfHwgb3Bjb2RlID09IDB4MWUpCi0JCQkgIHsKLQkJCSAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyOSwgMjkpID09IDApCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYSAiLCBpbmZvKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYiAiLCBpbmZvKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBmcHV0c19maWx0ZXJlZCAoIiAiLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGNhc2UgJ2UnOgotCQkgICAgICB7Ci0JCQlpbnQgb3Bjb2RlID0gR0VUX0ZJRUxEIChpbnNuLCAwLCA1KTsKLQotCQkJaWYgKG9wY29kZSA9PSAweDEzIHx8IG9wY29kZSA9PSAweDFiKQotCQkJICB7Ci0JCQkgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMTgsIDE4KSA9PSAxKQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWEgIiwgaW5mbyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKG9wY29kZSA9PSAweDE3IHx8IG9wY29kZSA9PSAweDFmKQotCQkJICB7Ci0JCQkgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMzEsIDMxKSA9PSAxKQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWEgIiwgaW5mbyk7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgaW5mbyk7Ci0KLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJLyogSGFuZGxlIGNvbmRpdGlvbnMuICAqLwotCQljYXNlICc/JzoKLQkJICB7Ci0JCSAgICBzKys7Ci0JCSAgICBzd2l0Y2ggKCpzKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgJ2YnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgZmxvYXRfY29tcF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAgKGluc24sIDI3LCAzMSldKTsKLQkJCWJyZWFrOwotCi0JCSAgICAgIC8qIHRoZXNlIGZvdXIgY29uZGl0aW9ucyBhcmUgZm9yIHRoZSBzZXQgb2YgaW5zdHJ1Y3Rpb25zCi0JCQkgICB3aGljaCBkaXN0aW5ndWlzaCB0cnVlL2ZhbHNlIGNvbmRpdGlvbnMgYnkgb3Bjb2RlCi0JCQkgICByYXRoZXIgdGhhbiBieSB0aGUgJ2YnIGJpdCAoc2lnaCk6IGNvbWIsIGNvbWliLAotCQkJICAgYWRkYiwgYWRkaWIgKi8KLQkJICAgICAgY2FzZSAndCc6Ci0JCQlmcHV0c19maWx0ZXJlZCAoY29tcGFyZV9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0sCi0JCQkJCWluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ24nOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkJKyBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0sIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ04nOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF82NF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkJKyBHRVRfRklFTEQgKGluc24sIDIsIDIpICogOF0sIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ1EnOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNtcGliX2NvbmRfNjRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSwKLQkJCQkJaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnQCc6Ci0JCQlmcHV0c19maWx0ZXJlZCAoYWRkX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpCi0JCQkJCSsgR0VUX0ZJRUxEIChpbnNuLCA0LCA0KSAqIDhdLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdzJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdTJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGNvbXBhcmVfY29uZF82NF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdhJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGFkZF9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ0EnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgYWRkX2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnZCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCQkJICAgICAgIGFkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgY2FzZSAnVyc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICB3aWRlX2FkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KSArIAotCQkJCQkgICAgICBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0pOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgY2FzZSAnbCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBsb2dpY2FsX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnTCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBsb2dpY2FsX2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAndSc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICB1bml0X2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnVSc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICB1bml0X2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAneSc6Ci0JCSAgICAgIGNhc2UgJ3gnOgotCQkgICAgICBjYXNlICdiJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJICAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkJICAgc2hpZnRfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCldKTsKLQotCQkJLyogSWYgdGhlIG5leHQgY2hhcmFjdGVyIGluIGFyZ3MgaXMgJ24nLCBpdCB3aWxsIGhhbmRsZQotCQkJICAgcHV0dGluZyBvdXQgdGhlIHNwYWNlLiAgKi8KLQkJCWlmIChzWzFdICE9ICduJykKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnWCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBzaGlmdF9jb25kXzY0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ0InOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICBiYl9jb25kXzY0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE2KV0pOwotCi0JCQkvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gYXJncyBpcyAnbicsIGl0IHdpbGwgaGFuZGxlCi0JCQkgICBwdXR0aW5nIG91dCB0aGUgc3BhY2UuICAqLwotCQkJaWYgKHNbMV0gIT0gJ24nKQotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJY2FzZSAnVic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81X3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNXJfc3RvcmUgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnUic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81Ul9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdVJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzEwVV9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdCJzoKLQkJY2FzZSAnUSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81UV9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdpJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzExIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2onOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTQgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnayc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8yMSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICduJzoKLQkJICBpZiAoaW5zbiAmIDB4MikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG4gIik7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ04nOgotCQkgIGlmICgoaW5zbiAmIDB4MjApICYmIHNbMV0pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixuICIpOwotCQkgIGVsc2UgaWYgKGluc24gJiAweDIwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbiIpOwotCQkgIGVsc2UgaWYgKHNbMV0pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICBicmVhazsKLQkJY2FzZSAndyc6Ci0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgOCArIGV4dHJhY3RfMTIgKGluc24pLAotCQkJCQkgICAgICAgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1cnOgotCQkgIC8qIDE3IGJpdCBQQy1yZWxhdGl2ZSBicmFuY2guICAqLwotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyA4IAotCQkJCQkJKyBleHRyYWN0XzE3IChpbnNuKSksCi0JCQkJCSAgICAgICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAneic6Ci0JCSAgLyogMTcgYml0IGRpc3BsYWNlbWVudC4gIFRoaXMgaXMgYW4gb2Zmc2V0IGZyb20gYSByZWdpc3RlcgotCQkgICAgIHNvIGl0IGdldHMgZGlzYXNzc2VtYmxlZCBhcyBqdXN0IGEgbnVtYmVyLCBub3QgYW55IHNvcnQKLQkJICAgICBvZiBhZGRyZXNzLiAgKi8KLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzE3IChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWic6Ci0JCSAgLyogYWRkaWwgJXIxIGltcGxpY2l0IG91dHB1dC4gICovCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXIxIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWSc6Ci0JCSAgLyogYmUsbCAlc3IwLCVyMzEgaW1wbGljaXQgb3V0cHV0LiAgKi8KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlc3IwLCUlcjMxIik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgJ0AnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMCIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJy4nOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICBHRVRfRklFTEQgKGluc24sIDI0LCAyNSkpOwotCQkgIGJyZWFrOwotCQljYXNlICcqJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjUpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnISc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXNhciIpOwotCQkgIGJyZWFrOwotCQljYXNlICdwJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgMzEgLSBHRVRfRklFTEQgKGluc24sIDIyLCAyNikpOwotCQkgIGJyZWFrOwotCQljYXNlICd+JzoKLQkJICB7Ci0JCSAgICBpbnQgbnVtOwotCQkgICAgbnVtID0gR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApIDw8IDU7Ci0JCSAgICBudW0gfD0gR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjYpOwotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIDYzIC0gbnVtKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnUCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3EnOgotCQkgIHsKLQkJICAgIGludCBudW07Ci0JCSAgICBudW0gPSBHRVRfRklFTEQgKGluc24sIDIwLCAyMCkgPDwgNTsKLQkJICAgIG51bSB8PSBHRVRfRklFTEQgKGluc24sIDIyLCAyNik7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgbnVtKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnVCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIDMyIC0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnJSc6Ci0JCSAgewotCQkgICAgaW50IG51bTsKLQkJICAgIG51bSA9IChHRVRfRklFTEQgKGluc24sIDIzLCAyMykgKyAxKSAqIDMyOwotCQkgICAgbnVtIC09IEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKTsKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBudW0pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICd8JzoKLQkJICB7Ci0JCSAgICBpbnQgbnVtOwotCQkgICAgbnVtID0gKEdFVF9GSUVMRCAoaW5zbiwgMTksIDE5KSArIDEpICogMzI7Ci0JCSAgICBudW0gLT0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIG51bSk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJyQnOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDI4KSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0EnOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTgpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnRCc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCA2LCAzMSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd2JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMjMsIDI1KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ08nOgotCQkgIGZwdXRfY29uc3QgKChHRVRfRklFTEQgKGluc24sIDYsMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdvJzoKLQkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDIwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzInOgotCQkgIGZwdXRfY29uc3QgKChHRVRfRklFTEQgKGluc24sIDYsIDIyKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMSc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDIwKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMCc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgMTYsIDIwKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAndSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJWQiLCBHRVRfRklFTEQgKGluc24sIDIzLCAyNSkpOwotCQkgIGJyZWFrOwotCQljYXNlICdGJzoKLQkJICAvKiBpZiBubyBkZXN0aW5hdGlvbiBjb21wbGV0ZXIgYW5kIG5vdCBiZWZvcmUgYSBjb21wbGV0ZXIKLQkJICAgICBmb3IgZmNtcCwgbmVlZCBhIHNwYWNlIGhlcmUgKi8KLQkJICBpZiAoc1sxXSA9PSAnRycgfHwgc1sxXSA9PSAnPycpCi0JCSAgICBmcHV0c19maWx0ZXJlZCAoZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTksIDIwKV0sCi0JCQkJICAgIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgIChpbnNuLCAxOSwgMjApXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0cnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwKLQkJCQkJCQkJICAxNywgMTgpXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0gnOgotCQkgIGlmIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPT0gMSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzWzBdKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIGZsb2F0X2Zvcm1hdF9uYW1lc1sxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0knOgotCQkgIC8qIGlmIG5vIGRlc3RpbmF0aW9uIGNvbXBsZXRlciBhbmQgbm90IGJlZm9yZSBhIGNvbXBsZXRlcgotCQkgICAgIGZvciBmY21wLCBuZWVkIGEgc3BhY2UgaGVyZSAqLwotCQkgIGlmIChzWzFdID09ICc/JykKLQkJICAgIGZwdXRzX2ZpbHRlcmVkIChmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApXSwKLQkJCQkgICAgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgKGluc24sIDIwLCAyMCldKTsKLQkJICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0onOgotICAgICAgICAgICAgICAgICAgZnB1dF9jb25zdCAoZXh0cmFjdF8xNCAoaW5zbiksIGluZm8pOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAnIyc6Ci0JCSAgewotCQkgICAgaW50IHNpZ24gPSBHRVRfRklFTEQgKGluc24sIDMxLCAzMSk7Ci0JCSAgICBpbnQgaW1tMTAgPSBHRVRfRklFTEQgKGluc24sIDE4LCAyNyk7Ci0JCSAgICBpbnQgZGlzcDsKLQotCQkgICAgaWYgKHNpZ24pCi0JCSAgICAgIGRpc3AgPSAoLTEgPDwgMTApIHwgaW1tMTA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGRpc3AgPSBpbW0xMDsKLQotCQkgICAgZGlzcCA8PD0gMzsKLQkJICAgIGZwdXRfY29uc3QgKGRpc3AsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ0snOgotCQljYXNlICdkJzoKLQkJICB7Ci0JCSAgICBpbnQgc2lnbiA9IEdFVF9GSUVMRCAoaW5zbiwgMzEsIDMxKTsKLQkJICAgIGludCBpbW0xMSA9IEdFVF9GSUVMRCAoaW5zbiwgMTgsIDI4KTsKLQkJICAgIGludCBkaXNwOwotCi0JCSAgICBpZiAoc2lnbikKLQkJICAgICAgZGlzcCA9ICgtMSA8PCAxMSkgfCBpbW0xMTsKLQkJICAgIGVsc2UKLQkJICAgICAgZGlzcCA9IGltbTExOwotCi0JCSAgICBkaXNwIDw8PSAyOwotCQkgICAgZnB1dF9jb25zdCAoZGlzcCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJLyogPyE/IEZJWE1FICovCi0JCWNhc2UgJ18nOgotCQljYXNlICd7JzoKLQkJICBmcHV0c19maWx0ZXJlZCAoIkRpc2Fzc2VtYmxlciBib3RjaC5cbiIsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ20nOgotCQkgIHsKLQkJICAgIGludCB5ID0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpOwotCi0JCSAgICBpZiAoeSAhPSAxKQotCQkgICAgICBmcHV0X2NvbnN0ICgoeSBeIDEpIC0gMSwgaW5mbyk7Ci0JCSAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2gnOgotCQkgIHsKLQkJICAgIGludCBjYml0OwotCi0JCSAgICBjYml0ID0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpOwotCi0JCSAgICBpZiAoY2JpdCA+IDApCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVkIiwgY2JpdCAtIDEpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWNhc2UgJz0nOgotCQkgIHsKLQkJICAgIGludCBjb25kID0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCi0JCSAgICBpZiAoY29uZCA9PSAwKQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gMSkKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2MgIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDIpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgicmVqICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSA1KQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoImFjYzggIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDYpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgicmVqOCAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gOSkKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2M2ICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSAxMykKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2M0ICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSAxNykKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2MyICIsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWNhc2UgJ1gnOgotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyA4IAotCQkJCQkJKyBleHRyYWN0XzIyIChpbnNuKSksCi0JCQkJCSAgICAgICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTCc6Ci0JCSAgZnB1dHNfZmlsdGVyZWQgKCIsJXIyIiwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsICpzKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICByZXR1cm4gc2l6ZW9mKGluc24pOwotCX0KLSAgICB9Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyU4eCIsIGluc24pOwotICByZXR1cm4gc2l6ZW9mKGluc24pOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pMzg2LWRpcy5jIGIvb3Bjb2Rlcy9pMzg2LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDE4YjdiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaTM4Ni1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NTkgKzAsMCBAQAotLyogUHJpbnQgaTM4NiBpbnN0cnVjdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwgODksIDkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogODAzODYgaW5zdHJ1Y3Rpb24gcHJpbnRlciBieSBQYWNlIFdpbGxpc3NvbiAocGFjZUBwcmVwLmFpLm1pdC5lZHUpCi0gKiBKdWx5IDE5ODgKLSAqICBtb2RpZmllZCBieSBKb2huIEhhc3NleSAoaGFzc2V5QGRnLXJ0cC5kZy5jb20pCi0gKi8KLQotLyoKLSAqIFRoZSBtYWluIHRhYmxlcyBkZXNjcmliaW5nIHRoZSBpbnN0cnVjdGlvbnMgaXMgZXNzZW50aWFsbHkgYSBjb3B5Ci0gKiBvZiB0aGUgIk9wY29kZSBNYXAiIGNoYXB0ZXIgKEFwcGVuZGl4IEEpIG9mIHRoZSBJbnRlbCA4MDM4NgotICogUHJvZ3JhbW1lcnMgTWFudWFsLiAgVXN1YWxseSwgdGhlcmUgaXMgYSBjYXBpdGFsIGxldHRlciwgZm9sbG93ZWQKLSAqIGJ5IGEgc21hbGwgbGV0dGVyLiAgVGhlIGNhcGl0YWwgbGV0dGVyIHRlbGwgdGhlIGFkZHJlc3NpbmcgbW9kZSwKLSAqIGFuZCB0aGUgc21hbGwgbGV0dGVyIHRlbGxzIGFib3V0IHRoZSBvcGVyYW5kIHNpemUuICBSZWZlciB0bwotICogdGhlIEludGVsIG1hbnVhbCBmb3IgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jZGVmaW5lIE1BWExFTiAyMAotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLSNpZm5kZWYgVU5JWFdBUkVfQ09NUEFUCi0vKiBTZXQgbm9uLXplcm8gZm9yIGJyb2tlbiwgY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMuICBTZXQgdG8gemVybyBmb3IKLSAgIG5vbi1icm9rZW4gb3Bjb2Rlcy4gICovCi0jZGVmaW5lIFVOSVhXQVJFX0NPTVBBVCAxCi0jZW5kaWYKLQotc3RhdGljIGludCBmZXRjaF9kYXRhIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF9ieXRlICopKTsKLQotc3RydWN0IGRpc19wcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotLyogVGhlIG9wY29kZSBmb3IgdGhlIGZ3YWl0IGluc3RydWN0aW9uLCB3aGljaCB3ZSB0cmVhdCBhcyBhIHByZWZpeAotICAgd2hlbiB3ZSBjYW4uICAqLwotI2RlZmluZSBGV0FJVF9PUENPREUgKDB4OWIpCi0KLS8qIEZsYWdzIGZvciB0aGUgcHJlZml4ZXMgZm9yIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgU2VlIGJlbG93LiAgKi8KLXN0YXRpYyBpbnQgcHJlZml4ZXM7Ci0KLS8qIEZsYWdzIGZvciBwcmVmaXhlcyB3aGljaCB3ZSBzb21laG93IGhhbmRsZWQgd2hlbiBwcmludGluZyB0aGUKLSAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIGludCB1c2VkX3ByZWZpeGVzOwotCi0vKiBGbGFncyBzdG9yZWQgaW4gUFJFRklYRVMuICAqLwotI2RlZmluZSBQUkVGSVhfUkVQWiAxCi0jZGVmaW5lIFBSRUZJWF9SRVBOWiAyCi0jZGVmaW5lIFBSRUZJWF9MT0NLIDQKLSNkZWZpbmUgUFJFRklYX0NTIDgKLSNkZWZpbmUgUFJFRklYX1NTIDB4MTAKLSNkZWZpbmUgUFJFRklYX0RTIDB4MjAKLSNkZWZpbmUgUFJFRklYX0VTIDB4NDAKLSNkZWZpbmUgUFJFRklYX0ZTIDB4ODAKLSNkZWZpbmUgUFJFRklYX0dTIDB4MTAwCi0jZGVmaW5lIFBSRUZJWF9EQVRBIDB4MjAwCi0jZGVmaW5lIFBSRUZJWF9BRERSIDB4NDAwCi0jZGVmaW5lIFBSRUZJWF9GV0FJVCAweDgwMAotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgZGlzX3ByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgZGlzX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGRpc19wcml2YXRlICopaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGRpZCBtYW5hZ2UgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSwgdGhlbgotICAgICAgICAgcHJpbnRfaW5zbl9pMzg2IHdpbGwgZG8gc29tZXRoaW5nIHNlbnNpYmxlLiAgT3RoZXJ3aXNlLCBwcmludAotICAgICAgICAgYW4gZXJyb3IuICBXZSBkbyB0aGF0IGhlcmUgYmVjYXVzZSB0aGlzIGlzIHdoZXJlIHdlIGtub3cKLSAgICAgICAgIFNUQVRVUy4gICovCi0gICAgICBpZiAocHJpdi0+bWF4X2ZldGNoZWQgPT0gcHJpdi0+dGhlX2J1ZmZlcikKLQkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotCi0jZGVmaW5lIFhYIE5VTEwsIDAKLQotI2RlZmluZSBFYiBPUF9FLCBiX21vZGUKLSNkZWZpbmUgaW5kaXJFYiBPUF9pbmRpckUsIGJfbW9kZQotI2RlZmluZSBHYiBPUF9HLCBiX21vZGUKLSNkZWZpbmUgRXYgT1BfRSwgdl9tb2RlCi0jZGVmaW5lIEVkIE9QX0UsIGRfbW9kZQotI2RlZmluZSBpbmRpckV2IE9QX2luZGlyRSwgdl9tb2RlCi0jZGVmaW5lIEV3IE9QX0UsIHdfbW9kZQotI2RlZmluZSBNYSBPUF9FLCB2X21vZGUKLSNkZWZpbmUgTSBPUF9FLCAwCQkvKiBsZWEgKi8KLSNkZWZpbmUgTXAgT1BfRSwgMAkJLyogMzIgb3IgNDggYml0IG1lbW9yeSBvcGVyYW5kIGZvciBMRFMsIExFUyBldGMgKi8KLSNkZWZpbmUgR3YgT1BfRywgdl9tb2RlCi0jZGVmaW5lIEd3IE9QX0csIHdfbW9kZQotI2RlZmluZSBSZCBPUF9SZCwgZF9tb2RlCi0jZGVmaW5lIEliIE9QX0ksIGJfbW9kZQotI2RlZmluZSBzSWIgT1Bfc0ksIGJfbW9kZQkvKiBzaWduIGV4dGVuZWQgYnl0ZSAqLwotI2RlZmluZSBJdiBPUF9JLCB2X21vZGUKLSNkZWZpbmUgSXcgT1BfSSwgd19tb2RlCi0jZGVmaW5lIEpiIE9QX0osIGJfbW9kZQotI2RlZmluZSBKdiBPUF9KLCB2X21vZGUKLSNkZWZpbmUgQ2QgT1BfQywgZF9tb2RlCi0jZGVmaW5lIERkIE9QX0QsIGRfbW9kZQotI2RlZmluZSBUZCBPUF9ULCBkX21vZGUKLQotI2RlZmluZSBlQVggT1BfUkVHLCBlQVhfcmVnCi0jZGVmaW5lIGVCWCBPUF9SRUcsIGVCWF9yZWcKLSNkZWZpbmUgZUNYIE9QX1JFRywgZUNYX3JlZwotI2RlZmluZSBlRFggT1BfUkVHLCBlRFhfcmVnCi0jZGVmaW5lIGVTUCBPUF9SRUcsIGVTUF9yZWcKLSNkZWZpbmUgZUJQIE9QX1JFRywgZUJQX3JlZwotI2RlZmluZSBlU0kgT1BfUkVHLCBlU0lfcmVnCi0jZGVmaW5lIGVESSBPUF9SRUcsIGVESV9yZWcKLSNkZWZpbmUgQUwgT1BfUkVHLCBhbF9yZWcKLSNkZWZpbmUgQ0wgT1BfUkVHLCBjbF9yZWcKLSNkZWZpbmUgREwgT1BfUkVHLCBkbF9yZWcKLSNkZWZpbmUgQkwgT1BfUkVHLCBibF9yZWcKLSNkZWZpbmUgQUggT1BfUkVHLCBhaF9yZWcKLSNkZWZpbmUgQ0ggT1BfUkVHLCBjaF9yZWcKLSNkZWZpbmUgREggT1BfUkVHLCBkaF9yZWcKLSNkZWZpbmUgQkggT1BfUkVHLCBiaF9yZWcKLSNkZWZpbmUgQVggT1BfUkVHLCBheF9yZWcKLSNkZWZpbmUgRFggT1BfUkVHLCBkeF9yZWcKLSNkZWZpbmUgaW5kaXJEWCBPUF9SRUcsIGluZGlyX2R4X3JlZwotCi0jZGVmaW5lIFN3IE9QX1NFRywgd19tb2RlCi0jZGVmaW5lIEFwIE9QX0RJUiwgMAotI2RlZmluZSBPYiBPUF9PRkYsIGJfbW9kZQotI2RlZmluZSBPdiBPUF9PRkYsIHZfbW9kZQotI2RlZmluZSBYYiBPUF9EU3JlZywgZVNJX3JlZwotI2RlZmluZSBYdiBPUF9EU3JlZywgZVNJX3JlZwotI2RlZmluZSBZYiBPUF9FU3JlZywgZURJX3JlZwotI2RlZmluZSBZdiBPUF9FU3JlZywgZURJX3JlZwotI2RlZmluZSBEU0JYIE9QX0RTcmVnLCBlQlhfcmVnCi0KLSNkZWZpbmUgZXMgT1BfUkVHLCBlc19yZWcKLSNkZWZpbmUgc3MgT1BfUkVHLCBzc19yZWcKLSNkZWZpbmUgY3MgT1BfUkVHLCBjc19yZWcKLSNkZWZpbmUgZHMgT1BfUkVHLCBkc19yZWcKLSNkZWZpbmUgZnMgT1BfUkVHLCBmc19yZWcKLSNkZWZpbmUgZ3MgT1BfUkVHLCBnc19yZWcKLQotI2RlZmluZSBNWCBPUF9NTVgsIDAKLSNkZWZpbmUgWE0gT1BfWE1NLCAwCi0jZGVmaW5lIEVNIE9QX0VNLCB2X21vZGUKLSNkZWZpbmUgRVggT1BfRVgsIHZfbW9kZQotI2RlZmluZSBNUyBPUF9NUywgdl9tb2RlCi0jZGVmaW5lIE5vbmUgT1BfRSwgMAotI2RlZmluZSBPUFNVRiBPUF8zRE5vd1N1ZmZpeCwgMAotI2RlZmluZSBPUFNJTUQgT1BfU0lNRF9TdWZmaXgsIDAKLQotLyogYml0cyBpbiBzaXplZmxhZyAqLwotI2lmIDAgLyogbGVhdmUgdW5kZWZpbmVkIHVudGlsIHNvbWVvbmUgYWRkcyB0aGUgZXh0cmEgZmxhZyB0byBvYmpkdW1wICovCi0jZGVmaW5lIFNVRkZJWF9BTFdBWVMgNAotI2VuZGlmCi0jZGVmaW5lIEFGTEFHIDIKLSNkZWZpbmUgREZMQUcgMQotCi10eXBlZGVmIHZvaWQgKCpvcF9ydG4pIFBBUkFNUyAoKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKSk7Ci0KLXN0YXRpYyB2b2lkIE9QX0UgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0cgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0kgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX2luZGlyRSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1Bfc0kgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1JFRyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfSiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRElSIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9PRkYgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0VTcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9EU3JlZyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU0VHIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9DIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9EIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9UIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9SZCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU1QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1NUaSAgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX01NWCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfWE1NIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9FTSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRVggUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX01TIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF8zRE5vd1N1ZmZpeCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU0lNRF9TdWZmaXggUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIFNJTURfRml4dXAgUEFSQU1TICgoaW50LCBpbnQpKTsKLQotc3RhdGljIHZvaWQgYXBwZW5kX3NlZyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzZXRfb3AgUEFSQU1TICgodW5zaWduZWQgaW50IG9wKSk7Ci1zdGF0aWMgdm9pZCBwdXRvcCBQQVJBTVMgKChjb25zdCBjaGFyICp0ZW1wbGF0ZSwgaW50IHNpemVmbGFnKSk7Ci1zdGF0aWMgdm9pZCBkb2Zsb2F0IFBBUkFNUyAoKGludCBzaXplZmxhZykpOwotc3RhdGljIGludCBnZXQxNiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldDMyIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNrcHJlZml4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpwcmVmaXhfbmFtZSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgcHRyX3JlZyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgQmFkT3AgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIGJfbW9kZSAxCi0jZGVmaW5lIHZfbW9kZSAyCi0jZGVmaW5lIHdfbW9kZSAzCi0jZGVmaW5lIGRfbW9kZSA0Ci0jZGVmaW5lIHhfbW9kZSA1Ci0KLSNkZWZpbmUgZXNfcmVnIDEwMAotI2RlZmluZSBjc19yZWcgMTAxCi0jZGVmaW5lIHNzX3JlZyAxMDIKLSNkZWZpbmUgZHNfcmVnIDEwMwotI2RlZmluZSBmc19yZWcgMTA0Ci0jZGVmaW5lIGdzX3JlZyAxMDUKLQotI2RlZmluZSBlQVhfcmVnIDEwOAotI2RlZmluZSBlQ1hfcmVnIDEwOQotI2RlZmluZSBlRFhfcmVnIDExMAotI2RlZmluZSBlQlhfcmVnIDExMQotI2RlZmluZSBlU1BfcmVnIDExMgotI2RlZmluZSBlQlBfcmVnIDExMwotI2RlZmluZSBlU0lfcmVnIDExNAotI2RlZmluZSBlRElfcmVnIDExNQotCi0jZGVmaW5lIGFsX3JlZyAxMTYKLSNkZWZpbmUgY2xfcmVnIDExNwotI2RlZmluZSBkbF9yZWcgMTE4Ci0jZGVmaW5lIGJsX3JlZyAxMTkKLSNkZWZpbmUgYWhfcmVnIDEyMAotI2RlZmluZSBjaF9yZWcgMTIxCi0jZGVmaW5lIGRoX3JlZyAxMjIKLSNkZWZpbmUgYmhfcmVnIDEyMwotCi0jZGVmaW5lIGF4X3JlZyAxMjQKLSNkZWZpbmUgY3hfcmVnIDEyNQotI2RlZmluZSBkeF9yZWcgMTI2Ci0jZGVmaW5lIGJ4X3JlZyAxMjcKLSNkZWZpbmUgc3BfcmVnIDEyOAotI2RlZmluZSBicF9yZWcgMTI5Ci0jZGVmaW5lIHNpX3JlZyAxMzAKLSNkZWZpbmUgZGlfcmVnIDEzMQotCi0jZGVmaW5lIGluZGlyX2R4X3JlZyAxNTAKLQotI2RlZmluZSBVU0VfR1JPVVBTIDEKLSNkZWZpbmUgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIDIKLQotI2RlZmluZSBHUlAxYiBOVUxMLCBOVUxMLCAwLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDFTIE5VTEwsIE5VTEwsIDEsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMVNzIE5VTEwsIE5VTEwsIDIsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMmIgTlVMTCwgTlVMTCwgMywgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAyUyBOVUxMLCBOVUxMLCA0LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDJiX29uZSBOVUxMLCBOVUxMLCA1LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDJTX29uZSBOVUxMLCBOVUxMLCA2LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDJiX2NsIE5VTEwsIE5VTEwsIDcsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMlNfY2wgTlVMTCwgTlVMTCwgOCwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAzYiBOVUxMLCBOVUxMLCA5LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDNTIE5VTEwsIE5VTEwsIDEwLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDQgIE5VTEwsIE5VTEwsIDExLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDUgIE5VTEwsIE5VTEwsIDEyLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDYgIE5VTEwsIE5VTEwsIDEzLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDcgTlVMTCwgTlVMTCwgMTQsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQOCBOVUxMLCBOVUxMLCAxNSwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlA5IE5VTEwsIE5VTEwsIDE2LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDEwIE5VTEwsIE5VTEwsIDE3LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDExIE5VTEwsIE5VTEwsIDE4LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDEyIE5VTEwsIE5VTEwsIDE5LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDEzIE5VTEwsIE5VTEwsIDIwLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDE0IE5VTEwsIE5VTEwsIDIxLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUEFNRCBOVUxMLCBOVUxMLCAyMiwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotCi0jZGVmaW5lIFBSRUdSUDAgTlVMTCwgTlVMTCwgMCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDEgTlVMTCwgTlVMTCwgMSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDIgTlVMTCwgTlVMTCwgMiwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDMgTlVMTCwgTlVMTCwgMywgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDQgTlVMTCwgTlVMTCwgNCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDUgTlVMTCwgTlVMTCwgNSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDYgTlVMTCwgTlVMTCwgNiwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDcgTlVMTCwgTlVMTCwgNywgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDggTlVMTCwgTlVMTCwgOCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDkgTlVMTCwgTlVMTCwgOSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDEwIE5VTEwsIE5VTEwsIDEwLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMTEgTlVMTCwgTlVMTCwgMTEsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSwgTlVMTCwgMAotI2RlZmluZSBQUkVHUlAxMiBOVUxMLCBOVUxMLCAxMiwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDEzIE5VTEwsIE5VTEwsIDEzLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMTQgTlVMTCwgTlVMTCwgMTQsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSwgTlVMTCwgMAotCi0jZGVmaW5lIEZMT0FUQ09ERSA1MAotI2RlZmluZSBGTE9BVCBOVUxMLCBOVUxMLCBGTE9BVENPREUsIE5VTEwsIDAsIE5VTEwsIDAKLQotc3RydWN0IGRpczM4NiB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIG9wX3J0biBvcDE7Ci0gIGludCBieXRlbW9kZTE7Ci0gIG9wX3J0biBvcDI7Ci0gIGludCBieXRlbW9kZTI7Ci0gIG9wX3J0biBvcDM7Ci0gIGludCBieXRlbW9kZTM7Ci19OwotCi0vKiBVcHBlciBjYXNlIGxldHRlcnMgaW4gdGhlIGluc3RydWN0aW9uIG5hbWVzIGhlcmUgYXJlIG1hY3Jvcy4KLSAgICdBJyA9PiBwcmludCAnYicgaWYgbm8gcmVnaXN0ZXIgb3BlcmFuZHMgb3Igc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnQicgPT4gcHJpbnQgJ2InIGlmIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ0UnID0+IHByaW50ICdlJyBpZiAzMi1iaXQgZm9ybSBvZiBqY3h6Ci0gICAnTCcgPT4gcHJpbnQgJ2wnIGlmIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ04nID0+IHByaW50ICduJyBpZiBpbnN0cnVjdGlvbiBoYXMgbm8gd2FpdCAicHJlZml4IgotICAgJ1AnID0+IHByaW50ICd3JyBvciAnbCcgaWYgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wZXJhbmQgc2l6ZSBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdRJyA9PiBwcmludCAndycgb3IgJ2wnIGlmIG5vIHJlZ2lzdGVyIG9wZXJhbmRzIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ1InID0+IHByaW50ICd3JyBvciAnbCcgKCJ3ZCIgb3IgImRxIiBpbiBpbnRlbCBtb2RlKQotICAgJ1MnID0+IHByaW50ICd3JyBvciAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnVycgPT4gcHJpbnQgJ2InIG9yICd3JyAoInciIG9yICJkZSIgaW4gaW50ZWwgbW9kZSkKLSovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl9hdHRbXSA9IHsKLSAgLyogMDAgKi8KLSAgeyAiYWRkQiIsCUViLCBHYiwgWFggfSwKLSAgeyAiYWRkUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAiYWRkQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYWRkUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiYWRkQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiYWRkUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2hQIiwJZXMsIFhYLCBYWCB9LAotICB7ICJwb3BQIiwJZXMsIFhYLCBYWCB9LAotICAvKiAwOCAqLwotICB7ICJvckIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgIm9yUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAib3JCIiwJR2IsIEViLCBYWCB9LAotICB7ICJvclMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgIm9yQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAib3JTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAicHVzaFAiLAljcywgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkvKiAweDBmIGV4dGVuZGVkIG9wY29kZSBlc2NhcGUgKi8KLSAgLyogMTAgKi8KLSAgeyAiYWRjQiIsCUViLCBHYiwgWFggfSwKLSAgeyAiYWRjUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAiYWRjQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYWRjUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiYWRjQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiYWRjUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2hQIiwJc3MsIFhYLCBYWCB9LAotICB7ICJwb3BQIiwJc3MsIFhYLCBYWCB9LAotICAvKiAxOCAqLwotICB7ICJzYmJCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJzYmJTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJzYmJCIiwJR2IsIEViLCBYWCB9LAotICB7ICJzYmJTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJzYmJCIiwJQUwsIEliLCBYWCB9LAotICB7ICJzYmJTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAicHVzaFAiLAlkcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLAlkcywgWFgsIFhYIH0sCi0gIC8qIDIwICovCi0gIHsgImFuZEIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgImFuZFMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFuZEIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgImFuZFMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgImFuZEIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFuZFMiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgRVMgcHJlZml4ICovCi0gIHsgImRhYSIsCVhYLCBYWCwgWFggfSwKLSAgLyogMjggKi8KLSAgeyAic3ViQiIsCUViLCBHYiwgWFggfSwKLSAgeyAic3ViUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAic3ViQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAic3ViUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAic3ViQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAic3ViUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBDUyBwcmVmaXggKi8KLSAgeyAiZGFzIiwJWFgsIFhYLCBYWCB9LAotICAvKiAzMCAqLwotICB7ICJ4b3JCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJ4b3JTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJ4b3JCIiwJR2IsIEViLCBYWCB9LAotICB7ICJ4b3JTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJ4b3JCIiwJQUwsIEliLCBYWCB9LAotICB7ICJ4b3JTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogU0VHIFNTIHByZWZpeCAqLwotICB7ICJhYWEiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIDM4ICovCi0gIHsgImNtcEIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgImNtcFMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImNtcEIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgImNtcFMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgImNtcEIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImNtcFMiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgRFMgcHJlZml4ICovCi0gIHsgImFhcyIsCVhYLCBYWCwgWFggfSwKLSAgLyogNDAgKi8KLSAgeyAiaW5jUyIsCWVBWCwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJpbmNTIiwJZURYLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVCWCwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllU1AsIFhYLCBYWCB9LAotICB7ICJpbmNTIiwJZUJQLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVTSSwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllREksIFhYLCBYWCB9LAotICAvKiA0OCAqLwotICB7ICJkZWNTIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgImRlY1MiLAllRFgsIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgImRlY1MiLAllQlAsIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDUwICovCi0gIHsgInB1c2hTIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgInB1c2hTIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllU1AsIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgInB1c2hTIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllREksIFhYLCBYWCB9LAotICAvKiA1OCAqLwotICB7ICJwb3BTIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInBvcFMiLAllRFgsIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInBvcFMiLAllQlAsIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDYwICovCi0gIHsgInB1c2hhUCIsCVhYLCBYWCwgWFggfSwKLSAgeyAicG9wYVAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImJvdW5kUyIsCUd2LCBNYSwgWFggfSwKLSAgeyAiYXJwbCIsCUV3LCBHdywgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogc2VnIGZzICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHNlZyBncyAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBvcCBzaXplIHByZWZpeCAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBhZHIgc2l6ZSBwcmVmaXggKi8KLSAgLyogNjggKi8KLSAgeyAicHVzaFAiLAlJdiwgWFgsIFhYIH0sCQkvKiAzODYgYm9vayB3cm9uZyAqLwotICB7ICJpbXVsUyIsCUd2LCBFdiwgSXYgfSwKLSAgeyAicHVzaFAiLAlzSWIsIFhYLCBYWCB9LAkvKiBwdXNoIG9mIGJ5dGUgcmVhbGx5IHB1c2hlcyAyIG9yIDQgYnl0ZXMgKi8KLSAgeyAiaW11bFMiLAlHdiwgRXYsIHNJYiB9LAotICB7ICJpbnNiIiwJWWIsIGluZGlyRFgsIFhYIH0sCi0gIHsgImluc1IiLAlZdiwgaW5kaXJEWCwgWFggfSwKLSAgeyAib3V0c2IiLAlpbmRpckRYLCBYYiwgWFggfSwKLSAgeyAib3V0c1IiLAlpbmRpckRYLCBYdiwgWFggfSwKLSAgLyogNzAgKi8KLSAgeyAiam8iLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpubyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamIiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImphZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpuZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamJlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYSIsCUpiLCBYWCwgWFggfSwKLSAgLyogNzggKi8KLSAgeyAianMiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpucyIsCUpiLCBYWCwgWFggfSwKLSAgeyAianAiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpucCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamwiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpnZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamxlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqZyIsCUpiLCBYWCwgWFggfSwKLSAgLyogODAgKi8KLSAgeyBHUlAxYiB9LAotICB7IEdSUDFTIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7IEdSUDFTcyB9LAotICB7ICJ0ZXN0QiIsCUViLCBHYiwgWFggfSwKLSAgeyAidGVzdFMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInhjaGdCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJ4Y2hnUyIsCUV2LCBHdiwgWFggfSwKLSAgLyogODggKi8KLSAgeyAibW92QiIsCUViLCBHYiwgWFggfSwKLSAgeyAibW92UyIsCUV2LCBHdiwgWFggfSwKLSAgeyAibW92QiIsCUdiLCBFYiwgWFggfSwKLSAgeyAibW92UyIsCUd2LCBFdiwgWFggfSwKLSAgeyAibW92USIsCUV2LCBTdywgWFggfSwKLSAgeyAibGVhUyIsCUd2LCBNLCBYWCB9LAotICB7ICJtb3ZRIiwJU3csIEV2LCBYWCB9LAotICB7ICJwb3BRIiwJRXYsIFhYLCBYWCB9LAotICAvKiA5MCAqLwotICB7ICJub3AiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInhjaGdTIiwJZUNYLCBlQVgsIFhYIH0sCi0gIHsgInhjaGdTIiwJZURYLCBlQVgsIFhYIH0sCi0gIHsgInhjaGdTIiwJZUJYLCBlQVgsIFhYIH0sCi0gIHsgInhjaGdTIiwJZVNQLCBlQVgsIFhYIH0sCi0gIHsgInhjaGdTIiwJZUJQLCBlQVgsIFhYIH0sCi0gIHsgInhjaGdTIiwJZVNJLCBlQVgsIFhYIH0sCi0gIHsgInhjaGdTIiwJZURJLCBlQVgsIFhYIH0sCi0gIC8qIDk4ICovCi0gIHsgImNXdFIiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNSdGQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxjYWxsUCIsCUFwLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkvKiBmd2FpdCAqLwotICB7ICJwdXNoZlAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInBvcGZQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzYWhmIiwJWFgsIFhYLCBYWCB9LAotICB7ICJsYWhmIiwJWFgsIFhYLCBYWCB9LAotICAvKiBhMCAqLwotICB7ICJtb3ZCIiwJQUwsIE9iLCBYWCB9LAotICB7ICJtb3ZTIiwJZUFYLCBPdiwgWFggfSwKLSAgeyAibW92QiIsCU9iLCBBTCwgWFggfSwKLSAgeyAibW92UyIsCU92LCBlQVgsIFhYIH0sCi0gIHsgIm1vdnNiIiwJWWIsIFhiLCBYWCB9LAotICB7ICJtb3ZzUiIsCVl2LCBYdiwgWFggfSwKLSAgeyAiY21wc2IiLAlYYiwgWWIsIFhYIH0sCi0gIHsgImNtcHNSIiwJWHYsIFl2LCBYWCB9LAotICAvKiBhOCAqLwotICB7ICJ0ZXN0QiIsCUFMLCBJYiwgWFggfSwKLSAgeyAidGVzdFMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJzdG9zQiIsCVliLCBBTCwgWFggfSwKLSAgeyAic3Rvc1MiLAlZdiwgZUFYLCBYWCB9LAotICB7ICJsb2RzQiIsCUFMLCBYYiwgWFggfSwKLSAgeyAibG9kc1MiLAllQVgsIFh2LCBYWCB9LAotICB7ICJzY2FzQiIsCUFMLCBZYiwgWFggfSwKLSAgeyAic2Nhc1MiLAllQVgsIFl2LCBYWCB9LAotICAvKiBiMCAqLwotICB7ICJtb3ZCIiwJQUwsIEliLCBYWCB9LAotICB7ICJtb3ZCIiwJQ0wsIEliLCBYWCB9LAotICB7ICJtb3ZCIiwJREwsIEliLCBYWCB9LAotICB7ICJtb3ZCIiwJQkwsIEliLCBYWCB9LAotICB7ICJtb3ZCIiwJQUgsIEliLCBYWCB9LAotICB7ICJtb3ZCIiwJQ0gsIEliLCBYWCB9LAotICB7ICJtb3ZCIiwJREgsIEliLCBYWCB9LAotICB7ICJtb3ZCIiwJQkgsIEliLCBYWCB9LAotICAvKiBiOCAqLwotICB7ICJtb3ZTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVDWCwgSXYsIFhYIH0sCi0gIHsgIm1vdlMiLAllRFgsIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZUJYLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVTUCwgSXYsIFhYIH0sCi0gIHsgIm1vdlMiLAllQlAsIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZVNJLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVESSwgSXYsIFhYIH0sCi0gIC8qIGMwICovCi0gIHsgR1JQMmIgfSwKLSAgeyBHUlAyUyB9LAotICB7ICJyZXRQIiwJSXcsIFhYLCBYWCB9LAotICB7ICJyZXRQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJsZXNTIiwJR3YsIE1wLCBYWCB9LAotICB7ICJsZHNTIiwJR3YsIE1wLCBYWCB9LAotICB7ICJtb3ZBIiwJRWIsIEliLCBYWCB9LAotICB7ICJtb3ZRIiwJRXYsIEl2LCBYWCB9LAotICAvKiBjOCAqLwotICB7ICJlbnRlclAiLAlJdywgSWIsIFhYIH0sCi0gIHsgImxlYXZlUCIsCVhYLCBYWCwgWFggfSwKLSAgeyAibHJldFAiLAlJdywgWFgsIFhYIH0sCi0gIHsgImxyZXRQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJpbnQzIiwJWFgsIFhYLCBYWCB9LAotICB7ICJpbnQiLAlJYiwgWFgsIFhYIH0sCi0gIHsgImludG8iLAlYWCwgWFgsIFhYfSwKLSAgeyAiaXJldFAiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIGQwICovCi0gIHsgR1JQMmJfb25lIH0sCi0gIHsgR1JQMlNfb25lIH0sCi0gIHsgR1JQMmJfY2wgfSwKLSAgeyBHUlAyU19jbCB9LAotICB7ICJhYW0iLAlzSWIsIFhYLCBYWCB9LAotICB7ICJhYWQiLAlzSWIsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgeyAieGxhdCIsCURTQlgsIFhYLCBYWCB9LAotICAvKiBkOCAqLwotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgLyogZTAgKi8KLSAgeyAibG9vcG5lIiwJSmIsIFhYLCBYWCB9LAotICB7ICJsb29wZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAibG9vcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiakVjeHoiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImluQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiaW5TIiwJZUFYLCBJYiwgWFggfSwKLSAgeyAib3V0QiIsCUliLCBBTCwgWFggfSwKLSAgeyAib3V0UyIsCUliLCBlQVgsIFhYIH0sCi0gIC8qIGU4ICovCi0gIHsgImNhbGxQIiwJSnYsIFhYLCBYWCB9LAotICB7ICJqbXBQIiwJSnYsIFhYLCBYWCB9LAotICB7ICJsam1wUCIsCUFwLCBYWCwgWFggfSwKLSAgeyAiam1wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJpbkIiLAlBTCwgaW5kaXJEWCwgWFggfSwKLSAgeyAiaW5TIiwJZUFYLCBpbmRpckRYLCBYWCB9LAotICB7ICJvdXRCIiwJaW5kaXJEWCwgQUwsIFhYIH0sCi0gIHsgIm91dFMiLAlpbmRpckRYLCBlQVgsIFhYIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIGxvY2sgcHJlZml4ICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiByZXBuZSAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiByZXB6ICovCi0gIHsgImhsdCIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY21jIiwJWFgsIFhYLCBYWCB9LAotICB7IEdSUDNiIH0sCi0gIHsgR1JQM1MgfSwKLSAgLyogZjggKi8KLSAgeyAiY2xjIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzdGMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNsaSIsCVhYLCBYWCwgWFggfSwKLSAgeyAic3RpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJjbGQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInN0ZCIsCVhYLCBYWCwgWFggfSwKLSAgeyBHUlA0IH0sCi0gIHsgR1JQNSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X2ludGVsW10gPSB7Ci0gIC8qIDAwICovCi0gIHsgImFkZCIsCUViLCBHYiwgWFggfSwKLSAgeyAiYWRkIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhZGQiLAlHYiwgRWIsIFhYIH0sCi0gIHsgImFkZCIsCUd2LCBFdiwgWFggfSwKLSAgeyAiYWRkIiwJQUwsIEliLCBYWCB9LAotICB7ICJhZGQiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoIiwJZXMsIFhYLCBYWCB9LAotICB7ICJwb3AiLAllcywgWFgsIFhYIH0sCi0gIC8qIDA4ICovCi0gIHsgIm9yIiwJRWIsIEdiLCBYWCB9LAotICB7ICJvciIsCUV2LCBHdiwgWFggfSwKLSAgeyAib3IiLAlHYiwgRWIsIFhYIH0sCi0gIHsgIm9yIiwJR3YsIEV2LCBYWCB9LAotICB7ICJvciIsCUFMLCBJYiwgWFggfSwKLSAgeyAib3IiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoIiwJY3MsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJLyogMHgwZiBleHRlbmRlZCBvcGNvZGUgZXNjYXBlICovCi0gIC8qIDEwICovCi0gIHsgImFkYyIsCUViLCBHYiwgWFggfSwKLSAgeyAiYWRjIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhZGMiLAlHYiwgRWIsIFhYIH0sCi0gIHsgImFkYyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiYWRjIiwJQUwsIEliLCBYWCB9LAotICB7ICJhZGMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoIiwJc3MsIFhYLCBYWCB9LAotICB7ICJwb3AiLAlzcywgWFgsIFhYIH0sCi0gIC8qIDE4ICovCi0gIHsgInNiYiIsCUViLCBHYiwgWFggfSwKLSAgeyAic2JiIiwJRXYsIEd2LCBYWCB9LAotICB7ICJzYmIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInNiYiIsCUd2LCBFdiwgWFggfSwKLSAgeyAic2JiIiwJQUwsIEliLCBYWCB9LAotICB7ICJzYmIiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoIiwJZHMsIFhYLCBYWCB9LAotICB7ICJwb3AiLAlkcywgWFgsIFhYIH0sCi0gIC8qIDIwICovCi0gIHsgImFuZCIsCUViLCBHYiwgWFggfSwKLSAgeyAiYW5kIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhbmQiLAlHYiwgRWIsIFhYIH0sCi0gIHsgImFuZCIsCUd2LCBFdiwgWFggfSwKLSAgeyAiYW5kIiwJQUwsIEliLCBYWCB9LAotICB7ICJhbmQiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgRVMgcHJlZml4ICovCi0gIHsgImRhYSIsCVhYLCBYWCwgWFggfSwKLSAgLyogMjggKi8KLSAgeyAic3ViIiwJRWIsIEdiLCBYWCB9LAotICB7ICJzdWIiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInN1YiIsCUdiLCBFYiwgWFggfSwKLSAgeyAic3ViIiwJR3YsIEV2LCBYWCB9LAotICB7ICJzdWIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInN1YiIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBDUyBwcmVmaXggKi8KLSAgeyAiZGFzIiwJWFgsIFhYLCBYWCB9LAotICAvKiAzMCAqLwotICB7ICJ4b3IiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInhvciIsCUV2LCBHdiwgWFggfSwKLSAgeyAieG9yIiwJR2IsIEViLCBYWCB9LAotICB7ICJ4b3IiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInhvciIsCUFMLCBJYiwgWFggfSwKLSAgeyAieG9yIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogU0VHIFNTIHByZWZpeCAqLwotICB7ICJhYWEiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIDM4ICovCi0gIHsgImNtcCIsCUViLCBHYiwgWFggfSwKLSAgeyAiY21wIiwJRXYsIEd2LCBYWCB9LAotICB7ICJjbXAiLAlHYiwgRWIsIFhYIH0sCi0gIHsgImNtcCIsCUd2LCBFdiwgWFggfSwKLSAgeyAiY21wIiwJQUwsIEliLCBYWCB9LAotICB7ICJjbXAiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgRFMgcHJlZml4ICovCi0gIHsgImFhcyIsCVhYLCBYWCwgWFggfSwKLSAgLyogNDAgKi8KLSAgeyAiaW5jIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAiaW5jIiwJZUNYLCBYWCwgWFggfSwKLSAgeyAiaW5jIiwJZURYLCBYWCwgWFggfSwKLSAgeyAiaW5jIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAiaW5jIiwJZVNQLCBYWCwgWFggfSwKLSAgeyAiaW5jIiwJZUJQLCBYWCwgWFggfSwKLSAgeyAiaW5jIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAiaW5jIiwJZURJLCBYWCwgWFggfSwKLSAgLyogNDggKi8KLSAgeyAiZGVjIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAiZGVjIiwJZUNYLCBYWCwgWFggfSwKLSAgeyAiZGVjIiwJZURYLCBYWCwgWFggfSwKLSAgeyAiZGVjIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAiZGVjIiwJZVNQLCBYWCwgWFggfSwKLSAgeyAiZGVjIiwJZUJQLCBYWCwgWFggfSwKLSAgeyAiZGVjIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAiZGVjIiwJZURJLCBYWCwgWFggfSwKLSAgLyogNTAgKi8KLSAgeyAicHVzaCIsCWVBWCwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllQ1gsIFhYLCBYWCB9LAotICB7ICJwdXNoIiwJZURYLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVCWCwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllU1AsIFhYLCBYWCB9LAotICB7ICJwdXNoIiwJZUJQLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVTSSwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllREksIFhYLCBYWCB9LAotICAvKiA1OCAqLwotICB7ICJwb3AiLAllQVgsIFhYLCBYWCB9LAotICB7ICJwb3AiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJwb3AiLAllRFgsIFhYLCBYWCB9LAotICB7ICJwb3AiLAllQlgsIFhYLCBYWCB9LAotICB7ICJwb3AiLAllU1AsIFhYLCBYWCB9LAotICB7ICJwb3AiLAllQlAsIFhYLCBYWCB9LAotICB7ICJwb3AiLAllU0ksIFhYLCBYWCB9LAotICB7ICJwb3AiLAllREksIFhYLCBYWCB9LAotICAvKiA2MCAqLwotICB7ICJwdXNoYSIsCVhYLCBYWCwgWFggfSwKLSAgeyAicG9wYSIsCVhYLCBYWCwgWFggfSwKLSAgeyAiYm91bmQiLAlHdiwgTWEsIFhYIH0sCi0gIHsgImFycGwiLAlFdywgR3csIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHNlZyBmcyAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBzZWcgZ3MgKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogb3Agc2l6ZSBwcmVmaXggKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogYWRyIHNpemUgcHJlZml4ICovCi0gIC8qIDY4ICovCi0gIHsgInB1c2giLAlJdiwgWFgsIFhYIH0sCQkvKiAzODYgYm9vayB3cm9uZyAqLwotICB7ICJpbXVsIiwJR3YsIEV2LCBJdiB9LAotICB7ICJwdXNoIiwJc0liLCBYWCwgWFggfSwJLyogcHVzaCBvZiBieXRlIHJlYWxseSBwdXNoZXMgMiBvciA0IGJ5dGVzICovCi0gIHsgImltdWwiLAlHdiwgRXYsIHNJYiB9LAotICB7ICJpbnMiLAlZYiwgaW5kaXJEWCwgWFggfSwKLSAgeyAiaW5zIiwJWXYsIGluZGlyRFgsIFhYIH0sCi0gIHsgIm91dHMiLAlpbmRpckRYLCBYYiwgWFggfSwKLSAgeyAib3V0cyIsCWluZGlyRFgsIFh2LCBYWCB9LAotICAvKiA3MCAqLwotICB7ICJqbyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5vIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamFlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5lIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImphIiwJSmIsIFhYLCBYWCB9LAotICAvKiA3OCAqLwotICB7ICJqcyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5zIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamdlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbGUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpnIiwJSmIsIFhYLCBYWCB9LAotICAvKiA4MCAqLwotICB7IEdSUDFiIH0sCi0gIHsgR1JQMVMgfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgR1JQMVNzIH0sCi0gIHsgInRlc3QiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInRlc3QiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInhjaGciLAlFYiwgR2IsIFhYIH0sCi0gIHsgInhjaGciLAlFdiwgR3YsIFhYIH0sCi0gIC8qIDg4ICovCi0gIHsgIm1vdiIsCUViLCBHYiwgWFggfSwKLSAgeyAibW92IiwJRXYsIEd2LCBYWCB9LAotICB7ICJtb3YiLAlHYiwgRWIsIFhYIH0sCi0gIHsgIm1vdiIsCUd2LCBFdiwgWFggfSwKLSAgeyAibW92IiwJRXYsIFN3LCBYWCB9LAotICB7ICJsZWEiLAlHdiwgTSwgWFggfSwKLSAgeyAibW92IiwJU3csIEV2LCBYWCB9LAotICB7ICJwb3AiLAlFdiwgWFgsIFhYIH0sCi0gIC8qIDkwICovCi0gIHsgIm5vcCIsCVhYLCBYWCwgWFggfSwKLSAgeyAieGNoZyIsCWVDWCwgZUFYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZURYLCBlQVgsIFhYIH0sCi0gIHsgInhjaGciLAllQlgsIGVBWCwgWFggfSwKLSAgeyAieGNoZyIsCWVTUCwgZUFYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZUJQLCBlQVgsIFhYIH0sCi0gIHsgInhjaGciLAllU0ksIGVBWCwgWFggfSwKLSAgeyAieGNoZyIsCWVESSwgZUFYLCBYWCB9LAotICAvKiA5OCAqLwotICB7ICJjVyIsCVhYLCBYWCwgWFggfSwJCS8qIGN3ZGUgYW5kIGNidyAqLwotICB7ICJjUiIsCVhYLCBYWCwgWFggfSwJCS8qIGNkcSBhbmQgY3dkICovCi0gIHsgImxjYWxsIiwJQXAsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCS8qIGZ3YWl0ICovCi0gIHsgInB1c2hmIiwJWFgsIFhYLCBYWCB9LAotICB7ICJwb3BmIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzYWhmIiwJWFgsIFhYLCBYWCB9LAotICB7ICJsYWhmIiwJWFgsIFhYLCBYWCB9LAotICAvKiBhMCAqLwotICB7ICJtb3YiLAlBTCwgT2IsIFhYIH0sCi0gIHsgIm1vdiIsCWVBWCwgT3YsIFhYIH0sCi0gIHsgIm1vdiIsCU9iLCBBTCwgWFggfSwKLSAgeyAibW92IiwJT3YsIGVBWCwgWFggfSwKLSAgeyAibW92cyIsCVliLCBYYiwgWFggfSwKLSAgeyAibW92cyIsCVl2LCBYdiwgWFggfSwKLSAgeyAiY21wcyIsCVhiLCBZYiwgWFggfSwKLSAgeyAiY21wcyIsCVh2LCBZdiwgWFggfSwKLSAgLyogYTggKi8KLSAgeyAidGVzdCIsCUFMLCBJYiwgWFggfSwKLSAgeyAidGVzdCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInN0b3MiLAlZYiwgQUwsIFhYIH0sCi0gIHsgInN0b3MiLAlZdiwgZUFYLCBYWCB9LAotICB7ICJsb2RzIiwJQUwsIFhiLCBYWCB9LAotICB7ICJsb2RzIiwJZUFYLCBYdiwgWFggfSwKLSAgeyAic2NhcyIsCUFMLCBZYiwgWFggfSwKLSAgeyAic2NhcyIsCWVBWCwgWXYsIFhYIH0sCi0gIC8qIGIwICovCi0gIHsgIm1vdiIsCUFMLCBJYiwgWFggfSwKLSAgeyAibW92IiwJQ0wsIEliLCBYWCB9LAotICB7ICJtb3YiLAlETCwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCUJMLCBJYiwgWFggfSwKLSAgeyAibW92IiwJQUgsIEliLCBYWCB9LAotICB7ICJtb3YiLAlDSCwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCURILCBJYiwgWFggfSwKLSAgeyAibW92IiwJQkgsIEliLCBYWCB9LAotICAvKiBiOCAqLwotICB7ICJtb3YiLAllQVgsIEl2LCBYWCB9LAotICB7ICJtb3YiLAllQ1gsIEl2LCBYWCB9LAotICB7ICJtb3YiLAllRFgsIEl2LCBYWCB9LAotICB7ICJtb3YiLAllQlgsIEl2LCBYWCB9LAotICB7ICJtb3YiLAllU1AsIEl2LCBYWCB9LAotICB7ICJtb3YiLAllQlAsIEl2LCBYWCB9LAotICB7ICJtb3YiLAllU0ksIEl2LCBYWCB9LAotICB7ICJtb3YiLAllREksIEl2LCBYWCB9LAotICAvKiBjMCAqLwotICB7IEdSUDJiIH0sCi0gIHsgR1JQMlMgfSwKLSAgeyAicmV0IiwJSXcsIFhYLCBYWCB9LAotICB7ICJyZXQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxlcyIsCUd2LCBNcCwgWFggfSwKLSAgeyAibGRzIiwJR3YsIE1wLCBYWCB9LAotICB7ICJtb3YiLAlFYiwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCUV2LCBJdiwgWFggfSwKLSAgLyogYzggKi8KLSAgeyAiZW50ZXIiLAlJdywgSWIsIFhYIH0sCi0gIHsgImxlYXZlIiwJWFgsIFhYLCBYWCB9LAotICB7ICJscmV0IiwJSXcsIFhYLCBYWCB9LAotICB7ICJscmV0IiwJWFgsIFhYLCBYWCB9LAotICB7ICJpbnQzIiwJWFgsIFhYLCBYWCB9LAotICB7ICJpbnQiLAlJYiwgWFgsIFhYIH0sCi0gIHsgImludG8iLAlYWCwgWFgsIFhYIH0sCi0gIHsgImlyZXQiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIGQwICovCi0gIHsgR1JQMmJfb25lIH0sCi0gIHsgR1JQMlNfb25lIH0sCi0gIHsgR1JQMmJfY2wgfSwKLSAgeyBHUlAyU19jbCB9LAotICB7ICJhYW0iLAlzSWIsIFhYLCBYWCB9LAotICB7ICJhYWQiLAlzSWIsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgeyAieGxhdCIsCURTQlgsIFhYLCBYWCB9LAotICAvKiBkOCAqLwotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgLyogZTAgKi8KLSAgeyAibG9vcG5lIiwJSmIsIFhYLCBYWCB9LAotICB7ICJsb29wZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAibG9vcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiakVjeHoiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImluIiwJQUwsIEliLCBYWCB9LAotICB7ICJpbiIsCWVBWCwgSWIsIFhYIH0sCi0gIHsgIm91dCIsCUliLCBBTCwgWFggfSwKLSAgeyAib3V0IiwJSWIsIGVBWCwgWFggfSwKLSAgLyogZTggKi8KLSAgeyAiY2FsbCIsCUp2LCBYWCwgWFggfSwKLSAgeyAiam1wIiwJSnYsIFhYLCBYWCB9LAotICB7ICJsam1wIiwJQXAsIFhYLCBYWCB9LAotICB7ICJqbXAiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImluIiwJQUwsIGluZGlyRFgsIFhYIH0sCi0gIHsgImluIiwJZUFYLCBpbmRpckRYLCBYWCB9LAotICB7ICJvdXQiLAlpbmRpckRYLCBBTCwgWFggfSwKLSAgeyAib3V0IiwJaW5kaXJEWCwgZUFYLCBYWCB9LAotICAvKiBmMCAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBsb2NrIHByZWZpeCAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogcmVwbmUgKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogcmVweiAqLwotICB7ICJobHQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNtYyIsCVhYLCBYWCwgWFggfSwKLSAgeyBHUlAzYiB9LAotICB7IEdSUDNTIH0sCi0gIC8qIGY4ICovCi0gIHsgImNsYyIsCVhYLCBYWCwgWFggfSwKLSAgeyAic3RjIiwJWFgsIFhYLCBYWCB9LAotICB7ICJjbGkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInN0aSIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY2xkIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzdGQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgR1JQNCB9LAotICB7IEdSUDUgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl90d29ieXRlX2F0dFtdID0gewotICAvKiAwMCAqLwotICB7IEdSUDYgfSwKLSAgeyBHUlA3IH0sCi0gIHsgImxhclMiLCBHdiwgRXcsIFhYIH0sCi0gIHsgImxzbFMiLCBHdiwgRXcsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiY2x0cyIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDA4ICovCi0gIHsgImludmQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIndiaW52ZCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInVkMmEiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUEFNRCB9LAotICB7ICJmZW1tcyIsIFhYLCBYWCwgWFggfSwKLSAgeyAiIiwgTVgsIEVNLCBPUFNVRiB9LCAvKiBTZWUgT1BfM0ROb3dTdWZmaXggKi8KLSAgLyogMTAgKi8KLSAgeyBQUkVHUlA4IH0sCi0gIHsgUFJFR1JQOSB9LAotICB7ICJtb3ZscHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdoJyB9LCAgLyogcmVhbGx5IG9ubHkgMiBvcGVyYW5kcyAqLwotICB7ICJtb3ZscHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdoJyB9LAotICB7ICJ1bnBja2xwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAidW5wY2tocHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgIm1vdmhwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIHsgIm1vdmhwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIC8qIDE4ICovCi0gIHsgR1JQMTQgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDIwICovCi0gIC8qIHRoZXNlIGFyZSBhbGwgYmFja3dhcmQgaW4gYXBwZW5kaXggQSBvZiB0aGUgaW50ZWwgYm9vayAqLwotICB7ICJtb3ZMIiwgUmQsIENkLCBYWCB9LAotICB7ICJtb3ZMIiwgUmQsIERkLCBYWCB9LAotICB7ICJtb3ZMIiwgQ2QsIFJkLCBYWCB9LAotICB7ICJtb3ZMIiwgRGQsIFJkLCBYWCB9LAotICB7ICJtb3ZMIiwgUmQsIFRkLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAibW92TCIsIFRkLCBSZCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDI4ICovCi0gIHsgIm1vdmFwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAibW92YXBzIiwgRVgsIFhNLCBYWCB9LAotICB7IFBSRUdSUDIgfSwKLSAgeyAibW92bnRwcyIsIEV2LCBYTSwgWFggfSwKLSAgeyBQUkVHUlA0IH0sCi0gIHsgUFJFR1JQMyB9LAotICB7ICJ1Y29taXNzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJjb21pc3MiLCBYTSwgRVgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgIndybXNyIiwgWFgsIFhYLCBYWCB9LAotICB7ICJyZHRzYyIsIFhYLCBYWCwgWFggfSwKLSAgeyAicmRtc3IiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInJkcG1jIiwgWFgsIFhYLCBYWCB9LAotICB7ICJzeXNlbnRlciIsIFhYLCBYWCwgWFggfSwKLSAgeyAic3lzZXhpdCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiAzOCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDQwICovCi0gIHsgImNtb3ZvIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bm8iLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZiIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YWUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bmUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZiZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmEiLCBHdiwgRXYsIFhYIH0sCi0gIC8qIDQ4ICovCi0gIHsgImNtb3ZzIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bnMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZwIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bnAiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZsIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92Z2UiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZsZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmciLCBHdiwgRXYsIFhYIH0sCi0gIC8qIDUwICovCi0gIHsgIm1vdm1za3BzIiwgR3YsIEVYLCBYWCB9LAotICB7IFBSRUdSUDEzIH0sCi0gIHsgUFJFR1JQMTIgfSwKLSAgeyBQUkVHUlAxMSB9LAotICB7ICJhbmRwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAiYW5kbnBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJvcnBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJ4b3JwcyIsIFhNLCBFWCwgWFggfSwKLSAgLyogNTggKi8KLSAgeyBQUkVHUlAwIH0sCi0gIHsgUFJFR1JQMTAgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7IFBSRUdSUDE0IH0sCi0gIHsgUFJFR1JQNyB9LAotICB7IFBSRUdSUDUgfSwKLSAgeyBQUkVHUlA2IH0sCi0gIC8qIDYwICovCi0gIHsgInB1bnBja2xidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNrbHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tsZHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhY2tzc3diIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3RiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3R3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3RkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWNrdXN3YiIsIE1YLCBFTSwgWFggfSwKLSAgLyogNjggKi8KLSAgeyAicHVucGNraGJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tod2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2hkcSIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFja3NzZHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAibW92ZCIsIE1YLCBFZCwgWFggfSwKLSAgeyAibW92cSIsIE1YLCBFTSwgWFggfSwKLSAgLyogNzAgKi8KLSAgeyAicHNodWZ3IiwgTVgsIEVNLCBJYiB9LAotICB7IEdSUDEwIH0sCi0gIHsgR1JQMTEgfSwKLSAgeyBHUlAxMiB9LAotICB7ICJwY21wZXFiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZXF3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZXFkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJlbW1zIiwgWFgsIFhYLCBYWCB9LAotICAvKiA3OCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZkIiwgRWQsIE1YLCBYWCB9LAotICB7ICJtb3ZxIiwgRU0sIE1YLCBYWCB9LAotICAvKiA4MCAqLwotICB7ICJqbyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5vIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYiIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamFlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5lIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYmUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImphIiwgSnYsIFhYLCBYWCB9LAotICAvKiA4OCAqLwotICB7ICJqcyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5zIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqcCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5wIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamdlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbGUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpnIiwgSnYsIFhYLCBYWCB9LAotICAvKiA5MCAqLwotICB7ICJzZXRvIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRubyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YiIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YWUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5lIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRiZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YSIsIEViLCBYWCwgWFggfSwKLSAgLyogOTggKi8KLSAgeyAic2V0cyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bnMiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldHAiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5wIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRsIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRnZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bGUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGciLCBFYiwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgInB1c2hQIiwgZnMsIFhYLCBYWCB9LAotICB7ICJwb3BQIiwgZnMsIFhYLCBYWCB9LAotICB7ICJjcHVpZCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiYnRTIiwgRXYsIEd2LCBYWCB9LAotICB7ICJzaGxkUyIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hsZFMiLCBFdiwgR3YsIENMIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogYTggKi8KLSAgeyAicHVzaFAiLCBncywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLCBncywgWFgsIFhYIH0sCi0gIHsgInJzbSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiYnRzUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAic2hyZFMiLCBFdiwgR3YsIEliIH0sCi0gIHsgInNocmRTIiwgRXYsIEd2LCBDTCB9LAotICB7IEdSUDEzIH0sCi0gIHsgImltdWxTIiwgR3YsIEV2LCBYWCB9LAotICAvKiBiMCAqLwotICB7ICJjbXB4Y2hnQiIsIEViLCBHYiwgWFggfSwKLSAgeyAiY21weGNoZ1MiLCBFdiwgR3YsIFhYIH0sCi0gIHsgImxzc1MiLCBHdiwgTXAsIFhYIH0sCi0gIHsgImJ0clMiLCBFdiwgR3YsIFhYIH0sCi0gIHsgImxmc1MiLCBHdiwgTXAsIFhYIH0sCi0gIHsgImxnc1MiLCBHdiwgTXAsIFhYIH0sCi0gIHsgIm1vdnpiUiIsIEd2LCBFYiwgWFggfSwKLSAgeyAibW92endSIiwgR3YsIEV3LCBYWCB9LCAvKiB5ZXMsIHRoZXJlIHJlYWxseSBpcyBtb3Z6d3cgISAqLwotICAvKiBiOCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAidWQyYiIsIFhYLCBYWCwgWFggfSwKLSAgeyBHUlA4IH0sCi0gIHsgImJ0Y1MiLCBFdiwgR3YsIFhYIH0sCi0gIHsgImJzZlMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImJzclMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgIm1vdnNiUiIsIEd2LCBFYiwgWFggfSwKLSAgeyAibW92c3dSIiwgR3YsIEV3LCBYWCB9LCAvKiB5ZXMsIHRoZXJlIHJlYWxseSBpcyBtb3Zzd3cgISAqLwotICAvKiBjMCAqLwotICB7ICJ4YWRkQiIsIEViLCBHYiwgWFggfSwKLSAgeyAieGFkZFMiLCBFdiwgR3YsIFhYIH0sCi0gIHsgUFJFR1JQMSB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicGluc3J3IiwgTVgsIEV2LCBJYiB9LAotICB7ICJwZXh0cnciLCBFdiwgTVgsIEliIH0sCi0gIHsgInNodWZwcyIsIFhNLCBFWCwgSWIgfSwKLSAgeyBHUlA5IH0sCi0gIC8qIGM4ICovCi0gIHsgImJzd2FwIiwgZUFYLCBYWCwgWFggfSwJLyogYnN3YXAgZG9lc24ndCBzdXBwb3J0IDE2IGJpdCByZWdzICovCi0gIHsgImJzd2FwIiwgZUNYLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlRFgsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVCWCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZVNQLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlQlAsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVTSSwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZURJLCBYWCwgWFggfSwKLSAgLyogZDAgKi8KLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBzcmx3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JsZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNybHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwbXVsbHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwbW92bXNrYiIsIEV2LCBNWCwgWFggfSwKLSAgLyogZDggKi8KLSAgeyAicHN1YnVzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnVzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG1pbnViIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYW5kIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkdXNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkdXN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWF4dWIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhbmRuIiwgTVgsIEVNLCBYWCB9LAotICAvKiBlMCAqLwotICB7ICJwYXZnYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNyYXciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmFkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYXZndyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG11bGh1dyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG11bGh3IiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAibW92bnRxIiwgRXYsIE1YLCBYWCB9LAotICAvKiBlOCAqLwotICB7ICJwc3Vic2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG1pbnN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwb3IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGRzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWF4c3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB4b3IiLCBNWCwgRU0sIFhYIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwc2xsdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNsbGQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzbGxxIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicG1hZGR3ZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNhZGJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJtYXNrbW92cSIsIE1YLCBFTSwgWFggfSwKLSAgLyogZjggKi8KLSAgeyAicHN1YmIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3ViZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBhZGRiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZGQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBkaXMzODZfdHdvYnl0ZV9pbnRlbFtdID0gewotICAvKiAwMCAqLwotICB7IEdSUDYgfSwKLSAgeyBHUlA3IH0sCi0gIHsgImxhciIsIEd2LCBFdywgWFggfSwKLSAgeyAibHNsIiwgR3YsIEV3LCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgImNsdHMiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiAwOCAqLwotICB7ICJpbnZkIiwgWFgsIFhYLCBYWCB9LAotICB7ICJ3YmludmQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJ1ZDJhIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyBHUlBBTUQgfSwKLSAgeyAiZmVtbXMiICwgWFgsIFhYLCBYWH0sCi0gIHsgIiIsIE1YLCBFTSwgT1BTVUYgfSwgLyogU2VlIE9QXzNETm93U3VmZml4ICovCi0gIC8qIDEwICovCi0gIHsgUFJFR1JQOCB9LAotICB7IFBSRUdSUDkgfSwKLSAgeyAibW92bHBzIiwgWE0sIEVYLCBTSU1EX0ZpeHVwLCAnaCcgfSwgIC8qIHJlYWxseSBvbmx5IDIgb3BlcmFuZHMgKi8KLSAgeyAibW92bHBzIiwgRVgsIFhNLCBTSU1EX0ZpeHVwLCAnaCcgfSwKLSAgeyAidW5wY2tscHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgInVucGNraHBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJtb3ZocHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdsJyB9LAotICB7ICJtb3ZocHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdsJyB9LAotICAvKiAxOCAqLwotICB7IEdSUDE0IH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiAyMCAqLwotICAvKiB0aGVzZSBhcmUgYWxsIGJhY2t3YXJkIGluIGFwcGVuZGl4IEEgb2YgdGhlIGludGVsIGJvb2sgKi8KLSAgeyAibW92IiwgUmQsIENkLCBYWCB9LAotICB7ICJtb3YiLCBSZCwgRGQsIFhYIH0sCi0gIHsgIm1vdiIsIENkLCBSZCwgWFggfSwKLSAgeyAibW92IiwgRGQsIFJkLCBYWCB9LAotICB7ICJtb3YiLCBSZCwgVGQsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3YiLCBUZCwgUmQsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiAyOCAqLwotICB7ICJtb3ZhcHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgIm1vdmFwcyIsIEVYLCBYTSwgWFggfSwKLSAgeyBQUkVHUlAyIH0sCi0gIHsgIm1vdm50cHMiLCBFdiwgWE0sIFhYIH0sCi0gIHsgUFJFR1JQNCB9LAotICB7IFBSRUdSUDMgfSwKLSAgeyAidWNvbWlzcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAiY29taXNzIiwgWE0sIEVYLCBYWCB9LAotICAvKiAzMCAqLwotICB7ICJ3cm1zciIsIFhYLCBYWCwgWFggfSwKLSAgeyAicmR0c2MiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInJkbXNyIiwgWFgsIFhYLCBYWCB9LAotICB7ICJyZHBtYyIsIFhYLCBYWCwgWFggfSwKLSAgeyAic3lzZW50ZXIiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInN5c2V4aXQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMzggKi8KLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiA0MCAqLwotICB7ICJjbW92byIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdm5vIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YiIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmFlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92ZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdm5lIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YmUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZhIiwgR3YsIEV2LCBYWCB9LAotICAvKiA0OCAqLwotICB7ICJjbW92cyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdm5zIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92cCIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdm5wIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bCIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmdlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bGUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZnIiwgR3YsIEV2LCBYWCB9LAotICAvKiA1MCAqLwotICB7ICJtb3Ztc2twcyIsIEd2LCBFWCwgWFggfSwKLSAgeyBQUkVHUlAxMyB9LAotICB7IFBSRUdSUDEyIH0sCi0gIHsgUFJFR1JQMTEgfSwKLSAgeyAiYW5kcHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgImFuZG5wcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAib3JwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAieG9ycHMiLCBYTSwgRVgsIFhYIH0sCi0gIC8qIDU4ICovCi0gIHsgUFJFR1JQMCB9LAotICB7IFBSRUdSUDEwIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyBQUkVHUlAxNCB9LAotICB7IFBSRUdSUDcgfSwKLSAgeyBQUkVHUlA1IH0sCi0gIHsgUFJFR1JQNiB9LAotICAvKiA2MCAqLwotICB7ICJwdW5wY2tsYnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2x3ZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNrbGRxIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWNrc3N3YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGNtcGd0YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGNtcGd0dyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGNtcGd0ZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFja3Vzd2IiLCBNWCwgRU0sIFhYIH0sCi0gIC8qIDY4ICovCi0gIHsgInB1bnBja2hidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNraHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2toZHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhY2tzc2R3IiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdmQiLCBNWCwgRWQsIFhYIH0sCi0gIHsgIm1vdnEiLCBNWCwgRU0sIFhYIH0sCi0gIC8qIDcwICovCi0gIHsgInBzaHVmdyIsIE1YLCBFTSwgSWIgfSwKLSAgeyBHUlAxMCB9LAotICB7IEdSUDExIH0sCi0gIHsgR1JQMTIgfSwKLSAgeyAicGNtcGVxYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGNtcGVxdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGNtcGVxZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAiZW1tcyIsIFhYLCBYWCwgWFggfSwKLSAgLyogNzggKi8KLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAibW92ZCIsIEVkLCBNWCwgWFggfSwKLSAgeyAibW92cSIsIEVNLCBNWCwgWFggfSwKLSAgLyogODAgKi8KLSAgeyAiam8iLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpubyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamIiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImphZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpuZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamJlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYSIsIEp2LCBYWCwgWFggfSwKLSAgLyogODggKi8KLSAgeyAianMiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpucyIsIEp2LCBYWCwgWFggfSwKLSAgeyAianAiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpucCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamwiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpnZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamxlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqZyIsIEp2LCBYWCwgWFggfSwKLSAgLyogOTAgKi8KLSAgeyAic2V0byIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bm8iLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGIiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGFlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRuZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YmUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGEiLCBFYiwgWFgsIFhYIH0sCi0gIC8qIDk4ICovCi0gIHsgInNldHMiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5zIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRwIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRucCIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bCIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0Z2UiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGxlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRnIiwgRWIsIFhYLCBYWCB9LAotICAvKiBhMCAqLwotICB7ICJwdXNoIiwgZnMsIFhYLCBYWCB9LAotICB7ICJwb3AiLCBmcywgWFgsIFhYIH0sCi0gIHsgImNwdWlkIiwgWFgsIFhYLCBYWCB9LAotICB7ICJidCIsIEV2LCBHdiwgWFggfSwKLSAgeyAic2hsZCIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hsZCIsIEV2LCBHdiwgQ0wgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiBhOCAqLwotICB7ICJwdXNoIiwgZ3MsIFhYLCBYWCB9LAotICB7ICJwb3AiLCBncywgWFgsIFhYIH0sCi0gIHsgInJzbSIgLCBYWCwgWFgsIFhYfSwKLSAgeyAiYnRzIiwgRXYsIEd2LCBYWCB9LAotICB7ICJzaHJkIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaHJkIiwgRXYsIEd2LCBDTCB9LAotICB7IEdSUDEzIH0sCi0gIHsgImltdWwiLCBHdiwgRXYsIFhYIH0sCi0gIC8qIGIwICovCi0gIHsgImNtcHhjaGciLCBFYiwgR2IsIFhYIH0sCi0gIHsgImNtcHhjaGciLCBFdiwgR3YsIFhYIH0sCi0gIHsgImxzcyIsIEd2LCBNcCwgWFggfSwKLSAgeyAiYnRyIiwgRXYsIEd2LCBYWCB9LAotICB7ICJsZnMiLCBHdiwgTXAsIFhYIH0sCi0gIHsgImxncyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibW92engiLCBHdiwgRWIsIFhYIH0sCi0gIHsgIm1vdnp4IiwgR3YsIEV3LCBYWCB9LAotICAvKiBiOCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAidWQyYiIsIFhYLCBYWCwgWFggfSwKLSAgeyBHUlA4IH0sCi0gIHsgImJ0YyIsIEV2LCBHdiwgWFggfSwKLSAgeyAiYnNmIiwgR3YsIEV2LCBYWCB9LAotICB7ICJic3IiLCBHdiwgRXYsIFhYIH0sCi0gIHsgIm1vdnN4IiwgR3YsIEViLCBYWCB9LAotICB7ICJtb3ZzeCIsIEd2LCBFdywgWFggfSwKLSAgLyogYzAgKi8KLSAgeyAieGFkZCIsIEViLCBHYiwgWFggfSwKLSAgeyAieGFkZCIsIEV2LCBHdiwgWFggfSwKLSAgeyBQUkVHUlAxIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwaW5zcnciLCBNWCwgRXYsIEliIH0sCi0gIHsgInBleHRydyIsIEV2LCBNWCwgSWIgfSwKLSAgeyAic2h1ZnBzIiwgWE0sIEVYLCBJYiB9LAotICB7IEdSUDkgfSwKLSAgLyogYzggKi8KLSAgeyAiYnN3YXAiLCBlQVgsIFhYLCBYWCB9LAkvKiBic3dhcCBkb2Vzbid0IHN1cHBvcnQgMTYgYml0IHJlZ3MgKi8KLSAgeyAiYnN3YXAiLCBlQ1gsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVEWCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZUJYLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlU1AsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVCUCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZVNJLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlREksIFhYLCBYWCB9LAotICAvKiBkMCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicHNybHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmxkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JscSIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtdWxsdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtb3Ztc2tiIiwgRXYsIE1YLCBYWCB9LAotICAvKiBkOCAqLwotICB7ICJwc3VidXNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3VidXN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWludWIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhbmQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR1c2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR1c3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtYXh1YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFuZG4iLCBNWCwgRU0sIFhYIH0sCi0gIC8qIGUwICovCi0gIHsgInBhdmdiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JhdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNyYWQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhdmd3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbXVsaHV3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbXVsaHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZudHEiLCBFdiwgTVgsIFhYIH0sCi0gIC8qIGU4ICovCi0gIHsgInBzdWJzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWluc3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBvciIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkc3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtYXhzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHhvciIsIE1YLCBFTSwgWFggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBzbGx3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2xsZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNsbHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwbWFkZHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2FkYnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIm1hc2ttb3ZxIiwgTVgsIEVNLCBYWCB9LAotICAvKiBmOCAqLwotICB7ICJwc3ViYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJkIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicGFkZGIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG9uZWJ5dGVfaGFzX21vZHJtWzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsIC8qIDAwICovCi0gIC8qIDEwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsIC8qIDEwICovCi0gIC8qIDIwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsIC8qIDIwICovCi0gIC8qIDMwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsIC8qIDMwICovCi0gIC8qIDQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDQwICovCi0gIC8qIDUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDUwICovCi0gIC8qIDYwICovIDAsMCwxLDEsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsIC8qIDYwICovCi0gIC8qIDcwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDcwICovCi0gIC8qIDgwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDgwICovCi0gIC8qIDkwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDkwICovCi0gIC8qIGEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGEwICovCi0gIC8qIGIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGIwICovCi0gIC8qIGMwICovIDEsMSwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsIC8qIGMwICovCi0gIC8qIGQwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsIC8qIGQwICovCi0gIC8qIGUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGUwICovCi0gIC8qIGYwICovIDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLDEgIC8qIGYwICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0d29ieXRlX2hhc19tb2RybVsyNTZdID0gewotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAwMCAqLyAxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLCAvKiAwZiAqLwotICAvKiAxMCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLCAvKiAxZiAqLwotICAvKiAyMCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiAyZiAqLwotICAvKiAzMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAzZiAqLwotICAvKiA0MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiA0ZiAqLwotICAvKiA1MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwxLCAvKiA1ZiAqLwotICAvKiA2MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLCAvKiA2ZiAqLwotICAvKiA3MCAqLyAxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMSwxLCAvKiA3ZiAqLwotICAvKiA4MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA4ZiAqLwotICAvKiA5MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiA5ZiAqLwotICAvKiBhMCAqLyAwLDAsMCwxLDEsMSwxLDEsMCwwLDAsMSwxLDEsMSwxLCAvKiBhZiAqLwotICAvKiBiMCAqLyAxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsMSwxLCAvKiBiZiAqLwotICAvKiBjMCAqLyAxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLCAvKiBjZiAqLwotICAvKiBkMCAqLyAwLDEsMSwxLDAsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiBkZiAqLwotICAvKiBlMCAqLyAxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiBlZiAqLwotICAvKiBmMCAqLyAwLDEsMSwxLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwwICAvKiBmZiAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHdvYnl0ZV91c2VzX2YzX3ByZWZpeFsyNTZdID0gewotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAwMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAwZiAqLwotICAvKiAxMCAqLyAxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAxZiAqLwotICAvKiAyMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwwLCAvKiAyZiAqLwotICAvKiAzMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAzZiAqLwotICAvKiA0MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0ZiAqLwotICAvKiA1MCAqLyAwLDEsMSwxLDAsMCwwLDAsMSwxLDAsMCwxLDEsMSwxLCAvKiA1ZiAqLwotICAvKiA2MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA2ZiAqLwotICAvKiA3MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA3ZiAqLwotICAvKiA4MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA4ZiAqLwotICAvKiA5MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5ZiAqLwotICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBhZiAqLwotICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBiZiAqLwotICAvKiBjMCAqLyAwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBjZiAqLwotICAvKiBkMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBkZiAqLwotICAvKiBlMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlZiAqLwotICAvKiBmMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwICAvKiBmZiAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotfTsKLQotc3RhdGljIGNoYXIgb2J1ZlsxMDBdOwotc3RhdGljIGNoYXIgKm9idWZwOwotc3RhdGljIGNoYXIgc2NyYXRjaGJ1ZlsxMDBdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKnN0YXJ0X2NvZGVwOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmluc25fY29kZXA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqY29kZXA7Ci1zdGF0aWMgZGlzYXNzZW1ibGVfaW5mbyAqdGhlX2luZm87Ci1zdGF0aWMgaW50IG1vZDsKLXN0YXRpYyBpbnQgcm07Ci1zdGF0aWMgaW50IHJlZzsKLXN0YXRpYyB2b2lkIG9hcHBlbmQgUEFSQU1TICgoY29uc3QgY2hhciAqcykpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXMzMltdPXsKLSAgIiVlYXgiLCIlZWN4IiwiJWVkeCIsIiVlYngiLCAiJWVzcCIsIiVlYnAiLCIlZXNpIiwiJWVkaSIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzMTZbXSA9IHsKLSAgIiVheCIsIiVjeCIsIiVkeCIsIiVieCIsIiVzcCIsIiVicCIsIiVzaSIsIiVkaSIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzOFtdID0gewotICAiJWFsIiwiJWNsIiwiJWRsIiwiJWJsIiwiJWFoIiwiJWNoIiwiJWRoIiwiJWJoIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXNfc2VnW10gPSB7Ci0gICIlZXMiLCIlY3MiLCIlc3MiLCIlZHMiLCIlZnMiLCIlZ3MiLCIlPyIsIiU/IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqaW5kZXgxNltdID0gewotICAiJWJ4LCVzaSIsIiVieCwlZGkiLCIlYnAsJXNpIiwiJWJwLCVkaSIsIiVzaSIsIiVkaSIsIiVicCIsIiVieCIKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGdycHNbXVs4XSA9IHsKLSAgLyogR1JQMWIgKi8KLSAgewotICAgIHsgImFkZEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAib3JBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgImFkY0EiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAic2JiQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJhbmRBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgInN1YkEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAieG9yQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJjbXBBIiwJRWIsIEliLCBYWCB9Ci0gIH0sCi0gIC8qIEdSUDFTICovCi0gIHsKLSAgICB7ICJhZGRRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgIm9yUSIsCUV2LCBJdiwgWFggfSwKLSAgICB7ICJhZGNRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgInNiYlEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAiYW5kUSIsCUV2LCBJdiwgWFggfSwKLSAgICB7ICJzdWJRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgInhvclEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAiY21wUSIsCUV2LCBJdiwgWFggfQotICB9LAotICAvKiBHUlAxU3MgKi8KLSAgewotICAgIHsgImFkZFEiLAlFdiwgc0liLCBYWCB9LAotICAgIHsgIm9yUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAiYWRjUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAic2JiUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAiYW5kUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAic3ViUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAieG9yUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAiY21wUSIsCUV2LCBzSWIsIFhYIH0KLSAgfSwKLSAgLyogR1JQMmIgKi8KLSAgewotICAgIHsgInJvbEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAicm9yQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJyY2xBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgInJjckEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAic2hsQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJzaHJBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNhckEiLAlFYiwgSWIsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDJTICovCi0gIHsKLSAgICB7ICJyb2xRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgInJvclEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAicmNsUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJyY3JRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgInNobFEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAic2hyUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJzYXJRIiwJRXYsIEliLCBYWCB9LAotICB9LAotICAvKiBHUlAyYl9vbmUgKi8KLSAgewotICAgIHsgInJvbEEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAicm9yQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJyY2xBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgInJjckEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAic2hsQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJzaHJBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNhckEiLAlFYiwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDJTX29uZSAqLwotICB7Ci0gICAgeyAicm9sUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJyb3JRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgInJjbFEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAicmNyUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJzaGxRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgInNoclEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYfSwKLSAgICB7ICJzYXJRIiwJRXYsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAyYl9jbCAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBDTCwgWFggfSwKLSAgICB7ICJyb3JBIiwJRWIsIENMLCBYWCB9LAotICAgIHsgInJjbEEiLAlFYiwgQ0wsIFhYIH0sCi0gICAgeyAicmNyQSIsCUViLCBDTCwgWFggfSwKLSAgICB7ICJzaGxBIiwJRWIsIENMLCBYWCB9LAotICAgIHsgInNockEiLAlFYiwgQ0wsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyQSIsCUViLCBDTCwgWFggfSwKLSAgfSwKLSAgLyogR1JQMlNfY2wgKi8KLSAgewotICAgIHsgInJvbFEiLAlFdiwgQ0wsIFhYIH0sCi0gICAgeyAicm9yUSIsCUV2LCBDTCwgWFggfSwKLSAgICB7ICJyY2xRIiwJRXYsIENMLCBYWCB9LAotICAgIHsgInJjclEiLAlFdiwgQ0wsIFhYIH0sCi0gICAgeyAic2hsUSIsCUV2LCBDTCwgWFggfSwKLSAgICB7ICJzaHJRIiwJRXYsIENMLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNhclEiLAlFdiwgQ0wsIFhYIH0KLSAgfSwKLSAgLyogR1JQM2IgKi8KLSAgewotICAgIHsgInRlc3RBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgIm5vdEEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAibmVnQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJtdWxCIiwJQUwsIEViLCBYWCB9LAotICAgIHsgImltdWxCIiwJQUwsIEViLCBYWCB9LAotICAgIHsgImRpdkIiLAlBTCwgRWIsIFhYIH0sCi0gICAgeyAiaWRpdkIiLAlBTCwgRWIsIFhYIH0KLSAgfSwKLSAgLyogR1JQM1MgKi8KLSAgewotICAgIHsgInRlc3RRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIm5vdFEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAibmVnUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJtdWxTIiwJZUFYLCBFdiwgWFggfSwKLSAgICB7ICJpbXVsUyIsCWVBWCwgRXYsIFhYIH0sCi0gICAgeyAiZGl2UyIsCWVBWCwgRXYsIFhYIH0sCi0gICAgeyAiaWRpdlMiLAllQVgsIEV2LCBYWCB9LAotICB9LAotICAvKiBHUlA0ICovCi0gIHsKLSAgICB7ICJpbmNBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgImRlY0EiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDUgKi8KLSAgewotICAgIHsgImluY1EiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAiZGVjUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJjYWxsUCIsCWluZGlyRXYsIFhYLCBYWCB9LAotICAgIHsgImNhbGxQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAiam1wUCIsCWluZGlyRXYsIFhYLCBYWCB9LAotICAgIHsgImxqbXBQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAicHVzaFEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDYgKi8KLSAgewotICAgIHsgInNsZHQiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAic3RyIiwJRXcsIFhYLCBYWCB9LAotICAgIHsgImxsZHQiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAibHRyIiwJRXcsIFhYLCBYWCB9LAotICAgIHsgInZlcnIiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAidmVydyIsCUV3LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfQotICB9LAotICAvKiBHUlA3ICovCi0gIHsKLSAgICB7ICJzZ2R0IiwgRXcsIFhYLCBYWCB9LAotICAgIHsgInNpZHQiLCBFdywgWFgsIFhYIH0sCi0gICAgeyAibGdkdCIsIEV3LCBYWCwgWFggfSwKLSAgICB7ICJsaWR0IiwgRXcsIFhYLCBYWCB9LAotICAgIHsgInNtc3ciLCBFdywgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gICAgeyAibG1zdyIsIEV3LCBYWCwgWFggfSwKLSAgICB7ICJpbnZscGciLCBFdywgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDggKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgImJ0USIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJidHNRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgImJ0clEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAiYnRjUSIsCUV2LCBJYiwgWFggfSwKLSAgfSwKLSAgLyogR1JQOSAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiY21weGNoZzhiIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxMCAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNybHciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNyYXciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNsbHciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDExICovCi0gIHsKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc3JsZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc3JhZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc2xsZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQMTIgKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzcmxxIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzbGxxIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxMyAqLwotICB7Ci0gICAgeyAiZnhzYXZlIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgImZ4cnN0b3IiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAibGRteGNzciIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICJzdG14Y3NyIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNmZW5jZSIsIE5vbmUsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxNCAqLwotICB7Ci0gICAgeyAicHJlZmV0Y2hudGEiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAicHJlZmV0Y2h0MCIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICJwcmVmZXRjaHQxIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgInByZWZldGNodDIiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUEFNRCAqLwotICB7Ci0gICAgeyAicHJlZmV0Y2giLCBFYiwgWFgsIFhYIH0sCi0gICAgeyAicHJlZmV0Y2h3IiwgRWIsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9Ci0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IHByZWZpeF91c2VyX3RhYmxlW11bMl0gPSB7Ci0gIC8qIFBSRUdSUDAgKi8KLSAgewotICAgIHsgImFkZHBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgImFkZHNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAxICovCi0gIHsKLSAgICB7ICIiLCBYTSwgRVgsIE9QU0lNRCB9LAkvKiBTZWUgT1BfU0lNRF9TVUZGSVggKi8KLSAgICB7ICIiLCBYTSwgRVgsIE9QU0lNRCB9LAotICB9LAotICAvKiBQUkVHUlAyICovCi0gIHsKLSAgICB7ICJjdnRwaTJwcyIsIFhNLCBFTSwgWFggfSwKLSAgICB7ICJjdnRzaTJzcyIsIFhNLCBFdiwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMyAqLwotICB7Ci0gICAgeyAiY3Z0cHMycGkiLCBNWCwgRVgsIFhYIH0sCi0gICAgeyAiY3Z0c3Myc2kiLCBHdiwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDQgKi8KLSAgewotICAgIHsgImN2dHRwczJwaSIsIE1YLCBFWCwgWFggfSwKLSAgICB7ICJjdnR0c3Myc2kiLCBHdiwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDUgKi8KLSAgewotICAgIHsgImRpdnBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgImRpdnNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlA2ICovCi0gIHsKLSAgICB7ICJtYXhwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJtYXhzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQNyAqLwotICB7Ci0gICAgeyAibWlucHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAibWluc3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDggKi8KLSAgewotICAgIHsgIm1vdnVwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJtb3ZzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQOSAqLwotICB7Ci0gICAgeyAibW92dXBzIiwgRVgsIFhNLCBYWCB9LAotICAgIHsgIm1vdnNzIiwgRVgsIFhNLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAxMCAqLwotICB7Ci0gICAgeyAibXVscHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAibXVsc3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDExICovCi0gIHsKLSAgICB7ICJyY3BwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJyY3BzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTIgKi8KLSAgewotICAgIHsgInJzcXJ0cHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAicnNxcnRzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTMgKi8KLSAgewotICAgIHsgInNxcnRwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJzcXJ0c3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDE0ICovCi0gIHsKLSAgICB7ICJzdWJwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJzdWJzcyIsIFhNLCBFWCwgWFggfSwKLSAgfQotfTsKLQotI2RlZmluZSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IgXygiPGludGVybmFsIGRpc2Fzc2VtYmxlciBlcnJvcj4iKQotCi1zdGF0aWMgdm9pZAotY2twcmVmaXggKCkKLXsKLSAgcHJlZml4ZXMgPSAwOwotICB1c2VkX3ByZWZpeGVzID0gMDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBzd2l0Y2ggKCpjb2RlcCkKLQl7Ci0JY2FzZSAweGYzOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX1JFUFo7Ci0JICBicmVhazsKLQljYXNlIDB4ZjI6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfUkVQTlo7Ci0JICBicmVhazsKLQljYXNlIDB4ZjA6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfTE9DSzsKLQkgIGJyZWFrOwotCWNhc2UgMHgyZToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9DUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgzNjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9TUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgzZToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9EUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgyNjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9FUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NDoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9GUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9HUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9EQVRBOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY3OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0FERFI7Ci0JICBicmVhazsKLQljYXNlIEZXQUlUX09QQ09ERToKLQkgIC8qIGZ3YWl0IGlzIHJlYWxseSBhbiBpbnN0cnVjdGlvbi4gIElmIHRoZXJlIGFyZSBwcmVmaXhlcwotCSAgICAgYmVmb3JlIHRoZSBmd2FpdCwgdGhleSBiZWxvbmcgdG8gdGhlIGZ3YWl0LCAqbm90KiB0byB0aGUKLQkgICAgIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4gICovCi0JICBpZiAocHJlZml4ZXMpCi0JICAgIHsKLQkgICAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRldBSVQ7Ci0JICAgICAgY29kZXArKzsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHByZWZpeGVzID0gUFJFRklYX0ZXQUlUOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybjsKLQl9Ci0gICAgICBjb2RlcCsrOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmVmaXggYnl0ZSBQUkVGLCBvciBOVUxMIGlmIFBSRUYgaXMgbm90IGEKLSAgIHByZWZpeCBieXRlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcHJlZml4X25hbWUgKHByZWYsIHNpemVmbGFnKQotICAgICBpbnQgcHJlZjsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzd2l0Y2ggKHByZWYpCi0gICAgewotICAgIGNhc2UgMHhmMzoKLSAgICAgIHJldHVybiAicmVweiI7Ci0gICAgY2FzZSAweGYyOgotICAgICAgcmV0dXJuICJyZXBueiI7Ci0gICAgY2FzZSAweGYwOgotICAgICAgcmV0dXJuICJsb2NrIjsKLSAgICBjYXNlIDB4MmU6Ci0gICAgICByZXR1cm4gImNzIjsKLSAgICBjYXNlIDB4MzY6Ci0gICAgICByZXR1cm4gInNzIjsKLSAgICBjYXNlIDB4M2U6Ci0gICAgICByZXR1cm4gImRzIjsKLSAgICBjYXNlIDB4MjY6Ci0gICAgICByZXR1cm4gImVzIjsKLSAgICBjYXNlIDB4NjQ6Ci0gICAgICByZXR1cm4gImZzIjsKLSAgICBjYXNlIDB4NjU6Ci0gICAgICByZXR1cm4gImdzIjsKLSAgICBjYXNlIDB4NjY6Ci0gICAgICByZXR1cm4gKHNpemVmbGFnICYgREZMQUcpID8gImRhdGExNiIgOiAiZGF0YTMyIjsKLSAgICBjYXNlIDB4Njc6Ci0gICAgICByZXR1cm4gKHNpemVmbGFnICYgQUZMQUcpID8gImFkZHIxNiIgOiAiYWRkcjMyIjsKLSAgICBjYXNlIEZXQUlUX09QQ09ERToKLSAgICAgIHJldHVybiAiZndhaXQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyIG9wMW91dFsxMDBdLCBvcDJvdXRbMTAwXSwgb3Azb3V0WzEwMF07Ci1zdGF0aWMgaW50IG9wX2FkLCBvcF9pbmRleFszXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb3BfYWRkcmVzc1szXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnRfcGM7Ci0KLQwKLS8qCi0gKiAgIE9uIHRoZSAzODYncyBvZiAxOTg4LCB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gaXMgMTUgYnl0ZXMuCi0gKiAgIChzZWUgdG9waWMgIlJlZHVuZGFudCBwcmVmaXhlcyIgaW4gdGhlICJEaWZmZXJlbmNlcyBmcm9tIDgwODYiCi0gKiAgIHNlY3Rpb24gb2YgdGhlICJWaXJ0dWFsIDgwODYgTW9kZSIgY2hhcHRlci4pCi0gKiAncGMnIHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiB0aGlzIGluc3RydWN0aW9uLCBpdCB3aWxsCi0gKiAgIGJlIHVzZWQgdG8gcHJpbnQgdGhlIHRhcmdldCBhZGRyZXNzIGlmIHRoaXMgaXMgYSByZWxhdGl2ZSBqdW1wIG9yIGNhbGwKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBieXRlcy4KLSAqLwotCi1zdGF0aWMgaW50IHByaW50X2luc25faTM4NgotICBQQVJBTVMgKChiZmRfdm1hIHBjLCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLXN0YXRpYyBjaGFyIGludGVsX3N5bnRheDsKLXN0YXRpYyBjaGFyIG9wZW5fY2hhcjsKLXN0YXRpYyBjaGFyIGNsb3NlX2NoYXI7Ci1zdGF0aWMgY2hhciBzZXBhcmF0b3JfY2hhcjsKLXN0YXRpYyBjaGFyIHNjYWxlX2NoYXI7Ci0KLWludAotcHJpbnRfaW5zbl9pMzg2X2F0dCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludGVsX3N5bnRheCA9IDA7Ci0gIG9wZW5fY2hhciA9ICcoJzsKLSAgY2xvc2VfY2hhciA9ICAnKSc7Ci0gIHNlcGFyYXRvcl9jaGFyID0gJywnOwotICBzY2FsZV9jaGFyID0gJywnOwotCi0gIHJldHVybiBwcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKTsKLX0KLQotaW50Ci1wcmludF9pbnNuX2kzODZfaW50ZWwgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnRlbF9zeW50YXggPSAxOwotICBvcGVuX2NoYXIgPSAnWyc7Ci0gIGNsb3NlX2NoYXIgPSAnXSc7Ci0gIHNlcGFyYXRvcl9jaGFyID0gJysnOwotICBzY2FsZV9jaGFyID0gJyonOwotCi0gIHJldHVybiBwcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9pMzg2IChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpczM4NiAqZHA7Ci0gIGludCBpOwotICBpbnQgdHdvX3NvdXJjZV9vcHM7Ci0gIGNoYXIgKmZpcnN0LCAqc2Vjb25kLCAqdGhpcmQ7Ci0gIGludCBuZWVkY29tbWE7Ci0gIHVuc2lnbmVkIGNoYXIgbmVlZF9tb2RybTsKLSAgdW5zaWduZWQgY2hhciB1c2VzX2YzX3ByZWZpeDsKLSAgVk9MQVRJTEUgaW50IHNpemVmbGFnOwotICBWT0xBVElMRSBpbnQgb3JpZ19zaXplZmxhZzsKLQotICBzdHJ1Y3QgZGlzX3ByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmluYnVmID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGlmIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTM4NgotICAgICAgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQotICAgIHNpemVmbGFnID0gQUZMQUd8REZMQUc7Ci0gIGVsc2UgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pODA4NikKLSAgICBzaXplZmxhZyA9IDA7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgb3JpZ19zaXplZmxhZyA9IHNpemVmbGFnOwotCi0gIC8qIFRoZSBvdXRwdXQgbG9va3MgYmV0dGVyIGlmIHdlIHB1dCA3IGJ5dGVzIG9uIGEgbGluZSwgc2luY2UgdGhhdAotICAgICBwdXRzIG1vc3QgbG9uZyB3b3JkIGluc3RydWN0aW9ucyBvbiBhIHNpbmdsZSBsaW5lLiAgKi8KLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA3OwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBwYzsKLQotICBvYnVmWzBdID0gMDsKLSAgb3Axb3V0WzBdID0gMDsKLSAgb3Ayb3V0WzBdID0gMDsKLSAgb3Azb3V0WzBdID0gMDsKLQotICBvcF9pbmRleFswXSA9IG9wX2luZGV4WzFdID0gb3BfaW5kZXhbMl0gPSAtMTsKLQotICB0aGVfaW5mbyA9IGluZm87Ci0gIHN0YXJ0X3BjID0gcGM7Ci0gIHN0YXJ0X2NvZGVwID0gaW5idWY7Ci0gIGNvZGVwID0gaW5idWY7Ci0KLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIEdldHRpbmcgaGVyZSBtZWFucyB3ZSB0cmllZCBmb3IgZGF0YSBidXQgZGlkbid0IGdldCBpdC4gIFRoYXQKLSAgICAgICAgIG1lYW5zIHdlIGhhdmUgYW4gaW5jb21wbGV0ZSBpbnN0cnVjdGlvbiBvZiBzb21lIHNvcnQuICBKdXN0Ci0gICAgICAgICBwcmludCB0aGUgZmlyc3QgYnl0ZSBhcyBhIHByZWZpeCBvciBhIC5ieXRlIHBzZXVkby1vcC4gICovCi0gICAgICBpZiAoY29kZXAgPiBpbmJ1ZikKLQl7Ci0JICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEp1c3QgcHJpbnQgdGhlIGZpcnN0IGJ5dGUgYXMgYSAuYnl0ZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIuYnl0ZSAweCV4IiwKLQkJCQkgICAgICh1bnNpZ25lZCBpbnQpIGluYnVmWzBdKTsKLQkgICAgfQotCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgY2twcmVmaXggKCk7Ci0KLSAgaW5zbl9jb2RlcCA9IGNvZGVwOwotCi0gIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMSk7Ci0gIHR3b19zb3VyY2Vfb3BzID0gKCpjb2RlcCA9PSAweDYyKSB8fCAoKmNvZGVwID09IDB4YzgpOwotCi0gIG9idWZwID0gb2J1ZjsKLQotICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0ZXQUlUKQotICAgICAgJiYgKCgqY29kZXAgPCAweGQ4KSB8fCAoKmNvZGVwID4gMHhkZikpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIGZ3YWl0IG5vdCBmb2xsb3dlZCBieSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbi4gIFByaW50IHRoZQotICAgICAgICAgZmlyc3QgcHJlZml4LCB3aGljaCBpcyBwcm9iYWJseSBmd2FpdCBpdHNlbGYuICAqLwotICAgICAgbmFtZSA9IHByZWZpeF9uYW1lIChpbmJ1ZlswXSwgb3JpZ19zaXplZmxhZyk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1I7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKCpjb2RlcCA9PSAweDBmKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMik7Ci0gICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICBkcCA9ICZkaXMzODZfdHdvYnl0ZV9pbnRlbFsqKytjb2RlcF07Ci0gICAgICBlbHNlCi0gICAgICAgIGRwID0gJmRpczM4Nl90d29ieXRlX2F0dFsqKytjb2RlcF07Ci0gICAgICBuZWVkX21vZHJtID0gdHdvYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKLSAgICAgIHVzZXNfZjNfcHJlZml4ID0gdHdvYnl0ZV91c2VzX2YzX3ByZWZpeFsqY29kZXBdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIGRwID0gJmRpczM4Nl9pbnRlbFsqY29kZXBdOwotICAgICAgZWxzZQotICAgICAgICBkcCA9ICZkaXMzODZfYXR0Wypjb2RlcF07Ci0gICAgICBuZWVkX21vZHJtID0gb25lYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKLSAgICAgIHVzZXNfZjNfcHJlZml4ID0gMDsKLSAgICB9Ci0gIGNvZGVwKys7Ci0KLSAgaWYgKCF1c2VzX2YzX3ByZWZpeCAmJiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWikpCi0gICAgewotICAgICAgb2FwcGVuZCAoInJlcHogIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUE5aKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCJyZXBueiAiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX1JFUE5aOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0xPQ0spCi0gICAgewotICAgICAgb2FwcGVuZCAoImxvY2sgIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9MT0NLOwotICAgIH0KLQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKLSAgICBzaXplZmxhZyBePSBERkxBRzsKLQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQUREUikKLSAgICB7Ci0gICAgICBzaXplZmxhZyBePSBBRkxBRzsKLSAgICAgIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgICAgICBvYXBwZW5kICgiYWRkcjMyICIpOwotICAgICAgZWxzZQotCW9hcHBlbmQgKCJhZGRyMTYgIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9BRERSOwotICAgIH0KLQotICBpZiAobmVlZF9tb2RybSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBjb2RlcCArIDEpOwotICAgICAgbW9kID0gKCpjb2RlcCA+PiA2KSAmIDM7Ci0gICAgICByZWcgPSAoKmNvZGVwID4+IDMpICYgNzsKLSAgICAgIHJtID0gKmNvZGVwICYgNzsKLSAgICB9Ci0KLSAgaWYgKGRwLT5uYW1lID09IE5VTEwgJiYgZHAtPmJ5dGVtb2RlMSA9PSBGTE9BVENPREUpCi0gICAgewotICAgICAgZG9mbG9hdCAoc2l6ZWZsYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChkcC0+bmFtZSA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaChkcC0+Ynl0ZW1vZGUyKQotCSAgICB7Ci0JICAgICAgY2FzZSBVU0VfR1JPVVBTOgotCSAgICAgICAgZHAgPSAmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtyZWddOwotCQlicmVhazsKLQkgICAgICBjYXNlIFVTRV9QUkVGSVhfVVNFUl9UQUJMRToKLQkJZHAgPSAmcHJlZml4X3VzZXJfdGFibGVbZHAtPmJ5dGVtb2RlMV1bcHJlZml4ZXMgJiBQUkVGSVhfUkVQWiA/IDEgOiAwXTsKLQkJdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWik7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCW9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBwdXRvcCAoZHAtPm5hbWUsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBvcF9hZCA9IDI7Ci0gICAgICBpZiAoZHAtPm9wMSkKLQkoKmRwLT5vcDEpKGRwLT5ieXRlbW9kZTEsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDJvdXQ7Ci0gICAgICBvcF9hZCA9IDE7Ci0gICAgICBpZiAoZHAtPm9wMikKLQkoKmRwLT5vcDIpKGRwLT5ieXRlbW9kZTIsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDNvdXQ7Ci0gICAgICBvcF9hZCA9IDA7Ci0gICAgICBpZiAoZHAtPm9wMykKLQkoKmRwLT5vcDMpKGRwLT5ieXRlbW9kZTMsIHNpemVmbGFnKTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIGFueSBwcmVmaXhlcyB3ZXJlIG5vdCB1c2VkLiAgSWYgc28sIHByaW50IHRoZSBmaXJzdCBvbmUKLSAgICAgc2VwYXJhdGVseS4gIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlJ2xsIHdpbmQgdXAgcHJpbnRpbmcgYW4KLSAgICAgaW5zdHJ1Y3Rpb24gc3RyZWFtIHdoaWNoIGRvZXMgbm90IHByZWNpc2VseSBjb3JyZXNwb25kIHRvIHRoZQotICAgICBieXRlcyB3ZSBhcmUgZGlzYXNzZW1ibGluZy4gICovCi0gIGlmICgocHJlZml4ZXMgJiB+dXNlZF9wcmVmaXhlcykgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9IElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBvYnVmcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpOwotICBmb3IgKGkgPSBzdHJsZW4gKG9idWYpOyBpIDwgNjsgaSsrKQotICAgIG9hcHBlbmQgKCIgIik7Ci0gIG9hcHBlbmQgKCIgIik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvYnVmKTsKLQotICAvKiBUaGUgZW50ZXIgYW5kIGJvdW5kIGluc3RydWN0aW9ucyBhcmUgcHJpbnRlZCB3aXRoIG9wZXJhbmRzIGluIHRoZSBzYW1lCi0gICAgIG9yZGVyIGFzIHRoZSBpbnRlbCBib29rOyBldmVyeXRoaW5nIGVsc2UgaXMgcHJpbnRlZCBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgaWYgKGludGVsX3N5bnRheCB8fCB0d29fc291cmNlX29wcykKLSAgICB7Ci0gICAgICBmaXJzdCA9IG9wMW91dDsKLSAgICAgIHNlY29uZCA9IG9wMm91dDsKLSAgICAgIHRoaXJkID0gb3Azb3V0OwotICAgICAgb3BfYWQgPSBvcF9pbmRleFswXTsKLSAgICAgIG9wX2luZGV4WzBdID0gb3BfaW5kZXhbMl07Ci0gICAgICBvcF9pbmRleFsyXSA9IG9wX2FkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpcnN0ID0gb3Azb3V0OwotICAgICAgc2Vjb25kID0gb3Ayb3V0OwotICAgICAgdGhpcmQgPSBvcDFvdXQ7Ci0gICAgfQotICBuZWVkY29tbWEgPSAwOwotICBpZiAoKmZpcnN0KQotICAgIHsKLSAgICAgIGlmIChvcF9pbmRleFswXSAhPSAtMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSBvcF9hZGRyZXNzW29wX2luZGV4WzBdXSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGZpcnN0KTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnNlY29uZCkKLSAgICB7Ci0gICAgICBpZiAobmVlZGNvbW1hKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgICAgaWYgKG9wX2luZGV4WzFdICE9IC0xKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbMV1dLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2Vjb25kKTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnRoaXJkKQotICAgIHsKLSAgICAgIGlmIChuZWVkY29tbWEpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgICBpZiAob3BfaW5kZXhbMl0gIT0gLTEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgb3BfYWRkcmVzc1tvcF9pbmRleFsyXV0sIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCB0aGlyZCk7Ci0gICAgfQotICByZXR1cm4gY29kZXAgLSBpbmJ1ZjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZsb2F0X21lbV9hdHRbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGRzIiwKLSAgImZtdWxzIiwKLSAgImZjb21zIiwKLSAgImZjb21wcyIsCi0gICJmc3VicyIsCi0gICJmc3VicnMiLAotICAiZmRpdnMiLAotICAiZmRpdnJzIiwKLSAgLyogIGQ5ICovCi0gICJmbGRzIiwKLSAgIihiYWQpIiwKLSAgImZzdHMiLAotICAiZnN0cHMiLAotICAiZmxkZW52IiwKLSAgImZsZGN3IiwKLSAgImZOc3RlbnYiLAotICAiZk5zdGN3IiwKLSAgLyogZGEgKi8KLSAgImZpYWRkbCIsCi0gICJmaW11bGwiLAotICAiZmljb21sIiwKLSAgImZpY29tcGwiLAotICAiZmlzdWJsIiwKLSAgImZpc3VicmwiLAotICAiZmlkaXZsIiwKLSAgImZpZGl2cmwiLAotICAvKiBkYiAqLwotICAiZmlsZGwiLAotICAiKGJhZCkiLAotICAiZmlzdGwiLAotICAiZmlzdHBsIiwKLSAgIihiYWQpIiwKLSAgImZsZHQiLAotICAiKGJhZCkiLAotICAiZnN0cHQiLAotICAvKiBkYyAqLwotICAiZmFkZGwiLAotICAiZm11bGwiLAotICAiZmNvbWwiLAotICAiZmNvbXBsIiwKLSAgImZzdWJsIiwKLSAgImZzdWJybCIsCi0gICJmZGl2bCIsCi0gICJmZGl2cmwiLAotICAvKiBkZCAqLwotICAiZmxkbCIsCi0gICIoYmFkKSIsCi0gICJmc3RsIiwKLSAgImZzdHBsIiwKLSAgImZyc3RvciIsCi0gICIoYmFkKSIsCi0gICJmTnNhdmUiLAotICAiZk5zdHN3IiwKLSAgLyogZGUgKi8KLSAgImZpYWRkIiwKLSAgImZpbXVsIiwKLSAgImZpY29tIiwKLSAgImZpY29tcCIsCi0gICJmaXN1YiIsCi0gICJmaXN1YnIiLAotICAiZmlkaXYiLAotICAiZmlkaXZyIiwKLSAgLyogZGYgKi8KLSAgImZpbGQiLAotICAiKGJhZCkiLAotICAiZmlzdCIsCi0gICJmaXN0cCIsCi0gICJmYmxkIiwKLSAgImZpbGRsbCIsCi0gICJmYnN0cCIsCi0gICJmaXN0cGxsIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpmbG9hdF9tZW1faW50ZWxbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGQiLAotICAiZm11bCIsCi0gICJmY29tIiwKLSAgImZjb21wIiwKLSAgImZzdWIiLAotICAiZnN1YnIiLAotICAiZmRpdiIsCi0gICJmZGl2ciIsCi0gIC8qICBkOSAqLwotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdCIsCi0gICJmc3RwIiwKLSAgImZsZGVudiIsCi0gICJmbGRjdyIsCi0gICJmTnN0ZW52IiwKLSAgImZOc3RjdyIsCi0gIC8qIGRhICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRiICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiKGJhZCkiLAotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdHAiLAotICAvKiBkYyAqLwotICAiZmFkZCIsCi0gICJmbXVsIiwKLSAgImZjb20iLAotICAiZmNvbXAiLAotICAiZnN1YiIsCi0gICJmc3ViciIsCi0gICJmZGl2IiwKLSAgImZkaXZyIiwKLSAgLyogZGQgKi8KLSAgImZsZCIsCi0gICIoYmFkKSIsCi0gICJmc3QiLAotICAiZnN0cCIsCi0gICJmcnN0b3IiLAotICAiKGJhZCkiLAotICAiZk5zYXZlIiwKLSAgImZOc3RzdyIsCi0gIC8qIGRlICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRmICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiZmJsZCIsCi0gICJmaWxkIiwKLSAgImZic3RwIiwKLSAgImZpc3RwbGwiLAotfTsKLQotI2RlZmluZSBTVCBPUF9TVCwgMAotI2RlZmluZSBTVGkgT1BfU1RpLCAwCi0KLSNkZWZpbmUgRkdSUGQ5XzIgTlVMTCwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNCBOVUxMLCBOVUxMLCAxLCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkOV81IE5VTEwsIE5VTEwsIDIsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGQ5XzYgTlVMTCwgTlVMTCwgMywgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNyBOVUxMLCBOVUxMLCA0LCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkYV81IE5VTEwsIE5VTEwsIDUsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGRiXzQgTlVMTCwgTlVMTCwgNiwgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZGVfMyBOVUxMLCBOVUxMLCA3LCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkZl80IE5VTEwsIE5VTEwsIDgsIE5VTEwsIDAsIE5VTEwsIDAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZmxvYXRfcmVnW11bOF0gPSB7Ci0gIC8qIGQ4ICovCi0gIHsKLSAgICB7ICJmYWRkIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmbXVsIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY29tIiwJU1RpLCBYWCwgWFggfSwKLSAgICB7ICJmY29tcCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnN1YiIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZnN1YnIiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZkaXYiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1QsIFNUaSwgWFggfSwKLSAgfSwKLSAgLyogZDkgKi8KLSAgewotICAgIHsgImZsZCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnhjaCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZDlfMiB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGQ5XzQgfSwKLSAgICB7IEZHUlBkOV81IH0sCi0gICAgeyBGR1JQZDlfNiB9LAotICAgIHsgRkdSUGQ5XzcgfSwKLSAgfSwKLSAgLyogZGEgKi8KLSAgewotICAgIHsgImZjbW92YiIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNtb3ZlIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY21vdmJlIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92dSIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZGFfNSB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBkYiAqLwotICB7Ci0gICAgeyAiZmNtb3ZuYiIsU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY21vdm5lIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92bmJlIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92bnUiLFNULCBTVGksIFhYIH0sCi0gICAgeyBGR1JQZGJfNCB9LAotICAgIHsgImZ1Y29taSIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNvbWkiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBkYyAqLwotICB7Ci0gICAgeyAiZmFkZCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZm11bCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi0gICAgeyAiZnN1YiIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZnN1YnIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXYiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1RpLCBTVCwgWFggfSwKLSNlbHNlCi0gICAgeyAiZnN1YnIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZzdWIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2IiwJU1RpLCBTVCwgWFggfSwKLSNlbmRpZgotICB9LAotICAvKiBkZCAqLwotICB7Ci0gICAgeyAiZmZyZWUiLAlTVGksIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgImZzdCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnN0cCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnVjb20iLAlTVGksIFhYLCBYWCB9LAotICAgIHsgImZ1Y29tcCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIGRlICovCi0gIHsKLSAgICB7ICJmYWRkcCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZm11bHAiLAlTVGksIFNULCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGRlXzMgfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZnN1YnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2cCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdnJwIiwJU1RpLCBTVCwgWFggfSwKLSNlbHNlCi0gICAgeyAiZnN1YnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2cCIsCVNUaSwgU1QsIFhYIH0sCi0jZW5kaWYKLSAgfSwKLSAgLyogZGYgKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGRmXzQgfSwKLSAgICB7ICJmdWNvbWlwIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjb21pcCIsIFNULCBTVGksIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi19OwotCi0KLXN0YXRpYyBjaGFyICpmZ3Jwc1tdWzhdID0gewotICAvKiBkOV8yICAwICovCi0gIHsKLSAgICAiZm5vcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV80ICAxICovCi0gIHsKLSAgICAiZmNocyIsImZhYnMiLCIoYmFkKSIsIihiYWQpIiwiZnRzdCIsImZ4YW0iLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV81ICAyICovCi0gIHsKLSAgICAiZmxkMSIsImZsZGwydCIsImZsZGwyZSIsImZsZHBpIiwiZmxkbGcyIiwiZmxkbG4yIiwiZmxkeiIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV82ICAzICovCi0gIHsKLSAgICAiZjJ4bTEiLCJmeWwyeCIsImZwdGFuIiwiZnBhdGFuIiwiZnh0cmFjdCIsImZwcmVtMSIsImZkZWNzdHAiLCJmaW5jc3RwIiwKLSAgfSwKLQotICAvKiBkOV83ICA0ICovCi0gIHsKLSAgICAiZnByZW0iLCJmeWwyeHAxIiwiZnNxcnQiLCJmc2luY29zIiwiZnJuZGludCIsImZzY2FsZSIsImZzaW4iLCJmY29zIiwKLSAgfSwKLQotICAvKiBkYV81ICA1ICovCi0gIHsKLSAgICAiKGJhZCkiLCJmdWNvbXBwIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkYl80ICA2ICovCi0gIHsKLSAgICAiZmVuaSgyODcgb25seSkiLCJmZGlzaSgyODcgb25seSkiLCJmTmNsZXgiLCJmTmluaXQiLAotICAgICJmTnNldHBtKDI4NyBvbmx5KSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZGVfMyAgNyAqLwotICB7Ci0gICAgIihiYWQpIiwiZmNvbXBwIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkZl80ICA4ICovCi0gIHsKLSAgICAiZk5zdHN3IiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotfTsKLQotc3RhdGljIHZvaWQKLWRvZmxvYXQgKHNpemVmbGFnKQotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBkaXMzODYgKmRwOwotICB1bnNpZ25lZCBjaGFyIGZsb2F0b3A7Ci0KLSAgZmxvYXRvcCA9IGNvZGVwWy0xXTsKLQotICBpZiAobW9kICE9IDMpCi0gICAgewotICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgcHV0b3AgKGZsb2F0X21lbV9pbnRlbFsoZmxvYXRvcCAtIDB4ZDggKSAqIDggKyByZWddLCBzaXplZmxhZyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHB1dG9wIChmbG9hdF9tZW1fYXR0WyhmbG9hdG9wIC0gMHhkOCApICogOCArIHJlZ10sIHNpemVmbGFnKTsKLSAgICAgIG9idWZwID0gb3Axb3V0OwotICAgICAgaWYgKGZsb2F0b3AgPT0gMHhkYikKLSAgICAgICAgT1BfRSAoeF9tb2RlLCBzaXplZmxhZyk7Ci0gICAgICBlbHNlIGlmIChmbG9hdG9wID09IDB4ZGQpCi0gICAgICAgIE9QX0UgKGRfbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgZWxzZQotICAgICAgICBPUF9FICh2X21vZGUsIHNpemVmbGFnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGNvZGVwKys7Ci0KLSAgZHAgPSAmZmxvYXRfcmVnW2Zsb2F0b3AgLSAweGQ4XVtyZWddOwotICBpZiAoZHAtPm5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwdXRvcCAoZmdycHNbZHAtPmJ5dGVtb2RlMV1bcm1dLCBzaXplZmxhZyk7Ci0KLSAgICAgIC8qIGluc3RydWN0aW9uIGZuc3RzdyBpcyBvbmx5IG9uZSB3aXRoIHN0cmFuZ2UgYXJnICovCi0gICAgICBpZiAoZmxvYXRvcCA9PSAweGRmICYmIGNvZGVwWy0xXSA9PSAweGUwKQotCXN0cmNweSAob3Axb3V0LCBuYW1lczE2WzBdKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwdXRvcCAoZHAtPm5hbWUsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBpZiAoZHAtPm9wMSkKLQkoKmRwLT5vcDEpKGRwLT5ieXRlbW9kZTEsIHNpemVmbGFnKTsKLSAgICAgIG9idWZwID0gb3Ayb3V0OwotICAgICAgaWYgKGRwLT5vcDIpCi0JKCpkcC0+b3AyKShkcC0+Ynl0ZW1vZGUyLCBzaXplZmxhZyk7Ci0gICAgfQotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX1NUIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBvYXBwZW5kICgiJXN0Iik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU1RpIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVzdCglZCkiLCBybSk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0KLS8qIGNhcGl0YWwgbGV0dGVycyBpbiB0ZW1wbGF0ZSBhcmUgbWFjcm9zICovCi1zdGF0aWMgdm9pZAotcHV0b3AgKHRlbXBsYXRlLCBzaXplZmxhZykKLSAgICAgY29uc3QgY2hhciAqdGVtcGxhdGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgY29uc3QgY2hhciAqcDsKLQotICBmb3IgKHAgPSB0ZW1wbGF0ZTsgKnA7IHArKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpwKQotCXsKLQlkZWZhdWx0OgotCSAgKm9idWZwKysgPSAqcDsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmIChtb2QgIT0gMwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgICAgICB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotI2VuZGlmCi0JICAgICAgKQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLQkgIGJyZWFrOwotCWNhc2UgJ0InOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSAnRSc6CQkvKiBGb3IgamN4ei9qZWN4eiAqLwotCSAgaWYgKHNpemVmbGFnICYgQUZMQUcpCi0JICAgICpvYnVmcCsrID0gJ2UnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgICpvYnVmcCsrID0gJ2wnOwotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfRldBSVQpID09IDApCi0JICAgICpvYnVmcCsrID0gJ24nOwotCSAgZWxzZQotCSAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICAgICAgfHwgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdRJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgYnJlYWs7Ci0JICBpZiAobW9kICE9IDMKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICAgICAgfHwgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdSJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCXsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJICAqb2J1ZnArKyA9ICdxJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpvYnVmcCsrID0gJ3cnOwotCQkgICpvYnVmcCsrID0gJ2QnOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICB9Ci0JICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICAgIH0KLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSAnVyc6Ci0JICAvKiBvcGVyYW5kIHNpemUgZmxhZyBmb3IgY3d0bCwgY2J0dyAqLwotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgICpvYnVmcCsrID0gJ3cnOwotCSAgZWxzZQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCXsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJICAqb2J1ZnArKyA9ICdlJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpvYnVmcCsrID0gJ3cnOwotCQl9Ci0JICAgIH0KLQkgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgKm9idWZwID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLW9hcHBlbmQgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHN0cmNweSAob2J1ZnAsIHMpOwotICBvYnVmcCArPSBzdHJsZW4gKHMpOwotfQotCi1zdGF0aWMgdm9pZAotYXBwZW5kX3NlZyAoKQotewotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQ1MpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVjczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0NTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZHM6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9EUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9TUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJXNzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfU1M7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRVMpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVlczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0VTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0ZTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZnM6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9HUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJWdzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfR1M7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotT1BfaW5kaXJFIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAoIWludGVsX3N5bnRheCkKLSAgICBvYXBwZW5kICgiKiIpOwotICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IGRpc3A7Ci0KLSAgLyogc2tpcCBtb2Qvcm0gYnl0ZSAqLwotICBjb2RlcCsrOwotCi0gIGlmIChtb2QgPT0gMykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQotCXsKLQljYXNlIGJfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzOFtybV0pOwotCSAgYnJlYWs7Ci0JY2FzZSB3X21vZGU6Ci0JICBvYXBwZW5kIChuYW1lczE2W3JtXSk7Ci0JICBicmVhazsKLQljYXNlIGRfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGJyZWFrOwotCWNhc2Ugdl9tb2RlOgotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGVsc2UKLQkgICAgb2FwcGVuZCAobmFtZXMxNltybV0pOwotCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICBicmVhazsKLQljYXNlIDA6Ci0JICBpZiAoICEoY29kZXBbLTJdID09IDB4QUUgJiYgY29kZXBbLTFdID09IDB4RjggLyogc2ZlbmNlICovKSkKLQkgICAgQmFkT3AoKTsJLyogYmFkIHNmZW5jZSxsZWEsbGRzLGxlcyxsZnMsbGdzLGxzcyBtb2RybSAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0JICBicmVhazsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRpc3AgPSAwOwotICBhcHBlbmRfc2VnICgpOwotCi0gIGlmIChzaXplZmxhZyAmIEFGTEFHKSAvKiAzMiBiaXQgYWRkcmVzcyBtb2RlICovCi0gICAgewotICAgICAgaW50IGhhdmVzaWI7Ci0gICAgICBpbnQgaGF2ZWJhc2U7Ci0gICAgICBpbnQgYmFzZTsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICBpbnQgc2NhbGUgPSAwOwotCi0gICAgICBoYXZlc2liID0gMDsKLSAgICAgIGhhdmViYXNlID0gMTsKLSAgICAgIGJhc2UgPSBybTsKLQotICAgICAgaWYgKGJhc2UgPT0gNCkKLQl7Ci0JICBoYXZlc2liID0gMTsKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgc2NhbGUgPSAoKmNvZGVwID4+IDYpICYgMzsKLQkgIGluZGV4ID0gKCpjb2RlcCA+PiAzKSAmIDc7Ci0JICBiYXNlID0gKmNvZGVwICYgNzsKLQkgIGNvZGVwKys7Ci0JfQotCi0gICAgICBzd2l0Y2ggKG1vZCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGJhc2UgPT0gNSkKLQkgICAgewotCSAgICAgIGhhdmViYXNlID0gMDsKLQkgICAgICBkaXNwID0gZ2V0MzIgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgZGlzcCA9ICpjb2RlcCsrOwotCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGRpc3AgPSBnZXQzMiAoKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCFpbnRlbF9zeW50YXgpCi0gICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgIH0KLQotICAgICAgaWYgKGhhdmViYXNlIHx8IChoYXZlc2liICYmIChpbmRleCAhPSA0IHx8IHNjYWxlICE9IDApKSkKLQl7Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3dpdGNoIChieXRlbW9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBiX21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJCWVRFIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Ugd19tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIHZfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIkRXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZF9tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiUVdPUkQgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB4X21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJYV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLQkgICpvYnVmcCsrID0gb3Blbl9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICBpZiAoaGF2ZWJhc2UpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbYmFzZV0pOwotCSAgaWYgKGhhdmVzaWIpCi0JICAgIHsKLQkgICAgICBpZiAoaW5kZXggIT0gNCkKLQkJewotICAgICAgICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlYmFzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKm9idWZwKysgPSBzZXBhcmF0b3JfY2hhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKm9idWZwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJXMiLCBuYW1lczMyW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLQkJICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIsJXMiLCBuYW1lczMyW2luZGV4XSk7Ci0JCSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0JCX0KLSAgICAgICAgICAgICAgaWYgKCFpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgIHx8IChpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSBiX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB3X21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB2X21vZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpvYnVmcCsrID0gc2NhbGVfY2hhcjsKLSAgICAgICAgICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIDEgPDwgc2NhbGUpOwotCSAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIH0KLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERvbid0IHByaW50IHplcm8gZGlzcGxhY2VtZW50cyAqLwotICAgICAgICAgICAgICAgIGlmIChkaXNwID4gMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIislZCIsIGRpc3ApOwotICAgICAgICAgICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXNwIDwgMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7Ci0gICAgICAgICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLQkgICpvYnVmcCsrID0gY2xvc2VfY2hhcjsKLSAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotCX0KLSAgICAgIGVsc2UgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgICB7Ci0JICAgICAgaWYgKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9TUyB8IFBSRUZJWF9EUwotCQkJICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKQotCQk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb2FwcGVuZCAobmFtZXNfc2VnWzNdKTsKLQkJICBvYXBwZW5kICgiOiIpOwotCQl9Ci0gICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7Ci0gICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgeyAvKiAxNiBiaXQgYWRkcmVzcyBtb2RlICovCi0gICAgICBzd2l0Y2ggKG1vZCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKHJtID09IDYpCi0JICAgIHsKLQkgICAgICBkaXNwID0gZ2V0MTYgKCk7Ci0JICAgICAgaWYgKChkaXNwICYgMHg4MDAwKSAhPSAwKQotCQlkaXNwIC09IDB4MTAwMDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgZGlzcCA9ICpjb2RlcCsrOwotCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGRpc3AgPSBnZXQxNiAoKTsKLQkgIGlmICgoZGlzcCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoIWludGVsX3N5bnRheCkKLSAgICAgICAgaWYgKG1vZCAhPSAwIHx8IHJtID09IDYpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7Ci0gICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICB9Ci0KLSAgICAgIGlmIChtb2QgIT0gMCB8fCBybSAhPSA2KQotCXsKLQkgICpvYnVmcCsrID0gb3Blbl9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICBvYXBwZW5kIChpbmRleDE2W3JtXSk7Ci0gICAgICAgICAgKm9idWZwKysgPSBjbG9zZV9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLU9QX0cgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgb2FwcGVuZCAobmFtZXM4W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczE2W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBkX21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczMyW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlvYXBwZW5kIChuYW1lczMyW3JlZ10pOwotICAgICAgZWxzZQotCW9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXQzMiAoKQotewotICBpbnQgeCA9IDA7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgNCk7Ci0gIHggPSAqY29kZXArKyAmIDB4ZmY7Ci0gIHggfD0gKCpjb2RlcCsrICYgMHhmZikgPDwgODsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAxNjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAyNDsKLSAgcmV0dXJuIHg7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldDE2ICgpCi17Ci0gIGludCB4ID0gMDsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAyKTsKLSAgeCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9vcCAob3ApCi0gICAgIHVuc2lnbmVkIGludCBvcDsKLXsKLSAgb3BfaW5kZXhbb3BfYWRdID0gb3BfYWQ7Ci0gIG9wX2FkZHJlc3Nbb3BfYWRdID0gb3A7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9SRUcgKGNvZGUsIHNpemVmbGFnKQotICAgICBpbnQgY29kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICpzOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBpbmRpcl9keF9yZWc6Ci0gICAgICBzID0gIiglZHgpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYXhfcmVnOiBjYXNlIGN4X3JlZzogY2FzZSBkeF9yZWc6IGNhc2UgYnhfcmVnOgotICAgIGNhc2Ugc3BfcmVnOiBjYXNlIGJwX3JlZzogY2FzZSBzaV9yZWc6IGNhc2UgZGlfcmVnOgotICAgICAgcyA9IG5hbWVzMTZbY29kZSAtIGF4X3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGVzX3JlZzogY2FzZSBzc19yZWc6IGNhc2UgY3NfcmVnOgotICAgIGNhc2UgZHNfcmVnOiBjYXNlIGZzX3JlZzogY2FzZSBnc19yZWc6Ci0gICAgICBzID0gbmFtZXNfc2VnW2NvZGUgLSBlc19yZWddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBhbF9yZWc6IGNhc2UgYWhfcmVnOiBjYXNlIGNsX3JlZzogY2FzZSBjaF9yZWc6Ci0gICAgY2FzZSBkbF9yZWc6IGNhc2UgZGhfcmVnOiBjYXNlIGJsX3JlZzogY2FzZSBiaF9yZWc6Ci0gICAgICBzID0gbmFtZXM4W2NvZGUgLSBhbF9yZWddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlQVhfcmVnOiBjYXNlIGVDWF9yZWc6IGNhc2UgZURYX3JlZzogY2FzZSBlQlhfcmVnOgotICAgIGNhc2UgZVNQX3JlZzogY2FzZSBlQlBfcmVnOiBjYXNlIGVTSV9yZWc6IGNhc2UgZURJX3JlZzoKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCXMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgICAgIGVsc2UKLQlzID0gbmFtZXMxNltjb2RlIC0gZUFYX3JlZ107Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBvYXBwZW5kIChzKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0kgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvcDsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgb3AgPSAqY29kZXArKyAmIDB4ZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCW9wID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0Jb3AgPSBnZXQxNiAoKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvcCA9IGdldDE2ICgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBvcCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgiLCBvcCk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICBzY3JhdGNoYnVmWzBdID0gJ1wwJzsKLX0KLQotc3RhdGljIHZvaWQKLU9QX3NJIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgb3A7Ci0KLSAgc3dpdGNoIChieXRlbW9kZSkKLSAgICB7Ci0gICAgY2FzZSBiX21vZGU6Ci0gICAgICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgICAgIG9wID0gKmNvZGVwKys7Ci0gICAgICBpZiAoKG9wICYgMHg4MCkgIT0gMCkKLQlvcCAtPSAweDEwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugdl9tb2RlOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0Jb3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcCA9IGdldDE2KCk7Ci0JICBpZiAoKG9wICYgMHg4MDAwKSAhPSAwKQotCSAgICBvcCAtPSAweDEwMDAwOwotCX0KLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvcCA9IGdldDE2ICgpOwotICAgICAgaWYgKChvcCAmIDB4ODAwMCkgIT0gMCkKLQlvcCAtPSAweDEwMDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoaW50ZWxfc3ludGF4KQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIG9wKTsKLSAgZWxzZQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCIsIG9wKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9KIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgZGlzcDsKLSAgaW50IG1hc2sgPSAtMTsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgZGlzcCA9ICpjb2RlcCsrOwotICAgICAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQlkaXNwIC09IDB4MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlkaXNwID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0JewotCSAgZGlzcCA9IGdldDE2ICgpOwotCSAgLyogZm9yIHNvbWUgcmVhc29uLCBhIGRhdGExNiBwcmVmaXggb24gYSBqdW1wIGluc3RydWN0aW9uCi0JICAgICBtZWFucyB0aGF0IHRoZSBwYyBpcyBtYXNrZWQgdG8gMTYgYml0cyBhZnRlciB0aGUKLQkgICAgIGRpc3BsYWNlbWVudCBpcyBhZGRlZCEgICovCi0JICBtYXNrID0gMHhmZmZmOwotCX0KLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBkaXNwID0gKHN0YXJ0X3BjICsgY29kZXAgLSBzdGFydF9jb2RlcCArIGRpc3ApICYgbWFzazsKLSAgc2V0X29wIChkaXNwKTsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU0VHIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RhdGljIGNoYXIgKnNyZWdbXSA9IHsKLSAgICAiJWVzIiwiJWNzIiwiJXNzIiwiJWRzIiwiJWZzIiwiJWdzIiwiJT8iLCIlPyIsCi0gIH07Ci0KLSAgb2FwcGVuZCAoc3JlZ1tyZWddKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9ESVIgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IHNlZywgb2Zmc2V0OwotCi0gIGlmIChzaXplZmxhZyAmIERGTEFHKQotICAgIHsKLSAgICAgIG9mZnNldCA9IGdldDMyICgpOwotICAgICAgc2VnID0gZ2V0MTYgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2Zmc2V0ID0gZ2V0MTYgKCk7Ci0gICAgICBzZWcgPSBnZXQxNiAoKTsKLSAgICB9Ci0gIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgsJDB4JXgiLCBzZWcsIG9mZnNldCk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX09GRiAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvZmY7Ci0KLSAgYXBwZW5kX3NlZyAoKTsKLQotICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLSAgICBvZmYgPSBnZXQzMiAoKTsKLSAgZWxzZQotICAgIG9mZiA9IGdldDE2ICgpOwotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgewotICAgICAgaWYgKCEocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX1NTIHwgUFJFRklYX0RTCi0JCSAgICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKSkKLQl7Ci0JICBvYXBwZW5kIChuYW1lc19zZWdbM10pOwotCSAgb2FwcGVuZCAoIjoiKTsKLQl9Ci0gICAgfQotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9mZik7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIG9hcHBlbmQgKCIoIik7Ci0gIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgIHMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgZWxzZQotICAgIHMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKLSAgb2FwcGVuZCAocyk7Ci0gIG9hcHBlbmQgKCIpIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FU3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIG9hcHBlbmQgKCIlZXM6Iik7Ci0gIHB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0RTcmVnIChjb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKChwcmVmaXhlcwotICAgICAgICYgKFBSRUZJWF9DUwotCSAgfCBQUkVGSVhfRFMKLQkgIHwgUFJFRklYX1NTCi0JICB8IFBSRUZJWF9FUwotCSAgfCBQUkVGSVhfRlMKLQkgIHwgUFJFRklYX0dTKSkgPT0gMCkKLSAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7Ci0gIGFwcGVuZF9zZWcoKTsKLSAgcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX0MgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVjciVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfRCAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJWRiJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9UIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUldHIlZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfUmQgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgPT0gMykKLSAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICBlbHNlCi0gICAgQmFkT3AoKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX01NWCAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlbW0lZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfWE1NIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUleG1tJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0VNIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kICE9IDMpCi0gICAgewotICAgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29kZXArKzsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlbW0lZCIsIHJtKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FWCAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKG1vZCAhPSAzKQotICAgIHsKLSAgICAgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvZGVwKys7Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXhtbSVkIiwgcm0pOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX01TIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kID09IDMpCi0gICAgT1BfRU0gKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gIGVsc2UKLSAgICBCYWRPcCgpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqU3VmZml4M0ROb3dbXSA9IHsKLS8qIDAwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAwNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDBDICovCSJwaTJmdyIsCSJwaTJmZCIsCU5VTEwsCQlOVUxMLAotLyogMTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDE0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAxOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMUMgKi8JInBmMml3IiwJInBmMmlkIiwJTlVMTCwJCU5VTEwsCi0vKiAyMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAyQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAzOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogM0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA0NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDRDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA2OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDcwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA3NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDdDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogODQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDg4ICovCU5VTEwsCQlOVUxMLAkJInBmbmFjYyIsCU5VTEwsCi0vKiA4QyAqLwlOVUxMLAkJTlVMTCwJCSJwZnBuYWNjIiwJTlVMTCwKLS8qIDkwICovCSJwZmNtcGdlIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogOTQgKi8JInBmbWluIiwJTlVMTCwJCSJwZnJjcCIsCSJwZnJzcXJ0IiwKLS8qIDk4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViIiwJTlVMTCwKLS8qIDlDICovCU5VTEwsCQlOVUxMLAkJInBmYWRkIiwJTlVMTCwKLS8qIEEwICovCSJwZmNtcGd0IiwJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQTQgKi8JInBmbWF4IiwJTlVMTCwJCSJwZnJjcGl0MSIsCSJwZnJzcWl0MSIsCi0vKiBBOCAqLwlOVUxMLAkJTlVMTCwJCSJwZnN1YnIiLAlOVUxMLAotLyogQUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhY2MiLAlOVUxMLAotLyogQjAgKi8JInBmY21wZXEiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBCNCAqLwkicGZtdWwiLAlOVUxMLAkJInBmcmNwaXQyIiwJInBmbXVsaHJ3IiwKLS8qIEI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCSJwc3dhcGQiLAotLyogQkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJInBhdmd1c2IiLAotLyogQzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBDOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQ0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBENCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIERDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLX07Ci0KLXN0YXRpYyB2b2lkCi1PUF8zRE5vd1N1ZmZpeCAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNvbnN0IGNoYXIgKm1uZW1vbmljOwotCi0gIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAvKiBBTUQgM0ROb3chIGluc3RydWN0aW9ucyBhcmUgc3BlY2lmaWVkIGJ5IGFuIG9wY29kZSBzdWZmaXggaW4gdGhlCi0gICAgIHBsYWNlIHdoZXJlIGFuIDgtYml0IGltbWVkaWF0ZSB3b3VsZCBub3JtYWxseSBnby4gIGllLiB0aGUgbGFzdAotICAgICBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgbW5lbW9uaWMgPSBTdWZmaXgzRE5vd1sqY29kZXArKyAmIDB4ZmZdOwotICBpZiAobW5lbW9uaWMpCi0gICAgb2FwcGVuZCAobW5lbW9uaWMpOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2luY2UgYSB2YXJpYWJsZSBzaXplZCBtb2RybS9zaWIgY2h1bmsgaXMgYmV0d2VlbiB0aGUgc3RhcnQKLQkgb2YgdGhlIG9wY29kZSAoMHgwZjBmKSBhbmQgdGhlIG9wY29kZSBzdWZmaXgsIHdlIG5lZWQgdG8gZG8KLQkgYWxsIHRoZSBtb2RybSBwcm9jZXNzaW5nIGZpcnN0LCBhbmQgZG9uJ3Qga25vdyB1bnRpbCBub3cgdGhhdAotCSB3ZSBoYXZlIGEgYmFkIG9wY29kZS4gIFRoaXMgbmVjZXNzaXRhdGVzIHNvbWUgY2xlYW5pbmcgdXAuICAqLwotICAgICAgb3Axb3V0WzBdID0gJ1wwJzsKLSAgICAgIG9wMm91dFswXSA9ICdcMCc7Ci0gICAgICBCYWRPcCgpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2ltZF9jbXBfb3AgW10gPSB7Ci0gICJlcSIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJ1bm9yZCIsCi0gICJuZXEiLAotICAibmx0IiwKLSAgIm5sZSIsCi0gICJvcmQiCi19OwotCi1zdGF0aWMgdm9pZAotT1BfU0lNRF9TdWZmaXggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBpbnQgY21wX3R5cGU7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgY21wX3R5cGUgPSAqY29kZXArKyAmIDB4ZmY7Ci0gIGlmIChjbXBfdHlwZSA8IDgpCi0gICAgewotICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgImNtcCVzJWNzIiwKLQkgICAgICAgc2ltZF9jbXBfb3BbY21wX3R5cGVdLAotCSAgICAgICBwcmVmaXhlcyAmIFBSRUZJWF9SRVBaID8gJ3MnIDogJ3AnKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX1JFUFopOwotICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhIGJhZCBleHRlbnNpb24gYnl0ZS4gIENsZWFuIHVwLiAgKi8KLSAgICAgIG9wMW91dFswXSA9ICdcMCc7Ci0gICAgICBvcDJvdXRbMF0gPSAnXDAnOwotICAgICAgQmFkT3AoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1TSU1EX0ZpeHVwIChleHRyYWNoYXIsIHNpemVmbGFnKQotICAgICBpbnQgZXh0cmFjaGFyOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogQ2hhbmdlIG1vdmxwcy9tb3ZocHMgdG8gbW92aGxwcy9tb3ZsaHBzIGZvciAyIHJlZ2lzdGVyIG9wZXJhbmQKLSAgICAgZm9ybXMgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgaWYgKG1vZCA9PSAzKQotICAgIHsKLSAgICAgIGNoYXIgKnAgPSBvYnVmICsgc3RybGVuKG9idWYpOwotICAgICAgKihwKzEpID0gJ1wwJzsKLSAgICAgICpwICAgICA9ICoocC0xKTsKLSAgICAgICoocC0xKSA9ICoocC0yKTsKLSAgICAgICoocC0yKSA9ICoocC0zKTsKLSAgICAgICoocC0zKSA9IGV4dHJhY2hhcjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEJhZE9wICh2b2lkKQotewotICBjb2RlcCA9IGluc25fY29kZXAgKyAxOwkvKiB0aHJvdyBhd2F5IHByZWZpeGVzIGFuZCAxc3QuIG9wY29kZSBieXRlICovCi0gIG9hcHBlbmQgKCIoYmFkKSIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pOTYwLWRpcy5jIGIvb3Bjb2Rlcy9pOTYwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJkODQ4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaTk2MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBpODA5NjAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IHsKLS8qICAwICovCSJwZnAiLCAic3AiLCAgInJpcCIsICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLCAKLS8qICA4ICovCSJyOCIsICAicjkiLCAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwKLS8qIDE2ICovCSJnMCIsICAiZzEiLCAgImcyIiwgICJnMyIsICAiZzQiLCAgImc1IiwgICJnNiIsICAiZzciLCAKLS8qIDI0ICovCSJnOCIsICAiZzkiLCAgImcxMCIsICJnMTEiLCAiZzEyIiwgImcxMyIsICJnMTQiLCAiZnAiLCAKLS8qIDMyICovCSJwYyIsICAiYWMiLCAgImlwIiwgICJ0YyIsICAiZnAwIiwgImZwMSIsICJmcDIiLCAiZnAzIiAKLX07Ci0KLQotc3RhdGljIEZJTEUgKnN0cmVhbTsJCS8qIE91dHB1dCBnb2VzIGhlcmUgKi8KLXN0YXRpYyBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHIoKTsKLXN0YXRpYyB2b2lkIGN0cmwoKTsKLXN0YXRpYyB2b2lkIGNvYnIoKTsKLXN0YXRpYyB2b2lkIHJlZygpOwotc3RhdGljIGludCBtZW0oKTsKLXN0YXRpYyB2b2lkIGVhKCk7Ci1zdGF0aWMgdm9pZCBkc3RvcCgpOwotc3RhdGljIHZvaWQgcmVnb3AoKTsKLXN0YXRpYyB2b2lkIGludmFsaWQoKTsKLXN0YXRpYyBpbnQgcGluc24oKTsKLXN0YXRpYyB2b2lkIHB1dF9hYnMoKTsKLQotCi0vKiBQcmludCB0aGUgaTk2MCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICdtZW1hZGRyJyBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2k5NjAgKG1lbWFkZHIsIGluZm9fYXJnKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mb19hcmc7Ci17Ci0gIHVuc2lnbmVkIGludCB3b3JkMSwgd29yZDIgPSAweGRlYWRiZWVmOwotICBiZmRfYnl0ZSBidWZmZXJbOF07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaW5mbyA9IGluZm9fYXJnOwotICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0KLSAgLyogUmVhZCB3b3JkMS4gIE9ubHkgcmVhZCB3b3JkMiBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgbmVlZHMgaXQsIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCAoYmZkX2J5dGUgKikgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICB3b3JkMSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLSAgLyogRGl2aWRlIGluc3RydWN0aW9uIHNldCBpbnRvIGNsYXNzZXMgYmFzZWQgb24gaGlnaCA0IGJpdHMgb2Ygb3Bjb2RlLiAgKi8KLSAgc3dpdGNoICggKHdvcmQxID4+IDI4KSAmIDB4ZiApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODoKLSAgICBjYXNlIDB4OToKLSAgICBjYXNlIDB4YToKLSAgICBjYXNlIDB4YjoKLSAgICBjYXNlIDB4YzoKLSAgICAgIC8qIFJlYWQgd29yZDIuICAqLwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShtZW1hZGRyICsgNCwgKGJmZF9ieXRlICopIChidWZmZXIgKyA0KSwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgd29yZDIgPSBiZmRfZ2V0bDMyIChidWZmZXIgKyA0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcGluc24oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApOwotfQotDAotI2RlZmluZSBJTl9HREIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglBbGwgY29kZSBiZWxvdyB0aGlzIHBvaW50IHNob3VsZCBiZSBpZGVudGljYWwgd2l0aCB0aGF0IG9mCi0gKgl0aGUgZGlzYXNzZW1ibGVyIGluIGdkbXA5NjAuCi0KLSBBIG5vYmxlIHNlbnRpbWVudCwgYnV0IGF0IGxlYXN0IGluIGNvc21ldGljIHdheXMgKGluZm8tPmZwcmludGZfZnVuYyksIGl0Ci0ganVzdCBhaW4ndCBzby4gLWtpbmdkb24sIDMxIE1hciA5MwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgdGFiZW50IHsKLSAgY2hhciAqbmFtZTsKLSAgc2hvcnQgbnVtb3BzOwotfTsKLQotc3RydWN0IHNwYXJzZV90YWJlbnQgewotICBpbnQgb3Bjb2RlOwotICBjaGFyICpuYW1lOwotICBzaG9ydCBudW1vcHM7Ci19OwotCi1zdGF0aWMgaW50Ci1waW5zbiggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IGluc3RyX2xlbjsKLQotCWluc3RyX2xlbiA9IDQ7Ci0JcHV0X2Ficyggd29yZDEsIHdvcmQyICk7Ci0KLQkvKiBEaXZpZGUgaW5zdHJ1Y3Rpb24gc2V0IGludG8gY2xhc3NlcyBiYXNlZCBvbiBoaWdoIDQgYml0cyBvZiBvcGNvZGUqLwotCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKLQljYXNlIDB4MDoKLQljYXNlIDB4MToKLQkJY3RybCggbWVtYWRkciwgd29yZDEsIHdvcmQyICk7Ci0JCWJyZWFrOwotCWNhc2UgMHgyOgotCWNhc2UgMHgzOgotCQljb2JyKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDU6Ci0JY2FzZSAweDY6Ci0JY2FzZSAweDc6Ci0JCXJlZyggd29yZDEgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDg6Ci0JY2FzZSAweDk6Ci0JY2FzZSAweGE6Ci0JY2FzZSAweGI6Ci0JY2FzZSAweGM6Ci0JCWluc3RyX2xlbiA9IG1lbSggbWVtYWRkciwgd29yZDEsIHdvcmQyLCAwICk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGludmFsaWQgaW5zdHJ1Y3Rpb24sIHByaW50IGFzIGRhdGEgd29yZCAqLyAKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBpbnN0cl9sZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ1RSTCBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWN0cmwoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotCWludCBpOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFiZW50IGN0cmxfdGFiW10gPSB7Ci0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAwICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAxICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAyICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAzICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA0ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA1ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA2ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA3ICovCi0JICB7ICJiIiwJCTEsIH0sCS8qIDB4MDggKi8KLQkgIHsgImNhbGwiLAkJMSwgfSwJLyogMHgwOSAqLwotCSAgeyAicmV0IiwJCTAsIH0sCS8qIDB4MGEgKi8KLQkgIHsgImJhbCIsCQkxLCB9LAkvKiAweDBiICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBjICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBkICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBlICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBmICovCi0JICB7ICJibm8iLAkJMSwgfSwJLyogMHgxMCAqLwotCSAgeyAiYmciLAkJMSwgfSwJLyogMHgxMSAqLwotCSAgeyAiYmUiLAkJMSwgfSwJLyogMHgxMiAqLwotCSAgeyAiYmdlIiwJCTEsIH0sCS8qIDB4MTMgKi8KLQkgIHsgImJsIiwJCTEsIH0sCS8qIDB4MTQgKi8KLQkgIHsgImJuZSIsCQkxLCB9LAkvKiAweDE1ICovCi0JICB7ICJibGUiLAkJMSwgfSwJLyogMHgxNiAqLwotCSAgeyAiYm8iLAkJMSwgfSwJLyogMHgxNyAqLwotCSAgeyAiZmF1bHRubyIsCQkwLCB9LAkvKiAweDE4ICovCi0JICB7ICJmYXVsdGciLAkJMCwgfSwJLyogMHgxOSAqLwotCSAgeyAiZmF1bHRlIiwJCTAsIH0sCS8qIDB4MWEgKi8KLQkgIHsgImZhdWx0Z2UiLAkJMCwgfSwJLyogMHgxYiAqLwotCSAgeyAiZmF1bHRsIiwJCTAsIH0sCS8qIDB4MWMgKi8KLQkgIHsgImZhdWx0bmUiLAkJMCwgfSwJLyogMHgxZCAqLwotCSAgeyAiZmF1bHRsZSIsCQkwLCB9LAkvKiAweDFlICovCi0JICB7ICJmYXVsdG8iLAkJMCwgfSwJLyogMHgxZiAqLwotCX07Ci0KLQlpID0gKHdvcmQxID4+IDI0KSAmIDB4ZmY7Ci0JaWYgKCAoY3RybF90YWJbaV0ubmFtZSA9PSBOVUxMKSB8fCAoKHdvcmQxICYgMSkgIT0gMCkgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgY3RybF90YWJbaV0ubmFtZSApOwotCWlmICggd29yZDEgJiAyICl7CQkvKiBQcmVkaWN0cyBicmFuY2ggbm90IHRha2VuICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgIi5mIiApOwotCX0KLQotCWlmICggY3RybF90YWJbaV0ubnVtb3BzID09IDEgKXsKLQkJLyogRVhUUkFDVCBESVNQTEFDRU1FTlQgQU5EIENPTlZFUlQgVE8gQUREUkVTUyAqLwotCQl3b3JkMSAmPSAweDAwZmZmZmZmOwotCQlpZiAoIHdvcmQxICYgMHgwMDgwMDAwMCApewkJLyogU2lnbiBiaXQgaXMgc2V0ICovCi0JCQl3b3JkMSB8PSAoLTEgJiB+MHhmZmZmZmYpOwkvKiBTaWduIGV4dGVuZCAqLwotCQl9Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0JCXByaW50X2FkZHIoIHdvcmQxICsgbWVtYWRkciApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBDT0JSIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY29iciggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IHNyYzE7Ci0JaW50IHNyYzI7Ci0JaW50IGk7Ci0KLQlzdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudCBjb2JyX3RhYltdID0gewotCSAgeyAidGVzdG5vIiwJMSwgfSwJLyogMHgyMCAqLwotCSAgeyAidGVzdGciLAkxLCB9LAkvKiAweDIxICovCi0JICB7ICJ0ZXN0ZSIsCTEsIH0sCS8qIDB4MjIgKi8KLQkgIHsgInRlc3RnZSIsCTEsIH0sCS8qIDB4MjMgKi8KLQkgIHsgInRlc3RsIiwJMSwgfSwJLyogMHgyNCAqLwotCSAgeyAidGVzdG5lIiwJMSwgfSwJLyogMHgyNSAqLwotCSAgeyAidGVzdGxlIiwJMSwgfSwJLyogMHgyNiAqLwotCSAgeyAidGVzdG8iLAkxLCB9LAkvKiAweDI3ICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MjggKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyOSAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJhICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmIgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyYyAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJkICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmUgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyZiAqLwotCSAgeyAiYmJjIiwJMywgfSwJLyogMHgzMCAqLwotCSAgeyAiY21wb2JnIiwJMywgfSwJLyogMHgzMSAqLwotCSAgeyAiY21wb2JlIiwJMywgfSwJLyogMHgzMiAqLwotCSAgeyAiY21wb2JnZSIsCTMsIH0sCS8qIDB4MzMgKi8KLQkgIHsgImNtcG9ibCIsCTMsIH0sCS8qIDB4MzQgKi8KLQkgIHsgImNtcG9ibmUiLAkzLCB9LAkvKiAweDM1ICovCi0JICB7ICJjbXBvYmxlIiwJMywgfSwJLyogMHgzNiAqLwotCSAgeyAiYmJzIiwJMywgfSwJLyogMHgzNyAqLwotCSAgeyAiY21waWJubyIsCTMsIH0sCS8qIDB4MzggKi8KLQkgIHsgImNtcGliZyIsCTMsIH0sCS8qIDB4MzkgKi8KLQkgIHsgImNtcGliZSIsCTMsIH0sCS8qIDB4M2EgKi8KLQkgIHsgImNtcGliZ2UiLAkzLCB9LAkvKiAweDNiICovCi0JICB7ICJjbXBpYmwiLAkzLCB9LAkvKiAweDNjICovCi0JICB7ICJjbXBpYm5lIiwJMywgfSwJLyogMHgzZCAqLwotCSAgeyAiY21waWJsZSIsCTMsIH0sCS8qIDB4M2UgKi8KLQkgIHsgImNtcGlibyIsCTMsIH0sCS8qIDB4M2YgKi8KLQl9OwotCi0JaSA9ICgod29yZDEgPj4gMjQpICYgMHhmZikgLSAweDIwOwotCWlmICggY29icl90YWJbaV0ubmFtZSA9PSBOVUxMICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sIGNvYnJfdGFiW2ldLm5hbWUgKTsKLQlpZiAoIHdvcmQxICYgMiApewkJLyogUHJlZGljdHMgYnJhbmNoIG5vdCB0YWtlbiAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sICIuZiIgKTsKLQl9Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJcdCIgKTsKLQotCXNyYzEgPSAod29yZDEgPj4gMTkpICYgMHgxZjsKLQlzcmMyID0gKHdvcmQxID4+IDE0KSAmIDB4MWY7Ci0KLQlpZiAoIHdvcmQxICYgMHgwMjAwMCApewkJLyogTTEgaXMgMSAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVkIiwgc3JjMSApOwotCX0gZWxzZSB7CQkJLyogTTEgaXMgMCAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3NyYzFdICk7Ci0JfQotCi0JaWYgKCBjb2JyX3RhYltpXS5udW1vcHMgPiAxICl7Ci0JCWlmICggd29yZDEgJiAxICl7CQkvKiBTMiBpcyAxICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIixzZiVkLCIsIHNyYzIgKTsKLQkJfSBlbHNlIHsJCQkvKiBTMSBpcyAwICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwlcywiLCByZWdfbmFtZXNbc3JjMl0gKTsKLQkJfQotCi0JCS8qIEV4dHJhY3QgZGlzcGxhY2VtZW50IGFuZCBjb252ZXJ0IHRvIGFkZHJlc3MKLQkJICovCi0JCXdvcmQxICY9IDB4MDAwMDFmZmM7Ci0JCWlmICggd29yZDEgJiAweDAwMDAxMDAwICl7CS8qIE5lZ2F0aXZlIGRpc3BsYWNlbWVudCAqLwotCQkJd29yZDEgfD0gKC0xICYgfjB4MWZmZik7CS8qIFNpZ24gZXh0ZW5kICovCi0JCX0KLQkJcHJpbnRfYWRkciggbWVtYWRkciArIHdvcmQxICk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE1FTSBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAkJCQkvKiByZXR1cm5zIGluc3RydWN0aW9uIGxlbmd0aDogNCBvciA4ICovCi1tZW0oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiwgbm9wcmludCApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotICAgIGludCBub3ByaW50OwkJLyogSWYgVFJVRSwgcmV0dXJuIGluc3RydWN0aW9uIGxlbmd0aCwgYnV0Ci0JCQkJICogZG9uJ3Qgb3V0cHV0IGFueSB0ZXh0LgotCQkJCSAqLwotewotCWludCBpLCBqOwotCWludCBsZW47Ci0JaW50IG1vZGU7Ci0JaW50IG9mZnNldDsKLQljb25zdCBjaGFyICpyZWcxLCAqcmVnMiwgKnJlZzM7Ci0KLQkvKiBUaGlzIGxvb2t1cCB0YWJsZSBpcyB0b28gc3BhcnNlIHRvIG1ha2UgaXQgd29ydGggdHlwaW5nIGluLCBidXQgbm90Ci0JICAgc28gbGFyZ2UgYXMgdG8gbWFrZSBhIHNwYXJzZSBhcnJheSBuZWNlc3NhcnkuICBXZSBjcmVhdGUgdGhlIHRhYmxlCi0JICAgYXQgcnVudGltZS4gICovCi0KLQkvKgotCSAqIE5PVEU6IEluIHRoaXMgdGFibGUsIHRoZSBtZWFuaW5nIG9mICdudW1vcHMnIGlzOgotCSAqCSAxOiBzaW5nbGUgb3BlcmFuZAotCSAqCSAyOiAyIG9wZXJhbmRzLCBsb2FkIGluc3RydWN0aW9uCi0JICoJLTI6IDIgb3BlcmFuZHMsIHN0b3JlIGluc3RydWN0aW9uCi0JICovCi0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgKm1lbV90YWI7Ci0vKiBPcGNvZGVzIG9mIDB4OFgsIDlYLCBhWCwgYlgsIGFuZCBjWCBtdXN0IGJlIGluIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIE1FTV9NSU4JMHg4MAotI2RlZmluZSBNRU1fTUFYCTB4Y2YKLSNkZWZpbmUgTUVNX1NJWgkoICogc2l6ZW9mKHN0cnVjdCB0YWJlbnQpKQotCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyc2VfdGFiZW50IG1lbV9pbml0W10gPSB7Ci0JICB7IDB4ODAsCSJsZG9iIiwJIDIgfSwKLQkgIHsgMHg4MiwJInN0b2IiLAktMiB9LAotCSAgeyAweDg0LAkiYngiLAkgMSB9LAotCSAgeyAweDg1LAkiYmFseCIsCSAyIH0sCi0JICB7IDB4ODYsCSJjYWxseCIsIDEgfSwKLQkgIHsgMHg4OCwJImxkb3MiLAkgMiB9LAotCSAgeyAweDhhLAkic3RvcyIsCS0yIH0sCi0JICB7IDB4OGMsCSJsZGEiLAkgMiB9LAotCSAgeyAweDkwLAkibGQiLAkgMiB9LAotCSAgeyAweDkyLAkic3QiLAktMiB9LAotCSAgeyAweDk4LAkibGRsIiwJIDIgfSwKLQkgIHsgMHg5YSwJInN0bCIsCS0yIH0sCi0JICB7IDB4YTAsCSJsZHQiLAkgMiB9LAotCSAgeyAweGEyLAkic3R0IiwJLTIgfSwKLQkgIHsgMHhhYywJImRjaW52YSIsIDEgfSwKLQkgIHsgMHhiMCwJImxkcSIsCSAyIH0sCi0JICB7IDB4YjIsCSJzdHEiLAktMiB9LAotCSAgeyAweGMwLAkibGRpYiIsCSAyIH0sCi0JICB7IDB4YzIsCSJzdGliIiwJLTIgfSwKLQkgIHsgMHhjOCwJImxkaXMiLAkgMiB9LAotCSAgeyAweGNhLAkic3RpcyIsCS0yIH0sCi0JICB7IDAsCQlOVUxMLAkwIH0KLQl9OwotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50IG1lbV90YWJfYnVmW01FTV9NQVggLSBNRU1fTUlOICsgMV07Ci0KLQlpZiAoIG1lbV90YWIgPT0gTlVMTCApewotCQltZW1fdGFiID0gbWVtX3RhYl9idWY7Ci0JCWZvciAoIGkgPSAwOyBtZW1faW5pdFtpXS5vcGNvZGUgIT0gMDsgaSsrICl7Ci0JCQlqID0gbWVtX2luaXRbaV0ub3Bjb2RlIC0gTUVNX01JTjsKLQkJCW1lbV90YWJbal0ubmFtZSA9IG1lbV9pbml0W2ldLm5hbWU7Ci0JCQltZW1fdGFiW2pdLm51bW9wcyA9IG1lbV9pbml0W2ldLm51bW9wczsKLQkJfQotCX0KLQotCWkgPSAoKHdvcmQxID4+IDI0KSAmIDB4ZmYpIC0gTUVNX01JTjsKLQltb2RlID0gKHdvcmQxID4+IDEwKSAmIDB4ZjsKLQotCWlmICggKG1lbV90YWJbaV0ubmFtZSAhPSBOVUxMKQkJLyogVmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLQkmJiAgICgobW9kZSA9PSA1KSB8fCAobW9kZSA+PTEyKSkgKXsJLyogV2l0aCAzMi1iaXQgZGlzcGxhY2VtZW50ICovCi0JCWxlbiA9IDg7Ci0JfSBlbHNlIHsKLQkJbGVuID0gNDsKLQl9Ci0KLQlpZiAoIG5vcHJpbnQgKXsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlpZiAoIChtZW1fdGFiW2ldLm5hbWUgPT0gTlVMTCkgfHwgKG1vZGUgPT0gNikgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVzXHQiLCBtZW1fdGFiW2ldLm5hbWUgKTsKLQotCXJlZzEgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxOSkgJiAweDFmIF07CS8qIE1FTUIgb25seSAqLwotCXJlZzIgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxNCkgJiAweDFmIF07Ci0JcmVnMyA9IHJlZ19uYW1lc1sgd29yZDEgJiAweDFmIF07CQkvKiBNRU1CIG9ubHkgKi8KLQlvZmZzZXQgPSB3b3JkMSAmIDB4ZmZmOwkJCQkvKiBNRU1BIG9ubHkgICovCi0KLQlzd2l0Y2ggKCBtZW1fdGFiW2ldLm51bW9wcyApewotCi0JY2FzZSAyOiAvKiBMT0FEIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSAmIDQgKXsJCQkvKiBNRU1CIEZPUk1BVCAqLwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIC0yOiAvKiBTVE9SRSBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgJiA0ICl7CQkJLyogTUVNQiBGT1JNQVQgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJXMsIiwgcmVnMSApOwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlcywweCV4IiwgcmVnMSwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKLQkJCWlmIChtb2RlICYgOCkgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgMTogLyogQlgvQ0FMTFggSU5TVFJVQ1RJT04gKi8KLQkJaWYgKCBtb2RlICYgNCApewkJCS8qIE1FTUIgRk9STUFUICovCi0JCQllYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUkVHIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcmVnKCB3b3JkMSApCi0gICAgdW5zaWduZWQgbG9uZyB3b3JkMTsKLXsKLQlpbnQgaSwgajsKLQlpbnQgb3Bjb2RlOwotCWludCBmcDsKLQlpbnQgbTEsIG0yLCBtMzsKLQlpbnQgczEsIHMyOwotCWludCBzcmMsIHNyYzIsIGRzdDsKLQljaGFyICptbmVtcDsKLQotCS8qIFRoaXMgbG9va3VwIHRhYmxlIGlzIHRvbyBzcGFyc2UgdG8gbWFrZSBpdCB3b3J0aCB0eXBpbmcgaW4sIGJ1dCBub3QKLQkgICBzbyBsYXJnZSBhcyB0byBtYWtlIGEgc3BhcnNlIGFycmF5IG5lY2Vzc2FyeS4gIFdlIGNyZWF0ZSB0aGUgdGFibGUKLQkgICBhdCBydW50aW1lLiAgKi8KLQotCS8qCi0JICogTk9URTogSW4gdGhpcyB0YWJsZSwgdGhlIG1lYW5pbmcgb2YgJ251bW9wcycgaXM6Ci0JICoJIDE6IHNpbmdsZSBvcGVyYW5kLCB3aGljaCBpcyBOT1QgYSBkZXN0aW5hdGlvbi4KLQkgKgktMTogc2luZ2xlIG9wZXJhbmQsIHdoaWNoIElTIGEgZGVzdGluYXRpb24uCi0JICoJIDI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggaXMgTk9UIGEgZGVzdGluYXRpb24uCi0JICoJLTI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggSVMgYSBkZXN0aW5hdGlvbi4KLQkgKgkgMzogMyBvcGVyYW5kcwotCSAqCi0JICoJSWYgYW4gb3Bjb2RlIG1uZW1vbmljIGJlZ2lucyB3aXRoICJGIiwgaXQgaXMgYSBmbG9hdGluZy1wb2ludAotCSAqCW9wY29kZSAodGhlICJGIiBpcyBub3QgcHJpbnRlZCkuCi0JICovCi0KLQlzdGF0aWMgc3RydWN0IHRhYmVudCAqcmVnX3RhYjsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJzZV90YWJlbnQgcmVnX2luaXRbXSA9IHsKLSNkZWZpbmUgUkVHX01JTgkweDU4MAotCSAgeyAweDU4MCwJIm5vdGJpdCIsCTMgfSwKLQkgIHsgMHg1ODEsCSJhbmQiLAkJMyB9LAotCSAgeyAweDU4MiwJImFuZG5vdCIsCTMgfSwKLQkgIHsgMHg1ODMsCSJzZXRiaXQiLAkzIH0sCi0JICB7IDB4NTg0LAkibm90YW5kIiwJMyB9LAotCSAgeyAweDU4NiwJInhvciIsCQkzIH0sCi0JICB7IDB4NTg3LAkib3IiLAkJMyB9LAotCSAgeyAweDU4OCwJIm5vciIsCQkzIH0sCi0JICB7IDB4NTg5LAkieG5vciIsCQkzIH0sCi0JICB7IDB4NThhLAkibm90IiwJCS0yIH0sCi0JICB7IDB4NThiLAkib3Jub3QiLAkzIH0sCi0JICB7IDB4NThjLAkiY2xyYml0IiwJMyB9LAotCSAgeyAweDU4ZCwJIm5vdG9yIiwJMyB9LAotCSAgeyAweDU4ZSwJIm5hbmQiLAkJMyB9LAotCSAgeyAweDU4ZiwJImFsdGVyYml0IiwJMyB9LAotCSAgeyAweDU5MCwgCSJhZGRvIiwJCTMgfSwKLQkgIHsgMHg1OTEsIAkiYWRkaSIsCQkzIH0sCi0JICB7IDB4NTkyLCAJInN1Ym8iLAkJMyB9LAotCSAgeyAweDU5MywgCSJzdWJpIiwJCTMgfSwKLQkgIHsgMHg1OTQsCSJjbXBvYiIsCTIgfSwKLQkgIHsgMHg1OTUsCSJjbXBpYiIsCTIgfSwKLQkgIHsgMHg1OTYsCSJjbXBvcyIsCTIgfSwKLQkgIHsgMHg1OTcsCSJjbXBpcyIsCTIgfSwKLQkgIHsgMHg1OTgsIAkic2hybyIsCQkzIH0sCi0JICB7IDB4NTlhLCAJInNocmRpIiwJMyB9LAotCSAgeyAweDU5YiwgCSJzaHJpIiwJCTMgfSwKLQkgIHsgMHg1OWMsIAkic2hsbyIsCQkzIH0sCi0JICB7IDB4NTlkLCAJInJvdGF0ZSIsCTMgfSwKLQkgIHsgMHg1OWUsIAkic2hsaSIsCQkzIH0sCi0JICB7IDB4NWEwLCAJImNtcG8iLAkJMiB9LAotCSAgeyAweDVhMSwgCSJjbXBpIiwJCTIgfSwKLQkgIHsgMHg1YTIsIAkiY29uY21wbyIsCTIgfSwKLQkgIHsgMHg1YTMsIAkiY29uY21waSIsCTIgfSwKLQkgIHsgMHg1YTQsIAkiY21waW5jbyIsCTMgfSwKLQkgIHsgMHg1YTUsIAkiY21waW5jaSIsCTMgfSwKLQkgIHsgMHg1YTYsIAkiY21wZGVjbyIsCTMgfSwKLQkgIHsgMHg1YTcsIAkiY21wZGVjaSIsCTMgfSwKLQkgIHsgMHg1YWMsIAkic2NhbmJ5dGUiLAkyIH0sCi0JICB7IDB4NWFkLAkiYnN3YXAiLAktMiB9LAotCSAgeyAweDVhZSwgCSJjaGtiaXQiLAkyIH0sCi0JICB7IDB4NWIwLCAJImFkZGMiLAkJMyB9LAotCSAgeyAweDViMiwgCSJzdWJjIiwJCTMgfSwKLQkgIHsgMHg1YjQsCSJpbnRkaXMiLAkwIH0sCi0JICB7IDB4NWI1LAkiaW50ZW4iLAkwIH0sCi0JICB7IDB4NWNjLAkibW92IiwJCS0yIH0sCi0JICB7IDB4NWQ4LAkiZXNocm8iLAkzIH0sCi0JICB7IDB4NWRjLAkibW92bCIsCQktMiB9LAotCSAgeyAweDVlYywJIm1vdnQiLAkJLTIgfSwKLQkgIHsgMHg1ZmMsCSJtb3ZxIiwJCS0yIH0sCi0JICB7IDB4NjAwLAkic3lubW92IiwJMiB9LAotCSAgeyAweDYwMSwJInN5bm1vdmwiLAkyIH0sCi0JICB7IDB4NjAyLAkic3lubW92cSIsCTIgfSwKLQkgIHsgMHg2MDMsCSJjbXBzdHIiLAkzIH0sCi0JICB7IDB4NjA0LAkibW92cXN0ciIsCTMgfSwKLQkgIHsgMHg2MDUsCSJtb3ZzdHIiLAkzIH0sCi0JICB7IDB4NjEwLAkiYXRtb2QiLAkzIH0sCi0JICB7IDB4NjEyLAkiYXRhZGQiLAkzIH0sCi0JICB7IDB4NjEzLAkiaW5zcGFjYyIsCS0yIH0sCi0JICB7IDB4NjE0LAkibGRwaHkiLAktMiB9LAotCSAgeyAweDYxNSwJInN5bmxkIiwJLTIgfSwKLQkgIHsgMHg2MTcsCSJmaWxsIiwJCTMgfSwKLQkgIHsgMHg2MzAsCSJzZG1hIiwJCTMgfSwKLQkgIHsgMHg2MzEsCSJ1ZG1hIiwJCTAgfSwKLQkgIHsgMHg2NDAsCSJzcGFuYml0IiwJLTIgfSwKLQkgIHsgMHg2NDEsCSJzY2FuYml0IiwJLTIgfSwKLQkgIHsgMHg2NDIsCSJkYWRkYyIsCTMgfSwKLQkgIHsgMHg2NDMsCSJkc3ViYyIsCTMgfSwKLQkgIHsgMHg2NDQsCSJkbW92dCIsCS0yIH0sCi0JICB7IDB4NjQ1LAkibW9kYWMiLAkzIH0sCi0JICB7IDB4NjQ2LAkiY29uZHJlYyIsCS0yIH0sCi0JICB7IDB4NjUwLAkibW9kaWZ5IiwJMyB9LAotCSAgeyAweDY1MSwJImV4dHJhY3QiLAkzIH0sCi0JICB7IDB4NjU0LAkibW9kdGMiLAkzIH0sCi0JICB7IDB4NjU1LAkibW9kcGMiLAkzIH0sCi0JICB7IDB4NjU2LAkicmVjZWl2ZSIsCS0yIH0sCi0JICB7IDB4NjU4LAkiaW50Y3RsIiwJLTIgfSwKLQkgIHsgMHg2NTksCSJzeXNjdGwiLAkzIH0sCi0JICB7IDB4NjViLAkiaWNjdGwiLAkzIH0sCi0JICB7IDB4NjVjLAkiZGNjdGwiLAkzIH0sCi0JICB7IDB4NjVkLAkiaGFsdCIsCQkwIH0sCi0JICB7IDB4NjYwLAkiY2FsbHMiLAkxIH0sCi0JICB7IDB4NjYyLAkic2VuZCIsCQkzIH0sCi0JICB7IDB4NjYzLAkic2VuZHNlcnYiLAkxIH0sCi0JICB7IDB4NjY0LAkicmVzdW1wcmNzIiwJMSB9LAotCSAgeyAweDY2NSwJInNjaGVkcHJjcyIsCTEgfSwKLQkgIHsgMHg2NjYsCSJzYXZlcHJjcyIsCTAgfSwKLQkgIHsgMHg2NjgsCSJjb25kd2FpdCIsCTEgfSwKLQkgIHsgMHg2NjksCSJ3YWl0IiwJCTEgfSwKLQkgIHsgMHg2NmEsCSJzaWduYWwiLAkxIH0sCi0JICB7IDB4NjZiLAkibWFyayIsCQkwIH0sCi0JICB7IDB4NjZjLAkiZm1hcmsiLAkwIH0sCi0JICB7IDB4NjZkLAkiZmx1c2hyZWciLAkwIH0sCi0JICB7IDB4NjZmLAkic3luY2YiLAkwIH0sCi0JICB7IDB4NjcwLAkiZW11bCIsCQkzIH0sCi0JICB7IDB4NjcxLAkiZWRpdiIsCQkzIH0sCi0JICB7IDB4NjczLCAJImxkdGltZSIsCS0xIH0sCi0JICB7IDB4Njc0LAkiRmN2dGlyIiwJLTIgfSwKLQkgIHsgMHg2NzUsCSJGY3Z0aWxyIiwJLTIgfSwKLQkgIHsgMHg2NzYsCSJGc2NhbGVybCIsCTMgfSwKLQkgIHsgMHg2NzcsCSJGc2NhbGVyIiwJMyB9LAotCSAgeyAweDY4MCwJIkZhdGFuciIsCTMgfSwKLQkgIHsgMHg2ODEsCSJGbG9nZXByIiwJMyB9LAotCSAgeyAweDY4MiwJIkZsb2dyIiwJMyB9LAotCSAgeyAweDY4MywJIkZyZW1yIiwJMyB9LAotCSAgeyAweDY4NCwJIkZjbXBvciIsCTIgfSwKLQkgIHsgMHg2ODUsCSJGY21wciIsCTIgfSwKLQkgIHsgMHg2ODgsCSJGc3FydHIiLAktMiB9LAotCSAgeyAweDY4OSwJIkZleHByIiwJLTIgfSwKLQkgIHsgMHg2OGEsCSJGbG9nYm5yIiwJLTIgfSwKLQkgIHsgMHg2OGIsCSJGcm91bmRyIiwJLTIgfSwKLQkgIHsgMHg2OGMsCSJGc2luciIsCS0yIH0sCi0JICB7IDB4NjhkLAkiRmNvc3IiLAktMiB9LAotCSAgeyAweDY4ZSwJIkZ0YW5yIiwJLTIgfSwKLQkgIHsgMHg2OGYsCSJGY2xhc3NyIiwJMSB9LAotCSAgeyAweDY5MCwJIkZhdGFucmwiLAkzIH0sCi0JICB7IDB4NjkxLAkiRmxvZ2VwcmwiLAkzIH0sCi0JICB7IDB4NjkyLAkiRmxvZ3JsIiwJMyB9LAotCSAgeyAweDY5MywJIkZyZW1ybCIsCTMgfSwKLQkgIHsgMHg2OTQsCSJGY21wb3JsIiwJMiB9LAotCSAgeyAweDY5NSwJIkZjbXBybCIsCTIgfSwKLQkgIHsgMHg2OTgsCSJGc3FydHJsIiwJLTIgfSwKLQkgIHsgMHg2OTksCSJGZXhwcmwiLAktMiB9LAotCSAgeyAweDY5YSwJIkZsb2dibnJsIiwJLTIgfSwKLQkgIHsgMHg2OWIsCSJGcm91bmRybCIsCS0yIH0sCi0JICB7IDB4NjljLAkiRnNpbnJsIiwJLTIgfSwKLQkgIHsgMHg2OWQsCSJGY29zcmwiLAktMiB9LAotCSAgeyAweDY5ZSwJIkZ0YW5ybCIsCS0yIH0sCi0JICB7IDB4NjlmLAkiRmNsYXNzcmwiLAkxIH0sCi0JICB7IDB4NmMwLAkiRmN2dHJpIiwJLTIgfSwKLQkgIHsgMHg2YzEsCSJGY3Z0cmlsIiwJLTIgfSwKLQkgIHsgMHg2YzIsCSJGY3Z0enJpIiwJLTIgfSwKLQkgIHsgMHg2YzMsCSJGY3Z0enJpbCIsCS0yIH0sCi0JICB7IDB4NmM5LAkiRm1vdnIiLAktMiB9LAotCSAgeyAweDZkOSwJIkZtb3ZybCIsCS0yIH0sCi0JICB7IDB4NmUxLCAJIkZtb3ZyZSIsCS0yIH0sCi0JICB7IDB4NmUyLCAJIkZjcHlzcmUiLAkzIH0sCi0JICB7IDB4NmUzLCAJIkZjcHlyc3JlIiwJMyB9LAotCSAgeyAweDcwMSwJIm11bG8iLAkJMyB9LAotCSAgeyAweDcwOCwJInJlbW8iLAkJMyB9LAotCSAgeyAweDcwYiwJImRpdm8iLAkJMyB9LAotCSAgeyAweDc0MSwJIm11bGkiLAkJMyB9LAotCSAgeyAweDc0OCwJInJlbWkiLAkJMyB9LAotCSAgeyAweDc0OSwJIm1vZGkiLAkJMyB9LAotCSAgeyAweDc0YiwJImRpdmkiLAkJMyB9LAotCSAgeyAweDc4MCwJImFkZG9ubyIsCTMgfSwKLQkgIHsgMHg3ODEsCSJhZGRpbm8iLAkzIH0sCi0JICB7IDB4NzgyLAkic3Vib25vIiwJMyB9LAotCSAgeyAweDc4MywJInN1YmlubyIsCTMgfSwKLQkgIHsgMHg3ODQsCSJzZWxubyIsCTMgfSwKLQkgIHsgMHg3OGIsCSJGZGl2ciIsCTMgfSwKLQkgIHsgMHg3OGMsCSJGbXVsciIsCTMgfSwKLQkgIHsgMHg3OGQsCSJGc3ViciIsCTMgfSwKLQkgIHsgMHg3OGYsCSJGYWRkciIsCTMgfSwKLQkgIHsgMHg3OTAsCSJhZGRvZyIsCTMgfSwKLQkgIHsgMHg3OTEsCSJhZGRpZyIsICAgICAgICAzIH0sCi0JICB7IDB4NzkyLAkic3Vib2ciLAkzIH0sCi0JICB7IDB4NzkzLAkic3ViaWciLAkzIH0sCi0JICB7IDB4Nzk0LAkic2VsZyIsCQkzIH0sCi0JICB7IDB4NzliLAkiRmRpdnJsIiwJMyB9LAotCSAgeyAweDc5YywJIkZtdWxybCIsCTMgfSwKLQkgIHsgMHg3OWQsCSJGc3VicmwiLAkzIH0sCi0JICB7IDB4NzlmLAkiRmFkZHJsIiwJMyB9LAotCSAgeyAweDdhMCwJImFkZG9lIiwJMyB9LAotCSAgeyAweDdhMSwJImFkZGllIiwgICAgICAgIDMgfSwKLQkgIHsgMHg3YTIsCSJzdWJvZSIsCTMgfSwKLQkgIHsgMHg3YTMsCSJzdWJpZSIsCTMgfSwKLQkgIHsgMHg3YTQsCSJzZWxlIiwJCTMgfSwKLQkgIHsgMHg3YjAsCSJhZGRvZ2UiLAkzIH0sCi0JICB7IDB4N2IxLAkiYWRkaWdlIiwJMyB9LAotCSAgeyAweDdiMiwJInN1Ym9nZSIsCTMgfSwKLQkgIHsgMHg3YjMsCSJzdWJpZ2UiLAkzIH0sCi0JICB7IDB4N2I0LAkic2VsZ2UiLAkzIH0sCi0JICB7IDB4N2MwLAkiYWRkb2wiLAkzIH0sCi0JICB7IDB4N2MxLAkiYWRkaWwiLAkzIH0sCi0JICB7IDB4N2MyLAkic3Vib2wiLAkzIH0sCi0JICB7IDB4N2MzLAkic3ViaWwiLAkzIH0sCi0JICB7IDB4N2M0LAkic2VsbCIsCQkzIH0sCi0JICB7IDB4N2QwLAkiYWRkb25lIiwJMyB9LAotCSAgeyAweDdkMSwJImFkZGluZSIsCTMgfSwKLQkgIHsgMHg3ZDIsCSJzdWJvbmUiLAkzIH0sCi0JICB7IDB4N2QzLAkic3ViaW5lIiwJMyB9LAotCSAgeyAweDdkNCwJInNlbG5lIiwJMyB9LAotCSAgeyAweDdlMCwJImFkZG9sZSIsCTMgfSwKLQkgIHsgMHg3ZTEsCSJhZGRpbGUiLAkzIH0sCi0JICB7IDB4N2UyLAkic3Vib2xlIiwJMyB9LAotCSAgeyAweDdlMywJInN1YmlsZSIsCTMgfSwKLQkgIHsgMHg3ZTQsCSJzZWxsZSIsCTMgfSwKLQkgIHsgMHg3ZjAsCSJhZGRvbyIsCTMgfSwKLQkgIHsgMHg3ZjEsCSJhZGRpbyIsCTMgfSwKLQkgIHsgMHg3ZjIsCSJzdWJvbyIsCTMgfSwKLQkgIHsgMHg3ZjMsCSJzdWJpbyIsCTMgfSwKLQkgIHsgMHg3ZjQsCSJzZWxvIiwJCTMgfSwKLSNkZWZpbmUgUkVHX01BWCAweDdmNAotCSAgeyAwLAkJTlVMTCwJCTAgfQotCX07Ci0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgcmVnX3RhYl9idWZbUkVHX01BWCAtIFJFR19NSU4gKyAxXTsKLQotCWlmICggcmVnX3RhYiA9PSBOVUxMICl7Ci0JCXJlZ190YWIgPSByZWdfdGFiX2J1ZjsKLQkJZm9yICggaSA9IDA7IHJlZ19pbml0W2ldLm9wY29kZSAhPSAwOyBpKysgKXsKLQkJCWogPSByZWdfaW5pdFtpXS5vcGNvZGUgLSBSRUdfTUlOOwotCQkJcmVnX3RhYltqXS5uYW1lID0gcmVnX2luaXRbaV0ubmFtZTsKLQkJCXJlZ190YWJbal0ubnVtb3BzID0gcmVnX2luaXRbaV0ubnVtb3BzOwotCQl9Ci0JfQotCi0Jb3Bjb2RlID0gKCh3b3JkMSA+PiAyMCkgJiAweGZmMCkgfCAoKHdvcmQxID4+IDcpICYgMHhmKTsKLQlpID0gb3Bjb2RlIC0gUkVHX01JTjsKLQotCWlmICggKG9wY29kZTxSRUdfTUlOKSB8fCAob3Bjb2RlPlJFR19NQVgpIHx8IChyZWdfdGFiW2ldLm5hbWU9PU5VTEwpICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQltbmVtcCA9IHJlZ190YWJbaV0ubmFtZTsKLQlpZiAoICptbmVtcCA9PSAnRicgKXsKLQkJZnAgPSAxOwotCQltbmVtcCsrOwotCX0gZWxzZSB7Ci0JCWZwID0gMDsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgbW5lbXAgKTsKLQotCXMxICAgPSAod29yZDEgPj4gNSkgICYgMTsKLQlzMiAgID0gKHdvcmQxID4+IDYpICAmIDE7Ci0JbTEgICA9ICh3b3JkMSA+PiAxMSkgJiAxOwotCW0yICAgPSAod29yZDEgPj4gMTIpICYgMTsKLQltMyAgID0gKHdvcmQxID4+IDEzKSAmIDE7Ci0Jc3JjICA9ICB3b3JkMSAgICAgICAgJiAweDFmOwotCXNyYzIgPSAod29yZDEgPj4gMTQpICYgMHgxZjsKLQlkc3QgID0gKHdvcmQxID4+IDE5KSAmIDB4MWY7Ci0KLQlpZiAgKCByZWdfdGFiW2ldLm51bW9wcyAhPSAwICl7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0KLQkJc3dpdGNoICggcmVnX3RhYltpXS5udW1vcHMgKXsKLQkJY2FzZSAxOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTE6Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTI6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi0vKgotICogUHJpbnQgb3V0IGVmZmVjdGl2ZSBhZGRyZXNzIGZvciBtZW1iIGluc3RydWN0aW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGludCBtb2RlOwotICAgICBjaGFyICpyZWcyLCAqcmVnMzsKLSAgICAgaW50IHdvcmQxOwotICAgICB1bnNpZ25lZCBpbnQgd29yZDI7Ci17Ci0JaW50IHNjYWxlOwotCXN0YXRpYyBjb25zdCBpbnQgc2NhbGVfdGFiW10gPSB7IDEsIDIsIDQsIDgsIDE2IH07Ci0KLQlzY2FsZSA9ICh3b3JkMSA+PiA3KSAmIDB4MDc7Ci0JaWYgKCAoc2NhbGUgPiA0KSB8fCAoKCh3b3JkMSA+PiA1KSAmIDB4MDMpICE9IDApICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0Jc2NhbGUgPSBzY2FsZV90YWJbc2NhbGVdOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSA0OgkgCQkJCQkvKiAocmVnKSAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCWJyZWFrOwotCWNhc2UgNToJCQkJCQkvKiBkaXNwbCs4KGlwKSAqLwotCQlwcmludF9hZGRyKCB3b3JkMis4K21lbWFkZHIgKTsKLQkJYnJlYWs7Ci0JY2FzZSA3OgkJCQkJCS8qIChyZWcpW2luZGV4KnNjYWxlXSAqLwotCQlpZiAoc2NhbGUgPT0gMSkgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzXSIsIHJlZzIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslcyolZF0iLHJlZzIscmVnMyxzY2FsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxMjoJCQkJCS8qIGRpc3BsYWNlbWVudCAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQlicmVhazsKLQljYXNlIDEzOgkJCQkJLyogZGlzcGwocmVnKSAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCWJyZWFrOwotCWNhc2UgMTQ6CQkJCQkvKiBkaXNwbFtpbmRleCpzY2FsZV0gKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzXSIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzKiVkXSIsIHJlZzMsIHNjYWxlICk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxNToJCQkJLyogZGlzcGwocmVnKVtpbmRleCpzY2FsZV0gKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslc10iLCByZWcyLCByZWczICk7Ci0JCX0gZWxzZSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXMqJWRdIixyZWcyLHJlZzMsc2NhbGUgKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSZWdpc3RlciBJbnN0cnVjdGlvbiBPcGVyYW5kICAJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJlZ29wKCBtb2RlLCBzcGVjLCByZWcsIGZwICkKLSAgICBpbnQgbW9kZSwgc3BlYywgcmVnLCBmcDsKLXsKLQlpZiAoIGZwICl7CQkJCS8qIEZMT0FUSU5HIFBPSU5UIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSA9PSAxICl7CQkJLyogRlAgb3BlcmFuZCAqLwotCQkJc3dpdGNoICggcmVnICl7Ci0JCQljYXNlIDA6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMCIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMSIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMiIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDM6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMyIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE2OiAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjBmMC4wIiApOwotCQkJICBicmVhazsKLQkJCWNhc2UgMjI6ICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiMGYxLjAiICk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDogKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICI/IiApOwotCQkJICBicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsJCQkJLyogTm9uLUZQIHJlZ2lzdGVyICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3JlZ10gKTsKLQkJfQotCX0gZWxzZSB7CQkJCS8qIE5PVCBGTE9BVElORyBQT0lOVCAqLwotCQlpZiAoIG1vZGUgPT0gMSApewkJCS8qIExpdGVyYWwgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJWQiLCByZWcgKTsKLQkJfSBlbHNlIHsJCQkJLyogUmVnaXN0ZXIgKi8KLQkJCWlmICggc3BlYyA9PSAwICl7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tyZWddICk7Ci0JCQl9IGVsc2UgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAic2YlZCIsIHJlZyApOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUmVnaXN0ZXIgSW5zdHJ1Y3Rpb24gRGVzdGluYXRpb24gT3BlcmFuZAkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1kc3RvcCggbW9kZSwgcmVnLCBmcCApCi0gICAgaW50IG1vZGUsIHJlZywgZnA7Ci17Ci0JLyogJ2RzdCcgb3BlcmFuZCBjYW4ndCBiZSBhIGxpdGVyYWwuIE9uIG5vbi1GUCBpbnN0cnVjdGlvbnMsICByZWdpc3RlcgotCSAqIG1vZGUgaXMgYXNzdW1lZCBhbmQgIm0zIiBhY3RzIGFzIGlmIHdlcmUgInMzIjsgIG9uIEZQLWluc3RydWN0aW9ucywKLQkgKiBzZiByZWdpc3RlcnMgYXJlIG5vdCBhbGxvd2VkIHNvIG0zIGFjdHMgbm9ybWFsbHkuCi0JICovCi0JIGlmICggZnAgKXsKLQkJcmVnb3AoIG1vZGUsIDAsIHJlZywgZnAgKTsKLQkgfSBlbHNlIHsKLQkJcmVnb3AoIDAsIG1vZGUsIHJlZywgZnAgKTsKLQkgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnZhbGlkKCB3b3JkMSApCi0gICAgaW50IHdvcmQxOwotewotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLndvcmRcdDB4JTA4eCIsICh1bnNpZ25lZCkgd29yZDEgKTsKLX0JCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyKGEpCi1iZmRfdm1hIGE7Ci17Ci0gICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYSwgaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdXRfYWJzKCB3b3JkMSwgd29yZDIgKQotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotI2lmZGVmIElOX0dEQgotCXJldHVybjsKLSNlbHNlCi0JaW50IGxlbjsKLQotCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKLQljYXNlIDB4ODoKLQljYXNlIDB4OToKLQljYXNlIDB4YToKLQljYXNlIDB4YjoKLQljYXNlIDB4YzoKLQkJLyogTUVNIGZvcm1hdCBpbnN0cnVjdGlvbiAqLwotCQlsZW4gPSBtZW0oIDAsIHdvcmQxLCB3b3JkMiwgMSApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSA0OwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIGxlbiA9PSA4ICl7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJTA4eCAlMDh4XHQiLCB3b3JkMSwgd29yZDIgKTsKLQl9IGVsc2UgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiUwOHggICAgICAgICBcdCIsIHdvcmQxICk7Ci0JfQotOwotCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMjAwLWRpcy5jIGIvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmM3ZTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgTU4xMDIwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMjAwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIHZvaWQgZGlzYXNzZW1ibGUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgdW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nLAotCQkJCSB1bnNpZ25lZCBpbnQpKTsKLQotaW50IAotcHJpbnRfaW5zbl9tbjEwMjAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOwotICB1bnNpZ25lZCBpbnQgY29uc3VtZTsKLQotICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIG9wY29kZSBpcy4gICovCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaW5zbiA9ICoodW5zaWduZWQgY2hhciAqKSBidWZmZXI7Ci0KLSAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLiAgKi8KLSAgaWYgKChpbnNuICYgMHhmMCkgPT0gMHgwMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDEwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MjAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgzMAotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhhMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweGIwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZWIKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNgotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZlCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmYpCi0gICAgewotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAxOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4NDAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NzAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZTAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZTQKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZTgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZTkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZWEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjIKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjMpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gMjsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMgd2l0aCBhIDE2Yml0IG9wZXJhbmQgaW4gbGl0dGxlCi0gICAgIGVuZGlhbiBmb3JtLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGYwKSA9PSAweGMwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGRjCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGVjCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY5Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZjCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZkKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPDw9IDE2OwotICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMgdG9vLCBidXQgd2UgZG9uJ3QgaGF2ZSB0byBtZXNzIHdpdGgKLSAgICAgZW5kaWFubmVzcyBzdHVmZi4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIDw8PSAxNjsKLSAgICAgIGluc24gfD0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gMzsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZvdXIgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgaW5zbiA8PD0gMTY7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgY29uc3VtZSA9IDQ7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmaXZlIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjQpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDE2OwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNCwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICgqKHVuc2lnbmVkIGNoYXIgKilidWZmZXIgPDwgOCkgJiAweGZmMDA7Ci0KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAzLCBidWZmZXIsIDEsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gfD0gKCoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcikgJiAweGZmOwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBleHRlbnNpb24gPSAoKih1bnNpZ25lZCBjaGFyICopYnVmZmVyKSAmIDB4ZmY7Ci0gICAgICBjb25zdW1lID0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDJ4IiksIGluc24pOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuLCBleHRlbnNpb24sIGNvbnN1bWUpOwotCi0gIHJldHVybiBjb25zdW1lOwotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIGV4dGVuc2lvbiwgc2l6ZSkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIGV4dGVuc2lvbjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3AgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopbW4xMDIwMF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICBpbnQgbWF0Y2ggPSAwOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZS4gICovCi0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpbnQgbXlzaXplLCBleHRyYV9zaGlmdDsKLQotICAgICAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzEpCi0JbXlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzIKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNCkKLQlteXNpemUgPSAyOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMwotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF81KQotCW15c2l6ZSA9IDM7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF82KQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF83KQotCW15c2l6ZSA9IDU7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0JCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcC0+Zm9ybWF0ID09IEZNVF81KQotCWV4dHJhX3NoaWZ0ID0gODsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzMKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF83KQotCWV4dHJhX3NoaWZ0ID0gMTY7Ci0gICAgICBlbHNlCi0JZXh0cmFfc2hpZnQgPSAwOwotCi0gICAgICBpZiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZQotCSAgJiYgc2l6ZSA9PSAodW5zaWduZWQgaW50KSBteXNpemUpCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0JICB1bnNpZ25lZCBpbnQgbm9jb21tYTsKLQkgIGludCBwYXJlbiA9IDA7Ci0JICAKLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLQotCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBub2NvbW1hID0gMTsKLQkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgICAgIG9waW5kZXhfcHRyKyspCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0JICAgICAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoaW5zbiAmIDB4ZmZmZikgPDwgODsKLQkJICB2YWx1ZSB8PSBleHRlbnNpb247Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQpKQotCQkJICAgJiAoKDFMIDw8IG9wZXJhbmQtPmJpdHMpIC0gMUwpKTsKLQkJfQotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JCXZhbHVlID0gKChsb25nKSh2YWx1ZSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkKLQkJCSAgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpOwotCi0JICAgICAgaWYgKCFub2NvbW1hCi0JCSAgJiYgKCFwYXJlbgotCQkgICAgICB8fCAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BBUkVOKSA9PSAwKSkpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCi0JICAgICAgbm9jb21tYSA9IDA7Ci0JCQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRFJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZCVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfQVJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUFNXKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInBzdyIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX01EUikgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJtZHIiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikgIT0gMCkKLQkJewotCQkgIGlmIChwYXJlbikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JCSAgICAgIG5vY29tbWEgPSAxOwotCQkgICAgfQotCQkgIHBhcmVuID0gIXBhcmVuOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUENSRUwpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKHZhbHVlICsgbWVtYWRkciArIG15c2l6ZSkgJiAweGZmZmZmZiwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTUVNQUREUikgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIAotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLQkgICAgfQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDRseCIpLCBpbnNuKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDIwMC1vcGMuYyBiL29wY29kZXMvbTEwMjAwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjcwYjkwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMjAwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qIEFzc2VtYmxlIE1hdHN1c2hpdGEgTU4xMDIwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMjAwLmgiCi0KLQwKLWNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgbW4xMDIwMF9vcGVyYW5kc1tdID0gewotI2RlZmluZSBVTlVTRUQJMAotICB7MCwgMCwgMH0sIAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMCAgICAgIChVTlVTRUQrMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4xICAgICAgKEROMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMCAgICAgIChETjErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE0xICAgICAgKERNMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMCAgICAgIChETTErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4xICAgICAgKEFOMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMCAgICAgIChBTjErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0xICAgICAgKEFNMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NOCAgICAoQU0xKzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTYgICAgKElNTTgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBwYy1yZWxhdGl2ZSBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgcGMtcmVsYXRpdmUgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTZfUENSRUwgICAgKElNTTE2KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDE2Yml0IHVuc2lnbmVkIGRpc3BhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU0xNl9NRU0gICAgKElNTTE2X1BDUkVMKzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMjAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDI0IGltbWVkaWF0ZSwgbG93IDE2IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLiAgKi8KLQotI2RlZmluZSBJTU0yNCAgICAoSU1NMTZfTUVNKzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEfSwKLQotLyogMzJiaXQgcGMtcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMjRfUENSRUwgICAgKElNTTI0KzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDMyYml0IG1lbW9yeSBvZmZzZXQuICAqLwotI2RlZmluZSBJTU0yNF9NRU0gICAgKElNTTI0X1BDUkVMKzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDIwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiBQcm9jZXNzb3Igc3RhdHVzIHdvcmQuICAqLwotI2RlZmluZSBQU1cgICAgKElNTTI0X01FTSsxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BTV30sCi0KLS8qIE1EUiByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1EUiAgICAoUFNXKzEpCi0gIHswLCAwLCBNTjEwMjAwX09QRVJBTkRfTURSfSwKLQotLyogSW5kZXggcmVnaXN0ZXIuICAqLwotI2RlZmluZSBESSAoTURSKzEpCi0gIHsyLCA0LCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBkaXNwYWNlbWVudC4gICovCi0jZGVmaW5lIFNEOCAgICAoREkrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAzMmJpdCBkaXNwYWNlbWVudC4gICovCi0jZGVmaW5lIFNEMTYgICAgKFNEOCsxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDggYml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIFNEOE5fUENSRUwgICAgKFNEMTYrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUENSRUwgfCBNTjEwMjAwX09QRVJBTkRfUkVMQVh9LAotCi0vKiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NOCAgICAoU0Q4Tl9QQ1JFTCsxKQotICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gMzJiaXQgIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIFNJTU0xNiAgICAoU0lNTTgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgbm90IHByb21vdGUuICAqLwotI2RlZmluZSBTSU1NMTZOICAgIChTSU1NMTYrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0t9LAotCi0vKiBFaXRoZXIgYW4gb3BlbiBwYXJlbiBvciBjbG9zZSBwYXJlbi4gICovCi0jZGVmaW5lIFBBUkVOCShTSU1NMTZOKzEpCi0gIHswLCAwLCBNTjEwMjAwX09QRVJBTkRfUEFSRU59LCAKLQotLyogZG4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEROMDEgICAgIChQQVJFTisxKQotICB7MiwgMCwgTU4xMDIwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMjAwX09QRVJBTkRfUkVQRUFURUR9LAotCi0vKiBhbiByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIgcG9zaXRpb25zLiAgKi8KLSNkZWZpbmUgQU4wMSAgICAgKEROMDErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHIHwgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLX0gOyAKLQotI2RlZmluZSBNRU0oQUREUikgUEFSRU4sIEFERFIsIFBBUkVOIAotI2RlZmluZSBNRU0yKEFERFIxLEFERFIyKSBQQVJFTiwgQUREUjEsIEFERFIyLCBQQVJFTiAKLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkJT1BDT0RFCQlNQVNLCQl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLQotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCi0gICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLiAgKi8KLQotY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlIG1uMTAyMDBfb3Bjb2Rlc1tdID0gewoteyAibW92IiwJMHg4MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtTSU1NOCwgRE4wMX19LAoteyAibW92IiwJMHg4MCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJtb3YiLAkweGYyMzAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJtb3YiLAkweGYyZjAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJtb3YiLAkweGYyNzAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJtb3YiLAkweGYzZjAsCQkweGZmZmMsCQlGTVRfNCwge1BTVywgRE4wfX0sCi17ICJtb3YiLAkweGYzZDAsCQkweGZmZjMsCQlGTVRfNCwge0ROMSwgUFNXfX0sCi17ICJtb3YiLAkweGYzZTAsCQkweGZmZmMsCQlGTVRfNCwge01EUiwgRE4wfX0sCi17ICJtb3YiLAkweGYzYzAsCQkweGZmZjMsCQlGTVRfNCwge0ROMSwgTURSfX0sCi17ICJtb3YiLAkweDIwLAkJMHhmMCwJCUZNVF8xLCB7TUVNKEFOMSksIERNMH19LAoteyAibW92IiwJMHg2MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGY3YzAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGY0ODAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGYxNDAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92IiwJMHhjODAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjRjMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAoteyAibW92IiwJMHg3MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtNRU0yKFNEOCxBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4NzAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNKEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmN2IwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmNGYwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmMTAwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjczMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7TUVNKElNTTE2X01FTSksIEFOMH19LAoteyAibW92IiwJMHhmNGQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtNRU0oSU1NMjRfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweDAwLAkJMHhmMCwJCUZNVF8xLCB7RE0wLCBNRU0oQU4xKX19LAoteyAibW92IiwJMHg0MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3YiLAkweGY3ODAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3YiLAkweGY0MDAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge0RNMCwgTUVNMihJTU0yNCwgQU4xKX19LAoteyAibW92IiwJMHhmMWMwLAkJMHhmZmMwLAkJRk1UXzQsIHtETTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdiIsCTB4YzAwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtETjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweGY0NDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0ROMCwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdiIsCTB4NTAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7QU0wLCBNRU0yKFNEOCwgQU4xKX19LAoteyAibW92IiwJMHg1MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtBTTAsIE1FTShBTjEpfX0sCi17ICJtb3YiLAkweGY3YTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0FNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3YiLAkweGY0MTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge0FNMCwgTUVNMihJTU0yNCxBTjEpfX0sCi17ICJtb3YiLAkweGYxODAsCQkweGZmYzAsCQlGTVRfNCwge0FNMCwgTUVNMihESSwgQU4xKX19LAoteyAibW92IiwJMHhmNzIwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtBTjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweGY0NTAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0FOMCwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdiIsCTB4ZjgwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtTSU1NMTYsIEROMH19LAoteyAibW92IiwJMHhmNDcwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJtb3YiLAkweGRjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7SU1NMTYsIEFOMH19LAoteyAibW92IiwJMHhmNDc0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi0KLXsgIm1vdngiLAkweGY1NzAwMCwJMHhmZmYwMDAsCUZNVF81LCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92eCIsCTB4Zjc3MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdngiLAkweGY0YjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3Z4IiwJMHhmNTUwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge0RNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdngiLAkweGY3NjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3Z4IiwJMHhmNDMwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLQoteyAibW92YiIsCTB4ZjUyMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3ZiIiwJMHhmN2QwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjRhMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGYwNDAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjRjNDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAoteyAibW92YiIsCTB4MTAsCQkweGYwLAkJRk1UXzEsIHtETTAsIE1FTShBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNTEwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge0RNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdmIiLAkweGY3OTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNDIwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLXsgIm1vdmIiLAkweGYwYzAsCQkweGZmYzAsCQlGTVRfNCwge0RNMCwgTUVNMihESSwgQU4xKX19LAoteyAibW92YiIsCTB4YzQwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtETjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3ZiIiwJMHhmNDQ0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtETjAsIE1FTShJTU0yNF9NRU0pfX0sCi0KLXsgIm1vdmJ1IiwJMHgzMCwJCTB4ZjAsCQlGTVRfMSwge01FTShBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNTMwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNzUwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGY0OTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4ZjA4MCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4Y2MwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZjRjODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAotCi17ICJleHQiLAkweGYzYzEsCQkweGZmZjMsCQlGTVRfNCwge0ROMX19LAoteyAiZXh0eCIsCTB4YjAsIAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCi17ICJleHR4dSIsCTB4YjQsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLXsgImV4dHhiIiwJMHhiOCwJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAoteyAiZXh0eGJ1IiwJMHhiYywJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAotCi17ICJhZGQiLAkweDkwLAkJMHhmMCwJCUZNVF8xLCB7RE4xLCBETTB9fSwKLXsgImFkZCIsCTB4ZjIwMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0xLCBBTjB9fSwKLXsgImFkZCIsCTB4ZjJjMCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBETTB9fSwKLXsgImFkZCIsCTB4ZjI0MCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBBTTB9fSwKLXsgImFkZCIsCTB4ZDQwMCwJCTB4ZmMwMCwJCUZNVF8yLCB7U0lNTTgsIEROMH19LAoteyAiYWRkIiwJMHhmNzE4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTYsIEROMH19LAoteyAiYWRkIiwJMHhmNDYwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJhZGQiLAkweGQwMDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBBTjB9fSwKLXsgImFkZCIsCTB4ZjcwODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBBTjB9fSwKLXsgImFkZCIsCTB4ZjQ2NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAoteyAiYWRkYyIsCTB4ZjI4MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImFkZG5mIiwJMHhmNTBjMDAsCTB4ZmZmYzAwLAlGTVRfNSwge1NJTU04LCBBTjB9fSwKLQoteyAic3ViIiwJMHhhMCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJzdWIiLAkweGYyMTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgQU4wfX0sCi17ICJzdWIiLAkweGYyZDAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJzdWIiLAkweGYyNTAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJzdWIiLAkweGY3MWMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge0lNTTE2LCBETjB9fSwKLXsgInN1YiIsCTB4ZjQ2ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAic3ViIiwJMHhmNzBjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtJTU0xNiwgQU4wfX0sCi17ICJzdWIiLAkweGY0NmMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKLXsgInN1YmMiLAkweGYyOTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgIm11bCIsCTB4ZjM0MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgIm11bHUiLAkweGYzNTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgImRpdnUiLAkweGYzNjAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgImNtcCIsCTB4ZjM5MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImNtcCIsCTB4ZjIyMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0xLCBBTjB9fSwKLXsgImNtcCIsCTB4ZjJlMCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBETTB9fSwKLXsgImNtcCIsCTB4ZjI2MCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBBTTB9fSwKLXsgImNtcCIsCTB4ZDgwMCwJCTB4ZmMwMCwJCUZNVF8yLCB7U0lNTTgsIEROMH19LAoteyAiY21wIiwJMHhmNzQ4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTYsIEROMH19LAoteyAiY21wIiwJMHhmNDc4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJjbXAiLAkweGVjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7SU1NMTYsIEFOMH19LAoteyAiY21wIiwJMHhmNDdjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi0KLXsgImFuZCIsCTB4ZjMwMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImFuZCIsCTB4ZjUwMDAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgImFuZCIsCTB4ZjcwMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCi17ICJhbmQiLAkweGY3MTAwMDAwLAkweGZmZmYwMDAwLAlGTVRfNiwge1NJTU0xNk4sIFBTV319LAoteyAib3IiLAkJMHhmMzEwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAib3IiLAkJMHhmNTA4MDAsCTB4ZmZmYzAwLAlGTVRfNSwge0lNTTgsIEROMH19LAoteyAib3IiLAkJMHhmNzQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgIm9yIiwJCTB4ZjcxNDAwMDAsCTB4ZmZmZjAwMDAsCUZNVF82LCB7U0lNTTE2TiwgUFNXfX0sCi17ICJ4b3IiLAkweGYzMjAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJ4b3IiLAkweGY3NGMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAibm90IiwJMHhmM2U0LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLQoteyAiYXNyIiwJMHhmMzM4LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLXsgImxzciIsCTB4ZjMzYywJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi17ICJyb3IiLAkweGYzMzQsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAoteyAicm9sIiwJMHhmMzMwLAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLQoteyAiYnRzdCIsCTB4ZjUwNDAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgImJ0c3QiLAkweGY3MDQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAiYnNldCIsCTB4ZjAyMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0wLCBNRU0oQU4xKX19LAoteyAiYmNsciIsCTB4ZjAzMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0wLCBNRU0oQU4xKX19LAotCi17ICJiZXEiLAkweGU4MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJuZSIsCTB4ZTkwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmx0IiwJMHhlMDAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibGUiLAkweGUzMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJnZSIsCTB4ZTIwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmd0IiwJMHhlMTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiY3MiLAkweGU0MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJscyIsCTB4ZTcwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNjIiwJMHhlNjAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiaGkiLAkweGU1MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJ2YyIsCTB4ZjVmYzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidnMiLAkweGY1ZmQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5jIiwJMHhmNWZlMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJucyIsCTB4ZjVmZjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJicmEiLAkweGVhMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLQoteyAiYmVxeCIsCTB4ZjVlODAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibmV4IiwJMHhmNWU5MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJsdHgiLAkweGY1ZTAwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxleCIsCTB4ZjVlMzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ2V4IiwJMHhmNWUyMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJndHgiLAkweGY1ZTEwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNzeCIsCTB4ZjVlNDAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibHN4IiwJMHhmNWU3MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJjY3giLAkweGY1ZTYwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmhpeCIsCTB4ZjVlNTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidmN4IiwJMHhmNWVjMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJ2c3giLAkweGY1ZWQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5jeCIsCTB4ZjVlZTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibnN4IiwJMHhmNWVmMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLQoteyAiam1wIiwJMHhmYzAwMDAsCTB4ZmYwMDAwLAlGTVRfMywge0lNTTE2X1BDUkVMfX0sCi17ICJqbXAiLAkweGY0ZTAwMDAwLAkweGZmZmYwMDAwLAlGTVRfNywge0lNTTI0X1BDUkVMfX0sCi17ICJqbXAiLAkweGYwMDAsCQkweGZmZjMsCQlGTVRfNCwge1BBUkVOLEFOMSxQQVJFTn19LAoteyAianNyIiwJMHhmZDAwMDAsCTB4ZmYwMDAwLAlGTVRfMywge0lNTTE2X1BDUkVMfX0sCi17ICJqc3IiLAkweGY0ZTEwMDAwLAkweGZmZmYwMDAwLAlGTVRfNywge0lNTTI0X1BDUkVMfX0sCi17ICJqc3IiLAkweGYwMDEsCQkweGZmZjMsCQlGTVRfNCwge1BBUkVOLEFOMSxQQVJFTn19LAotCi17ICJub3AiLAkweGY2LAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi0KLXsgInJ0cyIsCTB4ZmUsCQkweGZmLAkJRk1UXzEsIHtVTlVTRUR9fSwKLXsgInJ0aSIsCTB4ZWIsCQkweGZmLAkJRk1UXzEsIHtVTlVTRUR9fSwKLQotLyogRXh0ZW5zaW9uLiAgV2UgbmVlZCBzb21lIGluc3RydWN0aW9uIHRvIHRyaWdnZXIgImVtdWxhdGVkIHN5c2NhbGxzIgotICAgZm9yIG91ciBzaW11bGF0b3IuICAqLwoteyAic3lzY2FsbCIsCTB4ZjAxMCwJCTB4ZmZmZiwJCUZNVF80LCB7VU5VU0VEfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdoZW4gdGFsa2luZyB0byB0aGUgc2ltdWxhdG9yLCBnZGIgcmVxdWlyZXMgc29tZSBpbnN0cnVjdGlvbgotICAgdGhhdCB3aWxsIHRyaWdnZXIgYSAiYnJlYWtwb2ludCIgKHJlYWxseSBqdXN0IGFuIGluc3RydWN0aW9uIHRoYXQgaXNuJ3QKLSAgIG90aGVyd2lzZSB1c2VkIGJ5IHRoZSB0b29scy4gIFRoaXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSB0aGUgc2FtZSBzaXplCi0gICBhcyB0aGUgc21hbGxlc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIHRhcmdldCBtYWNoaW5lLiAgSW4gdGhlIGNhc2Ugb2YgdGhlCi0gICBtbjEweDAwIHRoZSAiYnJlYWsiIGluc3RydWN0aW9uIG11c3QgYmUgb25lIGJ5dGUuICAweGZmIGlzIGF2YWlsYWJsZSBvbgotICAgYm90aCBtbjEweDAwIGFyY2hpdGVjdHVyZXMuICAqLwoteyAiYnJlYWsiLCAgICAgIDB4ZmYsICAgICAgICAgICAweGZmLCAgICAgICAgICAgRk1UXzEsIHtVTlVTRUR9fSwKLQoteyAwLCAwLCAwLCAwLCB7MH19LAotCi19IDsKLQotY29uc3QgaW50IG1uMTAyMDBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKG1uMTAyMDBfb3Bjb2RlcykgLyBzaXplb2YgKG1uMTAyMDBfb3Bjb2Rlc1swXSk7Ci0KLQwKZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMzAwLWRpcy5jIGIvb3Bjb2Rlcy9tMTAzMDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2Y3NGMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAzMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgTU4xMDMwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIHZvaWQgZGlzYXNzZW1ibGUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgdW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBpbnQpKTsKLQotaW50IAotcHJpbnRfaW5zbl9tbjEwMzAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgaW50IGNvbnN1bWU7Ci0KLSAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLwotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDEsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbnNuID0gKih1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKLQotICAvKiBUaGVzZSBhcmUgb25lIGJ5dGUgaW5zbnMuICAqLwotICBpZiAoKGluc24gJiAweGYzKSA9PSAweDAwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MTAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgzYwotICAgICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQxCi0gICAgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1MAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweDU0Ci0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg3MAotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweDkwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4YTAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHhiMAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2IKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkMAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ0Ci0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhlMAotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZmKQotICAgIHsKLSAgICAgIGNvbnN1bWUgPSAxOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YjAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjgKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDMKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDIKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NTgKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NWMKLQkgICB8fCAoKGluc24gJiAweGYwKSA9PSAweGMwCi0JICAgICAgICYmIChpbnNuICYgMHhmZikgIT0gMHhjYgotCSAgICAgICAmJiAoaW5zbiAmIDB4ZmYpICE9IDB4Y2MKLQkgICAgICAgJiYgKGluc24gJiAweGZmKSAhPSAweGNkKQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMgotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMwotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNikKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSAyOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmOAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhjYyAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDEKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDIKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MmMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGUKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGYKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2MpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDg7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGZhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY3Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNDsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZpdmUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhjZAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhkYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDU7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBzaXggYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmZAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNjsKLSAgICB9Ci0KLSAgLyogRWxzZSBpdHMgYSBzZXZlbiBieXRlIGluc25zIChpbiB0aGVvcnkpLiAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSA3OwotICAgIH0KLQotICBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgY29uc3VtZSk7Ci0KLSAgcmV0dXJuIGNvbnN1bWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgc2l6ZSkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiltbjEwMzAwX29wY29kZXM7Ci0gIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOwotICBpbnQgc3RhdHVzLCBtYXRjaCA9IDA7Ci0KLSAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGludCBteXNpemUsIGV4dHJhX3NoaWZ0OwotCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzApCi0JbXlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1MxCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QwKQotCW15c2l6ZSA9IDI7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TMgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EMSkKLQlteXNpemUgPSAzOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzQpCi0JbXlzaXplID0gNTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QyKQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9ENCkKLQlteXNpemUgPSA2OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDYpCi0JbXlzaXplID0gMzsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q3IHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QxMCkKLQlteXNpemUgPSA0OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDgpCi0JbXlzaXplID0gNjsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q5KQotCW15c2l6ZSA9IDc7Ci0gICAgICBlbHNlCi0JbXlzaXplID0gNzsKLQkKLSAgICAgIGlmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlCi0JICAmJiBzaXplID09ICh1bnNpZ25lZCBpbnQpIG15c2l6ZQotCSAgJiYgKG9wLT5tYWNoaW5lID09IDAKLQkgICAgICB8fCBvcC0+bWFjaGluZSA9PSBpbmZvLT5tYWNoKSkKLQl7Ci0JICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLQkgIHVuc2lnbmVkIGludCBub2NvbW1hOwotCSAgaW50IHBhcmVuID0gMDsKLQkgIAotCSAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QxIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1MxKQotCSAgICBleHRyYV9zaGlmdCA9IDg7Ci0JICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9EMiB8fCBvcC0+Zm9ybWF0ID09IEZNVF9ENAotCQkgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TMiB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TNAotCQkgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TNiB8fCBvcC0+Zm9ybWF0ID09IEZNVF9ENSkKLQkgICAgZXh0cmFfc2hpZnQgPSAxNjsKLQkgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q3Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q4Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q5KQotCSAgICBleHRyYV9zaGlmdCA9IDg7Ci0JICBlbHNlCi0JICAgIGV4dHJhX3NoaWZ0ID0gMDsKLQotCSAgaWYgKHNpemUgPT0gMSB8fCBzaXplID09IDIpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDMKLQkJICAgJiYgKG9wLT5mb3JtYXQgPT0gRk1UX0QxCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZGYwMDAwCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZGUwMDAwKSkKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gMwotCQkgICAmJiBvcC0+Zm9ybWF0ID09IEZNVF9ENikKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gMykKLQkgICAgewotCSAgICAgIGluc24gJj0gMHhmZjAwMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA0Ci0JCSAgICYmIChvcC0+b3Bjb2RlID09IDB4ZmFmODAwMDAKLQkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhmYWYwMDAwMAotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGZhZjQwMDAwKSkKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNAotCQkgICAmJiAob3AtPmZvcm1hdCA9PSBGTVRfRDcKLQkJICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QxMCkpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDQpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA1ICYmIG9wLT5vcGNvZGUgPT0gMHhkYzAwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgJiAweGZmZmZmZjAwKSA+PiA4OwotCSAgICAgIGV4dGVuc2lvbiA9IHRlbXAgJiAweGZmOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZjAwMDBmZjsKLQkgICAgICBpbnNuIHw9IHRlbXAgPDwgODsKLQotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA0LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiA9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA2ICYmIG9wLT5mb3JtYXQgPT0gRk1UX0Q4KQotCSAgICB7Ci0JICAgICAgaW5zbiAmPSAweGZmZmZmZjAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA1LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGluc24gfD0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOwotCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDMsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA2KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCA+PiAxNikgJiAweGZmZmY7Ci0JICAgICAgZXh0ZW5zaW9uID0gdGVtcCAmIDB4ZmZmZjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA3ICYmIG9wLT5mb3JtYXQgPT0gRk1UX0Q5KQotCSAgICB7Ci0JICAgICAgaW5zbiAmPSAweGZmZmZmZjAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAzLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JICAgICAgaW5zbiB8PSAoZXh0ZW5zaW9uICYgMHhmZjAwMDAwMCkgPj4gMjQ7Ci0JICAgICAgZXh0ZW5zaW9uICY9IDB4ZmZmZmZmOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDcgJiYgb3AtPm9wY29kZSA9PSAweGRkMDAwMDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCA+PiA4KSAmIDB4ZmZmZmZmOwotCSAgICAgIGV4dGVuc2lvbiA9ICh0ZW1wICYgMHhmZikgPDwgMTY7Ci0JICAgICAgCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDUsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uIHw9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmZmYwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgPj4gMTYpICYgMHhmZmZmOwotCSAgICAgIGV4dGVuc2lvbiA9ICh0ZW1wICYgMHhmZmZmKSA8PCA4OwotCSAgICAgIAotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA2LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiB8PSAqKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7Ci0JICAgIH0KLQotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOwotCi0JICAvKiBOb3cgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KLQkgIGZvciAob3BpbmRleF9wdHIgPSBvcC0+b3BlcmFuZHMsIG5vY29tbWEgPSAxOwotCSAgICAgICAqb3BpbmRleF9wdHIgIT0gMDsKLQkgICAgICAgb3BpbmRleF9wdHIrKykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQkgICAgICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBpcyBhIFBMVVMgKGF1dG9pbmNyZW1lbnQpLCB0aGVuIGRvIG5vdCBlbWl0Ci0JCSBhIGNvbW1hIGJlZm9yZSBlbWl0dGluZyB0aGUgcGx1cy4gICovCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QTFVTKSAhPSAwKQotCQlub2NvbW1hID0gMTsKLQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0JCSAgdmFsdWUgPSBpbnNuICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0JCSAgdmFsdWUgPDw9ICgzMiAtIG9wZXJhbmQtPmJpdHMpOwotCQkgIHRlbXAgPSBleHRlbnNpb24gPj4gb3BlcmFuZC0+c2hpZnQ7Ci0JCSAgdGVtcCAmPSAoKDEgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpIC0gMSk7Ci0JCSAgdmFsdWUgfD0gdGVtcDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkgIT0gMCkKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQkJICB2YWx1ZSA9IGluc24gJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkJICB2YWx1ZSA8PD0gKDI0IC0gb3BlcmFuZC0+Yml0cyk7Ci0JCSAgdGVtcCA9IGV4dGVuc2lvbiA+PiBvcGVyYW5kLT5zaGlmdDsKLQkJICB0ZW1wICY9ICgoMSA8PCAoMjQgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKTsKLQkJICB2YWx1ZSB8PSB0ZW1wOwotCQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCQkgICAgdmFsdWUgPSAoKHZhbHVlICYgMHhmZmZmZmYpIF4gKH4weDdmZmZmZikpICsgMHg4MDAwMDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoZXh0ZW5zaW9uID4+IChvcGVyYW5kLT5zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJfQotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkJICAgLyogVGhlc2UgYXJlIHByb3Blcmx5IGV4dGVuZGVkIGJ5IHRoZSBjb2RlIGFib3ZlLiAgKi8KLQkJICAgJiYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkgPT0gMCkKLQkJICApCi0JCXZhbHVlID0gKChsb25nKSh2YWx1ZSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkKLQkJCSAgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpOwotCi0JICAgICAgaWYgKCFub2NvbW1hCi0JCSAgJiYgKCFwYXJlbgotCQkgICAgICB8fCAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BBUkVOKSA9PSAwKSkpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCi0JICAgICAgbm9jb21tYSA9IDA7Ci0JCQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRFJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZCVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfQVJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1ApICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3AiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QU1cpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAicHN3Iik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTURSKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm1kciIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICBpZiAodmFsdWUgPCA4KQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWQiLCB2YWx1ZSk7Ci0JCSAgZWxzZSBpZiAodmFsdWUgPCAxMikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSVkIiwgdmFsdWUgLSA4KTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQlZCIsIHZhbHVlIC0gMTIpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfWFJSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICBpZiAodmFsdWUgPT0gMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3AiLCB2YWx1ZSk7Ci0JCSAgZWxzZQotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAieHIlZCIsIHZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1VTUCkgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ1c3AiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TU1ApICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3NwIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTVNQKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm1zcCIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BDKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInBjIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVBTVykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJlcHN3Iik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUExVUykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pICE9IDApCi0JCXsKLQkJICBpZiAocGFyZW4pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCQkgICAgICBub2NvbW1hID0gMTsKLQkJICAgIH0KLQkJICBwYXJlbiA9ICFwYXJlbjsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BDUkVMKSAhPSAwKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChsb25nKSB2YWx1ZSArIG1lbWFkZHIsIGluZm8pOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX01FTUFERFIpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUKSAhPSAwKQotCQl7Ci0JCSAgaW50IGNvbW1hID0gMDsKLQotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiWyIpOwotCQkgIGlmICh2YWx1ZSAmIDB4ODApCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZDIiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHg0MCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZDMiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHgyMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYTIiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHgxMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYTMiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHgwOCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAib3RoZXIiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHgwNCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXhyZWcwIik7Ci0JCSAgICAgIGNvbW1hID0gMTsKLQkJICAgIH0KLQkJICBpZiAodmFsdWUgJiAweDAyKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHJlZzEiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCQkgIGlmICh2YWx1ZSAmIDB4MDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb21tYSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4b3RoZXIiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXSIpOwotCQl9Ci0KLQkgICAgICBlbHNlIAotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOwotCSAgICB9Ci0JICAvKiBBbGwgZG9uZS4gKi8KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwNHgiKSwgaW5zbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMgYi9vcGNvZGVzL20xMDMwMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxODQxNy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDMwMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjcgKzAsMCBAQAotLyogQXNzZW1ibGUgTWF0c3VzaGl0YSBNTjEwMzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGZvcm1hdHRlZCBhdCA+IDgwIGNvbHVtbnMuICBBdHRlbXB0aW5nIHRvIHJlYWQgaXQgb24gYQotICAgc2NyZWVlbiB3aXRoIGxlc3MgdGhhbiA4MCBjb2x1bW5zIHdpbGwgYmUgZGlmZmljdWx0LiAgKi8KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiCi0KLQwKLWNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgbW4xMDMwMF9vcGVyYW5kc1tdID0gewotI2RlZmluZSBVTlVTRUQJMAotICB7MCwgMCwgMH0sIAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMCAgICAgIChVTlVTRUQrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4xICAgICAgKEROMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMiAgICAgIChETjErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTAgICAgICAoRE4yKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMSAgICAgIChETTArMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTIgICAgICAoRE0xKzEpCi0gIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4wICAgICAgKERNMisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjEgICAgICAoQU4wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4yICAgICAgKEFOMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMCAgICAgIChBTjIrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0xICAgICAgKEFNMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMiAgICAgIChBTTErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTggICAgKEFNMisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2ICAgIChJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgcGMtcmVsYXRpdmUgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHBjLXJlbGF0aXZlIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2X1BDUkVMICAgIChJTU0xNisxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAxNmJpdCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NMTZfTUVNICAgIChJTU0xNl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMTYgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgMTZiaXRzIGluIHRoZSBleHRlbnNpb24gd29yZC4gCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMiAgICAoSU1NMTZfTUVNKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUfSwKLQotLyogMzJiaXQgcGMtcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMzJfUENSRUwgICAgKElNTTMyKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMfSwKLQotLyogMzJiaXQgbWVtb3J5IG9mZnNldC4gICovCi0jZGVmaW5lIElNTTMyX01FTSAgICAoSU1NMzJfUENSRUwrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCAxNmJpdHMgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLCBsb3cgMTZiaXRzIGFyZSBsZWZ0Ci0gICBzaGlmdGVkIDggcGxhY2VzLiAKLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyX0xPV1NISUZUOCAgICAoSU1NMzJfTUVNKzEpCi0gIHsxNiwgOCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMjQgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgOCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMl9ISUdIMjQgICAgKElNTTMyX0xPV1NISUZUOCsxKQotICB7MjQsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTH0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAyNCBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZCwgbG93IDggYml0cyBhcmUgbGVmdAotICAgc2hpZnRlZCAxNiBwbGFjZXMuIAotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfSElHSDI0X0xPV1NISUZUMTYgICAgKElNTTMyX0hJR0gyNCsxKQotICB7MjQsIDE2LCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUx9LAotCi0vKiBTdGFjayBwb2ludGVyLiAgKi8KLSNkZWZpbmUgU1AgICAgKElNTTMyX0hJR0gyNF9MT1dTSElGVDE2KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU1B9LAotCi0vKiBQcm9jZXNzb3Igc3RhdHVzIHdvcmQuICAqLwotI2RlZmluZSBQU1cgICAgKFNQKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUFNXfSwKLQotLyogTURSIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTURSICAgIChQU1crMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9NRFJ9LAotCi0vKiBJbmRleCByZWdpc3Rlci4gICovCi0jZGVmaW5lIERJIChNRFIrMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMTZiaXQgc2lnbmVkIGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0Q4ICAgIChESSsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDMyYml0IGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0QxNiAgICAoU0Q4KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCB0aGF0IGNhbiBub3QgcHJvbW90ZS4gICovCi0jZGVmaW5lIFNEOE4gICAgKFNEMTYrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA4IGJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDhOX1BDUkVMICAgIChTRDhOKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCBzaGlmdGVkIGxlZnQgOCBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNEOE5fU0hJRlQ4ICAgIChTRDhOX1BDUkVMKzEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTggICAgKFNEOE5fU0hJRlQ4KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCAgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTE2ICAgIChTSU1NOCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIEVpdGhlciBhbiBvcGVuIHBhcmVuIG9yIGNsb3NlIHBhcmVuLiAgKi8KLSNkZWZpbmUgUEFSRU4JKFNJTU0xNisxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BBUkVOfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBETjAxICAgICAoUEFSRU4rMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogYW4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEFOMDEgICAgIChETjAxKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfQVJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLS8qIDE2Yml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudCB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCBwYy1yZWxhdGl2ZQotICAgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgRDE2X1NISUZUIChBTjAxKzEpCi0gIHsxNiwgOCwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDggYml0IGltbWVkaWF0ZSBmb3VuZCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuICAqLwotI2RlZmluZSBJTU04RSAgICAoRDE2X1NISUZUKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUR9LAotCi0vKiBSZWdpc3RlciBsaXN0IGZvdW5kIGluIHRoZSBleHRlbnNpb24gd29yZCBzaGlmdGVkIDggYml0cyBsZWZ0LiAgKi8KLSNkZWZpbmUgUkVHU0VfU0hJRlQ4ICAgIChJTU04RSsxKQotICB7OCwgOCwgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUfSwKLQotLyogUmVnaXN0ZXIgbGlzdCBzaGlmdGVkIDggYml0cyBsZWZ0LiAgKi8KLSNkZWZpbmUgUkVHU19TSElGVDggKFJFR1NFX1NISUZUOCArIDEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1R9LAotCi0vKiBSZWlnc3RlciBsaXN0LiAgKi8KLSNkZWZpbmUgUkVHUyAgICAoUkVHU19TSElGVDgrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVH0sCi0KLS8qIFVTdGFjayBwb2ludGVyLiAgKi8KLSNkZWZpbmUgVVNQICAgIChSRUdTKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfVVNQfSwKLQotLyogU1N0YWNrIHBvaW50ZXIuICAqLwotI2RlZmluZSBTU1AgICAgKFVTUCsxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NTUH0sCi0KLS8qIE1TdGFjayBwb2ludGVyLiAgKi8KLSNkZWZpbmUgTVNQICAgIChTU1ArMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9NU1B9LAotCi0vKiBQQyAuICAqLwotI2RlZmluZSBQQyAgICAoTVNQKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUEN9LAotCi0vKiA0IGJpdCBpbW1lZGlhdGUgZm9yIHN5c2NhbGwuICAqLwotI2RlZmluZSBJTU00ICAgIChQQysxKQotICB7NCwgMCwgMH0sCi0KLS8qIFByb2Nlc3NvciBzdGF0dXMgd29yZC4gICovCi0jZGVmaW5lIEVQU1cgICAgKElNTTQrMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9FUFNXfSwKLQotLyogcm4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTjAgICAgICAoRVBTVysxKQotICB7NCwgMCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiBybiByZWdpc3RlciBpbiB0aGUgZm91cnRoIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTjIgICAgICAoUk4wKzEpCi0gIHs0LCA0LCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIHJtIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk0wICAgICAgKFJOMisxKQotICB7NCwgMCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiBybSByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTTEgICAgICAoUk0wKzEpCi0gIHs0LCAyLCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIHJtIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk0yICAgICAgKFJNMSsxKQotICB7NCwgNCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0jZGVmaW5lIFJOMDIgICAgICAoUk0yKzEpCi0gIHs0LCAwLCBNTjEwMzAwX09QRVJBTkRfUlJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLSNkZWZpbmUgWFJOMCAgICAgIChSTjAyKzEpCi0gIHs0LCAwLCBNTjEwMzAwX09QRVJBTkRfWFJSRUd9LAotCi0jZGVmaW5lIFhSTTIgICAgICAoWFJOMCsxKQotICB7NCwgNCwgTU4xMDMwMF9PUEVSQU5EX1hSUkVHfSwKLQotLyogKyBmb3IgYXV0b2luY3JlbWVudCAqLwotI2RlZmluZSBQTFVTCShYUk0yKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUExVU30sIAotCi0jZGVmaW5lIFhSTjAyICAgICAgKFBMVVMrMSkKLSAgezQsIDAsIE1OMTAzMDBfT1BFUkFORF9YUlJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLS8qIEljayAqLwotI2RlZmluZSBSRDAgICAgICAoWFJOMDIrMSkKLSAgezQsIC04LCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLSNkZWZpbmUgUkQyICAgICAgKFJEMCsxKQotICB7NCwgLTQsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogOCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NOF9NRU0gICAgKFJEMisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIEluZGV4IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgUkkgKElNTThfTUVNKzEpCi0gIHs0LCA0LCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIDI0IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAzMmJpdCBkaXNwYWNlbWVudC4gICovCi0jZGVmaW5lIFNEMjQgICAgKFJJKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfMjRCSVQgfCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAyNCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTI0ICAgIChTRDI0KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfMjRCSVQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDI0IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NMjQgICAgKElNTTI0KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfMjRCSVQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAxNmJpdCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NMjRfTUVNICAgIChTSU1NMjQrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF8yNEJJVCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDI0IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLgotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfSElHSDggICAgKElNTTI0X01FTSsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUfSwKLQotLyogU2ltaWxhcmx5LCBidXQgYSBtZW1vcnkgYWRkcmVzcy4gICovCi0jZGVmaW5lIElNTTMyX0hJR0g4X01FTSAgKElNTTMyX0hJR0g4KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIHJtIHJlZ2lzdGVyIGluIHRoZSBzZXZlbnRoIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTTYgICAgICAoSU1NMzJfSElHSDhfTUVNKzEpCi0gIHs0LCAxMiwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiBybSByZWdpc3RlciBpbiB0aGUgZmlmdGggcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIFJONCAgICAgIChSTTYrMSkKLSAgezQsIDgsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogNCBiaXQgaW1tZWRpYXRlIGZvciBkc3AgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgSU1NNF8yICAgIChSTjQrMSkKLSAgezQsIDQsIDB9LAotCi0vKiA0IGJpdCBpbW1lZGlhdGUgZm9yIGRzcCBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBTSU1NNF8yICAgIChJTU00XzIrMSkKLSAgezQsIDQsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA0IGJpdCBpbW1lZGlhdGUgZm9yIGRzcCBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBTSU1NNF82ICAgIChTSU1NNF8yKzEpCi0gIHs0LCAxMiwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLX0gOyAKLQotI2RlZmluZSBNRU0oQUREUikgUEFSRU4sIEFERFIsIFBBUkVOIAotI2RlZmluZSBNRU1JTkMoQUREUikgUEFSRU4sIEFERFIsIFBMVVMsIFBBUkVOIAotI2RlZmluZSBNRU1JTkMyKEFERFIsSU5DKSBQQVJFTiwgQUREUiwgUExVUywgSU5DLCBQQVJFTiAKLSNkZWZpbmUgTUVNMihBRERSMSxBRERSMikgUEFSRU4sIEFERFIxLCBBRERSMiwgUEFSRU4gCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUJCU9QQ09ERQkJTUFTSwlNQVRDSF9NQVNLLCBGT1JNQVQsIFBST0NFU1NPUgl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLQotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCi0gICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLiAgKi8KLQotY29uc3Qgc3RydWN0IG1uMTAzMDBfb3Bjb2RlIG1uMTAzMDBfb3Bjb2Rlc1tdID0gewoteyAibW92IiwJMHg4MDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wMX19LAoteyAibW92IiwJMHg4MCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJtb3YiLAkweGYxZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJtb3YiLAkweGYxZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJtb3YiLAkweDkwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0lNTTgsIEFOMDF9fSwKLXsgIm1vdiIsCTB4OTAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtBTTEsIEFOMH19LAoteyAibW92IiwJMHgzYywJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe1NQLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjJmMCwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBTUH19LAoteyAibW92IiwJMHhmMmU0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQU1csIEROMH19LAoteyAibW92IiwJMHhmMmYzLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIFBTV319LAoteyAibW92IiwJMHhmMmUwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtNRFIsIEROMH19LAoteyAibW92IiwJMHhmMmYyLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1EUn19LAoteyAibW92IiwJMHg3MCwJICAgICAweGYwLAkgIDAsICAgIEZNVF9TMCwgMCwJe01FTShBTTApLCBETjF9fSwKLXsgIm1vdiIsCTB4NTgwMCwJICAgICAweGZjZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNKFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweDMwMDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjAwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEFOMX19LAoteyAibW92IiwJMHg1YzAwLAkgICAgIDB4ZmNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0oU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmFhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNKElNTTE2X01FTSksIEFOMH19LAoteyAibW92IiwJMHg2MCwJICAgICAweGYwLAkgIDAsICAgIEZNVF9TMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgIm1vdiIsCTB4NDIwMCwJICAgICAweGYzZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3YiLAkweDAxMDAwMCwgICAgMHhmMzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0RNMSwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdiIsCTB4ZjAxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBNRU0oQU4wKX19LAoteyAibW92IiwJMHg0MzAwLAkgICAgIDB4ZjNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtBTTEsIE1FTShTUCl9fSwKLXsgIm1vdiIsCTB4ZmE4MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7QU0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHg1YzAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0yKElNTTgsIFNQKSwgQU4wfX0sCi17ICJtb3YiLAkweGY4MDAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdiIsCTB4ZmEwMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBETjF9fSwKLXsgIm1vdiIsCTB4NTgwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNMihJTU04LCBTUCksIEROMH19LAoteyAibW92IiwJMHhmYWI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92IiwJMHhmMzAwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBETjJ9fSwKLXsgIm1vdiIsCTB4ZjgyMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweGZhMjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweGZhYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgQU4wfX0sCi17ICJtb3YiLAkweGYzODAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEFOMn19LAoteyAibW92IiwJMHg0MzAwLAkgICAgIDB4ZjMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtBTTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3YiLAkweGY4MTAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihTRDgsIEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmExMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKLXsgIm1vdiIsCTB4NDIwMCwJICAgICAweGYzMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92IiwJMHhmYTkxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoSU1NMTYsIFNQKX19LAoteyAibW92IiwJMHhmMzQwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTIsIE1FTTIoREksIEFOMCl9fSwKLXsgIm1vdiIsCTB4ZjgzMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7QU0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92IiwJMHhmYTMwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTTIoU0QxNiwgQU4wKX19LAoteyAibW92IiwJMHhmYTkwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTTIoSU1NMTYsIFNQKX19LAoteyAibW92IiwJMHhmM2MwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTIsIE1FTTIoREksIEFOMCl9fSwKLQoteyAibW92IiwJMHhmMDIwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtVU1AsIEFOMH19LAoteyAibW92IiwJMHhmMDI0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtTU1AsIEFOMH19LAoteyAibW92IiwJMHhmMDI4LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtNU1AsIEFOMH19LAoteyAibW92IiwJMHhmMDJjLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtQQywgQU4wfX0sCi17ICJtb3YiLAkweGYwMzAsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0FOMSwgVVNQfX0sCi17ICJtb3YiLAkweGYwMzEsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0FOMSwgU1NQfX0sCi17ICJtb3YiLAkweGYwMzIsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0FOMSwgTVNQfX0sCi17ICJtb3YiLAkweGYyZWMsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0VQU1csIEROMH19LAoteyAibW92IiwJMHhmMmYxLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETTEsIEVQU1d9fSwKLXsgIm1vdiIsCTB4ZjUwMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7QU0yLCBSTjB9fSwKLXsgIm1vdiIsCTB4ZjU0MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE0yLCBSTjB9fSwKLXsgIm1vdiIsCTB4ZjU4MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7Uk0xLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjVjMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7Uk0xLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjkwODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1vdiIsCTB4ZjllODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7WFJNMiwgUk4wfX0sCi17ICJtb3YiLAkweGY5ZjgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgWFJOMH19LAoteyAibW92IiwJMHhmOTBhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtNRU0oUk0wKSwgUk4yfX0sCi17ICJtb3YiLAkweGY5OGEwMCwgICAgMHhmZmZmMGYsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShTUCksIFJOMn19LAoteyAibW92IiwJMHhmOTZhMDAsICAgIDB4ZmZmZjAwLCAgICAweDEyLCBGTVRfRDYsIEFNMzMsCXtNRU1JTkMoUk0wKSwgUk4yfX0sCi17ICJtb3YiLAkweGZiMGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTShJTU04X01FTSksIFJOMn19LAoteyAibW92IiwJMHhmZDBlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0oSU1NMjRfTUVNKSwgUk4yfX0sCi17ICJtb3YiLAkweGY5MWEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgTUVNKFJOMCl9fSwKLXsgIm1vdiIsCTB4Zjk5YTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oU1ApfX0sCi17ICJtb3YiLAkweGY5N2EwMCwgICAgMHhmZmZmMDAsICAgIDAsCUZNVF9ENiwgQU0zMywJe1JNMiwgTUVNSU5DKFJOMCl9fSwKLXsgIm1vdiIsCTB4ZmIxZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0oSU1NOF9NRU0pfX0sCi17ICJtb3YiLAkweGZkMWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdiIsCTB4ZmIwYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihTRDgsIFJNMCksIFJOMn19LAoteyAibW92IiwJMHhmZDBhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKFNEMjQsIFJNMCksIFJOMn19LAoteyAibW92IiwJMHhmYjhlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFJJLCBSTTApLCBSRDJ9fSwKLXsgIm1vdiIsCTB4ZmIxYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0yKFNEOCwgUk4wKX19LAoteyAibW92IiwJMHhmZDFhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoU0QyNCwgUk4wKX19LAoteyAibW92IiwJMHhmYjhhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFNEOCwgU1ApLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmQ4YTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNMihTRDI0LCBTUCksIFJOMn19LAoteyAibW92IiwJMHhmYjlhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoU0Q4LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZmQ5YTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKFNEMjQsIFNQKX19LAoteyAibW92IiwJMHhmYjllMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSRDIsIE1FTTIoUkksIFJOMCl9fSwKLXsgIm1vdiIsCTB4ZmI2YTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q3LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBTSU1NOCksIFJOMn19LAoteyAibW92IiwJMHhmYjdhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTUlOQzIgKFJOMCwgU0lNTTgpfX0sCi17ICJtb3YiLAkweGZkNmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9EOCwgQU0zMywJe01FTUlOQzIgKFJNMCwgSU1NMjQpLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmQ3YTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU1JTkMyIChSTjAsIElNTTI0KX19LAoteyAibW92IiwJMHhmZTZhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDksIEFNMzMsCXtNRU1JTkMyIChSTTAsIElNTTMyX0hJR0g4KSwgUk4yfX0sCi17ICJtb3YiLAkweGZlN2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9EOSwgQU0zMywJe1JOMiwgTUVNSU5DMiAoUk0wLCBJTU0zMl9ISUdIOCl9fSwKLS8qIFRoZXNlIG11c3QgY29tZSBhZnRlciBtb3N0IG9mIHRoZSBvdGhlciBtb3ZlIGluc3RydWN0aW9ucyB0byBhdm9pZCBtYXRjaGluZwotICAgYSBzeW1ib2xpYyBuYW1lIHdpdGggSU1NeHggb3BlcmFuZHMuICBVZ2guICAqLwoteyAibW92IiwJMHgyYzAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAibW92IiwJMHhmY2NjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJtb3YiLAkweDI0MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0lNTTE2LCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmNkYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAibW92IiwJMHhmY2E0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgRE4wfX0sCi17ICJtb3YiLAkweGZjYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTShJTU0zMl9NRU0pLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmM4MTAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0oSU1NMzJfTUVNKX19LAoteyAibW92IiwJMHhmYzgwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtBTTEsIE1FTShJTU0zMl9NRU0pfX0sCi17ICJtb3YiLAkweGZjMDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCi17ICJtb3YiLAkweGZjYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweGZjMjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweGZjYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgQU4wfX0sCi17ICJtb3YiLAkweGZjMTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3YiLAkweGZjOTEwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMiwgU1ApfX0sCi17ICJtb3YiLAkweGZjMzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0FNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3YiLAkweGZjOTAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0FNMSwgTUVNMihJTU0zMiwgU1ApfX0sCi0vKiBUaGVzZSBub24tcHJvbW90aW5nIHZhcmlhbnRzIG5lZWQgdG8gY29tZSBhZnRlciBhbGwgdGhlIG90aGVyIG1lbW9yeQotICAgbW92ZXMuICAqLwoteyAibW92IiwJMHhmOGYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtNRU0yKFNEOE4sIEFNMCksIFNQfX0sCi17ICJtb3YiLAkweGY4ZjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe1NQLCBNRU0yKFNEOE4sIEFOMCl9fSwKLS8qIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgbm9uLXByb21vdGluZyB2ZXJzaW9ucy4gIFRoZSBhbTMzCi0gICBkb2VzIG5vdCBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgb2Zmc2V0cyB1c2VkIHRvIGxvYWQvc3RvcmUgdGhlIHN0YWNrCi0gICBwb2ludGVyLiAgKi8KLXsgIm1vdiIsCTB4ZjhmMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMzLAl7TUVNMihTRDgsIEFNMCksIFNQfX0sCi17ICJtb3YiLAkweGY4ZjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMywJe1NQLCBNRU0yKFNEOCwgQU4wKX19LAotLyogVGhlc2UgbXVzdCBjb21lIGxhc3Qgc28gdGhhdCB3ZSBmYXZvciBzaG9ydGVyIG1vdmUgaW5zdHJ1Y3Rpb25zIGZvcgotICAgbG9hZGluZyBpbW1lZGlhdGVzIGludG8gZDAtZDMvYTAtYTMuICAqLwoteyAibW92IiwJMHhmYjA4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAibW92IiwJMHhmZDA4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgIm1vdiIsCTB4ZmUwODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1vdiIsCTB4ZmJmODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFhSTjAyfX0sCi17ICJtb3YiLAkweGZkZjgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgWFJOMDJ9fSwKLXsgIm1vdiIsCTB4ZmVmODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFhSTjAyfX0sCi17ICJtb3YiLAkweGZlMGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTShJTU0zMl9ISUdIOF9NRU0pLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmUxZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0oSU1NMzJfSElHSDhfTUVNKX19LAoteyAibW92IiwJMHhmZTBhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LFJNMCksIFJOMn19LAoteyAibW92IiwJMHhmZTFhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFJOMCl9fSwKLXsgIm1vdiIsCTB4ZmU4YTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNMihJTU0zMl9ISUdIOCwgU1ApLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmU5YTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTMyX0hJR0g4LCBTUCl9fSwKLQoteyAibW92dSIsCTB4ZmIxODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAibW92dSIsCTB4ZmQxODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgIm1vdnUiLAkweGZlMTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgIm1jc3Q5IiwJMHhmNjMwLCAgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETjAxfX0sCi17ICJtY3N0NDgiLAkweGY2NjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0ROMDF9fSwKLXsgInN3YXAiLAkweGY2ODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0RNMSwgRE4wfX0sCi17ICJzd2FwIiwJMHhmOWNiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAic3dhcGgiLAkweGY2OTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0RNMSwgRE4wfX0sCi17ICJzd2FwaCIsCTB4ZjlkYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImdldGNoeCIsCTB4ZjZjMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE4wMX19LAoteyAiZ2V0Y2x4IiwJMHhmNmQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETjAxfX0sCi17ICJtYWMiLAkweGZiMGYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAibWFjIiwJMHhmOTBiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjIiwJMHhmYjBiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAibWFjIiwJMHhmZDBiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgIm1hYyIsCTB4ZmUwYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1hY3UiLAkweGZiMWYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAibWFjdSIsCTB4ZjkxYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1hY3UiLAkweGZiMWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgIm1hY3UiLAkweGZkMWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJtYWN1IiwJMHhmZTFiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibWFjYiIsCTB4ZmIyZjAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAibWFjYiIsCTB4ZjkyYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1hY2IiLAkweGZiMmIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJtYWNiIiwJMHhmZDJiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgIm1hY2IiLAkweGZlMmIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtYWNidSIsCTB4ZmIzZjAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAibWFjYnUiLAkweGY5M2IwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtYWNidSIsCTB4ZmIzYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAibWFjYnUiLAkweGZkM2IwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJtYWNidSIsCTB4ZmUzYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1hY2giLAkweGZiNGYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAibWFjaCIsCTB4Zjk0YjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1hY2giLAkweGZiNGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJtYWNoIiwJMHhmZDRiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgIm1hY2giLAkweGZlNGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtYWNodSIsCTB4ZmI1ZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtYWNodSIsCTB4Zjk1YjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1hY2h1IiwJMHhmYjViMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJtYWNodSIsCTB4ZmQ1YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgIm1hY2h1IiwJMHhmZTViMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAiZG1hY2giLAkweGZiNmYwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImRtYWNoIiwJMHhmOTZiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZG1hY2giLAkweGZlNmIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJkbWFjaHUiLAkweGZiN2YwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImRtYWNodSIsCTB4Zjk3YjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImRtYWNodSIsCTB4ZmU3YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImRtdWxoIiwJMHhmYjhmMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgImRtdWxoIiwJMHhmOThiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZG11bGgiLAkweGZlOGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJkbXVsaHUiLAkweGZiOWYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAiZG11bGh1IiwJMHhmOTliMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZG11bGh1IiwJMHhmZTliMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibWNzdGUiLAkweGY5YmIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtY3N0ZSIsCTB4ZmJiYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAic3dodyIsCTB4ZjllYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLQoteyAibW92YnUiLAkweGYwNDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTShBTTApLCBETjF9fSwKLXsgIm1vdmJ1IiwJMHhmODQwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCwgQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4ZmE0MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBETjF9fSwKLXsgIm1vdmJ1IiwJMHhmOGI4MDAsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0oU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmOGI4MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKElNTTgsIFNQKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZmFiODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmNDAwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBETjJ9fSwKLXsgIm1vdmJ1IiwJMHgzNDAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZjA1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAibW92YnUiLAkweGY4NTAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihTRDgsIEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmYTUwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoU0QxNiwgQU4wKX19LAoteyAibW92YnUiLAkweGY4OTIwMCwgICAgMHhmZmYzZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNKFNQKX19LAoteyAibW92YnUiLAkweGY4OTIwMCwgICAgMHhmZmYzMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmYTkyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoSU1NMTYsIFNQKX19LAoteyAibW92YnUiLAkweGY0NDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoteyAibW92YnUiLAkweDAyMDAwMCwgICAgMHhmMzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0RNMSwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdmJ1IiwJMHhmOTJhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtNRU0oUk0wKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZjkzYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oUk4wKX19LAoteyAibW92YnUiLAkweGY5YWEwMCwgICAgMHhmZmZmMGYsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShTUCksIFJOMn19LAoteyAibW92YnUiLAkweGY5YmEwMCwgICAgMHhmZmZmMGYsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgTUVNKFNQKX19LAoteyAibW92YnUiLAkweGZiMmEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoU0Q4LCBSTTApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZDJhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKFNEMjQsIFJNMCksIFJOMn19LAoteyAibW92YnUiLAkweGZiM2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNMihTRDgsIFJOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmZDNhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoU0QyNCwgUk4wKX19LAoteyAibW92YnUiLAkweGZiYWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoU0Q4LCBTUCksIFJOMn19LAoteyAibW92YnUiLAkweGZkYWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoU0QyNCwgU1ApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmYmJhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoU0Q4LCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmZGJhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoU0QyNCwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZmIyZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNKElNTThfTUVNKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmQyZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNKElNTTI0X01FTSksIFJOMn19LAoteyAibW92YnUiLAkweGZiM2UwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNKElNTThfTUVNKX19LAoteyAibW92YnUiLAkweGZkM2UwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdmJ1IiwJMHhmYmFlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFJJLCBSTTApLCBSRDJ9fSwKLXsgIm1vdmJ1IiwJMHhmYmJlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSRDIsIE1FTTIoUkksIFJOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmYzQwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGZjYjgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZmNhODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92YnUiLAkweGZjNTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3ZidSIsCTB4ZmM5MjAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmYzgyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCi17ICJtb3ZidSIsCTB4ZmUyYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNMihJTU0zMl9ISUdIOCxSTTApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZTNhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFJOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmZWFhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LFNQKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmViYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTMyX0hJR0g4LCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmZTJlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0oSU1NMzJfSElHSDhfTUVNKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmUzZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0oSU1NMzJfSElHSDhfTUVNKX19LAotCi17ICJtb3ZodSIsCTB4ZjA2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGY4NjAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdmh1IiwJMHhmYTYwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGY4YmMwMCwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92aHUiLAkweGY4YmMwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmYWJjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92aHUiLAkweGY0ODAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92aHUiLAkweDM4MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmMDcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3ZodSIsCTB4Zjg3MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92aHUiLAkweGZhNzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3ZodSIsCTB4Zjg5MzAwLCAgICAweGZmZjNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3ZodSIsCTB4Zjg5MzAwLCAgICAweGZmZjMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92aHUiLAkweGZhOTMwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZjRjMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3ZodSIsCTB4MDMwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92aHUiLAkweGY5NGEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShSTTApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmOTVhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShSTjApfX0sCi17ICJtb3ZodSIsCTB4ZjljYTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFNQKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZjlkYTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oU1ApfX0sCi17ICJtb3ZodSIsCTB4ZjllYTAwLCAgICAweGZmZmYwMCwgICAgMHgxMiwgRk1UX0Q2LCBBTTMzLAl7TUVNSU5DKFJNMCksIFJOMn19LAoteyAibW92aHUiLAkweGY5ZmEwMCwgICAgMHhmZmZmMDAsICAgIDAsCUZNVF9ENiwgQU0zMywJe1JNMiwgTUVNSU5DKFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYjRhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFNEOCwgUk0wKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmQ0YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNMihTRDI0LCBSTTApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmYjVhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoU0Q4LCBSTjApfX0sCi17ICJtb3ZodSIsCTB4ZmQ1YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKFNEMjQsIFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYmNhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFNEOCwgU1ApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZGNhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKFNEMjQsIFNQKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmJkYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0yKFNEOCwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZmRkYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKFNEMjQsIFNQKX19LAoteyAibW92aHUiLAkweGZiNGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTShJTU04X01FTSksIFJOMn19LAoteyAibW92aHUiLAkweGZkNGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTShJTU0yNF9NRU0pLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmYmNlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFJJLCBSTTApLCBSRDJ9fSwKLXsgIm1vdmh1IiwJMHhmYmRlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSRDIsIE1FTTIoUkksIFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYzYwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGZjYmMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZmNhYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92aHUiLAkweGZjNzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3ZodSIsCTB4ZmM5MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmYzgzMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCi17ICJtb3ZodSIsCTB4ZmU0YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNMihJTU0zMl9ISUdIOCxSTTApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZTVhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmZWNhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LCBTUCksIFJOMn19LAoteyAibW92aHUiLAkweGZlZGEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNMihJTU0zMl9ISUdIOCwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZmU0ZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNKElNTTMyX0hJR0g4X01FTSksIFJOMn19LAoteyAibW92aHUiLAkweGZiNWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNKElNTThfTUVNKX19LAoteyAibW92aHUiLAkweGZkNWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdmh1IiwJMHhmZTVlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTShJTU0zMl9ISUdIOF9NRU0pfX0sCi17ICJtb3ZodSIsCTB4ZmJlYTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q3LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBTSU1NOCksIFJOMn19LAoteyAibW92aHUiLAkweGZiZmEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9ENywgQU0zMywJe1JNMiwgTUVNSU5DMiAoUk4wLCBTSU1NOCl9fSwKLXsgIm1vdmh1IiwJMHhmZGVhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDgsIEFNMzMsCXtNRU1JTkMyIChSTTAsIElNTTI0KSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmRmYTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU1JTkMyIChSTjAsIElNTTI0KX19LAoteyAibW92aHUiLAkweGZlZWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9EOSwgQU0zMywJe01FTUlOQzIgKFJNMCwgSU1NMzJfSElHSDgpLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZWZhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDksIEFNMzMsCXtSTjIsIE1FTUlOQzIgKFJNMCwgSU1NMzJfSElHSDgpfX0sCi0KLXsgImV4dCIsCTB4ZjJkMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi17ICJleHQiLAkweGY5MTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiZXh0YiIsCTB4ZjkyODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImV4dGIiLAkweDEwLCAJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAoteyAiZXh0YiIsCTB4ZjkyODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJleHRidSIsCTB4ZjkzODAwLCAgICAweGZmZmYwMCwJICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZXh0YnUiLAkweDE0LAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi17ICJleHRidSIsCTB4ZjkzODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJleHRoIiwJMHhmOTQ4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZXh0aCIsCTB4MTgsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLXsgImV4dGgiLAkweGY5NDgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiZXh0aHUiLAkweGY5NTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJleHRodSIsCTB4MWMsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLXsgImV4dGh1IiwJMHhmOTU4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgIm1vdm0iLAkweGNlMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIFJFR1N9fSwKLXsgIm1vdm0iLAkweGNmMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1JFR1MsIE1FTShTUCl9fSwKLXsgIm1vdm0iLAkweGY4Y2UwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMywJe01FTShVU1ApLCBSRUdTfX0sCi17ICJtb3ZtIiwJMHhmOGNmMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzMsCXtSRUdTLCBNRU0oVVNQKX19LAotCi17ICJjbHIiLAkweDAwLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4xfX0sCi17ICJjbHIiLAkweGY5NjgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiYWRkIiwJMHhmYjdjMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJhZGQiLAkweGUwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFkZCIsCTB4ZjE2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgImFkZCIsCTB4ZjE1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgImFkZCIsCTB4ZjE3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBBTjB9fSwKLXsgImFkZCIsCTB4MjgwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEROMH19LAoteyAiYWRkIiwJMHhmYWMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAiYWRkIiwJMHgyMDAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgQU4wfX0sCi17ICJhZGQiLAkweGZhZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgQU4wfX0sCi17ICJhZGQiLAkweGY4ZmUwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBTUH19LAoteyAiYWRkIiwJMHhmYWZlMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIFNQfX0sCi17ICJhZGQiLAkweGY5NzgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJhZGQiLAkweGZjYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImFkZCIsCTB4ZmNkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAiYWRkIiwJMHhmY2ZlMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgU1B9fSwKLXsgImFkZCIsCTB4ZmI3ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgImFkZCIsCTB4ZmQ3ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJhZGQiLAkweGZlNzgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgImFkZGMiLAkweGZiOGMwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImFkZGMiLAkweGYxNDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhZGRjIiwJMHhmOTg4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiYWRkYyIsCTB4ZmI4ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgImFkZGMiLAkweGZkODgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAiYWRkYyIsCTB4ZmU4ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAic3ViIiwJMHhmYjljMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJzdWIiLAkweGYxMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJzdWIiLAkweGYxMjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJzdWIiLAkweGYxMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJzdWIiLAkweGYxMzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJzdWIiLAkweGY5OTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJzdWIiLAkweGZjYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInN1YiIsCTB4ZmNkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAic3ViIiwJMHhmYjk4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAic3ViIiwJMHhmZDk4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgInN1YiIsCTB4ZmU5ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAic3ViYyIsCTB4ZmE4YzAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAic3ViYyIsCTB4ZjE4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInN1YmMiLAkweGY5YTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJzdWJjIiwJMHhmYmE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAic3ViYyIsCTB4ZmRhODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJzdWJjIiwJMHhmZWE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJtdWwiLAkweGZiYWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAibXVsIiwJMHhmMjQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAibXVsIiwJMHhmOWE5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibXVsIiwJMHhmYmE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAibXVsIiwJMHhmZGE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgIm11bCIsCTB4ZmVhOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAibXVsdSIsCTB4ZmJiZDAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtdWx1IiwJMHhmMjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAibXVsdSIsCTB4ZjliOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm11bHUiLAkweGZiYjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgIm11bHUiLAkweGZkYjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJtdWx1IiwJMHhmZWI5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJkaXYiLAkweGYyNjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJkaXYiLAkweGY5YzkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi0KLXsgImRpdnUiLAkweGYyNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJkaXZ1IiwJMHhmOWQ5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAotCi17ICJpbmMiLAkweDQwLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4xfX0sCi17ICJpbmMiLAkweDQxLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7QU4xfX0sCi17ICJpbmMiLAkweGY5YjgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiaW5jNCIsCTB4NTAsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtBTjB9fSwKLXsgImluYzQiLAkweGY5YzgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiY21wIiwJMHhhMDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wMX19LAoteyAiY21wIiwJMHhhMCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJjbXAiLAkweGYxYTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJjbXAiLAkweGYxOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJjbXAiLAkweGIwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0lNTTgsIEFOMDF9fSwKLXsgImNtcCIsCTB4YjAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtBTTEsIEFOMH19LAoteyAiY21wIiwJMHhmYWM4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAiY21wIiwJMHhmYWQ4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgQU4wfX0sCi17ICJjbXAiLAkweGY5ZDgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJjbXAiLAkweGZjYzgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImNtcCIsCTB4ZmNkODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAiY21wIiwJMHhmYmQ4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAiY21wIiwJMHhmZGQ4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgImNtcCIsCTB4ZmVkODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAiYW5kIiwJMHhmYjBkMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJhbmQiLAkweGYyMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhbmQiLAkweGY4ZTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYW5kIiwJMHhmYWUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJhbmQiLAkweGZhZmMwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBQU1d9fSwKLXsgImFuZCIsCTB4ZmNmYzAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMzLAl7SU1NMzIsIEVQU1d9fSwKLXsgImFuZCIsCTB4ZjkwOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImFuZCIsCTB4ZmNlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAiYW5kIiwJMHhmYjA5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJhbmQiLAkweGZkMDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJhbmQiLAkweGZlMDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgIm9yIiwJCTB4ZmIxZDAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAib3IiLAkJMHhmMjEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAib3IiLAkJMHhmOGU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgIm9yIiwJCTB4ZmFlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoteyAib3IiLAkJMHhmYWZkMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgUFNXfX0sCi17ICJvciIsCQkweGZjZmQwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgQU0zMywJe0lNTTMyLCBFUFNXfX0sCi17ICJvciIsCQkweGY5MTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJvciIsCQkweGZjZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgIm9yIiwJCTB4ZmIxOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAib3IiLAkJMHhmZDE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAib3IiLAkJMHhmZTE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJ4b3IiLAkweGZiMmQwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgInhvciIsCTB4ZjIyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInhvciIsCTB4ZmFlODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoteyAieG9yIiwJMHhmOTI5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAieG9yIiwJMHhmY2U4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ4b3IiLAkweGZiMjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgInhvciIsCTB4ZmQyOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgInhvciIsCTB4ZmUyOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAibm90IiwJMHhmMjMwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLXsgIm5vdCIsCTB4ZjkzOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJidHN0IiwJMHhmOGVjMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImJ0c3QiLAkweGZhZWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgImJ0c3QiLAkweGZjZWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLS8qIFBsYWNlIHRoZXNlIGJlZm9yZSB0aGUgb25lcyB3aXRoIElNTThFIGFuZCBTRDhOX1NISUZUOCBzaW5jZSB3ZSB3YW50IHRoZQotICAgdGhlbSB0byBtYXRjaCBsYXN0IHNpbmNlIHRoZXkgZG8gbm90IHByb21vdGUuICAqLwoteyAiYnRzdCIsCTB4ZmJlOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAiYnRzdCIsCTB4ZmRlOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgImJ0c3QiLAkweGZlZTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJidHN0IiwJMHhmZTAyMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDUsIDAsCXtJTU04RSwgTUVNKElNTTMyX0xPV1NISUZUOCl9fSwKLXsgImJ0c3QiLAkweGZhZjgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgCXtJTU04LCBNRU0yKFNEOE5fU0hJRlQ4LCBBTjApfX0sCi0KLXsgImJzZXQiLAkweGYwODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgImJzZXQiLAkweGZlMDAwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoteyAiYnNldCIsCTB4ZmFmMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NOCwgTUVNMihTRDhOX1NISUZUOCwgQU4wKX19LAotCi17ICJiY2xyIiwJMHhmMDkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJiY2xyIiwJMHhmZTAxMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDUsIDAsCXtJTU04RSwgTUVNKElNTTMyX0xPV1NISUZUOCl9fSwKLXsgImJjbHIiLAkweGZhZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTgsIE1FTTIoU0Q4Tl9TSElGVDgsQU4wKX19LAotCi17ICJhc3IiLAkweGZiNGQwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImFzciIsCTB4ZjJiMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFzciIsCTB4ZjhjODAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJhc3IiLAkweGY5NDkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJhc3IiLAkweGZiNDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgImFzciIsCTB4ZmQ0OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgImFzciIsCTB4ZmU0OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImFzciIsCTB4ZjhjODAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCi17ICJhc3IiLAkweGZiNDkwMDAxLCAgMHhmZmZmMDBmZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JOMDJ9fSwKLQoteyAibHNyIiwJMHhmYjVkMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJsc3IiLAkweGYyYTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJsc3IiLAkweGY4YzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAibHNyIiwJMHhmOTU5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibHNyIiwJMHhmYjU5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJsc3IiLAkweGZkNTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJsc3IiLAkweGZlNTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJsc3IiLAkweGY4YzQwMSwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0ROMH19LAoteyAibHNyIiwJMHhmYjU5MDAwMSwgIDB4ZmZmZjAwZmYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImFzbCIsCTB4ZmI2ZDAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiYXNsIiwJMHhmMjkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiYXNsIiwJMHhmOGMwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImFzbCIsCTB4Zjk2OTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImFzbCIsCTB4ZmI2OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgImFzbCIsCTB4ZmQ2OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgImFzbCIsCTB4ZmU2OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImFzbCIsCTB4ZjhjMDAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCi17ICJhc2wiLAkweGZiNjkwMDAxLCAgMHhmZmZmMDBmZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JOMDJ9fSwKLQoteyAiYXNsMiIsCTB4NTQsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLXsgImFzbDIiLAkweGY5NzkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAicm9yIiwJMHhmMjg0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLXsgInJvciIsCTB4Zjk4OTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJyb2wiLAkweGYyODAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAoteyAicm9sIiwJMHhmOTk5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImJlcSIsCTB4YzgwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5lIiwJMHhjOTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiZ3QiLAkweGMxMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJnZSIsCTB4YzIwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmxlIiwJMHhjMzAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibHQiLAkweGMwMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJoaSIsCTB4YzUwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmNjIiwJMHhjNjAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibHMiLAkweGM3MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJjcyIsCTB4YzQwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYnZjIiwJMHhmOGU4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJidnMiLAkweGY4ZTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJuYyIsCTB4ZjhlYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5zIiwJMHhmOGViMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJicmEiLAkweGNhMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLQoteyAibGVxIiwJMHhkOCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibG5lIiwJMHhkOSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGd0IiwJMHhkMSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGdlIiwJMHhkMiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGxlIiwJMHhkMywJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGx0IiwJMHhkMCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGhpIiwJMHhkNSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGNjIiwJMHhkNiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGxzIiwJMHhkNywJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGNzIiwJMHhkNCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibHJhIiwJMHhkYSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAic2V0bGIiLAkweGRiLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLXsgImptcCIsCTB4ZjBmNCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7UEFSRU4sQU4wLFBBUkVOfX0sCi17ICJqbXAiLAkweGNjMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0lNTTE2X1BDUkVMfX0sCi17ICJqbXAiLAkweGRjMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNCwgMCwJe0lNTTMyX0hJR0gyNH19LAoteyAiY2FsbCIsCTB4Y2QwMDAwMDAsICAweGZmMDAwMDAwLCAgMCwgICAgRk1UX1M0LCAwLAl7RDE2X1NISUZULFJFR1MsSU1NOEV9fSwKLXsgImNhbGwiLAkweGRkMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNiwgMCwJe0lNTTMyX0hJR0gyNF9MT1dTSElGVDE2LCBSRUdTRV9TSElGVDgsSU1NOEV9fSwKLXsgImNhbGxzIiwJMHhmMGYwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQQVJFTixBTjAsUEFSRU59fSwKLXsgImNhbGxzIiwJMHhmYWZmMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNl9QQ1JFTH19LAoteyAiY2FsbHMiLAkweGZjZmYwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyX1BDUkVMfX0sCi0KLXsgInJldCIsCTB4ZGYwMDAwLCAgICAweGZmMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7UkVHU19TSElGVDgsIElNTTh9fSwKLXsgInJldGYiLAkweGRlMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1JFR1NfU0hJRlQ4LCBJTU04fX0sCi17ICJyZXRzIiwJMHhmMGZjLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInJ0aSIsCTB4ZjBmZCwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJ0cmFwIiwJMHhmMGZlLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInJ0bSIsCTB4ZjBmZiwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJub3AiLAkweGNiLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLS8qIFVERiBpbnN0cnVjdGlvbnMuICAqLwoteyAidWRmMDAiLAkweGY2MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMCIsCTB4ZjkwMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDAiLAkweGZiMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAwIiwJMHhmZDAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZjYxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAxIiwJMHhmOTEwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZmIxMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDEiLAkweGZkMTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjAyIiwJMHhmNjIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDIiLAkweGY5MjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjAyIiwJMHhmYjIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwMiIsCTB4ZmQyMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDMiLAkweGY2MzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZjkzMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDMiLAkweGZiMzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAzIiwJMHhmZDMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZjY0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA0IiwJMHhmOTQwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZmI0MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDQiLAkweGZkNDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA1IiwJMHhmNjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDUiLAkweGY5NTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA1IiwJMHhmYjUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNSIsCTB4ZmQ1MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDYiLAkweGY2NjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4Zjk2MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDYiLAkweGZiNjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA2IiwJMHhmZDYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZjY3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA3IiwJMHhmOTcwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZmI3MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDciLAkweGZkNzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA4IiwJMHhmNjgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDgiLAkweGY5ODAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA4IiwJMHhmYjgwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwOCIsCTB4ZmQ4MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDkiLAkweGY2OTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4Zjk5MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDkiLAkweGZiOTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA5IiwJMHhmZDkwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZjZhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEwIiwJMHhmOWEwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZmJhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTAiLAkweGZkYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjExIiwJMHhmNmIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTEiLAkweGY5YjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjExIiwJMHhmYmIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMSIsCTB4ZmRiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTIiLAkweGY2YzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZjljMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTIiLAkweGZiYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjEyIiwJMHhmZGMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZjZkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEzIiwJMHhmOWQwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZmJkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTMiLAkweGZkZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjE0IiwJMHhmNmUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTQiLAkweGY5ZTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjE0IiwJMHhmYmUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxNCIsCTB4ZmRlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTUiLAkweGY2ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZjlmMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTUiLAkweGZiZjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjE1IiwJMHhmZGYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYyMCIsCTB4ZjUwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjIxIiwJMHhmNTEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjIiLAkweGY1MjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyMyIsCTB4ZjUzMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI0IiwJMHhmNTQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjUiLAkweGY1NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyNiIsCTB4ZjU2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI3IiwJMHhmNTcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjgiLAkweGY1ODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyOSIsCTB4ZjU5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMwIiwJMHhmNWEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzEiLAkweGY1YjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzMiIsCTB4ZjVjMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMzIiwJMHhmNWQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzQiLAkweGY1ZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzNSIsCTB4ZjVmMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZnUwMCIsCTB4ZjkwNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDAiLAkweGZiMDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAwIiwJMHhmZDA0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDEiLAkweGY5MTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTAxIiwJMHhmYjE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwMSIsCTB4ZmQxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTAyIiwJMHhmOTI0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMiIsCTB4ZmIyNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDIiLAkweGZkMjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwMyIsCTB4ZjkzNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDMiLAkweGZiMzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAzIiwJMHhmZDM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDQiLAkweGY5NDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA0IiwJMHhmYjQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNCIsCTB4ZmQ0NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA1IiwJMHhmOTU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwNSIsCTB4ZmI1NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDUiLAkweGZkNTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNiIsCTB4Zjk2NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDYiLAkweGZiNjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA2IiwJMHhmZDY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDciLAkweGY5NzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA3IiwJMHhmYjc0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNyIsCTB4ZmQ3NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA4IiwJMHhmOTg0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwOCIsCTB4ZmI4NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDgiLAkweGZkODQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwOSIsCTB4Zjk5NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDkiLAkweGZiOTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA5IiwJMHhmZDk0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTAiLAkweGY5YTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEwIiwJMHhmYmE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMCIsCTB4ZmRhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTExIiwJMHhmOWI0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxMSIsCTB4ZmJiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTEiLAkweGZkYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMiIsCTB4ZjljNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTIiLAkweGZiYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTEyIiwJMHhmZGM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTMiLAkweGY5ZDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEzIiwJMHhmYmQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMyIsCTB4ZmRkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTE0IiwJMHhmOWU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxNCIsCTB4ZmJlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTQiLAkweGZkZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxNSIsCTB4ZjlmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTUiLAkweGZiZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTE1IiwJMHhmZGY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi0KLXsgInB1dHgiLAkweGY1MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0ROMDF9fSwKLXsgImdldHgiLAkweGY2ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0ROMDF9fSwKLXsgIm11bHEiLAkweGY2MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJtdWxxIiwJMHhmOTAwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTSU1NOCwgRE4wfX0sCi17ICJtdWxxIiwJMHhmYjAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIEFNMzAsCXtTSU1NMTYsIEROMH19LAoteyAibXVscSIsCTB4ZmQwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMwLAl7SU1NMzIsIEROMH19LAoteyAibXVscXUiLAkweGY2MTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZjkxNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U0lNTTgsIEROMH19LAoteyAibXVscXUiLAkweGZiMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgQU0zMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZmQxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMwLAl7SU1NMzIsIEROMH19LAoteyAic2F0MTYiLAkweGY2NDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJzYXQxNiIsCTB4ZjlhYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLQoteyAic2F0MjQiLAkweGY2NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJzYXQyNCIsCTB4ZmJhZjAwMDAsICAweGZmZmYwMGZmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLQoteyAiYnNjaCIsCTB4ZmJmZjAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiYnNjaCIsCTB4ZjY3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLXsgImJzY2giLAkweGY5ZmIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdlIG5lZWQgc29tZSBpbnN0cnVjdGlvbiB0byB0cmlnZ2VyICJlbXVsYXRlZCBzeXNjYWxscyIKLSAgIGZvciBvdXIgc2ltdWxhdG9yLiAgKi8KLXsgInN5c2NhbGwiLAkweGYwZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0lNTTR9fSwKLXsgInN5c2NhbGwiLCAgICAweGYwYzAsICAgICAgMHhmZmZmLCAgICAgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAotCi0vKiBFeHRlbnNpb24uICBXaGVuIHRhbGtpbmcgdG8gdGhlIHNpbXVsYXRvciwgZ2RiIHJlcXVpcmVzIHNvbWUgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgd2lsbCB0cmlnZ2VyIGEgImJyZWFrcG9pbnQiIChyZWFsbHkganVzdCBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzbid0Ci0gICBvdGhlcndpc2UgdXNlZCBieSB0aGUgdG9vbHMuICBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgdGhlIHNhbWUgc2l6ZQotICAgYXMgdGhlIHNtYWxsZXN0IGluc3RydWN0aW9uIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gIEluIHRoZSBjYXNlIG9mIHRoZQotICAgbW4xMHgwMCB0aGUgImJyZWFrIiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9uZSBieXRlLiAgMHhmZiBpcyBhdmFpbGFibGUgb24KLSAgIGJvdGggbW4xMHgwMCBhcmNoaXRlY3R1cmVzLiAgKi8KLXsgImJyZWFrIiwJMHhmZiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAotCi17ICJhZGRfYWRkIiwJMHhmNzAwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2FkZCIsCTB4ZjcxMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfYWRkIiwJMHhmNzA0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9hZGQiLAkweGY3MTQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9zdWIiLAkweGY3MjAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfc3ViIiwJMHhmNzMwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9zdWIiLAkweGY3MjQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX3N1YiIsCTB4ZjczNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX2NtcCIsCTB4Zjc0MDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9jbXAiLAkweGY3NTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX2NtcCIsCTB4Zjc0NDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfY21wIiwJMHhmNzU0MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfbW92IiwJMHhmNzYwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX21vdiIsCTB4Zjc3MDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfbW92IiwJMHhmNzY0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9tb3YiLAkweGY3NzQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9hc3IiLAkweGY3ODAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYXNyIiwJMHhmNzkwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYWRkX2FzciIsCTB4Zjc4NDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYXNyIiwJMHhmNzk0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9sc3IiLAkweGY3YTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfbHNyIiwJMHhmN2IwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYWRkX2xzciIsCTB4ZjdhNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfbHNyIiwJMHhmN2I0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9hc2wiLAkweGY3YzAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYXNsIiwJMHhmN2QwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYWRkX2FzbCIsCTB4ZjdjNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYXNsIiwJMHhmN2Q0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hZGQiLAkweGY3MDEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYWRkIiwJMHhmNzExMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hZGQiLAkweGY3MDUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2FkZCIsCTB4ZjcxNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiY21wX3N1YiIsCTB4ZjcyMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9zdWIiLAkweGY3MzEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiY21wX3N1YiIsCTB4ZjcyNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfc3ViIiwJMHhmNzM1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJjbXBfbW92IiwJMHhmNzYxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX21vdiIsCTB4Zjc3MTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJjbXBfbW92IiwJMHhmNzY1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9tb3YiLAkweGY3NzUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hc3IiLAkweGY3ODEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYXNyIiwJMHhmNzkxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2FzciIsCTB4Zjc4NTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYXNyIiwJMHhmNzk1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9sc3IiLAkweGY3YTEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfbHNyIiwJMHhmN2IxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2xzciIsCTB4ZjdhNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfbHNyIiwJMHhmN2I1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hc2wiLAkweGY3YzEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYXNsIiwJMHhmN2QxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2FzbCIsCTB4ZjdjNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYXNsIiwJMHhmN2Q1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9hZGQiLAkweGY3MDIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfYWRkIiwJMHhmNzEyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9hZGQiLAkweGY3MDYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2FkZCIsCTB4ZjcxNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX3N1YiIsCTB4ZjcyMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9zdWIiLAkweGY3MzIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX3N1YiIsCTB4ZjcyNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfc3ViIiwJMHhmNzM2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfY21wIiwJMHhmNzQyMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2NtcCIsCTB4Zjc1MjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfY21wIiwJMHhmNzQ2MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9jbXAiLAkweGY3NTYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9tb3YiLAkweGY3NjIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfbW92IiwJMHhmNzcyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9tb3YiLAkweGY3NjYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX21vdiIsCTB4Zjc3NjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX2FzciIsCTB4Zjc4MjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hc3IiLAkweGY3OTIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfYXNyIiwJMHhmNzg2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hc3IiLAkweGY3OTYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3ViX2xzciIsCTB4ZjdhMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9sc3IiLAkweGY3YjIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfbHNyIiwJMHhmN2E2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9sc3IiLAkweGY3YjYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3ViX2FzbCIsCTB4ZjdjMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hc2wiLAkweGY3ZDIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfYXNsIiwJMHhmN2M2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hc2wiLAkweGY3ZDYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAibW92X2FkZCIsCTB4ZjcwMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9hZGQiLAkweGY3MTMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X2FkZCIsCTB4ZjcwNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfYWRkIiwJMHhmNzE3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3Zfc3ViIiwJMHhmNzIzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X3N1YiIsCTB4ZjczMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3Zfc3ViIiwJMHhmNzI3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9zdWIiLAkweGY3MzcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9jbXAiLAkweGY3NDMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfY21wIiwJMHhmNzUzMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9jbXAiLAkweGY3NDcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2NtcCIsCTB4Zjc1NzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X21vdiIsCTB4Zjc2MzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9tb3YiLAkweGY3NzMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X21vdiIsCTB4Zjc2NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfbW92IiwJMHhmNzc3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3ZfYXNyIiwJMHhmNzgzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FzciIsCTB4Zjc5MzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9hc3IiLAkweGY3ODcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FzciIsCTB4Zjc5NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJtb3ZfbHNyIiwJMHhmN2EzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2xzciIsCTB4ZjdiMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9sc3IiLAkweGY3YTcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2xzciIsCTB4ZjdiNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJtb3ZfYXNsIiwJMHhmN2MzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FzbCIsCTB4ZjdkMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9hc2wiLAkweGY3YzcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FzbCIsCTB4ZjdkNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhbmRfYWRkIiwJMHhmNzA4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX2FkZCIsCTB4ZjcxODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhbmRfc3ViIiwJMHhmNzI4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX3N1YiIsCTB4ZjczODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhbmRfY21wIiwJMHhmNzQ4MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX2NtcCIsCTB4Zjc1ODAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhbmRfbW92IiwJMHhmNzY4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX21vdiIsCTB4Zjc3ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhbmRfYXNyIiwJMHhmNzg4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX2FzciIsCTB4Zjc5ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFuZF9sc3IiLAkweGY3YTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhbmRfbHNyIiwJMHhmN2I4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYW5kX2FzbCIsCTB4ZjdjODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFuZF9hc2wiLAkweGY3ZDgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9hZGQiLAkweGY3MDkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9hZGQiLAkweGY3MTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfc3ViIiwJMHhmNzI5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfc3ViIiwJMHhmNzM5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImRtYWNoX2NtcCIsCTB4Zjc0OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImRtYWNoX2NtcCIsCTB4Zjc1OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9tb3YiLAkweGY3NjkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9tb3YiLAkweGY3NzkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfYXNyIiwJMHhmNzg5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfYXNyIiwJMHhmNzk5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfbHNyIiwJMHhmN2E5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfbHNyIiwJMHhmN2I5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfYXNsIiwJMHhmN2M5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfYXNsIiwJMHhmN2Q5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAieG9yX2FkZCIsCTB4ZjcwYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9hZGQiLAkweGY3MWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAieG9yX3N1YiIsCTB4ZjcyYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9zdWIiLAkweGY3M2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAieG9yX2NtcCIsCTB4Zjc0YTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9jbXAiLAkweGY3NWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAieG9yX21vdiIsCTB4Zjc2YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9tb3YiLAkweGY3N2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAieG9yX2FzciIsCTB4Zjc4YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9hc3IiLAkweGY3OWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJ4b3JfbHNyIiwJMHhmN2FhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAieG9yX2xzciIsCTB4ZjdiYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInhvcl9hc2wiLAkweGY3Y2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJ4b3JfYXNsIiwJMHhmN2RhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3dod19hZGQiLAkweGY3MGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X2FkZCIsCTB4ZjcxYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzd2h3X3N1YiIsCTB4ZjcyYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfc3ViIiwJMHhmNzNiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfY21wIiwJMHhmNzRiMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19jbXAiLAkweGY3NWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3dod19tb3YiLAkweGY3NmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X21vdiIsCTB4Zjc3YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzd2h3X2FzciIsCTB4Zjc4YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfYXNyIiwJMHhmNzliMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3dod19sc3IiLAkweGY3YWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X2xzciIsCTB4ZjdiYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfYXNsIiwJMHhmN2NiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19hc2wiLAkweGY3ZGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJvcl9hZGQiLAkweGY3MGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9hZGQiLAkweGY3MWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAib3Jfc3ViIiwJMHhmNzJjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3Jfc3ViIiwJMHhmNzNjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm9yX2NtcCIsCTB4Zjc0YzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm9yX2NtcCIsCTB4Zjc1YzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJvcl9tb3YiLAkweGY3NmMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9tb3YiLAkweGY3N2MwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAib3JfYXNyIiwJMHhmNzhjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfYXNyIiwJMHhmNzljMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAib3JfbHNyIiwJMHhmN2FjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfbHNyIiwJMHhmN2JjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAib3JfYXNsIiwJMHhmN2NjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfYXNsIiwJMHhmN2RjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic2F0MTZfYWRkIiwJMHhmNzBkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfYWRkIiwJMHhmNzFkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X3N1YiIsCTB4ZjcyZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X3N1YiIsCTB4ZjczZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzYXQxNl9jbXAiLAkweGY3NGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzYXQxNl9jbXAiLAkweGY3NWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic2F0MTZfbW92IiwJMHhmNzZkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfbW92IiwJMHhmNzdkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X2FzciIsCTB4Zjc4ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X2FzciIsCTB4Zjc5ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X2xzciIsCTB4ZjdhZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X2xzciIsCTB4ZjdiZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X2FzbCIsCTB4ZjdjZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X2FzbCIsCTB4ZjdkZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLS8qIFVnaC4gIFN5bnRoZXRpYyBpbnN0cnVjdGlvbnMuICAqLwoteyAiYWRkX2FuZCIsCTB4ZjcwODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9hbmQiLAkweGY3MTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX2RtYWNoIiwJMHhmNzA5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX2RtYWNoIiwJMHhmNzE5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9vciIsCTB4ZjcwYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9vciIsCTB4ZjcxYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfc2F0MTYiLAkweGY3MGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfc2F0MTYiLAkweGY3MWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX3N3aHciLAkweGY3MGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfc3dodyIsCTB4ZjcxYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfeG9yIiwJMHhmNzBhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX3hvciIsCTB4ZjcxYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfYWRkIiwJMHhmN2MwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2FkZCIsCTB4ZjdkMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9hZGQiLAkweGY3YzQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX2FkZCIsCTB4ZjdkNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfYW5kIiwJMHhmN2M4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2FuZCIsCTB4ZjdkODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9jbXAiLAkweGY3YzEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfY21wIiwJMHhmN2QxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONCwgfX0sCi17ICJhc2xfY21wIiwJMHhmN2M1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9jbXAiLAkweGY3ZDUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX2RtYWNoIiwJMHhmN2M5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2RtYWNoIiwJMHhmN2Q5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX21vdiIsCTB4ZjdjMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9tb3YiLAkweGY3ZDMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfbW92IiwJMHhmN2M3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9tb3YiLAkweGY3ZDcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX29yIiwJMHhmN2NjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX29yIiwJMHhmN2RjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3NhdDE2IiwJMHhmN2NkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3NhdDE2IiwJMHhmN2RkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3N1YiIsCTB4ZjdjMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9zdWIiLAkweGY3ZDIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfc3ViIiwJMHhmN2M2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9zdWIiLAkweGY3ZDYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX3N3aHciLAkweGY3Y2IwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfc3dodyIsCTB4ZjdkYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF94b3IiLAkweGY3Y2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfeG9yIiwJMHhmN2RhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2FkZCIsCTB4Zjc4MDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9hZGQiLAkweGY3OTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfYWRkIiwJMHhmNzg0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9hZGQiLAkweGY3OTQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX2FuZCIsCTB4Zjc4ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9hbmQiLAkweGY3OTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfY21wIiwJMHhmNzgxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2NtcCIsCTB4Zjc5MTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjQsIH19LAoteyAiYXNyX2NtcCIsCTB4Zjc4NTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3JfY21wIiwJMHhmNzk1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9kbWFjaCIsCTB4Zjc4OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9kbWFjaCIsCTB4Zjc5OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9tb3YiLAkweGY3ODMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfbW92IiwJMHhmNzkzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX21vdiIsCTB4Zjc4NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3JfbW92IiwJMHhmNzk3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9vciIsCTB4Zjc4YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9vciIsCTB4Zjc5YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zYXQxNiIsCTB4Zjc4ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zYXQxNiIsCTB4Zjc5ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zdWIiLAkweGY3ODIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3Jfc3ViIiwJMHhmNzkyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3N1YiIsCTB4Zjc4NjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3Jfc3ViIiwJMHhmNzk2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9zd2h3IiwJMHhmNzhiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3N3aHciLAkweGY3OWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfeG9yIiwJMHhmNzhhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3hvciIsCTB4Zjc5YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9hbmQiLAkweGY3NDgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfYW5kIiwJMHhmNzU4MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9kbWFjaCIsCTB4Zjc0OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9kbWFjaCIsCTB4Zjc1OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfb3IiLAkweGY3NGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfb3IiLAkweGY3NWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3NhdDE2IiwJMHhmNzRkMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3NhdDE2IiwJMHhmNzVkMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9zd2h3IiwJMHhmNzRiMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3N3aHciLAkweGY3NWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3hvciIsCTB4Zjc0YTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF94b3IiLAkweGY3NWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2FkZCIsCTB4ZjdhMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9hZGQiLAkweGY3YjAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfYWRkIiwJMHhmN2E0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9hZGQiLAkweGY3YjQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX2FuZCIsCTB4ZjdhODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9hbmQiLAkweGY3YjgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfY21wIiwJMHhmN2ExMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2NtcCIsCTB4ZjdiMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjQsIH19LAoteyAibHNyX2NtcCIsCTB4ZjdhNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3JfY21wIiwJMHhmN2I1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9kbWFjaCIsCTB4ZjdhOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9kbWFjaCIsCTB4ZjdiOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9tb3YiLAkweGY3YTMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfbW92IiwJMHhmN2IzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX21vdiIsCTB4ZjdhNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3JfbW92IiwJMHhmN2I3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9vciIsCTB4ZjdhYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9vciIsCTB4ZjdiYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zYXQxNiIsCTB4ZjdhZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zYXQxNiIsCTB4ZjdiZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zdWIiLAkweGY3YTIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3Jfc3ViIiwJMHhmN2IyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3N1YiIsCTB4ZjdhNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3Jfc3ViIiwJMHhmN2I2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9zd2h3IiwJMHhmN2FiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3N3aHciLAkweGY3YmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfeG9yIiwJMHhmN2FhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3hvciIsCTB4ZjdiYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9hbmQiLAkweGY3NjgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfYW5kIiwJMHhmNzc4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9kbWFjaCIsCTB4Zjc2OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9kbWFjaCIsCTB4Zjc3OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3Zfb3IiLAkweGY3NmMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3Zfb3IiLAkweGY3N2MwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3NhdDE2IiwJMHhmNzZkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3NhdDE2IiwJMHhmNzdkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9zd2h3IiwJMHhmNzZiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3N3aHciLAkweGY3N2IwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3hvciIsCTB4Zjc2YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl94b3IiLAkweGY3N2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX2FuZCIsCTB4ZjcyODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9hbmQiLAkweGY3MzgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX2RtYWNoIiwJMHhmNzI5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX2RtYWNoIiwJMHhmNzM5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9vciIsCTB4ZjcyYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9vciIsCTB4ZjczYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfc2F0MTYiLAkweGY3MmQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfc2F0MTYiLAkweGY3M2QwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX3N3aHciLAkweGY3MmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfc3dodyIsCTB4ZjczYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfeG9yIiwJMHhmNzJhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX3hvciIsCTB4ZjczYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfbGx0IiwJMHhmN2UwMDAwMCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGd0IiwJMHhmN2UwMDAwMSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGdlIiwJMHhmN2UwMDAwMiwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGxlIiwJMHhmN2UwMDAwMywgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGNzIiwJMHhmN2UwMDAwNCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGhpIiwJMHhmN2UwMDAwNSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGNjIiwJMHhmN2UwMDAwNiwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGxzIiwJMHhmN2UwMDAwNywgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGVxIiwJMHhmN2UwMDAwOCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbG5lIiwJMHhmN2UwMDAwOSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbHJhIiwJMHhmN2UwMDAwYSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsbHRfbW92IiwJMHhmN2UwMDAwMCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsZ3RfbW92IiwJMHhmN2UwMDAwMSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsZ2VfbW92IiwJMHhmN2UwMDAwMiwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsbGVfbW92IiwJMHhmN2UwMDAwMywgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsY3NfbW92IiwJMHhmN2UwMDAwNCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsaGlfbW92IiwJMHhmN2UwMDAwNSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsY2NfbW92IiwJMHhmN2UwMDAwNiwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsbHNfbW92IiwJMHhmN2UwMDAwNywgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsZXFfbW92IiwJMHhmN2UwMDAwOCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsbmVfbW92IiwJMHhmN2UwMDAwOSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJscmFfbW92IiwJMHhmN2UwMDAwYSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi0gCi17IDAsIDAsIDAsIDAsIDAsIDAsIHswfX0sCi0KLX0gOwotCi1jb25zdCBpbnQgbW4xMDMwMF9udW1fb3Bjb2RlcyA9Ci0gIHNpemVvZiAobW4xMDMwMF9vcGNvZGVzKSAvIHNpemVvZiAobW4xMDMwMF9vcGNvZGVzWzBdKTsKLQotDApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWFzbS5jIGIvb3Bjb2Rlcy9tMzJyLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDNiZDk2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tYXNtLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwYXJzZV9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgY29uc3QgY2hhciAqKiwgQ0dFTl9GSUVMRFMgKikpOwotDAotLyogLS0gYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gYXNtLmMgKi8KLQotLyogSGFuZGxlICcjJyBwcmVmaXhlcyAoaS5lLiBza2lwIG92ZXIgdGhlbSkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oYXNoIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEhhbmRsZSBzaGlnaCgpLCBoaWdoKCkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oaTE2IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLQotICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAiaGlnaCgiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDU7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTywKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLSAgCSAgJiYgcmVzdWx0X3R5cGUgPT0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIpCi0JdmFsdWUgPj49IDE2OwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgInNoaWdoKCIsIDYpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNjsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPLAotIAkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlID0gKHZhbHVlID4+IDE2KSArICh2YWx1ZSAmIDB4ODAwMCA/IDEgOiAwKTsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiBIYW5kbGUgbG93KCkgaW4gYSBzaWduZWQgY29udGV4dC4gIEFsc28gaGFuZGxlIHNkYSgpLgotICAgVGhlIHNpZ25lZG5lc3Mgb2YgdGhlIHZhbHVlIGRvZXNuJ3QgbWF0dGVyIHRvIGxvdygpLCBidXQgdGhpcyBhbHNvCi0gICBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGxvdygpIGlzbid0IHByZXNlbnQuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9zbG8xNiAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBsb25nICp2YWx1ZXA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgImxvdygiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDQ7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9MTzE2LAotCQkJCSAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgIGlmIChlcnJtc2cgPT0gTlVMTAotCSAgJiYgcmVzdWx0X3R5cGUgPT0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIpCi0JdmFsdWUgJj0gMHhmZmZmOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgInNkYSgiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDQ7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9TREExNiwKLQkJCQkgICBOVUxMLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiBIYW5kbGUgbG93KCkgaW4gYW4gdW5zaWduZWQgY29udGV4dC4KLSAgIFRoZSBzaWduZWRuZXNzIG9mIHRoZSB2YWx1ZSBkb2Vzbid0IG1hdHRlciB0byBsb3coKSwgYnV0IHRoaXMgYWxzbwotICAgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBsb3coKSBpc24ndCBwcmVzZW50LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfdWxvMTYgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBpZiAoKipzdHJwID09ICcjJykKLSAgICArKypzdHJwOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJsb3coIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfTE8xNiwKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlICY9IDB4ZmZmZjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIHBhcnNpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWNvbnN0IGNoYXIgKgotbTMycl9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBvcGluZGV4LCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBjaGFyICoqIHN0cnA7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgLyogVXNlZCBieSBzY2FsYXIgb3BlcmFuZHMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHBhcnNlZC4gICovCi0gIGxvbmcganVuazsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgJiBmaWVsZHMtPmZfYWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsICYgZmllbGRzLT5mX2FjY2QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgJiBmaWVsZHMtPmZfYWNjcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9ESVNQMTYsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AxNiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1AyNCwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9ESVNQOCwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hhc2ggKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfSEFTSCwgJmp1bmspOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9oaTE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0hJMTYsICZmaWVsZHMtPmZfaGkxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9JTU0xLCAmZmllbGRzLT5mX2ltbTEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9TSU1NMTYsICZmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0lNTTgsICZmaWVsZHMtPmZfc2ltbTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZXJybXNnID0gcGFyc2Vfc2xvMTYgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0xPMTYsICZmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU0xNiwgJmZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfVUlNTTQsICZmaWVsZHMtPmZfdWltbTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU01LCAmZmllbGRzLT5mX3VpbW01KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX3VsbzE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VMTzE2LCAmZmllbGRzLT5mX3VpbW0xNik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHBhcnNpbmcuXG4iKSwgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLWNnZW5fcGFyc2VfZm4gKiBjb25zdCBtMzJyX2NnZW5fcGFyc2VfaGFuZGxlcnNbXSA9IAotewotICBwYXJzZV9pbnNuX25vcm1hbCwKLX07Ci0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X2FzbSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIG0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBtMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wYXJzZV9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX3BhcnNlX2hhbmRsZXJzWzBdOwotICBjZC0+cGFyc2Vfb3BlcmFuZCA9IG0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IGluc24gcGFyc2VyLgotCi0gICBUaGUgc3ludGF4IHN0cmluZyBpcyBzY2FubmVkIGFuZCBvcGVyYW5kcyBhcmUgcGFyc2VkIGFuZCBzdG9yZWQgaW4gRklFTERTLgotICAgUmVsb2NzIGFyZSBxdWV1ZWQgYXMgd2UgZ28gdmlhIG90aGVyIGNhbGxiYWNrcy4KLQotICAgPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBhbiBhbGwtb3Itbm90aGluZyBwYXJzZXIuICBJZiB3ZSBmYWlsIHRvCi0gICBwYXJzZSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHJldHVybiAwIGFuZCB0aGUgY2FsbGVyIHdpbGwgc3RhcnQgb3ZlciBmcm9tCi0gICB0aGUgYmVnaW5uaW5nLiAgQmFja3RyYWNraW5nIHdpbGwgYmUgbmVjZXNzYXJ5IGluIHBhcnNpbmcgc3ViZXhwcmVzc2lvbnMsCi0gICBidXQgdGhhdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS4gIE5vdCBoYW5kbGluZyBiYWNrdHJhY2tpbmcgaGVyZSBtYXkgZ2V0Ci0gICBleHBlbnNpdmUgaW4gdGhlIGNhc2Ugb2YgdGhlIG02OGsuICBEZWFsIHdpdGggbGF0ZXIuCi0KLSAgIFJldHVybnMgTlVMTCBmb3Igc3VjY2VzcywgYW4gZXJyb3IgbWVzc2FnZSBmb3IgZmFpbHVyZS4KLSovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2luc25fbm9ybWFsIChjZCwgaW5zbiwgc3RycCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotewotICAvKiA/Pz8gUnVudGltZSBhZGRlZCBpbnNucyBub3QgaGFuZGxlZCB5ZXQuICAqLwotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGNvbnN0IGNoYXIgKnN0ciA9ICpzdHJwOwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICAvKiBGSVhNRTogd2lwICovCi0gIGludCBwYXN0X29wY29kZV9wOwotI2VuZGlmCi0KLSAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhlIG1uZW1vbmljIGlzIGZpcnN0ICh0aGVyZSBhcmUgbm8gbGVhZGluZyBvcGVyYW5kcykuCi0gICAgIFdlIGNhbiBwYXJzZSBpdCB3aXRob3V0IG5lZWRpbmcgdG8gc2V0IHVwIG9wZXJhbmQgcGFyc2luZy4KLSAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCBlbnN1cmUgbW5lbW9uaWNzIGFyZSBsb3dlcmNhc2UsIGJ1dCB3ZSBtYXkKLSAgICAgbm90IGJlIGNhbGxlZCBmcm9tIEdBUy4gICovCi0gIHAgPSBDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pOwotICB3aGlsZSAoKnAgJiYgdG9sb3dlciAoKnApID09IHRvbG93ZXIgKCpzdHIpKQotICAgICsrcCwgKytzdHI7Ci0KLSAgaWYgKCogcCkKLSAgICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci0KLSNpZm5kZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICBpZiAoKiBzdHIgJiYgIWlzc3BhY2UgKCogc3RyKSkKLSAgICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci0jZW5kaWYKLQotICBDR0VOX0lOSVRfUEFSU0UgKGNkKTsKLSAgY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgKGNkKTsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIHBhc3Rfb3Bjb2RlX3AgPSAwOwotI2VuZGlmCi0KLSAgLyogV2UgZG9uJ3QgY2hlY2sgZm9yICgqc3RyICE9ICdcMCcpIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHBhcnNlCi0gICAgIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gIHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsKLQotICAvKiBNbmVtb25pY3MgY29tZSBmaXJzdCBmb3Igbm93LCBlbnN1cmUgdmFsaWQgc3RyaW5nLiAgKi8KLSAgaWYgKCEgQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKiBzeW4pKQotICAgIGFib3J0ICgpOwotCi0gICsrc3luOwotCi0gIHdoaWxlICgqIHN5biAhPSAwKQotICAgIHsKLSAgICAgIC8qIE5vbiBvcGVyYW5kIGNoYXJzIG11c3QgbWF0Y2ggZXhhY3RseS4gICovCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqIHN5bikpCi0JewotCSAgLyogRklYTUU6IFdoaWxlIHdlIGFsbG93IGZvciBub24tR0FTIGNhbGxlcnMgYWJvdmUsIHdlIGFzc3VtZSB0aGUKLQkgICAgIGZpcnN0IGNoYXIgYWZ0ZXIgdGhlIG1uZW1vbmljIHBhcnQgaXMgYSBzcGFjZS4gICovCi0JICAvKiBGSVhNRTogV2UgYWxzbyB0YWtlIGluYXBwcm9wcmlhdGUgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQKLQkgICAgIEdBUydzIGlucHV0IHNjcnViYmVyIHdpbGwgcmVtb3ZlIGV4dHJhbmVvdXMgYmxhbmtzLiAgKi8KLQkgIGlmICgqc3RyID09IENHRU5fU1lOVEFYX0NIQVIgKCogc3luKSkKLQkgICAgewotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLQkgICAgICBpZiAoKiBzeW4gPT0gJyAnKQotCQlwYXN0X29wY29kZV9wID0gMTsKLSNlbmRpZgotCSAgICAgICsrIHN5bjsKLQkgICAgICArKyBzdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFN5bnRheCBjaGFyIGRpZG4ndCBtYXRjaC4gIENhbid0IGJlIHRoaXMgaW5zbi4gICovCi0JICAgICAgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gcmV0dXJuIHNvbWV0aGluZyBsaWtlCi0JCSAiZXhwZWN0ZWQgY2hhciBgYyciICovCi0JICAgICAgcmV0dXJuIF8oInN5bnRheCBlcnJvciIpOwotCSAgICB9Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZCBvZiBzb21lIHNvcnQuICAqLwotICAgICAgZXJybXNnID0gbTMycl9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCSAgJnN0ciwgZmllbGRzKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLQotICAgICAgLyogRG9uZSB3aXRoIHRoaXMgb3BlcmFuZCwgY29udGludWUgd2l0aCBuZXh0IG9uZS4gICovCi0gICAgICArKyBzeW47Ci0gICAgfQotCi0gIC8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHN5bnRheCBzdHJpbmcsIHdlJ3JlIGRvbmUuICAqLwotICBpZiAoKiBzeW4gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogRm9yIHRoZSBtb21lbnQgd2UgYXNzdW1lIGEgdmFsaWQgYHN0cicgY2FuIG9ubHkgY29udGFpbgotCSBibGFua3Mgbm93LiAgSUU6IFdlIG5lZWRuJ3QgdHJ5IGFnYWluIHdpdGggYSBsb25nZXIgdmVyc2lvbiBvZgotCSB0aGUgaW5zbiBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IGxvbmdlciB2ZXJzaW9ucyBvZiBpbnNucyBhcHBlYXIKLQkgYmVmb3JlIHNob3J0ZXIgb25lcyAoZWc6IGxzciByMixyMywxIHZzIGxzciByMixyMykuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLQkrKyBzdHI7Ci0KLSAgICAgIGlmICgqIHN0ciAhPSAnXDAnKQotCXJldHVybiBfKCJqdW5rIGF0IGVuZCBvZiBsaW5lIik7IC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgYHN0cicgKi8KLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGNvdWxkbid0IHBhcnNlIGl0LiAgKi8KLSAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotfQotDAotLyogTWFpbiBlbnRyeSBwb2ludC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLgotICAgU1RSIHBvaW50cyB0byB0aGUgaW5zbiB0byBiZSBhc3NlbWJsZWQuCi0gICBXZSBhc3N1bWUgYWxsIG5lY2Vzc2FyeSB0YWJsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgVGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiwgbGVzcyBhbnkgZml4dXBzLCBpcyBzdG9yZWQgaW4gQlVGLgotICAgUmVtZW1iZXIgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgdGhlbiBCVUYgaXMgYW4gaW50IGFuZCB0aHVzIHRoZSB2YWx1ZQotICAgc3RpbGwgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIHRhcmdldCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGIGlzIGFuIGFycmF5Ci0gICBvZiBieXRlcyBpbiB0YXJnZXQgYnl0ZSBvcmRlci4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuJ3MgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSwKLSAgIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJlZCAoYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuCi0gICBwcmludGVkKS4KLQotICAgTm90ZSB0aGF0IHdoZW4gcHJvY2Vzc2luZyAobm9uLWFsaWFzKSBtYWNyby1pbnNucywKLSAgIHRoaXMgZnVuY3Rpb24gcmVjdXJzZXMuCi0KLSAgID8/PyBJdCdzIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBjcHUtaW5kZXBlbmRlbnQuCi0gICBPbmUgd291bGQgaGF2ZSB0byBkZWFsIHdpdGggYSBmZXcgbWlub3IgdGhpbmdzLgotICAgQXQgdGhpcyBwb2ludCBpbiB0aW1lIGRvaW5nIHNvIHdvdWxkIGJlIG1vcmUgb2YgYSBjdXJpb3NpdHkgdGhhbiB1c2VmdWwKLSAgIFtmb3IgZXhhbXBsZSB0aGlzIGZpbGUgaXNuJ3QgX3RoYXRfIGJpZ10sIGJ1dCBrZWVwaW5nIHRoZSBwb3NzaWJpbGl0eSBpbgotICAgbWluZCBoZWxwcyBrZWVwIHRoZSBkZXNpZ24gY2xlYW4uICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24gKGNkLCBzdHIsIGZpZWxkcywgYnVmLCBlcnJtc2cpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLSAgICArKyBzdHI7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2hlZCBsaXN0cy4KLSAgICAgR2V0IHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4gICovCi0gIGlsaXN0ID0gQ0dFTl9BU01fTE9PS1VQX0lOU04gKGNkLCBzdHIpOwotCi0gIC8qIEtlZXAgbG9va2luZyB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guICAqLwotCi0gIHN0YXJ0ID0gc3RyOwotICBmb3IgKCA7IGlsaXN0ICE9IE5VTEwgOyBpbGlzdCA9IENHRU5fQVNNX05FWFRfSU5TTiAoaWxpc3QpKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGlsaXN0LT5pbnNuOwotCi0jaWYgMCAvKiBub3QgbmVlZGVkIGFzIHVuc3VwcG9ydGVkIG9wY29kZXMgc2hvdWxkbid0IGJlIGluIHRoZSBoYXNoIGxpc3RzICovCi0gICAgICAvKiBJcyB0aGlzIGluc24gc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBjcHU/ICAqLwotICAgICAgaWYgKCEgbTMycl9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogSWYgdGhlIFJFTEFYIGF0dHJpYnV0ZSBpcyBzZXQsIHRoaXMgaXMgYW4gaW5zbiB0aGF0IHNob3VsZG4ndCBiZQotCSBjaG9zZW4gaW1tZWRpYXRlbHkuICBJbnN0ZWFkLCBpdCBpcyB1c2VkIGR1cmluZyBhc3NlbWJsZXIvbGlua2VyCi0JIHJlbGF4YXRpb24gaWYgcG9zc2libGUuICAqLwotICAgICAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN0ciA9IHN0YXJ0OwotCi0gICAgICAvKiBBbGxvdyBwYXJzZS9pbnNlcnQgaGFuZGxlcnMgdG8gb2J0YWluIGxlbmd0aCBvZiBpbnNuLiAgKi8KLSAgICAgIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci0KLSAgICAgIGlmICghIENHRU5fUEFSU0VfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sICYgc3RyLCBmaWVsZHMpKQotCXsKLQkgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotCSAgaWYgKENHRU5fSU5TRVJUX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZiwgKGJmZF92bWEpIDApCi0JICAgICAgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JICAvKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGFjdHVhbGx5IG91dHB1dCB0aGUgaW5zbiBhbmQgYW55Ci0JICAgICBxdWV1ZWQgcmVsb2NzLiAgKi8KLQkgIHJldHVybiBpbnNuOwotCX0KLQotICAgICAgLyogVHJ5IHRoZSBuZXh0IGVudHJ5LiAgKi8KLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIGNhbiByZXR1cm4gYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGFuIHRoaXMuCi0gICAgIE5lZWQgdG8gdHJhY2sgd2h5IGl0IGZhaWxlZCBhbmQgcGljayB0aGUgcmlnaHQgb25lLiAgKi8KLSAgewotICAgIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDBdOwotICAgIGlmIChzdHJsZW4gKHN0YXJ0KSA+IDUwKQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcy4uLiciKSwgc3RhcnQpOwotICAgIGVsc2UgCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzJyIpLCBzdGFydCk7Ci0gICAgICAKLSAgICAqZXJybXNnID0gZXJyYnVmOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0MCi0jaWYgMCAvKiBUaGlzIGNhbGxzIGJhY2sgdG8gR0FTIHdoaWNoIHdlIGNhbid0IGRvIHdpdGhvdXQgY2FyZS4gICovCi0KLS8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KLSAgIFRoaXMgbGV0cyBHQVMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4KLSAgID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCi0gICBGSVhNRTogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2FzbV9oYXNoX2tleXdvcmRzIChjZCwgb3B2YWxzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0tFWVdPUkQgKm9wdmFsczsKLXsKLSAgQ0dFTl9LRVlXT1JEX1NFQVJDSCBzZWFyY2ggPSBjZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKG9wdmFscywgTlVMTCk7Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqIGtlOwotCi0gIHdoaWxlICgoa2UgPSBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQgKCYgc2VhcmNoKSkgIT0gTlVMTCkKLSAgICB7Ci0jaWYgMCAvKiBVbm5lY2Vzc2FyeSwgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIHNlYXJjaCByb3V0aW5lLiAgKi8KLSAgICAgIGlmICghIG0zMnJfY2dlbl9vcHZhbF9zdXBwb3J0ZWQgKGtlKSkKLQljb250aW51ZTsKLSNlbmRpZgotICAgICAgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIChjZCwga2UtPm5hbWUsIGtlLT52YWx1ZSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWRlc2MuYyBiL29wY29kZXMvbTMyci1kZXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMWNmYTkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWRlc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzEgKzAsMCBAQAotLyogQ1BVIGRhdGEgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBib29sX2F0dHJbXSA9Ci17Ci0gIHsgIiNmIiwgMCB9LAotICB7ICIjdCIsIDEgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgTUFDSF9hdHRyW10gPQotewotICB7ICJiYXNlIiwgTUFDSF9CQVNFIH0sCi0gIHsgIm0zMnIiLCBNQUNIX00zMlIgfSwKLSAgeyAibTMycngiLCBNQUNIX00zMlJYIH0sCi0gIHsgIm1heCIsIE1BQ0hfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIElTQV9hdHRyW10gPQotewotICB7ICJtMzJyIiwgSVNBX00zMlIgfSwKLSAgeyAibWF4IiwgSVNBX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBQSVBFX2F0dHJbXSA9Ci17Ci0gIHsgIk5PTkUiLCBQSVBFX05PTkUgfSwKLSAgeyAiTyIsIFBJUEVfTyB9LAotICB7ICJTIiwgUElQRV9TIH0sCi0gIHsgIk9TIiwgUElQRV9PUyB9LAotICB7IDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDUkVMLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkFCUy1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRVNFUlZFRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMT0MiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDQUNIRS1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUFJPRklMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5FR0FUSVZFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0VNLU9OTFkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTE9DIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJIQVNILVBSRUZJWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faW5zbl9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiUElQRSIsICYgUElQRV9hdHRyWzBdIH0sCi0gIHsgIkFMSUFTIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJVTkNPTkQtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0tJUC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkRFTEFZLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYQUJMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5PLURJUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUEJCIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJGSUxMLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNQRUNJQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi0vKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JU0EgbTMycl9jZ2VuX2lzYV90YWJsZVtdID0gewotICB7ICJtMzJyIiwgMzIsIDMyLCAxNiwgMzIsICB9LAotICB7IDAgfQotfTsKLQotLyogTWFjaGluZSB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggbTMycl9jZ2VuX21hY2hfdGFibGVbXSA9IHsKLSAgeyAibTMyciIsICJtMzJyIiwgTUFDSF9NMzJSIH0sCi0gIHsgIm0zMnJ4IiwgIm0zMnJ4IiwgTUFDSF9NMzJSWCB9LAotICB7IDAgfQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAiZnAiLCAxMyB9LAotICB7ICJsciIsIDE0IH0sCi0gIHsgInNwIiwgMTUgfSwKLSAgeyAicjAiLCAwIH0sCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0gIHsgInIxMCIsIDEwIH0sCi0gIHsgInIxMSIsIDExIH0sCi0gIHsgInIxMiIsIDEyIH0sCi0gIHsgInIxMyIsIDEzIH0sCi0gIHsgInIxNCIsIDE0IH0sCi0gIHsgInIxNSIsIDE1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMgPQotewotICAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzWzBdLAotICAxOQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAicHN3IiwgMCB9LAotICB7ICJjYnIiLCAxIH0sCi0gIHsgInNwaSIsIDIgfSwKLSAgeyAic3B1IiwgMyB9LAotICB7ICJicGMiLCA2IH0sCi0gIHsgImJicHN3IiwgOCB9LAotICB7ICJiYnBjIiwgMTQgfSwKLSAgeyAiY3IwIiwgMCB9LAotICB7ICJjcjEiLCAxIH0sCi0gIHsgImNyMiIsIDIgfSwKLSAgeyAiY3IzIiwgMyB9LAotICB7ICJjcjQiLCA0IH0sCi0gIHsgImNyNSIsIDUgfSwKLSAgeyAiY3I2IiwgNiB9LAotICB7ICJjcjciLCA3IH0sCi0gIHsgImNyOCIsIDggfSwKLSAgeyAiY3I5IiwgOSB9LAotICB7ICJjcjEwIiwgMTAgfSwKLSAgeyAiY3IxMSIsIDExIH0sCi0gIHsgImNyMTIiLCAxMiB9LAotICB7ICJjcjEzIiwgMTMgfSwKLSAgeyAiY3IxNCIsIDE0IH0sCi0gIHsgImNyMTUiLCAxNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzID0KLXsKLSAgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1swXSwKLSAgMjMKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zX2VudHJpZXNbXSA9Ci17Ci0gIHsgImEwIiwgMCB9LAotICB7ICJhMSIsIDEgfQotfTsKLQotQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcyA9Ci17Ci0gICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zX2VudHJpZXNbMF0sCi0gIDIKLX07Ci0KLQotCi0vKiBUaGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9IV18sYSkpCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgbTMycl9jZ2VuX2h3X3RhYmxlW10gPQotewotICB7ICJoLW1lbW9yeSIsIEhXX0hfTUVNT1JZLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2ludCIsIEhXX0hfU0lOVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXVpbnQiLCBIV19IX1VJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1hZGRyIiwgSFdfSF9BRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaWFkZHIiLCBIV19IX0lBRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcGMiLCBIV19IX1BDLCBDR0VOX0FTTV9OT05FLCAwLCB7IDB8QShQUk9GSUxFKXxBKFBDKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1oaTE2IiwgSFdfSF9ISTE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdWxvMTYiLCBIV19IX1VMTzE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZ3IiLCBIV19IX0dSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jciIsIEhXX0hfQ1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWNjdW1zIiwgSFdfSF9BQ0NVTVMsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zLCB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSB9LAotICB7ICJoLWNvbmQiLCBIV19IX0NPTkQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1wc3ciLCBIV19IX1BTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWJwc3ciLCBIV19IX0JQU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1iYnBzdyIsIEhXX0hfQkJQU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gZmllbGQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JRkxEXyxhKSkKLQotY29uc3QgQ0dFTl9JRkxEIG0zMnJfY2dlbl9pZmxkX3RhYmxlW10gPQotewotICB7IE0zMlJfRl9OSUwsICJmLW5pbCIsIDAsIDAsIDAsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMSwgImYtb3AxIiwgMCwgMzIsIDAsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMiwgImYtb3AyIiwgMCwgMzIsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0NPTkQsICJmLWNvbmQiLCAwLCAzMiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfUjEsICJmLXIxIiwgMCwgMzIsIDQsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1IyLCAiZi1yMiIsIDAsIDMyLCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0lNTTgsICJmLXNpbW04IiwgMCwgMzIsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1NJTU0xNiwgImYtc2ltbTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0hJRlRfT1AyLCAiZi1zaGlmdC1vcDIiLCAwLCAzMiwgOCwgMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTQsICJmLXVpbW00IiwgMCwgMzIsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NNSwgImYtdWltbTUiLCAwLCAzMiwgMTEsIDUsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1VJTU0xNiwgImYtdWltbTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTI0LCAiZi11aW1tMjQiLCAwLCAzMiwgOCwgMjQsIHsgMHxBKFJFTE9DKXxBKEFCU19BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0hJMTYsICJmLWhpMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQOCwgImYtZGlzcDgiLCAwLCAzMiwgOCwgOCwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQMTYsICJmLWRpc3AxNiIsIDAsIDMyLCAxNiwgMTYsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfRElTUDI0LCAiZi1kaXNwMjQiLCAwLCAzMiwgOCwgMjQsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfT1AyMywgImYtb3AyMyIsIDAsIDMyLCA5LCAzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9PUDMsICJmLW9wMyIsIDAsIDMyLCAxNCwgMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQUNDLCAiZi1hY2MiLCAwLCAzMiwgOCwgMSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQUNDUywgImYtYWNjcyIsIDAsIDMyLCAxMiwgMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQUNDRCwgImYtYWNjZCIsIDAsIDMyLCA0LCAyLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9CSVRTNjcsICJmLWJpdHM2NyIsIDAsIDMyLCA2LCAyLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9CSVQxNCwgImYtYml0MTQiLCAwLCAzMiwgMTQsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0lNTTEsICJmLWltbTEiLCAwLCAzMiwgMTUsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgb3BlcmFuZCB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX09QRVJBTkRfLGEpKQotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotCi1jb25zdCBDR0VOX09QRVJBTkQgbTMycl9jZ2VuX29wZXJhbmRfdGFibGVbXSA9Ci17Ci0vKiBwYzogcHJvZ3JhbSBjb3VudGVyICovCi0gIHsgInBjIiwgTTMyUl9PUEVSQU5EX1BDLCBIV19IX1BDLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzcjogc291cmNlIHJlZ2lzdGVyICovCi0gIHsgInNyIiwgTTMyUl9PUEVSQU5EX1NSLCBIV19IX0dSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZHI6IGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0gIHsgImRyIiwgTTMyUl9PUEVSQU5EX0RSLCBIV19IX0dSLCA0LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzcmMxOiBzb3VyY2UgcmVnaXN0ZXIgMSAqLwotICB7ICJzcmMxIiwgTTMyUl9PUEVSQU5EX1NSQzEsIEhXX0hfR1IsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNyYzI6IHNvdXJjZSByZWdpc3RlciAyICovCi0gIHsgInNyYzIiLCBNMzJSX09QRVJBTkRfU1JDMiwgSFdfSF9HUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNjcjogc291cmNlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyAic2NyIiwgTTMyUl9PUEVSQU5EX1NDUiwgSFdfSF9DUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRjcjogZGVzdGluYXRpb24gY29udHJvbCByZWdpc3RlciAqLwotICB7ICJkY3IiLCBNMzJSX09QRVJBTkRfRENSLCBIV19IX0NSLCA0LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzaW1tODogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJzaW1tOCIsIE0zMlJfT1BFUkFORF9TSU1NOCwgSFdfSF9TSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzaW1tMTY6IDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInNpbW0xNiIsIE0zMlJfT1BFUkFORF9TSU1NMTYsIEhXX0hfU0lOVCwgMTYsIDE2LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tNDogNCBiaXQgdHJhcCBudW1iZXIgKi8KLSAgeyAidWltbTQiLCBNMzJSX09QRVJBTkRfVUlNTTQsIEhXX0hfVUlOVCwgMTIsIDQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW01OiA1IGJpdCBzaGlmdCBjb3VudCAqLwotICB7ICJ1aW1tNSIsIE0zMlJfT1BFUkFORF9VSU1NNSwgSFdfSF9VSU5ULCAxMSwgNSwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWltbTE2OiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInVpbW0xNiIsIE0zMlJfT1BFUkFORF9VSU1NMTYsIEhXX0hfVUlOVCwgMTYsIDE2LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpbW0xOiAxIGJpdCBpbW1lZGlhdGUgKi8KLSAgeyAiaW1tMSIsIE0zMlJfT1BFUkFORF9JTU0xLCBIV19IX1VJTlQsIDE1LCAxLAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9NMzJSWCkgfSB9ICB9LAotLyogYWNjZDogYWNjdW11bGF0b3IgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLSAgeyAiYWNjZCIsIE0zMlJfT1BFUkFORF9BQ0NELCBIV19IX0FDQ1VNUywgNCwgMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSAgfSwKLS8qIGFjY3M6IGFjY3VtdWxhdG9yIHNvdXJjZSByZWdpc3RlciAqLwotICB7ICJhY2NzIiwgTTMyUl9PUEVSQU5EX0FDQ1MsIEhXX0hfQUNDVU1TLCAxMiwgMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSAgfSwKLS8qIGFjYzogYWNjdW11bGF0b3IgcmVnIChkKSAqLwotICB7ICJhY2MiLCBNMzJSX09QRVJBTkRfQUNDLCBIV19IX0FDQ1VNUywgOCwgMSwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSAgfSwKLS8qIGhhc2g6ICMgcHJlZml4ICovCi0gIHsgImhhc2giLCBNMzJSX09QRVJBTkRfSEFTSCwgSFdfSF9TSU5ULCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBoaTE2OiBoaWdoIDE2IGJpdCBpbW1lZGlhdGUsIHNpZ24gb3B0aW9uYWwgKi8KLSAgeyAiaGkxNiIsIE0zMlJfT1BFUkFORF9ISTE2LCBIV19IX0hJMTYsIDE2LCAxNiwKLSAgICB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2xvMTY6IDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlLCBmb3IgbG93KCkgKi8KLSAgeyAic2xvMTYiLCBNMzJSX09QRVJBTkRfU0xPMTYsIEhXX0hfU0xPMTYsIDE2LCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWxvMTY6IDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUsIGZvciBsb3coKSAqLwotICB7ICJ1bG8xNiIsIE0zMlJfT1BFUkFORF9VTE8xNiwgSFdfSF9VTE8xNiwgMTYsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tMjQ6IDI0IGJpdCBhZGRyZXNzICovCi0gIHsgInVpbW0yNCIsIE0zMlJfT1BFUkFORF9VSU1NMjQsIEhXX0hfQUREUiwgOCwgMjQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoUkVMT0MpfEEoQUJTX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3A4OiA4IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDgiLCBNMzJSX09QRVJBTkRfRElTUDgsIEhXX0hfSUFERFIsIDgsIDgsCi0gICAgeyAwfEEoUkVMQVgpfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDE2OiAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0gIHsgImRpc3AxNiIsIE0zMlJfT1BFUkFORF9ESVNQMTYsIEhXX0hfSUFERFIsIDE2LCAxNiwKLSAgICB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMjQ6IDI0IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDI0IiwgTTMyUl9PUEVSQU5EX0RJU1AyNCwgSFdfSF9JQUREUiwgOCwgMjQsCi0gICAgeyAwfEEoUkVMQVgpfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY29uZGJpdDogY29uZGl0aW9uIGJpdCAqLwotICB7ICJjb25kYml0IiwgTTMyUl9PUEVSQU5EX0NPTkRCSVQsIEhXX0hfQ09ORCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogYWNjdW06IGFjY3VtdWxhdG9yICovCi0gIHsgImFjY3VtIiwgTTMyUl9PUEVSQU5EX0FDQ1VNLCBIV19IX0FDQ1VNLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgbTMycl9jZ2VuX2luc25fdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyAwLCAwLCAwIH0sCi0vKiBhZGQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERCwgImFkZCIsICJhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBhZGQzICRkciwkc3IsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BREQzLCAiYWRkMyIsICJhZGQzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBhbmQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FORCwgImFuZCIsICJhbmQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FORDMsICJhbmQzIiwgImFuZDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIG9yICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9PUiwgIm9yIiwgIm9yIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogb3IzICRkciwkc3IsJGhhc2gkdWxvMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9PUjMsICJvcjMiLCAib3IzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiB4b3IgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1hPUiwgInhvciIsICJ4b3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiB4b3IzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1hPUjMsICJ4b3IzIiwgInhvcjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGFkZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FEREksICJhZGRpIiwgImFkZGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBhZGR2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERWLCAiYWRkdiIsICJhZGR2IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREVjMsICJhZGR2MyIsICJhZGR2MyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYWRkeCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREWCwgImFkZHgiLCAiYWRkeCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGJjLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkM4LCAiYmM4IiwgImJjLnMiLCAxNiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJjLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JDMjQsICJiYzI0IiwgImJjLmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkVRLCAiYmVxIiwgImJlcSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmVxeiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkVRWiwgImJlcXoiLCAiYmVxeiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmdleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkdFWiwgImJnZXoiLCAiYmdleiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmd0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkdUWiwgImJndHoiLCAiYmd0eiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmxleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkxFWiwgImJsZXoiLCAiYmxleiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmx0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkxUWiwgImJsdHoiLCAiYmx0eiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5leiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5FWiwgImJuZXoiLCAiYm5leiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmwucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTDgsICJibDgiLCAiYmwucyIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYmwubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkwyNCwgImJsMjQiLCAiYmwubCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBiY2wucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CQ0w4LCAiYmNsOCIsICJiY2wucyIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBiY2wubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkNMMjQsICJiY2wyNCIsICJiY2wubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuYy5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JOQzgsICJibmM4IiwgImJuYy5zIiwgMTYsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBibmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DMjQsICJibmMyNCIsICJibmMubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBicmEucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CUkE4LCAiYnJhOCIsICJicmEucyIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYnJhLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JSQTI0LCAiYnJhMjQiLCAiYnJhLmwiLCAzMiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5jbC5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JOQ0w4LCAiYm5jbDgiLCAiYm5jbC5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJuY2wubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DTDI0LCAiYm5jbDI0IiwgImJuY2wubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGNtcCAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUCwgImNtcCIsICJjbXAiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBJLCAiY21waSIsICJjbXBpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBjbXB1ICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QVSwgImNtcHUiLCAiY21wdSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGNtcHVpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBVSSwgImNtcHVpIiwgImNtcHVpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBjbXBlcSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUEVRLCAiY21wZXEiLCAiY21wZXEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX09TIH0gfQotICB9LAotLyogY21weiAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUFosICJjbXB6IiwgImNtcHoiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX09TIH0gfQotICB9LAotLyogZGl2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9ESVYsICJkaXYiLCAiZGl2IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBkaXZ1ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9ESVZVLCAiZGl2dSIsICJkaXZ1IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiByZW0gJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JFTSwgInJlbSIsICJyZW0iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHJlbXUgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JFTVUsICJyZW11IiwgInJlbXUiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGRpdmggJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0RJVkgsICJkaXZoIiwgImRpdmgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBqYyAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9KQywgImpjIiwgImpjIiwgMTYsCi0gICAgeyAwfEEoU1BFQ0lBTCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBqbmMgJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fSk5DLCAiam5jIiwgImpuYyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogamwgJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fSkwsICJqbCIsICJqbCIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogam1wICRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0pNUCwgImptcCIsICJqbXAiLCAxNiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGQgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRCwgImxkIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEX0QsICJsZC1kIiwgImxkIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREIsICJsZGIiLCAibGRiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREJfRCwgImxkYi1kIiwgImxkYiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRoICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERILCAibGRoIiwgImxkaCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGRoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERIX0QsICJsZGgtZCIsICJsZGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVCLCAibGR1YiIsICJsZHViIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVQl9ELCAibGR1Yi1kIiwgImxkdWIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVILCAibGR1aCIsICJsZHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVSF9ELCAibGR1aC1kIiwgImxkdWgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkICRkcixAJHNyKyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEX1BMVVMsICJsZC1wbHVzIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZDI0ICRkciwkdWltbTI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fTEQyNCwgImxkMjQiLCAibGQyNCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRpOCAkZHIsJHNpbW04ICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERJOCwgImxkaTgiLCAibGRpOCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGxkaTE2ICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xESTE2LCAibGRpMTYiLCAibGRpMTYiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxvY2sgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MT0NLLCAibG9jayIsICJsb2NrIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBtYWNoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0hJLCAibWFjaGkiLCAibWFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNISV9BLCAibWFjaGktYSIsICJtYWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDTE8sICJtYWNsbyIsICJtYWNsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0xPX0EsICJtYWNsby1hIiwgIm1hY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjd2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0hJLCAibWFjd2hpIiwgIm1hY3doaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXSElfQSwgIm1hY3doaS1hIiwgIm1hY3doaSIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0xPLCAibWFjd2xvIiwgIm1hY3dsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXTE9fQSwgIm1hY3dsby1hIiwgIm1hY3dsbyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUwsICJtdWwiLCAibXVsIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTEhJLCAibXVsaGkiLCAibXVsaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bGhpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxISV9BLCAibXVsaGktYSIsICJtdWxoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMTE8sICJtdWxsbyIsICJtdWxsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsbG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTExPX0EsICJtdWxsby1hIiwgIm11bGxvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV0hJLCAibXVsd2hpIiwgIm11bHdoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXSElfQSwgIm11bHdoaS1hIiwgIm11bHdoaSIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV0xPLCAibXVsd2xvIiwgIm11bHdsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXTE9fQSwgIm11bHdsby1hIiwgIm11bHdsbyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXYgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WLCAibXYiLCAibXYiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDSEksICJtdmZhY2hpIiwgIm12ZmFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmFjaGkgJGRyLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNISV9BLCAibXZmYWNoaS1hIiwgIm12ZmFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZhY2xvICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDTE8sICJtdmZhY2xvIiwgIm12ZmFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmFjbG8gJGRyLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNMT19BLCAibXZmYWNsby1hIiwgIm12ZmFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZhY21pICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDTUksICJtdmZhY21pIiwgIm12ZmFjbWkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmFjbWkgJGRyLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNNSV9BLCAibXZmYWNtaS1hIiwgIm12ZmFjbWkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZjICRkciwkc2NyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQywgIm12ZmMiLCAibXZmYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbXZ0YWNoaSAkc3JjMSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEFDSEksICJtdnRhY2hpIiwgIm12dGFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12dGFjaGkgJHNyYzEsJGFjY3MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0hJX0EsICJtdnRhY2hpLWEiLCAibXZ0YWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0xPLCAibXZ0YWNsbyIsICJtdnRhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdnRhY2xvICRzcmMxLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQUNMT19BLCAibXZ0YWNsby1hIiwgIm12dGFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdnRjICRzciwkZGNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQywgIm12dGMiLCAibXZ0YyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbmVnICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9ORUcsICJuZWciLCAibmVnIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogbm9wICovCi0gIHsKLSAgICBNMzJSX0lOU05fTk9QLCAibm9wIiwgIm5vcCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIG5vdCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTk9ULCAibm90IiwgIm5vdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIHJhYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JBQywgInJhYyIsICJyYWMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJhYyAkYWNjZCwkYWNjcywkaW1tMSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JBQ19EU0ksICJyYWMtZHNpIiwgInJhYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJhY2ggKi8KLSAgewotICAgIE0zMlJfSU5TTl9SQUNILCAicmFjaCIsICJyYWNoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiByYWNoICRhY2NkLCRhY2NzLCRpbW0xICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkFDSF9EU0ksICJyYWNoLWRzaSIsICJyYWNoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogcnRlICovCi0gIHsKLSAgICBNMzJSX0lOU05fUlRFLCAicnRlIiwgInJ0ZSIsIDE2LAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzZXRoICRkciwkaGFzaCRoaTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0VUSCwgInNldGgiLCAic2V0aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc2xsICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TTEwsICJzbGwiLCAic2xsIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzbGwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTDMsICJzbGwzIiwgInNsbDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHNsbGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTEksICJzbGxpIiwgInNsbGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNyYSAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JBLCAic3JhIiwgInNyYSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkEzLCAic3JhMyIsICJzcmEzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzcmFpICRkciwkdWltbTUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkFJLCAic3JhaSIsICJzcmFpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzcmwgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSTCwgInNybCIsICJzcmwiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNybDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMMywgInNybDMiLCAic3JsMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3JsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMSSwgInNybGkiLCAic3JsaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1QsICJzdCIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RfRCwgInN0LWQiLCAic3QiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEIsICJzdGIiLCAic3RiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RCX0QsICJzdGItZCIsICJzdGIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEgsICJzdGgiLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RIX0QsICJzdGgtZCIsICJzdGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEArJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVF9QTFVTLCAic3QtcGx1cyIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3QgJHNyYzEsQC0kc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUX01JTlVTLCAic3QtbWludXMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN1YiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1VCLCAic3ViIiwgInN1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIHN1YnYgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NVQlYsICJzdWJ2IiwgInN1YnYiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBzdWJ4ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVUJYLCAic3VieCIsICJzdWJ4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogdHJhcCAkdWltbTQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9UUkFQLCAidHJhcCIsICJ0cmFwIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fVU5MT0NLLCAidW5sb2NrIiwgInVubG9jayIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc2F0YiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0FUQiwgInNhdGIiLCAic2F0YiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHNhdGggJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NBVEgsICJzYXRoIiwgInNhdGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzYXQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NBVCwgInNhdCIsICJzYXQiLCAzMiwKLSAgICB7IDB8QShTUEVDSUFMKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHBjbXBieiAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1BDTVBCWiwgInBjbXBieiIsICJwY21wYnoiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX09TIH0gfQotICB9LAotLyogc2FkZCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NBREQsICJzYWRkIiwgInNhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWN3dTEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXVTEsICJtYWN3dTEiLCAibWFjd3UxIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXNibG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NU0JMTywgIm1zYmxvIiwgIm1zYmxvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd3UxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV1UxLCAibXVsd3UxIiwgIm11bHd1MSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY2xoMSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0xIMSwgIm1hY2xoMSIsICJtYWNsaDEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBzYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NDLCAic2MiLCAic2MiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKXxBKFNLSVBfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNuYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NOQywgInNuYyIsICJzbmMiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKXxBKFNLSVBfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QCi0KLS8qIEluaXRpYWxpemUgYW55dGhpbmcgbmVlZGVkIHRvIGJlIGRvbmUgb25jZSwgYmVmb3JlIGFueSBjcHVfb3BlbiBjYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfdGFibGVzICgpCi17Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGxvb2sgdXAgYSBtYWNoIHZpYSBpdHMgYmZkIG5hbWUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIICoKLWxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAodGFibGUsIG5hbWUpCi0gICAgIGNvbnN0IENHRU5fTUFDSCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHdoaWxlICh0YWJsZS0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCB0YWJsZS0+YmZkX25hbWUpID09IDApCi0JcmV0dXJuIHRhYmxlOwotICAgICAgKyt0YWJsZTsKLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaHdfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXQgPSAmIG0zMnJfY2dlbl9od190YWJsZVswXTsKLSAgLyogTUFYX0hXIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fSFdfRU5UUlkgKiopIHhtYWxsb2MgKE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7Ci0KLSAgY2QtPmh3X3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5od190YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0hXX0VOVFJZKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaHMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCi0gICAgaWYgKENHRU5fSFdfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fSFdfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+aHdfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOwotICBjZC0+aHdfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfSFc7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pZmllbGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGNkLT5pZmxkX3RhYmxlID0gJiBtMzJyX2NnZW5faWZsZF90YWJsZVswXTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdCA9ICYgbTMycl9jZ2VuX29wZXJhbmRfdGFibGVbMF07Ci0gIC8qIE1BWF9PUEVSQU5EUyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KLSAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgotICAgICB0aGUgdGFibGUuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fT1BFUkFORCAqKikgeG1hbGxvYyAoTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotCi0gIGNkLT5vcGVyYW5kX3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fT1BFUkFORCk7Ci0gIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaCB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX09QRVJBTkRfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX09QRVJBTkRTOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuCi0gICA/Pz8gVGhpcyBjb3VsZCBsZWF2ZSBvdXQgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIG1hY2gvaXNhLAotICAgYnV0IHRoYXQgd291bGQgY2F1c2UgZXJyb3JzIGxpa2UgImZvbyBvbmx5IHN1cHBvcnRlZCBieSBiYXIiIHRvIGJlY29tZQotICAgInVua25vd24gaW5zbiIsIHNvIGZvciBub3cgd2UgaW5jbHVkZSBhbGwgaW5zbnMgYW5kIHJlcXVpcmUgdGhlIGFwcCB0bwotICAgZG8gdGhlIGNoZWNraW5nIGxhdGVyLgotICAgPz8/IE9uIHRoZSBvdGhlciBoYW5kLCBwYXJzaW5nIG9mIHN1Y2ggaW5zbnMgbWF5IHJlcXVpcmUgdGhlaXIgaGFyZHdhcmUgb3IKLSAgIG9wZXJhbmQgZWxlbWVudHMgdG8gYmUgaW4gdGhlIHRhYmxlIFt3aGljaCB0aGV5IG1pZ2h0bid0IGJlXS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIG0zMnJfY2dlbl9pbnNuX3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOwotCi0gIG1lbXNldCAoaW5zbnMsIDAsIE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPmluc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBNQVhfSU5TTlM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIHJlYnVpbGQgdGhlIHRhYmxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpLG5faXNhcyxuX21hY2hzOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IGNkLT5pc2FzOwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0KLSAgY2QtPmludF9pbnNuX3AgPSBDR0VOX0lOVF9JTlNOX1A7Ci0KLSAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIGlzYSBzcGVjLiAgKi8KLSNkZWZpbmUgVU5TRVQgKENHRU5fU0laRV9VTktOT1dOICsgMSkKLSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IFVOU0VUOwotICBjZC0+bWluX2luc25fYml0c2l6ZSA9IDY1NTM1OyAvKiBzb21lIHJpZGljdWxvdXNseSBiaWcgbnVtYmVyICovCi0gIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JU0FTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIGlzYXMpICE9IDApCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JU0EgKmlzYSA9ICYgbTMycl9jZ2VuX2lzYV90YWJsZVtpXTsKLQotCS8qIERlZmF1bHQgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBCYXNlIGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKLQkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KLQlpZiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplID09IFVOU0VUKQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gaXNhLT5iYXNlX2luc25fYml0c2l6ZTsKLQllbHNlIGlmIChpc2EtPmJhc2VfaW5zbl9iaXRzaXplID09IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLQkgIDsgLyogdGhpcyBpcyBvayAqLwotCWVsc2UKLQkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOwotCi0JLyogU2V0IG1pbixtYXggaW5zbiBzaXplcy4gICovCi0JaWYgKGlzYS0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5taW5faW5zbl9iaXRzaXplKQotCSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSBpc2EtPm1pbl9pbnNuX2JpdHNpemU7Ci0JaWYgKGlzYS0+bWF4X2luc25fYml0c2l6ZSA+IGNkLT5tYXhfaW5zbl9iaXRzaXplKQotCSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSBpc2EtPm1heF9pbnNuX2JpdHNpemU7Ci0KLQkrK25faXNhczsKLSAgICAgIH0KLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgbWFjaCBzcGVjLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9NQUNIUzsgKytpKQotICAgIGlmICgoKDEgPDwgaSkgJiBtYWNocykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX01BQ0ggKm1hY2ggPSAmIG0zMnJfY2dlbl9tYWNoX3RhYmxlW2ldOwotCi0JKytuX21hY2hzOwotICAgICAgfQotCi0gIC8qIERldGVybWluZSB3aGljaCBodyBlbGVtZW50cyBhcmUgdXNlZCBieSBNQUNILiAgKi8KLSAgYnVpbGRfaHdfdGFibGUgKGNkKTsKLQotICAvKiBCdWlsZCB0aGUgaWZpZWxkIHRhYmxlLiAgKi8KLSAgYnVpbGRfaWZpZWxkX3RhYmxlIChjZCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmRzIGFyZSB1c2VkIGJ5IE1BQ0gvSVNBLiAgKi8KLSAgYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0gIGJ1aWxkX2luc25fdGFibGUgKGNkKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIGNwdSB0YWJsZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvci4KLSAgIEl0J3MgbXVjaCBsaWtlIG9wZW5pbmcgYSBmaWxlLCBhbmQgbXVzdCBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkLgotICAgVGhlIGFyZ3VtZW50cyBhcmUgYSBzZXQgb2YgKHR5cGUvdmFsdWUpIHBhaXJzLCB0ZXJtaW5hdGVkIHdpdGgKLSAgIENHRU5fQ1BVX09QRU5fRU5ELgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlczoKLSAgIENHRU5fQ1BVX09QRU5fSVNBUzogICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIGlzYV9hdHRyCi0gICBDR0VOX0NQVV9PUEVOX01BQ0hTOiAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBtYWNoX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fQkZETUFDSDogc3BlY2lmeSAxIG1hY2ggdXNpbmcgYmZkIG5hbWUKLSAgIENHRU5fQ1BVX09QRU5fRU5ESUFOOiAgc3BlY2lmeSBlbmRpYW4gY2hvaWNlCi0gICBDR0VOX0NQVV9PUEVOX0VORDogICAgIHRlcm1pbmF0ZXMgYXJndW1lbnRzCi0KLSAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICBwcmVjbHVkZWQuCi0KLSAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgotICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQotICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLW0zMnJfY2dlbl9jcHVfb3BlbiAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyBhcmdfdHlwZSwgLi4uKQotewotICBDR0VOX0NQVV9UQUJMRSAqY2QgPSAoQ0dFTl9DUFVfVEFCTEUgKikgeG1hbGxvYyAoc2l6ZW9mIChDR0VOX0NQVV9UQUJMRSkpOwotICBzdGF0aWMgaW50IGluaXRfcDsKLSAgdW5zaWduZWQgaW50IGlzYXMgPSAwOyAgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgdW5zaWduZWQgaW50IG1hY2hzID0gMDsgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW4gPSBDR0VOX0VORElBTl9VTktOT1dOOwotICB2YV9saXN0IGFwOwotCi0gIGlmICghIGluaXRfcCkKLSAgICB7Ci0gICAgICBpbml0X3RhYmxlcyAoKTsKLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotCi0gIG1lbXNldCAoY2QsIDAsIHNpemVvZiAoKmNkKSk7Ci0KLSAgdmFfc3RhcnQgKGFwLCBhcmdfdHlwZSk7Ci0gIHdoaWxlIChhcmdfdHlwZSAhPSBDR0VOX0NQVV9PUEVOX0VORCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ190eXBlKQotCXsKLQljYXNlIENHRU5fQ1BVX09QRU5fSVNBUyA6Ci0JICBpc2FzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9NQUNIUyA6Ci0JICBtYWNocyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7Ci0JICBicmVhazsKLQljYXNlIENHRU5fQ1BVX09QRU5fQkZETUFDSCA6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOwotCSAgICBjb25zdCBDR0VOX01BQ0ggKm1hY2ggPQotCSAgICAgIGxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAobTMycl9jZ2VuX21hY2hfdGFibGUsIG5hbWUpOwotCi0JICAgIG1hY2hzIHw9IG1hY2gtPm51bSA8PCAxOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIENHRU5fQ1BVX09QRU5fRU5ESUFOIDoKLQkgIGVuZGlhbiA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9lbmRpYW4pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JICBmcHJpbnRmIChzdGRlcnIsICJtMzJyX2NnZW5fY3B1X29wZW46IHVuc3VwcG9ydGVkIGFyZ3VtZW50IGAlZCdcbiIsCi0JCSAgIGFyZ190eXBlKTsKLQkgIGFib3J0ICgpOyAvKiA/Pz8gcmV0dXJuIE5VTEw/ICovCi0JfQotICAgICAgYXJnX3R5cGUgPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTsKLSAgICB9Ci0gIHZhX2VuZCAoYXApOwotCi0gIC8qIG1hY2ggdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKG1hY2hzID09IDApCi0gICAgbWFjaHMgPSAoMSA8PCBNQVhfTUFDSFMpIC0gMTsKLSAgLyogYmFzZSBtYWNoIGlzIGFsd2F5cyBzZWxlY3RlZCAqLwotICBtYWNocyB8PSAxOwotICAvKiBpc2EgdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKGlzYXMgPT0gMCkKLSAgICBpc2FzID0gKDEgPDwgTUFYX0lTQVMpIC0gMTsKLSAgaWYgKGVuZGlhbiA9PSBDR0VOX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIC8qID8/PyBJZiB0YXJnZXQgaGFzIG9ubHkgb25lLCBjb3VsZCBoYXZlIGEgZGVmYXVsdC4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJtMzJyX2NnZW5fY3B1X29wZW46IG5vIGVuZGlhbm5lc3Mgc3BlY2lmaWVkXG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBjZC0+aXNhcyA9IGlzYXM7Ci0gIGNkLT5tYWNocyA9IG1hY2hzOwotICBjZC0+ZW5kaWFuID0gZW5kaWFuOwotICAvKiBGSVhNRTogZm9yIHRoZSBzcGFyYyBjYXNlIHdlIGNhbiBkZXRlcm1pbmUgaW5zbi1lbmRpYW5uZXNzIHN0YXRpY2FsbHkuCi0gICAgIFRoZSB3b3JyeSBoZXJlIGlzIHdoZXJlIGJvdGggZGF0YSBhbmQgaW5zbiBlbmRpYW4gY2FuIGJlIGluZGVwZW5kZW50bHkKLSAgICAgY2hvc2VuLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIGFub3RoZXIgYXJndW1lbnQuCi0gICAgIEFjdHVhbGx5LCB3aWxsIHdhbnQgdG8gYWxsb3cgZm9yIG1vcmUgYXJndW1lbnRzIGluIHRoZSBmdXR1cmUgYW55d2F5LiAgKi8KLSAgY2QtPmluc25fZW5kaWFuID0gZW5kaWFuOwotCi0gIC8qIFRhYmxlIChyZSlidWlsZGVyLiAgKi8KLSAgY2QtPnJlYnVpbGRfdGFibGVzID0gbTMycl9jZ2VuX3JlYnVpbGRfdGFibGVzOwotICBtMzJyX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKTsKLQotICByZXR1cm4gKENHRU5fQ1BVX0RFU0MpIGNkOwotfQotCi0vKiBDb3ZlciBmbiB0byBtMzJyX2NnZW5fY3B1X29wZW4gdG8gaGFuZGxlIHRoZSBzaW1wbGUgY2FzZSBvZiAxIGlzYSwgMSBtYWNoLgotICAgTUFDSF9OQU1FIGlzIHRoZSBiZmQgbmFtZSBvZiB0aGUgbWFjaC4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLW0zMnJfY2dlbl9jcHVfb3Blbl8xIChtYWNoX25hbWUsIGVuZGlhbikKLSAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotICAgICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbjsKLXsKLSAgcmV0dXJuIG0zMnJfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9CRkRNQUNILCBtYWNoX25hbWUsCi0JCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIGVuZGlhbiwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORCk7Ci19Ci0KLS8qIENsb3NlIGEgY3B1IHRhYmxlLgotICAgPz8/IFRoaXMgY2FuIGxpdmUgaW4gYSBtYWNoaW5lIGluZGVwZW5kZW50IGZpbGUsIGJ1dCB0aGVyZSdzIGN1cnJlbnRseQotICAgbm8gcGxhY2UgdG8gcHV0IHRoaXMgZmlsZSAodGhlcmUncyBubyBsaWJjZ2VuKS4gIGxpYm9wY29kZXMgaXMgdGhlIHdyb25nCi0gICBwbGFjZSBhcyBzb21lIHNpbXVsYXRvciBwb3J0cyB1c2UgdGhpcyBidXQgdGhleSBkb24ndCB1c2UgbGlib3Bjb2Rlcy4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9jcHVfY2xvc2UgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpZiAoY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKTsKLSAgaWYgKGNkLT5od190YWJsZS5lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0hXX0VOVFJZICopIGNkLT5od190YWJsZS5lbnRyaWVzKTsKLSAgZnJlZSAoY2QpOwotfQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItZGVzYy5oIGIvb3Bjb2Rlcy9tMzJyLWRlc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwZmFjNi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItZGVzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qIENQVSBkYXRhIGhlYWRlciBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBNMzJSX0NQVV9ICi0jZGVmaW5lIE0zMlJfQ1BVX0gKLQotI2RlZmluZSBDR0VOX0FSQ0ggbTMycgotCi0vKiBHaXZlbiBzeW1ib2wgUywgcmV0dXJuIG0zMnJfY2dlbl88Uz4uICAqLwotI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzIChtMzJyLF9jZ2VuXyxzKQotCi0vKiBTZWxlY3RlZCBjcHUgZmFtaWxpZXMuICAqLwotI2RlZmluZSBIQVZFX0NQVV9NMzJSQkYKLSNkZWZpbmUgSEFWRV9DUFVfTTMyUlhGCi0KLSNkZWZpbmUgQ0dFTl9JTlNOX0xTQjBfUCAwCi0KLS8qIE1pbmltdW0gc2l6ZSBvZiBhbnkgaW5zbiAoaW4gYnl0ZXMpLiAgKi8KLSNkZWZpbmUgQ0dFTl9NSU5fSU5TTl9TSVpFIDIKLQotLyogTWF4aW11bSBzaXplIG9mIGFueSBpbnNuIChpbiBieXRlcykuICAqLwotI2RlZmluZSBDR0VOX01BWF9JTlNOX1NJWkUgNAotCi0jZGVmaW5lIENHRU5fSU5UX0lOU05fUCAxCi0KLS8qIEZJWE1FOiBOZWVkIHRvIGNvbXB1dGUgQ0dFTl9NQVhfU1lOVEFYX0JZVEVTLiAgKi8KLQotLyogQ0dFTl9NTkVNT05JQ19PUEVSQU5EUyBpcyBkZWZpbmVkIGlmIG1uZW1vbmljcyBoYXZlIG9wZXJhbmRzLgotICAgZS5nLiBJbiAiYixhIGZvbyIgdGhlICIsYSIgaXMgYW4gb3BlcmFuZC4gIElmIG1uZW1vbmljcyBoYXZlIG9wZXJhbmRzCi0gICB3ZSBjYW4ndCBoYXNoIG9uIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIHNwYWNlLiAgKi8KLSNkZWZpbmUgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBhbnkgaW5zbiBvciBtYWNyby1pbnNuIGhhcy4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fT1BFUkFORFMgMTYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZmllbGRzIGluIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyA3Ci0KLS8qIEVudW1zLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBmb3JtYXQgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AxIHsKLSAgT1AxXzAsIE9QMV8xLCBPUDFfMiwgT1AxXzMKLSAsIE9QMV80LCBPUDFfNSwgT1AxXzYsIE9QMV83Ci0gLCBPUDFfOCwgT1AxXzksIE9QMV8xMCwgT1AxXzExCi0gLCBPUDFfMTIsIE9QMV8xMywgT1AxXzE0LCBPUDFfMTUKLX0gSU5TTl9PUDE7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG9wMiBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDIgewotICBPUDJfMCwgT1AyXzEsIE9QMl8yLCBPUDJfMwotICwgT1AyXzQsIE9QMl81LCBPUDJfNiwgT1AyXzcKLSAsIE9QMl84LCBPUDJfOSwgT1AyXzEwLCBPUDJfMTEKLSAsIE9QMl8xMiwgT1AyXzEzLCBPUDJfMTQsIE9QMl8xNQotfSBJTlNOX09QMjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBncl9uYW1lcyB7Ci0gIEhfR1JfRlAgPSAxMywgSF9HUl9MUiA9IDE0LCBIX0dSX1NQID0gMTUsIEhfR1JfUjAgPSAwCi0gLCBIX0dSX1IxID0gMSwgSF9HUl9SMiA9IDIsIEhfR1JfUjMgPSAzLCBIX0dSX1I0ID0gNAotICwgSF9HUl9SNSA9IDUsIEhfR1JfUjYgPSA2LCBIX0dSX1I3ID0gNywgSF9HUl9SOCA9IDgKLSAsIEhfR1JfUjkgPSA5LCBIX0dSX1IxMCA9IDEwLCBIX0dSX1IxMSA9IDExLCBIX0dSX1IxMiA9IDEyCi0gLCBIX0dSX1IxMyA9IDEzLCBIX0dSX1IxNCA9IDE0LCBIX0dSX1IxNSA9IDE1Ci19IEdSX05BTUVTOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGNyX25hbWVzIHsKLSAgSF9DUl9QU1cgPSAwLCBIX0NSX0NCUiA9IDEsIEhfQ1JfU1BJID0gMiwgSF9DUl9TUFUgPSAzCi0gLCBIX0NSX0JQQyA9IDYsIEhfQ1JfQkJQU1cgPSA4LCBIX0NSX0JCUEMgPSAxNCwgSF9DUl9DUjAgPSAwCi0gLCBIX0NSX0NSMSA9IDEsIEhfQ1JfQ1IyID0gMiwgSF9DUl9DUjMgPSAzLCBIX0NSX0NSNCA9IDQKLSAsIEhfQ1JfQ1I1ID0gNSwgSF9DUl9DUjYgPSA2LCBIX0NSX0NSNyA9IDcsIEhfQ1JfQ1I4ID0gOAotICwgSF9DUl9DUjkgPSA5LCBIX0NSX0NSMTAgPSAxMCwgSF9DUl9DUjExID0gMTEsIEhfQ1JfQ1IxMiA9IDEyCi0gLCBIX0NSX0NSMTMgPSAxMywgSF9DUl9DUjE0ID0gMTQsIEhfQ1JfQ1IxNSA9IDE1Ci19IENSX05BTUVTOwotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbWFjaGluZSB0eXBlIHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gbWFjaF9hdHRyIHsKLSAgTUFDSF9CQVNFLCBNQUNIX00zMlIsIE1BQ0hfTTMyUlgsIE1BQ0hfTUFYCi19IE1BQ0hfQVRUUjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2V0IHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gaXNhX2F0dHIgewotICBJU0FfTTMyUiwgSVNBX01BWAotfSBJU0FfQVRUUjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgcGFyYWxsZWwgZXhlY3V0aW9uIHBpcGVsaW5lIHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gcGlwZV9hdHRyIHsKLSAgUElQRV9OT05FLCBQSVBFX08sIFBJUEVfUywgUElQRV9PUwotfSBQSVBFX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBhcmNoaXRlY3R1cmUgdmFyaWFudHMuICAqLwotI2RlZmluZSBNQVhfSVNBUyAgMQotI2RlZmluZSBNQVhfTUFDSFMgKChpbnQpIE1BQ0hfTUFYKQotCi0vKiBJZmllbGQgc3VwcG9ydC4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgY2dlbl9pZmxkIG0zMnJfY2dlbl9pZmxkX3RhYmxlW107Ci0KLS8qIElmaWVsZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faWZsZCBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pZmxkX2F0dHIgewotICBDR0VOX0lGTERfVklSVFVBTCwgQ0dFTl9JRkxEX1BDUkVMX0FERFIsIENHRU5fSUZMRF9BQlNfQUREUiwgQ0dFTl9JRkxEX1JFU0VSVkVECi0gLCBDR0VOX0lGTERfU0lHTl9PUFQsIENHRU5fSUZMRF9TSUdORUQsIENHRU5fSUZMRF9SRUxPQywgQ0dFTl9JRkxEX0VORF9CT09MUwotICwgQ0dFTl9JRkxEX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0lGTERfTUFDSCwgQ0dFTl9JRkxEX0VORF9OQk9PTFMKLX0gQ0dFTl9JRkxEX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2lmbGRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAoQ0dFTl9JRkxEX0VORF9OQk9PTFMgLSBDR0VOX0lGTERfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBpZmllbGQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGlmaWVsZF90eXBlIHsKLSAgTTMyUl9GX05JTCwgTTMyUl9GX09QMSwgTTMyUl9GX09QMiwgTTMyUl9GX0NPTkQKLSAsIE0zMlJfRl9SMSwgTTMyUl9GX1IyLCBNMzJSX0ZfU0lNTTgsIE0zMlJfRl9TSU1NMTYKLSAsIE0zMlJfRl9TSElGVF9PUDIsIE0zMlJfRl9VSU1NNCwgTTMyUl9GX1VJTU01LCBNMzJSX0ZfVUlNTTE2Ci0gLCBNMzJSX0ZfVUlNTTI0LCBNMzJSX0ZfSEkxNiwgTTMyUl9GX0RJU1A4LCBNMzJSX0ZfRElTUDE2Ci0gLCBNMzJSX0ZfRElTUDI0LCBNMzJSX0ZfT1AyMywgTTMyUl9GX09QMywgTTMyUl9GX0FDQwotICwgTTMyUl9GX0FDQ1MsIE0zMlJfRl9BQ0NELCBNMzJSX0ZfQklUUzY3LCBNMzJSX0ZfQklUMTQKLSAsIE0zMlJfRl9JTU0xLCBNMzJSX0ZfTUFYCi19IElGSUVMRF9UWVBFOwotCi0jZGVmaW5lIE1BWF9JRkxEICgoaW50KSBNMzJSX0ZfTUFYKQotCi0vKiBIYXJkd2FyZSBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faHcgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfYXR0ciB7Ci0gIENHRU5fSFdfVklSVFVBTCwgQ0dFTl9IV19DQUNIRV9BRERSLCBDR0VOX0hXX1BDLCBDR0VOX0hXX1BST0ZJTEUKLSAsIENHRU5fSFdfRU5EX0JPT0xTLCBDR0VOX0hXX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0hXX01BQ0gsIENHRU5fSFdfRU5EX05CT09MUwotfSBDR0VOX0hXX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2h3X2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0hXX05CT09MX0FUVFJTIChDR0VOX0hXX0VORF9OQk9PTFMgLSBDR0VOX0hXX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgaGFyZHdhcmUgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfdHlwZSB7Ci0gIEhXX0hfTUVNT1JZLCBIV19IX1NJTlQsIEhXX0hfVUlOVCwgSFdfSF9BRERSCi0gLCBIV19IX0lBRERSLCBIV19IX1BDLCBIV19IX0hJMTYsIEhXX0hfU0xPMTYKLSAsIEhXX0hfVUxPMTYsIEhXX0hfR1IsIEhXX0hfQ1IsIEhXX0hfQUNDVU0KLSAsIEhXX0hfQUNDVU1TLCBIV19IX0NPTkQsIEhXX0hfUFNXLCBIV19IX0JQU1cKLSAsIEhXX0hfQkJQU1csIEhXX0hfTE9DSywgSFdfTUFYCi19IENHRU5fSFdfVFlQRTsKLQotI2RlZmluZSBNQVhfSFcgKChpbnQpIEhXX01BWCkKLQotLyogT3BlcmFuZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5fb3BlcmFuZCBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX2F0dHIgewotICBDR0VOX09QRVJBTkRfVklSVFVBTCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIsIENHRU5fT1BFUkFORF9BQlNfQUREUiwgQ0dFTl9PUEVSQU5EX1NJR05fT1BUCi0gLCBDR0VOX09QRVJBTkRfU0lHTkVELCBDR0VOX09QRVJBTkRfTkVHQVRJVkUsIENHRU5fT1BFUkFORF9SRUxBWCwgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZCi0gLCBDR0VOX09QRVJBTkRfUkVMT0MsIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCwgQ0dFTl9PUEVSQU5EX0VORF9CT09MUywgQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyA9IDMxCi0gLCBDR0VOX09QRVJBTkRfTUFDSCwgQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMKLX0gQ0dFTl9PUEVSQU5EX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX29wZXJhbmRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAoQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMgLSBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBvcGVyYW5kIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7Ci0gIE0zMlJfT1BFUkFORF9QQywgTTMyUl9PUEVSQU5EX1NSLCBNMzJSX09QRVJBTkRfRFIsIE0zMlJfT1BFUkFORF9TUkMxCi0gLCBNMzJSX09QRVJBTkRfU1JDMiwgTTMyUl9PUEVSQU5EX1NDUiwgTTMyUl9PUEVSQU5EX0RDUiwgTTMyUl9PUEVSQU5EX1NJTU04Ci0gLCBNMzJSX09QRVJBTkRfU0lNTTE2LCBNMzJSX09QRVJBTkRfVUlNTTQsIE0zMlJfT1BFUkFORF9VSU1NNSwgTTMyUl9PUEVSQU5EX1VJTU0xNgotICwgTTMyUl9PUEVSQU5EX0lNTTEsIE0zMlJfT1BFUkFORF9BQ0NELCBNMzJSX09QRVJBTkRfQUNDUywgTTMyUl9PUEVSQU5EX0FDQwotICwgTTMyUl9PUEVSQU5EX0hBU0gsIE0zMlJfT1BFUkFORF9ISTE2LCBNMzJSX09QRVJBTkRfU0xPMTYsIE0zMlJfT1BFUkFORF9VTE8xNgotICwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgTTMyUl9PUEVSQU5EX0RJU1A4LCBNMzJSX09QRVJBTkRfRElTUDE2LCBNMzJSX09QRVJBTkRfRElTUDI0Ci0gLCBNMzJSX09QRVJBTkRfQ09OREJJVCwgTTMyUl9PUEVSQU5EX0FDQ1VNLCBNMzJSX09QRVJBTkRfTUFYCi19IENHRU5fT1BFUkFORF9UWVBFOwotCi0vKiBOdW1iZXIgb2Ygb3BlcmFuZHMgdHlwZXMuICAqLwotI2RlZmluZSBNQVhfT1BFUkFORFMgKChpbnQpIE0zMlJfT1BFUkFORF9NQVgpCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIHJlZmVyZW5jZWQgYnkgYW55IGluc24uICAqLwotI2RlZmluZSBNQVhfT1BFUkFORF9JTlNUQU5DRVMgMTEKLQotLyogSW5zbiBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faW5zbiBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMsIENHRU5fSU5TTl9WSVJUVUFMLCBDR0VOX0lOU05fVU5DT05EX0NUSSwgQ0dFTl9JTlNOX0NPTkRfQ1RJCi0gLCBDR0VOX0lOU05fU0tJUF9DVEksIENHRU5fSU5TTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fUkVMQVhBQkxFLCBDR0VOX0lOU05fUkVMQVgKLSAsIENHRU5fSU5TTl9OT19ESVMsIENHRU5fSU5TTl9QQkIsIENHRU5fSU5TTl9GSUxMX1NMT1QsIENHRU5fSU5TTl9TUEVDSUFMCi0gLCBDR0VOX0lOU05fRU5EX0JPT0xTLCBDR0VOX0lOU05fU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSU5TTl9NQUNILCBDR0VOX0lOU05fUElQRQotICwgQ0dFTl9JTlNOX0VORF9OQk9PTFMKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2luc25fYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAoQ0dFTl9JTlNOX0VORF9OQk9PTFMgLSBDR0VOX0lOU05fU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogY2dlbi5oIHVzZXMgdGhpbmdzIHdlIGp1c3QgZGVmaW5lZC4gICovCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogQXR0cmlidXRlcy4gICovCi1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pbnNuX2F0dHJfdGFibGVbXTsKLQotLyogSGFyZHdhcmUgZGVjbHMuICAqLwotCi1leHRlcm4gQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXM7Ci0KLQotCi0KLSNlbmRpZiAvKiBNMzJSX0NQVV9IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItZGlzLmMgYi9vcGNvZGVzL20zMnItZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODA3ODQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCi0gICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1kaXMuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBEZWZhdWx0IHRleHQgdG8gcHJpbnQgaWYgYW4gaW5zdHJ1Y3Rpb24gaXNuJ3QgcmVjb2duaXplZC4gICovCi0jZGVmaW5lIFVOS05PV05fSU5TTl9NU0cgXygiKnVua25vd24qIikKLQotc3RhdGljIHZvaWQgcHJpbnRfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHJlc3MKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBiZmRfdm1hLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfa2V5d29yZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIENHRU5fS0VZV09SRCAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRklFTERTICosCi0JICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgaW50IHByaW50X2luc24gUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwKLQkJCSAgICAgICBkaXNhc3NlbWJsZV9pbmZvICosIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGRlZmF1bHRfcHJpbnRfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQwKLS8qIC0tIGRpc2Fzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGRpcy5jICovCi0KLS8qIEltbWVkaWF0ZSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJyMnLiAgKi8KLQotI2RlZmluZSBDR0VOX1BSSU5UX05PUk1BTChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKSBcCi1kbyB7IFwKLSAgaWYgKENHRU5fQk9PTF9BVFRSICgoYXR0cnMpLCBDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpKSBcCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjIik7IFwKLX0gd2hpbGUgKDApCi0KLS8qIEhhbmRsZSAnIycgcHJlZml4ZXMgYXMgb3BlcmFuZHMuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaGFzaCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyIpOwotfQotCi0jdW5kZWYgQ0dFTl9QUklOVF9JTlNOCi0jZGVmaW5lIENHRU5fUFJJTlRfSU5TTiBteV9wcmludF9pbnNuCi0KLXN0YXRpYyBpbnQKLW15X3ByaW50X2luc24gKGNkLCBwYywgaW5mbykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY2hhciBidWZmZXJbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSAgY2hhciAqYnVmID0gYnVmZmVyOwotICBpbnQgc3RhdHVzOwotICBpbnQgYnVmbGVuID0gKHBjICYgMykgPT0gMCA/IDQgOiAyOwotCi0gIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgYnVmbGVuLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogMzIgYml0IGluc24/ICAqLwotICBpZiAoKHBjICYgMykgPT0gMCAmJiAoYnVmWzBdICYgMHg4MCkgIT0gMCkKLSAgICByZXR1cm4gcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGJ1Zmxlbik7Ci0KLSAgLyogUHJpbnQgdGhlIGZpcnN0IGluc24uICAqLwotICBpZiAoKHBjICYgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIDIpID09IDApCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIFVOS05PV05fSU5TTl9NU0cpOwotICAgICAgYnVmICs9IDI7Ci0gICAgfQotCi0gIGlmIChidWZbMF0gJiAweDgwKQotICAgIHsKLSAgICAgIC8qIFBhcmFsbGVsLiAgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIHx8ICIpOwotICAgICAgYnVmWzBdICY9IDB4N2Y7Ci0gICAgfQotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgLT4gIik7Ci0KLSAgLyogVGhlICImIDMiIGlzIHRvIHBhc3MgYSBjb25zaXN0ZW50IGFkZHJlc3MuCi0gICAgIFBhcmFsbGVsIGluc25zIGFyZ3VhYmx5IGJvdGggYmVnaW4gb24gdGhlIHdvcmQgYm91bmRhcnkuCi0gICAgIEFsc28sIGJyYW5jaCBpbnNucyBhcmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aGUgd29yZCBib3VuZGFyeS4gICovCi0gIGlmIChwcmludF9pbnNuIChjZCwgcGMgJiB+IChiZmRfdm1hKSAzLCBpbmZvLCBidWYsIDIpID09IDApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIFVOS05PV05fSU5TTl9NU0cpOwotCi0gIHJldHVybiAocGMgJiAzKSA/IDIgOiA0OwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBwcmludGluZyBvcGVyYW5kcy4KLSAgIFhJTkZPIGlzIGEgYHZvaWQgKicgYW5kIG5vdCBhIGBkaXNhc3NlbWJsZV9pbmZvIConIHRvIG5vdCBwdXQgYSByZXF1aXJlbWVudAotICAgb2YgZGlzLWFzbS5oIG9uIGNnZW4uaC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwcmludF9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHByaW50X2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotdm9pZAotbTMycl9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCB4aW5mbywgZmllbGRzLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIFBUUiB4aW5mbzsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgdm9pZCBjb25zdCAqYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIHhpbmZvOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgZmllbGRzLT5mX2FjYywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgZmllbGRzLT5mX2FjY2QsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsIGZpZWxkcy0+Zl9hY2NzLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9yMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMTYsIDB8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMjQsIDB8KDE8PENHRU5fT1BFUkFORF9SRUxBWCl8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3A4LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMQVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBwcmludF9oYXNoIChjZCwgaW5mbywgMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaGkxNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05fT1BUKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pbW0xLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9yMiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3NpbW04LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tMTYsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTI0LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfQUJTX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tNCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTUsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW0xNiwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotY2dlbl9wcmludF9mbiAqIGNvbnN0IG0zMnJfY2dlbl9wcmludF9oYW5kbGVyc1tdID0gCi17Ci0gIHByaW50X2luc25fbm9ybWFsLAotfTsKLQotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9kaXMgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBtMzJyX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgbTMycl9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cHJpbnRfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9wcmludF9oYW5kbGVyc1swXTsKLSAgY2QtPnByaW50X29wZXJhbmQgPSBtMzJyX2NnZW5fcHJpbnRfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBwcmludCBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X25vcm1hbCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0KLSNpZmRlZiBDR0VOX1BSSU5UX05PUk1BTAotICBDR0VOX1BSSU5UX05PUk1BTCAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgdmFsdWUpOwotfQotCi0vKiBEZWZhdWx0IGFkZHJlc3MgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyZXNzIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfQUREUkVTUwotICBDR0VOX1BSSU5UX0FERFJFU1MgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLwotICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQotICAgIDsgLyogbm90aGluZyB0byBkbyAqLwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSkKLSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfQUJTX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgKGxvbmcpIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCAobG9uZykgdmFsdWUpOwotfQotCi0vKiBLZXl3b3JkIHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfa2V5d29yZCAoY2QsIGRpc19pbmZvLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZSwgYXR0cnMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgQ0dFTl9LRVlXT1JEICprZXl3b3JkX3RhYmxlOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLQotICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGtleXdvcmRfdGFibGUsIHZhbHVlKTsKLSAgaWYgKGtlICE9IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGtlLT5uYW1lKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPz8/Iik7Ci19Ci0MCi0vKiBEZWZhdWx0IGluc24gcHJpbnRlci4KLQotICAgRElTX0lORk8gaXMgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGUgZGlzYXNzZW1ibGVyIG5lZWRuJ3Qga25vdyBhbnl0aGluZwotICAgYWJvdXQgZGlzYXNzZW1ibGVfaW5mby4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuX25vcm1hbCAoY2QsIGRpc19pbmZvLCBpbnNuLCBmaWVsZHMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fSU5JVF9QUklOVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIENHRU5fU1lOVEFYX0NIQVIgKCpzeW4pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgKi8KLSAgICAgIG0zMnJfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLCBpbmZvLAotCQkJCSBmaWVsZHMsIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIHBjLCBsZW5ndGgpOwotICAgIH0KLX0KLQwKLS8qIFV0aWxpdHkgdG8gcHJpbnQgYW4gaW5zbi4KLSAgIEJVRiBpcyB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLCB0YXJnZXQgYnl0ZSBvcmRlciwgQlVGTEVOIGJ5dGVzIGxvbmcuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGJ1ZmxlbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgYnVmbGVuOwotewotICB1bnNpZ25lZCBsb25nIGluc25fdmFsdWU7Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7Ci0gIENHRU5fRVhUUkFDVF9JTkZPIGV4X2luZm87Ci0KLSAgZXhfaW5mby5kaXNfaW5mbyA9IGluZm87Ci0gIGV4X2luZm8udmFsaWQgPSAoMSA8PCAoY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCkpIC0gMTsKLSAgZXhfaW5mby5pbnNuX2J5dGVzID0gYnVmOwotCi0gIHN3aXRjaCAoYnVmbGVuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbnNuX3ZhbHVlID0gYnVmWzBdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMTYgKGJ1ZikgOiBiZmRfZ2V0bDE2IChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMzIgKGJ1ZikgOiBiZmRfZ2V0bDMyIChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaCBsaXN0cy4KLSAgICAgUGljayB0aGUgZmlyc3Qgb25lIGFuZCBrZWVwIHRyeWluZyB1bnRpbCB3ZSBmaW5kIHRoZSByaWdodCBvbmUuICAqLwotCi0gIGluc25fbGlzdCA9IENHRU5fRElTX0xPT0tVUF9JTlNOIChjZCwgYnVmLCBpbnNuX3ZhbHVlKTsKLSAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKLSAgICAgIENHRU5fRklFTERTIGZpZWxkczsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgaW5zbiBzaG91bGRuJ3QgYmUgaW4gaGFzaCBsaXN0cyBpZiBub3Qgc3VwcG9ydGVkICovCi0gICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLwotICAgICAgaWYgKCEgbTMycl9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUgZXh0cmFjdAotCSBoYW5kbGVyLiAgKi8KLSAgICAgIGlmICgoaW5zbl92YWx1ZSAmIENHRU5fSU5TTl9CQVNFX01BU0sgKGluc24pKQotCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQotCXsKLQkgIC8qIFByaW50aW5nIGlzIGhhbmRsZWQgaW4gdHdvIHBhc3Nlcy4gIFRoZSBmaXJzdCBwYXNzIHBhcnNlcyB0aGUKLQkgICAgIG1hY2hpbmUgaW5zbiBhbmQgZXh0cmFjdHMgdGhlIGZpZWxkcy4gIFRoZSBzZWNvbmQgcGFzcyBwcmludHMKLQkgICAgIHRoZW0uICAqLwotCi0JICBsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCSAgICAoY2QsIGluc24sICZleF9pbmZvLCBpbnNuX3ZhbHVlLCAmZmllbGRzLCBwYyk7Ci0JICAvKiBsZW5ndGggPCAwIC0+IGVycm9yICovCi0JICBpZiAobGVuZ3RoIDwgMCkKLQkgICAgcmV0dXJuIGxlbmd0aDsKLQkgIGlmIChsZW5ndGggPiAwKQotCSAgICB7Ci0JICAgICAgQ0dFTl9QUklOVF9GTiAoY2QsIGluc24pIChjZCwgaW5mbywgaW5zbiwgJmZpZWxkcywgcGMsIGxlbmd0aCk7Ci0JICAgICAgLyogbGVuZ3RoIGlzIGluIGJpdHMsIHJlc3VsdCBpcyBpbiBieXRlcyAqLwotCSAgICAgIHJldHVybiBsZW5ndGggLyA4OwotCSAgICB9Ci0JfQotCi0gICAgICBpbnNuX2xpc3QgPSBDR0VOX0RJU19ORVhUX0lOU04gKGluc25fbGlzdCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBEZWZhdWx0IHZhbHVlIGZvciBDR0VOX1BSSU5UX0lOU04uCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJlZCBmZXRjaGluZyBieXRlcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9QUklOVF9JTlNOCi0jZGVmaW5lIENHRU5fUFJJTlRfSU5TTiBkZWZhdWx0X3ByaW50X2luc24KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X3ByaW50X2luc24gKGNkLCBwYywgaW5mbykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY2hhciBidWZbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBSZWFkIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24uICAqLwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoaW4gYnl0ZXMpLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX20zMnIgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgQ0dFTl9DUFVfREVTQyBjZCA9IDA7Ci0gIHN0YXRpYyBwcmV2X2lzYSxwcmV2X21hY2gscHJldl9lbmRpYW47Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpc2EsbWFjaDsKLSAgaW50IGVuZGlhbiA9IChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJPyBDR0VOX0VORElBTl9CSUcKLQkJOiBDR0VOX0VORElBTl9MSVRUTEUpOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiA/Pz8gZ2RiIHdpbGwgc2V0IG1hY2ggYnV0IGxlYXZlIHRoZSBhcmNoaXRlY3R1cmUgYXMgInVua25vd24iICovCi0jaWZuZGVmIENHRU5fQkZEX0FSQ0gKLSNkZWZpbmUgQ0dFTl9CRkRfQVJDSCBiZmRfYXJjaF9tMzJyCi0jZW5kaWYKLSAgYXJjaCA9IGluZm8tPmFyY2g7Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYXJjaCA9IENHRU5fQkZEX0FSQ0g7Ci0gICAgICAKLSAgLyogVGhlcmUncyBubyBzdGFuZGFyZCB3YXkgdG8gY29tcHV0ZSB0aGUgaXNhIG51bWJlciAoZS5nLiBmb3IgYXJtIHRodW1iKQotICAgICBzbyB3ZSBsZWF2ZSBpdCB0byB0aGUgdGFyZ2V0LiAgKi8KLSNpZmRlZiBDR0VOX0NPTVBVVEVfSVNBCi0gIGlzYSA9IENHRU5fQ09NUFVURV9JU0EgKGluZm8pOwotI2Vsc2UKLSAgaXNhID0gMDsKLSNlbmRpZgotCi0gIG1hY2ggPSBpbmZvLT5tYWNoOwotCi0gIC8qIElmIHdlJ3ZlIHN3aXRjaGVkIGNwdSdzLCBjbG9zZSB0aGUgY3VycmVudCB0YWJsZSBhbmQgb3BlbiBhIG5ldyBvbmUuICAqLwotICBpZiAoY2QKLSAgICAgICYmIChpc2EgIT0gcHJldl9pc2EKLQkgIHx8IG1hY2ggIT0gcHJldl9tYWNoCi0JICB8fCBlbmRpYW4gIT0gcHJldl9lbmRpYW4pKQotICAgIHsKLSAgICAgIG0zMnJfY2dlbl9jcHVfY2xvc2UgKGNkKTsKLSAgICAgIGNkID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB5ZXQsIGluaXRpYWxpemUgdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIGlmICghIGNkKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaF90eXBlID0gYmZkX2xvb2t1cF9hcmNoIChhcmNoLCBtYWNoKTsKLSAgICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKLQotICAgICAgaWYgKCFhcmNoX3R5cGUpCi0JYWJvcnQgKCk7Ci0gICAgICBtYWNoX25hbWUgPSBhcmNoX3R5cGUtPnByaW50YWJsZV9uYW1lOwotCi0gICAgICBwcmV2X2lzYSA9IGlzYTsKLSAgICAgIHByZXZfbWFjaCA9IG1hY2g7Ci0gICAgICBwcmV2X2VuZGlhbiA9IGVuZGlhbjsKLSAgICAgIGNkID0gbTMycl9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0lTQVMsIHByZXZfaXNhLAotCQkJCSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIHByZXZfZW5kaWFuLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gICAgICBpZiAoIWNkKQotCWFib3J0ICgpOwotICAgICAgbTMycl9jZ2VuX2luaXRfZGlzIChjZCk7Ci0gICAgfQotCi0gIC8qIFdlIHRyeSB0byBoYXZlIGFzIG11Y2ggY29tbW9uIGNvZGUgYXMgcG9zc2libGUuCi0gICAgIEJ1dCBhdCB0aGlzIHBvaW50IHNvbWUgdGFyZ2V0cyBuZWVkIHRvIHRha2Ugb3Zlci4gICovCi0gIC8qID8/PyBTb21lIHRhcmdldHMgbWF5IG5lZWQgYSBob29rIGVsc2V3aGVyZS4gIFRyeSB0byBhdm9pZCB0aGlzLAotICAgICBidXQgaWYgbm90IHBvc3NpYmxlIHRyeSB0byBtb3ZlIHRoaXMgaG9vayBlbHNld2hlcmUgcmF0aGVyIHRoYW4KLSAgICAgaGF2ZSB0d28gaG9va3MuICAqLwotICBsZW5ndGggPSBDR0VOX1BSSU5UX0lOU04gKGNkLCBwYywgaW5mbyk7Ci0gIGlmIChsZW5ndGggPiAwKQotICAgIHJldHVybiBsZW5ndGg7Ci0gIGlmIChsZW5ndGggPCAwKQotICAgIHJldHVybiAtMTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0gIHJldHVybiBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgLyA4OwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWlibGQuYyBiL29wY29kZXMvbTMyci1pYmxkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZGM3M2YuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWlibGQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDAgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gYnVpbGRpbmcvZXh0cmFjdGlvbiBzdXBwb3J0IGZvciBtMzJyLiAtKi0gQyAtKi0KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWlibGQuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotLyogVXNlZCBieSB0aGUgaWZpZWxkIHJ0eCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEZMRChmKSAoZmllbGRzLT5mKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgbG9uZywgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBDR0VOX0lOU05fQllURVNfUFRSKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwKLQkgICAgICBDR0VOX0ZJRUxEUyAqLCBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBpbnQgZXh0cmFjdF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGxvbmcgKikpOwotc3RhdGljIGludCBleHRyYWN0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLAotCSAgICAgIENHRU5fSU5TTl9JTlQsIENHRU5fRklFTERTICosIGJmZF92bWEpKTsKLQwKLS8qIE9wZXJhbmQgaW5zZXJ0aW9uLiAgKi8KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLS8qIFN1YnJvdXRpbmUgb2YgaW5zZXJ0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSB2b2lkCi1pbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKLXsKLSAgdW5zaWduZWQgbG9uZyB4LG1hc2s7Ci0gIGludCBzaGlmdDsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgeCA9ICpidWZwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIxNiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIzMiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0gIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICB4ID0gKHggJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgKmJ1ZnAgPSB4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQliZmRfcHV0YjE2ICh4LCBidWZwKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDE2ICh4LCBidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl7Ci0JICBidWZwWzBdID0geCA+PiAxNjsKLQkgIGJmZF9wdXRiMTYgKHgsIGJ1ZnAgKyAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dGwxNiAoeCwgYnVmcCk7Ci0JICBidWZwWzJdID0geCA+PiAxNjsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMzIgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGluc2VydGlvbiByb3V0aW5lLgotCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotLyogPz8/IFRoaXMgZHVwbGljYXRlcyBmdW5jdGlvbmFsaXR5IHdpdGggYmZkJ3MgaG93dG8gdGFibGUgYW5kCi0gICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwKLQkgICAgICAgdG90YWxfbGVuZ3RoLCBidWZmZXIpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLXsKLSAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChDR0VOX0lOVF9JTlNOX1AKLSAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGJhc2UtaW5zbi1iaXRzaXplLAotICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCi0gIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAotCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0Jd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0gICAgfQotCi0gIC8qIEVuc3VyZSBWQUxVRSB3aWxsIGZpdC4gICovCi0gIGlmICghIENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBtYXh2YWwgPSBtYXNrOwotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgc3ByaW50ZiAoZXJyYnVmLAotCQkgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuIDAgYW5kICVsdSkiKSwKLQkJICAgdmFsdWUsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIG1pbnZhbCA9IC0gKDFMIDw8IChsZW5ndGggLSAxKSk7Ci0gICAgICBsb25nIG1heHZhbCA9ICgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMTsKLSAgICAgIGlmICh2YWx1ZSA8IG1pbnZhbCB8fCB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICBzcHJpbnRmCi0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIChlcnJidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIiksCi0JICAgICB2YWx1ZSwgbWludmFsLCBtYXh2YWwpOwotCSAgcmV0dXJuIGVycmJ1ZjsKLQl9Ci0gICAgfQotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgewotICAgIGludCBzaGlmdDsKLQotICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgICBlbHNlCi0gICAgICBzaGlmdCA9IHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKTsKLSAgICAqYnVmZmVyID0gKCpidWZmZXIgJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0gIH0KLQotI2Vsc2UgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlciArIHdvcmRfb2Zmc2V0IC8gODsKLQotICAgIGluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKTsKLSAgfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGJ1aWxkZXIgKGluc2VydCBoYW5kbGVyKS4KLSAgIFRoZSBpbnN0cnVjdGlvbiBpcyByZWNvcmRlZCBpbiBDR0VOX0lOVF9JTlNOX1AgYnl0ZSBvcmRlcgotICAgKG1lYW5pbmcgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgQlVGRkVSIGlzIGFuIGludCAqIGFuZCB0aHVzIHRoZSB2YWx1ZSBpcwotICAgcmVjb3JkZWQgaW4gaG9zdCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGRkVSIGlzIGFuIGFycmF5IG9mIGJ5dGVzIGFuZCB0aGUKLSAgIHZhbHVlIGlzIHJlY29yZGVkIGluIHRhcmdldCBieXRlIG9yZGVyKS4KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbnNlcnRfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotCi0gIENHRU5fSU5JVF9JTlNFUlQgKGNkKTsKLSAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbik7Ci0KLSAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKLSAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbGF0ZXIuICAqLwotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgKmJ1ZmZlciA9IHZhbHVlOwotCi0jZWxzZQotCi0gIGNnZW5fcHV0X2luc25fdmFsdWUgKGNkLCBidWZmZXIsIG1pbiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplLAotCQkJCQlDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpKSwKLQkJICAgICAgIHZhbHVlKTsKLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgLyogPz8/IEl0IHdvdWxkIGJlIGJldHRlciB0byBzY2FuIHRoZSBmb3JtYXQncyBmaWVsZHMuCi0gICAgIFN0aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBpbnNlcnQgYSB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCB0aG91Z2g7Ci0gICAgIGUuZy4gc3RvcmluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgdGhhdCBnb3QgcmVzb2x2ZWQgbGF0ZXIuCi0gICAgIE5lZWRzIG1vcmUgdGhvdWdodCBmaXJzdC4gICovCi0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICogc3luICE9ICdcMCc7ICsrIHN5bikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQljb250aW51ZTsKLQotICAgICAgZXJybXNnID0gKCogY2QtPmluc2VydF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkgICAgICAgZmllbGRzLCBidWZmZXIsIHBjKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0vKiBPcGVyYW5kIGV4dHJhY3Rpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4KLSAgIEVuc3VyZSBzdWZmaWNpZW50IGJ5dGVzIGFyZSBjYWNoZWQgaW4gRVhfSU5GTy4KLSAgIE9GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIEJZVEVTIGlzIHRoZSBsZW5ndGggb2YgdGhlIG5lZWRlZCB2YWx1ZS4KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBpbnQKLWZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCBvZmZzZXQsIGJ5dGVzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBvZmZzZXQsIGJ5dGVzOwotICAgICBiZmRfdm1hIHBjOwotewotICAvKiBJdCdzIGRvdWJ0ZnVsIHRoYXQgdGhlIG1pZGRsZSBwYXJ0IGhhcyBhbHJlYWR5IGJlZW4gZmV0Y2hlZCBzbwotICAgICB3ZSBkb24ndCBvcHRpbWl6ZSB0aGF0IGNhc2UuICBraXNzLiAgKi8KLSAgaW50IG1hc2s7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBleF9pbmZvLT5kaXNfaW5mbzsKLQotICAvKiBGaXJzdCBkbyBhIHF1aWNrIGNoZWNrLiAgKi8KLSAgbWFzayA9ICgxIDw8IGJ5dGVzKSAtIDE7Ci0gIGlmICgoKGV4X2luZm8tPnZhbGlkID4+IG9mZnNldCkgJiBtYXNrKSA9PSBtYXNrKQotICAgIHJldHVybiAxOwotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGJ5dGUgd2UgbmVlZCB0byByZWFkLiAgKi8KLSAgZm9yIChtYXNrID0gMSA8PCBvZmZzZXQ7IGJ5dGVzID4gMDsgLS1ieXRlcywgKytvZmZzZXQsIG1hc2sgPDw9IDEpCi0gICAgaWYgKCEgKG1hc2sgJiBleF9pbmZvLT52YWxpZCkpCi0gICAgICBicmVhazsKLQotICBpZiAoYnl0ZXMpCi0gICAgewotICAgICAgaW50IHN0YXR1czsKLQotICAgICAgcGMgKz0gb2Zmc2V0OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShwYywgZXhfaW5mby0+aW5zbl9ieXRlcyArIG9mZnNldCwgYnl0ZXMsIGluZm8pOwotCi0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBleF9pbmZvLT52YWxpZCB8PSAoKDEgPDwgYnl0ZXMpIC0gMSkgPDwgb2Zmc2V0OwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBsb25nCi1leHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotICAgICBiZmRfdm1hIHBjOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHJldHVybiAoeCA+PiBzaGlmdCkgJiBtYXNrOwotfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotLyogRGVmYXVsdCBleHRyYWN0aW9uIHJvdXRpbmUuCi0KLSAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgb2YgdGhlIGluc24gaW4gaG9zdCBvcmRlciwKLSAgIG9yIHNvbWV0aW1lcyBsZXNzIGZvciBjYXNlcyBsaWtlIHRoZSBtMzJyIHdoZXJlIHRoZSBiYXNlIGluc24gc2l6ZSBpcyAzMgotICAgYnV0IHNvbWUgaW5zbnMgYXJlIDE2IGJpdHMuCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4gIFdlIG9ubHkgbmVlZCBgU0lHTkVEJywKLSAgIGJ1dCBmb3IgZ2VuZXJhbGl0eSB3ZSB0YWtlIGEgYml0bWFzayBvZiBhbGwgb2YgdGhlbS4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi0vKiA/Pz8gVGhlIHJldHVybiBjb2RlIGlzbid0IHByb3Blcmx5IHVzZWQuICB3aXAuICAqLwotCi0vKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwKLQkJd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aCwgcGMsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUKLSAgICAgc28gZ2l2ZSBpdCBhIHN0YW5kYXJkIHZhbHVlIG9mIHplcm8uICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgewotICAgICAgKnZhbHVlcCA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgaW5zbi1iYXNlLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRG9lcyB0aGUgdmFsdWUgcmVzaWRlIGluIElOU05fVkFMVUU/ICAqLwotCi0gIGlmICh3b3JkX29mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gICAgICBDR0VOX0lOU05fSU5UIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0gICAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKChzdGFydCArIDEpIC0gbGVuZ3RoKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gICAgICB2YWx1ZSAmPSBtYXNrOwotICAgICAgLyogc2lnbiBleHRlbmQ/ICovCi0gICAgICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgKDFMIDw8IChsZW5ndGggLSAxKSkpKQotCXZhbHVlIHw9IH5tYXNrOwotICAgIH0KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSBleF9pbmZvLT5pbnNuX2J5dGVzICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgICBpZiAod29yZF9sZW5ndGggPiAzMikKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKGZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCB3b3JkX29mZnNldCAvIDgsIHdvcmRfbGVuZ3RoIC8gOCwgcGMpID09IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAgIHZhbHVlID0gZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gICp2YWx1ZXAgPSB2YWx1ZTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGV4dHJhY3Rvci4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cywgdHJhbnNsYXRlZCB0byBob3N0IG9yZGVyLgotICAgVGhlIGV4dHJhY3RlZCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBFWF9JTkZPIGlzIHVzZWQgdG8gaGFuZGxlIHJlYWRpbmcgdmFyaWFibGUgbGVuZ3RoIGluc25zLgotICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cywgb3IgMCBpZiBubyBtYXRjaCwKLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycyBmZXRjaGluZyBkYXRhIChtZW1vcnlfZXJyb3JfZnVuYyB3aWxsIGhhdmUKLSAgIGJlZW4gY2FsbGVkKS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci0KLSAgQ0dFTl9JTklUX0VYVFJBQ1QgKGNkKTsKLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKnN5bjsgKytzeW4pCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JY29udGludWU7Ci0KLSAgICAgIGxlbmd0aCA9ICgqIGNkLT5leHRyYWN0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQlleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKTsKLSAgICAgIGlmIChsZW5ndGggPD0gMCkKLQlyZXR1cm4gbGVuZ3RoOwotICAgIH0KLQotICAvKiBXZSByZWNvZ25pemVkIGFuZCBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkIHRoaXMgaW5zbi4gICovCi0gIHJldHVybiBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci19Ci0MCi0vKiBtYWNoaW5lIGdlbmVyYXRlZCBjb2RlIGFkZGVkIGhlcmUgKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBpbnNlcnRpb24uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4gIEl0J3MgYWxzbyBuZWVkZWQgYnkgR0FTIHRvIGluc2VydCBvcGVyYW5kcyB0aGF0IGNvdWxkbid0IGJlCi0gICByZXNvbHZlZCBkdXJpbmcgcGFyc2luZy4KLSovCi0KLWNvbnN0IGNoYXIgKgotbTMycl9jZ2VuX2luc2VydF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCBidWZmZXIsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9hY2MsIDAsIDAsIDgsIDEsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfYWNjZCwgMCwgMCwgNCwgMiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9hY2NzLCAwLCAwLCAxMiwgMiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTY7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtIChwYykpKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDI0OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAocGMpKSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKCgocGMpICYgKC00KSkpKSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2hpMTYsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2ltbTE7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgLSAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDE1LCAxLCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9zaW1tOCwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0xNiwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTI0LCAwfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfQUJTX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTQsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tNSwgMCwgMCwgMTEsIDUsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0xNiwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGV4dHJhY3Rpb24uCi0gICBUaGUgcmVzdWx0IGlzIDw9IDAgZm9yIGVycm9yLCA+MCBmb3Igc3VjY2Vzcy4KLSAgID8/PyBBY3R1YWwgdmFsdWVzIGFyZW4ndCB3ZWxsIGRlZmluZWQgcmlnaHQgbm93LgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1pbnQKLW0zMnJfY2dlbl9leHRyYWN0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEFzc3VtZSBzdWNjZXNzIChmb3IgdGhvc2Ugb3BlcmFuZHMgdGhhdCBhcmUgbm9wcykuICAqLwotICBpbnQgbGVuZ3RoID0gMTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCAxLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfYWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCAyLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfYWNjZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDIsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9hY2NzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDIpKSkgKyAocGMpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AxNiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDIpKSkgKyAocGMpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgyKSkpICsgKCgocGMpICYgKC00KSkpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9oaTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDE1LCAxLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgKyAoMSkpOwotICAgICAgICBmaWVsZHMtPmZfaW1tMSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9BQlNfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTI0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDExLCA1LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLWNnZW5faW5zZXJ0X2ZuICogY29uc3QgbTMycl9jZ2VuX2luc2VydF9oYW5kbGVyc1tdID0gCi17Ci0gIGluc2VydF9pbnNuX25vcm1hbCwKLX07Ci0KLWNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0IG0zMnJfY2dlbl9leHRyYWN0X2hhbmRsZXJzW10gPSAKLXsKLSAgZXh0cmFjdF9pbnNuX25vcm1hbCwKLX07Ci0KLS8qIEdldHRpbmcgdmFsdWVzIGZyb20gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSByZXR1cm4uCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIHJlc3VsdCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi1pbnQKLW0zMnJfY2dlbl9nZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgaW50IHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2FjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9oaTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pbW0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW04OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotYmZkX3ZtYQotbTMycl9jZ2VuX2dldF92bWFfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBiZmRfdm1hIHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2FjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9oaTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pbW0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW04OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogU3R1ZmZpbmcgdmFsdWVzIGluIGNnZW5fZmllbGRzIGlzIGhhbmRsZWQgYnkgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucy4KLSAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFZBTFVFIGFyZ3VtZW50IHRoZXkgYWNjZXB0LgotICAgVE9ETzogZmxvYXRpbmcgcG9pbnQsIGlubGluaW5nIHN1cHBvcnQsIHJlbW92ZSBjYXNlcyB3aGVyZSBhcmd1bWVudCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi12b2lkCi1tMzJyX2NnZW5fc2V0X2ludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgZmllbGRzLT5mX2FjY2QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgZmllbGRzLT5mX2FjY3MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBmaWVsZHMtPmZfaGkxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICBmaWVsZHMtPmZfaW1tMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZmllbGRzLT5mX3VpbW00ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTUgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi12b2lkCi1tMzJyX2NnZW5fc2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICBmaWVsZHMtPmZfYWNjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2NkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2NzID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgZmllbGRzLT5mX2Rpc3AxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgZmllbGRzLT5mX2hpMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgZmllbGRzLT5mX2ltbTEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMjQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZmllbGRzLT5mX3VpbW01ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIGluc3RydWN0aW9uIGJ1aWxkZXIgdGFibGVzLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGNkLT5pbnNlcnRfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9pbnNlcnRfaGFuZGxlcnNbMF07Ci0gIGNkLT5leHRyYWN0X2hhbmRsZXJzID0gJiBtMzJyX2NnZW5fZXh0cmFjdF9oYW5kbGVyc1swXTsKLQotICBjZC0+aW5zZXJ0X29wZXJhbmQgPSBtMzJyX2NnZW5faW5zZXJ0X29wZXJhbmQ7Ci0gIGNkLT5leHRyYWN0X29wZXJhbmQgPSBtMzJyX2NnZW5fZXh0cmFjdF9vcGVyYW5kOwotCi0gIGNkLT5nZXRfaW50X29wZXJhbmQgPSBtMzJyX2NnZW5fZ2V0X2ludF9vcGVyYW5kOwotICBjZC0+c2V0X2ludF9vcGVyYW5kID0gbTMycl9jZ2VuX3NldF9pbnRfb3BlcmFuZDsKLSAgY2QtPmdldF92bWFfb3BlcmFuZCA9IG0zMnJfY2dlbl9nZXRfdm1hX29wZXJhbmQ7Ci0gIGNkLT5zZXRfdm1hX29wZXJhbmQgPSBtMzJyX2NnZW5fc2V0X3ZtYV9vcGVyYW5kOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLW9wYy5jIGIvb3Bjb2Rlcy9tMzJyLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWVmZWNjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2ODUgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotCi0vKiBUaGUgaGFzaCBmdW5jdGlvbnMgYXJlIHJlY29yZGVkIGhlcmUgdG8gaGVscCBrZWVwIGFzc2VtYmxlciBjb2RlIG91dCBvZgotICAgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdmljZSB2ZXJzYS4gICovCi0KLXN0YXRpYyBpbnQgYXNtX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGFzbV9oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRpc19oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBkaXNfaGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBJbnN0cnVjdGlvbiBmb3JtYXRzLiAgKi8KLQotI2RlZmluZSBGKGYpICYgbTMycl9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoTTMyUl8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbXB0eSA9IHsKLSAgMCwgMCwgMHgwLCB7IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZCA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkMyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYW5kMyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfVUlNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfb3IzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9VSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGRpID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1NJTU04KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkdjMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjOCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjMjQgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JlcSA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfRElTUDE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmVxeiA9IHsKLSAgMzIsIDMyLCAweGZmZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfRElTUDE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY21wID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jbXBpID0gewotICAzMiwgMzIsIDB4ZmZmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jbXB6ID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kaXYgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwZmZmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2pjID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZDI0ID0gewotICAzMiwgMzIsIDB4ZjAwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9VSU1NMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkxNiA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbWFjaGlfYSA9IHsKLSAgMTYsIDE2LCAweGYwNzAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9BQ0MpLCBGIChGX09QMjMpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZmYWNoaSA9IHsKLSAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZmYWNoaV9hID0gewotICAxNiwgMTYsIDB4ZjBmMywgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfT1AzKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZmYyA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZ0YWNoaSA9IHsKLSAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZ0YWNoaV9hID0gewotICAxNiwgMTYsIDB4ZjBmMywgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfT1AzKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZ0YyA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbm9wID0gewotICAxNiwgMTYsIDB4ZmZmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNfZHNpID0gewotICAxNiwgMTYsIDB4ZjNmMiwgeyBGIChGX09QMSksIEYgKEZfQUNDRCksIEYgKEZfQklUUzY3KSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX0JJVDE0KSwgRiAoRl9JTU0xKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc2V0aCA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfSEkxNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3NsbGkgPSB7Ci0gIDE2LCAxNiwgMHhmMGUwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfU0hJRlRfT1AyKSwgRiAoRl9VSU1NNSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0X2QgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3RyYXAgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9VSU1NNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3NhdGIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwZmZmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1VJTU0xNiksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgbTMycl9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgeyAwIH0gfSwKLS8qIGFkZCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhMCB9Ci0gIH0sCi0vKiBhZGQzICRkciwkc3IsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoSEFTSCksIE9QIChTTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4ODBhMDAwMDAgfQotICB9LAotLyogYW5kICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGMwIH0KLSAgfSwKLS8qIGFuZDMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFVJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hbmQzLCB7IDB4ODBjMDAwMDAgfQotICB9LAotLyogb3IgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ZTAgfQotICB9LAotLyogb3IzICRkciwkc3IsJGhhc2gkdWxvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoSEFTSCksIE9QIChVTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9vcjMsIHsgMHg4MGUwMDAwMCB9Ci0gIH0sCi0vKiB4b3IgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ZDAgfQotICB9LAotLyogeG9yMyAkZHIsJHNyLCR1aW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoVUlNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FuZDMsIHsgMHg4MGQwMDAwMCB9Ci0gIH0sCi0vKiBhZGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNJTU04KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg0MDAwIH0KLSAgfSwKLS8qIGFkZHYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODAgfQotICB9LAotLyogYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDgwODAwMDAwIH0KLSAgfSwKLS8qIGFkZHggJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTAgfQotICB9LAotLyogYmMucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3YzAwIH0KLSAgfSwKLS8qIGJjLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmMwMDAwMDAgfQotICB9LAotLyogYmVxICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXEsIHsgMHhiMDAwMDAwMCB9Ci0gIH0sCi0vKiBiZXF6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMDgwMDAwMCB9Ci0gIH0sCi0vKiBiZ2V6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGIwMDAwMCB9Ci0gIH0sCi0vKiBiZ3R6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGQwMDAwMCB9Ci0gIH0sCi0vKiBibGV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGMwMDAwMCB9Ci0gIH0sCi0vKiBibHR6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGEwMDAwMCB9Ci0gIH0sCi0vKiBibmV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMDkwMDAwMCB9Ci0gIH0sCi0vKiBibC5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdlMDAgfQotICB9LAotLyogYmwubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmZTAwMDAwMCB9Ci0gIH0sCi0vKiBiY2wucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ODAwIH0KLSAgfSwKLS8qIGJjbC5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGY4MDAwMDAwIH0KLSAgfSwKLS8qIGJuYy5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdkMDAgfQotICB9LAotLyogYm5jLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmQwMDAwMDAgfQotICB9LAotLyogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXEsIHsgMHhiMDEwMDAwMCB9Ci0gIH0sCi0vKiBicmEucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ZjAwIH0KLSAgfSwKLS8qIGJyYS5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGZmMDAwMDAwIH0KLSAgfSwKLS8qIGJuY2wucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3OTAwIH0KLSAgfSwKLS8qIGJuY2wubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmOTAwMDAwMCB9Ci0gIH0sCi0vKiBjbXAgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg0MCB9Ci0gIH0sCi0vKiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcGksIHsgMHg4MDQwMDAwMCB9Ci0gIH0sCi0vKiBjbXB1ICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NTAgfQotICB9LAotLyogY21wdWkgJHNyYzIsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21waSwgeyAweDgwNTAwMDAwIH0KLSAgfSwKLS8qIGNtcGVxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NjAgfQotICB9LAotLyogY21weiAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21weiwgeyAweDcwIH0KLSAgfSwKLS8qIGRpdiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDAwMDAwMCB9Ci0gIH0sCi0vKiBkaXZ1ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMTAwMDAwIH0KLSAgfSwKLS8qIHJlbSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDIwMDAwMCB9Ci0gIH0sCi0vKiByZW11ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMzAwMDAwIH0KLSAgfSwKLS8qIGRpdmggJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAwMDAwMTAgfQotICB9LAotLyogamMgJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfamMsIHsgMHgxY2MwIH0KLSAgfSwKLS8qIGpuYyAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9qYywgeyAweDFkYzAgfQotICB9LAotLyogamwgJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfamMsIHsgMHgxZWMwIH0KLSAgfSwKLS8qIGptcCAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9qYywgeyAweDFmYzAgfQotICB9LAotLyogbGQgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBjMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTBjMDAwMDAgfQotICB9LAotLyogbGRiICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwODAgfQotICB9LAotLyogbGRiICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMDgwMDAwMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBhMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwYTAwMDAwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjA5MCB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMDkwMDAwMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwYjAgfQotICB9LAotLyogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTBiMDAwMDAgfQotICB9LAotLyogbGQgJGRyLEAkc3IrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBlMCB9Ci0gIH0sCi0vKiBsZDI0ICRkciwkdWltbTI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGQyNCwgeyAweGUwMDAwMDAwIH0KLSAgfSwKLS8qIGxkaTggJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDYwMDAgfQotICB9LAotLyogbGRpMTYgJGRyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFNMTzE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTE2LCB7IDB4OTBmMDAwMDAgfQotICB9LAotLyogbG9jayAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGQwIH0KLSAgfSwKLS8qIG1hY2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA0MCB9Ci0gIH0sCi0vKiBtYWNoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwNDAgfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDUwIH0KLSAgfSwKLS8qIG1hY2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzA1MCB9Ci0gIH0sCi0vKiBtYWN3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDYwIH0KLSAgfSwKLS8qIG1hY3doaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwNjAgfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA3MCB9Ci0gIH0sCi0vKiBtYWN3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDcwIH0KLSAgfSwKLS8qIG11bCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDYwIH0KLSAgfSwKLS8qIG11bGhpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAwMCB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwMDAgfQotICB9LAotLyogbXVsbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDEwIH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzAxMCB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDIwIH0KLSAgfSwKLS8qIG11bHdoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwMjAgfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAzMCB9Ci0gIH0sCi0vKiBtdWx3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDMwIH0KLSAgfSwKLS8qIG12ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwODAgfQotICB9LAotLyogbXZmYWNoaSAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpLCB7IDB4NTBmMCB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciwkYWNjcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpX2EsIHsgMHg1MGYwIH0KLSAgfSwKLS8qIG12ZmFjbG8gJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaSwgeyAweDUwZjEgfQotICB9LAotLyogbXZmYWNsbyAkZHIsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaV9hLCB7IDB4NTBmMSB9Ci0gIH0sCi0vKiBtdmZhY21pICRkciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGksIHsgMHg1MGYyIH0KLSAgfSwKLS8qIG12ZmFjbWkgJGRyLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChBQ0NTKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGlfYSwgeyAweDUwZjIgfQotICB9LAotLyogbXZmYyAkZHIsJHNjciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0NSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmMsIHsgMHgxMDkwIH0KLSAgfSwKLS8qIG12dGFjaGkgJHNyYzEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGFjaGksIHsgMHg1MDcwIH0KLSAgfSwKLS8qIG12dGFjaGkgJHNyYzEsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9tdnRhY2hpX2EsIHsgMHg1MDcwIH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGFjaGksIHsgMHg1MDcxIH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9tdnRhY2hpX2EsIHsgMHg1MDcxIH0KLSAgfSwKLS8qIG12dGMgJHNyLCRkY3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksICcsJywgT1AgKERDUiksIDAgfSB9LAotICAgICYgaWZtdF9tdnRjLCB7IDB4MTBhMCB9Ci0gIH0sCi0vKiBuZWcgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MzAgfQotICB9LAotLyogbm9wICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDcwMDAgfQotICB9LAotLyogbm90ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGIwIH0KLSAgfSwKLS8qIHJhYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg1MDkwIH0KLSAgfSwKLS8qIHJhYyAkYWNjZCwkYWNjcywkaW1tMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEFDQ0QpLCAnLCcsIE9QIChBQ0NTKSwgJywnLCBPUCAoSU1NMSksIDAgfSB9LAotICAgICYgaWZtdF9yYWNfZHNpLCB7IDB4NTA5MCB9Ci0gIH0sCi0vKiByYWNoICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDUwODAgfQotICB9LAotLyogcmFjaCAkYWNjZCwkYWNjcywkaW1tMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEFDQ0QpLCAnLCcsIE9QIChBQ0NTKSwgJywnLCBPUCAoSU1NMSksIDAgfSB9LAotICAgICYgaWZtdF9yYWNfZHNpLCB7IDB4NTA4MCB9Ci0gIH0sCi0vKiBydGUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4MTBkNiB9Ci0gIH0sCi0vKiBzZXRoICRkciwkaGFzaCRoaTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChIQVNIKSwgT1AgKEhJMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2V0aCwgeyAweGQwYzAwMDAwIH0KLSAgfSwKLS8qIHNsbCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDQwIH0KLSAgfSwKLS8qIHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDkwYzAwMDAwIH0KLSAgfSwKLS8qIHNsbGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2xsaSwgeyAweDUwNDAgfQotICB9LAotLyogc3JhICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMjAgfQotICB9LAotLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHYzLCB7IDB4OTBhMDAwMDAgfQotICB9LAotLyogc3JhaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NNSksIDAgfSB9LAotICAgICYgaWZtdF9zbGxpLCB7IDB4NTAyMCB9Ci0gIH0sCi0vKiBzcmwgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAwMCB9Ci0gIH0sCi0vKiBzcmwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg5MDgwMDAwMCB9Ci0gIH0sCi0vKiBzcmxpICRkciwkdWltbTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU01KSwgMCB9IH0sCi0gICAgJiBpZm10X3NsbGksIHsgMHg1MDAwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA0MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QsIHsgMHhhMDQwMDAwMCB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QsIHsgMHhhMDAwMDAwMCB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDIwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QsIHsgMHhhMDIwMDAwMCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKyRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKycsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNjAgfQotICB9LAotLyogc3QgJHNyYzEsQC0kc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJy0nLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDcwIH0KLSAgfSwKLS8qIHN1YiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMCB9Ci0gIH0sCi0vKiBzdWJ2ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDAgfQotICB9LAotLyogc3VieCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMCB9Ci0gIH0sCi0vKiB0cmFwICR1aW1tNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFVJTU00KSwgMCB9IH0sCi0gICAgJiBpZm10X3RyYXAsIHsgMHgxMGYwIH0KLSAgfSwKLS8qIHVubG9jayAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNTAgfQotICB9LAotLyogc2F0YiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9zYXRiLCB7IDB4ODA2MDAzMDAgfQotICB9LAotLyogc2F0aCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9zYXRiLCB7IDB4ODA2MDAyMDAgfQotICB9LAotLyogc2F0ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X3NhdGIsIHsgMHg4MDYwMDAwMCB9Ci0gIH0sCi0vKiBwY21wYnogJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcHosIHsgMHgzNzAgfQotICB9LAotLyogc2FkZCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg1MGU0IH0KLSAgfSwKLS8qIG1hY3d1MSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwYjAgfQotICB9LAotLyogbXNibG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg1MGQwIH0KLSAgfSwKLS8qIG11bHd1MSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwYTAgfQotICB9LAotLyogbWFjbGgxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NTBjMCB9Ci0gIH0sCi0vKiBzYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg3NDAxIH0KLSAgfSwKLS8qIHNuYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg3NTAxIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0vKiBGb3JtYXRzIGZvciBBTElBUyBtYWNyby1pbnNucy4gICovCi0KLSNkZWZpbmUgRihmKSAmIG0zMnJfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKE0zMlJfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmM4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibDhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmwyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjbDhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmNsMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibmM4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuYzI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYnJhOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmEyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuY2w4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuY2wyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGJfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRiX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRoX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHViXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1aF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcG9wID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4YSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9TSU1NOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTE2YSA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9SMSksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcmFjX2QgPSB7Ci0gIDE2LCAxNiwgMHhmM2ZmLCB7IEYgKEZfT1AxKSwgRiAoRl9BQ0NEKSwgRiAoRl9CSVRTNjcpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfQklUMTQpLCBGIChGX0lNTTEpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNfZHMgPSB7Ci0gIDE2LCAxNiwgMHhmM2YzLCB7IEYgKEZfT1AxKSwgRiAoRl9BQ0NEKSwgRiAoRl9CSVRTNjcpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfQklUMTQpLCBGIChGX0lNTTEpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNoX2QgPSB7Ci0gIDE2LCAxNiwgMHhmM2ZmLCB7IEYgKEZfT1AxKSwgRiAoRl9BQ0NEKSwgRiAoRl9CSVRTNjcpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfQklUMTQpLCBGIChGX0lNTTEpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNoX2RzID0gewotICAxNiwgMTYsIDB4ZjNmMywgeyBGIChGX09QMSksIEYgKEZfQUNDRCksIEYgKEZfQklUUzY3KSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX0JJVDE0KSwgRiAoRl9JTU0xKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0Yl8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0aF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGhfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3B1c2ggPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotLyogRWFjaCBub24tc2ltcGxlIG1hY3JvIGVudHJ5IHBvaW50cyB0byBhbiBhcnJheSBvZiBleHBhbnNpb24gcG9zc2liaWxpdGllcy4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgbTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbXSA9Ci17Ci0vKiBiYyAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYmM4ciIsICJiYyIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJjICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYmMyNHIiLCAiYmMiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJsICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJibDhyIiwgImJsIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYmwgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJibDI0ciIsICJibCIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBiY2wgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJjbDhyIiwgImJjbCIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShGSUxMX1NMT1QpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogYmNsICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYmNsMjRyIiwgImJjbCIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuYyAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYm5jOHIiLCAiYm5jIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYm5jICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYm5jMjRyIiwgImJuYyIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYnJhICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJicmE4ciIsICJicmEiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBicmEgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJicmEyNHIiLCAiYnJhIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuY2wgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJuY2w4ciIsICJibmNsIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBibmNsICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYm5jbDI0ciIsICJibmNsIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGQgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZC0yIiwgImxkIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGQgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGQtZDIiLCAibGQiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZGItMiIsICJsZGIiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGRiLWQyIiwgImxkYiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkaC0yIiwgImxkaCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZGgtZDIiLCAibGRoIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkdWItMiIsICJsZHViIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZHViLWQyIiwgImxkdWIiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGR1aC0yIiwgImxkdWgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkdWgtZDIiLCAibGR1aCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHBvcCAkZHIgKi8KLSAgewotICAgIC0xLCAicG9wIiwgInBvcCIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIC0xLCAibGRpOGEiLCAibGRpIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogbGRpICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgLTEsICJsZGkxNmEiLCAibGRpIiwgMzIsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiByYWMgJGFjY2QgKi8KLSAgewotICAgIC0xLCAicmFjLWQiLCAicmFjIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogcmFjICRhY2NkLCRhY2NzICovCi0gIHsKLSAgICAtMSwgInJhYy1kcyIsICJyYWMiLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiByYWNoICRhY2NkICovCi0gIHsKLSAgICAtMSwgInJhY2gtZCIsICJyYWNoIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogcmFjaCAkYWNjZCwkYWNjcyAqLwotICB7Ci0gICAgLTEsICJyYWNoLWRzIiwgInJhY2giLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgLTEsICJzdC0yIiwgInN0IiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0LWQyIiwgInN0IiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICAtMSwgInN0Yi0yIiwgInN0YiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAic3RiLWQyIiwgInN0YiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgLTEsICJzdGgtMiIsICJzdGgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0aC1kMiIsICJzdGgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBwdXNoICRzcmMxICovCi0gIHsKLSAgICAtMSwgInB1c2giLCAicHVzaCIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotfTsKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBtMzJyX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbXSA9Ci17Ci0vKiBiYyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzhyLCB7IDB4N2MwMCB9Ci0gIH0sCi0vKiBiYyAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjRyLCB7IDB4ZmMwMDAwMDAgfQotICB9LAotLyogYmwgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmw4ciwgeyAweDdlMDAgfQotICB9LAotLyogYmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9ibDI0ciwgeyAweGZlMDAwMDAwIH0KLSAgfSwKLS8qIGJjbCAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iY2w4ciwgeyAweDc4MDAgfQotICB9LAotLyogYmNsICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmNsMjRyLCB7IDB4ZjgwMDAwMDAgfQotICB9LAotLyogYm5jICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JuYzhyLCB7IDB4N2QwMCB9Ci0gIH0sCi0vKiBibmMgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9ibmMyNHIsIHsgMHhmZDAwMDAwMCB9Ci0gIH0sCi0vKiBicmEgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhOHIsIHsgMHg3ZjAwIH0KLSAgfSwKLS8qIGJyYSAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYTI0ciwgeyAweGZmMDAwMDAwIH0KLSAgfSwKLS8qIGJuY2wgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYm5jbDhyLCB7IDB4NzkwMCB9Ci0gIH0sCi0vKiBibmNsICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYm5jbDI0ciwgeyAweGY5MDAwMDAwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkXzIsIHsgMHgyMGMwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkX2QyLCB7IDB4YTBjMDAwMDAgfQotICB9LAotLyogbGRiICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkYl8yLCB7IDB4MjA4MCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRiX2QyLCB7IDB4YTA4MDAwMDAgfQotICB9LAotLyogbGRoICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkaF8yLCB7IDB4MjBhMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRoX2QyLCB7IDB4YTBhMDAwMDAgfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHViXzIsIHsgMHgyMDkwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1Yl9kMiwgeyAweGEwOTAwMDAwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1aF8yLCB7IDB4MjBiMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkdWhfZDIsIHsgMHhhMGIwMDAwMCB9Ci0gIH0sCi0vKiBwb3AgJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfcG9wLCB7IDB4MjBlZiB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpOGEsIHsgMHg2MDAwIH0KLSAgfSwKLS8qIGxkaSAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMTZhLCB7IDB4OTBmMDAwMDAgfQotICB9LAotLyogcmFjICRhY2NkICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksIDAgfSB9LAotICAgICYgaWZtdF9yYWNfZCwgeyAweDUwOTAgfQotICB9LAotLyogcmFjICRhY2NkLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfcmFjX2RzLCB7IDB4NTA5MCB9Ci0gIH0sCi0vKiByYWNoICRhY2NkICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksIDAgfSB9LAotICAgICYgaWZtdF9yYWNoX2QsIHsgMHg1MDgwIH0KLSAgfSwKLS8qIHJhY2ggJGFjY2QsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChBQ0NEKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9yYWNoX2RzLCB7IDB4NTA4MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0XzIsIHsgMHgyMDQwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZDIsIHsgMHhhMDQwMDAwMCB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdGJfMiwgeyAweDIwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RiX2QyLCB7IDB4YTAwMDAwMDAgfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RoXzIsIHsgMHgyMDIwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0aF9kMiwgeyAweGEwMjAwMDAwIH0KLSAgfSwKLS8qIHB1c2ggJHNyYzEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCi0gICAgJiBpZm10X3B1c2gsIHsgMHgyMDdmIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0hfUAotI2RlZmluZSBDR0VOX0FTTV9IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSF9QCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfUChpbnNuKSAxCi0jZW5kaWYKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0hfUCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KLQotc3RhdGljIGludAotYXNtX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIHJldHVybiBDR0VOX0FTTV9IQVNIX1AgKGluc24pOwotfQotCi1zdGF0aWMgaW50Ci1kaXNfaGFzaF9pbnNuX3AgKGluc24pCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLXsKLSAgLyogSWYgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBOTy1ESVMgYXR0cmlidXRlIGlzIHByZXNlbnQsCi0gICAgIGlnbm9yZS4gICovCi0gIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX05PX0RJUykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIX1AgKGluc24pOwotfQotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0gKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9TSVpFIDEyNwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkKLSNlbHNlCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpIC8qRklYTUUqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogSXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gcHJvdmlkZSBhIGRlZmF1bHQgaGVyZSwKLSAgIGJ1dCB3aGlsZSB0aGlzIGlzIHVuZGVyIGRldmVsb3BtZW50IHdlIGRvLgotICAgQlVGRkVSIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KLSAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KLQotI2lmbmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWYsIHZhbHVlKSAoKih1bnNpZ25lZCBjaGFyICopIChidWYpKQotI2VuZGlmCi0KLS8qIFRoZSByZXN1bHQgaXMgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGluc24uCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0ggaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWFzbV9oYXNoX2luc24gKG1uZW0pCi0gICAgIGNvbnN0IGNoYXIgKiBtbmVtOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSCAobW5lbSk7Ci19Ci0KLS8qIEJVRiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWRpc19oYXNoX2luc24gKGJ1ZiwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIIChidWYsIHZhbHVlKTsKLX0KLQotLyogU2V0IHRoZSByZWNvcmRlZCBsZW5ndGggb2YgdGhlIGluc24gaW4gdGhlIENHRU5fRklFTERTIHN0cnVjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZmllbGRzX2JpdHNpemUgKGZpZWxkcywgc2l6ZSkKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgaW50IHNpemU7Ci17Ci0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBzaXplOwotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4KLSAgIFRoaXMgcGx1Z3MgdGhlIG9wY29kZSBlbnRyaWVzIGFuZCBtYWNybyBpbnN0cnVjdGlvbnMgaW50byB0aGUgY3B1IHRhYmxlLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBudW1fbWFjcm9zID0gKHNpemVvZiAobTMycl9jZ2VuX21hY3JvX2luc25fdGFibGUpIC8KLQkJICAgIHNpemVvZiAobTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbMF0pKTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdOwotICBjb25zdCBDR0VOX09QQ09ERSAqb2MgPSAmIG0zMnJfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAobnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIG1lbXNldCAoaW5zbnMsIDAsIG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hY3JvczsgKytpKQotICAgIHsKLSAgICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gICAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0gICAgfQotICBjZC0+bWFjcm9faW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPm1hY3JvX2luc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBudW1fbWFjcm9zOwotCi0gIG9jID0gJiBtMzJyX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIGluc25zID0gKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXM7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0KLSAgY2QtPnNpemVvZl9maWVsZHMgPSBzaXplb2YgKENHRU5fRklFTERTKTsKLSAgY2QtPnNldF9maWVsZHNfYml0c2l6ZSA9IHNldF9maWVsZHNfYml0c2l6ZTsKLQotICBjZC0+YXNtX2hhc2hfcCA9IGFzbV9oYXNoX2luc25fcDsKLSAgY2QtPmFzbV9oYXNoID0gYXNtX2hhc2hfaW5zbjsKLSAgY2QtPmFzbV9oYXNoX3NpemUgPSBDR0VOX0FTTV9IQVNIX1NJWkU7Ci0KLSAgY2QtPmRpc19oYXNoX3AgPSBkaXNfaGFzaF9pbnNuX3A7Ci0gIGNkLT5kaXNfaGFzaCA9IGRpc19oYXNoX2luc247Ci0gIGNkLT5kaXNfaGFzaF9zaXplID0gQ0dFTl9ESVNfSEFTSF9TSVpFOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLW9wYy5oIGIvb3Bjb2Rlcy9tMzJyLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJhMzMyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgaGVhZGVyIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJfT1BDX0gKLSNkZWZpbmUgTTMyUl9PUENfSAotCi0vKiAtLSBvcGMuaCAqLwotCi0jdW5kZWYgQ0dFTl9ESVNfSEFTSF9TSVpFCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSN1bmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIFgoYikgKCgodW5zaWduZWQgY2hhciAqKSAoYikpWzBdICYgMHhmMCkKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWZmZXIsIHZhbHVlKSBcCi0oWCAoYnVmZmVyKSB8IFwKLSAoWCAoYnVmZmVyKSA9PSAweDQwIHx8IFggKGJ1ZmZlcikgPT0gMHhlMCB8fCBYIChidWZmZXIpID09IDB4NjAgfHwgWCAoYnVmZmVyKSA9PSAweDUwID8gMCBcCi0gIDogWCAoYnVmZmVyKSA9PSAweDcwIHx8IFggKGJ1ZmZlcikgPT0gMHhmMCA/ICgoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzBdICYgMHhmKSBcCi0gIDogWCAoYnVmZmVyKSA9PSAweDMwID8gKCgoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzFdICYgMHg3MCkgPj4gNCkgXAotICA6ICgoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVsxXSAmIDB4ZjApID4+IDQpKSkKLQotLyogLS0gKi8KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgaW5zdHJ1Y3Rpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl90eXBlIHsKLSAgTTMyUl9JTlNOX0lOVkFMSUQsIE0zMlJfSU5TTl9BREQsIE0zMlJfSU5TTl9BREQzLCBNMzJSX0lOU05fQU5ECi0gLCBNMzJSX0lOU05fQU5EMywgTTMyUl9JTlNOX09SLCBNMzJSX0lOU05fT1IzLCBNMzJSX0lOU05fWE9SCi0gLCBNMzJSX0lOU05fWE9SMywgTTMyUl9JTlNOX0FEREksIE0zMlJfSU5TTl9BRERWLCBNMzJSX0lOU05fQUREVjMKLSAsIE0zMlJfSU5TTl9BRERYLCBNMzJSX0lOU05fQkM4LCBNMzJSX0lOU05fQkMyNCwgTTMyUl9JTlNOX0JFUQotICwgTTMyUl9JTlNOX0JFUVosIE0zMlJfSU5TTl9CR0VaLCBNMzJSX0lOU05fQkdUWiwgTTMyUl9JTlNOX0JMRVoKLSAsIE0zMlJfSU5TTl9CTFRaLCBNMzJSX0lOU05fQk5FWiwgTTMyUl9JTlNOX0JMOCwgTTMyUl9JTlNOX0JMMjQKLSAsIE0zMlJfSU5TTl9CQ0w4LCBNMzJSX0lOU05fQkNMMjQsIE0zMlJfSU5TTl9CTkM4LCBNMzJSX0lOU05fQk5DMjQKLSAsIE0zMlJfSU5TTl9CTkUsIE0zMlJfSU5TTl9CUkE4LCBNMzJSX0lOU05fQlJBMjQsIE0zMlJfSU5TTl9CTkNMOAotICwgTTMyUl9JTlNOX0JOQ0wyNCwgTTMyUl9JTlNOX0NNUCwgTTMyUl9JTlNOX0NNUEksIE0zMlJfSU5TTl9DTVBVCi0gLCBNMzJSX0lOU05fQ01QVUksIE0zMlJfSU5TTl9DTVBFUSwgTTMyUl9JTlNOX0NNUFosIE0zMlJfSU5TTl9ESVYKLSAsIE0zMlJfSU5TTl9ESVZVLCBNMzJSX0lOU05fUkVNLCBNMzJSX0lOU05fUkVNVSwgTTMyUl9JTlNOX0RJVkgKLSAsIE0zMlJfSU5TTl9KQywgTTMyUl9JTlNOX0pOQywgTTMyUl9JTlNOX0pMLCBNMzJSX0lOU05fSk1QCi0gLCBNMzJSX0lOU05fTEQsIE0zMlJfSU5TTl9MRF9ELCBNMzJSX0lOU05fTERCLCBNMzJSX0lOU05fTERCX0QKLSAsIE0zMlJfSU5TTl9MREgsIE0zMlJfSU5TTl9MREhfRCwgTTMyUl9JTlNOX0xEVUIsIE0zMlJfSU5TTl9MRFVCX0QKLSAsIE0zMlJfSU5TTl9MRFVILCBNMzJSX0lOU05fTERVSF9ELCBNMzJSX0lOU05fTERfUExVUywgTTMyUl9JTlNOX0xEMjQKLSAsIE0zMlJfSU5TTl9MREk4LCBNMzJSX0lOU05fTERJMTYsIE0zMlJfSU5TTl9MT0NLLCBNMzJSX0lOU05fTUFDSEkKLSAsIE0zMlJfSU5TTl9NQUNISV9BLCBNMzJSX0lOU05fTUFDTE8sIE0zMlJfSU5TTl9NQUNMT19BLCBNMzJSX0lOU05fTUFDV0hJCi0gLCBNMzJSX0lOU05fTUFDV0hJX0EsIE0zMlJfSU5TTl9NQUNXTE8sIE0zMlJfSU5TTl9NQUNXTE9fQSwgTTMyUl9JTlNOX01VTAotICwgTTMyUl9JTlNOX01VTEhJLCBNMzJSX0lOU05fTVVMSElfQSwgTTMyUl9JTlNOX01VTExPLCBNMzJSX0lOU05fTVVMTE9fQQotICwgTTMyUl9JTlNOX01VTFdISSwgTTMyUl9JTlNOX01VTFdISV9BLCBNMzJSX0lOU05fTVVMV0xPLCBNMzJSX0lOU05fTVVMV0xPX0EKLSAsIE0zMlJfSU5TTl9NViwgTTMyUl9JTlNOX01WRkFDSEksIE0zMlJfSU5TTl9NVkZBQ0hJX0EsIE0zMlJfSU5TTl9NVkZBQ0xPCi0gLCBNMzJSX0lOU05fTVZGQUNMT19BLCBNMzJSX0lOU05fTVZGQUNNSSwgTTMyUl9JTlNOX01WRkFDTUlfQSwgTTMyUl9JTlNOX01WRkMKLSAsIE0zMlJfSU5TTl9NVlRBQ0hJLCBNMzJSX0lOU05fTVZUQUNISV9BLCBNMzJSX0lOU05fTVZUQUNMTywgTTMyUl9JTlNOX01WVEFDTE9fQQotICwgTTMyUl9JTlNOX01WVEMsIE0zMlJfSU5TTl9ORUcsIE0zMlJfSU5TTl9OT1AsIE0zMlJfSU5TTl9OT1QKLSAsIE0zMlJfSU5TTl9SQUMsIE0zMlJfSU5TTl9SQUNfRFNJLCBNMzJSX0lOU05fUkFDSCwgTTMyUl9JTlNOX1JBQ0hfRFNJCi0gLCBNMzJSX0lOU05fUlRFLCBNMzJSX0lOU05fU0VUSCwgTTMyUl9JTlNOX1NMTCwgTTMyUl9JTlNOX1NMTDMKLSAsIE0zMlJfSU5TTl9TTExJLCBNMzJSX0lOU05fU1JBLCBNMzJSX0lOU05fU1JBMywgTTMyUl9JTlNOX1NSQUkKLSAsIE0zMlJfSU5TTl9TUkwsIE0zMlJfSU5TTl9TUkwzLCBNMzJSX0lOU05fU1JMSSwgTTMyUl9JTlNOX1NUCi0gLCBNMzJSX0lOU05fU1RfRCwgTTMyUl9JTlNOX1NUQiwgTTMyUl9JTlNOX1NUQl9ELCBNMzJSX0lOU05fU1RICi0gLCBNMzJSX0lOU05fU1RIX0QsIE0zMlJfSU5TTl9TVF9QTFVTLCBNMzJSX0lOU05fU1RfTUlOVVMsIE0zMlJfSU5TTl9TVUIKLSAsIE0zMlJfSU5TTl9TVUJWLCBNMzJSX0lOU05fU1VCWCwgTTMyUl9JTlNOX1RSQVAsIE0zMlJfSU5TTl9VTkxPQ0sKLSAsIE0zMlJfSU5TTl9TQVRCLCBNMzJSX0lOU05fU0FUSCwgTTMyUl9JTlNOX1NBVCwgTTMyUl9JTlNOX1BDTVBCWgotICwgTTMyUl9JTlNOX1NBREQsIE0zMlJfSU5TTl9NQUNXVTEsIE0zMlJfSU5TTl9NU0JMTywgTTMyUl9JTlNOX01VTFdVMQotICwgTTMyUl9JTlNOX01BQ0xIMSwgTTMyUl9JTlNOX1NDLCBNMzJSX0lOU05fU05DLCBNMzJSX0lOU05fTUFYCi19IENHRU5fSU5TTl9UWVBFOwotCi0vKiBJbmRleCBvZiBgaW52YWxpZCcgaW5zbiBwbGFjZSBob2xkZXIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRCBNMzJSX0lOU05fSU5WQUxJRAotCi0vKiBUb3RhbCBudW1iZXIgb2YgaW5zbnMgaW4gdGFibGUuICAqLwotI2RlZmluZSBNQVhfSU5TTlMgKChpbnQpIE0zMlJfSU5TTl9NQVgpCi0KLS8qIFRoaXMgc3RydWN0IHJlY29yZHMgZGF0YSBwcmlvciB0byBpbnNlcnRpb24gb3IgYWZ0ZXIgZXh0cmFjdGlvbi4gICovCi1zdHJ1Y3QgY2dlbl9maWVsZHMKLXsKLSAgaW50IGxlbmd0aDsKLSAgbG9uZyBmX25pbDsKLSAgbG9uZyBmX29wMTsKLSAgbG9uZyBmX29wMjsKLSAgbG9uZyBmX2NvbmQ7Ci0gIGxvbmcgZl9yMTsKLSAgbG9uZyBmX3IyOwotICBsb25nIGZfc2ltbTg7Ci0gIGxvbmcgZl9zaW1tMTY7Ci0gIGxvbmcgZl9zaGlmdF9vcDI7Ci0gIGxvbmcgZl91aW1tNDsKLSAgbG9uZyBmX3VpbW01OwotICBsb25nIGZfdWltbTE2OwotICBsb25nIGZfdWltbTI0OwotICBsb25nIGZfaGkxNjsKLSAgbG9uZyBmX2Rpc3A4OwotICBsb25nIGZfZGlzcDE2OwotICBsb25nIGZfZGlzcDI0OwotICBsb25nIGZfb3AyMzsKLSAgbG9uZyBmX29wMzsKLSAgbG9uZyBmX2FjYzsKLSAgbG9uZyBmX2FjY3M7Ci0gIGxvbmcgZl9hY2NkOwotICBsb25nIGZfYml0czY3OwotICBsb25nIGZfYml0MTQ7Ci0gIGxvbmcgZl9pbW0xOwotfTsKLQotI2RlZmluZSBDR0VOX0lOSVRfUEFSU0Uob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9JTlNFUlQob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9FWFRSQUNUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfUFJJTlQob2QpIFwKLXtcCi19Ci0KLQotI2VuZGlmIC8qIE0zMlJfT1BDX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGluc3QuYyBiL29wY29kZXMvbTMyci1vcGluc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5NjUxZi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItb3BpbnN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzMgKzAsMCBAQAotLyogU2VtYW50aWMgb3BlcmFuZCBpbnN0YW5jZXMgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0KLS8qIE9wZXJhbmQgcmVmZXJlbmNlcy4gICovCi0KLSNkZWZpbmUgSU5QVVQgQ0dFTl9PUElOU1RfSU5QVVQKLSNkZWZpbmUgT1VUUFVUIENHRU5fT1BJTlNUX09VVFBVVAotI2RlZmluZSBFTkQgQ0dFTl9PUElOU1RfRU5ECi0jZGVmaW5lIENPTkRfUkVGIENHRU5fT1BJTlNUX0NPTkRfUkVGCi0jZGVmaW5lIE9QX0VOVChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfZW1wdHlfb3BzW10gPSB7Ci0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2FkZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2FkZDNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYW5kM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTE2IiwgSFdfSF9VSU5ULCBDR0VOX01PREVfVUlOVCwgT1BfRU5UIChVSU1NMTYpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X29yM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IElOUFVULCAidWxvMTYiLCBIV19IX1VMTzE2LCBDR0VOX01PREVfVUlOVCwgT1BfRU5UIChVTE8xNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic2ltbTgiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTgpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2FkZHZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9hZGR2M19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW0xNiIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTSU1NMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkeF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmM4X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwOCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDgpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmMyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZGlzcDI0IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMjQpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmVxX29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDE2IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMTYpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmVxel9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AxNiIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDE2KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2JsOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2JsMjRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2JjbDhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iY2wyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZGlzcDI0IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMjQpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYnJhOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYnJhMjRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfY21wX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9jbXBpX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfY21wel9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfZGl2X29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9qY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfamxfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2ptcF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9sZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9sZF9kX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfYWRkX19ERkxUX3NyX3NsbzE2IiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xkX3BsdXNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbGQyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInVpbW0yNCIsIEhXX0hfQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChVSU1NMjQpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xkaThfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzaW1tOCIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTSU1NOCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbGRpMTZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xvY2tfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tYWNoaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbWFjaGlfYV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjYyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjYyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdWxoaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdWxoaV9hX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjYyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdmZhY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbXZmYWNoaV9hX29wc1tdID0gewotICB7IElOUFVULCAiYWNjcyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDUyksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbXZmY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNjciIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU0NSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdnRhY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdnRhY2hpX2Ffb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2NzIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0NTKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3MiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCBPUF9FTlQgKEFDQ1MpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212dGNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkY3IiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERDUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbm9wX29wc1tdID0gewotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9yYWNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3JhY19kc2lfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2NzIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0NTKSwgMCwgMCB9LAotICB7IElOUFVULCAiaW1tMSIsIEhXX0hfVUlOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChJTU0xKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY2QiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCBPUF9FTlQgKEFDQ0QpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3J0ZV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfMTQiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCAxNCwgMCB9LAotICB7IElOUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBPVVRQVVQsICJoX3BzdyIsIEhXX0hfUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NldGhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoaTE2IiwgSFdfSF9ISTE2LCBDR0VOX01PREVfU0ksIE9QX0VOVCAoSEkxNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc2xsM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW0xNiIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zbGxpX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1aW1tNSIsIEhXX0hfVUlOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChVSU1NNSksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3N0X2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19ERkxUX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3N0Yl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfUUksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RiX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1FJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19ERkxUX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1FJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3N0aF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfSEksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RoX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX0hJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19ERkxUX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX0hJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3N0X3BsdXNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfbmV3X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF90cmFwX29wc1tdID0gewotICB7IElOUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJoX2NyXzYiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCA2LCAwIH0sCi0gIHsgSU5QVVQsICJoX3BzdyIsIEhXX0hfUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInVpbW00IiwgSFdfSF9VSU5ULCBDR0VOX01PREVfVUlOVCwgT1BfRU5UIChVSU1NNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2JicHN3IiwgSFdfSF9CQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfY3JfMTQiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCAxNCwgMCB9LAotICB7IE9VVFBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBPVVRQVVQsICJoX3BzdyIsIEhXX0hfUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfdW5sb2NrX29wc1tdID0gewotICB7IElOUFVULCAiaF9sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBPVVRQVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zYXRiX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NhdF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zYWRkX29wc1tdID0gewotICB7IElOUFVULCAiaF9hY2N1bXNfMCIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfYWNjdW1zXzEiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCAwLCAxLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9hY2N1bXNfMCIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbWFjd3UxX29wc1tdID0gewotICB7IElOUFVULCAiaF9hY2N1bXNfMSIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDEsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2FjY3Vtc18xIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMSwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdWx3dTFfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9hY2N1bXNfMSIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDEsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc2Nfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotI3VuZGVmIElOUFVUCi0jdW5kZWYgT1VUUFVUCi0jdW5kZWYgRU5ECi0jdW5kZWYgQ09ORF9SRUYKLSN1bmRlZiBPUF9FTlQKLQotLyogT3BlcmFuZCBpbnN0YW5jZSBsb29rdXAgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgKm0zMnJfY2dlbl9vcGluc3RfdGFibGVbTUFYX0lOU05TXSA9IHsKLSAgMCwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9hZGQzX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9hbmQzX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9vcjNfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X2FuZDNfb3BzWzBdLAotICAmIHNmbXRfYWRkaV9vcHNbMF0sCi0gICYgc2ZtdF9hZGR2X29wc1swXSwKLSAgJiBzZm10X2FkZHYzX29wc1swXSwKLSAgJiBzZm10X2FkZHhfb3BzWzBdLAotICAmIHNmbXRfYmM4X29wc1swXSwKLSAgJiBzZm10X2JjMjRfb3BzWzBdLAotICAmIHNmbXRfYmVxX29wc1swXSwKLSAgJiBzZm10X2JlcXpfb3BzWzBdLAotICAmIHNmbXRfYmVxel9vcHNbMF0sCi0gICYgc2ZtdF9iZXF6X29wc1swXSwKLSAgJiBzZm10X2JlcXpfb3BzWzBdLAotICAmIHNmbXRfYmVxel9vcHNbMF0sCi0gICYgc2ZtdF9iZXF6X29wc1swXSwKLSAgJiBzZm10X2JsOF9vcHNbMF0sCi0gICYgc2ZtdF9ibDI0X29wc1swXSwKLSAgJiBzZm10X2JjbDhfb3BzWzBdLAotICAmIHNmbXRfYmNsMjRfb3BzWzBdLAotICAmIHNmbXRfYmM4X29wc1swXSwKLSAgJiBzZm10X2JjMjRfb3BzWzBdLAotICAmIHNmbXRfYmVxX29wc1swXSwKLSAgJiBzZm10X2JyYThfb3BzWzBdLAotICAmIHNmbXRfYnJhMjRfb3BzWzBdLAotICAmIHNmbXRfYmNsOF9vcHNbMF0sCi0gICYgc2ZtdF9iY2wyNF9vcHNbMF0sCi0gICYgc2ZtdF9jbXBfb3BzWzBdLAotICAmIHNmbXRfY21waV9vcHNbMF0sCi0gICYgc2ZtdF9jbXBfb3BzWzBdLAotICAmIHNmbXRfY21waV9vcHNbMF0sCi0gICYgc2ZtdF9jbXBfb3BzWzBdLAotICAmIHNmbXRfY21wel9vcHNbMF0sCi0gICYgc2ZtdF9kaXZfb3BzWzBdLAotICAmIHNmbXRfZGl2X29wc1swXSwKLSAgJiBzZm10X2Rpdl9vcHNbMF0sCi0gICYgc2ZtdF9kaXZfb3BzWzBdLAotICAmIHNmbXRfZGl2X29wc1swXSwKLSAgJiBzZm10X2pjX29wc1swXSwKLSAgJiBzZm10X2pjX29wc1swXSwKLSAgJiBzZm10X2psX29wc1swXSwKLSAgJiBzZm10X2ptcF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9kX29wc1swXSwKLSAgJiBzZm10X2xkX29wc1swXSwKLSAgJiBzZm10X2xkX2Rfb3BzWzBdLAotICAmIHNmbXRfbGRfb3BzWzBdLAotICAmIHNmbXRfbGRfZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9kX29wc1swXSwKLSAgJiBzZm10X2xkX29wc1swXSwKLSAgJiBzZm10X2xkX2Rfb3BzWzBdLAotICAmIHNmbXRfbGRfcGx1c19vcHNbMF0sCi0gICYgc2ZtdF9sZDI0X29wc1swXSwKLSAgJiBzZm10X2xkaThfb3BzWzBdLAotICAmIHNmbXRfbGRpMTZfb3BzWzBdLAotICAmIHNmbXRfbG9ja19vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X21hY2hpX29wc1swXSwKLSAgJiBzZm10X21hY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbWFjaGlfb3BzWzBdLAotICAmIHNmbXRfbWFjaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9hX29wc1swXSwKLSAgJiBzZm10X211bGhpX29wc1swXSwKLSAgJiBzZm10X211bGhpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXVsaGlfb3BzWzBdLAotICAmIHNmbXRfbXVsaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9hX29wc1swXSwKLSAgJiBzZm10X212X29wc1swXSwKLSAgJiBzZm10X212ZmFjaGlfb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X212ZmFjaGlfb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X212ZmFjaGlfb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X212ZmNfb3BzWzBdLAotICAmIHNmbXRfbXZ0YWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdnRhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZ0YWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdnRhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZ0Y19vcHNbMF0sCi0gICYgc2ZtdF9tdl9vcHNbMF0sCi0gICYgc2ZtdF9ub3Bfb3BzWzBdLAotICAmIHNmbXRfbXZfb3BzWzBdLAotICAmIHNmbXRfcmFjX29wc1swXSwKLSAgJiBzZm10X3JhY19kc2lfb3BzWzBdLAotICAmIHNmbXRfcmFjX29wc1swXSwKLSAgJiBzZm10X3JhY19kc2lfb3BzWzBdLAotICAmIHNmbXRfcnRlX29wc1swXSwKLSAgJiBzZm10X3NldGhfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X3NsbDNfb3BzWzBdLAotICAmIHNmbXRfc2xsaV9vcHNbMF0sCi0gICYgc2ZtdF9hZGRfb3BzWzBdLAotICAmIHNmbXRfc2xsM19vcHNbMF0sCi0gICYgc2ZtdF9zbGxpX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9zbGwzX29wc1swXSwKLSAgJiBzZm10X3NsbGlfb3BzWzBdLAotICAmIHNmbXRfc3Rfb3BzWzBdLAotICAmIHNmbXRfc3RfZF9vcHNbMF0sCi0gICYgc2ZtdF9zdGJfb3BzWzBdLAotICAmIHNmbXRfc3RiX2Rfb3BzWzBdLAotICAmIHNmbXRfc3RoX29wc1swXSwKLSAgJiBzZm10X3N0aF9kX29wc1swXSwKLSAgJiBzZm10X3N0X3BsdXNfb3BzWzBdLAotICAmIHNmbXRfc3RfcGx1c19vcHNbMF0sCi0gICYgc2ZtdF9hZGRfb3BzWzBdLAotICAmIHNmbXRfYWRkdl9vcHNbMF0sCi0gICYgc2ZtdF9hZGR4X29wc1swXSwKLSAgJiBzZm10X3RyYXBfb3BzWzBdLAotICAmIHNmbXRfdW5sb2NrX29wc1swXSwKLSAgJiBzZm10X3NhdGJfb3BzWzBdLAotICAmIHNmbXRfc2F0Yl9vcHNbMF0sCi0gICYgc2ZtdF9zYXRfb3BzWzBdLAotICAmIHNmbXRfY21wel9vcHNbMF0sCi0gICYgc2ZtdF9zYWRkX29wc1swXSwKLSAgJiBzZm10X21hY3d1MV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdWx3dTFfb3BzWzBdLAotICAmIHNmbXRfbWFjd3UxX29wc1swXSwKLSAgJiBzZm10X3NjX29wc1swXSwKLSAgJiBzZm10X3NjX29wc1swXSwKLX07Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfb3BpbnN0X3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fT1BJTlNUICoqb2kgPSAmIG0zMnJfY2dlbl9vcGluc3RfdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllczsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQotICAgIGluc25zW2ldLm9waW5zdCA9IG9pW2ldOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tNjhrLWRpcy5jIGIvb3Bjb2Rlcy9tNjhrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2QzYTgyMS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL202OGstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA4ICswLDAgQEAKLS8qIFByaW50IE1vdG9yb2xhIDY4ayBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgMTk4NiwgODcsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCi0jaW5jbHVkZSA8bGliaWJlcnR5Lmg+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+cHJpbnRfYWRkcmVzc19mdW5jKSAodXZhbCwgaW5mbyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAnQyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlY2NyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXNyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXVzcCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdFJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVhY2MiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlbWFjc3IiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlbWFzayIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdKJzoKLSAgICAgIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHsgY2hhciAqbmFtZTsgaW50IHZhbHVlOyB9IG5hbWVzW10KLQkgID0ge3siJXNmYyIsIDB4MDAwfSwgeyIlZGZjIiwgMHgwMDF9LCB7IiVjYWNyIiwgMHgwMDJ9LAotCSAgICAgeyIldGMiLCAgMHgwMDN9LCB7IiVpdHQwIiwweDAwNH0sIHsiJWl0dDEiLCAweDAwNX0sCi0gICAgICAgICAgICAgeyIlZHR0MCIsMHgwMDZ9LCB7IiVkdHQxIiwweDAwN30sIHsiJWJ1c2NyIiwweDAwOH0sCi0JICAgICB7IiV1c3AiLCAweDgwMH0sIHsiJXZiciIsIDB4ODAxfSwgeyIlY2FhciIsIDB4ODAyfSwKLQkgICAgIHsiJW1zcCIsIDB4ODAzfSwgeyIlaXNwIiwgMHg4MDR9LAotCi0JICAgICAvKiBTaG91bGQgd2UgYmUgY2FsbGluZyB0aGlzIHBzciBsaWtlIHdlIGRvIGluIGNhc2UgJ1knPyAgKi8KLQkgICAgIHsiJW1tdXNyIiwweDgwNX0sCi0KLSAgICAgICAgICAgICB7IiV1cnAiLCAweDgwNn0sIHsiJXNycCIsIDB4ODA3fSwgeyIlcGNyIiwgMHg4MDh9fTsKLQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMTIsIGluZm8pOwotCWZvciAocmVnbm8gPSBzaXplb2YgbmFtZXMgLyBzaXplb2YgbmFtZXNbMF0gLSAxOyByZWdubyA+PSAwOyByZWduby0tKQotCSAgaWYgKG5hbWVzW3JlZ25vXS52YWx1ZSA9PSB2YWwpCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZXNbcmVnbm9dLm5hbWUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JaWYgKHJlZ25vIDwgMCkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWwpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdRJzoKLSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyk7Ci0gICAgICAvKiAwIG1lYW5zIDgsIGV4Y2VwdCBmb3IgdGhlIGJrcHQgaW5zdHJ1Y3Rpb24uLi4gKi8KLSAgICAgIGlmICh2YWwgPT0gMCAmJiBkWzFdICE9ICdzJykKLQl2YWwgPSA4OwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIGlmIChwbGFjZSA9PSAnaCcpCi0JewotCSAgc3RhdGljIGNoYXIgKmNvbnN0IHNjYWxlZmFjdG9yX25hbWVbXSA9IHsgIjw8IiwgIj4+IiB9OwotCSAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAxLCBpbmZvKTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzY2FsZWZhY3Rvcl9uYW1lW3ZhbF0pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDgsIGluZm8pOwotCSAgaWYgKHZhbCAmIDB4ODApCi0JICAgIHZhbCA9IHZhbCAtIDB4MTAwOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoKLSAgICAgICgqaW5mby0+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+IiksIGZjKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUldmFsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgICAgewotCWludCBsZXZlbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyk7Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGxldmVsKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndSc6Ci0gICAgICB7Ci0Jc2hvcnQgaXNfdXBwZXIgPSAwOwotCWludCByZWcgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDUsIGluZm8pOwotCQotCWlmIChyZWcgJiAweDEwKQotCSAgewotCSAgICBpc191cHBlciA9IDE7Ci0JICAgIHJlZyAmPSAweGY7Ci0JICB9Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyVzIiwKLQkJCSAgICAgICByZWdfbmFtZXNbcmVnXSwKLQkJCSAgICAgICBpc191cHBlciA/ICJ1IiA6ICJsIik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQkKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIC0yOwotICAgIH0KLQotICByZXR1cm4gcCAtIHAwOwotfQotCi0vKiBGZXRjaCBCSVRTIGJpdHMgZnJvbSBhIHBvc2l0aW9uIGluIHRoZSBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgYnkgQ09ERS4KLSAgIENPREUgaXMgYSAicGxhY2UgdG8gcHV0IGFuIGFyZ3VtZW50Iiwgb3IgJ3gnIGZvciBhIGRlc3RpbmF0aW9uCi0gICB0aGF0IGlzIGEgZ2VuZXJhbCBhZGRyZXNzIChtb2RlIGFuZCByZWdpc3RlcikuCi0gICBCVUZGRVIgY29udGFpbnMgdGhlIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotZmV0Y2hfYXJnIChidWZmZXIsIGNvZGUsIGJpdHMsIGluZm8pCi0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IGNvZGU7Ci0gICAgIGludCBiaXRzOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciBpbnQgdmFsID0gMDsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlICdzJzoKLSAgICAgIHZhbCA9IGJ1ZmZlclsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6CQkJLyogRGVzdGluYXRpb24sIGZvciByZWdpc3RlciBvciBxdWljay4gICovCi0gICAgICB2YWwgPSAoYnVmZmVyWzBdIDw8IDgpICsgYnVmZmVyWzFdOwotICAgICAgdmFsID4+PSA5OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoJCQkvKiBEZXN0aW5hdGlvbiwgZm9yIGdlbmVyYWwgYXJnICovCi0gICAgICB2YWwgPSAoYnVmZmVyWzBdIDw8IDgpICsgYnVmZmVyWzFdOwotICAgICAgdmFsID4+PSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclszXSA+PiA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IGJ1ZmZlclszXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMSc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcyJzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIHZhbCA+Pj0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnaic6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzQnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgNSk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzRdIDw8IDgpICsgYnVmZmVyWzVdOwotICAgICAgdmFsID4+PSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnNSc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyA1KTsKLSAgICAgIHZhbCA9IChidWZmZXJbNF0gPDwgOCkgKyBidWZmZXJbNV07Ci0gICAgICB2YWwgPj49IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzYnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgNSk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzRdIDw8IDgpICsgYnVmZmVyWzVdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc3JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIHZhbCA+Pj0gNzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSAnOCc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc5JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIHZhbCA+Pj0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZSc6Ci0gICAgICB2YWwgPSAoYnVmZmVyWzFdID4+IDYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdtJzogCi0gICAgICB2YWwgPSAoYnVmZmVyWzFdICYgMHg0MCA/IDB4OCA6IDApCi0JfCAoKGJ1ZmZlclswXSA+PiAxKSAmIDB4NykKLQl8IChidWZmZXJbM10gJiAweDgwID8gMHgxMCA6IDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICduJzogCi0gICAgICB2YWwgPSAoYnVmZmVyWzFdICYgMHg0MCA/IDB4OCA6IDApIHwgKChidWZmZXJbMF0gPj4gMSkgJiAweDcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdvJzoKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPj4gNCkgfCAoYnVmZmVyWzNdICYgMHg4MCA/IDB4MTAgOiAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgICB2YWwgPSBidWZmZXJbMV0gfCAoYnVmZmVyWzNdICYgMHg0MCA/IDB4MTAgOiAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTic6Ci0gICAgICB2YWwgPSBidWZmZXJbM10gfCAoYnVmZmVyWzNdICYgMHg0MCA/IDB4MTAgOiAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6Ci0gICAgICB2YWwgPSBidWZmZXJbMl0gPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBzd2l0Y2ggKGJpdHMpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiB2YWwgJiAxOwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiB2YWwgJiAzOwotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiB2YWwgJiA3OwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiB2YWwgJiAwMTc7Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIHZhbCAmIDAzNzsKLSAgICBjYXNlIDY6Ci0gICAgICByZXR1cm4gdmFsICYgMDc3OwotICAgIGNhc2UgNzoKLSAgICAgIHJldHVybiB2YWwgJiAwMTc3OwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiB2YWwgJiAwMzc3OwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdmFsICYgMDc3Nzc7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogUHJpbnQgYW4gaW5kZXhlZCBhcmd1bWVudC4gIFRoZSBiYXNlIHJlZ2lzdGVyIGlzIEJBU0VSRUcgKC0xIGZvciBwYykuCi0gICBQIHBvaW50cyB0byBleHRlbnNpb24gd29yZCwgaW4gYnVmZmVyLgotICAgQUREUiBpcyB0aGUgbm9taW5hbCBjb3JlIGFkZHJlc3Mgb2YgdGhhdCBleHRlbnNpb24gd29yZC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXByaW50X2luZGV4ZWQgKGJhc2VyZWcsIHAsIGFkZHIsIGluZm8pCi0gICAgIGludCBiYXNlcmVnOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGludCB3b3JkOwotICBzdGF0aWMgY2hhciAqY29uc3Qgc2NhbGVzW10gPSB7IiIsICI6MiIsICI6NCIsICI6OCJ9OwotICBiZmRfdm1hIGJhc2VfZGlzcDsKLSAgYmZkX3ZtYSBvdXRlcl9kaXNwOwotICBjaGFyIGJ1Zls0MF07Ci0gIGNoYXIgdm1hYnVmWzUwXTsKLQotICB3b3JkID0gTkVYVFdPUkQgKHApOwotCi0gIC8qIEdlbmVyYXRlIHRoZSB0ZXh0IGZvciB0aGUgaW5kZXggcmVnaXN0ZXIuCi0gICAgIFdoZXJlIHRoaXMgd2lsbCBiZSBvdXRwdXQgaXMgbm90IHlldCBkZXRlcm1pbmVkLiAgKi8KLSAgc3ByaW50ZiAoYnVmLCAiJXM6JWMlcyIsCi0JICAgcmVnX25hbWVzWyh3b3JkID4+IDEyKSAmIDB4Zl0sCi0JICAgKHdvcmQgJiAweDgwMCkgPyAnbCcgOiAndycsCi0JICAgc2NhbGVzWyh3b3JkID4+IDkpICYgM10pOwotCi0gIC8qIEhhbmRsZSB0aGUgNjgwMDAgc3R5bGUgb2YgaW5kZXhpbmcuICAqLwotCi0gIGlmICgod29yZCAmIDB4MTAwKSA9PSAwKQotICAgIHsKLSAgICAgIGJhc2VfZGlzcCA9IHdvcmQgJiAweGZmOwotICAgICAgaWYgKChiYXNlX2Rpc3AgJiAweDgwKSAhPSAwKQotCWJhc2VfZGlzcCAtPSAweDEwMDsKLSAgICAgIGlmIChiYXNlcmVnID09IC0xKQotCWJhc2VfZGlzcCArPSBhZGRyOwotICAgICAgcHJpbnRfYmFzZSAoYmFzZXJlZywgYmFzZV9kaXNwLCBpbmZvKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzKSIsIGJ1Zik7Ci0gICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBnZW5lcmFsaXplZCBraW5kLiAgKi8KLSAgLyogRmlyc3QsIGNvbXB1dGUgdGhlIGRpc3BsYWNlbWVudCB0byBhZGQgdG8gdGhlIGJhc2UgcmVnaXN0ZXIuICAqLwotCi0gIGlmICh3b3JkICYgMDIwMCkKLSAgICB7Ci0gICAgICBpZiAoYmFzZXJlZyA9PSAtMSkKLQliYXNlcmVnID0gLTM7Ci0gICAgICBlbHNlCi0JYmFzZXJlZyA9IC0yOwotICAgIH0KLSAgaWYgKHdvcmQgJiAwMTAwKQotICAgIGJ1ZlswXSA9ICdcMCc7Ci0gIGJhc2VfZGlzcCA9IDA7Ci0gIHN3aXRjaCAoKHdvcmQgPj4gNCkgJiAzKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICBiYXNlX2Rpc3AgPSBORVhUV09SRCAocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBiYXNlX2Rpc3AgPSBORVhUTE9ORyAocCk7Ci0gICAgfQotICBpZiAoYmFzZXJlZyA9PSAtMSkKLSAgICBiYXNlX2Rpc3AgKz0gYWRkcjsKLQotICAvKiBIYW5kbGUgc2luZ2xlLWxldmVsIGNhc2UgKG5vdCBpbmRpcmVjdCkgKi8KLQotICBpZiAoKHdvcmQgJiA3KSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50X2Jhc2UgKGJhc2VyZWcsIGJhc2VfZGlzcCwgaW5mbyk7Ci0gICAgICBpZiAoYnVmWzBdICE9ICdcMCcpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMiLCBidWYpOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0gICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgLyogVHdvIGxldmVsLiAgQ29tcHV0ZSBkaXNwbGFjZW1lbnQgdG8gYWRkIGFmdGVyIGluZGlyZWN0aW9uLiAgKi8KLQotICBvdXRlcl9kaXNwID0gMDsKLSAgc3dpdGNoICh3b3JkICYgMykKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgb3V0ZXJfZGlzcCA9IE5FWFRXT1JEIChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIG91dGVyX2Rpc3AgPSBORVhUTE9ORyAocCk7Ci0gICAgfQotCi0gIHByaW50X2Jhc2UgKGJhc2VyZWcsIGJhc2VfZGlzcCwgaW5mbyk7Ci0gIGlmICgod29yZCAmIDQpID09IDAgJiYgYnVmWzBdICE9ICdcMCcpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMiLCBidWYpOwotICAgICAgYnVmWzBdID0gJ1wwJzsKLSAgICB9Ci0gIHNwcmludGZfdm1hICh2bWFidWYsIG91dGVyX2Rpc3ApOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIilAKCVzIiwgdm1hYnVmKTsKLSAgaWYgKGJ1ZlswXSAhPSAnXDAnKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgYnVmKTsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIFByaW50IGEgYmFzZSByZWdpc3RlciBSRUdOTyBhbmQgZGlzcGxhY2VtZW50IERJU1AsIG9uIElORk8tPlNUUkVBTS4KLSAgIFJFR05PID0gLTEgZm9yIHBjLCAtMiBmb3Igbm9uZSAoc3VwcHJlc3NlZCkuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYmFzZSAocmVnbm8sIGRpc3AsIGluZm8pCi0gICAgIGludCByZWdubzsKLSAgICAgYmZkX3ZtYSBkaXNwOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAocmVnbm8gPT0gLTEpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXBjQCgiKTsKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoZGlzcCwgaW5mbyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbNTBdOwotCi0gICAgICBpZiAocmVnbm8gPT0gLTIpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCIpOwotICAgICAgZWxzZSBpZiAocmVnbm8gPT0gLTMpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXpwY0AoIik7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AoIiwgcmVnX25hbWVzW3JlZ25vXSk7Ci0KLSAgICAgIHNwcmludGZfdm1hIChidWYsIGRpc3ApOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGJ1Zik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tNjhrLW9wYy5jIGIvb3Bjb2Rlcy9tNjhrLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdhZDdjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTY4ay1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxODcgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciBtNjgwWzAxMjM0Nl0wL202ODg4WzEyXS9tNjg4NTEvbWNmNTIwMC4KLSAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tNjhrLmgiCi0KLSNkZWZpbmUgb25lKHgpICgodW5zaWduZWQgaW50KSAoeCkgPDwgMTYpCi0jZGVmaW5lIHR3byh4LCB5KSAoKCh1bnNpZ25lZCBpbnQpICh4KSA8PCAxNikgKyAoeSkpCi0KLS8qIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QKLSAgIGJlIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0Ci0gICBydW50aW1lLiAgKi8KLQotY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlIG02OGtfb3Bjb2Rlc1tdID0KLXsKLXsiYWJjZCIsCW9uZSgwMTQwNDAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17ImFiY2QiLAlvbmUoMDE0MDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAotCi17ImFkZGF3IiwJb25lKDAxNTAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLXsiYWRkYWwiLAlvbmUoMDE1MDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImFkZGliIiwJb25lKDAwMDMwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkaXciLAlvbmUoMDAwMzEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhZGRpbCIsCW9uZSgwMDAzMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImFkZGlsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi0KLXsiYWRkcWIiLAlvbmUoMDA1MDAwMCksCW9uZSgwMTcwNzAwKSwgIlFkJGIiLCBtNjgwMDB1cCB9LAoteyJhZGRxdyIsCW9uZSgwMDUwMTAwKSwJb25lKDAxNzA3MDApLCAiUWQldyIsIG02ODAwMHVwIH0sCi17ImFkZHFsIiwJb25lKDAwNTAyMDApLAlvbmUoMDE3MDcwMCksICJRZCVsIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQotLyogVGhlIGFkZCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBhZGRhLCBhZGRpLCBhbmQgYWRkcSBpbnN0cnVjdGlvbnMuICAqLwoteyJhZGRiIiwJb25lKDAwNTAwMDApLAlvbmUoMDE3MDcwMCksICJRZCRiIiwgbTY4MDAwdXAgfSwKLXsiYWRkYiIsCW9uZSgwMDAzMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImFkZGIiLAlvbmUoMDE1MDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoteyJhZGRiIiwJb25lKDAxNTA0MDApLAlvbmUoMDE3MDcwMCksICJEZH5iIiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMDUwMTAwKSwJb25lKDAxNzA3MDApLCAiUWQldyIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDE1MDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAwMDMxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMTUwMTAwKSwJb25lKDAxNzA3MDApLCAiKndEZCIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDE1MDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnciLCBtNjgwMDB1cCB9LAoteyJhZGRsIiwJb25lKDAwNTAyMDApLAlvbmUoMDE3MDcwMCksICJRZCVsIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYWRkbCIsCW9uZSgwMDAzMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImFkZGwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiYWRkbCIsCW9uZSgwMTUwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFkZGwiLAlvbmUoMDE1MDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhZGRsIiwJb25lKDAxNTA2MDApLAlvbmUoMDE3MDcwMCksICJEZH5sIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJhZGR4YiIsCW9uZSgwMTUwNDAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17ImFkZHhiIiwJb25lKDAxNTA0MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLXsiYWRkeHciLAlvbmUoMDE1MDUwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJhZGR4dyIsCW9uZSgwMTUwNTEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi17ImFkZHhsIiwJb25lKDAxNTA2MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYWRkeGwiLAlvbmUoMDE1MDYxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAotCi17ImFuZGliIiwJb25lKDAwMDEwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaWIiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJhbmRpdyIsCW9uZSgwMDAxMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFuZGl3IiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaWwiLAlvbmUoMDAwMTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJhbmRpIiwJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaSIsCW9uZSgwMDAxMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImFuZGkiLAlvbmUoMDAwMTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAotCi0vKiBUaGUgYW5kIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIGFuZGkgaW5zdHJ1Y3Rpb24uICAqLwoteyJhbmRiIiwJb25lKDAwMDEwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kYiIsCW9uZSgwMDAxMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImFuZGIiLAlvbmUoMDE0MDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoteyJhbmRiIiwJb25lKDAxNDA0MDApLAlvbmUoMDE3MDcwMCksICJEZH5iIiwgbTY4MDAwdXAgfSwKLXsiYW5kdyIsCW9uZSgwMDAxMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFuZHciLAlvbmUoMDAwMTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAxNDAxMDApLAlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLXsiYW5kdyIsCW9uZSgwMTQwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+dyIsIG02ODAwMHVwIH0sCi17ImFuZGwiLAlvbmUoMDAwMTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRsIiwJb25lKDAwMDEyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImFuZGwiLAlvbmUoMDE0MDIwMCksCW9uZSgwMTcwNzAwKSwgIjtsRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhbmRsIiwJb25lKDAxNDA2MDApLAlvbmUoMDE3MDcwMCksICJEZH5sIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYW5kIiwJCW9uZSgwMDAxMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckdyIsIG02ODAwMHVwIH0sCi17ImFuZCIsCQlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJhbmQiLAkJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMTQwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImFuZCIsCQlvbmUoMDE0MDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnciLCBtNjgwMDB1cCB9LAotCi17ImFzbGIiLAlvbmUoMDE2MDQwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJhc2xiIiwJb25lKDAxNjA0NDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNsdyIsCW9uZSgwMTYwNTAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzbHciLAlvbmUoMDE2MDU0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc2x3IiwJb25lKDAxNjA3MDApLAlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsiYXNsbCIsCW9uZSgwMTYwNjAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFzbGwiLAlvbmUoMDE2MDY0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImFzcmIiLAlvbmUoMDE2MDAwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJhc3JiIiwJb25lKDAxNjAwNDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNydyIsCW9uZSgwMTYwMTAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzcnciLAlvbmUoMDE2MDE0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc3J3IiwJb25lKDAxNjAzMDApLAlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsiYXNybCIsCW9uZSgwMTYwMjAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFzcmwiLAlvbmUoMDE2MDI0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJoaXciLAlvbmUoMDA2MTAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmxzdyIsCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY2N3IiwJb25lKDAwNjIwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjc3ciLAlvbmUoMDA2MjQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYm5ldyIsCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZXF3IiwJb25lKDAwNjM0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJ2Y3ciLAlvbmUoMDA2NDAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnZzdyIsCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJicGx3IiwJb25lKDAwNjUwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJtaXciLAlvbmUoMDA2NTQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmdldyIsCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibHR3IiwJb25lKDAwNjY0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJndHciLAlvbmUoMDA2NzAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmxldyIsCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJoaWwiLAlvbmUoMDA2MTM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJibHNsIiwJb25lKDAwNjE3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmNjbCIsCW9uZSgwMDYyMzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJjc2wiLAlvbmUoMDA2Mjc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJibmVsIiwJb25lKDAwNjMzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmVxbCIsCW9uZSgwMDYzNzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJ2Y2wiLAlvbmUoMDA2NDM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJidnNsIiwJb25lKDAwNjQ3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnBsbCIsCW9uZSgwMDY1Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJtaWwiLAlvbmUoMDA2NTc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiZ2VsIiwJb25lKDAwNjYzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmx0bCIsCW9uZSgwMDY2Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJndGwiLAlvbmUoMDA2NzM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJibGVsIiwJb25lKDAwNjc3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLQoteyJiaGlzIiwJb25lKDAwNjEwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJsc3MiLAlvbmUoMDA2MTQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmNjcyIsCW9uZSgwMDYyMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY3NzIiwJb25lKDAwNjI0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJuZXMiLAlvbmUoMDA2MzAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmVxcyIsCW9uZSgwMDYzNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidmNzIiwJb25lKDAwNjQwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJ2c3MiLAlvbmUoMDA2NDQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnBscyIsCW9uZSgwMDY1MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibWlzIiwJb25lKDAwNjU0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJnZXMiLAlvbmUoMDA2NjAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmx0cyIsCW9uZSgwMDY2NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZ3RzIiwJb25lKDAwNjcwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJsZXMiLAlvbmUoMDA2NzQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJqaGkiLAkJb25lKDAwNjEwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpscyIsCQlvbmUoMDA2MTQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamNjIiwJCW9uZSgwMDYyMDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqY3MiLAkJb25lKDAwNjI0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpuZSIsCQlvbmUoMDA2MzAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamVxIiwJCW9uZSgwMDYzNDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqdmMiLAkJb25lKDAwNjQwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17Imp2cyIsCQlvbmUoMDA2NDQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsianBsIiwJCW9uZSgwMDY1MDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqbWkiLAkJb25lKDAwNjU0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpnZSIsCQlvbmUoMDA2NjAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamx0IiwJCW9uZSgwMDY2NDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqZ3QiLAkJb25lKDAwNjcwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpsZSIsCQlvbmUoMDA2NzQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJiY2hnIiwJb25lKDAwMDA1MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmNoZyIsCW9uZSgwMDA0MTAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImJjaGciLAlvbmUoMDAwNDEwMCksCW9uZSgwMTc3NzAwKSwgIiNicXMiLCBtY2YgfSwKLQoteyJiY2xyIiwJb25lKDAwMDA2MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfSwKLXsiYmNsciIsCW9uZSgwMDAwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR2cyIsIG1jZiB9LAoteyJiY2xyIiwJb25lKDAwMDQyMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYmNsciIsCW9uZSgwMDA0MjAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZiB9LAotCi17ImJmY2hnIiwJdHdvKDAxNjUzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3MDAwMCksCSI/c08yTzMiLCAgIG02ODAyMHVwIH0sCi17ImJmY2xyIiwJdHdvKDAxNjYzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3MDAwMCksCSI/c08yTzMiLCAgIG02ODAyMHVwIH0sCi17ImJmZXh0cyIsCXR3bygwMTY1NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoteyJiZmV4dHUiLAl0d28oMDE2NDcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIi9zTzJPM0QxIiwgbTY4MDIwdXAgfSwKLXsiYmZmZm8iLAl0d28oMDE2NjcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIi9zTzJPM0QxIiwgbTY4MDIwdXAgfSwKLXsiYmZpbnMiLAl0d28oMDE2NzcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIkQxP3NPMk8zIiwgbTY4MDIwdXAgfSwKLXsiYmZzZXQiLAl0d28oMDE2NzMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLXsiYmZ0c3QiLAl0d28oMDE2NDMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIi9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLQoteyJiZ25kIiwJb25lKDAwNDUzNzIpLAkJb25lKDAxNzc3NzcpLCAiIiwgY3B1MzIgfSwKLQoteyJia3B0IiwJb25lKDAwNDQxMTApLAkJb25lKDAxNzc3NzApLCAidHMiLCBtNjgwMTB1cCB9LAotCi17ImJyYXciLAlvbmUoMDA2MDAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnJhbCIsCW9uZSgwMDYwMzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJyYXMiLAlvbmUoMDA2MDAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJic2V0IiwJb25lKDAwMDA3MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfSwKLXsiYnNldCIsCW9uZSgwMDAwNzAwKSwJb25lKDAxNzA3MDApLCAiRGR2cyIsIG1jZiB9LAoteyJic2V0IiwJb25lKDAwMDQzMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYnNldCIsCW9uZSgwMDA0MzAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZiB9LAotCi17ImJzcnciLAlvbmUoMDA2MDQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnNybCIsCW9uZSgwMDYwNzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJzcnMiLAlvbmUoMDA2MDQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJidHN0IiwJb25lKDAwMDA0MDApLAlvbmUoMDE3MDcwMCksICJEZDtiIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnRzdCIsCW9uZSgwMDA0MDAwKSwJb25lKDAxNzc3MDApLCAiI2JAcyIsIG02ODAwMHVwIH0sCi17ImJ0c3QiLAlvbmUoMDAwNDAwMCksCW9uZSgwMTc3NzAwKSwgIiNicXMiLCBtY2YgfSwKLQoteyJjYWxsbSIsCW9uZSgwMDAzMzAwKSwJCW9uZSgwMTc3NzAwKSwgIiNiIXMiLCBtNjgwMjAgfSwKLQoteyJjYXMydyIsICAgICB0d28oMDAwNjM3NCwwKSwgdHdvKDAxNzc3NzcsMDAwNzA3MCksICJEM0Q2RDJENXIxcjQiLCBtNjgwMjB1cCB9LAoteyJjYXMydyIsICAgICB0d28oMDAwNjM3NCwwKSwgdHdvKDAxNzc3NzcsMDAwNzA3MCksICJEM0Q2RDJENVIxUjQiLCBtNjgwMjB1cCB9LAoteyJjYXMybCIsICAgICB0d28oMDAwNzM3NCwwKSwgdHdvKDAxNzc3NzcsMDAwNzA3MCksICJEM0Q2RDJENXIxcjQiLCBtNjgwMjB1cCB9LAoteyJjYXMybCIsICAgICB0d28oMDAwNzM3NCwwKSwgdHdvKDAxNzc3NzcsMDAwNzA3MCksICJEM0Q2RDJENVIxUjQiLCBtNjgwMjB1cCB9LAotCi17ImNhc2IiLAl0d28oMDAwNTMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTc3MDcwKSwJIkQzRDJ+cyIsIG02ODAyMHVwIH0sCi17ImNhc3ciLAl0d28oMDAwNjMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTc3MDcwKSwJIkQzRDJ+cyIsIG02ODAyMHVwIH0sCi17ImNhc2wiLAl0d28oMDAwNzMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTc3MDcwKSwJIkQzRDJ+cyIsIG02ODAyMHVwIH0sCi0KLXsiY2hrMmIiLCB0d28oMDAwMDMwMCwwMDA0MDAwKSwgdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiY2hrMnciLCB0d28oMDAwMTMwMCwwMDA0MDAwKSwJdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiY2hrMmwiLCB0d28oMDAwMjMwMCwwMDA0MDAwKSwJdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLQoteyJjaGtsIiwJb25lKDAwNDA0MDApLAkJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIH0sCi17ImNoa3ciLAlvbmUoMDA0MDYwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLQotI2RlZmluZSBTQ09QRV9MSU5FICgweDEgPDwgMykKLSNkZWZpbmUgU0NPUEVfUEFHRSAoMHgyIDw8IDMpCi0jZGVmaW5lIFNDT1BFX0FMTCAgKDB4MyA8PCAzKQotCi17ImNpbnZhIiwJb25lKDB4ZjQwMHxTQ09QRV9BTEwpLCAgb25lKDB4ZmYzOCksICJjZSIsICAgbTY4MDQwdXAgfSwKLXsiY2ludmwiLAlvbmUoMHhmNDAwfFNDT1BFX0xJTkUpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAoteyJjaW52cCIsCW9uZSgweGY0MDB8U0NPUEVfUEFHRSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCi0KLXsiY3B1c2hhIiwJb25lKDB4ZjQyMHxTQ09QRV9BTEwpLCAgb25lKDB4ZmYzOCksICJjZSIsICAgbTY4MDQwdXAgfSwKLXsiY3B1c2hsIiwJb25lKDB4ZjQyMHxTQ09QRV9MSU5FKSwgb25lKDB4ZmYzOCksICJjZWFzIiwgbTY4MDQwdXAgfSwKLXsiY3B1c2hsIiwJb25lKDB4MDRlOCksCQlvbmUoMHhmZmY4KSwgImFzIiwgICBtY2YgfSwKLXsiY3B1c2hwIiwJb25lKDB4ZjQyMHxTQ09QRV9QQUdFKSwgb25lKDB4ZmYzOCksICJjZWFzIiwgbTY4MDQwdXAgfSwKLQotI3VuZGVmIFNDT1BFX0xJTkUKLSN1bmRlZiBTQ09QRV9QQUdFCi0jdW5kZWYgU0NPUEVfQUxMCi0KLXsiY2xyYiIsCW9uZSgwMDQxMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJjbHJ3IiwJb25lKDAwNDExMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImNscmwiLAlvbmUoMDA0MTIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJjbXAyYiIsCXR3bygwMDAwMzAwLDApLCB0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjbXAydyIsCXR3bygwMDAxMzAwLDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjbXAybCIsCXR3bygwMDAyMzAwLDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImNtcGF3IiwJb25lKDAxMzAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLXsiY21wYWwiLAlvbmUoMDEzMDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImNtcGliIiwJb25lKDAwMDYwMDApLAlvbmUoMDE3NzcwMCksICIjYkBzIiwgbTY4MDAwdXAgfSwKLXsiY21waXciLAlvbmUoMDAwNjEwMCksCW9uZSgwMTc3NzAwKSwgIiN3QHMiLCBtNjgwMDB1cCB9LAoteyJjbXBpbCIsCW9uZSgwMDA2MjAwKSwJb25lKDAxNzc3MDApLCAiI2xAcyIsIG02ODAwMHVwIH0sCi17ImNtcGlsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi0KLXsiY21wbWIiLAlvbmUoMDEzMDQxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoteyJjbXBtdyIsCW9uZSgwMTMwNTEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcG1sIiwJb25lKDAxMzA2MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLQotLyogVGhlIGNtcCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBjbXBhLCBjbXBtLCBhbmQgY21waSBpbnN0cnVjdGlvbnMuICAqLwoteyJjbXBiIiwJb25lKDAwMDYwMDApLAlvbmUoMDE3NzcwMCksICIjYkBzIiwgbTY4MDAwdXAgfSwKLXsiY21wYiIsCW9uZSgwMTMwNDEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcGIiLAlvbmUoMDEzMDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoteyJjbXB3IiwJb25lKDAxMzAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLXsiY21wdyIsCW9uZSgwMDA2MTAwKSwJb25lKDAxNzc3MDApLCAiI3dAcyIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDEzMDUxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoteyJjbXB3IiwJb25lKDAxMzAxMDApLAlvbmUoMDE3MDcwMCksICIqd0RkIiwgbTY4MDAwdXAgfSwKLXsiY21wbCIsCW9uZSgwMTMwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImNtcGwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImNtcGwiLAlvbmUoMDEzMDYxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoteyJjbXBsIiwJb25lKDAxMzAyMDApLAlvbmUoMDE3MDcwMCksICIqbERkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJkYmNjIiwJb25lKDAwNTIzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJjcyIsCW9uZSgwMDUyNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiZXEiLAlvbmUoMDA1MzcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmYiLAkJb25lKDAwNTA3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJnZSIsCW9uZSgwMDU2MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiZ3QiLAlvbmUoMDA1NzMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmhpIiwJb25lKDAwNTEzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJsZSIsCW9uZSgwMDU3NzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibHMiLAlvbmUoMDA1MTcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmx0IiwJb25lKDAwNTY3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJtaSIsCW9uZSgwMDU1NzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibmUiLAlvbmUoMDA1MzMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYnBsIiwJb25lKDAwNTUzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJ0IiwJCW9uZSgwMDUwMzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRidmMiLAlvbmUoMDA1NDMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYnZzIiwJb25lKDAwNTQ3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLQoteyJkaXZzdyIsCW9uZSgwMTAwNzAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJkaXZzdyIsCW9uZSgwMTAwNzAwKSwgICBvbmUoMDE3MDcwMCksICJ2c0RkIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsiZGl2c2wiLCB0d28oMDA0NjEwMCwwMDA2MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xEM0QxIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsiZGl2c2wiLCB0d28oMDA0NjEwMCwwMDA0MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xERCIsICAgbTY4MDIwdXB8Y3B1MzIgfSwKLXsiZGl2c2wiLCB0d28oMDA0NjEwMCwwMDA0MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwidnNERCIsICAgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsiZGl2c2xsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLXsiZGl2c2xsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJkaXZ1dyIsCW9uZSgwMTAwMzAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJkaXZ1dyIsCW9uZSgwMTAwMzAwKSwJCW9uZSgwMTcwNzAwKSwgInZzRGQiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJkaXZ1bCIsIHR3bygwMDQ2MTAwLDAwMDIwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEQzRDEiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZ1bCIsIHR3bygwMDQ2MTAwLDAwMDAwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEREIiwgICBtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZ1bCIsIHR3bygwMDQ2MTAwLDAwMDAwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCJ2c0REIiwgICBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJkaXZ1bGwiLCB0d28oMDA0NjEwMCwwMDAwMDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xEM0QxIixtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZ1bGwiLCB0d28oMDA0NjEwMCwwMDAwMDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xERCIsICBtNjgwMjB1cHxjcHUzMiB9LAotCi17ImVvcmliIiwJb25lKDAwMDUwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaWIiLAlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpdyIsCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImVvcml3IiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaWwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JpbCIsCW9uZSgwMDA1MjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJlb3JpIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaSIsCW9uZSgwMDA1MTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImVvcmkiLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAotCi0vKiBUaGUgZW9yIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIGVvcmkgaW5zdHJ1Y3Rpb24uICAqLwoteyJlb3JiIiwJb25lKDAwMDUwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiZW9yYiIsCW9uZSgwMDA1MDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImVvcmIiLAlvbmUoMDEzMDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJlb3J3IiwJb25lKDAwMDUxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiZW9ydyIsCW9uZSgwMDA1MTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImVvcnciLAlvbmUoMDEzMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiZW9ybCIsCW9uZSgwMDA1MjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJlb3JsIiwJb25lKDAxMzA2MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiZW9yIiwJCW9uZSgwMDA1MDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImVvciIsCQlvbmUoMDAwNTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJlb3IiLAkJb25lKDAwMDUxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiZW9yIiwJCW9uZSgwMTMwNTAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi0KLXsiZXhnIiwJCW9uZSgwMTQwNTAwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImV4ZyIsCQlvbmUoMDE0MDUxMCksCW9uZSgwMTcwNzcwKSwgIkFkQXMiLCBtNjgwMDB1cCB9LAoteyJleGciLAkJb25lKDAxNDA2MTApLAlvbmUoMDE3MDc3MCksICJEZEFzIiwgbTY4MDAwdXAgfSwKLXsiZXhnIiwJCW9uZSgwMTQwNjEwKSwJb25lKDAxNzA3NzApLCAiQXNEZCIsIG02ODAwMHVwIH0sCi0KLXsiZXh0dyIsCW9uZSgwMDQ0MjAwKSwJb25lKDAxNzc3NzApLCAiRHMiLCBtNjgwMDB1cHxtY2YgfSwKLXsiZXh0bCIsCW9uZSgwMDQ0MzAwKSwJb25lKDAxNzc3NzApLCAiRHMiLCBtNjgwMDB1cHxtY2YgfSwKLXsiZXh0YmwiLAlvbmUoMDA0NDcwMCksCW9uZSgwMTc3NzcwKSwgIkRzIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmIH0sCi0KLS8qIGZsb2F0IHN0dWZmIHN0YXJ0cyBoZXJlICovCi0KLXsiZmFic2IiLAl0d28oMHhGMDAwLCAweDU4MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhYnNkIiwJdHdvKDB4RjAwMCwgMHg1NDE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYWJzbCIsCXR3bygweEYwMDAsIDB4NDAxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmFic3AiLAl0d28oMHhGMDAwLCAweDRDMTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhYnNzIiwJdHdvKDB4RjAwMCwgMHg0NDE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYWJzdyIsCXR3bygweEYwMDAsIDB4NTAxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmFic3giLAl0d28oMHhGMDAwLCAweDAwMTgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhYnN4IiwJdHdvKDB4RjAwMCwgMHg0ODE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYWJzeCIsCXR3bygweEYwMDAsIDB4MDAxOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc2Fic2IiLAl0d28oMHhGMDAwLCAweDU4NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnNkIiwJdHdvKDB4RjAwMCwgMHg1NDU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzbCIsCXR3bygweEYwMDAsIDB4NDA1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3AiLAl0d28oMHhGMDAwLCAweDRDNTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnNzIiwJdHdvKDB4RjAwMCwgMHg0NDU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzdyIsCXR3bygweEYwMDAsIDB4NTA1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3giLAl0d28oMHhGMDAwLCAweDAwNTgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN4IiwJdHdvKDB4RjAwMCwgMHg0ODU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzeCIsCXR3bygweEYwMDAsIDB4MDA1OCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZkYWJzYiIsCXR3bygweEYwMDAsIDB4NTg1YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cH0sCi17ImZkYWJzZCIsCXR3bygweEYwMDAsIDB4NTQ1YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cH0sCi17ImZkYWJzbCIsCXR3bygweEYwMDAsIDB4NDA1YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cH0sCi17ImZkYWJzcCIsCXR3bygweEYwMDAsIDB4NEM1YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cH0sCi17ImZkYWJzcyIsCXR3bygweEYwMDAsIDB4NDQ1YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cH0sCi17ImZkYWJzdyIsCXR3bygweEYwMDAsIDB4NTA1YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cH0sCi17ImZkYWJzeCIsCXR3bygweEYwMDAsIDB4MDA1YyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cH0sCi17ImZkYWJzeCIsCXR3bygweEYwMDAsIDB4NDg1YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cH0sCi17ImZkYWJzeCIsCXR3bygweEYwMDAsIDB4MDA1YyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cH0sCi0KLXsiZmFjb3NiIiwJdHdvKDB4RjAwMCwgMHg1ODFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYWNvc2QiLAl0d28oMHhGMDAwLCAweDU0MUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhY29zbCIsCXR3bygweEYwMDAsIDB4NDAxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmFjb3NwIiwJdHdvKDB4RjAwMCwgMHg0QzFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3MiLAl0d28oMHhGMDAwLCAweDQ0MUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhY29zdyIsCXR3bygweEYwMDAsIDB4NTAxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmFjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFDKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3giLAl0d28oMHhGMDAwLCAweDQ4MUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhY29zeCIsCXR3bygweEYwMDAsIDB4MDAxQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmYWRkYiIsCXR3bygweEYwMDAsIDB4NTgyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFkZGQiLAl0d28oMHhGMDAwLCAweDU0MjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhZGRsIiwJdHdvKDB4RjAwMCwgMHg0MDIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYWRkcCIsCXR3bygweEYwMDAsIDB4NEMyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFkZHMiLAl0d28oMHhGMDAwLCAweDQ0MjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhZGR3IiwJdHdvKDB4RjAwMCwgMHg1MDIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYWRkeCIsCXR3bygweEYwMDAsIDB4MDAyMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFkZHgiLAl0d28oMHhGMDAwLCAweDQ4MjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZnNhZGRiIiwJdHdvKDB4RjAwMCwgMHg1ODYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkZCIsCXR3bygweEYwMDAsIDB4NTQ2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZGwiLAl0d28oMHhGMDAwLCAweDQwNjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRwIiwJdHdvKDB4RjAwMCwgMHg0QzYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkcyIsCXR3bygweEYwMDAsIDB4NDQ2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHciLAl0d28oMHhGMDAwLCAweDUwNjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGR4IiwJdHdvKDB4RjAwMCwgMHgwMDYyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkeCIsCXR3bygweEYwMDAsIDB4NDg2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZkYWRkYiIsCXR3bygweEYwMDAsIDB4NTg2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZGQiLAl0d28oMHhGMDAwLCAweDU0NjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGRsIiwJdHdvKDB4RjAwMCwgMHg0MDY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkcCIsCXR3bygweEYwMDAsIDB4NEM2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHMiLAl0d28oMHhGMDAwLCAweDQ0NjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGR3IiwJdHdvKDB4RjAwMCwgMHg1MDY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkeCIsCXR3bygweEYwMDAsIDB4MDA2NiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHgiLAl0d28oMHhGMDAwLCAweDQ4NjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmYXNpbmIiLAl0d28oMHhGMDAwLCAweDU4MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhc2luZCIsCXR3bygweEYwMDAsIDB4NTQwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYXNpbnAiLAl0d28oMHhGMDAwLCAweDRDMEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhc2lucyIsCXR3bygweEYwMDAsIDB4NDQwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFzaW53IiwJdHdvKDB4RjAwMCwgMHg1MDBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYXNpbngiLAl0d28oMHhGMDAwLCAweDAwMEMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhc2lueCIsCXR3bygweEYwMDAsIDB4NDgwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmFzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBDKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZhdGFuYiIsCXR3bygweEYwMDAsIDB4NTgwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5kIiwJdHdvKDB4RjAwMCwgMHg1NDBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmwiLAl0d28oMHhGMDAwLCAweDQwMEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhdGFucCIsCXR3bygweEYwMDAsIDB4NEMwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5zIiwJdHdvKDB4RjAwMCwgMHg0NDBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYXRhbnciLAl0d28oMHhGMDAwLCAweDUwMEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhdGFueCIsCXR3bygweEYwMDAsIDB4MDAwQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmF0YW54IiwJdHdvKDB4RjAwMCwgMHg0ODBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYXRhbngiLAl0d28oMHhGMDAwLCAweDAwMEEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmF0YW5oYiIsCXR3bygweEYwMDAsIDB4NTgwRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5oZCIsCXR3bygweEYwMDAsIDB4NTQwRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5obCIsCXR3bygweEYwMDAsIDB4NDAwRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5ocCIsCXR3bygweEYwMDAsIDB4NEMwRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5ocyIsCXR3bygweEYwMDAsIDB4NDQwRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5odyIsCXR3bygweEYwMDAsIDB4NTAwRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmF0YW5oeCIsCXR3bygweEYwMDAsIDB4MDAwRCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmF0YW5oeCIsCXR3bygweEYwMDAsIDB4NDgwRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmF0YW5oeCIsCXR3bygweEYwMDAsIDB4MDAwRCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmYmVxIiwJb25lKDB4RjA4MSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJmIiwJCW9uZSgweEYwODApLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ2UiLAlvbmUoMHhGMDkzKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmdsIiwJb25lKDB4RjA5NiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJnbGUiLAlvbmUoMHhGMDk3KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmd0IiwJb25lKDB4RjA5MiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJsZSIsCW9uZSgweEYwOTUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibHQiLAlvbmUoMHhGMDk0KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5lIiwJb25lKDB4RjA4RSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ2UiLAlvbmUoMHhGMDlDKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5nbCIsCW9uZSgweEYwOTkpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmdsZSIsCW9uZSgweEYwOTgpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmd0IiwJb25lKDB4RjA5RCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJubGUiLAlvbmUoMHhGMDlBKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5sdCIsCW9uZSgweEYwOUIpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2dlIiwJb25lKDB4RjA4MyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvZ2wiLAlvbmUoMHhGMDg2KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9ndCIsCW9uZSgweEYwODIpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2xlIiwJb25lKDB4RjA4NSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvbHQiLAlvbmUoMHhGMDg0KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9yIiwJb25lKDB4RjA4NyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJzZXEiLAlvbmUoMHhGMDkxKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnNmIiwJb25lKDB4RjA5MCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJzbmUiLAlvbmUoMHhGMDlFKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnN0IiwJb25lKDB4RjA5RiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ0IiwJCW9uZSgweEYwOEYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWVxIiwJb25lKDB4RjA4OSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1Z2UiLAlvbmUoMHhGMDhCKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVndCIsCW9uZSgweEYwOEEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWxlIiwJb25lKDB4RjA4RCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1bHQiLAlvbmUoMHhGMDhDKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVuIiwJb25lKDB4RjA4OCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLQoteyJmYmVxbCIsCW9uZSgweEYwQzEpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZmwiLAlvbmUoMHhGMEMwKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmdlbCIsCW9uZSgweEYwRDMpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZ2xsIiwJb25lKDB4RjBENiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJnbGVsIiwJb25lKDB4RjBENyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJndGwiLAlvbmUoMHhGMEQyKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmxlbCIsCW9uZSgweEYwRDUpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibHRsIiwJb25lKDB4RjBENCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJuZWwiLAlvbmUoMHhGMENFKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5nZWwiLAlvbmUoMHhGMERDKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5nbGwiLAlvbmUoMHhGMEQ5KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5nbGVsIiwJb25lKDB4RjBEOCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJuZ3RsIiwJb25lKDB4RjBERCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJubGVsIiwJb25lKDB4RjBEQSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJubHRsIiwJb25lKDB4RjBEQiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJvZ2VsIiwJb25lKDB4RjBDMyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJvZ2xsIiwJb25lKDB4RjBDNiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJvZ3RsIiwJb25lKDB4RjBDMiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJvbGVsIiwJb25lKDB4RjBDNSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJvbHRsIiwJb25lKDB4RjBDNCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJvcmwiLAlvbmUoMHhGMEM3KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnNlcWwiLAlvbmUoMHhGMEQxKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnNmbCIsCW9uZSgweEYwRDApLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZic25lbCIsCW9uZSgweEYwREUpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZic3RsIiwJb25lKDB4RjBERiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ0bCIsCW9uZSgweEYwQ0YpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZidWVxbCIsCW9uZSgweEYwQzkpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZidWdlbCIsCW9uZSgweEYwQ0IpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZidWd0bCIsCW9uZSgweEYwQ0EpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZidWxlbCIsCW9uZSgweEYwQ0QpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZidWx0bCIsCW9uZSgweEYwQ0MpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZidW5sIiwJb25lKDB4RjBDOCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLQoteyJmamVxIiwJb25lKDB4RjA4MSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpmIiwJCW9uZSgweEYwODApLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ2UiLAlvbmUoMHhGMDkzKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamdsIiwJb25lKDB4RjA5NiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpnbGUiLAlvbmUoMHhGMDk3KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamd0IiwJb25lKDB4RjA5MiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpsZSIsCW9uZSgweEYwOTUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbHQiLAlvbmUoMHhGMDk0KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5lIiwJb25lKDB4RjA4RSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ2UiLAlvbmUoMHhGMDlDKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5nbCIsCW9uZSgweEYwOTkpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmdsZSIsCW9uZSgweEYwOTgpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmd0IiwJb25lKDB4RjA5RCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpubGUiLAlvbmUoMHhGMDlBKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5sdCIsCW9uZSgweEYwOUIpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2dlIiwJb25lKDB4RjA4MyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvZ2wiLAlvbmUoMHhGMDg2KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9ndCIsCW9uZSgweEYwODIpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2xlIiwJb25lKDB4RjA4NSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvbHQiLAlvbmUoMHhGMDg0KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9yIiwJb25lKDB4RjA4NyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpzZXEiLAlvbmUoMHhGMDkxKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanNmIiwJb25lKDB4RjA5MCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpzbmUiLAlvbmUoMHhGMDlFKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanN0IiwJb25lKDB4RjA5RiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp0IiwJCW9uZSgweEYwOEYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWVxIiwJb25lKDB4RjA4OSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1Z2UiLAlvbmUoMHhGMDhCKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVndCIsCW9uZSgweEYwOEEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWxlIiwJb25lKDB4RjA4RCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1bHQiLAlvbmUoMHhGMDhDKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVuIiwJb25lKDB4RjA4OCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLQoteyJmY21wYiIsCXR3bygweEYwMDAsIDB4NTgzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmNtcGQiLAl0d28oMHhGMDAwLCAweDU0MzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZjbXBsIiwJdHdvKDB4RjAwMCwgMHg0MDM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmY21wcCIsCXR3bygweEYwMDAsIDB4NEMzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmNtcHMiLAl0d28oMHhGMDAwLCAweDQ0MzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZjbXB3IiwJdHdvKDB4RjAwMCwgMHg1MDM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmY21weCIsCXR3bygweEYwMDAsIDB4MDAzOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmNtcHgiLAl0d28oMHhGMDAwLCAweDQ4MzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZmNvc2IiLAl0d28oMHhGMDAwLCAweDU4MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZjb3NkIiwJdHdvKDB4RjAwMCwgMHg1NDFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmY29zbCIsCXR3bygweEYwMDAsIDB4NDAxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmNvc3AiLAl0d28oMHhGMDAwLCAweDRDMUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZjb3NzIiwJdHdvKDB4RjAwMCwgMHg0NDFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmY29zdyIsCXR3bygweEYwMDAsIDB4NTAxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmNvc3giLAl0d28oMHhGMDAwLCAweDAwMUQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZjb3N4IiwJdHdvKDB4RjAwMCwgMHg0ODFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmY29zeCIsCXR3bygweEYwMDAsIDB4MDAxRCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmY29zaGIiLAl0d28oMHhGMDAwLCAweDU4MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZjb3NoZCIsCXR3bygweEYwMDAsIDB4NTQxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hsIiwJdHdvKDB4RjAwMCwgMHg0MDE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmY29zaHAiLAl0d28oMHhGMDAwLCAweDRDMTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZjb3NocyIsCXR3bygweEYwMDAsIDB4NDQxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmNvc2h3IiwJdHdvKDB4RjAwMCwgMHg1MDE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmY29zaHgiLAl0d28oMHhGMDAwLCAweDAwMTkpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZjb3NoeCIsCXR3bygweEYwMDAsIDB4NDgxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmNvc2h4IiwJdHdvKDB4RjAwMCwgMHgwMDE5KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZkYmVxIiwJdHdvKDB4RjA0OCwgMHgwMDAxKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJmIiwJdHdvKDB4RjA0OCwgMHgwMDAwKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJnZSIsCXR3bygweEYwNDgsIDB4MDAxMyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZ2wiLAl0d28oMHhGMDQ4LCAweDAwMTYpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmdsZSIsCXR3bygweEYwNDgsIDB4MDAxNyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZ3QiLAl0d28oMHhGMDQ4LCAweDAwMTIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmxlIiwJdHdvKDB4RjA0OCwgMHgwMDE1KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJsdCIsCXR3bygweEYwNDgsIDB4MDAxNCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmUiLAl0d28oMHhGMDQ4LCAweDAwMEUpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5nZSIsCXR3bygweEYwNDgsIDB4MDAxQyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmdsIiwJdHdvKDB4RjA0OCwgMHgwMDE5KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZ2xlIiwJdHdvKDB4RjA0OCwgMHgwMDE4KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZ3QiLAl0d28oMHhGMDQ4LCAweDAwMUQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5sZSIsCXR3bygweEYwNDgsIDB4MDAxQSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmx0IiwJdHdvKDB4RjA0OCwgMHgwMDFCKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvZ2UiLAl0d28oMHhGMDQ4LCAweDAwMDMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9nbCIsCXR3bygweEYwNDgsIDB4MDAwNiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2d0IiwJdHdvKDB4RjA0OCwgMHgwMDAyKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvbGUiLAl0d28oMHhGMDQ4LCAweDAwMDUpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9sdCIsCXR3bygweEYwNDgsIDB4MDAwNCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib3IiLAl0d28oMHhGMDQ4LCAweDAwMDcpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnNlcSIsCXR3bygweEYwNDgsIDB4MDAxMSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRic2YiLAl0d28oMHhGMDQ4LCAweDAwMTApLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnNuZSIsCXR3bygweEYwNDgsIDB4MDAxRSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRic3QiLAl0d28oMHhGMDQ4LCAweDAwMUYpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnQiLAl0d28oMHhGMDQ4LCAweDAwMEYpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVlcSIsCXR3bygweEYwNDgsIDB4MDAwOSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWdlIiwJdHdvKDB4RjA0OCwgMHgwMDBCKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1Z3QiLAl0d28oMHhGMDQ4LCAweDAwMEEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVsZSIsCXR3bygweEYwNDgsIDB4MDAwRCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWx0IiwJdHdvKDB4RjA0OCwgMHgwMDBDKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1biIsCXR3bygweEYwNDgsIDB4MDAwOCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLQoteyJmZGl2YiIsCXR3bygweEYwMDAsIDB4NTgyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmRpdmQiLAl0d28oMHhGMDAwLCAweDU0MjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZkaXZsIiwJdHdvKDB4RjAwMCwgMHg0MDIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmZGl2cCIsCXR3bygweEYwMDAsIDB4NEMyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmRpdnMiLAl0d28oMHhGMDAwLCAweDQ0MjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZkaXZ3IiwJdHdvKDB4RjAwMCwgMHg1MDIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmZGl2eCIsCXR3bygweEYwMDAsIDB4MDAyMCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmRpdngiLAl0d28oMHhGMDAwLCAweDQ4MjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZnNkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQ2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdmwiLAl0d28oMHhGMDAwLCAweDQwNjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2cyIsCXR3bygweEYwMDAsIDB4NDQ2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdnciLAl0d28oMHhGMDAwLCAweDUwNjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDYwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2eCIsCXR3bygweEYwMDAsIDB4NDg2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZkZGl2YiIsCXR3bygweEYwMDAsIDB4NTg2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdmQiLAl0d28oMHhGMDAwLCAweDU0NjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZsIiwJdHdvKDB4RjAwMCwgMHg0MDY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2cCIsCXR3bygweEYwMDAsIDB4NEM2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdnMiLAl0d28oMHhGMDAwLCAweDQ0NjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZ3IiwJdHdvKDB4RjAwMCwgMHg1MDY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2eCIsCXR3bygweEYwMDAsIDB4MDA2NCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdngiLAl0d28oMHhGMDAwLCAweDQ4NjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmZXRveGIiLAl0d28oMHhGMDAwLCAweDU4MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZldG94ZCIsCXR3bygweEYwMDAsIDB4NTQxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hsIiwJdHdvKDB4RjAwMCwgMHg0MDEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmZXRveHAiLAl0d28oMHhGMDAwLCAweDRDMTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZldG94cyIsCXR3bygweEYwMDAsIDB4NDQxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmV0b3h3IiwJdHdvKDB4RjAwMCwgMHg1MDEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmZXRveHgiLAl0d28oMHhGMDAwLCAweDAwMTApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZldG94eCIsCXR3bygweEYwMDAsIDB4NDgxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmV0b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDEwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZldG94bTFiIiwJdHdvKDB4RjAwMCwgMHg1ODA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xZCIsCXR3bygweEYwMDAsIDB4NTQwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMWwiLAl0d28oMHhGMDAwLCAweDQwMDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFwIiwJdHdvKDB4RjAwMCwgMHg0QzA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xcyIsCXR3bygweEYwMDAsIDB4NDQwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXciLAl0d28oMHhGMDAwLCAweDUwMDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZldG94bTF4IiwJdHdvKDB4RjAwMCwgMHgwMDA4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xeCIsCXR3bygweEYwMDAsIDB4NDgwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXgiLAl0d28oMHhGMDAwLCAweDAwMDgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmdldGV4cGIiLAl0d28oMHhGMDAwLCAweDU4MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHBkIiwJdHdvKDB4RjAwMCwgMHg1NDFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwbCIsCXR3bygweEYwMDAsIDB4NDAxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHAiLAl0d28oMHhGMDAwLCAweDRDMUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHBzIiwJdHdvKDB4RjAwMCwgMHg0NDFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwdyIsCXR3bygweEYwMDAsIDB4NTAxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHgiLAl0d28oMHhGMDAwLCAweDAwMUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB4IiwJdHdvKDB4RjAwMCwgMHg0ODFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhweCIsCXR3bygweEYwMDAsIDB4MDAxRSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmZ2V0bWFuYiIsCXR3bygweEYwMDAsIDB4NTgxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbmQiLAl0d28oMHhGMDAwLCAweDU0MUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW5sIiwJdHdvKDB4RjAwMCwgMHg0MDFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFucCIsCXR3bygweEYwMDAsIDB4NEMxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbnMiLAl0d28oMHhGMDAwLCAweDQ0MUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW53IiwJdHdvKDB4RjAwMCwgMHg1MDFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFueCIsCXR3bygweEYwMDAsIDB4MDAxRiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbngiLAl0d28oMHhGMDAwLCAweDQ4MUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW54IiwJdHdvKDB4RjAwMCwgMHgwMDFGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZpbnRiIiwJdHdvKDB4RjAwMCwgMHg1ODAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmaW50ZCIsCXR3bygweEYwMDAsIDB4NTQwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmludGwiLAl0d28oMHhGMDAwLCAweDQwMDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZpbnRwIiwJdHdvKDB4RjAwMCwgMHg0QzAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmaW50cyIsCXR3bygweEYwMDAsIDB4NDQwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmludHciLAl0d28oMHhGMDAwLCAweDUwMDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZpbnR4IiwJdHdvKDB4RjAwMCwgMHgwMDAxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmaW50eCIsCXR3bygweEYwMDAsIDB4NDgwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmludHgiLAl0d28oMHhGMDAwLCAweDAwMDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmludHJ6YiIsCXR3bygweEYwMDAsIDB4NTgwMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmludHJ6ZCIsCXR3bygweEYwMDAsIDB4NTQwMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmludHJ6bCIsCXR3bygweEYwMDAsIDB4NDAwMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmludHJ6cCIsCXR3bygweEYwMDAsIDB4NEMwMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmludHJ6cyIsCXR3bygweEYwMDAsIDB4NDQwMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmludHJ6dyIsCXR3bygweEYwMDAsIDB4NTAwMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmludHJ6eCIsCXR3bygweEYwMDAsIDB4MDAwMyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmludHJ6eCIsCXR3bygweEYwMDAsIDB4NDgwMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmludHJ6eCIsCXR3bygweEYwMDAsIDB4MDAwMyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbG9nMTBiIiwJdHdvKDB4RjAwMCwgMHg1ODE1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbG9nMTBkIiwJdHdvKDB4RjAwMCwgMHg1NDE1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nMTBsIiwJdHdvKDB4RjAwMCwgMHg0MDE1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbG9nMTBwIiwJdHdvKDB4RjAwMCwgMHg0QzE1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbG9nMTBzIiwJdHdvKDB4RjAwMCwgMHg0NDE1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nMTB3IiwJdHdvKDB4RjAwMCwgMHg1MDE1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbG9nMTB4IiwJdHdvKDB4RjAwMCwgMHgwMDE1KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbG9nMTB4IiwJdHdvKDB4RjAwMCwgMHg0ODE1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbG9nMTB4IiwJdHdvKDB4RjAwMCwgMHgwMDE1KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2cyYiIsCXR3bygweEYwMDAsIDB4NTgxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJkIiwJdHdvKDB4RjAwMCwgMHg1NDE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nMmwiLAl0d28oMHhGMDAwLCAweDQwMTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2cycCIsCXR3bygweEYwMDAsIDB4NEMxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJzIiwJdHdvKDB4RjAwMCwgMHg0NDE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nMnciLAl0d28oMHhGMDAwLCAweDUwMTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2cyeCIsCXR3bygweEYwMDAsIDB4MDAxNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmxvZzJ4IiwJdHdvKDB4RjAwMCwgMHg0ODE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbG9nMngiLAl0d28oMHhGMDAwLCAweDAwMTYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmxvZ25iIiwJdHdvKDB4RjAwMCwgMHg1ODE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbG9nbmQiLAl0d28oMHhGMDAwLCAweDU0MTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZsb2dubCIsCXR3bygweEYwMDAsIDB4NDAxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wIiwJdHdvKDB4RjAwMCwgMHg0QzE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnMiLAl0d28oMHhGMDAwLCAweDQ0MTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZsb2dudyIsCXR3bygweEYwMDAsIDB4NTAxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmxvZ254IiwJdHdvKDB4RjAwMCwgMHgwMDE0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbG9nbngiLAl0d28oMHhGMDAwLCAweDQ4MTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZsb2dueCIsCXR3bygweEYwMDAsIDB4MDAxNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbG9nbnAxYiIsCXR3bygweEYwMDAsIDB4NTgwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMWQiLAl0d28oMHhGMDAwLCAweDU0MDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDFsIiwJdHdvKDB4RjAwMCwgMHg0MDA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxcCIsCXR3bygweEYwMDAsIDB4NEMwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXMiLAl0d28oMHhGMDAwLCAweDQ0MDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDF3IiwJdHdvKDB4RjAwMCwgMHg1MDA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxeCIsCXR3bygweEYwMDAsIDB4MDAwNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXgiLAl0d28oMHhGMDAwLCAweDQ4MDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDF4IiwJdHdvKDB4RjAwMCwgMHgwMDA2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZtb2RiIiwJdHdvKDB4RjAwMCwgMHg1ODIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbW9kZCIsCXR3bygweEYwMDAsIDB4NTQyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZm1vZGwiLAl0d28oMHhGMDAwLCAweDQwMjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZtb2RwIiwJdHdvKDB4RjAwMCwgMHg0QzIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbW9kcyIsCXR3bygweEYwMDAsIDB4NDQyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZm1vZHciLAl0d28oMHhGMDAwLCAweDUwMjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZtb2R4IiwJdHdvKDB4RjAwMCwgMHgwMDIxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbW9keCIsCXR3bygweEYwMDAsIDB4NDgyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmbW92ZWIiLAl0d28oMHhGMDAwLCAweDU4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlYiIsCXR3bygweEYwMDAsIDB4NzgwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JGIiLCBtZmxvYXQgfSwKLXsiZm1vdmVkIiwJdHdvKDB4RjAwMCwgMHg1NDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbW92ZWQiLAl0d28oMHhGMDAwLCAweDc0MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGN35GIiwgbWZsb2F0IH0sCi17ImZtb3ZlbCIsCXR3bygweEYwMDAsIDB4NDAwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZm1vdmVsIiwJdHdvKDB4RjAwMCwgMHg2MDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjckbCIsIG1mbG9hdCB9LAotLyogRklYTUU6IHRoZSBuZXh0IHR3byB2YXJpYW50cyBzaG91bGQgbm90IHBlcm1pdCBtb3ZpbmcgYW4gYWRkcmVzcwotICAgcmVnaXN0ZXIgdG8gYW55dGhpbmcgYnV0IHRoZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbiByZWdpc3Rlci4gICovCi17ImZtb3ZlbCIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaXM4JXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVsIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpKmxzOCIsIG1mbG9hdCB9LAoteyJmbW92ZXAiLAl0d28oMHhGMDAwLCAweDRDMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlcCIsCXR3bygweEYwMDAsIDB4NkMwMCksIHR3bygweEYxQzAsIDB4RkMwMCksICJJaUY3fnBrQyIsIG1mbG9hdCB9LAoteyJmbW92ZXAiLAl0d28oMHhGMDAwLCAweDdDMDApLCB0d28oMHhGMUMwLCAweEZDMEYpLCAiSWlGN35wRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVzIiwJdHdvKDB4RjAwMCwgMHg0NDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXMiLAl0d28oMHhGMDAwLCAweDY0MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyRmIiwgbWZsb2F0IH0sCi17ImZtb3ZldyIsCXR3bygweEYwMDAsIDB4NTAwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZm1vdmV3IiwJdHdvKDB4RjAwMCwgMHg3MDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjckdyIsIG1mbG9hdCB9LAoteyJmbW92ZXgiLAl0d28oMHhGMDAwLCAweDAwMDApLCB0d28oMHhGMUZGLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZtb3ZleCIsCXR3bygweEYwMDAsIDB4NDgwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZm1vdmV4IiwJdHdvKDB4RjAwMCwgMHg2ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjd+eCIsIG1mbG9hdCB9LAotCi17ImZzbW92ZWIiLAl0d28oMHhGMDAwLCAweDU4NDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZlZCIsCXR3bygweEYwMDAsIDB4NTQ0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVsIiwJdHdvKDB4RjAwMCwgMHg0MDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXMiLAl0d28oMHhGMDAwLCAweDQ0NDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZldyIsCXR3bygweEYwMDAsIDB4NTA0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmV4IiwJdHdvKDB4RjAwMCwgMHgwMDQwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXgiLAl0d28oMHhGMDAwLCAweDQ4NDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZlcCIsCXR3bygweEYwMDAsIDB4NEM0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAotCi17ImZkbW92ZWIiLAl0d28oMHhGMDAwLCAweDU4NDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZlZCIsCXR3bygweEYwMDAsIDB4NTQ0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVsIiwJdHdvKDB4RjAwMCwgMHg0MDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXMiLAl0d28oMHhGMDAwLCAweDQ0NDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZldyIsCXR3bygweEYwMDAsIDB4NTA0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmV4IiwJdHdvKDB4RjAwMCwgMHgwMDQ0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXgiLAl0d28oMHhGMDAwLCAweDQ4NDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZlcCIsCXR3bygweEYwMDAsIDB4NEM0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAotCi17ImZtb3ZlY3J4IiwJdHdvKDB4RjAwMCwgMHg1QzAwKSwgdHdvKDB4RjFGRiwgMHhGQzAwKSwgIklpI0NGNyIsIG1mbG9hdCB9LAotCi17ImZtb3ZlbXgiLAl0d28oMHhGMDAwLCAweEY4MDApLCB0d28oMHhGMUMwLCAweEZGOEYpLCAiSWlEayZzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDIwLCAweEU4MDApLCB0d28oMHhGMUY4LCAweEZGOEYpLCAiSWlEay1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDAwLCAweEQ4MDApLCB0d28oMHhGMUMwLCAweEZGOEYpLCAiSWkmc0RrIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDE4LCAweEQ4MDApLCB0d28oMHhGMUY4LCAweEZGOEYpLCAiSWkrc0RrIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDAwLCAweEYwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWRsMyZzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDAwLCAweEYwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWQjMyZzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDAwLCAweEQwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWQmc2wzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDAwLCAweEQwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWQmcyMzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDIwLCAweEUwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWRMMy1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDIwLCAweEUwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQjMy1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDE4LCAweEQwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQrc2wzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbXgiLAl0d28oMHhGMDE4LCAweEQwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQrcyMzIiwgbWZsb2F0IH0sCi0KLXsiZm1vdmVtbCIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaXM4JXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtbCIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaUw4fnMiLCBtZmxvYXQgfSwKLS8qIEZJWE1FOiBJbiB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgd2Ugc2hvdWxkIG9ubHkgcGVybWl0ICVkbiBpZiB0aGUKLSAgIHRhcmdldCBpcyBhIHNpbmdsZSByZWdpc3Rlci4gIFdlIHNob3VsZCBvbmx5IHBlcm1pdCAlYW4gaWYgdGhlCi0gICB0YXJnZXQgaXMgYSBzaW5nbGUgJWZwaWFyLiAgKi8KLXsiZm1vdmVtbCIsCXR3bygweEYwMDAsIDB4ODAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaSpsTDgiLCBtZmxvYXQgfSwKLQoteyJmbW92ZW0iLAl0d28oMHhGMDIwLCAweEUwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWRMMy1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZGwzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAxOCwgMHhEMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkK3NsMyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEQwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWQmc2wzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCMzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAyMCwgMHhFODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpRGstcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEYwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWQjMyZzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RjgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaURrJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAxOCwgMHhEMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkK3MjMyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDE4LCAweEQ4MDApLCB0d28oMHhGMUY4LCAweEZGOEYpLCAiSWkrc0RrIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzIzMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhEODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpJnNEayIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlzOCVzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4ODAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaSpzczgiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpTDh+cyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMkMwLCAweEUzRkYpLCAiSWkqc0w4IiwgbWZsb2F0IH0sCi0KLXsiZm11bGIiLAl0d28oMHhGMDAwLCAweDU4MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZtdWxkIiwJdHdvKDB4RjAwMCwgMHg1NDIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbXVsbCIsCXR3bygweEYwMDAsIDB4NDAyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZm11bHAiLAl0d28oMHhGMDAwLCAweDRDMjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZtdWxzIiwJdHdvKDB4RjAwMCwgMHg0NDIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbXVsdyIsCXR3bygweEYwMDAsIDB4NTAyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZm11bHgiLAl0d28oMHhGMDAwLCAweDAwMjMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZtdWx4IiwJdHdvKDB4RjAwMCwgMHg0ODIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZzbXVsYiIsCXR3bygweEYwMDAsIDB4NTg2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc211bGQiLAl0d28oMHhGMDAwLCAweDU0NjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVscCIsCXR3bygweEYwMDAsIDB4NEM2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc211bHMiLAl0d28oMHhGMDAwLCAweDQ0NjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVseCIsCXR3bygweEYwMDAsIDB4MDA2MyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc211bHgiLAl0d28oMHhGMDAwLCAweDQ4NjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmZG11bGIiLAl0d28oMHhGMDAwLCAweDU4NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWxkIiwJdHdvKDB4RjAwMCwgMHg1NDY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVsbCIsCXR3bygweEYwMDAsIDB4NDA2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHAiLAl0d28oMHhGMDAwLCAweDRDNjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWxzIiwJdHdvKDB4RjAwMCwgMHg0NDY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVsdyIsCXR3bygweEYwMDAsIDB4NTA2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHgiLAl0d28oMHhGMDAwLCAweDAwNjcpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWx4IiwJdHdvKDB4RjAwMCwgMHg0ODY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZm5lZ2IiLAl0d28oMHhGMDAwLCAweDU4MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZuZWdkIiwJdHdvKDB4RjAwMCwgMHg1NDFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbmVnbCIsCXR3bygweEYwMDAsIDB4NDAxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZm5lZ3AiLAl0d28oMHhGMDAwLCAweDRDMUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZuZWdzIiwJdHdvKDB4RjAwMCwgMHg0NDFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbmVndyIsCXR3bygweEYwMDAsIDB4NTAxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZm5lZ3giLAl0d28oMHhGMDAwLCAweDAwMUEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZuZWd4IiwJdHdvKDB4RjAwMCwgMHg0ODFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbmVneCIsCXR3bygweEYwMDAsIDB4MDAxQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc25lZ2IiLAl0d28oMHhGMDAwLCAweDU4NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWdkIiwJdHdvKDB4RjAwMCwgMHg1NDVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVnbCIsCXR3bygweEYwMDAsIDB4NDA1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3AiLAl0d28oMHhGMDAwLCAweDRDNUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWdzIiwJdHdvKDB4RjAwMCwgMHg0NDVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVndyIsCXR3bygweEYwMDAsIDB4NTA1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3giLAl0d28oMHhGMDAwLCAweDAwNUEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd4IiwJdHdvKDB4RjAwMCwgMHg0ODVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVneCIsCXR3bygweEYwMDAsIDB4MDA1QSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZkbmVnYiIsCXR3bygweEYwMDAsIDB4NTg1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ2QiLAl0d28oMHhGMDAwLCAweDU0NUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWdsIiwJdHdvKDB4RjAwMCwgMHg0MDVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVncCIsCXR3bygweEYwMDAsIDB4NEM1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3MiLAl0d28oMHhGMDAwLCAweDQ0NUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWd3IiwJdHdvKDB4RjAwMCwgMHg1MDVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVneCIsCXR3bygweEYwMDAsIDB4MDA1RSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3giLAl0d28oMHhGMDAwLCAweDQ4NUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZm5vcCIsCXR3bygweEYyODAsIDB4MDAwMCksIHR3bygweEZGRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAotCi17ImZyZW1iIiwJdHdvKDB4RjAwMCwgMHg1ODI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmcmVtZCIsCXR3bygweEYwMDAsIDB4NTQyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnJlbWwiLAl0d28oMHhGMDAwLCAweDQwMjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZyZW1wIiwJdHdvKDB4RjAwMCwgMHg0QzI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmcmVtcyIsCXR3bygweEYwMDAsIDB4NDQyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnJlbXciLAl0d28oMHhGMDAwLCAweDUwMjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZyZW14IiwJdHdvKDB4RjAwMCwgMHgwMDI1KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmcmVteCIsCXR3bygweEYwMDAsIDB4NDgyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmcmVzdG9yZSIsCW9uZSgweEYxNDApLAkJb25lKDB4RjFDMCksICJJZDxzIiwgbWZsb2F0IH0sCi0KLXsiZnNhdmUiLAlvbmUoMHhGMTAwKSwJCW9uZSgweEYxQzApLCAiSWQ+cyIsIG1mbG9hdCB9LAotCi17ImZzY2FsZWIiLAl0d28oMHhGMDAwLCAweDU4MjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzY2FsZWQiLAl0d28oMHhGMDAwLCAweDU0MjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzY2FsZWwiLAl0d28oMHhGMDAwLCAweDQwMjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzY2FsZXAiLAl0d28oMHhGMDAwLCAweDRDMjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzY2FsZXMiLAl0d28oMHhGMDAwLCAweDQ0MjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzY2FsZXciLAl0d28oMHhGMDAwLCAweDUwMjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzY2FsZXgiLAl0d28oMHhGMDAwLCAweDAwMjYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzY2FsZXgiLAl0d28oMHhGMDAwLCAweDQ4MjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLS8qICQgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgdGhlIGFzc2VtYmxlciBmcm9tIHVzaW5nIFBDLXJlbGF0aXZlLgotICAgSWYgQCB3ZXJlIHVzZWQsICJsYWJlbDogZnNlcSBsYWJlbCIgY291bGQgcHJvZHVjZSAiZnRyYXBlcSIsCi0gICBiZWNhdXNlICJsYWJlbCIgYmVjYW1lICJwY0BsYWJlbCIuICAqLwoteyJmc2VxIiwJdHdvKDB4RjA0MCwgMHgwMDAxKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNmIiwJCXR3bygweEYwNDAsIDB4MDAwMCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ2UiLAl0d28oMHhGMDQwLCAweDAwMTMpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2dsIiwJdHdvKDB4RjA0MCwgMHgwMDE2KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNnbGUiLAl0d28oMHhGMDQwLCAweDAwMTcpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2d0IiwJdHdvKDB4RjA0MCwgMHgwMDEyKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNsZSIsCXR3bygweEYwNDAsIDB4MDAxNSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbHQiLAl0d28oMHhGMDQwLCAweDAwMTQpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25lIiwJdHdvKDB4RjA0MCwgMHgwMDBFKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ2UiLAl0d28oMHhGMDQwLCAweDAwMUMpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25nbCIsCXR3bygweEYwNDAsIDB4MDAxOSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmdsZSIsCXR3bygweEYwNDAsIDB4MDAxOCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmd0IiwJdHdvKDB4RjA0MCwgMHgwMDFEKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNubGUiLAl0d28oMHhGMDQwLCAweDAwMUEpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25sdCIsCXR3bygweEYwNDAsIDB4MDAxQiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2dlIiwJdHdvKDB4RjA0MCwgMHgwMDAzKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvZ2wiLAl0d28oMHhGMDQwLCAweDAwMDYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29ndCIsCXR3bygweEYwNDAsIDB4MDAwMiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2xlIiwJdHdvKDB4RjA0MCwgMHgwMDA1KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvbHQiLAl0d28oMHhGMDQwLCAweDAwMDQpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29yIiwJdHdvKDB4RjA0MCwgMHgwMDA3KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNzZXEiLAl0d28oMHhGMDQwLCAweDAwMTEpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3NmIiwJdHdvKDB4RjA0MCwgMHgwMDEwKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNzbmUiLAl0d28oMHhGMDQwLCAweDAwMUUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3N0IiwJdHdvKDB4RjA0MCwgMHgwMDFGKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN0IiwJCXR3bygweEYwNDAsIDB4MDAwRiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWVxIiwJdHdvKDB4RjA0MCwgMHgwMDA5KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1Z2UiLAl0d28oMHhGMDQwLCAweDAwMEIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VndCIsCXR3bygweEYwNDAsIDB4MDAwQSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWxlIiwJdHdvKDB4RjA0MCwgMHgwMDBEKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1bHQiLAl0d28oMHhGMDQwLCAweDAwMEMpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VuIiwJdHdvKDB4RjA0MCwgMHgwMDA4KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLQoteyJmc2dsZGl2YiIsCXR3bygweEYwMDAsIDB4NTgyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdmQiLAl0d28oMHhGMDAwLCAweDU0MjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZsIiwJdHdvKDB4RjAwMCwgMHg0MDI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2cCIsCXR3bygweEYwMDAsIDB4NEMyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdnMiLAl0d28oMHhGMDAwLCAweDQ0MjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZ3IiwJdHdvKDB4RjAwMCwgMHg1MDI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2eCIsCXR3bygweEYwMDAsIDB4MDAyNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdngiLAl0d28oMHhGMDAwLCAweDQ4MjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDI0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzZ2xtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVsZCIsCXR3bygweEYwMDAsIDB4NTQyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bGwiLAl0d28oMHhGMDAwLCAweDQwMjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVscyIsCXR3bygweEYwMDAsIDB4NDQyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHciLAl0d28oMHhGMDAwLCAweDUwMjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDI3KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVseCIsCXR3bygweEYwMDAsIDB4NDgyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHgiLAl0d28oMHhGMDAwLCAweDAwMjcpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNpbmIiLAl0d28oMHhGMDAwLCAweDU4MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzaW5kIiwJdHdvKDB4RjAwMCwgMHg1NDBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2lubCIsCXR3bygweEYwMDAsIDB4NDAwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNpbnAiLAl0d28oMHhGMDAwLCAweDRDMEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzaW5zIiwJdHdvKDB4RjAwMCwgMHg0NDBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2ludyIsCXR3bygweEYwMDAsIDB4NTAwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNpbngiLAl0d28oMHhGMDAwLCAweDAwMEUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzaW54IiwJdHdvKDB4RjAwMCwgMHg0ODBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc2lueCIsCXR3bygweEYwMDAsIDB4MDAwRSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc2luY29zYiIsCXR3bygweEYwMDAsIDB4NTgzMCksIHR3bygweEYxQzAsIDB4RkM3OCksICJJaTtiRjNGNyIsIG1mbG9hdCB9LAoteyJmc2luY29zZCIsCXR3bygweEYwMDAsIDB4NTQzMCksIHR3bygweEYxQzAsIDB4RkM3OCksICJJaTtGRjNGNyIsIG1mbG9hdCB9LAoteyJmc2luY29zbCIsCXR3bygweEYwMDAsIDB4NDAzMCksIHR3bygweEYxQzAsIDB4RkM3OCksICJJaTtsRjNGNyIsIG1mbG9hdCB9LAoteyJmc2luY29zcCIsCXR3bygweEYwMDAsIDB4NEMzMCksIHR3bygweEYxQzAsIDB4RkM3OCksICJJaTtwRjNGNyIsIG1mbG9hdCB9LAoteyJmc2luY29zcyIsCXR3bygweEYwMDAsIDB4NDQzMCksIHR3bygweEYxQzAsIDB4RkM3OCksICJJaTtmRjNGNyIsIG1mbG9hdCB9LAoteyJmc2luY29zdyIsCXR3bygweEYwMDAsIDB4NTAzMCksIHR3bygweEYxQzAsIDB4RkM3OCksICJJaTt3RjNGNyIsIG1mbG9hdCB9LAoteyJmc2luY29zeCIsCXR3bygweEYwMDAsIDB4MDAzMCksIHR3bygweEYxQzAsIDB4RTA3OCksICJJaUY4RjNGNyIsIG1mbG9hdCB9LAoteyJmc2luY29zeCIsCXR3bygweEYwMDAsIDB4NDgzMCksIHR3bygweEYxQzAsIDB4RkM3OCksICJJaTt4RjNGNyIsIG1mbG9hdCB9LAotCi17ImZzaW5oYiIsCXR3bygweEYwMDAsIDB4NTgwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNpbmhkIiwJdHdvKDB4RjAwMCwgMHg1NDAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2luaGwiLAl0d28oMHhGMDAwLCAweDQwMDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzaW5ocCIsCXR3bygweEYwMDAsIDB4NEMwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNpbmhzIiwJdHdvKDB4RjAwMCwgMHg0NDAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2luaHciLAl0d28oMHhGMDAwLCAweDUwMDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5oeCIsCXR3bygweEYwMDAsIDB4MDAwMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNpbmh4IiwJdHdvKDB4RjAwMCwgMHg0ODAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc2luaHgiLAl0d28oMHhGMDAwLCAweDAwMDIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNxcnRiIiwJdHdvKDB4RjAwMCwgMHg1ODA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc3FydGQiLAl0d28oMHhGMDAwLCAweDU0MDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0bCIsCXR3bygweEYwMDAsIDB4NDAwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNxcnRwIiwJdHdvKDB4RjAwMCwgMHg0QzA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc3FydHMiLAl0d28oMHhGMDAwLCAweDQ0MDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0dyIsCXR3bygweEYwMDAsIDB4NTAwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDA0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc3FydHgiLAl0d28oMHhGMDAwLCAweDQ4MDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDAwNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc3NxcnRiIiwJdHdvKDB4RjAwMCwgMHg1ODQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydGQiLAl0d28oMHhGMDAwLCAweDU0NDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0bCIsCXR3bygweEYwMDAsIDB4NDA0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnRwIiwJdHdvKDB4RjAwMCwgMHg0QzQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHMiLAl0d28oMHhGMDAwLCAweDQ0NDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0dyIsCXR3bygweEYwMDAsIDB4NTA0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDQxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHgiLAl0d28oMHhGMDAwLCAweDQ4NDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0MSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZkc3FydGIiLAl0d28oMHhGMDAwLCAweDU4NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0ZCIsCXR3bygweEYwMDAsIDB4NTQ0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRsIiwJdHdvKDB4RjAwMCwgMHg0MDQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHAiLAl0d28oMHhGMDAwLCAweDRDNDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0cyIsCXR3bygweEYwMDAsIDB4NDQ0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnR3IiwJdHdvKDB4RjAwMCwgMHg1MDQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0eCIsCXR3bygweEYwMDAsIDB4NDg0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDQ1KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZnN1YmIiLAl0d28oMHhGMDAwLCAweDU4MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzdWJkIiwJdHdvKDB4RjAwMCwgMHg1NDI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc3VibCIsCXR3bygweEYwMDAsIDB4NDAyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnN1YnAiLAl0d28oMHhGMDAwLCAweDRDMjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzdWJzIiwJdHdvKDB4RjAwMCwgMHg0NDI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc3VidyIsCXR3bygweEYwMDAsIDB4NTAyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnN1YngiLAl0d28oMHhGMDAwLCAweDAwMjgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzdWJ4IiwJdHdvKDB4RjAwMCwgMHg0ODI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc3VieCIsCXR3bygweEYwMDAsIDB4MDAyOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc3N1YmIiLAl0d28oMHhGMDAwLCAweDU4NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJkIiwJdHdvKDB4RjAwMCwgMHg1NDY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VibCIsCXR3bygweEYwMDAsIDB4NDA2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YnAiLAl0d28oMHhGMDAwLCAweDRDNjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJzIiwJdHdvKDB4RjAwMCwgMHg0NDY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VidyIsCXR3bygweEYwMDAsIDB4NTA2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YngiLAl0d28oMHhGMDAwLCAweDAwNjgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ4IiwJdHdvKDB4RjAwMCwgMHg0ODY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VieCIsCXR3bygweEYwMDAsIDB4MDA2OCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZkc3ViYiIsCXR3bygweEYwMDAsIDB4NTg2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YmQiLAl0d28oMHhGMDAwLCAweDU0NmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJsIiwJdHdvKDB4RjAwMCwgMHg0MDZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VicCIsCXR3bygweEYwMDAsIDB4NEM2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YnMiLAl0d28oMHhGMDAwLCAweDQ0NmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJ3IiwJdHdvKDB4RjAwMCwgMHg1MDZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VieCIsCXR3bygweEYwMDAsIDB4MDA2YyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YngiLAl0d28oMHhGMDAwLCAweDQ4NmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDZjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZnRhbmIiLAl0d28oMHhGMDAwLCAweDU4MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5kIiwJdHdvKDB4RjAwMCwgMHg1NDBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdGFubCIsCXR3bygweEYwMDAsIDB4NDAwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnRhbnAiLAl0d28oMHhGMDAwLCAweDRDMEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5zIiwJdHdvKDB4RjAwMCwgMHg0NDBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdGFudyIsCXR3bygweEYwMDAsIDB4NTAwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnRhbngiLAl0d28oMHhGMDAwLCAweDAwMEYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZ0YW54IiwJdHdvKDB4RjAwMCwgMHg0ODBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdGFueCIsCXR3bygweEYwMDAsIDB4MDAwRiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmdGFuaGIiLAl0d28oMHhGMDAwLCAweDU4MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5oZCIsCXR3bygweEYwMDAsIDB4NTQwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhsIiwJdHdvKDB4RjAwMCwgMHg0MDA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHAiLAl0d28oMHhGMDAwLCAweDRDMDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5ocyIsCXR3bygweEYwMDAsIDB4NDQwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnRhbmh3IiwJdHdvKDB4RjAwMCwgMHg1MDA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMDkpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5oeCIsCXR3bygweEYwMDAsIDB4NDgwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDA5KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZ0ZW50b3hiIiwJdHdvKDB4RjAwMCwgMHg1ODEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94ZCIsCXR3bygweEYwMDAsIDB4NTQxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveGwiLAl0d28oMHhGMDAwLCAweDQwMTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hwIiwJdHdvKDB4RjAwMCwgMHg0QzEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94cyIsCXR3bygweEYwMDAsIDB4NDQxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHciLAl0d28oMHhGMDAwLCAweDUwMTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDEyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94eCIsCXR3bygweEYwMDAsIDB4NDgxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHgiLAl0d28oMHhGMDAwLCAweDAwMTIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnRyYXBlcSIsCXR3bygweEYwN0MsIDB4MDAwMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGYiLAl0d28oMHhGMDdDLCAweDAwMDApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBnZSIsCXR3bygweEYwN0MsIDB4MDAxMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGdsIiwJdHdvKDB4RjA3QywgMHgwMDE2KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2xlIiwJdHdvKDB4RjA3QywgMHgwMDE3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ3QiLAl0d28oMHhGMDdDLCAweDAwMTIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBsZSIsCXR3bygweEYwN0MsIDB4MDAxNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGx0IiwJdHdvKDB4RjA3QywgMHgwMDE0KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmUiLAl0d28oMHhGMDdDLCAweDAwMEUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2UiLAl0d28oMHhGMDdDLCAweDAwMUMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2wiLAl0d28oMHhGMDdDLCAweDAwMTkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2xlIiwJdHdvKDB4RjA3QywgMHgwMDE4KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmd0IiwJdHdvKDB4RjA3QywgMHgwMDFEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmxlIiwJdHdvKDB4RjA3QywgMHgwMDFBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmx0IiwJdHdvKDB4RjA3QywgMHgwMDFCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dlIiwJdHdvKDB4RjA3QywgMHgwMDAzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dsIiwJdHdvKDB4RjA3QywgMHgwMDA2KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2d0IiwJdHdvKDB4RjA3QywgMHgwMDAyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2xlIiwJdHdvKDB4RjA3QywgMHgwMDA1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2x0IiwJdHdvKDB4RjA3QywgMHgwMDA0KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwb3IiLAl0d28oMHhGMDdDLCAweDAwMDcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBzZXEiLAl0d28oMHhGMDdDLCAweDAwMTEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBzZiIsCXR3bygweEYwN0MsIDB4MDAxMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHNuZSIsCXR3bygweEYwN0MsIDB4MDAxRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHN0IiwJdHdvKDB4RjA3QywgMHgwMDFGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdCIsCXR3bygweEYwN0MsIDB4MDAwRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHVlcSIsCXR3bygweEYwN0MsIDB4MDAwOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHVnZSIsCXR3bygweEYwN0MsIDB4MDAwQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHVndCIsCXR3bygweEYwN0MsIDB4MDAwQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHVsZSIsCXR3bygweEYwN0MsIDB4MDAwRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHVsdCIsCXR3bygweEYwN0MsIDB4MDAwQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHVuIiwJdHdvKDB4RjA3QywgMHgwMDA4KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi0gICAgICAgIAoteyJmdHJhcGVxdyIsCXR3bygweEYwN0EsIDB4MDAwMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZnciLAl0d28oMHhGMDdBLCAweDAwMDApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGdldyIsCXR3bygweEYwN0EsIDB4MDAxMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2x3IiwJdHdvKDB4RjA3QSwgMHgwMDE2KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBnbGV3IiwJdHdvKDB4RjA3QSwgMHgwMDE3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBndHciLAl0d28oMHhGMDdBLCAweDAwMTIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGxldyIsCXR3bygweEYwN0EsIDB4MDAxNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbHR3IiwJdHdvKDB4RjA3QSwgMHgwMDE0KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBuZXciLAl0d28oMHhGMDdBLCAweDAwMEUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5nZXciLAl0d28oMHhGMDdBLCAweDAwMUMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbHciLAl0d28oMHhGMDdBLCAweDAwMTkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbGV3IiwJdHdvKDB4RjA3QSwgMHgwMDE4KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ3R3IiwJdHdvKDB4RjA3QSwgMHgwMDFEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBubGV3IiwJdHdvKDB4RjA3QSwgMHgwMDFBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBubHR3IiwJdHdvKDB4RjA3QSwgMHgwMDFCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2V3IiwJdHdvKDB4RjA3QSwgMHgwMDAzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2x3IiwJdHdvKDB4RjA3QSwgMHgwMDA2KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ3R3IiwJdHdvKDB4RjA3QSwgMHgwMDAyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBvbGV3IiwJdHdvKDB4RjA3QSwgMHgwMDA1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBvbHR3IiwJdHdvKDB4RjA3QSwgMHgwMDA0KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBvcnciLAl0d28oMHhGMDdBLCAweDAwMDcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHNlcXciLAl0d28oMHhGMDdBLCAweDAwMTEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHNmdyIsCXR3bygweEYwN0EsIDB4MDAxMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwc25ldyIsCXR3bygweEYwN0EsIDB4MDAxRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwc3R3IiwJdHdvKDB4RjA3QSwgMHgwMDFGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB0dyIsCXR3bygweEYwN0EsIDB4MDAwRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwdWVxdyIsCXR3bygweEYwN0EsIDB4MDAwOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwdWdldyIsCXR3bygweEYwN0EsIDB4MDAwQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwdWd0dyIsCXR3bygweEYwN0EsIDB4MDAwQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwdWxldyIsCXR3bygweEYwN0EsIDB4MDAwRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwdWx0dyIsCXR3bygweEYwN0EsIDB4MDAwQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwdW53IiwJdHdvKDB4RjA3QSwgMHgwMDA4KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLQoteyJmdHJhcGVxbCIsCXR3bygweEYwN0IsIDB4MDAwMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZmwiLAl0d28oMHhGMDdCLCAweDAwMDApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGdlbCIsCXR3bygweEYwN0IsIDB4MDAxMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2xsIiwJdHdvKDB4RjA3QiwgMHgwMDE2KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbGVsIiwJdHdvKDB4RjA3QiwgMHgwMDE3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBndGwiLAl0d28oMHhGMDdCLCAweDAwMTIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGxlbCIsCXR3bygweEYwN0IsIDB4MDAxNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbHRsIiwJdHdvKDB4RjA3QiwgMHgwMDE0KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZWwiLAl0d28oMHhGMDdCLCAweDAwMEUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5nZWwiLAl0d28oMHhGMDdCLCAweDAwMUMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbGwiLAl0d28oMHhGMDdCLCAweDAwMTkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbGVsIiwJdHdvKDB4RjA3QiwgMHgwMDE4KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ3RsIiwJdHdvKDB4RjA3QiwgMHgwMDFEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBubGVsIiwJdHdvKDB4RjA3QiwgMHgwMDFBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBubHRsIiwJdHdvKDB4RjA3QiwgMHgwMDFCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2VsIiwJdHdvKDB4RjA3QiwgMHgwMDAzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2xsIiwJdHdvKDB4RjA3QiwgMHgwMDA2KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ3RsIiwJdHdvKDB4RjA3QiwgMHgwMDAyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBvbGVsIiwJdHdvKDB4RjA3QiwgMHgwMDA1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBvbHRsIiwJdHdvKDB4RjA3QiwgMHgwMDA0KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBvcmwiLAl0d28oMHhGMDdCLCAweDAwMDcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHNlcWwiLAl0d28oMHhGMDdCLCAweDAwMTEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHNmbCIsCXR3bygweEYwN0IsIDB4MDAxMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwc25lbCIsCXR3bygweEYwN0IsIDB4MDAxRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwc3RsIiwJdHdvKDB4RjA3QiwgMHgwMDFGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB0bCIsCXR3bygweEYwN0IsIDB4MDAwRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWVxbCIsCXR3bygweEYwN0IsIDB4MDAwOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWdlbCIsCXR3bygweEYwN0IsIDB4MDAwQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWd0bCIsCXR3bygweEYwN0IsIDB4MDAwQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWxlbCIsCXR3bygweEYwN0IsIDB4MDAwRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWx0bCIsCXR3bygweEYwN0IsIDB4MDAwQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwdW5sIiwJdHdvKDB4RjA3QiwgMHgwMDA4KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLQoteyJmdHN0YiIsCXR3bygweEYwMDAsIDB4NTgzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiIiwgbWZsb2F0IH0sCi17ImZ0c3RkIiwJdHdvKDB4RjAwMCwgMHg1NDNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0YiLCBtZmxvYXQgfSwKLXsiZnRzdGwiLAl0d28oMHhGMDAwLCAweDQwM0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bCIsIG1mbG9hdCB9LAoteyJmdHN0cCIsCXR3bygweEYwMDAsIDB4NEMzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwIiwgbWZsb2F0IH0sCi17ImZ0c3RzIiwJdHdvKDB4RjAwMCwgMHg0NDNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2YiLCBtZmxvYXQgfSwKLXsiZnRzdHciLAl0d28oMHhGMDAwLCAweDUwM0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7dyIsIG1mbG9hdCB9LAoteyJmdHN0eCIsCXR3bygweEYwMDAsIDB4MDAzQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4IiwgbWZsb2F0IH0sCi17ImZ0c3R4IiwJdHdvKDB4RjAwMCwgMHg0ODNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3giLCBtZmxvYXQgfSwKLQoteyJmdHdvdG94YiIsCXR3bygweEYwMDAsIDB4NTgxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveGQiLAl0d28oMHhGMDAwLCAweDU0MTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3hsIiwJdHdvKDB4RjAwMCwgMHg0MDExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94cCIsCXR3bygweEYwMDAsIDB4NEMxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHMiLAl0d28oMHhGMDAwLCAweDQ0MTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3h3IiwJdHdvKDB4RjAwMCwgMHg1MDExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94eCIsCXR3bygweEYwMDAsIDB4MDAxMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHgiLAl0d28oMHhGMDAwLCAweDQ4MTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDExKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImhhbHQiLAlvbmUoMDA0NTMxMCksCW9uZSgwMTc3Nzc3KSwgIiIsICAgICBtNjgwNjAgfCBtY2YgfSwKLQoteyJpbGxlZ2FsIiwJb25lKDAwNDUzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCAgICAgbTY4MDAwdXAgfSwKLQoteyJqbXAiLAkJb25lKDAwNDczMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsianJhIiwJCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqcmEiLAkJb25lKDAwNDczMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsianNyIiwJCW9uZSgwMDQ3MjAwKSwJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17Impic3IiLAlvbmUoMDA2MDQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamJzciIsCW9uZSgwMDQ3MjAwKSwJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImxlYSIsCQlvbmUoMDA0MDcwMCksCW9uZSgwMTcwNzAwKSwgIiFzQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17Imxwc3RvcCIsCXR3bygwMTc0MDAwLDAwMDA3MDApLHR3bygwMTc3Nzc3LDAxNzc3NzcpLCIjdyIsIGNwdTMyfG02ODA2MCB9LAotCi17Imxpbmt3IiwJb25lKDAwNDcxMjApLAlvbmUoMDE3Nzc3MCksICJBcyN3IiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibGlua2wiLAlvbmUoMDA0NDAxMCksCW9uZSgwMTc3NzcwKSwgIkFzI2wiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImxpbmsiLAlvbmUoMDA0NzEyMCksCW9uZSgwMTc3NzcwKSwgIkFzI1ciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJsaW5rIiwJb25lKDAwNDQwMTApLAlvbmUoMDE3Nzc3MCksICJBcyNsIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImxzbGIiLAlvbmUoMDE2MDQxMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJsc2xiIiwJb25lKDAxNjA0NTApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsibHNsdyIsCW9uZSgwMTYwNTEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzbHciLAlvbmUoMDE2MDU1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc2x3IiwJb25lKDAxNjE3MDApLAlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsibHNsbCIsCW9uZSgwMTYwNjEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImxzbGwiLAlvbmUoMDE2MDY1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImxzcmIiLAlvbmUoMDE2MDAxMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJsc3JiIiwJb25lKDAxNjAwNTApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsibHNydyIsCW9uZSgwMTYwMTEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzcnciLAlvbmUoMDE2MDE1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc3J3IiwJb25lKDAxNjEzMDApLAlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsibHNybCIsCW9uZSgwMTYwMjEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImxzcmwiLAlvbmUoMDE2MDI1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi0gIC8qIEZJWE1FOiBhZGQgTUFNIG1vZGUgKGAmJyBhZnRlciA8ZWE+IG9wZXJhbmQpIC8gcmVtb3ZlIE1BQ00gKi8KLXsibWFjdyIsICB0d28oMDEyMDAwMCwgMDAwMDAwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgInVNdW0iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDAwMCwgMDAwMTAwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgInVNdW1NaCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjIwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2FzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDIzMCwgMDAwMDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8rc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyNDAsIDAwMDAwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjUwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2RzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDIyMCwgMDAwMTAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDIzMCwgMDAwMTAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDI0MCwgMDAwMTAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDI1MCwgMDAwMTAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIyMCwgMDAwMDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9hc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyMzAsIDAwMDAwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjQwLCAwMDAwMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51by1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDI1MCwgMDAwMDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9kc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyMjAsIDAwMDEwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWhhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyMzAsIDAwMDEwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgrc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyNDAsIDAwMDEwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyNTAsIDAwMDEwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWhkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsibWFjbCIsICB0d28oMDEyMDAwMCwgMDAwNDAwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgIlJzUm0iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDAwMCwgMDAwNTAwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgIlJzUm1NaCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjIwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDIzMCwgMDAwNDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjErc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyNDAsIDAwMDQwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjUwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDIyMCwgMDAwNTAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDIzMCwgMDAwNTAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDI0MCwgMDAwNTAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDI1MCwgMDAwNTAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIyMCwgMDAwNDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyMzAsIDAwMDQwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjQwLCAwMDA0MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMS1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDI1MCwgMDAwNDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyMjAsIDAwMDUwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWhhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyMzAsIDAwMDUwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgrc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyNDAsIDAwMDUwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyNTAsIDAwMDUwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWhkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLS8qIE5PVEU6IFRoZSBtY2Y1MjAwIGZhbWlseSBwcm9ncmFtbWVyJ3MgcmVmZXJlbmNlIG1hbnVhbCBkb2VzIG5vdCAKLSAgIGluZGljYXRlIHRoZSBieXRlIGZvcm0gb2YgdGhlIG1vdmVhIGluc3RydWN0aW9uIGlzIGludmFsaWQgKGFzIGl0Ci0gICBpcyBvbiA2ODAwMCBmYW1pbHkgY3B1cykuICBIb3dldmVyLCBleHBlcmltZW50cyBvbiB0aGUgNTIwMiB5ZWlsZAotICAgdW5leHBlY3RlZCByZXN1bHRzLiAgVGhlIHZhbHVlIGlzIGNvcGllZCwgYnV0IGl0IGlzIG5vdCBzaWduIGV4dGVuZGVkCi0gICAoYXMgaXMgZG9uZSB3aXRoIG1vdmVhLncpIGFuZCB0aGUgdG9wIHRocmVlIGJ5dGVzIGluIHRoZSBhZGRyZXNzIAotICAgcmVnaXN0ZXIgYXJlIG5vdCBkaXN0dXJiZWQuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyB0aGUgaW50ZW5kZWQKLSAgIGJlaGF2aW9yIC0tLSBpdCBjb3VsZCBiZSBhIGhvbGUgaW4gaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKE1vdG9yb2xhCi0gICBkZWNpZGVkIG5vdCB0byB0cmFwIGFsbCBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucykKLSAgIC0tLSBidXQgSSBzdXNwZWN0IHRoYXQgaXQgaXMgbm90LiAgIAotCi0gICBJIHJlcG9ydGVkIHRoaXMgdG8gTW90b3JvbGEgSVNEIFRlY2huaWNhbCBDb21tdW5pY2F0aW9ucyBTdXBwb3J0LCAKLSAgIHdoaWNoIHJlcGxpZWQgdGhhdCBvdGhlciBjb2xkZmlyZSBhc3NlbWJsZXJzIHJlamVjdCBtb3ZlYS5iLiAgRm9yIAotICAgdGhpcyByZWFzb24gSSd2ZSBkZWNpZGVkIHRvIG5vdCBhbGxvdyBtb3ZlYWIuIAotCi0JanRjQGN5Z251cy5jb20gLSA5Ny8wMS8yNAotICovCi0KLXsibW92ZWFsIiwJb25lKDAwMjAxMDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibW92ZWF3IiwJb25lKDAwMzAxMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJtb3ZlYyIsCW9uZSgwMDQ3MTczKSwJb25lKDAxNzc3NzcpLCAiUjFKaiIsIG02ODAxMHVwIHwgbWNmIH0sCi17Im1vdmVjIiwJb25lKDAwNDcxNzMpLAlvbmUoMDE3Nzc3NyksICJSMSNqIiwgbTY4MDEwdXAgfCBtY2YgfSwKLXsibW92ZWMiLAlvbmUoMDA0NzE3MiksCW9uZSgwMTc3Nzc3KSwgIkpqUjEiLCBtNjgwMTB1cCB9LAoteyJtb3ZlYyIsCW9uZSgwMDQ3MTcyKSwJb25lKDAxNzc3NzcpLCAiI2pSMSIsIG02ODAxMHVwIH0sCi0KLXsibW92ZW13IiwJb25lKDAwNDQyMDApLAlvbmUoMDE3NzcwMCksICJMdyZzIiwgbTY4MDAwdXAgfSwKLXsibW92ZW13IiwJb25lKDAwNDQyNDApLAlvbmUoMDE3Nzc3MCksICJsdy1zIiwgbTY4MDAwdXAgfSwKLXsibW92ZW13IiwJb25lKDAwNDQyMDApLAlvbmUoMDE3NzcwMCksICIjdz5zIiwgbTY4MDAwdXAgfSwKLXsibW92ZW13IiwJb25lKDAwNDYyMDApLAlvbmUoMDE3NzcwMCksICI8c0x3IiwgbTY4MDAwdXAgfSwKLXsibW92ZW13IiwJb25lKDAwNDYyMDApLAlvbmUoMDE3NzcwMCksICI8cyN3IiwgbTY4MDAwdXAgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzMDApLAlvbmUoMDE3NzcwMCksICJMdyZzIiwgbTY4MDAwdXAgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzNDApLAlvbmUoMDE3Nzc3MCksICJsdy1zIiwgbTY4MDAwdXAgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzMDApLAlvbmUoMDE3NzcwMCksICIjdz5zIiwgbTY4MDAwdXAgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzMDApLAlvbmUoMDE3NzcwMCksICI8c0x3IiwgbTY4MDAwdXAgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzMDApLAlvbmUoMDE3NzcwMCksICI8cyN3IiwgbTY4MDAwdXAgfSwKLS8qIEZJWE1FOiBuZWVkIHNwZWNpZmllciBmb3IgbW9kZSAyIGFuZCA1IHRvIHNpbXBsaWZ5IGJlbG93IGluc24gcGF0dGVybnMgKi8KLXsibW92ZW1sIiwJb25lKDAwNDQzMjApLAlvbmUoMDE3Nzc3MCksICJMd2FzIiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzIwKSwJb25lKDAxNzc3NzApLCAiI3dhcyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM1MCksCW9uZSgwMTc3NzcwKSwgIkx3ZHMiLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzNTApLAlvbmUoMDE3Nzc3MCksICIjd2RzIiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzIwKSwJb25lKDAxNzc3NzApLCAiYXNMdyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMyMCksCW9uZSgwMTc3NzcwKSwgImFzI3ciLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzNTApLAlvbmUoMDE3Nzc3MCksICJkc0x3IiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzUwKSwJb25lKDAxNzc3NzApLCAiZHMjdyIsIG1jZiB9LAotCi17Im1vdmVwdyIsCW9uZSgwMDAwNDEwKSwJb25lKDAxNzA3NzApLCAiZHNEZCIsIG02ODAwMHVwIH0sCi17Im1vdmVwdyIsCW9uZSgwMDAwNjEwKSwJb25lKDAxNzA3NzApLCAiRGRkcyIsIG02ODAwMHVwIH0sCi17Im1vdmVwbCIsCW9uZSgwMDAwNTEwKSwJb25lKDAxNzA3NzApLCAiZHNEZCIsIG02ODAwMHVwIH0sCi17Im1vdmVwbCIsCW9uZSgwMDAwNzEwKSwJb25lKDAxNzA3NzApLCAiRGRkcyIsIG02ODAwMHVwIH0sCi0KLXsibW92ZXEiLAlvbmUoMDA3MDAwMCksCW9uZSgwMTcwNDAwKSwgIk1zRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJtb3ZlcSIsCW9uZSgwMDcwMDAwKSwJb25lKDAxNzA0MDApLCAiI0JEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLS8qIFRoZSBtb3ZlIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIG1vdmVhIGFuZCBtb3ZlcSBpbnN0cnVjdGlvbnMuICAqLwoteyJtb3ZlYiIsCW9uZSgwMDEwMDAwKSwJb25lKDAxNzAwMDApLCAiO2IkZCIsIG02ODAwMHVwIH0sCi17Im1vdmViIiwJb25lKDAwMTAwMDApLAlvbmUoMDE3MDAwMCksICJtcyVkIiwgbWNmIH0sCi17Im1vdmViIiwJb25lKDAwMTAwMDApLAlvbmUoMDE3MDAwMCksICJuc3BkIiwgbWNmIH0sCi17Im1vdmViIiwJb25lKDAwMTAwMDApLAlvbmUoMDE3MDAwMCksICJvYm1kIiwgbWNmIH0sCi0KLXsibW92ZXciLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIip3JWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAib3dtZCIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDQwMzAwKSwJb25lKDAxNzc3MDApLCAiU3MkcyIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDAzMDApLAlvbmUoMDE3Nzc3MCksICJTc0RzIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDEzMDApLAlvbmUoMDE3NzcwMCksICJDcyRzIiwgbTY4MDEwdXAgfSwKLXsibW92ZXciLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzcwKSwgIkNzRHMiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MjMwMCksCW9uZSgwMTc3NzAwKSwgIjt3Q2QiLCBtNjgwMDB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiRHNDZCIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDQyMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dDZCIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiO3dTZCIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDMzMDApLAlvbmUoMDE3NzcwMCksICJEc1NkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDMzNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NkIiwgbWNmIH0sCi0KLXsibW92ZWwiLAlvbmUoMDA3MDAwMCksCW9uZSgwMTcwNDAwKSwgIk1zRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJtb3ZlbCIsCW9uZSgwMDIwMDAwKSwJb25lKDAxNzAwMDApLCAiKmwlZCIsIG02ODAwMHVwIH0sCi17Im1vdmVsIiwJb25lKDAwMjAwMDApLAlvbmUoMDE3MDAwMCksICJtcyVkIiwgbWNmIH0sCi17Im1vdmVsIiwJb25lKDAwMjAwMDApLAlvbmUoMDE3MDAwMCksICJuc3BkIiwgbWNmIH0sCi17Im1vdmVsIiwJb25lKDAwMjAwMDApLAlvbmUoMDE3MDAwMCksICJvbG1kIiwgbWNmIH0sCi17Im1vdmVsIiwJb25lKDAwNDcxNDApLAlvbmUoMDE3Nzc3MCksICJBc1VkIiwgbTY4MDAwdXAgfSwKLXsibW92ZWwiLAlvbmUoMDA0NzE1MCksCW9uZSgwMTc3NzcwKSwgIlVkQXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbCIsCW9uZSgwMTIwNjAwKSwJb25lKDAxNzc3NjApLCAiRXNScyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTIwNDAwKSwJb25lKDAxNzc3NjApLCAiUnNFcyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTIwNDc0KSwJb25lKDAxNzc3NzcpLCAiI2xFcyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTI0NjAwKSwJb25lKDAxNzc3NjApLCAiR3NScyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTI0NDAwKSwJb25lKDAxNzc3NjApLCAiUnNHcyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTI0NDc0KSwJb25lKDAxNzc3NzcpLCAiI2xHcyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTI2NjAwKSwJb25lKDAxNzc3NjApLCAiSHNScyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTI2NDAwKSwJb25lKDAxNzc3NjApLCAiUnNIcyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTI2NDc0KSwJb25lKDAxNzc3NzcpLCAiI2xIcyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtb3ZlbCIsCW9uZSgwMTI0NzAwKSwJb25lKDAxNzc3NzcpLCAiR3NDcyIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17Im1vdmUiLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIip3JWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJtcyVkIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAib3dtZCIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwNDAzMDApLAlvbmUoMDE3NzcwMCksICJTcyRzIiwgbTY4MDAwdXAgfSwKLXsibW92ZSIsCW9uZSgwMDQwMzAwKSwJb25lKDAxNzc3NzApLCAiU3NEcyIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwNDEzMDApLAlvbmUoMDE3NzcwMCksICJDcyRzIiwgbTY4MDEwdXAgfSwKLXsibW92ZSIsCW9uZSgwMDQxMzAwKSwJb25lKDAxNzc3NzApLCAiQ3NEcyIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICI7d0NkIiwgbTY4MDAwdXAgfSwKLXsibW92ZSIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiRHNDZCIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwNDIzNzQpLAlvbmUoMDE3Nzc3NyksICIjd0NkIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIjt3U2QiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDMzMDApLAlvbmUoMDE3NzcwMCksICJEc1NkIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U2QiLCBtY2YgfSwKLQoteyJtb3ZlIiwJb25lKDAwNDcxNDApLAlvbmUoMDE3Nzc3MCksICJBc1VkIiwgbTY4MDAwdXAgfSwKLXsibW92ZSIsCW9uZSgwMDQ3MTUwKSwJb25lKDAxNzc3NzApLCAiVWRBcyIsIG02ODAwMHVwIH0sCi0KLXsibW92ZXNiIiwJdHdvKDAwMDcwMDAsIDApLCAgICAgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIn5zUjEiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc2IiLAl0d28oMDAwNzAwMCwgMDQwMDApLCB0d28oMDE3NzcwMCwgMDc3NzcpLCAiUjF+cyIsIG02ODAxMHVwIH0sCi17Im1vdmVzdyIsCXR3bygwMDA3MTAwLCAwKSwgICAgIHR3bygwMTc3NzAwLCAwNzc3NyksICJ+c1IxIiwgbTY4MDEwdXAgfSwKLXsibW92ZXN3IiwJdHdvKDAwMDcxMDAsIDA0MDAwKSwgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIlIxfnMiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc2wiLAl0d28oMDAwNzIwMCwgMCksICAgICB0d28oMDE3NzcwMCwgMDc3NzcpLCAifnNSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVzbCIsCXR3bygwMDA3MjAwLCAwNDAwMCksIHR3bygwMTc3NzAwLCAwNzc3NyksICJSMX5zIiwgbTY4MDEwdXAgfSwKLQoteyJtb3ZlMTYiLAl0d28oMHhmNjIwLCAweDgwMDApLCB0d28oMHhmZmY4LCAweDhmZmYpLCAiK3MrMSIsIG02ODA0MHVwIH0sCi17Im1vdmUxNiIsCW9uZSgweGY2MDApLAkJb25lKDB4ZmZmOCksICIrc19MIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYwOCksCQlvbmUoMHhmZmY4KSwgIl9MK3MiLCBtNjgwNDB1cCB9LAoteyJtb3ZlMTYiLAlvbmUoMHhmNjEwKSwJCW9uZSgweGZmZjgpLCAiYXNfTCIsIG02ODA0MHVwIH0sCi17Im1vdmUxNiIsCW9uZSgweGY2MTgpLAkJb25lKDB4ZmZmOCksICJfTGFzIiwgbTY4MDQwdXAgfSwKLQotICAvKiBGSVhNRTogYWRkIE1BTSBtb2RlIChgJicgYWZ0ZXIgPGVhPiBvcGVyYW5kKSAvIHJlbW92ZSBNU0FDTSAqLwoteyJtc2FjdyIsICB0d28oMDEyMDAwMCwgMDAwMDQwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgInVNdW0iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAwMDAsIDAwMDE0MDApLCB0d28oMDE3MDY2MCwgMDAwNTQwMCksICJ1TXVtTWgiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyMjAsIDAwMDA0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDIzMCwgMDAwMDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8rc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjQwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51by1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyNTAsIDAwMDA0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDIyMCwgMDAwMTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyMzAsIDAwMDE0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgrc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjQwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDI1MCwgMDAwMTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyMjAsIDAwMDA0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDIzMCwgMDAwMDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8rc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjQwLCAwMDAwNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51by1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyNTAsIDAwMDA0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDIyMCwgMDAwMTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyMzAsIDAwMDE0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgrc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjQwLCAwMDAxNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDI1MCwgMDAwMTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJtc2FjbCIsICB0d28oMDEyMDAwMCwgMDAwNDQwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgIlJzUm0iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAwMDAsIDAwMDU0MDApLCB0d28oMDE3MDY2MCwgMDAwNTQwMCksICJSc1JtTWgiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyMjAsIDAwMDQ0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDIzMCwgMDAwNDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjErc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjQwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMS1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyNTAsIDAwMDQ0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDIyMCwgMDAwNTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyMzAsIDAwMDU0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgrc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjQwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDI1MCwgMDAwNTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyMjAsIDAwMDQ0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDIzMCwgMDAwNDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjErc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjQwLCAwMDA0NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMS1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyNTAsIDAwMDQ0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDIyMCwgMDAwNTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyMzAsIDAwMDU0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgrc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjQwLCAwMDA1NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDI1MCwgMDAwNTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJtdWxzdyIsCW9uZSgwMTQwNzAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cHxtY2YgfSwKLXsibXVsc2wiLAl0d28oMDA0NjAwMCwwMDQwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDEiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAicXNEMSIsIG1jZiB9LAoteyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNjAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEM0QxIixtNjgwMjB1cHxjcHUzMiB9LAotCi17Im11bHV3IiwJb25lKDAxNDAzMDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwfG1jZiB9LAoteyJtdWx1bCIsCXR3bygwMDQ2MDAwLDAwMDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17Im11bHVsIiwJdHdvKDAwNDYwMDAsMDAwMDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICJxc0QxIiwgbWNmIH0sCi17Im11bHVsIiwJdHdvKDAwNDYwMDAsMDAyMDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICI7bEQzRDEiLG02ODAyMHVwfGNwdTMyIH0sCi0KLXsibmJjZCIsCW9uZSgwMDQ0MDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAotCi17Im5lZ2IiLAlvbmUoMDA0MjAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVndyIsCW9uZSgwMDQyMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWdsIiwJb25lKDAwNDIyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ2wiLAlvbmUoMDA0MjIwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmfSwKLQoteyJuZWd4YiIsCW9uZSgwMDQwMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd4dyIsCW9uZSgwMDQwMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd4bCIsCW9uZSgwMDQwMjAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd4bCIsCW9uZSgwMDQwMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Z9LAotCi17Im5vcCIsCQlvbmUoMDA0NzE2MSksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAwMHVwIHwgbWNmfSwKLQoteyJub3RiIiwJb25lKDAwNDMwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5vdHciLAlvbmUoMDA0MzEwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibm90bCIsCW9uZSgwMDQzMjAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJub3RsIiwJb25lKDAwNDMyMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZn0sCi0KLXsib3JpYiIsCW9uZSgwMDAwMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17Im9yaWIiLAlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJvcml3IiwJb25lKDAwMDAxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsib3JpdyIsCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17Im9yaWwiLAlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJvcmlsIiwJb25lKDAwMDAyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17Im9yaSIsCQlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJvcmkiLAkJb25lKDAwMDAxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsib3JpIiwJCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBvciBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBvcmkgaW5zdHJ1Y3Rpb24uICAqLwoteyJvcmIiLAkJb25lKDAwMDAwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsib3JiIiwJCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yYiIsCQlvbmUoMDEwMDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoteyJvcmIiLAkJb25lKDAxMDA0MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsib3J3IiwJCW9uZSgwMDAwMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17Im9ydyIsCQlvbmUoMDAwMDE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAxMDAxMDApLAlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLXsib3J3IiwJCW9uZSgwMTAwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi17Im9ybCIsCQlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJvcmwiLAkJb25lKDAwMDAyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17Im9ybCIsCQlvbmUoMDEwMDIwMCksCW9uZSgwMTcwNzAwKSwgIjtsRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJvcmwiLAkJb25lKDAxMDA2MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsib3IiLAkJb25lKDAwMDAwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsib3IiLAkJb25lKDAwMDAxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsib3IiLAkJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsib3IiLAkJb25lKDAxMDAxMDApLAlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLXsib3IiLAkJb25lKDAxMDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLQoteyJwYWNrIiwJb25lKDAxMDA1MDApLAlvbmUoMDE3MDc3MCksICJEc0RkI3ciLCBtNjgwMjB1cCB9LAoteyJwYWNrIiwJb25lKDAxMDA1MTApLAlvbmUoMDE3MDc3MCksICItcy1kI3ciLCBtNjgwMjB1cCB9LAotCi17InBiYWMiLAlvbmUoMHhmMDg3KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJhY3ciLAlvbmUoMHhmMDg3KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJhcyIsCW9uZSgweGYwODYpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmFzdyIsCW9uZSgweGYwODYpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmJjIiwJb25lKDB4ZjA4MSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiYmN3IiwJb25lKDB4ZjA4MSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiYnMiLAlvbmUoMHhmMDgwKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJic3ciLAlvbmUoMHhmMDgwKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJjYyIsCW9uZSgweGYwOGYpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmNjdyIsCW9uZSgweGYwOGYpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmNzIiwJb25lKDB4ZjA4ZSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiY3N3IiwJb25lKDB4ZjA4ZSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiZ2MiLAlvbmUoMHhmMDhkKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJnY3ciLAlvbmUoMHhmMDhkKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJncyIsCW9uZSgweGYwOGMpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmdzdyIsCW9uZSgweGYwOGMpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmljIiwJb25lKDB4ZjA4YiksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiaWN3IiwJb25lKDB4ZjA4YiksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiaXMiLAlvbmUoMHhmMDhhKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJpc3ciLAlvbmUoMHhmMDhhKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJsYyIsCW9uZSgweGYwODMpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmxjdyIsCW9uZSgweGYwODMpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmxzIiwJb25lKDB4ZjA4MiksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBibHN3IiwJb25lKDB4ZjA4MiksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBic2MiLAlvbmUoMHhmMDg1KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJzY3ciLAlvbmUoMHhmMDg1KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJzcyIsCW9uZSgweGYwODQpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYnNzdyIsCW9uZSgweGYwODQpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYndjIiwJb25lKDB4ZjA4OSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBid2N3IiwJb25lKDB4ZjA4OSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBid3MiLAlvbmUoMHhmMDg4KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJ3c3ciLAlvbmUoMHhmMDg4KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLQoteyJwZGJhYyIsCXR3bygweGYwNDgsIDB4MDAwNyksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmFzIiwJdHdvKDB4ZjA0OCwgMHgwMDA2KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiYmMiLAl0d28oMHhmMDQ4LCAweDAwMDEpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJicyIsCXR3bygweGYwNDgsIDB4MDAwMCksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmNjIiwJdHdvKDB4ZjA0OCwgMHgwMDBmKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiY3MiLAl0d28oMHhmMDQ4LCAweDAwMGUpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJnYyIsCXR3bygweGYwNDgsIDB4MDAwZCksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmdzIiwJdHdvKDB4ZjA0OCwgMHgwMDBjKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiaWMiLAl0d28oMHhmMDQ4LCAweDAwMGIpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJpcyIsCXR3bygweGYwNDgsIDB4MDAwYSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmxjIiwJdHdvKDB4ZjA0OCwgMHgwMDAzKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRibHMiLAl0d28oMHhmMDQ4LCAweDAwMDIpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJzYyIsCXR3bygweGYwNDgsIDB4MDAwNSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYnNzIiwJdHdvKDB4ZjA0OCwgMHgwMDA0KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRid2MiLAl0d28oMHhmMDQ4LCAweDAwMDkpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJ3cyIsCXR3bygweGYwNDgsIDB4MDAwOCksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi0KLXsicGVhIiwJCW9uZSgwMDQ0MTAwKSwJCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXB8bWNmIH0sCi0KLXsicGZsdXNoYSIsCW9uZSgweGY1MTgpLAkJb25lKDB4ZmZmOCksICIiLCBtNjgwNDB1cCB9LAoteyJwZmx1c2hhIiwJdHdvKDB4ZjAwMCwweDI0MDApLCB0d28oMHhmZmZmLDB4ZmZmZiksICIiLCBtNjgwMzAgfCBtNjg4NTEgfSwKLQoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzMDEwKSwgdHdvKDB4ZmZjMCwweGZlMTApLCAiVDNUOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzgxMCksIHR3bygweGZmYzAsMHhmZTEwKSwgIlQzVDkmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzAwOCksIHR3bygweGZmYzAsMHhmZTE4KSwgIkQzVDkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDM4MDgpLCB0d28oMHhmZmMwLDB4ZmUxOCksICJEM1Q5JnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDMwMDApLCB0d28oMHhmZmMwLDB4ZmUxZSksICJmM1Q5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzODAwKSwgdHdvKDB4ZmZjMCwweGZlMWUpLCAiZjNUOSZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLAlvbmUoMHhmNTA4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNDB1cCB9LAoteyJwZmx1c2giLAlvbmUoMHhmNTA4KSwJCW9uZSgweGZmZjgpLCAiQXMiLCBtNjgwNDB1cCB9LAotCi17InBmbHVzaGFuIiwJb25lKDB4ZjUxMCksCQlvbmUoMHhmZmY4KSwgIiIsIG02ODA0MHVwIH0sCi17InBmbHVzaG4iLAlvbmUoMHhmNTAwKSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNDB1cCB9LAoteyJwZmx1c2huIiwJb25lKDB4ZjUwMCksCQlvbmUoMHhmZmY4KSwgIkFzIiwgbTY4MDQwdXAgfSwKLQoteyJwZmx1c2hyIiwJdHdvKDB4ZjAwMCwgMHhhMDAwKSwgdHdvKDB4ZmZjMCwgMHhmZmZmKSwgInxzIiwgbTY4ODUxIH0sCi0KLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQxMCksIHR3bygweGZmZjgsIDB4ZmUxMCksICJUM1Q5IiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMTApLCB0d28oMHhmZmY4LCAweGZlMTApLCAiVDNUOSZzIiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MDgpLCB0d28oMHhmZmY4LCAweGZlMTgpLCAiRDNUOSIsIG02ODg1MSB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzA4KSwgdHdvKDB4ZmZmOCwgMHhmZTE4KSwgIkQzVDkmcyIsIG02ODg1MSB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDAwKSwgdHdvKDB4ZmZmOCwgMHhmZTFlKSwgImYzVDkiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MwMCksIHR3bygweGZmZjgsIDB4ZmUxZSksICJmM1Q5JnMiLCBtNjg4NTEgfSwKLQoteyJwbG9hZHIiLCAgICAgdHdvKDB4ZjAwMCwweDIyMTApLCB0d28oMHhmZmMwLDB4ZmZmMCksICJUMyZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbG9hZHIiLCAgICAgdHdvKDB4ZjAwMCwweDIyMDgpLCB0d28oMHhmZmMwLDB4ZmZmOCksICJEMyZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbG9hZHIiLCAgICAgdHdvKDB4ZjAwMCwweDIyMDApLCB0d28oMHhmZmMwLDB4ZmZmZSksICJmMyZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbG9hZHciLCAgICAgdHdvKDB4ZjAwMCwweDIwMTApLCB0d28oMHhmZmMwLDB4ZmZmMCksICJUMyZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbG9hZHciLCAgICAgdHdvKDB4ZjAwMCwweDIwMDgpLCB0d28oMHhmZmMwLDB4ZmZmOCksICJEMyZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbG9hZHciLCAgICAgdHdvKDB4ZjAwMCwweDIwMDApLCB0d28oMHhmZmMwLDB4ZmZmZSksICJmMyZzIiwgbTY4MDMwfG02ODg1MSB9LAotCi17InBscGFyIiwJb25lKDB4ZjVjOCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDYwIH0sCi17InBscGF3IiwJb25lKDB4ZjU4OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDYwIH0sCi0KLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MDAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiKmwwOCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg1YzAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiKncxOCIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQwMDApLCB0d28oMHhmZmMwLDB4ZTNmZiksICIqYjI4IiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDIwMCksIHR3bygweGZmYzAsMHhmZmZmKSwgIjA4JXMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NWUwMCksIHR3bygweGZmYzAsMHhmZmZmKSwgIjE4JXMiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MjAwKSwgdHdvKDB4ZmZjMCwweGUzZmYpLCAiMjglcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQwMDApLCB0d28oMHhmZmMwLDB4ZTNmZiksICJ8c1c4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQyMDApLCB0d28oMHhmZmMwLDB4ZTNmZiksICJXOH5zIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYyMDApLCB0d28oMHhmZmMwLDB4ZTNlMyksICIqd1gzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjAwMCksIHR3bygweGZmYzAsMHhlM2UzKSwgIlgzJXMiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2MDAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiKndZOCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2MjAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiWTglcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2NjAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiWjglcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDA4MDApLCB0d28oMHhmZmMwLDB4ZmJmZiksICIqbDM4IiwgbTY4MDMwIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4MGEwMCksIHR3bygweGZmYzAsMHhmYmZmKSwgIjM4JXMiLCBtNjgwMzAgfSwKLQoteyJwbW92ZWZkIiwJdHdvKDB4ZjAwMCwgMHg0MTAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwgIipsMDgiLCBtNjgwMzAgfSwKLXsicG1vdmVmZCIsCXR3bygweGYwMDAsIDB4NDEwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksICJ8c1c4IiwgbTY4MDMwIH0sCi17InBtb3ZlZmQiLAl0d28oMHhmMDAwLCAweDA5MDApLAl0d28oMHhmZmMwLCAweGZiZmYpLCAiKmwzOCIsIG02ODAzMCB9LAotCi17InByZXN0b3JlIiwJb25lKDB4ZjE0MCksCQlvbmUoMHhmZmMwKSwgIjxzIiwgbTY4ODUxIH0sCi0KLXsicHNhdmUiLAlvbmUoMHhmMTAwKSwJCW9uZSgweGZmYzApLCAiPnMiLCBtNjg4NTEgfSwKLQoteyJwc2FjIiwJdHdvKDB4ZjA0MCwgMHgwMDA3KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzYXMiLAl0d28oMHhmMDQwLCAweDAwMDYpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNiYyIsCXR3bygweGYwNDAsIDB4MDAwMSksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2JzIiwJdHdvKDB4ZjA0MCwgMHgwMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzY2MiLAl0d28oMHhmMDQwLCAweDAwMGYpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNjcyIsCXR3bygweGYwNDAsIDB4MDAwZSksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2djIiwJdHdvKDB4ZjA0MCwgMHgwMDBkKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzZ3MiLAl0d28oMHhmMDQwLCAweDAwMGMpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNpYyIsCXR3bygweGYwNDAsIDB4MDAwYiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2lzIiwJdHdvKDB4ZjA0MCwgMHgwMDBhKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzbGMiLAl0d28oMHhmMDQwLCAweDAwMDMpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNscyIsCXR3bygweGYwNDAsIDB4MDAwMiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc3NjIiwJdHdvKDB4ZjA0MCwgMHgwMDA1KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzc3MiLAl0d28oMHhmMDQwLCAweDAwMDQpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHN3YyIsCXR3bygweGYwNDAsIDB4MDAwOSksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc3dzIiwJdHdvKDB4ZjA0MCwgMHgwMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi0KLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgyMTApLCB0d28oMHhmZmMwLCAweGUzZjApLCAiVDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODMxMCksIHR3bygweGZmYzAsMHhlMzEwKSwgIlQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIwOCksIHR3bygweGZmYzAsMHhlM2Y4KSwgIkQzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgzMDgpLCB0d28oMHhmZmMwLDB4ZTMxOCksICJEMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgyMDApLCB0d28oMHhmZmMwLDB4ZTNmZSksICJmMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MzAwKSwgdHdvKDB4ZmZjMCwweGUzMWUpLCAiZjMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsCW9uZSgweGY1NjgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MCB9LAotCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MDEwKSwgdHdvKDB4ZmZjMCwweGUzZjApLCAiVDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODExMCksIHR3bygweGZmYzAsMHhlMzEwKSwgIlQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODAwOCksIHR3bygweGZmYzAsMHhlM2Y4KSwgIkQzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgxMDgpLCB0d28oMHhmZmMwLDB4ZTMxOCksICJEMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgwMDApLCB0d28oMHhmZmMwLDB4ZTNmZSksICJmMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MTAwKSwgdHdvKDB4ZmZjMCwweGUzMWUpLCAiZjMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsCW9uZSgweGY1NDgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MCB9LAotCi17InB0cmFwYWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwYWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwYWMiLAl0d28oMHhmMDdjLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGFzdyIsCXR3bygweGYwN2EsIDB4MDAwNiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGFzbCIsCXR3bygweGYwN2IsIDB4MDAwNiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGFzIiwJdHdvKDB4ZjA3YywgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBiY3ciLAl0d28oMHhmMDdhLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBiY2wiLAl0d28oMHhmMDdiLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBiYyIsCXR3bygweGYwN2MsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwYnN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwYnNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwYnMiLAl0d28oMHhmMDdjLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGNjdyIsCXR3bygweGYwN2EsIDB4MDAwZiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGNjbCIsCXR3bygweGYwN2IsIDB4MDAwZiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGNjIiwJdHdvKDB4ZjA3YywgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBjc3ciLAl0d28oMHhmMDdhLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBjc2wiLAl0d28oMHhmMDdiLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBjcyIsCXR3bygweGYwN2MsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwZ2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwZ2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwZ2MiLAl0d28oMHhmMDdjLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGdzdyIsCXR3bygweGYwN2EsIDB4MDAwYyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGdzbCIsCXR3bygweGYwN2IsIDB4MDAwYyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGdzIiwJdHdvKDB4ZjA3YywgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBpY3ciLAl0d28oMHhmMDdhLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBpY2wiLAl0d28oMHhmMDdiLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBpYyIsCXR3bygweGYwN2MsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwaXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwaXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwaXMiLAl0d28oMHhmMDdjLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGxjdyIsCXR3bygweGYwN2EsIDB4MDAwMyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGxjbCIsCXR3bygweGYwN2IsIDB4MDAwMyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGxjIiwJdHdvKDB4ZjA3YywgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBsc3ciLAl0d28oMHhmMDdhLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBsc2wiLAl0d28oMHhmMDdiLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBscyIsCXR3bygweGYwN2MsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwc2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwc2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwc2MiLAl0d28oMHhmMDdjLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcHNzdyIsCXR3bygweGYwN2EsIDB4MDAwNCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcHNzbCIsCXR3bygweGYwN2IsIDB4MDAwNCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcHNzIiwJdHdvKDB4ZjA3YywgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXB3Y3ciLAl0d28oMHhmMDdhLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXB3Y2wiLAl0d28oMHhmMDdiLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXB3YyIsCXR3bygweGYwN2MsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwd3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwd3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwd3MiLAl0d28oMHhmMDdjLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdWxzZSIsCW9uZSgwMDQ1MzE0KSwJCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODA2MCB8IG1jZiB9LAotCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MjgwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksICJWcyZzIiwgbTY4ODUxIH0sCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MmMwMCksCXR3bygweGZmYzAsIDB4ZmZmOCksICJBMyZzIiwgbTY4ODUxIH0sCi0KLSAgLyogRklYTUU6IGRvbid0IGFsbG93IER3PT1EeC4gKi8KLXsicmVtc2wiLCAgICAgICB0d28oMHg0YzQwLCAweDA4MDApLCAgICB0d28oMHhmZmMwLCAweDhmZjgpLCAidnNEM0QxIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17InJlbXVsIiwgICAgICAgdHdvKDB4NGM0MCwgMHgwMDAwKSwgICAgdHdvKDB4ZmZjMCwgMHg4ZmY4KSwgInZzRDNEMSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17InJlc2V0IiwJb25lKDAwNDcxNjApLAkJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDAwdXAgfSwKLQoteyJyb2xiIiwJb25lKDAxNjA0MzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvbGIiLAlvbmUoMDE2MDQ3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sdyIsCW9uZSgwMTYwNTMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2x3IiwJb25lKDAxNjA1NzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJvbHciLAlvbmUoMDE2MzcwMCksCQlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsicm9sbCIsCW9uZSgwMTYwNjMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2xsIiwJb25lKDAxNjA2NzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi0KLXsicm9yYiIsCW9uZSgwMTYwMDMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3JiIiwJb25lKDAxNjAwNzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJvcnciLAlvbmUoMDE2MDEzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9ydyIsCW9uZSgwMTYwMTcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3J3IiwJb25lKDAxNjMzMDApLAkJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17InJvcmwiLAlvbmUoMDE2MDIzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9ybCIsCW9uZSgwMTYwMjcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAotCi17InJveGxiIiwJb25lKDAxNjA0MjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveGxiIiwJb25lKDAxNjA0NjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJveGx3IiwJb25lKDAxNjA1MjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveGx3IiwJb25lKDAxNjA1NjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJveGx3IiwJb25lKDAxNjI3MDApLAkJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17InJveGxsIiwJb25lKDAxNjA2MjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveGxsIiwJb25lKDAxNjA2NjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi0KLXsicm94cmIiLAlvbmUoMDE2MDAyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94cmIiLAlvbmUoMDE2MDA2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm94cnciLAlvbmUoMDE2MDEyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94cnciLAlvbmUoMDE2MDE2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm94cnciLAlvbmUoMDE2MjMwMCksCQlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsicm94cmwiLAlvbmUoMDE2MDIyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94cmwiLAlvbmUoMDE2MDI2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJydGQiLAkJb25lKDAwNDcxNjQpLAkJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMTB1cCB9LAotCi17InJ0ZSIsCQlvbmUoMDA0NzE2MyksCQlvbmUoMDE3Nzc3NyksICIiLCAgIG02ODAwMHVwfG1jZiB9LAotCi17InJ0bSIsCQlvbmUoMDAwMzMwMCksCQlvbmUoMDE3Nzc2MCksICJScyIsIG02ODAyMCB9LAotCi17InJ0ciIsCQlvbmUoMDA0NzE2NyksCQlvbmUoMDE3Nzc3NyksICIiLCAgIG02ODAwMHVwIH0sCi0KLXsicnRzIiwJCW9uZSgwMDQ3MTY1KSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXB8bWNmIH0sCi0KLXsic2JjZCIsCW9uZSgwMTAwNDAwKSwJCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJzYmNkIiwJb25lKDAxMDA0MTApLAkJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLQoteyJzY2MiLAkJb25lKDAwNTIzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNjYyIsCQlvbmUoMDA1MjMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNjcyIsCQlvbmUoMDA1MjcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2NzIiwJCW9uZSgwMDUyNzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2VxIiwJCW9uZSgwMDUzNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZXEiLAkJb25lKDAwNTM3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzZiIsCQlvbmUoMDA1MDcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2YiLAkJb25lKDAwNTA3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzZ2UiLAkJb25lKDAwNTYzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNnZSIsCQlvbmUoMDA1NjMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNndCIsCQlvbmUoMDA1NzMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2d0IiwJCW9uZSgwMDU3MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2hpIiwJCW9uZSgwMDUxMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzaGkiLAkJb25lKDAwNTEzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzbGUiLAkJb25lKDAwNTc3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNsZSIsCQlvbmUoMDA1NzcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNscyIsCQlvbmUoMDA1MTcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2xzIiwJCW9uZSgwMDUxNzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2x0IiwJCW9uZSgwMDU2NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbHQiLAkJb25lKDAwNTY3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzbWkiLAkJb25lKDAwNTU3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNtaSIsCQlvbmUoMDA1NTcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNuZSIsCQlvbmUoMDA1MzMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic25lIiwJCW9uZSgwMDUzMzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic3BsIiwJCW9uZSgwMDU1MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzcGwiLAkJb25lKDAwNTUzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzdCIsCQlvbmUoMDA1MDMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic3QiLAkJb25lKDAwNTAzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzdmMiLAkJb25lKDAwNTQzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InN2YyIsCQlvbmUoMDA1NDMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InN2cyIsCQlvbmUoMDA1NDcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic3ZzIiwJCW9uZSgwMDU0NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLQoteyJzdG9wIiwJb25lKDAwNDcxNjIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsic3ViYWwiLAlvbmUoMDExMDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJzdWJhdyIsCW9uZSgwMTEwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi0KLXsic3ViaWIiLAlvbmUoMDAwMjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJpdyIsCW9uZSgwMDAyMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17InN1YmlsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsic3ViaWwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLQoteyJzdWJxYiIsCW9uZSgwMDUwNDAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCi17InN1YnF3IiwJb25lKDAwNTA1MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfSwKLXsic3VicWwiLAlvbmUoMDA1MDYwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi0vKiBUaGUgc3ViIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIHN1YmEsIHN1YmksIGFuZCBzdWJxIGluc3RydWN0aW9ucy4gICovCi17InN1YmIiLAlvbmUoMDA1MDQwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJiIiwJb25lKDAwMDIwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsic3ViYiIsCW9uZSgwMTEwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17InN1YmIiLAlvbmUoMDExMDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAwNTA1MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfSwKLXsic3VidyIsCW9uZSgwMDAyMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDExMDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAxMTAxMDApLAlvbmUoMDE3MDcwMCksICIqd0RkIiwgbTY4MDAwdXAgfSwKLXsic3VidyIsCW9uZSgwMTEwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi17InN1YmwiLAlvbmUoMDA1MDYwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJzdWJsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsic3VibCIsCW9uZSgwMDAyMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJzdWJsIiwJb25lKDAxMTA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsic3VibCIsCW9uZSgwMTEwMjAwKSwJb25lKDAxNzA3MDApLCAiKmxEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YmwiLAlvbmUoMDExMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17InN1YnhiIiwJb25lKDAxMTA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsic3VieGIiLAlvbmUoMDExMDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4dyIsCW9uZSgwMTEwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17InN1Ynh3IiwJb25lKDAxMTA1MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLXsic3VieGwiLAlvbmUoMDExMDYwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJzdWJ4bCIsCW9uZSgwMTEwNjEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLXsic3dhcCIsCW9uZSgwMDQ0MTAwKSwJb25lKDAxNzc3NzApLCAiRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi0vKiBzd2JlZyBhbmQgc3diZWdsIGFyZSBtYWdpYyBjb25zdGFudHMgdXNlZCBvbiBzeXNWNjguICBUaGUgY29tcGlsZXIKLSAgIGdlbmVyYXRlcyB0aGVtIGJlZm9yZSBhIHN3aXRjaCB0YWJsZS4gIFRoZXkgdGVsbCB0aGUgZGVidWdnZXIgYW5kCi0gICBkaXNhc3NlbWJsZXIgdGhhdCBhIHN3aXRjaCB0YWJsZSBmb2xsb3dzLiAgVGhlIHBhcmFtZXRlciBpcyB0aGUKLSAgIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUuICBzd2JlZyBtZWFucyB0aGF0IHRoZSBlbnRyaWVzIGluCi0gICB0aGUgdGFibGUgYXJlIHdvcmQgKDIgYnl0ZSkgc2l6ZWQsIGFuZCBzd2JlZ2wgbWVhbnMgdGhhdCB0aGUKLSAgIGVudHJpZXMgaW4gdGhlIHRhYmxlIGFyZSBsb25nd29yZCAoNCBieXRlKSBzaXplZC4gICovCi17InN3YmVnIiwJb25lKDAwNDUzNzQpLAlvbmUoMDE3Nzc3NyksICIjdyIsICAgbTY4MDAwdXAgfCBtY2YgfSwKLXsic3diZWdsIiwJb25lKDAwNDUzNzUpLAlvbmUoMDE3Nzc3NyksICIjbCIsICAgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJ0YXMiLAkJb25lKDAwNDUzMDApLAkJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAotCi0jZGVmaW5lIFRCTDEobmFtZSxzaWduZWQscm91bmQsc2l6ZSkJCQkJCVwKLSAge25hbWUsIHR3bygwMTc0MDAwLCAoc2lnbmVkPDwxMSl8KCFyb3VuZDw8MTApfChzaXplPDw2KXwwMDAwNDAwKSwJXAotICAgICB0d28oMDE3NzcwMCwwMTA3Nzc3KSwgIiFzRDEiLCBjcHUzMiB9LAkJCQlcCi0gIHtuYW1lLCB0d28oMDE3NDAwMCwgKHNpZ25lZDw8MTEpfCghcm91bmQ8PDEwKXwoc2l6ZTw8NikpLAkJXAotICAgICB0d28oMDE3Nzc3MCwwMTA3NzcwKSwgIkRzRDNEMSIsIGNwdTMyIH0KLSNkZWZpbmUgVEJMKG5hbWUxLCBuYW1lMiwgbmFtZTMsIHMsIHIpIFwKLSAgVEJMMShuYW1lMSwgcywgciwgMCksIFRCTDEobmFtZTIsIHMsIHIsIDEpLCBUQkwxKG5hbWUzLCBzLCByLCAyKQotVEJMKCJ0YmxzYiIsICJ0YmxzdyIsICJ0YmxzbCIsIDEsIDEpLAotVEJMKCJ0YmxzbmIiLCAidGJsc253IiwgInRibHNubCIsIDEsIDApLAotVEJMKCJ0Ymx1YiIsICJ0Ymx1dyIsICJ0Ymx1bCIsIDAsIDEpLAotVEJMKCJ0Ymx1bmIiLCAidGJsdW53IiwgInRibHVubCIsIDAsIDApLAotCi17InRyYXAiLAlvbmUoMDA0NzEwMCksCW9uZSgwMTc3NzYwKSwgIlRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJ0cmFwY2MiLAlvbmUoMDA1MjM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGNzIiwJb25lKDAwNTI3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBlcSIsCW9uZSgwMDUzNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwZiIsCW9uZSgwMDUwNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB8IG1jZiB9LAoteyJ0cmFwZ2UiLAlvbmUoMDA1NjM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGd0IiwJb25lKDAwNTczNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBoaSIsCW9uZSgwMDUxMzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbGUiLAlvbmUoMDA1Nzc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGxzIiwJb25lKDAwNTE3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBsdCIsCW9uZSgwMDU2Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbWkiLAlvbmUoMDA1NTc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcG5lIiwJb25lKDAwNTMzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBwbCIsCW9uZSgwMDU1Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwdCIsCW9uZSgwMDUwMzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwdmMiLAlvbmUoMDA1NDM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcHZzIiwJb25lKDAwNTQ3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsidHJhcGNjdyIsCW9uZSgwMDUyMzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwY3N3IiwJb25lKDAwNTI3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBlcXciLAlvbmUoMDA1Mzc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGZ3IiwJb25lKDAwNTA3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyfG1jZn0sCi17InRyYXBnZXciLAlvbmUoMDA1NjM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGd0dyIsCW9uZSgwMDU3MzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwaGl3IiwJb25lKDAwNTEzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsZXciLAlvbmUoMDA1Nzc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGxzdyIsCW9uZSgwMDUxNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbHR3IiwJb25lKDAwNTY3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBtaXciLAlvbmUoMDA1NTc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcG5ldyIsCW9uZSgwMDUzMzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwcGx3IiwJb25lKDAwNTUzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB0dyIsCW9uZSgwMDUwMzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdmN3IiwJb25lKDAwNTQzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB2c3ciLAlvbmUoMDA1NDc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJ0cmFwY2NsIiwJb25lKDAwNTIzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBjc2wiLAlvbmUoMDA1Mjc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGVxbCIsCW9uZSgwMDUzNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZmwiLAlvbmUoMDA1MDc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmfSwKLXsidHJhcGdlbCIsCW9uZSgwMDU2MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZ3RsIiwJb25lKDAwNTczNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBoaWwiLAlvbmUoMDA1MTM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGxlbCIsCW9uZSgwMDU3NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbHNsIiwJb25lKDAwNTE3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsdGwiLAlvbmUoMDA1Njc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcG1pbCIsCW9uZSgwMDU1NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbmVsIiwJb25lKDAwNTMzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBwbGwiLAlvbmUoMDA1NTM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHRsIiwJb25lKDAwNTAzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB2Y2wiLAlvbmUoMDA1NDM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZzbCIsCW9uZSgwMDU0NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAotCi17InRyYXB2IiwJb25lKDAwNDcxNjYpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB9LAotCi17InRzdGIiLAlvbmUoMDA0NTAwMCksCW9uZSgwMTc3NzAwKSwgIjtiIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmIH0sCi17InRzdGIiLAlvbmUoMDA0NTAwMCksCW9uZSgwMTc3NzAwKSwgIiRiIiwgbTY4MDAwdXAgfSwKLXsidHN0dyIsCW9uZSgwMDQ1MTAwKSwJb25lKDAxNzc3MDApLCAiKnciLCBtNjgwMjB1cHxjcHUzMnxtY2YgfSwKLXsidHN0dyIsCW9uZSgwMDQ1MTAwKSwJb25lKDAxNzc3MDApLCAiJHciLCBtNjgwMDB1cCB9LAoteyJ0c3RsIiwJb25lKDAwNDUyMDApLAlvbmUoMDE3NzcwMCksICIqbCIsIG02ODAyMHVwfGNwdTMyfG1jZiB9LAoteyJ0c3RsIiwJb25lKDAwNDUyMDApLAlvbmUoMDE3NzcwMCksICIkbCIsIG02ODAwMHVwIH0sCi0KLXsidW5sayIsCW9uZSgwMDQ3MTMwKSwJb25lKDAxNzc3NzApLCAiQXMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17InVucGsiLAlvbmUoMDEwMDYwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQjdyIsIG02ODAyMHVwIH0sCi17InVucGsiLAlvbmUoMDEwMDYxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQjdyIsIG02ODAyMHVwIH0sCi0KLXsid2RkYXRhYiIsCW9uZSgwMTcyMDAwKSwgICBvbmUoMDE3NzcwMCksICJ+cyIsIG1jZiB9LAoteyJ3ZGRhdGF3IiwJb25lKDAxNzIxMDApLCAgIG9uZSgwMTc3NzAwKSwgIn5zIiwgbWNmIH0sCi17IndkZGF0YWwiLAlvbmUoMDE3MjIwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2YgfSwKLQotfTsKLQotY29uc3QgaW50IG02OGtfbnVtb3Bjb2RlcyA9IHNpemVvZiBtNjhrX29wY29kZXMgLyBzaXplb2YgbTY4a19vcGNvZGVzWzBdOwotCi0vKiBUaGVzZSBhbGlhc2VzIHVzZWQgdG8gYmUgaW4gdGhlIGFib3ZlIHRhYmxlLCBlYWNoIG9uZSBkdXBsaWNhdGluZwotICAgYWxsIG9mIHRoZSBlbnRyaWVzIGZvciBpdHMgcHJpbWFyeSBleGFjdGx5LiAgVGhpcyB0YWJsZSB3YXMKLSAgIGNvbnN0cnVjdGVkIGJ5IG1lY2hhbmljYWwgcHJvY2Vzc2luZyBvZiB0aGUgb3Bjb2RlIHRhYmxlLCB3aXRoIGEKLSAgIHNtYWxsIG51bWJlciBvZiB0d2Vha3MgZG9uZSBieSBoYW5kLiAgVGhlcmUgYXJlIHByb2JhYmx5IGEgbG90IG1vcmUKLSAgIGFsaWFzZXMgYWJvdmUgdGhhdCBjb3VsZCBiZSBtb3ZlZCBkb3duIGhlcmUsIGV4Y2VwdCBmb3IgdmVyeSBtaW5vcgotICAgZGlmZmVyZW5jZXMuICAqLwotCi1jb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMgbTY4a19vcGNvZGVfYWxpYXNlc1tdID0KLXsKLSAgeyAiYWRkIiwJImFkZHciLCB9LAotICB7ICJhZGRhIiwJImFkZGF3IiwgfSwKLSAgeyAiYWRkaSIsCSJhZGRpdyIsIH0sCi0gIHsgImFkZHEiLAkiYWRkcXciLCB9LAotICB7ICJhZGR4IiwJImFkZHh3IiwgfSwKLSAgeyAiYXNsIiwJImFzbHciLCB9LAotICB7ICJhc3IiLAkiYXNydyIsIH0sCi0gIHsgImJoaSIsCSJiaGl3IiwgfSwKLSAgeyAiYmxzIiwJImJsc3ciLCB9LAotICB7ICJiY2MiLAkiYmNjdyIsIH0sCi0gIHsgImJjcyIsCSJiY3N3IiwgfSwKLSAgeyAiYm5lIiwJImJuZXciLCB9LAotICB7ICJiZXEiLAkiYmVxdyIsIH0sCi0gIHsgImJ2YyIsCSJidmN3IiwgfSwKLSAgeyAiYnZzIiwJImJ2c3ciLCB9LAotICB7ICJicGwiLAkiYnBsdyIsIH0sCi0gIHsgImJtaSIsCSJibWl3IiwgfSwKLSAgeyAiYmdlIiwJImJnZXciLCB9LAotICB7ICJibHQiLAkiYmx0dyIsIH0sCi0gIHsgImJndCIsCSJiZ3R3IiwgfSwKLSAgeyAiYmxlIiwJImJsZXciLCB9LAotICB7ICJicmEiLAkiYnJhdyIsIH0sCi0gIHsgImJzciIsCSJic3J3IiwgfSwKLSAgeyAiYmhpYiIsCSJiaGlzIiwgfSwKLSAgeyAiYmxzYiIsCSJibHNzIiwgfSwKLSAgeyAiYmNjYiIsCSJiY2NzIiwgfSwKLSAgeyAiYmNzYiIsCSJiY3NzIiwgfSwKLSAgeyAiYm5lYiIsCSJibmVzIiwgfSwKLSAgeyAiYmVxYiIsCSJiZXFzIiwgfSwKLSAgeyAiYnZjYiIsCSJidmNzIiwgfSwKLSAgeyAiYnZzYiIsCSJidnNzIiwgfSwKLSAgeyAiYnBsYiIsCSJicGxzIiwgfSwKLSAgeyAiYm1pYiIsCSJibWlzIiwgfSwKLSAgeyAiYmdlYiIsCSJiZ2VzIiwgfSwKLSAgeyAiYmx0YiIsCSJibHRzIiwgfSwKLSAgeyAiYmd0YiIsCSJiZ3RzIiwgfSwKLSAgeyAiYmxlYiIsCSJibGVzIiwgfSwKLSAgeyAiYnJhYiIsCSJicmFzIiwgfSwKLSAgeyAiYnNyYiIsCSJic3JzIiwgfSwKLSAgeyAiYmhzIiwJImJjY3ciIH0sCi0gIHsgImJoc3MiLAkiYmNjcyIgfSwKLSAgeyAiYmhzYiIsCSJiY2NzIiB9LAotICB7ICJiaHN3IiwJImJjY3ciIH0sCi0gIHsgImJoc2wiLAkiYmNjbCIgfSwKLSAgeyAiYmxvIiwJImJjc3ciIH0sCi0gIHsgImJsb3MiLAkiYmNzcyIgfSwKLSAgeyAiYmxvYiIsCSJiY3NzIiB9LAotICB7ICJibG93IiwJImJjc3ciIH0sCi0gIHsgImJsb2wiLAkiYmNzbCIgfSwKLSAgeyAiYnIiLAkiYnJhdyIsIH0sCi0gIHsgImJycyIsCSJicmFzIiwgfSwKLSAgeyAiYnJiIiwJImJyYXMiLCB9LAotICB7ICJicnciLAkiYnJhdyIsIH0sCi0gIHsgImJybCIsCSJicmFsIiwgfSwKLSAgeyAiamZubHQiLAkiYmNjIiwgfSwJLyogYXBwYXJlbnRseSBhIHN1biBhbGlhcyAqLwotICB7ICJqZm5ndCIsCSJibGUiLCB9LAkvKiBhcHBhcmVudGx5IGEgc3VuIGFsaWFzICovCi0gIHsgImpmZXEiLAkiYmVxcyIsIH0sCS8qIGFwcGFyZW50bHkgYSBzdW4gYWxpYXMgKi8KLSAgeyAiYmNoZ2IiLAkiYmNoZyIsIH0sCi0gIHsgImJjaGdsIiwJImJjaGciLCB9LAotICB7ICJiY2xyYiIsCSJiY2xyIiwgfSwKLSAgeyAiYmNscmwiLAkiYmNsciIsIH0sCi0gIHsgImJzZXRiIiwJImJzZXQiLCB9LAotICB7ICJic2V0bCIsCSJic2V0IiwgfSwKLSAgeyAiYnRzdGIiLAkiYnRzdCIsIH0sCi0gIHsgImJ0c3RsIiwJImJ0c3QiLCB9LAotICB7ICJjYXMyIiwJImNhczJ3IiwgfSwKLSAgeyAiY2FzIiwJImNhc3ciLCB9LAotICB7ICJjaGsyIiwJImNoazJ3IiwgfSwKLSAgeyAiY2hrIiwJImNoa3ciLCB9LAotICB7ICJjbHIiLAkiY2xydyIsIH0sCi0gIHsgImNtcDIiLAkiY21wMnciLCB9LAotICB7ICJjbXBhIiwJImNtcGF3IiwgfSwKLSAgeyAiY21waSIsCSJjbXBpdyIsIH0sCi0gIHsgImNtcG0iLAkiY21wbXciLCB9LAotICB7ICJjbXAiLAkiY21wdyIsIH0sCi0gIHsgImRiY2N3IiwJImRiY2MiLCB9LAotICB7ICJkYmNzdyIsCSJkYmNzIiwgfSwKLSAgeyAiZGJlcXciLAkiZGJlcSIsIH0sCi0gIHsgImRiZnciLAkiZGJmIiwgfSwKLSAgeyAiZGJnZXciLAkiZGJnZSIsIH0sCi0gIHsgImRiZ3R3IiwJImRiZ3QiLCB9LAotICB7ICJkYmhpdyIsCSJkYmhpIiwgfSwKLSAgeyAiZGJsZXciLAkiZGJsZSIsIH0sCi0gIHsgImRibHN3IiwJImRibHMiLCB9LAotICB7ICJkYmx0dyIsCSJkYmx0IiwgfSwKLSAgeyAiZGJtaXciLAkiZGJtaSIsIH0sCi0gIHsgImRibmV3IiwJImRibmUiLCB9LAotICB7ICJkYnBsdyIsCSJkYnBsIiwgfSwKLSAgeyAiZGJ0dyIsCSJkYnQiLCB9LAotICB7ICJkYnZjdyIsCSJkYnZjIiwgfSwKLSAgeyAiZGJ2c3ciLAkiZGJ2cyIsIH0sCi0gIHsgImRiaHMiLAkiZGJjYyIsIH0sCi0gIHsgImRiaHN3IiwJImRiY2MiLCB9LAotICB7ICJkYnJhIiwJImRiZiIsIH0sCi0gIHsgImRicmF3IiwJImRiZiIsIH0sCi0gIHsgInRkaXZzbCIsCSJkaXZzbCIsIH0sCi0gIHsgImRpdnMiLAkiZGl2c3ciLCB9LAotICB7ICJkaXZ1IiwJImRpdnV3IiwgfSwKLSAgeyAiZXh0IiwJImV4dHciLCB9LAotICB7ICJleHRidyIsCSJleHR3IiwgfSwKLSAgeyAiZXh0d2wiLAkiZXh0bCIsIH0sCi0gIHsgImZibmVxIiwJImZibmUiLCB9LAotICB7ICJmYnNuZXEiLAkiZmJzbmUiLCB9LAotICB7ICJmZGJuZXEiLAkiZmRibmUiLCB9LAotICB7ICJmZGJzbmVxIiwJImZkYnNuZSIsIH0sCi0gIHsgImZtb3ZlY3IiLAkiZm1vdmVjcngiLCB9LAotICB7ICJmbW92bSIsCSJmbW92ZW0iLCB9LAotICB7ICJmc25lcSIsCSJmc25lIiwgfSwKLSAgeyAiZnNzbmVxIiwJImZzc25lIiwgfSwKLSAgeyAiZnRyYXBuZXEiLAkiZnRyYXBuZSIsIH0sCi0gIHsgImZ0cmFwc25lcSIsICJmdHJhcHNuZSIsIH0sCi0gIHsgImZqbmVxIiwJImZqbmUiLCB9LAotICB7ICJmanNuZXEiLAkiZmpzbmUiLCB9LAotICB7ICJqbXBsIiwJImptcCIsIH0sCi0gIHsgImptcHMiLAkiam1wIiwgfSwKLSAgeyAianNybCIsCSJqc3IiLCB9LAotICB7ICJqc3JzIiwJImpzciIsIH0sCi0gIHsgImxlYWwiLAkibGVhIiwgfSwKLSAgeyAibHNsIiwJImxzbHciLCB9LAotICB7ICJsc3IiLAkibHNydyIsIH0sCi0gIHsgIm1hYyIsCSJtYWN3IiB9LAotICB7ICJtb3ZlYSIsCSJtb3ZlYXciLCB9LAotICB7ICJtb3ZlbSIsCSJtb3ZlbXciLCB9LAotICB7ICJtb3ZtbCIsCSJtb3ZlbWwiLCB9LAotICB7ICJtb3ZtdyIsCSJtb3ZlbXciLCB9LAotICB7ICJtb3ZtIiwJIm1vdmVtdyIsIH0sCi0gIHsgIm1vdmVwIiwJIm1vdmVwdyIsIH0sCi0gIHsgIm1vdnB3IiwJIm1vdmVwdyIsIH0sCi0gIHsgIm1vdmVzIiwJIm1vdmVzdyIgfSwKLSAgeyAibXVscyIsCSJtdWxzdyIsIH0sCi0gIHsgIm11bHUiLAkibXVsdXciLCB9LAotICB7ICJtc2FjIiwJIm1zYWN3IiB9LAotICB7ICJuYmNkYiIsCSJuYmNkIiB9LAotICB7ICJuZWciLAkibmVndyIsIH0sCi0gIHsgIm5lZ3giLAkibmVneHciLCB9LAotICB7ICJub3QiLAkibm90dyIsIH0sCi0gIHsgInBlYWwiLAkicGVhIiwgfSwKLSAgeyAicm9sIiwJInJvbHciLCB9LAotICB7ICJyb3IiLAkicm9ydyIsIH0sCi0gIHsgInJveGwiLAkicm94bHciLCB9LAotICB7ICJyb3hyIiwJInJveHJ3IiwgfSwKLSAgeyAic2JjZGIiLAkic2JjZCIsIH0sCi0gIHsgInNjY2IiLAkic2NjIiwgfSwKLSAgeyAic2NzYiIsCSJzY3MiLCB9LAotICB7ICJzZXFiIiwJInNlcSIsIH0sCi0gIHsgInNmYiIsCSJzZiIsIH0sCi0gIHsgInNnZWIiLAkic2dlIiwgfSwKLSAgeyAic2d0YiIsCSJzZ3QiLCB9LAotICB7ICJzaGliIiwJInNoaSIsIH0sCi0gIHsgInNsZWIiLAkic2xlIiwgfSwKLSAgeyAic2xzYiIsCSJzbHMiLCB9LAotICB7ICJzbHRiIiwJInNsdCIsIH0sCi0gIHsgInNtaWIiLAkic21pIiwgfSwKLSAgeyAic25lYiIsCSJzbmUiLCB9LAotICB7ICJzcGxiIiwJInNwbCIsIH0sCi0gIHsgInN0YiIsCSJzdCIsIH0sCi0gIHsgInN2Y2IiLAkic3ZjIiwgfSwKLSAgeyAic3ZzYiIsCSJzdnMiLCB9LAotICB7ICJzZmdlIiwJInNnZSIsIH0sCi0gIHsgInNmZ3QiLAkic2d0IiwgfSwKLSAgeyAic2ZsZSIsCSJzbGUiLCB9LAotICB7ICJzZmx0IiwJInNsdCIsIH0sCi0gIHsgInNmbmVxIiwJInNuZSIsIH0sCi0gIHsgInN1YmEiLAkic3ViYXciLCB9LAotICB7ICJzdWJpIiwJInN1Yml3IiwgfSwKLSAgeyAic3VicSIsCSJzdWJxdyIsIH0sCi0gIHsgInN1YiIsCSJzdWJ3IiwgfSwKLSAgeyAic3VieCIsCSJzdWJ4dyIsIH0sCi0gIHsgInN3YXB3IiwJInN3YXAiLCB9LAotICB7ICJ0YXNiIiwJInRhcyIsIH0sCi0gIHsgInRwY2MiLAkidHJhcGNjIiwgfSwKLSAgeyAidGNjIiwJInRyYXBjYyIsIH0sCi0gIHsgInRzdCIsCSJ0c3R3IiwgfSwKLSAgeyAiamJyYSIsCSJqcmEiLCB9LAotICB7ICJqYmhpIiwJImpoaSIsIH0sCi0gIHsgImpibHMiLAkiamxzIiwgfSwKLSAgeyAiamJjYyIsCSJqY2MiLCB9LAotICB7ICJqYmNzIiwJImpjcyIsIH0sCi0gIHsgImpibmUiLAkiam5lIiwgfSwKLSAgeyAiamJlcSIsCSJqZXEiLCB9LAotICB7ICJqYnZjIiwJImp2YyIsIH0sCi0gIHsgImpidnMiLAkianZzIiwgfSwKLSAgeyAiamJwbCIsCSJqcGwiLCB9LAotICB7ICJqYm1pIiwJImptaSIsIH0sCi0gIHsgImpiZ2UiLAkiamdlIiwgfSwKLSAgeyAiamJsdCIsCSJqbHQiLCB9LAotICB7ICJqYmd0IiwJImpndCIsIH0sCi0gIHsgImpibGUiLAkiamxlIiwgfSwKLSAgeyAibW92cWwiLAkibW92ZXEiLCB9LAotICB7ICJtb3ZlcWwiLAkibW92ZXEiLCB9LAotICB7ICJtb3ZsIiwJIm1vdmVsIiwgfSwKLSAgeyAibW92cSIsCSJtb3ZlcSIsIH0sCi0gIHsgIm1vdmFsIiwJIm1vdmVhbCIsIH0sCi0gIHsgIm1vdmF3IiwJIm1vdmVhdyIsIH0sCi0gIHsgIm1vdmIiLAkibW92ZWIiLCB9LAotICB7ICJtb3ZjIiwJIm1vdmVjIiwgfSwKLSAgeyAibW92ZWNsIiwJIm1vdmVjIiwgfSwKLSAgeyAibW92cGwiLAkibW92ZXBsIiwgfSwKLSAgeyAibW92dyIsCSJtb3ZldyIsIH0sCi0gIHsgIm1vdnNiIiwJIm1vdmVzYiIsIH0sCi0gIHsgIm1vdnNsIiwJIm1vdmVzbCIsIH0sCi0gIHsgIm1vdnN3IiwJIm1vdmVzdyIsIH0sCi0KLSAgeyAidGRpdnVsIiwJImRpdnVsIiwgfSwJLyogZm9yIG02OGstc3ZyNCAqLwotICB7ICJmbW92YiIsCSJmbW92ZWIiLCB9LAotICB7ICJmc21vdmIiLAkiZnNtb3ZlYiIsIH0sCi0gIHsgImZkbW92YiIsCSJmZG1vdmViIiwgfSwKLSAgeyAiZm1vdmQiLAkiZm1vdmVkIiwgfSwKLSAgeyAiZnNtb3ZkIiwJImZzbW92ZWQiLCB9LAotICB7ICJmbW92bCIsCSJmbW92ZWwiLCB9LAotICB7ICJmc21vdmwiLAkiZnNtb3ZlbCIsIH0sCi0gIHsgImZkbW92bCIsCSJmZG1vdmVsIiwgfSwKLSAgeyAiZm1vdnAiLAkiZm1vdmVwIiwgfSwKLSAgeyAiZnNtb3ZwIiwJImZzbW92ZXAiLCB9LAotICB7ICJmZG1vdnAiLAkiZmRtb3ZlcCIsIH0sCi0gIHsgImZtb3ZzIiwJImZtb3ZlcyIsIH0sCi0gIHsgImZzbW92cyIsCSJmc21vdmVzIiwgfSwKLSAgeyAiZmRtb3ZzIiwJImZkbW92ZXMiLCB9LAotICB7ICJmbW92dyIsCSJmbW92ZXciLCB9LAotICB7ICJmc21vdnciLAkiZnNtb3ZldyIsIH0sCi0gIHsgImZkbW92dyIsCSJmZG1vdmV3IiwgfSwKLSAgeyAiZm1vdngiLAkiZm1vdmV4IiwgfSwKLSAgeyAiZnNtb3Z4IiwJImZzbW92ZXgiLCB9LAotICB7ICJmZG1vdngiLAkiZmRtb3ZleCIsIH0sCi0gIHsgImZtb3ZjciIsCSJmbW92ZWNyIiwgfSwKLSAgeyAiZm1vdmNyeCIsCSJmbW92ZWNyeCIsIH0sCi0gIHsgImZ0ZXN0YiIsCSJmdHN0YiIsIH0sCi0gIHsgImZ0ZXN0ZCIsCSJmdHN0ZCIsIH0sCi0gIHsgImZ0ZXN0bCIsCSJmdHN0bCIsIH0sCi0gIHsgImZ0ZXN0cCIsCSJmdHN0cCIsIH0sCi0gIHsgImZ0ZXN0cyIsCSJmdHN0cyIsIH0sCi0gIHsgImZ0ZXN0dyIsCSJmdHN0dyIsIH0sCi0gIHsgImZ0ZXN0eCIsCSJmdHN0eCIsIH0sCi19OwotCi1jb25zdCBpbnQgbTY4a19udW1hbGlhc2VzID0KLSAgc2l6ZW9mIG02OGtfb3Bjb2RlX2FsaWFzZXMgLyBzaXplb2YgbTY4a19vcGNvZGVfYWxpYXNlc1swXTsKZGlmZiAtLWdpdCBhL29wY29kZXMvbTg4ay1kaXMuYyBiL29wY29kZXMvbTg4ay1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmNmI4Ny4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL204OGstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyogUHJpbnQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgTW90b3JvbGEgODgwMDAsIGZvciBHREIgYW5kIEdOVSBCaW51dGlscy4KLSAgIENvcHlyaWdodCAoYykgMTk4NiwgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXRhIEdlbmVyYWwgQ29ycG9yYXRpb24sIE5vdmVtYmVyIDE5ODkuCi0gICBQYXJ0aWFsbHkgZGVyaXZlZCBmcm9tIGFuIGVhcmxpZXIgcHJpbnRjbWQuYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCIGFuZCB0aGUgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9tODhrLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLUlOU1RBQiAgKmhhc2h0YWJsZVtIQVNIVkFMXSA9IHswfTsKLQotc3RhdGljIGludAotbTg4a2RpcyBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludG9wIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIE9QU1BFQyAqLAotCQkgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1pbml0X2Rpc2FzbSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1pbnN0YWxsIFBBUkFNUyAoKElOU1RBQiAqaW5zdHB0cikpOwotCi0vKgotKgkJRGlzYXNzZW1ibGUgYW4gTTg4MDAwIEluc3RydWN0aW9uCi0qCi0qCi0qICAgICAgIFRoaXMgbW9kdWxlIGRlY29kZXMgdGhlIGluc3RydWN0aW9uIGF0IG1lbWFkZHIuCi0qCi0qCQkJUmV2aXNpb24gSGlzdG9yeQotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUgYnkgTW90b3JvbGEKLSoJCQkwNS8xMS84OQlSLiBUcmF3aWNrIGFkYXB0ZWQgdG8gR0RCIGludGVyZmFjZS4KLSoJCQkwNy8xMi85MwlJYW4gTGFuY2UgVGF5bG9yIHVwZGF0ZWQgdG8KLSoJCQkJCWJpbnV0aWxzIGludGVyZmFjZS4KLSovCi0KLWludAotcHJpbnRfaW5zbl9tODhrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLSAgLyogSW5zdHJ1Y3Rpb24gYWRkcmVzc2VzIG1heSBoYXZlIGxvdyB0d28gYml0cyBzZXQuIENsZWFyIHRoZW0uCSovCi0gIG1lbWFkZHIgJj1+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+b3Bjb2RlKSAlIEhBU0hWQUw7Ci0gIGluc3RwdHItPm5leHQgPSBoYXNodGFibGVbaV07Ci0gIGhhc2h0YWJsZVtpXSA9IGluc3RwdHI7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL21ha2VmaWxlLnZtcyBiL29wY29kZXMvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg3MDQ4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgbGlib3Bjb2RlcyB1bmRlciBvcGVuVk1TIFZBWCBhbmQgQWxwaGEKLSMKLSMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcHJvZ2lzLmRlCi0jCi0jCi1pZmVxICgkKEFSQ0gpLGFscGhhKQotT0JKUz1hbHBoYS1kaXMub2JqLGFscGhhLW9wYy5vYmosZGlzLWJ1Zi5vYmosZGlzYXNzZW1ibGUub2JqCi1GT1JNQVQ9T0JKX0VWQVgKLUFSQ0hERUY9IkFSQ0hfYWxwaGEiCi1lbHNlCi1PQkpTPXZheC1kaXMub2JqLGRpcy1idWYub2JqLGRpc2Fzc2VtYmxlLm9iagotRk9STUFUPU9CSl9WQVgKLUFSQ0hERUY9IkFSQ0hfdmF4IgotZW5kaWYKLQotaWZlcSAoJChDQyksZ2NjKQotREVGUz0vZGVmaW5lPSgkKEZPUk1BVCkpCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKQotZWxzZQotREVGUz0vZGVmaW5lPSgkKEZPUk1BVCksImNvbnN0PSIpCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKVwKLS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxsb25nZXh0ZXJuKQotZW5kaWYKLQotbGlib3Bjb2Rlcy5vbGI6IHN5c2RlcC5oICQoT0JKUykKLQlwdXJnZQotCWxpYi9jcmVhdGUgbGlib3Bjb2RlcyAqLm9iagotCi1kaXNhc3NlbWJsZS5vYmo6IGRpc2Fzc2VtYmxlLmMKLQkkKENDKSQoQ0ZMQUdTKS9kZWZpbmU9KCQoQVJDSERFRikpICQ8Ci0KLXN5c2RlcC5oOiBbLS5iZmQuaG9zdHNdJChBUkNIKXZtcy5oCi0JJChDUCkgJDwgJEAKLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSBzeXNkZXAuaDsKLQkkKFJNKSBsaWJvcGNvZGVzLm9sYjsKZGlmZiAtLWdpdCBhL29wY29kZXMvbWNvcmUtZGlzLmMgYi9vcGNvZGVzL21jb3JlLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTNkZTY4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWNvcmUtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgTW90b3JvbGxhIE0qQ29yZSBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBTVEFUSUNfVEFCTEUKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0KLSNpbmNsdWRlICJtY29yZS1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLS8qIE1hc2sgZm9yIGVhY2ggbWNvcmVfb3BjbGFzczogKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbXNrW10gPQotewotICAgIC8qIE8wICAqLyAweEZGRkYsCi0gICAgLyogT1QgICovIDB4RkZGQywKLSAgICAvKiBPMSAgKi8gMHhGRkYwLAotICAgIC8qIE9DICAqLyAweEZGRTAsCi0gICAgLyogTzIgICovIDB4RkYwMCwKLSAgICAvKiBYMSAgKi8gMHhGRkYwLAotICAgIC8qIE9JICAqLyAweEZFMDAsCi0gICAgLyogT0IgICovIDB4RkUwMCwKLQkgICAgICAKLSAgICAvKiBPTWEgKi8gMHhGRkYwLAotICAgIC8qIFNJICAqLyAweEZFMDAsCi0gICAgLyogSTcgICovIDB4RjgwMCwKLSAgICAvKiBMUyAgKi8gMHhGMDAwLAotICAgIC8qIEJSICAqLyAweEY4MDAsCi0gICAgLyogQkwgICovIDB4RkYwMCwKLSAgICAvKiBMUiAgKi8gMHhGMDAwLAotICAgIC8qIExKICAqLyAweEZGMDAsCi0JICAgICAgCi0gICAgLyogUk0gICovIDB4RkZGMCwKLSAgICAvKiBSUSAgKi8gMHhGRkYwLAotICAgIC8qIEpTUiAqLyAweEZGRjAsCi0gICAgLyogSk1QICovIDB4RkZGMCwKLSAgICAvKiBPQlJhKi8gMHhGRkYwLAotICAgIC8qIE9CUmIqLyAweEZGODAsCi0gICAgLyogT0JSYyovIDB4RkYwMCwKLSAgICAvKiBPQlIyKi8gMHhGRTAwLAotCSAgICAgIAotICAgIC8qIE8xUjEqLyAweEZGRjAsCi0gICAgLyogT01iICovIDB4RkY4MCwKLSAgICAvKiBPTWMgKi8gMHhGRjAwLAotICAgIC8qIFNJYSAqLyAweEZFMDAsCi0KLSAgICAvKiBKQyAgKi8gMCwJCS8qIEpDLEpVLEpMIGRvbid0IGFwcGVhciBpbiBvYmplY3QgKi8KLSAgICAvKiBKVSAgKi8gMCwKLSAgICAvKiBKTCAgKi8gMCwKLSAgICAvKiBSU0kgKi8gMCwKLSAgICAvKiBETzIxKi8gMCwKLSAgICAvKiBPQjIgKi8gMCAJCS8qIE9CMiB3b24ndCBhcHBlYXIgaW4gb2JqZWN0LiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBncm5hbWVbXSA9Ci17Ci0gInIwIiwgICJyMSIsICAicjIiLCAgInIzIiwgICJyNCIsICAicjUiLCAgInI2IiwgICJyNyIsCi0gInI4IiwgICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIFhbXSA9ICI/PyI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY3JuYW1lW10gPQotewotICAicHNyIiwgICJ2YnIiLCAiZXBzciIsICJmcHNyIiwgImVwYyIsICAiZnBjIiwgICJzczAiLCAgInNzMSIsCi0gICJzczIiLCAgInNzMyIsICJzczQiLCAgImdjciIsICAiZ3NyIiwgICAgIFgsICAgICAgWCwgICAgICBYLAotICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICBYLCAgICAgIFgsICAgICAgWCwKLSAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgWCwgICAgICBYLCAgICAgIFgKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpc2l6W10gPSB7IDIsIDAsIDEsIDAgfTsKLQotaW50IAotcHJpbnRfaW5zbl9tY29yZSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICAgICAgaWJ5dGVzWzRdOwotICBmcHJpbnRmX2Z0eXBlICAgICAgIGZwcmludGYgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKiAgICAgICAgICAgICAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICB1bnNpZ25lZCBzaG9ydCAgICAgIGluc3Q7Ci0gIG1jb3JlX29wY29kZV9pbmZvICogb3A7Ci0gIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0KLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgaWJ5dGVzLCAyLCBpbmZvKTsKLQotICBpZiAoc3RhdHVzICE9IDApIAotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGluc3QgPSAoaWJ5dGVzWzBdIDw8IDgpIHwgaWJ5dGVzWzFdOwotCi0gIC8qIEp1c3QgYSBsaW5lYXIgc2VhcmNoIG9mIHRoZSB0YWJsZS4gICovCi0gIGZvciAob3AgPSBtY29yZV90YWJsZTsgb3AtPm5hbWUgIT0gMDsgb3AgKyspCi0gICAgaWYgKG9wLT5pbnN0ID09IChpbnN0ICYgaW1za1tvcC0+b3BjbGFzc10pKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKG9wLT5uYW1lID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiLnNob3J0IDB4JTA0eCIsIGluc3QpOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIG5hbWUgPSBncm5hbWVbaW5zdCAmIDB4MEZdOwotICAgICAgCi0gICAgICBmcHJpbnRmIChzdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKLSAgICAgIAotICAgICAgc3dpdGNoIChvcC0+b3BjbGFzcykKLQl7Ci0JY2FzZSBPMDogYnJlYWs7Ci0JY2FzZSBPVDogZnByaW50ZiAoc3RyZWFtLCAiXHQlZCIsIGluc3QgJiAweDMpOyBicmVhazsKLQljYXNlIE8xOgotCWNhc2UgSk1QOgotCWNhc2UgSlNSOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgT0M6ICBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlcyIsIG5hbWUsIGNybmFtZVsoaW5zdCA+PiA0KSAmIDB4MUZdKTsgYnJlYWs7Ci0JY2FzZSBPMVIxOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCByMSIsIG5hbWUpOyBicmVhazsKLQljYXNlIE8yOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlcyIsIG5hbWUsIGdybmFtZVsoaW5zdCA+PiA0KSAmIDB4Rl0pOyBicmVhazsKLQljYXNlIFgxOiBmcHJpbnRmIChzdHJlYW0sICJcdHIxLCAlcyIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9JOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsICgoaW5zdCA+PiA0KSAmIDB4MUYpICsgMSk7IGJyZWFrOwotCWNhc2UgUk06IGZwcmludGYgKHN0cmVhbSwgIlx0JXMtcjE1LCAocjApIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgUlE6IGZwcmludGYgKHN0cmVhbSwgIlx0cjQtcjcsICglcykiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBPQjoKLQljYXNlIE9CUmE6Ci0JY2FzZSBPQlJiOgotCWNhc2UgT0JSYzoKLQljYXNlIFNJOgotCWNhc2UgU0lhOgotCWNhc2UgT01hOgotCWNhc2UgT01iOgotCWNhc2UgT01jOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsIChpbnN0ID4+IDQpICYgMHgxRik7IGJyZWFrOwotCWNhc2UgSTc6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVkIiwgbmFtZSwgKGluc3QgPj4gNCkgJiAweDdGKTsgYnJlYWs7Ci0JY2FzZSBMUzogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgKCVzLCAlZCkiLCBncm5hbWVbKGluc3QgPj4gOCkgJiAweEZdLAotCQkJICBuYW1lLCAoKGluc3QgPj4gNCkgJiAweEYpIDw8IGlzaXpbKGluc3QgPj4gMTMpICYgM10pOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEJSOgotCSAgewotCSAgICBsb25nIHZhbCA9IGluc3QgJiAweDNGRjsKLQkgICAgCi0JICAgIGlmIChpbnN0ICYgMHg0MDApCi0JICAgICAgdmFsIHw9IDB4RkZGRkZDMDA7Ci0JICAgIAotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdDB4JXgiLCBtZW1hZGRyICsgMiArICh2YWw8PDEpKTsKLQkgICAgCi0JICAgIGlmIChzdHJjbXAgKG9wLT5uYW1lLCAiYnNyIikgPT0gMCkKLQkgICAgICB7Ci0JCS8qIGZvciBic3IsIHdlJ2xsIHRyeSB0byBnZXQgYSBzeW1ib2wgZm9yIHRoZSB0YXJnZXQgKi8KLQkJdmFsID0gbWVtYWRkciArIDIgKyAodmFsIDw8IDEpOwotCQkKLQkJaWYgKGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAmJiB2YWwgIT0gMCkKLQkJICB7Ci0JCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdC8vICIpOwotCQkgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGluZm8pOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgQkw6Ci0JICB7Ci0JICAgIGxvbmcgdmFsOwotCSAgICB2YWwgPSAoaW5zdCAmIDB4MDAwRik7Ci0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0JXMsIDB4JXgiLAotCQkgICAgZ3JuYW1lWyhpbnN0ID4+IDQpICYgMHhGXSwgbWVtYWRkciAtICh2YWwgPDwgMSkpOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIExSOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgICAgCi0JICAgIHZhbCA9IChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkM7Ci0JICAgIAotCSAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jICh2YWwsIGlieXRlcywgNCwgaW5mbyk7Ci0JICAgIGlmIChzdGF0dXMgIT0gMCkgCi0JICAgICAgewotCQlpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAKLQkgICAgICB2YWwgPSAoaWJ5dGVzWzBdIDw8IDI0KSB8IChpYnl0ZXNbMV0gPDwgMTYpCi0JCXwgKGlieXRlc1syXSA8PCA4KSB8IChpYnl0ZXNbM10pOwotCSAgICAKLQkgICAgLyogUmVtb3ZlZCBbXSBhcm91bmQgbGl0ZXJhbCB2YWx1ZSB0byBtYXRjaCBBQkkgc3ludGF4IDEyLzk1LiAgKi8KLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgMHglWCIsIGdybmFtZVsoaW5zdCA+PiA4KSAmIDB4Rl0sIHZhbCk7Ci0KLQkgICAgaWYgKHZhbCA9PSAwKQotCSAgICAgIGZwcmludGYgKHN0cmVhbSwgIlx0Ly8gZnJvbSBhZGRyZXNzIHBvb2wgYXQgMHgleCIsCi0JCSAgICAgICAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKTsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBMSjoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICAgIAotCSAgICB2YWwgPSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDOwotCSAgICAKLQkgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAodmFsLCBpYnl0ZXMsIDQsIGluZm8pOwotCSAgICBpZiAoc3RhdHVzICE9IDApIAotCSAgICAgIHsKLQkJaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAgIHZhbCA9IChpYnl0ZXNbMF0gPDwgMjQpIHwgKGlieXRlc1sxXSA8PCAxNikKLQkJfCAoaWJ5dGVzWzJdIDw8IDgpIHwgKGlieXRlc1szXSk7Ci0JICAgIAotCSAgICAvKiBSZW1vdmVkIFtdIGFyb3VuZCBsaXRlcmFsIHZhbHVlIHRvIG1hdGNoIEFCSSBzeW50YXggMTIvOTUuICAqLwotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdDB4JVgiLCB2YWwpOwotCSAgICAvKiBGb3Igam1waS9qc3JpLCB3ZSdsbCB0cnkgdG8gZ2V0IGEgc3ltYm9sIGZvciB0aGUgdGFyZ2V0LiAgKi8KLQkgICAgaWYgKGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAmJiB2YWwgIT0gMCkKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0cmVhbSwgIlx0Ly8gIik7Ci0JCWluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAodmFsLCBpbmZvKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0cmVhbSwgIlx0Ly8gZnJvbSBhZGRyZXNzIHBvb2wgYXQgMHgleCIsCi0JCQkgKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQyk7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQlkZWZhdWx0OgotCSAgLyogaWYgdGhlIGRpc2Fzc2VtYmxlciBsYWdzIHRoZSBpbnN0cnVjdGlvbiBzZXQgKi8KLQkgIGZwcmludGYgKHN0cmVhbSwgIlx0dW5kZWNvZGVkIG9wZXJhbmRzLCBpbnN0IGlzIDB4JTA0eCIsIGluc3QpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgCi0gIC8qIFNheSBob3cgbWFueSBieXRlcyB3ZSBjb25zdW1lZD8gKi8KLSAgcmV0dXJuIDI7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL21jb3JlLW9wYy5oIGIvb3Bjb2Rlcy9tY29yZS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2YmE4NC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21jb3JlLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qIEFzc2VtYmxlciBpbnN0cnVjdGlvbnMgZm9yIE1vdG9yb2xsYSdzIE1jb3JlIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICAKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi10eXBlZGVmIGVudW0KLXsKLSAgTzAsICAgIE9ULCAgIE8xLCAgIE9DLCAgIE8yLCAgICBYMSwgICAgT0ksICAgIE9CLAotICBPTWEsICAgU0ksICAgSTcsICAgTFMsICAgQlIsICAgIEJMLCAgICBMUiwgICAgTEosCi0gIFJNLCAgICBSUSwgICBKU1IsICBKTVAsICBPQlJhLCAgT0JSYiwgIE9CUmMsICBPQlIyLAotICBPMVIxLCAgT01iLCAgT01jLCAgU0lhLAotICBKQywgICAgSlUsICAgSkwsICAgUlNJLCAgRE8yMSwgIE9CMgotfQotbWNvcmVfb3BjbGFzczsKLQotdHlwZWRlZiBzdHJ1Y3QgaW5zdAotewotICBjaGFyICogICAgICAgICBuYW1lOwotICBtY29yZV9vcGNsYXNzICBvcGNsYXNzOwotICB1bnNpZ25lZCBjaGFyICB0cmFuc2ZlcjsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdDsKLX0KLW1jb3JlX29wY29kZV9pbmZvOwotCi0jaWZkZWYgREVGSU5FX1RBQkxFCi1tY29yZV9vcGNvZGVfaW5mbyBtY29yZV90YWJsZVtdID0KLXsKLSAgeyAiYmtwdCIsCU8wLAkwLAkweDAwMDAgfSwKLSAgeyAic3luYyIsCU8wLAkwLAkweDAwMDEgfSwKLSAgeyAicnRlIiwJTzAsCTEsCTB4MDAwMiB9LAotICB7ICJyZmUiLAlPMCwJMSwJMHgwMDAyIH0sCi0gIHsgInJmaSIsCU8wLAkxLAkweDAwMDMgfSwKLSAgeyAic3RvcCIsCU8wLAkwLAkweDAwMDQgfSwKLSAgeyAid2FpdCIsCU8wLAkwLAkweDAwMDUgfSwKLSAgeyAiZG96ZSIsCU8wLAkwLAkweDAwMDYgfSwKLSAgeyAidHJhcCIsCU9ULAkwLAkweDAwMDggfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBDIC0gMHgwMDBGICovCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAtIDB4MDAxRiAqLwotICB7ICJtdmMiLAlPMSwJMCwJMHgwMDIwIH0sCi0gIHsgIm12Y3YiLAlPMSwJMCwJMHgwMDMwIH0sCi0gIHsgImxkcSIsCVJRLAkwLAkweDAwNDAgfSwKLSAgeyAic3RxIiwJUlEsCTAsCTB4MDA1MCB9LAotICB7ICJsZG0iLAlSTSwJMCwJMHgwMDYwIH0sCi0gIHsgInN0bSIsCVJNLAkwLAkweDAwNzAgfSwKLSAgeyAiZGVjdCIsCU8xLAkwLAkweDAwODAgfSwKLSAgeyAiZGVjZiIsCU8xLAkwLAkweDAwOTAgfSwKLSAgeyAiaW5jdCIsCU8xLAkwLAkweDAwQTAgfSwKLSAgeyAiaW5jZiIsCU8xLAkwLAkweDAwQjAgfSwKLSAgeyAiam1wIiwJSk1QLAkyLAkweDAwQzAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KTVAJMHgwMEMwCi0gIHsgImpzciIsCUpTUiwJMCwJMHgwMEQwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSlNSCTB4MDBFMAotICB7ICJmZjEiLAlPMSwJMCwJMHgwMEUwIH0sCi0gIHsgImJyZXYiLAlPMSwJMCwJMHgwMEYwIH0sCi0gIHsgInh0cmIzIiwJWDEsCTAsCTB4MDEwMCB9LAotICB7ICJ4dHJiMiIsCVgxLAkwLAkweDAxMTAgfSwKLSAgeyAieHRyYjEiLAlYMSwJMCwJMHgwMTIwIH0sCi0gIHsgInh0cmIwIiwJWDEsCTAsCTB4MDEzMCB9LAotICB7ICJ6ZXh0YiIsCU8xLAkwLAkweDAxNDAgfSwKLSAgeyAic2V4dGIiLAlPMSwJMCwJMHgwMTUwIH0sCi0gIHsgInpleHRoIiwJTzEsCTAsCTB4MDE2MCB9LAotICB7ICJzZXh0aCIsCU8xLAkwLAkweDAxNzAgfSwKLSAgeyAiZGVjbHQiLAlPMSwJMCwJMHgwMTgwIH0sCi0gIHsgInRzdG5ieiIsCU8xLAkwLAkweDAxOTAgfSwKLSAgeyAiZGVjZ3QiLAlPMSwJMCwJMHgwMUEwIH0sCi0gIHsgImRlY25lIiwJTzEsCTAsCTB4MDFCMCB9LAotICB7ICJjbHJ0IiwJTzEsCTAsCTB4MDFDMCB9LAotICB7ICJjbHJmIiwJTzEsCTAsCTB4MDFEMCB9LAotICB7ICJhYnMiLAlPMSwJMCwJMHgwMUUwIH0sCi0gIHsgIm5vdCIsCU8xLAkwLAkweDAxRjAgfSwKLSAgeyAibW92dCIsCU8yLAkwLAkweDAyMDAgfSwKLSAgeyAibXVsdCIsCU8yLAkwLAkweDAzMDAgfSwKLSAgeyAibG9vcHQiLAlCTCwJMCwJMHgwNDAwIH0sCi0gIHsgInN1YnUiLAlPMiwJMCwJMHgwNTAwIH0sCi0gIHsgInN1YiIsCU8yLAkwLAkweDA1MDAgfSwgLyogT2ZmaWNpYWwgYWxpYXMuICAqLwotICB7ICJhZGRjIiwJTzIsCTAsCTB4MDYwMCB9LAotICB7ICJzdWJjIiwJTzIsCTAsCTB4MDcwMCB9LAotLyogU1BBQ0U6IDB4MDgwMC0weDA4ZmYgZm9yIGEgZGlhZGljIG9wZXJhdGlvbiAqLwotLyogU1BBQ0U6IDB4MDkwMC0weDA5ZmYgZm9yIGEgZGlhZGljIG9wZXJhdGlvbiAqLwotICB7ICJtb3ZmIiwJTzIsCTAsCTB4MEEwMCB9LAotICB7ICJsc3IiLAlPMiwJMCwJMHgwQjAwIH0sCi0gIHsgImNtcGhzIiwJTzIsCTAsCTB4MEMwMCB9LAotICB7ICJjbXBsdCIsCU8yLAkwLAkweDBEMDAgfSwKLSAgeyAidHN0IiwJTzIsCTAsCTB4MEUwMCB9LAotICB7ICJjbXBuZSIsCU8yLAkwLAkweDBGMDAgfSwKLSAgeyAibWZjciIsCU9DLAkwLAkweDEwMDAgfSwKLSAgeyAibW92IiwJTzIsCTAsCTB4MTIwMCB9LAotICB7ICJiZ2VuciIsCU8yLAkwLAkweDEzMDAgfSwKLSAgeyAicnN1YiIsCU8yLAkwLAkweDE0MDAgfSwKLSAgeyAiaXh3IiwJTzIsCTAsCTB4MTUwMCB9LAotICB7ICJhbmQiLAlPMiwJMCwJMHgxNjAwIH0sCi0gIHsgInhvciIsCU8yLAkwLAkweDE3MDAgfSwKLSAgeyAibXRjciIsCU9DLAkwLAkweDE4MDAgfSwKLSAgeyAiYXNyIiwJTzIsCTAsCTB4MUEwMCB9LAotICB7ICJsc2wiLAlPMiwJMCwJMHgxQjAwIH0sCi0gIHsgImFkZHUiLAlPMiwJMCwJMHgxQzAwIH0sCi0gIHsgIml4aCIsCU8yLAkwLAkweDFEMDAgfSwKLSAgeyAib3IiLAlPMiwJMCwJMHgxRTAwIH0sCi0gIHsgImFuZG4iLAlPMiwJMCwJMHgxRjAwIH0sCi0gIHsgImFkZGkiLAlPSSwJMCwJMHgyMDAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfQURESQkweDIwMDAKLSAgeyAiY21wbHRpIiwJT0ksCTAsCTB4MjIwMCB9LAotICB7ICJzdWJpIiwJT0ksCTAsCTB4MjQwMCB9LAotLyogU1BBQ0U6IDB4MjYwMC0weDI3ZmYgb3BlbiBmb3IgYSByZWdpc3RlcitpbW1lZGlhdGUgIG9wZXJhdGlvbiAqLwotICB7ICJyc3ViaSIsCU9CLAkwLAkweDI4MDAgfSwKLSAgeyAiY21wbmVpIiwJT0IsCTAsCTB4MkEwMCB9LAotICB7ICJibWFza2kiLAlPTWEsCTAsCTB4MkMwMCB9LAotICB7ICJkaXZ1IiwJTzFSMSwJMCwJMHgyQzEwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MmMyMCAtIDB4MmM3ZiAqLyAgCi0gIHsgImJtYXNraSIsCU9NYiwJMCwJMHgyQzgwIH0sCi0gIHsgImJtYXNraSIsCU9NYywJMCwJMHgyRDAwIH0sCi0gIHsgImFuZGkiLAlPQiwJMCwJMHgyRTAwIH0sCi0gIHsgImJjbHJpIiwJT0IsCTAsCTB4MzAwMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDMyMDAgLSAweDMyMGYgKi8KLSAgeyAiZGl2cyIsCU8xUjEsCTAsCTB4MzIxMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDMyMjAgLSAweDMyNmYgKi8gIAotICB7ICJiZ2VuaSIsCU9CUmEsCTAsCTB4MzI3MCB9LAotICB7ICJiZ2VuaSIsCU9CUmIsCTAsCTB4MzI4MCB9LAotICB7ICJiZ2VuaSIsCU9CUmMsCTAsCTB4MzMwMCB9LAotICB7ICJic2V0aSIsCU9CLAkwLAkweDM0MDAgfSwKLSAgeyAiYnRzdGkiLAlPQiwJMCwJMHgzNjAwIH0sCi0gIHsgInhzciIsCU8xLAkwLAkweDM4MDAgfSwKLSAgeyAicm90bGkiLAlTSWEsCTAsCTB4MzgwMCB9LAotICB7ICJhc3JjIiwJTzEsCTAsCTB4M0EwMCB9LAotICB7ICJhc3JpIiwJU0lhLAkwLAkweDNBMDAgfSwKLSAgeyAibHNsYyIsCU8xLAkwLAkweDNDMDAgfSwKLSAgeyAibHNsaSIsCVNJYSwJMCwJMHgzQzAwIH0sCi0gIHsgImxzcmMiLAlPMSwJMCwJMHgzRTAwIH0sCi0gIHsgImxzcmkiLAlTSWEsCTAsCTB4M0UwMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgLSAweDVmZmYgKi8KLSAgeyAibW92aSIsCUk3LAkwLAkweDYwMDAgfSwKLSNkZWZpbmUgTUNPUkVfSU5TVF9CTUFTS0lfQUxUCTB4NjAwMAotI2RlZmluZSBNQ09SRV9JTlNUX0JHRU5JX0FMVAkweDYwMDAKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHg2OTAwIC0gMHg2RkZGICovCi0gIHsgImptcGkiLAlMSiwJMSwJMHg3MDAwIH0sCi0gIHsgImpzcmkiLAlMSiwJMCwJMHg3RjAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSk1QSQkweDcwMDAKLSAgeyAibHJ3IiwJTFIsCTAsCTB4NzAwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0pTUkkJMHg3RjAwCi0gIHsgImxkIiwJTFMsCTAsCTB4ODAwMCB9LAotICB7ICJsZHciLAlMUywJMCwJMHg4MDAwIH0sCi0gIHsgImxkLnciLAlMUywJMCwJMHg4MDAwIH0sCi0gIHsgInN0IiwJTFMsCTAsCTB4OTAwMCB9LAotICB7ICJzdHciLAlMUywJMCwJMHg5MDAwIH0sCi0gIHsgInN0LnciLAlMUywJMCwJMHg5MDAwIH0sCi0gIHsgImxkYiIsCUxTLAkwLAkweEEwMDAgfSwKLSAgeyAibGQuYiIsCUxTLAkwLAkweEEwMDAgfSwKLSAgeyAic3RiIiwJTFMsCTAsCTB4QjAwMCB9LAotICB7ICJzdC5iIiwJTFMsCTAsCTB4QjAwMCB9LAotICB7ICJsZGgiLAlMUywJMCwJMHhDMDAwIH0sCi0gIHsgImxkLmgiLAlMUywJMCwJMHhDMDAwIH0sCi0gIHsgInN0aCIsCUxTLAkwLAkweEQwMDAgfSwKLSAgeyAic3QuaCIsCUxTLAkwLAkweEQwMDAgfSwKLSAgeyAiYnQiLAlCUiwJMCwJMHhFMDAwIH0sCi0gIHsgImJmIiwJQlIsCTAsCTB4RTgwMCB9LAotICB7ICJiciIsCUJSLAkxLAkweEYwMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9CUgkweEYwMDAKLSAgeyAiYnNyIiwJQlIsCTAsCTB4RjgwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0JTUgkweEY4MDAKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgcmVsYXhhYmxlIGJyYW5jaGVzICovCi0gIHsgImpidCIsCUpDLAkwLAkweEUwMDAgfSwKLSAgeyAiamJmIiwJSkMsCTAsCTB4RTgwMCB9LAotICB7ICJqYnIiLAlKVSwJMSwJMHhGMDAwIH0sCi0gIHsgImpic3IiLAlKTCwJMCwJMHhGODAwIH0sCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsaWFzZXMgZm9yIG90aGVyIGluc3RydWN0aW9ucyAqLwotICB7ICJydHMiLAlPMCwJMiwJMHgwMENGIH0sICAvKiBqbXAgcjE1ICovCi0gIHsgInJvbGMiLAlETzIxLAkwLAkweDA2MDAgfSwgIC8qIGFkZGMgcmQscmQgKi8KLSAgeyAicm90bGMiLAlETzIxLCAgIDAsCTB4MDYwMCB9LCAgLyogYWRkYyByZCxyZCAqLwotICB7ICJzZXRjIiwJTzAsCTAsCTB4MEMwMCB9LCAgLyogY21waHMgcjAscjAgKi8KLSAgeyAiY2xyYyIsCU8wLAkwLAkweDBGMDAgfSwgIC8qIGNtcG5lIHIwLHIwICovCi0gIHsgInRzdGxlIiwJTzEsCTAsCTB4MjIwMCB9LCAgLyogY21wbHRpIHJkLDEgKi8KLSAgeyAiY21wbGVpIiwJT0IsCTAsCTB4MjIwMCB9LCAgLyogY21wbGVpIHJkLFggLT4gY21wbHRpIHJkLFgrMSAqLwotICB7ICJuZWciLAlPMSwJMCwJMHgyODAwIH0sICAvKiByc3ViaSByZCwwICovCi0gIHsgInRzdG5lIiwJTzEsCTAsCTB4MkEwMCB9LCAgLyogY21wbmVpIHJkLDAgKi8KLSAgeyAidHN0bHQiLAlPMSwJMCwJMHgzN0YwIH0sICAvKiBidHN0aSByeCwzMSAqLwotICB7ICJtY2xyaSIsCU9CMiwJMCwJMHgzMDAwIH0sICAvKiBiY2xyaSByeCxsb2cyKGltbSkgKi8KLSAgeyAibWdlbmkiLAlPQlIyLAkwLAkweDMyMDAgfSwgIC8qIGJnZW5pIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJtc2V0aSIsCU9CMiwJMCwJMHgzNDAwIH0sICAvKiBic2V0aSByeCxsb2cyKGltbSkgKi8KLSAgeyAibXRzdGkiLAlPQjIsCTAsCTB4MzYwMCB9LCAgLyogYnRzdGkgcngsbG9nMihpbW0pICovCi0gIHsgInJvcmkiLAlSU0ksCTAsCTB4MzgwMCB9LAotICB7ICJyb3RyaSIsCVJTSSwgICAgMCwJMHgzODAwIH0sCi0gIHsgIm5vcCIsCU8wLCAgICAgMCwJMHgxMjAwIH0sICAvKiBtb3YgcjAsIHIwICovCi0gIHsgMCwJCTAsCTAsICAgICAgMCB9Ci19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL21pcHMtZGlzLmMgYi9vcGNvZGVzL21pcHMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmQ2MmUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9taXBzLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0OCArMCwwIEBACi0vKiBQcmludCBtaXBzIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBvciBmb3Igb2JqZHVtcC4KLSAgIENvcHlyaWdodCAoYykgMTk4OSwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBOb2J1eXVraSBIaWtpY2hpKGhpa2ljaGlAc3JhLmNvLmpwKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRklYTUU6IFRoZXNlIGFyZSBuZWVkZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgY29kZSBpcyBtaXBzMTYgb3IKLSAgIG5vdC4gVGhlIGxvdyBiaXQgb2YgdGhlIGFkZHJlc3MgaXMgb2Z0ZW4gYSBnb29kIGluZGljYXRvci4gIE5vCi0gICBzeW1ib2wgdGFibGUgaXMgYXZhaWxhYmxlIHdoZW4gdGhpcyBjb2RlIHJ1bnMgb3V0IGluIGFuIGVtYmVkZGVkCi0gICBzeXN0ZW0gYXMgd2hlbiBpdCBpcyB1c2VkIGZvciBkaXNhc3NlbWJsZXIgc3VwcG9ydCBpbiBhIG1vbml0b3IuICovCi0KLSNpZiAhZGVmaW5lZChFTUJFRERFRF9FTlYpCi0jZGVmaW5lIFNZTVRBQl9BVkFJTEFCTEUgMQotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbWlwcy5oIgotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9taXBzMTYgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIHZvaWQgcHJpbnRfbWlwczE2X2luc25fYXJnCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICosIGludCwgYm9vbGVhbiwgaW50LCBiZmRfdm1hLAotCSAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogTWlwcyBpbnN0cnVjdGlvbnMgYXJlIG5ldmVyIGxvbmdlciB0aGFuIHRoaXMgbWFueSBieXRlcy4gICovCi0jZGVmaW5lIE1BWExFTiA0Ci0KLXN0YXRpYyB2b2lkIHByaW50X2luc25fYXJnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSwKLQkJCQkgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIGludCBfcHJpbnRfaW5zbl9taXBzIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGxvbmcgaW50LAotCQkJCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0MCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgc2hhcmVkIHdpdGggZ2RiIHNvbWVob3cuICAqLwotI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAJXAotICAgIHsJInplcm8iLAkiYXQiLAkidjAiLAkidjEiLAkiYTAiLAkiYTEiLAkiYTIiLAkiYTMiLCBcCi0JInQwIiwJInQxIiwJInQyIiwJInQzIiwJInQ0IiwJInQ1IiwJInQ2IiwJInQ3IiwgXAotCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsIFwKLQkidDgiLAkidDkiLAkiazAiLAkiazEiLAkiZ3AiLAkic3AiLAkiczgiLAkicmEiLCBcCi0JInNyIiwJImxvIiwJImhpIiwJImJhZCIsCSJjYXVzZSIsInBjIiwgICAgXAotCSJmMCIsICAgImYxIiwgICAiZjIiLCAgICJmMyIsICAgImY0IiwgICAiZjUiLCAgICJmNiIsICAgImY3IiwgXAotCSJmOCIsICAgImY5IiwgICAiZjEwIiwgICJmMTEiLCAgImYxMiIsICAiZjEzIiwgICJmMTQiLCAgImYxNSIsIFwKLQkiZjE2IiwgICJmMTciLCAgImYxOCIsICAiZjE5IiwgICJmMjAiLCAgImYyMSIsICAiZjIyIiwgICJmMjMiLFwKLQkiZjI0IiwgICJmMjUiLCAgImYyNiIsICAiZjI3IiwgICJmMjgiLCAgImYyOSIsICAiZjMwIiwgICJmMzEiLFwKLQkiZnNyIiwgICJmaXIiLCAgImZwIiwgICAiaW54IiwgICJyYW5kIiwgInRsYmxvIiwiY3R4dCIsICJ0bGJoaSIsXAotCSJlcGMiLCAgInByaWQiXAotICAgIH0KLQotc3RhdGljIENPTlNUIGNoYXIgKiBDT05TVCByZWdfbmFtZXNbXSA9IFJFR0lTVEVSX05BTUVTOwotCi0vKiBUaGUgbWlwczE2IHJlZ2lzdGVyIG5hbWVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwczE2X3JlZ19uYW1lc1tdID0KLXsKLSAgInMwIiwgInMxIiwgInYwIiwgInYxIiwgImEwIiwgImExIiwgImEyIiwgImEzIgotfTsKLQwKLS8qIHN1YnJvdXRpbmUgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuX2FyZyAoZCwgbCwgcGMsIGluZm8pCi0gICAgIGNvbnN0IGNoYXIgKmQ7Ci0gICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IGw7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgZGVsdGE7Ci0KLSAgc3dpdGNoICgqZCkKLSAgICB7Ci0gICAgY2FzZSAnLCc6Ci0gICAgY2FzZSAnKCc6Ci0gICAgY2FzZSAnKSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKmQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICd2JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWyhsID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlNdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1sobCA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2knOgotICAgIGNhc2UgJ3UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCShsID4+IE9QX1NIX0lNTUVESUFURSkgJiBPUF9NQVNLX0lNTUVESUFURSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2onOiAvKiBzYW1lIGFzIGksIGJ1dCBzaWduLWV4dGVuZGVkICovCi0gICAgY2FzZSAnbyc6Ci0gICAgICBkZWx0YSA9IChsID4+IE9QX1NIX0RFTFRBKSAmIE9QX01BU0tfREVMVEE7Ci0gICAgICBpZiAoZGVsdGEgJiAweDgwMDApCi0JZGVsdGEgfD0gfjB4ZmZmZjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJICAgICBkZWx0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKHVuc2lnbmVkIGludCkgKChsID4+IE9QX1NIX1BSRUZYKQotCQkJCQkgICAgICYgT1BfTUFTS19QUkVGWCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgICh1bnNpZ25lZCBpbnQpICgobCA+PiBPUF9TSF9DQUNIRSkKLQkJCQkJICAgICAmIE9QX01BU0tfQ0FDSEUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkoKChwYyAmIDB4RjAwMDAwMDApIHwgKCgobCA+PiBPUF9TSF9UQVJHRVQpICYgT1BfTUFTS19UQVJHRVQpIDw8IDIpKSwKLQkgaW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgLyogc2lnbiBleHRlbmQgdGhlIGRpc3BsYWNlbWVudCAqLwotICAgICAgZGVsdGEgPSAobCA+PiBPUF9TSF9ERUxUQSkgJiBPUF9NQVNLX0RFTFRBOwotICAgICAgaWYgKGRlbHRhICYgMHg4MDAwKQotCWRlbHRhIHw9IH4weGZmZmY7Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkoKGRlbHRhIDw8IDIpICsgcGMgKyA0LAotCSBpbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1sobCA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3onOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc8JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1NIQU1UKSAmIE9QX01BU0tfU0hBTVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0NPREUpICYgT1BfTUFTS19DT0RFKTsKLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlICdxJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0NPREUyKSAmIE9QX01BU0tfQ09ERTIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0NPUFopICYgT1BfTUFTS19DT1BaKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9TWVNDQUxMKSAmIE9QX01BU0tfU1lTQ0FMTCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgIGNhc2UgJ1YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfRlMpICYgT1BfTUFTS19GUyk7Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSAnVCc6Ci0gICAgY2FzZSAnVyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9GVCkgJiBPUF9NQVNLX0ZUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9GRCkgJiBPUF9NQVNLX0ZEKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9GUikgJiBPUF9NQVNLX0ZSKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ04nOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZmNjJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9CQ0MpICYgT1BfTUFTS19CQ0MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGZjYyVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQ0NDKSAmIE9QX01BU0tfQ0NDKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfUEVSRlJFRykgJiBPUF9NQVNLX1BFUkZSRUcpOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCi0JCQkgICAgIF8oIiMgaW50ZXJuYWwgZXJyb3IsIHVuZGVmaW5lZCBtb2RpZmllciglYykiKSwKLQkJCSAgICAgKmQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotI2lmIFNZTVRBQl9BVkFJTEFCTEUKLQotLyogRmlndXJlIG91dCB0aGUgTUlQUyBJU0EgYW5kIENQVSBiYXNlZCBvbiB0aGUgbWFjaGluZSBudW1iZXIuCi0gICBGSVhNRTogV2hhdCBkb2VzIHRoaXMgaGF2ZSB0byBkbyB3aXRoIFNZTVRBQl9BVkFJTEFCTEU/ICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X21pcHNfaXNhX3R5cGUgKG1hY2gsIGlzYSwgY3B1dHlwZSkKLSAgICAgaW50IG1hY2g7Ci0gICAgIGludCAqaXNhOwotICAgICBpbnQgKmNwdXR5cGU7Ci17Ci0gIGludCB0YXJnZXRfcHJvY2Vzc29yID0gMDsKLSAgaW50IG1pcHNfaXNhID0gMDsKLQotICBzd2l0Y2ggKG1hY2gpCi0gICAgewotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMzAwMDsKLQltaXBzX2lzYSA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSAzOTAwOwotCW1pcHNfaXNhID0gMTsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQwMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDAxMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDAxMDsKLQltaXBzX2lzYSA9IDI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MTAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMTE6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQxMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDMwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDMwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0NDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0NDAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2MDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQ2MDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDY1MDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDY1MDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM1MDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA1MDAwOwotCW1pcHNfaXNhID0gNDsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDYwMDA7Ci0JbWlwc19pc2EgPSAyOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gODAwMDsKLQltaXBzX2lzYSA9IDQ7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHMxMDAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMTAwMDA7Ci0JbWlwc19pc2EgPSA0OwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMTY6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDE2OwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDMwMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotCi0gICAgfQotCi0gICppc2EgPSBtaXBzX2lzYTsKLSAgKmNwdXR5cGUgPSB0YXJnZXRfcHJvY2Vzc29yOwotfQotCi0jZW5kaWYgLyogU1lNVEFCX0FWQUlMQUJMRSAqLwotCi0vKiBQcmludCB0aGUgbWlwcyBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gdXNpbmcgSU5GTy4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMsIHdoaWNoIGlzCi0gICBhbHdheXMgNC4gIEJJR0VORElBTiBtdXN0IGJlIDEgaWYgdGhpcyBpcyBiaWctZW5kaWFuIGNvZGUsIDAgaWYKLSAgIHRoaXMgaXMgbGl0dGxlLWVuZGlhbiBjb2RlLiAgKi8KLQotc3RhdGljIGludAotX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgd29yZCwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICB1bnNpZ25lZCBsb25nIGludCB3b3JkOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcDsKLSAgaW50IHRhcmdldF9wcm9jZXNzb3IsIG1pcHNfaXNhOwotICBzdGF0aWMgYm9vbGVhbiBpbml0ID0gMDsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqbWlwc19oYXNoW09QX01BU0tfT1AgKyAxXTsKLQotICAvKiBCdWlsZCBhIGhhc2ggdGFibGUgdG8gc2hvcnRlbiB0aGUgc2VhcmNoIHRpbWUuICAqLwotICBpZiAoISBpbml0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDw9IE9QX01BU0tfT1A7IGkrKykKLQl7Ci0JICBmb3IgKG9wID0gbWlwc19vcGNvZGVzOyBvcCA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU107IG9wKyspCi0JICAgIHsKLQkgICAgICBpZiAob3AtPnBpbmZvID09IElOU05fTUFDUk8pCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChpID09ICgob3AtPm1hdGNoID4+IE9QX1NIX09QKSAmIE9QX01BU0tfT1ApKQotCQl7Ci0JCSAgbWlwc19oYXNoW2ldID0gb3A7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotICAgICAgICB9Ci0KLSAgICAgIGluaXQgPSAxOwotICAgIH0KLQotI2lmICEgU1lNVEFCX0FWQUlMQUJMRQotICAvKiBUaGlzIGlzIHJ1bm5pbmcgb3V0IG9uIGEgdGFyZ2V0IG1hY2hpbmUsIG5vdCBpbiBhIGhvc3QgdG9vbC4KLSAgICAgRklYTUU6IFdoZXJlIGRvZXMgbWlwc190YXJnZXRfaW5mbyBjb21lIGZyb20/ICAqLwotICB0YXJnZXRfcHJvY2Vzc29yID0gbWlwc190YXJnZXRfaW5mby5wcm9jZXNzb3I7Ci0gIG1pcHNfaXNhID0gbWlwc190YXJnZXRfaW5mby5pc2E7Ci0jZWxzZSAgCi0gIHNldF9taXBzX2lzYV90eXBlIChpbmZvLT5tYWNoLCAmbWlwc19pc2EsICZ0YXJnZXRfcHJvY2Vzc29yKTsKLSNlbmRpZiAgCi0KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBpbmZvLT5lbmRpYW47Ci0KLSAgb3AgPSBtaXBzX2hhc2hbKHdvcmQgPj4gT1BfU0hfT1ApICYgT1BfTUFTS19PUF07Ci0gIGlmIChvcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoOyBvcCA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU107IG9wKyspCi0JewotCSAgaWYgKG9wLT5waW5mbyAhPSBJTlNOX01BQ1JPICYmICh3b3JkICYgb3AtPm1hc2spID09IG9wLT5tYXRjaCkKLQkgICAgewotCSAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmQ7Ci0KLQkgICAgICBpZiAoISBPUENPREVfSVNfTUVNQkVSIChvcCwgbWlwc19pc2EsIHRhcmdldF9wcm9jZXNzb3IpKQotCQljb250aW51ZTsKLQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0KLQkgICAgICBkID0gb3AtPmFyZ3M7Ci0JICAgICAgaWYgKGQgIT0gTlVMTCAmJiAqZCAhPSAnXDAnKQotCQl7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0JCSAgZm9yICg7ICpkICE9ICdcMCc7IGQrKykKLQkJICAgICAgcHJpbnRfaW5zbl9hcmcgKGQsIHdvcmQsIG1lbWFkZHIsIGluZm8pOwotCQl9Ci0KLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCB3b3JkKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLQotLyogSW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgd2UgZG8gbm90IGtub3cgdGhlIHN5bWJvbCB0eXBlIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gd2UgYXJlIGZvcmNlZCB0byBhc3N1bWUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdCBvZiB0aGUKLSAgIGluc3RydWN0aW9ucycgYWRkcmVzcyBtYXkgbWFyayBpdCBhcyBhIG1pcHMxNiBpbnN0cnVjdGlvbi4gIElmIHdlCi0gICBhcmUgc2luZ2xlIHN0ZXBwaW5nLCBvciB0aGUgcGMgaXMgd2l0aGluIHRoZSBkaXNhc3NlbWJsZWQgZnVuY3Rpb24sCi0gICB0aGlzIHdvcmtzLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIGEgY2x1ZS4gIFNvbWV0aW1lcy4gICovCi0KLWludAotcHJpbnRfaW5zbl9iaWdfbWlwcyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBpbnQgc3RhdHVzOwotCi0jaWYgMQotICAvKiBGSVhNRTogSWYgb2RkIGFkZHJlc3MsIHRoaXMgaXMgQ0xFQVJMWSBhIG1pcHMgMTYgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBPbmx5IGEgZmV3IHRvb2xzIHdpbGwgd29yayB0aGlzIHdheS4gICovCi0gIGlmIChtZW1hZGRyICYgMHgwMSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotI2lmIFNZTVRBQl9BVkFJTEFCTEUKLSAgaWYgKGluZm8tPm1hY2ggPT0gMTYKLSAgICAgIHx8IChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkgICYmIGluZm8tPnN5bWJvbHMgIT0gTlVMTAotCSAgJiYgKCgqKGVsZl9zeW1ib2xfdHlwZSAqKikgaW5mby0+c3ltYm9scyktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIKLQkgICAgICA9PSBTVE9fTUlQUzE2KSkpCi0gICAgcmV0dXJuIHByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKTsKLSNlbmRpZiAgCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHJldHVybiBfcHJpbnRfaW5zbl9taXBzIChtZW1hZGRyLCAodW5zaWduZWQgbG9uZykgYmZkX2dldGIzMiAoYnVmZmVyKSwKLQkJCSAgICAgaW5mbyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLWludAotcHJpbnRfaW5zbl9saXR0bGVfbWlwcyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBpbnQgc3RhdHVzOwotCi0KLSNpZiAxCi0gIGlmIChtZW1hZGRyICYgMHgwMSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotI2lmIFNZTVRBQl9BVkFJTEFCTEUKLSAgaWYgKGluZm8tPm1hY2ggPT0gMTYKLSAgICAgIHx8IChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkgICYmIGluZm8tPnN5bWJvbHMgIT0gTlVMTAotCSAgJiYgKCgqKGVsZl9zeW1ib2xfdHlwZSAqKikgaW5mby0+c3ltYm9scyktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIKLQkgICAgICA9PSBTVE9fTUlQUzE2KSkpCi0gICAgcmV0dXJuIHByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKTsKLSNlbmRpZiAgCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHJldHVybiBfcHJpbnRfaW5zbl9taXBzIChtZW1hZGRyLCAodW5zaWduZWQgbG9uZykgYmZkX2dldGwzMiAoYnVmZmVyKSwKLQkJCSAgICAgaW5mbyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0MCi0vKiBEaXNhc3NlbWJsZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBzdGF0dXM7Ci0gIGJmZF9ieXRlIGJ1ZmZlclsyXTsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGluc247Ci0gIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgaW50IGV4dGVuZCA9IDA7Ci0gIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqb3AsICpvcGVuZDsKLQotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IGluZm8tPmVuZGlhbjsKLQotICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAxOwotICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAwOwotICBpbmZvLT5kYXRhX3NpemUgPSAwOwotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uYnJhbmNoOwotICBpbmZvLT50YXJnZXQgPSAwOwotICBpbmZvLT50YXJnZXQyID0gMDsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxlbmd0aCA9IDI7Ci0KLSAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLSAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgZWxzZQotICAgIGluc24gPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCi0gIC8qIEhhbmRsZSB0aGUgZXh0ZW5kIG9wY29kZSBzcGVjaWFsbHkuICAqLwotICB1c2VfZXh0ZW5kID0gZmFsc2U7Ci0gIGlmICgoaW5zbiAmIDB4ZjgwMCkgPT0gMHhmMDAwKQotICAgIHsKLSAgICAgIHVzZV9leHRlbmQgPSB0cnVlOwotICAgICAgZXh0ZW5kID0gaW5zbiAmIDB4N2ZmOwotCi0gICAgICBtZW1hZGRyICs9IDI7Ci0KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCi0JCQkJICh1bnNpZ25lZCBpbnQpIGV4dGVuZCk7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0JaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBlbHNlCi0JaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBhbiBleHRlbmQgb3Bjb2RlIGZvbGxvd2VkIGJ5IGFuIGV4dGVuZCBvcGNvZGUuICAqLwotICAgICAgaWYgKChpbnNuICYgMHhmODAwKSA9PSAweGYwMDApCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCi0JCQkJICh1bnNpZ25lZCBpbnQpIGV4dGVuZCk7Ci0JICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsKLQkgIHJldHVybiBsZW5ndGg7Ci0JfQotCi0gICAgICBsZW5ndGggKz0gMjsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFNob3VsZCBwcm9iYWJseSB1c2UgYSBoYXNoIHRhYmxlIG9uIHRoZSBtYWpvciBvcGNvZGUgaGVyZS4gICovCi0KLSAgb3BlbmQgPSBtaXBzMTZfb3Bjb2RlcyArIGJmZF9taXBzMTZfbnVtX29wY29kZXM7Ci0gIGZvciAob3AgPSBtaXBzMTZfb3Bjb2Rlczsgb3AgPCBvcGVuZDsgb3ArKykKLSAgICB7Ci0gICAgICBpZiAob3AtPnBpbmZvICE9IElOU05fTUFDUk8gJiYgKGluc24gJiBvcC0+bWFzaykgPT0gb3AtPm1hdGNoKQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0KLQkgIGlmIChzdHJjaHIgKG9wLT5hcmdzLCAnYScpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAodXNlX2V4dGVuZCkKLQkJewotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXh0ZW5kIDB4JXgiLAotCQkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKLQkJICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsKLQkJICByZXR1cm4gbGVuZ3RoIC0gMjsKLQkJfQotCi0JICAgICAgdXNlX2V4dGVuZCA9IGZhbHNlOwotCi0JICAgICAgbWVtYWRkciArPSAyOwotCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLAotCQkJCQkJICBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzID09IDApCi0JCXsKLQkJICB1c2VfZXh0ZW5kID0gdHJ1ZTsKLQkJICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotCQkgICAgZXh0ZW5kID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLQkJICBlbHNlCi0JCSAgICBleHRlbmQgPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCQkgIGxlbmd0aCArPSAyOwotCQl9Ci0JICAgIH0KLQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKLQkgIGlmIChvcC0+YXJnc1swXSAhPSAnXDAnKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLQkgIGZvciAocyA9IG9wLT5hcmdzOyAqcyAhPSAnXDAnOyBzKyspCi0JICAgIHsKLQkgICAgICBpZiAoKnMgPT0gJywnCi0JCSAgJiYgc1sxXSA9PSAndycKLQkJICAmJiAoKChpbnNuID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlgpCi0JCSAgICAgID09ICgoaW5zbiA+PiBNSVBTMTZPUF9TSF9SWSkgJiBNSVBTMTZPUF9NQVNLX1JZKSkpCi0JCXsKLQkJICAvKiBTa2lwIHRoZSByZWdpc3RlciBhbmQgdGhlIGNvbW1hLiAgKi8KLQkJICArK3M7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoKnMgPT0gJywnCi0JCSAgJiYgc1sxXSA9PSAndicKLQkJICAmJiAoKChpbnNuID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlopCi0JCSAgICAgID09ICgoaW5zbiA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYKSkpCi0JCXsKLQkJICAvKiBTa2lwIHRoZSByZWdpc3RlciBhbmQgdGhlIGNvbW1hLiAgKi8KLQkJICArK3M7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBwcmludF9taXBzMTZfaW5zbl9hcmcgKCpzLCBvcCwgaW5zbiwgdXNlX2V4dGVuZCwgZXh0ZW5kLCBtZW1hZGRyLAotCQkJCSAgICAgaW5mbyk7Ci0JICAgIH0KLQotCSAgaWYgKChvcC0+cGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpICE9IDApCi0JICAgIHsKLQkgICAgICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOwotCSAgICAgIGlmIChpbmZvLT5pbnNuX3R5cGUgIT0gZGlzX2pzcikKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgfQotCi0JICByZXR1cm4gbGVuZ3RoOwotCX0KLSAgICB9Ci0KLSAgaWYgKHVzZV9leHRlbmQpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgZXh0ZW5kIHwgMHhmMDAwKTsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgaW5zbik7Ci0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIGFuIG9wZXJhbmQgZm9yIGEgbWlwczE2IGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X21pcHMxNl9pbnNuX2FyZyAodHlwZSwgb3AsIGwsIHVzZV9leHRlbmQsIGV4dGVuZCwgbWVtYWRkciwgaW5mbykKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqb3A7Ci0gICAgIGludCBsOwotICAgICBib29sZWFuIHVzZV9leHRlbmQ7Ci0gICAgIGludCBleHRlbmQ7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnLCc6Ci0gICAgY2FzZSAnKCc6Ci0gICAgY2FzZSAnKSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgdHlwZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3knOgotICAgIGNhc2UgJ3cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SWSkKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWSldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAndic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JYKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JYKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd6JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUlopCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlopXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1onOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9NT1ZFMzJaKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzI5XSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1AnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkcGMiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1szMV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SRUdSMzIpCi0JCQkJCSYgTUlQUzE2T1BfTUFTS19SRUdSMzIpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1knOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKGwpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzwnOgotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJ1snOgotICAgIGNhc2UgJ10nOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJ0gnOgotICAgIGNhc2UgJ1cnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ2onOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJ1YnOgotICAgIGNhc2UgJ0MnOgotICAgIGNhc2UgJ1UnOgotICAgIGNhc2UgJ2snOgotICAgIGNhc2UgJ0snOgotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ3EnOgotICAgIGNhc2UgJ0EnOgotICAgIGNhc2UgJ0InOgotICAgIGNhc2UgJ0UnOgotICAgICAgewotCWludCBpbW1lZCwgbmJpdHMsIHNoaWZ0LCBzaWduZWRwLCBleHRiaXRzLCBwY3JlbCwgZXh0dSwgYnJhbmNoOwotCi0Jc2hpZnQgPSAwOwotCXNpZ25lZHAgPSAwOwotCWV4dGJpdHMgPSAxNjsKLQlwY3JlbCA9IDA7Ci0JZXh0dSA9IDA7Ci0JYnJhbmNoID0gMDsKLQlzd2l0Y2ggKHR5cGUpCi0JICB7Ci0JICBjYXNlICc8JzoKLQkgICAgbmJpdHMgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7Ci0JICAgIGV4dGJpdHMgPSA1OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc+JzoKLQkgICAgbmJpdHMgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7Ci0JICAgIGV4dGJpdHMgPSA1OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdbJzoKLQkgICAgbmJpdHMgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7Ci0JICAgIGV4dGJpdHMgPSA2OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICddJzoKLQkgICAgbmJpdHMgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7Ci0JICAgIGV4dGJpdHMgPSA2OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc0JzoKLQkgICAgbmJpdHMgPSA0OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTQpICYgTUlQUzE2T1BfTUFTS19JTU00OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgZXh0Yml0cyA9IDE1OwotCSAgICBicmVhazsKLQkgIGNhc2UgJzUnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0gnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDI7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnVyc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAyOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpZiAoKG9wLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfUEMpID09IDAKLQkJJiYgKG9wLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfU1ApID09IDApCi0JICAgICAgewotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkJaW5mby0+ZGF0YV9zaXplID0gNDsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnRCc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdqJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc2JzoKLQkgICAgbmJpdHMgPSA2OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTYpICYgTUlQUzE2T1BfTUFTS19JTU02OwotCSAgICBicmVhazsKLQkgIGNhc2UgJzgnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnVic6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgc2hpZnQgPSAyOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICAvKiBGSVhNRTogVGhpcyBtaWdodCBiZSBsdywgb3IgaXQgbWlnaHQgYmUgYWRkaXUgdG8gJHNwIG9yCi0gICAgICAgICAgICAgICAkcGMuICBXZSBhc3N1bWUgaXQncyBsb2FkLiAgKi8KLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnQyc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdVJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdrJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdLJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ3AnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGJyYW5jaCA9IDE7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19jb25kYnJhbmNoOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ3EnOgotCSAgICBuYml0cyA9IDExOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTExKSAmIE1JUFMxNk9QX01BU0tfSU1NMTE7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGJyYW5jaCA9IDE7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19icmFuY2g7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnQSc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgc2hpZnQgPSAyOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIC8qIEZJWE1FOiBUaGlzIGNhbiBiZSBsdyBvciBsYS4gIFdlIGFzc3VtZSBpdCBpcyBsdy4gICovCi0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA0OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0InOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdFJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLQotCWlmICghIHVzZV9leHRlbmQpCi0JICB7Ci0JICAgIGlmIChzaWduZWRwICYmIGltbWVkID49ICgxIDw8IChuYml0cyAtIDEpKSkKLQkgICAgICBpbW1lZCAtPSAxIDw8IG5iaXRzOwotCSAgICBpbW1lZCA8PD0gc2hpZnQ7Ci0JICAgIGlmICgodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCi0JCSYmIGltbWVkID09IDApCi0JICAgICAgaW1tZWQgPSA4OwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGV4dGJpdHMgPT0gMTYpCi0JICAgICAgaW1tZWQgfD0gKChleHRlbmQgJiAweDFmKSA8PCAxMSkgfCAoZXh0ZW5kICYgMHg3ZTApOwotCSAgICBlbHNlIGlmIChleHRiaXRzID09IDE1KQotCSAgICAgIGltbWVkIHw9ICgoZXh0ZW5kICYgMHhmKSA8PCAxMSkgfCAoZXh0ZW5kICYgMHg3ZjApOwotCSAgICBlbHNlCi0JICAgICAgaW1tZWQgPSAoKGV4dGVuZCA+PiA2KSAmIDB4MWYpIHwgKGV4dGVuZCAmIDB4MjApOwotCSAgICBpbW1lZCAmPSAoMSA8PCBleHRiaXRzKSAtIDE7Ci0JICAgIGlmICghIGV4dHUgJiYgaW1tZWQgPj0gKDEgPDwgKGV4dGJpdHMgLSAxKSkpCi0JICAgICAgaW1tZWQgLT0gMSA8PCBleHRiaXRzOwotCSAgfQotCi0JaWYgKCEgcGNyZWwpCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW1tZWQpOwotCWVsc2UKLQkgIHsKLQkgICAgYmZkX3ZtYSBiYXNlYWRkcjsKLQkgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgaWYgKGJyYW5jaCkKLQkgICAgICB7Ci0JCWltbWVkICo9IDI7Ci0JCWJhc2VhZGRyID0gbWVtYWRkciArIDI7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmICh1c2VfZXh0ZW5kKQotCSAgICAgIGJhc2VhZGRyID0gbWVtYWRkciAtIDI7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBzdGF0dXM7Ci0JCWJmZF9ieXRlIGJ1ZmZlclsyXTsKLQotCQliYXNlYWRkciA9IG1lbWFkZHI7Ci0KLQkJLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBpbiB0aGUgZGVsYXkgc2xvdCBvZiBhIGpyCi0gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoZSBiYXNlIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAganIgaW5zdHJ1Y3Rpb24uICBJZiBpdCBpcyBpbiB0aGUgZGVsYXkgc2xvdCBvZiBqYWxyCi0gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoZSBiYXNlIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgamFsciBpbnN0cnVjdGlvbi4gIFRoaXMgdGVzdCBpcyB1bnJlbGlhYmxlOiB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUgcHJldmlvdXMgd29yZCBpcwotICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uIG9yIGRhdGEuICAqLwotCQlzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyIC0gNCwgYnVmZmVyLCAyLAotCQkJCQkJICAgIGluZm8pOwotCQlpZiAoc3RhdHVzID09IDAKLQkJICAgICYmICgoKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQkJICA/IGJmZF9nZXRiMTYgKGJ1ZmZlcikKLQkJCSAgOiBiZmRfZ2V0bDE2IChidWZmZXIpKQotCQkJICYgMHhmODAwKSA9PSAweDE4MDApKQotCQkgIGJhc2VhZGRyID0gbWVtYWRkciAtIDQ7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyIC0gMiwgYnVmZmVyLAotCQkJCQkJCTIsIGluZm8pOwotCQkgICAgaWYgKHN0YXR1cyA9PSAwCi0JCQkmJiAoKChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJCSAgICAgID8gYmZkX2dldGIxNiAoYnVmZmVyKQotCQkJICAgICAgOiBiZmRfZ2V0bDE2IChidWZmZXIpKQotCQkJICAgICAmIDB4ZjgxZikgPT0gMHhlODAwKSkKLQkJICAgICAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gMjsKLQkJICB9Ci0JICAgICAgfQotCSAgICB2YWwgPSAoYmFzZWFkZHIgJiB+ICgoMSA8PCBzaGlmdCkgLSAxKSkgKyBpbW1lZDsKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwsIGluZm8pOwotCSAgICBpbmZvLT50YXJnZXQgPSB2YWw7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2EnOgotICAgICAgaWYgKCEgdXNlX2V4dGVuZCkKLQlleHRlbmQgPSAwOwotICAgICAgbCA9ICgobCAmIDB4MWYpIDw8IDIzKSB8ICgobCAmIDB4M2UwKSA8PCAxMykgfCAoZXh0ZW5kIDw8IDIpOwotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciAmIDB4ZjAwMDAwMDApIHwgbCwgaW5mbyk7Ci0gICAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfanNyOwotICAgICAgaW5mby0+dGFyZ2V0ID0gKG1lbWFkZHIgJiAweGYwMDAwMDAwKSB8IGw7Ci0gICAgICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdMJzoKLSAgICAgIHsKLQlpbnQgbmVlZF9jb21tYSwgYW1hc2ssIHNtYXNrOwotCi0JbmVlZF9jb21tYSA9IDA7Ci0KLQlsID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNikgJiBNSVBTMTZPUF9NQVNLX0lNTTY7Ci0KLQlhbWFzayA9IChsID4+IDMpICYgNzsKLQotCWlmIChhbWFzayA+IDAgJiYgYW1hc2sgPCA1KQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1s0XSk7Ci0JICAgIGlmIChhbWFzayA+IDEpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJCVzIiwKLQkJCQkgICAgIHJlZ19uYW1lc1thbWFzayArIDNdKTsKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICB9Ci0KLQlzbWFzayA9IChsID4+IDEpICYgMzsKLQlpZiAoc21hc2sgPT0gMykKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcz8/IiwKLQkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIpOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQllbHNlIGlmIChzbWFzayA+IDApCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMkJXMiLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIiwKLQkJCQkgICByZWdfbmFtZXNbMTZdKTsKLQkgICAgaWYgKHNtYXNrID4gMSkKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kJXMiLAotCQkJCSAgICAgcmVnX25hbWVzW3NtYXNrICsgMTVdKTsKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICB9Ci0KLQlpZiAobCAmIDEpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMkJXMiLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIiwKLQkJCQkgICByZWdfbmFtZXNbMzFdKTsKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICB9Ci0KLQlpZiAoYW1hc2sgPT0gNSB8fCBhbWFzayA9PSA2KQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJGYwIiwKLQkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIpOwotCSAgICBpZiAoYW1hc2sgPT0gNikKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kZjEiKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWlwcy1vcGMuYyBiL29wY29kZXMvbWlwcy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxZjQ0Zi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21pcHMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotLyogbWlwcy5oLiAgTWlwcyBvcGNvZGUgbGlzdCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSYWxwaCBDYW1wYmVsbCBhbmQgT1NGCi0gICBDb21tZW50ZWQgYW5kIG1vZGlmaWVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLQotLyogU2hvcnQgaGFuZCBzbyB0aGUgbGluZXMgYXJlbid0IHRvbyBsb25nLiAgKi8KLQotI2RlZmluZSBMREQgICAgIElOU05fTE9BRF9NRU1PUllfREVMQVkKLSNkZWZpbmUgTENECUlOU05fTE9BRF9DT1BST0NfREVMQVkKLSNkZWZpbmUgVUJEICAgICBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLSNkZWZpbmUgQ0JECUlOU05fQ09ORF9CUkFOQ0hfREVMQVkKLSNkZWZpbmUgQ09EICAgICBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZCi0jZGVmaW5lIENMRAlJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkKLSNkZWZpbmUgQ0JMCUlOU05fQ09ORF9CUkFOQ0hfTElLRUxZCi0jZGVmaW5lIFRSQVAJSU5TTl9UUkFQCi0jZGVmaW5lIFNNCUlOU05fU1RPUkVfTUVNT1JZCi0KLSNkZWZpbmUgV1JfZCAgICBJTlNOX1dSSVRFX0dQUl9ECi0jZGVmaW5lIFdSX3QgICAgSU5TTl9XUklURV9HUFJfVAotI2RlZmluZSBXUl8zMSAgIElOU05fV1JJVEVfR1BSXzMxICAgICAgIAotI2RlZmluZSBXUl9EICAgIElOU05fV1JJVEVfRlBSX0QgICAgICAgIAotI2RlZmluZSBXUl9UCUlOU05fV1JJVEVfRlBSX1QKLSNkZWZpbmUgV1JfUwlJTlNOX1dSSVRFX0ZQUl9TCi0jZGVmaW5lIFJEX3MgICAgSU5TTl9SRUFEX0dQUl9TICAgICAgICAgCi0jZGVmaW5lIFJEX2IgICAgSU5TTl9SRUFEX0dQUl9TICAgICAgICAgCi0jZGVmaW5lIFJEX3QgICAgSU5TTl9SRUFEX0dQUl9UICAgICAgICAgCi0jZGVmaW5lIFJEX1MgICAgSU5TTl9SRUFEX0ZQUl9TICAgICAgICAgCi0jZGVmaW5lIFJEX1QgICAgSU5TTl9SRUFEX0ZQUl9UICAgICAgICAgCi0jZGVmaW5lIFJEX1IJSU5TTl9SRUFEX0ZQUl9SCi0jZGVmaW5lIFdSX0NDCUlOU05fV1JJVEVfQ09ORF9DT0RFCi0jZGVmaW5lIFJEX0NDCUlOU05fUkVBRF9DT05EX0NPREUKLSNkZWZpbmUgUkRfQzAgICBJTlNOX0NPUAotI2RlZmluZSBSRF9DMQlJTlNOX0NPUAotI2RlZmluZSBSRF9DMiAgIElOU05fQ09QCi0jZGVmaW5lIFJEX0MzICAgSU5TTl9DT1AKLSNkZWZpbmUgV1JfQzAgICBJTlNOX0NPUAotI2RlZmluZSBXUl9DMQlJTlNOX0NPUAotI2RlZmluZSBXUl9DMiAgIElOU05fQ09QCi0jZGVmaW5lIFdSX0MzICAgSU5TTl9DT1AKLQotI2RlZmluZSBXUl9ISQlJTlNOX1dSSVRFX0hJCi0jZGVmaW5lIFJEX0hJCUlOU05fUkVBRF9ISQotI2RlZmluZSBNT0RfSEkgIFdSX0hJfFJEX0hJCi0KLSNkZWZpbmUgV1JfTE8JSU5TTl9XUklURV9MTwotI2RlZmluZSBSRF9MTwlJTlNOX1JFQURfTE8KLSNkZWZpbmUgTU9EX0xPICBXUl9MT3xSRF9MTwotCi0jZGVmaW5lIFdSX0hJTE8gV1JfSEl8V1JfTE8KLSNkZWZpbmUgUkRfSElMTyBSRF9ISXxSRF9MTwotI2RlZmluZSBNT0RfSElMTyBXUl9ISUxPfFJEX0hJTE8KLQotI2RlZmluZSBJU19NICAgIElOU05fTVVMVAotCi0jZGVmaW5lIEkxCUlOU05fSVNBMQotI2RlZmluZSBJMglJTlNOX0lTQTIKLSNkZWZpbmUgSTMJSU5TTl9JU0EzCi0jZGVmaW5lIEk0CUlOU05fSVNBNAotI2RlZmluZSBJNQlJTlNOX0lTQTUKLSNkZWZpbmUgUDMJSU5TTl80NjUwCi0jZGVmaW5lIEwxCUlOU05fNDAxMAotI2RlZmluZSBWMSAgICAgIElOU05fNDEwMAotI2RlZmluZSBUMyAgICAgIElOU05fMzkwMAotCi0jZGVmaW5lIEcxICAgICAgKFQzICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKQotCi0jZGVmaW5lIEcyICAgICAgKFQzICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKQotCi0jZGVmaW5lIEczIChJNCAgICAgICAgICAgICBcCi0gICAgICAgICAgICApCi0KLSNkZWZpbmUgTTEgICAgICAwCi0jZGVmaW5lIE0yICAgICAgMAotCi0vKiBUaGUgb3JkZXIgb2Ygb3ZlcmxvYWRlZCBpbnN0cnVjdGlvbnMgbWF0dGVycy4gIExhYmVsIGFyZ3VtZW50cyBhbmQKLSAgIHJlZ2lzdGVyIGFyZ3VtZW50cyBsb29rIHRoZSBzYW1lLiBJbnN0cnVjdGlvbnMgdGhhdCBjYW4gaGF2ZSBlaXRoZXIKLSAgIGZvciBhcmd1bWVudHMgbXVzdCBhcGVhciBpbiB0aGUgY29ycmVjdCBvcmRlciBpbiB0aGlzIHRhYmxlIGZvciB0aGUKLSAgIGFzc2VtYmxlciB0byBwaWNrIHRoZSByaWdodCBvbmUuIEluIG90aGVyIHdvcmRzLCBlbnRyaWVzIHdpdGgKLSAgIGltbWVkaWF0ZSBvcGVyYW5kcyBtdXN0IGFwZWFyIGFmdGVyIHRoZSBzYW1lIGluc3RydWN0aW9uIHdpdGgKLSAgIHJlZ2lzdGVycy4KLQotICAgTWFueSBpbnN0cnVjdGlvbnMgYXJlIHNob3J0IGhhbmQgZm9yIG90aGVyIGluc3RydWN0aW9ucyAoaS5lLiwgVGhlCi0gICBqYWwgPHJlZ2lzdGVyPiBpbnN0cnVjdGlvbiBpcyBzaG9ydCBmb3IgamFsciA8cmVnaXN0ZXI+KS4gICovCi0KLWNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBtaXBzX2J1aWx0aW5fb3Bjb2Rlc1tdID0gewotLyogVGhlc2UgaW5zdHJ1Y3Rpb25zIGFwcGVhciBmaXJzdCBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBmaW5kCi0gICB0aGVtIGZpcnN0LiAgVGhlIGFzc2VtYmxlcnMgdXNlcyBhIGhhc2ggdGFibGUgYmFzZWQgb24gdGhlCi0gICBpbnN0cnVjdGlvbiBuYW1lIGFueWhvdy4gICovCi0vKiBuYW1lLAlhcmdzLAltYXNrLAkJbWF0Y2gsCXBpbmZvICovCi17Im5vcCIsICAgICAiIiwJCTB4MDAwMDAwMDAsIDB4ZmZmZmZmZmYsCTAsCQlJMQl9LAoteyJsaSIsICAgICAgInQsaiIsICAgICAgMHgyNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJCUkxCX0sIC8qIGFkZGl1ICovCi17ImxpIiwJICAgICJ0LGkiLAkweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAkJSTEJfSwgLyogb3JpICovCi17ImxpIiwgICAgICAidCxJIiwJMCwgICAgKGludCkgTV9MSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibW92ZSIsICAgICJkLHMiLAkweDAwMDAwMDJkLCAweGZjMWYwN2ZmLCBXUl9kfFJEX3MsCUkzCX0sLyogZGFkZHUgKi8KLXsibW92ZSIsICAgICJkLHMiLAkweDAwMDAwMDIxLCAweGZjMWYwN2ZmLCBXUl9kfFJEX3MsCUkxCX0sLyogYWRkdSAqLwoteyJtb3ZlIiwgICAgImQscyIsCTB4MDAwMDAwMjUsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfcywJSTEJfSwvKiBvciAqLwoteyJiIiwgICAgICAgInAiLAkweDEwMDAwMDAwLCAweGZmZmYwMDAwLAlVQkQsCQlJMQl9LC8qIGJlcSAwLDAgKi8KLXsiYiIsICAgICAgICJwIiwJMHgwNDAxMDAwMCwgMHhmZmZmMDAwMCwJVUJELAkJSTEJfSwvKiBiZ2V6IDAgKi8KLXsiYmFsIiwgICAgICJwIiwJMHgwNDExMDAwMCwgMHhmZmZmMDAwMCwJVUJEfFdSXzMxLAlJMQl9LC8qIGJnZXphbCAwKi8KLQoteyJhYnMiLCAgICAgImQsdiIsCTAsICAgIChpbnQpIE1fQUJTLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJhYnMucyIsICAgIkQsViIsCTB4NDYwMDAwMDUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJhYnMuZCIsICAgIkQsViIsCTB4NDYyMDAwMDUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJhYnMucHMiLCAgIkQsViIsCTB4NDZjMDAwMDUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJNQl9LAoteyJhZGQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyMCwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17ImFkZCIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0FERF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJhZGQucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTF9LAoteyJhZGQuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTF9LAoteyJhZGQucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAwMCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAoteyJhZGRpIiwgICAgInQscixqIiwJMHgyMDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJhZGRpdSIsICAgInQscixqIiwJMHgyNDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJhZGR1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyMSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17ImFkZHUiLCAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0FERFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYWxudi5wcyIsICJELFYsVCxzIiwJMHg0YzAwMDAxZSwgMHhmYzAwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAoteyJhbmQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17ImFuZCIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0FORF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJhbmRpIiwgICAgInQscixpIiwJMHgzMDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAotLyogYiBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCi0vKiBiYWwgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLwoteyJiYzBmIiwgICAgInAiLAkweDQxMDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMGZsIiwgICAicCIsCTB4NDEwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMxZiIsICAgICJwIiwJMHg0NTAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUkxfE0xCX0sCi17ImJjMWYiLCAgICAiTixwIiwJMHg0NTAwMDAwMCwgMHhmZmUzMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUk0fE0xCX0sCi17ImJjMWZsIiwgICAicCIsCTB4NDUwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJMnxUM3xNMX0sCi17ImJjMWZsIiwgICAiTixwIiwJMHg0NTAyMDAwMCwgMHhmZmUzMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUk0fE0xCX0sCi17ImJjMmYiLCAgICAicCIsCTB4NDkwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMyZmwiLCAgICJwIiwJMHg0OTAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzNmIiwgICAgInAiLAkweDRkMDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjM2ZsIiwgICAicCIsCTB4NGQwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMwdCIsICAgICJwIiwJMHg0MTAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzB0bCIsICAgInAiLAkweDQxMDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjMXQiLCAgICAicCIsCTB4NDUwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJMQl9LAoteyJiYzF0IiwgICAgIk4scCIsCTB4NDUwMTAwMDAsIDB4ZmZlMzAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJNAl9LAoteyJiYzF0bCIsICAgInAiLAkweDQ1MDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTJ8VDMJfSwKLXsiYmMxdGwiLCAgICJOLHAiLAkweDQ1MDMwMDAwLCAweGZmZTMwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTQJfSwKLXsiYmMydCIsICAgICJwIiwJMHg0OTAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzJ0bCIsICAgInAiLAkweDQ5MDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjM3QiLCAgICAicCIsCTB4NGQwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMzdGwiLCAgICJwIiwJMHg0ZDAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiZXF6IiwgICAgInMscCIsCTB4MTAwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJiZXF6bCIsICAgInMscCIsCTB4NTAwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJiZXEiLCAgICAgInMsdCxwIiwJMHgxMDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JEfFJEX3N8UkRfdCwJSTEJfSwKLXsiYmVxIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkVRX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJlcWwiLCAgICAicyx0LHAiLAkweDUwMDAwMDAwLCAweGZjMDAwMDAwLAlDQkx8UkRfc3xSRF90LAlJMnxUMwl9LAoteyJiZXFsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CRVFMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZSIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdlIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZWwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdldSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdldSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2V1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0VVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdldWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdleiIsICAgICJzLHAiLAkweDA0MDEwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmdlemwiLCAgICJzLHAiLAkweDA0MDMwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmdlemFsIiwgICJzLHAiLAkweDA0MTEwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfc3xXUl8zMSwJSTEJfSwKLXsiYmdlemFsbCIsICJzLHAiLAkweDA0MTMwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmd0IiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdULAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3QiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0bCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdUTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0bCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ3R1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3R1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndHVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVFVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ3R1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ3R6IiwgICAgInMscCIsCTB4MWMwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJiZ3R6bCIsICAgInMscCIsCTB4NWMwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibGUiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGVsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGVsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsZXUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZXUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxldWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsZXVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMRVVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsZXoiLCAgICAicyxwIiwJMHgxODAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJsZXpsIiwgICAicyxwIiwJMHg1ODAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJsdCIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVCwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0IiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdGwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVEwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdGwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVExfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmx0dSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxUVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0dSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHR1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFRVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmx0dWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmx0eiIsICAgICJzLHAiLAkweDA0MDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmx0emwiLCAgICJzLHAiLAkweDA0MDIwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmx0emFsIiwgICJzLHAiLAkweDA0MTAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfc3xXUl8zMSwJSTEJfSwKLXsiYmx0emFsbCIsICJzLHAiLAkweDA0MTIwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYm5leiIsICAgICJzLHAiLAkweDE0MDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYm5lemwiLCAgICJzLHAiLAkweDU0MDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYm5lIiwgICAgICJzLHQscCIsCTB4MTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCRHxSRF9zfFJEX3QsCUkxCX0sCi17ImJuZSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JORV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibmVsIiwgICAgInMsdCxwIiwJMHg1NDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JMfFJEX3N8UkRfdCwgCUkyfFQzCX0sCi17ImJuZWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JORUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYnJlYWsiLCAgICIiLAkJMHgwMDAwMDAwZCwgMHhmZmZmZmZmZiwJVFJBUCwJCUkxCX0sCi17ImJyZWFrIiwgICAiYyIsCTB4MDAwMDAwMGQsIDB4ZmMwMGZmZmYsCVRSQVAsCQlJMQl9LAoteyJicmVhayIsICAgImMscSIsCTB4MDAwMDAwMGQsIDB4ZmMwMDAwM2YsCVRSQVAsCQlJMQl9LAoteyJjLmYuZCIsICAgIlMsVCIsCTB4NDYyMDAwMzAsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLmYuZCIsICAgIk0sUyxUIiwJMHg0NjIwMDAzMCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMuZi5zIiwgICAiUyxUIiwJMHg0NjAwMDAzMCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMuZi5zIiwgICAiTSxTLFQiLAkweDQ2MDAwMDMwLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5mLnBzIiwgICJTLFQiLAkweDQ2YzAwMDMwLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5mLnBzIiwgICJNLFMsVCIsCTB4NDZjMDAwMzAsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVuLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzEsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVuLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzMSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMudW4ucyIsICAiUyxUIiwJMHg0NjAwMDAzMSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudW4ucyIsICAiTSxTLFQiLAkweDQ2MDAwMDMxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy51bi5wcyIsICJTLFQiLAkweDQ2YzAwMDMxLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51bi5wcyIsICJNLFMsVCIsCTB4NDZjMDAwMzEsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmVxLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzIsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLmVxLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzMiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMuZXEucyIsICAiUyxUIiwJMHg0NjAwMDAzMiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMuZXEucyIsICAiTSxTLFQiLAkweDQ2MDAwMDMyLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5lcS5wcyIsICJTLFQiLAkweDQ2YzAwMDMyLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5lcS5wcyIsICJNLFMsVCIsCTB4NDZjMDAwMzIsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVlcS5kIiwgIlMsVCIsCTB4NDYyMDAwMzMsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVlcS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzMywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMudWVxLnMiLCAiUyxUIiwJMHg0NjAwMDAzMywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudWVxLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDMzLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy51ZXEucHMiLCJTLFQiLAkweDQ2YzAwMDMzLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51ZXEucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzMsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmx0LnMiLCAgIlMsVCIsCTB4NDYwMDAwM2MsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmx0LnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzYywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMub2x0LmQiLCAiUyxUIiwJMHg0NjIwMDAzNCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMub2x0LmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5vbHQucyIsICJTLFQiLAkweDQ2MDAwMDM0LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5vbHQucyIsICJNLFMsVCIsCTB4NDYwMDAwMzQsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm9sdC5wcyIsIlMsVCIsCTB4NDZjMDAwMzQsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm9sdC5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzNCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudWx0LmQiLCAiUyxUIiwJMHg0NjIwMDAzNSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudWx0LmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM1LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy51bHQucyIsICJTLFQiLAkweDQ2MDAwMDM1LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51bHQucyIsICJNLFMsVCIsCTB4NDYwMDAwMzUsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnVsdC5wcyIsIlMsVCIsCTB4NDZjMDAwMzUsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVsdC5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzNSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubGUucyIsICAiUyxUIiwJMHg0NjAwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubGUucyIsICAiTSxTLFQiLAkweDQ2MDAwMDNlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5vbGUuZCIsICJTLFQiLAkweDQ2MjAwMDM2LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5vbGUuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzYsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm9sZS5zIiwgIlMsVCIsCTB4NDYwMDAwMzYsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm9sZS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMub2xlLnBzIiwiUyxUIiwJMHg0NmMwMDAzNiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMub2xlLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM2LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51bGUuZCIsICJTLFQiLAkweDQ2MjAwMDM3LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51bGUuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzcsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnVsZS5zIiwgIlMsVCIsCTB4NDYwMDAwMzcsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVsZS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMudWxlLnBzIiwiUyxUIiwJMHg0NmMwMDAzNywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudWxlLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5zZi5kIiwgICJTLFQiLAkweDQ2MjAwMDM4LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5zZi5kIiwgICJNLFMsVCIsCTB4NDYyMDAwMzgsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnNmLnMiLCAgIlMsVCIsCTB4NDYwMDAwMzgsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnNmLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzOCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMuc2YucHMiLCAiUyxUIiwJMHg0NmMwMDAzOCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuc2YucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDM4LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ2xlLmQiLCJTLFQiLAkweDQ2MjAwMDM5LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ2xlLmQiLCJNLFMsVCIsCTB4NDYyMDAwMzksIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm5nbGUucyIsIlMsVCIsCTB4NDYwMDAwMzksIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5nbGUucyIsIk0sUyxUIiwJMHg0NjAwMDAzOSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubmdsZS5wcyIsIlMsVCIsCTB4NDZjMDAwMzksIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5nbGUucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzksIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnNlcS5kIiwgIlMsVCIsCTB4NDYyMDAwM2EsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnNlcS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzYSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMuc2VxLnMiLCAiUyxUIiwJMHg0NjAwMDAzYSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMuc2VxLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNhLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5zZXEucHMiLCJTLFQiLAkweDQ2YzAwMDNhLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5zZXEucHMiLCJNLFMsVCIsCTB4NDZjMDAwM2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5nbC5kIiwgIlMsVCIsCTB4NDYyMDAwM2IsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5nbC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzYiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubmdsLnMiLCAiUyxUIiwJMHg0NjAwMDAzYiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmdsLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNiLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5uZ2wucHMiLCJTLFQiLAkweDQ2YzAwMDNiLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ2wucHMiLCJNLFMsVCIsCTB4NDZjMDAwM2IsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmx0LmQiLCAgIlMsVCIsCTB4NDYyMDAwM2MsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLmx0LmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzYywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubHQucHMiLCAiUyxUIiwJMHg0NmMwMDAzYywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubHQucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDNjLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ2UuZCIsICJTLFQiLAkweDQ2MjAwMDNkLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ2UuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm5nZS5zIiwgIlMsVCIsCTB4NDYwMDAwM2QsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5nZS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzZCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubmdlLnBzIiwiUyxUIiwJMHg0NmMwMDAzZCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdlLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDNkLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sZS5kIiwgICJTLFQiLAkweDQ2MjAwMDNlLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5sZS5kIiwgICJNLFMsVCIsCTB4NDYyMDAwM2UsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLmxlLnBzIiwgIlMsVCIsCTB4NDZjMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmxlLnBzIiwgIk0sUyxUIiwJMHg0NmMwMDAzZSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmd0LmQiLCAiUyxUIiwJMHg0NjIwMDAzZiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmd0LmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNmLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5uZ3QucyIsICJTLFQiLAkweDQ2MDAwMDNmLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ3QucyIsICJNLFMsVCIsCTB4NDYwMDAwM2YsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm5ndC5wcyIsIlMsVCIsCTB4NDZjMDAwM2YsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5ndC5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzZiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImNhY2hlIiwgICAiayxvKGIpIiwJMHhiYzAwMDAwMCwgMHhmYzAwMDAwMCwgUkRfYiwJCUkzfFQzfE0xCX0sCi17ImNlaWwubC5kIiwgIkQsUyIsCTB4NDYyMDAwMGEsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJjZWlsLmwucyIsICJELFMiLAkweDQ2MDAwMDBhLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsiY2VpbC53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17ImNlaWwudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJjZmMwIiwgICAgInQsRyIsCTB4NDA0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MwLAlJMQl9LAoteyJjZmMxIiwgICAgInQsRyIsCTB4NDQ0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MxfEZQX1MsCUkxCX0sCi17ImNmYzEiLCAgICAidCxTIiwJMHg0NDQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzF8RlBfUywJSTEJfSwKLXsiY2ZjMiIsICAgICJ0LEciLAkweDQ4NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMiwJSTEJfSwKLXsiY2ZjMyIsICAgICJ0LEciLAkweDRjNDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMywJSTEJfSwKLXsiY3RjMCIsICAgICJ0LEciLAkweDQwYzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQywJSTEJfSwKLXsiY3RjMSIsICAgICJ0LEciLAkweDQ0YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjdGMxIiwgICAgInQsUyIsCTB4NDRjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDfEZQX1MsCUkxCX0sCi17ImN0YzIiLCAgICAidCxHIiwJMHg0OGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCi17ImN0YzMiLCAgICAidCxHIiwJMHg0Y2MwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCi17ImN2dC5kLmwiLCAiRCxTIiwJMHg0NmEwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImN2dC5kLnMiLCAiRCxTIiwJMHg0NjAwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0R8RlBfUywJSTEJfSwKLXsiY3Z0LmQudyIsICJELFMiLAkweDQ2ODAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsiY3Z0LmwuZCIsICJELFMiLAkweDQ2MjAwMDI1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiY3Z0LmwucyIsICJELFMiLAkweDQ2MDAwMDI1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsiY3Z0LnMubCIsICJELFMiLAkweDQ2YTAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsiY3Z0LnMuZCIsICJELFMiLAkweDQ2MjAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAlJMQl9LAoteyJjdnQucy53IiwgIkQsUyIsCTB4NDY4MDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJjdnQucy5wbCIsIkQsUyIsCTB4NDZjMDAwMjgsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TfEZQX0QsCUk1CX0sCi17ImN2dC5zLnB1IiwiRCxTIiwJMHg0NmMwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1N8RlBfRCwJSTUJfSwKLXsiY3Z0LncuZCIsICJELFMiLAkweDQ2MjAwMDI0LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsiY3Z0LncucyIsICJELFMiLAkweDQ2MDAwMDI0LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsiY3Z0LnBzLnMiLCJELFYsVCIsCTB4NDYwMDAwMjYsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLXsiZGFicyIsICAgICJkLHYiLAkwLCAgICAoaW50KSBNX0RBQlMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRhZGQiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJjLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZGFkZCIsICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fREFERF9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkYWRkaSIsICAgInQscixqIiwJMHg2MDAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9zLAlJMwl9LAoteyJkYWRkaXUiLCAgInQscixqIiwJMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9zLAlJMwl9LAoteyJkYWRkdSIsICAgImQsdix0IiwJMHgwMDAwMDAyZCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRhZGR1IiwgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0RBRERVX0ksCUlOU05fTUFDUk8sCUkzCX0sCi0vKiBkY3RyIGFuZCBkY3R3IGFyZSB1c2VkIG9uIHRoZSByNTAwMC4gICovCi17ImRjdHIiLCAgICAibyhiKSIsCTB4YmMwNTAwMDAsIDB4ZmMxZjAwMDAsIFJEX2IsCUkzCX0sCi17ImRjdHciLCAgICAibyhiKSIsCTB4YmMwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX2IsCUkzCX0sCi17ImRlcmV0IiwgICAiIiwgICAgICAgICAweDQyMDAwMDFmLCAweGZmZmZmZmZmLCAgICAwLAlHMnxNMQl9LAotLyogRm9yIGRkaXYsIHNlZSB0aGUgY29tbWVudHMgYWJvdXQgZGl2LiAgKi8KLXsiZGRpdiIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZGRpdiIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRERJVl8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkZGl2IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ERElWXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAotLyogRm9yIGRkaXZ1LCBzZWUgdGhlIGNvbW1lbnRzIGFib3V0IGRpdi4gICovCi17ImRkaXZ1IiwgICAieixzLHQiLAkweDAwMDAwMDFmLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRkaXZ1IiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RESVZVXzMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRkaXZ1IiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RESVZVXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAotLyogVGhlIE1JUFMgYXNzZW1ibGVyIHRyZWF0cyB0aGUgZGl2IG9wY29kZSB3aXRoIHR3byBvcGVyYW5kcyBhcwotICAgdGhvdWdoIHRoZSBmaXJzdCBvcGVyYW5kIGFwcGVhcmVkIHR3aWNlICh0aGUgZmlyc3Qgb3BlcmFuZCBpcyBib3RoCi0gICBhIHNvdXJjZSBhbmQgYSBkZXN0aW5hdGlvbikuICBUbyBnZXQgdGhlIGRpdiBtYWNoaW5lIGluc3RydWN0aW9uLAotICAgeW91IG11c3QgdXNlIGFuIGV4cGxpY2l0IGRlc3RpbmF0aW9uIG9mICQwLiAgKi8KLXsiZGl2IiwgICAgICJ6LHMsdCIsCTB4MDAwMDAwMWEsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2IiwgICAgICJ6LHQiLAkweDAwMDAwMDFhLCAweGZmZTBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdiIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RJVl8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkaXYiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ESVZfM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImRpdi5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAzLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMQl9LAoteyJkaXYucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTEJfSwKLS8qIEZvciBkaXZ1LCBzZWUgdGhlIGNvbW1lbnRzIGFib3V0IGRpdi4gICovCi17ImRpdnUiLCAgICAieixzLHQiLAkweDAwMDAwMDFiLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdnUiLCAgICAieix0IiwJMHgwMDAwMDAxYiwgMHhmZmUwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXZ1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ESVZVXzMsCUlOU05fTUFDUk8sCUkxCX0sCi17ImRpdnUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RJVlVfM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImRsYSIsICAgICAidCxvKGIpIiwJMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9zLAlJMwl9LCAvKiBkYWRkaXUgKi8KLXsiZGxhIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0RMQV9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGxpIiwgICAgICJ0LGoiLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCUkzCX0sIC8qIGFkZGl1ICovCi17ImRsaSIsCSAgICAidCxpIiwJMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJSTMJfSwgLyogb3JpICovCi17ImRsaSIsICAgICAidCxJIiwJMCwgICAgKGludCkgTV9ETEksCUlOU05fTUFDUk8sCUkzCX0sCi0KLXsiZG1hZGQxNiIsICJzLHQiLCAgICAgIDB4MDAwMDAwMjksIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9MT3xSRF9MTywJVjEJfSwKLXsiZG1mYzAiLCAgICJ0LEciLAkweDQwMjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9DMCwJSTMJfSwKLXsiZG10YzAiLCAgICJ0LEciLAkweDQwYTAwMDAwLCAweGZmZTAwN2ZmLCBDT0R8UkRfdHxXUl9DMHxXUl9DQywJSTMJfSwKLXsiZG1mYzEiLCAgICJ0LFMiLAkweDQ0MjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9TfEZQX1MsCUkzCX0sCi17ImRtdGMxIiwgICAidCxTIiwJMHg0NGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfU3xGUF9TLAlJMwl9LAoteyJkbWZjMiIsICAgInQsUyIsCTB4NDgyMDAwMDAsIDB4ZmZlMDA3ZmYsIExDRHxXUl90fFJEX1N8RlBfUywJSTMJfSwKLXsiZG10YzIiLCAgICJ0LFMiLAkweDQ4YTAwMDAwLCAweGZmZTAwN2ZmLCBDT0R8UkRfdHxXUl9TfEZQX1MsCUkzCX0sCi17ImRtdWwiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUwsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWwiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bG8iLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRE1VTE8sCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvIiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxPX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvdSIsICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUxPVSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bG91IiwgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRE1VTE9VX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWx0IiwgICAicyx0IiwJMHgwMDAwMDAxYywgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAkgICAgSTN9LAoteyJkbXVsdHUiLCAgInMsdCIsCTB4MDAwMDAwMWQsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywgICAgICBJM30sCi17ImRuZWciLCAgICAiZCx3IiwJMHgwMDAwMDAyZSwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMwl9LCAvKiBkc3ViIDAgKi8KLXsiZG5lZ3UiLCAgICJkLHciLAkweDAwMDAwMDJmLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkzCX0sIC8qIGRzdWJ1IDAqLwoteyJkcmVtIiwgICAgInoscyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkcmVtIiwgICAgImQsdix0IiwJMywgICAgKGludCkgTV9EUkVNXzMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRyZW0iLCAgICAiZCx2LEkiLAkzLCAgICAoaW50KSBNX0RSRU1fM0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRyZW11IiwgICAieixzLHQiLAkweDAwMDAwMDFmLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRyZW11IiwgICAiZCx2LHQiLAkzLCAgICAoaW50KSBNX0RSRU1VXzMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRyZW11IiwgICAiZCx2LEkiLAkzLCAgICAoaW50KSBNX0RSRU1VXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkc2xsdiIsICAgImQsdCxzIiwJMHgwMDAwMDAxNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sCi17ImRzbGwzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNjLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sCi17ImRzbGwiLCAgICAiZCx3LHMiLAkweDAwMDAwMDE0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwgLyogZHNsbHYgKi8KLXsiZHNsbCIsICAgICJkLHcsPiIsCTB4MDAwMDAwM2MsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwgLyogZHNsbDMyICovCi17ImRzbGwiLCAgICAiZCx3LDwiLAkweDAwMDAwMDM4LCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmF2IiwgICAiZCx0LHMiLAkweDAwMDAwMDE3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwKLXsiZHNyYTMyIiwgICJkLHcsPCIsCTB4MDAwMDAwM2YsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwKLXsiZHNyYSIsICAgICJkLHcscyIsCTB4MDAwMDAwMTcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LCAvKiBkc3JhdiAqLwoteyJkc3JhIiwgICAgImQsdyw+IiwJMHgwMDAwMDAzZiwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LCAvKiBkc3JhMzIgKi8KLXsiZHNyYSIsICAgICJkLHcsPCIsCTB4MDAwMDAwM2IsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTMJfSwKLXsiZHNybHYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LAoteyJkc3JsMzIiLCAgImQsdyw8IiwJMHgwMDAwMDAzZSwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LAoteyJkc3JsIiwgICAgImQsdyxzIiwJMHgwMDAwMDAxNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sIC8qIGRzcmx2ICovCi17ImRzcmwiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNlLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sIC8qIGRzcmwzMiAqLwoteyJkc3JsIiwgICAgImQsdyw8IiwJMHgwMDAwMDAzYSwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMwl9LAoteyJkc3ViIiwgICAgImQsdix0IiwJMHgwMDAwMDAyZSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRzdWIiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RTVUJfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHN1YnUiLCAgICJkLHYsdCIsCTB4MDAwMDAwMmYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkc3VidSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9EU1VCVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJlcmV0IiwgICAgIiIsCQkweDQyMDAwMDE4LCAweGZmZmZmZmZmLAkwLAlJM3xNMQl9LAoteyJmbG9vci5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwYiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImZsb29yLmwucyIsICJELFMiLAkweDQ2MDAwMDBiLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsiZmxvb3Iudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJmbG9vci53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17ImZsdXNoaSIsICAiIiwJCTB4YmMwMTAwMDAsIDB4ZmZmZmZmZmYsIDAsCQlMMQl9LAoteyJmbHVzaGQiLCAgIiIsCQkweGJjMDIwMDAwLCAweGZmZmZmZmZmLCAwLCBMMQkJfSwKLXsiZmx1c2hpZCIsICIiLAkJMHhiYzAzMDAwMCwgMHhmZmZmZmZmZiwgMCwgTDEJCX0sCi17ImhpYmVybmF0ZSIsIiIsICAgICAgICAweDQyMDAwMDIzLCAweGZmZmZmZmZmLAkwLCBWMQl9LAoteyJqciIsICAgICAgInMiLAkweDAwMDAwMDA4LCAweGZjMWZmZmZmLAlVQkR8UkRfcywJSTEJfSwKLXsiaiIsICAgICAgICJzIiwJMHgwMDAwMDAwOCwgMHhmYzFmZmZmZiwJVUJEfFJEX3MsCUkxCX0sIC8qIGpyICovCi0vKiBTVlI0IFBJQyBjb2RlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGosIHNvIGl0IG11c3QgYmUgYQotICAgbWFjcm8uICAqLwoteyJqIiwJICAgICJhIiwJMCwgICAgIChpbnQpIE1fSl9BLAlJTlNOX01BQ1JPLAlJMQl9LAotLyogVGhpcyBmb3JtIG9mIGogaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBpbnRlcm5hbGx5IGJ5IHRoZQotICAgYXNzZW1ibGVyLCBidXQgd2lsbCBuZXZlciBtYXRjaCB1c2VyIGlucHV0IChiZWNhdXNlIHRoZSBsaW5lIGFib3ZlCi0gICB3aWxsIG1hdGNoIGZpcnN0KS4gICovCi17ImoiLCAgICAgICAiYSIsCTB4MDgwMDAwMDAsIDB4ZmMwMDAwMDAsCVVCRCwJCUkxCX0sCi17ImphbHIiLCAgICAicyIsCTB4MDAwMGY4MDksIDB4ZmMxZmZmZmYsCVVCRHxSRF9zfFdSX2QsCUkxCX0sCi17ImphbHIiLCAgICAiZCxzIiwJMHgwMDAwMDAwOSwgMHhmYzFmMDdmZiwJVUJEfFJEX3N8V1JfZCwJSTEJfSwKLS8qIFNWUjQgUElDIGNvZGUgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBmb3IgamFsLCBzbyBpdCBtdXN0IGJlIGEKLSAgIG1hY3JvLiAgKi8KLXsiamFsIiwgICAgICJkLHMiLAkwLCAgICAgKGludCkgTV9KQUxfMiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiamFsIiwgICAgICJzIiwJMCwgICAgIChpbnQpIE1fSkFMXzEsCUlOU05fTUFDUk8sCUkxCX0sCi17ImphbCIsICAgICAiYSIsCTAsICAgICAoaW50KSBNX0pBTF9BLAlJTlNOX01BQ1JPLAlJMQl9LAotLyogVGhpcyBmb3JtIG9mIGphbCBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGludGVybmFsbHkgYnkgdGhlCi0gICBhc3NlbWJsZXIsIGJ1dCB3aWxsIG5ldmVyIG1hdGNoIHVzZXIgaW5wdXQgKGJlY2F1c2UgdGhlIGxpbmUgYWJvdmUKLSAgIHdpbGwgbWF0Y2ggZmlyc3QpLiAgKi8KLXsiamFsIiwgICAgICJhIiwJMHgwYzAwMDAwMCwgMHhmYzAwMDAwMCwJVUJEfFdSXzMxLAlJMQl9LAotICAvKiBqYWx4IHJlYWxseSBzaG91bGQgb25seSBiZSBhdmFsaWFibGUgaWYgbWlwczE2IGlzIGF2YWlsYWJsZSwKLSAgICAgYnV0IGZvciBub3cgbWFrZSBpdCBJMS4gKi8KLXsiamFseCIsICAgICJhIiwJMHg3NDAwMDAwMCwgMHhmYzAwMDAwMCwgVUJEfFdSXzMxLAlJMSAgICAgIH0sCi17ImxhIiwgICAgICAidCxvKGIpIiwJMHgyNDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LCAvKiBhZGRpdSAqLwoteyJsYSIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxiIiwgICAgICAidCxvKGIpIiwJMHg4MDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibGIiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xCX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsYnUiLCAgICAgInQsbyhiKSIsCTB4OTAwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxidSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQlVfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkIiwJICAgICJ0LG8oYikiLCAgIDB4ZGMwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfYiwJSTMJfSwKLXsibGQiLCAgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX0xEX09CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkYzEiLCAgICAiVCxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAlJMgl9LAoteyJsZGMxIiwgICAgIkUsbyhiKSIsCTB4ZDQwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX1R8RlBfRCwJSTIJfSwKLXsibGRjMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImxkYzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsLmQiLCAgICAgIlQsbyhiKSIsCTB4ZDQwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX1R8RlBfRCwJSTIJfSwgLyogbGRjMSAqLwoteyJsLmQiLCAgICAgIlQsbyhiKSIsCTAsICAgIChpbnQpIE1fTF9ET0IsCUlOU05fTUFDUk8sCUkxCX0sCi17ImwuZCIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MX0RBQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGRjMiIsICAgICJFLG8oYikiLAkweGQ4MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9DQywJSTIJfSwKLXsibGRjMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzJfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImxkYzMiLCAgICAiRSxvKGIpIiwJMHhkYzAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfQ0MsCUkyCX0sCi17ImxkYzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MREMzX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsZGwiLAkgICAgInQsbyhiKSIsCTB4NjgwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxXUl90fFJEX2IsCUkzCX0sCi17ImxkbCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MRExfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17ImxkciIsCSAgICAidCxvKGIpIiwJMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFdSX3R8UkRfYiwJSTMJfSwKLXsibGRyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xEUl9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsibGR4YzEiLCAgICJELHQoYikiLAkweDRjMDAwMDAxLCAweGZjMDBmODNmLCBMRER8V1JfRHxSRF90fFJEX2IsCUk0CX0sCi17ImxoIiwgICAgICAidCxvKGIpIiwJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibGgiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xIX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaHUiLCAgICAgInQsbyhiKSIsCTB4OTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxodSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MSFVfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi0vKiBsaSBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlLiAgKi8KLXsibGkuZCIsICAgICJ0LEYiLAkwLCAgICAoaW50KSBNX0xJX0QsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxpLmQiLCAgICAiVCxMIiwJMCwgICAgKGludCkgTV9MSV9ERCwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGkucyIsICAgICJ0LGYiLAkwLCAgICAoaW50KSBNX0xJX1MsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxpLnMiLCAgICAiVCxsIiwJMCwgICAgKGludCkgTV9MSV9TUywJSU5TTl9NQUNSTywJSTEJfSwKLXsibGwiLAkgICAgInQsbyhiKSIsCTB4YzAwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxSRF9ifFdSX3QsCUkyCX0sCi17ImxsIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xMX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsbGQiLAkgICAgInQsbyhiKSIsCTB4ZDAwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxSRF9ifFdSX3QsCUkzCX0sCi17ImxsZCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MTERfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17Imx1aSIsICAgICAidCx1IiwJMHgzYzAwMDAwMCwgMHhmZmUwMDAwMCwJV1JfdCwJCUkxCX0sCi17Imx1eGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwNSwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9iLAlJNQl9LAoteyJsdyIsICAgICAgInQsbyhiKSIsCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17Imx3IiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMCIsICAgICJFLG8oYikiLAkweGMwMDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9DQywJSTEJfSwKLXsibHdjMCIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzBfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzEiLCAgICAiVCxvKGIpIiwJMHhjNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfVHxGUF9TLAlJMQl9LAoteyJsd2MxIiwgICAgIkUsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJSTEJfSwKLXsibHdjMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsLnMiLCAgICAgIlQsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJSTEJfSwgLyogbHdjMSAqLwoteyJsLnMiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMiIsICAgICJFLG8oYikiLAkweGM4MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9DQywJSTEJfSwKLXsibHdjMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzJfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzMiLCAgICAiRSxvKGIpIiwJMHhjYzAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCi17Imx3YzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MzX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2wiLCAgICAgInQsbyhiKSIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17Imx3bCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0xfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxjYWNoZSIsICAidCxvKGIpIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTIJfSwgLyogc2FtZSAqLwoteyJsY2FjaGUiLCAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdMX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBsd2wgKi8KLXsibHdyIiwgICAgICJ0LG8oYikiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsd3IiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdSX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJmbHVzaCIsICAgInQsbyhiKSIsCTB4OTgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkyCX0sIC8qIHNhbWUgKi8KLXsiZmx1c2giLCAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXUl9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgbHdyICovCi17Imx3dSIsICAgICAidCxvKGIpIiwJMHg5YzAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTMJfSwKLXsibHd1IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXVV9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsibHd4YzEiLCAgICJELHQoYikiLAkweDRjMDAwMDAwLCAweGZjMDBmODNmLCBMRER8V1JfRHxSRF90fFJEX2IsCUk0CX0sCi0KLQoteyJtYWQiLAkgICAgInMsdCIsCTB4NzAwMDAwMDAsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xSRF9ISXxSRF9MTywJUDMJfSwKLXsibWFkdSIsICAgICJzLHQiLAkweDcwMDAwMDAxLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98UkRfSEl8UkRfTE8sCVAzCX0sCi17Im1hZGQuZCIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjEsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibWFkZC5zIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyMCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJtYWRkLnBzIiwgIkQsUixTLFQiLAkweDRjMDAwMDI2LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk1CX0sCi17Im1hZGQiLCAgICAicyx0IiwJMHgwMDAwMDAxYywgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAkJTDEJfSwKLXsibWFkZCIsICAgICJzLHQiLAkweDcwMDAwMDAwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJICAgICAgICBHMXxNMQl9LAoteyJtYWRkIiwgICAgImQscyx0IiwJMHg3MDAwMDAwMCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwJRzEJfSwKLXsibWFkZHUiLCAgICJzLHQiLAkweDAwMDAwMDFkLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCQlMMQl9LAoteyJtYWRkdSIsICAgInMsdCIsCTB4NzAwMDAwMDEsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAlHMXxNMX0sCi17Im1hZGR1IiwgICAiZCxzLHQiLAkweDcwMDAwMDAxLCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLAlHMX0sCi17Im1hZGQxNiIsICAicyx0IiwgICAgICAweDAwMDAwMDI4LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE98UkRfSEl8UkRfTE8sCVYxCX0sCi17Im1mYzAiLCAgICAidCxHIiwJMHg0MDAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzAsCUkxCX0sCi17Im1mYzEiLCAgICAidCxTIiwJMHg0NDAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfU3xGUF9TLAlJMQl9LAoteyJtZmMxIiwgICAgInQsRyIsCTB4NDQwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX1N8RlBfUywJSTEJfSwKLXsibWZjMiIsICAgICJ0LEciLAkweDQ4MDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMiwJSTEJfSwKLXsibWZjMyIsICAgICJ0LEciLAkweDRjMDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMywJSTEJfSwKLXsibWZoaSIsICAgICJkIiwJMHgwMDAwMDAxMCwgMHhmZmZmMDdmZiwJV1JfZHxSRF9ISSwJSTEJfSwKLXsibWZsbyIsICAgICJkIiwJMHgwMDAwMDAxMiwgMHhmZmZmMDdmZiwJV1JfZHxSRF9MTywJSTEJfSwKLXsibW92LmQiLCAgICJELFMiLAkweDQ2MjAwMDA2LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsibW92LnMiLCAgICJELFMiLAkweDQ2MDAwMDA2LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsibW92LnBzIiwgICJELFMiLAkweDQ2YzAwMDA2LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTUJfSwKLXsibW92ZiIsICAgICJkLHMsTiIsCTB4MDAwMDAwMDEsIDB4ZmMwMzA3ZmYsIFdSX2R8UkRfc3xSRF9DQ3xGUF9EfEZQX1MsIEk0fE0xfSwKLXsibW92Zi5kIiwgICJELFMsTiIsCTB4NDYyMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNHxNMQl9LAoteyJtb3ZmLnMiLCAgIkQsUyxOIiwJMHg0NjAwMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX1MsCUk0fE0xCX0sCi17Im1vdmYucHMiLCAiRCxTLE4iLAkweDQ2YzAwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwJSTUJfSwKLXsibW92biIsICAgICJkLHYsdCIsCTB4MDAwMDAwMGIsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJNHxNMQl9LAoteyJmZmMiLCAgICAgImQsdiIsCTB4MDAwMDAwMGIsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfcyxMMQl9LAoteyJtb3ZuLmQiLCAgIkQsUyx0IiwJMHg0NjIwMDAxMywgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfRCwJSTR8TTEJfSwKLXsibW92bi5zIiwgICJELFMsdCIsCTB4NDYwMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX1MsCUk0fE0xCX0sCi17Im1vdnQiLCAgICAiZCxzLE4iLAkweDAwMDEwMDAxLCAweGZjMDMwN2ZmLCBXUl9kfFJEX3N8UkRfQ0MsCUk0fE0xCX0sCi17Im1vdnQuZCIsICAiRCxTLE4iLAkweDQ2MjEwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwJSTR8TTEJfSwKLXsibW92dC5zIiwgICJELFMsTiIsCTB4NDYwMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9TLAlJNHxNMQl9LAoteyJtb3Z0LnBzIiwgIkQsUyxOIiwJMHg0NmMxMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCUk1fSwKLXsibW92eiIsICAgICJkLHYsdCIsCTB4MDAwMDAwMGEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJNHxNMQl9LAoteyJmZnMiLCAgICAgImQsdiIsCTB4MDAwMDAwMGEsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfcyxMMQl9LAoteyJtb3Z6LmQiLCAgIkQsUyx0IiwJMHg0NjIwMDAxMiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfRCwJSTR8TTEJfSwKLXsibW92ei5zIiwgICJELFMsdCIsCTB4NDYwMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX1MsCUk0fE0xCX0sCi0vKiBtb3ZlIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KLXsibXN1Yi5kIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyOSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoteyJtc3ViLnMiLCAgIkQsUixTLFQiLAkweDRjMDAwMDI4LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCi17Im1zdWIucHMiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMmUsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTUJfSwKLXsibXN1YiIsICAgICJzLHQiLAkweDAwMDAwMDFlLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sTDEJfSwKLXsibXN1YnUiLCAgICJzLHQiLAkweDAwMDAwMDFmLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sTDEJfSwKLXsibXRjMCIsICAgICJ0LEciLAkweDQwODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DMHxXUl9DQywJSTEJfSwKLXsibXRjMSIsICAgICJ0LFMiLAkweDQ0ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9TfEZQX1MsCUkxCX0sCi17Im10YzEiLCAgICAidCxHIiwJMHg0NDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfU3xGUF9TLAlJMQl9LAoteyJtdGMyIiwgICAgInQsRyIsCTB4NDg4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MyfFdSX0NDLAlJMQl9LAoteyJtdGMzIiwgICAgInQsRyIsCTB4NGM4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MzfFdSX0NDLAlJMQl9LAoteyJtdGhpIiwgICAgInMiLAkweDAwMDAwMDExLCAweGZjMWZmZmZmLAlSRF9zfFdSX0hJLAlJMQl9LAoteyJtdGxvIiwgICAgInMiLAkweDAwMDAwMDEzLCAweGZjMWZmZmZmLAlSRF9zfFdSX0xPLAlJMQl9LAoteyJtdWwuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTEJfSwKLXsibXVsLnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxCX0sCi17Im11bC5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDAyLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNQl9LAoteyJtdWwiLCAgICAgImQsdix0IiwJMHg3MDAwMDAwMiwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSEl8V1JfTE8sUDN9LAoteyJtdWwiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUwsCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWxvIiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUxPLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWxvIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9NVUxPX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG91IiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTE9VLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWxvdSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9NVUxPVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWx0IiwgICAgInMsdCIsCTB4MDAwMDAwMTgsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAlJMX0sCi17Im11bHQiLCAgICAiZCxzLHQiLAkweDAwMDAwMDE4LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLCBHMX0sCi17Im11bHR1IiwgICAicyx0IiwJMHgwMDAwMDAxOSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUkxfSwKLXsibXVsdHUiLCAgICJkLHMsdCIsCTB4MDAwMDAwMTksIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sIEcxfSwKLXsibmVnIiwgICAgICJkLHciLAkweDAwMDAwMDIyLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkxCX0sIC8qIHN1YiAwICovCi17Im5lZ3UiLCAgICAiZCx3IiwJMHgwMDAwMDAyMywgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMQl9LCAvKiBzdWJ1IDAgKi8KLXsibmVnLmQiLCAgICJELFYiLAkweDQ2MjAwMDA3LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsibmVnLnMiLCAgICJELFYiLAkweDQ2MDAwMDA3LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsibmVnLnBzIiwgICJELFYiLAkweDQ2YzAwMDA3LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCxJNQl9LAoteyJubWFkZC5kIiwgIkQsUixTLFQiLAkweDRjMDAwMDMxLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im5tYWRkLnMiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzAsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibm1hZGQucHMiLCJELFIsUyxUIiwJMHg0YzAwMDAzNiwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNQl9LAoteyJubXN1Yi5kIiwgIkQsUixTLFQiLAkweDRjMDAwMDM5LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im5tc3ViLnMiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzgsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibm1zdWIucHMiLCJELFIsUyxUIiwJMHg0YzAwMDAzZSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNQl9LAotLyogbm9wIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFibGUuICAqLwoteyJub3IiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNywgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17Im5vciIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX05PUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJub3QiLCAgICAgImQsdiIsCTB4MDAwMDAwMjcsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LC8qbm9yIGQscywwKi8KLXsib3IiLCAgICAgICJkLHYsdCIsCTB4MDAwMDAwMjUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJvciIsICAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9PUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJvcmkiLCAgICAgInQscixpIiwJMHgzNDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAotCi17InBsbC5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDJjLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNX0sCi17InBsdS5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDJkLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNX0sCi0KLXsicHJlZiIsICAgICJrLG8oYikiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLCBSRF9iLAkJRzN8TTEJfSwKLXsicHJlZngiLCAgICJoLHQoYikiLAkweDRjMDAwMDBmLCAweGZjMDAwN2ZmLCBSRF9ifFJEX3QsCUk0CX0sCi0KLXsicHVsLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMmUsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLXsicHV1LnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMmYsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLQoteyJyZWNpcC5kIiwgIkQsUyIsCTB4NDYyMDAwMTUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJNAl9LAoteyJyZWNpcC5zIiwgIkQsUyIsCTB4NDYwMDAwMTUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJNAl9LAoteyJyZW0iLCAgICAgInoscyx0IiwJMHgwMDAwMDAxYSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMSB9LAoteyJyZW0iLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9SRU1fMywJSU5TTl9NQUNSTywJSTEJfSwKLXsicmVtIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUkVNXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZW11IiwgICAgInoscyx0IiwJMHgwMDAwMDAxYiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMSB9LAoteyJyZW11IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9SRU1VXzMsCUlOU05fTUFDUk8sCUkxCX0sCi17InJlbXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JFTVVfM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJmZSIsICAgICAiIiwJCTB4NDIwMDAwMTAsIDB4ZmZmZmZmZmYsCTAsCUkxfFQzCQl9LAoteyJyb2wiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ST0wsCUlOU05fTUFDUk8sCUkxCX0sCi17InJvbCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JPTF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyb3IiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ST1IsCUlOU05fTUFDUk8sCUkxCX0sCi17InJvciIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JPUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyb3VuZC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwOCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17InJvdW5kLmwucyIsICJELFMiLAkweDQ2MDAwMDA4LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsicm91bmQudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGMsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJyb3VuZC53LnMiLCAiRCxTIiwJMHg0NjAwMDAwYywgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InJzcXJ0LmQiLCAiRCxTIiwJMHg0NjIwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUk0CX0sCi17InJzcXJ0LnMiLCAiRCxTIiwJMHg0NjAwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUk0CX0sCi17InNiIiwgICAgICAidCxvKGIpIiwJMHhhMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzYiIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0JfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNjIiwJICAgICJ0LG8oYikiLAkweGUwMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF90fFdSX3R8UkRfYiwJSTIJfSwKLXsic2MiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0NfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNjZCIsCSAgICAidCxvKGIpIiwJMHhmMDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfdHxXUl90fFJEX2IsCUkzCX0sCi17InNjZCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQ0RfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17InNkIiwJICAgICJ0LG8oYikiLAkweGZjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkzCX0sCi17InNkIiwgICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9TRF9PQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2QiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NEX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZGJicCIsICAgIiIsCQkweDAwMDAwMDBlLCAweGZmZmZmZmZmLAlUUkFQLCAgICAgICAgICAgRzJ8TTEJfSwKLXsic2RiYnAiLCAgICJjIiwJMHgwMDAwMDAwZSwgMHhmYzAwZmZmZiwJVFJBUCwJCUcyfE0xCX0sCi17InNkYmJwIiwgICAiYyxxIiwJMHgwMDAwMDAwZSwgMHhmYzAwMDAzZiwJVFJBUCwJCUcyfE0xCX0sCi17InNkYzEiLCAgICAiVCxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCUkyCX0sCi17InNkYzEiLCAgICAiRSxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCUkyCX0sCi17InNkYzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzZGMxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2RjMiIsICAgICJFLG8oYikiLAkweGY4MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9DMnxSRF9iLAlJMgl9LAoteyJzZGMyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMl9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2RjMyIsICAgICJFLG8oYikiLAkweGZjMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9DM3xSRF9iLAlJMgl9LAoteyJzZGMzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDM19BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsicy5kIiwgICAgICJULG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKLXsicy5kIiwgICAgICJULG8oYikiLAkwLCAgICAoaW50KSBNX1NfRE9CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzLmQiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU19EQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNkbCIsICAgICAidCxvKGIpIiwJMHhiMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMwl9LAoteyJzZGwiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RMX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJzZHIiLCAgICAgInQsbyhiKSIsCTB4YjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTMJfSwKLXsic2RyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NEUl9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsic2R4YzEiLCAgICJTLHQoYikiLCAgIDB4NGMwMDAwMDksIDB4ZmMwMDA3ZmYsIFNNfFJEX1N8UkRfdHxSRF9iLAlJNAl9LAoteyJzZWxzbCIsICAgImQsdix0IiwJMHgwMDAwMDAwNSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsTDEJfSwKLXsic2Vsc3IiLCAgICJkLHYsdCIsCTB4MDAwMDAwMDEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LEwxCX0sCi17InNlcSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NFUSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2VxIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0VRX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNnZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dlIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNnZXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNnZXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2d0IiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dULAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3QiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR1RfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2d0dSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dUVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2d0dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzaCIsICAgICAgInQsbyhiKSIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic2giLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NIX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGUiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTEUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGV1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTEVVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGV1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTEVVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNsbHYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKLXsic2xsIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzbGx2ICovCi17InNsbCIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAwLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCi17InNsdCIsICAgICAiZCx2LHQiLAkweDAwMDAwMDJhLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic2x0IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNsdGkiLCAgICAidCxyLGoiLAkweDI4MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17InNsdGl1IiwgICAidCxyLGoiLAkweDJjMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17InNsdHUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJiLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic2x0dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbmUiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTkUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNuZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NORV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzcXJ0LmQiLCAgIkQsUyIsCTB4NDYyMDAwMDQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJzcXJ0LnMiLCAgIkQsUyIsCTB4NDYwMDAwMDQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJzcmF2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sCi17InNyYSIsICAgICAiZCx3LHMiLAkweDAwMDAwMDA3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwgLyogc3JhdiAqLwoteyJzcmEiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMywgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMQl9LAoteyJzcmx2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sCi17InNybCIsICAgICAiZCx3LHMiLAkweDAwMDAwMDA2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwgLyogc3JsdiAqLwoteyJzcmwiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMiwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMQl9LAoteyJzc25vcCIsICAgICAiIiwJMHgwMDAwMDA0MCwgMHhmZmZmZmZmZiwJMCwJCU0xCX0sCi17InN0YW5kYnkiLCAiIiwgICAgICAgICAweDQyMDAwMDIxLCAweGZmZmZmZmZmLAkwLAkJVjEJfSwKLXsic3ViIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjIsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzdWIiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TVUJfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3ViLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxCX0sICAgICAKLXsic3ViLnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxCX0sCi17InN1Yi5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDAxLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNQl9LAoteyJzdWJ1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyMywgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InN1YnUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NVQlVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3VzcGVuZCIsICIiLCAgICAgICAgIDB4NDIwMDAwMjIsIDB4ZmZmZmZmZmYsCTAsCQlWMQl9LAoteyJzdXhjMSIsICAgIlMsdChiKSIsICAgMHg0YzAwMDAwZCwgMHhmYzAwMDdmZiwgU018UkRfU3xSRF90fFJEX2IsCUk1CX0sCi17InN3IiwgICAgICAidCxvKGIpIiwJMHhhYzAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzdyIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzAiLCAgICAiRSxvKGIpIiwJMHhlMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzB8UkRfYiwJSTEJfSwKLXsic3djMCIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzBfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzEiLCAgICAiVCxvKGIpIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfVHxSRF9ifEZQX1MsCUkxCX0sCi17InN3YzEiLCAgICAiRSxvKGIpIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfVHxSRF9ifEZQX1MsCUkxCX0sCi17InN3YzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsicy5zIiwgICAgICJULG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJSTEJfSwgLyogc3djMSAqLwoteyJzLnMiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMiIsICAgICJFLG8oYikiLAkweGU4MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9DMnxSRF9iLAlJMQl9LAoteyJzd2MyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMyIsICAgICJFLG8oYikiLAkweGVjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9DM3xSRF9iLAlJMQl9LAoteyJzd2MzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDM19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3dsIiwgICAgICJ0LG8oYikiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InN3bCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0xfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNjYWNoZSIsICAidCxvKGIpIiwJMHhhODAwMDAwMCwgMHhmYzAwMDAwMCwJUkRfdHxSRF9iLAlJMgl9LCAvKiBzYW1lICovCi17InNjYWNoZSIsICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0xfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIHN3bCAqLwoteyJzd3IiLCAgICAgInQsbyhiKSIsCTB4YjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic3dyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXUl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiaW52YWxpZGF0ZSIsICJ0LG8oYikiLDB4YjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVJEX3R8UkRfYiwJSTIJfSwgLyogc2FtZSAqLwoteyJpbnZhbGlkYXRlIiwgInQsQShiKSIsMCwgICAgKGludCkgTV9TV1JfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIHN3ciAqLwoteyJzd3hjMSIsICAgIlMsdChiKSIsICAgMHg0YzAwMDAwOCwgMHhmYzAwMDdmZiwgU018UkRfU3xSRF90fFJEX2IsCUk0CX0sCi17InN5bmMiLCAgICAiIiwJCTB4MDAwMDAwMGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJSTJ8RzEJfSwKLXsic3luYy5wIiwgICIiLAkJMHgwMDAwMDQwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAlJMgl9LAoteyJzeW5jLmwiLCAgIiIsCQkweDAwMDAwMDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCUkyCX0sCi17InN5c2NhbGwiLCAiIiwJCTB4MDAwMDAwMGMsIDB4ZmZmZmZmZmYsCVRSQVAsCUkxCQl9LAoteyJzeXNjYWxsIiwgIkIiLAkweDAwMDAwMDBjLCAweGZjMDAwMDNmLAlUUkFQLAlJMQkJfSwKLXsidGVxaSIsICAgICJzLGoiLAkweDA0MGMwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sCi17InRlcSIsCSAgICAicyx0IiwJMHgwMDAwMDAzNCwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRlcSIsCSAgICAicyx0LHEiLAkweDAwMDAwMDM0LCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGVxIiwgICAgICJzLGoiLAkweDA0MGMwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sIC8qIHRlcWkgKi8KLXsidGVxIiwgICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RFUV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0Z2VpIiwgICAgInMsaiIsCTB4MDQwODAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwKLXsidGdlIiwJICAgICJzLHQiLAkweDAwMDAwMDMwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGdlIiwJICAgICJzLHQscSIsCTB4MDAwMDAwMzAsIDB4ZmMwMDAwM2YsCVJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0Z2UiLCAgICAgInMsaiIsCTB4MDQwODAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwgLyogdGdlaSAqLwoteyJ0Z2UiLAkgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEdFX0ksICAgIElOU05fTUFDUk8sCUkyCX0sCi17InRnZWl1IiwgICAicyxqIiwJMHgwNDA5MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwKLXsidGdldSIsICAgICJzLHQiLAkweDAwMDAwMDMxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRnZXUiLCAgICAicyx0LHEiLAkweDAwMDAwMDMxLCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRnZXUiLCAgICAicyxqIiwJMHgwNDA5MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwgLyogdGdlaXUgKi8KLXsidGdldSIsICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RHRVVfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidGxicCIsICAgICIiLAkJMHg0MjAwMDAwOCwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxfE0xCX0sCi17InRsYnIiLCAgICAiIiwJCTB4NDIwMDAwMDEsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMXxNMQl9LAoteyJ0bGJ3aSIsICAgIiIsCQkweDQyMDAwMDAyLCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTF8TTEJfSwKLXsidGxid3IiLCAgICIiLAkJMHg0MjAwMDAwNiwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxfE0xCX0sCi17InRsdGkiLCAgICAicyxqIiwJMHgwNDBhMDAwMCwgMHhmYzFmMDAwMCwJUkRfc3xUUkFQLAlJMgkJfSwKLXsidGx0IiwgICAgICJzLHQiLAkweDAwMDAwMDMyLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRsdCIsICAgICAicyx0LHEiLAkweDAwMDAwMDMyLCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRsdCIsICAgICAicyxqIiwJMHgwNDBhMDAwMCwgMHhmYzFmMDAwMCwJUkRfc3xUUkFQLAlJMgkJfSwgLyogdGx0aSAqLwoteyJ0bHQiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVExUX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRsdGl1IiwgICAicyxqIiwJMHgwNDBiMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwKLXsidGx0dSIsICAgICJzLHQiLAkweDAwMDAwMDMzLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRsdHUiLCAgICAicyx0LHEiLAkweDAwMDAwMDMzLCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRsdHUiLCAgICAicyxqIiwJMHgwNDBiMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwgLyogdGx0aXUgKi8KLXsidGx0dSIsICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RMVFVfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidG5laSIsICAgICJzLGoiLAkweDA0MGUwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LAoteyJ0bmUiLCAgICAgInMsdCIsCTB4MDAwMDAwMzYsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidG5lIiwgICAgICJzLHQscSIsCTB4MDAwMDAwMzYsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidG5lIiwgICAgICJzLGoiLAkweDA0MGUwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LCAvKiB0bmVpICovCi17InRuZSIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTkVfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidHJ1bmMubC5kIiwgIkQsUyIsCTB4NDYyMDAwMDksIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJ0cnVuYy5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwOSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17InRydW5jLncuZCIsICJELFMiLAkweDQ2MjAwMDBkLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsidHJ1bmMudy5kIiwgIkQsUyx4IiwJMHg0NjIwMDAwZCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InRydW5jLncuZCIsICJELFMsdCIsCTAsICAgIChpbnQpIE1fVFJVTkNXRCwJSU5TTl9NQUNSTywJSTEJfSwKLXsidHJ1bmMudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJ0cnVuYy53LnMiLCAiRCxTLHgiLAkweDQ2MDAwMDBkLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsidHJ1bmMudy5zIiwgIkQsUyx0IiwJMCwgICAgKGludCkgTV9UUlVOQ1dTLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGQiLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxELAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1bGQiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxEX0EsCUlOU05fTUFDUk8sCUkzCX0sCi17InVsaCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEgsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsaCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTEhfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxodSIsICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMSFUsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsaHUiLCAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTEhVX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsdyIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTFcsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsdyIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTFdfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidXNkIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTRCwJSU5TTl9NQUNSTywJSTMJfSwKLXsidXNkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VTRF9BLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1c2giLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVVNILAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c2giLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNIX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InVzdyIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VU1csCUlOU05fTUFDUk8sCUkxCX0sCi17InVzdyIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VU1dfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsieG9yIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJ4b3IiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9YT1JfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsieG9yaSIsICAgICJ0LHIsaSIsCTB4MzgwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsid2FpdCIsICAgICIiLAkJMHg0MjAwMDAyMCwgMHhmZmZmZmZmZiwJVFJBUCwJSTN8TTEJfSwKLXsid2FpdGkiLCAgICIiLAkJMHg0MjAwMDAyMCwgMHhmZmZmZmZmZiwJVFJBUCwJTDEJfSwKLXsid2IiLCAJICAgICJvKGIpIiwJMHhiYzA0MDAwMCwgMHhmYzFmMDAwMCwgU018UkRfYiwJTDEJfSwKLS8qIE5vIGhhemFyZCBwcm90ZWN0aW9uIG9uIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy0tdGhleSBzaG91bGRuJ3QKLSAgIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIHByb2Nlc3NvciBhbmQgaWYgdGhleSBkbyBpdCdzIHVwIHRvIHRoZQotICAgdXNlciB0byBwdXQgaW4gbm9wcyBhcyBuZWNlc3NhcnkuICBUaGVzZSBhcmUgYXQgdGhlIGVuZCBzbyB0aGF0IHRoZQotICAgZGlzYXNlbWJsZXIgcmVjb2duaXplcyBtb3JlIHNwZWNpZmljIHZlcnNpb25zIGZpcnN0LiAgKi8KLXsiYzAiLCAgICAgICJDIiwJMHg0MjAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImMxIiwgICAgICAiQyIsCTB4NDYwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjMiIsICAgICAgIkMiLAkweDRhMDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiYzMiLCAgICAgICJDIiwJMHg0ZTAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImNvcDAiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDAsCUlOU05fTUFDUk8sCUkxCX0sCi17ImNvcDEiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDEsCUlOU05fTUFDUk8sCUkxCX0sCi17ImNvcDIiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImNvcDMiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDMsCUlOU05fTUFDUk8sCUkxCX0sCi0KLSAgLyogQ29uZmxpY3RzIHdpdGggdGhlIDQ2NTAncyAibXVsIiBpbnN0cnVjdGlvbi4gIE5vYm9keSdzIHVzaW5nIHRoZQotICAgICA0MDEwIGFueSBtb3JlLCBzbyBtb3ZlIHRoaXMgaW5zbiBvdXQgb2YgdGhlIHdheS4gIElmIHRoZSBvYmplY3QKLSAgICAgZm9ybWF0IGdhdmUgdXMgbW9yZSBpbmZvLCB3ZSBjb3VsZCBkbyB0aGlzIHJpZ2h0LiAgKi8KLXsiYWRkY2l1IiwgICJ0LHIsaiIsCTB4NzAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcyxMMQl9LAotfTsKLQotI2RlZmluZSBNSVBTX05VTV9PUENPREVTIFwKLQkoKHNpemVvZiBtaXBzX2J1aWx0aW5fb3Bjb2RlcykgLyAoc2l6ZW9mIChtaXBzX2J1aWx0aW5fb3Bjb2Rlc1swXSkpKQotY29uc3QgaW50IGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXMgPSBNSVBTX05VTV9PUENPREVTOwotCi0vKiBjb25zdCByZW1vdmVkIGZyb20gdGhlIGZvbGxvd2luZyB0byBhbGxvdyBmb3IgZHluYW1pYyBleHRlbnNpb25zIHRvIHRoZSAKLSAqIGJ1aWx0LWluIGluc3RydWN0aW9uIHNldC4gKi8KLXN0cnVjdCBtaXBzX29wY29kZSAqbWlwc19vcGNvZGVzID0KLSAgKHN0cnVjdCBtaXBzX29wY29kZSAqKSBtaXBzX2J1aWx0aW5fb3Bjb2RlczsKLWludCBiZmRfbWlwc19udW1fb3Bjb2RlcyA9IE1JUFNfTlVNX09QQ09ERVM7Ci0jdW5kZWYgTUlQU19OVU1fT1BDT0RFUwotCmRpZmYgLS1naXQgYS9vcGNvZGVzL21pcHMxNi1vcGMuYyBiL29wY29kZXMvbWlwczE2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQyZGJiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWlwczE2LW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qIG1pcHMxNi1vcGMuYy4gIE1pcHMxNiBvcGNvZGUgdGFibGUuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCi0KLS8qIFRoaXMgaXMgdGhlIG9wY29kZXMgdGFibGUgZm9yIHRoZSBtaXBzMTYgcHJvY2Vzc29yLiAgVGhlIGZvcm1hdCBvZgotICAgdGhpcyB0YWJsZSBpcyBpbnRlbnRpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgb25lIGluIG1pcHMtb3BjLmMuCi0gICBIb3dldmVyLCB0aGUgc3BlY2lhbCBsZXR0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBhcmd1bWVudCBzdHJpbmcgYXJlCi0gICBkaWZmZXJlbnQsIGFuZCB0aGUgdGFibGUgdXNlcyBzb21lIGRpZmZlcmVudCBmbGFncy4gICovCi0KLS8qIFVzZSBzb21lIHNob3J0IGhhbmQgbWFjcm9zIHRvIGtlZXAgZG93biB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lcyBpbgotICAgdGhlIG9wY29kZXMgdGFibGUuICAqLwotCi0jZGVmaW5lIFVCRCAgICAgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCi0jZGVmaW5lIEJSICAgICAgTUlQUzE2X0lOU05fQlJBTkNICi0KLSNkZWZpbmUgV1JfeAlNSVBTMTZfSU5TTl9XUklURV9YCi0jZGVmaW5lIFdSX3kJTUlQUzE2X0lOU05fV1JJVEVfWQotI2RlZmluZSBXUl96CU1JUFMxNl9JTlNOX1dSSVRFX1oKLSNkZWZpbmUgV1JfVAlNSVBTMTZfSU5TTl9XUklURV9UCi0jZGVmaW5lIFdSX1NQCU1JUFMxNl9JTlNOX1dSSVRFX1NQCi0jZGVmaW5lIFdSXzMxCU1JUFMxNl9JTlNOX1dSSVRFXzMxCi0jZGVmaW5lIFdSX1kJTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kKLQotI2RlZmluZSBSRF94CU1JUFMxNl9JTlNOX1JFQURfWAotI2RlZmluZSBSRF95CU1JUFMxNl9JTlNOX1JFQURfWQotI2RlZmluZSBSRF9aCU1JUFMxNl9JTlNOX1JFQURfWgotI2RlZmluZSBSRF9UCU1JUFMxNl9JTlNOX1JFQURfVAotI2RlZmluZSBSRF9TUAlNSVBTMTZfSU5TTl9SRUFEX1NQCi0jZGVmaW5lIFJEXzMxCU1JUFMxNl9JTlNOX1JFQURfMzEKLSNkZWZpbmUgUkRfUEMJTUlQUzE2X0lOU05fUkVBRF9QQwotI2RlZmluZSBSRF9YCU1JUFMxNl9JTlNOX1JFQURfR1BSX1gKLQotI2RlZmluZSBXUl9ISQlJTlNOX1dSSVRFX0hJCi0jZGVmaW5lIFdSX0xPCUlOU05fV1JJVEVfTE8KLSNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCi0jZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTwotCi0jZGVmaW5lIFRSQVAJSU5TTl9UUkFQCi0KLSNkZWZpbmUgSTMJSU5TTl9JU0EzCi0KLSNkZWZpbmUgVDMgICAgICBJTlNOXzM5MDAKLQotY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHMxNl9vcGNvZGVzW10gPSB7Ci17Im5vcCIsCSAgICAiIiwJCTB4NjUwMCwgMHhmZmZmLCBSRF9aIH0sIC8qIG1vdmUgJDAsJFogKi8KLXsibGEiLAkgICAgIngsQSIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17ImFicyIsCSAgICAieCx3IiwJMCwgKGludCkgTV9BQlMsIElOU05fTUFDUk8gfSwKLXsiYWRkaXUiLCAgICJ5LHgsNCIsCTB4NDAwMCwgMHhmODEwLCBXUl95fFJEX3ggfSwKLXsiYWRkaXUiLCAgICJ4LGsiLAkweDQ4MDAsIDB4ZjgwMCwgV1JfeHxSRF94IH0sCi17ImFkZGl1IiwgICAiUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZGl1IiwgICAiUyxTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKLXsiYWRkaXUiLCAgICJ4LFAsViIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17ImFkZGl1IiwgICAieCxTLFYiLAkweDAwMDAsIDB4ZjgwMCwgV1JfeHxSRF9TUCB9LAoteyJhZGR1IiwgICAgInosdix5IiwJMHhlMDAxLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95IH0sCi17ImFkZHUiLCAgICAieSx4LDQiLAkweDQwMDAsIDB4ZjgxMCwgV1JfeXxSRF94IH0sCi17ImFkZHUiLCAgICAieCxrIiwJMHg0ODAwLCAweGY4MDAsIFdSX3h8UkRfeCB9LAoteyJhZGR1IiwgICAgIlMsSyIsCTB4NjMwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCB9LAoteyJhZGR1IiwgICAgIlMsUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZHUiLCAgICAieCxQLFYiLAkweDA4MDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJhZGR1IiwgICAgIngsUyxWIiwJMHgwMDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKLXsiYW5kIiwJICAgICJ4LHkiLAkweGU4MGMsIDB4ZjgxZiwgV1JfeHxSRF94fFJEX3kgfSwKLXsiYiIsCSAgICAicSIsCTB4MTAwMCwgMHhmODAwLCBCUn0sCi17ImJlcSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JFUSwgSU5TTl9NQUNSTyB9LAoteyJiZXEiLCAgICAgIngsVSxwIiwJMCwgKGludCkgTV9CRVFfSSwgSU5TTl9NQUNSTyB9LAoteyJiZXF6IiwgICAgIngscCIsCTB4MjAwMCwgMHhmODAwLCBCUnxSRF94IH0sCi17ImJnZSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHRSwgSU5TTl9NQUNSTyB9LAoteyJiZ2UiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR0VfSSwgSU5TTl9NQUNSTyB9LAoteyJiZ2V1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CR0VVLCBJTlNOX01BQ1JPIH0sCi17ImJnZXUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHRVVfSSwgSU5TTl9NQUNSTyB9LAoteyJiZ3QiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CR1QsIElOU05fTUFDUk8gfSwKLXsiYmd0IiwgICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkdUX0ksIElOU05fTUFDUk8gfSwKLXsiYmd0dSIsICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkdUVSwgSU5TTl9NQUNSTyB9LAoteyJiZ3R1IiwgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR1RVX0ksIElOU05fTUFDUk8gfSwKLXsiYmxlIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxFLCBJTlNOX01BQ1JPIH0sCi17ImJsZSIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMRV9JLCBJTlNOX01BQ1JPIH0sCi17ImJsZXUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMRVUsIElOU05fTUFDUk8gfSwKLXsiYmxldSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxFVV9JLCBJTlNOX01BQ1JPIH0sCi17ImJsdCIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMVCwgSU5TTl9NQUNSTyB9LAoteyJibHQiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CTFRfSSwgSU5TTl9NQUNSTyB9LAoteyJibHR1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CTFRVLCBJTlNOX01BQ1JPIH0sCi17ImJsdHUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMVFVfSSwgSU5TTl9NQUNSTyB9LAoteyJibmUiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CTkUsIElOU05fTUFDUk8gfSwKLXsiYm5lIiwgICAgICJ4LFUscCIsCTAsIChpbnQpIE1fQk5FX0ksIElOU05fTUFDUk8gfSwKLXsiYm5leiIsICAgICJ4LHAiLAkweDI4MDAsIDB4ZjgwMCwgQlJ8UkRfeCB9LAoteyJicmVhayIsICAgIjYiLAkweGU4MDUsIDB4ZjgxZiwgVFJBUCB9LAoteyJidGVxeiIsICAgInAiLAkweDYwMDAsIDB4ZmYwMCwgQlJ8UkRfVCB9LAoteyJidG5leiIsICAgInAiLAkweDYxMDAsIDB4ZmYwMCwgQlJ8UkRfVCB9LAoteyJjbXBpIiwgICAgIngsVSIsCTB4NzAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsiY21wIiwJICAgICJ4LHkiLAkweGU4MGEsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKLXsiY21wIiwgICAgICJ4LFUiLAkweDcwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17ImRsYSIsCSAgICAieSxFIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImRhZGRpdSIsICAieSx4LDQiLAkweDQwMTAsIDB4ZjgxMCwgV1JfeXxSRF94LCBJMyB9LAoteyJkYWRkaXUiLCAgInksaiIsCTB4ZmQwMCwgMHhmZjAwLCBXUl95fFJEX3ksIEkzIH0sCi17ImRhZGRpdSIsICAiUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoteyJkYWRkaXUiLCAgIlMsUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoteyJkYWRkaXUiLCAgInksUCxXIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImRhZGRpdSIsICAieSxTLFciLAkweGZmMDAsIDB4ZmYwMCwgV1JfeXxSRF9TUCwgSTMgfSwKLXsiZGFkZHUiLCAgICJ6LHYseSIsCTB4ZTAwMCwgMHhmODAzLCBXUl96fFJEX3h8UkRfeSwgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LHgsNCIsCTB4NDAxMCwgMHhmODEwLCBXUl95fFJEX3gsIEkzIH0sCi17ImRhZGR1IiwgICAieSxqIiwJMHhmZDAwLCAweGZmMDAsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZGFkZHUiLCAgICJTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGR1IiwgICAiUyxTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGR1IiwgICAieSxQLFciLAkweGZlMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LFMsVyIsCTB4ZmYwMCwgMHhmZjAwLCBXUl95fFJEX1NQLCBJMyB9LAoteyJkZGl2IiwgICAgIjAseCx5IiwJMHhlODFlLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZGRpdiIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRERJVl8zLCBJTlNOX01BQ1JPIH0sCi17ImRkaXZ1IiwgICAiMCx4LHkiLAkweGU4MWYsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkZGl2dSIsICAgInosdix5IiwJMCwgKGludCkgTV9ERElWVV8zLCBJTlNOX01BQ1JPIH0sCi17ImRpdiIsICAgICAiMCx4LHkiLAkweGU4MWEsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17ImRpdiIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX0RJVl8zLCBJTlNOX01BQ1JPIH0sCi17ImRpdnUiLCAgICAiMCx4LHkiLAkweGU4MWIsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17ImRpdnUiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RJVlVfMywgSU5TTl9NQUNSTyB9LAoteyJkbXVsIiwgICAgInosdix5IiwJMCwgKGludCkgTV9ETVVMLCBJTlNOX01BQ1JPLCBJMyB9LAoteyJkbXVsdCIsICAgIngseSIsCTB4ZTgxYywgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRtdWx0dSIsICAieCx5IiwJMHhlODFkLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZHJlbSIsICAgICIwLHgseSIsCTB4ZTgxZSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRyZW0iLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RSRU1fMywgSU5TTl9NQUNSTyB9LAoteyJkcmVtdSIsICAgIjAseCx5IiwJMHhlODFmLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZHJlbXUiLCAgICJ6LHYseSIsCTAsIChpbnQpIE1fRFJFTVVfMywgSU5TTl9NQUNSTyB9LAoteyJkc2xsdiIsICAgInkseCIsCTB4ZTgxNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNsbCIsICAgICJ4LHcsWyIsCTB4MzAwMSwgMHhmODAzLCBXUl94fFJEX3ksIEkzIH0sCi17ImRzbGwiLCAgICAieSx4IiwJMHhlODE0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3JhdiIsICAgInkseCIsCTB4ZTgxNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNyYSIsICAgICJ5LF0iLAkweGU4MTMsIDB4ZjgxZiwgV1JfeXxSRF95LCBJMyB9LAoteyJkc3JhIiwgICAgInkseCIsCTB4ZTgxNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNybHYiLCAgICJ5LHgiLAkweGU4MTYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzcmwiLCAgICAieSxdIiwJMHhlODA4LCAweGY4MWYsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZHNybCIsICAgICJ5LHgiLAkweGU4MTYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzdWJ1IiwgICAieix2LHkiLAkweGUwMDIsIDB4ZjgwMywgV1JfenxSRF94fFJEX3ksIEkzIH0sCi17ImRzdWJ1IiwgICAieSx4LDQiLAkwLCAoaW50KSBNX0RTVUJVX0ksIElOU05fTUFDUk8gfSwKLXsiZHN1YnUiLCAgICJ5LGoiLAkwLCAoaW50KSBNX0RTVUJVX0lfMiwgSU5TTl9NQUNSTyB9LAoteyJleGl0IiwgICAgIkwiLAkweGVkMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJleGl0IiwgICAgIkwiLAkweGVlMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJleGl0IiwgICAgIkwiLAkweGVmMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJlbnRyeSIsICAgImwiLAkweGU4MDksIDB4ZjgxZiwgVFJBUCB9LAoteyJleHRlbmQiLCAgImUiLAkweGYwMDAsIDB4ZjgwMCwgMCB9LAoteyJqYWxyIiwgICAgIngiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsciIsICAgICJSLHgiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsIiwgICAgICJ4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCi17ImphbCIsICAgICAiUix4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCi17ImphbCIsCSAgICAiYSIsCTB4MTgwMCwgMHhmYzAwLCBVQkR8V1JfMzEgfSwKLXsiamFseCIsICAgICJhIiwJMHgxYzAwLCAweGZjMDAsIFVCRHxXUl8zMSB9LAoteyJqciIsCSAgICAieCIsCTB4ZTgwMCwgMHhmOGZmLCBVQkR8UkRfeCB9LAoteyJqciIsCSAgICAiUiIsCTB4ZTgyMCwgMHhmZmZmLCBVQkR8UkRfMzEgfSwKLXsiaiIsCSAgICAieCIsCTB4ZTgwMCwgMHhmOGZmLCBVQkR8UkRfeCB9LAoteyJqIiwJICAgICJSIiwJMHhlODIwLCAweGZmZmYsIFVCRHxSRF8zMSB9LAoteyJsYiIsCSAgICAieSw1KHgpIiwJMHg4MDAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsYnUiLAkgICAgInksNSh4KSIsCTB4YTAwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibGQiLAkgICAgInksRCh4KSIsCTB4MzgwMCwgMHhmODAwLCBXUl95fFJEX3gsIEkzIH0sCi17ImxkIiwJICAgICJ5LEIiLAkweGZjMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsibGQiLAkgICAgInksRChQKSIsCTB4ZmMwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJsZCIsCSAgICAieSxEKFMpIiwJMHhmODAwLCAweGZmMDAsIFdSX3l8UkRfU1AsIEkzIH0sCi17ImxoIiwJICAgICJ5LEgoeCkiLAkweDg4MDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17ImxodSIsCSAgICAieSxIKHgpIiwJMHhhODAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsaSIsCSAgICAieCxVIiwJMHg2ODAwLCAweGY4MDAsIFdSX3ggfSwKLXsibHciLAkgICAgInksVyh4KSIsCTB4OTgwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibHciLAkgICAgIngsQSIsCTB4YjAwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17Imx3IiwJICAgICJ4LFYoUCkiLAkweGIwMDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJsdyIsCSAgICAieCxWKFMpIiwJMHg5MDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKLXsibHd1IiwgICAgICJ5LFcoeCkiLAkweGI4MDAsIDB4ZjgwMCwgV1JfeXxSRF94LCBJMyB9LAoteyJtZmhpIiwgICAgIngiLAkweGU4MTAsIDB4ZjhmZiwgV1JfeHxSRF9ISSB9LAoteyJtZmxvIiwgICAgIngiLAkweGU4MTIsIDB4ZjhmZiwgV1JfeHxSRF9MTyB9LAoteyJtb3ZlIiwgICAgInksWCIsCTB4NjcwMCwgMHhmZjAwLCBXUl95fFJEX1ggfSwKLXsibW92ZSIsICAgICJZLFoiLAkweDY1MDAsIDB4ZmYwMCwgV1JfWXxSRF9aIH0sCi17Im11bCIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX01VTCwgSU5TTl9NQUNSTyB9LAoteyJtdWx0IiwgICAgIngseSIsCTB4ZTgxOCwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsibXVsdHUiLCAgICJ4LHkiLAkweGU4MTksIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17Im5lZyIsCSAgICAieCx3IiwJMHhlODBiLCAweGY4MWYsIFdSX3h8UkRfeSB9LAoteyJub3QiLAkgICAgIngsdyIsCTB4ZTgwZiwgMHhmODFmLCBXUl94fFJEX3kgfSwKLXsib3IiLAkgICAgIngseSIsCTB4ZTgwZCwgMHhmODFmLCBXUl94fFJEX3h8UkRfeSB9LAoteyJyZW0iLCAgICAgIjAseCx5IiwJMHhlODFhLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJyZW0iLCAgICAgInosdix5IiwJMCwgKGludCkgTV9SRU1fMywgSU5TTl9NQUNSTyB9LAoteyJyZW11IiwgICAgIjAseCx5IiwJMHhlODFiLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJyZW11IiwgICAgInosdix5IiwJMCwgKGludCkgTV9SRU1VXzMsIElOU05fTUFDUk8gfSwKLXsic2IiLAkgICAgInksNSh4KSIsCTB4YzAwMCwgMHhmODAwLCBSRF95fFJEX3ggfSwKLXsic2QiLAkgICAgInksRCh4KSIsCTB4NzgwMCwgMHhmODAwLCBSRF95fFJEX3gsIEkzIH0sCi17InNkIiwJICAgICJ5LEQoUykiLAkweGY5MDAsIDB4ZmYwMCwgUkRfeXxSRF9QQywgSTMgfSwKLXsic2QiLAkgICAgIlIsQyhTKSIsCTB4ZmEwMCwgMHhmZjAwLCBSRF8zMXxSRF9QQyB9LAoteyJzaCIsCSAgICAieSxIKHgpIiwJMHhjODAwLCAweGY4MDAsIFJEX3l8UkRfeCB9LAoteyJzbGx2IiwgICAgInkseCIsCTB4ZTgwNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzbGwiLAkgICAgIngsdyw8IiwJMHgzMDAwLCAweGY4MDMsIFdSX3h8UkRfeSB9LAoteyJzbGwiLCAgICAgInkseCIsCTB4ZTgwNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzbHRpIiwgICAgIngsOCIsCTB4NTAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic2x0IiwJICAgICJ4LHkiLAkweGU4MDIsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKLXsic2x0IiwgICAgICJ4LDgiLAkweDUwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17InNsdGl1IiwgICAieCw4IiwJMHg1ODAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJzbHR1IiwgICAgIngseSIsCTB4ZTgwMywgMHhmODFmLCBXUl9UfFJEX3h8UkRfeSB9LAoteyJzbHR1IiwgICAgIngsOCIsCTB4NTgwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic3JhdiIsICAgICJ5LHgiLAkweGU4MDcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JhIiwJICAgICJ4LHcsPCIsCTB4MzAwMywgMHhmODAzLCBXUl94fFJEX3kgfSwKLXsic3JhIiwgICAgICJ5LHgiLAkweGU4MDcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JsdiIsICAgICJ5LHgiLAkweGU4MDYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JsIiwJICAgICJ4LHcsPCIsCTB4MzAwMiwgMHhmODAzLCBXUl94fFJEX3kgfSwKLXsic3JsIiwgICAgICJ5LHgiLAkweGU4MDYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3VidSIsICAgICJ6LHYseSIsCTB4ZTAwMywgMHhmODAzLCBXUl96fFJEX3h8UkRfeSB9LAoteyJzdWJ1IiwgICAgInkseCw0IiwJMCwgKGludCkgTV9TVUJVX0ksIElOU05fTUFDUk8gfSwKLXsic3VidSIsICAgICJ4LGsiLAkwLCAoaW50KSBNX1NVQlVfSV8yLCBJTlNOX01BQ1JPIH0sCi17InN3IiwJICAgICJ5LFcoeCkiLAkweGQ4MDAsIDB4ZjgwMCwgUkRfeXxSRF94IH0sCi17InN3IiwJICAgICJ4LFYoUykiLAkweGQwMDAsIDB4ZjgwMCwgUkRfeHxSRF9TUCB9LAoteyJzdyIsCSAgICAiUixWKFMpIiwJMHg2MjAwLCAweGZmMDAsIFJEXzMxfFJEX1NQIH0sCi17InhvciIsCSAgICAieCx5IiwJMHhlODBlLCAweGY4MWYsIFdSX3h8UkRfeHxSRF95IH0sCi19OwotCi1jb25zdCBpbnQgYmZkX21pcHMxNl9udW1fb3Bjb2RlcyA9Ci0gICgoc2l6ZW9mIG1pcHMxNl9vcGNvZGVzKSAvIChzaXplb2YgKG1pcHMxNl9vcGNvZGVzWzBdKSkpOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tcHctY29uZmlnLmluIGIvb3Bjb2Rlcy9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjliZTlkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3Igb3Bjb2Rlcy4KLQotU2V0IHRhcmdldF9hcmNoIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8tLiotLiovLydgCi0KLVNldCBhcmNobmFtZSBBUkNIX3t0YXJnZXRfYXJjaH0KLQotSWYgInt0YXJnZXRfYXJjaH0iID1+IC9tNjhrLwotCVNldCBCRkRfTUFDSElORVMgICcie299Im02OGstZGlzLmMubyAie299Im02OGstb3BjLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9wb3dlcnBjLwotCVNldCBCRkRfTUFDSElORVMgICcie299InBwYy1kaXMuYy5vICJ7b30icHBjLW9wYy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvaTM4Ni8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJpMzg2LWRpcy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvbWlwcy8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJtaXBzLWRpcy5jLm8gIntvfSJtaXBzLW9wYy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvc2gvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30ic2gtZGlzLmMubycKLUVuZCBJZgotCi1FY2hvICcjIFN0YXJ0IGZyb20gbXB3LWNvbmZpZy5pbicJCQkgPiAie299Im1rLnRtcAotRWNobyAiQkZEX01BQ0hJTkVTID0gIiB7QkZEX01BQ0hJTkVTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJBUkNIREVGUyA9IC1kIiB7YXJjaG5hbWV9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJIAkJCT4+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL29wY29kZXMvbXB3LW1ha2Uuc2VkIGIvb3Bjb2Rlcy9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNjA0ODYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIG9wY29kZXMgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgotCi0jIEVtcHR5IEhERUZJTkVTLgotL0hERUZJTkVTL3MvQEhERUZJTkVTQC8vCi0KLSMgRml4IHBhdGhuYW1lcyB0byBpbmNsdWRlIGRpcmVjdG9yaWVzLgotL15JTkNESVIgPSAvcy9eSU5DRElSID0gLiokL0lOQ0RJUiA9ICJ7dG9wc3JjZGlyfSJpbmNsdWRlLwotL15DU0VBUkNIID0gL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLS9CRkRfTUFDSElORVMvcy9AQkZEX01BQ0hJTkVTQC97QkZEX01BQ0hJTkVTfS8KLS9hcmNoZGVmcy9zL0BhcmNoZGVmc0Ave0FSQ0hERUZTfS8KLQotIyBObyBQSUMgZm9vbGVyeSBpbiB0aGlzIGVudmlyb25tZW50LgotL0BBTExMSUJTQC9zL0BBTExMSUJTQC97VEFSR0VUTElCfS8KLS9AUElDTElTVEAvcy9AUElDTElTVEAvLwotL0BQSUNGTEFHQC9zL0BQSUNGTEFHQC8vCi0vXntPRklMRVN9IFxcT3B0aW9uLWYgc3RhbXAtcGljZGlyLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgcGljIHRyaWNrZXJ5IGZyb20gdGhlIGRlZmF1bHQgYnVpbGQgcnVsZS4KLS9eXC5jXC5vIFxcT3B0aW9uLWYgLywvRW5kIElmL2NcCi0uYy5vIFxcT3B0aW9uLWYgLmMKLQotIyBSZW1vdmUgcGljIHRyaWNrZXJ5IGZyb20gb3RoZXIgcnVsZXMgLSBhaW1lZCBhdCB0aGUgcnVsZQotIyBmb3IgZGlzYXNzZW1ibGUubyBpbiBwYXJ0aWN1bGFyLgotLy1uICJ7UElDRkxBR30iLywvRW5kIElmL2QKZGlmZiAtLWdpdCBhL29wY29kZXMvbnMzMmstZGlzLmMgYi9vcGNvZGVzL25zMzJrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAyNjZiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbnMzMmstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTQgKzAsMCBAQAotLyogUHJpbnQgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAzMjAwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKGMpIDE5ODYsIDg4LCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Bjb2RlcyBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaWYgIWRlZmluZWQoY29uc3QpICYmICFkZWZpbmVkKF9fU1REQ19fKQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jaW5jbHVkZSAib3Bjb2RlL25zMzJrLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICpkaXNfaW5mbzsKLQotLyoKLSAqIEhhY2tzIHRvIGdldCBpdCB0byBjb21waWxlIDw9IFJFQUQgVEhFU0UgQVMgRklYRVMgTkVFREVECi0gKi8KLSNkZWZpbmUgSU5WQUxJRF9GTE9BVCh2YWwsIHNpemUpIGludmFsaWRfZmxvYXQoKGNoYXIgKil2YWwsIHNpemUpCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcmcKLSAgUEFSQU1TICgoaW50LCBpbnQsIGludCAqLCBjaGFyICosIGJmZF92bWEsIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGdldF9kaXNwbGFjZW1lbnQgUEFSQU1TICgoY2hhciAqLCBpbnQgKikpOwotc3RhdGljIGludCBpbnZhbGlkX2Zsb2F0IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBsb25nIHJlYWRfbWVtb3J5X2ludGVnZXIoYWRkciwgbnIpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmFkZHI7Ci0gICAgIGludCBucjsKLXsKLSAgbG9uZyB2YWw7Ci0gIGludCBpOwotICBmb3IgKHZhbCA9IDAsIGkgPSBuciAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgdmFsID0gICh2YWwgPDwgOCk7Ci0gICAgdmFsIHw9ICgweGZmICYgKihhZGRyICsgaSkpOwotICB9Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIDMyMDAwIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcy4gICovCi0jZGVmaW5lIE1BWExFTiA2MgotCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotICByZXR1cm4gMTsKLX0KLS8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSNkZWZpbmUgTk9QQ09ERVMgKHNpemVvZiBuczMya19vcGNvZGVzIC8gc2l6ZW9mIG5zMzJrX29wY29kZXNbMF0pCi0KLSNkZWZpbmUgTkVYVF9JU19BRERSCSd8JwotCi0MCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIHsKLSAgY2hhciAqcGF0dGVybjsJCS8qIHRoZSBvcHRpb24gaXRzZWxmICovCi0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7CQkvKiBiaW5hcnkgdmFsdWUgb2YgdGhlIG9wdGlvbiAqLwotICB1bnNpZ25lZCBsb25nIG1hdGNoOwkJLyogdGhlc2UgYml0cyBtdXN0IG1hdGNoICovCi19OwotCi0MCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfdVtdPSAvKiByZXN0b3JlLCBleGl0ICovCi17Ci0gIHsgInIwIiwJMHg4MCwJMHg4MAl9LAotICB7ICJyMSIsCTB4NDAsCTB4NDAJfSwKLSAgeyAicjIiLAkweDIwLAkweDIwCX0sCi0gIHsgInIzIiwJMHgxMCwJMHgxMAl9LAotICB7ICJyNCIsCTB4MDgsCTB4MDgJfSwKLSAgeyAicjUiLAkweDA0LAkweDA0CX0sCi0gIHsgInI2IiwJMHgwMiwJMHgwMgl9LAotICB7ICJyNyIsCTB4MDEsCTB4MDEJfSwKLSAgeyAgMCAsCTB4MDAsCTB4MDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gb3B0X1VbXT0gLyogc2F2ZSwgZW50ZXIgKi8KLXsKLSAgeyAicjAiLAkweDAxLAkweDAxCX0sCi0gIHsgInIxIiwJMHgwMiwJMHgwMgl9LAotICB7ICJyMiIsCTB4MDQsCTB4MDQJfSwKLSAgeyAicjMiLAkweDA4LAkweDA4CX0sCi0gIHsgInI0IiwJMHgxMCwJMHgxMAl9LAotICB7ICJyNSIsCTB4MjAsCTB4MjAJfSwKLSAgeyAicjYiLAkweDQwLAkweDQwCX0sCi0gIHsgInI3IiwJMHg4MCwJMHg4MAl9LAotICB7ICAwICwJMHgwMCwJMHgwMAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfT1tdPSAvKiBzZXRjZmcgKi8KLXsKLSAgeyAiYyIsCTB4OCwJMHg4CX0sCi0gIHsgIm0iLAkweDQsCTB4NAl9LAotICB7ICJmIiwJMHgyLAkweDIJfSwKLSAgeyAiaSIsCTB4MSwJMHgxCX0sCi0gIHsgIDAgLAkweDAsCTB4MAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfQ1tdPSAvKiBjaW52ICovCi17Ci0gIHsgImEiLAkweDQsCTB4NAl9LAotICB7ICJpIiwJMHgyLAkweDIJfSwKLSAgeyAiZCIsCTB4MSwJMHgxCX0sCi0gIHsgIDAgLAkweDAsCTB4MAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfU1tdPSAvKiBzdHJpbmcgaW5zdCAqLwotewotICB7ICJiIiwJMHgxLAkweDEJfSwKLSAgeyAidSIsCTB4NiwJMHg2CX0sCi0gIHsgInciLAkweDIsCTB4Mgl9LAotICB7ICAwICwJMHgwLAkweDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9QNTMyW109IC8qIGxwciBzcHIgKi8KLXsKLSAgeyAidXMiLAkweDAsCTB4Zgl9LAotICB7ICJkY3IiLAkweDEsCTB4Zgl9LAotICB7ICJicGMiLAkweDIsCTB4Zgl9LAotICB7ICJkc3IiLAkweDMsCTB4Zgl9LAotICB7ICJjYXIiLAkweDQsCTB4Zgl9LAotICB7ICJmcCIsCTB4OCwJMHhmCX0sCi0gIHsgInNwIiwJMHg5LAkweGYJfSwKLSAgeyAic2IiLAkweGEsCTB4Zgl9LAotICB7ICJ1c3AiLAkweGIsCTB4Zgl9LAotICB7ICJjZmciLAkweGMsCTB4Zgl9LAotICB7ICJwc3IiLAkweGQsCTB4Zgl9LAotICB7ICJpbnRiYXNlIiwJMHhlLAkweGYJfSwKLSAgeyAibW9kIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MDAsCTB4Zgl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBsaXN0X001MzJbXT0gLyogbG1yIHNtciAqLwotewotICB7ICJtY3IiLAkweDksCTB4Zgl9LAotICB7ICJtc3IiLAkweGEsCTB4Zgl9LAotICB7ICJ0ZWFyIiwJMHhiLAkweGYJfSwKLSAgeyAicHRiMCIsCTB4YywJMHhmCX0sCi0gIHsgInB0YjEiLAkweGQsCTB4Zgl9LAotICB7ICJpdmFyMCIsCTB4ZSwJMHhmCX0sCi0gIHsgIml2YXIxIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MCwJMHhmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfUDAzMltdPSAvKiBscHIgc3ByICovCi17Ci0gIHsgInVwc3IiLAkweDAsCTB4Zgl9LAotICB7ICJmcCIsCTB4OCwJMHhmCX0sCi0gIHsgInNwIiwJMHg5LAkweGYJfSwKLSAgeyAic2IiLAkweGEsCTB4Zgl9LAotICB7ICJwc3IiLAkweGIsCTB4Zgl9LAotICB7ICJpbnRiYXNlIiwJMHhlLAkweGYJfSwKLSAgeyAibW9kIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MCwJMHhmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfTTAzMltdPSAvKiBsbXIgc21yICovCi17Ci0gIHsgImJwcjAiLAkweDAsCTB4Zgl9LAotICB7ICJicHIxIiwJMHgxLAkweGYJfSwKLSAgeyAicGYwIiwJMHg0LAkweGYJfSwKLSAgeyAicGYxIiwJMHg1LAkweGYJfSwKLSAgeyAic2MiLAkweDgsCTB4Zgl9LAotICB7ICJtc3IiLAkweGEsCTB4Zgl9LAotICB7ICJiY250IiwJMHhiLAkweGYJfSwKLSAgeyAicHRiMCIsCTB4YywJMHhmCX0sCi0gIHsgInB0YjEiLAkweGQsCTB4Zgl9LAotICB7ICJlaWEiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwLAkweGYJfQotfTsKLQotCi0vKgotICogZmlndXJlIG91dCB3aGljaCBvcHRpb25zIGFyZSBwcmVzZW50Ci0gKi8KLXN0YXRpYyB2b2lkCi1vcHRsaXN0KG9wdGlvbnMsIG9wdGlvblAsIHJlc3VsdCkKLSAgICAgaW50IG9wdGlvbnM7Ci0gICAgIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLXsKLSAgICBpZiAob3B0aW9ucyA9PSAwKSB7Ci0Jc3ByaW50ZihyZXN1bHQsICJbXSIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgc3ByaW50ZihyZXN1bHQsICJbIik7Ci0KLSAgICBmb3IgKDsgKG9wdGlvbnMgIT0gMCkgJiYgb3B0aW9uUC0+cGF0dGVybjsgb3B0aW9uUCsrKSB7Ci0JaWYgKChvcHRpb25zICYgb3B0aW9uUC0+bWF0Y2gpID09IG9wdGlvblAtPnZhbHVlKSB7Ci0JICAgIC8qIHdlIGZvdW5kIGEgbWF0Y2gsIHVwZGF0ZSByZXN1bHQgYW5kIG9wdGlvbnMgKi8KLQkgICAgc3RyY2F0KHJlc3VsdCwgb3B0aW9uUC0+cGF0dGVybik7Ci0JICAgIG9wdGlvbnMgJj0gfm9wdGlvblAtPnZhbHVlOwotCSAgICBpZiAob3B0aW9ucyAhPSAwKQkvKiBtb3JlIG9wdGlvbnMgdG8gY29tZSAqLwotCQlzdHJjYXQocmVzdWx0LCAiLCIpOwotCX0KLSAgICB9Ci0gICAgaWYgKG9wdGlvbnMgIT0gMCkKLQlzdHJjYXQocmVzdWx0LCAidW5kZWZpbmVkIik7Ci0KLSAgICBzdHJjYXQocmVzdWx0LCAiXSIpOwotfQotCi1zdGF0aWMgdm9pZAotbGlzdF9zZWFyY2ggKHJlZ192YWx1ZSwgb3B0aW9uUCwgcmVzdWx0KQotICAgICBpbnQgcmVnX3ZhbHVlOwotICAgICBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOwotICAgICBjaGFyICpyZXN1bHQ7Ci17Ci0gICAgZm9yICg7IG9wdGlvblAtPnBhdHRlcm47IG9wdGlvblArKykgewotCWlmICgocmVnX3ZhbHVlICYgb3B0aW9uUC0+bWF0Y2gpID09IG9wdGlvblAtPnZhbHVlKSB7Ci0JICAgIHNwcmludGYocmVzdWx0LCAiJXMiLCBvcHRpb25QLT5wYXR0ZXJuKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0gICAgc3ByaW50ZihyZXN1bHQsICJ1bmRlZmluZWQiKTsKLX0KLQwKLS8qCi0gKiBleHRyYWN0ICJjb3VudCIgYml0cyBzdGFydGluZyAib2Zmc2V0IiBiaXRzCi0gKiBpbnRvIGJ1ZmZlcgotICovCi0KLXN0YXRpYyBpbnQKLWJpdF9leHRyYWN0IChidWZmZXIsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaW50IHJlc3VsdDsKLSAgaW50IGJpdDsKLQotICBidWZmZXIgKz0gb2Zmc2V0ID4+IDM7Ci0gIG9mZnNldCAmPSA3OwotICBiaXQgPSAxOwotICByZXN1bHQgPSAwOwotICB3aGlsZSAoY291bnQtLSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBKGRpc19pbmZvLCBidWZmZXIgKyAxKTsKLSAgICAgIGlmICgoKmJ1ZmZlciAmICgxIDw8IG9mZnNldCkpKQotCXJlc3VsdCB8PSBiaXQ7Ci0gICAgICBpZiAoKytvZmZzZXQgPT0gOCkKLQl7Ci0JICBvZmZzZXQgPSAwOwotCSAgYnVmZmVyKys7Ci0JfQotICAgICAgYml0IDw8PSAxOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogTGlrZSBiaXQgZXh0cmFjdCBidXQgdGhlIGJ1ZmZlciBpcyB2YWxpZCBhbmQgZG9lbid0IG5lZWQgdG8gYmUKLSAqIGZldGNoZWQKLSAqLwotc3RhdGljIGludAotYml0X2V4dHJhY3Rfc2ltcGxlIChidWZmZXIsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaW50IHJlc3VsdDsKLSAgaW50IG1hc2s7Ci0gIGludCBiaXQ7Ci0KLSAgYnVmZmVyICs9IG9mZnNldCA+PiAzOwotICBvZmZzZXQgJj0gNzsKLSAgYml0ID0gMTsKLSAgcmVzdWx0ID0gMDsKLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgewotICAgICAgaWYgKCgqYnVmZmVyICYgKDEgPDwgb2Zmc2V0KSkpCi0JcmVzdWx0IHw9IGJpdDsKLSAgICAgIGlmICgrK29mZnNldCA9PSA4KQotCXsKLQkgIG9mZnNldCA9IDA7Ci0JICBidWZmZXIrKzsKLQl9Ci0gICAgICBiaXQgPDw9IDE7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZAotYml0X2NvcHkgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCwgdG8pCi0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGNvdW50OwotICAgICBjaGFyICp0bzsKLXsKLSAgZm9yKDsgY291bnQgPiA4OyBjb3VudCAtPSA4LCB0bysrLCBvZmZzZXQgKz0gOCkKLSAgICAqdG8gPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIDgpOwotICAqdG8gPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKLX0KLQotCi1zdGF0aWMgaW50Ci1zaWduX2V4dGVuZCAodmFsdWUsIGJpdHMpCi0gICAgIGludCB2YWx1ZSwgYml0czsKLXsKLSAgdmFsdWUgPSB2YWx1ZSAmICgoMSA8PCBiaXRzKSAtIDEpOwotICByZXR1cm4gKHZhbHVlICYgKDEgPDwgKGJpdHMtMSkpCi0JICA/IHZhbHVlIHwgKH4oKDEgPDwgYml0cykgLSAxKSkKLQkgIDogdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZAotZmxpcF9ieXRlcyAocHRyLCBjb3VudCkKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGNoYXIgdG1wOwotCi0gIHdoaWxlIChjb3VudCA+IDApCi0gICAgewotICAgICAgdG1wID0gcHRyWzBdOwotICAgICAgcHRyWzBdID0gcHRyW2NvdW50LTFdOwotICAgICAgcHRyW2NvdW50LTFdID0gdG1wOwotICAgICAgcHRyKys7Ci0gICAgICBjb3VudCAtPSAyOwotICAgIH0KLX0KLQwKLS8qIEdpdmVuIGEgY2hhcmFjdGVyIEMsIGRvZXMgaXQgcmVwcmVzZW50IGEgZ2VuZXJhbCBhZGRyZXNzaW5nIG1vZGU/ICAqLwotI2RlZmluZSBJc19nZW4oYykgXAotICAoKGMpID09ICdGJyB8fCAoYykgPT0gJ0wnIHx8IChjKSA9PSAnQicgXAotICAgfHwgKGMpID09ICdXJyB8fCAoYykgPT0gJ0QnIHx8IChjKSA9PSAnQScgfHwgKGMpID09ICdJJyB8fCAoYykgPT0gJ1onKQotCi0vKiBBZHJlc3NpbmcgbW9kZXMuICAqLwotI2RlZmluZSBBZHJtb2RfaW5kZXhfYnl0ZSAweDFjCi0jZGVmaW5lIEFkcm1vZF9pbmRleF93b3JkIDB4MWQKLSNkZWZpbmUgQWRybW9kX2luZGV4X2RvdWJsZXdvcmQgMHgxZQotI2RlZmluZSBBZHJtb2RfaW5kZXhfcXVhZHdvcmQgMHgxZgotCi0vKiBJcyBNT0RFIGFuIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlPyAgKi8KLSNkZWZpbmUgQWRybW9kX2lzX2luZGV4KG1vZGUpIFwKLSAgKG1vZGUgPT0gQWRybW9kX2luZGV4X2J5dGUgXAotICAgfHwgbW9kZSA9PSBBZHJtb2RfaW5kZXhfd29yZCBcCi0gICB8fCBtb2RlID09IEFkcm1vZF9pbmRleF9kb3VibGV3b3JkIFwKLSAgIHx8IG1vZGUgPT0gQWRybW9kX2luZGV4X3F1YWR3b3JkKQotCi0MCi0vKiBQcmludCB0aGUgMzIwMDAgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIFNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLwotCi1pbnQKLXByaW50X2luc25fbnMzMmsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0gIHJlZ2lzdGVyIGNoYXIgKmQ7Ci0gIHVuc2lnbmVkIHNob3J0IGZpcnN0X3dvcmQ7Ci0gIGludCBpb2Zmc2V0OwkJLyogYml0cyBpbnRvIGluc3RydWN0aW9uICovCi0gIGludCBhb2Zmc2V0OwkJLyogYml0cyBpbnRvIGFyZ3VtZW50cyAqLwotICBjaGFyIGFyZ19idWZzW01BWF9BUkdTKzFdW0FSR19MRU5dOwotICBpbnQgYXJnbnVtOwotICBpbnQgbWF4YXJnOwotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotICBkaXNfaW5mbyA9IGluZm87Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotICAvKiBMb29rIGZvciA4Yml0IG9wY29kZXMgZmlyc3QuIE90aGVyIHdpc2UsIGZldGNoaW5nIHR3byBieXRlcyBjb3VsZCB0YWtlCi0gICAqIHVzIG92ZXIgdGhlIGVuZCBvZiBhY2Nlc3NpYmxlIGRhdGEgdW5uZWNlc3NhcmlsbHkKLSAgICovCi0gIEZFVENIX0RBVEEoaW5mbywgYnVmZmVyICsgMSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQotICAgIGlmIChuczMya19vcGNvZGVzW2ldLm9wY29kZV9pZF9zaXplIDw9IDgKLQkmJiAoKGJ1ZmZlclswXQotCSAgICAgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUpIC0gMSkpCi0JICAgID09IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NlZWQpKQotICAgICAgYnJlYWs7Ci0gIGlmIChpID09IE5PUENPREVTKSB7Ci0gICAgLyogTWF5YmUgaXQgaXMgOSB0byAxNiBiaXRzIGJpZyAqLwotICAgIEZFVENIX0RBVEEoaW5mbywgYnVmZmVyICsgMik7Ci0gICAgZmlyc3Rfd29yZCA9IHJlYWRfbWVtb3J5X2ludGVnZXIoYnVmZmVyLCAyKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQotICAgICAgaWYgKChmaXJzdF93b3JkCi0JICAgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUpIC0gMSkpCi0JICA9PSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zZWVkKQotCWJyZWFrOwotCi0gICAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLwotICAgIGlmIChpID09IE5PUENPREVTKQotICAgICAgewotCSgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIjAlbyIsIGJ1ZmZlclswXSk7Ci0JcmV0dXJuIDE7Ci0gICAgICB9Ci0gIH0KLQotICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIlcyIsIG5zMzJrX29wY29kZXNbaV0ubmFtZSk7Ci0KLSAgaW9mZnNldCA9IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NpemU7Ci0gIGFvZmZzZXQgPSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zaXplOwotICBkID0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGVyYW5kczsKLQotICBpZiAoKmQpCi0gICAgewotICAgICAgLyogT2Zmc2V0IGluIGJpdHMgb2YgdGhlIGZpcnN0IHRoaW5nIGJleW9uZCBlYWNoIGluZGV4IGJ5dGUuCi0JIEVsZW1lbnQgMCBpcyBmb3Igb3BlcmFuZCBBIGFuZCBlbGVtZW50IDEgaXMgZm9yIG9wZXJhbmQgQi4KLQkgVGhlIHJlc3QgYXJlIGlycmVsZXZhbnQsIGJ1dCB3ZSBwdXQgdGhlbSBoZXJlIHNvIHdlIGRvbid0Ci0JIGluZGV4IG91dHNpZGUgdGhlIGFycmF5LiAgKi8KLSAgICAgIGludCBpbmRleF9vZmZzZXRbTUFYX0FSR1NdOwotCi0gICAgICAvKiAwIGZvciBvcGVyYW5kIEEsIDEgZm9yIG9wZXJhbmQgQiwgZ3JlYXRlciBmb3Igb3RoZXIgYXJncy4gICovCi0gICAgICBpbnQgd2hpY2hhcmcgPSAwOwotICAgICAgCi0gICAgICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gICAgICBtYXhhcmcgPSAwOwotCi0gICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIGZpbmQgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIGluZGV4IGJ5dGVzLAotCSBpZiB3ZSBhcmUgdXNpbmcgc2NhbGVkIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlLCBzaW5jZSB0aGUgaW5kZXgKLQkgYnl0ZXMgb2NjdXIgcmlnaHQgYWZ0ZXIgdGhlIGJhc2ljIGluc3RydWN0aW9uLCBub3QgYXMgcGFydAotCSBvZiB0aGUgYWRkcmVzc2luZyBleHRlbnNpb24uICAqLwotICAgICAgaWYgKElzX2dlbihkWzFdKSkKLQl7Ci0JICBpbnQgYWRkcl9tb2RlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldCAtIDUsIDUpOwotCi0JICBpZiAoQWRybW9kX2lzX2luZGV4IChhZGRyX21vZGUpKQotCSAgICB7Ci0JICAgICAgYW9mZnNldCArPSA4OwotCSAgICAgIGluZGV4X29mZnNldFswXSA9IGFvZmZzZXQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZFsyXSAmJiBJc19nZW4oZFszXSkpCi0JewotCSAgaW50IGFkZHJfbW9kZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQgLSAxMCwgNSk7Ci0KLQkgIGlmIChBZHJtb2RfaXNfaW5kZXggKGFkZHJfbW9kZSkpCi0JICAgIHsKLQkgICAgICBhb2Zmc2V0ICs9IDg7Ci0JICAgICAgaW5kZXhfb2Zmc2V0WzFdID0gYW9mZnNldDsKLQkgICAgfQotCX0KLQotICAgICAgd2hpbGUgKCpkKQotCXsKLQkgIGFyZ251bSA9ICpkIC0gJzEnOwotCSAgZCsrOwotCSAgaWYgKGFyZ251bSA+IG1heGFyZyAmJiBhcmdudW0gPCBNQVhfQVJHUykKLQkgICAgbWF4YXJnID0gYXJnbnVtOwotCSAgaW9mZnNldCA9IHByaW50X2luc25fYXJnICgqZCwgaW9mZnNldCwgJmFvZmZzZXQsIGJ1ZmZlciwKLQkJCQkgICAgbWVtYWRkciwgYXJnX2J1ZnNbYXJnbnVtXSwKLQkJCQkgICAgaW5kZXhfb2Zmc2V0W3doaWNoYXJnXSk7Ci0JICBkKys7Ci0JICB3aGljaGFyZysrOwotCX0KLSAgICAgIGZvciAoYXJnbnVtID0gMDsgYXJnbnVtIDw9IG1heGFyZzsgYXJnbnVtKyspCi0JewotCSAgYmZkX3ZtYSBhZGRyOwotCSAgY2hhciAqY2g7Ci0JICBmb3IgKGNoID0gYXJnX2J1ZnNbYXJnbnVtXTsgKmNoOykKLQkgICAgewotCSAgICAgIGlmICgqY2ggPT0gTkVYVF9JU19BRERSKQotCQl7Ci0JCSAgKytjaDsKLQkJICBhZGRyID0gYmZkX3NjYW5fdm1hIChjaCwgTlVMTCwgMTYpOwotCQkgICgqZGlzX2luZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIsIGRpc19pbmZvKTsKLQkJICB3aGlsZSAoKmNoICYmICpjaCAhPSBORVhUX0lTX0FERFIpCi0JCSAgICArK2NoOwotCQkgIGlmICgqY2gpCi0JCSAgICArK2NoOwotCQl9Ci0JICAgICAgZWxzZQotCQkoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIlYyIsICpjaCsrKTsKLQkgICAgfQotCSAgaWYgKGFyZ251bSA8IG1heGFyZykKLQkgICAgKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiLCAiKTsKLQl9Ci0gICAgfQotICByZXR1cm4gYW9mZnNldCAvIDg7Ci19Ci0KLS8qIFByaW50IGFuIGluc3RydWN0aW9uIG9wZXJhbmQgb2YgY2F0ZWdvcnkgZ2l2ZW4gYnkgZC4gIElPRkZTRVQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gYmVsb3cgd2hpY2ggc21hbGwgKDwxIGJ5dGUpIHBhcnRzIG9mIHRoZSBvcGVyYW5kIGNhbgotICAgYmUgZm91bmQgKHVzdWFsbHkgaW4gdGhlIGJhc2ljIGluc3RydWN0aW9uLCBidXQgZm9yIGluZGV4ZWQKLSAgIGFkZHJlc3NpbmcgaXQgY2FuIGJlIGluIHRoZSBpbmRleCBieXRlKS4gIEFPRkZTRVRQIGlzIGEgcG9pbnRlciB0byB0aGUKLSAgIGJpdCBwb3NpdGlvbiBvZiB0aGUgYWRkcmVzc2luZyBleHRlbnNpb24uICBCVUZGRVIgY29udGFpbnMgdGhlCi0gICBpbnN0cnVjdGlvbi4gIEFERFIgaXMgd2hlcmUgQlVGRkVSIHdhcyByZWFkIGZyb20uICBQdXQgdGhlIGRpc2Fzc2VtYmxlZAotICAgdmVyc2lvbiBvZiB0aGUgb3BlcmFuZCBpbiBSRVNVTFQuICBJTkRFWF9PRkZTRVQgaXMgdGhlIGJpdCBwb3NpdGlvbgotICAgb2YgdGhlIGluZGV4IGJ5dGUgKGl0IGNvbnRhaW5zIGdhcmJhZ2UgaWYgdGhpcyBvcGVyYW5kIGlzIG5vdCBhCi0gICBnZW5lcmFsIG9wZXJhbmQgdXNpbmcgc2NhbGVkIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJnIChkLCBpb2Zmc2V0LCBhb2Zmc2V0cCwgYnVmZmVyLCBhZGRyLCByZXN1bHQsIGluZGV4X29mZnNldCkKLSAgICAgaW50IGQ7Ci0gICAgIGludCBpb2Zmc2V0LCAqYW9mZnNldHA7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjaGFyICpyZXN1bHQ7Ci0gICAgIGludCBpbmRleF9vZmZzZXQ7Ci17Ci0gIGludCBhZGRyX21vZGU7Ci0gIGZsb2F0IEZ2YWx1ZTsKLSAgZG91YmxlIEx2YWx1ZTsKLSAgaW50IEl2YWx1ZTsKLSAgaW50IGRpc3AxLCBkaXNwMjsKLSAgaW50IGluZGV4OwotICBpbnQgc2l6ZTsKLQotICBzd2l0Y2ggKGQpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgLyogYSAiZ2VuIiBvcGVyYW5kIGJ1dCA1IGJpdHMgZnJvbSB0aGUgZW5kIG9mIGluc3RydWN0aW9uICovCi0gICAgICBpb2Zmc2V0IC09IDU7Ci0gICAgY2FzZSAnWic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAnTCc6Ci0gICAgY2FzZSAnSSc6Ci0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnQSc6Ci0gICAgICBhZGRyX21vZGUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0LTUsIDUpOwotICAgICAgaW9mZnNldCAtPSA1OwotICAgICAgc3dpdGNoIChhZGRyX21vZGUpCi0JewotCWNhc2UgMHgwOiBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOgotCWNhc2UgMHg0OiBjYXNlIDB4NTogY2FzZSAweDY6IGNhc2UgMHg3OgotCSAgLyogcmVnaXN0ZXIgbW9kZSBSMCAtLSBSNyAqLwotCSAgc3dpdGNoIChkKQotCSAgICB7Ci0JICAgIGNhc2UgJ0YnOgotCSAgICBjYXNlICdMJzoKLQkgICAgY2FzZSAnWic6Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiZiVkIiwgYWRkcl9tb2RlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICJyJWQiLCBhZGRyX21vZGUpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDB4ODogY2FzZSAweDk6IGNhc2UgMHhhOiBjYXNlIDB4YjoKLQljYXNlIDB4YzogY2FzZSAweGQ6IGNhc2UgMHhlOiBjYXNlIDB4ZjoKLQkgIC8qIFJlZ2lzdGVyIHJlbGF0aXZlIGRpc3AoUjAgLS0gUjcpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQociVkKSIsIGRpc3AxLCBhZGRyX21vZGUgJiA3KTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMDoKLQljYXNlIDB4MTE6Ci0JY2FzZSAweDEyOgotCSAgLyogTWVtb3J5IHJlbGF0aXZlIGRpc3AyKGRpc3AxKEZQLCBTUCwgU0IpKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIGRpc3AyID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICIlZCglZCglcykpIiwgZGlzcDIsIGRpc3AxLAotCQkgICBhZGRyX21vZGU9PTB4MTA/ImZwIjphZGRyX21vZGU9PTB4MTE/InNwIjoic2IiKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMzoKLQkgIC8qIHJlc2VydmVkICovCi0JICBzcHJpbnRmIChyZXN1bHQsICJyZXNlcnZlZCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE0OgotCSAgLyogSW1tZWRpYXRlICovCi0JICBzd2l0Y2ggKGQpCi0JICAgIHsKLQkgICAgY2FzZSAnSSc6IGNhc2UgJ1onOiBjYXNlICdBJzoKLQkgICAgICAvKiBJIGFuZCBaIGFyZSBvdXRwdXQgb3BlcmFuZHMgYW5kIGNhbmB0IGJlIGltbWVkaWF0ZQotCSAgICAgICAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgotCSAgICAgICAqIGFuIGltbWVkaWF0ZSBlaXRoZXIuIFdlIGRvbid0IGtub3cgaG93IG11Y2ggdG8gaW5jcmVhc2UKLQkgICAgICAgKiBhb2Zmc2V0cCBieSBzaW5jZSB3aGF0ZXZlciBnZW5lcmF0ZWQgdGhpcyBpcyBicm9rZW4KLQkgICAgICAgKiBhbnl3YXkhCi0JICAgICAgICovCi0JICAgICAgc3ByaW50ZiAocmVzdWx0LCBfKCIkPHVuZGVmaW5lZD4iKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0JICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgOCk7Ci0JICAgICAgKmFvZmZzZXRwICs9IDg7Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAxNik7Ci0JICAgICAgZmxpcF9ieXRlcyAoJkl2YWx1ZSwgMik7Ci0JICAgICAgKmFvZmZzZXRwICs9IDE2OwotCSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDE2KTsKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICIkJWQiLCBJdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdEJzoKLQkgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDMyKTsKLQkgICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCA0KTsKLQkgICAgICAqYW9mZnNldHAgKz0gMzI7Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnRic6Ci0JICAgICAgYml0X2NvcHkgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMiwgKGNoYXIgKikgJkZ2YWx1ZSk7Ci0JICAgICAgZmxpcF9ieXRlcyAoJkZ2YWx1ZSwgNCk7Ci0JICAgICAgKmFvZmZzZXRwICs9IDMyOwotCSAgICAgIGlmIChJTlZBTElEX0ZMT0FUICgmRnZhbHVlLCA0KSkKLQkJc3ByaW50ZiAocmVzdWx0LCAiPDxpbnZhbGlkIGZsb2F0IDB4JS44eD4+IiwgKihpbnQgKikgJkZ2YWx1ZSk7Ci0JICAgICAgZWxzZSAvKiBhc3N1bWUgaG9zdCBoYXMgaWVlZSBmbG9hdCAqLwotCQlzcHJpbnRmIChyZXN1bHQsICIkJWciLCBGdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdMJzoKLQkgICAgICBiaXRfY29weSAoYnVmZmVyLCAqYW9mZnNldHAsIDY0LCAoY2hhciAqKSAmTHZhbHVlKTsKLQkgICAgICBmbGlwX2J5dGVzICgmTHZhbHVlLCA4KTsKLQkgICAgICAqYW9mZnNldHAgKz0gNjQ7Ci0JICAgICAgaWYgKElOVkFMSURfRkxPQVQgKCZMdmFsdWUsIDgpKQotCQlzcHJpbnRmIChyZXN1bHQsICI8PGludmFsaWQgbG9uZyAweCUuOHglLjh4Pj4iLAotCQkJICooKChpbnQgKikgJkx2YWx1ZSkgKyAxKSwgKihpbnQgKikgJkx2YWx1ZSk7Ci0JICAgICAgZWxzZSAvKiBhc3N1bWUgaG9zdCBoYXMgaWVlZSBmbG9hdCAqLwotCQlzcHJpbnRmIChyZXN1bHQsICIkJWciLCBMdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDB4MTU6Ci0JICAvKiBBYnNvbHV0ZSBAZGlzcCAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIkB8JWR8IiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE2OgotCSAgLyogRXh0ZXJuYWwgRVhUKGRpc3AxKSArIGRpc3AyIChNb2QgdGFibGUgc3R1ZmYpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgZGlzcDIgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIkVYVCglZCkgKyAlZCIsIGRpc3AxLCBkaXNwMik7Ci0JICBicmVhazsKLQljYXNlIDB4MTc6Ci0JICAvKiBUb3Agb2Ygc3RhY2sgdG9zICovCi0JICBzcHJpbnRmIChyZXN1bHQsICJ0b3MiKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxODoKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKEZQKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKGZwKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxOToKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFNQKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHNwKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxYToKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFNCKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHNiKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxYjoKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFBDKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgICpyZXN1bHQrKyA9IE5FWFRfSVNfQUREUjsKLQkgIHNwcmludGZfdm1hIChyZXN1bHQsIGFkZHIgKyBkaXNwMSk7Ci0JICByZXN1bHQgKz0gc3RybGVuIChyZXN1bHQpOwotCSAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotCSAgKnJlc3VsdCA9ICdcMCc7Ci0JICBicmVhazsKLQljYXNlIDB4MWM6Ci0JY2FzZSAweDFkOgotCWNhc2UgMHgxZToKLQljYXNlIDB4MWY6Ci0JICAvKiBTY2FsZWQgaW5kZXggYmFzZW1vZGVbUjAgLS0gUjc6QixXLEQsUV0gKi8KLQkgIGluZGV4ID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW5kZXhfb2Zmc2V0IC0gOCwgMyk7Ci0JICBwcmludF9pbnNuX2FyZyAoZCwgaW5kZXhfb2Zmc2V0LCBhb2Zmc2V0cCwgYnVmZmVyLCBhZGRyLAotCQkJICByZXN1bHQsIDApOwotCSAgewotCSAgICBzdGF0aWMgY29uc3QgY2hhciAqaW5kID0gImJ3ZHEiOwotCSAgICBjaGFyICpvZmY7Ci0KLQkgICAgb2ZmID0gcmVzdWx0ICsgc3RybGVuIChyZXN1bHQpOwotCSAgICBzcHJpbnRmIChvZmYsICJbciVkOiVjXSIsIGluZGV4LAotCQkgICAgIGluZFthZGRyX21vZGUgJiAzXSk7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdIJzoKLSAgICBjYXNlICdxJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCA0KTsKLSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiVkIiwgSXZhbHVlKTsKLSAgICAgIGlvZmZzZXQgLT0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldC0zLCAzKTsKLSAgICAgIHNwcmludGYgKHJlc3VsdCwgInIlZCIsIEl2YWx1ZSY3KTsKLSAgICAgIGlvZmZzZXQgLT0gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgIEl2YWx1ZSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotICAgICAgLyoKLSAgICAgICAqIFdhcm5pbmchISAgSEFDSyBBTEVSVCEKLSAgICAgICAqIE9wZXJhbmQgdHlwZSAnYicgaXMgb25seSB1c2VkIGJ5IHRoZSBjbXB7Yix3LGR9IGFuZAotICAgICAgICogbW92bXtiLHcsZH0gaW5zdHJ1Y3Rpb25zOyB3ZSBuZWVkIHRvIGtub3cgd2hldGhlcgotICAgICAgICogaXQncyBhIGBiJyBvciBgdycgb3IgYGQnIGluc3RydWN0aW9uOyBhbmQgZm9yIGJvdGgKLSAgICAgICAqIGNtcG0gYW5kIG1vdm0gaXQncyBzdG9yZWQgYXQgdGhlIHNhbWUgcGxhY2Ugc28gd2UKLSAgICAgICAqIGp1c3QgZ3JhYiB0d28gYml0cyBvZiB0aGUgb3Bjb2RlIGFuZCBsb29rIGF0IGl0Li4uCi0gICAgICAgKiAKLSAgICAgICAqLwotICAgICAgc2l6ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC02LCAyKTsKLSAgICAgIGlmIChzaXplID09IDApCQkvKiAwMCA9PiBiICovCi0Jc2l6ZSA9IDE7Ci0gICAgICBlbHNlIGlmIChzaXplID09IDEpCS8qIDAxID0+IHcgKi8KLQlzaXplID0gMjsKLSAgICAgIGVsc2UKLQlzaXplID0gNDsJCS8qIDExID0+IGQgKi8KLQotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCAoSXZhbHVlIC8gc2l6ZSkgKyAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3AnOgotICAgICAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotICAgICAgc3ByaW50Zl92bWEgKHJlc3VsdCwgYWRkciArIGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApKTsKLSAgICAgIHJlc3VsdCArPSBzdHJsZW4gKHJlc3VsdCk7Ci0gICAgICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7Ci0gICAgICAqcmVzdWx0ID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLSAgICAgICphb2Zmc2V0cCArPSA4OwotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiMHgleCIsIEl2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd1JzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X3UsIHJlc3VsdCk7Ci0gICAgICAqYW9mZnNldHAgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1UnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCAqYW9mZnNldHAsIDgpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9VLCByZXN1bHQpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdPJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC05LCA5KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfTywgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0MnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9DLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQgLSA4LCA4KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfUywgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ00nOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOwotICAgICAgbGlzdF9zZWFyY2goSXZhbHVlLCAwID8gbGlzdF9NMDMyIDogbGlzdF9NNTMyLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBsaXN0X3NlYXJjaChJdmFsdWUsIDAgPyBsaXN0X1AwMzIgOiBsaXN0X1A1MzIsIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdnJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCAzKTsKLSAgICAgIHNwcmludGYocmVzdWx0LCAiJWQiLCBJdmFsdWUpOwotICAgICAgKmFvZmZzZXRwICs9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdHJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCA1KTsKLSAgICAgIHNwcmludGYocmVzdWx0LCAiJWQiLCBJdmFsdWUgKyAxKTsKLSAgICAgICphb2Zmc2V0cCArPSA1OwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gaW9mZnNldDsKLX0KLQotc3RhdGljIGludAotZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCkKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBpbnQgKmFvZmZzZXRwOwotewotICBpbnQgSXZhbHVlOwotICBzaG9ydCBJdmFsdWUyOwotCi0gIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gIHN3aXRjaCAoSXZhbHVlICYgMHhjMCkKLSAgICB7Ci0gICAgY2FzZSAweDAwOgotICAgIGNhc2UgMHg0MDoKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDcpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODA6Ci0gICAgICBJdmFsdWUyID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAxNik7Ci0gICAgICBmbGlwX2J5dGVzICgmSXZhbHVlMiwgMik7Ci0gICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlMiwgMTQpOwotICAgICAgKmFvZmZzZXRwICs9IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGMwOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMik7Ci0gICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCA0KTsKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDMwKTsKLSAgICAgICphb2Zmc2V0cCArPSAzMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIEl2YWx1ZTsKLX0KLQwKLQotI2lmIDEgLyogYSB2ZXJzaW9uIHRoYXQgc2hvdWxkIHdvcmsgb24gbnMzMmsgZidzJmQncyBvbiBhbnkgbWFjaGluZSAqLwotc3RhdGljIGludAotaW52YWxpZF9mbG9hdCAocCwgbGVuKQotICAgICByZWdpc3RlciBjaGFyICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotewotICByZWdpc3RlciBpbnQgdmFsOwotCi0gIGlmICggbGVuID09IDQgKQotICAgIHZhbCA9IChiaXRfZXh0cmFjdF9zaW1wbGUocCwgMjMsIDgpLypleHBvbmVudCovID09IDB4ZmYKLQkgICB8fCAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDIzLCA4KS8qZXhwb25lbnQqLyA9PSAwICYmCi0JICAgICAgIGJpdF9leHRyYWN0X3NpbXBsZShwLCAwLCAyMykvKm1hbnRpc2EqLyAhPSAwKSk7Ci0gIGVsc2UgaWYgKCBsZW4gPT0gOCApCi0gICAgdmFsID0gKGJpdF9leHRyYWN0X3NpbXBsZShwLCA1MiwgMTEpLypleHBvbmVudCovID09IDB4N2ZmCi0JICAgfHwgKGJpdF9leHRyYWN0X3NpbXBsZShwLCA1MiwgMTEpLypleHBvbmVudCovID09IDAKLQkgICAgICAgJiYgKGJpdF9leHRyYWN0X3NpbXBsZShwLCAwLCAzMikvKmxvdyBtYW50aXNhKi8gIT0gMAotCQkgICB8fCBiaXRfZXh0cmFjdF9zaW1wbGUocCwgMzIsIDIwKS8qaGlnaCBtYW50aXNhKi8gIT0gMCkpKTsKLSAgZWxzZQotICAgIHZhbCA9IDE7Ci0gIHJldHVybiAodmFsKTsKLX0KLSNlbHNlCi0KLS8qIGFzc3VtZXMgdGhlIGJ5dGVzIGhhdmUgYmVlbiBzd2FwcGVkIHRvIGxvY2FsIG9yZGVyICovCi10eXBlZGVmIHVuaW9uIHsgZG91YmxlIGQ7Ci0JCWZsb2F0IGY7Ci0JCXN0cnVjdCB7IHVuc2lnbmVkIG06MjMsIGU6OCwgOjE7fSBzZjsKLQkJc3RydWN0IHsgdW5zaWduZWQgbG07IHVuc2lnbmVkIG06MjAsIGU6MTEsIDoxO30gc2Q7Ci0JICAgICAgfSBmbG9hdF90eXBlX3U7Ci0KLXN0YXRpYyBpbnQKLWludmFsaWRfZmxvYXQgKHAsIGxlbikKLSAgICAgcmVnaXN0ZXIgZmxvYXRfdHlwZV91ICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotewotICByZWdpc3RlciBpbnQgdmFsOwotICBpZiAoIGxlbiA9PSBzaXplb2YgKGZsb2F0KSApCi0gICAgdmFsID0gKHAtPnNmLmUgPT0gMHhmZgotCSAgIHx8IChwLT5zZi5lID09IDAgJiYgcC0+c2YubSAhPSAwKSk7Ci0gIGVsc2UgaWYgKCBsZW4gPT0gc2l6ZW9mIChkb3VibGUpICkKLSAgICB2YWwgPSAocC0+c2QuZSA9PSAweDdmZgotCSAgIHx8IChwLT5zZC5lID09IDAgJiYgKHAtPnNkLm0gIT0gMCB8fCBwLT5zZC5sbSAhPSAwKSkpOwotICBlbHNlCi0gICAgdmFsID0gMTsKLSAgcmV0dXJuICh2YWwpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL29waW50bC5oIGIvb3Bjb2Rlcy9vcGludGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MDE2MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL29waW50bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogb3BpbnRsLmggLSBvcGNvZGVzIHNwZWNpZmljIGhlYWRlciBmb3IgZ2V0dGV4dCBjb2RlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgb3Bjb2RlcyBsaWJyYXJ5IHVzZWQgYnkgR0FTIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBkZ2V0dGV4dCAoUEFDS0FHRSwgU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL3BqLWRpcy5jIGIvb3Bjb2Rlcy9wai1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ODI5NS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BqLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qIHBqLWRpcy5jIC0tIERpc2Fzc2VtYmxlIHBpY29KYXZhIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCi0gICBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiwgb2YgVHJhbnNtZXRhIChzYWNAcG9ib3guY29tKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJvcGNvZGUvcGouaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLWV4dGVybiBjb25zdCBwal9vcGNfaW5mb190IHBqX29wY19pbmZvWzUxMl07Ci0KLXN0YXRpYyBpbnQgZ2V0X2ludCAobWVtYWRkciwgaXB0ciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBpbnQgKmlwdHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBjaGFyIGl2YWxbNF07Ci0KLSAgaW50IHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGl2YWwsIDQsIGluZm8pOwotCi0gICppcHRyID0gKGl2YWxbMF0gPDwgMjQpIAotICAgIHwgKGl2YWxbMV0gPDwgMTYpIAotICAgIHwgKGl2YWxbMl0gPDwgOCkgCi0gICAgfCAoaXZhbFszXSA8PCAwKSA7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotaW50Ci1wcmludF9pbnNuX3BqIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBmcHJpbnRmX2Z0eXBlIGZwcmludGZfZm4gPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGU7Ci0gIGludCBzdGF0dXM7Ci0KLSAgaWYgKChzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChhZGRyLCAmb3Bjb2RlLCAxLCBpbmZvKSkpCi0gICAgZ290byBmYWlsOwotCi0gIGlmIChvcGNvZGUgPT0gMHhmZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGJ5dGVfMjsKLSAgICAgIGlmICgoc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoYWRkciArIDEsICZieXRlXzIsIDEsIGluZm8pKSkKLQlnb3RvIGZhaWw7Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIlc1x0IiwgcGpfb3BjX2luZm9bb3Bjb2RlICsgYnl0ZV8yXS5uYW1lKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnNlcCA9ICJcdCI7Ci0gICAgICBpbnQgaW5zbl9zdGFydCA9IGFkZHI7Ci0gICAgICBjb25zdCBwal9vcGNfaW5mb190ICpvcCA9ICZwal9vcGNfaW5mb1tvcGNvZGVdOwotICAgICAgaW50IGE7Ci0gICAgICBhZGRyKys7Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKLQotICAgICAgLyogVGhlIHRhYmxlc3dpdGNoIGluc3RydWN0aW9uIGlzIGZvbGxvd2VkIGJ5IHRoZSBkZWZhdWx0Ci0JIGFkZHJlc3MsIGxvdyB2YWx1ZSwgaGlnaCB2YWx1ZSBhbmQgdGhlIGRlc3RpbmF0aW9ucy4gKi8KLQotICAgICAgaWYgKHN0cmNtcCAob3AtPm5hbWUsICJ0YWJsZXN3aXRjaCIpID09IDApCi0JewotCSAgaW50IGxvd3ZhbDsKLQkgIGludCBoaWdodmFsOwotCSAgaW50IHZhbDsKLQotCSAgYWRkciA9IChhZGRyICsgMykgJiB+MzsKLQkgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJnZhbCwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0KLQkgIGZwcmludGZfZm4gKHN0cmVhbSwiIGRlZmF1bHQ6ICIpOwotCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwgKyBpbnNuX3N0YXJ0LCBpbmZvKTsKLQkgIGFkZHIgKz0gNDsKLQotCSAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmbG93dmFsLCBpbmZvKSkpCi0JICAgIGdvdG8gZmFpbDsKLQkgIGFkZHIgKz0gNDsKLQotCSAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmaGlnaHZhbCwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0JICBhZGRyICs9IDQ7Ci0KLQkgIHdoaWxlIChsb3d2YWwgPD0gaGlnaHZhbCkgewotCSAgICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZ2YWwsIGluZm8pKSkKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwiICVkOlsiLCBsb3d2YWwpOwotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCArIGluc25fc3RhcnQsIGluZm8pOwotCSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sIiBdIik7Ci0JICAgIGFkZHIgKz0gNDsKLQkgICAgbG93dmFsKys7Ci0JICB9Ci0JICByZXR1cm4gYWRkciAtIGluc25fc3RhcnQ7Ci0JfQotCi0gICAgICAvKiBUaGUgbG9va3Vwc3dpdGNoIGluc3RydWN0aW9uIGlzIGZvbGxvd2VkIGJ5IHRoZSBkZWZhdWx0Ci0JIGFkZHJlc3MsIGVsZW1lbnQgY291bnQgYW5kIHBhaXJzIG9mIHZhbHVlcyBhbmQKLQkgYWRkcmVzc2VzLiAqLwotCSAgICAKLSAgICAgIGlmIChzdHJjbXAgKG9wLT5uYW1lLCAibG9va3Vwc3dpdGNoIikgPT0gMCkKLQl7Ci0JICBpbnQgY291bnQ7Ci0JICBpbnQgdmFsOwotCi0JICBhZGRyID0gKGFkZHIgKyAzKSAmIH4zOwotCSAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmdmFsLCBpbmZvKSkpCi0JICAgIGdvdG8gZmFpbDsKLQkgIGFkZHIgKz0gNDsKLQotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCIgZGVmYXVsdDogIik7Ci0JICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCArIGluc25fc3RhcnQsIGluZm8pOwotCi0JICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZjb3VudCwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0JICBhZGRyICs9IDQ7Ci0KLQkgIHdoaWxlIChjb3VudC0tKSB7Ci0JICAgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJnZhbCwgaW5mbykpKQotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgYWRkciArPSA0OwotCSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sIiAlZDpbIiwgdmFsKTsKLQotCSAgICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZ2YWwsIGluZm8pKSkKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIGFkZHIgKz0gNDsKLQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCArIGluc25fc3RhcnQsIGluZm8pOwotCSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sIiBdIik7Ci0JICB9Ci0JICByZXR1cm4gYWRkciAtIGluc25fc3RhcnQ7Ci0JfQotICAgICAgZm9yIChhID0gMDsgb3AtPmFyZ1thXTsgYSsrKQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgZGF0YVs0XTsKLQkgIGludCB2YWwgPSAwOwotCSAgaW50IGk7Ci0JICBpbnQgc2l6ZSA9IEFTSVpFIChvcC0+YXJnW2FdKTsKLQotCSAgaWYgKChzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChhZGRyLCBkYXRhLCBzaXplLCBpbmZvKSkpCi0JICAgIGdvdG8gZmFpbDsKLQotCSAgdmFsID0gKFVOUyAob3AtPmFyZ1swXSkgfHwgKChkYXRhWzBdICYgMHg4MCkgPT0gMCkpID8gMCA6IC0xOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCSAgICB2YWwgPSAodmFsIDw8IDgpIHwgKGRhdGFbaV0gJiAweGZmKTsKLQotCSAgaWYgKFBDUkVMIChvcC0+YXJnW2FdKSkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwgKyBpbnNuX3N0YXJ0LCBpbmZvKTsKLQkgIGVsc2UKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiJXMlZCIsIHNlcCwgdmFsKTsKLQotCSAgc2VwID0gIiwiOwotCSAgYWRkciArPSBzaXplOwotCX0KLSAgICAgIHJldHVybiBvcC0+bGVuOwotICAgIH0KLQotIGZhaWw6Ci0gIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIGFkZHIsIGluZm8pOwotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3BqLW9wYy5jIGIvb3Bjb2Rlcy9wai1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3ZTM4ZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BqLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qIHBqLW9wYy5jIC0tIERlZmluaXRpb25zIGZvciBwaWNvSmF2YSBvcGNvZGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgVHJhbnNtZXRhIChzYWNAcG9ib3guY29tKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvcGouaCIKLQotY29uc3QgcGpfb3BjX2luZm9fdCBwal9vcGNfaW5mb1s1MTJdID0KLXsKLXsgMHgwMCwgICAtMSwgMSwge09fTiwgT19OfSwgIm5vcCJ9LAoteyAweDAxLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYWNvbnN0X251bGwifSwKLXsgMHgwMiwgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF9tMSJ9LAoteyAweDAzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0XzAifSwKLXsgMHgwNCwgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF8xIn0sCi17IDB4MDUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfMiJ9LAoteyAweDA2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0XzMifSwKLXsgMHgwNywgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF80In0sCi17IDB4MDgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfNSJ9LAoteyAweDA5LCAgIC0xLCAxLCB7T19OLCBPX059LCAibGNvbnN0XzAifSwKLXsgMHgwYSwgICAtMSwgMSwge09fTiwgT19OfSwgImxjb25zdF8xIn0sCi17IDB4MGIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmY29uc3RfMCJ9LAoteyAweDBjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmNvbnN0XzEifSwKLXsgMHgwZCwgICAtMSwgMSwge09fTiwgT19OfSwgImZjb25zdF8yIn0sCi17IDB4MGUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkY29uc3RfMCJ9LAoteyAweDBmLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGNvbnN0XzEifSwKLXsgMHgxMCwgICAtMSwgMiwge09fOCwgT19OfSwgImJpcHVzaCJ9LAoteyAweDExLCAgIC0xLCAzLCB7T18xNiwgT19OfSwgInNpcHVzaCJ9LAoteyAweDEyLCAgIC0xLCAyLCB7T19OLCBPX059LCAibGRjIn0sCi17IDB4MTMsICAgLTEsIDMsIHtPX04sIE9fTn0sICJsZGNfdyJ9LAoteyAweDE0LCAgIC0xLCAzLCB7T19OLCBPX059LCAibGRjMl93In0sCi17IDB4MTUsICAgLTEsIDIsIHtPX1U4LCBPX059LCAiaWxvYWQifSwKLXsgMHgxNiwgICAtMSwgMiwge09fVTgsIE9fTn0sICJsbG9hZCJ9LAoteyAweDE3LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImZsb2FkIn0sCi17IDB4MTgsICAgLTEsIDIsIHtPX1U4LCBPX059LCAiZGxvYWQifSwKLXsgMHgxOSwgICAtMSwgMiwge09fVTgsIE9fTn0sICJhbG9hZCJ9LAoteyAweDFhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWxvYWRfMCJ9LAoteyAweDFiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWxvYWRfMSJ9LAoteyAweDFjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWxvYWRfMiJ9LAoteyAweDFkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWxvYWRfMyJ9LAoteyAweDFlLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGxvYWRfMCJ9LAoteyAweDFmLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGxvYWRfMSJ9LAoteyAweDIwLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGxvYWRfMiJ9LAoteyAweDIxLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGxvYWRfMyJ9LAoteyAweDIyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmxvYWRfMCJ9LAoteyAweDIzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmxvYWRfMSJ9LAoteyAweDI0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmxvYWRfMiJ9LAoteyAweDI1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmxvYWRfMyJ9LAoteyAweDI2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGxvYWRfMCJ9LAoteyAweDI3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGxvYWRfMSJ9LAoteyAweDI4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGxvYWRfMiJ9LAoteyAweDI5LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGxvYWRfMyJ9LAoteyAweDJhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYWxvYWRfMCJ9LAoteyAweDJiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYWxvYWRfMSJ9LAoteyAweDJjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYWxvYWRfMiJ9LAoteyAweDJkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYWxvYWRfMyJ9LAoteyAweDJlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWFsb2FkIn0sCi17IDB4MmYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsYWxvYWQifSwKLXsgMHgzMCwgICAtMSwgMSwge09fTiwgT19OfSwgImZhbG9hZCJ9LAoteyAweDMxLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGFsb2FkIn0sCi17IDB4MzIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhYWxvYWQifSwKLXsgMHgzMywgICAtMSwgMSwge09fTiwgT19OfSwgImJhbG9hZCJ9LAoteyAweDM0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiY2Fsb2FkIn0sCi17IDB4MzUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJzYWxvYWQifSwKLXsgMHgzNiwgICAtMSwgMiwge09fVTgsIE9fTn0sICJpc3RvcmUifSwKLXsgMHgzNywgICAtMSwgMiwge09fVTgsIE9fTn0sICJsc3RvcmUifSwKLXsgMHgzOCwgICAtMSwgMiwge09fVTgsIE9fTn0sICJmc3RvcmUifSwKLXsgMHgzOSwgICAtMSwgMiwge09fVTgsIE9fTn0sICJkc3RvcmUifSwKLXsgMHgzYSwgICAtMSwgMiwge09fVTgsIE9fTn0sICJhc3RvcmUifSwKLXsgMHgzYiwgICAtMSwgMSwge09fTiwgT19OfSwgImlzdG9yZV8wIn0sCi17IDB4M2MsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpc3RvcmVfMSJ9LAoteyAweDNkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXN0b3JlXzIifSwKLXsgMHgzZSwgICAtMSwgMSwge09fTiwgT19OfSwgImlzdG9yZV8zIn0sCi17IDB4M2YsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsc3RvcmVfMCJ9LAoteyAweDQwLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHN0b3JlXzEifSwKLXsgMHg0MSwgICAtMSwgMSwge09fTiwgT19OfSwgImxzdG9yZV8yIn0sCi17IDB4NDIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsc3RvcmVfMyJ9LAoteyAweDQzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZnN0b3JlXzAifSwKLXsgMHg0NCwgICAtMSwgMSwge09fTiwgT19OfSwgImZzdG9yZV8xIn0sCi17IDB4NDUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmc3RvcmVfMiJ9LAoteyAweDQ2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZnN0b3JlXzMifSwKLXsgMHg0NywgICAtMSwgMSwge09fTiwgT19OfSwgImRzdG9yZV8wIn0sCi17IDB4NDgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkc3RvcmVfMSJ9LAoteyAweDQ5LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHN0b3JlXzIifSwKLXsgMHg0YSwgICAtMSwgMSwge09fTiwgT19OfSwgImRzdG9yZV8zIn0sCi17IDB4NGIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhc3RvcmVfMCJ9LAoteyAweDRjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXN0b3JlXzEifSwKLXsgMHg0ZCwgICAtMSwgMSwge09fTiwgT19OfSwgImFzdG9yZV8yIn0sCi17IDB4NGUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhc3RvcmVfMyJ9LAoteyAweDRmLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWFzdG9yZSJ9LAoteyAweDUwLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGFzdG9yZSJ9LAoteyAweDUxLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmFzdG9yZSJ9LAoteyAweDUyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGFzdG9yZSJ9LAoteyAweDUzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYWFzdG9yZSJ9LAoteyAweDU0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFzdG9yZSJ9LAoteyAweDU1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiY2FzdG9yZSJ9LAoteyAweDU2LCAgIC0xLCAxLCB7T19OLCBPX059LCAic2FzdG9yZSJ9LAoteyAweDU3LCAgIC0xLCAxLCB7T19OLCBPX059LCAicG9wIn0sCi17IDB4NTgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJwb3AyIn0sCi17IDB4NTksICAgLTEsIDEsIHtPX04sIE9fTn0sICJkdXAifSwKLXsgMHg1YSwgICAtMSwgMSwge09fTiwgT19OfSwgImR1cF94MSJ9LAoteyAweDViLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHVwX3gyIn0sCi17IDB4NWMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkdXAyIn0sCi17IDB4NWQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkdXAyX3gxIn0sCi17IDB4NWUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkdXAyX3gyIn0sCi17IDB4NWYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJzd2FwIn0sCi17IDB4NjAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpYWRkIn0sCi17IDB4NjEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsYWRkIn0sCi17IDB4NjIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmYWRkIn0sCi17IDB4NjMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkYWRkIn0sCi17IDB4NjQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpc3ViIn0sCi17IDB4NjUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsc3ViIn0sCi17IDB4NjYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmc3ViIn0sCi17IDB4NjcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkc3ViIn0sCi17IDB4NjgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbXVsIn0sCi17IDB4NjksICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbXVsIn0sCi17IDB4NmEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbXVsIn0sCi17IDB4NmIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbXVsIn0sCi17IDB4NmMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpZGl2In0sCi17IDB4NmQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsZGl2In0sCi17IDB4NmUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmZGl2In0sCi17IDB4NmYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkZGl2In0sCi17IDB4NzAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpcmVtIn0sCi17IDB4NzEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJscmVtIn0sCi17IDB4NzIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmcmVtIn0sCi17IDB4NzMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkcmVtIn0sCi17IDB4NzQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbmVnIn0sCi17IDB4NzUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbmVnIn0sCi17IDB4NzYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbmVnIn0sCi17IDB4NzcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbmVnIn0sCi17IDB4NzgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpc2hsIn0sCi17IDB4NzksICAgLTEsIDEsIHtPX04sIE9fTn0sICJsc2hsIn0sCi17IDB4N2EsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpc2hyIn0sCi17IDB4N2IsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsc2hyIn0sCi17IDB4N2MsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpdXNociJ9LAoteyAweDdkLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHVzaHIifSwKLXsgMHg3ZSwgICAtMSwgMSwge09fTiwgT19OfSwgImlhbmQifSwKLXsgMHg3ZiwgICAtMSwgMSwge09fTiwgT19OfSwgImxhbmQifSwKLXsgMHg4MCwgICAtMSwgMSwge09fTiwgT19OfSwgImlvciJ9LAoteyAweDgxLCAgIC0xLCAxLCB7T19OLCBPX059LCAibG9yIn0sCi17IDB4ODIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpeG9yIn0sCi17IDB4ODMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJseG9yIn0sCi17IDB4ODQsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAiaWluYyJ9LAoteyAweDg1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaTJsIn0sCi17IDB4ODYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpMmYifSwKLXsgMHg4NywgICAtMSwgMSwge09fTiwgT19OfSwgImkyZCJ9LAoteyAweDg4LCAgIC0xLCAxLCB7T19OLCBPX059LCAibDJpIn0sCi17IDB4ODksICAgLTEsIDEsIHtPX04sIE9fTn0sICJsMmYifSwKLXsgMHg4YSwgICAtMSwgMSwge09fTiwgT19OfSwgImwyZCJ9LAoteyAweDhiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZjJpIn0sCi17IDB4OGMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmMmwifSwKLXsgMHg4ZCwgICAtMSwgMSwge09fTiwgT19OfSwgImYyZCJ9LAoteyAweDhlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZDJpIn0sCi17IDB4OGYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkMmwifSwKLXsgMHg5MCwgICAtMSwgMSwge09fTiwgT19OfSwgImQyZiJ9LAoteyAweDkxLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaTJiIn0sCi17IDB4OTIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpMmMifSwKLXsgMHg5MywgICAtMSwgMSwge09fTiwgT19OfSwgImkycyJ9LAoteyAweDk0LCAgIC0xLCAxLCB7T19OLCBPX059LCAibGNtcCJ9LAoteyAweDk1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmNtcGwifSwKLXsgMHg5NiwgICAtMSwgMSwge09fTiwgT19OfSwgImZjbXBnIn0sCi17IDB4OTcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkY21wbCJ9LAoteyAweDk4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGNtcGcifSwKLXsgMHg5OSwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZlcSJ9LAoteyAweDlhLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZm5lIn0sCi17IDB4OWIsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmbHQifSwKLXsgMHg5YywgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZnZSJ9LAoteyAweDlkLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZmd0In0sCi17IDB4OWUsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmbGUifSwKLXsgMHg5ZiwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfaWNtcGVxIn0sCi17IDB4YTAsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2ljbXBuZSJ9LAoteyAweGExLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9pY21wbHQifSwKLXsgMHhhMiwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfaWNtcGdlIn0sCi17IDB4YTMsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2ljbXBndCJ9LAoteyAweGE0LCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9pY21wbGUifSwKLXsgMHhhNSwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfYWNtcGVxIn0sCi17IDB4YTYsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2FjbXBuZSJ9LAoteyAweGE3LCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJnb3RvIn0sCi17IDB4YTgsICAgLTEsIDMsIHtPX04sIE9fTn0sICJqc3IifSwKLXsgMHhhOSwgICAtMSwgMiwge09fTiwgT19OfSwgInJldCJ9LAoteyAweGFhLCAgIC0xLCAxLCB7T19OLCBPX059LCAidGFibGVzd2l0Y2gifSwKLXsgMHhhYiwgICAtMSwgMSwge09fTiwgT19OfSwgImxvb2t1cHN3aXRjaCJ9LAoteyAweGFjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXJldHVybiJ9LAoteyAweGFkLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHJldHVybiJ9LAoteyAweGFlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZnJldHVybiJ9LAoteyAweGFmLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHJldHVybiJ9LAoteyAweGIwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXJldHVybiJ9LAoteyAweGIxLCAgIC0xLCAxLCB7T19OLCBPX059LCAicmV0dXJuIn0sCi17IDB4YjIsICAgLTEsIDMsIHtPX04sIE9fTn0sICJnZXRzdGF0aWMifSwKLXsgMHhiMywgICAtMSwgMywge09fTiwgT19OfSwgInB1dHN0YXRpYyJ9LAoteyAweGI0LCAgIC0xLCAzLCB7T19OLCBPX059LCAiZ2V0ZmllbGQifSwKLXsgMHhiNSwgICAtMSwgMywge09fTiwgT19OfSwgInB1dGZpZWxkIn0sCi17IDB4YjYsICAgLTEsIDMsIHtPX04sIE9fTn0sICJpbnZva2V2aXJ0dWFsIn0sCi17IDB4YjcsICAgLTEsIDMsIHtPX04sIE9fTn0sICJpbnZva2VzcGVjaWFsIn0sCi17IDB4YjgsICAgLTEsIDMsIHtPX04sIE9fTn0sICJpbnZva2VzdGF0aWMifSwKLXsgMHhiOSwgICAtMSwgNSwge09fTiwgT19OfSwgImludm9rZWludGVyZmFjZSJ9LAoteyAweGJhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2JhIn0sCi17IDB4YmIsICAgLTEsIDMsIHtPX04sIE9fTn0sICJuZXcifSwKLXsgMHhiYywgICAtMSwgMiwge09fTiwgT19OfSwgIm5ld2FycmF5In0sCi17IDB4YmQsICAgLTEsIDMsIHtPX04sIE9fTn0sICJhbmV3YXJyYXkifSwKLXsgMHhiZSwgICAtMSwgMSwge09fTiwgT19OfSwgImFycmF5bGVuZ3RoIn0sCi17IDB4YmYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhdGhyb3cifSwKLXsgMHhjMCwgICAtMSwgMywge09fTiwgT19OfSwgImNoZWNrY2FzdCJ9LAoteyAweGMxLCAgIC0xLCAzLCB7T19OLCBPX059LCAiaW5zdGFuY2VvZiJ9LAoteyAweGMyLCAgIC0xLCAxLCB7T19OLCBPX059LCAibW9uaXRvcmVudGVyIn0sCi17IDB4YzMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJtb25pdG9yZXhpdCJ9LAoteyAweGM0LCAgIC0xLCAxLCB7T19OLCBPX059LCAid2lkZSJ9LAoteyAweGM1LCAgIC0xLCA0LCB7T19OLCBPX059LCAibXVsdGlhbmV3YXJyYXkifSwKLXsgMHhjNiwgICAtMSwgMywge09fTiwgT19OfSwgImlmbnVsbCJ9LAoteyAweGM3LCAgIC0xLCAzLCB7T19OLCBPX059LCAiaWZub25udWxsIn0sCi17IDB4YzgsICAgLTEsIDUsIHtPX04sIE9fTn0sICJnb3RvX3cifSwKLXsgMHhjOSwgICAtMSwgNSwge09fTiwgT19OfSwgImpzcl93In0sCi17IDB4Y2EsICAgLTEsIDEsIHtPX04sIE9fTn0sICJicmVha3BvaW50In0sCi17IDB4Y2IsICAgLTEsIDEsIHtPX04sIE9fTn0sICJieXRlY29kZSJ9LAoteyAweGNjLCAgIC0xLCAxLCB7T19OLCBPX059LCAidHJ5In0sCi17IDB4Y2QsICAgLTEsIDEsIHtPX04sIE9fTn0sICJlbmR0cnkifSwKLXsgMHhjZSwgICAtMSwgMSwge09fTiwgT19OfSwgImNhdGNoIn0sCi17IDB4Y2YsICAgLTEsIDEsIHtPX04sIE9fTn0sICJ2YXIifSwKLXsgMHhkMCwgICAtMSwgMSwge09fTiwgT19OfSwgImVuZHZhciJ9LAoteyAweGQxLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2QxIn0sCi17IDB4ZDIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDIifSwKLXsgMHhkMywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kMyJ9LAoteyAweGQ0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Q0In0sCi17IDB4ZDUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDUifSwKLXsgMHhkNiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kNiJ9LAoteyAweGQ3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Q3In0sCi17IDB4ZDgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDgifSwKLXsgMHhkOSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kOSJ9LAoteyAweGRhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2RhIn0sCi17IDB4ZGIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZGIifSwKLXsgMHhkYywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kYyJ9LAoteyAweGRkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2RkIn0sCi17IDB4ZGUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZGUifSwKLXsgMHhkZiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kZiJ9LAoteyAweGUwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2UwIn0sCi17IDB4ZTEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTEifSwKLXsgMHhlMiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lMiJ9LAoteyAweGUzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2UzIn0sCi17IDB4ZTQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTQifSwKLXsgMHhlNSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lNSJ9LAoteyAweGU2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2U2In0sCi17IDB4ZTcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTcifSwKLXsgMHhlOCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lOCJ9LAoteyAweGU5LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2U5In0sCi17IDB4ZWEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZWEifSwKLXsgMHhlYiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lYiJ9LAoteyAweGVjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2VjIn0sCi17IDB4ZWQsICAgLTEsIDMsIHtPXzE2LCBPX059LCAic2V0aGkifSwKLXsgMHhlZSwgICAtMSwgMywge09fVTgsIE9fOH0sICJsb2FkX3dvcmRfaW5kZXgifSwKLXsgMHhlZiwgICAtMSwgMywge09fVTgsIE9fOH0sICJsb2FkX3Nob3J0X2luZGV4In0sCi17IDB4ZjAsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAibG9hZF9jaGFyX2luZGV4In0sCi17IDB4ZjEsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAibG9hZF9ieXRlX2luZGV4In0sCi17IDB4ZjIsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAibG9hZF91Ynl0ZV9pbmRleCJ9LAoteyAweGYzLCAgIC0xLCAzLCB7T19VOCwgT184fSwgInN0b3JlX3dvcmRfaW5kZXgifSwKLXsgMHhmNCwgICAtMSwgMywge09fVTgsIE9fOH0sICJuYV9zdG9yZV93b3JkX2luZGV4In0sCi17IDB4ZjUsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAic3RvcmVfc2hvcnRfaW5kZXgifSwKLXsgMHhmNiwgICAtMSwgMywge09fVTgsIE9fOH0sICJzdG9yZV9ieXRlX2luZGV4In0sCi17IDB4ZjcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZjcifSwKLXsgMHhmOCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mOCJ9LAoteyAweGY5LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Y5In0sCi17IDB4ZmEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZmEifSwKLXsgMHhmYiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mYiJ9LAoteyAweGZjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ZjIn0sCi17IDB4ZmQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZmQifSwKLXsgMHhmZSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mZSJ9LAoteyAweGZmLCAweDAwLCAyLCB7T19OLCBPX059LCAibG9hZF91Ynl0ZSJ9LAoteyAweGZmLCAweDAxLCAyLCB7T19OLCBPX059LCAibG9hZF9ieXRlIn0sCi17IDB4ZmYsIDB4MDIsIDIsIHtPX04sIE9fTn0sICJsb2FkX2NoYXIifSwKLXsgMHhmZiwgMHgwMywgMiwge09fTiwgT19OfSwgImxvYWRfc2hvcnQifSwKLXsgMHhmZiwgMHgwNCwgMiwge09fTiwgT19OfSwgImxvYWRfd29yZCJ9LAoteyAweGZmLCAweDA1LCAyLCB7T19OLCBPX059LCAicHJpdl9yZXRfZnJvbV90cmFwIn0sCi17IDB4ZmYsIDB4MDYsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfZGNhY2hlX3RhZyJ9LAoteyAweGZmLCAweDA3LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2RjYWNoZV9kYXRhIn0sCi17IDB4ZmYsIDB4MDgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgwOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDBhLCAyLCB7T19OLCBPX059LCAibG9hZF9jaGFyX29lIn0sCi17IDB4ZmYsIDB4MGIsIDIsIHtPX04sIE9fTn0sICJsb2FkX3Nob3J0X29lIn0sCi17IDB4ZmYsIDB4MGMsIDIsIHtPX04sIE9fTn0sICJsb2FkX3dvcmRfb2UifSwKLXsgMHhmZiwgMHgwZCwgMiwge09fTiwgT19OfSwgInJldHVybjAifSwKLXsgMHhmZiwgMHgwZSwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9pY2FjaGVfdGFnIn0sCi17IDB4ZmYsIDB4MGYsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfaWNhY2hlX2RhdGEifSwKLXsgMHhmZiwgMHgxMCwgMiwge09fTiwgT19OfSwgIm5jbG9hZF91Ynl0ZSJ9LAoteyAweGZmLCAweDExLCAyLCB7T19OLCBPX059LCAibmNsb2FkX2J5dGUifSwKLXsgMHhmZiwgMHgxMiwgMiwge09fTiwgT19OfSwgIm5jbG9hZF9jaGFyIn0sCi17IDB4ZmYsIDB4MTMsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfc2hvcnQifSwKLXsgMHhmZiwgMHgxNCwgMiwge09fTiwgT19OfSwgIm5jbG9hZF93b3JkIn0sCi17IDB4ZmYsIDB4MTUsIDIsIHtPX04sIE9fTn0sICJpdWNtcCJ9LAoteyAweGZmLCAweDE2LCAyLCB7T19OLCBPX059LCAicHJpdl9wb3dlcmRvd24ifSwKLXsgMHhmZiwgMHgxNywgMiwge09fTiwgT19OfSwgImNhY2hlX2ludmFsaWRhdGUifSwKLXsgMHhmZiwgMHgxOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDE5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MWEsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfY2hhcl9vZSJ9LAoteyAweGZmLCAweDFiLCAyLCB7T19OLCBPX059LCAibmNsb2FkX3Nob3J0X29lIn0sCi17IDB4ZmYsIDB4MWMsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfd29yZF9vZSJ9LAoteyAweGZmLCAweDFkLCAyLCB7T19OLCBPX059LCAicmV0dXJuMSJ9LAoteyAweGZmLCAweDFlLCAyLCB7T19OLCBPX059LCAiY2FjaGVfZmx1c2gifSwKLXsgMHhmZiwgMHgxZiwgMiwge09fTiwgT19OfSwgImNhY2hlX2luZGV4X2ZsdXNoIn0sCi17IDB4ZmYsIDB4MjAsIDIsIHtPX04sIE9fTn0sICJzdG9yZV9ieXRlIn0sCi17IDB4ZmYsIDB4MjEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgyMiwgMiwge09fTiwgT19OfSwgInN0b3JlX3Nob3J0In0sCi17IDB4ZmYsIDB4MjMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgyNCwgMiwge09fTiwgT19OfSwgInN0b3JlX3dvcmQifSwKLXsgMHhmZiwgMHgyNSwgMiwge09fTiwgT19OfSwgInNvZnRfdHJhcCJ9LAoteyAweGZmLCAweDI2LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9kY2FjaGVfdGFnIn0sCi17IDB4ZmYsIDB4MjcsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2RjYWNoZV9kYXRhIn0sCi17IDB4ZmYsIDB4MjgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgyOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDJhLCAyLCB7T19OLCBPX059LCAic3RvcmVfc2hvcnRfb2UifSwKLXsgMHhmZiwgMHgyYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDJjLCAyLCB7T19OLCBPX059LCAic3RvcmVfd29yZF9vZSJ9LAoteyAweGZmLCAweDJkLCAyLCB7T19OLCBPX059LCAicmV0dXJuMiJ9LAoteyAweGZmLCAweDJlLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9pY2FjaGVfdGFnIn0sCi17IDB4ZmYsIDB4MmYsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2ljYWNoZV9kYXRhIn0sCi17IDB4ZmYsIDB4MzAsIDIsIHtPX04sIE9fTn0sICJuY3N0b3JlX2J5dGUifSwKLXsgMHhmZiwgMHgzMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDMyLCAyLCB7T19OLCBPX059LCAibmNzdG9yZV9zaG9ydCJ9LAoteyAweGZmLCAweDMzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MzQsIDIsIHtPX04sIE9fTn0sICJuY3N0b3JlX3dvcmQifSwKLXsgMHhmZiwgMHgzNSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDM2LCAyLCB7T19OLCBPX059LCAicHJpdl9yZXNldCJ9LAoteyAweGZmLCAweDM3LCAyLCB7T19OLCBPX059LCAiZ2V0X2N1cnJlbnRfY2xhc3MifSwKLXsgMHhmZiwgMHgzOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDM5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4M2EsIDIsIHtPX04sIE9fTn0sICJuY3N0b3JlX3Nob3J0X29lIn0sCi17IDB4ZmYsIDB4M2IsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgzYywgMiwge09fTiwgT19OfSwgIm5jc3RvcmVfd29yZF9vZSJ9LAoteyAweGZmLCAweDNkLCAyLCB7T19OLCBPX059LCAiY2FsbCJ9LAoteyAweGZmLCAweDNlLCAyLCB7T19OLCBPX059LCAiemVyb19saW5lIn0sCi17IDB4ZmYsIDB4M2YsIDIsIHtPX04sIE9fTn0sICJwcml2X3VwZGF0ZV9vcHRvcCJ9LAoteyAweGZmLCAweDQwLCAyLCB7T19OLCBPX059LCAicmVhZF9wYyJ9LAoteyAweGZmLCAweDQxLCAyLCB7T19OLCBPX059LCAicmVhZF92YXJzIn0sCi17IDB4ZmYsIDB4NDIsIDIsIHtPX04sIE9fTn0sICJyZWFkX2ZyYW1lIn0sCi17IDB4ZmYsIDB4NDMsIDIsIHtPX04sIE9fTn0sICJyZWFkX29wdG9wIn0sCi17IDB4ZmYsIDB4NDQsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfb3BsaW0ifSwKLXsgMHhmZiwgMHg0NSwgMiwge09fTiwgT19OfSwgInJlYWRfY29uc3RfcG9vbCJ9LAoteyAweGZmLCAweDQ2LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX3BzciJ9LAoteyAweGZmLCAweDQ3LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX3RyYXBiYXNlIn0sCi17IDB4ZmYsIDB4NDgsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfbG9ja2NvdW50MCJ9LAoteyAweGZmLCAweDQ5LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2xvY2tjb3VudDEifSwKLXsgMHhmZiwgMHg0YSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDRiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NGMsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfbG9ja2FkZHIwIn0sCi17IDB4ZmYsIDB4NGQsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfbG9ja2FkZHIxIn0sCi17IDB4ZmYsIDB4NGUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg0ZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDUwLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX3VzZXJyYW5nZTEifSwKLXsgMHhmZiwgMHg1MSwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9nY19jb25maWcifSwKLXsgMHhmZiwgMHg1MiwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9icmsxYSJ9LAoteyAweGZmLCAweDUzLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2JyazJhIn0sCi17IDB4ZmYsIDB4NTQsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfYnJrMTJjIn0sCi17IDB4ZmYsIDB4NTUsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfdXNlcnJhbmdlMiJ9LAoteyAweGZmLCAweDU2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NTcsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfdmVyc2lvbmlkIn0sCi17IDB4ZmYsIDB4NTgsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfaGNyIn0sCi17IDB4ZmYsIDB4NTksIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfc2NfYm90dG9tIn0sCi17IDB4ZmYsIDB4NWEsIDIsIHtPX04sIE9fTn0sICJyZWFkX2dsb2JhbDAifSwKLXsgMHhmZiwgMHg1YiwgMiwge09fTiwgT19OfSwgInJlYWRfZ2xvYmFsMSJ9LAoteyAweGZmLCAweDVjLCAyLCB7T19OLCBPX059LCAicmVhZF9nbG9iYWwyIn0sCi17IDB4ZmYsIDB4NWQsIDIsIHtPX04sIE9fTn0sICJyZWFkX2dsb2JhbDMifSwKLXsgMHhmZiwgMHg1ZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDVmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NjAsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9wYyJ9LAoteyAweGZmLCAweDYxLCAyLCB7T19OLCBPX059LCAid3JpdGVfdmFycyJ9LAoteyAweGZmLCAweDYyLCAyLCB7T19OLCBPX059LCAid3JpdGVfZnJhbWUifSwKLXsgMHhmZiwgMHg2MywgMiwge09fTiwgT19OfSwgIndyaXRlX29wdG9wIn0sCi17IDB4ZmYsIDB4NjQsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX29wbGltIn0sCi17IDB4ZmYsIDB4NjUsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9jb25zdF9wb29sIn0sCi17IDB4ZmYsIDB4NjYsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX3BzciJ9LAoteyAweGZmLCAweDY3LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV90cmFwYmFzZSJ9LAoteyAweGZmLCAweDY4LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9sb2NrY291bnQwIn0sCi17IDB4ZmYsIDB4NjksIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2xvY2tjb3VudDEifSwKLXsgMHhmZiwgMHg2YSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDZiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NmMsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2xvY2thZGRyMCJ9LAoteyAweGZmLCAweDZkLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9sb2NrYWRkcjEifSwKLXsgMHhmZiwgMHg2ZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDZmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NzAsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX3VzZXJyYW5nZTEifSwKLXsgMHhmZiwgMHg3MSwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfZ2NfY29uZmlnIn0sCi17IDB4ZmYsIDB4NzIsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2JyazFhIn0sCi17IDB4ZmYsIDB4NzMsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2JyazJhIn0sCi17IDB4ZmYsIDB4NzQsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2JyazEyYyJ9LAoteyAweGZmLCAweDc1LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV91c2VycmFuZ2UyIn0sCi17IDB4ZmYsIDB4NzYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg3NywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDc4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NzksIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX3NjX2JvdHRvbSJ9LAoteyAweGZmLCAweDdhLCAyLCB7T19OLCBPX059LCAid3JpdGVfZ2xvYmFsMCJ9LAoteyAweGZmLCAweDdiLCAyLCB7T19OLCBPX059LCAid3JpdGVfZ2xvYmFsMSJ9LAoteyAweGZmLCAweDdjLCAyLCB7T19OLCBPX059LCAid3JpdGVfZ2xvYmFsMiJ9LAoteyAweGZmLCAweDdkLCAyLCB7T19OLCBPX059LCAid3JpdGVfZ2xvYmFsMyJ9LAoteyAweGZmLCAweDdlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4N2YsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4MCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDgxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4MywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDg0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4NiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDg3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4OSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDhhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OGIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4YywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDhkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OGUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4ZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDkwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5MiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDkzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5NSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDk2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5OCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDk5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OWEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5YiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDljLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OWQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5ZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDlmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGEyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhNCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGE1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhNywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGE4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhYSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGFiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YWMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGFlLCAyLCB7T19OLCBPX059LCAidG1fcHV0Y2hhciJ9LAoteyAweGZmLCAweGFmLCAyLCB7T19OLCBPX059LCAidG1fZXhpdCJ9LAoteyAweGZmLCAweGIwLCAyLCB7T19OLCBPX059LCAidG1fdHJhcCJ9LAoteyAweGZmLCAweGIxLCAyLCB7T19OLCBPX059LCAidG1fbWluZm8ifSwKLXsgMHhmZiwgMHhiMiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGIzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiNSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGI2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGI5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YmEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGJjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YmQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGJmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGMyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjNCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGM1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjNywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGM4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjYSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGNiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4Y2MsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGNlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4Y2YsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkMCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQ0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQ3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGRhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZGIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGRkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZGUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGUwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlMiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGUzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlNSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGU2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGU5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZWEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGVjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZWQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGVmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGYyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmNCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGY1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmNywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGY4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmYSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGZiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZmMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGZlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZmYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLX07CmRpZmYgLS1naXQgYS9vcGNvZGVzL3BvL01ha2UtaW4gYi9vcGNvZGVzL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vUE9URklMRVMuaW4gYi9vcGNvZGVzL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDNhNjVlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1hMjlrLWRpcy5jCi1hbHBoYS1kaXMuYwotYWxwaGEtb3BjLmMKLWFyYy1kaXMuYwotYXJjLW9wYy5jCi1hcm0tZGlzLmMKLWFybS1vcGMuaAotY2dlbi1hc20uYwotY2dlbi1kaXMuYwotY2dlbi1vcGMuYwotZDEwdi1kaXMuYwotZDEwdi1vcGMuYwotZDMwdi1kaXMuYwotZDMwdi1vcGMuYwotZGlzLWJ1Zi5jCi1kaXNhc3NlbWJsZS5jCi1mcjMwLWFzbS5jCi1mcjMwLWRlc2MuYwotZnIzMC1kZXNjLmgKLWZyMzAtZGlzLmMKLWZyMzAtaWJsZC5jCi1mcjMwLW9wYy5jCi1mcjMwLW9wYy5oCi1oODMwMC1kaXMuYwotaDg1MDAtZGlzLmMKLWg4NTAwLW9wYy5oCi1ocHBhLWRpcy5jCi1pMzg2LWRpcy5jCi1pOTYwLWRpcy5jCi1tMTAyMDAtZGlzLmMKLW0xMDIwMC1vcGMuYwotbTEwMzAwLWRpcy5jCi1tMTAzMDAtb3BjLmMKLW0zMnItYXNtLmMKLW0zMnItZGVzYy5jCi1tMzJyLWRlc2MuaAotbTMyci1kaXMuYwotbTMyci1pYmxkLmMKLW0zMnItb3BjLmMKLW0zMnItb3BjLmgKLW0zMnItb3BpbnN0LmMKLW02OGstZGlzLmMKLW02OGstb3BjLmMKLW04OGstZGlzLmMKLW1jb3JlLWRpcy5jCi1tY29yZS1vcGMuaAotbWlwcy1kaXMuYwotbWlwcy1vcGMuYwotbWlwczE2LW9wYy5jCi1uczMyay1kaXMuYwotcHBjLWRpcy5jCi1wcGMtb3BjLmMKLXNoLWRpcy5jCi1zaC1vcGMuaAotc3BhcmMtZGlzLmMKLXNwYXJjLW9wYy5jCi1zeXNkZXAuaAotdGljMzAtZGlzLmMKLXRpYzgwLWRpcy5jCi10aWM4MC1vcGMuYwotdjg1MC1kaXMuYwotdjg1MC1vcGMuYwotdmF4LWRpcy5jCi13NjUtZGlzLmMKLXc2NS1vcGMuaAotejhrLWRpcy5jCi16OGstb3BjLmgKLXo4a2dlbi5jCmRpZmYgLS1naXQgYS9vcGNvZGVzL3BvL29wY29kZXMucG90IGIvb3Bjb2Rlcy9wby9vcGNvZGVzLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwMWJkZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BvL29wY29kZXMucG90CisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA3LTExIDIyOjA1LTA0MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhbHBoYS1vcGMuYzozMzUKLW1zZ2lkICJicmFuY2ggb3BlcmFuZCB1bmFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogYWxwaGEtb3BjLmM6MzU4IGFscGhhLW9wYy5jOjM4MAotbXNnaWQgImp1bXAgaGludCB1bmFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogYXJjLWRpcy5jOjIzMQotbXNnaWQgIip1bmtub3duKiIKLW1zZ3N0ciAiIgotCi0jOiBhcmMtb3BjLmM6NjI5Ci1tc2dpZCAidW5hYmxlIHRvIGZpdCBkaWZmZXJlbnQgdmFsdWVkIGNvbnN0YW50cyBpbnRvIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGFyYy1vcGMuYzo2MzkKLW1zZ2lkICJhdXhpbGlhcnkgcmVnaXN0ZXIgbm90IGFsbG93ZWQgaGVyZSIKLW1zZ3N0ciAiIgotCi0jOiBhcmMtb3BjLmM6NjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbnVtYmVyIGAlZCciCi1tc2dzdHIgIiIKLQotIzogYXJjLW9wYy5jOjc3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ2YWx1ZSB3b24ndCBmaXQgaW4gcmFuZ2UgJWxkIC0gJWxkIgotbXNnc3RyICIiCi0KLSM6IGFyYy1vcGMuYzo4NzEKLW1zZ2lkICJicmFuY2ggYWRkcmVzcyBub3Qgb24gNCBieXRlIGJvdW5kYXJ5IgotbXNnc3RyICIiCi0KLSM6IGFybS1kaXMuYzo0MDcKLW1zZ2lkICI8aWxsZWdhbCBwcmVjaXNpb24+IgotbXNnc3RyICIiCi0KLSM6IGNnZW4tYXNtLmM6MjI0Ci1tc2dpZCAidW5yZWNvZ25pemVkIGtleXdvcmQvcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjMzMiBmcjMwLWlibGQuYzoyMjMgbTMyci1pYmxkLmM6MjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIgotbXNnc3RyICIiCi0KLSM6IGNnZW4tYXNtLmM6MzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gJWx1IGFuZCAlbHUpIgotbXNnc3RyICIiCi0KLSM6IGQzMHYtZGlzLmM6MzA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duIHJlZ2lzdGVyICVkPiIKLW1zZ3N0ciAiIgotCi0jLiBDYW4ndCBoYXBwZW4uCi0jOiBkaXMtYnVmLmM6NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBlcnJvciAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGRpcy1idWYuYzo1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJBZGRyZXNzIDB4JXggaXMgb3V0IG9mIGJvdW5kcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjMwMyBtMzJyLWFzbS5jOjI5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcGFyc2luZy5cbiIKLW1zZ3N0ciAiIgotCi0jLiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4KLSM6IGZyMzAtYXNtLmM6MzY3IGZyMzAtYXNtLmM6NDM2IG0zMnItYXNtLmM6MzYzIG0zMnItYXNtLmM6NDMyCi1tc2dpZCAidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSMuIFN5bnRheCBjaGFyIGRpZG4ndCBtYXRjaC4gIENhbid0IGJlIHRoaXMgaW5zbi4KLSMuIEZJWE1FOiB3b3VsZCBsaWtlIHRvIHJldHVybiBzb21ldGhpbmcgbGlrZQotIy4gImV4cGVjdGVkIGNoYXIgYGMnIgotIzogZnIzMC1hc20uYzo0MDQgbTMyci1hc20uYzo0MDAKLW1zZ2lkICJzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzo0MzAgbTMyci1hc20uYzo0MjYKLW1zZ2lkICJqdW5rIGF0IGVuZCBvZiBsaW5lIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtYXNtLmM6NTIzIG0zMnItYXNtLmM6NTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbnN0cnVjdGlvbiBgJS41MHMuLi4nIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtYXNtLmM6NTI2IG0zMnItYXNtLmM6NTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbnN0cnVjdGlvbiBgJS41MHMnIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtZGlzLmM6MzAwIG0zMnItZGlzLmM6MjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwcmludGluZyBpbnNuLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjIxMCBtMzJyLWlibGQuYzoyMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAwIGFuZCAlbHUpIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjc0OSBtMzJyLWlibGQuYzo2NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGJ1aWxkaW5nIGluc24uXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6OTUyIG0zMnItaWJsZC5jOjc3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZGVjb2RpbmcgaW5zbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxMDk2IG0zMnItaWJsZC5jOjg2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyBpbnQgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxMjI1IG0zMnItaWJsZC5jOjk0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyB2bWEgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxMzU4IG0zMnItaWJsZC5jOjEwMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgaW50IG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTQ4NCBtMzJyLWlibGQuYzoxMDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGg4MzAwLWRpcy5jOjQwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJIbW1tbSAleCIKLW1zZ3N0ciAiIgotCi0jOiBoODMwMC1kaXMuYzo0MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRG9uJ3QgdW5kZXJzdGFuZCAleCBcbiIKLW1zZ3N0ciAiIgotCi0jOiBoODUwMC1kaXMuYzoxMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgY29wZSB3aXRoIGluc2VydCAlZFxuIgotbXNnc3RyICIiCi0KLSMuIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcKLSM6IGg4NTAwLWRpcy5jOjM0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlMDJ4XHRcdCp1bmtub3duKiIKLW1zZ3N0ciAiIgotCi0jOiBtMTAyMDAtZGlzLmM6MTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd25cdDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiBtMTAyMDAtZGlzLmM6MzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd25cdDB4JTA0bHgiCi1tc2dzdHIgIiIKLQotIzogbTEwMzAwLWRpcy5jOjU0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duXHQweCUwNHgiCi1tc2dzdHIgIiIKLQotIzogbTY4ay1kaXMuYzo0MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPGludGVybmFsIGVycm9yIGluIG9wY29kZSB0YWJsZTogJXMgJXM+XG4iCi1tc2dzdHIgIiIKLQotIzogbTY4ay1kaXMuYzo5ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPGZ1bmN0aW9uIGNvZGUgJWQ+IgotbXNnc3RyICIiCi0KLSM6IG04OGstZGlzLmM6MjczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiMgPGRpcyBlcnJvcjogJTA4eD4iCi1tc2dzdHIgIiIKLQotIzogbWlwcy1kaXMuYzoyMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIyBpbnRlcm5hbCBlcnJvciwgdW5kZWZpbmVkIG1vZGlmaWVyKCVjKSIKLW1zZ3N0ciAiIgotCi0jLiBJIGFuZCBaIGFyZSBvdXRwdXQgb3BlcmFuZHMgYW5kIGNhbmB0IGJlIGltbWVkaWF0ZQotIy4gKiBBIGlzIGFuIGFkZHJlc3MgYW5kIHdlIGNhbmB0IGhhdmUgdGhlIGFkZHJlc3Mgb2YKLSMuICogYW4gaW1tZWRpYXRlIGVpdGhlci4gV2UgZG9uJ3Qga25vdyBob3cgbXVjaCB0byBpbmNyZWFzZQotIy4gKiBhb2Zmc2V0cCBieSBzaW5jZSB3aGF0ZXZlciBnZW5lcmF0ZWQgdGhpcyBpcyBicm9rZW4KLSMuICogYW55d2F5IQotIy4KLSM6IG5zMzJrLWRpcy5jOjYxOAotbXNnaWQgIiQ8dW5kZWZpbmVkPiIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6NTg2IHBwYy1vcGMuYzo2MTcKLW1zZ2lkICJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6NjE5Ci1tc2dpZCAiYXR0ZW1wdCB0byBzZXQgeSBiaXQgd2hlbiB1c2luZyArIG9yIC0gbW9kaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjY3NAotbXNnaWQgImlnbm9yaW5nIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgaW4gYnJhbmNoIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6NzA5IHBwYy1vcGMuYzo3NDYKLW1zZ2lkICJpbGxlZ2FsIGJpdG1hc2siCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjgxNQotbXNnaWQgInZhbHVlIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6ODg5Ci1tc2dpZCAiaW5kZXggcmVnaXN0ZXIgaW4gbG9hZCByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6OTA0Ci1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciCi1tc2dzdHIgIiIKLQotIy4gTWFyayBhcyBub24tdmFsaWQgaW5zdHJ1Y3Rpb24KLSM6IHNwYXJjLWRpcy5jOjc0NAotbXNnaWQgInVua25vd24iCi1tc2dzdHIgIiIKLQotIzogc3BhcmMtZGlzLmM6ODE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiAgYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iCi1tc2dzdHIgIiIKLQotIzogc3BhcmMtZGlzLmM6ODI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiID09IFwiJXNcIlxuIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtZGlzLmM6MjIxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLWRpcy5jOjIzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHBvcCByZWc6ICVkXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluc2VydCBhbmQgZXh0cmFjdCBjb21wbGljYXRlZCBvcGVyYW5kcy4KLSMuIE5vdGU6IFRoZXJlIGlzIGEgY29uc3BpcmFjeSBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucyBhbmQKLSMuIHY4NTBfaW5zZXJ0X29wZXJhbmQoKSBpbiBnYXMvY29uZmlnL3RjLXY4NTAuYy4gIEVycm9yIG1lc3NhZ2VzCi0jLiBjb250YWluaW5nIHRoZSBzdHJpbmcgJ291dCBvZiByYW5nZScgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyBhCi0jLiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGdpdmVuIHRvIEdBUy4KLSM6IHY4NTAtb3BjLmM6NDYKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGluIHJhbmdlIGFuZCBpcyBub3QgYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjQ3Ci1tc2dpZCAiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjQ4Ci1tc2dpZCAiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG5vdCBhbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NTAKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NjEKLW1zZ2lkICJicmFuY2ggdmFsdWUgbm90IGluIHJhbmdlIGFuZCB0byBvZGQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NjMgdjg1MC1vcGMuYzo5NQotbXNnaWQgImJyYW5jaCB2YWx1ZSBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo2NiB2ODUwLW9wYy5jOjk4Ci1tc2dpZCAiYnJhbmNoIHRvIG9kZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo5MwotbXNnaWQgImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIGFuIG9kZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzozMjEKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIGZvciBzdGFjayBhZGp1c3RtZW50IgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6MzQzCi1tc2dpZCAiaW1tZWRpYXRlIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgbm90IGV2ZW4iCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzozNDgKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBldmVuIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9vcGNvZGVzL3BwYy1kaXMuYyBiL29wY29kZXMvcHBjLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDcxNmVhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcHBjLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qIHBwYy1kaXMuYyAtLSBEaXNhc3NlbWJsZSBQb3dlclBDIGluc3RydWN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9wcGMuaCIKLQotLyogVGhpcyBmaWxlIHByb3ZpZGVzIHNldmVyYWwgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucywgYWxsIG9mIHdoaWNoIHVzZQotICAgdGhlIGRpc2Fzc2VtYmxlciBpbnRlcmZhY2UgZGVmaW5lZCBpbiBkaXMtYXNtLmguICBTZXZlcmFsIGZ1bmN0aW9ucwotICAgYXJlIHByb3ZpZGVkIGJlY2F1c2UgdGhpcyBmaWxlIGhhbmRsZXMgZGlzYXNzZW1ibHkgZm9yIHRoZSBQb3dlclBDCi0gICBpbiBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBtb2RlIGFuZCBhbHNvIGZvciB0aGUgUE9XRVIgKFJTLzYwMDApCi0gICBjaGlwLiAgKi8KLQotc3RhdGljIGludCBwcmludF9pbnNuX3Bvd2VycGMgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgICAgICAgaW50IGJpZ2VuZGlhbiwgaW50IGRpYWxlY3QpKTsKLQotLyogUHJpbnQgYSBiaWcgZW5kaWFuIFBvd2VyUEMgaW5zdHJ1Y3Rpb24uICBGb3IgY29udmVuaWVuY2UsIGFsc28KLSAgIGRpc2Fzc2VtYmxlIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIE1vdG9yb2xhIFBvd2VyUEMgNjAxLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2JpZ19wb3dlcnBjIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbl9wb3dlcnBjIChtZW1hZGRyLCBpbmZvLCAxLAotCQkJICAgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxKTsKLX0KLQotLyogUHJpbnQgYSBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgaW5zdHJ1Y3Rpb24uICBGb3IgY29udmVuaWVuY2UsIGFsc28KLSAgIGRpc2Fzc2VtYmxlIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIE1vdG9yb2xhIFBvd2VyUEMgNjAxLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbl9wb3dlcnBjIChtZW1hZGRyLCBpbmZvLCAwLAotCQkJICAgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxKTsKLX0KLQotLyogUHJpbnQgYSBQT1dFUiAoUlMvNjAwMCkgaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLXByaW50X2luc25fcnM2MDAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbl9wb3dlcnBjIChtZW1hZGRyLCBpbmZvLCAxLCBQUENfT1BDT0RFX1BPV0VSKTsKLX0KLQotLyogUHJpbnQgYSBQb3dlclBDIG9yIFBPV0VSIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9wb3dlcnBjIChtZW1hZGRyLCBpbmZvLCBiaWdlbmRpYW4sIGRpYWxlY3QpCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBiaWdlbmRpYW47Ci0gICAgIGludCBkaWFsZWN0OwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3Bjb2RlX2VuZDsKLSAgdW5zaWduZWQgbG9uZyBvcDsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChiaWdlbmRpYW4pCi0gICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gIGVsc2UKLSAgICBpbnNuID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotICAvKiBHZXQgdGhlIG1ham9yIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBvcCA9IFBQQ19PUCAoaW5zbik7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIG9wY29kZSB0YWJsZS4gIFdlIGNvdWxkIHNwZWVkIHRoaXMgdXAKLSAgICAgYSBiaXQgYnkgZG9pbmcgYSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBtYWpvciBvcGNvZGUuICAqLwotICBvcGNvZGVfZW5kID0gcG93ZXJwY19vcGNvZGVzICsgcG93ZXJwY19udW1fb3Bjb2RlczsKLSAgZm9yIChvcGNvZGUgPSBwb3dlcnBjX29wY29kZXM7IG9wY29kZSA8IG9wY29kZV9lbmQ7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGFibGVfb3A7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGludCBpbnZhbGlkOwotICAgICAgaW50IG5lZWRfY29tbWE7Ci0gICAgICBpbnQgbmVlZF9wYXJlbjsKLQotICAgICAgdGFibGVfb3AgPSBQUENfT1AgKG9wY29kZS0+b3Bjb2RlKTsKLSAgICAgIGlmIChvcCA8IHRhYmxlX29wKQotCWJyZWFrOwotICAgICAgaWYgKG9wID4gdGFibGVfb3ApCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoaW5zbiAmIG9wY29kZS0+bWFzaykgIT0gb3Bjb2RlLT5vcGNvZGUKLQkgIHx8IChvcGNvZGUtPmZsYWdzICYgZGlhbGVjdCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIG9wZXJhbmRzLiAgRmlyc3Qgc2VlIGlmIGFueSBvZiB0aGVtCi0JIGhhdmUgZXh0cmFjdGlvbiBmdW5jdGlvbnMsIGFuZCwgaWYgdGhleSBkbywgbWFrZSBzdXJlIHRoZQotCSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0gICAgICBpbnZhbGlkID0gMDsKLSAgICAgIGZvciAob3BpbmRleCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKLQl7Ci0JICBvcGVyYW5kID0gcG93ZXJwY19vcGVyYW5kcyArICpvcGluZGV4OwotCSAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sICZpbnZhbGlkKTsKLQl9Ci0gICAgICBpZiAoaW52YWxpZCkKLQljb250aW51ZTsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcGNvZGUtPm5hbWUpOwotICAgICAgaWYgKG9wY29kZS0+b3BlcmFuZHNbMF0gIT0gMCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgICAgIC8qIE5vdyBleHRyYWN0IGFuZCBwcmludCB0aGUgb3BlcmFuZHMuICAqLwotICAgICAgbmVlZF9jb21tYSA9IDA7Ci0gICAgICBuZWVkX3BhcmVuID0gMDsKLSAgICAgIGZvciAob3BpbmRleCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKLQl7Ci0JICBsb25nIHZhbHVlOwotCi0JICBvcGVyYW5kID0gcG93ZXJwY19vcGVyYW5kcyArICpvcGluZGV4OwotCi0JICAvKiBPcGVyYW5kcyB0aGF0IGFyZSBtYXJrZWQgRkFLRSBhcmUgc2ltcGx5IGlnbm9yZWQuICBXZQotCSAgICAgYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCB0aGUgZXh0cmFjdCBmdW5jdGlvbiBjb25zaWRlcmVkCi0JICAgICB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdmFsaWQuICAqLwotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZBS0UpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgdmFsdWUgPSAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JCSAgJiYgKHZhbHVlICYgKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkpICE9IDApCi0JCXZhbHVlIC09IDEgPDwgb3BlcmFuZC0+Yml0czsKLQkgICAgfQotCi0JICAvKiBJZiB0aGUgb3BlcmFuZCBpcyBvcHRpb25hbCwgYW5kIHRoZSB2YWx1ZSBpcyB6ZXJvLCBkb24ndAotCSAgICAgcHJpbnQgYW55dGhpbmcuICAqLwotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX09QVElPTkFMKSAhPSAwCi0JICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfTkVYVCkgPT0gMAotCSAgICAgICYmIHZhbHVlID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAobmVlZF9jb21tYSkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCSAgICAgIG5lZWRfY29tbWEgPSAwOwotCSAgICB9Ci0KLQkgIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBmbGFncy4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfR1BSKSAhPSAwKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlbGQiLCB2YWx1ZSk7Ci0JICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9GUFIpICE9IDApCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZiVsZCIsIHZhbHVlKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1JFTEFUSVZFKSAhPSAwKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG1lbWFkZHIgKyB2YWx1ZSwgaW5mbyk7Ci0JICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMCkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgdmFsdWUgJiAweGZmZmZmZmZmLCBpbmZvKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0NSKSA9PSAwCi0JCSAgIHx8IChkaWFsZWN0ICYgUFBDX09QQ09ERV9QUEMpID09IDApCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMykKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJjciVkIiwgdmFsdWUpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHN0YXRpYyBjb25zdCBjaGFyICpjYm5hbWVzWzRdID0geyAibHQiLCAiZ3QiLCAiZXEiLCAic28iIH07Ci0JCSAgaW50IGNyOwotCQkgIGludCBjYzsKLQotCQkgIGNyID0gdmFsdWUgPj4gMjsKLQkJICBpZiAoY3IgIT0gMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiNCpjciVkIiwgY3IpOwotCQkgIGNjID0gdmFsdWUgJiAzOwotCQkgIGlmIChjYyAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAoY3IgIT0gMCkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKyIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgY2JuYW1lc1tjY10pOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKG5lZWRfcGFyZW4pCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkgICAgICBuZWVkX3BhcmVuID0gMDsKLQkgICAgfQotCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUEFSRU5TKSA9PSAwKQotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCSAgICAgIG5lZWRfcGFyZW4gPSAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGZvdW5kIGFuZCBwcmludGVkIGFuIGluc3RydWN0aW9uOyByZXR1cm4uICAqLwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gIC8qIFdlIGNvdWxkIG5vdCBmaW5kIGEgbWF0Y2guICAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nIDB4JWx4IiwgaW5zbik7Ci0KLSAgcmV0dXJuIDQ7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3BwYy1vcGMuYyBiL29wY29kZXMvcHBjLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTIxODgwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcHBjLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEyNCArMCwwIEBACi0vKiBwcGMtb3BjLmMgLS0gUG93ZXJQQyBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvcHBjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIFRoaXMgZmlsZSBob2xkcyB0aGUgUG93ZXJQQyBvcGNvZGUgdGFibGUuICBUaGUgb3Bjb2RlIHRhYmxlCi0gICBpbmNsdWRlcyBhbG1vc3QgYWxsIG9mIHRoZSBleHRlbmRlZCBpbnN0cnVjdGlvbiBtbmVtb25pY3MuICBUaGlzCi0gICBwZXJtaXRzIHRoZSBkaXNhc3NlbWJsZXIgdG8gdXNlIHRoZW0sIGFuZCBzaW1wbGlmaWVzIHRoZSBhc3NlbWJsZXIKLSAgIGxvZ2ljLCBhdCB0aGUgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSB0YWJsZSBzaXplLiAgVGhlIHRhYmxlIGlzCi0gICBzdHJpY3RseSBjb25zdGFudCBkYXRhLCBzbyB0aGUgY29tcGlsZXIgc2hvdWxkIGJlIGFibGUgdG8gcHV0IGl0IGluCi0gICB0aGUgLnRleHQgc2VjdGlvbi4KLQotICAgVGhpcyBmaWxlIGFsc28gaG9sZHMgdGhlIG9wZXJhbmQgdGFibGUuICBBbGwga25vd2xlZGdlIGFib3V0Ci0gICBpbnNlcnRpbmcgb3BlcmFuZHMgaW50byBpbnN0cnVjdGlvbnMgYW5kIHZpY2UtdmVyc2EgaXMga2VwdCBpbiB0aGlzCi0gICBmaWxlLiAgKi8KLQwKLS8qIExvY2FsIGluc2VydGlvbiBhbmQgZXh0cmFjdGlvbiBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmF0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmF0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmJhIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmJhIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JkbSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JkbSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JkcCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JkcCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIGludCB2YWxpZF9ibyBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYm8gUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9ibyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JvZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JvZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2RzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfZHMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9saSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2xpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbWJlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbWJlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbWI2IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbWI2IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbmIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9uYiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X25zaSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X25zaSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JhbCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmFtIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYXMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JicyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3JicyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3NoNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3NoNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3NwciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3NwciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3RiciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3RiciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlLgotCi0gICBUaGUgZmllbGRzIGFyZSBiaXRzLCBzaGlmdCwgaW5zZXJ0LCBleHRyYWN0LCBmbGFncy4KLQotICAgV2UgdXNlZCB0byBwdXQgcGFyZW5zIGFyb3VuZCB0aGUgdmFyaW91cyBhZGRpdGlvbnMsIGxpa2UgdGhlIG9uZQotICAgZm9yIEJBIGp1c3QgYmVsb3cuICBIb3dldmVyLCB0aGF0IGNhdXNlZCB0cm91YmxlIHdpdGggZmVlYmxlCi0gICBjb21waWxlcnMgd2l0aCBhIGxpbWl0IG9uIGRlcHRoIG9mIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLCBsaWtlCi0gICAocmVwb3J0ZWRseSkgdGhlIGNvbXBpbGVyIGluIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIDUuICBTbyB3ZQotICAgb21pdCB0aGUgcGFyZW5zLCBzaW5jZSB0aGUgbWFjcm9zIGFyZSBuZXZlciB1c2VkIGluIGEgY29udGV4dCB3aGVyZQotICAgdGhlIGFkZGl0aW9uIHdpbGwgYmUgYW1iaWd1b3VzLiAgKi8KLQotY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCBwb3dlcnBjX29wZXJhbmRzW10gPQotewotICAvKiBUaGUgemVybyBpbmRleCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YKLSAgICAgb3BlcmFuZHMuICAqLwotI2RlZmluZSBVTlVTRUQgMAotICB7IDAsIDAsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgQkEgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJBIFVOVVNFRCArIDEKLSNkZWZpbmUgQkFfTUFTSyAoMHgxZiA8PCAxNikKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgQkEgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUKLSAgICAgYXMgdGhlIEJUIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkFUIEJBICsgMQotICB7IDUsIDE2LCBpbnNlcnRfYmF0LCBleHRyYWN0X2JhdCwgUFBDX09QRVJBTkRfRkFLRSB9LAotCi0gIC8qIFRoZSBCQiBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkIgQkFUICsgMQotI2RlZmluZSBCQl9NQVNLICgweDFmIDw8IDExKQotICB7IDUsIDExLCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBCQiBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZQotICAgICBhcyB0aGUgQkEgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCQkEgQkIgKyAxCi0gIHsgNSwgMTEsIGluc2VydF9iYmEsIGV4dHJhY3RfYmJhLCBQUENfT1BFUkFORF9GQUtFIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQotICAgICBmb3JjZWQgdG8gemVyby4gICovCi0jZGVmaW5lIEJEIEJCQSArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkLCBleHRyYWN0X2JkLCBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGFic29sdXRlIGFkZHJlc3NpbmcgaXMKLSAgICAgdXNlZC4gICovCi0jZGVmaW5lIEJEQSBCRCArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkLCBleHRyYWN0X2JkLCBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSAtIG1vZGlmaWVyIGlzIHVzZWQuCi0gICAgIFRoaXMgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIGFwcHJvcHJpYXRlbHkuICAqLwotI2RlZmluZSBCRE0gQkRBICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmRtLCBleHRyYWN0X2JkbSwKLSAgICAgIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlIC0gbW9kaWZpZXIgaXMgdXNlZAotICAgICBhbmQgYWJzb2x1dGUgYWRkcmVzcyBpcyB1c2VkLiAgKi8KLSNkZWZpbmUgQkRNQSBCRE0gKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZG0sIGV4dHJhY3RfYmRtLAotICAgICAgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBtb2RpZmllciBpcyB1c2VkLgotICAgICBUaGlzIHNldHMgdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KLSNkZWZpbmUgQkRQIEJETUEgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZHAsIGV4dHJhY3RfYmRwLAotICAgICAgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBtb2RpZmllciBpcyB1c2VkCi0gICAgIGFuZCBhYnNvbHV0ZSBhZGRyZXNzaW5nIGlzIHVzZWQuICAqLwotI2RlZmluZSBCRFBBIEJEUCArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkcCwgZXh0cmFjdF9iZHAsCi0gICAgICBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRiBmaWVsZCBpbiBhbiBYIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCRiBCRFBBICsgMQotICB7IDMsIDIzLCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIEFuIG9wdGlvbmFsIEJGIGZpZWxkLiAgVGhpcyBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluc3RydWN0aW9ucywKLSAgICAgaW4gd2hpY2ggYW4gb21pdHRlZCBCRiBmaWVsZCBpcyB0YWtlbiBhcyB6ZXJvLiAgKi8KLSNkZWZpbmUgT0JGIEJGICsgMQotICB7IDMsIDIzLCAwLCAwLCBQUENfT1BFUkFORF9DUiB8IFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCi0KLSAgLyogVGhlIEJGQSBmaWVsZCBpbiBhbiBYIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCRkEgT0JGICsgMQotICB7IDMsIDE4LCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBCSSBmaWVsZCBpbiBhIEIgZm9ybSBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkkgQkZBICsgMQotI2RlZmluZSBCSV9NQVNLICgweDFmIDw8IDE2KQotICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIENlcnRhaW4gdmFsdWVzIGFyZQotICAgICBpbGxlZ2FsLiAgKi8KLSNkZWZpbmUgQk8gQkkgKyAxCi0jZGVmaW5lIEJPX01BU0sgKDB4MWYgPDwgMjEpCi0gIHsgNSwgMjEsIGluc2VydF9ibywgZXh0cmFjdF9ibywgMCB9LAotCi0gIC8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG9yIC0gbW9kaWZpZXIgaXMKLSAgICAgdXNlZC4gIFRoaXMgaXMgbGlrZSB0aGUgQk8gZmllbGQsIGJ1dCBpdCBtdXN0IGJlIGV2ZW4uICAqLwotI2RlZmluZSBCT0UgQk8gKyAxCi0gIHsgNSwgMjEsIGluc2VydF9ib2UsIGV4dHJhY3RfYm9lLCAwIH0sCi0KLSAgLyogVGhlIEJUIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJUIEJPRSArIDEKLSAgeyA1LCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgY29uZGl0aW9uIHJlZ2lzdGVyIG51bWJlciBwb3J0aW9uIG9mIHRoZSBCSSBmaWVsZCBpbiBhIEIgZm9ybQotICAgICBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgZXh0ZW5kZWQKLSAgICAgY29uZGl0aW9uYWwgYnJhbmNoIG1uZW1vbmljcywgd2hpY2ggc2V0IHRoZSBsb3dlciB0d28gYml0cyBvZiB0aGUKLSAgICAgQkkgZmllbGQuICBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLiAgKi8KLSNkZWZpbmUgQ1IgQlQgKyAxCi0gIHsgMywgMTgsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKLQotICAvKiBUaGUgRCBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgYSBkaXNwbGFjZW1lbnQgb2ZmCi0gICAgIGEgcmVnaXN0ZXIsIGFuZCBpbXBsaWVzIHRoYXQgdGhlIG5leHQgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyIGluCi0gICAgIHBhcmVudGhlc2VzLiAgKi8KLSNkZWZpbmUgRCBDUiArIDEKLSAgeyAxNiwgMCwgMCwgMCwgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIERTIGZpZWxkIGluIGEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSBELCBidXQgdGhlCi0gICAgIGxvd2VyIHR3byBiaXRzIGFyZSBmb3JjZWQgdG8gemVyby4gICovCi0jZGVmaW5lIERTIEQgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9kcywgZXh0cmFjdF9kcywgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEUgZmllbGQgaW4gYSB3cnRlZWkgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBFIERTICsgMQotICB7IDEsIDE1LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEZMMSBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGTDEgRSArIDEKLSAgeyA0LCAxMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGTDIgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRkwyIEZMMSArIDEKLSAgeyAzLCAyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEZMTSBmaWVsZCBpbiBhbiBYRkwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZMTSBGTDIgKyAxCi0gIHsgOCwgMTcsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgRlJBIGZpZWxkIGluIGFuIFggb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlJBIEZMTSArIDEKLSNkZWZpbmUgRlJBX01BU0sgKDB4MWYgPDwgMTYpCi0gIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAotCi0gIC8qIFRoZSBGUkIgZmllbGQgaW4gYW4gWCBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGUkIgRlJBICsgMQotI2RlZmluZSBGUkJfTUFTSyAoMHgxZiA8PCAxMSkKLSAgeyA1LCAxMSwgMCwgMCwgUFBDX09QRVJBTkRfRlBSIH0sCi0KLSAgLyogVGhlIEZSQyBmaWVsZCBpbiBhbiBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGUkMgRlJCICsgMQotI2RlZmluZSBGUkNfTUFTSyAoMHgxZiA8PCA2KQotICB7IDUsIDYsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAotCi0gIC8qIFRoZSBGUlMgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uIG9yIHRoZSBGUlQgZmllbGQgaW4gYSBELCBYCi0gICAgIG9yIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZSUyBGUkMgKyAxCi0jZGVmaW5lIEZSVCBGUlMKLSAgeyA1LCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfRlBSIH0sCi0KLSAgLyogVGhlIEZYTSBmaWVsZCBpbiBhbiBYRlggaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGWE0gRlJTICsgMQotI2RlZmluZSBGWE1fTUFTSyAoMHhmZiA8PCAxMikKLSAgeyA4LCAxMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBMIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBMIEZYTSArIDEKLSAgeyAxLCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKLQotICAvKiBUaGUgTEVWIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExFViBMICsgMQotICB7IDcsIDUsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQotICAgICBmb3JjZWQgdG8gemVyby4gICovCi0jZGVmaW5lIExJIExFViArIDEKLSAgeyAyNiwgMCwgaW5zZXJ0X2xpLCBleHRyYWN0X2xpLCBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBMSSBmaWVsZCBpbiBhbiBJIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB1c2VkIGFzIGFuIGFic29sdXRlCi0gICAgIGFkZHJlc3MuICAqLwotI2RlZmluZSBMSUEgTEkgKyAxCi0gIHsgMjYsIDAsIGluc2VydF9saSwgZXh0cmFjdF9saSwgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgTUIgZmllbGQgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUIgTElBICsgMQotI2RlZmluZSBNQl9NQVNLICgweDFmIDw8IDYpCi0gIHsgNSwgNiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBNRSBmaWVsZCBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNRSBNQiArIDEKLSNkZWZpbmUgTUVfTUFTSyAoMHgxZiA8PCAxKQotICB7IDUsIDEsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgTUIgYW5kIE1FIGZpZWxkcyBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24gZXhwcmVzc2VkIGEgc2luZ2xlCi0gICAgIG9wZXJhbmQgd2hpY2ggaXMgYSBiaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggYml0cyB0byBzZWxlY3QuICBUaGlzCi0gICAgIGlzIGEgdHdvIG9wZXJhbmQgZm9ybSB1c2luZyBQUENfT1BFUkFORF9ORVhULiAgU2VlIHRoZQotICAgICBkZXNjcmlwdGlvbiBpbiBvcGNvZGUvcHBjLmggZm9yIHdoYXQgdGhpcyBtZWFucy4gICovCi0jZGVmaW5lIE1CRSBNRSArIDEKLSAgeyA1LCA2LCAwLCAwLCBQUENfT1BFUkFORF9PUFRJT05BTCB8IFBQQ19PUEVSQU5EX05FWFQgfSwKLSAgeyAzMiwgMCwgaW5zZXJ0X21iZSwgZXh0cmFjdF9tYmUsIDAgfSwKLQotICAvKiBUaGUgTUIgb3IgTUUgZmllbGQgaW4gYW4gTUQgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaAotICAgICBiaXQgaXMgd3JhcHBlZCB0byB0aGUgbG93IGVuZC4gICovCi0jZGVmaW5lIE1CNiBNQkUgKyAyCi0jZGVmaW5lIE1FNiBNQjYKLSNkZWZpbmUgTUI2X01BU0sgKDB4M2YgPDwgNSkKLSAgeyA2LCA1LCBpbnNlcnRfbWI2LCBleHRyYWN0X21iNiwgMCB9LAotCi0gIC8qIFRoZSBOQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgdmFsdWUgMzIgaXMgc3RvcmVkIGFzCi0gICAgIDAuICAqLwotI2RlZmluZSBOQiBNQjYgKyAxCi0gIHsgNiwgMTEsIGluc2VydF9uYiwgZXh0cmFjdF9uYiwgMCB9LAotCi0gIC8qIFRoZSBOU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZQotICAgICBTSSBmaWVsZCwgb25seSBuZWdhdGVkLiAgKi8KLSNkZWZpbmUgTlNJIE5CICsgMQotICB7IDE2LCAwLCBpbnNlcnRfbnNpLCBleHRyYWN0X25zaSwKLSAgICAgIFBQQ19PUEVSQU5EX05FR0FUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIFJBIGZpZWxkIGluIGFuIEQsIERTLCBYLCBYTywgTSwgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSQSBOU0kgKyAxCi0jZGVmaW5lIFJBX01BU0sgKDB4MWYgPDwgMTYpCi0gIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCi0gICAgIGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBIGZpZWxkIG1heSBub3QgYmUgemVybyBhbmQgbWF5IG5vdAotICAgICBlcXVhbCB0aGUgUlQgZmllbGQuICAqLwotI2RlZmluZSBSQUwgUkEgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYWwsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQSBmaWVsZCBpbiBhbiBsbXcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsIHZhbHVlCi0gICAgIHJlc3RyaWN0aW9ucy4gICovCi0jZGVmaW5lIFJBTSBSQUwgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYW0sIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCi0gICAgIHN0b3JlIG9yIGFuIHVwZGF0aW5nIGZsb2F0aW5nIHBvaW50IGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBCi0gICAgIGZpZWxkIG1heSBub3QgYmUgemVyby4gICovCi0jZGVmaW5lIFJBUyBSQU0gKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYXMsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYLCBYTywgTSwgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSQiBSQVMgKyAxCi0jZGVmaW5lIFJCX01BU0sgKDB4MWYgPDwgMTEpCi0gIHsgNSwgMTEsIDAsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICAgIHRoZSBSUyBmaWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkCi0gICAgIG1uZW1vbmljcyBsaWtlIG1yLiAgKi8KLSNkZWZpbmUgUkJTIFJCICsgMQotICB7IDUsIDEsIGluc2VydF9yYnMsIGV4dHJhY3RfcmJzLCBQUENfT1BFUkFORF9GQUtFIH0sCi0KLSAgLyogVGhlIFJTIGZpZWxkIGluIGEgRCwgRFMsIFgsIFhGWCwgWFMsIE0sIE1EIG9yIE1EUyBmb3JtCi0gICAgIGluc3RydWN0aW9uIG9yIHRoZSBSVCBmaWVsZCBpbiBhIEQsIERTLCBYLCBYRlggb3IgWE8gZm9ybQotICAgICBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJTIFJCUyArIDEKLSNkZWZpbmUgUlQgUlMKLSNkZWZpbmUgUlRfTUFTSyAoMHgxZiA8PCAyMSkKLSAgeyA1LCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFNIIGZpZWxkIGluIGFuIFggb3IgTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0ggUlMgKyAxCi0jZGVmaW5lIFNIX01BU0sgKDB4MWYgPDwgMTEpCi0gIHsgNSwgMTEsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgU0ggZmllbGQgaW4gYW4gTUQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgc3BsaXQuICAqLwotI2RlZmluZSBTSDYgU0ggKyAxCi0jZGVmaW5lIFNINl9NQVNLICgoMHgxZiA8PCAxMSkgfCAoMSA8PCAxKSkKLSAgeyA2LCAxLCBpbnNlcnRfc2g2LCBleHRyYWN0X3NoNiwgMCB9LAotCi0gIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNJIFNINiArIDEKLSAgeyAxNiwgMCwgMCwgMCwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIFNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uIHdoZW4gd2UgYWNjZXB0IGEgd2lkZSByYW5nZQotICAgICBvZiBwb3NpdGl2ZSB2YWx1ZXMuICAqLwotI2RlZmluZSBTSVNJR05PUFQgU0kgKyAxCi0gIHsgMTYsIDAsIDAsIDAsIFBQQ19PUEVSQU5EX1NJR05FRCB8IFBQQ19PUEVSQU5EX1NJR05PUFQgfSwKLQotICAvKiBUaGUgU1BSIGZpZWxkIGluIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBmbGlwcGVkLS10aGUKLSAgICAgbG93ZXIgNSBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIDUgYW5kIHZpY2UtIHZlcnNhLiAgKi8KLSNkZWZpbmUgU1BSIFNJU0lHTk9QVCArIDEKLSNkZWZpbmUgU1BSX01BU0sgKDB4M2ZmIDw8IDExKQotICB7IDEwLCAxMSwgaW5zZXJ0X3NwciwgZXh0cmFjdF9zcHIsIDAgfSwKLQotICAvKiBUaGUgQkFUIGluZGV4IG51bWJlciBpbiBhbiBYRlggZm9ybSBtW2Z0XWliYXRbbHVdIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1BSQkFUIFNQUiArIDEKLSNkZWZpbmUgU1BSQkFUX01BU0sgKDB4MyA8PCAxNykKLSAgeyAyLCAxNywgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTUFJHIHJlZ2lzdGVyIG51bWJlciBpbiBhbiBYRlggZm9ybSBtW2Z0XXNwcmcgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTUFJHIFNQUkJBVCArIDEKLSNkZWZpbmUgU1BSR19NQVNLICgweDMgPDwgMTYpCi0gIHsgMiwgMTYsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgU1IgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1IgU1BSRyArIDEKLSAgeyA0LCAxNiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTViBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTViBTUiArIDEKLSAgeyAxNCwgMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBUQlIgZmllbGQgaW4gYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgdGhlIFNQUgotICAgICBmaWVsZCwgYnV0IGl0IGlzIG9wdGlvbmFsLiAgKi8KLSNkZWZpbmUgVEJSIFNWICsgMQotICB7IDEwLCAxMSwgaW5zZXJ0X3RiciwgZXh0cmFjdF90YnIsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCi0KLSAgLyogVGhlIFRPIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBUTyBUQlIgKyAxCi0jZGVmaW5lIFRPX01BU0sgKDB4MWYgPDwgMjEpCi0gIHsgNSwgMjEsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgVSBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVIFRPICsgMQotICB7IDQsIDEyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFVJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVUkgVSArIDEKLSAgeyAxNiwgMCwgMCwgMCwgMCB9LAotfTsKLQotLyogVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluc2VydCBhbmQgZXh0cmFjdCBjb21wbGljYXRlZCBvcGVyYW5kcy4gICovCi0KLS8qIFRoZSBCQSBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcwotICAgdGhlIEJUIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBGQUtFLgotICAgVGhlIGluc2VydGlvbiBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQlQgZmllbGQgaW50byB0aGUgQkEgZmllbGQsCi0gICBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUKLSAgIHNhbWUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmF0IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAyMSkgJiAweDFmKSA8PCAxNik7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JhdCAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxNikgJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgQkIgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKLSAgIHRoZSBCQSBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgRkFLRS4KLSAgIFRoZSBpbnNlcnRpb24gZnVuY3Rpb24ganVzdCBjb3BpZXMgdGhlIEJBIGZpZWxkIGludG8gdGhlIEJCIGZpZWxkLAotICAgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlCi0gICBzYW1lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JiYSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgoKGluc24gPj4gMTYpICYgMHgxZikgPDwgMTEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9iYmEgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiA+PiAxNikgJiAweDFmKSAhPSAoKGluc24gPj4gMTEpICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQotICAgZm9yY2VkIHRvIHplcm8uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmQgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JkIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldHVybiAoaW5zbiAmIDB4ZmZmYykgLSAweDEwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluc24gJiAweGZmZmM7Ci19Ci0KLS8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSAtIG1vZGlmaWVyIGlzIHVzZWQuCi0gICBUaGlzIG1vZGlmaWVyIG1lYW5zIHRoYXQgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uCi0gICBXZSBtdXN0IHNldCB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIHRvIDEgaWYgdGhlIG9mZnNldCBpcwotICAgbmVnYXRpdmUuICBXaGVuIGV4dHJhY3RpbmcsIHdlIHJlcXVpcmUgdGhhdCB0aGUgeSBiaXQgYmUgMSBhbmQgdGhhdAotICAgdGhlIG9mZnNldCBiZSBwb3NpdGl2ZSwgc2luY2UgaWYgdGhlIHkgYml0IGlzIDAgd2UganVzdCB3YW50IHRvCi0gICBwcmludCB0aGUgbm9ybWFsIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JkbSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoKHZhbHVlICYgMHg4MDAwKSAhPSAwKQotICAgIGluc24gfD0gMSA8PCAyMTsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9iZG0gKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiAmICgxIDw8IDIxKSkgPT0gMAotCSAgfHwgKGluc24gJiAoMSA8PCAxNSkpID09IDApKQotICAgICppbnZhbGlkID0gMTsKLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldHVybiAoaW5zbiAmIDB4ZmZmYykgLSAweDEwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluc24gJiAweGZmZmM7Ci19Ci0KLS8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG1vZGlmaWVyIGlzIHVzZWQuCi0gICBUaGlzIGlzIGxpa2UgQkRNLCBhYm92ZSwgZXhjZXB0IHRoYXQgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZQotICAgdGFrZW4uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmRwIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICgodmFsdWUgJiAweDgwMDApID09IDApCi0gICAgaW5zbiB8PSAxIDw8IDIxOwotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JkcCAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuICYgKDEgPDwgMjEpKSA9PSAwCi0JICB8fCAoaW5zbiAmICgxIDw8IDE1KSkgIT0gMCkpCi0gICAgKmludmFsaWQgPSAxOwotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogQ2hlY2sgZm9yIGxlZ2FsIHZhbHVlcyBvZiBhIEJPIGZpZWxkLiAgKi8KLQotc3RhdGljIGludAotdmFsaWRfYm8gKHZhbHVlKQotICAgICBsb25nIHZhbHVlOwotewotICAvKiBDZXJ0YWluIGVuY29kaW5ncyBoYXZlIGJpdHMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgemVyby4gIFRoZXNlCi0gICAgIGFyZSAoeiBtdXN0IGJlIHplcm8sIHkgbWF5IGJlIGFueXRoaW5nKToKLSAgICAgICAgIDAwMXp5Ci0JIDAxMXp5Ci0JIDF6MDB5Ci0JIDF6MDF5Ci0JIDF6MXp6Ci0gICAgICovCi0gIHN3aXRjaCAodmFsdWUgJiAweDE0KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgMHg0OgotICAgICAgcmV0dXJuICh2YWx1ZSAmIDB4MikgPT0gMDsKLSAgICBjYXNlIDB4MTA6Ci0gICAgICByZXR1cm4gKHZhbHVlICYgMHg4KSA9PSAwOwotICAgIGNhc2UgMHgxNDoKLSAgICAgIHJldHVybiB2YWx1ZSA9PSAweDE0OwotICAgIH0KLX0KLQotLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uLiAgV2FybiBhYm91dCBhdHRlbXB0cyB0byBzZXQKLSAgIHRoZSBmaWVsZCB0byBhbiBpbGxlZ2FsIHZhbHVlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9ibyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMCi0gICAgICAmJiAhIHZhbGlkX2JvICh2YWx1ZSkpCi0gICAgKmVycm1zZyA9IF8oImludmFsaWQgY29uZGl0aW9uYWwgb3B0aW9uIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDIxKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYm8gKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIHZhbHVlOwotCi0gIHZhbHVlID0gKGluc24gPj4gMjEpICYgMHgxZjsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAhIHZhbGlkX2JvICh2YWx1ZSkpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG9yIC0gbW9kaWZpZXIgaXMKLSAgIHVzZWQuICBUaGlzIGlzIGxpa2UgdGhlIEJPIGZpZWxkLCBidXQgaXQgbXVzdCBiZSBldmVuLiAgV2hlbgotICAgZXh0cmFjdGluZyBpdCwgd2UgZm9yY2UgaXQgdG8gYmUgZXZlbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYm9lIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgdmFsaWRfYm8gKHZhbHVlKSkKLQkqZXJybXNnID0gXygiaW52YWxpZCBjb25kaXRpb25hbCBvcHRpb24iKTsKLSAgICAgIGVsc2UgaWYgKCh2YWx1ZSAmIDEpICE9IDApCi0JKmVycm1zZyA9IF8oImF0dGVtcHQgdG8gc2V0IHkgYml0IHdoZW4gdXNpbmcgKyBvciAtIG1vZGlmaWVyIik7Ci0gICAgfQotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAyMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JvZSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgdmFsdWU7Ci0KLSAgdmFsdWUgPSAoaW5zbiA+PiAyMSkgJiAweDFmOwotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICEgdmFsaWRfYm8gKHZhbHVlKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiB2YWx1ZSAmIDB4MWU7Ci19Ci0KLS8qIFRoZSBEUyBmaWVsZCBpbiBhIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgRCwgYnV0IHRoZQotICAgbG93ZXIgdHdvIGJpdHMgYXJlIGZvcmNlZCB0byB6ZXJvLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2RzIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9kcyAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQotICAgZm9yY2VkIHRvIHplcm8uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbGkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKCh2YWx1ZSAmIDMpICE9IDAgJiYgZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQotICAgICplcnJtc2cgPSBfKCJpZ25vcmluZyBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGluIGJyYW5jaCBvZmZzZXQiKTsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweDNmZmZmZmMpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X2xpIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKChpbnNuICYgMHgyMDAwMDAwKSAhPSAwKQotICAgIHJldHVybiAoaW5zbiAmIDB4M2ZmZmZmYykgLSAweDQwMDAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4M2ZmZmZmYzsKLX0KLQotLyogVGhlIE1CIGFuZCBNRSBmaWVsZHMgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uIGV4cHJlc3NlZCBhcyBhIHNpbmdsZQotICAgb3BlcmFuZCB3aGljaCBpcyBpdHNlbGYgYSBiaXRtYXNrLiAgVGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24gYWx3YXlzCi0gICBtYXJrcyBpdCBhcyBpbnZhbGlkLCBzaW5jZSB3ZSBuZXZlciB3YW50IHRvIHJlY29nbml6ZSBhbgotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG9mIHRoaXMgdHlwZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbWJlIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdXZhbCwgbWFzazsKLSAgaW50IG1iLCBtZSwgbXgsIGNvdW50LCBsYXN0OwotCi0gIHV2YWwgPSB2YWx1ZTsKLQotICBpZiAodXZhbCA9PSAwKQotICAgIHsKLSAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwpCi0JKmVycm1zZyA9IF8oImlsbGVnYWwgYml0bWFzayIpOwotICAgICAgcmV0dXJuIGluc247Ci0gICAgfQotCi0gIG1iID0gMDsKLSAgbWUgPSAzMjsKLSAgaWYgKCh1dmFsICYgMSkgIT0gMCkKLSAgICBsYXN0ID0gMTsKLSAgZWxzZQotICAgIGxhc3QgPSAwOwotICBjb3VudCA9IDA7Ci0KLSAgLyogbWI6IGxvY2F0aW9uIG9mIGxhc3QgMC0+MSB0cmFuc2l0aW9uICovCi0gIC8qIG1lOiBsb2NhdGlvbiBvZiBsYXN0IDEtPjAgdHJhbnNpdGlvbiAqLwotICAvKiBjb3VudDogIyB0cmFuc2l0aW9ucyAqLwotCi0gIGZvciAobXggPSAwLCBtYXNrID0gMSA8PCAzMTsgbXggPCAzMjsgKytteCwgbWFzayA+Pj0gMSkKLSAgICB7Ci0gICAgICBpZiAoKHV2YWwgJiBtYXNrKSAmJiAhbGFzdCkKLQl7Ci0JICArK2NvdW50OwotCSAgbWIgPSBteDsKLQkgIGxhc3QgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKCEodXZhbCAmIG1hc2spICYmIGxhc3QpCi0JewotCSAgKytjb3VudDsKLQkgIG1lID0gbXg7Ci0JICBsYXN0ID0gMDsKLQl9Ci0gICAgfQotICBpZiAobWUgPT0gMCkKLSAgICBtZSA9IDMyOwotCi0gIGlmIChjb3VudCAhPSAyICYmIChjb3VudCAhPSAwIHx8ICEgbGFzdCkpCi0gICAgewotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLQkqZXJybXNnID0gXygiaWxsZWdhbCBiaXRtYXNrIik7Ci0gICAgfQotCi0gIHJldHVybiBpbnNuIHwgKG1iIDw8IDYpIHwgKChtZSAtIDEpIDw8IDEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9tYmUgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIHJldDsKLSAgaW50IG1iLCBtZTsKLSAgaW50IGk7Ci0KLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMKQotICAgICppbnZhbGlkID0gMTsKLQotICBtYiA9IChpbnNuID4+IDYpICYgMHgxZjsKLSAgbWUgPSAoaW5zbiA+PiAxKSAmIDB4MWY7Ci0gIGlmIChtYiA8IG1lICsgMSkKLSAgICB7Ci0gICAgICByZXQgPSAwOwotICAgICAgZm9yIChpID0gbWI7IGkgPD0gbWU7IGkrKykKLQlyZXQgfD0gKGxvbmcpIDEgPDwgKDMxIC0gaSk7Ci0gICAgfQotICBlbHNlIGlmIChtYiA9PSBtZSArIDEpCi0gICAgcmV0ID0gfjA7Ci0gIGVsc2UgLyogKG1iID4gbWUgKyAxKSAqLwotICAgIHsKLSAgICAgIHJldCA9IH4gKGxvbmcpIDA7Ci0gICAgICBmb3IgKGkgPSBtZSArIDE7IGkgPCBtYjsgaSsrKQotCXJldCAmPSB+ICgobG9uZykgMSA8PCAoMzEgLSBpKSk7Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgTUIgb3IgTUUgZmllbGQgaW4gYW4gTUQgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCBiaXQKLSAgIGlzIHdyYXBwZWQgdG8gdGhlIGxvdyBlbmQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbWI2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDYpIHwgKHZhbHVlICYgMHgyMCk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfbWI2IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgcmV0dXJuICgoaW5zbiA+PiA2KSAmIDB4MWYpIHwgKGluc24gJiAweDIwKTsKLX0KLQotLyogVGhlIE5CIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSB2YWx1ZSAzMiBpcyBzdG9yZWQgYXMKLSAgIDAuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X25iIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAzMikKLSAgICAqZXJybXNnID0gXygidmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gIGlmICh2YWx1ZSA9PSAzMikKLSAgICB2YWx1ZSA9IDA7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDExKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9uYiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgcmV0OwotCi0gIHJldCA9IChpbnNuID4+IDExKSAmIDB4MWY7Ci0gIGlmIChyZXQgPT0gMCkKLSAgICByZXQgPSAzMjsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIE5TSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIFNJCi0gICBmaWVsZCwgb25seSBuZWdhdGVkLiAgVGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24gYWx3YXlzIG1hcmtzIGl0IGFzCi0gICBpbnZhbGlkLCBzaW5jZSB3ZSBuZXZlciB3YW50IHRvIHJlY29nbml6ZSBhbiBpbnN0cnVjdGlvbiB3aGljaCB1c2VzCi0gICBhIGZpZWxkIG9mIHRoaXMgdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9uc2kgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKC0gdmFsdWUpICYgMHhmZmZmKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfbnNpIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMKQotICAgICppbnZhbGlkID0gMTsKLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldHVybiAtICgobG9uZykoaW5zbiAmIDB4ZmZmZikgLSAweDEwMDAwKTsKLSAgZWxzZQotICAgIHJldHVybiAtIChsb25nKShpbnNuICYgMHhmZmZmKTsKLX0KLQotLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKLSAgIGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBIGZpZWxkIG1heSBub3QgYmUgemVybyBhbmQgbWF5IG5vdAotICAgZXF1YWwgdGhlIFJUIGZpZWxkLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYWwgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID09IDAKLSAgICAgIHx8ICh1bnNpZ25lZCBsb25nKSB2YWx1ZSA9PSAoKGluc24gPj4gMjEpICYgMHgxZikpCi0gICAgKmVycm1zZyA9ICJpbnZhbGlkIHJlZ2lzdGVyIG9wZXJhbmQgd2hlbiB1cGRhdGluZyI7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotLyogVGhlIFJBIGZpZWxkIGluIGFuIGxtdyBpbnN0cnVjdGlvbiwgd2hpY2ggaGFzIHNwZWNpYWwgdmFsdWUKLSAgIHJlc3RyaWN0aW9ucy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfcmFtIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICgodW5zaWduZWQgbG9uZykgdmFsdWUgPj0gKChpbnNuID4+IDIxKSAmIDB4MWYpKQotICAgICplcnJtc2cgPSBfKCJpbmRleCByZWdpc3RlciBpbiBsb2FkIHJhbmdlIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKLSAgIHN0b3JlIG9yIGFuIHVwZGF0aW5nIGZsb2F0aW5nIHBvaW50IGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBCi0gICBmaWVsZCBtYXkgbm90IGJlIHplcm8uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3JhcyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgPT0gMCkKLSAgICAqZXJybXNnID0gXygiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpOwotfQotCi0vKiBUaGUgUkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcwotICAgdGhlIFJTIGZpZWxkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgZXh0ZW5kZWQKLSAgIG1uZW1vbmljcyBsaWtlIG1yLiAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBGQUtFLiAgVGhlIGluc2VydGlvbgotICAgZnVuY3Rpb24ganVzdCBjb3BpZXMgdGhlIEJUIGZpZWxkIGludG8gdGhlIEJBIGZpZWxkLCBhbmQgdGhlCi0gICBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlIHNhbWUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfcmJzIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAyMSkgJiAweDFmKSA8PCAxMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X3JicyAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxMSkgJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgU0ggZmllbGQgaW4gYW4gTUQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgc3BsaXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfc2g2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDExKSB8ICgodmFsdWUgJiAweDIwKSA+PiA0KTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9zaDYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gKChpbnNuID4+IDExKSAmIDB4MWYpIHwgKChpbnNuIDw8IDQpICYgMHgyMCk7Ci19Ci0KLS8qIFRoZSBTUFIgZmllbGQgaW4gYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGZsaXBwZWQtLXRoZQotICAgbG93ZXIgNSBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIDUgYW5kIHZpY2UtIHZlcnNhLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9zcHIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpIHwgKCh2YWx1ZSAmIDB4M2UwKSA8PCA2KTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3Rfc3ByIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgcmV0dXJuICgoaW5zbiA+PiAxNikgJiAweDFmKSB8ICgoaW5zbiA+PiA2KSAmIDB4M2UwKTsKLX0KLQotLyogVGhlIFRCUiBmaWVsZCBpbiBhbiBYRlggaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGp1c3QgbGlrZSBTUFIsIGJ1dCBpdAotICAgaXMgb3B0aW9uYWwuICBXaGVuIFRCUiBpcyBvbWl0dGVkLCBpdCBtdXN0IGJlIGluc2VydGVkIGFzIDI2OCAodGhlCi0gICBtYWdpYyBudW1iZXIgb2YgdGhlIFRCIHJlZ2lzdGVyKS4gIFRoZXNlIGZ1bmN0aW9ucyB0cmVhdCAwCi0gICAoaW5kaWNhdGluZyBhbiBvbWl0dGVkIG9wdGlvbmFsIG9wZXJhbmQpIGFzIDI2OC4gIFRoaXMgbWVhbnMgdGhhdAotICAgYGBtZnRiIDQsMCcnIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gIFRoaXMgZG9lcyBub3QgbWF0dGVyIHZlcnkKLSAgIG11Y2gsIHNpbmNlIHRoZSBhcmNoaXRlY3R1cmUgbWFudWFsIGRvZXMgbm90IGRlZmluZSBtZnRiIGFzCi0gICBhY2NlcHRpbmcgYW55IHZhbHVlcyBvdGhlciB0aGFuIDI2OCBvciAyNjkuICAqLwotCi0jZGVmaW5lIFRCICgyNjgpCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfdGJyIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgIHZhbHVlID0gVEI7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNlMCkgPDwgNik7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X3RiciAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgcmV0OwotCi0gIHJldCA9ICgoaW5zbiA+PiAxNikgJiAweDFmKSB8ICgoaW5zbiA+PiA2KSAmIDB4M2UwKTsKLSAgaWYgKHJldCA9PSBUQikKLSAgICByZXQgPSAwOwotICByZXR1cm4gcmV0OwotfQotDAotLyogTWFjcm9zIHVzZWQgdG8gZm9ybSBvcGNvZGVzLiAgKi8KLQotLyogVGhlIG1haW4gb3Bjb2RlLiAgKi8KLSNkZWZpbmUgT1AoeCkgKCgoKHVuc2lnbmVkIGxvbmcpKHgpKSAmIDB4M2YpIDw8IDI2KQotI2RlZmluZSBPUF9NQVNLIE9QICgweDNmKQotCi0vKiBUaGUgbWFpbiBvcGNvZGUgY29tYmluZWQgd2l0aCBhIHRyYXAgY29kZSBpbiB0aGUgVE8gZmllbGQgb2YgYSBECi0gICBmb3JtIGluc3RydWN0aW9uLiAgVXNlZCBmb3IgZXh0ZW5kZWQgbW5lbW9uaWNzIGZvciB0aGUgdHJhcAotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgT1BUTyh4LHRvKSAoT1AgKHgpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHRvKSkgJiAweDFmKSA8PCAyMSkpCi0jZGVmaW5lIE9QVE9fTUFTSyAoT1BfTUFTSyB8IFRPX01BU0spCi0KLS8qIFRoZSBtYWluIG9wY29kZSBjb21iaW5lZCB3aXRoIGEgY29tcGFyaXNvbiBzaXplIGJpdCBpbiB0aGUgTCBmaWVsZAotICAgb2YgYSBEIGZvcm0gb3IgWCBmb3JtIGluc3RydWN0aW9uLiAgVXNlZCBmb3IgZXh0ZW5kZWQgbW5lbW9uaWNzIGZvcgotICAgdGhlIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgT1BMKHgsbCkgKE9QICh4KSB8ICgoKCh1bnNpZ25lZCBsb25nKShsKSkgJiAxKSA8PCAyMSkpCi0jZGVmaW5lIE9QTF9NQVNLIE9QTCAoMHgzZiwxKQotCi0vKiBBbiBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBBKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWYpIDw8IDEpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQotI2RlZmluZSBBX01BU0sgQSAoMHgzZiwgMHgxZiwgMSkKLQotLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIEFGUkJfTUFTSyAoQV9NQVNLIHwgRlJCX01BU0spCi0KLS8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkMgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBBRlJDX01BU0sgKEFfTUFTSyB8IEZSQ19NQVNLKQotCi0vKiBBbiBBX01BU0sgd2l0aCB0aGUgRlJBIGFuZCBGUkMgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgQUZSQUZSQ19NQVNLIChBX01BU0sgfCBGUkFfTUFTSyB8IEZSQ19NQVNLKQotCi0vKiBBIEIgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEIob3AsIGFhLCBsaykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoYWEpKSAmIDEpIDw8IDEpIHwgKChsaykgJiAxKSkKLSNkZWZpbmUgQl9NQVNLIEIgKDB4M2YsIDEsIDEpCi0KLS8qIEEgQiBmb3JtIGluc3RydWN0aW9uIHNldHRpbmcgdGhlIEJPIGZpZWxkLiAgKi8KLSNkZWZpbmUgQkJPKG9wLCBibywgYWEsIGxrKSAoQiAoKG9wKSwgKGFhKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoYm8pKSAmIDB4MWYpIDw8IDIxKSkKLSNkZWZpbmUgQkJPX01BU0sgQkJPICgweDNmLCAweDFmLCAxLCAxKQotCi0vKiBBIEJCT19NQVNLIHdpdGggdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCByZW1vdmVkLiAgVGhpcyBwZXJtaXRzCi0gICBtYXRjaGluZyBhIGNvbmRpdGlvbmFsIGJyYW5jaCByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZSB5Ci0gICBiaXQuICAqLwotI2RlZmluZSBZX01BU0sgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMSkKLSNkZWZpbmUgQkJPWV9NQVNLIChCQk9fTUFTSyAmfiBZX01BU0spCi0KLS8qIEEgQiBmb3JtIGluc3RydWN0aW9uIHNldHRpbmcgdGhlIEJPIGZpZWxkIGFuZCB0aGUgY29uZGl0aW9uIGJpdHMgb2YKLSAgIHRoZSBCSSBmaWVsZC4gICovCi0jZGVmaW5lIEJCT0NCKG9wLCBibywgY2IsIGFhLCBsaykgXAotICAoQkJPICgob3ApLCAoYm8pLCAoYWEpLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShjYikpICYgMHgzKSA8PCAxNikpCi0jZGVmaW5lIEJCT0NCX01BU0sgQkJPQ0IgKDB4M2YsIDB4MWYsIDB4MywgMSwgMSkKLQotLyogQSBCQk9DQl9NQVNLIHdpdGggdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCByZW1vdmVkLiAgKi8KLSNkZWZpbmUgQkJPWUNCX01BU0sgKEJCT0NCX01BU0sgJn4gWV9NQVNLKQotCi0vKiBBIEJCT1lDQl9NQVNLIGluIHdoaWNoIHRoZSBCSSBmaWVsZCBpcyBmaXhlZC4gICovCi0jZGVmaW5lIEJCT1lCSV9NQVNLIChCQk9ZQ0JfTUFTSyB8IEJJX01BU0spCi0KLS8qIFRoZSBtYWluIG9wY29kZSBtYXNrIHdpdGggdGhlIFJBIGZpZWxkIGNsZWFyLiAgKi8KLSNkZWZpbmUgRFJBX01BU0sgKE9QX01BU0sgfCBSQV9NQVNLKQotCi0vKiBBIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBEU08ob3AsIHhvcCkgKE9QIChvcCkgfCAoKHhvcCkgJiAweDMpKQotI2RlZmluZSBEU19NQVNLIERTTyAoMHgzZiwgMykKLQotLyogQW4gTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTShvcCwgcmMpIChPUCAob3ApIHwgKChyYykgJiAxKSkKLSNkZWZpbmUgTV9NQVNLIE0gKDB4M2YsIDEpCi0KLS8qIEFuIE0gZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBNRSBmaWVsZCBzcGVjaWZpZWQuICAqLwotI2RlZmluZSBNTUUob3AsIG1lLCByYykgKE0gKChvcCksIChyYykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKG1lKSkgJiAweDFmKSA8PCAxKSkKLQotLyogQW4gTV9NQVNLIHdpdGggdGhlIE1CIGFuZCBNRSBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBNTUJNRV9NQVNLIChNX01BU0sgfCBNQl9NQVNLIHwgTUVfTUFTSykKLQotLyogQW4gTV9NQVNLIHdpdGggdGhlIFNIIGFuZCBNRSBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBNU0hNRV9NQVNLIChNX01BU0sgfCBTSF9NQVNLIHwgTUVfTUFTSykKLQotLyogQW4gTUQgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1EKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4NykgPDwgMikgfCAoKHJjKSAmIDEpKQotI2RlZmluZSBNRF9NQVNLIE1EICgweDNmLCAweDcsIDEpCi0KLS8qIEFuIE1EX01BU0sgd2l0aCB0aGUgTUIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBNRE1CX01BU0sgKE1EX01BU0sgfCBNQjZfTUFTSykKLQotLyogQW4gTURfTUFTSyB3aXRoIHRoZSBTSCBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIE1EU0hfTUFTSyAoTURfTUFTSyB8IFNINl9NQVNLKQotCi0vKiBBbiBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1EUyhvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweGYpIDw8IDEpIHwgKChyYykgJiAxKSkKLSNkZWZpbmUgTURTX01BU0sgTURTICgweDNmLCAweGYsIDEpCi0KLS8qIEFuIE1EU19NQVNLIHdpdGggdGhlIE1CIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgTURTTUJfTUFTSyAoTURTX01BU0sgfCBNQjZfTUFTSykKLQotLyogQW4gU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNDKG9wLCBzYSwgbGspIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNhKSkgJiAxKSA8PCAxKSB8ICgobGspICYgMSkpCi0jZGVmaW5lIFNDX01BU0sgKE9QX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTB4M2ZmKSA8PCAxNikgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDEpIHwgMSkKLQotLyogQW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWChvcCwgeG9wKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4M2ZmKSA8PCAxKSkKLQotLyogQW4gWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFJDIGJpdCBzcGVjaWZpZWQuICAqLwotI2RlZmluZSBYUkMob3AsIHhvcCwgcmMpIChYICgob3ApLCAoeG9wKSkgfCAoKHJjKSAmIDEpKQotCi0vKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWF9NQVNLIFhSQyAoMHgzZiwgMHgzZmYsIDEpCi0KLS8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSQSBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhSQV9NQVNLIChYX01BU0sgfCBSQV9NQVNLKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUkIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYUkJfTUFTSyAoWF9NQVNLIHwgUkJfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJUIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWFJUX01BU0sgKFhfTUFTSyB8IFJUX01BU0spCi0KLS8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSQSBhbmQgUkIgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgWFJBUkJfTUFTSyAoWF9NQVNLIHwgUkFfTUFTSyB8IFJCX01BU0spCi0KLS8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSVCBhbmQgUkEgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgWFJUUkFfTUFTSyAoWF9NQVNLIHwgUlRfTUFTSyB8IFJBX01BU0spCi0KLS8qIEFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWENNUEwob3AsIHhvcCwgbCkgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShsKSkgJiAxKSA8PCAyMSkpCi0KLS8qIFRoZSBtYXNrIGZvciBhbiBYIGZvcm0gY29tcGFyaXNvbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhDTVBfTUFTSyAoWF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMikpCi0KLS8qIFRoZSBtYXNrIGZvciBhbiBYIGZvcm0gY29tcGFyaXNvbiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBMIGZpZWxkCi0gICBmaXhlZC4gICovCi0jZGVmaW5lIFhDTVBMX01BU0sgKFhDTVBfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjEpKQotCi0vKiBBbiBYIGZvcm0gdHJhcCBpbnN0cnVjdGlvbiB3aXRoIHRoZSBUTyBmaWVsZCBzcGVjaWZpZWQuICAqLwotI2RlZmluZSBYVE8ob3AsIHhvcCwgdG8pIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykodG8pKSAmIDB4MWYpIDw8IDIxKSkKLSNkZWZpbmUgWFRPX01BU0sgKFhfTUFTSyB8IFRPX01BU0spCi0KLS8qIEFuIFhGTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWEZMKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4M2ZmKSA8PCAxKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKLSNkZWZpbmUgWEZMX01BU0sgKFhGTCAoMHgzZiwgMHgzZmYsIDEpIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyNSkgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDE2KSkKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBMSyBmaWVsZCBzZXQgdG8gMC4gICovCi0jZGVmaW5lIFhMKG9wLCB4b3ApIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIHVzZXMgdGhlIExLIGZpZWxkLiAgKi8KLSNkZWZpbmUgWExMSyhvcCwgeG9wLCBsaykgKFhMICgob3ApLCAoeG9wKSkgfCAoKGxrKSAmIDEpKQotCi0vKiBUaGUgbWFzayBmb3IgYW4gWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhMX01BU0sgWExMSyAoMHgzZiwgMHgzZmYsIDEpCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggZXhwbGljaXRseSBzZXRzIHRoZSBCTyBmaWVsZC4gICovCi0jZGVmaW5lIFhMTyhvcCwgYm8sIHhvcCwgbGspIFwKLSAgKFhMTEsgKChvcCksICh4b3ApLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShibykpICYgMHgxZikgPDwgMjEpKQotI2RlZmluZSBYTE9fTUFTSyAoWExfTUFTSyB8IEJPX01BU0spCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggZXhwbGljaXRseSBzZXRzIHRoZSB5IGJpdCBvZiB0aGUgQk8KLSAgIGZpZWxkLiAgKi8KLSNkZWZpbmUgWExZTEsob3AsIHhvcCwgeSwgbGspIChYTExLICgob3ApLCAoeG9wKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoeSkpICYgMSkgPDwgMjEpKQotI2RlZmluZSBYTFlMS19NQVNLIChYTF9NQVNLIHwgWV9NQVNLKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIHNldHMgdGhlIEJPIGZpZWxkIGFuZCB0aGUgY29uZGl0aW9uCi0gICBiaXRzIG9mIHRoZSBCSSBmaWVsZC4gICovCi0jZGVmaW5lIFhMT0NCKG9wLCBibywgY2IsIHhvcCwgbGspIFwKLSAgKFhMTyAoKG9wKSwgKGJvKSwgKHhvcCksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGNiKSkgJiAzKSA8PCAxNikpCi0jZGVmaW5lIFhMT0NCX01BU0sgWExPQ0IgKDB4M2YsIDB4MWYsIDB4MywgMHgzZmYsIDEpCi0KLS8qIEFuIFhMX01BU0sgb3IgWExZTEtfTUFTSyBvciBYTE9DQl9NQVNLIHdpdGggdGhlIEJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWExCQl9NQVNLIChYTF9NQVNLIHwgQkJfTUFTSykKLSNkZWZpbmUgWExZQkJfTUFTSyAoWExZTEtfTUFTSyB8IEJCX01BU0spCi0jZGVmaW5lIFhMQk9DQkJCX01BU0sgKFhMT0NCX01BU0sgfCBCQl9NQVNLKQotCi0vKiBBbiBYTF9NQVNLIHdpdGggdGhlIEJPIGFuZCBCQiBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYTEJPQkJfTUFTSyAoWExfTUFTSyB8IEJPX01BU0sgfCBCQl9NQVNLKQotCi0vKiBBbiBYTF9NQVNLIHdpdGggdGhlIEJPLCBCSSBhbmQgQkIgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgWExCT0JJQkJfTUFTSyAoWExfTUFTSyB8IEJPX01BU0sgfCBCSV9NQVNLIHwgQkJfTUFTSykKLQotLyogQW4gWE8gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhPKG9wLCB4b3AsIG9lLCByYykgXAotICAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWZmKSA8PCAxKSB8ICgoKCh1bnNpZ25lZCBsb25nKShvZSkpICYgMSkgPDwgMTApIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQotI2RlZmluZSBYT19NQVNLIFhPICgweDNmLCAweDFmZiwgMSwgMSkKLQotLyogQW4gWE9fTUFTSyB3aXRoIHRoZSBSQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhPUkJfTUFTSyAoWE9fTUFTSyB8IFJCX01BU0spCi0KLS8qIEFuIFhTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYUyhvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmZikgPDwgMikgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIFhTX01BU0sgWFMgKDB4M2YsIDB4MWZmLCAxKQotCi0vKiBBIG1hc2sgZm9yIHRoZSBGWE0gdmVyc2lvbiBvZiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhGWEZYTV9NQVNLIChYX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIwKSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMTEpKQotCi0vKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBGWE0gZmllbGQgZmlsbGVkIGluLiAgKi8KLSNkZWZpbmUgWEZYTShvcCwgeG9wLCBmeG0pIFwKLSAgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShmeG0pKSAmIDB4ZmYpIDw8IDEyKSkKLQotLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbi4gICovCi0jZGVmaW5lIFhTUFIob3AsIHhvcCwgc3ByKSBcCi0gIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykoc3ByKSkgJiAweDFmKSA8PCAxNikgfCAoKCgodW5zaWduZWQgbG9uZykoc3ByKSkgJiAweDNlMCkgPDwgNikpCi0jZGVmaW5lIFhTUFJfTUFTSyAoWF9NQVNLIHwgU1BSX01BU0spCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4gZXhjZXB0IGZvciB0aGUKLSAgIFNQUkJBVCBmaWVsZC4gICovCi0jZGVmaW5lIFhTUFJCQVRfTUFTSyAoWFNQUl9NQVNLICZ+IFNQUkJBVF9NQVNLKQotCi0vKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluIGV4Y2VwdCBmb3IgdGhlCi0gICBTUFJHIGZpZWxkLiAgKi8KLSNkZWZpbmUgWFNQUkdfTUFTSyAoWFNQUl9NQVNLICZ+IFNQUkdfTUFTSykKLQotLyogQW4gWCBmb3JtIGluc3RydWN0aW9uIHdpdGggZXZlcnl0aGluZyBmaWxsZWQgaW4gZXhjZXB0IHRoZSBFIGZpZWxkLiAgKi8KLSNkZWZpbmUgWEVfTUFTSyAoMHhmZmZmN2ZmZikKLQotLyogVGhlIEJPIGVuY29kaW5ncyB1c2VkIGluIGV4dGVuZGVkIGNvbmRpdGlvbmFsIGJyYW5jaCBtbmVtb25pY3MuICAqLwotI2RlZmluZSBCT0ROWkYJKDB4MCkKLSNkZWZpbmUgQk9ETlpGUAkoMHgxKQotI2RlZmluZSBCT0RaRgkoMHgyKQotI2RlZmluZSBCT0RaRlAJKDB4MykKLSNkZWZpbmUgQk9GCSgweDQpCi0jZGVmaW5lIEJPRlAJKDB4NSkKLSNkZWZpbmUgQk9ETlpUCSgweDgpCi0jZGVmaW5lIEJPRE5aVFAJKDB4OSkKLSNkZWZpbmUgQk9EWlQJKDB4YSkKLSNkZWZpbmUgQk9EWlRQCSgweGIpCi0jZGVmaW5lIEJPVAkoMHhjKQotI2RlZmluZSBCT1RQCSgweGQpCi0jZGVmaW5lIEJPRE5aCSgweDEwKQotI2RlZmluZSBCT0ROWlAJKDB4MTEpCi0jZGVmaW5lIEJPRFoJKDB4MTIpCi0jZGVmaW5lIEJPRFpQCSgweDEzKQotI2RlZmluZSBCT1UJKDB4MTQpCi0KLS8qIFRoZSBCSSBjb25kaXRpb24gYml0IGVuY29kaW5ncyB1c2VkIGluIGV4dGVuZGVkIGNvbmRpdGlvbmFsIGJyYW5jaAotICAgbW5lbW9uaWNzLiAgKi8KLSNkZWZpbmUgQ0JMVAkoMCkKLSNkZWZpbmUgQ0JHVAkoMSkKLSNkZWZpbmUgQ0JFUQkoMikKLSNkZWZpbmUgQ0JTTwkoMykKLQotLyogVGhlIFRPIGVuY29kaW5ncyB1c2VkIGluIGV4dGVuZGVkIHRyYXAgbW5lbW9uaWNzLiAgKi8KLSNkZWZpbmUgVE9MR1QJKDB4MSkKLSNkZWZpbmUgVE9MTFQJKDB4MikKLSNkZWZpbmUgVE9FUQkoMHg0KQotI2RlZmluZSBUT0xHRQkoMHg1KQotI2RlZmluZSBUT0xOTAkoMHg1KQotI2RlZmluZSBUT0xMRQkoMHg2KQotI2RlZmluZSBUT0xORwkoMHg2KQotI2RlZmluZSBUT0dUCSgweDgpCi0jZGVmaW5lIFRPR0UJKDB4YykKLSNkZWZpbmUgVE9OTAkoMHhjKQotI2RlZmluZSBUT0xUCSgweDEwKQotI2RlZmluZSBUT0xFCSgweDE0KQotI2RlZmluZSBUT05HCSgweDE0KQotI2RlZmluZSBUT05FCSgweDE4KQotI2RlZmluZSBUT1UJKDB4MWYpCi0MCi0vKiBTbWFsbGVyIG5hbWVzIGZvciB0aGUgZmxhZ3Mgc28gZWFjaCBlbnRyeSBpbiB0aGUgb3Bjb2RlcyB0YWJsZSB3aWxsCi0gICBmaXQgb24gYSBzaW5nbGUgbGluZS4gICovCi0jdW5kZWYJUFBDCi0jZGVmaW5lIFBQQyAgICAgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQUENDT00JUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQzMyICAgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzMyIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDNjQgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjQgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQUENPTkxZCVBQQ19PUENPREVfUFBDCi0jZGVmaW5lIFBQQzQwMwlQUEMKLSNkZWZpbmUgUFBDNzUwCVBQQwotI2RlZmluZSBQUEM4NjAJUFBDCi0jZGVmaW5lCVBPV0VSICAgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lCVBPV0VSMglQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQUENQV1IyCVBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUE9XRVIyIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUJUE9XRVIzMglQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9BTlkgfCBQUENfT1BDT0RFXzMyCi0jZGVmaW5lCUNPTSAgICAgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlDT00zMiAgIFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkgfCBQUENfT1BDT0RFXzMyCi0jZGVmaW5lCU02MDEgICAgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfNjAxIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFdSQ09NCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFXzYwMSB8IFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUJTUZERUMxCVBQQ19PUENPREVfUE9XRVIKLSNkZWZpbmUJTUZERUMyCVBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEKLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkgICAgIE9QQ09ERQlNQVNLCQlGTEFHUwkJeyBPUEVSQU5EUyB9Ci0KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0gICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotICAgRkxBR1MgYXJlIGZsYWdzIGluZGljYXRlZCB3aGF0IHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLQotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCi0gICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLiAgKi8KLQotY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlIHBvd2VycGNfb3Bjb2Rlc1tdID0gewoteyAidGRsZ3RpIiwgIE9QVE8oMixUT0xHVCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxsdGkiLCAgT1BUTygyLFRPTExUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkZXFpIiwgICBPUFRPKDIsVE9FUSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxnZWkiLCAgT1BUTygyLFRPTEdFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbG5saSIsICBPUFRPKDIsVE9MTkwpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsbGVpIiwgIE9QVE8oMixUT0xMRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxuZ2kiLCAgT1BUTygyLFRPTE5HKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkZ3RpIiwgICBPUFRPKDIsVE9HVCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGdlaSIsICAgT1BUTygyLFRPR0UpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRubGkiLCAgIE9QVE8oMixUT05MKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbHRpIiwgICBPUFRPKDIsVE9MVCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxlaSIsICAgT1BUTygyLFRPTEUpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRuZ2kiLCAgIE9QVE8oMixUT05HKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbmVpIiwgICBPUFRPKDIsVE9ORSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGkiLCAgICAgT1AoMiksCU9QX01BU0ssCVBQQzY0LAkJeyBUTywgUkEsIFNJIH0gfSwKLQoteyAidHdsZ3RpIiwgIE9QVE8oMyxUT0xHVCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxndGkiLCAgIE9QVE8oMyxUT0xHVCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbHRpIiwgIE9QVE8oMyxUT0xMVCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxsdGkiLCAgIE9QVE8oMyxUT0xMVCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdlcWkiLCAgIE9QVE8oMyxUT0VRKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZXFpIiwgICAgT1BUTygzLFRPRVEpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bGdlaSIsICBPUFRPKDMsVE9MR0UpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRsZ2VpIiwgICBPUFRPKDMsVE9MR0UpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bG5saSIsICBPUFRPKDMsVE9MTkwpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRsbmxpIiwgICBPUFRPKDMsVE9MTkwpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bGxlaSIsICBPUFRPKDMsVE9MTEUpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRsbGVpIiwgICBPUFRPKDMsVE9MTEUpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bG5naSIsICBPUFRPKDMsVE9MTkcpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRsbmdpIiwgICBPUFRPKDMsVE9MTkcpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3Z3RpIiwgICBPUFRPKDMsVE9HVCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGd0aSIsICAgIE9QVE8oMyxUT0dUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2dlaSIsICAgT1BUTygzLFRPR0UpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRnZWkiLCAgICBPUFRPKDMsVE9HRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdubGkiLCAgIE9QVE8oMyxUT05MKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bmxpIiwgICAgT1BUTygzLFRPTkwpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bHRpIiwgICBPUFRPKDMsVE9MVCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGx0aSIsICAgIE9QVE8oMyxUT0xUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xlaSIsICAgT1BUTygzLFRPTEUpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRsZWkiLCAgICBPUFRPKDMsVE9MRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHduZ2kiLCAgIE9QVE8oMyxUT05HKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bmdpIiwgICAgT1BUTygzLFRPTkcpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bmVpIiwgICBPUFRPKDMsVE9ORSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidG5laSIsICAgIE9QVE8oMyxUT05FKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2kiLCAgICAgT1AoMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgVE8sIFJBLCBTSSB9IH0sCi17ICJ0aSIsICAgICAgT1AoMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgVE8sIFJBLCBTSSB9IH0sCi0KLXsgIm11bGxpIiwgICBPUCg3KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgIm11bGkiLCAgICBPUCg3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLQoteyAic3ViZmljIiwgIE9QKDgpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAic2ZpIiwgICAgIE9QKDgpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAotCi17ICJkb3ppIiwgICAgT1AoOSksCU9QX01BU0ssCU02MDEsCQl7IFJULCBSQSwgU0kgfSB9LAotCi17ICJjbXBsd2kiLCAgT1BMKDEwLDApLAlPUExfTUFTSywJUFBDQ09NLAkJeyBPQkYsIFJBLCBVSSB9IH0sCi17ICJjbXBsZGkiLCAgT1BMKDEwLDEpLCBPUExfTUFTSywJUFBDNjQsCQl7IE9CRiwgUkEsIFVJIH0gfSwKLXsgImNtcGxpIiwgICBPUCgxMCksCU9QX01BU0ssCVBQQ09OTFksCXsgQkYsIEwsIFJBLCBVSSB9IH0sCi17ICJjbXBsaSIsICAgT1AoMTApLAlPUF9NQVNLLAlQV1JDT00sCQl7IEJGLCBSQSwgVUkgfSB9LAotCi17ICJjbXB3aSIsICAgT1BMKDExLDApLAlPUExfTUFTSywJUFBDQ09NLAkJeyBPQkYsIFJBLCBTSSB9IH0sCi17ICJjbXBkaSIsICAgT1BMKDExLDEpLAlPUExfTUFTSywJUFBDNjQsCQl7IE9CRiwgUkEsIFNJIH0gfSwKLXsgImNtcGkiLCAgICBPUCgxMSksCU9QX01BU0ssCVBQQ09OTFksCXsgQkYsIEwsIFJBLCBTSSB9IH0sCi17ICJjbXBpIiwgICAgT1AoMTEpLAlPUF9NQVNLLAlQV1JDT00sCQl7IEJGLCBSQSwgU0kgfSB9LAotCi17ICJhZGRpYyIsICAgT1AoMTIpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAiYWkiLAkgICAgIE9QKDEyKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgInN1YmljIiwgICBPUCgxMiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAotCi17ICJhZGRpYy4iLCAgT1AoMTMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAiYWkuIiwgICAgIE9QKDEzKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgInN1YmljLiIsICBPUCgxMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAotCi17ICJsaSIsCSAgICAgT1AoMTQpLAlEUkFfTUFTSywJUFBDQ09NLAkJeyBSVCwgU0kgfSB9LAoteyAibGlsIiwgICAgIE9QKDE0KSwJRFJBX01BU0ssCVBXUkNPTSwJCXsgUlQsIFNJIH0gfSwKLXsgImFkZGkiLCAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJjYWwiLCAgICAgT1AoMTQpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi17ICJzdWJpIiwgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKLXsgImxhIiwJICAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGlzIiwgICAgIE9QKDE1KSwJRFJBX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFNJU0lHTk9QVCB9IH0sCi17ICJsaXUiLCAgICAgT1AoMTUpLAlEUkFfTUFTSywJUFdSQ09NLAkJeyBSVCwgU0lTSUdOT1BUIH0gfSwKLXsgImFkZGlzIiwgICBPUCgxNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsUkEsU0lTSUdOT1BUIH0gfSwKLXsgImNhdSIsICAgICBPUCgxNSksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsUkEsU0lTSUdOT1BUIH0gfSwKLXsgInN1YmlzIiwgICBPUCgxNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAotCi17ICJiZG56LSIsICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNIH0gfSwKLXsgImJkbnorIiwgICBCQk8oMTYsQk9ETlosMCwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRFAgfSB9LAoteyAiYmRueiIsICAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEIH0gfSwKLXsgImJkbiIsICAgICBCQk8oMTYsQk9ETlosMCwwKSwgQkJPWUJJX01BU0ssIFBXUkNPTSwJeyBCRCB9IH0sCi17ICJiZG56bC0iLCAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNIH0gfSwKLXsgImJkbnpsKyIsICBCQk8oMTYsQk9ETlosMCwxKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRFAgfSB9LAoteyAiYmRuemwiLCAgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEIH0gfSwKLXsgImJkbmwiLCAgICBCQk8oMTYsQk9ETlosMCwxKSwgQkJPWUJJX01BU0ssIFBXUkNPTSwJeyBCRCB9IH0sCi17ICJiZG56YS0iLCAgQkJPKDE2LEJPRE5aLDEsMCksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNQSB9IH0sCi17ICJiZG56YSsiLCAgQkJPKDE2LEJPRE5aLDEsMCksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQQSB9IH0sCi17ICJiZG56YSIsICAgQkJPKDE2LEJPRE5aLDEsMCksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRBIH0gfSwKLXsgImJkbmEiLCAgICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBXUkNPTSwJeyBCREEgfSB9LAoteyAiYmRuemxhLSIsIEJCTygxNixCT0ROWiwxLDEpLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJETUEgfSB9LAoteyAiYmRuemxhKyIsIEJCTygxNixCT0ROWiwxLDEpLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUEEgfSB9LAoteyAiYmRuemxhIiwgIEJCTygxNixCT0ROWiwxLDEpLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEQSB9IH0sCi17ICJiZG5sYSIsICAgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkRBIH0gfSwKLXsgImJkei0iLCAgICBCQk8oMTYsQk9EWiwwLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoteyAiYmR6KyIsICAgIEJCTygxNixCT0RaLDAsMCksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCi17ICJiZHoiLCAgICAgQkJPKDE2LEJPRFosMCwwKSwgIEJCT1lCSV9NQVNLLCBDT00sCXsgQkQgfSB9LAoteyAiYmR6bC0iLCAgIEJCTygxNixCT0RaLDAsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETSB9IH0sCi17ICJiZHpsKyIsICAgQkJPKDE2LEJPRFosMCwxKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQIH0gfSwKLXsgImJkemwiLCAgICBCQk8oMTYsQk9EWiwwLDEpLCAgQkJPWUJJX01BU0ssIENPTSwJeyBCRCB9IH0sCi17ICJiZHphLSIsICAgQkJPKDE2LEJPRFosMSwwKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNQSB9IH0sCi17ICJiZHphKyIsICAgQkJPKDE2LEJPRFosMSwwKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQQSB9IH0sCi17ICJiZHphIiwgICAgQkJPKDE2LEJPRFosMSwwKSwgIEJCT1lCSV9NQVNLLCBDT00sCXsgQkRBIH0gfSwKLXsgImJkemxhLSIsICBCQk8oMTYsQk9EWiwxLDEpLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKLXsgImJkemxhKyIsICBCQk8oMTYsQk9EWiwxLDEpLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKLXsgImJkemxhIiwgICBCQk8oMTYsQk9EWiwxLDEpLCAgQkJPWUJJX01BU0ssIENPTSwJeyBCREEgfSB9LAoteyAiYmx0LSIsICAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibHQrIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJsdCIsICAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibHRsLSIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJsdGwrIiwgICBCQk9DQigxNixCT1QsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmx0bCIsICAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJsdGEtIiwgICBCQk9DQigxNixCT1QsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJsdGErIiwgICBCQk9DQigxNixCT1QsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJsdGEiLCAgICBCQk9DQigxNixCT1QsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmx0bGEtIiwgIEJCT0NCKDE2LEJPVCxDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmx0bGErIiwgIEJCT0NCKDE2LEJPVCxDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmx0bGEiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJiZ3QtIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJndCsiLCAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmd0IiwgICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJndGwtIiwgICBCQk9DQigxNixCT1QsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmd0bCsiLCAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJiZ3RsIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmd0YS0iLCAgIEJCT0NCKDE2LEJPVCxDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmd0YSsiLCAgIEJCT0NCKDE2LEJPVCxDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmd0YSIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJiZ3RsYS0iLCAgQkJPQ0IoMTYsQk9ULENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJiZ3RsYSsiLCAgQkJPQ0IoMTYsQk9ULENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJiZ3RsYSIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJlcS0iLCAgICBCQk9DQigxNixCT1QsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmVxKyIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJiZXEiLCAgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmVxbC0iLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZXFsKyIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJlcWwiLCAgICBCQk9DQigxNixCT1QsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZXFhLSIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJiZXFhKyIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJiZXFhIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJlcWxhLSIsICBCQk9DQigxNixCT1QsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJlcWxhKyIsICBCQk9DQigxNixCT1QsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJlcWxhIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYnNvLSIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJic28rIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJzbyIsICAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJic29sLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJzb2wrIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYnNvbCIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJzb2EtIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJzb2ErIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJzb2EiLCAgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYnNvbGEtIiwgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYnNvbGErIiwgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYnNvbGEiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJidW4tIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJ1bisiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYnVuIiwgICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEIH0gfSwKLXsgImJ1bmwtIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYnVubCsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJidW5sIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkQgfSB9LAoteyAiYnVuYS0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYnVuYSsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYnVuYSIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEQSB9IH0sCi17ICJidW5sYS0iLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJidW5sYSsiLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJidW5sYSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkRBIH0gfSwKLXsgImJnZS0iLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmdlKyIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJiZ2UiLCAgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmdlbC0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZ2VsKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJnZWwiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZ2VhLSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJiZ2VhKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJiZ2VhIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJnZWxhLSIsICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJnZWxhKyIsICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJnZWxhIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5sLSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibmwrIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJubCIsICAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibmxsLSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJubGwrIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5sbCIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJubGEtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJubGErIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJubGEiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5sbGEtIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5sbGErIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5sbGEiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibGUtIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJsZSsiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmxlIiwgICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJsZWwtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmxlbCsiLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibGVsIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmxlYS0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmxlYSsiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmxlYSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibGVsYS0iLCAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibGVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibGVsYSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJuZy0iLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5nKyIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmciLCAgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5nbC0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibmdsKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuZ2wiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibmdhLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmdhKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmdhIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJuZ2xhLSIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuZ2xhKyIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuZ2xhIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5lLSIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibmUrIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuZSIsICAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibmVsLSIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuZWwrIiwgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5lbCIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuZWEtIiwgICBCQk9DQigxNixCT0YsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuZWErIiwgICBCQk9DQigxNixCT0YsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuZWEiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5lbGEtIiwgIEJCT0NCKDE2LEJPRixDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5lbGErIiwgIEJCT0NCKDE2LEJPRixDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5lbGEiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibnMtIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJucysiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5zIiwgICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuc2wtIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5zbCsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibnNsIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5zYS0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5zYSsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5zYSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibnNsYS0iLCAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibnNsYSsiLCAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibnNsYSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJudS0iLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm51KyIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibnUiLCAgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkQgfSB9LAoteyAiYm51bC0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibnVsKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJudWwiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCi17ICJibnVhLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibnVhKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibnVhIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkRBIH0gfSwKLXsgImJudWxhLSIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJudWxhKyIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJudWxhIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoteyAiYmRuenQtIiwgIEJCTygxNixCT0ROWlQsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETSB9IH0sCi17ICJiZG56dCsiLCAgQkJPKDE2LEJPRE5aVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQIH0gfSwKLXsgImJkbnp0IiwgICBCQk8oMTYsQk9ETlpULDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZG56dGwtIiwgQkJPKDE2LEJPRE5aVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNIH0gfSwKLXsgImJkbnp0bCsiLCBCQk8oMTYsQk9ETlpULDAsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFAgfSB9LAoteyAiYmRuenRsIiwgIEJCTygxNixCT0ROWlQsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkbnp0YS0iLCBCQk8oMTYsQk9ETlpULDEsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJkbnp0YSsiLCBCQk8oMTYsQk9ETlpULDEsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJkbnp0YSIsICBCQk8oMTYsQk9ETlpULDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmRuenRsYS0iLEJCTygxNixCT0ROWlQsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETUEgfSB9LAoteyAiYmRuenRsYSsiLEJCTygxNixCT0ROWlQsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUEEgfSB9LAoteyAiYmRuenRsYSIsIEJCTygxNixCT0ROWlQsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZG56Zi0iLCAgQkJPKDE2LEJPRE5aRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNIH0gfSwKLXsgImJkbnpmKyIsICBCQk8oMTYsQk9ETlpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFAgfSB9LAoteyAiYmRuemYiLCAgIEJCTygxNixCT0ROWkYsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkbnpmbC0iLCBCQk8oMTYsQk9ETlpGLDAsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuemZsKyIsIEJCTygxNixCT0ROWkYsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCi17ICJiZG56ZmwiLCAgQkJPKDE2LEJPRE5aRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuemZhLSIsIEJCTygxNixCT0ROWkYsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETUEgfSB9LAoteyAiYmRuemZhKyIsIEJCTygxNixCT0ROWkYsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUEEgfSB9LAoteyAiYmRuemZhIiwgIEJCTygxNixCT0ROWkYsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZG56ZmxhLSIsQkJPKDE2LEJPRE5aRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56ZmxhKyIsQkJPKDE2LEJPRE5aRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56ZmxhIiwgQkJPKDE2LEJPRE5aRiwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJ0LSIsICAgICBCQk8oMTYsQk9ULDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJ0KyIsICAgICBCQk8oMTYsQk9ULDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJ0IiwJICAgICBCQk8oMTYsQk9ULDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiYnQiLCAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoteyAiYnRsLSIsICAgIEJCTygxNixCT1QsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYnRsKyIsICAgIEJCTygxNixCT1QsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYnRsIiwgICAgIEJCTygxNixCT1QsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJidGwiLCAgICBCQk8oMTYsQk9ULDAsMSksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJidGEtIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYnRhKyIsICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJ0YSIsICAgICBCQk8oMTYsQk9ULDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJ0YSIsICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJidGxhLSIsICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYnRsYSsiLCAgIEJCTygxNixCT1QsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJ0bGEiLCAgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJ0bGEiLCAgIEJCTygxNixCT1QsMSwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZi0iLCAgICAgQkJPKDE2LEJPRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZisiLCAgICAgQkJPKDE2LEJPRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJiZiIsCSAgICAgQkJPKDE2LEJPRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmJmIiwgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKLXsgImJmbC0iLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJmbCsiLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJmbCIsICAgICBCQk8oMTYsQk9GLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiYmZsIiwgICAgQkJPKDE2LEJPRiwwLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmZhLSIsICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJmYSsiLCAgICBCQk8oMTYsQk9GLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZmEiLCAgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJiZmEiLCAgICBCQk8oMTYsQk9GLDEsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmZsYS0iLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJmbGErIiwgICBCQk8oMTYsQk9GLDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZmxhIiwgICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJiZmxhIiwgICBCQk8oMTYsQk9GLDEsMSksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6dC0iLCAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZHp0KyIsICAgQkJPKDE2LEJPRFpULDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJkenQiLCAgICBCQk8oMTYsQk9EWlQsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkenRsLSIsICBCQk8oMTYsQk9EWlQsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmR6dGwrIiwgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJiZHp0bCIsICAgQkJPKDE2LEJPRFpULDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZHp0YS0iLCAgQkJPKDE2LEJPRFpULDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHp0YSsiLCAgQkJPKDE2LEJPRFpULDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHp0YSIsICAgQkJPKDE2LEJPRFpULDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6dGxhLSIsIEJCTygxNixCT0RaVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmR6dGxhKyIsIEJCTygxNixCT0RaVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYmR6dGxhIiwgIEJCTygxNixCT0RaVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkemYtIiwgICBCQk8oMTYsQk9EWkYsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmR6ZisiLCAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJiZHpmIiwgICAgQkJPKDE2LEJPRFpGLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZHpmbC0iLCAgQkJPKDE2LEJPRFpGLDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJkemZsKyIsICBCQk8oMTYsQk9EWkYsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmR6ZmwiLCAgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmR6ZmEtIiwgIEJCTygxNixCT0RaRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmR6ZmErIiwgIEJCTygxNixCT0RaRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYmR6ZmEiLCAgIEJCTygxNixCT0RaRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkemZsYS0iLCBCQk8oMTYsQk9EWkYsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJkemZsYSsiLCBCQk8oMTYsQk9EWkYsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJkemZsYSIsICBCQk8oMTYsQk9EWkYsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYy0iLCAgICAgQigxNiwwLDApLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJETSB9IH0sCi17ICJiYysiLCAgICAgQigxNiwwLDApLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJEUCB9IH0sCi17ICJiYyIsCSAgICAgQigxNiwwLDApLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkQgfSB9LAoteyAiYmNsLSIsICAgIEIoMTYsMCwxKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRE0gfSB9LAoteyAiYmNsKyIsICAgIEIoMTYsMCwxKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRFAgfSB9LAoteyAiYmNsIiwgICAgIEIoMTYsMCwxKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEIH0gfSwKLXsgImJjYS0iLCAgICBCKDE2LDEsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNQSB9IH0sCi17ICJiY2ErIiwgICAgQigxNiwxLDApLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJEUEEgfSB9LAoteyAiYmNhIiwgICAgIEIoMTYsMSwwKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEQSB9IH0sCi17ICJiY2xhLSIsICAgQigxNiwxLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJETUEgfSB9LAoteyAiYmNsYSsiLCAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRFBBIH0gfSwKLXsgImJjbGEiLCAgICBCKDE2LDEsMSksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCREEgfSB9LAotCi17ICJzYyIsICAgICAgU0MoMTcsMSwwKSwgMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLXsgInN2YyIsICAgICBTQygxNywwLDApLCBTQ19NQVNLLAlQT1dFUiwJCXsgTEVWLCBGTDEsIEZMMiB9IH0sCi17ICJzdmNsIiwgICAgU0MoMTcsMCwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IExFViwgRkwxLCBGTDIgfSB9LAoteyAic3ZjYSIsICAgIFNDKDE3LDEsMCksIFNDX01BU0ssCVBXUkNPTSwJCXsgU1YgfSB9LAoteyAic3ZjbGEiLCAgIFNDKDE3LDEsMSksIFNDX01BU0ssCVBPV0VSLAkJeyBTViB9IH0sCi0KLXsgImIiLAkgICAgIEIoMTgsMCwwKSwJQl9NQVNLLAkJQ09NLAl7IExJIH0gfSwKLXsgImJsIiwgICAgICBCKDE4LDAsMSksCUJfTUFTSywJCUNPTSwJeyBMSSB9IH0sCi17ICJiYSIsICAgICAgQigxOCwxLDApLAlCX01BU0ssCQlDT00sCXsgTElBIH0gfSwKLXsgImJsYSIsICAgICBCKDE4LDEsMSksCUJfTUFTSywJCUNPTSwJeyBMSUEgfSB9LAotCi17ICJtY3JmIiwgICAgWEwoMTksMCksCVhMQkJfTUFTS3woMzw8MjEpfCgzPDwxNiksIENPTSwJeyBCRiwgQkZBIH0gfSwKLQoteyAiYmxyIiwgICAgIFhMTygxOSxCT1UsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJyIiwgICAgICBYTE8oMTksQk9VLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQV1JDT00sCXsgMCB9IH0sCi17ICJibHJsIiwgICAgWExPKDE5LEJPVSwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYnJsIiwgICAgIFhMTygxOSxCT1UsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBXUkNPTSwJeyAwIH0gfSwKLXsgImJkbnpsciIsICBYTE8oMTksQk9ETlosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkbnpsci0iLCBYTE8oMTksQk9ETlosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkbnpscisiLCBYTE8oMTksQk9ETlpQLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZG56bHJsIiwgWExPKDE5LEJPRE5aLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZG56bHJsLSIsWExPKDE5LEJPRE5aLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZG56bHJsKyIsWExPKDE5LEJPRE5aUCwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmR6bHIiLCAgIFhMTygxOSxCT0RaLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZHpsci0iLCAgWExPKDE5LEJPRFosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkemxyKyIsICBYTE8oMTksQk9EWlAsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkemxybCIsICBYTE8oMTksQk9EWiwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYmR6bHJsLSIsIFhMTygxOSxCT0RaLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZHpscmwrIiwgWExPKDE5LEJPRFpQLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJibHRsciIsICAgWExPQ0IoMTksQk9ULENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibHRsci0iLCAgWExPQ0IoMTksQk9ULENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibHRscisiLCAgWExPQ0IoMTksQk9UUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmx0ciIsICAgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmx0bHJsIiwgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmx0bHJsLSIsIFhMT0NCKDE5LEJPVCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmx0bHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsdHJsIiwgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJndGxyIiwgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJndGxyLSIsICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJndGxyKyIsICBYTE9DQigxOSxCT1RQLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ3RyIiwgICAgWExPQ0IoMTksQk9ULENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJiZ3RscmwiLCAgWExPQ0IoMTksQk9ULENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ3RscmwtIiwgWExPQ0IoMTksQk9ULENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ3RscmwrIiwgWExPQ0IoMTksQk9UUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmd0cmwiLCAgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHIiLCAgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHItIiwgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmVxbHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJlcXIiLCAgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJlcWxybCIsICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJlcWxybC0iLCBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJlcWxybCsiLCBYTE9DQigxOSxCT1RQLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZXFybCIsICAgWExPQ0IoMTksQk9ULENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJic29sciIsICAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJic29sci0iLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJic29scisiLCAgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnNvciIsICAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYnNvbHJsIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnNvbHJsLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnNvbHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJzb3JsIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJ1bmxyIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJ1bmxyLSIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ1bmxyKyIsICBYTE9DQigxOSxCT1RQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJidW5scmwiLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJidW5scmwtIiwgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJidW5scmwrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlbHIiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHItIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJnZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJnZWxybCIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJnZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJnZWxybCsiLCBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VybCIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmxsciIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmxsci0iLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmxscisiLCAgWExPQ0IoMTksQk9GUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5sciIsICAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5sbHJsIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5sbHJsLSIsIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5sbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJubHJsIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJsZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsZWxyKyIsICBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibGVyIiwgICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibGVscmwiLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibGVscmwtIiwgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibGVscmwrIiwgWExPQ0IoMTksQk9GUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmxlcmwiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHIiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHItIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5nbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZ3IiLCAgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuZ2xybCIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZ2xybC0iLCBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZ2xybCsiLCBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmdybCIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmVsciIsICAgWExPQ0IoMTksQk9GLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmVsci0iLCAgWExPQ0IoMTksQk9GLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmVscisiLCAgWExPQ0IoMTksQk9GUCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5lciIsICAgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5lbHJsIiwgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5lbHJsLSIsIFhMT0NCKDE5LEJPRixDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5lbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuc2xyIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuc2xyLSIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuc2xyKyIsICBYTE9DQigxOSxCT0ZQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnNyIiwgICAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibnNscmwiLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnNscmwtIiwgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnNscmwrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5zcmwiLCAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm51bHIiLCAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm51bHItIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm51bHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJudWxybCIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJudWxybC0iLCBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJudWxybCsiLCBYTE9DQigxOSxCT0ZQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJidGxyIiwgICAgWExPKDE5LEJPVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGxyLSIsICAgWExPKDE5LEJPVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGxyKyIsICAgWExPKDE5LEJPVFAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmJ0ciIsICAgIFhMTygxOSxCT1QsMTYsMCksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoteyAiYnRscmwiLCAgIFhMTygxOSxCT1QsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYnRscmwtIiwgIFhMTygxOSxCT1QsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRscmwrIiwgIFhMTygxOSxCT1RQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJidHJsIiwgICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKLXsgImJmbHIiLCAgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmbHItIiwgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJmbHIrIiwgICBYTE8oMTksQk9GUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiYmZyIiwgICAgWExPKDE5LEJPRiwxNiwwKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJiZmxybCIsICAgWExPKDE5LEJPRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZmxybC0iLCAgWExPKDE5LEJPRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmxybCsiLCAgWExPKDE5LEJPRlAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmJmcmwiLCAgIFhMTygxOSxCT0YsMTYsMSksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoteyAiYmRuenRsciIsIFhMTygxOSxCT0ROWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuenRsci0iLFhMTygxOSxCT0ROWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuenRscisiLFhMTygxOSxCT0ROWlRQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnp0bHJsIixYTE8oMTksQk9ETlpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnp0bHJsLSIsWExPKDE5LEJPRE5aVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56dGxybCsiLFhMTygxOSxCT0ROWlRQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnpmbHIiLCBYTE8oMTksQk9ETlpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnpmbHItIixYTE8oMTksQk9ETlpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnpmbHIrIixYTE8oMTksQk9ETlpGUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56ZmxybCIsWExPKDE5LEJPRE5aRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZG56ZmxybC0iLFhMTygxOSxCT0ROWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuemZscmwrIixYTE8oMTksQk9ETlpGUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHp0bHIiLCAgWExPKDE5LEJPRFpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkenRsci0iLCBYTE8oMTksQk9EWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6dGxyKyIsIFhMTygxOSxCT0RaVFAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6dGxybCIsIFhMTygxOSxCT0RaVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHp0bHJsLSIsWExPKDE5LEJPRFpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkenRscmwrIixYTE8oMTksQk9EWlRQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkemZsciIsICBYTE8oMTksQk9EWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6ZmxyLSIsIFhMTygxOSxCT0RaRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHpmbHIrIiwgWExPKDE5LEJPRFpGUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHpmbHJsIiwgWExPKDE5LEJPRFpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkemZscmwtIixYTE8oMTksQk9EWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6ZmxybCsiLFhMTygxOSxCT0RaRlAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmNsciIsICAgIFhMTEsoMTksMTYsMCksIFhMWUJCX01BU0ssCVBQQ0NPTSwJCXsgQk8sIEJJIH0gfSwKLXsgImJjbHJsIiwgICBYTExLKDE5LDE2LDEpLCBYTFlCQl9NQVNLLAlQUENDT00sCQl7IEJPLCBCSSB9IH0sCi17ICJiY2xyKyIsICAgWExZTEsoMTksMTYsMSwwKSwgWExZQkJfTUFTSywgUFBDLAkJeyBCT0UsIEJJIH0gfSwKLXsgImJjbHJsKyIsICBYTFlMSygxOSwxNiwxLDEpLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoteyAiYmNsci0iLCAgIFhMWUxLKDE5LDE2LDAsMCksIFhMWUJCX01BU0ssIFBQQywJCXsgQk9FLCBCSSB9IH0sCi17ICJiY2xybC0iLCAgWExZTEsoMTksMTYsMCwxKSwgWExZQkJfTUFTSywgUFBDLAkJeyBCT0UsIEJJIH0gfSwKLXsgImJjciIsICAgICBYTExLKDE5LDE2LDApLCBYTEJCX01BU0ssCVBXUkNPTSwJCXsgQk8sIEJJIH0gfSwKLXsgImJjcmwiLCAgICBYTExLKDE5LDE2LDEpLCBYTEJCX01BU0ssCVBXUkNPTSwJCXsgQk8sIEJJIH0gfSwKLQoteyAiY3Jub3QiLCAgIFhMKDE5LDMzKSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkEsIEJCQSB9IH0sCi17ICJjcm5vciIsICAgWEwoMTksMzMpLAlYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJyZmkiLCAgICAgWEwoMTksNTApLAkweGZmZmZmZmZmLAlDT00sCQl7IDAgfSB9LAoteyAicmZjaSIsICAgIFhMKDE5LDUxKSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLQoteyAicmZzdmMiLCAgIFhMKDE5LDgyKSwJMHhmZmZmZmZmZiwJUE9XRVIsCQl7IDAgfSB9LAotCi17ICJjcmFuZGMiLCAgWEwoMTksMTI5KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiaXN5bmMiLCAgIFhMKDE5LDE1MCksIDB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCi17ICJpY3MiLCAgICAgWEwoMTksMTUwKSwgMHhmZmZmZmZmZiwJUFdSQ09NLAkJeyAwIH0gfSwKLQoteyAiY3JjbHIiLCAgIFhMKDE5LDE5MyksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBVCwgQkJBIH0gfSwKLXsgImNyeG9yIiwgICBYTCgxOSwxOTMpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcm5hbmQiLCAgWEwoMTksMjI1KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3JhbmQiLCAgIFhMKDE5LDI1NyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNyc2V0IiwgICBYTCgxOSwyODkpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQVQsIEJCQSB9IH0sCi17ICJjcmVxdiIsICAgWEwoMTksMjg5KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3JvcmMiLCAgIFhMKDE5LDQxNyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNybW92ZSIsICBYTCgxOSw0NDkpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQSwgQkJBIH0gfSwKLXsgImNyb3IiLCAgICBYTCgxOSw0NDkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJiY3RyIiwgICAgWExPKDE5LEJPVSw1MjgsMCksIFhMQk9CSUJCX01BU0ssIENPTSwJeyAwIH0gfSwKLXsgImJjdHJsIiwgICBYTE8oMTksQk9VLDUyOCwxKSwgWExCT0JJQkJfTUFTSywgQ09NLAl7IDAgfSB9LAoteyAiYmx0Y3RyIiwgIFhMT0NCKDE5LEJPVCxDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibHRjdHItIiwgWExPQ0IoMTksQk9ULENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJsdGN0cisiLCBYTE9DQigxOSxCT1RQLENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmx0Y3RybCIsIFhMT0NCKDE5LEJPVCxDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibHRjdHJsLSIsWExPQ0IoMTksQk9ULENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJsdGN0cmwrIixYTE9DQigxOSxCT1RQLENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmd0Y3RyIiwgIFhMT0NCKDE5LEJPVCxDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZ3RjdHItIiwgWExPQ0IoMTksQk9ULENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJndGN0cisiLCBYTE9DQigxOSxCT1RQLENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmd0Y3RybCIsIFhMT0NCKDE5LEJPVCxDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZ3RjdHJsLSIsWExPQ0IoMTksQk9ULENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJndGN0cmwrIixYTE9DQigxOSxCT1RQLENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmVxY3RyIiwgIFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZXFjdHItIiwgWExPQ0IoMTksQk9ULENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJlcWN0cisiLCBYTE9DQigxOSxCT1RQLENCRVEsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmVxY3RybCIsIFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZXFjdHJsLSIsWExPQ0IoMTksQk9ULENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJlcWN0cmwrIixYTE9DQigxOSxCT1RQLENCRVEsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnNvY3RyIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJic29jdHItIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJzb2N0cisiLCBYTE9DQigxOSxCT1RQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnNvY3RybCIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJic29jdHJsLSIsWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJzb2N0cmwrIixYTE9DQigxOSxCT1RQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnVuY3RyIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJidW5jdHItIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJ1bmN0cisiLCBYTE9DQigxOSxCT1RQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnVuY3RybCIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJidW5jdHJsLSIsWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJ1bmN0cmwrIixYTE9DQigxOSxCT1RQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmdlY3RyIiwgIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZ2VjdHItIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJnZWN0cisiLCBYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmdlY3RybCIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZ2VjdHJsLSIsWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJnZWN0cmwrIixYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5sY3RyIiwgIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmxjdHItIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJubGN0cisiLCBYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5sY3RybCIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmxjdHJsLSIsWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJubGN0cmwrIixYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmxlY3RyIiwgIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibGVjdHItIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJsZWN0cisiLCBYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmxlY3RybCIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibGVjdHJsLSIsWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJsZWN0cmwrIixYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5nY3RyIiwgIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmdjdHItIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuZ2N0cisiLCBYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5nY3RybCIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmdjdHJsLSIsWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuZ2N0cmwrIixYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5lY3RyIiwgIFhMT0NCKDE5LEJPRixDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmVjdHItIiwgWExPQ0IoMTksQk9GLENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuZWN0cisiLCBYTE9DQigxOSxCT0ZQLENCRVEsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5lY3RybCIsIFhMT0NCKDE5LEJPRixDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmVjdHJsLSIsWExPQ0IoMTksQk9GLENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuZWN0cmwrIixYTE9DQigxOSxCT0ZQLENCRVEsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5zY3RyIiwgIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibnNjdHItIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuc2N0cisiLCBYTE9DQigxOSxCT0ZQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5zY3RybCIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibnNjdHJsLSIsWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuc2N0cmwrIixYTE9DQigxOSxCT0ZQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm51Y3RyIiwgIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibnVjdHItIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJudWN0cisiLCBYTE9DQigxOSxCT0ZQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm51Y3RybCIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibnVjdHJsLSIsWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJudWN0cmwrIixYTE9DQigxOSxCT0ZQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnRjdHIiLCAgIFhMTygxOSxCT1QsNTI4LDApLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGN0ci0iLCAgWExPKDE5LEJPVCw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJ0Y3RyKyIsICBYTE8oMTksQk9UUCw1MjgsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRjdHJsIiwgIFhMTygxOSxCT1QsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGN0cmwtIiwgWExPKDE5LEJPVCw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJ0Y3RybCsiLCBYTE8oMTksQk9UUCw1MjgsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZjdHIiLCAgIFhMTygxOSxCT0YsNTI4LDApLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZmN0ci0iLCAgWExPKDE5LEJPRiw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJmY3RyKyIsICBYTE8oMTksQk9GUCw1MjgsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZjdHJsIiwgIFhMTygxOSxCT0YsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZmN0cmwtIiwgWExPKDE5LEJPRiw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJmY3RybCsiLCBYTE8oMTksQk9GUCw1MjgsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmNjdHIiLCAgIFhMTEsoMTksNTI4LDApLCAgICAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCTywgQkkgfSB9LAoteyAiYmNjdHItIiwgIFhMWUxLKDE5LDUyOCwwLDApLCAgWExZQkJfTUFTSywgIFBQQywJeyBCT0UsIEJJIH0gfSwKLXsgImJjY3RyKyIsICBYTFlMSygxOSw1MjgsMSwwKSwgIFhMWUJCX01BU0ssICBQUEMsCXsgQk9FLCBCSSB9IH0sCi17ICJiY2N0cmwiLCAgWExMSygxOSw1MjgsMSksICAgICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPLCBCSSB9IH0sCi17ICJiY2N0cmwtIiwgWExZTEsoMTksNTI4LDAsMSksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjdHJsKyIsIFhMWUxLKDE5LDUyOCwxLDEpLCAgWExZQkJfTUFTSywgIFBQQywJeyBCT0UsIEJJIH0gfSwKLXsgImJjYyIsICAgICBYTExLKDE5LDUyOCwwKSwgICAgIFhMQkJfTUFTSywgICBQV1JDT00sCXsgQk8sIEJJIH0gfSwKLXsgImJjY2wiLCAgICBYTExLKDE5LDUyOCwxKSwgICAgIFhMQkJfTUFTSywgICBQV1JDT00sCXsgQk8sIEJJIH0gfSwKLQoteyAicmx3aW1pIiwgIE0oMjAsMCksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW1pIiwgICBNKDIwLDApLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi0KLXsgInJsd2ltaS4iLCBNKDIwLDEpLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJybGltaS4iLCAgTSgyMCwxKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAotCi17ICJyb3Rsd2kiLCAgTU1FKDIxLDMxLDApLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoteyAiY2xybHdpIiwgIE1NRSgyMSwzMSwwKSwgTVNITUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIE1CIH0gfSwKLXsgInJsd2lubSIsICBNKDIxLDApLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJybGlubSIsICAgTSgyMSwwKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicm90bHdpLiIsIE1NRSgyMSwzMSwxKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSxSUyxTSCB9IH0sCi17ICJjbHJsd2kuIiwgTU1FKDIxLDMxLDEpLCBNU0hNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgTUIgfSB9LAoteyAicmx3aW5tLiIsIE0oMjEsMSksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW5tLiIsICBNKDIxLDEpLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi0KLXsgInJsbWkiLCAgICBNKDIyLDApLAlNX01BU0ssCQlNNjAxLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicmxtaS4iLCAgIE0oMjIsMSksCU1fTUFTSywJCU02MDEsCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi0KLXsgInJvdGx3IiwgICBNTUUoMjMsMzEsMCksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybHdubSIsICAgTSgyMywwKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicmxubSIsICAgIE0oMjMsMCksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLXsgInJvdGx3LiIsICBNTUUoMjMsMzEsMSksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybHdubS4iLCAgTSgyMywxKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicmxubS4iLCAgIE0oMjMsMSksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLQoteyAibm9wIiwgICAgIE9QKDI0KSwJMHhmZmZmZmZmZiwJUFBDQ09NLAkJeyAwIH0gfSwKLXsgIm9yaSIsICAgICBPUCgyNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJvcmlsIiwgICAgT1AoMjQpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJvcmlzIiwgICAgT1AoMjUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAib3JpdSIsICAgIE9QKDI1KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAieG9yaSIsICAgIE9QKDI2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgInhvcmlsIiwgICBPUCgyNiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgInhvcmlzIiwgICBPUCgyNyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJ4b3JpdSIsICAgT1AoMjcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJhbmRpLiIsICAgT1AoMjgpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAiYW5kaWwuIiwgIE9QKDI4KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAiYW5kaXMuIiwgIE9QKDI5KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgImFuZGl1LiIsICBPUCgyOSksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgInJvdGxkaSIsICBNRCgzMCwwLDApLCBNRE1CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCi17ICJjbHJsZGkiLCAgTUQoMzAsMCwwKSwgTURTSF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBNQjYgfSB9LAoteyAicmxkaWNsIiwgIE1EKDMwLDAsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLXsgInJvdGxkaS4iLCBNRCgzMCwwLDEpLCBNRE1CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCi17ICJjbHJsZGkuIiwgTUQoMzAsMCwxKSwgTURTSF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBNQjYgfSB9LAoteyAicmxkaWNsLiIsIE1EKDMwLDAsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLQoteyAicmxkaWNyIiwgIE1EKDMwLDEsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUU2IH0gfSwKLXsgInJsZGljci4iLCBNRCgzMCwxLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1FNiB9IH0sCi0KLXsgInJsZGljIiwgICBNRCgzMCwyLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi17ICJybGRpYy4iLCAgTUQoMzAsMiwxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAotCi17ICJybGRpbWkiLCAgTUQoMzAsMywwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAoteyAicmxkaW1pLiIsIE1EKDMwLDMsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLQoteyAicm90bGQiLCAgIE1EUygzMCw4LDApLCBNRFNNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybGRjbCIsICAgTURTKDMwLDgsMCksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUI2IH0gfSwKLXsgInJvdGxkLiIsICBNRFMoMzAsOCwxKSwgTURTTUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAicmxkY2wuIiwgIE1EUygzMCw4LDEpLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1CNiB9IH0sCi0KLXsgInJsZGNyIiwgICBNRFMoMzAsOSwwKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNRTYgfSB9LAoteyAicmxkY3IuIiwgIE1EUygzMCw5LDEpLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1FNiB9IH0sCi0KLXsgImNtcHciLCAgICBYQ01QTCgzMSwwLDApLCBYQ01QTF9NQVNLLCBQUENDT00sCQl7IE9CRiwgUkEsIFJCIH0gfSwKLXsgImNtcGQiLCAgICBYQ01QTCgzMSwwLDEpLCBYQ01QTF9NQVNLLCBQUEM2NCwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wIiwgICAgIFgoMzEsMCksCVhDTVBfTUFTSywJUFBDT05MWSwJeyBCRiwgTCwgUkEsIFJCIH0gfSwKLXsgImNtcCIsICAgICBYKDMxLDApLAlYQ01QTF9NQVNLLAlQV1JDT00sCQl7IEJGLCBSQSwgUkIgfSB9LAotCi17ICJ0d2xndCIsICAgWFRPKDMxLDQsVE9MR1QpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxndCIsICAgIFhUTygzMSw0LFRPTEdUKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bGx0IiwgICBYVE8oMzEsNCxUT0xMVCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGx0IiwgICAgWFRPKDMxLDQsVE9MTFQpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdlcSIsICAgIFhUTygzMSw0LFRPRVEpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGVxIiwgICAgIFhUTygzMSw0LFRPRVEpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsZ2UiLCAgIFhUTygzMSw0LFRPTEdFKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsZ2UiLCAgICBYVE8oMzEsNCxUT0xHRSksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xubCIsICAgWFRPKDMxLDQsVE9MTkwpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxubCIsICAgIFhUTygzMSw0LFRPTE5MKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bGxlIiwgICBYVE8oMzEsNCxUT0xMRSksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGxlIiwgICAgWFRPKDMxLDQsVE9MTEUpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbmciLCAgIFhUTygzMSw0LFRPTE5HKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbmciLCAgICBYVE8oMzEsNCxUT0xORyksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2d0IiwgICAgWFRPKDMxLDQsVE9HVCksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0Z3QiLCAgICAgWFRPKDMxLDQsVE9HVCksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2dlIiwgICAgWFRPKDMxLDQsVE9HRSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0Z2UiLCAgICAgWFRPKDMxLDQsVE9HRSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d25sIiwgICAgWFRPKDMxLDQsVE9OTCksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bmwiLCAgICAgWFRPKDMxLDQsVE9OTCksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2x0IiwgICAgWFRPKDMxLDQsVE9MVCksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bHQiLCAgICAgWFRPKDMxLDQsVE9MVCksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xlIiwgICAgWFRPKDMxLDQsVE9MRSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGUiLCAgICAgWFRPKDMxLDQsVE9MRSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d25nIiwgICAgWFRPKDMxLDQsVE9ORyksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bmciLCAgICAgWFRPKDMxLDQsVE9ORyksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d25lIiwgICAgWFRPKDMxLDQsVE9ORSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bmUiLCAgICAgWFRPKDMxLDQsVE9ORSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0cmFwIiwgICAgWFRPKDMxLDQsVE9VKSwgMHhmZmZmZmZmZiwJUFBDQ09NLAkJeyAwIH0gfSwKLXsgInR3IiwgICAgICBYKDMxLDQpLAlYX01BU0ssCQlQUENDT00sCQl7IFRPLCBSQSwgUkIgfSB9LAoteyAidCIsICAgICAgIFgoMzEsNCksCVhfTUFTSywJCVBXUkNPTSwJCXsgVE8sIFJBLCBSQiB9IH0sCi0KLXsgInN1YmZjIiwgICBYTygzMSw4LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZiIsICAgICAgWE8oMzEsOCwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViYyIsICAgIFhPKDMxLDgsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZjLiIsICBYTygzMSw4LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZi4iLCAgICAgWE8oMzEsOCwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViYy4iLCAgIFhPKDMxLDgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZjbyIsICBYTygzMSw4LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZm8iLCAgICAgWE8oMzEsOCwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViY28iLCAgIFhPKDMxLDgsMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZjby4iLCBYTygzMSw4LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZm8uIiwgICAgWE8oMzEsOCwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViY28uIiwgIFhPKDMxLDgsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLQoteyAibXVsaGR1IiwgIFhPKDMxLDksMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaGR1LiIsIFhPKDMxLDksMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJhZGRjIiwgICAgWE8oMzEsMTAsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImEiLCAgICAgICBYTygzMSwxMCwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkYy4iLCAgIFhPKDMxLDEwLDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhLiIsICAgICAgWE8oMzEsMTAsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGNvIiwgICBYTygzMSwxMCwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYW8iLCAgICAgIFhPKDMxLDEwLDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRjby4iLCAgWE8oMzEsMTAsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFvLiIsICAgICBYTygzMSwxMCwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtdWxod3UiLCAgWE8oMzEsMTEsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGh3dS4iLCBYTygzMSwxMSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtZmNyIiwgICAgWCgzMSwxOSksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlQgfSB9LAotCi17ICJsd2FyeCIsICAgWCgzMSwyMCksCVhfTUFTSywJCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxkeCIsICAgICBYKDMxLDIxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsd3p4IiwgICAgWCgzMSwyMyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJseCIsICAgICAgWCgzMSwyMyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNsdyIsICAgICBYUkMoMzEsMjQsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsIiwgICAgICBYUkMoMzEsMjQsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsdy4iLCAgICBYUkMoMzEsMjQsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsLiIsICAgICBYUkMoMzEsMjQsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiY250bHp3IiwgIFhSQygzMSwyNiwwKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImNudGx6IiwgICBYUkMoMzEsMjYsMCksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJjbnRsencuIiwgWFJDKDMxLDI2LDEpLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHouIiwgIFhSQygzMSwyNiwxKSwgWFJCX01BU0ssIAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCi0KLXsgInNsZCIsICAgICBYUkMoMzEsMjcsMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xkLiIsICAgIFhSQygzMSwyNywxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImFuZCIsICAgICBYUkMoMzEsMjgsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgImFuZC4iLCAgICBYUkMoMzEsMjgsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAibWFza2ciLCAgIFhSQygzMSwyOSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm1hc2tnLiIsICBYUkMoMzEsMjksMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImNtcGx3IiwgICBYQ01QTCgzMSwzMiwwKSwgWENNUExfTUFTSywgUFBDQ09NLAl7IE9CRiwgUkEsIFJCIH0gfSwKLXsgImNtcGxkIiwgICBYQ01QTCgzMSwzMiwxKSwgWENNUExfTUFTSywgUFBDNjQsCQl7IE9CRiwgUkEsIFJCIH0gfSwKLXsgImNtcGwiLCAgICBYKDMxLDMyKSwJWENNUF9NQVNLLAkgUFBDT05MWSwJeyBCRiwgTCwgUkEsIFJCIH0gfSwKLXsgImNtcGwiLCAgICBYKDMxLDMyKSwJWENNUExfTUFTSywJIFBXUkNPTSwJeyBCRiwgUkEsIFJCIH0gfSwKLQoteyAic3ViZiIsICAgIFhPKDMxLDQwLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWIiLCAgICAgWE8oMzEsNDAsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmYuIiwgICBYTygzMSw0MCwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViLiIsICAgIFhPKDMxLDQwLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmbyIsICAgWE8oMzEsNDAsMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1Ym8iLCAgICBYTygzMSw0MCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZm8uIiwgIFhPKDMxLDQwLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJvLiIsICAgWE8oMzEsNDAsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLQoteyAibGR1eCIsICAgIFgoMzEsNTMpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJkY2JzdCIsICAgWCgzMSw1NCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImx3enV4IiwgICBYKDMxLDU1KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCi17ICJsdXgiLCAgICAgWCgzMSw1NSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImNudGx6ZCIsICBYUkMoMzEsNTgsMCksIFhSQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTIH0gfSwKLXsgImNudGx6ZC4iLCBYUkMoMzEsNTgsMSksIFhSQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTIH0gfSwKLQoteyAiYW5kYyIsICAgIFhSQygzMSw2MCwwKSwgWF9NQVNLLAlDT00sCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJhbmRjLiIsICAgWFJDKDMxLDYwLDEpLCBYX01BU0ssCUNPTSwJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAidGRsZ3QiLCAgIFhUTygzMSw2OCxUT0xHVCksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGx0IiwgICBYVE8oMzEsNjgsVE9MTFQpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGVxIiwgICAgWFRPKDMxLDY4LFRPRVEpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsZ2UiLCAgIFhUTygzMSw2OCxUT0xHRSksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbG5sIiwgICBYVE8oMzEsNjgsVE9MTkwpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxsZSIsICAgWFRPKDMxLDY4LFRPTExFKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbmciLCAgIFhUTygzMSw2OCxUT0xORyksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkZ3QiLCAgICBYVE8oMzEsNjgsVE9HVCksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGdlIiwgICAgWFRPKDMxLDY4LFRPR0UpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRubCIsICAgIFhUTygzMSw2OCxUT05MKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbHQiLCAgICBYVE8oMzEsNjgsVE9MVCksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxlIiwgICAgWFRPKDMxLDY4LFRPTEUpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRuZyIsICAgIFhUTygzMSw2OCxUT05HKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbmUiLCAgICBYVE8oMzEsNjgsVE9ORSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZCIsCSAgICAgWCgzMSw2OCksCVhfTUFTSywJCSBQUEM2NCwJCXsgVE8sIFJBLCBSQiB9IH0sCi0KLXsgIm11bGhkIiwgICBYTygzMSw3MywwLDApLCBYT19NQVNLLAkgUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaGQuIiwgIFhPKDMxLDczLDAsMSksIFhPX01BU0ssCSBQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm11bGh3IiwgICBYTygzMSw3NSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaHcuIiwgIFhPKDMxLDc1LDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mbXNyIiwgICBYKDMxLDgzKSwJWFJBUkJfTUFTSywJQ09NLAkJeyBSVCB9IH0sCi0KLXsgImxkYXJ4IiwgICBYKDMxLDg0KSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkY2JmIiwgICAgWCgzMSw4NiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImxiengiLCAgICBYKDMxLDg3KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibmVnIiwgICAgIFhPKDMxLDEwNCwwLDApLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5lZy4iLCAgICBYTygzMSwxMDQsMCwxKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCi17ICJuZWdvIiwgICAgWE8oMzEsMTA0LDEsMCksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAibmVnby4iLCAgIFhPKDMxLDEwNCwxLDEpLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibXVsIiwgICAgIFhPKDMxLDEwNywwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bC4iLCAgICBYTygzMSwxMDcsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxvIiwgICAgWE8oMzEsMTA3LDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsby4iLCAgIFhPKDMxLDEwNywxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiY2xmIiwgICAgIFgoMzEsMTE4KSwgWFJCX01BU0ssCVBPV0VSLAkJeyBSVCwgUkEgfSB9LAotCi17ICJsYnp1eCIsICAgWCgzMSwxMTkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAibm90IiwgICAgIFhSQygzMSwxMjQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJub3IiLCAgICAgWFJDKDMxLDEyNCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibm90LiIsICAgIFhSQygzMSwxMjQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJub3IuIiwgICAgWFJDKDMxLDEyNCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ3cnRlZSIsICAgWCgzMSwxMzEpLAlYUkFSQl9NQVNLLAlQUEM0MDMsCQl7IFJTIH0gfSwKLQoteyAic3ViZmUiLCAgIFhPKDMxLDEzNiwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2ZlIiwgICAgIFhPKDMxLDEzNiwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViZmUuIiwgIFhPKDMxLDEzNiwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2ZlLiIsICAgIFhPKDMxLDEzNiwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViZmVvIiwgIFhPKDMxLDEzNiwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2ZlbyIsICAgIFhPKDMxLDEzNiwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViZmVvLiIsIFhPKDMxLDEzNiwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2Zlby4iLCAgIFhPKDMxLDEzNiwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJhZGRlIiwgICAgWE8oMzEsMTM4LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZSIsICAgICAgWE8oMzEsMTM4LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRlLiIsICAgWE8oMzEsMTM4LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZS4iLCAgICAgWE8oMzEsMTM4LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRlbyIsICAgWE8oMzEsMTM4LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZW8iLCAgICAgWE8oMzEsMTM4LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRlby4iLCAgWE8oMzEsMTM4LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZW8uIiwgICAgWE8oMzEsMTM4LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm10Y3IiLCAgICBYRlhNKDMxLDE0NCwweGZmKSwgWEZYRlhNX01BU0t8RlhNX01BU0ssIENPTSwJeyBSUyB9fSwKLXsgIm10Y3JmIiwgICBYKDMxLDE0NCksCVhGWEZYTV9NQVNLLAlDT00sCQl7IEZYTSwgUlMgfSB9LAotCi17ICJtdG1zciIsICAgWCgzMSwxNDYpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJTIH0gfSwKLQoteyAic3RkeCIsICAgIFgoMzEsMTQ5KSwgWF9NQVNLLAkJUFBDNjQsCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdHdjeC4iLCAgWFJDKDMxLDE1MCwxKSwgWF9NQVNLLAlQUEMsCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdHd4IiwgICAgWCgzMSwxNTEpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoteyAic3R4IiwgICAgIFgoMzEsMTUxKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic2xxIiwgICAgIFhSQygzMSwxNTIsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbHEuIiwgICAgWFJDKDMxLDE1MiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic2xlIiwgICAgIFhSQygzMSwxNTMsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbGUuIiwgICAgWFJDKDMxLDE1MywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAid3J0ZWVpIiwgIFgoMzEsMTYzKSwJWEVfTUFTSywJUFBDNDAzLAkJeyBFIH0gfSwKLQoteyAic3RkdXgiLCAgIFgoMzEsMTgxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJTLCBSQVMsIFJCIH0gfSwKLQoteyAic3R3dXgiLCAgIFgoMzEsMTgzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCi17ICJzdHV4IiwgICAgWCgzMSwxODMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzbGlxIiwgICAgWFJDKDMxLDE4NCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNsaXEuIiwgICBYUkMoMzEsMTg0LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJzdWJmemUiLCAgWE8oMzEsMjAwLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2Z6ZSIsICAgIFhPKDMxLDIwMCwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZ6ZS4iLCBYTygzMSwyMDAsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplLiIsICAgWE8oMzEsMjAwLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZnplbyIsIFhPKDMxLDIwMCwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmemVvIiwgICBYTygzMSwyMDAsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmemVvLiIsWE8oMzEsMjAwLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2Z6ZW8uIiwgIFhPKDMxLDIwMCwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAiYWRkemUiLCAgIFhPKDMxLDIwMiwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImF6ZSIsICAgICBYTygzMSwyMDIsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGR6ZS4iLCAgWE8oMzEsMjAyLDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplLiIsICAgIFhPKDMxLDIwMiwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZHplbyIsICBYTygzMSwyMDIsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhemVvIiwgICAgWE8oMzEsMjAyLDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkemVvLiIsIFhPKDMxLDIwMiwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImF6ZW8uIiwgICBYTygzMSwyMDIsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi0KLXsgIm10c3IiLCAgICBYKDMxLDIxMCksCVhSQl9NQVNLfCgxPDwyMCksIENPTTMyLAl7IFNSLCBSUyB9IH0sCi0KLXsgInN0ZGN4LiIsICBYUkMoMzEsMjE0LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3RieCIsICAgIFgoMzEsMjE1KSwJWF9NQVNLLAkJQ09NLAl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzbGxxIiwgICAgWFJDKDMxLDIxNiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsbHEuIiwgICBYUkMoMzEsMjE2LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzbGVxIiwgICAgWFJDKDMxLDIxNywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsZXEuIiwgICBYUkMoMzEsMjE3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzdWJmbWUiLCAgWE8oMzEsMjMyLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2ZtZSIsICAgIFhPKDMxLDIzMiwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZtZS4iLCBYTygzMSwyMzIsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lLiIsICAgWE8oMzEsMjMyLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZm1lbyIsIFhPKDMxLDIzMiwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmbWVvIiwgICBYTygzMSwyMzIsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmbWVvLiIsWE8oMzEsMjMyLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2ZtZW8uIiwgIFhPKDMxLDIzMiwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibXVsbGQiLCAgIFhPKDMxLDIzMywwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsZC4iLCAgWE8oMzEsMjMzLDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGxkbyIsICBYTygzMSwyMzMsMSwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbGRvLiIsIFhPKDMxLDIzMywxLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZG1lIiwgICBYTygzMSwyMzQsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhbWUiLCAgICAgWE8oMzEsMjM0LDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkbWUuIiwgIFhPKDMxLDIzNCwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZS4iLCAgICBYTygzMSwyMzQsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGRtZW8iLCAgWE8oMzEsMjM0LDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYW1lbyIsICAgIFhPKDMxLDIzNCwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZG1lby4iLCBYTygzMSwyMzQsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhbWVvLiIsICAgWE8oMzEsMjM0LDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdWxsdyIsICAgWE8oMzEsMjM1LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxzIiwgICAgWE8oMzEsMjM1LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsdy4iLCAgWE8oMzEsMjM1LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxzLiIsICAgWE8oMzEsMjM1LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsd28iLCAgWE8oMzEsMjM1LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxzbyIsICAgWE8oMzEsMjM1LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsd28uIiwgWE8oMzEsMjM1LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxzby4iLCAgWE8oMzEsMjM1LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm10c3JpbiIsICBYKDMxLDI0MiksCVhSQV9NQVNLLAlQUEMzMiwJCXsgUlMsIFJCIH0gfSwKLXsgIm10c3JpIiwgICBYKDMxLDI0MiksCVhSQV9NQVNLLAlQT1dFUjMyLAl7IFJTLCBSQiB9IH0sCi0KLXsgImRjYnRzdCIsICBYKDMxLDI0NiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInN0YnV4IiwgICBYKDMxLDI0NyksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBUywgUkIgfSB9LAotCi17ICJzbGxpcSIsICAgWFJDKDMxLDI0OCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNsbGlxLiIsICBYUkMoMzEsMjQ4LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJkb3oiLCAgICAgWE8oMzEsMjY0LDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZG96LiIsICAgIFhPKDMxLDI2NCwwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRvem8iLCAgICBYTygzMSwyNjQsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkb3pvLiIsICAgWE8oMzEsMjY0LDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJhZGQiLCAgICAgWE8oMzEsMjY2LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJjYXgiLCAgICAgWE8oMzEsMjY2LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGQuIiwgICAgWE8oMzEsMjY2LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJjYXguIiwgICAgWE8oMzEsMjY2LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRvIiwgICAgWE8oMzEsMjY2LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJjYXhvIiwgICAgWE8oMzEsMjY2LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRvLiIsICAgWE8oMzEsMjY2LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJjYXhvLiIsICAgWE8oMzEsMjY2LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxzY2J4IiwgICBYUkMoMzEsMjc3LDApLCBYX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibHNjYnguIiwgIFhSQygzMSwyNzcsMSksIFhfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjYnQiLCAgICBYKDMxLDI3OCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImxoengiLCAgICBYKDMxLDI3OSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImljYnQiLCAgICBYKDMxLDI2MiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImVxdiIsICAgICBYUkMoMzEsMjg0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJlcXYuIiwgICAgWFJDKDMxLDI4NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ0bGJpZSIsICAgWCgzMSwzMDYpLAlYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKLXsgInRsYmkiLCAgICBYKDMxLDMwNiksCVhSVF9NQVNLLAlQT1dFUiwJCXsgUkEsIFJCIH0gfSwKLQoteyAiZWNpd3giLCAgIFgoMzEsMzEwKSwgWF9NQVNLLAkJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibGh6dXgiLCAgIFgoMzEsMzExKSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgInhvciIsICAgICBYUkMoMzEsMzE2LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJ4b3IuIiwgICAgWFJDKDMxLDMxNiwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtZmV4aXNyIiwgWFNQUigzMSwzMjMsNjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmV4aWVyIiwgWFNQUigzMSwzMjMsNjYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyMCIsICAgWFNQUigzMSwzMjMsMTI4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjEiLCAgIFhTUFIoMzEsMzIzLDEyOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIyIiwgICBYU1BSKDMxLDMyMywxMzApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyMyIsICAgWFNQUigzMSwzMjMsMTMxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjQiLCAgIFhTUFIoMzEsMzIzLDEzMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnI1IiwgICBYU1BSKDMxLDMyMywxMzMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNiIsICAgWFNQUigzMSwzMjMsMTM0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjciLCAgIFhTUFIoMzEsMzIzLDEzNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYmVhciIsICBYU1BSKDMxLDMyMywxNDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJlc3IiLCAgWFNQUigzMSwzMjMsMTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpb2NyIiwgIFhTUFIoMzEsMzIzLDE2MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3IwIiwgWFNQUigzMSwzMjMsMTkyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjdDAiLCBYU1BSKDMxLDMyMywxOTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWRhMCIsIFhTUFIoMzEsMzIzLDE5NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc2EwIiwgWFNQUigzMSwzMjMsMTk1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjYzAiLCBYU1BSKDMxLDMyMywxOTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNyMSIsIFhTUFIoMzEsMzIzLDIwMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3QxIiwgWFNQUigzMSwzMjMsMjAxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFkYTEiLCBYU1BSKDMxLDMyMywyMDIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNhMSIsIFhTUFIoMzEsMzIzLDIwMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY2MxIiwgWFNQUigzMSwzMjMsMjA0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjIiLCBYU1BSKDMxLDMyMywyMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MiIsIFhTUFIoMzEsMzIzLDIwOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGEyIiwgWFNQUigzMSwzMjMsMjEwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTIiLCBYU1BSKDMxLDMyMywyMTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMiIsIFhTUFIoMzEsMzIzLDIxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3IzIiwgWFNQUigzMSwzMjMsMjE2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjdDMiLCBYU1BSKDMxLDMyMywyMTcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWRhMyIsIFhTUFIoMzEsMzIzLDIxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc2EzIiwgWFNQUigzMSwzMjMsMjE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjYzMiLCBYU1BSKDMxLDMyMywyMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNyIiwgWFNQUigzMSwzMjMsMjI0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkY3IiLCAgIFgoMzEsMzIzKSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgU1BSIH0gfSwKLQoteyAiZGl2IiwgICAgIFhPKDMxLDMzMSwwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdi4iLCAgICBYTygzMSwzMzEsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZvIiwgICAgWE8oMzEsMzMxLDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2by4iLCAgIFhPKDMxLDMzMSwxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibWZtcSIsICAgICBYU1BSKDMxLDMzOSwwKSwgICBYU1BSX01BU0ssIE02MDEsCXsgUlQgfSB9LAoteyAibWZ4ZXIiLCAgICBYU1BSKDMxLDMzOSwxKSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZydGN1IiwgICBYU1BSKDMxLDMzOSw0KSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZydGNsIiwgICBYU1BSKDMxLDMzOSw1KSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZkZWMiLCAgICBYU1BSKDMxLDMzOSw2KSwgICBYU1BSX01BU0ssIE1GREVDMSwJeyBSVCB9IH0sCi17ICJtZmxyIiwgICAgIFhTUFIoMzEsMzM5LDgpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmN0ciIsICAgIFhTUFIoMzEsMzM5LDkpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnRpZCIsICAgIFhTUFIoMzEsMzM5LDE3KSwgIFhTUFJfTUFTSywgUE9XRVIsCXsgUlQgfSB9LAoteyAibWZkc2lzciIsICBYU1BSKDMxLDMzOSwxOCksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZkYXIiLCAgICBYU1BSKDMxLDMzOSwxOSksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZkZWMiLCAgICBYU1BSKDMxLDMzOSwyMiksICBYU1BSX01BU0ssIE1GREVDMiwJeyBSVCB9IH0sCi17ICJtZnNkcjAiLCAgIFhTUFIoMzEsMzM5LDI0KSwgIFhTUFJfTUFTSywgUE9XRVIsCXsgUlQgfSB9LAoteyAibWZzZHIxIiwgICBYU1BSKDMxLDMzOSwyNSksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZzcnIwIiwgICBYU1BSKDMxLDMzOSwyNiksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZzcnIxIiwgICBYU1BSKDMxLDMzOSwyNyksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZjbXBhIiwgICBYU1BSKDMxLDMzOSwxNDQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGIiLCAgIFhTUFIoMzEsMzM5LDE0NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wYyIsICAgWFNQUigzMSwzMzksMTQ2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBkIiwgICBYU1BSKDMxLDMzOSwxNDcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmljciIsICAgIFhTUFIoMzEsMzM5LDE0OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGVyIiwgICAgWFNQUigzMSwzMzksMTQ5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjb3VudGEiLCBYU1BSKDMxLDMzOSwxNTApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNvdW50YiIsIFhTUFIoMzEsMzM5LDE1MSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wZSIsICAgWFNQUigzMSwzMzksMTUyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBmIiwgICBYU1BSKDMxLDMzOSwxNTMpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGciLCAgIFhTUFIoMzEsMzM5LDE1NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21waCIsICAgWFNQUigzMSwzMzksMTU1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZsY3RybDEiLCBYU1BSKDMxLDMzOSwxNTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmxjdHJsMiIsIFhTUFIoMzEsMzM5LDE1NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWN0cmwiLCAgWFNQUigzMSwzMzksMTU4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZiYXIiLCAgICBYU1BSKDMxLDMzOSwxNTkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZnNwcmciLCAgIFhTUFIoMzEsMzM5LDI3MiksIFhTUFJHX01BU0ssIFBQQywJeyBSVCwgU1BSRyB9IH0sCi17ICJtZnNwcmcwIiwgIFhTUFIoMzEsMzM5LDI3MiksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnNwcmcxIiwgIFhTUFIoMzEsMzM5LDI3MyksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnNwcmcyIiwgIFhTUFIoMzEsMzM5LDI3NCksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnNwcmczIiwgIFhTUFIoMzEsMzM5LDI3NSksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZmFzciIsICAgIFhTUFIoMzEsMzM5LDI4MCksIFhTUFJfTUFTSywgUFBDNjQsCXsgUlQgfSB9LAoteyAibWZlYXIiLCAgICBYU1BSKDMxLDMzOSwyODIpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZwdnIiLCAgICBYU1BSKDMxLDMzOSwyODcpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZpYmF0dSIsICBYU1BSKDMxLDMzOSw1MjgpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKLXsgIm1maWJhdGwiLCAgWFNQUigzMSwzMzksNTI5KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCi17ICJtZmRiYXR1IiwgIFhTUFIoMzEsMzM5LDUzNiksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZkYmF0bCIsICBYU1BSKDMxLDMzOSw1MzcpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKLXsgIm1maWNfY3N0IiwgWFNQUigzMSwzMzksNTYwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZpY19hZHIiLCBYU1BSKDMxLDMzOSw1NjEpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmljX2RhdCIsIFhTUFIoMzEsMzM5LDU2MiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGNfY3N0IiwgWFNQUigzMSwzMzksNTY4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkY19hZHIiLCBYU1BSKDMxLDMzOSw1NjkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRjX2RhdCIsIFhTUFIoMzEsMzM5LDU3MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZHBkciIsICAgWFNQUigzMSwzMzksNjMwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkcGlyIiwgICBYU1BSKDMxLDMzOSw2MzEpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmltbXIiLCAgIFhTUFIoMzEsMzM5LDYzOCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfY3RyIiwgWFNQUigzMSwzMzksNzg0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9hcCIsICBYU1BSKDMxLDMzOSw3ODYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2VwbiIsIFhTUFIoMzEsMzM5LDc4NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfdHdjIiwgWFNQUigzMSwzMzksNzg5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9ycG4iLCBYU1BSKDMxLDMzOSw3OTApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2N0ciIsIFhTUFIoMzEsMzM5LDc5MiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbV9jYXNpZCIsWFNQUigzMSwzMzksNzkzKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9hcCIsICBYU1BSKDMxLDMzOSw3OTQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2VwbiIsIFhTUFIoMzEsMzM5LDc5NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfdHdiIiwgWFNQUigzMSwzMzksNzk2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF90d2MiLCBYU1BSKDMxLDMzOSw3OTcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX3JwbiIsIFhTUFIoMzEsMzM5LDc5OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbV90dyIsICAgWFNQUigzMSwzMzksNzk5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9kYmNhbSIsWFNQUigzMSwzMzksODE2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9kYnJhbTAiLFhTUFIoMzEsMzM5LDgxNyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfZGJyYW0xIixYU1BSKDMxLDMzOSw4MTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2RiY2FtIiwgWFNQUigzMSwzMzksODI0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9kYnJhbTAiLFhTUFIoMzEsMzM5LDgyNSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZGJyYW0xIixYU1BSKDMxLDMzOSw4MjYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZnpwciIsICAgWFNQUigzMSwzMzksOTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwaWQiLCAgIFhTUFIoMzEsMzM5LDk0NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maWNkYmRyIixYU1BSKDMxLDMzOSw5NzkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnVtbWNyMCIsCVhTUFIoMzEsMzM5LDkzNiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVwbWMxIiwJWFNQUigzMSwzMzksOTM3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXBtYzIiLAlYU1BSKDMxLDMzOSw5MzgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1c2lhIiwJWFNQUigzMSwzMzksOTM5KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdW1tY3IxIiwJWFNQUigzMSwzMzksOTQwKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXBtYzMiLAlYU1BSKDMxLDMzOSw5NDEpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jNCIsCVhTUFIoMzEsMzM5LDk0MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZm1tY3IwIiwJWFNQUigzMSwzMzksOTUyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jMSIsCVhTUFIoMzEsMzM5LDk1MyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnBtYzIiLAlYU1BSKDMxLDMzOSw5NTQpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZzaWEiLAlYU1BSKDMxLDMzOSw5NTUpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZtbWNyMSIsCVhTUFIoMzEsMzM5LDk1NiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnBtYzMiLAlYU1BSKDMxLDMzOSw5NTcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZwbWM0IiwJWFNQUigzMSwzMzksOTU4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mZXNyIiwgICBYU1BSKDMxLDMzOSw5ODApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRlYXIiLCAgWFNQUigzMSwzMzksOTgxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZldnByIiwgIFhTUFIoMzEsMzM5LDk4MiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mY2RiY3IiLCBYU1BSKDMxLDMzOSw5ODMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRzciIsICAgWFNQUigzMSwzMzksOTg0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZ0Y3IiLCAgIFhTUFIoMzEsMzM5LDk4NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGl0IiwgICBYU1BSKDMxLDMzOSw5ODcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRiaGkiLCAgWFNQUigzMSwzMzksOTg4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZ0YmxvIiwgIFhTUFIoMzEsMzM5LDk4OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mc3JyMiIsICBYU1BSKDMxLDMzOSw5OTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnNycjMiLCAgWFNQUigzMSwzMzksOTkxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkYnNyIiwgIFhTUFIoMzEsMzM5LDEwMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmlhYzEiLCAgWFNQUigzMSwzMzksMTAxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maWFjMiIsICBYU1BSKDMxLDMzOSwxMDEzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkYWMxIiwgIFhTUFIoMzEsMzM5LDEwMTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRhYzIiLCAgWFNQUigzMSwzMzksMTAxNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGNjciIsICBYU1BSKDMxLDMzOSwxMDE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpY2NyIiwgIFhTUFIoMzEsMzM5LDEwMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBibDEiLCAgWFNQUigzMSwzMzksMTAyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJ1MSIsICBYU1BSKDMxLDMzOSwxMDIxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwYmwyIiwgIFhTUFIoMzEsMzM5LDEwMjIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBidTIiLCAgWFNQUigzMSwzMzksMTAyMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mbDJjciIsCVhTUFIoMzEsMzM5LDEwMTcpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZmljdGMiLAlYU1BSKDMxLDMzOSwxMDE5KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ0aHJtMSIsCVhTUFIoMzEsMzM5LDEwMjApLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnRocm0yIiwJWFNQUigzMSwzMzksMTAyMSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdGhybTMiLAlYU1BSKDMxLDMzOSwxMDIyKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZzcHIiLCAgIFgoMzEsMzM5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgU1BSIH0gfSwKLQoteyAibHdheCIsICAgIFgoMzEsMzQxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsaGF4IiwgICAgWCgzMSwzNDMpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkY2NjaSIsICAgWCgzMSw0NTQpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJhYnMiLCAgICAgWE8oMzEsMzYwLDAsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgImFicy4iLCAgICBYTygzMSwzNjAsMCwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAiYWJzbyIsICAgIFhPKDMxLDM2MCwxLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJhYnNvLiIsICAgWE8oMzEsMzYwLDEsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLQoteyAiZGl2cyIsICAgIFhPKDMxLDM2MywwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnMuIiwgICBYTygzMSwzNjMsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZzbyIsICAgWE8oMzEsMzYzLDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2c28uIiwgIFhPKDMxLDM2MywxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAidGxiaWEiLCAgIFgoMzEsMzcwKSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLQoteyAibWZ0YnUiLCAgIFhTUFIoMzEsMzcxLDI2OSksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnRiIiwgICAgWCgzMSwzNzEpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBUQlIgfSB9LAotCi17ICJsd2F1eCIsICAgWCgzMSwzNzMpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJsaGF1eCIsICAgWCgzMSwzNzUpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAic3RoeCIsICAgIFgoMzEsNDA3KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAibGZxeCIsICAgIFgoMzEsNzkxKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxmcXV4IiwgICBYKDMxLDgyMyksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJULCBSQSwgUkIgfSB9LAotCi17ICJzdGZxeCIsICAgWCgzMSw5MTkpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAic3RmcXV4IiwgIFgoMzEsOTUxKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlMsIFJBLCBSQiB9IH0sCi0KLXsgIm9yYyIsICAgICBYUkMoMzEsNDEyLDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJvcmMuIiwgICAgWFJDKDMxLDQxMiwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmFkaSIsICAgWFMoMzEsNDEzLDApLCBYU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAoteyAic3JhZGkuIiwgIFhTKDMxLDQxMywxKSwgWFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLQoteyAic2xiaWUiLCAgIFgoMzEsNDM0KSwJWFJUUkFfTUFTSywJUFBDNjQsCQl7IFJCIH0gfSwKLQoteyAiZWNvd3giLCAgIFgoMzEsNDM4KSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic3RodXgiLCAgIFgoMzEsNDM5KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCi0KLXsgIm1yIiwJICAgICBYUkMoMzEsNDQ0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQlMgfSB9LAoteyAib3IiLCAgICAgIFhSQygzMSw0NDQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm1yLiIsICAgICBYUkMoMzEsNDQ0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQlMgfSB9LAoteyAib3IuIiwgICAgIFhSQygzMSw0NDQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAibXRleGlzciIsIFhTUFIoMzEsNDUxLDY0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRleGllciIsIFhTUFIoMzEsNDUxLDY2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjAiLCAgIFhTUFIoMzEsNDUxLDEyOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnIxIiwgICBYU1BSKDMxLDQ1MSwxMjkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMiIsICAgWFNQUigzMSw0NTEsMTMwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjMiLCAgIFhTUFIoMzEsNDUxLDEzMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnI0IiwgICBYU1BSKDMxLDQ1MSwxMzIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyNSIsICAgWFNQUigzMSw0NTEsMTMzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjYiLCAgIFhTUFIoMzEsNDUxLDEzNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnI3IiwgICBYU1BSKDMxLDQ1MSwxMzUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJlYXIiLCAgWFNQUigzMSw0NTEsMTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRiZXNyIiwgIFhTUFIoMzEsNDUxLDE0NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aW9jciIsICBYU1BSKDMxLDQ1MSwxNjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNyMCIsIFhTUFIoMzEsNDUxLDE5MiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3QwIiwgWFNQUigzMSw0NTEsMTkzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFkYTAiLCBYU1BSKDMxLDQ1MSwxOTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNhMCIsIFhTUFIoMzEsNDUxLDE5NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY2MwIiwgWFNQUigzMSw0NTEsMTk2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjcjEiLCBYU1BSKDMxLDQ1MSwyMDApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWN0MSIsIFhTUFIoMzEsNDUxLDIwMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hZGExIiwgWFNQUigzMSw0NTEsMjAyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzYTEiLCBYU1BSKDMxLDQ1MSwyMDMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNjMSIsIFhTUFIoMzEsNDUxLDIwNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IyIiwgWFNQUigzMSw0NTEsMjA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDIiLCBYU1BSKDMxLDQ1MSwyMDkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMiIsIFhTUFIoMzEsNDUxLDIxMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2EyIiwgWFNQUigzMSw0NTEsMjExKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzIiLCBYU1BSKDMxLDQ1MSwyMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNyMyIsIFhTUFIoMzEsNDUxLDIxNiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3QzIiwgWFNQUigzMSw0NTEsMjE3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFkYTMiLCBYU1BSKDMxLDQ1MSwyMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNhMyIsIFhTUFIoMzEsNDUxLDIxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY2MzIiwgWFNQUigzMSw0NTEsMjIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzciIsIFhTUFIoMzEsNDUxLDIyNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dW1tY3IwIiwJWFNQUigzMSw0NTEsOTM2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXBtYzEiLAlYU1BSKDMxLDQ1MSw5MzcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1cG1jMiIsCVhTUFIoMzEsNDUxLDkzOCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVzaWEiLAlYU1BSKDMxLDQ1MSw5MzkpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1bW1jcjEiLAlYU1BSKDMxLDQ1MSw5NDApLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1cG1jMyIsCVhTUFIoMzEsNDUxLDk0MSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWM0IiwJWFNQUigzMSw0NTEsOTQyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10bW1jcjAiLAlYU1BSKDMxLDQ1MSw5NTIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWMxIiwJWFNQUigzMSw0NTEsOTUzKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10cG1jMiIsCVhTUFIoMzEsNDUxLDk1NCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHNpYSIsCVhTUFIoMzEsNDUxLDk1NSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdG1tY3IxIiwJWFNQUigzMSw0NTEsOTU2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10cG1jMyIsCVhTUFIoMzEsNDUxLDk1NyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHBtYzQiLAlYU1BSKDMxLDQ1MSw5NTgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRsMmNyIiwJWFNQUigzMSw0NTEsMTAxNyksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10aWN0YyIsCVhTUFIoMzEsNDUxLDEwMTkpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHRocm0xIiwJWFNQUigzMSw0NTEsMTAyMCksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dGhybTIiLAlYU1BSKDMxLDQ1MSwxMDIxKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR0aHJtMyIsCVhTUFIoMzEsNDUxLDEwMjIpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdGRjciIsICAgWCgzMSw0NTEpLAlYX01BU0ssCQlQUEMsCQl7IFNQUiwgUlMgfSB9LAotCi17ICJkaXZkdSIsICAgWE8oMzEsNDU3LDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmR1LiIsICBYTygzMSw0NTcsMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZHVvIiwgIFhPKDMxLDQ1NywxLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkdW8uIiwgWE8oMzEsNDU3LDEsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGl2d3UiLCAgIFhPKDMxLDQ1OSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d3UuIiwgIFhPKDMxLDQ1OSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d3VvIiwgIFhPKDMxLDQ1OSwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d3VvLiIsIFhPKDMxLDQ1OSwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtdG1xIiwgICAgWFNQUigzMSw0NjcsMCksICAgWFNQUl9NQVNLLCAgICBNNjAxLAl7IFJTIH0gfSwKLXsgIm10eGVyIiwgICBYU1BSKDMxLDQ2NywxKSwgICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGxyIiwgICAgWFNQUigzMSw0NjcsOCksICAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRjdHIiLCAgIFhTUFIoMzEsNDY3LDkpLCAgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10dGlkIiwgICBYU1BSKDMxLDQ2NywxNyksICBYU1BSX01BU0ssICAgIFBPV0VSLAl7IFJTIH0gfSwKLXsgIm10ZHNpc3IiLCBYU1BSKDMxLDQ2NywxOCksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGRhciIsICAgWFNQUigzMSw0NjcsMTkpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRydGN1IiwgIFhTUFIoMzEsNDY3LDIwKSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10cnRjbCIsICBYU1BSKDMxLDQ2NywyMSksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGRlYyIsICAgWFNQUigzMSw0NjcsMjIpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRzZHIwIiwgIFhTUFIoMzEsNDY3LDI0KSwgIFhTUFJfTUFTSywgICAgUE9XRVIsCXsgUlMgfSB9LAoteyAibXRzZHIxIiwgIFhTUFIoMzEsNDY3LDI1KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10c3JyMCIsICBYU1BSKDMxLDQ2NywyNiksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHNycjEiLCAgWFNQUigzMSw0NjcsMjcpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRjbXBhIiwgICBYU1BSKDMxLDQ2NywxNDQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGIiLCAgIFhTUFIoMzEsNDY3LDE0NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wYyIsICAgWFNQUigzMSw0NjcsMTQ2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBkIiwgICBYU1BSKDMxLDQ2NywxNDcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGljciIsICAgIFhTUFIoMzEsNDY3LDE0OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10ZGVyIiwgICAgWFNQUigzMSw0NjcsMTQ5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjb3VudGEiLCBYU1BSKDMxLDQ2NywxNTApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNvdW50YiIsIFhTUFIoMzEsNDY3LDE1MSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wZSIsICAgWFNQUigzMSw0NjcsMTUyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBmIiwgICBYU1BSKDMxLDQ2NywxNTMpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGciLCAgIFhTUFIoMzEsNDY3LDE1NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21waCIsICAgWFNQUigzMSw0NjcsMTU1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRsY3RybDEiLCBYU1BSKDMxLDQ2NywxNTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGxjdHJsMiIsIFhTUFIoMzEsNDY3LDE1NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10aWN0cmwiLCAgWFNQUigzMSw0NjcsMTU4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRiYXIiLCAgICBYU1BSKDMxLDQ2NywxNTkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdHNwcmciLCAgWFNQUigzMSw0NjcsMjcyKSwgWFNQUkdfTUFTSywgICBQUEMsCXsgU1BSRywgUlMgfSB9LAoteyAibXRzcHJnMCIsIFhTUFIoMzEsNDY3LDI3MiksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKLXsgIm10c3ByZzEiLCBYU1BSKDMxLDQ2NywyNzMpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCi17ICJtdHNwcmcyIiwgWFNQUigzMSw0NjcsMjc0KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRzcHJnMyIsIFhTUFIoMzEsNDY3LDI3NSksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKLXsgIm10YXNyIiwgICBYU1BSKDMxLDQ2NywyODApLCBYU1BSX01BU0ssICAgIFBQQzY0LAl7IFJTIH0gfSwKLXsgIm10ZWFyIiwgICBYU1BSKDMxLDQ2NywyODIpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSUyB9IH0sCi17ICJtdHRibCIsICAgWFNQUigzMSw0NjcsMjg0KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlMgfSB9LAoteyAibXR0YnUiLCAgIFhTUFIoMzEsNDY3LDI4NSksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJTIH0gfSwKLXsgIm10aWJhdHUiLCBYU1BSKDMxLDQ2Nyw1MjgpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKLXsgIm10aWJhdGwiLCBYU1BSKDMxLDQ2Nyw1MjkpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKLXsgIm10ZGJhdHUiLCBYU1BSKDMxLDQ2Nyw1MzYpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKLXsgIm10ZGJhdGwiLCBYU1BSKDMxLDQ2Nyw1MzcpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKLXsgIm10enByIiwgICBYU1BSKDMxLDQ2Nyw5NDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBpZCIsICAgWFNQUigzMSw0NjcsOTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpY2RiZHIiLFhTUFIoMzEsNDY3LDk3OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZXNyIiwgICBYU1BSKDMxLDQ2Nyw5ODApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGV2cHIiLCAgWFNQUigzMSw0NjcsOTgyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRjZGJjciIsIFhTUFIoMzEsNDY3LDk4MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dHNyIiwgICBYU1BSKDMxLDQ2Nyw5ODQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHRjciIsICAgWFNQUigzMSw0NjcsOTg2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwaXQiLCAgIFhTUFIoMzEsNDY3LDk4NyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dGJoaSIsICBYU1BSKDMxLDQ2Nyw5ODgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHRibG8iLCAgWFNQUigzMSw0NjcsOTg5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRzcnIyIiwgIFhTUFIoMzEsNDY3LDk5MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10c3JyMyIsICBYU1BSKDMxLDQ2Nyw5OTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRic3IiLCAgWFNQUigzMSw0NjcsMTAwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aWFjMSIsICBYU1BSKDMxLDQ2NywxMDEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpYWMyIiwgIFhTUFIoMzEsNDY3LDEwMTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRhYzEiLCAgWFNQUigzMSw0NjcsMTAxNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGFjMiIsICBYU1BSKDMxLDQ2NywxMDE1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkY2NyIiwgIFhTUFIoMzEsNDY3LDEwMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGljY3IiLCAgWFNQUigzMSw0NjcsMTAxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGJsMSIsICBYU1BSKDMxLDQ2NywxMDIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYnUxIiwgIFhTUFIoMzEsNDY3LDEwMjEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBibDIiLCAgWFNQUigzMSw0NjcsMTAyMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGJ1MiIsICBYU1BSKDMxLDQ2NywxMDIzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRzcHIiLCAgIFgoMzEsNDY3KSwJICAgICAgIFhfTUFTSywJICAgICBDT00sCXsgU1BSLCBSUyB9IH0sCi0KLXsgImRjYmkiLCAgICBYKDMxLDQ3MCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgIm5hbmQiLCAgICBYUkMoMzEsNDc2LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJuYW5kLiIsICAgWFJDKDMxLDQ3NiwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJkY3JlYWQiLCAgWCgzMSw0ODYpLAlYUlRfTUFTSywJUFBDNDAzLAkJeyBSQSwgUkIgfSB9LAotCi17ICJuYWJzIiwgICAgWE8oMzEsNDg4LDAsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5hYnMuIiwgICBYTygzMSw0ODgsMCwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAibmFic28iLCAgIFhPKDMxLDQ4OCwxLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJuYWJzby4iLCAgWE8oMzEsNDg4LDEsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLQoteyAiZGl2ZCIsICAgIFhPKDMxLDQ4OSwwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkLiIsICAgWE8oMzEsNDg5LDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmRvIiwgICBYTygzMSw0ODksMSwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZG8uIiwgIFhPKDMxLDQ4OSwxLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRpdnciLCAgICBYTygzMSw0OTEsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdncuIiwgICBYTygzMSw0OTEsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdndvIiwgICBYTygzMSw0OTEsMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdndvLiIsICBYTygzMSw0OTEsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic2xiaWEiLCAgIFgoMzEsNDk4KSwJMHhmZmZmZmZmZiwJUFBDNjQsCQl7IDAgfSB9LAotCi17ICJjbGkiLCAgICAgWCgzMSw1MDIpLCBYUkJfTUFTSywJUE9XRVIsCQl7IFJULCBSQSB9IH0sCi0KLXsgIm1jcnhyIiwgICBYKDMxLDUxMiksCVhSQVJCX01BU0t8KDM8PDIxKSwgQ09NLAl7IEJGIH0gfSwKLQoteyAiY2xjcyIsICAgIFgoMzEsNTMxKSwgWFJCX01BU0ssCU02MDEsCQl7IFJULCBSQSB9IH0sCi0KLXsgImxzd3giLCAgICBYKDMxLDUzMyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJsc3giLCAgICAgWCgzMSw1MzMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsd2JyeCIsICAgWCgzMSw1MzQpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibGJyeCIsICAgIFgoMzEsNTM0KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibGZzeCIsICAgIFgoMzEsNTM1KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNydyIsICAgICBYUkMoMzEsNTM2LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzciIsICAgICAgWFJDKDMxLDUzNiwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3J3LiIsICAgIFhSQygzMSw1MzYsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyLiIsICAgICBYUkMoMzEsNTM2LDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInJyaWIiLCAgICBYUkMoMzEsNTM3LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAicnJpYi4iLCAgIFhSQygzMSw1MzcsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyZCIsICAgICBYUkMoMzEsNTM5LDApLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyZC4iLCAgICBYUkMoMzEsNTM5LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAibWFza2lyIiwgIFhSQygzMSw1NDEsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJtYXNraXIuIiwgWFJDKDMxLDU0MSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAidGxic3luYyIsIFgoMzEsNTY2KSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLQoteyAibGZzdXgiLCAgIFgoMzEsNTY3KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBUywgUkIgfSB9LAotCi17ICJtZnNyIiwgICAgWCgzMSw1OTUpLAlYUkJfTUFTS3woMTw8MjApLCBDT00zMiwJeyBSVCwgU1IgfSB9LAotCi17ICJsc3dpIiwgICAgWCgzMSw1OTcpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgTkIgfSB9LAoteyAibHNpIiwgICAgIFgoMzEsNTk3KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIE5CIH0gfSwKLQoteyAic3luYyIsICAgIFgoMzEsNTk4KSwgMHhmZmZmZmZmZiwJUFBDQ09NLAkJeyAwIH0gfSwKLXsgImRjcyIsICAgICBYKDMxLDU5OCksIDB4ZmZmZmZmZmYsCVBXUkNPTSwJCXsgMCB9IH0sCi0KLXsgImxmZHgiLCAgICBYKDMxLDU5OSksIFhfTUFTSywJCUNPTSwJCXsgRlJULCBSQSwgUkIgfSB9LAotCi17ICJtZnNyaSIsICAgWCgzMSw2MjcpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkY2xzdCIsICAgWCgzMSw2MzApLCBYUkJfTUFTSywJUFdSQ09NLAkJeyBSUywgUkEgfSB9LAotCi17ICJsZmR1eCIsICAgWCgzMSw2MzEpLCBYX01BU0ssCQlDT00sCQl7IEZSVCwgUkFTLCBSQiB9IH0sCi0KLXsgIm1mc3JpbiIsICBYKDMxLDY1OSksIFhSQV9NQVNLLAlQUEMzMiwJCXsgUlQsIFJCIH0gfSwKLQoteyAic3Rzd3giLCAgIFgoMzEsNjYxKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLXsgInN0c3giLCAgICBYKDMxLDY2MSksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0d2JyeCIsICBYKDMxLDY2MiksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi17ICJzdGJyeCIsICAgWCgzMSw2NjIpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdGZzeCIsICAgWCgzMSw2NjMpLCBYX01BU0ssCQlDT00sCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAic3JxIiwgICAgIFhSQygzMSw2NjQsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcnEuIiwgICAgWFJDKDMxLDY2NCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JlIiwgICAgIFhSQygzMSw2NjUsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmUuIiwgICAgWFJDKDMxLDY2NSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3Rmc3V4IiwgIFgoMzEsNjk1KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBUywgUkIgfSB9LAotCi17ICJzcmlxIiwgICAgWFJDKDMxLDY5NiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNyaXEuIiwgICBYUkMoMzEsNjk2LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJzdHN3aSIsICAgWCgzMSw3MjUpLAlYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgTkIgfSB9LAoteyAic3RzaSIsICAgIFgoMzEsNzI1KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIE5CIH0gfSwKLQoteyAic3RmZHgiLCAgIFgoMzEsNzI3KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNybHEiLCAgICBYUkMoMzEsNzI4LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JscS4iLCAgIFhSQygzMSw3MjgsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyZXEiLCAgICBYUkMoMzEsNzI5LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JlcS4iLCAgIFhSQygzMSw3MjksMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInN0ZmR1eCIsICBYKDMxLDc1OSksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQVMsIFJCIH0gfSwKLQoteyAic3JsaXEiLCAgIFhSQygzMSw3NjAsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmxpcS4iLCAgWFJDKDMxLDc2MCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAibGhicngiLCAgIFgoMzEsNzkwKSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic3JhdyIsICAgIFhSQygzMSw3OTIsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYSIsICAgICBYUkMoMzEsNzkyLDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmF3LiIsICAgWFJDKDMxLDc5MiwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JhLiIsICAgIFhSQygzMSw3OTIsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JhZCIsICAgIFhSQygzMSw3OTQsMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JhZC4iLCAgIFhSQygzMSw3OTQsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJyYWMiLCAgICAgWCgzMSw4MTgpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzcmF3aSIsICAgWFJDKDMxLDgyNCwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JhaSIsICAgIFhSQygzMSw4MjQsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNyYXdpLiIsICBYUkMoMzEsODI0LDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmFpLiIsICAgWFJDKDMxLDgyNCwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJlaWVpbyIsICAgWCgzMSw4NTQpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJ0bGJzeCIsICAgWFJDKDMxLDkxNCwwKSwgWF9NQVNLLCBQUEM0MDMsCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJ0bGJzeC4iLCAgWFJDKDMxLDkxNCwxKSwgWF9NQVNLLCBQUEM0MDMsCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInN0aGJyeCIsICBYKDMxLDkxOCksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNyYXEiLCAgICBYUkMoMzEsOTIwLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JhcS4iLCAgIFhSQygzMSw5MjAsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyZWEiLCAgICBYUkMoMzEsOTIxLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JlYS4iLCAgIFhSQygzMSw5MjEsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImV4dHNoIiwgICBYUkMoMzEsOTIyLDApLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiZXh0cyIsICAgIFhSQygzMSw5MjIsMCksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJleHRzaC4iLCAgWFJDKDMxLDkyMiwxKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHMuIiwgICBYUkMoMzEsOTIyLDEpLCBYUkJfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAotCi17ICJ0bGJyZSIsICAgWCgzMSw5NDYpLAlYX01BU0ssCQlQUEM0MDMsCQl7IFJULCBSQSwgU0ggfSB9LAotCi17ICJzcmFpcSIsICAgWFJDKDMxLDk1MiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNyYWlxLiIsICBYUkMoMzEsOTUyLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJleHRzYiIsICAgWFJDKDMxLDk1NCwwKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTfSB9LAoteyAiZXh0c2IuIiwgIFhSQygzMSw5NTQsMSksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSU30gfSwKLQoteyAiaWNjY2kiLCAgIFgoMzEsOTY2KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAidGxibGQiLCAgIFgoMzEsOTc4KSwJWFJUUkFfTUFTSywJUFBDLAkJeyBSQiB9IH0sCi17ICJ0bGJ3ZSIsICAgWCgzMSw5NzgpLAlYX01BU0ssCQlQUEM0MDMsCQl7IFJTLCBSQSwgU0ggfSB9LAotCi17ICJpY2JpIiwgICAgWCgzMSw5ODIpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJzdGZpd3giLCAgWCgzMSw5ODMpLAlYX01BU0ssCQlQUEMsCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAiZXh0c3ciLCAgIFhSQygzMSw5ODYsMCksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSUyB9IH0sCi17ICJleHRzdy4iLCAgWFJDKDMxLDk4NiwxKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTIH0gfSwKLQoteyAiaWNyZWFkIiwgIFgoMzEsOTk4KSwJWFJUX01BU0ssCVBQQzQwMywJCXsgUkEsIFJCIH0gfSwKLQoteyAidGxibGkiLCAgIFgoMzEsMTAxMCksIFhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAotCi17ICJkY2J6IiwgICAgWCgzMSwxMDE0KSwgWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLXsgImRjbHoiLCAgICBYKDMxLDEwMTQpLCBYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJsd3oiLCAgICAgT1AoMzIpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQSB9IH0sCi17ICJsIiwJICAgICBPUCgzMiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibHd6dSIsICAgIE9QKDMzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLXsgImx1IiwgICAgICBPUCgzMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGJ6IiwgICAgIE9QKDM0KSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsYnp1IiwgICAgT1AoMzUpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQUwgfSB9LAotCi17ICJzdHciLCAgICAgT1AoMzYpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQSB9IH0sCi17ICJzdCIsICAgICAgT1AoMzYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgInN0d3UiLCAgICBPUCgzNyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCi17ICJzdHUiLCAgICAgT1AoMzcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgInN0YiIsICAgICBPUCgzOCksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAic3RidSIsICAgIE9QKDM5KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKLQoteyAibGh6IiwgICAgIE9QKDQwKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsaHp1IiwgICAgT1AoNDEpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQUwgfSB9LAotCi17ICJsaGEiLCAgICAgT1AoNDIpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxoYXUiLCAgICBPUCg0MyksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi0KLXsgInN0aCIsICAgICBPUCg0NCksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAic3RodSIsICAgIE9QKDQ1KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKLQoteyAibG13IiwgICAgIE9QKDQ2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkFNIH0gfSwKLXsgImxtIiwgICAgICBPUCg0NiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAic3RtdyIsICAgIE9QKDQ3KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSUywgRCwgUkEgfSB9LAoteyAic3RtIiwgICAgIE9QKDQ3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJsZnMiLCAgICAgT1AoNDgpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkEgfSB9LAotCi17ICJsZnN1IiwgICAgT1AoNDkpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkFTIH0gfSwKLQoteyAibGZkIiwgICAgIE9QKDUwKSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBIH0gfSwKLQoteyAibGZkdSIsICAgIE9QKDUxKSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBUyB9IH0sCi0KLXsgInN0ZnMiLCAgICBPUCg1MiksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQSB9IH0sCi0KLXsgInN0ZnN1IiwgICBPUCg1MyksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQVMgfSB9LAotCi17ICJzdGZkIiwgICAgT1AoNTQpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGZkdSIsICAgT1AoNTUpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkFTIH0gfSwKLQoteyAibGZxIiwgICAgIE9QKDU2KSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEQsIFJBIH0gfSwKLQoteyAibGZxdSIsICAgIE9QKDU3KSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEQsIFJBIH0gfSwKLQoteyAibGQiLCAgICAgIERTTyg1OCwwKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkEgfSB9LAotCi17ICJsZHUiLCAgICAgRFNPKDU4LDEpLCBEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQUwgfSB9LAotCi17ICJsd2EiLCAgICAgRFNPKDU4LDIpLCBEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQSB9IH0sCi0KLXsgImZkaXZzIiwgICBBKDU5LDE4LDApLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmZGl2cy4iLCAgQSg1OSwxOCwxKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3VicyIsICAgQSg1OSwyMCwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZnN1YnMuIiwgIEEoNTksMjAsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZmFkZHMiLCAgIEEoNTksMjEsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZhZGRzLiIsICBBKDU5LDIxLDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZzcXJ0cyIsICBBKDU5LDIyLDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoteyAiZnNxcnRzLiIsIEEoNTksMjIsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZyZXMiLCAgICBBKDU5LDI0LDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoteyAiZnJlcy4iLCAgIEEoNTksMjQsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZtdWxzIiwgICBBKDU5LDI1LDApLCBBRlJCX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi17ICJmbXVscy4iLCAgQSg1OSwyNSwxKSwgQUZSQl9NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAotCi17ICJmbXN1YnMiLCAgQSg1OSwyOCwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbXN1YnMuIiwgQSg1OSwyOCwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZtYWRkcyIsICBBKDU5LDI5LDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtYWRkcy4iLCBBKDU5LDI5LDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm5tc3VicyIsIEEoNTksMzAsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tc3Vicy4iLEEoNTksMzAsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbm1hZGRzIiwgQSg1OSwzMSwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1hZGRzLiIsQSg1OSwzMSwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgInN0ZnEiLCAgICBPUCg2MCksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJTLCBELCBSQSB9IH0sCi0KLXsgInN0ZnF1IiwgICBPUCg2MSksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJTLCBELCBSQSB9IH0sCi0KLXsgInN0ZCIsICAgICBEU08oNjIsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSUywgRFMsIFJBIH0gfSwKLQoteyAic3RkdSIsICAgIERTTyg2MiwxKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJTLCBEUywgUkFTIH0gfSwKLQoteyAiZmNtcHUiLCAgIFgoNjMsMCksCVhfTUFTS3woMzw8MjEpLAlDT00sCQl7IEJGLCBGUkEsIEZSQiB9IH0sCi0KLXsgImZyc3AiLCAgICBYUkMoNjMsMTIsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZyc3AuIiwgICBYUkMoNjMsMTIsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmN0aXciLCAgIFhSQyg2MywxNCwwKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNpciIsICAgIFhSQyg2MywxNCwwKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmN0aXcuIiwgIFhSQyg2MywxNCwxKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNpci4iLCAgIFhSQyg2MywxNCwxKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmY3Rpd3oiLCAgWFJDKDYzLDE1LDApLCBYUkFfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY2lyeiIsICAgWFJDKDYzLDE1LDApLCBYUkFfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY3Rpd3ouIiwgWFJDKDYzLDE1LDEpLCBYUkFfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY2lyei4iLCAgWFJDKDYzLDE1LDEpLCBYUkFfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZkaXYiLCAgICBBKDYzLDE4LDApLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmZCIsICAgICAgQSg2MywxOCwwKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmRpdi4iLCAgIEEoNjMsMTgsMSksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZkLiIsICAgICBBKDYzLDE4LDEpLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZzdWIiLCAgICBBKDYzLDIwLDApLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmcyIsICAgICAgQSg2MywyMCwwKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZnN1Yi4iLCAgIEEoNjMsMjAsMSksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzLiIsICAgICBBKDYzLDIwLDEpLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZhZGQiLCAgICBBKDYzLDIxLDApLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYSIsICAgICAgQSg2MywyMSwwKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmFkZC4iLCAgIEEoNjMsMjEsMSksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZhLiIsICAgICBBKDYzLDIxLDEpLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZzcXJ0IiwgICBBKDYzLDIyLDApLCBBRlJBRlJDX01BU0ssCVBQQ1BXUjIsCXsgRlJULCBGUkIgfSB9LAoteyAiZnNxcnQuIiwgIEEoNjMsMjIsMSksIEFGUkFGUkNfTUFTSywJUFBDUFdSMiwJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZzZWwiLCAgICBBKDYzLDIzLDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZzZWwuIiwgICBBKDYzLDIzLDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm11bCIsICAgIEEoNjMsMjUsMCksIEFGUkJfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLXsgImZtIiwgICAgICBBKDYzLDI1LDApLCBBRlJCX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi17ICJmbXVsLiIsICAgQSg2MywyNSwxKSwgQUZSQl9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm0uIiwgICAgIEEoNjMsMjUsMSksIEFGUkJfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLQoteyAiZnJzcXJ0ZSIsIEEoNjMsMjYsMCksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmcnNxcnRlLiIsQSg2MywyNiwxKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZm1zdWIiLCAgIEEoNjMsMjgsMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1zIiwgICAgIEEoNjMsMjgsMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1zdWIuIiwgIEEoNjMsMjgsMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1zLiIsICAgIEEoNjMsMjgsMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbWFkZCIsICAgQSg2MywyOSwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbWEiLCAgICAgQSg2MywyOSwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbWFkZC4iLCAgQSg2MywyOSwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbWEuIiwgICAgQSg2MywyOSwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubXN1YiIsICBBKDYzLDMwLDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubXMiLCAgICBBKDYzLDMwLDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubXN1Yi4iLCBBKDYzLDMwLDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubXMuIiwgICBBKDYzLDMwLDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm5tYWRkIiwgIEEoNjMsMzEsMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tYSIsICAgIEEoNjMsMzEsMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tYWRkLiIsIEEoNjMsMzEsMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tYS4iLCAgIEEoNjMsMzEsMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmY21wbyIsICAgWCg2MywzMiksCVhfTUFTS3woMzw8MjEpLAlDT00sCQl7IEJGLCBGUkEsIEZSQiB9IH0sCi0KLXsgIm10ZnNiMSIsICBYUkMoNjMsMzgsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAoteyAibXRmc2IxLiIsIFhSQyg2MywzOCwxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCi0KLXsgImZuZWciLCAgICBYUkMoNjMsNDAsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZuZWcuIiwgICBYUkMoNjMsNDAsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAibWNyZnMiLCAgIFgoNjMsNjQpLAlYUkJfTUFTS3woMzw8MjEpfCgzPDwxNiksIENPTSwJeyBCRiwgQkZBIH0gfSwKLQoteyAibXRmc2IwIiwgIFhSQyg2Myw3MCwwKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCi17ICJtdGZzYjAuIiwgWFJDKDYzLDcwLDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKLQoteyAiZm1yIiwgICAgIFhSQyg2Myw3MiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZm1yLiIsICAgIFhSQyg2Myw3MiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJtdGZzZmkiLCAgWFJDKDYzLDEzNCwwKSwgWFJBX01BU0t8KDM8PDIxKXwoMTw8MTEpLCBDT00sIHsgQkYsIFUgfSB9LAoteyAibXRmc2ZpLiIsIFhSQyg2MywxMzQsMSksIFhSQV9NQVNLfCgzPDwyMSl8KDE8PDExKSwgQ09NLCB7IEJGLCBVIH0gfSwKLQoteyAiZm5hYnMiLCAgIFhSQyg2MywxMzYsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZuYWJzLiIsICBYUkMoNjMsMTM2LDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZhYnMiLCAgICBYUkMoNjMsMjY0LDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmYWJzLiIsICAgWFJDKDYzLDI2NCwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJtZmZzIiwgICAgWFJDKDYzLDU4MywwKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBGUlQgfSB9LAoteyAibWZmcy4iLCAgIFhSQyg2Myw1ODMsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgRlJUIH0gfSwKLQoteyAibXRmc2YiLCAgIFhGTCg2Myw3MTEsMCksIFhGTF9NQVNLLAlDT00sCQl7IEZMTSwgRlJCIH0gfSwKLXsgIm10ZnNmLiIsICBYRkwoNjMsNzExLDEpLCBYRkxfTUFTSywJQ09NLAkJeyBGTE0sIEZSQiB9IH0sCi0KLXsgImZjdGlkIiwgICBYUkMoNjMsODE0LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGlkLiIsICBYUkMoNjMsODE0LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmN0aWR6IiwgIFhSQyg2Myw4MTUsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmN0aWR6LiIsIFhSQyg2Myw4MTUsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmY2ZpZCIsICAgWFJDKDYzLDg0NiwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY2ZpZC4iLCAgWFJDKDYzLDg0NiwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi0KLX07Ci0KLWNvbnN0IGludCBwb3dlcnBjX251bV9vcGNvZGVzID0KLSAgc2l6ZW9mIChwb3dlcnBjX29wY29kZXMpIC8gc2l6ZW9mIChwb3dlcnBjX29wY29kZXNbMF0pOwotDAotLyogVGhlIG1hY3JvIHRhYmxlLiAgVGhpcyBpcyBvbmx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gICovCi0KLS8qIFRoZSBleHByZXNzaW9ucyBvZiB0aGUgZm9ybSAoLXggISAzMSkgJiAoeCB8IDMxKSBoYXZlIHRoZSB2YWx1ZSAwCi0gICB3aGVuIHg9MDsgMzIteCB3aGVuIHggaXMgYmV0d2VlbiAxIGFuZCAzMTsgYXJlIG5lZ2F0aXZlIGlmIHggaXMKLSAgIG5lZ2F0aXZlOyBhbmQgYXJlIDMyIG9yIG1vcmUgb3RoZXJ3aXNlLiAgVGhpcyBpcyB3aGF0IHlvdSB3YW50Ci0gICB3aGVuLCBmb3IgaW5zdGFuY2UsIHlvdSBhcmUgZW11bGF0aW5nIGEgcmlnaHQgc2hpZnQgYnkgYQotICAgcm90YXRlLWxlZnQtYW5kLW1hc2ssIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgaW5zdHJ1Y3Rpb25zIHN1cHBvcnQKLSAgIHNoaWZ0cyBvZiBzaXplIDAgYnV0IG5vdCBzaGlmdHMgb2Ygc2l6ZSAzMi4gIEJ5IGNvbXBhcmlzb24sIHdoZW4KLSAgIGV4dHJhY3RpbmcgeCBiaXRzIGZyb20gc29tZSB3b3JkIHlvdSB3YW50IHRvIHVzZSBqdXN0IDMyLXgsIGJlY2F1c2UKLSAgIHRoZSB1bmRlcmx5aW5nIGluc3RydWN0aW9ucyBkb24ndCBzdXBwb3J0IGV4dHJhY3RpbmcgMCBiaXRzIGJ1dCBkbwotICAgc3VwcG9ydCBleHRyYWN0aW5nIHRoZSB3aG9sZSB3b3JkICgzMiBiaXRzIGluIHRoaXMgY2FzZSkuICAqLwotCi1jb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyBwb3dlcnBjX21hY3Jvc1tdID0gewoteyAiZXh0bGRpIiwgIDQsICAgUFBDNjQsCSJybGRpY3IgJTAsJTEsJTMsKCUyKS0xIiB9LAoteyAiZXh0bGRpLiIsIDQsICAgUFBDNjQsCSJybGRpY3IuICUwLCUxLCUzLCglMiktMSIgfSwKLXsgImV4dHJkaSIsICA0LCAgIFBQQzY0LAkicmxkaWNsICUwLCUxLCglMikrKCUzKSw2NC0oJTIpIiB9LAoteyAiZXh0cmRpLiIsIDQsICAgUFBDNjQsCSJybGRpY2wuICUwLCUxLCglMikrKCUzKSw2NC0oJTIpIiB9LAoteyAiaW5zcmRpIiwgIDQsICAgUFBDNjQsCSJybGRpbWkgJTAsJTEsNjQtKCglMikrKCUzKSksJTMiIH0sCi17ICJpbnNyZGkuIiwgNCwgICBQUEM2NCwJInJsZGltaS4gJTAsJTEsNjQtKCglMikrKCUzKSksJTMiIH0sCi17ICJyb3RyZGkiLCAgMywgICBQUEM2NCwJInJsZGljbCAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwwIiB9LAoteyAicm90cmRpLiIsIDMsICAgUFBDNjQsCSJybGRpY2wuICUwLCUxLCgtKCUyKSE2MykmKCglMil8NjMpLDAiIH0sCi17ICJzbGRpIiwgICAgMywgICBQUEM2NCwJInJsZGljciAlMCwlMSwlMiw2My0oJTIpIiB9LAoteyAic2xkaS4iLCAgIDMsICAgUFBDNjQsCSJybGRpY3IuICUwLCUxLCUyLDYzLSglMikiIH0sCi17ICJzcmRpIiwgICAgMywgICBQUEM2NCwJInJsZGljbCAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwlMiIgfSwKLXsgInNyZGkuIiwgICAzLCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwlMiIgfSwKLXsgImNscnJkaSIsICAzLCAgIFBQQzY0LAkicmxkaWNyICUwLCUxLDAsNjMtKCUyKSIgfSwKLXsgImNscnJkaS4iLCAzLCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwwLDYzLSglMikiIH0sCi17ICJjbHJsc2xkaSIsNCwgICBQUEM2NCwJInJsZGljICUwLCUxLCUzLCglMiktKCUzKSIgfSwKLXsgImNscmxzbGRpLiIsNCwgIFBQQzY0LAkicmxkaWMuICUwLCUxLCUzLCglMiktKCUzKSIgfSwKLQoteyAiZXh0bHdpIiwgIDQsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCUzLDAsKCUyKS0xIiB9LAoteyAiZXh0bHdpLiIsIDQsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwlMywwLCglMiktMSIgfSwKLXsgImV4dHJ3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwoJTIpKyglMyksMzItKCUyKSwzMSIgfSwKLXsgImV4dHJ3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsKCUyKSsoJTMpLDMyLSglMiksMzEiIH0sCi17ICJpbnNsd2kiLCAgNCwgICBQUENDT00sCSJybHdpbWkgJTAsJTEsKC0oJTMpITMxKSYoKCUzKXwzMSksJTMsKCUyKSsoJTMpLTEiIH0sCi17ICJpbnNsd2kuIiwgNCwgICBQUENDT00sCSJybHdpbWkuICUwLCUxLCgtKCUzKSEzMSkmKCglMyl8MzEpLCUzLCglMikrKCUzKS0xIn0sCi17ICJpbnNyd2kiLCAgNCwgICBQUENDT00sCSJybHdpbWkgJTAsJTEsMzItKCglMikrKCUzKSksJTMsKCUyKSsoJTMpLTEiIH0sCi17ICJpbnNyd2kuIiwgNCwgICBQUENDT00sCSJybHdpbWkuICUwLCUxLDMyLSgoJTIpKyglMykpLCUzLCglMikrKCUzKS0xIn0sCi17ICJyb3Ryd2kiLCAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksMCwzMSIgfSwKLXsgInJvdHJ3aS4iLCAzLCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksMCwzMSIgfSwKLXsgInNsd2kiLCAgICAzLCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMiwwLDMxLSglMikiIH0sCi17ICJzbGkiLCAgICAgMywgICBQV1JDT00sCSJybGlubSAlMCwlMSwlMiwwLDMxLSglMikiIH0sCi17ICJzbHdpLiIsICAgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCUyLDAsMzEtKCUyKSIgfSwKLXsgInNsaS4iLCAgICAzLCAgIFBXUkNPTSwJInJsaW5tLiAlMCwlMSwlMiwwLDMxLSglMikiIH0sCi17ICJzcndpIiwgICAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCi17ICJzcmkiLCAgICAgMywgICBQV1JDT00sCSJybGlubSAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwlMiwzMSIgfSwKLXsgInNyd2kuIiwgICAzLCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCi17ICJzcmkuIiwgICAgMywgICBQV1JDT00sCSJybGlubS4gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCi17ICJjbHJyd2kiLCAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsMCwwLDMxLSglMikiIH0sCi17ICJjbHJyd2kuIiwgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLDAsMCwzMS0oJTIpIiB9LAoteyAiY2xybHNsd2kiLDQsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCUzLCglMiktKCUzKSwzMS0oJTMpIiB9LAoteyAiY2xybHNsd2kuIiw0LCAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwlMywoJTIpLSglMyksMzEtKCUzKSIgfSwKLQotfTsKLQotY29uc3QgaW50IHBvd2VycGNfbnVtX21hY3JvcyA9Ci0gIHNpemVvZiAocG93ZXJwY19tYWNyb3MpIC8gc2l6ZW9mIChwb3dlcnBjX21hY3Jvc1swXSk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL3NoLWRpcy5jIGIvb3Bjb2Rlcy9zaC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViZmRiNi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NoLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIFNIIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBTVEFUSUNfVEFCTEUKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0KLSNpbmNsdWRlICJzaC1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLSNkZWZpbmUgTElUVExFX0JJVCAyCi0KLXN0YXRpYyBpbnQgCi1wcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2ZuID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIHVuc2lnbmVkIGNoYXIgaW5zblsyXTsKLSAgdW5zaWduZWQgY2hhciBuaWJzWzRdOwotICBpbnQgc3RhdHVzOwotICBiZmRfdm1hIHJlbG1hc2sgPSB+IChiZmRfdm1hKSAwOwotICBzaF9vcGNvZGVfaW5mbyAqb3A7Ci0KLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgaW5zbiwgMiwgaW5mbyk7Ci0KLSAgaWYgKHN0YXR1cyAhPSAwKSAKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgCi0gICAgewotICAgICAgbmlic1swXSA9IChpbnNuWzFdID4+IDQpICYgMHhmOwotICAgICAgbmlic1sxXSA9IGluc25bMV0gJiAweGY7Ci0KLSAgICAgIG5pYnNbMl0gPSAoaW5zblswXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbM10gPSBpbnNuWzBdICYgMHhmOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBuaWJzWzBdID0gKGluc25bMF0gPj4gNCkgJiAweGY7Ci0gICAgICBuaWJzWzFdID0gaW5zblswXSAmIDB4ZjsKLQotICAgICAgbmlic1syXSA9IChpbnNuWzFdID4+IDQpICYgMHhmOwotICAgICAgbmlic1szXSA9IGluc25bMV0gJiAweGY7Ci0gICAgfQotCi0gIGZvciAob3AgPSBzaF90YWJsZTsgb3AtPm5hbWU7IG9wKyspIAotICAgIHsKLSAgICAgIGludCBuOwotICAgICAgaW50IGltbSA9IDA7Ci0gICAgICBpbnQgcm4gPSAwOwotICAgICAgaW50IHJtID0gMDsKLSAgICAgIGludCByYiA9IDA7Ci0gICAgICBpbnQgZGlzcF9wYzsKLSAgICAgIGJmZF92bWEgZGlzcF9wY19hZGRyID0gMDsKLQotICAgICAgZm9yIChuID0gMDsgbiA8IDQ7IG4rKykKLQl7Ci0JICBpbnQgaSA9IG9wLT5uaWJibGVzW25dOwotCi0JICBpZiAoaSA8IDE2KSAKLQkgICAgewotCSAgICAgIGlmIChuaWJzW25dID09IGkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgfQotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgQlJBTkNIXzg6Ci0JICAgICAgaW1tID0gKG5pYnNbMl0gPDwgNCkgfCAobmlic1szXSk7CSAgCi0JICAgICAgaWYgKGltbSAmIDB4ODApCi0JCWltbSB8PSB+MHhmZjsKLQkgICAgICBpbW0gPSAoKGNoYXIpaW1tKSAqIDIgKyA0IDsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIEJSQU5DSF8xMjoKLQkgICAgICBpbW0gPSAoKG5pYnNbMV0pIDw8IDgpIHwgKG5pYnNbMl0gPDwgNCkgfCAobmlic1szXSk7Ci0JICAgICAgaWYgKGltbSAmIDB4ODAwKQotCQlpbW0gfD0gfjB4ZmZmOwotCSAgICAgIGltbSA9IGltbSAqIDIgKyA0OwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NXzQ6Ci0JICAgICAgaW1tID0gbmlic1szXTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTV80QlkyOgotCSAgICAgIGltbSA9IG5pYnNbM10gPDwxOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NXzRCWTQ6Ci0JICAgICAgaW1tID0gbmlic1szXSA8PDI7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fODoKLQkgICAgICBpbW0gPSAobmlic1syXSA8PCA0KSB8IG5pYnNbM107Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBQQ1JFTElNTV84QlkyOgotCSAgICAgIGltbSA9ICgobmlic1syXSA8PCA0KSB8IG5pYnNbM10pIDw8MTsKLQkgICAgICByZWxtYXNrID0gfiAoYmZkX3ZtYSkgMTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIFBDUkVMSU1NXzhCWTQ6Ci0JICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwyOwotCSAgICAgIHJlbG1hc2sgPSB+IChiZmRfdm1hKSAzOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NXzhCWTI6Ci0JICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwxOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NXzhCWTQ6Ci0JICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwyOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgRElTUF84OgotCSAgICAgIGltbSA9IChuaWJzWzJdIDw8IDQpIHwgKG5pYnNbM10pOwkgIAotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgRElTUF80OgotCSAgICAgIGltbSA9IG5pYnNbM107Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBSRUdfTjoKLQkgICAgICBybiA9IG5pYnNbbl07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX006Ci0JICAgICAgcm0gPSBuaWJzW25dOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19OTToKLQkgICAgICBybiA9IChuaWJzW25dICYgMHhjKSA+PiAyOwotCSAgICAgIHJtID0gKG5pYnNbbl0gJiAweDMpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19COgotCSAgICAgIHJiID0gbmlic1tuXSAmIDB4MDc7Ci0JICAgICAgYnJlYWs7CQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQl9Ci0KLSAgICBvazoKLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwiJXNcdCIsIG9wLT5uYW1lKTsKLSAgICAgIGRpc3BfcGMgPSAwOwotICAgICAgZm9yIChuID0gMDsgbiA8IDMgJiYgb3AtPmFyZ1tuXSAhPSBBX0VORDsgbisrKSAKLQl7Ci0JICBpZiAobiAmJiBvcC0+YXJnWzFdICE9IEFfRU5EKQotCSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIsIik7Ci0JICBzd2l0Y2ggKG9wLT5hcmdbbl0pIAotCSAgICB7Ci0JICAgIGNhc2UgQV9JTU06Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiIyVkIiwgKGNoYXIpKGltbSkpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUjA6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAicjAiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lOQ19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQrIiwgcm4pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RFQ19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAtciVkIiwgcm4pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lORF9OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQiLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfRElTUF9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKCVkLHIlZCkiLCBpbW0sIHJuKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyJWQiLCBybSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9JTkNfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkKyIsIHJtKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ERUNfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJALXIlZCIsIHJtKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9JTkRfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkIiwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RJU1BfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQCglZCxyJWQpIiwgaW1tLCBybSk7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUkVHX0I6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiciVkX2JhbmsiLCByYik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ESVNQX1BDOgotCSAgICAgIGRpc3BfcGMgPSAxOwotCSAgICAgIGRpc3BfcGNfYWRkciA9IGltbSArIDQgKyAobWVtYWRkciAmIHJlbG1hc2spOwotCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoZGlzcF9wY19hZGRyLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lORF9SMF9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKHIwLHIlZCkiLCBybik7Ci0JICAgICAgYnJlYWs7IAotCSAgICBjYXNlIEFfSU5EX1IwX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAocjAsciVkKSIsIHJtKTsKLQkgICAgICBicmVhazsgCi0JICAgIGNhc2UgQV9ESVNQX0dCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKCVkLGdicikiLGltbSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SMF9HQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQChyMCxnYnIpIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9CRElTUDEyOgotCSAgICBjYXNlIEFfQkRJU1A4OgotCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW1tICsgbWVtYWRkciwgaW5mbyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9TUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJzciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfR0JSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImdiciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfVkJSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInZiciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfU1NSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNzciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfU1BDOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNwYyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfTUFDSDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtYWNoIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9NQUNMOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSAsIm1hY2wiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1BSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInByIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9TR1I6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic2dyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9EQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZGJyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRkRfUkVHX046Ci0JICAgICAgaWYgKDApCi0JCWdvdG8gZF9yZWdfbjsKLQkgICAgY2FzZSBGX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZyJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRl9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmciVkIiwgcm0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERYX1JFR19OOgotCSAgICAgIGlmIChybiAmIDEpCi0JCXsKLQkJICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4ZCVkIiwgcm4gJiB+MSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgZF9yZWdfbjoKLQkgICAgY2FzZSBEX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImRyJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX006Ci0JICAgICAgaWYgKHJtICYgMSkKLQkJewotCQkgIGZwcmludGZfZm4gKHN0cmVhbSwgInhkJWQiLCBybSAmIH4xKTsKLQkJICBicmVhazsKLQkJfQotCSAgICBjYXNlIERfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZHIlZCIsIHJtKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGUFNDUl9NOgotCSAgICBjYXNlIEZQU0NSX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnBzY3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGUFVMX006Ci0JICAgIGNhc2UgRlBVTF9OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZwdWwiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGX0ZSMDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmcjAiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBWX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZ2JWQiLCBybio0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBWX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZ2JWQiLCBybSo0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBYTVRSWF9NNDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4bXRyeCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQl9Ci0KLSNpZiAwCi0gICAgICAvKiBUaGlzIGNvZGUgcHJpbnRzIGluc3RydWN0aW9ucyBpbiBkZWxheSBzbG90cyBvbiB0aGUgc2FtZSBsaW5lCi0gICAgICAgICBhcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgdGhlIGRlbGF5IHNsb3RzLiAgVGhpcyBjYW4gYmUKLSAgICAgICAgIGNvbmZ1c2luZywgc2luY2Ugb3RoZXIgZGlzYXNzZW1ibGVyIGRvbid0IHdvcmsgdGhpcyB3YXksIGFuZAotICAgICAgICAgaXQgbWVhbnMgdGhhdCB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgYWxsIGluIGEgbGluZS4gIFNvIEkKLSAgICAgICAgIGRpc2FibGVkIGl0LiAgSWFuLiAgKi8KLSAgICAgIGlmICghKGluZm8tPmZsYWdzICYgMSkKLQkgICYmIChvcC0+bmFtZVswXSA9PSAnaicKLQkgICAgICB8fCAob3AtPm5hbWVbMF0gPT0gJ2InCi0JCSAgJiYgKG9wLT5uYW1lWzFdID09ICdyJyAKLQkJICAgICAgfHwgb3AtPm5hbWVbMV0gPT0gJ3MnKSkKLQkgICAgICB8fCAob3AtPm5hbWVbMF0gPT0gJ3InICYmIG9wLT5uYW1lWzFdID09ICd0JykKLQkgICAgICB8fCAob3AtPm5hbWVbMF0gPT0gJ2InICYmIG9wLT5uYW1lWzJdID09ICcuJykpKQotCXsKLQkgIGluZm8tPmZsYWdzIHw9IDE7Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICJcdChzbG90ICIpOwotCSAgcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIgKyAyLCBpbmZvKTsKLQkgIGluZm8tPmZsYWdzICY9IH4xOwotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiKSIpOwotCSAgcmV0dXJuIDQ7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmIChkaXNwX3BjICYmIHN0cmNtcCAob3AtPm5hbWUsICJtb3ZhIikgIT0gMCkKLQl7Ci0JICBpbnQgc2l6ZTsKLQkgIGJmZF9ieXRlIGJ5dGVzWzRdOwotCi0JICBpZiAocmVsbWFzayA9PSB+IChiZmRfdm1hKSAxKQotCSAgICBzaXplID0gMjsKLQkgIGVsc2UKLQkgICAgc2l6ZSA9IDQ7Ci0JICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChkaXNwX3BjX2FkZHIsIGJ5dGVzLCBzaXplLCBpbmZvKTsKLQkgIGlmIChzdGF0dXMgPT0gMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCB2YWw7Ci0KLQkgICAgICBpZiAoc2l6ZSA9PSAyKQotCQl7Ci0JCSAgaWYgKChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpICE9IDApCi0JCSAgICB2YWwgPSBiZmRfZ2V0bDE2IChieXRlcyk7Ci0JCSAgZWxzZQotCQkgICAgdmFsID0gYmZkX2dldGIxNiAoYnl0ZXMpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpICE9IDApCi0JCSAgICB2YWwgPSBiZmRfZ2V0bDMyIChieXRlcyk7Ci0JCSAgZWxzZQotCQkgICAgdmFsID0gYmZkX2dldGIzMiAoYnl0ZXMpOwotCQl9Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiXHQhIDB4JXgiLCB2YWwpOwotCSAgICB9Ci0JfQotCi0gICAgICByZXR1cm4gMjsKLSAgICBmYWlsOgotICAgICAgOwotCi0gICAgfQotICBmcHJpbnRmX2ZuIChzdHJlYW0sICIud29yZCAweCV4JXgleCV4Iiwgbmlic1swXSwgbmlic1sxXSwgbmlic1syXSwgbmlic1szXSk7Ci0gIHJldHVybiAyOwotfQotCi1pbnQgCi1wcmludF9pbnNuX3NobCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHI7Ci0KLSAgaW5mby0+ZmxhZ3MgPSBMSVRUTEVfQklUOwotICByID0gcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIsIGluZm8pOwotICByZXR1cm4gcjsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9zaCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHI7Ci0KLSAgaW5mby0+ZmxhZ3MgPSAwOwotICByID0gcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIsIGluZm8pOwotICByZXR1cm4gcjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvc2gtb3BjLmggYi9vcGNvZGVzL3NoLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ZlMGVmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvc2gtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIFNIIG9wY29kZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSEVYXzAsCi0JSEVYXzEsCi0JSEVYXzIsCi0JSEVYXzMsCi0JSEVYXzQsCi0JSEVYXzUsCi0JSEVYXzYsCi0JSEVYXzcsCi0JSEVYXzgsCi0JSEVYXzksCi0JSEVYX0EsCi0JSEVYX0IsCi0JSEVYX0MsCi0JSEVYX0QsCi0JSEVYX0UsCi0JSEVYX0YsCi0JUkVHX04sCi0JUkVHX00sCi0JUkVHX05NLAotICAgICAgICBSRUdfQiwKLQlCUkFOQ0hfMTIsCi0JQlJBTkNIXzgsCi0JRElTUF84LAotCURJU1BfNCwKLQlJTU1fNCwKLQlJTU1fNEJZMiwKLQlJTU1fNEJZNCwKLQlQQ1JFTElNTV84QlkyLAotCVBDUkVMSU1NXzhCWTQsCi0JSU1NXzgsCi0JSU1NXzhCWTIsCi0JSU1NXzhCWTQKLX0gc2hfbmliYmxlX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JQV9FTkQsCi0JQV9CRElTUDEyLAotCUFfQkRJU1A4LAotCUFfREVDX00sCi0JQV9ERUNfTiwKLQlBX0RJU1BfR0JSLAotCUFfRElTUF9QQywKLQlBX0RJU1BfUkVHX00sCi0JQV9ESVNQX1JFR19OLAotCUFfR0JSLAotCUFfSU1NLAotCUFfSU5DX00sCi0JQV9JTkNfTiwKLQlBX0lORF9NLAotCUFfSU5EX04sCi0JQV9JTkRfUjBfUkVHX00sCi0JQV9JTkRfUjBfUkVHX04sCi0JQV9NQUNILAotCUFfTUFDTCwKLQlBX1BSLAotCUFfUjAsCi0JQV9SMF9HQlIsCi0JQV9SRUdfTSwKLQlBX1JFR19OLAotCUFfUkVHX0IsCi0JQV9TUiwKLQlBX1ZCUiwKLQlBX1NTUiwKLQlBX1NQQywKLQlBX1NHUiwKLQlBX0RCUiwKLQlGX1JFR19OLAotCUZfUkVHX00sCi0JRF9SRUdfTiwKLQlEX1JFR19NLAotCVhfUkVHX04sIC8qIE9ubHkgdXNlZCBmb3IgYXJndW1lbnQgcGFyc2luZyAqLwotCVhfUkVHX00sIC8qIE9ubHkgdXNlZCBmb3IgYXJndW1lbnQgcGFyc2luZyAqLwotCURYX1JFR19OLAotCURYX1JFR19NLAotCVZfUkVHX04sCi0JVl9SRUdfTSwKLQlGRF9SRUdfTiwKLQlYTVRSWF9NNCwKLQlGX0ZSMCwKLQlGUFVMX04sCi0JRlBVTF9NLAotCUZQU0NSX04sCi0JRlBTQ1JfTQotfSBzaF9hcmdfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICBzaF9hcmdfdHlwZSBhcmdbNF07Ci0gIHNoX25pYmJsZV90eXBlIG5pYmJsZXNbNF07Ci19IHNoX29wY29kZV9pbmZvOwotCi0jaWZkZWYgREVGSU5FX1RBQkxFCi0KLXNoX29wY29kZV9pbmZvIHNoX3RhYmxlW10gPSB7Ci0KLS8qIDAxMTFubm5uaTgqMS4uLi4gYWRkICM8aW1tPiw8UkVHX04+ICAqL3siYWRkIix7QV9JTU0sQV9SRUdfTn0se0hFWF83LFJFR19OLElNTV84fX0sCi0KLS8qIDAwMTFubm5ubW1tbTExMDAgYWRkIDxSRUdfTT4sPFJFR19OPiAqL3siYWRkIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAwMTFubm5ubW1tbTExMTAgYWRkYyA8UkVHX00+LDxSRUdfTj4qL3siYWRkYyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRX19LAotCi0vKiAwMDExbm5ubm1tbW0xMTExIGFkZHYgPFJFR19NPiw8UkVHX04+Ki97ImFkZHYiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMTEwMDEwMDFpOCoxLi4uLiBhbmQgIzxpbW0+LFIwICAgICAgICoveyJhbmQiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYXzksSU1NXzh9fSwKLQotLyogMDAxMG5ubm5tbW1tMTAwMSBhbmQgPFJFR19NPiw8UkVHX04+ICoveyJhbmQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzl9fSwKLQotLyogMTEwMDExMDFpOCoxLi4uLiBhbmQuYiAjPGltbT4sQChSMCxHQlIpKi97ImFuZC5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfRCxJTU1fOH19LAotCi0vKiAxMDEwaTEyLi4uLi4uLi4uIGJyYSA8YmRpc3AxMj4gICAgICAgKi97ImJyYSIse0FfQkRJU1AxMn0se0hFWF9BLEJSQU5DSF8xMn19LAotCi0vKiAxMDExaTEyLi4uLi4uLi4uIGJzciA8YmRpc3AxMj4gICAgICAgKi97ImJzciIse0FfQkRJU1AxMn0se0hFWF9CLEJSQU5DSF8xMn19LAotCi0vKiAxMDAwMTAwMWk4cDEuLi4uIGJ0IDxiZGlzcDg+ICAgICAgICAgKi97ImJ0Iix7QV9CRElTUDh9LHtIRVhfOCxIRVhfOSxCUkFOQ0hfOH19LAotCi0vKiAxMDAwMTAxMWk4cDEuLi4uIGJmIDxiZGlzcDg+ICAgICAgICAgKi97ImJmIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfQixCUkFOQ0hfOH19LAotCi0vKiAxMDAwMTEwMWk4cDEuLi4uIGJ0LnMgPGJkaXNwOD4gICAgICAgKi97ImJ0LnMiLHtBX0JESVNQOH0se0hFWF84LEhFWF9ELEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMTAxaThwMS4uLi4gYnQvcyA8YmRpc3A4PiAgICAgICAqL3siYnQvcyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0QsQlJBTkNIXzh9fSwKLQotLyogMTAwMDExMTFpOHAxLi4uLiBiZi5zIDxiZGlzcDg+ICAgICAgICoveyJiZi5zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRixCUkFOQ0hfOH19LAotCi0vKiAxMDAwMTExMWk4cDEuLi4uIGJmL3MgPGJkaXNwOD4gICAgICAgKi97ImJmL3MiLHtBX0JESVNQOH0se0hFWF84LEhFWF9GLEJSQU5DSF84fX0sCi0KLS8qIDAwMDAwMDAwMDAxMDEwMDAgY2xybWFjICAgICAgICAgICAgICAqL3siY2xybWFjIix7MH0se0hFWF8wLEhFWF8wLEhFWF8yLEhFWF84fX0sCi0KLS8qIDAwMDAwMDAwMDEwMDEwMDAgY2xycyAgICAgICAgICAgICAgICAqL3siY2xycyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfNCxIRVhfOH19LAotCi0vKiAwMDAwMDAwMDAwMDAxMDAwIGNscnQgICAgICAgICAgICAgICAgKi97ImNscnQiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzAsSEVYXzh9fSwKLQotLyogMTAwMDEwMDBpOCoxLi4uLiBjbXAvZXEgIzxpbW0+LFIwICAgICoveyJjbXAvZXEiLHtBX0lNTSxBX1IwfSx7SEVYXzgsSEVYXzgsSU1NXzh9fSwKLQotLyogMDAxMW5ubm5tbW1tMDAwMCBjbXAvZXEgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9lcSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfMH19LAotCi0vKiAwMDExbm5ubm1tbW0wMDExIGNtcC9nZSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2dlIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8zfX0sCi0KLS8qIDAwMTFubm5ubW1tbTAxMTEgY21wL2d0IDxSRUdfTT4sPFJFR19OPioveyJjbXAvZ3QiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMDAxMW5ubm5tbW1tMDExMCBjbXAvaGkgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9oaSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAwMDExbm5ubm1tbW0wMDEwIGNtcC9ocyA8UkVHX00+LDxSRUdfTj4qL3siY21wL2hzIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMDAwMTAxMDEgY21wL3BsIDxSRUdfTj4gICAgICAqL3siY21wL3BsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF81fX0sCi0KLS8qIDAxMDBubm5uMDAwMTAwMDEgY21wL3B6IDxSRUdfTj4gICAgICAqL3siY21wL3B6Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8xfX0sCi0KLS8qIDAwMTBubm5ubW1tbTExMDAgY21wL3N0ciA8UkVHX00+LDxSRUdfTj4qL3siY21wL3N0ciIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfQ319LAotCi0vKiAwMDEwbm5ubm1tbW0wMTExIGRpdjBzIDxSRUdfTT4sPFJFR19OPioveyJkaXYwcyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAwMDAwMDAwMDAwMDExMDAxIGRpdjB1ICAgICAgICAgICAgICAgKi97ImRpdjB1Iix7MH0se0hFWF8wLEhFWF8wLEhFWF8xLEhFWF85fX0sCi0KLS8qIDAwMTFubm5ubW1tbTAxMDAgZGl2MSA8UkVHX00+LDxSRUdfTj4qL3siZGl2MSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfNH19LAotCi0vKiAwMTEwbm5ubm1tbW0xMTEwIGV4dHMuYiA8UkVHX00+LDxSRUdfTj4qL3siZXh0cy5iIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAxMTBubm5ubW1tbTExMTEgZXh0cy53IDxSRUdfTT4sPFJFR19OPioveyJleHRzLnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMDExMG5ubm5tbW1tMTEwMCBleHR1LmIgPFJFR19NPiw8UkVHX04+Ki97ImV4dHUuYiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQ319LAotCi0vKiAwMTEwbm5ubm1tbW0xMTAxIGV4dHUudyA8UkVHX00+LDxSRUdfTj4qL3siZXh0dS53Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9EfX0sCi0KLS8qIDAxMDBubm5uMDAxMDEwMTEgam1wIEA8UkVHX04+ICAgICAgICAqL3siam1wIix7QV9JTkRfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF9CfX0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMTEganNyIEA8UkVHX04+ICAgICAgICAqL3sianNyIix7QV9JTkRfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF9CfX0sCi0KLS8qIDAxMDBubm5uMDAwMDExMTAgbGRjIDxSRUdfTj4sU1IgICAgICAqL3sibGRjIix7QV9SRUdfTixBX1NSfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYX0V9fSwKLQotLyogMDEwMG5ubm4wMDAxMTExMCBsZGMgPFJFR19OPixHQlIgICAgICoveyJsZGMiLHtBX1JFR19OLEFfR0JSfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYX0V9fSwKLQotLyogMDEwMG5ubm4wMDEwMTExMCBsZGMgPFJFR19OPixWQlIgICAgICoveyJsZGMiLHtBX1JFR19OLEFfVkJSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYX0V9fSwKLQotLyogMDEwMG5ubm4wMDExMTExMCBsZGMgPFJFR19OPixTU1IgICAgICoveyJsZGMiLHtBX1JFR19OLEFfU1NSfSx7SEVYXzQsUkVHX04sSEVYXzMsSEVYX0V9fSwKLQotLyogMDEwMG5ubm4wMTAwMTExMCBsZGMgPFJFR19OPixTUEMgICAgICoveyJsZGMiLHtBX1JFR19OLEFfU1BDfSx7SEVYXzQsUkVHX04sSEVYXzQsSEVYX0V9fSwKLQotLyogMDEwMG5ubm4xMTExMTAxMCBsZGMgPFJFR19OPixEQlIgICAgICoveyJsZGMiLHtBX1JFR19OLEFfREJSfSx7SEVYXzQsUkVHX04sSEVYX0YsSEVYX0F9fSwKLQotLyogMDEwMG5ubm4xeHh4MTExMCBsZGMgPFJFR19OPixSbl9CQU5LICoveyJsZGMiLHtBX1JFR19OLEFfUkVHX0J9LHtIRVhfNCxSRUdfTixSRUdfQixIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMDAwMTExIGxkYy5sIEA8UkVHX04+KyxTUiAgKi97ImxkYy5sIix7QV9JTkNfTixBX1NSfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMDAxMDExMSBsZGMubCBAPFJFR19OPissR0JSICoveyJsZGMubCIse0FfSU5DX04sQV9HQlJ9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAwMTAwMTExIGxkYy5sIEA8UkVHX04+KyxWQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX1ZCUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDAxMTAxMTEgbGRjLmwgQDxSRUdfTj4rLFNTUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1NSfSx7SEVYXzQsUkVHX04sSEVYXzMsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMTAwMDExMSBsZGMubCBAPFJFR19OPissU1BDICoveyJsZGMubCIse0FfSU5DX04sQV9TUEN9LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfN319LAotCi0vKiAwMTAwbm5ubjExMTEwMTEwIGxkYy5sIEA8UkVHX04+KyxEQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX0RCUn0se0hFWF80LFJFR19OLEhFWF9GLEhFWF82fX0sCi0KLS8qIDAxMDBubm5uMXh4eDAxMTEgbGRjLmwgPFJFR19OPixSbl9CQU5LICoveyJsZGMubCIse0FfSU5DX04sQV9SRUdfQn0se0hFWF80LFJFR19OLFJFR19CLEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMTAgbGRzIDxSRUdfTj4sTUFDSCAgICAqL3sibGRzIix7QV9SRUdfTixBX01BQ0h9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAwMDExMDEwIGxkcyA8UkVHX04+LE1BQ0wgICAgKi97ImxkcyIse0FfUkVHX04sQV9NQUNMfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYX0F9fSwKLQotLyogMDEwMG5ubm4wMDEwMTAxMCBsZHMgPFJFR19OPixQUiAgICAgICoveyJsZHMiLHtBX1JFR19OLEFfUFJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAxMDExMDEwIGxkcyA8UkVHX04+LEZQVUwgICAgKi97ImxkcyIse0FfUkVHX00sRlBVTF9OfSx7SEVYXzQsUkVHX00sSEVYXzUsSEVYX0F9fSwKLQotLyogMDEwMG5ubm4wMTEwMTAxMCBsZHMgPFJFR19NPixGUFNDUiAgICoveyJsZHMiLHtBX1JFR19NLEZQU0NSX059LHtIRVhfNCxSRUdfTSxIRVhfNixIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAwMDAwMTEwIGxkcy5sIEA8UkVHX04+KyxNQUNIKi97Imxkcy5sIix7QV9JTkNfTixBX01BQ0h9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNn19LAotCi0vKiAwMTAwbm5ubjAwMDEwMTEwIGxkcy5sIEA8UkVHX04+KyxNQUNMKi97Imxkcy5sIix7QV9JTkNfTixBX01BQ0x9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfNn19LAotCi0vKiAwMTAwbm5ubjAwMTAwMTEwIGxkcy5sIEA8UkVHX04+KyxQUiAgKi97Imxkcy5sIix7QV9JTkNfTixBX1BSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzZ9fSwKLQotLyogMDEwMG5ubm4wMTAxMDExMCBsZHMubCBAPFJFR19NPissRlBVTCoveyJsZHMubCIse0FfSU5DX00sRlBVTF9OfSx7SEVYXzQsUkVHX00sSEVYXzUsSEVYXzZ9fSwKLQotLyogMDEwMG5ubm4wMTEwMDExMCBsZHMubCBAPFJFR19NPissRlBTQ1IqL3sibGRzLmwiLHtBX0lOQ19NLEZQU0NSX059LHtIRVhfNCxSRUdfTSxIRVhfNixIRVhfNn19LAotCi0vKiAwMDAwMDAwMDAwMTExMDAwIGxkdGxiICAgICAgICAgICAgICAgKi97ImxkdGxiIix7MH0se0hFWF8wLEhFWF8wLEhFWF8zLEhFWF84fX0sCi0KLS8qIDAxMDBubm5ubW1tbTExMTEgbWFjLncgQDxSRUdfTT4rLEA8UkVHX04+KyoveyJtYWMudyIse0FfSU5DX00sQV9JTkNfTn0se0hFWF80LFJFR19OLFJFR19NLEhFWF9GfX0sCi0KLS8qIDExMTBubm5uaTgqMS4uLi4gbW92ICM8aW1tPiw8UkVHX04+ICAqL3sibW92Iix7QV9JTU0sQV9SRUdfTn0se0hFWF9FLFJFR19OLElNTV84fX0sCi0KLS8qIDAxMTBubm5ubW1tbTAwMTEgbW92IDxSRUdfTT4sPFJFR19OPiAqL3sibW92Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF8zfX0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMDAgbW92LmIgPFJFR19NPixAKFIwLDxSRUdfTj4pKi97Im1vdi5iIix7IEFfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfNH19LAotCi0vKiAwMDEwbm5ubm1tbW0wMTAwIG1vdi5iIDxSRUdfTT4sQC08UkVHX04+Ki97Im1vdi5iIix7IEFfUkVHX00sQV9ERUNfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDAwMTBubm5ubW1tbTAwMDAgbW92LmIgPFJFR19NPixAPFJFR19OPioveyJtb3YuYiIseyBBX1JFR19NLEFfSU5EX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfMH19LAotCi0vKiAxMDAwMDEwMG1tbW1pNCoxIG1vdi5iIEAoPGRpc3A+LDxSRUdfTT4pLFIwKi97Im1vdi5iIix7QV9ESVNQX1JFR19NLEFfUjB9LHtIRVhfOCxIRVhfNCxSRUdfTSxJTU1fNH19LAotCi0vKiAxMTAwMDEwMGk4KjEuLi4uIG1vdi5iIEAoPGRpc3A+LEdCUiksUjAqL3sibW92LmIiLHtBX0RJU1BfR0JSLEFfUjB9LHtIRVhfQyxIRVhfNCxJTU1fOH19LAotCi0vKiAwMDAwbm5ubm1tbW0xMTAwIG1vdi5iIEAoUjAsPFJFR19NPiksPFJFR19OPioveyJtb3YuYiIse0FfSU5EX1IwX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfQ319LAotCi0vKiAwMTEwbm5ubm1tbW0wMTAwIG1vdi5iIEA8UkVHX00+Kyw8UkVHX04+Ki97Im1vdi5iIix7QV9JTkNfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzR9fSwKLQotLyogMDExMG5ubm5tbW1tMDAwMCBtb3YuYiBAPFJFR19NPiw8UkVHX04+Ki97Im1vdi5iIix7QV9JTkRfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzB9fSwKLQotLyogMTAwMDAwMDBtbW1taTQqMSBtb3YuYiBSMCxAKDxkaXNwPiw8UkVHX00+KSoveyJtb3YuYiIse0FfUjAsQV9ESVNQX1JFR19NfSx7SEVYXzgsSEVYXzAsUkVHX00sSU1NXzR9fSwKLQotLyogMTEwMDAwMDBpOCoxLi4uLiBtb3YuYiBSMCxAKDxkaXNwPixHQlIpKi97Im1vdi5iIix7QV9SMCxBX0RJU1BfR0JSfSx7SEVYX0MsSEVYXzAsSU1NXzh9fSwKLQotLyogMDAwMW5ubm5tbW1taTQqNCBtb3YubCA8UkVHX00+LEAoPGRpc3A+LDxSRUdfTj4pKi97Im1vdi5sIix7IEFfUkVHX00sQV9ESVNQX1JFR19OfSx7SEVYXzEsUkVHX04sUkVHX00sSU1NXzRCWTR9fSwKLQotLyogMDAwMG5ubm5tbW1tMDExMCBtb3YubCA8UkVHX00+LEAoUjAsPFJFR19OPikqL3sibW92LmwiLHsgQV9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMTAgbW92LmwgPFJFR19NPixALTxSRUdfTj4qL3sibW92LmwiLHsgQV9SRUdfTSxBX0RFQ19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMDAxMG5ubm5tbW1tMDAxMCBtb3YubCA8UkVHX00+LEA8UkVHX04+Ki97Im1vdi5sIix7IEFfUkVHX00sQV9JTkRfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF8yfX0sCi0KLS8qIDAxMDFubm5ubW1tbWk0KjQgbW92LmwgQCg8ZGlzcD4sPFJFR19NPiksPFJFR19OPioveyJtb3YubCIse0FfRElTUF9SRUdfTSxBX1JFR19OfSx7SEVYXzUsUkVHX04sUkVHX00sSU1NXzRCWTR9fSwKLQotLyogMTEwMDAxMTBpOCo0Li4uLiBtb3YubCBAKDxkaXNwPixHQlIpLFIwKi97Im1vdi5sIix7QV9ESVNQX0dCUixBX1IwfSx7SEVYX0MsSEVYXzYsSU1NXzhCWTR9fSwKLQotLyogMTEwMW5ubm5pOHA0Li4uLiBtb3YubCBAKDxkaXNwPixQQyksPFJFR19OPioveyJtb3YubCIse0FfRElTUF9QQyxBX1JFR19OfSx7SEVYX0QsUkVHX04sUENSRUxJTU1fOEJZNH19LAotCi0vKiAwMDAwbm5ubm1tbW0xMTEwIG1vdi5sIEAoUjAsPFJFR19NPiksPFJFR19OPioveyJtb3YubCIse0FfSU5EX1IwX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfRX19LAotCi0vKiAwMTEwbm5ubm1tbW0wMTEwIG1vdi5sIEA8UkVHX00+Kyw8UkVHX04+Ki97Im1vdi5sIix7QV9JTkNfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMDExMG5ubm5tbW1tMDAxMCBtb3YubCBAPFJFR19NPiw8UkVHX04+Ki97Im1vdi5sIix7QV9JTkRfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzJ9fSwKLQotLyogMTEwMDAwMTBpOCo0Li4uLiBtb3YubCBSMCxAKDxkaXNwPixHQlIpKi97Im1vdi5sIix7QV9SMCxBX0RJU1BfR0JSfSx7SEVYX0MsSEVYXzIsSU1NXzhCWTR9fSwKLQotLyogMDAwMG5ubm5tbW1tMDEwMSBtb3YudyA8UkVHX00+LEAoUjAsPFJFR19OPikqL3sibW92LnciLHsgQV9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF81fX0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMDEgbW92LncgPFJFR19NPixALTxSRUdfTj4qL3sibW92LnciLHsgQV9SRUdfTSxBX0RFQ19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzV9fSwKLQotLyogMDAxMG5ubm5tbW1tMDAwMSBtb3YudyA8UkVHX00+LEA8UkVHX04+Ki97Im1vdi53Iix7IEFfUkVHX00sQV9JTkRfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF8xfX0sCi0KLS8qIDEwMDAwMTAxbW1tbWk0KjIgbW92LncgQCg8ZGlzcD4sPFJFR19NPiksUjAqL3sibW92LnciLHtBX0RJU1BfUkVHX00sQV9SMH0se0hFWF84LEhFWF81LFJFR19NLElNTV80QlkyfX0sCi0KLS8qIDExMDAwMTAxaTgqMi4uLi4gbW92LncgQCg8ZGlzcD4sR0JSKSxSMCoveyJtb3YudyIse0FfRElTUF9HQlIsQV9SMH0se0hFWF9DLEhFWF81LElNTV84QlkyfX0sCi0KLS8qIDEwMDFubm5uaThwMi4uLi4gbW92LncgQCg8ZGlzcD4sUEMpLDxSRUdfTj4qL3sibW92LnciLHtBX0RJU1BfUEMsQV9SRUdfTn0se0hFWF85LFJFR19OLFBDUkVMSU1NXzhCWTJ9fSwKLQotLyogMDAwMG5ubm5tbW1tMTEwMSBtb3YudyBAKFIwLDxSRUdfTT4pLDxSRUdfTj4qL3sibW92LnciLHtBX0lORF9SMF9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0R9fSwKLQotLyogMDExMG5ubm5tbW1tMDEwMSBtb3YudyBAPFJFR19NPissPFJFR19OPioveyJtb3YudyIse0FfSU5DX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF81fX0sCi0KLS8qIDAxMTBubm5ubW1tbTAwMDEgbW92LncgQDxSRUdfTT4sPFJFR19OPioveyJtb3YudyIse0FfSU5EX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF8xfX0sCi0KLS8qIDEwMDAwMDAxbW1tbWk0KjIgbW92LncgUjAsQCg8ZGlzcD4sPFJFR19NPikqL3sibW92LnciLHtBX1IwLEFfRElTUF9SRUdfTX0se0hFWF84LEhFWF8xLFJFR19NLElNTV80QlkyfX0sCi0KLS8qIDExMDAwMDAxaTgqMi4uLi4gbW92LncgUjAsQCg8ZGlzcD4sR0JSKSoveyJtb3YudyIse0FfUjAsQV9ESVNQX0dCUn0se0hFWF9DLEhFWF8xLElNTV84QlkyfX0sCi0KLS8qIDExMDAwMTExaThwNC4uLi4gbW92YSBAKDxkaXNwPixQQyksUjAqL3sibW92YSIse0FfRElTUF9QQyxBX1IwfSx7SEVYX0MsSEVYXzcsUENSRUxJTU1fOEJZNH19LAotLyogMDAwMG5ubm4xMTAwMDAxMSBtb3ZjYS5sIFIwLEA8UkVHX04+ICoveyJtb3ZjYS5sIix7QV9SMCxBX0lORF9OfSx7SEVYXzAsUkVHX04sSEVYX0MsSEVYXzN9fSwKLQotCi0vKiAwMDAwbm5ubjAwMTAxMDAxIG1vdnQgPFJFR19OPiAgICAgICAgKi97Im1vdnQiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYXzl9fSwKLQotLyogMDAxMG5ubm5tbW1tMTExMSBtdWxzLncgPFJFR19NPiw8UkVHX04+Ki97Im11bHMudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfRn19LAotLyogMDAxMG5ubm5tbW1tMTExMSBtdWxzIDxSRUdfTT4sPFJFR19OPioveyJtdWxzIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9GfX0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMTEgbXVsLmwgPFJFR19NPiw8UkVHX04+Ki97Im11bC5sIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDAwMTBubm5ubW1tbTExMTAgbXVsdS53IDxSRUdfTT4sPFJFR19OPioveyJtdWx1LnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0V9fSwKLS8qIDAwMTBubm5ubW1tbTExMTAgbXVsdSA8UkVHX00+LDxSRUdfTj4qL3sibXVsdSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfRX19LAotCi0vKiAwMTEwbm5ubm1tbW0xMDExIG5lZyA8UkVHX00+LDxSRUdfTj4gKi97Im5lZyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQn19LAotCi0vKiAwMTEwbm5ubm1tbW0xMDEwIG5lZ2MgPFJFR19NPiw8UkVHX04+Ki97Im5lZ2MiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMDAwMDAwMDAwMDAwMTAwMSBub3AgICAgICAgICAgICAgICAgICoveyJub3AiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzAsSEVYXzl9fSwKLQotLyogMDExMG5ubm5tbW1tMDExMSBub3QgPFJFR19NPiw8UkVHX04+ICoveyJub3QiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzd9fSwKLS8qIDAwMDBubm5uMTAwMTAwMTEgb2NiaSBAPFJFR19OPiAgICAgICAqL3sib2NiaSIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfOSxIRVhfM319LAotCi0vKiAwMDAwbm5ubjEwMTAwMDExIG9jYnAgQDxSRUdfTj4gICAgICAgKi97Im9jYnAiLHtBX0lORF9OfSx7SEVYXzAsUkVHX04sSEVYX0EsSEVYXzN9fSwKLQotLyogMDAwMG5ubm4xMDExMDAxMSBvY2J3YiBAPFJFR19OPiAgICAgICoveyJvY2J3YiIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQixIRVhfM319LAotCi0KLS8qIDExMDAxMDExaTgqMS4uLi4gb3IgIzxpbW0+LFIwICAgICAgICAqL3sib3IiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYX0IsSU1NXzh9fSwKLQotLyogMDAxMG5ubm5tbW1tMTAxMSBvciA8UkVHX00+LDxSRUdfTj4gICoveyJvciIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfQn19LAotCi0vKiAxMTAwMTExMWk4KjEuLi4uIG9yLmIgIzxpbW0+LEAoUjAsR0JSKSoveyJvci5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfRixJTU1fOH19LAotCi0vKiAwMDAwbm5ubjEwMDAwMDExIHByZWYgQDxSRUdfTj4gICAgICAgKi97InByZWYiLHtBX0lORF9OfSx7SEVYXzAsUkVHX04sSEVYXzgsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMDEwMDEwMCByb3RjbCA8UkVHX04+ICAgICAgICoveyJyb3RjbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfNH19LAotCi0vKiAwMTAwbm5ubjAwMTAwMTAxIHJvdGNyIDxSRUdfTj4gICAgICAgKi97InJvdGNyIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF81fX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMDAgcm90bCA8UkVHX04+ICAgICAgICAqL3sicm90bCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNH19LAotCi0vKiAwMTAwbm5ubjAwMDAwMTAxIHJvdHIgPFJFR19OPiAgICAgICAgKi97InJvdHIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzV9fSwKLQotLyogMDAwMDAwMDAwMDEwMTAxMSBydGUgICAgICAgICAgICAgICAgICoveyJydGUiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzIsSEVYX0J9fSwKLQotLyogMDAwMDAwMDAwMDAwMTAxMSBydHMgICAgICAgICAgICAgICAgICoveyJydHMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzAsSEVYX0J9fSwKLQotLyogMDAwMDAwMDAwMTAxMTAwMCBzZXRzICAgICAgICAgICAgICAgICoveyJzZXRzIix7MH0se0hFWF8wLEhFWF8wLEhFWF81LEhFWF84fX0sCi0vKiAwMDAwMDAwMDAwMDExMDAwIHNldHQgICAgICAgICAgICAgICAgKi97InNldHQiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYXzh9fSwKLQotLyogMDEwMG5ubm5tbW1tMTEwMCBzaGFkIDxSRUdfTT4sPFJFR19OPioveyJzaGFkIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF80LFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAxMDBubm5ubW1tbTExMDEgc2hsZCA8UkVHX00+LDxSRUdfTj4qL3sic2hsZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNCxSRUdfTixSRUdfTSxIRVhfRH19LAotCi0vKiAwMTAwbm5ubjAwMTAwMDAwIHNoYWwgPFJFR19OPiAgICAgICAgKi97InNoYWwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzB9fSwKLQotLyogMDEwMG5ubm4wMDEwMDAwMSBzaGFyIDxSRUdfTj4gICAgICAgICoveyJzaGFyIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8xfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMDAgc2hsbCA8UkVHX04+ICAgICAgICAqL3sic2hsbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMH19LAotCi0vKiAwMTAwbm5ubjAwMTAxMDAwIHNobGwxNiA8UkVHX04+ICAgICAgKi97InNobGwxNiIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfOH19LAotCi0vKiAwMTAwbm5ubjAwMDAxMDAwIHNobGwyIDxSRUdfTj4gICAgICAgKi97InNobGwyIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF84fX0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMDAgc2hsbDggPFJFR19OPiAgICAgICAqL3sic2hsbDgiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzh9fSwKLQotLyogMDEwMG5ubm4wMDAwMDAwMSBzaGxyIDxSRUdfTj4gICAgICAgICoveyJzaGxyIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8xfX0sCi0KLS8qIDAxMDBubm5uMDAxMDEwMDEgc2hscjE2IDxSRUdfTj4gICAgICAqL3sic2hscjE2Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF85fX0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMDEgc2hscjIgPFJFR19OPiAgICAgICAqL3sic2hscjIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzl9fSwKLQotLyogMDEwMG5ubm4wMDAxMTAwMSBzaGxyOCA8UkVHX04+ICAgICAgICoveyJzaGxyOCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfOX19LAotCi0vKiAwMDAwMDAwMDAwMDExMDExIHNsZWVwICAgICAgICAgICAgICAgKi97InNsZWVwIix7MH0se0hFWF8wLEhFWF8wLEhFWF8xLEhFWF9CfX0sCi0KLS8qIDAwMDBubm5uMDAwMDAwMTAgc3RjIFNSLDxSRUdfTj4gICAgICAqL3sic3RjIix7QV9TUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzAsSEVYXzJ9fSwKLQotLyogMDAwMG5ubm4wMDAxMDAxMCBzdGMgR0JSLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX0dCUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzEsSEVYXzJ9fSwKLQotLyogMDAwMG5ubm4wMDEwMDAxMCBzdGMgVkJSLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX1ZCUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYXzJ9fSwKLQotLyogMDAwMG5ubm4wMDExMDAxMCBzdGMgU1NSLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX1NTUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzMsSEVYXzJ9fSwKLQotLyogMDAwMG5ubm4wMTAwMDAxMCBzdGMgU1BDLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX1NQQyxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzQsSEVYXzJ9fSwKLQotLyogMDAwMG5ubm4wMDExMTAxMCBzdGMgU0dSLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX1NHUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzMsSEVYX0F9fSwKLQotLyogMDAwMG5ubm4xMTExMTAxMCBzdGMgREJSLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX0RCUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYX0YsSEVYX0F9fSwKLQotLyogMDAwMG5ubm4xeHh4MDAxMCBzdGMgUm5fQkFOSyw8UkVHX04+ICoveyJzdGMiLHtBX1JFR19CLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfQixIRVhfMn19LAotCi0vKiAwMTAwbm5ubjAwMDAwMDExIHN0Yy5sIFNSLEAtPFJFR19OPiAgKi97InN0Yy5sIix7QV9TUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMDAxMDAxMSBzdGMubCBHQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfR0JSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMTAwMDExIHN0Yy5sIFZCUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9WQlIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDAxMTAwMTEgc3RjLmwgU1NSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1NTUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzMsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMTAwMDAxMSBzdGMubCBTUEMsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1BDLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMTEwMDEwIHN0Yy5sIFNHUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9TR1IsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8zLEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMTExMTAwMTAgc3RjLmwgREJSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX0RCUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYX0YsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4xeHh4MDAxMSBzdGMubCBSbl9CQU5LLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1JFR19CLEFfREVDX059LHtIRVhfNCxSRUdfTixSRUdfQixIRVhfM319LAotCi0vKiAwMDAwbm5ubjAwMDAxMDEwIHN0cyBNQUNILDxSRUdfTj4gICAgKi97InN0cyIse0FfTUFDSCxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzAsSEVYX0F9fSwKLQotLyogMDAwMG5ubm4wMDAxMTAxMCBzdHMgTUFDTCw8UkVHX04+ICAgICoveyJzdHMiLHtBX01BQ0wsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8xLEhFWF9BfX0sCi0KLS8qIDAwMDBubm5uMDAxMDEwMTAgc3RzIFBSLDxSRUdfTj4gICAgICAqL3sic3RzIix7QV9QUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYX0F9fSwKLQotLyogMDAwMG5ubm4wMTAxMTAxMCBzdHMgRlBVTCw8UkVHX04+ICAgICoveyJzdHMiLHtGUFVMX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF81LEhFWF9BfX0sCi0KLS8qIDAwMDBubm5uMDExMDEwMTAgc3RzIEZQU0NSLDxSRUdfTj4gICAqL3sic3RzIix7RlBTQ1JfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzYsSEVYX0F9fSwKLQotLyogMDEwMG5ubm4wMDAwMDAxMCBzdHMubCBNQUNILEAtPFJFR19OPioveyJzdHMubCIse0FfTUFDSCxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMDAxMDAxMCBzdHMubCBNQUNMLEAtPFJFR19OPioveyJzdHMubCIse0FfTUFDTCxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMDEwMDAxMCBzdHMubCBQUixALTxSRUdfTj4gICoveyJzdHMubCIse0FfUFIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMDEwMTAwMTAgc3RzLmwgRlBVTCxALTxSRUdfTj4qL3sic3RzLmwiLHtGUFVMX00sQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF81LEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMDExMDAwMTAgc3RzLmwgRlBTQ1IsQC08UkVHX04+Ki97InN0cy5sIix7RlBTQ1JfTSxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzYsSEVYXzJ9fSwKLQotLyogMDAxMW5ubm5tbW1tMTAwMCBzdWIgPFJFR19NPiw8UkVHX04+ICoveyJzdWIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzh9fSwKLQotLyogMDAxMW5ubm5tbW1tMTAxMCBzdWJjIDxSRUdfTT4sPFJFR19OPioveyJzdWJjIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9BfX0sCi0KLS8qIDAwMTFubm5ubW1tbTEwMTEgc3VidiA8UkVHX00+LDxSRUdfTj4qL3sic3VidiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfQn19LAotCi0vKiAwMTEwbm5ubm1tbW0xMDAwIHN3YXAuYiA8UkVHX00+LDxSRUdfTj4qL3sic3dhcC5iIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMDEgc3dhcC53IDxSRUdfTT4sPFJFR19OPioveyJzd2FwLnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzl9fSwKLQotLyogMDEwMG5ubm4wMDAxMTAxMSB0YXMuYiBAPFJFR19OPiAgICAgICoveyJ0YXMuYiIse0FfSU5EX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfQn19LAotCi0vKiAxMTAwMDAxMWk4KjEuLi4uIHRyYXBhICM8aW1tPiAgICAgICAgKi97InRyYXBhIix7QV9JTU19LHtIRVhfQyxIRVhfMyxJTU1fOH19LAotCi0vKiAxMTAwMTAwMGk4KjEuLi4uIHRzdCAjPGltbT4sUjAgICAgICAgKi97InRzdCIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfOCxJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMDAwIHRzdCA8UkVHX00+LDxSRUdfTj4gKi97InRzdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfOH19LAotCi0vKiAxMTAwMTEwMGk4KjEuLi4uIHRzdC5iICM8aW1tPixAKFIwLEdCUikqL3sidHN0LmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9DLElNTV84fX0sCi0KLS8qIDExMDAxMDEwaTgqMS4uLi4geG9yICM8aW1tPixSMCAgICAgICAqL3sieG9yIix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF9BLElNTV84fX0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMTAgeG9yIDxSRUdfTT4sPFJFR19OPiAqL3sieG9yIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9BfX0sCi0KLS8qIDExMDAxMTEwaTgqMS4uLi4geG9yLmIgIzxpbW0+LEAoUjAsR0JSKSoveyJ4b3IuYiIse0FfSU1NLEFfUjBfR0JSfSx7SEVYX0MsSEVYX0UsSU1NXzh9fSwKLQotLyogMDAxMG5ubm5tbW1tMTEwMSB4dHJjdCA8UkVHX00+LDxSRUdfTj4qL3sieHRyY3QiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0R9fSwKLQotLyogMDAwMG5ubm5tbW1tMDExMSBtdWwubCA8UkVHX00+LDxSRUdfTj4qL3sibXVsLmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMDAxMDAwMCBkdCA8UkVHX04+ICAgICAgICAgICoveyJkdCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfMH19LAotCi0vKiAwMDExbm5ubm1tbW0xMTAxIGRtdWxzLmwgPFJFR19NPiw8UkVHX04+Ki97ImRtdWxzLmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0R9fSwKLQotLyogMDAxMW5ubm5tbW1tMDEwMSBkbXVsdS5sIDxSRUdfTT4sPFJFR19OPioveyJkbXVsdS5sIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF81fX0sCi0KLS8qIDAwMDBubm5ubW1tbTExMTEgbWFjLmwgQDxSRUdfTT4rLEA8UkVHX04+KyoveyJtYWMubCIse0FfSU5DX00sQV9JTkNfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9GfX0sCi0KLS8qIDAwMDBubm5uMDAxMDAwMTEgYnJhZiA8UkVHX04+ICAgICAgICoveyJicmFmIix7QV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8yLEhFWF8zfX0sCi0KLS8qIDAwMDBubm5uMDAwMDAwMTEgYnNyZiA8UkVHX04+ICAgICAgICoveyJic3JmIix7QV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8wLEhFWF8zfX0sCi0KLS8qIDExMTFubm5uMDEwMTExMDEgZmFicyA8Rl9SRUdfTj4gICAgICoveyJmYWJzIix7RkRfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNSxIRVhfRH19LAotCi0vKiAxMTExbm5ubm1tbW0wMDAwIGZhZGQgPEZfUkVHX00+LDxGX1JFR19OPioveyJmYWRkIix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzB9fSwKLS8qIDExMTFubm4wbW1tMDAwMDAgZmFkZCA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZhZGQiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMH19LAotCi0vKiAxMTExbm5ubm1tbW0wMTAwIGZjbXAvZXEgPEZfUkVHX00+LDxGX1JFR19OPioveyJmY21wL2VxIix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzR9fSwKLS8qIDExMTFubm4wbW1tMDAxMDAgZmNtcC9lcSA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZjbXAvZXEiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNH19LAotCi0vKiAxMTExbm5ubm1tbW0wMTAxIGZjbXAvZ3QgPEZfUkVHX00+LDxGX1JFR19OPioveyJmY21wL2d0Iix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzV9fSwKLS8qIDExMTFubm4wbW1tMDAxMDEgZmNtcC9ndCA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZjbXAvZ3QiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNX19LAotCi0vKiAxMTExbm5uMDEwMTExMTAxIGZjbnZkcyA8RF9SRUdfTj4sRlBVTCoveyJmY252ZHMiLHtEX1JFR19OLEZQVUxfTX0se0hFWF9GLFJFR19OLEhFWF9CLEhFWF9EfX0sCi0KLS8qIDExMTFubm4wMTAxMDExMDEgZmNudnNkIEZQVUwsPERfUkVHX04+Ki97ImZjbnZzZCIse0ZQVUxfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYX0EsSEVYX0R9fSwKLQotLyogMTExMW5ubm5tbW1tMDAxMSBmZGl2IDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZmRpdiIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8zfX0sCi0vKiAxMTExbm5uMG1tbTAwMDExIGZkaXYgPERfUkVHX00+LDxEX1JFR19OPioveyJmZGl2Iix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzN9fSwKLQotLyogMTExMW5ubW0xMTEwMTEwMSBmaXByIDxWX1JFR19NPiw8Vl9SRUdfTj4qL3siZmlwciIse1ZfUkVHX00sVl9SRUdfTn0se0hFWF9GLFJFR19OTSxIRVhfRSxIRVhfRH19LAotCi0vKiAxMTExbm5ubjEwMDAxMTAxIGZsZGkwIDxGX1JFR19OPiAgICAqL3siZmxkaTAiLHtGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzgsSEVYX0R9fSwKLQotLyogMTExMW5ubm4xMDAxMTEwMSBmbGRpMSA8Rl9SRUdfTj4gICAgKi97ImZsZGkxIix7Rl9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF85LEhFWF9EfX0sCi0KLS8qIDExMTFubm5uMDAwMTExMDEgZmxkcyA8Rl9SRUdfTj4sRlBVTCoveyJmbGRzIix7Rl9SRUdfTixGUFVMX019LHtIRVhfRixSRUdfTixIRVhfMSxIRVhfRH19LAotCi0vKiAxMTExbm5ubjAwMTAxMTAxIGZsb2F0IEZQVUwsPEZEX1JFR19OPioveyJmbG9hdCIse0ZQVUxfTSxGRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF8yLEhFWF9EfX0sCi0KLS8qIDExMTFubm5ubW1tbTExMTAgZm1hYyBGUjAsPEZfUkVHX00+LDxGX1JFR19OPioveyJmbWFjIix7Rl9GUjAsRl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0V9fSwKLQotLyogMTExMW5ubm5tbW1tMTEwMCBmbW92IDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZm1vdiIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9DfX0sCi0vKiAxMTExbm5ubm1tbW0xMTAwIGZtb3YgPERYX1JFR19NPiw8RFhfUkVHX04+Ki97ImZtb3YiLHtEWF9SRUdfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdiBAPFJFR19NPiw8Rl9SRUdfTj4qL3siZm1vdiIse0FfSU5EX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fX0sCi0vKiAxMTExbm5ubm1tbW0xMDAwIGZtb3YgQDxSRUdfTT4sPERYX1JFR19OPioveyJmbW92Iix7QV9JTkRfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdiA8Rl9SRUdfTT4sQDxSRUdfTj4qL3siZm1vdiIse0ZfUkVHX00sQV9JTkRfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9BfX0sCi0vKiAxMTExbm5ubm1tbW0xMDEwIGZtb3YgPERYX1JFR19NPixAPFJFR19OPioveyJmbW92Iix7RFhfUkVHX00sQV9JTkRfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9BfX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdiBAPFJFR19NPissPEZfUkVHX04+Ki97ImZtb3YiLHtBX0lOQ19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX19LAotLyogMTExMW5ubm5tbW1tMTAwMSBmbW92IEA8UkVHX00+Kyw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lOQ19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzl9fSwKLQotLyogMTExMW5ubm5tbW1tMTAxMSBmbW92IDxGX1JFR19NPixALTxSRUdfTj4qL3siZm1vdiIse0ZfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfX0sCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YgPERYX1JFR19NPixALTxSRUdfTj4qL3siZm1vdiIse0RYX1JFR19NLEFfREVDX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQn19LAotCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YgQChSMCw8UkVHX00+KSw8Rl9SRUdfTj4qL3siZm1vdiIse0FfSU5EX1IwX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNn19LAotLyogMTExMW5ubm5tbW1tMDExMCBmbW92IEAoUjAsPFJFR19NPiksPERYX1JFR19OPioveyJmbW92Iix7QV9JTkRfUjBfUkVHX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YgPEZfUkVHX00+LEAoUjAsPFJFR19OPikqL3siZm1vdiIse0ZfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfN319LAotLyogMTExMW5ubm5tbW1tMDExMSBmbW92IDxEWF9SRUdfTT4sQChSMCw8UkVHX04+KSoveyJmbW92Iix7RFhfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAxMTExbm5ubm1tbW0xMDAwIGZtb3YuZCBAPFJFR19NPiw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5EX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOH19LAotCi0vKiAxMTExbm5ubm1tbW0xMDEwIGZtb3YuZCA8RFhfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YuZCIse0RYX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YuZCBAPFJFR19NPissPERYX1JFR19OPioveyJmbW92LmQiLHtBX0lOQ19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzl9fSwKLQotLyogMTExMW5ubm5tbW1tMTAxMSBmbW92LmQgPERYX1JFR19NPixALTxSRUdfTj4qL3siZm1vdi5kIix7RFhfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTAgZm1vdi5kIEAoUjAsPFJFR19NPiksPERYX1JFR19OPioveyJmbW92LmQiLHtBX0lORF9SMF9SRUdfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTEgZm1vdi5kIDxEWF9SRUdfTT4sQChSMCw8UkVHX04+KSoveyJmbW92LmQiLHtEWF9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdi5zIEA8UkVHX00+LDxGX1JFR19OPioveyJmbW92LnMiLHtBX0lORF9NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOH19LAotCi0vKiAxMTExbm5ubm1tbW0xMDEwIGZtb3YucyA8Rl9SRUdfTT4sQDxSRUdfTj4qL3siZm1vdi5zIix7Rl9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMSBmbW92LnMgQDxSRUdfTT4rLDxGX1JFR19OPioveyJmbW92LnMiLHtBX0lOQ19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YucyA8Rl9SRUdfTT4sQC08UkVHX04+Ki97ImZtb3YucyIse0ZfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTAgZm1vdi5zIEAoUjAsPFJFR19NPiksPEZfUkVHX04+Ki97ImZtb3YucyIse0FfSU5EX1IwX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YucyA8Rl9SRUdfTT4sQChSMCw8UkVHX04+KSoveyJmbW92LnMiLHtGX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMTExMW5ubm5tbW1tMDAxMCBmbXVsIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZm11bCIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8yfX0sCi0vKiAxMTExbm5uMG1tbTAwMDEwIGZtdWwgPERfUkVHX00+LDxEX1JFR19OPioveyJmbXVsIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzJ9fSwKLQotLyogMTExMW5ubm4wMTAwMTEwMSBmbmVnIDxGRF9SRUdfTj4gICAgICoveyJmbmVnIix7RkRfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNCxIRVhfRH19LAotCi0vKiAxMTExMTAxMTExMTExMTAxIGZyY2hnICAgICAgICAgICAgICAgKi97ImZyY2hnIix7MH0se0hFWF9GLEhFWF9CLEhFWF9GLEhFWF9EfX0sCi0KLS8qIDExMTEwMDExMTExMTExMDEgZnNjaGcgICAgICAgICAgICAgICAqL3siZnNjaGciLHswfSx7SEVYX0YsSEVYXzMsSEVYX0YsSEVYX0R9fSwKLQotLyogMTExMW5ubm4wMTEwMTEwMSBmc3FydCA8RkRfUkVHX04+ICAgICoveyJmc3FydCIse0ZEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzYsSEVYX0R9fSwKLQotLyogMTExMW5ubm4wMDAwMTEwMSBmc3RzIEZQVUwsPEZfUkVHX04+Ki97ImZzdHMiLHtGUFVMX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF8wLEhFWF9EfX0sCi0KLS8qIDExMTFubm5ubW1tbTAwMDEgZnN1YiA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZzdWIiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMX19LAotLyogMTExMW5ubjBtbW0wMDAwMSBmc3ViIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZnN1YiIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8xfX0sCi0KLS8qIDExMTFubm5uMDAxMTExMDEgZnRyYyA8RkRfUkVHX04+LEZQVUwqL3siZnRyYyIse0ZEX1JFR19OLEZQVUxfTX0se0hFWF9GLFJFR19OLEhFWF8zLEhFWF9EfX0sCi0KLS8qIDExMTFubjAxMTExMTExMDEgZnRydiBYTVRSWF9NNCw8Vl9SRUdfbj4qL3siZnRydiIse1hNVFJYX000LFZfUkVHX059LHtIRVhfRixSRUdfTk0sSEVYX0YsSEVYX0R9fSwKLQoteyAwIH0gCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvc3BhcmMtZGlzLmMgYi9vcGNvZGVzL3NwYXJjLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmJkYjYwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvc3BhcmMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzQgKzAsMCBAQAotLyogUHJpbnQgU1BBUkMgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MS05NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9wY29kZS9zcGFyYy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogQml0bWFzayBvZiB2OSBhcmNoaXRlY3R1cmVzLiAgKi8KLSNkZWZpbmUgTUFTS19WOSAoKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjkpIFwKLQkJIHwgKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKSkKLS8qIDEgaWYgSU5TTiBpcyBmb3Igdjkgb25seS4gICovCi0jZGVmaW5lIFY5X09OTFlfUChpbnNuKSAoISAoKGluc24pLT5hcmNoaXRlY3R1cmUgJiB+TUFTS19WOSkpCi0vKiAxIGlmIElOU04gaXMgZm9yIHY5LiAgKi8KLSNkZWZpbmUgVjlfUChpbnNuKSAoKChpbnNuKS0+YXJjaGl0ZWN0dXJlICYgTUFTS19WOSkgIT0gMCkKLQotLyogVGhlIHNvcnRlZCBvcGNvZGUgdGFibGUuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKipzb3J0ZWRfb3Bjb2RlczsKLQotLyogRm9yIGZhc3RlciBsb29rdXAsIGFmdGVyIGluc25zIGFyZSBzb3J0ZWQgdGhleSBhcmUgaGFzaGVkLiAgKi8KLS8qID8/PyBJIHRoaW5rIHRoZXJlIGlzIHJvb20gZm9yIGV2ZW4gbW9yZSBpbXByb3ZlbWVudC4gICovCi0KLSNkZWZpbmUgSEFTSF9TSVpFIDI1NgotLyogSXQgaXMgaW1wb3J0YW50IHRoYXQgd2Ugb25seSBsb29rIGF0IGluc24gY29kZSBiaXRzIGFzIHRoYXQgaXMgaG93IHRoZQotICAgb3Bjb2RlIHRhYmxlIGlzIGhhc2hlZC4gIE9QQ09ERV9CSVRTIGlzIGEgdGFibGUgb2YgdmFsaWQgYml0cyBmb3IgZWFjaAotICAgb2YgdGhlIG1haW4gdHlwZXMgKDAsMSwyLDMpLiAgKi8KLXN0YXRpYyBpbnQgb3Bjb2RlX2JpdHNbNF0gPSB7IDB4MDFjMDAwMDAsIDB4MCwgMHgwMWY4MDAwMCwgMHgwMWY4MDAwMCB9OwotI2RlZmluZSBIQVNIX0lOU04oSU5TTikgXAotICAoKCgoSU5TTikgPj4gMjQpICYgMHhjMCkgfCAoKChJTlNOKSAmIG9wY29kZV9iaXRzWygoSU5TTikgPj4gMzApICYgM10pID4+IDE5KSkKLXN0cnVjdCBvcGNvZGVfaGFzaCB7Ci0gIHN0cnVjdCBvcGNvZGVfaGFzaCAqbmV4dDsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqb3Bjb2RlOwotfTsKLXN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm9wY29kZV9oYXNoX3RhYmxlW0hBU0hfU0laRV07Ci0KLXN0YXRpYyB2b2lkIGJ1aWxkX2hhc2hfdGFibGUKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKiwgc3RydWN0IG9wY29kZV9oYXNoICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgaXNfZGVsYXllZF9icmFuY2ggUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGludCBjb21wYXJlX29wY29kZXMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBpbnQgY29tcHV0ZV9hcmNoX21hc2sgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotCi0vKiBTaWduLWV4dGVuZCBhIHZhbHVlIHdoaWNoIGlzIE4gYml0cyBsb25nLiAgKi8KLSNkZWZpbmUJU0VYKHZhbHVlLCBiaXRzKSBcCi0JKCgoKGludCkodmFsdWUpKSA8PCAoKDggKiBzaXplb2YgKGludCkpIC0gYml0cykpCVwKLQkJCSA+PiAoKDggKiBzaXplb2YgKGludCkpIC0gYml0cykgKQotCi1zdGF0aWMgIGNoYXIgKnJlZ19uYW1lc1tdID0KLXsgImcwIiwgImcxIiwgImcyIiwgImczIiwgImc0IiwgImc1IiwgImc2IiwgImc3IiwJCi0gICJvMCIsICJvMSIsICJvMiIsICJvMyIsICJvNCIsICJvNSIsICJzcCIsICJvNyIsCQotICAibDAiLCAibDEiLCAibDIiLCAibDMiLCAibDQiLCAibDUiLCAibDYiLCAibDciLAkKLSAgImkwIiwgImkxIiwgImkyIiwgImkzIiwgImk0IiwgImk1IiwgImZwIiwgImk3IiwJCi0gICJmMCIsICJmMSIsICJmMiIsICJmMyIsICJmNCIsICJmNSIsICJmNiIsICJmNyIsCQotICAiZjgiLCAiZjkiLCAiZjEwIiwgImYxMSIsICJmMTIiLCAiZjEzIiwgImYxNCIsICJmMTUiLAkKLSAgImYxNiIsICJmMTciLCAiZjE4IiwgImYxOSIsICJmMjAiLCAiZjIxIiwgImYyMiIsICJmMjMiLAotICAiZjI0IiwgImYyNSIsICJmMjYiLCAiZjI3IiwgImYyOCIsICJmMjkiLCAiZjMwIiwgImYzMSIsCi0gICJmMzIiLCAiZjMzIiwgImYzNCIsICJmMzUiLCAiZjM2IiwgImYzNyIsICJmMzgiLCAiZjM5IiwJCi0gICJmNDAiLCAiZjQxIiwgImY0MiIsICJmNDMiLCAiZjQ0IiwgImY0NSIsICJmNDYiLCAiZjQ3IiwJCi0gICJmNDgiLCAiZjQ5IiwgImY1MCIsICJmNTEiLCAiZjUyIiwgImY1MyIsICJmNTQiLCAiZjU1IiwKLSAgImY1NiIsICJmNTciLCAiZjU4IiwgImY1OSIsICJmNjAiLCAiZjYxIiwgImY2MiIsICJmNjMiLAotLyogcHNyLCB3aW0sIHRiciwgZnBzciwgY3BzciBhcmUgdjggb25seS4gICovCi0gICJ5IiwgInBzciIsICJ3aW0iLCAidGJyIiwgInBjIiwgIm5wYyIsICJmcHNyIiwgImNwc3IiCi19OwotCi0jZGVmaW5lCWZyZWdfbmFtZXMJKCZyZWdfbmFtZXNbNCAqIDhdKQotCi0vKiBUaGVzZSBhcmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlcmUgcmVnaXN0ZXIgbnVtYmVyIGluCi0gICByZHByIGFuZCB3cnByIGluc25zLiAgKi8KLXN0YXRpYyBjaGFyICp2OV9wcml2X3JlZ19uYW1lc1tdID0KLXsKLSAgInRwYyIsICJ0bnBjIiwgInRzdGF0ZSIsICJ0dCIsICJ0aWNrIiwgInRiYSIsICJwc3RhdGUiLCAidGwiLAotICAicGlsIiwgImN3cCIsICJjYW5zYXZlIiwgImNhbnJlc3RvcmUiLCAiY2xlYW53aW4iLCAib3RoZXJ3aW4iLAotICAid3N0YXRlIiwgImZxIgotICAvKiAidmVyIiAtIHNwZWNpYWwgY2FzZWQgKi8KLX07Ci0KLS8qIFRoZXNlIGFyZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGVyZSByZWdpc3RlciBudW1iZXIgaW4KLSAgIHJkIGFuZCB3ciBpbnNucyAoLTE2KS4gICovCi1zdGF0aWMgY2hhciAqdjlhX2Fzcl9yZWdfbmFtZXNbXSA9Ci17Ci0gICJwY3IiLCAicGljIiwgImRjciIsICJnc3IiLCAic2V0X3NvZnRpbnQiLCAiY2xlYXJfc29mdGludCIsCi0gICJzb2Z0aW50IiwgInRpY2tfY21wciIKLX07Ci0KLS8qIE1hY3JvcyB1c2VkIHRvIGV4dHJhY3QgaW5zdHJ1Y3Rpb24gZmllbGRzLiAgTm90IGFsbCBmaWVsZHMgaGF2ZQotICAgbWFjcm9zIGRlZmluZWQgaGVyZSwgb25seSB0aG9zZSB3aGljaCBhcmUgYWN0dWFsbHkgdXNlZC4gICovCi0KLSNkZWZpbmUgWF9SRChpKSAoKChpKSA+PiAyNSkgJiAweDFmKQotI2RlZmluZSBYX1JTMShpKSAoKChpKSA+PiAxNCkgJiAweDFmKQotI2RlZmluZSBYX0xEU1RfSShpKSAoKChpKSA+PiAxMykgJiAxKQotI2RlZmluZSBYX0FTSShpKSAoKChpKSA+PiA1KSAmIDB4ZmYpCi0jZGVmaW5lIFhfUlMyKGkpICgoKGkpID4+IDApICYgMHgxZikKLSNkZWZpbmUgWF9JTU0oaSxuKSAoKChpKSA+PiAwKSAmICgoMSA8PCAobikpIC0gMSkpCi0jZGVmaW5lIFhfU0lNTShpLG4pIFNFWCAoWF9JTU0gKChpKSwgKG4pKSwgKG4pKQotI2RlZmluZSBYX0RJU1AyMihpKSAoKChpKSA+PiAwKSAmIDB4M2ZmZmZmKQotI2RlZmluZSBYX0lNTTIyKGkpIFhfRElTUDIyIChpKQotI2RlZmluZSBYX0RJU1AzMChpKSAoKChpKSA+PiAwKSAmIDB4M2ZmZmZmZmYpCi0KLS8qIFRoZXNlIGFyZSBmb3IgdjkuICAqLwotI2RlZmluZSBYX0RJU1AxNihpKSAoKCgoKGkpID4+IDIwKSAmIDMpIDw8IDE0KSB8ICgoKGkpID4+IDApICYgMHgzZmZmKSkKLSNkZWZpbmUgWF9ESVNQMTkoaSkgKCgoaSkgPj4gMCkgJiAweDdmZmZmKQotI2RlZmluZSBYX01FTUJBUihpKSAoKGkpICYgMHg3ZikKLQotLyogSGVyZSBpcyB0aGUgdW5pb24gd2hpY2ggd2FzIHVzZWQgdG8gZXh0cmFjdCBpbnN0cnVjdGlvbiBmaWVsZHMKLSAgIGJlZm9yZSB0aGUgc2hpZnQgYW5kIG1hc2sgbWFjcm9zIHdlcmUgd3JpdHRlbi4KLQotICAgdW5pb24gc3BhcmNfaW5zbgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyBpbnQgY29kZTsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjI7Ci0JICAgI2RlZmluZQlvcAlsZHN0LmFub3AKLQkgICB1bnNpZ25lZCBpbnQgYW5yZDo1OwotCSAgICNkZWZpbmUJcmQJbGRzdC5hbnJkCi0JICAgdW5zaWduZWQgaW50IG9wMzo2OwotCSAgIHVuc2lnbmVkIGludCBhbnJzMTo1OwotCSAgICNkZWZpbmUJcnMxCWxkc3QuYW5yczEKLQkgICB1bnNpZ25lZCBpbnQgaToxOwotCSAgIHVuc2lnbmVkIGludCBhbmFzaTo4OwotCSAgICNkZWZpbmUJYXNpCWxkc3QuYW5hc2kKLQkgICB1bnNpZ25lZCBpbnQgYW5yczI6NTsKLQkgICAjZGVmaW5lCXJzMglsZHN0LmFucnMyCi0JICAgI2RlZmluZQlzaGNudAlyczIKLQkgfSBsZHN0OwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MiwgYW5yZDo1LCBvcDM6NiwgYW5yczE6NSwgaToxOwotCSAgIHVuc2lnbmVkIGludCBJTU0xMzoxMzsKLQkgICAjZGVmaW5lCWltbTEzCUlNTTEzLklNTTEzCi0JIH0gSU1NMTM7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOwotCSAgIHVuc2lnbmVkIGludCBhOjE7Ci0JICAgdW5zaWduZWQgaW50IGNvbmQ6NDsKLQkgICB1bnNpZ25lZCBpbnQgb3AyOjM7Ci0JICAgdW5zaWduZWQgaW50IERJU1AyMjoyMjsKLQkgICAjZGVmaW5lCWRpc3AyMglicmFuY2guRElTUDIyCi0JICAgI2RlZmluZQlpbW0yMglkaXNwMjIKLQkgfSBicmFuY2g7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOwotCSAgIHVuc2lnbmVkIGludCBhOjE7Ci0JICAgdW5zaWduZWQgaW50IHo6MTsKLQkgICB1bnNpZ25lZCBpbnQgcmNvbmQ6MzsKLQkgICB1bnNpZ25lZCBpbnQgb3AyOjM7Ci0JICAgdW5zaWduZWQgaW50IERJU1AxNkhJOjI7Ci0JICAgdW5zaWduZWQgaW50IHA6MTsKLQkgICB1bnNpZ25lZCBpbnQgX3JzMTo1OwotCSAgIHVuc2lnbmVkIGludCBESVNQMTZMTzoxNDsKLQkgfSBicmFuY2gxNjsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjI7Ci0JICAgdW5zaWduZWQgaW50IGFkaXNwMzA6MzA7Ci0JICAgI2RlZmluZQlkaXNwMzAJY2FsbC5hZGlzcDMwCi0JIH0gY2FsbDsKLSAgICAgfTsKLQotICAgKi8KLQotLyogTm9uemVybyBpZiBJTlNOIGlzIHRoZSBvcGNvZGUgZm9yIGEgZGVsYXllZCBicmFuY2guICAqLwotc3RhdGljIGludAotaXNfZGVsYXllZF9icmFuY2ggKGluc24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLXsKLSAgc3RydWN0IG9wY29kZV9oYXNoICpvcDsKLQotICBmb3IgKG9wID0gb3Bjb2RlX2hhc2hfdGFibGVbSEFTSF9JTlNOIChpbnNuKV07IG9wOyBvcCA9IG9wLT5uZXh0KQotICAgIHsKLSAgICAgIENPTlNUIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wY29kZSA9IG9wLT5vcGNvZGU7Ci0gICAgICBpZiAoKG9wY29kZS0+bWF0Y2ggJiBpbnNuKSA9PSBvcGNvZGUtPm1hdGNoCi0JICAmJiAob3Bjb2RlLT5sb3NlICYgaW5zbikgPT0gMCkKLQlyZXR1cm4gKG9wY29kZS0+ZmxhZ3MgJiBGX0RFTEFZRUQpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIGV4dGVybiB2b2lkIHFzb3J0ICgpOyAqLwotCi0vKiBSZWNvcmRzIGN1cnJlbnQgbWFzayBvZiBTUEFSQ19PUENPREVfQVJDSF9GT08gdmFsdWVzLCB1c2VkIHRvIHBhc3MgdmFsdWUKLSAgIHRvIGNvbXBhcmVfb3Bjb2Rlcy4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGN1cnJlbnRfYXJjaF9tYXNrOwotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBNRU1BRERSIG9uIElORk8tPlNUUkVBTS4KLQotICAgV2Ugc3VmZml4IHRoZSBpbnN0cnVjdGlvbiB3aXRoIGEgY29tbWVudCB0aGF0IGdpdmVzIHRoZSBhYnNvbHV0ZQotICAgYWRkcmVzcyBpbnZvbHZlZCwgYXMgd2VsbCBhcyBpdHMgc3ltYm9saWMgZm9ybSwgaWYgdGhlIGluc3RydWN0aW9uCi0gICBpcyBwcmVjZWRlZCBieSBhIGZpbmRhYmxlIGBzZXRoaScgYW5kIGl0IGVpdGhlciBhZGRzIGFuIGltbWVkaWF0ZQotICAgZGlzcGxhY2VtZW50IHRvIHRoYXQgcmVnaXN0ZXIsIG9yIGl0IGlzIGFuIGBhZGQnIG9yIGBvcicgaW5zdHJ1Y3Rpb24KLSAgIG9uIHRoYXQgcmVnaXN0ZXIuICAqLwotCi1pbnQKLXByaW50X2luc25fc3BhcmMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgRklMRSAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgcmVnaXN0ZXIgc3RydWN0IG9wY29kZV9oYXNoICpvcDsKLSAgLyogTm9uemVybyBvZiBvcGNvZGUgdGFibGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICAqLwotICBzdGF0aWMgaW50IG9wY29kZXNfaW5pdGlhbGl6ZWQgPSAwOwotICAvKiBiZmQgbWFjaCBudW1iZXIgb2YgbGFzdCBjYWxsLiAgKi8KLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF9tYWNoID0gMDsKLSAgYmZkX3ZtYSAoKmdldHdvcmQpIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotCi0gIGlmICghb3Bjb2Rlc19pbml0aWFsaXplZAotICAgICAgfHwgaW5mby0+bWFjaCAhPSBjdXJyZW50X21hY2gpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGN1cnJlbnRfYXJjaF9tYXNrID0gY29tcHV0ZV9hcmNoX21hc2sgKGluZm8tPm1hY2gpOwotCi0gICAgICBpZiAoIW9wY29kZXNfaW5pdGlhbGl6ZWQpCi0Jc29ydGVkX29wY29kZXMgPSAoY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKikKLQkgIHhtYWxsb2MgKHNwYXJjX251bV9vcGNvZGVzICogc2l6ZW9mIChzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICopKTsKLSAgICAgIC8qIFJlc2V0IHRoZSBzb3J0ZWQgdGFibGUgc28gd2UgY2FuIHJlc29ydCBpdC4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgc3BhcmNfbnVtX29wY29kZXM7ICsraSkKLQlzb3J0ZWRfb3Bjb2Rlc1tpXSA9ICZzcGFyY19vcGNvZGVzW2ldOwotICAgICAgcXNvcnQgKChjaGFyICopIHNvcnRlZF9vcGNvZGVzLCBzcGFyY19udW1fb3Bjb2RlcywKLQkgICAgIHNpemVvZiAoc29ydGVkX29wY29kZXNbMF0pLCBjb21wYXJlX29wY29kZXMpOwotCi0gICAgICBidWlsZF9oYXNoX3RhYmxlIChzb3J0ZWRfb3Bjb2Rlcywgb3Bjb2RlX2hhc2hfdGFibGUsIHNwYXJjX251bV9vcGNvZGVzKTsKLSAgICAgIGN1cnJlbnRfbWFjaCA9IGluZm8tPm1hY2g7Ci0gICAgICBvcGNvZGVzX2luaXRpYWxpemVkID0gMTsKLSAgICB9Ci0KLSAgewotICAgIGludCBzdGF0dXMgPQotICAgICAgKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLQkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBPbiBTUEFSQ2xpdGUgdmFyaWFudHMgc3VjaCBhcyBEQU5saXRlIChzcGFyYzg2eCksIGluc3RydWN0aW9ucwotICAgICBhcmUgYWx3YXlzIGJpZy1lbmRpYW4gZXZlbiB3aGVuIHRoZSBtYWNoaW5lIGlzIGluIGxpdHRsZS1lbmRpYW4gbW9kZS4gKi8KLSAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyB8fCBpbmZvLT5tYWNoID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSkKLSAgICBnZXR3b3JkID0gYmZkX2dldGIzMjsKLSAgZWxzZQotICAgIGdldHdvcmQgPSBiZmRfZ2V0bDMyOwotCi0gIGluc24gPSBnZXR3b3JkIChidWZmZXIpOwotCi0gIGluZm8tPmluc25faW5mb192YWxpZCA9IDE7CQkJLyogV2UgZG8gcmV0dXJuIHRoaXMgaW5mbyAqLwotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uYnJhbmNoOwkJLyogQXNzdW1lIG5vbiBicmFuY2ggaW5zbiAqLwotICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAwOwkJCS8qIEFzc3VtZSBubyBkZWxheSAqLwotICBpbmZvLT50YXJnZXQgPSAwOwkJCQkvKiBBc3N1bWUgbm8gdGFyZ2V0IGtub3duICovCi0KLSAgZm9yIChvcCA9IG9wY29kZV9oYXNoX3RhYmxlW0hBU0hfSU5TTiAoaW5zbildOyBvcDsgb3AgPSBvcC0+bmV4dCkKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcGNvZGUgPSBvcC0+b3Bjb2RlOwotCi0gICAgICAvKiBJZiB0aGUgaW5zbiBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLCBza2lwIGl0LiAgKi8KLSAgICAgIGlmICghIChvcGNvZGUtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChvcGNvZGUtPm1hdGNoICYgaW5zbikgPT0gb3Bjb2RlLT5tYXRjaAotCSAgJiYgKG9wY29kZS0+bG9zZSAmIGluc24pID09IDApCi0JewotCSAgLyogTm9uemVybyBtZWFucyB0aGF0IHdlIGhhdmUgZm91bmQgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaGFzCi0JICAgICB0aGUgZWZmZWN0IG9mIGFkZGluZyBvciBvcidpbmcgdGhlIGltbTEzIGZpZWxkIHRvIHJzMS4gICovCi0JICBpbnQgaW1tX2FkZGVkX3RvX3JzMSA9IDA7Ci0JICBpbnQgaW1tX29yZWRfdG9fcnMxID0gMDsKLQotCSAgLyogTm9uemVybyBtZWFucyB0aGF0IHdlIGhhdmUgZm91bmQgYSBwbHVzIHNpZ24gaW4gdGhlIGFyZ3MKLQkgICAgIGZpZWxkIG9mIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCSAgaW50IGZvdW5kX3BsdXMgPSAwOwotCSAgCi0JICAvKiBOb256ZXJvIG1lYW5zIHdlIGhhdmUgYW4gYW5udWxsZWQgYnJhbmNoLiAgKi8KLQkgIGludCBpc19hbm51bGxlZCA9IDA7Ci0KLQkgIC8qIERvIHdlIGhhdmUgYW4gYGFkZCcgb3IgYG9yJyBpbnN0cnVjdGlvbiBjb21iaW5pbmcgYW4KLSAgICAgICAgICAgICBpbW1lZGlhdGUgd2l0aCByczE/ICAqLwotCSAgaWYgKG9wY29kZS0+bWF0Y2ggPT0gMHg4MDEwMjAwMCkgLyogb3IgKi8KLQkgICAgaW1tX29yZWRfdG9fcnMxID0gMTsKLQkgIGlmIChvcGNvZGUtPm1hdGNoID09IDB4ODAwMDIwMDApIC8qIGFkZCAqLwotCSAgICBpbW1fYWRkZWRfdG9fcnMxID0gMTsKLQotCSAgaWYgKFhfUlMxIChpbnNuKSAhPSBYX1JEIChpbnNuKQotCSAgICAgICYmIHN0cmNociAob3Bjb2RlLT5hcmdzLCAncicpICE9IDApCi0JICAgICAgLyogQ2FuJ3QgZG8gc2ltcGxlIGZvcm1hdCBpZiBzb3VyY2UgYW5kIGRlc3QgYXJlIGRpZmZlcmVudC4gICovCi0JICAgICAgY29udGludWU7Ci0JICBpZiAoWF9SUzIgKGluc24pICE9IFhfUkQgKGluc24pCi0JICAgICAgJiYgc3RyY2hyIChvcGNvZGUtPmFyZ3MsICdPJykgIT0gMCkKLQkgICAgICAvKiBDYW4ndCBkbyBzaW1wbGUgZm9ybWF0IGlmIHNvdXJjZSBhbmQgZGVzdCBhcmUgZGlmZmVyZW50LiAgKi8KLQkgICAgICBjb250aW51ZTsKLQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sIG9wY29kZS0+bmFtZSk7Ci0KLQkgIHsKLQkgICAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqczsKLQotCSAgICBpZiAob3Bjb2RlLT5hcmdzWzBdICE9ICcsJykKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiAiKTsKLQkgICAgZm9yIChzID0gb3Bjb2RlLT5hcmdzOyAqcyAhPSAnXDAnOyArK3MpCi0JICAgICAgewotCQl3aGlsZSAoKnMgPT0gJywnKQotCQkgIHsKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiLCIpOwotCQkgICAgKytzOwotCQkgICAgc3dpdGNoICgqcykgewotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiYSIpOwotCQkgICAgICBpc19hbm51bGxlZCA9IDE7Ci0JCSAgICAgICsrczsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICBjYXNlICdOJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJwbiIpOwotCQkgICAgICArK3M7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdUJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJwdCIpOwotCQkgICAgICArK3M7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0JCS8qIHN3aXRjaCBvbiBhcmcgKi8KLQkJICB9CQkvKiB3aGlsZSB0aGVyZSBhcmUgY29tbWEgc3RhcnRlZCBhcmdzICovCi0KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIgIik7Ci0JCQkKLQkJc3dpdGNoICgqcykKLQkJICB7Ci0JCSAgY2FzZSAnKyc6Ci0JCSAgICBmb3VuZF9wbHVzID0gMTsKLQotCQkgICAgLyogbm90ZSBmYWxsLXRocm91Z2ggKi8KLQkJICBkZWZhdWx0OgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlYyIsICpzKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnIyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIjAiKTsKLQkJICAgIGJyZWFrOwotCi0jZGVmaW5lCXJlZyhuKQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLCByZWdfbmFtZXNbbl0pCi0JCSAgY2FzZSAnMSc6Ci0JCSAgY2FzZSAncic6Ci0JCSAgICByZWcgKFhfUlMxIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJzInOgotCQkgIGNhc2UgJ08nOgotCQkgICAgcmVnIChYX1JTMiAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdkJzoKLQkJICAgIHJlZyAoWF9SRCAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0jdW5kZWYJcmVnCi0KLSNkZWZpbmUJZnJlZyhuKQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwgZnJlZ19uYW1lc1tuXSkKLSNkZWZpbmUJZnJlZ3gobikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwgZnJlZ19uYW1lc1soKG4pICYgfjEpIHwgKCgobikgJiAxKSA8PCA1KV0pCi0JCSAgY2FzZSAnZSc6Ci0JCSAgICBmcmVnIChYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAndic6CS8qIGRvdWJsZS9ldmVuICovCi0JCSAgY2FzZSAnVic6CS8qIHF1YWQvbXVsdGlwbGUgb2YgNCAqLwotCQkgICAgZnJlZ3ggKFhfUlMxIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2YnOgotCQkgICAgZnJlZyAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJ0InOgkvKiBkb3VibGUvZXZlbiAqLwotCQkgIGNhc2UgJ1InOgkvKiBxdWFkL211bHRpcGxlIG9mIDQgKi8KLQkJICAgIGZyZWd4IChYX1JTMiAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdnJzoKLQkJICAgIGZyZWcgKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJ0gnOgkvKiBkb3VibGUvZXZlbiAqLwotCQkgIGNhc2UgJ0onOgkvKiBxdWFkL211bHRpcGxlIG9mIDQgKi8KLQkJICAgIGZyZWd4IChYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLSN1bmRlZglmcmVnCi0jdW5kZWYJZnJlZ3gKLQotI2RlZmluZQljcmVnKG4pCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjJXUiLCAodW5zaWduZWQgaW50KSAobikpCi0JCSAgY2FzZSAnYic6Ci0JCSAgICBjcmVnIChYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdjJzoKLQkJICAgIGNyZWcgKFhfUlMyIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0QnOgotCQkgICAgY3JlZyAoWF9SRCAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0jdW5kZWYJY3JlZwotCi0JCSAgY2FzZSAnaCc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlaGkoJSN4KSIsCi0JCQkJCSAgICgweEZGRkZGRkZGCi0JCQkJCSAgICAmICgoaW50KSBYX0lNTTIyIChpbnNuKSA8PCAxMCkpKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnaSc6CS8qIDEzIGJpdCBpbW1lZGlhdGUgKi8KLQkJICBjYXNlICdJJzoJLyogMTEgYml0IGltbWVkaWF0ZSAqLwotCQkgIGNhc2UgJ2onOgkvKiAxMCBiaXQgaW1tZWRpYXRlICovCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbW07Ci0KLQkJICAgICAgaWYgKCpzID09ICdpJykKLQkJICAgICAgICBpbW0gPSBYX1NJTU0gKGluc24sIDEzKTsKLQkJICAgICAgZWxzZSBpZiAoKnMgPT0gJ0knKQotCQkJaW1tID0gWF9TSU1NIChpbnNuLCAxMSk7Ci0JCSAgICAgIGVsc2UKLQkJCWltbSA9IFhfU0lNTSAoaW5zbiwgMTApOwotCi0JCSAgICAgIC8qIENoZWNrIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgYSAxK2ksIGFuZCB0YWtlCi0JCQkgbm90ZSBvZiB0aGF0IGZhY3QuCi0KLQkJCSBOb3RlOiBiZWNhdXNlIG9mIHRoZSB3YXkgd2Ugc29ydCB0aGUgdGFibGUsCi0JCQkgd2Ugd2lsbCBiZSBtYXRjaGluZyAxK2kgcmF0aGVyIHRoYW4gaSsxLAotCQkJIHNvIGl0IGlzIE9LIHRvIGFzc3VtZSB0aGF0IGkgaXMgYWZ0ZXIgKywKLQkJCSBub3QgYmVmb3JlIGl0LiAgKi8KLQkJICAgICAgaWYgKGZvdW5kX3BsdXMpCi0JCQlpbW1fYWRkZWRfdG9fcnMxID0gMTsKLQkJICAgICAgCi0JCSAgICAgIGlmIChpbW0gPD0gOSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBpbW0pOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUjeCIsIGltbSk7Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ1gnOgkvKiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLQkJICBjYXNlICdZJzoJLyogNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbW0gPSBYX0lNTSAoaW5zbiwgKnMgPT0gJ1gnID8gNSA6IDYpOwotCi0JCSAgICAgIGlmIChpbW0gPD0gOSkKLQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlZCIsIGltbSk7Ci0JCSAgICAgIGVsc2UKLQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlI3giLCAodW5zaWduZWQpIGltbSk7Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0snOgotCQkgICAgewotCQkgICAgICBpbnQgbWFzayA9IFhfTUVNQkFSIChpbnNuKTsKLQkJICAgICAgaW50IGJpdCA9IDB4NDAsIHByaW50ZWRfb25lID0gMDsKLQkJICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgICAgICBpZiAobWFzayA9PSAwKQotCQkJKGluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIjAiKTsKLQkJICAgICAgZWxzZQotCQkJd2hpbGUgKGJpdCkKLQkJCSAgewotCQkJICAgIGlmIChtYXNrICYgYml0KQotCQkJICAgICAgewotCQkJCWlmIChwcmludGVkX29uZSkKLQkJCQkgIChpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJ8Iik7Ci0JCQkJbmFtZSA9IHNwYXJjX2RlY29kZV9tZW1iYXIgKGJpdCk7Ci0JCQkJKGluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCQkJcHJpbnRlZF9vbmUgPSAxOwotCQkJICAgICAgfQotCQkJICAgIGJpdCA+Pj0gMTsKLQkJCSAgfQotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgIGNhc2UgJ2snOgotCQkgICAgaW5mby0+dGFyZ2V0ID0gbWVtYWRkciArIFNFWCAoWF9ESVNQMTYgKGluc24pLCAxNikgKiA0OwotCQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdHJzoKLQkJICAgIGluZm8tPnRhcmdldCA9IG1lbWFkZHIgKyBTRVggKFhfRElTUDE5IChpbnNuKSwgMTkpICogNDsKLQkJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnNic6Ci0JCSAgY2FzZSAnNyc6Ci0JCSAgY2FzZSAnOCc6Ci0JCSAgY2FzZSAnOSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZmNjJWMiLCAqcyAtICc2JyArICcwJyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3onOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWljYyIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdaJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV4Y2MiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlY2NyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3MnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWZwcnMiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnbyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYXNpIik7Ci0JCSAgICBicmVhazsKLQkJICAgIAotCQkgIGNhc2UgJ1cnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXRpY2siKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnUCc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcGMiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnPyc6Ci0JCSAgICBpZiAoWF9SUzEgKGluc24pID09IDMxKQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUldmVyIik7Ci0JCSAgICBlbHNlIGlmICgodW5zaWduZWQpIFhfUlMxIChpbnNuKSA8IDE2KQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAotCQkJCQkgICAgIHY5X3ByaXZfcmVnX25hbWVzW1hfUlMxIChpbnNuKV0pOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnISc6Ci0JCSAgICBpZiAoKHVuc2lnbmVkKSBYX1JEIChpbnNuKSA8IDE1KQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAotCQkJCQkgICAgIHY5X3ByaXZfcmVnX25hbWVzW1hfUkQgKGluc24pXSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICcvJzoKLQkJICAgIGlmIChYX1JTMSAoaW5zbikgPCAxNiB8fCBYX1JTMSAoaW5zbikgPiAyMykKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXJlc2VydmVkIik7Ci0JCSAgICBlbHNlCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsCi0JCQkJCSAgICAgdjlhX2Fzcl9yZWdfbmFtZXNbWF9SUzEgKGluc24pLTE2XSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ18nOgotCQkgICAgaWYgKFhfUkQgKGluc24pIDwgMTYgfHwgWF9SRCAoaW5zbikgPiAyMykKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXJlc2VydmVkIik7Ci0JCSAgICBlbHNlCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsCi0JCQkJCSAgICAgdjlhX2Fzcl9yZWdfbmFtZXNbWF9SRCAoaW5zbiktMTZdKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnKic6Ci0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzcGFyY19kZWNvZGVfcHJlZmV0Y2ggKFhfUkQgKGluc24pKTsKLQotCQkgICAgICBpZiAobmFtZSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlZCIsIFhfUkQgKGluc24pKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICAKLQkJICBjYXNlICdNJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVhc3IlZCIsIFhfUlMxIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICAgIAotCQkgIGNhc2UgJ20nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWFzciVkIiwgWF9SRCAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgICAKLQkJICBjYXNlICdMJzoKLQkJICAgIGluZm8tPnRhcmdldCA9IG1lbWFkZHIgKyBTRVggKFhfRElTUDMwIChpbnNuKSwgMzApICogNDsKLQkJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnbic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJICAgICAgKHN0cmVhbSwgIiUjeCIsIFNFWCAoWF9ESVNQMjIgKGluc24pLCAyMikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdsJzoKLQkJICAgIGluZm8tPnRhcmdldCA9IG1lbWFkZHIgKyBTRVggKFhfRElTUDIyIChpbnNuKSwgMjIpICogNDsKLQkJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnQSc6Ci0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzcGFyY19kZWNvZGVfYXNpIChYX0FTSSAoaW5zbikpOwotCi0JCSAgICAgIGlmIChuYW1lKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiglZCkiLCBYX0FTSSAoaW5zbikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgIGNhc2UgJ0MnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWNzciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdGJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmc3IiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAncCc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcHNyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3EnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWZxIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ1EnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWNxIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3QnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXRiciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd3JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV3aW0iKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAneCc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwKLQkJCQkJICAgKChYX0xEU1RfSSAoaW5zbikgPDwgOCkKLQkJCQkJICAgICsgWF9BU0kgKGluc24pKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3knOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXkiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAndSc6Ci0JCSAgY2FzZSAnVSc6Ci0JCSAgICB7Ci0JCSAgICAgIGludCB2YWwgPSAqcyA9PSAnVScgPyBYX1JTMSAoaW5zbikgOiBYX1JEIChpbnNuKTsKLQkJICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyAodmFsKTsKLQotCQkgICAgICBpZiAobmFtZSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWNwcmVnKCVkKSIsIHZhbCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBhZGRpbmcgb3Igb3InaW5nIHNvbWV0aGluZyB0byByczEsIHRoZW4KLQkgICAgIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMKLQkgICAgIGEgc2V0aGkgdG8gdGhlIHNhbWUgcmVnaXN0ZXIgYXMgaW4gdGhlIHNldGhpLgotCSAgICAgSWYgc28sIGF0dGVtcHQgdG8gcHJpbnQgdGhlIHJlc3VsdCBvZiB0aGUgYWRkIG9yCi0JICAgICBvciAoaW4gdGhpcyBjb250ZXh0IGFkZCBhbmQgb3IgZG8gdGhlIHNhbWUgdGhpbmcpCi0JICAgICBhbmQgaXRzIHN5bWJvbGljIHZhbHVlLiAgKi8KLQkgIGlmIChpbW1fb3JlZF90b19yczEgfHwgaW1tX2FkZGVkX3RvX3JzMSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgcHJldl9pbnNuOwotCSAgICAgIGludCBlcnJjb2RlOwotCi0JICAgICAgZXJyY29kZSA9Ci0JCSgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkJICAobWVtYWRkciAtIDQsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLQkgICAgICBwcmV2X2luc24gPSBnZXR3b3JkIChidWZmZXIpOwotCi0JICAgICAgaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkgIC8qIElmIGl0IGlzIGEgZGVsYXllZCBicmFuY2gsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUKLQkJICAgICBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGRlbGF5ZWQgYnJhbmNoLiAgVGhpcyBoYW5kbGVzCi0JCSAgICAgc2VxdWVuY2VzIHN1Y2ggYXMKLQotCQkgICAgIHNldGhpICVvMSwgJWhpKF9mb28pLCAlbzEKLQkJICAgICBjYWxsIF9wcmludGYKLQkJICAgICBvciAlbzEsICVsbyhfZm9vKSwgJW8xCi0JCSAgICAgKi8KLQotCQkgIGlmIChpc19kZWxheWVkX2JyYW5jaCAocHJldl9pbnNuKSkKLQkJICAgIHsKLQkJICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkJCShtZW1hZGRyIC0gOCwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksIGluZm8pOwotCQkgICAgICBwcmV2X2luc24gPSBnZXR3b3JkIChidWZmZXIpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlYWRpbmcgbWVtb3J5LCB0aGVuIGFzc3VtZQotCQkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBub3Qgc2V0aGkuICAqLwotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJcyBpdCBzZXRoaSB0byB0aGUgc2FtZSByZWdpc3Rlcj8gICovCi0JCSAgaWYgKChwcmV2X2luc24gJiAweGMxYzAwMDAwKSA9PSAweDAxMDAwMDAwCi0JCSAgICAgICYmIFhfUkQgKHByZXZfaW5zbikgPT0gWF9SUzEgKGluc24pKQotCQkgICAgewotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIlx0ISAiKTsKLQkJICAgICAgaW5mby0+dGFyZ2V0ID0gCi0JCQkoMHhGRkZGRkZGRiAmIChpbnQpIFhfSU1NMjIgKHByZXZfaW5zbikgPDwgMTApOwotCQkgICAgICBpZiAoaW1tX2FkZGVkX3RvX3JzMSkKLQkJCWluZm8tPnRhcmdldCArPSBYX1NJTU0gKGluc24sIDEzKTsKLQkJICAgICAgZWxzZQotCQkJaW5mby0+dGFyZ2V0IHw9IFhfU0lNTSAoaW5zbiwgMTMpOwotCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCQkgICAgICBpbmZvLT5kYXRhX3NpemUgPSA0OyAgLyogRklYTUUhISEgKi8KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChvcGNvZGUtPmZsYWdzICYgKEZfVU5CUnxGX0NPTkRCUnxGX0pTUikpCi0JICAgIHsKLQkJLyogRklYTUUgLS0gY2hlY2sgaXNfYW5udWxsZWQgZmxhZyAqLwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9VTkJSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9DT05EQlIpCi0JCWluZm8tPmluc25fdHlwZSA9IGRpc19jb25kYnJhbmNoOwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9KU1IpCi0JCWluZm8tPmluc25fdHlwZSA9IGRpc19qc3I7Ci0JICAgICAgaWYgKG9wY29kZS0+ZmxhZ3MgJiBGX0RFTEFZRUQpCi0JCWluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7Ci0JICAgIH0KLQotCSAgcmV0dXJuIHNpemVvZiAoYnVmZmVyKTsKLQl9Ci0gICAgfQotCi0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwkvKiBNYXJrIGFzIG5vbi12YWxpZCBpbnN0cnVjdGlvbiAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgXygidW5rbm93biIpKTsKLSAgcmV0dXJuIHNpemVvZiAoYnVmZmVyKTsKLX0KLQotLyogR2l2ZW4gQkZEIG1hY2ggbnVtYmVyLCByZXR1cm4gYSBtYXNrIG9mIFNQQVJDX09QQ09ERV9BUkNIX0ZPTyB2YWx1ZXMuICAqLwotCi1zdGF0aWMgaW50Ci1jb21wdXRlX2FyY2hfbWFzayAobWFjaCkKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotewotICBzd2l0Y2ggKG1hY2gpCi0gICAgewotICAgIGNhc2UgMCA6Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyYyA6Ci0gICAgICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSA6Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUgOgotICAgICAgLyogc3BhcmNsaXRlcyBpbnNucyBhcmUgcmVjb2duaXplZCBieSBkZWZhdWx0IChiZWNhdXNlIHRoYXQncyBob3cKLQkgdGhleSd2ZSBhbHdheXMgYmVlbiB0cmVhdGVkLCBmb3IgYmV0dGVyIG9yIHdvcnNlKS4gIEtsdWRnZSB0aGlzIGJ5Ci0JIGluZGljYXRpbmcgZ2VuZXJpYyB2OCBpcyBhbHNvIHNlbGVjdGVkLiAgKi8KLSAgICAgIHJldHVybiAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMSVRFKQotCSAgICAgIHwgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpKTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyA6Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OSA6Ci0gICAgICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjkpOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSA6Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OWEgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5QSk7Ci0gICAgfQotICBhYm9ydCAoKTsKLX0KLQotLyogQ29tcGFyZSBvcGNvZGVzIEEgYW5kIEIuICAqLwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX29wY29kZXMgKGEsIGIpCi0gICAgIGNvbnN0IFBUUiBhOwotICAgICBjb25zdCBQVFIgYjsKLXsKLSAgc3RydWN0IHNwYXJjX29wY29kZSAqb3AwID0gKiAoc3RydWN0IHNwYXJjX29wY29kZSAqKikgYTsKLSAgc3RydWN0IHNwYXJjX29wY29kZSAqb3AxID0gKiAoc3RydWN0IHNwYXJjX29wY29kZSAqKikgYjsKLSAgdW5zaWduZWQgbG9uZyBpbnQgbWF0Y2gwID0gb3AwLT5tYXRjaCwgbWF0Y2gxID0gb3AxLT5tYXRjaDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgbG9zZTAgPSBvcDAtPmxvc2UsIGxvc2UxID0gb3AxLT5sb3NlOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBJZiBvbmUgKGFuZCBvbmx5IG9uZSkgaW5zbiBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLAotICAgICBwcmVmZXIgdGhlIG9uZSB0aGF0IGlzLiAgSWYgbmVpdGhlciBhcmUgc3VwcG9ydGVkLCBidXQgdGhleSdyZSBib3RoIGZvcgotICAgICB0aGUgc2FtZSBhcmNoaXRlY3R1cmUsIGNvbnRpbnVlIHByb2Nlc3NpbmcuICBPdGhlcndpc2UgKGJvdGggdW5zdXBwb3J0ZWQKLSAgICAgYW5kIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcyksIHByZWZlciBsb3dlciBudW1iZXJlZCBhcmNoJ3MgKGZ1ZGdlZAotICAgICBieSBjb21wYXJpbmcgdGhlIGJpdG1hc2tzKS4gICovCi0gIGlmIChvcDAtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKQotICAgIHsKLSAgICAgIGlmICghIChvcDEtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKSkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9wMS0+YXJjaGl0ZWN0dXJlICYgY3VycmVudF9hcmNoX21hc2spCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmIChvcDAtPmFyY2hpdGVjdHVyZSAhPSBvcDEtPmFyY2hpdGVjdHVyZSkKLQlyZXR1cm4gb3AwLT5hcmNoaXRlY3R1cmUgLSBvcDEtPmFyY2hpdGVjdHVyZTsKLSAgICB9Ci0KLSAgLyogSWYgYSBiaXQgaXMgc2V0IGluIGJvdGggbWF0Y2ggYW5kIGxvc2UsIHRoZXJlIGlzIHNvbWV0aGluZwotICAgICB3cm9uZyB3aXRoIHRoZSBvcGNvZGUgdGFibGUuICAqLwotICBpZiAobWF0Y2gwICYgbG9zZTApCi0gICAgewotICAgICAgZnByaW50ZgotCShzdGRlcnIsCi0JIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JIF8oIkludGVybmFsIGVycm9yOiAgYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iKSwKLQkgb3AwLT5uYW1lLCBtYXRjaDAsIGxvc2UwKTsKLSAgICAgIG9wMC0+bG9zZSAmPSB+b3AwLT5tYXRjaDsKLSAgICAgIGxvc2UwID0gb3AwLT5sb3NlOwotICAgIH0KLQotICBpZiAobWF0Y2gxICYgbG9zZTEpCi0gICAgewotICAgICAgZnByaW50ZgotCShzdGRlcnIsCi0JIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JIF8oIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIpLAotCSBvcDEtPm5hbWUsIG1hdGNoMSwgbG9zZTEpOwotICAgICAgb3AxLT5sb3NlICY9IH5vcDEtPm1hdGNoOwotICAgICAgbG9zZTEgPSBvcDEtPmxvc2U7Ci0gICAgfQotCi0gIC8qIEJlY2F1c2UgdGhlIGJpdHMgdGhhdCBhcmUgdmFyaWFibGUgaW4gb25lIG9wY29kZSBhcmUgY29uc3RhbnQgaW4KLSAgICAgYW5vdGhlciwgaXQgaXMgaW1wb3J0YW50IHRvIG9yZGVyIHRoZSBvcGNvZGVzIGluIHRoZSByaWdodCBvcmRlci4gICovCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHggPSAxIDw8IGk7Ci0gICAgICBpbnQgeDAgPSAobWF0Y2gwICYgeCkgIT0gMDsKLSAgICAgIGludCB4MSA9IChtYXRjaDEgJiB4KSAhPSAwOwotCi0gICAgICBpZiAoeDAgIT0geDEpCi0JcmV0dXJuIHgxIC0geDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHggPSAxIDw8IGk7Ci0gICAgICBpbnQgeDAgPSAobG9zZTAgJiB4KSAhPSAwOwotICAgICAgaW50IHgxID0gKGxvc2UxICYgeCkgIT0gMDsKLQotICAgICAgaWYgKHgwICE9IHgxKQotCXJldHVybiB4MSAtIHgwOwotICAgIH0KLQotICAvKiBUaGV5IGFyZSBmdW5jdGlvbmFsbHkgZXF1YWwuICBTbyBhcyBsb25nIGFzIHRoZSBvcGNvZGUgdGFibGUgaXMKLSAgICAgdmFsaWQsIHdlIGNhbiBwdXQgd2hpY2hldmVyIG9uZSBmaXJzdCB3ZSB3YW50LCBvbiBhZXN0aGV0aWMgZ3JvdW5kcy4gICovCi0KLSAgLyogT3VyIGZpcnN0IGFlc3RoZXRpYyBncm91bmQgaXMgdGhhdCBhbGlhc2VzIGRlZmVyIHRvIHJlYWwgaW5zbnMuICAqLwotICB7Ci0gICAgaW50IGFsaWFzX2RpZmYgPSAob3AwLT5mbGFncyAmIEZfQUxJQVMpIC0gKG9wMS0+ZmxhZ3MgJiBGX0FMSUFTKTsKLSAgICBpZiAoYWxpYXNfZGlmZiAhPSAwKQotICAgICAgLyogUHV0IHRoZSBvbmUgdGhhdCBpc24ndCBhbiBhbGlhcyBmaXJzdC4gICovCi0gICAgICByZXR1cm4gYWxpYXNfZGlmZjsKLSAgfQotCi0gIC8qIEV4Y2VwdCBmb3IgYWxpYXNlcywgdHdvICJpZGVudGljYWwiIGluc3RydWN0aW9ucyBoYWQKLSAgICAgYmV0dGVyIGhhdmUgdGhlIHNhbWUgb3Bjb2RlLiAgVGhpcyBpcyBhIHNhbml0eSBjaGVjayBvbiB0aGUgdGFibGUuICAqLwotICBpID0gc3RyY21wIChvcDAtPm5hbWUsIG9wMS0+bmFtZSk7Ci0gIGlmIChpKQotICAgIHsKLSAgICAgIGlmIChvcDAtPmZsYWdzICYgRl9BTElBUykgLyogSWYgdGhleSdyZSBib3RoIGFsaWFzZXMsIGJlIGFyYml0cmFyeS4gKi8KLQlyZXR1cm4gaTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsCi0JCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgXygiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiID09IFwiJXNcIlxuIiksCi0JCSBvcDAtPm5hbWUsIG9wMS0+bmFtZSk7Ci0gICAgfQotCi0gIC8qIEZld2VyIGFyZ3VtZW50cyBhcmUgcHJlZmVycmVkLiAgKi8KLSAgewotICAgIGludCBsZW5ndGhfZGlmZiA9IHN0cmxlbiAob3AwLT5hcmdzKSAtIHN0cmxlbiAob3AxLT5hcmdzKTsKLSAgICBpZiAobGVuZ3RoX2RpZmYgIT0gMCkKLSAgICAgIC8qIFB1dCB0aGUgb25lIHdpdGggZmV3ZXIgYXJndW1lbnRzIGZpcnN0LiAgKi8KLSAgICAgIHJldHVybiBsZW5ndGhfZGlmZjsKLSAgfQotCi0gIC8qIFB1dCAxK2kgYmVmb3JlIGkrMS4gICovCi0gIHsKLSAgICBjaGFyICpwMCA9IChjaGFyICopIHN0cmNociAob3AwLT5hcmdzLCAnKycpOwotICAgIGNoYXIgKnAxID0gKGNoYXIgKikgc3RyY2hyIChvcDEtPmFyZ3MsICcrJyk7Ci0KLSAgICBpZiAocDAgJiYgcDEpCi0gICAgICB7Ci0JLyogVGhlcmUgaXMgYSBwbHVzIGluIGJvdGggb3BlcmFuZHMuICBOb3RlIHRoYXQgYSBwbHVzCi0JICAgc2lnbiBjYW5ub3QgYmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBhcmdzLAotCSAgIHNvIHRoZSBmb2xsb3dpbmcgWy0xXSdzIGFyZSB2YWxpZC4gICovCi0JaWYgKHAwWy0xXSA9PSAnaScgJiYgcDFbMV0gPT0gJ2knKQotCSAgLyogb3AwIGlzIGkrMSBhbmQgb3AxIGlzIDEraSwgc28gb3AxIGdvZXMgZmlyc3QuICAqLwotCSAgcmV0dXJuIDE7Ci0JaWYgKHAwWzFdID09ICdpJyAmJiBwMVstMV0gPT0gJ2knKQotCSAgLyogb3AwIGlzIDEraSBhbmQgb3AxIGlzIGkrMSwgc28gb3AwIGdvZXMgZmlyc3QuICAqLwotCSAgcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgLyogUHV0IDEsaSBiZWZvcmUgaSwxLiAgKi8KLSAgewotICAgIGludCBpMCA9IHN0cm5jbXAgKG9wMC0+YXJncywgImksMSIsIDMpID09IDA7Ci0gICAgaW50IGkxID0gc3RybmNtcCAob3AxLT5hcmdzLCAiaSwxIiwgMykgPT0gMDsKLQotICAgIGlmIChpMCBeIGkxKQotICAgICAgcmV0dXJuIGkwIC0gaTE7Ci0gIH0KLQotICAvKiBUaGV5IGFyZSwgYXMgZmFyIGFzIHdlIGNhbiB0ZWxsLCBpZGVudGljYWwuCi0gICAgIFNpbmNlIHFzb3J0IG1heSBoYXZlIHJlYXJyYW5nZWQgdGhlIHRhYmxlIHBhcnRpYWxseSwgdGhlcmUgaXMKLSAgICAgbm8gd2F5IHRvIHRlbGwgd2hpY2ggb25lIHdhcyBmaXJzdCBpbiB0aGUgb3Bjb2RlIHRhYmxlIGFzCi0gICAgIHdyaXR0ZW4sIHNvIGp1c3Qgc2F5IHRoZXJlIGFyZSBlcXVhbC4gICovCi0gIC8qID8/PyBUaGlzIGlzIG5vIGxvbmdlciB0cnVlIG5vdyB0aGF0IHdlIHNvcnQgYSB2ZWN0b3Igb2YgcG9pbnRlcnMsCi0gICAgIG5vdCB0aGUgdGFibGUgaXRzZWxmLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEJ1aWxkIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBvcGNvZGUgdGFibGUuCi0gICBPUENPREVfVEFCTEUgaXMgYSBzb3J0ZWQgbGlzdCBvZiBwb2ludGVycyBpbnRvIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaGFzaF90YWJsZSAob3Bjb2RlX3RhYmxlLCBoYXNoX3RhYmxlLCBudW1fb3Bjb2RlcykKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKm9wY29kZV90YWJsZTsKLSAgICAgc3RydWN0IG9wY29kZV9oYXNoICoqaGFzaF90YWJsZTsKLSAgICAgaW50IG51bV9vcGNvZGVzOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IGhhc2hfY291bnRbSEFTSF9TSVpFXTsKLSAgc3RhdGljIHN0cnVjdCBvcGNvZGVfaGFzaCAqaGFzaF9idWYgPSBOVUxMOwotCi0gIC8qIFN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIGFuZCB3b3JrIGJhY2t3YXJkcyBzbyB0aGF0IGVhY2gKLSAgICAgY2hhaW4gaXMgc29ydGVkLiAgKi8KLQotICBtZW1zZXQgKGhhc2hfdGFibGUsIDAsIEhBU0hfU0laRSAqIHNpemVvZiAoaGFzaF90YWJsZVswXSkpOwotICBtZW1zZXQgKGhhc2hfY291bnQsIDAsIEhBU0hfU0laRSAqIHNpemVvZiAoaGFzaF9jb3VudFswXSkpOwotICBpZiAoaGFzaF9idWYgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX2J1Zik7Ci0gIGhhc2hfYnVmID0gKHN0cnVjdCBvcGNvZGVfaGFzaCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcGNvZGVfaGFzaCkgKiBudW1fb3Bjb2Rlcyk7Ci0gIGZvciAoaSA9IG51bV9vcGNvZGVzIC0gMTsgaSA+PSAwOyAtLWkpCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGhhc2ggPSBIQVNIX0lOU04gKG9wY29kZV90YWJsZVtpXS0+bWF0Y2gpOwotICAgICAgcmVnaXN0ZXIgc3RydWN0IG9wY29kZV9oYXNoICpoID0gJmhhc2hfYnVmW2ldOwotICAgICAgaC0+bmV4dCA9IGhhc2hfdGFibGVbaGFzaF07Ci0gICAgICBoLT5vcGNvZGUgPSBvcGNvZGVfdGFibGVbaV07Ci0gICAgICBoYXNoX3RhYmxlW2hhc2hdID0gaDsKLSAgICAgICsraGFzaF9jb3VudFtoYXNoXTsKLSAgICB9Ci0KLSNpZiAwIC8qIGZvciBkZWJ1Z2dpbmcgKi8KLSAgewotICAgIGludCBtaW5fY291bnQgPSBudW1fb3Bjb2RlcywgbWF4X2NvdW50ID0gMDsKLSAgICBpbnQgdG90YWw7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyArK2kpCi0gICAgICB7Ci0gICAgICAgIGlmIChoYXNoX2NvdW50W2ldIDwgbWluX2NvdW50KQotCSAgbWluX2NvdW50ID0gaGFzaF9jb3VudFtpXTsKLQlpZiAoaGFzaF9jb3VudFtpXSA+IG1heF9jb3VudCkKLQkgIG1heF9jb3VudCA9IGhhc2hfY291bnRbaV07Ci0JdG90YWwgKz0gaGFzaF9jb3VudFtpXTsKLSAgICAgIH0KLQotICAgIHByaW50ZiAoIk9wY29kZSBoYXNoIHRhYmxlIHN0YXRzOiBtaW4gJWQsIG1heCAlZCwgYXZlICVmXG4iLAotCSAgICBtaW5fY291bnQsIG1heF9jb3VudCwgKGRvdWJsZSkgdG90YWwgLyBIQVNIX1NJWkUpOwotICB9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvc3BhcmMtb3BjLmMgYi9vcGNvZGVzL3NwYXJjLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQ5ZDE4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvc3BhcmMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMwICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBzcGFyYy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1CRkQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCi12ZXJzaW9uLgotCi1CRkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCi1XQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCSovCi0KLS8qIEZJWE1FLXNvbWVkYXk6IHBlcmhhcHMgdGhlICxhJ3MgYW5kIHN1Y2ggc2hvdWxkIGJlIGVtYmVkZGVkIGluIHRoZQotICAgaW5zdHJ1Y3Rpb24ncyBuYW1lIHJhdGhlciB0aGFuIHRoZSBhcmdzLiAgVGhpcyB3b3VsZCBtYWtlIGdhcyBmYXN0ZXIsIHBpbnNuCi0gICBzbG93ZXIsIGJ1dCB3b3VsZCBtZXNzIHVwIHNvbWUgbWFjcm9zIGEgYml0LiAgeG94b3JpY2guICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3NwYXJjLmgiCi0KLS8qIFNvbWUgZGVmaW5lcyB0byBtYWtlIGxpZmUgZWFzeS4gICovCi0jZGVmaW5lIE1BU0tfVjYJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y2KQotI2RlZmluZSBNQVNLX1Y3CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WNykKLSNkZWZpbmUgTUFTS19WOAkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpCi0jZGVmaW5lIE1BU0tfU1BBUkNMRVQJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQpCi0jZGVmaW5lIE1BU0tfU1BBUkNMSVRFCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSkKLSNkZWZpbmUgTUFTS19WOQkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjkpCi0jZGVmaW5lIE1BU0tfVjlBCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKLQotLyogQml0IG1hc2tzIG9mIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGluZyB0aGUgaW5zbi4gICovCi0KLSNkZWZpbmUgdjYJCShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIFwKLQkJCSB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotLyogdjYgaW5zbnMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BhcmNsZXQgKi8KLSNkZWZpbmUgdjZub3RsZXQJKE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCBcCi0JCQkgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLSNkZWZpbmUgdjcJCShNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgXAotCQkJIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0vKiBBbHRob3VnaCBub3QgYWxsIGluc25zIGFyZSBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZSwgc3BhcmNsaXRlIGlzIGRlZmluZWQKLSAgIHRvIGJlIGEgc3VwZXJzZXQgb2YgdjguICBVbmltcGxlbWVudGVkIGluc25zIHRyYXAgYW5kIGFyZSB0aGVuIHRoZW9yZXRpY2FsbHkKLSAgIGltcGxlbWVudGVkIGluIHNvZnR3YXJlLgotICAgSXQncyBub3QgY2xlYXIgdGhhdCB0aGUgc2FtZSBpcyB0cnVlIGZvciBzcGFyY2xldCwgYWx0aG91Z2ggdGhlIGRvY3MKLSAgIHN1Z2dlc3QgaXQgaXMuICBSYXRoZXIgdGhhbiBjb21wbGljYXRpbmcgdGhpbmdzLCB0aGUgc3BhcmNsZXQgYXNzZW1ibGVyCi0gICByZWNvZ25pemVzIGFsbCB2OCBpbnNucy4gICovCi0jZGVmaW5lIHY4CQkoTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLSNkZWZpbmUgc3BhcmNsZXQJKE1BU0tfU1BBUkNMRVQpCi0jZGVmaW5lIHNwYXJjbGl0ZQkoTUFTS19TUEFSQ0xJVEUpCi0jZGVmaW5lIHY5CQkoTUFTS19WOSB8IE1BU0tfVjlBKQotI2RlZmluZSB2OWEJCShNQVNLX1Y5QSkKLS8qIHY2IGluc25zIG5vdCBzdXBwb3J0ZWQgYnkgdjkgKi8KLSNkZWZpbmUgdjZub3R2OQkJKE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCBcCi0JCQkgfCBNQVNLX1NQQVJDTEVUIHwgTUFTS19TUEFSQ0xJVEUpCi0vKiB2OWEgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdvdWxkIGFwcGVhciB0byBiZSBhbGlhc2VzIHRvIHY5J3MgaW1wZGVwJ3MKLSAgIG90aGVyd2lzZSAqLwotI2RlZmluZSB2OW5vdHY5YQkoTUFTS19WOSkKLQotLyogVGFibGUgb2Ygb3Bjb2RlIGFyY2hpdGVjdHVyZXMuCi0gICBUaGUgb3JkZXIgaXMgZGVmaW5lZCBpbiBvcGNvZGUvc3BhcmMuaC4gICovCi0KLWNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGVfYXJjaCBzcGFyY19vcGNvZGVfYXJjaHNbXSA9IHsKLSAgeyAidjYiLCBNQVNLX1Y2IH0sCi0gIHsgInY3IiwgTUFTS19WNiB8IE1BU0tfVjcgfSwKLSAgeyAidjgiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfSwKLSAgeyAic3BhcmNsZXQiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIH0sCi0gIHsgInNwYXJjbGl0ZSIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMSVRFIH0sCi0gIC8qID8/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+MHgxYiwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjkgfSwKLXsgImxkeGEiLAlGMygzLCAweDFiLCAwKSwgRjMofjMsIH4weDFiLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgInN0IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCQkiZCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCQkiZCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCQkiZCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCQkiZCxbaV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3QiLAlGMygzLCAweDI0LCAwKSwgRjMofjMsIH4weDI0LCB+MCl8QVNJKH4wKSwJCSJnLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNCwgMCksIEYzKH4zLCB+MHgyNCwgfjApfEFTSV9SUzIofjApLAkJImcsWzFdIiwgMCwgdjYgfSwgLyogc3QgZFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSksCQkJImcsWzEraV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSksCQkJImcsW2krMV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSl8UlMxX0cwLAkJImcsW2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpfFNJTU0xMyh+MCksCQkiZyxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3QiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCl8QVNJKH4wKSwJCSJELFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCl8QVNJX1JTMih+MCksCQkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCQkiRCxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJCSJELFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8UlMxX0cwLAkJIkQsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8U0lNTTEzKH4wKSwJCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdCIsCUYzKDMsIDB4MzUsIDApLCBGMyh+MywgfjB4MzUsIH4wKXxBU0kofjApLAkJIkMsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDApLCBGMyh+MywgfjB4MzUsIH4wKXxBU0lfUlMyKH4wKSwJCSJDLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpLAkJCSJDLFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSksCQkJIkMsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKXxSUzFfRzAsCQkiQyxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKXxTSU1NMTMofjApLAkJIkMsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3QiLAlGMygzLCAweDI1LCAwKSwgRjMofjMsIH4weDI1LCB+MCl8UkRfRzB8QVNJKH4wKSwJIkYsWzErMl0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAwKSwgRjMofjMsIH4weDI1LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJGLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMCwJCSJGLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwLAkJIkYsW2krMV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzB8UlMxX0cwLAkJIkYsW2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJGLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdHciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0c3ciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0c3ciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3BpbGwiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGEiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGEiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCksCQkiZyxbMSsyXUEiLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApfFJTMih+MCksCSJnLFsxXUEiLCAwLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCSJnLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkiZyxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFJTMV9HMCwJImcsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8U0lNTTEzKH4wKSwJImcsWzFdbyIsIDAsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2OSB9LAoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0YiBkLFtyczErJWcwXSAqLwoteyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsWzEraV0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsW2krMV0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0c2IiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiIGQsW3JzMSslZzBdICovCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2IiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiBkLFtyczErJWcwXSAqLwoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0YmEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGJhIGQsW3JzMSslZzBdICovCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzYmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGJhIGQsW3JzMSslZzBdICovCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLQoteyAic3RkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+MywgfjB4MDcsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSksCQkiZCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSksCQkiZCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RkIiwJRjMoMywgMHgyNiwgMCksIEYzKH4zLCB+MHgyNiwgfjApfEFTSSh+MCksCSJxLFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgyNiwgMCksIEYzKH4zLCB+MHgyNiwgfjApfEFTSV9SUzIofjApLAkicSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpLAkJInEsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkicSxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxSUzFfRzAsCSJxLFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxTSU1NMTMofjApLAkicSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDApLCBGMyh+MywgfjB4MjcsIH4wKXxBU0kofjApLAkiSCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDI3LCAwKSwgRjMofjMsIH4weDI3LCB+MCl8QVNJX1JTMih+MCksCSJILFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpLAkJIkgsWzEraV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpLAkJIkgsW2krMV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpfFJTMV9HMCwJIkgsW2ldIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDEpLCBGMyh+MywgfjB4MjcsIH4xKXxTSU1NMTMofjApLAkiSCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0kofjApLAkiUSxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0lfUlMyKH4wKSwJIlEsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKSwJCSJRLFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIlEsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSl8UlMxX0cwLAkiUSxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSl8U0lNTTEzKH4wKSwJIlEsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi17ICJzdGQiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCl8QVNJKH4wKSwJIkQsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCl8QVNJX1JTMih+MCksCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiRCxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJELFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpfFJTMV9HMCwJIkQsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpfFNJTU0xMyh+MCksCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMCksIEYzKH4zLCB+MHgxNywgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAwKSwgRjMofjMsIH4weDE3LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0ZGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApLAkJIkgsWzErMl1BIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCl8UlMyKH4wKSwJIkgsWzFdQSIsIDAsIHY5IH0sIC8qIHN0ZGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiSCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJILFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpfFJTMV9HMCwJIkgsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpfFNJTU0xMyh+MCksCSJILFsxXW8iLCAwLCB2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInN0aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0aCBkLFtyczErJWcwXSAqLwoteyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsWzEraV0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsW2krMV0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGggZCxbcnMxKzBdICovCi0KLXsgInN0c2giLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoIGQsW3JzMSslZzBdICovCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2giLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggZCxbcnMxKzBdICovCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCBkLFtyczErJWcwXSAqLwoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0aGEgLFtyczErJWcwXSAqLwoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3RzaGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aGEgLFtyczErJWcwXSAqLwoteyAic3RzaGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzaGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzaGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGggZCxbcnMxKzBdICovCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjYgfSwgLyogc3RoYSAsW3JzMSslZzBdICovCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3R4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+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+MiwgfjB4MzgsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKzAsJWcwICovCi0KLXsgIm5vcCIsCUYyKDAsIDQpLCAweGZlZmZmZmZmLCAiIiwgMCwgdjYgfSwgLyogc2V0aGkgMCwgJWcwICovCi0KLXsgInNldCIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCxkIiwgRl9BTElBUywgdjYgfSwKLXsgInNldHV3IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlMwLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAic2V0c3ciLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiUzAsZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJzZXR4IiwJRjIoMHgwLCAweDQpLCBGMih+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+MHgzNCwgfjB4MDRmKSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZkaXZ4IiwJRjNGKDIsIDB4MzQsIDB4MDRmKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRmKSwgIlYsUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZmRpdnMiLAlGM0YoMiwgMHgzNCwgMHgwNGQpLCBGM0YofjIsIH4weDM0LCB+MHgwNGQpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZm11bGQiLAlGM0YoMiwgMHgzNCwgMHgwNGEpLCBGM0YofjIsIH4weDM0LCB+MHgwNGEpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZm11bHEiLAlGM0YoMiwgMHgzNCwgMHgwNGIpLCBGM0YofjIsIH4weDM0LCB+MHgwNGIpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZm11bHgiLAlGM0YoMiwgMHgzNCwgMHgwNGIpLCBGM0YofjIsIH4weDM0LCB+MHgwNGIpLCAiVixSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmbXVscyIsCUYzRigyLCAweDM0LCAweDA0OSksIEYzRih+MiwgfjB4MzQsIH4weDA0OSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi0KLXsgImZkbXVscSIsCUYzRigyLCAweDM0LCAweDA2ZSksIEYzRih+MiwgfjB4MzQsIH4weDA2ZSksICJ2LEIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmZG11bHgiLAlGM0YoMiwgMHgzNCwgMHgwNmUpLCBGM0YofjIsIH4weDM0LCB+MHgwNmUpLCAidixCLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmc211bGQiLAlGM0YoMiwgMHgzNCwgMHgwNjkpLCBGM0YofjIsIH4weDM0LCB+MHgwNjkpLCAiZSxmLEgiLCBGX0ZMT0FULCB2OCB9LAotCi17ICJmc3FydGQiLAlGM0YoMiwgMHgzNCwgMHgwMmEpLCBGM0YofjIsIH4weDM0LCB+MHgwMmEpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY3IH0sCi17ICJmc3FydHEiLAlGM0YoMiwgMHgzNCwgMHgwMmIpLCBGM0YofjIsIH4weDM0LCB+MHgwMmIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmc3FydHgiLAlGM0YoMiwgMHgzNCwgMHgwMmIpLCBGM0YofjIsIH4weDM0LCB+MHgwMmIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZzcXJ0cyIsCUYzRigyLCAweDM0LCAweDAyOSksIEYzRih+MiwgfjB4MzQsIH4weDAyOSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjcgfSwKLQoteyAiZmFic2QiLAlGM0YoMiwgMHgzNCwgMHgwMGEpLCBGM0YofjIsIH4weDM0LCB+MHgwMGEpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmYWJzcSIsCUYzRigyLCAweDM0LCAweDAwYiksIEYzRih+MiwgfjB4MzQsIH4weDAwYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZhYnN4IiwJRjNGKDIsIDB4MzQsIDB4MDBiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDBiKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmYWJzcyIsCUYzRigyLCAweDM0LCAweDAwOSksIEYzRih+MiwgfjB4MzQsIH4weDAwOSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZtb3ZkIiwJRjNGKDIsIDB4MzQsIDB4MDAyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAyKXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoteyAiZm1vdnEiLAlGM0YoMiwgMHgzNCwgMHgwMDMpLCBGM0YofjIsIH4weDM0LCB+MHgwMDMpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbW92eCIsCUYzRigyLCAweDM0LCAweDAwMyksIEYzRih+MiwgfjB4MzQsIH4weDAwMyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZm1vdnMiLAlGM0YoMiwgMHgzNCwgMHgwMDEpLCBGM0YofjIsIH4weDM0LCB+MHgwMDEpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmbmVnZCIsCUYzRigyLCAweDM0LCAweDAwNiksIEYzRih+MiwgfjB4MzQsIH4weDAwNil8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZuZWdxIiwJRjNGKDIsIDB4MzQsIDB4MDA3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA3KXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FULCB2OSB9LAoteyAiZm5lZ3giLAlGM0YoMiwgMHgzNCwgMHgwMDcpLCBGM0YofjIsIH4weDM0LCB+MHgwMDcpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZuZWdzIiwJRjNGKDIsIDB4MzQsIDB4MDA1KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA1KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAotCi17ICJmYWRkZCIsCUYzRigyLCAweDM0LCAweDA0MiksIEYzRih+MiwgfjB4MzQsIH4weDA0MiksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmYWRkcSIsCUYzRigyLCAweDM0LCAweDA0MyksIEYzRih+MiwgfjB4MzQsIH4weDA0MyksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmYWRkeCIsCUYzRigyLCAweDM0LCAweDA0MyksIEYzRih+MiwgfjB4MzQsIH4weDA0MyksICJWLFIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZhZGRzIiwJRjNGKDIsIDB4MzQsIDB4MDQxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQxKSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZzdWJkIiwJRjNGKDIsIDB4MzQsIDB4MDQ2KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ2KSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZzdWJxIiwJRjNGKDIsIDB4MzQsIDB4MDQ3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ3KSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZzdWJ4IiwJRjNGKDIsIDB4MzQsIDB4MDQ3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ3KSwgIlYsUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZnN1YnMiLAlGM0YoMiwgMHgzNCwgMHgwNDUpLCBGM0YofjIsIH4weDM0LCB+MHgwNDUpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAotCi0jZGVmaW5lIENNUEZDQyh4KQkoKCh4KSYweDMpPDwyNSkKLQoteyAiZmNtcGQiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUyKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTIpfFJEX0cwLCAgInYsQiIsICAgRl9GTE9BVCwgdjYgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI2LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiNyx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjgsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI5LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU2KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTYpfFJEX0cwLCAgInYsQiIsICAgRl9GTE9BVCwgdjYgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiNix2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI3LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjgsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiOSx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUzKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTMpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmY21wcSIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNixWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjcsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI4LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOSxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU3KXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI2LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjcsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOCxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI5LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21weCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTMpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Myl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZmNtcHgiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjYsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcHgiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjcsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcHgiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjgsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcHgiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjksVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcGV4IiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU3KXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmY21wZXgiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjYsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcGV4IiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI3LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBleCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOCxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wZXgiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjksVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcHMiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUxKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTEpfFJEX0cwLCAiZSxmIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcHMiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjYsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBzIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI3LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcyIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiOCxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHMiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjksZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcyIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTUpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1NSl8UkRfRzAsICJlLGYiLCAgIEZfRkxPQVQsIHY2IH0sCi17ICJmY21wZXMiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjYsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcyIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiNyxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVzIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI4LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXMiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjksZSxmIiwgRl9GTE9BVCwgdjkgfSwKLQotLyogVGhlc2UgRXh0ZW5kZWQgRlBvcCAoRklGTykgaW5zdHJ1Y3Rpb25zIGFyZSBuZXcgaW4gdGhlIEZ1aml0c3UKLSAgIE1CODY5MzQsIHJlcGxhY2luZyB0aGUgQ1BvcCBpbnN0cnVjdGlvbnMgZnJvbSB2NiBhbmQgbGF0ZXIKLSAgIHByb2Nlc3NvcnMuICAqLwotCi0jZGVmaW5lIEVGUE9QMV8yKG5hbWUsIG9wLCBhcmdzKSB7IG5hbWUsIEYzRigyLCAweDM2LCBvcCksIEYzRih+MiwgfjB4MzYsIH5vcCl8UlMxX0cwLCBhcmdzLCAwLCBzcGFyY2xpdGUgfQotI2RlZmluZSBFRlBPUDFfMyhuYW1lLCBvcCwgYXJncykgeyBuYW1lLCBGM0YoMiwgMHgzNiwgb3ApLCBGM0YofjIsIH4weDM2LCB+b3ApLCAgICAgICAgYXJncywgMCwgc3BhcmNsaXRlIH0KLSNkZWZpbmUgRUZQT1AyXzIobmFtZSwgb3AsIGFyZ3MpIHsgbmFtZSwgRjNGKDIsIDB4MzcsIG9wKSwgRjNGKH4yLCB+MHgzNywgfm9wKXxSRF9HMCwgIGFyZ3MsIDAsIHNwYXJjbGl0ZSB9Ci0KLUVGUE9QMV8yICgiZWZpdG9kIiwJMHgwYzgsICJmLEgiKSwKLUVGUE9QMV8yICgiZWZpdG9zIiwJMHgwYzQsICJmLGciKSwKLUVGUE9QMV8yICgiZWZkdG9pIiwJMHgwZDIsICJCLGciKSwKLUVGUE9QMV8yICgiZWZzdG9pIiwJMHgwZDEsICJmLGciKSwKLUVGUE9QMV8yICgiZWZzdG9kIiwJMHgwYzksICJmLEgiKSwKLUVGUE9QMV8yICgiZWZkdG9zIiwJMHgwYzYsICJCLGciKSwKLUVGUE9QMV8yICgiZWZtb3ZzIiwJMHgwMDEsICJmLGciKSwKLUVGUE9QMV8yICgiZWZuZWdzIiwJMHgwMDUsICJmLGciKSwKLUVGUE9QMV8yICgiZWZhYnNzIiwJMHgwMDksICJmLGciKSwKLUVGUE9QMV8yICgiZWZzcXJ0ZCIsCTB4MDJhLCAiQixIIiksCi1FRlBPUDFfMiAoImVmc3FydHMiLAkweDAyOSwgImYsZyIpLAotRUZQT1AxXzMgKCJlZmFkZGQiLAkweDA0MiwgInYsQixIIiksCi1FRlBPUDFfMyAoImVmYWRkcyIsCTB4MDQxLCAiZSxmLGciKSwKLUVGUE9QMV8zICgiZWZzdWJkIiwJMHgwNDYsICJ2LEIsSCIpLAotRUZQT1AxXzMgKCJlZnN1YnMiLAkweDA0NSwgImUsZixnIiksCi1FRlBPUDFfMyAoImVmZGl2ZCIsCTB4MDRlLCAidixCLEgiKSwKLUVGUE9QMV8zICgiZWZkaXZzIiwJMHgwNGQsICJlLGYsZyIpLAotRUZQT1AxXzMgKCJlZm11bGQiLAkweDA0YSwgInYsQixIIiksCi1FRlBPUDFfMyAoImVmbXVscyIsCTB4MDQ5LCAiZSxmLGciKSwKLUVGUE9QMV8zICgiZWZzbXVsZCIsCTB4MDY5LCAiZSxmLEgiKSwKLUVGUE9QMl8yICgiZWZjbXBkIiwJMHgwNTIsICJ2LEIiKSwKLUVGUE9QMl8yICgiZWZjbXBlZCIsCTB4MDU2LCAidixCIiksCi1FRlBPUDJfMiAoImVmY21wcyIsCTB4MDUxLCAiZSxmIiksCi1FRlBPUDJfMiAoImVmY21wZXMiLAkweDA1NSwgImUsZiIpLAotCi0jdW5kZWYgRUZQT1AxXzIKLSN1bmRlZiBFRlBPUDFfMwotI3VuZGVmIEVGUE9QMl8yCi0KLS8qIFRoZXNlIGFyZSBtYXJrZWQgRl9BTElBUywgc28gdGhhdCB0aGV5IHdvbid0IGNvbmZsaWN0IHdpdGggc3BhcmNsaXRlIGluc25zCi0gICBwcmVzZW50LiAgT3RoZXJ3aXNlLCB0aGUgRl9BTElBUyBmbGFnIGlzIGlnbm9yZWQuICAqLwoteyAiY3BvcDEiLAlGMygyLCAweDM2LCAwKSwgRjMofjIsIH4weDM2LCB+MSksICJbMSsyXSxkIiwgRl9BTElBUywgdjZub3R2OSB9LAoteyAiY3BvcDIiLAlGMygyLCAweDM3LCAwKSwgRjMofjIsIH4weDM3LCB+MSksICJbMSsyXSxkIiwgRl9BTElBUywgdjZub3R2OSB9LAotCi0vKiBzcGFyY2xldCBzcGVjaWZpYyBpbnNucyAqLwotCi1DT01NVVRFT1AgKCJ1bWFjIiwgMHgzZSwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgic21hYyIsIDB4M2YsIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInVtYWNkIiwgMHgyZSwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgic21hY2QiLCAweDJmLCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJ1bXVsZCIsIDB4MDksIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInNtdWxkIiwgMHgwZCwgc3BhcmNsZXQpLAotCi17ICJzaHVmZmxlIiwJRjMoMiwgMHgyZCwgMCksIEYzKH4yLCB+MHgyZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHNwYXJjbGV0IH0sCi17ICJzaHVmZmxlIiwJRjMoMiwgMHgyZCwgMSksIEYzKH4yLCB+MHgyZCwgfjEpLAkJIjEsaSxkIiwgMCwgc3BhcmNsZXQgfSwKLQotLyogVGhlIG1hbnVhbCBpc24ndCBjb21wbGV0ZWx5IGFjY3VyYXRlIG9uIHRoZXNlIGluc25zLiAgVGhlIGByczInIGZpZWxkIGlzCi0gICB0cmVhdGVkIGFzIGJlaW5nIDYgYml0cyB0byBhY2NvdW50IGZvciA2IGJpdCBpbW1lZGlhdGVzIHRvIGNwdXNoLiAgSXQgaXMKLSAgIGFzc3VtZWQgdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IGJpdCA1IGlzIDAgd2hlbiByczIgY29udGFpbnMgYSByZWcuICAqLwotI2RlZmluZSBCSVQ1ICgxPDw1KQoteyAiY3JkY3h0IiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDQpLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjQpfEJJVDV8UlMyKH4wKSwJIlUsZCIsIDAsIHNwYXJjbGV0IH0sCi17ICJjd3JjeHQiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMyksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+Myl8QklUNXxSUzIofjApLAkiMSx1IiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdXNoIiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDApLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjApfEJJVDV8UkQofjApLAkiMSwyIiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdXNoIiwJRjMoMiwgMHgzNiwgMSl8U0xDUE9QKDApLCBGMyh+MiwgfjB4MzYsIH4xKXxTTENQT1AofjApfFJEKH4wKSwJCSIxLFkiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1c2hhIiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDEpLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjEpfEJJVDV8UkQofjApLAkiMSwyIiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdXNoYSIsCUYzKDIsIDB4MzYsIDEpfFNMQ1BPUCgxKSwgRjMofjIsIH4weDM2LCB+MSl8U0xDUE9QKH4xKXxSRCh+MCksCQkiMSxZIiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdWxsIiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDIpLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjIpfEJJVDV8UlMxKH4wKXxSUzIofjApLCAiZCIsIDAsIHNwYXJjbGV0IH0sCi0jdW5kZWYgQklUNQotCi0vKiBzcGFyY2xldCBjb3Byb2Nlc3NvciBicmFuY2ggaW5zbnMgKi8KLSNkZWZpbmUgU0xDQkNDMihvcGNvZGUsIG1hc2ssIGxvc2UpIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHwobG9zZSksICJsIiwgICAgRl9ERUxBWUVEfEZfQ09OREJSLCBzcGFyY2xldCB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgKGxvc2UpLCAiLGEgbCIsIEZfREVMQVlFRHxGX0NPTkRCUiwgc3BhcmNsZXQgfQotI2RlZmluZSBTTENCQ0Mob3Bjb2RlLCBtYXNrKSBcCi0gIFNMQ0JDQzIob3Bjb2RlLCBGMigwLCA3KXxDT05EKG1hc2spLCBGMih+MCwgfjcpfENPTkQofihtYXNrKSkpCi0KLS8qIGNibixjYmEgY2FuJ3QgYmUgZGVmaW5lZCBoZXJlIGJlY2F1c2UgdGhleSdyZSBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgR0FTCi0gICByZXF1aXJlcyBhbGwgbW5lbW9uaWNzIG9mIHRoZSBzYW1lIG5hbWUgdG8gYmUgY29uc2VjdXRpdmUuICAqLwotLypTTENCQ0MoImNibiIsIDApLCAtIGFscmVhZHkgZGVmaW5lZCAqLwotU0xDQkNDKCJjYmUiLCAxKSwKLVNMQ0JDQygiY2JmIiwgMiksCi1TTENCQ0MoImNiZWYiLCAzKSwKLVNMQ0JDQygiY2JyIiwgNCksCi1TTENCQ0MoImNiZXIiLCA1KSwKLVNMQ0JDQygiY2JmciIsIDYpLAotU0xDQkNDKCJjYmVmciIsIDcpLAotLypTTENCQ0MoImNiYSIsIDgpLCAtIGFscmVhZHkgZGVmaW5lZCAqLwotU0xDQkNDKCJjYm5lIiwgOSksCi1TTENCQ0MoImNibmYiLCAxMCksCi1TTENCQ0MoImNibmVmIiwgMTEpLAotU0xDQkNDKCJjYm5yIiwgMTIpLAotU0xDQkNDKCJjYm5lciIsIDEzKSwKLVNMQ0JDQygiY2JuZnIiLCAxNCksCi1TTENCQ0MoImNibmVmciIsIDE1KSwKLQotI3VuZGVmIFNMQ0JDQzIKLSN1bmRlZiBTTENCQ0MKLQoteyAiY2FzYSIsCUYzKDMsIDB4M2MsIDApLCBGMyh+MywgfjB4M2MsIH4wKSwgIlsxXUEsMixkIiwgMCwgdjkgfSwKLXsgImNhc2EiLAlGMygzLCAweDNjLCAxKSwgRjMofjMsIH4weDNjLCB+MSksICJbMV1vLDIsZCIsIDAsIHY5IH0sCi17ICJjYXN4YSIsCUYzKDMsIDB4M2UsIDApLCBGMyh+MywgfjB4M2UsIH4wKSwgIlsxXUEsMixkIiwgMCwgdjkgfSwKLXsgImNhc3hhIiwJRjMoMywgMHgzZSwgMSksIEYzKH4zLCB+MHgzZSwgfjEpLCAiWzFdbywyLGQiLCAwLCB2OSB9LAotCi0vKiB2OSBzeW50aGV0aWMgaW5zbnMgKi8KLXsgImlwcmVmZXRjaCIsCUYyKDAsIDEpfCgyPDwyMCl8QlBSRUQsIEYyKH4wLCB+MSl8KDE8PDIwKXxBTk5VTHxDT05EKH4wKSwgIkciLCAwLCB2OSB9LCAvKiBibixhLHB0ICV4Y2MsbGFiZWwgKi8KLXsgInNpZ254IiwJRjMoMiwgMHgyNywgMCksIEYzKH4yLCB+MHgyNywgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICIxLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmEgcnMxLCVnMCxyZCAqLwoteyAic2lnbngiLAlGMygyLCAweDI3LCAwKSwgRjMofjIsIH4weDI3LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgInIiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmEgcmQsJWcwLHJkICovCi17ICJjbHJ1dyIsCUYzKDIsIDB4MjYsIDApLCBGMyh+MiwgfjB4MjYsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiMSxkIiwgRl9BTElBUywgdjkgfSwgLyogc3JsIHJzMSwlZzAscmQgKi8KLXsgImNscnV3IiwJRjMoMiwgMHgyNiwgMCksIEYzKH4yLCB+MHgyNiwgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICJyIiwgRl9BTElBUywgdjkgfSwgLyogc3JsIHJkLCVnMCxyZCAqLwoteyAiY2FzIiwJRjMoMywgMHgzYywgMCl8QVNJKDB4ODApLCBGMyh+MywgfjB4M2MsIH4wKXxBU0kofjB4ODApLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc2EgW3JzMV1BU0lfUCxyczIscmQgKi8KLXsgImNhc2wiLAlGMygzLCAweDNjLCAwKXxBU0koMHg4OCksIEYzKH4zLCB+MHgzYywgfjApfEFTSSh+MHg4OCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzYSBbcnMxXUFTSV9QX0wscnMyLHJkICovCi17ICJjYXN4IiwJRjMoMywgMHgzZSwgMCl8QVNJKDB4ODApLCBGMyh+MywgfjB4M2UsIH4wKXxBU0kofjB4ODApLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc3hhIFtyczFdQVNJX1AscnMyLHJkICovCi17ICJjYXN4bCIsCUYzKDMsIDB4M2UsIDApfEFTSSgweDg4KSwgRjMofjMsIH4weDNlLCB+MCl8QVNJKH4weDg4KSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXN4YSBbcnMxXUFTSV9QX0wscnMyLHJkICovCi0KLS8qIFVsdHJhc3BhcmMgZXh0ZW5zaW9ucyAqLwoteyAic2h1dGRvd24iLAlGM0YoMiwgMHgzNiwgMHgwODApLCBGM0YofjIsIH4weDM2LCB+MHgwODApfFJEX0cwfFJTMV9HMHxSUzJfRzAsICIiLCAwLCB2OWEgfSwKLQotLyogRklYTUU6IERvIHdlIHdhbnQgdG8gbWFyayB0aGVzZSBhcyBGX0ZMT0FULCBvciBzb21ldGhpbmcgc2ltaWxhcj8gICovCi17ICJmcGFkZDE2IiwJRjNGKDIsIDB4MzYsIDB4MDUwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUwKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcGFkZDE2cyIsCUYzRigyLCAweDM2LCAweDA1MSksIEYzRih+MiwgfjB4MzYsIH4weDA1MSksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnBhZGQzMiIsCUYzRigyLCAweDM2LCAweDA1MiksIEYzRih+MiwgfjB4MzYsIH4weDA1MiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBhZGQzMnMiLAlGM0YoMiwgMHgzNiwgMHgwNTMpLCBGM0YofjIsIH4weDM2LCB+MHgwNTMpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZwc3ViMTYiLAlGM0YoMiwgMHgzNiwgMHgwNTQpLCBGM0YofjIsIH4weDM2LCB+MHgwNTQpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwc3ViMTZzIiwJRjNGKDIsIDB4MzYsIDB4MDU1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU1KSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmcHN1YjMyIiwJRjNGKDIsIDB4MzYsIDB4MDU2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU2KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcHN1YjMycyIsCUYzRigyLCAweDM2LCAweDA1NyksIEYzRih+MiwgfjB4MzYsIH4weDA1NyksICJlLGYsZyIsIDAsIHY5YSB9LAotCi17ICJmcGFjazMyIiwJRjNGKDIsIDB4MzYsIDB4MDNhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDNhKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcGFjazE2IiwJRjNGKDIsIDB4MzYsIDB4MDNiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDNiKXxSUzFfRzAsICJCLGciLCAwLCB2OWEgfSwKLXsgImZwYWNrZml4IiwJRjNGKDIsIDB4MzYsIDB4MDNkKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDNkKXxSUzFfRzAsICJCLGciLCAwLCB2OWEgfSwKLXsgImZleHBhbmQiLAlGM0YoMiwgMHgzNiwgMHgwNGQpLCBGM0YofjIsIH4weDM2LCB+MHgwNGQpfFJTMV9HMCwgImYsSCIsIDAsIHY5YSB9LAoteyAiZnBtZXJnZSIsCUYzRigyLCAweDM2LCAweDA0YiksIEYzRih+MiwgfjB4MzYsIH4weDA0YiksICJlLGYsSCIsIDAsIHY5YSB9LAotCi0vKiBOb3RlIHRoYXQgdGhlIG1peGluZyBvZiAzMi82NCBiaXQgcmVncyBpcyBpbnRlbnRpb25hbC4gICovCi17ICJmbXVsOHgxNiIsCQlGM0YoMiwgMHgzNiwgMHgwMzEpLCBGM0YofjIsIH4weDM2LCB+MHgwMzEpLCAiZSxCLEgiLCAwLCB2OWEgfSwKLXsgImZtdWw4eDE2YXUiLAkJRjNGKDIsIDB4MzYsIDB4MDMzKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDMzKSwgImUsZixIIiwgMCwgdjlhIH0sCi17ICJmbXVsOHgxNmFsIiwJCUYzRigyLCAweDM2LCAweDAzNSksIEYzRih+MiwgfjB4MzYsIH4weDAzNSksICJlLGYsSCIsIDAsIHY5YSB9LAoteyAiZm11bDhzdXgxNiIsCQlGM0YoMiwgMHgzNiwgMHgwMzYpLCBGM0YofjIsIH4weDM2LCB+MHgwMzYpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZtdWw4dWx4MTYiLAkJRjNGKDIsIDB4MzYsIDB4MDM3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM3KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmbXVsZDhzdXgxNiIsCUYzRigyLCAweDM2LCAweDAzOCksIEYzRih+MiwgfjB4MzYsIH4weDAzOCksICJlLGYsSCIsIDAsIHY5YSB9LAoteyAiZm11bGQ4dWx4MTYiLAlGM0YoMiwgMHgzNiwgMHgwMzkpLCBGM0YofjIsIH4weDM2LCB+MHgwMzkpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLQoteyAiYWxpZ25hZGRyIiwJRjNGKDIsIDB4MzYsIDB4MDE4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDE4KSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJhbGlnbmFkZHJsIiwJRjNGKDIsIDB4MzYsIDB4MDFhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDFhKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJmYWxpZ25kYXRhIiwJRjNGKDIsIDB4MzYsIDB4MDQ4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDQ4KSwgInYsQixIIiwgMCwgdjlhIH0sCi0KLXsgImZ6ZXJvIiwJRjNGKDIsIDB4MzYsIDB4MDYwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYwKSwgIkgiLCAwLCB2OWEgfSwKLXsgImZ6ZXJvcyIsCUYzRigyLCAweDM2LCAweDA2MSksIEYzRih+MiwgfjB4MzYsIH4weDA2MSksICJnIiwgMCwgdjlhIH0sCi17ICJmb25lIiwJRjNGKDIsIDB4MzYsIDB4MDdlKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdlKSwgIkgiLCAwLCB2OWEgfSwKLXsgImZvbmVzIiwJRjNGKDIsIDB4MzYsIDB4MDdmKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdmKSwgImciLCAwLCB2OWEgfSwKLXsgImZzcmMxIiwJRjNGKDIsIDB4MzYsIDB4MDc0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc0KSwgInYsSCIsIDAsIHY5YSB9LAoteyAiZnNyYzFzIiwJRjNGKDIsIDB4MzYsIDB4MDc1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc1KSwgImUsZyIsIDAsIHY5YSB9LAoteyAiZnNyYzIiLAlGM0YoMiwgMHgzNiwgMHgwNzgpLCBGM0YofjIsIH4weDM2LCB+MHgwNzgpLCAiQixIIiwgMCwgdjlhIH0sCi17ICJmc3JjMnMiLAlGM0YoMiwgMHgzNiwgMHgwNzkpLCBGM0YofjIsIH4weDM2LCB+MHgwNzkpLCAiZixnIiwgMCwgdjlhIH0sCi17ICJmbm90MSIsCUYzRigyLCAweDM2LCAweDA2YSksIEYzRih+MiwgfjB4MzYsIH4weDA2YSksICJ2LEgiLCAwLCB2OWEgfSwKLXsgImZub3QxcyIsCUYzRigyLCAweDM2LCAweDA2YiksIEYzRih+MiwgfjB4MzYsIH4weDA2YiksICJlLGciLCAwLCB2OWEgfSwKLXsgImZub3QyIiwJRjNGKDIsIDB4MzYsIDB4MDY2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY2KSwgIkIsSCIsIDAsIHY5YSB9LAoteyAiZm5vdDJzIiwJRjNGKDIsIDB4MzYsIDB4MDY3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY3KSwgImYsZyIsIDAsIHY5YSB9LAoteyAiZm9yIiwJRjNGKDIsIDB4MzYsIDB4MDdjKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdjKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmb3JzIiwJRjNGKDIsIDB4MzYsIDB4MDdkKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdkKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmbm9yIiwJRjNGKDIsIDB4MzYsIDB4MDYyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYyKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmbm9ycyIsCUYzRigyLCAweDM2LCAweDA2MyksIEYzRih+MiwgfjB4MzYsIH4weDA2MyksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZmFuZCIsCUYzRigyLCAweDM2LCAweDA3MCksIEYzRih+MiwgfjB4MzYsIH4weDA3MCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZmFuZHMiLAlGM0YoMiwgMHgzNiwgMHgwNzEpLCBGM0YofjIsIH4weDM2LCB+MHgwNzEpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZuYW5kIiwJRjNGKDIsIDB4MzYsIDB4MDZlKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZlKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmbmFuZHMiLAlGM0YoMiwgMHgzNiwgMHgwNmYpLCBGM0YofjIsIH4weDM2LCB+MHgwNmYpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZ4b3IiLAlGM0YoMiwgMHgzNiwgMHgwNmMpLCBGM0YofjIsIH4weDM2LCB+MHgwNmMpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZ4b3JzIiwJRjNGKDIsIDB4MzYsIDB4MDZkKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZkKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmeG5vciIsCUYzRigyLCAweDM2LCAweDA3MiksIEYzRih+MiwgfjB4MzYsIH4weDA3MiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnhub3JzIiwJRjNGKDIsIDB4MzYsIDB4MDczKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDczKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmb3Jub3QxIiwJRjNGKDIsIDB4MzYsIDB4MDdhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdhKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmb3Jub3QxcyIsCUYzRigyLCAweDM2LCAweDA3YiksIEYzRih+MiwgfjB4MzYsIH4weDA3YiksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZm9ybm90MiIsCUYzRigyLCAweDM2LCAweDA3NiksIEYzRih+MiwgfjB4MzYsIH4weDA3NiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm9ybm90MnMiLAlGM0YoMiwgMHgzNiwgMHgwNzcpLCBGM0YofjIsIH4weDM2LCB+MHgwNzcpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZhbmRub3QxIiwJRjNGKDIsIDB4MzYsIDB4MDY4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY4KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmYW5kbm90MXMiLAlGM0YoMiwgMHgzNiwgMHgwNjkpLCBGM0YofjIsIH4weDM2LCB+MHgwNjkpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZhbmRub3QyIiwJRjNGKDIsIDB4MzYsIDB4MDY0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY0KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmYW5kbm90MnMiLAlGM0YoMiwgMHgzNiwgMHgwNjUpLCBGM0YofjIsIH4weDM2LCB+MHgwNjUpLCAiZSxmLGciLCAwLCB2OWEgfSwKLQoteyAiZmNtcGd0MTYiLAlGM0YoMiwgMHgzNiwgMHgwMjgpLCBGM0YofjIsIH4weDM2LCB+MHgwMjgpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBndDMyIiwJRjNGKDIsIDB4MzYsIDB4MDJjKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDJjKSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wbGUxNiIsCUYzRigyLCAweDM2LCAweDAyMCksIEYzRih+MiwgfjB4MzYsIH4weDAyMCksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGxlMzIiLAlGM0YoMiwgMHgzNiwgMHgwMjQpLCBGM0YofjIsIH4weDM2LCB+MHgwMjQpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBuZTE2IiwJRjNGKDIsIDB4MzYsIDB4MDIyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDIyKSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wbmUzMiIsCUYzRigyLCAweDM2LCAweDAyNiksIEYzRih+MiwgfjB4MzYsIH4weDAyNiksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGVxMTYiLAlGM0YoMiwgMHgzNiwgMHgwMmEpLCBGM0YofjIsIH4weDM2LCB+MHgwMmEpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBlcTMyIiwJRjNGKDIsIDB4MzYsIDB4MDJlKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDJlKSwgInYsQixkIiwgMCwgdjlhIH0sCi0KLXsgImVkZ2U4IiwJRjNGKDIsIDB4MzYsIDB4MDAwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDAwKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlOGwiLAlGM0YoMiwgMHgzNiwgMHgwMDIpLCBGM0YofjIsIH4weDM2LCB+MHgwMDIpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2UxNiIsCUYzRigyLCAweDM2LCAweDAwNCksIEYzRih+MiwgfjB4MzYsIH4weDAwNCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZTE2bCIsCUYzRigyLCAweDM2LCAweDAwNiksIEYzRih+MiwgfjB4MzYsIH4weDAwNiksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZTMyIiwJRjNGKDIsIDB4MzYsIDB4MDA4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDA4KSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlMzJsIiwJRjNGKDIsIDB4MzYsIDB4MDBhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDBhKSwgIjEsMixkIiwgMCwgdjlhIH0sCi0KLXsgInBkaXN0IiwJRjNGKDIsIDB4MzYsIDB4MDNlKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDNlKSwgInYsQixIIiwgMCwgdjlhIH0sCi0KLXsgImFycmF5OCIsCUYzRigyLCAweDM2LCAweDAxMCksIEYzRih+MiwgfjB4MzYsIH4weDAxMCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiYXJyYXkxNiIsCUYzRigyLCAweDM2LCAweDAxMiksIEYzRih+MiwgfjB4MzYsIH4weDAxMiksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiYXJyYXkzMiIsCUYzRigyLCAweDM2LCAweDAxNCksIEYzRih+MiwgfjB4MzYsIH4weDAxNCksICIxLDIsZCIsIDAsIHY5YSB9LAotCi0vKiBNb3JlIHY5IHNwZWNpZmljIGluc25zLCB0aGVzZSBuZWVkIHRvIGNvbWUgbGFzdCBzbyB0aGV5IGRvIG5vdCBjbGFzaAotICAgd2l0aCB2OWEgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgImVkZ2U4IiB3aGljaCBsb29rcyBsaWtlIGltcGRlcDEuICovCi0KLSNkZWZpbmUgSU1QREVQKG5hbWUsIGNvZGUpIFwKLXsgbmFtZSwJRjMoMiwgY29kZSwgMCksIEYzKH4yLCB+Y29kZSwgfjApfEFTSSh+MCksICIxLDIsZCIsIDAsIHY5bm90djlhIH0sIFwKLXsgbmFtZSwJRjMoMiwgY29kZSwgMSksIEYzKH4yLCB+Y29kZSwgfjEpLAkgICAiMSxpLGQiLCAwLCB2OW5vdHY5YSB9LCBcCi17IG5hbWUsIEYzKDIsIGNvZGUsIDApLCBGMyh+MiwgfmNvZGUsIH4wKSwgICAgICAgICAieCwxLDIsZCIsIDAsIHY5bm90djlhIH0sIFwKLXsgbmFtZSwgRjMoMiwgY29kZSwgMCksIEYzKH4yLCB+Y29kZSwgfjApLCAgICAgICAgICJ4LGUsZixnIiwgMCwgdjlub3R2OWEgfQotCi1JTVBERVAgKCJpbXBkZXAxIiwgMHgzNiksCi1JTVBERVAgKCJpbXBkZXAyIiwgMHgzNyksCi0KLSN1bmRlZiBJTVBERVAKLQotfTsKLQotY29uc3QgaW50IHNwYXJjX251bV9vcGNvZGVzID0gKChzaXplb2Ygc3BhcmNfb3Bjb2RlcykvKHNpemVvZiBzcGFyY19vcGNvZGVzWzBdKSk7Ci0MCi0vKiBVdGlsaXRpZXMgZm9yIGFyZ3VtZW50IHBhcnNpbmcuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBpbnQgdmFsdWU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19IGFyZzsKLQotLyogTG9vayB1cCBOQU1FIGluIFRBQkxFLiAgKi8KLQotc3RhdGljIGludCBsb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBhcmcgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbG9va3VwX3ZhbHVlIFBBUkFNUyAoKGNvbnN0IGFyZyAqLCBpbnQpKTsKLQotc3RhdGljIGludAotbG9va3VwX25hbWUgKHRhYmxlLCBuYW1lKQotICAgICBjb25zdCBhcmcgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBhcmcgKnA7Ci0KLSAgZm9yIChwID0gdGFibGU7IHAtPm5hbWU7ICsrcCkKLSAgICBpZiAoc3RyY21wIChuYW1lLCBwLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIHAtPnZhbHVlOwotCi0gIHJldHVybiAtMTsKLX0KLQotLyogTG9vayB1cCBWQUxVRSBpbiBUQUJMRS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWxvb2t1cF92YWx1ZSAodGFibGUsIHZhbHVlKQotICAgICBjb25zdCBhcmcgKnRhYmxlOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGNvbnN0IGFyZyAqcDsKLQotICBmb3IgKHAgPSB0YWJsZTsgcC0+bmFtZTsgKytwKQotICAgIGlmICh2YWx1ZSA9PSBwLT52YWx1ZSkKLSAgICAgIHJldHVybiBwLT5uYW1lOwotCi0gIHJldHVybiAoY2hhciAqKSAwOwotfQotDAotLyogSGFuZGxlIEFTSSdzLiAgKi8KLQotc3RhdGljIGFyZyBhc2lfdGFibGVbXSA9Ci17Ci0gIC8qIFRoZXNlIGFyZSBpbiB0aGUgdjkgYXJjaGl0ZWN0dXJlIG1hbnVhbC4gICovCi0gIC8qIFRoZSBzaG9ydGVyIHZlcnNpb25zIGFwcGVhciBmaXJzdCwgdGhleSdyZSBoZXJlIGJlY2F1c2UgU3VuJ3MgYXMgaGFzIHRoZW0uCi0gICAgIFN1bidzIGFzIHVzZXMgI0FTSV9QX0wgaW5zdGVhZCBvZiAjQVNJX1BMICh3aGljaCBhcHBlYXJzIGluIHRoZQotICAgICBVbHRyYVNQQVJDIGFyY2hpdGVjdHVyZSBtYW51YWwpLiAgKi8KLSAgeyAweDA0LCAiI0FTSV9OIiB9LAotICB7IDB4MGMsICIjQVNJX05fTCIgfSwKLSAgeyAweDEwLCAiI0FTSV9BSVVQIiB9LAotICB7IDB4MTEsICIjQVNJX0FJVVMiIH0sCi0gIHsgMHgxOCwgIiNBU0lfQUlVUF9MIiB9LAotICB7IDB4MTksICIjQVNJX0FJVVNfTCIgfSwKLSAgeyAweDgwLCAiI0FTSV9QIiB9LAotICB7IDB4ODEsICIjQVNJX1MiIH0sCi0gIHsgMHg4MiwgIiNBU0lfUE5GIiB9LAotICB7IDB4ODMsICIjQVNJX1NORiIgfSwKLSAgeyAweDg4LCAiI0FTSV9QX0wiIH0sCi0gIHsgMHg4OSwgIiNBU0lfU19MIiB9LAotICB7IDB4OGEsICIjQVNJX1BORl9MIiB9LAotICB7IDB4OGIsICIjQVNJX1NORl9MIiB9LAotICB7IDB4MDQsICIjQVNJX05VQ0xFVVMiIH0sCi0gIHsgMHgwYywgIiNBU0lfTlVDTEVVU19MSVRUTEUiIH0sCi0gIHsgMHgxMCwgIiNBU0lfQVNfSUZfVVNFUl9QUklNQVJZIiB9LAotICB7IDB4MTEsICIjQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZIiB9LAotICB7IDB4MTgsICIjQVNJX0FTX0lGX1VTRVJfUFJJTUFSWV9MSVRUTEUiIH0sCi0gIHsgMHgxOSwgIiNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUllfTElUVExFIiB9LAotICB7IDB4ODAsICIjQVNJX1BSSU1BUlkiIH0sCi0gIHsgMHg4MSwgIiNBU0lfU0VDT05EQVJZIiB9LAotICB7IDB4ODIsICIjQVNJX1BSSU1BUllfTk9GQVVMVCIgfSwKLSAgeyAweDgzLCAiI0FTSV9TRUNPTkRBUllfTk9GQVVMVCIgfSwKLSAgeyAweDg4LCAiI0FTSV9QUklNQVJZX0xJVFRMRSIgfSwKLSAgeyAweDg5LCAiI0FTSV9TRUNPTkRBUllfTElUVExFIiB9LAotICB7IDB4OGEsICIjQVNJX1BSSU1BUllfTk9GQVVMVF9MSVRUTEUiIH0sCi0gIHsgMHg4YiwgIiNBU0lfU0VDT05EQVJZX05PRkFVTFRfTElUVExFIiB9LAotICAvKiBUaGVzZSBhcmUgVWx0cmFTUEFSQyBleHRlbnNpb25zLiAgKi8KLSAgLyogRklYTUU6IFRoZXJlIGFyZSBkb3plbnMgb2YgdGhlbS4gIE5vdCBzdXJlIHdlIHdhbnQgdGhlbSBhbGwuCi0gICAgIE1vc3QgYXJlIGZvciBrZXJuZWwgYnVpbGRpbmcgYnV0IHNvbWUgYXJlIGZvciB2aXMgdHlwZSBzdHVmZi4gICovCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBBU0kgTkFNRSwgb3IgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1zcGFyY19lbmNvZGVfYXNpIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbG9va3VwX25hbWUgKGFzaV90YWJsZSwgbmFtZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBmb3IgQVNJIHZhbHVlIFZBTFVFIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY19kZWNvZGVfYXNpICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICByZXR1cm4gbG9va3VwX3ZhbHVlIChhc2lfdGFibGUsIHZhbHVlKTsKLX0KLQwKLS8qIEhhbmRsZSBtZW1iYXIgbWFza3MuICAqLwotCi1zdGF0aWMgYXJnIG1lbWJhcl90YWJsZVtdID0KLXsKLSAgeyAweDQwLCAiI1N5bmMiIH0sCi0gIHsgMHgyMCwgIiNNZW1Jc3N1ZSIgfSwKLSAgeyAweDEwLCAiI0xvb2thc2lkZSIgfSwKLSAgeyAweDA4LCAiI1N0b3JlU3RvcmUiIH0sCi0gIHsgMHgwNCwgIiNMb2FkU3RvcmUiIH0sCi0gIHsgMHgwMiwgIiNTdG9yZUxvYWQiIH0sCi0gIHsgMHgwMSwgIiNMb2FkTG9hZCIgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLS8qIFJldHVybiB0aGUgdmFsdWUgZm9yIG1lbWJhciBhcmcgTkFNRSwgb3IgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1zcGFyY19lbmNvZGVfbWVtYmFyIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbG9va3VwX25hbWUgKG1lbWJhcl90YWJsZSwgbmFtZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBmb3IgbWVtYmFyIHZhbHVlIFZBTFVFIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY19kZWNvZGVfbWVtYmFyICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICByZXR1cm4gbG9va3VwX3ZhbHVlIChtZW1iYXJfdGFibGUsIHZhbHVlKTsKLX0KLQwKLS8qIEhhbmRsZSBwcmVmZXRjaCBhcmdzLiAgKi8KLQotc3RhdGljIGFyZyBwcmVmZXRjaF90YWJsZVtdID0KLXsKLSAgeyAwLCAiI25fcmVhZHMiIH0sCi0gIHsgMSwgIiNvbmVfcmVhZCIgfSwKLSAgeyAyLCAiI25fd3JpdGVzIiB9LAotICB7IDMsICIjb25lX3dyaXRlIiB9LAotICB7IDQsICIjcGFnZSIgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLS8qIFJldHVybiB0aGUgdmFsdWUgZm9yIHByZWZldGNoIGFyZyBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLXNwYXJjX2VuY29kZV9wcmVmZXRjaCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF9uYW1lIChwcmVmZXRjaF90YWJsZSwgbmFtZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBmb3IgcHJlZmV0Y2ggdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2RlY29kZV9wcmVmZXRjaCAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF92YWx1ZSAocHJlZmV0Y2hfdGFibGUsIHZhbHVlKTsKLX0KLQwKLS8qIEhhbmRsZSBzcGFyY2xldCBjb3Byb2Nlc3NvciByZWdpc3RlcnMuICAqLwotCi1zdGF0aWMgYXJnIHNwYXJjbGV0X2NwcmVnX3RhYmxlW10gPQotewotICB7IDAsICIlY2NzciIgfSwKLSAgeyAxLCAiJWNjZnIiIH0sCi0gIHsgMiwgIiVjY2NyY3IiIH0sCi0gIHsgMywgIiVjY3ByIiB9LAotICB7IDQsICIlY2NzcjIiIH0sCi0gIHsgNSwgIiVjY2NyciIgfSwKLSAgeyA2LCAiJWNjcnN0ciIgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLS8qIFJldHVybiB0aGUgdmFsdWUgZm9yIHNwYXJjbGV0IGNwcmVnIGFyZyBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLXNwYXJjX2VuY29kZV9zcGFyY2xldF9jcHJlZyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF9uYW1lIChzcGFyY2xldF9jcHJlZ190YWJsZSwgbmFtZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBmb3Igc3BhcmNsZXQgY3ByZWcgdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF92YWx1ZSAoc3BhcmNsZXRfY3ByZWdfdGFibGUsIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvc3RhbXAtaC5pbiBiL29wY29kZXMvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL29wY29kZXMvc3lzZGVwLmggYi9vcGNvZGVzL3N5c2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzZTVmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvc3lzZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSYW5kb20gaG9zdC1kZXBlbmRlbnQgc3VwcG9ydCBjb2RlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlib3Bjb2RlcywgdGhlIG9wY29kZXMgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRG8gc3lzdGVtLWRlcGVuZGVudCBzdHVmZiwgbWFpbmx5IGRyaXZlbiBieSBhdXRvY29uZi1kZXRlY3RlZCBpbmZvLgotCi0gICBXZWxsLCBzb21lIGdlbmVyaWMgY29tbW9uIHN0dWZmIGlzIGRvbmUgaGVyZSB0b28sIGxpa2UgaW5jbHVkaW5nCi0gICBhbnNpZGVjbC5oLiAgVGhhdCdzIGJlY2F1c2UgdGhlIC5oIGZpbGVzIGluIGJmZC9ob3N0cyBmaWxlcyBJJ20KLSAgIHRyeWluZyB0byByZXBsYWNlIG9mdGVuIGRpZCB0aGF0LiAgSWYgaXQgY2FuIGJlIGRyb3BwZWQgZnJvbSB0aGlzCi0gICBmaWxlIChjaGVjayBpbiBhIG5vbi1BTlNJIGVudmlyb25tZW50ISksIGl0IHNob3VsZCBiZS4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWMzMC1kaXMuYyBiL29wY29kZXMvdGljMzAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2Y4OTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy90aWMzMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDcxMCArMCwwIEBACi0vKiBEaXNhc3NlbWJseSByb3V0aW5lcyBmb3IgVE1TMzIwQzMwIGFyY2hpdGVjdHVyZQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzMwLmgiCi0KLSNkZWZpbmUgTk9STUFMX0lOU04gICAxCi0jZGVmaW5lIFBBUkFMTEVMX0lOU04gMgotCi0vKiBHZXRzIHRoZSB0eXBlIG9mIGluc3RydWN0aW9uIGJhc2VkIG9uIHRoZSB0b3AgMiBvciAzIGJpdHMgb2YgdGhlCi0gICBpbnN0cnVjdGlvbiB3b3JkLiAqLwotI2RlZmluZSBHRVRfVFlQRShpbnNuKSAoaW5zbiAmIDB4ODAwMDAwMDAgPyBpbnNuICYgMHhDMDAwMDAwMCA6IGluc24gJiAweEUwMDAwMDAwKQotCi0vKiBJbnN0cnVjdGlvbiB0eXBlcy4gKi8KLSNkZWZpbmUgVFdPX09QRVJBTkRfMSAweDAwMDAwMDAwCi0jZGVmaW5lIFRXT19PUEVSQU5EXzIgMHg0MDAwMDAwMAotI2RlZmluZSBUSFJFRV9PUEVSQU5EIDB4MjAwMDAwMDAKLSNkZWZpbmUgUEFSX1NUT1JFICAgICAweEMwMDAwMDAwCi0jZGVmaW5lIE1VTF9BRERTICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBCUkFOQ0hFUyAgICAgIDB4NjAwMDAwMDAKLQotLyogU3BlY2lmaWMgaW5zdHJ1Y3Rpb24gaWQgYml0cy4gKi8KLSNkZWZpbmUgTk9STUFMX0lERU4gICAgMHgxRjgwMDAwMAotI2RlZmluZSBQQVJfU1RPUkVfSURFTiAweDNFMDAwMDAwCi0jZGVmaW5lIE1VTF9BRERfSURFTiAgIDB4MkMwMDAwMDAKLSNkZWZpbmUgQlJfSU1NX0lERU4gICAgMHgxRjAwMDAwMAotI2RlZmluZSBCUl9DT05EX0lERU4gICAweDFDM0YwMDAwCi0KLS8qIEFkZHJlc3NpbmcgbW9kZXMuICovCi0jZGVmaW5lIEFNX1JFR0lTVEVSIDB4MDAwMDAwMDAKLSNkZWZpbmUgQU1fRElSRUNUICAgMHgwMDIwMDAwMAotI2RlZmluZSBBTV9JTkRJUkVDVCAweDAwNDAwMDAwCi0jZGVmaW5lIEFNX0lNTSAgICAgIDB4MDA2MDAwMDAKLQotI2RlZmluZSBQX0ZJRUxEIDB4MDMwMDAwMDAKLQotI2RlZmluZSBSRUdfQVIwIDB4MDgKLSNkZWZpbmUgTERQX0lOU04gMHgwODcwMDAwMAotCi0vKiBUTVMzMjBDMzAgcHJvZ3JhbSBjb3VudGVyIGZvciBjdXJyZW50IGluc3RydWN0aW9uLiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfcGM7Ci0KLXN0cnVjdCBpbnN0cnVjdGlvbgotICB7Ci0gICAgaW50IHR5cGU7Ci0gICAgdGVtcGxhdGUgKnRtOwotICAgIHBhcnRlbXBsYXRlICpwdG07Ci0gIH07Ci0KLWludCBnZXRfdGljMzBfaW5zdHJ1Y3Rpb24gUEFSQU1TICgodW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF90d29fb3BlcmFuZAotICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfdGhyZWVfb3BlcmFuZAotICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfcGFyX2luc24KLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X2JyYW5jaAotICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgZ2V0X2luZGlyZWN0X29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgc2hvcnQsIGludCwgY2hhciAqKSk7Ci1pbnQgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgY2hhciwgY2hhciAqKSk7Ci1pbnQgY252dF90bXNmbG9hdF9pZWVlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCwgZmxvYXQgKikpOwotCi1pbnQKLXByaW50X2luc25fdGljMzAgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgc3RydWN0IGluc3RydWN0aW9uIGluc24gPQotICB7MCwgTlVMTCwgTlVMTH07Ci0gIGJmZF92bWEgYnVmYWRkciA9IHBjIC0gaW5mby0+YnVmZmVyX3ZtYTsKLSAgLyogT2J0YWluIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdvcmQgZnJvbSB0aGUgYnVmZmVyLiAqLwotICBpbnNuX3dvcmQgPSAoKihpbmZvLT5idWZmZXIgKyBidWZhZGRyKSA8PCAyNCkgfCAoKihpbmZvLT5idWZmZXIgKyBidWZhZGRyICsgMSkgPDwgMTYpIHwKLSAgICAoKihpbmZvLT5idWZmZXIgKyBidWZhZGRyICsgMikgPDwgOCkgfCAqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIgKyAzKTsKLSAgX3BjID0gcGMgLyA0OwotICAvKiBHZXQgdGhlIGluc3RydWN0aW9uIHJlZmVyZWQgdG8gYnkgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd29yZAotICAgICBhbmQgcHJpbnQgaXQgb3V0IGJhc2VkIG9uIGl0cyB0eXBlLiAqLwotICBpZiAoIWdldF90aWMzMF9pbnN0cnVjdGlvbiAoaW5zbl93b3JkLCAmaW5zbikpCi0gICAgcmV0dXJuIC0xOwotICBzd2l0Y2ggKEdFVF9UWVBFIChpbnNuX3dvcmQpKQotICAgIHsKLSAgICBjYXNlIFRXT19PUEVSQU5EXzE6Ci0gICAgY2FzZSBUV09fT1BFUkFORF8yOgotICAgICAgaWYgKCFwcmludF90d29fb3BlcmFuZCAoaW5mbywgaW5zbl93b3JkLCAmaW5zbikpCi0JcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUSFJFRV9PUEVSQU5EOgotICAgICAgaWYgKCFwcmludF90aHJlZV9vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBBUl9TVE9SRToKLSAgICBjYXNlIE1VTF9BRERTOgotICAgICAgaWYgKCFwcmludF9wYXJfaW5zbiAoaW5mbywgaW5zbl93b3JkLCAmaW5zbikpCi0JcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCUkFOQ0hFUzoKLSAgICAgIGlmICghcHJpbnRfYnJhbmNoIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiA0OwotfQotCi1pbnQKLWdldF90aWMzMF9pbnN0cnVjdGlvbiAoaW5zbl93b3JkLCBpbnNuKQotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBzd2l0Y2ggKEdFVF9UWVBFIChpbnNuX3dvcmQpKQotICAgIHsKLSAgICBjYXNlIFRXT19PUEVSQU5EXzE6Ci0gICAgY2FzZSBUV09fT1BFUkFORF8yOgotICAgIGNhc2UgVEhSRUVfT1BFUkFORDoKLSAgICAgIGluc24tPnR5cGUgPSBOT1JNQUxfSU5TTjsKLSAgICAgIHsKLQl0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9ICh0ZW1wbGF0ZSAqKSB0aWMzMF9vcHRhYjsKLQlmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX29wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotCSAgewotCSAgICBpZiAoR0VUX1RZUEUgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlKSA9PSBHRVRfVFlQRSAoaW5zbl93b3JkKSkKLQkgICAgICB7Ci0JCWlmIChjdXJyZW50X29wdGFiLT5vcGVyYW5kcyA9PSAwKQotCQkgIHsKLQkJICAgIGlmIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSA9PSBpbnNuX3dvcmQpCi0JCSAgICAgIHsKLQkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlIGlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBOT1JNQUxfSURFTikgPT0gKGluc25fd29yZCAmIE5PUk1BTF9JREVOKSkKLQkJICB7Ci0JCSAgICBpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQVJfU1RPUkU6Ci0gICAgICBpbnNuLT50eXBlID0gUEFSQUxMRUxfSU5TTjsKLSAgICAgIHsKLQlwYXJ0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9IChwYXJ0ZW1wbGF0ZSAqKSB0aWMzMF9wYXJvcHRhYjsKLQlmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX3Bhcm9wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotCSAgewotCSAgICBpZiAoR0VUX1RZUEUgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlKSA9PSBHRVRfVFlQRSAoaW5zbl93b3JkKSkKLQkgICAgICB7Ci0JCWlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBQQVJfU1RPUkVfSURFTikgPT0gKGluc25fd29yZCAmIFBBUl9TVE9SRV9JREVOKSkKLQkJICB7Ci0JCSAgICBpbnNuLT5wdG0gPSBjdXJyZW50X29wdGFiOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTVVMX0FERFM6Ci0gICAgICBpbnNuLT50eXBlID0gUEFSQUxMRUxfSU5TTjsKLSAgICAgIHsKLQlwYXJ0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9IChwYXJ0ZW1wbGF0ZSAqKSB0aWMzMF9wYXJvcHRhYjsKLQlmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX3Bhcm9wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotCSAgewotCSAgICBpZiAoR0VUX1RZUEUgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlKSA9PSBHRVRfVFlQRSAoaW5zbl93b3JkKSkKLQkgICAgICB7Ci0JCWlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBNVUxfQUREX0lERU4pID09IChpbnNuX3dvcmQgJiBNVUxfQUREX0lERU4pKQotCQkgIHsKLQkJICAgIGluc24tPnB0bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCUkFOQ0hFUzoKLSAgICAgIGluc24tPnR5cGUgPSBOT1JNQUxfSU5TTjsKLSAgICAgIHsKLQl0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9ICh0ZW1wbGF0ZSAqKSB0aWMzMF9vcHRhYjsKLQlmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX29wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotCSAgewotCSAgICBpZiAoR0VUX1RZUEUgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlKSA9PSBHRVRfVFlQRSAoaW5zbl93b3JkKSkKLQkgICAgICB7Ci0JCWlmIChjdXJyZW50X29wdGFiLT5vcGVyYW5kX3R5cGVzWzBdICYgSW1tMjQpCi0JCSAgewotCQkgICAgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIEJSX0lNTV9JREVOKSA9PSAoaW5zbl93b3JkICYgQlJfSU1NX0lERU4pKQotCQkgICAgICB7Ci0JCQlpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZSBpZiAoY3VycmVudF9vcHRhYi0+b3BlcmFuZHMgPiAwKQotCQkgIHsKLQkJICAgIGlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBCUl9DT05EX0lERU4pID09IChpbnNuX3dvcmQgJiBCUl9DT05EX0lERU4pKQotCQkgICAgICB7Ci0JCQlpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiAoQlJfQ09ORF9JREVOIHwgMHgwMDgwMDAwMCkpID09IChpbnNuX3dvcmQgJiAoQlJfQ09ORF9JREVOIHwgMHgwMDgwMDAwMCkpKQotCQkgICAgICB7Ci0JCQlpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1wcmludF90d29fb3BlcmFuZCAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBjaGFyIG5hbWVbMTJdOwotICBjaGFyIG9wZXJhbmRbMl1bMTNdID0KLSAgewotICAgIHswfSwKLSAgICB7MH19OwotICBmbG9hdCBmX251bWJlcjsKLQotICBpZiAoaW5zbi0+dG0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgc3RyY3B5IChuYW1lLCBpbnNuLT50bS0+bmFtZSk7Ci0gIGlmIChpbnNuLT50bS0+b3Bjb2RlX21vZGlmaWVyID09IEFkZHJlc3NNb2RlKQotICAgIHsKLSAgICAgIGludCBzcmNfb3AsIGRlc3Rfb3A7Ci0gICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciBpbnN0cnVjdGlvbiBpcyBhIHN0b3JlIG9yIGEgbm9ybWFsIGluc3RydWN0aW9uLiAqLwotICAgICAgaWYgKChpbnNuLT50bS0+b3BlcmFuZF90eXBlc1sxXSAmIChEaXJlY3QgfCBJbmRpcmVjdCkpID09IChEaXJlY3QgfCBJbmRpcmVjdCkpCi0JewotCSAgc3JjX29wID0gMTsKLQkgIGRlc3Rfb3AgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzcmNfb3AgPSAwOwotCSAgZGVzdF9vcCA9IDE7Ci0JfQotICAgICAgLyogR2V0IHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4gKi8KLSAgICAgIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMikKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAxRjAwMDApID4+IDE2LCBvcGVyYW5kW2Rlc3Rfb3BdKTsKLSAgICAgIC8qIEdldCB0aGUgc291cmNlIG9wZXJhbmQgYmFzZWQgb24gYWRkcmVzc2luZyBtb2RlLiAqLwotICAgICAgc3dpdGNoIChpbnNuX3dvcmQgJiBBZGRyZXNzTW9kZSkKLQl7Ci0JY2FzZSBBTV9SRUdJU1RFUjoKLQkgIC8qIENoZWNrIGZvciB0aGUgTk9QIGluc3RydWN0aW9uIGJlZm9yZSBnZXR0aW5nIHRoZSBvcGVyYW5kLiAqLwotCSAgaWYgKChpbnNuLT50bS0+b3BlcmFuZF90eXBlc1swXSAmIE5vdFJlcSkgPT0gMCkKLQkgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMDFGKSwgb3BlcmFuZFtzcmNfb3BdKTsKLQkgIGJyZWFrOwotCWNhc2UgQU1fRElSRUNUOgotCSAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiQDB4JWxYIiwgKGluc25fd29yZCAmIDB4MDAwMEZGRkYpKTsKLQkgIGJyZWFrOwotCWNhc2UgQU1fSU5ESVJFQ1Q6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGRkYpLCAyLCBvcGVyYW5kW3NyY19vcF0pOwotCSAgYnJlYWs7Ci0JY2FzZSBBTV9JTU06Ci0JICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBpbW1lZGlhdGUgb3BlcmFuZCBiYXNlZCBvbiB2YXJpYWJsZSB0eXBlLiAqLwotCSAgc3dpdGNoIChpbnNuLT50bS0+aW1tX2FyZ190eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgSW1tX0Zsb2F0OgotCSAgICAgIGNudnRfdG1zZmxvYXRfaWVlZSAoKGluc25fd29yZCAmIDB4MDAwMEZGRkYpLCAyLCAmZl9udW1iZXIpOwotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbc3JjX29wXSwgIiUyLjJmIiwgZl9udW1iZXIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEltbV9TSW50OgotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbc3JjX29wXSwgIiVkIiwgKHNob3J0KSAoaW5zbl93b3JkICYgMHgwMDAwRkZGRikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEltbV9VSW50OgotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbc3JjX29wXSwgIiVsdSIsIChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIExEUCBpbnN0cnVjdGlvbi4gKi8KLQkgIGlmICgoaW5zbl93b3JkICYgMHhGRkZGRkYwMCkgPT0gTERQX0lOU04pCi0JICAgIHsKLQkgICAgICBzdHJjcHkgKG5hbWUsICJsZHAiKTsKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiMHglMDZsWCIsIChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSA8PCAxNik7Ci0JICAgICAgb3BlcmFuZFsxXVswXSA9ICdcMCc7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBIYW5kbGUgY2FzZSBmb3Igc3RhY2sgYW5kIHJvdGF0ZSBpbnN0cnVjdGlvbnMuICovCi0gIGVsc2UgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAxKQotICAgIHsKLSAgICAgIGlmIChpbnNuLT50bS0+b3Bjb2RlX21vZGlmaWVyID09IFN0YWNrT3ApCi0JewotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMUYwMDAwKSA+PiAxNiwgb3BlcmFuZFswXSk7Ci0JfQotICAgIH0KLSAgLyogT3V0cHV0IGluc3RydWN0aW9uIHRvIHN0cmVhbS4gKi8KLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcyVjJXMiLCBuYW1lLAotCQkgICAgICBvcGVyYW5kWzBdWzBdID8gb3BlcmFuZFswXSA6ICIiLAotCQkgICAgICBvcGVyYW5kWzFdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzFdWzBdID8gb3BlcmFuZFsxXSA6ICIiKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotcHJpbnRfdGhyZWVfb3BlcmFuZCAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBjaGFyIG9wZXJhbmRbM11bMTNdID0KLSAgewotICAgIHswfSwKLSAgICB7MH0sCi0gICAgezB9fTsKLQotICBpZiAoaW5zbi0+dG0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgc3dpdGNoIChpbnNuX3dvcmQgJiBBZGRyZXNzTW9kZSkKLSAgICB7Ci0gICAgY2FzZSBBTV9SRUdJU1RFUjoKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIG9wZXJhbmRbMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCBvcGVyYW5kWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQU1fRElSRUNUOgotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgb3BlcmFuZFswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBTV9JTkRJUkVDVDoKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCBvcGVyYW5kWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQU1fSU1NOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAzKQotICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDFGMDAwMCkgPj4gMTYsIG9wZXJhbmRbMl0pOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzLCVzJWMlcyIsIGluc24tPnRtLT5uYW1lLAotCQkgICAgICBvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLAotCQkgICAgICBvcGVyYW5kWzJdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzJdWzBdID8gb3BlcmFuZFsyXSA6ICIiKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotcHJpbnRfcGFyX2luc24gKGluZm8sIGluc25fd29yZCwgaW5zbikKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgc2l6ZV90IGksIGxlbjsKLSAgY2hhciAqbmFtZTEsICpuYW1lMjsKLSAgY2hhciBvcGVyYW5kWzJdWzNdWzEzXSA9Ci0gIHsKLSAgICB7Ci0gICAgICB7MH0sCi0gICAgICB7MH0sCi0gICAgICB7MH19LAotICAgIHsKLSAgICAgIHswfSwKLSAgICAgIHswfSwKLSAgICAgIHswfX19OwotCi0gIGlmIChpbnNuLT5wdG0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgLyogUGFyc2Ugb3V0IHRoZSBuYW1lcyBvZiBlYWNoIG9mIHRoZSBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgZnJvbSB0aGUKLSAgICAgcV9pbnNuMV9pbnNuMiBmb3JtYXQuICovCi0gIG5hbWUxID0gKGNoYXIgKikgc3RyZHVwIChpbnNuLT5wdG0tPm5hbWUgKyAyKTsKLSAgbmFtZTIgPSAiIjsKLSAgbGVuID0gc3RybGVuIChuYW1lMSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmFtZTFbaV0gPT0gJ18nKQotCXsKLQkgIG5hbWUyID0gJm5hbWUxW2kgKyAxXTsKLQkgIG5hbWUxW2ldID0gJ1wwJzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIC8qIEdldCB0aGUgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uIGJhc2VkIG9uIHRoZSBvcGVyYW5kIG9yZGVyLiAqLwotICBzd2l0Y2ggKGluc24tPnB0bS0+b3BvcmRlcikKLSAgICB7Ci0gICAgY2FzZSBPT180b3AxOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fNG9wMjoKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PXzRvcDM6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT181b3AxOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMl0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT181b3AyOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMl0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT19QRmllbGQ6Ci0gICAgICBpZiAoaW5zbl93b3JkICYgMHgwMDgwMDAwMCkKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMSwgb3BlcmFuZFswXVsyXSk7Ci0gICAgICBlbHNlCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDAsIG9wZXJhbmRbMF1bMl0pOwotICAgICAgaWYgKGluc25fd29yZCAmIDB4MDA0MDAwMDApCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDMsIG9wZXJhbmRbMV1bMl0pOwotICAgICAgZWxzZQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAyLCBvcGVyYW5kWzFdWzJdKTsKLSAgICAgIHN3aXRjaCAoaW5zbl93b3JkICYgUF9GSUVMRCkKLQl7Ci0JY2FzZSAweDAwMDAwMDAwOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVsxXSk7Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMF1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVsxXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMTAwMDAwMDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMV1bMF0pOwotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzBdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMV0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0JICBicmVhazsKLQljYXNlIDB4MDIwMDAwMDA6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzFdWzFdKTsKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMF0pOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAzMDAwMDAwOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMF1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMsJXMlYyVzIiwgbmFtZTEsCi0JCSAgICAgIG9wZXJhbmRbMF1bMF0sIG9wZXJhbmRbMF1bMV0sCi0JCSAgICAgIG9wZXJhbmRbMF1bMl1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMF1bMl1bMF0gPyBvcGVyYW5kWzBdWzJdIDogIiIpOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIlxuXHRcdFx0fHwgJXMgJXMsJXMlYyVzIiwgbmFtZTIsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0sIG9wZXJhbmRbMV1bMV0sCi0JCSAgICAgIG9wZXJhbmRbMV1bMl1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMV1bMl1bMF0gPyBvcGVyYW5kWzFdWzJdIDogIiIpOwotICBmcmVlIChuYW1lMSk7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXByaW50X2JyYW5jaCAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBjaGFyIG9wZXJhbmRbMl1bMTNdID0KLSAgewotICAgIHswfSwKLSAgICB7MH19OwotICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0gIGludCBwcmludF9sYWJlbCA9IDA7Ci0KLSAgaWYgKGluc24tPnRtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIEdldCB0aGUgb3BlcmFuZHMgZm9yIDI0LWJpdCBpbW1lZGlhdGUganVtcHMuICovCi0gIGlmIChpbnNuLT50bS0+b3BlcmFuZF90eXBlc1swXSAmIEltbTI0KQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBpbnNuX3dvcmQgJiAweDAwRkZGRkZGOwotICAgICAgc3ByaW50ZiAob3BlcmFuZFswXSwgIjB4JWxYIiwgYWRkcmVzcyk7Ci0gICAgICBwcmludF9sYWJlbCA9IDE7Ci0gICAgfQotICAvKiBHZXQgdGhlIG9wZXJhbmQgZm9yIHRoZSB0cmFwIGluc3RydWN0aW9uLiAqLwotICBlbHNlIGlmIChpbnNuLT50bS0+b3BlcmFuZF90eXBlc1swXSAmIElWZWN0b3IpCi0gICAgewotICAgICAgYWRkcmVzcyA9IGluc25fd29yZCAmIDB4MDAwMDAwMUY7Ci0gICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiMHglbFgiLCBhZGRyZXNzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gaW5zbl93b3JkICYgMHgwMDAwRkZGRjsKLSAgICAgIC8qIEdldCB0aGUgb3BlcmFuZHMgZm9yIHRoZSBEQiBpbnN0cnVjdGlvbnMuICovCi0gICAgICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDIpCi0JewotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKCgoaW5zbl93b3JkICYgMHgwMUMwMDAwMCkgPj4gMjIpICsgUkVHX0FSMCwgb3BlcmFuZFswXSk7Ci0JICBpZiAoaW5zbl93b3JkICYgUENSZWwpCi0JICAgIHsKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kWzFdLCAiJWQiLCAoc2hvcnQpIGFkZHJlc3MpOwotCSAgICAgIHByaW50X2xhYmVsID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoaW5zbl93b3JkICYgMHgwMDAwMDAxRiwgb3BlcmFuZFsxXSk7Ci0JfQotICAgICAgLyogR2V0IHRoZSBvcGVyYW5kcyBmb3IgdGhlIHN0YW5kYXJkIGJyYW5jaGVzLiAqLwotICAgICAgZWxzZSBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDEpCi0JewotCSAgaWYgKGluc25fd29yZCAmIFBDUmVsKQotCSAgICB7Ci0JICAgICAgYWRkcmVzcyA9IChzaG9ydCkgYWRkcmVzczsKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiJWxkIiwgYWRkcmVzcyk7Ci0JICAgICAgcHJpbnRfbGFiZWwgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kIChpbnNuX3dvcmQgJiAweDAwMDAwMDFGLCBvcGVyYW5kWzBdKTsKLQl9Ci0gICAgfQotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzJWMlcyIsIGluc24tPnRtLT5uYW1lLAotCQkgICAgICBvcGVyYW5kWzBdWzBdID8gb3BlcmFuZFswXSA6ICIiLAotCQkgICAgICBvcGVyYW5kWzFdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzFdWzBdID8gb3BlcmFuZFsxXSA6ICIiKTsKLSAgLyogUHJpbnQgZGVzdGluYXRpb24gb2YgYnJhbmNoIGluIHJlbGF0aW9uIHRvIGN1cnJlbnQgc3ltYm9sLiAqLwotICBpZiAocHJpbnRfbGFiZWwgJiYgaW5mby0+c3ltYm9scykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW0gPSAqaW5mby0+c3ltYm9sczsKLQotICAgICAgaWYgKChpbnNuLT50bS0+b3Bjb2RlX21vZGlmaWVyID09IFBDUmVsKSAmJiAoaW5zbl93b3JkICYgUENSZWwpKQotCXsKLQkgIGFkZHJlc3MgPSAoX3BjICsgMSArIChzaG9ydCkgYWRkcmVzcykgLSAoKHN5bS0+c2VjdGlvbi0+dm1hICsgc3ltLT52YWx1ZSkgLyA0KTsKLQkgIC8qIENoZWNrIGZvciBkZWxheWVkIGluc3RydWN0aW9uLCBpZiBzbyBhZGp1c3QgZGVzdGluYXRpb24uICovCi0JICBpZiAoaW5zbl93b3JkICYgMHgwMDIwMDAwMCkKLQkgICAgYWRkcmVzcyArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhZGRyZXNzIC09ICgoc3ltLT5zZWN0aW9uLT52bWEgKyBzeW0tPnZhbHVlKSAvIDQpOwotCX0KLSAgICAgIGlmIChhZGRyZXNzID09IDApCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgPCVzPiIsIHN5bS0+bmFtZSk7Ci0gICAgICBlbHNlCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgPCVzICVjICVkPiIsIHN5bS0+bmFtZSwKLQkJCSAgICAoKHNob3J0KSBhZGRyZXNzIDwgMCkgPyAnLScgOiAnKycsCi0JCQkgICAgYWJzIChhZGRyZXNzKSk7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1nZXRfaW5kaXJlY3Rfb3BlcmFuZCAoZnJhZ21lbnQsIHNpemUsIGJ1ZmZlcikKLSAgICAgdW5zaWduZWQgc2hvcnQgZnJhZ21lbnQ7Ci0gICAgIGludCBzaXplOwotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbW9kOwotICB1bnNpZ25lZCBhcm51bTsKLSAgdW5zaWduZWQgY2hhciBkaXNwOwotCi0gIGlmIChidWZmZXIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgLyogRGV0ZXJtaW5lIHdoaWNoIGJpdHMgaWRlbnRpZnkgdGhlIHNlY3Rpb25zIG9mIHRoZSBpbmRpcmVjdCBvcGVyYW5kIGJhc2VkIG9uIHRoZQotICAgICBzaXplIGluIGJ5dGVzLiAqLwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIG1vZCA9IChmcmFnbWVudCAmIDB4MDBGOCkgPj4gMzsKLSAgICAgIGFybnVtID0gKGZyYWdtZW50ICYgMHgwMDA3KTsKLSAgICAgIGRpc3AgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbW9kID0gKGZyYWdtZW50ICYgMHhGODAwKSA+PiAxMTsKLSAgICAgIGFybnVtID0gKGZyYWdtZW50ICYgMHgwNzAwKSA+PiA4OwotICAgICAgZGlzcCA9IChmcmFnbWVudCAmIDB4MDBGRik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB7Ci0gICAgY29uc3QgaW5kX2FkZHJfdHlwZSAqY3VycmVudF9pbmQgPSB0aWMzMF9pbmRhZGRyX3RhYjsKLSAgICBmb3IgKDsgY3VycmVudF9pbmQgPCB0aWMzMF9pbmRhZGRydGFiX2VuZDsgY3VycmVudF9pbmQrKykKLSAgICAgIHsKLQlpZiAoY3VycmVudF9pbmQtPm1vZGZpZWxkID09IG1vZCkKLQkgIHsKLQkgICAgaWYgKGN1cnJlbnRfaW5kLT5kaXNwbGFjZW1lbnQgPT0gSU1QTElFRF9ESVNQICYmIHNpemUgPT0gMikKLQkgICAgICB7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc2l6ZV90IGksIGxlbjsKLQkJaW50IGJ1ZmNudDsKLQkJCi0JCWxlbiA9IHN0cmxlbiAoY3VycmVudF9pbmQtPnN5bnRheCk7Ci0JCWZvciAoaSA9IDAsIGJ1ZmNudCA9IDA7IGkgPCBsZW47IGkrKywgYnVmY250KyspCi0JCSAgewotCQkgICAgYnVmZmVyW2J1ZmNudF0gPSBjdXJyZW50X2luZC0+c3ludGF4W2ldOwotCQkgICAgaWYgKGJ1ZmZlcltidWZjbnQgLSAxXSA9PSAnYScgJiYgYnVmZmVyW2J1ZmNudF0gPT0gJ3InKQotCQkgICAgICBidWZmZXJbKytidWZjbnRdID0gYXJudW0gKyAnMCc7Ci0JCSAgICBpZiAoYnVmZmVyW2J1ZmNudF0gPT0gJygnICYmIGN1cnJlbnRfaW5kLT5kaXNwbGFjZW1lbnQgPT0gRElTUF9SRVFVSVJFRCkKLQkJICAgICAgewotCQkJc3ByaW50ZiAoJmJ1ZmZlcltidWZjbnQgKyAxXSwgIiV1IiwgZGlzcCk7Ci0JCQlidWZjbnQgKz0gc3RybGVuICgmYnVmZmVyW2J1ZmNudCArIDFdKTsKLQkJICAgICAgfQotCQkgIH0KLQkJYnVmZmVyW2J1ZmNudCArIDFdID0gJ1wwJzsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLWdldF9yZWdpc3Rlcl9vcGVyYW5kIChmcmFnbWVudCwgYnVmZmVyKQotICAgICB1bnNpZ25lZCBjaGFyIGZyYWdtZW50OwotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gIGNvbnN0IHJlZyAqY3VycmVudF9yZWcgPSB0aWMzMF9yZWd0YWI7Ci0KLSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBmb3IgKDsgY3VycmVudF9yZWcgPCB0aWMzMF9yZWd0YWJfZW5kOyBjdXJyZW50X3JlZysrKQotICAgIHsKLSAgICAgIGlmICgoZnJhZ21lbnQgJiAweDFGKSA9PSBjdXJyZW50X3JlZy0+b3Bjb2RlKQotCXsKLQkgIHN0cmNweSAoYnVmZmVyLCBjdXJyZW50X3JlZy0+bmFtZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1jbnZ0X3Rtc2Zsb2F0X2llZWUgKHRtc2Zsb2F0LCBzaXplLCBpZWVlZmxvYXQpCi0gICAgIHVuc2lnbmVkIGxvbmcgdG1zZmxvYXQ7Ci0gICAgIGludCBzaXplOwotICAgICBmbG9hdCAqaWVlZWZsb2F0OwotewotICB1bnNpZ25lZCBsb25nIGV4cCwgc2lnbiwgbWFudDsKLQotICBpZiAoc2l6ZSA9PSAyKQotICAgIHsKLSAgICAgIGlmICgodG1zZmxvYXQgJiAweDAwMDBGMDAwKSA9PSAweDAwMDA4MDAwKQotCXRtc2Zsb2F0ID0gMHg4MDAwMDAwMDsKLSAgICAgIGVsc2UKLQl7Ci0JICB0bXNmbG9hdCA8PD0gMTY7Ci0JICB0bXNmbG9hdCA9IChsb25nKSB0bXNmbG9hdCA+PiA0OwotCX0KLSAgICB9Ci0gIGV4cCA9IHRtc2Zsb2F0ICYgMHhGRjAwMDAwMDsKLSAgaWYgKGV4cCA9PSAweDgwMDAwMDAwKQotICAgIHsKLSAgICAgICppZWVlZmxvYXQgPSAwLjA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cCArPSAweDdGMDAwMDAwOwotICBzaWduID0gKHRtc2Zsb2F0ICYgMHgwMDgwMDAwMCkgPDwgODsKLSAgbWFudCA9IHRtc2Zsb2F0ICYgMHgwMDdGRkZGRjsKLSAgaWYgKGV4cCA9PSAweEZGMDAwMDAwKQotICAgIHsKLSAgICAgIGlmIChtYW50ID09IDApCi0JKmllZWVmbG9hdCA9IEVSQU5HRTsKLSAgICAgIGlmIChzaWduID09IDApCi0JKmllZWVmbG9hdCA9IDEuMCAvIDAuMDsKLSAgICAgIGVsc2UKLQkqaWVlZWZsb2F0ID0gLTEuMCAvIDAuMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwID4+PSAxOwotICBpZiAoc2lnbikKLSAgICB7Ci0gICAgICBtYW50ID0gKH5tYW50KSAmIDB4MDA3RkZGRkY7Ci0gICAgICBtYW50ICs9IDE7Ci0gICAgICBleHAgKz0gbWFudCAmIDB4MDA4MDAwMDA7Ci0gICAgICBleHAgJj0gMHg3RjgwMDAwMDsKLSAgICAgIG1hbnQgJj0gMHgwMDdGRkZGRjsKLSAgICB9Ci0gIGlmICh0bXNmbG9hdCA9PSAweDgwMDAwMDAwKQotICAgIHNpZ24gPSBtYW50ID0gZXhwID0gMDsKLSAgdG1zZmxvYXQgPSBzaWduIHwgZXhwIHwgbWFudDsKLSAgKmllZWVmbG9hdCA9ICooKGZsb2F0ICopICZ0bXNmbG9hdCk7Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWM4MC1kaXMuYyBiL29wY29kZXMvdGljODAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNmJjMTIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy90aWM4MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKiBQcmludCBUSSBUTVMzMjBDODAgKE1WUCkgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS90aWM4MC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotc3RhdGljIGludCBsZW5ndGg7Ci0KLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfYml0bnVtIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZF9jb250cm9sX3JlZ2lzdGVyIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfZmxvYXQgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmQgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJCQkgICBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50IHByaW50X29uZV9pbnN0cnVjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKikpOwotc3RhdGljIGludCBwcmludF9pbnN0cnVjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLCB1bnNpZ25lZCBsb25nLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKikpOwotc3RhdGljIGludCBmaWxsX2luc3RydWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF92bWEsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nICopKTsKLQotDAotLyogUHJpbnQgYW4gaW50ZWdlciBvcGVyYW5kLiAgVHJ5IHRvIGJlIHNvbWV3aGF0IHNtYXJ0IGFib3V0IHRoZQotICAgZm9ybWF0IGJ5IGFzc3VtaW5nIHRoYXQgc21hbGwgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW50ZWdlcnMgYXJlCi0gICBwcm9iYWJseSBsb29wIGluY3JlbWVudCB2YWx1ZXMsIHN0cnVjdHVyZSBvZmZzZXRzLCBvciBzaW1pbGFyCi0gICB2YWx1ZXMgdGhhdCBhcmUgbW9yZSBtZWFuaW5nZnVsIHByaW50ZWQgYXMgc2lnbmVkIGRlY2ltYWwgdmFsdWVzLgotICAgTGFyZ2VyIG51bWJlcnMgYXJlIHByb2JhYmx5IGJldHRlciBwcmludGVkIGFzIGhleCB2YWx1ZXMuICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2ludGVnZXIgKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgaWYgKCh2YWx1ZSA+IDk5OTkgfHwgdmFsdWUgPCAtOTk5OSkpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJSNseCIsIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gICAgfQotfQotCi0MCi0vKiBGSVhNRTogZGVwZW5kcyB1cG9uIHNpemVvZiAobG9uZykgPT0gc2l6ZW9mIChmbG9hdCkgYW5kCi0gICBhbHNvIHVwb24gaG9zdCBmbG9hdGluZyBwb2ludCBmb3JtYXQgbWF0Y2hpbmcgdGFyZ2V0Ci0gICBmbG9hdGluZyBwb2ludCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2Zsb2F0IChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIHVuaW9uIHsgZmxvYXQgZjsgbG9uZyBsOyB9IGZ2YWw7Ci0KLSAgZnZhbC5sID0gdmFsdWU7Ci0gICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVnIiwgZnZhbC5mKTsKLX0KLQotDAotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICBjb25zdCBjaGFyICp0bXA7Ci0KLSAgdG1wID0gdGljODBfdmFsdWVfdG9fc3ltYm9sICh2YWx1ZSwgVElDODBfT1BFUkFORF9DUik7Ci0gIGlmICh0bXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlcyIsIHRtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJSNseCIsIHZhbHVlKTsKLSAgICB9Ci19Ci0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnRtcDsKLQotICB0bXAgPSB0aWM4MF92YWx1ZV90b19zeW1ib2wgKHZhbHVlLCBUSUM4MF9PUEVSQU5EX0NDKTsKLSAgaWYgKHRtcCAhPSBOVUxMKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVzIiwgdG1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9iaXRudW0gKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgaW50IGJpdG51bTsKLSAgY29uc3QgY2hhciAqdG1wOwotCi0gIGJpdG51bSA9IH52YWx1ZSAmIDB4MUY7Ci0gIHRtcCA9IHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAoYml0bnVtLCBUSUM4MF9PUEVSQU5EX0JJVE5VTSk7Ci0gIGlmICh0bXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlcyIsIHRtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgYml0bnVtKTsKLSAgICB9Ci19Ci0KLQwKLS8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBmbGFncy4gICovCi0KLSNkZWZpbmUgTV9TSShpbnNuLG9wKSAoKCgob3ApIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9NX1NJKSAhPSAwKSAmJiAoKGluc24pICYgKDEgPDwgMTcpKSkKLSNkZWZpbmUgTV9MSShpbnNuLG9wKSAoKCgob3ApIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9NX0xJKSAhPSAwKSAmJiAoKGluc24pICYgKDEgPDwgMTUpKSkKLSNkZWZpbmUgUl9TQ0FMRUQoaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSAhPSAwKSAmJiAoKGluc24pICYgKDEgPDwgMTEpKSkKLQotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmQgKGluZm8sIHZhbHVlLCBpbnNuLCBvcGVyYW5kLCBtZW1hZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotewotICBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0dQUikgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICJyJWxkIiwgdmFsdWUpOwotICAgICAgaWYgKE1fU0kgKGluc24sIG9wZXJhbmQpIHx8IE1fTEkgKGluc24sIG9wZXJhbmQpKQotCXsKLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIjptIik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZQQSkgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICJhJWxkIiwgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKSAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBwcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgNCAqIHZhbHVlLCBpbmZvKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9CQVNFUkVMKSAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBwcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQklUTlVNKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfYml0bnVtIChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQ0MpICE9IDApCi0gICAgewotICAgICAgcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSAoaW5mbywgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NSKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciAoaW5mbywgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZMT0FUKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfZmxvYXQgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9CSVRGSUVMRCkpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJSNseCIsIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2ludGVnZXIgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHNjYWxlZCBvcGVyYW5kLCB0aGVuIHByaW50IHRoZSBtb2RpZmllciAqLwotCi0gIGlmIChSX1NDQUxFRCAoaW5zbiwgb3BlcmFuZCkpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiOnMiKTsKLSAgICB9Ci19Ci0KLQwKLS8qIFdlIGhhdmUgY2hvc2VuIGFuIG9wY29kZSB0YWJsZSBlbnRyeSAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9vbmVfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIG9wY29kZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci17Ci0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kICpvcGVyYW5kOwotICBsb25nIHZhbHVlOwotICBpbnQgc3RhdHVzOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4OwotICBpbnQgY2xvc2VfcGFyZW47Ci0KLSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJS0xMHMiLCBvcGNvZGUgLT4gbmFtZSk7Ci0KLSAgZm9yIChvcGluZGV4ID0gb3Bjb2RlIC0+IG9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0gICAgewotICAgICAgb3BlcmFuZCA9IHRpYzgwX29wZXJhbmRzICsgKm9waW5kZXg7Ci0KLSAgICAgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmIChvcGVyYW5kIC0+IGV4dHJhY3QpCi0JewotCSAgdmFsdWUgPSAoKm9wZXJhbmQgLT4gZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3BlcmFuZCAtPiBiaXRzID09IDMyKQotCXsKLQkgIHN0YXR1cyA9IGZpbGxfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsICh1bnNpZ25lZCBsb25nICopICZ2YWx1ZSk7Ci0JICBpZiAoc3RhdHVzID09IC0xKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIChzdGF0dXMpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZCAtPiBzaGlmdCkgJiAoKDEgPDwgb3BlcmFuZCAtPiBiaXRzKSAtIDEpOwotCSAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZCAtPiBiaXRzIC0gMSkpKSAhPSAwKQotCSAgICB7Ci0JICAgICAgdmFsdWUgLT0gMSA8PCBvcGVyYW5kIC0+IGJpdHM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBpcyBlbmNsb3NlZCBpbiBwYXJlbnRoZXNpcywgdGhlbiBwcmludAotCSB0aGUgb3BlbiBwYXJlbiwgb3RoZXJ3aXNlIGp1c3QgcHJpbnQgdGhlIHJlZ3VsYXIgY29tbWEKLQkgc2VwYXJhdG9yLCBleGNlcHQgZm9yIHRoZSBmaXJzdCBvcGVyYW5kLiAqLwotCi0gICAgICBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BBUkVOUykgPT0gMCkKLQl7Ci0JICBjbG9zZV9wYXJlbiA9IDA7Ci0JICBpZiAob3BpbmRleCAhPSBvcGNvZGUgLT4gb3BlcmFuZHMpCi0JICAgIHsKLQkgICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIsIik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2xvc2VfcGFyZW4gPSAxOwotCSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiKCIpOwotCX0KLQotICAgICAgcHJpbnRfb3BlcmFuZCAoaW5mbywgdmFsdWUsIGluc24sIG9wZXJhbmQsIG1lbWFkZHIpOwotCi0gICAgICAvKiBJZiB3ZSBwcmludGVkIGFuIG9wZW4gcGFyZW4gYmVmb3JlIHByaW50aW5nIHRoaXMgb3BlcmFuZCwgY2xvc2UKLQkgaXQgbm93LiBUaGUgZmxhZyBnZXRzIHJlc2V0IG9uIGVhY2ggbG9vcC4gKi8KLQotICAgICAgaWYgKGNsb3NlX3BhcmVuKQotCXsKLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIikiKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGxlbmd0aCk7Ci19Ci0KLQwKLQotLyogVGhlcmUgYXJlIG5vIHNwZWNpZmljIGJpdHMgdGhhdCB0ZWxsIHVzIGZvciBjZXJ0YWluIHdoZXRoZXIgYSB2ZWN0b3IKLSAgIGluc3RydWN0aW9uIG9wY29kZSBjb250YWlucyBvbmUgb3IgdHdvIGluc3RydWN0aW9ucy4gIEhvd2V2ZXIgc2luY2UKLSAgIGEgZGVzdGluYXRpb24gcmVnaXN0ZXIgb2YgcjAgaXMgaWxsZWdhbCwgd2UgY2FuIGNoZWNrIGZvciBub256ZXJvCi0gICB2YWx1ZXMgaW4gYm90aCBkZXN0aW5hdGlvbiByZWdpc3RlciBmaWVsZHMuICBPbmx5IG9wY29kZXMgdGhhdCBoYXZlCi0gICB0d28gdmFsaWQgaW5zdHJ1Y3Rpb25zIHdpbGwgaGF2ZSBub24temVybyBpbiBib3RoICovCi0KLSNkZWZpbmUgVFdPX0lOU04oaW5zbikgKCgoKGluc24pICYgKDB4MUYgPDwgMjcpKSAhPSAwKSAmJiAoKChpbnNuKSAmICgweDFGIDw8IDIyKSkgIT0gMCkpCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCB2ZWNfb3Bjb2RlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKnZlY19vcGNvZGU7Ci17Ci0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlX2VuZDsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBvcGNvZGUgbWF0Y2ggaW4gdGhlIG9wY29kZXMgdGFibGUuICBGb3IgdmVjdG9yCi0gICAgIG9wY29kZXMgKHZlY19vcGNvZGUgIT0gTlVMTCkgZmluZCB0aGUgZmlyc3QgbWF0Y2ggdGhhdCBpcyBub3QgdGhlCi0gICAgIHByZXZpb3VzbHkgZm91bmQgbWF0Y2guICBGSVhNRTogdGhlcmUgc2hvdWxkIGJlIGZhc3RlciB3YXlzIHRvCi0gICAgIHNlYXJjaCAoaGFzaCB0YWJsZSBvciBiaW5hcnkgc2VhcmNoKSwgYnV0IGRvbid0IHdvcnJ5IHRvbyBtdWNoCi0gICAgIGFib3V0IGl0IHVudGlsIG90aGVyIFRJYzgwIHN1cHBvcnQgaXMgZmluaXNoZWQuICovCi0KLSAgb3Bjb2RlX2VuZCA9IHRpYzgwX29wY29kZXMgKyB0aWM4MF9udW1fb3Bjb2RlczsKLSAgZm9yIChvcGNvZGUgPSB0aWM4MF9vcGNvZGVzOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoKGluc24gJiBvcGNvZGUgLT4gbWFzaykgPT0gb3Bjb2RlIC0+IG9wY29kZSAmJgotCSAgb3Bjb2RlICE9IHZlY19vcGNvZGUpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAob3Bjb2RlID09IG9wY29kZV9lbmQpCi0gICAgewotICAgICAgLyogTm8gbWF0Y2ggZm91bmQsIGp1c3QgcHJpbnQgdGhlIGJpdHMgYXMgYSAud29yZCBkaXJlY3RpdmUgKi8KLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIi53b3JkICUjMDhseCIsIGluc24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE1hdGNoIGZvdW5kLCBkZWNvZGUgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGxlbmd0aCA9IHByaW50X29uZV9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgb3Bjb2RlKTsKLSAgICAgIGlmIChvcGNvZGUgLT4gZmxhZ3MgJiBUSUM4MF9WRUNUT1IgJiYgdmVjX29wY29kZSA9PSBOVUxMICYmIFRXT19JTlNOIChpbnNuKSkKLQl7Ci0JICAvKiBUaGVyZSBpcyBhbm90aGVyIGluc3RydWN0aW9uIHRvIHByaW50IGZyb20gdGhlIHNhbWUgb3Bjb2RlLgotCSAgICAgUHJpbnQgdGhlIHNlcGFyYXRvciBhbmQgdGhlbiBmaW5kIGFuZCBwcmludCB0aGUgb3RoZXIKLQkgICAgIGluc3RydWN0aW9uLiAqLwotCSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiICAgfHwgICAiKTsKLQkgIGxlbmd0aCA9IHByaW50X2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCBvcGNvZGUpOwotCX0KLSAgICB9Ci0gIHJldHVybiAobGVuZ3RoKTsKLX0KLQotLyogR2V0IHRoZSBuZXh0IDMyIGJpdCB3b3JkIGZyb20gdGhlIGluc3RydWN0aW9uIHN0cmVhbSBhbmQgY29udmVydCBpdAotICAgaW50byBpbnRlcm5hbCBmb3JtYXQgaW4gdGhlIHVuc2lnbmVkIGxvbmcgSU5TTiwgZm9yIHdoaWNoIHdlIGFyZQotICAgcGFzc2VkIHRoZSBhZGRyZXNzLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICovCi0KLXN0YXRpYyBpbnQKLWZpbGxfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc25wKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICB1bnNpZ25lZCBsb25nICppbnNucDsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIEdldCB0aGUgYml0cyBmb3IgdGhlIG5leHQgMzIgYml0IHdvcmQgYW5kIHB1dCBpbiBidWZmZXIgKi8KLQotICBzdGF0dXMgPSAoKmluZm8gLT4gcmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyBsZW5ndGgsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gbWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotCi0gIC8qIFJlYWQgd2FzIHN1Y2Nlc3NmdWwsIHNvIGluY3JlbWVudCBjb3VudCBvZiBieXRlcyByZWFkIGFuZCBjb252ZXJ0Ci0gICAgIHRoZSBiaXRzIGludG8gaW50ZXJuYWwgZm9ybWF0LiAqLwotICAgICAKLSAgbGVuZ3RoICs9IDQ7Ci0gIGlmIChpbmZvIC0+IGVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSAgICB7Ci0gICAgICAqaW5zbnAgPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5mbyAtPiBlbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0gICAgewotICAgICAgKmluc25wID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogU2hvdWxkIHByb2JhYmx5IGp1c3QgZGVmYXVsdCB0byBvbmUgb3IgdGhlIG90aGVyICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLQwKLWludCAKLXByaW50X2luc25fdGljODAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgaW50IHN0YXR1czsKLQotICBsZW5ndGggPSAwOwotICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7Ci0gIHN0YXR1cyA9IGZpbGxfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSAtMSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBwcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgTlVMTCk7Ci0gICAgfQotICByZXR1cm4gKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3RpYzgwLW9wYy5jIGIvb3Bjb2Rlcy90aWM4MC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1YzMwOC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3RpYzgwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNiArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKS4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHZhcmlvdXMgdGFibGVzIGZvciB0aGUgVE1TMzIwQzgwIChNVlApLgotCi0gICBUaGUgb3Bjb2RlIHRhYmxlIGlzIHN0cmljdGx5IGNvbnN0YW50IGRhdGEsIHNvIHRoZSBjb21waWxlciBzaG91bGQKLSAgIGJlIGFibGUgdG8gcHV0IGl0IGluIHRoZSAudGV4dCBzZWN0aW9uLgotCi0gICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQKLSAgIGluc2VydGluZyBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMKLSAgIGZpbGUuCi0KLSAgIFRoZSBwcmVkZWZpbmVkIHJlZ2lzdGVyIHRhYmxlIG1hcHMgZnJvbSByZWdpc3RlciBuYW1lcyB0byByZWdpc3RlcgotICAgdmFsdWVzLiAgKi8KLQotDAotLyogVGFibGUgb2YgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMsIHN1Y2ggYXMgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycywKLSAgIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgY29uZGl0aW9uIGNvZGVzLCBjb250cm9sIHJlZ2lzdGVycywgYW5kIGJpdAotICAgbnVtYmVycy4KLQotICAgVGhlIHRhYmxlIGlzIHNvcnRlZCBjYXNlIGluZGVwZW5kZW50bHkgYnkgbmFtZSBzbyB0aGF0IGl0IGlzIHN1aXRhYmxlIGZvcgotICAgc2VhcmNoaW5nIHZpYSBhIGJpbmFyeSBzZWFyY2ggdXNpbmcgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24KLSAgIGZ1bmN0aW9uLgotCi0gICBOb3RlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHN5bWJvbCBpcyBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YgdGhlIHZhbHVlCi0gICBmaWVsZCwgd2hpY2ggYWxsb3dzIHRoZSB2YWx1ZSBhbmQgdHlwZSB0byBiZSBwYXNzZWQgYXJvdW5kIGFzIGEgdW5pdCBpbiBhCi0gICBzaW5nbGUgaW50LiAgVGhlIHR5cGVzIGhhdmUgdG8gYmUgbWFza2VkIG9mZiBiZWZvcmUgdXNpbmcgdGhlIG51bWVyaWMKLSAgIHZhbHVlIGFzIGEgbnVtYmVyLgotKi8KLQotY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1tdID0KLXsKLSAgeyAiYTAiLAlUSUM4MF9PUEVSQU5EX0ZQQSB8IDAgfSwKLSAgeyAiYTEiLAlUSUM4MF9PUEVSQU5EX0ZQQSB8IDEgfSwKLSAgeyAiYWx3LmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNyB9LAotICB7ICJhbHcuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNSB9LAotICB7ICJhbHcudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMyB9LAotICB7ICJBTkFTVEFUIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzQgfSwKLSAgeyAiQlJLMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDM5IH0sCi0gIHsgIkJSSzIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzQSB9LAotICB7ICJDT05GSUciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMiB9LAotICB7ICJETFJVIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NTAwIH0sCi0gIHsgIkRUQUcwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwIH0sCi0gIHsgIkRUQUcxIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAxIH0sCi0gIHsgIkRUQUcxMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwQSB9LAotICB7ICJEVEFHMTEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEIgfSwKLSAgeyAiRFRBRzEyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBDIH0sCi0gIHsgIkRUQUcxMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwRCB9LAotICB7ICJEVEFHMTQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEUgfSwKLSAgeyAiRFRBRzE1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBGIH0sCi0gIHsgIkRUQUcyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAyIH0sCi0gIHsgIkRUQUczIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAzIH0sCi0gIHsgIkRUQUc0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA0IH0sCi0gIHsgIkRUQUc1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA1IH0sCi0gIHsgIkRUQUc2IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA2IH0sCi0gIHsgIkRUQUc3IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA3IH0sCi0gIHsgIkRUQUc4IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA4IH0sCi0gIHsgIkRUQUc5IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA5IH0sCi0gIHsgIkVDT01DTlRMIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzMgfSwKLSAgeyAiRUlQIiwJVElDODBfT1BFUkFORF9DUiB8IDEgfSwKLSAgeyAiRVBDIiwJVElDODBfT1BFUkFORF9DUiB8IDAgfSwKLSAgeyAiZXEuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDAgfSwKLSAgeyAiZXEuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIwIH0sCi0gIHsgImVxLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMCB9LAotICB7ICJlcS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjAgfSwKLSAgeyAiZXEwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMiB9LAotICB7ICJlcTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMCB9LAotICB7ICJlcTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxOCB9LAotICB7ICJGTFRBRFIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMSB9LAotICB7ICJGTFREVEgiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxNCB9LAotICB7ICJGTFREVEwiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMyB9LAotICB7ICJGTFRPUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDEwIH0sCi0gIHsgIkZMVFRBRyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDEyIH0sCi0gIHsgIkZQU1QiLAlUSUM4MF9PUEVSQU5EX0NSIHwgOCB9LAotICB7ICJnZS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNSB9LAotICB7ICJnZS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjUgfSwKLSAgeyAiZ2UuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE1IH0sCi0gIHsgImdlLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNSB9LAotICB7ICJnZTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAzIH0sCi0gIHsgImdlMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDExIH0sCi0gIHsgImdlMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDE5IH0sCi0gIHsgImd0LmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyIH0sCi0gIHsgImd0LmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMiB9LAotICB7ICJndC5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTIgfSwKLSAgeyAiZ3QudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIyIH0sCi0gIHsgImd0MC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDEgfSwKLSAgeyAiZ3QwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgOSB9LAotICB7ICJndDAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNyB9LAotICB7ICJoaS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNiB9LAotICB7ICJoaS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTYgfSwKLSAgeyAiaGkudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI2IH0sCi0gIHsgImhzLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA5IH0sCi0gIHsgImhzLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxOSB9LAotICB7ICJocy53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjkgfSwKLSAgeyAiaWIuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI4IH0sCi0gIHsgIklFIiwJVElDODBfT1BFUkFORF9DUiB8IDYgfSwKLSAgeyAiSUxSVSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMwMCB9LAotICB7ICJpbi5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjcgfSwKLSAgeyAiSU4wUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMDAgfSwKLSAgeyAiSU4xUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMDEgfSwKLSAgeyAiSU5UUEVOIiwJVElDODBfT1BFUkFORF9DUiB8IDQgfSwKLSAgeyAiSVRBRzAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDAgfSwKLSAgeyAiSVRBRzEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDEgfSwKLSAgeyAiSVRBRzEwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBBIH0sCi0gIHsgIklUQUcxMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwQiB9LAotICB7ICJJVEFHMTIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEMgfSwKLSAgeyAiSVRBRzEzIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBEIH0sCi0gIHsgIklUQUcxNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwRSB9LAotICB7ICJJVEFHMTUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEYgfSwKLSAgeyAiSVRBRzIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDIgfSwKLSAgeyAiSVRBRzMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDMgfSwKLSAgeyAiSVRBRzQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDQgfSwKLSAgeyAiSVRBRzUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDUgfSwKLSAgeyAiSVRBRzYiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDYgfSwKLSAgeyAiSVRBRzciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDcgfSwKLSAgeyAiSVRBRzgiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDggfSwKLSAgeyAiSVRBRzkiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDkgfSwKLSAgeyAibGUuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDMgfSwKLSAgeyAibGUuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIzIH0sCi0gIHsgImxlLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMyB9LAotICB7ICJsZS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjMgfSwKLSAgeyAibGUwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNiB9LAotICB7ICJsZTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNCB9LAotICB7ICJsZTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMiB9LAotICB7ICJsby5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgOCB9LAotICB7ICJsby5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTggfSwKLSAgeyAibG8udyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI4IH0sCi0gIHsgImxzLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA3IH0sCi0gIHsgImxzLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNyB9LAotICB7ICJscy53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjcgfSwKLSAgeyAibHQuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDQgfSwKLSAgeyAibHQuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI0IH0sCi0gIHsgImx0LmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNCB9LAotICB7ICJsdC53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjQgfSwKLSAgeyAibHQwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNCB9LAotICB7ICJsdDAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMiB9LAotICB7ICJsdDAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMCB9LAotICB7ICJNSVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMSB9LAotICB7ICJNUEMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMCB9LAotICB7ICJuZS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMSB9LAotICB7ICJuZS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjEgfSwKLSAgeyAibmUuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDExIH0sCi0gIHsgIm5lLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMSB9LAotICB7ICJuZTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA1IH0sCi0gIHsgIm5lMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDEzIH0sCi0gIHsgIm5lMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDIxIH0sCi0gIHsgIm5ldi5iIiwJVElDODBfT1BFUkFORF9DQyB8IDAgfSwKLSAgeyAibmV2LmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgOCB9LAotICB7ICJuZXYudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNiB9LAotICB7ICJvYi5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjkgfSwKLSAgeyAib3IuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDMxIH0sCi0gIHsgIm91LmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNiB9LAotICB7ICJPVVRQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwMiB9LAotICB7ICJQS1RSRVEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhEIH0sCi0gIHsgIlBQRVJST1IiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhBIH0sCi0gIHsgInIwIiwJVElDODBfT1BFUkFORF9HUFIgfCAwIH0sCi0gIHsgInIxIiwJVElDODBfT1BFUkFORF9HUFIgfCAxIH0sCi0gIHsgInIxMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTAgfSwKLSAgeyAicjExIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMSB9LAotICB7ICJyMTIiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEyIH0sCi0gIHsgInIxMyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTMgfSwKLSAgeyAicjE0IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNCB9LAotICB7ICJyMTUiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE1IH0sCi0gIHsgInIxNiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTYgfSwKLSAgeyAicjE3IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNyB9LAotICB7ICJyMTgiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE4IH0sCi0gIHsgInIxOSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTkgfSwKLSAgeyAicjIiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIgfSwKLSAgeyAicjIwIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMCB9LAotICB7ICJyMjEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIxIH0sCi0gIHsgInIyMiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjIgfSwKLSAgeyAicjIzIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMyB9LAotICB7ICJyMjQiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI0IH0sCi0gIHsgInIyNSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjUgfSwKLSAgeyAicjI2IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNiB9LAotICB7ICJyMjciLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI3IH0sCi0gIHsgInIyOCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjggfSwKLSAgeyAicjI5IiwJVElDODBfT1BFUkFORF9HUFIgfCAyOSB9LAotICB7ICJyMyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMyB9LAotICB7ICJyMzAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDMwIH0sCi0gIHsgInIzMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMzEgfSwKLSAgeyAicjQiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDQgfSwKLSAgeyAicjUiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDUgfSwKLSAgeyAicjYiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDYgfSwKLSAgeyAicjciLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDcgfSwKLSAgeyAicjgiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDggfSwKLSAgeyAicjkiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDkgfSwKLSAgeyAiU1lTU1RLIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAgfSwKLSAgeyAiU1lTVE1QIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjEgfSwKLSAgeyAiVENPVU5UIiwJVElDODBfT1BFUkFORF9DUiB8IDB4RSB9LAotICB7ICJUU0NBTEUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhGIH0sCi0gIHsgInVvLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAzMCB9LAotfTsKLQotY29uc3QgaW50IHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMgPSBzaXplb2YgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scykgLyBzaXplb2YgKHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lIGluIE5BTUUsIHN5bWJvbCBjbGFzcwotICAgaW4gQ0xBU1MsIGFuZCB0cmFuc2xhdGVzIGl0IHRvIGEgbnVtZXJpYyB2YWx1ZSwgd2hpY2ggaXQgcmV0dXJucy4KLQotICAgSWYgQ0xBU1MgaXMgemVybywgYW55IHN5bWJvbCB0aGF0IG1hdGNoZXMgTkFNRSBpcyB0cmFuc2xhdGVkLiAgSWYKLSAgIENMQVNTIGlzIG5vbi16ZXJvLCB0aGVuIG9ubHkgYSBzeW1ib2wgdGhhdCBoYXMgY2xhc3MgQ0xBU1MgaXMKLSAgIG1hdGNoZWQuCi0KLSAgIElmIG5vIHRyYW5zbGF0aW9uIGlzIHBvc3NpYmxlLCBpdCByZXR1cm5zIC0xLCBhIHZhbHVlIG5vdCB1c2VkIGJ5Ci0gICBhbnkgcHJlZGVmaW5lZCBzeW1ib2wuIE5vdGUgdGhhdCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgYXJyYXkgaXMKLSAgIHByZXNvcnRlZCBjYXNlIGluZGVwZW5kZW50bHkgYnkgbmFtZS4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlcmUgYXJlIG5vCi0gICBkdXBsaWNhdGUgbmFtZXMgaW4gdGhlIHByZWRlZmluZWQgc3ltYm9sIGFycmF5LCB3aGljaCBoYXBwZW5zIHRvIGJlCi0gICB0cnVlIGF0IHRoZSBtb21lbnQuCi0KLSAqLwotCi1pbnQKLXRpYzgwX3N5bWJvbF90b192YWx1ZSAobmFtZSwgY2xhc3MpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBjbGFzczsKLXsKLSAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotICBpbnQgbG93ID0gMDsKLSAgaW50IG1pZGRsZTsKLSAgaW50IGhpZ2ggPSB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzIC0gMTsKLSAgaW50IGNtcDsKLSAgaW50IHJ0bnZhbCA9IC0xOwotCi0gIHdoaWxlIChsb3cgPD0gaGlnaCkKLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQl7Ci0JICBoaWdoID0gbWlkZGxlIC0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCXsKLQkgIGxvdyA9IG1pZGRsZSArIDE7Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICBwZHNwID0gJnRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1ttaWRkbGVdOwotCSAgaWYgKChjbGFzcyA9PSAwKSB8fCAoY2xhc3MgJiBQRFNfVkFMVUUgKHBkc3ApKSkKLQkgICAgewotCSAgICAgIHJ0bnZhbCA9IFBEU19WQUxVRSAocGRzcCk7Ci0JICAgIH0KLQkgIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBuYW1lcyAqLwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChydG52YWwpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgdmFsdWUgVkFMIGFuZCBmaW5kcyBhIG1hdGNoaW5nIHByZWRlZmluZWQKLSAgIHN5bWJvbCB0aGF0IGlzIGluIHRoZSBvcGVyYW5kIGNsYXNzIHNwZWNpZmllZCBieSBDTEFTUy4gIElmIENMQVNTCi0gICBpcyB6ZXJvLCB0aGUgZmlyc3QgbWF0Y2hpbmcgc3ltYm9sIGlzIHJldHVybmVkLiAqLwotCi1jb25zdCBjaGFyICoKLXRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAodmFsLCBjbGFzcykKLSAgICAgaW50IHZhbDsKLSAgICAgaW50IGNsYXNzOwotewotICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7Ci0gIGludCBpdmFsOwotICBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBOVUxMOwotICBmb3IgKHBkc3AgPSB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHM7Ci0gICAgICAgcGRzcCA8IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyArIHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHM7Ci0gICAgICAgcGRzcCsrKQotICAgIHsKLSAgICAgIGl2YWwgPSBQRFNfVkFMVUUgKHBkc3ApICYgflRJQzgwX09QRVJBTkRfTUFTSzsKLSAgICAgIGlmIChpdmFsID09IHZhbCkKLQl7Ci0JICBpZiAoKGNsYXNzID09IDApIHx8IChjbGFzcyAmIFBEU19WQUxVRSAocGRzcCkpKQotCSAgICB7Ci0JICAgICAgLyogRm91bmQgdGhlIGRlc2lyZWQgbWF0Y2ggKi8KLQkgICAgICBuYW1lID0gUERTX05BTUUgKHBkc3ApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIChuYW1lKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzeW1ib2wgaW4gdGhlIHByZWRlZmluZWQKLSAgIHN5bWJvbCB0YWJsZSBhZnRlciBQRFNQLCBvciBOVUxMIGlmIFBEU1AgcG9pbnRzIHRvIHRoZSBsYXN0IHN5bWJvbC4gIElmCi0gICBQRFNQIGlzIE5VTEwsIGl0IHJldHVybnMgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgdGFibGUuICBUaHVzIGl0IGNhbiBiZQotICAgdXNlZCB0byB3YWxrIHRocm91Z2ggdGhlIHRhYmxlIGJ5IGZpcnN0IGNhbGxpbmcgaXQgd2l0aCBOVUxMIGFuZCB0aGVuCi0gICBjYWxsaW5nIGl0IHdpdGggZWFjaCB2YWx1ZSBpdCByZXR1cm5lZCBvbiB0aGUgcHJldmlvdXMgY2FsbCwgdW50aWwgaXQKLSAgIHJldHVybnMgTlVMTC4gKi8KLQotY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICoKLXRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgKHBkc3ApCi0gICAgIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKLXsKLSAgaWYgKHBkc3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwZHNwID0gdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzOwotICAgIH0KLSAgZWxzZSBpZiAocGRzcCA+PSB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMgJiYKLQkgICBwZHNwIDwgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzICsgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyAtIDEpCi0gICAgewotICAgICAgcGRzcCsrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBkc3AgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIChwZHNwKTsKLX0KLQotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUuICBUaGUgZmllbGRzIGFyZToKLQotCWJpdHMsIHNoaWZ0LCBpbnNlcnRpb24gZnVuY3Rpb24sIGV4dHJhY3Rpb24gZnVuY3Rpb24sIGZsYWdzCi0gKi8KLQotY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgdGljODBfb3BlcmFuZHNbXSA9Ci17Ci0KLSAgLyogVGhlIHplcm8gaW5kZXggaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIG9wZXJhbmRzLiAgKi8KLQotI2RlZmluZSBVTlVTRUQgKDApCi0gIHsgMCwgMCwgMCwgMCwgMCB9LAotCi0gIC8qIFNob3J0IHNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgaW4gYml0cyAxNC0wLiAqLwotCi0jZGVmaW5lIFNTSSAoVU5VU0VEICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBTaG9ydCB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgaW4gYml0cyAxNC0wICovCi0KLSNkZWZpbmUgU1VJIChTU0kgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLSAgLyogU2hvcnQgdW5zaWduZWQgYml0ZmllbGQgaW4gYml0cyAxNC0wLiAgV2UgZGlzdGluZ3Vpc2ggdGhpcwotICAgICBmcm9tIGEgcmVndWxhciB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgb25seSBmb3IgdGhlIGNvbnZlbmllbmNlCi0gICAgIG9mIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHRoZSB1c2VyLiAqLwotCi0jZGVmaW5lIFNVQkYgKFNVSSArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQklURklFTEQgfSwKLQotICAvKiBMb25nIHNpZ25lZCBpbW1lZGlhdGUgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgTFNJIChTVUJGICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBMb25nIHVuc2lnbmVkIGltbWVkaWF0ZSBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBMVUkgKExTSSArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIDAgfSwKLQotICAvKiBMb25nIHVuc2lnbmVkIGJpdGZpZWxkIGluIGZvbGxvd2luZyAzMiBiaXQgd29yZC4gIFdlIGRpc3Rpbmd1aXNoCi0gICAgIHRoaXMgZnJvbSBhIHJlZ3VsYXIgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlIG9ubHkgZm9yIHRoZQotICAgICBjb252ZW5pZW5jZSBvZiB0aGUgZGlzYXNzZW1ibGVyIGFuZCB0aGUgdXNlci4gKi8KLQotI2RlZmluZSBMVUJGIChMVUkgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JJVEZJRUxEIH0sCi0KLSAgLyogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgaW4gZm9sbG93aW5nIDMyIGJpdAotICAgICB3b3JkLiAqLwotCi0jZGVmaW5lIFNQRkkgKExVQkYgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0ZMT0FUIH0sCi0KLSAgLyogUmVnaXN0ZXIgaW4gYml0cyA0LTAgKi8KLQotI2RlZmluZSBSRUdfMCAoU1BGSSArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfSwKLQotICAvKiBFdmVuIHJlZ2lzdGVyIGluIGJpdHMgNC0wICovCi0KLSNkZWZpbmUgUkVHXzBfRSAoUkVHXzAgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9FVkVOIH0sCi0KLSAgLyogUmVnaXN0ZXIgaW4gYml0cyAyNi0yMiAqLwotCi0jZGVmaW5lIFJFR18yMiAoUkVHXzBfRSArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogRXZlbiByZWdpc3RlciBpbiBiaXRzIDI2LTIyICovCi0KLSNkZWZpbmUgUkVHXzIyX0UgKFJFR18yMiArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9FVkVOIH0sCi0KLSAgLyogUmVnaXN0ZXIgaW4gYml0cyAzMS0yNyAqLwotCi0jZGVmaW5lIFJFR19ERVNUIChSRUdfMjJfRSArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogRXZlbiByZWdpc3RlciBpbiBiaXRzIDMxLTI3ICovCi0KLSNkZWZpbmUgUkVHX0RFU1RfRSAoUkVHX0RFU1QgKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRVZFTiB9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IGFjY3VtdWxhdG9yIHJlZ2lzdGVyIChhMC1hMykgc3BlY2lmaWVkIGJ5IGJpdCAxNiAoTVNCKQotICAgICBhbmQgYml0IDExIChMU0IpICovCi0gIC8qIEZJWE1FISAgTmVlZHMgdG8gdXNlIGZ1bmN0aW9ucyB0byBpbnNlcnQgYW5kIGV4dHJhY3QgdGhlIHJlZ2lzdGVyCi0gICAgIG51bWJlciBpbiBiaXRzIDE2IGFuZCAxMS4gKi8KLQotI2RlZmluZSBSRUdfRlBBIChSRUdfREVTVF9FICsgMSkKLSAgeyAwLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0ZQQSB9LAotCi0gIC8qIFNob3J0IHNpZ25lZCBQQyB3b3JkIG9mZnNldCBpbiBiaXRzIDE0LTAgKi8KLQotI2RlZmluZSBPRkZfU1NfUEMgKFJFR19GUEEgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1BDUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBMb25nIHNpZ25lZCBQQyB3b3JkIG9mZnNldCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBPRkZfU0xfUEMgKE9GRl9TU19QQyArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfUENSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFNob3J0IHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGJpdHMgMTQtMCAqLwotCi0jZGVmaW5lIE9GRl9TU19CUiAoT0ZGX1NMX1BDICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CQVNFUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBMb25nIHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIE9GRl9TTF9CUiAoT0ZGX1NTX0JSICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CQVNFUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBMb25nIHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGZvbGxvd2luZyAzMiBiaXQgd29yZAotICAgICB3aXRoIG9wdGlvbmFsICI6cyIgbW9kaWZpZXIgZmxhZyBpbiBiaXQgMTEgKi8KLQotI2RlZmluZSBPRkZfU0xfQlJfU0NBTEVEIChPRkZfU0xfQlIgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JBU0VSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB8IFRJQzgwX09QRVJBTkRfU0NBTEVEIH0sCi0KLSAgLyogQklUTlVNIGluIGJpdHMgMzEtMjcgKi8KLQotI2RlZmluZSBCSVROVU0gKE9GRl9TTF9CUl9TQ0FMRUQgKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JJVE5VTSB9LAotCi0gIC8qIENvbmRpdGlvbiBjb2RlIGluIGJpdHMgMzEtMjcgKi8KLQotI2RlZmluZSBDQyAoQklUTlVNICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9DQyB9LAotCi0gIC8qIENvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyIGluIGJpdHMgMTQtMCAqLwotCi0jZGVmaW5lIENSX1NJIChDQyArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQ1IgfSwKLQotICAvKiBDb250cm9sIHJlZ2lzdGVyIG51bWJlciBpbiBuZXh0IDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgQ1JfTEkgKENSX1NJICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9DUiB9LAotCi0gIC8qIEEgYmFzZSByZWdpc3RlciBpbiBiaXRzIDI2LTIyLCBlbmNsb3NlZCBpbiBwYXJlbnMgKi8KLQotI2RlZmluZSBSRUdfQkFTRSAoQ1JfTEkgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIH0sCi0KLSAgLyogQSBiYXNlIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIsIGVuY2xvc2VkIGluIHBhcmVucywgd2l0aCBvcHRpb25hbCAiOm0iCi0gICAgIGZsYWcgaW4gYml0IDE3IChzaG9ydCBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zIG9ubHkpICovCi0KLSNkZWZpbmUgUkVHX0JBU0VfTV9TSSAoUkVHX0JBU0UgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIHwgVElDODBfT1BFUkFORF9NX1NJIH0sCi0KLSAgLyogQSBiYXNlIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIsIGVuY2xvc2VkIGluIHBhcmVucywgd2l0aCBvcHRpb25hbCAiOm0iCi0gICBmbGFnIGluIGJpdCAxNSAobG9uZyBpbW1lZGlhdGUgYW5kIHJlZ2lzdGVyIGluc3RydWN0aW9ucyBvbmx5KSAqLwotCi0jZGVmaW5lIFJFR19CQVNFX01fTEkgKFJFR19CQVNFX01fU0kgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIHwgVElDODBfT1BFUkFORF9NX0xJIH0sCi0KLSAgLyogU2NhbGVkIHJlZ2lzdGVyIGluIGJpdHMgNC0wLCB3aXRoIG9wdGlvbmFsICI6cyIgbW9kaWZpZXIgZmxhZyBpbiBiaXQgMTEgKi8KLQotI2RlZmluZSBSRUdfU0NBTEVEIChSRUdfQkFTRV9NX0xJICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfU0NBTEVEIH0sCi0KLSAgLyogVW5zaWduZWQgaW1tZWRpYXRlIGluIGJpdHMgNC0wLCB1c2VkIG9ubHkgZm9yIHNoaWZ0IGluc3RydWN0aW9ucyAqLwotCi0jZGVmaW5lIFJPVEFURSAoUkVHX1NDQUxFRCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgMCB9LAotCi0gIC8qIFVuc2lnbmVkIGltbWVkaWF0ZSBpbiBiaXRzIDktNSwgdXNlZCBvbmx5IGZvciBzaGlmdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgRU5ETUFTSyAoUk9UQVRFICsgMSkKLSAgeyA1LCA1LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0VORE1BU0sgfSwKLQotfTsKLQotY29uc3QgaW50IHRpYzgwX251bV9vcGVyYW5kcyA9IHNpemVvZiAodGljODBfb3BlcmFuZHMpL3NpemVvZigqdGljODBfb3BlcmFuZHMpOwotCi0MCi0vKiBNYWNyb3MgdXNlZCB0byBnZW5lcmF0ZSBlbnRyaWVzIGZvciB0aGUgb3Bjb2RlcyB0YWJsZS4gKi8KLQotI2RlZmluZSBGSVhNRSAwCi0KLS8qIFNob3J0LUltbWVkaWF0ZSBGb3JtYXQgSW5zdHJ1Y3Rpb25zIC0gYmFzaWMgb3Bjb2RlICovCi0jZGVmaW5lIE9QX1NJKHgpCSgoKHgpICYgMHg3RikgPDwgMTUpCi0jZGVmaW5lIE1BU0tfU0kJCU9QX1NJKDB4N0YpCi0KLS8qIExvbmctSW1tZWRpYXRlIEZvcm1hdCBJbnN0cnVjdGlvbnMgLSBiYXNpYyBvcGNvZGUgKi8KLSNkZWZpbmUgT1BfTEkoeCkJKCgoeCkgJiAweDNGRikgPDwgMTIpCi0jZGVmaW5lIE1BU0tfTEkJCU9QX0xJKDB4M0ZGKQotCi0vKiBSZWdpc3RlciBGb3JtYXQgSW5zdHJ1Y3Rpb25zIC0gYmFzaWMgb3Bjb2RlICovCi0jZGVmaW5lIE9QX1JFRyh4KQlPUF9MSSh4KQkvKiBGb3IgcmVhZGFiaWxpdHkgKi8KLSNkZWZpbmUgTUFTS19SRUcJTUFTS19MSQkJLyogRm9yIHJlYWRhYmlsaXR5ICovCi0KLS8qIFRoZSAnbicgYml0IGF0IGJpdCAxMCAqLwotI2RlZmluZSBuKHgpCQkoKHgpIDw8IDEwKQotCi0vKiBUaGUgJ2knIGJpdCBhdCBiaXQgMTEgKi8KLSNkZWZpbmUgaSh4KQkJKCh4KSA8PCAxMSkKLQotLyogVGhlICdGJyBiaXQgYXQgYml0IDI3ICovCi0jZGVmaW5lIEYoeCkJCSgoeCkgPDwgMjcpCi0KLS8qIFRoZSAnRScgYml0IGF0IGJpdCAyNyAqLwotI2RlZmluZSBFKHgpCQkoKHgpIDw8IDI3KQotCi0vKiBUaGUgJ00nIGJpdCBhdCBiaXQgMTUgaW4gcmVnaXN0ZXIgYW5kIGxvbmcgaW1tZWRpYXRlIG9wY29kZXMgKi8KLSNkZWZpbmUgTV9SRUcoeCkJKCh4KSA8PCAxNSkKLSNkZWZpbmUgTV9MSSh4KQkJKCh4KSA8PCAxNSkKLQotLyogVGhlICdNJyBiaXQgYXQgYml0IDE3IGluIHNob3J0IGltbWVkaWF0ZSBvcGNvZGVzICovCi0jZGVmaW5lIE1fU0koeCkJCSgoeCkgPDwgMTcpCi0KLS8qIFRoZSAnU1onIGZpZWxkIGF0IGJpdHMgMTQtMTMgaW4gcmVnaXN0ZXIgYW5kIGxvbmcgaW1tZWRpYXRlIG9wY29kZXMgKi8KLSNkZWZpbmUgU1pfUkVHKHgpCSgoeCkgPDwgMTMpCi0jZGVmaW5lIFNaX0xJKHgpCSgoeCkgPDwgMTMpCi0KLS8qIFRoZSAnU1onIGZpZWxkIGF0IGJpdHMgMTYtMTUgaW4gc2hvcnQgaW1tZWRpYXRlIG9wY29kZXMgKi8KLSNkZWZpbmUgU1pfU0koeCkJKCh4KSA8PCAxNSkKLQotLyogVGhlICdEJyAoZGlyZWN0IGV4dGVybmFsIG1lbW9yeSBhY2Nlc3MpIGJpdCBhdCBiaXQgMTAgaW4gbG9uZyBpbW1lZGlhdGUKLSAgIGFuZCByZWdpc3RlciBvcGNvZGVzLiAqLwotI2RlZmluZSBEKHgpCQkoKHgpIDw8IDEwKQotCi0vKiBUaGUgJ1MnIChzY2FsZSBvZmZzZXQgYnkgZGF0YSBzaXplKSBiaXQgYXQgYml0IDExIGluIGxvbmcgaW1tZWRpYXRlCi0gICBhbmQgcmVnaXN0ZXIgb3Bjb2Rlcy4gKi8KLSNkZWZpbmUgUyh4KQkJKCh4KSA8PCAxMSkKLQotLyogVGhlICdQRCcgZmllbGQgYXQgYml0cyAxMC05IGluIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBQRCh4KQkJKCh4KSA8PCA5KQotCi0vKiBUaGUgJ1AyJyBmaWVsZCBhdCBiaXRzIDgtNyBpbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgUDIoeCkJCSgoeCkgPDwgNykKLQotLyogVGhlICdQMScgZmllbGQgYXQgYml0cyA2LTUgaW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFAxKHgpCQkoKHgpIDw8IDUpCi0KLS8qIFRoZSAnYScgZmllbGQgYXQgYml0IDE2IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9hMSh4KQkJKCh4KSA8PCAxNikKLQotLyogVGhlICdhJyBmaWVsZCBhdCBiaXQgMTEgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX2EwKHgpCQkoKHgpIDw8IDExKQotCi0vKiBUaGUgJ20nIGZpZWxkIGF0IGJpdCAxMCBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfbSh4KQkJKCh4KSA8PCAxMCkKLQotLyogVGhlICdTJyBmaWVsZCBhdCBiaXQgOSBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfUyh4KQkJKCh4KSA8PCA5KQotCi0vKiBUaGUgJ1onIGZpZWxkIGF0IGJpdCA4IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9aKHgpCQkoKHgpIDw8IDgpCi0KLS8qIFRoZSAncCcgZmllbGQgYXQgYml0IDYgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX3AoeCkJCSgoeCkgPDwgNikKLQotLyogVGhlIG9wY29kZSBmaWVsZCBhdCBiaXRzIDIxLTE3IGZvciB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIE9QX1YoeCkJCSgoeCkgPDwgMTcpCi0jZGVmaW5lIE1BU0tfVgkJT1BfVigweDFGKQotCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLiAgRm9ybWF0dGVkIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgb24gYSB3aWRlIHNjcmVlbi4gIEFsc28sIGFsbAotIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBtbmVtb25pYyBhcmUgc29ydGVkIHNvIHRoYXQgdGhleSBhcmUgYWRqYWNlbnQgaW4gdGhlIHRhYmxlLAotIGFsbG93aW5nIHRoZSB1c2Ugb2YgYSBoYXNoIHRhYmxlIHRvIGxvY2F0ZSB0aGUgZmlyc3Qgb2YgYSBzZXF1ZW5jZSBvZiBvcGNvZGVzIHRoYXQgaGF2ZQotIGEgcGFydGljdWxhciBuYW1lLiAgVGhlIHNob3J0IGltbWVkaWF0ZSBmb3JtcyBhbHNvIGNvbWUgYmVmb3JlIHRoZSBsb25nIGltbWVkaWF0ZSBmb3JtcwotIHNvIHRoYXQgdGhlIGFzc2VtYmxlciB3aWxsIHBpY2sgdGhlICJiZXN0IGZpdCIgZm9yIHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kLCBleGNlcHQgZm9yCi0gdGhlIGNhc2Ugb2YgdGhlIFBDIHJlbGF0aXZlIGZvcm1zLCB3aGVyZSB0aGUgbG9uZyBmb3JtcyBjb21lIGZpcnN0IGFuZCBhcmUgdGhlIGRlZmF1bHQKLSBmb3Jtcy4gKi8KLQotY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSB0aWM4MF9vcGNvZGVzW10gPSB7Ci0KLSAgLyogVGhlICJub3AiIGluc3RydWN0aW9uIGlzIHJlYWxseSAicmRjciAwLHIwIi4gIFdlIHB1dCBpdCBmaXJzdCBzbyB0aGF0IHRoaXMKLSAgICAgc3BlY2lmaWMgYml0IHBhdHRlcm4gd2lsbCBnZXQgZGlzYXNzZW1ibGVkIGFzIGEgbm9wIHJhdGhlciB0aGFuIGFuIHJkY3IuIFRoZQotICAgICBtYXNrIG9mIGFsbCBvbmVzIGVuc3VyZXMgdGhhdCB0aGlzIHdpbGwgaGFwcGVuLiAqLwotCi0gIHsibm9wIiwJT1BfU0koMHg0KSwJfjAsCQkwLAkJezB9CQkJfSwKLQotICAvKiBUaGUgImJyIiBpbnN0cnVjdGlvbiBpcyByZWFsbHkgImJieiB0YXJnZXQscjAsMzEiLiAgV2UgcHV0IGl0IGZpcnN0IHNvIHRoYXQKLSAgICAgdGhpcyBzcGVjaWZpYyBiaXQgcGF0dGVybiB3aWxsIGdldCBkaXNhc3NlbWJsZWQgYXMgYSBiciByYXRoZXIgdGhhbiBiYnouICovCi0KLSAgeyJiciIsCU9QX1NJKDB4NDgpLAkweEZGRkY4MDAwLAkwLAl7T0ZGX1NTX1BDfQl9LAotICB7ImJyIiwJT1BfTEkoMHgzOTEpLAkweEZGRkZGMDAwLAkwLAl7T0ZGX1NMX1BDfQl9LAotICB7ImJyIiwJT1BfUkVHKDB4MzkwKSwJMHhGRkZGRjAwMCwJMCwJe1JFR18wfQkJfSwKLSAgeyJici5hIiwJT1BfU0koMHg0OSksCTB4RkZGRjgwMDAsCTAsCXtPRkZfU1NfUEN9CX0sCi0gIHsiYnIuYSIsCU9QX0xJKDB4MzkzKSwJMHhGRkZGRjAwMCwJMCwJe09GRl9TTF9QQ30JfSwKLSAgeyJici5hIiwJT1BfUkVHKDB4MzkyKSwJMHhGRkZGRjAwMCwJMCwJe1JFR18wfQkJfSwKLQotICAvKiBTaWduZWQgaW50ZWdlciBBREQgKi8KLQotICB7ImFkZCIsCU9QX1NJKDB4NTgpLAlNQVNLX1NJLAkwLAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJhZGQiLAlPUF9MSSgweDNCMSksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImFkZCIsCU9QX1JFRygweDNCMCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogVW5zaWduZWQgaW50ZWdlciBBREQgKi8KLQotICB7ImFkZHUiLAlPUF9TSSgweDU5KSwJTUFTS19TSSwJMCwJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiYWRkdSIsCU9QX0xJKDB4M0IzKSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiYWRkdSIsCU9QX1JFRygweDNCMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBBTkQgKi8KLQotICB7ImFuZCIsCU9QX1NJKDB4MTEpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQiLAlPUF9MSSgweDMyMyksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZCIsCU9QX1JFRygweDMyMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnR0IiwJT1BfU0koMHgxMSksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50dCIsCU9QX0xJKDB4MzIzKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnR0IiwJT1BfUkVHKDB4MzIyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIEFORCB3aXRoIG9uZXMgY29tcGxlbWVudCBvZiBib3RoIHNvdXJjZXMgKi8KLQotICB7ImFuZC5mZiIsCU9QX1NJKDB4MTgpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQuZmYiLAlPUF9MSSgweDMzMSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC5mZiIsCU9QX1JFRygweDMzMCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBBTkQgd2l0aCBvbmVzIGNvbXBsZW1lbnQgb2Ygc291cmNlIDEgKi8KLQotICB7ImFuZC5mdCIsCU9QX1NJKDB4MTQpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQuZnQiLAlPUF9MSSgweDMyOSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC5mdCIsCU9QX1JFRygweDMyOCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBBTkQgd2l0aCBvbmVzIGNvbXBsZW1lbnQgb2Ygc291cmNlIDIgKi8KLQotICB7ImFuZC50ZiIsCU9QX1NJKDB4MTIpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudGYiLAlPUF9MSSgweDMyNSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50ZiIsCU9QX1JFRygweDMyNCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQnJhbmNoIEJpdCBPbmUgLSBub25hbm51bGxlZCAqLwotCi0gIHsiYmJvIiwJT1BfU0koMHg0QSksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYm8iLAlPUF9MSSgweDM5NSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYm8iLAlPUF9SRUcoMHgzOTQpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCi0KLSAgLyogQnJhbmNoIEJpdCBPbmUgLSBhbm51bGxlZCAqLwotCi0gIHsiYmJvLmEiLAlPUF9TSSgweDRCKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJiby5hIiwJT1BfTEkoMHgzOTcpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJvLmEiLAlPUF9SRUcoMHgzOTYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCi0KLSAgLyogQnJhbmNoIEJpdCBaZXJvIC0gbm9uYW5udWxsZWQgKi8KLQotICB7ImJieiIsCU9QX1NJKDB4NDgpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJ6IiwJT1BfTEkoMHgzOTEpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJ6IiwJT1BfUkVHKDB4MzkwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAotCi0gIC8qIEJyYW5jaCBCaXQgWmVybyAtIGFubnVsbGVkICovCi0KLSAgeyJiYnouYSIsCU9QX1NJKDB4NDkpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJ6LmEiLAlPUF9MSSgweDM5MyksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYnouYSIsCU9QX1JFRygweDM5MiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKLQotICAvKiBCcmFuY2ggQ29uZGl0aW9uYWwgLSBub25hbm51bGxlZCAqLwotCi0gIHsiYmNuZCIsCU9QX1NJKDB4NEMpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBDQ30JfSwKLSAgeyJiY25kIiwJT1BfTEkoMHgzOTkpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBDQ30JfSwKLSAgeyJiY25kIiwJT1BfUkVHKDB4Mzk4KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBDQ30JfSwKLQotICAvKiBCcmFuY2ggQ29uZGl0aW9uYWwgLSBhbm51bGxlZCAqLwotCi0gIHsiYmNuZC5hIiwJT1BfU0koMHg0RCksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIENDfQl9LAotICB7ImJjbmQuYSIsCU9QX0xJKDB4MzlCKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQ0N9CX0sCi0gIHsiYmNuZC5hIiwJT1BfUkVHKDB4MzlBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBDQ30JfSwKLQotICAvKiBCcmFuY2ggQ29udHJvbCBSZWdpc3RlciAqLwotCi0gIHsiYnJjciIsCU9QX1NJKDB4NiksCU1BU0tfU0ksCTAsCXtDUl9TSX0JfSwKLSAgeyJicmNyIiwJT1BfTEkoMHgzMEQpLAlNQVNLX0xJLAkwLAl7Q1JfTEl9CX0sCi0gIHsiYnJjciIsCU9QX1JFRygweDMwQyksCU1BU0tfUkVHLAkwLAl7UkVHXzB9CX0sCi0KLSAgLyogQnJhbmNoIGFuZCBzYXZlIHJldHVybiAtIG5vbmFubnVsbGVkICovCi0KLSAgeyJic3IiLAlPUF9TSSgweDQwKSwJTUFTS19TSSwJMCwJe09GRl9TU19QQywgUkVHX0RFU1R9CX0sCi0gIHsiYnNyIiwJT1BfTEkoMHgzODEpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHX0RFU1R9CX0sCi0gIHsiYnNyIiwJT1BfUkVHKDB4MzgwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQnJhbmNoIGFuZCBzYXZlIHJldHVybiAtIGFubnVsbGVkICovCi0KLSAgeyJic3IuYSIsCU9QX1NJKDB4NDEpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHX0RFU1R9CX0sCi0gIHsiYnNyLmEiLAlPUF9MSSgweDM4MyksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfREVTVH0JfSwKLSAgeyJic3IuYSIsCU9QX1JFRygweDM4MiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNlbmQgY29tbWFuZCAqLwotCi0gIHsiY21uZCIsCU9QX1NJKDB4MiksCU1BU0tfU0ksCTAsIAl7U1VJfQl9LAotICB7ImNtbmQiLAlPUF9MSSgweDMwNSksCU1BU0tfTEksCTAsIAl7TFVJfQl9LAotICB7ImNtbmQiLAlPUF9SRUcoMHgzMDQpLAlNQVNLX1JFRywJMCwJe1JFR18wfQl9LAotCi0gIC8qIEludGVnZXIgY29tcGFyZSAqLwotCi0gIHsiY21wIiwJT1BfU0koMHg1MCksCU1BU0tfU0ksCTAsIAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJjbXAiLAlPUF9MSSgweDNBMSksCU1BU0tfTEksCTAsIAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJjbXAiLAlPUF9SRUcoMHgzQTApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsdXNoIGRhdGEgY2FjaGUgc3ViYmxvY2sgLSBkb24ndCBjbGVhciBzdWJibG9jayBwcmVzZXQgZmxhZyAqLwotCi0gIHsiZGNhY2hlYyIsCU9QX1NJKDB4MzgpLAlGKDEpIHwgKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJCTAsIHtTU0ksIFJFR19CQVNFX01fU0l9CQl9LAotICB7ImRjYWNoZWMiLAlPUF9MSSgweDM3MSksCUYoMSkgfCAoTUFTS19MSSAgJiB+TV9MSSgxKSkgIHwgUygxKSB8IEQoMSksCTAsIHtMU0ksIFJFR19CQVNFX01fTEl9CQl9LAotICB7ImRjYWNoZWMiLAlPUF9SRUcoMHgzNzApLAlGKDEpIHwgKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IFMoMSkgfCBEKDEpLAkwLCB7UkVHXzAsIFJFR19CQVNFX01fTEl9CX0sCi0KLSAgLyogRmx1c2ggZGF0YSBjYWNoZSBzdWJibG9jayAtIGNsZWFyIHN1YmJsb2NrIHByZXNldCBmbGFnICovCi0KLSAgeyJkY2FjaGVmIiwJT1BfU0koMHgzOCkgICB8IEYoMSksCUYoMSkgfCAoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkJMCwge1NTSSwgUkVHX0JBU0VfTV9TSX0JCX0sCi0gIHsiZGNhY2hlZiIsCU9QX0xJKDB4MzcxKSAgfCBGKDEpLAlGKDEpIHwgKE1BU0tfTEkgICYgfk1fTEkoMSkpICAgfCBTKDEpIHwgRCgxKSwJMCwge0xTSSwgUkVHX0JBU0VfTV9MSX0JCX0sCi0gIHsiZGNhY2hlZiIsCU9QX1JFRygweDM3MCkgfCBGKDEpLAlGKDEpIHwgKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IFMoMSkgfCBEKDEpLAkwLCB7UkVHXzAsIFJFR19CQVNFX01fTEl9CX0sCi0KLSAgLyogRGlyZWN0IGxvYWQgc2lnbmVkIGRhdGEgaW50byByZWdpc3RlciAqLwotCi0gIHsiZGxkIiwJT1BfTEkoMHgzNDUpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkIiwJT1BfUkVHKDB4MzQ0KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRsZC5iIiwJT1BfTEkoMHgzNDEpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkLmIiLAlPUF9SRUcoMHgzNDApIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZGxkLmQiLAlPUF9MSSgweDM0NykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAotICB7ImRsZC5kIiwJT1BfUkVHKDB4MzQ2KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsiZGxkLmgiLAlPUF9MSSgweDM0MykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQuaCIsCU9QX1JFRygweDM0MikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBEaXJlY3QgbG9hZCB1bnNpZ25lZCBkYXRhIGludG8gcmVnaXN0ZXIgKi8KLQotICB7ImRsZC51YiIsCU9QX0xJKDB4MzUxKSAgfCBEKDEpLAkoTUFTS19MSSAgJiAgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQudWIiLAlPUF9SRUcoMHgzNTApIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSAgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRsZC51aCIsCU9QX0xJKDB4MzUzKSAgfCBEKDEpLAkoTUFTS19MSSAgJiAgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQudWgiLAlPUF9SRUcoMHgzNTIpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSAgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIERpcmVjdCBzdG9yZSBkYXRhIGludG8gbWVtb3J5ICovCi0KLSAgeyJkc3QiLAlPUF9MSSgweDM2NSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkc3QiLAlPUF9SRUcoMHgzNjQpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZHN0LmIiLAlPUF9MSSgweDM2MSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkc3QuYiIsCU9QX1JFRygweDM2MCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkc3QuZCIsCU9QX0xJKDB4MzY3KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCi0gIHsiZHN0LmQiLAlPUF9SRUcoMHgzNjYpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJkc3QuaCIsCU9QX0xJKDB4MzYzKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRzdC5oIiwJT1BfUkVHKDB4MzYyKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIEVtdWxhdGlvbiBzdG9wICovCi0KLSAgeyJlc3RvcCIsCU9QX0xJKDB4M0ZDKSwJTUFTS19MSSwJMCwJCXswfQl9LAotCi0gIC8qIEVtdWxhdGlvbiB0cmFwICovCi0KLSAgeyJldHJhcCIsCU9QX1NJKDB4MSkgICAgfCBFKDEpLAlNQVNLX1NJICB8IEUoMSksCTAsCXtTVUl9CX0sCi0gIHsiZXRyYXAiLAlPUF9MSSgweDMwMykgIHwgRSgxKSwJTUFTS19MSSAgfCBFKDEpLAkwLAl7TFVJfQl9LAotICB7ImV0cmFwIiwJT1BfUkVHKDB4MzAyKSB8IEUoMSksCU1BU0tfUkVHIHwgRSgxKSwJMCwJe1JFR18wfQl9LAotCi0gIC8qIEZsb2F0aW5nLXBvaW50IGFkZGl0aW9uICovCi0KLSAgeyJmYWRkLmRkZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuZHNkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc2RkIiwJT1BfTEkoMHgzRTEpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zZGQiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zc2QiLAlPUF9MSSgweDNFMSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zc2QiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc3NzIiwJT1BfTEkoMHgzRTEpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmYWRkLnNzcyIsCU9QX1JFRygweDNFMCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IGNvbXBhcmUgKi8KLQotICB7ImZjbXAuZGQiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuZHMiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLnNkIiwJT1BfTEkoMHgzRUIpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLnNkIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5zcyIsCU9QX0xJKDB4M0VCKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuc3MiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgZGl2aWRlICovCi0KLSAgeyJmZGl2LmRkZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuZHNkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc2RkIiwJT1BfTEkoMHgzRTcpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zZGQiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zc2QiLAlPUF9MSSgweDNFNykgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zc2QiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc3NzIiwJT1BfTEkoMHgzRTcpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmZGl2LnNzcyIsCU9QX1JFRygweDNFNikgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IG11bHRpcGx5ICovCi0KLSAgeyJmbXB5LmRkZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuZHNkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuaWlpIiwJT1BfTEkoMHgzRTUpICB8IFBEKDIpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkuaWlpIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDIpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS5zZGQiLAlPUF9MSSgweDNFNSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LnNkZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LnNzZCIsCU9QX0xJKDB4M0U1KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LnNzZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5zc3MiLAlPUF9MSSgweDNFNSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkuc3NzIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS51dXUiLAlPUF9MSSgweDNFNSkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMVUksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS51dXUiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBDb252ZXJ0L1JvdW5kIHRvIE1pbnVzIEluZmluaXR5ICovCi0KLSAgeyJmcm5kbS5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0udWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0udWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0udXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQ29udmVydC9Sb3VuZCB0byBOZWFyZXN0ICovCi0KLSAgeyJmcm5kbi5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4udWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4udWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4udXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQ29udmVydC9Sb3VuZCB0byBQb3NpdGl2ZSBJbmZpbml0eSAqLwotCi0gIHsiZnJuZHAuZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAudXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIENvbnZlcnQvUm91bmQgdG8gWmVybyAqLwotCi0gIHsiZnJuZHouZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHoudXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IHNxdWFyZSByb290ICovCi0KLSAgeyJmc3FydC5kZCIsCU9QX1JFRygweDNFRSkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnNxcnQuc2QiLAlPUF9MSSgweDNFRikgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZzcXJ0LnNkIiwJT1BfUkVHKDB4M0VFKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnNxcnQuc3MiLAlPUF9MSSgweDNFRikgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmc3FydC5zcyIsCU9QX1JFRygweDNFRSkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBzdWJ0cmFjdGlvbiAqLwotCi0gIHsgImZzdWIuZGRkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuZHNkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNkZCIsCU9QX0xJKDB4M0UzKSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNkZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zc2QiLAlPUF9MSSgweDNFMykgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc3NkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zc3MiLAlPUF9MSSgweDNFMykgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ICJmc3ViLnNzcyIsCU9QX1JFRygweDNFMikgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIElsbGVnYWwgaW5zdHJ1Y3Rpb25zICovCi0KLSAgeyJpbGxvcDAiLAlPUF9TSSgweDApLAlNQVNLX1NJLAkwLAl7MH0JfSwKLSAgeyJpbGxvcEYiLAkweDFGRiA8PCAxMywJMHgxRkYgPDwgMTMsCTAsCXswfQl9LAotCi0gIC8qIEp1bXAgYW5kIHNhdmUgcmV0dXJuICovCi0KLSAgeyJqc3IiLAlPUF9TSSgweDQ0KSwJTUFTS19TSSwJMCwJe09GRl9TU19CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7ImpzciIsCU9QX0xJKDB4Mzg5KSwJTUFTS19MSSwJMCwJe09GRl9TTF9CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7ImpzciIsCU9QX1JFRygweDM4OCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IuYSIsCU9QX1NJKDB4NDUpLAlNQVNLX1NJLAkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyLmEiLAlPUF9MSSgweDM4QiksCU1BU0tfTEksCTAsCXtPRkZfU0xfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IuYSIsCU9QX1JFRygweDM4QSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLQotICAvKiBMb2FkIFNpZ25lZCBEYXRhIEludG8gUmVnaXN0ZXIgKi8KLQotICB7ImxkIiwJT1BfU0koMHgyMiksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQiLAlPUF9MSSgweDM0NSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZCIsCU9QX1JFRygweDM0NCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC5iIiwJT1BfU0koMHgyMCksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQuYiIsCU9QX0xJKDB4MzQxKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkLmIiLAlPUF9SRUcoMHgzNDApIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQuZCIsCU9QX1NJKDB4MjMpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsibGQuZCIsCU9QX0xJKDB4MzQ3KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCi0gIHsibGQuZCIsCU9QX1JFRygweDM0NikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAotICB7ImxkLmgiLAlPUF9TSSgweDIxKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC5oIiwJT1BfTEkoMHgzNDMpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQuaCIsCU9QX1JFRygweDM0MikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBMb2FkIFVuc2lnbmVkIERhdGEgSW50byBSZWdpc3RlciAqLwotCi0gIHsibGQudWIiLAlPUF9TSSgweDI4KSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC51YiIsCU9QX0xJKDB4MzUxKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkLnViIiwJT1BfUkVHKDB4MzUwKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLnVoIiwJT1BfU0koMHgyOSksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQudWgiLAlPUF9MSSgweDM1MykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZC51aCIsCU9QX1JFRygweDM1MikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBMZWZ0bW9zdCBvbmUgKi8KLQotICB7ImxtbyIsCU9QX0xJKDB4M0YwKSwJTUFTS19MSSwJMCwJe1JFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBsb2dpY2FsIE9SLiAgTm90ZSB0aGF0ICJvci50dCIgYW5kICJvciIgYXJlIHRoZSBzYW1lIGluc3RydWN0aW9ucy4gKi8KLQotICB7Im9yLmZmIiwJT1BfU0koMHgxRSksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLmZmIiwJT1BfTEkoMHgzM0QpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci5mZiIsCU9QX1JFRygweDMzQyksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsib3IuZnQiLAlPUF9TSSgweDFEKSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IuZnQiLAlPUF9MSSgweDMzQiksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLmZ0IiwJT1BfUkVHKDB4MzNBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJvci50ZiIsCU9QX1NJKDB4MUIpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci50ZiIsCU9QX0xJKDB4MzM3KSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IudGYiLAlPUF9SRUcoMHgzMzYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7Im9yLnR0IiwJT1BfU0koMHgxNyksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLnR0IiwJT1BfTEkoMHgzMkYpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci50dCIsCU9QX1JFRygweDMyRSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsib3IiLAlPUF9TSSgweDE3KSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IiLAlPUF9MSSgweDMyRiksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yIiwJT1BfUkVHKDB4MzJFKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBSZWFkIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotICB7InJkY3IiLAlPUF9TSSgweDQpLAlNQVNLX1NJICB8ICgweDFGIDw8IDIyKSwJMCwJe0NSX1NJLCBSRUdfREVTVH0JfSwKLSAgeyJyZGNyIiwJT1BfTEkoMHgzMDkpLAlNQVNLX0xJICB8ICgweDFGIDw8IDIyKSwJMCwJe0NSX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJyZGNyIiwJT1BfUkVHKDB4MzA4KSwJTUFTS19SRUcgfCAoMHgxRiA8PCAyMiksCTAsCXtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogUmlnaHRtb3N0IG9uZSAqLwotCi0gIHsicm1vIiwJT1BfTEkoMHgzRjIpLAlNQVNLX0xJLAkwLAkJe1JFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2hpZnQgUmVnaXN0ZXIgTGVmdCAtIG5vdGUgdGhhdCByb3RsLCBzaGwsIGFuZCBpbnMgYXJlIGFsbCBhbHRlcm5hdGUgbmFtZXMgZm9yIG9uZSBvZiB0aGUgc2hpZnQgaW5zdHJ1Y3Rpb25zLgotICAgICBUaGV5IGFwcGVhciBwcmlvciB0byB0aGVpciBzbCBlcXVpdmFsZW50IHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpYXNzZW1ibGVkIGFzIHRoZSBhbHRlcm5hdGUgbmFtZS4gKi8KLQotCi0gIHsiaW5zIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiaW5zIiwJT1BfU0koMHhGKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InJvdGwiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJyb3RsIiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNobCIsCU9QX1JFRygweDMxQykgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzaGwiLAlPUF9TSSgweEUpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5peiIsCU9QX1JFRygweDMxQykgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2hpZnQgUmVnaXN0ZXIgTGVmdCBXaXRoIEludmVydGVkIEVuZG1hc2sgKi8KLQotICB7InNsaS5kbSIsCU9QX1JFRygweDMxMikgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTaGlmdCBSZWdpc3RlciBSaWdodCAtIG5vdGUgdGhhdCBleHRzLCBleHR1LCByb3RyLCBzcmEsIGFuZCBzcmwgYXJlIGFsbCBhbHRlcm5hdGUgbmFtZXMgZm9yIG9uZSBvZiB0aGUgc2hpZnQgaW5zdHJ1Y3Rpb25zLgotICAgICBUaGV5IGFwcGVhciBwcmlvciB0byB0aGVpciBzciBlcXVpdmFsZW50IHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpYXNzZW1ibGVkIGFzIHRoZSBhbHRlcm5hdGUgbmFtZS4gKi8KLQotICB7ImV4dHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJleHRzIiwJT1BfU0koMHhBKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJleHR1IiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZXh0dSIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsicm90ciIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InJvdHIiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JhIiwJT1BfUkVHKDB4MzFBKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JhIiwJT1BfU0koMHhEKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmwiLAlPUF9SRUcoMHgzMTYpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmwiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNoaWZ0IFJlZ2lzdGVyIFJpZ2h0IFdpdGggSW52ZXJ0ZWQgRW5kbWFzayAqLwotCi0gIHsic3JpLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5keiIsCU9QX1JFRygweDMxMCkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5leiIsCU9QX1JFRygweDMxNikgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5leiIsCU9QX1NJKDB4QikgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFN0b3JlIERhdGEgaW50byBNZW1vcnkgKi8KLQotICB7InN0IiwJT1BfU0koMHgzMiksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7InN0IiwJT1BfTEkoMHgzNjUpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsic3QiLAlPUF9SRUcoMHgzNjQpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QuYiIsCU9QX1NJKDB4MzApLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJzdC5iIiwJT1BfTEkoMHgzNjEpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsic3QuYiIsCU9QX1JFRygweDM2MCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJzdC5kIiwJT1BfU0koMHgzMyksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsic3QuZCIsCU9QX0xJKDB4MzY3KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCi0gIHsic3QuZCIsCU9QX1JFRygweDM2NikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAotICB7InN0LmgiLAlPUF9TSSgweDMxKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QuaCIsCU9QX0xJKDB4MzYzKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7InN0LmgiLAlPUF9SRUcoMHgzNjIpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogU2lnbmVkIEludGVnZXIgU3VidHJhY3QgKi8KLQotICB7InN1YiIsCU9QX1NJKDB4NUEpLAlNQVNLX1NJLAkwLCAJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsic3ViIiwJT1BfTEkoMHgzQjUpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJzdWIiLAlPUF9SRUcoMHgzQjQpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFVuc2lnbmVkIEludGVnZXIgU3VidHJhY3QgKi8KLQotICB7InN1YnUiLAlPUF9TSSgweDVCKSwJTUFTS19TSSwJMCwgCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7InN1YnUiLAlPUF9MSSgweDNCNyksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7InN1YnUiLAlPUF9SRUcoMHgzQjYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFdyaXRlIENvbnRyb2wgUmVnaXN0ZXIKLSAgICAgSXMgYSBzcGVjaWFsIGZvcm0gb2YgdGhlICJzd2NyIiBpbnN0cnVjdGlvbiBzbyBjb21lcyBiZWZvcmUgaXQgaW4gdGhlIHRhYmxlLiAqLwotCi0gIHsid3JjciIsCU9QX1NJKDB4NSksCU1BU0tfU0kgfCAoMHgxRiA8PCAyNyksCQkwLAl7Q1JfU0ksIFJFR18yMn0JfSwKLSAgeyJ3cmNyIiwJT1BfTEkoMHgzMEIpLAlNQVNLX0xJIHwgKDB4MUYgPDwgMjcpLAkJMCwJe0NSX0xJLCBSRUdfMjJ9CX0sCi0gIHsid3JjciIsCU9QX1JFRygweDMwQSksCU1BU0tfUkVHIHwgKDB4MUYgPDwgMjcpLAkwLAl7UkVHXzAsIFJFR18yMn0JfSwKLQotICAvKiBTd2FwIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotICB7InN3Y3IiLAlPUF9TSSgweDUpLAlNQVNLX1NJLAkwLAl7Q1JfU0ksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3djciIsCU9QX0xJKDB4MzBCKSwJTUFTS19MSSwJMCwJe0NSX0xJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InN3Y3IiLAlPUF9SRUcoMHgzMEEpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFRyYXAgKi8KLQotICB7InRyYXAiLAlPUF9TSSgweDEpICAgIHwgRSgwKSwJTUFTS19TSSAgfCBFKDEpLAkwLAl7U1VJfQl9LAotICB7InRyYXAiLAlPUF9MSSgweDMwMykgIHwgRSgwKSwJTUFTS19MSSAgfCBFKDEpLAkwLAl7TFVJfQl9LAotICB7InRyYXAiLAlPUF9SRUcoMHgzMDIpIHwgRSgwKSwJTUFTS19SRUcgfCBFKDEpLAkwLAl7UkVHXzB9CX0sCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IEFkZCAqLwotCi0gIHsidmFkZC5kZCIsCU9QX1JFRygweDNDMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidmFkZC5zZCIsCU9QX0xJKDB4M0MxKSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidmFkZC5zZCIsCU9QX1JFRygweDNDMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZhZGQuc3MiLAlPUF9MSSgweDNDMSkgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0gIHsidmFkZC5zcyIsCU9QX1JFRygweDNDMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IE11bHRpcGx5IGFuZCBBZGQgdG8gQWNjdW11bGF0b3IgRklYTUUhIFRoaXMgaXMgbm90IHlldCBmdWxseSBpbXBsZW1lbnRlZC4KLSAgIEZyb20gdGhlIGRvY3VtZW50YXRpb24gdGhlcmUgYXBwZWFycyB0byBiZSBubyB3YXkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvcGNvZGVzIGZvcgotICAgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSByZWdpc3RlciBkZXN0aW5hdGlvbnMgYW5kIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYWNjdW11bGF0b3IgZGVzdGluYXRpb25zLgotICAgRnVydGhlciBpbnZlc3RpZ2F0aW9uIGlzIG5lY2Vzc2FyeS4gIFNpbmNlIHRoaXMgaXNuJ3QgY3JpdGljYWwgdG8gZ2V0dGluZyBhIFRJQzgwIHRvb2xjaGFpbiB1cAotICAgYW5kIHJ1bm5pbmcsIGl0IGlzIGRlZmVyZWQgdW50aWwgbGF0ZXIuICovCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IE11bHRpcGx5Ci0gICBOb3RlOiBJZiByMCBpcyBpbiB0aGUgZGVzdGluYXRpb24gcmVnLCB0aGVuIHRoaXMgaXMgYSAidmVjdG9yIG5vcCIgaW5zdHJ1Y3Rpb24uICovCi0KLSAgeyJ2bXB5LmRkIiwJT1BfUkVHKDB4M0M0KSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHXzIyX0V9IH0sCi0gIHsidm1weS5zZCIsCU9QX0xJKDB4M0M1KSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7U1BGSSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZtcHkuc2QiLAlPUF9SRUcoMHgzQzQpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1JFR18wLCBSRUdfMjJfRSwgUkVHXzIyX0V9IH0sCi0gIHsidm1weS5zcyIsCU9QX0xJKDB4M0M1KSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7U1BGSSwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0gIHsidm1weS5zcyIsCU9QX1JFRygweDNDNCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7UkVHXzAsIFJFR18yMiwgUkVHXzIyfSB9LAotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBNdWx0aXBseSBhbmQgU3VidHJhY3QgZnJvbSBBY2N1bXVsYXRvcgotICAgICBGSVhNRTogU2VlIG5vdGUgYWJvdmUgZm9yIHZtYWMgaW5zdHJ1Y3Rpb24gKi8KLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgU3VidHJhY3QgQWNjdW11bGF0b3IgRnJvbSBTb3VyY2UKLSAgICAgRklYTUU6IFNlZSBub3RlIGFib3ZlIGZvciB2bWFjIGluc3RydWN0aW9uICovCi0KLSAgLyogVmVjdG9yIFJvdW5kIFdpdGggRmxvYXRpbmctUG9pbnQgSW5wdXQKLSAgICAgRklYTUU6IFNlZSBub3RlIGFib3ZlIGZvciB2bWFjIGluc3RydWN0aW9uICovCi0KLSAgLyogVmVjdG9yIFJvdW5kIHdpdGggSW50ZWdlciBJbnB1dCAqLwotCi0gIHsidnJuZC5pZCIsCU9QX0xJICgweDNDQikgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFNJLCBSRUdfMjJfRX19LAotICB7InZybmQuaWQiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJfRX19LAotICB7InZybmQuaXMiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xTSSwgUkVHXzIyfX0sCi0gIHsidnJuZC5pcyIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMn19LAotICB7InZybmQudWQiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDEpIHwgUDEoMSksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xVSSwgUkVHXzIyX0V9fSwKLSAgeyJ2cm5kLnVkIiwJT1BfUkVHICgweDNDQSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyX0V9fSwKLSAgeyJ2cm5kLnVzIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigwKSB8IFAxKDEpLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMVUksIFJFR18yMn19LAotICB7InZybmQudXMiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJ9fSwKLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgU3VidHJhY3QgKi8KLQotICB7InZzdWIuZGQiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZzdWIuc2QiLAlPUF9MSSgweDNDMykgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZzdWIuc2QiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2c3ViLnNzIiwJT1BfTEkoMHgzQzMpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMiwgUkVHXzIyfQl9LAotICB7InZzdWIuc3MiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMiwgUkVHXzIyfQl9LAotCi0gIC8qIFZlY3RvciBMb2FkIERhdGEgSW50byBSZWdpc3RlciAtIE5vdGUgdGhhdCB0aGUgdmVjdG9yIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIGNvbWUgYWZ0ZXIgdGhlIG90aGVyCi0gICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGFsd2F5cyBwcmludCB0aGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBzZWNvbmQgZm9yCi0gICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSB0d28gaW5zdHJ1Y3Rpb25zIGluIHRoZSBzYW1lIG9wY29kZS4gKi8KLQotICB7InZsZDAuZCIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMCksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1RfRX0gfSwKLSAgeyJ2bGQwLnMiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDApIHwgVl9wKDApLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAotICB7InZsZDEuZCIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1RfRX0gfSwKLSAgeyJ2bGQxLnMiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDApIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAotCi0gIC8qIFZlY3RvciBTdG9yZSBEYXRhIEludG8gTWVtb3J5IC0gTm90ZSB0aGF0IHRoZSB2ZWN0b3IgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgY29tZSBhZnRlciB0aGUgb3RoZXIKLSAgIHZlY3RvciBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgYWx3YXlzIHByaW50IHRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIHNlY29uZCBmb3IKLSAgIHZlY3RvciBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIHR3byBpbnN0cnVjdGlvbnMgaW4gdGhlIHNhbWUgb3Bjb2RlLiAqLwotCi0gIHsidnN0LmQiLAlPUF9WKDB4MUUpIHwgVl9tKDApIHwgVl9TKDEpIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUX0V9IH0sCi0gIHsidnN0LnMiLAlPUF9WKDB4MUUpIHwgVl9tKDApIHwgVl9TKDApIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAotCi0gIHsieG5vciIsCU9QX1NJKDB4MTkpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLSAgeyJ4bm9yIiwJT1BfTEkoMHgzMzMpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLSAgeyJ4bm9yIiwJT1BfUkVHKDB4MzMyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLQotICB7InhvciIsCU9QX1NJKDB4MTYpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLSAgeyJ4b3IiLAlPUF9MSSgweDMyRCksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotICB7InhvciIsCU9QX1JFRygweDMyQyksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0KLX07Ci0KLWNvbnN0IGludCB0aWM4MF9udW1fb3Bjb2RlcyA9IHNpemVvZiAodGljODBfb3Bjb2RlcykgLyBzaXplb2YgKHRpYzgwX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy92ODUwLWRpcy5jIGIvb3Bjb2Rlcy92ODUwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTA2MjViLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdjg1MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBWODUwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIgCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9yZWdfbmFtZXNbXSA9Ci17ICJyMCIsICJyMSIsICJyMiIsICJzcCIsICJncCIsICJyNSIsICJyNiIsICJyNyIsIAotICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLCAKLSAgInIxNiIsICJyMTciLCAicjE4IiwgInIxOSIsICJyMjAiLCAicjIxIiwgInIyMiIsICJyMjMiLCAKLSAgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsICJyMjgiLCAicjI5IiwgImVwIiwgImxwIiB9OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9zcmVnX25hbWVzW10gPQoteyAiZWlwYyIsICJlaXBzdyIsICJmZXBjIiwgImZlcHN3IiwgImVjciIsICJwc3ciLCAic3I2IiwgInNyNyIsIAotICAic3I4IiwgInNyOSIsICJzcjEwIiwgInNyMTEiLCAic3IxMiIsICJzcjEzIiwgInNyMTQiLCAic3IxNSIsCi0gICJjdHBjIiwgImN0cHN3IiwgImRicGMiLCAiZGJwc3ciLCAiY3RicCIsICJzcjIxIiwgInNyMjIiLCAic3IyMyIsIAotICAic3IyNCIsICJzcjI1IiwgInNyMjYiLCAic3IyNyIsICJzcjI4IiwgInNyMjkiLCAic3IzMCIsICJzcjMxIiwKLSAgInNyMTYiLCAic3IxNyIsICJzcjE4IiwgInNyMTkiLCAic3IyMCIsICJzcjIxIiwgInNyMjIiLCAic3IyMyIsIAotICAic3IyNCIsICJzcjI1IiwgInNyMjYiLCAic3IyNyIsICJzcjI4IiwgInNyMjkiLCAic3IzMCIsICJzcjMxIiB9OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9jY19uYW1lc1tdID0KLXsgInYiLCAiYy9sIiwgInoiLCAibmgiLCAicy9uIiwgInQiLCAibHQiLCAibGUiLCAKLSAgIm52IiwgIm5jL25sIiwgIm56IiwgImgiLCAibnMvcCIsICJzYSIsICJnZSIsICJndCIgfTsKLQotc3RhdGljIGludAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLXsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICogICAgICAgICAgb3AgPSAoc3RydWN0IHY4NTBfb3Bjb2RlICopdjg1MF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogICBvcGVyYW5kOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IDA7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgICAJc2hvcnRfb3AgPSAoKGluc24gJiAweDA2MDApICE9IDB4MDYwMCk7Ci0gIGludAkJCQlieXRlc19yZWFkOwotICBpbnQJCQkJdGFyZ2V0X3Byb2Nlc3NvcjsKLSAgCi0gIC8qIFNwZWNpYWwgY2FzZTogMzIgYml0IE1PViAqLwotICBpZiAoKGluc24gJiAweGZmZTApID09IDB4MDYyMCkKLSAgICBzaG9ydF9vcCA9IHRydWU7Ci0gIAotICBieXRlc19yZWFkID0gc2hvcnRfb3AgPyAyIDogNDsKLSAgCi0gIC8qIElmIHRoaXMgaXMgYSB0d28gYnl0ZSBpbnNuLCB0aGVuIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuICovCi0gIGlmIChzaG9ydF9vcCkKLSAgICBpbnNuICY9IDB4ZmZmZjsKLQotICBzd2l0Y2ggKGluZm8tPm1hY2gpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICBkZWZhdWx0OgotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOgotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF92ODUwZWE6IAotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwRUE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICAvKiBGaW5kIHRoZSBvcGNvZGUuICAqLwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUKLQkgICYmIChvcC0+cHJvY2Vzc29ycyAmIHRhcmdldF9wcm9jZXNzb3IpKQotCXsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBvcGluZGV4X3B0cjsKLQkgIHVuc2lnbmVkIGludCAgICAgICAgICBvcG51bTsKLQkgIHVuc2lnbmVkIGludCAgICAgICAgICBtZW1vcDsKLQotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOwotLypmcHJpbnRmIChzdGRlcnIsICJtYXRjaDogbWFzazogJXggaW5zbjogJXgsIG9wY29kZTogJXgsIG5hbWU6ICVzXG4iLCBvcC0+bWFzaywgaW5zbiwgb3AtPm9wY29kZSwgb3AtPm5hbWUgKTsqLwotCi0JICBtZW1vcCA9IG9wLT5tZW1vcDsKLQkgIC8qIE5vdyBwcmludCB0aGUgb3BlcmFuZHMuCi0KLQkgICAgIE1FTU9QIGlzIHRoZSBvcGVyYW5kIG51bWJlciBhdCB3aGljaCBhIG1lbW9yeQotCSAgICAgYWRkcmVzcyBzcGVjaWZpY2F0aW9uIHN0YXJ0cywgb3IgemVybyBpZiB0aGlzCi0JICAgICBpbnN0cnVjdGlvbiBoYXMgbm8gbWVtb3J5IGFkZHJlc3Nlcy4KLQotCSAgICAgQSBtZW1vcnkgYWRkcmVzcyBpcyBhbHdheXMgdHdvIGFyZ3VtZW50cy4KLQotCSAgICAgVGhpcyBpbmZvcm1hdGlvbiBhbGxvd3MgdXMgdG8gZGV0ZXJtaW5lIHdoZW4gdG8KLQkgICAgIGluc2VydCBjb21tYXMgaW50byB0aGUgb3V0cHV0IHN0cmVhbSBhcyB3ZWxsIGFzCi0JICAgICB3aGVuIHRvIGluc2VydCBkaXNwW3JlZ10gZXhwcmVzc2lvbnMgb250byB0aGUKLQkgICAgIG91dHB1dCBzdHJlYW0uICAqLwotCSAgCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBvcG51bSA9IDE7Ci0JICAgICAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgICAgICBvcGluZGV4X3B0cisrLCBvcG51bSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyAJdmFsdWU7Ci0JICAgICAgaW50ICAJZmxhZzsKLQkgICAgICBpbnQgICAgICAgc3RhdHVzOwotCSAgICAgIGJmZF9ieXRlCWJ1ZmZlclsgNCBdOwotCSAgICAgIAotCSAgICAgIG9wZXJhbmQgPSAmdjg1MF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotCSAgICAgIAotCSAgICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCQl2YWx1ZSA9IChvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgMCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gLTEpCi0JCSAgICB2YWx1ZSA9IChpbnNuICYgb3BlcmFuZC0+c2hpZnQpOwotCQkgIGVsc2UKLQkJICAgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0KLQkJICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCQkgICAgdmFsdWUgPSAoKGxvbmcpKHZhbHVlIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKQotCQkJICAgICA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSk7Ci0JCX0KLQotCSAgICAgIC8qIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGFsd2F5cyBvdXRwdXQgd2l0aG91dCBhbnkKLQkJIHNwZWNpYWwgaGFuZGxpbmcuCi0KLQkJIEZvciB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKLQotCQkgICBJZiBtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDEsIHRoZW4gd2UgbmVlZCAnWycgc2luY2UKLQkJICAgd2UncmUgYWJvdXQgdG8gb3V0cHV0IHRoZSByZWdpc3RlciB1c2VkIGluIGEgbWVtb3J5Ci0JCSAgIHJlZmVyZW5jZS4KLQotCQkgICBJZiBtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDIsIHRoZW4gd2UgbmVlZCAnXScgc2luY2UKLQkJICAgd2UganVzdCBmaW5pc2hlZCB0aGUgcmVnaXN0ZXIgaW4gYSBtZW1vcnkgcmVmZXJlbmNlLiAgV2UKLQkJICAgYWxzbyBuZWVkIGEgJywnIGJlZm9yZSB0aGlzIG9wZXJhbmQuCi0KLQkJICAgRWxzZSB3ZSBqdXN0IG5lZWQgYSBjb21tYS4KLQotCQkgICBXZSBtYXkgbmVlZCB0byBvdXRwdXQgYSB0cmFpbGluZyAnXScgaWYgdGhlIGxhc3Qgb3BlcmFuZAotCQkgICBpbiBhbiBpbnN0cnVjdGlvbiBpcyB0aGUgcmVnaXN0ZXIgZm9yIGEgbWVtb3J5IGFkZHJlc3MuIAotCi0JCSAgIFRoZSBleGNlcHRpb24gKGFuZCB0aGVyZSdzIGFsd2F5cyBhbiBleGNlcHRpb24pIGlzIHRoZQotCQkgICAiam1wIiBpbnNuIHdoaWNoIG5lZWRzIHNxdWFyZSBicmFja2V0cyBhcm91bmQgaXQncyBvbmx5Ci0JCSAgIHJlZ2lzdGVyIGFyZ3VtZW50LiAgKi8KLQotCSAgICAgICAgICAgaWYgKG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMSkgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JICAgICAgZWxzZSBpZiAobWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAyKSBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIl0sIik7Ci0JICAgICAgZWxzZSBpZiAobWVtb3AgPT0gMSAmJiBvcG51bSA9PSAxCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSkKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JICAgICAgZWxzZSBpZiAob3BudW0gPiAxKQkgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiwgIik7Ci0KLQkgICAgICAvKiBleHRyYWN0IHRoZSBmbGFncywgaWdub3JuZyBvbmVzIHdoaWNoIGRvIG5vdCBlZmZlY3QgZGlzYXNzZW1ibHkgb3V0cHV0LiAqLwotCSAgICAgIGZsYWcgPSBvcGVyYW5kLT5mbGFnczsKLQkgICAgICBmbGFnICY9IH4gVjg1MF9PUEVSQU5EX1NJR05FRDsKLQkgICAgICBmbGFnICY9IH4gVjg1MF9PUEVSQU5EX1JFTEFYOwotCSAgICAgIGZsYWcgJj0gLSBmbGFnOwotCSAgICAgIAotCSAgICAgIHN3aXRjaCAoZmxhZykKLQkJewotCQljYXNlIFY4NTBfT1BFUkFORF9SRUc6ICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzIiwgdjg1MF9yZWdfbmFtZXNbdmFsdWVdKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX1NSRzogIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCB2ODUwX3NyZWdfbmFtZXNbdmFsdWVdKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX0NDOiAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCB2ODUwX2NjX25hbWVzW3ZhbHVlXSk7IGJyZWFrOwotCQljYXNlIFY4NTBfT1BFUkFORF9FUDogICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgImVwIik7IGJyZWFrOwotCQlkZWZhdWx0OiAgICAgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOyBicmVhazsKLQkJY2FzZSBWODUwX09QRVJBTkRfRElTUDoKLQkJICB7Ci0JCSAgICBiZmRfdm1hIGFkZHIgPSB2YWx1ZSArIG1lbWFkZHI7Ci0JCSAgICAKLQkJICAgIC8qIE9uIHRoZSB2ODUwIHRoZSB0b3AgOCBiaXRzIG9mIGFuIGFkZHJlc3MgYXJlIHVzZWQgYnkgYW4gb3ZlcmxheSBtYW5hZ2VyLgotCQkgICAgICAgVGh1cyBpdCBtYXkgaGFwcGVuIHRoYXQgd2hlbiB3ZSBhcmUgbG9va2luZyBmb3IgYSBzeW1ib2wgdG8gbWF0Y2gKLQkJICAgICAgIGFnYWluc3QgYW4gYWRkcmVzcyB3aXRoIHNvbWUgb2YgaXRzIHRvcCBiaXRzIHNldCwgdGhlIHNlYXJjaCBmYWlscyB0bwotCQkgICAgICAgdHVybiB1cCBhbiBleGFjdCBtYXRjaC4gIEluIHRoaXMgY2FzZSB3ZSB0cnkgdG8gZmluZCBhbiBleGFjdCBtYXRjaAotCQkgICAgICAgYWdhaW5zdCBhIHN5bWJvbCBpbiB0aGUgbG93ZXIgYWRkcmVzcyBzcGFjZSwgYW5kIGlmIHdlIGZpbmQgb25lLCB3ZQotCQkgICAgICAgdXNlIHRoYXQgYWRkcmVzcy4gICBXZSBvbmx5IGRvIHRoaXMgZm9yIEpBUkwgaW5zdHJ1Y3Rpb25zIGhvd2V2ZXIsIGFzCi0JCSAgICAgICB3ZSBkbyBub3Qgd2FudCB0byBtaXNpbnRlcnByZXQgYnJhbmNoIGluc3RydWN0aW9ucy4gICovCi0JCSAgICBpZiAob3BlcmFuZC0+Yml0cyA9PSAyMikKLQkJICAgICAgewotCQkJaWYgKCAhIGluZm8tPnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgKGFkZHIsIGluZm8pCi0JCQkgICAgJiYgKChhZGRyICYgMHhGRjAwMDAwMCkgIT0gMCkKLQkJCSAgICAmJiBpbmZvLT5zeW1ib2xfYXRfYWRkcmVzc19mdW5jIChhZGRyICYgMHgwMEZGRkZGRiwgaW5mbykpCi0JCQkgIHsKLQkJCSAgICBhZGRyICY9IDB4MDBGRkZGRkY7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChhZGRyLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJICAgIAotCQljYXNlIFY4NTBFX1BVU0hfUE9QOgotCQkgIHsKLQkJICAgIHN0YXRpYyBpbnQgbGlzdDEyX3JlZ3NbMzJdICAgPSB7IDMwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotCQkgICAgc3RhdGljIGludCBsaXN0MThfaF9yZWdzWzMyXSA9IHsgMTksIDE4LCAxNywgMTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAzMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07Ci0JCSAgICBzdGF0aWMgaW50IGxpc3QxOF9sX3JlZ3NbMzJdID0geyAgMywgIDIsICAxLCAtMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDE0LCAxNSwgMTMsIDEyLCAgNywgIDYsICA1LCAgNCwgMTEsIDEwLCAgOSwgIDggfTsKLQkJICAgIGludCAqICAgICAgICAgICAgIHJlZ3M7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBpOwotCQkgICAgdW5zaWduZWQgbG9uZyBpbnQgbWFzayA9IDA7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBwYyAgID0gZmFsc2U7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBzciAgID0gZmFsc2U7Ci0JCSAgICAKLQkJICAgIAotCQkgICAgc3dpdGNoIChvcGVyYW5kLT5zaGlmdCkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDB4ZmZlMDAwMDE6IHJlZ3MgPSBsaXN0MTJfcmVnczsgYnJlYWs7Ci0JCSAgICAgIGNhc2UgMHhmZmY4MDAwZjogcmVncyA9IGxpc3QxOF9oX3JlZ3M7IGJyZWFrOwotCQkgICAgICBjYXNlIDB4ZmZmODAwMWY6IHJlZ3MgPSBsaXN0MThfbF9yZWdzOyB2YWx1ZSAmPSB+MHgxMDsgYnJlYWs7ICAvKiBEbyBub3QgaW5jbHVkZSBtYWdpYyBiaXQgKi8KLQkJICAgICAgZGVmYXVsdDoKLQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQlmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIpLCBvcGVyYW5kLT5zaGlmdCApOwotCQkJYWJvcnQoKTsKLQkJICAgICAgfQotCi0JCSAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICAgICAgewotCQkJaWYgKHZhbHVlICYgKDEgPDwgaSkpCi0JCQkgIHsKLQkJCSAgICBzd2l0Y2ggKHJlZ3NbIGkgXSkKLQkJCSAgICAgIHsKLQkJCSAgICAgIGRlZmF1bHQ6IG1hc2sgfD0gKDEgPDwgcmVnc1sgaSBdKTsgYnJlYWs7Ci0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCSAgICAgIGNhc2UgMDogIGZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBwb3AgcmVnOiAlZFxuIiksIGkgKTsgYWJvcnQoKTsKLQkJCSAgICAgIGNhc2UgLTE6IHBjID0gdHJ1ZTsgYnJlYWs7Ci0JCQkgICAgICBjYXNlIC0yOiBzciA9IHRydWU7IGJyZWFrOwotCQkJICAgICAgfQotCQkJICB9Ci0JCSAgICAgIH0KLQotCQkgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJ7Iik7Ci0JCSAgICAKLQkJICAgIGlmIChtYXNrIHx8IHBjIHx8IHNyKQotCQkgICAgICB7Ci0JCQlpZiAobWFzaykKLQkJCSAgewotCQkJICAgIHVuc2lnbmVkIGludCBiaXQ7Ci0JCQkgICAgaW50ICAgICAgICAgIHNob3duX29uZSA9IGZhbHNlOwotCQkJICAgIAotCQkJICAgIGZvciAoYml0ID0gMDsgYml0IDwgMzI7IGJpdCsrKQotCQkJICAgICAgaWYgKG1hc2sgJiAoMSA8PCBiaXQpKQotCQkJCXsKLQkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IGZpcnN0ID0gYml0OwotCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgbGFzdDsKLQotCQkJCSAgaWYgKHNob3duX29uZSkKLQkJCQkgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIsICIpOwotCQkJCSAgZWxzZQotCQkJCSAgICBzaG93bl9vbmUgPSB0cnVlOwotCQkJCSAgCi0JCQkJICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgdjg1MF9yZWdfbmFtZXNbZmlyc3RdKTsKLQkJCQkgIAotCQkJCSAgZm9yIChiaXQrKzsgYml0IDwgMzI7IGJpdCsrKQotCQkJCSAgICBpZiAoKG1hc2sgJiAoMSA8PCBiaXQpKSA9PSAwKQotCQkJCSAgICAgIGJyZWFrOwotCi0JCQkJICBsYXN0ID0gYml0OwotCi0JCQkJICBpZiAobGFzdCA+IGZpcnN0ICsgMSkKLQkJCQkgICAgewotCQkJCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiIC0gJXMiLCB2ODUwX3JlZ19uYW1lc1sgbGFzdCAtIDEgXSk7Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkgIH0KLQkJCQotCQkJaWYgKHBjKQotCQkJICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzUEMiLCBtYXNrID8gIiwgIiA6ICIiKTsKLQkJCWlmIChzcikKLQkJCSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlc1NSIiwgKG1hc2sgfHwgcGMpID8gIiwgIiA6ICIiKTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIn0iKTsKLQkJICB9Ci0JCWJyZWFrOwotCQkgIAotCQljYXNlIFY4NTBFX0lNTUVESUFURTE2OgotCQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIgKyBieXRlc19yZWFkLCBidWZmZXIsIDIsIGluZm8pOwotCQkgIGlmIChzdGF0dXMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgYnl0ZXNfcmVhZCArPSAyOwotCQkgICAgICB2YWx1ZSA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLQkJICAgICAgLyogSWYgdGhpcyBpcyBhIERJU1BPU0UgaW5zdHJ1Y3Rpb24gd2l0aCBmZiBzZXQgdG8gMHgxMCwgdGhlbiBzaGlmdCB2YWx1ZSB1cCBieSAxNi4gICovCi0JCSAgICAgIGlmICgoaW5zbiAmIDB4MDAxZmZmYzApID09IDB4MDAxMzA3ODApCi0JCQl2YWx1ZSA8PD0gMTY7Ci0KLQkJICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIweCV4IiwgdmFsdWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciArIGJ5dGVzX3JlYWQsIGluZm8pOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIFY4NTBFX0lNTUVESUFURTMyOgotCQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIgKyBieXRlc19yZWFkLCBidWZmZXIsIDQsIGluZm8pOwotCQkgIGlmIChzdGF0dXMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgYnl0ZXNfcmVhZCArPSA0OwotCQkgICAgICB2YWx1ZSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyICsgYnl0ZXNfcmVhZCwgaW5mbyk7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0JCSAgCi0KLQkgICAgICAvKiBIYW5kbGUgam1wIGNvcnJlY3RseS4gICovCi0JICAgICAgaWYgKG1lbW9wID09IDEgJiYgb3BudW0gPT0gMQotCQkgICYmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSAhPSAwKSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJdIik7Ci0JICAgIH0KLQotCSAgLyogQ2xvc2UgYW55IHNxdWFyZSBicmFja2V0IHdlIGxlZnQgb3Blbi4gICovCi0JICBpZiAobWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAyKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIl0iKTsKLQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLSAgICAgIGlmIChzaG9ydF9vcCkKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIi5zaG9ydFx0MHglMDR4IiwgaW5zbik7Ci0gICAgICBlbHNlCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHglMDh4IiwgaW5zbik7Ci0gICAgfQotCi0gIHJldHVybiBieXRlc19yZWFkOwotfQotCi1pbnQgCi1wcmludF9pbnNuX3Y4NTAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICBpbnQgICAgICAgICAgIHN0YXR1czsKLSAgYmZkX2J5dGUgICAgICBidWZmZXJbIDQgXTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuID0gMDsKLQotICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIG9wY29kZSBpcy4gICovCi0gIAotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgewotICAgICAgaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0gICAgICAKLSAgICAgIGlmICggICAoaW5zbiAmIDB4MDYwMCkgPT0gMHgwNjAwCi0JICAmJiAoaW5zbiAmIDB4ZmZlMCkgIT0gMHgwNjIwKQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSA0IGJ5dGUgaW5zbiwgcmVhZCA0IGJ5dGVzIG9mIHN0dWZmLiAgKi8KLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0KLQkgIGlmIChzdGF0dXMgPT0gMCkKLQkgICAgaW5zbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JfQotICAgIH0KLSAgCi0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIHRlbGwgb3VyIGNhbGxlciBob3cgbWFueSBieXRlcyB3ZSBjb25zdW1lZC4gICovCi0gIHJldHVybiBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3Y4NTAtb3BjLmMgYi9vcGNvZGVzL3Y4NTAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDg1N2UuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy92ODUwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLS8qIEFzc2VtYmxlIFY4NTAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvdjg1MC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIHJlZ3VsYXIgb3Bjb2RlICovCi0jZGVmaW5lIE9QKHgpCQkoKHggJiAweDNmKSA8PCA1KQotI2RlZmluZSBPUF9NQVNLCQlPUCAoMHgzZikKLQotLyogY29uZGl0aW9uYWwgYnJhbmNoIG9wY29kZSAqLwotI2RlZmluZSBCT1AoeCkJCSgoMHgwYiA8PCA3KSB8ICh4ICYgMHgwZikpCi0jZGVmaW5lIEJPUF9NQVNLCSgoMHgwZiA8PCA3KSB8IDB4MGYpCi0KLS8qIG9uZS13b3JkIG9wY29kZXMgKi8KLSNkZWZpbmUgb25lKHgpCQkoKHVuc2lnbmVkIGludCkgKHgpKQotCi0vKiB0d28td29yZCBvcGNvZGVzICovCi0jZGVmaW5lIHR3byh4LHkpCSgodW5zaWduZWQgaW50KSAoeCkgfCAoKHVuc2lnbmVkIGludCkgKHkpIDw8IDE2KSkKLQotCi0MCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KLQotLyogTm90ZTogVGhlcmUgaXMgYSBjb25zcGlyYWN5IGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zIGFuZAotICAgdjg1MF9pbnNlcnRfb3BlcmFuZCgpIGluIGdhcy9jb25maWcvdGMtdjg1MC5jLiAgRXJyb3IgbWVzc2FnZXMKLSAgIGNvbnRhaW5pbmcgdGhlIHN0cmluZyAnb3V0IG9mIHJhbmdlJyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIGEKLSAgIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZ2l2ZW4gdG8gR0FTLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBub3RfdmFsaWQgICAgPSBOXyAoImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBub3QgaW4gcmFuZ2UgYW5kIGlzIG5vdCBhbGlnbmVkIik7Ci1zdGF0aWMgY29uc3QgY2hhciAqIG91dF9vZl9yYW5nZSA9IE5fICgiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG91dCBvZiByYW5nZSIpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBub3RfYWxpZ25lZCAgPSBOXyAoImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBub3QgYWxpZ25lZCIpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UgPSBOXyAoImltbWVkaWF0ZSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UiKTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kOSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHhmZiB8fCB2YWx1ZSA8IC0weDEwMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIG9kZCBvZmZzZXQiKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKCJicmFuY2ggdG8gb2RkIG9mZnNldCIpOwotCi0gIHJldHVybiAoaW5zbiB8ICgodmFsdWUgJiAweDFmMCkgPDwgNykgfCAoKHZhbHVlICYgMHgwZSkgPDwgMykpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kOSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gKChpbnNuICYgMHhmODAwKSA+PiA3KSB8ICgoaW5zbiAmIDB4MDA3MCkgPj4gMyk7Ci0KLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldCAtPSAweDAyMDA7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kMjIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4MWZmZmZmIHx8IHZhbHVlIDwgLTB4MjAwMDAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSAyKSAhPSAwKQotCSogZXJybXNnID0gXygiYnJhbmNoIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgdG8gYW4gb2RkIG9mZnNldCIpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXygiYnJhbmNoIHZhbHVlIG91dCBvZiByYW5nZSIpOwotICAgIH0KLSAgZWxzZSBpZiAoKHZhbHVlICUgMikgIT0gMCkKLSAgICAqIGVycm1zZyA9IF8oImJyYW5jaCB0byBvZGQgb2Zmc2V0Iik7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKCh2YWx1ZSAmIDB4ZmZmZSkgPDwgMTYpIHwgKCh2YWx1ZSAmIDB4M2YwMDAwKSA+PiAxNikpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kMjIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSAoKGluc24gJiAweGZmZmUwMDAwKSA+PiAxNikgfCAoKGluc24gJiAweDNmKSA8PCAxNik7Ci0KLSAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAoKHJldCA8PCAxMCkgPj4gMTApOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2QxNl8xNSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHg3ZmZmIHx8IHZhbHVlIDwgLTB4ODAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8obm90X3ZhbGlkKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweGZmZmUpIDw8IDE2KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDE2XzE1IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgc2lnbmVkIGxvbmcgcmV0ID0gKGluc24gJiAweGZmZmUwMDAwKTsKLQotICByZXR1cm4gcmV0ID4+IDE2OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2Q4XzcgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSAyKSAhPSAwKQotCSogZXJybXNnID0gXyhub3RfdmFsaWQpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXyhvdXRfb2ZfcmFuZ2UpOwotICAgIH0KLSAgZWxzZSBpZiAoKHZhbHVlICUgMikgIT0gMCkKLSAgICAqIGVycm1zZyA9IF8obm90X2FsaWduZWQpOwotCi0gIHZhbHVlID4+PSAxOwotCi0gIHJldHVybiAoaW5zbiB8ICh2YWx1ZSAmIDB4N2YpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDhfNyAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gKGluc24gJiAweDdmKTsKLQotICByZXR1cm4gcmV0IDw8IDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDhfNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHhmZiB8fCB2YWx1ZSA8IDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDQpICE9IDApCi0JKmVycm1zZyA9IF8obm90X3ZhbGlkKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDQpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICB2YWx1ZSA+Pj0gMTsKLQotICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDdlKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q4XzYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHg3ZSk7Ci0KLSAgcmV0dXJuIHJldCA8PCAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2Q1XzQgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4MWYgfHwgdmFsdWUgPCAwKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSAmIDEpCi0JKiBlcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKmVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlICYgMSkKLSAgICAqIGVycm1zZyA9IF8obm90X2FsaWduZWQpOwotCi0gIHZhbHVlID4+PSAxOwotCi0gIHJldHVybiAoaW5zbiB8ICh2YWx1ZSAmIDB4MGYpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDVfNCAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gKGluc24gJiAweDBmKTsKLQotICByZXR1cm4gcmV0IDw8IDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDE2XzE2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHNpZ25lZCBsb25nICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDdmZmYgfHwgdmFsdWUgPCAtMHg4MDAwKQotICAgICogZXJybXNnID0gXyhvdXRfb2ZfcmFuZ2UpOwotCi0gIHJldHVybiAoaW5zbiB8ICgodmFsdWUgJiAweGZmZmUpIDw8IDE2KSB8ICgodmFsdWUgJiAxKSA8PCA1KSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2QxNl8xNiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweGZmZmUwMDAwOwotCi0gIHJldCA+Pj0gMTY7Ci0KLSAgcmV0IHw9ICgoaW5zbiAmIDB4MjApID4+IDUpOwotICAKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9pOSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzaWduZWQgbG9uZyAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHhmZiB8fCB2YWx1ZSA8IC0weDEwMCkKLSAgICAqIGVycm1zZyA9IF8oaW1tZWRpYXRlX291dF9vZl9yYW5nZSk7Ci0KLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZTApIDw8IDEzKSB8ICh2YWx1ZSAmIDB4MWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9pOSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweDAwM2MwMDAwOwotCi0gIHJldCA8PD0gMTA7Ci0gIHJldCA+Pj0gMjM7Ci0KLSAgcmV0IHw9IChpbnNuICYgMHgxZik7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3U5IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmZikKLSAgICAqIGVycm1zZyA9IF8oaW1tZWRpYXRlX291dF9vZl9yYW5nZSk7Ci0KLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZTApIDw8IDEzKSB8ICh2YWx1ZSAmIDB4MWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF91OSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gaW5zbiAmIDB4MDAzYzAwMDA7Ci0KLSAgcmV0ID4+PSAxMzsKLQotICByZXQgfD0gKGluc24gJiAweDFmKTsKLSAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfc3BlIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgIT0gMykKLSAgICAqIGVycm1zZyA9IF8oImludmFsaWQgcmVnaXN0ZXIgZm9yIHN0YWNrIGFkanVzdG1lbnQiKTsKLQotICByZXR1cm4gaW5zbiAmICh+IDB4MTgwMDAwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3Rfc3BlIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgcmV0dXJuIDM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfaTVkaXYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4MWZmKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSAmIDEpCi0JKiBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgdmFsdWUgbm90IGluIHJhbmdlIGFuZCBub3QgZXZlbiIpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXyhpbW1lZGlhdGVfb3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlICYgMSkKLSAgICAqIGVycm1zZyA9IF8oImltbWVkaWF0ZSB2YWx1ZSBtdXN0IGJlIGV2ZW4iKTsKLQotICB2YWx1ZSA9IDMyIC0gdmFsdWU7Ci0gIAotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFlKSA8PCAxNyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2k1ZGl2IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHgzYzAwMDA7Ci0KLSAgcmV0ID4+PSAxNzsKLQotICByZXQgPSAzMiAtIHJldDsKLSAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLQwKLS8qIFdhcm5pbmc6IGNvZGUgaW4gZ2FzL2NvbmZpZy90Yy12ODUwLmMgZXhhbWluZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkuCi0gICBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGUgdmFsdWVzIGhlcmUsIGJlIHN1cmUgdG8gbG9vayBmb3Igc2lkZSBlZmZlY3RzIGluCi0gICB0aGF0IGNvZGUuICovCi1jb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kIHY4NTBfb3BlcmFuZHNbXSA9Ci17Ci0jZGVmaW5lIFVOVVNFRAkwCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgMCB9LCAKLQotLyogVGhlIFIxIGZpZWxkIGluIGEgZm9ybWF0IDEsIDYsIDcsIG9yIDkgaW5zbi4gKi8KLSNkZWZpbmUgUjEJKFVOVVNFRCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB9LCAKLQotLyogQXMgYWJvdmUsIGJ1dCByZWdpc3RlciAwIGlzIG5vdCBhbGxvd2VkLiAgKi8KLSNkZWZpbmUgUjFfTk9UUjAgKFIxICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9OT1RfUjAgfSwgCi0KLS8qIFRoZSBSMiBmaWVsZCBpbiBhIGZvcm1hdCAxLCAyLCA0LCA1LCA2LCA3LCA5IGluc24uICovCi0jZGVmaW5lIFIyCShSMV9OT1RSMCArIDEpCi0gIHsgNSwgMTEsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfSwKLQotLyogQXMgYWJvdmUsIGJ1dCByZWdpc3RlciAwIGlzIG5vdCBhbGxvd2VkLiAgKi8KLSNkZWZpbmUgUjJfTk9UUjAgKFIyICsgMSkKLSAgeyA1LCAxMSwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfTk9UX1IwIH0sCi0KLS8qIFRoZSBpbW01IGZpZWxkIGluIGEgZm9ybWF0IDIgaW5zbi4gKi8KLSNkZWZpbmUgSTUJKFIyX05PVFIwICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgdW5zaWduZWQgaW1tNSBmaWVsZCBpbiBhIGZvcm1hdCAyIGluc24uICovCi0jZGVmaW5lIEk1VQkoSTUgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIDAgfSwKLQotLyogVGhlIGltbTE2IGZpZWxkIGluIGEgZm9ybWF0IDYgaW5zbi4gKi8KLSNkZWZpbmUgSTE2CShJNVUgKyAxKQotICB7IDE2LCAxNiwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIHNpZ25lZCBkaXNwNyBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ3CShJMTYgKyAxKQotICB7IDcsIDAsIE5VTEwsIE5VTEwsIDB9LAotCi0vKiBUaGUgZGlzcDE2IGZpZWxkIGluIGEgZm9ybWF0IDYgaW5zbi4gKi8KLSNkZWZpbmUgRDE2XzE1CShENyArIDEpCi0gIHsgMTUsIDE3LCBpbnNlcnRfZDE2XzE1LCBleHRyYWN0X2QxNl8xNSwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIDMgYml0IGltbWVkaWF0ZSBmaWVsZCBpbiBmb3JtYXQgOCBpbnNuLiAgKi8KLSNkZWZpbmUgQjMJKEQxNl8xNSArIDEpCi0gIHsgMywgMTEsIE5VTEwsIE5VTEwsIDAgfSwKLQotLyogVGhlIDQgYml0IGNvbmRpdGlvbiBjb2RlIGluIGEgc2V0ZiBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBDQ0NDCShCMyArIDEpCi0gIHsgNCwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX0NDIH0sCi0KLS8qIFRoZSB1bnNpZ25lZCBESVNQOCBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ4XzcJKENDQ0MgKyAxKQotICB7IDcsIDAsIGluc2VydF9kOF83LCBleHRyYWN0X2Q4XzcsIDAgfSwKLQotLyogVGhlIHVuc2lnbmVkIERJU1A4IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KLSNkZWZpbmUgRDhfNgkoRDhfNyArIDEpCi0gIHsgNiwgMSwgaW5zZXJ0X2Q4XzYsIGV4dHJhY3RfZDhfNiwgMCB9LAotCi0vKiBTeXN0ZW0gcmVnaXN0ZXIgb3BlcmFuZHMuICAqLwotI2RlZmluZSBTUjEJKEQ4XzYgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TUkcgfSwKLQotLyogRVAgUmVnaXN0ZXIuICAqLwotI2RlZmluZSBFUAkoU1IxICsgMSkKLSAgeyAwLCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfRVAgfSwKLQotLyogVGhlIGltbTE2IGZpZWxkICh1bnNpZ25lZCkgaW4gYSBmb3JtYXQgNiBpbnNuLiAqLwotI2RlZmluZSBJMTZVCShFUCArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCAwfSwgCi0KLS8qIFRoZSBSMiBmaWVsZCBhcyBhIHN5c3RlbSByZWdpc3Rlci4gICovCi0jZGVmaW5lIFNSMgkoSTE2VSArIDEpCi0gIHsgNSwgMTEsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TUkcgfSwKLQotLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhIGZvcm1hdCA4IGluc24uICovCi0jZGVmaW5lIEQxNgkoU1IyICsgMSkKLSAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSBESVNQOSBmaWVsZCBpbiBhIGZvcm1hdCAzIGluc24sIHJlbGF4YWJsZS4gKi8KLSNkZWZpbmUgRDlfUkVMQVgJKEQxNiArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X2Q5LCBleHRyYWN0X2Q5LCBWODUwX09QRVJBTkRfUkVMQVggfCBWODUwX09QRVJBTkRfU0lHTkVEIHwgVjg1MF9PUEVSQU5EX0RJU1AgfSwKLQotLyogVGhlIERJU1AyMiBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24sIHJlbGF4YWJsZS4KLSAgIFRoaXMgX211c3RfIGZvbGxvdyBEOV9SRUxBWDsgdGhlIGFzc2VtYmxlciBhc3N1bWVzIHRoYXQgdGhlIGxvbmdlcgotICAgdmVyc2lvbiBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBzaG9ydGVyIHZlcnNpb24gZm9yIHJlbGF4aW5nLiAgKi8KLSNkZWZpbmUgRDIyCShEOV9SRUxBWCArIDEpCi0gIHsgMjIsIDAsIGluc2VydF9kMjIsIGV4dHJhY3RfZDIyLCBWODUwX09QRVJBTkRfU0lHTkVEIHwgVjg1MF9PUEVSQU5EX0RJU1AgfSwKLQotLyogVGhlIHNpZ25lZCBkaXNwNCBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ0CShEMjIgKyAxKQotICB7IDQsIDAsIE5VTEwsIE5VTEwsIDB9LAotCi0vKiBUaGUgdW5zaWduZWQgZGlzcDUgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBENV80CShENCArIDEpCi0gIHsgNCwgMCwgaW5zZXJ0X2Q1XzQsIGV4dHJhY3RfZDVfNCwgMCB9LAotCi0vKiBUaGUgZGlzcDE2IGZpZWxkIGluIGFuIGZvcm1hdCA3IHVuc2lnbmVkIGJ5dGUgbG9hZCBpbnNuLiAqLwotI2RlZmluZSBEMTZfMTYJKEQ1XzQgKyAxKQotICB7IC0xLCAweGZmZmUwMDIwLCBpbnNlcnRfZDE2XzE2LCBleHRyYWN0X2QxNl8xNiwgMCB9LCAKLQotLyogVGhpcmQgcmVnaXN0ZXIgaW4gY29uZGl0aW9uYWwgbW92ZXMuICovCi0jZGVmaW5lIFIzCShEMTZfMTYgKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIH0sCi0KLS8qIENvbmRpdGlvbiBjb2RlIGluIGNvbmRpdGlvbmFsIG1vdmVzLiAgKi8KLSNkZWZpbmUgTU9WQ0MJKFIzICsgMSkKLSAgeyA0LCAxNywgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX0NDIH0sCi0KLS8qIFRoZSBpbW05IGZpZWxkIGluIGEgbXVsdGlwbHkgd29yZC4gKi8KLSNkZWZpbmUgSTkJKE1PVkNDICsgMSkKLSAgeyA5LCAwLCBpbnNlcnRfaTksIGV4dHJhY3RfaTksIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSB1bnNpZ25lZCBpbW05IGZpZWxkIGluIGEgbXVsdGlwbHkgd29yZC4gKi8KLSNkZWZpbmUgVTkJKEk5ICsgMSkKLSAgeyA5LCAwLCBpbnNlcnRfdTksIGV4dHJhY3RfdTksIDAgfSwgCi0KLS8qIEEgbGlzdCBvZiByZWdpc3RlcnMgaW4gYSBwcmVwYXJlL2Rpc3Bvc2UgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBMSVNUMTIJKFU5ICsgMSkKLSAgeyAtMSwgMHhmZmUwMDAwMSwgTlVMTCwgTlVMTCwgVjg1MEVfUFVTSF9QT1AgfSwgCi0KLS8qIFRoZSBJTU02IGZpZWxkIGluIGEgY2FsbCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSTYJKExJU1QxMiArIDEpCi0gIHsgNiwgMCwgTlVMTCwgTlVMTCwgMCB9LCAKLQotLyogVGhlIDE2IGJpdCBpbW1lZGlhdGUgZm9sbG93aW5nIGEgMzIgYml0IGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU1NMTYJKEk2ICsgMSkKLSAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfCBWODUwRV9JTU1FRElBVEUxNiB9LCAKLQotLyogVGhlIDMyIGJpdCBpbW1lZGlhdGUgZm9sbG93aW5nIGEgMzIgYml0IGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU1NMzIJKElNTTE2ICsgMSkKLSAgeyAwLCAwLCBOVUxMLCBOVUxMLCBWODUwRV9JTU1FRElBVEUzMiB9LCAKLQotLyogVGhlIGltbTUgZmllbGQgaW4gYSBwdXNoL3BvcCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSU1NNQkoSU1NMzIgKyAxKQotICB7IDUsIDEsIE5VTEwsIE5VTEwsIDAgfSwgCi0KLS8qIFJlZzIgaW4gZGlzcG9zZSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgUjJESVNQT1NFCShJTU01ICsgMSkKLSAgeyA1LCAxNiwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfTk9UX1IwIH0sCi0KLS8qIFN0YWNrIHBvaW50ZXIgaW4gcHJlcGFyZSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgU1AJKFIyRElTUE9TRSArIDEpCi0gIHsgMiwgMTksIGluc2VydF9zcGUsIGV4dHJhY3Rfc3BlLCBWODUwX09QRVJBTkRfUkVHIH0sCi0KLS8qIFRoZSBJTU01IGZpZWxkIGluIGEgZGl2aWRlIE4gc3RlcCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSTVESVYJKFNQICsgMSkKLSAgeyA5LCAwLCBpbnNlcnRfaTVkaXYsIGV4dHJhY3RfaTVkaXYsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLSAgLyogVGhlIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIGEgUFVTSE1IL1BPUE1IIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTElTVDE4X0ggKEk1RElWICsgMSkKLSAgeyAtMSwgMHhmZmY4MDAwZiwgTlVMTCwgTlVMTCwgVjg1MEVfUFVTSF9QT1AgfSwgCi0KLSAgLyogVGhlIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIGEgUFVTSE1ML1BPUE1MIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTElTVDE4X0wgKExJU1QxOF9IICsgMSkKLSAgeyAtMSwgMHhmZmY4MDAxZiwgTlVMTCwgTlVMTCwgVjg1MEVfUFVTSF9QT1AgfSwgLyogVGhlIHNldHRpbmcgb2YgdGhlIDR0aCBiaXQgaXMgYSBmbGFnIHRvIGRpc2Fzc21ibGUoKSBpbiB2ODUwLWRpcy5jICovCi19IDsgCi0KLQwKLS8qIHJlZy1yZWcgaW5zdHJ1Y3Rpb24gZm9ybWF0IChGb3JtYXQgSSkgKi8KLSNkZWZpbmUgSUYxCXtSMSwgUjJ9Ci0KLS8qIGltbS1yZWcgaW5zdHJ1Y3Rpb24gZm9ybWF0IChGb3JtYXQgSUkpICovCi0jZGVmaW5lIElGMgl7STUsIFIyfQotCi0vKiBjb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybWF0IChGb3JtYXQgSUlJKSAqLwotI2RlZmluZSBJRjMJe0Q5X1JFTEFYfQotCi0vKiAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb24gKEZvcm1hdCBWSSkgKi8KLSNkZWZpbmUgSUY2CXtJMTYsIFIxLCBSMn0KLQotLyogMyBvcGVyYW5kIGluc3RydWN0aW9uIChGb3JtYXQgVkkpICovCi0jZGVmaW5lIElGNlUJe0kxNlUsIFIxLCBSMn0KLQotCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUJCU9QQ09ERQkJCU1BU0sJCSAgICAgICB7IE9QRVJBTkRTIH0JICAgTUVNT1AgICAgUFJPQ0VTU09SCi0KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0gICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0gICBNRU1PUCBzcGVjaWZpZXMgd2hpY2ggb3BlcmFuZCAoaWYgYW55KSBpcyBhIG1lbW9yeSBvcGVyYW5kLgotICAgUFJPQ0VTU09SUyBzcGVjaWZpZXMgd2hpY2ggQ1BVKHMpIHN1cHBvcnQgdGhlIG9wY29kZS4KLSAgIAotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCi0gICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLgotCi0gICBUaGUgdGFibGUgaXMgYWxzbyBzb3J0ZWQgYnkgbmFtZS4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLgotICAgV2hlbiBwYXJzaW5nIGFuIGluc3RydWN0aW9uIHRoZSBhc3NlbWJsZXIgZmluZHMgdGhlIGZpcnN0IG9jY3VyYW5jZQotICAgb2YgdGhlIG5hbWUgb2YgdGhlIGluc3RydWNpdG9uIGluIHRoaXMgdGFibGUgYW5kIHRoZW4gYXR0ZW1wdHMgdG8KLSAgIG1hdGNoIHRoZSBpbnN0cnVjdGlvbidzIGFyZ3VtZW50cyB3aXRoIGRlc2NyaXB0aW9uIG9mIHRoZSBvcGVyYW5kcwotICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeSBpdCBoYXMganVzdCBmb3VuZCBpbiB0aGlzIHRhYmxlLiAgSWYgdGhlCi0gICBtYXRjaCBmYWlscyB0aGUgYXNzZW1ibGVyIGxvb2tzIGF0IHRoZSBuZXh0IGVudHJ5IGluIHRoaXMgdGFibGUuCi0gICBJZiB0aGF0IGVudHJ5IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmV2aW91cyBlbnRyeSwgdGhlbiBpdAotICAgdHJpZXMgdG8gbWF0Y2ggdGhlIGluc3RydWN0aW9uIGFnYWluc3QgdGhhdCBlbnRyeSBhbmQgc28gb24uICBUaGlzCi0gICBpcyBob3cgdGhlIGFzc2VtYmxlciBjb3BlcyB3aXRoIG11bHRpcGxlLCBkaWZmZXJlbnQgZm9ybWF0cyBvZiB0aGUKLSAgIHNhbWUgaW5zdHJ1Y3Rpb24uICAqLwotCi1jb25zdCBzdHJ1Y3Qgdjg1MF9vcGNvZGUgdjg1MF9vcGNvZGVzW10gPQotewoteyAiYnJlYWtwb2ludCIsCTB4ZmZmZiwJCQkweGZmZmYsCQkgICAgICAJe1VOVVNFRH0sICAgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0KLXsgImptcCIsCW9uZSAoMHgwMDYwKSwJCW9uZSAoMHhmZmUwKSwJICAgICAgCXtSMX0sIAkJCTEsIFBST0NFU1NPUl9BTEwgfSwKLSAgCi0vKiBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyAqLwoteyAic2xkLmJ1IiwJb25lICgweDAzMDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q3LCAgIEVQLCAgIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2xkLmJ1IiwgICAgIG9uZSAoMHgwMDYwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q0LCAgIEVQLCAgIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX1Y4NTBFIH0sCi0KLXsgInNsZC5odSIsCW9uZSAoMHgwNDAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtEOF83LCBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5odSIsICAgICBvbmUgKDB4MDA3MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENV80LCBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRSB9LAotCi17ICJzbGQuYiIsICAgICAgb25lICgweDAwNjApLAkJb25lICgweDA3ZjApLCAgICAgICAgIAl7RDQsICAgRVAsICAgUjJ9LCAJMSwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2xkLmIiLAlvbmUgKDB4MDMwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDcsICAgRVAsICAgUjJ9LAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLXsgInNsZC5iIiwJb25lICgweDAzMDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q3LCAgIEVQLCAgIFIyfSwJMSwgUFJPQ0VTU09SX1Y4NTAgfSwKLQoteyAic2xkLmgiLCAgICAgIG9uZSAoMHgwMDcwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q1XzQsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5oIiwJb25lICgweDA0MDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q4XzcsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwRSB9LAoteyAic2xkLmgiLAlvbmUgKDB4MDQwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDhfNywgRVAsICAgUjJ9LCAJMSwgUFJPQ0VTU09SX1Y4NTAgfSwKLXsgInNsZC53IiwJb25lICgweDA1MDApLAkJb25lICgweDA3ODEpLAkgICAgICAJe0Q4XzYsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNzdC5iIiwJb25lICgweDAzODApLAkJb25lICgweDA3ODApLAkgICAgICAJe1IyLCAgIEQ3LCAgIEVQfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNzdC5oIiwJb25lICgweDA0ODApLAkJb25lICgweDA3ODApLAkgICAgICAJe1IyLCAgIEQ4XzcsIEVQfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNzdC53IiwJb25lICgweDA1MDEpLAkJb25lICgweDA3ODEpLAkgICAgICAJe1IyLCAgIEQ4XzYsIEVQfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLQoteyAicHVzaG1sIiwJdHdvICgweDA3ZTAsIDB4MDAwMSksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9MfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJwdXNobWgiLAl0d28gKDB4MDdlMCwgMHgwMDAzKSwJdHdvICgweGZmZjAsIDB4MDAwNyksIAl7TElTVDE4X0h9LCAJCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInBvcG1sIiwJdHdvICgweDA3ZjAsIDB4MDAwMSksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9MfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJwb3BtaCIsCXR3byAoMHgwN2YwLCAweDAwMDMpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfSH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMDMpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTUsIFNQfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMGIpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTUsIElNTTE2fSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMTMpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTUsIElNTTE2fSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMWIpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTUsIElNTTMyfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMDEpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTV9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXNwb3NlIiwJb25lICgweDA2NDApLCAgICAgICAgICAgb25lICgweGZmYzApLCAgICAgICAgIAl7SU1NNSwgTElTVDEyLCBSMkRJU1BPU0V9LDAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGlzcG9zZSIsCXR3byAoMHgwNjQwLCAweDAwMDApLCAgIHR3byAoMHhmZmMwLCAweDAwMWYpLCAJe0lNTTUsIExJU1QxMn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQoteyAibGQuYiIsCXR3byAoMHgwNzAwLCAweDAwMDApLAl0d28gKDB4MDdlMCwgMHgwMDAwKSwgCXtEMTYsIFIxLCBSMn0sIAkJMSwgUFJPQ0VTU09SX0FMTCB9LAoteyAibGQuaCIsCXR3byAoMHgwNzIwLCAweDAwMDApLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtEMTZfMTUsIFIxLCBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJsZC53IiwJdHdvICgweDA3MjAsIDB4MDAwMSksCXR3byAoMHgwN2UwLCAweDAwMDEpLCAJe0QxNl8xNSwgUjEsIFIyfSwgCTEsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkLmJ1IiwJdHdvICgweDA3ODAsIDB4MDAwMSksICAgdHdvICgweDA3YzAsIDB4MDAwMSksIAl7RDE2XzE2LCBSMSwgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImxkLmh1IiwJdHdvICgweDA3ZTAsIDB4MDAwMSksICAgdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7RDE2XzE1LCBSMSwgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwgIAoteyAic3QuYiIsCXR3byAoMHgwNzQwLCAweDAwMDApLAl0d28gKDB4MDdlMCwgMHgwMDAwKSwgCXtSMiwgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3QuaCIsCXR3byAoMHgwNzYwLCAweDAwMDApLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtSMiwgRDE2XzE1LCBSMX0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdC53IiwJdHdvICgweDA3NjAsIDB4MDAwMSksCXR3byAoMHgwN2UwLCAweDAwMDEpLCAJe1IyLCBEMTZfMTUsIFIxfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLQotLyogYnl0ZSBzd2FwL2V4dGVuZCBpbnN0cnVjdGlvbnMgKi8KLXsgInp4YiIsCW9uZSAoMHgwMDgwKSwJCW9uZSAoMHhmZmUwKSwgCSAgICAgIAl7UjFfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJ6eGgiLAlvbmUgKDB4MDBjMCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInN4YiIsCW9uZSAoMHgwMGEwKSwJCW9uZSAoMHhmZmUwKSwgCSAgICAgIAl7UjFfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJzeGgiLAlvbmUgKDB4MDBlMCksCQlvbmUgKDB4ZmZlMCksCSAgICAgIAl7UjFfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJic2giLAl0d28gKDB4MDdlMCwgMHgwMzQyKSwJdHdvICgweDA3ZmYsIDB4MDdmZiksIAl7UjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImJzdyIsCXR3byAoMHgwN2UwLCAweDAzNDApLAl0d28gKDB4MDdmZiwgMHgwN2ZmKSwgCXtSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiaHN3IiwJdHdvICgweDA3ZTAsIDB4MDM0NCksCXR3byAoMHgwN2ZmLCAweDA3ZmYpLCAJe1IyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIGp1bXAgdGFibGUgaW5zdHJ1Y3Rpb25zICovCi17ICJzd2l0Y2giLAlvbmUgKDB4MDA0MCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxfSwgCQkJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjYWxsdCIsCW9uZSAoMHgwMjAwKSwJCW9uZSAoMHhmZmMwKSwgCSAgICAgIAl7STZ9LCAJCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImN0cmV0IiwgCXR3byAoMHgwN2UwLCAweDAxNDQpLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwgCXswfSwgCQkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIGFyaXRobWV0aWMgb3BlcmF0aW9uIGluc3RydWN0aW9ucyAqLwoteyAic2V0ZiIsCXR3byAoMHgwN2UwLCAweDAwMDApLAl0d28gKDB4MDdmMCwgMHhmZmZmKSwgCXtDQ0NDLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY21vdiIsCXR3byAoMHgwN2UwLCAweDAzMjApLAl0d28gKDB4MDdlMCwgMHgwN2UxKSwgCXtNT1ZDQywgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImNtb3YiLAl0d28gKDB4MDdlMCwgMHgwMzAwKSwJdHdvICgweDA3ZTAsIDB4MDdlMSksIAl7TU9WQ0MsIEk1LCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLXsgIm11bCIsCXR3byAoMHgwN2UwLCAweDAyMjApLAl0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm11bCIsCXR3byAoMHgwN2UwLCAweDAyNDApLAl0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJOSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm11bHUiLAl0d28gKDB4MDdlMCwgMHgwMjIyKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtdWx1IiwJdHdvICgweDA3ZTAsIDB4MDI0MiksCXR3byAoMHgwN2UwLCAweDA3YzMpLCAJe1U5LCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi17ICJkaXYiLAl0d28gKDB4MDdlMCwgMHgwMmMwKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZ1IiwJdHdvICgweDA3ZTAsIDB4MDJjMiksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGl2aHUiLAl0d28gKDB4MDdlMCwgMHgwMjgyKSwgICB0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpdmgiLAl0d28gKDB4MDdlMCwgMHgwMjgwKSwgICB0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpdmgiLAlPUCAgKDB4MDIpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAotICAKLXsgImRpdmhuIiwJdHdvICgweDA3ZTAsIDB4MDI4MCksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAiZGl2aHVuIiwJdHdvICgweDA3ZTAsIDB4MDI4MiksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAiZGl2biIsCXR3byAoMHgwN2UwLCAweDAyYzApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgImRpdnVuIiwJdHdvICgweDA3ZTAsIDB4MDJjMiksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2RpdmhuIiwJdHdvICgweDA3ZTAsIDB4MDE4MCksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2Rpdmh1biIsCXR3byAoMHgwN2UwLCAweDAxODIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZuIiwJdHdvICgweDA3ZTAsIDB4MDFjMCksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2RpdnVuIiwJdHdvICgweDA3ZTAsIDB4MDFjMiksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAotICAKLXsgIm5vcCIsCW9uZSAoMHgwMCksCQlvbmUgKDB4ZmZmZiksCQl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm1vdiIsCU9QICAoMHgxMCksCQlPUF9NQVNLLAkJe0k1LCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3YiLAlvbmUgKDB4MDYyMCksCQlvbmUgKDB4ZmZlMCksCQl7SU1NMzIsIFIxX05PVFIwfSwJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtb3YiLCAgICAgICAgT1AgICgweDAwKSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm1vdmVhIiwJT1AgICgweDMxKSwJCU9QX01BU0ssCQl7STE2LCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3ZoaSIsCU9QICAoMHgzMiksCQlPUF9NQVNLLAkJe0kxNlUsIFIxLCBSMl9OT1RSMH0sCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImFkZCIsCU9QICAoMHgwZSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhZGQiLAlPUCAgKDB4MTIpLAkJT1BfTUFTSywJCUlGMiwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYWRkaSIsCU9QICAoMHgzMCksCQlPUF9NQVNLLAkJSUY2LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdWIiLAlPUCAgKDB4MGQpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3ViciIsIAlPUCAgKDB4MGMpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibXVsaCIsCU9QICAoMHgxNyksCQlPUF9NQVNLLAkJe0k1LCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtdWxoIiwJT1AgICgweDA3KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm11bGhpIiwJT1AgICgweDM3KSwJCU9QX01BU0ssCQl7STE2LCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJjbXAiLAlPUCAgKDB4MGYpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY21wIiwJT1AgICgweDEzKSwJCU9QX01BU0ssCQlJRjIsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLSAgCi0vKiBzYXR1cmF0ZWQgb3BlcmF0aW9uIGluc3RydWN0aW9ucyAqLwoteyAic2F0YWRkIiwJT1AgKDB4MTEpLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0YWRkIiwJT1AgKDB4MDYpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0c3ViIiwJT1AgKDB4MDUpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0c3ViaSIsCU9QICgweDMzKSwJCU9QX01BU0ssCQl7STE2LCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXRzdWJyIiwJT1AgKDB4MDQpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCi0vKiBsb2dpY2FsIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInRzdCIsCU9QICgweDBiKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm9yIiwJCU9QICgweDA4KSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm9yaSIsCU9QICgweDM0KSwJCU9QX01BU0ssCQlJRjZVLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhbmQiLAlPUCAoMHgwYSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhbmRpIiwJT1AgKDB4MzYpLAkJT1BfTUFTSywJCUlGNlUsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInhvciIsCU9QICgweDA5KSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInhvcmkiLAlPUCAoMHgzNSksCQlPUF9NQVNLLAkJSUY2VSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibm90IiwJT1AgKDB4MDEpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2FyIiwJT1AgKDB4MTUpLAkJT1BfTUFTSywJCXtJNVUsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXIiLAl0d28gKDB4MDdlMCwgMHgwMGEwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksIAl7UjEsICBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2hsIiwJT1AgICgweDE2KSwJCU9QX01BU0ssCSAgICAgIAl7STVVLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2hsIiwJdHdvICgweDA3ZTAsIDB4MDBjMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLCAJe1IxLCAgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNociIsCU9QICAoMHgxNCksCQlPUF9NQVNLLAkgICAgICAJe0k1VSwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNociIsCXR3byAoMHgwN2UwLCAweDAwODApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgCXtSMSwgIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXNmIiwgICAgICAgdHdvICgweDA3ZTAsIDB4MDIwMCksCXR3byAoMHgwN2YwLCAweGZmZmYpLCAJe0NDQ0MsIFIyfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQotLyogYnJhbmNoIGluc3RydWN0aW9ucyAqLwotCS8qIHNpZ25lZCBpbnRlZ2VyICovCi17ICJiZ3QiLAlCT1AgKDB4ZiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmdlIiwJQk9QICgweGUpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJsdCIsCUJPUCAoMHg2KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibGUiLAlCT1AgKDB4NyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIHVuc2lnbmVkIGludGVnZXIgKi8KLXsgImJoIiwJCUJPUCAoMHhiKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibmgiLAlCT1AgKDB4MyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmwiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJubCIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogY29tbW9uICovCi17ICJiZSIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm5lIiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiBvdGhlcnMgKi8KLXsgImJ2IiwJCUJPUCAoMHgwKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibnYiLAlCT1AgKDB4OCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm4iLAkJQk9QICgweDQpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJwIiwJCUJPUCAoMHhjKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJiYyIsCQlCT1AgKDB4MSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm5jIiwJQk9QICgweDkpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJ6IiwJCUJPUCAoMHgyKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibnoiLAlCT1AgKDB4YSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYnIiLAkJQk9QICgweDUpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJzYSIsCUJPUCAoMHhkKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0KLS8qIEJyYW5jaCBtYWNyb3MuCi0KLSAgIFdlIHVzZSB0aGUgc2hvcnQgZm9ybSBpbiB0aGUgb3Bjb2RlL21hc2sgZmllbGRzLiAgVGhlIGFzc2VtYmxlcgotICAgd2lsbCB0d2lkZGxlIGJpdHMgYXMgbmVjZXNzYXJ5IGlmIHRoZSBsb25nIGZvcm0gaXMgbmVlZGVkLiAgKi8KLQotCS8qIHNpZ25lZCBpbnRlZ2VyICovCi17ICJqZ3QiLAlCT1AgKDB4ZiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamdlIiwJQk9QICgweGUpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpsdCIsCUJPUCAoMHg2KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbGUiLAlCT1AgKDB4NyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIHVuc2lnbmVkIGludGVnZXIgKi8KLXsgImpoIiwJCUJPUCAoMHhiKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbmgiLAlCT1AgKDB4MyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamwiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpubCIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogY29tbW9uICovCi17ICJqZSIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam5lIiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiBvdGhlcnMgKi8KLXsgImp2IiwJCUJPUCAoMHgwKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbnYiLAlCT1AgKDB4OCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam4iLAkJQk9QICgweDQpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpwIiwJCUJPUCAoMHhjKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqYyIsCQlCT1AgKDB4MSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam5jIiwJQk9QICgweDkpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImp6IiwJCUJPUCAoMHgyKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbnoiLAlCT1AgKDB4YSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAianNhIiwJQk9QICgweGQpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpiciIsCUJPUCAoMHg1KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAoteyAianIiLAkJb25lICgweDA3ODApLAkJdHdvICgweGZmYzAsIDB4MDAwMSksCXtEMjJ9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqYXJsIiwJb25lICgweDA3ODApLAkJdHdvICgweDA3YzAsIDB4MDAwMSksCXtEMjIsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMfSwgCi0KLS8qIGJpdCBtYW5pcHVsYXRpb24gaW5zdHJ1Y3Rpb25zICovCi17ICJzZXQxIiwJdHdvICgweDA3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNldDEiLAl0d28gKDB4MDdlMCwgMHgwMGUwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMiwgUjF9LCAgICAJCTIsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibm90MSIsCXR3byAoMHg0N2MwLCAweDAwMDApLAl0d28gKDB4YzdlMCwgMHgwMDAwKSwJe0IzLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJub3QxIiwJdHdvICgweDA3ZTAsIDB4MDBlMiksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImNscjEiLAl0d28gKDB4ODdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY2xyMSIsCXR3byAoMHgwN2UwLCAweDAwZTQpLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgICB7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInRzdDEiLAl0d28gKDB4YzdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAidHN0MSIsCXR3byAoMHgwN2UwLCAweDAwZTYpLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zICovCi17ICJkaSIsCQl0d28gKDB4MDdlMCwgMHgwMTYwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiZWkiLAkJdHdvICgweDg3ZTAsIDB4MDE2MCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImhhbHQiLAl0d28gKDB4MDdlMCwgMHgwMTIwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAicmV0aSIsCXR3byAoMHgwN2UwLCAweDAxNDApLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ0cmFwIiwJdHdvICgweDA3ZTAsIDB4MDEwMCksCXR3byAoMHhmZmUwLCAweGZmZmYpLAl7STVVfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibGRzciIsCXR3byAoMHgwN2UwLCAweDAwMjApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IxLCBTUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN0c3IiLAl0d28gKDB4MDdlMCwgMHgwMDQwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtTUjEsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17IDAsIDAsIDAsIHswfSwgMCwgMCB9LAotCi19IDsKLQotY29uc3QgaW50IHY4NTBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKHY4NTBfb3Bjb2RlcykgLyBzaXplb2YgKHY4NTBfb3Bjb2Rlc1swXSk7Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvdmF4LWRpcy5jIGIvb3Bjb2Rlcy92YXgtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjU5ZjMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy92YXgtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyogUHJpbnQgVkFYIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFBhdWxpbmUgTWlkZGVsaW5rIDxtaWRkZWxpbkBwb2x5d2FyZS5pYWYubmw+Ci0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJvcGNvZGUvdmF4LmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0vKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgYmZkX3ZtYSwKLQkJCWRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX21vZGUgUEFSQU1TICgoaW50LCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgY2hhciAqcmVnX25hbWVzW10gPQotewotICAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAotICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJhcCIsICJmcCIsICJzcCIsICJwYyIKLX07Ci0KLS8qIFNpZ24tZXh0ZW5kIGFuICh1bnNpZ25lZCBjaGFyKS4gKi8KLSNpZiBfX1NURENfXyA9PSAxCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChzaWduZWQgY2hhcikoY2gpKQotI2Vsc2UKLSNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKGludCkoKChjaCkgXiAweDgwKSAmIDB4RkYpIC0gMTI4KQotI2VuZGlmCi0KLS8qIEdldCBhIDEgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIE5FWFRCWVRFKHApICBcCi0gIChwICs9IDEsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gIENPRVJDRV9TSUdORURfQ0hBUihwWy0xXSkpCi0KLS8qIEdldCBhIDIgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIENPRVJDRTE2KHgpICgoaW50KSAoKCh4KSBeIDB4ODAwMCkgLSAweDgwMDApKQotI2RlZmluZSBORVhUV09SRChwKSAgXAotICAocCArPSAyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgQ09FUkNFMTYgKChwWy0xXSA8PCA4KSArIHBbLTJdKSkKLQotLyogR2V0IGEgNCBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgQ09FUkNFMzIoeCkgKChpbnQpICgoKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKSkKLSNkZWZpbmUgTkVYVExPTkcocCkgIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIChDT0VSQ0UzMiAoKCgoKChwWy0xXSA8PCA4KSArIHBbLTJdKSA8PCA4KSArIHBbLTNdKSA8PCA4KSArIHBbLTRdKSkpCi0KLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDI1Ci0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopIGluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFByaW50IHRoZSB2YXggaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIElORk8tPlNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLwotCi1pbnQKLXByaW50X2luc25fdmF4IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCB2b3QgKnZvdHA7Ci0gIGNvbnN0IGNoYXIgKmFyZ3AgPSBOVUxMOwotICB1bnNpZ25lZCBjaGFyICphcmc7Ci0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAyKTsKLSAgZm9yICh2b3RwID0gJnZvdHN0cnNbMF07IHZvdHAtPm5hbWVbMF07IHZvdHArKykKLSAgICB7Ci0gICAgICByZWdpc3RlciB2YXhfb3Bjb2RlVCBvcGNvZGUgPSB2b3RwLT5kZXRhaWwuY29kZTsKLQotICAgICAgLyogMiBieXRlIGNvZGVzIG1hdGNoIDIgYnVmZmVyIHBvcy4gKi8KLSAgICAgIGlmICgoYmZkX2J5dGUpIG9wY29kZSA9PSBidWZmZXJbMF0KLQkgICYmIChvcGNvZGUgPj4gOCA9PSAwIHx8IG9wY29kZSA+PiA4ID09IGJ1ZmZlclsxXSkpCi0JewotCSAgYXJncCA9IHZvdHAtPmRldGFpbC5hcmdzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKGFyZ3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLndvcmQgMHgleCIsCi0JCQkgICAgIChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV0pOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gIC8qIFBvaW50IGF0IGZpcnN0IGJ5dGUgb2YgYXJndW1lbnQgZGF0YSwgYW5kIGF0IGRlc2NyaXB0b3IgZm9yIGZpcnN0Ci0gICAgIGFyZ3VtZW50LiAgKi8KLSAgYXJnID0gYnVmZmVyICsgKCh2b3RwLT5kZXRhaWwuY29kZSA+PiA4KSA/IDIgOiAxKTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBpdCBpbiBtZW0gKi8KLSAgRkVUQ0hfREFUQSAoaW5mbywgYXJnKTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgdm90cC0+bmFtZSk7Ci0gIGlmICgqYXJncCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQotICB3aGlsZSAoKmFyZ3ApCi0gICAgewotICAgICAgYXJnICs9IHByaW50X2luc25fYXJnIChhcmdwLCBhcmcsIG1lbWFkZHIgKyBhcmcgLSBidWZmZXIsIGluZm8pOwotICAgICAgYXJncCArPSAyOwotICAgICAgaWYgKCphcmdwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgIH0KLQotICByZXR1cm4gYXJnIC0gYnVmZmVyOwotfQotCi0vKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyAiZWF0ZW4iIGJ5IHRoZSBvcGVyYW5kLCBvciByZXR1cm4gLTEgaWYgYW4KLSAgIGludmFsaWQgb3BlcmFuZCB3YXMgZm91bmQsIG9yIC0yIGlmIGFuIG9wY29kZSB0YWJlbCBlcnJvciB3YXMKLSAgIGZvdW5kLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyAoZCwgcDAsIGFkZHIsIGluZm8pCi0gICAgIGNvbnN0IGNoYXIgKmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnAwOwotICAgICBiZmRfdm1hIGFkZHI7CQkvKiBQQyBmb3IgdGhpcyBhcmcgdG8gYmUgcmVsYXRpdmUgdG8gKi8KLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGFyZ19sZW47Ci0KLSAgLyogY2hlY2sgdmFsaWRpdHkgb2YgYWRkcmVzc2luZyBsZW5ndGggKi8KLSAgc3dpdGNoIChkWzFdKQotICAgIHsKLSAgICBjYXNlICdiJyA6IGFyZ19sZW4gPSAxOwlicmVhazsKLSAgICBjYXNlICdkJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKLSAgICBjYXNlICdmJyA6IGFyZ19sZW4gPSA0OwlicmVhazsKLSAgICBjYXNlICdnJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKLSAgICBjYXNlICdoJyA6IGFyZ19sZW4gPSAxNjsJYnJlYWs7Ci0gICAgY2FzZSAnbCcgOiBhcmdfbGVuID0gNDsJYnJlYWs7Ci0gICAgY2FzZSAnbycgOiBhcmdfbGVuID0gMTY7CWJyZWFrOwotICAgIGNhc2UgJ3cnIDogYXJnX2xlbiA9IDI7CWJyZWFrOwotICAgIGNhc2UgJ3EnIDogYXJnX2xlbiA9IDg7CWJyZWFrOwotICAgIGRlZmF1bHQgIDogYWJvcnQoKTsKLSAgICB9Ci0KLSAgLyogYnJhbmNoZXMgaGF2ZSBubyBtb2RlIGJ5dGUgKi8KLSAgaWYgKGRbMF0gPT0gJ2InKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBwMDsKLQotICAgICAgaWYgKGFyZ19sZW4gPT0gMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAxICsgTkVYVEJZVEUgKHApLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAyICsgTkVYVFdPUkQgKHApLCBpbmZvKTsKLQotICAgICAgcmV0dXJuIHAgLSBwMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHByaW50X2luc25fbW9kZSAoYXJnX2xlbiwgcDAsIGFkZHIsIGluZm8pOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX21vZGUgKHNpemUsIHAwLCBhZGRyLCBpbmZvKQotICAgICBpbnQgc2l6ZTsKLSAgICAgdW5zaWduZWQgY2hhciAqcDA7Ci0gICAgIGJmZF92bWEgYWRkcjsJCS8qIFBDIGZvciB0aGlzIGFyZyB0byBiZSByZWxhdGl2ZSB0byAqLwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBjaGFyICpwID0gcDA7Ci0gIHVuc2lnbmVkIGNoYXIgbW9kZSwgcmVnOwotCi0gIC8qIGZldGNoIGFuZCBpbnRlcnByZXQgbW9kZSBieXRlICovCi0gIG1vZGUgPSAodW5zaWduZWQgY2hhcikgTkVYVEJZVEUgKHApOwotICByZWcgPSBtb2RlICYgMHhGOwotICBzd2l0Y2ggKG1vZGUgJiAweEYwKQotICAgIHsKLSAgICBjYXNlIDB4MDA6Ci0gICAgY2FzZSAweDEwOgotICAgIGNhc2UgMHgyMDoKLSAgICBjYXNlIDB4MzA6IC8qIGxpdGVyYWwgbW9kZQkJCSRudW1iZXIgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJDB4JXgiLCBtb2RlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg0MDogLyogaW5kZXg6CQkJYmFzZS1hZGRyW1JuXSAqLwotICAgICAgcCArPSBwcmludF9pbnNuX21vZGUgKHNpemUsIHAwICsgMSwgYWRkciArIDEsIGluZm8pOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbJXNdIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDUwOiAvKiByZWdpc3RlcjoJCQlSbiAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg2MDogLyogcmVnaXN0ZXIgZGVmZXJyZWQ6CQkoUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiglcykiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NzA6IC8qIGF1dG9kZWNyZW1lbnQ6CQktKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItKCVzKSIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg4MDogLyogYXV0b2luY3JlbWVudDoJCShSbikrICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQl7CS8qIGltbWVkaWF0ZT8gKi8KLQkgIGludCBpOwotCi0JICBGRVRDSF9EQVRBIChpbmZvLCBwICsgc2l6ZSk7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQweCIpOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlMDJ4IiwgcFtzaXplIC0gaSAtIDFdKTsKLQkgIHAgKz0gc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoJXMpKyIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg5MDogLyogYXV0b2luY3JlbWVudCBkZWZlcnJlZDoJQChSbikrICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioweCV4IiwgTkVYVExPTkcgKHApKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoJXMpKyIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhCMDogLyogZGlzcGxhY2VtZW50IGJ5dGUgZGVmZXJyZWQ6CSpkaXNwbChSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKiIpOwotICAgIGNhc2UgMHhBMDogLyogZGlzcGxhY2VtZW50IGJ5dGU6CQlkaXNwbChSbikgKi8KLSAgICAgIGlmIChyZWcgPT0gMHhGKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDIgKyBORVhUQllURSAocCksIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCglcykiLCBORVhUQllURSAocCksCi0JCQkgICAgICAgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweEQwOiAvKiBkaXNwbGFjZW1lbnQgd29yZCBkZWZlcnJlZDoJKmRpc3BsKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqIik7Ci0gICAgY2FzZSAweEMwOiAvKiBkaXNwbGFjZW1lbnQgd29yZDoJCWRpc3BsKFJuKSAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMyArIE5FWFRXT1JEIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4KCVzKSIsIE5FWFRXT1JEIChwKSwKLQkJCSAgICAgICByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4RjA6IC8qIGRpc3BsYWNlbWVudCBsb25nIGRlZmVycmVkOgkqZGlzcGwoUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioiKTsKLSAgICBjYXNlIDB4RTA6IC8qIGRpc3BsYWNlbWVudCBsb25nOgkJZGlzcGwoUm4pICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyA1ICsgTkVYVExPTkcgKHApLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgoJXMpIiwgTkVYVExPTkcgKHApLAotCQkJICAgICAgIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcCAtIHAwOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy93NjUtZGlzLmMgYi9vcGNvZGVzL3c2NS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyZTg5Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3c2NS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBXREMgNjU4MTYgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgU1RBVElDX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAidzY1LW9wYy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotc3RhdGljICAgZnByaW50Zl9mdHlwZSBmcHI7Ci1zdGF0aWMgICB2b2lkICpzdHJlYW07Ci1zdGF0aWMgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqbG9jYWxfaW5mbzsKLSNpZiAwCi1zdGF0aWMgY2hhciAqbG5hbWVbXSA9ICB7InIwIiwicjEiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiwicjciLCJzMCJ9OwotCi1zdGF0aWMgY2hhciAqZmluZG5hbWUgKHZhbCkKLSAgICAgdW5zaWduZWQgaW50IHZhbDsKLXsKLSAgaWYgKHZhbCA+PSAweDEwICYmIHZhbCA8PSAweDIwKQotICAgIHJldHVybiBsbmFtZVsodmFsIC0gMHgxMCkgLyAyXTsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChsb29rdXAsIGZvcm1hdCwgYXJncykKLSAgICAgaW50IGxvb2t1cDsKLSAgICAgY2hhciAqZm9ybWF0OwotICAgICB1bnNpZ25lZCAgICAgaW50ICphcmdzOwotewotICBpbnQgdmFsOwotICBpbnQgYzsKLQotICB3aGlsZSAoKmZvcm1hdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCBjID0gKmZvcm1hdCsrKSAKLQl7Ci0JY2FzZSAnJCc6Ci0JICB2YWwgPSBhcmdzWygqZm9ybWF0KyspIC0gJzAnXTsKLQkgIGlmIChsb29rdXApIAotCSAgICB7Ci0jaWYgMAotCSAgICAgIG5hbWUgPSBmaW5kbmFtZSh2YWwpOwotCSAgICAgIGlmIChuYW1lKQotCQlmcHIoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkgICAgICBlbHNlCi0jZW5kaWYKLQkJbG9jYWxfaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGxvY2FsX2luZm8pOyAgCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgZnByIChzdHJlYW0sICIweCV4IiwgdmFsKTsKLQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGZwcihzdHJlYW0sIiVjIiwgYyk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotaW50IAotcHJpbnRfaW5zbl93NjUobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLQotCi0gIGludCBzdGF0dXMgPSAwOwotICB1bnNpZ25lZCBjaGFyIGluc25bNF07Ci0gIHJlZ2lzdGVyIHN0cnVjdCBvcGluZm8gKm9wOwotICBpbnQgaTsKLSAgaW50IFggPTA7Ci0gIGludCBNID0gMDsKLSAgaW50IGFyZ3NbMl07Ci1zdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwciA9IGluZm8tPmZwcmludGZfZnVuYzsKLWxvY2FsX2luZm8gPSAgICBpbmZvOwotICBmb3IgKGkgPSAwOyBpIDw0ICYmIHN0YXR1cyA9PSAwOyBpKyspIAotICAgIHsKLSAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKG1lbWFkZHIraSwgaW5zbiArIGksIDEsIGluZm8pOwotICB9Ci0KLQotICBmb3IgKG9wID0gb3B0YWJsZTsgb3AtPnZhbCAhPSBpbnNuWzBdOyBvcCsrKSAKLSAgICA7Ci0KLSAgZnByKHN0cmVhbSwiJXMiLCBvcC0+bmFtZSk7Ci0gIAotICAvKiBQcmVwYXJlIGFsbCB0aGUgcG9zaWJsZSBvcGVyYW5kIHZhbHVlcyAqLwotICB7Ci0gICAgaW50IHNpemUgPSAxOwotICAgIGludCBhc1JfVzY1X0FCUzggPSBpbnNuWzFdOwotICAgIGludCBhc1JfVzY1X0FCUzE2ID0gKGluc25bMl0gPDwgOCkgKyBhc1JfVzY1X0FCUzg7Ci0gICAgaW50IGFzUl9XNjVfQUJTMjQgPSAoaW5zblszXSA8PCAxNikgKyBhc1JfVzY1X0FCUzE2OwotICAgIGludCBhc1JfVzY1X1BDUjggPSAoKGNoYXIpKGFzUl9XNjVfQUJTOCkpICsgbWVtYWRkciArIDI7Ci0gICAgaW50IGFzUl9XNjVfUENSMTYgPSAoKHNob3J0KShhc1JfVzY1X0FCUzE2KSkgKyBtZW1hZGRyICsgMzsKLQotICAgIHN3aXRjaCAob3AtPmFtb2RlKSB7Ci0gICAgICBESVNBU00oKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHNpemU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy93NjUtb3BjLmggYi9vcGNvZGVzL3c2NS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjMzUzNS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3c2NS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0OCArMCwwIEBACi0JCQkvKiBXREMgNjU4MTYgQXNzZW1ibGVyIG9wY29kZSB0YWJsZSAqLwotCQkJLyogICAoZ2VuZXJhdGVkIGJ5IHRoZSBwcm9ncmFtIHNpbS93NjUvZ2VuY29kZSAtYSkgKi8KLSNkZWZpbmUgQUREUl9JTU1UT0EgICAgICAgICAgICAgIDEJIC8qICNhICAgICAgKi8KLSNkZWZpbmUgQUREUl9JTU1DT1AgICAgICAgICAgICAgIDIJIC8qICNjICAgICAgKi8KLSNkZWZpbmUgQUREUl9JTU1UT0kgICAgICAgICAgICAgIDMJIC8qICNpICAgICAgKi8KLSNkZWZpbmUgQUREUl9BQ0MgICAgICAgICAgICAgICAgIDQJIC8qIEEgICAgICAgKi8KLSNkZWZpbmUgQUREUl9QQ19SRUwgICAgICAgICAgICAgIDUJIC8qIHIgICAgICAgKi8KLSNkZWZpbmUgQUREUl9QQ19SRUxfTE9ORyAgICAgICAgIDYJIC8qIHJsICAgICAgKi8KLSNkZWZpbmUgQUREUl9JTVBMSUVEICAgICAgICAgICAgIDcJIC8qIGkgICAgICAgKi8KLSNkZWZpbmUgQUREUl9TVEFDSyAgICAgICAgICAgICAgIDgJIC8qIHMgICAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVIgICAgICAgICAgICAgICAgIDkJIC8qIGQgICAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSURYX1ggICAgICAgICAgIDEwCSAvKiBkLHggICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lEWF9ZICAgICAgICAgICAxMQkgLyogZCx5ICAgICAqLwotI2RlZmluZSBBRERSX0RJUl9JTkQgICAgICAgICAgICAgMTIJIC8qIChkKSAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSURYX0lORF9YICAgICAgIDEzCSAvKiAoZCx4KSAgICovCi0jZGVmaW5lIEFERFJfRElSX0lORF9JRFhfWSAgICAgICAxNAkgLyogKGQpLHkgICAqLwotI2RlZmluZSBBRERSX0RJUl9JTkRfTE9ORyAgICAgICAgMTUJIC8qIFtkXSAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkcgIDE2CSAvKiBbZF0seSAgICovCi0jZGVmaW5lIEFERFJfQUJTICAgICAgICAgICAgICAgICAxNwkgLyogYSAgICAgICAqLwotI2RlZmluZSBBRERSX0FCU19JRFhfWCAgICAgICAgICAgMTgJIC8qIGEseCAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSURYX1kgICAgICAgICAgIDE5CSAvKiBhLHkgICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0xPTkcgICAgICAgICAgICAyMAkgLyogYWwgICAgICAqLwotI2RlZmluZSBBRERSX0FCU19JTkRfTE9ORyAgICAgICAgMjEJIC8qIFthXSAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfTE9OR19JRFhfWCAgICAgIDIyCSAvKiBhbCx4ICAgICovCi0jZGVmaW5lIEFERFJfU1RBQ0tfUkVMICAgICAgICAgICAyMwkgLyogZCxzICAgICAqLwotI2RlZmluZSBBRERSX1NUQUNLX1JFTF9JTkRYX0lEWCAgMjQJIC8qIChkLHMpLHkgKi8KLSNkZWZpbmUgQUREUl9BQlNfSU5EICAgICAgICAgICAgIDI1CSAvKiAoYSkgICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0lORF9JRFggICAgICAgICAyNgkgLyogKGEseCkgICAqLwotI2RlZmluZSBBRERSX0JMT0NLX01PVkUgICAgICAgICAgMjcJIC8qIHh5eiAgICAgKi8KLXN0cnVjdCBvcGluZm8gewotCWludCB2YWw7Ci0JaW50IGNvZGU7Ci0JY2hhciAqbmFtZTsKLQlpbnQgYW1vZGU7Ci19Owotc3RydWN0IG9waW5mbyBvcHRhYmxlWzI1N109ewotI2RlZmluZSBPX2FkYyAxCi0jZGVmaW5lIE9fYW5kIDIKLSNkZWZpbmUgT19hc2wgMwotI2RlZmluZSBPX2JjYyA0Ci0jZGVmaW5lIE9fYmNzIDUKLSNkZWZpbmUgT19iZXEgNgotI2RlZmluZSBPX2JpdCA3Ci0jZGVmaW5lIE9fYm1pIDgKLSNkZWZpbmUgT19ibmUgOQotI2RlZmluZSBPX2JwbCAxMAotI2RlZmluZSBPX2JyYSAxMQotI2RlZmluZSBPX2JyayAxMgotI2RlZmluZSBPX2JybCAxMwotI2RlZmluZSBPX2J2YyAxNAotI2RlZmluZSBPX2J2cyAxNQotI2RlZmluZSBPX2NsYyAxNgotI2RlZmluZSBPX2NsZCAxNwotI2RlZmluZSBPX2NsaSAxOAotI2RlZmluZSBPX2NsdiAxOQotI2RlZmluZSBPX2NtcCAyMAotI2RlZmluZSBPX2NvcCAyMQotI2RlZmluZSBPX2NweCAyMgotI2RlZmluZSBPX2NweSAyMwotI2RlZmluZSBPX2RlYyAyNAotI2RlZmluZSBPX2RleCAyNQotI2RlZmluZSBPX2RleSAyNgotI2RlZmluZSBPX2VvciAyNwotI2RlZmluZSBPX2luYyAyOAotI2RlZmluZSBPX2lueCAyOQotI2RlZmluZSBPX2lueSAzMAotI2RlZmluZSBPX2ptcCAzMQotI2RlZmluZSBPX2pzciAzMgotI2RlZmluZSBPX2xkYSAzMwotI2RlZmluZSBPX2xkeCAzNAotI2RlZmluZSBPX2xkeSAzNQotI2RlZmluZSBPX2xzciAzNgotI2RlZmluZSBPX212biAzNwotI2RlZmluZSBPX212cCAzOAotI2RlZmluZSBPX25vcCAzOQotI2RlZmluZSBPX29yYSA0MAotI2RlZmluZSBPX3BlYSA0MQotI2RlZmluZSBPX3BlaSA0MgotI2RlZmluZSBPX3BlciA0MwotI2RlZmluZSBPX3BoYSA0NAotI2RlZmluZSBPX3BoYiA0NQotI2RlZmluZSBPX3BoZCA0NgotI2RlZmluZSBPX3BoayA0NwotI2RlZmluZSBPX3BocCA0OAotI2RlZmluZSBPX3BoeCA0OQotI2RlZmluZSBPX3BoeSA1MAotI2RlZmluZSBPX3BsYSA1MQotI2RlZmluZSBPX3BsYiA1MgotI2RlZmluZSBPX3BsZCA1MwotI2RlZmluZSBPX3BscCA1NAotI2RlZmluZSBPX3BseCA1NQotI2RlZmluZSBPX3BseSA1NgotI2RlZmluZSBPX3JlcCA1NwotI2RlZmluZSBPX3JvbCA1OAotI2RlZmluZSBPX3JvciA1OQotI2RlZmluZSBPX3J0aSA2MAotI2RlZmluZSBPX3J0bCA2MQotI2RlZmluZSBPX3J0cyA2MgotI2RlZmluZSBPX3NiYyA2MwotI2RlZmluZSBPX3NlYyA2NAotI2RlZmluZSBPX3NlZCA2NQotI2RlZmluZSBPX3NlaSA2NgotI2RlZmluZSBPX3NlcCA2NwotI2RlZmluZSBPX3N0YSA2OAotI2RlZmluZSBPX3N0cCA2OQotI2RlZmluZSBPX3N0eCA3MAotI2RlZmluZSBPX3N0eSA3MQotI2RlZmluZSBPX3N0eiA3MgotI2RlZmluZSBPX3RheCA3MwotI2RlZmluZSBPX3RheSA3NAotI2RlZmluZSBPX3RjZCA3NQotI2RlZmluZSBPX3RjcyA3NgotI2RlZmluZSBPX3RkYyA3NwotI2RlZmluZSBPX3RyYiA3OAotI2RlZmluZSBPX3RzYiA3OQotI2RlZmluZSBPX3RzYyA4MAotI2RlZmluZSBPX3RzeCA4MQotI2RlZmluZSBPX3R4YSA4MgotI2RlZmluZSBPX3R4cyA4MwotI2RlZmluZSBPX3R4eSA4NAotI2RlZmluZSBPX3R5YSA4NQotI2RlZmluZSBPX3R5eCA4NgotI2RlZmluZSBPX3dhaSA4NwotI2RlZmluZSBPX3dkbSA4OAotI2RlZmluZSBPX3hiYSA4OQotI2RlZmluZSBPX3hjZSA5MAotI2lmZGVmIERFRklORV9UQUJMRQotCXsweDY5LAlPX2FkYywJImFkYyIsCUFERFJfSU1NVE9BfSwKLQl7MHg3MiwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkR9LAotCXsweDcxLAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4NzMsCU9fYWRjLAkiYWRjIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweDYxLAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4NjcsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweDc3LAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHg2RCwJT19hZGMsCSJhZGMiLAlBRERSX0FCU30sCi0JezB4N0QsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDc5LAlPX2FkYywJImFkYyIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHg2RiwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19MT05HfSwKLQl7MHg3RiwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHg2NSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUn0sCi0JezB4NjMsCU9fYWRjLAkiYWRjIiwJQUREUl9TVEFDS19SRUx9LAotCXsweDc1LAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHgyOSwJT19hbmQsCSJhbmQiLAlBRERSX0lNTVRPQX0sCi0JezB4MzIsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EfSwKLQl7MHgzMSwJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDMzLAlPX2FuZCwJImFuZCIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHgyMSwJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDI3LAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHgzNywJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4MkQsCU9fYW5kLAkiYW5kIiwJQUREUl9BQlN9LAotCXsweDNELAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHgzOSwJT19hbmQsCSJhbmQiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4MkYsCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfTE9OR30sCi0JezB4M0YsCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4MjUsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJ9LAotCXsweDIzLAlPX2FuZCwJImFuZCIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHgzNSwJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MEEsCU9fYXNsLAkiYXNsIiwJQUREUl9BQ0N9LAotCXsweDBFLAlPX2FzbCwJImFzbCIsCUFERFJfQUJTfSwKLQl7MHgxRSwJT19hc2wsCSJhc2wiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MDYsCU9fYXNsLAkiYXNsIiwJQUREUl9ESVJ9LAotCXsweDE2LAlPX2FzbCwJImFzbCIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg5MCwJT19iY2MsCSJiY2MiLAlBRERSX1BDX1JFTH0sCi0JezB4QjAsCU9fYmNzLAkiYmNzIiwJQUREUl9QQ19SRUx9LAotCXsweEYwLAlPX2JlcSwJImJlcSIsCUFERFJfUENfUkVMfSwKLQl7MHg4OSwJT19iaXQsCSJiaXQiLAlBRERSX0lNTVRPQX0sCi0JezB4MjQsCU9fYml0LAkiYml0IiwJQUREUl9ESVJfSU5EfSwKLQl7MHgzNCwJT19iaXQsCSJiaXQiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDJDLAlPX2JpdCwJImJpdCIsCUFERFJfQUJTfSwKLQl7MHgzQywJT19iaXQsCSJiaXQiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MzAsCU9fYm1pLAkiYm1pIiwJQUREUl9QQ19SRUx9LAotCXsweEQwLAlPX2JuZSwJImJuZSIsCUFERFJfUENfUkVMfSwKLQl7MHgxMCwJT19icGwsCSJicGwiLAlBRERSX1BDX1JFTH0sCi0JezB4ODAsCU9fYnJhLAkiYnJhIiwJQUREUl9QQ19SRUx9LAotCXsweDAwLAlPX2JyaywJImJyayIsCUFERFJfU1RBQ0t9LAotCXsweDgyLAlPX2JybCwJImJybCIsCUFERFJfUENfUkVMX0xPTkd9LAotCXsweDUwLAlPX2J2YywJImJ2YyIsCUFERFJfUENfUkVMfSwKLQl7MHg3MCwJT19idnMsCSJidnMiLAlBRERSX1BDX1JFTH0sCi0JezB4MTgsCU9fY2xjLAkiY2xjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhEOCwJT19jbGQsCSJjbGQiLAlBRERSX0lNUExJRUR9LAotCXsweDU4LAlPX2NsaSwJImNsaSIsCUFERFJfSU1QTElFRH0sCi0JezB4QjgsCU9fY2x2LAkiY2x2IiwJQUREUl9JTVBMSUVEfSwKLQl7MHhDOSwJT19jbXAsCSJjbXAiLAlBRERSX0lNTVRPQX0sCi0JezB4RDIsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EfSwKLQl7MHhEMSwJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweEQzLAlPX2NtcCwJImNtcCIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHhDMSwJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweEM3LAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHhENywJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4Q0QsCU9fY21wLAkiY21wIiwJQUREUl9BQlN9LAotCXsweERELAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhEOSwJT19jbXAsCSJjbXAiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4Q0YsCU9fY21wLAkiY21wIiwJQUREUl9BQlNfTE9OR30sCi0JezB4REYsCU9fY21wLAkiY21wIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4QzUsCU9fY21wLAkiY21wIiwJQUREUl9ESVJ9LAotCXsweEMzLAlPX2NtcCwJImNtcCIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHhENSwJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MDIsCU9fY29wLAkiY29wIiwJQUREUl9JTU1DT1B9LAotCXsweEUwLAlPX2NweCwJImNweCIsCUFERFJfSU1NVE9JfSwKLQl7MHhFQywJT19jcHgsCSJjcHgiLAlBRERSX0FCU30sCi0JezB4RTQsCU9fY3B4LAkiY3B4IiwJQUREUl9ESVJ9LAotCXsweEMwLAlPX2NweSwJImNweSIsCUFERFJfSU1NVE9JfSwKLQl7MHhDQywJT19jcHksCSJjcHkiLAlBRERSX0FCU30sCi0JezB4QzQsCU9fY3B5LAkiY3B5IiwJQUREUl9ESVJ9LAotCXsweDNBLAlPX2RlYywJImRlYyIsCUFERFJfQUNDfSwKLQl7MHhDRSwJT19kZWMsCSJkZWMiLAlBRERSX0FCU30sCi0JezB4REUsCU9fZGVjLAkiZGVjIiwJQUREUl9BQlNfSURYX1h9LAotCXsweEM2LAlPX2RlYywJImRlYyIsCUFERFJfRElSfSwKLQl7MHhENiwJT19kZWMsCSJkZWMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4Q0EsCU9fZGV4LAkiZGV4IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg4OCwJT19kZXksCSJkZXkiLAlBRERSX0lNUExJRUR9LAotCXsweDQ5LAlPX2VvciwJImVvciIsCUFERFJfSU1NVE9BfSwKLQl7MHg1MiwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkR9LAotCXsweDUxLAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4NTMsCU9fZW9yLAkiZW9yIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweDQxLAlPX2VvciwJImVvciIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4NDcsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweDU3LAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHg0RCwJT19lb3IsCSJlb3IiLAlBRERSX0FCU30sCi0JezB4NUQsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDU5LAlPX2VvciwJImVvciIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHg0RiwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19MT05HfSwKLQl7MHg1RiwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHg0NSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUn0sCi0JezB4NDMsCU9fZW9yLAkiZW9yIiwJQUREUl9TVEFDS19SRUx9LAotCXsweDU1LAlPX2VvciwJImVvciIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHgxQSwJT19pbmMsCSJpbmMiLAlBRERSX0FDQ30sCi0JezB4RUUsCU9faW5jLAkiaW5jIiwJQUREUl9BQlN9LAotCXsweEZFLAlPX2luYywJImluYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhFNiwJT19pbmMsCSJpbmMiLAlBRERSX0RJUn0sCi0JezB4RjYsCU9faW5jLAkiaW5jIiwJQUREUl9ESVJfSURYX1h9LAotCXsweEU4LAlPX2lueCwJImlueCIsCUFERFJfSU1QTElFRH0sCi0JezB4QzgsCU9faW55LAkiaW55IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg2QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkR9LAotCXsweDdDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0lORF9JRFh9LAotCXsweERDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0lORF9MT05HfSwKLQl7MHg0QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU30sCi0JezB4NUMsCU9fam1wLAkiam1wIiwJQUREUl9BQlNfTE9OR30sCi0JezB4RkMsCU9fanNyLAkianNyIiwJQUREUl9BQlNfSU5EX0lEWH0sCi0JezB4MjAsCU9fanNyLAkianNyIiwJQUREUl9BQlN9LAotCXsweDIyLAlPX2pzciwJImpzciIsCUFERFJfQUJTX0xPTkd9LAotCXsweEE5LAlPX2xkYSwJImxkYSIsCUFERFJfSU1NVE9BfSwKLQl7MHhCMiwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkR9LAotCXsweEIxLAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4QjMsCU9fbGRhLAkibGRhIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweEExLAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4QTcsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweEI3LAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHhBRCwJT19sZGEsCSJsZGEiLAlBRERSX0FCU30sCi0JezB4QkQsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfSURYX1h9LAotCXsweEI5LAlPX2xkYSwJImxkYSIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHhBRiwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19MT05HfSwKLQl7MHhCRiwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHhBNSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUn0sCi0JezB4QTMsCU9fbGRhLAkibGRhIiwJQUREUl9TVEFDS19SRUx9LAotCXsweEI1LAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhBMiwJT19sZHgsCSJsZHgiLAlBRERSX0lNTVRPSX0sCi0JezB4QUUsCU9fbGR4LAkibGR4IiwJQUREUl9BQlN9LAotCXsweEJFLAlPX2xkeCwJImxkeCIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHhBNiwJT19sZHgsCSJsZHgiLAlBRERSX0RJUn0sCi0JezB4QjYsCU9fbGR4LAkibGR4IiwJQUREUl9ESVJfSURYX1l9LAotCXsweEEwLAlPX2xkeSwJImxkeSIsCUFERFJfSU1NVE9JfSwKLQl7MHhBQywJT19sZHksCSJsZHkiLAlBRERSX0FCU30sCi0JezB4QkMsCU9fbGR5LAkibGR5IiwJQUREUl9BQlNfSURYX1h9LAotCXsweEE0LAlPX2xkeSwJImxkeSIsCUFERFJfRElSfSwKLQl7MHhCNCwJT19sZHksCSJsZHkiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NEEsCU9fbHNyLAkibHNyIiwJQUREUl9BQ0N9LAotCXsweDRFLAlPX2xzciwJImxzciIsCUFERFJfQUJTfSwKLQl7MHg1RSwJT19sc3IsCSJsc3IiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4NDYsCU9fbHNyLAkibHNyIiwJQUREUl9ESVJ9LAotCXsweDU2LAlPX2xzciwJImxzciIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg1NCwJT19tdm4sCSJtdm4iLAlBRERSX0JMT0NLX01PVkV9LAotCXsweDQ0LAlPX212cCwJIm12cCIsCUFERFJfQkxPQ0tfTU9WRX0sCi0JezB4RUEsCU9fbm9wLAkibm9wIiwJQUREUl9JTVBMSUVEfSwKLQl7MHgwOSwJT19vcmEsCSJvcmEiLAlBRERSX0lNTVRPQX0sCi0JezB4MTIsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EfSwKLQl7MHgxMSwJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDEzLAlPX29yYSwJIm9yYSIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHgwMSwJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDA3LAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHgxNywJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4MEQsCU9fb3JhLAkib3JhIiwJQUREUl9BQlN9LAotCXsweDFELAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHgxOSwJT19vcmEsCSJvcmEiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4MEYsCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfTE9OR30sCi0JezB4MUYsCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4MDUsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJ9LAotCXsweDAzLAlPX29yYSwJIm9yYSIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHgxNSwJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4RjQsCU9fcGVhLAkicGVhIiwJQUREUl9BQlN9LAotCXsweEQ0LAlPX3BlaSwJInBlaSIsCUFERFJfRElSfSwKLQl7MHg2MiwJT19wZXIsCSJwZXIiLAlBRERSX1BDX1JFTF9MT05HfSwKLQl7MHg0OCwJT19waGEsCSJwaGEiLAlBRERSX1NUQUNLfSwKLQl7MHg4QiwJT19waGIsCSJwaGIiLAlBRERSX1NUQUNLfSwKLQl7MHgwQiwJT19waGQsCSJwaGQiLAlBRERSX1NUQUNLfSwKLQl7MHg0QiwJT19waGssCSJwaGsiLAlBRERSX1NUQUNLfSwKLQl7MHgwOCwJT19waHAsCSJwaHAiLAlBRERSX1NUQUNLfSwKLQl7MHhEQSwJT19waHgsCSJwaHgiLAlBRERSX1NUQUNLfSwKLQl7MHg1QSwJT19waHksCSJwaHkiLAlBRERSX1NUQUNLfSwKLQl7MHg2OCwJT19wbGEsCSJwbGEiLAlBRERSX1NUQUNLfSwKLQl7MHhBQiwJT19wbGIsCSJwbGIiLAlBRERSX1NUQUNLfSwKLQl7MHgyQiwJT19wbGQsCSJwbGQiLAlBRERSX1NUQUNLfSwKLQl7MHgyOCwJT19wbHAsCSJwbHAiLAlBRERSX1NUQUNLfSwKLQl7MHhGQSwJT19wbHgsCSJwbHgiLAlBRERSX1NUQUNLfSwKLQl7MHg3QSwJT19wbHksCSJwbHkiLAlBRERSX1NUQUNLfSwKLQl7MHhDMiwJT19yZXAsCSJyZXAiLAlBRERSX0lNTUNPUH0sCi0JezB4MkEsCU9fcm9sLAkicm9sIiwJQUREUl9BQ0N9LAotCXsweDJFLAlPX3JvbCwJInJvbCIsCUFERFJfQUJTfSwKLQl7MHgzRSwJT19yb2wsCSJyb2wiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MjYsCU9fcm9sLAkicm9sIiwJQUREUl9ESVJ9LAotCXsweDM2LAlPX3JvbCwJInJvbCIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg2QSwJT19yb3IsCSJyb3IiLAlBRERSX0FDQ30sCi0JezB4NkUsCU9fcm9yLAkicm9yIiwJQUREUl9BQlN9LAotCXsweDdFLAlPX3JvciwJInJvciIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg2NiwJT19yb3IsCSJyb3IiLAlBRERSX0RJUn0sCi0JezB4NzYsCU9fcm9yLAkicm9yIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDQwLAlPX3J0aSwJInJ0aSIsCUFERFJfU1RBQ0t9LAotCXsweDZCLAlPX3J0bCwJInJ0bCIsCUFERFJfU1RBQ0t9LAotCXsweDYwLAlPX3J0cywJInJ0cyIsCUFERFJfU1RBQ0t9LAotCXsweEU5LAlPX3NiYywJInNiYyIsCUFERFJfSU1NVE9BfSwKLQl7MHhGMiwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkR9LAotCXsweEYxLAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4RjMsCU9fc2JjLAkic2JjIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweEUxLAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4RTcsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweEY3LAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHhFRCwJT19zYmMsCSJzYmMiLAlBRERSX0FCU30sCi0JezB4RkQsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfSURYX1h9LAotCXsweEY5LAlPX3NiYywJInNiYyIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHhFRiwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19MT05HfSwKLQl7MHhGRiwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHhFNSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUn0sCi0JezB4RTMsCU9fc2JjLAkic2JjIiwJQUREUl9TVEFDS19SRUx9LAotCXsweEY1LAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHgzOCwJT19zZWMsCSJzZWMiLAlBRERSX0lNUExJRUR9LAotCXsweEY4LAlPX3NlZCwJInNlZCIsCUFERFJfSU1QTElFRH0sCi0JezB4NzgsCU9fc2VpLAkic2VpIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhFMiwJT19zZXAsCSJzZXAiLAlBRERSX0lNTUNPUH0sCi0JezB4OTIsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EfSwKLQl7MHg5MSwJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDkzLAlPX3N0YSwJInN0YSIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHg4MSwJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDg3LAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHg5NywJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4OEQsCU9fc3RhLAkic3RhIiwJQUREUl9BQlN9LAotCXsweDlELAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg5OSwJT19zdGEsCSJzdGEiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4OEYsCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfTE9OR30sCi0JezB4OUYsCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4ODUsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJ9LAotCXsweDgzLAlPX3N0YSwJInN0YSIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHg5NSwJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4REIsCU9fc3RwLAkic3RwIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg4RSwJT19zdHgsCSJzdHgiLAlBRERSX0FCU30sCi0JezB4ODYsCU9fc3R4LAkic3R4IiwJQUREUl9ESVJ9LAotCXsweDk2LAlPX3N0eCwJInN0eCIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg4QywJT19zdHksCSJzdHkiLAlBRERSX0FCU30sCi0JezB4ODQsCU9fc3R5LAkic3R5IiwJQUREUl9ESVJ9LAotCXsweDk0LAlPX3N0eSwJInN0eSIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg5QywJT19zdHosCSJzdHoiLAlBRERSX0FCU30sCi0JezB4OUUsCU9fc3R6LAkic3R6IiwJQUREUl9BQlNfSURYX1h9LAotCXsweDY0LAlPX3N0eiwJInN0eiIsCUFERFJfRElSfSwKLQl7MHg3NCwJT19zdHosCSJzdHoiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4QUEsCU9fdGF4LAkidGF4IiwJQUREUl9JTVBMSUVEfSwKLQl7MHhBOCwJT190YXksCSJ0YXkiLAlBRERSX0lNUExJRUR9LAotCXsweDVCLAlPX3RjZCwJInRjZCIsCUFERFJfSU1QTElFRH0sCi0JezB4MUIsCU9fdGNzLAkidGNzIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg3QiwJT190ZGMsCSJ0ZGMiLAlBRERSX0lNUExJRUR9LAotCXsweDFDLAlPX3RyYiwJInRyYiIsCUFERFJfQUJTfSwKLQl7MHgxNCwJT190cmIsCSJ0cmIiLAlBRERSX0RJUn0sCi0JezB4MEMsCU9fdHNiLAkidHNiIiwJQUREUl9BQlN9LAotCXsweDA0LAlPX3RzYiwJInRzYiIsCUFERFJfRElSfSwKLQl7MHgzQiwJT190c2MsCSJ0c2MiLAlBRERSX0lNUExJRUR9LAotCXsweEJBLAlPX3RzeCwJInRzeCIsCUFERFJfSU1QTElFRH0sCi0JezB4OEEsCU9fdHhhLAkidHhhIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg5QSwJT190eHMsCSJ0eHMiLAlBRERSX0lNUExJRUR9LAotCXsweDlCLAlPX3R4eSwJInR4eSIsCUFERFJfSU1QTElFRH0sCi0JezB4OTgsCU9fdHlhLAkidHlhIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhCQiwJT190eXgsCSJ0eXgiLAlBRERSX0lNUExJRUR9LAotCXsweENCLAlPX3dhaSwJIndhaSIsCUFERFJfSU1QTElFRH0sCi0JezB4NDIsCU9fd2RtLAkid2RtIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhFQiwJT194YmEsCSJ4YmEiLAlBRERSX0lNUExJRUR9LAotCXsweEZCLAlPX3hjZSwJInhjZSIsCUFERFJfSU1QTElFRH0sCi0JeyAwIH0KLX07Ci0jZW5kaWYKLSNkZWZpbmUgRElTQVNNKClcCi0gIGNhc2UgQUREUl9JTU1UT0E6XAotCWFyZ3NbMF0gPSBNPT0wID8gYXNSX1c2NV9BQlMxNiA6IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkjJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSBNPT0wID8gMjoxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9JTU1DT1A6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJIyQwIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfSU1NVE9JOlwKLQlhcmdzWzBdID0gWD09MCA/IGFzUl9XNjVfQUJTMTYgOiBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJIyQwIiwgYXJncyk7XAotCXNpemUgKz0gWD09MCA/IDI6MTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUNDOlwKLQlwcmludF9vcGVyYW5kICgwLCAiCWEiLCAwKTtcCi0Jc2l6ZSArPSAwO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9QQ19SRUw6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X1BDUjg7XAotCXByaW50X29wZXJhbmQgKDAsICIJJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9QQ19SRUxfTE9ORzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfUENSMTY7XAotCXByaW50X29wZXJhbmQgKDAsICIJJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9JTVBMSUVEOlwKLQkJc2l6ZSArPSAwO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9TVEFDSzpcCi0JCXNpemUgKz0gMDtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCTwkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JRFhfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk8JDAseCIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JRFhfWTpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk8JDAseSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JTkQ6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJKDwkMCkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSURYX0lORF9YOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSg8JDAseCkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSg8JDApLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJWyQwXSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JTkRfSURYX1lfTE9ORzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIglbJDBdLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlM6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSEkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19JRFhfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJISQwLHgiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSURYX1k6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSEkMCx5IiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzI0O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCT4kMCIsIGFyZ3MpO1wKLQlzaXplICs9IDM7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19JTkRfTE9ORzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJWz4kMF0iLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfTE9OR19JRFhfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMjQ7XAotCXByaW50X29wZXJhbmQgKDEsICIJPiQwLHgiLCBhcmdzKTtcCi0Jc2l6ZSArPSAzO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9TVEFDS19SRUw6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJJDAscyIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX1NUQUNLX1JFTF9JTkRYX0lEWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkoJDAscykseSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19JTkQ6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSgkMCkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSU5EX0lEWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJKCQwLHgpIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQkxPQ0tfTU9WRTpcCi0JYXJnc1swXSA9IChhc1JfVzY1X0FCUzE2ID4+OCkgJjB4ZmY7XAotCWFyZ3NbMV0gPSAoIGFzUl9XNjVfQUJTMTYgJiAweGZmKTtcCi0JcHJpbnRfb3BlcmFuZCAoMCwiCSQwLCQxIixhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0KLSNkZWZpbmUgR0VUSU5GTyhzaXplLHR5cGUscGNyZWwpXAotCWNhc2UgQUREUl9JTU1UT0E6IHNpemUgPSBNPT0wID8gMjoxO3R5cGU9TT09MCA/IFJfVzY1X0FCUzE2IDogUl9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfSU1NQ09QOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0lNTVRPSTogc2l6ZSA9IFg9PTAgPyAyOjE7dHlwZT1YPT0wID8gUl9XNjVfQUJTMTYgOiBSX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQ0M6IHNpemUgPSAwO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1BDX1JFTDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9QQ1I4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9QQ19SRUxfTE9ORzogc2l6ZSA9IDI7dHlwZT1SX1c2NV9QQ1IxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfSU1QTElFRDogc2l6ZSA9IDA7dHlwZT0tMTtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfU1RBQ0s6IHNpemUgPSAwO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUjogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSURYX1g6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lEWF9ZOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JTkQ6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lEWF9JTkRfWDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JTkRfTE9ORzogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkc6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSURYX1g6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JRFhfWTogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0xPTkc6IHNpemUgPSAzO3R5cGU9Ul9XNjVfQUJTMjQ7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JTkRfTE9ORzogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0xPTkdfSURYX1g6IHNpemUgPSAzO3R5cGU9Ul9XNjVfQUJTMjQ7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1NUQUNLX1JFTDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9TVEFDS19SRUxfSU5EWF9JRFg6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lORDogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lORF9JRFg6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0JMT0NLX01PVkU6IHNpemUgPSAyO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvejhrLWRpcy5jIGIvb3Bjb2Rlcy96OGstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjM2MjIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy96OGstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgejgwMDAgY29kZS4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlICJ6OGstb3BjLmgiCi0KLQwKLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotDAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlc2UgYXJlIGFsbCBpbmRleGVkIGJ5IG5pYmJsZSBudW1iZXIgKGkuZSBvbmx5IGV2ZXJ5IG90aGVyIGVudHJ5Ci0gICAgIG9mIGJ5dGVzIGlzIHVzZWQsIGFuZCBldmVyeSA0dGggZW50cnkgb2Ygd29yZHMpLiAgKi8KLSAgdW5zaWduZWQgY2hhciBuaWJibGVzWzI0XTsKLSAgdW5zaWduZWQgY2hhciBieXRlc1syNF07Ci0gIHVuc2lnbmVkIHNob3J0IHdvcmRzWzI0XTsKLQotICAvKiBOaWJibGUgbnVtYmVyIG9mIGZpcnN0IHdvcmQgbm90IHlldCBmZXRjaGVkLiAgKi8KLSAgaW50IG1heF9mZXRjaGVkOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLQotICBsb25nIHRhYmxfaW5kZXg7Ci0gIGNoYXIgaW5zdHJfYXNtc3JjWzgwXTsKLSAgdW5zaWduZWQgbG9uZyBhcmdfcmVnWzB4MGZdOwotICB1bnNpZ25lZCBsb25nIGltbWVkaWF0ZTsKLSAgdW5zaWduZWQgbG9uZyBkaXNwbGFjZW1lbnQ7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgdW5zaWduZWQgbG9uZyBjb25kX2NvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgY3RybF9jb2RlOwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICB1bnNpZ25lZCBsb25nIGludGVycnVwdHM7Ci19Ci1pbnN0cl9kYXRhX3M7Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIG5pYmJsZSkgXAotICAoKG5pYmJsZSkgPCAoKGluc3RyX2RhdGFfcyAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAobmliYmxlKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIG5pYmJsZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBuaWJibGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbXlidWZbMjBdOwotICBpbnQgc3RhdHVzOwotICBpbnN0cl9kYXRhX3MgKnByaXYgPSAoaW5zdHJfZGF0YV9zICopaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0gIGlmICgobmliYmxlICUgNCkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwcml2LT5pbnNuX3N0YXJ0LAotCQkJCSAgICAgIChiZmRfYnl0ZSAqKSBteWJ1ZiwKLQkJCQkgICAgICBuaWJibGUgLyAyLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcHJpdi0+aW5zbl9zdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0KLSAgewotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBteWJ1ZiA7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IG5pYmJsZTspCi0gICAgICB7Ci0JcHJpdi0+d29yZHNbaV0gPSAocFswXSA8PCA4KSB8IHBbMV07Ci0JCi0JcHJpdi0+Ynl0ZXNbaV0gPSAqcDsKLQlwcml2LT5uaWJibGVzW2krK10gPSAqcCA+PiA0OwotCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwICYweGY7Ci0KLQkrK3A7Ci0JcHJpdi0+Ynl0ZXNbaV0gPSAqcDsKLQlwcml2LT5uaWJibGVzW2krK10gPSAqcCA+PiA0OwotCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwICYgMHhmOwotCi0JKytwOwotICAgICAgfQotICB9Ci0gIHByaXYtPm1heF9mZXRjaGVkID0gbmliYmxlOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKmNvZGVzWzE2XSA9Ci17Ci0gICJmIiwKLSAgImx0IiwKLSAgImxlIiwKLSAgInVsZSIsCi0gICJvdi9wZSIsCi0gICJtaSIsCi0gICJlcSIsCi0gICJjL3VsdCIsCi0gICJ0IiwKLSAgImdlIiwKLSAgImd0IiwKLSAgInVndCIsCi0gICJub3YvcG8iLAotICAicGwiLAotICAibmUiLAotICAibmMvdWdlIgotfTsKLQotaW50IHo4a19sb29rdXBfaW5zdHIgUEFSQU1TICgodW5zaWduZWQgY2hhciosIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIHZvaWQgb3V0cHV0X2luc3RyCi0gIFBBUkFNUyAoKGluc3RyX2RhdGFfcyAqLCB1bnNpZ25lZCBsb25nLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyB2b2lkIHVucGFja19pbnN0ciBQQVJBTVMgKChpbnN0cl9kYXRhX3MgKiwgaW50LCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyB2b2lkIHVucGFyc2VfaW5zdHIgUEFSQU1TICgoaW5zdHJfZGF0YV9zICopKTsKLQotc3RhdGljIGludAotcHJpbnRfaW5zbl96OGsgKGFkZHIsIGluZm8sIGlzX3NlZ21lbnRlZCkKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgaXNfc2VnbWVudGVkOwotewotICBpbnN0cl9kYXRhX3MgaW5zdHJfZGF0YTsKLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmaW5zdHJfZGF0YTsKLSAgaW5zdHJfZGF0YS5tYXhfZmV0Y2hlZCA9IDA7Ci0gIGluc3RyX2RhdGEuaW5zbl9zdGFydCA9IGFkZHI7Ci0gIGlmIChzZXRqbXAgKGluc3RyX2RhdGEuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotICBpbnN0cl9kYXRhLnRhYmxfaW5kZXggPSB6OGtfbG9va3VwX2luc3RyIChpbnN0cl9kYXRhLm5pYmJsZXMsIGluZm8pOwotICBpZiAoaW5zdHJfZGF0YS50YWJsX2luZGV4ID4gMCkKLSAgICB7Ci0gICAgICB1bnBhY2tfaW5zdHIgKCZpbnN0cl9kYXRhLCBpc19zZWdtZW50ZWQsIGluZm8pOwotICAgICAgdW5wYXJzZV9pbnN0ciAoJmluc3RyX2RhdGEpOwotICAgICAgb3V0cHV0X2luc3RyICgmaW5zdHJfZGF0YSwgYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gejhrX3RhYmxlW2luc3RyX2RhdGEudGFibF9pbmRleF0ubGVuZ3RoOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIDQpOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIud29yZCAlMDJ4JTAyeCIsCi0JCQkgICAgIGluc3RyX2RhdGEuYnl0ZXNbMF0sIGluc3RyX2RhdGEuYnl0ZXNbMl0pOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotfQotCi1pbnQKLXByaW50X2luc25fejgwMDEgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc25fejhrIChhZGRyLCBpbmZvLCAxKTsKLX0KLQotaW50Ci1wcmludF9pbnNuX3o4MDAyIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3o4ayAoYWRkciwgaW5mbywgMCk7Ci19Ci0KLWludAotejhrX2xvb2t1cF9pbnN0ciAobmliYmxlcywgaW5mbykKLSAgICAgdW5zaWduZWQgY2hhciAqbmliYmxlczsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLQotICBpbnQgbmlibF9pbmRleCwgdGFibF9pbmRleDsKLSAgaW50IG5pYmxfbWF0Y2hlZDsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdHJfbmlibDsKLSAgdW5zaWduZWQgc2hvcnQgdGFibF9kYXR1bSwgZGF0dW1fY2xhc3MsIGRhdHVtX3ZhbHVlOwotCi0gIG5pYmxfbWF0Y2hlZCA9IDA7Ci0gIHRhYmxfaW5kZXggPSAwOwotICB3aGlsZSAoIW5pYmxfbWF0Y2hlZCAmJiB6OGtfdGFibGVbdGFibF9pbmRleF0ubmFtZSkKLSAgICB7Ci0gICAgICBuaWJsX21hdGNoZWQgPSAxOwotICAgICAgZm9yIChuaWJsX2luZGV4ID0gMDsgbmlibF9pbmRleCA8IHo4a190YWJsZVt0YWJsX2luZGV4XS5sZW5ndGggKiAyICYmIG5pYmxfbWF0Y2hlZDsgbmlibF9pbmRleCsrKQotCXsKLQkgIGlmICgobmlibF9pbmRleCAlIDQpID09IDApCi0JICAgIC8qIEZldGNoIG9uZSB3b3JkIGF0IGEgdGltZS4gICovCi0JICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfaW5kZXggKyA0KTsKLQkgIGluc3RyX25pYmwgPSBuaWJibGVzW25pYmxfaW5kZXhdOwotCi0JICB0YWJsX2RhdHVtID0gejhrX3RhYmxlW3RhYmxfaW5kZXhdLmJ5dGVfaW5mb1tuaWJsX2luZGV4XTsKLQkgIGRhdHVtX2NsYXNzID0gdGFibF9kYXR1bSAmIENMQVNTX01BU0s7Ci0JICBkYXR1bV92YWx1ZSA9IH5DTEFTU19NQVNLICYgdGFibF9kYXR1bTsKLQotCSAgc3dpdGNoIChkYXR1bV9jbGFzcykKLQkgICAgewotCSAgICBjYXNlIENMQVNTX0JJVDoKLQkgICAgICBpZiAoZGF0dW1fdmFsdWUgIT0gaW5zdHJfbmlibCkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18wMElJOgotCSAgICAgIGlmICghKCh+aW5zdHJfbmlibCkgJiAweDQpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzAxSUk6Ci0JICAgICAgaWYgKCEoaW5zdHJfbmlibCAmIDB4NCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMENDQzoKLQkgICAgICBpZiAoISgofmluc3RyX25pYmwpICYgMHg4KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18xQ0NDOgotCSAgICAgIGlmICghKGluc3RyX25pYmwgJiAweDgpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzBESVNQNzoKLQkgICAgICBpZiAoISgofmluc3RyX25pYmwpICYgMHg4KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBuaWJsX2luZGV4ICs9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMURJU1A3OgotCSAgICAgIGlmICghKGluc3RyX25pYmwgJiAweDgpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIG5pYmxfaW5kZXggKz0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU19SRUdOMDoKLQkgICAgICBpZiAoaW5zdHJfbmlibCA9PSAwKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTX0JJVF8xT1IyOgotCSAgICAgIGlmICgoaW5zdHJfbmlibCB8IDB4MikgIT0gKGRhdHVtX3ZhbHVlIHwgMHgyKSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChuaWJsX21hdGNoZWQpCi0JewotCSAgcmV0dXJuIHRhYmxfaW5kZXg7Ci0JfQotCi0gICAgICB0YWJsX2luZGV4Kys7Ci0gICAgfQotICByZXR1cm4gLTE7Ci0KLX0KLQotc3RhdGljIHZvaWQKLW91dHB1dF9pbnN0ciAoaW5zdHJfZGF0YSwgYWRkciwgaW5mbykKLSAgICAgaW5zdHJfZGF0YV9zICppbnN0cl9kYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBsb29wLCBsb29wX2xpbWl0OwotICBjaGFyIHRtcF9zdHJbMjBdOwotICBjaGFyIG91dF9zdHJbMTAwXTsKLQotICBzdHJjcHkgKG91dF9zdHIsICJcdCIpOwotCi0gIGxvb3BfbGltaXQgPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0ubGVuZ3RoICogMjsKLSAgRkVUQ0hfREFUQSAoaW5mbywgbG9vcF9saW1pdCk7Ci0gIGZvciAobG9vcCA9IDA7IGxvb3AgPCBsb29wX2xpbWl0OyBsb29wKyspCi0gICAgewotICAgICAgc3ByaW50ZiAodG1wX3N0ciwgIiV4IiwgaW5zdHJfZGF0YS0+bmliYmxlc1tsb29wXSk7Ci0gICAgICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotICAgIH0KLQotICB3aGlsZSAobG9vcCsrIDwgOCkKLSAgICB7Ci0gICAgICBzdHJjYXQgKG91dF9zdHIsICIgIik7Ci0gICAgfQotCi0gIHN0cmNhdCAob3V0X3N0ciwgaW5zdHJfZGF0YS0+aW5zdHJfYXNtc3JjKTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3V0X3N0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi11bnBhY2tfaW5zdHIgKGluc3RyX2RhdGEsIGlzX3NlZ21lbnRlZCwgaW5mbykKLSAgICAgaW5zdHJfZGF0YV9zICppbnN0cl9kYXRhOwotICAgICBpbnQgaXNfc2VnbWVudGVkOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgbmlibF9jb3VudCwgbG9vcDsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdHJfbmlibCwgaW5zdHJfYnl0ZSwgaW5zdHJfd29yZDsKLSAgbG9uZyBpbnN0cl9sb25nOwotICB1bnNpZ25lZCBzaG9ydCB0YWJsX2RhdHVtLCBkYXR1bV9jbGFzcywgZGF0dW1fdmFsdWU7Ci0KLSAgbmlibF9jb3VudCA9IDA7Ci0gIGxvb3AgPSAwOwotICB3aGlsZSAoejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmJ5dGVfaW5mb1tsb29wXSAhPSAwKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfY291bnQgKyA0IC0gKG5pYmxfY291bnQgJSA0KSk7Ci0gICAgICBpbnN0cl9uaWJsID0gaW5zdHJfZGF0YS0+bmliYmxlc1tuaWJsX2NvdW50XTsKLSAgICAgIGluc3RyX2J5dGUgPSBpbnN0cl9kYXRhLT5ieXRlc1tuaWJsX2NvdW50XTsKLSAgICAgIGluc3RyX3dvcmQgPSBpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50XTsKLQotICAgICAgdGFibF9kYXR1bSA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5ieXRlX2luZm9bbG9vcF07Ci0gICAgICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOwotICAgICAgZGF0dW1fdmFsdWUgPSB0YWJsX2RhdHVtICYgfkNMQVNTX01BU0s7Ci0KLSAgICAgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCi0JewotCWNhc2UgQ0xBU1NfWDoKLQkgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CQToKLQkgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JYOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19ESVNQOgotCSAgc3dpdGNoIChkYXR1bV92YWx1ZSkKLQkgICAgewotCSAgICBjYXNlIEFSR19ESVNQMTY6Ci0JICAgICAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfd29yZDsKLQkgICAgICBuaWJsX2NvdW50ICs9IDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0RJU1AxMjoKLQkgICAgICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl93b3JkICYgMHgwZmZmOwotCSAgICAgIG5pYmxfY291bnQgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JTU06Ci0JICBzd2l0Y2ggKGRhdHVtX3ZhbHVlKQotCSAgICB7Ci0JICAgIGNhc2UgQVJHX0lNTTQ6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfTklNODoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSAoLWluc3RyX2J5dGUpOwotCSAgICAgIG5pYmxfY291bnQgKz0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NODoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9ieXRlOwotCSAgICAgIG5pYmxfY291bnQgKz0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NMTY6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfd29yZDsKLQkgICAgICBuaWJsX2NvdW50ICs9IDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTMyOgotCSAgICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfY291bnQgKyA4KTsKLQkgICAgICBpbnN0cl9sb25nID0gKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnRdIDw8IDE2KQotCQl8IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50ICsgNF0pOwotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX2xvbmc7Ci0JICAgICAgbmlibF9jb3VudCArPSA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU1OOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmwgLSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU00TTE6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibCArIDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTV8xOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTV8yOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTI6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibCAmIDB4MzsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DQzoKLQkgIGluc3RyX2RhdGEtPmNvbmRfY29kZSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NUUkw6Ci0JICBpbnN0cl9kYXRhLT5jdHJsX2NvZGUgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19EQToKLQljYXNlIENMQVNTX0FERFJFU1M6Ci0JICBpZiAoaXNfc2VnbWVudGVkKQotCSAgICB7Ci0JICAgICAgaWYgKGluc3RyX25pYmwgJiAweDgpCi0JCXsKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2NvdW50ICsgOCk7Ci0JCSAgaW5zdHJfbG9uZyA9IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50XSA8PCAxNikKLQkJICAgIHwgKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnQgKyA0XSk7Ci0JCSAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9ICgoaW5zdHJfd29yZCAmIDB4N2YwMCkgPDwgOCkgKwotCQkgICAgKGluc3RyX2xvbmcgJiAweGZmZmYpOwotCQkgIG5pYmxfY291bnQgKz0gNzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSAoKGluc3RyX3dvcmQgJiAweDdmMDApIDw8IDgpICsKLQkJICAgIChpbnN0cl93b3JkICYgMHgwMGZmKTsKLQkJICBuaWJsX2NvdW50ICs9IDM7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9IGluc3RyX3dvcmQ7Ci0JICAgICAgbmlibF9jb3VudCArPSAzOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzBDQ0M6Ci0JICBpbnN0cl9kYXRhLT5jb25kX2NvZGUgPSBpbnN0cl9uaWJsICYgMHg3OwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18xQ0NDOgotCSAgaW5zdHJfZGF0YS0+Y29uZF9jb2RlID0gaW5zdHJfbmlibCAmIDB4NzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMERJU1A3OgotCSAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfYnl0ZSAmIDB4N2Y7Ci0JICBuaWJsX2NvdW50ICs9IDE7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzFESVNQNzoKLQkgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX2J5dGUgJiAweDdmOwotCSAgbmlibF9jb3VudCArPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wMUlJOgotCSAgaW5zdHJfZGF0YS0+aW50ZXJydXB0cyA9IGluc3RyX25pYmwgJiAweDM7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzAwSUk6Ci0JICBpbnN0cl9kYXRhLT5pbnRlcnJ1cHRzID0gaW5zdHJfbmlibCAmIDB4MzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQklUOgotCSAgLyogZG8gbm90aGluZyAqLwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JUjoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRkxBR1M6Ci0JICBpbnN0cl9kYXRhLT5mbGFncyA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFRzoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX0JZVEU6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19XT1JEOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfUVVBRDoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR04wOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbG9vcCArPSAxOwotICAgICAgbmlibF9jb3VudCArPSAxOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXVucGFyc2VfaW5zdHIgKGluc3RyX2RhdGEpCi0gICAgIGluc3RyX2RhdGFfcyAqaW5zdHJfZGF0YTsKLXsKLSAgdW5zaWduZWQgc2hvcnQgdGFibF9kYXR1bSwgZGF0dW1fY2xhc3MsIGRhdHVtX3ZhbHVlOwotICBpbnQgbG9vcCwgbG9vcF9saW1pdDsKLSAgY2hhciBvdXRfc3RyWzgwXSwgdG1wX3N0clsyNV07Ci0KLSAgc3ByaW50ZiAob3V0X3N0ciwgIlx0JXNcdCIsIHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5uYW1lKTsKLQotICBsb29wX2xpbWl0ID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLm5vcGVyYW5kczsKLSAgZm9yIChsb29wID0gMDsgbG9vcCA8IGxvb3BfbGltaXQ7IGxvb3ArKykKLSAgICB7Ci0gICAgICBpZiAobG9vcCkKLQlzdHJjYXQgKG91dF9zdHIsICIsIik7Ci0KLSAgICAgIHRhYmxfZGF0dW0gPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0uYXJnX2luZm9bbG9vcF07Ci0gICAgICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOwotICAgICAgZGF0dW1fdmFsdWUgPSB0YWJsX2RhdHVtICYgfkNMQVNTX01BU0s7Ci0KLSAgICAgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCi0JewotCWNhc2UgQ0xBU1NfWDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIweCUwbHgoUiVsZCkiLCBpbnN0cl9kYXRhLT5hZGRyZXNzLAotCQkgICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CQToKLQkgIHNwcmludGYgKHRtcF9zdHIsICJyJWxkKCMlbHgpIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0sCi0JCSAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CWDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJyJWxkKFIlbGQpIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0sCi0JCSAgIGluc3RyX2RhdGEtPmFyZ19yZWdbQVJHX1JYXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19ESVNQOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIiMweCUwbHgiLCBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSU1NOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIiMweCUwbHgiLCBpbnN0cl9kYXRhLT5pbW1lZGlhdGUpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ0M6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiJXMiLCBjb2Rlc1tpbnN0cl9kYXRhLT5jb25kX2NvZGVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NUUkw6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiMHglMGx4IiwgaW5zdHJfZGF0YS0+Y3RybF9jb2RlKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RBOgotCWNhc2UgQ0xBU1NfQUREUkVTUzoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIjMHglMGx4IiwgaW5zdHJfZGF0YS0+YWRkcmVzcyk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JUjoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJAUiVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0ZMQUdTOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIjB4JTBseCIsIGluc3RyX2RhdGEtPmZsYWdzKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19CWVRFOgotCSAgaWYgKGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID49IDB4OCkKLQkgICAgewotCSAgICAgIHNwcmludGYgKHRtcF9zdHIsICJybCVsZCIsCi0JCSAgICAgICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSAtIDB4OCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNwcmludGYgKHRtcF9zdHIsICJyaCVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgICAgfQotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiciVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19RVUFEOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInJxJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAicnIlbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgc3RyY3B5IChpbnN0cl9kYXRhLT5pbnN0cl9hc21zcmMsIG91dF9zdHIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy96OGstb3BjLmggYi9vcGNvZGVzL3o4ay1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5YTNhMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3o4ay1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MzggKzAsMCBAQAotCQkJLyogVEhJUyBGSUxFIElTIEFVVE9NQUdJQ0FMTFkgR0VORVJBVEVELCBET04nVCBFRElUIElUICovCi0jZGVmaW5lIEFSR19NQVNLIDB4MGYKLSNkZWZpbmUgQVJHX1NSQyAweDAxCi0jZGVmaW5lIEFSR19EU1QgMHgwMgotI2RlZmluZSBBUkdfUlMgMHgwMQotI2RlZmluZSBBUkdfUkQgMHgwMgotI2RlZmluZSBBUkdfUkEgMHgwMwotI2RlZmluZSBBUkdfUkIgMHgwNAotI2RlZmluZSBBUkdfUlIgMHgwNQotI2RlZmluZSBBUkdfUlggMHgwNgotI2RlZmluZSBBUkdfSU1NNCAweDAxCi0jZGVmaW5lIEFSR19JTU04IDB4MDIKLSNkZWZpbmUgQVJHX0lNTTE2IDB4MDMKLSNkZWZpbmUgQVJHX0lNTTMyIDB4MDQKLSNkZWZpbmUgQVJHX0lNTU4gMHgwNQotI2RlZmluZSBBUkdfSU1NTk1JTlVTMSAweDA1Ci0jZGVmaW5lIEFSR19JTU1fMSAweDA2Ci0jZGVmaW5lIEFSR19JTU1fMiAweDA3Ci0jZGVmaW5lIEFSR19ESVNQMTYgMHgwOAotI2RlZmluZSBBUkdfTklNOCAweDA5Ci0jZGVmaW5lIEFSR19JTU0yIDB4MGEKLSNkZWZpbmUgQVJHX0lNTTFPUjIgMHgwYgotI2RlZmluZSBBUkdfRElTUDEyIDB4MGIKLSNkZWZpbmUgQVJHX0RJU1A4IDB4MGMKLSNkZWZpbmUgQVJHX0lNTTRNMSAweDBkCi0jZGVmaW5lIENMQVNTX01BU0sgMHgxZmZmMAotI2RlZmluZSBDTEFTU19YIDB4MTAKLSNkZWZpbmUgQ0xBU1NfQkEgMHgyMAotI2RlZmluZSBDTEFTU19EQSAweDMwCi0jZGVmaW5lIENMQVNTX0JYIDB4NDAKLSNkZWZpbmUgQ0xBU1NfRElTUCAweDUwCi0jZGVmaW5lIENMQVNTX0lNTSAweDYwCi0jZGVmaW5lIENMQVNTX0NDIDB4NzAKLSNkZWZpbmUgQ0xBU1NfQ1RSTCAweDgwCi0jZGVmaW5lIENMQVNTX0FERFJFU1MgMHhkMAotI2RlZmluZSBDTEFTU18wQ0NDIDB4ZTAKLSNkZWZpbmUgQ0xBU1NfMUNDQyAweGYwCi0jZGVmaW5lIENMQVNTXzBESVNQNyAweDEwMAotI2RlZmluZSBDTEFTU18xRElTUDcgMHgyMDAKLSNkZWZpbmUgQ0xBU1NfMDFJSSAweDMwMAotI2RlZmluZSBDTEFTU18wMElJIDB4NDAwCi0jZGVmaW5lIENMQVNTX0JJVCAweDUwMAotI2RlZmluZSBDTEFTU19GTEFHUyAweDYwMAotI2RlZmluZSBDTEFTU19JUiAweDcwMAotI2RlZmluZSBDTEFTU19ESVNQOCAweDgwMAotI2RlZmluZSBDTEFTU19CSVRfMU9SMiAweDkwMAotI2RlZmluZSBDTEFTU19SRUcgMHg3MDAwCi0jZGVmaW5lIENMQVNTX1JFR19CWVRFIDB4MjAwMAotI2RlZmluZSBDTEFTU19SRUdfV09SRCAweDMwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHX1FVQUQgMHg0MDAwCi0jZGVmaW5lIENMQVNTX1JFR19MT05HIDB4NTAwMAotI2RlZmluZSBDTEFTU19SRUdOMCAweDgwMDAKLSNkZWZpbmUgQ0xBU1NfUFIgMHgxMDAwMAotI2RlZmluZSBPUENfYWRjIDAKLSNkZWZpbmUgT1BDX2FkY2IgMQotI2RlZmluZSBPUENfYWRkIDIKLSNkZWZpbmUgT1BDX2FkZGIgMwotI2RlZmluZSBPUENfYWRkbCA0Ci0jZGVmaW5lIE9QQ19hbmQgNQotI2RlZmluZSBPUENfYW5kYiA2Ci0jZGVmaW5lIE9QQ19iaXQgNwotI2RlZmluZSBPUENfYml0YiA4Ci0jZGVmaW5lIE9QQ19jYWxsIDkKLSNkZWZpbmUgT1BDX2NhbHIgMTAKLSNkZWZpbmUgT1BDX2NsciAxMQotI2RlZmluZSBPUENfY2xyYiAxMgotI2RlZmluZSBPUENfY29tIDEzCi0jZGVmaW5lIE9QQ19jb21iIDE0Ci0jZGVmaW5lIE9QQ19jb21mbGcgMTUKLSNkZWZpbmUgT1BDX2NwIDE2Ci0jZGVmaW5lIE9QQ19jcGIgMTcKLSNkZWZpbmUgT1BDX2NwZCAxOAotI2RlZmluZSBPUENfY3BkYiAxOQotI2RlZmluZSBPUENfY3BkciAyMAotI2RlZmluZSBPUENfY3BkcmIgMjEKLSNkZWZpbmUgT1BDX2NwaSAyMgotI2RlZmluZSBPUENfY3BpYiAyMwotI2RlZmluZSBPUENfY3BpciAyNAotI2RlZmluZSBPUENfY3BpcmIgMjUKLSNkZWZpbmUgT1BDX2NwbCAyNgotI2RlZmluZSBPUENfY3BzZCAyNwotI2RlZmluZSBPUENfY3BzZGIgMjgKLSNkZWZpbmUgT1BDX2Nwc2RyIDI5Ci0jZGVmaW5lIE9QQ19jcHNkcmIgMzAKLSNkZWZpbmUgT1BDX2Nwc2kgMzEKLSNkZWZpbmUgT1BDX2Nwc2liIDMyCi0jZGVmaW5lIE9QQ19jcHNpciAzMwotI2RlZmluZSBPUENfY3BzaXJiIDM0Ci0jZGVmaW5lIE9QQ19kYWIgMzUKLSNkZWZpbmUgT1BDX2Riam56IDM2Ci0jZGVmaW5lIE9QQ19kZWMgMzcKLSNkZWZpbmUgT1BDX2RlY2IgMzgKLSNkZWZpbmUgT1BDX2RpIDM5Ci0jZGVmaW5lIE9QQ19kaXYgNDAKLSNkZWZpbmUgT1BDX2RpdmwgNDEKLSNkZWZpbmUgT1BDX2RqbnogNDIKLSNkZWZpbmUgT1BDX2VpIDQzCi0jZGVmaW5lIE9QQ19leCA0NAotI2RlZmluZSBPUENfZXhiIDQ1Ci0jZGVmaW5lIE9QQ19leHRzIDQ2Ci0jZGVmaW5lIE9QQ19leHRzYiA0NwotI2RlZmluZSBPUENfZXh0c2wgNDgKLSNkZWZpbmUgT1BDX2hhbHQgNDkKLSNkZWZpbmUgT1BDX2luIDUwCi0jZGVmaW5lIE9QQ19pbmIgNTEKLSNkZWZpbmUgT1BDX2luYyA1MgotI2RlZmluZSBPUENfaW5jYiA1MwotI2RlZmluZSBPUENfaW5kIDU0Ci0jZGVmaW5lIE9QQ19pbmRiIDU1Ci0jZGVmaW5lIE9QQ19pbmliIDU2Ci0jZGVmaW5lIE9QQ19pbmliciA1NwotI2RlZmluZSBPUENfaXJldCA1OAotI2RlZmluZSBPUENfanAgNTkKLSNkZWZpbmUgT1BDX2pyIDYwCi0jZGVmaW5lIE9QQ19sZCA2MQotI2RlZmluZSBPUENfbGRhIDYyCi0jZGVmaW5lIE9QQ19sZGFyIDYzCi0jZGVmaW5lIE9QQ19sZGIgNjQKLSNkZWZpbmUgT1BDX2xkY3RsIDY1Ci0jZGVmaW5lIE9QQ19sZGlyIDY2Ci0jZGVmaW5lIE9QQ19sZGlyYiA2NwotI2RlZmluZSBPUENfbGRrIDY4Ci0jZGVmaW5lIE9QQ19sZGwgNjkKLSNkZWZpbmUgT1BDX2xkbSA3MAotI2RlZmluZSBPUENfbGRwcyA3MQotI2RlZmluZSBPUENfbGRyIDcyCi0jZGVmaW5lIE9QQ19sZHJiIDczCi0jZGVmaW5lIE9QQ19sZHJsIDc0Ci0jZGVmaW5lIE9QQ19tYml0IDc1Ci0jZGVmaW5lIE9QQ19tcmVxIDc2Ci0jZGVmaW5lIE9QQ19tcmVzIDc3Ci0jZGVmaW5lIE9QQ19tc2V0IDc4Ci0jZGVmaW5lIE9QQ19tdWx0IDc5Ci0jZGVmaW5lIE9QQ19tdWx0bCA4MAotI2RlZmluZSBPUENfbmVnIDgxCi0jZGVmaW5lIE9QQ19uZWdiIDgyCi0jZGVmaW5lIE9QQ19ub3AgODMKLSNkZWZpbmUgT1BDX29yIDg0Ci0jZGVmaW5lIE9QQ19vcmIgODUKLSNkZWZpbmUgT1BDX291dCA4NgotI2RlZmluZSBPUENfb3V0YiA4NwotI2RlZmluZSBPUENfb3V0ZCA4OAotI2RlZmluZSBPUENfb3V0ZGIgODkKLSNkZWZpbmUgT1BDX291dGliIDkwCi0jZGVmaW5lIE9QQ19vdXRpYnIgOTEKLSNkZWZpbmUgT1BDX3BvcCA5MgotI2RlZmluZSBPUENfcG9wbCA5MwotI2RlZmluZSBPUENfcHVzaCA5NAotI2RlZmluZSBPUENfcHVzaGwgOTUKLSNkZWZpbmUgT1BDX3JlcyA5NgotI2RlZmluZSBPUENfcmVzYiA5NwotI2RlZmluZSBPUENfcmVzZmxnIDk4Ci0jZGVmaW5lIE9QQ19yZXQgOTkKLSNkZWZpbmUgT1BDX3JsIDEwMAotI2RlZmluZSBPUENfcmxiIDEwMQotI2RlZmluZSBPUENfcmxjIDEwMgotI2RlZmluZSBPUENfcmxjYiAxMDMKLSNkZWZpbmUgT1BDX3JsZGIgMTA0Ci0jZGVmaW5lIE9QQ19yciAxMDUKLSNkZWZpbmUgT1BDX3JyYiAxMDYKLSNkZWZpbmUgT1BDX3JyYyAxMDcKLSNkZWZpbmUgT1BDX3JyY2IgMTA4Ci0jZGVmaW5lIE9QQ19ycmRiIDEwOQotI2RlZmluZSBPUENfc2JjIDExMAotI2RlZmluZSBPUENfc2JjYiAxMTEKLSNkZWZpbmUgT1BDX3NkYSAxMTIKLSNkZWZpbmUgT1BDX3NkYWIgMTEzCi0jZGVmaW5lIE9QQ19zZGFsIDExNAotI2RlZmluZSBPUENfc2RsIDExNQotI2RlZmluZSBPUENfc2RsYiAxMTYKLSNkZWZpbmUgT1BDX3NkbGwgMTE3Ci0jZGVmaW5lIE9QQ19zZXQgMTE4Ci0jZGVmaW5lIE9QQ19zZXRiIDExOQotI2RlZmluZSBPUENfc2V0ZmxnIDEyMAotI2RlZmluZSBPUENfc2luYiAxMjEKLSNkZWZpbmUgT1BDX3NpbmQgMTIyCi0jZGVmaW5lIE9QQ19zaW5kYiAxMjMKLSNkZWZpbmUgT1BDX3NpbmliIDEyNAotI2RlZmluZSBPUENfc2luaWJyIDEyNQotI2RlZmluZSBPUENfc2xhIDEyNgotI2RlZmluZSBPUENfc2xhYiAxMjcKLSNkZWZpbmUgT1BDX3NsYWwgMTI4Ci0jZGVmaW5lIE9QQ19zbGwgMTI5Ci0jZGVmaW5lIE9QQ19zbGxiIDEzMAotI2RlZmluZSBPUENfc2xsbCAxMzEKLSNkZWZpbmUgT1BDX3NvdXQgMTMyCi0jZGVmaW5lIE9QQ19zb3V0YiAxMzMKLSNkZWZpbmUgT1BDX3NvdXRkIDEzNAotI2RlZmluZSBPUENfc291dGRiIDEzNQotI2RlZmluZSBPUENfc291dGliIDEzNgotI2RlZmluZSBPUENfc291dGliciAxMzcKLSNkZWZpbmUgT1BDX3NyYSAxMzgKLSNkZWZpbmUgT1BDX3NyYWIgMTM5Ci0jZGVmaW5lIE9QQ19zcmFsIDE0MAotI2RlZmluZSBPUENfc3JsIDE0MQotI2RlZmluZSBPUENfc3JsYiAxNDIKLSNkZWZpbmUgT1BDX3NybGwgMTQzCi0jZGVmaW5lIE9QQ19zdWIgMTQ0Ci0jZGVmaW5lIE9QQ19zdWJiIDE0NQotI2RlZmluZSBPUENfc3VibCAxNDYKLSNkZWZpbmUgT1BDX3RjYyAxNDcKLSNkZWZpbmUgT1BDX3RjY2IgMTQ4Ci0jZGVmaW5lIE9QQ190ZXN0IDE0OQotI2RlZmluZSBPUENfdGVzdGIgMTUwCi0jZGVmaW5lIE9QQ190ZXN0bCAxNTEKLSNkZWZpbmUgT1BDX3RyZGIgMTUyCi0jZGVmaW5lIE9QQ190cmRyYiAxNTMKLSNkZWZpbmUgT1BDX3RyaWIgMTU0Ci0jZGVmaW5lIE9QQ190cmlyYiAxNTUKLSNkZWZpbmUgT1BDX3RydGRyYiAxNTYKLSNkZWZpbmUgT1BDX3RydGliIDE1NwotI2RlZmluZSBPUENfdHJ0aXJiIDE1OAotI2RlZmluZSBPUENfdHJ0ZGIgMTU5Ci0jZGVmaW5lIE9QQ190c2V0IDE2MAotI2RlZmluZSBPUENfdHNldGIgMTYxCi0jZGVmaW5lIE9QQ194b3IgMTYyCi0jZGVmaW5lIE9QQ194b3JiIDE2MwotI2RlZmluZSBPUENfbGRkICAxNjQgCi0jZGVmaW5lIE9QQ19sZGRiICAxNjUgCi0jZGVmaW5lIE9QQ19sZGRyICAxNjYgCi0jZGVmaW5lIE9QQ19sZGRyYiAxNjcgIAotI2RlZmluZSBPUENfbGRpICAxNjggCi0jZGVmaW5lIE9QQ19sZGliIDE2OSAgCi0jZGVmaW5lIE9QQ19zYyAgIDE3MAotI2RlZmluZSBPUENfYnB0ICAgMTcxCi0jZGVmaW5lIE9QQ19leHQwZSAxNzIKLSNkZWZpbmUgT1BDX2V4dDBmIDE3MgotI2RlZmluZSBPUENfZXh0OGUgMTcyCi0jZGVmaW5lIE9QQ19leHQ4ZiAxNzIKLSNkZWZpbmUgT1BDX3JzdmQzNiAxNzIKLSNkZWZpbmUgT1BDX3JzdmQzOCAxNzIKLSNkZWZpbmUgT1BDX3JzdmQ3OCAxNzIKLSNkZWZpbmUgT1BDX3JzdmQ3ZSAxNzIKLSNkZWZpbmUgT1BDX3JzdmQ5ZCAxNzIKLSNkZWZpbmUgT1BDX3JzdmQ5ZiAxNzIKLSNkZWZpbmUgT1BDX3JzdmRiOSAxNzIKLSNkZWZpbmUgT1BDX3JzdmRiZiAxNzIKLSNkZWZpbmUgT1BDX291dGkgMTczCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWZkZWYgTklDRU5BTUVTCi1jaGFyICpuaWNlbmFtZTsKLWludCB0eXBlOwotaW50IGN5Y2xlczsKLWludCBmbGFnczsKLSNlbmRpZgotY2hhciAqbmFtZTsKLXVuc2lnbmVkIGNoYXIgb3Bjb2RlOwotdm9pZCAoKmZ1bmMpKCk7Ci11bnNpZ25lZCBpbnQgYXJnX2luZm9bNF07Ci11bnNpZ25lZCBpbnQgYnl0ZV9pbmZvWzEwXTsKLWludCBub3BlcmFuZHM7Ci1pbnQgbGVuZ3RoOwotaW50IGlkeDsKLX0gb3Bjb2RlX2VudHJ5X3R5cGU7Ci0jaWZkZWYgREVGSU5FX1RBQkxFCi1vcGNvZGVfZW50cnlfdHlwZSB6OGtfdGFibGVbXSA9IHsKLQotCi0vKiAxMDExIDAxMDEgc3NzcyBkZGRkICoqKiBhZGMgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGMgcmQscnMiLDE2LDUsCi0weDNjLAotI2VuZGlmCi0iYWRjIixPUENfYWRjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMH0sCi0KLQotLyogMTAxMSAwMTAwIHNzc3MgZGRkZCAqKiogYWRjYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRjYiByYmQscmJzIiw4LDUsCi0weDNmLAotI2VuZGlmCi0iYWRjYiIsT1BDX2FkY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxfSwKLQotCi0vKiAwMDAwIDAwMDEgc3NOMCBkZGRkICoqKiBhZGQgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLEBycyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyfSwKLQotCi0vKiAwMTAwIDAwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGQgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzfSwKLQotCi0vKiAwMTAwIDAwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGQgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNH0sCi0KLQotLyogMDAwMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogYWRkIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLGltbTE2IiwxNiw3LAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDV9LAotCi0KLS8qIDEwMDAgMDAwMSBzc3NzIGRkZGQgKioqIGFkZCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxycyIsMTYsNCwKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNn0sCi0KLQotLyogMDAwMCAwMDAwIHNzTjAgZGRkZCAqKiogYWRkYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQsQHJzIiw4LDcsCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw3fSwKLQotCi0vKiAwMTAwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDh9LAotCi0KLS8qIDAxMDAgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDl9LAotCi0KLS8qIDAwMDAgMDAwMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBhZGRiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQsaW1tOCIsOCw3LAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwxMH0sCi0KLQotLyogMTAwMCAwMDAwIHNzc3MgZGRkZCAqKiogYWRkYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQscmJzIiw4LDQsCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTF9LAotCi0KLS8qIDAwMDEgMDExMCBzc04wIGRkZGQgKioqIGFkZGwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLEBycyIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMn0sCi0KLQotLyogMDEwMSAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkbCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTUsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEzfSwKLQotCi0vKiAwMTAxIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDE2LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTR9LAotCi0KLS8qIDAwMDEgMDExMCAwMDAwIGRkZGQgaW1tMzIgKioqIGFkZGwgcnJkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQsaW1tMzIiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMTV9LAotCi0KLS8qIDEwMDEgMDExMCBzc3NzIGRkZGQgKioqIGFkZGwgcnJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLHJycyIsMzIsOCwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxNn0sCi0KLQotLyogMDAwMCAwMTExIHNzTjAgZGRkZCAqKiogYW5kIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxAcnMiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTd9LAotCi0KLS8qIDAxMDAgMDExMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE4fSwKLQotCi0vKiAwMTAwIDAxMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmQgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTl9LAotCi0KLS8qIDAwMDAgMDExMSAwMDAwIGRkZGQgaW1tMTYgKioqIGFuZCByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxpbW0xNiIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyMH0sCi0KLQotLyogMTAwMCAwMTExIHNzc3MgZGRkZCAqKiogYW5kIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLHJzIiwxNiw0LAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMX0sCi0KLQotLyogMDAwMCAwMTEwIHNzTjAgZGRkZCAqKiogYW5kYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQsQHJzIiw4LDcsCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMn0sCi0KLQotLyogMDEwMCAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyM30sCi0KLQotLyogMDEwMCAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjR9LAotCi0KLS8qIDAwMDAgMDExMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBhbmRiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQsaW1tOCIsOCw3LAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwyNX0sCi0KLQotLyogMTAwMCAwMTEwIHNzc3MgZGRkZCAqKiogYW5kYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQscmJzIiw4LDQsCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjZ9LAotCi0KLS8qIDAwMTAgMDExMSBkZE4wIGltbTQgKioqIGJpdCBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCBAcmQsaW1tNCIsMTYsOCwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyN30sCi0KLQotLyogMDExMCAwMTExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogYml0IGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IGFkZHJlc3NfZHN0KHJkKSxpbW00IiwxNiwxMSwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOH0sCi0KLQotLyogMDExMCAwMTExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogYml0IGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgYWRkcmVzc19kc3QsaW1tNCIsMTYsMTAsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOX0sCi0KLQotLyogMTAxMCAwMTExIGRkZGQgaW1tNCAqKiogYml0IHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgcmQsaW1tNCIsMTYsNCwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMH0sCi0KLQotLyogMDAxMCAwMTExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiBiaXQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgcmQscnMiLDE2LDEwLAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzF9LAotCi0KLS8qIDAwMTAgMDExMCBkZE4wIGltbTQgKioqIGJpdGIgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIEByZCxpbW00Iiw4LDgsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMn0sCi0KLQotLyogMDExMCAwMTEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogYml0YiBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgYWRkcmVzc19kc3QocmQpLGltbTQiLDgsMTEsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzM30sCi0KLQotLyogMDExMCAwMTEwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogYml0YiBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiBhZGRyZXNzX2RzdCxpbW00Iiw4LDEwLAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzNH0sCi0KLQotLyogMTAxMCAwMTEwIGRkZGQgaW1tNCAqKiogYml0YiByYmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgcmJkLGltbTQiLDgsNCwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDM1fSwKLQotCi0vKiAwMDEwIDAxMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIGJpdGIgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiByYmQscnMiLDgsMTAsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDM2fSwKLQotCi0vKiAwMDExIDAxMTAgMDAwMCAwMDAwICoqKiBicHQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJicHQiLDgsMiwKLTB4MDAsCi0jZW5kaWYKLSJicHQiLE9QQ19icHQsMCx7MH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDAsMiwzN30sCi0KLQotLyogMDAwMSAxMTExIGRkTjAgMDAwMCAqKiogY2FsbCBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjYWxsIEByZCIsMzIsMTAsCi0weDAwLAotI2VuZGlmCi0iY2FsbCIsT1BDX2NhbGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsMzh9LAotCi0KLS8qIDAxMDEgMTExMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QgKioqIGNhbGwgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjYWxsIGFkZHJlc3NfZHN0IiwzMiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJjYWxsIixPUENfY2FsbCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM5fSwKLQotCi0vKiAwMTAxIDExMTEgZGROMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjYWxsIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNhbGwgYWRkcmVzc19kc3QocmQpIiwzMiwxMywKLTB4MDAsCi0jZW5kaWYKLSJjYWxsIixPUENfY2FsbCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MH0sCi0KLQotLyogMTEwMSBkaXNwMTIgKioqIGNhbHIgZGlzcDEyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2FsciBkaXNwMTIiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotImNhbHIiLE9QQ19jYWxyLDAse0NMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzB4ZCxDTEFTU19ESVNQKyhBUkdfRElTUDEyKSwwLDAsMCwwLDAsMCwwLH0sMSwyLDQxfSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAxMDAwICoqKiBjbHIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyIEByZCIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDJ9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDEwMDAgYWRkcmVzc19kc3QgKioqIGNsciBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNsciBhZGRyZXNzX2RzdCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0iY2xyIixPUENfY2xyLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDN9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDEwMDAgYWRkcmVzc19kc3QgKioqIGNsciBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHIgYWRkcmVzc19kc3QocmQpIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDR9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDEwMDAgKioqIGNsciByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNsciByZCIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDQ1fSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAxMDAwICoqKiBjbHJiIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNscmIgQHJkIiw4LDgsCi0weDAwLAotI2VuZGlmCi0iY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDZ9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QgKioqIGNscmIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHJiIGFkZHJlc3NfZHN0Iiw4LDExLAotMHgwMCwKLSNlbmRpZgotImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDd9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QgKioqIGNscmIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyYiBhZGRyZXNzX2RzdChyZCkiLDgsMTIsCi0weDAwLAotI2VuZGlmCi0iY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDh9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDEwMDAgKioqIGNscmIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyYiByYmQiLDgsNywKLTB4MDAsCi0jZW5kaWYKLSJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDl9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAwMDAgKioqIGNvbSBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb20gQHJkIiwxNiwxMiwKLTB4MTgsCi0jZW5kaWYKLSJjb20iLE9QQ19jb20sMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTB9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbSBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbSBhZGRyZXNzX2RzdCIsMTYsMTUsCi0weDE4LAotI2VuZGlmCi0iY29tIixPUENfY29tLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTF9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbSBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb20gYWRkcmVzc19kc3QocmQpIiwxNiwxNiwKLTB4MTgsCi0jZW5kaWYKLSJjb20iLE9QQ19jb20sMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTJ9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDAwMDAgKioqIGNvbSByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbSByZCIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJjb20iLE9QQ19jb20sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDUzfSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMDAwICoqKiBjb21iIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWIgQHJkIiw4LDEyLAotMHgxYywKLSNlbmRpZgotImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDU0fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjb21iIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tYiBhZGRyZXNzX2RzdCIsOCwxNSwKLTB4MWMsCi0jZW5kaWYKLSJjb21iIixPUENfY29tYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDU1fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjb21iIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWIgYWRkcmVzc19kc3QocmQpIiw4LDE2LAotMHgxYywKLSNlbmRpZgotImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDU2fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAwMDAwICoqKiBjb21iIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWIgcmJkIiw4LDcsCi0weDFjLAotI2VuZGlmCi0iY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDU3fSwKLQotCi0vKiAxMDAwIDExMDEgZmxhZ3MgMDEwMSAqKiogY29tZmxnIGZsYWdzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tZmxnIGZsYWdzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotImNvbWZsZyIsT1BDX2NvbWZsZywwLHtDTEFTU19GTEFHUyx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0ZMQUdTLENMQVNTX0JJVCs1LDAsMCwwLDAsMCx9LDEsMiw1OH0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDAwMSBpbW0xNiAqKiogY3AgQHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgQHJkLGltbTE2IiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDU5fSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBjcCBhZGRyZXNzX2RzdChyZCksaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCBhZGRyZXNzX2RzdChyZCksaW1tMTYiLDE2LDE1LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsNjB9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGNwIGFkZHJlc3NfZHN0LGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgYWRkcmVzc19kc3QsaW1tMTYiLDE2LDE0LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiw2MX0sCi0KLQotLyogMDAwMCAxMDExIHNzTjAgZGRkZCAqKiogY3AgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQsQHJzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDYyfSwKLQotCi0vKiAwMTAwIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNjN9LAotCi0KLS8qIDAxMDAgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNjR9LAotCi0KLS8qIDAwMDAgMTAxMSAwMDAwIGRkZGQgaW1tMTYgKioqIGNwIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQsaW1tMTYiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNjV9LAotCi0KLS8qIDEwMDAgMTAxMSBzc3NzIGRkZGQgKioqIGNwIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQscnMiLDE2LDQsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDY2fSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMDAxIGltbTggaW1tOCAqKiogY3BiIEByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIEByZCxpbW04Iiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDY3fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogY3BiIGFkZHJlc3NfZHN0KHJkKSxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIGFkZHJlc3NfZHN0KHJkKSxpbW04Iiw4LDE1LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDY4fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogY3BiIGFkZHJlc3NfZHN0LGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgYWRkcmVzc19kc3QsaW1tOCIsOCwxNCwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDY5fSwKLQotCi0vKiAwMDAwIDEwMTAgc3NOMCBkZGRkICoqKiBjcGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQsQHJzIiw4LDcsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw3MH0sCi0KLQotLyogMDEwMCAxMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNzF9LAotCi0KLS8qIDAxMDAgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw3Mn0sCi0KLQotLyogMDAwMCAxMDEwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIGNwYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQsaW1tOCIsOCw3LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCw3M30sCi0KLQotLyogMTAwMCAxMDEwIHNzc3MgZGRkZCAqKiogY3BiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLHJicyIsOCw0LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDc0fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZCByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGQgcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGQiLE9QQ19jcGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3NX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGRiIHJiZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGRiIHJiZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BkYiIsT1BDX2NwZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3Nn0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGRyIHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwZHIgcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGRyIixPUENfY3BkciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzd9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkcmIgcmJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwZHJiIHJiZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BkcmIiLE9QQ19jcGRyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzh9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpIHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwaSByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwaSIsT1BDX2NwaSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc5fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwaWIgcmJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwaWIgcmJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGliIixPUENfY3BpYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDgwfSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwaXIgcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BpciByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwaXIiLE9QQ19jcGlyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODF9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpcmIgcmJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwaXJiIHJiZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BpcmIiLE9QQ19jcGlyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDgyfSwKLQotCi0vKiAwMDAxIDAwMDAgc3NOMCBkZGRkICoqKiBjcGwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQsQHJzIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw4M30sCi0KLQotLyogMDEwMSAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BsIHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQsYWRkcmVzc19zcmMiLDMyLDE1LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsODR9LAotCi0KLS8qIDAxMDEgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwbCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDE2LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDg1fSwKLQotCi0vKiAwMDAxIDAwMDAgMDAwMCBkZGRkIGltbTMyICoqKiBjcGwgcnJkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxpbW0zMiIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsODZ9LAotCi0KLS8qIDEwMDEgMDAwMCBzc3NzIGRkZGQgKioqIGNwbCBycmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxycnMiLDMyLDgsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDg3fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2QgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2QgQHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzZCIsT1BDX2Nwc2QsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODh9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZGIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2RiIEByZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzZGIiLE9QQ19jcHNkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4OX0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkciBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzZHIgQHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzZHIiLE9QQ19jcHNkciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5MH0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkcmIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2RyYiBAcmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwc2RyYiIsT1BDX2Nwc2RyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5MX0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNpIEByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwc2kiLE9QQ19jcHNpLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5Mn0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpYiBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzaWIgQHJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNpYiIsT1BDX2Nwc2liLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5M30sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpciBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzaXIgQHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzaXIiLE9QQ19jcHNpciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTR9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAxMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzaXJiIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNpcmIgQHJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNpcmIiLE9QQ19jcHNpcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDk1fSwKLQotCi0vKiAxMDExIDAwMDAgZGRkZCAwMDAwICoqKiBkYWIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGFiIHJiZCIsOCw1LAotMHgzOCwKLSNlbmRpZgotImRhYiIsT1BDX2RhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsOTZ9LAotCi0KLS8qIDExMTEgZGRkZCAwZGlzcDcgKioqIGRiam56IHJiZCxkaXNwNyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRiam56IHJiZCxkaXNwNyIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0iZGJqbnoiLE9QQ19kYmpueiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCsweGYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTXzBESVNQNywwLDAsMCwwLDAsMCx9LDIsMiw5N30sCi0KLQotLyogMDAxMCAxMDExIGRkTjAgaW1tNG0xICoqKiBkZWMgQHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlYyBAcmQsaW1tNG0xIiwxNiwxMSwKLTB4MWMsCi0jZW5kaWYKLSJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiw5OH0sCi0KLQotLyogMDExMCAxMDExIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWMgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwxNiwxNCwKLTB4MWMsCi0jZW5kaWYKLSJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCw5OX0sCi0KLQotLyogMDExMCAxMDExIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWMgYWRkcmVzc19kc3QsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjIGFkZHJlc3NfZHN0LGltbTRtMSIsMTYsMTMsCi0weDFjLAotI2VuZGlmCi0iZGVjIixPUENfZGVjLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxMDB9LAotCi0KLS8qIDEwMTAgMTAxMSBkZGRkIGltbTRtMSAqKiogZGVjIHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlYyByZCxpbW00bTEiLDE2LDQsCi0weDFjLAotI2VuZGlmCi0iZGVjIixPUENfZGVjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTAxfSwKLQotCi0vKiAwMDEwIDEwMTAgZGROMCBpbW00bTEgKioqIGRlY2IgQHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlY2IgQHJkLGltbTRtMSIsOCwxMSwKLTB4MWMsCi0jZW5kaWYKLSJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDEwMn0sCi0KLQotLyogMDExMCAxMDEwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDgsMTQsCi0weDFjLAotI2VuZGlmCi0iZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxMDN9LAotCi0KLS8qIDAxMTAgMTAxMCAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogZGVjYiBhZGRyZXNzX2RzdCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWNiIGFkZHJlc3NfZHN0LGltbTRtMSIsOCwxMywKLTB4MWMsCi0jZW5kaWYKLSJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTA0fSwKLQotCi0vKiAxMDEwIDEwMTAgZGRkZCBpbW00bTEgKioqIGRlY2IgcmJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlY2IgcmJkLGltbTRtMSIsOCw0LAotMHgxYywKLSNlbmRpZgotImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTA1fSwKLQotCi0vKiAwMTExIDExMDAgMDAwMCAwMGlpICoqKiBkaSBpMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpIGkyIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImRpIixPUENfZGksMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMiksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU18wMElJLDAsMCwwLDAsMCx9LDEsMiwxMDZ9LAotCi0KLS8qIDAwMDEgMTAxMSBzc04wIGRkZGQgKioqIGRpdiBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxAcnMiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEwN30sCi0KLQotLyogMDEwMSAxMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZGl2IHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQsYWRkcmVzc19zcmMiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTA4fSwKLQotCi0vKiAwMTAxIDEwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXYgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMDl9LAotCi0KLS8qIDAwMDEgMTAxMSAwMDAwIGRkZGQgaW1tMTYgKioqIGRpdiBycmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLGltbTE2IiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxMTB9LAotCi0KLS8qIDEwMDEgMTAxMSBzc3NzIGRkZGQgKioqIGRpdiBycmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLHJzIiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTExfSwKLQotCi0vKiAwMDAxIDEwMTAgc3NOMCBkZGRkICoqKiBkaXZsIHJxZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxAcnMiLDMyLDc0NCwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTEyfSwKLQotCi0vKiAwMTAxIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXZsIHJxZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLGFkZHJlc3Nfc3JjIiwzMiw3NDUsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTEzfSwKLQotCi0vKiAwMTAxIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXZsIHJxZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxhZGRyZXNzX3NyYyhycykiLDMyLDc0NiwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTE0fSwKLQotCi0vKiAwMDAxIDEwMTAgMDAwMCBkZGRkIGltbTMyICoqKiBkaXZsIHJxZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLGltbTMyIiwzMiw3NDQsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDExNX0sCi0KLQotLyogMTAwMSAxMDEwIHNzc3MgZGRkZCAqKiogZGl2bCBycWQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQscnJzIiwzMiw3NDQsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTZ9LAotCi0KLS8qIDExMTEgZGRkZCAxZGlzcDcgKioqIGRqbnogcmQsZGlzcDcgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkam56IHJkLGRpc3A3IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJkam56IixPUENfZGpueiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCsweGYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTXzFESVNQNywwLDAsMCwwLDAsMCx9LDIsMiwxMTd9LAotCi0KLS8qIDAxMTEgMTEwMCAwMDAwIDAxaWkgKioqIGVpIGkyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZWkgaTIiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0iZWkiLE9QQ19laSwwLHtDTEFTU19JTU0rKEFSR19JTU0yKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTXzAxSUksMCwwLDAsMCwwLH0sMSwyLDExOH0sCi0KLQotLyogMDAxMCAxMTAxIHNzTjAgZGRkZCAqKiogZXggcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXggcmQsQHJzIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJleCIsT1BDX2V4LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTl9LAotCi0KLS8qIDAxMTAgMTEwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4IHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXggcmQsYWRkcmVzc19zcmMiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTIwfSwKLQotCi0vKiAwMTEwIDExMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBleCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDE2LAotMHgwMCwKLSNlbmRpZgotImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyMX0sCi0KLQotLyogMTAxMCAxMTAxIHNzc3MgZGRkZCAqKiogZXggcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleCByZCxycyIsMTYsNiwKLTB4MDAsCi0jZW5kaWYKLSJleCIsT1BDX2V4LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMjJ9LAotCi0KLS8qIDAwMTAgMTEwMCBzc04wIGRkZGQgKioqIGV4YiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXhiIHJiZCxAcnMiLDgsMTIsCi0weDAwLAotI2VuZGlmCi0iZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMjN9LAotCi0KLS8qIDAxMTAgMTEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4YiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDE1LAotMHgwMCwKLSNlbmRpZgotImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjR9LAotCi0KLS8qIDAxMTAgMTEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4YiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXhiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTYsCi0weDAwLAotI2VuZGlmCi0iZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjV9LAotCi0KLS8qIDEwMTAgMTEwMCBzc3NzIGRkZGQgKioqIGV4YiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXhiIHJiZCxyYnMiLDgsNiwKLTB4MDAsCi0jZW5kaWYKLSJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyNn0sCi0KLQotLyogMDAwMCAxMTEwIGltbTggKioqIGV4dDBlIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHQwZSBpbW04Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImV4dDBlIixPUENfZXh0MGUsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMjd9LAotCi0KLS8qIDAwMDAgMTExMSBpbW04ICoqKiBleHQwZiBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0MGYgaW1tOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJleHQwZiIsT1BDX2V4dDBmLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTI4fSwKLQotCi0vKiAxMDAwIDExMTAgaW1tOCAqKiogZXh0OGUgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dDhlIGltbTgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iZXh0OGUiLE9QQ19leHQ4ZSwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhlLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEyOX0sCi0KLQotLyogMTAwMCAxMTExIGltbTggKioqIGV4dDhmIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHQ4ZiBpbW04Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImV4dDhmIixPUENfZXh0OGYsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMzB9LAotCi0KLS8qIDEwMTEgMDAwMSBkZGRkIDEwMTAgKioqIGV4dHMgcnJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0cyBycmQiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImV4dHMiLE9QQ19leHRzLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGEsMCwwLDAsMCwwLH0sMSwyLDEzMX0sCi0KLQotLyogMTAxMSAwMDAxIGRkZGQgMDAwMCAqKiogZXh0c2IgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHRzYiByZCIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJleHRzYiIsT1BDX2V4dHNiLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiwxMzJ9LAotCi0KLS8qIDEwMTEgMDAwMSBkZGRkIDAxMTEgKioqIGV4dHNsIHJxZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dHNsIHJxZCIsMzIsMTEsCi0weDAwLAotI2VuZGlmCi0iZXh0c2wiLE9QQ19leHRzbCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNywwLDAsMCwwLDAsfSwxLDIsMTMzfSwKLQotCi0vKiAwMTExIDEwMTAgMDAwMCAwMDAwICoqKiBoYWx0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaGFsdCIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJoYWx0IixPUENfaGFsdCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwwLDIsMTM0fSwKLQotCi0vKiAwMDExIDExMDEgc3NOMCBkZGRkICoqKiBpbiByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbiByZCxAcnMiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotImluIixPUENfaW4sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEzNX0sCi0KLQotLyogMDAxMSAxMTAxIGRkZGQgMDEwMCBpbW0xNiAqKiogaW4gcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbiByZCxpbW0xNiIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0iaW4iLE9QQ19pbiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTM2fSwKLQotCi0vKiAwMDExIDExMDAgc3NOMCBkZGRkICoqKiBpbmIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYiByYmQsQHJzIiw4LDEyLAotMHgwMCwKLSNlbmRpZgotImluYiIsT1BDX2luYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTM3fSwKLQotCi0vKiAwMDExIDEwMTAgZGRkZCAwMTAwIGltbTE2ICoqKiBpbmIgcmJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5iIHJiZCxpbW0xNiIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJpbmIiLE9QQ19pbmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDEzOH0sCi0KLQotLyogMDAxMCAxMDAxIGRkTjAgaW1tNG0xICoqKiBpbmMgQHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYyBAcmQsaW1tNG0xIiwxNiwxMSwKLTB4MWMsCi0jZW5kaWYKLSJpbmMiLE9QQ19pbmMsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTM5fSwKLQotCi0vKiAwMTEwIDEwMDEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDE2LDE0LAotMHgxYywKLSNlbmRpZgotImluYyIsT1BDX2luYywwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDB9LAotCi0KLS8qIDAxMTAgMTAwMSAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jIGFkZHJlc3NfZHN0LGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYyBhZGRyZXNzX2RzdCxpbW00bTEiLDE2LDEzLAotMHgxYywKLSNlbmRpZgotImluYyIsT1BDX2luYywwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0MX0sCi0KLQotLyogMTAxMCAxMDAxIGRkZGQgaW1tNG0xICoqKiBpbmMgcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jIHJkLGltbTRtMSIsMTYsNCwKLTB4MWMsCi0jZW5kaWYKLSJpbmMiLE9QQ19pbmMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrOSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTQyfSwKLQotCi0vKiAwMDEwIDEwMDAgZGROMCBpbW00bTEgKioqIGluY2IgQHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluY2IgQHJkLGltbTRtMSIsOCwxMSwKLTB4MWMsCi0jZW5kaWYKLSJpbmNiIixPUENfaW5jYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxNDN9LAotCi0KLS8qIDAxMTAgMTAwMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiw4LDE0LAotMHgxYywKLSNlbmRpZgotImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0NH0sCi0KLQotLyogMDExMCAxMDAwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmNiIGFkZHJlc3NfZHN0LGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluY2IgYWRkcmVzc19kc3QsaW1tNG0xIiw4LDEzLAotMHgxYywKLSNlbmRpZgotImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQ1fSwKLQotCi0vKiAxMDEwIDEwMDAgZGRkZCBpbW00bTEgKioqIGluY2IgcmJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluY2IgcmJkLGltbTRtMSIsOCw0LAotMHgxYywKLSNlbmRpZgotImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDE0Nn0sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBpbmQgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluZCBAcmQsQHJzLHJhIiwxNiwyMSwKLTB4MDQsCi0jZW5kaWYKLSJpbmQiLE9QQ19pbmQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxNDd9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDEwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogaW5kYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluZGIgQHJkLEBycyxyYmEiLDgsMjEsCi0weDA0LAotI2VuZGlmCi0iaW5kYiIsT1BDX2luZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxNDh9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogaW5pYiBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5pYiBAcmQsQHJzLHJhIiw4LDIxLAotMHgwNCwKLSNlbmRpZgotImluaWIiLE9QQ19pbmliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTQ5fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDAwIDAwMDAgYWFhYSBkZE4wIDAwMDAgKioqIGluaWJyIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmliciBAcmQsQHJzLHJhIiwxNiwyMSwKLTB4MDQsCi0jZW5kaWYKLSJpbmliciIsT1BDX2luaWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTUwfSwKLQotCi0vKiAwMTExIDEwMTEgMDAwMCAwMDAwICoqKiBpcmV0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaXJldCIsMTYsMTMsCi0weDNmLAotI2VuZGlmCi0iaXJldCIsT1BDX2lyZXQsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMCwyLDE1MX0sCi0KLQotLyogMDAwMSAxMTEwIGRkTjAgY2NjYyAqKioganAgY2MsQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ianAgY2MsQHJkIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJqcCIsT1BDX2pwLDAse0NMQVNTX0NDLENMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCwwLDAsMCwwLH0sMiwyLDE1Mn0sCi0KLQotLyogMDEwMSAxMTEwIDAwMDAgY2NjYyBhZGRyZXNzX2RzdCAqKioganAgY2MsYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJqcCBjYyxhZGRyZXNzX2RzdCIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJqcCIsT1BDX2pwLDAse0NMQVNTX0NDLENMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX0NDLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTUzfSwKLQotCi0vKiAwMTAxIDExMTAgZGROMCBjY2NjIGFkZHJlc3NfZHN0ICoqKiBqcCBjYyxhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJqcCBjYyxhZGRyZXNzX2RzdChyZCkiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0ianAiLE9QQ19qcCwwLHtDTEFTU19DQyxDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNTR9LAotCi0KLS8qIDExMTAgY2NjYyBkaXNwOCAqKioganIgY2MsZGlzcDggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJqciBjYyxkaXNwOCIsMTYsNiwKLTB4MDAsCi0jZW5kaWYKLSJqciIsT1BDX2pyLDAse0NMQVNTX0NDLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzB4ZSxDTEFTU19DQyxDTEFTU19ESVNQOCwwLDAsMCwwLDAsMCx9LDIsMiwxNTV9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAxMDEgaW1tMTYgKioqIGxkIEByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIEByZCxpbW0xNiIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE1Nn0sCi0KLQotLyogMDAxMCAxMTExIGRkTjAgc3NzcyAqKiogbGQgQHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgQHJkLHJzIiwxNiw4LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDE1N30sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDEwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogbGQgYWRkcmVzc19kc3QocmQpLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgYWRkcmVzc19kc3QocmQpLGltbTE2IiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDE1OH0sCi0KLQotLyogMDExMCAxMTExIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGQgYWRkcmVzc19kc3QocmQpLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgYWRkcmVzc19kc3QocmQpLHJzIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNTl9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGxkIGFkZHJlc3NfZHN0LGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgYWRkcmVzc19kc3QsaW1tMTYiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiwxNjB9LAotCi0KLS8qIDAxMTAgMTExMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkIGFkZHJlc3NfZHN0LHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgYWRkcmVzc19kc3QscnMiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTYxfSwKLQotCi0vKiAwMDExIDAwMTEgZGROMCBzc3NzIGltbTE2ICoqKiBsZCByZChpbW0xNikscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZChpbW0xNikscnMiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfQkErKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE2Mn0sCi0KLQotLyogMDExMSAwMDExIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZCByZChyeCkscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZChyeCkscnMiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfQlgrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE2M30sCi0KLQotLyogMDAxMCAwMDAxIHNzTjAgZGRkZCAqKiogbGQgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQsQHJzIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxNjR9LAotCi0KLS8qIDAxMTAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTY1fSwKLQotCi0vKiAwMTEwIDAwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNjZ9LAotCi0KLS8qIDAwMTAgMDAwMSAwMDAwIGRkZGQgaW1tMTYgKioqIGxkIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQsaW1tMTYiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE2N30sCi0KLQotLyogMTAxMCAwMDAxIHNzc3MgZGRkZCAqKiogbGQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxycyIsMTYsMywKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTY4fSwKLQotCi0vKiAwMDExIDAwMDEgc3NOMCBkZGRkIGltbTE2ICoqKiBsZCByZCxycyhpbW0xNikgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxycyhpbW0xNikiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfQkErKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE2OX0sCi0KLQotLyogMDExMSAwMDAxIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZCByZCxycyhyeCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxycyhyeCkiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfQlgrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE3MH0sCi0KLQotLyogMDExMSAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRhIHByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYSBwcmQsYWRkcmVzc19zcmMiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTcxfSwKLQotCi0vKiAwMTExIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGEgcHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYSBwcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMywKLTB4MDAsCi0jZW5kaWYKLSJsZGEiLE9QQ19sZGEsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNzJ9LAotCi0KLS8qIDAwMTEgMDEwMCBzc04wIGRkZGQgaW1tMTYgKioqIGxkYSBwcmQscnMoaW1tMTYpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhIHByZCxycyhpbW0xNikiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTczfSwKLQotCi0vKiAwMTExIDAxMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkYSBwcmQscnMocngpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhIHByZCxycyhyeCkiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTc0fSwKLQotCi0vKiAwMDExIDAxMDAgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRhciBwcmQsZGlzcDE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhciBwcmQsZGlzcDE2IiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGFyIixPUENfbGRhciwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDE3NX0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDEwMSBpbW04IGltbTggKioqIGxkYiBAcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBAcmQsaW1tOCIsOCw3LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDE3Nn0sCi0KLQotLyogMDAxMCAxMTEwIGRkTjAgc3NzcyAqKiogbGRiIEByZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgQHJkLHJicyIsOCw4LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMTc3fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogbGRiIGFkZHJlc3NfZHN0KHJkKSxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIGFkZHJlc3NfZHN0KHJkKSxpbW04Iiw4LDE1LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDE3OH0sCi0KLQotLyogMDExMCAxMTEwIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRiIGFkZHJlc3NfZHN0KHJkKSxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgYWRkcmVzc19kc3QocmQpLHJicyIsOCwxMiwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE3OX0sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDEwMSBhZGRyZXNzX2RzdCBpbW04IGltbTggKioqIGxkYiBhZGRyZXNzX2RzdCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIGFkZHJlc3NfZHN0LGltbTgiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNiwxODB9LAotCi0KLS8qIDAxMTAgMTExMCAwMDAwIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkYiBhZGRyZXNzX2RzdCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgYWRkcmVzc19kc3QscmJzIiw4LDExLAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxODF9LAotCi0KLS8qIDAwMTAgMDAwMCBzc04wIGRkZGQgKioqIGxkYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxAcnMiLDgsNywKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxODJ9LAotCi0KLS8qIDAxMTAgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxODN9LAotCi0KLS8qIDAxMTAgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTg0fSwKLQotCi0vKiAxMTAwIGRkZGQgaW1tOCAqKiogbGRiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxpbW04Iiw4LDUsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMiwyLDE4NX0sCi0KLQotLyogMTAxMCAwMDAwIHNzc3MgZGRkZCAqKiogbGRiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLHJicyIsOCwzLAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE4Nn0sCi0KLQotLyogMDAxMSAwMDAwIHNzTjAgZGRkZCBpbW0xNiAqKiogbGRiIHJiZCxycyhpbW0xNikgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLHJzKGltbTE2KSIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfQkErKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE4N30sCi0KLQotLyogMDExMSAwMDAwIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGIgcmJkLHJzKHJ4KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQscnMocngpIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTg4fSwKLQotCi0vKiAwMDExIDAwMTAgZGROMCBzc3NzIGltbTE2ICoqKiBsZGIgcmQoaW1tMTYpLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByZChpbW0xNikscmJzIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19CQSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTg5fSwKLQotCi0vKiAwMTExIDAwMTAgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkYiByZChyeCkscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJkKHJ4KSxyYnMiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0JYKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxOTB9LAotCi0KLS8qIDAxMTEgMTEwMSBzc3NzIDFjY2MgKioqIGxkY3RsIGN0cmwscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGN0bCBjdHJsLHJzIiwzMiw3LAotMHgwMCwKLSNlbmRpZgotImxkY3RsIixPUENfbGRjdGwsMCx7Q0xBU1NfQ1RSTCxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU18xQ0NDLDAsMCwwLDAsMCx9LDIsMiwxOTF9LAotCi0KLS8qIDAxMTEgMTEwMSBkZGRkIDBjY2MgKioqIGxkY3RsIHJkLGN0cmwgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGN0bCByZCxjdHJsIiwzMiw3LAotMHgwMCwKLSNlbmRpZgotImxkY3RsIixPUENfbGRjdGwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfQ1RSTCx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU18wQ0NDLDAsMCwwLDAsMCx9LDIsMiwxOTJ9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCAqKiogbGRkIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGQgQHJkLEBycyxyciIsMTYsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRkIixPUENfbGRkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxOTN9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCAqKiogbGRkYiBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRkYiBAcmQsQHJzLHJyIiw4LDExLAotMHgwNCwKLSNlbmRpZgotImxkZGIiLE9QQ19sZGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxOTR9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRkciBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRkciBAcmQsQHJzLHJyIiwxNiwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGRyIixPUENfbGRkciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTk1fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkZHJiIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGRyYiBAcmQsQHJzLHJyIiw4LDExLAotMHgwNCwKLSNlbmRpZgotImxkZHJiIixPUENfbGRkcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE5Nn0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGkgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkaSBAcmQsQHJzLHJyIiwxNiwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGkiLE9QQ19sZGksMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5N30sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGliIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGliIEByZCxAcnMscnIiLDgsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRpYiIsT1BDX2xkaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5OH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGlyIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGlyIEByZCxAcnMscnIiLDE2LDExLAotMHgwNCwKLSNlbmRpZgotImxkaXIiLE9QQ19sZGlyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxOTl9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRpcmIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkaXJiIEByZCxAcnMscnIiLDgsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRpcmIiLE9QQ19sZGlyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMjAwfSwKLQotCi0vKiAxMDExIDExMDEgZGRkZCBpbW00ICoqKiBsZGsgcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkayByZCxpbW00IiwxNiw1LAotMHgwMCwKLSNlbmRpZgotImxkayIsT1BDX2xkaywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjAxfSwKLQotCi0vKiAwMDAxIDExMDEgZGROMCBzc3NzICoqKiBsZGwgQHJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBAcmQscnJzIiwzMiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDIwMn0sCi0KLQotLyogMDEwMSAxMTAxIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRsIGFkZHJlc3NfZHN0KHJkKSxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgYWRkcmVzc19kc3QocmQpLHJycyIsMzIsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyMDN9LAotCi0KLS8qIDAxMDEgMTEwMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkbCBhZGRyZXNzX2RzdCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgYWRkcmVzc19kc3QscnJzIiwzMiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjA0fSwKLQotCi0vKiAwMDExIDAxMTEgZGROMCBzc3NzIGltbTE2ICoqKiBsZGwgcmQoaW1tMTYpLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCByZChpbW0xNikscnJzIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfQkErKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIwNX0sCi0KLQotLyogMDExMSAwMTExIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGwgcmQocngpLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCByZChyeCkscnJzIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfQlgrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDIwNn0sCi0KLQotLyogMDAwMSAwMTAwIHNzTjAgZGRkZCAqKiogbGRsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLEBycyIsMzIsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjA3fSwKLQotCi0vKiAwMTAxIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGwgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTIsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMDh9LAotCi0KLS8qIDAxMDEgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkbCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDEzLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIwOX0sCi0KLQotLyogMDAwMSAwMTAwIDAwMDAgZGRkZCBpbW0zMiAqKiogbGRsIHJyZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQsaW1tMzIiLDMyLDExLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDIxMH0sCi0KLQotLyogMTAwMSAwMTAwIHNzc3MgZGRkZCAqKiogbGRsIHJyZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLHJycyIsMzIsNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjExfSwKLQotCi0vKiAwMDExIDAxMDEgc3NOMCBkZGRkIGltbTE2ICoqKiBsZGwgcnJkLHJzKGltbTE2KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQscnMoaW1tMTYpIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfQkErKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIxMn0sCi0KLQotLyogMDExMSAwMTAxIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGwgcnJkLHJzKHJ4KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQscnMocngpIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfQlgrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDIxM30sCi0KLQotLyogMDAwMSAxMTAwIGRkTjAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxICoqKiBsZG0gQHJkLHJzLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gQHJkLHJzLG4iLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLDAsfSwzLDQsMjE0fSwKLQotCi0vKiAwMTAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEgYWRkcmVzc19kc3QgKioqIGxkbSBhZGRyZXNzX2RzdChyZCkscnMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSBhZGRyZXNzX2RzdChyZCkscnMsbiIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSx9LDMsNiwyMTV9LAotCi0KLS8qIDAxMDEgMTEwMCAwMDAwIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCAqKiogbGRtIGFkZHJlc3NfZHN0LHJzLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gYWRkcmVzc19kc3QscnMsbiIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLH0sMyw2LDIxNn0sCi0KLQotLyogMDAwMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxICoqKiBsZG0gcmQsQHJzLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gcmQsQHJzLG4iLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLDAsfSwzLDQsMjE3fSwKLQotCi0vKiAwMTAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgYWRkcmVzc19zcmMgKioqIGxkbSByZCxhZGRyZXNzX3NyYyhycyksbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSByZCxhZGRyZXNzX3NyYyhycyksbiIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSx9LDMsNiwyMTh9LAotCi0KLS8qIDAxMDEgMTEwMCAwMDAwIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyAqKiogbGRtIHJkLGFkZHJlc3Nfc3JjLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gcmQsYWRkcmVzc19zcmMsbiIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLH0sMyw2LDIxOX0sCi0KLQotLyogMDAxMSAxMDAxIHNzTjAgMDAwMCAqKiogbGRwcyBAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHBzIEBycyIsMTYsMTIsCi0weDNmLAotI2VuZGlmCi0ibGRwcyIsT1BDX2xkcHMsMCx7Q0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDIyMH0sCi0KLQotLyogMDExMSAxMDAxIDAwMDAgMDAwMCBhZGRyZXNzX3NyYyAqKiogbGRwcyBhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcHMgYWRkcmVzc19zcmMiLDE2LDE2LAotMHgzZiwKLSNlbmRpZgotImxkcHMiLE9QQ19sZHBzLDAse0NMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMSw0LDIyMX0sCi0KLQotLyogMDExMSAxMDAxIHNzTjAgMDAwMCBhZGRyZXNzX3NyYyAqKiogbGRwcyBhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHBzIGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTcsCi0weDNmLAotI2VuZGlmCi0ibGRwcyIsT1BDX2xkcHMsMCx7Q0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMSw0LDIyMn0sCi0KLQotLyogMDAxMSAwMDExIDAwMDAgc3NzcyBkaXNwMTYgKioqIGxkciBkaXNwMTYscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHIgZGlzcDE2LHJzIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZHIiLE9QQ19sZHIsMCx7Q0xBU1NfRElTUCxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjN9LAotCi0KLS8qIDAwMTEgMDAwMSAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZHIgcmQsZGlzcDE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRyIHJkLGRpc3AxNiIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRyIixPUENfbGRyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI0fSwKLQotCi0vKiAwMDExIDAwMTAgMDAwMCBzc3NzIGRpc3AxNiAqKiogbGRyYiBkaXNwMTYscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRyYiBkaXNwMTYscmJzIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkcmIiLE9QQ19sZHJiLDAse0NMQVNTX0RJU1AsQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI1fSwKLQotCi0vKiAwMDExIDAwMDAgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRyYiByYmQsZGlzcDE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRyYiByYmQsZGlzcDE2Iiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkcmIiLE9QQ19sZHJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI2fSwKLQotCi0vKiAwMDExIDAxMTEgMDAwMCBzc3NzIGRpc3AxNiAqKiogbGRybCBkaXNwMTYscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRybCBkaXNwMTYscnJzIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZHJsIixPUENfbGRybCwwLHtDTEFTU19ESVNQLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyN30sCi0KLQotLyogMDAxMSAwMTAxIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkcmwgcnJkLGRpc3AxNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcmwgcnJkLGRpc3AxNiIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRybCIsT1BDX2xkcmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjh9LAotCi0KLS8qIDAxMTEgMTAxMSAwMDAwIDEwMTAgKioqIG1iaXQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtYml0IiwxNiw3LAotMHgzOCwKLSNlbmRpZgotIm1iaXQiLE9QQ19tYml0LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0JJVCsweGEsMCwwLDAsMCwwLH0sMCwyLDIyOX0sCi0KLQotLyogMDExMSAxMDExIGRkZGQgMTEwMSAqKiogbXJlcSByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm1yZXEgcmQiLDE2LDEyLAotMHgxOCwKLSNlbmRpZgotIm1yZXEiLE9QQ19tcmVxLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGQsMCwwLDAsMCwwLH0sMSwyLDIzMH0sCi0KLQotLyogMDExMSAxMDExIDAwMDAgMTAwMSAqKiogbXJlcyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm1yZXMiLDE2LDUsCi0weDAwLAotI2VuZGlmCi0ibXJlcyIsT1BDX21yZXMsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzksMCwwLDAsMCwwLH0sMCwyLDIzMX0sCi0KLQotLyogMDExMSAxMDExIDAwMDAgMTAwMCAqKiogbXNldCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm1zZXQiLDE2LDUsCi0weDAwLAotI2VuZGlmCi0ibXNldCIsT1BDX21zZXQsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMCwyLDIzMn0sCi0KLQotLyogMDAwMSAxMDAxIHNzTjAgZGRkZCAqKiogbXVsdCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQsQHJzIiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIzM30sCi0KLQotLyogMDEwMSAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxhZGRyZXNzX3NyYyIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzNH0sCi0KLQotLyogMDEwMSAxMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQsYWRkcmVzc19zcmMocnMpIiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzNX0sCi0KLQotLyogMDAwMSAxMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogbXVsdCBycmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxpbW0xNiIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyMzZ9LAotCi0KLS8qIDEwMDEgMTAwMSBzc3NzIGRkZGQgKioqIG11bHQgcnJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQscnMiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs5LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIzN30sCi0KLQotLyogMDAwMSAxMDAwIHNzTjAgZGRkZCAqKiogbXVsdGwgcnFkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxAcnMiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjM4fSwKLQotCi0vKiAwMTAxIDEwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0bCBycWQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQsYWRkcmVzc19zcmMiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMzl9LAotCi0KLS8qIDAxMDEgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHRsIHJxZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQsYWRkcmVzc19zcmMocnMpIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI0MH0sCi0KLQotLyogMDAwMSAxMDAwIDAwMDAgZGRkZCBpbW0zMiAqKiogbXVsdGwgcnFkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLGltbTMyIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDI0MX0sCi0KLQotLyogMTAwMSAxMDAwIHNzc3MgZGRkZCAqKiogbXVsdGwgcnFkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxycnMiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI0Mn0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDAxMCAqKiogbmVnIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZyBAcmQiLDE2LDEyLAotMHgzYywKLSNlbmRpZgotIm5lZyIsT1BDX25lZywwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNDN9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZyBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZyBhZGRyZXNzX2RzdCIsMTYsMTUsCi0weDNjLAotI2VuZGlmCi0ibmVnIixPUENfbmVnLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ0fSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWcgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnIGFkZHJlc3NfZHN0KHJkKSIsMTYsMTYsCi0weDNjLAotI2VuZGlmCi0ibmVnIixPUENfbmVnLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0NX0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMDAxMCAqKiogbmVnIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnIHJkIiwxNiw3LAotMHgzYywKLSNlbmRpZgotIm5lZyIsT1BDX25lZywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjQ2fSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMDEwICoqKiBuZWdiIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZ2IgQHJkIiw4LDEyLAotMHgzYywKLSNlbmRpZgotIm5lZ2IiLE9QQ19uZWdiLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI0N30sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnYiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZ2IgYWRkcmVzc19kc3QiLDgsMTUsCi0weDNjLAotI2VuZGlmCi0ibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDh9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZ2IgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnYiBhZGRyZXNzX2RzdChyZCkiLDgsMTYsCi0weDNjLAotI2VuZGlmCi0ibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ5fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAwMDEwICoqKiBuZWdiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZ2IgcmJkIiw4LDcsCi0weDNjLAotI2VuZGlmCi0ibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI1MH0sCi0KLQotLyogMTAwMCAxMTAxIDAwMDAgMDExMSAqKiogbm9wICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibm9wIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotIm5vcCIsT1BDX25vcCwwLHswfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNywwLDAsMCwwLDAsfSwwLDIsMjUxfSwKLQotCi0vKiAwMDAwIDAxMDEgc3NOMCBkZGRkICoqKiBvciByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxAcnMiLDE2LDcsCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI1Mn0sCi0KLQotLyogMDEwMCAwMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3IgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTN9LAotCi0KLS8qIDAxMDAgMDEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1NH0sCi0KLQotLyogMDAwMCAwMTAxIDAwMDAgZGRkZCBpbW0xNiAqKiogb3IgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxpbW0xNiIsMTYsNywKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjU1fSwKLQotCi0vKiAxMDAwIDAxMDEgc3NzcyBkZGRkICoqKiBvciByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLHJzIiwxNiw0LAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjU2fSwKLQotCi0vKiAwMDAwIDAxMDAgc3NOMCBkZGRkICoqKiBvcmIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQsQHJzIiw4LDcsCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjU3fSwKLQotCi0vKiAwMTAwIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvcmIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjU4fSwKLQotCi0vKiAwMTAwIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1OX0sCi0KLQotLyogMDAwMCAwMTAwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIG9yYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQsaW1tOCIsOCw3LAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMjYwfSwKLQotCi0vKiAxMDAwIDAxMDAgc3NzcyBkZGRkICoqKiBvcmIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQscmJzIiw4LDQsCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI2MX0sCi0KLQotLyogMDAxMSAxMTExIGRkTjAgc3NzcyAqKiogb3V0IEByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dCBAcmQscnMiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0IixPUENfb3V0LDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyNjJ9LAotCi0KLS8qIDAwMTEgMTAxMSBzc3NzIDAxMTAgaW1tMTYgKioqIG91dCBpbW0xNixycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dCBpbW0xNixycyIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXQiLE9QQ19vdXQsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI2M30sCi0KLQotLyogMDAxMSAxMTEwIGRkTjAgc3NzcyAqKiogb3V0YiBAcmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0YiBAcmQscmJzIiw4LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0YiIsT1BDX291dGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI2NH0sCi0KLQotLyogMDAxMSAxMDEwIHNzc3MgMDExMCBpbW0xNiAqKiogb3V0YiBpbW0xNixyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRiIGltbTE2LHJicyIsOCwwLAotMHgwNCwKLSNlbmRpZgotIm91dGIiLE9QQ19vdXRiLDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyNjV9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0ZCBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0ZCBAcmQsQHJzLHJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGQiLE9QQ19vdXRkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjZ9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0ZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRkYiBAcmQsQHJzLHJiYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRkYiIsT1BDX291dGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjd9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0aSBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0aSBAcmQsQHJzLHJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGkiLE9QQ19vdXRpLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMjY4fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIG91dGliIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRpYiBAcmQsQHJzLHJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGliIixPUENfb3V0aWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjl9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogb3V0aWJyIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRpYnIgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRpYnIiLE9QQ19vdXRpYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwyNzB9LAotCi0KLS8qIDAwMDEgMDExMSBzc04wIGRkTjAgKioqIHBvcCBAcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wIEByZCxAcnMiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotInBvcCIsT1BDX3BvcCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjcxfSwKLQotCi0vKiAwMTAxIDAxMTEgc3NOMCBkZE4wIGFkZHJlc3NfZHN0ICoqKiBwb3AgYWRkcmVzc19kc3QocmQpLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcCBhZGRyZXNzX2RzdChyZCksQHJzIiwxNiwxNiwKLTB4MDAsCi0jZW5kaWYKLSJwb3AiLE9QQ19wb3AsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3Mn0sCi0KLQotLyogMDEwMSAwMTExIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogcG9wIGFkZHJlc3NfZHN0LEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcCBhZGRyZXNzX2RzdCxAcnMiLDE2LDE2LAotMHgwMCwKLSNlbmRpZgotInBvcCIsT1BDX3BvcCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyNzN9LAotCi0KLS8qIDEwMDEgMDExMSBzc04wIGRkZGQgKioqIHBvcCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3AgcmQsQHJzIiwxNiw4LAotMHgwMCwKLSNlbmRpZgotInBvcCIsT1BDX3BvcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI3NH0sCi0KLQotLyogMDAwMSAwMTAxIHNzTjAgZGROMCAqKiogcG9wbCBAcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wbCBAcmQsQHJzIiwzMiwxOSwKLTB4MDAsCi0jZW5kaWYKLSJwb3BsIixPUENfcG9wbCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjc1fSwKLQotCi0vKiAwMTAxIDAxMDEgc3NOMCBkZE4wIGFkZHJlc3NfZHN0ICoqKiBwb3BsIGFkZHJlc3NfZHN0KHJkKSxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3BsIGFkZHJlc3NfZHN0KHJkKSxAcnMiLDMyLDIzLAotMHgwMCwKLSNlbmRpZgotInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyNzZ9LAotCi0KLS8qIDAxMDEgMDEwMSBzc04wIDAwMDAgYWRkcmVzc19kc3QgKioqIHBvcGwgYWRkcmVzc19kc3QsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wbCBhZGRyZXNzX2RzdCxAcnMiLDMyLDIzLAotMHgwMCwKLSNlbmRpZgotInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3N30sCi0KLQotLyogMTAwMSAwMTAxIHNzTjAgZGRkZCAqKiogcG9wbCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wbCBycmQsQHJzIiwzMiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJwb3BsIixPUENfcG9wbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI3OH0sCi0KLQotLyogMDAwMSAwMDExIGRkTjAgc3NOMCAqKiogcHVzaCBAcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQsQHJzIiwxNiwxMywKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUdOMCsoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjc5fSwKLQotCi0vKiAwMTAxIDAwMTEgZGROMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBwdXNoIEByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLGFkZHJlc3Nfc3JjIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODB9LAotCi0KLS8qIDAxMDEgMDAxMSBkZE4wIHNzTjAgYWRkcmVzc19zcmMgKioqIHB1c2ggQHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4MX0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMTAwMSBpbW0xNiAqKiogcHVzaCBAcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxpbW0xNiIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjgyfSwKLQotCi0vKiAxMDAxIDAwMTEgZGROMCBzc3NzICoqKiBwdXNoIEByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLHJzIiwxNiw5LAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjgzfSwKLQotCi0vKiAwMDAxIDAwMDEgZGROMCBzc04wICoqKiBwdXNobCBAcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaGwgQHJkLEBycyIsMzIsMjAsCi0weDAwLAotI2VuZGlmCi0icHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUdOMCsoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjg0fSwKLQotCi0vKiAwMTAxIDAwMDEgZGROMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBwdXNobCBAcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNobCBAcmQsYWRkcmVzc19zcmMiLDMyLDIxLAotMHgwMCwKLSNlbmRpZgotInB1c2hsIixPUENfcHVzaGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjg1fSwKLQotCi0vKiAwMTAxIDAwMDEgZGROMCBzc04wIGFkZHJlc3Nfc3JjICoqKiBwdXNobCBAcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaGwgQHJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMjEsCi0weDAwLAotI2VuZGlmCi0icHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjg2fSwKLQotCi0vKiAxMDAxIDAwMDEgZGROMCBzc3NzICoqKiBwdXNobCBAcmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaGwgQHJkLHJycyIsMzIsMTIsCi0weDAwLAotI2VuZGlmCi0icHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI4N30sCi0KLQotLyogMDAxMCAwMDExIGRkTjAgaW1tNCAqKiogcmVzIEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIEByZCxpbW00IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyODh9LAotCi0KLS8qIDAxMTAgMDAxMSBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIHJlcyBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyBhZGRyZXNzX2RzdChyZCksaW1tNCIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjg5fSwKLQotCi0vKiAwMTEwIDAwMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiByZXMgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyBhZGRyZXNzX2RzdCxpbW00IiwxNiwxMywKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5MH0sCi0KLQotLyogMTAxMCAwMDExIGRkZGQgaW1tNCAqKiogcmVzIHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgcmQsaW1tNCIsMTYsNCwKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyOTF9LAotCi0KLS8qIDAwMTAgMDAxMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogcmVzIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIHJkLHJzIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDI5Mn0sCi0KLQotLyogMDAxMCAwMDEwIGRkTjAgaW1tNCAqKiogcmVzYiBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgQHJkLGltbTQiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyOTN9LAotCi0KLS8qIDAxMTAgMDAxMCBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIHJlc2IgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIGFkZHJlc3NfZHN0KHJkKSxpbW00Iiw4LDE0LAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjk0fSwKLQotCi0vKiAwMTEwIDAwMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiByZXNiIGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIGFkZHJlc3NfZHN0LGltbTQiLDgsMTMsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5NX0sCi0KLQotLyogMTAxMCAwMDEwIGRkZGQgaW1tNCAqKiogcmVzYiByYmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgcmJkLGltbTQiLDgsNCwKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI5Nn0sCi0KLQotLyogMDAxMCAwMDEwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiByZXNiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgcmJkLHJzIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwyOTd9LAotCi0KLS8qIDEwMDAgMTEwMSBmbGFncyAwMDExICoqKiByZXNmbGcgZmxhZ3MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNmbGcgZmxhZ3MiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0icmVzZmxnIixPUENfcmVzZmxnLDAse0NMQVNTX0ZMQUdTLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfRkxBR1MsQ0xBU1NfQklUKzMsMCwwLDAsMCwwLH0sMSwyLDI5OH0sCi0KLQotLyogMTAwMSAxMTEwIDAwMDAgY2NjYyAqKiogcmV0IGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmV0IGNjIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyZXQiLE9QQ19yZXQsMCx7Q0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19DQywwLDAsMCwwLDAsfSwxLDIsMjk5fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMEkwICoqKiBybCByZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmwgcmQsaW1tMW9yMiIsMTYsNiwKLTB4M2MsCi0jZW5kaWYKLSJybCIsT1BDX3JsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzAsMCwwLDAsMCwwLH0sMiwyLDMwMH0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDBJMCAqKiogcmxiIHJiZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmxiIHJiZCxpbW0xb3IyIiw4LDYsCi0weDNjLAotI2VuZGlmCi0icmxiIixPUENfcmxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzAsMCwwLDAsMCwwLH0sMiwyLDMwMX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTBJMCAqKiogcmxjIHJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybGMgcmQsaW1tMW9yMiIsMTYsNiwKLTB4M2MsCi0jZW5kaWYKLSJybGMiLE9QQ19ybGMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrOCwwLDAsMCwwLDAsfSwyLDIsMzAyfSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMEkwICoqKiBybGNiIHJiZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmxjYiByYmQsaW1tMW9yMiIsOCw5LAotMHgxMCwKLSNlbmRpZgotInJsY2IiLE9QQ19ybGNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzgsMCwwLDAsMCwwLH0sMiwyLDMwM30sCi0KLQotLyogMTAxMSAxMTEwIGFhYWEgYmJiYiAqKiogcmxkYiByYmIscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmxkYiByYmIscmJhIiw4LDksCi0weDEwLAotI2VuZGlmCi0icmxkYiIsT1BDX3JsZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhlLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUcrKEFSR19SQiksMCwwLDAsMCwwLH0sMiwyLDMwNH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDFJMCAqKiogcnIgcmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyIHJkLGltbTFvcjIiLDE2LDYsCi0weDNjLAotI2VuZGlmCi0icnIiLE9QQ19yciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis0LDAsMCwwLDAsMCx9LDIsMiwzMDV9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAxSTAgKioqIHJyYiByYmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyYiByYmQsaW1tMW9yMiIsOCw2LAotMHgzYywKLSNlbmRpZgotInJyYiIsT1BDX3JyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis0LDAsMCwwLDAsMCx9LDIsMiwzMDZ9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDExSTAgKioqIHJyYyByZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnJjIHJkLGltbTFvcjIiLDE2LDYsCi0weDNjLAotI2VuZGlmCi0icnJjIixPUENfcnJjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzB4YywwLDAsMCwwLDAsfSwyLDIsMzA3fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMUkwICoqKiBycmNiIHJiZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnJjYiByYmQsaW1tMW9yMiIsOCw5LAotMHgxMCwKLSNlbmRpZgotInJyY2IiLE9QQ19ycmNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzB4YywwLDAsMCwwLDAsfSwyLDIsMzA4fSwKLQotCi0vKiAxMDExIDExMDAgYWFhYSBiYmJiICoqKiBycmRiIHJiYixyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJycmRiIHJiYixyYmEiLDgsOSwKLTB4MTAsCi0jZW5kaWYKLSJycmRiIixPUENfcnJkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFRysoQVJHX1JCKSwwLDAsMCwwLDAsfSwyLDIsMzA5fSwKLQotCi0vKiAwMDExIDAxMTAgaW1tOCAqKiogcnN2ZDM2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDM2Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQzNiIsT1BDX3JzdmQzNiwwLHswfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzEwfSwKLQotCi0vKiAwMDExIDEwMDAgaW1tOCAqKiogcnN2ZDM4ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDM4Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQzOCIsT1BDX3JzdmQzOCwwLHswfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzgsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzExfSwKLQotCi0vKiAwMTExIDEwMDAgaW1tOCAqKiogcnN2ZDc4ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDc4Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQ3OCIsT1BDX3JzdmQ3OCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzgsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzEyfSwKLQotCi0vKiAwMTExIDExMTAgaW1tOCAqKiogcnN2ZDdlICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDdlIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQ3ZSIsT1BDX3JzdmQ3ZSwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4ZSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTN9LAotCi0KLS8qIDEwMDEgMTEwMSBpbW04ICoqKiByc3ZkOWQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkOWQiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDlkIixPUENfcnN2ZDlkLDAsezB9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhkLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxNH0sCi0KLQotLyogMTAwMSAxMTExIGltbTggKioqIHJzdmQ5ZiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQ5ZiIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkOWYiLE9QQ19yc3ZkOWYsMCx7MH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE1fSwKLQotCi0vKiAxMDExIDEwMDEgaW1tOCAqKiogcnN2ZGI5ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZGI5Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmRiOSIsT1BDX3JzdmRiOSwwLHswfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTZ9LAotCi0KLS8qIDEwMTEgMTExMSBpbW04ICoqKiByc3ZkYmYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkYmYiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZGJmIixPUENfcnN2ZGJmLDAsezB9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE3fSwKLQotCi0vKiAxMDExIDAxMTEgc3NzcyBkZGRkICoqKiBzYmMgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzYmMgcmQscnMiLDE2LDUsCi0weDNjLAotI2VuZGlmCi0ic2JjIixPUENfc2JjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzE4fSwKLQotCi0vKiAxMDExIDAxMTAgc3NzcyBkZGRkICoqKiBzYmNiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzYmNiIHJiZCxyYnMiLDgsNSwKLTB4M2YsCi0jZW5kaWYKLSJzYmNiIixPUENfc2JjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDMxOX0sCi0KLQotLyogMDExMSAxMTExIGltbTggKioqIHNjIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzYyBpbW04Iiw4LDMzLAotMHgzZiwKLSNlbmRpZgotInNjIixPUENfc2MsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwzMjB9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RhIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RhIHJkLHJzIiwxNiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJzZGEiLE9QQ19zZGEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjF9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RhYiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGFiIHJiZCxycyIsOCwxNSwKLTB4M2MsCi0jZW5kaWYKLSJzZGFiIixPUENfc2RhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyMn0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTExMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGFsIHJyZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkYWwgcnJkLHJzIiwzMiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJzZGFsIixPUENfc2RhbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyM30sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGwgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGwgcmQscnMiLDE2LDE1LAotMHgzOCwKLSNlbmRpZgotInNkbCIsT1BDX3NkbCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjR9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RsYiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGxiIHJiZCxycyIsOCwxNSwKLTB4MzgsCi0jZW5kaWYKLSJzZGxiIixPUENfc2RsYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjV9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAxMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RsbCBycmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGxsIHJyZCxycyIsMzIsMTUsCi0weDM4LAotI2VuZGlmCi0ic2RsbCIsT1BDX3NkbGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzI2fSwKLQotCi0vKiAwMDEwIDAxMDEgZGROMCBpbW00ICoqKiBzZXQgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgQHJkLGltbTQiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMyN30sCi0KLQotLyogMDExMCAwMTAxIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0IGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IGFkZHJlc3NfZHN0KHJkKSxpbW00IiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMjh9LAotCi0KLS8qIDAxMTAgMDEwMSAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHNldCBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IGFkZHJlc3NfZHN0LGltbTQiLDE2LDEzLAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzI5fSwKLQotCi0vKiAxMDEwIDAxMDEgZGRkZCBpbW00ICoqKiBzZXQgcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCByZCxpbW00IiwxNiw0LAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMzMH0sCi0KLQotLyogMDAxMCAwMTAxIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiBzZXQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgcmQscnMiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzMxfSwKLQotCi0vKiAwMDEwIDAxMDAgZGROMCBpbW00ICoqKiBzZXRiIEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiBAcmQsaW1tNCIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMzMn0sCi0KLQotLyogMDExMCAwMTAwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0YiBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgYWRkcmVzc19kc3QocmQpLGltbTQiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMzN9LAotCi0KLS8qIDAxMTAgMDEwMCAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHNldGIgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgYWRkcmVzc19kc3QsaW1tNCIsOCwxMywKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzM0fSwKLQotCi0vKiAxMDEwIDAxMDAgZGRkZCBpbW00ICoqKiBzZXRiIHJiZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiByYmQsaW1tNCIsOCw0LAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzM1fSwKLQotCi0vKiAwMDEwIDAxMDAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHNldGIgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiByYmQscnMiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMzNn0sCi0KLQotLyogMTAwMCAxMTAxIGZsYWdzIDAwMDEgKioqIHNldGZsZyBmbGFncyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGZsZyBmbGFncyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJzZXRmbGciLE9QQ19zZXRmbGcsMCx7Q0xBU1NfRkxBR1MsfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19GTEFHUyxDTEFTU19CSVQrMSwwLDAsMCwwLDAsfSwxLDIsMzM3fSwKLQotCi0vKiAwMDExIDEwMTAgZGRkZCAwMTAxIGltbTE2ICoqKiBzaW5iIHJiZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmIgcmJkLGltbTE2Iiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic2luYiIsT1BDX3NpbmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDMzOH0sCi0KLQotLyogMDAxMSAxMDExIGRkZGQgMDEwMSBpbW0xNiAqKiogc2luYiByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmIgcmQsaW1tMTYiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5iIixPUENfc2luYiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzM5fSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAgKioqIHNpbmQgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmQgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5kIixPUENfc2luZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM0MH0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAxIGFhYWEgZGROMCAxMDAwICoqKiBzaW5kYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmRiIEByZCxAcnMscmJhIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic2luZGIiLE9QQ19zaW5kYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM0MX0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBzaW5pYiBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luaWIgQHJkLEBycyxyYSIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNpbmliIixPUENfc2luaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNDJ9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogc2luaWJyIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5pYnIgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5pYnIiLE9QQ19zaW5pYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwzNDN9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDEwMDEgMDAwMCAwMDAwIGltbTggKioqIHNsYSByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xhIHJkLGltbTgiLDE2LDEzLAotMHgzYywKLSNlbmRpZgotInNsYSIsT1BDX3NsYSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ0fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMDAxICAwMDAwIDAwMDAgaW1tOCAqKiogc2xhYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsYWIgcmJkLGltbTgiLDgsMTMsCi0weDNjLAotI2VuZGlmCi0ic2xhYiIsT1BDX3NsYWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0NX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTEwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xhbCBycmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsYWwgcnJkLGltbTgiLDMyLDEzLAotMHgzYywKLSNlbmRpZgotInNsYWwiLE9QQ19zbGFsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0Nn0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDAwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xsIHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGwgcmQsaW1tOCIsMTYsMTMsCi0weDM4LAotI2VuZGlmCi0ic2xsIixPUENfc2xsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDd9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAwMDEgIDAwMDAgMDAwMCBpbW04ICoqKiBzbGxiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xsYiByYmQsaW1tOCIsOCwxMywKLTB4MzgsCi0jZW5kaWYKLSJzbGxiIixPUENfc2xsYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ4fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMTAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGxsIHJyZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xsbCBycmQsaW1tOCIsMzIsMTMsCi0weDM4LAotI2VuZGlmCi0ic2xsbCIsT1BDX3NsbGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0OX0sCi0KLQotLyogMDAxMSAxMDExIHNzc3MgMDExMSBpbW0xNiAqKiogc291dCBpbW0xNixycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXQgaW1tMTYscnMiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic291dCIsT1BDX3NvdXQsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs3LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDM1MH0sCi0KLQotLyogMDAxMSAxMDEwIHNzc3MgMDExMSBpbW0xNiAqKiogc291dGIgaW1tMTYscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGIgaW1tMTYscmJzIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGIiLE9QQ19zb3V0YiwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzcsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzUxfSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNvdXRkIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0ZCBAcmQsQHJzLHJhIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRkIixPUENfc291dGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM1Mn0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBzb3V0ZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0ZGIgQHJkLEBycyxyYmEiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0ZGIiLE9QQ19zb3V0ZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM1M30sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBzb3V0aWIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRpYiBAcmQsQHJzLHJhIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGliIixPUENfc291dGliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzU0fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDExIDAwMDAgYWFhYSBkZE4wIDAwMDAgKioqIHNvdXRpYnIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRpYnIgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0aWJyIixPUENfc291dGliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM1NX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTAwMSAxMTExIDExMTEgbmltOCAqKiogc3JhIHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmEgcmQsaW1tOCIsMTYsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JhIixPUENfc3JhLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU2fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMDAxIDAwMDAgMDAwMCBuaW04ICoqKiBzcmFiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JhYiByYmQsaW1tOCIsOCwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmFiIixPUENfc3JhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU3fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMTAxIDExMTEgMTExMSBuaW04ICoqKiBzcmFsIHJyZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JhbCBycmQsaW1tOCIsMzIsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JhbCIsT1BDX3NyYWwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM1OH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDAwMSAxMTExIDExMTEgbmltOCAqKiogc3JsIHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmwgcmQsaW1tOCIsMTYsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JsIixPUENfc3JsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU5fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMDAxIDAwMDAgMDAwMCBuaW04ICoqKiBzcmxiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JsYiByYmQsaW1tOCIsOCwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmxiIixPUENfc3JsYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzYwfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMTAxIDExMTEgMTExMSBuaW04ICoqKiBzcmxsIHJyZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JsbCBycmQsaW1tOCIsMzIsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JsbCIsT1BDX3NybGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNjF9LAotCi0KLS8qIDAwMDAgMDAxMSBzc04wIGRkZGQgKioqIHN1YiByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQsQHJzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM2Mn0sCi0KLQotLyogMDEwMCAwMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzYzfSwKLQotCi0vKiAwMTAwIDAwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWIgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzY0fSwKLQotCi0vKiAwMDAwIDAwMTEgMDAwMCBkZGRkIGltbTE2ICoqKiBzdWIgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQsaW1tMTYiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzY1fSwKLQotCi0vKiAxMDAwIDAwMTEgc3NzcyBkZGRkICoqKiBzdWIgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQscnMiLDE2LDQsCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM2Nn0sCi0KLQotLyogMDAwMCAwMDEwIHNzTjAgZGRkZCAqKiogc3ViYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQsQHJzIiw4LDcsCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNjd9LAotCi0KLS8qIDAxMDAgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzY4fSwKLQotCi0vKiAwMTAwIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjl9LAotCi0KLS8qIDAwMDAgMDAxMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBzdWJiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQsaW1tOCIsOCw3LAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwzNzB9LAotCi0KLS8qIDEwMDAgMDAxMCBzc3NzIGRkZGQgKioqIHN1YmIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLHJicyIsOCw0LAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM3MX0sCi0KLQotLyogMDAwMSAwMDEwIHNzTjAgZGRkZCAqKiogc3VibCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQsQHJzIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM3Mn0sCi0KLQotLyogMDEwMSAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3VibCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTUsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM3M30sCi0KLQotLyogMDEwMSAwMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3VibCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQsYWRkcmVzc19zcmMocnMpIiwzMiwxNiwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM3NH0sCi0KLQotLyogMDAwMSAwMDEwIDAwMDAgZGRkZCBpbW0zMiAqKiogc3VibCBycmQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxpbW0zMiIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwzNzV9LAotCi0KLS8qIDEwMDEgMDAxMCBzc3NzIGRkZGQgKioqIHN1YmwgcnJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLHJycyIsMzIsOCwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNzZ9LAotCi0KLS8qIDEwMTAgMTExMSBkZGRkIGNjY2MgKioqIHRjYyBjYyxyZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRjYyBjYyxyZCIsMTYsNSwKLTB4MDAsCi0jZW5kaWYKLSJ0Y2MiLE9QQ190Y2MsMCx7Q0xBU1NfQ0MsQ0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhmLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLDAsMCwwLDAsfSwyLDIsMzc3fSwKLQotCi0vKiAxMDEwIDExMTAgZGRkZCBjY2NjICoqKiB0Y2NiIGNjLHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRjY2IgY2MscmJkIiw4LDUsCi0weDAwLAotI2VuZGlmCi0idGNjYiIsT1BDX3RjY2IsMCx7Q0xBU1NfQ0MsQ0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhlLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLDAsMCwwLDAsfSwyLDIsMzc4fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMTAwICoqKiB0ZXN0IEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3QgQHJkIiwxNiw4LAotMHgxOCwKLSNlbmRpZgotInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM3OX0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdCBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3QgYWRkcmVzc19kc3QiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzgwfSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0IGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3QgYWRkcmVzc19kc3QocmQpIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJ0ZXN0IixPUENfdGVzdCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODF9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDAxMDAgKioqIHRlc3QgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0IHJkIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzODJ9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAxMDAgKioqIHRlc3RiIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RiIEByZCIsOCw4LAotMHgxYywKLSNlbmRpZgotInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzgzfSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0YiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RiIGFkZHJlc3NfZHN0Iiw4LDExLAotMHgxYywKLSNlbmRpZgotInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODR9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3RiIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RiIGFkZHJlc3NfZHN0KHJkKSIsOCwxMiwKLTB4MWMsCi0jZW5kaWYKLSJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4NX0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMDEwMCAqKiogdGVzdGIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGIgcmJkIiw4LDcsCi0weDFjLAotI2VuZGlmCi0idGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzg2fSwKLQotCi0vKiAwMDAxIDExMDAgZGROMCAxMDAwICoqKiB0ZXN0bCBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0bCBAcmQiLDMyLDEzLAotMHgxOCwKLSNlbmRpZgotInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsMzg3fSwKLQotCi0vKiAwMTAxIDExMDAgMDAwMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0bCBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RsIGFkZHJlc3NfZHN0IiwzMiwxNiwKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0bCIsT1BDX3Rlc3RsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg4fSwKLQotCi0vKiAwMTAxIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0bCBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0bCBhZGRyZXNzX2RzdChyZCkiLDMyLDE3LAotMHgxOCwKLSNlbmRpZgotInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg5fSwKLQotCi0vKiAxMDAxIDExMDAgZGRkZCAxMDAwICoqKiB0ZXN0bCBycmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0bCBycmQiLDMyLDEzLAotMHgxOCwKLSNlbmRpZgotInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDM5MH0sCi0KLQotLyogMTAxMSAxMDAwIGRkTjAgMTAwMCAwMDAwIGFhYWEgc3NOMCAwMDAwICoqKiB0cmRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJkYiBAcmQsQHJzLHJiYSIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cmRiIixPUENfdHJkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5MX0sCi0KLQotLyogMTAxMSAxMDAwIGRkTjAgMTEwMCAwMDAwIGFhYWEgc3NOMCAwMDAwICoqKiB0cmRyYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRyZHJiIEByZCxAcnMscmJhIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRyZHJiIixPUENfdHJkcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5Mn0sCi0KLQotLyogMTAxMSAxMDAwIGRkTjAgMDAwMCAwMDAwIHJycnIgc3NOMCAwMDAwICoqKiB0cmliIEByZCxAcnMscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJpYiBAcmQsQHJzLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cmliIixPUENfdHJpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5M30sCi0KLQotLyogMTAxMSAxMDAwIGRkTjAgMDEwMCAwMDAwIHJycnIgc3NOMCAwMDAwICoqKiB0cmlyYiBAcmQsQHJzLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRyaXJiIEByZCxAcnMscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRyaXJiIixPUENfdHJpcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTR9LAotCi0KLS8qIDEwMTEgMTAwMCBhYU4wIDEwMTAgMDAwMCBycnJyIGJiTjAgMDAwMCAqKiogdHJ0ZGIgQHJhLEByYixyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cnRkYiBAcmEsQHJiLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cnRkYiIsT1BDX3RydGRiLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTV9LAotCi0KLS8qIDEwMTEgMTAwMCBhYU4wIDExMTAgMDAwMCBycnJyIGJiTjAgMTExMCAqKiogdHJ0ZHJiIEByYSxAcmIscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJ0ZHJiIEByYSxAcmIscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRydGRyYiIsT1BDX3RydGRyYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkIpLENMQVNTX0JJVCsweGUsMCx9LDMsNCwzOTZ9LAotCi0KLS8qIDEwMTEgMTAwMCBhYU4wIDAwMTAgMDAwMCBycnJyIGJiTjAgMDAwMCAqKiogdHJ0aWIgQHJhLEByYixyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cnRpYiBAcmEsQHJiLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cnRpYiIsT1BDX3RydGliLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkIpLENMQVNTX0JJVCswLDAsfSwzLDQsMzk3fSwKLQotCi0vKiAxMDExIDEwMDAgYWFOMCAwMTEwIDAwMDAgcnJyciBiYk4wIDExMTAgKioqIHRydGlyYiBAcmEsQHJiLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRydGlyYiBAcmEsQHJiLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cnRpcmIiLE9QQ190cnRpcmIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzB4ZSwwLH0sMyw0LDM5OH0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDExMCAqKiogdHNldCBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0IEByZCIsMTYsMTEsCi0weDA4LAotI2VuZGlmCi0idHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsMzk5fSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMTEwIGFkZHJlc3NfZHN0ICoqKiB0c2V0IGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldCBhZGRyZXNzX2RzdCIsMTYsMTQsCi0weDA4LAotI2VuZGlmCi0idHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MDB9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXQgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldCBhZGRyZXNzX2RzdChyZCkiLDE2LDE1LAotMHgwOCwKLSNlbmRpZgotInRzZXQiLE9QQ190c2V0LDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwMX0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMDExMCAqKiogdHNldCByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXQgcmQiLDE2LDcsCi0weDA4LAotI2VuZGlmCi0idHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzYsMCwwLDAsMCwwLH0sMSwyLDQwMn0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDExMCAqKiogdHNldGIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldGIgQHJkIiw4LDExLAotMHgwOCwKLSNlbmRpZgotInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsNDAzfSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMTEwIGFkZHJlc3NfZHN0ICoqKiB0c2V0YiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXRiIGFkZHJlc3NfZHN0Iiw4LDE0LAotMHgwOCwKLSNlbmRpZgotInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MDR9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXRiIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXRiIGFkZHJlc3NfZHN0KHJkKSIsOCwxNSwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwNX0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMDExMCAqKiogdHNldGIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldGIgcmJkIiw4LDcsCi0weDA4LAotI2VuZGlmCi0idHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsNDA2fSwKLQotCi0vKiAwMDAwIDEwMDEgc3NOMCBkZGRkICoqKiB4b3IgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLEBycyIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MDd9LAotCi0KLS8qIDAxMDAgMTAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvciByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDQwOH0sCi0KLQotLyogMDEwMCAxMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDQwOX0sCi0KLQotLyogMDAwMCAxMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogeG9yIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLGltbTE2IiwxNiw3LAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDQxMH0sCi0KLQotLyogMTAwMCAxMDAxIHNzc3MgZGRkZCAqKiogeG9yIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLHJzIiwxNiw0LAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrOSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTF9LAotCi0KLS8qIDAwMDAgMTAwMCBzc04wIGRkZGQgKioqIHhvcmIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLEBycyIsOCw3LAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDEyfSwKLQotCi0vKiAwMTAwIDEwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3JiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDQxM30sCi0KLQotLyogMDEwMCAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDE0fSwKLQotCi0vKiAwMDAwIDEwMDAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogeG9yYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLGltbTgiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsNDE1fSwKLQotCi0vKiAxMDAwIDEwMDAgc3NzcyBkZGRkICoqKiB4b3JiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxyYnMiLDgsNCwKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTZ9LAotCi0KLS8qIDEwMDAgMTAwMCBzc3NzIGRkZGQgKioqIHhvcmIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLHJicyIsOCw0LAotMHgwMSwKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxN30sCi0wLDB9OwotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL3o4a2dlbi5jIGIvb3Bjb2Rlcy96OGtnZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NmJiYi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3o4a2dlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxMyArMCwwIEBACi0vKgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgejhrLW9wYy5oICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIEJZVEVfSU5GT19MRU4gMTAKLQotc3RydWN0IG9wCi17Ci0gIGNoYXIgKmZsYWdzOwotICBpbnQgY3ljbGVzOwotICBjaGFyIHR5cGU7Ci0gIGNoYXIgKmJpdHM7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKmZsYXZvcjsKLX07Ci0KLSNkZWZpbmUgaXN3aGl0ZSh4KSAoKHgpID09ICcgJyB8fCAoeCkgPT0gJ1x0JykKLXN0cnVjdCBvcCBvcHRbXSA9Ci17Ci0gICItLS0tLS0iLCAxMCwgOCwgIjAwMDAgMTExMCBpbW04IiwgImV4dDBlIGltbTgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMDAwIDExMTEgaW1tOCIsICJleHQwZiBpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMCAxMTEwIGltbTgiLCAiZXh0OGUgaW1tOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDAgMTExMSBpbW04IiwgImV4dDhmIGltbTgiLCAwLAotCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMDExMCBpbW04IiwgInJzdmQzNiIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMTAwMCBpbW04IiwgInJzdmQzOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAxMTEgMTAwMCBpbW04IiwgInJzdmQ3OCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAxMTEgMTExMCBpbW04IiwgInJzdmQ3ZSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMSAxMTAxIGltbTgiLCAicnN2ZDlkIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMSAxMTExIGltbTgiLCAicnN2ZDlmIiwgMCwKLQotICAiLS0tLS0tIiwgMTAsIDgsICIxMDExIDEwMDEgaW1tOCIsICJyc3ZkYjkiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIxMDExIDExMTEgaW1tOCIsICJyc3ZkYmYiLCAwLAotCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRkIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwIiwgImxkZHIgQHJzLEByZCxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgOCwgIjEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGRyYiBAcnMsQHJkLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGlyIEByZCxAcnMscnIiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaSByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaXIgcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRyIHJkLEBycyxycixjYyIsIDAsCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRpIEByZCxAcnMscnIiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwZCByZCxAcnMscnIsY2MiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRpcmIgQHJkLEBycyxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCIsICJsZGRiIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRpYiBAcmQsQHJzLHJyIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwZGIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRyYiByYmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaWIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGlyYiByYmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNkIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZGIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZHIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDExMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNkcmIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzaSBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2liIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2lyIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzaXJiIEByZCxAcnMscnIsY2MiLCAwLAotCi0gICItLS0tLS0iLCAyLCA4LCAiMDAxMSAwMTEwIDAwMDAgMDAwMCIsICJicHQiLCAwLAotICAiQ1pTVi0tIiwgNSwgMTYsICIxMDExIDAxMDEgc3NzcyBkZGRkIiwgImFkYyByZCxycyIsIDAsCi0gICJDWlNWREgiLCA1LCA4LCAiMTAxMSAwMTAwIHNzc3MgZGRkZCIsICJhZGNiIHJiZCxyYnMiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMDEgc3NOMCBkZGRkIiwgImFkZCByZCxAcnMiLCAwLAotIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGQgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGQgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiIsICJhZGQgcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDAwMDEgc3NzcyBkZGRkIiwgImFkZCByZCxycyIsIDAsCi0gICJDWlNWREgiLCA3LCA4LCAiMDAwMCAwMDAwIHNzTjAgZGRkZCIsICJhZGRiIHJiZCxAcnMiLCAwLAotIkNaU1ZESCIsIDksIDgsICIwMTAwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1ZESCIsIDEwLCA4LCAiMDEwMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAwMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImFkZGIgcmJkLGltbTgiLCAwLAotICAiQ1pTVkRIIiwgNCwgOCwgIjEwMDAgMDAwMCBzc3NzIGRkZGQiLCAiYWRkYiByYmQscmJzIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDExMCBzc04wIGRkZGQiLCAiYWRkbCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkbCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDMyLCAiMDEwMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMTEwIDAwMDAgZGRkZCBpbW0zMiIsICJhZGRsIHJyZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDExMCBzc3NzIGRkZGQiLCAiYWRkbCBycmQscnJzIiwgMCwKLQotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDAxMTEgc3NOMCBkZGRkIiwgImFuZCByZCxAcnMiLCAwLAotIi1aUy0tLSIsIDksIDE2LCAiMDEwMCAwMTExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmQgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLVpTLS0tIiwgMTAsIDE2LCAiMDEwMCAwMTExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmQgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTExIDAwMDAgZGRkZCBpbW0xNiIsICJhbmQgcmQsaW1tMTYiLCAwLAotICAiLVpTLS0tIiwgNCwgMTYsICIxMDAwIDAxMTEgc3NzcyBkZGRkIiwgImFuZCByZCxycyIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMDAwMCAwMTEwIHNzTjAgZGRkZCIsICJhbmRiIHJiZCxAcnMiLCAwLAotIi1aU1AtLSIsIDksIDgsICIwMTAwIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFuZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi1aU1AtLSIsIDEwLCA4LCAiMDEwMCAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMDExMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImFuZGIgcmJkLGltbTgiLCAwLAotICAiLVpTUC0tIiwgNCwgOCwgIjEwMDAgMDExMCBzc3NzIGRkZGQiLCAiYW5kYiByYmQscmJzIiwgMCwKLQotICAiLVotLS0tIiwgOCwgMTYsICIwMDEwIDAxMTEgZGROMCBpbW00IiwgImJpdCBAcmQsaW1tNCIsIDAsCi0gICItWi0tLS0iLCAxMSwgMTYsICIwMTEwIDAxMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdCBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItWi0tLS0iLCAxMCwgMTYsICIwMTEwIDAxMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdCBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDQsIDE2LCAiMTAxMCAwMTExIGRkZGQgaW1tNCIsICJiaXQgcmQsaW1tNCIsIDAsCi0iLVotLS0tIiwgMTAsIDE2LCAiMDAxMCAwMTExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgImJpdCByZCxycyIsIDAsCi0KLSAgIi1aLS0tLSIsIDgsIDgsICIwMDEwIDAxMTAgZGROMCBpbW00IiwgImJpdGIgQHJkLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTEsIDgsICIwMTEwIDAxMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdGIgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTAsIDgsICIwMTEwIDAxMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdGIgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItWi0tLS0iLCA0LCA4LCAiMTAxMCAwMTEwIGRkZGQgaW1tNCIsICJiaXRiIHJiZCxpbW00IiwgMCwKLSItWi0tLS0iLCAxMCwgOCwgIjAwMTAgMDExMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJiaXRiIHJiZCxycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCAzMiwgIjAwMDEgMTExMSBkZE4wIDAwMDAiLCAiY2FsbCBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTIsIDMyLCAiMDEwMSAxMTExIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCIsICJjYWxsIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAzMiwgIjAxMDEgMTExMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY2FsbCBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMTEwMSBkaXNwMTIiLCAiY2FsciBkaXNwMTIiLCAwLAotCi0gICItLS0tLS0iLCA4LCAxNiwgIjAwMDAgMTEwMSBkZE4wIDEwMDAiLCAiY2xyIEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMTAwIDExMDEgMDAwMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNsciBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTAwIDExMDEgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNsciBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAxMDAwIiwgImNsciByZCIsIDAsCi0gICItLS0tLS0iLCA4LCA4LCAiMDAwMCAxMTAwIGRkTjAgMTAwMCIsICJjbHJiIEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjAxMDAgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QiLCAiY2xyYiBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMiwgOCwgIjAxMDAgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QiLCAiY2xyYiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDEwMDAiLCAiY2xyYiByYmQiLCAwLAotICAiLVpTLS0tIiwgMTIsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDAwMCIsICJjb20gQHJkIiwgMCwKLSAgIi1aUy0tLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi1aUy0tLSIsIDE2LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlMtLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAwMDAiLCAiY29tIHJkIiwgMCwKLSAgIi1aU1AtLSIsIDEyLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDAwMCIsICJjb21iIEByZCIsIDAsCi0gICItWlNQLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tYiBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlNQLS0iLCAxNiwgOCwgIjAxMDAgMTEwMCBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tYiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAwMDAiLCAiY29tYiByYmQiLCAwLAotICAiQ1pTUC0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMTAxIiwgImNvbWZsZyBmbGFncyIsIDAsCi0KLSAgIkNaU1YtLSIsIDExLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMDEgaW1tMTYiLCAiY3AgQHJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAiY3AgYWRkcmVzc19kc3QocmQpLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAiY3AgYWRkcmVzc19kc3QsaW1tMTYiLCAwLAotCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMTAxMSBzc04wIGRkZGQiLCAiY3AgcmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAxMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgMTYsICIwMTAwIDEwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMTAxMSAwMDAwIGRkZGQgaW1tMTYiLCAiY3AgcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDEwMTEgc3NzcyBkZGRkIiwgImNwIHJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgMTEsIDgsICIwMDAwIDExMDAgZGROMCAwMDAxIGltbTggaW1tOCIsICJjcGIgQHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDgsICIwMTAwIDExMDAgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJjcGIgYWRkcmVzc19kc3QocmQpLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJjcGIgYWRkcmVzc19kc3QsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCA3LCA4LCAiMDAwMCAxMDEwIHNzTjAgZGRkZCIsICJjcGIgcmJkLEBycyIsIDAsCi0iQ1pTVi0tIiwgOSwgOCwgIjAxMDAgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgOCwgIjAxMDAgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgOCwgIjAwMDAgMTAxMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImNwYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCA0LCA4LCAiMTAwMCAxMDEwIHNzc3MgZGRkZCIsICJjcGIgcmJkLHJicyIsIDAsCi0KLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAwMCBzc04wIGRkZGQiLCAiY3BsIHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDMyLCAiMDEwMSAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcGwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMDAwIDAwMDAgZGRkZCBpbW0zMiIsICJjcGwgcnJkLGltbTMyIiwgMCwKLSAgIkNaU1YtLSIsIDgsIDMyLCAiMTAwMSAwMDAwIHNzc3MgZGRkZCIsICJjcGwgcnJkLHJycyIsIDAsCi0KLSAgIkNaUy0tLSIsIDUsIDgsICIxMDExIDAwMDAgZGRkZCAwMDAwIiwgImRhYiByYmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDE2LCAiMTExMSBkZGRkIDFkaXNwNyIsICJkYmpueiByYmQsZGlzcDciLCAwLAotICAiLVpTVi0tIiwgMTEsIDE2LCAiMDAxMCAxMDExIGRkTjAgaW1tNG0xIiwgImRlYyBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCAxNiwgIjAxMTAgMTAxMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJkZWMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgMTYsICIwMTEwIDEwMTEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCAxNiwgIjEwMTAgMTAxMSBkZGRkIGltbTRtMSIsICJkZWMgcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDExLCA4LCAiMDAxMCAxMDEwIGRkTjAgaW1tNG0xIiwgImRlY2IgQHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxNCwgOCwgIjAxMTAgMTAxMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJkZWNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTMsIDgsICIwMTEwIDEwMTAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjYiBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgNCwgOCwgIjEwMTAgMTAxMCBkZGRkIGltbTRtMSIsICJkZWNiIHJiZCxpbW00bTEiLCAwLAotCi0gICItLS0tLS0iLCA3LCAxNiwgIjAxMTEgMTEwMCAwMDAwIDAwaWkiLCAiZGkgaTIiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAwMDEgMTAxMSBzc04wIGRkZGQiLCAiZGl2IHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAxMDEgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiZGl2IHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMDEwMSAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXYgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMDAwMSAxMDExIDAwMDAgZGRkZCBpbW0xNiIsICJkaXYgcnJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIxMDAxIDEwMTEgc3NzcyBkZGRkIiwgImRpdiBycmQscnMiLCAwLAotICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjAwMDEgMTAxMCBzc04wIGRkZGQiLCAiZGl2bCBycWQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDc0NSwgMzIsICIwMTAxIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdmwgcnFkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDc0NiwgMzIsICIwMTAxIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3NDQsIDMyLCAiMDAwMSAxMDEwIDAwMDAgZGRkZCBpbW0zMiIsICJkaXZsIHJxZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA3NDQsIDMyLCAiMTAwMSAxMDEwIHNzc3MgZGRkZCIsICJkaXZsIHJxZCxycnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIxMTExIGRkZGQgMGRpc3A3IiwgImRqbnogcmQsZGlzcDciLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIwMTExIDExMDAgMDAwMCAwMWlpIiwgImVpIGkyIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDE2LCAiMTAxMCAxMTAxIHNzc3MgZGRkZCIsICJleCByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDEwIDExMDEgc3NOMCBkZGRkIiwgImV4IHJkLEBycyIsIDAsCi0iLS0tLS0tIiwgMTUsIDE2LCAiMDExMCAxMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJleCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxNiwgMTYsICIwMTEwIDExMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4IHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDAxMCAxMTAwIHNzTjAgZGRkZCIsICJleGIgcmJkLEBycyIsIDAsCi0iLS0tLS0tIiwgMTUsIDgsICIwMTEwIDExMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4YiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDgsICIwMTEwIDExMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4YiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDgsICIxMDEwIDExMDAgc3NzcyBkZGRkIiwgImV4YiByYmQscmJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMTAxMSAwMDAxIGRkZGQgMTAxMCIsICJleHRzIHJyZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjEwMTEgMDAwMSBkZGRkIDAwMDAiLCAiZXh0c2IgcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDMyLCAiMTAxMSAwMDAxIGRkZGQgMDExMSIsICJleHRzbCBycWQiLCAwLAotCi0gICItLS0tLS0iLCA4LCAxNiwgIjAxMTEgMTAxMCAwMDAwIDAwMDAiLCAiaGFsdCIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIwMDExIDExMDEgc3NOMCBkZGRkIiwgImluIHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDExIDExMDEgZGRkZCAwMTAwIGltbTE2IiwgImluIHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDAxMSAxMTAwIHNzTjAgZGRkZCIsICJpbmIgcmJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMTEwMCBkZGRkIDAxMDAgaW1tMTYiLCAiaW5iIHJiZCxpbW0xNiIsIDAsCi0gICItWlNWLS0iLCAxMSwgMTYsICIwMDEwIDEwMDEgZGROMCBpbW00bTEiLCAiaW5jIEByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTQsIDE2LCAiMDExMCAxMDAxIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImluYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDEzLCAxNiwgIjAxMTAgMTAwMSAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmMgYWRkcmVzc19kc3QsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDQsIDE2LCAiMTAxMCAxMDAxIGRkZGQgaW1tNG0xIiwgImluYyByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTEsIDgsICIwMDEwIDEwMDAgZGROMCBpbW00bTEiLCAiaW5jYiBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCA4LCAiMDExMCAxMDAwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImluY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgOCwgIjAxMTAgMTAwMCAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmNiIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCA4LCAiMTAxMCAxMDAwIGRkZGQgaW1tNG0xIiwgImluY2IgcmJkLGltbTRtMSIsIDAsCi0gICItLS1WLS0iLCAyMSwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5kIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDgsICIwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5kYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS1WLS0iLCAyMSwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJpbmliIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAwMDAwIiwgImluaWJyIEByZCxAcnMscmEiLCAwLAotICAiQ1pTVkRIIiwgMTMsIDE2LCAiMDExMSAxMDExIDAwMDAgMDAwMCIsICJpcmV0IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjAwMDEgMTExMCBkZE4wIGNjY2MiLCAianAgY2MsQHJkIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDEwMSAxMTEwIDAwMDAgY2NjYyBhZGRyZXNzX2RzdCIsICJqcCBjYyxhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCA4LCAxNiwgIjAxMDEgMTExMCBkZE4wIGNjY2MgYWRkcmVzc19kc3QiLCAianAgY2MsYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDE2LCAiMTExMCBjY2NjIGRpc3A4IiwgImpyIGNjLGRpc3A4IiwgMCwKLQotICAiLS0tLS0tIiwgNywgMTYsICIwMDAwIDExMDEgZGROMCAwMTAxIGltbTE2IiwgImxkIEByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCA4LCAxNiwgIjAwMTAgMTExMSBkZE4wIHNzc3MiLCAibGQgQHJkLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAibGQgYWRkcmVzc19kc3QocmQpLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAxMTAgMTExMSBkZE4wIHNzc3MgYWRkcmVzc19kc3QiLCAibGQgYWRkcmVzc19kc3QocmQpLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAibGQgYWRkcmVzc19kc3QsaW1tMTYiLCAwLAotIi0tLS0tLSIsIDExLCAxNiwgIjAxMTAgMTExMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGQgYWRkcmVzc19kc3QscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDExIGRkTjAgc3NzcyBpbW0xNiIsICJsZCByZChpbW0xNikscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMSAwMDExIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkIHJkKHJ4KSxycyIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAwMTAgMDAwMSBzc04wIGRkZGQiLCAibGQgcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDksIDE2LCAiMDExMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIwMTEwIDAwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAwMTAgMDAwMSAwMDAwIGRkZGQgaW1tMTYiLCAibGQgcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMywgMTYsICIxMDEwIDAwMDEgc3NzcyBkZGRkIiwgImxkIHJkLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAwMSBzc04wIGRkZGQgaW1tMTYiLCAibGQgcmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTEgMDAwMSBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZCByZCxycyhyeCkiLCAwLAotCi0gICItLS0tLS0iLCA3LCA4LCAiMDAwMCAxMTAwIGRkTjAgMDEwMSBpbW04IGltbTgiLCAibGRiIEByZCxpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDgsIDgsICIwMDEwIDExMTAgZGROMCBzc3NzIiwgImxkYiBAcmQscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDEwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAibGRiIGFkZHJlc3NfZHN0KHJkKSxpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDEwMCAxMTEwIGRkTjAgc3NOMCBhZGRyZXNzX2RzdCIsICJsZGIgYWRkcmVzc19kc3QocmQpLHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04IiwgImxkYiBhZGRyZXNzX2RzdCxpbW04IiwgMCwKLSItLS0tLS0iLCAxMSwgOCwgIjAxMTAgMTExMCAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGRiIGFkZHJlc3NfZHN0LHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAxMCBkZE4wIHNzc3MgaW1tMTYiLCAibGRiIHJkKGltbTE2KSxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTExIDAwMTAgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRiIHJkKHJ4KSxyYnMiLCAwLAotICAiLS0tLS0tIiwgNywgOCwgIjAwMTAgMDAwMCBzc04wIGRkZGQiLCAibGRiIHJiZCxAcnMiLCAwLAotIi0tLS0tLSIsIDksIDgsICIwMTEwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMTEwIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDgsICIxMTAwIGRkZGQgaW1tOCIsICJsZGIgcmJkLGltbTgiLCAwLAotICAiLS0tLS0tIiwgMywgOCwgIjEwMTAgMDAwMCBzc3NzIGRkZGQiLCAibGRiIHJiZCxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMDExIDAwMDAgc3NOMCBkZGRkIGltbTE2IiwgImxkYiByYmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDExMSAwMDAwIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkYiByYmQscnMocngpIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDMyLCAiMDAwMSAxMTAxIGRkTjAgc3NzcyIsICJsZGwgQHJkLHJycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMzIsICIwMTAxIDExMDEgZGROMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkbCBhZGRyZXNzX2RzdChyZCkscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAzMiwgIjAxMDEgMTEwMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGRsIGFkZHJlc3NfZHN0LHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMTEgZGROMCBzc3NzIGltbTE2IiwgImxkbCByZChpbW0xNikscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAxMTEgMDExMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGwgcmQocngpLHJycyIsIDAsCi0gICItLS0tLS0iLCAxMSwgMzIsICIwMDAxIDAxMDAgc3NOMCBkZGRkIiwgImxkbCBycmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjAxMDEgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibGRsIHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMywgMzIsICIwMTAxIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAzMiwgIjAwMDEgMDEwMCAwMDAwIGRkZGQgaW1tMzIiLCAibGRsIHJyZCxpbW0zMiIsIDAsCi0gICItLS0tLS0iLCA1LCAzMiwgIjEwMDEgMDEwMCBzc3NzIGRkZGQiLCAibGRsIHJyZCxycnMiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTAxIHNzTjAgZGRkZCBpbW0xNiIsICJsZGwgcnJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMTExIDAxMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRsIHJyZCxycyhyeCkiLCAwLAotCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTExIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYSBwcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGEgcHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMDExIDAxMDAgc3NOMCBkZGRkIGltbTE2IiwgImxkYSBwcmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMTEgMDEwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGEgcHJkLHJzKHJ4KSIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMDExIDAxMDAgMDAwMCBkZGRkIGRpc3AxNiIsICJsZGFyIHByZCxkaXNwMTYiLCAwLAotICAiLS0tLS0tIiwgNywgMzIsICIwMTExIDExMDEgc3NzcyAxY2NjIiwgImxkY3RsIGN0cmwscnMiLCAwLAotICAiLS0tLS0tIiwgNywgMzIsICIwMTExIDExMDEgZGRkZCAwY2NjIiwgImxkY3RsIHJkLGN0cmwiLCAwLAotCi0gICItLS0tLS0iLCA1LCAxNiwgIjEwMTEgMTEwMSBkZGRkIGltbTQiLCAibGRrIHJkLGltbTQiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEiLCAibGRtIEByZCxycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc04wIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCIsICJsZG0gYWRkcmVzc19kc3QocmQpLHJzLG4iLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAxMTAwIDAwMDAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0IiwgImxkbSBhZGRyZXNzX2RzdCxycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAwMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSIsICJsZG0gcmQsQHJzLG4iLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDEwMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjIiwgImxkbSByZCxhZGRyZXNzX3NyYyhycyksbiIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAxIDExMDAgMDAwMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgYWRkcmVzc19zcmMiLCAibGRtIHJkLGFkZHJlc3Nfc3JjLG4iLCAwLAotCi0gICJDWlNWREgiLCAxMiwgMTYsICIwMDExIDEwMDEgc3NOMCAwMDAwIiwgImxkcHMgQHJzIiwgMCwKLSAgIkNaU1ZESCIsIDE2LCAxNiwgIjAxMTEgMTAwMSAwMDAwIDAwMDAgYWRkcmVzc19zcmMiLCAibGRwcyBhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWREgiLCAxNywgMTYsICIwMTExIDEwMDEgc3NOMCAwMDAwIGFkZHJlc3Nfc3JjIiwgImxkcHMgYWRkcmVzc19zcmMocnMpIiwgMCwKLQotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDExIDAwMDAgc3NzcyBkaXNwMTYiLCAibGRyIGRpc3AxNixycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMDExIDAwMDEgMDAwMCBkZGRkIGRpc3AxNiIsICJsZHIgcmQsZGlzcDE2IiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDEwIDAwMDAgc3NzcyBkaXNwMTYiLCAibGRyYiBkaXNwMTYscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDAwIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRyYiByYmQsZGlzcDE2IiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAwMTEgMDExMSAwMDAwIHNzc3MgZGlzcDE2IiwgImxkcmwgZGlzcDE2LHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMDEgMDAwMCBkZGRkIGRpc3AxNiIsICJsZHJsIHJyZCxkaXNwMTYiLCAwLAotCi0gICJDWlMtLS0iLCA3LCAxNiwgIjAxMTEgMTAxMSAwMDAwIDEwMTAiLCAibWJpdCIsIDAsCi0gICItWlMtLS0iLCAxMiwgMTYsICIwMTExIDEwMTEgZGRkZCAxMTAxIiwgIm1yZXEgcmQiLCAwLAotICAiLS0tLS0tIiwgNSwgMTYsICIwMTExIDEwMTEgMDAwMCAxMDAxIiwgIm1yZXMiLCAwLAotICAiLS0tLS0tIiwgNSwgMTYsICIwMTExIDEwMTEgMDAwMCAxMDAwIiwgIm1zZXQiLCAwLAotCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMDAxIDEwMDEgc3NOMCBkZGRkIiwgIm11bHQgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMTAxIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHQgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjAxMDEgMTAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibXVsdCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjAwMDEgMTAwMSAwMDAwIGRkZGQgaW1tMTYiLCAibXVsdCBycmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMTAwMSAxMDAxIHNzc3MgZGRkZCIsICJtdWx0IHJyZCxycyIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDAwMSAxMDAwIHNzTjAgZGRkZCIsICJtdWx0bCBycWQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIwMTAxIDEwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHRsIHJxZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDEwMSAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0bCBycWQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIwMDAxIDEwMDAgMDAwMCBkZGRkIGltbTMyIiwgIm11bHRsIHJxZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMTAwMSAxMDAwIHNzc3MgZGRkZCIsICJtdWx0bCBycWQscnJzIiwgMCwKLSAgIkNaU1YtLSIsIDEyLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMTAiLCAibmVnIEByZCIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZyBhZGRyZXNzX2RzdCIsIDAsCi0gICJDWlNWLS0iLCAxNiwgMTYsICIwMTAwIDExMDEgZGROMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZyBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMDEwIiwgIm5lZyByZCIsIDAsCi0gICJDWlNWLS0iLCAxMiwgOCwgIjAwMDAgMTEwMCBkZE4wIDAwMTAiLCAibmVnYiBAcmQiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDgsICIwMTAwIDExMDAgMDAwMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZ2IgYWRkcmVzc19kc3QiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDgsICIwMTAwIDExMDAgZGROMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZ2IgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAwMDEwIiwgIm5lZ2IgcmJkIiwgMCwKLQotICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgMDAwMCAwMTExIiwgIm5vcCIsIDAsCi0KLSAgIkNaUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTAxIHNzTjAgZGRkZCIsICJvciByZCxAcnMiLCAwLAotICAiQ1pTLS0tIiwgOSwgMTYsICIwMTAwIDAxMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaUy0tLSIsIDEwLCAxNiwgIjAxMDAgMDEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAib3IgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTAxIDAwMDAgZGRkZCBpbW0xNiIsICJvciByZCxpbW0xNiIsIDAsCi0gICJDWlMtLS0iLCA0LCAxNiwgIjEwMDAgMDEwMSBzc3NzIGRkZGQiLCAib3IgcmQscnMiLCAwLAotCi0gICJDWlNQLS0iLCA3LCA4LCAiMDAwMCAwMTAwIHNzTjAgZGRkZCIsICJvcmIgcmJkLEBycyIsIDAsCi0iQ1pTUC0tIiwgOSwgOCwgIjAxMDAgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAib3JiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNQLS0iLCAxMCwgOCwgIjAxMDAgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAib3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTUC0tIiwgNywgOCwgIjAwMDAgMDEwMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgIm9yYiByYmQsaW1tOCIsIDAsCi0gICJDWlNQLS0iLCA0LCA4LCAiMTAwMCAwMTAwIHNzc3MgZGRkZCIsICJvcmIgcmJkLHJicyIsIDAsCi0KLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMTExIGRkTjAgc3NzcyIsICJvdXQgQHJkLHJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzc3MgMDExMCBpbW0xNiIsICJvdXQgaW1tMTYscnMiLCAwLAotICAiLS0tVi0tIiwgMCwgOCwgIjAwMTEgMTExMCBkZE4wIHNzc3MiLCAib3V0YiBAcmQscmJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDEwMTAgc3NzcyAwMTEwIGltbTE2IiwgIm91dGIgaW1tMTYscmJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGQgQHJkLEBycyxyYSIsIDAsCi0gICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGRiIEByZCxAcnMscmJhIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDExMDAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAib3V0aWIgQHJkLEBycyxyYSIsIDAsCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJvdXRpYnIgQHJkLEBycyxyYSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAwMDEgMDExMSBzc04wIGRkTjAiLCAicG9wIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDE2LCAiMDEwMSAwMTExIHNzTjAgZGROMCBhZGRyZXNzX2RzdCIsICJwb3AgYWRkcmVzc19kc3QocmQpLEBycyIsIDAsCi0gICItLS0tLS0iLCAxNiwgMTYsICIwMTAxIDAxMTEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0IiwgInBvcCBhZGRyZXNzX2RzdCxAcnMiLCAwLAotICAiLS0tLS0tIiwgOCwgMTYsICIxMDAxIDAxMTEgc3NOMCBkZGRkIiwgInBvcCByZCxAcnMiLCAwLAotCi0gICItLS0tLS0iLCAxOSwgMzIsICIwMDAxIDAxMDEgc3NOMCBkZE4wIiwgInBvcGwgQHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMywgMzIsICIwMTAxIDAxMDEgc3NOMCBkZE4wIGFkZHJlc3NfZHN0IiwgInBvcGwgYWRkcmVzc19kc3QocmQpLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMywgMzIsICIwMTAxIDAxMDEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0IiwgInBvcGwgYWRkcmVzc19kc3QsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjEwMDEgMDEwMSBzc04wIGRkZGQiLCAicG9wbCBycmQsQHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDAwMSAwMDExIGRkTjAgc3NOMCIsICJwdXNoIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAwMDExIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJwdXNoIEByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAxIDAwMTEgZGROMCBzc04wIGFkZHJlc3Nfc3JjIiwgInB1c2ggQHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDAwIDExMDEgZGROMCAxMDAxIGltbTE2IiwgInB1c2ggQHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDksIDE2LCAiMTAwMSAwMDExIGRkTjAgc3NzcyIsICJwdXNoIEByZCxycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDIwLCAzMiwgIjAwMDEgMDAwMSBkZE4wIHNzTjAiLCAicHVzaGwgQHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMSwgMzIsICIwMTAxIDAwMDEgZGROMCBzc04wIGFkZHJlc3Nfc3JjIiwgInB1c2hsIEByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgMjEsIDMyLCAiMDEwMSAwMDAxIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJwdXNobCBAcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDMyLCAiMTAwMSAwMDAxIGRkTjAgc3NzcyIsICJwdXNobCBAcmQscnJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAxMCAwMDExIGRkTjAgaW1tNCIsICJyZXMgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMCAwMDExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJyZXMgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMCAwMDExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJyZXMgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCAxNiwgIjEwMTAgMDAxMSBkZGRkIGltbTQiLCAicmVzIHJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDAxMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJyZXMgcmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgOCwgIjAwMTAgMDAxMCBkZE4wIGltbTQiLCAicmVzYiBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTAgMDAxMCBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAicmVzYiBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgOCwgIjAxMTAgMDAxMCAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAicmVzYiBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDgsICIxMDEwIDAwMTAgZGRkZCBpbW00IiwgInJlc2IgcmJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCA4LCAiMDAxMCAwMDEwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInJlc2IgcmJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMDExIiwgInJlc2ZsZyBpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjEwMDEgMTExMCAwMDAwIGNjY2MiLCAicmV0IGNjIiwgMCwKLQotICAiQ1pTVi0tIiwgNiwgMTYsICIxMDExIDAwMTEgZGRkZCAwMEkwIiwgInJsIHJkLGltbTFvcjIiLCAwLAotICAiQ1pTVi0tIiwgNiwgOCwgIjEwMTEgMDAxMCBkZGRkIDAwSTAiLCAicmxiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTBJMCIsICJybGMgcmQsaW1tMW9yMiIsIDAsCi0KLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDAwMTAgZGRkZCAxMEkwIiwgInJsY2IgcmJkLGltbTFvcjIiLCAwLAotICAiLVotLS0tIiwgOSwgOCwgIjEwMTEgMTExMCBhYWFhIGJiYmIiLCAicmxkYiByYmIscmJhIiwgMCwKLQotICAiQ1pTVi0tIiwgNiwgMTYsICIxMDExIDAwMTEgZGRkZCAwMUkwIiwgInJyIHJkLGltbTFvcjIiLCAwLAotICAiQ1pTVi0tIiwgNiwgOCwgIjEwMTEgMDAxMCBkZGRkIDAxSTAiLCAicnJiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTFJMCIsICJycmMgcmQsaW1tMW9yMiIsIDAsCi0KLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDAwMTAgZGRkZCAxMUkwIiwgInJyY2IgcmJkLGltbTFvcjIiLCAwLAotICAiLVotLS0tIiwgOSwgOCwgIjEwMTEgMTEwMCBhYWFhIGJiYmIiLCAicnJkYiByYmIscmJhIiwgMCwKLSAgIkNaU1YtLSIsIDUsIDE2LCAiMTAxMSAwMTExIHNzc3MgZGRkZCIsICJzYmMgcmQscnMiLCAwLAotICAiQ1pTVkRIIiwgNSwgOCwgIjEwMTEgMDExMCBzc3NzIGRkZGQiLCAic2JjYiByYmQscmJzIiwgMCwKLQotICAiQ1pTVkRIIiwgMzMsIDgsICIwMTExIDExMTEgaW1tOCIsICJzYyBpbW04IiwgMCwKLQotIkNaU1YtLSIsIDE1LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGEgcmQscnMiLCAwLAotIkNaU1YtLSIsIDE1LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkYWIgcmJkLHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjEwMTEgMDAxMSBkZGRkIDExMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGFsIHJyZCxycyIsIDAsCi0KLSJDWlMtLS0iLCAxNSwgMTYsICIxMDExIDAwMTEgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsIHJkLHJzIiwgMCwKLSJDWlMtLS0iLCAxNSwgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGxiIHJiZCxycyIsIDAsCi0gICJDWlMtLS0iLCAxNSwgMzIsICIxMDExIDAwMTEgZGRkZCAwMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsbCBycmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDEwIDAxMDEgZGROMCBpbW00IiwgInNldCBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTEwIDAxMDEgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldCBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgMTYsICIwMTEwIDAxMDEgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldCBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDE2LCAiMTAxMCAwMTAxIGRkZGQgaW1tNCIsICJzZXQgcmQsaW1tNCIsIDAsCi0iLS0tLS0tIiwgMTAsIDE2LCAiMDAxMCAwMTAxIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInNldCByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjAwMTAgMDEwMCBkZE4wIGltbTQiLCAic2V0YiBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTAgMDEwMCBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAic2V0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgOCwgIjAxMTAgMDEwMCAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAic2V0YiBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDgsICIxMDEwIDAxMDAgZGRkZCBpbW00IiwgInNldGIgcmJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCA4LCAiMDAxMCAwMTAwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInNldGIgcmJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMDAxIiwgInNldGZsZyBpbW00IiwgMCwKLQotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBkZGRkIDAxMDEgaW1tMTYiLCAic2luYiByYmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMSBkZGRkIDAxMDEgaW1tMTYiLCAic2luYiByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCIsICJzaW5kIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCIsICJzaW5kYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNpbmliIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDExMDAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDAwMDAiLCAic2luaWJyIEByZCxAcnMscmEiLCAwLAotCi0gICJDWlNWLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAxMDAxIDAwMDAgMDAwMCBpbW04IiwgInNsYSByZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAwMSAgMDAwMCAwMDAwIGltbTgiLCAic2xhYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAxMTAxIDAwMDAgMDAwMCBpbW04IiwgInNsYWwgcnJkLGltbTgiLCAwLAotCi0gICJDWlMtLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAwMDAxIDAwMDAgMDAwMCBpbW04IiwgInNsbCByZCxpbW04IiwgMCwKLSAgIkNaUy0tLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMDAwMSAgMDAwMCAwMDAwIGltbTgiLCAic2xsYiByYmQsaW1tOCIsIDAsCi0gICJDWlMtLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAwMTAxIDAwMDAgMDAwMCBpbW04IiwgInNsbGwgcnJkLGltbTgiLCAwLAotCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc3NzIDAxMTEgaW1tMTYiLCAic291dCBpbW0xNixycyIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzc3MgMDExMSBpbW0xNiIsICJzb3V0YiBpbW0xNixyYnMiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAic291dGQgQHJkLEBycyxyYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRkYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRpYiBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAwMDAwIiwgInNvdXRpYnIgQHJkLEBycyxyYSIsIDAsCi0KLSAgIkNaU1YtLSIsIDEzLCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwMDEgMTExMSAxMTExIG5pbTgiLCAic3JhIHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDgsICIxMDExIDAwMTAgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04IiwgInNyYWIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMTEwMSAxMTExIDExMTEgbmltOCIsICJzcmFsIHJyZCxpbW04IiwgMCwKLQotICAiQ1pTVi0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAwMSAxMTExIDExMTEgbmltOCIsICJzcmwgcmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMDEgMTExMSAxMTExIG5pbTgiLCAic3JsYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAwMTAxIDExMTEgMTExMSBuaW04IiwgInNybGwgcnJkLGltbTgiLCAwLAotCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMDAxMSBzc04wIGRkZGQiLCAic3ViIHJkLEBycyIsIDAsCi0iQ1pTVi0tIiwgOSwgMTYsICIwMTAwIDAwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YiByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgMTYsICIwMTAwIDAwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YiByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMTAgMDAwMCBkZGRkIGltbTE2IiwgInN1YiByZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCA0LCAxNiwgIjEwMDAgMDAxMSBzc3NzIGRkZGQiLCAic3ViIHJkLHJzIiwgMCwKLQotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAxMCBzc04wIGRkZGQiLCAic3ViYiByYmQsQHJzIiwgMCwKLSJDWlNWREgiLCA5LCA4LCAiMDEwMCAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWJiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWREgiLCAxMCwgOCwgIjAxMDAgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAic3ViYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJzdWJiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1ZESCIsIDQsIDgsICIxMDAwIDAwMTAgc3NzcyBkZGRkIiwgInN1YmIgcmJkLHJicyIsIDAsCi0KLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAxMCBzc04wIGRkZGQiLCAic3VibCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAic3VibCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDMyLCAiMDEwMSAwMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMDEwIDAwMDAgZGRkZCBpbW0zMiIsICJzdWJsIHJyZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDAxMCBzc3NzIGRkZGQiLCAic3VibCBycmQscnJzIiwgMCwKLQotICAiLS0tLS0tIiwgNSwgMTYsICIxMDEwIDExMTEgZGRkZCBjY2NjIiwgInRjYyBjYyxyZCIsIDAsCi0gICItLS0tLS0iLCA1LCA4LCAiMTAxMCAxMTEwIGRkZGQgY2NjYyIsICJ0Y2NiIGNjLHJiZCIsIDAsCi0KLSAgIi1aUy0tLSIsIDgsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDEwMCIsICJ0ZXN0IEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3QgYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0IGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAxMDAiLCAidGVzdCByZCIsIDAsCi0KLSAgIi1aU1AtLSIsIDgsIDgsICIwMDAwIDExMDAgZGROMCAwMTAwIiwgInRlc3RiIEByZCIsIDAsCi0gICItWlNQLS0iLCAxMSwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMDAgYWRkcmVzc19kc3QiLCAidGVzdGIgYWRkcmVzc19kc3QiLCAwLAotICAiLVpTUC0tIiwgMTIsIDgsICIwMTAwIDExMDAgZGROMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3RiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDEwMCIsICJ0ZXN0YiByYmQiLCAwLAotCi0gICItWlMtLS0iLCAxMywgMzIsICIwMDAxIDExMDAgZGROMCAxMDAwIiwgInRlc3RsIEByZCIsIDAsCi0iLVpTLS0tIiwgMTYsIDMyLCAiMDEwMSAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0bCBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlMtLS0iLCAxNywgMzIsICIwMTAxIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgInRlc3RsIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlMtLS0iLCAxMywgMzIsICIxMDAxIDExMDAgZGRkZCAxMDAwIiwgInRlc3RsIHJyZCIsIDAsCi0KLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMTAwMCAwMDAwIGFhYWEgc3NOMCAwMDAwIiwgInRyZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAxMTAwIDAwMDAgYWFhYSBzc04wIDAwMDAiLCAidHJkcmIgQHJkLEBycyxyYmEiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAwMDAwIDAwMDAgcnJyciBzc04wIDAwMDAiLCAidHJpYiBAcmQsQHJzLHJiciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBkZE4wIDAxMDAgMDAwMCBycnJyIHNzTjAgMDAwMCIsICJ0cmlyYiBAcmQsQHJzLHJiciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBhYU4wIDExMTAgMDAwMCBycnJyIGJiTjAgMTExMCIsICJ0cnRkcmIgQHJhLEByYixyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAwMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAiLCAidHJ0aWIgQHJhLEByYixyciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBhYU4wIDAxMTAgMDAwMCBycnJyIGJiTjAgMTExMCIsICJ0cnRpcmIgQHJhLEByYixyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAxMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAiLCAidHJ0cmIgQHJhLEByYixyYnIiLCAwLAotCi0gICItLVMtLS0iLCAxMSwgMTYsICIwMDAwIDExMDEgZGROMCAwMTEwIiwgInRzZXQgQHJkIiwgMCwKLSAgIi0tUy0tLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAxMTAgYWRkcmVzc19kc3QiLCAidHNldCBhZGRyZXNzX2RzdCIsIDAsCi0gICItLVMtLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXQgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tUy0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMDExMCIsICJ0c2V0IHJkIiwgMCwKLQotICAiLS1TLS0tIiwgMTEsIDgsICIwMDAwIDExMDAgZGROMCAwMTEwIiwgInRzZXRiIEByZCIsIDAsCi0gICItLVMtLS0iLCAxNCwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMTAgYWRkcmVzc19kc3QiLCAidHNldGIgYWRkcmVzc19kc3QiLCAwLAotICAiLS1TLS0tIiwgMTUsIDgsICIwMTAwIDExMDAgZGROMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXRiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLVMtLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDExMCIsICJ0c2V0YiByYmQiLCAwLAotCi0gICItWlMtLS0iLCA3LCAxNiwgIjAwMDAgMTAwMSBzc04wIGRkZGQiLCAieG9yIHJkLEBycyIsIDAsCi0iLVpTLS0tIiwgOSwgMTYsICIwMTAwIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvciByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlMtLS0iLCAxMCwgMTYsICIwMTAwIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvciByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDEwMDEgMDAwMCBkZGRkIGltbTE2IiwgInhvciByZCxpbW0xNiIsIDAsCi0gICItWlMtLS0iLCA0LCAxNiwgIjEwMDAgMTAwMSBzc3NzIGRkZGQiLCAieG9yIHJkLHJzIiwgMCwKLQotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMTAwMCBzc04wIGRkZGQiLCAieG9yYiByYmQsQHJzIiwgMCwKLSItWlNQLS0iLCA5LCA4LCAiMDEwMCAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3JiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlNQLS0iLCAxMCwgOCwgIjAxMDAgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAieG9yYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDEwMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJ4b3JiIHJiZCxpbW04IiwgMCwKLSAgIi1aU1AtLSIsIDQsIDgsICIxMDAwIDEwMDAgc3NzcyBkZGRkIiwgInhvcmIgcmJkLHJicyIsIDAsCi0gICIqIiwgNCwgOCwgIjEwMDAgMTAwMCBzc3NzIGRkZGQiLCAieG9yYiByYmQscmJzIiwgMCwKLSAgIioiLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi1pbnQKLWNvdW50ICgpCi17Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLSAgaW50IHIgPSAwOwotCi0gIHdoaWxlIChwLT5uYW1lKQotICAgIHsKLSAgICAgIHIrKzsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHJldHVybiByOwotCi19Ci0KLXN0YXRpYwotaW50Ci1mdW5jIChhLCBiKQotICAgICBzdHJ1Y3Qgb3AgKmE7Ci0gICAgIHN0cnVjdCBvcCAqYjsKLXsKLSAgcmV0dXJuIHN0cmNtcCAoKGEpLT5uYW1lLCAoYiktPm5hbWUpOwotfQotCi0KLS8qIG9wY29kZQotCi0gbGl0ZXJhbCAgMDAwMCBubm5uIGluc2VydCBubm4gaW50byBzdHJlYW0KLSBvcGVyYW5kICAwMDAxIG5ubm4gIGluc2VydCBvcGVyYW5kIHJlZyBubm4gaW50byBzdHJlYW0KLSovCi0KLXN0cnVjdCB0b2tfc3RydWN0Ci17Ci0KLSAgY2hhciAqbWF0Y2g7Ci0gIGNoYXIgKnRva2VuOwotICBpbnQgbGVuZ3RoOwotfTsKLQotc3RydWN0IHRva19zdHJ1Y3QgYXJnc1tdID0KLXsKLQotICB7ImFkZHJlc3Nfc3JjKHJzKSIsICJDTEFTU19YKyhBUkdfUlMpIix9LAotICB7ImFkZHJlc3NfZHN0KHJkKSIsICJDTEFTU19YKyhBUkdfUkQpIix9LAotCi0gIHsicnMoaW1tMTYpIiwgIkNMQVNTX0JBKyhBUkdfUlMpIix9LAotICB7InJkKGltbTE2KSIsICJDTEFTU19CQSsoQVJHX1JEKSIsfSwKLSAgeyJwcmQiLCAgICAgICAiQ0xBU1NfUFIrKEFSR19SRCkiLH0sCi0gIHsiYWRkcmVzc19zcmMiLCAiQ0xBU1NfREErKEFSR19TUkMpIix9LAotICB7ImFkZHJlc3NfZHN0IiwgIkNMQVNTX0RBKyhBUkdfRFNUKSIsfSwKLSAgeyJyZChyeCkiLCAiQ0xBU1NfQlgrKEFSR19SRCkiLH0sCi0gIHsicnMocngpIiwgIkNMQVNTX0JYKyhBUkdfUlMpIix9LAotCi0gIHsiZGlzcDE2IiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZGlzcDEyIiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZGlzcDciLCAiQ0xBU1NfRElTUCIsfSwKLSAgeyJkaXNwOCIsICJDTEFTU19ESVNQIix9LAotICB7ImZsYWdzIiwgIkNMQVNTX0ZMQUdTIix9LAotCi0gIHsiaW1tMTYiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMTYpIix9LAotICB7ImltbTFvcjIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMikiLH0sCi0gIHsiaW1tMzIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMzIpIix9LAotICB7ImltbTRtMSIsICJDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSIsfSwKLSAgeyJpbW00IiwgIkNMQVNTX0lNTSArKEFSR19JTU00KSIsfSwKLSAgeyJuIiwgIkNMQVNTX0lNTSArIChBUkdfSU1NTikiLH0sCi0gIHsiY3RybCIsICJDTEFTU19DVFJMIix9LAotICB7InJiYSIsICJDTEFTU19SRUdfQllURSsoQVJHX1JBKSIsfSwKLSAgeyJyYmIiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SQikiLH0sCi0gIHsicmJkIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUkQpIix9LAotICB7InJicyIsICJDTEFTU19SRUdfQllURSsoQVJHX1JTKSIsfSwKLSAgeyJyYnIiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SUikiLH0sCi0KLSAgeyJycmQiLCAiQ0xBU1NfUkVHX0xPTkcrKEFSR19SRCkiLH0sCi0gIHsicnJzIiwgIkNMQVNTX1JFR19MT05HKyhBUkdfUlMpIix9LAotCi0gIHsicnFkIiwgIkNMQVNTX1JFR19RVUFEKyhBUkdfUkQpIix9LAotCi0gIHsicmQiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SRCkiLH0sCi0gIHsicnMiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUykiLH0sCi0KLSAgeyJAcmQiLCAiQ0xBU1NfSVIrKEFSR19SRCkiLH0sCi0gIHsiQHJhIiwgIkNMQVNTX0lSKyhBUkdfUkEpIix9LAotICB7IkByYiIsICJDTEFTU19JUisoQVJHX1JCKSIsfSwKLSAgeyJAcnMiLCAiQ0xBU1NfSVIrKEFSR19SUykiLH0sCi0KLSAgeyJpbW04IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTgpIix9LAotICB7ImkyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTIpIix9LAotICB7ImNjIiwgIkNMQVNTX0NDIix9LAotCi0gIHsicnIiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUikiLH0sCi0gIHsicmEiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSkiLH0sCi0gIHsicnMiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUykiLH0sCi0KLSAgeyIxIiwgIkNMQVNTX0lNTSsoQVJHX0lNTV8xKSIsfSwKLSAgeyIyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTV8yKSIsfSwKLQotICAwLCAwCi19OwotCi1zdHJ1Y3QgdG9rX3N0cnVjdCB0b2tzW10gPQotewotICAiMDAwMCIsICJDTEFTU19CSVQrMCIsIDEsCi0gICIwMDAxIiwgIkNMQVNTX0JJVCsxIiwgMSwKLSAgIjAwMTAiLCAiQ0xBU1NfQklUKzIiLCAxLAotICAiMDAxMSIsICJDTEFTU19CSVQrMyIsIDEsCi0gICIwMTAwIiwgIkNMQVNTX0JJVCs0IiwgMSwKLSAgIjAxMDEiLCAiQ0xBU1NfQklUKzUiLCAxLAotICAiMDExMCIsICJDTEFTU19CSVQrNiIsIDEsCi0gICIwMTExIiwgIkNMQVNTX0JJVCs3IiwgMSwKLSAgIjEwMDAiLCAiQ0xBU1NfQklUKzgiLCAxLAotICAiMTAwMSIsICJDTEFTU19CSVQrOSIsIDEsCi0gICIxMDEwIiwgIkNMQVNTX0JJVCsweGEiLCAxLAotICAiMTAxMSIsICJDTEFTU19CSVQrMHhiIiwgMSwKLSAgIjExMDAiLCAiQ0xBU1NfQklUKzB4YyIsIDEsCi0gICIxMTAxIiwgIkNMQVNTX0JJVCsweGQiLCAxLAotICAiMTExMCIsICJDTEFTU19CSVQrMHhlIiwgMSwKLSAgIjExMTEiLCAiQ0xBU1NfQklUKzB4ZiIsIDEsCi0KLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMCIsIDEsCi0gICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzEiLCAxLAotICAiMDBJMCIsICJDTEFTU19CSVRfMU9SMisyIiwgMSwKLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMyIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzQiLCAxLAotICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis1IiwgMSwKLSAgIjAxSTAiLCAiQ0xBU1NfQklUXzFPUjIrNiIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzciLCAxLAotICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMis4IiwgMSwKLSAgIjEwSTAiLCAiQ0xBU1NfQklUXzFPUjIrOSIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YSIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YiIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YyIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZCIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZSIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZiIsIDEsCi0KLSAgInNzc3MiLCAiQ0xBU1NfUkVHKyhBUkdfUlMpIiwgMSwKLSAgImRkZGQiLCAiQ0xBU1NfUkVHKyhBUkdfUkQpIiwgMSwKLSAgImFhYWEiLCAiQ0xBU1NfUkVHKyhBUkdfUkEpIiwgMSwKLSAgImJiYmIiLCAiQ0xBU1NfUkVHKyhBUkdfUkIpIiwgMSwKLSAgInJycnIiLCAiQ0xBU1NfUkVHKyhBUkdfUlIpIiwgMSwKLQotICAic3NOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JTKSIsIDEsCi0gICJkZE4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUkQpIiwgMSwKLSAgImFhTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SQSkiLCAxLAotICAiYmJOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JCKSIsIDEsCi0gICJyck4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUlIpIiwgMSwKLQotICAiY2NjYyIsICJDTEFTU19DQyIsIDEsCi0gICJubm5uIiwgIkNMQVNTX0lNTSsoQVJHX0lNTU4pIiwgMSwKLSAgInh4eHgiLCAiQ0xBU1NfUkVHKyhBUkdfUlgpIiwgMSwKLSAgInh4TjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SWCkiLCAxLAotICAibm1pbnVzMSIsICJDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSIsIDEsCi0KLSAgImRpc3AxNiIsICJDTEFTU19ESVNQKyhBUkdfRElTUDE2KSIsIDQsCi0gICJkaXNwMTIiLCAiQ0xBU1NfRElTUCsoQVJHX0RJU1AxMikiLCAzLAotICAiZmxhZ3MiLCAiQ0xBU1NfRkxBR1MiLCAxLAotICAiYWRkcmVzc19kc3QiLCAiQ0xBU1NfQUREUkVTUysoQVJHX0RTVCkiLCA0LAotICAiYWRkcmVzc19zcmMiLCAiQ0xBU1NfQUREUkVTUysoQVJHX1NSQykiLCA0LAotICAiaW1tNG0xIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTRNMSkiLCAxLAotICAiaW1tNCIsICJDTEFTU19JTU0rKEFSR19JTU00KSIsIDEsCi0KLSAgImltbTgiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NOCkiLCAyLAotICAiaW1tMTYiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMTYpIiwgNCwKLSAgImltbTMyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTMyKSIsIDgsCi0gICJuaW04IiwgIkNMQVNTX0lNTSsoQVJHX05JTTgpIiwgMiwKLSAgIjBjY2MiLCAiQ0xBU1NfMENDQyIsIDEsCi0gICIxY2NjIiwgIkNMQVNTXzFDQ0MiLCAxLAotICAiZGlzcDgiLCAiQ0xBU1NfRElTUDgiLCAyLAotICAiMGRpc3A3IiwgIkNMQVNTXzBESVNQNyIsIDIsCi0gICIxZGlzcDciLCAiQ0xBU1NfMURJU1A3IiwgMiwKLSAgIjAxaWkiLCAiQ0xBU1NfMDFJSSIsIDEsCi0gICIwMGlpIiwgIkNMQVNTXzAwSUkiLCAxLAotICAwLCAwCi0KLX07Ci0KLWNoYXIgKgotdHJhbnNsYXRlICh0YWJsZSwgeCwgbGVuZ3RoKQotICAgICBzdHJ1Y3QgdG9rX3N0cnVjdCAqdGFibGU7Ci0gICAgIGNoYXIgKng7Ci0gICAgIGludCAqbGVuZ3RoOwotewotCi0gIGludCBmb3VuZDsKLQotICBmb3VuZCA9IDA7Ci0gIHdoaWxlICh0YWJsZS0+bWF0Y2gpCi0gICAgewotICAgICAgaW50IGwgPSBzdHJsZW4gKHRhYmxlLT5tYXRjaCk7Ci0KLSAgICAgIGlmIChzdHJuY21wICh0YWJsZS0+bWF0Y2gsIHgsIGwpID09IDApCi0JewotCSAgLyogR290IGEgaGl0ICovCi0JICBwcmludGYgKCIlcyIsIHRhYmxlLT50b2tlbik7Ci0JICAqbGVuZ3RoICs9IHRhYmxlLT5sZW5ndGg7Ci0JICByZXR1cm4geCArIGw7Ci0JfQotCi0gICAgICB0YWJsZSsrOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3QgZmluZCAlc1xuIiwgeCk7Ci0gIHByaW50ZiAoIioqKiogQ2FuJ3QgZmluZCAlc1xuIiwgeCk7Ci0gIHdoaWxlICgqeCkKLSAgICB4Kys7Ci0gIHJldHVybiB4OwotfQotCi12b2lkCi1jaGV3Yml0cyAoYml0cywgbGVuZ3RoKQotICAgICBjaGFyICpiaXRzOwotICAgICBpbnQgKmxlbmd0aDsKLXsKLSAgaW50IG4gPSAwOwotCi0gICpsZW5ndGggPSAwOwotICBwcmludGYgKCJ7Iik7Ci0gIHdoaWxlICgqYml0cykKLSAgICB7Ci0gICAgICB3aGlsZSAoKmJpdHMgPT0gJyAnKQotCXsKLQkgIGJpdHMrKzsKLQl9Ci0gICAgICBiaXRzID0gdHJhbnNsYXRlICh0b2tzLCBiaXRzLCBsZW5ndGgpOwotICAgICAgbisrOwotICAgICAgcHJpbnRmICgiLCIpOwotCi0gICAgfQotICB3aGlsZSAobiA8IEJZVEVfSU5GT19MRU4gLSAxKQotICAgIHsKLSAgICAgIHByaW50ZiAoIjAsIik7Ci0gICAgICBuKys7Ci0gICAgfQotICBwcmludGYgKCJ9Iik7Ci19Ci0KLQotc3RhdGljCi1pbnQKLWNoZXduYW1lIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBjaGFyICpuOwotICBpbnQgbmFyZ3MgPSAwOwotCi0gIG4gPSBuYW1lOwotICBwcmludGYgKCJcIiIpOwotICB3aGlsZSAoKm4gJiYgIWlzd2hpdGUgKCpuKSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlYyIsICpuKTsKLSAgICAgIG4rKzsKLSAgICB9Ci0gIHByaW50ZiAoIlwiLCIpOwkJLyogU2NhbiB0aGUgb3BlcmFuZHMgYW5kIG1ha2UgZW50aXJlcyBmb3IKLQkJCQkgICB0aGVtIC1yZW1lbWJlciBpbmRpcmVjdCB0aGluZ3MgKi8KLQotICBuID0gbmFtZTsKLSAgcHJpbnRmICgiT1BDXyIpOwotICB3aGlsZSAoKm4gJiYgIWlzd2hpdGUgKCpuKSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlYyIsICpuKTsKLSAgICAgIG4rKzsKLSAgICB9Ci0gIHByaW50ZiAoIiwwLHsiKTsKLQotICB3aGlsZSAoKm4pCi0gICAgewotICAgICAgaW50IGQ7Ci0KLSAgICAgIHdoaWxlICgqbiA9PSAnLCcgfHwgaXN3aGl0ZSAoKm4pKQotCW4rKzsKLSAgICAgIG5hcmdzKys7Ci0gICAgICBuID0gdHJhbnNsYXRlIChhcmdzLCBuLCAmZCk7Ci0gICAgICBwcmludGYgKCIsIik7Ci0gICAgfQotICBpZiAobmFyZ3MgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIwIik7Ci0gICAgfQotICBwcmludGYgKCJ9LCIpOwotICByZXR1cm4gbmFyZ3M7Ci19Ci0KLXN0YXRpYyAKLXZvaWQKLXN1YiAoeCwgYykKLSAgICAgY2hhciAqeDsKLSAgICAgY2hhciBjOwotewotICB3aGlsZSAoKngpCi0gICAgewotICAgICAgaWYgKHhbMF0gPT0gYyAmJiB4WzFdID09IGMgJiYKLQkgIHhbMl0gPT0gYyAmJiB4WzNdID09IGMpCi0JewotCSAgeFsyXSA9ICdOJzsKLQkgIHhbM10gPSAnMCc7Ci0JfQotICAgICAgeCsrOwotICAgIH0KLX0KLQotCi0jaWYgMAotI2RlZmluZSBEKHgpICgoeCkgPT0gJzEnIHx8ICh4KSA9PScwJykKLSNkZWZpbmUgTSh5KSAoc3RybmNtcCh5LHgsNCk9PTApCi1wcmludG1hbmdsZWQgKHgpCi0gICAgIGNoYXIgKng7Ci17Ci0gIHJldHVybjsKLSAgd2hpbGUgKCp4KQotICAgIHsKLSAgICAgIGlmIChEICh4WzBdKSAmJiBEICh4WzFdKSAmJiBEICh4WzJdKSAmJiBEICh4WzNdKSkKLQl7Ci0JICBwcmludGYgKCJYWFhYIik7Ci0JfQotICAgICAgZWxzZSBpZiAoTSAoInNzc3MiKSkKLQl7Ci0JICBwcmludGYgKCJzc3NzIik7Ci0JfQotICAgICAgZWxzZSBpZiAoTSAoImRkZGQiKSkKLQl7Ci0JICBwcmludGYgKCJkZGRkIik7Ci0JfQotICAgICAgZWxzZQotCXByaW50ZiAoIl9fX18iKTsKLQotICAgICAgeCArPSA0OwotCi0gICAgICBpZiAoeFswXSA9PSAnICcpCi0JewotCSAgcHJpbnRmICgiXyIpOwotCSAgeCsrOwotCX0KLSAgICB9Ci0KLX0KLQotI2VuZGlmCi0vKiNkZWZpbmUgV09SS19UWVBFKi8KLXZvaWQKLXByaW50X3R5cGUgKG4pCi0gICAgIHN0cnVjdCBvcCAqbjsKLXsKLSNpZmRlZiBXT1JLX1RZUEUKLSAgd2hpbGUgKCpzICYmICFpc3doaXRlICgqcykpCi0gICAgewotICAgICAgbCA9ICpzOwotICAgICAgcysrOwotICAgIH0KLSAgc3dpdGNoIChsKQotICAgIHsKLSAgICBjYXNlICdsJzoKLSAgICAgIHByaW50ZiAoIjMyLCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICBwcmludGYgKCI4LCIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoIjE2LCIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2Vsc2UKLSAgcHJpbnRmICgiJTJkLCIsIG4tPnR5cGUpOwotI2VuZGlmCi19Ci0KLQotdm9pZAotaW50ZXJuYWwgKCkKLXsKLSAgaW50IGMgPSBjb3VudCAoKTsKLSAgc3RydWN0IG9wICpuZXcgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcCkgKiBjKTsKLSAgc3RydWN0IG9wICpwID0gb3B0OwotICBtZW1jcHkgKG5ldywgcCwgYyAqIHNpemVvZiAoc3RydWN0IG9wKSk7Ci0KLSAgLyogc29ydCBhbGwgbmFtZXMgaW4gdGFibGUgYWxwaGFiZXRpY2FsbHkgKi8KLSAgcXNvcnQgKG5ldywgYywgc2l6ZW9mIChzdHJ1Y3Qgb3ApLCBmdW5jKTsKLQotICBwID0gbmV3OwotICB3aGlsZSAocC0+ZmxhZ3NbMF0gIT0gJyonKQotICB7Ci0gICAgLyogSWYgdGhlcmUgYXJlIGFueSBAcnMsIHN1YiB0aGUgc3NzcyBpbnRvIGEgc3NuMCwKLSAgICAgICAocnMpLCAoc3NuMCkKLSAgICAgICAqLwotICAgIGludCBsb29wID0gMTsKLQotICAgIHByaW50ZiAoIlwiJXNcIiwlMmQsICIsIHAtPmZsYWdzLCBwLT5jeWNsZXMpOwotICAgIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIGNoYXIgKnMgPSBwLT5uYW1lOwotCi0gICAgICBsb29wID0gMDsKLSAgICAgIHdoaWxlICgqcykKLSAgICAgIHsKLQlpZiAoc1swXSA9PSAnQCcpCi0JewotCSAgY2hhciBjOwotCi0JICAvKiBza2lwIHRoZSByIGFuZCBzdWIgdGhlIHN0cmluZyAqLwotCSAgcysrOwotCSAgYyA9IHNbMV07Ci0JICBzdWIgKHAtPmJpdHMsIGMpOwotCX0KLQlpZiAoc1swXSA9PSAnKCcgJiYgc1szXSA9PSAnKScpCi0JewotCSAgc3ViIChwLT5iaXRzLCBzWzJdKTsKLQl9Ci0JaWYgKHNbMF0gPT0gJygnKQotCXsKLQkgIHN1YiAocC0+Yml0cywgc1stMV0pOwotCX0KLQotCXMrKzsKLSAgICAgIH0KLQotICAgIH0KLSAgICBwcmludF90eXBlIChwKTsKLSAgICBwcmludGYgKCJcIiVzXCIsXCIlc1wiLDAsXG4iLCBwLT5iaXRzLCBwLT5uYW1lKTsKLSAgICBwKys7Ci0gIH0KLX0KLQotc3RhdGljIAotdm9pZAotZ2FzICgpCi17Ci0gIGludCBjID0gY291bnQgKCk7Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLSAgaW50IGlkeCA9IDA7Ci0gIGNoYXIgKm9sZG5hbWUgPSAiIjsKLSAgc3RydWN0IG9wICpuZXcgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcCkgKiBjKTsKLQotICBtZW1jcHkgKG5ldywgcCwgYyAqIHNpemVvZiAoc3RydWN0IG9wKSk7Ci0KLSAgLyogc29ydCBhbGwgbmFtZXMgaW4gdGFibGUgYWxwaGFiZXRpY2FsbHkgKi8KLSAgcXNvcnQgKG5ldywgYywgc2l6ZW9mIChzdHJ1Y3Qgb3ApLCBmdW5jKTsKLQotICBwcmludGYgKCIJCQkvKiBUSElTIEZJTEUgSVMgQVVUT01BR0lDQUxMWSBHRU5FUkFURUQsIERPTidUIEVESVQgSVQgKi9cbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX01BU0sgMHgwZlxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfU1JDIDB4MDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19EU1QgMHgwMlxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUlMgMHgwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JEIDB4MDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SQSAweDAzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUkIgMHgwNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JSIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SWCAweDA2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NNCAweDAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NOCAweDAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMTYgMHgwM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTMyIDB4MDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1OIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1OTUlOVVMxIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1fMSAweDA2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NXzIgMHgwN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0RJU1AxNiAweDA4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfTklNOCAweDA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMiAweDBhXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMU9SMiAweDBiXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQMTIgMHgwYlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0RJU1A4IDB4MGNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU00TTEgMHgwZFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfTUFTSyAweDFmZmYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19YIDB4MTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JBIDB4MjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0RBIDB4MzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JYIDB4NDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0RJU1AgMHg1MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfSU1NIDB4NjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0NDIDB4NzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0NUUkwgMHg4MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQUREUkVTUyAweGQwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wQ0NDIDB4ZTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzFDQ0MgMHhmMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMERJU1A3IDB4MTAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18xRElTUDcgMHgyMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzAxSUkgMHgzMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzAwSUkgMHg0MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JJVCAweDUwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfRkxBR1MgMHg2MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0lSIDB4NzAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19ESVNQOCAweDgwMFxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CSVRfMU9SMiAweDkwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHIDB4NzAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX0JZVEUgMHgyMDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdfV09SRCAweDMwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19RVUFEIDB4NDAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX0xPTkcgMHg1MDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdOMCAweDgwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1BSIDB4MTAwMDBcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkYyAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRjYiAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkIDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGRiIDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGRsIDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hbmQgNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FuZGIgNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JpdCA3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYml0YiA4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY2FsbCA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY2FsciAxMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NsciAxMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NscmIgMTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jb20gMTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jb21iIDE0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tZmxnIDE1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3AgMTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGIgMTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGQgMThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGRiIDE5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkciAyMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwZHJiIDIxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpIDIyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpYiAyM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaXIgMjRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGlyYiAyNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwbCAyNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2QgMjdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkYiAyOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2RyIDI5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzZHJiIDMwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaSAzMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2liIDMyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaXIgMzNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNpcmIgMzRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kYWIgMzVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kYmpueiAzNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RlYyAzN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RlY2IgMzhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaSAzOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RpdiA0MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RpdmwgNDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kam56IDQyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZWkgNDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leCA0NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4YiA0NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dHMgNDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzYiA0N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dHNsIDQ4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaGFsdCA0OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luIDUwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5iIDUxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5jIDUyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5jYiA1M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luZCA1NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luZGIgNTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmliIDU2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5pYnIgNTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pcmV0IDU4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfanAgNTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19qciA2MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkIDYxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRhIDYyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRhciA2M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYiA2NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkY3RsIDY1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpciA2NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaXJiIDY3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRrIDY4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRsIDY5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRtIDcwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRwcyA3MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkciA3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkcmIgNzNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHJsIDc0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbWJpdCA3NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX21yZXEgNzZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tcmVzIDc3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXNldCA3OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX211bHQgNzlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tdWx0bCA4MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX25lZyA4MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX25lZ2IgODJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ub3AgODNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vciA4NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX29yYiA4NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dCA4NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGIgODdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRkIDg4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0ZGIgODlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRpYiA5MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGliciA5MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3BvcCA5MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3BvcGwgOTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19wdXNoIDk0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcHVzaGwgOTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yZXMgOTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yZXNiIDk3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzZmxnIDk4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmV0IDk5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmwgMTAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmxiIDEwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsYyAxMDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGNiIDEwM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsZGIgMTA0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnIgMTA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnJiIDEwNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyYyAxMDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmNiIDEwOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyZGIgMTA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2JjIDExMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NiY2IgMTExXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RhIDExMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYWIgMTEzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RhbCAxMTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGwgMTE1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsYiAxMTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGxsIDExN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NldCAxMThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXRiIDExOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NldGZsZyAxMjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5iIDEyMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmQgMTIyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luZGIgMTIzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luaWIgMTI0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luaWJyIDEyNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsYSAxMjZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGFiIDEyN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsYWwgMTI4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xsIDEyOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbGIgMTMwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xsbCAxMzFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0IDEzMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRiIDEzM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRkIDEzNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRkYiAxMzVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0aWIgMTM2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGliciAxMzdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmEgMTM4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhYiAxMzlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmFsIDE0MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NybCAxNDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmxiIDE0MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NybGwgMTQzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3ViIDE0NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YmIgMTQ1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3VibCAxNDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190Y2MgMTQ3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGNjYiAxNDhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0IDE0OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Rlc3RiIDE1MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Rlc3RsIDE1MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyZGIgMTUyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJkcmIgMTUzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJpYiAxNTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cmlyYiAxNTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cnRkcmIgMTU2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0aWIgMTU3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0aXJiIDE1OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydHJiIDE1OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RzZXQgMTYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHNldGIgMTYxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfeG9yIDE2MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3hvcmIgMTYzXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGQgIDE2NCBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGRiICAxNjUgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkciAgMTY2IFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkZHJiIDE2NyAgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpICAxNjggXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpYiAxNjkgIFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NjICAgMTcwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYnB0ICAgMTcxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0MGUgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0MGYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0OGUgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0OGYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDM2IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQzOCAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkNzggMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDdlIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQ5ZCAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkOWYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZGI5IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmRiZiAxNzJcbiIpOwotI2lmIDAKLSAgZm9yIChpID0gMDsgdG9rc1tpXS50b2tlbjsgaSsrKQotICAgIHByaW50ZiAoIiNkZWZpbmUgJXNcdDB4JXhcbiIsIHRva3NbaV0udG9rZW4sIGkgKiAxNik7Ci0jZW5kaWYKLSAgcHJpbnRmICgidHlwZWRlZiBzdHJ1Y3Qge1xuIik7Ci0KLSAgcHJpbnRmICgiI2lmZGVmIE5JQ0VOQU1FU1xuIik7Ci0gIHByaW50ZiAoImNoYXIgKm5pY2VuYW1lO1xuIik7Ci0gIHByaW50ZiAoImludCB0eXBlO1xuIik7Ci0gIHByaW50ZiAoImludCBjeWNsZXM7XG4iKTsKLSAgcHJpbnRmICgiaW50IGZsYWdzO1xuIik7Ci0gIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0gIHByaW50ZiAoImNoYXIgKm5hbWU7XG4iKTsKLSAgcHJpbnRmICgidW5zaWduZWQgY2hhciBvcGNvZGU7XG4iKTsKLSAgcHJpbnRmICgidm9pZCAoKmZ1bmMpKCk7XG4iKTsKLSAgcHJpbnRmICgidW5zaWduZWQgaW50IGFyZ19pbmZvWzRdO1xuIik7Ci0gIHByaW50ZiAoInVuc2lnbmVkIGludCBieXRlX2luZm9bJWRdO1xuIiwgQllURV9JTkZPX0xFTik7Ci0gIHByaW50ZiAoImludCBub3BlcmFuZHM7XG4iKTsKLSAgcHJpbnRmICgiaW50IGxlbmd0aDtcbiIpOwotICBwcmludGYgKCJpbnQgaWR4O1xuIik7Ci0gIHByaW50ZiAoIn0gb3Bjb2RlX2VudHJ5X3R5cGU7XG4iKTsKLSAgcHJpbnRmICgiI2lmZGVmIERFRklORV9UQUJMRVxuIik7Ci0gIHByaW50ZiAoIm9wY29kZV9lbnRyeV90eXBlIHo4a190YWJsZVtdID0ge1xuIik7Ci0KLSAgd2hpbGUgKG5ldy0+ZmxhZ3MgJiYgbmV3LT5mbGFnc1swXSkKLSAgICB7Ci0gICAgICBpbnQgbmFyZ3M7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBwcmludGYgKCJcblxuLyogJXMgKioqICVzICovXG4iLCBuZXctPmJpdHMsIG5ldy0+bmFtZSk7Ci0gICAgICBwcmludGYgKCJ7XG4iKTsKLQotICAgICAgcHJpbnRmICgiI2lmZGVmIE5JQ0VOQU1FU1xuIik7Ci0gICAgICBwcmludGYgKCJcIiVzXCIsJWQsJWQsXG4iLCBuZXctPm5hbWUsIG5ldy0+dHlwZSwgbmV3LT5jeWNsZXMpOwotICAgICAgewotCWludCBhbnN3ZXIgPSAwOwotCWNoYXIgKnAgPSBuZXctPmZsYWdzOwotCi0Jd2hpbGUgKCpwKQotCSAgewotCSAgICBhbnN3ZXIgPDw9IDE7Ci0KLQkgICAgaWYgKCpwICE9ICctJykKLQkgICAgICBhbnN3ZXIgfD0gMTsKLQkgICAgcCsrOwotCSAgfQotCXByaW50ZiAoIjB4JTAyeCxcbiIsIGFuc3dlcik7Ci0gICAgICB9Ci0KLSAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0KLSAgICAgIG5hcmdzID0gY2hld25hbWUgKG5ldy0+bmFtZSk7Ci0KLSAgICAgIHByaW50ZiAoIlxuXHQiKTsKLSAgICAgIGNoZXdiaXRzIChuZXctPmJpdHMsICZsZW5ndGgpOwotICAgICAgbGVuZ3RoIC89IDI7Ci0gICAgICBpZiAobGVuZ3RoICYgMSkKLQlhYm9ydCgpOwotCi0gICAgICBwcmludGYgKCIsJWQsJWQsJWQiLCBuYXJncywgbGVuZ3RoLCBpZHgpOwotICAgICAgaWR4Kys7Ci0gICAgICBvbGRuYW1lID0gbmV3LT5uYW1lOwotICAgICAgcHJpbnRmICgifSxcbiIpOwotICAgICAgbmV3Kys7Ci0gICAgfQotICBwcmludGYgKCIwLDB9O1xuIik7Ci0gIHByaW50ZiAoIiNlbmRpZlxuIik7Ci19Ci0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqKmF2OwotewotICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7Ci0KLSAgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi10IikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbCAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1oIikgPT0gMCkKLSAgICB7Ci0gICAgICB3aGlsZSAocC0+bmFtZSkKLQl7Ci0JICBwcmludGYgKCIlLTI1c1x0JXNcbiIsIHAtPm5hbWUsIHAtPmJpdHMpOwotCSAgcCsrOwotCX0KLSAgICB9Ci0KLSAgZWxzZSBpZiAoYWMgPT0gMiAmJiBzdHJjbXAgKGF2WzFdLCAiLWEiKSA9PSAwKQotICAgIHsKLSAgICAgIGdhcyAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1kIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKmRpcygpOyovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiVXNhZ2U6ICVzIC10XG4iLCBhdlswXSk7Ci0gICAgICBwcmludGYgKCItdCA6IGdlbmVyYXRlIG5ldyB6OC5jIGludGVybmFsIHRhYmxlXG4iKTsKLSAgICAgIHByaW50ZiAoIi1hIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBnYXNcbiIpOwotICAgICAgcHJpbnRmICgiLWQgOiBnZW5lcmF0ZSBuZXcgdGFibGUgZm9yIGRpc2Fzc2VtYmxlXG4iKTsKLSAgICAgIHByaW50ZiAoIi1oIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBodW1hbnNcbiIpOwotICAgIH0KLXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvQ2hhbmdlTG9nIGIvcmVhZGxpbmUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzhmY2YzLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDk4MiArMCwwIEBACi0xOTk5LTA0LTIyICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogTWFrZSBjb21tZW50IGFib3V0IHRoaXMgY2hhbmdlIG1vcmUgZXhwbGljaXQuCi0KLTE5OTktMDQtMjIgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotICAgICAgICAqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCB0aGUgZmluYWwgbGlicmVhZGxpbmUuYQotICAgICAgICBvciAuaCBmaWxlcy4KLQotVHVlIE1hciAyMyAxMDo1NjowOCAxOTk5ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBnbXgubmV0PjoKLSAJCi0JKiBkaXNwbGF5LmM6IENoYW5nZSBzb21lIHRlcm1pbmFsIGNhbGxzIHRvIHdvcmsgb24gREpHUFAuCi0JKiB0ZXJtaW5hbC5jOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgLiBmcm9tIHRoZSBWUEFUSCBkaXJlY3RpdmUuCi0JCi1UdWUgTWFyICA5IDE0OjU4OjEzIDE5OTkgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHN1cHBvcnQvY29uZmlnLnN1YjogUmVjb2duaXplIGN5Z3dpbiosIG5vdCBqdXN0IGN5Z3dpbjMyLgotCi1UdWUgRmViICA5IDEwOjM4OjU3IDE5OTkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEbyBub3QgdXNlIHRoZSAuL3N1cHBvcnQgZGlyZWN0b3J5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1XZWQgSmFuICA2IDEyOjI0OjE5IDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIExPQ0FMX0NGTEFHUyByYXRoZXIgdGhhbiBDRkxBR1MgZm9yCi0Jc2VhcmNoaW5nIGxpYnRlcm1jYXAgZGlyZWN0b3J5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgRGVjIDMxIDEyOjA3OjAxIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2VhcmNoIGRldm8gbGlidGVybWNhcCBkaXJlY3RvcnkgZm9yIHRlcm1jYXAuaAotCXdoZW4gY29tcGlsaW5nIGZvciBjeWd3aW4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTEyLTMwICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBPbmx5IHRyeSB0byBjb3B5IGxpYnJlYWRsaW5lLmEgYW5kCi0JbGliaGlzdG9yeS5hIGlmIHRoZXkgZXhpc3QuCi0KLVR1ZSBEZWMgMjkgMjM6NDk6MjAgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY3Jvc3MtYnVpbGQvY3lnd2luLmNhY2hlOiBBZGQgYSBjb3VwbGUgbW9yZSBrbm93biBzZXR0aW5ncy4KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRGVjIDI5IDE4OjExOjI4IDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogY3Jvc3MtYnVpbGQ6IG5ldyBkaXJlY3RvcnkuCi0JCi0JKiBjcm9zcy1idWlsZC9jeWd3aW4uY2FjaGU6IG5ldyBmaWxlLiBVc2VkIGZvciBDeWd3aW4gY3Jvc3MgYnVpbGRzLgotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIHRlc3RzIGZvciBjcm9zcy1idWlsZCBmb3IgQ3lnd2luLgotCi0xOTk4LTEyLTI0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgQ1lHTlVTIExPQ0FMIGNvbW1lbnQuCi0JKiBhY2NvbmZpZy5oOiBBZGQgbWlzc2luZyBkZWZpbmVzLgotCSogY29uZmlnLmguYm90OiBBZGQgbWlzc2luZyBjb250ZW50LgotCSogY29uZmlndXJlLCBjb25maWcuaC5pbjogUmVnZW5lcmF0ZWQuCi0KLVdlZCBEZWMgMjMgMTY6MjE6NDEgMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogY29tbWVudCBvdXQgdGhlIHJ1bGUgdG8gcmVidWlsZCBjb25maWd1cmUgYnkgCi0JcnVubmluZyBhdXRvY29uZi4gCi0KLVR1ZSBEZWMgMjIgMTA6MDA6MzAgMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBzaGVsbC5jIChzYXZlc3RyaW5nKTogaWZkZWYnZCBpdCBvdXQuIAotCi0JKiBJbXBvcnRlZCBuZXcgdmVyc2lvbiBvZiBSZWFkbGluZSAyLjIuMS4gUmVtb3ZlZCBhbGwgdGhlIEN5Z251cwotCWxvY2FsIGNoYW5nZXMuCi0KLQlOZXcgZmlsZXM6IGFjY29uZmlnLmgsIGFjbG9jYWwubTQsIGFuc2lfc3RkbGliLmgsIGNhbGxiYWNrLmMsCi0gCWNvbmZpZy5oLmluLCBjb25maWd1cmUsIGhpc3RleHBhbmQuYywgaGlzdGZpbGUuYywgaGlzdGxpYi5oLAotIAloaXN0c2VhcmNoLmMsIGlucHV0LmMsIGtpbGwuYywgbWFjcm8uYywgbmxzLmMsIHBvc2l4ZGlyLmgsCi0gCXBvc2l4am1wLmgsIHBvc2l4c3RhdC5oLCBybGNvbmYuaCwgcmx0dHkuaCwgcmx3aW5zaXplLmgsIHNoZWxsLmMsCi0gCXRjYXAuaCwgdGVybWluYWwuYywgdW5kby5jLCB1dGlsLmMsIHN1cHBvcnQgZGlyZWN0b3J5LgotCi0JUmVtb3ZlZCBmaWxlczogc3lzZGVwKiwgY29uZmlnIGRpcmVjdG9yeS4KLQkKLQotRnJpIERlYyAgNCAxNToyNTo0MSAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkgSmltIEJsYW5keQotIAk8amltYkB6d2luZ2xpLmN5Z251cy5jb20+IGFuZCBEYXZpZCBUYXlsb3IKLSAJPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbiBjaGFuZ2VzCi0gCW1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgotCi0JKiBjb25maWcvbXAtZW5hYmxlLXR1aTogTmV3IGZpbGUuCi0JKFRVSV9DRkxBR1MpOiBTZWFyY2ggZGV2bydzIGluY2x1ZGUgZGlyZWN0b3J5LCBhcyBsb25nIGFzIHdlJ3JlCi0gCXRvdGFsbHkgcnVpbmluZyBtb2R1bGFyaXR5LgotCShJTkNMVURFX1NSQ0RJUik6IE5ldyB2YXIuCi0JKEdEQl9UVUlfU1JDRElSKTogRml4IHN5bnRheCBlcnJvci4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayB0aGUgLS1lbmFibGUtdHVpIGZsYWc7IGlmIGl0J3Mgc2V0LCBpbmNsdWRlCi0gCWEgbWFrZWZpbGUgZnJhZ21lbnQgdGhhdCAjZGVmaW5lcyBUVUkgYW5kIGFkZHMgdGhlIG5lZWRlZCAjaW5jbHVkZQotIAlkaXJlY3Rvcmllcy4KLQkoKi0qLWhwdXgqKTogTmV3IGhvc3Q7IHVzZSBzeXNkZXAtaHB1eC5oLgotCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IENoZWNrIHRoZSB2YXJpYWJsZSBzZXQgaW4gdGhlIG1ha2VmaWxlCi0JZnJhZ21lbnQgYWJvdmUuCi0KLQkqIGRpc3BsYXkuYyAodGVybV9nb3RvKTogZGVjbGFyZSBpdC4KLQkoaW5zZXJ0X3NvbWVfY2hhcnMpOiBzZXQgaXQuCi0JKGRlbGV0ZV9jaGFycyk6IHNldCBpdC4KLQotCSogcmVhZGxpbmUuYzogYWRkIHR1aSBpbmNsdWRlIGZpbGVzIHN1cnJvdW5kZWQgYnkgVFVJLgotCShybF9yZXNldCk6IG5ldyBmdW5jdGlvbiwgbW92ZSBzb21lIG9mIHJsX2Fib3J0IGZ1bmN0aW9uYWxpdHkgdG8KLSAJaGVyZS4KLQkocmxfYWJvcnQpOiBjYWxsIHJsX3Jlc2V0LgotCShybF9nZXRjKTogdHVpIGNoYW5nZXMuCi0JKGluaXRfdGVybWluYWxfaW8pOiB0dWkgY2hhbmdlcy4KLQotCSogcmVhZGxpbmUuaCAodHVpX3ZlcnNpb24sIGZwdXRjX3VuZmlsdGVyZWQsIGZwdXRzX3VuZmlsdGVyZWQsCi0JdHVpX3RwdXRzKTogZGVjbGFyZSBpZiBUVUkgaXMgZGVmaW5lZC4KLQotCSogcmx0dHkuYyAocHJlcGFyZV90ZXJtaW5hbF9zZXR0aW5ncyk6IGFkZGl0aW9uYWwgY29tbWVudC4KLQotCSogc2lnbmFscy5jOiBhZGQgdHVpIGluY2x1ZGUgZmlsZXMgc3Vycm91bmRlZCBieSBUVUkuICBtb3ZlICNpZgotIAlhbmQgI2VuZGlmIHRvIGNvbHVtbiAxIHNvIEhQJ3MgY29tcGlsZXIgd2lsbCBhY2NlcHQgdGhlbS4gIFJlbW92ZQotIAlkZWNsYXJhdGlvbiBvZiB0dWlEb0FuZFJldHVyblRvVG9wIHNpbmNlIGl0J3MgZGVjbGFyZWQgaW4gdHVpLmguCi0JKHJsX2hhbmRsZV9zaWd3aW5jaCk6IGNhbGwgdHVpRG9BbmRSZXR1cm5Ub1RvcCBpZiBUVUkgZGVmaW5lZC4KLSAgCShybF9oYW5kbGVfc2lnd2luY2hfb25fY2xlYXIpOiBkZWZpbmUgaWYgVFVJIGRlZmluZWQuCi0JKHJsX3NldF9zaWduYWxzKTogaWYgVFVJLCBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uCi0JKHJsX2NsZWFyX3NpZ25hbHMpOiBpbnN0YWxsIHJsX2hhbmRsZV9zaWd3aW5jaF9vbl9jbGVhci4KLQotCSogc3lzZGVwLWhwdXguaDogTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDIgMTU6MjY6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KLQotVHVlIEp1bCAyOCAwOTo0MzoyNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1ocHV4MTEuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKCotKi0qLWhwdXgxMSopOiBVc2Ugc3lzZGVwLWhwdXgxMS5oLgotCi1UaHUgSnVsIDIzIDE3OjQ4OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlIG9ic29sZXRlIGZpbGUuCi0JKiBleGFtcGxlcy9jb25maWd1cmUuYmF0OiBSZW1vdmUgb2Jzb2xldGUgZmlsZS4KLQotV2VkIE1heSAxMyAxMzo0MTo1MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5c2RlcC02aXJpeC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWlyaXg2Kik6IE5ldyBob3N0OyB1c2Ugc3lzZGVwLTZpcml4LmguCi0KLQkqIE1ha2VmaWxlLmluIChpc2VhcmNoLm8sIHNlYXJjaC5vKTogRGVwZW5kIHVwb24gc3lzZGVwLmguCi0JKE1ha2VmaWxlKTogRGVwZW5kIHVwb24gJChzcmNkaXIpL2NvbmZpZ3VyZS5pbi4KLQotVGh1IEFwciAgOSAxMTo1OTozOCAxOTk4ICBJYW4gRGFsbCAoPElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09bmV0YnNkKTogSW5jbHVkZSBjb25maWcvbWgtYnNkNDQuCi0JKiBjb25maWcvbWgtYnNkNDQ6IE5ldyBmaWxlLgotCi1XZWQgRGVjICAzIDE2OjQ4OjIwIDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCi0KLQkqIHJsdHR5LmM6IGZpeCB0eXBvcy4KLQotVHVlIE9jdCAgOCAwODo1OToyNCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB0aWxkZS5jICh0aWxkZV93b3JkX2V4cGFuZCk6ICBfX01TRE9TX19fIC0+IF9fTVNET1NfXwotCi1TYXQgT2N0IDA1IDExOjI0OjM0IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogcmxkZWZzLmg6IE9uIExpbnV4LCBpbmNsdWRlIDx0ZXJtaW9zLmg+IHRvIGZpeCBjb21waWxlIGVycm9yCi0JaW4gPHRlcm1jYXAuaD4uCi0KLVdlZCBTZXAgIDQgMTg6MDY6NTEgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogcmxkZWZzLmg6ICBFbmFibGUgSEFORExFX1NJR05BTFMgZm9yIGN5Z3dpbjMyLgotCi1UaHUgQXVnIDI5IDE2OjU5OjQ1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0KLUZyaSBBdWcgMTYgMTc6NDk6NTcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29tcGxldGUuYzogIEluY2x1ZGUgPHB3ZC5oPiBpZiBub3QgRE9TLCBhbmQgaWYgY3lnd2luMzIgb3Igbm90Ci0Jd2luMzIuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgdGVzdCBmb3IgKi0qLWN5Z3dpbjMyKiB0byB1c2UgY29uZmlnL21oLXBvc2l4LgotCSogcmVhZGxpbmUuYzogIE1vdmUgZGVjbCBvZiB0Z2V0c3RyIHRvIHJsZGVmcy5oLgotCSogKF9ybF9zZXRfc2NyZWVuX3NpemUpOiAgUmVtb3ZlIHJlZHVuZGFudCBpZmRlZiBNSU5JTUFMcy4KLQkqIHJsZGVmcy5oOiAgRG9uJ3QgZG8gTUlOSU1BTCBmb3IgY3lnd2luMzIuICBDeWd3aW4zMiBub3cgdXNlcwotCWZ1bGwtYmxvd24gcmVhZGxpbmUsIGV4Y2VwdCBmb3IgdGVybWNhcC4KLQotU3VuIEF1ZyAxMSAyMTowNjoyNiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBybGRlZnMuYzogIEdldCByaWQgb2YgZGVmaW5lIG9mIFNJR0FMUk0gaWYgX1dJTjMyIG9yIF9fTVNET1NfXy4KLQkqIERvbid0IGRlZmluZSBTY3JlZW5Db2xzL1NjcmVlblJvd3MvLi4uIGlmIGN5Z3dpbjMyLgotCSogc3lzZGVwLW5vcm0uaDogIERvbid0IGluY2x1ZGUgPG1hbGxvYy5oPiBpZiBjeWd3aW4zMi4KLQotU3VuIEF1ZyAxMSAxNDo1OTowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmxkZWZzLmg6ICBJZiBfX29zZl9faXMgZGVmaW5lZCwgaW5jbHVkZSA8dGVybWlvLmg+IGluc3RlYWQgb2YKLQk8c2d0dHkuaD4uCi0KLUZyaSBBdWcgIDkgMDg6NTQ6MjYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYmluZC5jIGNvbXBsZXRlLmMgaGlzdG9yeS5jIHJlYWRsaW5lLmM6ICBEb24ndCBpbmNsdWRlIHN5cy9maWxlLmguCi0JKiBjb21wbGV0ZS5jIGRpc3BsYXkuYyBwYXJlbnMuYyByZWFkbGluZS5jIHJsZGVmcy5oIHJsdHR5LmMKLQlzaWduYWxzLmMgdGlsZGUuYzogIENoYW5nZSByZWZzIHRvIF9NU0NfVkVSIGFuZCBfX1dJTjMyX18gdG8gX1dJTjMyLgotCSogc2lnbmFscy5jIChybF9zaWduYWxfaGFuZGxlcik6ICBJZmRlZiBvdXQga2lsbCBpZiBfV0lOMzIuCi0JKiBzeXNkZXAtbm9ybS5oOiAgSWZkZWYgb3V0IGluY2x1ZGUgb2YgZGlyZW50LmggaWYgX1dJTjMyLgotCUluY2x1ZGUgbWFsbG9jLmggaWYgX1dJTjMyLgotCi1UaHUgSnVsIDE4IDE1OjU5OjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmxkZWZzLmggKHN5cy91aW8uaCkgQmVmb3JlIHN5cy9zdHJlYW0uaCBpcyBpbmNsdWRlZCB1bmRlciBBSVgsCi0JaW5jbHVkZSBzeXMvdWlvLmgsIHdoaWNoIHByZXZlbnRzIGFuIHVuZGVmaW5lZCBzdHJ1Y3R1cmUgdXNlZCBpbiBhCi0JcHJvdG90eXBlIG1lc3NhZ2UgZnJvbSBiZWluZyBnZW5lcmF0ZWQuCi0KLVR1ZSBKdW4gMjUgMjM6MDU6NTUgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotICAgICAgICAqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogU2V0IHRvICQocHJlZml4KS9zaGFyZS4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQotU3VuIE1heSAyNiAxNToxNDo0MiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCUZyb206IERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIHN5c2RlcC1saW51eC5oOiBOZXcgZmlsZS4KLQkqIGRpc3BsYXkuYzogQWRkIGluY2x1ZGUgb2YgInN5c2RlcC5oIiB0byBnZXQgSEFWRV9WQVJBUkdTX0guCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBwYXR0ZXJuIGlbMzQ1XTg2LSotbGludXgqIGludG8gKi0qLWxpbnV4KiB0bwotCXN1cHBvcnQgbm9uLXg4NiBiYXNlZCBMaW51eCBwbGF0Zm9ybXMuCi0KLVN1biBBcHIgIDcgMjI6MDY6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQlGcm9tOiBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgotCSogY29uZmlnL21oLWdudTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKCotKi1nbnUqKTogTmV3IGhvc3QuCi0KLVN1biBBcHIgIDcgMTM6MjE6NTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQlGcm9tOiBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQkqIGNvbmZpZ3VyZS5pbjogU0NPIE9wZW5TZXJ2ZXIgNSAoYS5rLmEgMy4ydjUqKSBpcyBtb3JlIGxpa2UKLQlTQ08gMy4ydjQgdGhhbiAzLjJ2Mi4KLQotV2VkIEphbiAgMyAxODoyMjoxMCAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiByZWFkbGluZS5jLCBkaXNwbGF5LmMsIGNvbXBsZXRlLmM6IEFkZCBfTVNDX1ZFUiB0byBsaXN0IG9mCi0JdGhpbmdzIHdoaWNoIGNhbid0IGRvIG1vc3QgdGhpbmdzLgotCi1UaHUgTm92IDE2IDE1OjM5OjA1IDE5OTUgIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29tcGxldGUuYzogQ2hhbmdlIFdJTjMyIHRvIF9fV0lOMzJfXywgYWRkZWQgI2Vsc2UgcmV0dXJuIE5VTEwKLQl0byBlbmQgb2YgdGhhdCBkZWZpbmUuCi0KLVR1ZSBPY3QgMzEgMTA6Mzg6NTggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGlzcGxheS5jLCBwYXJlbnMuYywgcmVhZGxpbmUuYywgcmxkZWZzLmg6IENoYW5nZSB1c2Ugb2YKLQlXSU4zMiB0byBfX1dJTjMyX18uCi0KLVR1ZSBPY3QgMTAgMTE6MDc6MjMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IFJlbW92ZSBtYWNyby4KLQotVHVlIE9jdCAxMCAwODo0OTowMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb21wbGV0ZS5jIChmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRW5hYmxlIGZvcgotCXdpbjMyIHdoZW4gbm90IE1TQy4KLQotU3VuIE9jdCAgOCAwNDoxNzoxOSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBwb3dlcnBjLWlibS1haXgqIGxpa2UgcnM2MDAwLWlibS1haXgqLgotCi1TYXQgT2N0ICA3IDIwOjM2OjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBybHR0eS5jIChvdXRjaGFyKTogUmV0dXJuIGFuIGludCwgbGlrZSB0cHV0cyBleHBlY3RzLgotCSogc2lnbmFscy5jIChfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik6IERpdHRvLgotCi1GcmkgU2VwIDI5IDE1OjE5OjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlGaXhlcyBmb3Igd2hlbiB0aGUgaG9zdCBXSU4zMiwgYnV0IG5vdCBNU0MuCi0JKiBjb21wbGV0ZS5jOiBTb21ldGltZXMgaGF2ZSBwd2QuaAotCSogcGFyZW5zLmM6IFdJTjMyIGhhcyBzaW1pbGFyIHJlc3RyaWN0aW9ucyB0byBfX0dPMzJfXy4KLQkqIHJlYWRsaW5lLmMgKF9fR08zMl9fKTogU29tZSBvZiB0aGlzIG1vdmVkIGludG8gcmxkZWZzLmgKLQkqIHNpZ25hbHMuYyAoX19HTzMyX18pOiBMaWtld2lzZS4KLQkqIHJsZGVmcy5oIChNU0RPU3x8V0lOMzIpIGJlY29tZXMgTVNET1N8fE1TQy4KLQkoV0lOMzImJiFXSU4zMik6IE5ldyBkZWZpbml0aW9ucy4KLQotV2VkIFNlcCAyMCAxMjo1NzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotV2VkIE1hciAgMSAxMzozMzo0MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJsdHR5LmMgKG91dGNoYXIpOiBQcm92aWRlIHByb3RvdHlwZSBmb3Igb3V0Y2hhciwgdG8gc2lsZW5jZQotCXR5cGUgd2FybmluZ3MgaW4gcGFzc2luZyBvdXRjaGFyIHRvIHRwdXRzIG9uIHN5c3RlbXMgbGlrZSBMaW51eAotCXRoYXQgaGF2ZSBmdWxsIHByb3RvdHlwZXMuCi0KLQkqIHNpZ25hbHMuYyAoX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOiBQcm92aWRlIHByb3RvdHlwZSB0bwotCXNpbGVuY2UgdHlwZSB3YXJuaW5ncy4KLQotU3VuIEphbiAxNSAxNDoxMDozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogcmxkZWZzLmg6IERlZmluZSBNSU5JTUFMIGZvciBfX0dPMzJfXyBhbmQgV0lOMzIuCi0JKiBjb21wbGV0ZS5jLCBkaXNwbGF5LmMsIHJlYWRsaW5lLmMsIHJsdHR5LmM6IFRlc3QgTUlOSU1BTAotCWluc3RlYWQgb2YgX19HTzMyX18uCi0KLVdlZCBBdWcgMjQgMTM6MDQ6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCi1TYXQgSnVsIDE2IDEzOjI2OjMxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtODgqLWhhcnJpcy1jeHV4NyopOiBSZWNvZ25pemUuCi0JKiBzeXNkZXAtY3h1eDcuaDogTmV3IGZpbGUuCi0KLUZyaSBKdWwgIDggMTM6MTg6MzMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogcnR0dHkuYyAoY29udHJvbF9tZXRhX2tleV9vbik6IFJlbW92ZSBzdXBlcmZsdW91cyB0ZXN0aW5nIG9mCi0JX19HTzMyX18uCi0KLVRodSBKdW4gMzAgMTU6MjE6NTQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogcmx0dHkuYyAoY29udHJvbF9tZXRhX2tleV9vbik6IERvbid0IGNvbXBpbGUgaWYgX19HTzMyX18gaXMKLQlkZWZpbmVkLgotCShybHR0eV9zZXRfZGVmYXVsdF9iaW5kaW5ncyk6IExpa2V3aXNlLgotCSogZGlzcGxheS5jIChpbnNlcnRfc29tZV9jaGFycywgZGVsZXRlX2NoYXJzKTogcm93X3N0YXJ0IHNob3VsZCBiZQotCWEgc2hvcnQuCi0JKiBwYXJlbnMuYyAocmxfaW5zZXJ0X2Nsb3NlKTogTm8gRkRfU0VUIGlmIHVzaW5nIF9fR08zMl9fLgotCSogcmVhZGxpbmUuYyAocmxfZ2F0aGVyX3R5aSk6IFN0cmlwIG9mZiBzcHVyaW91cyBoaWdoIGJpdHMuCi0KLVN1biBKdW4gMTIgMDM6NTE6NTIgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBoaXN0b3J5LmM6ICBTd2FwIGluY2x1c2lvbiBvZiBybGRlZnMuaCBhbmQgY2hhcmRlZnMuaCB0byBhdm9pZAotCUNUUkwgbWFjcm8gcmVkZWZpbml0aW9uLgotCi1Nb24gTWF5ICA5IDE4OjI5OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmVhZGxpbmVfZGVmYXVsdF9iaW5kaW5ncyk6IERvbid0IGNvbXBpbGUgaWYKLQlfX0dPMzJfXyBpcyBkZWZpbmVkLgotCShfcmxfc2V0X3NjcmVlbl9zaXplKTogTGlrZXdpc2UuCi0JKiBybHR0eS5jIChybHR0eV9zZXRfZGVmYXVsdF9iaW5kaW5ncyk6IExpa2V3aXNlLgotCShjb250cm9sX21ldGFfa2V5KTogTGlrZXdpc2UuCi0JKiBkaXNwbGF5LmM6IElmIF9fR08zMl9fIGlzIGRlZmluZWQsIGluY2x1ZGUgPHN5cy9wYy5oPi4KLQkqIHBhcmVucy5jOiBJZiBfX0dPMzJfXyBpcyBkZWZpbmVkLCB1bmRlZmluZSBGRF9TRVQuCi0JKiBzaWduYWxzLmM6IEluY2x1ZGUgU0lHV0lOQ0ggaGFuZGxpbmcgaW4gdGhlIHNldCBvZiB0aGluZ3Mgd2hpY2gKLQlpcyBub3QgZG9uZSBpZiBIQU5ETEVfU0lHTkFMUyBpcyBub3Qgc2V0LgotCi1GcmkgTWF5ICA2IDEzOjM4OjM5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvbWgtZ28zMjogTmV3IGZyYWdtZW50LgotCSogY29uZmlndXJlLmluIChob3N0PT1nbzMyKTogVXNlIGdvMzIgZnJhZ21lbnQuCi0KLVdlZCBNYXkgIDQgMTQ6MzY6NTMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY2hhcmRlZnMuaCwgcmxkZWZzLmg6ICBNb3ZlIGRlY2xzIG9mIHN0cmluZyBmdW5jcyBmcm9tIGNoYXJkZWZzLmgKLQl0byBybGRlZnMuaCBzbyB0aGF0IHRoZXkgZG9uJ3QgcG9sbHV0ZSBhcHBzIHRoYXQgaW5jbHVkZQotCXJlYWRsaW5lLmguCi0JKiBoaXN0b3J5LmM6ICBpbmNsdWRlIHJsZGVmcy5oIHRvIGdldCBkZWNscyBvZiBzdHJpbmcgZnVuY3MuCi0KLVdlZCBNYXkgIDQgMTI6MTU6MTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwMC1idWxsLWJvc3gqKTogTmV3IGNvbmZpZ3VyYXRpb24sIFJTLzYwMDAKLQl2YXJpYW50LgotCi1XZWQgQXByIDIwIDEwOjQzOjUyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1wb3NpeCBmb3Igc3Vub3M0LjEqLgotCi1XZWQgQXByIDEzIDIxOjI4OjQ0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBybHR0eS5jIChzZXRfdHR5X3NldHRpbmdzKTogRG9uJ3Qgc2V0IHJlYWRsaW5lX2VjaG9pbmdfcC4KLQkocmxfZGVwcmVwX3Rlcm1pbmFsKSBbTkVXX1RUWV9EUklWRVJdOiBTZXQgcmVhZGxpbmVfZWNob2luZ19wLgotCi1TdW4gTWFyIDEzIDA5OjEzOjEyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIFRBR1MgdGFyZ2V0LgotCi1XZWQgTWFyICA5IDE4OjAxOjMxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpc2VhcmNoLmMsIHNlYXJjaC5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCi1UaHUgTWFyICAzIDE3OjQwOjAzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciBJU0MsIHVzZSBtaC1zeXN2LCBub3QgbWgtaXNjLgotCi1UaHUgRmViIDI0IDA0OjEzOjUzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGJhc2gtMS4xMy41LiBNZXJnZSBjaGFuZ2VzIGZyb20gZ2xvYi90aWxkZS5jCi0JaW50byB0aWxkZS5jIGFuZCB1c2UgaXQuIEFkZCBzeXN0ZW0gZnVuY3Rpb24gZGVjbGFyYXRpb25zIHdoZXJlCi0JbmVjZXNzYXJ5LiBDaGVjayBmb3IgX19HTzMyX18sIG5vdCBfR08zMl8gY29uc2lzdGVudGx5LgotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogcmx0dHkuYzogIEluY2x1ZGUgPHN5cy9maWxlLmg+IHRvIG1hdGNoIGluY2x1ZGUgZmlsZSBzZXR1cAotCWluIHJlYWRsaW5lLmMgZm9yIHJsZGVmcy5oLiBPdGhlcndpc2Ugd2UgZ2V0IGluY29uc2lzdGVudAotCVRUWV9EUklWRVIgZGVmaW5pdGlvbnMgaW4gcmVhZGxpbmUuYyBhbmQgcmx0dHkuYy4KLQkqIGJpbmQuYywgY29tcGxldGUuYzogIERvIG5vdCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4sIGl0IGlzIGFscmVhZHkKLQlpbmNsdWRlZCB2aWEgc3lzZGVwLmgsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBpZiA8c3lzL3R5cGVzLmg+IGhhcwotCW5vIG11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0aW9uLgotCSogcmVhZGxpbmUuYyAoX3JsX3NldF9zY3JlZW5fc2l6ZSk6ICBSZWVzdGFibGlzaCB0ZXN0IGZvcgotCVRJT0NHV0lOU1pfQlJPS0VOLgotCSogcmxkZWZzLmg6ICBEZWZpbmUgU19JU1JFRyBpZiBuZWNlc3NhcnkuCi0KLUZyaSBGZWIgMTggMDg6NTY6MzUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc2VhcmNoLm8gcnVsZSBmb3IgU3VuIG1ha2UuCi0KLVdlZCBGZWIgMTYgMTY6MzU6NDkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHJsdHR5LmM6ICAjaWYgb3V0IHNvbWUgY29kZSBpZiBfX0dPMzJfXy4KLQotVHVlIEZlYiAxNSAxNDowNzowOCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pLCBkaXNwbGF5LmM6Ci0JUmV0dXJuIGludCwgbm90IHZvaWQsIHRvIGNvbmZvcm0gd2l0aCB0aGUgZXhwZWN0ZWQgYXJnIG9mIHRwdXRzLgotCSogcmVhZGxpbmUuYyAoaW5pdF90ZXJtaW5hbF9pbyk6ICB0Z2V0ZmxhZyBvbmx5IHRha2VzIDEgYXJnLgotCSogcmVhZGxpbmUuYyAoX3JsX3NhdmVzdHJpbmcpOiAgTmV3IGZ1bmN0aW9uLgotCSogY2hhcmRlZnMuaDogIFRvIGF2b2lkIGNvbmZsaWN0cyBhbmQvb3Igd2FybmluZ3MsIGRlZmluZQotCXNhdmVzdHJpbmcgYXMgYSBtYWNybyB3cmFwcGVyIGZvciBfcmxfc2F2ZXN0cmluZy4KLQkqIGRpc3BsYXkuYyAoZXh0ZXJuIHRlcm1feG4pOiAgSXQncyBhbiBpbnQgZmxhZywgbm90IGEgc3RyaW5nLgotCSogY2hhcnNkZWZzLmgsIHJsZGVmcy5oOiAgUmVtb3ZlIEhBVkVfU1RSSU5HX0gtcmVsYXRlZCBqdW5rLgotCi1TYXQgRmViICA1IDA4OjMyOjMwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIG9ic29sZXRlIHJ1bGVzIGZvciBoaXN0b3J5LmluZm8gYW5kCi0JcmVhZGxpbmUuaW5mby4KLQotVGh1IEphbiAyNyAxNzowNDowMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY2hhcmRlZnMuaDogT25seSBkZWNsYXJlIHN0cnJjaHIgaWYgaXQgaXMgbm90ICNkZWZpbmUnZC4KLQotVHVlIEphbiAyNSAxMTozMDowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogcmxkZWZzLmg6IEFjY2VwdCBfX2hwdXggYXMgd2VsbCBhcyBocHV4IGZvciBIUCBjb21waWxlciBpbiBBTlNJIG1vZGUuCi0KLUZyaSBKYW4gMjEgMTc6MzE6MjYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY2hhcmRlZnMuaCwgdGlsZGUuYzogSnVzdCBkZWNsYXJlIHN0cnJjaHIgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvCi0JaW5jbHVkZSBhIHN5c3RlbSBoZWFkZXIuCi0KLUZyaSBKYW4gMjEgMTQ6NDA6NDMgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6ICBFeHBhbmQgbG9jYWwtZGlzdGNsZWFuCi0JaW5saW5lIGFmdGVyIGRvaW5nIHJlY3Vyc2lvbi4gIFlvdSBjYW4ndCByZWN1cnNlIGFmdGVyIHJlbW92aW5nCi0JTWFrZWZpbGUuICBNYWtlIHRoZW0gZGVwZW5kIG9uIGxvY2FsLWNsZWFuLgotCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6ICBSZW1vdmUgbm93IHN1cGVyZmx1b3VzIHRhcmdldC4KLQotTW9uIEphbiAxNyAxMjo0MjowNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChkb2luZ19hbl91bmRvKTogRGVsZXRlIHNlY29uZCBkZWNsYXJhdGlvbiwgc2luY2UgaXQKLQljb25mdXNlcyB0aGUgYWxwaGEtb3NmMSBuYXRpdmUgY29tcGlsZXIuCi0KLVN1biBKYW4gMTYgMTI6MzM6MTEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbXBsZXRlLmMsIGJpbmQuYzogSW5jbHVkZSA8c3lzL3N0YXQuaD4uCi0JKiBjb21wbGV0ZS5jOiBEZWZpbmUgWF9PSyBpZiBub3QgZGVmaW5lZCBieSBhIHN5c3RlbSBoZWFkZXIuCi0KLQkqIGNoYXJkZWZzLmg6IERvbid0IGRlY2xhcmUgeG1hbGxvYy4KLQotCSoga2V5bWFwcy5oOiBJbmNsdWRlICJjaGFyZGVmcy5oIiBub3QgPHJlYWRsaW5lL2NoYXJkZWZzLmg+LgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIHJlYWxjbGVhbik6IFJlY3Vyc2UKLQlpbnRvIHN1YmRpcmVjdG9yaWVzIGFzIHdlbGwgYXMgZG9pbmcgdGhpcyBkaXJlY3RvcnkuICBBZGQgY2xlYW4tZHZpCi0JdGFyZ2V0LgotCi1TYXQgSmFuIDE1IDE5OjM2OjEyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jLCBkaXNwbGF5LmM6ICBQYXRjaGVzIHRvIGFsbG93IHVzZSBvZiBhbGwgODAKLQljb2x1bW5zIG9uIG1vc3QgdGVybWluYWxzICh0aG9zZSB3aXRoIGFtIGFuZCB4bikuCi0KLQlNZXJnZSBpbiBjaGFuZ2VzIGZyb20gYmFzaC0xLjEzLiAgVGhlIG1vc3Qgb2J2aW91cyBvbmUgaXMKLQl0aGF0IHRoZSBmaWxlIHJlYWRsaW5lLmMgaGFzIGJlZW4gc3BsaXQgaW50byBtdWx0aXBsZSBmaWxlcy4KLQkqIGJpbmQuYywgY29tcGxldGUuYywgZGlzcGF5LmMsIGlzZWFyY2guYywgcGFyZW5zLmMsIHJsZGVmcy5oLAotCXJsdHR5LmMsIHNlYXJjaC5jIHNpZ25hbHMuYywgdGlsZGUuYywgdGlsZGUuaCwgeG1hbGxvYy5jOiAgTmV3IGZpbGVzLgotCi1TYXQgRGVjIDExIDE2OjI5OjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChybF9nZXRjKTogSWYgR08zMiwgdHJpbSBoaWdoIGJpdCBmcm9tIGdldGtleSwKLQlvdGhlcndpc2UgZmFuY3kgUEMga2V5cyBjYXVzZSBncmllZi4KLQotRnJpIE5vdiAgNSAxMTo0OTo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgZG9jIHRvIGNvbmZpZ2RpcnMuCi0JKiBNYWtlZmlsZS5pbiAoaW5mbyBkdmkgaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8pOiBSZWN1cnNlIGludG8gZG9jLgotCi1GcmkgT2N0IDIyIDA3OjU1OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCi0KLVR1ZSBPY3QgIDUgMTI6MzM6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmM6IEFkZCBzdHVmZiBmb3IgSElVWCB0byBwbGFjZSB3aGVyZSB3ZSBkZXRlY3QgdGVybWlvCi0JdnMuIHNndHR5ICh1Z2gsIGJ1dCBJIGRvbid0IHNlZSBhIHNpbXBsZSBiZXR0ZXIgd2F5KS4KLQotV2VkIFNlcCAyOSAxMTowMjo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocGFyc2VyX2lmKTogRnJlZSB0bmFtZSB3aGVuIGRvbmUgd2l0aCBpdCAoY2hhbmdlCi0JaW1wb3J0ZWQgZnJvbSBmcm9tIGJhc2gJMS4xMiByZWFkbGluZSkuCi0KLVR1ZSBTZXAgIDcgMTc6MTU6MzcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTg4ay0qLXN5c3ZyNCopOiBDb21tZW50IG91dCBwcmV2aW91cyBjaGFuZ2UuCi0KLUZyaSBKdWwgIDIgMTE6MDU6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1yaXNjb3MqKTogTmV3IGVudHJ5OyB1c2UgbWgtc3lzdi4KLQotV2VkIEp1biAyMyAxMzowMDoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudC4KLQotTW9uIEp1biAxNCAxNDoyODo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZXJpYykKLQotCSogY29uZmlndXJlLmluIChtODhrLSotc3lzdnI0Kik6IFVzZSBzeXNkZXAtbm9ybS5oLgotCi1TdW4gSnVuIDEzIDEzOjA0OjA5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoe3JlYWwsZGlzdH1jbGVhbik6IFJlbW92ZSBzeXNkZXAuaC4KLQotVGh1IEp1biAxMCAxMToyMjo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBtb3N0bHljbGVhbiwgZGlzdGNsZWFuLCBhbmQgcmVhbGNsZWFuIHRhcmdldHMuCi0KLUZyaSBNYXkgMjEgMTc6MDk6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1pc2M6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBVc2UgaXQuCi0KLVNhdCBBcHIgMTcgMDA6NDA6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGNhbHZpbikKLQotCSogcmVhZGxpbmUuYywgaGlzdG9yeS5jOiBEb24ndCBpbmNsdWRlIHN5cy90eXBlcy5oOyBzeXNkZXAuaCBkb2VzLgotCi0JKiBjb25maWcvbWgtc3lzdjogRGVmaW5lIFRJT0NHV0lOU1pfQlJPS0VOLgotCXJlYWRsaW5lLmM6IENoZWNrIGl0LgotCi1XZWQgTWFyIDI0IDAyOjA2OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayAmIGR2aSB0YXJnZXRzCi0KLUZyaSBNYXIgMTIgMTg6MzY6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSAqLSotc29sYXJpczIqIGluc3RlYWQgb2YgKi0qLXNvbGFyaXMqIChhCi0JbnVtYmVyIG9mIHBlb3BsZSB3YW50IHRvIGNhbGwgU3VuT1MgNC4xLjIgInNvbGFyaXMxLjAiCi0JYW5kIGdldCBpdCByaWdodCkKLQotVHVlIE1hciAgMiAyMToyNTozNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLXN5c3Y0Lmg6ICBOZXcgZmlsZSBmb3IgU1ZSNC4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLXN5c3Y0Kik6ICBVc2Ugc3lzZGVwLXN5c3Y0LmguCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLXVsdHJpeDIpOiAgQWRkIHRyaXBsZXQgZnJvbSBNaWNoYWVsIFJlbmRlbGwKLQkobWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYSkKLQotVHVlIERlYyAxNSAxMjozODoxNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNjbzMuMnY0Kik6IHVzZSBtaC1zY280LgotCSogY29uZmlnL21oLXNjbzQ6IE5ldyBmaWxlLCBsaWtlIG1oLXNjbyBidXQgd2l0aG91dCBkZWZpbmluZwotCV9QT1NJWF9TT1VSQ0UuCi0KLVdlZCBOb3YgMTEgMjE6MjA6MTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlZm9ybWF0IHRvIG9uZS1jYXNlLXBlci1saW5lLgotCUhhbmRsZSBTdW5PUyAzLjUsIGFzIHBlciBLYXJsIEJlcnJ5LCA8a2FybEBjbGF1ZGUuY3MudW1iLmVkdT4uCi0KLVdlZCBOb3YgIDQgMTU6MzI6MzEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLW5vcm0uaDogIFJlbW92ZSBzb21lIGNydWQsIGluc3RhbGwgZGlyZSB3YXJuaW5nLgotCi1UaHUgT2N0IDIyIDAxOjA4OjEzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgU0NPIHdvcmsgYWdhaW4uLi4KLQotTW9uIE9jdCAxMiAxNTowNDowNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGluaXRfdGVybWluYWxfaW8pOiBpZiB0Z2V0ZW50IHJldHVybnMgMCwgdGhlCi0JdGVybWluYWwgdHlwZSBpcyB1bmtub3duLgotCi1UaHUgT2N0ICAxIDIzOjQ0OjE0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKLQotV2VkIFNlcCAzMCAxMjo1ODo1NyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChybF9jb21wbGV0ZV9pbnRlcm5hbCk6ICBDYXN0IGFsbG9jYSB0byAoY2hhciAqKSB0bwotCWF2b2lkIHdhcm5pbmcuCi0KLUZyaSBTZXAgMjUgMTI6NDU6MDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoY2xlYXJfdG9fZW9sLCBybF9nZW5lcmljX2JpbmQpOiAgTWFrZSBzdGF0aWMuCi0JKHJsX2RpZ2l0X2xvb3ApOiAgQWRkIGFyZyB0byBjYWxsIHRvIHJsX21lc3NhZ2UoKS4KLQkqIHZpX21vZGUuYyAocmxfdmlfZmlyc3RfcHJpbnQpOiAgQWRkIGFyZyB0byBjYWxsIHRvCi0JcmxfYmFja190b19pbmRlbnQoKS4KLQotV2VkIEF1ZyAxOSAxNDo1OTowNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcywgdXNlIGZ1bGwKLQlmaWxlIG5hbWUgZm9yIGluc3RhbGwgdGFyZ2V0LgotCi1XZWQgQXVnIDEyIDE1OjUwOjU3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChsYXN0X3JlYWRsaW5lX2luaXRfZmlsZSk6ICBGaXggdHlwbyBtYWRlIGJ5IFN0ZXZlCi0JQ2hhbWJlcmxhaW4vREogRGVsb3JpZS4gIFByb3BlciBjb250cm9sIGZpbGUgbmFtZSBpcyB+Ly5pbnB1dHJjLAotCW5vdCB+L2lucHV0cmMuCi0KLVRodSBKdW4gMjUgMTY6MTU6MjcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgTWFrZSBic2QgYmFzZWQgc3lzdGVtcyB1c2Ugc3lzZGVwLW9ic2QuaC4KLQotVHVlIEp1biAyMyAyMzoyMjo1MyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXBvc2l4OiAgTmV3IGZpbGUsIGZvciBQb3NpeC1jb21wbGlhbnQgc3lzdGVtcy4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBtaC1wb3NpeCBmb3IgTGludXggKGZyZWUgVW5peCBjbG9uZSkuCi0KLVR1ZSBKdW4gMjMgMjE6NTk6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1ub3JtLmggKGFsbG9jYSk6ICBQcm90ZWN0IGFnYWluc3QgcHJldmlvdXMgZGVmaW5pdGlvbiBhcwotCWEgbWFjcm8gd2l0aCBhcmd1bWVudHMuCi0KLUZyaSBKdW4gMTkgMTU6NDg6NTQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLW9ic2QuaDogICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gdG8gbWFrZSB0aGlzIG1vcmUgS29zaGVyLgotCi1GcmkgSnVuIDE5IDEyOjUzOjI4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYXBvbGxvNjh2LCBtaC1zY28sIG1oLXN5c3YsIG1oLXN5c3Y0fTogUkFOTElCPXRydWUuCi0KLU1vbiBKdW4gMTUgMTM6NTA6MzQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBtaC1zeXN2NCBvbiBzb2xhcmlzMgotCi1Nb24gSnVuIDE1IDEyOjI4OjI0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoSU5TVEFMTCk6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCBpcyBicm9rZW4gb24gbmNyIDMwMDAncy4KLQkqIGNvbmZpZy9taC1uY3IzMDAwIChSQU5MSUIpOiAgVXNlIFJBTkxJQj10cnVlLgotCi1Nb24gSnVuIDE1IDAxOjM1OjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jOiBNYWtlIG5ldyBTSUdOQUxTXyogbWFjcm9zIHRvIHBhcmFtZXRlcml6ZSB0aGUgCi0JdWdseSBjaGFuZ2VzIGluIHNpZ25hbCBibG9ja2luZy4gIFVzZSB0aGVtIHRocm91Z2hvdXQsCi0JcmVkdWNpbmcgI2lmZGVmIEhBVkVfUE9TSVhfU0lHTkFMUyBhbmQgSEFWRV9CU0RfU0lHTkFMUyBjbHV0dGVyCi0Jc2lnbmlmaWNhbnRseS4gIE1ha2UgYWxsIHN1Y2ggcGxhY2VzIHVzZSBQT1NJWCBpZiBhdmFpbGFibGUsCi0JdG8gYXZvaWQgbG9zaW5nIHdpdGggcG9vciBgc2lnc2V0bWFzaycgZW11bGF0aW9uIGZyb20gbGliaWJlcnR5LgotCi1TdW4gSnVuIDE0IDE1OjE5OjUxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGluc2VydF9zb21lX2NoYXJzKTogIFJldHVybiB2b2lkLgotCi1UaHUgSnVuIDExIDAxOjI3OjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jOiAgI3VuZGVmIFBDLCB3aGljaCBTb2xhcmlzMiBkZWZpbmVzIGluIHN5cy90eXBlcy5oLAotCWNsb2JiZXJpbmcgdGhlIHRlcm1jYXAgZ2xvYmFsIHZhcmlhYmxlIFBDLgotCi1UdWUgSnVuICA5IDE3OjMwOjIzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIENoYW5nZSBJTlNUQUxMIHRvIHVzZQotCS91c3IvdWNiL2luc3RhbGwuCi0KLU1vbiBKdW4gIDggMjM6MTA6MDcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmggKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzKTogIEFkZCBkZWNsYXJhdGlvbi4KLQkqIHJlYWRsaW5lLmMgKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzKTogIEFkZCBnbG9iYWwgdmFyLgotCSogcmVhZGxpbmUuYyAoc3RycGJyayk6ICBBZGQgcHJvdG90eXBlIGFuZCBmdW5jdGlvbi4KLQkqIHJlYWRsaW5lLmMgKHJsX2NvbXBsZXRlX2ludGVybmFsKTogIEFkZCBjb2RlIHRvIGhhbmRsZQotCWV4cGFuc2lvbiBvZiBxdW90ZWQgc3RyaW5ncy4KLQotTW9uIE1heSAxMSAxMjozOTozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYzogIENhbid0IGluaXRpYWxpemUgRklMRSAqJ3Mgd2l0aCBzdGRpbiBhbmQgc3Rkb3V0LAotCWJlY2F1c2UgdGhleSBtaWdodCBub3QgYmUgY29uc3RhbnQuICBQYXRjaCBmcm9tIFRvbSBRdWlubiwKLQl0cnFAZGlub3lzb3MudGhwaHlzLm94LmFjLnVrLgotCi1UdWUgQXByIDI4IDIxOjUyOjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5oOiAgRGVjbGFyZSBybF9ldmVudF9ob29rICh3aGljaCBhbHJlYWR5IGV4aXN0ZWQpLgotCVN1Z2dlc3RlZCBieSBDaHJpc3RvcGggVGlldHogPHRpZXR6QHppLmdtZC5kYnAuZGU+LgotCi1XZWQgQXByIDIyIDE4OjA4OjAxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgc3ViZGlycyBkZWNsYXJhdGlvbi4gIFRoZSBvYnNvbGV0ZSBzZW1hbnRpYwotCSAgZm9yIHN1YmRpcnMgaGFzIGJlZW4gdXN1cnBlZCBieSBwZXIncyBuZXcgbWVhbmluZy4KLQotVHVlIEFwciAyMSAxMTo1NDoyMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJld29yayBDRkxBR1Mgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgb24gdGhlCi0JICBjb21tYW5kIGxpbmUgdG8gbWFrZS4gIFJlbW92ZSBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0KLUZyaSBBcHIgMTAgMjM6MDI6MjcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuZXcgbmNyMzAwMCBjb25maWcuCi0JKiBjb25maWcvbWgtbmNyMzAwMDogIE5ldyBOQ1IgMzAwMCBjb25maWcgZmlsZS4KLQotV2VkIE1hciAyNSAxMDo0NjozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaGlzdG9yeS5jIChzdGlmbGVfaGlzdG9yeSk6ICBOZWdhdGl2ZSBhcmcgdHJlYXRlZCBhcyB6ZXJvLgotCi1UdWUgTWFyIDI0IDIzOjQ2OjIwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3lzdjogSU5TVEFMTF9QUk9HIC0+IElOU1RBTEwuCi0KLU1vbiBGZWIgMTAgMDE6NDE6MzUgMTk5MiAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIGhpc3RvcnkuYyAoaGlzdG9yeV9kb193cml0ZSkgQnVpbGQgYSBidWZmZXIgb2YgYWxsIG9mIHRoZSBsaW5lcwotCXRvIHdyaXRlIGFuZCB3cml0ZSB0aGVtIGluIG9uZSBmZWxsIHN3b29wIChsb3dlciBvdmVyaGVhZCB0aGFuCi0JY2FsbGluZyB3cml0ZSAoKSBmb3IgZWFjaCBsaW5lKS4gIFN1Z2dlc3RlZCBieSBQZXRlciBIby4KLQotCSogdmlfbW9kZS5jIChybF92aV9zdWJzdCkgRG9uJ3QgZm9yZ2V0IHRvIGVuZCB0aGUgdW5kbyBncm91cC4KLQotU2F0IE1hciAgNyAwMDoxNTozNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgRklYTUUncyBvbiBpbmZvIGFuZCBpbnN0YWxsLWluZm8gdGFyZ2V0cy4KLQotRnJpIE1hciAgNiAyMjowMjowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLUZyaSBGZWIgMjEgMTQ6Mzc6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMsIGV4YW1wbGVzL2ZpbGVtYW4uYzogcGF0Y2hlcyBmcm9tIERKIHRvIHN1cHBvcnQgRE9TCi0KLVRodSBGZWIgMjAgMjM6MjM6MTYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmxfcmVhZF9pbml0X2ZpbGUpOiAgTWFrZSBzdXJlIHRoYXQgbnVsbCBmaWxlbmFtZSBpcwotCW5vdCBwYXNzZWQgdG8gb3BlbigpIG9yIGVsc2Ugd2UgZW5kIHVwIG9wZW5pbmcgdGhlIGRpcmVjdG9yeSwgYW5kCi0JcmVhZCBhIGJ1bmNoIG9mIGdhcmJhZ2UgaW50byBrZXltYXBbXS4KLQotTW9uIEZlYiAxNyAxNzoxNTowOSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmVhZGxpbmVfZGVmYXVsdF9iaW5kaW5ncyk6ICBPbmx5IG1ha2UgdXNlIG9mIFZMTkVYVAotCXdoZW4gYm90aCBWTE5FWFQgYW5kIFRFUk1JT1NfVFRZX0RSSVZFUiBpcyBkZWZpbmVkLiAgT24gU1ZSNAotCTx0ZXJtaW8uaD4gaW5jbHVkZXMgPHRlcm1pb3MuaD4sIHNvIFZMTkVYVCBpcyBhbHdheXMgZGVmaW5lZC4KLQotCSogc3lzZGVwLW5vcm0uaCAoX1BPU0lYX1ZFUlNJT04pOiAgRGVmaW5lIHRoaXMgZm9yIGFsbCBTVlI0Ci0Jc3lzdGVtcyBzbyB0aGF0IDx0ZXJtaW9zLmg+IGdldHMgdXNlZCwgaW5zdGVhZCBvZiA8dGVybWlvLmg+LgotCi1GcmkgRGVjIDIwIDEyOjA0OjMxIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDaGFuZ2Ugc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LgotCi1UdWUgRGVjIDEwIDA0OjA3OjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1GcmkgRGVjICA2IDIzOjIzOjE0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMsIGJzZCBtYWtlIGNhbid0Ci0JICBjb3BlLiBhZGRlZCBjbGVhbi1pbmZvLiAgYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydC4gIERvbid0Ci0JICBrbm93IGhvdyB0byBtYWtlIGluZm8gYW55bW9yZS4KLQotCSogY29uZmlndXJlLmluOiBjb21tb250YXJnZXRzIGlzIG5vIGxvbmdlciBhIHJlY29nbml6ZWQgaG9vaywgc28KLQkgIHJlbW92ZSBpdC4gIG5ldyBzdWJkaXIgY2FsbGVkIGRvYy4KLQotVGh1IERlYyAgNSAyMjo0NjoxMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLUZyaSBOb3YgMjIgMDk6MDI6MzIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1vYnNkLmg6ICBSZW5hbWUgZnJvbSBzeXNkZXAtbmV3c29zLmguCi0JKiBjb25maWd1cmUuaW46ICBVc2Ugc3lzZGVwLW9ic2QgZm9yIE1hY2ggYXMgd2VsbCBhcyBORVdzLgotCi0JKiBzeXNkZXAtbm9ybS5oLCBzeXNkZXAtYWl4Lmg6ICBBZGQgPHN5cy90eXBlcy5oPiwgd2hpY2ggUE9TSVgKLQlyZXF1aXJlcyB0byBtYWtlIDxkaXJlbnQuaD4gd29yay4gIEltcHJvdmUgU3VuIGFsbG9jYSBkZWNsLgotCi1UaHUgTm92IDIxIDE4OjQ4OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENsZWFuIHVwIC4uL2dsb2IvdGlsZGUuYyAtPiB0aWxkZS5vIHBhdGguCi0JQ2xlYW4gdXAgbWFrZWZpbGUgYSBiaXQgaW4gZ2VuZXJhbC4KLQotVGh1IE5vdiAyMSAxNDo0MDoyOSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1zdnI0OiAgTWFrZSBTVlI0IHdvcmsuCi0KLQkqIHJlYWRsaW5lLmM6ICBNb3ZlIGNvbmZpZyBzdHVmZiB0byBzeXNkZXAuaCwgdXNlIHR5cGVkZWYgZGlyZW50Ci0JY29uc2lzdGVudGx5LCByZW1vdmUgcmVmcyB0byBkX25hbWxlbiAoJiBEX05BTUxFTikgdG8gaW1wcm92ZQotCXBvcnRhYmlsaXR5LiAgQWxzbywgdXBkYXRlIGNvcHlyaWdodCBub3RpY2UuCi0JcmVhZGxpbmUuaDogIHJlbW92ZSBjb25maWcgc3R1ZmYgdGhhdCBJIGFkZGVkIGVycm9uZW91c2x5IGluIHRoZQotCWZpcnN0IHBsYWNlLgotCi0JKiBlbWFjc19rZXltYXAuYywgZnVubWFwLmMsIGhpc3RvcnkuYywga2V5bWFwcy5jLCB2aV9rZXltYXAuYywKLQl2aV9tb2RlLmM6ICBtb3ZlIGNvbmZpZyBzdHVmZiB0byBzeXNkZXAuaCwgdXBkYXRlIGNvcHlyaWdodCBub3RpY2VzLgotCi1UdWUgTm92IDE5IDE1OjAyOjEzIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhpc3RvcnkuYzogICNpbmNsdWRlICJzeXNkZXAuaCIuCi0KLVR1ZSBOb3YgMTkgMTA6NDk6MTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcvaG0tc3lzdiwgY29uZmlnL2htLXNjbzogIENoYW5nZSBTWVNWIHRvCi0JVVNHIHRvIG1hdGNoIGN1cnJlbnQgdXNhZ2UuCi0KLQkqIHJlYWRsaW5lLmM6ICBBZGQgVVNHcjQgdG8gbGlzdCBvZiBkZWZpbmVkIHRoaW5ncyB0byBjaGVjayBmb3IKLQl0byB1c2UgPGRpcmVudC5oPiBzdHlsZSBkaXJlY3RvcnkgYWNjZXNzLgotCi0JKiBjb25maWcvaG0tc3ZyNDogIE5ldyBmaWxlIGZvciBTeXN0ZW0gViBSZWxlYXNlIDQgKFVTR3I0KS4KLQotTW9uIE5vdiAxOCAyMzo1OTo1MiAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uKTogIHVzZSBzdHJ1Y3QgZGlyZW50Ci0JaW5zdGVhZAlvZiBzdHJ1Y3QgZGlyZWN0LgotCi1GcmkgTm92ICAxIDA3OjAyOjEzIDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jIChybF90cmFuc2xhdGVfa2V5c2VxKSBNYWtlIEMtPyB0cmFuc2xhdGUgdG8gUlVCT1VUCi0JdW5jb25kaXRpb25hbGx5LgotCi1Nb24gT2N0IDI4IDExOjM0OjUyIDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOyBVc2UgUG9zaXggZGlyZWN0b3J5IHJvdXRpbmVzIGFuZCBtYWNyb3MuCi0KLQkqIGZ1bm1hcC5jOyBBZGQgZW50cnkgZm9yIGNhbGwtbGFzdC1rYmQtbWFjcm8uCi0KLQkqIHJlYWRsaW5lLmMgKHJsX3ByZXBfdGVybSk7IFVzZSBzeXN0ZW0gRU9GIGNoYXJhY3RlciBvbiBQT1NJWAotCXN5c3RlbXMgYWxzby4KLQotVGh1IE9jdCAgMyAxNjoxOTo1MyAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzsgTWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gaGF2aW5nIGEgVEVSTUlPUyB0dHkKLQlkcml2ZXIsIGFuZCBoYXZpbmcgUE9TSVggc2lnbmFsIGhhbmRsaW5nLiAgWW91IG1pZ2h0IG9uZSB3aXRob3V0Ci0JdGhlIG90aGVyLiAgTmV3IGRlZmluZXMgdXNlZCBIQVZFX1BPU0lYX1NJR05BTFMsIGFuZAotCVRFUk1JT1NfVFRZX0RSSVZFUi4KLQotVHVlIEp1bCAzMCAyMjozNzoyNiAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogcmxfZ2V0YyAoKSBJZiBhIGNhbGwgdG8gcmVhZCAoKSByZXR1cm5zIHdpdGhvdXQgYW4KLQllcnJvciwgYnV0IHdpdGggemVybyBjaGFyYWN0ZXJzLCB0aGUgZmlsZSBpcyBlbXB0eSwgc28gcmV0dXJuIEVPRi4KLQotVGh1IEp1bCAxMSAyMDo1ODozOCAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogKHJsX2dldF9uZXh0X2hpc3RvcnksIHJsX2dldF9wcmV2aW91c19oaXN0b3J5KQotCVJlYWxsb2NhdGUgdGhlIGJ1ZmZlciBzcGFjZSBpZiB0aGUgbGluZSBiZWluZyBtb3ZlZCB0byBpcyBsb25nZXIKLQl0aGUgdGhlIGN1cnJlbnQgc3BhY2UgYWxsb2NhdGVkLiAgQW1hemluZyB0aGF0IG5vIG9uZSBoYXMgZm91bmQKLQl0aGlzIGJ1ZyB1bnRpbCBub3cuCi0KLVN1biBKdWwgIDcgMDI6Mzc6MDUgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6KHJsX3BhcnNlX2FuZF9iaW5kKSBBbGxvdyBsZWFkaW5nIHdoaXRlc3BhY2UuCi0JICBNYWtlIHN1cmUgVEVSTUlPIGFuZCBURVJNSU9TIHN5c3RlbXMgdHJlYXQgQ1IgYW5kIE5MCi0JICBkaXNjdGluY3RseS4KLQkKLVR1ZSBKdW4gMjUgMDQ6MDk6MjcgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IFJld29yayBwYXJzaW5nIGNvbmRpdGlvbmFscyB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZQotCXByaW9yIHN0YXRlcyBvZiB0aGUgY29uZGl0aW9uYWwgc3RhY2suICBUaGlzIG1ha2VzICRpZiBzdGF0ZW1lbnRzCi0Jd29yayBjb3JyZWN0bHkuCi0KLU1vbiBKdW4gMjQgMjA6NDU6NTkgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHN1cHBvcnQgZm9yIGRpc3BsYXlpbmcga2V5IGJpbmRpbmcgaW5mb3JtYXRpb24KLQlpbmNsdWRlcyB0aGUgZnVuY3Rpb25zIHJsX2xpc3RfZnVubWFwX25hbWVzICgpLAotCWludm9raW5nX2tleXNlcXNfaW5fbWFwICgpLCBybF9pbnZva2luZ19rZXlzZXFzICgpLAotCXJsX2R1bXBfZnVuY3Rpb25zICgpLCBhbmQgcmxfZnVuY3Rpb25fZHVtcGVyICgpLgotCi0JZnVubWFwLmM6IHN1cHBvcnQgZm9yIHNhbWUgaW5jbHVkZXMgcmxfZnVubWFwX25hbWVzICgpLgotCi0JcmVhZGxpbmUuYywgZnVubWFwLmM6IG5vIGxvbmdlciBkZWZpbmUgU1RBVElDX01BTExPQy4gIEhvd2V2ZXIsCi0JdXBkYXRlIGJvdGggdmVyc2lvbiBvZiB4cmVhbGxvYyAoKSB0byBoYW5kbGUgYSBudWxsIHBvaW50ZXIuCi0KLVRodSBBcHIgMjUgMTI6MDM6NDkgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHZpX21vZGUuYyAocmxfdmlfZndvcmQsIGZXb3JkLCBldGMuICBBbGwgZnVuY3Rpb25zIHVzZQotCXRoZSBtYWNybyBgaXNpZGVudCgpJy4gIEZpeGVkIG1vdmVtZW50IGJ1ZyB3aGljaCBwcmV2ZW50cwotCWNvbnRpbmlvdXMgbW92ZW1lbnQgdGhyb3VnaCB0aGUgdGV4dC4KLQotRnJpIEp1bCAyNyAxNjo0NzowMSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYyAocGFyc2VyX2lmKSBBbGxvdyAiJGlmIHRlcm09Zm9vIiBjb25zdHJ1Y3QuCi0KLVdlZCBNYXkgMjMgMTY6MTA6MzMgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmMgKHJsX2Rpc3BhdGNoKSBDb3JyZWN0bHkgcmVtZW1iZXIgdGhlIGxhc3QgY29tbWFuZAotCWV4ZWN1dGVkLiAgRml4ZWQgdHlwbyBpbiB1c2VybmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uICgpLgotCi1Nb24gQXByICA5IDE5OjU1OjQ4IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiB1c2VybmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uICgpOyBGb3IgdGV4dCBwYXNzZWQgaW4KLQl3aXRoIGEgbGVhZGluZyBgficsIHJlbWVtYmVyIHRoYXQgdGhpcyBjb3VsZCBiZSBhIGZpbGVuYW1lIChhZnRlcgotCWl0IGlzIGNvbXBsZXRlZCkuCi0KLVRodSBBcHIgIDUgMTM6NDQ6MjQgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHJsX3NlYXJjaF9oaXN0b3J5ICgpOiBDb3JyZWN0bHkgaGFuZGxlIGNhc2Ugb2YgYW4KLQl1bmZvdW5kIHNlYXJjaCBzdHJpbmcsIGJ1dCBhIGdyYWNlZnVsIGV4aXQgKGFzIHdpdGggRVNDKS4KLQotCSogcmVhZGxpbmUuYzogcmxfcmVzdGFydF9vdXRwdXQgKCk7ICBUaGUgQXBvbGxvIHBhc3NlcyB0aGUgYWRkcmVzcwotCW9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gVElPQ1NUQVJULCBub3QgdGhlIGRlc2NyaXB0b3IgaXRzZWxmLgotCi1UdWUgTWFyIDIwIDA1OjM4OjU1IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBybF9jb21wbGV0ZSAoKTsgc2Vjb25kIGNhbGwgaW4gYSByb3cgY2F1c2VzIHBvc3NpYmxlCi0JY29tcGxldGlvbnMgdG8gYmUgbGlzdGVkLgotCi0JKiByZWFkbGluZS5jOiBybF9yZWRpc3BsYXkgKCksIGFkZGVkIHByb21wdF90aGlzX2xpbmUgdmFyaWFibGUKLQl3aGljaCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNoYXJhY3RlciBmb2xsb3dpbmcgXG4gaW4gcHJvbXB0LgotCi1TdW4gTWFyIDExIDA0OjMyOjAzIDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiBTaWduYWxzIGFyZSBub3cgc3VwcG9zZWRseSBoYW5kbGVkIGluc2lkZSBvZiBTWVNWIGNvbXBpbGF0aW9uLgotCi1XZWQgSmFuIDE3IDE5OjI0OjA5IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgc2JwaHkudWNzYi5lZHUpCi0KLQkqIGhpc3RvcnkuYzogaGlzdG9yeV9leHBhbmQgKCk7IGZpeGVkIG92ZXJ3cml0aW5nIG1lbW9yeSBlcnJvciwKLQlhZGRlZCBuZWVkZWQgYXJndW1lbnQgdG8gY2FsbCB0byBnZXRfaGlzdG9yeV9ldmVudCAoKS4KLQotVGh1IEphbiAxMSAxMDo1NDowNCAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IHNicGh5LnVjc2IuZWR1KQotCi0JKiByZWFkbGluZS5jOiBhZGRlZCBtYXJrX21vZGlmaWVkX2xpbmVzIHRvIGNvbnRyb2wgdGhlCi0JZGlzcGxheSBvZiBhbiBhc3RlcmlzayBvbiBtb2RpZmllZCBoaXN0b3J5IGxpbmVzLiAgQWxzbwotCWFkZGVkIGEgdXNlciB2YXJpYWJsZSBjYWxsZWQgbWFyay1tb2RpZmllZC1saW5lcyB0byB0aGUKLQlgc2V0JyBjb21tYW5kLgotCi1UaHUgSmFuICA0IDEwOjM4OjA1IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgc2JwaHkudWNzYi5lZHUpCi0KLQkqIHJlYWRsaW5lLmM6IHN0YXJ0X2luc2VydCAoKS4gIE9ubHkgdXNlIElDIGlmIHdlIGRvbid0IGhhdmUgYW4gaW0KLQljYXBhYmlsaXR5LgotCi1GcmkgU2VwICA4IDA5OjAwOjQ1IDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJlYWRsaW5lLmM6IHJsX3ByZXBfdGVybWluYWwgKCkuICBPbmx5IHR1cm4gb24gOHRoIGJpdAotCSAgYXMgbWV0YS1iaXQgaWZmIHRoZSB0ZXJtaW5hbCBpcyBub3QgdXNpbmcgcGFyaXR5LgotCi1TdW4gU2VwICAzIDA4OjU3OjQwIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJlYWRsaW5lLmM6IHN0YXJ0X2luc2VydCAoKS4gIFVzZXMgbXVsdGlwbGUKLQkgIGluc2VydGlvbiBjYWxsIGluIGNhc2VzIHdoZXJlIHRoYXQgbWFrZXMgc2Vuc2UuCi0KLQkgIHJsX2luc2VydCAoKS4gIFJlYWQgdHlwZS1haGVhZCBidWZmZXIgZm9yIGFkZGl0aW9uYWwKLQkgIGtleXMgdGhhdCBhcmUgYm91bmQgdG8gcmxfaW5zZXJ0LCBhbmQgaW5zZXJ0IHRoZW0KLQkgIGFsbCBhdCBvbmNlLiAgTWFrZSBpbnNlcnRpb24gb2Ygc2luZ2xlIGtleXMgZ2l2ZW4KLQkgIHdpdGggYW4gYXJndW1lbnQgbXVjaCBtb3JlIGVmZmljaWVudC4KLQotVHVlIEF1ZyAgOCAxODoxMzo1NyAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiByZWFkbGluZS5jOiBDaGFuZ2VkIGhhbmRsaW5nIG9mIEVPRi4gIHJlYWRsaW5lICgpIHJldHVybnMKLQkgKGNoYXIgKilFT0Ygb3IgY29uc2VkIHN0cmluZy4gIFRoZSBFT0YgY2hhcmFjdGVyIGlzIHJlYWQgZnJvbSB0aGUKLQkgdHR5LCBvciBpZiB0aGUgdHR5IGRvZXNuJ3QgaGF2ZSBvbmUsIGRlZmF1bHRzIHRvIEMtZC4KLQotCSogcmVhZGxpbmUuYzogQWRkZWQgc3VwcG9ydCBmb3IgZXZlbnQgZHJpdmVuIHByb2dyYW1zLgotCSAgcmxfZXZlbnRfaG9vayBpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHlvdSB3YW50IGNhbGxlZAotCSAgd2hpbGUgUmVhZGxpbmUgaXMgd2FpdGluZyBmb3IgaW5wdXQuCi0KLQkqIHJlYWRsaW5lLmM6IENsZWFudXAgdGltZS4gIEZ1bmN0aW9ucyB3aXRob3V0IHR5cGUgZGVjbGFyYXRpb25zCi0JICBkbyBub3QgdXNlIHJldHVybiB3aXRoIGEgdmFsdWUuCi0KLQkqIGhpc3RvcnkuYzogaGlzdG9yeV9leHBhbmQgKCkgaGFzIG5ldyB2YXJpYWJsZSB3aGljaCBpcyB0aGUKLQkgIGNoYXJhY3RlcnMgdG8gaWdub3JlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBoaXN0b3J5X2V4cGFuc2lvbl9jaGFyLgotCi1TdW4gSnVsIDE2IDA4OjE0OjAwIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJsX3ByZXBfdGVybWluYWwgKCkKLQkgIEJTRCB2ZXJzaW9uIHR1cm5zIG9mZiBDLXMsIEMtcSwgQy15LCBDLXYuCi0KLQkqIHJlYWRsaW5lLmMgLS0gcmxfcHJlcF90ZXJtaW5hbCAoKQotCSAgU1lTViB2ZXJzaW9uIGhhY2tzIHJlYWRsaW5lX2VjaG9pbmdfcC4KLQkgIEJTRCB2ZXJzaW9uIHR1cm5zIG9uIHBhc3Npbmcgb2YgdGhlIDh0aCBiaXQgZm9yIHRoZSBkdXJhdGlvbgotCSAgb2YgcmVhZGluZyB0aGUgbGluZS4KLQotVHVlIEp1bCAxMSAwNjoyNTowMSAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiByZWFkbGluZS5jOiBuZXcgdmFyaWFibGUgcmxfdGlsZGVfZXhwYW5kZXIuCi0JICBJZiBub24tbnVsbCwgdGhpcyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgaWYKLQkgIHRoZSBzdGFuZGFyZCBtZWFuaW5nIGZvciBleHBhbmRpbmcgYSB0aWxkZSBmYWlscy4gIFRoZSBmdW5jdGlvbiBpcwotCSAgY2FsbGVkIHdpdGggdGhlIHRleHQgc2FucyB0aWxkZSAoYXMgaW4gImZvbyIpLCBhbmQgcmV0dXJucyBhCi0JICBtYWxsb2MoKSdlZCBzdHJpbmcgd2hpY2ggaXMgdGhlIGV4cGFuc2lvbiwgb3IgYSBOVUxMIHBvaW50ZXIgaWYKLQkgIHRoZXJlIGlzIG5vIGV4cGFuc2lvbi4gCi0KLQkqIHJlYWRsaW5lLmggLSBuZXcgZmlsZSBjaGFyZGVmcy5oCi0JICBTZXBhcmF0ZXMgdGhpbmdzIHRoYXQgb25seSByZWFkbGluZS5jIG5lZWRzIGZyb20gdGhlIHN0YW5kYXJkCi0JICBoZWFkZXIgZmlsZSBwdWJsaXNoaW5nIGludGVyZXN0aW5nIHRoaW5ncyBhYm91dCByZWFkbGluZS4KLQotCSogcmVhZGxpbmUuYzoKLQkgIHJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MgKCkgbm93IGxvb2tzIGF0IHRlcm1pbmFsIGNoYXJhcmFjdGVycwotCSAgYW5kIGJpbmRzIHRob3NlIGFzIHdlbGwuCi0KLVdlZCBKdW4gMjggMjA6MjA6NTEgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogTWFkZSByZWFkbGluZSBhbmQgaGlzdG9yeSBpbnRvIGluZGVwZW5kZW50IGxpYnJhcmllcy4KLQpkaWZmIC0tZ2l0IGEvc2V0dXAuY29tIGIvc2V0dXAuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNhZmQ1Li4wMDAwMDAwCi0tLSBhL3NldHVwLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotJCEgc2V0dXAgZmlsZXMgZm9yIG9wZW5WTVMvQWxwaGEKLSQhCi0kIGRlZmluZSBhb3V0IFstLklOQ0xVREUuQU9VVF0KLSQgZGVmaW5lIGNvZmYgWy0uSU5DTFVERS5DT0ZGXQotJCBkZWZpbmUgZWxmIFstLklOQ0xVREUuRUxGXQotJCBkZWZpbmUgbXB3IFstLklOQ0xVREUuTVBXXQotJCBkZWZpbmUgbmxtIFstLklOQ0xVREUuTkxNXQotJCBkZWZpbmUgb3Bjb2RlIFstLklOQ0xVREUuT1BDT0RFXQpkaWZmIC0tZ2l0IGEvc3ltbGluay10cmVlIGIvc3ltbGluay10cmVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTY1ODJkLi4wMDAwMDAwCi0tLSBhL3N5bWxpbmstdHJlZQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBDcmVhdGUgYSBzeW1saW5rIHRyZWUuCi0jCi0jIFN5bnRheDogc3ltbGluay10cmVlIHNyY2RpciAiaWdub3JlMSBpZ25vcmUyIC4uLiIKLSMKLSMgd2hlcmUgc3JjZGlyIGlzIHRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlIGEgc3ltbGluayB0cmVlIHRvLAotIyBhbmQgImlnbm9yZU4iIGlzIGEgbGlzdCBvZiBmaWxlcy9kaXJlY3RvcmllcyB0byBpZ25vcmUuCi0KLXByb2c9JDAKLXNyY2Rpcj0kMQotaWdub3JlPSIkMiIKLQotaWdub3JlX2FkZGl0aW9uYWw9Ii4gLi4gQ1ZTIgotCi0jIElmIHdlIHdlcmUgaW52b2tlZCB3aXRoIGEgcmVsYXRpdmUgcGF0aCBuYW1lLCBhZGp1c3QgJHtwcm9nfSB0byB3b3JrCi0jIGluIHN1YmRpcnMuCi1jYXNlICR7cHJvZ30gaW4KLS8qKSA7OwotKikgcHJvZz0uLi8ke3Byb2d9IDs7Ci1lc2FjCi0KLSMgU2V0IG5ld3NyY2RpciB0byBzb21ldGhpbmcgc3ViZGlyZWN0b3JpZXMgY2FuIHVzZS4KLWNhc2UgJHtzcmNkaXJ9IGluCi0vKikgbmV3c3JjZGlyPSR7c3JjZGlyfSA7OwotKikgbmV3c3JjZGlyPS4uLyR7c3JjZGlyfSA7OwotZXNhYwotCi1mb3IgZiBpbiBgbHMgLWEgJHtzcmNkaXJ9YDsgZG8KLSAgaWYgWyAtZCAke3NyY2Rpcn0vJGYgXTsgdGhlbgotICAgIGZvdW5kPQotICAgIGZvciBpIGluICR7aWdub3JlfSAke2lnbm9yZV9hZGRpdGlvbmFsfTsgZG8KLSAgICAgIGlmIFsgIiRmIiA9ICIkaSIgXTsgdGhlbgotCWZvdW5kPXllcwotICAgICAgZmkKLSAgICBkb25lCi0gICAgaWYgWyAteiAiJHtmb3VuZH0iIF07IHRoZW4KLSAgICAgIGVjaG8gIiRmCQkuLndvcmtpbmcgaW4iCi0gICAgICBpZiBbIC1kICRmIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAkZjsgZmkKLSAgICAgIChjZCAkZjsgJHtwcm9nfSAke25ld3NyY2Rpcn0vJGYgIiR7aWdub3JlfSIpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRmCQkuLmxpbmtlZCIKLSAgICBybSAtZiAkZgotICAgIGxuIC1zICR7c3JjZGlyfS8kZiAuCi0gIGZpCi1kb25lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGV4aW5mby90ZXhpbmZvLnRleCBiL3RleGluZm8vdGV4aW5mby50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkM2EzM2MuLjAwMDAwMDAKLS0tIGEvdGV4aW5mby90ZXhpbmZvLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU0MzEgKzAsMCBAQAotJSB0ZXhpbmZvLnRleCAtLSBUZVggbWFjcm9zIHRvIGhhbmRsZSBUZXhpbmZvIGZpbGVzLgotJSAkSWQkCi0lCi0lIENvcHlyaWdodCAoQykgMTk4NSwgODYsIDg4LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4Ci0lIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotJQotJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0lIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0lIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSUgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotJQotJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0lIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSUgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotJQotJSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotJSBhbG9uZyB3aXRoIHRoaXMgdGV4aW5mby50ZXggZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCi0lIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSUgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0lCi0lIEluIG90aGVyIHdvcmRzLCB5b3UgYXJlIHdlbGNvbWUgdG8gdXNlLCBzaGFyZSBhbmQgaW1wcm92ZSB0aGlzIHByb2dyYW0uCi0lIFlvdSBhcmUgZm9yYmlkZGVuIHRvIGZvcmJpZCBhbnlvbmUgZWxzZSB0byB1c2UsIHNoYXJlIGFuZCBpbXByb3ZlCi0lIHdoYXQgeW91IGdpdmUgdGhlbS4gICBIZWxwIHN0YW1wIG91dCBzb2Z0d2FyZS1ob2FyZGluZyEKLSUKLSUgUGxlYXNlIHRyeSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGV4aW5mby50ZXggYmVmb3JlIHN1Ym1pdHRpbmcgYnVnCi0lIHJlcG9ydHM7IHlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tOgotJSAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvdGV4aW5mby50ZXgKLSUgICAvaG9tZS9nZC9nbnUvZG9jL3RleGluZm8udGV4IG9uIHRoZSBHTlUgbWFjaGluZXMuCi0lICAgKGFuZCBhbGwgR05VIG1pcnJvcnMsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvb3JkZXIvZnRwLmh0bWwpCi0lICAgZnRwOi8vdHVnLm9yZy90ZXgvdGV4aW5mby50ZXgKLSUgICBmdHA6Ly9jdGFuLm9yZy9tYWNyb3MvdGV4aW5mby90ZXhpbmZvLnRleAotJSAgIChhbmQgYWxsIENUQU4gbWlycm9ycywgZmluZ2VyIGN0YW5AY3Rhbi5vcmcgZm9yIGEgbGlzdCkuCi0lIFRoZSB0ZXhpbmZvLnRleCBpbiB0aGUgdGV4aW5mbyBkaXN0cmlidXRpb24gaXRzZWxmIGNvdWxkIHdlbGwgYmUgb3V0Ci0lIG9mIGRhdGUsIHNvIGlmIHRoYXQncyB3aGF0IHlvdSdyZSB1c2luZywgcGxlYXNlIGNoZWNrLgotJSAKLSUgU2VuZCBidWcgcmVwb3J0cyB0byBidWctdGV4aW5mb0BnbnUub3JnLgotJSBQbGVhc2UgaW5jbHVkZSBhIHByZWNpc2UgdGVzdCBjYXNlIGluIGVhY2ggYnVnIHJlcG9ydCwKLSUgaW5jbHVkaW5nIGEgY29tcGxldGUgZG9jdW1lbnQgd2l0aCB3aGljaCB3ZSBjYW4gcmVwcm9kdWNlIHRoZSBwcm9ibGVtLgotJSAKLSUgVG8gcHJvY2VzcyBhIFRleGluZm8gbWFudWFsIHdpdGggVGVYLCBpdCdzIG1vc3QgcmVsaWFibGUgdG8gdXNlIHRoZQotJSB0ZXhpMmR2aSBzaGVsbCBzY3JpcHQgdGhhdCBjb21lcyB3aXRoIHRoZSBkaXN0cmlidXRpb24uICBGb3Igc2ltcGxlCi0lIG1hbnVhbHMsIGhvd2V2ZXIsIHlvdSBjYW4gZ2V0IGF3YXkgd2l0aDoKLSUgICB0ZXggZm9vLnRleGkKLSUgICB0ZXhpbmRleCBmb28uPz8KLSUgICB0ZXggZm9vLnRleGkKLSUgICB0ZXggZm9vLnRleGkKLSUgICBkdmlwcyBmb28uZHZpIC1vICMgb3Igd2hhdGV2ZXIsIHRvIHByb2Nlc3MgdGhlIGR2aSBmaWxlLgotJSBUaGUgZXh0cmEgcnVucyBvZiBUZVggZ2V0IHRoZSBjcm9zcy1yZWZlcmVuY2UgaW5mb3JtYXRpb24gY29ycmVjdC4KLSUgU29tZXRpbWVzIG9uZSBydW4gYWZ0ZXIgdGV4aW5kZXggc3VmZmljZXMsIGFuZCBzb21ldGltZXMgeW91IG5lZWQgbW9yZQotJSB0aGFuIHR3bzsgdGV4aTJkdmkgZG9lcyBpdCBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeS4KLQotCi0lIE1ha2UgaXQgcG9zc2libGUgdG8gY3JlYXRlIGEgLmZtdCBmaWxlIGp1c3QgYnkgbG9hZGluZyB0aGlzIGZpbGU6Ci0lIGlmIHRoZSB1bmRlcmx5aW5nIGZvcm1hdCBpcyBub3QgbG9hZGVkLCBzdGFydCBieSBsb2FkaW5nIGl0IG5vdy4KLSUgQWRkZWQgYnkgZ2lsZGVhIE5vdmVtYmVyIDE5OTMuCi1cZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBmbXRuYW1lXGVuZGNzbmFtZVxyZWxheFxpbnB1dCBwbGFpblxmaQotCi0lIFRoaXMgYXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSB2ZXJzaW9uIG51bWJlciBiYXNlZCBvbiBSQ1MuCi1cZGVmXGRlZnRleGluZm92ZXJzaW9uJCMxOiAjMiAke1xkZWZcdGV4aW5mb3ZlcnNpb257IzJ9fQotXGRlZnRleGluZm92ZXJzaW9uJFJldmlzaW9uJAotXG1lc3NhZ2V7TG9hZGluZyB0ZXhpbmZvIHBhY2thZ2UgW1ZlcnNpb24gXHRleGluZm92ZXJzaW9uXTp9Ci0KLSUgSWYgaW4gYSAuZm10IGZpbGUsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlcgotJSBhbmQgdHVybiBvbiBhY3RpdmUgY2hhcmFjdGVycyB0aGF0IHdlIGNvdWxkbid0IGRvIGVhcmxpZXIgYmVjYXVzZQotJSB0aGV5IG1pZ2h0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIGlucHV0IGZpbGUgbmFtZS4KLVxldmVyeWpvYntcbWVzc2FnZXtbVGV4aW5mbyB2ZXJzaW9uIFx0ZXhpbmZvdmVyc2lvbl19XG1lc3NhZ2V7fQotICBcY2F0Y29kZWArPVxhY3RpdmUgXGNhdGNvZGVgXF89XGFjdGl2ZX0KLQotJSBTYXZlIHNvbWUgcGFydHMgb2YgcGxhaW4gdGV4IHdob3NlIG5hbWVzIHdlIHdpbGwgcmVkZWZpbmUuCi0KLVxsZXRccHRleGI9XGIKLVxsZXRccHRleGJ1bGxldD1cYnVsbGV0Ci1cbGV0XHB0ZXhjPVxjCi1cbGV0XHB0ZXhjb21tYT1cLAotXGxldFxwdGV4ZG90PVwuCi1cbGV0XHB0ZXhkb3RzPVxkb3RzCi1cbGV0XHB0ZXhlbmQ9XGVuZAotXGxldFxwdGV4ZXF1aXY9XGVxdWl2Ci1cbGV0XHB0ZXhleGNsYW09XCEKLVxsZXRccHRleGk9XGkKLVxsZXRccHRleGxicmFjZT1cewotXGxldFxwdGV4cmJyYWNlPVx9Ci1cbGV0XHB0ZXhzdGFyPVwqCi1cbGV0XHB0ZXh0PVx0Ci0KLSUgV2UgbmV2ZXIgd2FudCBwbGFpbidzIG91dGVyIFwrIGRlZmluaXRpb24gaW4gVGV4aW5mby4KLSUgRm9yIEB0ZXgsIHdlIGNhbiB1c2UgXHRhYmFsaWduLgotXGxldFwrID0gXHJlbGF4Ci0KLQotXG1lc3NhZ2V7QmFzaWNzLH0KLVxjaGFyZGVmXG90aGVyPTEyCi0KLSUgSWYgdGhpcyBjaGFyYWN0ZXIgYXBwZWFycyBpbiBhbiBlcnJvciBtZXNzYWdlIG9yIGhlbHAgc3RyaW5nLCBpdAotJSBzdGFydHMgYSBuZXcgbGluZSBpbiB0aGUgb3V0cHV0LgotXG5ld2xpbmVjaGFyID0gYF5eSgotCi0lIFNldCB1cCBmaXhlZCB3b3JkcyBmb3IgRW5nbGlzaCBpZiBub3QgYWxyZWFkeSBzZXQuCi1caWZ4XHB1dHdvcmRBcHBlbmRpeFx1bmRlZmluZWQgXGdkZWZccHV0d29yZEFwcGVuZGl4e0FwcGVuZGl4fVxmaQotXGlmeFxwdXR3b3JkQ2hhcHRlclx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRDaGFwdGVye0NoYXB0ZXJ9XGZpCi1caWZ4XHB1dHdvcmRmaWxlXHVuZGVmaW5lZCAgICAgXGdkZWZccHV0d29yZGZpbGV7ZmlsZX1cZmkKLVxpZnhccHV0d29yZEluZm9cdW5kZWZpbmVkICAgICBcZ2RlZlxwdXR3b3JkSW5mb3tJbmZvfVxmaQotXGlmeFxwdXR3b3JkTWV0aG9kb25cdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNZXRob2RvbntNZXRob2Qgb259XGZpCi1caWZ4XHB1dHdvcmRvblx1bmRlZmluZWQgICAgICAgXGdkZWZccHV0d29yZG9ue29ufVxmaQotXGlmeFxwdXR3b3JkcGFnZVx1bmRlZmluZWQgICAgIFxnZGVmXHB1dHdvcmRwYWdle3BhZ2V9XGZpCi1caWZ4XHB1dHdvcmRzZWN0aW9uXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZHNlY3Rpb257c2VjdGlvbn1cZmkKLVxpZnhccHV0d29yZFNlY3Rpb25cdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkU2VjdGlvbntTZWN0aW9ufVxmaQotXGlmeFxwdXR3b3Jkc2VlXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRzZWV7c2VlfVxmaQotXGlmeFxwdXR3b3JkU2VlXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRTZWV7U2VlfVxmaQotXGlmeFxwdXR3b3JkU2hvcnRDb250ZW50c1x1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRTaG9ydENvbnRlbnRze1Nob3J0IENvbnRlbnRzfVxmaQotXGlmeFxwdXR3b3JkVGFibGVvZkNvbnRlbnRzXHVuZGVmaW5lZFxnZGVmXHB1dHdvcmRUYWJsZW9mQ29udGVudHN7VGFibGUgb2YgQ29udGVudHN9XGZpCi0KLSUgSWdub3JlIGEgdG9rZW4uCi0lCi1cZGVmXGdvYmJsZSMxe30KLQotXGh5cGhlbmF0aW9ue2FwLXBlbi1kaXh9Ci1caHlwaGVuYXRpb257bWluaS1idWYtZmVyIG1pbmktYnVmLWZlcnN9Ci1caHlwaGVuYXRpb257ZXNoZWxsfQotXGh5cGhlbmF0aW9ue3doaXRlLXNwYWNlfQotCi0lIE1hcmdpbiB0byBhZGQgdG8gcmlnaHQgb2YgZXZlbiBwYWdlcywgdG8gbGVmdCBvZiBvZGQgcGFnZXMuCi1cbmV3ZGltZW4gXGJpbmRpbmdvZmZzZXQKLVxuZXdkaW1lbiBcbm9ybWFsb2Zmc2V0Ci1cbmV3ZGltZW5ccGFnZXdpZHRoIFxuZXdkaW1lblxwYWdlaGVpZ2h0Ci0KLSUgU29tZXRpbWVzIGl0IGlzIGNvbnZlbmllbnQgdG8gaGF2ZSBldmVyeXRoaW5nIGluIHRoZSB0cmFuc2NyaXB0IGZpbGUKLSUgYW5kIG5vdGhpbmcgb24gdGhlIHRlcm1pbmFsLiAgV2UgZG9uJ3QganVzdCBjYWxsIFx0cmFjaW5nYWxsIGhlcmUsCi0lIHNpbmNlIHRoYXQgcHJvZHVjZXMgc29tZSB1c2VsZXNzIG91dHB1dCBvbiB0aGUgdGVybWluYWwuCi0lCi1cZGVmXGdsb2dnaW5nYWxse1xiZWdpbmdyb3VwIFxnbG9iYWxkZWZzID0gMSBcbG9nZ2luZ2FsbCBcZW5kZ3JvdXB9JQotXGlmeFxlVGVYdmVyc2lvblx1bmRlZmluZWQKLVxkZWZcbG9nZ2luZ2FsbHtcdHJhY2luZ2NvbW1hbmRzMiBcdHJhY2luZ3N0YXRzMgotICAgXHRyYWNpbmdwYWdlczEgXHRyYWNpbmdvdXRwdXQxIFx0cmFjaW5nbG9zdGNoYXJzMQotICAgXHRyYWNpbmdtYWNyb3MyIFx0cmFjaW5ncGFyYWdyYXBoczEgXHRyYWNpbmdyZXN0b3JlczEKLSAgIFxzaG93Ym94YnJlYWR0aFxtYXhkaW1lblxzaG93Ym94ZGVwdGhcbWF4ZGltZW4KLX0lCi1cZWxzZQotXGRlZlxsb2dnaW5nYWxse1x0cmFjaW5nY29tbWFuZHMzIFx0cmFjaW5nc3RhdHMyCi0gICBcdHJhY2luZ3BhZ2VzMSBcdHJhY2luZ291dHB1dDEgXHRyYWNpbmdsb3N0Y2hhcnMxCi0gICBcdHJhY2luZ21hY3JvczIgXHRyYWNpbmdwYXJhZ3JhcGhzMSBcdHJhY2luZ3Jlc3RvcmVzMQotICAgXHRyYWNpbmdzY2FudG9rZW5zMSBcdHJhY2luZ2Fzc2lnbnMxIFx0cmFjaW5naWZzMQotICAgXHRyYWNpbmdncm91cHMxIFx0cmFjaW5nbmVzdGluZzIKLSAgIFxzaG93Ym94YnJlYWR0aFxtYXhkaW1lblxzaG93Ym94ZGVwdGhcbWF4ZGltZW4KLX0lCi1cZmkKLQotJSBGb3IgQGNyb3BtYXJrcyBjb21tYW5kLgotJSBEbyBAY3JvcG1hcmtzIHRvIGdldCBjcm9wIG1hcmtzLgotJSAKLVxuZXdpZlxpZmNyb3BtYXJrcwotXGxldFxjcm9wbWFya3MgPSBcY3JvcG1hcmtzdHJ1ZQotJQotJSBEaW1lbnNpb25zIHRvIGFkZCBjcm9wbWFya3MgYXQgY29ybmVycy4KLSUgQWRkZWQgYnkgUC4gQS4gTWFjS2F5LCAxMiBOb3YuIDE5ODYKLSUKLVxuZXdkaW1lblxvdXRlcmhzaXplIFxuZXdkaW1lblxvdXRlcnZzaXplICUgc2V0IGJ5IHRoZSBwYXBlciBzaXplIHJvdXRpbmVzCi1cbmV3ZGltZW5cY29ybmVybG9uZyAgXGNvcm5lcmxvbmc9MXBjCi1cbmV3ZGltZW5cY29ybmVydGhpY2sgXGNvcm5lcnRoaWNrPS4zcHQKLVxuZXdkaW1lblx0b3BhbmRib3R0b21tYXJnaW4gXHRvcGFuZGJvdHRvbW1hcmdpbj0uNzVpbgotCi0lIE1haW4gb3V0cHV0IHJvdXRpbmUuCi1cY2hhcmRlZlxQQUdFID0gMjU1Ci1cb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19Ci0KLVxuZXdib3hcaGVhZGxpbmVib3gKLVxuZXdib3hcZm9vdGxpbmVib3gKLQotJSBcb25lcGFnZW91dCB0YWtlcyBhIHZib3ggYXMgYW4gYXJndW1lbnQuICBOb3RlIHRoYXQgXHBhZ2Vjb250ZW50cwotJSBkb2VzIGluc2VydGlvbnMsIGJ1dCB5b3UgaGF2ZSB0byBjYWxsIGl0IHlvdXJzZWxmLgotXGRlZlxvbmVwYWdlb3V0IzF7JQotICBcaWZjcm9wbWFya3MgXGhvZmZzZXQ9MHB0IFxlbHNlIFxob2Zmc2V0PVxub3JtYWxvZmZzZXQgXGZpCi0gICUKLSAgXGlmb2RkXHBhZ2VubyAgXGFkdmFuY2VcaG9mZnNldCBieSBcYmluZGluZ29mZnNldAotICBcZWxzZSBcYWR2YW5jZVxob2Zmc2V0IGJ5IC1cYmluZGluZ29mZnNldFxmaQotICAlCi0gICUgRG8gdGhpcyBvdXRzaWRlIG9mIHRoZSBcc2hpcG91dCBzbyBAY29kZSBldGMuIHdpbGwgYmUgZXhwYW5kZWQgaW4KLSAgJSB0aGUgaGVhZGxpbmUgYXMgdGhleSBzaG91bGQgYmUsIG5vdCB0YWtlbiBsaXRlcmFsbHkgKG91dHB1dHRpbmcgJydjb2RlKS4KLSAgXHNldGJveFxoZWFkbGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWhlYWRsaW5lfSUKLSAgXHNldGJveFxmb290bGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWZvb3RsaW5lfSUKLSAgJQotICB7JQotICAgICUgSGF2ZSB0byBkbyB0aGlzIHN0dWZmIG91dHNpZGUgdGhlIFxzaGlwb3V0IGJlY2F1c2Ugd2Ugd2FudCBpdCB0bwotICAgICUgdGFrZSBlZmZlY3QgaW4gXHdyaXRlJ3MsIHlldCB0aGUgZ3JvdXAgZGVmaW5lZCBieSB0aGUgXHZib3ggZW5kcwotICAgICUgYmVmb3JlIHRoZSBcc2hpcG91dCBydW5zLgotICAgICUKLSAgICBcZXNjYXBlY2hhciA9IGBcXCAgICAgJSB1c2UgYmFja3NsYXNoIGluIG91dHB1dCBmaWxlcy4KLSAgICBcaW5kZXhkdW1taWVzICAgICAgICAgJSBkb24ndCBleHBhbmQgY29tbWFuZHMgaW4gdGhlIG91dHB1dC4KLSAgICBcbm9ybWFsdHVybm9mZmFjdGl2ZSAgJSBcIGluIGluZGV4IGVudHJpZXMgbXVzdCBub3Qgc3RheSBcLCBlLmcuLCBpZgotICAgICAgICAgICAgICAgICAgICUgdGhlIHBhZ2UgYnJlYWsgaGFwcGVucyB0byBiZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4YW1wbGUuCi0gICAgXHNoaXBvdXRcdmJveHslCi0gICAgICBcaWZjcm9wbWFya3MgXHZib3ggdG8gXG91dGVydnNpemVcYmdyb3VwCi0gICAgICAgIFxoc2l6ZSA9IFxvdXRlcmhzaXplCi0gICAgICAgIFxsaW5le1xld3RvcFxoZmlsXGV3dG9wfSUKLSAgICAgICAgXG5vaW50ZXJsaW5lc2tpcAotICAgICAgICBcbGluZXslCi0gICAgICAgICAgXHZib3h7XG1vdmVsZWZ0XGNvcm5lcnRoaWNrXG5zdG9wfSUKLSAgICAgICAgICBcaGZpbGwKLSAgICAgICAgICBcdmJveHtcbW92ZXJpZ2h0XGNvcm5lcnRoaWNrXG5zdG9wfSUKLSAgICAgICAgfSUKLSAgICAgICAgXHZza2lwXHRvcGFuZGJvdHRvbW1hcmdpbgotICAgICAgICBcbGluZVxiZ3JvdXAKLSAgICAgICAgICBcaGZpbCAlIGNlbnRlciB0aGUgcGFnZSB3aXRoaW4gdGhlIG91dGVyIChwYWdlKSBoc2l6ZS4KLSAgICAgICAgICBcaWZvZGRccGFnZW5vXGhza2lwXGJpbmRpbmdvZmZzZXRcZmkKLSAgICAgICAgICBcdmJveFxiZ3JvdXAKLSAgICAgIFxmaQotICAgICAgJQotICAgICAgXHVudmJveFxoZWFkbGluZWJveAotICAgICAgXHBhZ2Vib2R5eyMxfSUKLSAgICAgIFxpZmRpbVxodFxmb290bGluZWJveCA+IDBwdAotICAgICAgICAlIE9ubHkgbGVhdmUgdGhpcyBzcGFjZSBpZiB0aGUgZm9vdGxpbmUgaXMgbm9uZW1wdHkuCi0gICAgICAgICUgKFdlIGxlc3NlbmVkIFx2c2l6ZSBmb3IgaXQgaW4gXG9kZGZvb3Rpbmd4eHguKQotICAgICAgICAlIFRoZSBcYmFzZWxpbmVza2lwPTI0cHQgaW4gcGxhaW4ncyBcbWFrZWZvb3RsaW5lIGhhcyBubyBlZmZlY3QuCi0gICAgICAgIFx2c2tpcCAyXGJhc2VsaW5lc2tpcAotICAgICAgICBcdW52Ym94XGZvb3RsaW5lYm94Ci0gICAgICBcZmkKLSAgICAgICUKLSAgICAgIFxpZmNyb3BtYXJrcwotICAgICAgICAgIFxlZ3JvdXAgJSBlbmQgb2YgXHZib3hcYmdyb3VwCi0gICAgICAgIFxoZmlsXGVncm91cCAlIGVuZCBvZiAoY2VudGVyaW5nKSBcbGluZVxiZ3JvdXAKLSAgICAgICAgXHZza2lwXHRvcGFuZGJvdHRvbW1hcmdpbiBwbHVzMWZpbGwgbWludXMxZmlsbAotICAgICAgICBcYm94bWF4ZGVwdGggPSBcY29ybmVydGhpY2sKLSAgICAgICAgXGxpbmV7JQotICAgICAgICAgIFx2Ym94e1xtb3ZlbGVmdFxjb3JuZXJ0aGlja1xuc2JvdH0lCi0gICAgICAgICAgXGhmaWxsCi0gICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc2JvdH0lCi0gICAgICAgIH0lCi0gICAgICAgIFxub2ludGVybGluZXNraXAKLSAgICAgICAgXGxpbmV7XGV3Ym90XGhmaWxcZXdib3R9JQotICAgICAgXGVncm91cCAlIFx2Ym94IGZyb20gZmlyc3QgY3JvcG1hcmtzIGNsYXVzZQotICAgICAgXGZpCi0gICAgfSUgZW5kIG9mIFxzaGlwb3V0XHZib3gKLSAgfSUgZW5kIG9mIGdyb3VwIHdpdGggXHR1cm5vZmZhY3RpdmUKLSAgXGFkdmFuY2VwYWdlbm8KLSAgXGlmbnVtXG91dHB1dHBlbmFsdHk+LTIwMDAwIFxlbHNlXGRvc3VwZXJlamVjdFxmaQotfQotCi1cbmV3aW5zZXJ0XG1hcmdpbiBcZGltZW5cbWFyZ2luPVxtYXhkaW1lbgotCi1cZGVmXHBhZ2Vib2R5IzF7XHZib3ggdG9ccGFnZWhlaWdodHtcYm94bWF4ZGVwdGg9XG1heGRlcHRoICMxfX0KLXtcY2F0Y29kZWBcQCA9MTEKLVxnZGVmXHBhZ2Vjb250ZW50cyMxe1xpZnZvaWRcdG9waW5zXGVsc2VcdW52Ym94XHRvcGluc1xmaQotJSBtYXJnaW5hbCBoYWNrcywganVoYUB2aWlzYS51dWNwIChKdWhhIFRha2FsYSkKLVxpZnZvaWRcbWFyZ2luXGVsc2UgJSBtYXJnaW5hbCBpbmZvIGlzIHByZXNlbnQKLSAgXHJsYXB7XGtlcm5caHNpemVcdmJveCB0b1x6QHtca2VybjFwdFxib3hcbWFyZ2luIFx2c3N9fVxmaQotXGRpbWVuQD1cZHAjMSBcdW52Ym94IzEKLVxpZnZvaWRcZm9vdGluc1xlbHNlXHZza2lwXHNraXBcZm9vdGluc1xmb290bm90ZXJ1bGUgXHVudmJveFxmb290aW5zXGZpCi1caWZyQGdnZWRib3R0b20gXGtlcm4tXGRpbWVuQCBcdmZpbCBcZml9Ci19Ci0KLSUgSGVyZSBhcmUgdGhlIHJ1bGVzIGZvciB0aGUgY3JvcG1hcmtzLiAgTm90ZSB0aGF0IHRoZXkgYXJlCi0lIG9mZnNldCBzbyB0aGF0IHRoZSBzcGFjZSBiZXR3ZWVuIHRoZW0gaXMgdHJ1bHkgXG91dGVyaHNpemUgb3IgXG91dGVydnNpemUKLSUgKFAuIEEuIE1hY0theSwgMTIgTm92ZW1iZXIsIDE5ODYpCi0lCi1cZGVmXGV3dG9we1x2cnVsZSBoZWlnaHRcY29ybmVydGhpY2sgZGVwdGgwcHQgd2lkdGhcY29ybmVybG9uZ30KLVxkZWZcbnN0b3B7XHZib3gKLSAge1xocnVsZSBoZWlnaHRcY29ybmVydGhpY2sgZGVwdGhcY29ybmVybG9uZyB3aWR0aFxjb3JuZXJ0aGlja319Ci1cZGVmXGV3Ym90e1x2cnVsZSBoZWlnaHQwcHQgZGVwdGhcY29ybmVydGhpY2sgd2lkdGhcY29ybmVybG9uZ30KLVxkZWZcbnNib3R7XHZib3gKLSAge1xocnVsZSBoZWlnaHRcY29ybmVybG9uZyBkZXB0aFxjb3JuZXJ0aGljayB3aWR0aFxjb3JuZXJ0aGlja319Ci0KLSUgUGFyc2UgYW4gYXJndW1lbnQsIHRoZW4gcGFzcyBpdCB0byAjMS4gIFRoZSBhcmd1bWVudCBpcyB0aGUgcmVzdCBvZgotJSB0aGUgaW5wdXQgbGluZSAoZXhjZXB0IHdlIHJlbW92ZSBhIHRyYWlsaW5nIGNvbW1lbnQpLiAgIzEgc2hvdWxkIGJlIGEKLSUgbWFjcm8gd2hpY2ggZXhwZWN0cyBhbiBvcmRpbmFyeSB1bmRlbGltaXRlZCBUZVggYXJndW1lbnQuCi0lCi1cZGVmXHBhcnNlYXJnIzF7JQotICBcbGV0XG5leHQgPSAjMSUKLSAgXGJlZ2luZ3JvdXAKLSAgICBcb2JleWxpbmVzCi0gICAgXGZ1dHVyZWxldFx0ZW1wXHBhcnNlYXJneAotfQotCi0lIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIG9iZXllZCBzcGFjZSAoZnJvbSBhbiBAZXhhbXBsZSBlbnZpcm9ubWVudCBvcgotJSB0aGUgbGlrZSksIHJlbW92ZSBpdCBhbmQgcmVjdXJzZS4gIE90aGVyd2lzZSwgd2UncmUgZG9uZS4KLVxkZWZccGFyc2Vhcmd4eyUKLSAgJSBcb2JleWVkc3BhY2UgaXMgZGVmaW5lZCBmYXIgYmVsb3csIGFmdGVyIHRoZSBkZWZpbml0aW9uIG9mIFxzZXBzcGFjZXMuCi0gIFxpZnhcb2JleWVkc3BhY2VcdGVtcAotICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZ2Rpc2NhcmRzcGFjZQotICBcZWxzZQotICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZ2xpbmUKLSAgXGZpCi19Ci0KLSUgUmVtb3ZlIGEgc2luZ2xlIHNwYWNlIChhcyB0aGUgZGVsaW1pdGVyIHRva2VuIHRvIHRoZSBtYWNybyBjYWxsKS4KLXtcb2JleXNwYWNlcyAlCi0gXGdkZWZccGFyc2VhcmdkaXNjYXJkc3BhY2Uge1xmdXR1cmVsZXRcdGVtcFxwYXJzZWFyZ3h9fQotCi17XG9iZXlsaW5lcyAlCi0gIFxnZGVmXHBhcnNlYXJnbGluZSMxXl5NeyUKLSAgICBcZW5kZ3JvdXAgJSBFbmQgb2YgdGhlIGdyb3VwIHN0YXJ0ZWQgaW4gXHBhcnNlYXJnLgotICAgICUKLSAgICAlIEZpcnN0IHJlbW92ZSBhbnkgQGMgY29tbWVudCwgdGhlbiBhbnkgQGNvbW1lbnQuCi0gICAgJSBSZXN1bHQgb2YgZWFjaCBtYWNybyBpcyBwdXQgaW4gXHRva3MwLgotICAgIFxhcmdyZW1vdmVjICMxXGNccmVsYXggJQotICAgIFxleHBhbmRhZnRlclxhcmdyZW1vdmVjb21tZW50IFx0aGVcdG9rczAgXGNvbW1lbnRccmVsYXggJQotICAgICUKLSAgICAlIENhbGwgdGhlIGNhbGxlcidzIG1hY3JvLCBzYXZlZCBhcyBcbmV4dCBpbiBccGFyc2VhcmcuCi0gICAgXGV4cGFuZGFmdGVyXG5leHRcZXhwYW5kYWZ0ZXJ7XHRoZVx0b2tzMH0lCi0gIH0lCi19Ci0KLSUgU2luY2UgYWxsIFxjeyxvbW1lbnR9IGRvZXMgaXMgdGhyb3cgYXdheSB0aGUgYXJndW1lbnQsIHdlIGNhbiBsZXQgVGVYCi0lIGRvIHRoYXQgZm9yIHVzLiAgVGhlIFxyZWxheCBoZXJlIGlzIG1hdGNoZWQgYnkgdGhlIFxyZWxheCBpbiB0aGUgY2FsbAotJSBpbiBccGFyc2VhcmdsaW5lOyBpdCBjb3VsZCBiZSBtb3JlIG9yIGxlc3MgYW55dGhpbmcsIGl0cyBwdXJwb3NlIGlzCi0lIGp1c3QgdG8gZGVsaW1pdCB0aGUgYXJndW1lbnQgdG8gdGhlIFxjLgotXGRlZlxhcmdyZW1vdmVjIzFcYyMyXHJlbGF4e1x0b2tzMCA9IHsjMX19Ci1cZGVmXGFyZ3JlbW92ZWNvbW1lbnQjMVxjb21tZW50IzJccmVsYXh7XHRva3MwID0geyMxfX0KLQotJSBcYXJncmVtb3ZlY3ssb21tZW50fSBtaWdodCBsZWF2ZSB1cyB3aXRoIHRyYWlsaW5nIHNwYWNlcywgdGhvdWdoOyBlLmcuLAotJSAgICBAZW5kIGl0ZW1pemUgIEBjIGZvbwotJSB3aWxsIGhhdmUgdHdvIGFjdGl2ZSBzcGFjZXMgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQgd2l0aCB0aGUKLSUgYGl0ZW1pemUnLiAgSGVyZSB3ZSByZW1vdmUgYWxsIGFjdGl2ZSBzcGFjZXMgZnJvbSAjMSwgYW5kIGFzc2lnbiB0aGUKLSUgcmVzdWx0IHRvIFx0b2tzMC4KLSUKLSUgVGhpcyBsb3NlcyBpZiB0aGVyZSBhcmUgYW55ICpvdGhlciogYWN0aXZlIGNoYXJhY3RlcnMgYmVzaWRlcyBzcGFjZXMKLSUgaW4gdGhlIGFyZ3VtZW50IC0tIF8gXiArLCBmb3IgZXhhbXBsZSAtLSBzaW5jZSB0aGV5IGdldCBleHBhbmRlZC4KLSUgRm9ydHVuYXRlbHksIFRleGluZm8gZG9lcyBub3QgZGVmaW5lIGFueSBzdWNoIGNvbW1hbmRzLiAgKElmIGl0IGV2ZXIKLSUgZG9lcywgdGhlIGNhdGNvZGUgb2YgdGhlIGNoYXJhY3RlcnMgaW4gcXVlc3Rpb253aWxsIGhhdmUgdG8gYmUgY2hhbmdlZAotJSBoZXJlLikgIEJ1dCB0aGlzIG1lYW5zIHdlIGNhbm5vdCBjYWxsIFxyZW1vdmVhY3RpdmVzcGFjZXMgYXMgcGFydCBvZgotJSBcYXJncmVtb3ZlY3ssb21tZW50fSwgc2luY2UgQGMgdXNlcyBccGFyc2VhcmcsIGFuZCB0aHVzIHRoZSBhcmd1bWVudAotJSB0aGF0IFxwYXJzZWFyZyBnZXRzIG1pZ2h0IHdlbGwgaGF2ZSBhbnkgY2hhcmFjdGVyIGF0IGFsbCBpbiBpdC4KLSUKLVxkZWZccmVtb3ZlYWN0aXZlc3BhY2VzIzF7JQotICBcYmVnaW5ncm91cAotICAgIFxpZ25vcmVhY3RpdmVzcGFjZXMKLSAgICBcZWRlZlx0ZW1weyMxfSUKLSAgICBcZ2xvYmFsXHRva3MwID0gXGV4cGFuZGFmdGVye1x0ZW1wfSUKLSAgXGVuZGdyb3VwCi19Ci0KLSUgQ2hhbmdlIHRoZSBhY3RpdmUgc3BhY2UgdG8gZXhwYW5kIHRvIG5vdGhpbmcuCi0lCi1cYmVnaW5ncm91cAotICBcb2JleXNwYWNlcwotICBcZ2RlZlxpZ25vcmVhY3RpdmVzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cZW1wdHl9Ci1cZW5kZ3JvdXAKLQotCi1cZGVmXGZsdXNoY3J7XGlmeFxwYXJcbGlzcHBhciBcZGVmXG5leHQjIzF7fVxlbHNlIFxsZXRcbmV4dD1ccmVsYXggXGZpIFxuZXh0fQotCi0lJSBUaGVzZSBhcmUgdXNlZCB0byBrZWVwIEBiZWdpbi9AZW5kIGxldmVscyBmcm9tIHJ1bm5pbmcgYXdheQotJSUgQ2FsbCBcaW5FTlYgd2l0aGluIGVudmlyb25tZW50cyAoYWZ0ZXIgYSBcYmVnaW5ncm91cCkKLVxuZXdpZlxpZkVOViBcRU5WZmFsc2UgXGRlZlxpbkVOVntcaWZFTlZccmVsYXhcZWxzZVxFTlZ0cnVlXGZpfQotXGRlZlxFTlZjaGVja3slCi1caWZFTlZcZXJybWVzc2FnZXtTdGlsbCB3aXRoaW4gYW4gZW52aXJvbm1lbnQ7IHByZXNzIFJFVFVSTiB0byBjb250aW51ZX0KLVxlbmRncm91cFxmaX0gJSBUaGlzIGlzIG5vdCBwZXJmZWN0LCBidXQgaXQgc2hvdWxkIHJlZHVjZSBsb3NzYWdlCi0KLSUgQGJlZ2luIGZvbyAgaXMgdGhlIHNhbWUgYXMgQGZvbywgZm9yIG5vdy4KLVxuZXdoZWxwXEVNc2ltcGxle1ByZXNzIFJFVFVSTiB0byBjb250aW51ZS59Ci0KLVxvdXRlclxkZWZcYmVnaW57XHBhcnNlYXJnXGJlZ2lueHh4fQotCi1cZGVmXGJlZ2lueHh4ICMxeyUKLVxleHBhbmRhZnRlclxpZnhcY3NuYW1lICMxXGVuZGNzbmFtZVxyZWxheAote1xlcnJoZWxwPVxFTXNpbXBsZSBcZXJybWVzc2FnZXtVbmRlZmluZWQgY29tbWFuZCBAYmVnaW4gIzF9fVxlbHNlCi1cY3NuYW1lICMxXGVuZGNzbmFtZVxmaX0KLQotJSBAZW5kIGZvbyBleGVjdXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBcRWZvby4KLSUKLVxkZWZcZW5ke1xwYXJzZWFyZ1xlbmR4eHh9Ci1cZGVmXGVuZHh4eCAjMXslCi0gIFxyZW1vdmVhY3RpdmVzcGFjZXN7IzF9JQotICBcZWRlZlxlbmR0aGluZ3tcdGhlXHRva3MwfSUKLSAgJQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBFXGVuZHRoaW5nXGVuZGNzbmFtZVxyZWxheAotICAgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFxlbmR0aGluZ1xlbmRjc25hbWVccmVsYXgKLSAgICAgICUgVGhlcmUncyBubyBcZm9vLCBpLmUuLCBubyBgYGVudmlyb25tZW50JycgZm9vLgotICAgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKLSAgICAgIFxlcnJtZXNzYWdle1VuZGVmaW5lZCBjb21tYW5kIGBAZW5kIFxlbmR0aGluZyd9JQotICAgIFxlbHNlCi0gICAgICBcdW5tYXRjaGVkZW5kZXJyb3JcZW5kdGhpbmcKLSAgICBcZmkKLSAgXGVsc2UKLSAgICAlIEV2ZXJ5dGhpbmcncyBvazsgdGhlIHJpZ2h0IGVudmlyb25tZW50IGhhcyBiZWVuIHN0YXJ0ZWQuCi0gICAgXGNzbmFtZSBFXGVuZHRoaW5nXGVuZGNzbmFtZQotICBcZmkKLX0KLQotJSBUaGVyZSBpcyBhbiBlbnZpcm9ubWVudCAjMSwgYnV0IGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQuICBHaXZlIGFuIGVycm9yLgotJQotXGRlZlx1bm1hdGNoZWRlbmRlcnJvciMxeyUKLSAgXGVycmhlbHAgPSBcRU1zaW1wbGUKLSAgXGVycm1lc3NhZ2V7VGhpcyBgQGVuZCAjMScgZG9lc24ndCBoYXZlIGEgbWF0Y2hpbmcgYEAjMSd9JQotfQotCi0lIERlZmluZSB0aGUgY29udHJvbCBzZXF1ZW5jZSBcRSMxIHRvIGdpdmUgYW4gdW5tYXRjaGVkIEBlbmQgZXJyb3IuCi0lCi1cZGVmXGRlZmluZXVubWF0Y2hlZGVuZCMxeyUKLSAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgRSMxXGVuZGNzbmFtZXtcdW5tYXRjaGVkZW5kZXJyb3J7IzF9fSUKLX0KLQotCi0lIFNpbmdsZS1zcGFjaW5nIGlzIGRvbmUgYnkgdmFyaW91cyBlbnZpcm9ubWVudHMgKHNwZWNpZmljYWxseSwgaW4KLSUgXG5vbmZpbGxzdGFydCBhbmQgXHF1b3RhdGlvbnMpLgotXG5ld3NraXBcc2luZ2xlc3BhY2Vza2lwIFxzaW5nbGVzcGFjZXNraXAgPSAxMi41cHQKLVxkZWZcc2luZ2xlc3BhY2V7JQotICAlIFdoeSB3YXMgdGhpcyBrZXJuIGhlcmU/ICBJdCBtZXNzZXMgdXAgZXF1YWxpemluZyBzcGFjZSBhYm92ZSBhbmQgYmVsb3cKLSAgJSBlbnZpcm9ubWVudHMuICAtLWthcmwsIDZtYXk5MwotICAle1xhZHZhbmNlIFxiYXNlbGluZXNraXAgYnkgLVxzaW5nbGVzcGFjZXNraXAKLSAgJVxrZXJuIFxiYXNlbGluZXNraXB9JQotICBcc2V0bGVhZGluZyBcc2luZ2xlc3BhY2Vza2lwCi19Ci0KLSUlIFNpbXBsZSBzaW5nbGUtY2hhcmFjdGVyIEAgY29tbWFuZHMKLQotJSBAQCBwcmludHMgYW4gQAotJSBLbHVkZ2UgdGhpcyB1bnRpbCB0aGUgZm9udHMgYXJlIHJpZ2h0IChncnIpLgotXGRlZlxAe3tcdHRcY2hhcjY0fX0KLQotJSBUaGlzIGlzIHR1cm5lZCBvZmYgYmVjYXVzZSBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZAotJSBhbmQgeW91IGNhbiB1c2UgQHd7Li4ufSBhcm91bmQgYSBxdW90ZSB0byBzdXBwcmVzcyBsaWdhdHVyZXMuCi0lJSBEZWZpbmUgQGAgYW5kIEAnIHRvIGJlIHRoZSBzYW1lIGFzIGAgYW5kICcKLSUlIGJ1dCBzdXBwcmVzc2luZyBsaWdhdHVyZXMuCi0lXGRlZlxge3tgfX0KLSVcZGVmXCd7eyd9fQotCi0lIFVzZWQgdG8gZ2VuZXJhdGUgcXVvdGVkIGJyYWNlcy4KLVxkZWZcbXlsYnJhY2Uge3tcdHRcY2hhcjEyM319Ci1cZGVmXG15cmJyYWNlIHt7XHR0XGNoYXIxMjV9fQotXGxldFx7PVxteWxicmFjZQotXGxldFx9PVxteXJicmFjZQotXGJlZ2luZ3JvdXAKLSAgJSBEZWZpbml0aW9ucyB0byBwcm9kdWNlIGFjdHVhbCBceyAmIFx9IGNvbW1hbmQgaW4gYW4gaW5kZXguCi0gIFxjYXRjb2RlYFx7ID0gMTIgXGNhdGNvZGVgXH0gPSAxMgotICBcY2F0Y29kZWBcWyA9IDEgXGNhdGNvZGVgXF0gPSAyCi0gIFxjYXRjb2RlYFxAID0gMCBcY2F0Y29kZWBcXCA9IDEyCi0gIEBnZGVmQGxicmFjZWNtZFtce10lCi0gIEBnZGVmQHJicmFjZWNtZFtcfV0lCi1AZW5kZ3JvdXAKLQotJSBBY2NlbnRzOiBALCBAZG90YWNjZW50IEByaW5nYWNjZW50IEB1YmFyYWNjZW50IEB1ZG90YWNjZW50Ci0lIE90aGVycyBhcmUgZGVmaW5lZCBieSBwbGFpbiBUZVg6IEBgIEAnIEAiIEBeIEB+IEA9IEB2IEBILgotXGxldFwsID0gXGMKLVxsZXRcZG90YWNjZW50ID0gXC4KLVxkZWZccmluZ2FjY2VudCMxe3tcYWNjZW50MjMgIzF9fQotXGxldFx0aWVhY2NlbnQgPSBcdAotXGxldFx1YmFyYWNjZW50ID0gXGIKLVxsZXRcdWRvdGFjY2VudCA9IFxkCi0KLSUgT3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzOiBAcXVlc3Rpb25kb3duIEBleGNsYW1kb3duCi0lIFBsYWluIFRlWCBkZWZpbmVzOiBAQUEgQEFFIEBPIEBPRSBATCAoYW5kIGxvd2VyY2FzZSB2ZXJzaW9ucykgQHNzLgotXGRlZlxxdWVzdGlvbmRvd257P2B9Ci1cZGVmXGV4Y2xhbWRvd257IWB9Ci0KLSUgRG90bGVzcyBpIGFuZCBkb3RsZXNzIGosIHVzZWQgZm9yIGFjY2VudHMuCi1cZGVmXGltYWNyb3tpfQotXGRlZlxqbWFjcm97an0KLVxkZWZcZG90bGVzcyMxeyUKLSAgXGRlZlx0ZW1weyMxfSUKLSAgXGlmeFx0ZW1wXGltYWNybyBccHRleGkKLSAgXGVsc2VcaWZ4XHRlbXBcam1hY3JvIFxqCi0gIFxlbHNlIFxlcnJtZXNzYWdle0Bkb3RsZXNzIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBpIG9yIGp9JQotICBcZmlcZmkKLX0KLQotJSBCZSBzdXJlIHdlJ3JlIGluIGhvcml6b250YWwgbW9kZSB3aGVuIGRvaW5nIGEgdGllLCBzaW5jZSB3ZSBtYWtlIHNwYWNlCi0lIGVxdWl2YWxlbnQgdG8gdGhpcyBpbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50cy4gT3RoZXJ3aXNlLCBhIHNwYWNlCi0lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpbGwgc3RhcnQgd2l0aCBccGVuYWx0eSAtLSBhbmQKLSUgc2luY2UgXHBlbmFsdHkgaXMgdmFsaWQgaW4gdmVydGljYWwgbW9kZSwgd2UnZCBlbmQgdXAgcHV0dGluZyB0aGUKLSUgcGVuYWx0eSBvbiB0aGUgdmVydGljYWwgbGlzdCBpbnN0ZWFkIG9mIGluIHRoZSBuZXcgcGFyYWdyYXBoLgote1xjYXRjb2RlYEAgPSAxMQotICUgQXZvaWQgdXNpbmcgXEBNIGRpcmVjdGx5LCBiZWNhdXNlIHRoYXQgY2F1c2VzIHRyb3VibGUKLSAlIGlmIHRoZSBkZWZpbml0aW9uIGlzIHdyaXR0ZW4gaW50byBhbiBpbmRleCBmaWxlLgotIFxnbG9iYWxcbGV0XHRpZXBlbmFsdHkgPSBcQE0KLSBcZ2RlZlx0aWV7XGxlYXZldm1vZGVccGVuYWx0eVx0aWVwZW5hbHR5XCB9Ci19Ci0KLSUgQDogZm9yY2VzIG5vcm1hbCBzaXplIHdoaXRlc3BhY2UgZm9sbG93aW5nLgotXGRlZlw6e1xzcGFjZWZhY3Rvcj0xMDAwIH0KLQotJSBAKiBmb3JjZXMgYSBsaW5lIGJyZWFrLgotXGRlZlwqe1xoZmlsXGJyZWFrXGhib3h7fVxpZ25vcmVzcGFjZXN9Ci0KLSUgQC4gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHBlcmlvZC4KLVxkZWZcLnsuXHNwYWNlZmFjdG9yPTMwMDAgfQotCi0lIEAhIGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBiYW5nLgotXGRlZlwheyFcc3BhY2VmYWN0b3I9MzAwMCB9Ci0KLSUgQD8gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHF1ZXJ5LgotXGRlZlw/ez9cc3BhY2VmYWN0b3I9MzAwMCB9Ci0KLSUgQHcgcHJldmVudHMgYSB3b3JkIGJyZWFrLiAgV2l0aG91dCB0aGUgXGxlYXZldm1vZGUsIEB3IGF0IHRoZQotJSBiZWdpbm5pbmcgb2YgYSBwYXJhZ3JhcGgsIHdoZW4gVGVYIGlzIHN0aWxsIGluIHZlcnRpY2FsIG1vZGUsIHdvdWxkCi0lIHByb2R1Y2UgYSB3aG9sZSBsaW5lIG9mIG91dHB1dCBpbnN0ZWFkIG9mIHN0YXJ0aW5nIHRoZSBwYXJhZ3JhcGguCi1cZGVmXHcjMXtcbGVhdmV2bW9kZVxoYm94eyMxfX0KLQotJSBAZ3JvdXAgLi4uIEBlbmQgZ3JvdXAgZm9yY2VzIC4uLiB0byBiZSBhbGwgb24gb25lIHBhZ2UsIGJ5IGVuY2xvc2luZwotJSBpdCBpbiBhIFRlWCB2Ym94LiAgV2UgdXNlIFx2dG9wIGluc3RlYWQgb2YgXHZib3ggdG8gY29uc3RydWN0IHRoZSBib3gKLSUgdG8ga2VlcCBpdHMgaGVpZ2h0IHRoYXQgb2YgYSBub3JtYWwgbGluZS4gIEFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yCi0lIFx0b3Bza2lwIChwLjExNCBvZiB0aGUgVGVYYm9vayksIHRoZSBnbHVlIGluc2VydGVkIGlzCi0lIG1heCAoXHRvcHNraXAgLSBcaHQgKGZpcnN0IGl0ZW0pLCAwKS4gIElmIHRoYXQgaGVpZ2h0IGlzIGxhcmdlLAotJSB0aGVyZWZvcmUsIG5vIGdsdWUgaXMgaW5zZXJ0ZWQsIGFuZCB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgaGVhZGxpbmUgYW5kCi0lIHRoZSB0ZXh0IGlzIHNtYWxsLCB3aGljaCBsb29rcyBiYWQuCi0lCi1cZGVmXGdyb3Vwe1xiZWdpbmdyb3VwCi0gIFxpZm51bVxjYXRjb2RlMTM9XGFjdGl2ZSBcZWxzZQotICAgIFxlcnJoZWxwID0gXGdyb3VwaW52YWxpZGhlbHAKLSAgICBcZXJybWVzc2FnZXtAZ3JvdXAgaW52YWxpZCBpbiBjb250ZXh0IHdoZXJlIGZpbGxpbmcgaXMgZW5hYmxlZH0lCi0gIFxmaQotICAlCi0gICUgVGhlIFx2dG9wIHdlIHN0YXJ0IGJlbG93IHByb2R1Y2VzIGEgYm94IHdpdGggbm9ybWFsIGhlaWdodCBhbmQgbGFyZ2UKLSAgJSBkZXB0aDsgdGh1cywgVGVYIHB1dHMgXGJhc2VsaW5lc2tpcCBnbHVlIGJlZm9yZSBpdCwgYW5kICh3aGVuIHRoZQotICAlIG5leHQgbGluZSBvZiB0ZXh0IGlzIGRvbmUpIFxsaW5lc2tpcCBnbHVlIGFmdGVyIGl0LiAgKFNlZSBwLjgyIG9mCi0gICUgdGhlIFRlWGJvb2suKSAgVGh1cywgc3BhY2UgYmVsb3cgaXMgbm90IHF1aXRlIGVxdWFsIHRvIHNwYWNlCi0gICUgYWJvdmUuICBCdXQgaXQncyBwcmV0dHkgY2xvc2UuCi0gIFxkZWZcRWdyb3VweyUKLSAgICBcZWdyb3VwICAgICAgICAgICAlIEVuZCB0aGUgXHZ0b3AuCi0gICAgXGVuZGdyb3VwICAgICAgICAgJSBFbmQgdGhlIFxncm91cC4KLSAgfSUKLSAgJQotICBcdnRvcFxiZ3JvdXAKLSAgICAlIFdlIGhhdmUgdG8gcHV0IGEgc3RydXQgb24gdGhlIGxhc3QgbGluZSBpbiBjYXNlIHRoZSBAZ3JvdXAgaXMgaW4KLSAgICAlIHRoZSBtaWRzdCBvZiBhbiBleGFtcGxlLCByYXRoZXIgdGhhbiBjb21wbGV0ZWx5IGVuY2xvc2luZyBpdC4KLSAgICAlIE90aGVyd2lzZSwgdGhlIGludGVybGluZSBzcGFjZSBiZXR3ZWVuIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGdyb3VwCi0gICAgJSBhbmQgdGhlIGZpcnN0IGxpbmUgYWZ0ZXJ3YXJkcyBpcyB0b28gc21hbGwuICBCdXQgd2UgY2FuJ3QgcHV0IHRoZQotICAgICUgc3RydXQgaW4gXEVncm91cCwgc2luY2UgdGhlcmUgaXQgd291bGQgYmUgb24gYSBsaW5lIGJ5IGl0c2VsZi4KLSAgICAlIEhlbmNlIHRoaXMganVzdCBpbnNlcnRzIGEgc3RydXQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUuCi0gICAgXGV2ZXJ5cGFyID0ge1xzdHJ1dH0lCi0gICAgJQotICAgICUgU2luY2Ugd2UgaGF2ZSBhIHN0cnV0IG9uIGV2ZXJ5IGxpbmUsIHdlIGRvbid0IG5lZWQgYW55IG9mIFRlWCdzCi0gICAgJSBub3JtYWwgaW50ZXJsaW5lIHNwYWNpbmcuCi0gICAgXG9mZmludGVybGluZXNraXAKLSAgICAlCi0gICAgJSBPSywgYnV0IG5vdyB3ZSBoYXZlIHRvIGRvIHNvbWV0aGluZyBhYm91dCBibGFuawotICAgICUgbGluZXMgaW4gdGhlIGlucHV0IGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzLCB3aGljaCBub3JtYWxseQotICAgICUganVzdCB0dXJuIGludG8gXGxpc3BwYXIsIHdoaWNoIHdpbGwgaW5zZXJ0IG5vIHNwYWNlIG5vdyB0aGF0IHdlJ3ZlCi0gICAgJSB0dXJuZWQgb2ZmIHRoZSBpbnRlcmxpbmUgc3BhY2UuICBTaW1wbGVzdCBpcyB0byBtYWtlIHRoZW0gYmUgYW4KLSAgICAlIGVtcHR5IHBhcmFncmFwaC4KLSAgICBcaWZ4XHBhclxsaXNwcGFyCi0gICAgICBcZWRlZlxwYXJ7XGxlYXZldm1vZGUgXHBhcn0lCi0gICAgICAlCi0gICAgICAlIFJlc2V0IF5eTSdzIGRlZmluaXRpb24gdG8gbmV3IGRlZmluaXRpb24gb2YgXHBhci4KLSAgICAgIFxvYmV5bGluZXMKLSAgICBcZmkKLSAgICAlCi0gICAgJSBEbyBAY29tbWVudCBzaW5jZSB3ZSBhcmUgY2FsbGVkIGluc2lkZSBhbiBlbnZpcm9ubWVudCBzdWNoIGFzCi0gICAgJSBAZXhhbXBsZSwgd2hlcmUgZWFjaCBlbmQtb2YtbGluZSBpbiB0aGUgaW5wdXQgY2F1c2VzIGFuCi0gICAgJSBlbmQtb2YtbGluZSBpbiB0aGUgb3V0cHV0LiAgV2UgZG9uJ3Qgd2FudCB0aGUgZW5kLW9mLWxpbmUgYWZ0ZXIKLSAgICAlIHRoZSBgQGdyb3VwJyB0byBwdXQgZXh0cmEgc3BhY2UgaW4gdGhlIG91dHB1dC4gIFNpbmNlIEBncm91cAotICAgICUgc2hvdWxkIGFwcGVhciBvbiBhIGxpbmUgYnkgaXRzZWxmIChhY2NvcmRpbmcgdG8gdGhlIFRleGluZm8KLSAgICAlIG1hbnVhbCksIHdlIGRvbid0IHdvcnJ5IGFib3V0IGVhdGluZyBhbnkgdXNlciB0ZXh0LgotICAgIFxjb21tZW50Ci19Ci0lCi0lIFRlWCBwdXRzIGluIGFuIFxlc2NhcGVjaGFyIChpLmUuLCBgQCcpIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlbHAKLSUgbWVzc2FnZSwgc28gdGhpcyBlbmRzIHVwIHByaW50aW5nIGBAZ3JvdXAgY2FuIG9ubHkgLi4uJy4KLSUKLVxuZXdoZWxwXGdyb3VwaW52YWxpZGhlbHB7JQotZ3JvdXAgY2FuIG9ubHkgYmUgdXNlZCBpbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZXhhbXBsZSxeXkolCi13aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQgcHJvZHVjZXMgYSBsaW5lIG9mIG91dHB1dC59Ci0KLSUgQG5lZWQgc3BhY2UtaW4tbWlscwotJSBmb3JjZXMgYSBwYWdlIGJyZWFrIGlmIHRoZXJlIGlzIG5vdCBzcGFjZS1pbi1taWxzIHJlbWFpbmluZy4KLQotXG5ld2RpbWVuXG1pbCAgXG1pbD0wLjAwMWluCi0KLVxkZWZcbmVlZHtccGFyc2VhcmdcbmVlZHh9Ci0KLSUgT2xkIGRlZmluaXRpb24tLWRpZG4ndCB3b3JrLgotJVxkZWZcbmVlZHggIzF7XHBhciAlCi0lJSBUaGlzIG1ldGhvZCB0cmllcyB0byBtYWtlIFRlWCBicmVhayB0aGUgcGFnZSBuYXR1cmFsbHkKLSUlIGlmIHRoZSBkZXB0aCBvZiB0aGUgYm94IGRvZXMgbm90IGZpdC4KLSV7XGJhc2VsaW5lc2tpcD0wcHQlCi0lXHZ0b3AgdG8gIzFcbWlse1x2ZmlsfVxrZXJuIC0jMVxtaWxcbm9icmVhawotJVxwcmV2ZGVwdGg9LTEwMDBwdAotJX19Ci0KLVxkZWZcbmVlZHgjMXslCi0gICUgR28gaW50byB2ZXJ0aWNhbCBtb2RlLCBzbyB3ZSBkb24ndCBtYWtlIGEgYmlnIGJveCBpbiB0aGUgbWlkZGxlIG9mIGEKLSAgJSBwYXJhZ3JhcGguCi0gIFxwYXIKLSAgJQotICAlIERvbid0IGFkZCBhbnkgbGVhZGluZyBiZWZvcmUgb3VyIGJpZyBlbXB0eSBib3gsIGJ1dCBhbGxvdyBhIHBhZ2UKLSAgJSBicmVhaywgc2luY2UgdGhlIGJlc3QgYnJlYWsgbWlnaHQgYmUgcmlnaHQgaGVyZS4KLSAgXGFsbG93YnJlYWsKLSAgXG5vaW50ZXJsaW5lc2tpcAotICBcdnRvcCB0byAjMVxtaWx7XHZmaWx9JQotICAlCi0gICUgVGVYIGRvZXMgbm90IGV2ZW4gY29uc2lkZXIgcGFnZSBicmVha3MgaWYgYSBwZW5hbHR5IGFkZGVkIHRvIHRoZQotICAlIG1haW4gdmVydGljYWwgbGlzdCBpcyAxMDAwMCBvciBtb3JlLiAgQnV0IGluIG9yZGVyIHRvIHNlZSBpZiB0aGUKLSAgJSBlbXB0eSBib3ggd2UganVzdCBhZGRlZCBmaXRzIG9uIHRoZSBwYWdlLCB3ZSBtdXN0IG1ha2UgaXQgY29uc2lkZXIKLSAgJSBwYWdlIGJyZWFrcy4gIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBkb24ndCB3YW50IHRvIGFjdHVhbGx5IGJyZWFrIHRoZQotICAlIHBhZ2UgYWZ0ZXIgdGhlIGVtcHR5IGJveC4gIFNvIHdlIHVzZSBhIHBlbmFsdHkgb2YgOTk5OS4KLSAgJQotICAlIFRoZXJlIGlzIGFuIGV4dHJlbWVseSBzbWFsbCBjaGFuY2UgdGhhdCBUZVggd2lsbCBhY3R1YWxseSBicmVhayB0aGUKLSAgJSBwYWdlIGF0IHRoaXMgXHBlbmFsdHksIGlmIHRoZXJlIGFyZSBubyBvdGhlciBmZWFzaWJsZSBicmVha3BvaW50cyBpbgotICAlIHNpZ2h0LiAgKElmIHRoZSB1c2VyIGlzIHVzaW5nIGxvdHMgb2YgYmlnIEBncm91cCBjb21tYW5kcywgd2hpY2gKLSAgJSBhbG1vc3QtYnV0LW5vdC1xdWl0ZSBmaWxsIHVwIGEgcGFnZSwgVGVYIHdpbGwgaGF2ZSBhIGhhcmQgdGltZSBkb2luZwotICAlIGdvb2QgcGFnZSBicmVha2luZywgZm9yIGV4YW1wbGUuKSAgSG93ZXZlciwgSSBjb3VsZCBub3QgY29uc3RydWN0IGFuCi0gICUgZXhhbXBsZSB3aGVyZSBhIHBhZ2UgYnJva2UgYXQgdGhpcyBccGVuYWx0eTsgaWYgaXQgaGFwcGVucyBpbiBhIHJlYWwKLSAgJSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gcmVjb25zaWRlciBvdXIgc3RyYXRlZ3kuCi0gIFxwZW5hbHR5OTk5OQotICAlCi0gICUgQmFjayB1cCBieSB0aGUgc2l6ZSBvZiB0aGUgYm94LCB3aGV0aGVyIHdlIGRpZCBhIHBhZ2UgYnJlYWsgb3Igbm90LgotICBca2VybiAtIzFcbWlsCi0gICUKLSAgJSBEbyBub3QgYWxsb3cgYSBwYWdlIGJyZWFrIHJpZ2h0IGFmdGVyIHRoaXMga2Vybi4KLSAgXG5vYnJlYWsKLX0KLQotJSBAYnIgICBmb3JjZXMgcGFyYWdyYXBoIGJyZWFrCi0KLVxsZXRcYnIgPSBccGFyCi0KLSUgQGRvdHN7fSBvdXRwdXQgYW4gZWxsaXBzaXMgdXNpbmcgdGhlIGN1cnJlbnQgZm9udC4KLSUgV2UgZG8gLjVlbSBwZXIgcGVyaW9kIHNvIHRoYXQgaXQgaGFzIHRoZSBzYW1lIHNwYWNpbmcgaW4gYSB0eXBld3JpdGVyCi0lIGZvbnQgYXMgdGhyZWUgYWN0dWFsIHBlcmlvZCBjaGFyYWN0ZXJzLgotJQotXGRlZlxkb3RzeyUKLSAgXGxlYXZldm1vZGUKLSAgXGhib3ggdG8gMS41ZW17JQotICAgIFxoc2tpcCAwcHQgcGx1cyAwLjI1ZmlsIG1pbnVzIDAuMjVmaWwKLSAgICAuXGhzcy5caHNzLiUKLSAgICBcaHNraXAgMHB0IHBsdXMgMC41ZmlsIG1pbnVzIDAuNWZpbAotICB9JQotfQotCi0lIEBlbmRkb3Rze30gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIGVsbGlwc2lzLgotJSAKLVxkZWZcZW5kZG90c3slCi0gIFxsZWF2ZXZtb2RlCi0gIFxoYm94IHRvIDJlbXslCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuMjVmaWwgbWludXMgMC4yNWZpbAotICAgIC5caHNzLlxoc3MuXGhzcy4lCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuNWZpbCBtaW51cyAwLjVmaWwKLSAgfSUKLSAgXHNwYWNlZmFjdG9yPTMwMDAKLX0KLQotCi0lIEBwYWdlICAgIGZvcmNlcyB0aGUgc3RhcnQgb2YgYSBuZXcgcGFnZQotJQotXGRlZlxwYWdle1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KLQotJSBAZXhkZW50IHRleHQuLi4uCi0lIG91dHB1dHMgdGV4dCBvbiBzZXBhcmF0ZSBsaW5lIGluIHJvbWFuIGZvbnQsIHN0YXJ0aW5nIGF0IHN0YW5kYXJkIHBhZ2UgbWFyZ2luCi0KLSUgVGhpcyByZWNvcmRzIHRoZSBhbW91bnQgb2YgaW5kZW50IGluIHRoZSBpbm5lcm1vc3QgZW52aXJvbm1lbnQuCi0lIFRoYXQncyBob3cgbXVjaCBcZXhkZW50IHNob3VsZCB0YWtlIG91dC4KLVxuZXdza2lwXGV4ZGVudGFtb3VudAotCi0lIFRoaXMgZGVmbiBpcyB1c2VkIGluc2lkZSBmaWxsIGVudmlyb25tZW50cyBzdWNoIGFzIEBkZWZ1bi4KLVxkZWZcZXhkZW50e1xwYXJzZWFyZ1xleGRlbnR5eXl9Ci1cZGVmXGV4ZGVudHl5eSAjMXt7XGhmaWxcYnJlYWtcaGJveHtca2VybiAtXGV4ZGVudGFtb3VudHtccm0jMX19XGhmaWxcYnJlYWt9fQotCi0lIFRoaXMgZGVmbiBpcyB1c2VkIGluc2lkZSBub2ZpbGwgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGV4YW1wbGUuCi1cZGVmXG5vZmlsbGV4ZGVudHtccGFyc2Vhcmdcbm9maWxsZXhkZW50eXl5fQotXGRlZlxub2ZpbGxleGRlbnR5eXkgIzF7e1xhZHZhbmNlIFxsZWZ0c2tpcCBieSAtXGV4ZGVudGFtb3VudAotXGxlZnRsaW5le1xoc2tpcFxsZWZ0c2tpcHtccm0jMX19fX0KLQotJSBAaW5tYXJnaW57VEVYVH0gcHV0cyBURVhUIGluIHRoZSBtYXJnaW4gbmV4dCB0byB0aGUgY3VycmVudCBwYXJhZ3JhcGguCi0KLVxkZWZcaW5tYXJnaW4jMXslCi1cc3RydXRcdmFkanVzdHtcbm9icmVha1xrZXJuLVxzdHJ1dGRlcHRoCi0gIFx2dG9wIHRvIFxzdHJ1dGRlcHRoe1xiYXNlbGluZXNraXBcc3RydXRkZXB0aFx2c3MKLSAgXGxsYXB7XHJpZ2h0c2tpcD1caW5tYXJnaW5zcGFjaW5nIFx2Ym94e1xub2luZGVudCAjMX19XG51bGx9fX0KLVxuZXdza2lwXGlubWFyZ2luc3BhY2luZyBcaW5tYXJnaW5zcGFjaW5nPTFjbQotXGRlZlxzdHJ1dGRlcHRoe1xkcFxzdHJ1dGJveH0KLQotJVxoYm94e3tccm0jMX19XGhmaWxcYnJlYWt9fQotCi0lIEBpbmNsdWRlIGZpbGUgICAgaW5zZXJ0IHRleHQgb2YgdGhhdCBmaWxlIGFzIGlucHV0LgotJSBBbGxvdyBub3JtYWwgY2hhcmFjdGVycyB0aGF0ICB3ZSBtYWtlIGFjdGl2ZSBpbiB0aGUgYXJndW1lbnQgKGEgZmlsZSBuYW1lKS4KLVxkZWZcaW5jbHVkZXtcYmVnaW5ncm91cAotICBcY2F0Y29kZWBcXD0xMgotICBcY2F0Y29kZWB+PTEyCi0gIFxjYXRjb2RlYF49MTIKLSAgXGNhdGNvZGVgXz0xMgotICBcY2F0Y29kZWB8PTEyCi0gIFxjYXRjb2RlYDw9MTIKLSAgXGNhdGNvZGVgPj0xMgotICBcY2F0Y29kZWArPTEyCi0gIFxwYXJzZWFyZ1xpbmNsdWRlenp6fQotJSBSZXN0b3JlIGFjdGl2ZSBjaGFycyBmb3IgaW5jbHVkZWQgZmlsZS4KLVxkZWZcaW5jbHVkZXp6eiMxe1xlbmRncm91cFxiZWdpbmdyb3VwCi0gICUgUmVhZCB0aGUgaW5jbHVkZWQgZmlsZSBpbiBhIGdyb3VwIHNvIG5lc3RlZCBAaW5jbHVkZSdzIHdvcmsuCi0gIFxkZWZcdGhpc2ZpbGV7IzF9JQotICBcaW5wdXRcdGhpc2ZpbGUKLVxlbmRncm91cH0KLQotXGRlZlx0aGlzZmlsZXt9Ci0KLSUgQGNlbnRlciBsaW5lICAgb3V0cHV0cyB0aGF0IGxpbmUsIGNlbnRlcmVkCi0KLVxkZWZcY2VudGVye1xwYXJzZWFyZ1xjZW50ZXJ6enp9Ci1cZGVmXGNlbnRlcnp6eiAjMXt7XGFkdmFuY2VcaHNpemUgYnkgLVxsZWZ0c2tpcAotXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKLVxjZW50ZXJsaW5leyMxfX19Ci0KLSUgQHNwIG4gICBvdXRwdXRzIG4gbGluZXMgb2YgdmVydGljYWwgc3BhY2UKLQotXGRlZlxzcHtccGFyc2Vhcmdcc3B4eHh9Ci1cZGVmXHNweHh4ICMxe1x2c2tpcCAjMVxiYXNlbGluZXNraXB9Ci0KLSUgQGNvbW1lbnQgLi4ubGluZSB3aGljaCBpcyBpZ25vcmVkLi4uCi0lIEBjIGlzIHRoZSBzYW1lIGFzIEBjb21tZW50Ci0lIEBpZ25vcmUgLi4uIEBlbmQgaWdub3JlICBpcyBhbm90aGVyIHdheSB0byB3cml0ZSBhIGNvbW1lbnQKLQotXGRlZlxjb21tZW50e1xiZWdpbmdyb3VwIFxjYXRjb2RlYFxeXk09XG90aGVyJQotXGNhdGNvZGVgXEA9XG90aGVyIFxjYXRjb2RlYFx7PVxvdGhlciBcY2F0Y29kZWBcfT1cb3RoZXIlCi1cY29tbWVudHh4eH0KLXtcY2F0Y29kZWBcXl5NPVxvdGhlciBcZ2RlZlxjb21tZW50eHh4IzFeXk17XGVuZGdyb3VwfX0KLQotXGxldFxjPVxjb21tZW50Ci0KLSUgQHBhcmFncmFwaGluZGVudCAgaXMgZGVmaW5lZCBmb3IgdGhlIEluZm8gZm9ybWF0dGluZyBjb21tYW5kcyBvbmx5LgotXGxldFxwYXJhZ3JhcGhpbmRlbnQ9XGNvbW1lbnQKLQotJSBQcmV2ZW50IGVycm9ycyBmb3Igc2VjdGlvbiBjb21tYW5kcy4KLSUgVXNlZCBpbiBAaWdub3JlIGFuZCBpbiBmYWlsaW5nIGNvbmRpdGlvbmFscy4KLVxkZWZcaWdub3Jlc2VjdGlvbnN7JQotXGxldFxjaGFwdGVyPVxyZWxheAotXGxldFx1bm51bWJlcmVkPVxyZWxheAotXGxldFx0b3A9XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzZWM9XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzZWN0aW9uPVxyZWxheAotXGxldFx1bm51bWJlcmVkc3Vic2VjPVxyZWxheAotXGxldFx1bm51bWJlcmVkc3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHN1YnN1YnNlYz1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHN1YnN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XHNlY3Rpb249XHJlbGF4Ci1cbGV0XHN1YnNlYz1ccmVsYXgKLVxsZXRcc3Vic3Vic2VjPVxyZWxheAotXGxldFxzdWJzZWN0aW9uPVxyZWxheAotXGxldFxzdWJzdWJzZWN0aW9uPVxyZWxheAotXGxldFxhcHBlbmRpeD1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzZWM9XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c2VjdGlvbj1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzdWJzZWM9XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzdWJzdWJzZWM9XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c3Vic3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcY29udGVudHM9XHJlbGF4Ci1cbGV0XHNtYWxsYm9vaz1ccmVsYXgKLVxsZXRcdGl0bGVwYWdlPVxyZWxheAotfQotCi0lIFVzZWQgaW4gbmVzdGVkIGNvbmRpdGlvbmFscywgd2hlcmUgd2UgaGF2ZSB0byBwYXJzZSB0aGUgVGV4aW5mbyBzb3VyY2UKLSUgYW5kIHNvIHdhbnQgdG8gdHVybiBvZmYgbW9zdCBjb21tYW5kcywgaW4gY2FzZSB0aGV5IGFyZSB1c2VkCi0lIGluY29ycmVjdGx5LgotJQotXGRlZlxpZ25vcmVtb3JlY29tbWFuZHN7JQotICBcbGV0XGRlZmNvZGVpbmRleCA9IFxyZWxheAotICBcbGV0XGRlZmN2ID0gXHJlbGF4Ci0gIFxsZXRcZGVmZm4gPSBccmVsYXgKLSAgXGxldFxkZWZmbnggPSBccmVsYXgKLSAgXGxldFxkZWZpbmRleCA9IFxyZWxheAotICBcbGV0XGRlZml2YXIgPSBccmVsYXgKLSAgXGxldFxkZWZtYWMgPSBccmVsYXgKLSAgXGxldFxkZWZtZXRob2QgPSBccmVsYXgKLSAgXGxldFxkZWZvcCA9IFxyZWxheAotICBcbGV0XGRlZm9wdCA9IFxyZWxheAotICBcbGV0XGRlZnNwZWMgPSBccmVsYXgKLSAgXGxldFxkZWZ0cCA9IFxyZWxheAotICBcbGV0XGRlZnR5cGVmbiA9IFxyZWxheAotICBcbGV0XGRlZnR5cGVmdW4gPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBldmFyID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHlwZXZyID0gXHJlbGF4Ci0gIFxsZXRcZGVmdW4gPSBccmVsYXgKLSAgXGxldFxkZWZ2YXIgPSBccmVsYXgKLSAgXGxldFxkZWZ2ciA9IFxyZWxheAotICBcbGV0XHJlZiA9IFxyZWxheAotICBcbGV0XHhyZWYgPSBccmVsYXgKLSAgXGxldFxwcmludGluZGV4ID0gXHJlbGF4Ci0gIFxsZXRccHhyZWYgPSBccmVsYXgKLSAgXGxldFxzZXR0aXRsZSA9IFxyZWxheAotICBcbGV0XHNldGNoYXB0ZXJuZXdwYWdlID0gXHJlbGF4Ci0gIFxsZXRcc2V0Y2hhcHRlcnN0eWxlID0gXHJlbGF4Ci0gIFxsZXRcZXZlcnloZWFkaW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlbmhlYWRpbmcgPSBccmVsYXgKLSAgXGxldFxvZGRoZWFkaW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlcnlmb290aW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlbmZvb3RpbmcgPSBccmVsYXgKLSAgXGxldFxvZGRmb290aW5nID0gXHJlbGF4Ci0gIFxsZXRcaGVhZGluZ3MgPSBccmVsYXgKLSAgXGxldFxpbmNsdWRlID0gXHJlbGF4Ci0gIFxsZXRcbG93ZXJzZWN0aW9ucyA9IFxyZWxheAotICBcbGV0XGRvd24gPSBccmVsYXgKLSAgXGxldFxyYWlzZXNlY3Rpb25zID0gXHJlbGF4Ci0gIFxsZXRcdXAgPSBccmVsYXgKLSAgXGxldFxzZXQgPSBccmVsYXgKLSAgXGxldFxjbGVhciA9IFxyZWxheAotICBcbGV0XGl0ZW0gPSBccmVsYXgKLX0KLQotJSBJZ25vcmUgQGlnbm9yZSAuLi4gQGVuZCBpZ25vcmUuCi0lCi1cZGVmXGlnbm9yZXtcZG9pZ25vcmV7aWdub3JlfX0KLQotJSBJZ25vcmUgQGlmaW5mbywgQGlmaHRtbCwgQGlmbm90dGV4LCBAaHRtbCwgQG1lbnUsIGFuZCBAZGlyZW50cnkgdGV4dC4KLSUKLVxkZWZcaWZpbmZve1xkb2lnbm9yZXtpZmluZm99fQotXGRlZlxpZmh0bWx7XGRvaWdub3Jle2lmaHRtbH19Ci1cZGVmXGlmbm90dGV4e1xkb2lnbm9yZXtpZm5vdHRleH19Ci1cZGVmXGh0bWx7XGRvaWdub3Jle2h0bWx9fQotXGRlZlxtZW51e1xkb2lnbm9yZXttZW51fX0KLVxkZWZcZGlyZW50cnl7XGRvaWdub3Jle2RpcmVudHJ5fX0KLQotJSBAZGlyY2F0ZWdvcnkgQ0FURUdPUlkgIC0tIHNwZWNpZnkgYSBjYXRlZ29yeSBvZiB0aGUgZGlyIGZpbGUKLSUgd2hpY2ggdGhpcyBmaWxlIHNob3VsZCBiZWxvbmcgdG8uICBJZ25vcmUgdGhpcyBpbiBUZVguCi1cbGV0XGRpcmNhdGVnb3J5ID0gXGNvbW1lbnQKLQotJSBJZ25vcmUgdGV4dCB1bnRpbCBhIGxpbmUgYEBlbmQgIzEnLgotJQotXGRlZlxkb2lnbm9yZSMxe1xiZWdpbmdyb3VwCi0gICUgRG9uJ3QgY29tcGxhaW4gYWJvdXQgY29udHJvbCBzZXF1ZW5jZXMgd2UgaGF2ZSBkZWNsYXJlZCBcb3V0ZXIuCi0gIFxpZ25vcmVzZWN0aW9ucwotICAlCi0gICUgRGVmaW5lIGEgY29tbWFuZCB0byBzd2FsbG93IHRleHQgdW50aWwgd2UgcmVhY2ggYEBlbmQgIzEnLgotICAlIFRoaXMgQCBpcyBhIGNhdGNvZGUgMTIgdG9rZW4gKHRoYXQgaXMgdGhlIG5vcm1hbCBjYXRjb2RlIG9mIEAgaW4KLSAgJSB0aGlzIHRleGluZm8udGV4IGZpbGUpLiAgV2UgY2hhbmdlIHRoZSBjYXRjb2RlIG9mIEAgYmVsb3cgdG8gbWF0Y2guCi0gIFxsb25nXGRlZlxkb2lnbm9yZXRleHQjIzFAZW5kICMxe1xlbmRkb2lnbm9yZX0lCi0gICUKLSAgJSBNYWtlIHN1cmUgdGhhdCBzcGFjZXMgdHVybiBpbnRvIHRva2VucyB0aGF0IG1hdGNoIHdoYXQgXGRvaWdub3JldGV4dCB3YW50cy4KLSAgXGNhdGNvZGUzMiA9IDEwCi0gICUKLSAgJSBJZ25vcmUgYnJhY2VzLCB0b28sIHNvIG1pc21hdGNoZWQgYnJhY2VzIGRvbid0IGNhdXNlIHRyb3VibGUuCi0gIFxjYXRjb2RlYFx7ID0gOQotICBcY2F0Y29kZWBcfSA9IDkKLSAgJQotICAlIFdlIG11c3Qgbm90IGhhdmUgQGMgaW50ZXJwcmV0ZWQgYXMgYSBjb250cm9sIHNlcXVlbmNlLgotICBcY2F0Y29kZWBcQCA9IDEyCi0gICUKLSAgJSBNYWtlIHRoZSBsZXR0ZXIgYyBhIGNvbW1lbnQgY2hhcmFjdGVyIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUKLSAgJSB3aWxsIGJlIGlnbm9yZWQuIFRoaXMgd2F5LCB0aGUgZG9jdW1lbnQgY2FuIGhhdmUgKGZvciBleGFtcGxlKQotICAlICAgQGMgQGVuZCBpZmluZm8KLSAgJSBhbmQgdGhlIEBlbmQgaWZpbmZvIHdpbGwgYmUgcHJvcGVybHkgaWdub3JlZC4KLSAgJSAoV2UndmUganVzdCBjaGFuZ2VkIEAgdG8gY2F0Y29kZSAxMi4pCi0gIFxjYXRjb2RlYFxjID0gMTQKLSAgJQotICAlIEFuZCBub3cgZXhwYW5kIHRoYXQgY29tbWFuZC4KLSAgXGRvaWdub3JldGV4dAotfQotCi0lIFdoYXQgd2UgZG8gdG8gZmluaXNoIG9mZiBpZ25vcmVkIHRleHQuCi0lCi1cZGVmXGVuZGRvaWdub3Jle1xlbmRncm91cFxpZ25vcmVzcGFjZXN9JQotCi1cbmV3aWZcaWZ3YXJuZWRvYnNcd2FybmVkb2JzZmFsc2UKLVxkZWZcb2JzdGV4d2FybnslCi0gIFxpZndhcm5lZG9ic1xyZWxheFxlbHNlCi0gICUgV2UgbmVlZCB0byB3YXJuIGZvbGtzIHRoYXQgdGhleSBtYXkgaGF2ZSB0cm91YmxlIHdpdGggVGVYIDMuMC4KLSAgJSBUaGlzIHVzZXMgXGltbWVkaWF0ZVx3cml0ZTE2IHJhdGhlciB0aGFuIFxtZXNzYWdlIHRvIGdldCBuZXdsaW5lcy4KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7fQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsqKipXQVJOSU5HKioqIGZvciB1c2VycyBvZiBVbml4IFRlWCAzLjAhfQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntUaGlzIG1hbnVhbCB0cmlwcyBhIGJ1ZyBpbiBUZVggdmVyc2lvbiAzLjAgKHRleCBoYW5ncykufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntJZiB5b3UgYXJlIHJ1bm5pbmcgYW5vdGhlciB2ZXJzaW9uIG9mIFRlWCwgcmVsYXgufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntJZiB5b3UgYXJlIHJ1bm5pbmcgVW5peCBUZVggMy4wLCBraWxsIHRoaXMgVGVYIHByb2Nlc3MufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsgIFRoZW4gdXBncmFkZSB5b3VyIFRlWCBpbnN0YWxsYXRpb24gaWYgeW91IGNhbi59Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2eyAgKFNlZSBmdHA6Ly9mdHAuZ251LmFpLm1pdC5lZHUvcHViL2dudS9UZVguUkVBRE1FLil9Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e0lmIHlvdSBhcmUgc3R1Y2sgd2l0aCB2ZXJzaW9uIDMuMCwgcnVuIHRoZX0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICBzY3JpcHQgYGB0ZXgzcGF0Y2gnJyBmcm9tIHRoZSBUZXhpbmZvIGRpc3RyaWJ1dGlvbn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICB0byB1c2UgYSB3b3JrYXJvdW5kLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7fQotICAgIFxnbG9iYWxcd2FybmVkb2JzdHJ1ZQotICAgIFxmaQotfQotCi0lICoqSW4gVGVYIDMuMCwgc2V0dGluZyB0ZXh0IGluIFxudWxsZm9udCBoYW5ncyB0ZXguICBGb3IgYQotJSB3b3JrYXJvdW5kICh3aGljaCByZXF1aXJlcyB0aGUgZmlsZSBgYGR1bW15LnRmbScnIHRvIGJlIGluc3RhbGxlZCksCi0lIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmU6Ci0lJSUlJVxmb250XG51bGxmb250PWR1bW15XGxldFxvYnN0ZXh3YXJuPVxyZWxheAotCi0lIElnbm9yZSB0ZXh0LCBleGNlcHQgdGhhdCB3ZSBrZWVwIHRyYWNrIG9mIGNvbmRpdGlvbmFsIGNvbW1hbmRzIGZvcgotJSBwdXJwb3NlcyBvZiBuZXN0aW5nLCB1cCB0byBhbiBgQGVuZCAjMScgY29tbWFuZC4KLSUKLVxkZWZcbmVzdGVkaWdub3JlIzF7JQotICBcb2JzdGV4d2FybgotICAlIFdlIG11c3QgYWN0dWFsbHkgZXhwYW5kIHRoZSBpZ25vcmVkIHRleHQgdG8gbG9vayBmb3IgdGhlIEBlbmQKLSAgJSBjb21tYW5kLCBzbyB0aGF0IG5lc3RlZCBpZ25vcmUgY29uc3RydWN0cyB3b3JrLiAgVGh1cywgd2UgcHV0IHRoZQotICAlIHRleHQgaW50byBhIFx2Ym94IGFuZCB0aGVuIGRvIG5vdGhpbmcgd2l0aCB0aGUgcmVzdWx0LiAgVG8gbWluaW1pemUKLSAgJSB0aGUgY2hhbmdlIG9mIG1lbW9yeSBvdmVyZmxvdywgd2UgZm9sbG93IHRoZSBhcHByb2FjaCBvdXRsaW5lZCBvbgotICAlIHBhZ2UgNDAxIG9mIHRoZSBUZVhib29rOiBtYWtlIHRoZSBjdXJyZW50IGZvbnQgYmUgYSBkdW1teSBmb250LgotICAlCi0gIFxzZXRib3gwID0gXHZib3hcYmdyb3VwCi0gICAgJSBEb24ndCBjb21wbGFpbiBhYm91dCBjb250cm9sIHNlcXVlbmNlcyB3ZSBoYXZlIGRlY2xhcmVkIFxvdXRlci4KLSAgICBcaWdub3Jlc2VjdGlvbnMKLSAgICAlCi0gICAgJSBEZWZpbmUgYEBlbmQgIzEnIHRvIGVuZCB0aGUgYm94LCB3aGljaCB3aWxsIGluIHR1cm4gdW5kZWZpbmUgdGhlCi0gICAgJSBAZW5kIGNvbW1hbmQgYWdhaW4uCi0gICAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgRSMxXGVuZGNzbmFtZXtcZWdyb3VwXGlnbm9yZXNwYWNlc30lCi0gICAgJQotICAgICUgV2UgYXJlIGdvaW5nIHRvIGJlIHBhcnNpbmcgVGV4aW5mbyBjb21tYW5kcy4gIE1vc3QgY2F1c2Ugbm8KLSAgICAlIHRyb3VibGUgd2hlbiB0aGV5IGFyZSB1c2VkIGluY29ycmVjdGx5LCBidXQgc29tZSBjb21tYW5kcyBkbwotICAgICUgY29tcGxpY2F0ZWQgYXJndW1lbnQgcGFyc2luZyBvciBvdGhlcndpc2UgZ2V0IGNvbmZ1c2VkLCBzbyB3ZQotICAgICUgdW5kZWZpbmUgdGhlbS4KLSAgICAlCi0gICAgJSBXZSBjYW4ndCBkbyBhbnl0aGluZyBhYm91dCBzdHJheSBALXNpZ25zLCB1bmZvcnR1bmF0ZWx5OwotICAgICUgdGhleSdsbCBwcm9kdWNlIGB1bmRlZmluZWQgY29udHJvbCBzZXF1ZW5jZScgZXJyb3JzLgotICAgIFxpZ25vcmVtb3JlY29tbWFuZHMKLSAgICAlCi0gICAgJSBTZXQgdGhlIGN1cnJlbnQgZm9udCB0byBiZSBcbnVsbGZvbnQsIGEgVGVYIHByaW1pdGl2ZSwgYW5kIGRlZmluZQotICAgICUgYWxsIHRoZSBmb250IGNvbW1hbmRzIHRvIGFsc28gdXNlIFxudWxsZm9udC4gIFdlIGRvbid0IHVzZQotICAgICUgZHVtbXkudGZtLCBhcyBzdWdnZXN0ZWQgaW4gdGhlIFRlWGJvb2ssIGJlY2F1c2Ugbm90IGFsbCBzaXRlcwotICAgICUgbWlnaHQgaGF2ZSB0aGF0IGluc3RhbGxlZC4gIFRoZXJlZm9yZSwgbWF0aCBtb2RlIHdpbGwgc3RpbGwKLSAgICAlIHByb2R1Y2Ugb3V0cHV0LCBidXQgdGhhdCBzaG91bGQgYmUgYW4gZXh0cmVtZWx5IHNtYWxsIGFtb3VudCBvZgotICAgICUgc3R1ZmYgY29tcGFyZWQgdG8gdGhlIG1haW4gaW5wdXQuCi0gICAgJQotICAgIFxudWxsZm9udAotICAgIFxsZXRcdGVucm0gPSBcbnVsbGZvbnQgIFxsZXRcdGVuaXQgPSBcbnVsbGZvbnQgIFxsZXRcdGVuc2wgPSBcbnVsbGZvbnQKLSAgICBcbGV0XHRlbmJmID0gXG51bGxmb250ICBcbGV0XHRlbnR0ID0gXG51bGxmb250ICBcbGV0XHNtYWxsY2FwcyA9IFxudWxsZm9udAotICAgIFxsZXRcdGVuc2YgPSBcbnVsbGZvbnQKLSAgICAlIFNpbWlsYXJseSBmb3IgaW5kZXggZm9udHMgKG1vc3RseSBmb3IgdGhlaXIgdXNlIGluCi0gICAgJSBzbWFsbGV4YW1wbGUpCi0gICAgXGxldFxpbmRybSA9IFxudWxsZm9udCAgXGxldFxpbmRpdCA9IFxudWxsZm9udCAgXGxldFxpbmRzbCA9IFxudWxsZm9udAotICAgIFxsZXRcaW5kYmYgPSBcbnVsbGZvbnQgIFxsZXRcaW5kdHQgPSBcbnVsbGZvbnQgIFxsZXRcaW5kc2MgPSBcbnVsbGZvbnQKLSAgICBcbGV0XGluZHNmID0gXG51bGxmb250Ci0gICAgJQotICAgICUgRG9uJ3QgY29tcGxhaW4gd2hlbiBjaGFyYWN0ZXJzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGZvbnRzLgotICAgIFx0cmFjaW5nbG9zdGNoYXJzID0gMAotICAgICUKLSAgICAlIERvbid0IGJvdGhlciB0byBkbyBzcGFjZSBmYWN0b3IgY2FsY3VsYXRpb25zLgotICAgIFxmcmVuY2hzcGFjaW5nCi0gICAgJQotICAgICUgRG9uJ3QgcmVwb3J0IHVuZGVyZnVsbCBoYm94ZXMuCi0gICAgXGhiYWRuZXNzID0gMTAwMDAKLSAgICAlCi0gICAgJSBEbyBtaW5pbWFsIGxpbmUtYnJlYWtpbmcuCi0gICAgXHByZXRvbGVyYW5jZSA9IDEwMDAwCi0gICAgJQotICAgICUgRG8gbm90IGV4ZWN1dGUgaW5zdHJ1Y3Rpb25zIGluIEB0ZXgKLSAgICBcZGVmXHRleHtcZG9pZ25vcmV7dGV4fX0lCi0gICAgJSBEbyBub3QgZXhlY3V0ZSBtYWNybyBkZWZpbml0aW9ucy4KLSAgICAlIGBjJyBpcyBhIGNvbW1lbnQgY2hhcmFjdGVyLCBzbyB0aGUgd29yZCBgbWFjcm8nIHdpbGwgZ2V0IGN1dCBvZmYuCi0gICAgXGRlZlxtYWNyb3tcZG9pZ25vcmV7bWF9fSUKLX0KLQotJSBAc2V0IFZBUiBzZXRzIHRoZSB2YXJpYWJsZSBWQVIgdG8gYW4gZW1wdHkgdmFsdWUuCi0lIEBzZXQgVkFSIFJFU1QtT0YtTElORSBzZXRzIFZBUiB0byB0aGUgdmFsdWUgUkVTVC1PRi1MSU5FLgotJQotJSBTaW5jZSB3ZSB3YW50IHRvIHNlcGFyYXRlIFZBUiBmcm9tIFJFU1QtT0YtTElORSAod2hpY2ggbWlnaHQgYmUKLSUgZW1wdHkpLCB3ZSBjYW4ndCBqdXN0IHVzZSBccGFyc2Vhcmc7IHdlIGhhdmUgdG8gaW5zZXJ0IGEgc3BhY2Ugb2Ygb3VyCi0lIG93biB0byBkZWxpbWl0IHRoZSByZXN0IG9mIHRoZSBsaW5lLCBhbmQgdGhlbiB0YWtlIGl0IG91dCBhZ2FpbiBpZiB3ZQotJSBkaWRuJ3QgbmVlZCBpdC4gIE1ha2Ugc3VyZSB0aGUgY2F0Y29kZSBvZiBzcGFjZSBpcyBjb3JyZWN0IHRvIGF2b2lkCi0lIGxvc2luZyBpbnNpZGUgQGV4YW1wbGUsIGZvciBpbnN0YW5jZS4KLSUKLVxkZWZcc2V0e1xiZWdpbmdyb3VwXGNhdGNvZGVgID0xMAotICBcY2F0Y29kZWBcLT0xMiBcY2F0Y29kZWBcXz0xMiAlIEFsbG93IC0gYW5kIF8gaW4gVkFSLgotICBccGFyc2Vhcmdcc2V0eHh4fQotXGRlZlxzZXR4eHgjMXtcc2V0eXl5IzEgXGVuZHNldHl5eX0KLVxkZWZcc2V0eXl5IzEgIzJcZW5kc2V0eXl5eyUKLSAgXGRlZlx0ZW1weyMyfSUKLSAgXGlmeFx0ZW1wXGVtcHR5IFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVQjMVxlbmRjc25hbWUgPSBcZW1wdHkKLSAgXGVsc2UgXHNldHp6ensjMX0jMlxlbmRzZXR6enogJSBSZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlIFxzZXR4eHggaW5zZXJ0ZWQuCi0gIFxmaQotICBcZW5kZ3JvdXAKLX0KLSUgQ2FuJ3QgdXNlIFx4ZGVmIHRvIHByZS1leHBhbmQgIzIgYW5kIHNhdmUgc29tZSB0aW1lLCBzaW5jZSBcdGVtcCBvcgotJSBcbmV4dCBvciBvdGhlciBjb250cm9sIHNlcXVlbmNlcyB0aGF0IHdlJ3ZlIGRlZmluZWQgbWlnaHQgZ2V0IHVzIGludG8KLSUgYW4gaW5maW5pdGUgbG9vcC4gQ29uc2lkZXIgYEBzZXQgZm9vIEBjaXRle2Jhcn0nLgotXGRlZlxzZXR6enojMSMyIFxlbmRzZXR6enp7XGV4cGFuZGFmdGVyXGdkZWZcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZXsjMn19Ci0KLSUgQGNsZWFyIFZBUiBjbGVhcnMgKGkuZS4sIHVuc2V0cykgdGhlIHZhcmlhYmxlIFZBUi4KLSUKLVxkZWZcY2xlYXJ7XHBhcnNlYXJnXGNsZWFyeHh4fQotXGRlZlxjbGVhcnh4eCMxe1xnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVQjMVxlbmRjc25hbWU9XHJlbGF4fQotCi0lIEB2YWx1ZXtmb299IGdldHMgdGhlIHRleHQgc2F2ZWQgaW4gdmFyaWFibGUgZm9vLgotJQotewotICBcY2F0Y29kZWBcXyA9IFxhY3RpdmUKLSAgJQotICAlIFdlIG1pZ2h0IGVuZCB1cCB3aXRoIGFjdGl2ZSBfIG9yIC0gY2hhcmFjdGVycyBpbiB0aGUgYXJndW1lbnQgaWYKLSAgJSB3ZSdyZSBjYWxsZWQgZnJvbSBAY29kZSwgYXMgQGNvZGV7QHZhbHVle2Zvby1iYXJffX0uICBTbyBcbGV0IGFueQotICAlIHN1Y2ggYWN0aXZlIGNoYXJhY3RlcnMgdG8gdGhlaXIgbm9ybWFsIGVxdWl2YWxlbnRzLgotICBcZ2RlZlx2YWx1ZXtcYmVnaW5ncm91cAotICAgIFxjYXRjb2RlYFwtPTEyIFxjYXRjb2RlYFxfPTEyCi0gICAgXGluZGV4YnJlYWtzIFxsZXRfXG5vcm1hbHVuZGVyc2NvcmUKLSAgICBcdmFsdWV4eHh9Ci19Ci1cZGVmXHZhbHVleHh4IzF7XGV4cGFuZGFibGV2YWx1ZXsjMX1cZW5kZ3JvdXB9Ci0KLSUgV2UgaGF2ZSB0aGlzIHN1YnJvdXRpbmUgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGF0IGxlYXN0IHNvbWUgQHZhbHVlJ3MKLSUgcHJvcGVybHkgaW4gaW5kZXhlcyAod2UgXGxldFx2YWx1ZSB0byB0aGlzIGluIFxpbmRleGR1bW1pZXMpLiAgT25lcwotJSB3aG9zZSBuYW1lcyBjb250YWluIC0gb3IgXyBzdGlsbCB3b24ndCB3b3JrLCBidXQgd2UgY2FuJ3QgZG8gYW55dGhpbmcKLSUgYWJvdXQgdGhhdC4gIFRoZSBjb21tYW5kIGhhcyB0byBiZSBmdWxseSBleHBhbmRhYmxlLCBzaW5jZSB0aGUgcmVzdWx0Ci0lIHdpbmRzIHVwIGluIHRoZSBpbmRleCBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IGlmIHRoZSB2YXJpYWJsZSdzIHZhbHVlCi0lIGNvbnRhaW5zIG90aGVyIFRleGluZm8gY29tbWFuZHMsIGl0J3MgYWxtb3N0IGNlcnRhaW4gaXQgd2lsbCBmYWlsCi0lIChhbHRob3VnaCBwZXJoYXBzIHdlIGNvdWxkIGZpeCB0aGF0IHdpdGggc3VmZmljaWVudCB3b3JrIHRvIGRvIGEKLSUgb25lLWxldmVsIGV4cGFuc2lvbiBvbiB0aGUgcmVzdWx0LCBpbnN0ZWFkIG9mIGNvbXBsZXRlKS4KLSUgCi1cZGVmXGV4cGFuZGFibGV2YWx1ZSMxeyUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lXHJlbGF4Ci0gICAge1tObyB2YWx1ZSBmb3IgYGAjMScnXXZ9JQotICBcZWxzZQotICAgIFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lCi0gIFxmaQotfQotCi0lIEBpZnNldCBWQVIgLi4uIEBlbmQgaWZzZXQgcmVhZHMgdGhlIGAuLi4nIGlmZiBWQVIgaGFzIGJlZW4gZGVmaW5lZAotJSB3aXRoIEBzZXQuCi0lCi1cZGVmXGlmc2V0e1xwYXJzZWFyZ1xpZnNldHh4eH0KLVxkZWZcaWZzZXR4eHggIzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKLSAgICBcZXhwYW5kYWZ0ZXJcaWZzZXRmYWlsCi0gIFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGlmc2V0c3VjY2VlZAotICBcZmkKLX0KLVxkZWZcaWZzZXRzdWNjZWVke1xjb25kaXRpb25hbHN1Y2NlZWR7aWZzZXR9fQotXGRlZlxpZnNldGZhaWx7XG5lc3RlZGlnbm9yZXtpZnNldH19Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmc2V0fQotCi0lIEBpZmNsZWFyIFZBUiAuLi4gQGVuZCBpZmNsZWFyIHJlYWRzIHRoZSBgLi4uJyBpZmYgVkFSIGhhcyBuZXZlciBiZWVuCi0lIGRlZmluZWQgd2l0aCBAc2V0LCBvciBoYXMgYmVlbiB1bmRlZmluZWQgd2l0aCBAY2xlYXIuCi0lCi1cZGVmXGlmY2xlYXJ7XHBhcnNlYXJnXGlmY2xlYXJ4eHh9Ci1cZGVmXGlmY2xlYXJ4eHggIzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKLSAgICBcZXhwYW5kYWZ0ZXJcaWZjbGVhcnN1Y2NlZWQKLSAgXGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcaWZjbGVhcmZhaWwKLSAgXGZpCi19Ci1cZGVmXGlmY2xlYXJzdWNjZWVke1xjb25kaXRpb25hbHN1Y2NlZWR7aWZjbGVhcn19Ci1cZGVmXGlmY2xlYXJmYWlse1xuZXN0ZWRpZ25vcmV7aWZjbGVhcn19Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmY2xlYXJ9Ci0KLSUgQGlmdGV4LCBAaWZub3RodG1sLCBAaWZub3RpbmZvIGFsd2F5cyBzdWNjZWVkOyB3ZSByZWFkIHRoZSB0ZXh0Ci0lIGZvbGxvd2luZywgdGhyb3VnaCB0aGUgZmlyc3QgQGVuZCBpZnRleCAoZXRjLikuICBNYWtlIGBAZW5kIGlmdGV4JwotJSAoZXRjLikgdmFsaWQgb25seSBhZnRlciBhbiBAaWZ0ZXguCi0lCi1cZGVmXGlmdGV4e1xjb25kaXRpb25hbHN1Y2NlZWR7aWZ0ZXh9fQotXGRlZlxpZm5vdGh0bWx7XGNvbmRpdGlvbmFsc3VjY2VlZHtpZm5vdGh0bWx9fQotXGRlZlxpZm5vdGluZm97XGNvbmRpdGlvbmFsc3VjY2VlZHtpZm5vdGluZm99fQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZnRleH0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZub3RodG1sfQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZm5vdGluZm99Ci0KLSUgV2UgY2FuJ3QganVzdCB3YW50IHRvIHN0YXJ0IGEgZ3JvdXAgYXQgQGlmdGV4IChmb3IgZXhhbXBsZSkgYW5kIGVuZCBpdAotJSBhdCBAZW5kIGlmdGV4LCBzaW5jZSB0aGVuIEBzZXQgY29tbWFuZHMgaW5zaWRlIHRoZSBjb25kaXRpb25hbCBoYXZlIG5vCi0lIGVmZmVjdCAodGhleSdkIGdldCByZXZlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBncm91cCkuICBTbyB3ZSBtdXN0Ci0lIGRlZmluZSBcRWlmdGV4IHRvIHJlZGVmaW5lIGl0c2VsZiB0byBiZSBpdHMgcHJldmlvdXMgdmFsdWUuICAoV2UgY2FuJ3QKLSUganVzdCBkZWZpbmUgaXQgdG8gZmFpbCBhZ2FpbiB3aXRoIGFuIGBgdW5tYXRjaGVkIGVuZCcnIGVycm9yLCBzaW5jZQotJSB0aGUgQGlmc2V0IG1pZ2h0IGJlIG5lc3RlZC4pCi0lCi1cZGVmXGNvbmRpdGlvbmFsc3VjY2VlZCMxeyUKLSAgXGVkZWZcdGVtcHslCi0gICAgJSBSZW1lbWJlciB0aGUgY3VycmVudCB2YWx1ZSBvZiBcRSMxLgotICAgIFxsZXRcbmVjZXtwcmV2RSMxfSA9IFxuZWNle0UjMX0lCi0gICAgJQotICAgICUgQXQgdGhlIGBAZW5kICMxJywgcmVkZWZpbmUgXEUjMSB0byBiZSBpdHMgcHJldmlvdXMgdmFsdWUuCi0gICAgXGRlZlxuZWNle0UjMX17XGxldFxuZWNle0UjMX0gPSBcbmVjZXtwcmV2RSMxfX0lCi0gIH0lCi0gIFx0ZW1wCi19Ci0KLSUgV2UgbmVlZCB0byBleHBhbmQgbG90cyBvZiBcY3NuYW1lJ3MsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGV4cGFuZCB0aGUKLSUgY29udHJvbCBzZXF1ZW5jZXMgYWZ0ZXIgd2UndmUgY29uc3RydWN0ZWQgdGhlbS4KLSUKLVxkZWZcbmVjZSMxe1xleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWUjMVxlbmRjc25hbWV9Ci0KLSUgQGFzaXMganVzdCB5aWVsZHMgaXRzIGFyZ3VtZW50LiAgVXNlZCB3aXRoIEB0YWJsZSwgZm9yIGV4YW1wbGUuCi0lCi1cZGVmXGFzaXMjMXsjMX0KLQotJSBAbWF0aCBtZWFucyBvdXRwdXQgaW4gbWF0aCBtb2RlLgotJSBXZSBkb24ndCB1c2UgJCdzIGRpcmVjdGx5IGluIHRoZSBkZWZpbml0aW9uIG9mIFxtYXRoIGJlY2F1c2UgY29udHJvbAotJSBzZXF1ZW5jZXMgbGlrZSBcbWF0aCBhcmUgZXhwYW5kZWQgd2hlbiB0aGUgdG9jIGZpbGUgaXMgd3JpdHRlbi4gIFRoZW4sCi0lIHdlIHJlYWQgdGhlIHRvYyBmaWxlIGJhY2ssIHRoZSAkJ3Mgd2lsbCBiZSBub3JtYWwgY2hhcmFjdGVycyAoYXMgdGhleQotJSBzaG91bGQgYmUsIGFjY29yZGluZyB0byB0aGUgZGVmaW5pdGlvbiBvZiBUZXhpbmZvKS4gIFNvIHdlIG11c3QgdXNlIGEKLSUgY29udHJvbCBzZXF1ZW5jZSB0byBzd2l0Y2ggaW50byBhbmQgb3V0IG9mIG1hdGggbW9kZS4KLSUKLSUgVGhpcyBpc24ndCBxdWl0ZSBlbm91Z2ggZm9yIEBtYXRoIHRvIHdvcmsgcHJvcGVybHkgaW4gaW5kaWNlcywgYnV0IGl0Ci0lIHNlZW1zIHVubGlrZWx5IGl0IHdpbGwgZXZlciBiZSBuZWVkZWQgdGhlcmUuCi0lCi1cbGV0XGltcGxpY2l0bWF0aCA9ICQKLVxkZWZcbWF0aCMxe1xpbXBsaWNpdG1hdGggIzFcaW1wbGljaXRtYXRofQotCi0lIEBidWxsZXQgYW5kIEBtaW51cyBuZWVkIHRoZSBzYW1lIHRyZWF0bWVudCBhcyBAbWF0aCwganVzdCBhYm92ZS4KLVxkZWZcYnVsbGV0e1xpbXBsaWNpdG1hdGhccHRleGJ1bGxldFxpbXBsaWNpdG1hdGh9Ci1cZGVmXG1pbnVze1xpbXBsaWNpdG1hdGgtXGltcGxpY2l0bWF0aH0KLQotJSBAcmVmaWxsIGlzIGEgbm8tb3AuCi1cbGV0XHJlZmlsbD1ccmVsYXgKLQotJSBJZiB3b3JraW5nIG9uIGEgbGFyZ2UgZG9jdW1lbnQgaW4gY2hhcHRlcnMsIGl0IGlzIGNvbnZlbmllbnQgdG8KLSUgYmUgYWJsZSB0byBkaXNhYmxlIGluZGV4aW5nLCBjcm9zcy1yZWZlcmVuY2luZywgYW5kIGNvbnRlbnRzLCBmb3IgdGVzdCBydW5zLgotJSBUaGlzIGlzIGRvbmUgd2l0aCBAbm92YWxpZGF0ZSAoYmVmb3JlIEBzZXRmaWxlbmFtZSkuCi0lCi1cbmV3aWZcaWZsaW5rcyBcbGlua3N0cnVlICUgYnkgZGVmYXVsdCB3ZSB3YW50IHRoZSBhdXggZmlsZXMuCi1cbGV0XG5vdmFsaWRhdGUgPSBcbGlua3NmYWxzZQotCi0lIEBzZXRmaWxlbmFtZSBpcyBkb25lIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgdGV4aW5mbyBmaWxlLgotJSBTbyBvcGVuIGhlcmUgdGhlIGZpbGVzIHdlIG5lZWQgdG8gaGF2ZSBvcGVuIHdoaWxlIHJlYWRpbmcgdGhlIGlucHV0LgotJSBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG1ha2UgYSAuZm10IGZpbGUgZm9yIHRleGluZm8uCi1cZGVmXHNldGZpbGVuYW1leyUKLSAgIFxpZmxpbmtzIAotICAgICBccmVhZGF1eGZpbGUKLSAgIFxmaSAlIFxvcGVuaW5kaWNlcyBuZWVkcyB0byBkbyBzb21lIHdvcmsgaW4gYW55IGNhc2UuCi0gICBcb3BlbmluZGljZXMKLSAgIFxmaXhiYWNrc2xhc2ggICUgVHVybiBvZmYgaGFjayB0byBzd2FsbG93IGBcaW5wdXQgdGV4aW5mbycuCi0gICBcZ2xvYmFsXGxldFxzZXRmaWxlbmFtZT1cY29tbWVudCAlIElnbm9yZSBleHRyYSBAc2V0ZmlsZW5hbWUgY21kcy4KLSAgICUKLSAgICUgSWYgdGV4aW5mby5jbmYgaXMgcHJlc2VudCBvbiB0aGUgc3lzdGVtLCByZWFkIGl0LgotICAgJSBVc2VmdWwgZm9yIHNpdGUtd2lkZSBAYWZvdXJwYXBlciwgZXRjLgotICAgJSBKdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUsIGNsb3NlIHRoZSBpbnB1dCBzdHJlYW0gYmVmb3JlIHRoZSBcaW5wdXQuCi0gICBcb3BlbmluIDEgdGV4aW5mby5jbmYKLSAgIFxpZmVvZjEgXGxldFx0ZW1wPVxyZWxheCBcZWxzZSBcZGVmXHRlbXB7XGlucHV0IHRleGluZm8uY25mIH1cZmkKLSAgIFxjbG9zZWluMQotICAgXHRlbXAKLSAgICUKLSAgIFxjb21tZW50ICUgSWdub3JlIHRoZSBhY3R1YWwgZmlsZW5hbWUuCi19Ci0KLSUgQ2FsbGVkIGZyb20gXHNldGZpbGVuYW1lLgotJSAKLVxkZWZcb3BlbmluZGljZXN7JQotICBcbmV3aW5kZXh7Y3B9JQotICBcbmV3Y29kZWluZGV4e2ZufSUKLSAgXG5ld2NvZGVpbmRleHt2cn0lCi0gIFxuZXdjb2RlaW5kZXh7dHB9JQotICBcbmV3Y29kZWluZGV4e2t5fSUKLSAgXG5ld2NvZGVpbmRleHtwZ30lCi19Ci0KLSUgQGJ5ZS4KLVxvdXRlclxkZWZcYnlle1xwYWdlYWxpZ25tYWNyb1x0cmFjaW5nc3RhdHM9MVxwdGV4ZW5kfQotCi0KLVxtZXNzYWdle2ZvbnRzLH0KLSUgRm9udC1jaGFuZ2UgY29tbWFuZHMuCi0KLSUgVGV4aW5mbyBzb3J0IG9mIHN1cHBvcnRzIHRoZSBzYW5zIHNlcmlmIGZvbnQgc3R5bGUsIHdoaWNoIHBsYWluIFRlWCBkb2VzIG5vdC4KLSUgU28gd2Ugc2V0IHVwIGEgXHNmIGFuYWxvZ291cyB0byBwbGFpbidzIFxybSwgZXRjLgotXG5ld2ZhbVxzZmZhbQotXGRlZlxzZntcZmFtPVxzZmZhbSBcdGVuc2Z9Ci1cbGV0XGxpID0gXHNmICUgU29tZXRpbWVzIHdlIGNhbGwgaXQgXGxpLCBub3QgXHNmLgotCi0lIFdlIGRvbid0IG5lZWQgbWF0aCBmb3IgdGhpcyBvbmUuCi1cZGVmXHR0c2x7XHRlbnR0c2x9Ci0KLSUgVXNlIENvbXB1dGVyIE1vZGVybiBmb250cyBhdCBcbWFnc3RlcGhhbGYgKDExcHQpLgotXG5ld2NvdW50XG1haW5tYWdzdGVwCi1cbWFpbm1hZ3N0ZXA9XG1hZ3N0ZXBoYWxmCi0KLSUgU2V0IHRoZSBmb250IG1hY3JvICMxIHRvIHRoZSBmb250IG5hbWVkICMyLCBhZGRpbmcgb24gdGhlCi0lIHNwZWNpZmllZCBmb250IHByZWZpeCAobm9ybWFsbHkgYGNtJykuCi0lICMzIGlzIHRoZSBmb250J3MgZGVzaWduIHNpemUsICM0IGlzIGEgc2NhbGUgZmFjdG9yCi1cZGVmXHNldGZvbnQjMSMyIzMjNHtcZm9udCMxPVxmb250cHJlZml4IzIjMyBzY2FsZWQgIzR9Ci0KLSUgVXNlIGNtIGFzIHRoZSBkZWZhdWx0IGZvbnQgcHJlZml4LgotJSBUbyBzcGVjaWZ5IHRoZSBmb250IHByZWZpeCwgeW91IG11c3QgZGVmaW5lIFxmb250cHJlZml4Ci0lIGJlZm9yZSB5b3UgcmVhZCBpbiB0ZXhpbmZvLnRleC4KLVxpZnhcZm9udHByZWZpeFx1bmRlZmluZWQKLVxkZWZcZm9udHByZWZpeHtjbX0KLVxmaQotJSBTdXBwb3J0IGZvbnQgZmFtaWxpZXMgdGhhdCBkb24ndCB1c2UgdGhlIHNhbWUgbmFtaW5nIHNjaGVtZSBhcyBDTS4KLVxkZWZccm1zaGFwZXtyfQotXGRlZlxybWJzaGFwZXtieH0gICAgICAgICAgICAgICAld2hlcmUgdGhlIG5vcm1hbCBmYWNlIGlzIGJvbGQKLVxkZWZcYmZzaGFwZXtifQotXGRlZlxieHNoYXBle2J4fQotXGRlZlx0dHNoYXBle3R0fQotXGRlZlx0dGJzaGFwZXt0dH0KLVxkZWZcdHRzbHNoYXBle3NsdHR9Ci1cZGVmXGl0c2hhcGV7dGl9Ci1cZGVmXGl0YnNoYXBle2J4dGl9Ci1cZGVmXHNsc2hhcGV7c2x9Ci1cZGVmXHNsYnNoYXBle2J4c2x9Ci1cZGVmXHNmc2hhcGV7c3N9Ci1cZGVmXHNmYnNoYXBle3NzfQotXGRlZlxzY3NoYXBle2NzY30KLVxkZWZcc2Nic2hhcGV7Y3NjfQotCi1caWZ4XGJpZ2dlclxyZWxheAotXGxldFxtYWlubWFnc3RlcD1cbWFnc3RlcDEKLVxzZXRmb250XHRleHRybVxybXNoYXBlezEyfXsxMDAwfQotXHNldGZvbnRcdGV4dHR0XHR0c2hhcGV7MTJ9ezEwMDB9Ci1cZWxzZQotXHNldGZvbnRcdGV4dHJtXHJtc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHR0dFx0dHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cZmkKLSUgSW5zdGVhZCBvZiBjbWIxMCwgeW91IG1hbnkgd2FudCB0byB1c2UgY21ieDEwLgotJSBjbWJ4MTAgaXMgYSBwcmV0dGllciBmb250IG9uIGl0cyBvd24sIGJ1dCBjbWIxMAotJSBsb29rcyBiZXR0ZXIgd2hlbiBlbWJlZGRlZCBpbiBhIGxpbmUgd2l0aCBjbXIxMC4KLVxzZXRmb250XHRleHRiZlxiZnNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0aXRcaXRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHNsXHNsc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRzZlxzZnNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0c2Ncc2NzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHR0c2xcdHRzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cZm9udFx0ZXh0aT1jbW1pMTAgc2NhbGVkIFxtYWlubWFnc3RlcAotXGZvbnRcdGV4dHN5PWNtc3kxMCBzY2FsZWQgXG1haW5tYWdzdGVwCi0KLSUgQSBmZXcgZm9udHMgZm9yIEBkZWZ1biwgZXRjLgotXHNldGZvbnRcZGVmYmZcYnhzaGFwZXsxMH17XG1hZ3N0ZXAxfSAld2FzIDEzMTQKLVxzZXRmb250XGRlZnR0XHR0c2hhcGV7MTB9e1xtYWdzdGVwMX0KLVxkZWZcZGZ7XGxldFx0ZW50dD1cZGVmdHQgXGxldFx0ZW5iZiA9IFxkZWZiZiBcYmZ9Ci0KLSUgRm9udHMgZm9yIGluZGljZXMgYW5kIHNtYWxsIGV4YW1wbGVzICg5cHQpLgotJSBXZSBhY3R1YWxseSB1c2UgdGhlIHNsYW50ZWQgZm9udCByYXRoZXIgdGhhbiB0aGUgaXRhbGljLAotJSBiZWNhdXNlIHRleGluZm8gbm9ybWFsbHkgdXNlcyB0aGUgc2xhbnRlZCBmb250cyBmb3IgdGhhdC4KLSUgRG8gbm90IG1ha2UgbWFueSBmb250IGRpc3RpbmN0aW9ucyBpbiBnZW5lcmFsIGluIHRoZSBpbmRleCwgc2luY2UgdGhleQotJSBhcmVuJ3QgdmVyeSB1c2VmdWwuCi1cc2V0Zm9udFxuaW5ldHRcdHRzaGFwZXs5fXsxMDAwfQotXHNldGZvbnRcbmluZXR0c2xcdHRzbHNoYXBlezEwfXs5MDB9Ci1cc2V0Zm9udFxpbmRybVxybXNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxpbmRpdFxpdHNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxpbmRzbFxzbHNoYXBlezl9ezEwMDB9Ci1cbGV0XGluZHR0PVxuaW5ldHQKLVxsZXRcaW5kdHRzbD1cbmluZXR0c2wKLVxsZXRcaW5kc2Y9XGluZHJtCi1cbGV0XGluZGJmPVxpbmRybQotXHNldGZvbnRcaW5kc2Ncc2NzaGFwZXsxMH17OTAwfQotXGZvbnRcaW5kaT1jbW1pOQotXGZvbnRcaW5kc3k9Y21zeTkKLQotJSBGb250cyBmb3IgdGl0bGUgcGFnZToKLVxzZXRmb250XHRpdGxlcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwM30KLVxzZXRmb250XHRpdGxlaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxlc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxldHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwM30KLVxzZXRmb250XHRpdGxldHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxlc2Zcc2Zic2hhcGV7MTd9e1xtYWdzdGVwMX0KLVxsZXRcdGl0bGViZj1cdGl0bGVybQotXHNldGZvbnRcdGl0bGVzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXA0fQotXGZvbnRcdGl0bGVpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAzCi1cZm9udFx0aXRsZXN5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXA0Ci1cZGVmXGF1dGhvcnJte1xzZWNybX0KLQotJSBDaGFwdGVyIChhbmQgdW5udW1iZXJlZCkgZm9udHMgKDE3LjI4cHQpLgotXHNldGZvbnRcY2hhcHJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxjaGFwaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwM30KLVxzZXRmb250XGNoYXBzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXHNldGZvbnRcY2hhcHR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxjaGFwdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwM30KLVxzZXRmb250XGNoYXBzZlxzZmJzaGFwZXsxN317MTAwMH0KLVxsZXRcY2hhcGJmPVxjaGFwcm0KLVxzZXRmb250XGNoYXBzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXGZvbnRcY2hhcGk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDIKLVxmb250XGNoYXBzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMwotCi0lIFNlY3Rpb24gZm9udHMgKDE0LjRwdCkuCi1cc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXHNldGZvbnRcc2VjaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3NsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXHNldGZvbnRcc2VjdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcDF9Ci1cbGV0XHNlY2JmXHNlY3JtCi1cc2V0Zm9udFxzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAyfQotXGZvbnRcc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMQotXGZvbnRcc2Vjc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDIKLQotJSBcc2V0Zm9udFxzc2Vjcm1cYnhzaGFwZXsxMH17XG1hZ3N0ZXAxfSAgICAlIFRoaXMgc2l6ZSBhbiBmb250IGxvb2tlZCBiYWQuCi0lIFxzZXRmb250XHNzZWNpdFxpdHNoYXBlezEwfXtcbWFnc3RlcDF9ICAgICUgVGhlIGxldHRlcnMgd2VyZSB0b28gY3Jvd2RlZC4KLSUgXHNldGZvbnRcc3NlY3NsXHNsc2hhcGV7MTB9e1xtYWdzdGVwMX0KLSUgXHNldGZvbnRcc3NlY3R0XHR0c2hhcGV7MTB9e1xtYWdzdGVwMX0KLSUgXHNldGZvbnRcc3NlY3NmXHNmc2hhcGV7MTB9e1xtYWdzdGVwMX0KLQotJVxzZXRmb250XHNzZWNybVxiZnNoYXBlezEwfXsxMzE1fSAgICAgICUgTm90ZSB0aGUgdXNlIG9mIGNtYiByYXRoZXIgdGhhbiBjbWJ4LgotJVxzZXRmb250XHNzZWNpdFxpdHNoYXBlezEwfXsxMzE1fSAgICAgICUgQWxzbywgdGhlIHNpemUgaXMgYSBsaXR0bGUgbGFyZ2VyIHRoYW4KLSVcc2V0Zm9udFxzc2Vjc2xcc2xzaGFwZXsxMH17MTMxNX0gICAgICAlIGJlaW5nIHNjYWxlZCBtYWdzdGVwMS4KLSVcc2V0Zm9udFxzc2VjdHRcdHRzaGFwZXsxMH17MTMxNX0KLSVcc2V0Zm9udFxzc2Vjc2Zcc2ZzaGFwZXsxMH17MTMxNX0KLQotJVxsZXRcc3NlY2JmPVxzc2Vjcm0KLQotJSBTdWJzZWN0aW9uIGZvbnRzICgxMy4xNXB0KS4KLVxzZXRmb250XHNzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQotXHNldGZvbnRcc3NlY2l0XGl0YnNoYXBlezEwfXsxMzE1fQotXHNldGZvbnRcc3NlY3NsXHNsYnNoYXBlezEwfXsxMzE1fQotXHNldGZvbnRcc3NlY3R0XHR0YnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Ci1cc2V0Zm9udFxzc2VjdHRzbFx0dHNsc2hhcGV7MTB9ezEzMTV9Ci1cc2V0Zm9udFxzc2Vjc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KLVxsZXRcc3NlY2JmXHNzZWNybQotXHNldGZvbnRcc3NlY3NjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDF9Ci1cZm9udFxzc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwaGFsZgotXGZvbnRcc3NlY3N5PWNtc3kxMCBzY2FsZWQgMTMxNQotJSBUaGUgc21hbGxjYXBzIGFuZCBzeW1ib2wgZm9udHMgc2hvdWxkIGFjdHVhbGx5IGJlIHNjYWxlZCBcbWFnc3RlcDEuNSwKLSUgYnV0IHRoYXQgaXMgbm90IGEgc3RhbmRhcmQgbWFnbmlmaWNhdGlvbi4KLQotJSBJbiBvcmRlciBmb3IgdGhlIGZvbnQgY2hhbmdlcyB0byBhZmZlY3QgbW9zdCBtYXRoIHN5bWJvbHMgYW5kIGxldHRlcnMsCi0lIHdlIGhhdmUgdG8gZGVmaW5lIHRoZSBcdGV4dGZvbnQgb2YgdGhlIHN0YW5kYXJkIGZhbWlsaWVzLiAgU2luY2UKLSUgdGV4aW5mbyBkb2Vzbid0IGFsbG93IGZvciBwcm9kdWNpbmcgc3Vic2NyaXB0cyBhbmQgc3VwZXJzY3JpcHRzLCB3ZQotJSBkb24ndCBib3RoZXIgdG8gcmVzZXQgXHNjcmlwdGZvbnQgYW5kIFxzY3JpcHRzY3JpcHRmb250ICh3aGljaCB3b3VsZAotJSBhbHNvIHJlcXVpcmUgbG9hZGluZyBhIGxvdCBtb3JlIGZvbnRzKS4KLSUKLVxkZWZccmVzZXRtYXRoZm9udHN7JQotICBcdGV4dGZvbnQwID0gXHRlbnJtIFx0ZXh0Zm9udDEgPSBcdGVuaSBcdGV4dGZvbnQyID0gXHRlbnN5Ci0gIFx0ZXh0Zm9udFxpdGZhbSA9IFx0ZW5pdCBcdGV4dGZvbnRcc2xmYW0gPSBcdGVuc2wgXHRleHRmb250XGJmZmFtID0gXHRlbmJmCi0gIFx0ZXh0Zm9udFx0dGZhbSA9IFx0ZW50dCBcdGV4dGZvbnRcc2ZmYW0gPSBcdGVuc2YKLX0KLQotCi0lIFRoZSBmb250LWNoYW5naW5nIGNvbW1hbmRzIHJlZGVmaW5lIHRoZSBtZWFuaW5ncyBvZiBcdGVuU1RZTEUsIGluc3RlYWQKLSUgb2YganVzdCBcU1RZTEUuICBXZSBkbyB0aGlzIHNvIHRoYXQgZm9udCBjaGFuZ2VzIHdpbGwgY29udGludWUgdG8gd29yawotJSBpbiBtYXRoIG1vZGUsIHdoZXJlIGl0IGlzIHRoZSBjdXJyZW50IFxmYW0gdGhhdCBpcyByZWxldmFudCBpbiBtb3N0Ci0lIGNhc2VzLCBub3QgdGhlIGN1cnJlbnQgZm9udC4gIFBsYWluIFRlWCBkb2VzIFxkZWZcYmZ7XGZhbT1cYmZmYW0KLSUgXHRlbmJmfSwgZm9yIGV4YW1wbGUuICBCeSByZWRlZmluaW5nIFx0ZW5iZiwgd2Ugb2J2aWF0ZSB0aGUgbmVlZCB0bwotJSByZWRlZmluZSBcYmYgaXRzZWxmLgotXGRlZlx0ZXh0Zm9udHN7JQotICBcbGV0XHRlbnJtPVx0ZXh0cm0gXGxldFx0ZW5pdD1cdGV4dGl0IFxsZXRcdGVuc2w9XHRleHRzbAotICBcbGV0XHRlbmJmPVx0ZXh0YmYgXGxldFx0ZW50dD1cdGV4dHR0IFxsZXRcc21hbGxjYXBzPVx0ZXh0c2MKLSAgXGxldFx0ZW5zZj1cdGV4dHNmIFxsZXRcdGVuaT1cdGV4dGkgXGxldFx0ZW5zeT1cdGV4dHN5IFxsZXRcdGVudHRzbD1cdGV4dHR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzfQotXGRlZlx0aXRsZWZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cdGl0bGVybSBcbGV0XHRlbml0PVx0aXRsZWl0IFxsZXRcdGVuc2w9XHRpdGxlc2wKLSAgXGxldFx0ZW5iZj1cdGl0bGViZiBcbGV0XHRlbnR0PVx0aXRsZXR0IFxsZXRcc21hbGxjYXBzPVx0aXRsZXNjCi0gIFxsZXRcdGVuc2Y9XHRpdGxlc2YgXGxldFx0ZW5pPVx0aXRsZWkgXGxldFx0ZW5zeT1cdGl0bGVzeQotICBcbGV0XHRlbnR0c2w9XHRpdGxldHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MjVwdH19Ci1cZGVmXHRpdGxlZm9udCMxe3tcdGl0bGVmb250c1xybSAjMX19Ci1cZGVmXGNoYXBmb250c3slCi0gIFxsZXRcdGVucm09XGNoYXBybSBcbGV0XHRlbml0PVxjaGFwaXQgXGxldFx0ZW5zbD1cY2hhcHNsCi0gIFxsZXRcdGVuYmY9XGNoYXBiZiBcbGV0XHRlbnR0PVxjaGFwdHQgXGxldFxzbWFsbGNhcHM9XGNoYXBzYwotICBcbGV0XHRlbnNmPVxjaGFwc2YgXGxldFx0ZW5pPVxjaGFwaSBcbGV0XHRlbnN5PVxjaGFwc3kgXGxldFx0ZW50dHNsPVxjaGFwdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTlwdH19Ci1cZGVmXHNlY2ZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cc2Vjcm0gXGxldFx0ZW5pdD1cc2VjaXQgXGxldFx0ZW5zbD1cc2Vjc2wKLSAgXGxldFx0ZW5iZj1cc2VjYmYgXGxldFx0ZW50dD1cc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNlY3NjCi0gIFxsZXRcdGVuc2Y9XHNlY3NmIFxsZXRcdGVuaT1cc2VjaSBcbGV0XHRlbnN5PVxzZWNzeSBcbGV0XHRlbnR0c2w9XHNlY3R0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE2cHR9fQotXGRlZlxzdWJzZWNmb250c3slCi0gIFxsZXRcdGVucm09XHNzZWNybSBcbGV0XHRlbml0PVxzc2VjaXQgXGxldFx0ZW5zbD1cc3NlY3NsCi0gIFxsZXRcdGVuYmY9XHNzZWNiZiBcbGV0XHRlbnR0PVxzc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNzZWNzYwotICBcbGV0XHRlbnNmPVxzc2Vjc2YgXGxldFx0ZW5pPVxzc2VjaSBcbGV0XHRlbnN5PVxzc2Vjc3kgXGxldFx0ZW50dHNsPVxzc2VjdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTVwdH19Ci1cbGV0XHN1YnN1YnNlY2ZvbnRzID0gXHN1YnNlY2ZvbnRzICUgTWF5YmUgbWFrZSBzc3NlYyBmb250cyBzY2FsZWQgbWFnc3RlcGhhbGY/Ci1cZGVmXGluZGV4Zm9udHN7JQotICBcbGV0XHRlbnJtPVxpbmRybSBcbGV0XHRlbml0PVxpbmRpdCBcbGV0XHRlbnNsPVxpbmRzbAotICBcbGV0XHRlbmJmPVxpbmRiZiBcbGV0XHRlbnR0PVxpbmR0dCBcbGV0XHNtYWxsY2Fwcz1caW5kc2MKLSAgXGxldFx0ZW5zZj1caW5kc2YgXGxldFx0ZW5pPVxpbmRpIFxsZXRcdGVuc3k9XGluZHN5IFxsZXRcdGVudHRzbD1caW5kdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTJwdH19Ci0KLSUgU2V0IHVwIHRoZSBkZWZhdWx0IGZvbnRzLCBzbyB3ZSBjYW4gdXNlIHRoZW0gZm9yIGNyZWF0aW5nIGJveGVzLgotJQotXHRleHRmb250cwotCi0lIERlZmluZSB0aGVzZSBzbyB0aGV5IGNhbiBiZSBlYXNpbHkgY2hhbmdlZCBmb3Igb3RoZXIgZm9udHMuCi1cZGVmXGFuZ2xlbGVmdHskXGxhbmdsZSR9Ci1cZGVmXGFuZ2xlcmlnaHR7JFxyYW5nbGUkfQotCi0lIENvdW50IGRlcHRoIGluIGZvbnQtY2hhbmdlcywgZm9yIGVycm9yIGNoZWNrcwotXG5ld2NvdW50XGZvbnRkZXB0aCBcZm9udGRlcHRoPTAKLQotJSBGb250cyBmb3Igc2hvcnQgdGFibGUgb2YgY29udGVudHMuCi1cc2V0Zm9udFxzaG9ydGNvbnRybVxybXNoYXBlezEyfXsxMDAwfQotXHNldGZvbnRcc2hvcnRjb250YmZcYnhzaGFwZXsxMn17MTAwMH0KLVxzZXRmb250XHNob3J0Y29udHNsXHNsc2hhcGV7MTJ9ezEwMDB9Ci0KLSUlIEFkZCBzY3JpYmUtbGlrZSBmb250IGVudmlyb25tZW50cywgcGx1cyBAbCBmb3IgaW5saW5lIGxpc3AgKHVzdWFsbHkgc2FucwotJSUgc2VyaWYpIGFuZCBAaWkgZm9yIFRlWCBpdGFsaWMKLQotJSBcc21hcnRpdGFsaWN7QVJHfSBvdXRwdXRzIGFyZyBpbiBpdGFsaWNzLCBmb2xsb3dlZCBieSBhbiBpdGFsaWMgY29ycmVjdGlvbgotJSB1bmxlc3MgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgaXMgc3VjaCBhcyBub3QgdG8gbmVlZCBvbmUuCi1cZGVmXHNtYXJ0aXRhbGljeHtcaWZ4XG5leHQsXGVsc2VcaWZ4XG5leHQtXGVsc2VcaWZ4XG5leHQuXGVsc2VcL1xmaVxmaVxmaX0KLVxkZWZcc21hcnRzbGFudGVkIzF7e1xzbCAjMX1cZnV0dXJlbGV0XG5leHRcc21hcnRpdGFsaWN4fQotXGRlZlxzbWFydGl0YWxpYyMxe3tcaXQgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KLQotXGxldFxpPVxzbWFydGl0YWxpYwotXGxldFx2YXI9XHNtYXJ0c2xhbnRlZAotXGxldFxkZm49XHNtYXJ0c2xhbnRlZAotXGxldFxlbXBoPVxzbWFydGl0YWxpYwotXGxldFxjaXRlPVxzbWFydHNsYW50ZWQKLQotXGRlZlxiIzF7e1xiZiAjMX19Ci1cbGV0XHN0cm9uZz1cYgotCi0lIFdlIGNhbid0IGp1c3QgdXNlIFxleGh5cGhlbnBlbmFsdHksIGJlY2F1c2UgdGhhdCBvbmx5IGhhcyBlZmZlY3QgYXQKLSUgdGhlIGVuZCBvZiBhIHBhcmFncmFwaC4gIFJlc3RvcmUgbm9ybWFsIGh5cGhlbmF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlCi0lIGdyb3VwIHdpdGhpbiB3aGljaCBcbm9oeXBoZW5hdGlvbiBpcyBwcmVzdW1hYmx5IGNhbGxlZC4KLSUKLVxkZWZcbm9oeXBoZW5hdGlvbntcaHlwaGVuY2hhclxmb250ID0gLTEgIFxhZnRlcmdyb3VwXHJlc3RvcmVoeXBoZW5hdGlvbn0KLVxkZWZccmVzdG9yZWh5cGhlbmF0aW9ue1xoeXBoZW5jaGFyXGZvbnQgPSBgLSB9Ci0KLVxkZWZcdCMxeyUKLSAge1x0dCBccmF3YmFja3NsYXNoIFxmcmVuY2hzcGFjaW5nICMxfSUKLSAgXG51bGwKLX0KLVxsZXRcdHRmb250PVx0Ci1cZGVmXHNhbXAjMXtgXHRjbG9zZXsjMX0nXG51bGx9Ci1cc2V0Zm9udFxzbWFsbHJtXHJtc2hhcGV7OH17MTAwMH0KLVxmb250XHNtYWxsc3k9Y21zeTkKLVxkZWZca2V5IzF7e1xzbWFsbHJtXHRleHRmb250Mj1cc21hbGxzeSBcbGVhdmV2bW9kZVxoYm94eyUKLSAgXHJhaXNlMC40cHRcaGJveHtcYW5nbGVsZWZ0fVxrZXJuLS4wOGVtXHZ0b3B7JQotICAgIFx2Ym94e1xocnVsZVxrZXJuLTAuNHB0Ci0gICAgIFxoYm94e1xyYWlzZTAuNHB0XGhib3h7XHZwaGFudG9te1xhbmdsZWxlZnR9fSMxfX0lCi0gICAgXGtlcm4tMC40cHRcaHJ1bGV9JQotICBca2Vybi0uMDZlbVxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlcmlnaHR9fX19Ci0lIFRoZSBvbGQgZGVmaW5pdGlvbiwgd2l0aCBubyBsb3plbmdlOgotJVxkZWZca2V5ICMxe3tcdHRzbCBcbm9oeXBoZW5hdGlvbiBcdXBwZXJjYXNleyMxfX1cbnVsbH0KLVxkZWZcY3RybCAjMXt7XHR0IFxyYXdiYWNrc2xhc2ggXGhhdH0jMX0KLQotJSBAZmlsZSwgQG9wdGlvbiBhcmUgdGhlIHNhbWUgYXMgQHNhbXAuCi1cbGV0XGZpbGU9XHNhbXAKLVxsZXRcb3B0aW9uPVxzYW1wCi0KLSUgQGNvZGUgaXMgYSBtb2RpZmljYXRpb24gb2YgQHQsCi0lIHdoaWNoIG1ha2VzIHNwYWNlcyB0aGUgc2FtZSBzaXplIGFzIG5vcm1hbCBpbiB0aGUgc3Vycm91bmRpbmcgdGV4dC4KLVxkZWZcdGNsb3NlIzF7JQotICB7JQotICAgICUgQ2hhbmdlIG5vcm1hbCBpbnRlcndvcmQgc3BhY2UgdG8gYmUgc2FtZSBhcyBmb3IgdGhlIGN1cnJlbnQgZm9udC4KLSAgICBcc3BhY2Vza2lwID0gXGZvbnRkaW1lbjJcZm9udAotICAgICUKLSAgICAlIFN3aXRjaCB0byB0eXBld3JpdGVyLgotICAgIFx0dAotICAgICUKLSAgICAlIEJ1dCBgXCAnIHByb2R1Y2VzIHRoZSBsYXJnZSB0eXBld3JpdGVyIGludGVyd29yZCBzcGFjZS4KLSAgICBcZGVmXCB7e1xzcGFjZXNraXAgPSAwcHR7fSB9fSUKLSAgICAlCi0gICAgJSBUdXJuIG9mZiBoeXBoZW5hdGlvbi4KLSAgICBcbm9oeXBoZW5hdGlvbgotICAgICUKLSAgICBccmF3YmFja3NsYXNoCi0gICAgXGZyZW5jaHNwYWNpbmcKLSAgICAjMSUKLSAgfSUKLSAgXG51bGwKLX0KLQotJSBXZSAqbXVzdCogdHVybiBvbiBoeXBoZW5hdGlvbiBhdCBgLScgYW5kIGBfJyBpbiBcY29kZS4KLSUgT3RoZXJ3aXNlLCBpdCBpcyB0b28gaGFyZCB0byBhdm9pZCBvdmVyZnVsbCBoYm94ZXMKLSUgaW4gdGhlIEVtYWNzIG1hbnVhbCwgdGhlIExpYnJhcnkgbWFudWFsLCBldGMuCi0KLSUgVW5mb3J0dW5hdGVseSwgVGVYIHVzZXMgb25lIHBhcmFtZXRlciAoXGh5cGhlbmNoYXIpIHRvIGNvbnRyb2wKLSUgYm90aCBoeXBoZW5hdGlvbiBhdCAtIGFuZCBoeXBoZW5hdGlvbiB3aXRoaW4gd29yZHMuCi0lIFdlIG11c3QgdGhlcmVmb3JlIHR1cm4gdGhlbSBib3RoIG9mZiAoXHRjbG9zZSBkb2VzIHRoYXQpCi0lIGFuZCBhcnJhbmdlIGV4cGxpY2l0bHkgdG8gaHlwaGVuYXRlIGF0IGEgZGFzaC4KLSUgIC0tIHJtcy4KLXsKLSAgXGNhdGNvZGVgXC09XGFjdGl2ZQotICBcY2F0Y29kZWBcXz1cYWN0aXZlCi0gICUKLSAgXGdsb2JhbFxkZWZcY29kZXtcYmVnaW5ncm91cAotICAgIFxjYXRjb2RlYFwtPVxhY3RpdmUgXGxldC1cY29kZWRhc2gKLSAgICBcY2F0Y29kZWBcXz1cYWN0aXZlIFxsZXRfXGNvZGV1bmRlcgotICAgIFxjb2RleAotICB9Ci0gICUKLSAgJSBJZiB3ZSBlbmQgdXAgd2l0aCBhbnkgYWN0aXZlIC0gY2hhcmFjdGVycyB3aGVuIGhhbmRsaW5nIHRoZSBpbmRleCwKLSAgJSBqdXN0IHRyZWF0IHRoZW0gYXMgYSBub3JtYWwgLS4KLSAgXGdsb2JhbFxkZWZcaW5kZXhicmVha3N7XGNhdGNvZGVgXC09XGFjdGl2ZSBcbGV0LVxyZWFsZGFzaH0KLX0KLQotXGRlZlxyZWFsZGFzaHstfQotXGRlZlxjb2RlZGFzaHstXGRpc2NyZXRpb25hcnl7fXt9e319Ci1cZGVmXGNvZGV1bmRlcntcaWZ1c2luZ3R0e1xub3JtYWx1bmRlcnNjb3JlXGRpc2NyZXRpb25hcnl7fXt9e319e1xffX0KLVxkZWZcY29kZXggIzF7XHRjbG9zZXsjMX1cZW5kZ3JvdXB9Ci0KLSVcbGV0XGV4cD1cdGNsb3NlICAlV2FzIHRlbXBvcmFyeQotCi0lIEBrYmQgaXMgbGlrZSBAY29kZSwgZXhjZXB0IHRoYXQgaWYgdGhlIGFyZ3VtZW50IGlzIGp1c3Qgb25lIEBrZXkgY29tbWFuZCwKLSUgdGhlbiBAa2JkIGhhcyBubyBlZmZlY3QuCi0KLSUgQGtiZGlucHV0c3R5bGUgLS0gYXJnIGlzIGBkaXN0aW5jdCcgKEBrYmQgdXNlcyBzbGFudGVkIHR0eSBmb250IGFsd2F5cyksCi0lICAgYGV4YW1wbGUnIChAa2JkIHVzZXMgdHRzbCBvbmx5IGluc2lkZSBvZiBAZXhhbXBsZSBhbmQgZnJpZW5kcyksCi0lICAgb3IgYGNvZGUnIChAa2JkIHVzZXMgbm9ybWFsIHR0eSBmb250IGFsd2F5cykuCi1cZGVmXGtiZGlucHV0c3R5bGV7XHBhcnNlYXJnXGtiZGlucHV0c3R5bGV4eHh9Ci1cZGVmXGtiZGlucHV0c3R5bGV4eHgjMXslCi0gIFxkZWZcYXJneyMxfSUKLSAgXGlmeFxhcmdcd29yZGRpc3RpbmN0Ci0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHRzbH0lCi0gIFxlbHNlXGlmeFxhcmdcd29yZGV4YW1wbGUKLSAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dH0lCi0gIFxlbHNlXGlmeFxhcmdcd29yZGNvZGUKLSAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHR9XGdkZWZca2JkZm9udHtcdHR9JQotICBcZmlcZmlcZmkKLX0KLVxkZWZcd29yZGRpc3RpbmN0e2Rpc3RpbmN0fQotXGRlZlx3b3JkZXhhbXBsZXtleGFtcGxlfQotXGRlZlx3b3JkY29kZXtjb2RlfQotCi0lIERlZmF1bHQgaXMga2JkaW5wdXRkaXN0aW5jdC4gIChUb28gbXVjaCBvZiBhIGhhc3NsZSB0byBjYWxsIHRoZSBtYWNybywKLSUgdGhlIGNhdGNvZGVzIGFyZSB3cm9uZyBmb3IgcGFyc2VhcmcgdG8gd29yay4pCi1cZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dHNsfQotCi1cZGVmXHhrZXl7XGtleX0KLVxkZWZca2JkZm9vIzEjMiMzXHBhcntcZGVmXG9uZXsjMX1cZGVmXHRocmVleyMzfVxkZWZcdGhyZWV4ez8/fSUKLVxpZnhcb25lXHhrZXlcaWZ4XHRocmVleFx0aHJlZSBca2V5eyMyfSUKLVxlbHNle1x0Y2xvc2V7XGtiZGZvbnRcbG9va319XGZpCi1cZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaX0KLQotJSBGb3IgQHVybCwgQGVudiwgQGNvbW1hbmQgcXVvdGVzIHNlZW0gdW5uZWNlc3NhcnksIHNvIHVzZSBcY29kZS4KLVxsZXRcdXJsPVxjb2RlCi1cbGV0XGVudj1cY29kZQotXGxldFxjb21tYW5kPVxjb2RlCi0KLSUgQHVyZWYgKGFiYnJldmlhdGlvbiBmb3IgYHVybHJlZicpIHRha2VzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudAotJSBzcGVjaWZ5aW5nIHRoZSB0ZXh0IHRvIGRpc3BsYXkuICBGaXJzdCAobWFuZGF0b3J5KSBhcmcgaXMgdGhlIHVybC4KLSUgUGVyaGFwcyBldmVudHVhbGx5IHB1dCBpbiBhIGh5cGVydGV4IFxzcGVjaWFsIGhlcmUuCi0lIAotXGRlZlx1cmVmIzF7XHVyZWZ4eHggIzEsLFxmaW5pc2h9Ci1cZGVmXHVyZWZ4eHgjMSwjMiwjM1xmaW5pc2h7JQotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQotICBcaWZkaW1cd2QwID4gMHB0Ci0gICAgXHVuaGJveDBcIChcY29kZXsjMX0pJQotICBcZWxzZQotICAgIFxjb2RleyMxfSUKLSAgXGZpCi19Ci0KLSUgcm1zIGRvZXMgbm90IGxpa2UgdGhlIGFuZ2xlIGJyYWNrZXRzIC0ta2FybCwgMTdtYXk5Ny4KLSUgU28gbm93IEBlbWFpbCBpcyBqdXN0IGxpa2UgQHVyZWYuCi0lXGRlZlxlbWFpbCMxe1xhbmdsZWxlZnR7XHR0ICMxfVxhbmdsZXJpZ2h0fQotXGxldFxlbWFpbD1cdXJlZgotCi0lIENoZWNrIGlmIHdlIGFyZSBjdXJyZW50bHkgdXNpbmcgYSB0eXBld3JpdGVyIGZvbnQuICBTaW5jZSBhbGwgdGhlCi0lIENvbXB1dGVyIE1vZGVybiB0eXBld3JpdGVyIGZvbnRzIGhhdmUgemVybyBpbnRlcndvcmQgc3RyZXRjaCAoYW5kCi0lIHNocmluayksIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdCBhbGwgdHlwZXdyaXRlciBmb250cyB0byBoYXZlCi0lIHRoaXMgcHJvcGVydHksIHdlIGNhbiBjaGVjayB0aGF0IGZvbnQgcGFyYW1ldGVyLgotJQotXGRlZlxpZm1vbm9zcGFjZXtcaWZkaW1cZm9udGRpbWVuM1xmb250PTBwdCB9Ci0KLSUgVHlwZXNldCBhIGRpbWVuc2lvbiwgZS5nLiwgYGluJyBvciBgcHQnLiAgVGhlIG9ubHkgcmVhc29uIGZvciB0aGUKLSUgYXJndW1lbnQgaXMgdG8gbWFrZSB0aGUgaW5wdXQgbG9vayByaWdodDogQGRtbntwdH0gaW5zdGVhZCBvZiBAZG1ue31wdC4KLSUKLVxkZWZcZG1uIzF7XHRoaW5zcGFjZSAjMX0KLQotXGRlZlxrYmQjMXtcZGVmXGxvb2t7IzF9XGV4cGFuZGFmdGVyXGtiZGZvb1xsb29rPz9ccGFyfQotCi0lIEBsIHdhcyBuZXZlciBkb2N1bWVudGVkIHRvIG1lYW4gYGBzd2l0Y2ggdG8gdGhlIExpc3AgZm9udCcnLAotJSBhbmQgaXQgaXMgbm90IHVzZWQgYXMgc3VjaCBpbiBhbnkgbWFudWFsIEkgY2FuIGZpbmQuICBXZSBuZWVkIGl0IGZvcgotJSBQb2xpc2ggc3VwcHJlc3NlZC1sLiAgLS1rYXJsLCAyMnNlcDk2LgotJVxkZWZcbCMxe3tcbGkgIzF9XG51bGx9Ci0KLSUgRXhwbGljaXQgZm9udCBjaGFuZ2VzOiBAciwgQHNjLCB1bmRvY3VtZW50ZWQgQGlpLgotXGRlZlxyIzF7e1xybSAjMX19ICAgICAgICAgICAgICAlIHJvbWFuIGZvbnQKLVxkZWZcc2MjMXt7XHNtYWxsY2FwcyMxfX0gICAgICAgJSBzbWFsbGNhcHMgZm9udAotXGRlZlxpaSMxe3tcaXQgIzF9fSAgICAgICAgICAgICAlIGl0YWxpYyBmb250Ci0KLSUgQGFjcm9ueW0gZG93bmNhc2VzIHRoZSBhcmd1bWVudCBhbmQgcHJpbnRzIGluIHNtYWxsY2Fwcy4KLVxkZWZcYWNyb255bSMxe3tcc21hbGxjYXBzIFxsb3dlcmNhc2V7IzF9fX0KLQotJSBAcG91bmRze30gaXMgYSBzdGVybGluZyBzaWduLgotXGRlZlxwb3VuZHN7e1xpdFwkfX0KLQotCi1cbWVzc2FnZXtwYWdlIGhlYWRpbmdzLH0KLQotXG5ld3NraXBcdGl0bGVwYWdldG9wZ2x1ZSBcdGl0bGVwYWdldG9wZ2x1ZSA9IDEuNWluCi1cbmV3c2tpcFx0aXRsZXBhZ2Vib3R0b21nbHVlIFx0aXRsZXBhZ2Vib3R0b21nbHVlID0gMnBjCi0KLSUgRmlyc3QgdGhlIHRpdGxlIHBhZ2UuICBNdXN0IGRvIEBzZXR0aXRsZSBiZWZvcmUgQHRpdGxlcGFnZS4KLVxuZXdpZlxpZnNlZW5hdXRob3IKLVxuZXdpZlxpZmZpbmlzaGVkdGl0bGVwYWdlCi0KLSUgRG8gYW4gaW1wbGljaXQgQGNvbnRlbnRzIG9yIEBzaG9ydGNvbnRlbnRzIGFmdGVyIEBlbmQgdGl0bGVwYWdlIGlmIHRoZQotJSB1c2VyIHNheXMgQGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2Ugb3IgQHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZS4KLSUgCi1cbmV3aWZcaWZzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gXGxldFxzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlID0gXHNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2V0cnVlCi1cbmV3aWZcaWZzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKLSBcbGV0XHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZSA9IFxzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2V0cnVlCi0KLVxkZWZcc2hvcnR0aXRsZXBhZ2V7XHBhcnNlYXJnXHNob3J0dGl0bGVwYWdlenp6fQotXGRlZlxzaG9ydHRpdGxlcGFnZXp6eiAjMXtcYmVnaW5ncm91cFxoYm94e31cdnNraXAgMS41aW4gXGNoYXBybSBcY2VudGVybGluZXsjMX0lCi0gICAgICAgIFxlbmRncm91cFxwYWdlXGhib3h7fVxwYWdlfQotCi1cZGVmXHRpdGxlcGFnZXtcYmVnaW5ncm91cCBccGFyaW5kZW50PTBwdCBcdGV4dGZvbnRzCi0gICBcbGV0XHN1YnRpdGxlcm09XHRlbnJtCi0gICBcZGVmXHN1YnRpdGxlZm9udHtcc3VidGl0bGVybSBcbm9ybWFsYmFzZWxpbmVza2lwID0gMTNwdCBcbm9ybWFsYmFzZWxpbmVzfSUKLSAgICUKLSAgIFxkZWZcYXV0aG9yZm9udHtcYXV0aG9ycm0gXG5vcm1hbGJhc2VsaW5lc2tpcCA9IDE2cHQgXG5vcm1hbGJhc2VsaW5lc30lCi0gICAlCi0gICAlIExlYXZlIHNvbWUgc3BhY2UgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBwYWdlLgotICAgXHZnbHVlXHRpdGxlcGFnZXRvcGdsdWUKLSAgICUKLSAgICUgTm93IHlvdSBjYW4gcHJpbnQgdGhlIHRpdGxlIHVzaW5nIEB0aXRsZS4KLSAgIFxkZWZcdGl0bGV7XHBhcnNlYXJnXHRpdGxlenp6fSUKLSAgIFxkZWZcdGl0bGV6enojIzF7XGxlZnRsaW5le1x0aXRsZWZvbnRzXHJtICMjMX0KLSAgICAgICAgICAgICAgICAgICAgJSBwcmludCBhIHJ1bGUgYXQgdGhlIHBhZ2UgYm90dG9tIGFsc28uCi0gICAgICAgICAgICAgICAgICAgIFxmaW5pc2hlZHRpdGxlcGFnZWZhbHNlCi0gICAgICAgICAgICAgICAgICAgIFx2c2tpcDRwdCBcaHJ1bGUgaGVpZ2h0IDRwdCB3aWR0aCBcaHNpemUgXHZza2lwNHB0fSUKLSAgICUgTm8gcnVsZSBhdCBwYWdlIGJvdHRvbSB1bmxlc3Mgd2UgcHJpbnQgb25lIGF0IHRoZSB0b3Agd2l0aCBAdGl0bGUuCi0gICBcZmluaXNoZWR0aXRsZXBhZ2V0cnVlCi0gICAlCi0gICAlIE5vdyB5b3UgY2FuIHB1dCB0ZXh0IHVzaW5nIEBzdWJ0aXRsZS4KLSAgIFxkZWZcc3VidGl0bGV7XHBhcnNlYXJnXHN1YnRpdGxlenp6fSUKLSAgIFxkZWZcc3VidGl0bGV6enojIzF7e1xzdWJ0aXRsZWZvbnQgXHJpZ2h0bGluZXsjIzF9fX0lCi0gICAlCi0gICAlIEBhdXRob3Igc2hvdWxkIGNvbWUgbGFzdCwgYnV0IG1heSBjb21lIG1hbnkgdGltZXMuCi0gICBcZGVmXGF1dGhvcntccGFyc2VhcmdcYXV0aG9yenp6fSUKLSAgIFxkZWZcYXV0aG9yenp6IyMxe1xpZnNlZW5hdXRob3JcZWxzZVx2c2tpcCAwcHQgcGx1cyAxZmlsbGxcc2VlbmF1dGhvcnRydWVcZmkKLSAgICAgIHtcYXV0aG9yZm9udCBcbGVmdGxpbmV7IyMxfX19JQotICAgJQotICAgJSBNb3N0IHRpdGxlIGBgcGFnZXMnJyBhcmUgYWN0dWFsbHkgdHdvIHBhZ2VzIGxvbmcsIHdpdGggc3BhY2UKLSAgICUgYXQgdGhlIHRvcCBvZiB0aGUgc2Vjb25kLiAgV2UgZG9uJ3Qgd2FudCB0aGUgcmFnZ2VkIGxlZnQgb24gdGhlIHNlY29uZC4KLSAgIFxsZXRcb2xkcGFnZSA9IFxwYWdlCi0gICBcZGVmXHBhZ2V7JQotICAgICAgXGlmZmluaXNoZWR0aXRsZXBhZ2VcZWxzZQotICAgICAgICAgXGZpbmlzaHRpdGxlcGFnZQotICAgICAgXGZpCi0gICAgICBcb2xkcGFnZQotICAgICAgXGxldFxwYWdlID0gXG9sZHBhZ2UKLSAgICAgIFxoYm94e319JQotJSAgIFxkZWZccGFnZXtcb2xkcGFnZSBcaGJveHt9fQotfQotCi1cZGVmXEV0aXRsZXBhZ2V7JQotICAgXGlmZmluaXNoZWR0aXRsZXBhZ2VcZWxzZQotICAgICAgXGZpbmlzaHRpdGxlcGFnZQotICAgXGZpCi0gICAlIEl0IGlzIGltcG9ydGFudCB0byBkbyB0aGUgcGFnZSBicmVhayBiZWZvcmUgZW5kaW5nIHRoZSBncm91cCwKLSAgICUgYmVjYXVzZSB0aGUgaGVhZGxpbmUgYW5kIGZvb3RsaW5lIGFyZSBvbmx5IGVtcHR5IGluc2lkZSB0aGUgZ3JvdXAuCi0gICAlIElmIHdlIHVzZSB0aGUgbmV3IGRlZmluaXRpb24gb2YgXHBhZ2UsIHdlIGFsd2F5cyBnZXQgYSBibGFuayBwYWdlCi0gICAlIGFmdGVyIHRoZSB0aXRsZSBwYWdlLCB3aGljaCB3ZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudC4KLSAgIFxvbGRwYWdlCi0gICBcZW5kZ3JvdXAKLSAgICUKLSAgICUgSWYgdGhleSB3YW50IHNob3J0LCB0aGV5IGNlcnRhaW5seSB3YW50IGxvbmcgdG9vLgotICAgXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gICAgIFxzaG9ydGNvbnRlbnRzCi0gICAgIFxjb250ZW50cwotICAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4Ci0gICAgIFxnbG9iYWxcbGV0XGNvbnRlbnRzID0gXHJlbGF4Ci0gICBcZmkKLSAgICUKLSAgIFxpZnNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKLSAgICAgXGNvbnRlbnRzCi0gICAgIFxnbG9iYWxcbGV0XGNvbnRlbnRzID0gXHJlbGF4Ci0gICAgIFxnbG9iYWxcbGV0XHNob3J0Y29udGVudHMgPSBccmVsYXgKLSAgIFxmaQotICAgJQotICAgXEhFQURJTkdTb24KLX0KLQotXGRlZlxmaW5pc2h0aXRsZXBhZ2V7JQotICAgXHZza2lwNHB0IFxocnVsZSBoZWlnaHQgMnB0IHdpZHRoIFxoc2l6ZQotICAgXHZza2lwXHRpdGxlcGFnZWJvdHRvbWdsdWUKLSAgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKLX0KLQotJSUlIFNldCB1cCBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncy4KLQotXGxldFx0aGlzcGFnZT1cZm9saW8KLQotXG5ld3Rva3NcZXZlbmhlYWRsaW5lICAgICUgaGVhZGxpbmUgb24gZXZlbiBwYWdlcwotXG5ld3Rva3Ncb2RkaGVhZGxpbmUgICAgICUgaGVhZGxpbmUgb24gb2RkIHBhZ2VzCi1cbmV3dG9rc1xldmVuZm9vdGxpbmUgICAgJSBmb290bGluZSBvbiBldmVuIHBhZ2VzCi1cbmV3dG9rc1xvZGRmb290bGluZSAgICAgJSBmb290bGluZSBvbiBvZGQgcGFnZXMKLQotJSBOb3cgbWFrZSBUZXggdXNlIHRob3NlIHZhcmlhYmxlcwotXGhlYWRsaW5lPXt7XHRleHRmb250c1xybSBcaWZvZGRccGFnZW5vIFx0aGVcb2RkaGVhZGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZWxzZSBcdGhlXGV2ZW5oZWFkbGluZSBcZml9fQotXGZvb3RsaW5lPXt7XHRleHRmb250c1xybSBcaWZvZGRccGFnZW5vIFx0aGVcb2RkZm9vdGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZWxzZSBcdGhlXGV2ZW5mb290bGluZSBcZml9XEhFQURJTkdTaG9va30KLVxsZXRcSEVBRElOR1Nob29rPVxyZWxheAotCi0lIENvbW1hbmRzIHRvIHNldCB0aG9zZSB2YXJpYWJsZXMuCi0lIEZvciBleGFtcGxlLCB0aGlzIGlzIHdoYXQgIEBoZWFkaW5ncyBvbiAgZG9lcwotJSBAZXZlbmhlYWRpbmcgQHRoaXN0aXRsZXxAdGhpc3BhZ2V8QHRoaXNjaGFwdGVyCi0lIEBvZGRoZWFkaW5nIEB0aGlzY2hhcHRlcnxAdGhpc3BhZ2V8QHRoaXN0aXRsZQotJSBAZXZlbmZvb3RpbmcgQHRoaXNmaWxlfHwKLSUgQG9kZGZvb3RpbmcgfHxAdGhpc2ZpbGUKLQotXGRlZlxldmVuaGVhZGluZ3tccGFyc2VhcmdcZXZlbmhlYWRpbmd4eHh9Ci1cZGVmXG9kZGhlYWRpbmd7XHBhcnNlYXJnXG9kZGhlYWRpbmd4eHh9Ci1cZGVmXGV2ZXJ5aGVhZGluZ3tccGFyc2VhcmdcZXZlcnloZWFkaW5neHh4fQotCi1cZGVmXGV2ZW5mb290aW5ne1xwYXJzZWFyZ1xldmVuZm9vdGluZ3h4eH0KLVxkZWZcb2RkZm9vdGluZ3tccGFyc2Vhcmdcb2RkZm9vdGluZ3h4eH0KLVxkZWZcZXZlcnlmb290aW5ne1xwYXJzZWFyZ1xldmVyeWZvb3Rpbmd4eHh9Ci0KLXtcY2F0Y29kZWBcQD0wICUKLQotXGdkZWZcZXZlbmhlYWRpbmd4eHggIzF7XGV2ZW5oZWFkaW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQotXGdkZWZcZXZlbmhlYWRpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19Ci0KLVxnZGVmXG9kZGhlYWRpbmd4eHggIzF7XG9kZGhlYWRpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxvZGRoZWFkaW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCi1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19Ci0KLVxnZGVmXGV2ZXJ5aGVhZGluZ3h4eCMxe1xvZGRoZWFkaW5neHh4eyMxfVxldmVuaGVhZGluZ3h4eHsjMX19JQotCi1cZ2RlZlxldmVuZm9vdGluZ3h4eCAjMXtcZXZlbmZvb3Rpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxldmVuZm9vdGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KLQotXGdkZWZcb2RkZm9vdGluZ3h4eCAjMXtcb2RkZm9vdGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KLVxnZGVmXG9kZGZvb3Rpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLSAgXGdsb2JhbFxvZGRmb290bGluZSA9IHtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX0lCi0gICUKLSAgJSBMZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgZm9vdGxpbmUuICBIb3BlZnVsbHkgb2sgdG8gYXNzdW1lCi0gICUgQGV2ZW5mb290aW5nIHdpbGwgbm90IGJlIHVzZWQgYnkgaXRzZWxmLgotICBcZ2xvYmFsXGFkdmFuY2VccGFnZWhlaWdodCBieSAtXGJhc2VsaW5lc2tpcAotICBcZ2xvYmFsXGFkdmFuY2VcdnNpemUgYnkgLVxiYXNlbGluZXNraXAKLX0KLQotXGdkZWZcZXZlcnlmb290aW5neHh4IzF7XG9kZGZvb3Rpbmd4eHh7IzF9XGV2ZW5mb290aW5neHh4eyMxfX0KLSUKLX0lIHVuYmluZCB0aGUgY2F0Y29kZSBvZiBALgotCi0lIEBoZWFkaW5ncyBkb3VibGUgICAgICB0dXJucyBoZWFkaW5ncyBvbiBmb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLgotJSBAaGVhZGluZ3Mgc2luZ2xlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIHNpbmdsZS1zaWRlZCBwcmludGluZy4KLSUgQGhlYWRpbmdzIG9mZiAgICAgICAgIHR1cm5zIHRoZW0gb2ZmLgotJSBAaGVhZGluZ3Mgb24gICAgICAgICAgc2FtZSBhcyBAaGVhZGluZ3MgZG91YmxlLCByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4KLSUgQGhlYWRpbmdzIGFmdGVyICAgICAgIHR1cm5zIG9uIGRvdWJsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCi0lIEBoZWFkaW5ncyBkb3VibGVhZnRlciB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgotJSBAaGVhZGluZ3Mgc2luZ2xlYWZ0ZXIgdHVybnMgb24gc2luZ2xlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KLSUgQnkgZGVmYXVsdCwgdGhleSBhcmUgb2ZmIGF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50LAotJSBhbmQgdHVybmVkIGBvbicgYWZ0ZXIgQGVuZCB0aXRsZXBhZ2UuCi0KLVxkZWZcaGVhZGluZ3MgIzEge1xjc25hbWUgSEVBRElOR1MjMVxlbmRjc25hbWV9Ci0KLVxkZWZcSEVBRElOR1NvZmZ7Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGhmaWx9IFxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH19Ci1cSEVBRElOR1NvZmYKLSUgV2hlbiB3ZSB0dXJuIGhlYWRpbmdzIG9uLCBzZXQgdGhlIHBhZ2UgbnVtYmVyIHRvIDEuCi0lIEZvciBkb3VibGUtc2lkZWQgcHJpbnRpbmcsIHB1dCBjdXJyZW50IGZpbGUgbmFtZSBpbiBsb3dlciBsZWZ0IGNvcm5lciwKLSUgY2hhcHRlciBuYW1lIG9uIGluc2lkZSB0b3Agb2YgcmlnaHQgaGFuZCBwYWdlcywgZG9jdW1lbnQKLSUgdGl0bGUgb24gaW5zaWRlIHRvcCBvZiBsZWZ0IGhhbmQgcGFnZXMsIGFuZCBwYWdlIG51bWJlcnMgb24gb3V0c2lkZSB0b3AKLSUgZWRnZSBvZiBhbGwgcGFnZXMuCi1cZGVmXEhFQURJTkdTZG91YmxlewotXGdsb2JhbFxwYWdlbm89MQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XGZvbGlvXGhmaWxcdGhpc3RpdGxlfX0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQotfQotXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi0KLSUgRm9yIHNpbmdsZS1zaWRlZCBwcmludGluZywgY2hhcHRlciB0aXRsZSBnb2VzIGFjcm9zcyB0b3AgbGVmdCBvZiBwYWdlLAotJSBwYWdlIG51bWJlciBvbiB0b3AgcmlnaHQuCi1cZGVmXEhFQURJTkdTc2luZ2xlewotXGdsb2JhbFxwYWdlbm89MQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotfQotXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU2RvdWJsZX0KLQotXGRlZlxIRUFESU5HU2FmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU2RvdWJsZXh9Ci1cbGV0XEhFQURJTkdTZG91YmxlYWZ0ZXI9XEhFQURJTkdTYWZ0ZXIKLVxkZWZcSEVBRElOR1Nkb3VibGV4eyUKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1xmb2xpb1xoZmlsXHRoaXN0aXRsZX19Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKLX0KLQotXGRlZlxIRUFESU5HU3NpbmdsZWFmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU3NpbmdsZXh9Ci1cZGVmXEhFQURJTkdTc2luZ2xleHslCi1cZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi19Ci0KLSUgU3Vicm91dGluZXMgdXNlZCBpbiBnZW5lcmF0aW5nIGhlYWRpbmdzCi0lIFByb2R1Y2VzIERheSBNb250aCBZZWFyIHN0eWxlIG9mIG91dHB1dC4KLVxkZWZcdG9kYXl7XG51bWJlclxkYXlcc3BhY2UKLVxpZmNhc2VcbW9udGhcb3IKLUphbnVhcnlcb3IgRmVicnVhcnlcb3IgTWFyY2hcb3IgQXByaWxcb3IgTWF5XG9yIEp1bmVcb3IKLUp1bHlcb3IgQXVndXN0XG9yIFNlcHRlbWJlclxvciBPY3RvYmVyXG9yIE5vdmVtYmVyXG9yIERlY2VtYmVyXGZpCi1cc3BhY2VcbnVtYmVyXHllYXJ9Ci0KLSUgVXNlIHRoaXMgaWYgeW91IHdhbnQgdGhlIE1vbnRoIERheSwgWWVhciBzdHlsZSBvZiBvdXRwdXQuCi0lXGRlZlx0b2RheXtcaWZjYXNlXG1vbnRoXG9yCi0lSmFudWFyeVxvciBGZWJydWFyeVxvciBNYXJjaFxvciBBcHJpbFxvciBNYXlcb3IgSnVuZVxvcgotJUp1bHlcb3IgQXVndXN0XG9yIFNlcHRlbWJlclxvciBPY3RvYmVyXG9yIE5vdmVtYmVyXG9yIERlY2VtYmVyXGZpCi0lXHNwYWNlXG51bWJlclxkYXksIFxudW1iZXJceWVhcn0KLQotJSBAc2V0dGl0bGUgbGluZS4uLiAgc3BlY2lmaWVzIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQsIGZvciBoZWFkaW5ncwotJSBJdCBnZW5lcmF0ZXMgbm8gb3V0cHV0IG9mIGl0cyBvd24KLQotXGRlZlx0aGlzdGl0bGV7Tm8gVGl0bGV9Ci1cZGVmXHNldHRpdGxle1xwYXJzZWFyZ1xzZXR0aXRsZXp6en0KLVxkZWZcc2V0dGl0bGV6enogIzF7XGdkZWZcdGhpc3RpdGxleyMxfX0KLQotCi1cbWVzc2FnZXt0YWJsZXMsfQotJSBUYWJsZXMgLS0gQHRhYmxlLCBAZnRhYmxlLCBAdnRhYmxlLCBAaXRlbSh4KSwgQGtpdGVtKHgpLCBAeGl0ZW0oeCkuCi0KLSUgZGVmYXVsdCBpbmRlbnRhdGlvbiBvZiB0YWJsZSB0ZXh0Ci1cbmV3ZGltZW5cdGFibGVpbmRlbnQgXHRhYmxlaW5kZW50PS44aW4KLSUgZGVmYXVsdCBpbmRlbnRhdGlvbiBvZiBAaXRlbWl6ZSBhbmQgQGVudW1lcmF0ZSB0ZXh0Ci1cbmV3ZGltZW5caXRlbWluZGVudCAgXGl0ZW1pbmRlbnQ9LjNpbgotJSBtYXJnaW4gYmV0d2VlbiBlbmQgb2YgdGFibGUgaXRlbSBhbmQgc3RhcnQgb2YgdGFibGUgdGV4dC4KLVxuZXdkaW1lblxpdGVtbWFyZ2luICBcaXRlbW1hcmdpbj0uMWluCi0KLSUgdXNlZCBpbnRlcm5hbGx5IGZvciBcaXRlbWluZGVudCBtaW51cyBcaXRlbW1hcmdpbgotXG5ld2RpbWVuXGl0ZW1tYXgKLQotJSBOb3RlIEB0YWJsZSwgQHZ0YWJsZSwgYW5kIEB2dGFibGUgZGVmaW5lIEBpdGVtLCBAaXRlbXgsIGV0Yy4sIHdpdGgKLSUgdGhlc2UgZGVmcy4KLSUgVGhleSBhbHNvIGRlZmluZSBcaXRlbWluZGV4Ci0lIHRvIGluZGV4IHRoZSBpdGVtIG5hbWUgaW4gd2hhdGV2ZXIgbWFubmVyIGlzIGRlc2lyZWQgKHBlcmhhcHMgbm9uZSkuCi0KLVxuZXdpZlxpZml0ZW14bmVlZHNuZWdhdGl2ZXZza2lwCi0KLVxkZWZcaXRlbXhwYXJ7XHBhclxpZml0ZW14bmVlZHNuZWdhdGl2ZXZza2lwXG5vYnJlYWtcdnNraXAtXHBhcnNraXBcbm9icmVha1xmaX0KLQotXGRlZlxpbnRlcm5hbEJpdGVte1xzbWFsbGJyZWFrIFxwYXJzZWFyZ1xpdGVtenp6fQotXGRlZlxpbnRlcm5hbEJpdGVteHtcaXRlbXhwYXIgXHBhcnNlYXJnXGl0ZW16enp9Ci0KLVxkZWZcaW50ZXJuYWxCeGl0ZW0gIiMxIntcZGVmXHhpdGVtc3VidG9waXh7IzF9IFxzbWFsbGJyZWFrIFxwYXJzZWFyZ1x4aXRlbXp6en0KLVxkZWZcaW50ZXJuYWxCeGl0ZW14ICIjMSJ7XGRlZlx4aXRlbXN1YnRvcGl4eyMxfSBcaXRlbXhwYXIgXHBhcnNlYXJnXHhpdGVtenp6fQotCi1cZGVmXGludGVybmFsQmtpdGVte1xzbWFsbGJyZWFrIFxwYXJzZWFyZ1xraXRlbXp6en0KLVxkZWZcaW50ZXJuYWxCa2l0ZW14e1xpdGVteHBhciBccGFyc2Vhcmdca2l0ZW16enp9Ci0KLVxkZWZca2l0ZW16enogIzF7XGRvc3ViaW5kIHtrd317XGNvZGV7IzF9fXtmb3Ige1xiZiBcbGFzdGZ1bmN0aW9ufX0lCi0gICAgICAgICAgICAgICAgIFxpdGVtenp6IHsjMX19Ci0KLVxkZWZceGl0ZW16enogIzF7XGRvc3ViaW5kIHtrd317XGNvZGV7IzF9fXtmb3Ige1xiZiBceGl0ZW1zdWJ0b3BpY319JQotICAgICAgICAgICAgICAgICBcaXRlbXp6eiB7IzF9fQotCi1cZGVmXGl0ZW16enogIzF7XGJlZ2luZ3JvdXAgJQotICBcYWR2YW5jZVxoc2l6ZSBieSAtXHJpZ2h0c2tpcAotICBcYWR2YW5jZVxoc2l6ZSBieSAtXHRhYmxlaW5kZW50Ci0gIFxzZXRib3gwPVxoYm94e1xpdGVtZm9udHsjMX19JQotICBcaXRlbWluZGV4eyMxfSUKLSAgXG5vYnJlYWsgJSBUaGlzIHByZXZlbnRzIGEgYnJlYWsgYmVmb3JlIEBpdGVteC4KLSAgJQotICAlIElmIHRoZSBpdGVtIHRleHQgZG9lcyBub3QgZml0IGluIHRoZSBzcGFjZSB3ZSBoYXZlLCBwdXQgaXQgb24gYSBsaW5lCi0gICUgYnkgaXRzZWxmLCBhbmQgZG8gbm90IGFsbG93IGEgcGFnZSBicmVhayBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoYXQKLSAgJSBsaW5lLiAgV2UgZG8gbm90IHN0YXJ0IGEgcGFyYWdyYXBoIGhlcmUgYmVjYXVzZSB0aGVuIGlmIHRoZSBuZXh0Ci0gICUgY29tbWFuZCBpcywgZS5nLiwgQGtpbmRleCwgdGhlIHdoYXRzaXQgd291bGQgZ2V0IHB1dCBpbnRvIHRoZQotICAlIGhvcml6b250YWwgbGlzdCBvbiBhIGxpbmUgYnkgaXRzZWxmLCByZXN1bHRpbmcgaW4gZXh0cmEgYmxhbmsgc3BhY2UuCi0gIFxpZmRpbSBcd2QwPlxpdGVtbWF4Ci0gICAgJQotICAgICUgTWFrZSB0aGlzIGEgcGFyYWdyYXBoIHNvIHdlIGdldCB0aGUgXHBhcnNraXAgZ2x1ZSBhbmQgd3JhcHBpbmcsCi0gICAgJSBidXQgbGVhdmUgaXQgcmFnZ2VkLXJpZ2h0LgotICAgIFxiZWdpbmdyb3VwCi0gICAgICBcYWR2YW5jZVxsZWZ0c2tpcCBieS1cdGFibGVpbmRlbnQKLSAgICAgIFxhZHZhbmNlXGhzaXplIGJ5XHRhYmxlaW5kZW50Ci0gICAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkwcHQgcGx1czFmaWwKLSAgICAgIFxsZWF2ZXZtb2RlXHVuaGJveDBccGFyCi0gICAgXGVuZGdyb3VwCi0gICAgJQotICAgICUgV2UncmUgZ29pbmcgdG8gYmUgc3RhcnRpbmcgYSBwYXJhZ3JhcGgsIGJ1dCB3ZSBkb24ndCB3YW50IHRoZQotICAgICUgXHBhcnNraXAgZ2x1ZSAtLSBsb2dpY2FsbHkgaXQncyBwYXJ0IG9mIHRoZSBAaXRlbSB3ZSBqdXN0IHN0YXJ0ZWQuCi0gICAgXG5vYnJlYWsgXHZza2lwLVxwYXJza2lwCi0gICAgJQotICAgICUgU3RvcCBhIHBhZ2UgYnJlYWsgYXQgdGhlIFxwYXJza2lwIGdsdWUgY29taW5nIHVwLiAgVW5mb3J0dW5hdGVseQotICAgICUgd2UgY2FuJ3QgcHJldmVudCBhIHBvc3NpYmxlIHBhZ2UgYnJlYWsgYXQgdGhlIGZvbGxvd2luZwotICAgICUgXGJhc2VsaW5lc2tpcCBnbHVlLgotICAgIFxub2JyZWFrCi0gICAgXGVuZGdyb3VwCi0gICAgXGl0ZW14bmVlZHNuZWdhdGl2ZXZza2lwZmFsc2UKLSAgXGVsc2UKLSAgICAlIFRoZSBpdGVtIHRleHQgZml0cyBpbnRvIHRoZSBzcGFjZS4gIFN0YXJ0IGEgcGFyYWdyYXBoLCBzbyB0aGF0IHRoZQotICAgICUgZm9sbG93aW5nIHRleHQgKGlmIGFueSkgd2lsbCBlbmQgdXAgb24gdGhlIHNhbWUgbGluZS4gIAotICAgIFxub2luZGVudAotICAgICUgRG8gdGhpcyB3aXRoIGtlcm5zIGFuZCBcdW5oYm94IHNvIHRoYXQgaWYgdGhlcmUgaXMgYSBmb290bm90ZSBpbgotICAgICUgdGhlIGl0ZW0gdGV4dCwgaXQgY2FuIG1pZ3JhdGUgdG8gdGhlIG1haW4gdmVydGljYWwgbGlzdCBhbmQKLSAgICAlIGV2ZW50dWFsbHkgYmUgcHJpbnRlZC4KLSAgICBcbm9icmVha1xrZXJuLVx0YWJsZWluZGVudAotICAgIFxkaW1lbjAgPSBcaXRlbW1heCAgXGFkdmFuY2VcZGltZW4wIGJ5IFxpdGVtbWFyZ2luIFxhZHZhbmNlXGRpbWVuMCBieSAtXHdkMAotICAgIFx1bmhib3gwCi0gICAgXG5vYnJlYWtca2VyblxkaW1lbjAKLSAgICBcZW5kZ3JvdXAKLSAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXB0cnVlCi0gIFxmaQotfQotCi1cZGVmXGl0ZW17XGVycm1lc3NhZ2V7QGl0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxpdGVteHtcZXJybWVzc2FnZXtAaXRlbXggd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxraXRlbXtcZXJybWVzc2FnZXtAa2l0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxraXRlbXh7XGVycm1lc3NhZ2V7QGtpdGVteCB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXHhpdGVte1xlcnJtZXNzYWdle0B4aXRlbSB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXHhpdGVteHtcZXJybWVzc2FnZXtAeGl0ZW14IHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLQotJSBDb250YWlucyBhIGtsdWRnZSB0byBnZXQgQGVuZFtkZXNjcmlwdGlvbl0gdG8gd29yay4KLVxkZWZcZGVzY3JpcHRpb257XHRhYmxlentcZG9udGluZGV4fXsxfXt9e317fXt9fQotCi0lIEB0YWJsZSwgQGZ0YWJsZSwgQHZ0YWJsZS4KLVxkZWZcdGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcdGFibGV4fQote1xvYmV5bGluZXNcb2JleXNwYWNlcyUKLVxnZGVmXHRhYmxleCAjMV5eTXslCi1cdGFibGV5XGRvbnRpbmRleCMxICAgICAgICBcZW5kdGFibGV5fX0KLQotXGRlZlxmdGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcZnRhYmxleH0KLXtcb2JleWxpbmVzXG9iZXlzcGFjZXMlCi1cZ2RlZlxmdGFibGV4ICMxXl5NeyUKLVx0YWJsZXlcZm5pdGVtaW5kZXgjMSAgICAgICAgXGVuZHRhYmxleQotXGRlZlxFZnRhYmxle1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGxldFxFdGFibGU9XHJlbGF4fX0KLQotXGRlZlx2dGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcdnRhYmxleH0KLXtcb2JleWxpbmVzXG9iZXlzcGFjZXMlCi1cZ2RlZlx2dGFibGV4ICMxXl5NeyUKLVx0YWJsZXlcdnJpdGVtaW5kZXgjMSAgICAgICAgXGVuZHRhYmxleQotXGRlZlxFdnRhYmxle1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGxldFxFdGFibGU9XHJlbGF4fX0KLQotXGRlZlxkb250aW5kZXggIzF7fQotXGRlZlxmbml0ZW1pbmRleCAjMXtcZG9pbmQge2ZufXtcY29kZXsjMX19fSUKLVxkZWZcdnJpdGVtaW5kZXggIzF7XGRvaW5kIHt2cn17XGNvZGV7IzF9fX0lCi0KLXtcb2JleXNwYWNlcyAlCi1cZ2RlZlx0YWJsZXkjMSMyICMzICM0ICM1ICM2ICM3XGVuZHRhYmxleXtcZW5kZ3JvdXAlCi1cdGFibGV6eyMxfXsjMn17IzN9eyM0fXsjNX17IzZ9fX0KLQotXGRlZlx0YWJsZXogIzEjMiMzIzQjNSM2eyUKLVxhYm92ZWVudmJyZWFrICUKLVxiZWdpbmdyb3VwICUKLVxkZWZcRWRlc2NyaXB0aW9ue1xFdGFibGV9JSBOZWNlc3Nhcnkga2x1ZGdlLgotXGxldFxpdGVtaW5kZXg9IzElCi1caWZudW0gMCMzPjAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5ICMzXG1pbCBcZmkgJQotXGlmbnVtIDAjND4wIFx0YWJsZWluZGVudD0jNFxtaWwgXGZpICUKLVxpZm51bSAwIzU+MCBcYWR2YW5jZSBccmlnaHRza2lwIGJ5ICM1XG1pbCBcZmkgJQotXGRlZlxpdGVtZm9udHsjMn0lCi1caXRlbW1heD1cdGFibGVpbmRlbnQgJQotXGFkdmFuY2UgXGl0ZW1tYXggYnkgLVxpdGVtbWFyZ2luICUKLVxhZHZhbmNlIFxsZWZ0c2tpcCBieSBcdGFibGVpbmRlbnQgJQotXGV4ZGVudGFtb3VudD1cdGFibGVpbmRlbnQKLVxwYXJpbmRlbnQgPSAwcHQKLVxwYXJza2lwID0gXHNtYWxsc2tpcGFtb3VudAotXGlmZGltIFxwYXJza2lwPTBwdCBccGFyc2tpcD0ycHQgXGZpJQotXGRlZlxFdGFibGV7XGVuZGdyYWZcYWZ0ZXJlbnZicmVha1xlbmRncm91cH0lCi1cbGV0XGl0ZW0gPSBcaW50ZXJuYWxCaXRlbSAlCi1cbGV0XGl0ZW14ID0gXGludGVybmFsQml0ZW14ICUKLVxsZXRca2l0ZW0gPSBcaW50ZXJuYWxCa2l0ZW0gJQotXGxldFxraXRlbXggPSBcaW50ZXJuYWxCa2l0ZW14ICUKLVxsZXRceGl0ZW0gPSBcaW50ZXJuYWxCeGl0ZW0gJQotXGxldFx4aXRlbXggPSBcaW50ZXJuYWxCeGl0ZW14ICUKLX0KLQotJSBUaGlzIGlzIHRoZSBjb3VudGVyIHVzZWQgYnkgQGVudW1lcmF0ZSwgd2hpY2ggaXMgcmVhbGx5IEBpdGVtaXplCi0KLVxuZXdjb3VudCBcaXRlbW5vCi0KLVxkZWZcaXRlbWl6ZXtccGFyc2VhcmdcaXRlbWl6ZXp6en0KLQotXGRlZlxpdGVtaXplenp6ICMxeyUKLSAgXGJlZ2luZ3JvdXAgJSBlbmRlZCBieSB0aGUgQGVuZCBpdGVtaXplCi0gIFxpdGVtaXpleSB7IzF9e1xFaXRlbWl6ZX0KLX0KLQotXGRlZlxpdGVtaXpleSAjMSMyeyUKLVxhYm92ZWVudmJyZWFrICUKLVxpdGVtbWF4PVxpdGVtaW5kZW50ICUKLVxhZHZhbmNlIFxpdGVtbWF4IGJ5IC1caXRlbW1hcmdpbiAlCi1cYWR2YW5jZSBcbGVmdHNraXAgYnkgXGl0ZW1pbmRlbnQgJQotXGV4ZGVudGFtb3VudD1caXRlbWluZGVudAotXHBhcmluZGVudCA9IDBwdCAlCi1ccGFyc2tpcCA9IFxzbWFsbHNraXBhbW91bnQgJQotXGlmZGltIFxwYXJza2lwPTBwdCBccGFyc2tpcD0ycHQgXGZpJQotXGRlZiMye1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGRlZlxpdGVtY29udGVudHN7IzF9JQotXGxldFxpdGVtPVxpdGVtaXplaXRlbX0KLQotJSBTZXQgc2Zjb2RlIHRvIG5vcm1hbCBmb3IgdGhlIGNoYXJzIHRoYXQgdXN1YWxseSBoYXZlIGFub3RoZXIgdmFsdWUuCi0lIFRoZXNlIGFyZSBgLj8hOjssJwotXGRlZlxmcmVuY2hzcGFjaW5ne1xzZmNvZGU0Nj0xMDAwIFxzZmNvZGU2Mz0xMDAwIFxzZmNvZGUzMz0xMDAwCi0gIFxzZmNvZGU1OD0xMDAwIFxzZmNvZGU1OT0xMDAwIFxzZmNvZGU0ND0xMDAwIH0KLQotJSBcc3BsaXRvZmYgVE9LRU5TXGVuZG1hcmsgZGVmaW5lcyBcZmlyc3QgdG8gYmUgdGhlIGZpcnN0IHRva2VuIGluCi0lIFRPS0VOUywgYW5kIFxyZXN0IHRvIGJlIHRoZSByZW1haW5kZXIuCi0lCi1cZGVmXHNwbGl0b2ZmIzEjMlxlbmRtYXJre1xkZWZcZmlyc3R7IzF9XGRlZlxyZXN0eyMyfX0lCi0KLSUgQWxsb3cgYW4gb3B0aW9uYWwgYXJndW1lbnQgb2YgYW4gdXBwZXJjYXNlIGxldHRlciwgbG93ZXJjYXNlIGxldHRlciwKLSUgb3IgbnVtYmVyLCB0byBzcGVjaWZ5IHRoZSBmaXJzdCBsYWJlbCBpbiB0aGUgZW51bWVyYXRlZCBsaXN0LiAgTm8KLSUgYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMgYDEnLgotJQotXGRlZlxlbnVtZXJhdGV7XHBhcnNlYXJnXGVudW1lcmF0ZXp6en0KLVxkZWZcZW51bWVyYXRlenp6ICMxe1xlbnVtZXJhdGV5ICMxICBcZW5kZW51bWVyYXRleX0KLVxkZWZcZW51bWVyYXRleSAjMSAjMlxlbmRlbnVtZXJhdGV5eyUKLSAgXGJlZ2luZ3JvdXAgJSBlbmRlZCBieSB0aGUgQGVuZCBlbnVtZXJhdGUKLSAgJQotICAlIElmIHdlIHdlcmUgZ2l2ZW4gbm8gYXJndW1lbnQsIHByZXRlbmQgd2Ugd2VyZSBnaXZlbiBgMScuCi0gIFxkZWZcdGhlYXJneyMxfSUKLSAgXGlmeFx0aGVhcmdcZW1wdHkgXGRlZlx0aGVhcmd7MX1cZmkKLSAgJQotICAlIERldGVjdCBpZiB0aGUgYXJndW1lbnQgaXMgYSBzaW5nbGUgdG9rZW4uICBJZiBzbywgaXQgbWlnaHQgYmUgYQotICAlIGxldHRlci4gIE90aGVyd2lzZSwgdGhlIG9ubHkgdmFsaWQgdGhpbmcgaXQgY2FuIGJlIGlzIGEgbnVtYmVyLgotICAlIChXZSB3aWxsIGFsd2F5cyBoYXZlIG9uZSB0b2tlbiwgYmVjYXVzZSBvZiB0aGUgdGVzdCB3ZSBqdXN0IG1hZGUuCi0gICUgVGhpcyBpcyBhIGdvb2QgdGhpbmcsIHNpbmNlIFxzcGxpdG9mZiBkb2Vzbid0IHdvcmsgZ2l2ZW4gbm90aGluZyBhdAotICAlIGFsbCAtLSB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHVuZGVsaW1pdGVkLikKLSAgXGV4cGFuZGFmdGVyXHNwbGl0b2ZmXHRoZWFyZ1xlbmRtYXJrCi0gIFxpZnhccmVzdFxlbXB0eQotICAgICUgT25seSBvbmUgdG9rZW4gaW4gdGhlIGFyZ3VtZW50LiAgSXQgY291bGQgc3RpbGwgYmUgYW55dGhpbmcuCi0gICAgJSBBIGBgbG93ZXJjYXNlIGxldHRlcicnIGlzIG9uZSB3aG9zZSBcbGNjb2RlIGlzIG5vbnplcm8uCi0gICAgJSBBbiBgYHVwcGVyY2FzZSBsZXR0ZXInJyBpcyBvbmUgd2hvc2UgXGxjY29kZSBpcyBib3RoIG5vbnplcm8sIGFuZAotICAgICUgICBub3QgZXF1YWwgdG8gaXRzZWxmLgotICAgICUgT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgaXQncyBhIG51bWJlci4KLSAgICAlCi0gICAgJSBXZSBuZWVkIHRoZSBccmVsYXggYXQgdGhlIGVuZCBvZiB0aGUgXGlmbnVtIGxpbmVzIHRvIHN0b3AgVGVYIGZyb20KLSAgICAlIGNvbnRpbnVpbmcgdG8gbG9vayBmb3IgYSA8bnVtYmVyPi4KLSAgICAlCi0gICAgXGlmbnVtXGxjY29kZVxleHBhbmRhZnRlcmBcdGhlYXJnPTBccmVsYXgKLSAgICAgIFxudW1lcmljZW51bWVyYXRlICUgYSBudW1iZXIgKHdlIGhvcGUpCi0gICAgXGVsc2UKLSAgICAgICUgSXQncyBhIGxldHRlci4KLSAgICAgIFxpZm51bVxsY2NvZGVcZXhwYW5kYWZ0ZXJgXHRoZWFyZz1cZXhwYW5kYWZ0ZXJgXHRoZWFyZ1xyZWxheAotICAgICAgICBcbG93ZXJjYXNlZW51bWVyYXRlICUgbG93ZXJjYXNlIGxldHRlcgotICAgICAgXGVsc2UKLSAgICAgICAgXHVwcGVyY2FzZWVudW1lcmF0ZSAlIHVwcGVyY2FzZSBsZXR0ZXIKLSAgICAgIFxmaQotICAgIFxmaQotICBcZWxzZQotICAgICUgTXVsdGlwbGUgdG9rZW5zIGluIHRoZSBhcmd1bWVudC4gIFdlIGhvcGUgaXQncyBhIG51bWJlci4KLSAgICBcbnVtZXJpY2VudW1lcmF0ZQotICBcZmkKLX0KLQotJSBBbiBAZW51bWVyYXRlIHdob3NlIGxhYmVscyBhcmUgaW50ZWdlcnMuICBUaGUgc3RhcnRpbmcgaW50ZWdlciBpcwotJSBnaXZlbiBpbiBcdGhlYXJnLgotJQotXGRlZlxudW1lcmljZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFx0aGVhcmcKLSAgXHN0YXJ0ZW51bWVyYXRpb257XHRoZVxpdGVtbm99JQotfQotCi0lIFRoZSBzdGFydGluZyAobG93ZXJjYXNlKSBsZXR0ZXIgaXMgaW4gXHRoZWFyZy4KLVxkZWZcbG93ZXJjYXNlZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFxleHBhbmRhZnRlcmBcdGhlYXJnCi0gIFxzdGFydGVudW1lcmF0aW9ueyUKLSAgICAlIEJlIHN1cmUgd2UncmUgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhbHBoYWJldC4KLSAgICBcaWZudW1caXRlbW5vPTAKLSAgICAgIFxlcnJtZXNzYWdle05vIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMgaW4gQGVudW1lcmF0ZTsgZ2V0IGEgYmlnZ2VyCi0gICAgICAgICAgICAgICAgICBhbHBoYWJldH0lCi0gICAgXGZpCi0gICAgXGNoYXJcbGNjb2RlXGl0ZW1ubwotICB9JQotfQotCi0lIFRoZSBzdGFydGluZyAodXBwZXJjYXNlKSBsZXR0ZXIgaXMgaW4gXHRoZWFyZy4KLVxkZWZcdXBwZXJjYXNlZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFxleHBhbmRhZnRlcmBcdGhlYXJnCi0gIFxzdGFydGVudW1lcmF0aW9ueyUKLSAgICAlIEJlIHN1cmUgd2UncmUgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhbHBoYWJldC4KLSAgICBcaWZudW1caXRlbW5vPTAKLSAgICAgIFxlcnJtZXNzYWdle05vIG1vcmUgdXBwZXJjYXNlIGxldHRlcnMgaW4gQGVudW1lcmF0ZTsgZ2V0IGEgYmlnZ2VyCi0gICAgICAgICAgICAgICAgICBhbHBoYWJldH0KLSAgICBcZmkKLSAgICBcY2hhclx1Y2NvZGVcaXRlbW5vCi0gIH0lCi19Ci0KLSUgQ2FsbCBpdGVtaXpleSwgYWRkaW5nIGEgcGVyaW9kIHRvIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgc3VwcGx5aW5nIHRoZQotJSBjb21tb24gbGFzdCB0d28gYXJndW1lbnRzLiAgQWxzbyBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgaW5pdGlhbCB2YWx1ZSBpbgotJSBcaXRlbW5vLCBzaW5jZSBAaXRlbSBpbmNyZW1lbnRzIFxpdGVtbm8uCi0lCi1cZGVmXHN0YXJ0ZW51bWVyYXRpb24jMXslCi0gIFxhZHZhbmNlXGl0ZW1ubyBieSAtMQotICBcaXRlbWl6ZXl7IzEufVxFZW51bWVyYXRlXGZsdXNoY3IKLX0KLQotJSBAYWxwaGFlbnVtZXJhdGUgYW5kIEBjYXBzZW51bWVyYXRlIGFyZSBhYmJyZXZpYXRpb25zIGZvciBnaXZpbmcgYW4gYXJnCi0lIHRvIEBlbnVtZXJhdGUuCi0lCi1cZGVmXGFscGhhZW51bWVyYXRle1xlbnVtZXJhdGV7YX19Ci1cZGVmXGNhcHNlbnVtZXJhdGV7XGVudW1lcmF0ZXtBfX0KLVxkZWZcRWFscGhhZW51bWVyYXRle1xFZW51bWVyYXRlfQotXGRlZlxFY2Fwc2VudW1lcmF0ZXtcRWVudW1lcmF0ZX0KLQotJSBEZWZpbml0aW9uIG9mIEBpdGVtIHdoaWxlIGluc2lkZSBAaXRlbWl6ZS4KLQotXGRlZlxpdGVtaXplaXRlbXslCi1cYWR2YW5jZVxpdGVtbm8gYnkgMQote1xsZXRccGFyPVxlbmRncmFmIFxzbWFsbGJyZWFrfSUKLVxpZmhtb2RlIFxlcnJtZXNzYWdle0luIGhtb2RlIGF0IGl0ZW1pemVpdGVtfVxmaQote1xwYXJza2lwPTBpbiBcaHNraXAgMHB0Ci1caGJveCB0byAwcHR7XGhzcyBcaXRlbWNvbnRlbnRzXGhza2lwIFxpdGVtbWFyZ2lufSUKLVx2YWRqdXN0e1xwZW5hbHR5IDEyMDB9fSUKLVxmbHVzaGNyfQotCi0lIEBtdWx0aXRhYmxlIG1hY3JvcwotJSBBbXkgSGVuZHJpY2tzb24sIDgvMTgvOTQsIDMvNi85NgotJQotJSBAbXVsdGl0YWJsZSAuLi4gQGVuZCBtdWx0aXRhYmxlIHdpbGwgbWFrZSBhcyBtYW55IGNvbHVtbnMgYXMgZGVzaXJlZC4KLSUgQ29udGVudHMgb2YgZWFjaCBjb2x1bW4gd2lsbCB3cmFwIGF0IHdpZHRoIGdpdmVuIGluIHByZWFtYmxlLiAgV2lkdGgKLSUgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgd2l0aCBzYW1wbGUgdGV4dCBnaXZlbiBpbiBhIHRlbXBsYXRlIGxpbmUsCi0lIG9yIGluIHBlcmNlbnQgb2YgXGhzaXplLCB0aGUgY3VycmVudCB3aWR0aCBvZiB0ZXh0IG9uIHBhZ2UuCi0KLSUgVGFibGUgY2FuIGNvbnRpbnVlIG92ZXIgcGFnZXMgYnV0IHdpbGwgb25seSBicmVhayBiZXR3ZWVuIGxpbmVzLgotCi0lIFRvIG1ha2UgcHJlYW1ibGU6Ci0lCi0lIEVpdGhlciBkZWZpbmUgd2lkdGhzIG9mIGNvbHVtbnMgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemU6Ci0lICAgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMjUgLjMgLjQ1Ci0lICAgQGl0ZW0gLi4uCi0lCi0lICAgTnVtYmVycyBmb2xsb3dpbmcgQGNvbHVtbmZyYWN0aW9ucyBhcmUgdGhlIHBlcmNlbnQgb2YgdGhlIHRvdGFsCi0lICAgY3VycmVudCBoc2l6ZSB0byBiZSB1c2VkIGZvciBlYWNoIGNvbHVtbi4gWW91IG1heSB1c2UgYXMgbWFueQotJSAgIGNvbHVtbnMgYXMgZGVzaXJlZC4KLQotCi0lIE9yIHVzZSBhIHRlbXBsYXRlOgotJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9Ci0lICAgQGl0ZW0gLi4uCi0lICAgdXNpbmcgdGhlIHdpZGVzdCB0ZXJtIGRlc2lyZWQgaW4gZWFjaCBjb2x1bW4uCi0lCi0lIEZvciB0aG9zZSB3aG8gd2FudCB0byB1c2UgbW9yZSB0aGFuIG9uZSBsaW5lJ3Mgd29ydGggb2Ygd29yZHMgaW4KLSUgdGhlIHByZWFtYmxlLCBicmVhayB0aGUgbGluZSB3aXRoaW4gb25lIGFyZ3VtZW50IGFuZCBpdAotJSB3aWxsIHBhcnNlIGNvcnJlY3RseSwgaS5lLiwKLSUKLSUgICAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMKLSUgICAgICB0ZW1wbGF0ZX0KLSUgTm90OgotJSAgICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9Ci0lICAgICAge0NvbHVtbiAzIHRlbXBsYXRlfQotCi0lIEVhY2ggbmV3IHRhYmxlIGxpbmUgc3RhcnRzIHdpdGggQGl0ZW0sIGVhY2ggc3Vic2VxdWVudCBuZXcgY29sdW1uCi0lIHN0YXJ0cyB3aXRoIEB0YWIuIEVtcHR5IGNvbHVtbnMgbWF5IGJlIHByb2R1Y2VkIGJ5IHN1cHBseWluZyBAdGFiJ3MKLSUgd2l0aCBub3RoaW5nIGJldHdlZW4gdGhlbSBmb3IgYXMgbWFueSB0aW1lcyBhcyBlbXB0eSBjb2x1bW5zIGFyZSBuZWVkZWQsCi0lIGllLCBAdGFiQHRhYkB0YWIgd2lsbCBwcm9kdWNlIHR3byBlbXB0eSBjb2x1bW5zLgotCi0lIEBpdGVtLCBAdGFiLCBAbXVsdGl0YWJsZSBvciBAZW5kIG11bHRpdGFibGUgZG8gbm90IG5lZWQgdG8gYmUgb24gdGhlaXIKLSUgb3duIGxpbmVzLCBidXQgaXQgd2lsbCBub3QgaHVydCBpZiB0aGV5IGFyZS4KLQotJSBTYW1wbGUgbXVsdGl0YWJsZToKLQotJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9Ci0lICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZiBAdGFiIHRoaXJkIGNvbAotJSAgIEBpdGVtCi0lICAgZmlyc3QgY29sIHN0dWZmCi0lICAgQHRhYgotJSAgIHNlY29uZCBjb2wgc3R1ZmYKLSUgICBAdGFiCi0lICAgdGhpcmQgY29sCi0lICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZgotJSAgIEB0YWIgTWFueSBwYXJhZ3JhcGhzIG9mIHRleHQgbWF5IGJlIHVzZWQgaW4gYW55IGNvbHVtbi4KLSUKLSUgICAgICAgICBUaGV5IHdpbGwgd3JhcCBhdCB0aGUgd2lkdGggZGV0ZXJtaW5lZCBieSB0aGUgdGVtcGxhdGUuCi0lICAgQGl0ZW1AdGFiQHRhYiBUaGlzIHdpbGwgYmUgaW4gdGhpcmQgY29sdW1uLgotJSAgIEBlbmQgbXVsdGl0YWJsZQotCi0lIERlZmF1bHQgZGltZW5zaW9ucyBtYXkgYmUgcmVzZXQgYnkgdXNlci4KLSUgQG11bHRpdGFibGVwYXJza2lwIGlzIHZlcnRpY2FsIHNwYWNlIGJldHdlZW4gcGFyYWdyYXBocyBpbiB0YWJsZS4KLSUgQG11bHRpdGFibGVwYXJpbmRlbnQgaXMgcGFyYWdyYXBoIGluZGVudCBpbiB0YWJsZS4KLSUgQG11bHRpdGFibGVjb2xtYXJnaW4gaXMgaG9yaXpvbnRhbCBzcGFjZSB0byBiZSBsZWZ0IGJldHdlZW4gY29sdW1ucy4KLSUgQG11bHRpdGFibGVsaW5lc3BhY2UgaXMgc3BhY2UgdG8gbGVhdmUgYmV0d2VlbiB0YWJsZSBpdGVtcywgYmFzZWxpbmUKLSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiYXNlbGluZS4KLSUgICAwcHQgbWVhbnMgaXQgZGVwZW5kcyBvbiBjdXJyZW50IG5vcm1hbCBsaW5lIHNwYWNpbmcuCi0lCi1cbmV3c2tpcFxtdWx0aXRhYmxlcGFyc2tpcAotXG5ld3NraXBcbXVsdGl0YWJsZXBhcmluZGVudAotXG5ld2RpbWVuXG11bHRpdGFibGVjb2xzcGFjZQotXG5ld3NraXBcbXVsdGl0YWJsZWxpbmVzcGFjZQotXG11bHRpdGFibGVwYXJza2lwPTBwdAotXG11bHRpdGFibGVwYXJpbmRlbnQ9NnB0Ci1cbXVsdGl0YWJsZWNvbHNwYWNlPTEycHQKLVxtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAotCi0lIE1hY3JvcyB1c2VkIHRvIHNldCB1cCBoYWxpZ24gcHJlYW1ibGU6Ci0lIAotXGxldFxlbmRzZXR1cHRhYmxlXHJlbGF4Ci1cZGVmXHhlbmRzZXR1cHRhYmxle1xlbmRzZXR1cHRhYmxlfQotXGxldFxjb2x1bW5mcmFjdGlvbnNccmVsYXgKLVxkZWZceGNvbHVtbmZyYWN0aW9uc3tcY29sdW1uZnJhY3Rpb25zfQotXG5ld2lmXGlmc2V0cGVyY2VudAotCi0lIDIvMS85NiwgdG8gYWxsb3cgZnJhY3Rpb25zIHRvIGJlIGdpdmVuIHdpdGggbW9yZSB0aGFuIG9uZSBkaWdpdC4KLVxkZWZccGlja3Vwd2hvbGVmcmFjdGlvbiMxIHtcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkxICUKLVxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZXsuIzFcaHNpemV9JQotXHNldHVwdGFibGV9Ci0KLVxuZXdjb3VudFxjb2xjb3VudAotXGRlZlxzZXR1cHRhYmxlIzF7XGRlZlxmaXJzdGFyZ3sjMX0lCi1caWZ4XGZpcnN0YXJnXHhlbmRzZXR1cHRhYmxlXGxldFxnb1xyZWxheCUKLVxlbHNlCi0gIFxpZnhcZmlyc3RhcmdceGNvbHVtbmZyYWN0aW9uc1xnbG9iYWxcc2V0cGVyY2VudHRydWUlCi0gIFxlbHNlCi0gICAgXGlmc2V0cGVyY2VudAotICAgICAgIFxsZXRcZ29ccGlja3Vwd2hvbGVmcmFjdGlvbiAgICUgSW4gdGhpcyBjYXNlIGFyZyBvZiBzZXR1cHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBpcyB0aGUgZGVjaW1hbCBwb2ludCBiZWZvcmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBudW1iZXIgZ2l2ZW4gaW4gcGVyY2VudCBvZiBoc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIFdlIGRvbid0IG5lZWQgdGhpcyBzbyB3ZSBkb24ndCB1c2UgaXQuCi0gICAgXGVsc2UKLSAgICAgICBcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkxCi0gICAgICAgXHNldGJveDA9XGhib3h7IzEgfSUgQWRkIGEgbm9ybWFsIHdvcmQgc3BhY2UgYXMgYSBzZXBhcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICUgdHlwaWNhbGx5IHRoYXQgaXMgYWx3YXlzIGluIHRoZSBpbnB1dCwgYW55d2F5LgotICAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZXtcdGhlXHdkMH0lCi0gICAgXGZpJQotICBcZmklCi1caWZ4XGdvXHBpY2t1cHdob2xlZnJhY3Rpb25cZWxzZVxsZXRcZ29cc2V0dXB0YWJsZVxmaSUKLVxmaVxnb30KLQotJSBtdWx0aXRhYmxlIHN5bnRheAotXGRlZlx0YWJ7Jlxoc2tpcDFzcFxyZWxheH0gJSAyLzIvOTYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdGlueSBza2lwIGhlcmUgbWFrZXMgc3VyZSB0aGlzIGNvbHVtbiBzcGFjZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBtYWludGFpbmVkLCBldmVuIGlmIGl0IGlzIG5ldmVyIHVzZWQuCi0KLSUgQG11bHRpdGFibGUgLi4uIEBlbmQgbXVsdGl0YWJsZSBkZWZpbml0aW9uczoKLQotXGRlZlxtdWx0aXRhYmxle1xwYXJzZWFyZ1xkb3RhYmxlfQotXGRlZlxkb3RhYmxlIzF7XGJncm91cAotICBcdnNraXBccGFyc2tpcAotICBcbGV0XGl0ZW1cY3JjcgotICBcdG9sZXJhbmNlPTk1MDAKLSAgXGhiYWRuZXNzPTk1MDAKLSAgXHNldG11bHRpdGFibGVzcGFjaW5nCi0gIFxwYXJza2lwPVxtdWx0aXRhYmxlcGFyc2tpcAotICBccGFyaW5kZW50PVxtdWx0aXRhYmxlcGFyaW5kZW50Ci0gIFxvdmVyZnVsbHJ1bGU9MHB0Ci0gIFxnbG9iYWxcY29sY291bnQ9MAotICBcZGVmXEVtdWx0aXRhYmxle1xnbG9iYWxcc2V0cGVyY2VudGZhbHNlXGNyXGVncm91cFxlZ3JvdXB9JQotICAlCi0gICUgVG8gcGFyc2UgZXZlcnl0aGluZyBiZXR3ZWVuIEBtdWx0aXRhYmxlIGFuZCBAaXRlbToKLSAgXHNldHVwdGFibGUjMSBcZW5kc2V0dXB0YWJsZQotICAlCi0gICUgXGV2ZXJ5Y3Igd2lsbCByZXNldCBjb2x1bW4gY291bnRlciwgXGNvbGNvdW50LCBhdCB0aGUgZW5kIG9mCi0gICUgZWFjaCBsaW5lLiBFdmVyeSBjb2x1bW4gZW50cnkgd2lsbCBjYXVzZSBcY29sY291bnQgdG8gYWR2YW5jZSBieSBvbmUuCi0gICUgVGhlIHRhYmxlIHByZWFtYmxlCi0gICUgbG9va3MgYXQgdGhlIGN1cnJlbnQgXGNvbGNvdW50IHRvIGZpbmQgdGhlIGNvcnJlY3QgY29sdW1uIHdpZHRoLgotICBcZXZlcnljcntcbm9hbGlnbnslCi0gICUKLSAgJSBcZmlsYnJlYWslJSBrZWVwcyB1bmRlcmZ1bGwgYm94IG1lc3NhZ2VzIG9mZiB3aGVuIHRhYmxlIGJyZWFrcyBvdmVyIHBhZ2VzLgotICAlIE1heWJlIHNvLCBidXQgaXQgYWxzbyBjcmVhdGVzIHJlYWxseSB3ZWlyZCBwYWdlIGJyZWFrcyB3aGVuIHRoZSB0YWJsZQotICAlIGJyZWFrcyBvdmVyIHBhZ2VzLiBXb3VsZG4ndCBcdmZpbCBiZSBiZXR0ZXI/ICBXYWl0IHVudGlsIHRoZSBwcm9ibGVtCi0gICUgbWFuaWZlc3RzIGl0c2VsZiwgc28gaXQgY2FuIGJlIGZpeGVkIGZvciByZWFsIC0ta2FybC4KLSAgICBcZ2xvYmFsXGNvbGNvdW50PTBccmVsYXh9fSUKLSAgJQotICAlIFRoaXMgcHJlYW1ibGUgc2V0cyB1cCBhIGdlbmVyaWMgY29sdW1uIGRlZmluaXRpb24sIHdoaWNoIHdpbGwKLSAgJSBiZSB1c2VkIGFzIG1hbnkgdGltZXMgYXMgdXNlciBjYWxscyBmb3IgY29sdW1ucy4KLSAgJSBcdnRvcCB3aWxsIHNldCBhIHNpbmdsZSBsaW5lIGFuZCB3aWxsIGFsc28gbGV0IHRleHQgd3JhcCBhbmQKLSAgJSBjb250aW51ZSBmb3IgbWFueSBwYXJhZ3JhcGhzIGlmIGRlc2lyZWQuCi0gIFxoYWxpZ25cYmdyb3VwJlxnbG9iYWxcYWR2YW5jZVxjb2xjb3VudCBieSAxXHJlbGF4Ci0gICAgXG11bHRpc3RydXRcdnRvcHtcaHNpemU9XGV4cGFuZGFmdGVyXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZQotICAlCi0gICUgSW4gb3JkZXIgdG8ga2VlcCBlbnRyaWVzIGZyb20gYnVtcGluZyBpbnRvIGVhY2ggb3RoZXIKLSAgJSB3ZSB3aWxsIGFkZCBhIFxsZWZ0c2tpcCBvZiBcbXVsdGl0YWJsZWNvbHNwYWNlIHRvIGFsbCBjb2x1bW5zIGFmdGVyCi0gICUgdGhlIGZpcnN0IG9uZS4KLSAgJSAKLSAgJSBJZiBhIHRlbXBsYXRlIGhhcyBiZWVuIHVzZWQsIHdlIHdpbGwgYWRkIFxtdWx0aXRhYmxlY29sc3BhY2UKLSAgJSB0byB0aGUgd2lkdGggb2YgZWFjaCB0ZW1wbGF0ZSBlbnRyeS4KLSAgJSAKLSAgJSBJZiB0aGUgdXNlciBoYXMgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplIHdlIHdpbGwKLSAgJSB1c2UgdGhhdCBkaW1lbnNpb24gYXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4sIGFuZCB0aGUgXGxlZnRza2lwCi0gICUgd2lsbCBrZWVwIGVudHJpZXMgZnJvbSBidW1waW5nIGludG8gZWFjaCBvdGhlci4gIFRhYmxlIHdpbGwgc3RhcnQgYXQKLSAgJSBsZWZ0IG1hcmdpbiBhbmQgZmluYWwgY29sdW1uIHdpbGwganVzdGlmeSBhdCByaWdodCBtYXJnaW4uCi0gICUgCi0gICUgTWFrZSBzdXJlIHdlIGRvbid0IGluaGVyaXQgXHJpZ2h0c2tpcCBmcm9tIHRoZSBvdXRlciBlbnZpcm9ubWVudC4KLSAgXHJpZ2h0c2tpcD0wcHQKLSAgXGlmbnVtXGNvbGNvdW50PTEKLSAgICAlIFRoZSBmaXJzdCBjb2x1bW4gd2lsbCBiZSBpbmRlbnRlZCB3aXRoIHRoZSBzdXJyb3VuZGluZyB0ZXh0LgotICAgIFxhZHZhbmNlXGhzaXplIGJ5XGxlZnRza2lwCi0gIFxlbHNlCi0gICAgXGlmc2V0cGVyY2VudCBcZWxzZQotICAgICAgJSBJZiB1c2VyIGhhcyBub3Qgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplCi0gICAgICAlIHdlIHdpbGwgYWR2YW5jZSBcaHNpemUgYnkgXG11bHRpdGFibGVjb2xzcGFjZS4KLSAgICAgIFxhZHZhbmNlXGhzaXplIGJ5IFxtdWx0aXRhYmxlY29sc3BhY2UKLSAgICBcZmkKLSAgICUgSW4gZWl0aGVyIGNhc2Ugd2Ugd2lsbCBtYWtlIFxsZWZ0c2tpcD1cbXVsdGl0YWJsZWNvbHNwYWNlOgotICBcbGVmdHNraXA9XG11bHRpdGFibGVjb2xzcGFjZQotICBcZmkKLSAgJSBJZ25vcmluZyBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgYXZvaWRzIGFuIG9jY2FzaW9uYWwgc3B1cmlvdXMKLSAgJSBibGFuayBsaW5lLCB3aGVuIFRlWCBkZWNpZGVzIHRvIGJyZWFrIHRoZSBsaW5lIGF0IHRoZSBzcGFjZSBiZWZvcmUgdGhlCi0gICUgYm94IGZyb20gdGhlIG11bHRpc3RydXQsIHNvIHRoZSBzdHJ1dCBlbmRzIHVwIG9uIGEgbGluZSBieSBpdHNlbGYuCi0gICUgRm9yIGV4YW1wbGU6Ci0gICUgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMTEgLjg5Ci0gICUgQGl0ZW0gQGNvZGV7I30KLSAgJSBAdGFiIExlZ2FsIGhvbGlkYXkgd2hpY2ggaXMgdmFsaWQgaW4gbWFqb3IgcGFydHMgb2YgdGhlIHdob2xlIGNvdW50cnkuCi0gICUgSXMgYXV0b21hdGljYWxseSBwcm92aWRlZCB3aXRoIGhpZ2hsaWdodGluZyBzZXF1ZW5jZXMgcmVzcGVjdGl2ZWx5IG1hcmtpbmcKLSAgJSBjaGFyYWN0ZXJzLgotICBcbm9pbmRlbnRcaWdub3Jlc3BhY2VzIyNcdW5za2lwXG11bHRpc3RydXR9XGNyCi19Ci0KLVxkZWZcc2V0bXVsdGl0YWJsZXNwYWNpbmd7JSB0ZXN0IHRvIHNlZSBpZiB1c2VyIGhhcyBzZXQgXG11bHRpdGFibGVsaW5lc3BhY2UuCi0lIElmIHNvLCBkbyBub3RoaW5nLiBJZiBub3QsIGdpdmUgaXQgYW4gYXBwcm9wcmlhdGUgZGltZW5zaW9uIGJhc2VkIG9uCi0lIGN1cnJlbnQgYmFzZWxpbmVza2lwLgotXGlmZGltXG11bHRpdGFibGVsaW5lc3BhY2U9MHB0Ci0lJSBzdHJ1dCB0byBwdXQgaW4gdGFibGUgaW4gY2FzZSBzb21lIGVudHJ5IGRvZXNuJ3QgaGF2ZSBkZXNjZW5kZXJzLAotJSUgdG8ga2VlcCBsaW5lcyBlcXVhbGx5IHNwYWNlZAotXGxldFxtdWx0aXN0cnV0ID0gXHN0cnV0Ci0lJSBUZXN0IHRvIHNlZSBpZiBwYXJza2lwIGlzIGxhcmdlciB0aGFuIHNwYWNlIGJldHdlZW4gbGluZXMgb2YKLSUlIHRhYmxlLiBJZiBub3QsIGRvIG5vdGhpbmcuCi0lJSAgICAgICAgSWYgc28sIHNldCB0byBzYW1lIGRpbWVuc2lvbiBhcyBtdWx0aXRhYmxlbGluZXNwYWNlLgotXGVsc2UKLVxnZGVmXG11bHRpc3RydXR7XHZydWxlIGhlaWdodFxtdWx0aXRhYmxlbGluZXNwYWNlIGRlcHRoXGRwMAotd2lkdGgwcHRccmVsYXh9IFxmaQotXGlmZGltXG11bHRpdGFibGVwYXJza2lwPlxtdWx0aXRhYmxlbGluZXNwYWNlCi1cZ2xvYmFsXG11bHRpdGFibGVwYXJza2lwPVxtdWx0aXRhYmxlbGluZXNwYWNlCi1cZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlIHRoYW4gc2tpcCBiZXR3ZWVuIGxpbmVzIGluIHRoZSB0YWJsZS4KLVxmaSUKLVxpZmRpbVxtdWx0aXRhYmxlcGFyc2tpcD0wcHQKLVxnbG9iYWxcbXVsdGl0YWJsZXBhcnNraXA9XG11bHRpdGFibGVsaW5lc3BhY2UKLVxnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlcGFyc2tpcC03cHQgJSUgdG8ga2VlcCBwYXJza2lwIHNvbWV3aGF0IHNtYWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSUgdGhhbiBza2lwIGJldHdlZW4gbGluZXMgaW4gdGhlIHRhYmxlLgotXGZpfQotCi0KLVxtZXNzYWdle2luZGV4aW5nLH0KLSUgSW5kZXggZ2VuZXJhdGlvbiBmYWNpbGl0aWVzCi0KLSUgRGVmaW5lIFxuZXd3cml0ZSB0byBiZSBpZGVudGljYWwgdG8gcGxhaW4gdGV4J3MgXG5ld3dyaXRlCi0lIGV4Y2VwdCBub3QgXG91dGVyLCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gXG5ld2luZGV4Lgote1xjYXRjb2RlYFxAPTExCi1cZ2RlZlxuZXd3cml0ZXtcYWxsb2NAN1x3cml0ZVxjaGFyZGVmXHNpeHRAQG59fQotCi0lIFxuZXdpbmRleCB7Zm9vfSBkZWZpbmVzIGFuIGluZGV4IG5hbWVkIGZvby4KLSUgSXQgYXV0b21hdGljYWxseSBkZWZpbmVzIFxmb29pbmRleCBzdWNoIHRoYXQKLSUgXGZvb2luZGV4IC4uLnJlc3Qgb2YgbGluZS4uLiBwdXRzIGFuIGVudHJ5IGluIHRoZSBpbmRleCBmb28uCi0lIEl0IGFsc28gZGVmaW5lcyBcZm9vaW5kZmlsZSB0byBiZSB0aGUgbnVtYmVyIG9mIHRoZSBvdXRwdXQgY2hhbm5lbCBmb3IKLSUgdGhlIGZpbGUgdGhhdCBhY2N1bXVsYXRlcyB0aGlzIGluZGV4LiAgVGhlIGZpbGUncyBleHRlbnNpb24gaXMgZm9vLgotJSBUaGUgbmFtZSBvZiBhbiBpbmRleCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIDIgY2hhcmFjdGVycyBsb25nCi0lIGZvciB0aGUgc2FrZSBvZiB2bXMuCi0lCi1cZGVmXG5ld2luZGV4IzF7JQotICBcaWZsaW5rcwotICAgIFxleHBhbmRhZnRlclxuZXd3cml0ZSBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQotICAgIFxvcGVub3V0IFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lIFxqb2JuYW1lLiMxICUgT3BlbiB0aGUgZmlsZQotICBcZmkKLSAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JSAgICAgJSBEZWZpbmUgQCMxaW5kZXgKLSAgICBcbm9leHBhbmRcZG9pbmRleHsjMX19Ci19Ci0KLSUgQGRlZmluZGV4IGZvbyAgPT0gIFxuZXdpbmRleHtmb299Ci0KLVxkZWZcZGVmaW5kZXh7XHBhcnNlYXJnXG5ld2luZGV4fQotCi0lIERlZmluZSBAZGVmY29kZWluZGV4LCBsaWtlIEBkZWZpbmRleCBleGNlcHQgcHV0IGFsbCBlbnRyaWVzIGluIEBjb2RlLgotCi1cZGVmXG5ld2NvZGVpbmRleCMxeyUKLSAgXGlmbGlua3MKLSAgICBcZXhwYW5kYWZ0ZXJcbmV3d3JpdGUgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKLSAgICBcb3Blbm91dCBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZSBcam9ibmFtZS4jMQotICBcZmkKLSAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JQotICAgIFxub2V4cGFuZFxkb2NvZGVpbmRleHsjMX19Ci19Ci0KLVxkZWZcZGVmY29kZWluZGV4e1xwYXJzZWFyZ1xuZXdjb2RlaW5kZXh9Ci0KLSUgQHN5bmluZGV4IGZvbyBiYXIgICAgbWFrZXMgaW5kZXggZm9vIGZlZWQgaW50byBpbmRleCBiYXIuCi0lIERvIHRoaXMgaW5zdGVhZCBvZiBAZGVmaW5kZXggZm9vIGlmIHlvdSBkb24ndCB3YW50IGl0IGFzIGEgc2VwYXJhdGUgaW5kZXguCi0lIFRoZSBcY2xvc2VvdXQgaGVscHMgcmVkdWNlIHVubmVjZXNzYXJ5IG9wZW4gZmlsZXM7IHRoZSBsaW1pdCBvbiB0aGUKLSUgQWNvcm4gUklTQyBPUyBpcyBhIG1lcmUgMTYgZmlsZXMuCi1cZGVmXHN5bmluZGV4IzEgIzIgeyUKLSAgXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclxzeW5pbmRleGZvb1xleHBhbmRhZnRlcj1cY3NuYW1lIzJpbmRmaWxlXGVuZGNzbmFtZQotICBcZXhwYW5kYWZ0ZXJcY2xvc2VvdXRcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQotICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWU9XHN5bmluZGV4Zm9vCi0gIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUgZGVmaW5lIFx4eHhpbmRleAotICAgIFxub2V4cGFuZFxkb2luZGV4eyMyfX0lCi19Ci0KLSUgQHN5bmNvZGVpbmRleCBmb28gYmFyICAgc2ltaWxhciwgYnV0IHB1dCBhbGwgZW50cmllcyBtYWRlIGZvciBpbmRleCBmb28KLSUgaW5zaWRlIEBjb2RlLgotXGRlZlxzeW5jb2RlaW5kZXgjMSAjMiB7JQotICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXHN5bmluZGV4Zm9vXGV4cGFuZGFmdGVyPVxjc25hbWUjMmluZGZpbGVcZW5kY3NuYW1lCi0gIFxleHBhbmRhZnRlclxjbG9zZW91dFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCi0gIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZT1cc3luaW5kZXhmb28KLSAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JSBkZWZpbmUgXHh4eGluZGV4Ci0gICAgXG5vZXhwYW5kXGRvY29kZWluZGV4eyMyfX0lCi19Ci0KLSUgRGVmaW5lIFxkb2luZGV4LCB0aGUgZHJpdmVyIGZvciBhbGwgXGZvb2luZGV4IG1hY3Jvcy4KLSUgQXJndW1lbnQgIzEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsaW5nIFxmb29pbmRleCBtYWNybywKLSUgIGFuZCBpdCBpcyAiZm9vIiwgdGhlIG5hbWUgb2YgdGhlIGluZGV4LgotCi0lIFxkb2luZGV4IGp1c3QgdXNlcyBccGFyc2Vhcmc7IGl0IGNhbGxzIFxkb2luZCBmb3IgdGhlIGFjdHVhbCB3b3JrLgotJSBUaGlzIGlzIGJlY2F1c2UgXGRvaW5kIGlzIG1vcmUgdXNlZnVsIHRvIGNhbGwgZnJvbSBvdGhlciBtYWNyb3MuCi0KLSUgVGhlcmUgaXMgYWxzbyBcZG9zdWJpbmQge2luZGV4fXt0b3BpY317c3VidG9waWN9Ci0lIHdoaWNoIG1ha2VzIGFuIGVudHJ5IGluIGEgdHdvLWxldmVsIGluZGV4IHN1Y2ggYXMgdGhlIG9wZXJhdGlvbiBpbmRleC4KLQotXGRlZlxkb2luZGV4IzF7XGVkZWZcaW5kZXhuYW1leyMxfVxwYXJzZWFyZ1xzaW5nbGVpbmRleGVyfQotXGRlZlxzaW5nbGVpbmRleGVyICMxe1xkb2luZHtcaW5kZXhuYW1lfXsjMX19Ci0KLSUgbGlrZSB0aGUgcHJldmlvdXMgdHdvLCBidXQgdGhleSBwdXQgQGNvZGUgYXJvdW5kIHRoZSBhcmd1bWVudC4KLVxkZWZcZG9jb2RlaW5kZXgjMXtcZWRlZlxpbmRleG5hbWV7IzF9XHBhcnNlYXJnXHNpbmdsZWNvZGVpbmRleGVyfQotXGRlZlxzaW5nbGVjb2RlaW5kZXhlciAjMXtcZG9pbmR7XGluZGV4bmFtZX17XGNvZGV7IzF9fX0KLQotXGRlZlxpbmRleGR1bW1pZXN7JQotXGRlZlwgeyB9JQotJSBUYWtlIGNhcmUgb2YgdGhlIHBsYWluIHRleCBhY2NlbnQgY29tbWFuZHMuCi1cZGVmXCJ7XHJlYWxiYWNrc2xhc2ggIn0lCi1cZGVmXGB7XHJlYWxiYWNrc2xhc2ggYH0lCi1cZGVmXCd7XHJlYWxiYWNrc2xhc2ggJ30lCi1cZGVmXF57XHJlYWxiYWNrc2xhc2ggXn0lCi1cZGVmXH57XHJlYWxiYWNrc2xhc2ggfn0lCi1cZGVmXD17XHJlYWxiYWNrc2xhc2ggPX0lCi1cZGVmXGJ7XHJlYWxiYWNrc2xhc2ggYn0lCi1cZGVmXGN7XHJlYWxiYWNrc2xhc2ggY30lCi1cZGVmXGR7XHJlYWxiYWNrc2xhc2ggZH0lCi1cZGVmXHV7XHJlYWxiYWNrc2xhc2ggdX0lCi1cZGVmXHZ7XHJlYWxiYWNrc2xhc2ggdn0lCi1cZGVmXEh7XHJlYWxiYWNrc2xhc2ggSH0lCi0lIFRha2UgY2FyZSBvZiB0aGUgcGxhaW4gdGV4IHNwZWNpYWwgRXVyb3BlYW4gbW9kaWZpZWQgbGV0dGVycy4KLVxkZWZcb2V7XHJlYWxiYWNrc2xhc2ggb2V9JQotXGRlZlxhZXtccmVhbGJhY2tzbGFzaCBhZX0lCi1cZGVmXGFhe1xyZWFsYmFja3NsYXNoIGFhfSUKLVxkZWZcT0V7XHJlYWxiYWNrc2xhc2ggT0V9JQotXGRlZlxBRXtccmVhbGJhY2tzbGFzaCBBRX0lCi1cZGVmXEFBe1xyZWFsYmFja3NsYXNoIEFBfSUKLVxkZWZcb3tccmVhbGJhY2tzbGFzaCBvfSUKLVxkZWZcT3tccmVhbGJhY2tzbGFzaCBPfSUKLVxkZWZcbHtccmVhbGJhY2tzbGFzaCBsfSUKLVxkZWZcTHtccmVhbGJhY2tzbGFzaCBMfSUKLVxkZWZcc3N7XHJlYWxiYWNrc2xhc2ggc3N9JQotJSBUYWtlIGNhcmUgb2YgdGV4aW5mbyBjb21tYW5kcyBsaWtlbHkgdG8gYXBwZWFyIGluIGFuIGluZGV4IGVudHJ5LgotJSAoTXVzdCBiZSBhIHdheSB0byBhdm9pZCBkb2luZyBleHBhbnNpb24gYXQgYWxsLCBhbmQgdGh1cyBub3QgaGF2ZSB0bwotJSBsYWJvcmlvdXNseSBsaXN0IGV2ZXJ5IHNpbmdsZSBjb21tYW5kIGhlcmUuKQotXGRlZlxAe0B9JSB3aWxsIGJlIEBAIHdoZW4gd2Ugc3dpdGNoIHRvIEAgYXMgZXNjYXBlIGNoYXIuCi0lXGxldFx7ID0gXGxicmFjZWNtZAotJVxsZXRcfSA9IFxyYnJhY2VjbWQKLVxkZWZcX3t7XHJlYWxiYWNrc2xhc2ggX319JQotXGRlZlx3e1xyZWFsYmFja3NsYXNoIHcgfSUKLVxkZWZcYmZ7XHJlYWxiYWNrc2xhc2ggYmYgfSUKLSVcZGVmXHJte1xyZWFsYmFja3NsYXNoIHJtIH0lCi1cZGVmXHNse1xyZWFsYmFja3NsYXNoIHNsIH0lCi1cZGVmXHNme1xyZWFsYmFja3NsYXNoIHNmfSUKLVxkZWZcdHR7XHJlYWxiYWNrc2xhc2ggdHR9JQotXGRlZlxndHJ7XHJlYWxiYWNrc2xhc2ggZ3RyfSUKLVxkZWZcbGVzc3tccmVhbGJhY2tzbGFzaCBsZXNzfSUKLVxkZWZcaGF0e1xyZWFsYmFja3NsYXNoIGhhdH0lCi1cZGVmXFRlWHtccmVhbGJhY2tzbGFzaCBUZVh9JQotXGRlZlxkb3Rze1xyZWFsYmFja3NsYXNoIGRvdHMgfSUKLVxkZWZccmVzdWx0e1xyZWFsYmFja3NsYXNoIHJlc3VsdH0lCi1cZGVmXGVxdWl2e1xyZWFsYmFja3NsYXNoIGVxdWl2fSUKLVxkZWZcZXhwYW5zaW9ue1xyZWFsYmFja3NsYXNoIGV4cGFuc2lvbn0lCi1cZGVmXHByaW50e1xyZWFsYmFja3NsYXNoIHByaW50fSUKLVxkZWZcZXJyb3J7XHJlYWxiYWNrc2xhc2ggZXJyb3J9JQotXGRlZlxwb2ludHtccmVhbGJhY2tzbGFzaCBwb2ludH0lCi1cZGVmXGNvcHlyaWdodHtccmVhbGJhY2tzbGFzaCBjb3B5cmlnaHR9JQotXGRlZlx0Y2xvc2UjIzF7XHJlYWxiYWNrc2xhc2ggdGNsb3NlIHsjIzF9fSUKLVxkZWZcY29kZSMjMXtccmVhbGJhY2tzbGFzaCBjb2RlIHsjIzF9fSUKLVxkZWZcZG90bGVzcyMjMXtccmVhbGJhY2tzbGFzaCBkb3RsZXNzIHsjIzF9fSUKLVxkZWZcc2FtcCMjMXtccmVhbGJhY2tzbGFzaCBzYW1wIHsjIzF9fSUKLVxkZWZcLCMjMXtccmVhbGJhY2tzbGFzaCAseyMjMX19JQotXGRlZlx0IyMxe1xyZWFsYmFja3NsYXNoIHQgeyMjMX19JQotXGRlZlxyIyMxe1xyZWFsYmFja3NsYXNoIHIgeyMjMX19JQotXGRlZlxpIyMxe1xyZWFsYmFja3NsYXNoIGkgeyMjMX19JQotXGRlZlxiIyMxe1xyZWFsYmFja3NsYXNoIGIgeyMjMX19JQotXGRlZlxzYyMjMXtccmVhbGJhY2tzbGFzaCBzYyB7IyMxfX0lCi1cZGVmXGNpdGUjIzF7XHJlYWxiYWNrc2xhc2ggY2l0ZSB7IyMxfX0lCi1cZGVmXGtleSMjMXtccmVhbGJhY2tzbGFzaCBrZXkgeyMjMX19JQotXGRlZlxmaWxlIyMxe1xyZWFsYmFja3NsYXNoIGZpbGUgeyMjMX19JQotXGRlZlx2YXIjIzF7XHJlYWxiYWNrc2xhc2ggdmFyIHsjIzF9fSUKLVxkZWZca2JkIyMxe1xyZWFsYmFja3NsYXNoIGtiZCB7IyMxfX0lCi1cZGVmXGRmbiMjMXtccmVhbGJhY2tzbGFzaCBkZm4geyMjMX19JQotXGRlZlxlbXBoIyMxe1xyZWFsYmFja3NsYXNoIGVtcGggeyMjMX19JQotJQotJSBIYW5kbGUgc29tZSBjYXNlcyBvZiBAdmFsdWUgLS0gd2hlcmUgdGhlIHZhcmlhYmxlIG5hbWUgZG9lcyBub3QKLSUgY29udGFpbiAtIG9yIF8sIGFuZCB0aGUgdmFsdWUgZG9lcyBub3QgY29udGFpbiBhbnkKLSUgKG5vbi1mdWxseS1leHBhbmRhYmxlKSBjb21tYW5kcy4KLVxsZXRcdmFsdWUgPSBcZXhwYW5kYWJsZXZhbHVlCi0lCi1cdW5zZXBzcGFjZXMKLX0KLQotJSBJZiBhbiBpbmRleCBjb21tYW5kIGlzIHVzZWQgaW4gYW4gQGV4YW1wbGUgZW52aXJvbm1lbnQsIGFueSBzcGFjZXMKLSUgdGhlcmVpbiBzaG91bGQgYmVjb21lIHJlZ3VsYXIgc3BhY2VzIGluIHRoZSByYXcgaW5kZXggZmlsZSwgbm90IHRoZQotJSBleHBhbnNpb24gb2YgXHRpZSAoXFxsZWF2ZXZtb2RlIFxwZW5hbHR5IFxATSBcICkuCi17XG9iZXlzcGFjZXMKLSBcZ2RlZlx1bnNlcHNwYWNlc3tcb2JleXNwYWNlc1xsZXQgPVxzcGFjZX19Ci0KLSUgXGluZGV4bm9mb250cyBuby1vcHMgYWxsIGZvbnQtY2hhbmdlIGNvbW1hbmRzLgotJSBUaGlzIGlzIHVzZWQgd2hlbiBvdXRwdXR0aW5nIHRoZSBzdHJpbmdzIHRvIHNvcnQgdGhlIGluZGV4IGJ5LgotXGRlZlxpbmRleGR1bW15Zm9udCMxeyMxfQotXGRlZlxpbmRleGR1bW15dGV4e1RlWH0KLVxkZWZcaW5kZXhkdW1teWRvdHN7Li4ufQotCi1cZGVmXGluZGV4bm9mb250c3slCi0lIEp1c3QgaWdub3JlIGFjY2VudHMuCi1cbGV0XCw9XGluZGV4ZHVtbXlmb250Ci1cbGV0XCI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGA9XGluZGV4ZHVtbXlmb250Ci1cbGV0XCc9XGluZGV4ZHVtbXlmb250Ci1cbGV0XF49XGluZGV4ZHVtbXlmb250Ci1cbGV0XH49XGluZGV4ZHVtbXlmb250Ci1cbGV0XD09XGluZGV4ZHVtbXlmb250Ci1cbGV0XGI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGM9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHU9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHY9XGluZGV4ZHVtbXlmb250Ci1cbGV0XEg9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGRvdGxlc3M9XGluZGV4ZHVtbXlmb250Ci0lIFRha2UgY2FyZSBvZiB0aGUgcGxhaW4gdGV4IHNwZWNpYWwgRXVyb3BlYW4gbW9kaWZpZWQgbGV0dGVycy4KLVxkZWZcb2V7b2V9JQotXGRlZlxhZXthZX0lCi1cZGVmXGFhe2FhfSUKLVxkZWZcT0V7T0V9JQotXGRlZlxBRXtBRX0lCi1cZGVmXEFBe0FBfSUKLVxkZWZcb3tvfSUKLVxkZWZcT3tPfSUKLVxkZWZcbHtsfSUKLVxkZWZcTHtMfSUKLVxkZWZcc3N7c3N9JQotXGxldFx3PVxpbmRleGR1bW15Zm9udAotXGxldFx0PVxpbmRleGR1bW15Zm9udAotXGxldFxyPVxpbmRleGR1bW15Zm9udAotXGxldFxpPVxpbmRleGR1bW15Zm9udAotXGxldFxiPVxpbmRleGR1bW15Zm9udAotXGxldFxlbXBoPVxpbmRleGR1bW15Zm9udAotXGxldFxzdHJvbmc9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGNpdGU9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHNjPVxpbmRleGR1bW15Zm9udAotJURvbid0IG5vLW9wIFx0dCwgc2luY2UgaXQgaXNuJ3QgYSB1c2VyLWxldmVsIGNvbW1hbmQKLSUgYW5kIGlzIHVzZWQgaW4gdGhlIGRlZmluaXRpb25zIG9mIHRoZSBhY3RpdmUgY2hhcnMgbGlrZSA8LCA+LCB8Li4uCi0lXGxldFx0dD1caW5kZXhkdW1teWZvbnQKLVxsZXRcdGNsb3NlPVxpbmRleGR1bW15Zm9udAotXGxldFxjb2RlPVxpbmRleGR1bW15Zm9udAotXGxldFxmaWxlPVxpbmRleGR1bW15Zm9udAotXGxldFxzYW1wPVxpbmRleGR1bW15Zm9udAotXGxldFxrYmQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGtleT1caW5kZXhkdW1teWZvbnQKLVxsZXRcdmFyPVxpbmRleGR1bW15Zm9udAotXGxldFxUZVg9XGluZGV4ZHVtbXl0ZXgKLVxsZXRcZG90cz1caW5kZXhkdW1teWRvdHMKLVxkZWZcQHtAfSUKLX0KLQotJSBUbyBkZWZpbmUgXHJlYWxiYWNrc2xhc2gsIHdlIG11c3QgbWFrZSBcIG5vdCBiZSBhbiBlc2NhcGUuCi0lIFdlIG11c3QgZmlyc3QgbWFrZSBhbm90aGVyIGNoYXJhY3RlciAoQCkgYW4gZXNjYXBlCi0lIHNvIHdlIGRvIG5vdCBiZWNvbWUgdW5hYmxlIHRvIGRvIGEgZGVmaW5pdGlvbi4KLQote1xjYXRjb2RlYFxAPTAgXGNhdGNvZGVgXFw9XG90aGVyCi0gQGdkZWZAcmVhbGJhY2tzbGFzaHtcfX0KLQotXGxldFxpbmRleGJhY2tzbGFzaD0wICAlb3ZlcnJpZGRlbiBkdXJpbmcgXHByaW50aW5kZXguCi1cbGV0XFNFVG1hcmdpbmluZGV4PVxyZWxheCAlIHB1dCBpbmRleCBlbnRyaWVzIGluIG1hcmdpbiAodW5kb2N1bWVudGVkKT8KLQotJSBGb3IgXGlmeCBjb21wYXJpc29ucy4KLVxkZWZcZW1wdHltYWNyb3tcZW1wdHl9Ci0KLSUgTW9zdCBpbmRleCBlbnRyaWVzIGdvIHRocm91Z2ggaGVyZSwgYnV0IFxkb3N1YmluZCBpcyB0aGUgZ2VuZXJhbCBjYXNlLgotJSAKLVxkZWZcZG9pbmQjMSMye1xkb3N1YmluZHsjMX17IzJ9XGVtcHR5fQotCi0lIFdvcmtob3JzZSBmb3IgYWxsIFxmb29pbmRleGVzLgotJSAjMSBpcyBuYW1lIG9mIGluZGV4LCAjMiBpcyBzdHVmZiB0byBwdXQgdGhlcmUsICMzIGlzIHN1YmVudHJ5IC0tCi0lIFxlbXB0eSBpZiBjYWxsZWQgZnJvbSBcZG9pbmQsIGFzIHdlIHVzdWFsbHkgYXJlLiAgVGhlIG1haW4gZXhjZXB0aW9uCi0lIGlzIHdpdGggZGVmdW5zLCB3aGljaCBjYWxsIHVzIGRpcmVjdGx5LgotJSAKLVxkZWZcZG9zdWJpbmQjMSMyIzN7JQotICAlIFB1dCB0aGUgaW5kZXggZW50cnkgaW4gdGhlIG1hcmdpbiBpZiBkZXNpcmVkLgotICBcaWZ4XFNFVG1hcmdpbmluZGV4XHJlbGF4XGVsc2UKLSAgICBcaW5zZXJ0XG1hcmdpbntcaGJveHtcdnJ1bGUgaGVpZ2h0OHB0IGRlcHRoM3B0IHdpZHRoMHB0ICMyfX0lCi0gIFxmaQotICB7JQotICAgIFxjb3VudDI1NT1cbGFzdHBlbmFsdHkKLSAgICB7JQotICAgICAgXGluZGV4ZHVtbWllcyAlIE11c3QgZG8gdGhpcyBoZXJlLCBzaW5jZSBcYmYsIGV0YyBleHBhbmQgYXQgdGhpcyBzdGFnZQotICAgICAgXGVzY2FwZWNoYXI9YFxcCi0gICAgICB7JQotICAgICAgICBcbGV0XGZvbGlvID0gMCUgV2Ugd2lsbCBleHBhbmQgYWxsIG1hY3JvcyBub3cgRVhDRVBUIFxmb2xpby4KLSAgICAgICAgXGRlZlxyYXdiYWNrc2xhc2h4eHtcaW5kZXhiYWNrc2xhc2h9JSBcaW5kZXhiYWNrc2xhc2ggaXNuJ3QgZGVmaW5lZCBub3cKLSAgICAgICAgJSBzbyBpdCB3aWxsIGJlIG91dHB1dCBhcyBpczsgYW5kIGl0IHdpbGwgcHJpbnQgYXMgYmFja3NsYXNoLgotICAgICAgICAlCi0gICAgICAgIFxkZWZcdGhpcmRhcmd7IzN9JQotICAgICAgICAlCi0gICAgICAgICUgSWYgdGhpcmQgYXJnIGlzIHByZXNlbnQsIHByZWNlZGUgaXQgd2l0aCBzcGFjZSBpbiBzb3J0IGtleS4KLSAgICAgICAgXGlmeFx0aGlyZGFyZ1xlbXB0eW1hY3JvCi0gICAgICAgICAgXGxldFxzdWJlbnRyeSA9IFxlbXB0eQotICAgICAgICBcZWxzZQotICAgICAgICAgIFxkZWZcc3ViZW50cnl7ICMzfSUKLSAgICAgICAgXGZpCi0gICAgICAgICUKLSAgICAgICAgJSBGaXJzdCBwcm9jZXNzIHRoZSBpbmRleC1zdHJpbmcgd2l0aCBhbGwgZm9udCBjb21tYW5kcyB0dXJuZWQgb2ZmCi0gICAgICAgICUgdG8gZ2V0IHRoZSBzdHJpbmcgdG8gc29ydCBieS4KLSAgICAgICAge1xpbmRleG5vZm9udHMgXHhkZWZcaW5kZXhzb3J0dG1weyMyXHN1YmVudHJ5fX0lCi0gICAgICAgICUKLSAgICAgICAgJSBOb3cgcHJvZHVjZSB0aGUgY29tcGxldGUgaW5kZXggZW50cnksIHdpdGggYm90aCB0aGUgc29ydCBrZXkgYW5kIHRoZQotICAgICAgICAlIG9yaWdpbmFsIHRleHQsIGluY2x1ZGluZyBhbnkgZm9udCBjb21tYW5kcy4KLSAgICAgICAgXHRva3MwID0geyMyfSUKLSAgICAgICAgXGVkZWZcdGVtcHslCi0gICAgICAgICAgXHdyaXRlXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWV7JQotICAgICAgICAgICAgXHJlYWxiYWNrc2xhc2ggZW50cnl7XGluZGV4c29ydHRtcH17XGZvbGlvfXtcdGhlXHRva3MwfX0lCi0gICAgICAgIH0lCi0gICAgICAgICUKLSAgICAgICAgJSBJZiB0aGlyZCAoc3ViZW50cnkpIGFyZyBpcyBwcmVzZW50LCBhZGQgaXQgdG8gdGhlIGluZGV4IHN0cmluZy4KLSAgICAgICAgXGlmeFx0aGlyZGFyZ1xlbXB0eW1hY3JvIFxlbHNlCi0gICAgICAgICAgXHRva3MwID0geyMzfSUKLSAgICAgICAgICBcZWRlZlx0ZW1we1x0ZW1we1x0aGVcdG9rczB9fSUKLSAgICAgICAgXGZpCi0gICAgICAgICUKLSAgICAgICAgJSBJZiBhIHNraXAgaXMgdGhlIGxhc3QgdGhpbmcgb24gdGhlIGxpc3Qgbm93LCBwcmVzZXJ2ZSBpdAotICAgICAgICAlIGJ5IGJhY2tpbmcgdXAgYnkgXGxhc3Rza2lwLCBkb2luZyB0aGUgXHdyaXRlLCB0aGVuIGluc2VydGluZwotICAgICAgICAlIHRoZSBza2lwIGFnYWluLiAgT3RoZXJ3aXNlLCB0aGUgd2hhdHNpdCBnZW5lcmF0ZWQgYnkgdGhlCi0gICAgICAgICUgXHdyaXRlIHdpbGwgbWFrZSBcbGFzdHNraXAgemVyby4gIFRoZSByZXN1bHQgaXMgdGhhdCBzZXF1ZW5jZXMKLSAgICAgICAgJSBsaWtlIHRoaXM6Ci0gICAgICAgICUgQGVuZCBkZWZ1bgotICAgICAgICAlIEB0aW5kZXggd2hhdGV2ZXIKLSAgICAgICAgJSBAZGVmdW4gLi4uCi0gICAgICAgICUgd2lsbCBoYXZlIGV4dHJhIHNwYWNlIGluc2VydGVkLCBiZWNhdXNlIHRoZSBcbWVkYnJlYWsgaW4gdGhlCi0gICAgICAgICUgc3RhcnQgb2YgdGhlIEBkZWZ1biB3b24ndCBzZWUgdGhlIHNraXAgaW5zZXJ0ZWQgYnkgdGhlIEBlbmQgb2YKLSAgICAgICAgJSB0aGUgcHJldmlvdXMgZGVmdW4uCi0gICAgICAgICUgCi0gICAgICAgICUgQnV0IGRvbid0IGRvIGFueSBvZiB0aGlzIGlmIHdlJ3JlIG5vdCBpbiB2ZXJ0aWNhbCBtb2RlLiAgV2UKLSAgICAgICAgJSBkb24ndCB3YW50IHRvIGRvIGEgXHZza2lwIGFuZCBwcmVtYXR1cmVseSBlbmQgYSBwYXJhZ3JhcGguCi0gICAgICAgICUgCi0gICAgICAgICUgQXZvaWQgcGFnZSBicmVha3MgZHVlIHRvIHRoZXNlIGV4dHJhIHNraXBzLCB0b28uCi0gICAgICAgICUgCi0gICAgICAgIFxpZmxpbmtzCi0gICAgICAgICAgXGlmdm1vZGUKLSAgICAgICAgICAgIFxza2lwMCA9IFxsYXN0c2tpcAotICAgICAgICAgICAgXGlmZGltXGxhc3Rza2lwID0gMHB0IFxlbHNlIFxub2JyZWFrXHZza2lwLVxsYXN0c2tpcCBcZmkKLSAgICAgICAgICBcZmkKLSAgICAgICAgICAlCi0gICAgICAgICAgXHRlbXAgJSBkbyB0aGUgd3JpdGUKLSAgICAgICAgICAlCi0gICAgICAgICAgJSAKLSAgICAgICAgICBcaWZ2bW9kZSBcaWZkaW1cc2tpcDAgPSAwcHQgXGVsc2UgXG5vYnJlYWtcdnNraXBcc2tpcDAgXGZpIFxmaQotICAgICAgICBcZmkKLSAgICAgIH0lCi0gICAgfSUKLSAgICBccGVuYWx0eVxjb3VudDI1NQotICB9JQotfQotCi0lIFRoZSBpbmRleCBlbnRyeSB3cml0dGVuIGluIHRoZSBmaWxlIGFjdHVhbGx5IGxvb2tzIGxpa2UKLSUgIFxlbnRyeSB7c29ydHN0cmluZ317cGFnZX17dG9waWN9Ci0lIG9yCi0lICBcZW50cnkge3NvcnRzdHJpbmd9e3BhZ2V9e3RvcGljfXtzdWJ0b3BpY30KLSUgVGhlIHRleGluZGV4IHByb2dyYW0gcmVhZHMgaW4gdGhlc2UgZmlsZXMgYW5kIHdyaXRlcyBmaWxlcwotJSBjb250YWluaW5nIHRoZXNlIGtpbmRzIG9mIGxpbmVzOgotJSAgXGluaXRpYWwge2N9Ci0lICAgICBiZWZvcmUgdGhlIGZpcnN0IHRvcGljIHdob3NlIGluaXRpYWwgaXMgYwotJSAgXGVudHJ5IHt0b3BpY317cGFnZWxpc3R9Ci0lICAgICBmb3IgYSB0b3BpYyB0aGF0IGlzIHVzZWQgd2l0aG91dCBzdWJ0b3BpY3MKLSUgIFxwcmltYXJ5IHt0b3BpY30KLSUgICAgIGZvciB0aGUgYmVnaW5uaW5nIG9mIGEgdG9waWMgdGhhdCBpcyB1c2VkIHdpdGggc3VidG9waWNzCi0lICBcc2Vjb25kYXJ5IHtzdWJ0b3BpY317cGFnZWxpc3R9Ci0lICAgICBmb3IgZWFjaCBzdWJ0b3BpYy4KLQotJSBEZWZpbmUgdGhlIHVzZXItYWNjZXNzaWJsZSBpbmRleGluZyBjb21tYW5kcwotJSBAZmluZGV4LCBAdmluZGV4LCBAa2luZGV4LCBAY2luZGV4LgotCi1cZGVmXGZpbmRleCB7XGZuaW5kZXh9Ci1cZGVmXGtpbmRleCB7XGt5aW5kZXh9Ci1cZGVmXGNpbmRleCB7XGNwaW5kZXh9Ci1cZGVmXHZpbmRleCB7XHZyaW5kZXh9Ci1cZGVmXHRpbmRleCB7XHRwaW5kZXh9Ci1cZGVmXHBpbmRleCB7XHBnaW5kZXh9Ci0KLVxkZWZcY2luZGV4c3ViIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcY2luZGV4c3VifQote1xvYmV5bGluZXMgJQotXGdkZWZcY2luZGV4c3ViICIjMSIgIzJeXk17XGVuZGdyb3VwICUKLVxkb3N1YmluZHtjcH17IzJ9eyMxfX19Ci0KLSUgRGVmaW5lIHRoZSBtYWNyb3MgdXNlZCBpbiBmb3JtYXR0aW5nIG91dHB1dCBvZiB0aGUgc29ydGVkIGluZGV4IG1hdGVyaWFsLgotCi0lIEBwcmludGluZGV4IGNhdXNlcyBhIHBhcnRpY3VsYXIgaW5kZXggKHRoZSA/P3MgZmlsZSkgdG8gZ2V0IHByaW50ZWQuCi0lIEl0IGRvZXMgbm90IHByaW50IGFueSBjaGFwdGVyIGhlYWRpbmcgKHVzdWFsbHkgYW4gQHVubnVtYmVyZWQpLgotJQotXGRlZlxwcmludGluZGV4e1xwYXJzZWFyZ1xkb3ByaW50aW5kZXh9Ci1cZGVmXGRvcHJpbnRpbmRleCMxe1xiZWdpbmdyb3VwCi0gIFxkb2JyZWFrIFxjaGFwaGVhZGluZ3NraXB7MTAwMDB9JQotICAlCi0gIFxpbmRleGZvbnRzIFxybQotICBcdG9sZXJhbmNlID0gOTUwMAotICBcaW5kZXhicmVha3MKLSAgJQotICAlIFNlZSBpZiB0aGUgaW5kZXggZmlsZSBleGlzdHMgYW5kIGlzIG5vbmVtcHR5LgotICAlIENoYW5nZSBjYXRjb2RlIG9mIEAgaGVyZSBzbyB0aGF0IGlmIHRoZSBpbmRleCBmaWxlIGNvbnRhaW5zCi0gICUgXGluaXRpYWwge0B9Ci0gICUgYXMgaXRzIGZpcnN0IGxpbmUsIFRlWCBkb2Vzbid0IGNvbXBsYWluIGFib3V0IG1pc21hdGNoZWQgYnJhY2VzCi0gICUgKGJlY2F1c2UgaXQgdGhpbmtzIEB9IGlzIGEgY29udHJvbCBzZXF1ZW5jZSkuCi0gIFxjYXRjb2RlYFxAID0gMTEKLSAgXG9wZW5pbiAxIFxqb2JuYW1lLiMxcwotICBcaWZlb2YgMQotICAgICUgXGVuZGRvdWJsZWNvbHVtbnMgZ2V0cyBjb25mdXNlZCBpZiB0aGVyZSBpcyBubyB0ZXh0IGluIHRoZSBpbmRleCwKLSAgICAlIGFuZCBpdCBsb3NlcyB0aGUgY2hhcHRlciB0aXRsZSBhbmQgdGhlIGF1eCBmaWxlIGVudHJpZXMgZm9yIHRoZQotICAgICUgaW5kZXguICBUaGUgZWFzaWVzdCB3YXkgdG8gcHJldmVudCB0aGlzIHByb2JsZW0gaXMgdG8gbWFrZSBzdXJlCi0gICAgJSB0aGVyZSBpcyBzb21lIHRleHQuCi0gICAgKEluZGV4IGlzIG5vbmV4aXN0ZW50KQotICBcZWxzZQotICAgICUKLSAgICAlIElmIHRoZSBpbmRleCBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHksIHRoZW4gXG9wZW5pbiBsZWF2ZXMgXGlmZW9mCi0gICAgJSBmYWxzZS4gIFdlIGhhdmUgdG8gbWFrZSBUZVggdHJ5IHRvIHJlYWQgc29tZXRoaW5nIGZyb20gdGhlIGZpbGUsIHNvCi0gICAgJSBpdCBjYW4gZGlzY292ZXIgaWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gaXQuCi0gICAgXHJlYWQgMSB0byBcdGVtcAotICAgIFxpZmVvZiAxCi0gICAgICAoSW5kZXggaXMgZW1wdHkpCi0gICAgXGVsc2UKLSAgICAgICUgSW5kZXggZmlsZXMgYXJlIGFsbW9zdCBUZXhpbmZvIHNvdXJjZSwgYnV0IHdlIHVzZSBcIGFzIHRoZSBlc2NhcGUKLSAgICAgICUgY2hhcmFjdGVyLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBALCBidXQgdGhhdCdzIHRvbyBiaWcgYSBjaGFuZ2UKLSAgICAgICUgdG8gbWFrZSByaWdodCBub3cuCi0gICAgICBcZGVmXGluZGV4YmFja3NsYXNoe1xyYXdiYWNrc2xhc2h4eH0lCi0gICAgICBcY2F0Y29kZWBcXCA9IDAKLSAgICAgIFxlc2NhcGVjaGFyID0gYFxcCi0gICAgICBcYmVnaW5kb3VibGVjb2x1bW5zCi0gICAgICBcaW5wdXQgXGpvYm5hbWUuIzFzCi0gICAgICBcZW5kZG91YmxlY29sdW1ucwotICAgIFxmaQotICBcZmkKLSAgXGNsb3NlaW4gMQotXGVuZGdyb3VwfQotCi0lIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBieSB0aGUgc29ydGVkIGluZGV4IGZpbGUgaXRzZWxmLgotJSBDaGFuZ2UgdGhlbSB0byBjb250cm9sIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbmRleC4KLQotXGRlZlxpbml0aWFsIzF7eyUKLSAgJSBTb21lIG1pbm9yIGZvbnQgY2hhbmdlcyBmb3IgdGhlIHNwZWNpYWwgY2hhcmFjdGVycy4KLSAgXGxldFx0ZW50dD1cc2VjdHQgXGxldFx0dD1cc2VjdHQgXGxldFxzZj1cc2VjdHQKLSAgJQotICAlIFJlbW92ZSBhbnkgZ2x1ZSB3ZSBtYXkgaGF2ZSwgd2UnbGwgYmUgaW5zZXJ0aW5nIG91ciBvd24uCi0gIFxyZW1vdmVsYXN0c2tpcAotICAlIAotICAlIFdlIGxpa2UgYnJlYWtzIGJlZm9yZSB0aGUgaW5kZXggaW5pdGlhbHMsIHNvIGluc2VydCBhIGJvbnVzLgotICBccGVuYWx0eSAtMzAwCi0gICUKLSAgJSBUeXBlc2V0IHRoZSBpbml0aWFsLiAgTWFraW5nIHRoaXMgYWRkIHVwIHRvIGEgd2hvbGUgbnVtYmVyIG9mCi0gICUgYmFzZWxpbmVza2lwcyBpbmNyZWFzZXMgdGhlIGNoYW5jZSBvZiB0aGUgZG90cyBsaW5pbmcgdXAgZnJvbSBjb2x1bW4KLSAgJSB0byBjb2x1bW4uICBJdCBzdGlsbCB3b24ndCBvZnRlbiBiZSBwZXJmZWN0LCBiZWNhdXNlIG9mIHRoZSBzdHJldGNoCi0gICUgd2UgbmVlZCBiZWZvcmUgZWFjaCBlbnRyeSwgYnV0IGl0J3MgYmV0dGVyLgotICAlIAotICAlIE5vIHNocmluayBiZWNhdXNlIGl0IGNvbmZ1c2VzIFxiYWxhbmNlY29sdW1ucy4KLSAgXHZza2lwIDEuNjdcYmFzZWxpbmVza2lwIHBsdXMgLjVcYmFzZWxpbmVza2lwCi0gIFxsZWZ0bGluZXtcc2VjYmYgIzF9JQotICBcdnNraXAgLjMzXGJhc2VsaW5lc2tpcCBwbHVzIC4xXGJhc2VsaW5lc2tpcAotICAlCi0gICUgRG8gb3VyIGJlc3Qgbm90IHRvIGJyZWFrIGFmdGVyIHRoZSBpbml0aWFsLgotICBcbm9icmVhawotfX0KLQotJSBUaGlzIHR5cGVzZXRzIGEgcGFyYWdyYXBoIGNvbnNpc3Rpbmcgb2YgIzEsIGRvdCBsZWFkZXJzLCBhbmQgdGhlbiAjMgotJSBmbHVzaCB0byB0aGUgcmlnaHQgbWFyZ2luLiAgSXQgaXMgdXNlZCBmb3IgaW5kZXggYW5kIHRhYmxlIG9mIGNvbnRlbnRzCi0lIGVudHJpZXMuICBUaGUgcGFyYWdyYXBoIGlzIGluZGVudGVkIGJ5IFxsZWZ0c2tpcC4KLSUKLVxkZWZcZW50cnkjMSMye1xiZWdpbmdyb3VwCi0gICUKLSAgJSBTdGFydCBhIG5ldyBwYXJhZ3JhcGggaWYgbmVjZXNzYXJ5LCBzbyBvdXIgYXNzaWdubWVudHMgYmVsb3cgY2FuJ3QKLSAgJSBhZmZlY3QgcHJldmlvdXMgdGV4dC4KLSAgXHBhcgotICAlCi0gICUgRG8gbm90IGZpbGwgb3V0IHRoZSBsYXN0IGxpbmUgd2l0aCB3aGl0ZSBzcGFjZS4KLSAgXHBhcmZpbGxza2lwID0gMGluCi0gICUKLSAgJSBObyBleHRyYSBzcGFjZSBhYm92ZSB0aGlzIHBhcmFncmFwaC4KLSAgXHBhcnNraXAgPSAwaW4KLSAgJQotICAlIERvIG5vdCBwcmVmZXIgYSBzZXBhcmF0ZSBsaW5lIGVuZGluZyB3aXRoIGEgaHlwaGVuIHRvIGZld2VyIGxpbmVzLgotICBcZmluYWxoeXBoZW5kZW1lcml0cyA9IDAKLSAgJQotICAlIFxoYW5naW5kZW50IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgZW50cnkgdGV4dCBhbmQgcGFnZSBudW1iZXIKLSAgJSBkb24ndCBib3RoIGZpdCBvbiBvbmUgbGluZS4gIEluIHRoYXQgY2FzZSwgYm9iIHN1Z2dlc3RzIHN0YXJ0aW5nIHRoZQotICAlIGRvdHMgcHJldHR5IGZhciBvdmVyIG9uIHRoZSBsaW5lLiAgVW5mb3J0dW5hdGVseSwgYSBsYXJnZQotICAlIGluZGVudGF0aW9uIGxvb2tzIHdyb25nIHdoZW4gdGhlIGVudHJ5IHRleHQgaXRzZWxmIGlzIGJyb2tlbiBhY3Jvc3MKLSAgJSBsaW5lcy4gIFNvIHdlIHVzZSBhIHNtYWxsIGluZGVudGF0aW9uIGFuZCBwdXQgdXAgd2l0aCBsb25nIGxlYWRlcnMuCi0gICUKLSAgJSBcaGFuZ2FmdGVyIGlzIHJlc2V0IHRvIDEgKHdoaWNoIGlzIHRoZSB2YWx1ZSB3ZSB3YW50KSBhdCB0aGUgc3RhcnQKLSAgJSBvZiBlYWNoIHBhcmFncmFwaCwgc28gd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGF0LgotICBcaGFuZ2luZGVudCA9IDJlbQotICAlCi0gICUgV2hlbiB0aGUgZW50cnkgdGV4dCBuZWVkcyB0byBiZSBicm9rZW4sIGp1c3QgZmlsbCBvdXQgdGhlIGZpcnN0IGxpbmUKLSAgJSB3aXRoIGJsYW5rIHNwYWNlLgotICBccmlnaHRza2lwID0gMHB0IHBsdXMxZmlsCi0gICUKLSAgJSBBIGJpdCBvZiBzdHJldGNoIGJlZm9yZSBlYWNoIGVudHJ5IGZvciB0aGUgYmVuZWZpdCBvZiBiYWxhbmNpbmcgY29sdW1ucy4KLSAgXHZza2lwIDBwdCBwbHVzMXB0Ci0gICUKLSAgJSBTdGFydCBhIGBgcGFyYWdyYXBoJycgZm9yIHRoZSBpbmRleCBlbnRyeSBzbyB0aGUgbGluZSBicmVha2luZwotICAlIHBhcmFtZXRlcnMgd2UndmUgc2V0IGFib3ZlIHdpbGwgaGF2ZSBhbiBlZmZlY3QuCi0gIFxub2luZGVudAotICAlCi0gICUgSW5zZXJ0IHRoZSB0ZXh0IG9mIHRoZSBpbmRleCBlbnRyeS4gIFRlWCB3aWxsIGRvIGxpbmUtYnJlYWtpbmcgb24gaXQuCi0gICMxJQotICAlIFRoZSBmb2xsb3dpbmcgaXMga2x1ZGdlZCB0byBub3Qgb3V0cHV0IGEgbGluZSBvZiBkb3RzIGluIHRoZSBpbmRleCBpZgotICAlIHRoZXJlIGFyZSBubyBwYWdlIG51bWJlcnMuICBUaGUgbmV4dCBwZXJzb24gd2hvIGJyZWFrcyB0aGlzIHdpbGwgYmUKLSAgJSBjdXJzZWQgYnkgYSBVbml4IGRhZW1vbi4KLSAgXGRlZlx0ZW1wYXt7XHJtIH19JQotICBcZGVmXHRlbXBieyMyfSUKLSAgXGVkZWZcdGVtcGN7XHRlbXBhfSUKLSAgXGVkZWZcdGVtcGR7XHRlbXBifSUKLSAgXGlmeFx0ZW1wY1x0ZW1wZFwgXGVsc2UlCi0gICAgJQotICAgICUgSWYgd2UgbXVzdCwgcHV0IHRoZSBwYWdlIG51bWJlciBvbiBhIGxpbmUgb2YgaXRzIG93biwgYW5kIGZpbGwgb3V0Ci0gICAgJSB0aGlzIGxpbmUgd2l0aCBibGFuayBzcGFjZS4gIChUaGUgXGhmaWwgaXMgb3ZlcndoZWxtZWQgd2l0aCB0aGUKLSAgICAlIGZpbGwgbGVhZGVycyBnbHVlIGluIFxpbmRleGRvdGZpbGwgaWYgdGhlIHBhZ2UgbnVtYmVyIGRvZXMgZml0LikKLSAgICBcaGZpbFxwZW5hbHR5NTAKLSAgICBcbnVsbFxub2JyZWFrXGluZGV4ZG90ZmlsbCAlIEhhdmUgbGVhZGVycyBiZWZvcmUgdGhlIHBhZ2UgbnVtYmVyLgotICAgICUKLSAgICAlIFRoZSBgXCAnIGhlcmUgaXMgcmVtb3ZlZCBieSB0aGUgaW1wbGljaXQgXHVuc2tpcCB0aGF0IFRlWCBkb2VzIGFzCi0gICAgJSBwYXJ0IG9mICh0aGUgcHJpbWl0aXZlKSBccGFyLiAgV2l0aG91dCBpdCwgYSBzcHVyaW91cyB1bmRlcmZ1bGwKLSAgICAlIFxoYm94IGVuc3Vlcy4KLSAgICBcICMyJSBUaGUgcGFnZSBudW1iZXIgZW5kcyB0aGUgcGFyYWdyYXBoLgotICBcZmklCi0gIFxwYXIKLVxlbmRncm91cH0KLQotJSBMaWtlIFxkb3RmaWxsIGV4Y2VwdCB0YWtlcyBhdCBsZWFzdCAxIGVtLgotXGRlZlxpbmRleGRvdGZpbGx7XGNsZWFkZXJzCi0gIFxoYm94eyRcbWF0aHN1cnJvdW5kPTBwdCBcbWtlcm4xLjVtdSAke1xpdCAufSQgXG1rZXJuMS41bXUkfVxoc2tpcCAxZW0gcGx1cyAxZmlsbH0KLQotXGRlZlxwcmltYXJ5ICMxe1xsaW5leyMxXGhmaWx9fQotCi1cbmV3c2tpcFxzZWNvbmRhcnlpbmRlbnQgXHNlY29uZGFyeWluZGVudD0wLjVjbQotCi1cZGVmXHNlY29uZGFyeSAjMSMyewote1xwYXJmaWxsc2tpcD0waW4gXHBhcnNraXA9MGluCi1caGFuZ2luZGVudCA9MWluIFxoYW5nYWZ0ZXI9MQotXG5vaW5kZW50XGhza2lwXHNlY29uZGFyeWluZGVudFxoYm94eyMxfVxpbmRleGRvdGZpbGwgIzJccGFyCi19fQotCi0lIERlZmluZSB0d28tY29sdW1uIG1vZGUsIHdoaWNoIHdlIHVzZSB0byB0eXBlc2V0IGluZGV4ZXMuCi0lIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaywgcGFnZSA0MTYsIHdoaWNoIGlzIHRvIHNheSwKLSUgdGhlIG1hbm1hYy50ZXggZm9ybWF0IHVzZWQgdG8gcHJpbnQgdGhlIFRlWGJvb2sgaXRzZWxmLgotXGNhdGNvZGVgXEA9MTEKLQotXG5ld2JveFxwYXJ0aWFscGFnZQotXG5ld2RpbWVuXGRvdWJsZWNvbHVtbmhzaXplCi0KLVxkZWZcYmVnaW5kb3VibGVjb2x1bW5ze1xiZWdpbmdyb3VwICUgZW5kZWQgYnkgXGVuZGRvdWJsZWNvbHVtbnMKLSAgJSBHcmFiIGFueSBzaW5nbGUtY29sdW1uIG1hdGVyaWFsIGFib3ZlIHVzLgotICBcb3V0cHV0ID0ge1xnbG9iYWxcc2V0Ym94XHBhcnRpYWxwYWdlID0gXHZib3h7JQotICAgICUgCi0gICAgJSBIZXJlIGlzIGEgcG9zc2liaWxpdHkgbm90IGZvcmVzZWVuIGluIG1hbm1hYzogaWYgd2UgYWNjdW11bGF0ZSBhCi0gICAgJSB3aG9sZSBsb3Qgb2YgbWF0ZXJpYWwsIHdlIG1pZ2h0IGVuZCB1cCBjYWxsaW5nIHRoaXMgXG91dHB1dAotICAgICUgcm91dGluZSB0d2ljZSBpbiBhIHJvdyAoc2VlIHRoZSBkb3VibGVjb2wtbG9zZSB0ZXN0LCB3aGljaCBpcwotICAgICUgZXNzZW50aWFsbHkgYSBjb3VwbGUgb2YgaW5kZXhlcyB3aXRoIEBzZXRjaGFwdGVybmV3cGFnZSBvZmYpLiAgSW4KLSAgICAlIHRoYXQgY2FzZSwgd2UgbXVzdCBwcmV2ZW50IHRoZSBzZWNvbmQgXHBhcnRpYWxwYWdlIGZyb20KLSAgICAlIHNpbXBseSBvdmVyd3JpdGluZyB0aGUgZmlyc3QsIGNhdXNpbmcgdXMgdG8gbG9zZSB0aGUgcGFnZS4KLSAgICAlIFRoaXMgd2lsbCBwcmVzZXJ2ZSBpdCB1bnRpbCBhIHJlYWwgb3V0cHV0IHJvdXRpbmUgY2FuIHNoaXAgaXQKLSAgICAlIG91dC4gIEdlbmVyYWxseSwgXHBhcnRpYWxwYWdlIHdpbGwgYmUgZW1wdHkgd2hlbiB0aGlzIHJ1bnMgYW5kCi0gICAgJSB0aGlzIHdpbGwgYmUgYSBuby1vcC4KLSAgICBcdW52Ym94XHBhcnRpYWxwYWdlCi0gICAgJQotICAgICUgVW52Ym94IHRoZSBtYWluIG91dHB1dCBwYWdlLgotICAgIFx1bnZib3gyNTUKLSAgICBca2Vybi1cdG9wc2tpcCBca2VyblxiYXNlbGluZXNraXAKLSAgfX0lCi0gIFxlamVjdAotICAlCi0gICUgVXNlIHRoZSBkb3VibGUtY29sdW1uIG91dHB1dCByb3V0aW5lIGZvciBzdWJzZXF1ZW50IHBhZ2VzLgotICBcb3V0cHV0ID0ge1xkb3VibGVjb2x1bW5vdXR9JQotICAlCi0gICUgQ2hhbmdlIHRoZSBwYWdlIHNpemUgcGFyYW1ldGVycy4gIFdlIGNvdWxkIGRvIHRoaXMgb25jZSBvdXRzaWRlIHRoaXMKLSAgJSByb3V0aW5lLCBpbiBlYWNoIG9mIEBzbWFsbGJvb2ssIEBhZm91cnBhcGVyLCBhbmQgdGhlIGRlZmF1bHQgOC41eDExCi0gICUgZm9ybWF0LCBidXQgdGhlbiB3ZSByZXBlYXQgdGhlIHNhbWUgY29tcHV0YXRpb24uICBSZXBlYXRpbmcgYSBjb3VwbGUKLSAgJSBvZiBhc3NpZ25tZW50cyBvbmNlIHBlciBpbmRleCBpcyBjbGVhcmx5IG1lYW5pbmdsZXNzIGZvciB0aGUKLSAgJSBleGVjdXRpb24gdGltZSwgc28gd2UgbWF5IGFzIHdlbGwgZG8gaXQgaW4gb25lIHBsYWNlLgotICAlCi0gICUgRmlyc3Qgd2UgaGFsdmUgdGhlIGxpbmUgbGVuZ3RoLCBsZXNzIGEgbGl0dGxlIGZvciB0aGUgZ3V0dGVyIGJldHdlZW4KLSAgJSB0aGUgY29sdW1ucy4gIFdlIGNvbXB1dGUgdGhlIGd1dHRlciBiYXNlZCBvbiB0aGUgbGluZSBsZW5ndGgsIHNvIGl0Ci0gICUgY2hhbmdlcyBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIHBhcGVyIGZvcm1hdC4gIFRoZSBtYWdpYyBjb25zdGFudAotICAlIGJlbG93IGlzIGNob3NlbiBzbyB0aGF0IHRoZSBndXR0ZXIgaGFzIHRoZSBzYW1lIHZhbHVlICh3ZWxsLCArLTwxcHQpCi0gICUgYXMgaXQgZGlkIHdoZW4gd2UgaGFyZC1jb2RlZCBpdC4KLSAgJQotICAlIFdlIHB1dCB0aGUgcmVzdWx0IGluIGEgc2VwYXJhdGUgcmVnaXN0ZXIsIFxkb3VibGVjb2x1bWhzaXplLCBzbyB3ZQotICAlIGNhbiByZXN0b3JlIGl0IGluIFxwYWdlc29mYXIsIGFmdGVyIFxoc2l6ZSBpdHNlbGYgaGFzIChwb3RlbnRpYWxseSkKLSAgJSBiZWVuIGNsb2JiZXJlZC4KLSAgJQotICBcZG91YmxlY29sdW1uaHNpemUgPSBcaHNpemUKLSAgICBcYWR2YW5jZVxkb3VibGVjb2x1bW5oc2l6ZSBieSAtLjA0MTU0XGhzaXplCi0gICAgXGRpdmlkZVxkb3VibGVjb2x1bW5oc2l6ZSBieSAyCi0gIFxoc2l6ZSA9IFxkb3VibGVjb2x1bW5oc2l6ZQotICAlCi0gICUgRG91YmxlIHRoZSBcdnNpemUgYXMgd2VsbC4gIChXZSBkb24ndCBuZWVkIGEgc2VwYXJhdGUgcmVnaXN0ZXIgaGVyZSwKLSAgJSBzaW5jZSBub2JvZHkgY2xvYmJlcnMgXHZzaXplLikKLSAgXGFkdmFuY2VcdnNpemUgYnkgLVxodFxwYXJ0aWFscGFnZQotICBcdnNpemUgPSAyXHZzaXplCi19Ci0KLSUgVGhlIGRvdWJsZS1jb2x1bW4gb3V0cHV0IHJvdXRpbmUgZm9yIGFsbCBkb3VibGUtY29sdW1uIHBhZ2VzIGV4Y2VwdAotJSB0aGUgbGFzdC4KLSUgCi1cZGVmXGRvdWJsZWNvbHVtbm91dHslCi0gIFxzcGxpdHRvcHNraXA9XHRvcHNraXAgXHNwbGl0bWF4ZGVwdGg9XG1heGRlcHRoCi0gICUgR2V0IHRoZSBhdmFpbGFibGUgc3BhY2UgZm9yIHRoZSBkb3VibGUgY29sdW1ucyAtLSB0aGUgbm9ybWFsCi0gICUgKHVuZG91YmxlZCkgcGFnZSBoZWlnaHQgbWludXMgYW55IG1hdGVyaWFsIGxlZnQgb3ZlciBmcm9tIHRoZQotICAlIHByZXZpb3VzIHBhZ2UuCi0gIFxkaW1lbkAgPSBcdnNpemUKLSAgXGRpdmlkZVxkaW1lbkAgYnkgMgotICAlCi0gICUgYm94MCB3aWxsIGJlIHRoZSBsZWZ0LWhhbmQgY29sdW1uLCBib3gyIHRoZSByaWdodC4KLSAgXHNldGJveDA9XHZzcGxpdDI1NSB0b1xkaW1lbkAgXHNldGJveDI9XHZzcGxpdDI1NSB0b1xkaW1lbkAKLSAgXG9uZXBhZ2VvdXRccGFnZXNvZmFyCi0gIFx1bnZib3gyNTUKLSAgXHBlbmFsdHlcb3V0cHV0cGVuYWx0eQotfQotXGRlZlxwYWdlc29mYXJ7JQotICAlIFJlLW91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG91dHB1dCBwYWdlIC0tIGFueSBwcmV2aW91cyBtYXRlcmlhbCwKLSAgJSBmb2xsb3dlZCBieSB0aGUgdHdvIGJveGVzIHdlIGp1c3Qgc3BsaXQsIGluIGJveDAgYW5kIGJveDIuCi0gIFxhZHZhbmNlXHZzaXplIGJ5IFxodFxwYXJ0aWFscGFnZQotICBcdW52Ym94XHBhcnRpYWxwYWdlCi0gICUKLSAgXGhzaXplID0gXGRvdWJsZWNvbHVtbmhzaXplCi0gIFx3ZDA9XGhzaXplIFx3ZDI9XGhzaXplCi0gIFxoYm94IHRvXHBhZ2V3aWR0aHtcYm94MFxoZmlsXGJveDJ9JQotfQotXGRlZlxlbmRkb3VibGVjb2x1bW5zeyUKLSAgXG91dHB1dCA9IHslCi0gICAgJSBTcGxpdCB0aGUgbGFzdCBvZiB0aGUgZG91YmxlLWNvbHVtbiBtYXRlcmlhbC4gIExlYXZlIG9uIHRoZQotICAgICUgY3VycmVudCBwYWdlLCBubyBhdXRvbWF0aWMgcGFnZSBicmVhay4KLSAgICBcYmFsYW5jZWNvbHVtbnMKLSAgICAlCi0gICAgJSBJZiB3ZSBlbmQgdXAgc3BsaXR0aW5nIHRvbyBtdWNoIG1hdGVyaWFsIGZvciB0aGUgY3VycmVudCBwYWdlLAotICAgICUgdGhvdWdoLCB0aGVyZSB3aWxsIGJlIGFub3RoZXIgcGFnZSBicmVhayByaWdodCBhZnRlciB0aGlzIFxvdXRwdXQKLSAgICAlIGludm9jYXRpb24gZW5kcy4gIEhhdmluZyBjYWxsZWQgXGJhbGFuY2Vjb2x1bW5zIG9uY2UsIHdlIGRvIG5vdAotICAgICUgd2FudCB0byBjYWxsIGl0IGFnYWluLiAgVGhlcmVmb3JlLCByZXNldCBcb3V0cHV0IHRvIGl0cyBub3JtYWwKLSAgICAlIGRlZmluaXRpb24gcmlnaHQgYXdheS4gIChXZSBob3BlIFxiYWxhbmNlY29sdW1ucyB3aWxsIG5ldmVyIGJlCi0gICAgJSBjYWxsZWQgb24gdG8gYmFsYW5jZSB0b28gbXVjaCBtYXRlcmlhbCwgYnV0IGlmIGl0IGlzLCB0aGlzIG1ha2VzCi0gICAgJSB0aGUgb3V0cHV0IHNvbWV3aGF0IG1vcmUgcGFsYXRhYmxlLikKLSAgICBcZ2xvYmFsXG91dHB1dCA9IHtcb25lcGFnZW91dHtccGFnZWNvbnRlbnRzXFBBR0V9fSUKLSAgICAlCi0gICAgJSBccGFnZWdvYWwgd2FzIHNldCB0byB0aGUgZG91YmxlZCBcdnNpemUgYWJvdmUsIHNpbmNlIHdlIHJlc3RhcnRlZAotICAgICUgdGhlIGN1cnJlbnQgcGFnZS4gIFdlJ3JlIG5vdyBiYWNrIHRvIG5vcm1hbCBzaW5nbGUtY29sdW1uCi0gICAgJSB0eXBlc2V0dGluZywgc28gcmVzZXQgXHBhZ2Vnb2FsIHRvIHRoZSBub3JtYWwgXHZzaXplLgotICAgIFxwYWdlZ29hbCA9IFx2c2l6ZQotICB9JQotICBcZWplY3QKLSAgXGVuZGdyb3VwICUgc3RhcnRlZCBpbiBcYmVnaW5kb3VibGVjb2x1bW5zCi19Ci1cZGVmXGJhbGFuY2Vjb2x1bW5zeyUKLSAgJSBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZG91YmxlIGNvbHVtbiBtYXRlcmlhbC4KLSAgXHNldGJveDAgPSBcdmJveHtcdW52Ym94MjU1fSUgbGlrZSBcYm94MjU1IGJ1dCBtb3JlIGVmZmljaWVudCwgc2VlIHAuMTIwLgotICBcZGltZW5AID0gXGh0MAotICBcYWR2YW5jZVxkaW1lbkAgYnkgXHRvcHNraXAKLSAgXGFkdmFuY2VcZGltZW5AIGJ5LVxiYXNlbGluZXNraXAKLSAgXGRpdmlkZVxkaW1lbkAgYnkgMiAlIHRhcmdldCB0byBzcGxpdCB0bwotICAlZGVidWdcbWVzc2FnZXtmaW5hbCAyLWNvbHVtbiBtYXRlcmlhbCBoZWlnaHQ9XHRoZVxodDAsIHRhcmdldD1cdGhlXGRpbWVuQC59JQotICBcc3BsaXR0b3Bza2lwID0gXHRvcHNraXAKLSAgJSBMb29wIHVudGlsIHdlIGdldCBhIGRlY2VudCBicmVha3BvaW50LgotICB7JQotICAgIFx2YmFkbmVzcyA9IDEwMDAwCi0gICAgXGxvb3AKLSAgICAgIFxnbG9iYWxcc2V0Ym94MyA9IFxjb3B5MAotICAgICAgXGdsb2JhbFxzZXRib3gxID0gXHZzcGxpdDMgdG8gXGRpbWVuQAotICAgIFxpZmRpbVxodDM+XGRpbWVuQAotICAgICAgXGdsb2JhbFxhZHZhbmNlXGRpbWVuQCBieSAxcHQKLSAgICBccmVwZWF0Ci0gIH0lCi0gICVkZWJ1Z1xtZXNzYWdle3NwbGl0IHRvIFx0aGVcZGltZW5ALCBjb2x1bW4gaGVpZ2h0czogXHRoZVxodDEsIFx0aGVcaHQzLn0lCi0gIFxzZXRib3gwPVx2Ym94IHRvXGRpbWVuQHtcdW52Ym94MX0lCi0gIFxzZXRib3gyPVx2Ym94IHRvXGRpbWVuQHtcdW52Ym94M30lCi0gICUKLSAgXHBhZ2Vzb2ZhcgotfQotXGNhdGNvZGVgXEAgPSBcb3RoZXIKLQotCi1cbWVzc2FnZXtzZWN0aW9uaW5nLH0KLSUgRGVmaW5lIGNoYXB0ZXJzLCBzZWN0aW9ucywgZXRjLgotCi1cbmV3Y291bnRcY2hhcG5vCi1cbmV3Y291bnRcc2Vjbm8gICAgICAgIFxzZWNubz0wCi1cbmV3Y291bnRcc3Vic2Vjbm8gICAgIFxzdWJzZWNubz0wCi1cbmV3Y291bnRcc3Vic3Vic2Vjbm8gIFxzdWJzdWJzZWNubz0wCi0KLSUgVGhpcyBjb3VudGVyIGlzIGZ1bm55IHNpbmNlIGl0IGNvdW50cyB0aHJvdWdoIGNoYXJjb2RlcyBvZiBsZXR0ZXJzIEEsIEIsIC4uLgotXG5ld2NvdW50XGFwcGVuZGl4bm8gIFxhcHBlbmRpeG5vID0gYFxACi1cZGVmXGFwcGVuZGl4bGV0dGVye1xjaGFyXHRoZVxhcHBlbmRpeG5vfQotCi0lIEVhY2ggQGNoYXB0ZXIgZGVmaW5lcyB0aGlzIGFzIHRoZSBuYW1lIG9mIHRoZSBjaGFwdGVyLgotJSBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncyBjYW4gdXNlIGl0LiAgQHNlY3Rpb24gZG9lcyBsaWtld2lzZS4KLVxkZWZcdGhpc2NoYXB0ZXJ7fQotXGRlZlx0aGlzc2VjdGlvbnt9Ci0KLVxuZXdjb3VudFxhYnNzZWNsZXZlbCAlIHVzZWQgdG8gY2FsY3VsYXRlIHByb3BlciBoZWFkaW5nIGxldmVsCi1cbmV3Y291bnRcc2VjYmFzZVxzZWNiYXNlPTAgJSBAcmFpc2UvbG93ZXJzZWN0aW9ucyBtb2RpZnkgdGhpcyBjb3VudAotCi0lIEByYWlzZXNlY3Rpb25zOiB0cmVhdCBAc2VjdGlvbiBhcyBjaGFwdGVyLCBAc3Vic2VjdGlvbiBhcyBzZWN0aW9uLCBldGMuCi1cZGVmXHJhaXNlc2VjdGlvbnN7XGdsb2JhbFxhZHZhbmNlXHNlY2Jhc2UgYnkgLTF9Ci1cbGV0XHVwPVxyYWlzZXNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCi0KLSUgQGxvd2Vyc2VjdGlvbnM6IHRyZWF0IEBjaGFwdGVyIGFzIHNlY3Rpb24sIEBzZWN0aW9uIGFzIHN1YnNlY3Rpb24sIGV0Yy4KLVxkZWZcbG93ZXJzZWN0aW9uc3tcZ2xvYmFsXGFkdmFuY2Vcc2VjYmFzZSBieSAxfQotXGxldFxkb3duPVxsb3dlcnNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCi0KLSUgQ2hvb3NlIGEgbnVtYmVyZWQtaGVhZGluZyBtYWNybwotJSAjMSBpcyBoZWFkaW5nIGxldmVsIGlmIHVubW9kaWZpZWQgYnkgQHJhaXNlc2VjdGlvbnMgb3IgQGxvd2Vyc2VjdGlvbnMKLSUgIzIgaXMgdGV4dCBmb3IgaGVhZGluZwotXGRlZlxudW1oZWFkIzEjMntcYWJzc2VjbGV2ZWw9XHNlY2Jhc2VcYWR2YW5jZVxhYnNzZWNsZXZlbCBieSAjMQotXGlmY2FzZVxhYnNzZWNsZXZlbAotICBcY2hhcHRlcnp6ensjMn0KLVxvcgotICBcc2Vjenp6eyMyfQotXG9yCi0gIFxudW1iZXJlZHN1YnNlY3p6ensjMn0KLVxvcgotICBcbnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci1cZWxzZQotICBcaWZudW0gXGFic3NlY2xldmVsPDAKLSAgICBcY2hhcHRlcnp6ensjMn0KLSAgXGVsc2UKLSAgICBcbnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci0gIFxmaQotXGZpCi19Ci0KLSUgbGlrZSBcbnVtaGVhZCwgYnV0IGNob29zZXMgYXBwZW5kaXggaGVhZGluZyBsZXZlbHMKLVxkZWZcYXBwaGVhZCMxIzJ7XGFic3NlY2xldmVsPVxzZWNiYXNlXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgIzEKLVxpZmNhc2VcYWJzc2VjbGV2ZWwKLSAgXGFwcGVuZGl4enp6eyMyfQotXG9yCi0gIFxhcHBlbmRpeHNlY3Rpb256enp7IzJ9Ci1cb3IKLSAgXGFwcGVuZGl4c3Vic2Vjenp6eyMyfQotXG9yCi0gIFxhcHBlbmRpeHN1YnN1YnNlY3p6ensjMn0KLVxlbHNlCi0gIFxpZm51bSBcYWJzc2VjbGV2ZWw8MAotICAgIFxhcHBlbmRpeHp6ensjMn0KLSAgXGVsc2UKLSAgICBcYXBwZW5kaXhzdWJzdWJzZWN6enp7IzJ9Ci0gIFxmaQotXGZpCi19Ci0KLSUgbGlrZSBcbnVtaGVhZCwgYnV0IGNob29zZXMgbnVtYmVybGVzcyBoZWFkaW5nIGxldmVscwotXGRlZlx1bm5taGVhZCMxIzJ7XGFic3NlY2xldmVsPVxzZWNiYXNlXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgIzEKLVxpZmNhc2VcYWJzc2VjbGV2ZWwKLSAgXHVubnVtYmVyZWR6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzZWN6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzdWJzZWN6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci1cZWxzZQotICBcaWZudW0gXGFic3NlY2xldmVsPDAKLSAgICBcdW5udW1iZXJlZHp6ensjMn0KLSAgXGVsc2UKLSAgICBcdW5udW1iZXJlZHN1YnN1YnNlY3p6ensjMn0KLSAgXGZpCi1cZmkKLX0KLQotJSBAY2hhcHRlciwgQGFwcGVuZGl4LCBAdW5udW1iZXJlZC4KLVxkZWZcdGhpc2NoYXB0ZXJuYW1le05vIENoYXB0ZXIgVGl0bGV9Ci1cb3V0ZXJcZGVmXGNoYXB0ZXJ7XHBhcnNlYXJnXGNoYXB0ZXJ5eXl9Ci1cZGVmXGNoYXB0ZXJ5eXkgIzF7XG51bWhlYWQweyMxfX0gJSBub3JtYWxseSBudW1oZWFkMCBjYWxscyBjaGFwdGVyenp6Ci1cZGVmXGNoYXB0ZXJ6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLVxnbG9iYWxcYWR2YW5jZSBcY2hhcG5vIGJ5IDEgXG1lc3NhZ2V7XHB1dHdvcmRDaGFwdGVyXHNwYWNlIFx0aGVcY2hhcG5vfSUKLVxjaGFwbWFjcm8geyMxfXtcdGhlXGNoYXBub30lCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cZ2RlZlx0aGlzY2hhcHRlcm5hbWV7IzF9JQotJSBXZSBkb24ndCBzdWJzdGl0dXRlIHRoZSBhY3R1YWwgY2hhcHRlciBuYW1lIGludG8gXHRoaXNjaGFwdGVyCi0lIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBpdHMgbWFjcm9zIGV2YWx1YXRlZCBub3cuCi1ceGRlZlx0aGlzY2hhcHRlcntccHV0d29yZENoYXB0ZXJ7fSBcdGhlXGNoYXBubzogXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBjaGFwZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcbnVtYmVyZWRzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzdWJzZWMKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHtccGFyc2VhcmdcYXBwZW5kaXh5eXl9Ci1cZGVmXGFwcGVuZGl4eXl5ICMxe1xhcHBoZWFkMHsjMX19ICUgbm9ybWFsbHkgYXBwaGVhZDAgY2FsbHMgYXBwZW5kaXh6enoKLVxkZWZcYXBwZW5kaXh6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLVxnbG9iYWxcYWR2YW5jZSBcYXBwZW5kaXhubyBieSAxCi1cbWVzc2FnZXtccHV0d29yZEFwcGVuZGl4XHNwYWNlIFxhcHBlbmRpeGxldHRlcn0lCi1cY2hhcG1hY3JvIHsjMX17XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcn0lCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cZ2RlZlx0aGlzY2hhcHRlcm5hbWV7IzF9JQotXHhkZWZcdGhpc2NoYXB0ZXJ7XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcjogXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBjaGFwZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgIHtccHV0d29yZEFwcGVuZGl4e30gXGFwcGVuZGl4bGV0dGVyfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcYXBwZW5kaXhzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzdWJzZWMKLX0KLQotJSBAY2VudGVyY2hhcCBpcyBsaWtlIEB1bm51bWJlcmVkLCBidXQgdGhlIGhlYWRpbmcgaXMgY2VudGVyZWQuCi1cb3V0ZXJcZGVmXGNlbnRlcmNoYXB7XHBhcnNlYXJnXGNlbnRlcmNoYXB5eXl9Ci1cZGVmXGNlbnRlcmNoYXB5eXkgIzF7e1xsZXRcdW5udW1iY2hhcG1hY3JvPVxjZW50ZXJjaGFwbWFjcm8gXHVubnVtYmVyZWR5eXl7IzF9fX0KLQotJSBAdG9wIGlzIGxpa2UgQHVubnVtYmVyZWQuCi1cb3V0ZXJcZGVmXHRvcHtccGFyc2VhcmdcdW5udW1iZXJlZHl5eX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVke1xwYXJzZWFyZ1x1bm51bWJlcmVkeXl5fQotXGRlZlx1bm51bWJlcmVkeXl5ICMxe1x1bm5taGVhZDB7IzF9fSAlIG5vcm1hbGx5IHVubm1oZWFkMCBjYWxscyB1bm51bWJlcmVkenp6Ci1cZGVmXHVubnVtYmVyZWR6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLSUKLSUgVGhpcyB1c2VkIHRvIGJlIHNpbXBseSBcbWVzc2FnZXsjMX0sIGJ1dCBUZVggZnVsbHkgZXhwYW5kcyB0aGUKLSUgYXJndW1lbnQgdG8gXG1lc3NhZ2UuICBUaGVyZWZvcmUsIGlmICMxIGNvbnRhaW5lZCBALWNvbW1hbmRzLCBUZVgKLSUgZXhwYW5kZWQgdGhlbS4gIEZvciBleGFtcGxlLCBpbiBgQHVubnVtYmVyZWQgVGhlIEBjaXRle0Jvb2t9JywgVGVYCi0lIGV4cGFuZGVkIEBjaXRlICh3aGljaCB0dXJucyBvdXQgdG8gY2F1c2UgZXJyb3JzIGJlY2F1c2UgXGNpdGUgaXMgbWVhbnQKLSUgdG8gYmUgZXhlY3V0ZWQsIG5vdCBleHBhbmRlZCkuCi0lCi0lIEFueXdheSwgd2UgZG9uJ3Qgd2FudCB0aGUgZnVsbHktZXhwYW5kZWQgZGVmaW5pdGlvbiBvZiBAY2l0ZSB0byBhcHBlYXIKLSUgYXMgYSByZXN1bHQgb2YgdGhlIFxtZXNzYWdlLCB3ZSBqdXN0IHdhbnQgYEBjaXRlJyBpdHNlbGYuICBXZSB1c2UKLSUgXHRoZTx0b2tzIHJlZ2lzdGVyPiB0byBhY2hpZXZlIHRoaXM6IFRlWCBleHBhbmRzIFx0aGU8dG9rcz4gb25seSBvbmNlLAotJSBzaW1wbHkgeWllbGRpbmcgdGhlIGNvbnRlbnRzIG9mIDx0b2tzIHJlZ2lzdGVyPi4gIChXZSBhbHNvIGRvIHRoaXMgZm9yCi0lIHRoZSB0b2MgZW50cmllcy4pCi1cdG9rczAgPSB7IzF9XG1lc3NhZ2V7KFx0aGVcdG9rczApfSUKLSUKLVx1bm51bWJjaGFwbWFjcm8geyMxfSUKLVxnZGVmXHRoaXNjaGFwdGVyeyMxfVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHVubnVtYmNoYXBlbnRyeXtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXHVubnVtYmVyZWRzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcdW5udW1iZXJlZHN1YnNlYwotXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFx1bm51bWJlcmVkc3Vic3Vic2VjCi19Ci0KLSUgU2VjdGlvbnMuCi1cb3V0ZXJcZGVmXG51bWJlcmVkc2Vje1xwYXJzZWFyZ1xzZWN5eXl9Ci1cZGVmXHNlY3l5eSAjMXtcbnVtaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHNlY3p6egotXGRlZlxzZWN6enogIzF7JQotXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzZWNubyBieSAxICUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzZWNoZWFkaW5nIHsjMX17XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXhzZWN0aW9ue1xwYXJzZWFyZ1xhcHBlbmRpeHNlY3l5eX0KLVxvdXRlclxkZWZcYXBwZW5kaXhzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c2VjeXl5fQotXGRlZlxhcHBlbmRpeHNlY3l5eSAjMXtcYXBwaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c2VjdGlvbnp6egotXGRlZlxhcHBlbmRpeHNlY3Rpb256enogIzF7JQotXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzZWNubyBieSAxICUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzZWNoZWFkaW5nIHsjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99fX0lCi1cdGVtcAotXGFwcGVuZGl4bm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVkc2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc2VjeXl5fQotXGRlZlx1bm51bWJlcmVkc2VjeXl5ICMxe1x1bm5taGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzZWN6enoKLVxkZWZcdW5udW1iZXJlZHNlY3p6eiAjMXslCi1ccGxhaW5zZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJzZWNlbnRyeXtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cbm9icmVhawotfQotCi0lIFN1YnNlY3Rpb25zLgotXG91dGVyXGRlZlxudW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcbnVtYmVyZWRzdWJzZWN5eXl9Ci1cZGVmXG51bWJlcmVkc3Vic2VjeXl5ICMxe1xudW1oZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgbnVtYmVyZWRzdWJzZWN6enoKLVxkZWZcbnVtYmVyZWRzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzdWJzZWNubyBieSAxICUKLVxzdWJzZWNoZWFkaW5nIHsjMX17XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc3Vic2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99fX0lCi1cdGVtcAotXGRvbm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzZWN5eXl9Ci1cZGVmXGFwcGVuZGl4c3Vic2VjeXl5ICMxe1xhcHBoZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgYXBwZW5kaXhzdWJzZWN6enoKLVxkZWZcYXBwZW5kaXhzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzdWJzZWNubyBieSAxICUKLVxzdWJzZWNoZWFkaW5nIHsjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcdW5udW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnNlY3l5eX0KLVxkZWZcdW5udW1iZXJlZHN1YnNlY3l5eSAjMXtcdW5ubWhlYWQyeyMxfX0gJW5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzdWJzZWN6enoKLVxkZWZcdW5udW1iZXJlZHN1YnNlY3p6eiAjMXslCi1ccGxhaW5zdWJzZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJzdWJzZWNlbnRyeSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cbm9icmVhawotfQotCi0lIFN1YnN1YnNlY3Rpb25zLgotXG91dGVyXGRlZlxudW1iZXJlZHN1YnN1YnNlY3tccGFyc2VhcmdcbnVtYmVyZWRzdWJzdWJzZWN5eXl9Ci1cZGVmXG51bWJlcmVkc3Vic3Vic2VjeXl5ICMxe1xudW1oZWFkM3sjMX19ICUgbm9ybWFsbHkgbnVtYmVyZWRzdWJzdWJzZWN6enoKLVxkZWZcbnVtYmVyZWRzdWJzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XGdsb2JhbFxhZHZhbmNlIFxzdWJzdWJzZWNubyBieSAxICUKLVxzdWJzdWJzZWNoZWFkaW5nIHsjMX0KLSAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICB7XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99e1x0aGVcc3Vic3Vic2Vjbm99fX0lCi1cdGVtcAotXGRvbm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzdWJzZWN5eXl9Ci1cZGVmXGFwcGVuZGl4c3Vic3Vic2VjeXl5ICMxe1xhcHBoZWFkM3sjMX19ICUgbm9ybWFsbHkgYXBwZW5kaXhzdWJzdWJzZWN6enoKLVxkZWZcYXBwZW5kaXhzdWJzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XGdsb2JhbFxhZHZhbmNlIFxzdWJzdWJzZWNubyBieSAxICUKLVxzdWJzdWJzZWNoZWFkaW5nIHsjMX0KLSAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzdWJzdWJzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub319fSUKLVx0ZW1wCi1cYXBwZW5kaXhub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzdWJzZWN5eXl9Ci1cZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN5eXkgIzF7XHVubm1oZWFkM3sjMX19ICVub3JtYWxseSB1bm51bWJlcmVkc3Vic3Vic2Vjenp6Ci1cZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN6enogIzF7JQotXHBsYWluc3Vic3Vic2VjaGVhZGluZyB7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggdW5udW1ic3Vic3Vic2VjZW50cnklCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXG5vYnJlYWsKLX0KLQotJSBUaGVzZSBhcmUgdmFyaWFudHMgd2hpY2ggYXJlIG5vdCAib3V0ZXIiLCBzbyB0aGV5IGNhbiBhcHBlYXIgaW4gQGlmaW5mby4KLSUgQWN0dWFsbHksIHRoZXkgc2hvdWxkIG5vdyBiZSBvYnNvbGV0ZTsgb3JkaW5hcnkgc2VjdGlvbiBjb21tYW5kcyBzaG91bGQgd29yay4KLVxkZWZcaW5mb3RvcHtccGFyc2VhcmdcdW5udW1iZXJlZHp6en0KLVxkZWZcaW5mb3VubnVtYmVyZWR7XHBhcnNlYXJnXHVubnVtYmVyZWR6enp9Ci1cZGVmXGluZm91bm51bWJlcmVkc2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc2Vjenp6fQotXGRlZlxpbmZvdW5udW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnNlY3p6en0KLVxkZWZcaW5mb3VubnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzdWJzZWN6enp9Ci0KLVxkZWZcaW5mb2FwcGVuZGl4e1xwYXJzZWFyZ1xhcHBlbmRpeHp6en0KLVxkZWZcaW5mb2FwcGVuZGl4c2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHNlY3p6en0KLVxkZWZcaW5mb2FwcGVuZGl4c3Vic2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHN1YnNlY3p6en0KLVxkZWZcaW5mb2FwcGVuZGl4c3Vic3Vic2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHN1YnN1YnNlY3p6en0KLQotXGRlZlxpbmZvY2hhcHRlcntccGFyc2VhcmdcY2hhcHRlcnp6en0KLVxkZWZcaW5mb3NlY3Rpb257XHBhcnNlYXJnXHNlY3Rpb256enp9Ci1cZGVmXGluZm9zdWJzZWN0aW9ue1xwYXJzZWFyZ1xzdWJzZWN0aW9uenp6fQotXGRlZlxpbmZvc3Vic3Vic2VjdGlvbntccGFyc2Vhcmdcc3Vic3Vic2VjdGlvbnp6en0KLQotJSBUaGVzZSBtYWNyb3MgY29udHJvbCB3aGF0IHRoZSBzZWN0aW9uIGNvbW1hbmRzIGRvLCBhY2NvcmRpbmcKLSUgdG8gd2hhdCBraW5kIG9mIGNoYXB0ZXIgd2UgYXJlIGluIChvcmRpbmFyeSwgYXBwZW5kaXgsIG9yIHVubnVtYmVyZWQpLgotJSBEZWZpbmUgdGhlbSBieSBkZWZhdWx0IGZvciBhIG51bWJlcmVkIGNoYXB0ZXIuCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXG51bWJlcmVkc2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic2VjCi1cZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCi0KLSUgRGVmaW5lIEBtYWpvcmhlYWRpbmcsIEBoZWFkaW5nIGFuZCBAc3ViaGVhZGluZwotCi0lIE5PVEUgb24gdXNlIG9mIFx2Ym94IGZvciBjaGFwdGVyIGhlYWRpbmdzLCBzZWN0aW9uIGhlYWRpbmdzLCBhbmQgc3VjaDoKLSUgICAgICAgMSkgV2UgdXNlIFx2Ym94IHJhdGhlciB0aGFuIHRoZSBlYXJsaWVyIFxsaW5lIHRvIHBlcm1pdAotJSAgICAgICAgICBvdmVybG9uZyBoZWFkaW5ncyB0byBmb2xkLgotJSAgICAgICAyKSBcaHlwaGVucGVuYWx0eSBpcyBzZXQgdG8gMTAwMDAgYmVjYXVzZSBoeXBoZW5hdGlvbiBpbiBhCi0lICAgICAgICAgIGhlYWRpbmcgaXMgb2Jub3hpb3VzOyB0aGlzIGZvcmJpZHMgaXQuCi0lICAgICAgIDMpIExpa2V3aXNlLCBoZWFkaW5ncyBsb29rIGJlc3QgaWYgbm8gXHBhcmluZGVudCBpcyB1c2VkLCBhbmQKLSUgICAgICAgICAgaWYganVzdGlmaWNhdGlvbiBpcyBub3QgYXR0ZW1wdGVkLiAgSGVuY2UgXHJhZ2dlZHJpZ2h0LgotCi0KLVxkZWZcbWFqb3JoZWFkaW5ne1xwYXJzZWFyZ1xtYWpvcmhlYWRpbmd6enp9Ci1cZGVmXG1ham9yaGVhZGluZ3p6eiAjMXslCi17XGFkdmFuY2VcY2hhcGhlYWRpbmdza2lwIGJ5IDEwcHQgXGNoYXBicmVhayB9JQote1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKLSAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJccGVuYWx0eSAyMDB9Ci0KLVxkZWZcY2hhcGhlYWRpbmd7XHBhcnNlYXJnXGNoYXBoZWFkaW5nenp6fQotXGRlZlxjaGFwaGVhZGluZ3p6eiAjMXtcY2hhcGJyZWFrICUKLXtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAotICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXHBlbmFsdHkgMjAwfQotCi0lIEBoZWFkaW5nLCBAc3ViaGVhZGluZywgQHN1YnN1YmhlYWRpbmcuCi1cZGVmXGhlYWRpbmd7XHBhcnNlYXJnXHBsYWluc2VjaGVhZGluZ30KLVxkZWZcc3ViaGVhZGluZ3tccGFyc2VhcmdccGxhaW5zdWJzZWNoZWFkaW5nfQotXGRlZlxzdWJzdWJoZWFkaW5ne1xwYXJzZWFyZ1xwbGFpbnN1YnN1YnNlY2hlYWRpbmd9Ci0KLSUgVGhlc2UgbWFjcm9zIGdlbmVyYXRlIGEgY2hhcHRlciwgc2VjdGlvbiwgZXRjLiBoZWFkaW5nIG9ubHkKLSUgKGluY2x1ZGluZyB3aGl0ZXNwYWNlLCBsaW5lYnJlYWtpbmcsIGV0Yy4gYXJvdW5kIGl0KSwKLSUgZ2l2ZW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiBjb252ZW5pZW50LCBwYXJzZWQgZm9ybS4KLQotJSUlIEFyZ3MgYXJlIHRoZSBza2lwIGFuZCBwZW5hbHR5ICh1c3VhbGx5IG5lZ2F0aXZlKQotXGRlZlxkb2JyZWFrIzEjMntccGFyXGlmZGltXGxhc3Rza2lwPCMxXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHkjMlx2c2tpcCMxXGZpfQotCi1cZGVmXHNldGNoYXB0ZXJzdHlsZSAjMSB7XGNzbmFtZSBDSEFQRiMxXGVuZGNzbmFtZX0KLQotJSUlIERlZmluZSBwbGFpbiBjaGFwdGVyIHN0YXJ0cywgYW5kIHBhZ2Ugb24vb2ZmIHN3aXRjaGluZyBmb3IgaXQKLSUgUGFyYW1ldGVyIGNvbnRyb2xsaW5nIHNraXAgYmVmb3JlIGNoYXB0ZXIgaGVhZGluZ3MgKGlmIG5lZWRlZCkKLQotXG5ld3NraXBcY2hhcGhlYWRpbmdza2lwCi0KLVxkZWZcY2hhcGJyZWFre1xkb2JyZWFrIFxjaGFwaGVhZGluZ3NraXAgey00MDAwfX0KLVxkZWZcY2hhcHBhZ2Vye1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KLVxkZWZcY2hhcG9kZHBhZ2V7XGNoYXBwYWdlciBcaWZvZGRccGFnZW5vIFxlbHNlIFxoYm94IHRvIDBwdHt9IFxjaGFwcGFnZXJcZml9Ci0KLVxkZWZcc2V0Y2hhcHRlcm5ld3BhZ2UgIzEge1xjc25hbWUgQ0hBUFBBRyMxXGVuZGNzbmFtZX0KLQotXGRlZlxDSEFQUEFHb2ZmeyUKLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLVxnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBicmVhawotXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBwYWdlcn0KLQotXGRlZlxDSEFQUEFHb257JQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcHBhZ2VyCi1cZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcHBhZ2VyCi1cZ2xvYmFsXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU3NpbmdsZX19Ci0KLVxkZWZcQ0hBUFBBR29kZHsKLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQotXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcG9kZHBhZ2UKLVxnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwb2RkcGFnZQotXGdsb2JhbFxkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9fQotCi1cQ0hBUFBBR29uCi0KLVxkZWZcQ0hBUEZwbGFpbnsKLVxnbG9iYWxcbGV0XGNoYXBtYWNybz1cY2hmcGxhaW4KLVxnbG9iYWxcbGV0XHVubnVtYmNoYXBtYWNybz1cdW5uY2hmcGxhaW4KLVxnbG9iYWxcbGV0XGNlbnRlcmNoYXBtYWNybz1cY2VudGVyY2hmcGxhaW59Ci0KLSUgUGxhaW4gY2hhcHRlciBvcGVuaW5nLgotJSAjMSBpcyB0aGUgdGV4dCwgIzIgdGhlIGNoYXB0ZXIgbnVtYmVyIG9yIGVtcHR5IGlmIHVubnVtYmVyZWQuCi1cZGVmXGNoZnBsYWluIzEjMnslCi0gIFxwY2hhcHNlcG1hY3JvCi0gIHslCi0gICAgXGNoYXBmb250cyBccm0KLSAgICBcZGVmXGNoYXBudW17IzJ9JQotICAgIFxzZXRib3gwID0gXGhib3h7IzJcaWZ4XGNoYXBudW1cZW1wdHlcZWxzZVxlbnNwYWNlXGZpfSUKLSAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgXGhhbmdpbmRlbnQgPSBcd2QwIFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUKLSAgICAgICAgICBcdW5oYm94MCAjMVxwYXJ9JQotICB9JQotICBcbm9icmVha1xiaWdza2lwICUgbm8gcGFnZSBicmVhayBhZnRlciBhIGNoYXB0ZXIgdGl0bGUKLSAgXG5vYnJlYWsKLX0KLQotJSBQbGFpbiBvcGVuaW5nIGZvciB1bm51bWJlcmVkLgotXGRlZlx1bm5jaGZwbGFpbiMxe1xjaGZwbGFpbnsjMX17fX0KLQotJSBAY2VudGVyY2hhcCAtLSBjZW50ZXJlZCBhbmQgdW5udW1iZXJlZC4KLVxsZXRcY2VudGVycGFyYW1ldGVyc21heWJlID0gXHJlbGF4Ci1cZGVmXGNlbnRlcmNoZnBsYWluIzF7eyUKLSAgXGRlZlxjZW50ZXJwYXJhbWV0ZXJzbWF5YmV7JQotICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSAzXHJpZ2h0c2tpcAotICAgIFxsZWZ0c2tpcCA9IFxyaWdodHNraXAKLSAgICBccGFyZmlsbHNraXAgPSAwcHQKLSAgfSUKLSAgXGNoZnBsYWlueyMxfXt9JQotfX0KLQotXENIQVBGcGxhaW4gJSBUaGUgZGVmYXVsdAotCi1cZGVmXHVubmNoZm9wZW4gIzF7JQotXGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxub2JyZWFrCi19Ci0KLVxkZWZcY2hmb3BlbiAjMSMye1xjaGFwb2RkcGFnZSB7XGNoYXBmb250cwotXHZib3ggdG8gM2lue1x2ZmlsIFxoYm94IHRvXGhzaXple1xoZmlsICMyfSBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMX0gXHZmaWx9fSUKLVxwYXJccGVuYWx0eSA1MDAwICUKLX0KLQotXGRlZlxjZW50ZXJjaGZvcGVuICMxeyUKLVxjaGFwb2RkcGFnZSB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAotICAgICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdAotICAgICAgICAgICAgICAgICAgICAgICBcaGZpbGwge1xybSAjMX1caGZpbGx9fVxiaWdza2lwIFxwYXJcbm9icmVhawotfQotCi1cZGVmXENIQVBGb3BlbnsKLVxnbG9iYWxcbGV0XGNoYXBtYWNybz1cY2hmb3BlbgotXGdsb2JhbFxsZXRcdW5udW1iY2hhcG1hY3JvPVx1bm5jaGZvcGVuCi1cZ2xvYmFsXGxldFxjZW50ZXJjaGFwbWFjcm89XGNlbnRlcmNoZm9wZW59Ci0KLQotJSBTZWN0aW9uIHRpdGxlcy4KLVxuZXdza2lwXHNlY2hlYWRpbmdza2lwCi1cZGVmXHNlY2hlYWRpbmdicmVha3tcZG9icmVhayBcc2VjaGVhZGluZ3NraXAgey0xMDAwfX0KLVxkZWZcc2VjaGVhZGluZyMxIzIjM3tcc2VjdGlvbmhlYWRpbmd7c2VjfXsjMi4jM317IzF9fQotXGRlZlxwbGFpbnNlY2hlYWRpbmcjMXtcc2VjdGlvbmhlYWRpbmd7c2VjfXt9eyMxfX0KLQotJSBTdWJzZWN0aW9uIHRpdGxlcy4KLVxuZXdza2lwIFxzdWJzZWNoZWFkaW5nc2tpcAotXGRlZlxzdWJzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHN1YnNlY2hlYWRpbmdza2lwIHstNTAwfX0KLVxkZWZcc3Vic2VjaGVhZGluZyMxIzIjMyM0e1xzZWN0aW9uaGVhZGluZ3tzdWJzZWN9eyMyLiMzLiM0fXsjMX19Ci1cZGVmXHBsYWluc3Vic2VjaGVhZGluZyMxe1xzZWN0aW9uaGVhZGluZ3tzdWJzZWN9e317IzF9fQotCi0lIFN1YnN1YnNlY3Rpb24gdGl0bGVzLgotXGxldFxzdWJzdWJzZWNoZWFkaW5nc2tpcCA9IFxzdWJzZWNoZWFkaW5nc2tpcAotXGxldFxzdWJzdWJzZWNoZWFkaW5nYnJlYWsgPSBcc3Vic2VjaGVhZGluZ2JyZWFrCi1cZGVmXHN1YnN1YnNlY2hlYWRpbmcjMSMyIzMjNCM1e1xzZWN0aW9uaGVhZGluZ3tzdWJzdWJzZWN9eyMyLiMzLiM0LiM1fXsjMX19Ci1cZGVmXHBsYWluc3Vic3Vic2VjaGVhZGluZyMxe1xzZWN0aW9uaGVhZGluZ3tzdWJzdWJzZWN9e317IzF9fQotCi0KLSUgUHJpbnQgYW55IHNpemUgc2VjdGlvbiB0aXRsZS4KLSUKLSUgIzEgaXMgdGhlIHNlY3Rpb24gdHlwZSAoc2VjL3N1YnNlYy9zdWJzdWJzZWMpLCAjMiBpcyB0aGUgc2VjdGlvbgotJSBudW1iZXIgKG1heWJlIGVtcHR5KSwgIzMgdGhlIHRleHQuCi1cZGVmXHNlY3Rpb25oZWFkaW5nIzEjMiMzeyUKLSAgeyUKLSAgICBcZXhwYW5kYWZ0ZXJcYWR2YW5jZVxjc25hbWUgIzFoZWFkaW5nc2tpcFxlbmRjc25hbWUgYnkgXHBhcnNraXAKLSAgICBcY3NuYW1lICMxaGVhZGluZ2JyZWFrXGVuZGNzbmFtZQotICB9JQotICB7JQotICAgICUgU3dpdGNoIHRvIHRoZSByaWdodCBzZXQgb2YgZm9udHMuCi0gICAgXGNzbmFtZSAjMWZvbnRzXGVuZGNzbmFtZSBccm0KLSAgICAlCi0gICAgJSBPbmx5IGluc2VydCB0aGUgc2VwYXJhdGluZyBzcGFjZSBpZiB3ZSBoYXZlIGEgc2VjdGlvbiBudW1iZXIuCi0gICAgXGRlZlxzZWNudW17IzJ9JQotICAgIFxzZXRib3gwID0gXGhib3h7IzJcaWZ4XHNlY251bVxlbXB0eVxlbHNlXGVuc3BhY2VcZml9JQotICAgICUKLSAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgXGhhbmdpbmRlbnQgPSBcd2QwICUgemVybyBpZiBubyBzZWN0aW9uIG51bWJlcgotICAgICAgICAgIFx1bmhib3gwICMzfSUKLSAgfSUKLSAgXGlmZGltXHBhcnNraXA8MTBwdCBcbm9icmVha1xrZXJuMTBwdFxub2JyZWFrXGtlcm4tXHBhcnNraXBcZmkgXG5vYnJlYWsKLX0KLQotCi1cbWVzc2FnZXt0b2MsfQotXG5ld3dyaXRlXHRvY2ZpbGUKLQotJSBXcml0ZSBhbiBlbnRyeSB0byB0aGUgdG9jIGZpbGUsIG9wZW5pbmcgaXQgaWYgbmVjZXNzYXJ5LgotJSBDYWxsZWQgZnJvbSBAY2hhcHRlciwgZXRjLiAgV2Ugc3VwcGx5IHtcZm9saW99IGF0IHRoZSBlbmQgb2YgdGhlCi0lIGFyZ3VtZW50LCB3aGljaCB3aWxsIGVuZCB1cCBhcyB0aGUgbGFzdCBhcmd1bWVudCB0byB0aGUgXC4uLmVudHJ5IG1hY3JvLgotJSAKLSUgV2Ugb3BlbiB0aGUgLnRvYyBmaWxlIGhlcmUgaW5zdGVhZCBvZiBhdCBAc2V0ZmlsZW5hbWUgb3IgYW55IG90aGVyCi0lIGdpdmVuIHRpbWUgc28gdGhhdCBAY29udGVudHMgY2FuIGJlIHB1dCBpbiB0aGUgZG9jdW1lbnQgYW55d2hlcmUuCi0lIAotXG5ld2lmXGlmdG9jZmlsZW9wZW5lZAotXGRlZlx3cml0ZXRvY2VudHJ5IzF7JQotICBcaWZ0b2NmaWxlb3BlbmVkXGVsc2UKLSAgICBcaW1tZWRpYXRlXG9wZW5vdXRcdG9jZmlsZSA9IFxqb2JuYW1lLnRvYwotICAgIFxnbG9iYWxcdG9jZmlsZW9wZW5lZHRydWUKLSAgXGZpCi0gIFxpZmxpbmtzIFx3cml0ZVx0b2NmaWxleyMxe1xmb2xpb319XGZpCi19Ci0KLVxuZXdza2lwXGNvbnRlbnRzcmlnaHRtYXJnaW4gXGNvbnRlbnRzcmlnaHRtYXJnaW49MWluCi1cbmV3Y291bnRcc2F2ZXBhZ2VubwotXG5ld2NvdW50XGxhc3RuZWdhdGl2ZXBhZ2VubyBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gLTEKLQotJSBGaW5pc2ggdXAgdGhlIG1haW4gdGV4dCBhbmQgcHJlcGFyZSB0byByZWFkIHdoYXQgd2UndmUgd3JpdHRlbgotJSB0byBcdG9jZmlsZS4KLSUgCi1cZGVmXHN0YXJ0Y29udGVudHMjMXslCi0gICAlIElmIEBzZXRjaGFwdGVybmV3cGFnZSBvbiwgYW5kIEBoZWFkaW5ncyBkb3VibGUsIHRoZSBjb250ZW50cyBzaG91bGQKLSAgICUgc3RhcnQgb24gYW4gb2RkIHBhZ2UsIHVubGlrZSBjaGFwdGVycy4gIFRodXMsIHdlIG1haW50YWluCi0gICAlIFxjb250ZW50c2FsaWdubWFjcm8gaW4gcGFyYWxsZWwgd2l0aCBccGFnZWFsaWdubWFjcm8uCi0gICAlIEZyb206IFRvcmJqb3JuIEdyYW5sdW5kIDx0ZWdlQG1hdGVtYXRpay5zdS5zZT4KLSAgIFxjb250ZW50c2FsaWdubWFjcm8KLSAgIFxpbW1lZGlhdGVcY2xvc2VvdXRcdG9jZmlsZQotICAgJQotICAgJSBEb24ndCBuZWVkIHRvIHB1dCBgQ29udGVudHMnIG9yIGBTaG9ydCBDb250ZW50cycgaW4gdGhlIGhlYWRsaW5lLgotICAgJSBJdCBpcyBhYnVuZGFudGx5IGNsZWFyIHdoYXQgdGhleSBhcmUuCi0gICBcdW5udW1iY2hhcG1hY3JveyMxfVxkZWZcdGhpc2NoYXB0ZXJ7fSUKLSAgIFxzYXZlcGFnZW5vID0gXHBhZ2VubwotICAgXGJlZ2luZ3JvdXAgICAgICAgICAgICAgICAgICAlIFNldCB1cCB0byBoYW5kbGUgY29udGVudHMgZmlsZXMgcHJvcGVybHkuCi0gICAgICBcY2F0Y29kZWBcXD0wICBcY2F0Y29kZWBcez0xICBcY2F0Y29kZWBcfT0yICBcY2F0Y29kZWBcQD0xMQotICAgICAgJSBXZSBjYW4ndCBkbyB0aGlzLCBiZWNhdXNlIHRoZW4gYW4gYWN0dWFsIF4gaW4gYSBzZWN0aW9uCi0gICAgICAlIHRpdGxlIGZhaWxzLCBlLmcuLCBAY2hhcHRlciBeIC0tIGV4cG9uZW50aWF0aW9uLiAgLS1rYXJsLCA5anVsOTcuCi0gICAgICAlXGNhdGNvZGVgXF49NyAlIHRvIHNlZSBeXmU0IGFzIFwiYSBldGMuIGp1aGFAcGl1aGEueWRpLnZ0dC5maQotICAgICAgXHJhZ2dlZGJvdHRvbSAgICAgICAgICAgICAlIFdvcnJ5IG1vcmUgYWJvdXQgYnJlYWtwb2ludHMgdGhhbiB0aGUgYm90dG9tLgotICAgICAgXGFkdmFuY2VcaHNpemUgYnkgLVxjb250ZW50c3JpZ2h0bWFyZ2luICUgRG9uJ3QgdXNlIHRoZSBmdWxsIGxpbmUgbGVuZ3RoLgotICAgICAgJQotICAgICAgJSBSb21hbiBudW1lcmFscyBmb3IgcGFnZSBudW1iZXJzLgotICAgICAgXGlmbnVtIFxwYWdlbm8+MCBccGFnZW5vID0gXGxhc3RuZWdhdGl2ZXBhZ2VubyBcZmkKLX0KLQotCi0lIE5vcm1hbCAobG9uZykgdG9jLgotXGRlZlxjb250ZW50c3slCi0gICBcc3RhcnRjb250ZW50c3tccHV0d29yZFRhYmxlb2ZDb250ZW50c30lCi0gICAgIFxvcGVuaW4gMSBcam9ibmFtZS50b2MKLSAgICAgXGlmZW9mIDEgXGVsc2UKLSAgICAgICBcY2xvc2VpbiAxCi0gICAgICAgXGlucHV0IFxqb2JuYW1lLnRvYwotICAgICBcZmkKLSAgICAgXHZmaWxsIFxlamVjdAotICAgXGVuZGdyb3VwCi0gICBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gXHBhZ2VubwotICAgXHBhZ2VubyA9IFxzYXZlcGFnZW5vCi19Ci0KLSUgQW5kIGp1c3QgdGhlIGNoYXB0ZXJzLgotXGRlZlxzdW1tYXJ5Y29udGVudHN7JQotICAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRTaG9ydENvbnRlbnRzfSUKLSAgICAgICUKLSAgICAgIFxsZXRcY2hhcGVudHJ5ID0gXHNob3J0Y2hhcGVudHJ5Ci0gICAgICBcbGV0XHVubnVtYmNoYXBlbnRyeSA9IFxzaG9ydHVubnVtYmVyZWRlbnRyeQotICAgICAgJSBXZSB3YW50IGEgdHJ1ZSByb21hbiBoZXJlIGZvciB0aGUgcGFnZSBudW1iZXJzLgotICAgICAgXHNlY2ZvbnRzCi0gICAgICBcbGV0XHJtPVxzaG9ydGNvbnRybSBcbGV0XGJmPVxzaG9ydGNvbnRiZiBcbGV0XHNsPVxzaG9ydGNvbnRzbAotICAgICAgXHJtCi0gICAgICBcaHlwaGVucGVuYWx0eSA9IDEwMDAwCi0gICAgICBcYWR2YW5jZVxiYXNlbGluZXNraXAgYnkgMXB0ICUgT3BlbiBpdCB1cCBhIGxpdHRsZS4KLSAgICAgIFxkZWZcc2VjZW50cnkgIyMxIyMyIyMzIyM0e30KLSAgICAgIFxkZWZcdW5udW1ic2VjZW50cnkgIyMxIyMye30KLSAgICAgIFxkZWZcc3Vic2VjZW50cnkgIyMxIyMyIyMzIyM0IyM1e30KLSAgICAgIFxkZWZcdW5udW1ic3Vic2VjZW50cnkgIyMxIyMye30KLSAgICAgIFxkZWZcc3Vic3Vic2VjZW50cnkgIyMxIyMyIyMzIyM0IyM1IyM2e30KLSAgICAgIFxkZWZcdW5udW1ic3Vic3Vic2VjZW50cnkgIyMxIyMye30KLSAgICAgIFxvcGVuaW4gMSBcam9ibmFtZS50b2MKLSAgICAgIFxpZmVvZiAxIFxlbHNlCi0gICAgICAgIFxjbG9zZWluIDEKLSAgICAgICAgXGlucHV0IFxqb2JuYW1lLnRvYwotICAgICAgXGZpCi0gICAgIFx2ZmlsbCBcZWplY3QKLSAgIFxlbmRncm91cAotICAgXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IFxwYWdlbm8KLSAgIFxwYWdlbm8gPSBcc2F2ZXBhZ2VubwotfQotXGxldFxzaG9ydGNvbnRlbnRzID0gXHN1bW1hcnljb250ZW50cwotCi0lIFRoZXNlIG1hY3JvcyBnZW5lcmF0ZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlIHRhYmxlIG9mIGNvbnRlbnRzLgotJSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNoYXB0ZXIgb3Igc2VjdGlvbiBuYW1lLgotJSBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgcGFnZSBudW1iZXIuCi0lIFRoZSBhcmd1bWVudHMgaW4gYmV0d2VlbiBhcmUgdGhlIGNoYXB0ZXIgbnVtYmVyLCBzZWN0aW9uIG51bWJlciwgLi4uCi0KLSUgQ2hhcHRlci1sZXZlbCB0aGluZ3MsIGZvciBib3RoIHRoZSBsb25nIGFuZCBzaG9ydCBjb250ZW50cy4KLVxkZWZcY2hhcGVudHJ5IzEjMiMze1xkb2NoYXBlbnRyeXsjMlxsYWJlbHNwYWNlIzF9eyMzfX0KLQotJSBTZWUgY29tbWVudHMgaW4gXGRvY2hhcGVudHJ5IHJlIHZib3ggYW5kIHJlbGF0ZWQgc2V0dGluZ3MKLVxkZWZcc2hvcnRjaGFwZW50cnkjMSMyIzN7JQotICBcdG9jZW50cnl7XHNob3J0Y2hhcGxhYmVseyMyfVxsYWJlbHNwYWNlICMxfXtcZG9zaG9ydHBhZ2Vub3sjM319JQotfQotCi0lIFR5cGVzZXQgdGhlIGxhYmVsIGZvciBhIGNoYXB0ZXIgb3IgYXBwZW5kaXggZm9yIHRoZSBzaG9ydCBjb250ZW50cy4KLSUgVGhlIGFyZyBpcywgZS5nLiBgQXBwZW5kaXggQScgZm9yIGFuIGFwcGVuZGl4LCBvciBgMycgZm9yIGEgY2hhcHRlci4KLSUgV2UgY291bGQgc2ltcGxpZnkgdGhlIGNvZGUgaGVyZSBieSB3cml0aW5nIG91dCBhbiBcYXBwZW5kaXhlbnRyeQotJSBjb21tYW5kIGluIHRoZSB0b2MgZmlsZSBmb3IgYXBwZW5kaWNlcywgaW5zdGVhZCBvZiB1c2luZyBcY2hhcGVudHJ5Ci0lIGZvciBib3RoLCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIGl0LgotXHNldGJveDAgPSBcaGJveHtcc2hvcnRjb250cm0gXHB1dHdvcmRBcHBlbmRpeCB9Ci1cbmV3ZGltZW5cc2hvcnRhcHBlbmRpeHdpZHRoIFxzaG9ydGFwcGVuZGl4d2lkdGggPSBcd2QwCi0KLVxkZWZcc2hvcnRjaGFwbGFiZWwjMXslCi0gICUgV2UgdHlwZXNldCAjMSBpbiBhIGJveCBvZiBjb25zdGFudCB3aWR0aCwgcmVnYXJkbGVzcyBvZiB0aGUgdGV4dCBvZgotICAlICMxLCBzbyB0aGUgY2hhcHRlciB0aXRsZXMgd2lsbCBjb21lIG91dCBhbGlnbmVkLgotICBcc2V0Ym94MCA9IFxoYm94eyMxfSUKLSAgXGRpbWVuMCA9IFxpZmRpbVx3ZDAgPiBcc2hvcnRhcHBlbmRpeHdpZHRoIFxzaG9ydGFwcGVuZGl4d2lkdGggXGVsc2UgMHB0IFxmaQotICAlCi0gICUgVGhpcyBzcGFjZSBzaG91bGQgYmUgcGxlbnR5LCBzaW5jZSBhIHNpbmdsZSBudW1iZXIgaXMgLjVlbSwgYW5kIHRoZQotICAlIHdpZGVzdCBsZXR0ZXIgKE0pIGlzIDFlbSwgYXQgbGVhc3QgaW4gdGhlIENvbXB1dGVyIE1vZGVybiBmb250cy4KLSAgJSAoVGhpcyBzcGFjZSBkb2Vzbid0IGluY2x1ZGUgdGhlIGV4dHJhIHNwYWNlIHRoYXQgZ2V0cyBhZGRlZCBhZnRlcgotICAlIHRoZSBsYWJlbDsgdGhhdCBnZXRzIHB1dCBpbiBieSBcc2hvcnRjaGFwZW50cnkgYWJvdmUuKQotICBcYWR2YW5jZVxkaW1lbjAgYnkgMS4xZW0KLSAgXGhib3ggdG8gXGRpbWVuMHsjMVxoZmlsfSUKLX0KLQotXGRlZlx1bm51bWJjaGFwZW50cnkjMSMye1xkb2NoYXBlbnRyeXsjMX17IzJ9fQotXGRlZlxzaG9ydHVubnVtYmVyZWRlbnRyeSMxIzJ7XHRvY2VudHJ5eyMxfXtcZG9zaG9ydHBhZ2Vub3sjMn19fQotCi0lIFNlY3Rpb25zLgotXGRlZlxzZWNlbnRyeSMxIzIjMyM0e1xkb3NlY2VudHJ5eyMyLiMzXGxhYmVsc3BhY2UjMX17IzR9fQotXGRlZlx1bm51bWJzZWNlbnRyeSMxIzJ7XGRvc2VjZW50cnl7IzF9eyMyfX0KLQotJSBTdWJzZWN0aW9ucy4KLVxkZWZcc3Vic2VjZW50cnkjMSMyIzMjNCM1e1xkb3N1YnNlY2VudHJ5eyMyLiMzLiM0XGxhYmVsc3BhY2UjMX17IzV9fQotXGRlZlx1bm51bWJzdWJzZWNlbnRyeSMxIzJ7XGRvc3Vic2VjZW50cnl7IzF9eyMyfX0KLQotJSBBbmQgc3Vic3Vic2VjdGlvbnMuCi1cZGVmXHN1YnN1YnNlY2VudHJ5IzEjMiMzIzQjNSM2eyUKLSAgXGRvc3Vic3Vic2VjZW50cnl7IzIuIzMuIzQuIzVcbGFiZWxzcGFjZSMxfXsjNn19Ci1cZGVmXHVubnVtYnN1YnN1YnNlY2VudHJ5IzEjMntcZG9zdWJzdWJzZWNlbnRyeXsjMX17IzJ9fQotCi0lIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBsZXZlbHMuCi1cbmV3ZGltZW5cdG9jaW5kZW50IFx0b2NpbmRlbnQgPSAzcGMKLQotJSBOb3cgZm9yIHRoZSBhY3R1YWwgdHlwZXNldHRpbmcuIEluIGFsbCB0aGVzZSwgIzEgaXMgdGhlIHRleHQgYW5kICMyIGlzIHRoZQotJSBwYWdlIG51bWJlci4KLSUKLSUgSWYgdGhlIHRvYyBoYXMgdG8gYmUgYnJva2VuIG92ZXIgcGFnZXMsIHdlIHdhbnQgaXQgdG8gYmUgYXQgY2hhcHRlcnMKLSUgaWYgYXQgYWxsIHBvc3NpYmxlOyBoZW5jZSB0aGUgXHBlbmFsdHkuCi1cZGVmXGRvY2hhcGVudHJ5IzEjMnslCi0gICBccGVuYWx0eS0zMDAgXHZza2lwMVxiYXNlbGluZXNraXAgcGx1cy4zM1xiYXNlbGluZXNraXAgbWludXMuMjVcYmFzZWxpbmVza2lwCi0gICBcYmVnaW5ncm91cAotICAgICBcY2hhcGVudHJ5Zm9udHMKLSAgICAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm97IzJ9fSUKLSAgIFxlbmRncm91cAotICAgXG5vYnJlYWtcdnNraXAgLjI1XGJhc2VsaW5lc2tpcCBwbHVzLjFcYmFzZWxpbmVza2lwCi19Ci0KLVxkZWZcZG9zZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPVx0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm97IzJ9fSUKLVxlbmRncm91cH0KLQotXGRlZlxkb3N1YnNlY2VudHJ5IzEjMntcYmVnaW5ncm91cAotICBcc3Vic2VjZW50cnlmb250cyBcbGVmdHNraXA9Mlx0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm97IzJ9fSUKLVxlbmRncm91cH0KLQotXGRlZlxkb3N1YnN1YnNlY2VudHJ5IzEjMntcYmVnaW5ncm91cAotICBcc3Vic3Vic2VjZW50cnlmb250cyBcbGVmdHNraXA9M1x0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm97IzJ9fSUKLVxlbmRncm91cH0KLQotJSBGaW5hbCB0eXBlc2V0dGluZyBvZiBhIHRvYyBlbnRyeTsgd2UgdXNlIHRoZSBzYW1lIFxlbnRyeSBtYWNybyBhcyBmb3IKLSUgdGhlIGluZGV4IGVudHJpZXMsIGJ1dCB3ZSB3YW50IHRvIHN1cHByZXNzIGh5cGhlbmF0aW9uIGhlcmUuICAoV2UKLSUgY2FuJ3QgZG8gdGhhdCBpbiB0aGUgXGVudHJ5IG1hY3JvLCBzaW5jZSBpbmRleCBlbnRyaWVzIG1pZ2h0IGNvbnNpc3QKLSUgb2YgaHlwaGVuYXRlZC1pZGVudGlmaWVycy10aGF0LWRvLW5vdC1maXQtb24tYS1saW5lLWFuZC1ub3RoaW5nLWVsc2UuKQotXGRlZlx0b2NlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHZza2lwIDBwdCBwbHVzMXB0ICUgYWxsb3cgYSBsaXR0bGUgc3RyZXRjaCBmb3IgdGhlIHNha2Ugb2YgbmljZSBwYWdlIGJyZWFrcwotICAlIERvIG5vdCB1c2UgXHR1cm5vZmZhY3RpdmUgaW4gdGhlc2UgYXJndW1lbnRzLiAgU2luY2UgdGhlIHRvYyBpcwotICAlIHR5cGVzZXQgaW4gY21yLCBzbyBjaGFyYWN0ZXJzIHN1Y2ggYXMgXyB3b3VsZCBjb21lIG91dCB3cm9uZzsgd2UKLSAgJSBoYXZlIHRvIGRvIHRoZSB1c3VhbCB0cmFuc2xhdGlvbiB0cmlja3MuCi0gIFxlbnRyeXsjMX17IzJ9JQotXGVuZGdyb3VwfQotCi0lIFNwYWNlIGJldHdlZW4gY2hhcHRlciAob3Igd2hhdGV2ZXIpIG51bWJlciBhbmQgdGhlIHRpdGxlLgotXGRlZlxsYWJlbHNwYWNle1xoc2tpcDFlbSBccmVsYXh9Ci0KLVxkZWZcZG9wYWdlbm8jMXt7XHJtICMxfX0KLVxkZWZcZG9zaG9ydHBhZ2VubyMxe3tccm0gIzF9fQotCi1cZGVmXGNoYXBlbnRyeWZvbnRze1xzZWNmb250cyBccm19Ci1cZGVmXHNlY2VudHJ5Zm9udHN7XHRleHRmb250c30KLVxsZXRcc3Vic2VjZW50cnlmb250cyA9IFx0ZXh0Zm9udHMKLVxsZXRcc3Vic3Vic2VjZW50cnlmb250cyA9IFx0ZXh0Zm9udHMKLQotCi1cbWVzc2FnZXtlbnZpcm9ubWVudHMsfQotCi0lIFNpbmNlIHRoZXNlIGNoYXJhY3RlcnMgYXJlIHVzZWQgaW4gZXhhbXBsZXMsIGl0IHNob3VsZCBiZSBhbiBldmVuIG51bWJlciBvZgotJSBcdHQgd2lkdGhzLiBFYWNoIFx0dCBjaGFyYWN0ZXIgaXMgMWVuLCBzbyB0d28gbWFrZXMgaXQgMWVtLgotJSBGdXJ0aGVybW9yZSwgdGhlc2UgZGVmaW5pdGlvbnMgbXVzdCBjb21lIGFmdGVyIHdlIGRlZmluZSBvdXIgZm9udHMuCi1cbmV3Ym94XGRibGFycm93Ym94ICAgIFxuZXdib3hcbG9uZ2RibGFycm93Ym94Ci1cbmV3Ym94XHB1c2hjaGFyYm94ICAgIFxuZXdib3hcYnVsbGJveAotXG5ld2JveFxlcXVpdmJveCAgICAgICBcbmV3Ym94XGVycm9yYm94Ci0KLSV7XHRlbnR0Ci0lXGdsb2JhbFxzZXRib3hcZGJsYXJyb3dib3ggPSBcaGJveCB0byAxZW17XGhmaWwkXFJpZ2h0YXJyb3ckXGhmaWx9Ci0lXGdsb2JhbFxzZXRib3hcbG9uZ2RibGFycm93Ym94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxtYXBzdG8kXGhmaWx9Ci0lXGdsb2JhbFxzZXRib3hccHVzaGNoYXJib3ggPSBcaGJveCB0byAxZW17XGhmaWwkXGRhc2h2JFxoZmlsfQotJVxnbG9iYWxcc2V0Ym94XGVxdWl2Ym94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxwdGV4ZXF1aXYkXGhmaWx9Ci0lIEFkYXB0ZWQgZnJvbSB0aGUgbWFubWFjIGZvcm1hdCAocC40MjAgb2YgVGVYYm9vaykKLSVcZ2xvYmFsXHNldGJveFxidWxsYm94ID0gXGhib3ggdG8gMWVte1xrZXJuLjE1ZW1cdnJ1bGUgaGVpZ2h0IC43NWV4IHdpZHRoIC44NWV4Ci0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCAuMWV4XGhmaWx9Ci0lfQotCi0lIEBwb2ludHt9LCBAcmVzdWx0e30sIEBleHBhbnNpb257fSwgQHByaW50e30sIEBlcXVpdnt9LgotXGRlZlxwb2ludHskXHN0YXIkfQotXGRlZlxyZXN1bHR7XGxlYXZldm1vZGVccmFpc2UuMTVleFxoYm94IHRvIDFlbXtcaGZpbCRcUmlnaHRhcnJvdyRcaGZpbH19Ci1cZGVmXGV4cGFuc2lvbntcbGVhdmV2bW9kZVxyYWlzZS4xZXhcaGJveCB0byAxZW17XGhmaWwkXG1hcHN0byRcaGZpbH19Ci1cZGVmXHByaW50e1xsZWF2ZXZtb2RlXGxvd2VyLjFleFxoYm94IHRvIDFlbXtcaGZpbCRcZGFzaHYkXGhmaWx9fQotXGRlZlxlcXVpdntcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXHB0ZXhlcXVpdiRcaGZpbH19Ci0KLSUgQWRhcHRlZCBmcm9tIHRoZSBUZVhib29rJ3MgXGJveGl0Lgote1x0ZW50dCBcZ2xvYmFsXGRpbWVuMCA9IDNlbX0lIFdpZHRoIG9mIHRoZSBib3guCi1cZGltZW4yID0gLjU1cHQgJSBUaGlja25lc3Mgb2YgcnVsZXMKLSUgVGhlIHRleHQuIChgcicgaXMgb3BlbiBvbiB0aGUgcmlnaHQsIGBlJyBzb21ld2hhdCBsZXNzIHNvIG9uIHRoZSBsZWZ0LikKLVxzZXRib3gwID0gXGhib3h7XGtlcm4tLjc1cHQgXHRlbnNmIGVycm9yXGtlcm4tMS41cHR9Ci0KLVxnbG9iYWxcc2V0Ym94XGVycm9yYm94PVxoYm94IHRvIFxkaW1lbjB7XGhmaWwKLSAgIFxoc2l6ZSA9IFxkaW1lbjAgXGFkdmFuY2VcaHNpemUgYnkgLTUuOHB0ICUgU3BhY2UgdG8gbGVmdCtyaWdodC4KLSAgIFxhZHZhbmNlXGhzaXplIGJ5IC0yXGRpbWVuMiAlIFJ1bGVzLgotICAgXHZib3h7Ci0gICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMgotICAgICAgXGhib3h7XHZydWxlIHdpZHRoXGRpbWVuMiBca2VybjNwdCAgICAgICAgICAlIFNwYWNlIHRvIGxlZnQgb2YgdGV4dC4KLSAgICAgICAgIFx2dG9we1xrZXJuMi40cHQgXGJveDAgXGtlcm4yLjRwdH0lIFNwYWNlIGFib3ZlL2JlbG93LgotICAgICAgICAgXGtlcm4zcHRcdnJ1bGUgd2lkdGhcZGltZW4yfSUgU3BhY2UgdG8gcmlnaHQuCi0gICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMn0KLSAgICBcaGZpbH0KLQotJSBUaGUgQGVycm9ye30gY29tbWFuZC4KLVxkZWZcZXJyb3J7XGxlYXZldm1vZGVcbG93ZXIuN2V4XGNvcHlcZXJyb3Jib3h9Ci0KLSUgQHRleCAuLi4gQGVuZCB0ZXggICAgZXNjYXBlcyBpbnRvIHJhdyBUZXggdGVtcG9yYXJpbHkuCi0lIE9uZSBleGNlcHRpb246IEAgaXMgc3RpbGwgYW4gZXNjYXBlIGNoYXJhY3Rlciwgc28gdGhhdCBAZW5kIHRleCB3b3Jrcy4KLSUgQnV0IFxAIG9yIEBAIHdpbGwgZ2V0IGEgcGxhaW4gdGV4IEAgY2hhcmFjdGVyLgotCi1cZGVmXHRleHtcYmVnaW5ncm91cAotICBcY2F0Y29kZSBgXFw9MCBcY2F0Y29kZSBgXHs9MSBcY2F0Y29kZSBgXH09MgotICBcY2F0Y29kZSBgXCQ9MyBcY2F0Y29kZSBgXCY9NCBcY2F0Y29kZSBgXCM9NgotICBcY2F0Y29kZSBgXF49NyBcY2F0Y29kZSBgXF89OCBcY2F0Y29kZSBgXH49MTMgXGxldH49XHRpZQotICBcY2F0Y29kZSBgXCU9MTQKLSAgXGNhdGNvZGUgNDM9MTIgJSBwbHVzCi0gIFxjYXRjb2RlYFwiPTEyCi0gIFxjYXRjb2RlYFw9PTEyCi0gIFxjYXRjb2RlYFx8PTEyCi0gIFxjYXRjb2RlYFw8PTEyCi0gIFxjYXRjb2RlYFw+PTEyCi0gIFxlc2NhcGVjaGFyPWBcXAotICAlCi0gIFxsZXRcYj1ccHRleGIKLSAgXGxldFxidWxsZXQ9XHB0ZXhidWxsZXQKLSAgXGxldFxjPVxwdGV4YwotICBcbGV0XCw9XHB0ZXhjb21tYQotICBcbGV0XC49XHB0ZXhkb3QKLSAgXGxldFxkb3RzPVxwdGV4ZG90cwotICBcbGV0XGVxdWl2PVxwdGV4ZXF1aXYKLSAgXGxldFwhPVxwdGV4ZXhjbGFtCi0gIFxsZXRcaT1ccHRleGkKLSAgXGxldFx7PVxwdGV4bGJyYWNlCi0gIFxsZXRcKz1cdGFiYWxpZ24KLSAgXGxldFx9PVxwdGV4cmJyYWNlCi0gIFxsZXRcKj1ccHRleHN0YXIKLSAgXGxldFx0PVxwdGV4dAotICAlCi0gIFxkZWZcZW5kbGRvdHN7XG1hdGhpbm5lcntcbGRvdHNcbGRvdHNcbGRvdHNcbGRvdHN9fSUKLSAgXGRlZlxlbmRkb3Rze1xyZWxheFxpZm1tb2RlXGVuZGxkb3RzXGVsc2UkXG1hdGhzdXJyb3VuZD0wcHQgXGVuZGxkb3RzXCwkXGZpfSUKLSAgXGRlZlxAe0B9JQotXGxldFxFdGV4PVxlbmRncm91cH0KLQotJSBEZWZpbmUgQGxpc3AgLi4uIEBlbmRsaXNwLgotJSBAbGlzcCBkb2VzIGEgXGJlZ2luZ3JvdXAgc28gaXQgY2FuIHJlYmluZCB0aGluZ3MsCi0lIGluY2x1ZGluZyB0aGUgZGVmaW5pdGlvbiBvZiBAZW5kbGlzcCAod2hpY2ggbm9ybWFsbHkgaXMgZXJyb25lb3VzKS4KLQotJSBBbW91bnQgdG8gbmFycm93IHRoZSBtYXJnaW5zIGJ5IGZvciBAbGlzcC4KLVxuZXdza2lwXGxpc3BuYXJyb3dpbmcgXGxpc3BuYXJyb3dpbmc9MC40aW4KLQotJSBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIHRoYXQgXl5NIGdldHMgaW5zaWRlIEBsaXNwLCBAZXhhbXBsZSwgYW5kIG90aGVyCi0lIHN1Y2ggZW52aXJvbm1lbnRzLiAgXG51bGwgaXMgYmV0dGVyIHRoYW4gYSBzcGFjZSwgc2luY2UgaXQgZG9lc24ndAotJSBoYXZlIGFueSB3aWR0aC4KLVxkZWZcbGlzcHBhcntcbnVsbFxlbmRncmFmfQotCi0lIE1ha2UgZWFjaCBzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0IHByb2R1Y2UgYSBub3JtYWwgaW50ZXJ3b3JkCi0lIHNwYWNlIGluIHRoZSBvdXRwdXQuICBEb24ndCBhbGxvdyBhIGxpbmUgYnJlYWsgYXQgdGhpcyBzcGFjZSwgYXMgdGhpcwotJSBpcyB1c2VkIG9ubHkgaW4gZW52aXJvbm1lbnRzIGxpa2UgQGV4YW1wbGUsIHdoZXJlIGVhY2ggbGluZSBvZiBpbnB1dAotJSBzaG91bGQgcHJvZHVjZSBhIGxpbmUgb2Ygb3V0cHV0IGFueXdheS4KLSUKLXtcb2JleXNwYWNlcyAlCi1cZ2RlZlxzZXBzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cdGllfX0KLQotJSBEZWZpbmUgXG9iZXllZHNwYWNlIHRvIGJlIG91ciBhY3RpdmUgc3BhY2UsIHdoYXRldmVyIGl0IGlzLiAgVGhpcyBpcwotJSBmb3IgdXNlIGluIFxwYXJzZWFyZy4KLXtcc2Vwc3BhY2VzJQotXGdsb2JhbFxsZXRcb2JleWVkc3BhY2U9IH0KLQotJSBUaGlzIHNwYWNlIGlzIGFsd2F5cyBwcmVzZW50IGFib3ZlIGFuZCBiZWxvdyBlbnZpcm9ubWVudHMuCi1cbmV3c2tpcFxlbnZza2lwYW1vdW50IFxlbnZza2lwYW1vdW50ID0gMHB0Ci0KLSUgTWFrZSBzcGFjaW5nIGFuZCBiZWxvdyBlbnZpcm9ubWVudCBzeW1tZXRyaWNhbC4gIFdlIHVzZSBccGFyc2tpcCBoZXJlCi0lIHRvIGhlbHAgaW4gZG9pbmcgdGhhdCwgc2luY2UgaW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudHMgXHBhcnNraXAKLSUgaXMgcmVzZXQgdG8gemVybzsgdGh1cyB0aGUgXGFmdGVyZW52YnJlYWsgaW5zZXJ0cyBubyBzcGFjZSAtLSBidXQgdGhlCi0lIHN0YXJ0IG9mIHRoZSBuZXh0IHBhcmFncmFwaCB3aWxsIGluc2VydCBccGFyc2tpcAotJQotXGRlZlxhYm92ZWVudmJyZWFre3tcYWR2YW5jZVxlbnZza2lwYW1vdW50IGJ5IFxwYXJza2lwCi1cZW5kZ3JhZiBcaWZkaW1cbGFzdHNraXA8XGVudnNraXBhbW91bnQKLVxyZW1vdmVsYXN0c2tpcCBccGVuYWx0eS01MCBcdnNraXBcZW52c2tpcGFtb3VudCBcZml9fQotCi1cbGV0XGFmdGVyZW52YnJlYWsgPSBcYWJvdmVlbnZicmVhawotCi0lIFxub25hcnJvd2luZyBpcyBhIGZsYWcuICBJZiAic2V0IiwgQGxpc3AgZXRjIGRvbid0IG5hcnJvdyBtYXJnaW5zLgotXGxldFxub25hcnJvd2luZz1ccmVsYXgKLQotJSBAY2FydG91Y2hlIC4uLiBAZW5kIGNhcnRvdWNoZTogZHJhdyByZWN0YW5nbGUgdy9yb3VuZGVkIGNvcm5lcnMgYXJvdW5kCi0lIGVudmlyb25tZW50IGNvbnRlbnRzLgotXGZvbnRcY2lyY2xlPWxjaXJjbGUxMAotXG5ld2RpbWVuXGNpcmN0aGljawotXG5ld2RpbWVuXGNhcnRvdXRlclxuZXdkaW1lblxjYXJ0aW5uZXIKLVxuZXdza2lwXG5vcm1ic2tpcFxuZXdza2lwXG5vcm1wc2tpcFxuZXdza2lwXG5vcm1sc2tpcAotXGNpcmN0aGljaz1cZm9udGRpbWVuOFxjaXJjbGUKLSUKLVxkZWZcY3Rse3tcY2lyY2xlXGNoYXInMDEzXGhza2lwIC02cHR9fSUgNnB0IGZyb20gcGwgZmlsZTogMS8yY2hhcndpZHRoCi1cZGVmXGN0cnt7XGhza2lwIDZwdFxjaXJjbGVcY2hhcicwMTB9fQotXGRlZlxjYmx7e1xjaXJjbGVcY2hhcicwMTJcaHNraXAgLTZwdH19Ci1cZGVmXGNicnt7XGhza2lwIDZwdFxjaXJjbGVcY2hhcicwMTF9fQotXGRlZlxjYXJ0dG9we1xoYm94IHRvIFxjYXJ0b3V0ZXJ7XGhza2lwXGxza2lwCi0gICAgICAgIFxjdGxcbGVhZGVyc1xocnVsZSBoZWlnaHRcY2lyY3RoaWNrXGhmaWxcY3RyCi0gICAgICAgIFxoc2tpcFxyc2tpcH19Ci1cZGVmXGNhcnRib3R7XGhib3ggdG8gXGNhcnRvdXRlcntcaHNraXBcbHNraXAKLSAgICAgICAgXGNibFxsZWFkZXJzXGhydWxlIGhlaWdodFxjaXJjdGhpY2tcaGZpbFxjYnIKLSAgICAgICAgXGhza2lwXHJza2lwfX0KLSUKLVxuZXdza2lwXGxza2lwXG5ld3NraXBccnNraXAKLQotXGxvbmdcZGVmXGNhcnRvdWNoZXslCi1cYmVnaW5ncm91cAotICAgICAgICBcbHNraXA9XGxlZnRza2lwIFxyc2tpcD1ccmlnaHRza2lwCi0gICAgICAgIFxsZWZ0c2tpcD0wcHRccmlnaHRza2lwPTBwdCAld2Ugd2FudCB0aGVzZSAqb3V0c2lkZSouCi0gICAgICAgIFxjYXJ0aW5uZXI9XGhzaXplIFxhZHZhbmNlXGNhcnRpbm5lciBieS1cbHNraXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgXGFkdmFuY2VcY2FydGlubmVyIGJ5LVxyc2tpcAotICAgICAgICBcY2FydG91dGVyPVxoc2l6ZQotICAgICAgICBcYWR2YW5jZVxjYXJ0b3V0ZXIgYnkgMTguNHB0ICUgYWxsb3cgZm9yIDNwdCBrZXJucyBvbiBlaXRoZXIKLSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlLCBhbmQgZm9yIDZwdCB3YXN0ZSBmcm9tCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBjb3JuZXIgY2hhciwgYW5kIHJ1bGUgdGhpY2tuZXNzCi0gICAgICAgIFxub3JtYnNraXA9XGJhc2VsaW5lc2tpcCBcbm9ybXBza2lwPVxwYXJza2lwIFxub3JtbHNraXA9XGxpbmVza2lwCi0gICAgICAgICUgRmxhZyB0byB0ZWxsIEBsaXNwLCBldGMuLCBub3QgdG8gbmFycm93IG1hcmdpbi4KLSAgICAgICAgXGxldFxub25hcnJvd2luZz1cY29tbWVudAotICAgICAgICBcdmJveFxiZ3JvdXAKLSAgICAgICAgICAgICAgICBcYmFzZWxpbmVza2lwPTBwdFxwYXJza2lwPTBwdFxsaW5lc2tpcD0wcHQKLSAgICAgICAgICAgICAgICBcY2FydHRvcAotICAgICAgICAgICAgICAgIFxoYm94XGJncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgXGhza2lwXGxza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICBcdnJ1bGVca2VybjNwdAotICAgICAgICAgICAgICAgICAgICAgICAgXHZib3hcYmdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxoc2l6ZT1cY2FydGlubmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxrZXJuM3B0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxiZWdpbmdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGJhc2VsaW5lc2tpcD1cbm9ybWJza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGxpbmVza2lwPVxub3JtbHNraXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBccGFyc2tpcD1cbm9ybXBza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHZza2lwIC1ccGFyc2tpcAotXGRlZlxFY2FydG91Y2hleyUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVuZGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxrZXJuM3B0Ci0gICAgICAgICAgICAgICAgICAgICAgICBcZWdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICBca2VybjNwdFx2cnVsZQotICAgICAgICAgICAgICAgICAgICAgICAgXGhza2lwXHJza2lwCi0gICAgICAgICAgICAgICAgXGVncm91cAotICAgICAgICAgICAgICAgIFxjYXJ0Ym90Ci0gICAgICAgIFxlZ3JvdXAKLVxlbmRncm91cAotfX0KLQotCi0lIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIHRoZSBAZXhhbXBsZSB2YXJpYW50cywKLSUgaW5zaWRlIGEgZ3JvdXAuCi1cZGVmXG5vbmZpbGxzdGFydHslCi0gIFxhYm92ZWVudmJyZWFrCi0gIFxpbkVOViAlIFRoaXMgZ3JvdXAgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBib2R5Ci0gIFxoZnV6eiA9IDEycHQgJSBEb24ndCBiZSBmdXNzeQotICBcc2Vwc3BhY2VzICUgTWFrZSBzcGFjZXMgYmUgd29yZC1zZXBhcmF0b3JzIHJhdGhlciB0aGFuIHNwYWNlIHRva2Vucy4KLSAgXHNpbmdsZXNwYWNlCi0gIFxsZXRccGFyID0gXGxpc3BwYXIgJSBkb24ndCBpZ25vcmUgYmxhbmsgbGluZXMKLSAgXG9iZXlsaW5lcyAlIGVhY2ggbGluZSBvZiBpbnB1dCBpcyBhIGxpbmUgb2Ygb3V0cHV0Ci0gIFxwYXJza2lwID0gMHB0Ci0gIFxwYXJpbmRlbnQgPSAwcHQKLSAgXGVtZXJnZW5jeXN0cmV0Y2ggPSAwcHQgJSBkb24ndCB0cnkgdG8gYXZvaWQgb3ZlcmZ1bGwgYm94ZXMKLSAgJSBAY2FydG91Y2hlIGRlZmluZXMgXG5vbmFycm93aW5nIHRvIGluaGliaXQgbmFycm93aW5nCi0gICUgYXQgbmV4dCBsZXZlbCBkb3duLgotICBcaWZ4XG5vbmFycm93aW5nXHJlbGF4Ci0gICAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nCi0gICAgXGV4ZGVudGFtb3VudD1cbGlzcG5hcnJvd2luZwotICAgIFxsZXRcZXhkZW50PVxub2ZpbGxleGRlbnQKLSAgICBcbGV0XG5vbmFycm93aW5nPVxyZWxheAotICBcZmkKLX0KLQotJSBEZWZpbmUgdGhlIFxFLi4uIGNvbnRyb2wgc2VxdWVuY2Ugb25seSBpZiB3ZSBhcmUgaW5zaWRlIHRoZSBwYXJ0aWN1bGFyCi0lIGVudmlyb25tZW50LCBzbyB0aGUgZXJyb3IgY2hlY2tpbmcgaW4gXGVuZCB3aWxsIHdvcmsuCi0lIAotJSBUbyBlbmQgYW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudCwgd2UgZmlyc3QgZW5kIHRoZSBwYXJhZ3JhcGggKHZpYQotJSBcYWZ0ZXJlbnZicmVhaydzIHZlcnRpY2FsIGdsdWUpLCBhbmQgdGhlbiB0aGUgZ3JvdXAuICBUaGF0IHdheSB3ZSBrZWVwCi0lIHRoZSB6ZXJvIFxwYXJza2lwIHRoYXQgdGhlIGVudmlyb25tZW50cyBzZXQgLS0gXHBhcnNraXAgZ2x1ZSB3aWxsIGJlCi0lIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcGFyYWdyYXBoIGluIHRoZSBkb2N1bWVudCwgYWZ0ZXIKLSUgdGhlIGVudmlyb25tZW50LgotJQotXGRlZlxub25maWxsZmluaXNoe1xhZnRlcmVudmJyZWFrXGVuZGdyb3VwfQotCi0lIEBsaXNwOiBpbmRlbnRlZCwgbmFycm93ZWQsIHR5cGV3cml0ZXIgZm9udC4KLVxkZWZcbGlzcHtcYmVnaW5ncm91cAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWxpc3AgPSBcbm9uZmlsbGZpbmlzaAotICBcdHQKLSAgXGxldFxrYmRmb250ID0gXGtiZGV4YW1wbGVmb250ICUgQWxsb3cgQGtiZCB0byBkbyBzb21ldGhpbmcgc3BlY2lhbC4KLSAgXGdvYmJsZSAgICAgICAlIGVhdCByZXR1cm4KLX0KLQotJSBAZXhhbXBsZTogU2FtZSBhcyBAbGlzcC4KLVxkZWZcZXhhbXBsZXtcYmVnaW5ncm91cCBcZGVmXEVleGFtcGxle1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxsaXNwfQotCi0lIEBzbWFsbC4uLiBpcyB1c3VhbGx5IGVxdWl2YWxlbnQgdG8gdGhlIG5vbi1zbWFsbCAoQHNtYWxsYm9vawotJSByZWRlZmluZXMpLiAgV2UgbXVzdCBjYWxsIFxleGFtcGxlIChvciB3aGF0ZXZlcikgbGFzdCBpbiB0aGUKLSUgZGVmaW5pdGlvbiwgc2luY2UgaXQgcmVhZHMgdGhlIHJldHVybiBmb2xsb3dpbmcgdGhlIEBleGFtcGxlIChvcgotJSB3aGF0ZXZlcikgY29tbWFuZC4KLSUgCi0lIFRoaXMgYWN0dWFsbHkgYWxsb3dzIChmb3IgZXhhbXBsZSkgQGVuZCBkaXNwbGF5IGluc2lkZSBhbgotJSBAc21hbGxkaXNwbGF5LiAgVG9vIGJhZCwgYnV0IG1ha2VpbmZvIHdpbGwgY2F0Y2ggdGhlIGVycm9yIGFueXdheS4KLSUKLVxkZWZcc21hbGxkaXNwbGF5e1xiZWdpbmdyb3VwXGRlZlxFc21hbGxkaXNwbGF5e1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxkaXNwbGF5fQotXGRlZlxzbWFsbGV4YW1wbGV7XGJlZ2luZ3JvdXBcZGVmXEVzbWFsbGV4YW1wbGV7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGxpc3B9Ci1cZGVmXHNtYWxsZm9ybWF0e1xiZWdpbmdyb3VwXGRlZlxFc21hbGxmb3JtYXR7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGZvcm1hdH0KLVxkZWZcc21hbGxsaXNwe1xiZWdpbmdyb3VwXGRlZlxFc21hbGxsaXNwe1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxsaXNwfQotCi0lIFJlYWwgQHNtYWxsZXhhbXBsZSBhbmQgQHNtYWxsbGlzcCAod2hlbiBAc21hbGxib29rKTogdXNlIHNtYWxsZXIgZm9udHMuCi0lIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgUGF2ZWxAeGVyb3guCi1cZGVmXHNtYWxsbGlzcHh7XGJlZ2luZ3JvdXAKLSAgXGRlZlxFc21hbGxsaXNwe1xub25maWxsZmluaXNoXGVuZGdyb3VwfSUKLSAgXGRlZlxFc21hbGxleGFtcGxle1xub25maWxsZmluaXNoXGVuZGdyb3VwfSUKLSAgXGluZGV4Zm9udHMKLSAgXGxpc3AKLX0KLQotJSBAZGlzcGxheTogc2FtZSBhcyBAbGlzcCBleGNlcHQga2VlcCBjdXJyZW50IGZvbnQuCi0lCi1cZGVmXGRpc3BsYXl7XGJlZ2luZ3JvdXAKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVkaXNwbGF5ID0gXG5vbmZpbGxmaW5pc2gKLSAgXGdvYmJsZQotfQotCi0lIEBzbWFsbGRpc3BsYXkgKHdoZW4gQHNtYWxsYm9vayk6IEBkaXNwbGF5IHBsdXMgc21hbGxlciBmb250cy4KLSUKLVxkZWZcc21hbGxkaXNwbGF5eHtcYmVnaW5ncm91cAotICBcZGVmXEVzbWFsbGRpc3BsYXl7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9JQotICBcaW5kZXhmb250cyBccm0KLSAgXGRpc3BsYXkKLX0KLQotJSBAZm9ybWF0OiBzYW1lIGFzIEBkaXNwbGF5IGV4Y2VwdCBkb24ndCBuYXJyb3cgbWFyZ2lucy4KLSUKLVxkZWZcZm9ybWF0e1xiZWdpbmdyb3VwCi0gIFxsZXRcbm9uYXJyb3dpbmcgPSB0Ci0gIFxub25maWxsc3RhcnQKLSAgXGxldFxFZm9ybWF0ID0gXG5vbmZpbGxmaW5pc2gKLSAgXGdvYmJsZQotfQotCi0lIEBzbWFsbGZvcm1hdCAod2hlbiBAc21hbGxib29rKTogQGZvcm1hdCBwbHVzIHNtYWxsZXIgZm9udHMuCi0lCi1cZGVmXHNtYWxsZm9ybWF0eHtcYmVnaW5ncm91cAotICBcZGVmXEVzbWFsbGZvcm1hdHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH0lCi0gIFxpbmRleGZvbnRzIFxybQotICBcZm9ybWF0Ci19Ci0KLSUgQGZsdXNobGVmdCAoc2FtZSBhcyBAZm9ybWF0KS4KLSUKLVxkZWZcZmx1c2hsZWZ0e1xiZWdpbmdyb3VwIFxkZWZcRWZsdXNobGVmdHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cZm9ybWF0fQotCi0lIEBmbHVzaHJpZ2h0LgotJSAKLVxkZWZcZmx1c2hyaWdodHtcYmVnaW5ncm91cAotICBcbGV0XG5vbmFycm93aW5nID0gdAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWZsdXNocmlnaHQgPSBcbm9uZmlsbGZpbmlzaAotICBcYWR2YW5jZVxsZWZ0c2tpcCBieSAwcHQgcGx1cyAxZmlsbAotICBcZ29iYmxlCi19Ci0KLSUgQHF1b3RhdGlvbiBkb2VzIG5vcm1hbCBsaW5lYnJlYWtpbmcgKGhlbmNlIHdlIGNhbid0IHVzZSBcbm9uZmlsbHN0YXJ0KQotJSBhbmQgbmFycm93cyB0aGUgbWFyZ2lucy4KLSUKLVxkZWZccXVvdGF0aW9ueyUKLSAgXGJlZ2luZ3JvdXBcaW5FTlYgJVRoaXMgZ3JvdXAgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBAcXVvdGF0aW9uIGJvZHkKLSAge1xwYXJza2lwPTBwdCBcYWJvdmVlbnZicmVha30lIGJlY2F1c2UgXGFib3ZlZW52YnJlYWsgaW5zZXJ0cyBccGFyc2tpcAotICBcc2luZ2xlc3BhY2UKLSAgXHBhcmluZGVudD0wcHQKLSAgJSBXZSBoYXZlIHJldGFpbmVkIGEgbm9uemVybyBwYXJza2lwIGZvciB0aGUgZW52aXJvbm1lbnQsIHNpbmNlIHdlJ3JlCi0gICUgZG9pbmcgbm9ybWFsIGZpbGxpbmcuIFNvIHRvIGF2b2lkIGV4dHJhIHNwYWNlIGJlbG93IHRoZSBlbnZpcm9ubWVudC4uLgotICBcZGVmXEVxdW90YXRpb257XHBhcnNraXAgPSAwcHQgXG5vbmZpbGxmaW5pc2h9JQotICAlCi0gICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZyBhdCBuZXh0IGxldmVsIGRvd24uCi0gIFxpZnhcbm9uYXJyb3dpbmdccmVsYXgKLSAgICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZwotICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSBcbGlzcG5hcnJvd2luZwotICAgIFxleGRlbnRhbW91bnQgPSBcbGlzcG5hcnJvd2luZwotICAgIFxsZXRcbm9uYXJyb3dpbmcgPSBccmVsYXgKLSAgXGZpCi19Ci0KLQotXG1lc3NhZ2V7ZGVmdW5zLH0KLSUgRGVmaW5lIGZvcm1hdHRlciBmb3IgZGVmdW5zCi0lIEZpcnN0LCBhbGxvdyB1c2VyIHRvIGNoYW5nZSBkZWZpbml0aW9uIG9iamVjdCBmb250IChcZGYpIGludGVybmFsbHkKLVxkZWZcc2V0ZGVmZm9udCAjMSB7XGNzbmFtZSBERUYjMVxlbmRjc25hbWV9Ci0KLVxuZXdza2lwXGRlZmJvZHlpbmRlbnQgXGRlZmJvZHlpbmRlbnQ9LjRpbgotXG5ld3NraXBcZGVmYXJnc2luZGVudCBcZGVmYXJnc2luZGVudD01MHB0Ci1cbmV3c2tpcFxkZWZ0eXBlbWFyZ2luIFxkZWZ0eXBlbWFyZ2luPTEycHQKLVxuZXdza2lwXGRlZmxhc3RhcmdtYXJnaW4gXGRlZmxhc3RhcmdtYXJnaW49MThwdAotCi1cbmV3Y291bnRccGFyZW5jb3VudAotJSBkZWZpbmUgXGZ1bmN0aW9ucGFyZW5zLCB3aGljaCBtYWtlcyAoIGFuZCApIGFuZCAmIGRvIHNwZWNpYWwgdGhpbmdzLgotJSBcZnVuY3Rpb25wYXJlbnMgYWZmZWN0cyB0aGUgZ3JvdXAgaXQgaXMgY29udGFpbmVkIGluLgotXGRlZlxhY3RpdmVwYXJlbnN7JQotXGNhdGNvZGVgXCg9XGFjdGl2ZSBcY2F0Y29kZWBcKT1cYWN0aXZlIFxjYXRjb2RlYFwmPVxhY3RpdmUKLVxjYXRjb2RlYFxbPVxhY3RpdmUgXGNhdGNvZGVgXF09XGFjdGl2ZX0KLQotJSBNYWtlIGNvbnRyb2wgc2VxdWVuY2VzIHdoaWNoIGFjdCBsaWtlIG5vcm1hbCBwYXJlbnRoZXNpcyBjaGFycy4KLVxsZXRcbHBhcmVuID0gKCBcbGV0XHJwYXJlbiA9ICkKLQote1xhY3RpdmVwYXJlbnMgJSBOb3csIHNtYXJ0IHBhcmVucyBkb24ndCB0dXJuIG9uIHVudGlsICZmb28gKHNlZSBcYW1wcm0pCi0KLSUgQmUgc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGEgZGVmaW5pdGlvbiBmb3IgYCgnLCBldGMuICBGb3IgZXhhbXBsZSwKLSUgaWYgdGhlIGZuIG5hbWUgaGFzIHBhcmVucyBpbiBpdCwgXGJvbGRicmF4IHdpbGwgbm90IGJlIGluIGVmZmVjdCB5ZXQsCi0lIHNvIFRlWCB3b3VsZCBvdGhlcndpc2UgY29tcGxhaW4gYWJvdXQgdW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2UuCi1cZ2xvYmFsXGxldCg9XGxwYXJlbiBcZ2xvYmFsXGxldCk9XHJwYXJlbgotXGdsb2JhbFxsZXRbPVxsYnJhY2sgXGdsb2JhbFxsZXRdPVxyYnJhY2sKLQotXGdkZWZcZnVuY3Rpb25wYXJlbnN7XGJvbGRicmF4XGxldCY9XGFtcHJtXHBhcmVuY291bnQ9MCB9Ci1cZ2RlZlxib2xkYnJheHtcbGV0KD1cb3BuclxsZXQpPVxjbG5yXGxldFs9XGxicmJcbGV0XT1ccmJyYn0KLSUgVGhpcyBpcyB1c2VkIHRvIHR1cm4gb24gc3BlY2lhbCBwYXJlbnMKLSUgYnV0IG1ha2UgJiBhY3Qgb3JkaW5hcnkgKGdpdmVuIHRoYXQgaXQncyBhY3RpdmUpLgotXGdkZWZcYm9sZGJyYXhub2FtcHtcbGV0KD1cb3BuclxsZXQpPVxjbG5yXGxldFs9XGxicmJcbGV0XT1ccmJyYlxsZXQmPVxhbXBucn0KLQotJSBEZWZpbml0aW9ucyBvZiAoLCApIGFuZCAmIHVzZWQgaW4gYXJncyBmb3IgZnVuY3Rpb25zLgotJSBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIG9mICggb3V0c2lkZSBvZiBhbGwgcGFyZW50aGVzZXMuCi1cZ2RlZlxvcHJtIzEge3tccm1cY2hhcmBcKH0jMSBcYmYgXGxldCg9XG9wbmVzdGVkCi0gIFxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IDEKLX0KLSUKLSUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBvZiAoIHdoZW4gYWxyZWFkeSBpbnNpZGUgYSBsZXZlbCBvZiBwYXJlbnMuCi1cZ2RlZlxvcG5lc3RlZHtcY2hhcmBcKFxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IDEgfQotJQotXGdkZWZcY2xybXslIFByaW50IGEgcGFyZW4gaW4gcm9tYW4gaWYgaXQgaXMgdGFraW5nIHVzIGJhY2sgdG8gZGVwdGggb2YgMC4KLSAgJSBhbHNvIGluIHRoYXQgY2FzZSByZXN0b3JlIHRoZSBvdXRlci1sZXZlbCBkZWZpbml0aW9uIG9mICguCi0gIFxpZm51bSBccGFyZW5jb3VudD0xIHtccm0gXGNoYXIgYFwpfVxzbCBcbGV0KD1cb3BybSBcZWxzZSBcY2hhciBgXCkgXGZpCi0gIFxnbG9iYWxcYWR2YW5jZSBccGFyZW5jb3VudCBieSAtMSB9Ci0lIElmIHdlIGVuY291bnRlciAmZm9vLCB0aGVuIHR1cm4gb24gKCktaGFja2luZyBhZnRlcndhcmRzCi1cZ2RlZlxhbXBybSMxIHt7XHJtXCYjMX1cbGV0KD1cb3BybSBcbGV0KT1cY2xybVwgfQotJQotXGdkZWZcbm9ybWFscGFyZW5ze1xib2xkYnJheFxsZXQmPVxhbXBucn0KLX0gJSBFbmQgb2YgZGVmaW5pdGlvbiBpbnNpZGUgXGFjdGl2ZXBhcmVucwotJSUgVGhlc2UgcGFyZW5zIChpbiBcYm9sZGJyYXgpIGFjdHVhbGx5IGFyZSBhIGxpdHRsZSBib2xkZXIgdGhhbiB0aGUKLSUlIGNvbnRhaW5lZCB0ZXh0LiAgVGhpcyBpcyBlc3BlY2lhbGx5IG5lZWRlZCBmb3IgWyBhbmQgXQotXGRlZlxvcG5ye3tcc2ZcY2hhcmBcKH1cZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxIH0KLVxkZWZcY2xucnt7XHNmXGNoYXJgXCl9XGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgLTEgfQotXGRlZlxhbXBucntcJn0KLVxkZWZcbGJyYnt7XGJmXGNoYXJgXFt9fQotXGRlZlxyYnJie3tcYmZcY2hhcmBcXX19Ci0KLSUgRmlyc3QsIGRlZm5hbWUsIHdoaWNoIGZvcm1hdHMgdGhlIGhlYWRlciBsaW5lIGl0c2VsZi4KLSUgIzEgc2hvdWxkIGJlIHRoZSBmdW5jdGlvbiBuYW1lLgotJSAjMiBzaG91bGQgYmUgdGhlIHR5cGUgb2YgZGVmaW5pdGlvbiwgc3VjaCBhcyAiRnVuY3Rpb24iLgotCi1cZGVmXGRlZm5hbWUgIzEjMnslCi0lIEdldCB0aGUgdmFsdWVzIG9mIFxsZWZ0c2tpcCBhbmQgXHJpZ2h0c2tpcCBhcyB0aGV5IHdlcmUKLSUgb3V0c2lkZSB0aGUgQGRlZi4uLgotXGRpbWVuMj1cbGVmdHNraXAKLVxhZHZhbmNlXGRpbWVuMiBieSAtXGRlZmJvZHlpbmRlbnQKLVxub2luZGVudAotXHNldGJveDA9XGhib3h7XGhza2lwIFxkZWZsYXN0YXJnbWFyZ2lue1xybSAjMn1caHNraXAgXGRlZnR5cGVtYXJnaW59JQotXGRpbWVuMD1caHNpemUgXGFkdmFuY2UgXGRpbWVuMCBieSAtXHdkMCAlIGNvbXB1dGUgc2l6ZSBmb3IgZmlyc3QgbGluZQotXGRpbWVuMT1caHNpemUgXGFkdmFuY2UgXGRpbWVuMSBieSAtXGRlZmFyZ3NpbmRlbnQgJXNpemUgZm9yIGNvbnRpbnVhdGlvbnMKLVxwYXJzaGFwZSAyIDBpbiBcZGltZW4wIFxkZWZhcmdzaW5kZW50IFxkaW1lbjEKLSUgTm93IG91dHB1dCBhcmcgMiAoIkZ1bmN0aW9uIiBvciBzb21lIHN1Y2gpCi0lIGVuZGluZyBhdCBcZGVmdHlwZW1hcmdpbiBmcm9tIHRoZSByaWdodCBtYXJnaW4sCi0lIGJ1dCBzdHVjayBpbnNpZGUgYSBib3ggb2Ygd2lkdGggMCBzbyBpdCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBsaW5lYnJlYWtpbmcKLXslIEFkanVzdCBcaHNpemUgdG8gZXhjbHVkZSB0aGUgYW1iaWVudCBtYXJnaW5zLAotJSBzbyB0aGF0IFxyaWdodGxpbmUgd2lsbCBvYmV5IHRoZW0uCi1cYWR2YW5jZSBcaHNpemUgYnkgLVxkaW1lbjIKLVxybGFwe1xyaWdodGxpbmV7e1xybSAjMn1caHNraXAgLTEuMjVwYyB9fX0lCi0lIE1ha2UgYWxsIGxpbmVzIHVuZGVyZnVsbCBhbmQgbm8gY29tcGxhaW50czoKLVx0b2xlcmFuY2U9MTAwMDAgXGhiYWRuZXNzPTEwMDAwCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSAtXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLXtcZGYgIzF9XGVuc2tpcCAgICAgICAgJSBHZW5lcmF0ZSBmdW5jdGlvbiBuYW1lCi19Ci0KLSUgQWN0dWFsbHkgcHJvY2VzcyB0aGUgYm9keSBvZiBhIGRlZmluaXRpb24KLSUgIzEgc2hvdWxkIGJlIHRoZSB0ZXJtaW5hdGluZyBjb250cm9sIHNlcXVlbmNlLCBzdWNoIGFzIFxFZGVmdW4uCi0lICMyIHNob3VsZCBiZSB0aGUgImFub3RoZXIgbmFtZSIgY29udHJvbCBzZXF1ZW5jZSwgc3VjaCBhcyBcZGVmdW54LgotJSAjMyBzaG91bGQgYmUgdGhlIGNvbnRyb2wgc2VxdWVuY2UgdGhhdCBhY3R1YWxseSBwcm9jZXNzZXMgdGhlIGhlYWRlciwKLSUgICAgc3VjaCBhcyBcZGVmdW5oZWFkZXIuCi0KLVxkZWZcZGVmcGFyc2Vib2R5ICMxIzIjM3tcYmVnaW5ncm91cFxpbkVOViUgRW52aXJvbm1lbnQgZm9yIGRlZmluaXRpb25ib2R5Ci1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMntcYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXQjM30lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwICUKLVxjYXRjb2RlIDYxPVxhY3RpdmUgJSA2MSBpcyBgPScKLVxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXQjM30KLQotJSAjMSBpcyB0aGUgXEUuLi4gY29udHJvbCBzZXF1ZW5jZSB0byBlbmQgdGhlIGRlZmluaXRpb24gKHdoaWNoIHdlIGRlZmluZSkuCi0lICMyIGlzIHRoZSBcLi4ueCBjb250cm9sIHNlcXVlbmNlIGZvciBjb25zZWN1dGl2ZSBmbnMgKHdoaWNoIHdlIGRlZmluZSkuCi0lICMzIGlzIHRoZSBjb250cm9sIHNlcXVlbmNlIHRvIGNhbGwgdG8gcmVzdW1lIHByb2Nlc3NpbmcuCi0lICM0LCBkZWxpbWl0ZWQgYnkgdGhlIHNwYWNlLCBpcyB0aGUgY2xhc3MgbmFtZS4KLSUgCi1cZGVmXGRlZm1ldGhwYXJzZWJvZHkjMSMyIzMjNCB7XGJlZ2luZ3JvdXBcaW5FTlYgJQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzIjIzEge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjIzF9fX0lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjNH19fQotCi0lIEBkZWZ0eXBlbWV0aG9kIGhhcyBhbiBleHRyYSBhcmd1bWVudCB0aGF0IG5vdGhpbmcgZWxzZSBkb2VzLiAgU2lnaC4KLSUgIzEgaXMgdGhlIFxFLi4uIGNvbnRyb2wgc2VxdWVuY2UgdG8gZW5kIHRoZSBkZWZpbml0aW9uICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMiBpcyB0aGUgXC4uLnggY29udHJvbCBzZXF1ZW5jZSBmb3IgY29uc2VjdXRpdmUgZm5zICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMyBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSB0byBjYWxsIHRvIHJlc3VtZSBwcm9jZXNzaW5nLgotJSAjNCwgZGVsaW1pdGVkIGJ5IHRoZSBzcGFjZSwgaXMgdGhlIGNsYXNzIG5hbWUuCi0lICM1IGlzIHRoZSBtZXRob2QncyByZXR1cm4gdHlwZS4KLSUgCi1cZGVmXGRlZnR5cGVtZXRocGFyc2Vib2R5IzEjMiMzIzQgIzUge1xiZWdpbmdyb3VwXGluRU5WICUKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMyIyMxICMjMiB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyMjMX17IyMyfX19JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IzR9eyM1fX19Ci0KLVxkZWZcZGVmb3BwYXJzZWJvZHkgIzEjMiMzIzQjNSB7XGJlZ2luZ3JvdXBcaW5FTlYgJQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzIjIzEgIyMyIHtcZGVmIzR7IyMxfSUKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjIzJ9fX0lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjNX19fQotCi0lIFRoZXNlIHBhcnNpbmcgZnVuY3Rpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBwcmVjZWRpbmcgb25lcwotJSBleGNlcHQgdGhhdCB0aGV5IGRvIG5vdCBtYWtlIHBhcmVucyBpbnRvIGFjdGl2ZSBjaGFyYWN0ZXJzLgotJSBUaGVzZSBhcmUgdXNlZCBmb3IgInZhcmlhYmxlcyIgc2luY2UgdGhleSBoYXZlIG5vIGFyZ3VtZW50cy4KLQotXGRlZlxkZWZ2YXJwYXJzZWJvZHkgIzEjMiMze1xiZWdpbmdyb3VwXGluRU5WJSBFbnZpcm9ubWVudCBmb3IgZGVmaW5pdGlvbmJvZHkKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMye1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xzcGFjZXNwbGl0IzN9JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cCAlCi1cY2F0Y29kZSA2MT1cYWN0aXZlICUKLVxvYmV5bGluZXNcc3BhY2VzcGxpdCMzfQotCi0lIFRoaXMgaXMgdXNlZCBmb3IgXGRlZnt0cCx2cn1wYXJzZWJvZHkuICBJdCBjb3VsZCBwcm9iYWJseSBiZSB1c2VkIGZvcgotJSBzb21lIG9mIHRoZSBvdGhlcnMsIHRvbywgd2l0aCBzb21lIGp1ZGljaW91cyBjb25kaXRpb25hbHMuCi0lCi1cZGVmXHBhcnNlYm9keWNvbW1vbiMxIzIjM3slCi0gIFxiZWdpbmdyb3VwXGluRU5WICUKLSAgXG1lZGJyZWFrICUKLSAgJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotICAlIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi0gIFxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi0gIFxkZWYjMiMjMSB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXHNwYWNlc3BsaXR7IzN7IyMxfX19JQotICBccGFyaW5kZW50PTBpbgotICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotICBcZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci0gIFxiZWdpbmdyb3VwXG9iZXlsaW5lcwotfQotCi1cZGVmXGRlZnZycGFyc2Vib2R5IzEjMiMzIzQgeyUKLSAgXHBhcnNlYm9keWNvbW1vbnsjMX17IzJ9eyMzfSUKLSAgXHNwYWNlc3BsaXR7IzN7IzR9fSUKLX0KLQotJSBUaGlzIGxvc2VzIG9uIGBAZGVmdHAge0RhdGEgVHlwZX0ge3N0cnVjdCB0ZXJtaW9zfScgLS0gaXQgdGhpbmtzIHRoZQotJSB0eXBlIGlzIGp1c3QgYHN0cnVjdCcsIGJlY2F1c2Ugd2UgbG9zZSB0aGUgYnJhY2VzIGluIGB7c3RydWN0Ci0lIHRlcm1pb3N9JyB3aGVuIFxzcGFjZXNwbGl0IHJlYWRzIGl0cyB1bmRlbGltaXRlZCBhcmd1bWVudC4gIFNpZ2guCi0lIFxsZXRcZGVmdHBwYXJzZWJvZHk9XGRlZnZycGFyc2Vib2R5Ci0lCi0lIFNvLCB0byBnZXQgYXJvdW5kIHRoaXMsIHdlIHB1dCBcZW1wdHkgaW4gd2l0aCB0aGUgdHlwZSBuYW1lLiAgVGhhdAotJSB3YXksIFRlWCB3b24ndCBmaW5kIGV4YWN0bHkgYHsuLi59JyBhcyBhbiB1bmRlbGltaXRlZCBhcmd1bWVudCwgYW5kCi0lIHdvbid0IHN0cmlwIG9mZiB0aGUgYnJhY2VzLgotJQotXGRlZlxkZWZ0cHBhcnNlYm9keSAjMSMyIzMjNCB7JQotICBccGFyc2Vib2R5Y29tbW9ueyMxfXsjMn17IzN9JQotICBcc3BhY2VzcGxpdHtccGFyc2V0cGhlYWRlcmxpbmV7IzN7IzR9fX1cZW1wdHkKLX0KLQotJSBGaW5lLCBidXQgdGhlbiB3ZSBoYXZlIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoZSBcZW1wdHkgKmFuZCogdGhlCi0lIGJyYWNlcyAoaWYgYW55KS4gIFRoYXQncyB3aGF0IHRoaXMgZG9lcy4KLSUKLVxkZWZccmVtb3ZlZW1wdHlicmFjZXNcZW1wdHkjMVxyZWxheHsjMX0KLQotJSBBZnRlciBcc3BhY2VzcGxpdCBoYXMgZG9uZSBpdHMgd29yaywgdGhpcyBpcyBjYWxsZWQgLS0gIzEgaXMgdGhlIGZpbmFsCi0lIHRoaW5nIHRvIGNhbGwsICMyIHRoZSB0eXBlIG5hbWUgKHdoaWNoIHN0YXJ0cyB3aXRoIFxlbXB0eSksIGFuZCAjMwotJSAod2hpY2ggbWlnaHQgYmUgZW1wdHkpIHRoZSBhcmd1bWVudHMuCi0lCi1cZGVmXHBhcnNldHBoZWFkZXJsaW5lIzEjMiMzeyUKLSAgIzF7XHJlbW92ZWVtcHR5YnJhY2VzIzJccmVsYXh9eyMzfSUKLX0lCi0KLVxkZWZcZGVmb3B2YXJwYXJzZWJvZHkgIzEjMiMzIzQjNSB7XGJlZ2luZ3JvdXBcaW5FTlYgJQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzIjIzEgIyMyIHtcZGVmIzR7IyMxfSUKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xzcGFjZXNwbGl0eyMzeyMjMn19fSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXHNwYWNlc3BsaXR7IzN7IzV9fX0KLQotJSBTcGxpdCB1cCAjMiBhdCB0aGUgZmlyc3Qgc3BhY2UgdG9rZW4uCi0lIGNhbGwgIzEgd2l0aCB0d28gYXJndW1lbnRzOgotJSAgdGhlIGZpcnN0IGlzIGFsbCBvZiAjMiBiZWZvcmUgdGhlIHNwYWNlIHRva2VuLAotJSAgdGhlIHNlY29uZCBpcyBhbGwgb2YgIzIgYWZ0ZXIgdGhhdCBzcGFjZSB0b2tlbi4KLSUgSWYgIzIgY29udGFpbnMgbm8gc3BhY2UgdG9rZW4sIGFsbCBvZiBpdCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZwotJSBhbmQgdGhlIHNlY29uZCBpcyBwYXNzZWQgYXMgZW1wdHkuCi0KLXtcb2JleWxpbmVzCi1cZ2RlZlxzcGFjZXNwbGl0IzEjMl5eTXtcZW5kZ3JvdXBcc3BhY2VzcGxpdGZvb3sjMX0jMiBccmVsYXhcc3BhY2VzcGxpdGZvb30lCi1cbG9uZ1xnZGVmXHNwYWNlc3BsaXRmb28jMSMyICMzIzRcc3BhY2VzcGxpdGZvb3slCi1caWZ4XHJlbGF4ICMzJQotIzF7IzJ9e31cZWxzZSAjMXsjMn17IzMjNH1cZml9fQotCi0lIFNvIG11Y2ggZm9yIHRoZSB0aGluZ3MgY29tbW9uIHRvIGFsbCBraW5kcyBvZiBkZWZpbml0aW9ucy4KLQotJSBEZWZpbmUgQGRlZnVuLgotCi0lIEZpcnN0LCBkZWZpbmUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyB3YW50ZWQgZm9yIGFyZ3VtZW50cyBvZiBcZGVmdW4KLSUgVXNlIHRoaXMgdG8gZXhwYW5kIHRoZSBhcmdzIGFuZCB0ZXJtaW5hdGUgdGhlIHBhcmFncmFwaCB0aGV5IG1ha2UgdXAKLQotXGRlZlxkZWZ1bmFyZ3MgIzF7XGZ1bmN0aW9ucGFyZW5zIFxzbAotJSBFeHBhbmQsIHByZXZlbnRpbmcgaHlwaGVuYXRpb24gYXQgYC0nIGNoYXJzLgotJSBOb3RlIHRoYXQgZ3JvdXBzIGRvbid0IGFmZmVjdCBjaGFuZ2VzIGluIFxoeXBoZW5jaGFyLgotXGh5cGhlbmNoYXJcdGVuc2w9MAotIzElCi1caHlwaGVuY2hhclx0ZW5zbD00NQotXGlmbnVtXHBhcmVuY291bnQ9MCBcZWxzZSBcZXJybWVzc2FnZXtVbmJhbGFuY2VkIHBhcmVudGhlc2VzIGluIEBkZWZ9XGZpJQotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxhZHZhbmNlXHJpZ2h0c2tpcCBieSAwcHQgcGx1cyAxZmlsCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi19Ci0KLVxkZWZcZGVmdHlwZWZ1bmFyZ3MgIzF7JQotJSBFeHBhbmQsIHByZXZlbnRpbmcgaHlwaGVuYXRpb24gYXQgYC0nIGNoYXJzLgotJSBOb3RlIHRoYXQgZ3JvdXBzIGRvbid0IGFmZmVjdCBjaGFuZ2VzIGluIFxoeXBoZW5jaGFyLgotJSBVc2UgXGJvbGRicmF4bm9hbXAsIG5vdCBcZnVuY3Rpb25wYXJlbnMsIHNvIHRoYXQgJiBpcyBub3Qgc3BlY2lhbC4KLVxib2xkYnJheG5vYW1wCi1cdGNsb3NleyMxfSUgYXZvaWQgXGNvZGUgYmVjYXVzZSBvZiBzaWRlIGVmZmVjdHMgb24gYWN0aXZlIGNoYXJzCi1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGFkdmFuY2VccmlnaHRza2lwIGJ5IDBwdCBwbHVzIDFmaWwKLVxlbmRncmFmXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwXG5vYnJlYWsKLX0KLQotJSBEbyBjb21wbGV0ZSBwcm9jZXNzaW5nIG9mIG9uZSBAZGVmdW4gb3IgQGRlZnVueCBsaW5lIGFscmVhZHkgcGFyc2VkLgotCi0lIEBkZWZmbiBDb21tYW5kIGZvcndhcmQtY2hhciBuY2hhcnMKLQotXGRlZlxkZWZmbntcZGVmbWV0aHBhcnNlYm9keVxFZGVmZm5cZGVmZm54XGRlZmZuaGVhZGVyfQotCi1cZGVmXGRlZmZuaGVhZGVyICMxIzIjM3tcZG9pbmQge2ZufXtcY29kZXsjMn19JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9eyMxfVxkZWZ1bmFyZ3N7IzN9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBAZGVmdW4gPT0gQGRlZmZuIEZ1bmN0aW9uCi0KLVxkZWZcZGVmdW57XGRlZnBhcnNlYm9keVxFZGVmdW5cZGVmdW54XGRlZnVuaGVhZGVyfQotCi1cZGVmXGRlZnVuaGVhZGVyICMxIzJ7XGRvaW5kIHtmbn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e0Z1bmN0aW9ufSUKLVxkZWZ1bmFyZ3MgeyMyfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnR5cGVmdW4gaW50IGZvb2JhciAoaW50IEB2YXJ7Zm9vfSwgZmxvYXQgQHZhcntiYXJ9KQotCi1cZGVmXGRlZnR5cGVmdW57XGRlZnBhcnNlYm9keVxFZGVmdHlwZWZ1blxkZWZ0eXBlZnVueFxkZWZ0eXBlZnVuaGVhZGVyfQotCi0lICMxIGlzIHRoZSBkYXRhIHR5cGUuICAjMiBpcyB0aGUgbmFtZSBhbmQgYXJncy4KLVxkZWZcZGVmdHlwZWZ1bmhlYWRlciAjMSMye1xkZWZ0eXBlZnVuaGVhZGVyeHsjMX0jMiBccmVsYXh9Ci0lICMxIGlzIHRoZSBkYXRhIHR5cGUsICMyIHRoZSBuYW1lLCAjMyB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZWZ1bmhlYWRlcnggIzEjMiAjM1xyZWxheHslCi1cZG9pbmQge2ZufXtcY29kZXsjMn19JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHtcZGVmaGVhZGVyeGNvbmQjMVxyZWxheCQkJCMyfXtGdW5jdGlvbn0lCi1cZGVmdHlwZWZ1bmFyZ3MgeyMzfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnR5cGVmbiB7TGlicmFyeSBGdW5jdGlvbn0gaW50IGZvb2JhciAoaW50IEB2YXJ7Zm9vfSwgZmxvYXQgQHZhcntiYXJ9KQotCi1cZGVmXGRlZnR5cGVmbntcZGVmbWV0aHBhcnNlYm9keVxFZGVmdHlwZWZuXGRlZnR5cGVmbnhcZGVmdHlwZWZuaGVhZGVyfQotCi0lIFxkZWZoZWFkZXJ4Y29uZCMxXHJlbGF4JCQkCi0lIHB1dHMgIzEgaW4gQGNvZGUsIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGJ1dCBkb2VzIG5vdGhpbmcgaWYgIzEgaXMgbnVsbC4KLVxkZWZcZGVmaGVhZGVyeGNvbmQjMSMyJCQke1xpZngjMVxyZWxheFxlbHNlXGNvZGV7IzEjMn0gXGZpfQotCi0lICMxIGlzIHRoZSBjbGFzc2lmaWNhdGlvbi4gICMyIGlzIHRoZSBkYXRhIHR5cGUuICAjMyBpcyB0aGUgbmFtZSBhbmQgYXJncy4KLVxkZWZcZGVmdHlwZWZuaGVhZGVyICMxIzIjM3tcZGVmdHlwZWZuaGVhZGVyeHsjMX17IzJ9IzMgXHJlbGF4fQotJSAjMSBpcyB0aGUgY2xhc3NpZmljYXRpb24sICMyIHRoZSBkYXRhIHR5cGUsICMzIHRoZSBuYW1lLCAjNCB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZWZuaGVhZGVyeCAjMSMyIzMgIzRccmVsYXh7JQotXGRvaW5kIHtmbn17XGNvZGV7IzN9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXAKLVxub3JtYWxwYXJlbnMgJSBub3RhYmx5LCB0dXJuIG9mZiBgJicgbWFnaWMsIHdoaWNoIHByZXZlbnRzCi0lICAgICAgICAgICAgICAgYXQgbGVhc3Qgc29tZSBDKysgdGV4dCBmcm9tIHdvcmtpbmcKLVxkZWZuYW1lIHtcZGVmaGVhZGVyeGNvbmQjMlxyZWxheCQkJCMzfXsjMX0lCi1cZGVmdHlwZWZ1bmFyZ3MgeyM0fVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZm1hYyA9PSBAZGVmZm4gTWFjcm8KLQotXGRlZlxkZWZtYWN7XGRlZnBhcnNlYm9keVxFZGVmbWFjXGRlZm1hY3hcZGVmbWFjaGVhZGVyfQotCi1cZGVmXGRlZm1hY2hlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtNYWNyb30lCi1cZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZzcGVjID09IEBkZWZmbiBTcGVjaWFsIEZvcm0KLQotXGRlZlxkZWZzcGVje1xkZWZwYXJzZWJvZHlcRWRlZnNwZWNcZGVmc3BlY3hcZGVmc3BlY2hlYWRlcn0KLQotXGRlZlxkZWZzcGVjaGVhZGVyICMxIzJ7XGRvaW5kIHtmbn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1NwZWNpYWwgRm9ybX0lCi1cZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIFRoaXMgZGVmaW5pdGlvbiBpcyBydW4gaWYgeW91IHVzZSBAZGVmdW54Ci0lIGFueXdoZXJlIG90aGVyIHRoYW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBAZGVmdW4gb3IgQGRlZnVueC4KLQotXGRlZlxkZWZmbnggIzEge1xlcnJtZXNzYWdle0BkZWZmbnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdW54ICMxIHtcZXJybWVzc2FnZXtAZGVmdW54IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZm1hY3ggIzEge1xlcnJtZXNzYWdle0BkZWZtYWN4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnNwZWN4ICMxIHtcZXJybWVzc2FnZXtAZGVmc3BlY3ggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZWZueCAjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGVmbnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZW1ldGhvZHggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBlbWV0aG9keCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBlZnVueCAjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGVmdW54IGluIGludmFsaWQgY29udGV4dH19Ci0KLSUgQGRlZm1ldGhvZCwgYW5kIHNvIG9uCi0KLSUgQGRlZm9wIENBVEVHT1JZIENMQVNTIE9QRVJBVElPTiBBUkcuLi4KLQotXGRlZlxkZWZvcCAjMSB7XGRlZlxkZWZvcHR5cGV7IzF9JQotXGRlZm9wcGFyc2Vib2R5XEVkZWZvcFxkZWZvcHhcZGVmb3BoZWFkZXJcZGVmb3B0eXBlfQotCi1cZGVmXGRlZm9waGVhZGVyICMxIzIjM3slCi1cZG9zdWJpbmQge2ZufXtcY29kZXsjMn19e1xwdXR3b3Jkb25cICMxfSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9e1xkZWZvcHR5cGV7fSBvbiAjMX0lCi1cZGVmdW5hcmdzIHsjM31cZW5kZ3JvdXAgJQotfQotCi0lIEBkZWZ0eXBlbWV0aG9kIENMQVNTIFJFVFVSTi1UWVBFIE1FVEhPRCBBUkcuLi4KLSUKLVxkZWZcZGVmdHlwZW1ldGhvZHslCi0gIFxkZWZ0eXBlbWV0aHBhcnNlYm9keVxFZGVmdHlwZW1ldGhvZFxkZWZ0eXBlbWV0aG9keFxkZWZ0eXBlbWV0aG9kaGVhZGVyfQotJQotJSAjMSBpcyB0aGUgY2xhc3MgbmFtZSwgIzIgdGhlIGRhdGEgdHlwZSwgIzMgdGhlIG1ldGhvZCBuYW1lLCAjNCB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZW1ldGhvZGhlYWRlciMxIzIjMyM0eyUKLSAgXGRvc3ViaW5ke2ZufXtcY29kZXsjM319e1xwdXR3b3Jkb25cIFxjb2RleyMxfX0lIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci0gIFxiZWdpbmdyb3VwCi0gICAgXGRlZm5hbWV7XGRlZmhlYWRlcnhjb25kIzJccmVsYXgkJCQjM317XHB1dHdvcmRNZXRob2RvblwgXGNvZGV7IzF9fSUKLSAgICBcZGVmdHlwZWZ1bmFyZ3N7IzR9JQotICBcZW5kZ3JvdXAKLX0KLQotJSBAZGVmbWV0aG9kID09IEBkZWZvcCBNZXRob2QKLSUKLVxkZWZcZGVmbWV0aG9ke1xkZWZtZXRocGFyc2Vib2R5XEVkZWZtZXRob2RcZGVmbWV0aG9keFxkZWZtZXRob2RoZWFkZXJ9Ci0lCi0lICMxIGlzIHRoZSBjbGFzcyBuYW1lLCAjMiB0aGUgbWV0aG9kIG5hbWUsICMzIHRoZSBhcmdzLgotXGRlZlxkZWZtZXRob2RoZWFkZXIjMSMyIzN7JQotICBcZG9zdWJpbmR7Zm59e1xjb2RleyMyfX17XHB1dHdvcmRvblwgXGNvZGV7IzF9fSUgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLSAgXGJlZ2luZ3JvdXAKLSAgICBcZGVmbmFtZXsjMn17XHB1dHdvcmRNZXRob2RvblwgXGNvZGV7IzF9fSUKLSAgICBcZGVmdW5hcmdzeyMzfSUKLSAgXGVuZGdyb3VwCi19Ci0KLSUgQGRlZmN2IHtDbGFzcyBPcHRpb259IGZvby1jbGFzcyBmb28tZmxhZwotCi1cZGVmXGRlZmN2ICMxIHtcZGVmXGRlZmN2dHlwZXsjMX0lCi1cZGVmb3B2YXJwYXJzZWJvZHlcRWRlZmN2XGRlZmN2eFxkZWZjdmFyaGVhZGVyXGRlZmN2dHlwZX0KLQotXGRlZlxkZWZjdmFyaGVhZGVyICMxIzIjM3slCi1cZG9zdWJpbmQge3ZyfXtcY29kZXsjMn19e29mICMxfSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtcZGVmY3Z0eXBle30gb2YgIzF9JQotXGRlZnZhcmFyZ3MgeyMzfVxlbmRncm91cCAlCi19Ci0KLSUgQGRlZml2YXIgPT0gQGRlZmN2IHtJbnN0YW5jZSBWYXJpYWJsZX0KLQotXGRlZlxkZWZpdmFye1xkZWZ2cnBhcnNlYm9keVxFZGVmaXZhclxkZWZpdmFyeFxkZWZpdmFyaGVhZGVyfQotCi1cZGVmXGRlZml2YXJoZWFkZXIgIzEjMiMzeyUKLVxkb3N1YmluZCB7dnJ9e1xjb2RleyMyfX17b2YgIzF9JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9e0luc3RhbmNlIFZhcmlhYmxlIG9mICMxfSUKLVxkZWZ2YXJhcmdzIHsjM31cZW5kZ3JvdXAgJQotfQotCi0lIFRoZXNlIGRlZmluaXRpb25zIGFyZSBydW4gaWYgeW91IHVzZSBAZGVmbWV0aG9keCwgZXRjLiwKLSUgYW55d2hlcmUgb3RoZXIgdGhhbiBpbW1lZGlhdGVseSBhZnRlciBhIEBkZWZtZXRob2QsIGV0Yy4KLQotXGRlZlxkZWZvcHggIzEge1xlcnJtZXNzYWdle0BkZWZvcHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmbWV0aG9keCAjMSB7XGVycm1lc3NhZ2V7QGRlZm1ldGhvZHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmY3Z4ICMxIHtcZXJybWVzc2FnZXtAZGVmY3Z4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZml2YXJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmaXZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KLQotJSBOb3cgQGRlZnZhcgotCi0lIEZpcnN0LCBkZWZpbmUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyB3YW50ZWQgZm9yIGFyZ3VtZW50cyBvZiBAZGVmdmFyLgotJSBUaGlzIGlzIGFjdHVhbGx5IHNpbXBsZToganVzdCBwcmludCB0aGVtIGluIHJvbWFuLgotJSBUaGlzIG11c3QgZXhwYW5kIHRoZSBhcmdzIGFuZCB0ZXJtaW5hdGUgdGhlIHBhcmFncmFwaCB0aGV5IG1ha2UgdXAKLVxkZWZcZGVmdmFyYXJncyAjMXtcbm9ybWFscGFyZW5zICMxJQotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxlbmRncmFmXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwXG5vYnJlYWt9Ci0KLSUgQGRlZnZyIENvdW50ZXIgZm9vLWNvdW50Ci0KLVxkZWZcZGVmdnJ7XGRlZnZycGFyc2Vib2R5XEVkZWZ2clxkZWZ2cnhcZGVmdnJoZWFkZXJ9Ci0KLVxkZWZcZGVmdnJoZWFkZXIgIzEjMiMze1xkb2luZCB7dnJ9e1xjb2RleyMyfX0lCi1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17IzF9XGRlZnZhcmFyZ3N7IzN9XGVuZGdyb3VwfQotCi0lIEBkZWZ2YXIgPT0gQGRlZnZyIFZhcmlhYmxlCi0KLVxkZWZcZGVmdmFye1xkZWZ2YXJwYXJzZWJvZHlcRWRlZnZhclxkZWZ2YXJ4XGRlZnZhcmhlYWRlcn0KLQotXGRlZlxkZWZ2YXJoZWFkZXIgIzEjMntcZG9pbmQge3ZyfXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1ZhcmlhYmxlfSUKLVxkZWZ2YXJhcmdzIHsjMn1cZW5kZ3JvdXAgJQotfQotCi0lIEBkZWZvcHQgPT0gQGRlZnZyIHtVc2VyIE9wdGlvbn0KLQotXGRlZlxkZWZvcHR7XGRlZnZhcnBhcnNlYm9keVxFZGVmb3B0XGRlZm9wdHhcZGVmb3B0aGVhZGVyfQotCi1cZGVmXGRlZm9wdGhlYWRlciAjMSMye1xkb2luZCB7dnJ9e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gdmFyIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMX17VXNlciBPcHRpb259JQotXGRlZnZhcmFyZ3MgeyMyfVxlbmRncm91cCAlCi19Ci0KLSUgQGRlZnR5cGV2YXIgaW50IGZvb2JhcgotCi1cZGVmXGRlZnR5cGV2YXJ7XGRlZnZhcnBhcnNlYm9keVxFZGVmdHlwZXZhclxkZWZ0eXBldmFyeFxkZWZ0eXBldmFyaGVhZGVyfQotCi0lICMxIGlzIHRoZSBkYXRhIHR5cGUuICAjMiBpcyB0aGUgbmFtZSwgcGVyaGFwcyBmb2xsb3dlZCBieSB0ZXh0IHRoYXQKLSUgaXMgYWN0dWFsbHkgcGFydCBvZiB0aGUgZGF0YSB0eXBlLCB3aGljaCBzaG91bGQgbm90IGJlIHB1dCBpbnRvIHRoZSBpbmRleC4KLVxkZWZcZGVmdHlwZXZhcmhlYWRlciAjMSMyeyUKLVxkb3ZhcmluZCMyIFxyZWxheCUgTWFrZSBlbnRyeSBpbiB2YXJpYWJsZXMgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUge1xkZWZoZWFkZXJ4Y29uZCMxXHJlbGF4JCQkIzJ9e1ZhcmlhYmxlfSUKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi1cZW5kZ3JvdXB9Ci1cZGVmXGRvdmFyaW5kIzEgIzJccmVsYXh7XGRvaW5ke3ZyfXtcY29kZXsjMX19fQotCi0lIEBkZWZ0eXBldnIge0dsb2JhbCBGbGFnfSBpbnQgZW5hYmxlCi0KLVxkZWZcZGVmdHlwZXZye1xkZWZ2cnBhcnNlYm9keVxFZGVmdHlwZXZyXGRlZnR5cGV2cnhcZGVmdHlwZXZyaGVhZGVyfQotCi1cZGVmXGRlZnR5cGV2cmhlYWRlciAjMSMyIzN7XGRvdmFyaW5kIzMgXHJlbGF4JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzJccmVsYXgkJCQjM317IzF9Ci1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotXGVuZGdyb3VwfQotCi0lIFRoaXMgZGVmaW5pdGlvbiBpcyBydW4gaWYgeW91IHVzZSBAZGVmdmFyeAotJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnZhciBvciBAZGVmdmFyeC4KLQotXGRlZlxkZWZ2cnggIzEge1xlcnJtZXNzYWdle0BkZWZ2cnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdmFyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmb3B0eCAjMSB7XGVycm1lc3NhZ2V7QGRlZm9wdHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZXZhcnggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBldmFyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBldnJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZXZyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotCi0lIE5vdyBkZWZpbmUgQGRlZnRwCi0lIEFyZ3MgYXJlIHByaW50ZWQgaW4gYm9sZCwgYSBzbGlnaHQgZGlmZmVyZW5jZSBmcm9tIEBkZWZ2YXIuCi0KLVxkZWZcZGVmdHBhcmdzICMxe1xiZiBcZGVmdmFyYXJnc3sjMX19Ci0KLSUgQGRlZnRwIENsYXNzIHdpbmRvdyBoZWlnaHQgd2lkdGggLi4uCi0KLVxkZWZcZGVmdHB7XGRlZnRwcGFyc2Vib2R5XEVkZWZ0cFxkZWZ0cHhcZGVmdHBoZWFkZXJ9Ci0KLVxkZWZcZGVmdHBoZWFkZXIgIzEjMiMze1xkb2luZCB7dHB9e1xjb2RleyMyfX0lCi1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17IzF9XGRlZnRwYXJnc3sjM31cZW5kZ3JvdXB9Ci0KLSUgVGhpcyBkZWZpbml0aW9uIGlzIHJ1biBpZiB5b3UgdXNlIEBkZWZ0cHgsIGV0YwotJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnRwLCBldGMuCi0KLVxkZWZcZGVmdHB4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHB4IGluIGludmFsaWQgY29udGV4dH19Ci0KLQotXG1lc3NhZ2V7bWFjcm9zLH0KLSUgQG1hY3JvLgotCi0lIFRvIGRvIHRoaXMgcmlnaHQgd2UgbmVlZCBhIGZlYXR1cmUgb2YgZS1UZVgsIFxzY2FudG9rZW5zLCAKLSUgd2hpY2ggd2UgYXJyYW5nZSB0byBlbXVsYXRlIHdpdGggYSB0ZW1wb3JhcnkgZmlsZSBpbiBvcmRpbmFyeSBUZVguCi1caWZ4XGVUZVh2ZXJzaW9uXHVuZGVmaW5lZAotIFxuZXd3cml0ZVxtYWNzY3JpYmJsZQotIFxkZWZcc2Nhbm1hY3JvIzF7JQotICAgXGJlZ2luZ3JvdXAgXG5ld2xpbmVjaGFyYFxeXk0KLSAgIFxpbW1lZGlhdGVcb3Blbm91dFxtYWNzY3JpYmJsZT1cam9ibmFtZS50bXAKLSAgIFxpbW1lZGlhdGVcd3JpdGVcbWFjc2NyaWJibGV7IzF9JQotICAgXGltbWVkaWF0ZVxjbG9zZW91dFxtYWNzY3JpYmJsZQotICAgXGxldFx4ZWF0c3BhY2VzXGVhdHNwYWNlcwotICAgXGlucHV0IFxqb2JuYW1lLnRtcAotICAgXGVuZGdyb3VwCi19Ci1cZWxzZQotXGRlZlxzY2FubWFjcm8jMXslCi1cYmVnaW5ncm91cCBcbmV3bGluZWNoYXJgXF5eTQotXGxldFx4ZWF0c3BhY2VzXGVhdHNwYWNlc1xzY2FudG9rZW5zeyMxfVxlbmRncm91cH0KLVxmaQotCi1cbmV3Y291bnRccGFyYW1ubyAgICUgQ291bnQgb2YgcGFyYW1ldGVycwotXG5ld3Rva3NcbWFjbmFtZSAgICAlIE1hY3JvIG5hbWUKLVxuZXdpZlxpZnJlY3Vyc2l2ZSAgJSBJcyBpdCByZWN1cnNpdmU/Ci0KLSUgVXRpbGl0eSByb3V0aW5lcy4KLSUgVGhpc2RvZXMgXGxldCAjMSA9ICMyLCBleGNlcHQgd2l0aCBcY3NuYW1lcy4KLVxkZWZcY3NsZXQjMSMyeyUKLVxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotXGV4cGFuZGFmdGVyXGxldAotXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi1cY3NuYW1lIzFcZW5kY3NuYW1lCi1cY3NuYW1lIzJcZW5kY3NuYW1lfQotCi0lIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIG9mZiBhIHN0cmluZy4KLSUgQ29uY2VwdHMgZnJvbSBhcm8tYmVuZCBwcm9ibGVtIDE1IChzZWUgQ1RBTikuCi17XGNhdGNvZGVgXEA9MTEKLVxnZGVmXGVhdHNwYWNlcyAjMXtcZXhwYW5kYWZ0ZXJcdHJpbUBcZXhwYW5kYWZ0ZXJ7IzEgfX0KLVxnZGVmXHRyaW1AICMxe1x0cmltQEAgQCMxIEAgIzEgQCBAQH0KLVxnZGVmXHRyaW1AQCAjMUAgIzJAICMzQEB7XHRyaW1AQEBcZW1wdHkgIzIgQH0KLVxkZWZcdW5icmFjZSMxeyMxfQotXHVuYnJhY2V7XGdkZWZcdHJpbUBAQCAjMSB9ICMyQHsjMX0KLX0KLQotJSBUcmltIGEgc2luZ2xlIHRyYWlsaW5nIF5eTSBvZmYgYSBzdHJpbmcuCi17XGNhdGNvZGVgXF5eTT0xMlxjYXRjb2RlYFxRPTMlCi1cZ2RlZlxlYXRjciAjMXtcZWF0Y3JhICMxUV5eTVF9JQotXGdkZWZcZWF0Y3JhIzFeXk1Re1xlYXRjcmIjMVF9JQotXGdkZWZcZWF0Y3JiIzFRIzJReyMxfSUKLX0KLQotJSBNYWNybyBib2RpZXMgYXJlIGFic29yYmVkIGFzIGFuIGFyZ3VtZW50IGluIGEgY29udGV4dCB3aGVyZQotJSBhbGwgY2hhcmFjdGVycyBhcmUgY2F0Y29kZSAxMCwgMTEgb3IgMTIsIGV4Y2VwdCBcIHdoaWNoIGlzIGFjdGl2ZQotJSAoYXMgaW4gbm9ybWFsIHRleGluZm8pLiBJdCBpcyBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIFwuCi0KLSUgSXQncyBuZWNlc3NhcnkgdG8gaGF2ZSBoYXJkIENScyB3aGVuIHRoZSBtYWNybyBpcyBleGVjdXRlZC4gVGhpcyBpcyAKLSUgZG9uZSBieSAgbWFraW5nIF5eTSAoXGVuZGxpbmVjaGFyKSBjYXRjb2RlIDEyIHdoZW4gcmVhZGluZyB0aGUgbWFjcm8gCi0lIGJvZHksIGFuZCB0aGVuIG1ha2luZyBpdCB0aGUgXG5ld2xpbmVjaGFyIGluIFxzY2FubWFjcm8uCi0KLVxkZWZcbWFjcm9ib2R5Y3R4dHslCi0gIFxjYXRjb2RlYFx+PTEyCi0gIFxjYXRjb2RlYFxePTEyCi0gIFxjYXRjb2RlYFxfPTEyCi0gIFxjYXRjb2RlYFx8PTEyCi0gIFxjYXRjb2RlYFw8PTEyCi0gIFxjYXRjb2RlYFw+PTEyCi0gIFxjYXRjb2RlYFwrPTEyCi0gIFxjYXRjb2RlYFx7PTEyCi0gIFxjYXRjb2RlYFx9PTEyCi0gIFxjYXRjb2RlYFxAPTEyCi0gIFxjYXRjb2RlYFxeXk09MTIKLSAgXHVzZW1ib2R5YmFja3NsYXNofQotCi0lIFxtYm9keWJhY2tzbGFzaCBpcyB0aGUgZGVmaW5pdGlvbiBvZiBcIGluIEBtYWNybyBib2RpZXMuCi0lIEl0IG1hcHMgXGZvb1wgPT4gXGNzbmFtZSBtYWNhcmcuZm9vXGVuZGNzbmFtZSA9PiAjTiAKLSUgd2hlcmUgTiBpcyB0aGUgbWFjcm8gcGFyYW1ldGVyIG51bWJlci4KLSUgV2UgZGVmaW5lIFxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWUgdG8gYmUgXHJlYWxiYWNrc2xhc2gsIHNvCi0lIFxcIGluIG1hY3JvIHJlcGxhY2VtZW50IHRleHQgZ2V0cyB5b3UgYSBiYWNrc2xhc2guCi0KLXtcY2F0Y29kZWBAPTAgQGNhdGNvZGVgQFw9QGFjdGl2ZQotIEBnZGVmQHVzZW1ib2R5YmFja3NsYXNoe0BsZXRcPUBtYm9keWJhY2tzbGFzaH0KLSBAZ2RlZkBtYm9keWJhY2tzbGFzaCMxXHtAY3NuYW1lIG1hY2FyZy4jMUBlbmRjc25hbWV9Ci19Ci1cZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSBtYWNhcmcuXGVuZGNzbmFtZXtccmVhbGJhY2tzbGFzaH0KLQotXGRlZlxtYWNyb3tccmVjdXJzaXZlZmFsc2VccGFyc2VhcmdcbWFjcm94eHh9Ci1cZGVmXHJtYWNyb3tccmVjdXJzaXZldHJ1ZVxwYXJzZWFyZ1xtYWNyb3h4eH0KLQotXGRlZlxtYWNyb3h4eCMxeyUKLSAgXGdldGFyZ3N7IzF9JSAgICAgICAgICAgbm93IFxtYWNuYW1lIGlzIHRoZSBtYWNuYW1lIGFuZCBcYXJnbCB0aGUgYXJnbGlzdAotICBcaWZ4XGFyZ2xcZW1wdHkgICAgICAgJSBubyBhcmd1bWVudHMKLSAgICAgXHBhcmFtbm89MCUKLSAgXGVsc2UKLSAgICAgXGV4cGFuZGFmdGVyXHBhcnNlbWFyZ2RlZiBcYXJnbDslIAotICBcZmkKLSAgXGV4cGFuZGFmdGVyXGlmeCBcY3NuYW1lIG1hY3NhdmUuXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSBccmVsYXgKLSAgICAgXGNzbGV0e21hY3NhdmUuXHRoZVxtYWNuYW1lfXtcdGhlXG1hY25hbWV9JQotICBcZWxzZQotICAgICBcbWVzc2FnZXtXYXJuaW5nOiByZWRlZmluaW5nIFx0aGVcbWFjbmFtZX0lCi0gIFxmaQotICBcYmVnaW5ncm91cCBcbWFjcm9ib2R5Y3R4dAotICBcaWZyZWN1cnNpdmUgXGV4cGFuZGFmdGVyXHBhcnNlcm1hY2JvZHkKLSAgXGVsc2UgXGV4cGFuZGFmdGVyXHBhcnNlbWFjYm9keSAKLSAgXGZpfQotCi1cZGVmXHVubWFjcm97XHBhcnNlYXJnXHVubWFjcm94eHh9Ci1cZGVmXHVubWFjcm94eHgjMXslCi0gIFxleHBhbmRhZnRlclxpZnggXGNzbmFtZSBtYWNzYXZlLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUgXHJlbGF4Ci0gICAgXGVycm1lc3NhZ2V7TWFjcm8gXHRoZVxtYWNuYW1lXCBub3QgZGVmaW5lZC59JQotICBcZWxzZQotICAgIFxjc2xldHsjMX17bWFjc2F2ZS4jMX0lCi0gICAgXGV4cGFuZGFmdGVyXGxldCBcY3NuYW1lIG1hY3NhdmUuXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSBcdW5kZWZpbmVkCi0gIFxmaQotfQotCi0lIFRoaXMgbWFrZXMgdXNlIG9mIHRoZSBvYnNjdXJlIGZlYXR1cmUgdGhhdCBpZiB0aGUgbGFzdCB0b2tlbiBvZiBhCi0lIDxwYXJhbWV0ZXIgbGlzdD4gaXMgIywgdGhlbiB0aGUgcHJlY2VkaW5nIGFyZ3VtZW50IGlzIGRlbGltaXRlZCBieQotJSBhbiBvcGVuaW5nIGJyYWNlLCBhbmQgdGhhdCBvcGVuaW5nIGJyYWNlIGlzIG5vdCBjb25zdW1lZC4KLVxkZWZcZ2V0YXJncyMxe1xnZXRhcmdzeHh4IzF7fX0KLVxkZWZcZ2V0YXJnc3h4eCMxI3tcZ2V0bWFjbmFtZSAjMSBccmVsYXhcZ2V0bWFjYXJnc30KLVxkZWZcZ2V0bWFjbmFtZSAjMSAjMlxyZWxheHtcbWFjbmFtZT17IzF9fQotXGRlZlxnZXRtYWNhcmdzIzF7XGRlZlxhcmdseyMxfX0KLQotJSBQYXJzZSB0aGUgb3B0aW9uYWwge3BhcmFtc30gbGlzdC4gIFNldCB1cCBccGFyYW1ubyBhbmQgXHBhcmFtbGlzdAotJSBzbyBcZGVmbWFjcm8ga25vd3Mgd2hhdCB0byBkby4gIERlZmluZSBcbWFjYXJnLmJsYWggZm9yIGVhY2ggYmxhaAotJSBpbiB0aGUgcGFyYW1zIGxpc3QsIHRvIGJlICMjTiB3aGVyZSBOIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGF0IGxpc3QuCi0lIFRoYXQgZ2V0cyB1c2VkIGJ5IFxtYm9keWJhY2tzbGFzaCAoYWJvdmUpLgotCi0lIFdlIG5lZWQgdG8gZ2V0IGBtYWNybyBwYXJhbWV0ZXIgY2hhciAjJyBpbnRvIHNldmVyYWwgZGVmaW5pdGlvbnMuCi0lIFRoZSB0ZWNobmlxdWUgdXNlZCBpcyBzdG9sZW4gZnJvbSBMYVRlWDogIGxldCBcaGFzaCBiZSBzb21ldGhpbmcKLSUgdW5leHBhbmRhYmxlLCBpbnNlcnQgdGhhdCB3aGVyZXZlciB5b3UgbmVlZCBhICMsIGFuZCB0aGVuIHJlZGVmaW5lCi0lIGl0IHRvICMganVzdCBiZWZvcmUgdXNpbmcgdGhlIHRva2VuIGxpc3QgcHJvZHVjZWQuCi0lCi0lIFRoZSBzYW1lIHRlY2huaXF1ZSBpcyB1c2VkIHRvIHByb3RlY3QgXGVhdHNwYWNlcyB0aWxsIGp1c3QgYmVmb3JlCi0lIHRoZSBtYWNybyBpcyB1c2VkLgotCi1cZGVmXHBhcnNlbWFyZ2RlZiMxO3tccGFyYW1ubz0wXGRlZlxwYXJhbWxpc3R7fSUKLSAgICAgICAgXGxldFxoYXNoXHJlbGF4XGxldFx4ZWF0c3BhY2VzXHJlbGF4XHBhcnNlbWFyZ2RlZnh4eCMxLDssfQotXGRlZlxwYXJzZW1hcmdkZWZ4eHgjMSx7JQotICBcaWYjMTtcbGV0XG5leHQ9XHJlbGF4Ci0gIFxlbHNlIFxsZXRcbmV4dD1ccGFyc2VtYXJnZGVmeHh4Ci0gICAgXGFkdmFuY2VccGFyYW1ubyBieSAxJQotICAgIFxleHBhbmRhZnRlclxlZGVmXGNzbmFtZSBtYWNhcmcuXGVhdHNwYWNlc3sjMX1cZW5kY3NuYW1lCi0gICAgICAgIHtceGVhdHNwYWNlc3tcaGFzaFx0aGVccGFyYW1ub319JQotICAgIFxlZGVmXHBhcmFtbGlzdHtccGFyYW1saXN0XGhhc2hcdGhlXHBhcmFtbm8sfSUKLSAgXGZpXG5leHR9Ci0KLSUgVGhlc2UgdHdvIGNvbW1hbmRzIHJlYWQgcmVjdXJzaXZlIGFuZCBub25yZWN1cnNpdmUgbWFjcm8gYm9kaWVzLgotJSAoVGhleSdyZSBkaWZmZXJlbnQgc2luY2UgcmVjIGFuZCBub25yZWMgbWFjcm9zIGVuZCBkaWZmZXJlbnRseS4pCi0KLVxsb25nXGRlZlxwYXJzZW1hY2JvZHkjMUBlbmQgbWFjcm8lCi17XHhkZWZcdGVtcHtcZWF0Y3J7IzF9fVxlbmRncm91cFxkZWZtYWNyb30lCi1cbG9uZ1xkZWZccGFyc2VybWFjYm9keSMxQGVuZCBybWFjcm8lCi17XHhkZWZcdGVtcHtcZWF0Y3J7IzF9fVxlbmRncm91cFxkZWZtYWNyb30lCi0KLSUgVGhpcyBkZWZpbmVzIHRoZSBtYWNybyBpdHNlbGYuIFRoZXJlIGFyZSBzaXggY2FzZXM6IHJlY3Vyc2l2ZSBhbmQKLSUgbm9ucmVjdXJzaXZlIG1hY3JvcyBvZiB6ZXJvLCBvbmUsIGFuZCBtYW55IGFyZ3VtZW50cy4KLSUgTXVjaCBtYWdpYyB3aXRoIFxleHBhbmRhZnRlciBoZXJlLgotJSBceGRlZiBpcyB1c2VkIHNvIHRoYXQgbWFjcm8gZGVmaW5pdGlvbnMgd2lsbCBzdXJ2aXZlIHRoZSBmaWxlCi0lIHRoZXkncmUgZGVmaW5lZCBpbjsgQGluY2x1ZGUgcmVhZHMgdGhlIGZpbGUgaW5zaWRlIGEgZ3JvdXAuCi1cZGVmXGRlZm1hY3JveyUKLSAgXGxldFxoYXNoPSMjJSBjb252ZXJ0IHBsYWNlaG9sZGVycyB0byBtYWNybyBwYXJhbWV0ZXIgY2hhcnMKLSAgXGlmcmVjdXJzaXZlCi0gICAgXGlmY2FzZVxwYXJhbW5vCi0gICAgJSAwCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQotICAgIFxvciAlIDEKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQotICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lfSUKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lIyMxeyUKLSAgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKLSAgICBcZWxzZSAlIG1hbnkKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWUjIzF7JQotICAgICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgCi0gICAgICAgICAgXHBhcmFtbGlzdHtcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgXGlmY2FzZVxwYXJhbW5vCi0gICAgJSAwCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQotICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQotICAgIFxvciAlIDEKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQotICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lfSUKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lIyMxeyUKLSAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQotICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQotICAgIFxlbHNlICUgbWFueQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSMjMXslCi0gICAgICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lICMjMSx9JQotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZgotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUKLSAgICAgIFxwYXJhbWxpc3R7JQotICAgICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKLSAgICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQotICAgIFxmaQotICBcZml9Ci0KLVxkZWZcbm9yZWN1cnNlIzF7XGJncm91cFxjc2xldHsjMX17bWFjc2F2ZS4jMX19Ci0KLSUgXGJyYWNlb3JsaW5lIGRlY2lkZXMgd2hldGhlciB0aGUgbmV4dCBub253aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhCi0lIHsuICBJZiBzbyBpdCByZWFkcyB1cCB0byB0aGUgY2xvc2luZyB9LCBpZiBub3QsIGl0IHJlYWRzIHRoZSB3aG9sZQotJSBsaW5lLiAgV2hhdGV2ZXIgd2FzIHJlYWQgaXMgdGhlbiBmZWQgdG8gdGhlIG5leHQgY29udHJvbCBzZXF1ZW5jZQotJSBhcyBhbiBhcmd1bWVudCAoYnkgXHBhcnNlYnJhY2Ugb3IgXHBhcnNlYXJnKQotXGRlZlxicmFjZW9ybGluZSMxe1xsZXRcbmV4dD0jMVxmdXR1cmVsZXRcbmNoYXJcYnJhY2VvcmxpbmV4eHh9Ci1cZGVmXGJyYWNlb3JsaW5leHh4eyUKLSAgXGlmeFxuY2hhclxiZ3JvdXBcZWxzZQotICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZyAKLSAgXGZpIFxuZXh0fQotCi0KLVxtZXNzYWdle2Nyb3NzIHJlZmVyZW5jZXMsfQotXG5ld3dyaXRlXGF1eGZpbGUKLQotXG5ld2lmXGlmaGF2ZXhyZWZzICAgICUgVHJ1ZSBpZiB4cmVmIHZhbHVlcyBhcmUga25vd24uCi1cbmV3aWZcaWZ3YXJuZWR4cmVmcyAgJSBUcnVlIGlmIHdlIHdhcm5lZCBvbmNlIHRoYXQgdGhleSBhcmVuJ3Qga25vd24uCi0KLSUgQGluZm9yZWYgaXMgcmVsYXRpdmVseSBzaW1wbGUuCi1cZGVmXGluZm9yZWYgIzF7XGluZm9yZWZ6enogIzEsLCwsKip9Ci1cZGVmXGluZm9yZWZ6enogIzEsIzIsIzMsIzQqKntccHV0d29yZFNlZXt9IFxwdXR3b3JkSW5mb3t9IFxwdXR3b3JkZmlsZXt9IFxmaWxle1xpZ25vcmVzcGFjZXMgIzN7fX0sCi0gIG5vZGUgXHNhbXB7XGlnbm9yZXNwYWNlcyMxe319fQotCi0lIEBub2RlJ3Mgam9iIGlzIHRvIGRlZmluZSBcbGFzdG5vZGUuCi1cZGVmXG5vZGV7XEVOVmNoZWNrXHBhcnNlYXJnXG5vZGV6enp9Ci1cZGVmXG5vZGV6enojMXtcbm9kZXh4eCBbIzEsXX0KLVxkZWZcbm9kZXh4eFsjMSwjMl17XGdkZWZcbGFzdG5vZGV7IzF9fQotXGxldFxud25vZGU9XG5vZGUKLVxsZXRcbGFzdG5vZGU9XHJlbGF4Ci0KLSUgVGhlIHNlY3Rpb25pbmcgY29tbWFuZHMgKEBjaGFwdGVyLCBldGMuKSBjYWxsIHRoZXNlLgotXGRlZlxkb25vZGVyZWZ7JQotICBcaWZ4XGxhc3Rub2RlXHJlbGF4XGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcc2V0cmVme1xsYXN0bm9kZX0lCi0gICAgICB7WXNlY3Rpb25udW1iZXJhbmR0eXBlfSUKLSAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1ccmVsYXgKLSAgXGZpCi19Ci1cZGVmXHVubnVtYm5vZGVyZWZ7JQotICBcaWZ4XGxhc3Rub2RlXHJlbGF4XGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcc2V0cmVme1xsYXN0bm9kZX17WW5vdGhpbmd9JQotICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxyZWxheAotICBcZmkKLX0KLVxkZWZcYXBwZW5kaXhub2RlcmVmeyUKLSAgXGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXHNldHJlZntcbGFzdG5vZGV9JQotICAgICAge1lhcHBlbmRpeGxldHRlcmFuZHR5cGV9JQotICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxyZWxheAotICBcZmkKLX0KLQotCi0lIEBhbmNob3J7TkFNRX0gLS0gZGVmaW5lIHhyZWYgdGFyZ2V0IGF0IGFyYml0cmFyeSBwb2ludC4KLSUgCi1cZGVmXGFuY2hvciMxe1xzZXRyZWZ7IzF9e1lub3RoaW5nfX0KLQotCi0lIFxzZXRyZWZ7TkFNRX17U05UfSBkZWZpbmVzIGEgY3Jvc3MtcmVmZXJlbmNlIHBvaW50IE5BTUUsIG5hbWVseQotJSBOQU1FLXRpdGxlLCBOQU1FLXBnLCBhbmQgTkFNRS1TTlQuICBDYWxsZWQgZnJvbSBcZm9vbm9kZXJlZi4gIFdlIGhhdmUKLSUgdG8gc2V0IFxpbmRleGR1bW1pZXMgc28gY29tbWFuZHMgc3VjaCBhcyBAY29kZSBpbiBhIHNlY3Rpb24gdGl0bGUKLSUgYXJlbid0IGV4cGFuZGVkLiAgSXQgd291bGQgYmUgbmljZXIgbm90IHRvIGV4cGFuZCB0aGUgdGl0bGVzIGluIHRoZQotJSBmaXJzdCBwbGFjZSwgYnV0IHRoZXJlJ3Mgc28gbWFueSBsYXllcnMgdGhhdCB0aGF0IGlzIGhhcmQgdG8gZG8uCi0lIAotXGRlZlxzZXRyZWYjMSMye3slCi0gIFxpbmRleGR1bW1pZXMKLSAgXGRvc2V0cXsjMS10aXRsZX17WXRpdGxlfSUKLSAgXGRvc2V0cXsjMS1wZ317WXBhZ2VudW1iZXJ9JQotICBcZG9zZXRxeyMxLXNudH17IzJ9Ci19fQotCi0lIEB4cmVmLCBAcHhyZWYsIGFuZCBAcmVmIGdlbmVyYXRlIGNyb3NzLXJlZmVyZW5jZXMuICBGb3IgXHhyZWZYLCAjMSBpcwotJSB0aGUgbm9kZSBuYW1lLCAjMiB0aGUgbmFtZSBvZiB0aGUgSW5mbyBjcm9zcy1yZWZlcmVuY2UsICMzIHRoZSBwcmludGVkCi0lIG5vZGUgbmFtZSwgIzQgdGhlIG5hbWUgb2YgdGhlIEluZm8gZmlsZSwgIzUgdGhlIG5hbWUgb2YgdGhlIHByaW50ZWQKLSUgbWFudWFsLiAgQWxsIGJ1dCB0aGUgbm9kZSBuYW1lIGNhbiBiZSBvbWl0dGVkLgotJQotXGRlZlxweHJlZiMxe1xwdXR3b3Jkc2Vle30gXHhyZWZYWyMxLCwsLCwsLF19Ci1cZGVmXHhyZWYjMXtccHV0d29yZFNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQotXGRlZlxyZWYjMXtceHJlZlhbIzEsLCwsLCwsXX0KLVxkZWZceHJlZlhbIzEsIzIsIzMsIzQsIzUsIzZde1xiZWdpbmdyb3VwCi0gIFxkZWZccHJpbnRlZG1hbnVhbHtcaWdub3Jlc3BhY2VzICM1fSUKLSAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjM30lCi0gIFxzZXRib3gxPVxoYm94e1xwcmludGVkbWFudWFsfSUKLSAgXHNldGJveDA9XGhib3h7XHByaW50ZWRub2RlbmFtZX0lCi0gIFxpZmRpbSBcd2QwID0gMHB0Ci0gICAgJSBObyBwcmludGVkIG5vZGUgbmFtZSB3YXMgZXhwbGljaXRseSBnaXZlbi4KLSAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVR4cmVmLWF1dG9tYXRpYy1zZWN0aW9uLXRpdGxlXGVuZGNzbmFtZVxyZWxheAotICAgICAgJSBVc2UgdGhlIG5vZGUgbmFtZSBpbnNpZGUgdGhlIHNxdWFyZSBicmFja2V0cy4KLSAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQotICAgIFxlbHNlCi0gICAgICAlIFVzZSB0aGUgYWN0dWFsIGNoYXB0ZXIvc2VjdGlvbiB0aXRsZSBhcHBlYXIgaW5zaWRlCi0gICAgICAlIHRoZSBzcXVhcmUgYnJhY2tldHMuICBVc2UgdGhlIHJlYWwgc2VjdGlvbiB0aXRsZSBpZiB3ZSBoYXZlIGl0LgotICAgICAgXGlmZGltIFx3ZDEgPiAwcHQKLSAgICAgICAgJSBJdCBpcyBpbiBhbm90aGVyIG1hbnVhbCwgc28gd2UgZG9uJ3QgaGF2ZSBpdC4KLSAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCi0gICAgICBcZWxzZQotICAgICAgICBcaWZoYXZleHJlZnMKLSAgICAgICAgICAlIFdlIGtub3cgdGhlIHJlYWwgdGl0bGUgaWYgd2UgaGF2ZSB0aGUgeHJlZiB2YWx1ZXMuCi0gICAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XHJlZnh7IzEtdGl0bGV9e319JQotICAgICAgICBcZWxzZQotICAgICAgICAgICUgT3RoZXJ3aXNlIGp1c3QgY29weSB0aGUgSW5mbyBub2RlIG5hbWUuCi0gICAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCi0gICAgICAgIFxmaSUKLSAgICAgIFxmaQotICAgIFxmaQotICBcZmkKLSAgJQotICAlIElmIHdlIHVzZSBcdW5oYm94MCBhbmQgXHVuaGJveDEgdG8gcHJpbnQgdGhlIG5vZGUgbmFtZXMsIFRlWCBkb2VzIG5vdAotICAlIGluc2VydCBlbXB0eSBkaXNjcmV0aW9uYXJpZXMgYWZ0ZXIgaHlwaGVucywgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsCi0gICUgbm90IGZpbmQgYSBsaW5lIGJyZWFrIGF0IGEgaHlwaGVuIGluIGEgbm9kZSBuYW1lcy4gIFNpbmNlIHNvbWUgbWFudWFscwotICAlIGFyZSBiZXN0IHdyaXR0ZW4gd2l0aCBmYWlybHkgbG9uZyBub2RlIG5hbWVzLCBjb250YWluaW5nIGh5cGhlbnMsIHRoaXMKLSAgJSBpcyBhIGxvc3MuICBUaGVyZWZvcmUsIHdlIGdpdmUgdGhlIHRleHQgb2YgdGhlIG5vZGUgbmFtZSBhZ2Fpbiwgc28gaXQKLSAgJSBpcyBhcyBpZiBUZVggaXMgc2VlaW5nIGl0IGZvciB0aGUgZmlyc3QgdGltZS4KLSAgXGlmZGltIFx3ZDEgPiAwcHQKLSAgICBccHV0d29yZHNlY3Rpb257fSBgYFxwcmludGVkbm9kZW5hbWUnJyBpbiBcY2l0ZXtccHJpbnRlZG1hbnVhbH0lCi0gIFxlbHNlCi0gICAgJSBfIChmb3IgZXhhbXBsZSkgaGFzIHRvIGJlIHRoZSBjaGFyYWN0ZXIgXyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZQotICAgICUgY29udHJvbCBzZXF1ZW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlLCBidXQgaXQgaGFzIHRvIGV4cGFuZAotICAgICUgaW50byB0aGUgdXN1YWwgXGxlYXZldm1vZGUuLi5cdnJ1bGUgc3R1ZmYgZm9yIHB1cnBvc2VzIG9mCi0gICAgJSBwcmludGluZy4gU28gd2UgXHR1cm5vZmZhY3RpdmUgZm9yIHRoZSBccmVmeC1zbnQsIGJhY2sgb24gZm9yIHRoZQotICAgICUgcHJpbnRpbmcsIGJhY2sgb2ZmIGZvciB0aGUgXHJlZngtcGcuCi0gICAge1xub3JtYWx0dXJub2ZmYWN0aXZlCi0gICAgICUgT25seSBvdXRwdXQgYSBmb2xsb3dpbmcgc3BhY2UgaWYgdGhlIC1zbnQgcmVmIGlzIG5vbmVtcHR5OyBmb3IKLSAgICAgJSBAdW5udW1iZXJlZCBhbmQgQGFuY2hvciwgaXQgd29uJ3QgYmUuCi0gICAgIFxzZXRib3gyID0gXGhib3h7XGlnbm9yZXNwYWNlcyBccmVmeHsjMS1zbnR9e319JQotICAgICBcaWZkaW0gXHdkMiA+IDBwdCBccmVmeHsjMS1zbnR9XHNwYWNlXGZpCi0gICAgfSUKLSAgICAlIFtteW5vZGVdLCAKLSAgICBbXHByaW50ZWRub2RlbmFtZV0sXHNwYWNlCi0gICAgJSBwYWdlIDMKLSAgICBcdHVybm9mZmFjdGl2ZSBccHV0d29yZHBhZ2VcdGllXHJlZnh7IzEtcGd9e30lCi0gIFxmaQotXGVuZGdyb3VwfQotCi0lIFxkb3NldHEgaXMgdGhlIGludGVyZmFjZSBmb3IgY2FsbHMgZnJvbSBvdGhlciBtYWNyb3MKLQotJSBVc2UgXG5vcm1hbHR1cm5vZmZhY3RpdmUgc28gdGhhdCBwdW5jdHVhdGlvbiBjaGFycyBzdWNoIGFzIHVuZGVyc2NvcmUKLSUgYW5kIGJhY2tzbGFzaCB3b3JrIGluIG5vZGUgbmFtZXMuICAoXHR1cm5vZmZhY3RpdmUgZG9lc24ndCBkbyBcLikKLVxkZWZcZG9zZXRxIzEjMnslCi0gIHtcbGV0XGZvbGlvPTAKLSAgIFxub3JtYWx0dXJub2ZmYWN0aXZlCi0gICBcZWRlZlxuZXh0e1x3cml0ZVxhdXhmaWxle1xpbnRlcm5hbHNldHF7IzF9eyMyfX19JQotICAgXGlmbGlua3MKLSAgICAgXG5leHQKLSAgIFxmaQotICB9JQotfQotCi0lIFxpbnRlcm5hbHNldHEge2Zvb317cGFnZX0gZXhwYW5kcyBpbnRvCi0lIENIQVJBQ1RFUlMgJ3hyZGVmIHtmb299ey4uLmV4cGFuc2lvbiBvZiBcWXBhZ2UuLi59Ci0lIFdoZW4gdGhlIGF1eCBmaWxlIGlzIHJlYWQsICcgaXMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIKLQotXGRlZlxpbnRlcm5hbHNldHEgIzEjMnsneHJkZWYgeyMxfXtcY3NuYW1lICMyXGVuZGNzbmFtZX19Ci0KLSUgVGhpbmdzIHRvIGJlIGV4cGFuZGVkIGJ5IFxpbnRlcm5hbHNldHEKLQotXGRlZlxZcGFnZW51bWJlcntcZm9saW99Ci0KLVxkZWZcWXRpdGxle1x0aGlzc2VjdGlvbn0KLQotXGRlZlxZbm90aGluZ3t9Ci0KLVxkZWZcWXNlY3Rpb25udW1iZXJhbmR0eXBleyUKLVxpZm51bVxzZWNubz0wIFxwdXR3b3JkQ2hhcHRlclx4cmVmdGllXHRoZVxjaGFwbm8gJQotXGVsc2UgXGlmbnVtIFxzdWJzZWNubz0wIFxwdXR3b3JkU2VjdGlvblx4cmVmdGllXHRoZVxjaGFwbm8uXHRoZVxzZWNubyAlCi1cZWxzZSBcaWZudW0gXHN1YnN1YnNlY25vPTAgJQotXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWVcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8gJQotXGVsc2UgJQotXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWVcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNubyAlCi1cZmkgXGZpIFxmaSB9Ci0KLVxkZWZcWWFwcGVuZGl4bGV0dGVyYW5kdHlwZXslCi1caWZudW1cc2Vjbm89MCBccHV0d29yZEFwcGVuZGl4XHhyZWZ0aWUnY2hhclx0aGVcYXBwZW5kaXhub3t9JQotXGVsc2UgXGlmbnVtIFxzdWJzZWNubz0wIFxwdXR3b3JkU2VjdGlvblx4cmVmdGllJ2NoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNubyAlCi1cZWxzZSBcaWZudW0gXHN1YnN1YnNlY25vPTAgJQotXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWUnY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8gJQotXGVsc2UgJQotXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWUnY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNubyAlCi1cZmkgXGZpIFxmaSB9Ci0KLVxnZGVmXHhyZWZ0aWV7J3RpZX0KLQotJSBVc2UgVGVYIDMuMCdzIFxpbnB1dGxpbmVubyB0byBnZXQgdGhlIGxpbmUgbnVtYmVyLCBmb3IgYmV0dGVyIGVycm9yCi0lIG1lc3NhZ2VzLCBidXQgaWYgd2UncmUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YgVGVYLCBkb24ndCBkbyBhbnl0aGluZy4KLSUKLVxpZnhcaW5wdXRsaW5lbm9cdGhpc2lzdW5kZWZpbmVkCi0gIFxsZXRcbGluZW51bWJlciA9IFxlbXB0eSAlIE5vbi0zLjAuCi1cZWxzZQotICBcZGVmXGxpbmVudW1iZXJ7XHRoZVxpbnB1dGxpbmVubzpcc3BhY2V9Ci1cZmkKLQotJSBEZWZpbmUgXHJlZnh7TkFNRX17U1VGRklYfSB0byByZWZlcmVuY2UgYSBjcm9zcy1yZWZlcmVuY2Ugc3RyaW5nIG5hbWVkIE5BTUUuCi0lIElmIGl0cyB2YWx1ZSBpcyBub25lbXB0eSwgU1VGRklYIGlzIG91dHB1dCBhZnRlcndhcmQuCi0KLVxkZWZccmVmeCMxIzJ7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBYIzFcZW5kY3NuYW1lXHJlbGF4Ci0gICAgJSBJZiBub3QgZGVmaW5lZCwgc2F5IHNvbWV0aGluZyBhdCBsZWFzdC4KLSAgICBcYW5nbGVsZWZ0IHVuXC1kZVwtZmluZWRcYW5nbGVyaWdodAotICAgIFxpZmxpbmtzCi0gICAgICBcaWZoYXZleHJlZnMKLSAgICAgICAgXG1lc3NhZ2V7XGxpbmVudW1iZXIgVW5kZWZpbmVkIGNyb3NzIHJlZmVyZW5jZSBgIzEnLn0lCi0gICAgICBcZWxzZQotICAgICAgICBcaWZ3YXJuZWR4cmVmc1xlbHNlCi0gICAgICAgICAgXGdsb2JhbFx3YXJuZWR4cmVmc3RydWUKLSAgICAgICAgICBcbWVzc2FnZXtDcm9zcyByZWZlcmVuY2UgdmFsdWVzIHVua25vd247IHlvdSBtdXN0IHJ1biBUZVggYWdhaW4ufSUKLSAgICAgICAgXGZpCi0gICAgICBcZmkKLSAgICBcZmkKLSAgXGVsc2UKLSAgICAlIEl0J3MgZGVmaW5lZCwgc28ganVzdCB1c2UgaXQuCi0gICAgXGNzbmFtZSBYIzFcZW5kY3NuYW1lCi0gIFxmaQotICAjMiUgT3V0cHV0IHRoZSBzdWZmaXggaW4gYW55IGNhc2UuCi19Ci0KLSUgVGhpcyBpcyB0aGUgbWFjcm8gaW52b2tlZCBieSBlbnRyaWVzIGluIHRoZSBhdXggZmlsZS4KLSUgCi1cZGVmXHhyZGVmIzF7XGJlZ2luZ3JvdXAKLSAgJSBSZWVuYWJsZSBcIGFzIGFuIGVzY2FwZSB3aGlsZSByZWFkaW5nIHRoZSBzZWNvbmQgYXJndW1lbnQuCi0gIFxjYXRjb2RlYFxcID0gMAotICBcYWZ0ZXJhc3NpZ25tZW50XGVuZGdyb3VwCi0gIFxleHBhbmRhZnRlclxnZGVmXGNzbmFtZSBYIzFcZW5kY3NuYW1lCi19Ci0KLSUgUmVhZCB0aGUgbGFzdCBleGlzdGluZyBhdXggZmlsZSwgaWYgYW55LiAgTm8gZXJyb3IgaWYgbm9uZSBleGlzdHMuCi1cZGVmXHJlYWRhdXhmaWxle1xiZWdpbmdyb3VwCi0gIFxjYXRjb2RlYFxeXkA9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkE9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkI9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkM9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkQ9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkU9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkY9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkc9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkg9XG90aGVyCi0gIFxjYXRjb2RlYFxeXks9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkw9XG90aGVyCi0gIFxjYXRjb2RlYFxeXk49XG90aGVyCi0gIFxjYXRjb2RlYFxeXlA9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlE9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlI9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlM9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlQ9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlU9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlY9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlc9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlg9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlo9XG90aGVyCi0gIFxjYXRjb2RlYFxeXls9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlw9XG90aGVyCi0gIFxjYXRjb2RlYFxeXl09XG90aGVyCi0gIFxjYXRjb2RlYFxeXl49XG90aGVyCi0gIFxjYXRjb2RlYFxeXl89XG90aGVyCi0gIFxjYXRjb2RlYFxAPVxvdGhlcgotICBcY2F0Y29kZWBcXj1cb3RoZXIKLSAgJSBJdCB3YXMgc3VnZ2VzdGVkIHRvIGRlZmluZSB0aGlzIGFzIDcsIHdoaWNoIHdvdWxkIGFsbG93IF5eZTQgZXRjLgotICAlIGluIHhyZWYgdGFncywgaS5lLiwgbm9kZSBuYW1lcy4gIEJ1dCBzaW5jZSBeXmU0IG5vdGF0aW9uIGlzbid0Ci0gICUgc3VwcG9ydGVkIGluIHRoZSBtYWluIHRleHQsIGl0IGRvZXNuJ3Qgc2VlbSBkZXNpcmFibGUuICBGdXJ0aGVybW9yZSwKLSAgJSB0aGF0IGlzIG5vdCBlbm91Z2g6IGZvciBub2RlIG5hbWVzIHRoYXQgYWN0dWFsbHkgY29udGFpbiBhIF4KLSAgJSBjaGFyYWN0ZXIsIHdlIHdvdWxkIGVuZCB1cCB3cml0aW5nIGEgbGluZSBsaWtlIHRoaXM6ICd4cmRlZiB7J2hhdAotICAlIGItdGl0bGV9eydoYXQgYn0gYW5kIFx4cmRlZiBkb2VzIGEgXGNzbmFtZS4uLlxlbmRjc25hbWUgb24gdGhlIGZpcnN0Ci0gICUgYXJndW1lbnQsIGFuZCBcaGF0IGlzIG5vdCBhbiBleHBhbmRhYmxlIGNvbnRyb2wgc2VxdWVuY2UuICBJdCBjb3VsZAotICAlIGFsbCBiZSB3b3JrZWQgb3V0LCBidXQgd2h5PyAgRWl0aGVyIHdlIHN1cHBvcnQgXl4gb3Igd2UgZG9uJ3QuCi0gICUKLSAgJSBUaGUgb3RoZXIgY2hhbmdlIG5lY2Vzc2FyeSBmb3IgdGhpcyB3YXMgdG8gZGVmaW5lIFxhdXhoYXQ6Ci0gICUgXGRlZlxhdXhoYXR7XGRlZl57J2hhdCB9fSUgZXh0cmEgc3BhY2Ugc28gb2sgaWYgZm9sbG93ZWQgYnkgbGV0dGVyCi0gICUgYW5kIHRoZW4gdG8gY2FsbCBcYXV4aGF0IGluIFxzZXRxLgotICAlCi0gIFxjYXRjb2RlYFx+PVxvdGhlcgotICBcY2F0Y29kZWBcWz1cb3RoZXIKLSAgXGNhdGNvZGVgXF09XG90aGVyCi0gIFxjYXRjb2RlYFwiPVxvdGhlcgotICBcY2F0Y29kZWBcXz1cb3RoZXIKLSAgXGNhdGNvZGVgXHw9XG90aGVyCi0gIFxjYXRjb2RlYFw8PVxvdGhlcgotICBcY2F0Y29kZWBcPj1cb3RoZXIKLSAgXGNhdGNvZGVgXCQ9XG90aGVyCi0gIFxjYXRjb2RlYFwjPVxvdGhlcgotICBcY2F0Y29kZWBcJj1cb3RoZXIKLSAgXGNhdGNvZGVgKz1cb3RoZXIgJSBhdm9pZCBcKyBmb3IgcGFyYW5vaWEgZXZlbiB0aG91Z2ggd2UndmUgdHVybmVkIGl0IG9mZgotICAlIE1ha2UgdGhlIGNoYXJhY3RlcnMgMTI4LTI1NSBiZSBwcmludGluZyBjaGFyYWN0ZXJzCi0gIHslCi0gICAgXGNvdW50IDE9MTI4Ci0gICAgXGRlZlxsb29weyUKLSAgICAgIFxjYXRjb2RlXGNvdW50IDE9XG90aGVyCi0gICAgICBcYWR2YW5jZVxjb3VudCAxIGJ5IDEKLSAgICAgIFxpZm51bSBcY291bnQgMTwyNTYgXGxvb3AgXGZpCi0gICAgfSUKLSAgfSUKLSAgJSBUaGUgYXV4IGZpbGUgdXNlcyAnIGFzIHRoZSBlc2NhcGUgKGZvciBub3cpLgotICAlIFR1cm4gb2ZmIFwgYXMgYW4gZXNjYXBlIHNvIHdlIGRvIG5vdCBsb3NlIG9uCi0gICUgZW50cmllcyB3aGljaCB3ZXJlIGR1bXBlZCB3aXRoIGNvbnRyb2wgc2VxdWVuY2VzIGluIHRoZWlyIG5hbWVzLgotICAlIEZvciBleGFtcGxlLCAneHJkZWYgeyRcbGVxICQtZnVufXtwYWdlIC4uLn0gbWFkZSBieSBAZGVmdW4gXl4KLSAgJSBSZWZlcmVuY2UgdG8gc3VjaCBlbnRyaWVzIHN0aWxsIGRvZXMgbm90IHdvcmsgdGhlIHdheSBvbmUgd291bGQgd2lzaCwKLSAgJSBidXQgYXQgbGVhc3QgdGhleSBkbyBub3QgYm9tYiBvdXQgd2hlbiB0aGUgYXV4IGZpbGUgaXMgcmVhZCBpbi4KLSAgXGNhdGNvZGVgXHs9MQotICBcY2F0Y29kZWBcfT0yCi0gIFxjYXRjb2RlYFwlPVxvdGhlcgotICBcY2F0Y29kZWBcJz0wCi0gIFxjYXRjb2RlYFxcPVxvdGhlcgotICAlCi0gIFxvcGVuaW4gMSBcam9ibmFtZS5hdXgKLSAgXGlmZW9mIDEgXGVsc2UKLSAgICBcY2xvc2VpbiAxCi0gICAgXGlucHV0IFxqb2JuYW1lLmF1eAotICAgIFxnbG9iYWxcaGF2ZXhyZWZzdHJ1ZQotICAgIFxnbG9iYWxcd2FybmVkb2JzdHJ1ZQotICBcZmkKLSAgJSBPcGVuIHRoZSBuZXcgYXV4IGZpbGUuICBUZVggd2lsbCBjbG9zZSBpdCBhdXRvbWF0aWNhbGx5IGF0IGV4aXQuCi0gIFxvcGVub3V0XGF1eGZpbGU9XGpvYm5hbWUuYXV4Ci1cZW5kZ3JvdXB9Ci0KLQotJSBGb290bm90ZXMuCi0KLVxuZXdjb3VudCBcZm9vdG5vdGVubwotCi0lIFRoZSB0cmFpbGluZyBzcGFjZSBpbiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb24gZm9yIHN1cGVyZWplY3QgaXMKLSUgdml0YWwgZm9yIHByb3BlciBmaWxsaW5nOyBwYWdlcyBjb21lIG91dCB1bmFsaWduZWQgd2hlbiB5b3UgZG8gYQotJSBwYWdlYWxpZ25tYWNybyBjYWxsIGlmIHRoYXQgc3BhY2UgYmVmb3JlIHRoZSBjbG9zaW5nIGJyYWNlIGlzCi0lIHJlbW92ZWQuIChHZW5lcmFsbHksIG51bWVyaWMgY29uc3RhbnRzIHNob3VsZCBhbHdheXMgYmUgZm9sbG93ZWQgYnkgYQotJSBzcGFjZSB0byBwcmV2ZW50IHN0cmFuZ2UgZXhwYW5zaW9uIGVycm9ycy4pCi1cZGVmXHN1cGVyZWplY3R7XHBhclxwZW5hbHR5IC0yMDAwMFxmb290bm90ZW5vID0wIH0KLQotJSBAZm9vdG5vdGVzdHlsZSBpcyBtZWFuaW5nZnVsIGZvciBpbmZvIG91dHB1dCBvbmx5LgotXGxldFxmb290bm90ZXN0eWxlPVxjb21tZW50Ci0KLVxsZXRccHRleGZvb3Rub3RlPVxmb290bm90ZQotCi17XGNhdGNvZGUgYFxAPTExCi0lCi0lIEF1dG8tbnVtYmVyIGZvb3Rub3Rlcy4gIE90aGVyd2lzZSBsaWtlIHBsYWluLgotXGdkZWZcZm9vdG5vdGV7JQotICBcZ2xvYmFsXGFkdmFuY2VcZm9vdG5vdGVubyBieSBcQG5lCi0gIFxlZGVmXHRoaXNmb290bm97JF57XHRoZVxmb290bm90ZW5vfSR9JQotICAlCi0gICUgSW4gY2FzZSB0aGUgZm9vdG5vdGUgY29tZXMgYXQgdGhlIGVuZCBvZiBhIHNlbnRlbmNlLCBwcmVzZXJ2ZSB0aGUKLSAgJSBleHRyYSBzcGFjaW5nIGFmdGVyIHdlIGRvIHRoZSBmb290bm90ZSBudW1iZXIuCi0gIFxsZXRcQHNmXGVtcHR5Ci0gIFxpZmhtb2RlXGVkZWZcQHNme1xzcGFjZWZhY3Rvclx0aGVcc3BhY2VmYWN0b3J9XC9cZmkKLSAgJQotICAlIFJlbW92ZSBpbmFkdmVydGVudCBibGFuayBzcGFjZSBiZWZvcmUgdHlwZXNldHRpbmcgdGhlIGZvb3Rub3RlIG51bWJlci4KLSAgXHVuc2tpcAotICBcdGhpc2Zvb3Rub1xAc2YKLSAgXGZvb3Rub3Rlenp6Ci19JQotCi0lIERvbid0IGJvdGhlciB3aXRoIHRoZSB0cmlja2VyeSBpbiBwbGFpbi50ZXggdG8gbm90IHJlcXVpcmUgdGhlCi0lIGZvb3Rub3RlIHRleHQgYXMgYSBwYXJhbWV0ZXIuICBPdXIgZm9vdG5vdGVzIGRvbid0IG5lZWQgdG8gYmUgc28gZ2VuZXJhbC4KLSUKLSUgT2ggeWVzLCB0aGV5IGRvOyBvdGhlcndpc2UsIEBpZnNldCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IHVzZXMKLSUgXHBhcnNlYXJnbGluZSBmYWlsIGluc2lkZSBmb290bm90ZXMgYmVjYXVzZSB0aGUgdG9rZW5zIGFyZSBmaXhlZCB3aGVuCi0lIHRoZSBmb290bm90ZSBpcyByZWFkLiAgLS1rYXJsLCAxNm5vdjk2LgotJQotXGxvbmdcZ2RlZlxmb290bm90ZXp6entcaW5zZXJ0XGZvb3RpbnNcYmdyb3VwCi0gICUgV2Ugd2FudCB0byB0eXBlc2V0IHRoaXMgdGV4dCBhcyBhIG5vcm1hbCBwYXJhZ3JhcGgsIGV2ZW4gaWYgdGhlCi0gICUgZm9vdG5vdGUgcmVmZXJlbmNlIG9jY3VycyBpbiAoZm9yIGV4YW1wbGUpIGEgZGlzcGxheSBlbnZpcm9ubWVudC4KLSAgJSBTbyByZXNldCBzb21lIHBhcmFtZXRlcnMuCi0gIFxpbnRlcmxpbmVwZW5hbHR5XGludGVyZm9vdG5vdGVsaW5lcGVuYWx0eQotICBcc3BsaXR0b3Bza2lwXGh0XHN0cnV0Ym94ICUgdG9wIGJhc2VsaW5lIGZvciBicm9rZW4gZm9vdG5vdGVzCi0gIFxzcGxpdG1heGRlcHRoXGRwXHN0cnV0Ym94Ci0gIFxmbG9hdGluZ3BlbmFsdHlcQE1NCi0gIFxsZWZ0c2tpcFx6QHNraXAKLSAgXHJpZ2h0c2tpcFx6QHNraXAKLSAgXHNwYWNlc2tpcFx6QHNraXAKLSAgXHhzcGFjZXNraXBcekBza2lwCi0gIFxwYXJpbmRlbnRcZGVmYXVsdHBhcmluZGVudAotICAlCi0gICUgSGFuZyB0aGUgZm9vdG5vdGUgdGV4dCBvZmYgdGhlIG51bWJlci4KLSAgXGhhbmcKLSAgXHRleHRpbmRlbnR7XHRoaXNmb290bm99JQotICAlCi0gICUgRG9uJ3QgY3Jhc2ggaW50byB0aGUgbGluZSBhYm92ZSB0aGUgZm9vdG5vdGUgdGV4dC4gIFNpbmNlIHRoaXMKLSAgJSBleHBhbmRzIGludG8gYSBib3gsIGl0IG11c3QgY29tZSB3aXRoaW4gdGhlIHBhcmFncmFwaCwgbGVzdCBpdAotICAlIHByb3ZpZGUgYSBwbGFjZSB3aGVyZSBUZVggY2FuIHNwbGl0IHRoZSBmb290bm90ZS4KLSAgXGZvb3RzdHJ1dAotICBcZnV0dXJlbGV0XG5leHRcZm9AdAotfQotXGRlZlxmb0B0e1xpZmNhdFxiZ3JvdXBcbm9leHBhbmRcbmV4dCBcbGV0XG5leHRcZkBAdAotICBcZWxzZVxsZXRcbmV4dFxmQHRcZmkgXG5leHR9Ci1cZGVmXGZAQHR7XGJncm91cFxhZnRlcmdyb3VwXEBmb290XGxldFxuZXh0fQotXGRlZlxmQHQjMXsjMVxAZm9vdH0KLVxkZWZcQGZvb3R7XHN0cnV0XGVncm91cH0KLQotfSVlbmQgXGNhdGNvZGUgYFxAPTExCi0KLSUgU2V0IHRoZSBiYXNlbGluZXNraXAgdG8gIzEsIGFuZCB0aGUgbGluZXNraXAgYW5kIHN0cnV0IHNpemUKLSUgY29ycmVzcG9uZGluZ2x5LiAgVGhlcmUgaXMgbm8gZGVlcCBtZWFuaW5nIGJlaGluZCB0aGVzZSBtYWdpYyBudW1iZXJzCi0lIHVzZWQgYXMgZmFjdG9yczsgdGhleSBqdXN0IG1hdGNoIChjbG9zZWx5IGVub3VnaCkgd2hhdCBLbnV0aCBkZWZpbmVkLgotJQotXGRlZlxsaW5lc2tpcGZhY3RvcnsuMDgzMzN9Ci1cZGVmXHN0cnV0aGVpZ2h0cGVyY2VudHsuNzA4MzN9Ci1cZGVmXHN0cnV0ZGVwdGhwZXJjZW50IHsuMjkxNjd9Ci0lCi1cZGVmXHNldGxlYWRpbmcjMXslCi0gIFxub3JtYWxiYXNlbGluZXNraXAgPSAjMVxyZWxheAotICBcbm9ybWFsbGluZXNraXAgPSBcbGluZXNraXBmYWN0b3Jcbm9ybWFsYmFzZWxpbmVza2lwCi0gIFxub3JtYWxiYXNlbGluZXMKLSAgXHNldGJveFxzdHJ1dGJveCA9XGhib3h7JQotICAgIFx2cnVsZSB3aWR0aDBwdCBoZWlnaHRcc3RydXRoZWlnaHRwZXJjZW50XGJhc2VsaW5lc2tpcAotICAgICAgICAgICAgICAgICAgICBkZXB0aCBcc3RydXRkZXB0aHBlcmNlbnQgXGJhc2VsaW5lc2tpcAotICB9JQotfQotCi0lIEB8IGluc2VydHMgYSBjaGFuZ2ViYXIgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgbGluZS4gIEl0IHNob3VsZAotJSBzdXJyb3VuZCBhbnkgY2hhbmdlZCB0ZXh0LiAgVGhpcyBhcHByb2FjaCBkb2VzICpub3QqIHdvcmsgaWYgdGhlCi0lIGNoYW5nZSBzcGFucyBtb3JlIHRoYW4gdHdvIGxpbmVzIG9mIG91dHB1dC4gIFRvIGhhbmRsZSB0aGF0LCB3ZSB3b3VsZAotJSBoYXZlIGFkb3B0IGEgbXVjaCBtb3JlIGRpZmZpY3VsdCBhcHByb2FjaCAocHV0dGluZyBtYXJrcyBpbnRvIHRoZSBtYWluCi0lIHZlcnRpY2FsIGxpc3QgZm9yIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBlYWNoIGNoYW5nZSkuCi0lCi1cZGVmXHx7JQotICAlIFx2YWRqdXN0IGNhbiBvbmx5IGJlIHVzZWQgaW4gaG9yaXpvbnRhbCBtb2RlLgotICBcbGVhdmV2bW9kZQotICAlCi0gICUgQXBwZW5kIHRoaXMgdmVydGljYWwgbW9kZSBtYXRlcmlhbCBhZnRlciB0aGUgY3VycmVudCBsaW5lIGluIHRoZSBvdXRwdXQuCi0gIFx2YWRqdXN0eyUKLSAgICAlIFdlIHdhbnQgdG8gaW5zZXJ0IGEgcnVsZSB3aXRoIHRoZSBoZWlnaHQgYW5kIGRlcHRoIG9mIHRoZSBjdXJyZW50Ci0gICAgJSBsZWFkaW5nOyB0aGF0IGlzIGV4YWN0bHkgd2hhdCBcc3RydXRib3ggaXMgc3VwcG9zZWQgdG8gcmVjb3JkLgotICAgIFx2c2tpcC1cYmFzZWxpbmVza2lwCi0gICAgJQotICAgICUgXHZhZGp1c3QtaXRlbXMgYXJlIGluc2VydGVkIGF0IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHR5cGUuICBTbwotICAgICUgdGhlIFxsbGFwIGhlcmUgbW92ZXMgb3V0IGludG8gdGhlIGxlZnQtaGFuZCBtYXJnaW4uCi0gICAgXGxsYXB7JQotICAgICAgJQotICAgICAgJSBGb3IgYSB0aGlja2VyIG9yIHRoaW5uZXIgYmFyLCBjaGFuZ2UgdGhlIGAxcHQnLgotICAgICAgXHZydWxlIGhlaWdodFxiYXNlbGluZXNraXAgd2lkdGgxcHQKLSAgICAgICUKLSAgICAgICUgVGhpcyBpcyB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgYmFyIGFuZCB0aGUgdGV4dC4KLSAgICAgIFxoc2tpcCAxMnB0Ci0gICAgfSUKLSAgfSUKLX0KLQotJSBGb3IgYSBmaW5hbCBjb3B5LCB0YWtlIG91dCB0aGUgcmVjdGFuZ2xlcwotJSB0aGF0IG1hcmsgb3ZlcmZ1bGwgYm94ZXMgKGluIGNhc2UgeW91IGhhdmUgZGVjaWRlZAotJSB0aGF0IHRoZSB0ZXh0IGxvb2tzIG9rIGV2ZW4gdGhvdWdoIGl0IHBhc3NlcyB0aGUgbWFyZ2luKS4KLSUKLVxkZWZcZmluYWxvdXR7XG92ZXJmdWxscnVsZT0wcHR9Ci0KLSUgQGltYWdlLiAgV2UgdXNlIHRoZSBtYWNyb3MgZnJvbSBlcHNmLnRleCB0byBzdXBwb3J0IHRoaXMuCi0lIElmIGVwc2YudGV4IGlzIG5vdCBpbnN0YWxsZWQgYW5kIEBpbWFnZSBpcyB1c2VkLCB3ZSBjb21wbGFpbi4KLSUgCi0lIENoZWNrIGZvciBhbmQgcmVhZCBlcHNmLnRleCB1cCBmcm9udC4gIElmIHdlIHJlYWQgaXQgb25seSBhdCBAaW1hZ2UKLSUgdGltZSwgd2UgbWlnaHQgYmUgaW5zaWRlIGEgZ3JvdXAsIGFuZCB0aGVuIGl0cyBkZWZpbml0aW9ucyB3b3VsZCBnZXQKLSUgdW5kb25lIGFuZCB0aGUgbmV4dCBpbWFnZSB3b3VsZCBmYWlsLgotXG9wZW5pbiAxID0gZXBzZi50ZXgKLVxpZmVvZiAxIFxlbHNlCi0gIFxjbG9zZWluIDEKLSAgJSBEbyBub3QgYm90aGVyIHNob3dpbmcgYmFubmVyIHdpdGggcG9zdC12Mi43IGVwc2YudGV4IChhdmFpbGFibGUgaW4KLSAgJSBkb2MvZXBzZi50ZXggdW50aWwgaXQgc2hvd3MgdXAgb24gY3RhbikuCi0gIFxkZWZcZXBzZmFubm91bmNle1x0b2tzMCA9IH0lCi0gIFxpbnB1dCBlcHNmLnRleAotXGZpCi0lCi1cbmV3aWZcaWZ3YXJuZWRub2Vwc2YKLVxuZXdoZWxwXG5vZXBzZmhlbHB7ZXBzZi50ZXggbXVzdCBiZSBpbnN0YWxsZWQgZm9yIGltYWdlcyB0bwotICB3b3JrLiAgSXQgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgVGV4aW5mbyBkaXN0cmlidXRpb24sIG9yIHlvdSBjYW4gZ2V0Ci0gIGl0IGZyb20gZnRwOi8vZnRwLnR1Zy5vcmcvdGV4L2Vwc2YudGV4Ln0KLSUKLSUgT25seSBjb21wbGFpbiBvbmNlIGFib3V0IGxhY2sgb2YgZXBzZi50ZXguCi1cZGVmXGltYWdlIzF7JQotICBcaWZ4XGVwc2Zib3hcdW5kZWZpbmVkCi0gICAgXGlmd2FybmVkbm9lcHNmIFxlbHNlCi0gICAgICBcZXJyaGVscCA9IFxub2Vwc2ZoZWxwCi0gICAgICBcZXJybWVzc2FnZXtlcHNmLnRleCBub3QgZm91bmQsIGltYWdlcyB3aWxsIGJlIGlnbm9yZWR9JQotICAgICAgXGdsb2JhbFx3YXJuZWRub2Vwc2Z0cnVlCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgXGltYWdleHh4ICMxLCwsXGZpbmlzaAotICBcZmkKLX0KLSUKLSUgQXJndW1lbnRzIHRvIEBpbWFnZToKLSUgIzEgaXMgKG1hbmRhdG9yeSkgaW1hZ2UgZmlsZW5hbWU7IHdlIHRhY2sgb24gLmVwcyBleHRlbnNpb24uCi0lICMyIGlzIChvcHRpb25hbCkgd2lkdGgsICMzIGlzIChvcHRpb25hbCkgaGVpZ2h0LgotJSAjNCBpcyBqdXN0IHRoZSB1c3VhbCBleHRyYSBpZ25vcmVkIGFyZyBmb3IgcGFyc2luZyB0aGlzIHN0dWZmLgotXGRlZlxpbWFnZXh4eCMxLCMyLCMzLCM0XGZpbmlzaHslCi0gICUgXGVwc2Zib3ggaXRzZWxmIHJlc2V0cyBcZXBzZj9zaXplIGF0IGVhY2ggZmlndXJlLgotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9XGlmZGltXHdkMCA+IDBwdCBcZXBzZnhzaXplPSMyXHJlbGF4IFxmaQotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzN9XGlmZGltXHdkMCA+IDBwdCBcZXBzZnlzaXplPSMzXHJlbGF4IFxmaQotICAlIElmIHRoZSBpbWFnZSBpcyBieSBpdHNlbGYsIGNlbnRlciBpdC4KLSAgXGlmdm1vZGUKLSAgICBcbm9icmVha1xtZWRza2lwCi0gICAgXG5vYnJlYWsKLSAgICBcY2VudGVybGluZXtcZXBzZmJveHsjMS5lcHN9fSUKLSAgICBcYmlnYnJlYWsKLSAgXGVsc2UKLSAgICBcZXBzZmJveHsjMS5lcHN9JQotICBcZmkKLX0KLQotCi1cbWVzc2FnZXtwYXBlciBzaXplcyx9Ci0lIEFuZCBvdGhlciByZWxhdGVkIHBhcmFtZXRlcnMuCi0KLVxuZXdkaW1lblxkZWZhdWx0cGFyaW5kZW50IFxkZWZhdWx0cGFyaW5kZW50ID0gMTVwdAotCi1cY2hhcGhlYWRpbmdza2lwID0gMTVwdCBwbHVzIDRwdCBtaW51cyAycHQKLVxzZWNoZWFkaW5nc2tpcCA9IDEycHQgcGx1cyAzcHQgbWludXMgMnB0Ci1cc3Vic2VjaGVhZGluZ3NraXAgPSA5cHQgcGx1cyAycHQgbWludXMgMnB0Ci0KLSUgUHJldmVudCB1bmRlcmZ1bGwgdmJveCBlcnJvciBtZXNzYWdlcy4KLVx2YmFkbmVzcyA9IDEwMDAwCi0KLSUgRG9uJ3QgYmUgc28gZmluaWNreSBhYm91dCB1bmRlcmZ1bGwgaGJveGVzLCBlaXRoZXIuCi1caGJhZG5lc3MgPSAyMDAwCi0KLSUgRm9sbG93aW5nIEdlb3JnZSBCdXNoLCBqdXN0IGdldCByaWQgb2Ygd2lkb3dzIGFuZCBvcnBoYW5zLgotXHdpZG93cGVuYWx0eT0xMDAwMAotXGNsdWJwZW5hbHR5PTEwMDAwCi0KLSUgVXNlIFRlWCAzLjAncyBcZW1lcmdlbmN5c3RyZXRjaCB0byBoZWxwIGxpbmUgYnJlYWtpbmcsIGJ1dCBpZiB3ZSdyZQotJSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBUZVgsIGRvbid0IGRvIGFueXRoaW5nLiAgV2Ugd2FudCB0aGUgYW1vdW50IG9mCi0lIHN0cmV0Y2ggYWRkZWQgdG8gZGVwZW5kIG9uIHRoZSBsaW5lIGxlbmd0aCwgaGVuY2UgdGhlIGRlcGVuZGVuY2Ugb24KLSUgXGhzaXplLiAgVGhpcyBtYWtlcyBpdCBjb21lIHRvIGFib3V0IDlwdCBmb3IgdGhlIDguNXgxMSBmb3JtYXQuICBXZQotJSBjYWxsIHRoaXMgd2hlbmV2ZXIgdGhlIHBhcGVyIHNpemUgaXMgc2V0LgotJQotXGRlZlxzZXRlbWVyZ2VuY3lzdHJldGNoeyUKLSAgXGlmeFxlbWVyZ2VuY3lzdHJldGNoXHRoaXNpc3VuZGVmaW5lZAotICAgICUgQWxsb3cgdXMgdG8gYXNzaWduIHRvIFxlbWVyZ2VuY3lzdHJldGNoIGFueXdheS4KLSAgICBcZGVmXGVtZXJnZW5jeXN0cmV0Y2h7XGRpbWVuMH0lCi0gIFxlbHNlCi0gICAgXGVtZXJnZW5jeXN0cmV0Y2ggPSBcaHNpemUKLSAgICBcZGl2aWRlXGVtZXJnZW5jeXN0cmV0Y2ggYnkgNDUKLSAgXGZpCi19Ci0KLSUgUGFyYW1ldGVycyBpbiBvcmRlcjogMSkgdGV4dGhlaWdodDsgMikgdGV4dHdpZHRoOyAzKSB2b2Zmc2V0OwotJSA0KSBob2Zmc2V0OyA1KSBiaW5kaW5nIG9mZnNldDsgNikgdG9wc2tpcC4gIFRoZW4gd2hvZXZlciBjYWxscyB1cyBjYW4KLSUgc2V0IFxwYXJza2lwIGFuZCBjYWxsIFxzZXRsZWFkaW5nIGZvciBcYmFzZWxpbmVza2lwLgotJQotXGRlZlxpbnRlcm5hbHBhZ2VzaXplcyMxIzIjMyM0IzUjNnslCi0gIFx2b2Zmc2V0ID0gIzNccmVsYXgKLSAgXHRvcHNraXAgPSAjNlxyZWxheAotICBcc3BsaXR0b3Bza2lwID0gXHRvcHNraXAKLSAgJQotICBcdnNpemUgPSAjMVxyZWxheAotICBcYWR2YW5jZVx2c2l6ZSBieSBcdG9wc2tpcAotICBcb3V0ZXJ2c2l6ZSA9IFx2c2l6ZQotICBcYWR2YW5jZVxvdXRlcnZzaXplIGJ5IDAuNmluCi0gIFxwYWdlaGVpZ2h0ID0gXHZzaXplCi0gICUKLSAgXGhzaXplID0gIzJccmVsYXgKLSAgXG91dGVyaHNpemUgPSBcaHNpemUKLSAgXGFkdmFuY2Vcb3V0ZXJoc2l6ZSBieSAwLjVpbgotICBccGFnZXdpZHRoID0gXGhzaXplCi0gICUKLSAgXG5vcm1hbG9mZnNldCA9ICM0XHJlbGF4Ci0gIFxiaW5kaW5nb2Zmc2V0ID0gIzVccmVsYXgKLSAgJQotICBccGFyaW5kZW50ID0gXGRlZmF1bHRwYXJpbmRlbnQKLSAgXHNldGVtZXJnZW5jeXN0cmV0Y2gKLX0KLQotJSBAbGV0dGVycGFwZXIgKHRoZSBkZWZhdWx0KS4KLVxkZWZcbGV0dGVycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQotICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKLSAgXHNldGxlYWRpbmd7MTMuMnB0fSUKLSAgJQotICAlIElmIHBhZ2UgaXMgbm90aGluZyBidXQgdGV4dCwgbWFrZSBpdCBjb21lIG91dCBldmVuLgotICBcaW50ZXJuYWxwYWdlc2l6ZXN7NDZcYmFzZWxpbmVza2lwfXs2aW59e1x2b2Zmc2V0fXsuMjVpbn17XGJpbmRpbmdvZmZzZXR9ezM2cHR9JQotfX0KLQotJSBVc2UgQHNtYWxsYm9vayB0byByZXNldCBwYXJhbWV0ZXJzIGZvciA3eDkuNSAob3Igc28pIGZvcm1hdC4KLVxkZWZcc21hbGxib29re3tcZ2xvYmFsZGVmcyA9IDEKLSAgXHBhcnNraXAgPSAycHQgcGx1cyAxcHQKLSAgXHNldGxlYWRpbmd7MTJwdH0lCi0gICUKLSAgXGludGVybmFscGFnZXNpemVzezcuNWlufXs1LmlufXtcdm9mZnNldH17LjI1aW59e1xiaW5kaW5nb2Zmc2V0fXsxNnB0fSUKLSAgJQotICBcbGlzcG5hcnJvd2luZyA9IDAuM2luCi0gIFx0b2xlcmFuY2UgPSA3MDAKLSAgXGhmdXp6ID0gMXB0Ci0gIFxjb250ZW50c3JpZ2h0bWFyZ2luID0gMHB0Ci0gIFxkZWZ0eXBlbWFyZ2luID0gMHB0Ci0gIFxkZWZib2R5aW5kZW50ID0gLjVjbQotICAlCi0gIFxsZXRcc21hbGxkaXNwbGF5ID0gXHNtYWxsZGlzcGxheXgKLSAgXGxldFxzbWFsbGV4YW1wbGUgPSBcc21hbGxsaXNweAotICBcbGV0XHNtYWxsZm9ybWF0ID0gXHNtYWxsZm9ybWF0eAotICBcbGV0XHNtYWxsbGlzcCA9IFxzbWFsbGxpc3B4Ci19fQotCi0lIFVzZSBAYWZvdXJwYXBlciB0byBwcmludCBvbiBFdXJvcGVhbiBBNCBwYXBlci4KLVxkZWZcYWZvdXJwYXBlcnt7XGdsb2JhbGRlZnMgPSAxCi0gIFxzZXRsZWFkaW5nezEycHR9JQotICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKLSAgJQotICBcaW50ZXJuYWxwYWdlc2l6ZXN7NTNcYmFzZWxpbmVza2lwfXsxNjBtbX17XHZvZmZzZXR9ezRtbX17XGJpbmRpbmdvZmZzZXR9ezQ0cHR9JQotICAlCi0gIFx0b2xlcmFuY2UgPSA3MDAKLSAgXGhmdXp6ID0gMXB0Ci19fQotCi0lIEEgc3BlY2lmaWMgdGV4dCBsYXlvdXQsIDI0eDE1Y20gb3ZlcmFsbCwgaW50ZW5kZWQgZm9yIEE0IHBhcGVyLiAgVG9wIG1hcmdpbgotJSAyOW1tLCBoZW5jZSBib3R0b20gbWFyZ2luIDI4bW0sIG5vbWluYWwgc2lkZSBtYXJnaW4gM2NtLgotXGRlZlxhZm91cmxhdGV4e3tcZ2xvYmFsZGVmcyA9IDEKLSAgXHNldGxlYWRpbmd7MTMuNnB0fSUKLSAgJQotICBcYWZvdXJwYXBlcgotICBcaW50ZXJuYWxwYWdlc2l6ZXN7MjM3bW19ezE1MG1tfXszLjZtbX17My42bW19ezNtbX17N21tfSUKLSAgJQotICBcZ2xvYmFsZGVmcyA9IDAKLX19Ci0KLSUgVXNlIEBhZm91cndpZGUgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTQgcGFwZXIgaW4gd2lkZSBmb3JtYXQuCi1cZGVmXGFmb3Vyd2lkZXslCi0gIFxhZm91cnBhcGVyCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3s5LjVpbn17Ni41aW59e1xob2Zmc2V0fXtcbm9ybWFsb2Zmc2V0fXtcYmluZGluZ29mZnNldH17N21tfSUKLSAgJQotICBcZ2xvYmFsZGVmcyA9IDAKLX0KLQotJSBAcGFnZXNpemVzIFRFWFRIRUlHSFRbLFRFWFRXSURUSF0KLSUgUGVyaGFwcyB3ZSBzaG91bGQgYWxsb3cgc2V0dGluZyB0aGUgbWFyZ2lucywgXHRvcHNraXAsIFxwYXJza2lwLAotJSBhbmQvb3IgbGVhZGluZywgYWxzby4gT3IgcGVyaGFwcyB3ZSBzaG91bGQgY29tcHV0ZSB0aGVtIHNvbWVob3cuCi0lIAotXGRlZlxwYWdlc2l6ZXN7XHBhcnNlYXJnXHBhZ2VzaXplc3h4eH0KLVxkZWZccGFnZXNpemVzeHh4IzF7XHBhZ2VzaXplc3l5eSAjMSwsXGZpbmlzaH0KLVxkZWZccGFnZXNpemVzeXl5IzEsIzIsIzNcZmluaXNoe3slCi0gIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn1caWZkaW1cd2QwID4gMHB0IFxoc2l6ZT0jMlxyZWxheCBcZmkKLSAgXGdsb2JhbGRlZnMgPSAxCi0gICUKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEzLjJwdH0lCi0gICUKLSAgXGludGVybmFscGFnZXNpemVzeyMxfXtcaHNpemV9e1x2b2Zmc2V0fXtcbm9ybWFsb2Zmc2V0fXtcYmluZGluZ29mZnNldH17NDRwdH0lCi19fQotCi0lIFNldCBkZWZhdWx0IHRvIGxldHRlci4KLSUgCi1cbGV0dGVycGFwZXIKLQotXG1lc3NhZ2V7YW5kIHR1cm5pbmcgb24gdGV4aW5mbyBpbnB1dCBmb3JtYXQufQotCi0lIERlZmluZSBtYWNyb3MgdG8gb3V0cHV0IHZhcmlvdXMgY2hhcmFjdGVycyB3aXRoIGNhdGNvZGUgZm9yIG5vcm1hbCB0ZXh0LgotXGNhdGNvZGVgXCI9XG90aGVyCi1cY2F0Y29kZWBcfj1cb3RoZXIKLVxjYXRjb2RlYFxePVxvdGhlcgotXGNhdGNvZGVgXF89XG90aGVyCi1cY2F0Y29kZWBcfD1cb3RoZXIKLVxjYXRjb2RlYFw8PVxvdGhlcgotXGNhdGNvZGVgXD49XG90aGVyCi1cY2F0Y29kZWBcKz1cb3RoZXIKLVxkZWZcbm9ybWFsZG91YmxlcXVvdGV7In0KLVxkZWZcbm9ybWFsdGlsZGV7fn0KLVxkZWZcbm9ybWFsY2FyZXR7Xn0KLVxkZWZcbm9ybWFsdW5kZXJzY29yZXtffQotXGRlZlxub3JtYWx2ZXJ0aWNhbGJhcnt8fQotXGRlZlxub3JtYWxsZXNzezx9Ci1cZGVmXG5vcm1hbGdyZWF0ZXJ7Pn0KLVxkZWZcbm9ybWFscGx1c3srfQotCi0lIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBtYWtlIGEgY2hhcmFjdGVyIHByaW50IG9uZSB3YXkgaW4gdHRmb250Ci0lIHdoZXJlIGl0IGNhbiBwcm9iYWJseSBqdXN0IGJlIG91dHB1dCwgYW5kIGFub3RoZXIgd2F5IGluIG90aGVyIGZvbnRzLAotJSB3aGVyZSBzb21ldGhpbmcgaGFpcmllciBwcm9iYWJseSBuZWVkcyB0byBiZSBkb25lLgotJQotJSAjMSBpcyB3aGF0IHRvIHByaW50IGlmIHdlIGFyZSBpbmRlZWQgdXNpbmcgXHR0OyAjMiBpcyB3aGF0IHRvIHByaW50Ci0lIG90aGVyd2lzZS4gIFNpbmNlIGFsbCB0aGUgQ29tcHV0ZXIgTW9kZXJuIHR5cGV3cml0ZXIgZm9udHMgaGF2ZSB6ZXJvCi0lIGludGVyd29yZCBzdHJldGNoIChhbmQgc2hyaW5rKSwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0IGFsbAotJSB0eXBld3JpdGVyIGZvbnRzIHRvIGhhdmUgdGhpcywgd2UgY2FuIGNoZWNrIHRoYXQgZm9udCBwYXJhbWV0ZXIuCi0lCi1cZGVmXGlmdXNpbmd0dCMxIzJ7XGlmZGltIFxmb250ZGltZW4zXHRoZVxmb250PTBwdCAjMVxlbHNlICMyXGZpfQotCi0lIFR1cm4gb2ZmIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMgZXhjZXB0IEAKLSUgKGFuZCB0aG9zZSB3aGljaCB0aGUgdXNlciBjYW4gdXNlIGFzIGlmIHRoZXkgd2VyZSBvcmRpbmFyeSkuCi0lIE1vc3Qgb2YgdGhlc2Ugd2Ugc2ltcGx5IHByaW50IGZyb20gdGhlIFx0dCBmb250LCBidXQgZm9yIHNvbWUsIHdlIGNhbgotJSB1c2UgbWF0aCBvciBvdGhlciB2YXJpYW50cyB0aGF0IGxvb2sgYmV0dGVyIGluIG5vcm1hbCB0ZXh0LgotCi1cY2F0Y29kZWBcIj1cYWN0aXZlCi1cZGVmXGFjdGl2ZWRvdWJsZXF1b3Rle3tcdHRcY2hhcjM0fX0KLVxsZXQiPVxhY3RpdmVkb3VibGVxdW90ZQotXGNhdGNvZGVgXH49XGFjdGl2ZQotXGRlZn57e1x0dFxjaGFyMTI2fX0KLVxjaGFyZGVmXGhhdD1gXF4KLVxjYXRjb2RlYFxePVxhY3RpdmUKLVxkZWZee3tcdHQgXGhhdH19Ci0KLVxjYXRjb2RlYFxfPVxhY3RpdmUKLVxkZWZfe1xpZnVzaW5ndHRcbm9ybWFsdW5kZXJzY29yZVxffQotJSBTdWJyb3V0aW5lIGZvciB0aGUgcHJldmlvdXMgbWFjcm8uCi1cZGVmXF97XGxlYXZldm1vZGUgXGtlcm4uMDZlbSBcdmJveHtcaHJ1bGUgd2lkdGguM2VtIGhlaWdodC4xZXh9fQotCi1cY2F0Y29kZWBcfD1cYWN0aXZlCi1cZGVmfHt7XHR0XGNoYXIxMjR9fQotXGNoYXJkZWYgXGxlc3M9YFw8Ci1cY2F0Y29kZWBcPD1cYWN0aXZlCi1cZGVmPHt7XHR0IFxsZXNzfX0KLVxjaGFyZGVmIFxndHI9YFw+Ci1cY2F0Y29kZWBcPj1cYWN0aXZlCi1cZGVmPnt7XHR0IFxndHJ9fQotXGNhdGNvZGVgXCs9XGFjdGl2ZQotXGRlZit7e1x0dCBcY2hhciA0M319Ci0lXGNhdGNvZGUgMjc9XGFjdGl2ZQotJVxkZWZeXlt7JFxkaWFtb25kc3VpdCR9Ci0KLSUgU2V0IHVwIGFuIGFjdGl2ZSBkZWZpbml0aW9uIGZvciA9LCBidXQgZG9uJ3QgZW5hYmxlIGl0IG1vc3Qgb2YgdGhlIHRpbWUuCi17XGNhdGNvZGVgXD09XGFjdGl2ZQotXGdsb2JhbFxkZWY9e3tcdHQgXGNoYXIgNjF9fX0KLQotXGNhdGNvZGVgKz1cYWN0aXZlCi1cY2F0Y29kZWBcXz1cYWN0aXZlCi0KLSUgSWYgYSAuZm10IGZpbGUgaXMgYmVpbmcgdXNlZCwgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGFwcGVhciBpbiBhIGZpbGUKLSUgbmFtZSBjYW5ub3QgYmUgYWN0aXZlIHVudGlsIHdlIGhhdmUgcGFyc2VkIHRoZSBjb21tYW5kIGxpbmUuCi0lIFNvIHR1cm4gdGhlbSBvZmYgYWdhaW4sIGFuZCBoYXZlIFxldmVyeWpvYiAob3IgQHNldGZpbGVuYW1lKSB0dXJuIHRoZW0gb24uCi0lIFxvdGhlcmlmeWFjdGl2ZSBpcyBjYWxsZWQgbmVhciB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KLVxkZWZcb3RoZXJpZnlhY3RpdmV7XGNhdGNvZGVgKz1cb3RoZXIgXGNhdGNvZGVgXF89XG90aGVyfQotCi1cY2F0Y29kZWBcQD0wCi0KLSUgXHJhd2JhY2tzbGFzaHh4IG91dHB1dCBvbmUgYmFja3NsYXNoIGNoYXJhY3RlciBpbiBjdXJyZW50IGZvbnQKLVxnbG9iYWxcY2hhcmRlZlxyYXdiYWNrc2xhc2h4eD1gXFwKLSV7XGNhdGNvZGVgXFw9XG90aGVyCi0lQGdkZWZAcmF3YmFja3NsYXNoeHh7XH19Ci0KLSUgXHJhd2JhY2tzbGFzaCByZWRlZmluZXMgXCBhcyBpbnB1dCB0byBkbyBccmF3YmFja3NsYXNoeHguCi17XGNhdGNvZGVgXFw9XGFjdGl2ZQotQGdkZWZAcmF3YmFja3NsYXNoe0BsZXRcPUByYXdiYWNrc2xhc2h4eCB9fQotCi0lIFxub3JtYWxiYWNrc2xhc2ggb3V0cHV0cyBvbmUgYmFja3NsYXNoIGluIGZpeGVkIHdpZHRoIGZvbnQuCi1cZGVmXG5vcm1hbGJhY2tzbGFzaHt7XHR0XHJhd2JhY2tzbGFzaHh4fX0KLQotJSBTYXkgQGZvbywgbm90IFxmb28sIGluIGVycm9yIG1lc3NhZ2VzLgotXGVzY2FwZWNoYXI9YFxACi0KLSUgXGNhdGNvZGUgMTc9MCAgICUgRGVmaW5lIGNvbnRyb2wtcQotXGNhdGNvZGVgXFw9XGFjdGl2ZQotCi0lIFVzZWQgc29tZXRpbWVzIHRvIHR1cm4gb2ZmIChlZmZlY3RpdmVseSkgdGhlIGFjdGl2ZSBjaGFyYWN0ZXJzCi0lIGV2ZW4gYWZ0ZXIgcGFyc2luZyB0aGVtLgotQGRlZkB0dXJub2ZmYWN0aXZle0BsZXQiPUBub3JtYWxkb3VibGVxdW90ZQotQGxldFw9QHJlYWxiYWNrc2xhc2gKLUBsZXR+PUBub3JtYWx0aWxkZQotQGxldF49QG5vcm1hbGNhcmV0Ci1AbGV0Xz1Abm9ybWFsdW5kZXJzY29yZQotQGxldHw9QG5vcm1hbHZlcnRpY2FsYmFyCi1AbGV0PD1Abm9ybWFsbGVzcwotQGxldD49QG5vcm1hbGdyZWF0ZXIKLUBsZXQrPUBub3JtYWxwbHVzfQotCi1AZGVmQG5vcm1hbHR1cm5vZmZhY3RpdmV7QGxldCI9QG5vcm1hbGRvdWJsZXF1b3RlCi1AbGV0XD1Abm9ybWFsYmFja3NsYXNoCi1AbGV0fj1Abm9ybWFsdGlsZGUKLUBsZXRePUBub3JtYWxjYXJldAotQGxldF89QG5vcm1hbHVuZGVyc2NvcmUKLUBsZXR8PUBub3JtYWx2ZXJ0aWNhbGJhcgotQGxldDw9QG5vcm1hbGxlc3MKLUBsZXQ+PUBub3JtYWxncmVhdGVyCi1AbGV0Kz1Abm9ybWFscGx1c30KLQotJSBNYWtlIF8gYW5kICsgXG90aGVyIGNoYXJhY3RlcnMsIHRlbXBvcmFyaWx5LgotJSBUaGlzIGlzIGNhbmNlbGVkIGJ5IEBmaXhiYWNrc2xhc2guCi1Ab3RoZXJpZnlhY3RpdmUKLQotJSBJZiBhIC5mbXQgZmlsZSBpcyBiZWluZyB1c2VkLCB3ZSBkb24ndCB3YW50IHRoZSBgXGlucHV0IHRleGluZm8nIHRvIHNob3cgdXAuCi0lIFRoYXQgaXMgd2hhdCBcZWF0aW5wdXQgaXMgZm9yOyBhZnRlciB0aGF0LCB0aGUgYFwnIHNob3VsZCByZXZlcnQgdG8gcHJpbnRpbmcKLSUgYSBiYWNrc2xhc2guCi0lCi1AZ2RlZkBlYXRpbnB1dCBpbnB1dCB0ZXhpbmZve0BmaXhiYWNrc2xhc2h9Ci1AZ2xvYmFsQGxldFwgPSBAZWF0aW5wdXQKLQotJSBPbiB0aGUgb3RoZXIgaGFuZCwgcGVyaGFwcyB0aGUgZmlsZSBkaWQgbm90IGhhdmUgYSBgXGlucHV0IHRleGluZm8nLiBUaGVuCi0lIHRoZSBmaXJzdCBgXHsgaW4gdGhlIGZpbGUgd291bGQgY2F1c2UgYW4gZXJyb3IuIFRoaXMgbWFjcm8gdHJpZXMgdG8gZml4Ci0lIHRoYXQsIGFzc3VtaW5nIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGBcJyBjb3VsZCBwbGF1c2libHkgb2NjdXIuCi0lIEFsc28gYmFjayB0dXJuIG9uIGFjdGl2ZSBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYXBwZWFyIGluIHRoZSBpbnB1dAotJSBmaWxlIG5hbWUsIGluIGNhc2Ugbm90IHVzaW5nIGEgcHJlLWR1bXBlZCBmb3JtYXQuCi0lCi1AZ2RlZkBmaXhiYWNrc2xhc2h7QGlmeFxAZWF0aW5wdXQgQGxldFwgPSBAbm9ybWFsYmFja3NsYXNoIEBmaQotICBAY2F0Y29kZWArPUBhY3RpdmUgQGNhdGNvZGVgQF89QGFjdGl2ZX0KLQotJSBUaGVzZSBsb29rIG9rIGluIGFsbCBmb250cywgc28ganVzdCBtYWtlIHRoZW0gbm90IHNwZWNpYWwuICBUaGUgQHJtIGJlbG93Ci0lIG1ha2VzIHN1cmUgdGhhdCB0aGUgY3VycmVudCBmb250IHN0YXJ0cyBvdXQgYXMgdGhlIG5ld2x5IGxvYWRlZCBjbXIxMAotQGNhdGNvZGVgQCQ9QG90aGVyIEBjYXRjb2RlYEAlPUBvdGhlciBAY2F0Y29kZWBAJj1Ab3RoZXIgQGNhdGNvZGVgQCM9QG90aGVyCi0KLUB0ZXh0Zm9udHMKLUBybQotCi1AYyBMb2NhbCB2YXJpYWJsZXM6Ci1AYyBwYWdlLWRlbGltaXRlcjogIl5cXFxcbWVzc2FnZSIKLUBjIEVuZDoKZGlmZiAtLWdpdCBhL3lsd3JhcCBiL3lsd3JhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjI4OGNjZC4uMDAwMDAwMAotLS0gYS95bHdyYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyB5bHdyYXAgLSB3cmFwcGVyIGZvciBsZXgveWFjYyBpbnZvY2F0aW9ucy4KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBVc2FnZToKLSMgICAgIHlsd3JhcCBQUk9HUkFNIElOUFVUIFtPVVRQVVQgREVTSVJFRF0uLi4gLS0gW0FSR1NdLi4uCi0jICogUFJPR1JBTSBpcyBwcm9ncmFtIHRvIHJ1bi4KLSMgKiBJTlBVVCBpcyB0aGUgaW5wdXQgZmlsZQotIyAqIE9VVFBVVCBpcyBmaWxlIFBST0cgZ2VuZXJhdGVzCi0jICogREVTSVJFRCBpcyBmaWxlIHdlIGFjdHVhbGx5IHdhbnQKLSMgKiBBUkdTIGFyZSBwYXNzZWQgdG8gUFJPRwotIyBBbnkgbnVtYmVyIG9mIE9VVFBVVCxERVNJUkVEIHBhaXJzIG1heSBiZSB1c2VkLgotCi0jIFRoZSBwcm9ncmFtIHRvIHJ1bi4KLXByb2c9IiQxIgotc2hpZnQKLSMgTWFrZSBhbnkgcmVsYXRpdmUgcGF0aCBpbiAkcHJvZyBhYnNvbHV0ZS4KLWNhc2UgIiRwcm9nIiBpbgotIC8qIHwgW0EtWmEtel06XFwqKSA7OwotICovKikgcHJvZz0iYHB3ZGAvJHByb2ciIDs7Ci1lc2FjCi0KLSMgVGhlIGlucHV0LgotaW5wdXQ9IiQxIgotc2hpZnQKLWNhc2UgIiRpbnB1dCIgaW4KLSAvKiB8IFtBLVphLXpdOlxcKikKLSAgICAjIEFic29sdXRlIHBhdGg7IGRvIG5vdGhpbmcuCi0gICAgOzsKLSAqKQotICAgICMgUmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUuICBXaHk/ICBCZWNhdXNlIG90aGVyd2lzZSBhbnkKLSAgICAjIGRlYnVnZ2luZyBpbmZvIGluIHRoZSBnZW5lcmF0ZWQgZmlsZSB3aWxsIHBvaW50IHRvIHRoZSB3cm9uZwotICAgICMgcGxhY2UuICBUaGlzIGlzIHJlYWxseSBncm9zcy4KLSAgICBpbnB1dD0iYHB3ZGAvJGlucHV0IgotICAgIDs7Ci1lc2FjCi0KLSMgV2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGFic29sdXRlIHBhdGggaWYgdGhlIGlucHV0IGluIHRoZSBjdXJyZW50Ci0jIGRpcmVjdG9yeSBsaWtlIHdoZW4gbWFraW5nIGEgdGFyIGJhbGwuCi1pbnB1dF9iYXNlPWBlY2hvICRpbnB1dCB8IHNlZCAtZSAnc3wuKi98fCdgCi1pZiB0ZXN0IC1mICRpbnB1dF9iYXNlICYmIGNtcCAkaW5wdXRfYmFzZSAkaW5wdXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGlucHV0PSRpbnB1dF9iYXNlCi1maQotCi1wYWlybGlzdD0KLXdoaWxlIHRlc3QgIiQjIiAtbmUgMDsgZG8KLSAgIGlmIHRlc3QgIiQxIiA9ICItLSI7IHRoZW4KLSAgICAgIHNoaWZ0Ci0gICAgICBicmVhawotICAgZmkKLSAgIHBhaXJsaXN0PSIkcGFpcmxpc3QgJDEiCi0gICBzaGlmdAotZG9uZQotCi0jIEZJWE1FOiBhZGQgaG9zdG5hbWUgaGVyZSBmb3IgcGFyYWxsZWwgbWFrZXMgdGhhdCBydW4gY29tbWFuZHMgb24KLSMgb3RoZXIgbWFjaGluZXMuICBCdXQgdGhhdCBtaWdodCB0YWtlIHVzIG92ZXIgdGhlIDE0LWNoYXIgbGltaXQuCi1kaXJuYW1lPXlsd3JhcCQkCi10cmFwICJjZCBgcHdkYDsgcm0gLXJmICRkaXJuYW1lID4gL2Rldi9udWxsIDI+JjEiIDEgMiAzIDE1Ci1ta2RpciAkZGlybmFtZSB8fCBleGl0IDEKLQotY2QgJGRpcm5hbWUKLWNhc2UgIiRpbnB1dCIgaW4KLSAvKiB8IFtBLVphLXpdOlxcKikKLSAgICAjIEFic29sdXRlIHBhdGg7IGRvIG5vdGhpbmcuCi0gICAgOzsKLSAqKQotICAgICMgTWFrZSBhIHN5bWJvbGljIGxpbmssIGhhcmQgbGluayBvciBoYXJkY29weS4KLSAgICBsbiAtcyAuLi8iJGlucHV0IiAuID4gL2Rldi9udWxsIDI+JjEgfHwgbG4gLi4vIiRpbnB1dCIgLiA+IC9kZXYvbnVsbCAyPiYxIHx8IGNwIC4uLyIkaW5wdXQiIC4KLSAgICA7OwotZXNhYwotJHByb2cgJHsxKyIkQCJ9ICIkaW5wdXQiCi1zdGF0dXM9JD8KLQotaWYgdGVzdCAkc3RhdHVzIC1lcSAwOyB0aGVuCi0gICBzZXQgWCAkcGFpcmxpc3QKLSAgIHNoaWZ0Ci0gICBmaXJzdD15ZXMKLSAgIHdoaWxlIHRlc3QgIiQjIiAtbmUgMDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiQxIjsgdGhlbgotICAgICAgICAgIyBJZiAkMiBpcyBhbiBhYnNvbHV0ZSBwYXRoIG5hbWUsIHRoZW4ganVzdCB1c2UgdGhhdCwKLSAgICAgICAgICMgb3RoZXJ3aXNlIHByZXBlbmQgYC4uLycuCi0gICAgICAgICBjYXNlICIkMiIgaW4KLQkgICAvKiB8IFtBLVphLXpdOlxcKikgdGFyZ2V0PSIkMiI7OwotCSAgICopIHRhcmdldD0iLi4vJDIiOzsKLQkgZXNhYwotCSBtdiAiJDEiICIkdGFyZ2V0IiB8fCBzdGF0dXM9JD8KLSAgICAgIGVsc2UKLQkgIyBBIG1pc3NpbmcgZmlsZSBpcyBvbmx5IGFuIGVycm9yIGZvciB0aGUgZmlyc3QgZmlsZS4gIFRoaXMKLQkgIyBpcyBhIGJsYXRhbnQgaGFjayB0byBsZXQgdXMgc3VwcG9ydCB1c2luZyAieWFjYyAtZCIuICBJZiAtZAotCSAjIGlzIG5vdCBzcGVjaWZpZWQsIHdlIGRvbid0IHdhbnQgYW4gZXJyb3Igd2hlbiB0aGUgaGVhZGVyCi0JICMgZmlsZSBpcyAibWlzc2luZyIuCi0JIGlmIHRlc3QgJGZpcnN0ID0geWVzOyB0aGVuCi0JICAgIHN0YXR1cz0xCi0JIGZpCi0gICAgICBmaQotICAgICAgc2hpZnQKLSAgICAgIHNoaWZ0Ci0gICAgICBmaXJzdD1ubwotICAgZG9uZQotZWxzZQotICAgc3RhdHVzPSQ/Ci1maQotCi0jIFJlbW92ZSB0aGUgZGlyZWN0b3J5LgotY2QgLi4KLXJtIC1yZiAkZGlybmFtZQotCi1leGl0ICRzdGF0dXMK